summaryrefslogtreecommitdiffstats
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/.gitignore6
-rw-r--r--src/backend/utils/Gen_dummy_probes.pl259
-rw-r--r--src/backend/utils/Gen_dummy_probes.pl.prolog19
-rw-r--r--src/backend/utils/Gen_dummy_probes.sed24
-rw-r--r--src/backend/utils/Gen_fmgrtab.pl296
-rw-r--r--src/backend/utils/Makefile119
-rw-r--r--src/backend/utils/README.Gen_dummy_probes27
-rw-r--r--src/backend/utils/activity/Makefile34
-rw-r--r--src/backend/utils/activity/backend_progress.c112
-rw-r--r--src/backend/utils/activity/backend_status.c1151
-rw-r--r--src/backend/utils/activity/pgstat.c1678
-rw-r--r--src/backend/utils/activity/pgstat_archiver.c111
-rw-r--r--src/backend/utils/activity/pgstat_bgwriter.c110
-rw-r--r--src/backend/utils/activity/pgstat_checkpointer.c121
-rw-r--r--src/backend/utils/activity/pgstat_database.c437
-rw-r--r--src/backend/utils/activity/pgstat_function.c243
-rw-r--r--src/backend/utils/activity/pgstat_relation.c938
-rw-r--r--src/backend/utils/activity/pgstat_replslot.c224
-rw-r--r--src/backend/utils/activity/pgstat_shmem.c1003
-rw-r--r--src/backend/utils/activity/pgstat_slru.c248
-rw-r--r--src/backend/utils/activity/pgstat_subscription.c110
-rw-r--r--src/backend/utils/activity/pgstat_wal.c182
-rw-r--r--src/backend/utils/activity/pgstat_xact.c391
-rw-r--r--src/backend/utils/activity/wait_event.c749
-rw-r--r--src/backend/utils/adt/.gitignore2
-rw-r--r--src/backend/utils/adt/Makefile140
-rw-r--r--src/backend/utils/adt/acl.c5340
-rw-r--r--src/backend/utils/adt/amutils.c470
-rw-r--r--src/backend/utils/adt/array_expanded.c453
-rw-r--r--src/backend/utils/adt/array_selfuncs.c1193
-rw-r--r--src/backend/utils/adt/array_typanalyze.c791
-rw-r--r--src/backend/utils/adt/array_userfuncs.c912
-rw-r--r--src/backend/utils/adt/arrayfuncs.c6770
-rw-r--r--src/backend/utils/adt/arraysubs.c577
-rw-r--r--src/backend/utils/adt/arrayutils.c259
-rw-r--r--src/backend/utils/adt/ascii.c198
-rw-r--r--src/backend/utils/adt/bool.c404
-rw-r--r--src/backend/utils/adt/cash.c1175
-rw-r--r--src/backend/utils/adt/char.c253
-rw-r--r--src/backend/utils/adt/cryptohashfuncs.c168
-rw-r--r--src/backend/utils/adt/date.c3135
-rw-r--r--src/backend/utils/adt/datetime.c5102
-rw-r--r--src/backend/utils/adt/datum.c554
-rw-r--r--src/backend/utils/adt/dbsize.c996
-rw-r--r--src/backend/utils/adt/domains.c390
-rw-r--r--src/backend/utils/adt/encode.c602
-rw-r--r--src/backend/utils/adt/enum.c610
-rw-r--r--src/backend/utils/adt/expandeddatum.c145
-rw-r--r--src/backend/utils/adt/expandedrecord.c1633
-rw-r--r--src/backend/utils/adt/float.c4074
-rw-r--r--src/backend/utils/adt/format_type.c480
-rw-r--r--src/backend/utils/adt/formatting.c6729
-rw-r--r--src/backend/utils/adt/genfile.c709
-rw-r--r--src/backend/utils/adt/geo_ops.c5519
-rw-r--r--src/backend/utils/adt/geo_selfuncs.c96
-rw-r--r--src/backend/utils/adt/geo_spgist.c885
-rw-r--r--src/backend/utils/adt/hbafuncs.c564
-rw-r--r--src/backend/utils/adt/inet_cidr_ntop.c294
-rw-r--r--src/backend/utils/adt/inet_net_pton.c564
-rw-r--r--src/backend/utils/adt/int.c1648
-rw-r--r--src/backend/utils/adt/int8.c1524
-rw-r--r--src/backend/utils/adt/json.c1375
-rw-r--r--src/backend/utils/adt/jsonb.c2086
-rw-r--r--src/backend/utils/adt/jsonb_gin.c1411
-rw-r--r--src/backend/utils/adt/jsonb_op.c338
-rw-r--r--src/backend/utils/adt/jsonb_util.c1968
-rw-r--r--src/backend/utils/adt/jsonbsubs.c416
-rw-r--r--src/backend/utils/adt/jsonfuncs.c5546
-rw-r--r--src/backend/utils/adt/jsonpath.c1080
-rw-r--r--src/backend/utils/adt/jsonpath_exec.c2812
-rw-r--r--src/backend/utils/adt/jsonpath_gram.c2416
-rw-r--r--src/backend/utils/adt/jsonpath_gram.y606
-rw-r--r--src/backend/utils/adt/jsonpath_scan.c4873
-rw-r--r--src/backend/utils/adt/jsonpath_scan.l619
-rw-r--r--src/backend/utils/adt/levenshtein.c401
-rw-r--r--src/backend/utils/adt/like.c455
-rw-r--r--src/backend/utils/adt/like_match.c360
-rw-r--r--src/backend/utils/adt/like_support.c1800
-rw-r--r--src/backend/utils/adt/lockfuncs.c1069
-rw-r--r--src/backend/utils/adt/mac.c531
-rw-r--r--src/backend/utils/adt/mac8.c577
-rw-r--r--src/backend/utils/adt/mcxtfuncs.c195
-rw-r--r--src/backend/utils/adt/misc.c950
-rw-r--r--src/backend/utils/adt/multirangetypes.c2920
-rw-r--r--src/backend/utils/adt/multirangetypes_selfuncs.c1336
-rw-r--r--src/backend/utils/adt/name.c359
-rw-r--r--src/backend/utils/adt/network.c2114
-rw-r--r--src/backend/utils/adt/network_gist.c809
-rw-r--r--src/backend/utils/adt/network_selfuncs.c972
-rw-r--r--src/backend/utils/adt/network_spgist.c711
-rw-r--r--src/backend/utils/adt/numeric.c11484
-rw-r--r--src/backend/utils/adt/numutils.c604
-rw-r--r--src/backend/utils/adt/oid.c468
-rw-r--r--src/backend/utils/adt/oracle_compat.c1156
-rw-r--r--src/backend/utils/adt/orderedsetaggs.c1431
-rw-r--r--src/backend/utils/adt/partitionfuncs.c249
-rw-r--r--src/backend/utils/adt/pg_locale.c2187
-rw-r--r--src/backend/utils/adt/pg_lsn.c313
-rw-r--r--src/backend/utils/adt/pg_upgrade_support.c265
-rw-r--r--src/backend/utils/adt/pgstatfuncs.c2422
-rw-r--r--src/backend/utils/adt/pseudotypes.c391
-rw-r--r--src/backend/utils/adt/quote.c131
-rw-r--r--src/backend/utils/adt/rangetypes.c2622
-rw-r--r--src/backend/utils/adt/rangetypes_gist.c1798
-rw-r--r--src/backend/utils/adt/rangetypes_selfuncs.c1223
-rw-r--r--src/backend/utils/adt/rangetypes_spgist.c1000
-rw-r--r--src/backend/utils/adt/rangetypes_typanalyze.c427
-rw-r--r--src/backend/utils/adt/regexp.c1996
-rw-r--r--src/backend/utils/adt/regproc.c2062
-rw-r--r--src/backend/utils/adt/ri_triggers.c3020
-rw-r--r--src/backend/utils/adt/rowtypes.c2017
-rw-r--r--src/backend/utils/adt/ruleutils.c12406
-rw-r--r--src/backend/utils/adt/selfuncs.c7961
-rw-r--r--src/backend/utils/adt/tid.c429
-rw-r--r--src/backend/utils/adt/timestamp.c5921
-rw-r--r--src/backend/utils/adt/trigfuncs.c85
-rw-r--r--src/backend/utils/adt/tsginidx.c356
-rw-r--r--src/backend/utils/adt/tsgistidx.c816
-rw-r--r--src/backend/utils/adt/tsquery.c1349
-rw-r--r--src/backend/utils/adt/tsquery_cleanup.c444
-rw-r--r--src/backend/utils/adt/tsquery_gist.c277
-rw-r--r--src/backend/utils/adt/tsquery_op.c358
-rw-r--r--src/backend/utils/adt/tsquery_rewrite.c462
-rw-r--r--src/backend/utils/adt/tsquery_util.c447
-rw-r--r--src/backend/utils/adt/tsrank.c1012
-rw-r--r--src/backend/utils/adt/tsvector.c551
-rw-r--r--src/backend/utils/adt/tsvector_op.c2726
-rw-r--r--src/backend/utils/adt/tsvector_parser.c367
-rw-r--r--src/backend/utils/adt/uuid.c423
-rw-r--r--src/backend/utils/adt/varbit.c1894
-rw-r--r--src/backend/utils/adt/varchar.c1236
-rw-r--r--src/backend/utils/adt/varlena.c6556
-rw-r--r--src/backend/utils/adt/version.c24
-rw-r--r--src/backend/utils/adt/windowfuncs.c537
-rw-r--r--src/backend/utils/adt/xid.c373
-rw-r--r--src/backend/utils/adt/xid8funcs.c708
-rw-r--r--src/backend/utils/adt/xml.c4769
-rw-r--r--src/backend/utils/cache/Makefile31
-rw-r--r--src/backend/utils/cache/attoptcache.c177
-rw-r--r--src/backend/utils/cache/catcache.c2087
-rw-r--r--src/backend/utils/cache/evtcache.c270
-rw-r--r--src/backend/utils/cache/inval.c1637
-rw-r--r--src/backend/utils/cache/lsyscache.c3580
-rw-r--r--src/backend/utils/cache/partcache.c430
-rw-r--r--src/backend/utils/cache/plancache.c2196
-rw-r--r--src/backend/utils/cache/relcache.c6800
-rw-r--r--src/backend/utils/cache/relfilenodemap.c244
-rw-r--r--src/backend/utils/cache/relmapper.c1108
-rw-r--r--src/backend/utils/cache/spccache.c236
-rw-r--r--src/backend/utils/cache/syscache.c1611
-rw-r--r--src/backend/utils/cache/ts_cache.c652
-rw-r--r--src/backend/utils/cache/typcache.c2884
-rw-r--r--src/backend/utils/errcodes.h354
-rw-r--r--src/backend/utils/errcodes.txt497
-rw-r--r--src/backend/utils/error/Makefile21
-rw-r--r--src/backend/utils/error/assert.c70
-rw-r--r--src/backend/utils/error/csvlog.c264
-rw-r--r--src/backend/utils/error/elog.c3458
-rw-r--r--src/backend/utils/error/jsonlog.c303
-rw-r--r--src/backend/utils/fmgr-stamp0
-rw-r--r--src/backend/utils/fmgr/Makefile20
-rw-r--r--src/backend/utils/fmgr/README335
-rw-r--r--src/backend/utils/fmgr/dfmgr.c700
-rw-r--r--src/backend/utils/fmgr/fmgr.c2076
-rw-r--r--src/backend/utils/fmgr/funcapi.c2115
-rw-r--r--src/backend/utils/fmgroids.h3261
-rw-r--r--src/backend/utils/fmgrprotos.h2829
-rw-r--r--src/backend/utils/fmgrtab.c9254
-rw-r--r--src/backend/utils/generate-errcodes.pl46
-rw-r--r--src/backend/utils/hash/Makefile19
-rw-r--r--src/backend/utils/hash/dynahash.c1930
-rw-r--r--src/backend/utils/hash/pg_crc.c97
-rw-r--r--src/backend/utils/init/Makefile20
-rw-r--r--src/backend/utils/init/globals.c153
-rw-r--r--src/backend/utils/init/miscinit.c1740
-rw-r--r--src/backend/utils/init/postinit.c1371
-rw-r--r--src/backend/utils/mb/Makefile25
-rw-r--r--src/backend/utils/mb/README23
-rw-r--r--src/backend/utils/mb/Unicode/Makefile102
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_BIG5.pl79
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl85
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl72
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl678
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl62
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl71
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_GB18030.pl52
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_JOHAB.pl56
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl88
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_SJIS.pl106
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_UHC.pl66
-rwxr-xr-xsrc/backend/utils/mb/Unicode/UCS_to_most.pl63
-rw-r--r--src/backend/utils/mb/Unicode/big5_to_utf8.map4606
-rw-r--r--src/backend/utils/mb/Unicode/convutils.pm838
-rw-r--r--src/backend/utils/mb/Unicode/euc-jis-2004-std.txt11549
-rw-r--r--src/backend/utils/mb/Unicode/euc_cn_to_utf8.map2280
-rw-r--r--src/backend/utils/mb/Unicode/euc_jis_2004_to_utf8.map3443
-rw-r--r--src/backend/utils/mb/Unicode/euc_jp_to_utf8.map4142
-rw-r--r--src/backend/utils/mb/Unicode/euc_kr_to_utf8.map2498
-rw-r--r--src/backend/utils/mb/Unicode/euc_tw_to_utf8.map7834
-rw-r--r--src/backend/utils/mb/Unicode/gb-18030-2000.xml30916
-rw-r--r--src/backend/utils/mb/Unicode/gb18030_to_utf8.map11151
-rw-r--r--src/backend/utils/mb/Unicode/gbk_to_utf8.map6554
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_10_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_13_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_14_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_15_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_16_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_2_to_utf8.map79
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_3_to_utf8.map79
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_4_to_utf8.map79
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_5_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_6_to_utf8.map77
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_7_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_8_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/iso8859_9_to_utf8.map79
-rw-r--r--src/backend/utils/mb/Unicode/johab_to_utf8.map6280
-rw-r--r--src/backend/utils/mb/Unicode/koi8r_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/koi8u_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/shift_jis_2004_to_utf8.map3234
-rw-r--r--src/backend/utils/mb/Unicode/sjis-0213-2004-std.txt11549
-rw-r--r--src/backend/utils/mb/Unicode/sjis_to_utf8.map2417
-rw-r--r--src/backend/utils/mb/Unicode/uhc_to_utf8.map6553
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_big5.map4100
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_euc_cn.map4044
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_euc_jis_2004.map12567
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_euc_jp.map7141
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_euc_kr.map6392
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_euc_tw.map6865
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_gb18030.map9561
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_gbk.map4271
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_10.map114
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_13.map113
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_14.map146
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_15.map101
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_16.map131
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_2.map114
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_3.map113
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_4.map114
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_5.map103
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_6.map90
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_7.map125
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_8.map104
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_iso8859_9.map100
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_johab.map6333
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_koi8r.map175
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_koi8u.map186
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_shift_jis_2004.map7685
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_sjis.map4253
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_uhc.map6377
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1250.map145
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1251.map134
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1252.map146
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1253.map135
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1254.map157
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1255.map157
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1256.map194
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1257.map145
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win1258.map167
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win866.map154
-rw-r--r--src/backend/utils/mb/Unicode/utf8_to_win874.map130
-rw-r--r--src/backend/utils/mb/Unicode/win1250_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1251_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1252_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1253_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1254_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1255_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1256_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1257_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win1258_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win866_to_utf8.map111
-rw-r--r--src/backend/utils/mb/Unicode/win874_to_utf8.map109
-rw-r--r--src/backend/utils/mb/conv.c838
-rw-r--r--src/backend/utils/mb/conversion_procs/Makefile25
-rw-r--r--src/backend/utils/mb/conversion_procs/README.euc_jp83
-rw-r--r--src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c624
-rw-r--r--src/backend/utils/mb/conversion_procs/euc2004_sjis2004/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c401
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c166
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c772
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/sjis.map396
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c174
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_tw_and_big5/Makefile16
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_tw_and_big5/big5.c377
-rw-r--r--src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c582
-rw-r--r--src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c180
-rw-r--r--src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c136
-rw-r--r--src/backend/utils/mb/conversion_procs/proc.mk17
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_big5/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c126
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc2004/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_gb18030/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c233
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_gbk/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_iso8859/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c169
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c139
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_johab/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_sjis/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_uhc/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c78
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_win/Makefile13
-rw-r--r--src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c150
-rw-r--r--src/backend/utils/mb/iso.c74
-rw-r--r--src/backend/utils/mb/mbutils.c1778
-rw-r--r--src/backend/utils/mb/stringinfo_mb.c86
-rw-r--r--src/backend/utils/mb/win1251.c74
-rw-r--r--src/backend/utils/mb/win866.c74
-rw-r--r--src/backend/utils/mb/wstrcmp.c47
-rw-r--r--src/backend/utils/mb/wstrncmp.c77
-rw-r--r--src/backend/utils/misc/.gitignore1
-rw-r--r--src/backend/utils/misc/Makefile46
-rw-r--r--src/backend/utils/misc/README295
-rw-r--r--src/backend/utils/misc/guc-file.c3231
-rw-r--r--src/backend/utils/misc/guc-file.l1227
-rw-r--r--src/backend/utils/misc/guc.c13003
-rw-r--r--src/backend/utils/misc/help_config.c137
-rw-r--r--src/backend/utils/misc/pg_config.c51
-rw-r--r--src/backend/utils/misc/pg_controldata.c353
-rw-r--r--src/backend/utils/misc/pg_rusage.c73
-rw-r--r--src/backend/utils/misc/postgresql.conf.sample813
-rw-r--r--src/backend/utils/misc/ps_status.c449
-rw-r--r--src/backend/utils/misc/queryenvironment.c144
-rw-r--r--src/backend/utils/misc/queryjumble.c869
-rw-r--r--src/backend/utils/misc/rls.c167
-rw-r--r--src/backend/utils/misc/sampling.c304
-rw-r--r--src/backend/utils/misc/superuser.c107
-rw-r--r--src/backend/utils/misc/timeout.c834
-rw-r--r--src/backend/utils/misc/tzparser.c484
-rw-r--r--src/backend/utils/mmgr/Makefile25
-rw-r--r--src/backend/utils/mmgr/README487
-rw-r--r--src/backend/utils/mmgr/aset.c1533
-rw-r--r--src/backend/utils/mmgr/dsa.c2308
-rw-r--r--src/backend/utils/mmgr/freepage.c1886
-rw-r--r--src/backend/utils/mmgr/generation.c1064
-rw-r--r--src/backend/utils/mmgr/mcxt.c1341
-rw-r--r--src/backend/utils/mmgr/memdebug.c93
-rw-r--r--src/backend/utils/mmgr/portalmem.c1293
-rw-r--r--src/backend/utils/mmgr/slab.c796
-rw-r--r--src/backend/utils/probes.d94
-rw-r--r--src/backend/utils/resowner/Makefile18
-rw-r--r--src/backend/utils/resowner/README81
-rw-r--r--src/backend/utils/resowner/resowner.c1490
-rw-r--r--src/backend/utils/sort/Makefile25
-rw-r--r--src/backend/utils/sort/logtape.c1193
-rw-r--r--src/backend/utils/sort/qsort_interruptible.c16
-rw-r--r--src/backend/utils/sort/sharedtuplestore.c631
-rw-r--r--src/backend/utils/sort/sortsupport.c211
-rw-r--r--src/backend/utils/sort/tuplesort.c4938
-rw-r--r--src/backend/utils/sort/tuplestore.c1552
-rw-r--r--src/backend/utils/time/Makefile19
-rw-r--r--src/backend/utils/time/combocid.c364
-rw-r--r--src/backend/utils/time/snapmgr.c2394
375 files changed, 508371 insertions, 0 deletions
diff --git a/src/backend/utils/.gitignore b/src/backend/utils/.gitignore
new file mode 100644
index 0000000..0685556
--- /dev/null
+++ b/src/backend/utils/.gitignore
@@ -0,0 +1,6 @@
+/fmgrtab.c
+/fmgroids.h
+/fmgrprotos.h
+/fmgr-stamp
+/probes.h
+/errcodes.h
diff --git a/src/backend/utils/Gen_dummy_probes.pl b/src/backend/utils/Gen_dummy_probes.pl
new file mode 100644
index 0000000..5e5793e
--- /dev/null
+++ b/src/backend/utils/Gen_dummy_probes.pl
@@ -0,0 +1,259 @@
+#! /usr/bin/perl -w
+#-------------------------------------------------------------------------
+#
+# Gen_dummy_probes.pl
+# Perl script that generates probes.h file when dtrace is not available
+#
+# Portions Copyright (c) 2008-2022, PostgreSQL Global Development Group
+#
+#
+# IDENTIFICATION
+# src/backend/utils/Gen_dummy_probes.pl
+#
+# This program was generated by running perl's s2p over Gen_dummy_probes.sed
+#
+#-------------------------------------------------------------------------
+
+# turn off perlcritic for autogenerated code
+## no critic
+
+$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;
+
+use strict;
+use Symbol;
+use vars qw{ $isEOF $Hold %wFiles @Q $CondReg
+ $doAutoPrint $doOpenWrite $doPrint };
+$doAutoPrint = 1;
+$doOpenWrite = 1;
+
+# prototypes
+sub openARGV();
+sub getsARGV(;\$);
+sub eofARGV();
+sub printQ();
+
+# Run: the sed loop reading input and applying the script
+#
+sub Run()
+{
+ my ($h, $icnt, $s, $n);
+
+ # hack (not unbreakable :-/) to avoid // matching an empty string
+ my $z = "\000";
+ $z =~ /$z/;
+
+ # Initialize.
+ openARGV();
+ $Hold = '';
+ $CondReg = 0;
+ $doPrint = $doAutoPrint;
+ CYCLE:
+ while (getsARGV())
+ {
+ chomp();
+ $CondReg = 0; # cleared on t
+ BOS:;
+
+ # /^[ ]*probe /!d
+ unless (m /^[ \t]*probe /s)
+ {
+ $doPrint = 0;
+ goto EOS;
+ }
+
+ # s/^[ ]*probe \([^(]*\)\(.*\);/\1\2/
+ {
+ $s = s /^[ \t]*probe ([^(]*)(.*);/${1}${2}/s;
+ $CondReg ||= $s;
+ }
+
+ # s/__/_/g
+ {
+ $s = s /__/_/sg;
+ $CondReg ||= $s;
+ }
+
+ # y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
+ { y{abcdefghijklmnopqrstuvwxyz}{ABCDEFGHIJKLMNOPQRSTUVWXYZ}; }
+
+ # s/^/#define TRACE_POSTGRESQL_/
+ {
+ $s = s /^/#define TRACE_POSTGRESQL_/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\})/(INT1)/
+ {
+ $s = s /\([^,)]+\)/(INT1)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2)/
+ {
+ $s = s /\([^,)]+, [^,)]+\)/(INT1, INT2)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3)/
+ {
+ $s = s /\([^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/
+ {
+ $s =
+ s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/
+ {
+ $s =
+ s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6)/
+ {
+ $s =
+ s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/
+ {
+ $s =
+ s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/
+ {
+ $s =
+ s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/s;
+ $CondReg ||= $s;
+ }
+
+ # s/$/ do {} while (0)/
+ {
+ $s = s /$/ do {} while (0)/s;
+ $CondReg ||= $s;
+ }
+
+ # P
+ {
+ if (/^(.*)/) { print $1, "\n"; }
+ }
+
+ # s/(.*$/_ENABLED() (0)/
+ {
+ $s = s /\(.*$/_ENABLED() (0)/s;
+ $CondReg ||= $s;
+ }
+ EOS: if ($doPrint)
+ {
+ print $_, "\n";
+ }
+ else
+ {
+ $doPrint = $doAutoPrint;
+ }
+ printQ() if @Q;
+ }
+
+ exit(0);
+}
+Run();
+
+# openARGV: open 1st input file
+#
+sub openARGV()
+{
+ unshift(@ARGV, '-') unless @ARGV;
+ my $file = shift(@ARGV);
+ open(ARG, "<$file")
+ || die("$0: can't open $file for reading ($!)\n");
+ $isEOF = 0;
+}
+
+# getsARGV: Read another input line into argument (default: $_).
+# Move on to next input file, and reset EOF flag $isEOF.
+sub getsARGV(;\$)
+{
+ my $argref = @_ ? shift() : \$_;
+ while ($isEOF || !defined($$argref = <ARG>))
+ {
+ close(ARG);
+ return 0 unless @ARGV;
+ my $file = shift(@ARGV);
+ open(ARG, "<$file")
+ || die("$0: can't open $file for reading ($!)\n");
+ $isEOF = 0;
+ }
+ 1;
+}
+
+# eofARGV: end-of-file test
+#
+sub eofARGV()
+{
+ return @ARGV == 0 && ($isEOF = eof(ARG));
+}
+
+# makeHandle: Generates another file handle for some file (given by its path)
+# to be written due to a w command or an s command's w flag.
+sub makeHandle($)
+{
+ my ($path) = @_;
+ my $handle;
+ if (!exists($wFiles{$path}) || $wFiles{$path} eq '')
+ {
+ $handle = $wFiles{$path} = gensym();
+ if ($doOpenWrite)
+ {
+ if (!open($handle, ">$path"))
+ {
+ die("$0: can't open $path for writing: ($!)\n");
+ }
+ }
+ }
+ else
+ {
+ $handle = $wFiles{$path};
+ }
+ return $handle;
+}
+
+# printQ: Print queued output which is either a string or a reference
+# to a pathname.
+sub printQ()
+{
+ for my $q (@Q)
+ {
+ if (ref($q))
+ {
+
+ # flush open w files so that reading this file gets it all
+ if (exists($wFiles{$$q}) && $wFiles{$$q} ne '')
+ {
+ open($wFiles{$$q}, ">>$$q");
+ }
+
+ # copy file to stdout: slow, but safe
+ if (open(RF, "<$$q"))
+ {
+ while (defined(my $line = <RF>))
+ {
+ print $line;
+ }
+ close(RF);
+ }
+ }
+ else
+ {
+ print $q;
+ }
+ }
+ undef(@Q);
+}
diff --git a/src/backend/utils/Gen_dummy_probes.pl.prolog b/src/backend/utils/Gen_dummy_probes.pl.prolog
new file mode 100644
index 0000000..5b73409
--- /dev/null
+++ b/src/backend/utils/Gen_dummy_probes.pl.prolog
@@ -0,0 +1,19 @@
+#! /usr/bin/perl -w
+#-------------------------------------------------------------------------
+#
+# Gen_dummy_probes.pl
+# Perl script that generates probes.h file when dtrace is not available
+#
+# Portions Copyright (c) 2008-2022, PostgreSQL Global Development Group
+#
+#
+# IDENTIFICATION
+# src/backend/utils/Gen_dummy_probes.pl
+#
+# This program was generated by running perl's s2p over Gen_dummy_probes.sed
+#
+#-------------------------------------------------------------------------
+
+# turn off perlcritic for autogenerated code
+## no critic
+
diff --git a/src/backend/utils/Gen_dummy_probes.sed b/src/backend/utils/Gen_dummy_probes.sed
new file mode 100644
index 0000000..85fa0d3
--- /dev/null
+++ b/src/backend/utils/Gen_dummy_probes.sed
@@ -0,0 +1,24 @@
+#-------------------------------------------------------------------------
+# sed script to create dummy probes.h file when dtrace is not available
+#
+# Copyright (c) 2008-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/Gen_dummy_probes.sed
+#-------------------------------------------------------------------------
+
+/^[ ]*probe /!d
+s/^[ ]*probe \([^(]*\)\(.*\);/\1\2/
+s/__/_/g
+y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
+s/^/#define TRACE_POSTGRESQL_/
+s/([^,)]\{1,\})/(INT1)/
+s/([^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/
+s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/
+s/$/ do {} while (0)/
+P
+s/(.*$/_ENABLED() (0)/
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
new file mode 100644
index 0000000..b330c21
--- /dev/null
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -0,0 +1,296 @@
+#! /usr/bin/perl
+#-------------------------------------------------------------------------
+#
+# Gen_fmgrtab.pl
+# Perl script that generates fmgroids.h, fmgrprotos.h, and fmgrtab.c
+# from pg_proc.dat
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+#
+# IDENTIFICATION
+# src/backend/utils/Gen_fmgrtab.pl
+#
+#-------------------------------------------------------------------------
+
+use Catalog;
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $output_path = '';
+my $include_path;
+
+GetOptions(
+ 'output:s' => \$output_path,
+ 'include-path:s' => \$include_path) || usage();
+
+# Make sure output_path ends in a slash.
+if ($output_path ne '' && substr($output_path, -1) ne '/')
+{
+ $output_path .= '/';
+}
+
+# Sanity check arguments.
+die "No input files.\n" unless @ARGV;
+die "--include-path must be specified.\n" unless $include_path;
+
+# Read all the input files into internal data structures.
+# Note: We pass data file names as arguments and then look for matching
+# headers to parse the schema from. This is backwards from genbki.pl,
+# but the Makefile dependencies look more sensible this way.
+# We currently only need pg_proc, but retain the possibility of reading
+# more than one data file.
+my %catalogs;
+my %catalog_data;
+foreach my $datfile (@ARGV)
+{
+ $datfile =~ /(.+)\.dat$/
+ or die "Input files need to be data (.dat) files.\n";
+
+ my $header = "$1.h";
+ die "There in no header file corresponding to $datfile"
+ if !-e $header;
+
+ my $catalog = Catalog::ParseHeader($header);
+ my $catname = $catalog->{catname};
+ my $schema = $catalog->{columns};
+
+ $catalogs{$catname} = $catalog;
+ $catalog_data{$catname} = Catalog::ParseData($datfile, $schema, 0);
+}
+
+# Collect certain fields from pg_proc.dat.
+my @fmgr = ();
+my %proname_counts;
+
+foreach my $row (@{ $catalog_data{pg_proc} })
+{
+ my %bki_values = %$row;
+
+ push @fmgr,
+ {
+ oid => $bki_values{oid},
+ name => $bki_values{proname},
+ lang => $bki_values{prolang},
+ kind => $bki_values{prokind},
+ strict => $bki_values{proisstrict},
+ retset => $bki_values{proretset},
+ nargs => $bki_values{pronargs},
+ args => $bki_values{proargtypes},
+ prosrc => $bki_values{prosrc},
+ };
+
+ # Count so that we can detect overloaded pronames.
+ $proname_counts{ $bki_values{proname} }++;
+}
+
+# Emit headers for both files
+my $tmpext = ".tmp$$";
+my $oidsfile = $output_path . 'fmgroids.h';
+my $protosfile = $output_path . 'fmgrprotos.h';
+my $tabfile = $output_path . 'fmgrtab.c';
+
+open my $ofh, '>', $oidsfile . $tmpext
+ or die "Could not open $oidsfile$tmpext: $!";
+open my $pfh, '>', $protosfile . $tmpext
+ or die "Could not open $protosfile$tmpext: $!";
+open my $tfh, '>', $tabfile . $tmpext
+ or die "Could not open $tabfile$tmpext: $!";
+
+print $ofh <<OFH;
+/*-------------------------------------------------------------------------
+ *
+ * fmgroids.h
+ * Macros that define the OIDs of built-in functions.
+ *
+ * These macros can be used to avoid a catalog lookup when a specific
+ * fmgr-callable function needs to be referenced.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FMGROIDS_H
+#define FMGROIDS_H
+
+/*
+ * Constant macros for the OIDs of entries in pg_proc.
+ *
+ * F_XXX macros are named after the proname field; if that is not unique,
+ * we append the proargtypes field, replacing spaces with underscores.
+ * For example, we have F_OIDEQ because that proname is unique, but
+ * F_POW_FLOAT8_FLOAT8 (among others) because that proname is not.
+ */
+OFH
+
+print $pfh <<PFH;
+/*-------------------------------------------------------------------------
+ *
+ * fmgrprotos.h
+ * Prototypes for built-in functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef FMGRPROTOS_H
+#define FMGRPROTOS_H
+
+#include "fmgr.h"
+
+PFH
+
+print $tfh <<TFH;
+/*-------------------------------------------------------------------------
+ *
+ * fmgrtab.c
+ * The function manager's table of internal functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/transam.h"
+#include "utils/fmgrtab.h"
+#include "utils/fmgrprotos.h"
+
+TFH
+
+# Emit fmgroids.h and fmgrprotos.h entries in OID order.
+my %seenit;
+foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
+{
+ my $sqlname = $s->{name};
+ $sqlname .= "_" . $s->{args} if ($proname_counts{ $s->{name} } > 1);
+ $sqlname =~ s/\s+/_/g;
+ print $ofh "#define F_" . uc $sqlname . " $s->{oid}\n";
+ # We want only one extern per internal-language, non-aggregate function
+ if ( $s->{lang} eq 'internal'
+ && $s->{kind} ne 'a'
+ && !$seenit{ $s->{prosrc} })
+ {
+ $seenit{ $s->{prosrc} } = 1;
+ print $pfh "extern Datum $s->{prosrc}(PG_FUNCTION_ARGS);\n";
+ }
+}
+
+# Create the fmgr_builtins table, collect data for fmgr_builtin_oid_index
+print $tfh "\nconst FmgrBuiltin fmgr_builtins[] = {\n";
+my %bmap;
+$bmap{'t'} = 'true';
+$bmap{'f'} = 'false';
+my @fmgr_builtin_oid_index;
+my $last_builtin_oid = 0;
+my $fmgr_count = 0;
+foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
+{
+ next if $s->{lang} ne 'internal';
+ # We do not need entries for aggregate functions
+ next if $s->{kind} eq 'a';
+
+ print $tfh ",\n" if ($fmgr_count > 0);
+ print $tfh
+ " { $s->{oid}, $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, \"$s->{prosrc}\", $s->{prosrc} }";
+
+ $fmgr_builtin_oid_index[ $s->{oid} ] = $fmgr_count++;
+ $last_builtin_oid = $s->{oid};
+}
+print $tfh "\n};\n";
+
+printf $tfh qq|
+const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin));
+
+const Oid fmgr_last_builtin_oid = %u;
+|, $last_builtin_oid;
+
+
+# Create fmgr_builtin_oid_index table.
+printf $tfh qq|
+const uint16 fmgr_builtin_oid_index[%u] = {
+|, $last_builtin_oid + 1;
+
+for (my $i = 0; $i <= $last_builtin_oid; $i++)
+{
+ my $oid = $fmgr_builtin_oid_index[$i];
+
+ # fmgr_builtin_oid_index is sparse, map nonexistent functions to
+ # InvalidOidBuiltinMapping
+ if (not defined $oid)
+ {
+ $oid = 'InvalidOidBuiltinMapping';
+ }
+
+ if ($i == $last_builtin_oid)
+ {
+ print $tfh " $oid\n";
+ }
+ else
+ {
+ print $tfh " $oid,\n";
+ }
+}
+print $tfh "};\n";
+
+
+# And add the file footers.
+print $ofh "\n#endif\t\t\t\t\t\t\t/* FMGROIDS_H */\n";
+print $pfh "\n#endif\t\t\t\t\t\t\t/* FMGRPROTOS_H */\n";
+
+close($ofh);
+close($pfh);
+close($tfh);
+
+# Finally, rename the completed files into place.
+Catalog::RenameTempFile($oidsfile, $tmpext);
+Catalog::RenameTempFile($protosfile, $tmpext);
+Catalog::RenameTempFile($tabfile, $tmpext);
+
+sub usage
+{
+ die <<EOM;
+Usage: perl -I [directory of Catalog.pm] Gen_fmgrtab.pl [--include-path/-i <path>] [path to pg_proc.dat]
+
+Options:
+ --output Output directory (default '.')
+ --include-path Include path in source tree
+
+Gen_fmgrtab.pl generates fmgroids.h, fmgrprotos.h, and fmgrtab.c from
+pg_proc.dat
+
+Report bugs to <pgsql-bugs\@lists.postgresql.org>.
+EOM
+}
+
+exit 0;
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
new file mode 100644
index 0000000..ebda1df
--- /dev/null
+++ b/src/backend/utils/Makefile
@@ -0,0 +1,119 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for backend/utils
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = fmgrtab.o
+SUBDIRS = \
+ activity \
+ adt \
+ cache \
+ error \
+ fmgr \
+ hash \
+ init \
+ mb \
+ misc \
+ mmgr \
+ resowner \
+ sort \
+ time
+
+# location of Catalog.pm
+catalogdir = $(top_srcdir)/src/backend/catalog
+
+include $(top_srcdir)/src/backend/common.mk
+
+all: distprep probes.h generated-header-symlinks
+
+distprep: fmgr-stamp errcodes.h
+
+.PHONY: generated-header-symlinks
+
+generated-header-symlinks: $(top_builddir)/src/include/utils/header-stamp $(top_builddir)/src/include/utils/probes.h
+
+$(SUBDIRS:%=%-recursive): fmgr-stamp errcodes.h
+
+# fmgr-stamp records the last time we ran Gen_fmgrtab.pl. We don't rely on
+# the timestamps of the individual output files, because the Perl script
+# won't update them if they didn't change (to avoid unnecessary recompiles).
+fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.dat
+ $(PERL) -I $(catalogdir) $< --include-path=$(top_srcdir)/src/include/ $(top_srcdir)/src/include/catalog/pg_proc.dat
+ touch $@
+
+errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
+ $(PERL) $(srcdir)/generate-errcodes.pl $< > $@
+
+ifneq ($(enable_dtrace), yes)
+probes.h: Gen_dummy_probes.sed
+endif
+
+# We editorialize on dtrace's output to the extent of changing the macro
+# names (from POSTGRESQL_foo to TRACE_POSTGRESQL_foo) and changing any
+# "char *" arguments to "const char *".
+probes.h: probes.d
+ifeq ($(enable_dtrace), yes)
+ $(DTRACE) -C -h -s $< -o $@.tmp
+ sed -e 's/POSTGRESQL_/TRACE_POSTGRESQL_/g' \
+ -e 's/( *char \*/(const char */g' \
+ -e 's/, *char \*/, const char */g' $@.tmp >$@
+ rm $@.tmp
+else
+ sed -f $(srcdir)/Gen_dummy_probes.sed $< >$@
+endif
+
+# These generated headers must be symlinked into builddir/src/include/,
+# using absolute links for the reasons explained in src/backend/Makefile.
+# We use header-stamp to record that we've done this because the symlinks
+# themselves may appear older than fmgr-stamp.
+$(top_builddir)/src/include/utils/header-stamp: fmgr-stamp errcodes.h
+ prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \
+ cd '$(dir $@)' && for file in fmgroids.h fmgrprotos.h errcodes.h; do \
+ rm -f $$file && $(LN_S) "$$prereqdir/$$file" . ; \
+ done
+ touch $@
+
+# probes.h is handled differently because it's not in the distribution tarball.
+$(top_builddir)/src/include/utils/probes.h: probes.h
+ cd '$(dir $@)' && rm -f $(notdir $@) && \
+ $(LN_S) "../../../$(subdir)/probes.h" .
+
+# Recipe for rebuilding the Perl version of Gen_dummy_probes
+# Nothing depends on it, so it will never be called unless explicitly requested
+# The last two lines of the recipe format the script according to our
+# standard and put back some blank lines for improved readability.
+Gen_dummy_probes.pl: Gen_dummy_probes.sed Gen_dummy_probes.pl.prolog
+ cp $(srcdir)/Gen_dummy_probes.pl.prolog $@
+ s2p -f $< | sed -e 1,3d -e '/# #/ d' -e '$$d' >> $@
+ perltidy --profile=$(srcdir)/../../tools/pgindent/perltidyrc $@
+ perl -pi -e '!$$lb && ( /^\t+#/ || /^# prototypes/ ) && print qq{\n};'\
+ -e '$$lb = m/^\n/; ' $@
+
+.PHONY: install-data
+install-data: errcodes.txt installdirs
+ $(INSTALL_DATA) $(srcdir)/errcodes.txt '$(DESTDIR)$(datadir)/errcodes.txt'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(datadir)'
+
+.PHONY: uninstall-data
+uninstall-data:
+ rm -f $(addprefix '$(DESTDIR)$(datadir)'/, errcodes.txt)
+
+# fmgroids.h, fmgrprotos.h, fmgrtab.c, fmgr-stamp, and errcodes.h are in the
+# distribution tarball, so they are not cleaned here.
+clean:
+ rm -f probes.h
+
+maintainer-clean: clean
+ rm -f fmgroids.h fmgrprotos.h fmgrtab.c fmgr-stamp errcodes.h
diff --git a/src/backend/utils/README.Gen_dummy_probes b/src/backend/utils/README.Gen_dummy_probes
new file mode 100644
index 0000000..e17060e
--- /dev/null
+++ b/src/backend/utils/README.Gen_dummy_probes
@@ -0,0 +1,27 @@
+# Generating dummy probes
+
+If Postgres isn't configured with dtrace enabled, we need to generate
+dummy probes for the entries in probes.d, that do nothing.
+
+This is accomplished in Unix via the sed script `Gen_dummy_probes.sed`. We
+used to use this in MSVC builds using the perl utility `psed`, which mimicked
+sed. However, that utility disappeared from Windows perl distributions and so
+we converted the sed script to a perl script to be used in MSVC builds.
+
+We still keep the sed script as the authoritative source for generating
+these dummy probes because except on Windows perl is not a hard requirement
+when building from a tarball.
+
+So, if you need to change the way dummy probes are generated, first change
+the sed script, and when it's working generate the perl script. This can
+be accomplished by using the perl utility s2p.
+
+s2p is no longer part of the perl core, so it might not be on your system,
+but it is available on CPAN and also in many package systems. e.g.
+on Fedora it can be installed using `cpan App::s2p` or
+`dnf install perl-App-s2p`.
+
+The Makefile contains a recipe for regenerating Gen_dummy_probes.pl, so all
+you need to do is once you have s2p installed is `make Gen_dummy_probes.pl`
+Note that in a VPATH build this will generate the file in the vpath tree,
+not the source tree.
diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile
new file mode 100644
index 0000000..a2e8507
--- /dev/null
+++ b/src/backend/utils/activity/Makefile
@@ -0,0 +1,34 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for backend/utils/activity
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/activity/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/activity
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ backend_progress.o \
+ backend_status.o \
+ pgstat.o \
+ pgstat_archiver.o \
+ pgstat_bgwriter.o \
+ pgstat_checkpointer.o \
+ pgstat_database.o \
+ pgstat_function.o \
+ pgstat_relation.o \
+ pgstat_replslot.o \
+ pgstat_shmem.o \
+ pgstat_slru.o \
+ pgstat_subscription.o \
+ pgstat_wal.o \
+ pgstat_xact.o \
+ wait_event.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c
new file mode 100644
index 0000000..f291997
--- /dev/null
+++ b/src/backend/utils/activity/backend_progress.c
@@ -0,0 +1,112 @@
+/* ----------
+ * backend_progress.c
+ *
+ * Command progress reporting infrastructure.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/activity/backend_progress.c
+ * ----------
+ */
+#include "postgres.h"
+
+#include "port/atomics.h" /* for memory barriers */
+#include "utils/backend_progress.h"
+#include "utils/backend_status.h"
+
+
+/*-----------
+ * pgstat_progress_start_command() -
+ *
+ * Set st_progress_command (and st_progress_command_target) in own backend
+ * entry. Also, zero-initialize st_progress_param array.
+ *-----------
+ */
+void
+pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ if (!beentry || !pgstat_track_activities)
+ return;
+
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+ beentry->st_progress_command = cmdtype;
+ beentry->st_progress_command_target = relid;
+ MemSet(&beentry->st_progress_param, 0, sizeof(beentry->st_progress_param));
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/*-----------
+ * pgstat_progress_update_param() -
+ *
+ * Update index'th member in st_progress_param[] of own backend entry.
+ *-----------
+ */
+void
+pgstat_progress_update_param(int index, int64 val)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ Assert(index >= 0 && index < PGSTAT_NUM_PROGRESS_PARAM);
+
+ if (!beentry || !pgstat_track_activities)
+ return;
+
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+ beentry->st_progress_param[index] = val;
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/*-----------
+ * pgstat_progress_update_multi_param() -
+ *
+ * Update multiple members in st_progress_param[] of own backend entry.
+ * This is atomic; readers won't see intermediate states.
+ *-----------
+ */
+void
+pgstat_progress_update_multi_param(int nparam, const int *index,
+ const int64 *val)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+ int i;
+
+ if (!beentry || !pgstat_track_activities || nparam == 0)
+ return;
+
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+
+ for (i = 0; i < nparam; ++i)
+ {
+ Assert(index[i] >= 0 && index[i] < PGSTAT_NUM_PROGRESS_PARAM);
+
+ beentry->st_progress_param[index[i]] = val[i];
+ }
+
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/*-----------
+ * pgstat_progress_end_command() -
+ *
+ * Reset st_progress_command (and st_progress_command_target) in own backend
+ * entry. This signals the end of the command.
+ *-----------
+ */
+void
+pgstat_progress_end_command(void)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ if (!beentry || !pgstat_track_activities)
+ return;
+
+ if (beentry->st_progress_command == PROGRESS_COMMAND_INVALID)
+ return;
+
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+ beentry->st_progress_command = PROGRESS_COMMAND_INVALID;
+ beentry->st_progress_command_target = InvalidOid;
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c
new file mode 100644
index 0000000..3ecb15d
--- /dev/null
+++ b/src/backend/utils/activity/backend_status.c
@@ -0,0 +1,1151 @@
+/* ----------
+ * backend_status.c
+ * Backend status reporting infrastructure.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/backend_status.c
+ * ----------
+ */
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "libpq/libpq.h"
+#include "miscadmin.h"
+#include "pg_trace.h"
+#include "pgstat.h"
+#include "port/atomics.h" /* for memory barriers */
+#include "storage/ipc.h"
+#include "storage/proc.h" /* for MyProc */
+#include "storage/sinvaladt.h"
+#include "utils/ascii.h"
+#include "utils/backend_status.h"
+#include "utils/guc.h" /* for application_name */
+#include "utils/memutils.h"
+
+
+/* ----------
+ * Total number of backends including auxiliary
+ *
+ * We reserve a slot for each possible BackendId, plus one for each
+ * possible auxiliary process type. (This scheme assumes there is not
+ * more than one of any auxiliary process type at a time.) MaxBackends
+ * includes autovacuum workers and background workers as well.
+ * ----------
+ */
+#define NumBackendStatSlots (MaxBackends + NUM_AUXPROCTYPES)
+
+
+/* ----------
+ * GUC parameters
+ * ----------
+ */
+bool pgstat_track_activities = false;
+int pgstat_track_activity_query_size = 1024;
+
+
+/* exposed so that backend_progress.c can access it */
+PgBackendStatus *MyBEEntry = NULL;
+
+
+static PgBackendStatus *BackendStatusArray = NULL;
+static char *BackendAppnameBuffer = NULL;
+static char *BackendClientHostnameBuffer = NULL;
+static char *BackendActivityBuffer = NULL;
+static Size BackendActivityBufferSize = 0;
+#ifdef USE_SSL
+static PgBackendSSLStatus *BackendSslStatusBuffer = NULL;
+#endif
+#ifdef ENABLE_GSS
+static PgBackendGSSStatus *BackendGssStatusBuffer = NULL;
+#endif
+
+
+/* Status for backends including auxiliary */
+static LocalPgBackendStatus *localBackendStatusTable = NULL;
+
+/* Total number of backends including auxiliary */
+static int localNumBackends = 0;
+
+static MemoryContext backendStatusSnapContext;
+
+
+static void pgstat_beshutdown_hook(int code, Datum arg);
+static void pgstat_read_current_status(void);
+static void pgstat_setup_backend_status_context(void);
+
+
+/*
+ * Report shared-memory space needed by CreateSharedBackendStatus.
+ */
+Size
+BackendStatusShmemSize(void)
+{
+ Size size;
+
+ /* BackendStatusArray: */
+ size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots);
+ /* BackendAppnameBuffer: */
+ size = add_size(size,
+ mul_size(NAMEDATALEN, NumBackendStatSlots));
+ /* BackendClientHostnameBuffer: */
+ size = add_size(size,
+ mul_size(NAMEDATALEN, NumBackendStatSlots));
+ /* BackendActivityBuffer: */
+ size = add_size(size,
+ mul_size(pgstat_track_activity_query_size, NumBackendStatSlots));
+#ifdef USE_SSL
+ /* BackendSslStatusBuffer: */
+ size = add_size(size,
+ mul_size(sizeof(PgBackendSSLStatus), NumBackendStatSlots));
+#endif
+#ifdef ENABLE_GSS
+ /* BackendGssStatusBuffer: */
+ size = add_size(size,
+ mul_size(sizeof(PgBackendGSSStatus), NumBackendStatSlots));
+#endif
+ return size;
+}
+
+/*
+ * Initialize the shared status array and several string buffers
+ * during postmaster startup.
+ */
+void
+CreateSharedBackendStatus(void)
+{
+ Size size;
+ bool found;
+ int i;
+ char *buffer;
+
+ /* Create or attach to the shared array */
+ size = mul_size(sizeof(PgBackendStatus), NumBackendStatSlots);
+ BackendStatusArray = (PgBackendStatus *)
+ ShmemInitStruct("Backend Status Array", size, &found);
+
+ if (!found)
+ {
+ /*
+ * We're the first - initialize.
+ */
+ MemSet(BackendStatusArray, 0, size);
+ }
+
+ /* Create or attach to the shared appname buffer */
+ size = mul_size(NAMEDATALEN, NumBackendStatSlots);
+ BackendAppnameBuffer = (char *)
+ ShmemInitStruct("Backend Application Name Buffer", size, &found);
+
+ if (!found)
+ {
+ MemSet(BackendAppnameBuffer, 0, size);
+
+ /* Initialize st_appname pointers. */
+ buffer = BackendAppnameBuffer;
+ for (i = 0; i < NumBackendStatSlots; i++)
+ {
+ BackendStatusArray[i].st_appname = buffer;
+ buffer += NAMEDATALEN;
+ }
+ }
+
+ /* Create or attach to the shared client hostname buffer */
+ size = mul_size(NAMEDATALEN, NumBackendStatSlots);
+ BackendClientHostnameBuffer = (char *)
+ ShmemInitStruct("Backend Client Host Name Buffer", size, &found);
+
+ if (!found)
+ {
+ MemSet(BackendClientHostnameBuffer, 0, size);
+
+ /* Initialize st_clienthostname pointers. */
+ buffer = BackendClientHostnameBuffer;
+ for (i = 0; i < NumBackendStatSlots; i++)
+ {
+ BackendStatusArray[i].st_clienthostname = buffer;
+ buffer += NAMEDATALEN;
+ }
+ }
+
+ /* Create or attach to the shared activity buffer */
+ BackendActivityBufferSize = mul_size(pgstat_track_activity_query_size,
+ NumBackendStatSlots);
+ BackendActivityBuffer = (char *)
+ ShmemInitStruct("Backend Activity Buffer",
+ BackendActivityBufferSize,
+ &found);
+
+ if (!found)
+ {
+ MemSet(BackendActivityBuffer, 0, BackendActivityBufferSize);
+
+ /* Initialize st_activity pointers. */
+ buffer = BackendActivityBuffer;
+ for (i = 0; i < NumBackendStatSlots; i++)
+ {
+ BackendStatusArray[i].st_activity_raw = buffer;
+ buffer += pgstat_track_activity_query_size;
+ }
+ }
+
+#ifdef USE_SSL
+ /* Create or attach to the shared SSL status buffer */
+ size = mul_size(sizeof(PgBackendSSLStatus), NumBackendStatSlots);
+ BackendSslStatusBuffer = (PgBackendSSLStatus *)
+ ShmemInitStruct("Backend SSL Status Buffer", size, &found);
+
+ if (!found)
+ {
+ PgBackendSSLStatus *ptr;
+
+ MemSet(BackendSslStatusBuffer, 0, size);
+
+ /* Initialize st_sslstatus pointers. */
+ ptr = BackendSslStatusBuffer;
+ for (i = 0; i < NumBackendStatSlots; i++)
+ {
+ BackendStatusArray[i].st_sslstatus = ptr;
+ ptr++;
+ }
+ }
+#endif
+
+#ifdef ENABLE_GSS
+ /* Create or attach to the shared GSSAPI status buffer */
+ size = mul_size(sizeof(PgBackendGSSStatus), NumBackendStatSlots);
+ BackendGssStatusBuffer = (PgBackendGSSStatus *)
+ ShmemInitStruct("Backend GSS Status Buffer", size, &found);
+
+ if (!found)
+ {
+ PgBackendGSSStatus *ptr;
+
+ MemSet(BackendGssStatusBuffer, 0, size);
+
+ /* Initialize st_gssstatus pointers. */
+ ptr = BackendGssStatusBuffer;
+ for (i = 0; i < NumBackendStatSlots; i++)
+ {
+ BackendStatusArray[i].st_gssstatus = ptr;
+ ptr++;
+ }
+ }
+#endif
+}
+
+/*
+ * Initialize pgstats backend activity state, and set up our on-proc-exit
+ * hook. Called from InitPostgres and AuxiliaryProcessMain. For auxiliary
+ * process, MyBackendId is invalid. Otherwise, MyBackendId must be set, but we
+ * must not have started any transaction yet (since the exit hook must run
+ * after the last transaction exit).
+ *
+ * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful.
+ */
+void
+pgstat_beinit(void)
+{
+ /* Initialize MyBEEntry */
+ if (MyBackendId != InvalidBackendId)
+ {
+ Assert(MyBackendId >= 1 && MyBackendId <= MaxBackends);
+ MyBEEntry = &BackendStatusArray[MyBackendId - 1];
+ }
+ else
+ {
+ /* Must be an auxiliary process */
+ Assert(MyAuxProcType != NotAnAuxProcess);
+
+ /*
+ * Assign the MyBEEntry for an auxiliary process. Since it doesn't
+ * have a BackendId, the slot is statically allocated based on the
+ * auxiliary process type (MyAuxProcType). Backends use slots indexed
+ * in the range from 1 to MaxBackends (inclusive), so we use
+ * MaxBackends + AuxBackendType + 1 as the index of the slot for an
+ * auxiliary process.
+ */
+ MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType];
+ }
+
+ /* Set up a process-exit hook to clean up */
+ on_shmem_exit(pgstat_beshutdown_hook, 0);
+}
+
+
+/* ----------
+ * pgstat_bestart() -
+ *
+ * Initialize this backend's entry in the PgBackendStatus array.
+ * Called from InitPostgres.
+ *
+ * Apart from auxiliary processes, MyBackendId, MyDatabaseId,
+ * session userid, and application_name must be set for a
+ * backend (hence, this cannot be combined with pgbestat_beinit).
+ * Note also that we must be inside a transaction if this isn't an aux
+ * process, as we may need to do encoding conversion on some strings.
+ * ----------
+ */
+void
+pgstat_bestart(void)
+{
+ volatile PgBackendStatus *vbeentry = MyBEEntry;
+ PgBackendStatus lbeentry;
+#ifdef USE_SSL
+ PgBackendSSLStatus lsslstatus;
+#endif
+#ifdef ENABLE_GSS
+ PgBackendGSSStatus lgssstatus;
+#endif
+
+ /* pgstats state must be initialized from pgstat_beinit() */
+ Assert(vbeentry != NULL);
+
+ /*
+ * To minimize the time spent modifying the PgBackendStatus entry, and
+ * avoid risk of errors inside the critical section, we first copy the
+ * shared-memory struct to a local variable, then modify the data in the
+ * local variable, then copy the local variable back to shared memory.
+ * Only the last step has to be inside the critical section.
+ *
+ * Most of the data we copy from shared memory is just going to be
+ * overwritten, but the struct's not so large that it's worth the
+ * maintenance hassle to copy only the needful fields.
+ */
+ memcpy(&lbeentry,
+ unvolatize(PgBackendStatus *, vbeentry),
+ sizeof(PgBackendStatus));
+
+ /* These structs can just start from zeroes each time, though */
+#ifdef USE_SSL
+ memset(&lsslstatus, 0, sizeof(lsslstatus));
+#endif
+#ifdef ENABLE_GSS
+ memset(&lgssstatus, 0, sizeof(lgssstatus));
+#endif
+
+ /*
+ * Now fill in all the fields of lbeentry, except for strings that are
+ * out-of-line data. Those have to be handled separately, below.
+ */
+ lbeentry.st_procpid = MyProcPid;
+ lbeentry.st_backendType = MyBackendType;
+ lbeentry.st_proc_start_timestamp = MyStartTimestamp;
+ lbeentry.st_activity_start_timestamp = 0;
+ lbeentry.st_state_start_timestamp = 0;
+ lbeentry.st_xact_start_timestamp = 0;
+ lbeentry.st_databaseid = MyDatabaseId;
+
+ /* We have userid for client-backends, wal-sender and bgworker processes */
+ if (lbeentry.st_backendType == B_BACKEND
+ || lbeentry.st_backendType == B_WAL_SENDER
+ || lbeentry.st_backendType == B_BG_WORKER)
+ lbeentry.st_userid = GetSessionUserId();
+ else
+ lbeentry.st_userid = InvalidOid;
+
+ /*
+ * We may not have a MyProcPort (eg, if this is the autovacuum process).
+ * If so, use all-zeroes client address, which is dealt with specially in
+ * pg_stat_get_backend_client_addr and pg_stat_get_backend_client_port.
+ */
+ if (MyProcPort)
+ memcpy(&lbeentry.st_clientaddr, &MyProcPort->raddr,
+ sizeof(lbeentry.st_clientaddr));
+ else
+ MemSet(&lbeentry.st_clientaddr, 0, sizeof(lbeentry.st_clientaddr));
+
+#ifdef USE_SSL
+ if (MyProcPort && MyProcPort->ssl_in_use)
+ {
+ lbeentry.st_ssl = true;
+ lsslstatus.ssl_bits = be_tls_get_cipher_bits(MyProcPort);
+ strlcpy(lsslstatus.ssl_version, be_tls_get_version(MyProcPort), NAMEDATALEN);
+ strlcpy(lsslstatus.ssl_cipher, be_tls_get_cipher(MyProcPort), NAMEDATALEN);
+ be_tls_get_peer_subject_name(MyProcPort, lsslstatus.ssl_client_dn, NAMEDATALEN);
+ be_tls_get_peer_serial(MyProcPort, lsslstatus.ssl_client_serial, NAMEDATALEN);
+ be_tls_get_peer_issuer_name(MyProcPort, lsslstatus.ssl_issuer_dn, NAMEDATALEN);
+ }
+ else
+ {
+ lbeentry.st_ssl = false;
+ }
+#else
+ lbeentry.st_ssl = false;
+#endif
+
+#ifdef ENABLE_GSS
+ if (MyProcPort && MyProcPort->gss != NULL)
+ {
+ const char *princ = be_gssapi_get_princ(MyProcPort);
+
+ lbeentry.st_gss = true;
+ lgssstatus.gss_auth = be_gssapi_get_auth(MyProcPort);
+ lgssstatus.gss_enc = be_gssapi_get_enc(MyProcPort);
+ if (princ)
+ strlcpy(lgssstatus.gss_princ, princ, NAMEDATALEN);
+ }
+ else
+ {
+ lbeentry.st_gss = false;
+ }
+#else
+ lbeentry.st_gss = false;
+#endif
+
+ lbeentry.st_state = STATE_UNDEFINED;
+ lbeentry.st_progress_command = PROGRESS_COMMAND_INVALID;
+ lbeentry.st_progress_command_target = InvalidOid;
+ lbeentry.st_query_id = UINT64CONST(0);
+
+ /*
+ * we don't zero st_progress_param here to save cycles; nobody should
+ * examine it until st_progress_command has been set to something other
+ * than PROGRESS_COMMAND_INVALID
+ */
+
+ /*
+ * We're ready to enter the critical section that fills the shared-memory
+ * status entry. We follow the protocol of bumping st_changecount before
+ * and after; and make sure it's even afterwards. We use a volatile
+ * pointer here to ensure the compiler doesn't try to get cute.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(vbeentry);
+
+ /* make sure we'll memcpy the same st_changecount back */
+ lbeentry.st_changecount = vbeentry->st_changecount;
+
+ memcpy(unvolatize(PgBackendStatus *, vbeentry),
+ &lbeentry,
+ sizeof(PgBackendStatus));
+
+ /*
+ * We can write the out-of-line strings and structs using the pointers
+ * that are in lbeentry; this saves some de-volatilizing messiness.
+ */
+ lbeentry.st_appname[0] = '\0';
+ if (MyProcPort && MyProcPort->remote_hostname)
+ strlcpy(lbeentry.st_clienthostname, MyProcPort->remote_hostname,
+ NAMEDATALEN);
+ else
+ lbeentry.st_clienthostname[0] = '\0';
+ lbeentry.st_activity_raw[0] = '\0';
+ /* Also make sure the last byte in each string area is always 0 */
+ lbeentry.st_appname[NAMEDATALEN - 1] = '\0';
+ lbeentry.st_clienthostname[NAMEDATALEN - 1] = '\0';
+ lbeentry.st_activity_raw[pgstat_track_activity_query_size - 1] = '\0';
+
+#ifdef USE_SSL
+ memcpy(lbeentry.st_sslstatus, &lsslstatus, sizeof(PgBackendSSLStatus));
+#endif
+#ifdef ENABLE_GSS
+ memcpy(lbeentry.st_gssstatus, &lgssstatus, sizeof(PgBackendGSSStatus));
+#endif
+
+ PGSTAT_END_WRITE_ACTIVITY(vbeentry);
+
+ /* Update app name to current GUC setting */
+ if (application_name)
+ pgstat_report_appname(application_name);
+}
+
+/*
+ * Clear out our entry in the PgBackendStatus array.
+ */
+static void
+pgstat_beshutdown_hook(int code, Datum arg)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ /*
+ * Clear my status entry, following the protocol of bumping st_changecount
+ * before and after. We use a volatile pointer here to ensure the
+ * compiler doesn't try to get cute.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+
+ beentry->st_procpid = 0; /* mark invalid */
+
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+
+ /* so that functions can check if backend_status.c is up via MyBEEntry */
+ MyBEEntry = NULL;
+}
+
+/*
+ * Discard any data collected in the current transaction. Any subsequent
+ * request will cause new snapshots to be read.
+ *
+ * This is also invoked during transaction commit or abort to discard the
+ * no-longer-wanted snapshot.
+ */
+void
+pgstat_clear_backend_activity_snapshot(void)
+{
+ /* Release memory, if any was allocated */
+ if (backendStatusSnapContext)
+ {
+ MemoryContextDelete(backendStatusSnapContext);
+ backendStatusSnapContext = NULL;
+ }
+
+ /* Reset variables */
+ localBackendStatusTable = NULL;
+ localNumBackends = 0;
+}
+
+static void
+pgstat_setup_backend_status_context(void)
+{
+ if (!backendStatusSnapContext)
+ backendStatusSnapContext = AllocSetContextCreate(TopMemoryContext,
+ "Backend Status Snapshot",
+ ALLOCSET_SMALL_SIZES);
+}
+
+
+/* ----------
+ * pgstat_report_activity() -
+ *
+ * Called from tcop/postgres.c to report what the backend is actually doing
+ * (but note cmd_str can be NULL for certain cases).
+ *
+ * All updates of the status entry follow the protocol of bumping
+ * st_changecount before and after. We use a volatile pointer here to
+ * ensure the compiler doesn't try to get cute.
+ * ----------
+ */
+void
+pgstat_report_activity(BackendState state, const char *cmd_str)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+ TimestampTz start_timestamp;
+ TimestampTz current_timestamp;
+ int len = 0;
+
+ TRACE_POSTGRESQL_STATEMENT_STATUS(cmd_str);
+
+ if (!beentry)
+ return;
+
+ if (!pgstat_track_activities)
+ {
+ if (beentry->st_state != STATE_DISABLED)
+ {
+ volatile PGPROC *proc = MyProc;
+
+ /*
+ * track_activities is disabled, but we last reported a
+ * non-disabled state. As our final update, change the state and
+ * clear fields we will not be updating anymore.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+ beentry->st_state = STATE_DISABLED;
+ beentry->st_state_start_timestamp = 0;
+ beentry->st_activity_raw[0] = '\0';
+ beentry->st_activity_start_timestamp = 0;
+ /* st_xact_start_timestamp and wait_event_info are also disabled */
+ beentry->st_xact_start_timestamp = 0;
+ beentry->st_query_id = UINT64CONST(0);
+ proc->wait_event_info = 0;
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+ }
+ return;
+ }
+
+ /*
+ * To minimize the time spent modifying the entry, and avoid risk of
+ * errors inside the critical section, fetch all the needed data first.
+ */
+ start_timestamp = GetCurrentStatementStartTimestamp();
+ if (cmd_str != NULL)
+ {
+ /*
+ * Compute length of to-be-stored string unaware of multi-byte
+ * characters. For speed reasons that'll get corrected on read, rather
+ * than computed every write.
+ */
+ len = Min(strlen(cmd_str), pgstat_track_activity_query_size - 1);
+ }
+ current_timestamp = GetCurrentTimestamp();
+
+ /*
+ * If the state has changed from "active" or "idle in transaction",
+ * calculate the duration.
+ */
+ if ((beentry->st_state == STATE_RUNNING ||
+ beentry->st_state == STATE_FASTPATH ||
+ beentry->st_state == STATE_IDLEINTRANSACTION ||
+ beentry->st_state == STATE_IDLEINTRANSACTION_ABORTED) &&
+ state != beentry->st_state)
+ {
+ long secs;
+ int usecs;
+
+ TimestampDifference(beentry->st_state_start_timestamp,
+ current_timestamp,
+ &secs, &usecs);
+
+ if (beentry->st_state == STATE_RUNNING ||
+ beentry->st_state == STATE_FASTPATH)
+ pgstat_count_conn_active_time((PgStat_Counter) secs * 1000000 + usecs);
+ else
+ pgstat_count_conn_txn_idle_time((PgStat_Counter) secs * 1000000 + usecs);
+ }
+
+ /*
+ * Now update the status entry
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+
+ beentry->st_state = state;
+ beentry->st_state_start_timestamp = current_timestamp;
+
+ /*
+ * If a new query is started, we reset the query identifier as it'll only
+ * be known after parse analysis, to avoid reporting last query's
+ * identifier.
+ */
+ if (state == STATE_RUNNING)
+ beentry->st_query_id = UINT64CONST(0);
+
+ if (cmd_str != NULL)
+ {
+ memcpy((char *) beentry->st_activity_raw, cmd_str, len);
+ beentry->st_activity_raw[len] = '\0';
+ beentry->st_activity_start_timestamp = start_timestamp;
+ }
+
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/* --------
+ * pgstat_report_query_id() -
+ *
+ * Called to update top-level query identifier.
+ * --------
+ */
+void
+pgstat_report_query_id(uint64 query_id, bool force)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ /*
+ * if track_activities is disabled, st_query_id should already have been
+ * reset
+ */
+ if (!beentry || !pgstat_track_activities)
+ return;
+
+ /*
+ * We only report the top-level query identifiers. The stored query_id is
+ * reset when a backend calls pgstat_report_activity(STATE_RUNNING), or
+ * with an explicit call to this function using the force flag. If the
+ * saved query identifier is not zero it means that it's not a top-level
+ * command, so ignore the one provided unless it's an explicit call to
+ * reset the identifier.
+ */
+ if (beentry->st_query_id != 0 && !force)
+ return;
+
+ /*
+ * Update my status entry, following the protocol of bumping
+ * st_changecount before and after. We use a volatile pointer here to
+ * ensure the compiler doesn't try to get cute.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+ beentry->st_query_id = query_id;
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+
+/* ----------
+ * pgstat_report_appname() -
+ *
+ * Called to update our application name.
+ * ----------
+ */
+void
+pgstat_report_appname(const char *appname)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+ int len;
+
+ if (!beentry)
+ return;
+
+ /* This should be unnecessary if GUC did its job, but be safe */
+ len = pg_mbcliplen(appname, strlen(appname), NAMEDATALEN - 1);
+
+ /*
+ * Update my status entry, following the protocol of bumping
+ * st_changecount before and after. We use a volatile pointer here to
+ * ensure the compiler doesn't try to get cute.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+
+ memcpy((char *) beentry->st_appname, appname, len);
+ beentry->st_appname[len] = '\0';
+
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/*
+ * Report current transaction start timestamp as the specified value.
+ * Zero means there is no active transaction.
+ */
+void
+pgstat_report_xact_timestamp(TimestampTz tstamp)
+{
+ volatile PgBackendStatus *beentry = MyBEEntry;
+
+ if (!pgstat_track_activities || !beentry)
+ return;
+
+ /*
+ * Update my status entry, following the protocol of bumping
+ * st_changecount before and after. We use a volatile pointer here to
+ * ensure the compiler doesn't try to get cute.
+ */
+ PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+
+ beentry->st_xact_start_timestamp = tstamp;
+
+ PGSTAT_END_WRITE_ACTIVITY(beentry);
+}
+
+/* ----------
+ * pgstat_read_current_status() -
+ *
+ * Copy the current contents of the PgBackendStatus array to local memory,
+ * if not already done in this transaction.
+ * ----------
+ */
+static void
+pgstat_read_current_status(void)
+{
+ volatile PgBackendStatus *beentry;
+ LocalPgBackendStatus *localtable;
+ LocalPgBackendStatus *localentry;
+ char *localappname,
+ *localclienthostname,
+ *localactivity;
+#ifdef USE_SSL
+ PgBackendSSLStatus *localsslstatus;
+#endif
+#ifdef ENABLE_GSS
+ PgBackendGSSStatus *localgssstatus;
+#endif
+ int i;
+
+ if (localBackendStatusTable)
+ return; /* already done */
+
+ pgstat_setup_backend_status_context();
+
+ /*
+ * Allocate storage for local copy of state data. We can presume that
+ * none of these requests overflow size_t, because we already calculated
+ * the same values using mul_size during shmem setup. However, with
+ * probably-silly values of pgstat_track_activity_query_size and
+ * max_connections, the localactivity buffer could exceed 1GB, so use
+ * "huge" allocation for that one.
+ */
+ localtable = (LocalPgBackendStatus *)
+ MemoryContextAlloc(backendStatusSnapContext,
+ sizeof(LocalPgBackendStatus) * NumBackendStatSlots);
+ localappname = (char *)
+ MemoryContextAlloc(backendStatusSnapContext,
+ NAMEDATALEN * NumBackendStatSlots);
+ localclienthostname = (char *)
+ MemoryContextAlloc(backendStatusSnapContext,
+ NAMEDATALEN * NumBackendStatSlots);
+ localactivity = (char *)
+ MemoryContextAllocHuge(backendStatusSnapContext,
+ (Size) pgstat_track_activity_query_size *
+ (Size) NumBackendStatSlots);
+#ifdef USE_SSL
+ localsslstatus = (PgBackendSSLStatus *)
+ MemoryContextAlloc(backendStatusSnapContext,
+ sizeof(PgBackendSSLStatus) * NumBackendStatSlots);
+#endif
+#ifdef ENABLE_GSS
+ localgssstatus = (PgBackendGSSStatus *)
+ MemoryContextAlloc(backendStatusSnapContext,
+ sizeof(PgBackendGSSStatus) * NumBackendStatSlots);
+#endif
+
+ localNumBackends = 0;
+
+ beentry = BackendStatusArray;
+ localentry = localtable;
+ for (i = 1; i <= NumBackendStatSlots; i++)
+ {
+ /*
+ * Follow the protocol of retrying if st_changecount changes while we
+ * copy the entry, or if it's odd. (The check for odd is needed to
+ * cover the case where we are able to completely copy the entry while
+ * the source backend is between increment steps.) We use a volatile
+ * pointer here to ensure the compiler doesn't try to get cute.
+ */
+ for (;;)
+ {
+ int before_changecount;
+ int after_changecount;
+
+ pgstat_begin_read_activity(beentry, before_changecount);
+
+ localentry->backendStatus.st_procpid = beentry->st_procpid;
+ /* Skip all the data-copying work if entry is not in use */
+ if (localentry->backendStatus.st_procpid > 0)
+ {
+ memcpy(&localentry->backendStatus, unvolatize(PgBackendStatus *, beentry), sizeof(PgBackendStatus));
+
+ /*
+ * For each PgBackendStatus field that is a pointer, copy the
+ * pointed-to data, then adjust the local copy of the pointer
+ * field to point at the local copy of the data.
+ *
+ * strcpy is safe even if the string is modified concurrently,
+ * because there's always a \0 at the end of the buffer.
+ */
+ strcpy(localappname, (char *) beentry->st_appname);
+ localentry->backendStatus.st_appname = localappname;
+ strcpy(localclienthostname, (char *) beentry->st_clienthostname);
+ localentry->backendStatus.st_clienthostname = localclienthostname;
+ strcpy(localactivity, (char *) beentry->st_activity_raw);
+ localentry->backendStatus.st_activity_raw = localactivity;
+#ifdef USE_SSL
+ if (beentry->st_ssl)
+ {
+ memcpy(localsslstatus, beentry->st_sslstatus, sizeof(PgBackendSSLStatus));
+ localentry->backendStatus.st_sslstatus = localsslstatus;
+ }
+#endif
+#ifdef ENABLE_GSS
+ if (beentry->st_gss)
+ {
+ memcpy(localgssstatus, beentry->st_gssstatus, sizeof(PgBackendGSSStatus));
+ localentry->backendStatus.st_gssstatus = localgssstatus;
+ }
+#endif
+ }
+
+ pgstat_end_read_activity(beentry, after_changecount);
+
+ if (pgstat_read_activity_complete(before_changecount,
+ after_changecount))
+ break;
+
+ /* Make sure we can break out of loop if stuck... */
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ beentry++;
+ /* Only valid entries get included into the local array */
+ if (localentry->backendStatus.st_procpid > 0)
+ {
+ BackendIdGetTransactionIds(i,
+ &localentry->backend_xid,
+ &localentry->backend_xmin);
+
+ localentry++;
+ localappname += NAMEDATALEN;
+ localclienthostname += NAMEDATALEN;
+ localactivity += pgstat_track_activity_query_size;
+#ifdef USE_SSL
+ localsslstatus++;
+#endif
+#ifdef ENABLE_GSS
+ localgssstatus++;
+#endif
+ localNumBackends++;
+ }
+ }
+
+ /* Set the pointer only after completion of a valid table */
+ localBackendStatusTable = localtable;
+}
+
+
+/* ----------
+ * pgstat_get_backend_current_activity() -
+ *
+ * Return a string representing the current activity of the backend with
+ * the specified PID. This looks directly at the BackendStatusArray,
+ * and so will provide current information regardless of the age of our
+ * transaction's snapshot of the status array.
+ *
+ * It is the caller's responsibility to invoke this only for backends whose
+ * state is expected to remain stable while the result is in use. The
+ * only current use is in deadlock reporting, where we can expect that
+ * the target backend is blocked on a lock. (There are corner cases
+ * where the target's wait could get aborted while we are looking at it,
+ * but the very worst consequence is to return a pointer to a string
+ * that's been changed, so we won't worry too much.)
+ *
+ * Note: return strings for special cases match pg_stat_get_backend_activity.
+ * ----------
+ */
+const char *
+pgstat_get_backend_current_activity(int pid, bool checkUser)
+{
+ PgBackendStatus *beentry;
+ int i;
+
+ beentry = BackendStatusArray;
+ for (i = 1; i <= MaxBackends; i++)
+ {
+ /*
+ * Although we expect the target backend's entry to be stable, that
+ * doesn't imply that anyone else's is. To avoid identifying the
+ * wrong backend, while we check for a match to the desired PID we
+ * must follow the protocol of retrying if st_changecount changes
+ * while we examine the entry, or if it's odd. (This might be
+ * unnecessary, since fetching or storing an int is almost certainly
+ * atomic, but let's play it safe.) We use a volatile pointer here to
+ * ensure the compiler doesn't try to get cute.
+ */
+ volatile PgBackendStatus *vbeentry = beentry;
+ bool found;
+
+ for (;;)
+ {
+ int before_changecount;
+ int after_changecount;
+
+ pgstat_begin_read_activity(vbeentry, before_changecount);
+
+ found = (vbeentry->st_procpid == pid);
+
+ pgstat_end_read_activity(vbeentry, after_changecount);
+
+ if (pgstat_read_activity_complete(before_changecount,
+ after_changecount))
+ break;
+
+ /* Make sure we can break out of loop if stuck... */
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ if (found)
+ {
+ /* Now it is safe to use the non-volatile pointer */
+ if (checkUser && !superuser() && beentry->st_userid != GetUserId())
+ return "<insufficient privilege>";
+ else if (*(beentry->st_activity_raw) == '\0')
+ return "<command string not enabled>";
+ else
+ {
+ /* this'll leak a bit of memory, but that seems acceptable */
+ return pgstat_clip_activity(beentry->st_activity_raw);
+ }
+ }
+
+ beentry++;
+ }
+
+ /* If we get here, caller is in error ... */
+ return "<backend information not available>";
+}
+
+/* ----------
+ * pgstat_get_crashed_backend_activity() -
+ *
+ * Return a string representing the current activity of the backend with
+ * the specified PID. Like the function above, but reads shared memory with
+ * the expectation that it may be corrupt. On success, copy the string
+ * into the "buffer" argument and return that pointer. On failure,
+ * return NULL.
+ *
+ * This function is only intended to be used by the postmaster to report the
+ * query that crashed a backend. In particular, no attempt is made to
+ * follow the correct concurrency protocol when accessing the
+ * BackendStatusArray. But that's OK, in the worst case we'll return a
+ * corrupted message. We also must take care not to trip on ereport(ERROR).
+ * ----------
+ */
+const char *
+pgstat_get_crashed_backend_activity(int pid, char *buffer, int buflen)
+{
+ volatile PgBackendStatus *beentry;
+ int i;
+
+ beentry = BackendStatusArray;
+
+ /*
+ * We probably shouldn't get here before shared memory has been set up,
+ * but be safe.
+ */
+ if (beentry == NULL || BackendActivityBuffer == NULL)
+ return NULL;
+
+ for (i = 1; i <= MaxBackends; i++)
+ {
+ if (beentry->st_procpid == pid)
+ {
+ /* Read pointer just once, so it can't change after validation */
+ const char *activity = beentry->st_activity_raw;
+ const char *activity_last;
+
+ /*
+ * We mustn't access activity string before we verify that it
+ * falls within the BackendActivityBuffer. To make sure that the
+ * entire string including its ending is contained within the
+ * buffer, subtract one activity length from the buffer size.
+ */
+ activity_last = BackendActivityBuffer + BackendActivityBufferSize
+ - pgstat_track_activity_query_size;
+
+ if (activity < BackendActivityBuffer ||
+ activity > activity_last)
+ return NULL;
+
+ /* If no string available, no point in a report */
+ if (activity[0] == '\0')
+ return NULL;
+
+ /*
+ * Copy only ASCII-safe characters so we don't run into encoding
+ * problems when reporting the message; and be sure not to run off
+ * the end of memory. As only ASCII characters are reported, it
+ * doesn't seem necessary to perform multibyte aware clipping.
+ */
+ ascii_safe_strlcpy(buffer, activity,
+ Min(buflen, pgstat_track_activity_query_size));
+
+ return buffer;
+ }
+
+ beentry++;
+ }
+
+ /* PID not found */
+ return NULL;
+}
+
+/* ----------
+ * pgstat_get_my_query_id() -
+ *
+ * Return current backend's query identifier.
+ */
+uint64
+pgstat_get_my_query_id(void)
+{
+ if (!MyBEEntry)
+ return 0;
+
+ /*
+ * There's no need for a lock around pgstat_begin_read_activity /
+ * pgstat_end_read_activity here as it's only called from
+ * pg_stat_get_activity which is already protected, or from the same
+ * backend which means that there won't be concurrent writes.
+ */
+ return MyBEEntry->st_query_id;
+}
+
+
+/* ----------
+ * pgstat_fetch_stat_beentry() -
+ *
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * our local copy of the current-activity entry for one backend.
+ *
+ * NB: caller is responsible for a check if the user is permitted to see
+ * this info (especially the querystring).
+ * ----------
+ */
+PgBackendStatus *
+pgstat_fetch_stat_beentry(int beid)
+{
+ pgstat_read_current_status();
+
+ if (beid < 1 || beid > localNumBackends)
+ return NULL;
+
+ return &localBackendStatusTable[beid - 1].backendStatus;
+}
+
+
+/* ----------
+ * pgstat_fetch_stat_local_beentry() -
+ *
+ * Like pgstat_fetch_stat_beentry() but with locally computed additions (like
+ * xid and xmin values of the backend)
+ *
+ * NB: caller is responsible for a check if the user is permitted to see
+ * this info (especially the querystring).
+ * ----------
+ */
+LocalPgBackendStatus *
+pgstat_fetch_stat_local_beentry(int beid)
+{
+ pgstat_read_current_status();
+
+ if (beid < 1 || beid > localNumBackends)
+ return NULL;
+
+ return &localBackendStatusTable[beid - 1];
+}
+
+
+/* ----------
+ * pgstat_fetch_stat_numbackends() -
+ *
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * the maximum current backend id.
+ * ----------
+ */
+int
+pgstat_fetch_stat_numbackends(void)
+{
+ pgstat_read_current_status();
+
+ return localNumBackends;
+}
+
+/*
+ * Convert a potentially unsafely truncated activity string (see
+ * PgBackendStatus.st_activity_raw's documentation) into a correctly truncated
+ * one.
+ *
+ * The returned string is allocated in the caller's memory context and may be
+ * freed.
+ */
+char *
+pgstat_clip_activity(const char *raw_activity)
+{
+ char *activity;
+ int rawlen;
+ int cliplen;
+
+ /*
+ * Some callers, like pgstat_get_backend_current_activity(), do not
+ * guarantee that the buffer isn't concurrently modified. We try to take
+ * care that the buffer is always terminated by a NUL byte regardless, but
+ * let's still be paranoid about the string's length. In those cases the
+ * underlying buffer is guaranteed to be pgstat_track_activity_query_size
+ * large.
+ */
+ activity = pnstrdup(raw_activity, pgstat_track_activity_query_size - 1);
+
+ /* now double-guaranteed to be NUL terminated */
+ rawlen = strlen(activity);
+
+ /*
+ * All supported server-encodings make it possible to determine the length
+ * of a multi-byte character from its first byte (this is not the case for
+ * client encodings, see GB18030). As st_activity is always stored using
+ * server encoding, this allows us to perform multi-byte aware truncation,
+ * even if the string earlier was truncated in the middle of a multi-byte
+ * character.
+ */
+ cliplen = pg_mbcliplen(activity, rawlen,
+ pgstat_track_activity_query_size - 1);
+
+ activity[cliplen] = '\0';
+
+ return activity;
+}
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
new file mode 100644
index 0000000..84d65a7
--- /dev/null
+++ b/src/backend/utils/activity/pgstat.c
@@ -0,0 +1,1678 @@
+/* ----------
+ * pgstat.c
+ * Infrastructure for the cumulative statistics system.
+ *
+ * The cumulative statistics system accumulates statistics for different kinds
+ * of objects. Some kinds of statistics are collected for a fixed number of
+ * objects (most commonly 1), e.g., checkpointer statistics. Other kinds of
+ * statistics are collected for a varying number of objects
+ * (e.g. relations). See PgStat_KindInfo for a list of currently handled
+ * statistics.
+ *
+ * Statistics are loaded from the filesystem during startup (by the startup
+ * process), unless preceded by a crash, in which case all stats are
+ * discarded. They are written out by the checkpointer process just before
+ * shutting down, except when shutting down in immediate mode.
+ *
+ * Fixed-numbered stats are stored in plain (non-dynamic) shared memory.
+ *
+ * Statistics for variable-numbered objects are stored in dynamic shared
+ * memory and can be found via a dshash hashtable. The statistics counters are
+ * not part of the dshash entry (PgStatShared_HashEntry) directly, but are
+ * separately allocated (PgStatShared_HashEntry->body). The separate
+ * allocation allows different kinds of statistics to be stored in the same
+ * hashtable without wasting space in PgStatShared_HashEntry.
+ *
+ * Variable-numbered stats are addressed by PgStat_HashKey while running. It
+ * is not possible to have statistics for an object that cannot be addressed
+ * that way at runtime. A wider identifier can be used when serializing to
+ * disk (used for replication slot stats).
+ *
+ * To avoid contention on the shared hashtable, each backend has a
+ * backend-local hashtable (pgStatEntryRefHash) in front of the shared
+ * hashtable, containing references (PgStat_EntryRef) to shared hashtable
+ * entries. The shared hashtable only needs to be accessed when no prior
+ * reference is found in the local hashtable. Besides pointing to the
+ * shared hashtable entry (PgStatShared_HashEntry) PgStat_EntryRef also
+ * contains a pointer to the shared statistics data, as a process-local
+ * address, to reduce access costs.
+ *
+ * The names for structs stored in shared memory are prefixed with
+ * PgStatShared instead of PgStat. Each stats entry in shared memory is
+ * protected by a dedicated lwlock.
+ *
+ * Most stats updates are first accumulated locally in each process as pending
+ * entries, then later flushed to shared memory (just after commit, or by
+ * idle-timeout). This practically eliminates contention on individual stats
+ * entries. For most kinds of variable-numbered pending stats data is stored
+ * in PgStat_EntryRef->pending. All entries with pending data are in the
+ * pgStatPending list. Pending statistics updates are flushed out by
+ * pgstat_report_stat().
+ *
+ * The behavior of different kinds of statistics is determined by the kind's
+ * entry in pgstat_kind_infos, see PgStat_KindInfo for details.
+ *
+ * The consistency of read accesses to statistics can be configured using the
+ * stats_fetch_consistency GUC (see config.sgml and monitoring.sgml for the
+ * settings). When using PGSTAT_FETCH_CONSISTENCY_CACHE or
+ * PGSTAT_FETCH_CONSISTENCY_SNAPSHOT statistics are stored in
+ * pgStatLocal.snapshot.
+ *
+ * To keep things manageable, stats handling is split across several
+ * files. Infrastructure pieces are in:
+ * - pgstat.c - this file, to tie it all together
+ * - pgstat_shmem.c - nearly everything dealing with shared memory, including
+ * the maintenance of hashtable entries
+ * - pgstat_xact.c - transactional integration, including the transactional
+ * creation and dropping of stats entries
+ *
+ * Each statistics kind is handled in a dedicated file:
+ * - pgstat_archiver.c
+ * - pgstat_bgwriter.c
+ * - pgstat_checkpointer.c
+ * - pgstat_database.c
+ * - pgstat_function.c
+ * - pgstat_relation.c
+ * - pgstat_replslot.c
+ * - pgstat_slru.c
+ * - pgstat_subscription.c
+ * - pgstat_wal.c
+ *
+ * Whenever possible infrastructure files should not contain code related to
+ * specific kinds of stats.
+ *
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat.c
+ * ----------
+ */
+#include "postgres.h"
+
+#include <unistd.h>
+
+#include "access/transam.h"
+#include "access/xact.h"
+#include "lib/dshash.h"
+#include "pgstat.h"
+#include "port/atomics.h"
+#include "storage/fd.h"
+#include "storage/ipc.h"
+#include "storage/lwlock.h"
+#include "storage/pg_shmem.h"
+#include "storage/shmem.h"
+#include "utils/guc.h"
+#include "utils/memutils.h"
+#include "utils/pgstat_internal.h"
+#include "utils/timestamp.h"
+
+
+/* ----------
+ * Timer definitions.
+ *
+ * In milliseconds.
+ * ----------
+ */
+
+/* minimum interval non-forced stats flushes.*/
+#define PGSTAT_MIN_INTERVAL 1000
+/* how long until to block flushing pending stats updates */
+#define PGSTAT_MAX_INTERVAL 60000
+/* when to call pgstat_report_stat() again, even when idle */
+#define PGSTAT_IDLE_INTERVAL 10000
+
+/* ----------
+ * Initial size hints for the hash tables used in statistics.
+ * ----------
+ */
+
+#define PGSTAT_SNAPSHOT_HASH_SIZE 512
+
+
+/* hash table for statistics snapshots entry */
+typedef struct PgStat_SnapshotEntry
+{
+ PgStat_HashKey key;
+ char status; /* for simplehash use */
+ void *data; /* the stats data itself */
+} PgStat_SnapshotEntry;
+
+
+/* ----------
+ * Backend-local Hash Table Definitions
+ * ----------
+ */
+
+/* for stats snapshot entries */
+#define SH_PREFIX pgstat_snapshot
+#define SH_ELEMENT_TYPE PgStat_SnapshotEntry
+#define SH_KEY_TYPE PgStat_HashKey
+#define SH_KEY key
+#define SH_HASH_KEY(tb, key) \
+ pgstat_hash_hash_key(&key, sizeof(PgStat_HashKey), NULL)
+#define SH_EQUAL(tb, a, b) \
+ pgstat_cmp_hash_key(&a, &b, sizeof(PgStat_HashKey), NULL) == 0
+#define SH_SCOPE static inline
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
+
+/* ----------
+ * Local function forward declarations
+ * ----------
+ */
+
+static void pgstat_write_statsfile(void);
+static void pgstat_read_statsfile(void);
+
+static void pgstat_reset_after_failure(void);
+
+static bool pgstat_flush_pending_entries(bool nowait);
+
+static void pgstat_prep_snapshot(void);
+static void pgstat_build_snapshot(void);
+static void pgstat_build_snapshot_fixed(PgStat_Kind kind);
+
+static inline bool pgstat_is_kind_valid(int ikind);
+
+
+/* ----------
+ * GUC parameters
+ * ----------
+ */
+
+bool pgstat_track_counts = false;
+int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_CACHE;
+
+
+/* ----------
+ * state shared with pgstat_*.c
+ * ----------
+ */
+
+PgStat_LocalState pgStatLocal;
+
+
+/* ----------
+ * Local data
+ *
+ * NB: There should be only variables related to stats infrastructure here,
+ * not for specific kinds of stats.
+ * ----------
+ */
+
+/*
+ * Memory contexts containing the pgStatEntryRefHash table, the
+ * pgStatSharedRef entries, and pending data respectively. Mostly to make it
+ * easier to track / attribute memory usage.
+ */
+
+static MemoryContext pgStatPendingContext = NULL;
+
+/*
+ * Backend local list of PgStat_EntryRef with unflushed pending stats.
+ *
+ * Newly pending entries should only ever be added to the end of the list,
+ * otherwise pgstat_flush_pending_entries() might not see them immediately.
+ */
+static dlist_head pgStatPending = DLIST_STATIC_INIT(pgStatPending);
+
+
+/*
+ * Force the next stats flush to happen regardless of
+ * PGSTAT_MIN_INTERVAL. Useful in test scripts.
+ */
+static bool pgStatForceNextFlush = false;
+
+/*
+ * Force-clear existing snapshot before next use when stats_fetch_consistency
+ * is changed.
+ */
+static bool force_stats_snapshot_clear = false;
+
+
+/*
+ * For assertions that check pgstat is not used before initialization / after
+ * shutdown.
+ */
+#ifdef USE_ASSERT_CHECKING
+static bool pgstat_is_initialized = false;
+static bool pgstat_is_shutdown = false;
+#endif
+
+
+/*
+ * The different kinds of statistics.
+ *
+ * If reasonably possible, handling specific to one kind of stats should go
+ * through this abstraction, rather than making more of pgstat.c aware.
+ *
+ * See comments for struct PgStat_KindInfo for details about the individual
+ * fields.
+ *
+ * XXX: It'd be nicer to define this outside of this file. But there doesn't
+ * seem to be a great way of doing that, given the split across multiple
+ * files.
+ */
+static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] = {
+
+ /* stats kinds for variable-numbered objects */
+
+ [PGSTAT_KIND_DATABASE] = {
+ .name = "database",
+
+ .fixed_amount = false,
+ /* so pg_stat_database entries can be seen in all databases */
+ .accessed_across_databases = true,
+
+ .shared_size = sizeof(PgStatShared_Database),
+ .shared_data_off = offsetof(PgStatShared_Database, stats),
+ .shared_data_len = sizeof(((PgStatShared_Database *) 0)->stats),
+ .pending_size = sizeof(PgStat_StatDBEntry),
+
+ .flush_pending_cb = pgstat_database_flush_cb,
+ .reset_timestamp_cb = pgstat_database_reset_timestamp_cb,
+ },
+
+ [PGSTAT_KIND_RELATION] = {
+ .name = "relation",
+
+ .fixed_amount = false,
+
+ .shared_size = sizeof(PgStatShared_Relation),
+ .shared_data_off = offsetof(PgStatShared_Relation, stats),
+ .shared_data_len = sizeof(((PgStatShared_Relation *) 0)->stats),
+ .pending_size = sizeof(PgStat_TableStatus),
+
+ .flush_pending_cb = pgstat_relation_flush_cb,
+ .delete_pending_cb = pgstat_relation_delete_pending_cb,
+ },
+
+ [PGSTAT_KIND_FUNCTION] = {
+ .name = "function",
+
+ .fixed_amount = false,
+
+ .shared_size = sizeof(PgStatShared_Function),
+ .shared_data_off = offsetof(PgStatShared_Function, stats),
+ .shared_data_len = sizeof(((PgStatShared_Function *) 0)->stats),
+ .pending_size = sizeof(PgStat_BackendFunctionEntry),
+
+ .flush_pending_cb = pgstat_function_flush_cb,
+ },
+
+ [PGSTAT_KIND_REPLSLOT] = {
+ .name = "replslot",
+
+ .fixed_amount = false,
+
+ .accessed_across_databases = true,
+ .named_on_disk = true,
+
+ .shared_size = sizeof(PgStatShared_ReplSlot),
+ .shared_data_off = offsetof(PgStatShared_ReplSlot, stats),
+ .shared_data_len = sizeof(((PgStatShared_ReplSlot *) 0)->stats),
+
+ .reset_timestamp_cb = pgstat_replslot_reset_timestamp_cb,
+ .to_serialized_name = pgstat_replslot_to_serialized_name_cb,
+ .from_serialized_name = pgstat_replslot_from_serialized_name_cb,
+ },
+
+ [PGSTAT_KIND_SUBSCRIPTION] = {
+ .name = "subscription",
+
+ .fixed_amount = false,
+ /* so pg_stat_subscription_stats entries can be seen in all databases */
+ .accessed_across_databases = true,
+
+ .shared_size = sizeof(PgStatShared_Subscription),
+ .shared_data_off = offsetof(PgStatShared_Subscription, stats),
+ .shared_data_len = sizeof(((PgStatShared_Subscription *) 0)->stats),
+ .pending_size = sizeof(PgStat_BackendSubEntry),
+
+ .flush_pending_cb = pgstat_subscription_flush_cb,
+ .reset_timestamp_cb = pgstat_subscription_reset_timestamp_cb,
+ },
+
+
+ /* stats for fixed-numbered (mostly 1) objects */
+
+ [PGSTAT_KIND_ARCHIVER] = {
+ .name = "archiver",
+
+ .fixed_amount = true,
+
+ .reset_all_cb = pgstat_archiver_reset_all_cb,
+ .snapshot_cb = pgstat_archiver_snapshot_cb,
+ },
+
+ [PGSTAT_KIND_BGWRITER] = {
+ .name = "bgwriter",
+
+ .fixed_amount = true,
+
+ .reset_all_cb = pgstat_bgwriter_reset_all_cb,
+ .snapshot_cb = pgstat_bgwriter_snapshot_cb,
+ },
+
+ [PGSTAT_KIND_CHECKPOINTER] = {
+ .name = "checkpointer",
+
+ .fixed_amount = true,
+
+ .reset_all_cb = pgstat_checkpointer_reset_all_cb,
+ .snapshot_cb = pgstat_checkpointer_snapshot_cb,
+ },
+
+ [PGSTAT_KIND_SLRU] = {
+ .name = "slru",
+
+ .fixed_amount = true,
+
+ .reset_all_cb = pgstat_slru_reset_all_cb,
+ .snapshot_cb = pgstat_slru_snapshot_cb,
+ },
+
+ [PGSTAT_KIND_WAL] = {
+ .name = "wal",
+
+ .fixed_amount = true,
+
+ .reset_all_cb = pgstat_wal_reset_all_cb,
+ .snapshot_cb = pgstat_wal_snapshot_cb,
+ },
+};
+
+
+/* ------------------------------------------------------------
+ * Functions managing the state of the stats system for all backends.
+ * ------------------------------------------------------------
+ */
+
+/*
+ * Read on-disk stats into memory at server start.
+ *
+ * Should only be called by the startup process or in single user mode.
+ */
+void
+pgstat_restore_stats(void)
+{
+ pgstat_read_statsfile();
+}
+
+/*
+ * Remove the stats file. This is currently used only if WAL recovery is
+ * needed after a crash.
+ *
+ * Should only be called by the startup process or in single user mode.
+ */
+void
+pgstat_discard_stats(void)
+{
+ int ret;
+
+ /* NB: this needs to be done even in single user mode */
+
+ ret = unlink(PGSTAT_STAT_PERMANENT_FILENAME);
+ if (ret != 0)
+ {
+ if (errno == ENOENT)
+ elog(DEBUG2,
+ "didn't need to unlink permanent stats file \"%s\" - didn't exist",
+ PGSTAT_STAT_PERMANENT_FILENAME);
+ else
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not unlink permanent statistics file \"%s\": %m",
+ PGSTAT_STAT_PERMANENT_FILENAME)));
+ }
+ else
+ {
+ ereport(DEBUG2,
+ (errcode_for_file_access(),
+ errmsg_internal("unlinked permanent statistics file \"%s\"",
+ PGSTAT_STAT_PERMANENT_FILENAME)));
+ }
+
+ /*
+ * Reset stats contents. This will set reset timestamps of fixed-numbered
+ * stats to the current time (no variable stats exist).
+ */
+ pgstat_reset_after_failure();
+}
+
+/*
+ * pgstat_before_server_shutdown() needs to be called by exactly one process
+ * during regular server shutdowns. Otherwise all stats will be lost.
+ *
+ * We currently only write out stats for proc_exit(0). We might want to change
+ * that at some point... But right now pgstat_discard_stats() would be called
+ * during the start after a disorderly shutdown, anyway.
+ */
+void
+pgstat_before_server_shutdown(int code, Datum arg)
+{
+ Assert(pgStatLocal.shmem != NULL);
+ Assert(!pgStatLocal.shmem->is_shutdown);
+
+ /*
+ * Stats should only be reported after pgstat_initialize() and before
+ * pgstat_shutdown(). This is a convenient point to catch most violations
+ * of this rule.
+ */
+ Assert(pgstat_is_initialized && !pgstat_is_shutdown);
+
+ /* flush out our own pending changes before writing out */
+ pgstat_report_stat(true);
+
+ /*
+ * Only write out file during normal shutdown. Don't even signal that
+ * we've shutdown during irregular shutdowns, because the shutdown
+ * sequence isn't coordinated to ensure this backend shuts down last.
+ */
+ if (code == 0)
+ {
+ pgStatLocal.shmem->is_shutdown = true;
+ pgstat_write_statsfile();
+ }
+}
+
+
+/* ------------------------------------------------------------
+ * Backend initialization / shutdown functions
+ * ------------------------------------------------------------
+ */
+
+/*
+ * Shut down a single backend's statistics reporting at process exit.
+ *
+ * Flush out any remaining statistics counts. Without this, operations
+ * triggered during backend exit (such as temp table deletions) won't be
+ * counted.
+ */
+static void
+pgstat_shutdown_hook(int code, Datum arg)
+{
+ Assert(!pgstat_is_shutdown);
+ Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
+
+ /*
+ * If we got as far as discovering our own database ID, we can flush out
+ * what we did so far. Otherwise, we'd be reporting an invalid database
+ * ID, so forget it. (This means that accesses to pg_database during
+ * failed backend starts might never get counted.)
+ */
+ if (OidIsValid(MyDatabaseId))
+ pgstat_report_disconnect(MyDatabaseId);
+
+ pgstat_report_stat(true);
+
+ /* there shouldn't be any pending changes left */
+ Assert(dlist_is_empty(&pgStatPending));
+ dlist_init(&pgStatPending);
+
+ pgstat_detach_shmem();
+
+#ifdef USE_ASSERT_CHECKING
+ pgstat_is_shutdown = true;
+#endif
+}
+
+/*
+ * Initialize pgstats state, and set up our on-proc-exit hook. Called from
+ * BaseInit().
+ *
+ * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful.
+ */
+void
+pgstat_initialize(void)
+{
+ Assert(!pgstat_is_initialized);
+
+ pgstat_attach_shmem();
+
+ pgstat_init_wal();
+
+ /* Set up a process-exit hook to clean up */
+ before_shmem_exit(pgstat_shutdown_hook, 0);
+
+#ifdef USE_ASSERT_CHECKING
+ pgstat_is_initialized = true;
+#endif
+}
+
+
+/* ------------------------------------------------------------
+ * Public functions used by backends follow
+ * ------------------------------------------------------------
+ */
+
+/*
+ * Must be called by processes that performs DML: tcop/postgres.c, logical
+ * receiver processes, SPI worker, etc. to flush pending statistics updates to
+ * shared memory.
+ *
+ * Unless called with 'force', pending stats updates are flushed happen once
+ * per PGSTAT_MIN_INTERVAL (1000ms). When not forced, stats flushes do not
+ * block on lock acquisition, except if stats updates have been pending for
+ * longer than PGSTAT_MAX_INTERVAL (60000ms).
+ *
+ * Whenever pending stats updates remain at the end of pgstat_report_stat() a
+ * suggested idle timeout is returned. Currently this is always
+ * PGSTAT_IDLE_INTERVAL (10000ms). Callers can use the returned time to set up
+ * a timeout after which to call pgstat_report_stat(true), but are not
+ * required to to do so.
+ *
+ * Note that this is called only when not within a transaction, so it is fair
+ * to use transaction stop time as an approximation of current time.
+ */
+long
+pgstat_report_stat(bool force)
+{
+ static TimestampTz pending_since = 0;
+ static TimestampTz last_flush = 0;
+ bool partial_flush;
+ TimestampTz now;
+ bool nowait;
+
+ pgstat_assert_is_up();
+ Assert(!IsTransactionOrTransactionBlock());
+
+ /* "absorb" the forced flush even if there's nothing to flush */
+ if (pgStatForceNextFlush)
+ {
+ force = true;
+ pgStatForceNextFlush = false;
+ }
+
+ /* Don't expend a clock check if nothing to do */
+ if (dlist_is_empty(&pgStatPending) &&
+ !have_slrustats &&
+ !pgstat_have_pending_wal())
+ {
+ Assert(pending_since == 0);
+ return 0;
+ }
+
+ /*
+ * There should never be stats to report once stats are shut down. Can't
+ * assert that before the checks above, as there is an unconditional
+ * pgstat_report_stat() call in pgstat_shutdown_hook() - which at least
+ * the process that ran pgstat_before_server_shutdown() will still call.
+ */
+ Assert(!pgStatLocal.shmem->is_shutdown);
+
+ now = GetCurrentTransactionStopTimestamp();
+
+ if (!force)
+ {
+ if (pending_since > 0 &&
+ TimestampDifferenceExceeds(pending_since, now, PGSTAT_MAX_INTERVAL))
+ {
+ /* don't keep pending updates longer than PGSTAT_MAX_INTERVAL */
+ force = true;
+ }
+ else if (last_flush > 0 &&
+ !TimestampDifferenceExceeds(last_flush, now, PGSTAT_MIN_INTERVAL))
+ {
+ /* don't flush too frequently */
+ if (pending_since == 0)
+ pending_since = now;
+
+ return PGSTAT_IDLE_INTERVAL;
+ }
+ }
+
+ pgstat_update_dbstats(now);
+
+ /* don't wait for lock acquisition when !force */
+ nowait = !force;
+
+ partial_flush = false;
+
+ /* flush database / relation / function / ... stats */
+ partial_flush |= pgstat_flush_pending_entries(nowait);
+
+ /* flush wal stats */
+ partial_flush |= pgstat_flush_wal(nowait);
+
+ /* flush SLRU stats */
+ partial_flush |= pgstat_slru_flush(nowait);
+
+ last_flush = now;
+
+ /*
+ * If some of the pending stats could not be flushed due to lock
+ * contention, let the caller know when to retry.
+ */
+ if (partial_flush)
+ {
+ /* force should have prevented us from getting here */
+ Assert(!force);
+
+ /* remember since when stats have been pending */
+ if (pending_since == 0)
+ pending_since = now;
+
+ return PGSTAT_IDLE_INTERVAL;
+ }
+
+ pending_since = 0;
+
+ return 0;
+}
+
+/*
+ * Force locally pending stats to be flushed during the next
+ * pgstat_report_stat() call. This is useful for writing tests.
+ */
+void
+pgstat_force_next_flush(void)
+{
+ pgStatForceNextFlush = true;
+}
+
+/*
+ * Only for use by pgstat_reset_counters()
+ */
+static bool
+match_db_entries(PgStatShared_HashEntry *entry, Datum match_data)
+{
+ return entry->key.dboid == DatumGetObjectId(MyDatabaseId);
+}
+
+/*
+ * Reset counters for our database.
+ *
+ * Permission checking for this function is managed through the normal
+ * GRANT system.
+ */
+void
+pgstat_reset_counters(void)
+{
+ TimestampTz ts = GetCurrentTimestamp();
+
+ pgstat_reset_matching_entries(match_db_entries,
+ ObjectIdGetDatum(MyDatabaseId),
+ ts);
+}
+
+/*
+ * Reset a single variable-numbered entry.
+ *
+ * If the stats kind is within a database, also reset the database's
+ * stat_reset_timestamp.
+ *
+ * Permission checking for this function is managed through the normal
+ * GRANT system.
+ */
+void
+pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ TimestampTz ts = GetCurrentTimestamp();
+
+ /* not needed atm, and doesn't make sense with the current signature */
+ Assert(!pgstat_get_kind_info(kind)->fixed_amount);
+
+ /* reset the "single counter" */
+ pgstat_reset_entry(kind, dboid, objoid, ts);
+
+ if (!kind_info->accessed_across_databases)
+ pgstat_reset_database_timestamp(dboid, ts);
+}
+
+/*
+ * Reset stats for all entries of a kind.
+ *
+ * Permission checking for this function is managed through the normal
+ * GRANT system.
+ */
+void
+pgstat_reset_of_kind(PgStat_Kind kind)
+{
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ TimestampTz ts = GetCurrentTimestamp();
+
+ if (kind_info->fixed_amount)
+ kind_info->reset_all_cb(ts);
+ else
+ pgstat_reset_entries_of_kind(kind, ts);
+}
+
+
+/* ------------------------------------------------------------
+ * Fetching of stats
+ * ------------------------------------------------------------
+ */
+
+/*
+ * Discard any data collected in the current transaction. Any subsequent
+ * request will cause new snapshots to be read.
+ *
+ * This is also invoked during transaction commit or abort to discard
+ * the no-longer-wanted snapshot. Updates of stats_fetch_consistency can
+ * cause this routine to be called.
+ */
+void
+pgstat_clear_snapshot(void)
+{
+ pgstat_assert_is_up();
+
+ memset(&pgStatLocal.snapshot.fixed_valid, 0,
+ sizeof(pgStatLocal.snapshot.fixed_valid));
+ pgStatLocal.snapshot.stats = NULL;
+ pgStatLocal.snapshot.mode = PGSTAT_FETCH_CONSISTENCY_NONE;
+
+ /* Release memory, if any was allocated */
+ if (pgStatLocal.snapshot.context)
+ {
+ MemoryContextDelete(pgStatLocal.snapshot.context);
+
+ /* Reset variables */
+ pgStatLocal.snapshot.context = NULL;
+ }
+
+ /*
+ * Historically the backend_status.c facilities lived in this file, and
+ * were reset with the same function. For now keep it that way, and
+ * forward the reset request.
+ */
+ pgstat_clear_backend_activity_snapshot();
+
+ /* Reset this flag, as it may be possible that a cleanup was forced. */
+ force_stats_snapshot_clear = false;
+}
+
+void *
+pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ PgStat_HashKey key;
+ PgStat_EntryRef *entry_ref;
+ void *stats_data;
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ /* should be called from backends */
+ Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
+ AssertArg(!kind_info->fixed_amount);
+
+ pgstat_prep_snapshot();
+
+ key.kind = kind;
+ key.dboid = dboid;
+ key.objoid = objoid;
+
+ /* if we need to build a full snapshot, do so */
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT)
+ pgstat_build_snapshot();
+
+ /* if caching is desired, look up in cache */
+ if (pgstat_fetch_consistency > PGSTAT_FETCH_CONSISTENCY_NONE)
+ {
+ PgStat_SnapshotEntry *entry = NULL;
+
+ entry = pgstat_snapshot_lookup(pgStatLocal.snapshot.stats, key);
+
+ if (entry)
+ return entry->data;
+
+ /*
+ * If we built a full snapshot and the key is not in
+ * pgStatLocal.snapshot.stats, there are no matching stats.
+ */
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT)
+ return NULL;
+ }
+
+ pgStatLocal.snapshot.mode = pgstat_fetch_consistency;
+
+ entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL);
+
+ if (entry_ref == NULL || entry_ref->shared_entry->dropped)
+ {
+ /* create empty entry when using PGSTAT_FETCH_CONSISTENCY_CACHE */
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_CACHE)
+ {
+ PgStat_SnapshotEntry *entry = NULL;
+ bool found;
+
+ entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, key, &found);
+ Assert(!found);
+ entry->data = NULL;
+ }
+ return NULL;
+ }
+
+ /*
+ * Allocate in caller's context for PGSTAT_FETCH_CONSISTENCY_NONE,
+ * otherwise we could quickly end up with a fair bit of memory used due to
+ * repeated accesses.
+ */
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE)
+ stats_data = palloc(kind_info->shared_data_len);
+ else
+ stats_data = MemoryContextAlloc(pgStatLocal.snapshot.context,
+ kind_info->shared_data_len);
+
+ pgstat_lock_entry_shared(entry_ref, false);
+ memcpy(stats_data,
+ pgstat_get_entry_data(kind, entry_ref->shared_stats),
+ kind_info->shared_data_len);
+ pgstat_unlock_entry(entry_ref);
+
+ if (pgstat_fetch_consistency > PGSTAT_FETCH_CONSISTENCY_NONE)
+ {
+ PgStat_SnapshotEntry *entry = NULL;
+ bool found;
+
+ entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, key, &found);
+ entry->data = stats_data;
+ }
+
+ return stats_data;
+}
+
+/*
+ * If a stats snapshot has been taken, return the timestamp at which that was
+ * done, and set *have_snapshot to true. Otherwise *have_snapshot is set to
+ * false.
+ */
+TimestampTz
+pgstat_get_stat_snapshot_timestamp(bool *have_snapshot)
+{
+ if (force_stats_snapshot_clear)
+ pgstat_clear_snapshot();
+
+ if (pgStatLocal.snapshot.mode == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT)
+ {
+ *have_snapshot = true;
+ return pgStatLocal.snapshot.snapshot_timestamp;
+ }
+
+ *have_snapshot = false;
+
+ return 0;
+}
+
+bool
+pgstat_have_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ /* fixed-numbered stats always exist */
+ if (pgstat_get_kind_info(kind)->fixed_amount)
+ return true;
+
+ return pgstat_get_entry_ref(kind, dboid, objoid, false, NULL) != NULL;
+}
+
+/*
+ * Ensure snapshot for fixed-numbered 'kind' exists.
+ *
+ * Typically used by the pgstat_fetch_* functions for a kind of stats, before
+ * massaging the data into the desired format.
+ */
+void
+pgstat_snapshot_fixed(PgStat_Kind kind)
+{
+ AssertArg(pgstat_is_kind_valid(kind));
+ AssertArg(pgstat_get_kind_info(kind)->fixed_amount);
+
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT)
+ pgstat_build_snapshot();
+ else
+ pgstat_build_snapshot_fixed(kind);
+
+ Assert(pgStatLocal.snapshot.fixed_valid[kind]);
+}
+
+static void
+pgstat_prep_snapshot(void)
+{
+ if (force_stats_snapshot_clear)
+ pgstat_clear_snapshot();
+
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE ||
+ pgStatLocal.snapshot.stats != NULL)
+ return;
+
+ if (!pgStatLocal.snapshot.context)
+ pgStatLocal.snapshot.context = AllocSetContextCreate(TopMemoryContext,
+ "PgStat Snapshot",
+ ALLOCSET_SMALL_SIZES);
+
+ pgStatLocal.snapshot.stats =
+ pgstat_snapshot_create(pgStatLocal.snapshot.context,
+ PGSTAT_SNAPSHOT_HASH_SIZE,
+ NULL);
+}
+
+static void
+pgstat_build_snapshot(void)
+{
+ dshash_seq_status hstat;
+ PgStatShared_HashEntry *p;
+
+ /* should only be called when we need a snapshot */
+ Assert(pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT);
+
+ /* snapshot already built */
+ if (pgStatLocal.snapshot.mode == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT)
+ return;
+
+ pgstat_prep_snapshot();
+
+ Assert(pgStatLocal.snapshot.stats->members == 0);
+
+ pgStatLocal.snapshot.snapshot_timestamp = GetCurrentTimestamp();
+
+ /*
+ * Snapshot all variable stats.
+ */
+ dshash_seq_init(&hstat, pgStatLocal.shared_hash, false);
+ while ((p = dshash_seq_next(&hstat)) != NULL)
+ {
+ PgStat_Kind kind = p->key.kind;
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ bool found;
+ PgStat_SnapshotEntry *entry;
+ PgStatShared_Common *stats_data;
+
+ /*
+ * Check if the stats object should be included in the snapshot.
+ * Unless the stats kind can be accessed from all databases (e.g.,
+ * database stats themselves), we only include stats for the current
+ * database or objects not associated with a database (e.g. shared
+ * relations).
+ */
+ if (p->key.dboid != MyDatabaseId &&
+ p->key.dboid != InvalidOid &&
+ !kind_info->accessed_across_databases)
+ continue;
+
+ if (p->dropped)
+ continue;
+
+ Assert(pg_atomic_read_u32(&p->refcount) > 0);
+
+ stats_data = dsa_get_address(pgStatLocal.dsa, p->body);
+ Assert(stats_data);
+
+ entry = pgstat_snapshot_insert(pgStatLocal.snapshot.stats, p->key, &found);
+ Assert(!found);
+
+ entry->data = MemoryContextAlloc(pgStatLocal.snapshot.context,
+ kind_info->shared_size);
+ /*
+ * Acquire the LWLock directly instead of using
+ * pg_stat_lock_entry_shared() which requires a reference.
+ */
+ LWLockAcquire(&stats_data->lock, LW_SHARED);
+ memcpy(entry->data,
+ pgstat_get_entry_data(kind, stats_data),
+ kind_info->shared_size);
+ LWLockRelease(&stats_data->lock);
+ }
+ dshash_seq_term(&hstat);
+
+ /*
+ * Build snapshot of all fixed-numbered stats.
+ */
+ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+ {
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ if (!kind_info->fixed_amount)
+ {
+ Assert(kind_info->snapshot_cb == NULL);
+ continue;
+ }
+
+ pgstat_build_snapshot_fixed(kind);
+ }
+
+ pgStatLocal.snapshot.mode = PGSTAT_FETCH_CONSISTENCY_SNAPSHOT;
+}
+
+static void
+pgstat_build_snapshot_fixed(PgStat_Kind kind)
+{
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ Assert(kind_info->fixed_amount);
+ Assert(kind_info->snapshot_cb != NULL);
+
+ if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_NONE)
+ {
+ /* rebuild every time */
+ pgStatLocal.snapshot.fixed_valid[kind] = false;
+ }
+ else if (pgStatLocal.snapshot.fixed_valid[kind])
+ {
+ /* in snapshot mode we shouldn't get called again */
+ Assert(pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_CACHE);
+ return;
+ }
+
+ Assert(!pgStatLocal.snapshot.fixed_valid[kind]);
+
+ kind_info->snapshot_cb();
+
+ Assert(!pgStatLocal.snapshot.fixed_valid[kind]);
+ pgStatLocal.snapshot.fixed_valid[kind] = true;
+}
+
+
+/* ------------------------------------------------------------
+ * Backend-local pending stats infrastructure
+ * ------------------------------------------------------------
+ */
+
+/*
+ * Returns the appropriate PgStat_EntryRef, preparing it to receive pending
+ * stats if not already done.
+ *
+ * If created_entry is non-NULL, it'll be set to true if the entry is newly
+ * created, false otherwise.
+ */
+PgStat_EntryRef *
+pgstat_prep_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid, bool *created_entry)
+{
+ PgStat_EntryRef *entry_ref;
+
+ /* need to be able to flush out */
+ Assert(pgstat_get_kind_info(kind)->flush_pending_cb != NULL);
+
+ if (unlikely(!pgStatPendingContext))
+ {
+ pgStatPendingContext =
+ AllocSetContextCreate(TopMemoryContext,
+ "PgStat Pending",
+ ALLOCSET_SMALL_SIZES);
+ }
+
+ entry_ref = pgstat_get_entry_ref(kind, dboid, objoid,
+ true, created_entry);
+
+ if (entry_ref->pending == NULL)
+ {
+ size_t entrysize = pgstat_get_kind_info(kind)->pending_size;
+
+ Assert(entrysize != (size_t) -1);
+
+ entry_ref->pending = MemoryContextAllocZero(pgStatPendingContext, entrysize);
+ dlist_push_tail(&pgStatPending, &entry_ref->pending_node);
+ }
+
+ return entry_ref;
+}
+
+/*
+ * Return an existing stats entry, or NULL.
+ *
+ * This should only be used for helper function for pgstatfuncs.c - outside of
+ * that it shouldn't be needed.
+ */
+PgStat_EntryRef *
+pgstat_fetch_pending_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ PgStat_EntryRef *entry_ref;
+
+ entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL);
+
+ if (entry_ref == NULL || entry_ref->pending == NULL)
+ return NULL;
+
+ return entry_ref;
+}
+
+void
+pgstat_delete_pending_entry(PgStat_EntryRef *entry_ref)
+{
+ PgStat_Kind kind = entry_ref->shared_entry->key.kind;
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ void *pending_data = entry_ref->pending;
+
+ Assert(pending_data != NULL);
+ /* !fixed_amount stats should be handled explicitly */
+ Assert(!pgstat_get_kind_info(kind)->fixed_amount);
+
+ if (kind_info->delete_pending_cb)
+ kind_info->delete_pending_cb(entry_ref);
+
+ pfree(pending_data);
+ entry_ref->pending = NULL;
+
+ dlist_delete(&entry_ref->pending_node);
+}
+
+/*
+ * Flush out pending stats for database objects (databases, relations,
+ * functions).
+ */
+static bool
+pgstat_flush_pending_entries(bool nowait)
+{
+ bool have_pending = false;
+ dlist_node *cur = NULL;
+
+ /*
+ * Need to be a bit careful iterating over the list of pending entries.
+ * Processing a pending entry may queue further pending entries to the end
+ * of the list that we want to process, so a simple iteration won't do.
+ * Further complicating matters is that we want to delete the current
+ * entry in each iteration from the list if we flushed successfully.
+ *
+ * So we just keep track of the next pointer in each loop iteration.
+ */
+ if (!dlist_is_empty(&pgStatPending))
+ cur = dlist_head_node(&pgStatPending);
+
+ while (cur)
+ {
+ PgStat_EntryRef *entry_ref =
+ dlist_container(PgStat_EntryRef, pending_node, cur);
+ PgStat_HashKey key = entry_ref->shared_entry->key;
+ PgStat_Kind kind = key.kind;
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ bool did_flush;
+ dlist_node *next;
+
+ Assert(!kind_info->fixed_amount);
+ Assert(kind_info->flush_pending_cb != NULL);
+
+ /* flush the stats, if possible */
+ did_flush = kind_info->flush_pending_cb(entry_ref, nowait);
+
+ Assert(did_flush || nowait);
+
+ /* determine next entry, before deleting the pending entry */
+ if (dlist_has_next(&pgStatPending, cur))
+ next = dlist_next_node(&pgStatPending, cur);
+ else
+ next = NULL;
+
+ /* if successfully flushed, remove entry */
+ if (did_flush)
+ pgstat_delete_pending_entry(entry_ref);
+ else
+ have_pending = true;
+
+ cur = next;
+ }
+
+ Assert(dlist_is_empty(&pgStatPending) == !have_pending);
+
+ return have_pending;
+}
+
+
+/* ------------------------------------------------------------
+ * Helper / infrastructure functions
+ * ------------------------------------------------------------
+ */
+
+PgStat_Kind
+pgstat_get_kind_from_str(char *kind_str)
+{
+ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+ {
+ if (pg_strcasecmp(kind_str, pgstat_kind_infos[kind].name) == 0)
+ return kind;
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid statistics kind: \"%s\"", kind_str)));
+ return PGSTAT_KIND_DATABASE; /* avoid compiler warnings */
+}
+
+static inline bool
+pgstat_is_kind_valid(int ikind)
+{
+ return ikind >= PGSTAT_KIND_FIRST_VALID && ikind <= PGSTAT_KIND_LAST;
+}
+
+const PgStat_KindInfo *
+pgstat_get_kind_info(PgStat_Kind kind)
+{
+ AssertArg(pgstat_is_kind_valid(kind));
+
+ return &pgstat_kind_infos[kind];
+}
+
+/*
+ * Stats should only be reported after pgstat_initialize() and before
+ * pgstat_shutdown(). This check is put in a few central places to catch
+ * violations of this rule more easily.
+ */
+#ifdef USE_ASSERT_CHECKING
+void
+pgstat_assert_is_up(void)
+{
+ Assert(pgstat_is_initialized && !pgstat_is_shutdown);
+}
+#endif
+
+
+/* ------------------------------------------------------------
+ * reading and writing of on-disk stats file
+ * ------------------------------------------------------------
+ */
+
+/* helpers for pgstat_write_statsfile() */
+static void
+write_chunk(FILE *fpout, void *ptr, size_t len)
+{
+ int rc;
+
+ rc = fwrite(ptr, len, 1, fpout);
+
+ /* we'll check for errors with ferror once at the end */
+ (void) rc;
+}
+
+#define write_chunk_s(fpout, ptr) write_chunk(fpout, ptr, sizeof(*ptr))
+
+/*
+ * This function is called in the last process that is accessing the shared
+ * stats so locking is not required.
+ */
+static void
+pgstat_write_statsfile(void)
+{
+ FILE *fpout;
+ int32 format_id;
+ const char *tmpfile = PGSTAT_STAT_PERMANENT_TMPFILE;
+ const char *statfile = PGSTAT_STAT_PERMANENT_FILENAME;
+ dshash_seq_status hstat;
+ PgStatShared_HashEntry *ps;
+
+ pgstat_assert_is_up();
+
+ /* we're shutting down, so it's ok to just override this */
+ pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_NONE;
+
+ elog(DEBUG2, "writing stats file \"%s\"", statfile);
+
+ /*
+ * Open the statistics temp file to write out the current values.
+ */
+ fpout = AllocateFile(tmpfile, PG_BINARY_W);
+ if (fpout == NULL)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not open temporary statistics file \"%s\": %m",
+ tmpfile)));
+ return;
+ }
+
+ /*
+ * Write the file header --- currently just a format ID.
+ */
+ format_id = PGSTAT_FILE_FORMAT_ID;
+ write_chunk_s(fpout, &format_id);
+
+ /*
+ * XXX: The following could now be generalized to just iterate over
+ * pgstat_kind_infos instead of knowing about the different kinds of
+ * stats.
+ */
+
+ /*
+ * Write archiver stats struct
+ */
+ pgstat_build_snapshot_fixed(PGSTAT_KIND_ARCHIVER);
+ write_chunk_s(fpout, &pgStatLocal.snapshot.archiver);
+
+ /*
+ * Write bgwriter stats struct
+ */
+ pgstat_build_snapshot_fixed(PGSTAT_KIND_BGWRITER);
+ write_chunk_s(fpout, &pgStatLocal.snapshot.bgwriter);
+
+ /*
+ * Write checkpointer stats struct
+ */
+ pgstat_build_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER);
+ write_chunk_s(fpout, &pgStatLocal.snapshot.checkpointer);
+
+ /*
+ * Write SLRU stats struct
+ */
+ pgstat_build_snapshot_fixed(PGSTAT_KIND_SLRU);
+ write_chunk_s(fpout, &pgStatLocal.snapshot.slru);
+
+ /*
+ * Write WAL stats struct
+ */
+ pgstat_build_snapshot_fixed(PGSTAT_KIND_WAL);
+ write_chunk_s(fpout, &pgStatLocal.snapshot.wal);
+
+ /*
+ * Walk through the stats entries
+ */
+ dshash_seq_init(&hstat, pgStatLocal.shared_hash, false);
+ while ((ps = dshash_seq_next(&hstat)) != NULL)
+ {
+ PgStatShared_Common *shstats;
+ const PgStat_KindInfo *kind_info = NULL;
+
+ CHECK_FOR_INTERRUPTS();
+
+ /* we may have some "dropped" entries not yet removed, skip them */
+ Assert(!ps->dropped);
+ if (ps->dropped)
+ continue;
+
+ shstats = (PgStatShared_Common *) dsa_get_address(pgStatLocal.dsa, ps->body);
+
+ kind_info = pgstat_get_kind_info(ps->key.kind);
+
+ /* if not dropped the valid-entry refcount should exist */
+ Assert(pg_atomic_read_u32(&ps->refcount) > 0);
+
+ if (!kind_info->to_serialized_name)
+ {
+ /* normal stats entry, identified by PgStat_HashKey */
+ fputc('S', fpout);
+ write_chunk_s(fpout, &ps->key);
+ }
+ else
+ {
+ /* stats entry identified by name on disk (e.g. slots) */
+ NameData name;
+
+ kind_info->to_serialized_name(&ps->key, shstats, &name);
+
+ fputc('N', fpout);
+ write_chunk_s(fpout, &ps->key.kind);
+ write_chunk_s(fpout, &name);
+ }
+
+ /* Write except the header part of the entry */
+ write_chunk(fpout,
+ pgstat_get_entry_data(ps->key.kind, shstats),
+ pgstat_get_entry_len(ps->key.kind));
+ }
+ dshash_seq_term(&hstat);
+
+ /*
+ * No more output to be done. Close the temp file and replace the old
+ * pgstat.stat with it. The ferror() check replaces testing for error
+ * after each individual fputc or fwrite (in write_chunk()) above.
+ */
+ fputc('E', fpout);
+
+ if (ferror(fpout))
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not write temporary statistics file \"%s\": %m",
+ tmpfile)));
+ FreeFile(fpout);
+ unlink(tmpfile);
+ }
+ else if (FreeFile(fpout) < 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not close temporary statistics file \"%s\": %m",
+ tmpfile)));
+ unlink(tmpfile);
+ }
+ else if (rename(tmpfile, statfile) < 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not rename temporary statistics file \"%s\" to \"%s\": %m",
+ tmpfile, statfile)));
+ unlink(tmpfile);
+ }
+}
+
+/* helpers for pgstat_read_statsfile() */
+static bool
+read_chunk(FILE *fpin, void *ptr, size_t len)
+{
+ return fread(ptr, 1, len, fpin) == len;
+}
+
+#define read_chunk_s(fpin, ptr) read_chunk(fpin, ptr, sizeof(*ptr))
+
+/*
+ * Reads in existing statistics file into the shared stats hash.
+ *
+ * This function is called in the only process that is accessing the shared
+ * stats so locking is not required.
+ */
+static void
+pgstat_read_statsfile(void)
+{
+ FILE *fpin;
+ int32 format_id;
+ bool found;
+ const char *statfile = PGSTAT_STAT_PERMANENT_FILENAME;
+ PgStat_ShmemControl *shmem = pgStatLocal.shmem;
+
+ /* shouldn't be called from postmaster */
+ Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
+
+ elog(DEBUG2, "reading stats file \"%s\"", statfile);
+
+ /*
+ * Try to open the stats file. If it doesn't exist, the backends simply
+ * returns zero for anything and statistics simply starts from scratch
+ * with empty counters.
+ *
+ * ENOENT is a possibility if stats collection was previously disabled or
+ * has not yet written the stats file for the first time. Any other
+ * failure condition is suspicious.
+ */
+ if ((fpin = AllocateFile(statfile, PG_BINARY_R)) == NULL)
+ {
+ if (errno != ENOENT)
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not open statistics file \"%s\": %m",
+ statfile)));
+ pgstat_reset_after_failure();
+ return;
+ }
+
+ /*
+ * Verify it's of the expected format.
+ */
+ if (!read_chunk_s(fpin, &format_id) ||
+ format_id != PGSTAT_FILE_FORMAT_ID)
+ goto error;
+
+ /*
+ * XXX: The following could now be generalized to just iterate over
+ * pgstat_kind_infos instead of knowing about the different kinds of
+ * stats.
+ */
+
+ /*
+ * Read archiver stats struct
+ */
+ if (!read_chunk_s(fpin, &shmem->archiver.stats))
+ goto error;
+
+ /*
+ * Read bgwriter stats struct
+ */
+ if (!read_chunk_s(fpin, &shmem->bgwriter.stats))
+ goto error;
+
+ /*
+ * Read checkpointer stats struct
+ */
+ if (!read_chunk_s(fpin, &shmem->checkpointer.stats))
+ goto error;
+
+ /*
+ * Read SLRU stats struct
+ */
+ if (!read_chunk_s(fpin, &shmem->slru.stats))
+ goto error;
+
+ /*
+ * Read WAL stats struct
+ */
+ if (!read_chunk_s(fpin, &shmem->wal.stats))
+ goto error;
+
+ /*
+ * We found an existing statistics file. Read it and put all the hash
+ * table entries into place.
+ */
+ for (;;)
+ {
+ int t = fgetc(fpin);
+
+ switch (t)
+ {
+ case 'S':
+ case 'N':
+ {
+ PgStat_HashKey key;
+ PgStatShared_HashEntry *p;
+ PgStatShared_Common *header;
+
+ CHECK_FOR_INTERRUPTS();
+
+ if (t == 'S')
+ {
+ /* normal stats entry, identified by PgStat_HashKey */
+ if (!read_chunk_s(fpin, &key))
+ goto error;
+
+ if (!pgstat_is_kind_valid(key.kind))
+ goto error;
+ }
+ else
+ {
+ /* stats entry identified by name on disk (e.g. slots) */
+ const PgStat_KindInfo *kind_info = NULL;
+ PgStat_Kind kind;
+ NameData name;
+
+ if (!read_chunk_s(fpin, &kind))
+ goto error;
+ if (!read_chunk_s(fpin, &name))
+ goto error;
+ if (!pgstat_is_kind_valid(kind))
+ goto error;
+
+ kind_info = pgstat_get_kind_info(kind);
+
+ if (!kind_info->from_serialized_name)
+ goto error;
+
+ if (!kind_info->from_serialized_name(&name, &key))
+ {
+ /* skip over data for entry we don't care about */
+ if (fseek(fpin, pgstat_get_entry_len(kind), SEEK_CUR) != 0)
+ goto error;
+
+ continue;
+ }
+
+ Assert(key.kind == kind);
+ }
+
+ /*
+ * This intentionally doesn't use pgstat_get_entry_ref() -
+ * putting all stats into checkpointer's
+ * pgStatEntryRefHash would be wasted effort and memory.
+ */
+ p = dshash_find_or_insert(pgStatLocal.shared_hash, &key, &found);
+
+ /* don't allow duplicate entries */
+ if (found)
+ {
+ dshash_release_lock(pgStatLocal.shared_hash, p);
+ elog(WARNING, "found duplicate stats entry %d/%u/%u",
+ key.kind, key.dboid, key.objoid);
+ goto error;
+ }
+
+ header = pgstat_init_entry(key.kind, p);
+ dshash_release_lock(pgStatLocal.shared_hash, p);
+
+ if (!read_chunk(fpin,
+ pgstat_get_entry_data(key.kind, header),
+ pgstat_get_entry_len(key.kind)))
+ goto error;
+
+ break;
+ }
+ case 'E':
+ /* check that 'E' actually signals end of file */
+ if (fgetc(fpin) != EOF)
+ goto error;
+
+ goto done;
+
+ default:
+ goto error;
+ }
+ }
+
+done:
+ FreeFile(fpin);
+
+ elog(DEBUG2, "removing permanent stats file \"%s\"", statfile);
+ unlink(statfile);
+
+ return;
+
+error:
+ ereport(LOG,
+ (errmsg("corrupted statistics file \"%s\"", statfile)));
+
+ pgstat_reset_after_failure();
+
+ goto done;
+}
+
+/*
+ * Helper to reset / drop stats after a crash or after restoring stats from
+ * disk failed, potentially after already loading parts.
+ */
+static void
+pgstat_reset_after_failure(void)
+{
+ TimestampTz ts = GetCurrentTimestamp();
+
+ /* reset fixed-numbered stats */
+ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+ {
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ if (!kind_info->fixed_amount)
+ continue;
+
+ kind_info->reset_all_cb(ts);
+ }
+
+ /* and drop variable-numbered ones */
+ pgstat_drop_all_entries();
+}
+
+/*
+ * GUC assign_hook for stats_fetch_consistency.
+ */
+void
+assign_stats_fetch_consistency(int newval, void *extra)
+{
+ /*
+ * Changing this value in a transaction may cause snapshot state
+ * inconsistencies, so force a clear of the current snapshot on the next
+ * snapshot build attempt.
+ */
+ if (pgstat_fetch_consistency != newval)
+ force_stats_snapshot_clear = true;
+}
diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c
new file mode 100644
index 0000000..851726f
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_archiver.c
@@ -0,0 +1,111 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_archiver.c
+ * Implementation of archiver statistics.
+ *
+ * This file contains the implementation of archiver statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_archiver.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+#include "utils/timestamp.h"
+
+
+/*
+ * Report archiver statistics
+ */
+void
+pgstat_report_archiver(const char *xlog, bool failed)
+{
+ PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver;
+ TimestampTz now = GetCurrentTimestamp();
+
+ pgstat_begin_changecount_write(&stats_shmem->changecount);
+
+ if (failed)
+ {
+ ++stats_shmem->stats.failed_count;
+ memcpy(&stats_shmem->stats.last_failed_wal, xlog,
+ sizeof(stats_shmem->stats.last_failed_wal));
+ stats_shmem->stats.last_failed_timestamp = now;
+ }
+ else
+ {
+ ++stats_shmem->stats.archived_count;
+ memcpy(&stats_shmem->stats.last_archived_wal, xlog,
+ sizeof(stats_shmem->stats.last_archived_wal));
+ stats_shmem->stats.last_archived_timestamp = now;
+ }
+
+ pgstat_end_changecount_write(&stats_shmem->changecount);
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the archiver statistics struct.
+ */
+PgStat_ArchiverStats *
+pgstat_fetch_stat_archiver(void)
+{
+ pgstat_snapshot_fixed(PGSTAT_KIND_ARCHIVER);
+
+ return &pgStatLocal.snapshot.archiver;
+}
+
+void
+pgstat_archiver_reset_all_cb(TimestampTz ts)
+{
+ PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver;
+
+ /* see explanation above PgStatShared_Archiver for the reset protocol */
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ pgstat_copy_changecounted_stats(&stats_shmem->reset_offset,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+ stats_shmem->stats.stat_reset_timestamp = ts;
+ LWLockRelease(&stats_shmem->lock);
+}
+
+void
+pgstat_archiver_snapshot_cb(void)
+{
+ PgStatShared_Archiver *stats_shmem = &pgStatLocal.shmem->archiver;
+ PgStat_ArchiverStats *stat_snap = &pgStatLocal.snapshot.archiver;
+ PgStat_ArchiverStats *reset_offset = &stats_shmem->reset_offset;
+ PgStat_ArchiverStats reset;
+
+ pgstat_copy_changecounted_stats(stat_snap,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+
+ LWLockAcquire(&stats_shmem->lock, LW_SHARED);
+ memcpy(&reset, reset_offset, sizeof(stats_shmem->stats));
+ LWLockRelease(&stats_shmem->lock);
+
+ /* compensate by reset offsets */
+ if (stat_snap->archived_count == reset.archived_count)
+ {
+ stat_snap->last_archived_wal[0] = 0;
+ stat_snap->last_archived_timestamp = 0;
+ }
+ stat_snap->archived_count -= reset.archived_count;
+
+ if (stat_snap->failed_count == reset.failed_count)
+ {
+ stat_snap->last_failed_wal[0] = 0;
+ stat_snap->last_failed_timestamp = 0;
+ }
+ stat_snap->failed_count -= reset.failed_count;
+}
diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c
new file mode 100644
index 0000000..fbb1edc
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_bgwriter.c
@@ -0,0 +1,110 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_bgwriter.c
+ * Implementation of bgwriter statistics.
+ *
+ * This file contains the implementation of bgwriter statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_bgwriter.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+
+
+PgStat_BgWriterStats PendingBgWriterStats = {0};
+
+
+/*
+ * Report bgwriter statistics
+ */
+void
+pgstat_report_bgwriter(void)
+{
+ PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter;
+ static const PgStat_BgWriterStats all_zeroes;
+
+ Assert(!pgStatLocal.shmem->is_shutdown);
+ pgstat_assert_is_up();
+
+ /*
+ * This function can be called even if nothing at all has happened. In
+ * this case, avoid unnecessarily modifying the stats entry.
+ */
+ if (memcmp(&PendingBgWriterStats, &all_zeroes, sizeof(all_zeroes)) == 0)
+ return;
+
+ pgstat_begin_changecount_write(&stats_shmem->changecount);
+
+#define BGWRITER_ACC(fld) stats_shmem->stats.fld += PendingBgWriterStats.fld
+ BGWRITER_ACC(buf_written_clean);
+ BGWRITER_ACC(maxwritten_clean);
+ BGWRITER_ACC(buf_alloc);
+#undef BGWRITER_ACC
+
+ pgstat_end_changecount_write(&stats_shmem->changecount);
+
+ /*
+ * Clear out the statistics buffer, so it can be re-used.
+ */
+ MemSet(&PendingBgWriterStats, 0, sizeof(PendingBgWriterStats));
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the bgwriter statistics struct.
+ */
+PgStat_BgWriterStats *
+pgstat_fetch_stat_bgwriter(void)
+{
+ pgstat_snapshot_fixed(PGSTAT_KIND_BGWRITER);
+
+ return &pgStatLocal.snapshot.bgwriter;
+}
+
+void
+pgstat_bgwriter_reset_all_cb(TimestampTz ts)
+{
+ PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter;
+
+ /* see explanation above PgStatShared_BgWriter for the reset protocol */
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ pgstat_copy_changecounted_stats(&stats_shmem->reset_offset,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+ stats_shmem->stats.stat_reset_timestamp = ts;
+ LWLockRelease(&stats_shmem->lock);
+}
+
+void
+pgstat_bgwriter_snapshot_cb(void)
+{
+ PgStatShared_BgWriter *stats_shmem = &pgStatLocal.shmem->bgwriter;
+ PgStat_BgWriterStats *reset_offset = &stats_shmem->reset_offset;
+ PgStat_BgWriterStats reset;
+
+ pgstat_copy_changecounted_stats(&pgStatLocal.snapshot.bgwriter,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+
+ LWLockAcquire(&stats_shmem->lock, LW_SHARED);
+ memcpy(&reset, reset_offset, sizeof(stats_shmem->stats));
+ LWLockRelease(&stats_shmem->lock);
+
+ /* compensate by reset offsets */
+#define BGWRITER_COMP(fld) pgStatLocal.snapshot.bgwriter.fld -= reset.fld;
+ BGWRITER_COMP(buf_written_clean);
+ BGWRITER_COMP(maxwritten_clean);
+ BGWRITER_COMP(buf_alloc);
+#undef BGWRITER_COMP
+}
diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c
new file mode 100644
index 0000000..af8d513
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_checkpointer.c
@@ -0,0 +1,121 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_checkpointer.c
+ * Implementation of checkpoint statistics.
+ *
+ * This file contains the implementation of checkpoint statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_checkpointer.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+
+
+PgStat_CheckpointerStats PendingCheckpointerStats = {0};
+
+
+/*
+ * Report checkpointer statistics
+ */
+void
+pgstat_report_checkpointer(void)
+{
+ /* We assume this initializes to zeroes */
+ static const PgStat_CheckpointerStats all_zeroes;
+ PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
+
+ Assert(!pgStatLocal.shmem->is_shutdown);
+ pgstat_assert_is_up();
+
+ /*
+ * This function can be called even if nothing at all has happened. In
+ * this case, avoid unnecessarily modifying the stats entry.
+ */
+ if (memcmp(&PendingCheckpointerStats, &all_zeroes,
+ sizeof(all_zeroes)) == 0)
+ return;
+
+ pgstat_begin_changecount_write(&stats_shmem->changecount);
+
+#define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld
+ CHECKPOINTER_ACC(timed_checkpoints);
+ CHECKPOINTER_ACC(requested_checkpoints);
+ CHECKPOINTER_ACC(checkpoint_write_time);
+ CHECKPOINTER_ACC(checkpoint_sync_time);
+ CHECKPOINTER_ACC(buf_written_checkpoints);
+ CHECKPOINTER_ACC(buf_written_backend);
+ CHECKPOINTER_ACC(buf_fsync_backend);
+#undef CHECKPOINTER_ACC
+
+ pgstat_end_changecount_write(&stats_shmem->changecount);
+
+ /*
+ * Clear out the statistics buffer, so it can be re-used.
+ */
+ MemSet(&PendingCheckpointerStats, 0, sizeof(PendingCheckpointerStats));
+}
+
+/*
+ * pgstat_fetch_stat_checkpointer() -
+ *
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the checkpointer statistics struct.
+ */
+PgStat_CheckpointerStats *
+pgstat_fetch_stat_checkpointer(void)
+{
+ pgstat_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER);
+
+ return &pgStatLocal.snapshot.checkpointer;
+}
+
+void
+pgstat_checkpointer_reset_all_cb(TimestampTz ts)
+{
+ PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
+
+ /* see explanation above PgStatShared_Checkpointer for the reset protocol */
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ pgstat_copy_changecounted_stats(&stats_shmem->reset_offset,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+ LWLockRelease(&stats_shmem->lock);
+}
+
+void
+pgstat_checkpointer_snapshot_cb(void)
+{
+ PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
+ PgStat_CheckpointerStats *reset_offset = &stats_shmem->reset_offset;
+ PgStat_CheckpointerStats reset;
+
+ pgstat_copy_changecounted_stats(&pgStatLocal.snapshot.checkpointer,
+ &stats_shmem->stats,
+ sizeof(stats_shmem->stats),
+ &stats_shmem->changecount);
+
+ LWLockAcquire(&stats_shmem->lock, LW_SHARED);
+ memcpy(&reset, reset_offset, sizeof(stats_shmem->stats));
+ LWLockRelease(&stats_shmem->lock);
+
+ /* compensate by reset offsets */
+#define CHECKPOINTER_COMP(fld) pgStatLocal.snapshot.checkpointer.fld -= reset.fld;
+ CHECKPOINTER_COMP(timed_checkpoints);
+ CHECKPOINTER_COMP(requested_checkpoints);
+ CHECKPOINTER_COMP(checkpoint_write_time);
+ CHECKPOINTER_COMP(checkpoint_sync_time);
+ CHECKPOINTER_COMP(buf_written_checkpoints);
+ CHECKPOINTER_COMP(buf_written_backend);
+ CHECKPOINTER_COMP(buf_fsync_backend);
+#undef CHECKPOINTER_COMP
+}
diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c
new file mode 100644
index 0000000..4235fa0
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_database.c
@@ -0,0 +1,437 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_database.c
+ * Implementation of database statistics.
+ *
+ * This file contains the implementation of database statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_database.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+#include "utils/timestamp.h"
+#include "storage/procsignal.h"
+
+
+static bool pgstat_should_report_connstat(void);
+
+
+PgStat_Counter pgStatBlockReadTime = 0;
+PgStat_Counter pgStatBlockWriteTime = 0;
+PgStat_Counter pgStatActiveTime = 0;
+PgStat_Counter pgStatTransactionIdleTime = 0;
+SessionEndType pgStatSessionEndCause = DISCONNECT_NORMAL;
+
+
+static int pgStatXactCommit = 0;
+static int pgStatXactRollback = 0;
+static PgStat_Counter pgLastSessionReportTime = 0;
+
+
+/*
+ * Remove entry for the database being dropped.
+ */
+void
+pgstat_drop_database(Oid databaseid)
+{
+ pgstat_drop_transactional(PGSTAT_KIND_DATABASE, databaseid, InvalidOid);
+}
+
+/*
+ * Called from autovacuum.c to report startup of an autovacuum process.
+ * We are called before InitPostgres is done, so can't rely on MyDatabaseId;
+ * the db OID must be passed in, instead.
+ */
+void
+pgstat_report_autovac(Oid dboid)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_Database *dbentry;
+
+ /* can't get here in single user mode */
+ Assert(IsUnderPostmaster);
+
+ /*
+ * End-of-vacuum is reported instantly. Report the start the same way for
+ * consistency. Vacuum doesn't run frequently and is a long-lasting
+ * operation so it doesn't matter if we get blocked here a little.
+ */
+ entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE,
+ dboid, InvalidOid, false);
+
+ dbentry = (PgStatShared_Database *) entry_ref->shared_stats;
+ dbentry->stats.last_autovac_time = GetCurrentTimestamp();
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Report a Hot Standby recovery conflict.
+ */
+void
+pgstat_report_recovery_conflict(int reason)
+{
+ PgStat_StatDBEntry *dbentry;
+
+ Assert(IsUnderPostmaster);
+ if (!pgstat_track_counts)
+ return;
+
+ dbentry = pgstat_prep_database_pending(MyDatabaseId);
+
+ switch (reason)
+ {
+ case PROCSIG_RECOVERY_CONFLICT_DATABASE:
+
+ /*
+ * Since we drop the information about the database as soon as it
+ * replicates, there is no point in counting these conflicts.
+ */
+ break;
+ case PROCSIG_RECOVERY_CONFLICT_TABLESPACE:
+ dbentry->n_conflict_tablespace++;
+ break;
+ case PROCSIG_RECOVERY_CONFLICT_LOCK:
+ dbentry->n_conflict_lock++;
+ break;
+ case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT:
+ dbentry->n_conflict_snapshot++;
+ break;
+ case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN:
+ dbentry->n_conflict_bufferpin++;
+ break;
+ case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK:
+ dbentry->n_conflict_startup_deadlock++;
+ break;
+ }
+}
+
+/*
+ * Report a detected deadlock.
+ */
+void
+pgstat_report_deadlock(void)
+{
+ PgStat_StatDBEntry *dbent;
+
+ if (!pgstat_track_counts)
+ return;
+
+ dbent = pgstat_prep_database_pending(MyDatabaseId);
+ dbent->n_deadlocks++;
+}
+
+/*
+ * Report one or more checksum failures.
+ */
+void
+pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_Database *sharedent;
+
+ if (!pgstat_track_counts)
+ return;
+
+ /*
+ * Update the shared stats directly - checksum failures should never be
+ * common enough for that to be a problem.
+ */
+ entry_ref =
+ pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, dboid, InvalidOid, false);
+
+ sharedent = (PgStatShared_Database *) entry_ref->shared_stats;
+ sharedent->stats.n_checksum_failures += failurecount;
+ sharedent->stats.last_checksum_failure = GetCurrentTimestamp();
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Report one checksum failure in the current database.
+ */
+void
+pgstat_report_checksum_failure(void)
+{
+ pgstat_report_checksum_failures_in_db(MyDatabaseId, 1);
+}
+
+/*
+ * Report creation of temporary file.
+ */
+void
+pgstat_report_tempfile(size_t filesize)
+{
+ PgStat_StatDBEntry *dbent;
+
+ if (!pgstat_track_counts)
+ return;
+
+ dbent = pgstat_prep_database_pending(MyDatabaseId);
+ dbent->n_temp_bytes += filesize;
+ dbent->n_temp_files++;
+}
+
+/*
+ * Notify stats system of a new connection.
+ */
+void
+pgstat_report_connect(Oid dboid)
+{
+ PgStat_StatDBEntry *dbentry;
+
+ if (!pgstat_should_report_connstat())
+ return;
+
+ pgLastSessionReportTime = MyStartTimestamp;
+
+ dbentry = pgstat_prep_database_pending(MyDatabaseId);
+ dbentry->n_sessions++;
+}
+
+/*
+ * Notify the stats system of a disconnect.
+ */
+void
+pgstat_report_disconnect(Oid dboid)
+{
+ PgStat_StatDBEntry *dbentry;
+
+ if (!pgstat_should_report_connstat())
+ return;
+
+ dbentry = pgstat_prep_database_pending(MyDatabaseId);
+
+ switch (pgStatSessionEndCause)
+ {
+ case DISCONNECT_NOT_YET:
+ case DISCONNECT_NORMAL:
+ /* we don't collect these */
+ break;
+ case DISCONNECT_CLIENT_EOF:
+ dbentry->n_sessions_abandoned++;
+ break;
+ case DISCONNECT_FATAL:
+ dbentry->n_sessions_fatal++;
+ break;
+ case DISCONNECT_KILLED:
+ dbentry->n_sessions_killed++;
+ break;
+ }
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * the collected statistics for one database or NULL. NULL doesn't mean
+ * that the database doesn't exist, just that there are no statistics, so the
+ * caller is better off to report ZERO instead.
+ */
+PgStat_StatDBEntry *
+pgstat_fetch_stat_dbentry(Oid dboid)
+{
+ return (PgStat_StatDBEntry *)
+ pgstat_fetch_entry(PGSTAT_KIND_DATABASE, dboid, InvalidOid);
+}
+
+void
+AtEOXact_PgStat_Database(bool isCommit, bool parallel)
+{
+ /* Don't count parallel worker transaction stats */
+ if (!parallel)
+ {
+ /*
+ * Count transaction commit or abort. (We use counters, not just
+ * bools, in case the reporting message isn't sent right away.)
+ */
+ if (isCommit)
+ pgStatXactCommit++;
+ else
+ pgStatXactRollback++;
+ }
+}
+
+/*
+ * Subroutine for pgstat_report_stat(): Handle xact commit/rollback and I/O
+ * timings.
+ */
+void
+pgstat_update_dbstats(TimestampTz ts)
+{
+ PgStat_StatDBEntry *dbentry;
+
+ /*
+ * If not connected to a database yet, don't attribute time to "shared
+ * state" (InvalidOid is used to track stats for shared relations, etc.).
+ */
+ if (!OidIsValid(MyDatabaseId))
+ return;
+
+ dbentry = pgstat_prep_database_pending(MyDatabaseId);
+
+ /*
+ * Accumulate xact commit/rollback and I/O timings to stats entry of the
+ * current database.
+ */
+ dbentry->n_xact_commit += pgStatXactCommit;
+ dbentry->n_xact_rollback += pgStatXactRollback;
+ dbentry->n_block_read_time += pgStatBlockReadTime;
+ dbentry->n_block_write_time += pgStatBlockWriteTime;
+
+ if (pgstat_should_report_connstat())
+ {
+ long secs;
+ int usecs;
+
+ /*
+ * pgLastSessionReportTime is initialized to MyStartTimestamp by
+ * pgstat_report_connect().
+ */
+ TimestampDifference(pgLastSessionReportTime, ts, &secs, &usecs);
+ pgLastSessionReportTime = ts;
+ dbentry->total_session_time += (PgStat_Counter) secs * 1000000 + usecs;
+ dbentry->total_active_time += pgStatActiveTime;
+ dbentry->total_idle_in_xact_time += pgStatTransactionIdleTime;
+ }
+
+ pgStatXactCommit = 0;
+ pgStatXactRollback = 0;
+ pgStatBlockReadTime = 0;
+ pgStatBlockWriteTime = 0;
+ pgStatActiveTime = 0;
+ pgStatTransactionIdleTime = 0;
+}
+
+/*
+ * We report session statistics only for normal backend processes. Parallel
+ * workers run in parallel, so they don't contribute to session times, even
+ * though they use CPU time. Walsender processes could be considered here,
+ * but they have different session characteristics from normal backends (for
+ * example, they are always "active"), so they would skew session statistics.
+ */
+static bool
+pgstat_should_report_connstat(void)
+{
+ return MyBackendType == B_BACKEND;
+}
+
+/*
+ * Find or create a local PgStat_StatDBEntry entry for dboid.
+ */
+PgStat_StatDBEntry *
+pgstat_prep_database_pending(Oid dboid)
+{
+ PgStat_EntryRef *entry_ref;
+
+ /*
+ * This should not report stats on database objects before having
+ * connected to a database.
+ */
+ Assert(!OidIsValid(dboid) || OidIsValid(MyDatabaseId));
+
+ entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_DATABASE, dboid, InvalidOid,
+ NULL);
+
+ return entry_ref->pending;
+}
+
+/*
+ * Reset the database's reset timestamp, without resetting the contents of the
+ * database stats.
+ */
+void
+pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts)
+{
+ PgStat_EntryRef *dbref;
+ PgStatShared_Database *dbentry;
+
+ dbref = pgstat_get_entry_ref_locked(PGSTAT_KIND_DATABASE, MyDatabaseId, InvalidOid,
+ false);
+
+ dbentry = (PgStatShared_Database *) dbref->shared_stats;
+ dbentry->stats.stat_reset_timestamp = ts;
+
+ pgstat_unlock_entry(dbref);
+}
+
+/*
+ * Flush out pending stats for the entry
+ *
+ * If nowait is true, this function returns false if lock could not
+ * immediately acquired, otherwise true is returned.
+ */
+bool
+pgstat_database_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ PgStatShared_Database *sharedent;
+ PgStat_StatDBEntry *pendingent;
+
+ pendingent = (PgStat_StatDBEntry *) entry_ref->pending;
+ sharedent = (PgStatShared_Database *) entry_ref->shared_stats;
+
+ if (!pgstat_lock_entry(entry_ref, nowait))
+ return false;
+
+#define PGSTAT_ACCUM_DBCOUNT(item) \
+ (sharedent)->stats.item += (pendingent)->item
+
+ PGSTAT_ACCUM_DBCOUNT(n_xact_commit);
+ PGSTAT_ACCUM_DBCOUNT(n_xact_rollback);
+ PGSTAT_ACCUM_DBCOUNT(n_blocks_fetched);
+ PGSTAT_ACCUM_DBCOUNT(n_blocks_hit);
+
+ PGSTAT_ACCUM_DBCOUNT(n_tuples_returned);
+ PGSTAT_ACCUM_DBCOUNT(n_tuples_fetched);
+ PGSTAT_ACCUM_DBCOUNT(n_tuples_inserted);
+ PGSTAT_ACCUM_DBCOUNT(n_tuples_updated);
+ PGSTAT_ACCUM_DBCOUNT(n_tuples_deleted);
+
+ /* last_autovac_time is reported immediately */
+ Assert(pendingent->last_autovac_time == 0);
+
+ PGSTAT_ACCUM_DBCOUNT(n_conflict_tablespace);
+ PGSTAT_ACCUM_DBCOUNT(n_conflict_lock);
+ PGSTAT_ACCUM_DBCOUNT(n_conflict_snapshot);
+ PGSTAT_ACCUM_DBCOUNT(n_conflict_bufferpin);
+ PGSTAT_ACCUM_DBCOUNT(n_conflict_startup_deadlock);
+
+ PGSTAT_ACCUM_DBCOUNT(n_temp_bytes);
+ PGSTAT_ACCUM_DBCOUNT(n_temp_files);
+ PGSTAT_ACCUM_DBCOUNT(n_deadlocks);
+
+ /* checksum failures are reported immediately */
+ Assert(pendingent->n_checksum_failures == 0);
+ Assert(pendingent->last_checksum_failure == 0);
+
+ PGSTAT_ACCUM_DBCOUNT(n_block_read_time);
+ PGSTAT_ACCUM_DBCOUNT(n_block_write_time);
+
+ PGSTAT_ACCUM_DBCOUNT(n_sessions);
+ PGSTAT_ACCUM_DBCOUNT(total_session_time);
+ PGSTAT_ACCUM_DBCOUNT(total_active_time);
+ PGSTAT_ACCUM_DBCOUNT(total_idle_in_xact_time);
+ PGSTAT_ACCUM_DBCOUNT(n_sessions_abandoned);
+ PGSTAT_ACCUM_DBCOUNT(n_sessions_fatal);
+ PGSTAT_ACCUM_DBCOUNT(n_sessions_killed);
+#undef PGSTAT_ACCUM_DBCOUNT
+
+ pgstat_unlock_entry(entry_ref);
+
+ memset(pendingent, 0, sizeof(*pendingent));
+
+ return true;
+}
+
+void
+pgstat_database_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts)
+{
+ ((PgStatShared_Database *) header)->stats.stat_reset_timestamp = ts;
+}
diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c
new file mode 100644
index 0000000..427d8c4
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_function.c
@@ -0,0 +1,243 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_function.c
+ * Implementation of function statistics.
+ *
+ * This file contains the implementation of function statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_function.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "fmgr.h"
+#include "utils/inval.h"
+#include "utils/pgstat_internal.h"
+#include "utils/syscache.h"
+
+
+/* ----------
+ * GUC parameters
+ * ----------
+ */
+int pgstat_track_functions = TRACK_FUNC_OFF;
+
+
+/*
+ * Total time charged to functions so far in the current backend.
+ * We use this to help separate "self" and "other" time charges.
+ * (We assume this initializes to zero.)
+ */
+static instr_time total_func_time;
+
+
+/*
+ * Ensure that stats are dropped if transaction aborts.
+ */
+void
+pgstat_create_function(Oid proid)
+{
+ pgstat_create_transactional(PGSTAT_KIND_FUNCTION,
+ MyDatabaseId,
+ proid);
+}
+
+/*
+ * Ensure that stats are dropped if transaction commits.
+ *
+ * NB: This is only reliable because pgstat_init_function_usage() does some
+ * extra work. If other places start emitting function stats they likely need
+ * similar logic.
+ */
+void
+pgstat_drop_function(Oid proid)
+{
+ pgstat_drop_transactional(PGSTAT_KIND_FUNCTION,
+ MyDatabaseId,
+ proid);
+}
+
+/*
+ * Initialize function call usage data.
+ * Called by the executor before invoking a function.
+ */
+void
+pgstat_init_function_usage(FunctionCallInfo fcinfo,
+ PgStat_FunctionCallUsage *fcu)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStat_BackendFunctionEntry *pending;
+ bool created_entry;
+
+ if (pgstat_track_functions <= fcinfo->flinfo->fn_stats)
+ {
+ /* stats not wanted */
+ fcu->fs = NULL;
+ return;
+ }
+
+ entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_FUNCTION,
+ MyDatabaseId,
+ fcinfo->flinfo->fn_oid,
+ &created_entry);
+
+ /*
+ * If no shared entry already exists, check if the function has been
+ * deleted concurrently. This can go unnoticed until here because
+ * executing a statement that just calls a function, does not trigger
+ * cache invalidation processing. The reason we care about this case is
+ * that otherwise we could create a new stats entry for an already dropped
+ * function (for relations etc this is not possible because emitting stats
+ * requires a lock for the relation to already have been acquired).
+ *
+ * It's somewhat ugly to have a behavioral difference based on
+ * track_functions being enabled/disabled. But it seems acceptable, given
+ * that there's already behavioral differences depending on whether the
+ * function is the caches etc.
+ *
+ * For correctness it'd be sufficient to set ->dropped to true. However,
+ * the accepted invalidation will commonly cause "low level" failures in
+ * PL code, with an OID in the error message. Making this harder to
+ * test...
+ */
+ if (created_entry)
+ {
+ AcceptInvalidationMessages();
+ if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(fcinfo->flinfo->fn_oid)))
+ {
+ pgstat_drop_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId,
+ fcinfo->flinfo->fn_oid);
+ ereport(ERROR, errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("function call to dropped function"));
+ }
+ }
+
+ pending = entry_ref->pending;
+
+ fcu->fs = &pending->f_counts;
+
+ /* save stats for this function, later used to compensate for recursion */
+ fcu->save_f_total_time = pending->f_counts.f_total_time;
+
+ /* save current backend-wide total time */
+ fcu->save_total = total_func_time;
+
+ /* get clock time as of function start */
+ INSTR_TIME_SET_CURRENT(fcu->f_start);
+}
+
+/*
+ * Calculate function call usage and update stat counters.
+ * Called by the executor after invoking a function.
+ *
+ * In the case of a set-returning function that runs in value-per-call mode,
+ * we will see multiple pgstat_init_function_usage/pgstat_end_function_usage
+ * calls for what the user considers a single call of the function. The
+ * finalize flag should be TRUE on the last call.
+ */
+void
+pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
+{
+ PgStat_FunctionCounts *fs = fcu->fs;
+ instr_time f_total;
+ instr_time f_others;
+ instr_time f_self;
+
+ /* stats not wanted? */
+ if (fs == NULL)
+ return;
+
+ /* total elapsed time in this function call */
+ INSTR_TIME_SET_CURRENT(f_total);
+ INSTR_TIME_SUBTRACT(f_total, fcu->f_start);
+
+ /* self usage: elapsed minus anything already charged to other calls */
+ f_others = total_func_time;
+ INSTR_TIME_SUBTRACT(f_others, fcu->save_total);
+ f_self = f_total;
+ INSTR_TIME_SUBTRACT(f_self, f_others);
+
+ /* update backend-wide total time */
+ INSTR_TIME_ADD(total_func_time, f_self);
+
+ /*
+ * Compute the new f_total_time as the total elapsed time added to the
+ * pre-call value of f_total_time. This is necessary to avoid
+ * double-counting any time taken by recursive calls of myself. (We do
+ * not need any similar kluge for self time, since that already excludes
+ * any recursive calls.)
+ */
+ INSTR_TIME_ADD(f_total, fcu->save_f_total_time);
+
+ /* update counters in function stats table */
+ if (finalize)
+ fs->f_numcalls++;
+ fs->f_total_time = f_total;
+ INSTR_TIME_ADD(fs->f_self_time, f_self);
+}
+
+/*
+ * Flush out pending stats for the entry
+ *
+ * If nowait is true, this function returns false if lock could not
+ * immediately acquired, otherwise true is returned.
+ */
+bool
+pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ PgStat_BackendFunctionEntry *localent;
+ PgStatShared_Function *shfuncent;
+
+ localent = (PgStat_BackendFunctionEntry *) entry_ref->pending;
+ shfuncent = (PgStatShared_Function *) entry_ref->shared_stats;
+
+ /* localent always has non-zero content */
+
+ if (!pgstat_lock_entry(entry_ref, nowait))
+ return false;
+
+ shfuncent->stats.f_numcalls += localent->f_counts.f_numcalls;
+ shfuncent->stats.f_total_time +=
+ INSTR_TIME_GET_MICROSEC(localent->f_counts.f_total_time);
+ shfuncent->stats.f_self_time +=
+ INSTR_TIME_GET_MICROSEC(localent->f_counts.f_self_time);
+
+ pgstat_unlock_entry(entry_ref);
+
+ return true;
+}
+
+/*
+ * find any existing PgStat_BackendFunctionEntry entry for specified function
+ *
+ * If no entry, return NULL, don't create a new one
+ */
+PgStat_BackendFunctionEntry *
+find_funcstat_entry(Oid func_id)
+{
+ PgStat_EntryRef *entry_ref;
+
+ entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, func_id);
+
+ if (entry_ref)
+ return entry_ref->pending;
+ return NULL;
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * the collected statistics for one function or NULL.
+ */
+PgStat_StatFuncEntry *
+pgstat_fetch_stat_funcentry(Oid func_id)
+{
+ return (PgStat_StatFuncEntry *)
+ pgstat_fetch_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, func_id);
+}
diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c
new file mode 100644
index 0000000..a846d9f
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_relation.c
@@ -0,0 +1,938 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_relation.c
+ * Implementation of relation statistics.
+ *
+ * This file contains the implementation of function relation. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_relation.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/twophase_rmgr.h"
+#include "access/xact.h"
+#include "catalog/partition.h"
+#include "postmaster/autovacuum.h"
+#include "utils/memutils.h"
+#include "utils/pgstat_internal.h"
+#include "utils/rel.h"
+#include "utils/timestamp.h"
+
+
+/* Record that's written to 2PC state file when pgstat state is persisted */
+typedef struct TwoPhasePgStatRecord
+{
+ PgStat_Counter tuples_inserted; /* tuples inserted in xact */
+ PgStat_Counter tuples_updated; /* tuples updated in xact */
+ PgStat_Counter tuples_deleted; /* tuples deleted in xact */
+ /* tuples i/u/d prior to truncate/drop */
+ PgStat_Counter inserted_pre_truncdrop;
+ PgStat_Counter updated_pre_truncdrop;
+ PgStat_Counter deleted_pre_truncdrop;
+ Oid t_id; /* table's OID */
+ bool t_shared; /* is it a shared catalog? */
+ bool t_truncdropped; /* was the relation truncated/dropped? */
+} TwoPhasePgStatRecord;
+
+
+static PgStat_TableStatus *pgstat_prep_relation_pending(Oid rel_id, bool isshared);
+static void add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level);
+static void ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info);
+static void save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop);
+static void restore_truncdrop_counters(PgStat_TableXactStatus *trans);
+
+
+/*
+ * Copy stats between relations. This is used for things like REINDEX
+ * CONCURRENTLY.
+ */
+void
+pgstat_copy_relation_stats(Relation dst, Relation src)
+{
+ PgStat_StatTabEntry *srcstats;
+ PgStatShared_Relation *dstshstats;
+ PgStat_EntryRef *dst_ref;
+
+ srcstats = pgstat_fetch_stat_tabentry_ext(src->rd_rel->relisshared,
+ RelationGetRelid(src));
+ if (!srcstats)
+ return;
+
+ dst_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION,
+ dst->rd_rel->relisshared ? InvalidOid : MyDatabaseId,
+ RelationGetRelid(dst),
+ false);
+
+ dstshstats = (PgStatShared_Relation *) dst_ref->shared_stats;
+ dstshstats->stats = *srcstats;
+
+ pgstat_unlock_entry(dst_ref);
+}
+
+/*
+ * Initialize a relcache entry to count access statistics. Called whenever a
+ * relation is opened.
+ *
+ * We assume that a relcache entry's pgstat_info field is zeroed by relcache.c
+ * when the relcache entry is made; thereafter it is long-lived data.
+ *
+ * This does not create a reference to a stats entry in shared memory, nor
+ * allocate memory for the pending stats. That happens in
+ * pgstat_assoc_relation().
+ */
+void
+pgstat_init_relation(Relation rel)
+{
+ char relkind = rel->rd_rel->relkind;
+
+ /*
+ * We only count stats for relations with storage and partitioned tables
+ */
+ if (!RELKIND_HAS_STORAGE(relkind) && relkind != RELKIND_PARTITIONED_TABLE)
+ {
+ rel->pgstat_enabled = false;
+ rel->pgstat_info = NULL;
+ return;
+ }
+
+ if (!pgstat_track_counts)
+ {
+ if (rel->pgstat_info)
+ pgstat_unlink_relation(rel);
+
+ /* We're not counting at all */
+ rel->pgstat_enabled = false;
+ rel->pgstat_info = NULL;
+ return;
+ }
+
+ rel->pgstat_enabled = true;
+}
+
+/*
+ * Prepare for statistics for this relation to be collected.
+ *
+ * This ensures we have a reference to the stats entry before stats can be
+ * generated. That is important because a relation drop in another connection
+ * could otherwise lead to the stats entry being dropped, which then later
+ * would get recreated when flushing stats.
+ *
+ * This is separate from pgstat_init_relation() as it is not uncommon for
+ * relcache entries to be opened without ever getting stats reported.
+ */
+void
+pgstat_assoc_relation(Relation rel)
+{
+ Assert(rel->pgstat_enabled);
+ Assert(rel->pgstat_info == NULL);
+
+ /* Else find or make the PgStat_TableStatus entry, and update link */
+ rel->pgstat_info = pgstat_prep_relation_pending(RelationGetRelid(rel),
+ rel->rd_rel->relisshared);
+
+ /* don't allow link a stats to multiple relcache entries */
+ Assert(rel->pgstat_info->relation == NULL);
+
+ /* mark this relation as the owner */
+ rel->pgstat_info->relation = rel;
+}
+
+/*
+ * Break the mutual link between a relcache entry and pending stats entry.
+ * This must be called whenever one end of the link is removed.
+ */
+void
+pgstat_unlink_relation(Relation rel)
+{
+ /* remove the link to stats info if any */
+ if (rel->pgstat_info == NULL)
+ return;
+
+ /* link sanity check */
+ Assert(rel->pgstat_info->relation == rel);
+ rel->pgstat_info->relation = NULL;
+ rel->pgstat_info = NULL;
+}
+
+/*
+ * Ensure that stats are dropped if transaction aborts.
+ */
+void
+pgstat_create_relation(Relation rel)
+{
+ pgstat_create_transactional(PGSTAT_KIND_RELATION,
+ rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId,
+ RelationGetRelid(rel));
+}
+
+/*
+ * Ensure that stats are dropped if transaction commits.
+ */
+void
+pgstat_drop_relation(Relation rel)
+{
+ int nest_level = GetCurrentTransactionNestLevel();
+ PgStat_TableStatus *pgstat_info;
+
+ pgstat_drop_transactional(PGSTAT_KIND_RELATION,
+ rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId,
+ RelationGetRelid(rel));
+
+ if (!pgstat_should_count_relation(rel))
+ return;
+
+ /*
+ * Transactionally set counters to 0. That ensures that accesses to
+ * pg_stat_xact_all_tables inside the transaction show 0.
+ */
+ pgstat_info = rel->pgstat_info;
+ if (pgstat_info->trans &&
+ pgstat_info->trans->nest_level == nest_level)
+ {
+ save_truncdrop_counters(pgstat_info->trans, true);
+ pgstat_info->trans->tuples_inserted = 0;
+ pgstat_info->trans->tuples_updated = 0;
+ pgstat_info->trans->tuples_deleted = 0;
+ }
+}
+
+/*
+ * Report that the table was just vacuumed.
+ */
+void
+pgstat_report_vacuum(Oid tableoid, bool shared,
+ PgStat_Counter livetuples, PgStat_Counter deadtuples)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_Relation *shtabentry;
+ PgStat_StatTabEntry *tabentry;
+ Oid dboid = (shared ? InvalidOid : MyDatabaseId);
+ TimestampTz ts;
+
+ if (!pgstat_track_counts)
+ return;
+
+ /* Store the data in the table's hash table entry. */
+ ts = GetCurrentTimestamp();
+
+ /* block acquiring lock for the same reason as pgstat_report_autovac() */
+ entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION,
+ dboid, tableoid, false);
+
+ shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats;
+ tabentry = &shtabentry->stats;
+
+ tabentry->n_live_tuples = livetuples;
+ tabentry->n_dead_tuples = deadtuples;
+
+ /*
+ * It is quite possible that a non-aggressive VACUUM ended up skipping
+ * various pages, however, we'll zero the insert counter here regardless.
+ * It's currently used only to track when we need to perform an "insert"
+ * autovacuum, which are mainly intended to freeze newly inserted tuples.
+ * Zeroing this may just mean we'll not try to vacuum the table again
+ * until enough tuples have been inserted to trigger another insert
+ * autovacuum. An anti-wraparound autovacuum will catch any persistent
+ * stragglers.
+ */
+ tabentry->inserts_since_vacuum = 0;
+
+ if (IsAutoVacuumWorkerProcess())
+ {
+ tabentry->autovac_vacuum_timestamp = ts;
+ tabentry->autovac_vacuum_count++;
+ }
+ else
+ {
+ tabentry->vacuum_timestamp = ts;
+ tabentry->vacuum_count++;
+ }
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Report that the table was just analyzed.
+ *
+ * Caller must provide new live- and dead-tuples estimates, as well as a
+ * flag indicating whether to reset the changes_since_analyze counter.
+ */
+void
+pgstat_report_analyze(Relation rel,
+ PgStat_Counter livetuples, PgStat_Counter deadtuples,
+ bool resetcounter)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_Relation *shtabentry;
+ PgStat_StatTabEntry *tabentry;
+ Oid dboid = (rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId);
+
+ if (!pgstat_track_counts)
+ return;
+
+ /*
+ * Unlike VACUUM, ANALYZE might be running inside a transaction that has
+ * already inserted and/or deleted rows in the target table. ANALYZE will
+ * have counted such rows as live or dead respectively. Because we will
+ * report our counts of such rows at transaction end, we should subtract
+ * off these counts from the update we're making now, else they'll be
+ * double-counted after commit. (This approach also ensures that the
+ * shared stats entry ends up with the right numbers if we abort instead
+ * of committing.)
+ *
+ * Waste no time on partitioned tables, though.
+ */
+ if (pgstat_should_count_relation(rel) &&
+ rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
+ {
+ PgStat_TableXactStatus *trans;
+
+ for (trans = rel->pgstat_info->trans; trans; trans = trans->upper)
+ {
+ livetuples -= trans->tuples_inserted - trans->tuples_deleted;
+ deadtuples -= trans->tuples_updated + trans->tuples_deleted;
+ }
+ /* count stuff inserted by already-aborted subxacts, too */
+ deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples;
+ /* Since ANALYZE's counts are estimates, we could have underflowed */
+ livetuples = Max(livetuples, 0);
+ deadtuples = Max(deadtuples, 0);
+ }
+
+ /* block acquiring lock for the same reason as pgstat_report_autovac() */
+ entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELATION, dboid,
+ RelationGetRelid(rel),
+ false);
+ /* can't get dropped while accessed */
+ Assert(entry_ref != NULL && entry_ref->shared_stats != NULL);
+
+ shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats;
+ tabentry = &shtabentry->stats;
+
+ tabentry->n_live_tuples = livetuples;
+ tabentry->n_dead_tuples = deadtuples;
+
+ /*
+ * If commanded, reset changes_since_analyze to zero. This forgets any
+ * changes that were committed while the ANALYZE was in progress, but we
+ * have no good way to estimate how many of those there were.
+ */
+ if (resetcounter)
+ tabentry->changes_since_analyze = 0;
+
+ if (IsAutoVacuumWorkerProcess())
+ {
+ tabentry->autovac_analyze_timestamp = GetCurrentTimestamp();
+ tabentry->autovac_analyze_count++;
+ }
+ else
+ {
+ tabentry->analyze_timestamp = GetCurrentTimestamp();
+ tabentry->analyze_count++;
+ }
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * count a tuple insertion of n tuples
+ */
+void
+pgstat_count_heap_insert(Relation rel, PgStat_Counter n)
+{
+ if (pgstat_should_count_relation(rel))
+ {
+ PgStat_TableStatus *pgstat_info = rel->pgstat_info;
+
+ ensure_tabstat_xact_level(pgstat_info);
+ pgstat_info->trans->tuples_inserted += n;
+ }
+}
+
+/*
+ * count a tuple update
+ */
+void
+pgstat_count_heap_update(Relation rel, bool hot)
+{
+ if (pgstat_should_count_relation(rel))
+ {
+ PgStat_TableStatus *pgstat_info = rel->pgstat_info;
+
+ ensure_tabstat_xact_level(pgstat_info);
+ pgstat_info->trans->tuples_updated++;
+
+ /* t_tuples_hot_updated is nontransactional, so just advance it */
+ if (hot)
+ pgstat_info->t_counts.t_tuples_hot_updated++;
+ }
+}
+
+/*
+ * count a tuple deletion
+ */
+void
+pgstat_count_heap_delete(Relation rel)
+{
+ if (pgstat_should_count_relation(rel))
+ {
+ PgStat_TableStatus *pgstat_info = rel->pgstat_info;
+
+ ensure_tabstat_xact_level(pgstat_info);
+ pgstat_info->trans->tuples_deleted++;
+ }
+}
+
+/*
+ * update tuple counters due to truncate
+ */
+void
+pgstat_count_truncate(Relation rel)
+{
+ if (pgstat_should_count_relation(rel))
+ {
+ PgStat_TableStatus *pgstat_info = rel->pgstat_info;
+
+ ensure_tabstat_xact_level(pgstat_info);
+ save_truncdrop_counters(pgstat_info->trans, false);
+ pgstat_info->trans->tuples_inserted = 0;
+ pgstat_info->trans->tuples_updated = 0;
+ pgstat_info->trans->tuples_deleted = 0;
+ }
+}
+
+/*
+ * update dead-tuples count
+ *
+ * The semantics of this are that we are reporting the nontransactional
+ * recovery of "delta" dead tuples; so t_delta_dead_tuples decreases
+ * rather than increasing, and the change goes straight into the per-table
+ * counter, not into transactional state.
+ */
+void
+pgstat_update_heap_dead_tuples(Relation rel, int delta)
+{
+ if (pgstat_should_count_relation(rel))
+ {
+ PgStat_TableStatus *pgstat_info = rel->pgstat_info;
+
+ pgstat_info->t_counts.t_delta_dead_tuples -= delta;
+ }
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * the collected statistics for one table or NULL. NULL doesn't mean
+ * that the table doesn't exist, just that there are no statistics, so the
+ * caller is better off to report ZERO instead.
+ */
+PgStat_StatTabEntry *
+pgstat_fetch_stat_tabentry(Oid relid)
+{
+ PgStat_StatTabEntry *tabentry;
+
+ tabentry = pgstat_fetch_stat_tabentry_ext(false, relid);
+ if (tabentry != NULL)
+ return tabentry;
+
+ /*
+ * If we didn't find it, maybe it's a shared table.
+ */
+ tabentry = pgstat_fetch_stat_tabentry_ext(true, relid);
+ return tabentry;
+}
+
+/*
+ * More efficient version of pgstat_fetch_stat_tabentry(), allowing to specify
+ * whether the to-be-accessed table is a shared relation or not.
+ */
+PgStat_StatTabEntry *
+pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid)
+{
+ Oid dboid = (shared ? InvalidOid : MyDatabaseId);
+
+ return (PgStat_StatTabEntry *)
+ pgstat_fetch_entry(PGSTAT_KIND_RELATION, dboid, reloid);
+}
+
+/*
+ * find any existing PgStat_TableStatus entry for rel
+ *
+ * Find any existing PgStat_TableStatus entry for rel_id in the current
+ * database. If not found, try finding from shared tables.
+ *
+ * If no entry found, return NULL, don't create a new one
+ */
+PgStat_TableStatus *
+find_tabstat_entry(Oid rel_id)
+{
+ PgStat_EntryRef *entry_ref;
+
+ entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, MyDatabaseId, rel_id);
+ if (!entry_ref)
+ entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, InvalidOid, rel_id);
+
+ if (entry_ref)
+ return entry_ref->pending;
+ return NULL;
+}
+
+/*
+ * Perform relation stats specific end-of-transaction work. Helper for
+ * AtEOXact_PgStat.
+ *
+ * Transfer transactional insert/update counts into the base tabstat entries.
+ * We don't bother to free any of the transactional state, since it's all in
+ * TopTransactionContext and will go away anyway.
+ */
+void
+AtEOXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit)
+{
+ PgStat_TableXactStatus *trans;
+
+ for (trans = xact_state->first; trans != NULL; trans = trans->next)
+ {
+ PgStat_TableStatus *tabstat;
+
+ Assert(trans->nest_level == 1);
+ Assert(trans->upper == NULL);
+ tabstat = trans->parent;
+ Assert(tabstat->trans == trans);
+ /* restore pre-truncate/drop stats (if any) in case of aborted xact */
+ if (!isCommit)
+ restore_truncdrop_counters(trans);
+ /* count attempted actions regardless of commit/abort */
+ tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted;
+ tabstat->t_counts.t_tuples_updated += trans->tuples_updated;
+ tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted;
+ if (isCommit)
+ {
+ tabstat->t_counts.t_truncdropped = trans->truncdropped;
+ if (trans->truncdropped)
+ {
+ /* forget live/dead stats seen by backend thus far */
+ tabstat->t_counts.t_delta_live_tuples = 0;
+ tabstat->t_counts.t_delta_dead_tuples = 0;
+ }
+ /* insert adds a live tuple, delete removes one */
+ tabstat->t_counts.t_delta_live_tuples +=
+ trans->tuples_inserted - trans->tuples_deleted;
+ /* update and delete each create a dead tuple */
+ tabstat->t_counts.t_delta_dead_tuples +=
+ trans->tuples_updated + trans->tuples_deleted;
+ /* insert, update, delete each count as one change event */
+ tabstat->t_counts.t_changed_tuples +=
+ trans->tuples_inserted + trans->tuples_updated +
+ trans->tuples_deleted;
+ }
+ else
+ {
+ /* inserted tuples are dead, deleted tuples are unaffected */
+ tabstat->t_counts.t_delta_dead_tuples +=
+ trans->tuples_inserted + trans->tuples_updated;
+ /* an aborted xact generates no changed_tuple events */
+ }
+ tabstat->trans = NULL;
+ }
+}
+
+/*
+ * Perform relation stats specific end-of-sub-transaction work. Helper for
+ * AtEOSubXact_PgStat.
+ *
+ * Transfer transactional insert/update counts into the next higher
+ * subtransaction state.
+ */
+void
+AtEOSubXact_PgStat_Relations(PgStat_SubXactStatus *xact_state, bool isCommit, int nestDepth)
+{
+ PgStat_TableXactStatus *trans;
+ PgStat_TableXactStatus *next_trans;
+
+ for (trans = xact_state->first; trans != NULL; trans = next_trans)
+ {
+ PgStat_TableStatus *tabstat;
+
+ next_trans = trans->next;
+ Assert(trans->nest_level == nestDepth);
+ tabstat = trans->parent;
+ Assert(tabstat->trans == trans);
+
+ if (isCommit)
+ {
+ if (trans->upper && trans->upper->nest_level == nestDepth - 1)
+ {
+ if (trans->truncdropped)
+ {
+ /* propagate the truncate/drop status one level up */
+ save_truncdrop_counters(trans->upper, false);
+ /* replace upper xact stats with ours */
+ trans->upper->tuples_inserted = trans->tuples_inserted;
+ trans->upper->tuples_updated = trans->tuples_updated;
+ trans->upper->tuples_deleted = trans->tuples_deleted;
+ }
+ else
+ {
+ trans->upper->tuples_inserted += trans->tuples_inserted;
+ trans->upper->tuples_updated += trans->tuples_updated;
+ trans->upper->tuples_deleted += trans->tuples_deleted;
+ }
+ tabstat->trans = trans->upper;
+ pfree(trans);
+ }
+ else
+ {
+ /*
+ * When there isn't an immediate parent state, we can just
+ * reuse the record instead of going through a palloc/pfree
+ * pushup (this works since it's all in TopTransactionContext
+ * anyway). We have to re-link it into the parent level,
+ * though, and that might mean pushing a new entry into the
+ * pgStatXactStack.
+ */
+ PgStat_SubXactStatus *upper_xact_state;
+
+ upper_xact_state = pgstat_get_xact_stack_level(nestDepth - 1);
+ trans->next = upper_xact_state->first;
+ upper_xact_state->first = trans;
+ trans->nest_level = nestDepth - 1;
+ }
+ }
+ else
+ {
+ /*
+ * On abort, update top-level tabstat counts, then forget the
+ * subtransaction
+ */
+
+ /* first restore values obliterated by truncate/drop */
+ restore_truncdrop_counters(trans);
+ /* count attempted actions regardless of commit/abort */
+ tabstat->t_counts.t_tuples_inserted += trans->tuples_inserted;
+ tabstat->t_counts.t_tuples_updated += trans->tuples_updated;
+ tabstat->t_counts.t_tuples_deleted += trans->tuples_deleted;
+ /* inserted tuples are dead, deleted tuples are unaffected */
+ tabstat->t_counts.t_delta_dead_tuples +=
+ trans->tuples_inserted + trans->tuples_updated;
+ tabstat->trans = trans->upper;
+ pfree(trans);
+ }
+ }
+}
+
+/*
+ * Generate 2PC records for all the pending transaction-dependent relation
+ * stats.
+ */
+void
+AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state)
+{
+ PgStat_TableXactStatus *trans;
+
+ for (trans = xact_state->first; trans != NULL; trans = trans->next)
+ {
+ PgStat_TableStatus *tabstat PG_USED_FOR_ASSERTS_ONLY;
+ TwoPhasePgStatRecord record;
+
+ Assert(trans->nest_level == 1);
+ Assert(trans->upper == NULL);
+ tabstat = trans->parent;
+ Assert(tabstat->trans == trans);
+
+ record.tuples_inserted = trans->tuples_inserted;
+ record.tuples_updated = trans->tuples_updated;
+ record.tuples_deleted = trans->tuples_deleted;
+ record.inserted_pre_truncdrop = trans->inserted_pre_truncdrop;
+ record.updated_pre_truncdrop = trans->updated_pre_truncdrop;
+ record.deleted_pre_truncdrop = trans->deleted_pre_truncdrop;
+ record.t_id = tabstat->t_id;
+ record.t_shared = tabstat->t_shared;
+ record.t_truncdropped = trans->truncdropped;
+
+ RegisterTwoPhaseRecord(TWOPHASE_RM_PGSTAT_ID, 0,
+ &record, sizeof(TwoPhasePgStatRecord));
+ }
+}
+
+/*
+ * All we need do here is unlink the transaction stats state from the
+ * nontransactional state. The nontransactional action counts will be
+ * reported to the stats system immediately, while the effects on live and
+ * dead tuple counts are preserved in the 2PC state file.
+ *
+ * Note: AtEOXact_PgStat_Relations is not called during PREPARE.
+ */
+void
+PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state)
+{
+ PgStat_TableXactStatus *trans;
+
+ for (trans = xact_state->first; trans != NULL; trans = trans->next)
+ {
+ PgStat_TableStatus *tabstat;
+
+ tabstat = trans->parent;
+ tabstat->trans = NULL;
+ }
+}
+
+/*
+ * 2PC processing routine for COMMIT PREPARED case.
+ *
+ * Load the saved counts into our local pgstats state.
+ */
+void
+pgstat_twophase_postcommit(TransactionId xid, uint16 info,
+ void *recdata, uint32 len)
+{
+ TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata;
+ PgStat_TableStatus *pgstat_info;
+
+ /* Find or create a tabstat entry for the rel */
+ pgstat_info = pgstat_prep_relation_pending(rec->t_id, rec->t_shared);
+
+ /* Same math as in AtEOXact_PgStat, commit case */
+ pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted;
+ pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated;
+ pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted;
+ pgstat_info->t_counts.t_truncdropped = rec->t_truncdropped;
+ if (rec->t_truncdropped)
+ {
+ /* forget live/dead stats seen by backend thus far */
+ pgstat_info->t_counts.t_delta_live_tuples = 0;
+ pgstat_info->t_counts.t_delta_dead_tuples = 0;
+ }
+ pgstat_info->t_counts.t_delta_live_tuples +=
+ rec->tuples_inserted - rec->tuples_deleted;
+ pgstat_info->t_counts.t_delta_dead_tuples +=
+ rec->tuples_updated + rec->tuples_deleted;
+ pgstat_info->t_counts.t_changed_tuples +=
+ rec->tuples_inserted + rec->tuples_updated +
+ rec->tuples_deleted;
+}
+
+/*
+ * 2PC processing routine for ROLLBACK PREPARED case.
+ *
+ * Load the saved counts into our local pgstats state, but treat them
+ * as aborted.
+ */
+void
+pgstat_twophase_postabort(TransactionId xid, uint16 info,
+ void *recdata, uint32 len)
+{
+ TwoPhasePgStatRecord *rec = (TwoPhasePgStatRecord *) recdata;
+ PgStat_TableStatus *pgstat_info;
+
+ /* Find or create a tabstat entry for the rel */
+ pgstat_info = pgstat_prep_relation_pending(rec->t_id, rec->t_shared);
+
+ /* Same math as in AtEOXact_PgStat, abort case */
+ if (rec->t_truncdropped)
+ {
+ rec->tuples_inserted = rec->inserted_pre_truncdrop;
+ rec->tuples_updated = rec->updated_pre_truncdrop;
+ rec->tuples_deleted = rec->deleted_pre_truncdrop;
+ }
+ pgstat_info->t_counts.t_tuples_inserted += rec->tuples_inserted;
+ pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated;
+ pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted;
+ pgstat_info->t_counts.t_delta_dead_tuples +=
+ rec->tuples_inserted + rec->tuples_updated;
+}
+
+/*
+ * Flush out pending stats for the entry
+ *
+ * If nowait is true, this function returns false if lock could not
+ * immediately acquired, otherwise true is returned.
+ *
+ * Some of the stats are copied to the corresponding pending database stats
+ * entry when successfully flushing.
+ */
+bool
+pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ static const PgStat_TableCounts all_zeroes;
+ Oid dboid;
+ PgStat_TableStatus *lstats; /* pending stats entry */
+ PgStatShared_Relation *shtabstats;
+ PgStat_StatTabEntry *tabentry; /* table entry of shared stats */
+ PgStat_StatDBEntry *dbentry; /* pending database entry */
+
+ dboid = entry_ref->shared_entry->key.dboid;
+ lstats = (PgStat_TableStatus *) entry_ref->pending;
+ shtabstats = (PgStatShared_Relation *) entry_ref->shared_stats;
+
+ /*
+ * Ignore entries that didn't accumulate any actual counts, such as
+ * indexes that were opened by the planner but not used.
+ */
+ if (memcmp(&lstats->t_counts, &all_zeroes,
+ sizeof(PgStat_TableCounts)) == 0)
+ {
+ return true;
+ }
+
+ if (!pgstat_lock_entry(entry_ref, nowait))
+ return false;
+
+ /* add the values to the shared entry. */
+ tabentry = &shtabstats->stats;
+
+ tabentry->numscans += lstats->t_counts.t_numscans;
+ tabentry->tuples_returned += lstats->t_counts.t_tuples_returned;
+ tabentry->tuples_fetched += lstats->t_counts.t_tuples_fetched;
+ tabentry->tuples_inserted += lstats->t_counts.t_tuples_inserted;
+ tabentry->tuples_updated += lstats->t_counts.t_tuples_updated;
+ tabentry->tuples_deleted += lstats->t_counts.t_tuples_deleted;
+ tabentry->tuples_hot_updated += lstats->t_counts.t_tuples_hot_updated;
+
+ /*
+ * If table was truncated/dropped, first reset the live/dead counters.
+ */
+ if (lstats->t_counts.t_truncdropped)
+ {
+ tabentry->n_live_tuples = 0;
+ tabentry->n_dead_tuples = 0;
+ tabentry->inserts_since_vacuum = 0;
+ }
+
+ tabentry->n_live_tuples += lstats->t_counts.t_delta_live_tuples;
+ tabentry->n_dead_tuples += lstats->t_counts.t_delta_dead_tuples;
+ tabentry->changes_since_analyze += lstats->t_counts.t_changed_tuples;
+ tabentry->inserts_since_vacuum += lstats->t_counts.t_tuples_inserted;
+ tabentry->blocks_fetched += lstats->t_counts.t_blocks_fetched;
+ tabentry->blocks_hit += lstats->t_counts.t_blocks_hit;
+
+ /* Clamp n_live_tuples in case of negative delta_live_tuples */
+ tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0);
+ /* Likewise for n_dead_tuples */
+ tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0);
+
+ pgstat_unlock_entry(entry_ref);
+
+ /* The entry was successfully flushed, add the same to database stats */
+ dbentry = pgstat_prep_database_pending(dboid);
+ dbentry->n_tuples_returned += lstats->t_counts.t_tuples_returned;
+ dbentry->n_tuples_fetched += lstats->t_counts.t_tuples_fetched;
+ dbentry->n_tuples_inserted += lstats->t_counts.t_tuples_inserted;
+ dbentry->n_tuples_updated += lstats->t_counts.t_tuples_updated;
+ dbentry->n_tuples_deleted += lstats->t_counts.t_tuples_deleted;
+ dbentry->n_blocks_fetched += lstats->t_counts.t_blocks_fetched;
+ dbentry->n_blocks_hit += lstats->t_counts.t_blocks_hit;
+
+ return true;
+}
+
+void
+pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref)
+{
+ PgStat_TableStatus *pending = (PgStat_TableStatus *) entry_ref->pending;
+
+ if (pending->relation)
+ pgstat_unlink_relation(pending->relation);
+}
+
+/*
+ * Find or create a PgStat_TableStatus entry for rel. New entry is created and
+ * initialized if not exists.
+ */
+static PgStat_TableStatus *
+pgstat_prep_relation_pending(Oid rel_id, bool isshared)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStat_TableStatus *pending;
+
+ entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_RELATION,
+ isshared ? InvalidOid : MyDatabaseId,
+ rel_id, NULL);
+ pending = entry_ref->pending;
+ pending->t_id = rel_id;
+ pending->t_shared = isshared;
+
+ return pending;
+}
+
+/*
+ * add a new (sub)transaction state record
+ */
+static void
+add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
+{
+ PgStat_SubXactStatus *xact_state;
+ PgStat_TableXactStatus *trans;
+
+ /*
+ * If this is the first rel to be modified at the current nest level, we
+ * first have to push a transaction stack entry.
+ */
+ xact_state = pgstat_get_xact_stack_level(nest_level);
+
+ /* Now make a per-table stack entry */
+ trans = (PgStat_TableXactStatus *)
+ MemoryContextAllocZero(TopTransactionContext,
+ sizeof(PgStat_TableXactStatus));
+ trans->nest_level = nest_level;
+ trans->upper = pgstat_info->trans;
+ trans->parent = pgstat_info;
+ trans->next = xact_state->first;
+ xact_state->first = trans;
+ pgstat_info->trans = trans;
+}
+
+/*
+ * Add a new (sub)transaction record if needed.
+ */
+static void
+ensure_tabstat_xact_level(PgStat_TableStatus *pgstat_info)
+{
+ int nest_level = GetCurrentTransactionNestLevel();
+
+ if (pgstat_info->trans == NULL ||
+ pgstat_info->trans->nest_level != nest_level)
+ add_tabstat_xact_level(pgstat_info, nest_level);
+}
+
+/*
+ * Whenever a table is truncated/dropped, we save its i/u/d counters so that
+ * they can be cleared, and if the (sub)xact that executed the truncate/drop
+ * later aborts, the counters can be restored to the saved (pre-truncate/drop)
+ * values.
+ *
+ * Note that for truncate we do this on the first truncate in any particular
+ * subxact level only.
+ */
+static void
+save_truncdrop_counters(PgStat_TableXactStatus *trans, bool is_drop)
+{
+ if (!trans->truncdropped || is_drop)
+ {
+ trans->inserted_pre_truncdrop = trans->tuples_inserted;
+ trans->updated_pre_truncdrop = trans->tuples_updated;
+ trans->deleted_pre_truncdrop = trans->tuples_deleted;
+ trans->truncdropped = true;
+ }
+}
+
+/*
+ * restore counters when a truncate aborts
+ */
+static void
+restore_truncdrop_counters(PgStat_TableXactStatus *trans)
+{
+ if (trans->truncdropped)
+ {
+ trans->tuples_inserted = trans->inserted_pre_truncdrop;
+ trans->tuples_updated = trans->updated_pre_truncdrop;
+ trans->tuples_deleted = trans->deleted_pre_truncdrop;
+ }
+}
diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c
new file mode 100644
index 0000000..1a8473b
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_replslot.c
@@ -0,0 +1,224 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_replslot.c
+ * Implementation of replication slot statistics.
+ *
+ * This file contains the implementation of replication slot statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Replication slot stats work a bit different than other other
+ * variable-numbered stats. Slots do not have oids (so they can be created on
+ * physical replicas). Use the slot index as object id while running. However,
+ * the slot index can change when restarting. That is addressed by using the
+ * name when (de-)serializing. After a restart it is possible for slots to
+ * have been dropped while shut down, which is addressed by not restoring
+ * stats for slots that cannot be found by name when starting up.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_replslot.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "replication/slot.h"
+#include "utils/builtins.h" /* for namestrcpy() */
+#include "utils/pgstat_internal.h"
+
+
+static int get_replslot_index(const char *name);
+
+
+/*
+ * Reset counters for a single replication slot.
+ *
+ * Permission checking for this function is managed through the normal
+ * GRANT system.
+ */
+void
+pgstat_reset_replslot(const char *name)
+{
+ ReplicationSlot *slot;
+
+ AssertArg(name != NULL);
+
+ /* Check if the slot exits with the given name. */
+ slot = SearchNamedReplicationSlot(name, true);
+
+ if (!slot)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("replication slot \"%s\" does not exist",
+ name)));
+
+ /*
+ * Nothing to do for physical slots as we collect stats only for logical
+ * slots.
+ */
+ if (SlotIsPhysical(slot))
+ return;
+
+ /* reset this one entry */
+ pgstat_reset(PGSTAT_KIND_REPLSLOT, InvalidOid,
+ ReplicationSlotIndex(slot));
+}
+
+/*
+ * Report replication slot statistics.
+ *
+ * We can rely on the stats for the slot to exist and to belong to this
+ * slot. We can only get here if pgstat_create_replslot() or
+ * pgstat_acquire_replslot() have already been called.
+ */
+void
+pgstat_report_replslot(ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_ReplSlot *shstatent;
+ PgStat_StatReplSlotEntry *statent;
+
+ entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid,
+ ReplicationSlotIndex(slot), false);
+ shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats;
+ statent = &shstatent->stats;
+
+ /* Update the replication slot statistics */
+#define REPLSLOT_ACC(fld) statent->fld += repSlotStat->fld
+ REPLSLOT_ACC(spill_txns);
+ REPLSLOT_ACC(spill_count);
+ REPLSLOT_ACC(spill_bytes);
+ REPLSLOT_ACC(stream_txns);
+ REPLSLOT_ACC(stream_count);
+ REPLSLOT_ACC(stream_bytes);
+ REPLSLOT_ACC(total_txns);
+ REPLSLOT_ACC(total_bytes);
+#undef REPLSLOT_ACC
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Report replication slot creation.
+ *
+ * NB: This gets called with ReplicationSlotAllocationLock already held, be
+ * careful about calling back into slot.c.
+ */
+void
+pgstat_create_replslot(ReplicationSlot *slot)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStatShared_ReplSlot *shstatent;
+
+ entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid,
+ ReplicationSlotIndex(slot), false);
+ shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats;
+
+ /*
+ * NB: need to accept that there might be stats from an older slot, e.g.
+ * if we previously crashed after dropping a slot.
+ */
+ memset(&shstatent->stats, 0, sizeof(shstatent->stats));
+
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Report replication slot has been acquired.
+ *
+ * This guarantees that a stats entry exists during later
+ * pgstat_report_replslot() calls.
+ *
+ * If we previously crashed, no stats data exists. But if we did not crash,
+ * the stats do belong to this slot:
+ * - the stats cannot belong to a dropped slot, pgstat_drop_replslot() would
+ * have been called
+ * - if the slot was removed while shut down,
+ * pgstat_replslot_from_serialized_name_cb() returning false would have
+ * caused the stats to be dropped
+ */
+void
+pgstat_acquire_replslot(ReplicationSlot *slot)
+{
+ pgstat_get_entry_ref(PGSTAT_KIND_REPLSLOT, InvalidOid,
+ ReplicationSlotIndex(slot), true, NULL);
+}
+
+/*
+ * Report replication slot drop.
+ */
+void
+pgstat_drop_replslot(ReplicationSlot *slot)
+{
+ pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid,
+ ReplicationSlotIndex(slot));
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the replication slot statistics struct.
+ */
+PgStat_StatReplSlotEntry *
+pgstat_fetch_replslot(NameData slotname)
+{
+ int idx = get_replslot_index(NameStr(slotname));
+
+ if (idx == -1)
+ return NULL;
+
+ return (PgStat_StatReplSlotEntry *)
+ pgstat_fetch_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, idx);
+}
+
+void
+pgstat_replslot_to_serialized_name_cb(const PgStat_HashKey *key, const PgStatShared_Common *header, NameData *name)
+{
+ /*
+ * This is only called late during shutdown. The set of existing slots
+ * isn't allowed to change at this point, we can assume that a slot exists
+ * at the offset.
+ */
+ if (!ReplicationSlotName(key->objoid, name))
+ elog(ERROR, "could not find name for replication slot index %u",
+ key->objoid);
+}
+
+bool
+pgstat_replslot_from_serialized_name_cb(const NameData *name, PgStat_HashKey *key)
+{
+ int idx = get_replslot_index(NameStr(*name));
+
+ /* slot might have been deleted */
+ if (idx == -1)
+ return false;
+
+ key->kind = PGSTAT_KIND_REPLSLOT;
+ key->dboid = InvalidOid;
+ key->objoid = idx;
+
+ return true;
+}
+
+void
+pgstat_replslot_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts)
+{
+ ((PgStatShared_ReplSlot *) header)->stats.stat_reset_timestamp = ts;
+}
+
+static int
+get_replslot_index(const char *name)
+{
+ ReplicationSlot *slot;
+
+ AssertArg(name != NULL);
+
+ slot = SearchNamedReplicationSlot(name, true);
+
+ if (!slot)
+ return -1;
+
+ return ReplicationSlotIndex(slot);
+}
diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c
new file mode 100644
index 0000000..9a4f037
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_shmem.c
@@ -0,0 +1,1003 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_shmem.c
+ * Storage of stats entries in shared memory
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_shmem.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "pgstat.h"
+#include "storage/shmem.h"
+#include "utils/memutils.h"
+#include "utils/pgstat_internal.h"
+
+
+#define PGSTAT_ENTRY_REF_HASH_SIZE 128
+
+/* hash table entry for finding the PgStat_EntryRef for a key */
+typedef struct PgStat_EntryRefHashEntry
+{
+ PgStat_HashKey key; /* hash key */
+ char status; /* for simplehash use */
+ PgStat_EntryRef *entry_ref;
+} PgStat_EntryRefHashEntry;
+
+
+/* for references to shared statistics entries */
+#define SH_PREFIX pgstat_entry_ref_hash
+#define SH_ELEMENT_TYPE PgStat_EntryRefHashEntry
+#define SH_KEY_TYPE PgStat_HashKey
+#define SH_KEY key
+#define SH_HASH_KEY(tb, key) \
+ pgstat_hash_hash_key(&key, sizeof(PgStat_HashKey), NULL)
+#define SH_EQUAL(tb, a, b) \
+ pgstat_cmp_hash_key(&a, &b, sizeof(PgStat_HashKey), NULL) == 0
+#define SH_SCOPE static inline
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
+
+static void pgstat_drop_database_and_contents(Oid dboid);
+
+static void pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat);
+
+static void pgstat_release_entry_ref(PgStat_HashKey key, PgStat_EntryRef *entry_ref, bool discard_pending);
+static bool pgstat_need_entry_refs_gc(void);
+static void pgstat_gc_entry_refs(void);
+static void pgstat_release_all_entry_refs(bool discard_pending);
+typedef bool (*ReleaseMatchCB) (PgStat_EntryRefHashEntry *, Datum data);
+static void pgstat_release_matching_entry_refs(bool discard_pending, ReleaseMatchCB match, Datum match_data);
+
+static void pgstat_setup_memcxt(void);
+
+
+/* parameter for the shared hash */
+static const dshash_parameters dsh_params = {
+ sizeof(PgStat_HashKey),
+ sizeof(PgStatShared_HashEntry),
+ pgstat_cmp_hash_key,
+ pgstat_hash_hash_key,
+ LWTRANCHE_PGSTATS_HASH
+};
+
+
+/*
+ * Backend local references to shared stats entries. If there are pending
+ * updates to a stats entry, the PgStat_EntryRef is added to the pgStatPending
+ * list.
+ *
+ * When a stats entry is dropped each backend needs to release its reference
+ * to it before the memory can be released. To trigger that
+ * pgStatLocal.shmem->gc_request_count is incremented - which each backend
+ * compares to their copy of pgStatSharedRefAge on a regular basis.
+ */
+static pgstat_entry_ref_hash_hash *pgStatEntryRefHash = NULL;
+static int pgStatSharedRefAge = 0; /* cache age of pgStatShmLookupCache */
+
+/*
+ * Memory contexts containing the pgStatEntryRefHash table and the
+ * pgStatSharedRef entries respectively. Kept separate to make it easier to
+ * track / attribute memory usage.
+ */
+static MemoryContext pgStatSharedRefContext = NULL;
+static MemoryContext pgStatEntryRefHashContext = NULL;
+
+
+/* ------------------------------------------------------------
+ * Public functions called from postmaster follow
+ * ------------------------------------------------------------
+ */
+
+/*
+ * The size of the shared memory allocation for stats stored in the shared
+ * stats hash table. This allocation will be done as part of the main shared
+ * memory, rather than dynamic shared memory, allowing it to be initialized in
+ * postmaster.
+ */
+static Size
+pgstat_dsa_init_size(void)
+{
+ Size sz;
+
+ /*
+ * The dshash header / initial buckets array needs to fit into "plain"
+ * shared memory, but it's beneficial to not need dsm segments
+ * immediately. A size of 256kB seems works well and is not
+ * disproportional compared to other constant sized shared memory
+ * allocations. NB: To avoid DSMs further, the user can configure
+ * min_dynamic_shared_memory.
+ */
+ sz = 256 * 1024;
+ Assert(dsa_minimum_size() <= sz);
+ return MAXALIGN(sz);
+}
+
+/*
+ * Compute shared memory space needed for cumulative statistics
+ */
+Size
+StatsShmemSize(void)
+{
+ Size sz;
+
+ sz = MAXALIGN(sizeof(PgStat_ShmemControl));
+ sz = add_size(sz, pgstat_dsa_init_size());
+
+ return sz;
+}
+
+/*
+ * Initialize cumulative statistics system during startup
+ */
+void
+StatsShmemInit(void)
+{
+ bool found;
+ Size sz;
+
+ sz = StatsShmemSize();
+ pgStatLocal.shmem = (PgStat_ShmemControl *)
+ ShmemInitStruct("Shared Memory Stats", sz, &found);
+
+ if (!IsUnderPostmaster)
+ {
+ dsa_area *dsa;
+ dshash_table *dsh;
+ PgStat_ShmemControl *ctl = pgStatLocal.shmem;
+ char *p = (char *) ctl;
+
+ Assert(!found);
+
+ /* the allocation of pgStatLocal.shmem itself */
+ p += MAXALIGN(sizeof(PgStat_ShmemControl));
+
+ /*
+ * Create a small dsa allocation in plain shared memory. This is
+ * required because postmaster cannot use dsm segments. It also
+ * provides a small efficiency win.
+ */
+ ctl->raw_dsa_area = p;
+ p += MAXALIGN(pgstat_dsa_init_size());
+ dsa = dsa_create_in_place(ctl->raw_dsa_area,
+ pgstat_dsa_init_size(),
+ LWTRANCHE_PGSTATS_DSA, 0);
+ dsa_pin(dsa);
+
+ /*
+ * To ensure dshash is created in "plain" shared memory, temporarily
+ * limit size of dsa to the initial size of the dsa.
+ */
+ dsa_set_size_limit(dsa, pgstat_dsa_init_size());
+
+ /*
+ * With the limit in place, create the dshash table. XXX: It'd be nice
+ * if there were dshash_create_in_place().
+ */
+ dsh = dshash_create(dsa, &dsh_params, 0);
+ ctl->hash_handle = dshash_get_hash_table_handle(dsh);
+
+ /* lift limit set above */
+ dsa_set_size_limit(dsa, -1);
+
+ /*
+ * Postmaster will never access these again, thus free the local
+ * dsa/dshash references.
+ */
+ dshash_detach(dsh);
+ dsa_detach(dsa);
+
+ pg_atomic_init_u64(&ctl->gc_request_count, 1);
+
+
+ /* initialize fixed-numbered stats */
+ LWLockInitialize(&ctl->archiver.lock, LWTRANCHE_PGSTATS_DATA);
+ LWLockInitialize(&ctl->bgwriter.lock, LWTRANCHE_PGSTATS_DATA);
+ LWLockInitialize(&ctl->checkpointer.lock, LWTRANCHE_PGSTATS_DATA);
+ LWLockInitialize(&ctl->slru.lock, LWTRANCHE_PGSTATS_DATA);
+ LWLockInitialize(&ctl->wal.lock, LWTRANCHE_PGSTATS_DATA);
+ }
+ else
+ {
+ Assert(found);
+ }
+}
+
+void
+pgstat_attach_shmem(void)
+{
+ MemoryContext oldcontext;
+
+ Assert(pgStatLocal.dsa == NULL);
+
+ /* stats shared memory persists for the backend lifetime */
+ oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+
+ pgStatLocal.dsa = dsa_attach_in_place(pgStatLocal.shmem->raw_dsa_area,
+ NULL);
+ dsa_pin_mapping(pgStatLocal.dsa);
+
+ pgStatLocal.shared_hash = dshash_attach(pgStatLocal.dsa, &dsh_params,
+ pgStatLocal.shmem->hash_handle, 0);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+void
+pgstat_detach_shmem(void)
+{
+ Assert(pgStatLocal.dsa);
+
+ /* we shouldn't leave references to shared stats */
+ pgstat_release_all_entry_refs(false);
+
+ dshash_detach(pgStatLocal.shared_hash);
+ pgStatLocal.shared_hash = NULL;
+
+ dsa_detach(pgStatLocal.dsa);
+ pgStatLocal.dsa = NULL;
+}
+
+
+/* ------------------------------------------------------------
+ * Maintenance of shared memory stats entries
+ * ------------------------------------------------------------
+ */
+
+PgStatShared_Common *
+pgstat_init_entry(PgStat_Kind kind,
+ PgStatShared_HashEntry *shhashent)
+{
+ /* Create new stats entry. */
+ dsa_pointer chunk;
+ PgStatShared_Common *shheader;
+
+ /*
+ * Initialize refcount to 1, marking it as valid / not dropped. The entry
+ * can't be freed before the initialization because it can't be found as
+ * long as we hold the dshash partition lock. Caller needs to increase
+ * further if a longer lived reference is needed.
+ */
+ pg_atomic_init_u32(&shhashent->refcount, 1);
+ shhashent->dropped = false;
+
+ chunk = dsa_allocate0(pgStatLocal.dsa, pgstat_get_kind_info(kind)->shared_size);
+ shheader = dsa_get_address(pgStatLocal.dsa, chunk);
+ shheader->magic = 0xdeadbeef;
+
+ /* Link the new entry from the hash entry. */
+ shhashent->body = chunk;
+
+ LWLockInitialize(&shheader->lock, LWTRANCHE_PGSTATS_DATA);
+
+ return shheader;
+}
+
+static PgStatShared_Common *
+pgstat_reinit_entry(PgStat_Kind kind, PgStatShared_HashEntry *shhashent)
+{
+ PgStatShared_Common *shheader;
+
+ shheader = dsa_get_address(pgStatLocal.dsa, shhashent->body);
+
+ /* mark as not dropped anymore */
+ pg_atomic_fetch_add_u32(&shhashent->refcount, 1);
+ shhashent->dropped = false;
+
+ /* reinitialize content */
+ Assert(shheader->magic == 0xdeadbeef);
+ memset(pgstat_get_entry_data(kind, shheader), 0,
+ pgstat_get_entry_len(kind));
+
+ return shheader;
+}
+
+static void
+pgstat_setup_shared_refs(void)
+{
+ if (likely(pgStatEntryRefHash != NULL))
+ return;
+
+ pgStatEntryRefHash =
+ pgstat_entry_ref_hash_create(pgStatEntryRefHashContext,
+ PGSTAT_ENTRY_REF_HASH_SIZE, NULL);
+ pgStatSharedRefAge = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count);
+ Assert(pgStatSharedRefAge != 0);
+}
+
+/*
+ * Helper function for pgstat_get_entry_ref().
+ */
+static void
+pgstat_acquire_entry_ref(PgStat_EntryRef *entry_ref,
+ PgStatShared_HashEntry *shhashent,
+ PgStatShared_Common *shheader)
+{
+ Assert(shheader->magic == 0xdeadbeef);
+ Assert(pg_atomic_read_u32(&shhashent->refcount) > 0);
+
+ pg_atomic_fetch_add_u32(&shhashent->refcount, 1);
+
+ dshash_release_lock(pgStatLocal.shared_hash, shhashent);
+
+ entry_ref->shared_stats = shheader;
+ entry_ref->shared_entry = shhashent;
+}
+
+/*
+ * Helper function for pgstat_get_entry_ref().
+ */
+static bool
+pgstat_get_entry_ref_cached(PgStat_HashKey key, PgStat_EntryRef **entry_ref_p)
+{
+ bool found;
+ PgStat_EntryRefHashEntry *cache_entry;
+
+ /*
+ * We immediately insert a cache entry, because it avoids 1) multiple
+ * hashtable lookups in case of a cache miss 2) having to deal with
+ * out-of-memory errors after incrementing PgStatShared_Common->refcount.
+ */
+
+ cache_entry = pgstat_entry_ref_hash_insert(pgStatEntryRefHash, key, &found);
+
+ if (!found || !cache_entry->entry_ref)
+ {
+ PgStat_EntryRef *entry_ref;
+
+ cache_entry->entry_ref = entry_ref =
+ MemoryContextAlloc(pgStatSharedRefContext,
+ sizeof(PgStat_EntryRef));
+ entry_ref->shared_stats = NULL;
+ entry_ref->shared_entry = NULL;
+ entry_ref->pending = NULL;
+
+ found = false;
+ }
+ else if (cache_entry->entry_ref->shared_stats == NULL)
+ {
+ Assert(cache_entry->entry_ref->pending == NULL);
+ found = false;
+ }
+ else
+ {
+ PgStat_EntryRef *entry_ref PG_USED_FOR_ASSERTS_ONLY;
+
+ entry_ref = cache_entry->entry_ref;
+ Assert(entry_ref->shared_entry != NULL);
+ Assert(entry_ref->shared_stats != NULL);
+
+ Assert(entry_ref->shared_stats->magic == 0xdeadbeef);
+ /* should have at least our reference */
+ Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) > 0);
+ }
+
+ *entry_ref_p = cache_entry->entry_ref;
+ return found;
+}
+
+/*
+ * Get a shared stats reference. If create is true, the shared stats object is
+ * created if it does not exist.
+ *
+ * When create is true, and created_entry is non-NULL, it'll be set to true
+ * if the entry is newly created, false otherwise.
+ */
+PgStat_EntryRef *
+pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create,
+ bool *created_entry)
+{
+ PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid};
+ PgStatShared_HashEntry *shhashent;
+ PgStatShared_Common *shheader = NULL;
+ PgStat_EntryRef *entry_ref;
+
+ /*
+ * passing in created_entry only makes sense if we possibly could create
+ * entry.
+ */
+ AssertArg(create || created_entry == NULL);
+ pgstat_assert_is_up();
+ Assert(pgStatLocal.shared_hash != NULL);
+ Assert(!pgStatLocal.shmem->is_shutdown);
+
+ pgstat_setup_memcxt();
+ pgstat_setup_shared_refs();
+
+ if (created_entry != NULL)
+ *created_entry = false;
+
+ /*
+ * Check if other backends dropped stats that could not be deleted because
+ * somebody held references to it. If so, check this backend's references.
+ * This is not expected to happen often. The location of the check is a
+ * bit random, but this is a relatively frequently called path, so better
+ * than most.
+ */
+ if (pgstat_need_entry_refs_gc())
+ pgstat_gc_entry_refs();
+
+ /*
+ * First check the lookup cache hashtable in local memory. If we find a
+ * match here we can avoid taking locks / causing contention.
+ */
+ if (pgstat_get_entry_ref_cached(key, &entry_ref))
+ return entry_ref;
+
+ Assert(entry_ref != NULL);
+
+ /*
+ * Do a lookup in the hash table first - it's quite likely that the entry
+ * already exists, and that way we only need a shared lock.
+ */
+ shhashent = dshash_find(pgStatLocal.shared_hash, &key, false);
+
+ if (create && !shhashent)
+ {
+ bool shfound;
+
+ /*
+ * It's possible that somebody created the entry since the above
+ * lookup. If so, fall through to the same path as if we'd have if it
+ * already had been created before the dshash_find() calls.
+ */
+ shhashent = dshash_find_or_insert(pgStatLocal.shared_hash, &key, &shfound);
+ if (!shfound)
+ {
+ shheader = pgstat_init_entry(kind, shhashent);
+ pgstat_acquire_entry_ref(entry_ref, shhashent, shheader);
+
+ if (created_entry != NULL)
+ *created_entry = true;
+
+ return entry_ref;
+ }
+ }
+
+ if (!shhashent)
+ {
+ /*
+ * If we're not creating, delete the reference again. In all
+ * likelihood it's just a stats lookup - no point wasting memory for a
+ * shared ref to nothing...
+ */
+ pgstat_release_entry_ref(key, entry_ref, false);
+
+ return NULL;
+ }
+ else
+ {
+ /*
+ * Can get here either because dshash_find() found a match, or if
+ * dshash_find_or_insert() found a concurrently inserted entry.
+ */
+
+ if (shhashent->dropped && create)
+ {
+ /*
+ * There are legitimate cases where the old stats entry might not
+ * yet have been dropped by the time it's reused. The most obvious
+ * case are replication slot stats, where a new slot can be
+ * created with the same index just after dropping. But oid
+ * wraparound can lead to other cases as well. We just reset the
+ * stats to their plain state.
+ */
+ shheader = pgstat_reinit_entry(kind, shhashent);
+ pgstat_acquire_entry_ref(entry_ref, shhashent, shheader);
+
+ if (created_entry != NULL)
+ *created_entry = true;
+
+ return entry_ref;
+ }
+ else if (shhashent->dropped)
+ {
+ dshash_release_lock(pgStatLocal.shared_hash, shhashent);
+ pgstat_release_entry_ref(key, entry_ref, false);
+
+ return NULL;
+ }
+ else
+ {
+ shheader = dsa_get_address(pgStatLocal.dsa, shhashent->body);
+ pgstat_acquire_entry_ref(entry_ref, shhashent, shheader);
+
+ return entry_ref;
+ }
+ }
+}
+
+static void
+pgstat_release_entry_ref(PgStat_HashKey key, PgStat_EntryRef *entry_ref,
+ bool discard_pending)
+{
+ if (entry_ref && entry_ref->pending)
+ {
+ if (discard_pending)
+ pgstat_delete_pending_entry(entry_ref);
+ else
+ elog(ERROR, "releasing ref with pending data");
+ }
+
+ if (entry_ref && entry_ref->shared_stats)
+ {
+ Assert(entry_ref->shared_stats->magic == 0xdeadbeef);
+ Assert(entry_ref->pending == NULL);
+
+ /*
+ * This can't race with another backend looking up the stats entry and
+ * increasing the refcount because it is not "legal" to create
+ * additional references to dropped entries.
+ */
+ if (pg_atomic_fetch_sub_u32(&entry_ref->shared_entry->refcount, 1) == 1)
+ {
+ PgStatShared_HashEntry *shent;
+
+ /*
+ * We're the last referrer to this entry, try to drop the shared
+ * entry.
+ */
+
+ /* only dropped entries can reach a 0 refcount */
+ Assert(entry_ref->shared_entry->dropped);
+
+ shent = dshash_find(pgStatLocal.shared_hash,
+ &entry_ref->shared_entry->key,
+ true);
+ if (!shent)
+ elog(ERROR, "could not find just referenced shared stats entry");
+
+ Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) == 0);
+ Assert(entry_ref->shared_entry == shent);
+
+ pgstat_free_entry(shent, NULL);
+ }
+ }
+
+ if (!pgstat_entry_ref_hash_delete(pgStatEntryRefHash, key))
+ elog(ERROR, "entry ref vanished before deletion");
+
+ if (entry_ref)
+ pfree(entry_ref);
+}
+
+bool
+pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ LWLock *lock = &entry_ref->shared_stats->lock;
+
+ if (nowait)
+ return LWLockConditionalAcquire(lock, LW_EXCLUSIVE);
+
+ LWLockAcquire(lock, LW_EXCLUSIVE);
+ return true;
+}
+
+/*
+ * Separate from pgstat_lock_entry() as most callers will need to lock
+ * exclusively.
+ */
+bool
+pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ LWLock *lock = &entry_ref->shared_stats->lock;
+
+ if (nowait)
+ return LWLockConditionalAcquire(lock, LW_SHARED);
+
+ LWLockAcquire(lock, LW_SHARED);
+ return true;
+}
+
+void
+pgstat_unlock_entry(PgStat_EntryRef *entry_ref)
+{
+ LWLockRelease(&entry_ref->shared_stats->lock);
+}
+
+/*
+ * Helper function to fetch and lock shared stats.
+ */
+PgStat_EntryRef *
+pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid,
+ bool nowait)
+{
+ PgStat_EntryRef *entry_ref;
+
+ /* find shared table stats entry corresponding to the local entry */
+ entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, true, NULL);
+
+ /* lock the shared entry to protect the content, skip if failed */
+ if (!pgstat_lock_entry(entry_ref, nowait))
+ return NULL;
+
+ return entry_ref;
+}
+
+void
+pgstat_request_entry_refs_gc(void)
+{
+ pg_atomic_fetch_add_u64(&pgStatLocal.shmem->gc_request_count, 1);
+}
+
+static bool
+pgstat_need_entry_refs_gc(void)
+{
+ uint64 curage;
+
+ if (!pgStatEntryRefHash)
+ return false;
+
+ /* should have been initialized when creating pgStatEntryRefHash */
+ Assert(pgStatSharedRefAge != 0);
+
+ curage = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count);
+
+ return pgStatSharedRefAge != curage;
+}
+
+static void
+pgstat_gc_entry_refs(void)
+{
+ pgstat_entry_ref_hash_iterator i;
+ PgStat_EntryRefHashEntry *ent;
+ uint64 curage;
+
+ curage = pg_atomic_read_u64(&pgStatLocal.shmem->gc_request_count);
+ Assert(curage != 0);
+
+ /*
+ * Some entries have been dropped. Invalidate cache pointer to them.
+ */
+ pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i);
+ while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) != NULL)
+ {
+ PgStat_EntryRef *entry_ref = ent->entry_ref;
+
+ Assert(!entry_ref->shared_stats ||
+ entry_ref->shared_stats->magic == 0xdeadbeef);
+
+ if (!entry_ref->shared_entry->dropped)
+ continue;
+
+ /* cannot gc shared ref that has pending data */
+ if (entry_ref->pending != NULL)
+ continue;
+
+ pgstat_release_entry_ref(ent->key, entry_ref, false);
+ }
+
+ pgStatSharedRefAge = curage;
+}
+
+static void
+pgstat_release_matching_entry_refs(bool discard_pending, ReleaseMatchCB match,
+ Datum match_data)
+{
+ pgstat_entry_ref_hash_iterator i;
+ PgStat_EntryRefHashEntry *ent;
+
+ if (pgStatEntryRefHash == NULL)
+ return;
+
+ pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i);
+
+ while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i))
+ != NULL)
+ {
+ Assert(ent->entry_ref != NULL);
+
+ if (match && !match(ent, match_data))
+ continue;
+
+ pgstat_release_entry_ref(ent->key, ent->entry_ref, discard_pending);
+ }
+}
+
+/*
+ * Release all local references to shared stats entries.
+ *
+ * When a process exits it cannot do so while still holding references onto
+ * stats entries, otherwise the shared stats entries could never be freed.
+ */
+static void
+pgstat_release_all_entry_refs(bool discard_pending)
+{
+ if (pgStatEntryRefHash == NULL)
+ return;
+
+ pgstat_release_matching_entry_refs(discard_pending, NULL, 0);
+ Assert(pgStatEntryRefHash->members == 0);
+ pgstat_entry_ref_hash_destroy(pgStatEntryRefHash);
+ pgStatEntryRefHash = NULL;
+}
+
+static bool
+match_db(PgStat_EntryRefHashEntry *ent, Datum match_data)
+{
+ Oid dboid = DatumGetObjectId(match_data);
+
+ return ent->key.dboid == dboid;
+}
+
+static void
+pgstat_release_db_entry_refs(Oid dboid)
+{
+ pgstat_release_matching_entry_refs( /* discard pending = */ true,
+ match_db,
+ ObjectIdGetDatum(dboid));
+}
+
+
+/* ------------------------------------------------------------
+ * Dropping and resetting of stats entries
+ * ------------------------------------------------------------
+ */
+
+static void
+pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat)
+{
+ dsa_pointer pdsa;
+
+ /*
+ * Fetch dsa pointer before deleting entry - that way we can free the
+ * memory after releasing the lock.
+ */
+ pdsa = shent->body;
+
+ if (!hstat)
+ dshash_delete_entry(pgStatLocal.shared_hash, shent);
+ else
+ dshash_delete_current(hstat);
+
+ dsa_free(pgStatLocal.dsa, pdsa);
+}
+
+/*
+ * Helper for both pgstat_drop_database_and_contents() and
+ * pgstat_drop_entry(). If hstat is non-null delete the shared entry using
+ * dshash_delete_current(), otherwise use dshash_delete_entry(). In either
+ * case the entry needs to be already locked.
+ */
+static bool
+pgstat_drop_entry_internal(PgStatShared_HashEntry *shent,
+ dshash_seq_status *hstat)
+{
+ Assert(shent->body != InvalidDsaPointer);
+
+ /* should already have released local reference */
+ if (pgStatEntryRefHash)
+ Assert(!pgstat_entry_ref_hash_lookup(pgStatEntryRefHash, shent->key));
+
+ /*
+ * Signal that the entry is dropped - this will eventually cause other
+ * backends to release their references.
+ */
+ if (shent->dropped)
+ elog(ERROR, "can only drop stats once");
+ shent->dropped = true;
+
+ /* release refcount marking entry as not dropped */
+ if (pg_atomic_sub_fetch_u32(&shent->refcount, 1) == 0)
+ {
+ pgstat_free_entry(shent, hstat);
+ return true;
+ }
+ else
+ {
+ if (!hstat)
+ dshash_release_lock(pgStatLocal.shared_hash, shent);
+ return false;
+ }
+}
+
+/*
+ * Drop stats for the database and all the objects inside that database.
+ */
+static void
+pgstat_drop_database_and_contents(Oid dboid)
+{
+ dshash_seq_status hstat;
+ PgStatShared_HashEntry *p;
+ uint64 not_freed_count = 0;
+
+ Assert(OidIsValid(dboid));
+
+ Assert(pgStatLocal.shared_hash != NULL);
+
+ /*
+ * This backend might very well be the only backend holding a reference to
+ * about-to-be-dropped entries. Ensure that we're not preventing it from
+ * being cleaned up till later.
+ *
+ * Doing this separately from the dshash iteration below avoids having to
+ * do so while holding a partition lock on the shared hashtable.
+ */
+ pgstat_release_db_entry_refs(dboid);
+
+ /* some of the dshash entries are to be removed, take exclusive lock. */
+ dshash_seq_init(&hstat, pgStatLocal.shared_hash, true);
+ while ((p = dshash_seq_next(&hstat)) != NULL)
+ {
+ if (p->dropped)
+ continue;
+
+ if (p->key.dboid != dboid)
+ continue;
+
+ if (!pgstat_drop_entry_internal(p, &hstat))
+ {
+ /*
+ * Even statistics for a dropped database might currently be
+ * accessed (consider e.g. database stats for pg_stat_database).
+ */
+ not_freed_count++;
+ }
+ }
+ dshash_seq_term(&hstat);
+
+ /*
+ * If some of the stats data could not be freed, signal the reference
+ * holders to run garbage collection of their cached pgStatShmLookupCache.
+ */
+ if (not_freed_count > 0)
+ pgstat_request_entry_refs_gc();
+}
+
+bool
+pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid};
+ PgStatShared_HashEntry *shent;
+ bool freed = true;
+
+ /* delete local reference */
+ if (pgStatEntryRefHash)
+ {
+ PgStat_EntryRefHashEntry *lohashent =
+ pgstat_entry_ref_hash_lookup(pgStatEntryRefHash, key);
+
+ if (lohashent)
+ pgstat_release_entry_ref(lohashent->key, lohashent->entry_ref,
+ true);
+ }
+
+ /* mark entry in shared hashtable as deleted, drop if possible */
+ shent = dshash_find(pgStatLocal.shared_hash, &key, true);
+ if (shent)
+ {
+ freed = pgstat_drop_entry_internal(shent, NULL);
+
+ /*
+ * Database stats contain other stats. Drop those as well when
+ * dropping the database. XXX: Perhaps this should be done in a
+ * slightly more principled way? But not obvious what that'd look
+ * like, and so far this is the only case...
+ */
+ if (key.kind == PGSTAT_KIND_DATABASE)
+ pgstat_drop_database_and_contents(key.dboid);
+ }
+
+ return freed;
+}
+
+void
+pgstat_drop_all_entries(void)
+{
+ dshash_seq_status hstat;
+ PgStatShared_HashEntry *ps;
+ uint64 not_freed_count = 0;
+
+ dshash_seq_init(&hstat, pgStatLocal.shared_hash, true);
+ while ((ps = dshash_seq_next(&hstat)) != NULL)
+ {
+ if (ps->dropped)
+ continue;
+
+ if (!pgstat_drop_entry_internal(ps, &hstat))
+ not_freed_count++;
+ }
+ dshash_seq_term(&hstat);
+
+ if (not_freed_count > 0)
+ pgstat_request_entry_refs_gc();
+}
+
+static void
+shared_stat_reset_contents(PgStat_Kind kind, PgStatShared_Common *header,
+ TimestampTz ts)
+{
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+
+ memset(pgstat_get_entry_data(kind, header), 0,
+ pgstat_get_entry_len(kind));
+
+ if (kind_info->reset_timestamp_cb)
+ kind_info->reset_timestamp_cb(header, ts);
+}
+
+/*
+ * Reset one variable-numbered stats entry.
+ */
+void
+pgstat_reset_entry(PgStat_Kind kind, Oid dboid, Oid objoid, TimestampTz ts)
+{
+ PgStat_EntryRef *entry_ref;
+
+ Assert(!pgstat_get_kind_info(kind)->fixed_amount);
+
+ entry_ref = pgstat_get_entry_ref(kind, dboid, objoid, false, NULL);
+ if (!entry_ref || entry_ref->shared_entry->dropped)
+ return;
+
+ (void) pgstat_lock_entry(entry_ref, false);
+ shared_stat_reset_contents(kind, entry_ref->shared_stats, ts);
+ pgstat_unlock_entry(entry_ref);
+}
+
+/*
+ * Scan through the shared hashtable of stats, resetting statistics if
+ * approved by the provided do_reset() function.
+ */
+void
+pgstat_reset_matching_entries(bool (*do_reset) (PgStatShared_HashEntry *, Datum),
+ Datum match_data, TimestampTz ts)
+{
+ dshash_seq_status hstat;
+ PgStatShared_HashEntry *p;
+
+ /* dshash entry is not modified, take shared lock */
+ dshash_seq_init(&hstat, pgStatLocal.shared_hash, false);
+ while ((p = dshash_seq_next(&hstat)) != NULL)
+ {
+ PgStatShared_Common *header;
+
+ if (p->dropped)
+ continue;
+
+ if (!do_reset(p, match_data))
+ continue;
+
+ header = dsa_get_address(pgStatLocal.dsa, p->body);
+
+ LWLockAcquire(&header->lock, LW_EXCLUSIVE);
+
+ shared_stat_reset_contents(p->key.kind, header, ts);
+
+ LWLockRelease(&header->lock);
+ }
+ dshash_seq_term(&hstat);
+}
+
+static bool
+match_kind(PgStatShared_HashEntry *p, Datum match_data)
+{
+ return p->key.kind == DatumGetInt32(match_data);
+}
+
+void
+pgstat_reset_entries_of_kind(PgStat_Kind kind, TimestampTz ts)
+{
+ pgstat_reset_matching_entries(match_kind, Int32GetDatum(kind), ts);
+}
+
+static void
+pgstat_setup_memcxt(void)
+{
+ if (unlikely(!pgStatSharedRefContext))
+ pgStatSharedRefContext =
+ AllocSetContextCreate(TopMemoryContext,
+ "PgStat Shared Ref",
+ ALLOCSET_SMALL_SIZES);
+ if (unlikely(!pgStatEntryRefHashContext))
+ pgStatEntryRefHashContext =
+ AllocSetContextCreate(TopMemoryContext,
+ "PgStat Shared Ref Hash",
+ ALLOCSET_SMALL_SIZES);
+}
diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c
new file mode 100644
index 0000000..28ef736
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_slru.c
@@ -0,0 +1,248 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_slru.c
+ * Implementation of SLRU statistics.
+ *
+ * This file contains the implementation of SLRU statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_slru.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+#include "utils/timestamp.h"
+
+
+static inline PgStat_SLRUStats *get_slru_entry(int slru_idx);
+static void pgstat_reset_slru_counter_internal(int index, TimestampTz ts);
+
+
+/*
+ * SLRU statistics counts waiting to be flushed out. We assume this variable
+ * inits to zeroes. Entries are one-to-one with slru_names[]. Changes of
+ * SLRU counters are reported within critical sections so we use static memory
+ * in order to avoid memory allocation.
+ */
+static PgStat_SLRUStats pending_SLRUStats[SLRU_NUM_ELEMENTS];
+bool have_slrustats = false;
+
+
+/*
+ * Reset counters for a single SLRU.
+ *
+ * Permission checking for this function is managed through the normal
+ * GRANT system.
+ */
+void
+pgstat_reset_slru(const char *name)
+{
+ TimestampTz ts = GetCurrentTimestamp();
+
+ AssertArg(name != NULL);
+
+ pgstat_reset_slru_counter_internal(pgstat_get_slru_index(name), ts);
+}
+
+/*
+ * SLRU statistics count accumulation functions --- called from slru.c
+ */
+
+void
+pgstat_count_slru_page_zeroed(int slru_idx)
+{
+ get_slru_entry(slru_idx)->blocks_zeroed += 1;
+}
+
+void
+pgstat_count_slru_page_hit(int slru_idx)
+{
+ get_slru_entry(slru_idx)->blocks_hit += 1;
+}
+
+void
+pgstat_count_slru_page_exists(int slru_idx)
+{
+ get_slru_entry(slru_idx)->blocks_exists += 1;
+}
+
+void
+pgstat_count_slru_page_read(int slru_idx)
+{
+ get_slru_entry(slru_idx)->blocks_read += 1;
+}
+
+void
+pgstat_count_slru_page_written(int slru_idx)
+{
+ get_slru_entry(slru_idx)->blocks_written += 1;
+}
+
+void
+pgstat_count_slru_flush(int slru_idx)
+{
+ get_slru_entry(slru_idx)->flush += 1;
+}
+
+void
+pgstat_count_slru_truncate(int slru_idx)
+{
+ get_slru_entry(slru_idx)->truncate += 1;
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the slru statistics struct.
+ */
+PgStat_SLRUStats *
+pgstat_fetch_slru(void)
+{
+ pgstat_snapshot_fixed(PGSTAT_KIND_SLRU);
+
+ return pgStatLocal.snapshot.slru;
+}
+
+/*
+ * Returns SLRU name for an index. The index may be above SLRU_NUM_ELEMENTS,
+ * in which case this returns NULL. This allows writing code that does not
+ * know the number of entries in advance.
+ */
+const char *
+pgstat_get_slru_name(int slru_idx)
+{
+ if (slru_idx < 0 || slru_idx >= SLRU_NUM_ELEMENTS)
+ return NULL;
+
+ return slru_names[slru_idx];
+}
+
+/*
+ * Determine index of entry for a SLRU with a given name. If there's no exact
+ * match, returns index of the last "other" entry used for SLRUs defined in
+ * external projects.
+ */
+int
+pgstat_get_slru_index(const char *name)
+{
+ int i;
+
+ for (i = 0; i < SLRU_NUM_ELEMENTS; i++)
+ {
+ if (strcmp(slru_names[i], name) == 0)
+ return i;
+ }
+
+ /* return index of the last entry (which is the "other" one) */
+ return (SLRU_NUM_ELEMENTS - 1);
+}
+
+/*
+ * Flush out locally pending SLRU stats entries
+ *
+ * If nowait is true, this function returns false on lock failure. Otherwise
+ * this function always returns true.
+ *
+ * If nowait is true, this function returns true if the lock could not be
+ * acquired. Otherwise return false.
+ */
+bool
+pgstat_slru_flush(bool nowait)
+{
+ PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru;
+ int i;
+
+ if (!have_slrustats)
+ return false;
+
+ if (!nowait)
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ else if (!LWLockConditionalAcquire(&stats_shmem->lock, LW_EXCLUSIVE))
+ return true;
+
+ for (i = 0; i < SLRU_NUM_ELEMENTS; i++)
+ {
+ PgStat_SLRUStats *sharedent = &stats_shmem->stats[i];
+ PgStat_SLRUStats *pendingent = &pending_SLRUStats[i];
+
+#define SLRU_ACC(fld) sharedent->fld += pendingent->fld
+ SLRU_ACC(blocks_zeroed);
+ SLRU_ACC(blocks_hit);
+ SLRU_ACC(blocks_read);
+ SLRU_ACC(blocks_written);
+ SLRU_ACC(blocks_exists);
+ SLRU_ACC(flush);
+ SLRU_ACC(truncate);
+#undef SLRU_ACC
+ }
+
+ /* done, clear the pending entry */
+ MemSet(pending_SLRUStats, 0, sizeof(pending_SLRUStats));
+
+ LWLockRelease(&stats_shmem->lock);
+
+ have_slrustats = false;
+
+ return false;
+}
+
+void
+pgstat_slru_reset_all_cb(TimestampTz ts)
+{
+ for (int i = 0; i < SLRU_NUM_ELEMENTS; i++)
+ pgstat_reset_slru_counter_internal(i, ts);
+}
+
+void
+pgstat_slru_snapshot_cb(void)
+{
+ PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru;
+
+ LWLockAcquire(&stats_shmem->lock, LW_SHARED);
+
+ memcpy(pgStatLocal.snapshot.slru, &stats_shmem->stats,
+ sizeof(stats_shmem->stats));
+
+ LWLockRelease(&stats_shmem->lock);
+}
+
+/*
+ * Returns pointer to entry with counters for given SLRU (based on the name
+ * stored in SlruCtl as lwlock tranche name).
+ */
+static inline PgStat_SLRUStats *
+get_slru_entry(int slru_idx)
+{
+ pgstat_assert_is_up();
+
+ /*
+ * The postmaster should never register any SLRU statistics counts; if it
+ * did, the counts would be duplicated into child processes via fork().
+ */
+ Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
+
+ Assert((slru_idx >= 0) && (slru_idx < SLRU_NUM_ELEMENTS));
+
+ have_slrustats = true;
+
+ return &pending_SLRUStats[slru_idx];
+}
+
+static void
+pgstat_reset_slru_counter_internal(int index, TimestampTz ts)
+{
+ PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru;
+
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+
+ memset(&stats_shmem->stats[index], 0, sizeof(PgStat_SLRUStats));
+ stats_shmem->stats[index].stat_reset_timestamp = ts;
+
+ LWLockRelease(&stats_shmem->lock);
+}
diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c
new file mode 100644
index 0000000..e1072bd
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_subscription.c
@@ -0,0 +1,110 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_subscription.c
+ * Implementation of subscription statistics.
+ *
+ * This file contains the implementation of subscription statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_subscription.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+
+
+/*
+ * Report a subscription error.
+ */
+void
+pgstat_report_subscription_error(Oid subid, bool is_apply_error)
+{
+ PgStat_EntryRef *entry_ref;
+ PgStat_BackendSubEntry *pending;
+
+ entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_SUBSCRIPTION,
+ InvalidOid, subid, NULL);
+ pending = entry_ref->pending;
+
+ if (is_apply_error)
+ pending->apply_error_count++;
+ else
+ pending->sync_error_count++;
+}
+
+/*
+ * Report creating the subscription.
+ *
+ * Ensures that stats are dropped if transaction rolls back.
+ */
+void
+pgstat_create_subscription(Oid subid)
+{
+ pgstat_create_transactional(PGSTAT_KIND_SUBSCRIPTION,
+ InvalidOid, subid);
+}
+
+/*
+ * Report dropping the subscription.
+ *
+ * Ensures that stats are dropped if transaction commits.
+ */
+void
+pgstat_drop_subscription(Oid subid)
+{
+ pgstat_drop_transactional(PGSTAT_KIND_SUBSCRIPTION,
+ InvalidOid, subid);
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * the collected statistics for one subscription or NULL.
+ */
+PgStat_StatSubEntry *
+pgstat_fetch_stat_subscription(Oid subid)
+{
+ return (PgStat_StatSubEntry *)
+ pgstat_fetch_entry(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid);
+}
+
+/*
+ * Flush out pending stats for the entry
+ *
+ * If nowait is true, this function returns false if lock could not
+ * immediately acquired, otherwise true is returned.
+ */
+bool
+pgstat_subscription_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
+{
+ PgStat_BackendSubEntry *localent;
+ PgStatShared_Subscription *shsubent;
+
+ localent = (PgStat_BackendSubEntry *) entry_ref->pending;
+ shsubent = (PgStatShared_Subscription *) entry_ref->shared_stats;
+
+ /* localent always has non-zero content */
+
+ if (!pgstat_lock_entry(entry_ref, nowait))
+ return false;
+
+#define SUB_ACC(fld) shsubent->stats.fld += localent->fld
+ SUB_ACC(apply_error_count);
+ SUB_ACC(sync_error_count);
+#undef SUB_ACC
+
+ pgstat_unlock_entry(entry_ref);
+ return true;
+}
+
+void
+pgstat_subscription_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts)
+{
+ ((PgStatShared_Subscription *) header)->stats.stat_reset_timestamp = ts;
+}
diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c
new file mode 100644
index 0000000..305a925
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_wal.c
@@ -0,0 +1,182 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_wal.c
+ * Implementation of WAL statistics.
+ *
+ * This file contains the implementation of WAL statistics. It is kept
+ * separate from pgstat.c to enforce the line between the statistics access /
+ * storage implementation and the details about individual types of
+ * statistics.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_wal.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/pgstat_internal.h"
+#include "executor/instrument.h"
+
+
+PgStat_WalStats PendingWalStats = {0};
+
+/*
+ * WAL usage counters saved from pgWALUsage at the previous call to
+ * pgstat_report_wal(). This is used to calculate how much WAL usage
+ * happens between pgstat_report_wal() calls, by subtracting
+ * the previous counters from the current ones.
+ */
+static WalUsage prevWalUsage;
+
+
+/*
+ * Calculate how much WAL usage counters have increased and update
+ * shared statistics.
+ *
+ * Must be called by processes that generate WAL, that do not call
+ * pgstat_report_stat(), like walwriter.
+ *
+ * "force" set to true ensures that the statistics are flushed; note that
+ * this needs to acquire the pgstat shmem LWLock, waiting on it. When
+ * set to false, the statistics may not be flushed if the lock could not
+ * be acquired.
+ */
+void
+pgstat_report_wal(bool force)
+{
+ bool nowait;
+
+ /* like in pgstat.c, don't wait for lock acquisition when !force */
+ nowait = !force;
+
+ /* flush wal stats */
+ pgstat_flush_wal(nowait);
+}
+
+/*
+ * Support function for the SQL-callable pgstat* functions. Returns
+ * a pointer to the WAL statistics struct.
+ */
+PgStat_WalStats *
+pgstat_fetch_stat_wal(void)
+{
+ pgstat_snapshot_fixed(PGSTAT_KIND_WAL);
+
+ return &pgStatLocal.snapshot.wal;
+}
+
+/*
+ * Calculate how much WAL usage counters have increased by subtracting the
+ * previous counters from the current ones.
+ *
+ * If nowait is true, this function returns true if the lock could not be
+ * acquired. Otherwise return false.
+ */
+bool
+pgstat_flush_wal(bool nowait)
+{
+ PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
+ WalUsage diff = {0};
+
+ Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
+ Assert(pgStatLocal.shmem != NULL &&
+ !pgStatLocal.shmem->is_shutdown);
+
+ /*
+ * This function can be called even if nothing at all has happened. Avoid
+ * taking lock for nothing in that case.
+ */
+ if (!pgstat_have_pending_wal())
+ return false;
+
+ /*
+ * We don't update the WAL usage portion of the local WalStats elsewhere.
+ * Calculate how much WAL usage counters were increased by subtracting the
+ * previous counters from the current ones.
+ */
+ WalUsageAccumDiff(&diff, &pgWalUsage, &prevWalUsage);
+ PendingWalStats.wal_records = diff.wal_records;
+ PendingWalStats.wal_fpi = diff.wal_fpi;
+ PendingWalStats.wal_bytes = diff.wal_bytes;
+
+ if (!nowait)
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ else if (!LWLockConditionalAcquire(&stats_shmem->lock, LW_EXCLUSIVE))
+ return true;
+
+#define WALSTAT_ACC(fld) stats_shmem->stats.fld += PendingWalStats.fld
+ WALSTAT_ACC(wal_records);
+ WALSTAT_ACC(wal_fpi);
+ WALSTAT_ACC(wal_bytes);
+ WALSTAT_ACC(wal_buffers_full);
+ WALSTAT_ACC(wal_write);
+ WALSTAT_ACC(wal_sync);
+ WALSTAT_ACC(wal_write_time);
+ WALSTAT_ACC(wal_sync_time);
+#undef WALSTAT_ACC
+
+ LWLockRelease(&stats_shmem->lock);
+
+ /*
+ * Save the current counters for the subsequent calculation of WAL usage.
+ */
+ prevWalUsage = pgWalUsage;
+
+ /*
+ * Clear out the statistics buffer, so it can be re-used.
+ */
+ MemSet(&PendingWalStats, 0, sizeof(PendingWalStats));
+
+ return false;
+}
+
+void
+pgstat_init_wal(void)
+{
+ /*
+ * Initialize prevWalUsage with pgWalUsage so that pgstat_flush_wal() can
+ * calculate how much pgWalUsage counters are increased by subtracting
+ * prevWalUsage from pgWalUsage.
+ */
+ prevWalUsage = pgWalUsage;
+}
+
+/*
+ * To determine whether any WAL activity has occurred since last time, not
+ * only the number of generated WAL records but also the numbers of WAL
+ * writes and syncs need to be checked. Because even transaction that
+ * generates no WAL records can write or sync WAL data when flushing the
+ * data pages.
+ */
+bool
+pgstat_have_pending_wal(void)
+{
+ return pgWalUsage.wal_records != prevWalUsage.wal_records ||
+ PendingWalStats.wal_write != 0 ||
+ PendingWalStats.wal_sync != 0;
+}
+
+void
+pgstat_wal_reset_all_cb(TimestampTz ts)
+{
+ PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
+
+ LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
+ memset(&stats_shmem->stats, 0, sizeof(stats_shmem->stats));
+ stats_shmem->stats.stat_reset_timestamp = ts;
+ LWLockRelease(&stats_shmem->lock);
+}
+
+void
+pgstat_wal_snapshot_cb(void)
+{
+ PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
+
+ LWLockAcquire(&stats_shmem->lock, LW_SHARED);
+ memcpy(&pgStatLocal.snapshot.wal, &stats_shmem->stats,
+ sizeof(pgStatLocal.snapshot.wal));
+ LWLockRelease(&stats_shmem->lock);
+}
diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c
new file mode 100644
index 0000000..d6f660e
--- /dev/null
+++ b/src/backend/utils/activity/pgstat_xact.c
@@ -0,0 +1,391 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstat_xact.c
+ * Transactional integration for the cumulative statistics system.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/pgstat_xact.c
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/transam.h"
+#include "access/xact.h"
+#include "pgstat.h"
+#include "utils/memutils.h"
+#include "utils/pgstat_internal.h"
+
+
+typedef struct PgStat_PendingDroppedStatsItem
+{
+ xl_xact_stats_item item;
+ bool is_create;
+ dlist_node node;
+} PgStat_PendingDroppedStatsItem;
+
+
+static void AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit);
+static void AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state,
+ bool isCommit, int nestDepth);
+
+static PgStat_SubXactStatus *pgStatXactStack = NULL;
+
+
+/*
+ * Called from access/transam/xact.c at top-level transaction commit/abort.
+ */
+void
+AtEOXact_PgStat(bool isCommit, bool parallel)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ AtEOXact_PgStat_Database(isCommit, parallel);
+
+ /* handle transactional stats information */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ AtEOXact_PgStat_Relations(xact_state, isCommit);
+ AtEOXact_PgStat_DroppedStats(xact_state, isCommit);
+ }
+ pgStatXactStack = NULL;
+
+ /* Make sure any stats snapshot is thrown away */
+ pgstat_clear_snapshot();
+}
+
+/*
+ * When committing, drop stats for objects dropped in the transaction. When
+ * aborting, drop stats for objects created in the transaction.
+ */
+static void
+AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit)
+{
+ dlist_mutable_iter iter;
+ int not_freed_count = 0;
+
+ if (xact_state->pending_drops_count == 0)
+ {
+ Assert(dlist_is_empty(&xact_state->pending_drops));
+ return;
+ }
+
+ dlist_foreach_modify(iter, &xact_state->pending_drops)
+ {
+ PgStat_PendingDroppedStatsItem *pending =
+ dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur);
+ xl_xact_stats_item *it = &pending->item;
+
+ if (isCommit && !pending->is_create)
+ {
+ /*
+ * Transaction that dropped an object committed. Drop the stats
+ * too.
+ */
+ if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid))
+ not_freed_count++;
+ }
+ else if (!isCommit && pending->is_create)
+ {
+ /*
+ * Transaction that created an object aborted. Drop the stats
+ * associated with the object.
+ */
+ if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid))
+ not_freed_count++;
+ }
+
+ dlist_delete(&pending->node);
+ xact_state->pending_drops_count--;
+ pfree(pending);
+ }
+
+ if (not_freed_count > 0)
+ pgstat_request_entry_refs_gc();
+}
+
+/*
+ * Called from access/transam/xact.c at subtransaction commit/abort.
+ */
+void
+AtEOSubXact_PgStat(bool isCommit, int nestDepth)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ /* merge the sub-transaction's transactional stats into the parent */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL &&
+ xact_state->nest_level >= nestDepth)
+ {
+ /* delink xact_state from stack immediately to simplify reuse case */
+ pgStatXactStack = xact_state->prev;
+
+ AtEOSubXact_PgStat_Relations(xact_state, isCommit, nestDepth);
+ AtEOSubXact_PgStat_DroppedStats(xact_state, isCommit, nestDepth);
+
+ pfree(xact_state);
+ }
+}
+
+/*
+ * Like AtEOXact_PgStat_DroppedStats(), but for subtransactions.
+ */
+static void
+AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state,
+ bool isCommit, int nestDepth)
+{
+ PgStat_SubXactStatus *parent_xact_state;
+ dlist_mutable_iter iter;
+ int not_freed_count = 0;
+
+ if (xact_state->pending_drops_count == 0)
+ return;
+
+ parent_xact_state = pgstat_get_xact_stack_level(nestDepth - 1);
+
+ dlist_foreach_modify(iter, &xact_state->pending_drops)
+ {
+ PgStat_PendingDroppedStatsItem *pending =
+ dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur);
+ xl_xact_stats_item *it = &pending->item;
+
+ dlist_delete(&pending->node);
+ xact_state->pending_drops_count--;
+
+ if (!isCommit && pending->is_create)
+ {
+ /*
+ * Subtransaction creating a new stats object aborted. Drop the
+ * stats object.
+ */
+ if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid))
+ not_freed_count++;
+ pfree(pending);
+ }
+ else if (isCommit)
+ {
+ /*
+ * Subtransaction dropping a stats object committed. Can't yet
+ * remove the stats object, the surrounding transaction might
+ * still abort. Pass it on to the parent.
+ */
+ dlist_push_tail(&parent_xact_state->pending_drops, &pending->node);
+ parent_xact_state->pending_drops_count++;
+ }
+ else
+ {
+ pfree(pending);
+ }
+ }
+
+ Assert(xact_state->pending_drops_count == 0);
+ if (not_freed_count > 0)
+ pgstat_request_entry_refs_gc();
+}
+
+/*
+ * Save the transactional stats state at 2PC transaction prepare.
+ */
+void
+AtPrepare_PgStat(void)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ AtPrepare_PgStat_Relations(xact_state);
+ }
+}
+
+/*
+ * Clean up after successful PREPARE.
+ *
+ * Note: AtEOXact_PgStat is not called during PREPARE.
+ */
+void
+PostPrepare_PgStat(void)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ /*
+ * We don't bother to free any of the transactional state, since it's all
+ * in TopTransactionContext and will go away anyway.
+ */
+ xact_state = pgStatXactStack;
+ if (xact_state != NULL)
+ {
+ Assert(xact_state->nest_level == 1);
+ Assert(xact_state->prev == NULL);
+
+ PostPrepare_PgStat_Relations(xact_state);
+ }
+ pgStatXactStack = NULL;
+
+ /* Make sure any stats snapshot is thrown away */
+ pgstat_clear_snapshot();
+}
+
+/*
+ * Ensure (sub)transaction stack entry for the given nest_level exists, adding
+ * it if needed.
+ */
+PgStat_SubXactStatus *
+pgstat_get_xact_stack_level(int nest_level)
+{
+ PgStat_SubXactStatus *xact_state;
+
+ xact_state = pgStatXactStack;
+ if (xact_state == NULL || xact_state->nest_level != nest_level)
+ {
+ xact_state = (PgStat_SubXactStatus *)
+ MemoryContextAlloc(TopTransactionContext,
+ sizeof(PgStat_SubXactStatus));
+ dlist_init(&xact_state->pending_drops);
+ xact_state->pending_drops_count = 0;
+ xact_state->nest_level = nest_level;
+ xact_state->prev = pgStatXactStack;
+ xact_state->first = NULL;
+ pgStatXactStack = xact_state;
+ }
+ return xact_state;
+}
+
+/*
+ * Get stat items that need to be dropped at commit / abort.
+ *
+ * When committing, stats for objects that have been dropped in the
+ * transaction are returned. When aborting, stats for newly created objects are
+ * returned.
+ *
+ * Used by COMMIT / ABORT and 2PC PREPARE processing when building their
+ * respective WAL records, to ensure stats are dropped in case of a crash / on
+ * standbys.
+ *
+ * The list of items is allocated in CurrentMemoryContext and must be freed by
+ * the caller (directly or via memory context reset).
+ */
+int
+pgstat_get_transactional_drops(bool isCommit, xl_xact_stats_item **items)
+{
+ PgStat_SubXactStatus *xact_state = pgStatXactStack;
+ int nitems = 0;
+ dlist_iter iter;
+
+ if (xact_state == NULL)
+ return 0;
+
+ /*
+ * We expect to be called for subtransaction abort (which logs a WAL
+ * record), but not for subtransaction commit (which doesn't).
+ */
+ Assert(!isCommit || xact_state->nest_level == 1);
+ Assert(!isCommit || xact_state->prev == NULL);
+
+ *items = palloc(xact_state->pending_drops_count
+ * sizeof(xl_xact_stats_item));
+
+ dlist_foreach(iter, &xact_state->pending_drops)
+ {
+ PgStat_PendingDroppedStatsItem *pending =
+ dlist_container(PgStat_PendingDroppedStatsItem, node, iter.cur);
+
+ if (isCommit && pending->is_create)
+ continue;
+ if (!isCommit && !pending->is_create)
+ continue;
+
+ Assert(nitems < xact_state->pending_drops_count);
+ (*items)[nitems++] = pending->item;
+ }
+
+ return nitems;
+}
+
+/*
+ * Execute scheduled drops post-commit. Called from xact_redo_commit() /
+ * xact_redo_abort() during recovery, and from FinishPreparedTransaction()
+ * during normal 2PC COMMIT/ABORT PREPARED processing.
+ */
+void
+pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, bool is_redo)
+{
+ int not_freed_count = 0;
+
+ if (ndrops == 0)
+ return;
+
+ for (int i = 0; i < ndrops; i++)
+ {
+ xl_xact_stats_item *it = &items[i];
+
+ if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid))
+ not_freed_count++;
+ }
+
+ if (not_freed_count > 0)
+ pgstat_request_entry_refs_gc();
+}
+
+static void
+create_drop_transactional_internal(PgStat_Kind kind, Oid dboid, Oid objoid, bool is_create)
+{
+ int nest_level = GetCurrentTransactionNestLevel();
+ PgStat_SubXactStatus *xact_state;
+ PgStat_PendingDroppedStatsItem *drop = (PgStat_PendingDroppedStatsItem *)
+ MemoryContextAlloc(TopTransactionContext, sizeof(PgStat_PendingDroppedStatsItem));
+
+ xact_state = pgstat_get_xact_stack_level(nest_level);
+
+ drop->is_create = is_create;
+ drop->item.kind = kind;
+ drop->item.dboid = dboid;
+ drop->item.objoid = objoid;
+
+ dlist_push_tail(&xact_state->pending_drops, &drop->node);
+ xact_state->pending_drops_count++;
+}
+
+/*
+ * Create a stats entry for a newly created database object in a transactional
+ * manner.
+ *
+ * I.e. if the current (sub-)transaction aborts, the stats entry will also be
+ * dropped.
+ */
+void
+pgstat_create_transactional(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ if (pgstat_get_entry_ref(kind, dboid, objoid, false, NULL))
+ {
+ ereport(WARNING,
+ errmsg("resetting existing statistics for kind %s, db=%u, oid=%u",
+ (pgstat_get_kind_info(kind))->name, dboid, objoid));
+
+ pgstat_reset(kind, dboid, objoid);
+ }
+
+ create_drop_transactional_internal(kind, dboid, objoid, /* create */ true);
+}
+
+/*
+ * Drop a stats entry for a just dropped database object in a transactional
+ * manner.
+ *
+ * I.e. if the current (sub-)transaction aborts, the stats entry will stay
+ * alive.
+ */
+void
+pgstat_drop_transactional(PgStat_Kind kind, Oid dboid, Oid objoid)
+{
+ create_drop_transactional_internal(kind, dboid, objoid, /* create */ false);
+}
diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c
new file mode 100644
index 0000000..87c15b9
--- /dev/null
+++ b/src/backend/utils/activity/wait_event.c
@@ -0,0 +1,749 @@
+/* ----------
+ * wait_event.c
+ * Wait event reporting infrastructure.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/activity/wait_event.c
+ *
+ * NOTES
+ *
+ * To make pgstat_report_wait_start() and pgstat_report_wait_end() as
+ * lightweight as possible, they do not check if shared memory (MyProc
+ * specifically, where the wait event is stored) is already available. Instead
+ * we initially set my_wait_event_info to a process local variable, which then
+ * is redirected to shared memory using pgstat_set_wait_event_storage(). For
+ * the same reason pgstat_track_activities is not checked - the check adds
+ * more work than it saves.
+ *
+ * ----------
+ */
+#include "postgres.h"
+
+#include "storage/lmgr.h" /* for GetLockNameFromTagType */
+#include "storage/lwlock.h" /* for GetLWLockIdentifier */
+#include "utils/wait_event.h"
+
+
+static const char *pgstat_get_wait_activity(WaitEventActivity w);
+static const char *pgstat_get_wait_client(WaitEventClient w);
+static const char *pgstat_get_wait_ipc(WaitEventIPC w);
+static const char *pgstat_get_wait_timeout(WaitEventTimeout w);
+static const char *pgstat_get_wait_io(WaitEventIO w);
+
+
+static uint32 local_my_wait_event_info;
+uint32 *my_wait_event_info = &local_my_wait_event_info;
+
+
+/*
+ * Configure wait event reporting to report wait events to *wait_event_info.
+ * *wait_event_info needs to be valid until pgstat_reset_wait_event_storage()
+ * is called.
+ *
+ * Expected to be called during backend startup, to point my_wait_event_info
+ * into shared memory.
+ */
+void
+pgstat_set_wait_event_storage(uint32 *wait_event_info)
+{
+ my_wait_event_info = wait_event_info;
+}
+
+/*
+ * Reset wait event storage location.
+ *
+ * Expected to be called during backend shutdown, before the location set up
+ * pgstat_set_wait_event_storage() becomes invalid.
+ */
+void
+pgstat_reset_wait_event_storage(void)
+{
+ my_wait_event_info = &local_my_wait_event_info;
+}
+
+/* ----------
+ * pgstat_get_wait_event_type() -
+ *
+ * Return a string representing the current wait event type, backend is
+ * waiting on.
+ */
+const char *
+pgstat_get_wait_event_type(uint32 wait_event_info)
+{
+ uint32 classId;
+ const char *event_type;
+
+ /* report process as not waiting. */
+ if (wait_event_info == 0)
+ return NULL;
+
+ classId = wait_event_info & 0xFF000000;
+
+ switch (classId)
+ {
+ case PG_WAIT_LWLOCK:
+ event_type = "LWLock";
+ break;
+ case PG_WAIT_LOCK:
+ event_type = "Lock";
+ break;
+ case PG_WAIT_BUFFER_PIN:
+ event_type = "BufferPin";
+ break;
+ case PG_WAIT_ACTIVITY:
+ event_type = "Activity";
+ break;
+ case PG_WAIT_CLIENT:
+ event_type = "Client";
+ break;
+ case PG_WAIT_EXTENSION:
+ event_type = "Extension";
+ break;
+ case PG_WAIT_IPC:
+ event_type = "IPC";
+ break;
+ case PG_WAIT_TIMEOUT:
+ event_type = "Timeout";
+ break;
+ case PG_WAIT_IO:
+ event_type = "IO";
+ break;
+ default:
+ event_type = "???";
+ break;
+ }
+
+ return event_type;
+}
+
+/* ----------
+ * pgstat_get_wait_event() -
+ *
+ * Return a string representing the current wait event, backend is
+ * waiting on.
+ */
+const char *
+pgstat_get_wait_event(uint32 wait_event_info)
+{
+ uint32 classId;
+ uint16 eventId;
+ const char *event_name;
+
+ /* report process as not waiting. */
+ if (wait_event_info == 0)
+ return NULL;
+
+ classId = wait_event_info & 0xFF000000;
+ eventId = wait_event_info & 0x0000FFFF;
+
+ switch (classId)
+ {
+ case PG_WAIT_LWLOCK:
+ event_name = GetLWLockIdentifier(classId, eventId);
+ break;
+ case PG_WAIT_LOCK:
+ event_name = GetLockNameFromTagType(eventId);
+ break;
+ case PG_WAIT_BUFFER_PIN:
+ event_name = "BufferPin";
+ break;
+ case PG_WAIT_ACTIVITY:
+ {
+ WaitEventActivity w = (WaitEventActivity) wait_event_info;
+
+ event_name = pgstat_get_wait_activity(w);
+ break;
+ }
+ case PG_WAIT_CLIENT:
+ {
+ WaitEventClient w = (WaitEventClient) wait_event_info;
+
+ event_name = pgstat_get_wait_client(w);
+ break;
+ }
+ case PG_WAIT_EXTENSION:
+ event_name = "Extension";
+ break;
+ case PG_WAIT_IPC:
+ {
+ WaitEventIPC w = (WaitEventIPC) wait_event_info;
+
+ event_name = pgstat_get_wait_ipc(w);
+ break;
+ }
+ case PG_WAIT_TIMEOUT:
+ {
+ WaitEventTimeout w = (WaitEventTimeout) wait_event_info;
+
+ event_name = pgstat_get_wait_timeout(w);
+ break;
+ }
+ case PG_WAIT_IO:
+ {
+ WaitEventIO w = (WaitEventIO) wait_event_info;
+
+ event_name = pgstat_get_wait_io(w);
+ break;
+ }
+ default:
+ event_name = "unknown wait event";
+ break;
+ }
+
+ return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_activity() -
+ *
+ * Convert WaitEventActivity to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_activity(WaitEventActivity w)
+{
+ const char *event_name = "unknown wait event";
+
+ switch (w)
+ {
+ case WAIT_EVENT_ARCHIVER_MAIN:
+ event_name = "ArchiverMain";
+ break;
+ case WAIT_EVENT_AUTOVACUUM_MAIN:
+ event_name = "AutoVacuumMain";
+ break;
+ case WAIT_EVENT_BGWRITER_HIBERNATE:
+ event_name = "BgWriterHibernate";
+ break;
+ case WAIT_EVENT_BGWRITER_MAIN:
+ event_name = "BgWriterMain";
+ break;
+ case WAIT_EVENT_CHECKPOINTER_MAIN:
+ event_name = "CheckpointerMain";
+ break;
+ case WAIT_EVENT_LOGICAL_APPLY_MAIN:
+ event_name = "LogicalApplyMain";
+ break;
+ case WAIT_EVENT_LOGICAL_LAUNCHER_MAIN:
+ event_name = "LogicalLauncherMain";
+ break;
+ case WAIT_EVENT_RECOVERY_WAL_STREAM:
+ event_name = "RecoveryWalStream";
+ break;
+ case WAIT_EVENT_SYSLOGGER_MAIN:
+ event_name = "SysLoggerMain";
+ break;
+ case WAIT_EVENT_WAL_RECEIVER_MAIN:
+ event_name = "WalReceiverMain";
+ break;
+ case WAIT_EVENT_WAL_SENDER_MAIN:
+ event_name = "WalSenderMain";
+ break;
+ case WAIT_EVENT_WAL_WRITER_MAIN:
+ event_name = "WalWriterMain";
+ break;
+ /* no default case, so that compiler will warn */
+ }
+
+ return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_client() -
+ *
+ * Convert WaitEventClient to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_client(WaitEventClient w)
+{
+ const char *event_name = "unknown wait event";
+
+ switch (w)
+ {
+ case WAIT_EVENT_CLIENT_READ:
+ event_name = "ClientRead";
+ break;
+ case WAIT_EVENT_CLIENT_WRITE:
+ event_name = "ClientWrite";
+ break;
+ case WAIT_EVENT_GSS_OPEN_SERVER:
+ event_name = "GSSOpenServer";
+ break;
+ case WAIT_EVENT_LIBPQWALRECEIVER_CONNECT:
+ event_name = "LibPQWalReceiverConnect";
+ break;
+ case WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE:
+ event_name = "LibPQWalReceiverReceive";
+ break;
+ case WAIT_EVENT_SSL_OPEN_SERVER:
+ event_name = "SSLOpenServer";
+ break;
+ case WAIT_EVENT_WAL_SENDER_WAIT_WAL:
+ event_name = "WalSenderWaitForWAL";
+ break;
+ case WAIT_EVENT_WAL_SENDER_WRITE_DATA:
+ event_name = "WalSenderWriteData";
+ break;
+ /* no default case, so that compiler will warn */
+ }
+
+ return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_ipc() -
+ *
+ * Convert WaitEventIPC to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_ipc(WaitEventIPC w)
+{
+ const char *event_name = "unknown wait event";
+
+ switch (w)
+ {
+ case WAIT_EVENT_APPEND_READY:
+ event_name = "AppendReady";
+ break;
+ case WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND:
+ event_name = "ArchiveCleanupCommand";
+ break;
+ case WAIT_EVENT_ARCHIVE_COMMAND:
+ event_name = "ArchiveCommand";
+ break;
+ case WAIT_EVENT_BACKEND_TERMINATION:
+ event_name = "BackendTermination";
+ break;
+ case WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE:
+ event_name = "BackupWaitWalArchive";
+ break;
+ case WAIT_EVENT_BGWORKER_SHUTDOWN:
+ event_name = "BgWorkerShutdown";
+ break;
+ case WAIT_EVENT_BGWORKER_STARTUP:
+ event_name = "BgWorkerStartup";
+ break;
+ case WAIT_EVENT_BTREE_PAGE:
+ event_name = "BtreePage";
+ break;
+ case WAIT_EVENT_BUFFER_IO:
+ event_name = "BufferIO";
+ break;
+ case WAIT_EVENT_CHECKPOINT_DONE:
+ event_name = "CheckpointDone";
+ break;
+ case WAIT_EVENT_CHECKPOINT_START:
+ event_name = "CheckpointStart";
+ break;
+ case WAIT_EVENT_EXECUTE_GATHER:
+ event_name = "ExecuteGather";
+ break;
+ case WAIT_EVENT_HASH_BATCH_ALLOCATE:
+ event_name = "HashBatchAllocate";
+ break;
+ case WAIT_EVENT_HASH_BATCH_ELECT:
+ event_name = "HashBatchElect";
+ break;
+ case WAIT_EVENT_HASH_BATCH_LOAD:
+ event_name = "HashBatchLoad";
+ break;
+ case WAIT_EVENT_HASH_BUILD_ALLOCATE:
+ event_name = "HashBuildAllocate";
+ break;
+ case WAIT_EVENT_HASH_BUILD_ELECT:
+ event_name = "HashBuildElect";
+ break;
+ case WAIT_EVENT_HASH_BUILD_HASH_INNER:
+ event_name = "HashBuildHashInner";
+ break;
+ case WAIT_EVENT_HASH_BUILD_HASH_OUTER:
+ event_name = "HashBuildHashOuter";
+ break;
+ case WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE:
+ event_name = "HashGrowBatchesAllocate";
+ break;
+ case WAIT_EVENT_HASH_GROW_BATCHES_DECIDE:
+ event_name = "HashGrowBatchesDecide";
+ break;
+ case WAIT_EVENT_HASH_GROW_BATCHES_ELECT:
+ event_name = "HashGrowBatchesElect";
+ break;
+ case WAIT_EVENT_HASH_GROW_BATCHES_FINISH:
+ event_name = "HashGrowBatchesFinish";
+ break;
+ case WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION:
+ event_name = "HashGrowBatchesRepartition";
+ break;
+ case WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE:
+ event_name = "HashGrowBucketsAllocate";
+ break;
+ case WAIT_EVENT_HASH_GROW_BUCKETS_ELECT:
+ event_name = "HashGrowBucketsElect";
+ break;
+ case WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT:
+ event_name = "HashGrowBucketsReinsert";
+ break;
+ case WAIT_EVENT_LOGICAL_SYNC_DATA:
+ event_name = "LogicalSyncData";
+ break;
+ case WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE:
+ event_name = "LogicalSyncStateChange";
+ break;
+ case WAIT_EVENT_MQ_INTERNAL:
+ event_name = "MessageQueueInternal";
+ break;
+ case WAIT_EVENT_MQ_PUT_MESSAGE:
+ event_name = "MessageQueuePutMessage";
+ break;
+ case WAIT_EVENT_MQ_RECEIVE:
+ event_name = "MessageQueueReceive";
+ break;
+ case WAIT_EVENT_MQ_SEND:
+ event_name = "MessageQueueSend";
+ break;
+ case WAIT_EVENT_PARALLEL_BITMAP_SCAN:
+ event_name = "ParallelBitmapScan";
+ break;
+ case WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN:
+ event_name = "ParallelCreateIndexScan";
+ break;
+ case WAIT_EVENT_PARALLEL_FINISH:
+ event_name = "ParallelFinish";
+ break;
+ case WAIT_EVENT_PROCARRAY_GROUP_UPDATE:
+ event_name = "ProcArrayGroupUpdate";
+ break;
+ case WAIT_EVENT_PROC_SIGNAL_BARRIER:
+ event_name = "ProcSignalBarrier";
+ break;
+ case WAIT_EVENT_PROMOTE:
+ event_name = "Promote";
+ break;
+ case WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT:
+ event_name = "RecoveryConflictSnapshot";
+ break;
+ case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE:
+ event_name = "RecoveryConflictTablespace";
+ break;
+ case WAIT_EVENT_RECOVERY_END_COMMAND:
+ event_name = "RecoveryEndCommand";
+ break;
+ case WAIT_EVENT_RECOVERY_PAUSE:
+ event_name = "RecoveryPause";
+ break;
+ case WAIT_EVENT_REPLICATION_ORIGIN_DROP:
+ event_name = "ReplicationOriginDrop";
+ break;
+ case WAIT_EVENT_REPLICATION_SLOT_DROP:
+ event_name = "ReplicationSlotDrop";
+ break;
+ case WAIT_EVENT_RESTORE_COMMAND:
+ event_name = "RestoreCommand";
+ break;
+ case WAIT_EVENT_SAFE_SNAPSHOT:
+ event_name = "SafeSnapshot";
+ break;
+ case WAIT_EVENT_SYNC_REP:
+ event_name = "SyncRep";
+ break;
+ case WAIT_EVENT_WAL_RECEIVER_EXIT:
+ event_name = "WalReceiverExit";
+ break;
+ case WAIT_EVENT_WAL_RECEIVER_WAIT_START:
+ event_name = "WalReceiverWaitStart";
+ break;
+ case WAIT_EVENT_XACT_GROUP_UPDATE:
+ event_name = "XactGroupUpdate";
+ break;
+ /* no default case, so that compiler will warn */
+ }
+
+ return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_timeout() -
+ *
+ * Convert WaitEventTimeout to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_timeout(WaitEventTimeout w)
+{
+ const char *event_name = "unknown wait event";
+
+ switch (w)
+ {
+ case WAIT_EVENT_BASE_BACKUP_THROTTLE:
+ event_name = "BaseBackupThrottle";
+ break;
+ case WAIT_EVENT_CHECKPOINT_WRITE_DELAY:
+ event_name = "CheckpointWriteDelay";
+ break;
+ case WAIT_EVENT_PG_SLEEP:
+ event_name = "PgSleep";
+ break;
+ case WAIT_EVENT_RECOVERY_APPLY_DELAY:
+ event_name = "RecoveryApplyDelay";
+ break;
+ case WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL:
+ event_name = "RecoveryRetrieveRetryInterval";
+ break;
+ case WAIT_EVENT_REGISTER_SYNC_REQUEST:
+ event_name = "RegisterSyncRequest";
+ break;
+ case WAIT_EVENT_VACUUM_DELAY:
+ event_name = "VacuumDelay";
+ break;
+ case WAIT_EVENT_VACUUM_TRUNCATE:
+ event_name = "VacuumTruncate";
+ break;
+ /* no default case, so that compiler will warn */
+ }
+
+ return event_name;
+}
+
+/* ----------
+ * pgstat_get_wait_io() -
+ *
+ * Convert WaitEventIO to string.
+ * ----------
+ */
+static const char *
+pgstat_get_wait_io(WaitEventIO w)
+{
+ const char *event_name = "unknown wait event";
+
+ switch (w)
+ {
+ case WAIT_EVENT_BASEBACKUP_READ:
+ event_name = "BaseBackupRead";
+ break;
+ case WAIT_EVENT_BASEBACKUP_SYNC:
+ event_name = "BaseBackupSync";
+ break;
+ case WAIT_EVENT_BASEBACKUP_WRITE:
+ event_name = "BaseBackupWrite";
+ break;
+ case WAIT_EVENT_BUFFILE_READ:
+ event_name = "BufFileRead";
+ break;
+ case WAIT_EVENT_BUFFILE_WRITE:
+ event_name = "BufFileWrite";
+ break;
+ case WAIT_EVENT_BUFFILE_TRUNCATE:
+ event_name = "BufFileTruncate";
+ break;
+ case WAIT_EVENT_CONTROL_FILE_READ:
+ event_name = "ControlFileRead";
+ break;
+ case WAIT_EVENT_CONTROL_FILE_SYNC:
+ event_name = "ControlFileSync";
+ break;
+ case WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE:
+ event_name = "ControlFileSyncUpdate";
+ break;
+ case WAIT_EVENT_CONTROL_FILE_WRITE:
+ event_name = "ControlFileWrite";
+ break;
+ case WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE:
+ event_name = "ControlFileWriteUpdate";
+ break;
+ case WAIT_EVENT_COPY_FILE_READ:
+ event_name = "CopyFileRead";
+ break;
+ case WAIT_EVENT_COPY_FILE_WRITE:
+ event_name = "CopyFileWrite";
+ break;
+ case WAIT_EVENT_DATA_FILE_EXTEND:
+ event_name = "DataFileExtend";
+ break;
+ case WAIT_EVENT_DATA_FILE_FLUSH:
+ event_name = "DataFileFlush";
+ break;
+ case WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC:
+ event_name = "DataFileImmediateSync";
+ break;
+ case WAIT_EVENT_DATA_FILE_PREFETCH:
+ event_name = "DataFilePrefetch";
+ break;
+ case WAIT_EVENT_DATA_FILE_READ:
+ event_name = "DataFileRead";
+ break;
+ case WAIT_EVENT_DATA_FILE_SYNC:
+ event_name = "DataFileSync";
+ break;
+ case WAIT_EVENT_DATA_FILE_TRUNCATE:
+ event_name = "DataFileTruncate";
+ break;
+ case WAIT_EVENT_DATA_FILE_WRITE:
+ event_name = "DataFileWrite";
+ break;
+ case WAIT_EVENT_DSM_FILL_ZERO_WRITE:
+ event_name = "DSMFillZeroWrite";
+ break;
+ case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ:
+ event_name = "LockFileAddToDataDirRead";
+ break;
+ case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC:
+ event_name = "LockFileAddToDataDirSync";
+ break;
+ case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE:
+ event_name = "LockFileAddToDataDirWrite";
+ break;
+ case WAIT_EVENT_LOCK_FILE_CREATE_READ:
+ event_name = "LockFileCreateRead";
+ break;
+ case WAIT_EVENT_LOCK_FILE_CREATE_SYNC:
+ event_name = "LockFileCreateSync";
+ break;
+ case WAIT_EVENT_LOCK_FILE_CREATE_WRITE:
+ event_name = "LockFileCreateWrite";
+ break;
+ case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ:
+ event_name = "LockFileReCheckDataDirRead";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC:
+ event_name = "LogicalRewriteCheckpointSync";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC:
+ event_name = "LogicalRewriteMappingSync";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE:
+ event_name = "LogicalRewriteMappingWrite";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_SYNC:
+ event_name = "LogicalRewriteSync";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE:
+ event_name = "LogicalRewriteTruncate";
+ break;
+ case WAIT_EVENT_LOGICAL_REWRITE_WRITE:
+ event_name = "LogicalRewriteWrite";
+ break;
+ case WAIT_EVENT_RELATION_MAP_READ:
+ event_name = "RelationMapRead";
+ break;
+ case WAIT_EVENT_RELATION_MAP_SYNC:
+ event_name = "RelationMapSync";
+ break;
+ case WAIT_EVENT_RELATION_MAP_WRITE:
+ event_name = "RelationMapWrite";
+ break;
+ case WAIT_EVENT_REORDER_BUFFER_READ:
+ event_name = "ReorderBufferRead";
+ break;
+ case WAIT_EVENT_REORDER_BUFFER_WRITE:
+ event_name = "ReorderBufferWrite";
+ break;
+ case WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ:
+ event_name = "ReorderLogicalMappingRead";
+ break;
+ case WAIT_EVENT_REPLICATION_SLOT_READ:
+ event_name = "ReplicationSlotRead";
+ break;
+ case WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC:
+ event_name = "ReplicationSlotRestoreSync";
+ break;
+ case WAIT_EVENT_REPLICATION_SLOT_SYNC:
+ event_name = "ReplicationSlotSync";
+ break;
+ case WAIT_EVENT_REPLICATION_SLOT_WRITE:
+ event_name = "ReplicationSlotWrite";
+ break;
+ case WAIT_EVENT_SLRU_FLUSH_SYNC:
+ event_name = "SLRUFlushSync";
+ break;
+ case WAIT_EVENT_SLRU_READ:
+ event_name = "SLRURead";
+ break;
+ case WAIT_EVENT_SLRU_SYNC:
+ event_name = "SLRUSync";
+ break;
+ case WAIT_EVENT_SLRU_WRITE:
+ event_name = "SLRUWrite";
+ break;
+ case WAIT_EVENT_SNAPBUILD_READ:
+ event_name = "SnapbuildRead";
+ break;
+ case WAIT_EVENT_SNAPBUILD_SYNC:
+ event_name = "SnapbuildSync";
+ break;
+ case WAIT_EVENT_SNAPBUILD_WRITE:
+ event_name = "SnapbuildWrite";
+ break;
+ case WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC:
+ event_name = "TimelineHistoryFileSync";
+ break;
+ case WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE:
+ event_name = "TimelineHistoryFileWrite";
+ break;
+ case WAIT_EVENT_TIMELINE_HISTORY_READ:
+ event_name = "TimelineHistoryRead";
+ break;
+ case WAIT_EVENT_TIMELINE_HISTORY_SYNC:
+ event_name = "TimelineHistorySync";
+ break;
+ case WAIT_EVENT_TIMELINE_HISTORY_WRITE:
+ event_name = "TimelineHistoryWrite";
+ break;
+ case WAIT_EVENT_TWOPHASE_FILE_READ:
+ event_name = "TwophaseFileRead";
+ break;
+ case WAIT_EVENT_TWOPHASE_FILE_SYNC:
+ event_name = "TwophaseFileSync";
+ break;
+ case WAIT_EVENT_TWOPHASE_FILE_WRITE:
+ event_name = "TwophaseFileWrite";
+ break;
+ case WAIT_EVENT_VERSION_FILE_WRITE:
+ event_name = "VersionFileWrite";
+ break;
+ case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ:
+ event_name = "WALSenderTimelineHistoryRead";
+ break;
+ case WAIT_EVENT_WAL_BOOTSTRAP_SYNC:
+ event_name = "WALBootstrapSync";
+ break;
+ case WAIT_EVENT_WAL_BOOTSTRAP_WRITE:
+ event_name = "WALBootstrapWrite";
+ break;
+ case WAIT_EVENT_WAL_COPY_READ:
+ event_name = "WALCopyRead";
+ break;
+ case WAIT_EVENT_WAL_COPY_SYNC:
+ event_name = "WALCopySync";
+ break;
+ case WAIT_EVENT_WAL_COPY_WRITE:
+ event_name = "WALCopyWrite";
+ break;
+ case WAIT_EVENT_WAL_INIT_SYNC:
+ event_name = "WALInitSync";
+ break;
+ case WAIT_EVENT_WAL_INIT_WRITE:
+ event_name = "WALInitWrite";
+ break;
+ case WAIT_EVENT_WAL_READ:
+ event_name = "WALRead";
+ break;
+ case WAIT_EVENT_WAL_SYNC:
+ event_name = "WALSync";
+ break;
+ case WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN:
+ event_name = "WALSyncMethodAssign";
+ break;
+ case WAIT_EVENT_WAL_WRITE:
+ event_name = "WALWrite";
+ break;
+
+ /* no default case, so that compiler will warn */
+ }
+
+ return event_name;
+}
diff --git a/src/backend/utils/adt/.gitignore b/src/backend/utils/adt/.gitignore
new file mode 100644
index 0000000..48cf941
--- /dev/null
+++ b/src/backend/utils/adt/.gitignore
@@ -0,0 +1,2 @@
+/jsonpath_gram.c
+/jsonpath_scan.c
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
new file mode 100644
index 0000000..7c722ea
--- /dev/null
+++ b/src/backend/utils/adt/Makefile
@@ -0,0 +1,140 @@
+#
+# Makefile for utils/adt
+#
+# src/backend/utils/adt/Makefile
+#
+
+subdir = src/backend/utils/adt
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
+
+# keep this list arranged alphabetically or it gets to be a mess
+OBJS = \
+ acl.o \
+ amutils.o \
+ array_expanded.o \
+ array_selfuncs.o \
+ array_typanalyze.o \
+ array_userfuncs.o \
+ arrayfuncs.o \
+ arraysubs.o \
+ arrayutils.o \
+ ascii.o \
+ bool.o \
+ cash.o \
+ char.o \
+ cryptohashfuncs.o \
+ date.o \
+ datetime.o \
+ datum.o \
+ dbsize.o \
+ domains.o \
+ encode.o \
+ enum.o \
+ expandeddatum.o \
+ expandedrecord.o \
+ float.o \
+ format_type.o \
+ formatting.o \
+ genfile.o \
+ geo_ops.o \
+ geo_selfuncs.o \
+ geo_spgist.o \
+ hbafuncs.o \
+ inet_cidr_ntop.o \
+ inet_net_pton.o \
+ int.o \
+ int8.o \
+ json.o \
+ jsonb.o \
+ jsonb_gin.o \
+ jsonb_op.o \
+ jsonb_util.o \
+ jsonfuncs.o \
+ jsonbsubs.o \
+ jsonpath.o \
+ jsonpath_exec.o \
+ jsonpath_gram.o \
+ like.o \
+ like_support.o \
+ lockfuncs.o \
+ mac.o \
+ mac8.o \
+ mcxtfuncs.o \
+ misc.o \
+ multirangetypes.o \
+ multirangetypes_selfuncs.o \
+ name.o \
+ network.o \
+ network_gist.o \
+ network_selfuncs.o \
+ network_spgist.o \
+ numeric.o \
+ numutils.o \
+ oid.o \
+ oracle_compat.o \
+ orderedsetaggs.o \
+ partitionfuncs.o \
+ pg_locale.o \
+ pg_lsn.o \
+ pg_upgrade_support.o \
+ pgstatfuncs.o \
+ pseudotypes.o \
+ quote.o \
+ rangetypes.o \
+ rangetypes_gist.o \
+ rangetypes_selfuncs.o \
+ rangetypes_spgist.o \
+ rangetypes_typanalyze.o \
+ regexp.o \
+ regproc.o \
+ ri_triggers.o \
+ rowtypes.o \
+ ruleutils.o \
+ selfuncs.o \
+ tid.o \
+ timestamp.o \
+ trigfuncs.o \
+ tsginidx.o \
+ tsgistidx.o \
+ tsquery.o \
+ tsquery_cleanup.o \
+ tsquery_gist.o \
+ tsquery_op.o \
+ tsquery_rewrite.o \
+ tsquery_util.o \
+ tsrank.o \
+ tsvector.o \
+ tsvector_op.o \
+ tsvector_parser.o \
+ uuid.o \
+ varbit.o \
+ varchar.o \
+ varlena.o \
+ version.o \
+ windowfuncs.o \
+ xid.o \
+ xid8funcs.o \
+ xml.o
+
+jsonpath_scan.c: FLEXFLAGS = -CF -p -p
+jsonpath_scan.c: FLEX_NO_BACKUP=yes
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+jsonpath_gram.o: jsonpath_scan.c
+
+# jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball,
+# so they are not cleaned here.
+clean distclean maintainer-clean:
+ rm -f lex.backup
+
+like.o: like.c like_match.c
+
+# Some code in numeric.c benefits from auto-vectorization
+numeric.o: CFLAGS += ${CFLAGS_VECTORIZE}
+
+varlena.o: varlena.c levenshtein.c
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
new file mode 100644
index 0000000..5b7236a
--- /dev/null
+++ b/src/backend/utils/adt/acl.c
@@ -0,0 +1,5340 @@
+/*-------------------------------------------------------------------------
+ *
+ * acl.c
+ * Basic access control list data structures manipulation routines.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/acl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "access/htup_details.h"
+#include "catalog/catalog.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_parameter_acl.h"
+#include "catalog/pg_type.h"
+#include "commands/dbcommands.h"
+#include "commands/proclang.h"
+#include "commands/tablespace.h"
+#include "common/hashfn.h"
+#include "foreign/foreign.h"
+#include "funcapi.h"
+#include "lib/qunique.h"
+#include "miscadmin.h"
+#include "utils/acl.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/guc.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/syscache.h"
+#include "utils/varlena.h"
+
+typedef struct
+{
+ const char *name;
+ AclMode value;
+} priv_map;
+
+/*
+ * We frequently need to test whether a given role is a member of some other
+ * role. In most of these tests the "given role" is the same, namely the
+ * active current user. So we can optimize it by keeping cached lists of all
+ * the roles the "given role" is a member of, directly or indirectly.
+ *
+ * Possibly this mechanism should be generalized to allow caching membership
+ * info for multiple roles?
+ *
+ * Each element of cached_roles is an OID list of constituent roles for the
+ * corresponding element of cached_role (always including the cached_role
+ * itself). One cache has ROLERECURSE_PRIVS semantics, and the other has
+ * ROLERECURSE_MEMBERS semantics.
+ */
+enum RoleRecurseType
+{
+ ROLERECURSE_PRIVS = 0, /* recurse if rolinherit */
+ ROLERECURSE_MEMBERS = 1 /* recurse unconditionally */
+};
+static Oid cached_role[] = {InvalidOid, InvalidOid};
+static List *cached_roles[] = {NIL, NIL};
+static uint32 cached_db_hash;
+
+
+static const char *getid(const char *s, char *n);
+static void putid(char *p, const char *s);
+static Acl *allocacl(int n);
+static void check_acl(const Acl *acl);
+static const char *aclparse(const char *s, AclItem *aip);
+static bool aclitem_match(const AclItem *a1, const AclItem *a2);
+static int aclitemComparator(const void *arg1, const void *arg2);
+static void check_circularity(const Acl *old_acl, const AclItem *mod_aip,
+ Oid ownerId);
+static Acl *recursive_revoke(Acl *acl, Oid grantee, AclMode revoke_privs,
+ Oid ownerId, DropBehavior behavior);
+
+static AclMode convert_priv_string(text *priv_type_text);
+static AclMode convert_any_priv_string(text *priv_type_text,
+ const priv_map *privileges);
+
+static Oid convert_table_name(text *tablename);
+static AclMode convert_table_priv_string(text *priv_type_text);
+static AclMode convert_sequence_priv_string(text *priv_type_text);
+static AttrNumber convert_column_name(Oid tableoid, text *column);
+static AclMode convert_column_priv_string(text *priv_type_text);
+static Oid convert_database_name(text *databasename);
+static AclMode convert_database_priv_string(text *priv_type_text);
+static Oid convert_foreign_data_wrapper_name(text *fdwname);
+static AclMode convert_foreign_data_wrapper_priv_string(text *priv_type_text);
+static Oid convert_function_name(text *functionname);
+static AclMode convert_function_priv_string(text *priv_type_text);
+static Oid convert_language_name(text *languagename);
+static AclMode convert_language_priv_string(text *priv_type_text);
+static Oid convert_schema_name(text *schemaname);
+static AclMode convert_schema_priv_string(text *priv_type_text);
+static Oid convert_server_name(text *servername);
+static AclMode convert_server_priv_string(text *priv_type_text);
+static Oid convert_tablespace_name(text *tablespacename);
+static AclMode convert_tablespace_priv_string(text *priv_type_text);
+static Oid convert_type_name(text *typename);
+static AclMode convert_type_priv_string(text *priv_type_text);
+static AclMode convert_parameter_priv_string(text *priv_text);
+static AclMode convert_role_priv_string(text *priv_type_text);
+static AclResult pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode);
+
+static void RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue);
+
+
+/*
+ * getid
+ * Consumes the first alphanumeric string (identifier) found in string
+ * 's', ignoring any leading white space. If it finds a double quote
+ * it returns the word inside the quotes.
+ *
+ * RETURNS:
+ * the string position in 's' that points to the next non-space character
+ * in 's', after any quotes. Also:
+ * - loads the identifier into 'n'. (If no identifier is found, 'n'
+ * contains an empty string.) 'n' must be NAMEDATALEN bytes.
+ */
+static const char *
+getid(const char *s, char *n)
+{
+ int len = 0;
+ bool in_quotes = false;
+
+ Assert(s && n);
+
+ while (isspace((unsigned char) *s))
+ s++;
+ /* This code had better match what putid() does, below */
+ for (;
+ *s != '\0' &&
+ (isalnum((unsigned char) *s) ||
+ *s == '_' ||
+ *s == '"' ||
+ in_quotes);
+ s++)
+ {
+ if (*s == '"')
+ {
+ /* safe to look at next char (could be '\0' though) */
+ if (*(s + 1) != '"')
+ {
+ in_quotes = !in_quotes;
+ continue;
+ }
+ /* it's an escaped double quote; skip the escaping char */
+ s++;
+ }
+
+ /* Add the character to the string */
+ if (len >= NAMEDATALEN - 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_NAME_TOO_LONG),
+ errmsg("identifier too long"),
+ errdetail("Identifier must be less than %d characters.",
+ NAMEDATALEN)));
+
+ n[len++] = *s;
+ }
+ n[len] = '\0';
+ while (isspace((unsigned char) *s))
+ s++;
+ return s;
+}
+
+/*
+ * Write a role name at *p, adding double quotes if needed.
+ * There must be at least (2*NAMEDATALEN)+2 bytes available at *p.
+ * This needs to be kept in sync with copyAclUserName in pg_dump/dumputils.c
+ */
+static void
+putid(char *p, const char *s)
+{
+ const char *src;
+ bool safe = true;
+
+ for (src = s; *src; src++)
+ {
+ /* This test had better match what getid() does, above */
+ if (!isalnum((unsigned char) *src) && *src != '_')
+ {
+ safe = false;
+ break;
+ }
+ }
+ if (!safe)
+ *p++ = '"';
+ for (src = s; *src; src++)
+ {
+ /* A double quote character in a username is encoded as "" */
+ if (*src == '"')
+ *p++ = '"';
+ *p++ = *src;
+ }
+ if (!safe)
+ *p++ = '"';
+ *p = '\0';
+}
+
+/*
+ * aclparse
+ * Consumes and parses an ACL specification of the form:
+ * [group|user] [A-Za-z0-9]*=[rwaR]*
+ * from string 's', ignoring any leading white space or white space
+ * between the optional id type keyword (group|user) and the actual
+ * ACL specification.
+ *
+ * The group|user decoration is unnecessary in the roles world,
+ * but we still accept it for backward compatibility.
+ *
+ * This routine is called by the parser as well as aclitemin(), hence
+ * the added generality.
+ *
+ * RETURNS:
+ * the string position in 's' immediately following the ACL
+ * specification. Also:
+ * - loads the structure pointed to by 'aip' with the appropriate
+ * UID/GID, id type identifier and mode type values.
+ */
+static const char *
+aclparse(const char *s, AclItem *aip)
+{
+ AclMode privs,
+ goption,
+ read;
+ char name[NAMEDATALEN];
+ char name2[NAMEDATALEN];
+
+ Assert(s && aip);
+
+ s = getid(s, name);
+ if (*s != '=')
+ {
+ /* we just read a keyword, not a name */
+ if (strcmp(name, "group") != 0 && strcmp(name, "user") != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("unrecognized key word: \"%s\"", name),
+ errhint("ACL key word must be \"group\" or \"user\".")));
+ s = getid(s, name); /* move s to the name beyond the keyword */
+ if (name[0] == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("missing name"),
+ errhint("A name must follow the \"group\" or \"user\" key word.")));
+ }
+
+ if (*s != '=')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("missing \"=\" sign")));
+
+ privs = goption = ACL_NO_RIGHTS;
+
+ for (++s, read = 0; isalpha((unsigned char) *s) || *s == '*'; s++)
+ {
+ switch (*s)
+ {
+ case '*':
+ goption |= read;
+ break;
+ case ACL_INSERT_CHR:
+ read = ACL_INSERT;
+ break;
+ case ACL_SELECT_CHR:
+ read = ACL_SELECT;
+ break;
+ case ACL_UPDATE_CHR:
+ read = ACL_UPDATE;
+ break;
+ case ACL_DELETE_CHR:
+ read = ACL_DELETE;
+ break;
+ case ACL_TRUNCATE_CHR:
+ read = ACL_TRUNCATE;
+ break;
+ case ACL_REFERENCES_CHR:
+ read = ACL_REFERENCES;
+ break;
+ case ACL_TRIGGER_CHR:
+ read = ACL_TRIGGER;
+ break;
+ case ACL_EXECUTE_CHR:
+ read = ACL_EXECUTE;
+ break;
+ case ACL_USAGE_CHR:
+ read = ACL_USAGE;
+ break;
+ case ACL_CREATE_CHR:
+ read = ACL_CREATE;
+ break;
+ case ACL_CREATE_TEMP_CHR:
+ read = ACL_CREATE_TEMP;
+ break;
+ case ACL_CONNECT_CHR:
+ read = ACL_CONNECT;
+ break;
+ case ACL_SET_CHR:
+ read = ACL_SET;
+ break;
+ case ACL_ALTER_SYSTEM_CHR:
+ read = ACL_ALTER_SYSTEM;
+ break;
+ case 'R': /* ignore old RULE privileges */
+ read = 0;
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid mode character: must be one of \"%s\"",
+ ACL_ALL_RIGHTS_STR)));
+ }
+
+ privs |= read;
+ }
+
+ if (name[0] == '\0')
+ aip->ai_grantee = ACL_ID_PUBLIC;
+ else
+ aip->ai_grantee = get_role_oid(name, false);
+
+ /*
+ * XXX Allow a degree of backward compatibility by defaulting the grantor
+ * to the superuser.
+ */
+ if (*s == '/')
+ {
+ s = getid(s + 1, name2);
+ if (name2[0] == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("a name must follow the \"/\" sign")));
+ aip->ai_grantor = get_role_oid(name2, false);
+ }
+ else
+ {
+ aip->ai_grantor = BOOTSTRAP_SUPERUSERID;
+ ereport(WARNING,
+ (errcode(ERRCODE_INVALID_GRANTOR),
+ errmsg("defaulting grantor to user ID %u",
+ BOOTSTRAP_SUPERUSERID)));
+ }
+
+ ACLITEM_SET_PRIVS_GOPTIONS(*aip, privs, goption);
+
+ return s;
+}
+
+/*
+ * allocacl
+ * Allocates storage for a new Acl with 'n' entries.
+ *
+ * RETURNS:
+ * the new Acl
+ */
+static Acl *
+allocacl(int n)
+{
+ Acl *new_acl;
+ Size size;
+
+ if (n < 0)
+ elog(ERROR, "invalid size: %d", n);
+ size = ACL_N_SIZE(n);
+ new_acl = (Acl *) palloc0(size);
+ SET_VARSIZE(new_acl, size);
+ new_acl->ndim = 1;
+ new_acl->dataoffset = 0; /* we never put in any nulls */
+ new_acl->elemtype = ACLITEMOID;
+ ARR_LBOUND(new_acl)[0] = 1;
+ ARR_DIMS(new_acl)[0] = n;
+ return new_acl;
+}
+
+/*
+ * Create a zero-entry ACL
+ */
+Acl *
+make_empty_acl(void)
+{
+ return allocacl(0);
+}
+
+/*
+ * Copy an ACL
+ */
+Acl *
+aclcopy(const Acl *orig_acl)
+{
+ Acl *result_acl;
+
+ result_acl = allocacl(ACL_NUM(orig_acl));
+
+ memcpy(ACL_DAT(result_acl),
+ ACL_DAT(orig_acl),
+ ACL_NUM(orig_acl) * sizeof(AclItem));
+
+ return result_acl;
+}
+
+/*
+ * Concatenate two ACLs
+ *
+ * This is a bit cheesy, since we may produce an ACL with redundant entries.
+ * Be careful what the result is used for!
+ */
+Acl *
+aclconcat(const Acl *left_acl, const Acl *right_acl)
+{
+ Acl *result_acl;
+
+ result_acl = allocacl(ACL_NUM(left_acl) + ACL_NUM(right_acl));
+
+ memcpy(ACL_DAT(result_acl),
+ ACL_DAT(left_acl),
+ ACL_NUM(left_acl) * sizeof(AclItem));
+
+ memcpy(ACL_DAT(result_acl) + ACL_NUM(left_acl),
+ ACL_DAT(right_acl),
+ ACL_NUM(right_acl) * sizeof(AclItem));
+
+ return result_acl;
+}
+
+/*
+ * Merge two ACLs
+ *
+ * This produces a properly merged ACL with no redundant entries.
+ * Returns NULL on NULL input.
+ */
+Acl *
+aclmerge(const Acl *left_acl, const Acl *right_acl, Oid ownerId)
+{
+ Acl *result_acl;
+ AclItem *aip;
+ int i,
+ num;
+
+ /* Check for cases where one or both are empty/null */
+ if (left_acl == NULL || ACL_NUM(left_acl) == 0)
+ {
+ if (right_acl == NULL || ACL_NUM(right_acl) == 0)
+ return NULL;
+ else
+ return aclcopy(right_acl);
+ }
+ else
+ {
+ if (right_acl == NULL || ACL_NUM(right_acl) == 0)
+ return aclcopy(left_acl);
+ }
+
+ /* Merge them the hard way, one item at a time */
+ result_acl = aclcopy(left_acl);
+
+ aip = ACL_DAT(right_acl);
+ num = ACL_NUM(right_acl);
+
+ for (i = 0; i < num; i++, aip++)
+ {
+ Acl *tmp_acl;
+
+ tmp_acl = aclupdate(result_acl, aip, ACL_MODECHG_ADD,
+ ownerId, DROP_RESTRICT);
+ pfree(result_acl);
+ result_acl = tmp_acl;
+ }
+
+ return result_acl;
+}
+
+/*
+ * Sort the items in an ACL (into an arbitrary but consistent order)
+ */
+void
+aclitemsort(Acl *acl)
+{
+ if (acl != NULL && ACL_NUM(acl) > 1)
+ qsort(ACL_DAT(acl), ACL_NUM(acl), sizeof(AclItem), aclitemComparator);
+}
+
+/*
+ * Check if two ACLs are exactly equal
+ *
+ * This will not detect equality if the two arrays contain the same items
+ * in different orders. To handle that case, sort both inputs first,
+ * using aclitemsort().
+ */
+bool
+aclequal(const Acl *left_acl, const Acl *right_acl)
+{
+ /* Check for cases where one or both are empty/null */
+ if (left_acl == NULL || ACL_NUM(left_acl) == 0)
+ {
+ if (right_acl == NULL || ACL_NUM(right_acl) == 0)
+ return true;
+ else
+ return false;
+ }
+ else
+ {
+ if (right_acl == NULL || ACL_NUM(right_acl) == 0)
+ return false;
+ }
+
+ if (ACL_NUM(left_acl) != ACL_NUM(right_acl))
+ return false;
+
+ if (memcmp(ACL_DAT(left_acl),
+ ACL_DAT(right_acl),
+ ACL_NUM(left_acl) * sizeof(AclItem)) == 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * Verify that an ACL array is acceptable (one-dimensional and has no nulls)
+ */
+static void
+check_acl(const Acl *acl)
+{
+ if (ARR_ELEMTYPE(acl) != ACLITEMOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("ACL array contains wrong data type")));
+ if (ARR_NDIM(acl) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("ACL arrays must be one-dimensional")));
+ if (ARR_HASNULL(acl))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("ACL arrays must not contain null values")));
+}
+
+/*
+ * aclitemin
+ * Allocates storage for, and fills in, a new AclItem given a string
+ * 's' that contains an ACL specification. See aclparse for details.
+ *
+ * RETURNS:
+ * the new AclItem
+ */
+Datum
+aclitemin(PG_FUNCTION_ARGS)
+{
+ const char *s = PG_GETARG_CSTRING(0);
+ AclItem *aip;
+
+ aip = (AclItem *) palloc(sizeof(AclItem));
+ s = aclparse(s, aip);
+ while (isspace((unsigned char) *s))
+ ++s;
+ if (*s)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("extra garbage at the end of the ACL specification")));
+
+ PG_RETURN_ACLITEM_P(aip);
+}
+
+/*
+ * aclitemout
+ * Allocates storage for, and fills in, a new null-delimited string
+ * containing a formatted ACL specification. See aclparse for details.
+ *
+ * RETURNS:
+ * the new string
+ */
+Datum
+aclitemout(PG_FUNCTION_ARGS)
+{
+ AclItem *aip = PG_GETARG_ACLITEM_P(0);
+ char *p;
+ char *out;
+ HeapTuple htup;
+ unsigned i;
+
+ out = palloc(strlen("=/") +
+ 2 * N_ACL_RIGHTS +
+ 2 * (2 * NAMEDATALEN + 2) +
+ 1);
+
+ p = out;
+ *p = '\0';
+
+ if (aip->ai_grantee != ACL_ID_PUBLIC)
+ {
+ htup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(aip->ai_grantee));
+ if (HeapTupleIsValid(htup))
+ {
+ putid(p, NameStr(((Form_pg_authid) GETSTRUCT(htup))->rolname));
+ ReleaseSysCache(htup);
+ }
+ else
+ {
+ /* Generate numeric OID if we don't find an entry */
+ sprintf(p, "%u", aip->ai_grantee);
+ }
+ }
+ while (*p)
+ ++p;
+
+ *p++ = '=';
+
+ for (i = 0; i < N_ACL_RIGHTS; ++i)
+ {
+ if (ACLITEM_GET_PRIVS(*aip) & (1 << i))
+ *p++ = ACL_ALL_RIGHTS_STR[i];
+ if (ACLITEM_GET_GOPTIONS(*aip) & (1 << i))
+ *p++ = '*';
+ }
+
+ *p++ = '/';
+ *p = '\0';
+
+ htup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(aip->ai_grantor));
+ if (HeapTupleIsValid(htup))
+ {
+ putid(p, NameStr(((Form_pg_authid) GETSTRUCT(htup))->rolname));
+ ReleaseSysCache(htup);
+ }
+ else
+ {
+ /* Generate numeric OID if we don't find an entry */
+ sprintf(p, "%u", aip->ai_grantor);
+ }
+
+ PG_RETURN_CSTRING(out);
+}
+
+/*
+ * aclitem_match
+ * Two AclItems are considered to match iff they have the same
+ * grantee and grantor; the privileges are ignored.
+ */
+static bool
+aclitem_match(const AclItem *a1, const AclItem *a2)
+{
+ return a1->ai_grantee == a2->ai_grantee &&
+ a1->ai_grantor == a2->ai_grantor;
+}
+
+/*
+ * aclitemComparator
+ * qsort comparison function for AclItems
+ */
+static int
+aclitemComparator(const void *arg1, const void *arg2)
+{
+ const AclItem *a1 = (const AclItem *) arg1;
+ const AclItem *a2 = (const AclItem *) arg2;
+
+ if (a1->ai_grantee > a2->ai_grantee)
+ return 1;
+ if (a1->ai_grantee < a2->ai_grantee)
+ return -1;
+ if (a1->ai_grantor > a2->ai_grantor)
+ return 1;
+ if (a1->ai_grantor < a2->ai_grantor)
+ return -1;
+ if (a1->ai_privs > a2->ai_privs)
+ return 1;
+ if (a1->ai_privs < a2->ai_privs)
+ return -1;
+ return 0;
+}
+
+/*
+ * aclitem equality operator
+ */
+Datum
+aclitem_eq(PG_FUNCTION_ARGS)
+{
+ AclItem *a1 = PG_GETARG_ACLITEM_P(0);
+ AclItem *a2 = PG_GETARG_ACLITEM_P(1);
+ bool result;
+
+ result = a1->ai_privs == a2->ai_privs &&
+ a1->ai_grantee == a2->ai_grantee &&
+ a1->ai_grantor == a2->ai_grantor;
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * aclitem hash function
+ *
+ * We make aclitems hashable not so much because anyone is likely to hash
+ * them, as because we want array equality to work on aclitem arrays, and
+ * with the typcache mechanism we must have a hash or btree opclass.
+ */
+Datum
+hash_aclitem(PG_FUNCTION_ARGS)
+{
+ AclItem *a = PG_GETARG_ACLITEM_P(0);
+
+ /* not very bright, but avoids any issue of padding in struct */
+ PG_RETURN_UINT32((uint32) (a->ai_privs + a->ai_grantee + a->ai_grantor));
+}
+
+/*
+ * 64-bit hash function for aclitem.
+ *
+ * Similar to hash_aclitem, but accepts a seed and returns a uint64 value.
+ */
+Datum
+hash_aclitem_extended(PG_FUNCTION_ARGS)
+{
+ AclItem *a = PG_GETARG_ACLITEM_P(0);
+ uint64 seed = PG_GETARG_INT64(1);
+ uint32 sum = (uint32) (a->ai_privs + a->ai_grantee + a->ai_grantor);
+
+ return (seed == 0) ? UInt64GetDatum(sum) : hash_uint32_extended(sum, seed);
+}
+
+/*
+ * acldefault() --- create an ACL describing default access permissions
+ *
+ * Change this routine if you want to alter the default access policy for
+ * newly-created objects (or any object with a NULL acl entry). When
+ * you make a change here, don't forget to update the GRANT man page,
+ * which explains all the default permissions.
+ *
+ * Note that these are the hard-wired "defaults" that are used in the
+ * absence of any pg_default_acl entry.
+ */
+Acl *
+acldefault(ObjectType objtype, Oid ownerId)
+{
+ AclMode world_default;
+ AclMode owner_default;
+ int nacl;
+ Acl *acl;
+ AclItem *aip;
+
+ switch (objtype)
+ {
+ case OBJECT_COLUMN:
+ /* by default, columns have no extra privileges */
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_NO_RIGHTS;
+ break;
+ case OBJECT_TABLE:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_RELATION;
+ break;
+ case OBJECT_SEQUENCE:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_SEQUENCE;
+ break;
+ case OBJECT_DATABASE:
+ /* for backwards compatibility, grant some rights by default */
+ world_default = ACL_CREATE_TEMP | ACL_CONNECT;
+ owner_default = ACL_ALL_RIGHTS_DATABASE;
+ break;
+ case OBJECT_FUNCTION:
+ /* Grant EXECUTE by default, for now */
+ world_default = ACL_EXECUTE;
+ owner_default = ACL_ALL_RIGHTS_FUNCTION;
+ break;
+ case OBJECT_LANGUAGE:
+ /* Grant USAGE by default, for now */
+ world_default = ACL_USAGE;
+ owner_default = ACL_ALL_RIGHTS_LANGUAGE;
+ break;
+ case OBJECT_LARGEOBJECT:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_LARGEOBJECT;
+ break;
+ case OBJECT_SCHEMA:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_SCHEMA;
+ break;
+ case OBJECT_TABLESPACE:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_TABLESPACE;
+ break;
+ case OBJECT_FDW:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_FDW;
+ break;
+ case OBJECT_FOREIGN_SERVER:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_FOREIGN_SERVER;
+ break;
+ case OBJECT_DOMAIN:
+ case OBJECT_TYPE:
+ world_default = ACL_USAGE;
+ owner_default = ACL_ALL_RIGHTS_TYPE;
+ break;
+ case OBJECT_PARAMETER_ACL:
+ world_default = ACL_NO_RIGHTS;
+ owner_default = ACL_ALL_RIGHTS_PARAMETER_ACL;
+ break;
+ default:
+ elog(ERROR, "unrecognized objtype: %d", (int) objtype);
+ world_default = ACL_NO_RIGHTS; /* keep compiler quiet */
+ owner_default = ACL_NO_RIGHTS;
+ break;
+ }
+
+ nacl = 0;
+ if (world_default != ACL_NO_RIGHTS)
+ nacl++;
+ if (owner_default != ACL_NO_RIGHTS)
+ nacl++;
+
+ acl = allocacl(nacl);
+ aip = ACL_DAT(acl);
+
+ if (world_default != ACL_NO_RIGHTS)
+ {
+ aip->ai_grantee = ACL_ID_PUBLIC;
+ aip->ai_grantor = ownerId;
+ ACLITEM_SET_PRIVS_GOPTIONS(*aip, world_default, ACL_NO_RIGHTS);
+ aip++;
+ }
+
+ /*
+ * Note that the owner's entry shows all ordinary privileges but no grant
+ * options. This is because his grant options come "from the system" and
+ * not from his own efforts. (The SQL spec says that the owner's rights
+ * come from a "_SYSTEM" authid.) However, we do consider that the
+ * owner's ordinary privileges are self-granted; this lets him revoke
+ * them. We implement the owner's grant options without any explicit
+ * "_SYSTEM"-like ACL entry, by internally special-casing the owner
+ * wherever we are testing grant options.
+ */
+ if (owner_default != ACL_NO_RIGHTS)
+ {
+ aip->ai_grantee = ownerId;
+ aip->ai_grantor = ownerId;
+ ACLITEM_SET_PRIVS_GOPTIONS(*aip, owner_default, ACL_NO_RIGHTS);
+ }
+
+ return acl;
+}
+
+
+/*
+ * SQL-accessible version of acldefault(). Hackish mapping from "char" type to
+ * OBJECT_* values.
+ */
+Datum
+acldefault_sql(PG_FUNCTION_ARGS)
+{
+ char objtypec = PG_GETARG_CHAR(0);
+ Oid owner = PG_GETARG_OID(1);
+ ObjectType objtype = 0;
+
+ switch (objtypec)
+ {
+ case 'c':
+ objtype = OBJECT_COLUMN;
+ break;
+ case 'r':
+ objtype = OBJECT_TABLE;
+ break;
+ case 's':
+ objtype = OBJECT_SEQUENCE;
+ break;
+ case 'd':
+ objtype = OBJECT_DATABASE;
+ break;
+ case 'f':
+ objtype = OBJECT_FUNCTION;
+ break;
+ case 'l':
+ objtype = OBJECT_LANGUAGE;
+ break;
+ case 'L':
+ objtype = OBJECT_LARGEOBJECT;
+ break;
+ case 'n':
+ objtype = OBJECT_SCHEMA;
+ break;
+ case 'p':
+ objtype = OBJECT_PARAMETER_ACL;
+ break;
+ case 't':
+ objtype = OBJECT_TABLESPACE;
+ break;
+ case 'F':
+ objtype = OBJECT_FDW;
+ break;
+ case 'S':
+ objtype = OBJECT_FOREIGN_SERVER;
+ break;
+ case 'T':
+ objtype = OBJECT_TYPE;
+ break;
+ default:
+ elog(ERROR, "unrecognized objtype abbreviation: %c", objtypec);
+ }
+
+ PG_RETURN_ACL_P(acldefault(objtype, owner));
+}
+
+
+/*
+ * Update an ACL array to add or remove specified privileges.
+ *
+ * old_acl: the input ACL array
+ * mod_aip: defines the privileges to be added, removed, or substituted
+ * modechg: ACL_MODECHG_ADD, ACL_MODECHG_DEL, or ACL_MODECHG_EQL
+ * ownerId: Oid of object owner
+ * behavior: RESTRICT or CASCADE behavior for recursive removal
+ *
+ * ownerid and behavior are only relevant when the update operation specifies
+ * deletion of grant options.
+ *
+ * The result is a modified copy; the input object is not changed.
+ *
+ * NB: caller is responsible for having detoasted the input ACL, if needed.
+ */
+Acl *
+aclupdate(const Acl *old_acl, const AclItem *mod_aip,
+ int modechg, Oid ownerId, DropBehavior behavior)
+{
+ Acl *new_acl = NULL;
+ AclItem *old_aip,
+ *new_aip = NULL;
+ AclMode old_rights,
+ old_goptions,
+ new_rights,
+ new_goptions;
+ int dst,
+ num;
+
+ /* Caller probably already checked old_acl, but be safe */
+ check_acl(old_acl);
+
+ /* If granting grant options, check for circularity */
+ if (modechg != ACL_MODECHG_DEL &&
+ ACLITEM_GET_GOPTIONS(*mod_aip) != ACL_NO_RIGHTS)
+ check_circularity(old_acl, mod_aip, ownerId);
+
+ num = ACL_NUM(old_acl);
+ old_aip = ACL_DAT(old_acl);
+
+ /*
+ * Search the ACL for an existing entry for this grantee and grantor. If
+ * one exists, just modify the entry in-place (well, in the same position,
+ * since we actually return a copy); otherwise, insert the new entry at
+ * the end.
+ */
+
+ for (dst = 0; dst < num; ++dst)
+ {
+ if (aclitem_match(mod_aip, old_aip + dst))
+ {
+ /* found a match, so modify existing item */
+ new_acl = allocacl(num);
+ new_aip = ACL_DAT(new_acl);
+ memcpy(new_acl, old_acl, ACL_SIZE(old_acl));
+ break;
+ }
+ }
+
+ if (dst == num)
+ {
+ /* need to append a new item */
+ new_acl = allocacl(num + 1);
+ new_aip = ACL_DAT(new_acl);
+ memcpy(new_aip, old_aip, num * sizeof(AclItem));
+
+ /* initialize the new entry with no permissions */
+ new_aip[dst].ai_grantee = mod_aip->ai_grantee;
+ new_aip[dst].ai_grantor = mod_aip->ai_grantor;
+ ACLITEM_SET_PRIVS_GOPTIONS(new_aip[dst],
+ ACL_NO_RIGHTS, ACL_NO_RIGHTS);
+ num++; /* set num to the size of new_acl */
+ }
+
+ old_rights = ACLITEM_GET_RIGHTS(new_aip[dst]);
+ old_goptions = ACLITEM_GET_GOPTIONS(new_aip[dst]);
+
+ /* apply the specified permissions change */
+ switch (modechg)
+ {
+ case ACL_MODECHG_ADD:
+ ACLITEM_SET_RIGHTS(new_aip[dst],
+ old_rights | ACLITEM_GET_RIGHTS(*mod_aip));
+ break;
+ case ACL_MODECHG_DEL:
+ ACLITEM_SET_RIGHTS(new_aip[dst],
+ old_rights & ~ACLITEM_GET_RIGHTS(*mod_aip));
+ break;
+ case ACL_MODECHG_EQL:
+ ACLITEM_SET_RIGHTS(new_aip[dst],
+ ACLITEM_GET_RIGHTS(*mod_aip));
+ break;
+ }
+
+ new_rights = ACLITEM_GET_RIGHTS(new_aip[dst]);
+ new_goptions = ACLITEM_GET_GOPTIONS(new_aip[dst]);
+
+ /*
+ * If the adjusted entry has no permissions, delete it from the list.
+ */
+ if (new_rights == ACL_NO_RIGHTS)
+ {
+ memmove(new_aip + dst,
+ new_aip + dst + 1,
+ (num - dst - 1) * sizeof(AclItem));
+ /* Adjust array size to be 'num - 1' items */
+ ARR_DIMS(new_acl)[0] = num - 1;
+ SET_VARSIZE(new_acl, ACL_N_SIZE(num - 1));
+ }
+
+ /*
+ * Remove abandoned privileges (cascading revoke). Currently we can only
+ * handle this when the grantee is not PUBLIC.
+ */
+ if ((old_goptions & ~new_goptions) != 0)
+ {
+ Assert(mod_aip->ai_grantee != ACL_ID_PUBLIC);
+ new_acl = recursive_revoke(new_acl, mod_aip->ai_grantee,
+ (old_goptions & ~new_goptions),
+ ownerId, behavior);
+ }
+
+ return new_acl;
+}
+
+/*
+ * Update an ACL array to reflect a change of owner to the parent object
+ *
+ * old_acl: the input ACL array (must not be NULL)
+ * oldOwnerId: Oid of the old object owner
+ * newOwnerId: Oid of the new object owner
+ *
+ * The result is a modified copy; the input object is not changed.
+ *
+ * NB: caller is responsible for having detoasted the input ACL, if needed.
+ */
+Acl *
+aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
+{
+ Acl *new_acl;
+ AclItem *new_aip;
+ AclItem *old_aip;
+ AclItem *dst_aip;
+ AclItem *src_aip;
+ AclItem *targ_aip;
+ bool newpresent = false;
+ int dst,
+ src,
+ targ,
+ num;
+
+ check_acl(old_acl);
+
+ /*
+ * Make a copy of the given ACL, substituting new owner ID for old
+ * wherever it appears as either grantor or grantee. Also note if the new
+ * owner ID is already present.
+ */
+ num = ACL_NUM(old_acl);
+ old_aip = ACL_DAT(old_acl);
+ new_acl = allocacl(num);
+ new_aip = ACL_DAT(new_acl);
+ memcpy(new_aip, old_aip, num * sizeof(AclItem));
+ for (dst = 0, dst_aip = new_aip; dst < num; dst++, dst_aip++)
+ {
+ if (dst_aip->ai_grantor == oldOwnerId)
+ dst_aip->ai_grantor = newOwnerId;
+ else if (dst_aip->ai_grantor == newOwnerId)
+ newpresent = true;
+ if (dst_aip->ai_grantee == oldOwnerId)
+ dst_aip->ai_grantee = newOwnerId;
+ else if (dst_aip->ai_grantee == newOwnerId)
+ newpresent = true;
+ }
+
+ /*
+ * If the old ACL contained any references to the new owner, then we may
+ * now have generated an ACL containing duplicate entries. Find them and
+ * merge them so that there are not duplicates. (This is relatively
+ * expensive since we use a stupid O(N^2) algorithm, but it's unlikely to
+ * be the normal case.)
+ *
+ * To simplify deletion of duplicate entries, we temporarily leave them in
+ * the array but set their privilege masks to zero; when we reach such an
+ * entry it's just skipped. (Thus, a side effect of this code will be to
+ * remove privilege-free entries, should there be any in the input.) dst
+ * is the next output slot, targ is the currently considered input slot
+ * (always >= dst), and src scans entries to the right of targ looking for
+ * duplicates. Once an entry has been emitted to dst it is known
+ * duplicate-free and need not be considered anymore.
+ */
+ if (newpresent)
+ {
+ dst = 0;
+ for (targ = 0, targ_aip = new_aip; targ < num; targ++, targ_aip++)
+ {
+ /* ignore if deleted in an earlier pass */
+ if (ACLITEM_GET_RIGHTS(*targ_aip) == ACL_NO_RIGHTS)
+ continue;
+ /* find and merge any duplicates */
+ for (src = targ + 1, src_aip = targ_aip + 1; src < num;
+ src++, src_aip++)
+ {
+ if (ACLITEM_GET_RIGHTS(*src_aip) == ACL_NO_RIGHTS)
+ continue;
+ if (aclitem_match(targ_aip, src_aip))
+ {
+ ACLITEM_SET_RIGHTS(*targ_aip,
+ ACLITEM_GET_RIGHTS(*targ_aip) |
+ ACLITEM_GET_RIGHTS(*src_aip));
+ /* mark the duplicate deleted */
+ ACLITEM_SET_RIGHTS(*src_aip, ACL_NO_RIGHTS);
+ }
+ }
+ /* and emit to output */
+ new_aip[dst] = *targ_aip;
+ dst++;
+ }
+ /* Adjust array size to be 'dst' items */
+ ARR_DIMS(new_acl)[0] = dst;
+ SET_VARSIZE(new_acl, ACL_N_SIZE(dst));
+ }
+
+ return new_acl;
+}
+
+
+/*
+ * When granting grant options, we must disallow attempts to set up circular
+ * chains of grant options. Suppose A (the object owner) grants B some
+ * privileges with grant option, and B re-grants them to C. If C could
+ * grant the privileges to B as well, then A would be unable to effectively
+ * revoke the privileges from B, since recursive_revoke would consider that
+ * B still has 'em from C.
+ *
+ * We check for this by recursively deleting all grant options belonging to
+ * the target grantee, and then seeing if the would-be grantor still has the
+ * grant option or not.
+ */
+static void
+check_circularity(const Acl *old_acl, const AclItem *mod_aip,
+ Oid ownerId)
+{
+ Acl *acl;
+ AclItem *aip;
+ int i,
+ num;
+ AclMode own_privs;
+
+ check_acl(old_acl);
+
+ /*
+ * For now, grant options can only be granted to roles, not PUBLIC.
+ * Otherwise we'd have to work a bit harder here.
+ */
+ Assert(mod_aip->ai_grantee != ACL_ID_PUBLIC);
+
+ /* The owner always has grant options, no need to check */
+ if (mod_aip->ai_grantor == ownerId)
+ return;
+
+ /* Make a working copy */
+ acl = allocacl(ACL_NUM(old_acl));
+ memcpy(acl, old_acl, ACL_SIZE(old_acl));
+
+ /* Zap all grant options of target grantee, plus what depends on 'em */
+cc_restart:
+ num = ACL_NUM(acl);
+ aip = ACL_DAT(acl);
+ for (i = 0; i < num; i++)
+ {
+ if (aip[i].ai_grantee == mod_aip->ai_grantee &&
+ ACLITEM_GET_GOPTIONS(aip[i]) != ACL_NO_RIGHTS)
+ {
+ Acl *new_acl;
+
+ /* We'll actually zap ordinary privs too, but no matter */
+ new_acl = aclupdate(acl, &aip[i], ACL_MODECHG_DEL,
+ ownerId, DROP_CASCADE);
+
+ pfree(acl);
+ acl = new_acl;
+
+ goto cc_restart;
+ }
+ }
+
+ /* Now we can compute grantor's independently-derived privileges */
+ own_privs = aclmask(acl,
+ mod_aip->ai_grantor,
+ ownerId,
+ ACL_GRANT_OPTION_FOR(ACLITEM_GET_GOPTIONS(*mod_aip)),
+ ACLMASK_ALL);
+ own_privs = ACL_OPTION_TO_PRIVS(own_privs);
+
+ if ((ACLITEM_GET_GOPTIONS(*mod_aip) & ~own_privs) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_GRANT_OPERATION),
+ errmsg("grant options cannot be granted back to your own grantor")));
+
+ pfree(acl);
+}
+
+
+/*
+ * Ensure that no privilege is "abandoned". A privilege is abandoned
+ * if the user that granted the privilege loses the grant option. (So
+ * the chain through which it was granted is broken.) Either the
+ * abandoned privileges are revoked as well, or an error message is
+ * printed, depending on the drop behavior option.
+ *
+ * acl: the input ACL list
+ * grantee: the user from whom some grant options have been revoked
+ * revoke_privs: the grant options being revoked
+ * ownerId: Oid of object owner
+ * behavior: RESTRICT or CASCADE behavior for recursive removal
+ *
+ * The input Acl object is pfree'd if replaced.
+ */
+static Acl *
+recursive_revoke(Acl *acl,
+ Oid grantee,
+ AclMode revoke_privs,
+ Oid ownerId,
+ DropBehavior behavior)
+{
+ AclMode still_has;
+ AclItem *aip;
+ int i,
+ num;
+
+ check_acl(acl);
+
+ /* The owner can never truly lose grant options, so short-circuit */
+ if (grantee == ownerId)
+ return acl;
+
+ /* The grantee might still have some grant options via another grantor */
+ still_has = aclmask(acl, grantee, ownerId,
+ ACL_GRANT_OPTION_FOR(revoke_privs),
+ ACLMASK_ALL);
+ revoke_privs &= ~ACL_OPTION_TO_PRIVS(still_has);
+ if (revoke_privs == ACL_NO_RIGHTS)
+ return acl;
+
+restart:
+ num = ACL_NUM(acl);
+ aip = ACL_DAT(acl);
+ for (i = 0; i < num; i++)
+ {
+ if (aip[i].ai_grantor == grantee
+ && (ACLITEM_GET_PRIVS(aip[i]) & revoke_privs) != 0)
+ {
+ AclItem mod_acl;
+ Acl *new_acl;
+
+ if (behavior == DROP_RESTRICT)
+ ereport(ERROR,
+ (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
+ errmsg("dependent privileges exist"),
+ errhint("Use CASCADE to revoke them too.")));
+
+ mod_acl.ai_grantor = grantee;
+ mod_acl.ai_grantee = aip[i].ai_grantee;
+ ACLITEM_SET_PRIVS_GOPTIONS(mod_acl,
+ revoke_privs,
+ revoke_privs);
+
+ new_acl = aclupdate(acl, &mod_acl, ACL_MODECHG_DEL,
+ ownerId, behavior);
+
+ pfree(acl);
+ acl = new_acl;
+
+ goto restart;
+ }
+ }
+
+ return acl;
+}
+
+
+/*
+ * aclmask --- compute bitmask of all privileges held by roleid.
+ *
+ * When 'how' = ACLMASK_ALL, this simply returns the privilege bits
+ * held by the given roleid according to the given ACL list, ANDed
+ * with 'mask'. (The point of passing 'mask' is to let the routine
+ * exit early if all privileges of interest have been found.)
+ *
+ * When 'how' = ACLMASK_ANY, returns as soon as any bit in the mask
+ * is known true. (This lets us exit soonest in cases where the
+ * caller is only going to test for zero or nonzero result.)
+ *
+ * Usage patterns:
+ *
+ * To see if any of a set of privileges are held:
+ * if (aclmask(acl, roleid, ownerId, privs, ACLMASK_ANY) != 0)
+ *
+ * To see if all of a set of privileges are held:
+ * if (aclmask(acl, roleid, ownerId, privs, ACLMASK_ALL) == privs)
+ *
+ * To determine exactly which of a set of privileges are held:
+ * heldprivs = aclmask(acl, roleid, ownerId, privs, ACLMASK_ALL);
+ */
+AclMode
+aclmask(const Acl *acl, Oid roleid, Oid ownerId,
+ AclMode mask, AclMaskHow how)
+{
+ AclMode result;
+ AclMode remaining;
+ AclItem *aidat;
+ int i,
+ num;
+
+ /*
+ * Null ACL should not happen, since caller should have inserted
+ * appropriate default
+ */
+ if (acl == NULL)
+ elog(ERROR, "null ACL");
+
+ check_acl(acl);
+
+ /* Quick exit for mask == 0 */
+ if (mask == 0)
+ return 0;
+
+ result = 0;
+
+ /* Owner always implicitly has all grant options */
+ if ((mask & ACLITEM_ALL_GOPTION_BITS) &&
+ has_privs_of_role(roleid, ownerId))
+ {
+ result = mask & ACLITEM_ALL_GOPTION_BITS;
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
+ return result;
+ }
+
+ num = ACL_NUM(acl);
+ aidat = ACL_DAT(acl);
+
+ /*
+ * Check privileges granted directly to roleid or to public
+ */
+ for (i = 0; i < num; i++)
+ {
+ AclItem *aidata = &aidat[i];
+
+ if (aidata->ai_grantee == ACL_ID_PUBLIC ||
+ aidata->ai_grantee == roleid)
+ {
+ result |= aidata->ai_privs & mask;
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
+ return result;
+ }
+ }
+
+ /*
+ * Check privileges granted indirectly via role memberships. We do this in
+ * a separate pass to minimize expensive indirect membership tests. In
+ * particular, it's worth testing whether a given ACL entry grants any
+ * privileges still of interest before we perform the has_privs_of_role
+ * test.
+ */
+ remaining = mask & ~result;
+ for (i = 0; i < num; i++)
+ {
+ AclItem *aidata = &aidat[i];
+
+ if (aidata->ai_grantee == ACL_ID_PUBLIC ||
+ aidata->ai_grantee == roleid)
+ continue; /* already checked it */
+
+ if ((aidata->ai_privs & remaining) &&
+ has_privs_of_role(roleid, aidata->ai_grantee))
+ {
+ result |= aidata->ai_privs & mask;
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
+ return result;
+ remaining = mask & ~result;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * aclmask_direct --- compute bitmask of all privileges held by roleid.
+ *
+ * This is exactly like aclmask() except that we consider only privileges
+ * held *directly* by roleid, not those inherited via role membership.
+ */
+static AclMode
+aclmask_direct(const Acl *acl, Oid roleid, Oid ownerId,
+ AclMode mask, AclMaskHow how)
+{
+ AclMode result;
+ AclItem *aidat;
+ int i,
+ num;
+
+ /*
+ * Null ACL should not happen, since caller should have inserted
+ * appropriate default
+ */
+ if (acl == NULL)
+ elog(ERROR, "null ACL");
+
+ check_acl(acl);
+
+ /* Quick exit for mask == 0 */
+ if (mask == 0)
+ return 0;
+
+ result = 0;
+
+ /* Owner always implicitly has all grant options */
+ if ((mask & ACLITEM_ALL_GOPTION_BITS) &&
+ roleid == ownerId)
+ {
+ result = mask & ACLITEM_ALL_GOPTION_BITS;
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
+ return result;
+ }
+
+ num = ACL_NUM(acl);
+ aidat = ACL_DAT(acl);
+
+ /*
+ * Check privileges granted directly to roleid (and not to public)
+ */
+ for (i = 0; i < num; i++)
+ {
+ AclItem *aidata = &aidat[i];
+
+ if (aidata->ai_grantee == roleid)
+ {
+ result |= aidata->ai_privs & mask;
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
+ return result;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * aclmembers
+ * Find out all the roleids mentioned in an Acl.
+ * Note that we do not distinguish grantors from grantees.
+ *
+ * *roleids is set to point to a palloc'd array containing distinct OIDs
+ * in sorted order. The length of the array is the function result.
+ */
+int
+aclmembers(const Acl *acl, Oid **roleids)
+{
+ Oid *list;
+ const AclItem *acldat;
+ int i,
+ j;
+
+ if (acl == NULL || ACL_NUM(acl) == 0)
+ {
+ *roleids = NULL;
+ return 0;
+ }
+
+ check_acl(acl);
+
+ /* Allocate the worst-case space requirement */
+ list = palloc(ACL_NUM(acl) * 2 * sizeof(Oid));
+ acldat = ACL_DAT(acl);
+
+ /*
+ * Walk the ACL collecting mentioned RoleIds.
+ */
+ j = 0;
+ for (i = 0; i < ACL_NUM(acl); i++)
+ {
+ const AclItem *ai = &acldat[i];
+
+ if (ai->ai_grantee != ACL_ID_PUBLIC)
+ list[j++] = ai->ai_grantee;
+ /* grantor is currently never PUBLIC, but let's check anyway */
+ if (ai->ai_grantor != ACL_ID_PUBLIC)
+ list[j++] = ai->ai_grantor;
+ }
+
+ /* Sort the array */
+ qsort(list, j, sizeof(Oid), oid_cmp);
+
+ /*
+ * We could repalloc the array down to minimum size, but it's hardly worth
+ * it since it's only transient memory.
+ */
+ *roleids = list;
+
+ /* Remove duplicates from the array */
+ return qunique(list, j, sizeof(Oid), oid_cmp);
+}
+
+
+/*
+ * aclinsert (exported function)
+ */
+Datum
+aclinsert(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("aclinsert is no longer supported")));
+
+ PG_RETURN_NULL(); /* keep compiler quiet */
+}
+
+Datum
+aclremove(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("aclremove is no longer supported")));
+
+ PG_RETURN_NULL(); /* keep compiler quiet */
+}
+
+Datum
+aclcontains(PG_FUNCTION_ARGS)
+{
+ Acl *acl = PG_GETARG_ACL_P(0);
+ AclItem *aip = PG_GETARG_ACLITEM_P(1);
+ AclItem *aidat;
+ int i,
+ num;
+
+ check_acl(acl);
+ num = ACL_NUM(acl);
+ aidat = ACL_DAT(acl);
+ for (i = 0; i < num; ++i)
+ {
+ if (aip->ai_grantee == aidat[i].ai_grantee &&
+ aip->ai_grantor == aidat[i].ai_grantor &&
+ (ACLITEM_GET_RIGHTS(*aip) & ACLITEM_GET_RIGHTS(aidat[i])) == ACLITEM_GET_RIGHTS(*aip))
+ PG_RETURN_BOOL(true);
+ }
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+makeaclitem(PG_FUNCTION_ARGS)
+{
+ Oid grantee = PG_GETARG_OID(0);
+ Oid grantor = PG_GETARG_OID(1);
+ text *privtext = PG_GETARG_TEXT_PP(2);
+ bool goption = PG_GETARG_BOOL(3);
+ AclItem *result;
+ AclMode priv;
+
+ priv = convert_priv_string(privtext);
+
+ result = (AclItem *) palloc(sizeof(AclItem));
+
+ result->ai_grantee = grantee;
+ result->ai_grantor = grantor;
+
+ ACLITEM_SET_PRIVS_GOPTIONS(*result, priv,
+ (goption ? priv : ACL_NO_RIGHTS));
+
+ PG_RETURN_ACLITEM_P(result);
+}
+
+static AclMode
+convert_priv_string(text *priv_type_text)
+{
+ char *priv_type = text_to_cstring(priv_type_text);
+
+ if (pg_strcasecmp(priv_type, "SELECT") == 0)
+ return ACL_SELECT;
+ if (pg_strcasecmp(priv_type, "INSERT") == 0)
+ return ACL_INSERT;
+ if (pg_strcasecmp(priv_type, "UPDATE") == 0)
+ return ACL_UPDATE;
+ if (pg_strcasecmp(priv_type, "DELETE") == 0)
+ return ACL_DELETE;
+ if (pg_strcasecmp(priv_type, "TRUNCATE") == 0)
+ return ACL_TRUNCATE;
+ if (pg_strcasecmp(priv_type, "REFERENCES") == 0)
+ return ACL_REFERENCES;
+ if (pg_strcasecmp(priv_type, "TRIGGER") == 0)
+ return ACL_TRIGGER;
+ if (pg_strcasecmp(priv_type, "EXECUTE") == 0)
+ return ACL_EXECUTE;
+ if (pg_strcasecmp(priv_type, "USAGE") == 0)
+ return ACL_USAGE;
+ if (pg_strcasecmp(priv_type, "CREATE") == 0)
+ return ACL_CREATE;
+ if (pg_strcasecmp(priv_type, "TEMP") == 0)
+ return ACL_CREATE_TEMP;
+ if (pg_strcasecmp(priv_type, "TEMPORARY") == 0)
+ return ACL_CREATE_TEMP;
+ if (pg_strcasecmp(priv_type, "CONNECT") == 0)
+ return ACL_CONNECT;
+ if (pg_strcasecmp(priv_type, "SET") == 0)
+ return ACL_SET;
+ if (pg_strcasecmp(priv_type, "ALTER SYSTEM") == 0)
+ return ACL_ALTER_SYSTEM;
+ if (pg_strcasecmp(priv_type, "RULE") == 0)
+ return 0; /* ignore old RULE privileges */
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized privilege type: \"%s\"", priv_type)));
+ return ACL_NO_RIGHTS; /* keep compiler quiet */
+}
+
+
+/*
+ * convert_any_priv_string: recognize privilege strings for has_foo_privilege
+ *
+ * We accept a comma-separated list of case-insensitive privilege names,
+ * producing a bitmask of the OR'd privilege bits. We are liberal about
+ * whitespace between items, not so much about whitespace within items.
+ * The allowed privilege names are given as an array of priv_map structs,
+ * terminated by one with a NULL name pointer.
+ */
+static AclMode
+convert_any_priv_string(text *priv_type_text,
+ const priv_map *privileges)
+{
+ AclMode result = 0;
+ char *priv_type = text_to_cstring(priv_type_text);
+ char *chunk;
+ char *next_chunk;
+
+ /* We rely on priv_type being a private, modifiable string */
+ for (chunk = priv_type; chunk; chunk = next_chunk)
+ {
+ int chunk_len;
+ const priv_map *this_priv;
+
+ /* Split string at commas */
+ next_chunk = strchr(chunk, ',');
+ if (next_chunk)
+ *next_chunk++ = '\0';
+
+ /* Drop leading/trailing whitespace in this chunk */
+ while (*chunk && isspace((unsigned char) *chunk))
+ chunk++;
+ chunk_len = strlen(chunk);
+ while (chunk_len > 0 && isspace((unsigned char) chunk[chunk_len - 1]))
+ chunk_len--;
+ chunk[chunk_len] = '\0';
+
+ /* Match to the privileges list */
+ for (this_priv = privileges; this_priv->name; this_priv++)
+ {
+ if (pg_strcasecmp(this_priv->name, chunk) == 0)
+ {
+ result |= this_priv->value;
+ break;
+ }
+ }
+ if (!this_priv->name)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized privilege type: \"%s\"", chunk)));
+ }
+
+ pfree(priv_type);
+ return result;
+}
+
+
+static const char *
+convert_aclright_to_string(int aclright)
+{
+ switch (aclright)
+ {
+ case ACL_INSERT:
+ return "INSERT";
+ case ACL_SELECT:
+ return "SELECT";
+ case ACL_UPDATE:
+ return "UPDATE";
+ case ACL_DELETE:
+ return "DELETE";
+ case ACL_TRUNCATE:
+ return "TRUNCATE";
+ case ACL_REFERENCES:
+ return "REFERENCES";
+ case ACL_TRIGGER:
+ return "TRIGGER";
+ case ACL_EXECUTE:
+ return "EXECUTE";
+ case ACL_USAGE:
+ return "USAGE";
+ case ACL_CREATE:
+ return "CREATE";
+ case ACL_CREATE_TEMP:
+ return "TEMPORARY";
+ case ACL_CONNECT:
+ return "CONNECT";
+ case ACL_SET:
+ return "SET";
+ case ACL_ALTER_SYSTEM:
+ return "ALTER SYSTEM";
+ default:
+ elog(ERROR, "unrecognized aclright: %d", aclright);
+ return NULL;
+ }
+}
+
+
+/*----------
+ * Convert an aclitem[] to a table.
+ *
+ * Example:
+ *
+ * aclexplode('{=r/joe,foo=a*w/joe}'::aclitem[])
+ *
+ * returns the table
+ *
+ * {{ OID(joe), 0::OID, 'SELECT', false },
+ * { OID(joe), OID(foo), 'INSERT', true },
+ * { OID(joe), OID(foo), 'UPDATE', false }}
+ *----------
+ */
+Datum
+aclexplode(PG_FUNCTION_ARGS)
+{
+ Acl *acl = PG_GETARG_ACL_P(0);
+ FuncCallContext *funcctx;
+ int *idx;
+ AclItem *aidat;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ TupleDesc tupdesc;
+ MemoryContext oldcontext;
+
+ check_acl(acl);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /*
+ * build tupdesc for result tuples (matches out parameters in pg_proc
+ * entry)
+ */
+ tupdesc = CreateTemplateTupleDesc(4);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "grantor",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "grantee",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "privilege_type",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "is_grantable",
+ BOOLOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ /* allocate memory for user context */
+ idx = (int *) palloc(sizeof(int[2]));
+ idx[0] = 0; /* ACL array item index */
+ idx[1] = -1; /* privilege type counter */
+ funcctx->user_fctx = (void *) idx;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ idx = (int *) funcctx->user_fctx;
+ aidat = ACL_DAT(acl);
+
+ /* need test here in case acl has no items */
+ while (idx[0] < ACL_NUM(acl))
+ {
+ AclItem *aidata;
+ AclMode priv_bit;
+
+ idx[1]++;
+ if (idx[1] == N_ACL_RIGHTS)
+ {
+ idx[1] = 0;
+ idx[0]++;
+ if (idx[0] >= ACL_NUM(acl)) /* done */
+ break;
+ }
+ aidata = &aidat[idx[0]];
+ priv_bit = 1 << idx[1];
+
+ if (ACLITEM_GET_PRIVS(*aidata) & priv_bit)
+ {
+ Datum result;
+ Datum values[4];
+ bool nulls[4];
+ HeapTuple tuple;
+
+ values[0] = ObjectIdGetDatum(aidata->ai_grantor);
+ values[1] = ObjectIdGetDatum(aidata->ai_grantee);
+ values[2] = CStringGetTextDatum(convert_aclright_to_string(priv_bit));
+ values[3] = BoolGetDatum((ACLITEM_GET_GOPTIONS(*aidata) & priv_bit) != 0);
+
+ MemSet(nulls, 0, sizeof(nulls));
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/*
+ * has_table_privilege variants
+ * These are all named "has_table_privilege" at the SQL level.
+ * They take various combinations of relation name, relation OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not. The variants that take a relation OID
+ * return NULL if the OID doesn't exist (rather than failing, as
+ * they did before Postgres 8.4).
+ */
+
+/*
+ * has_table_privilege_name_name
+ * Check user privileges on a table given
+ * name username, text tablename, and text priv name.
+ */
+Datum
+has_table_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*rolename));
+ tableoid = convert_table_name(tablename);
+ mode = convert_table_priv_string(priv_type_text);
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_table_privilege_name
+ * Check user privileges on a table given
+ * text tablename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_table_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ tableoid = convert_table_name(tablename);
+ mode = convert_table_priv_string(priv_type_text);
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_table_privilege_name_id
+ * Check user privileges on a table given
+ * name usename, table oid, and text priv name.
+ */
+Datum
+has_table_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_table_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_table_privilege_id
+ * Check user privileges on a table given
+ * table oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_table_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid tableoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_table_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_table_privilege_id_name
+ * Check user privileges on a table given
+ * roleid, text tablename, and text priv name.
+ */
+Datum
+has_table_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ tableoid = convert_table_name(tablename);
+ mode = convert_table_priv_string(priv_type_text);
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_table_privilege_id_id
+ * Check user privileges on a table given
+ * roleid, table oid, and text priv name.
+ */
+Datum
+has_table_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_table_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_table_privilege family.
+ */
+
+/*
+ * Given a table name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_table_name(text *tablename)
+{
+ RangeVar *relrv;
+
+ relrv = makeRangeVarFromNameList(textToQualifiedNameList(tablename));
+
+ /* We might not even have permissions on this relation; don't lock it. */
+ return RangeVarGetRelid(relrv, NoLock, false);
+}
+
+/*
+ * convert_table_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_table_priv_string(text *priv_type_text)
+{
+ static const priv_map table_priv_map[] = {
+ {"SELECT", ACL_SELECT},
+ {"SELECT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_SELECT)},
+ {"INSERT", ACL_INSERT},
+ {"INSERT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_INSERT)},
+ {"UPDATE", ACL_UPDATE},
+ {"UPDATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_UPDATE)},
+ {"DELETE", ACL_DELETE},
+ {"DELETE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_DELETE)},
+ {"TRUNCATE", ACL_TRUNCATE},
+ {"TRUNCATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_TRUNCATE)},
+ {"REFERENCES", ACL_REFERENCES},
+ {"REFERENCES WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_REFERENCES)},
+ {"TRIGGER", ACL_TRIGGER},
+ {"TRIGGER WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_TRIGGER)},
+ {"RULE", 0}, /* ignore old RULE privileges */
+ {"RULE WITH GRANT OPTION", 0},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, table_priv_map);
+}
+
+/*
+ * has_sequence_privilege variants
+ * These are all named "has_sequence_privilege" at the SQL level.
+ * They take various combinations of relation name, relation OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not. The variants that take a relation OID
+ * return NULL if the OID doesn't exist.
+ */
+
+/*
+ * has_sequence_privilege_name_name
+ * Check user privileges on a sequence given
+ * name username, text sequencename, and text priv name.
+ */
+Datum
+has_sequence_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *sequencename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid sequenceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*rolename));
+ mode = convert_sequence_priv_string(priv_type_text);
+ sequenceoid = convert_table_name(sequencename);
+ if (get_rel_relkind(sequenceoid) != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ text_to_cstring(sequencename))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_sequence_privilege_name
+ * Check user privileges on a sequence given
+ * text sequencename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_sequence_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *sequencename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid sequenceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_sequence_priv_string(priv_type_text);
+ sequenceoid = convert_table_name(sequencename);
+ if (get_rel_relkind(sequenceoid) != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ text_to_cstring(sequencename))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_sequence_privilege_name_id
+ * Check user privileges on a sequence given
+ * name usename, sequence oid, and text priv name.
+ */
+Datum
+has_sequence_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid sequenceoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+ char relkind;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_sequence_priv_string(priv_type_text);
+ relkind = get_rel_relkind(sequenceoid);
+ if (relkind == '\0')
+ PG_RETURN_NULL();
+ else if (relkind != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ get_rel_name(sequenceoid))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_sequence_privilege_id
+ * Check user privileges on a sequence given
+ * sequence oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_sequence_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid sequenceoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+ char relkind;
+
+ roleid = GetUserId();
+ mode = convert_sequence_priv_string(priv_type_text);
+ relkind = get_rel_relkind(sequenceoid);
+ if (relkind == '\0')
+ PG_RETURN_NULL();
+ else if (relkind != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ get_rel_name(sequenceoid))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_sequence_privilege_id_name
+ * Check user privileges on a sequence given
+ * roleid, text sequencename, and text priv name.
+ */
+Datum
+has_sequence_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *sequencename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid sequenceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_sequence_priv_string(priv_type_text);
+ sequenceoid = convert_table_name(sequencename);
+ if (get_rel_relkind(sequenceoid) != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ text_to_cstring(sequencename))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_sequence_privilege_id_id
+ * Check user privileges on a sequence given
+ * roleid, sequence oid, and text priv name.
+ */
+Datum
+has_sequence_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid sequenceoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+ char relkind;
+
+ mode = convert_sequence_priv_string(priv_type_text);
+ relkind = get_rel_relkind(sequenceoid);
+ if (relkind == '\0')
+ PG_RETURN_NULL();
+ else if (relkind != RELKIND_SEQUENCE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a sequence",
+ get_rel_name(sequenceoid))));
+
+ aclresult = pg_class_aclcheck(sequenceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * convert_sequence_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_sequence_priv_string(text *priv_type_text)
+{
+ static const priv_map sequence_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {"SELECT", ACL_SELECT},
+ {"SELECT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_SELECT)},
+ {"UPDATE", ACL_UPDATE},
+ {"UPDATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_UPDATE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, sequence_priv_map);
+}
+
+
+/*
+ * has_any_column_privilege variants
+ * These are all named "has_any_column_privilege" at the SQL level.
+ * They take various combinations of relation name, relation OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege for any column of the table, false if not. The variants
+ * that take a relation OID return NULL if the OID doesn't exist.
+ */
+
+/*
+ * has_any_column_privilege_name_name
+ * Check user privileges on any column of a table given
+ * name username, text tablename, and text priv name.
+ */
+Datum
+has_any_column_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*rolename));
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_any_column_privilege_name
+ * Check user privileges on any column of a table given
+ * text tablename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_any_column_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_any_column_privilege_name_id
+ * Check user privileges on any column of a table given
+ * name usename, table oid, and text priv name.
+ */
+Datum
+has_any_column_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_column_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_any_column_privilege_id
+ * Check user privileges on any column of a table given
+ * table oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_any_column_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid tableoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_column_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_any_column_privilege_id_name
+ * Check user privileges on any column of a table given
+ * roleid, text tablename, and text priv name.
+ */
+Datum
+has_any_column_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid tableoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_any_column_privilege_id_id
+ * Check user privileges on any column of a table given
+ * roleid, table oid, and text priv name.
+ */
+Datum
+has_any_column_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_column_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
+ PG_RETURN_NULL();
+
+ /* First check at table level, then examine each column if needed */
+ aclresult = pg_class_aclcheck(tableoid, roleid, mode);
+ if (aclresult != ACLCHECK_OK)
+ aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode,
+ ACLMASK_ANY);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+
+/*
+ * has_column_privilege variants
+ * These are all named "has_column_privilege" at the SQL level.
+ * They take various combinations of relation name, relation OID,
+ * column name, column attnum, user name, user OID, or
+ * implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not. The variants that take a relation OID
+ * return NULL (rather than throwing an error) if that relation OID
+ * doesn't exist. Likewise, the variants that take an integer attnum
+ * return NULL (rather than throwing an error) if there is no such
+ * pg_attribute entry. All variants return NULL if an attisdropped
+ * column is selected. These rules are meant to avoid unnecessary
+ * failures in queries that scan pg_attribute.
+ */
+
+/*
+ * column_privilege_check: check column privileges, but don't throw an error
+ * for dropped column or table
+ *
+ * Returns 1 if have the privilege, 0 if not, -1 if dropped column/table.
+ */
+static int
+column_privilege_check(Oid tableoid, AttrNumber attnum,
+ Oid roleid, AclMode mode)
+{
+ AclResult aclresult;
+ bool is_missing = false;
+
+ /*
+ * If convert_column_name failed, we can just return -1 immediately.
+ */
+ if (attnum == InvalidAttrNumber)
+ return -1;
+
+ /*
+ * Check for column-level privileges first. This serves in part as a check
+ * on whether the column even exists, so we need to do it before checking
+ * table-level privilege.
+ */
+ aclresult = pg_attribute_aclcheck_ext(tableoid, attnum, roleid,
+ mode, &is_missing);
+ if (aclresult == ACLCHECK_OK)
+ return 1;
+ else if (is_missing)
+ return -1;
+
+ /* Next check if we have the privilege at the table level */
+ aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing);
+ if (aclresult == ACLCHECK_OK)
+ return 1;
+ else if (is_missing)
+ return -1;
+ else
+ return 0;
+}
+
+/*
+ * has_column_privilege_name_name_name
+ * Check user privileges on a column given
+ * name username, text tablename, text colname, and text priv name.
+ */
+Datum
+has_column_privilege_name_name_name(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *column = PG_GETARG_TEXT_PP(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid roleid;
+ Oid tableoid;
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ roleid = get_role_oid_or_public(NameStr(*rolename));
+ tableoid = convert_table_name(tablename);
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_name_name_attnum
+ * Check user privileges on a column given
+ * name username, text tablename, int attnum, and text priv name.
+ */
+Datum
+has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ AttrNumber colattnum = PG_GETARG_INT16(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ int privresult;
+
+ roleid = get_role_oid_or_public(NameStr(*rolename));
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_name_id_name
+ * Check user privileges on a column given
+ * name username, table oid, text colname, and text priv name.
+ */
+Datum
+has_column_privilege_name_id_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *column = PG_GETARG_TEXT_PP(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid roleid;
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_name_id_attnum
+ * Check user privileges on a column given
+ * name username, table oid, int attnum, and text priv name.
+ */
+Datum
+has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ AttrNumber colattnum = PG_GETARG_INT16(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid roleid;
+ AclMode mode;
+ int privresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_name_name
+ * Check user privileges on a column given
+ * oid roleid, text tablename, text colname, and text priv name.
+ */
+Datum
+has_column_privilege_id_name_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ text *column = PG_GETARG_TEXT_PP(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid tableoid;
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ tableoid = convert_table_name(tablename);
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_name_attnum
+ * Check user privileges on a column given
+ * oid roleid, text tablename, int attnum, and text priv name.
+ */
+Datum
+has_column_privilege_id_name_attnum(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *tablename = PG_GETARG_TEXT_PP(1);
+ AttrNumber colattnum = PG_GETARG_INT16(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ Oid tableoid;
+ AclMode mode;
+ int privresult;
+
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_id_name
+ * Check user privileges on a column given
+ * oid roleid, table oid, text colname, and text priv name.
+ */
+Datum
+has_column_privilege_id_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ text *column = PG_GETARG_TEXT_PP(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_id_attnum
+ * Check user privileges on a column given
+ * oid roleid, table oid, int attnum, and text priv name.
+ */
+Datum
+has_column_privilege_id_id_attnum(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid tableoid = PG_GETARG_OID(1);
+ AttrNumber colattnum = PG_GETARG_INT16(2);
+ text *priv_type_text = PG_GETARG_TEXT_PP(3);
+ AclMode mode;
+ int privresult;
+
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_name_name
+ * Check user privileges on a column given
+ * text tablename, text colname, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_column_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ text *column = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid tableoid;
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ roleid = GetUserId();
+ tableoid = convert_table_name(tablename);
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_name_attnum
+ * Check user privileges on a column given
+ * text tablename, int attnum, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_column_privilege_name_attnum(PG_FUNCTION_ARGS)
+{
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ AttrNumber colattnum = PG_GETARG_INT16(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid tableoid;
+ AclMode mode;
+ int privresult;
+
+ roleid = GetUserId();
+ tableoid = convert_table_name(tablename);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_name
+ * Check user privileges on a column given
+ * table oid, text colname, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_column_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid tableoid = PG_GETARG_OID(0);
+ text *column = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AttrNumber colattnum;
+ AclMode mode;
+ int privresult;
+
+ roleid = GetUserId();
+ colattnum = convert_column_name(tableoid, column);
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * has_column_privilege_id_attnum
+ * Check user privileges on a column given
+ * table oid, int attnum, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_column_privilege_id_attnum(PG_FUNCTION_ARGS)
+{
+ Oid tableoid = PG_GETARG_OID(0);
+ AttrNumber colattnum = PG_GETARG_INT16(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ int privresult;
+
+ roleid = GetUserId();
+ mode = convert_column_priv_string(priv_type_text);
+
+ privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
+ if (privresult < 0)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(privresult);
+}
+
+/*
+ * Support routines for has_column_privilege family.
+ */
+
+/*
+ * Given a table OID and a column name expressed as a string, look it up
+ * and return the column number. Returns InvalidAttrNumber in cases
+ * where caller should return NULL instead of failing.
+ */
+static AttrNumber
+convert_column_name(Oid tableoid, text *column)
+{
+ char *colname;
+ HeapTuple attTuple;
+ AttrNumber attnum;
+
+ colname = text_to_cstring(column);
+
+ /*
+ * We don't use get_attnum() here because it will report that dropped
+ * columns don't exist. We need to treat dropped columns differently from
+ * nonexistent columns.
+ */
+ attTuple = SearchSysCache2(ATTNAME,
+ ObjectIdGetDatum(tableoid),
+ CStringGetDatum(colname));
+ if (HeapTupleIsValid(attTuple))
+ {
+ Form_pg_attribute attributeForm;
+
+ attributeForm = (Form_pg_attribute) GETSTRUCT(attTuple);
+ /* We want to return NULL for dropped columns */
+ if (attributeForm->attisdropped)
+ attnum = InvalidAttrNumber;
+ else
+ attnum = attributeForm->attnum;
+ ReleaseSysCache(attTuple);
+ }
+ else
+ {
+ char *tablename = get_rel_name(tableoid);
+
+ /*
+ * If the table OID is bogus, or it's just been dropped, we'll get
+ * NULL back. In such cases we want has_column_privilege to return
+ * NULL too, so just return InvalidAttrNumber.
+ */
+ if (tablename != NULL)
+ {
+ /* tableoid exists, colname does not, so throw error */
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_COLUMN),
+ errmsg("column \"%s\" of relation \"%s\" does not exist",
+ colname, tablename)));
+ }
+ /* tableoid doesn't exist, so act like attisdropped case */
+ attnum = InvalidAttrNumber;
+ }
+
+ pfree(colname);
+ return attnum;
+}
+
+/*
+ * convert_column_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_column_priv_string(text *priv_type_text)
+{
+ static const priv_map column_priv_map[] = {
+ {"SELECT", ACL_SELECT},
+ {"SELECT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_SELECT)},
+ {"INSERT", ACL_INSERT},
+ {"INSERT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_INSERT)},
+ {"UPDATE", ACL_UPDATE},
+ {"UPDATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_UPDATE)},
+ {"REFERENCES", ACL_REFERENCES},
+ {"REFERENCES WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_REFERENCES)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, column_priv_map);
+}
+
+
+/*
+ * has_database_privilege variants
+ * These are all named "has_database_privilege" at the SQL level.
+ * They take various combinations of database name, database OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not, or NULL if object doesn't exist.
+ */
+
+/*
+ * has_database_privilege_name_name
+ * Check user privileges on a database given
+ * name username, text databasename, and text priv name.
+ */
+Datum
+has_database_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *databasename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid databaseoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ databaseoid = convert_database_name(databasename);
+ mode = convert_database_priv_string(priv_type_text);
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_database_privilege_name
+ * Check user privileges on a database given
+ * text databasename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_database_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *databasename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid databaseoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ databaseoid = convert_database_name(databasename);
+ mode = convert_database_priv_string(priv_type_text);
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_database_privilege_name_id
+ * Check user privileges on a database given
+ * name usename, database oid, and text priv name.
+ */
+Datum
+has_database_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid databaseoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_database_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_database_privilege_id
+ * Check user privileges on a database given
+ * database oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_database_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid databaseoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_database_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_database_privilege_id_name
+ * Check user privileges on a database given
+ * roleid, text databasename, and text priv name.
+ */
+Datum
+has_database_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *databasename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid databaseoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ databaseoid = convert_database_name(databasename);
+ mode = convert_database_priv_string(priv_type_text);
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_database_privilege_id_id
+ * Check user privileges on a database given
+ * roleid, database oid, and text priv name.
+ */
+Datum
+has_database_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid databaseoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_database_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_database_aclcheck(databaseoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_database_privilege family.
+ */
+
+/*
+ * Given a database name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_database_name(text *databasename)
+{
+ char *dbname = text_to_cstring(databasename);
+
+ return get_database_oid(dbname, false);
+}
+
+/*
+ * convert_database_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_database_priv_string(text *priv_type_text)
+{
+ static const priv_map database_priv_map[] = {
+ {"CREATE", ACL_CREATE},
+ {"CREATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {"TEMPORARY", ACL_CREATE_TEMP},
+ {"TEMPORARY WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP)},
+ {"TEMP", ACL_CREATE_TEMP},
+ {"TEMP WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE_TEMP)},
+ {"CONNECT", ACL_CONNECT},
+ {"CONNECT WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CONNECT)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, database_priv_map);
+}
+
+
+/*
+ * has_foreign_data_wrapper_privilege variants
+ * These are all named "has_foreign_data_wrapper_privilege" at the SQL level.
+ * They take various combinations of foreign-data wrapper name,
+ * fdw OID, user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not.
+ */
+
+/*
+ * has_foreign_data_wrapper_privilege_name_name
+ * Check user privileges on a foreign-data wrapper given
+ * name username, text fdwname, and text priv name.
+ */
+Datum
+has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *fdwname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid fdwid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ fdwid = convert_foreign_data_wrapper_name(fdwname);
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_foreign_data_wrapper_privilege_name
+ * Check user privileges on a foreign-data wrapper given
+ * text fdwname and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_foreign_data_wrapper_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *fdwname = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid fdwid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ fdwid = convert_foreign_data_wrapper_name(fdwname);
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_foreign_data_wrapper_privilege_name_id
+ * Check user privileges on a foreign-data wrapper given
+ * name usename, foreign-data wrapper oid, and text priv name.
+ */
+Datum
+has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid fdwid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_foreign_data_wrapper_privilege_id
+ * Check user privileges on a foreign-data wrapper given
+ * foreign-data wrapper oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_foreign_data_wrapper_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid fdwid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_foreign_data_wrapper_privilege_id_name
+ * Check user privileges on a foreign-data wrapper given
+ * roleid, text fdwname, and text priv name.
+ */
+Datum
+has_foreign_data_wrapper_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *fdwname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid fdwid;
+ AclMode mode;
+ AclResult aclresult;
+
+ fdwid = convert_foreign_data_wrapper_name(fdwname);
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_foreign_data_wrapper_privilege_id_id
+ * Check user privileges on a foreign-data wrapper given
+ * roleid, fdw oid, and text priv name.
+ */
+Datum
+has_foreign_data_wrapper_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid fdwid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_foreign_data_wrapper_privilege family.
+ */
+
+/*
+ * Given a FDW name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_foreign_data_wrapper_name(text *fdwname)
+{
+ char *fdwstr = text_to_cstring(fdwname);
+
+ return get_foreign_data_wrapper_oid(fdwstr, false);
+}
+
+/*
+ * convert_foreign_data_wrapper_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_foreign_data_wrapper_priv_string(text *priv_type_text)
+{
+ static const priv_map foreign_data_wrapper_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, foreign_data_wrapper_priv_map);
+}
+
+
+/*
+ * has_function_privilege variants
+ * These are all named "has_function_privilege" at the SQL level.
+ * They take various combinations of function name, function OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not, or NULL if object doesn't exist.
+ */
+
+/*
+ * has_function_privilege_name_name
+ * Check user privileges on a function given
+ * name username, text functionname, and text priv name.
+ */
+Datum
+has_function_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *functionname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid functionoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ functionoid = convert_function_name(functionname);
+ mode = convert_function_priv_string(priv_type_text);
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_function_privilege_name
+ * Check user privileges on a function given
+ * text functionname and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_function_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *functionname = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid functionoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ functionoid = convert_function_name(functionname);
+ mode = convert_function_priv_string(priv_type_text);
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_function_privilege_name_id
+ * Check user privileges on a function given
+ * name usename, function oid, and text priv name.
+ */
+Datum
+has_function_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid functionoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_function_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_function_privilege_id
+ * Check user privileges on a function given
+ * function oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_function_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid functionoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_function_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_function_privilege_id_name
+ * Check user privileges on a function given
+ * roleid, text functionname, and text priv name.
+ */
+Datum
+has_function_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *functionname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid functionoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ functionoid = convert_function_name(functionname);
+ mode = convert_function_priv_string(priv_type_text);
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_function_privilege_id_id
+ * Check user privileges on a function given
+ * roleid, function oid, and text priv name.
+ */
+Datum
+has_function_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid functionoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_function_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_proc_aclcheck(functionoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_function_privilege family.
+ */
+
+/*
+ * Given a function name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_function_name(text *functionname)
+{
+ char *funcname = text_to_cstring(functionname);
+ Oid oid;
+
+ oid = DatumGetObjectId(DirectFunctionCall1(regprocedurein,
+ CStringGetDatum(funcname)));
+
+ if (!OidIsValid(oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("function \"%s\" does not exist", funcname)));
+
+ return oid;
+}
+
+/*
+ * convert_function_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_function_priv_string(text *priv_type_text)
+{
+ static const priv_map function_priv_map[] = {
+ {"EXECUTE", ACL_EXECUTE},
+ {"EXECUTE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_EXECUTE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, function_priv_map);
+}
+
+
+/*
+ * has_language_privilege variants
+ * These are all named "has_language_privilege" at the SQL level.
+ * They take various combinations of language name, language OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not, or NULL if object doesn't exist.
+ */
+
+/*
+ * has_language_privilege_name_name
+ * Check user privileges on a language given
+ * name username, text languagename, and text priv name.
+ */
+Datum
+has_language_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *languagename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid languageoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ languageoid = convert_language_name(languagename);
+ mode = convert_language_priv_string(priv_type_text);
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_language_privilege_name
+ * Check user privileges on a language given
+ * text languagename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_language_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *languagename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid languageoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ languageoid = convert_language_name(languagename);
+ mode = convert_language_priv_string(priv_type_text);
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_language_privilege_name_id
+ * Check user privileges on a language given
+ * name usename, language oid, and text priv name.
+ */
+Datum
+has_language_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid languageoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_language_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_language_privilege_id
+ * Check user privileges on a language given
+ * language oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_language_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid languageoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_language_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_language_privilege_id_name
+ * Check user privileges on a language given
+ * roleid, text languagename, and text priv name.
+ */
+Datum
+has_language_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *languagename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid languageoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ languageoid = convert_language_name(languagename);
+ mode = convert_language_priv_string(priv_type_text);
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_language_privilege_id_id
+ * Check user privileges on a language given
+ * roleid, language oid, and text priv name.
+ */
+Datum
+has_language_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid languageoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_language_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_language_aclcheck(languageoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_language_privilege family.
+ */
+
+/*
+ * Given a language name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_language_name(text *languagename)
+{
+ char *langname = text_to_cstring(languagename);
+
+ return get_language_oid(langname, false);
+}
+
+/*
+ * convert_language_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_language_priv_string(text *priv_type_text)
+{
+ static const priv_map language_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, language_priv_map);
+}
+
+
+/*
+ * has_schema_privilege variants
+ * These are all named "has_schema_privilege" at the SQL level.
+ * They take various combinations of schema name, schema OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not, or NULL if object doesn't exist.
+ */
+
+/*
+ * has_schema_privilege_name_name
+ * Check user privileges on a schema given
+ * name username, text schemaname, and text priv name.
+ */
+Datum
+has_schema_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *schemaname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid schemaoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ schemaoid = convert_schema_name(schemaname);
+ mode = convert_schema_priv_string(priv_type_text);
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_schema_privilege_name
+ * Check user privileges on a schema given
+ * text schemaname and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_schema_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *schemaname = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid schemaoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ schemaoid = convert_schema_name(schemaname);
+ mode = convert_schema_priv_string(priv_type_text);
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_schema_privilege_name_id
+ * Check user privileges on a schema given
+ * name usename, schema oid, and text priv name.
+ */
+Datum
+has_schema_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid schemaoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_schema_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_schema_privilege_id
+ * Check user privileges on a schema given
+ * schema oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_schema_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid schemaoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_schema_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_schema_privilege_id_name
+ * Check user privileges on a schema given
+ * roleid, text schemaname, and text priv name.
+ */
+Datum
+has_schema_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *schemaname = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid schemaoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ schemaoid = convert_schema_name(schemaname);
+ mode = convert_schema_priv_string(priv_type_text);
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_schema_privilege_id_id
+ * Check user privileges on a schema given
+ * roleid, schema oid, and text priv name.
+ */
+Datum
+has_schema_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid schemaoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_schema_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_namespace_aclcheck(schemaoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_schema_privilege family.
+ */
+
+/*
+ * Given a schema name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_schema_name(text *schemaname)
+{
+ char *nspname = text_to_cstring(schemaname);
+
+ return get_namespace_oid(nspname, false);
+}
+
+/*
+ * convert_schema_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_schema_priv_string(text *priv_type_text)
+{
+ static const priv_map schema_priv_map[] = {
+ {"CREATE", ACL_CREATE},
+ {"CREATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, schema_priv_map);
+}
+
+
+/*
+ * has_server_privilege variants
+ * These are all named "has_server_privilege" at the SQL level.
+ * They take various combinations of foreign server name,
+ * server OID, user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not.
+ */
+
+/*
+ * has_server_privilege_name_name
+ * Check user privileges on a foreign server given
+ * name username, text servername, and text priv name.
+ */
+Datum
+has_server_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *servername = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid serverid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ serverid = convert_server_name(servername);
+ mode = convert_server_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_server_privilege_name
+ * Check user privileges on a foreign server given
+ * text servername and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_server_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *servername = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid serverid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ serverid = convert_server_name(servername);
+ mode = convert_server_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_server_privilege_name_id
+ * Check user privileges on a foreign server given
+ * name usename, foreign server oid, and text priv name.
+ */
+Datum
+has_server_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid serverid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_server_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_server_privilege_id
+ * Check user privileges on a foreign server given
+ * server oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_server_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid serverid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_server_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_server_privilege_id_name
+ * Check user privileges on a foreign server given
+ * roleid, text servername, and text priv name.
+ */
+Datum
+has_server_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *servername = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid serverid;
+ AclMode mode;
+ AclResult aclresult;
+
+ serverid = convert_server_name(servername);
+ mode = convert_server_priv_string(priv_type_text);
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_server_privilege_id_id
+ * Check user privileges on a foreign server given
+ * roleid, server oid, and text priv name.
+ */
+Datum
+has_server_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid serverid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_server_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_server_privilege family.
+ */
+
+/*
+ * Given a server name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_server_name(text *servername)
+{
+ char *serverstr = text_to_cstring(servername);
+
+ return get_foreign_server_oid(serverstr, false);
+}
+
+/*
+ * convert_server_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_server_priv_string(text *priv_type_text)
+{
+ static const priv_map server_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, server_priv_map);
+}
+
+
+/*
+ * has_tablespace_privilege variants
+ * These are all named "has_tablespace_privilege" at the SQL level.
+ * They take various combinations of tablespace name, tablespace OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not.
+ */
+
+/*
+ * has_tablespace_privilege_name_name
+ * Check user privileges on a tablespace given
+ * name username, text tablespacename, and text priv name.
+ */
+Datum
+has_tablespace_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *tablespacename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid tablespaceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ tablespaceoid = convert_tablespace_name(tablespacename);
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_tablespace_privilege_name
+ * Check user privileges on a tablespace given
+ * text tablespacename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_tablespace_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *tablespacename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid tablespaceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ tablespaceoid = convert_tablespace_name(tablespacename);
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_tablespace_privilege_name_id
+ * Check user privileges on a tablespace given
+ * name usename, tablespace oid, and text priv name.
+ */
+Datum
+has_tablespace_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid tablespaceoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_tablespace_privilege_id
+ * Check user privileges on a tablespace given
+ * tablespace oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_tablespace_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid tablespaceoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_tablespace_privilege_id_name
+ * Check user privileges on a tablespace given
+ * roleid, text tablespacename, and text priv name.
+ */
+Datum
+has_tablespace_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *tablespacename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid tablespaceoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ tablespaceoid = convert_tablespace_name(tablespacename);
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_tablespace_privilege_id_id
+ * Check user privileges on a tablespace given
+ * roleid, tablespace oid, and text priv name.
+ */
+Datum
+has_tablespace_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid tablespaceoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_tablespace_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_tablespace_privilege family.
+ */
+
+/*
+ * Given a tablespace name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_tablespace_name(text *tablespacename)
+{
+ char *spcname = text_to_cstring(tablespacename);
+
+ return get_tablespace_oid(spcname, false);
+}
+
+/*
+ * convert_tablespace_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_tablespace_priv_string(text *priv_type_text)
+{
+ static const priv_map tablespace_priv_map[] = {
+ {"CREATE", ACL_CREATE},
+ {"CREATE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, tablespace_priv_map);
+}
+
+/*
+ * has_type_privilege variants
+ * These are all named "has_type_privilege" at the SQL level.
+ * They take various combinations of type name, type OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not, or NULL if object doesn't exist.
+ */
+
+/*
+ * has_type_privilege_name_name
+ * Check user privileges on a type given
+ * name username, text typename, and text priv name.
+ */
+Datum
+has_type_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *typename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid typeoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ typeoid = convert_type_name(typename);
+ mode = convert_type_priv_string(priv_type_text);
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_type_privilege_name
+ * Check user privileges on a type given
+ * text typename and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_type_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *typename = PG_GETARG_TEXT_PP(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid typeoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ typeoid = convert_type_name(typename);
+ mode = convert_type_priv_string(priv_type_text);
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_type_privilege_name_id
+ * Check user privileges on a type given
+ * name usename, type oid, and text priv name.
+ */
+Datum
+has_type_privilege_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid typeoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid_or_public(NameStr(*username));
+ mode = convert_type_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_type_privilege_id
+ * Check user privileges on a type given
+ * type oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+has_type_privilege_id(PG_FUNCTION_ARGS)
+{
+ Oid typeoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_type_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_type_privilege_id_name
+ * Check user privileges on a type given
+ * roleid, text typename, and text priv name.
+ */
+Datum
+has_type_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *typename = PG_GETARG_TEXT_PP(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid typeoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ typeoid = convert_type_name(typename);
+ mode = convert_type_priv_string(priv_type_text);
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * has_type_privilege_id_id
+ * Check user privileges on a type given
+ * roleid, type oid, and text priv name.
+ */
+Datum
+has_type_privilege_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid typeoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_type_priv_string(priv_type_text);
+
+ if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
+ PG_RETURN_NULL();
+
+ aclresult = pg_type_aclcheck(typeoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for has_type_privilege family.
+ */
+
+/*
+ * Given a type name expressed as a string, look it up and return Oid
+ */
+static Oid
+convert_type_name(text *typename)
+{
+ char *typname = text_to_cstring(typename);
+ Oid oid;
+
+ oid = DatumGetObjectId(DirectFunctionCall1(regtypein,
+ CStringGetDatum(typname)));
+
+ if (!OidIsValid(oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type \"%s\" does not exist", typname)));
+
+ return oid;
+}
+
+/*
+ * convert_type_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_type_priv_string(text *priv_type_text)
+{
+ static const priv_map type_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_USAGE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, type_priv_map);
+}
+
+/*
+ * has_parameter_privilege variants
+ * These are all named "has_parameter_privilege" at the SQL level.
+ * They take various combinations of parameter name with
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has been granted
+ * the indicated privilege or false if not.
+ */
+
+/*
+ * has_param_priv_byname
+ *
+ * Helper function to check user privileges on a parameter given the
+ * role by Oid, parameter by text name, and privileges as AclMode.
+ */
+static bool
+has_param_priv_byname(Oid roleid, const text *parameter, AclMode priv)
+{
+ char *paramstr = text_to_cstring(parameter);
+
+ return pg_parameter_aclcheck(paramstr, roleid, priv) == ACLCHECK_OK;
+}
+
+/*
+ * has_parameter_privilege_name_name
+ * Check user privileges on a parameter given name username, text
+ * parameter, and text priv name.
+ */
+Datum
+has_parameter_privilege_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ text *parameter = PG_GETARG_TEXT_PP(1);
+ AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(2));
+ Oid roleid = get_role_oid_or_public(NameStr(*username));
+
+ PG_RETURN_BOOL(has_param_priv_byname(roleid, parameter, priv));
+}
+
+/*
+ * has_parameter_privilege_name
+ * Check user privileges on a parameter given text parameter and text priv
+ * name. current_user is assumed
+ */
+Datum
+has_parameter_privilege_name(PG_FUNCTION_ARGS)
+{
+ text *parameter = PG_GETARG_TEXT_PP(0);
+ AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(1));
+
+ PG_RETURN_BOOL(has_param_priv_byname(GetUserId(), parameter, priv));
+}
+
+/*
+ * has_parameter_privilege_id_name
+ * Check user privileges on a parameter given roleid, text parameter, and
+ * text priv name.
+ */
+Datum
+has_parameter_privilege_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ text *parameter = PG_GETARG_TEXT_PP(1);
+ AclMode priv = convert_parameter_priv_string(PG_GETARG_TEXT_PP(2));
+
+ PG_RETURN_BOOL(has_param_priv_byname(roleid, parameter, priv));
+}
+
+/*
+ * Support routines for has_parameter_privilege family.
+ */
+
+/*
+ * convert_parameter_priv_string
+ * Convert text string to AclMode value.
+ */
+static AclMode
+convert_parameter_priv_string(text *priv_text)
+{
+ static const priv_map parameter_priv_map[] = {
+ {"SET", ACL_SET},
+ {"SET WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_SET)},
+ {"ALTER SYSTEM", ACL_ALTER_SYSTEM},
+ {"ALTER SYSTEM WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_ALTER_SYSTEM)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_text, parameter_priv_map);
+}
+
+/*
+ * pg_has_role variants
+ * These are all named "pg_has_role" at the SQL level.
+ * They take various combinations of role name, role OID,
+ * user name, user OID, or implicit user = current_user.
+ *
+ * The result is a boolean value: true if user has the indicated
+ * privilege, false if not.
+ */
+
+/*
+ * pg_has_role_name_name
+ * Check user privileges on a role given
+ * name username, name rolename, and text priv name.
+ */
+Datum
+pg_has_role_name_name(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Name rolename = PG_GETARG_NAME(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ Oid roleoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid(NameStr(*username), false);
+ roleoid = get_role_oid(NameStr(*rolename), false);
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * pg_has_role_name
+ * Check user privileges on a role given
+ * name rolename and text priv name.
+ * current_user is assumed
+ */
+Datum
+pg_has_role_name(PG_FUNCTION_ARGS)
+{
+ Name rolename = PG_GETARG_NAME(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ Oid roleoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ roleoid = get_role_oid(NameStr(*rolename), false);
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * pg_has_role_name_id
+ * Check user privileges on a role given
+ * name usename, role oid, and text priv name.
+ */
+Datum
+pg_has_role_name_id(PG_FUNCTION_ARGS)
+{
+ Name username = PG_GETARG_NAME(0);
+ Oid roleoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = get_role_oid(NameStr(*username), false);
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * pg_has_role_id
+ * Check user privileges on a role given
+ * role oid, and text priv name.
+ * current_user is assumed
+ */
+Datum
+pg_has_role_id(PG_FUNCTION_ARGS)
+{
+ Oid roleoid = PG_GETARG_OID(0);
+ text *priv_type_text = PG_GETARG_TEXT_PP(1);
+ Oid roleid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleid = GetUserId();
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * pg_has_role_id_name
+ * Check user privileges on a role given
+ * roleid, name rolename, and text priv name.
+ */
+Datum
+pg_has_role_id_name(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Name rolename = PG_GETARG_NAME(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ Oid roleoid;
+ AclMode mode;
+ AclResult aclresult;
+
+ roleoid = get_role_oid(NameStr(*rolename), false);
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * pg_has_role_id_id
+ * Check user privileges on a role given
+ * roleid, role oid, and text priv name.
+ */
+Datum
+pg_has_role_id_id(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Oid roleoid = PG_GETARG_OID(1);
+ text *priv_type_text = PG_GETARG_TEXT_PP(2);
+ AclMode mode;
+ AclResult aclresult;
+
+ mode = convert_role_priv_string(priv_type_text);
+
+ aclresult = pg_role_aclcheck(roleoid, roleid, mode);
+
+ PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
+}
+
+/*
+ * Support routines for pg_has_role family.
+ */
+
+/*
+ * convert_role_priv_string
+ * Convert text string to AclMode value.
+ *
+ * We use USAGE to denote whether the privileges of the role are accessible
+ * (has_privs), MEMBER to denote is_member, and MEMBER WITH GRANT OPTION
+ * (or ADMIN OPTION) to denote is_admin. There is no ACL bit corresponding
+ * to MEMBER so we cheat and use ACL_CREATE for that. This convention
+ * is shared only with pg_role_aclcheck, below.
+ */
+static AclMode
+convert_role_priv_string(text *priv_type_text)
+{
+ static const priv_map role_priv_map[] = {
+ {"USAGE", ACL_USAGE},
+ {"MEMBER", ACL_CREATE},
+ {"USAGE WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {"USAGE WITH ADMIN OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {"MEMBER WITH GRANT OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {"MEMBER WITH ADMIN OPTION", ACL_GRANT_OPTION_FOR(ACL_CREATE)},
+ {NULL, 0}
+ };
+
+ return convert_any_priv_string(priv_type_text, role_priv_map);
+}
+
+/*
+ * pg_role_aclcheck
+ * Quick-and-dirty support for pg_has_role
+ */
+static AclResult
+pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode)
+{
+ if (mode & ACL_GRANT_OPTION_FOR(ACL_CREATE))
+ {
+ if (is_admin_of_role(roleid, role_oid))
+ return ACLCHECK_OK;
+ }
+ if (mode & ACL_CREATE)
+ {
+ if (is_member_of_role(roleid, role_oid))
+ return ACLCHECK_OK;
+ }
+ if (mode & ACL_USAGE)
+ {
+ if (has_privs_of_role(roleid, role_oid))
+ return ACLCHECK_OK;
+ }
+ return ACLCHECK_NO_PRIV;
+}
+
+
+/*
+ * initialization function (called by InitPostgres)
+ */
+void
+initialize_acl(void)
+{
+ if (!IsBootstrapProcessingMode())
+ {
+ cached_db_hash =
+ GetSysCacheHashValue1(DATABASEOID,
+ ObjectIdGetDatum(MyDatabaseId));
+
+ /*
+ * In normal mode, set a callback on any syscache invalidation of rows
+ * of pg_auth_members (for roles_is_member_of()), pg_authid (for
+ * has_rolinherit()), or pg_database (for roles_is_member_of())
+ */
+ CacheRegisterSyscacheCallback(AUTHMEMROLEMEM,
+ RoleMembershipCacheCallback,
+ (Datum) 0);
+ CacheRegisterSyscacheCallback(AUTHOID,
+ RoleMembershipCacheCallback,
+ (Datum) 0);
+ CacheRegisterSyscacheCallback(DATABASEOID,
+ RoleMembershipCacheCallback,
+ (Datum) 0);
+ }
+}
+
+/*
+ * RoleMembershipCacheCallback
+ * Syscache inval callback function
+ */
+static void
+RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ if (cacheid == DATABASEOID &&
+ hashvalue != cached_db_hash &&
+ hashvalue != 0)
+ {
+ return; /* ignore pg_database changes for other DBs */
+ }
+
+ /* Force membership caches to be recomputed on next use */
+ cached_role[ROLERECURSE_PRIVS] = InvalidOid;
+ cached_role[ROLERECURSE_MEMBERS] = InvalidOid;
+}
+
+
+/* Check if specified role has rolinherit set */
+static bool
+has_rolinherit(Oid roleid)
+{
+ bool result = false;
+ HeapTuple utup;
+
+ utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (HeapTupleIsValid(utup))
+ {
+ result = ((Form_pg_authid) GETSTRUCT(utup))->rolinherit;
+ ReleaseSysCache(utup);
+ }
+ return result;
+}
+
+
+/*
+ * Get a list of roles that the specified roleid is a member of
+ *
+ * Type ROLERECURSE_PRIVS recurses only through roles that have rolinherit
+ * set, while ROLERECURSE_MEMBERS recurses through all roles. This sets
+ * *is_admin==true if and only if role "roleid" has an ADMIN OPTION membership
+ * in role "admin_of".
+ *
+ * Since indirect membership testing is relatively expensive, we cache
+ * a list of memberships. Hence, the result is only guaranteed good until
+ * the next call of roles_is_member_of()!
+ *
+ * For the benefit of select_best_grantor, the result is defined to be
+ * in breadth-first order, ie, closer relationships earlier.
+ */
+static List *
+roles_is_member_of(Oid roleid, enum RoleRecurseType type,
+ Oid admin_of, bool *is_admin)
+{
+ Oid dba;
+ List *roles_list;
+ ListCell *l;
+ List *new_cached_roles;
+ MemoryContext oldctx;
+
+ Assert(OidIsValid(admin_of) == PointerIsValid(is_admin));
+
+ /* If cache is valid and ADMIN OPTION not sought, just return the list */
+ if (cached_role[type] == roleid && !OidIsValid(admin_of) &&
+ OidIsValid(cached_role[type]))
+ return cached_roles[type];
+
+ /*
+ * Role expansion happens in a non-database backend when guc.c checks
+ * ROLE_PG_READ_ALL_SETTINGS for a physical walsender SHOW command. In
+ * that case, no role gets pg_database_owner.
+ */
+ if (!OidIsValid(MyDatabaseId))
+ dba = InvalidOid;
+ else
+ {
+ HeapTuple dbtup;
+
+ dbtup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
+ if (!HeapTupleIsValid(dbtup))
+ elog(ERROR, "cache lookup failed for database %u", MyDatabaseId);
+ dba = ((Form_pg_database) GETSTRUCT(dbtup))->datdba;
+ ReleaseSysCache(dbtup);
+ }
+
+ /*
+ * Find all the roles that roleid is a member of, including multi-level
+ * recursion. The role itself will always be the first element of the
+ * resulting list.
+ *
+ * Each element of the list is scanned to see if it adds any indirect
+ * memberships. We can use a single list as both the record of
+ * already-found memberships and the agenda of roles yet to be scanned.
+ * This is a bit tricky but works because the foreach() macro doesn't
+ * fetch the next list element until the bottom of the loop.
+ */
+ roles_list = list_make1_oid(roleid);
+
+ foreach(l, roles_list)
+ {
+ Oid memberid = lfirst_oid(l);
+ CatCList *memlist;
+ int i;
+
+ if (type == ROLERECURSE_PRIVS && !has_rolinherit(memberid))
+ continue; /* ignore non-inheriting roles */
+
+ /* Find roles that memberid is directly a member of */
+ memlist = SearchSysCacheList1(AUTHMEMMEMROLE,
+ ObjectIdGetDatum(memberid));
+ for (i = 0; i < memlist->n_members; i++)
+ {
+ HeapTuple tup = &memlist->members[i]->tuple;
+ Oid otherid = ((Form_pg_auth_members) GETSTRUCT(tup))->roleid;
+
+ /*
+ * While otherid==InvalidOid shouldn't appear in the catalog, the
+ * OidIsValid() avoids crashing if that arises.
+ */
+ if (otherid == admin_of &&
+ ((Form_pg_auth_members) GETSTRUCT(tup))->admin_option &&
+ OidIsValid(admin_of))
+ *is_admin = true;
+
+ /*
+ * Even though there shouldn't be any loops in the membership
+ * graph, we must test for having already seen this role. It is
+ * legal for instance to have both A->B and A->C->B.
+ */
+ roles_list = list_append_unique_oid(roles_list, otherid);
+ }
+ ReleaseSysCacheList(memlist);
+
+ /* implement pg_database_owner implicit membership */
+ if (memberid == dba && OidIsValid(dba))
+ roles_list = list_append_unique_oid(roles_list,
+ ROLE_PG_DATABASE_OWNER);
+ }
+
+ /*
+ * Copy the completed list into TopMemoryContext so it will persist.
+ */
+ oldctx = MemoryContextSwitchTo(TopMemoryContext);
+ new_cached_roles = list_copy(roles_list);
+ MemoryContextSwitchTo(oldctx);
+ list_free(roles_list);
+
+ /*
+ * Now safe to assign to state variable
+ */
+ cached_role[type] = InvalidOid; /* just paranoia */
+ list_free(cached_roles[type]);
+ cached_roles[type] = new_cached_roles;
+ cached_role[type] = roleid;
+
+ /* And now we can return the answer */
+ return cached_roles[type];
+}
+
+
+/*
+ * Does member have the privileges of role (directly or indirectly)?
+ *
+ * This is defined not to recurse through roles that don't have rolinherit
+ * set; for such roles, membership implies the ability to do SET ROLE, but
+ * the privileges are not available until you've done so.
+ */
+bool
+has_privs_of_role(Oid member, Oid role)
+{
+ /* Fast path for simple case */
+ if (member == role)
+ return true;
+
+ /* Superusers have every privilege, so are part of every role */
+ if (superuser_arg(member))
+ return true;
+
+ /*
+ * Find all the roles that member has the privileges of, including
+ * multi-level recursion, then see if target role is any one of them.
+ */
+ return list_member_oid(roles_is_member_of(member, ROLERECURSE_PRIVS,
+ InvalidOid, NULL),
+ role);
+}
+
+
+/*
+ * Is member a member of role (directly or indirectly)?
+ *
+ * This is defined to recurse through roles regardless of rolinherit.
+ *
+ * Do not use this for privilege checking, instead use has_privs_of_role()
+ */
+bool
+is_member_of_role(Oid member, Oid role)
+{
+ /* Fast path for simple case */
+ if (member == role)
+ return true;
+
+ /* Superusers have every privilege, so are part of every role */
+ if (superuser_arg(member))
+ return true;
+
+ /*
+ * Find all the roles that member is a member of, including multi-level
+ * recursion, then see if target role is any one of them.
+ */
+ return list_member_oid(roles_is_member_of(member, ROLERECURSE_MEMBERS,
+ InvalidOid, NULL),
+ role);
+}
+
+/*
+ * check_is_member_of_role
+ * is_member_of_role with a standard permission-violation error if not
+ */
+void
+check_is_member_of_role(Oid member, Oid role)
+{
+ if (!is_member_of_role(member, role))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be member of role \"%s\"",
+ GetUserNameFromId(role, false))));
+}
+
+/*
+ * Is member a member of role, not considering superuserness?
+ *
+ * This is identical to is_member_of_role except we ignore superuser
+ * status.
+ *
+ * Do not use this for privilege checking, instead use has_privs_of_role()
+ */
+bool
+is_member_of_role_nosuper(Oid member, Oid role)
+{
+ /* Fast path for simple case */
+ if (member == role)
+ return true;
+
+ /*
+ * Find all the roles that member is a member of, including multi-level
+ * recursion, then see if target role is any one of them.
+ */
+ return list_member_oid(roles_is_member_of(member, ROLERECURSE_MEMBERS,
+ InvalidOid, NULL),
+ role);
+}
+
+
+/*
+ * Is member an admin of role? That is, is member the role itself (subject to
+ * restrictions below), a member (directly or indirectly) WITH ADMIN OPTION,
+ * or a superuser?
+ */
+bool
+is_admin_of_role(Oid member, Oid role)
+{
+ bool result = false;
+
+ if (superuser_arg(member))
+ return true;
+
+ /* By policy, a role cannot have WITH ADMIN OPTION on itself. */
+ if (member == role)
+ return false;
+
+ (void) roles_is_member_of(member, ROLERECURSE_MEMBERS, role, &result);
+ return result;
+}
+
+
+/* does what it says ... */
+static int
+count_one_bits(AclMode mask)
+{
+ int nbits = 0;
+
+ /* this code relies on AclMode being an unsigned type */
+ while (mask)
+ {
+ if (mask & 1)
+ nbits++;
+ mask >>= 1;
+ }
+ return nbits;
+}
+
+
+/*
+ * Select the effective grantor ID for a GRANT or REVOKE operation.
+ *
+ * The grantor must always be either the object owner or some role that has
+ * been explicitly granted grant options. This ensures that all granted
+ * privileges appear to flow from the object owner, and there are never
+ * multiple "original sources" of a privilege. Therefore, if the would-be
+ * grantor is a member of a role that has the needed grant options, we have
+ * to do the grant as that role instead.
+ *
+ * It is possible that the would-be grantor is a member of several roles
+ * that have different subsets of the desired grant options, but no one
+ * role has 'em all. In this case we pick a role with the largest number
+ * of desired options. Ties are broken in favor of closer ancestors.
+ *
+ * roleId: the role attempting to do the GRANT/REVOKE
+ * privileges: the privileges to be granted/revoked
+ * acl: the ACL of the object in question
+ * ownerId: the role owning the object in question
+ * *grantorId: receives the OID of the role to do the grant as
+ * *grantOptions: receives the grant options actually held by grantorId
+ *
+ * If no grant options exist, we set grantorId to roleId, grantOptions to 0.
+ */
+void
+select_best_grantor(Oid roleId, AclMode privileges,
+ const Acl *acl, Oid ownerId,
+ Oid *grantorId, AclMode *grantOptions)
+{
+ AclMode needed_goptions = ACL_GRANT_OPTION_FOR(privileges);
+ List *roles_list;
+ int nrights;
+ ListCell *l;
+
+ /*
+ * The object owner is always treated as having all grant options, so if
+ * roleId is the owner it's easy. Also, if roleId is a superuser it's
+ * easy: superusers are implicitly members of every role, so they act as
+ * the object owner.
+ */
+ if (roleId == ownerId || superuser_arg(roleId))
+ {
+ *grantorId = ownerId;
+ *grantOptions = needed_goptions;
+ return;
+ }
+
+ /*
+ * Otherwise we have to do a careful search to see if roleId has the
+ * privileges of any suitable role. Note: we can hang onto the result of
+ * roles_is_member_of() throughout this loop, because aclmask_direct()
+ * doesn't query any role memberships.
+ */
+ roles_list = roles_is_member_of(roleId, ROLERECURSE_PRIVS,
+ InvalidOid, NULL);
+
+ /* initialize candidate result as default */
+ *grantorId = roleId;
+ *grantOptions = ACL_NO_RIGHTS;
+ nrights = 0;
+
+ foreach(l, roles_list)
+ {
+ Oid otherrole = lfirst_oid(l);
+ AclMode otherprivs;
+
+ otherprivs = aclmask_direct(acl, otherrole, ownerId,
+ needed_goptions, ACLMASK_ALL);
+ if (otherprivs == needed_goptions)
+ {
+ /* Found a suitable grantor */
+ *grantorId = otherrole;
+ *grantOptions = otherprivs;
+ return;
+ }
+
+ /*
+ * If it has just some of the needed privileges, remember best
+ * candidate.
+ */
+ if (otherprivs != ACL_NO_RIGHTS)
+ {
+ int nnewrights = count_one_bits(otherprivs);
+
+ if (nnewrights > nrights)
+ {
+ *grantorId = otherrole;
+ *grantOptions = otherprivs;
+ nrights = nnewrights;
+ }
+ }
+ }
+}
+
+/*
+ * get_role_oid - Given a role name, look up the role's OID.
+ *
+ * If missing_ok is false, throw an error if role name not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_role_oid(const char *rolname, bool missing_ok)
+{
+ Oid oid;
+
+ oid = GetSysCacheOid1(AUTHNAME, Anum_pg_authid_oid,
+ CStringGetDatum(rolname));
+ if (!OidIsValid(oid) && !missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("role \"%s\" does not exist", rolname)));
+ return oid;
+}
+
+/*
+ * get_role_oid_or_public - As above, but return ACL_ID_PUBLIC if the
+ * role name is "public".
+ */
+Oid
+get_role_oid_or_public(const char *rolname)
+{
+ if (strcmp(rolname, "public") == 0)
+ return ACL_ID_PUBLIC;
+
+ return get_role_oid(rolname, false);
+}
+
+/*
+ * Given a RoleSpec node, return the OID it corresponds to. If missing_ok is
+ * true, return InvalidOid if the role does not exist.
+ *
+ * PUBLIC is always disallowed here. Routines wanting to handle the PUBLIC
+ * case must check the case separately.
+ */
+Oid
+get_rolespec_oid(const RoleSpec *role, bool missing_ok)
+{
+ Oid oid;
+
+ switch (role->roletype)
+ {
+ case ROLESPEC_CSTRING:
+ Assert(role->rolename);
+ oid = get_role_oid(role->rolename, missing_ok);
+ break;
+
+ case ROLESPEC_CURRENT_ROLE:
+ case ROLESPEC_CURRENT_USER:
+ oid = GetUserId();
+ break;
+
+ case ROLESPEC_SESSION_USER:
+ oid = GetSessionUserId();
+ break;
+
+ case ROLESPEC_PUBLIC:
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("role \"%s\" does not exist", "public")));
+ oid = InvalidOid; /* make compiler happy */
+ break;
+
+ default:
+ elog(ERROR, "unexpected role type %d", role->roletype);
+ }
+
+ return oid;
+}
+
+/*
+ * Given a RoleSpec node, return the pg_authid HeapTuple it corresponds to.
+ * Caller must ReleaseSysCache when done with the result tuple.
+ */
+HeapTuple
+get_rolespec_tuple(const RoleSpec *role)
+{
+ HeapTuple tuple;
+
+ switch (role->roletype)
+ {
+ case ROLESPEC_CSTRING:
+ Assert(role->rolename);
+ tuple = SearchSysCache1(AUTHNAME, CStringGetDatum(role->rolename));
+ if (!HeapTupleIsValid(tuple))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("role \"%s\" does not exist", role->rolename)));
+ break;
+
+ case ROLESPEC_CURRENT_ROLE:
+ case ROLESPEC_CURRENT_USER:
+ tuple = SearchSysCache1(AUTHOID, GetUserId());
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for role %u", GetUserId());
+ break;
+
+ case ROLESPEC_SESSION_USER:
+ tuple = SearchSysCache1(AUTHOID, GetSessionUserId());
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for role %u", GetSessionUserId());
+ break;
+
+ case ROLESPEC_PUBLIC:
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("role \"%s\" does not exist", "public")));
+ tuple = NULL; /* make compiler happy */
+ break;
+
+ default:
+ elog(ERROR, "unexpected role type %d", role->roletype);
+ }
+
+ return tuple;
+}
+
+/*
+ * Given a RoleSpec, returns a palloc'ed copy of the corresponding role's name.
+ */
+char *
+get_rolespec_name(const RoleSpec *role)
+{
+ HeapTuple tp;
+ Form_pg_authid authForm;
+ char *rolename;
+
+ tp = get_rolespec_tuple(role);
+ authForm = (Form_pg_authid) GETSTRUCT(tp);
+ rolename = pstrdup(NameStr(authForm->rolname));
+ ReleaseSysCache(tp);
+
+ return rolename;
+}
+
+/*
+ * Given a RoleSpec, throw an error if the name is reserved, using detail_msg,
+ * if provided (which must be already translated).
+ *
+ * If node is NULL, no error is thrown. If detail_msg is NULL then no detail
+ * message is provided.
+ */
+void
+check_rolespec_name(const RoleSpec *role, const char *detail_msg)
+{
+ if (!role)
+ return;
+
+ if (role->roletype != ROLESPEC_CSTRING)
+ return;
+
+ if (IsReservedName(role->rolename))
+ {
+ if (detail_msg)
+ ereport(ERROR,
+ (errcode(ERRCODE_RESERVED_NAME),
+ errmsg("role name \"%s\" is reserved",
+ role->rolename),
+ errdetail_internal("%s", detail_msg)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_RESERVED_NAME),
+ errmsg("role name \"%s\" is reserved",
+ role->rolename)));
+ }
+}
diff --git a/src/backend/utils/adt/amutils.c b/src/backend/utils/adt/amutils.c
new file mode 100644
index 0000000..9d78a90
--- /dev/null
+++ b/src/backend/utils/adt/amutils.c
@@ -0,0 +1,470 @@
+/*-------------------------------------------------------------------------
+ *
+ * amutils.c
+ * SQL-level APIs related to index access methods.
+ *
+ * Copyright (c) 2016-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/amutils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/amapi.h"
+#include "access/htup_details.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_index.h"
+#include "utils/builtins.h"
+#include "utils/syscache.h"
+
+
+/* Convert string property name to enum, for efficiency */
+struct am_propname
+{
+ const char *name;
+ IndexAMProperty prop;
+};
+
+static const struct am_propname am_propnames[] =
+{
+ {
+ "asc", AMPROP_ASC
+ },
+ {
+ "desc", AMPROP_DESC
+ },
+ {
+ "nulls_first", AMPROP_NULLS_FIRST
+ },
+ {
+ "nulls_last", AMPROP_NULLS_LAST
+ },
+ {
+ "orderable", AMPROP_ORDERABLE
+ },
+ {
+ "distance_orderable", AMPROP_DISTANCE_ORDERABLE
+ },
+ {
+ "returnable", AMPROP_RETURNABLE
+ },
+ {
+ "search_array", AMPROP_SEARCH_ARRAY
+ },
+ {
+ "search_nulls", AMPROP_SEARCH_NULLS
+ },
+ {
+ "clusterable", AMPROP_CLUSTERABLE
+ },
+ {
+ "index_scan", AMPROP_INDEX_SCAN
+ },
+ {
+ "bitmap_scan", AMPROP_BITMAP_SCAN
+ },
+ {
+ "backward_scan", AMPROP_BACKWARD_SCAN
+ },
+ {
+ "can_order", AMPROP_CAN_ORDER
+ },
+ {
+ "can_unique", AMPROP_CAN_UNIQUE
+ },
+ {
+ "can_multi_col", AMPROP_CAN_MULTI_COL
+ },
+ {
+ "can_exclude", AMPROP_CAN_EXCLUDE
+ },
+ {
+ "can_include", AMPROP_CAN_INCLUDE
+ },
+};
+
+static IndexAMProperty
+lookup_prop_name(const char *name)
+{
+ int i;
+
+ for (i = 0; i < lengthof(am_propnames); i++)
+ {
+ if (pg_strcasecmp(am_propnames[i].name, name) == 0)
+ return am_propnames[i].prop;
+ }
+
+ /* We do not throw an error, so that AMs can define their own properties */
+ return AMPROP_UNKNOWN;
+}
+
+/*
+ * Common code for properties that are just bit tests of indoptions.
+ *
+ * tuple: the pg_index heaptuple
+ * attno: identify the index column to test the indoptions of.
+ * guard: if false, a boolean false result is forced (saves code in caller).
+ * iopt_mask: mask for interesting indoption bit.
+ * iopt_expect: value for a "true" result (should be 0 or iopt_mask).
+ *
+ * Returns false to indicate a NULL result (for "unknown/inapplicable"),
+ * otherwise sets *res to the boolean value to return.
+ */
+static bool
+test_indoption(HeapTuple tuple, int attno, bool guard,
+ int16 iopt_mask, int16 iopt_expect,
+ bool *res)
+{
+ Datum datum;
+ bool isnull;
+ int2vector *indoption;
+ int16 indoption_val;
+
+ if (!guard)
+ {
+ *res = false;
+ return true;
+ }
+
+ datum = SysCacheGetAttr(INDEXRELID, tuple,
+ Anum_pg_index_indoption, &isnull);
+ Assert(!isnull);
+
+ indoption = ((int2vector *) DatumGetPointer(datum));
+ indoption_val = indoption->values[attno - 1];
+
+ *res = (indoption_val & iopt_mask) == iopt_expect;
+
+ return true;
+}
+
+
+/*
+ * Test property of an index AM, index, or index column.
+ *
+ * This is common code for different SQL-level funcs, so the amoid and
+ * index_oid parameters are mutually exclusive; we look up the amoid from the
+ * index_oid if needed, or if no index oid is given, we're looking at AM-wide
+ * properties.
+ */
+static Datum
+indexam_property(FunctionCallInfo fcinfo,
+ const char *propname,
+ Oid amoid, Oid index_oid, int attno)
+{
+ bool res = false;
+ bool isnull = false;
+ int natts = 0;
+ IndexAMProperty prop;
+ IndexAmRoutine *routine;
+
+ /* Try to convert property name to enum (no error if not known) */
+ prop = lookup_prop_name(propname);
+
+ /* If we have an index OID, look up the AM, and get # of columns too */
+ if (OidIsValid(index_oid))
+ {
+ HeapTuple tuple;
+ Form_pg_class rd_rel;
+
+ Assert(!OidIsValid(amoid));
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ PG_RETURN_NULL();
+ rd_rel = (Form_pg_class) GETSTRUCT(tuple);
+ if (rd_rel->relkind != RELKIND_INDEX &&
+ rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
+ {
+ ReleaseSysCache(tuple);
+ PG_RETURN_NULL();
+ }
+ amoid = rd_rel->relam;
+ natts = rd_rel->relnatts;
+ ReleaseSysCache(tuple);
+ }
+
+ /*
+ * At this point, either index_oid == InvalidOid or it's a valid index
+ * OID. Also, after this test and the one below, either attno == 0 for
+ * index-wide or AM-wide tests, or it's a valid column number in a valid
+ * index.
+ */
+ if (attno < 0 || attno > natts)
+ PG_RETURN_NULL();
+
+ /*
+ * Get AM information. If we don't have a valid AM OID, return NULL.
+ */
+ routine = GetIndexAmRoutineByAmId(amoid, true);
+ if (routine == NULL)
+ PG_RETURN_NULL();
+
+ /*
+ * If there's an AM property routine, give it a chance to override the
+ * generic logic. Proceed if it returns false.
+ */
+ if (routine->amproperty &&
+ routine->amproperty(index_oid, attno, prop, propname,
+ &res, &isnull))
+ {
+ if (isnull)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(res);
+ }
+
+ if (attno > 0)
+ {
+ HeapTuple tuple;
+ Form_pg_index rd_index;
+ bool iskey = true;
+
+ /*
+ * Handle column-level properties. Many of these need the pg_index row
+ * (which we also need to use to check for nonkey atts) so we fetch
+ * that first.
+ */
+ tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ PG_RETURN_NULL();
+ rd_index = (Form_pg_index) GETSTRUCT(tuple);
+
+ Assert(index_oid == rd_index->indexrelid);
+ Assert(attno > 0 && attno <= rd_index->indnatts);
+
+ isnull = true;
+
+ /*
+ * If amcaninclude, we might be looking at an attno for a nonkey
+ * column, for which we (generically) assume that most properties are
+ * null.
+ */
+ if (routine->amcaninclude
+ && attno > rd_index->indnkeyatts)
+ iskey = false;
+
+ switch (prop)
+ {
+ case AMPROP_ASC:
+ if (iskey &&
+ test_indoption(tuple, attno, routine->amcanorder,
+ INDOPTION_DESC, 0, &res))
+ isnull = false;
+ break;
+
+ case AMPROP_DESC:
+ if (iskey &&
+ test_indoption(tuple, attno, routine->amcanorder,
+ INDOPTION_DESC, INDOPTION_DESC, &res))
+ isnull = false;
+ break;
+
+ case AMPROP_NULLS_FIRST:
+ if (iskey &&
+ test_indoption(tuple, attno, routine->amcanorder,
+ INDOPTION_NULLS_FIRST, INDOPTION_NULLS_FIRST, &res))
+ isnull = false;
+ break;
+
+ case AMPROP_NULLS_LAST:
+ if (iskey &&
+ test_indoption(tuple, attno, routine->amcanorder,
+ INDOPTION_NULLS_FIRST, 0, &res))
+ isnull = false;
+ break;
+
+ case AMPROP_ORDERABLE:
+
+ /*
+ * generic assumption is that nonkey columns are not orderable
+ */
+ res = iskey ? routine->amcanorder : false;
+ isnull = false;
+ break;
+
+ case AMPROP_DISTANCE_ORDERABLE:
+
+ /*
+ * The conditions for whether a column is distance-orderable
+ * are really up to the AM (at time of writing, only GiST
+ * supports it at all). The planner has its own idea based on
+ * whether it finds an operator with amoppurpose 'o', but
+ * getting there from just the index column type seems like a
+ * lot of work. So instead we expect the AM to handle this in
+ * its amproperty routine. The generic result is to return
+ * false if the AM says it never supports this, or if this is
+ * a nonkey column, and null otherwise (meaning we don't
+ * know).
+ */
+ if (!iskey || !routine->amcanorderbyop)
+ {
+ res = false;
+ isnull = false;
+ }
+ break;
+
+ case AMPROP_RETURNABLE:
+
+ /* note that we ignore iskey for this property */
+
+ isnull = false;
+ res = false;
+
+ if (routine->amcanreturn)
+ {
+ /*
+ * If possible, the AM should handle this test in its
+ * amproperty function without opening the rel. But this
+ * is the generic fallback if it does not.
+ */
+ Relation indexrel = index_open(index_oid, AccessShareLock);
+
+ res = index_can_return(indexrel, attno);
+ index_close(indexrel, AccessShareLock);
+ }
+ break;
+
+ case AMPROP_SEARCH_ARRAY:
+ if (iskey)
+ {
+ res = routine->amsearcharray;
+ isnull = false;
+ }
+ break;
+
+ case AMPROP_SEARCH_NULLS:
+ if (iskey)
+ {
+ res = routine->amsearchnulls;
+ isnull = false;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ ReleaseSysCache(tuple);
+
+ if (!isnull)
+ PG_RETURN_BOOL(res);
+ PG_RETURN_NULL();
+ }
+
+ if (OidIsValid(index_oid))
+ {
+ /*
+ * Handle index-level properties. Currently, these only depend on the
+ * AM, but that might not be true forever, so we make users name an
+ * index not just an AM.
+ */
+ switch (prop)
+ {
+ case AMPROP_CLUSTERABLE:
+ PG_RETURN_BOOL(routine->amclusterable);
+
+ case AMPROP_INDEX_SCAN:
+ PG_RETURN_BOOL(routine->amgettuple ? true : false);
+
+ case AMPROP_BITMAP_SCAN:
+ PG_RETURN_BOOL(routine->amgetbitmap ? true : false);
+
+ case AMPROP_BACKWARD_SCAN:
+ PG_RETURN_BOOL(routine->amcanbackward);
+
+ default:
+ PG_RETURN_NULL();
+ }
+ }
+
+ /*
+ * Handle AM-level properties (those that control what you can say in
+ * CREATE INDEX).
+ */
+ switch (prop)
+ {
+ case AMPROP_CAN_ORDER:
+ PG_RETURN_BOOL(routine->amcanorder);
+
+ case AMPROP_CAN_UNIQUE:
+ PG_RETURN_BOOL(routine->amcanunique);
+
+ case AMPROP_CAN_MULTI_COL:
+ PG_RETURN_BOOL(routine->amcanmulticol);
+
+ case AMPROP_CAN_EXCLUDE:
+ PG_RETURN_BOOL(routine->amgettuple ? true : false);
+
+ case AMPROP_CAN_INCLUDE:
+ PG_RETURN_BOOL(routine->amcaninclude);
+
+ default:
+ PG_RETURN_NULL();
+ }
+}
+
+/*
+ * Test property of an AM specified by AM OID
+ */
+Datum
+pg_indexam_has_property(PG_FUNCTION_ARGS)
+{
+ Oid amoid = PG_GETARG_OID(0);
+ char *propname = text_to_cstring(PG_GETARG_TEXT_PP(1));
+
+ return indexam_property(fcinfo, propname, amoid, InvalidOid, 0);
+}
+
+/*
+ * Test property of an index specified by index OID
+ */
+Datum
+pg_index_has_property(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ char *propname = text_to_cstring(PG_GETARG_TEXT_PP(1));
+
+ return indexam_property(fcinfo, propname, InvalidOid, relid, 0);
+}
+
+/*
+ * Test property of an index column specified by index OID and column number
+ */
+Datum
+pg_index_column_has_property(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int32 attno = PG_GETARG_INT32(1);
+ char *propname = text_to_cstring(PG_GETARG_TEXT_PP(2));
+
+ /* Reject attno 0 immediately, so that attno > 0 identifies this case */
+ if (attno <= 0)
+ PG_RETURN_NULL();
+
+ return indexam_property(fcinfo, propname, InvalidOid, relid, attno);
+}
+
+/*
+ * Return the name of the given phase, as used for progress reporting by the
+ * given AM.
+ */
+Datum
+pg_indexam_progress_phasename(PG_FUNCTION_ARGS)
+{
+ Oid amoid = PG_GETARG_OID(0);
+ int32 phasenum = PG_GETARG_INT32(1);
+ IndexAmRoutine *routine;
+ char *name;
+
+ routine = GetIndexAmRoutineByAmId(amoid, true);
+ if (routine == NULL || !routine->ambuildphasename)
+ PG_RETURN_NULL();
+
+ name = routine->ambuildphasename(phasenum);
+ if (!name)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(CStringGetTextDatum(name));
+}
diff --git a/src/backend/utils/adt/array_expanded.c b/src/backend/utils/adt/array_expanded.c
new file mode 100644
index 0000000..20c584e
--- /dev/null
+++ b/src/backend/utils/adt/array_expanded.c
@@ -0,0 +1,453 @@
+/*-------------------------------------------------------------------------
+ *
+ * array_expanded.c
+ * Basic functions for manipulating expanded arrays.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/array_expanded.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/tupmacs.h"
+#include "utils/array.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+
+
+/* "Methods" required for an expanded object */
+static Size EA_get_flat_size(ExpandedObjectHeader *eohptr);
+static void EA_flatten_into(ExpandedObjectHeader *eohptr,
+ void *result, Size allocated_size);
+
+static const ExpandedObjectMethods EA_methods =
+{
+ EA_get_flat_size,
+ EA_flatten_into
+};
+
+/* Other local functions */
+static void copy_byval_expanded_array(ExpandedArrayHeader *eah,
+ ExpandedArrayHeader *oldeah);
+
+
+/*
+ * expand_array: convert an array Datum into an expanded array
+ *
+ * The expanded object will be a child of parentcontext.
+ *
+ * Some callers can provide cache space to avoid repeated lookups of element
+ * type data across calls; if so, pass a metacache pointer, making sure that
+ * metacache->element_type is initialized to InvalidOid before first call.
+ * If no cross-call caching is required, pass NULL for metacache.
+ */
+Datum
+expand_array(Datum arraydatum, MemoryContext parentcontext,
+ ArrayMetaState *metacache)
+{
+ ArrayType *array;
+ ExpandedArrayHeader *eah;
+ MemoryContext objcxt;
+ MemoryContext oldcxt;
+ ArrayMetaState fakecache;
+
+ /*
+ * Allocate private context for expanded object. We start by assuming
+ * that the array won't be very large; but if it does grow a lot, don't
+ * constrain aset.c's large-context behavior.
+ */
+ objcxt = AllocSetContextCreate(parentcontext,
+ "expanded array",
+ ALLOCSET_START_SMALL_SIZES);
+
+ /* Set up expanded array header */
+ eah = (ExpandedArrayHeader *)
+ MemoryContextAlloc(objcxt, sizeof(ExpandedArrayHeader));
+
+ EOH_init_header(&eah->hdr, &EA_methods, objcxt);
+ eah->ea_magic = EA_MAGIC;
+
+ /* If the source is an expanded array, we may be able to optimize */
+ if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+ {
+ ExpandedArrayHeader *oldeah = (ExpandedArrayHeader *) DatumGetEOHP(arraydatum);
+
+ Assert(oldeah->ea_magic == EA_MAGIC);
+
+ /*
+ * Update caller's cache if provided; we don't need it this time, but
+ * next call might be for a non-expanded source array. Furthermore,
+ * if the caller didn't provide a cache area, use some local storage
+ * to cache anyway, thereby avoiding a catalog lookup in the case
+ * where we fall through to the flat-copy code path.
+ */
+ if (metacache == NULL)
+ metacache = &fakecache;
+ metacache->element_type = oldeah->element_type;
+ metacache->typlen = oldeah->typlen;
+ metacache->typbyval = oldeah->typbyval;
+ metacache->typalign = oldeah->typalign;
+
+ /*
+ * If element type is pass-by-value and we have a Datum-array
+ * representation, just copy the source's metadata and Datum/isnull
+ * arrays. The original flat array, if present at all, adds no
+ * additional information so we need not copy it.
+ */
+ if (oldeah->typbyval && oldeah->dvalues != NULL)
+ {
+ copy_byval_expanded_array(eah, oldeah);
+ /* return a R/W pointer to the expanded array */
+ return EOHPGetRWDatum(&eah->hdr);
+ }
+
+ /*
+ * Otherwise, either we have only a flat representation or the
+ * elements are pass-by-reference. In either case, the best thing
+ * seems to be to copy the source as a flat representation and then
+ * deconstruct that later if necessary. For the pass-by-ref case, we
+ * could perhaps save some cycles with custom code that generates the
+ * deconstructed representation in parallel with copying the values,
+ * but it would be a lot of extra code for fairly marginal gain. So,
+ * fall through into the flat-source code path.
+ */
+ }
+
+ /*
+ * Detoast and copy source array into private context, as a flat array.
+ *
+ * Note that this coding risks leaking some memory in the private context
+ * if we have to fetch data from a TOAST table; however, experimentation
+ * says that the leak is minimal. Doing it this way saves a copy step,
+ * which seems worthwhile, especially if the array is large enough to need
+ * external storage.
+ */
+ oldcxt = MemoryContextSwitchTo(objcxt);
+ array = DatumGetArrayTypePCopy(arraydatum);
+ MemoryContextSwitchTo(oldcxt);
+
+ eah->ndims = ARR_NDIM(array);
+ /* note these pointers point into the fvalue header! */
+ eah->dims = ARR_DIMS(array);
+ eah->lbound = ARR_LBOUND(array);
+
+ /* Save array's element-type data for possible use later */
+ eah->element_type = ARR_ELEMTYPE(array);
+ if (metacache && metacache->element_type == eah->element_type)
+ {
+ /* We have a valid cache of representational data */
+ eah->typlen = metacache->typlen;
+ eah->typbyval = metacache->typbyval;
+ eah->typalign = metacache->typalign;
+ }
+ else
+ {
+ /* No, so look it up */
+ get_typlenbyvalalign(eah->element_type,
+ &eah->typlen,
+ &eah->typbyval,
+ &eah->typalign);
+ /* Update cache if provided */
+ if (metacache)
+ {
+ metacache->element_type = eah->element_type;
+ metacache->typlen = eah->typlen;
+ metacache->typbyval = eah->typbyval;
+ metacache->typalign = eah->typalign;
+ }
+ }
+
+ /* we don't make a deconstructed representation now */
+ eah->dvalues = NULL;
+ eah->dnulls = NULL;
+ eah->dvalueslen = 0;
+ eah->nelems = 0;
+ eah->flat_size = 0;
+
+ /* remember we have a flat representation */
+ eah->fvalue = array;
+ eah->fstartptr = ARR_DATA_PTR(array);
+ eah->fendptr = ((char *) array) + ARR_SIZE(array);
+
+ /* return a R/W pointer to the expanded array */
+ return EOHPGetRWDatum(&eah->hdr);
+}
+
+/*
+ * helper for expand_array(): copy pass-by-value Datum-array representation
+ */
+static void
+copy_byval_expanded_array(ExpandedArrayHeader *eah,
+ ExpandedArrayHeader *oldeah)
+{
+ MemoryContext objcxt = eah->hdr.eoh_context;
+ int ndims = oldeah->ndims;
+ int dvalueslen = oldeah->dvalueslen;
+
+ /* Copy array dimensionality information */
+ eah->ndims = ndims;
+ /* We can alloc both dimensionality arrays with one palloc */
+ eah->dims = (int *) MemoryContextAlloc(objcxt, ndims * 2 * sizeof(int));
+ eah->lbound = eah->dims + ndims;
+ /* .. but don't assume the source's arrays are contiguous */
+ memcpy(eah->dims, oldeah->dims, ndims * sizeof(int));
+ memcpy(eah->lbound, oldeah->lbound, ndims * sizeof(int));
+
+ /* Copy element-type data */
+ eah->element_type = oldeah->element_type;
+ eah->typlen = oldeah->typlen;
+ eah->typbyval = oldeah->typbyval;
+ eah->typalign = oldeah->typalign;
+
+ /* Copy the deconstructed representation */
+ eah->dvalues = (Datum *) MemoryContextAlloc(objcxt,
+ dvalueslen * sizeof(Datum));
+ memcpy(eah->dvalues, oldeah->dvalues, dvalueslen * sizeof(Datum));
+ if (oldeah->dnulls)
+ {
+ eah->dnulls = (bool *) MemoryContextAlloc(objcxt,
+ dvalueslen * sizeof(bool));
+ memcpy(eah->dnulls, oldeah->dnulls, dvalueslen * sizeof(bool));
+ }
+ else
+ eah->dnulls = NULL;
+ eah->dvalueslen = dvalueslen;
+ eah->nelems = oldeah->nelems;
+ eah->flat_size = oldeah->flat_size;
+
+ /* we don't make a flat representation */
+ eah->fvalue = NULL;
+ eah->fstartptr = NULL;
+ eah->fendptr = NULL;
+}
+
+/*
+ * get_flat_size method for expanded arrays
+ */
+static Size
+EA_get_flat_size(ExpandedObjectHeader *eohptr)
+{
+ ExpandedArrayHeader *eah = (ExpandedArrayHeader *) eohptr;
+ int nelems;
+ int ndims;
+ Datum *dvalues;
+ bool *dnulls;
+ Size nbytes;
+ int i;
+
+ Assert(eah->ea_magic == EA_MAGIC);
+
+ /* Easy if we have a valid flattened value */
+ if (eah->fvalue)
+ return ARR_SIZE(eah->fvalue);
+
+ /* If we have a cached size value, believe that */
+ if (eah->flat_size)
+ return eah->flat_size;
+
+ /*
+ * Compute space needed by examining dvalues/dnulls. Note that the result
+ * array will have a nulls bitmap if dnulls isn't NULL, even if the array
+ * doesn't actually contain any nulls now.
+ */
+ nelems = eah->nelems;
+ ndims = eah->ndims;
+ Assert(nelems == ArrayGetNItems(ndims, eah->dims));
+ dvalues = eah->dvalues;
+ dnulls = eah->dnulls;
+ nbytes = 0;
+ for (i = 0; i < nelems; i++)
+ {
+ if (dnulls && dnulls[i])
+ continue;
+ nbytes = att_addlength_datum(nbytes, eah->typlen, dvalues[i]);
+ nbytes = att_align_nominal(nbytes, eah->typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+
+ if (dnulls)
+ nbytes += ARR_OVERHEAD_WITHNULLS(ndims, nelems);
+ else
+ nbytes += ARR_OVERHEAD_NONULLS(ndims);
+
+ /* cache for next time */
+ eah->flat_size = nbytes;
+
+ return nbytes;
+}
+
+/*
+ * flatten_into method for expanded arrays
+ */
+static void
+EA_flatten_into(ExpandedObjectHeader *eohptr,
+ void *result, Size allocated_size)
+{
+ ExpandedArrayHeader *eah = (ExpandedArrayHeader *) eohptr;
+ ArrayType *aresult = (ArrayType *) result;
+ int nelems;
+ int ndims;
+ int32 dataoffset;
+
+ Assert(eah->ea_magic == EA_MAGIC);
+
+ /* Easy if we have a valid flattened value */
+ if (eah->fvalue)
+ {
+ Assert(allocated_size == ARR_SIZE(eah->fvalue));
+ memcpy(result, eah->fvalue, allocated_size);
+ return;
+ }
+
+ /* Else allocation should match previous get_flat_size result */
+ Assert(allocated_size == eah->flat_size);
+
+ /* Fill result array from dvalues/dnulls */
+ nelems = eah->nelems;
+ ndims = eah->ndims;
+
+ if (eah->dnulls)
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndims, nelems);
+ else
+ dataoffset = 0; /* marker for no null bitmap */
+
+ /* We must ensure that any pad space is zero-filled */
+ memset(aresult, 0, allocated_size);
+
+ SET_VARSIZE(aresult, allocated_size);
+ aresult->ndim = ndims;
+ aresult->dataoffset = dataoffset;
+ aresult->elemtype = eah->element_type;
+ memcpy(ARR_DIMS(aresult), eah->dims, ndims * sizeof(int));
+ memcpy(ARR_LBOUND(aresult), eah->lbound, ndims * sizeof(int));
+
+ CopyArrayEls(aresult,
+ eah->dvalues, eah->dnulls, nelems,
+ eah->typlen, eah->typbyval, eah->typalign,
+ false);
+}
+
+/*
+ * Argument fetching support code
+ */
+
+/*
+ * DatumGetExpandedArray: get a writable expanded array from an input argument
+ *
+ * Caution: if the input is a read/write pointer, this returns the input
+ * argument; so callers must be sure that their changes are "safe", that is
+ * they cannot leave the array in a corrupt state.
+ */
+ExpandedArrayHeader *
+DatumGetExpandedArray(Datum d)
+{
+ /* If it's a writable expanded array already, just return it */
+ if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+ {
+ ExpandedArrayHeader *eah = (ExpandedArrayHeader *) DatumGetEOHP(d);
+
+ Assert(eah->ea_magic == EA_MAGIC);
+ return eah;
+ }
+
+ /* Else expand the hard way */
+ d = expand_array(d, CurrentMemoryContext, NULL);
+ return (ExpandedArrayHeader *) DatumGetEOHP(d);
+}
+
+/*
+ * As above, when caller has the ability to cache element type info
+ */
+ExpandedArrayHeader *
+DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
+{
+ /* If it's a writable expanded array already, just return it */
+ if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+ {
+ ExpandedArrayHeader *eah = (ExpandedArrayHeader *) DatumGetEOHP(d);
+
+ Assert(eah->ea_magic == EA_MAGIC);
+ /* Update cache if provided */
+ if (metacache)
+ {
+ metacache->element_type = eah->element_type;
+ metacache->typlen = eah->typlen;
+ metacache->typbyval = eah->typbyval;
+ metacache->typalign = eah->typalign;
+ }
+ return eah;
+ }
+
+ /* Else expand using caller's cache if any */
+ d = expand_array(d, CurrentMemoryContext, metacache);
+ return (ExpandedArrayHeader *) DatumGetEOHP(d);
+}
+
+/*
+ * DatumGetAnyArrayP: return either an expanded array or a detoasted varlena
+ * array. The result must not be modified in-place.
+ */
+AnyArrayType *
+DatumGetAnyArrayP(Datum d)
+{
+ ExpandedArrayHeader *eah;
+
+ /*
+ * If it's an expanded array (RW or RO), return the header pointer.
+ */
+ if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(d)))
+ {
+ eah = (ExpandedArrayHeader *) DatumGetEOHP(d);
+ Assert(eah->ea_magic == EA_MAGIC);
+ return (AnyArrayType *) eah;
+ }
+
+ /* Else do regular detoasting as needed */
+ return (AnyArrayType *) PG_DETOAST_DATUM(d);
+}
+
+/*
+ * Create the Datum/isnull representation of an expanded array object
+ * if we didn't do so previously
+ */
+void
+deconstruct_expanded_array(ExpandedArrayHeader *eah)
+{
+ if (eah->dvalues == NULL)
+ {
+ MemoryContext oldcxt = MemoryContextSwitchTo(eah->hdr.eoh_context);
+ Datum *dvalues;
+ bool *dnulls;
+ int nelems;
+
+ dnulls = NULL;
+ deconstruct_array(eah->fvalue,
+ eah->element_type,
+ eah->typlen, eah->typbyval, eah->typalign,
+ &dvalues,
+ ARR_HASNULL(eah->fvalue) ? &dnulls : NULL,
+ &nelems);
+
+ /*
+ * Update header only after successful completion of this step. If
+ * deconstruct_array fails partway through, worst consequence is some
+ * leaked memory in the object's context. If the caller fails at a
+ * later point, that's fine, since the deconstructed representation is
+ * valid anyhow.
+ */
+ eah->dvalues = dvalues;
+ eah->dnulls = dnulls;
+ eah->dvalueslen = eah->nelems = nelems;
+ MemoryContextSwitchTo(oldcxt);
+ }
+}
diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c
new file mode 100644
index 0000000..8cbee14
--- /dev/null
+++ b/src/backend/utils/adt/array_selfuncs.c
@@ -0,0 +1,1193 @@
+/*-------------------------------------------------------------------------
+ *
+ * array_selfuncs.c
+ * Functions for selectivity estimation of array operators
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/array_selfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_statistic.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/selfuncs.h"
+#include "utils/typcache.h"
+
+
+/* Default selectivity constant for "@>" and "<@" operators */
+#define DEFAULT_CONTAIN_SEL 0.005
+
+/* Default selectivity constant for "&&" operator */
+#define DEFAULT_OVERLAP_SEL 0.01
+
+/* Default selectivity for given operator */
+#define DEFAULT_SEL(operator) \
+ ((operator) == OID_ARRAY_OVERLAP_OP ? \
+ DEFAULT_OVERLAP_SEL : DEFAULT_CONTAIN_SEL)
+
+static Selectivity calc_arraycontsel(VariableStatData *vardata, Datum constval,
+ Oid elemtype, Oid operator);
+static Selectivity mcelem_array_selec(ArrayType *array,
+ TypeCacheEntry *typentry,
+ Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ float4 *hist, int nhist,
+ Oid operator);
+static Selectivity mcelem_array_contain_overlap_selec(Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ Datum *array_data, int nitems,
+ Oid operator, TypeCacheEntry *typentry);
+static Selectivity mcelem_array_contained_selec(Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ Datum *array_data, int nitems,
+ float4 *hist, int nhist,
+ Oid operator, TypeCacheEntry *typentry);
+static float *calc_hist(const float4 *hist, int nhist, int n);
+static float *calc_distr(const float *p, int n, int m, float rest);
+static int floor_log2(uint32 n);
+static bool find_next_mcelem(Datum *mcelem, int nmcelem, Datum value,
+ int *index, TypeCacheEntry *typentry);
+static int element_compare(const void *key1, const void *key2, void *arg);
+static int float_compare_desc(const void *key1, const void *key2);
+
+
+/*
+ * scalararraysel_containment
+ * Estimate selectivity of ScalarArrayOpExpr via array containment.
+ *
+ * If we have const =/<> ANY/ALL (array_var) then we can estimate the
+ * selectivity as though this were an array containment operator,
+ * array_var op ARRAY[const].
+ *
+ * scalararraysel() has already verified that the ScalarArrayOpExpr's operator
+ * is the array element type's default equality or inequality operator, and
+ * has aggressively simplified both inputs to constants.
+ *
+ * Returns selectivity (0..1), or -1 if we fail to estimate selectivity.
+ */
+Selectivity
+scalararraysel_containment(PlannerInfo *root,
+ Node *leftop, Node *rightop,
+ Oid elemtype, bool isEquality, bool useOr,
+ int varRelid)
+{
+ Selectivity selec;
+ VariableStatData vardata;
+ Datum constval;
+ TypeCacheEntry *typentry;
+ FmgrInfo *cmpfunc;
+
+ /*
+ * rightop must be a variable, else punt.
+ */
+ examine_variable(root, rightop, varRelid, &vardata);
+ if (!vardata.rel)
+ {
+ ReleaseVariableStats(vardata);
+ return -1.0;
+ }
+
+ /*
+ * leftop must be a constant, else punt.
+ */
+ if (!IsA(leftop, Const))
+ {
+ ReleaseVariableStats(vardata);
+ return -1.0;
+ }
+ if (((Const *) leftop)->constisnull)
+ {
+ /* qual can't succeed if null on left */
+ ReleaseVariableStats(vardata);
+ return (Selectivity) 0.0;
+ }
+ constval = ((Const *) leftop)->constvalue;
+
+ /* Get element type's default comparison function */
+ typentry = lookup_type_cache(elemtype, TYPECACHE_CMP_PROC_FINFO);
+ if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
+ {
+ ReleaseVariableStats(vardata);
+ return -1.0;
+ }
+ cmpfunc = &typentry->cmp_proc_finfo;
+
+ /*
+ * If the operator is <>, swap ANY/ALL, then invert the result later.
+ */
+ if (!isEquality)
+ useOr = !useOr;
+
+ /* Get array element stats for var, if available */
+ if (HeapTupleIsValid(vardata.statsTuple) &&
+ statistic_proc_security_check(&vardata, cmpfunc->fn_oid))
+ {
+ Form_pg_statistic stats;
+ AttStatsSlot sslot;
+ AttStatsSlot hslot;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+
+ /* MCELEM will be an array of same type as element */
+ if (get_attstatsslot(&sslot, vardata.statsTuple,
+ STATISTIC_KIND_MCELEM, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS))
+ {
+ /* For ALL case, also get histogram of distinct-element counts */
+ if (useOr ||
+ !get_attstatsslot(&hslot, vardata.statsTuple,
+ STATISTIC_KIND_DECHIST, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ memset(&hslot, 0, sizeof(hslot));
+
+ /*
+ * For = ANY, estimate as var @> ARRAY[const].
+ *
+ * For = ALL, estimate as var <@ ARRAY[const].
+ */
+ if (useOr)
+ selec = mcelem_array_contain_overlap_selec(sslot.values,
+ sslot.nvalues,
+ sslot.numbers,
+ sslot.nnumbers,
+ &constval, 1,
+ OID_ARRAY_CONTAINS_OP,
+ typentry);
+ else
+ selec = mcelem_array_contained_selec(sslot.values,
+ sslot.nvalues,
+ sslot.numbers,
+ sslot.nnumbers,
+ &constval, 1,
+ hslot.numbers,
+ hslot.nnumbers,
+ OID_ARRAY_CONTAINED_OP,
+ typentry);
+
+ free_attstatsslot(&hslot);
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /* No most-common-elements info, so do without */
+ if (useOr)
+ selec = mcelem_array_contain_overlap_selec(NULL, 0,
+ NULL, 0,
+ &constval, 1,
+ OID_ARRAY_CONTAINS_OP,
+ typentry);
+ else
+ selec = mcelem_array_contained_selec(NULL, 0,
+ NULL, 0,
+ &constval, 1,
+ NULL, 0,
+ OID_ARRAY_CONTAINED_OP,
+ typentry);
+ }
+
+ /*
+ * MCE stats count only non-null rows, so adjust for null rows.
+ */
+ selec *= (1.0 - stats->stanullfrac);
+ }
+ else
+ {
+ /* No stats at all, so do without */
+ if (useOr)
+ selec = mcelem_array_contain_overlap_selec(NULL, 0,
+ NULL, 0,
+ &constval, 1,
+ OID_ARRAY_CONTAINS_OP,
+ typentry);
+ else
+ selec = mcelem_array_contained_selec(NULL, 0,
+ NULL, 0,
+ &constval, 1,
+ NULL, 0,
+ OID_ARRAY_CONTAINED_OP,
+ typentry);
+ /* we assume no nulls here, so no stanullfrac correction */
+ }
+
+ ReleaseVariableStats(vardata);
+
+ /*
+ * If the operator is <>, invert the results.
+ */
+ if (!isEquality)
+ selec = 1.0 - selec;
+
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * arraycontsel -- restriction selectivity for array @>, &&, <@ operators
+ */
+Datum
+arraycontsel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Selectivity selec;
+ Oid element_typeid;
+
+ /*
+ * If expression is not (variable op something) or (something op
+ * variable), then punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+
+ /*
+ * Can't do anything useful if the something is not a constant, either.
+ */
+ if (!IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+ }
+
+ /*
+ * The "&&", "@>" and "<@" operators are strict, so we can cope with a
+ * NULL constant right away.
+ */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(0.0);
+ }
+
+ /*
+ * If var is on the right, commute the operator, so that we can assume the
+ * var is on the left in what follows.
+ */
+ if (!varonleft)
+ {
+ if (operator == OID_ARRAY_CONTAINS_OP)
+ operator = OID_ARRAY_CONTAINED_OP;
+ else if (operator == OID_ARRAY_CONTAINED_OP)
+ operator = OID_ARRAY_CONTAINS_OP;
+ }
+
+ /*
+ * OK, there's a Var and a Const we're dealing with here. We need the
+ * Const to be an array with same element type as column, else we can't do
+ * anything useful. (Such cases will likely fail at runtime, but here
+ * we'd rather just return a default estimate.)
+ */
+ element_typeid = get_base_element_type(((Const *) other)->consttype);
+ if (element_typeid != InvalidOid &&
+ element_typeid == get_base_element_type(vardata.vartype))
+ {
+ selec = calc_arraycontsel(&vardata, ((Const *) other)->constvalue,
+ element_typeid, operator);
+ }
+ else
+ {
+ selec = DEFAULT_SEL(operator);
+ }
+
+ ReleaseVariableStats(vardata);
+
+ CLAMP_PROBABILITY(selec);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+/*
+ * arraycontjoinsel -- join selectivity for array @>, &&, <@ operators
+ */
+Datum
+arraycontjoinsel(PG_FUNCTION_ARGS)
+{
+ /* For the moment this is just a stub */
+ Oid operator = PG_GETARG_OID(1);
+
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+}
+
+/*
+ * Calculate selectivity for "arraycolumn @> const", "arraycolumn && const"
+ * or "arraycolumn <@ const" based on the statistics
+ *
+ * This function is mainly responsible for extracting the pg_statistic data
+ * to be used; we then pass the problem on to mcelem_array_selec().
+ */
+static Selectivity
+calc_arraycontsel(VariableStatData *vardata, Datum constval,
+ Oid elemtype, Oid operator)
+{
+ Selectivity selec;
+ TypeCacheEntry *typentry;
+ FmgrInfo *cmpfunc;
+ ArrayType *array;
+
+ /* Get element type's default comparison function */
+ typentry = lookup_type_cache(elemtype, TYPECACHE_CMP_PROC_FINFO);
+ if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
+ return DEFAULT_SEL(operator);
+ cmpfunc = &typentry->cmp_proc_finfo;
+
+ /*
+ * The caller made sure the const is an array with same element type, so
+ * get it now
+ */
+ array = DatumGetArrayTypeP(constval);
+
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ statistic_proc_security_check(vardata, cmpfunc->fn_oid))
+ {
+ Form_pg_statistic stats;
+ AttStatsSlot sslot;
+ AttStatsSlot hslot;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+
+ /* MCELEM will be an array of same type as column */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_MCELEM, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS))
+ {
+ /*
+ * For "array <@ const" case we also need histogram of distinct
+ * element counts.
+ */
+ if (operator != OID_ARRAY_CONTAINED_OP ||
+ !get_attstatsslot(&hslot, vardata->statsTuple,
+ STATISTIC_KIND_DECHIST, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ memset(&hslot, 0, sizeof(hslot));
+
+ /* Use the most-common-elements slot for the array Var. */
+ selec = mcelem_array_selec(array, typentry,
+ sslot.values, sslot.nvalues,
+ sslot.numbers, sslot.nnumbers,
+ hslot.numbers, hslot.nnumbers,
+ operator);
+
+ free_attstatsslot(&hslot);
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /* No most-common-elements info, so do without */
+ selec = mcelem_array_selec(array, typentry,
+ NULL, 0, NULL, 0, NULL, 0,
+ operator);
+ }
+
+ /*
+ * MCE stats count only non-null rows, so adjust for null rows.
+ */
+ selec *= (1.0 - stats->stanullfrac);
+ }
+ else
+ {
+ /* No stats at all, so do without */
+ selec = mcelem_array_selec(array, typentry,
+ NULL, 0, NULL, 0, NULL, 0,
+ operator);
+ /* we assume no nulls here, so no stanullfrac correction */
+ }
+
+ /* If constant was toasted, release the copy we made */
+ if (PointerGetDatum(array) != constval)
+ pfree(array);
+
+ return selec;
+}
+
+/*
+ * Array selectivity estimation based on most common elements statistics
+ *
+ * This function just deconstructs and sorts the array constant's contents,
+ * and then passes the problem on to mcelem_array_contain_overlap_selec or
+ * mcelem_array_contained_selec depending on the operator.
+ */
+static Selectivity
+mcelem_array_selec(ArrayType *array, TypeCacheEntry *typentry,
+ Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ float4 *hist, int nhist,
+ Oid operator)
+{
+ Selectivity selec;
+ int num_elems;
+ Datum *elem_values;
+ bool *elem_nulls;
+ bool null_present;
+ int nonnull_nitems;
+ int i;
+
+ /*
+ * Prepare constant array data for sorting. Sorting lets us find unique
+ * elements and efficiently merge with the MCELEM array.
+ */
+ deconstruct_array(array,
+ typentry->type_id,
+ typentry->typlen,
+ typentry->typbyval,
+ typentry->typalign,
+ &elem_values, &elem_nulls, &num_elems);
+
+ /* Collapse out any null elements */
+ nonnull_nitems = 0;
+ null_present = false;
+ for (i = 0; i < num_elems; i++)
+ {
+ if (elem_nulls[i])
+ null_present = true;
+ else
+ elem_values[nonnull_nitems++] = elem_values[i];
+ }
+
+ /*
+ * Query "column @> '{anything, null}'" matches nothing. For the other
+ * two operators, presence of a null in the constant can be ignored.
+ */
+ if (null_present && operator == OID_ARRAY_CONTAINS_OP)
+ {
+ pfree(elem_values);
+ pfree(elem_nulls);
+ return (Selectivity) 0.0;
+ }
+
+ /* Sort extracted elements using their default comparison function. */
+ qsort_arg(elem_values, nonnull_nitems, sizeof(Datum),
+ element_compare, typentry);
+
+ /* Separate cases according to operator */
+ if (operator == OID_ARRAY_CONTAINS_OP || operator == OID_ARRAY_OVERLAP_OP)
+ selec = mcelem_array_contain_overlap_selec(mcelem, nmcelem,
+ numbers, nnumbers,
+ elem_values, nonnull_nitems,
+ operator, typentry);
+ else if (operator == OID_ARRAY_CONTAINED_OP)
+ selec = mcelem_array_contained_selec(mcelem, nmcelem,
+ numbers, nnumbers,
+ elem_values, nonnull_nitems,
+ hist, nhist,
+ operator, typentry);
+ else
+ {
+ elog(ERROR, "arraycontsel called for unrecognized operator %u",
+ operator);
+ selec = 0.0; /* keep compiler quiet */
+ }
+
+ pfree(elem_values);
+ pfree(elem_nulls);
+ return selec;
+}
+
+/*
+ * Estimate selectivity of "column @> const" and "column && const" based on
+ * most common element statistics. This estimation assumes element
+ * occurrences are independent.
+ *
+ * mcelem (of length nmcelem) and numbers (of length nnumbers) are from
+ * the array column's MCELEM statistics slot, or are NULL/0 if stats are
+ * not available. array_data (of length nitems) is the constant's elements.
+ *
+ * Both the mcelem and array_data arrays are assumed presorted according
+ * to the element type's cmpfunc. Null elements are not present.
+ *
+ * TODO: this estimate probably could be improved by using the distinct
+ * elements count histogram. For example, excepting the special case of
+ * "column @> '{}'", we can multiply the calculated selectivity by the
+ * fraction of nonempty arrays in the column.
+ */
+static Selectivity
+mcelem_array_contain_overlap_selec(Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ Datum *array_data, int nitems,
+ Oid operator, TypeCacheEntry *typentry)
+{
+ Selectivity selec,
+ elem_selec;
+ int mcelem_index,
+ i;
+ bool use_bsearch;
+ float4 minfreq;
+
+ /*
+ * There should be three more Numbers than Values, because the last three
+ * cells should hold minimal and maximal frequency among the non-null
+ * elements, and then the frequency of null elements. Ignore the Numbers
+ * if not right.
+ */
+ if (nnumbers != nmcelem + 3)
+ {
+ numbers = NULL;
+ nnumbers = 0;
+ }
+
+ if (numbers)
+ {
+ /* Grab the lowest observed frequency */
+ minfreq = numbers[nmcelem];
+ }
+ else
+ {
+ /* Without statistics make some default assumptions */
+ minfreq = 2 * (float4) DEFAULT_CONTAIN_SEL;
+ }
+
+ /* Decide whether it is faster to use binary search or not. */
+ if (nitems * floor_log2((uint32) nmcelem) < nmcelem + nitems)
+ use_bsearch = true;
+ else
+ use_bsearch = false;
+
+ if (operator == OID_ARRAY_CONTAINS_OP)
+ {
+ /*
+ * Initial selectivity for "column @> const" query is 1.0, and it will
+ * be decreased with each element of constant array.
+ */
+ selec = 1.0;
+ }
+ else
+ {
+ /*
+ * Initial selectivity for "column && const" query is 0.0, and it will
+ * be increased with each element of constant array.
+ */
+ selec = 0.0;
+ }
+
+ /* Scan mcelem and array in parallel. */
+ mcelem_index = 0;
+ for (i = 0; i < nitems; i++)
+ {
+ bool match = false;
+
+ /* Ignore any duplicates in the array data. */
+ if (i > 0 &&
+ element_compare(&array_data[i - 1], &array_data[i], typentry) == 0)
+ continue;
+
+ /* Find the smallest MCELEM >= this array item. */
+ if (use_bsearch)
+ {
+ match = find_next_mcelem(mcelem, nmcelem, array_data[i],
+ &mcelem_index, typentry);
+ }
+ else
+ {
+ while (mcelem_index < nmcelem)
+ {
+ int cmp = element_compare(&mcelem[mcelem_index],
+ &array_data[i],
+ typentry);
+
+ if (cmp < 0)
+ mcelem_index++;
+ else
+ {
+ if (cmp == 0)
+ match = true; /* mcelem is found */
+ break;
+ }
+ }
+ }
+
+ if (match && numbers)
+ {
+ /* MCELEM matches the array item; use its frequency. */
+ elem_selec = numbers[mcelem_index];
+ mcelem_index++;
+ }
+ else
+ {
+ /*
+ * The element is not in MCELEM. Punt, but assume that the
+ * selectivity cannot be more than minfreq / 2.
+ */
+ elem_selec = Min(DEFAULT_CONTAIN_SEL, minfreq / 2);
+ }
+
+ /*
+ * Update overall selectivity using the current element's selectivity
+ * and an assumption of element occurrence independence.
+ */
+ if (operator == OID_ARRAY_CONTAINS_OP)
+ selec *= elem_selec;
+ else
+ selec = selec + elem_selec - selec * elem_selec;
+
+ /* Clamp intermediate results to stay sane despite roundoff error */
+ CLAMP_PROBABILITY(selec);
+ }
+
+ return selec;
+}
+
+/*
+ * Estimate selectivity of "column <@ const" based on most common element
+ * statistics.
+ *
+ * mcelem (of length nmcelem) and numbers (of length nnumbers) are from
+ * the array column's MCELEM statistics slot, or are NULL/0 if stats are
+ * not available. array_data (of length nitems) is the constant's elements.
+ * hist (of length nhist) is from the array column's DECHIST statistics slot,
+ * or is NULL/0 if those stats are not available.
+ *
+ * Both the mcelem and array_data arrays are assumed presorted according
+ * to the element type's cmpfunc. Null elements are not present.
+ *
+ * Independent element occurrence would imply a particular distribution of
+ * distinct element counts among matching rows. Real data usually falsifies
+ * that assumption. For example, in a set of 11-element integer arrays having
+ * elements in the range [0..10], element occurrences are typically not
+ * independent. If they were, a sufficiently-large set would include all
+ * distinct element counts 0 through 11. We correct for this using the
+ * histogram of distinct element counts.
+ *
+ * In the "column @> const" and "column && const" cases, we usually have a
+ * "const" with low number of elements (otherwise we have selectivity close
+ * to 0 or 1 respectively). That's why the effect of dependence related
+ * to distinct element count distribution is negligible there. In the
+ * "column <@ const" case, number of elements is usually high (otherwise we
+ * have selectivity close to 0). That's why we should do a correction with
+ * the array distinct element count distribution here.
+ *
+ * Using the histogram of distinct element counts produces a different
+ * distribution law than independent occurrences of elements. This
+ * distribution law can be described as follows:
+ *
+ * P(o1, o2, ..., on) = f1^o1 * (1 - f1)^(1 - o1) * f2^o2 *
+ * (1 - f2)^(1 - o2) * ... * fn^on * (1 - fn)^(1 - on) * hist[m] / ind[m]
+ *
+ * where:
+ * o1, o2, ..., on - occurrences of elements 1, 2, ..., n
+ * (1 - occurrence, 0 - no occurrence) in row
+ * f1, f2, ..., fn - frequencies of elements 1, 2, ..., n
+ * (scalar values in [0..1]) according to collected statistics
+ * m = o1 + o2 + ... + on = total number of distinct elements in row
+ * hist[m] - histogram data for occurrence of m elements.
+ * ind[m] - probability of m occurrences from n events assuming their
+ * probabilities to be equal to frequencies of array elements.
+ *
+ * ind[m] = sum(f1^o1 * (1 - f1)^(1 - o1) * f2^o2 * (1 - f2)^(1 - o2) *
+ * ... * fn^on * (1 - fn)^(1 - on), o1, o2, ..., on) | o1 + o2 + .. on = m
+ */
+static Selectivity
+mcelem_array_contained_selec(Datum *mcelem, int nmcelem,
+ float4 *numbers, int nnumbers,
+ Datum *array_data, int nitems,
+ float4 *hist, int nhist,
+ Oid operator, TypeCacheEntry *typentry)
+{
+ int mcelem_index,
+ i,
+ unique_nitems = 0;
+ float selec,
+ minfreq,
+ nullelem_freq;
+ float *dist,
+ *mcelem_dist,
+ *hist_part;
+ float avg_count,
+ mult,
+ rest;
+ float *elem_selec;
+
+ /*
+ * There should be three more Numbers than Values in the MCELEM slot,
+ * because the last three cells should hold minimal and maximal frequency
+ * among the non-null elements, and then the frequency of null elements.
+ * Punt if not right, because we can't do much without the element freqs.
+ */
+ if (numbers == NULL || nnumbers != nmcelem + 3)
+ return DEFAULT_CONTAIN_SEL;
+
+ /* Can't do much without a count histogram, either */
+ if (hist == NULL || nhist < 3)
+ return DEFAULT_CONTAIN_SEL;
+
+ /*
+ * Grab some of the summary statistics that compute_array_stats() stores:
+ * lowest frequency, frequency of null elements, and average distinct
+ * element count.
+ */
+ minfreq = numbers[nmcelem];
+ nullelem_freq = numbers[nmcelem + 2];
+ avg_count = hist[nhist - 1];
+
+ /*
+ * "rest" will be the sum of the frequencies of all elements not
+ * represented in MCELEM. The average distinct element count is the sum
+ * of the frequencies of *all* elements. Begin with that; we will proceed
+ * to subtract the MCELEM frequencies.
+ */
+ rest = avg_count;
+
+ /*
+ * mult is a multiplier representing estimate of probability that each
+ * mcelem that is not present in constant doesn't occur.
+ */
+ mult = 1.0f;
+
+ /*
+ * elem_selec is array of estimated frequencies for elements in the
+ * constant.
+ */
+ elem_selec = (float *) palloc(sizeof(float) * nitems);
+
+ /* Scan mcelem and array in parallel. */
+ mcelem_index = 0;
+ for (i = 0; i < nitems; i++)
+ {
+ bool match = false;
+
+ /* Ignore any duplicates in the array data. */
+ if (i > 0 &&
+ element_compare(&array_data[i - 1], &array_data[i], typentry) == 0)
+ continue;
+
+ /*
+ * Iterate over MCELEM until we find an entry greater than or equal to
+ * this element of the constant. Update "rest" and "mult" for mcelem
+ * entries skipped over.
+ */
+ while (mcelem_index < nmcelem)
+ {
+ int cmp = element_compare(&mcelem[mcelem_index],
+ &array_data[i],
+ typentry);
+
+ if (cmp < 0)
+ {
+ mult *= (1.0f - numbers[mcelem_index]);
+ rest -= numbers[mcelem_index];
+ mcelem_index++;
+ }
+ else
+ {
+ if (cmp == 0)
+ match = true; /* mcelem is found */
+ break;
+ }
+ }
+
+ if (match)
+ {
+ /* MCELEM matches the array item. */
+ elem_selec[unique_nitems] = numbers[mcelem_index];
+ /* "rest" is decremented for all mcelems, matched or not */
+ rest -= numbers[mcelem_index];
+ mcelem_index++;
+ }
+ else
+ {
+ /*
+ * The element is not in MCELEM. Punt, but assume that the
+ * selectivity cannot be more than minfreq / 2.
+ */
+ elem_selec[unique_nitems] = Min(DEFAULT_CONTAIN_SEL,
+ minfreq / 2);
+ }
+
+ unique_nitems++;
+ }
+
+ /*
+ * If we handled all constant elements without exhausting the MCELEM
+ * array, finish walking it to complete calculation of "rest" and "mult".
+ */
+ while (mcelem_index < nmcelem)
+ {
+ mult *= (1.0f - numbers[mcelem_index]);
+ rest -= numbers[mcelem_index];
+ mcelem_index++;
+ }
+
+ /*
+ * The presence of many distinct rare elements materially decreases
+ * selectivity. Use the Poisson distribution to estimate the probability
+ * of a column value having zero occurrences of such elements. See above
+ * for the definition of "rest".
+ */
+ mult *= exp(-rest);
+
+ /*----------
+ * Using the distinct element count histogram requires
+ * O(unique_nitems * (nmcelem + unique_nitems))
+ * operations. Beyond a certain computational cost threshold, it's
+ * reasonable to sacrifice accuracy for decreased planning time. We limit
+ * the number of operations to EFFORT * nmcelem; since nmcelem is limited
+ * by the column's statistics target, the work done is user-controllable.
+ *
+ * If the number of operations would be too large, we can reduce it
+ * without losing all accuracy by reducing unique_nitems and considering
+ * only the most-common elements of the constant array. To make the
+ * results exactly match what we would have gotten with only those
+ * elements to start with, we'd have to remove any discarded elements'
+ * frequencies from "mult", but since this is only an approximation
+ * anyway, we don't bother with that. Therefore it's sufficient to qsort
+ * elem_selec[] and take the largest elements. (They will no longer match
+ * up with the elements of array_data[], but we don't care.)
+ *----------
+ */
+#define EFFORT 100
+
+ if ((nmcelem + unique_nitems) > 0 &&
+ unique_nitems > EFFORT * nmcelem / (nmcelem + unique_nitems))
+ {
+ /*
+ * Use the quadratic formula to solve for largest allowable N. We
+ * have A = 1, B = nmcelem, C = - EFFORT * nmcelem.
+ */
+ double b = (double) nmcelem;
+ int n;
+
+ n = (int) ((sqrt(b * b + 4 * EFFORT * b) - b) / 2);
+
+ /* Sort, then take just the first n elements */
+ qsort(elem_selec, unique_nitems, sizeof(float),
+ float_compare_desc);
+ unique_nitems = n;
+ }
+
+ /*
+ * Calculate probabilities of each distinct element count for both mcelems
+ * and constant elements. At this point, assume independent element
+ * occurrence.
+ */
+ dist = calc_distr(elem_selec, unique_nitems, unique_nitems, 0.0f);
+ mcelem_dist = calc_distr(numbers, nmcelem, unique_nitems, rest);
+
+ /* ignore hist[nhist-1], which is the average not a histogram member */
+ hist_part = calc_hist(hist, nhist - 1, unique_nitems);
+
+ selec = 0.0f;
+ for (i = 0; i <= unique_nitems; i++)
+ {
+ /*
+ * mult * dist[i] / mcelem_dist[i] gives us probability of qual
+ * matching from assumption of independent element occurrence with the
+ * condition that distinct element count = i.
+ */
+ if (mcelem_dist[i] > 0)
+ selec += hist_part[i] * mult * dist[i] / mcelem_dist[i];
+ }
+
+ pfree(dist);
+ pfree(mcelem_dist);
+ pfree(hist_part);
+ pfree(elem_selec);
+
+ /* Take into account occurrence of NULL element. */
+ selec *= (1.0f - nullelem_freq);
+
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * Calculate the first n distinct element count probabilities from a
+ * histogram of distinct element counts.
+ *
+ * Returns a palloc'd array of n+1 entries, with array[k] being the
+ * probability of element count k, k in [0..n].
+ *
+ * We assume that a histogram box with bounds a and b gives 1 / ((b - a + 1) *
+ * (nhist - 1)) probability to each value in (a,b) and an additional half of
+ * that to a and b themselves.
+ */
+static float *
+calc_hist(const float4 *hist, int nhist, int n)
+{
+ float *hist_part;
+ int k,
+ i = 0;
+ float prev_interval = 0,
+ next_interval;
+ float frac;
+
+ hist_part = (float *) palloc((n + 1) * sizeof(float));
+
+ /*
+ * frac is a probability contribution for each interval between histogram
+ * values. We have nhist - 1 intervals, so contribution of each one will
+ * be 1 / (nhist - 1).
+ */
+ frac = 1.0f / ((float) (nhist - 1));
+
+ for (k = 0; k <= n; k++)
+ {
+ int count = 0;
+
+ /*
+ * Count the histogram boundaries equal to k. (Although the histogram
+ * should theoretically contain only exact integers, entries are
+ * floats so there could be roundoff error in large values. Treat any
+ * fractional value as equal to the next larger k.)
+ */
+ while (i < nhist && hist[i] <= k)
+ {
+ count++;
+ i++;
+ }
+
+ if (count > 0)
+ {
+ /* k is an exact bound for at least one histogram box. */
+ float val;
+
+ /* Find length between current histogram value and the next one */
+ if (i < nhist)
+ next_interval = hist[i] - hist[i - 1];
+ else
+ next_interval = 0;
+
+ /*
+ * count - 1 histogram boxes contain k exclusively. They
+ * contribute a total of (count - 1) * frac probability. Also
+ * factor in the partial histogram boxes on either side.
+ */
+ val = (float) (count - 1);
+ if (next_interval > 0)
+ val += 0.5f / next_interval;
+ if (prev_interval > 0)
+ val += 0.5f / prev_interval;
+ hist_part[k] = frac * val;
+
+ prev_interval = next_interval;
+ }
+ else
+ {
+ /* k does not appear as an exact histogram bound. */
+ if (prev_interval > 0)
+ hist_part[k] = frac / prev_interval;
+ else
+ hist_part[k] = 0.0f;
+ }
+ }
+
+ return hist_part;
+}
+
+/*
+ * Consider n independent events with probabilities p[]. This function
+ * calculates probabilities of exact k of events occurrence for k in [0..m].
+ * Returns a palloc'd array of size m+1.
+ *
+ * "rest" is the sum of the probabilities of all low-probability events not
+ * included in p.
+ *
+ * Imagine matrix M of size (n + 1) x (m + 1). Element M[i,j] denotes the
+ * probability that exactly j of first i events occur. Obviously M[0,0] = 1.
+ * For any constant j, each increment of i increases the probability iff the
+ * event occurs. So, by the law of total probability:
+ * M[i,j] = M[i - 1, j] * (1 - p[i]) + M[i - 1, j - 1] * p[i]
+ * for i > 0, j > 0.
+ * M[i,0] = M[i - 1, 0] * (1 - p[i]) for i > 0.
+ */
+static float *
+calc_distr(const float *p, int n, int m, float rest)
+{
+ float *row,
+ *prev_row,
+ *tmp;
+ int i,
+ j;
+
+ /*
+ * Since we return only the last row of the matrix and need only the
+ * current and previous row for calculations, allocate two rows.
+ */
+ row = (float *) palloc((m + 1) * sizeof(float));
+ prev_row = (float *) palloc((m + 1) * sizeof(float));
+
+ /* M[0,0] = 1 */
+ row[0] = 1.0f;
+ for (i = 1; i <= n; i++)
+ {
+ float t = p[i - 1];
+
+ /* Swap rows */
+ tmp = row;
+ row = prev_row;
+ prev_row = tmp;
+
+ /* Calculate next row */
+ for (j = 0; j <= i && j <= m; j++)
+ {
+ float val = 0.0f;
+
+ if (j < i)
+ val += prev_row[j] * (1.0f - t);
+ if (j > 0)
+ val += prev_row[j - 1] * t;
+ row[j] = val;
+ }
+ }
+
+ /*
+ * The presence of many distinct rare (not in "p") elements materially
+ * decreases selectivity. Model their collective occurrence with the
+ * Poisson distribution.
+ */
+ if (rest > DEFAULT_CONTAIN_SEL)
+ {
+ float t;
+
+ /* Swap rows */
+ tmp = row;
+ row = prev_row;
+ prev_row = tmp;
+
+ for (i = 0; i <= m; i++)
+ row[i] = 0.0f;
+
+ /* Value of Poisson distribution for 0 occurrences */
+ t = exp(-rest);
+
+ /*
+ * Calculate convolution of previously computed distribution and the
+ * Poisson distribution.
+ */
+ for (i = 0; i <= m; i++)
+ {
+ for (j = 0; j <= m - i; j++)
+ row[j + i] += prev_row[j] * t;
+
+ /* Get Poisson distribution value for (i + 1) occurrences */
+ t *= rest / (float) (i + 1);
+ }
+ }
+
+ pfree(prev_row);
+ return row;
+}
+
+/* Fast function for floor value of 2 based logarithm calculation. */
+static int
+floor_log2(uint32 n)
+{
+ int logval = 0;
+
+ if (n == 0)
+ return -1;
+ if (n >= (1 << 16))
+ {
+ n >>= 16;
+ logval += 16;
+ }
+ if (n >= (1 << 8))
+ {
+ n >>= 8;
+ logval += 8;
+ }
+ if (n >= (1 << 4))
+ {
+ n >>= 4;
+ logval += 4;
+ }
+ if (n >= (1 << 2))
+ {
+ n >>= 2;
+ logval += 2;
+ }
+ if (n >= (1 << 1))
+ {
+ logval += 1;
+ }
+ return logval;
+}
+
+/*
+ * find_next_mcelem binary-searches a most common elements array, starting
+ * from *index, for the first member >= value. It saves the position of the
+ * match into *index and returns true if it's an exact match. (Note: we
+ * assume the mcelem elements are distinct so there can't be more than one
+ * exact match.)
+ */
+static bool
+find_next_mcelem(Datum *mcelem, int nmcelem, Datum value, int *index,
+ TypeCacheEntry *typentry)
+{
+ int l = *index,
+ r = nmcelem - 1,
+ i,
+ res;
+
+ while (l <= r)
+ {
+ i = (l + r) / 2;
+ res = element_compare(&mcelem[i], &value, typentry);
+ if (res == 0)
+ {
+ *index = i;
+ return true;
+ }
+ else if (res < 0)
+ l = i + 1;
+ else
+ r = i - 1;
+ }
+ *index = l;
+ return false;
+}
+
+/*
+ * Comparison function for elements.
+ *
+ * We use the element type's default btree opclass, and its default collation
+ * if the type is collation-sensitive.
+ *
+ * XXX consider using SortSupport infrastructure
+ */
+static int
+element_compare(const void *key1, const void *key2, void *arg)
+{
+ Datum d1 = *((const Datum *) key1);
+ Datum d2 = *((const Datum *) key2);
+ TypeCacheEntry *typentry = (TypeCacheEntry *) arg;
+ FmgrInfo *cmpfunc = &typentry->cmp_proc_finfo;
+ Datum c;
+
+ c = FunctionCall2Coll(cmpfunc, typentry->typcollation, d1, d2);
+ return DatumGetInt32(c);
+}
+
+/*
+ * Comparison function for sorting floats into descending order.
+ */
+static int
+float_compare_desc(const void *key1, const void *key2)
+{
+ float d1 = *((const float *) key1);
+ float d2 = *((const float *) key2);
+
+ if (d1 > d2)
+ return -1;
+ else if (d1 < d2)
+ return 1;
+ else
+ return 0;
+}
diff --git a/src/backend/utils/adt/array_typanalyze.c b/src/backend/utils/adt/array_typanalyze.c
new file mode 100644
index 0000000..2360c68
--- /dev/null
+++ b/src/backend/utils/adt/array_typanalyze.c
@@ -0,0 +1,791 @@
+/*-------------------------------------------------------------------------
+ *
+ * array_typanalyze.c
+ * Functions for gathering statistics from array columns
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/array_typanalyze.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/detoast.h"
+#include "commands/vacuum.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/lsyscache.h"
+#include "utils/typcache.h"
+
+
+/*
+ * To avoid consuming too much memory, IO and CPU load during analysis, and/or
+ * too much space in the resulting pg_statistic rows, we ignore arrays that
+ * are wider than ARRAY_WIDTH_THRESHOLD (after detoasting!). Note that this
+ * number is considerably more than the similar WIDTH_THRESHOLD limit used
+ * in analyze.c's standard typanalyze code.
+ */
+#define ARRAY_WIDTH_THRESHOLD 0x10000
+
+/* Extra data for compute_array_stats function */
+typedef struct
+{
+ /* Information about array element type */
+ Oid type_id; /* element type's OID */
+ Oid eq_opr; /* default equality operator's OID */
+ Oid coll_id; /* collation to use */
+ bool typbyval; /* physical properties of element type */
+ int16 typlen;
+ char typalign;
+
+ /*
+ * Lookup data for element type's comparison and hash functions (these are
+ * in the type's typcache entry, which we expect to remain valid over the
+ * lifespan of the ANALYZE run)
+ */
+ FmgrInfo *cmp;
+ FmgrInfo *hash;
+
+ /* Saved state from std_typanalyze() */
+ AnalyzeAttrComputeStatsFunc std_compute_stats;
+ void *std_extra_data;
+} ArrayAnalyzeExtraData;
+
+/*
+ * While compute_array_stats is running, we keep a pointer to the extra data
+ * here for use by assorted subroutines. compute_array_stats doesn't
+ * currently need to be re-entrant, so avoiding this is not worth the extra
+ * notational cruft that would be needed.
+ */
+static ArrayAnalyzeExtraData *array_extra_data;
+
+/* A hash table entry for the Lossy Counting algorithm */
+typedef struct
+{
+ Datum key; /* This is 'e' from the LC algorithm. */
+ int frequency; /* This is 'f'. */
+ int delta; /* And this is 'delta'. */
+ int last_container; /* For de-duplication of array elements. */
+} TrackItem;
+
+/* A hash table entry for distinct-elements counts */
+typedef struct
+{
+ int count; /* Count of distinct elements in an array */
+ int frequency; /* Number of arrays seen with this count */
+} DECountItem;
+
+static void compute_array_stats(VacAttrStats *stats,
+ AnalyzeAttrFetchFunc fetchfunc, int samplerows, double totalrows);
+static void prune_element_hashtable(HTAB *elements_tab, int b_current);
+static uint32 element_hash(const void *key, Size keysize);
+static int element_match(const void *key1, const void *key2, Size keysize);
+static int element_compare(const void *key1, const void *key2);
+static int trackitem_compare_frequencies_desc(const void *e1, const void *e2, void *arg);
+static int trackitem_compare_element(const void *e1, const void *e2, void *arg);
+static int countitem_compare_count(const void *e1, const void *e2, void *arg);
+
+
+/*
+ * array_typanalyze -- typanalyze function for array columns
+ */
+Datum
+array_typanalyze(PG_FUNCTION_ARGS)
+{
+ VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0);
+ Oid element_typeid;
+ TypeCacheEntry *typentry;
+ ArrayAnalyzeExtraData *extra_data;
+
+ /*
+ * Call the standard typanalyze function. It may fail to find needed
+ * operators, in which case we also can't do anything, so just fail.
+ */
+ if (!std_typanalyze(stats))
+ PG_RETURN_BOOL(false);
+
+ /*
+ * Check attribute data type is a varlena array (or a domain over one).
+ */
+ element_typeid = get_base_element_type(stats->attrtypid);
+ if (!OidIsValid(element_typeid))
+ elog(ERROR, "array_typanalyze was invoked for non-array type %u",
+ stats->attrtypid);
+
+ /*
+ * Gather information about the element type. If we fail to find
+ * something, return leaving the state from std_typanalyze() in place.
+ */
+ typentry = lookup_type_cache(element_typeid,
+ TYPECACHE_EQ_OPR |
+ TYPECACHE_CMP_PROC_FINFO |
+ TYPECACHE_HASH_PROC_FINFO);
+
+ if (!OidIsValid(typentry->eq_opr) ||
+ !OidIsValid(typentry->cmp_proc_finfo.fn_oid) ||
+ !OidIsValid(typentry->hash_proc_finfo.fn_oid))
+ PG_RETURN_BOOL(true);
+
+ /* Store our findings for use by compute_array_stats() */
+ extra_data = (ArrayAnalyzeExtraData *) palloc(sizeof(ArrayAnalyzeExtraData));
+ extra_data->type_id = typentry->type_id;
+ extra_data->eq_opr = typentry->eq_opr;
+ extra_data->coll_id = stats->attrcollid; /* collation we should use */
+ extra_data->typbyval = typentry->typbyval;
+ extra_data->typlen = typentry->typlen;
+ extra_data->typalign = typentry->typalign;
+ extra_data->cmp = &typentry->cmp_proc_finfo;
+ extra_data->hash = &typentry->hash_proc_finfo;
+
+ /* Save old compute_stats and extra_data for scalar statistics ... */
+ extra_data->std_compute_stats = stats->compute_stats;
+ extra_data->std_extra_data = stats->extra_data;
+
+ /* ... and replace with our info */
+ stats->compute_stats = compute_array_stats;
+ stats->extra_data = extra_data;
+
+ /*
+ * Note we leave stats->minrows set as std_typanalyze set it. Should it
+ * be increased for array analysis purposes?
+ */
+
+ PG_RETURN_BOOL(true);
+}
+
+/*
+ * compute_array_stats() -- compute statistics for an array column
+ *
+ * This function computes statistics useful for determining selectivity of
+ * the array operators <@, &&, and @>. It is invoked by ANALYZE via the
+ * compute_stats hook after sample rows have been collected.
+ *
+ * We also invoke the standard compute_stats function, which will compute
+ * "scalar" statistics relevant to the btree-style array comparison operators.
+ * However, exact duplicates of an entire array may be rare despite many
+ * arrays sharing individual elements. This especially afflicts long arrays,
+ * which are also liable to lack all scalar statistics due to the low
+ * WIDTH_THRESHOLD used in analyze.c. So, in addition to the standard stats,
+ * we find the most common array elements and compute a histogram of distinct
+ * element counts.
+ *
+ * The algorithm used is Lossy Counting, as proposed in the paper "Approximate
+ * frequency counts over data streams" by G. S. Manku and R. Motwani, in
+ * Proceedings of the 28th International Conference on Very Large Data Bases,
+ * Hong Kong, China, August 2002, section 4.2. The paper is available at
+ * http://www.vldb.org/conf/2002/S10P03.pdf
+ *
+ * The Lossy Counting (aka LC) algorithm goes like this:
+ * Let s be the threshold frequency for an item (the minimum frequency we
+ * are interested in) and epsilon the error margin for the frequency. Let D
+ * be a set of triples (e, f, delta), where e is an element value, f is that
+ * element's frequency (actually, its current occurrence count) and delta is
+ * the maximum error in f. We start with D empty and process the elements in
+ * batches of size w. (The batch size is also known as "bucket size" and is
+ * equal to 1/epsilon.) Let the current batch number be b_current, starting
+ * with 1. For each element e we either increment its f count, if it's
+ * already in D, or insert a new triple into D with values (e, 1, b_current
+ * - 1). After processing each batch we prune D, by removing from it all
+ * elements with f + delta <= b_current. After the algorithm finishes we
+ * suppress all elements from D that do not satisfy f >= (s - epsilon) * N,
+ * where N is the total number of elements in the input. We emit the
+ * remaining elements with estimated frequency f/N. The LC paper proves
+ * that this algorithm finds all elements with true frequency at least s,
+ * and that no frequency is overestimated or is underestimated by more than
+ * epsilon. Furthermore, given reasonable assumptions about the input
+ * distribution, the required table size is no more than about 7 times w.
+ *
+ * In the absence of a principled basis for other particular values, we
+ * follow ts_typanalyze() and use parameters s = 0.07/K, epsilon = s/10.
+ * But we leave out the correction for stopwords, which do not apply to
+ * arrays. These parameters give bucket width w = K/0.007 and maximum
+ * expected hashtable size of about 1000 * K.
+ *
+ * Elements may repeat within an array. Since duplicates do not change the
+ * behavior of <@, && or @>, we want to count each element only once per
+ * array. Therefore, we store in the finished pg_statistic entry each
+ * element's frequency as the fraction of all non-null rows that contain it.
+ * We divide the raw counts by nonnull_cnt to get those figures.
+ */
+static void
+compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
+ int samplerows, double totalrows)
+{
+ ArrayAnalyzeExtraData *extra_data;
+ int num_mcelem;
+ int null_elem_cnt = 0;
+ int analyzed_rows = 0;
+
+ /* This is D from the LC algorithm. */
+ HTAB *elements_tab;
+ HASHCTL elem_hash_ctl;
+ HASH_SEQ_STATUS scan_status;
+
+ /* This is the current bucket number from the LC algorithm */
+ int b_current;
+
+ /* This is 'w' from the LC algorithm */
+ int bucket_width;
+ int array_no;
+ int64 element_no;
+ TrackItem *item;
+ int slot_idx;
+ HTAB *count_tab;
+ HASHCTL count_hash_ctl;
+ DECountItem *count_item;
+
+ extra_data = (ArrayAnalyzeExtraData *) stats->extra_data;
+
+ /*
+ * Invoke analyze.c's standard analysis function to create scalar-style
+ * stats for the column. It will expect its own extra_data pointer, so
+ * temporarily install that.
+ */
+ stats->extra_data = extra_data->std_extra_data;
+ extra_data->std_compute_stats(stats, fetchfunc, samplerows, totalrows);
+ stats->extra_data = extra_data;
+
+ /*
+ * Set up static pointer for use by subroutines. We wait till here in
+ * case std_compute_stats somehow recursively invokes us (probably not
+ * possible, but ...)
+ */
+ array_extra_data = extra_data;
+
+ /*
+ * We want statistics_target * 10 elements in the MCELEM array. This
+ * multiplier is pretty arbitrary, but is meant to reflect the fact that
+ * the number of individual elements tracked in pg_statistic ought to be
+ * more than the number of values for a simple scalar column.
+ */
+ num_mcelem = stats->attr->attstattarget * 10;
+
+ /*
+ * We set bucket width equal to num_mcelem / 0.007 as per the comment
+ * above.
+ */
+ bucket_width = num_mcelem * 1000 / 7;
+
+ /*
+ * Create the hashtable. It will be in local memory, so we don't need to
+ * worry about overflowing the initial size. Also we don't need to pay any
+ * attention to locking and memory management.
+ */
+ elem_hash_ctl.keysize = sizeof(Datum);
+ elem_hash_ctl.entrysize = sizeof(TrackItem);
+ elem_hash_ctl.hash = element_hash;
+ elem_hash_ctl.match = element_match;
+ elem_hash_ctl.hcxt = CurrentMemoryContext;
+ elements_tab = hash_create("Analyzed elements table",
+ num_mcelem,
+ &elem_hash_ctl,
+ HASH_ELEM | HASH_FUNCTION | HASH_COMPARE | HASH_CONTEXT);
+
+ /* hashtable for array distinct elements counts */
+ count_hash_ctl.keysize = sizeof(int);
+ count_hash_ctl.entrysize = sizeof(DECountItem);
+ count_hash_ctl.hcxt = CurrentMemoryContext;
+ count_tab = hash_create("Array distinct element count table",
+ 64,
+ &count_hash_ctl,
+ HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
+
+ /* Initialize counters. */
+ b_current = 1;
+ element_no = 0;
+
+ /* Loop over the arrays. */
+ for (array_no = 0; array_no < samplerows; array_no++)
+ {
+ Datum value;
+ bool isnull;
+ ArrayType *array;
+ int num_elems;
+ Datum *elem_values;
+ bool *elem_nulls;
+ bool null_present;
+ int j;
+ int64 prev_element_no = element_no;
+ int distinct_count;
+ bool count_item_found;
+
+ vacuum_delay_point();
+
+ value = fetchfunc(stats, array_no, &isnull);
+ if (isnull)
+ {
+ /* ignore arrays that are null overall */
+ continue;
+ }
+
+ /* Skip too-large values. */
+ if (toast_raw_datum_size(value) > ARRAY_WIDTH_THRESHOLD)
+ continue;
+ else
+ analyzed_rows++;
+
+ /*
+ * Now detoast the array if needed, and deconstruct into datums.
+ */
+ array = DatumGetArrayTypeP(value);
+
+ Assert(ARR_ELEMTYPE(array) == extra_data->type_id);
+ deconstruct_array(array,
+ extra_data->type_id,
+ extra_data->typlen,
+ extra_data->typbyval,
+ extra_data->typalign,
+ &elem_values, &elem_nulls, &num_elems);
+
+ /*
+ * We loop through the elements in the array and add them to our
+ * tracking hashtable.
+ */
+ null_present = false;
+ for (j = 0; j < num_elems; j++)
+ {
+ Datum elem_value;
+ bool found;
+
+ /* No null element processing other than flag setting here */
+ if (elem_nulls[j])
+ {
+ null_present = true;
+ continue;
+ }
+
+ /* Lookup current element in hashtable, adding it if new */
+ elem_value = elem_values[j];
+ item = (TrackItem *) hash_search(elements_tab,
+ (const void *) &elem_value,
+ HASH_ENTER, &found);
+
+ if (found)
+ {
+ /* The element value is already on the tracking list */
+
+ /*
+ * The operators we assist ignore duplicate array elements, so
+ * count a given distinct element only once per array.
+ */
+ if (item->last_container == array_no)
+ continue;
+
+ item->frequency++;
+ item->last_container = array_no;
+ }
+ else
+ {
+ /* Initialize new tracking list element */
+
+ /*
+ * If element type is pass-by-reference, we must copy it into
+ * palloc'd space, so that we can release the array below. (We
+ * do this so that the space needed for element values is
+ * limited by the size of the hashtable; if we kept all the
+ * array values around, it could be much more.)
+ */
+ item->key = datumCopy(elem_value,
+ extra_data->typbyval,
+ extra_data->typlen);
+
+ item->frequency = 1;
+ item->delta = b_current - 1;
+ item->last_container = array_no;
+ }
+
+ /* element_no is the number of elements processed (ie N) */
+ element_no++;
+
+ /* We prune the D structure after processing each bucket */
+ if (element_no % bucket_width == 0)
+ {
+ prune_element_hashtable(elements_tab, b_current);
+ b_current++;
+ }
+ }
+
+ /* Count null element presence once per array. */
+ if (null_present)
+ null_elem_cnt++;
+
+ /* Update frequency of the particular array distinct element count. */
+ distinct_count = (int) (element_no - prev_element_no);
+ count_item = (DECountItem *) hash_search(count_tab, &distinct_count,
+ HASH_ENTER,
+ &count_item_found);
+
+ if (count_item_found)
+ count_item->frequency++;
+ else
+ count_item->frequency = 1;
+
+ /* Free memory allocated while detoasting. */
+ if (PointerGetDatum(array) != value)
+ pfree(array);
+ pfree(elem_values);
+ pfree(elem_nulls);
+ }
+
+ /* Skip pg_statistic slots occupied by standard statistics */
+ slot_idx = 0;
+ while (slot_idx < STATISTIC_NUM_SLOTS && stats->stakind[slot_idx] != 0)
+ slot_idx++;
+ if (slot_idx > STATISTIC_NUM_SLOTS - 2)
+ elog(ERROR, "insufficient pg_statistic slots for array stats");
+
+ /* We can only compute real stats if we found some non-null values. */
+ if (analyzed_rows > 0)
+ {
+ int nonnull_cnt = analyzed_rows;
+ int count_items_count;
+ int i;
+ TrackItem **sort_table;
+ int track_len;
+ int64 cutoff_freq;
+ int64 minfreq,
+ maxfreq;
+
+ /*
+ * We assume the standard stats code already took care of setting
+ * stats_valid, stanullfrac, stawidth, stadistinct. We'd have to
+ * re-compute those values if we wanted to not store the standard
+ * stats.
+ */
+
+ /*
+ * Construct an array of the interesting hashtable items, that is,
+ * those meeting the cutoff frequency (s - epsilon)*N. Also identify
+ * the minimum and maximum frequencies among these items.
+ *
+ * Since epsilon = s/10 and bucket_width = 1/epsilon, the cutoff
+ * frequency is 9*N / bucket_width.
+ */
+ cutoff_freq = 9 * element_no / bucket_width;
+
+ i = hash_get_num_entries(elements_tab); /* surely enough space */
+ sort_table = (TrackItem **) palloc(sizeof(TrackItem *) * i);
+
+ hash_seq_init(&scan_status, elements_tab);
+ track_len = 0;
+ minfreq = element_no;
+ maxfreq = 0;
+ while ((item = (TrackItem *) hash_seq_search(&scan_status)) != NULL)
+ {
+ if (item->frequency > cutoff_freq)
+ {
+ sort_table[track_len++] = item;
+ minfreq = Min(minfreq, item->frequency);
+ maxfreq = Max(maxfreq, item->frequency);
+ }
+ }
+ Assert(track_len <= i);
+
+ /* emit some statistics for debug purposes */
+ elog(DEBUG3, "compute_array_stats: target # mces = %d, "
+ "bucket width = %d, "
+ "# elements = " INT64_FORMAT ", hashtable size = %d, "
+ "usable entries = %d",
+ num_mcelem, bucket_width, element_no, i, track_len);
+
+ /*
+ * If we obtained more elements than we really want, get rid of those
+ * with least frequencies. The easiest way is to qsort the array into
+ * descending frequency order and truncate the array.
+ */
+ if (num_mcelem < track_len)
+ {
+ qsort_interruptible(sort_table, track_len, sizeof(TrackItem *),
+ trackitem_compare_frequencies_desc, NULL);
+ /* reset minfreq to the smallest frequency we're keeping */
+ minfreq = sort_table[num_mcelem - 1]->frequency;
+ }
+ else
+ num_mcelem = track_len;
+
+ /* Generate MCELEM slot entry */
+ if (num_mcelem > 0)
+ {
+ MemoryContext old_context;
+ Datum *mcelem_values;
+ float4 *mcelem_freqs;
+
+ /*
+ * We want to store statistics sorted on the element value using
+ * the element type's default comparison function. This permits
+ * fast binary searches in selectivity estimation functions.
+ */
+ qsort_interruptible(sort_table, num_mcelem, sizeof(TrackItem *),
+ trackitem_compare_element, NULL);
+
+ /* Must copy the target values into anl_context */
+ old_context = MemoryContextSwitchTo(stats->anl_context);
+
+ /*
+ * We sorted statistics on the element value, but we want to be
+ * able to find the minimal and maximal frequencies without going
+ * through all the values. We also want the frequency of null
+ * elements. Store these three values at the end of mcelem_freqs.
+ */
+ mcelem_values = (Datum *) palloc(num_mcelem * sizeof(Datum));
+ mcelem_freqs = (float4 *) palloc((num_mcelem + 3) * sizeof(float4));
+
+ /*
+ * See comments above about use of nonnull_cnt as the divisor for
+ * the final frequency estimates.
+ */
+ for (i = 0; i < num_mcelem; i++)
+ {
+ TrackItem *item = sort_table[i];
+
+ mcelem_values[i] = datumCopy(item->key,
+ extra_data->typbyval,
+ extra_data->typlen);
+ mcelem_freqs[i] = (double) item->frequency /
+ (double) nonnull_cnt;
+ }
+ mcelem_freqs[i++] = (double) minfreq / (double) nonnull_cnt;
+ mcelem_freqs[i++] = (double) maxfreq / (double) nonnull_cnt;
+ mcelem_freqs[i++] = (double) null_elem_cnt / (double) nonnull_cnt;
+
+ MemoryContextSwitchTo(old_context);
+
+ stats->stakind[slot_idx] = STATISTIC_KIND_MCELEM;
+ stats->staop[slot_idx] = extra_data->eq_opr;
+ stats->stacoll[slot_idx] = extra_data->coll_id;
+ stats->stanumbers[slot_idx] = mcelem_freqs;
+ /* See above comment about extra stanumber entries */
+ stats->numnumbers[slot_idx] = num_mcelem + 3;
+ stats->stavalues[slot_idx] = mcelem_values;
+ stats->numvalues[slot_idx] = num_mcelem;
+ /* We are storing values of element type */
+ stats->statypid[slot_idx] = extra_data->type_id;
+ stats->statyplen[slot_idx] = extra_data->typlen;
+ stats->statypbyval[slot_idx] = extra_data->typbyval;
+ stats->statypalign[slot_idx] = extra_data->typalign;
+ slot_idx++;
+ }
+
+ /* Generate DECHIST slot entry */
+ count_items_count = hash_get_num_entries(count_tab);
+ if (count_items_count > 0)
+ {
+ int num_hist = stats->attr->attstattarget;
+ DECountItem **sorted_count_items;
+ int j;
+ int delta;
+ int64 frac;
+ float4 *hist;
+
+ /* num_hist must be at least 2 for the loop below to work */
+ num_hist = Max(num_hist, 2);
+
+ /*
+ * Create an array of DECountItem pointers, and sort them into
+ * increasing count order.
+ */
+ sorted_count_items = (DECountItem **)
+ palloc(sizeof(DECountItem *) * count_items_count);
+ hash_seq_init(&scan_status, count_tab);
+ j = 0;
+ while ((count_item = (DECountItem *) hash_seq_search(&scan_status)) != NULL)
+ {
+ sorted_count_items[j++] = count_item;
+ }
+ qsort_interruptible(sorted_count_items, count_items_count,
+ sizeof(DECountItem *),
+ countitem_compare_count, NULL);
+
+ /*
+ * Prepare to fill stanumbers with the histogram, followed by the
+ * average count. This array must be stored in anl_context.
+ */
+ hist = (float4 *)
+ MemoryContextAlloc(stats->anl_context,
+ sizeof(float4) * (num_hist + 1));
+ hist[num_hist] = (double) element_no / (double) nonnull_cnt;
+
+ /*----------
+ * Construct the histogram of distinct-element counts (DECs).
+ *
+ * The object of this loop is to copy the min and max DECs to
+ * hist[0] and hist[num_hist - 1], along with evenly-spaced DECs
+ * in between (where "evenly-spaced" is with reference to the
+ * whole input population of arrays). If we had a complete sorted
+ * array of DECs, one per analyzed row, the i'th hist value would
+ * come from DECs[i * (analyzed_rows - 1) / (num_hist - 1)]
+ * (compare the histogram-making loop in compute_scalar_stats()).
+ * But instead of that we have the sorted_count_items[] array,
+ * which holds unique DEC values with their frequencies (that is,
+ * a run-length-compressed version of the full array). So we
+ * control advancing through sorted_count_items[] with the
+ * variable "frac", which is defined as (x - y) * (num_hist - 1),
+ * where x is the index in the notional DECs array corresponding
+ * to the start of the next sorted_count_items[] element's run,
+ * and y is the index in DECs from which we should take the next
+ * histogram value. We have to advance whenever x <= y, that is
+ * frac <= 0. The x component is the sum of the frequencies seen
+ * so far (up through the current sorted_count_items[] element),
+ * and of course y * (num_hist - 1) = i * (analyzed_rows - 1),
+ * per the subscript calculation above. (The subscript calculation
+ * implies dropping any fractional part of y; in this formulation
+ * that's handled by not advancing until frac reaches 1.)
+ *
+ * Even though frac has a bounded range, it could overflow int32
+ * when working with very large statistics targets, so we do that
+ * math in int64.
+ *----------
+ */
+ delta = analyzed_rows - 1;
+ j = 0; /* current index in sorted_count_items */
+ /* Initialize frac for sorted_count_items[0]; y is initially 0 */
+ frac = (int64) sorted_count_items[0]->frequency * (num_hist - 1);
+ for (i = 0; i < num_hist; i++)
+ {
+ while (frac <= 0)
+ {
+ /* Advance, and update x component of frac */
+ j++;
+ frac += (int64) sorted_count_items[j]->frequency * (num_hist - 1);
+ }
+ hist[i] = sorted_count_items[j]->count;
+ frac -= delta; /* update y for upcoming i increment */
+ }
+ Assert(j == count_items_count - 1);
+
+ stats->stakind[slot_idx] = STATISTIC_KIND_DECHIST;
+ stats->staop[slot_idx] = extra_data->eq_opr;
+ stats->stacoll[slot_idx] = extra_data->coll_id;
+ stats->stanumbers[slot_idx] = hist;
+ stats->numnumbers[slot_idx] = num_hist + 1;
+ slot_idx++;
+ }
+ }
+
+ /*
+ * We don't need to bother cleaning up any of our temporary palloc's. The
+ * hashtable should also go away, as it used a child memory context.
+ */
+}
+
+/*
+ * A function to prune the D structure from the Lossy Counting algorithm.
+ * Consult compute_tsvector_stats() for wider explanation.
+ */
+static void
+prune_element_hashtable(HTAB *elements_tab, int b_current)
+{
+ HASH_SEQ_STATUS scan_status;
+ TrackItem *item;
+
+ hash_seq_init(&scan_status, elements_tab);
+ while ((item = (TrackItem *) hash_seq_search(&scan_status)) != NULL)
+ {
+ if (item->frequency + item->delta <= b_current)
+ {
+ Datum value = item->key;
+
+ if (hash_search(elements_tab, (const void *) &item->key,
+ HASH_REMOVE, NULL) == NULL)
+ elog(ERROR, "hash table corrupted");
+ /* We should free memory if element is not passed by value */
+ if (!array_extra_data->typbyval)
+ pfree(DatumGetPointer(value));
+ }
+ }
+}
+
+/*
+ * Hash function for elements.
+ *
+ * We use the element type's default hash opclass, and the column collation
+ * if the type is collation-sensitive.
+ */
+static uint32
+element_hash(const void *key, Size keysize)
+{
+ Datum d = *((const Datum *) key);
+ Datum h;
+
+ h = FunctionCall1Coll(array_extra_data->hash,
+ array_extra_data->coll_id,
+ d);
+ return DatumGetUInt32(h);
+}
+
+/*
+ * Matching function for elements, to be used in hashtable lookups.
+ */
+static int
+element_match(const void *key1, const void *key2, Size keysize)
+{
+ /* The keysize parameter is superfluous here */
+ return element_compare(key1, key2);
+}
+
+/*
+ * Comparison function for elements.
+ *
+ * We use the element type's default btree opclass, and the column collation
+ * if the type is collation-sensitive.
+ *
+ * XXX consider using SortSupport infrastructure
+ */
+static int
+element_compare(const void *key1, const void *key2)
+{
+ Datum d1 = *((const Datum *) key1);
+ Datum d2 = *((const Datum *) key2);
+ Datum c;
+
+ c = FunctionCall2Coll(array_extra_data->cmp,
+ array_extra_data->coll_id,
+ d1, d2);
+ return DatumGetInt32(c);
+}
+
+/*
+ * Comparator for sorting TrackItems by frequencies (descending sort)
+ */
+static int
+trackitem_compare_frequencies_desc(const void *e1, const void *e2, void *arg)
+{
+ const TrackItem *const *t1 = (const TrackItem *const *) e1;
+ const TrackItem *const *t2 = (const TrackItem *const *) e2;
+
+ return (*t2)->frequency - (*t1)->frequency;
+}
+
+/*
+ * Comparator for sorting TrackItems by element values
+ */
+static int
+trackitem_compare_element(const void *e1, const void *e2, void *arg)
+{
+ const TrackItem *const *t1 = (const TrackItem *const *) e1;
+ const TrackItem *const *t2 = (const TrackItem *const *) e2;
+
+ return element_compare(&(*t1)->key, &(*t2)->key);
+}
+
+/*
+ * Comparator for sorting DECountItems by count
+ */
+static int
+countitem_compare_count(const void *e1, const void *e2, void *arg)
+{
+ const DECountItem *const *t1 = (const DECountItem *const *) e1;
+ const DECountItem *const *t2 = (const DECountItem *const *) e2;
+
+ if ((*t1)->count < (*t2)->count)
+ return -1;
+ else if ((*t1)->count == (*t2)->count)
+ return 0;
+ else
+ return 1;
+}
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
new file mode 100644
index 0000000..e75c774
--- /dev/null
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -0,0 +1,912 @@
+/*-------------------------------------------------------------------------
+ *
+ * array_userfuncs.c
+ * Misc user-visible array support functions
+ *
+ * Copyright (c) 2003-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/array_userfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/typcache.h"
+
+
+static Datum array_position_common(FunctionCallInfo fcinfo);
+
+
+/*
+ * fetch_array_arg_replace_nulls
+ *
+ * Fetch an array-valued argument in expanded form; if it's null, construct an
+ * empty array value of the proper data type. Also cache basic element type
+ * information in fn_extra.
+ *
+ * Caution: if the input is a read/write pointer, this returns the input
+ * argument; so callers must be sure that their changes are "safe", that is
+ * they cannot leave the array in a corrupt state.
+ *
+ * If we're being called as an aggregate function, make sure any newly-made
+ * expanded array is allocated in the aggregate state context, so as to save
+ * copying operations.
+ */
+static ExpandedArrayHeader *
+fetch_array_arg_replace_nulls(FunctionCallInfo fcinfo, int argno)
+{
+ ExpandedArrayHeader *eah;
+ Oid element_type;
+ ArrayMetaState *my_extra;
+ MemoryContext resultcxt;
+
+ /* If first time through, create datatype cache struct */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ my_extra = (ArrayMetaState *)
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra->element_type = InvalidOid;
+ fcinfo->flinfo->fn_extra = my_extra;
+ }
+
+ /* Figure out which context we want the result in */
+ if (!AggCheckCallContext(fcinfo, &resultcxt))
+ resultcxt = CurrentMemoryContext;
+
+ /* Now collect the array value */
+ if (!PG_ARGISNULL(argno))
+ {
+ MemoryContext oldcxt = MemoryContextSwitchTo(resultcxt);
+
+ eah = PG_GETARG_EXPANDED_ARRAYX(argno, my_extra);
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else
+ {
+ /* We have to look up the array type and element type */
+ Oid arr_typeid = get_fn_expr_argtype(fcinfo->flinfo, argno);
+
+ if (!OidIsValid(arr_typeid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+ element_type = get_element_type(arr_typeid);
+ if (!OidIsValid(element_type))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("input data type is not an array")));
+
+ eah = construct_empty_expanded_array(element_type,
+ resultcxt,
+ my_extra);
+ }
+
+ return eah;
+}
+
+/*-----------------------------------------------------------------------------
+ * array_append :
+ * push an element onto the end of a one-dimensional array
+ *----------------------------------------------------------------------------
+ */
+Datum
+array_append(PG_FUNCTION_ARGS)
+{
+ ExpandedArrayHeader *eah;
+ Datum newelem;
+ bool isNull;
+ Datum result;
+ int *dimv,
+ *lb;
+ int indx;
+ ArrayMetaState *my_extra;
+
+ eah = fetch_array_arg_replace_nulls(fcinfo, 0);
+ isNull = PG_ARGISNULL(1);
+ if (isNull)
+ newelem = (Datum) 0;
+ else
+ newelem = PG_GETARG_DATUM(1);
+
+ if (eah->ndims == 1)
+ {
+ /* append newelem */
+ lb = eah->lbound;
+ dimv = eah->dims;
+
+ /* index of added elem is at lb[0] + (dimv[0] - 1) + 1 */
+ if (pg_add_s32_overflow(lb[0], dimv[0], &indx))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ }
+ else if (eah->ndims == 0)
+ indx = 1;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("argument must be empty or one-dimensional array")));
+
+ /* Perform element insertion */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+
+ result = array_set_element(EOHPGetRWDatum(&eah->hdr),
+ 1, &indx, newelem, isNull,
+ -1, my_extra->typlen, my_extra->typbyval, my_extra->typalign);
+
+ PG_RETURN_DATUM(result);
+}
+
+/*-----------------------------------------------------------------------------
+ * array_prepend :
+ * push an element onto the front of a one-dimensional array
+ *----------------------------------------------------------------------------
+ */
+Datum
+array_prepend(PG_FUNCTION_ARGS)
+{
+ ExpandedArrayHeader *eah;
+ Datum newelem;
+ bool isNull;
+ Datum result;
+ int *lb;
+ int indx;
+ int lb0;
+ ArrayMetaState *my_extra;
+
+ isNull = PG_ARGISNULL(0);
+ if (isNull)
+ newelem = (Datum) 0;
+ else
+ newelem = PG_GETARG_DATUM(0);
+ eah = fetch_array_arg_replace_nulls(fcinfo, 1);
+
+ if (eah->ndims == 1)
+ {
+ /* prepend newelem */
+ lb = eah->lbound;
+ lb0 = lb[0];
+
+ if (pg_sub_s32_overflow(lb0, 1, &indx))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ }
+ else if (eah->ndims == 0)
+ {
+ indx = 1;
+ lb0 = 1;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("argument must be empty or one-dimensional array")));
+
+ /* Perform element insertion */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+
+ result = array_set_element(EOHPGetRWDatum(&eah->hdr),
+ 1, &indx, newelem, isNull,
+ -1, my_extra->typlen, my_extra->typbyval, my_extra->typalign);
+
+ /* Readjust result's LB to match the input's, as expected for prepend */
+ Assert(result == EOHPGetRWDatum(&eah->hdr));
+ if (eah->ndims == 1)
+ {
+ /* This is ok whether we've deconstructed or not */
+ eah->lbound[0] = lb0;
+ }
+
+ PG_RETURN_DATUM(result);
+}
+
+/*-----------------------------------------------------------------------------
+ * array_cat :
+ * concatenate two nD arrays to form an nD array, or
+ * push an (n-1)D array onto the end of an nD array
+ *----------------------------------------------------------------------------
+ */
+Datum
+array_cat(PG_FUNCTION_ARGS)
+{
+ ArrayType *v1,
+ *v2;
+ ArrayType *result;
+ int *dims,
+ *lbs,
+ ndims,
+ nitems,
+ ndatabytes,
+ nbytes;
+ int *dims1,
+ *lbs1,
+ ndims1,
+ nitems1,
+ ndatabytes1;
+ int *dims2,
+ *lbs2,
+ ndims2,
+ nitems2,
+ ndatabytes2;
+ int i;
+ char *dat1,
+ *dat2;
+ bits8 *bitmap1,
+ *bitmap2;
+ Oid element_type;
+ Oid element_type1;
+ Oid element_type2;
+ int32 dataoffset;
+
+ /* Concatenating a null array is a no-op, just return the other input */
+ if (PG_ARGISNULL(0))
+ {
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ result = PG_GETARG_ARRAYTYPE_P(1);
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+ if (PG_ARGISNULL(1))
+ {
+ result = PG_GETARG_ARRAYTYPE_P(0);
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+
+ v1 = PG_GETARG_ARRAYTYPE_P(0);
+ v2 = PG_GETARG_ARRAYTYPE_P(1);
+
+ element_type1 = ARR_ELEMTYPE(v1);
+ element_type2 = ARR_ELEMTYPE(v2);
+
+ /* Check we have matching element types */
+ if (element_type1 != element_type2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot concatenate incompatible arrays"),
+ errdetail("Arrays with element types %s and %s are not "
+ "compatible for concatenation.",
+ format_type_be(element_type1),
+ format_type_be(element_type2))));
+
+ /* OK, use it */
+ element_type = element_type1;
+
+ /*----------
+ * We must have one of the following combinations of inputs:
+ * 1) one empty array, and one non-empty array
+ * 2) both arrays empty
+ * 3) two arrays with ndims1 == ndims2
+ * 4) ndims1 == ndims2 - 1
+ * 5) ndims1 == ndims2 + 1
+ *----------
+ */
+ ndims1 = ARR_NDIM(v1);
+ ndims2 = ARR_NDIM(v2);
+
+ /*
+ * short circuit - if one input array is empty, and the other is not, we
+ * return the non-empty one as the result
+ *
+ * if both are empty, return the first one
+ */
+ if (ndims1 == 0 && ndims2 > 0)
+ PG_RETURN_ARRAYTYPE_P(v2);
+
+ if (ndims2 == 0)
+ PG_RETURN_ARRAYTYPE_P(v1);
+
+ /* the rest fall under rule 3, 4, or 5 */
+ if (ndims1 != ndims2 &&
+ ndims1 != ndims2 - 1 &&
+ ndims1 != ndims2 + 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot concatenate incompatible arrays"),
+ errdetail("Arrays of %d and %d dimensions are not "
+ "compatible for concatenation.",
+ ndims1, ndims2)));
+
+ /* get argument array details */
+ lbs1 = ARR_LBOUND(v1);
+ lbs2 = ARR_LBOUND(v2);
+ dims1 = ARR_DIMS(v1);
+ dims2 = ARR_DIMS(v2);
+ dat1 = ARR_DATA_PTR(v1);
+ dat2 = ARR_DATA_PTR(v2);
+ bitmap1 = ARR_NULLBITMAP(v1);
+ bitmap2 = ARR_NULLBITMAP(v2);
+ nitems1 = ArrayGetNItems(ndims1, dims1);
+ nitems2 = ArrayGetNItems(ndims2, dims2);
+ ndatabytes1 = ARR_SIZE(v1) - ARR_DATA_OFFSET(v1);
+ ndatabytes2 = ARR_SIZE(v2) - ARR_DATA_OFFSET(v2);
+
+ if (ndims1 == ndims2)
+ {
+ /*
+ * resulting array is made up of the elements (possibly arrays
+ * themselves) of the input argument arrays
+ */
+ ndims = ndims1;
+ dims = (int *) palloc(ndims * sizeof(int));
+ lbs = (int *) palloc(ndims * sizeof(int));
+
+ dims[0] = dims1[0] + dims2[0];
+ lbs[0] = lbs1[0];
+
+ for (i = 1; i < ndims; i++)
+ {
+ if (dims1[i] != dims2[i] || lbs1[i] != lbs2[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot concatenate incompatible arrays"),
+ errdetail("Arrays with differing element dimensions are "
+ "not compatible for concatenation.")));
+
+ dims[i] = dims1[i];
+ lbs[i] = lbs1[i];
+ }
+ }
+ else if (ndims1 == ndims2 - 1)
+ {
+ /*
+ * resulting array has the second argument as the outer array, with
+ * the first argument inserted at the front of the outer dimension
+ */
+ ndims = ndims2;
+ dims = (int *) palloc(ndims * sizeof(int));
+ lbs = (int *) palloc(ndims * sizeof(int));
+ memcpy(dims, dims2, ndims * sizeof(int));
+ memcpy(lbs, lbs2, ndims * sizeof(int));
+
+ /* increment number of elements in outer array */
+ dims[0] += 1;
+
+ /* make sure the added element matches our existing elements */
+ for (i = 0; i < ndims1; i++)
+ {
+ if (dims1[i] != dims[i + 1] || lbs1[i] != lbs[i + 1])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot concatenate incompatible arrays"),
+ errdetail("Arrays with differing dimensions are not "
+ "compatible for concatenation.")));
+ }
+ }
+ else
+ {
+ /*
+ * (ndims1 == ndims2 + 1)
+ *
+ * resulting array has the first argument as the outer array, with the
+ * second argument appended to the end of the outer dimension
+ */
+ ndims = ndims1;
+ dims = (int *) palloc(ndims * sizeof(int));
+ lbs = (int *) palloc(ndims * sizeof(int));
+ memcpy(dims, dims1, ndims * sizeof(int));
+ memcpy(lbs, lbs1, ndims * sizeof(int));
+
+ /* increment number of elements in outer array */
+ dims[0] += 1;
+
+ /* make sure the added element matches our existing elements */
+ for (i = 0; i < ndims2; i++)
+ {
+ if (dims2[i] != dims[i + 1] || lbs2[i] != lbs[i + 1])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot concatenate incompatible arrays"),
+ errdetail("Arrays with differing dimensions are not "
+ "compatible for concatenation.")));
+ }
+ }
+
+ /* Do this mainly for overflow checking */
+ nitems = ArrayGetNItems(ndims, dims);
+ ArrayCheckBounds(ndims, dims, lbs);
+
+ /* build the result array */
+ ndatabytes = ndatabytes1 + ndatabytes2;
+ if (ARR_HASNULL(v1) || ARR_HASNULL(v2))
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndims, nitems);
+ nbytes = ndatabytes + dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes = ndatabytes + ARR_OVERHEAD_NONULLS(ndims);
+ }
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndims;
+ result->dataoffset = dataoffset;
+ result->elemtype = element_type;
+ memcpy(ARR_DIMS(result), dims, ndims * sizeof(int));
+ memcpy(ARR_LBOUND(result), lbs, ndims * sizeof(int));
+ /* data area is arg1 then arg2 */
+ memcpy(ARR_DATA_PTR(result), dat1, ndatabytes1);
+ memcpy(ARR_DATA_PTR(result) + ndatabytes1, dat2, ndatabytes2);
+ /* handle the null bitmap if needed */
+ if (ARR_HASNULL(result))
+ {
+ array_bitmap_copy(ARR_NULLBITMAP(result), 0,
+ bitmap1, 0,
+ nitems1);
+ array_bitmap_copy(ARR_NULLBITMAP(result), nitems1,
+ bitmap2, 0,
+ nitems2);
+ }
+
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+
+/*
+ * ARRAY_AGG(anynonarray) aggregate function
+ */
+Datum
+array_agg_transfn(PG_FUNCTION_ARGS)
+{
+ Oid arg1_typeid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ MemoryContext aggcontext;
+ ArrayBuildState *state;
+ Datum elem;
+
+ if (arg1_typeid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ /*
+ * Note: we do not need a run-time check about whether arg1_typeid is a
+ * valid array element type, because the parser would have verified that
+ * while resolving the input/result types of this polymorphic aggregate.
+ */
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "array_agg_transfn called in non-aggregate context");
+ }
+
+ if (PG_ARGISNULL(0))
+ state = initArrayResult(arg1_typeid, aggcontext, false);
+ else
+ state = (ArrayBuildState *) PG_GETARG_POINTER(0);
+
+ elem = PG_ARGISNULL(1) ? (Datum) 0 : PG_GETARG_DATUM(1);
+
+ state = accumArrayResult(state,
+ elem,
+ PG_ARGISNULL(1),
+ arg1_typeid,
+ aggcontext);
+
+ /*
+ * The transition type for array_agg() is declared to be "internal", which
+ * is a pass-by-value type the same size as a pointer. So we can safely
+ * pass the ArrayBuildState pointer through nodeAgg.c's machinations.
+ */
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+array_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ Datum result;
+ ArrayBuildState *state;
+ int dims[1];
+ int lbs[1];
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ? NULL : (ArrayBuildState *) PG_GETARG_POINTER(0);
+
+ if (state == NULL)
+ PG_RETURN_NULL(); /* returns null iff no input values */
+
+ dims[0] = state->nelems;
+ lbs[0] = 1;
+
+ /*
+ * Make the result. We cannot release the ArrayBuildState because
+ * sometimes aggregate final functions are re-executed. Rather, it is
+ * nodeAgg.c's responsibility to reset the aggcontext when it's safe to do
+ * so.
+ */
+ result = makeMdArrayResult(state, 1, dims, lbs,
+ CurrentMemoryContext,
+ false);
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * ARRAY_AGG(anyarray) aggregate function
+ */
+Datum
+array_agg_array_transfn(PG_FUNCTION_ARGS)
+{
+ Oid arg1_typeid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ MemoryContext aggcontext;
+ ArrayBuildStateArr *state;
+
+ if (arg1_typeid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ /*
+ * Note: we do not need a run-time check about whether arg1_typeid is a
+ * valid array type, because the parser would have verified that while
+ * resolving the input/result types of this polymorphic aggregate.
+ */
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "array_agg_array_transfn called in non-aggregate context");
+ }
+
+
+ if (PG_ARGISNULL(0))
+ state = initArrayResultArr(arg1_typeid, InvalidOid, aggcontext, false);
+ else
+ state = (ArrayBuildStateArr *) PG_GETARG_POINTER(0);
+
+ state = accumArrayResultArr(state,
+ PG_GETARG_DATUM(1),
+ PG_ARGISNULL(1),
+ arg1_typeid,
+ aggcontext);
+
+ /*
+ * The transition type for array_agg() is declared to be "internal", which
+ * is a pass-by-value type the same size as a pointer. So we can safely
+ * pass the ArrayBuildStateArr pointer through nodeAgg.c's machinations.
+ */
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+array_agg_array_finalfn(PG_FUNCTION_ARGS)
+{
+ Datum result;
+ ArrayBuildStateArr *state;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ? NULL : (ArrayBuildStateArr *) PG_GETARG_POINTER(0);
+
+ if (state == NULL)
+ PG_RETURN_NULL(); /* returns null iff no input values */
+
+ /*
+ * Make the result. We cannot release the ArrayBuildStateArr because
+ * sometimes aggregate final functions are re-executed. Rather, it is
+ * nodeAgg.c's responsibility to reset the aggcontext when it's safe to do
+ * so.
+ */
+ result = makeArrayResultArr(state, CurrentMemoryContext, false);
+
+ PG_RETURN_DATUM(result);
+}
+
+/*-----------------------------------------------------------------------------
+ * array_position, array_position_start :
+ * return the offset of a value in an array.
+ *
+ * IS NOT DISTINCT FROM semantics are used for comparisons. Return NULL when
+ * the value is not found.
+ *-----------------------------------------------------------------------------
+ */
+Datum
+array_position(PG_FUNCTION_ARGS)
+{
+ return array_position_common(fcinfo);
+}
+
+Datum
+array_position_start(PG_FUNCTION_ARGS)
+{
+ return array_position_common(fcinfo);
+}
+
+/*
+ * array_position_common
+ * Common code for array_position and array_position_start
+ *
+ * These are separate wrappers for the sake of opr_sanity regression test.
+ * They are not strict so we have to test for null inputs explicitly.
+ */
+static Datum
+array_position_common(FunctionCallInfo fcinfo)
+{
+ ArrayType *array;
+ Oid collation = PG_GET_COLLATION();
+ Oid element_type;
+ Datum searched_element,
+ value;
+ bool isnull;
+ int position,
+ position_min;
+ bool found = false;
+ TypeCacheEntry *typentry;
+ ArrayMetaState *my_extra;
+ bool null_search;
+ ArrayIterator array_iterator;
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ /*
+ * We refuse to search for elements in multi-dimensional arrays, since we
+ * have no good way to report the element's location in the array.
+ */
+ if (ARR_NDIM(array) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("searching for elements in multidimensional arrays is not supported")));
+
+ /* Searching in an empty array is well-defined, though: it always fails */
+ if (ARR_NDIM(array) < 1)
+ PG_RETURN_NULL();
+
+ if (PG_ARGISNULL(1))
+ {
+ /* fast return when the array doesn't have nulls */
+ if (!array_contains_nulls(array))
+ PG_RETURN_NULL();
+ searched_element = (Datum) 0;
+ null_search = true;
+ }
+ else
+ {
+ searched_element = PG_GETARG_DATUM(1);
+ null_search = false;
+ }
+
+ element_type = ARR_ELEMTYPE(array);
+ position = (ARR_LBOUND(array))[0] - 1;
+
+ /* figure out where to start */
+ if (PG_NARGS() == 3)
+ {
+ if (PG_ARGISNULL(2))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("initial position must not be null")));
+
+ position_min = PG_GETARG_INT32(2);
+ }
+ else
+ position_min = (ARR_LBOUND(array))[0];
+
+ /*
+ * We arrange to look up type info for array_create_iterator only once per
+ * series of calls, assuming the element type doesn't change underneath
+ * us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ get_typlenbyvalalign(element_type,
+ &my_extra->typlen,
+ &my_extra->typbyval,
+ &my_extra->typalign);
+
+ typentry = lookup_type_cache(element_type, TYPECACHE_EQ_OPR_FINFO);
+
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+
+ my_extra->element_type = element_type;
+ fmgr_info_cxt(typentry->eq_opr_finfo.fn_oid, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ }
+
+ /* Examine each array element until we find a match. */
+ array_iterator = array_create_iterator(array, 0, my_extra);
+ while (array_iterate(array_iterator, &value, &isnull))
+ {
+ position++;
+
+ /* skip initial elements if caller requested so */
+ if (position < position_min)
+ continue;
+
+ /*
+ * Can't look at the array element's value if it's null; but if we
+ * search for null, we have a hit and are done.
+ */
+ if (isnull || null_search)
+ {
+ if (isnull && null_search)
+ {
+ found = true;
+ break;
+ }
+ else
+ continue;
+ }
+
+ /* not nulls, so run the operator */
+ if (DatumGetBool(FunctionCall2Coll(&my_extra->proc, collation,
+ searched_element, value)))
+ {
+ found = true;
+ break;
+ }
+ }
+
+ array_free_iterator(array_iterator);
+
+ /* Avoid leaking memory when handed toasted input */
+ PG_FREE_IF_COPY(array, 0);
+
+ if (!found)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(position);
+}
+
+/*-----------------------------------------------------------------------------
+ * array_positions :
+ * return an array of positions of a value in an array.
+ *
+ * IS NOT DISTINCT FROM semantics are used for comparisons. Returns NULL when
+ * the input array is NULL. When the value is not found in the array, returns
+ * an empty array.
+ *
+ * This is not strict so we have to test for null inputs explicitly.
+ *-----------------------------------------------------------------------------
+ */
+Datum
+array_positions(PG_FUNCTION_ARGS)
+{
+ ArrayType *array;
+ Oid collation = PG_GET_COLLATION();
+ Oid element_type;
+ Datum searched_element,
+ value;
+ bool isnull;
+ int position;
+ TypeCacheEntry *typentry;
+ ArrayMetaState *my_extra;
+ bool null_search;
+ ArrayIterator array_iterator;
+ ArrayBuildState *astate = NULL;
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ /*
+ * We refuse to search for elements in multi-dimensional arrays, since we
+ * have no good way to report the element's location in the array.
+ */
+ if (ARR_NDIM(array) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("searching for elements in multidimensional arrays is not supported")));
+
+ astate = initArrayResult(INT4OID, CurrentMemoryContext, false);
+
+ /* Searching in an empty array is well-defined, though: it always fails */
+ if (ARR_NDIM(array) < 1)
+ PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext));
+
+ if (PG_ARGISNULL(1))
+ {
+ /* fast return when the array doesn't have nulls */
+ if (!array_contains_nulls(array))
+ PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext));
+ searched_element = (Datum) 0;
+ null_search = true;
+ }
+ else
+ {
+ searched_element = PG_GETARG_DATUM(1);
+ null_search = false;
+ }
+
+ element_type = ARR_ELEMTYPE(array);
+ position = (ARR_LBOUND(array))[0] - 1;
+
+ /*
+ * We arrange to look up type info for array_create_iterator only once per
+ * series of calls, assuming the element type doesn't change underneath
+ * us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ get_typlenbyvalalign(element_type,
+ &my_extra->typlen,
+ &my_extra->typbyval,
+ &my_extra->typalign);
+
+ typentry = lookup_type_cache(element_type, TYPECACHE_EQ_OPR_FINFO);
+
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+
+ my_extra->element_type = element_type;
+ fmgr_info_cxt(typentry->eq_opr_finfo.fn_oid, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ }
+
+ /*
+ * Accumulate each array position iff the element matches the given
+ * element.
+ */
+ array_iterator = array_create_iterator(array, 0, my_extra);
+ while (array_iterate(array_iterator, &value, &isnull))
+ {
+ position += 1;
+
+ /*
+ * Can't look at the array element's value if it's null; but if we
+ * search for null, we have a hit.
+ */
+ if (isnull || null_search)
+ {
+ if (isnull && null_search)
+ astate =
+ accumArrayResult(astate, Int32GetDatum(position), false,
+ INT4OID, CurrentMemoryContext);
+
+ continue;
+ }
+
+ /* not nulls, so run the operator */
+ if (DatumGetBool(FunctionCall2Coll(&my_extra->proc, collation,
+ searched_element, value)))
+ astate =
+ accumArrayResult(astate, Int32GetDatum(position), false,
+ INT4OID, CurrentMemoryContext);
+ }
+
+ array_free_iterator(array_iterator);
+
+ /* Avoid leaking memory when handed toasted input */
+ PG_FREE_IF_COPY(array, 0);
+
+ PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext));
+}
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
new file mode 100644
index 0000000..d887619
--- /dev/null
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -0,0 +1,6770 @@
+/*-------------------------------------------------------------------------
+ *
+ * arrayfuncs.c
+ * Support functions for arrays.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/arrayfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "optimizer/optimizer.h"
+#include "port/pg_bitutils.h"
+#include "utils/array.h"
+#include "utils/arrayaccess.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/selfuncs.h"
+#include "utils/typcache.h"
+
+
+/*
+ * GUC parameter
+ */
+bool Array_nulls = true;
+
+/*
+ * Local definitions
+ */
+#define ASSGN "="
+
+#define AARR_FREE_IF_COPY(array,n) \
+ do { \
+ if (!VARATT_IS_EXPANDED_HEADER(array)) \
+ PG_FREE_IF_COPY(array, n); \
+ } while (0)
+
+typedef enum
+{
+ ARRAY_NO_LEVEL,
+ ARRAY_LEVEL_STARTED,
+ ARRAY_ELEM_STARTED,
+ ARRAY_ELEM_COMPLETED,
+ ARRAY_QUOTED_ELEM_STARTED,
+ ARRAY_QUOTED_ELEM_COMPLETED,
+ ARRAY_ELEM_DELIMITED,
+ ARRAY_LEVEL_COMPLETED,
+ ARRAY_LEVEL_DELIMITED
+} ArrayParseState;
+
+/* Working state for array_iterate() */
+typedef struct ArrayIteratorData
+{
+ /* basic info about the array, set up during array_create_iterator() */
+ ArrayType *arr; /* array we're iterating through */
+ bits8 *nullbitmap; /* its null bitmap, if any */
+ int nitems; /* total number of elements in array */
+ int16 typlen; /* element type's length */
+ bool typbyval; /* element type's byval property */
+ char typalign; /* element type's align property */
+
+ /* information about the requested slice size */
+ int slice_ndim; /* slice dimension, or 0 if not slicing */
+ int slice_len; /* number of elements per slice */
+ int *slice_dims; /* slice dims array */
+ int *slice_lbound; /* slice lbound array */
+ Datum *slice_values; /* workspace of length slice_len */
+ bool *slice_nulls; /* workspace of length slice_len */
+
+ /* current position information, updated on each iteration */
+ char *data_ptr; /* our current position in the array */
+ int current_item; /* the item # we're at in the array */
+} ArrayIteratorData;
+
+static bool array_isspace(char ch);
+static int ArrayCount(const char *str, int *dim, char typdelim);
+static void ReadArrayStr(char *arrayStr, const char *origStr,
+ int nitems, int ndim, int *dim,
+ FmgrInfo *inputproc, Oid typioparam, int32 typmod,
+ char typdelim,
+ int typlen, bool typbyval, char typalign,
+ Datum *values, bool *nulls,
+ bool *hasnulls, int32 *nbytes);
+static void ReadArrayBinary(StringInfo buf, int nitems,
+ FmgrInfo *receiveproc, Oid typioparam, int32 typmod,
+ int typlen, bool typbyval, char typalign,
+ Datum *values, bool *nulls,
+ bool *hasnulls, int32 *nbytes);
+static Datum array_get_element_expanded(Datum arraydatum,
+ int nSubscripts, int *indx,
+ int arraytyplen,
+ int elmlen, bool elmbyval, char elmalign,
+ bool *isNull);
+static Datum array_set_element_expanded(Datum arraydatum,
+ int nSubscripts, int *indx,
+ Datum dataValue, bool isNull,
+ int arraytyplen,
+ int elmlen, bool elmbyval, char elmalign);
+static bool array_get_isnull(const bits8 *nullbitmap, int offset);
+static void array_set_isnull(bits8 *nullbitmap, int offset, bool isNull);
+static Datum ArrayCast(char *value, bool byval, int len);
+static int ArrayCastAndSet(Datum src,
+ int typlen, bool typbyval, char typalign,
+ char *dest);
+static char *array_seek(char *ptr, int offset, bits8 *nullbitmap, int nitems,
+ int typlen, bool typbyval, char typalign);
+static int array_nelems_size(char *ptr, int offset, bits8 *nullbitmap,
+ int nitems, int typlen, bool typbyval, char typalign);
+static int array_copy(char *destptr, int nitems,
+ char *srcptr, int offset, bits8 *nullbitmap,
+ int typlen, bool typbyval, char typalign);
+static int array_slice_size(char *arraydataptr, bits8 *arraynullsptr,
+ int ndim, int *dim, int *lb,
+ int *st, int *endp,
+ int typlen, bool typbyval, char typalign);
+static void array_extract_slice(ArrayType *newarray,
+ int ndim, int *dim, int *lb,
+ char *arraydataptr, bits8 *arraynullsptr,
+ int *st, int *endp,
+ int typlen, bool typbyval, char typalign);
+static void array_insert_slice(ArrayType *destArray, ArrayType *origArray,
+ ArrayType *srcArray,
+ int ndim, int *dim, int *lb,
+ int *st, int *endp,
+ int typlen, bool typbyval, char typalign);
+static int array_cmp(FunctionCallInfo fcinfo);
+static ArrayType *create_array_envelope(int ndims, int *dimv, int *lbsv, int nbytes,
+ Oid elmtype, int dataoffset);
+static ArrayType *array_fill_internal(ArrayType *dims, ArrayType *lbs,
+ Datum value, bool isnull, Oid elmtype,
+ FunctionCallInfo fcinfo);
+static ArrayType *array_replace_internal(ArrayType *array,
+ Datum search, bool search_isnull,
+ Datum replace, bool replace_isnull,
+ bool remove, Oid collation,
+ FunctionCallInfo fcinfo);
+static int width_bucket_array_float8(Datum operand, ArrayType *thresholds);
+static int width_bucket_array_fixed(Datum operand,
+ ArrayType *thresholds,
+ Oid collation,
+ TypeCacheEntry *typentry);
+static int width_bucket_array_variable(Datum operand,
+ ArrayType *thresholds,
+ Oid collation,
+ TypeCacheEntry *typentry);
+
+
+/*
+ * array_in :
+ * converts an array from the external format in "string" to
+ * its internal format.
+ *
+ * return value :
+ * the internal representation of the input array
+ */
+Datum
+array_in(PG_FUNCTION_ARGS)
+{
+ char *string = PG_GETARG_CSTRING(0); /* external form */
+ Oid element_type = PG_GETARG_OID(1); /* type of an array
+ * element */
+ int32 typmod = PG_GETARG_INT32(2); /* typmod for array elements */
+ int typlen;
+ bool typbyval;
+ char typalign;
+ char typdelim;
+ Oid typioparam;
+ char *string_save,
+ *p;
+ int i,
+ nitems;
+ Datum *dataPtr;
+ bool *nullsPtr;
+ bool hasnulls;
+ int32 nbytes;
+ int32 dataoffset;
+ ArrayType *retval;
+ int ndim,
+ dim[MAXDIM],
+ lBound[MAXDIM];
+ ArrayMetaState *my_extra;
+
+ /*
+ * We arrange to look up info about element type, including its input
+ * conversion proc, only once per series of calls, assuming the element
+ * type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ /*
+ * Get info about element type, including its input conversion proc
+ */
+ get_type_io_data(element_type, IOFunc_input,
+ &my_extra->typlen, &my_extra->typbyval,
+ &my_extra->typalign, &my_extra->typdelim,
+ &my_extra->typioparam, &my_extra->typiofunc);
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ my_extra->element_type = element_type;
+ }
+ typlen = my_extra->typlen;
+ typbyval = my_extra->typbyval;
+ typalign = my_extra->typalign;
+ typdelim = my_extra->typdelim;
+ typioparam = my_extra->typioparam;
+
+ /* Make a modifiable copy of the input */
+ string_save = pstrdup(string);
+
+ /*
+ * If the input string starts with dimension info, read and use that.
+ * Otherwise, we require the input to be in curly-brace style, and we
+ * prescan the input to determine dimensions.
+ *
+ * Dimension info takes the form of one or more [n] or [m:n] items. The
+ * outer loop iterates once per dimension item.
+ */
+ p = string_save;
+ ndim = 0;
+ for (;;)
+ {
+ char *q;
+ int ub;
+
+ /*
+ * Note: we currently allow whitespace between, but not within,
+ * dimension items.
+ */
+ while (array_isspace(*p))
+ p++;
+ if (*p != '[')
+ break; /* no more dimension items */
+ p++;
+ if (ndim >= MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ ndim + 1, MAXDIM)));
+
+ for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++)
+ /* skip */ ;
+ if (q == p) /* no digits? */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("\"[\" must introduce explicitly-specified array dimensions.")));
+
+ if (*q == ':')
+ {
+ /* [m:n] format */
+ *q = '\0';
+ lBound[ndim] = atoi(p);
+ p = q + 1;
+ for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++)
+ /* skip */ ;
+ if (q == p) /* no digits? */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Missing array dimension value.")));
+ }
+ else
+ {
+ /* [n] format */
+ lBound[ndim] = 1;
+ }
+ if (*q != ']')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Missing \"%s\" after array dimensions.",
+ "]")));
+
+ *q = '\0';
+ ub = atoi(p);
+ p = q + 1;
+ if (ub < lBound[ndim])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("upper bound cannot be less than lower bound")));
+
+ dim[ndim] = ub - lBound[ndim] + 1;
+ ndim++;
+ }
+
+ if (ndim == 0)
+ {
+ /* No array dimensions, so intuit dimensions from brace structure */
+ if (*p != '{')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Array value must start with \"{\" or dimension information.")));
+ ndim = ArrayCount(p, dim, typdelim);
+ for (i = 0; i < ndim; i++)
+ lBound[i] = 1;
+ }
+ else
+ {
+ int ndim_braces,
+ dim_braces[MAXDIM];
+
+ /* If array dimensions are given, expect '=' operator */
+ if (strncmp(p, ASSGN, strlen(ASSGN)) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Missing \"%s\" after array dimensions.",
+ ASSGN)));
+ p += strlen(ASSGN);
+ while (array_isspace(*p))
+ p++;
+
+ /*
+ * intuit dimensions from brace structure -- it better match what we
+ * were given
+ */
+ if (*p != '{')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Array contents must start with \"{\".")));
+ ndim_braces = ArrayCount(p, dim_braces, typdelim);
+ if (ndim_braces != ndim)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Specified array dimensions do not match array contents.")));
+ for (i = 0; i < ndim; ++i)
+ {
+ if (dim[i] != dim_braces[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", string),
+ errdetail("Specified array dimensions do not match array contents.")));
+ }
+ }
+
+#ifdef ARRAYDEBUG
+ printf("array_in- ndim %d (", ndim);
+ for (i = 0; i < ndim; i++)
+ {
+ printf(" %d", dim[i]);
+ };
+ printf(") for %s\n", string);
+#endif
+
+ /* This checks for overflow of the array dimensions */
+ nitems = ArrayGetNItems(ndim, dim);
+ ArrayCheckBounds(ndim, dim, lBound);
+
+ /* Empty array? */
+ if (nitems == 0)
+ PG_RETURN_ARRAYTYPE_P(construct_empty_array(element_type));
+
+ dataPtr = (Datum *) palloc(nitems * sizeof(Datum));
+ nullsPtr = (bool *) palloc(nitems * sizeof(bool));
+ ReadArrayStr(p, string,
+ nitems, ndim, dim,
+ &my_extra->proc, typioparam, typmod,
+ typdelim,
+ typlen, typbyval, typalign,
+ dataPtr, nullsPtr,
+ &hasnulls, &nbytes);
+ if (hasnulls)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nitems);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+ retval = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(retval, nbytes);
+ retval->ndim = ndim;
+ retval->dataoffset = dataoffset;
+
+ /*
+ * This comes from the array's pg_type.typelem (which points to the base
+ * data type's pg_type.oid) and stores system oids in user tables. This
+ * oid must be preserved by binary upgrades.
+ */
+ retval->elemtype = element_type;
+ memcpy(ARR_DIMS(retval), dim, ndim * sizeof(int));
+ memcpy(ARR_LBOUND(retval), lBound, ndim * sizeof(int));
+
+ CopyArrayEls(retval,
+ dataPtr, nullsPtr, nitems,
+ typlen, typbyval, typalign,
+ true);
+
+ pfree(dataPtr);
+ pfree(nullsPtr);
+ pfree(string_save);
+
+ PG_RETURN_ARRAYTYPE_P(retval);
+}
+
+/*
+ * array_isspace() --- a non-locale-dependent isspace()
+ *
+ * We used to use isspace() for parsing array values, but that has
+ * undesirable results: an array value might be silently interpreted
+ * differently depending on the locale setting. Now we just hard-wire
+ * the traditional ASCII definition of isspace().
+ */
+static bool
+array_isspace(char ch)
+{
+ if (ch == ' ' ||
+ ch == '\t' ||
+ ch == '\n' ||
+ ch == '\r' ||
+ ch == '\v' ||
+ ch == '\f')
+ return true;
+ return false;
+}
+
+/*
+ * ArrayCount
+ * Determines the dimensions for an array string.
+ *
+ * Returns number of dimensions as function result. The axis lengths are
+ * returned in dim[], which must be of size MAXDIM.
+ */
+static int
+ArrayCount(const char *str, int *dim, char typdelim)
+{
+ int nest_level = 0,
+ i;
+ int ndim = 1,
+ temp[MAXDIM],
+ nelems[MAXDIM],
+ nelems_last[MAXDIM];
+ bool in_quotes = false;
+ bool eoArray = false;
+ bool empty_array = true;
+ const char *ptr;
+ ArrayParseState parse_state = ARRAY_NO_LEVEL;
+
+ for (i = 0; i < MAXDIM; ++i)
+ {
+ temp[i] = dim[i] = nelems_last[i] = 0;
+ nelems[i] = 1;
+ }
+
+ ptr = str;
+ while (!eoArray)
+ {
+ bool itemdone = false;
+
+ while (!itemdone)
+ {
+ if (parse_state == ARRAY_ELEM_STARTED ||
+ parse_state == ARRAY_QUOTED_ELEM_STARTED)
+ empty_array = false;
+
+ switch (*ptr)
+ {
+ case '\0':
+ /* Signal a premature end of the string */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected end of input.")));
+ break;
+ case '\\':
+
+ /*
+ * An escape must be after a level start, after an element
+ * start, or after an element delimiter. In any case we
+ * now must be past an element start.
+ */
+ if (parse_state != ARRAY_LEVEL_STARTED &&
+ parse_state != ARRAY_ELEM_STARTED &&
+ parse_state != ARRAY_QUOTED_ELEM_STARTED &&
+ parse_state != ARRAY_ELEM_DELIMITED)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected \"%c\" character.",
+ '\\')));
+ if (parse_state != ARRAY_QUOTED_ELEM_STARTED)
+ parse_state = ARRAY_ELEM_STARTED;
+ /* skip the escaped character */
+ if (*(ptr + 1))
+ ptr++;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected end of input.")));
+ break;
+ case '"':
+
+ /*
+ * A quote must be after a level start, after a quoted
+ * element start, or after an element delimiter. In any
+ * case we now must be past an element start.
+ */
+ if (parse_state != ARRAY_LEVEL_STARTED &&
+ parse_state != ARRAY_QUOTED_ELEM_STARTED &&
+ parse_state != ARRAY_ELEM_DELIMITED)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected array element.")));
+ in_quotes = !in_quotes;
+ if (in_quotes)
+ parse_state = ARRAY_QUOTED_ELEM_STARTED;
+ else
+ parse_state = ARRAY_QUOTED_ELEM_COMPLETED;
+ break;
+ case '{':
+ if (!in_quotes)
+ {
+ /*
+ * A left brace can occur if no nesting has occurred
+ * yet, after a level start, or after a level
+ * delimiter.
+ */
+ if (parse_state != ARRAY_NO_LEVEL &&
+ parse_state != ARRAY_LEVEL_STARTED &&
+ parse_state != ARRAY_LEVEL_DELIMITED)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected \"%c\" character.",
+ '{')));
+ parse_state = ARRAY_LEVEL_STARTED;
+ if (nest_level >= MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ nest_level + 1, MAXDIM)));
+ temp[nest_level] = 0;
+ nest_level++;
+ if (ndim < nest_level)
+ ndim = nest_level;
+ }
+ break;
+ case '}':
+ if (!in_quotes)
+ {
+ /*
+ * A right brace can occur after an element start, an
+ * element completion, a quoted element completion, or
+ * a level completion.
+ */
+ if (parse_state != ARRAY_ELEM_STARTED &&
+ parse_state != ARRAY_ELEM_COMPLETED &&
+ parse_state != ARRAY_QUOTED_ELEM_COMPLETED &&
+ parse_state != ARRAY_LEVEL_COMPLETED &&
+ !(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected \"%c\" character.",
+ '}')));
+ parse_state = ARRAY_LEVEL_COMPLETED;
+ if (nest_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unmatched \"%c\" character.", '}')));
+ nest_level--;
+
+ if (nelems_last[nest_level] != 0 &&
+ nelems[nest_level] != nelems_last[nest_level])
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Multidimensional arrays must have "
+ "sub-arrays with matching "
+ "dimensions.")));
+ nelems_last[nest_level] = nelems[nest_level];
+ nelems[nest_level] = 1;
+ if (nest_level == 0)
+ eoArray = itemdone = true;
+ else
+ {
+ /*
+ * We don't set itemdone here; see comments in
+ * ReadArrayStr
+ */
+ temp[nest_level - 1]++;
+ }
+ }
+ break;
+ default:
+ if (!in_quotes)
+ {
+ if (*ptr == typdelim)
+ {
+ /*
+ * Delimiters can occur after an element start, an
+ * element completion, a quoted element
+ * completion, or a level completion.
+ */
+ if (parse_state != ARRAY_ELEM_STARTED &&
+ parse_state != ARRAY_ELEM_COMPLETED &&
+ parse_state != ARRAY_QUOTED_ELEM_COMPLETED &&
+ parse_state != ARRAY_LEVEL_COMPLETED)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected \"%c\" character.",
+ typdelim)));
+ if (parse_state == ARRAY_LEVEL_COMPLETED)
+ parse_state = ARRAY_LEVEL_DELIMITED;
+ else
+ parse_state = ARRAY_ELEM_DELIMITED;
+ itemdone = true;
+ nelems[nest_level - 1]++;
+ }
+ else if (!array_isspace(*ptr))
+ {
+ /*
+ * Other non-space characters must be after a
+ * level start, after an element start, or after
+ * an element delimiter. In any case we now must
+ * be past an element start.
+ */
+ if (parse_state != ARRAY_LEVEL_STARTED &&
+ parse_state != ARRAY_ELEM_STARTED &&
+ parse_state != ARRAY_ELEM_DELIMITED)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Unexpected array element.")));
+ parse_state = ARRAY_ELEM_STARTED;
+ }
+ }
+ break;
+ }
+ if (!itemdone)
+ ptr++;
+ }
+ temp[ndim - 1]++;
+ ptr++;
+ }
+
+ /* only whitespace is allowed after the closing brace */
+ while (*ptr)
+ {
+ if (!array_isspace(*ptr++))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"", str),
+ errdetail("Junk after closing right brace.")));
+ }
+
+ /* special case for an empty array */
+ if (empty_array)
+ return 0;
+
+ for (i = 0; i < ndim; ++i)
+ dim[i] = temp[i];
+
+ return ndim;
+}
+
+/*
+ * ReadArrayStr :
+ * parses the array string pointed to by "arrayStr" and converts the values
+ * to internal format. Unspecified elements are initialized to nulls.
+ * The array dimensions must already have been determined.
+ *
+ * Inputs:
+ * arrayStr: the string to parse.
+ * CAUTION: the contents of "arrayStr" will be modified!
+ * origStr: the unmodified input string, used only in error messages.
+ * nitems: total number of array elements, as already determined.
+ * ndim: number of array dimensions
+ * dim[]: array axis lengths
+ * inputproc: type-specific input procedure for element datatype.
+ * typioparam, typmod: auxiliary values to pass to inputproc.
+ * typdelim: the value delimiter (type-specific).
+ * typlen, typbyval, typalign: storage parameters of element datatype.
+ *
+ * Outputs:
+ * values[]: filled with converted data values.
+ * nulls[]: filled with is-null markers.
+ * *hasnulls: set true iff there are any null elements.
+ * *nbytes: set to total size of data area needed (including alignment
+ * padding but not including array header overhead).
+ *
+ * Note that values[] and nulls[] are allocated by the caller, and must have
+ * nitems elements.
+ */
+static void
+ReadArrayStr(char *arrayStr,
+ const char *origStr,
+ int nitems,
+ int ndim,
+ int *dim,
+ FmgrInfo *inputproc,
+ Oid typioparam,
+ int32 typmod,
+ char typdelim,
+ int typlen,
+ bool typbyval,
+ char typalign,
+ Datum *values,
+ bool *nulls,
+ bool *hasnulls,
+ int32 *nbytes)
+{
+ int i,
+ nest_level = 0;
+ char *srcptr;
+ bool in_quotes = false;
+ bool eoArray = false;
+ bool hasnull;
+ int32 totbytes;
+ int indx[MAXDIM],
+ prod[MAXDIM];
+
+ mda_get_prod(ndim, dim, prod);
+ MemSet(indx, 0, sizeof(indx));
+
+ /* Initialize is-null markers to true */
+ memset(nulls, true, nitems * sizeof(bool));
+
+ /*
+ * We have to remove " and \ characters to create a clean item value to
+ * pass to the datatype input routine. We overwrite each item value
+ * in-place within arrayStr to do this. srcptr is the current scan point,
+ * and dstptr is where we are copying to.
+ *
+ * We also want to suppress leading and trailing unquoted whitespace. We
+ * use the leadingspace flag to suppress leading space. Trailing space is
+ * tracked by using dstendptr to point to the last significant output
+ * character.
+ *
+ * The error checking in this routine is mostly pro-forma, since we expect
+ * that ArrayCount() already validated the string. So we don't bother
+ * with errdetail messages.
+ */
+ srcptr = arrayStr;
+ while (!eoArray)
+ {
+ bool itemdone = false;
+ bool leadingspace = true;
+ bool hasquoting = false;
+ char *itemstart;
+ char *dstptr;
+ char *dstendptr;
+
+ i = -1;
+ itemstart = dstptr = dstendptr = srcptr;
+
+ while (!itemdone)
+ {
+ switch (*srcptr)
+ {
+ case '\0':
+ /* Signal a premature end of the string */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"",
+ origStr)));
+ break;
+ case '\\':
+ /* Skip backslash, copy next character as-is. */
+ srcptr++;
+ if (*srcptr == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"",
+ origStr)));
+ *dstptr++ = *srcptr++;
+ /* Treat the escaped character as non-whitespace */
+ leadingspace = false;
+ dstendptr = dstptr;
+ hasquoting = true; /* can't be a NULL marker */
+ break;
+ case '"':
+ in_quotes = !in_quotes;
+ if (in_quotes)
+ leadingspace = false;
+ else
+ {
+ /*
+ * Advance dstendptr when we exit in_quotes; this
+ * saves having to do it in all the other in_quotes
+ * cases.
+ */
+ dstendptr = dstptr;
+ }
+ hasquoting = true; /* can't be a NULL marker */
+ srcptr++;
+ break;
+ case '{':
+ if (!in_quotes)
+ {
+ if (nest_level >= ndim)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"",
+ origStr)));
+ nest_level++;
+ indx[nest_level - 1] = 0;
+ srcptr++;
+ }
+ else
+ *dstptr++ = *srcptr++;
+ break;
+ case '}':
+ if (!in_quotes)
+ {
+ if (nest_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"",
+ origStr)));
+ if (i == -1)
+ i = ArrayGetOffset0(ndim, indx, prod);
+ indx[nest_level - 1] = 0;
+ nest_level--;
+ if (nest_level == 0)
+ eoArray = itemdone = true;
+ else
+ indx[nest_level - 1]++;
+ srcptr++;
+ }
+ else
+ *dstptr++ = *srcptr++;
+ break;
+ default:
+ if (in_quotes)
+ *dstptr++ = *srcptr++;
+ else if (*srcptr == typdelim)
+ {
+ if (i == -1)
+ i = ArrayGetOffset0(ndim, indx, prod);
+ itemdone = true;
+ indx[ndim - 1]++;
+ srcptr++;
+ }
+ else if (array_isspace(*srcptr))
+ {
+ /*
+ * If leading space, drop it immediately. Else, copy
+ * but don't advance dstendptr.
+ */
+ if (leadingspace)
+ srcptr++;
+ else
+ *dstptr++ = *srcptr++;
+ }
+ else
+ {
+ *dstptr++ = *srcptr++;
+ leadingspace = false;
+ dstendptr = dstptr;
+ }
+ break;
+ }
+ }
+
+ Assert(dstptr < srcptr);
+ *dstendptr = '\0';
+
+ if (i < 0 || i >= nitems)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed array literal: \"%s\"",
+ origStr)));
+
+ if (Array_nulls && !hasquoting &&
+ pg_strcasecmp(itemstart, "NULL") == 0)
+ {
+ /* it's a NULL item */
+ values[i] = InputFunctionCall(inputproc, NULL,
+ typioparam, typmod);
+ nulls[i] = true;
+ }
+ else
+ {
+ values[i] = InputFunctionCall(inputproc, itemstart,
+ typioparam, typmod);
+ nulls[i] = false;
+ }
+ }
+
+ /*
+ * Check for nulls, compute total data space needed
+ */
+ hasnull = false;
+ totbytes = 0;
+ for (i = 0; i < nitems; i++)
+ {
+ if (nulls[i])
+ hasnull = true;
+ else
+ {
+ /* let's just make sure data is not toasted */
+ if (typlen == -1)
+ values[i] = PointerGetDatum(PG_DETOAST_DATUM(values[i]));
+ totbytes = att_addlength_datum(totbytes, typlen, values[i]);
+ totbytes = att_align_nominal(totbytes, typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(totbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+ }
+ *hasnulls = hasnull;
+ *nbytes = totbytes;
+}
+
+
+/*
+ * Copy data into an array object from a temporary array of Datums.
+ *
+ * array: array object (with header fields already filled in)
+ * values: array of Datums to be copied
+ * nulls: array of is-null flags (can be NULL if no nulls)
+ * nitems: number of Datums to be copied
+ * typbyval, typlen, typalign: info about element datatype
+ * freedata: if true and element type is pass-by-ref, pfree data values
+ * referenced by Datums after copying them.
+ *
+ * If the input data is of varlena type, the caller must have ensured that
+ * the values are not toasted. (Doing it here doesn't work since the
+ * caller has already allocated space for the array...)
+ */
+void
+CopyArrayEls(ArrayType *array,
+ Datum *values,
+ bool *nulls,
+ int nitems,
+ int typlen,
+ bool typbyval,
+ char typalign,
+ bool freedata)
+{
+ char *p = ARR_DATA_PTR(array);
+ bits8 *bitmap = ARR_NULLBITMAP(array);
+ int bitval = 0;
+ int bitmask = 1;
+ int i;
+
+ if (typbyval)
+ freedata = false;
+
+ for (i = 0; i < nitems; i++)
+ {
+ if (nulls && nulls[i])
+ {
+ if (!bitmap) /* shouldn't happen */
+ elog(ERROR, "null array element where not supported");
+ /* bitmap bit stays 0 */
+ }
+ else
+ {
+ bitval |= bitmask;
+ p += ArrayCastAndSet(values[i], typlen, typbyval, typalign, p);
+ if (freedata)
+ pfree(DatumGetPointer(values[i]));
+ }
+ if (bitmap)
+ {
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ *bitmap++ = bitval;
+ bitval = 0;
+ bitmask = 1;
+ }
+ }
+ }
+
+ if (bitmap && bitmask != 1)
+ *bitmap = bitval;
+}
+
+/*
+ * array_out :
+ * takes the internal representation of an array and returns a string
+ * containing the array in its external format.
+ */
+Datum
+array_out(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ Oid element_type = AARR_ELEMTYPE(v);
+ int typlen;
+ bool typbyval;
+ char typalign;
+ char typdelim;
+ char *p,
+ *tmp,
+ *retval,
+ **values,
+ dims_str[(MAXDIM * 33) + 2];
+
+ /*
+ * 33 per dim since we assume 15 digits per number + ':' +'[]'
+ *
+ * +2 allows for assignment operator + trailing null
+ */
+ bool *needquotes,
+ needdims = false;
+ size_t overall_length;
+ int nitems,
+ i,
+ j,
+ k,
+ indx[MAXDIM];
+ int ndim,
+ *dims,
+ *lb;
+ array_iter iter;
+ ArrayMetaState *my_extra;
+
+ /*
+ * We arrange to look up info about element type, including its output
+ * conversion proc, only once per series of calls, assuming the element
+ * type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ /*
+ * Get info about element type, including its output conversion proc
+ */
+ get_type_io_data(element_type, IOFunc_output,
+ &my_extra->typlen, &my_extra->typbyval,
+ &my_extra->typalign, &my_extra->typdelim,
+ &my_extra->typioparam, &my_extra->typiofunc);
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ my_extra->element_type = element_type;
+ }
+ typlen = my_extra->typlen;
+ typbyval = my_extra->typbyval;
+ typalign = my_extra->typalign;
+ typdelim = my_extra->typdelim;
+
+ ndim = AARR_NDIM(v);
+ dims = AARR_DIMS(v);
+ lb = AARR_LBOUND(v);
+ nitems = ArrayGetNItems(ndim, dims);
+
+ if (nitems == 0)
+ {
+ retval = pstrdup("{}");
+ PG_RETURN_CSTRING(retval);
+ }
+
+ /*
+ * we will need to add explicit dimensions if any dimension has a lower
+ * bound other than one
+ */
+ for (i = 0; i < ndim; i++)
+ {
+ if (lb[i] != 1)
+ {
+ needdims = true;
+ break;
+ }
+ }
+
+ /*
+ * Convert all values to string form, count total space needed (including
+ * any overhead such as escaping backslashes), and detect whether each
+ * item needs double quotes.
+ */
+ values = (char **) palloc(nitems * sizeof(char *));
+ needquotes = (bool *) palloc(nitems * sizeof(bool));
+ overall_length = 0;
+
+ array_iter_setup(&iter, v);
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum itemvalue;
+ bool isnull;
+ bool needquote;
+
+ /* Get source element, checking for NULL */
+ itemvalue = array_iter_next(&iter, &isnull, i,
+ typlen, typbyval, typalign);
+
+ if (isnull)
+ {
+ values[i] = pstrdup("NULL");
+ overall_length += 4;
+ needquote = false;
+ }
+ else
+ {
+ values[i] = OutputFunctionCall(&my_extra->proc, itemvalue);
+
+ /* count data plus backslashes; detect chars needing quotes */
+ if (values[i][0] == '\0')
+ needquote = true; /* force quotes for empty string */
+ else if (pg_strcasecmp(values[i], "NULL") == 0)
+ needquote = true; /* force quotes for literal NULL */
+ else
+ needquote = false;
+
+ for (tmp = values[i]; *tmp != '\0'; tmp++)
+ {
+ char ch = *tmp;
+
+ overall_length += 1;
+ if (ch == '"' || ch == '\\')
+ {
+ needquote = true;
+ overall_length += 1;
+ }
+ else if (ch == '{' || ch == '}' || ch == typdelim ||
+ array_isspace(ch))
+ needquote = true;
+ }
+ }
+
+ needquotes[i] = needquote;
+
+ /* Count the pair of double quotes, if needed */
+ if (needquote)
+ overall_length += 2;
+ /* and the comma (or other typdelim delimiter) */
+ overall_length += 1;
+ }
+
+ /*
+ * The very last array element doesn't have a typdelim delimiter after it,
+ * but that's OK; that space is needed for the trailing '\0'.
+ *
+ * Now count total number of curly brace pairs in output string.
+ */
+ for (i = j = 0, k = 1; i < ndim; i++)
+ {
+ j += k, k *= dims[i];
+ }
+ overall_length += 2 * j;
+
+ /* Format explicit dimensions if required */
+ dims_str[0] = '\0';
+ if (needdims)
+ {
+ char *ptr = dims_str;
+
+ for (i = 0; i < ndim; i++)
+ {
+ sprintf(ptr, "[%d:%d]", lb[i], lb[i] + dims[i] - 1);
+ ptr += strlen(ptr);
+ }
+ *ptr++ = *ASSGN;
+ *ptr = '\0';
+ overall_length += ptr - dims_str;
+ }
+
+ /* Now construct the output string */
+ retval = (char *) palloc(overall_length);
+ p = retval;
+
+#define APPENDSTR(str) (strcpy(p, (str)), p += strlen(p))
+#define APPENDCHAR(ch) (*p++ = (ch), *p = '\0')
+
+ if (needdims)
+ APPENDSTR(dims_str);
+ APPENDCHAR('{');
+ for (i = 0; i < ndim; i++)
+ indx[i] = 0;
+ j = 0;
+ k = 0;
+ do
+ {
+ for (i = j; i < ndim - 1; i++)
+ APPENDCHAR('{');
+
+ if (needquotes[k])
+ {
+ APPENDCHAR('"');
+ for (tmp = values[k]; *tmp; tmp++)
+ {
+ char ch = *tmp;
+
+ if (ch == '"' || ch == '\\')
+ *p++ = '\\';
+ *p++ = ch;
+ }
+ *p = '\0';
+ APPENDCHAR('"');
+ }
+ else
+ APPENDSTR(values[k]);
+ pfree(values[k++]);
+
+ for (i = ndim - 1; i >= 0; i--)
+ {
+ if (++(indx[i]) < dims[i])
+ {
+ APPENDCHAR(typdelim);
+ break;
+ }
+ else
+ {
+ indx[i] = 0;
+ APPENDCHAR('}');
+ }
+ }
+ j = i;
+ } while (j != -1);
+
+#undef APPENDSTR
+#undef APPENDCHAR
+
+ /* Assert that we calculated the string length accurately */
+ Assert(overall_length == (p - retval + 1));
+
+ pfree(values);
+ pfree(needquotes);
+
+ PG_RETURN_CSTRING(retval);
+}
+
+/*
+ * array_recv :
+ * converts an array from the external binary format to
+ * its internal format.
+ *
+ * return value :
+ * the internal representation of the input array
+ */
+Datum
+array_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Oid spec_element_type = PG_GETARG_OID(1); /* type of an array
+ * element */
+ int32 typmod = PG_GETARG_INT32(2); /* typmod for array elements */
+ Oid element_type;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ Oid typioparam;
+ int i,
+ nitems;
+ Datum *dataPtr;
+ bool *nullsPtr;
+ bool hasnulls;
+ int32 nbytes;
+ int32 dataoffset;
+ ArrayType *retval;
+ int ndim,
+ flags,
+ dim[MAXDIM],
+ lBound[MAXDIM];
+ ArrayMetaState *my_extra;
+
+ /* Get the array header information */
+ ndim = pq_getmsgint(buf, 4);
+ if (ndim < 0) /* we do allow zero-dimension arrays */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid number of dimensions: %d", ndim)));
+ if (ndim > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ ndim, MAXDIM)));
+
+ flags = pq_getmsgint(buf, 4);
+ if (flags != 0 && flags != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid array flags")));
+
+ /* Check element type recorded in the data */
+ element_type = pq_getmsgint(buf, sizeof(Oid));
+
+ /*
+ * From a security standpoint, it doesn't matter whether the input's
+ * element type matches what we expect: the element type's receive
+ * function has to be robust enough to cope with invalid data. However,
+ * from a user-friendliness standpoint, it's nicer to complain about type
+ * mismatches than to throw "improper binary format" errors. But there's
+ * a problem: only built-in types have OIDs that are stable enough to
+ * believe that a mismatch is a real issue. So complain only if both OIDs
+ * are in the built-in range. Otherwise, carry on with the element type
+ * we "should" be getting.
+ */
+ if (element_type != spec_element_type)
+ {
+ if (element_type < FirstGenbkiObjectId &&
+ spec_element_type < FirstGenbkiObjectId)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("binary data has array element type %u (%s) instead of expected %u (%s)",
+ element_type,
+ format_type_extended(element_type, -1,
+ FORMAT_TYPE_ALLOW_INVALID),
+ spec_element_type,
+ format_type_extended(spec_element_type, -1,
+ FORMAT_TYPE_ALLOW_INVALID))));
+ element_type = spec_element_type;
+ }
+
+ for (i = 0; i < ndim; i++)
+ {
+ dim[i] = pq_getmsgint(buf, 4);
+ lBound[i] = pq_getmsgint(buf, 4);
+ }
+
+ /* This checks for overflow of array dimensions */
+ nitems = ArrayGetNItems(ndim, dim);
+ ArrayCheckBounds(ndim, dim, lBound);
+
+ /*
+ * We arrange to look up info about element type, including its receive
+ * conversion proc, only once per series of calls, assuming the element
+ * type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ /* Get info about element type, including its receive proc */
+ get_type_io_data(element_type, IOFunc_receive,
+ &my_extra->typlen, &my_extra->typbyval,
+ &my_extra->typalign, &my_extra->typdelim,
+ &my_extra->typioparam, &my_extra->typiofunc);
+ if (!OidIsValid(my_extra->typiofunc))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary input function available for type %s",
+ format_type_be(element_type))));
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ my_extra->element_type = element_type;
+ }
+
+ if (nitems == 0)
+ {
+ /* Return empty array ... but not till we've validated element_type */
+ PG_RETURN_ARRAYTYPE_P(construct_empty_array(element_type));
+ }
+
+ typlen = my_extra->typlen;
+ typbyval = my_extra->typbyval;
+ typalign = my_extra->typalign;
+ typioparam = my_extra->typioparam;
+
+ dataPtr = (Datum *) palloc(nitems * sizeof(Datum));
+ nullsPtr = (bool *) palloc(nitems * sizeof(bool));
+ ReadArrayBinary(buf, nitems,
+ &my_extra->proc, typioparam, typmod,
+ typlen, typbyval, typalign,
+ dataPtr, nullsPtr,
+ &hasnulls, &nbytes);
+ if (hasnulls)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nitems);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+ retval = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(retval, nbytes);
+ retval->ndim = ndim;
+ retval->dataoffset = dataoffset;
+ retval->elemtype = element_type;
+ memcpy(ARR_DIMS(retval), dim, ndim * sizeof(int));
+ memcpy(ARR_LBOUND(retval), lBound, ndim * sizeof(int));
+
+ CopyArrayEls(retval,
+ dataPtr, nullsPtr, nitems,
+ typlen, typbyval, typalign,
+ true);
+
+ pfree(dataPtr);
+ pfree(nullsPtr);
+
+ PG_RETURN_ARRAYTYPE_P(retval);
+}
+
+/*
+ * ReadArrayBinary:
+ * collect the data elements of an array being read in binary style.
+ *
+ * Inputs:
+ * buf: the data buffer to read from.
+ * nitems: total number of array elements (already read).
+ * receiveproc: type-specific receive procedure for element datatype.
+ * typioparam, typmod: auxiliary values to pass to receiveproc.
+ * typlen, typbyval, typalign: storage parameters of element datatype.
+ *
+ * Outputs:
+ * values[]: filled with converted data values.
+ * nulls[]: filled with is-null markers.
+ * *hasnulls: set true iff there are any null elements.
+ * *nbytes: set to total size of data area needed (including alignment
+ * padding but not including array header overhead).
+ *
+ * Note that values[] and nulls[] are allocated by the caller, and must have
+ * nitems elements.
+ */
+static void
+ReadArrayBinary(StringInfo buf,
+ int nitems,
+ FmgrInfo *receiveproc,
+ Oid typioparam,
+ int32 typmod,
+ int typlen,
+ bool typbyval,
+ char typalign,
+ Datum *values,
+ bool *nulls,
+ bool *hasnulls,
+ int32 *nbytes)
+{
+ int i;
+ bool hasnull;
+ int32 totbytes;
+
+ for (i = 0; i < nitems; i++)
+ {
+ int itemlen;
+ StringInfoData elem_buf;
+ char csave;
+
+ /* Get and check the item length */
+ itemlen = pq_getmsgint(buf, 4);
+ if (itemlen < -1 || itemlen > (buf->len - buf->cursor))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("insufficient data left in message")));
+
+ if (itemlen == -1)
+ {
+ /* -1 length means NULL */
+ values[i] = ReceiveFunctionCall(receiveproc, NULL,
+ typioparam, typmod);
+ nulls[i] = true;
+ continue;
+ }
+
+ /*
+ * Rather than copying data around, we just set up a phony StringInfo
+ * pointing to the correct portion of the input buffer. We assume we
+ * can scribble on the input buffer so as to maintain the convention
+ * that StringInfos have a trailing null.
+ */
+ elem_buf.data = &buf->data[buf->cursor];
+ elem_buf.maxlen = itemlen + 1;
+ elem_buf.len = itemlen;
+ elem_buf.cursor = 0;
+
+ buf->cursor += itemlen;
+
+ csave = buf->data[buf->cursor];
+ buf->data[buf->cursor] = '\0';
+
+ /* Now call the element's receiveproc */
+ values[i] = ReceiveFunctionCall(receiveproc, &elem_buf,
+ typioparam, typmod);
+ nulls[i] = false;
+
+ /* Trouble if it didn't eat the whole buffer */
+ if (elem_buf.cursor != itemlen)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("improper binary format in array element %d",
+ i + 1)));
+
+ buf->data[buf->cursor] = csave;
+ }
+
+ /*
+ * Check for nulls, compute total data space needed
+ */
+ hasnull = false;
+ totbytes = 0;
+ for (i = 0; i < nitems; i++)
+ {
+ if (nulls[i])
+ hasnull = true;
+ else
+ {
+ /* let's just make sure data is not toasted */
+ if (typlen == -1)
+ values[i] = PointerGetDatum(PG_DETOAST_DATUM(values[i]));
+ totbytes = att_addlength_datum(totbytes, typlen, values[i]);
+ totbytes = att_align_nominal(totbytes, typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(totbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+ }
+ *hasnulls = hasnull;
+ *nbytes = totbytes;
+}
+
+
+/*
+ * array_send :
+ * takes the internal representation of an array and returns a bytea
+ * containing the array in its external binary format.
+ */
+Datum
+array_send(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ Oid element_type = AARR_ELEMTYPE(v);
+ int typlen;
+ bool typbyval;
+ char typalign;
+ int nitems,
+ i;
+ int ndim,
+ *dim,
+ *lb;
+ StringInfoData buf;
+ array_iter iter;
+ ArrayMetaState *my_extra;
+
+ /*
+ * We arrange to look up info about element type, including its send
+ * conversion proc, only once per series of calls, assuming the element
+ * type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ /* Get info about element type, including its send proc */
+ get_type_io_data(element_type, IOFunc_send,
+ &my_extra->typlen, &my_extra->typbyval,
+ &my_extra->typalign, &my_extra->typdelim,
+ &my_extra->typioparam, &my_extra->typiofunc);
+ if (!OidIsValid(my_extra->typiofunc))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary output function available for type %s",
+ format_type_be(element_type))));
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ my_extra->element_type = element_type;
+ }
+ typlen = my_extra->typlen;
+ typbyval = my_extra->typbyval;
+ typalign = my_extra->typalign;
+
+ ndim = AARR_NDIM(v);
+ dim = AARR_DIMS(v);
+ lb = AARR_LBOUND(v);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ pq_begintypsend(&buf);
+
+ /* Send the array header information */
+ pq_sendint32(&buf, ndim);
+ pq_sendint32(&buf, AARR_HASNULL(v) ? 1 : 0);
+ pq_sendint32(&buf, element_type);
+ for (i = 0; i < ndim; i++)
+ {
+ pq_sendint32(&buf, dim[i]);
+ pq_sendint32(&buf, lb[i]);
+ }
+
+ /* Send the array elements using the element's own sendproc */
+ array_iter_setup(&iter, v);
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum itemvalue;
+ bool isnull;
+
+ /* Get source element, checking for NULL */
+ itemvalue = array_iter_next(&iter, &isnull, i,
+ typlen, typbyval, typalign);
+
+ if (isnull)
+ {
+ /* -1 length means a NULL */
+ pq_sendint32(&buf, -1);
+ }
+ else
+ {
+ bytea *outputbytes;
+
+ outputbytes = SendFunctionCall(&my_extra->proc, itemvalue);
+ pq_sendint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_sendbytes(&buf, VARDATA(outputbytes),
+ VARSIZE(outputbytes) - VARHDRSZ);
+ pfree(outputbytes);
+ }
+ }
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * array_ndims :
+ * returns the number of dimensions of the array pointed to by "v"
+ */
+Datum
+array_ndims(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(AARR_NDIM(v));
+}
+
+/*
+ * array_dims :
+ * returns the dimensions of the array pointed to by "v", as a "text"
+ */
+Datum
+array_dims(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ char *p;
+ int i;
+ int *dimv,
+ *lb;
+
+ /*
+ * 33 since we assume 15 digits per number + ':' +'[]'
+ *
+ * +1 for trailing null
+ */
+ char buf[MAXDIM * 33 + 1];
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ PG_RETURN_NULL();
+
+ dimv = AARR_DIMS(v);
+ lb = AARR_LBOUND(v);
+
+ p = buf;
+ for (i = 0; i < AARR_NDIM(v); i++)
+ {
+ sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1);
+ p += strlen(p);
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(buf));
+}
+
+/*
+ * array_lower :
+ * returns the lower dimension, of the DIM requested, for
+ * the array pointed to by "v", as an int4
+ */
+Datum
+array_lower(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ int reqdim = PG_GETARG_INT32(1);
+ int *lb;
+ int result;
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ PG_RETURN_NULL();
+
+ /* Sanity check: was the requested dim valid */
+ if (reqdim <= 0 || reqdim > AARR_NDIM(v))
+ PG_RETURN_NULL();
+
+ lb = AARR_LBOUND(v);
+ result = lb[reqdim - 1];
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * array_upper :
+ * returns the upper dimension, of the DIM requested, for
+ * the array pointed to by "v", as an int4
+ */
+Datum
+array_upper(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ int reqdim = PG_GETARG_INT32(1);
+ int *dimv,
+ *lb;
+ int result;
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ PG_RETURN_NULL();
+
+ /* Sanity check: was the requested dim valid */
+ if (reqdim <= 0 || reqdim > AARR_NDIM(v))
+ PG_RETURN_NULL();
+
+ lb = AARR_LBOUND(v);
+ dimv = AARR_DIMS(v);
+
+ result = dimv[reqdim - 1] + lb[reqdim - 1] - 1;
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * array_length :
+ * returns the length, of the dimension requested, for
+ * the array pointed to by "v", as an int4
+ */
+Datum
+array_length(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ int reqdim = PG_GETARG_INT32(1);
+ int *dimv;
+ int result;
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ PG_RETURN_NULL();
+
+ /* Sanity check: was the requested dim valid */
+ if (reqdim <= 0 || reqdim > AARR_NDIM(v))
+ PG_RETURN_NULL();
+
+ dimv = AARR_DIMS(v);
+
+ result = dimv[reqdim - 1];
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * array_cardinality:
+ * returns the total number of elements in an array
+ */
+Datum
+array_cardinality(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+
+ PG_RETURN_INT32(ArrayGetNItems(AARR_NDIM(v), AARR_DIMS(v)));
+}
+
+
+/*
+ * array_get_element :
+ * This routine takes an array datum and a subscript array and returns
+ * the referenced item as a Datum. Note that for a pass-by-reference
+ * datatype, the returned Datum is a pointer into the array object.
+ *
+ * This handles both ordinary varlena arrays and fixed-length arrays.
+ *
+ * Inputs:
+ * arraydatum: the array object (mustn't be NULL)
+ * nSubscripts: number of subscripts supplied
+ * indx[]: the subscript values
+ * arraytyplen: pg_type.typlen for the array type
+ * elmlen: pg_type.typlen for the array's element type
+ * elmbyval: pg_type.typbyval for the array's element type
+ * elmalign: pg_type.typalign for the array's element type
+ *
+ * Outputs:
+ * The return value is the element Datum.
+ * *isNull is set to indicate whether the element is NULL.
+ */
+Datum
+array_get_element(Datum arraydatum,
+ int nSubscripts,
+ int *indx,
+ int arraytyplen,
+ int elmlen,
+ bool elmbyval,
+ char elmalign,
+ bool *isNull)
+{
+ int i,
+ ndim,
+ *dim,
+ *lb,
+ offset,
+ fixedDim[1],
+ fixedLb[1];
+ char *arraydataptr,
+ *retptr;
+ bits8 *arraynullsptr;
+
+ if (arraytyplen > 0)
+ {
+ /*
+ * fixed-length arrays -- these are assumed to be 1-d, 0-based
+ */
+ ndim = 1;
+ fixedDim[0] = arraytyplen / elmlen;
+ fixedLb[0] = 0;
+ dim = fixedDim;
+ lb = fixedLb;
+ arraydataptr = (char *) DatumGetPointer(arraydatum);
+ arraynullsptr = NULL;
+ }
+ else if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+ {
+ /* expanded array: let's do this in a separate function */
+ return array_get_element_expanded(arraydatum,
+ nSubscripts,
+ indx,
+ arraytyplen,
+ elmlen,
+ elmbyval,
+ elmalign,
+ isNull);
+ }
+ else
+ {
+ /* detoast array if necessary, producing normal varlena input */
+ ArrayType *array = DatumGetArrayTypeP(arraydatum);
+
+ ndim = ARR_NDIM(array);
+ dim = ARR_DIMS(array);
+ lb = ARR_LBOUND(array);
+ arraydataptr = ARR_DATA_PTR(array);
+ arraynullsptr = ARR_NULLBITMAP(array);
+ }
+
+ /*
+ * Return NULL for invalid subscript
+ */
+ if (ndim != nSubscripts || ndim <= 0 || ndim > MAXDIM)
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+ for (i = 0; i < ndim; i++)
+ {
+ if (indx[i] < lb[i] || indx[i] >= (dim[i] + lb[i]))
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+ }
+
+ /*
+ * Calculate the element number
+ */
+ offset = ArrayGetOffset(nSubscripts, dim, lb, indx);
+
+ /*
+ * Check for NULL array element
+ */
+ if (array_get_isnull(arraynullsptr, offset))
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+
+ /*
+ * OK, get the element
+ */
+ *isNull = false;
+ retptr = array_seek(arraydataptr, 0, arraynullsptr, offset,
+ elmlen, elmbyval, elmalign);
+ return ArrayCast(retptr, elmbyval, elmlen);
+}
+
+/*
+ * Implementation of array_get_element() for an expanded array
+ */
+static Datum
+array_get_element_expanded(Datum arraydatum,
+ int nSubscripts, int *indx,
+ int arraytyplen,
+ int elmlen, bool elmbyval, char elmalign,
+ bool *isNull)
+{
+ ExpandedArrayHeader *eah;
+ int i,
+ ndim,
+ *dim,
+ *lb,
+ offset;
+ Datum *dvalues;
+ bool *dnulls;
+
+ eah = (ExpandedArrayHeader *) DatumGetEOHP(arraydatum);
+ Assert(eah->ea_magic == EA_MAGIC);
+
+ /* sanity-check caller's info against object */
+ Assert(arraytyplen == -1);
+ Assert(elmlen == eah->typlen);
+ Assert(elmbyval == eah->typbyval);
+ Assert(elmalign == eah->typalign);
+
+ ndim = eah->ndims;
+ dim = eah->dims;
+ lb = eah->lbound;
+
+ /*
+ * Return NULL for invalid subscript
+ */
+ if (ndim != nSubscripts || ndim <= 0 || ndim > MAXDIM)
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+ for (i = 0; i < ndim; i++)
+ {
+ if (indx[i] < lb[i] || indx[i] >= (dim[i] + lb[i]))
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+ }
+
+ /*
+ * Calculate the element number
+ */
+ offset = ArrayGetOffset(nSubscripts, dim, lb, indx);
+
+ /*
+ * Deconstruct array if we didn't already. Note that we apply this even
+ * if the input is nominally read-only: it should be safe enough.
+ */
+ deconstruct_expanded_array(eah);
+
+ dvalues = eah->dvalues;
+ dnulls = eah->dnulls;
+
+ /*
+ * Check for NULL array element
+ */
+ if (dnulls && dnulls[offset])
+ {
+ *isNull = true;
+ return (Datum) 0;
+ }
+
+ /*
+ * OK, get the element. It's OK to return a pass-by-ref value as a
+ * pointer into the expanded array, for the same reason that regular
+ * array_get_element can return a pointer into flat arrays: the value is
+ * assumed not to change for as long as the Datum reference can exist.
+ */
+ *isNull = false;
+ return dvalues[offset];
+}
+
+/*
+ * array_get_slice :
+ * This routine takes an array and a range of indices (upperIndx and
+ * lowerIndx), creates a new array structure for the referred elements
+ * and returns a pointer to it.
+ *
+ * This handles both ordinary varlena arrays and fixed-length arrays.
+ *
+ * Inputs:
+ * arraydatum: the array object (mustn't be NULL)
+ * nSubscripts: number of subscripts supplied (must be same for upper/lower)
+ * upperIndx[]: the upper subscript values
+ * lowerIndx[]: the lower subscript values
+ * upperProvided[]: true for provided upper subscript values
+ * lowerProvided[]: true for provided lower subscript values
+ * arraytyplen: pg_type.typlen for the array type
+ * elmlen: pg_type.typlen for the array's element type
+ * elmbyval: pg_type.typbyval for the array's element type
+ * elmalign: pg_type.typalign for the array's element type
+ *
+ * Outputs:
+ * The return value is the new array Datum (it's never NULL)
+ *
+ * Omitted upper and lower subscript values are replaced by the corresponding
+ * array bound.
+ *
+ * NOTE: we assume it is OK to scribble on the provided subscript arrays
+ * lowerIndx[] and upperIndx[]; also, these arrays must be of size MAXDIM
+ * even when nSubscripts is less. These are generally just temporaries.
+ */
+Datum
+array_get_slice(Datum arraydatum,
+ int nSubscripts,
+ int *upperIndx,
+ int *lowerIndx,
+ bool *upperProvided,
+ bool *lowerProvided,
+ int arraytyplen,
+ int elmlen,
+ bool elmbyval,
+ char elmalign)
+{
+ ArrayType *array;
+ ArrayType *newarray;
+ int i,
+ ndim,
+ *dim,
+ *lb,
+ *newlb;
+ int fixedDim[1],
+ fixedLb[1];
+ Oid elemtype;
+ char *arraydataptr;
+ bits8 *arraynullsptr;
+ int32 dataoffset;
+ int bytes,
+ span[MAXDIM];
+
+ if (arraytyplen > 0)
+ {
+ /*
+ * fixed-length arrays -- currently, cannot slice these because parser
+ * labels output as being of the fixed-length array type! Code below
+ * shows how we could support it if the parser were changed to label
+ * output as a suitable varlena array type.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("slices of fixed-length arrays not implemented")));
+
+ /*
+ * fixed-length arrays -- these are assumed to be 1-d, 0-based
+ *
+ * XXX where would we get the correct ELEMTYPE from?
+ */
+ ndim = 1;
+ fixedDim[0] = arraytyplen / elmlen;
+ fixedLb[0] = 0;
+ dim = fixedDim;
+ lb = fixedLb;
+ elemtype = InvalidOid; /* XXX */
+ arraydataptr = (char *) DatumGetPointer(arraydatum);
+ arraynullsptr = NULL;
+ }
+ else
+ {
+ /* detoast input array if necessary */
+ array = DatumGetArrayTypeP(arraydatum);
+
+ ndim = ARR_NDIM(array);
+ dim = ARR_DIMS(array);
+ lb = ARR_LBOUND(array);
+ elemtype = ARR_ELEMTYPE(array);
+ arraydataptr = ARR_DATA_PTR(array);
+ arraynullsptr = ARR_NULLBITMAP(array);
+ }
+
+ /*
+ * Check provided subscripts. A slice exceeding the current array limits
+ * is silently truncated to the array limits. If we end up with an empty
+ * slice, return an empty array.
+ */
+ if (ndim < nSubscripts || ndim <= 0 || ndim > MAXDIM)
+ return PointerGetDatum(construct_empty_array(elemtype));
+
+ for (i = 0; i < nSubscripts; i++)
+ {
+ if (!lowerProvided[i] || lowerIndx[i] < lb[i])
+ lowerIndx[i] = lb[i];
+ if (!upperProvided[i] || upperIndx[i] >= (dim[i] + lb[i]))
+ upperIndx[i] = dim[i] + lb[i] - 1;
+ if (lowerIndx[i] > upperIndx[i])
+ return PointerGetDatum(construct_empty_array(elemtype));
+ }
+ /* fill any missing subscript positions with full array range */
+ for (; i < ndim; i++)
+ {
+ lowerIndx[i] = lb[i];
+ upperIndx[i] = dim[i] + lb[i] - 1;
+ if (lowerIndx[i] > upperIndx[i])
+ return PointerGetDatum(construct_empty_array(elemtype));
+ }
+
+ mda_get_range(ndim, span, lowerIndx, upperIndx);
+
+ bytes = array_slice_size(arraydataptr, arraynullsptr,
+ ndim, dim, lb,
+ lowerIndx, upperIndx,
+ elmlen, elmbyval, elmalign);
+
+ /*
+ * Currently, we put a null bitmap in the result if the source has one;
+ * could be smarter ...
+ */
+ if (arraynullsptr)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, ArrayGetNItems(ndim, span));
+ bytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ bytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+
+ newarray = (ArrayType *) palloc0(bytes);
+ SET_VARSIZE(newarray, bytes);
+ newarray->ndim = ndim;
+ newarray->dataoffset = dataoffset;
+ newarray->elemtype = elemtype;
+ memcpy(ARR_DIMS(newarray), span, ndim * sizeof(int));
+
+ /*
+ * Lower bounds of the new array are set to 1. Formerly (before 7.3) we
+ * copied the given lowerIndx values ... but that seems confusing.
+ */
+ newlb = ARR_LBOUND(newarray);
+ for (i = 0; i < ndim; i++)
+ newlb[i] = 1;
+
+ array_extract_slice(newarray,
+ ndim, dim, lb,
+ arraydataptr, arraynullsptr,
+ lowerIndx, upperIndx,
+ elmlen, elmbyval, elmalign);
+
+ return PointerGetDatum(newarray);
+}
+
+/*
+ * array_set_element :
+ * This routine sets the value of one array element (specified by
+ * a subscript array) to a new value specified by "dataValue".
+ *
+ * This handles both ordinary varlena arrays and fixed-length arrays.
+ *
+ * Inputs:
+ * arraydatum: the initial array object (mustn't be NULL)
+ * nSubscripts: number of subscripts supplied
+ * indx[]: the subscript values
+ * dataValue: the datum to be inserted at the given position
+ * isNull: whether dataValue is NULL
+ * arraytyplen: pg_type.typlen for the array type
+ * elmlen: pg_type.typlen for the array's element type
+ * elmbyval: pg_type.typbyval for the array's element type
+ * elmalign: pg_type.typalign for the array's element type
+ *
+ * Result:
+ * A new array is returned, just like the old except for the one
+ * modified entry. The original array object is not changed,
+ * unless what is passed is a read-write reference to an expanded
+ * array object; in that case the expanded array is updated in-place.
+ *
+ * For one-dimensional arrays only, we allow the array to be extended
+ * by assigning to a position outside the existing subscript range; any
+ * positions between the existing elements and the new one are set to NULLs.
+ * (XXX TODO: allow a corresponding behavior for multidimensional arrays)
+ *
+ * NOTE: For assignments, we throw an error for invalid subscripts etc,
+ * rather than returning a NULL as the fetch operations do.
+ */
+Datum
+array_set_element(Datum arraydatum,
+ int nSubscripts,
+ int *indx,
+ Datum dataValue,
+ bool isNull,
+ int arraytyplen,
+ int elmlen,
+ bool elmbyval,
+ char elmalign)
+{
+ ArrayType *array;
+ ArrayType *newarray;
+ int i,
+ ndim,
+ dim[MAXDIM],
+ lb[MAXDIM],
+ offset;
+ char *elt_ptr;
+ bool newhasnulls;
+ bits8 *oldnullbitmap;
+ int oldnitems,
+ newnitems,
+ olddatasize,
+ newsize,
+ olditemlen,
+ newitemlen,
+ overheadlen,
+ oldoverheadlen,
+ addedbefore,
+ addedafter,
+ lenbefore,
+ lenafter;
+
+ if (arraytyplen > 0)
+ {
+ /*
+ * fixed-length arrays -- these are assumed to be 1-d, 0-based. We
+ * cannot extend them, either.
+ */
+ char *resultarray;
+
+ if (nSubscripts != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (indx[0] < 0 || indx[0] >= arraytyplen / elmlen)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array subscript out of range")));
+
+ if (isNull)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("cannot assign null value to an element of a fixed-length array")));
+
+ resultarray = (char *) palloc(arraytyplen);
+ memcpy(resultarray, DatumGetPointer(arraydatum), arraytyplen);
+ elt_ptr = (char *) resultarray + indx[0] * elmlen;
+ ArrayCastAndSet(dataValue, elmlen, elmbyval, elmalign, elt_ptr);
+ return PointerGetDatum(resultarray);
+ }
+
+ if (nSubscripts <= 0 || nSubscripts > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ /* make sure item to be inserted is not toasted */
+ if (elmlen == -1 && !isNull)
+ dataValue = PointerGetDatum(PG_DETOAST_DATUM(dataValue));
+
+ if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+ {
+ /* expanded array: let's do this in a separate function */
+ return array_set_element_expanded(arraydatum,
+ nSubscripts,
+ indx,
+ dataValue,
+ isNull,
+ arraytyplen,
+ elmlen,
+ elmbyval,
+ elmalign);
+ }
+
+ /* detoast input array if necessary */
+ array = DatumGetArrayTypeP(arraydatum);
+
+ ndim = ARR_NDIM(array);
+
+ /*
+ * if number of dims is zero, i.e. an empty array, create an array with
+ * nSubscripts dimensions, and set the lower bounds to the supplied
+ * subscripts
+ */
+ if (ndim == 0)
+ {
+ Oid elmtype = ARR_ELEMTYPE(array);
+
+ for (i = 0; i < nSubscripts; i++)
+ {
+ dim[i] = 1;
+ lb[i] = indx[i];
+ }
+
+ return PointerGetDatum(construct_md_array(&dataValue, &isNull,
+ nSubscripts, dim, lb,
+ elmtype,
+ elmlen, elmbyval, elmalign));
+ }
+
+ if (ndim != nSubscripts)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ /* copy dim/lb since we may modify them */
+ memcpy(dim, ARR_DIMS(array), ndim * sizeof(int));
+ memcpy(lb, ARR_LBOUND(array), ndim * sizeof(int));
+
+ newhasnulls = (ARR_HASNULL(array) || isNull);
+ addedbefore = addedafter = 0;
+
+ /*
+ * Check subscripts. We assume the existing subscripts passed
+ * ArrayCheckBounds, so that dim[i] + lb[i] can be computed without
+ * overflow. But we must beware of other overflows in our calculations of
+ * new dim[] values.
+ */
+ if (ndim == 1)
+ {
+ if (indx[0] < lb[0])
+ {
+ /* addedbefore = lb[0] - indx[0]; */
+ /* dim[0] += addedbefore; */
+ if (pg_sub_s32_overflow(lb[0], indx[0], &addedbefore) ||
+ pg_add_s32_overflow(dim[0], addedbefore, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ lb[0] = indx[0];
+ if (addedbefore > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ if (indx[0] >= (dim[0] + lb[0]))
+ {
+ /* addedafter = indx[0] - (dim[0] + lb[0]) + 1; */
+ /* dim[0] += addedafter; */
+ if (pg_sub_s32_overflow(indx[0], dim[0] + lb[0], &addedafter) ||
+ pg_add_s32_overflow(addedafter, 1, &addedafter) ||
+ pg_add_s32_overflow(dim[0], addedafter, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ if (addedafter > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ }
+ else
+ {
+ /*
+ * XXX currently we do not support extending multi-dimensional arrays
+ * during assignment
+ */
+ for (i = 0; i < ndim; i++)
+ {
+ if (indx[i] < lb[i] ||
+ indx[i] >= (dim[i] + lb[i]))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array subscript out of range")));
+ }
+ }
+
+ /* This checks for overflow of the array dimensions */
+ newnitems = ArrayGetNItems(ndim, dim);
+ ArrayCheckBounds(ndim, dim, lb);
+
+ /*
+ * Compute sizes of items and areas to copy
+ */
+ if (newhasnulls)
+ overheadlen = ARR_OVERHEAD_WITHNULLS(ndim, newnitems);
+ else
+ overheadlen = ARR_OVERHEAD_NONULLS(ndim);
+ oldnitems = ArrayGetNItems(ndim, ARR_DIMS(array));
+ oldnullbitmap = ARR_NULLBITMAP(array);
+ oldoverheadlen = ARR_DATA_OFFSET(array);
+ olddatasize = ARR_SIZE(array) - oldoverheadlen;
+ if (addedbefore)
+ {
+ offset = 0;
+ lenbefore = 0;
+ olditemlen = 0;
+ lenafter = olddatasize;
+ }
+ else if (addedafter)
+ {
+ offset = oldnitems;
+ lenbefore = olddatasize;
+ olditemlen = 0;
+ lenafter = 0;
+ }
+ else
+ {
+ offset = ArrayGetOffset(nSubscripts, dim, lb, indx);
+ elt_ptr = array_seek(ARR_DATA_PTR(array), 0, oldnullbitmap, offset,
+ elmlen, elmbyval, elmalign);
+ lenbefore = (int) (elt_ptr - ARR_DATA_PTR(array));
+ if (array_get_isnull(oldnullbitmap, offset))
+ olditemlen = 0;
+ else
+ {
+ olditemlen = att_addlength_pointer(0, elmlen, elt_ptr);
+ olditemlen = att_align_nominal(olditemlen, elmalign);
+ }
+ lenafter = (int) (olddatasize - lenbefore - olditemlen);
+ }
+
+ if (isNull)
+ newitemlen = 0;
+ else
+ {
+ newitemlen = att_addlength_datum(0, elmlen, dataValue);
+ newitemlen = att_align_nominal(newitemlen, elmalign);
+ }
+
+ newsize = overheadlen + lenbefore + newitemlen + lenafter;
+
+ /*
+ * OK, create the new array and fill in header/dimensions
+ */
+ newarray = (ArrayType *) palloc0(newsize);
+ SET_VARSIZE(newarray, newsize);
+ newarray->ndim = ndim;
+ newarray->dataoffset = newhasnulls ? overheadlen : 0;
+ newarray->elemtype = ARR_ELEMTYPE(array);
+ memcpy(ARR_DIMS(newarray), dim, ndim * sizeof(int));
+ memcpy(ARR_LBOUND(newarray), lb, ndim * sizeof(int));
+
+ /*
+ * Fill in data
+ */
+ memcpy((char *) newarray + overheadlen,
+ (char *) array + oldoverheadlen,
+ lenbefore);
+ if (!isNull)
+ ArrayCastAndSet(dataValue, elmlen, elmbyval, elmalign,
+ (char *) newarray + overheadlen + lenbefore);
+ memcpy((char *) newarray + overheadlen + lenbefore + newitemlen,
+ (char *) array + oldoverheadlen + lenbefore + olditemlen,
+ lenafter);
+
+ /*
+ * Fill in nulls bitmap if needed
+ *
+ * Note: it's possible we just replaced the last NULL with a non-NULL, and
+ * could get rid of the bitmap. Seems not worth testing for though.
+ */
+ if (newhasnulls)
+ {
+ bits8 *newnullbitmap = ARR_NULLBITMAP(newarray);
+
+ /* palloc0 above already marked any inserted positions as nulls */
+ /* Fix the inserted value */
+ if (addedafter)
+ array_set_isnull(newnullbitmap, newnitems - 1, isNull);
+ else
+ array_set_isnull(newnullbitmap, offset, isNull);
+ /* Fix the copied range(s) */
+ if (addedbefore)
+ array_bitmap_copy(newnullbitmap, addedbefore,
+ oldnullbitmap, 0,
+ oldnitems);
+ else
+ {
+ array_bitmap_copy(newnullbitmap, 0,
+ oldnullbitmap, 0,
+ offset);
+ if (addedafter == 0)
+ array_bitmap_copy(newnullbitmap, offset + 1,
+ oldnullbitmap, offset + 1,
+ oldnitems - offset - 1);
+ }
+ }
+
+ return PointerGetDatum(newarray);
+}
+
+/*
+ * Implementation of array_set_element() for an expanded array
+ *
+ * Note: as with any operation on a read/write expanded object, we must
+ * take pains not to leave the object in a corrupt state if we fail partway
+ * through.
+ */
+static Datum
+array_set_element_expanded(Datum arraydatum,
+ int nSubscripts, int *indx,
+ Datum dataValue, bool isNull,
+ int arraytyplen,
+ int elmlen, bool elmbyval, char elmalign)
+{
+ ExpandedArrayHeader *eah;
+ Datum *dvalues;
+ bool *dnulls;
+ int i,
+ ndim,
+ dim[MAXDIM],
+ lb[MAXDIM],
+ offset;
+ bool dimschanged,
+ newhasnulls;
+ int addedbefore,
+ addedafter;
+ char *oldValue;
+
+ /* Convert to R/W object if not so already */
+ eah = DatumGetExpandedArray(arraydatum);
+
+ /* Sanity-check caller's info against object; we don't use it otherwise */
+ Assert(arraytyplen == -1);
+ Assert(elmlen == eah->typlen);
+ Assert(elmbyval == eah->typbyval);
+ Assert(elmalign == eah->typalign);
+
+ /*
+ * Copy dimension info into local storage. This allows us to modify the
+ * dimensions if needed, while not messing up the expanded value if we
+ * fail partway through.
+ */
+ ndim = eah->ndims;
+ Assert(ndim >= 0 && ndim <= MAXDIM);
+ memcpy(dim, eah->dims, ndim * sizeof(int));
+ memcpy(lb, eah->lbound, ndim * sizeof(int));
+ dimschanged = false;
+
+ /*
+ * if number of dims is zero, i.e. an empty array, create an array with
+ * nSubscripts dimensions, and set the lower bounds to the supplied
+ * subscripts.
+ */
+ if (ndim == 0)
+ {
+ /*
+ * Allocate adequate space for new dimension info. This is harmless
+ * if we fail later.
+ */
+ Assert(nSubscripts > 0 && nSubscripts <= MAXDIM);
+ eah->dims = (int *) MemoryContextAllocZero(eah->hdr.eoh_context,
+ nSubscripts * sizeof(int));
+ eah->lbound = (int *) MemoryContextAllocZero(eah->hdr.eoh_context,
+ nSubscripts * sizeof(int));
+
+ /* Update local copies of dimension info */
+ ndim = nSubscripts;
+ for (i = 0; i < nSubscripts; i++)
+ {
+ dim[i] = 0;
+ lb[i] = indx[i];
+ }
+ dimschanged = true;
+ }
+ else if (ndim != nSubscripts)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ /*
+ * Deconstruct array if we didn't already. (Someday maybe add a special
+ * case path for fixed-length, no-nulls cases, where we can overwrite an
+ * element in place without ever deconstructing. But today is not that
+ * day.)
+ */
+ deconstruct_expanded_array(eah);
+
+ /*
+ * Copy new element into array's context, if needed (we assume it's
+ * already detoasted, so no junk should be created). Doing this before
+ * we've made any significant changes ensures that our behavior is sane
+ * even when the source is a reference to some element of this same array.
+ * If we fail further down, this memory is leaked, but that's reasonably
+ * harmless.
+ */
+ if (!eah->typbyval && !isNull)
+ {
+ MemoryContext oldcxt = MemoryContextSwitchTo(eah->hdr.eoh_context);
+
+ dataValue = datumCopy(dataValue, false, eah->typlen);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ dvalues = eah->dvalues;
+ dnulls = eah->dnulls;
+
+ newhasnulls = ((dnulls != NULL) || isNull);
+ addedbefore = addedafter = 0;
+
+ /*
+ * Check subscripts (this logic must match array_set_element). We assume
+ * the existing subscripts passed ArrayCheckBounds, so that dim[i] + lb[i]
+ * can be computed without overflow. But we must beware of other
+ * overflows in our calculations of new dim[] values.
+ */
+ if (ndim == 1)
+ {
+ if (indx[0] < lb[0])
+ {
+ /* addedbefore = lb[0] - indx[0]; */
+ /* dim[0] += addedbefore; */
+ if (pg_sub_s32_overflow(lb[0], indx[0], &addedbefore) ||
+ pg_add_s32_overflow(dim[0], addedbefore, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ lb[0] = indx[0];
+ dimschanged = true;
+ if (addedbefore > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ if (indx[0] >= (dim[0] + lb[0]))
+ {
+ /* addedafter = indx[0] - (dim[0] + lb[0]) + 1; */
+ /* dim[0] += addedafter; */
+ if (pg_sub_s32_overflow(indx[0], dim[0] + lb[0], &addedafter) ||
+ pg_add_s32_overflow(addedafter, 1, &addedafter) ||
+ pg_add_s32_overflow(dim[0], addedafter, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ dimschanged = true;
+ if (addedafter > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ }
+ else
+ {
+ /*
+ * XXX currently we do not support extending multi-dimensional arrays
+ * during assignment
+ */
+ for (i = 0; i < ndim; i++)
+ {
+ if (indx[i] < lb[i] ||
+ indx[i] >= (dim[i] + lb[i]))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array subscript out of range")));
+ }
+ }
+
+ /* Check for overflow of the array dimensions */
+ if (dimschanged)
+ {
+ (void) ArrayGetNItems(ndim, dim);
+ ArrayCheckBounds(ndim, dim, lb);
+ }
+
+ /* Now we can calculate linear offset of target item in array */
+ offset = ArrayGetOffset(nSubscripts, dim, lb, indx);
+
+ /* Physically enlarge existing dvalues/dnulls arrays if needed */
+ if (dim[0] > eah->dvalueslen)
+ {
+ /* We want some extra space if we're enlarging */
+ int newlen = dim[0] + dim[0] / 8;
+
+ newlen = Max(newlen, dim[0]); /* integer overflow guard */
+ eah->dvalues = dvalues = (Datum *)
+ repalloc(dvalues, newlen * sizeof(Datum));
+ if (dnulls)
+ eah->dnulls = dnulls = (bool *)
+ repalloc(dnulls, newlen * sizeof(bool));
+ eah->dvalueslen = newlen;
+ }
+
+ /*
+ * If we need a nulls bitmap and don't already have one, create it, being
+ * sure to mark all existing entries as not null.
+ */
+ if (newhasnulls && dnulls == NULL)
+ eah->dnulls = dnulls = (bool *)
+ MemoryContextAllocZero(eah->hdr.eoh_context,
+ eah->dvalueslen * sizeof(bool));
+
+ /*
+ * We now have all the needed space allocated, so we're ready to make
+ * irreversible changes. Be very wary of allowing failure below here.
+ */
+
+ /* Flattened value will no longer represent array accurately */
+ eah->fvalue = NULL;
+ /* And we don't know the flattened size either */
+ eah->flat_size = 0;
+
+ /* Update dimensionality info if needed */
+ if (dimschanged)
+ {
+ eah->ndims = ndim;
+ memcpy(eah->dims, dim, ndim * sizeof(int));
+ memcpy(eah->lbound, lb, ndim * sizeof(int));
+ }
+
+ /* Reposition items if needed, and fill addedbefore items with nulls */
+ if (addedbefore > 0)
+ {
+ memmove(dvalues + addedbefore, dvalues, eah->nelems * sizeof(Datum));
+ for (i = 0; i < addedbefore; i++)
+ dvalues[i] = (Datum) 0;
+ if (dnulls)
+ {
+ memmove(dnulls + addedbefore, dnulls, eah->nelems * sizeof(bool));
+ for (i = 0; i < addedbefore; i++)
+ dnulls[i] = true;
+ }
+ eah->nelems += addedbefore;
+ }
+
+ /* fill addedafter items with nulls */
+ if (addedafter > 0)
+ {
+ for (i = 0; i < addedafter; i++)
+ dvalues[eah->nelems + i] = (Datum) 0;
+ if (dnulls)
+ {
+ for (i = 0; i < addedafter; i++)
+ dnulls[eah->nelems + i] = true;
+ }
+ eah->nelems += addedafter;
+ }
+
+ /* Grab old element value for pfree'ing, if needed. */
+ if (!eah->typbyval && (dnulls == NULL || !dnulls[offset]))
+ oldValue = (char *) DatumGetPointer(dvalues[offset]);
+ else
+ oldValue = NULL;
+
+ /* And finally we can insert the new element. */
+ dvalues[offset] = dataValue;
+ if (dnulls)
+ dnulls[offset] = isNull;
+
+ /*
+ * Free old element if needed; this keeps repeated element replacements
+ * from bloating the array's storage. If the pfree somehow fails, it
+ * won't corrupt the array.
+ */
+ if (oldValue)
+ {
+ /* Don't try to pfree a part of the original flat array */
+ if (oldValue < eah->fstartptr || oldValue >= eah->fendptr)
+ pfree(oldValue);
+ }
+
+ /* Done, return standard TOAST pointer for object */
+ return EOHPGetRWDatum(&eah->hdr);
+}
+
+/*
+ * array_set_slice :
+ * This routine sets the value of a range of array locations (specified
+ * by upper and lower subscript values) to new values passed as
+ * another array.
+ *
+ * This handles both ordinary varlena arrays and fixed-length arrays.
+ *
+ * Inputs:
+ * arraydatum: the initial array object (mustn't be NULL)
+ * nSubscripts: number of subscripts supplied (must be same for upper/lower)
+ * upperIndx[]: the upper subscript values
+ * lowerIndx[]: the lower subscript values
+ * upperProvided[]: true for provided upper subscript values
+ * lowerProvided[]: true for provided lower subscript values
+ * srcArrayDatum: the source for the inserted values
+ * isNull: indicates whether srcArrayDatum is NULL
+ * arraytyplen: pg_type.typlen for the array type
+ * elmlen: pg_type.typlen for the array's element type
+ * elmbyval: pg_type.typbyval for the array's element type
+ * elmalign: pg_type.typalign for the array's element type
+ *
+ * Result:
+ * A new array is returned, just like the old except for the
+ * modified range. The original array object is not changed.
+ *
+ * Omitted upper and lower subscript values are replaced by the corresponding
+ * array bound.
+ *
+ * For one-dimensional arrays only, we allow the array to be extended
+ * by assigning to positions outside the existing subscript range; any
+ * positions between the existing elements and the new ones are set to NULLs.
+ * (XXX TODO: allow a corresponding behavior for multidimensional arrays)
+ *
+ * NOTE: we assume it is OK to scribble on the provided index arrays
+ * lowerIndx[] and upperIndx[]; also, these arrays must be of size MAXDIM
+ * even when nSubscripts is less. These are generally just temporaries.
+ *
+ * NOTE: For assignments, we throw an error for silly subscripts etc,
+ * rather than returning a NULL or empty array as the fetch operations do.
+ */
+Datum
+array_set_slice(Datum arraydatum,
+ int nSubscripts,
+ int *upperIndx,
+ int *lowerIndx,
+ bool *upperProvided,
+ bool *lowerProvided,
+ Datum srcArrayDatum,
+ bool isNull,
+ int arraytyplen,
+ int elmlen,
+ bool elmbyval,
+ char elmalign)
+{
+ ArrayType *array;
+ ArrayType *srcArray;
+ ArrayType *newarray;
+ int i,
+ ndim,
+ dim[MAXDIM],
+ lb[MAXDIM],
+ span[MAXDIM];
+ bool newhasnulls;
+ int nitems,
+ nsrcitems,
+ olddatasize,
+ newsize,
+ olditemsize,
+ newitemsize,
+ overheadlen,
+ oldoverheadlen,
+ addedbefore,
+ addedafter,
+ lenbefore,
+ lenafter,
+ itemsbefore,
+ itemsafter,
+ nolditems;
+
+ /* Currently, assignment from a NULL source array is a no-op */
+ if (isNull)
+ return arraydatum;
+
+ if (arraytyplen > 0)
+ {
+ /*
+ * fixed-length arrays -- not got round to doing this...
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("updates on slices of fixed-length arrays not implemented")));
+ }
+
+ /* detoast arrays if necessary */
+ array = DatumGetArrayTypeP(arraydatum);
+ srcArray = DatumGetArrayTypeP(srcArrayDatum);
+
+ /* note: we assume srcArray contains no toasted elements */
+
+ ndim = ARR_NDIM(array);
+
+ /*
+ * if number of dims is zero, i.e. an empty array, create an array with
+ * nSubscripts dimensions, and set the upper and lower bounds to the
+ * supplied subscripts
+ */
+ if (ndim == 0)
+ {
+ Datum *dvalues;
+ bool *dnulls;
+ int nelems;
+ Oid elmtype = ARR_ELEMTYPE(array);
+
+ deconstruct_array(srcArray, elmtype, elmlen, elmbyval, elmalign,
+ &dvalues, &dnulls, &nelems);
+
+ for (i = 0; i < nSubscripts; i++)
+ {
+ if (!upperProvided[i] || !lowerProvided[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array slice subscript must provide both boundaries"),
+ errdetail("When assigning to a slice of an empty array value,"
+ " slice boundaries must be fully specified.")));
+
+ dim[i] = 1 + upperIndx[i] - lowerIndx[i];
+ lb[i] = lowerIndx[i];
+ }
+
+ /* complain if too few source items; we ignore extras, however */
+ if (nelems < ArrayGetNItems(nSubscripts, dim))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("source array too small")));
+
+ return PointerGetDatum(construct_md_array(dvalues, dnulls, nSubscripts,
+ dim, lb, elmtype,
+ elmlen, elmbyval, elmalign));
+ }
+
+ if (ndim < nSubscripts || ndim <= 0 || ndim > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ /* copy dim/lb since we may modify them */
+ memcpy(dim, ARR_DIMS(array), ndim * sizeof(int));
+ memcpy(lb, ARR_LBOUND(array), ndim * sizeof(int));
+
+ newhasnulls = (ARR_HASNULL(array) || ARR_HASNULL(srcArray));
+ addedbefore = addedafter = 0;
+
+ /*
+ * Check subscripts. We assume the existing subscripts passed
+ * ArrayCheckBounds, so that dim[i] + lb[i] can be computed without
+ * overflow. But we must beware of other overflows in our calculations of
+ * new dim[] values.
+ */
+ if (ndim == 1)
+ {
+ Assert(nSubscripts == 1);
+ if (!lowerProvided[0])
+ lowerIndx[0] = lb[0];
+ if (!upperProvided[0])
+ upperIndx[0] = dim[0] + lb[0] - 1;
+ if (lowerIndx[0] > upperIndx[0])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("upper bound cannot be less than lower bound")));
+ if (lowerIndx[0] < lb[0])
+ {
+ /* addedbefore = lb[0] - lowerIndx[0]; */
+ /* dim[0] += addedbefore; */
+ if (pg_sub_s32_overflow(lb[0], lowerIndx[0], &addedbefore) ||
+ pg_add_s32_overflow(dim[0], addedbefore, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ lb[0] = lowerIndx[0];
+ if (addedbefore > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ if (upperIndx[0] >= (dim[0] + lb[0]))
+ {
+ /* addedafter = upperIndx[0] - (dim[0] + lb[0]) + 1; */
+ /* dim[0] += addedafter; */
+ if (pg_sub_s32_overflow(upperIndx[0], dim[0] + lb[0], &addedafter) ||
+ pg_add_s32_overflow(addedafter, 1, &addedafter) ||
+ pg_add_s32_overflow(dim[0], addedafter, &dim[0]))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ if (addedafter > 1)
+ newhasnulls = true; /* will insert nulls */
+ }
+ }
+ else
+ {
+ /*
+ * XXX currently we do not support extending multi-dimensional arrays
+ * during assignment
+ */
+ for (i = 0; i < nSubscripts; i++)
+ {
+ if (!lowerProvided[i])
+ lowerIndx[i] = lb[i];
+ if (!upperProvided[i])
+ upperIndx[i] = dim[i] + lb[i] - 1;
+ if (lowerIndx[i] > upperIndx[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("upper bound cannot be less than lower bound")));
+ if (lowerIndx[i] < lb[i] ||
+ upperIndx[i] >= (dim[i] + lb[i]))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array subscript out of range")));
+ }
+ /* fill any missing subscript positions with full array range */
+ for (; i < ndim; i++)
+ {
+ lowerIndx[i] = lb[i];
+ upperIndx[i] = dim[i] + lb[i] - 1;
+ if (lowerIndx[i] > upperIndx[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("upper bound cannot be less than lower bound")));
+ }
+ }
+
+ /* Do this mainly to check for overflow */
+ nitems = ArrayGetNItems(ndim, dim);
+ ArrayCheckBounds(ndim, dim, lb);
+
+ /*
+ * Make sure source array has enough entries. Note we ignore the shape of
+ * the source array and just read entries serially.
+ */
+ mda_get_range(ndim, span, lowerIndx, upperIndx);
+ nsrcitems = ArrayGetNItems(ndim, span);
+ if (nsrcitems > ArrayGetNItems(ARR_NDIM(srcArray), ARR_DIMS(srcArray)))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("source array too small")));
+
+ /*
+ * Compute space occupied by new entries, space occupied by replaced
+ * entries, and required space for new array.
+ */
+ if (newhasnulls)
+ overheadlen = ARR_OVERHEAD_WITHNULLS(ndim, nitems);
+ else
+ overheadlen = ARR_OVERHEAD_NONULLS(ndim);
+ newitemsize = array_nelems_size(ARR_DATA_PTR(srcArray), 0,
+ ARR_NULLBITMAP(srcArray), nsrcitems,
+ elmlen, elmbyval, elmalign);
+ oldoverheadlen = ARR_DATA_OFFSET(array);
+ olddatasize = ARR_SIZE(array) - oldoverheadlen;
+ if (ndim > 1)
+ {
+ /*
+ * here we do not need to cope with extension of the array; it would
+ * be a lot more complicated if we had to do so...
+ */
+ olditemsize = array_slice_size(ARR_DATA_PTR(array),
+ ARR_NULLBITMAP(array),
+ ndim, dim, lb,
+ lowerIndx, upperIndx,
+ elmlen, elmbyval, elmalign);
+ lenbefore = lenafter = 0; /* keep compiler quiet */
+ itemsbefore = itemsafter = nolditems = 0;
+ }
+ else
+ {
+ /*
+ * here we must allow for possibility of slice larger than orig array
+ * and/or not adjacent to orig array subscripts
+ */
+ int oldlb = ARR_LBOUND(array)[0];
+ int oldub = oldlb + ARR_DIMS(array)[0] - 1;
+ int slicelb = Max(oldlb, lowerIndx[0]);
+ int sliceub = Min(oldub, upperIndx[0]);
+ char *oldarraydata = ARR_DATA_PTR(array);
+ bits8 *oldarraybitmap = ARR_NULLBITMAP(array);
+
+ /* count/size of old array entries that will go before the slice */
+ itemsbefore = Min(slicelb, oldub + 1) - oldlb;
+ lenbefore = array_nelems_size(oldarraydata, 0, oldarraybitmap,
+ itemsbefore,
+ elmlen, elmbyval, elmalign);
+ /* count/size of old array entries that will be replaced by slice */
+ if (slicelb > sliceub)
+ {
+ nolditems = 0;
+ olditemsize = 0;
+ }
+ else
+ {
+ nolditems = sliceub - slicelb + 1;
+ olditemsize = array_nelems_size(oldarraydata + lenbefore,
+ itemsbefore, oldarraybitmap,
+ nolditems,
+ elmlen, elmbyval, elmalign);
+ }
+ /* count/size of old array entries that will go after the slice */
+ itemsafter = oldub + 1 - Max(sliceub + 1, oldlb);
+ lenafter = olddatasize - lenbefore - olditemsize;
+ }
+
+ newsize = overheadlen + olddatasize - olditemsize + newitemsize;
+
+ newarray = (ArrayType *) palloc0(newsize);
+ SET_VARSIZE(newarray, newsize);
+ newarray->ndim = ndim;
+ newarray->dataoffset = newhasnulls ? overheadlen : 0;
+ newarray->elemtype = ARR_ELEMTYPE(array);
+ memcpy(ARR_DIMS(newarray), dim, ndim * sizeof(int));
+ memcpy(ARR_LBOUND(newarray), lb, ndim * sizeof(int));
+
+ if (ndim > 1)
+ {
+ /*
+ * here we do not need to cope with extension of the array; it would
+ * be a lot more complicated if we had to do so...
+ */
+ array_insert_slice(newarray, array, srcArray,
+ ndim, dim, lb,
+ lowerIndx, upperIndx,
+ elmlen, elmbyval, elmalign);
+ }
+ else
+ {
+ /* fill in data */
+ memcpy((char *) newarray + overheadlen,
+ (char *) array + oldoverheadlen,
+ lenbefore);
+ memcpy((char *) newarray + overheadlen + lenbefore,
+ ARR_DATA_PTR(srcArray),
+ newitemsize);
+ memcpy((char *) newarray + overheadlen + lenbefore + newitemsize,
+ (char *) array + oldoverheadlen + lenbefore + olditemsize,
+ lenafter);
+ /* fill in nulls bitmap if needed */
+ if (newhasnulls)
+ {
+ bits8 *newnullbitmap = ARR_NULLBITMAP(newarray);
+ bits8 *oldnullbitmap = ARR_NULLBITMAP(array);
+
+ /* palloc0 above already marked any inserted positions as nulls */
+ array_bitmap_copy(newnullbitmap, addedbefore,
+ oldnullbitmap, 0,
+ itemsbefore);
+ array_bitmap_copy(newnullbitmap, lowerIndx[0] - lb[0],
+ ARR_NULLBITMAP(srcArray), 0,
+ nsrcitems);
+ array_bitmap_copy(newnullbitmap, addedbefore + itemsbefore + nolditems,
+ oldnullbitmap, itemsbefore + nolditems,
+ itemsafter);
+ }
+ }
+
+ return PointerGetDatum(newarray);
+}
+
+/*
+ * array_ref : backwards compatibility wrapper for array_get_element
+ *
+ * This only works for detoasted/flattened varlena arrays, since the array
+ * argument is declared as "ArrayType *". However there's enough code like
+ * that to justify preserving this API.
+ */
+Datum
+array_ref(ArrayType *array, int nSubscripts, int *indx,
+ int arraytyplen, int elmlen, bool elmbyval, char elmalign,
+ bool *isNull)
+{
+ return array_get_element(PointerGetDatum(array), nSubscripts, indx,
+ arraytyplen, elmlen, elmbyval, elmalign,
+ isNull);
+}
+
+/*
+ * array_set : backwards compatibility wrapper for array_set_element
+ *
+ * This only works for detoasted/flattened varlena arrays, since the array
+ * argument and result are declared as "ArrayType *". However there's enough
+ * code like that to justify preserving this API.
+ */
+ArrayType *
+array_set(ArrayType *array, int nSubscripts, int *indx,
+ Datum dataValue, bool isNull,
+ int arraytyplen, int elmlen, bool elmbyval, char elmalign)
+{
+ return DatumGetArrayTypeP(array_set_element(PointerGetDatum(array),
+ nSubscripts, indx,
+ dataValue, isNull,
+ arraytyplen,
+ elmlen, elmbyval, elmalign));
+}
+
+/*
+ * array_map()
+ *
+ * Map an array through an arbitrary expression. Return a new array with
+ * the same dimensions and each source element transformed by the given,
+ * already-compiled expression. Each source element is placed in the
+ * innermost_caseval/innermost_casenull fields of the ExprState.
+ *
+ * Parameters are:
+ * * arrayd: Datum representing array argument.
+ * * exprstate: ExprState representing the per-element transformation.
+ * * econtext: context for expression evaluation.
+ * * retType: OID of element type of output array. This must be the same as,
+ * or binary-compatible with, the result type of the expression. It might
+ * be different from the input array's element type.
+ * * amstate: workspace for array_map. Must be zeroed by caller before
+ * first call, and not touched after that.
+ *
+ * It is legitimate to pass a freshly-zeroed ArrayMapState on each call,
+ * but better performance can be had if the state can be preserved across
+ * a series of calls.
+ *
+ * NB: caller must assure that input array is not NULL. NULL elements in
+ * the array are OK however.
+ * NB: caller should be running in econtext's per-tuple memory context.
+ */
+Datum
+array_map(Datum arrayd,
+ ExprState *exprstate, ExprContext *econtext,
+ Oid retType, ArrayMapState *amstate)
+{
+ AnyArrayType *v = DatumGetAnyArrayP(arrayd);
+ ArrayType *result;
+ Datum *values;
+ bool *nulls;
+ int *dim;
+ int ndim;
+ int nitems;
+ int i;
+ int32 nbytes = 0;
+ int32 dataoffset;
+ bool hasnulls;
+ Oid inpType;
+ int inp_typlen;
+ bool inp_typbyval;
+ char inp_typalign;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ array_iter iter;
+ ArrayMetaState *inp_extra;
+ ArrayMetaState *ret_extra;
+ Datum *transform_source = exprstate->innermost_caseval;
+ bool *transform_source_isnull = exprstate->innermost_casenull;
+
+ inpType = AARR_ELEMTYPE(v);
+ ndim = AARR_NDIM(v);
+ dim = AARR_DIMS(v);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ /* Check for empty array */
+ if (nitems <= 0)
+ {
+ /* Return empty array */
+ return PointerGetDatum(construct_empty_array(retType));
+ }
+
+ /*
+ * We arrange to look up info about input and return element types only
+ * once per series of calls, assuming the element type doesn't change
+ * underneath us.
+ */
+ inp_extra = &amstate->inp_extra;
+ ret_extra = &amstate->ret_extra;
+
+ if (inp_extra->element_type != inpType)
+ {
+ get_typlenbyvalalign(inpType,
+ &inp_extra->typlen,
+ &inp_extra->typbyval,
+ &inp_extra->typalign);
+ inp_extra->element_type = inpType;
+ }
+ inp_typlen = inp_extra->typlen;
+ inp_typbyval = inp_extra->typbyval;
+ inp_typalign = inp_extra->typalign;
+
+ if (ret_extra->element_type != retType)
+ {
+ get_typlenbyvalalign(retType,
+ &ret_extra->typlen,
+ &ret_extra->typbyval,
+ &ret_extra->typalign);
+ ret_extra->element_type = retType;
+ }
+ typlen = ret_extra->typlen;
+ typbyval = ret_extra->typbyval;
+ typalign = ret_extra->typalign;
+
+ /* Allocate temporary arrays for new values */
+ values = (Datum *) palloc(nitems * sizeof(Datum));
+ nulls = (bool *) palloc(nitems * sizeof(bool));
+
+ /* Loop over source data */
+ array_iter_setup(&iter, v);
+ hasnulls = false;
+
+ for (i = 0; i < nitems; i++)
+ {
+ /* Get source element, checking for NULL */
+ *transform_source =
+ array_iter_next(&iter, transform_source_isnull, i,
+ inp_typlen, inp_typbyval, inp_typalign);
+
+ /* Apply the given expression to source element */
+ values[i] = ExecEvalExpr(exprstate, econtext, &nulls[i]);
+
+ if (nulls[i])
+ hasnulls = true;
+ else
+ {
+ /* Ensure data is not toasted */
+ if (typlen == -1)
+ values[i] = PointerGetDatum(PG_DETOAST_DATUM(values[i]));
+ /* Update total result size */
+ nbytes = att_addlength_datum(nbytes, typlen, values[i]);
+ nbytes = att_align_nominal(nbytes, typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+ }
+
+ /* Allocate and fill the result array */
+ if (hasnulls)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nitems);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndim;
+ result->dataoffset = dataoffset;
+ result->elemtype = retType;
+ memcpy(ARR_DIMS(result), AARR_DIMS(v), ndim * sizeof(int));
+ memcpy(ARR_LBOUND(result), AARR_LBOUND(v), ndim * sizeof(int));
+
+ CopyArrayEls(result,
+ values, nulls, nitems,
+ typlen, typbyval, typalign,
+ false);
+
+ /*
+ * Note: do not risk trying to pfree the results of the called expression
+ */
+ pfree(values);
+ pfree(nulls);
+
+ return PointerGetDatum(result);
+}
+
+/*
+ * construct_array --- simple method for constructing an array object
+ *
+ * elems: array of Datum items to become the array contents
+ * (NULL element values are not supported).
+ * nelems: number of items
+ * elmtype, elmlen, elmbyval, elmalign: info for the datatype of the items
+ *
+ * A palloc'd 1-D array object is constructed and returned. Note that
+ * elem values will be copied into the object even if pass-by-ref type.
+ * Also note the result will be 0-D not 1-D if nelems = 0.
+ *
+ * NOTE: it would be cleaner to look up the elmlen/elmbval/elmalign info
+ * from the system catalogs, given the elmtype. However, the caller is
+ * in a better position to cache this info across multiple uses, or even
+ * to hard-wire values if the element type is hard-wired.
+ */
+ArrayType *
+construct_array(Datum *elems, int nelems,
+ Oid elmtype,
+ int elmlen, bool elmbyval, char elmalign)
+{
+ int dims[1];
+ int lbs[1];
+
+ dims[0] = nelems;
+ lbs[0] = 1;
+
+ return construct_md_array(elems, NULL, 1, dims, lbs,
+ elmtype, elmlen, elmbyval, elmalign);
+}
+
+/*
+ * construct_md_array --- simple method for constructing an array object
+ * with arbitrary dimensions and possible NULLs
+ *
+ * elems: array of Datum items to become the array contents
+ * nulls: array of is-null flags (can be NULL if no nulls)
+ * ndims: number of dimensions
+ * dims: integer array with size of each dimension
+ * lbs: integer array with lower bound of each dimension
+ * elmtype, elmlen, elmbyval, elmalign: info for the datatype of the items
+ *
+ * A palloc'd ndims-D array object is constructed and returned. Note that
+ * elem values will be copied into the object even if pass-by-ref type.
+ * Also note the result will be 0-D not ndims-D if any dims[i] = 0.
+ *
+ * NOTE: it would be cleaner to look up the elmlen/elmbval/elmalign info
+ * from the system catalogs, given the elmtype. However, the caller is
+ * in a better position to cache this info across multiple uses, or even
+ * to hard-wire values if the element type is hard-wired.
+ */
+ArrayType *
+construct_md_array(Datum *elems,
+ bool *nulls,
+ int ndims,
+ int *dims,
+ int *lbs,
+ Oid elmtype, int elmlen, bool elmbyval, char elmalign)
+{
+ ArrayType *result;
+ bool hasnulls;
+ int32 nbytes;
+ int32 dataoffset;
+ int i;
+ int nelems;
+
+ if (ndims < 0) /* we do allow zero-dimension arrays */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid number of dimensions: %d", ndims)));
+ if (ndims > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ ndims, MAXDIM)));
+
+ /* This checks for overflow of the array dimensions */
+ nelems = ArrayGetNItems(ndims, dims);
+ ArrayCheckBounds(ndims, dims, lbs);
+
+ /* if ndims <= 0 or any dims[i] == 0, return empty array */
+ if (nelems <= 0)
+ return construct_empty_array(elmtype);
+
+ /* compute required space */
+ nbytes = 0;
+ hasnulls = false;
+ for (i = 0; i < nelems; i++)
+ {
+ if (nulls && nulls[i])
+ {
+ hasnulls = true;
+ continue;
+ }
+ /* make sure data is not toasted */
+ if (elmlen == -1)
+ elems[i] = PointerGetDatum(PG_DETOAST_DATUM(elems[i]));
+ nbytes = att_addlength_datum(nbytes, elmlen, elems[i]);
+ nbytes = att_align_nominal(nbytes, elmalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+
+ /* Allocate and initialize result array */
+ if (hasnulls)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndims, nelems);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndims);
+ }
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndims;
+ result->dataoffset = dataoffset;
+ result->elemtype = elmtype;
+ memcpy(ARR_DIMS(result), dims, ndims * sizeof(int));
+ memcpy(ARR_LBOUND(result), lbs, ndims * sizeof(int));
+
+ CopyArrayEls(result,
+ elems, nulls, nelems,
+ elmlen, elmbyval, elmalign,
+ false);
+
+ return result;
+}
+
+/*
+ * construct_empty_array --- make a zero-dimensional array of given type
+ */
+ArrayType *
+construct_empty_array(Oid elmtype)
+{
+ ArrayType *result;
+
+ result = (ArrayType *) palloc0(sizeof(ArrayType));
+ SET_VARSIZE(result, sizeof(ArrayType));
+ result->ndim = 0;
+ result->dataoffset = 0;
+ result->elemtype = elmtype;
+ return result;
+}
+
+/*
+ * construct_empty_expanded_array: make an empty expanded array
+ * given only type information. (metacache can be NULL if not needed.)
+ */
+ExpandedArrayHeader *
+construct_empty_expanded_array(Oid element_type,
+ MemoryContext parentcontext,
+ ArrayMetaState *metacache)
+{
+ ArrayType *array = construct_empty_array(element_type);
+ Datum d;
+
+ d = expand_array(PointerGetDatum(array), parentcontext, metacache);
+ pfree(array);
+ return (ExpandedArrayHeader *) DatumGetEOHP(d);
+}
+
+/*
+ * deconstruct_array --- simple method for extracting data from an array
+ *
+ * array: array object to examine (must not be NULL)
+ * elmtype, elmlen, elmbyval, elmalign: info for the datatype of the items
+ * elemsp: return value, set to point to palloc'd array of Datum values
+ * nullsp: return value, set to point to palloc'd array of isnull markers
+ * nelemsp: return value, set to number of extracted values
+ *
+ * The caller may pass nullsp == NULL if it does not support NULLs in the
+ * array. Note that this produces a very uninformative error message,
+ * so do it only in cases where a NULL is really not expected.
+ *
+ * If array elements are pass-by-ref data type, the returned Datums will
+ * be pointers into the array object.
+ *
+ * NOTE: it would be cleaner to look up the elmlen/elmbval/elmalign info
+ * from the system catalogs, given the elmtype. However, in most current
+ * uses the type is hard-wired into the caller and so we can save a lookup
+ * cycle by hard-wiring the type info as well.
+ */
+void
+deconstruct_array(ArrayType *array,
+ Oid elmtype,
+ int elmlen, bool elmbyval, char elmalign,
+ Datum **elemsp, bool **nullsp, int *nelemsp)
+{
+ Datum *elems;
+ bool *nulls;
+ int nelems;
+ char *p;
+ bits8 *bitmap;
+ int bitmask;
+ int i;
+
+ Assert(ARR_ELEMTYPE(array) == elmtype);
+
+ nelems = ArrayGetNItems(ARR_NDIM(array), ARR_DIMS(array));
+ *elemsp = elems = (Datum *) palloc(nelems * sizeof(Datum));
+ if (nullsp)
+ *nullsp = nulls = (bool *) palloc0(nelems * sizeof(bool));
+ else
+ nulls = NULL;
+ *nelemsp = nelems;
+
+ p = ARR_DATA_PTR(array);
+ bitmap = ARR_NULLBITMAP(array);
+ bitmask = 1;
+
+ for (i = 0; i < nelems; i++)
+ {
+ /* Get source element, checking for NULL */
+ if (bitmap && (*bitmap & bitmask) == 0)
+ {
+ elems[i] = (Datum) 0;
+ if (nulls)
+ nulls[i] = true;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null array element not allowed in this context")));
+ }
+ else
+ {
+ elems[i] = fetch_att(p, elmbyval, elmlen);
+ p = att_addlength_pointer(p, elmlen, p);
+ p = (char *) att_align_nominal(p, elmalign);
+ }
+
+ /* advance bitmap pointer if any */
+ if (bitmap)
+ {
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ bitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+}
+
+/*
+ * array_contains_nulls --- detect whether an array has any null elements
+ *
+ * This gives an accurate answer, whereas testing ARR_HASNULL only tells
+ * if the array *might* contain a null.
+ */
+bool
+array_contains_nulls(ArrayType *array)
+{
+ int nelems;
+ bits8 *bitmap;
+ int bitmask;
+
+ /* Easy answer if there's no null bitmap */
+ if (!ARR_HASNULL(array))
+ return false;
+
+ nelems = ArrayGetNItems(ARR_NDIM(array), ARR_DIMS(array));
+
+ bitmap = ARR_NULLBITMAP(array);
+
+ /* check whole bytes of the bitmap byte-at-a-time */
+ while (nelems >= 8)
+ {
+ if (*bitmap != 0xFF)
+ return true;
+ bitmap++;
+ nelems -= 8;
+ }
+
+ /* check last partial byte */
+ bitmask = 1;
+ while (nelems > 0)
+ {
+ if ((*bitmap & bitmask) == 0)
+ return true;
+ bitmask <<= 1;
+ nelems--;
+ }
+
+ return false;
+}
+
+
+/*
+ * array_eq :
+ * compares two arrays for equality
+ * result :
+ * returns true if the arrays are equal, false otherwise.
+ *
+ * Note: we do not use array_cmp here, since equality may be meaningful in
+ * datatypes that don't have a total ordering (and hence no btree support).
+ */
+Datum
+array_eq(PG_FUNCTION_ARGS)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ AnyArrayType *array1 = PG_GETARG_ANY_ARRAY_P(0);
+ AnyArrayType *array2 = PG_GETARG_ANY_ARRAY_P(1);
+ Oid collation = PG_GET_COLLATION();
+ int ndims1 = AARR_NDIM(array1);
+ int ndims2 = AARR_NDIM(array2);
+ int *dims1 = AARR_DIMS(array1);
+ int *dims2 = AARR_DIMS(array2);
+ int *lbs1 = AARR_LBOUND(array1);
+ int *lbs2 = AARR_LBOUND(array2);
+ Oid element_type = AARR_ELEMTYPE(array1);
+ bool result = true;
+ int nitems;
+ TypeCacheEntry *typentry;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ array_iter it1;
+ array_iter it2;
+ int i;
+
+ if (element_type != AARR_ELEMTYPE(array2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare arrays of different element types")));
+
+ /* fast path if the arrays do not have the same dimensionality */
+ if (ndims1 != ndims2 ||
+ memcmp(dims1, dims2, ndims1 * sizeof(int)) != 0 ||
+ memcmp(lbs1, lbs2, ndims1 * sizeof(int)) != 0)
+ result = false;
+ else
+ {
+ /*
+ * We arrange to look up the equality function only once per series of
+ * calls, assuming the element type doesn't change underneath us. The
+ * typcache is used so that we have no memory leakage when being used
+ * as an index support function.
+ */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_EQ_OPR_FINFO);
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * apply the operator to each pair of array elements.
+ */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Loop over source data */
+ nitems = ArrayGetNItems(ndims1, dims1);
+ array_iter_setup(&it1, array1);
+ array_iter_setup(&it2, array2);
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum elt1;
+ Datum elt2;
+ bool isnull1;
+ bool isnull2;
+ bool oprresult;
+
+ /* Get elements, checking for NULL */
+ elt1 = array_iter_next(&it1, &isnull1, i,
+ typlen, typbyval, typalign);
+ elt2 = array_iter_next(&it2, &isnull2, i,
+ typlen, typbyval, typalign);
+
+ /*
+ * We consider two NULLs equal; NULL and not-NULL are unequal.
+ */
+ if (isnull1 && isnull2)
+ continue;
+ if (isnull1 || isnull2)
+ {
+ result = false;
+ break;
+ }
+
+ /*
+ * Apply the operator to the element pair; treat NULL as false
+ */
+ locfcinfo->args[0].value = elt1;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = elt2;
+ locfcinfo->args[1].isnull = false;
+ locfcinfo->isnull = false;
+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+ if (locfcinfo->isnull || !oprresult)
+ {
+ result = false;
+ break;
+ }
+ }
+ }
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array1, 0);
+ AARR_FREE_IF_COPY(array2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+
+/*-----------------------------------------------------------------------------
+ * array-array bool operators:
+ * Given two arrays, iterate comparison operators
+ * over the array. Uses logic similar to text comparison
+ * functions, except element-by-element instead of
+ * character-by-character.
+ *----------------------------------------------------------------------------
+ */
+
+Datum
+array_ne(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(!DatumGetBool(array_eq(fcinfo)));
+}
+
+Datum
+array_lt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(array_cmp(fcinfo) < 0);
+}
+
+Datum
+array_gt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(array_cmp(fcinfo) > 0);
+}
+
+Datum
+array_le(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(array_cmp(fcinfo) <= 0);
+}
+
+Datum
+array_ge(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(array_cmp(fcinfo) >= 0);
+}
+
+Datum
+btarraycmp(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT32(array_cmp(fcinfo));
+}
+
+/*
+ * array_cmp()
+ * Internal comparison function for arrays.
+ *
+ * Returns -1, 0 or 1
+ */
+static int
+array_cmp(FunctionCallInfo fcinfo)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ AnyArrayType *array1 = PG_GETARG_ANY_ARRAY_P(0);
+ AnyArrayType *array2 = PG_GETARG_ANY_ARRAY_P(1);
+ Oid collation = PG_GET_COLLATION();
+ int ndims1 = AARR_NDIM(array1);
+ int ndims2 = AARR_NDIM(array2);
+ int *dims1 = AARR_DIMS(array1);
+ int *dims2 = AARR_DIMS(array2);
+ int nitems1 = ArrayGetNItems(ndims1, dims1);
+ int nitems2 = ArrayGetNItems(ndims2, dims2);
+ Oid element_type = AARR_ELEMTYPE(array1);
+ int result = 0;
+ TypeCacheEntry *typentry;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ int min_nitems;
+ array_iter it1;
+ array_iter it2;
+ int i;
+
+ if (element_type != AARR_ELEMTYPE(array2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare arrays of different element types")));
+
+ /*
+ * We arrange to look up the comparison function only once per series of
+ * calls, assuming the element type doesn't change underneath us. The
+ * typcache is used so that we have no memory leakage when being used as
+ * an index support function.
+ */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_CMP_PROC_FINFO);
+ if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a comparison function for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * apply the operator to each pair of array elements.
+ */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->cmp_proc_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Loop over source data */
+ min_nitems = Min(nitems1, nitems2);
+ array_iter_setup(&it1, array1);
+ array_iter_setup(&it2, array2);
+
+ for (i = 0; i < min_nitems; i++)
+ {
+ Datum elt1;
+ Datum elt2;
+ bool isnull1;
+ bool isnull2;
+ int32 cmpresult;
+
+ /* Get elements, checking for NULL */
+ elt1 = array_iter_next(&it1, &isnull1, i, typlen, typbyval, typalign);
+ elt2 = array_iter_next(&it2, &isnull2, i, typlen, typbyval, typalign);
+
+ /*
+ * We consider two NULLs equal; NULL > not-NULL.
+ */
+ if (isnull1 && isnull2)
+ continue;
+ if (isnull1)
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ if (isnull2)
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+
+ /* Compare the pair of elements */
+ locfcinfo->args[0].value = elt1;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = elt2;
+ locfcinfo->args[1].isnull = false;
+ cmpresult = DatumGetInt32(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect comparison support functions to return null */
+ Assert(!locfcinfo->isnull);
+
+ if (cmpresult == 0)
+ continue; /* equal */
+
+ if (cmpresult < 0)
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+ else
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ }
+
+ /*
+ * If arrays contain same data (up to end of shorter one), apply
+ * additional rules to sort by dimensionality. The relative significance
+ * of the different bits of information is historical; mainly we just care
+ * that we don't say "equal" for arrays of different dimensionality.
+ */
+ if (result == 0)
+ {
+ if (nitems1 != nitems2)
+ result = (nitems1 < nitems2) ? -1 : 1;
+ else if (ndims1 != ndims2)
+ result = (ndims1 < ndims2) ? -1 : 1;
+ else
+ {
+ for (i = 0; i < ndims1; i++)
+ {
+ if (dims1[i] != dims2[i])
+ {
+ result = (dims1[i] < dims2[i]) ? -1 : 1;
+ break;
+ }
+ }
+ if (result == 0)
+ {
+ int *lbound1 = AARR_LBOUND(array1);
+ int *lbound2 = AARR_LBOUND(array2);
+
+ for (i = 0; i < ndims1; i++)
+ {
+ if (lbound1[i] != lbound2[i])
+ {
+ result = (lbound1[i] < lbound2[i]) ? -1 : 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array1, 0);
+ AARR_FREE_IF_COPY(array2, 1);
+
+ return result;
+}
+
+
+/*-----------------------------------------------------------------------------
+ * array hashing
+ * Hash the elements and combine the results.
+ *----------------------------------------------------------------------------
+ */
+
+Datum
+hash_array(PG_FUNCTION_ARGS)
+{
+ LOCAL_FCINFO(locfcinfo, 1);
+ AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+ int ndims = AARR_NDIM(array);
+ int *dims = AARR_DIMS(array);
+ Oid element_type = AARR_ELEMTYPE(array);
+ uint32 result = 1;
+ int nitems;
+ TypeCacheEntry *typentry;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ int i;
+ array_iter iter;
+
+ /*
+ * We arrange to look up the hash function only once per series of calls,
+ * assuming the element type doesn't change underneath us. The typcache
+ * is used so that we have no memory leakage when being used as an index
+ * support function.
+ */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_HASH_PROC_FINFO);
+ if (!OidIsValid(typentry->hash_proc_finfo.fn_oid) && element_type != RECORDOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(element_type))));
+
+ /*
+ * The type cache doesn't believe that record is hashable (see
+ * cache_record_field_properties()), but since we're here, we're
+ * committed to hashing, so we can assume it does. Worst case, if any
+ * components of the record don't support hashing, we will fail at
+ * execution.
+ */
+ if (element_type == RECORDOID)
+ {
+ MemoryContext oldcontext;
+ TypeCacheEntry *record_typentry;
+
+ oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
+
+ /*
+ * Make fake type cache entry structure. Note that we can't just
+ * modify typentry, since that points directly into the type
+ * cache.
+ */
+ record_typentry = palloc0(sizeof(*record_typentry));
+ record_typentry->type_id = element_type;
+
+ /* fill in what we need below */
+ record_typentry->typlen = typentry->typlen;
+ record_typentry->typbyval = typentry->typbyval;
+ record_typentry->typalign = typentry->typalign;
+ fmgr_info(F_HASH_RECORD, &record_typentry->hash_proc_finfo);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ typentry = record_typentry;
+ }
+
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * apply the hash function to each array element.
+ */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->hash_proc_finfo, 1,
+ PG_GET_COLLATION(), NULL, NULL);
+
+ /* Loop over source data */
+ nitems = ArrayGetNItems(ndims, dims);
+ array_iter_setup(&iter, array);
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum elt;
+ bool isnull;
+ uint32 elthash;
+
+ /* Get element, checking for NULL */
+ elt = array_iter_next(&iter, &isnull, i, typlen, typbyval, typalign);
+
+ if (isnull)
+ {
+ /* Treat nulls as having hashvalue 0 */
+ elthash = 0;
+ }
+ else
+ {
+ /* Apply the hash function */
+ locfcinfo->args[0].value = elt;
+ locfcinfo->args[0].isnull = false;
+ elthash = DatumGetUInt32(FunctionCallInvoke(locfcinfo));
+ /* We don't expect hash functions to return null */
+ Assert(!locfcinfo->isnull);
+ }
+
+ /*
+ * Combine hash values of successive elements by multiplying the
+ * current value by 31 and adding on the new element's hash value.
+ *
+ * The result is a sum in which each element's hash value is
+ * multiplied by a different power of 31. This is modulo 2^32
+ * arithmetic, and the powers of 31 modulo 2^32 form a cyclic group of
+ * order 2^27. So for arrays of up to 2^27 elements, each element's
+ * hash value is multiplied by a different (odd) number, resulting in
+ * a good mixing of all the elements' hash values.
+ */
+ result = (result << 5) - result + elthash;
+ }
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array, 0);
+
+ PG_RETURN_UINT32(result);
+}
+
+/*
+ * Returns 64-bit value by hashing a value to a 64-bit value, with a seed.
+ * Otherwise, similar to hash_array.
+ */
+Datum
+hash_array_extended(PG_FUNCTION_ARGS)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ AnyArrayType *array = PG_GETARG_ANY_ARRAY_P(0);
+ uint64 seed = PG_GETARG_INT64(1);
+ int ndims = AARR_NDIM(array);
+ int *dims = AARR_DIMS(array);
+ Oid element_type = AARR_ELEMTYPE(array);
+ uint64 result = 1;
+ int nitems;
+ TypeCacheEntry *typentry;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ int i;
+ array_iter iter;
+
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO);
+ if (!OidIsValid(typentry->hash_extended_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an extended hash function for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ InitFunctionCallInfoData(*locfcinfo, &typentry->hash_extended_proc_finfo, 2,
+ PG_GET_COLLATION(), NULL, NULL);
+
+ /* Loop over source data */
+ nitems = ArrayGetNItems(ndims, dims);
+ array_iter_setup(&iter, array);
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum elt;
+ bool isnull;
+ uint64 elthash;
+
+ /* Get element, checking for NULL */
+ elt = array_iter_next(&iter, &isnull, i, typlen, typbyval, typalign);
+
+ if (isnull)
+ {
+ elthash = 0;
+ }
+ else
+ {
+ /* Apply the hash function */
+ locfcinfo->args[0].value = elt;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = Int64GetDatum(seed);
+ locfcinfo->args[1].isnull = false;
+ elthash = DatumGetUInt64(FunctionCallInvoke(locfcinfo));
+ /* We don't expect hash functions to return null */
+ Assert(!locfcinfo->isnull);
+ }
+
+ result = (result << 5) - result + elthash;
+ }
+
+ AARR_FREE_IF_COPY(array, 0);
+
+ PG_RETURN_UINT64(result);
+}
+
+
+/*-----------------------------------------------------------------------------
+ * array overlap/containment comparisons
+ * These use the same methods of comparing array elements as array_eq.
+ * We consider only the elements of the arrays, ignoring dimensionality.
+ *----------------------------------------------------------------------------
+ */
+
+/*
+ * array_contain_compare :
+ * compares two arrays for overlap/containment
+ *
+ * When matchall is true, return true if all members of array1 are in array2.
+ * When matchall is false, return true if any members of array1 are in array2.
+ */
+static bool
+array_contain_compare(AnyArrayType *array1, AnyArrayType *array2, Oid collation,
+ bool matchall, void **fn_extra)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ bool result = matchall;
+ Oid element_type = AARR_ELEMTYPE(array1);
+ TypeCacheEntry *typentry;
+ int nelems1;
+ Datum *values2;
+ bool *nulls2;
+ int nelems2;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ int i;
+ int j;
+ array_iter it1;
+
+ if (element_type != AARR_ELEMTYPE(array2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare arrays of different element types")));
+
+ /*
+ * We arrange to look up the equality function only once per series of
+ * calls, assuming the element type doesn't change underneath us. The
+ * typcache is used so that we have no memory leakage when being used as
+ * an index support function.
+ */
+ typentry = (TypeCacheEntry *) *fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_EQ_OPR_FINFO);
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+ *fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * Since we probably will need to scan array2 multiple times, it's
+ * worthwhile to use deconstruct_array on it. We scan array1 the hard way
+ * however, since we very likely won't need to look at all of it.
+ */
+ if (VARATT_IS_EXPANDED_HEADER(array2))
+ {
+ /* This should be safe even if input is read-only */
+ deconstruct_expanded_array(&(array2->xpn));
+ values2 = array2->xpn.dvalues;
+ nulls2 = array2->xpn.dnulls;
+ nelems2 = array2->xpn.nelems;
+ }
+ else
+ deconstruct_array((ArrayType *) array2,
+ element_type, typlen, typbyval, typalign,
+ &values2, &nulls2, &nelems2);
+
+ /*
+ * Apply the comparison operator to each pair of array elements.
+ */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Loop over source data */
+ nelems1 = ArrayGetNItems(AARR_NDIM(array1), AARR_DIMS(array1));
+ array_iter_setup(&it1, array1);
+
+ for (i = 0; i < nelems1; i++)
+ {
+ Datum elt1;
+ bool isnull1;
+
+ /* Get element, checking for NULL */
+ elt1 = array_iter_next(&it1, &isnull1, i, typlen, typbyval, typalign);
+
+ /*
+ * We assume that the comparison operator is strict, so a NULL can't
+ * match anything. XXX this diverges from the "NULL=NULL" behavior of
+ * array_eq, should we act like that?
+ */
+ if (isnull1)
+ {
+ if (matchall)
+ {
+ result = false;
+ break;
+ }
+ continue;
+ }
+
+ for (j = 0; j < nelems2; j++)
+ {
+ Datum elt2 = values2[j];
+ bool isnull2 = nulls2 ? nulls2[j] : false;
+ bool oprresult;
+
+ if (isnull2)
+ continue; /* can't match */
+
+ /*
+ * Apply the operator to the element pair; treat NULL as false
+ */
+ locfcinfo->args[0].value = elt1;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = elt2;
+ locfcinfo->args[1].isnull = false;
+ locfcinfo->isnull = false;
+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+ if (!locfcinfo->isnull && oprresult)
+ break;
+ }
+
+ if (j < nelems2)
+ {
+ /* found a match for elt1 */
+ if (!matchall)
+ {
+ result = true;
+ break;
+ }
+ }
+ else
+ {
+ /* no match for elt1 */
+ if (matchall)
+ {
+ result = false;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+Datum
+arrayoverlap(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *array1 = PG_GETARG_ANY_ARRAY_P(0);
+ AnyArrayType *array2 = PG_GETARG_ANY_ARRAY_P(1);
+ Oid collation = PG_GET_COLLATION();
+ bool result;
+
+ result = array_contain_compare(array1, array2, collation, false,
+ &fcinfo->flinfo->fn_extra);
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array1, 0);
+ AARR_FREE_IF_COPY(array2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+arraycontains(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *array1 = PG_GETARG_ANY_ARRAY_P(0);
+ AnyArrayType *array2 = PG_GETARG_ANY_ARRAY_P(1);
+ Oid collation = PG_GET_COLLATION();
+ bool result;
+
+ result = array_contain_compare(array2, array1, collation, true,
+ &fcinfo->flinfo->fn_extra);
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array1, 0);
+ AARR_FREE_IF_COPY(array2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+arraycontained(PG_FUNCTION_ARGS)
+{
+ AnyArrayType *array1 = PG_GETARG_ANY_ARRAY_P(0);
+ AnyArrayType *array2 = PG_GETARG_ANY_ARRAY_P(1);
+ Oid collation = PG_GET_COLLATION();
+ bool result;
+
+ result = array_contain_compare(array1, array2, collation, true,
+ &fcinfo->flinfo->fn_extra);
+
+ /* Avoid leaking memory when handed toasted input. */
+ AARR_FREE_IF_COPY(array1, 0);
+ AARR_FREE_IF_COPY(array2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+
+/*-----------------------------------------------------------------------------
+ * Array iteration functions
+ * These functions are used to iterate efficiently through arrays
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * array_create_iterator --- set up to iterate through an array
+ *
+ * If slice_ndim is zero, we will iterate element-by-element; the returned
+ * datums are of the array's element type.
+ *
+ * If slice_ndim is 1..ARR_NDIM(arr), we will iterate by slices: the
+ * returned datums are of the same array type as 'arr', but of size
+ * equal to the rightmost N dimensions of 'arr'.
+ *
+ * The passed-in array must remain valid for the lifetime of the iterator.
+ */
+ArrayIterator
+array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)
+{
+ ArrayIterator iterator = palloc0(sizeof(ArrayIteratorData));
+
+ /*
+ * Sanity-check inputs --- caller should have got this right already
+ */
+ Assert(PointerIsValid(arr));
+ if (slice_ndim < 0 || slice_ndim > ARR_NDIM(arr))
+ elog(ERROR, "invalid arguments to array_create_iterator");
+
+ /*
+ * Remember basic info about the array and its element type
+ */
+ iterator->arr = arr;
+ iterator->nullbitmap = ARR_NULLBITMAP(arr);
+ iterator->nitems = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr));
+
+ if (mstate != NULL)
+ {
+ Assert(mstate->element_type == ARR_ELEMTYPE(arr));
+
+ iterator->typlen = mstate->typlen;
+ iterator->typbyval = mstate->typbyval;
+ iterator->typalign = mstate->typalign;
+ }
+ else
+ get_typlenbyvalalign(ARR_ELEMTYPE(arr),
+ &iterator->typlen,
+ &iterator->typbyval,
+ &iterator->typalign);
+
+ /*
+ * Remember the slicing parameters.
+ */
+ iterator->slice_ndim = slice_ndim;
+
+ if (slice_ndim > 0)
+ {
+ /*
+ * Get pointers into the array's dims and lbound arrays to represent
+ * the dims/lbound arrays of a slice. These are the same as the
+ * rightmost N dimensions of the array.
+ */
+ iterator->slice_dims = ARR_DIMS(arr) + ARR_NDIM(arr) - slice_ndim;
+ iterator->slice_lbound = ARR_LBOUND(arr) + ARR_NDIM(arr) - slice_ndim;
+
+ /*
+ * Compute number of elements in a slice.
+ */
+ iterator->slice_len = ArrayGetNItems(slice_ndim,
+ iterator->slice_dims);
+
+ /*
+ * Create workspace for building sub-arrays.
+ */
+ iterator->slice_values = (Datum *)
+ palloc(iterator->slice_len * sizeof(Datum));
+ iterator->slice_nulls = (bool *)
+ palloc(iterator->slice_len * sizeof(bool));
+ }
+
+ /*
+ * Initialize our data pointer and linear element number. These will
+ * advance through the array during array_iterate().
+ */
+ iterator->data_ptr = ARR_DATA_PTR(arr);
+ iterator->current_item = 0;
+
+ return iterator;
+}
+
+/*
+ * Iterate through the array referenced by 'iterator'.
+ *
+ * As long as there is another element (or slice), return it into
+ * *value / *isnull, and return true. Return false when no more data.
+ */
+bool
+array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
+{
+ /* Done if we have reached the end of the array */
+ if (iterator->current_item >= iterator->nitems)
+ return false;
+
+ if (iterator->slice_ndim == 0)
+ {
+ /*
+ * Scalar case: return one element.
+ */
+ if (array_get_isnull(iterator->nullbitmap, iterator->current_item++))
+ {
+ *isnull = true;
+ *value = (Datum) 0;
+ }
+ else
+ {
+ /* non-NULL, so fetch the individual Datum to return */
+ char *p = iterator->data_ptr;
+
+ *isnull = false;
+ *value = fetch_att(p, iterator->typbyval, iterator->typlen);
+
+ /* Move our data pointer forward to the next element */
+ p = att_addlength_pointer(p, iterator->typlen, p);
+ p = (char *) att_align_nominal(p, iterator->typalign);
+ iterator->data_ptr = p;
+ }
+ }
+ else
+ {
+ /*
+ * Slice case: build and return an array of the requested size.
+ */
+ ArrayType *result;
+ Datum *values = iterator->slice_values;
+ bool *nulls = iterator->slice_nulls;
+ char *p = iterator->data_ptr;
+ int i;
+
+ for (i = 0; i < iterator->slice_len; i++)
+ {
+ if (array_get_isnull(iterator->nullbitmap,
+ iterator->current_item++))
+ {
+ nulls[i] = true;
+ values[i] = (Datum) 0;
+ }
+ else
+ {
+ nulls[i] = false;
+ values[i] = fetch_att(p, iterator->typbyval, iterator->typlen);
+
+ /* Move our data pointer forward to the next element */
+ p = att_addlength_pointer(p, iterator->typlen, p);
+ p = (char *) att_align_nominal(p, iterator->typalign);
+ }
+ }
+
+ iterator->data_ptr = p;
+
+ result = construct_md_array(values,
+ nulls,
+ iterator->slice_ndim,
+ iterator->slice_dims,
+ iterator->slice_lbound,
+ ARR_ELEMTYPE(iterator->arr),
+ iterator->typlen,
+ iterator->typbyval,
+ iterator->typalign);
+
+ *isnull = false;
+ *value = PointerGetDatum(result);
+ }
+
+ return true;
+}
+
+/*
+ * Release an ArrayIterator data structure
+ */
+void
+array_free_iterator(ArrayIterator iterator)
+{
+ if (iterator->slice_ndim > 0)
+ {
+ pfree(iterator->slice_values);
+ pfree(iterator->slice_nulls);
+ }
+ pfree(iterator);
+}
+
+
+/***************************************************************************/
+/******************| Support Routines |*****************/
+/***************************************************************************/
+
+/*
+ * Check whether a specific array element is NULL
+ *
+ * nullbitmap: pointer to array's null bitmap (NULL if none)
+ * offset: 0-based linear element number of array element
+ */
+static bool
+array_get_isnull(const bits8 *nullbitmap, int offset)
+{
+ if (nullbitmap == NULL)
+ return false; /* assume not null */
+ if (nullbitmap[offset / 8] & (1 << (offset % 8)))
+ return false; /* not null */
+ return true;
+}
+
+/*
+ * Set a specific array element's null-bitmap entry
+ *
+ * nullbitmap: pointer to array's null bitmap (mustn't be NULL)
+ * offset: 0-based linear element number of array element
+ * isNull: null status to set
+ */
+static void
+array_set_isnull(bits8 *nullbitmap, int offset, bool isNull)
+{
+ int bitmask;
+
+ nullbitmap += offset / 8;
+ bitmask = 1 << (offset % 8);
+ if (isNull)
+ *nullbitmap &= ~bitmask;
+ else
+ *nullbitmap |= bitmask;
+}
+
+/*
+ * Fetch array element at pointer, converted correctly to a Datum
+ *
+ * Caller must have handled case of NULL element
+ */
+static Datum
+ArrayCast(char *value, bool byval, int len)
+{
+ return fetch_att(value, byval, len);
+}
+
+/*
+ * Copy datum to *dest and return total space used (including align padding)
+ *
+ * Caller must have handled case of NULL element
+ */
+static int
+ArrayCastAndSet(Datum src,
+ int typlen,
+ bool typbyval,
+ char typalign,
+ char *dest)
+{
+ int inc;
+
+ if (typlen > 0)
+ {
+ if (typbyval)
+ store_att_byval(dest, src, typlen);
+ else
+ memmove(dest, DatumGetPointer(src), typlen);
+ inc = att_align_nominal(typlen, typalign);
+ }
+ else
+ {
+ Assert(!typbyval);
+ inc = att_addlength_datum(0, typlen, src);
+ memmove(dest, DatumGetPointer(src), inc);
+ inc = att_align_nominal(inc, typalign);
+ }
+
+ return inc;
+}
+
+/*
+ * Advance ptr over nitems array elements
+ *
+ * ptr: starting location in array
+ * offset: 0-based linear element number of first element (the one at *ptr)
+ * nullbitmap: start of array's null bitmap, or NULL if none
+ * nitems: number of array elements to advance over (>= 0)
+ * typlen, typbyval, typalign: storage parameters of array element datatype
+ *
+ * It is caller's responsibility to ensure that nitems is within range
+ */
+static char *
+array_seek(char *ptr, int offset, bits8 *nullbitmap, int nitems,
+ int typlen, bool typbyval, char typalign)
+{
+ int bitmask;
+ int i;
+
+ /* easy if fixed-size elements and no NULLs */
+ if (typlen > 0 && !nullbitmap)
+ return ptr + nitems * ((Size) att_align_nominal(typlen, typalign));
+
+ /* seems worth having separate loops for NULL and no-NULLs cases */
+ if (nullbitmap)
+ {
+ nullbitmap += offset / 8;
+ bitmask = 1 << (offset % 8);
+
+ for (i = 0; i < nitems; i++)
+ {
+ if (*nullbitmap & bitmask)
+ {
+ ptr = att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ }
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ nullbitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < nitems; i++)
+ {
+ ptr = att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ }
+ }
+ return ptr;
+}
+
+/*
+ * Compute total size of the nitems array elements starting at *ptr
+ *
+ * Parameters same as for array_seek
+ */
+static int
+array_nelems_size(char *ptr, int offset, bits8 *nullbitmap, int nitems,
+ int typlen, bool typbyval, char typalign)
+{
+ return array_seek(ptr, offset, nullbitmap, nitems,
+ typlen, typbyval, typalign) - ptr;
+}
+
+/*
+ * Copy nitems array elements from srcptr to destptr
+ *
+ * destptr: starting destination location (must be enough room!)
+ * nitems: number of array elements to copy (>= 0)
+ * srcptr: starting location in source array
+ * offset: 0-based linear element number of first element (the one at *srcptr)
+ * nullbitmap: start of source array's null bitmap, or NULL if none
+ * typlen, typbyval, typalign: storage parameters of array element datatype
+ *
+ * Returns number of bytes copied
+ *
+ * NB: this does not take care of setting up the destination's null bitmap!
+ */
+static int
+array_copy(char *destptr, int nitems,
+ char *srcptr, int offset, bits8 *nullbitmap,
+ int typlen, bool typbyval, char typalign)
+{
+ int numbytes;
+
+ numbytes = array_nelems_size(srcptr, offset, nullbitmap, nitems,
+ typlen, typbyval, typalign);
+ memcpy(destptr, srcptr, numbytes);
+ return numbytes;
+}
+
+/*
+ * Copy nitems null-bitmap bits from source to destination
+ *
+ * destbitmap: start of destination array's null bitmap (mustn't be NULL)
+ * destoffset: 0-based linear element number of first dest element
+ * srcbitmap: start of source array's null bitmap, or NULL if none
+ * srcoffset: 0-based linear element number of first source element
+ * nitems: number of bits to copy (>= 0)
+ *
+ * If srcbitmap is NULL then we assume the source is all-non-NULL and
+ * fill 1's into the destination bitmap. Note that only the specified
+ * bits in the destination map are changed, not any before or after.
+ *
+ * Note: this could certainly be optimized using standard bitblt methods.
+ * However, it's not clear that the typical Postgres array has enough elements
+ * to make it worth worrying too much. For the moment, KISS.
+ */
+void
+array_bitmap_copy(bits8 *destbitmap, int destoffset,
+ const bits8 *srcbitmap, int srcoffset,
+ int nitems)
+{
+ int destbitmask,
+ destbitval,
+ srcbitmask,
+ srcbitval;
+
+ Assert(destbitmap);
+ if (nitems <= 0)
+ return; /* don't risk fetch off end of memory */
+ destbitmap += destoffset / 8;
+ destbitmask = 1 << (destoffset % 8);
+ destbitval = *destbitmap;
+ if (srcbitmap)
+ {
+ srcbitmap += srcoffset / 8;
+ srcbitmask = 1 << (srcoffset % 8);
+ srcbitval = *srcbitmap;
+ while (nitems-- > 0)
+ {
+ if (srcbitval & srcbitmask)
+ destbitval |= destbitmask;
+ else
+ destbitval &= ~destbitmask;
+ destbitmask <<= 1;
+ if (destbitmask == 0x100)
+ {
+ *destbitmap++ = destbitval;
+ destbitmask = 1;
+ if (nitems > 0)
+ destbitval = *destbitmap;
+ }
+ srcbitmask <<= 1;
+ if (srcbitmask == 0x100)
+ {
+ srcbitmap++;
+ srcbitmask = 1;
+ if (nitems > 0)
+ srcbitval = *srcbitmap;
+ }
+ }
+ if (destbitmask != 1)
+ *destbitmap = destbitval;
+ }
+ else
+ {
+ while (nitems-- > 0)
+ {
+ destbitval |= destbitmask;
+ destbitmask <<= 1;
+ if (destbitmask == 0x100)
+ {
+ *destbitmap++ = destbitval;
+ destbitmask = 1;
+ if (nitems > 0)
+ destbitval = *destbitmap;
+ }
+ }
+ if (destbitmask != 1)
+ *destbitmap = destbitval;
+ }
+}
+
+/*
+ * Compute space needed for a slice of an array
+ *
+ * We assume the caller has verified that the slice coordinates are valid.
+ */
+static int
+array_slice_size(char *arraydataptr, bits8 *arraynullsptr,
+ int ndim, int *dim, int *lb,
+ int *st, int *endp,
+ int typlen, bool typbyval, char typalign)
+{
+ int src_offset,
+ span[MAXDIM],
+ prod[MAXDIM],
+ dist[MAXDIM],
+ indx[MAXDIM];
+ char *ptr;
+ int i,
+ j,
+ inc;
+ int count = 0;
+
+ mda_get_range(ndim, span, st, endp);
+
+ /* Pretty easy for fixed element length without nulls ... */
+ if (typlen > 0 && !arraynullsptr)
+ return ArrayGetNItems(ndim, span) * att_align_nominal(typlen, typalign);
+
+ /* Else gotta do it the hard way */
+ src_offset = ArrayGetOffset(ndim, dim, lb, st);
+ ptr = array_seek(arraydataptr, 0, arraynullsptr, src_offset,
+ typlen, typbyval, typalign);
+ mda_get_prod(ndim, dim, prod);
+ mda_get_offset_values(ndim, dist, prod, span);
+ for (i = 0; i < ndim; i++)
+ indx[i] = 0;
+ j = ndim - 1;
+ do
+ {
+ if (dist[j])
+ {
+ ptr = array_seek(ptr, src_offset, arraynullsptr, dist[j],
+ typlen, typbyval, typalign);
+ src_offset += dist[j];
+ }
+ if (!array_get_isnull(arraynullsptr, src_offset))
+ {
+ inc = att_addlength_pointer(0, typlen, ptr);
+ inc = att_align_nominal(inc, typalign);
+ ptr += inc;
+ count += inc;
+ }
+ src_offset++;
+ } while ((j = mda_next_tuple(ndim, indx, span)) != -1);
+ return count;
+}
+
+/*
+ * Extract a slice of an array into consecutive elements in the destination
+ * array.
+ *
+ * We assume the caller has verified that the slice coordinates are valid,
+ * allocated enough storage for the result, and initialized the header
+ * of the new array.
+ */
+static void
+array_extract_slice(ArrayType *newarray,
+ int ndim,
+ int *dim,
+ int *lb,
+ char *arraydataptr,
+ bits8 *arraynullsptr,
+ int *st,
+ int *endp,
+ int typlen,
+ bool typbyval,
+ char typalign)
+{
+ char *destdataptr = ARR_DATA_PTR(newarray);
+ bits8 *destnullsptr = ARR_NULLBITMAP(newarray);
+ char *srcdataptr;
+ int src_offset,
+ dest_offset,
+ prod[MAXDIM],
+ span[MAXDIM],
+ dist[MAXDIM],
+ indx[MAXDIM];
+ int i,
+ j,
+ inc;
+
+ src_offset = ArrayGetOffset(ndim, dim, lb, st);
+ srcdataptr = array_seek(arraydataptr, 0, arraynullsptr, src_offset,
+ typlen, typbyval, typalign);
+ mda_get_prod(ndim, dim, prod);
+ mda_get_range(ndim, span, st, endp);
+ mda_get_offset_values(ndim, dist, prod, span);
+ for (i = 0; i < ndim; i++)
+ indx[i] = 0;
+ dest_offset = 0;
+ j = ndim - 1;
+ do
+ {
+ if (dist[j])
+ {
+ /* skip unwanted elements */
+ srcdataptr = array_seek(srcdataptr, src_offset, arraynullsptr,
+ dist[j],
+ typlen, typbyval, typalign);
+ src_offset += dist[j];
+ }
+ inc = array_copy(destdataptr, 1,
+ srcdataptr, src_offset, arraynullsptr,
+ typlen, typbyval, typalign);
+ if (destnullsptr)
+ array_bitmap_copy(destnullsptr, dest_offset,
+ arraynullsptr, src_offset,
+ 1);
+ destdataptr += inc;
+ srcdataptr += inc;
+ src_offset++;
+ dest_offset++;
+ } while ((j = mda_next_tuple(ndim, indx, span)) != -1);
+}
+
+/*
+ * Insert a slice into an array.
+ *
+ * ndim/dim[]/lb[] are dimensions of the original array. A new array with
+ * those same dimensions is to be constructed. destArray must already
+ * have been allocated and its header initialized.
+ *
+ * st[]/endp[] identify the slice to be replaced. Elements within the slice
+ * volume are taken from consecutive elements of the srcArray; elements
+ * outside it are copied from origArray.
+ *
+ * We assume the caller has verified that the slice coordinates are valid.
+ */
+static void
+array_insert_slice(ArrayType *destArray,
+ ArrayType *origArray,
+ ArrayType *srcArray,
+ int ndim,
+ int *dim,
+ int *lb,
+ int *st,
+ int *endp,
+ int typlen,
+ bool typbyval,
+ char typalign)
+{
+ char *destPtr = ARR_DATA_PTR(destArray);
+ char *origPtr = ARR_DATA_PTR(origArray);
+ char *srcPtr = ARR_DATA_PTR(srcArray);
+ bits8 *destBitmap = ARR_NULLBITMAP(destArray);
+ bits8 *origBitmap = ARR_NULLBITMAP(origArray);
+ bits8 *srcBitmap = ARR_NULLBITMAP(srcArray);
+ int orignitems = ArrayGetNItems(ARR_NDIM(origArray),
+ ARR_DIMS(origArray));
+ int dest_offset,
+ orig_offset,
+ src_offset,
+ prod[MAXDIM],
+ span[MAXDIM],
+ dist[MAXDIM],
+ indx[MAXDIM];
+ int i,
+ j,
+ inc;
+
+ dest_offset = ArrayGetOffset(ndim, dim, lb, st);
+ /* copy items before the slice start */
+ inc = array_copy(destPtr, dest_offset,
+ origPtr, 0, origBitmap,
+ typlen, typbyval, typalign);
+ destPtr += inc;
+ origPtr += inc;
+ if (destBitmap)
+ array_bitmap_copy(destBitmap, 0, origBitmap, 0, dest_offset);
+ orig_offset = dest_offset;
+ mda_get_prod(ndim, dim, prod);
+ mda_get_range(ndim, span, st, endp);
+ mda_get_offset_values(ndim, dist, prod, span);
+ for (i = 0; i < ndim; i++)
+ indx[i] = 0;
+ src_offset = 0;
+ j = ndim - 1;
+ do
+ {
+ /* Copy/advance over elements between here and next part of slice */
+ if (dist[j])
+ {
+ inc = array_copy(destPtr, dist[j],
+ origPtr, orig_offset, origBitmap,
+ typlen, typbyval, typalign);
+ destPtr += inc;
+ origPtr += inc;
+ if (destBitmap)
+ array_bitmap_copy(destBitmap, dest_offset,
+ origBitmap, orig_offset,
+ dist[j]);
+ dest_offset += dist[j];
+ orig_offset += dist[j];
+ }
+ /* Copy new element at this slice position */
+ inc = array_copy(destPtr, 1,
+ srcPtr, src_offset, srcBitmap,
+ typlen, typbyval, typalign);
+ if (destBitmap)
+ array_bitmap_copy(destBitmap, dest_offset,
+ srcBitmap, src_offset,
+ 1);
+ destPtr += inc;
+ srcPtr += inc;
+ dest_offset++;
+ src_offset++;
+ /* Advance over old element at this slice position */
+ origPtr = array_seek(origPtr, orig_offset, origBitmap, 1,
+ typlen, typbyval, typalign);
+ orig_offset++;
+ } while ((j = mda_next_tuple(ndim, indx, span)) != -1);
+
+ /* don't miss any data at the end */
+ array_copy(destPtr, orignitems - orig_offset,
+ origPtr, orig_offset, origBitmap,
+ typlen, typbyval, typalign);
+ if (destBitmap)
+ array_bitmap_copy(destBitmap, dest_offset,
+ origBitmap, orig_offset,
+ orignitems - orig_offset);
+}
+
+/*
+ * initArrayResult - initialize an empty ArrayBuildState
+ *
+ * element_type is the array element type (must be a valid array element type)
+ * rcontext is where to keep working state
+ * subcontext is a flag determining whether to use a separate memory context
+ *
+ * Note: there are two common schemes for using accumArrayResult().
+ * In the older scheme, you start with a NULL ArrayBuildState pointer, and
+ * call accumArrayResult once per element. In this scheme you end up with
+ * a NULL pointer if there were no elements, which you need to special-case.
+ * In the newer scheme, call initArrayResult and then call accumArrayResult
+ * once per element. In this scheme you always end with a non-NULL pointer
+ * that you can pass to makeArrayResult; you get an empty array if there
+ * were no elements. This is preferred if an empty array is what you want.
+ *
+ * It's possible to choose whether to create a separate memory context for the
+ * array build state, or whether to allocate it directly within rcontext.
+ *
+ * When there are many concurrent small states (e.g. array_agg() using hash
+ * aggregation of many small groups), using a separate memory context for each
+ * one may result in severe memory bloat. In such cases, use the same memory
+ * context to initialize all such array build states, and pass
+ * subcontext=false.
+ *
+ * In cases when the array build states have different lifetimes, using a
+ * single memory context is impractical. Instead, pass subcontext=true so that
+ * the array build states can be freed individually.
+ */
+ArrayBuildState *
+initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
+{
+ ArrayBuildState *astate;
+ MemoryContext arr_context = rcontext;
+
+ /* Make a temporary context to hold all the junk */
+ if (subcontext)
+ arr_context = AllocSetContextCreate(rcontext,
+ "accumArrayResult",
+ ALLOCSET_DEFAULT_SIZES);
+
+ astate = (ArrayBuildState *)
+ MemoryContextAlloc(arr_context, sizeof(ArrayBuildState));
+ astate->mcontext = arr_context;
+ astate->private_cxt = subcontext;
+ astate->alen = (subcontext ? 64 : 8); /* arbitrary starting array size */
+ astate->dvalues = (Datum *)
+ MemoryContextAlloc(arr_context, astate->alen * sizeof(Datum));
+ astate->dnulls = (bool *)
+ MemoryContextAlloc(arr_context, astate->alen * sizeof(bool));
+ astate->nelems = 0;
+ astate->element_type = element_type;
+ get_typlenbyvalalign(element_type,
+ &astate->typlen,
+ &astate->typbyval,
+ &astate->typalign);
+
+ return astate;
+}
+
+/*
+ * accumArrayResult - accumulate one (more) Datum for an array result
+ *
+ * astate is working state (can be NULL on first call)
+ * dvalue/disnull represent the new Datum to append to the array
+ * element_type is the Datum's type (must be a valid array element type)
+ * rcontext is where to keep working state
+ */
+ArrayBuildState *
+accumArrayResult(ArrayBuildState *astate,
+ Datum dvalue, bool disnull,
+ Oid element_type,
+ MemoryContext rcontext)
+{
+ MemoryContext oldcontext;
+
+ if (astate == NULL)
+ {
+ /* First time through --- initialize */
+ astate = initArrayResult(element_type, rcontext, true);
+ }
+ else
+ {
+ Assert(astate->element_type == element_type);
+ }
+
+ oldcontext = MemoryContextSwitchTo(astate->mcontext);
+
+ /* enlarge dvalues[]/dnulls[] if needed */
+ if (astate->nelems >= astate->alen)
+ {
+ astate->alen *= 2;
+ astate->dvalues = (Datum *)
+ repalloc(astate->dvalues, astate->alen * sizeof(Datum));
+ astate->dnulls = (bool *)
+ repalloc(astate->dnulls, astate->alen * sizeof(bool));
+ }
+
+ /*
+ * Ensure pass-by-ref stuff is copied into mcontext; and detoast it too if
+ * it's varlena. (You might think that detoasting is not needed here
+ * because construct_md_array can detoast the array elements later.
+ * However, we must not let construct_md_array modify the ArrayBuildState
+ * because that would mean array_agg_finalfn damages its input, which is
+ * verboten. Also, this way frequently saves one copying step.)
+ */
+ if (!disnull && !astate->typbyval)
+ {
+ if (astate->typlen == -1)
+ dvalue = PointerGetDatum(PG_DETOAST_DATUM_COPY(dvalue));
+ else
+ dvalue = datumCopy(dvalue, astate->typbyval, astate->typlen);
+ }
+
+ astate->dvalues[astate->nelems] = dvalue;
+ astate->dnulls[astate->nelems] = disnull;
+ astate->nelems++;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return astate;
+}
+
+/*
+ * makeArrayResult - produce 1-D final result of accumArrayResult
+ *
+ * Note: only releases astate if it was initialized within a separate memory
+ * context (i.e. using subcontext=true when calling initArrayResult).
+ *
+ * astate is working state (must not be NULL)
+ * rcontext is where to construct result
+ */
+Datum
+makeArrayResult(ArrayBuildState *astate,
+ MemoryContext rcontext)
+{
+ int ndims;
+ int dims[1];
+ int lbs[1];
+
+ /* If no elements were presented, we want to create an empty array */
+ ndims = (astate->nelems > 0) ? 1 : 0;
+ dims[0] = astate->nelems;
+ lbs[0] = 1;
+
+ return makeMdArrayResult(astate, ndims, dims, lbs, rcontext,
+ astate->private_cxt);
+}
+
+/*
+ * makeMdArrayResult - produce multi-D final result of accumArrayResult
+ *
+ * beware: no check that specified dimensions match the number of values
+ * accumulated.
+ *
+ * Note: if the astate was not initialized within a separate memory context
+ * (that is, initArrayResult was called with subcontext=false), then using
+ * release=true is illegal. Instead, release astate along with the rest of its
+ * context when appropriate.
+ *
+ * astate is working state (must not be NULL)
+ * rcontext is where to construct result
+ * release is true if okay to release working state
+ */
+Datum
+makeMdArrayResult(ArrayBuildState *astate,
+ int ndims,
+ int *dims,
+ int *lbs,
+ MemoryContext rcontext,
+ bool release)
+{
+ ArrayType *result;
+ MemoryContext oldcontext;
+
+ /* Build the final array result in rcontext */
+ oldcontext = MemoryContextSwitchTo(rcontext);
+
+ result = construct_md_array(astate->dvalues,
+ astate->dnulls,
+ ndims,
+ dims,
+ lbs,
+ astate->element_type,
+ astate->typlen,
+ astate->typbyval,
+ astate->typalign);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ /* Clean up all the junk */
+ if (release)
+ {
+ Assert(astate->private_cxt);
+ MemoryContextDelete(astate->mcontext);
+ }
+
+ return PointerGetDatum(result);
+}
+
+/*
+ * The following three functions provide essentially the same API as
+ * initArrayResult/accumArrayResult/makeArrayResult, but instead of accepting
+ * inputs that are array elements, they accept inputs that are arrays and
+ * produce an output array having N+1 dimensions. The inputs must all have
+ * identical dimensionality as well as element type.
+ */
+
+/*
+ * initArrayResultArr - initialize an empty ArrayBuildStateArr
+ *
+ * array_type is the array type (must be a valid varlena array type)
+ * element_type is the type of the array's elements (lookup if InvalidOid)
+ * rcontext is where to keep working state
+ * subcontext is a flag determining whether to use a separate memory context
+ */
+ArrayBuildStateArr *
+initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext,
+ bool subcontext)
+{
+ ArrayBuildStateArr *astate;
+ MemoryContext arr_context = rcontext; /* by default use the parent ctx */
+
+ /* Lookup element type, unless element_type already provided */
+ if (!OidIsValid(element_type))
+ {
+ element_type = get_element_type(array_type);
+
+ if (!OidIsValid(element_type))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("data type %s is not an array type",
+ format_type_be(array_type))));
+ }
+
+ /* Make a temporary context to hold all the junk */
+ if (subcontext)
+ arr_context = AllocSetContextCreate(rcontext,
+ "accumArrayResultArr",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /* Note we initialize all fields to zero */
+ astate = (ArrayBuildStateArr *)
+ MemoryContextAllocZero(arr_context, sizeof(ArrayBuildStateArr));
+ astate->mcontext = arr_context;
+ astate->private_cxt = subcontext;
+
+ /* Save relevant datatype information */
+ astate->array_type = array_type;
+ astate->element_type = element_type;
+
+ return astate;
+}
+
+/*
+ * accumArrayResultArr - accumulate one (more) sub-array for an array result
+ *
+ * astate is working state (can be NULL on first call)
+ * dvalue/disnull represent the new sub-array to append to the array
+ * array_type is the array type (must be a valid varlena array type)
+ * rcontext is where to keep working state
+ */
+ArrayBuildStateArr *
+accumArrayResultArr(ArrayBuildStateArr *astate,
+ Datum dvalue, bool disnull,
+ Oid array_type,
+ MemoryContext rcontext)
+{
+ ArrayType *arg;
+ MemoryContext oldcontext;
+ int *dims,
+ *lbs,
+ ndims,
+ nitems,
+ ndatabytes;
+ char *data;
+ int i;
+
+ /*
+ * We disallow accumulating null subarrays. Another plausible definition
+ * is to ignore them, but callers that want that can just skip calling
+ * this function.
+ */
+ if (disnull)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("cannot accumulate null arrays")));
+
+ /* Detoast input array in caller's context */
+ arg = DatumGetArrayTypeP(dvalue);
+
+ if (astate == NULL)
+ astate = initArrayResultArr(array_type, InvalidOid, rcontext, true);
+ else
+ Assert(astate->array_type == array_type);
+
+ oldcontext = MemoryContextSwitchTo(astate->mcontext);
+
+ /* Collect this input's dimensions */
+ ndims = ARR_NDIM(arg);
+ dims = ARR_DIMS(arg);
+ lbs = ARR_LBOUND(arg);
+ data = ARR_DATA_PTR(arg);
+ nitems = ArrayGetNItems(ndims, dims);
+ ndatabytes = ARR_SIZE(arg) - ARR_DATA_OFFSET(arg);
+
+ if (astate->ndims == 0)
+ {
+ /* First input; check/save the dimensionality info */
+
+ /* Should we allow empty inputs and just produce an empty output? */
+ if (ndims == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot accumulate empty arrays")));
+ if (ndims + 1 > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ ndims + 1, MAXDIM)));
+
+ /*
+ * The output array will have n+1 dimensions, with the ones after the
+ * first matching the input's dimensions.
+ */
+ astate->ndims = ndims + 1;
+ astate->dims[0] = 0;
+ memcpy(&astate->dims[1], dims, ndims * sizeof(int));
+ astate->lbs[0] = 1;
+ memcpy(&astate->lbs[1], lbs, ndims * sizeof(int));
+
+ /* Allocate at least enough data space for this item */
+ astate->abytes = pg_nextpower2_32(Max(1024, ndatabytes + 1));
+ astate->data = (char *) palloc(astate->abytes);
+ }
+ else
+ {
+ /* Second or later input: must match first input's dimensionality */
+ if (astate->ndims != ndims + 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot accumulate arrays of different dimensionality")));
+ for (i = 0; i < ndims; i++)
+ {
+ if (astate->dims[i + 1] != dims[i] || astate->lbs[i + 1] != lbs[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("cannot accumulate arrays of different dimensionality")));
+ }
+
+ /* Enlarge data space if needed */
+ if (astate->nbytes + ndatabytes > astate->abytes)
+ {
+ astate->abytes = Max(astate->abytes * 2,
+ astate->nbytes + ndatabytes);
+ astate->data = (char *) repalloc(astate->data, astate->abytes);
+ }
+ }
+
+ /*
+ * Copy the data portion of the sub-array. Note we assume that the
+ * advertised data length of the sub-array is properly aligned. We do not
+ * have to worry about detoasting elements since whatever's in the
+ * sub-array should be OK already.
+ */
+ memcpy(astate->data + astate->nbytes, data, ndatabytes);
+ astate->nbytes += ndatabytes;
+
+ /* Deal with null bitmap if needed */
+ if (astate->nullbitmap || ARR_HASNULL(arg))
+ {
+ int newnitems = astate->nitems + nitems;
+
+ if (astate->nullbitmap == NULL)
+ {
+ /*
+ * First input with nulls; we must retrospectively handle any
+ * previous inputs by marking all their items non-null.
+ */
+ astate->aitems = pg_nextpower2_32(Max(256, newnitems + 1));
+ astate->nullbitmap = (bits8 *) palloc((astate->aitems + 7) / 8);
+ array_bitmap_copy(astate->nullbitmap, 0,
+ NULL, 0,
+ astate->nitems);
+ }
+ else if (newnitems > astate->aitems)
+ {
+ astate->aitems = Max(astate->aitems * 2, newnitems);
+ astate->nullbitmap = (bits8 *)
+ repalloc(astate->nullbitmap, (astate->aitems + 7) / 8);
+ }
+ array_bitmap_copy(astate->nullbitmap, astate->nitems,
+ ARR_NULLBITMAP(arg), 0,
+ nitems);
+ }
+
+ astate->nitems += nitems;
+ astate->dims[0] += 1;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ /* Release detoasted copy if any */
+ if ((Pointer) arg != DatumGetPointer(dvalue))
+ pfree(arg);
+
+ return astate;
+}
+
+/*
+ * makeArrayResultArr - produce N+1-D final result of accumArrayResultArr
+ *
+ * astate is working state (must not be NULL)
+ * rcontext is where to construct result
+ * release is true if okay to release working state
+ */
+Datum
+makeArrayResultArr(ArrayBuildStateArr *astate,
+ MemoryContext rcontext,
+ bool release)
+{
+ ArrayType *result;
+ MemoryContext oldcontext;
+
+ /* Build the final array result in rcontext */
+ oldcontext = MemoryContextSwitchTo(rcontext);
+
+ if (astate->ndims == 0)
+ {
+ /* No inputs, return empty array */
+ result = construct_empty_array(astate->element_type);
+ }
+ else
+ {
+ int dataoffset,
+ nbytes;
+
+ /* Check for overflow of the array dimensions */
+ (void) ArrayGetNItems(astate->ndims, astate->dims);
+ ArrayCheckBounds(astate->ndims, astate->dims, astate->lbs);
+
+ /* Compute required space */
+ nbytes = astate->nbytes;
+ if (astate->nullbitmap != NULL)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(astate->ndims, astate->nitems);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0;
+ nbytes += ARR_OVERHEAD_NONULLS(astate->ndims);
+ }
+
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = astate->ndims;
+ result->dataoffset = dataoffset;
+ result->elemtype = astate->element_type;
+
+ memcpy(ARR_DIMS(result), astate->dims, astate->ndims * sizeof(int));
+ memcpy(ARR_LBOUND(result), astate->lbs, astate->ndims * sizeof(int));
+ memcpy(ARR_DATA_PTR(result), astate->data, astate->nbytes);
+
+ if (astate->nullbitmap != NULL)
+ array_bitmap_copy(ARR_NULLBITMAP(result), 0,
+ astate->nullbitmap, 0,
+ astate->nitems);
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ /* Clean up all the junk */
+ if (release)
+ {
+ Assert(astate->private_cxt);
+ MemoryContextDelete(astate->mcontext);
+ }
+
+ return PointerGetDatum(result);
+}
+
+/*
+ * The following three functions provide essentially the same API as
+ * initArrayResult/accumArrayResult/makeArrayResult, but can accept either
+ * scalar or array inputs, invoking the appropriate set of functions above.
+ */
+
+/*
+ * initArrayResultAny - initialize an empty ArrayBuildStateAny
+ *
+ * input_type is the input datatype (either element or array type)
+ * rcontext is where to keep working state
+ * subcontext is a flag determining whether to use a separate memory context
+ */
+ArrayBuildStateAny *
+initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)
+{
+ ArrayBuildStateAny *astate;
+ Oid element_type = get_element_type(input_type);
+
+ if (OidIsValid(element_type))
+ {
+ /* Array case */
+ ArrayBuildStateArr *arraystate;
+
+ arraystate = initArrayResultArr(input_type, InvalidOid, rcontext, subcontext);
+ astate = (ArrayBuildStateAny *)
+ MemoryContextAlloc(arraystate->mcontext,
+ sizeof(ArrayBuildStateAny));
+ astate->scalarstate = NULL;
+ astate->arraystate = arraystate;
+ }
+ else
+ {
+ /* Scalar case */
+ ArrayBuildState *scalarstate;
+
+ /* Let's just check that we have a type that can be put into arrays */
+ Assert(OidIsValid(get_array_type(input_type)));
+
+ scalarstate = initArrayResult(input_type, rcontext, subcontext);
+ astate = (ArrayBuildStateAny *)
+ MemoryContextAlloc(scalarstate->mcontext,
+ sizeof(ArrayBuildStateAny));
+ astate->scalarstate = scalarstate;
+ astate->arraystate = NULL;
+ }
+
+ return astate;
+}
+
+/*
+ * accumArrayResultAny - accumulate one (more) input for an array result
+ *
+ * astate is working state (can be NULL on first call)
+ * dvalue/disnull represent the new input to append to the array
+ * input_type is the input datatype (either element or array type)
+ * rcontext is where to keep working state
+ */
+ArrayBuildStateAny *
+accumArrayResultAny(ArrayBuildStateAny *astate,
+ Datum dvalue, bool disnull,
+ Oid input_type,
+ MemoryContext rcontext)
+{
+ if (astate == NULL)
+ astate = initArrayResultAny(input_type, rcontext, true);
+
+ if (astate->scalarstate)
+ (void) accumArrayResult(astate->scalarstate,
+ dvalue, disnull,
+ input_type, rcontext);
+ else
+ (void) accumArrayResultArr(astate->arraystate,
+ dvalue, disnull,
+ input_type, rcontext);
+
+ return astate;
+}
+
+/*
+ * makeArrayResultAny - produce final result of accumArrayResultAny
+ *
+ * astate is working state (must not be NULL)
+ * rcontext is where to construct result
+ * release is true if okay to release working state
+ */
+Datum
+makeArrayResultAny(ArrayBuildStateAny *astate,
+ MemoryContext rcontext, bool release)
+{
+ Datum result;
+
+ if (astate->scalarstate)
+ {
+ /* Must use makeMdArrayResult to support "release" parameter */
+ int ndims;
+ int dims[1];
+ int lbs[1];
+
+ /* If no elements were presented, we want to create an empty array */
+ ndims = (astate->scalarstate->nelems > 0) ? 1 : 0;
+ dims[0] = astate->scalarstate->nelems;
+ lbs[0] = 1;
+
+ result = makeMdArrayResult(astate->scalarstate, ndims, dims, lbs,
+ rcontext, release);
+ }
+ else
+ {
+ result = makeArrayResultArr(astate->arraystate,
+ rcontext, release);
+ }
+ return result;
+}
+
+
+Datum
+array_larger(PG_FUNCTION_ARGS)
+{
+ if (array_cmp(fcinfo) > 0)
+ PG_RETURN_DATUM(PG_GETARG_DATUM(0));
+ else
+ PG_RETURN_DATUM(PG_GETARG_DATUM(1));
+}
+
+Datum
+array_smaller(PG_FUNCTION_ARGS)
+{
+ if (array_cmp(fcinfo) < 0)
+ PG_RETURN_DATUM(PG_GETARG_DATUM(0));
+ else
+ PG_RETURN_DATUM(PG_GETARG_DATUM(1));
+}
+
+
+typedef struct generate_subscripts_fctx
+{
+ int32 lower;
+ int32 upper;
+ bool reverse;
+} generate_subscripts_fctx;
+
+/*
+ * generate_subscripts(array anyarray, dim int [, reverse bool])
+ * Returns all subscripts of the array for any dimension
+ */
+Datum
+generate_subscripts(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ MemoryContext oldcontext;
+ generate_subscripts_fctx *fctx;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);
+ int reqdim = PG_GETARG_INT32(1);
+ int *lb,
+ *dimv;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /* Sanity check: does it look like an array at all? */
+ if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM)
+ SRF_RETURN_DONE(funcctx);
+
+ /* Sanity check: was the requested dim valid */
+ if (reqdim <= 0 || reqdim > AARR_NDIM(v))
+ SRF_RETURN_DONE(funcctx);
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ fctx = (generate_subscripts_fctx *) palloc(sizeof(generate_subscripts_fctx));
+
+ lb = AARR_LBOUND(v);
+ dimv = AARR_DIMS(v);
+
+ fctx->lower = lb[reqdim - 1];
+ fctx->upper = dimv[reqdim - 1] + lb[reqdim - 1] - 1;
+ fctx->reverse = (PG_NARGS() < 3) ? false : PG_GETARG_BOOL(2);
+
+ funcctx->user_fctx = fctx;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+
+ fctx = funcctx->user_fctx;
+
+ if (fctx->lower <= fctx->upper)
+ {
+ if (!fctx->reverse)
+ SRF_RETURN_NEXT(funcctx, Int32GetDatum(fctx->lower++));
+ else
+ SRF_RETURN_NEXT(funcctx, Int32GetDatum(fctx->upper--));
+ }
+ else
+ /* done when there are no more elements left */
+ SRF_RETURN_DONE(funcctx);
+}
+
+/*
+ * generate_subscripts_nodir
+ * Implements the 2-argument version of generate_subscripts
+ */
+Datum
+generate_subscripts_nodir(PG_FUNCTION_ARGS)
+{
+ /* just call the other one -- it can handle both cases */
+ return generate_subscripts(fcinfo);
+}
+
+/*
+ * array_fill_with_lower_bounds
+ * Create and fill array with defined lower bounds.
+ */
+Datum
+array_fill_with_lower_bounds(PG_FUNCTION_ARGS)
+{
+ ArrayType *dims;
+ ArrayType *lbs;
+ ArrayType *result;
+ Oid elmtype;
+ Datum value;
+ bool isnull;
+
+ if (PG_ARGISNULL(1) || PG_ARGISNULL(2))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("dimension array or low bound array cannot be null")));
+
+ dims = PG_GETARG_ARRAYTYPE_P(1);
+ lbs = PG_GETARG_ARRAYTYPE_P(2);
+
+ if (!PG_ARGISNULL(0))
+ {
+ value = PG_GETARG_DATUM(0);
+ isnull = false;
+ }
+ else
+ {
+ value = 0;
+ isnull = true;
+ }
+
+ elmtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (!OidIsValid(elmtype))
+ elog(ERROR, "could not determine data type of input");
+
+ result = array_fill_internal(dims, lbs, value, isnull, elmtype, fcinfo);
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+/*
+ * array_fill
+ * Create and fill array with default lower bounds.
+ */
+Datum
+array_fill(PG_FUNCTION_ARGS)
+{
+ ArrayType *dims;
+ ArrayType *result;
+ Oid elmtype;
+ Datum value;
+ bool isnull;
+
+ if (PG_ARGISNULL(1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("dimension array or low bound array cannot be null")));
+
+ dims = PG_GETARG_ARRAYTYPE_P(1);
+
+ if (!PG_ARGISNULL(0))
+ {
+ value = PG_GETARG_DATUM(0);
+ isnull = false;
+ }
+ else
+ {
+ value = 0;
+ isnull = true;
+ }
+
+ elmtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (!OidIsValid(elmtype))
+ elog(ERROR, "could not determine data type of input");
+
+ result = array_fill_internal(dims, NULL, value, isnull, elmtype, fcinfo);
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+static ArrayType *
+create_array_envelope(int ndims, int *dimv, int *lbsv, int nbytes,
+ Oid elmtype, int dataoffset)
+{
+ ArrayType *result;
+
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndims;
+ result->dataoffset = dataoffset;
+ result->elemtype = elmtype;
+ memcpy(ARR_DIMS(result), dimv, ndims * sizeof(int));
+ memcpy(ARR_LBOUND(result), lbsv, ndims * sizeof(int));
+
+ return result;
+}
+
+static ArrayType *
+array_fill_internal(ArrayType *dims, ArrayType *lbs,
+ Datum value, bool isnull, Oid elmtype,
+ FunctionCallInfo fcinfo)
+{
+ ArrayType *result;
+ int *dimv;
+ int *lbsv;
+ int ndims;
+ int nitems;
+ int deflbs[MAXDIM];
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ ArrayMetaState *my_extra;
+
+ /*
+ * Params checks
+ */
+ if (ARR_NDIM(dims) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts"),
+ errdetail("Dimension array must be one dimensional.")));
+
+ if (array_contains_nulls(dims))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("dimension values cannot be null")));
+
+ dimv = (int *) ARR_DATA_PTR(dims);
+ ndims = (ARR_NDIM(dims) > 0) ? ARR_DIMS(dims)[0] : 0;
+
+ if (ndims < 0) /* we do allow zero-dimension arrays */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid number of dimensions: %d", ndims)));
+ if (ndims > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ ndims, MAXDIM)));
+
+ if (lbs != NULL)
+ {
+ if (ARR_NDIM(lbs) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts"),
+ errdetail("Dimension array must be one dimensional.")));
+
+ if (array_contains_nulls(lbs))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("dimension values cannot be null")));
+
+ if (ndims != ((ARR_NDIM(lbs) > 0) ? ARR_DIMS(lbs)[0] : 0))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts"),
+ errdetail("Low bound array has different size than dimensions array.")));
+
+ lbsv = (int *) ARR_DATA_PTR(lbs);
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < MAXDIM; i++)
+ deflbs[i] = 1;
+
+ lbsv = deflbs;
+ }
+
+ /* This checks for overflow of the array dimensions */
+ nitems = ArrayGetNItems(ndims, dimv);
+ ArrayCheckBounds(ndims, dimv, lbsv);
+
+ /* fast track for empty array */
+ if (nitems <= 0)
+ return construct_empty_array(elmtype);
+
+ /*
+ * We arrange to look up info about element type only once per series of
+ * calls, assuming the element type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = InvalidOid;
+ }
+
+ if (my_extra->element_type != elmtype)
+ {
+ /* Get info about element type */
+ get_typlenbyvalalign(elmtype,
+ &my_extra->typlen,
+ &my_extra->typbyval,
+ &my_extra->typalign);
+ my_extra->element_type = elmtype;
+ }
+
+ elmlen = my_extra->typlen;
+ elmbyval = my_extra->typbyval;
+ elmalign = my_extra->typalign;
+
+ /* compute required space */
+ if (!isnull)
+ {
+ int i;
+ char *p;
+ int nbytes;
+ int totbytes;
+
+ /* make sure data is not toasted */
+ if (elmlen == -1)
+ value = PointerGetDatum(PG_DETOAST_DATUM(value));
+
+ nbytes = att_addlength_datum(0, elmlen, value);
+ nbytes = att_align_nominal(nbytes, elmalign);
+ Assert(nbytes > 0);
+
+ totbytes = nbytes * nitems;
+
+ /* check for overflow of multiplication or total request */
+ if (totbytes / nbytes != nitems ||
+ !AllocSizeIsValid(totbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+
+ /*
+ * This addition can't overflow, but it might cause us to go past
+ * MaxAllocSize. We leave it to palloc to complain in that case.
+ */
+ totbytes += ARR_OVERHEAD_NONULLS(ndims);
+
+ result = create_array_envelope(ndims, dimv, lbsv, totbytes,
+ elmtype, 0);
+
+ p = ARR_DATA_PTR(result);
+ for (i = 0; i < nitems; i++)
+ p += ArrayCastAndSet(value, elmlen, elmbyval, elmalign, p);
+ }
+ else
+ {
+ int nbytes;
+ int dataoffset;
+
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndims, nitems);
+ nbytes = dataoffset;
+
+ result = create_array_envelope(ndims, dimv, lbsv, nbytes,
+ elmtype, dataoffset);
+
+ /* create_array_envelope already zeroed the bitmap, so we're done */
+ }
+
+ return result;
+}
+
+
+/*
+ * UNNEST
+ */
+Datum
+array_unnest(PG_FUNCTION_ARGS)
+{
+ typedef struct
+ {
+ array_iter iter;
+ int nextelem;
+ int numelems;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ } array_unnest_fctx;
+
+ FuncCallContext *funcctx;
+ array_unnest_fctx *fctx;
+ MemoryContext oldcontext;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ AnyArrayType *arr;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /*
+ * Get the array value and detoast if needed. We can't do this
+ * earlier because if we have to detoast, we want the detoasted copy
+ * to be in multi_call_memory_ctx, so it will go away when we're done
+ * and not before. (If no detoast happens, we assume the originally
+ * passed array will stick around till then.)
+ */
+ arr = PG_GETARG_ANY_ARRAY_P(0);
+
+ /* allocate memory for user context */
+ fctx = (array_unnest_fctx *) palloc(sizeof(array_unnest_fctx));
+
+ /* initialize state */
+ array_iter_setup(&fctx->iter, arr);
+ fctx->nextelem = 0;
+ fctx->numelems = ArrayGetNItems(AARR_NDIM(arr), AARR_DIMS(arr));
+
+ if (VARATT_IS_EXPANDED_HEADER(arr))
+ {
+ /* we can just grab the type data from expanded array */
+ fctx->elmlen = arr->xpn.typlen;
+ fctx->elmbyval = arr->xpn.typbyval;
+ fctx->elmalign = arr->xpn.typalign;
+ }
+ else
+ get_typlenbyvalalign(AARR_ELEMTYPE(arr),
+ &fctx->elmlen,
+ &fctx->elmbyval,
+ &fctx->elmalign);
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+ fctx = funcctx->user_fctx;
+
+ if (fctx->nextelem < fctx->numelems)
+ {
+ int offset = fctx->nextelem++;
+ Datum elem;
+
+ elem = array_iter_next(&fctx->iter, &fcinfo->isnull, offset,
+ fctx->elmlen, fctx->elmbyval, fctx->elmalign);
+
+ SRF_RETURN_NEXT(funcctx, elem);
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/*
+ * Planner support function for array_unnest(anyarray)
+ */
+Datum
+array_unnest_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestRows))
+ {
+ /* Try to estimate the number of rows returned */
+ SupportRequestRows *req = (SupportRequestRows *) rawreq;
+
+ if (is_funcclause(req->node)) /* be paranoid */
+ {
+ List *args = ((FuncExpr *) req->node)->args;
+ Node *arg1;
+
+ /* We can use estimated argument values here */
+ arg1 = estimate_expression_value(req->root, linitial(args));
+
+ req->rows = estimate_array_length(arg1);
+ ret = (Node *) req;
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+
+/*
+ * array_replace/array_remove support
+ *
+ * Find all array entries matching (not distinct from) search/search_isnull,
+ * and delete them if remove is true, else replace them with
+ * replace/replace_isnull. Comparisons are done using the specified
+ * collation. fcinfo is passed only for caching purposes.
+ */
+static ArrayType *
+array_replace_internal(ArrayType *array,
+ Datum search, bool search_isnull,
+ Datum replace, bool replace_isnull,
+ bool remove, Oid collation,
+ FunctionCallInfo fcinfo)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ ArrayType *result;
+ Oid element_type;
+ Datum *values;
+ bool *nulls;
+ int *dim;
+ int ndim;
+ int nitems,
+ nresult;
+ int i;
+ int32 nbytes = 0;
+ int32 dataoffset;
+ bool hasnulls;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ char *arraydataptr;
+ bits8 *bitmap;
+ int bitmask;
+ bool changed = false;
+ TypeCacheEntry *typentry;
+
+ element_type = ARR_ELEMTYPE(array);
+ ndim = ARR_NDIM(array);
+ dim = ARR_DIMS(array);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ /* Return input array unmodified if it is empty */
+ if (nitems <= 0)
+ return array;
+
+ /*
+ * We can't remove elements from multi-dimensional arrays, since the
+ * result might not be rectangular.
+ */
+ if (remove && ndim > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("removing elements from multidimensional arrays is not supported")));
+
+ /*
+ * We arrange to look up the equality function only once per series of
+ * calls, assuming the element type doesn't change underneath us.
+ */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_EQ_OPR_FINFO);
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * Detoast values if they are toasted. The replacement value must be
+ * detoasted for insertion into the result array, while detoasting the
+ * search value only once saves cycles.
+ */
+ if (typlen == -1)
+ {
+ if (!search_isnull)
+ search = PointerGetDatum(PG_DETOAST_DATUM(search));
+ if (!replace_isnull)
+ replace = PointerGetDatum(PG_DETOAST_DATUM(replace));
+ }
+
+ /* Prepare to apply the comparison operator */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Allocate temporary arrays for new values */
+ values = (Datum *) palloc(nitems * sizeof(Datum));
+ nulls = (bool *) palloc(nitems * sizeof(bool));
+
+ /* Loop over source data */
+ arraydataptr = ARR_DATA_PTR(array);
+ bitmap = ARR_NULLBITMAP(array);
+ bitmask = 1;
+ hasnulls = false;
+ nresult = 0;
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum elt;
+ bool isNull;
+ bool oprresult;
+ bool skip = false;
+
+ /* Get source element, checking for NULL */
+ if (bitmap && (*bitmap & bitmask) == 0)
+ {
+ isNull = true;
+ /* If searching for NULL, we have a match */
+ if (search_isnull)
+ {
+ if (remove)
+ {
+ skip = true;
+ changed = true;
+ }
+ else if (!replace_isnull)
+ {
+ values[nresult] = replace;
+ isNull = false;
+ changed = true;
+ }
+ }
+ }
+ else
+ {
+ isNull = false;
+ elt = fetch_att(arraydataptr, typbyval, typlen);
+ arraydataptr = att_addlength_datum(arraydataptr, typlen, elt);
+ arraydataptr = (char *) att_align_nominal(arraydataptr, typalign);
+
+ if (search_isnull)
+ {
+ /* no match possible, keep element */
+ values[nresult] = elt;
+ }
+ else
+ {
+ /*
+ * Apply the operator to the element pair; treat NULL as false
+ */
+ locfcinfo->args[0].value = elt;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = search;
+ locfcinfo->args[1].isnull = false;
+ locfcinfo->isnull = false;
+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+ if (locfcinfo->isnull || !oprresult)
+ {
+ /* no match, keep element */
+ values[nresult] = elt;
+ }
+ else
+ {
+ /* match, so replace or delete */
+ changed = true;
+ if (remove)
+ skip = true;
+ else
+ {
+ values[nresult] = replace;
+ isNull = replace_isnull;
+ }
+ }
+ }
+ }
+
+ if (!skip)
+ {
+ nulls[nresult] = isNull;
+ if (isNull)
+ hasnulls = true;
+ else
+ {
+ /* Update total result size */
+ nbytes = att_addlength_datum(nbytes, typlen, values[nresult]);
+ nbytes = att_align_nominal(nbytes, typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+ nresult++;
+ }
+
+ /* advance bitmap pointer if any */
+ if (bitmap)
+ {
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ bitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+
+ /*
+ * If not changed just return the original array
+ */
+ if (!changed)
+ {
+ pfree(values);
+ pfree(nulls);
+ return array;
+ }
+
+ /* If all elements were removed return an empty array */
+ if (nresult == 0)
+ {
+ pfree(values);
+ pfree(nulls);
+ return construct_empty_array(element_type);
+ }
+
+ /* Allocate and initialize the result array */
+ if (hasnulls)
+ {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nresult);
+ nbytes += dataoffset;
+ }
+ else
+ {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndim;
+ result->dataoffset = dataoffset;
+ result->elemtype = element_type;
+ memcpy(ARR_DIMS(result), ARR_DIMS(array), ndim * sizeof(int));
+ memcpy(ARR_LBOUND(result), ARR_LBOUND(array), ndim * sizeof(int));
+
+ if (remove)
+ {
+ /* Adjust the result length */
+ ARR_DIMS(result)[0] = nresult;
+ }
+
+ /* Insert data into result array */
+ CopyArrayEls(result,
+ values, nulls, nresult,
+ typlen, typbyval, typalign,
+ false);
+
+ pfree(values);
+ pfree(nulls);
+
+ return result;
+}
+
+/*
+ * Remove any occurrences of an element from an array
+ *
+ * If used on a multi-dimensional array this will raise an error.
+ */
+Datum
+array_remove(PG_FUNCTION_ARGS)
+{
+ ArrayType *array;
+ Datum search = PG_GETARG_DATUM(1);
+ bool search_isnull = PG_ARGISNULL(1);
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ array = array_replace_internal(array,
+ search, search_isnull,
+ (Datum) 0, true,
+ true, PG_GET_COLLATION(),
+ fcinfo);
+ PG_RETURN_ARRAYTYPE_P(array);
+}
+
+/*
+ * Replace any occurrences of an element in an array
+ */
+Datum
+array_replace(PG_FUNCTION_ARGS)
+{
+ ArrayType *array;
+ Datum search = PG_GETARG_DATUM(1);
+ bool search_isnull = PG_ARGISNULL(1);
+ Datum replace = PG_GETARG_DATUM(2);
+ bool replace_isnull = PG_ARGISNULL(2);
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ array = array_replace_internal(array,
+ search, search_isnull,
+ replace, replace_isnull,
+ false, PG_GET_COLLATION(),
+ fcinfo);
+ PG_RETURN_ARRAYTYPE_P(array);
+}
+
+/*
+ * Implements width_bucket(anyelement, anyarray).
+ *
+ * 'thresholds' is an array containing lower bound values for each bucket;
+ * these must be sorted from smallest to largest, or bogus results will be
+ * produced. If N thresholds are supplied, the output is from 0 to N:
+ * 0 is for inputs < first threshold, N is for inputs >= last threshold.
+ */
+Datum
+width_bucket_array(PG_FUNCTION_ARGS)
+{
+ Datum operand = PG_GETARG_DATUM(0);
+ ArrayType *thresholds = PG_GETARG_ARRAYTYPE_P(1);
+ Oid collation = PG_GET_COLLATION();
+ Oid element_type = ARR_ELEMTYPE(thresholds);
+ int result;
+
+ /* Check input */
+ if (ARR_NDIM(thresholds) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("thresholds must be one-dimensional array")));
+
+ if (array_contains_nulls(thresholds))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("thresholds array must not contain NULLs")));
+
+ /* We have a dedicated implementation for float8 data */
+ if (element_type == FLOAT8OID)
+ result = width_bucket_array_float8(operand, thresholds);
+ else
+ {
+ TypeCacheEntry *typentry;
+
+ /* Cache information about the input type */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL ||
+ typentry->type_id != element_type)
+ {
+ typentry = lookup_type_cache(element_type,
+ TYPECACHE_CMP_PROC_FINFO);
+ if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a comparison function for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+
+ /*
+ * We have separate implementation paths for fixed- and variable-width
+ * types, since indexing the array is a lot cheaper in the first case.
+ */
+ if (typentry->typlen > 0)
+ result = width_bucket_array_fixed(operand, thresholds,
+ collation, typentry);
+ else
+ result = width_bucket_array_variable(operand, thresholds,
+ collation, typentry);
+ }
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(thresholds, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * width_bucket_array for float8 data.
+ */
+static int
+width_bucket_array_float8(Datum operand, ArrayType *thresholds)
+{
+ float8 op = DatumGetFloat8(operand);
+ float8 *thresholds_data;
+ int left;
+ int right;
+
+ /*
+ * Since we know the array contains no NULLs, we can just index it
+ * directly.
+ */
+ thresholds_data = (float8 *) ARR_DATA_PTR(thresholds);
+
+ left = 0;
+ right = ArrayGetNItems(ARR_NDIM(thresholds), ARR_DIMS(thresholds));
+
+ /*
+ * If the probe value is a NaN, it's greater than or equal to all possible
+ * threshold values (including other NaNs), so we need not search. Note
+ * that this would give the same result as searching even if the array
+ * contains multiple NaNs (as long as they're correctly sorted), since the
+ * loop logic will find the rightmost of multiple equal threshold values.
+ */
+ if (isnan(op))
+ return right;
+
+ /* Find the bucket */
+ while (left < right)
+ {
+ int mid = (left + right) / 2;
+
+ if (isnan(thresholds_data[mid]) || op < thresholds_data[mid])
+ right = mid;
+ else
+ left = mid + 1;
+ }
+
+ return left;
+}
+
+/*
+ * width_bucket_array for generic fixed-width data types.
+ */
+static int
+width_bucket_array_fixed(Datum operand,
+ ArrayType *thresholds,
+ Oid collation,
+ TypeCacheEntry *typentry)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ char *thresholds_data;
+ int typlen = typentry->typlen;
+ bool typbyval = typentry->typbyval;
+ int left;
+ int right;
+
+ /*
+ * Since we know the array contains no NULLs, we can just index it
+ * directly.
+ */
+ thresholds_data = (char *) ARR_DATA_PTR(thresholds);
+
+ InitFunctionCallInfoData(*locfcinfo, &typentry->cmp_proc_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Find the bucket */
+ left = 0;
+ right = ArrayGetNItems(ARR_NDIM(thresholds), ARR_DIMS(thresholds));
+ while (left < right)
+ {
+ int mid = (left + right) / 2;
+ char *ptr;
+ int32 cmpresult;
+
+ ptr = thresholds_data + mid * typlen;
+
+ locfcinfo->args[0].value = operand;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = fetch_att(ptr, typbyval, typlen);
+ locfcinfo->args[1].isnull = false;
+
+ cmpresult = DatumGetInt32(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect comparison support functions to return null */
+ Assert(!locfcinfo->isnull);
+
+ if (cmpresult < 0)
+ right = mid;
+ else
+ left = mid + 1;
+ }
+
+ return left;
+}
+
+/*
+ * width_bucket_array for generic variable-width data types.
+ */
+static int
+width_bucket_array_variable(Datum operand,
+ ArrayType *thresholds,
+ Oid collation,
+ TypeCacheEntry *typentry)
+{
+ LOCAL_FCINFO(locfcinfo, 2);
+ char *thresholds_data;
+ int typlen = typentry->typlen;
+ bool typbyval = typentry->typbyval;
+ char typalign = typentry->typalign;
+ int left;
+ int right;
+
+ thresholds_data = (char *) ARR_DATA_PTR(thresholds);
+
+ InitFunctionCallInfoData(*locfcinfo, &typentry->cmp_proc_finfo, 2,
+ collation, NULL, NULL);
+
+ /* Find the bucket */
+ left = 0;
+ right = ArrayGetNItems(ARR_NDIM(thresholds), ARR_DIMS(thresholds));
+ while (left < right)
+ {
+ int mid = (left + right) / 2;
+ char *ptr;
+ int i;
+ int32 cmpresult;
+
+ /* Locate mid'th array element by advancing from left element */
+ ptr = thresholds_data;
+ for (i = left; i < mid; i++)
+ {
+ ptr = att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ }
+
+ locfcinfo->args[0].value = operand;
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = fetch_att(ptr, typbyval, typlen);
+ locfcinfo->args[1].isnull = false;
+
+ cmpresult = DatumGetInt32(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect comparison support functions to return null */
+ Assert(!locfcinfo->isnull);
+
+ if (cmpresult < 0)
+ right = mid;
+ else
+ {
+ left = mid + 1;
+
+ /*
+ * Move the thresholds pointer to match new "left" index, so we
+ * don't have to seek over those elements again. This trick
+ * ensures we do only O(N) array indexing work, not O(N^2).
+ */
+ ptr = att_addlength_pointer(ptr, typlen, ptr);
+ thresholds_data = (char *) att_align_nominal(ptr, typalign);
+ }
+ }
+
+ return left;
+}
+
+/*
+ * Trim the last N elements from an array by building an appropriate slice.
+ * Only the first dimension is trimmed.
+ */
+Datum
+trim_array(PG_FUNCTION_ARGS)
+{
+ ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
+ int n = PG_GETARG_INT32(1);
+ int array_length = (ARR_NDIM(v) > 0) ? ARR_DIMS(v)[0] : 0;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ int lower[MAXDIM];
+ int upper[MAXDIM];
+ bool lowerProvided[MAXDIM];
+ bool upperProvided[MAXDIM];
+ Datum result;
+
+ /* Per spec, throw an error if out of bounds */
+ if (n < 0 || n > array_length)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("number of elements to trim must be between 0 and %d",
+ array_length)));
+
+ /* Set all the bounds as unprovided except the first upper bound */
+ memset(lowerProvided, false, sizeof(lowerProvided));
+ memset(upperProvided, false, sizeof(upperProvided));
+ if (ARR_NDIM(v) > 0)
+ {
+ upper[0] = ARR_LBOUND(v)[0] + array_length - n - 1;
+ upperProvided[0] = true;
+ }
+
+ /* Fetch the needed information about the element type */
+ get_typlenbyvalalign(ARR_ELEMTYPE(v), &elmlen, &elmbyval, &elmalign);
+
+ /* Get the slice */
+ result = array_get_slice(PointerGetDatum(v), 1,
+ upper, lower, upperProvided, lowerProvided,
+ -1, elmlen, elmbyval, elmalign);
+
+ PG_RETURN_DATUM(result);
+}
diff --git a/src/backend/utils/adt/arraysubs.c b/src/backend/utils/adt/arraysubs.c
new file mode 100644
index 0000000..11db1af
--- /dev/null
+++ b/src/backend/utils/adt/arraysubs.c
@@ -0,0 +1,577 @@
+/*-------------------------------------------------------------------------
+ *
+ * arraysubs.c
+ * Subscripting support functions for arrays.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/arraysubs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "executor/execExpr.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/subscripting.h"
+#include "parser/parse_coerce.h"
+#include "parser/parse_expr.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+
+
+/* SubscriptingRefState.workspace for array subscripting execution */
+typedef struct ArraySubWorkspace
+{
+ /* Values determined during expression compilation */
+ Oid refelemtype; /* OID of the array element type */
+ int16 refattrlength; /* typlen of array type */
+ int16 refelemlength; /* typlen of the array element type */
+ bool refelembyval; /* is the element type pass-by-value? */
+ char refelemalign; /* typalign of the element type */
+
+ /*
+ * Subscript values converted to integers. Note that these arrays must be
+ * of length MAXDIM even when dealing with fewer subscripts, because
+ * array_get/set_slice may scribble on the extra entries.
+ */
+ int upperindex[MAXDIM];
+ int lowerindex[MAXDIM];
+} ArraySubWorkspace;
+
+
+/*
+ * Finish parse analysis of a SubscriptingRef expression for an array.
+ *
+ * Transform the subscript expressions, coerce them to integers,
+ * and determine the result type of the SubscriptingRef node.
+ */
+static void
+array_subscript_transform(SubscriptingRef *sbsref,
+ List *indirection,
+ ParseState *pstate,
+ bool isSlice,
+ bool isAssignment)
+{
+ List *upperIndexpr = NIL;
+ List *lowerIndexpr = NIL;
+ ListCell *idx;
+
+ /*
+ * Transform the subscript expressions, and separate upper and lower
+ * bounds into two lists.
+ *
+ * If we have a container slice expression, we convert any non-slice
+ * indirection items to slices by treating the single subscript as the
+ * upper bound and supplying an assumed lower bound of 1.
+ */
+ foreach(idx, indirection)
+ {
+ A_Indices *ai = lfirst_node(A_Indices, idx);
+ Node *subexpr;
+
+ if (isSlice)
+ {
+ if (ai->lidx)
+ {
+ subexpr = transformExpr(pstate, ai->lidx, pstate->p_expr_kind);
+ /* If it's not int4 already, try to coerce */
+ subexpr = coerce_to_target_type(pstate,
+ subexpr, exprType(subexpr),
+ INT4OID, -1,
+ COERCION_ASSIGNMENT,
+ COERCE_IMPLICIT_CAST,
+ -1);
+ if (subexpr == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("array subscript must have type integer"),
+ parser_errposition(pstate, exprLocation(ai->lidx))));
+ }
+ else if (!ai->is_slice)
+ {
+ /* Make a constant 1 */
+ subexpr = (Node *) makeConst(INT4OID,
+ -1,
+ InvalidOid,
+ sizeof(int32),
+ Int32GetDatum(1),
+ false,
+ true); /* pass by value */
+ }
+ else
+ {
+ /* Slice with omitted lower bound, put NULL into the list */
+ subexpr = NULL;
+ }
+ lowerIndexpr = lappend(lowerIndexpr, subexpr);
+ }
+ else
+ Assert(ai->lidx == NULL && !ai->is_slice);
+
+ if (ai->uidx)
+ {
+ subexpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
+ /* If it's not int4 already, try to coerce */
+ subexpr = coerce_to_target_type(pstate,
+ subexpr, exprType(subexpr),
+ INT4OID, -1,
+ COERCION_ASSIGNMENT,
+ COERCE_IMPLICIT_CAST,
+ -1);
+ if (subexpr == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("array subscript must have type integer"),
+ parser_errposition(pstate, exprLocation(ai->uidx))));
+ }
+ else
+ {
+ /* Slice with omitted upper bound, put NULL into the list */
+ Assert(isSlice && ai->is_slice);
+ subexpr = NULL;
+ }
+ upperIndexpr = lappend(upperIndexpr, subexpr);
+ }
+
+ /* ... and store the transformed lists into the SubscriptRef node */
+ sbsref->refupperindexpr = upperIndexpr;
+ sbsref->reflowerindexpr = lowerIndexpr;
+
+ /* Verify subscript list lengths are within implementation limit */
+ if (list_length(upperIndexpr) > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ list_length(upperIndexpr), MAXDIM)));
+ /* We need not check lowerIndexpr separately */
+
+ /*
+ * Determine the result type of the subscripting operation. It's the same
+ * as the array type if we're slicing, else it's the element type. In
+ * either case, the typmod is the same as the array's, so we need not
+ * change reftypmod.
+ */
+ if (isSlice)
+ sbsref->refrestype = sbsref->refcontainertype;
+ else
+ sbsref->refrestype = sbsref->refelemtype;
+}
+
+/*
+ * During execution, process the subscripts in a SubscriptingRef expression.
+ *
+ * The subscript expressions are already evaluated in Datum form in the
+ * SubscriptingRefState's arrays. Check and convert them as necessary.
+ *
+ * If any subscript is NULL, we throw error in assignment cases, or in fetch
+ * cases set result to NULL and return false (instructing caller to skip the
+ * rest of the SubscriptingRef sequence).
+ *
+ * We convert all the subscripts to plain integers and save them in the
+ * sbsrefstate->workspace arrays.
+ */
+static bool
+array_subscript_check_subscripts(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref_subscript.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+
+ /* Process upper subscripts */
+ for (int i = 0; i < sbsrefstate->numupper; i++)
+ {
+ if (sbsrefstate->upperprovided[i])
+ {
+ /* If any index expr yields NULL, result is NULL or error */
+ if (sbsrefstate->upperindexnull[i])
+ {
+ if (sbsrefstate->isassignment)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("array subscript in assignment must not be null")));
+ *op->resnull = true;
+ return false;
+ }
+ workspace->upperindex[i] = DatumGetInt32(sbsrefstate->upperindex[i]);
+ }
+ }
+
+ /* Likewise for lower subscripts */
+ for (int i = 0; i < sbsrefstate->numlower; i++)
+ {
+ if (sbsrefstate->lowerprovided[i])
+ {
+ /* If any index expr yields NULL, result is NULL or error */
+ if (sbsrefstate->lowerindexnull[i])
+ {
+ if (sbsrefstate->isassignment)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("array subscript in assignment must not be null")));
+ *op->resnull = true;
+ return false;
+ }
+ workspace->lowerindex[i] = DatumGetInt32(sbsrefstate->lowerindex[i]);
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Evaluate SubscriptingRef fetch for an array element.
+ *
+ * Source container is in step's result variable (it's known not NULL, since
+ * we set fetch_strict to true), and indexes have already been evaluated into
+ * workspace array.
+ */
+static void
+array_subscript_fetch(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+
+ /* Should not get here if source array (or any subscript) is null */
+ Assert(!(*op->resnull));
+
+ *op->resvalue = array_get_element(*op->resvalue,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign,
+ op->resnull);
+}
+
+/*
+ * Evaluate SubscriptingRef fetch for an array slice.
+ *
+ * Source container is in step's result variable (it's known not NULL, since
+ * we set fetch_strict to true), and indexes have already been evaluated into
+ * workspace array.
+ */
+static void
+array_subscript_fetch_slice(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+
+ /* Should not get here if source array (or any subscript) is null */
+ Assert(!(*op->resnull));
+
+ *op->resvalue = array_get_slice(*op->resvalue,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ workspace->lowerindex,
+ sbsrefstate->upperprovided,
+ sbsrefstate->lowerprovided,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign);
+ /* The slice is never NULL, so no need to change *op->resnull */
+}
+
+/*
+ * Evaluate SubscriptingRef assignment for an array element assignment.
+ *
+ * Input container (possibly null) is in result area, replacement value is in
+ * SubscriptingRefState's replacevalue/replacenull.
+ */
+static void
+array_subscript_assign(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+ Datum arraySource = *op->resvalue;
+
+ /*
+ * For an assignment to a fixed-length array type, both the original array
+ * and the value to be assigned into it must be non-NULL, else we punt and
+ * return the original array.
+ */
+ if (workspace->refattrlength > 0)
+ {
+ if (*op->resnull || sbsrefstate->replacenull)
+ return;
+ }
+
+ /*
+ * For assignment to varlena arrays, we handle a NULL original array by
+ * substituting an empty (zero-dimensional) array; insertion of the new
+ * element will result in a singleton array value. It does not matter
+ * whether the new element is NULL.
+ */
+ if (*op->resnull)
+ {
+ arraySource = PointerGetDatum(construct_empty_array(workspace->refelemtype));
+ *op->resnull = false;
+ }
+
+ *op->resvalue = array_set_element(arraySource,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ sbsrefstate->replacevalue,
+ sbsrefstate->replacenull,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign);
+ /* The result is never NULL, so no need to change *op->resnull */
+}
+
+/*
+ * Evaluate SubscriptingRef assignment for an array slice assignment.
+ *
+ * Input container (possibly null) is in result area, replacement value is in
+ * SubscriptingRefState's replacevalue/replacenull.
+ */
+static void
+array_subscript_assign_slice(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+ Datum arraySource = *op->resvalue;
+
+ /*
+ * For an assignment to a fixed-length array type, both the original array
+ * and the value to be assigned into it must be non-NULL, else we punt and
+ * return the original array.
+ */
+ if (workspace->refattrlength > 0)
+ {
+ if (*op->resnull || sbsrefstate->replacenull)
+ return;
+ }
+
+ /*
+ * For assignment to varlena arrays, we handle a NULL original array by
+ * substituting an empty (zero-dimensional) array; insertion of the new
+ * element will result in a singleton array value. It does not matter
+ * whether the new element is NULL.
+ */
+ if (*op->resnull)
+ {
+ arraySource = PointerGetDatum(construct_empty_array(workspace->refelemtype));
+ *op->resnull = false;
+ }
+
+ *op->resvalue = array_set_slice(arraySource,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ workspace->lowerindex,
+ sbsrefstate->upperprovided,
+ sbsrefstate->lowerprovided,
+ sbsrefstate->replacevalue,
+ sbsrefstate->replacenull,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign);
+ /* The result is never NULL, so no need to change *op->resnull */
+}
+
+/*
+ * Compute old array element value for a SubscriptingRef assignment
+ * expression. Will only be called if the new-value subexpression
+ * contains SubscriptingRef or FieldStore. This is the same as the
+ * regular fetch case, except that we have to handle a null array,
+ * and the value should be stored into the SubscriptingRefState's
+ * prevvalue/prevnull fields.
+ */
+static void
+array_subscript_fetch_old(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+
+ if (*op->resnull)
+ {
+ /* whole array is null, so any element is too */
+ sbsrefstate->prevvalue = (Datum) 0;
+ sbsrefstate->prevnull = true;
+ }
+ else
+ sbsrefstate->prevvalue = array_get_element(*op->resvalue,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign,
+ &sbsrefstate->prevnull);
+}
+
+/*
+ * Compute old array slice value for a SubscriptingRef assignment
+ * expression. Will only be called if the new-value subexpression
+ * contains SubscriptingRef or FieldStore. This is the same as the
+ * regular fetch case, except that we have to handle a null array,
+ * and the value should be stored into the SubscriptingRefState's
+ * prevvalue/prevnull fields.
+ *
+ * Note: this is presently dead code, because the new value for a
+ * slice would have to be an array, so it couldn't directly contain a
+ * FieldStore; nor could it contain a SubscriptingRef assignment, since
+ * we consider adjacent subscripts to index one multidimensional array
+ * not nested array types. Future generalizations might make this
+ * reachable, however.
+ */
+static void
+array_subscript_fetch_old_slice(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ ArraySubWorkspace *workspace = (ArraySubWorkspace *) sbsrefstate->workspace;
+
+ if (*op->resnull)
+ {
+ /* whole array is null, so any slice is too */
+ sbsrefstate->prevvalue = (Datum) 0;
+ sbsrefstate->prevnull = true;
+ }
+ else
+ {
+ sbsrefstate->prevvalue = array_get_slice(*op->resvalue,
+ sbsrefstate->numupper,
+ workspace->upperindex,
+ workspace->lowerindex,
+ sbsrefstate->upperprovided,
+ sbsrefstate->lowerprovided,
+ workspace->refattrlength,
+ workspace->refelemlength,
+ workspace->refelembyval,
+ workspace->refelemalign);
+ /* slices of non-null arrays are never null */
+ sbsrefstate->prevnull = false;
+ }
+}
+
+/*
+ * Set up execution state for an array subscript operation.
+ */
+static void
+array_exec_setup(const SubscriptingRef *sbsref,
+ SubscriptingRefState *sbsrefstate,
+ SubscriptExecSteps *methods)
+{
+ bool is_slice = (sbsrefstate->numlower != 0);
+ ArraySubWorkspace *workspace;
+
+ /*
+ * Enforce the implementation limit on number of array subscripts. This
+ * check isn't entirely redundant with checking at parse time; conceivably
+ * the expression was stored by a backend with a different MAXDIM value.
+ */
+ if (sbsrefstate->numupper > MAXDIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
+ sbsrefstate->numupper, MAXDIM)));
+
+ /* Should be impossible if parser is sane, but check anyway: */
+ if (sbsrefstate->numlower != 0 &&
+ sbsrefstate->numupper != sbsrefstate->numlower)
+ elog(ERROR, "upper and lower index lists are not same length");
+
+ /*
+ * Allocate type-specific workspace.
+ */
+ workspace = (ArraySubWorkspace *) palloc(sizeof(ArraySubWorkspace));
+ sbsrefstate->workspace = workspace;
+
+ /*
+ * Collect datatype details we'll need at execution.
+ */
+ workspace->refelemtype = sbsref->refelemtype;
+ workspace->refattrlength = get_typlen(sbsref->refcontainertype);
+ get_typlenbyvalalign(sbsref->refelemtype,
+ &workspace->refelemlength,
+ &workspace->refelembyval,
+ &workspace->refelemalign);
+
+ /*
+ * Pass back pointers to appropriate step execution functions.
+ */
+ methods->sbs_check_subscripts = array_subscript_check_subscripts;
+ if (is_slice)
+ {
+ methods->sbs_fetch = array_subscript_fetch_slice;
+ methods->sbs_assign = array_subscript_assign_slice;
+ methods->sbs_fetch_old = array_subscript_fetch_old_slice;
+ }
+ else
+ {
+ methods->sbs_fetch = array_subscript_fetch;
+ methods->sbs_assign = array_subscript_assign;
+ methods->sbs_fetch_old = array_subscript_fetch_old;
+ }
+}
+
+/*
+ * array_subscript_handler
+ * Subscripting handler for standard varlena arrays.
+ *
+ * This should be used only for "true" array types, which have array headers
+ * as understood by the varlena array routines, and are referenced by the
+ * element type's pg_type.typarray field.
+ */
+Datum
+array_subscript_handler(PG_FUNCTION_ARGS)
+{
+ static const SubscriptRoutines sbsroutines = {
+ .transform = array_subscript_transform,
+ .exec_setup = array_exec_setup,
+ .fetch_strict = true, /* fetch returns NULL for NULL inputs */
+ .fetch_leakproof = true, /* fetch returns NULL for bad subscript */
+ .store_leakproof = false /* ... but assignment throws error */
+ };
+
+ PG_RETURN_POINTER(&sbsroutines);
+}
+
+/*
+ * raw_array_subscript_handler
+ * Subscripting handler for "raw" arrays.
+ *
+ * A "raw" array just contains N independent instances of the element type.
+ * Currently we require both the element type and the array type to be fixed
+ * length, but it wouldn't be too hard to relax that for the array type.
+ *
+ * As of now, all the support code is shared with standard varlena arrays.
+ * We may split those into separate code paths, but probably that would yield
+ * only marginal speedups. The main point of having a separate handler is
+ * so that pg_type.typsubscript clearly indicates the type's semantics.
+ */
+Datum
+raw_array_subscript_handler(PG_FUNCTION_ARGS)
+{
+ static const SubscriptRoutines sbsroutines = {
+ .transform = array_subscript_transform,
+ .exec_setup = array_exec_setup,
+ .fetch_strict = true, /* fetch returns NULL for NULL inputs */
+ .fetch_leakproof = true, /* fetch returns NULL for bad subscript */
+ .store_leakproof = false /* ... but assignment throws error */
+ };
+
+ PG_RETURN_POINTER(&sbsroutines);
+}
diff --git a/src/backend/utils/adt/arrayutils.c b/src/backend/utils/adt/arrayutils.c
new file mode 100644
index 0000000..fcdfde9
--- /dev/null
+++ b/src/backend/utils/adt/arrayutils.c
@@ -0,0 +1,259 @@
+/*-------------------------------------------------------------------------
+ *
+ * arrayutils.c
+ * This file contains some support routines required for array functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/arrayutils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+
+
+/*
+ * Convert subscript list into linear element number (from 0)
+ *
+ * We assume caller has already range-checked the dimensions and subscripts,
+ * so no overflow is possible.
+ */
+int
+ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)
+{
+ int i,
+ scale = 1,
+ offset = 0;
+
+ for (i = n - 1; i >= 0; i--)
+ {
+ offset += (indx[i] - lb[i]) * scale;
+ scale *= dim[i];
+ }
+ return offset;
+}
+
+/*
+ * Same, but subscripts are assumed 0-based, and use a scale array
+ * instead of raw dimension data (see mda_get_prod to create scale array)
+ */
+int
+ArrayGetOffset0(int n, const int *tup, const int *scale)
+{
+ int i,
+ lin = 0;
+
+ for (i = 0; i < n; i++)
+ lin += tup[i] * scale[i];
+ return lin;
+}
+
+/*
+ * Convert array dimensions into number of elements
+ *
+ * This must do overflow checking, since it is used to validate that a user
+ * dimensionality request doesn't overflow what we can handle.
+ *
+ * The multiplication overflow check only works on machines that have int64
+ * arithmetic, but that is nearly all platforms these days, and doing check
+ * divides for those that don't seems way too expensive.
+ */
+int
+ArrayGetNItems(int ndim, const int *dims)
+{
+ int32 ret;
+ int i;
+
+ if (ndim <= 0)
+ return 0;
+ ret = 1;
+ for (i = 0; i < ndim; i++)
+ {
+ int64 prod;
+
+ /* A negative dimension implies that UB-LB overflowed ... */
+ if (dims[i] < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+
+ prod = (int64) ret * (int64) dims[i];
+
+ ret = (int32) prod;
+ if ((int64) ret != prod)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ }
+ Assert(ret >= 0);
+ if ((Size) ret > MaxArraySize)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxArraySize)));
+ return (int) ret;
+}
+
+/*
+ * Verify sanity of proposed lower-bound values for an array
+ *
+ * The lower-bound values must not be so large as to cause overflow when
+ * calculating subscripts, e.g. lower bound 2147483640 with length 10
+ * must be disallowed. We actually insist that dims[i] + lb[i] be
+ * computable without overflow, meaning that an array with last subscript
+ * equal to INT_MAX will be disallowed.
+ *
+ * It is assumed that the caller already called ArrayGetNItems, so that
+ * overflowed (negative) dims[] values have been eliminated.
+ */
+void
+ArrayCheckBounds(int ndim, const int *dims, const int *lb)
+{
+ int i;
+
+ for (i = 0; i < ndim; i++)
+ {
+ /* PG_USED_FOR_ASSERTS_ONLY prevents variable-isn't-read warnings */
+ int32 sum PG_USED_FOR_ASSERTS_ONLY;
+
+ if (pg_add_s32_overflow(dims[i], lb[i], &sum))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array lower bound is too large: %d",
+ lb[i])));
+ }
+}
+
+/*
+ * Compute ranges (sub-array dimensions) for an array slice
+ *
+ * We assume caller has validated slice endpoints, so overflow is impossible
+ */
+void
+mda_get_range(int n, int *span, const int *st, const int *endp)
+{
+ int i;
+
+ for (i = 0; i < n; i++)
+ span[i] = endp[i] - st[i] + 1;
+}
+
+/*
+ * Compute products of array dimensions, ie, scale factors for subscripts
+ *
+ * We assume caller has validated dimensions, so overflow is impossible
+ */
+void
+mda_get_prod(int n, const int *range, int *prod)
+{
+ int i;
+
+ prod[n - 1] = 1;
+ for (i = n - 2; i >= 0; i--)
+ prod[i] = prod[i + 1] * range[i + 1];
+}
+
+/*
+ * From products of whole-array dimensions and spans of a sub-array,
+ * compute offset distances needed to step through subarray within array
+ *
+ * We assume caller has validated dimensions, so overflow is impossible
+ */
+void
+mda_get_offset_values(int n, int *dist, const int *prod, const int *span)
+{
+ int i,
+ j;
+
+ dist[n - 1] = 0;
+ for (j = n - 2; j >= 0; j--)
+ {
+ dist[j] = prod[j] - 1;
+ for (i = j + 1; i < n; i++)
+ dist[j] -= (span[i] - 1) * prod[i];
+ }
+}
+
+/*
+ * Generates the tuple that is lexicographically one greater than the current
+ * n-tuple in "curr", with the restriction that the i-th element of "curr" is
+ * less than the i-th element of "span".
+ *
+ * Returns -1 if no next tuple exists, else the subscript position (0..n-1)
+ * corresponding to the dimension to advance along.
+ *
+ * We assume caller has validated dimensions, so overflow is impossible
+ */
+int
+mda_next_tuple(int n, int *curr, const int *span)
+{
+ int i;
+
+ if (n <= 0)
+ return -1;
+
+ curr[n - 1] = (curr[n - 1] + 1) % span[n - 1];
+ for (i = n - 1; i && curr[i] == 0; i--)
+ curr[i - 1] = (curr[i - 1] + 1) % span[i - 1];
+
+ if (i)
+ return i;
+ if (curr[0])
+ return 0;
+
+ return -1;
+}
+
+/*
+ * ArrayGetIntegerTypmods: verify that argument is a 1-D cstring array,
+ * and get the contents converted to integers. Returns a palloc'd array
+ * and places the length at *n.
+ */
+int32 *
+ArrayGetIntegerTypmods(ArrayType *arr, int *n)
+{
+ int32 *result;
+ Datum *elem_values;
+ int i;
+
+ if (ARR_ELEMTYPE(arr) != CSTRINGOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
+ errmsg("typmod array must be type cstring[]")));
+
+ if (ARR_NDIM(arr) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("typmod array must be one-dimensional")));
+
+ if (array_contains_nulls(arr))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("typmod array must not contain nulls")));
+
+ /* hardwired knowledge about cstring's representation details here */
+ deconstruct_array(arr, CSTRINGOID,
+ -2, false, TYPALIGN_CHAR,
+ &elem_values, NULL, n);
+
+ result = (int32 *) palloc(*n * sizeof(int32));
+
+ for (i = 0; i < *n; i++)
+ result[i] = pg_strtoint32(DatumGetCString(elem_values[i]));
+
+ pfree(elem_values);
+
+ return result;
+}
diff --git a/src/backend/utils/adt/ascii.c b/src/backend/utils/adt/ascii.c
new file mode 100644
index 0000000..54c36a7
--- /dev/null
+++ b/src/backend/utils/adt/ascii.c
@@ -0,0 +1,198 @@
+/*-----------------------------------------------------------------------
+ * ascii.c
+ * The PostgreSQL routine for string to ascii conversion.
+ *
+ * Portions Copyright (c) 1999-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/ascii.c
+ *
+ *-----------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "mb/pg_wchar.h"
+#include "utils/ascii.h"
+#include "utils/builtins.h"
+
+static void pg_to_ascii(unsigned char *src, unsigned char *src_end,
+ unsigned char *dest, int enc);
+static text *encode_to_ascii(text *data, int enc);
+
+
+/* ----------
+ * to_ascii
+ * ----------
+ */
+static void
+pg_to_ascii(unsigned char *src, unsigned char *src_end, unsigned char *dest, int enc)
+{
+ unsigned char *x;
+ const unsigned char *ascii;
+ int range;
+
+ /*
+ * relevant start for an encoding
+ */
+#define RANGE_128 128
+#define RANGE_160 160
+
+ if (enc == PG_LATIN1)
+ {
+ /*
+ * ISO-8859-1 <range: 160 -- 255>
+ */
+ ascii = (const unsigned char *) " cL Y \"Ca -R 'u ., ?AAAAAAACEEEEIIII NOOOOOxOUUUUYTBaaaaaaaceeeeiiii nooooo/ouuuuyty";
+ range = RANGE_160;
+ }
+ else if (enc == PG_LATIN2)
+ {
+ /*
+ * ISO-8859-2 <range: 160 -- 255>
+ */
+ ascii = (const unsigned char *) " A L LS \"SSTZ-ZZ a,l'ls ,sstz\"zzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTBraaaalccceeeeiiddnnoooo/ruuuuyt.";
+ range = RANGE_160;
+ }
+ else if (enc == PG_LATIN9)
+ {
+ /*
+ * ISO-8859-15 <range: 160 -- 255>
+ */
+ ascii = (const unsigned char *) " cL YS sCa -R Zu .z EeY?AAAAAAACEEEEIIII NOOOOOxOUUUUYTBaaaaaaaceeeeiiii nooooo/ouuuuyty";
+ range = RANGE_160;
+ }
+ else if (enc == PG_WIN1250)
+ {
+ /*
+ * Window CP1250 <range: 128 -- 255>
+ */
+ ascii = (const unsigned char *) " ' \" %S<STZZ `'\"\".-- s>stzz L A \"CS -RZ ,l'u .,as L\"lzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTBraaaalccceeeeiiddnnoooo/ruuuuyt ";
+ range = RANGE_128;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("encoding conversion from %s to ASCII not supported",
+ pg_encoding_to_char(enc))));
+ return; /* keep compiler quiet */
+ }
+
+ /*
+ * Encode
+ */
+ for (x = src; x < src_end; x++)
+ {
+ if (*x < 128)
+ *dest++ = *x;
+ else if (*x < range)
+ *dest++ = ' '; /* bogus 128 to 'range' */
+ else
+ *dest++ = ascii[*x - range];
+ }
+}
+
+/* ----------
+ * encode text
+ *
+ * The text datum is overwritten in-place, therefore this coding method
+ * cannot support conversions that change the string length!
+ * ----------
+ */
+static text *
+encode_to_ascii(text *data, int enc)
+{
+ pg_to_ascii((unsigned char *) VARDATA(data), /* src */
+ (unsigned char *) (data) + VARSIZE(data), /* src end */
+ (unsigned char *) VARDATA(data), /* dest */
+ enc); /* encoding */
+
+ return data;
+}
+
+/* ----------
+ * convert to ASCII - enc is set as 'name' arg.
+ * ----------
+ */
+Datum
+to_ascii_encname(PG_FUNCTION_ARGS)
+{
+ text *data = PG_GETARG_TEXT_P_COPY(0);
+ char *encname = NameStr(*PG_GETARG_NAME(1));
+ int enc = pg_char_to_encoding(encname);
+
+ if (enc < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("%s is not a valid encoding name", encname)));
+
+ PG_RETURN_TEXT_P(encode_to_ascii(data, enc));
+}
+
+/* ----------
+ * convert to ASCII - enc is set as int4
+ * ----------
+ */
+Datum
+to_ascii_enc(PG_FUNCTION_ARGS)
+{
+ text *data = PG_GETARG_TEXT_P_COPY(0);
+ int enc = PG_GETARG_INT32(1);
+
+ if (!PG_VALID_ENCODING(enc))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("%d is not a valid encoding code", enc)));
+
+ PG_RETURN_TEXT_P(encode_to_ascii(data, enc));
+}
+
+/* ----------
+ * convert to ASCII - current enc is DatabaseEncoding
+ * ----------
+ */
+Datum
+to_ascii_default(PG_FUNCTION_ARGS)
+{
+ text *data = PG_GETARG_TEXT_P_COPY(0);
+ int enc = GetDatabaseEncoding();
+
+ PG_RETURN_TEXT_P(encode_to_ascii(data, enc));
+}
+
+/* ----------
+ * Copy a string in an arbitrary backend-safe encoding, converting it to a
+ * valid ASCII string by replacing non-ASCII bytes with '?'. Otherwise the
+ * behavior is identical to strlcpy(), except that we don't bother with a
+ * return value.
+ *
+ * This must not trigger ereport(ERROR), as it is called in postmaster.
+ * ----------
+ */
+void
+ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz)
+{
+ if (destsiz == 0) /* corner case: no room for trailing nul */
+ return;
+
+ while (--destsiz > 0)
+ {
+ /* use unsigned char here to avoid compiler warning */
+ unsigned char ch = *src++;
+
+ if (ch == '\0')
+ break;
+ /* Keep printable ASCII characters */
+ if (32 <= ch && ch <= 127)
+ *dest = ch;
+ /* White-space is also OK */
+ else if (ch == '\n' || ch == '\r' || ch == '\t')
+ *dest = ch;
+ /* Everything else is replaced with '?' */
+ else
+ *dest = '?';
+ dest++;
+ }
+
+ *dest = '\0';
+}
diff --git a/src/backend/utils/adt/bool.c b/src/backend/utils/adt/bool.c
new file mode 100644
index 0000000..cd73352
--- /dev/null
+++ b/src/backend/utils/adt/bool.c
@@ -0,0 +1,404 @@
+/*-------------------------------------------------------------------------
+ *
+ * bool.c
+ * Functions for the built-in type "bool".
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/bool.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+
+/*
+ * Try to interpret value as boolean value. Valid values are: true,
+ * false, yes, no, on, off, 1, 0; as well as unique prefixes thereof.
+ * If the string parses okay, return true, else false.
+ * If okay and result is not NULL, return the value in *result.
+ */
+bool
+parse_bool(const char *value, bool *result)
+{
+ return parse_bool_with_len(value, strlen(value), result);
+}
+
+bool
+parse_bool_with_len(const char *value, size_t len, bool *result)
+{
+ switch (*value)
+ {
+ case 't':
+ case 'T':
+ if (pg_strncasecmp(value, "true", len) == 0)
+ {
+ if (result)
+ *result = true;
+ return true;
+ }
+ break;
+ case 'f':
+ case 'F':
+ if (pg_strncasecmp(value, "false", len) == 0)
+ {
+ if (result)
+ *result = false;
+ return true;
+ }
+ break;
+ case 'y':
+ case 'Y':
+ if (pg_strncasecmp(value, "yes", len) == 0)
+ {
+ if (result)
+ *result = true;
+ return true;
+ }
+ break;
+ case 'n':
+ case 'N':
+ if (pg_strncasecmp(value, "no", len) == 0)
+ {
+ if (result)
+ *result = false;
+ return true;
+ }
+ break;
+ case 'o':
+ case 'O':
+ /* 'o' is not unique enough */
+ if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0)
+ {
+ if (result)
+ *result = true;
+ return true;
+ }
+ else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0)
+ {
+ if (result)
+ *result = false;
+ return true;
+ }
+ break;
+ case '1':
+ if (len == 1)
+ {
+ if (result)
+ *result = true;
+ return true;
+ }
+ break;
+ case '0':
+ if (len == 1)
+ {
+ if (result)
+ *result = false;
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (result)
+ *result = false; /* suppress compiler warning */
+ return false;
+}
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+/*
+ * boolin - converts "t" or "f" to 1 or 0
+ *
+ * Check explicitly for "true/false" and TRUE/FALSE, 1/0, YES/NO, ON/OFF.
+ * Reject other values.
+ *
+ * In the switch statement, check the most-used possibilities first.
+ */
+Datum
+boolin(PG_FUNCTION_ARGS)
+{
+ const char *in_str = PG_GETARG_CSTRING(0);
+ const char *str;
+ size_t len;
+ bool result;
+
+ /*
+ * Skip leading and trailing whitespace
+ */
+ str = in_str;
+ while (isspace((unsigned char) *str))
+ str++;
+
+ len = strlen(str);
+ while (len > 0 && isspace((unsigned char) str[len - 1]))
+ len--;
+
+ if (parse_bool_with_len(str, len, &result))
+ PG_RETURN_BOOL(result);
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "boolean", in_str)));
+
+ /* not reached */
+ PG_RETURN_BOOL(false);
+}
+
+/*
+ * boolout - converts 1 or 0 to "t" or "f"
+ */
+Datum
+boolout(PG_FUNCTION_ARGS)
+{
+ bool b = PG_GETARG_BOOL(0);
+ char *result = (char *) palloc(2);
+
+ result[0] = (b) ? 't' : 'f';
+ result[1] = '\0';
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * boolrecv - converts external binary format to bool
+ *
+ * The external representation is one byte. Any nonzero value is taken
+ * as "true".
+ */
+Datum
+boolrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ int ext;
+
+ ext = pq_getmsgbyte(buf);
+ PG_RETURN_BOOL(ext != 0);
+}
+
+/*
+ * boolsend - converts bool to binary format
+ */
+Datum
+boolsend(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, arg1 ? 1 : 0);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * booltext - cast function for bool => text
+ *
+ * We need this because it's different from the behavior of boolout();
+ * this function follows the SQL-spec result (except for producing lower case)
+ */
+Datum
+booltext(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ const char *str;
+
+ if (arg1)
+ str = "true";
+ else
+ str = "false";
+
+ PG_RETURN_TEXT_P(cstring_to_text(str));
+}
+
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+Datum
+booleq(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+boolne(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+boollt(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+boolgt(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+boolle(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+boolge(PG_FUNCTION_ARGS)
+{
+ bool arg1 = PG_GETARG_BOOL(0);
+ bool arg2 = PG_GETARG_BOOL(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+/*
+ * boolean-and and boolean-or aggregates.
+ */
+
+/*
+ * Function for standard EVERY aggregate conforming to SQL 2003.
+ * The aggregate is also named bool_and for consistency.
+ *
+ * Note: this is only used in plain aggregate mode, not moving-aggregate mode.
+ */
+Datum
+booland_statefunc(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(PG_GETARG_BOOL(0) && PG_GETARG_BOOL(1));
+}
+
+/*
+ * Function for standard ANY/SOME aggregate conforming to SQL 2003.
+ * The aggregate is named bool_or, because ANY/SOME have parsing conflicts.
+ *
+ * Note: this is only used in plain aggregate mode, not moving-aggregate mode.
+ */
+Datum
+boolor_statefunc(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(PG_GETARG_BOOL(0) || PG_GETARG_BOOL(1));
+}
+
+typedef struct BoolAggState
+{
+ int64 aggcount; /* number of non-null values aggregated */
+ int64 aggtrue; /* number of values aggregated that are true */
+} BoolAggState;
+
+static BoolAggState *
+makeBoolAggState(FunctionCallInfo fcinfo)
+{
+ BoolAggState *state;
+ MemoryContext agg_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state = (BoolAggState *) MemoryContextAlloc(agg_context,
+ sizeof(BoolAggState));
+ state->aggcount = 0;
+ state->aggtrue = 0;
+
+ return state;
+}
+
+Datum
+bool_accum(PG_FUNCTION_ARGS)
+{
+ BoolAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (BoolAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on first call */
+ if (state == NULL)
+ state = makeBoolAggState(fcinfo);
+
+ if (!PG_ARGISNULL(1))
+ {
+ state->aggcount++;
+ if (PG_GETARG_BOOL(1))
+ state->aggtrue++;
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+bool_accum_inv(PG_FUNCTION_ARGS)
+{
+ BoolAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (BoolAggState *) PG_GETARG_POINTER(0);
+
+ /* bool_accum should have created the state data */
+ if (state == NULL)
+ elog(ERROR, "bool_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+ state->aggcount--;
+ if (PG_GETARG_BOOL(1))
+ state->aggtrue--;
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+bool_alltrue(PG_FUNCTION_ARGS)
+{
+ BoolAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (BoolAggState *) PG_GETARG_POINTER(0);
+
+ /* if there were no non-null values, return NULL */
+ if (state == NULL || state->aggcount == 0)
+ PG_RETURN_NULL();
+
+ /* true if all non-null values are true */
+ PG_RETURN_BOOL(state->aggtrue == state->aggcount);
+}
+
+Datum
+bool_anytrue(PG_FUNCTION_ARGS)
+{
+ BoolAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (BoolAggState *) PG_GETARG_POINTER(0);
+
+ /* if there were no non-null values, return NULL */
+ if (state == NULL || state->aggcount == 0)
+ PG_RETURN_NULL();
+
+ /* true if any non-null value is true */
+ PG_RETURN_BOOL(state->aggtrue > 0);
+}
diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c
new file mode 100644
index 0000000..f7e78fa
--- /dev/null
+++ b/src/backend/utils/adt/cash.c
@@ -0,0 +1,1175 @@
+/*
+ * cash.c
+ * Written by D'Arcy J.M. Cain
+ * darcy@druid.net
+ * http://www.druid.net/darcy/
+ *
+ * Functions to allow input and output of money normally but store
+ * and handle it as 64 bit ints
+ *
+ * A slightly modified version of this file and a discussion of the
+ * workings can be found in the book "Software Solutions in C" by
+ * Dale Schumacher, Academic Press, ISBN: 0-12-632360-7 except that
+ * this version handles 64 bit numbers and so can hold values up to
+ * $92,233,720,368,547,758.07.
+ *
+ * src/backend/utils/adt/cash.c
+ */
+
+#include "postgres.h"
+
+#include <limits.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "common/int.h"
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+#include "utils/cash.h"
+#include "utils/numeric.h"
+#include "utils/pg_locale.h"
+
+
+/*************************************************************************
+ * Private routines
+ ************************************************************************/
+
+static const char *
+num_word(Cash value)
+{
+ static char buf[128];
+ static const char *const small[] = {
+ "zero", "one", "two", "three", "four", "five", "six", "seven",
+ "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
+ "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty",
+ "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
+ };
+ const char *const *big = small + 18;
+ int tu = value % 100;
+
+ /* deal with the simple cases first */
+ if (value <= 20)
+ return small[value];
+
+ /* is it an even multiple of 100? */
+ if (!tu)
+ {
+ sprintf(buf, "%s hundred", small[value / 100]);
+ return buf;
+ }
+
+ /* more than 99? */
+ if (value > 99)
+ {
+ /* is it an even multiple of 10 other than 10? */
+ if (value % 10 == 0 && tu > 10)
+ sprintf(buf, "%s hundred %s",
+ small[value / 100], big[tu / 10]);
+ else if (tu < 20)
+ sprintf(buf, "%s hundred and %s",
+ small[value / 100], small[tu]);
+ else
+ sprintf(buf, "%s hundred %s %s",
+ small[value / 100], big[tu / 10], small[tu % 10]);
+ }
+ else
+ {
+ /* is it an even multiple of 10 other than 10? */
+ if (value % 10 == 0 && tu > 10)
+ sprintf(buf, "%s", big[tu / 10]);
+ else if (tu < 20)
+ sprintf(buf, "%s", small[tu]);
+ else
+ sprintf(buf, "%s %s", big[tu / 10], small[tu % 10]);
+ }
+
+ return buf;
+} /* num_word() */
+
+/* cash_in()
+ * Convert a string to a cash data type.
+ * Format is [$]###[,]###[.##]
+ * Examples: 123.45 $123.45 $123,456.78
+ *
+ */
+Datum
+cash_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ Cash result;
+ Cash value = 0;
+ Cash dec = 0;
+ Cash sgn = 1;
+ bool seen_dot = false;
+ const char *s = str;
+ int fpoint;
+ char dsymbol;
+ const char *ssymbol,
+ *psymbol,
+ *nsymbol,
+ *csymbol;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /*
+ * frac_digits will be CHAR_MAX in some locales, notably C. However, just
+ * testing for == CHAR_MAX is risky, because of compilers like gcc that
+ * "helpfully" let you alter the platform-standard definition of whether
+ * char is signed or not. If we are so unfortunate as to get compiled
+ * with a nonstandard -fsigned-char or -funsigned-char switch, then our
+ * idea of CHAR_MAX will not agree with libc's. The safest course is not
+ * to test for CHAR_MAX at all, but to impose a range check for plausible
+ * frac_digits values.
+ */
+ fpoint = lconvert->frac_digits;
+ if (fpoint < 0 || fpoint > 10)
+ fpoint = 2; /* best guess in this case, I think */
+
+ /* we restrict dsymbol to be a single byte, but not the other symbols */
+ if (*lconvert->mon_decimal_point != '\0' &&
+ lconvert->mon_decimal_point[1] == '\0')
+ dsymbol = *lconvert->mon_decimal_point;
+ else
+ dsymbol = '.';
+ if (*lconvert->mon_thousands_sep != '\0')
+ ssymbol = lconvert->mon_thousands_sep;
+ else /* ssymbol should not equal dsymbol */
+ ssymbol = (dsymbol != ',') ? "," : ".";
+ csymbol = (*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$";
+ psymbol = (*lconvert->positive_sign != '\0') ? lconvert->positive_sign : "+";
+ nsymbol = (*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-";
+
+#ifdef CASHDEBUG
+ printf("cashin- precision '%d'; decimal '%c'; thousands '%s'; currency '%s'; positive '%s'; negative '%s'\n",
+ fpoint, dsymbol, ssymbol, csymbol, psymbol, nsymbol);
+#endif
+
+ /* we need to add all sorts of checking here. For now just */
+ /* strip all leading whitespace and any leading currency symbol */
+ while (isspace((unsigned char) *s))
+ s++;
+ if (strncmp(s, csymbol, strlen(csymbol)) == 0)
+ s += strlen(csymbol);
+ while (isspace((unsigned char) *s))
+ s++;
+
+#ifdef CASHDEBUG
+ printf("cashin- string is '%s'\n", s);
+#endif
+
+ /* a leading minus or paren signifies a negative number */
+ /* again, better heuristics needed */
+ /* XXX - doesn't properly check for balanced parens - djmc */
+ if (strncmp(s, nsymbol, strlen(nsymbol)) == 0)
+ {
+ sgn = -1;
+ s += strlen(nsymbol);
+ }
+ else if (*s == '(')
+ {
+ sgn = -1;
+ s++;
+ }
+ else if (strncmp(s, psymbol, strlen(psymbol)) == 0)
+ s += strlen(psymbol);
+
+#ifdef CASHDEBUG
+ printf("cashin- string is '%s'\n", s);
+#endif
+
+ /* allow whitespace and currency symbol after the sign, too */
+ while (isspace((unsigned char) *s))
+ s++;
+ if (strncmp(s, csymbol, strlen(csymbol)) == 0)
+ s += strlen(csymbol);
+ while (isspace((unsigned char) *s))
+ s++;
+
+#ifdef CASHDEBUG
+ printf("cashin- string is '%s'\n", s);
+#endif
+
+ /*
+ * We accumulate the absolute amount in "value" and then apply the sign at
+ * the end. (The sign can appear before or after the digits, so it would
+ * be more complicated to do otherwise.) Because of the larger range of
+ * negative signed integers, we build "value" in the negative and then
+ * flip the sign at the end, catching most-negative-number overflow if
+ * necessary.
+ */
+
+ for (; *s; s++)
+ {
+ /*
+ * We look for digits as long as we have found less than the required
+ * number of decimal places.
+ */
+ if (isdigit((unsigned char) *s) && (!seen_dot || dec < fpoint))
+ {
+ int8 digit = *s - '0';
+
+ if (pg_mul_s64_overflow(value, 10, &value) ||
+ pg_sub_s64_overflow(value, digit, &value))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ str, "money")));
+
+ if (seen_dot)
+ dec++;
+ }
+ /* decimal point? then start counting fractions... */
+ else if (*s == dsymbol && !seen_dot)
+ {
+ seen_dot = true;
+ }
+ /* ignore if "thousands" separator, else we're done */
+ else if (strncmp(s, ssymbol, strlen(ssymbol)) == 0)
+ s += strlen(ssymbol) - 1;
+ else
+ break;
+ }
+
+ /* round off if there's another digit */
+ if (isdigit((unsigned char) *s) && *s >= '5')
+ {
+ /* remember we build the value in the negative */
+ if (pg_sub_s64_overflow(value, 1, &value))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ str, "money")));
+ }
+
+ /* adjust for less than required decimal places */
+ for (; dec < fpoint; dec++)
+ {
+ if (pg_mul_s64_overflow(value, 10, &value))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ str, "money")));
+ }
+
+ /*
+ * should only be trailing digits followed by whitespace, right paren,
+ * trailing sign, and/or trailing currency symbol
+ */
+ while (isdigit((unsigned char) *s))
+ s++;
+
+ while (*s)
+ {
+ if (isspace((unsigned char) *s) || *s == ')')
+ s++;
+ else if (strncmp(s, nsymbol, strlen(nsymbol)) == 0)
+ {
+ sgn = -1;
+ s += strlen(nsymbol);
+ }
+ else if (strncmp(s, psymbol, strlen(psymbol)) == 0)
+ s += strlen(psymbol);
+ else if (strncmp(s, csymbol, strlen(csymbol)) == 0)
+ s += strlen(csymbol);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "money", str)));
+ }
+
+ /*
+ * If the value is supposed to be positive, flip the sign, but check for
+ * the most negative number.
+ */
+ if (sgn > 0)
+ {
+ if (value == PG_INT64_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ str, "money")));
+ result = -value;
+ }
+ else
+ result = value;
+
+#ifdef CASHDEBUG
+ printf("cashin- result is " INT64_FORMAT "\n", result);
+#endif
+
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_out()
+ * Function to convert cash to a dollars and cents representation, using
+ * the lc_monetary locale's formatting.
+ */
+Datum
+cash_out(PG_FUNCTION_ARGS)
+{
+ Cash value = PG_GETARG_CASH(0);
+ char *result;
+ char buf[128];
+ char *bufptr;
+ int digit_pos;
+ int points,
+ mon_group;
+ char dsymbol;
+ const char *ssymbol,
+ *csymbol,
+ *signsymbol;
+ char sign_posn,
+ cs_precedes,
+ sep_by_space;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /* see comments about frac_digits in cash_in() */
+ points = lconvert->frac_digits;
+ if (points < 0 || points > 10)
+ points = 2; /* best guess in this case, I think */
+
+ /*
+ * As with frac_digits, must apply a range check to mon_grouping to avoid
+ * being fooled by variant CHAR_MAX values.
+ */
+ mon_group = *lconvert->mon_grouping;
+ if (mon_group <= 0 || mon_group > 6)
+ mon_group = 3;
+
+ /* we restrict dsymbol to be a single byte, but not the other symbols */
+ if (*lconvert->mon_decimal_point != '\0' &&
+ lconvert->mon_decimal_point[1] == '\0')
+ dsymbol = *lconvert->mon_decimal_point;
+ else
+ dsymbol = '.';
+ if (*lconvert->mon_thousands_sep != '\0')
+ ssymbol = lconvert->mon_thousands_sep;
+ else /* ssymbol should not equal dsymbol */
+ ssymbol = (dsymbol != ',') ? "," : ".";
+ csymbol = (*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$";
+
+ if (value < 0)
+ {
+ /* make the amount positive for digit-reconstruction loop */
+ value = -value;
+ /* set up formatting data */
+ signsymbol = (*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-";
+ sign_posn = lconvert->n_sign_posn;
+ cs_precedes = lconvert->n_cs_precedes;
+ sep_by_space = lconvert->n_sep_by_space;
+ }
+ else
+ {
+ signsymbol = lconvert->positive_sign;
+ sign_posn = lconvert->p_sign_posn;
+ cs_precedes = lconvert->p_cs_precedes;
+ sep_by_space = lconvert->p_sep_by_space;
+ }
+
+ /* we build the digits+decimal-point+sep string right-to-left in buf[] */
+ bufptr = buf + sizeof(buf) - 1;
+ *bufptr = '\0';
+
+ /*
+ * Generate digits till there are no non-zero digits left and we emitted
+ * at least one to the left of the decimal point. digit_pos is the
+ * current digit position, with zero as the digit just left of the decimal
+ * point, increasing to the right.
+ */
+ digit_pos = points;
+ do
+ {
+ if (points && digit_pos == 0)
+ {
+ /* insert decimal point, but not if value cannot be fractional */
+ *(--bufptr) = dsymbol;
+ }
+ else if (digit_pos < 0 && (digit_pos % mon_group) == 0)
+ {
+ /* insert thousands sep, but only to left of radix point */
+ bufptr -= strlen(ssymbol);
+ memcpy(bufptr, ssymbol, strlen(ssymbol));
+ }
+
+ *(--bufptr) = ((uint64) value % 10) + '0';
+ value = ((uint64) value) / 10;
+ digit_pos--;
+ } while (value || digit_pos >= 0);
+
+ /*----------
+ * Now, attach currency symbol and sign symbol in the correct order.
+ *
+ * The POSIX spec defines these values controlling this code:
+ *
+ * p/n_sign_posn:
+ * 0 Parentheses enclose the quantity and the currency_symbol.
+ * 1 The sign string precedes the quantity and the currency_symbol.
+ * 2 The sign string succeeds the quantity and the currency_symbol.
+ * 3 The sign string precedes the currency_symbol.
+ * 4 The sign string succeeds the currency_symbol.
+ *
+ * p/n_cs_precedes: 0 means currency symbol after value, else before it.
+ *
+ * p/n_sep_by_space:
+ * 0 No <space> separates the currency symbol and value.
+ * 1 If the currency symbol and sign string are adjacent, a <space>
+ * separates them from the value; otherwise, a <space> separates
+ * the currency symbol from the value.
+ * 2 If the currency symbol and sign string are adjacent, a <space>
+ * separates them; otherwise, a <space> separates the sign string
+ * from the value.
+ *----------
+ */
+ switch (sign_posn)
+ {
+ case 0:
+ if (cs_precedes)
+ result = psprintf("(%s%s%s)",
+ csymbol,
+ (sep_by_space == 1) ? " " : "",
+ bufptr);
+ else
+ result = psprintf("(%s%s%s)",
+ bufptr,
+ (sep_by_space == 1) ? " " : "",
+ csymbol);
+ break;
+ case 1:
+ default:
+ if (cs_precedes)
+ result = psprintf("%s%s%s%s%s",
+ signsymbol,
+ (sep_by_space == 2) ? " " : "",
+ csymbol,
+ (sep_by_space == 1) ? " " : "",
+ bufptr);
+ else
+ result = psprintf("%s%s%s%s%s",
+ signsymbol,
+ (sep_by_space == 2) ? " " : "",
+ bufptr,
+ (sep_by_space == 1) ? " " : "",
+ csymbol);
+ break;
+ case 2:
+ if (cs_precedes)
+ result = psprintf("%s%s%s%s%s",
+ csymbol,
+ (sep_by_space == 1) ? " " : "",
+ bufptr,
+ (sep_by_space == 2) ? " " : "",
+ signsymbol);
+ else
+ result = psprintf("%s%s%s%s%s",
+ bufptr,
+ (sep_by_space == 1) ? " " : "",
+ csymbol,
+ (sep_by_space == 2) ? " " : "",
+ signsymbol);
+ break;
+ case 3:
+ if (cs_precedes)
+ result = psprintf("%s%s%s%s%s",
+ signsymbol,
+ (sep_by_space == 2) ? " " : "",
+ csymbol,
+ (sep_by_space == 1) ? " " : "",
+ bufptr);
+ else
+ result = psprintf("%s%s%s%s%s",
+ bufptr,
+ (sep_by_space == 1) ? " " : "",
+ signsymbol,
+ (sep_by_space == 2) ? " " : "",
+ csymbol);
+ break;
+ case 4:
+ if (cs_precedes)
+ result = psprintf("%s%s%s%s%s",
+ csymbol,
+ (sep_by_space == 2) ? " " : "",
+ signsymbol,
+ (sep_by_space == 1) ? " " : "",
+ bufptr);
+ else
+ result = psprintf("%s%s%s%s%s",
+ bufptr,
+ (sep_by_space == 1) ? " " : "",
+ csymbol,
+ (sep_by_space == 2) ? " " : "",
+ signsymbol);
+ break;
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * cash_recv - converts external binary format to cash
+ */
+Datum
+cash_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_CASH((Cash) pq_getmsgint64(buf));
+}
+
+/*
+ * cash_send - converts cash to binary format
+ */
+Datum
+cash_send(PG_FUNCTION_ARGS)
+{
+ Cash arg1 = PG_GETARG_CASH(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * Comparison functions
+ */
+
+Datum
+cash_eq(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 == c2);
+}
+
+Datum
+cash_ne(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 != c2);
+}
+
+Datum
+cash_lt(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 < c2);
+}
+
+Datum
+cash_le(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 <= c2);
+}
+
+Datum
+cash_gt(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 > c2);
+}
+
+Datum
+cash_ge(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ PG_RETURN_BOOL(c1 >= c2);
+}
+
+Datum
+cash_cmp(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+
+ if (c1 > c2)
+ PG_RETURN_INT32(1);
+ else if (c1 == c2)
+ PG_RETURN_INT32(0);
+ else
+ PG_RETURN_INT32(-1);
+}
+
+
+/* cash_pl()
+ * Add two cash values.
+ */
+Datum
+cash_pl(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = c1 + c2;
+
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_mi()
+ * Subtract two cash values.
+ */
+Datum
+cash_mi(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = c1 - c2;
+
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_div_cash()
+ * Divide cash by cash, returning float8.
+ */
+Datum
+cash_div_cash(PG_FUNCTION_ARGS)
+{
+ Cash dividend = PG_GETARG_CASH(0);
+ Cash divisor = PG_GETARG_CASH(1);
+ float8 quotient;
+
+ if (divisor == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ quotient = (float8) dividend / (float8) divisor;
+ PG_RETURN_FLOAT8(quotient);
+}
+
+
+/* cash_mul_flt8()
+ * Multiply cash by float8.
+ */
+Datum
+cash_mul_flt8(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ float8 f = PG_GETARG_FLOAT8(1);
+ Cash result;
+
+ result = rint(c * f);
+ PG_RETURN_CASH(result);
+}
+
+
+/* flt8_mul_cash()
+ * Multiply float8 by cash.
+ */
+Datum
+flt8_mul_cash(PG_FUNCTION_ARGS)
+{
+ float8 f = PG_GETARG_FLOAT8(0);
+ Cash c = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = rint(f * c);
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_div_flt8()
+ * Divide cash by float8.
+ */
+Datum
+cash_div_flt8(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ float8 f = PG_GETARG_FLOAT8(1);
+ Cash result;
+
+ if (f == 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result = rint(c / f);
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_mul_flt4()
+ * Multiply cash by float4.
+ */
+Datum
+cash_mul_flt4(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ float4 f = PG_GETARG_FLOAT4(1);
+ Cash result;
+
+ result = rint(c * (float8) f);
+ PG_RETURN_CASH(result);
+}
+
+
+/* flt4_mul_cash()
+ * Multiply float4 by cash.
+ */
+Datum
+flt4_mul_cash(PG_FUNCTION_ARGS)
+{
+ float4 f = PG_GETARG_FLOAT4(0);
+ Cash c = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = rint((float8) f * c);
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_div_flt4()
+ * Divide cash by float4.
+ *
+ */
+Datum
+cash_div_flt4(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ float4 f = PG_GETARG_FLOAT4(1);
+ Cash result;
+
+ if (f == 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result = rint(c / (float8) f);
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_mul_int8()
+ * Multiply cash by int8.
+ */
+Datum
+cash_mul_int8(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int64 i = PG_GETARG_INT64(1);
+ Cash result;
+
+ result = c * i;
+ PG_RETURN_CASH(result);
+}
+
+
+/* int8_mul_cash()
+ * Multiply int8 by cash.
+ */
+Datum
+int8_mul_cash(PG_FUNCTION_ARGS)
+{
+ int64 i = PG_GETARG_INT64(0);
+ Cash c = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = i * c;
+ PG_RETURN_CASH(result);
+}
+
+/* cash_div_int8()
+ * Divide cash by 8-byte integer.
+ */
+Datum
+cash_div_int8(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int64 i = PG_GETARG_INT64(1);
+ Cash result;
+
+ if (i == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result = c / i;
+
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_mul_int4()
+ * Multiply cash by int4.
+ */
+Datum
+cash_mul_int4(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int32 i = PG_GETARG_INT32(1);
+ Cash result;
+
+ result = c * i;
+ PG_RETURN_CASH(result);
+}
+
+
+/* int4_mul_cash()
+ * Multiply int4 by cash.
+ */
+Datum
+int4_mul_cash(PG_FUNCTION_ARGS)
+{
+ int32 i = PG_GETARG_INT32(0);
+ Cash c = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = i * c;
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_div_int4()
+ * Divide cash by 4-byte integer.
+ *
+ */
+Datum
+cash_div_int4(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int32 i = PG_GETARG_INT32(1);
+ Cash result;
+
+ if (i == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result = c / i;
+
+ PG_RETURN_CASH(result);
+}
+
+
+/* cash_mul_int2()
+ * Multiply cash by int2.
+ */
+Datum
+cash_mul_int2(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int16 s = PG_GETARG_INT16(1);
+ Cash result;
+
+ result = c * s;
+ PG_RETURN_CASH(result);
+}
+
+/* int2_mul_cash()
+ * Multiply int2 by cash.
+ */
+Datum
+int2_mul_cash(PG_FUNCTION_ARGS)
+{
+ int16 s = PG_GETARG_INT16(0);
+ Cash c = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = s * c;
+ PG_RETURN_CASH(result);
+}
+
+/* cash_div_int2()
+ * Divide cash by int2.
+ *
+ */
+Datum
+cash_div_int2(PG_FUNCTION_ARGS)
+{
+ Cash c = PG_GETARG_CASH(0);
+ int16 s = PG_GETARG_INT16(1);
+ Cash result;
+
+ if (s == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result = c / s;
+ PG_RETURN_CASH(result);
+}
+
+/* cashlarger()
+ * Return larger of two cash values.
+ */
+Datum
+cashlarger(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = (c1 > c2) ? c1 : c2;
+
+ PG_RETURN_CASH(result);
+}
+
+/* cashsmaller()
+ * Return smaller of two cash values.
+ */
+Datum
+cashsmaller(PG_FUNCTION_ARGS)
+{
+ Cash c1 = PG_GETARG_CASH(0);
+ Cash c2 = PG_GETARG_CASH(1);
+ Cash result;
+
+ result = (c1 < c2) ? c1 : c2;
+
+ PG_RETURN_CASH(result);
+}
+
+/* cash_words()
+ * This converts an int4 as well but to a representation using words
+ * Obviously way North American centric - sorry
+ */
+Datum
+cash_words(PG_FUNCTION_ARGS)
+{
+ Cash value = PG_GETARG_CASH(0);
+ uint64 val;
+ char buf[256];
+ char *p = buf;
+ Cash m0;
+ Cash m1;
+ Cash m2;
+ Cash m3;
+ Cash m4;
+ Cash m5;
+ Cash m6;
+
+ /* work with positive numbers */
+ if (value < 0)
+ {
+ value = -value;
+ strcpy(buf, "minus ");
+ p += 6;
+ }
+ else
+ buf[0] = '\0';
+
+ /* Now treat as unsigned, to avoid trouble at INT_MIN */
+ val = (uint64) value;
+
+ m0 = val % INT64CONST(100); /* cents */
+ m1 = (val / INT64CONST(100)) % 1000; /* hundreds */
+ m2 = (val / INT64CONST(100000)) % 1000; /* thousands */
+ m3 = (val / INT64CONST(100000000)) % 1000; /* millions */
+ m4 = (val / INT64CONST(100000000000)) % 1000; /* billions */
+ m5 = (val / INT64CONST(100000000000000)) % 1000; /* trillions */
+ m6 = (val / INT64CONST(100000000000000000)) % 1000; /* quadrillions */
+
+ if (m6)
+ {
+ strcat(buf, num_word(m6));
+ strcat(buf, " quadrillion ");
+ }
+
+ if (m5)
+ {
+ strcat(buf, num_word(m5));
+ strcat(buf, " trillion ");
+ }
+
+ if (m4)
+ {
+ strcat(buf, num_word(m4));
+ strcat(buf, " billion ");
+ }
+
+ if (m3)
+ {
+ strcat(buf, num_word(m3));
+ strcat(buf, " million ");
+ }
+
+ if (m2)
+ {
+ strcat(buf, num_word(m2));
+ strcat(buf, " thousand ");
+ }
+
+ if (m1)
+ strcat(buf, num_word(m1));
+
+ if (!*p)
+ strcat(buf, "zero");
+
+ strcat(buf, (val / 100) == 1 ? " dollar and " : " dollars and ");
+ strcat(buf, num_word(m0));
+ strcat(buf, m0 == 1 ? " cent" : " cents");
+
+ /* capitalize output */
+ buf[0] = pg_toupper((unsigned char) buf[0]);
+
+ /* return as text datum */
+ PG_RETURN_TEXT_P(cstring_to_text(buf));
+}
+
+
+/* cash_numeric()
+ * Convert cash to numeric.
+ */
+Datum
+cash_numeric(PG_FUNCTION_ARGS)
+{
+ Cash money = PG_GETARG_CASH(0);
+ Datum result;
+ int fpoint;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /* see comments about frac_digits in cash_in() */
+ fpoint = lconvert->frac_digits;
+ if (fpoint < 0 || fpoint > 10)
+ fpoint = 2;
+
+ /* convert the integral money value to numeric */
+ result = NumericGetDatum(int64_to_numeric(money));
+
+ /* scale appropriately, if needed */
+ if (fpoint > 0)
+ {
+ int64 scale;
+ int i;
+ Datum numeric_scale;
+ Datum quotient;
+
+ /* compute required scale factor */
+ scale = 1;
+ for (i = 0; i < fpoint; i++)
+ scale *= 10;
+ numeric_scale = NumericGetDatum(int64_to_numeric(scale));
+
+ /*
+ * Given integral inputs approaching INT64_MAX, select_div_scale()
+ * might choose a result scale of zero, causing loss of fractional
+ * digits in the quotient. We can ensure an exact result by setting
+ * the dscale of either input to be at least as large as the desired
+ * result scale. numeric_round() will do that for us.
+ */
+ numeric_scale = DirectFunctionCall2(numeric_round,
+ numeric_scale,
+ Int32GetDatum(fpoint));
+
+ /* Now we can safely divide ... */
+ quotient = DirectFunctionCall2(numeric_div, result, numeric_scale);
+
+ /* ... and forcibly round to exactly the intended number of digits */
+ result = DirectFunctionCall2(numeric_round,
+ quotient,
+ Int32GetDatum(fpoint));
+ }
+
+ PG_RETURN_DATUM(result);
+}
+
+/* numeric_cash()
+ * Convert numeric to cash.
+ */
+Datum
+numeric_cash(PG_FUNCTION_ARGS)
+{
+ Datum amount = PG_GETARG_DATUM(0);
+ Cash result;
+ int fpoint;
+ int64 scale;
+ int i;
+ Datum numeric_scale;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /* see comments about frac_digits in cash_in() */
+ fpoint = lconvert->frac_digits;
+ if (fpoint < 0 || fpoint > 10)
+ fpoint = 2;
+
+ /* compute required scale factor */
+ scale = 1;
+ for (i = 0; i < fpoint; i++)
+ scale *= 10;
+
+ /* multiply the input amount by scale factor */
+ numeric_scale = NumericGetDatum(int64_to_numeric(scale));
+ amount = DirectFunctionCall2(numeric_mul, amount, numeric_scale);
+
+ /* note that numeric_int8 will round to nearest integer for us */
+ result = DatumGetInt64(DirectFunctionCall1(numeric_int8, amount));
+
+ PG_RETURN_CASH(result);
+}
+
+/* int4_cash()
+ * Convert int4 (int) to cash
+ */
+Datum
+int4_cash(PG_FUNCTION_ARGS)
+{
+ int32 amount = PG_GETARG_INT32(0);
+ Cash result;
+ int fpoint;
+ int64 scale;
+ int i;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /* see comments about frac_digits in cash_in() */
+ fpoint = lconvert->frac_digits;
+ if (fpoint < 0 || fpoint > 10)
+ fpoint = 2;
+
+ /* compute required scale factor */
+ scale = 1;
+ for (i = 0; i < fpoint; i++)
+ scale *= 10;
+
+ /* compute amount * scale, checking for overflow */
+ result = DatumGetInt64(DirectFunctionCall2(int8mul, Int64GetDatum(amount),
+ Int64GetDatum(scale)));
+
+ PG_RETURN_CASH(result);
+}
+
+/* int8_cash()
+ * Convert int8 (bigint) to cash
+ */
+Datum
+int8_cash(PG_FUNCTION_ARGS)
+{
+ int64 amount = PG_GETARG_INT64(0);
+ Cash result;
+ int fpoint;
+ int64 scale;
+ int i;
+ struct lconv *lconvert = PGLC_localeconv();
+
+ /* see comments about frac_digits in cash_in() */
+ fpoint = lconvert->frac_digits;
+ if (fpoint < 0 || fpoint > 10)
+ fpoint = 2;
+
+ /* compute required scale factor */
+ scale = 1;
+ for (i = 0; i < fpoint; i++)
+ scale *= 10;
+
+ /* compute amount * scale, checking for overflow */
+ result = DatumGetInt64(DirectFunctionCall2(int8mul, Int64GetDatum(amount),
+ Int64GetDatum(scale)));
+
+ PG_RETURN_CASH(result);
+}
diff --git a/src/backend/utils/adt/char.c b/src/backend/utils/adt/char.c
new file mode 100644
index 0000000..e50293b
--- /dev/null
+++ b/src/backend/utils/adt/char.c
@@ -0,0 +1,253 @@
+/*-------------------------------------------------------------------------
+ *
+ * char.c
+ * Functions for the built-in type "char" (not to be confused with
+ * bpchar, which is the SQL CHAR(n) type).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/char.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+
+#define ISOCTAL(c) (((c) >= '0') && ((c) <= '7'))
+#define TOOCTAL(c) ((c) + '0')
+#define FROMOCTAL(c) ((unsigned char) (c) - '0')
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+/*
+ * charin - converts "x" to 'x'
+ *
+ * This accepts the formats charout produces. If we have multibyte input
+ * that is not in the form '\ooo', then we take its first byte as the value
+ * and silently discard the rest; this is a backwards-compatibility provision.
+ */
+Datum
+charin(PG_FUNCTION_ARGS)
+{
+ char *ch = PG_GETARG_CSTRING(0);
+
+ if (strlen(ch) == 4 && ch[0] == '\\' &&
+ ISOCTAL(ch[1]) && ISOCTAL(ch[2]) && ISOCTAL(ch[3]))
+ PG_RETURN_CHAR((FROMOCTAL(ch[1]) << 6) +
+ (FROMOCTAL(ch[2]) << 3) +
+ FROMOCTAL(ch[3]));
+ /* This will do the right thing for a zero-length input string */
+ PG_RETURN_CHAR(ch[0]);
+}
+
+/*
+ * charout - converts 'x' to "x"
+ *
+ * The possible output formats are:
+ * 1. 0x00 is represented as an empty string.
+ * 2. 0x01..0x7F are represented as a single ASCII byte.
+ * 3. 0x80..0xFF are represented as \ooo (backslash and 3 octal digits).
+ * Case 3 is meant to match the traditional "escape" format of bytea.
+ */
+Datum
+charout(PG_FUNCTION_ARGS)
+{
+ char ch = PG_GETARG_CHAR(0);
+ char *result = (char *) palloc(5);
+
+ if (IS_HIGHBIT_SET(ch))
+ {
+ result[0] = '\\';
+ result[1] = TOOCTAL(((unsigned char) ch) >> 6);
+ result[2] = TOOCTAL((((unsigned char) ch) >> 3) & 07);
+ result[3] = TOOCTAL(((unsigned char) ch) & 07);
+ result[4] = '\0';
+ }
+ else
+ {
+ /* This produces acceptable results for 0x00 as well */
+ result[0] = ch;
+ result[1] = '\0';
+ }
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * charrecv - converts external binary format to char
+ *
+ * The external representation is one byte, with no character set
+ * conversion. This is somewhat dubious, perhaps, but in many
+ * cases people use char for a 1-byte binary type.
+ */
+Datum
+charrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_CHAR(pq_getmsgbyte(buf));
+}
+
+/*
+ * charsend - converts char to binary format
+ */
+Datum
+charsend(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+/*
+ * NOTE: comparisons are done as though char is unsigned (uint8).
+ * Conversions to and from integer are done as though char is signed (int8).
+ *
+ * You wanted consistency?
+ */
+
+Datum
+chareq(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+charne(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+charlt(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL((uint8) arg1 < (uint8) arg2);
+}
+
+Datum
+charle(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL((uint8) arg1 <= (uint8) arg2);
+}
+
+Datum
+chargt(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL((uint8) arg1 > (uint8) arg2);
+}
+
+Datum
+charge(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ char arg2 = PG_GETARG_CHAR(1);
+
+ PG_RETURN_BOOL((uint8) arg1 >= (uint8) arg2);
+}
+
+
+Datum
+chartoi4(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+
+ PG_RETURN_INT32((int32) ((int8) arg1));
+}
+
+Datum
+i4tochar(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+
+ if (arg1 < SCHAR_MIN || arg1 > SCHAR_MAX)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("\"char\" out of range")));
+
+ PG_RETURN_CHAR((int8) arg1);
+}
+
+
+Datum
+text_char(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ char *ch = VARDATA_ANY(arg1);
+ char result;
+
+ /*
+ * Conversion rules are the same as in charin(), but here we need to
+ * handle the empty-string case honestly.
+ */
+ if (VARSIZE_ANY_EXHDR(arg1) == 4 && ch[0] == '\\' &&
+ ISOCTAL(ch[1]) && ISOCTAL(ch[2]) && ISOCTAL(ch[3]))
+ result = (FROMOCTAL(ch[1]) << 6) +
+ (FROMOCTAL(ch[2]) << 3) +
+ FROMOCTAL(ch[3]);
+ else if (VARSIZE_ANY_EXHDR(arg1) > 0)
+ result = ch[0];
+ else
+ result = '\0';
+
+ PG_RETURN_CHAR(result);
+}
+
+Datum
+char_text(PG_FUNCTION_ARGS)
+{
+ char arg1 = PG_GETARG_CHAR(0);
+ text *result = palloc(VARHDRSZ + 4);
+
+ /*
+ * Conversion rules are the same as in charout(), but here we need to be
+ * honest about converting 0x00 to an empty string.
+ */
+ if (IS_HIGHBIT_SET(arg1))
+ {
+ SET_VARSIZE(result, VARHDRSZ + 4);
+ (VARDATA(result))[0] = '\\';
+ (VARDATA(result))[1] = TOOCTAL(((unsigned char) arg1) >> 6);
+ (VARDATA(result))[2] = TOOCTAL((((unsigned char) arg1) >> 3) & 07);
+ (VARDATA(result))[3] = TOOCTAL(((unsigned char) arg1) & 07);
+ }
+ else if (arg1 != '\0')
+ {
+ SET_VARSIZE(result, VARHDRSZ + 1);
+ *(VARDATA(result)) = arg1;
+ }
+ else
+ SET_VARSIZE(result, VARHDRSZ);
+
+ PG_RETURN_TEXT_P(result);
+}
diff --git a/src/backend/utils/adt/cryptohashfuncs.c b/src/backend/utils/adt/cryptohashfuncs.c
new file mode 100644
index 0000000..03d84ea
--- /dev/null
+++ b/src/backend/utils/adt/cryptohashfuncs.c
@@ -0,0 +1,168 @@
+/*-------------------------------------------------------------------------
+ *
+ * cryptohashfuncs.c
+ * Cryptographic hash functions
+ *
+ * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/cryptohashfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "common/cryptohash.h"
+#include "common/md5.h"
+#include "common/sha2.h"
+#include "utils/builtins.h"
+
+
+/*
+ * MD5
+ */
+
+/* MD5 produces a 16 byte (128 bit) hash; double it for hex */
+#define MD5_HASH_LEN 32
+
+/*
+ * Create an MD5 hash of a text value and return it as hex string.
+ */
+Datum
+md5_text(PG_FUNCTION_ARGS)
+{
+ text *in_text = PG_GETARG_TEXT_PP(0);
+ size_t len;
+ char hexsum[MD5_HASH_LEN + 1];
+ const char *errstr = NULL;
+
+ /* Calculate the length of the buffer using varlena metadata */
+ len = VARSIZE_ANY_EXHDR(in_text);
+
+ /* get the hash result */
+ if (pg_md5_hash(VARDATA_ANY(in_text), len, hexsum, &errstr) == false)
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("could not compute %s hash: %s", "MD5",
+ errstr)));
+
+ /* convert to text and return it */
+ PG_RETURN_TEXT_P(cstring_to_text(hexsum));
+}
+
+/*
+ * Create an MD5 hash of a bytea value and return it as a hex string.
+ */
+Datum
+md5_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *in = PG_GETARG_BYTEA_PP(0);
+ size_t len;
+ char hexsum[MD5_HASH_LEN + 1];
+ const char *errstr = NULL;
+
+ len = VARSIZE_ANY_EXHDR(in);
+ if (pg_md5_hash(VARDATA_ANY(in), len, hexsum, &errstr) == false)
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("could not compute %s hash: %s", "MD5",
+ errstr)));
+
+ PG_RETURN_TEXT_P(cstring_to_text(hexsum));
+}
+
+/*
+ * Internal routine to compute a cryptohash with the given bytea input.
+ */
+static inline bytea *
+cryptohash_internal(pg_cryptohash_type type, bytea *input)
+{
+ const uint8 *data;
+ const char *typestr = NULL;
+ int digest_len = 0;
+ size_t len;
+ pg_cryptohash_ctx *ctx;
+ bytea *result;
+
+ switch (type)
+ {
+ case PG_SHA224:
+ typestr = "SHA224";
+ digest_len = PG_SHA224_DIGEST_LENGTH;
+ break;
+ case PG_SHA256:
+ typestr = "SHA256";
+ digest_len = PG_SHA256_DIGEST_LENGTH;
+ break;
+ case PG_SHA384:
+ typestr = "SHA384";
+ digest_len = PG_SHA384_DIGEST_LENGTH;
+ break;
+ case PG_SHA512:
+ typestr = "SHA512";
+ digest_len = PG_SHA512_DIGEST_LENGTH;
+ break;
+ case PG_MD5:
+ case PG_SHA1:
+ elog(ERROR, "unsupported cryptohash type %d", type);
+ break;
+ }
+
+ result = palloc0(digest_len + VARHDRSZ);
+ len = VARSIZE_ANY_EXHDR(input);
+ data = (unsigned char *) VARDATA_ANY(input);
+
+ ctx = pg_cryptohash_create(type);
+ if (pg_cryptohash_init(ctx) < 0)
+ elog(ERROR, "could not initialize %s context: %s", typestr,
+ pg_cryptohash_error(ctx));
+ if (pg_cryptohash_update(ctx, data, len) < 0)
+ elog(ERROR, "could not update %s context: %s", typestr,
+ pg_cryptohash_error(ctx));
+ if (pg_cryptohash_final(ctx, (unsigned char *) VARDATA(result),
+ digest_len) < 0)
+ elog(ERROR, "could not finalize %s context: %s", typestr,
+ pg_cryptohash_error(ctx));
+ pg_cryptohash_free(ctx);
+
+ SET_VARSIZE(result, digest_len + VARHDRSZ);
+
+ return result;
+}
+
+/*
+ * SHA-2 variants
+ */
+
+Datum
+sha224_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *result = cryptohash_internal(PG_SHA224, PG_GETARG_BYTEA_PP(0));
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+Datum
+sha256_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *result = cryptohash_internal(PG_SHA256, PG_GETARG_BYTEA_PP(0));
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+Datum
+sha384_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *result = cryptohash_internal(PG_SHA384, PG_GETARG_BYTEA_PP(0));
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+Datum
+sha512_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *result = cryptohash_internal(PG_SHA512, PG_GETARG_BYTEA_PP(0));
+
+ PG_RETURN_BYTEA_P(result);
+}
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
new file mode 100644
index 0000000..44b75fe
--- /dev/null
+++ b/src/backend/utils/adt/date.c
@@ -0,0 +1,3135 @@
+/*-------------------------------------------------------------------------
+ *
+ * date.c
+ * implements DATE and TIME data types specified in SQL standard
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994-5, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/date.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <float.h>
+#include <math.h>
+#include <time.h>
+
+#include "access/xact.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "nodes/supportnodes.h"
+#include "parser/scansup.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/numeric.h"
+#include "utils/sortsupport.h"
+
+/*
+ * gcc's -ffast-math switch breaks routines that expect exact results from
+ * expressions like timeval / SECS_PER_HOUR, where timeval is double.
+ */
+#ifdef __FAST_MATH__
+#error -ffast-math is known to break this code
+#endif
+
+
+/* common code for timetypmodin and timetztypmodin */
+static int32
+anytime_typmodin(bool istz, ArrayType *ta)
+{
+ int32 *tl;
+ int n;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ /*
+ * we're not too tense about good error message here because grammar
+ * shouldn't allow wrong number of modifiers for TIME
+ */
+ if (n != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid type modifier")));
+
+ return anytime_typmod_check(istz, tl[0]);
+}
+
+/* exported so parse_expr.c can use it */
+int32
+anytime_typmod_check(bool istz, int32 typmod)
+{
+ if (typmod < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("TIME(%d)%s precision must not be negative",
+ typmod, (istz ? " WITH TIME ZONE" : ""))));
+ if (typmod > MAX_TIME_PRECISION)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
+ typmod, (istz ? " WITH TIME ZONE" : ""),
+ MAX_TIME_PRECISION)));
+ typmod = MAX_TIME_PRECISION;
+ }
+
+ return typmod;
+}
+
+/* common code for timetypmodout and timetztypmodout */
+static char *
+anytime_typmodout(bool istz, int32 typmod)
+{
+ const char *tz = istz ? " with time zone" : " without time zone";
+
+ if (typmod >= 0)
+ return psprintf("(%d)%s", (int) typmod, tz);
+ else
+ return psprintf("%s", tz);
+}
+
+
+/*****************************************************************************
+ * Date ADT
+ *****************************************************************************/
+
+
+/* date_in()
+ * Given date text string, convert to internal date format.
+ */
+Datum
+date_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ DateADT date;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tzp;
+ int dtype;
+ int nf;
+ int dterr;
+ char *field[MAXDATEFIELDS];
+ int ftype[MAXDATEFIELDS];
+ char workbuf[MAXDATELEN + 1];
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tzp);
+ if (dterr != 0)
+ DateTimeParseError(dterr, str, "date");
+
+ switch (dtype)
+ {
+ case DTK_DATE:
+ break;
+
+ case DTK_EPOCH:
+ GetEpochTime(tm);
+ break;
+
+ case DTK_LATE:
+ DATE_NOEND(date);
+ PG_RETURN_DATEADT(date);
+
+ case DTK_EARLY:
+ DATE_NOBEGIN(date);
+ PG_RETURN_DATEADT(date);
+
+ default:
+ DateTimeParseError(DTERR_BAD_FORMAT, str, "date");
+ break;
+ }
+
+ /* Prevent overflow in Julian-day routines */
+ if (!IS_VALID_JULIAN(tm->tm_year, tm->tm_mon, tm->tm_mday))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"", str)));
+
+ date = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;
+
+ /* Now check for just-out-of-range dates */
+ if (!IS_VALID_DATE(date))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"", str)));
+
+ PG_RETURN_DATEADT(date);
+}
+
+/* date_out()
+ * Given internal format date, convert to text string.
+ */
+Datum
+date_out(PG_FUNCTION_ARGS)
+{
+ DateADT date = PG_GETARG_DATEADT(0);
+ char *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ char buf[MAXDATELEN + 1];
+
+ if (DATE_NOT_FINITE(date))
+ EncodeSpecialDate(date, buf);
+ else
+ {
+ j2date(date + POSTGRES_EPOCH_JDATE,
+ &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
+ EncodeDateOnly(tm, DateStyle, buf);
+ }
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * date_recv - converts external binary format to date
+ */
+Datum
+date_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ DateADT result;
+
+ result = (DateADT) pq_getmsgint(buf, sizeof(DateADT));
+
+ /* Limit to the same range that date_in() accepts. */
+ if (DATE_NOT_FINITE(result))
+ /* ok */ ;
+ else if (!IS_VALID_DATE(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range")));
+
+ PG_RETURN_DATEADT(result);
+}
+
+/*
+ * date_send - converts date to binary format
+ */
+Datum
+date_send(PG_FUNCTION_ARGS)
+{
+ DateADT date = PG_GETARG_DATEADT(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, date);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * make_date - date constructor
+ */
+Datum
+make_date(PG_FUNCTION_ARGS)
+{
+ struct pg_tm tm;
+ DateADT date;
+ int dterr;
+ bool bc = false;
+
+ tm.tm_year = PG_GETARG_INT32(0);
+ tm.tm_mon = PG_GETARG_INT32(1);
+ tm.tm_mday = PG_GETARG_INT32(2);
+
+ /* Handle negative years as BC */
+ if (tm.tm_year < 0)
+ {
+ bc = true;
+ tm.tm_year = -tm.tm_year;
+ }
+
+ dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
+
+ if (dterr != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("date field value out of range: %d-%02d-%02d",
+ tm.tm_year, tm.tm_mon, tm.tm_mday)));
+
+ /* Prevent overflow in Julian-day routines */
+ if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: %d-%02d-%02d",
+ tm.tm_year, tm.tm_mon, tm.tm_mday)));
+
+ date = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
+
+ /* Now check for just-out-of-range dates */
+ if (!IS_VALID_DATE(date))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: %d-%02d-%02d",
+ tm.tm_year, tm.tm_mon, tm.tm_mday)));
+
+ PG_RETURN_DATEADT(date);
+}
+
+/*
+ * Convert reserved date values to string.
+ */
+void
+EncodeSpecialDate(DateADT dt, char *str)
+{
+ if (DATE_IS_NOBEGIN(dt))
+ strcpy(str, EARLY);
+ else if (DATE_IS_NOEND(dt))
+ strcpy(str, LATE);
+ else /* shouldn't happen */
+ elog(ERROR, "invalid argument for EncodeSpecialDate");
+}
+
+
+/*
+ * GetSQLCurrentDate -- implements CURRENT_DATE
+ */
+DateADT
+GetSQLCurrentDate(void)
+{
+ struct pg_tm tm;
+
+ static int cache_year = 0;
+ static int cache_mon = 0;
+ static int cache_mday = 0;
+ static DateADT cache_date;
+
+ GetCurrentDateTime(&tm);
+
+ /*
+ * date2j involves several integer divisions; moreover, unless our session
+ * lives across local midnight, we don't really have to do it more than
+ * once. So it seems worth having a separate cache here.
+ */
+ if (tm.tm_year != cache_year ||
+ tm.tm_mon != cache_mon ||
+ tm.tm_mday != cache_mday)
+ {
+ cache_date = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
+ cache_year = tm.tm_year;
+ cache_mon = tm.tm_mon;
+ cache_mday = tm.tm_mday;
+ }
+
+ return cache_date;
+}
+
+/*
+ * GetSQLCurrentTime -- implements CURRENT_TIME, CURRENT_TIME(n)
+ */
+TimeTzADT *
+GetSQLCurrentTime(int32 typmod)
+{
+ TimeTzADT *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ GetCurrentTimeUsec(tm, &fsec, &tz);
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+ tm2timetz(tm, fsec, tz, result);
+ AdjustTimeForTypmod(&(result->time), typmod);
+ return result;
+}
+
+/*
+ * GetSQLLocalTime -- implements LOCALTIME, LOCALTIME(n)
+ */
+TimeADT
+GetSQLLocalTime(int32 typmod)
+{
+ TimeADT result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ GetCurrentTimeUsec(tm, &fsec, &tz);
+
+ tm2time(tm, fsec, &result);
+ AdjustTimeForTypmod(&result, typmod);
+ return result;
+}
+
+
+/*
+ * Comparison functions for dates
+ */
+
+Datum
+date_eq(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 == dateVal2);
+}
+
+Datum
+date_ne(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 != dateVal2);
+}
+
+Datum
+date_lt(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 < dateVal2);
+}
+
+Datum
+date_le(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 <= dateVal2);
+}
+
+Datum
+date_gt(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 > dateVal2);
+}
+
+Datum
+date_ge(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(dateVal1 >= dateVal2);
+}
+
+Datum
+date_cmp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ if (dateVal1 < dateVal2)
+ PG_RETURN_INT32(-1);
+ else if (dateVal1 > dateVal2)
+ PG_RETURN_INT32(1);
+ PG_RETURN_INT32(0);
+}
+
+Datum
+date_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = ssup_datum_int32_cmp;
+ PG_RETURN_VOID();
+}
+
+Datum
+date_finite(PG_FUNCTION_ARGS)
+{
+ DateADT date = PG_GETARG_DATEADT(0);
+
+ PG_RETURN_BOOL(!DATE_NOT_FINITE(date));
+}
+
+Datum
+date_larger(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_DATEADT((dateVal1 > dateVal2) ? dateVal1 : dateVal2);
+}
+
+Datum
+date_smaller(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_DATEADT((dateVal1 < dateVal2) ? dateVal1 : dateVal2);
+}
+
+/* Compute difference between two dates in days.
+ */
+Datum
+date_mi(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal1 = PG_GETARG_DATEADT(0);
+ DateADT dateVal2 = PG_GETARG_DATEADT(1);
+
+ if (DATE_NOT_FINITE(dateVal1) || DATE_NOT_FINITE(dateVal2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("cannot subtract infinite dates")));
+
+ PG_RETURN_INT32((int32) (dateVal1 - dateVal2));
+}
+
+/* Add a number of days to a date, giving a new date.
+ * Must handle both positive and negative numbers of days.
+ */
+Datum
+date_pli(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ int32 days = PG_GETARG_INT32(1);
+ DateADT result;
+
+ if (DATE_NOT_FINITE(dateVal))
+ PG_RETURN_DATEADT(dateVal); /* can't change infinity */
+
+ result = dateVal + days;
+
+ /* Check for integer overflow and out-of-allowed-range */
+ if ((days >= 0 ? (result < dateVal) : (result > dateVal)) ||
+ !IS_VALID_DATE(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range")));
+
+ PG_RETURN_DATEADT(result);
+}
+
+/* Subtract a number of days from a date, giving a new date.
+ */
+Datum
+date_mii(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ int32 days = PG_GETARG_INT32(1);
+ DateADT result;
+
+ if (DATE_NOT_FINITE(dateVal))
+ PG_RETURN_DATEADT(dateVal); /* can't change infinity */
+
+ result = dateVal - days;
+
+ /* Check for integer overflow and out-of-allowed-range */
+ if ((days >= 0 ? (result > dateVal) : (result < dateVal)) ||
+ !IS_VALID_DATE(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range")));
+
+ PG_RETURN_DATEADT(result);
+}
+
+
+/*
+ * Promote date to timestamp.
+ *
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the date is finite but out of the valid range for timestamp, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamp infinity.
+ *
+ * Note: *overflow = -1 is actually not possible currently, since both
+ * datatypes have the same lower bound, Julian day zero.
+ */
+Timestamp
+date2timestamp_opt_overflow(DateADT dateVal, int *overflow)
+{
+ Timestamp result;
+
+ if (overflow)
+ *overflow = 0;
+
+ if (DATE_IS_NOBEGIN(dateVal))
+ TIMESTAMP_NOBEGIN(result);
+ else if (DATE_IS_NOEND(dateVal))
+ TIMESTAMP_NOEND(result);
+ else
+ {
+ /*
+ * Since dates have the same minimum values as timestamps, only upper
+ * boundary need be checked for overflow.
+ */
+ if (dateVal >= (TIMESTAMP_END_JULIAN - POSTGRES_EPOCH_JDATE))
+ {
+ if (overflow)
+ {
+ *overflow = 1;
+ TIMESTAMP_NOEND(result);
+ return result;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range for timestamp")));
+ }
+ }
+
+ /* date is days since 2000, timestamp is microseconds since same... */
+ result = dateVal * USECS_PER_DAY;
+ }
+
+ return result;
+}
+
+/*
+ * Promote date to timestamp, throwing error for overflow.
+ */
+static TimestampTz
+date2timestamp(DateADT dateVal)
+{
+ return date2timestamp_opt_overflow(dateVal, NULL);
+}
+
+/*
+ * Promote date to timestamp with time zone.
+ *
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the date is finite but out of the valid range for timestamptz, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamptz infinity.
+ */
+TimestampTz
+date2timestamptz_opt_overflow(DateADT dateVal, int *overflow)
+{
+ TimestampTz result;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+
+ if (overflow)
+ *overflow = 0;
+
+ if (DATE_IS_NOBEGIN(dateVal))
+ TIMESTAMP_NOBEGIN(result);
+ else if (DATE_IS_NOEND(dateVal))
+ TIMESTAMP_NOEND(result);
+ else
+ {
+ /*
+ * Since dates have the same minimum values as timestamps, only upper
+ * boundary need be checked for overflow.
+ */
+ if (dateVal >= (TIMESTAMP_END_JULIAN - POSTGRES_EPOCH_JDATE))
+ {
+ if (overflow)
+ {
+ *overflow = 1;
+ TIMESTAMP_NOEND(result);
+ return result;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range for timestamp")));
+ }
+ }
+
+ j2date(dateVal + POSTGRES_EPOCH_JDATE,
+ &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ tz = DetermineTimeZoneOffset(tm, session_timezone);
+
+ result = dateVal * USECS_PER_DAY + tz * USECS_PER_SEC;
+
+ /*
+ * Since it is possible to go beyond allowed timestamptz range because
+ * of time zone, check for allowed timestamp range after adding tz.
+ */
+ if (!IS_VALID_TIMESTAMP(result))
+ {
+ if (overflow)
+ {
+ if (result < MIN_TIMESTAMP)
+ {
+ *overflow = -1;
+ TIMESTAMP_NOBEGIN(result);
+ }
+ else
+ {
+ *overflow = 1;
+ TIMESTAMP_NOEND(result);
+ }
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range for timestamp")));
+ }
+ }
+ }
+
+ return result;
+}
+
+/*
+ * Promote date to timestamptz, throwing error for overflow.
+ */
+static TimestampTz
+date2timestamptz(DateADT dateVal)
+{
+ return date2timestamptz_opt_overflow(dateVal, NULL);
+}
+
+/*
+ * date2timestamp_no_overflow
+ *
+ * This is chartered to produce a double value that is numerically
+ * equivalent to the corresponding Timestamp value, if the date is in the
+ * valid range of Timestamps, but in any case not throw an overflow error.
+ * We can do this since the numerical range of double is greater than
+ * that of non-erroneous timestamps. The results are currently only
+ * used for statistical estimation purposes.
+ */
+double
+date2timestamp_no_overflow(DateADT dateVal)
+{
+ double result;
+
+ if (DATE_IS_NOBEGIN(dateVal))
+ result = -DBL_MAX;
+ else if (DATE_IS_NOEND(dateVal))
+ result = DBL_MAX;
+ else
+ {
+ /* date is days since 2000, timestamp is microseconds since same... */
+ result = dateVal * (double) USECS_PER_DAY;
+ }
+
+ return result;
+}
+
+
+/*
+ * Crosstype comparison functions for dates
+ */
+
+int32
+date_cmp_timestamp_internal(DateADT dateVal, Timestamp dt2)
+{
+ Timestamp dt1;
+ int overflow;
+
+ dt1 = date2timestamp_opt_overflow(dateVal, &overflow);
+ if (overflow > 0)
+ {
+ /* dt1 is larger than any finite timestamp, but less than infinity */
+ return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+ }
+ Assert(overflow == 0); /* -1 case cannot occur */
+
+ return timestamp_cmp_internal(dt1, dt2);
+}
+
+Datum
+date_eq_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) == 0);
+}
+
+Datum
+date_ne_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) != 0);
+}
+
+Datum
+date_lt_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) < 0);
+}
+
+Datum
+date_gt_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) > 0);
+}
+
+Datum
+date_le_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) <= 0);
+}
+
+Datum
+date_ge_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) >= 0);
+}
+
+Datum
+date_cmp_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_INT32(date_cmp_timestamp_internal(dateVal, dt2));
+}
+
+int32
+date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2)
+{
+ TimestampTz dt1;
+ int overflow;
+
+ dt1 = date2timestamptz_opt_overflow(dateVal, &overflow);
+ if (overflow > 0)
+ {
+ /* dt1 is larger than any finite timestamp, but less than infinity */
+ return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+ }
+ if (overflow < 0)
+ {
+ /* dt1 is less than any finite timestamp, but more than -infinity */
+ return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
+ }
+
+ return timestamptz_cmp_internal(dt1, dt2);
+}
+
+Datum
+date_eq_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) == 0);
+}
+
+Datum
+date_ne_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) != 0);
+}
+
+Datum
+date_lt_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) < 0);
+}
+
+Datum
+date_gt_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) > 0);
+}
+
+Datum
+date_le_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) <= 0);
+}
+
+Datum
+date_ge_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) >= 0);
+}
+
+Datum
+date_cmp_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_INT32(date_cmp_timestamptz_internal(dateVal, dt2));
+}
+
+Datum
+timestamp_eq_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) == 0);
+}
+
+Datum
+timestamp_ne_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) != 0);
+}
+
+Datum
+timestamp_lt_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) > 0);
+}
+
+Datum
+timestamp_gt_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) < 0);
+}
+
+Datum
+timestamp_le_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) >= 0);
+}
+
+Datum
+timestamp_ge_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) <= 0);
+}
+
+Datum
+timestamp_cmp_date(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_INT32(-date_cmp_timestamp_internal(dateVal, dt1));
+}
+
+Datum
+timestamptz_eq_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) == 0);
+}
+
+Datum
+timestamptz_ne_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) != 0);
+}
+
+Datum
+timestamptz_lt_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) > 0);
+}
+
+Datum
+timestamptz_gt_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) < 0);
+}
+
+Datum
+timestamptz_le_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) >= 0);
+}
+
+Datum
+timestamptz_ge_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) <= 0);
+}
+
+Datum
+timestamptz_cmp_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ DateADT dateVal = PG_GETARG_DATEADT(1);
+
+ PG_RETURN_INT32(-date_cmp_timestamptz_internal(dateVal, dt1));
+}
+
+/*
+ * in_range support function for date.
+ *
+ * We implement this by promoting the dates to timestamp (without time zone)
+ * and then using the timestamp-and-interval in_range function.
+ */
+Datum
+in_range_date_interval(PG_FUNCTION_ARGS)
+{
+ DateADT val = PG_GETARG_DATEADT(0);
+ DateADT base = PG_GETARG_DATEADT(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ Timestamp valStamp;
+ Timestamp baseStamp;
+
+ /* XXX we could support out-of-range cases here, perhaps */
+ valStamp = date2timestamp(val);
+ baseStamp = date2timestamp(base);
+
+ return DirectFunctionCall5(in_range_timestamp_interval,
+ TimestampGetDatum(valStamp),
+ TimestampGetDatum(baseStamp),
+ IntervalPGetDatum(offset),
+ BoolGetDatum(sub),
+ BoolGetDatum(less));
+}
+
+
+/* extract_date()
+ * Extract specified field from date type.
+ */
+Datum
+extract_date(PG_FUNCTION_ARGS)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ DateADT date = PG_GETARG_DATEADT(1);
+ int64 intresult;
+ int type,
+ val;
+ char *lowunits;
+ int year,
+ mon,
+ mday;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (DATE_NOT_FINITE(date) && (type == UNITS || type == RESERV))
+ {
+ switch (val)
+ {
+ /* Oscillating units */
+ case DTK_DAY:
+ case DTK_MONTH:
+ case DTK_QUARTER:
+ case DTK_WEEK:
+ case DTK_DOW:
+ case DTK_ISODOW:
+ case DTK_DOY:
+ PG_RETURN_NULL();
+ break;
+
+ /* Monotonically-increasing units */
+ case DTK_YEAR:
+ case DTK_DECADE:
+ case DTK_CENTURY:
+ case DTK_MILLENNIUM:
+ case DTK_JULIAN:
+ case DTK_ISOYEAR:
+ case DTK_EPOCH:
+ if (DATE_IS_NOBEGIN(date))
+ PG_RETURN_NUMERIC(DatumGetNumeric(DirectFunctionCall3(numeric_in,
+ CStringGetDatum("-Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1))));
+ else
+ PG_RETURN_NUMERIC(DatumGetNumeric(DirectFunctionCall3(numeric_in,
+ CStringGetDatum("Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1))));
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(DATEOID))));
+ }
+ }
+ else if (type == UNITS)
+ {
+ j2date(date + POSTGRES_EPOCH_JDATE, &year, &mon, &mday);
+
+ switch (val)
+ {
+ case DTK_DAY:
+ intresult = mday;
+ break;
+
+ case DTK_MONTH:
+ intresult = mon;
+ break;
+
+ case DTK_QUARTER:
+ intresult = (mon - 1) / 3 + 1;
+ break;
+
+ case DTK_WEEK:
+ intresult = date2isoweek(year, mon, mday);
+ break;
+
+ case DTK_YEAR:
+ if (year > 0)
+ intresult = year;
+ else
+ /* there is no year 0, just 1 BC and 1 AD */
+ intresult = year - 1;
+ break;
+
+ case DTK_DECADE:
+ /* see comments in timestamp_part */
+ if (year >= 0)
+ intresult = year / 10;
+ else
+ intresult = -((8 - (year - 1)) / 10);
+ break;
+
+ case DTK_CENTURY:
+ /* see comments in timestamp_part */
+ if (year > 0)
+ intresult = (year + 99) / 100;
+ else
+ intresult = -((99 - (year - 1)) / 100);
+ break;
+
+ case DTK_MILLENNIUM:
+ /* see comments in timestamp_part */
+ if (year > 0)
+ intresult = (year + 999) / 1000;
+ else
+ intresult = -((999 - (year - 1)) / 1000);
+ break;
+
+ case DTK_JULIAN:
+ intresult = date + POSTGRES_EPOCH_JDATE;
+ break;
+
+ case DTK_ISOYEAR:
+ intresult = date2isoyear(year, mon, mday);
+ /* Adjust BC years */
+ if (intresult <= 0)
+ intresult -= 1;
+ break;
+
+ case DTK_DOW:
+ case DTK_ISODOW:
+ intresult = j2day(date + POSTGRES_EPOCH_JDATE);
+ if (val == DTK_ISODOW && intresult == 0)
+ intresult = 7;
+ break;
+
+ case DTK_DOY:
+ intresult = date2j(year, mon, mday) - date2j(year, 1, 1) + 1;
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(DATEOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV)
+ {
+ switch (val)
+ {
+ case DTK_EPOCH:
+ intresult = ((int64) date + POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY;
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(DATEOID))));
+ intresult = 0;
+ }
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(DATEOID))));
+ intresult = 0;
+ }
+
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+}
+
+
+/* Add an interval to a date, giving a new date.
+ * Must handle both positive and negative intervals.
+ *
+ * We implement this by promoting the date to timestamp (without time zone)
+ * and then using the timestamp plus interval function.
+ */
+Datum
+date_pl_interval(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ Timestamp dateStamp;
+
+ dateStamp = date2timestamp(dateVal);
+
+ return DirectFunctionCall2(timestamp_pl_interval,
+ TimestampGetDatum(dateStamp),
+ PointerGetDatum(span));
+}
+
+/* Subtract an interval from a date, giving a new date.
+ * Must handle both positive and negative intervals.
+ *
+ * We implement this by promoting the date to timestamp (without time zone)
+ * and then using the timestamp minus interval function.
+ */
+Datum
+date_mi_interval(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ Timestamp dateStamp;
+
+ dateStamp = date2timestamp(dateVal);
+
+ return DirectFunctionCall2(timestamp_mi_interval,
+ TimestampGetDatum(dateStamp),
+ PointerGetDatum(span));
+}
+
+/* date_timestamp()
+ * Convert date to timestamp data type.
+ */
+Datum
+date_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ Timestamp result;
+
+ result = date2timestamp(dateVal);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamp_date()
+ * Convert timestamp to date data type.
+ */
+Datum
+timestamp_date(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ DateADT result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ if (TIMESTAMP_IS_NOBEGIN(timestamp))
+ DATE_NOBEGIN(result);
+ else if (TIMESTAMP_IS_NOEND(timestamp))
+ DATE_NOEND(result);
+ else
+ {
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;
+ }
+
+ PG_RETURN_DATEADT(result);
+}
+
+
+/* date_timestamptz()
+ * Convert date to timestamp with time zone data type.
+ */
+Datum
+date_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT dateVal = PG_GETARG_DATEADT(0);
+ TimestampTz result;
+
+ result = date2timestamptz(dateVal);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+
+/* timestamptz_date()
+ * Convert timestamp with time zone to date data type.
+ */
+Datum
+timestamptz_date(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMP(0);
+ DateADT result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ if (TIMESTAMP_IS_NOBEGIN(timestamp))
+ DATE_NOBEGIN(result);
+ else if (TIMESTAMP_IS_NOEND(timestamp))
+ DATE_NOEND(result);
+ else
+ {
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;
+ }
+
+ PG_RETURN_DATEADT(result);
+}
+
+
+/*****************************************************************************
+ * Time ADT
+ *****************************************************************************/
+
+Datum
+time_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimeADT result;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ int nf;
+ int dterr;
+ char workbuf[MAXDATELEN + 1];
+ char *field[MAXDATEFIELDS];
+ int dtype;
+ int ftype[MAXDATEFIELDS];
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz);
+ if (dterr != 0)
+ DateTimeParseError(dterr, str, "time");
+
+ tm2time(tm, fsec, &result);
+ AdjustTimeForTypmod(&result, typmod);
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* tm2time()
+ * Convert a tm structure to a time data type.
+ */
+int
+tm2time(struct pg_tm *tm, fsec_t fsec, TimeADT *result)
+{
+ *result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec)
+ * USECS_PER_SEC) + fsec;
+ return 0;
+}
+
+/* time_overflows()
+ * Check to see if a broken-down time-of-day is out of range.
+ */
+bool
+time_overflows(int hour, int min, int sec, fsec_t fsec)
+{
+ /* Range-check the fields individually. */
+ if (hour < 0 || hour > HOURS_PER_DAY ||
+ min < 0 || min >= MINS_PER_HOUR ||
+ sec < 0 || sec > SECS_PER_MINUTE ||
+ fsec < 0 || fsec > USECS_PER_SEC)
+ return true;
+
+ /*
+ * Because we allow, eg, hour = 24 or sec = 60, we must check separately
+ * that the total time value doesn't exceed 24:00:00.
+ */
+ if ((((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
+ + sec) * USECS_PER_SEC) + fsec) > USECS_PER_DAY)
+ return true;
+
+ return false;
+}
+
+/* float_time_overflows()
+ * Same, when we have seconds + fractional seconds as one "double" value.
+ */
+bool
+float_time_overflows(int hour, int min, double sec)
+{
+ /* Range-check the fields individually. */
+ if (hour < 0 || hour > HOURS_PER_DAY ||
+ min < 0 || min >= MINS_PER_HOUR)
+ return true;
+
+ /*
+ * "sec", being double, requires extra care. Cope with NaN, and round off
+ * before applying the range check to avoid unexpected errors due to
+ * imprecise input. (We assume rint() behaves sanely with infinities.)
+ */
+ if (isnan(sec))
+ return true;
+ sec = rint(sec * USECS_PER_SEC);
+ if (sec < 0 || sec > SECS_PER_MINUTE * USECS_PER_SEC)
+ return true;
+
+ /*
+ * Because we allow, eg, hour = 24 or sec = 60, we must check separately
+ * that the total time value doesn't exceed 24:00:00. This must match the
+ * way that callers will convert the fields to a time.
+ */
+ if (((((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
+ * USECS_PER_SEC) + (int64) sec) > USECS_PER_DAY)
+ return true;
+
+ return false;
+}
+
+
+/* time2tm()
+ * Convert time data type to POSIX time structure.
+ *
+ * Note that only the hour/min/sec/fractional-sec fields are filled in.
+ */
+int
+time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec)
+{
+ tm->tm_hour = time / USECS_PER_HOUR;
+ time -= tm->tm_hour * USECS_PER_HOUR;
+ tm->tm_min = time / USECS_PER_MINUTE;
+ time -= tm->tm_min * USECS_PER_MINUTE;
+ tm->tm_sec = time / USECS_PER_SEC;
+ time -= tm->tm_sec * USECS_PER_SEC;
+ *fsec = time;
+ return 0;
+}
+
+Datum
+time_out(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ char *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ char buf[MAXDATELEN + 1];
+
+ time2tm(time, tm, &fsec);
+ EncodeTimeOnly(tm, fsec, false, 0, DateStyle, buf);
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * time_recv - converts external binary format to time
+ */
+Datum
+time_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimeADT result;
+
+ result = pq_getmsgint64(buf);
+
+ if (result < INT64CONST(0) || result > USECS_PER_DAY)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("time out of range")));
+
+ AdjustTimeForTypmod(&result, typmod);
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/*
+ * time_send - converts time to binary format
+ */
+Datum
+time_send(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, time);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+timetypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anytime_typmodin(false, ta));
+}
+
+Datum
+timetypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anytime_typmodout(false, typmod));
+}
+
+/*
+ * make_time - time constructor
+ */
+Datum
+make_time(PG_FUNCTION_ARGS)
+{
+ int tm_hour = PG_GETARG_INT32(0);
+ int tm_min = PG_GETARG_INT32(1);
+ double sec = PG_GETARG_FLOAT8(2);
+ TimeADT time;
+
+ /* Check for time overflow */
+ if (float_time_overflows(tm_hour, tm_min, sec))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("time field value out of range: %d:%02d:%02g",
+ tm_hour, tm_min, sec)));
+
+ /* This should match tm2time */
+ time = (((tm_hour * MINS_PER_HOUR + tm_min) * SECS_PER_MINUTE)
+ * USECS_PER_SEC) + (int64) rint(sec * USECS_PER_SEC);
+
+ PG_RETURN_TIMEADT(time);
+}
+
+
+/* time_support()
+ *
+ * Planner support function for the time_scale() and timetz_scale()
+ * length coercion functions (we need not distinguish them here).
+ */
+Datum
+time_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+
+ ret = TemporalSimplify(MAX_TIME_PRECISION, (Node *) req->fcall);
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/* time_scale()
+ * Adjust time type for specified scale factor.
+ * Used by PostgreSQL type system to stuff columns.
+ */
+Datum
+time_scale(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ TimeADT result;
+
+ result = time;
+ AdjustTimeForTypmod(&result, typmod);
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* AdjustTimeForTypmod()
+ * Force the precision of the time value to a specified value.
+ * Uses *exactly* the same code as in AdjustTimestampForTypmod()
+ * but we make a separate copy because those types do not
+ * have a fundamental tie together but rather a coincidence of
+ * implementation. - thomas
+ */
+void
+AdjustTimeForTypmod(TimeADT *time, int32 typmod)
+{
+ static const int64 TimeScales[MAX_TIME_PRECISION + 1] = {
+ INT64CONST(1000000),
+ INT64CONST(100000),
+ INT64CONST(10000),
+ INT64CONST(1000),
+ INT64CONST(100),
+ INT64CONST(10),
+ INT64CONST(1)
+ };
+
+ static const int64 TimeOffsets[MAX_TIME_PRECISION + 1] = {
+ INT64CONST(500000),
+ INT64CONST(50000),
+ INT64CONST(5000),
+ INT64CONST(500),
+ INT64CONST(50),
+ INT64CONST(5),
+ INT64CONST(0)
+ };
+
+ if (typmod >= 0 && typmod <= MAX_TIME_PRECISION)
+ {
+ if (*time >= INT64CONST(0))
+ *time = ((*time + TimeOffsets[typmod]) / TimeScales[typmod]) *
+ TimeScales[typmod];
+ else
+ *time = -((((-*time) + TimeOffsets[typmod]) / TimeScales[typmod]) *
+ TimeScales[typmod]);
+ }
+}
+
+
+Datum
+time_eq(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 == time2);
+}
+
+Datum
+time_ne(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 != time2);
+}
+
+Datum
+time_lt(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 < time2);
+}
+
+Datum
+time_le(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 <= time2);
+}
+
+Datum
+time_gt(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 > time2);
+}
+
+Datum
+time_ge(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_BOOL(time1 >= time2);
+}
+
+Datum
+time_cmp(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ if (time1 < time2)
+ PG_RETURN_INT32(-1);
+ if (time1 > time2)
+ PG_RETURN_INT32(1);
+ PG_RETURN_INT32(0);
+}
+
+Datum
+time_hash(PG_FUNCTION_ARGS)
+{
+ return hashint8(fcinfo);
+}
+
+Datum
+time_hash_extended(PG_FUNCTION_ARGS)
+{
+ return hashint8extended(fcinfo);
+}
+
+Datum
+time_larger(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_TIMEADT((time1 > time2) ? time1 : time2);
+}
+
+Datum
+time_smaller(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+
+ PG_RETURN_TIMEADT((time1 < time2) ? time1 : time2);
+}
+
+/* overlaps_time() --- implements the SQL OVERLAPS operator.
+ *
+ * Algorithm is per SQL spec. This is much harder than you'd think
+ * because the spec requires us to deliver a non-null answer in some cases
+ * where some of the inputs are null.
+ */
+Datum
+overlaps_time(PG_FUNCTION_ARGS)
+{
+ /*
+ * The arguments are TimeADT, but we leave them as generic Datums to avoid
+ * dereferencing nulls (TimeADT is pass-by-reference!)
+ */
+ Datum ts1 = PG_GETARG_DATUM(0);
+ Datum te1 = PG_GETARG_DATUM(1);
+ Datum ts2 = PG_GETARG_DATUM(2);
+ Datum te2 = PG_GETARG_DATUM(3);
+ bool ts1IsNull = PG_ARGISNULL(0);
+ bool te1IsNull = PG_ARGISNULL(1);
+ bool ts2IsNull = PG_ARGISNULL(2);
+ bool te2IsNull = PG_ARGISNULL(3);
+
+#define TIMEADT_GT(t1,t2) \
+ (DatumGetTimeADT(t1) > DatumGetTimeADT(t2))
+#define TIMEADT_LT(t1,t2) \
+ (DatumGetTimeADT(t1) < DatumGetTimeADT(t2))
+
+ /*
+ * If both endpoints of interval 1 are null, the result is null (unknown).
+ * If just one endpoint is null, take ts1 as the non-null one. Otherwise,
+ * take ts1 as the lesser endpoint.
+ */
+ if (ts1IsNull)
+ {
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts1 = te1;
+ te1IsNull = true;
+ }
+ else if (!te1IsNull)
+ {
+ if (TIMEADT_GT(ts1, te1))
+ {
+ Datum tt = ts1;
+
+ ts1 = te1;
+ te1 = tt;
+ }
+ }
+
+ /* Likewise for interval 2. */
+ if (ts2IsNull)
+ {
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts2 = te2;
+ te2IsNull = true;
+ }
+ else if (!te2IsNull)
+ {
+ if (TIMEADT_GT(ts2, te2))
+ {
+ Datum tt = ts2;
+
+ ts2 = te2;
+ te2 = tt;
+ }
+ }
+
+ /*
+ * At this point neither ts1 nor ts2 is null, so we can consider three
+ * cases: ts1 > ts2, ts1 < ts2, ts1 = ts2
+ */
+ if (TIMEADT_GT(ts1, ts2))
+ {
+ /*
+ * This case is ts1 < te2 OR te1 < te2, which may look redundant but
+ * in the presence of nulls it's not quite completely so.
+ */
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ if (TIMEADT_LT(ts1, te2))
+ PG_RETURN_BOOL(true);
+ if (te1IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te1 is not null then we had ts1 <= te1 above, and we just found
+ * ts1 >= te2, hence te1 >= te2.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else if (TIMEADT_LT(ts1, ts2))
+ {
+ /* This case is ts2 < te1 OR te2 < te1 */
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ if (TIMEADT_LT(ts2, te1))
+ PG_RETURN_BOOL(true);
+ if (te2IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te2 is not null then we had ts2 <= te2 above, and we just found
+ * ts2 >= te1, hence te2 >= te1.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else
+ {
+ /*
+ * For ts1 = ts2 the spec says te1 <> te2 OR te1 = te2, which is a
+ * rather silly way of saying "true if both are nonnull, else null".
+ */
+ if (te1IsNull || te2IsNull)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(true);
+ }
+
+#undef TIMEADT_GT
+#undef TIMEADT_LT
+}
+
+/* timestamp_time()
+ * Convert timestamp to time data type.
+ */
+Datum
+timestamp_time(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ TimeADT result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_NULL();
+
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /*
+ * Could also do this with time = (timestamp / USECS_PER_DAY *
+ * USECS_PER_DAY) - timestamp;
+ */
+ result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
+ USECS_PER_SEC) + fsec;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* timestamptz_time()
+ * Convert timestamptz to time data type.
+ */
+Datum
+timestamptz_time(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMP(0);
+ TimeADT result;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ fsec_t fsec;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_NULL();
+
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /*
+ * Could also do this with time = (timestamp / USECS_PER_DAY *
+ * USECS_PER_DAY) - timestamp;
+ */
+ result = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
+ USECS_PER_SEC) + fsec;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* datetime_timestamp()
+ * Convert date and time to timestamp data type.
+ */
+Datum
+datetime_timestamp(PG_FUNCTION_ARGS)
+{
+ DateADT date = PG_GETARG_DATEADT(0);
+ TimeADT time = PG_GETARG_TIMEADT(1);
+ Timestamp result;
+
+ result = date2timestamp(date);
+ if (!TIMESTAMP_NOT_FINITE(result))
+ {
+ result += time;
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* time_interval()
+ * Convert time to interval data type.
+ */
+Datum
+time_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result->time = time;
+ result->day = 0;
+ result->month = 0;
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* interval_time()
+ * Convert interval to time data type.
+ *
+ * This is defined as producing the fractional-day portion of the interval.
+ * Therefore, we can just ignore the months field. It is not real clear
+ * what to do with negative intervals, but we choose to subtract the floor,
+ * so that, say, '-2 hours' becomes '22:00:00'.
+ */
+Datum
+interval_time(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ TimeADT result;
+ int64 days;
+
+ result = span->time;
+ if (result >= USECS_PER_DAY)
+ {
+ days = result / USECS_PER_DAY;
+ result -= days * USECS_PER_DAY;
+ }
+ else if (result < 0)
+ {
+ days = (-result + USECS_PER_DAY - 1) / USECS_PER_DAY;
+ result += days * USECS_PER_DAY;
+ }
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* time_mi_time()
+ * Subtract two times to produce an interval.
+ */
+Datum
+time_mi_time(PG_FUNCTION_ARGS)
+{
+ TimeADT time1 = PG_GETARG_TIMEADT(0);
+ TimeADT time2 = PG_GETARG_TIMEADT(1);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result->month = 0;
+ result->day = 0;
+ result->time = time1 - time2;
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* time_pl_interval()
+ * Add interval to time.
+ */
+Datum
+time_pl_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeADT result;
+
+ result = time + span->time;
+ result -= result / USECS_PER_DAY * USECS_PER_DAY;
+ if (result < INT64CONST(0))
+ result += USECS_PER_DAY;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* time_mi_interval()
+ * Subtract interval from time.
+ */
+Datum
+time_mi_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeADT result;
+
+ result = time - span->time;
+ result -= result / USECS_PER_DAY * USECS_PER_DAY;
+ if (result < INT64CONST(0))
+ result += USECS_PER_DAY;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/*
+ * in_range support function for time.
+ */
+Datum
+in_range_time_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT val = PG_GETARG_TIMEADT(0);
+ TimeADT base = PG_GETARG_TIMEADT(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ TimeADT sum;
+
+ /*
+ * Like time_pl_interval/time_mi_interval, we disregard the month and day
+ * fields of the offset. So our test for negative should too.
+ */
+ if (offset->time < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /*
+ * We can't use time_pl_interval/time_mi_interval here, because their
+ * wraparound behavior would give wrong (or at least undesirable) answers.
+ * Fortunately the equivalent non-wrapping behavior is trivial, especially
+ * since we don't worry about integer overflow.
+ */
+ if (sub)
+ sum = base - offset->time;
+ else
+ sum = base + offset->time;
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+
+/* time_part() and extract_time()
+ * Extract specified field from time type.
+ */
+static Datum
+time_part_common(PG_FUNCTION_ARGS, bool retnumeric)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ TimeADT time = PG_GETARG_TIMEADT(1);
+ int64 intresult;
+ int type,
+ val;
+ char *lowunits;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ time2tm(time, tm, &fsec);
+
+ switch (val)
+ {
+ case DTK_MICROSEC:
+ intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
+ break;
+
+ case DTK_MILLISEC:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec * 1000 + fsec / 1000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 3));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
+ break;
+
+ case DTK_SECOND:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec + fsec / 1'000'000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 6));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
+ break;
+
+ case DTK_MINUTE:
+ intresult = tm->tm_min;
+ break;
+
+ case DTK_HOUR:
+ intresult = tm->tm_hour;
+ break;
+
+ case DTK_TZ:
+ case DTK_TZ_MINUTE:
+ case DTK_TZ_HOUR:
+ case DTK_DAY:
+ case DTK_MONTH:
+ case DTK_QUARTER:
+ case DTK_YEAR:
+ case DTK_DECADE:
+ case DTK_CENTURY:
+ case DTK_MILLENNIUM:
+ case DTK_ISOYEAR:
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMEOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV && val == DTK_EPOCH)
+ {
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(time, 6));
+ else
+ PG_RETURN_FLOAT8(time / 1000000.0);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMEOID))));
+ intresult = 0;
+ }
+
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+ else
+ PG_RETURN_FLOAT8(intresult);
+}
+
+Datum
+time_part(PG_FUNCTION_ARGS)
+{
+ return time_part_common(fcinfo, false);
+}
+
+Datum
+extract_time(PG_FUNCTION_ARGS)
+{
+ return time_part_common(fcinfo, true);
+}
+
+
+/*****************************************************************************
+ * Time With Time Zone ADT
+ *****************************************************************************/
+
+/* tm2timetz()
+ * Convert a tm structure to a time data type.
+ */
+int
+tm2timetz(struct pg_tm *tm, fsec_t fsec, int tz, TimeTzADT *result)
+{
+ result->time = ((((tm->tm_hour * MINS_PER_HOUR + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) *
+ USECS_PER_SEC) + fsec;
+ result->zone = tz;
+
+ return 0;
+}
+
+Datum
+timetz_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimeTzADT *result;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ int nf;
+ int dterr;
+ char workbuf[MAXDATELEN + 1];
+ char *field[MAXDATEFIELDS];
+ int dtype;
+ int ftype[MAXDATEFIELDS];
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz);
+ if (dterr != 0)
+ DateTimeParseError(dterr, str, "time with time zone");
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+ tm2timetz(tm, fsec, tz, result);
+ AdjustTimeForTypmod(&(result->time), typmod);
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+Datum
+timetz_out(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ char *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+ char buf[MAXDATELEN + 1];
+
+ timetz2tm(time, tm, &fsec, &tz);
+ EncodeTimeOnly(tm, fsec, true, tz, DateStyle, buf);
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * timetz_recv - converts external binary format to timetz
+ */
+Datum
+timetz_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimeTzADT *result;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = pq_getmsgint64(buf);
+
+ if (result->time < INT64CONST(0) || result->time > USECS_PER_DAY)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("time out of range")));
+
+ result->zone = pq_getmsgint(buf, sizeof(result->zone));
+
+ /* Check for sane GMT displacement; see notes in datatype/timestamp.h */
+ if (result->zone <= -TZDISP_LIMIT || result->zone >= TZDISP_LIMIT)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE),
+ errmsg("time zone displacement out of range")));
+
+ AdjustTimeForTypmod(&(result->time), typmod);
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/*
+ * timetz_send - converts timetz to binary format
+ */
+Datum
+timetz_send(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, time->time);
+ pq_sendint32(&buf, time->zone);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+timetztypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anytime_typmodin(true, ta));
+}
+
+Datum
+timetztypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anytime_typmodout(true, typmod));
+}
+
+
+/* timetz2tm()
+ * Convert TIME WITH TIME ZONE data type to POSIX time structure.
+ */
+int
+timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp)
+{
+ TimeOffset trem = time->time;
+
+ tm->tm_hour = trem / USECS_PER_HOUR;
+ trem -= tm->tm_hour * USECS_PER_HOUR;
+ tm->tm_min = trem / USECS_PER_MINUTE;
+ trem -= tm->tm_min * USECS_PER_MINUTE;
+ tm->tm_sec = trem / USECS_PER_SEC;
+ *fsec = trem - tm->tm_sec * USECS_PER_SEC;
+
+ if (tzp != NULL)
+ *tzp = time->zone;
+
+ return 0;
+}
+
+/* timetz_scale()
+ * Adjust time type for specified scale factor.
+ * Used by PostgreSQL type system to stuff columns.
+ */
+Datum
+timetz_scale(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ TimeTzADT *result;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = time->time;
+ result->zone = time->zone;
+
+ AdjustTimeForTypmod(&(result->time), typmod);
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+
+static int
+timetz_cmp_internal(TimeTzADT *time1, TimeTzADT *time2)
+{
+ TimeOffset t1,
+ t2;
+
+ /* Primary sort is by true (GMT-equivalent) time */
+ t1 = time1->time + (time1->zone * USECS_PER_SEC);
+ t2 = time2->time + (time2->zone * USECS_PER_SEC);
+
+ if (t1 > t2)
+ return 1;
+ if (t1 < t2)
+ return -1;
+
+ /*
+ * If same GMT time, sort by timezone; we only want to say that two
+ * timetz's are equal if both the time and zone parts are equal.
+ */
+ if (time1->zone > time2->zone)
+ return 1;
+ if (time1->zone < time2->zone)
+ return -1;
+
+ return 0;
+}
+
+Datum
+timetz_eq(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) == 0);
+}
+
+Datum
+timetz_ne(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) != 0);
+}
+
+Datum
+timetz_lt(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) < 0);
+}
+
+Datum
+timetz_le(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) <= 0);
+}
+
+Datum
+timetz_gt(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) > 0);
+}
+
+Datum
+timetz_ge(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_BOOL(timetz_cmp_internal(time1, time2) >= 0);
+}
+
+Datum
+timetz_cmp(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+
+ PG_RETURN_INT32(timetz_cmp_internal(time1, time2));
+}
+
+Datum
+timetz_hash(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *key = PG_GETARG_TIMETZADT_P(0);
+ uint32 thash;
+
+ /*
+ * To avoid any problems with padding bytes in the struct, we figure the
+ * field hashes separately and XOR them.
+ */
+ thash = DatumGetUInt32(DirectFunctionCall1(hashint8,
+ Int64GetDatumFast(key->time)));
+ thash ^= DatumGetUInt32(hash_uint32(key->zone));
+ PG_RETURN_UINT32(thash);
+}
+
+Datum
+timetz_hash_extended(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *key = PG_GETARG_TIMETZADT_P(0);
+ Datum seed = PG_GETARG_DATUM(1);
+ uint64 thash;
+
+ /* Same approach as timetz_hash */
+ thash = DatumGetUInt64(DirectFunctionCall2(hashint8extended,
+ Int64GetDatumFast(key->time),
+ seed));
+ thash ^= DatumGetUInt64(hash_uint32_extended(key->zone,
+ DatumGetInt64(seed)));
+ PG_RETURN_UINT64(thash);
+}
+
+Datum
+timetz_larger(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+ TimeTzADT *result;
+
+ if (timetz_cmp_internal(time1, time2) > 0)
+ result = time1;
+ else
+ result = time2;
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+Datum
+timetz_smaller(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
+ TimeTzADT *result;
+
+ if (timetz_cmp_internal(time1, time2) < 0)
+ result = time1;
+ else
+ result = time2;
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/* timetz_pl_interval()
+ * Add interval to timetz.
+ */
+Datum
+timetz_pl_interval(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeTzADT *result;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = time->time + span->time;
+ result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
+ if (result->time < INT64CONST(0))
+ result->time += USECS_PER_DAY;
+
+ result->zone = time->zone;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/* timetz_mi_interval()
+ * Subtract interval from timetz.
+ */
+Datum
+timetz_mi_interval(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeTzADT *result;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = time->time - span->time;
+ result->time -= result->time / USECS_PER_DAY * USECS_PER_DAY;
+ if (result->time < INT64CONST(0))
+ result->time += USECS_PER_DAY;
+
+ result->zone = time->zone;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/*
+ * in_range support function for timetz.
+ */
+Datum
+in_range_timetz_interval(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *val = PG_GETARG_TIMETZADT_P(0);
+ TimeTzADT *base = PG_GETARG_TIMETZADT_P(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ TimeTzADT sum;
+
+ /*
+ * Like timetz_pl_interval/timetz_mi_interval, we disregard the month and
+ * day fields of the offset. So our test for negative should too.
+ */
+ if (offset->time < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /*
+ * We can't use timetz_pl_interval/timetz_mi_interval here, because their
+ * wraparound behavior would give wrong (or at least undesirable) answers.
+ * Fortunately the equivalent non-wrapping behavior is trivial, especially
+ * since we don't worry about integer overflow.
+ */
+ if (sub)
+ sum.time = base->time - offset->time;
+ else
+ sum.time = base->time + offset->time;
+ sum.zone = base->zone;
+
+ if (less)
+ PG_RETURN_BOOL(timetz_cmp_internal(val, &sum) <= 0);
+ else
+ PG_RETURN_BOOL(timetz_cmp_internal(val, &sum) >= 0);
+}
+
+/* overlaps_timetz() --- implements the SQL OVERLAPS operator.
+ *
+ * Algorithm is per SQL spec. This is much harder than you'd think
+ * because the spec requires us to deliver a non-null answer in some cases
+ * where some of the inputs are null.
+ */
+Datum
+overlaps_timetz(PG_FUNCTION_ARGS)
+{
+ /*
+ * The arguments are TimeTzADT *, but we leave them as generic Datums for
+ * convenience of notation --- and to avoid dereferencing nulls.
+ */
+ Datum ts1 = PG_GETARG_DATUM(0);
+ Datum te1 = PG_GETARG_DATUM(1);
+ Datum ts2 = PG_GETARG_DATUM(2);
+ Datum te2 = PG_GETARG_DATUM(3);
+ bool ts1IsNull = PG_ARGISNULL(0);
+ bool te1IsNull = PG_ARGISNULL(1);
+ bool ts2IsNull = PG_ARGISNULL(2);
+ bool te2IsNull = PG_ARGISNULL(3);
+
+#define TIMETZ_GT(t1,t2) \
+ DatumGetBool(DirectFunctionCall2(timetz_gt,t1,t2))
+#define TIMETZ_LT(t1,t2) \
+ DatumGetBool(DirectFunctionCall2(timetz_lt,t1,t2))
+
+ /*
+ * If both endpoints of interval 1 are null, the result is null (unknown).
+ * If just one endpoint is null, take ts1 as the non-null one. Otherwise,
+ * take ts1 as the lesser endpoint.
+ */
+ if (ts1IsNull)
+ {
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts1 = te1;
+ te1IsNull = true;
+ }
+ else if (!te1IsNull)
+ {
+ if (TIMETZ_GT(ts1, te1))
+ {
+ Datum tt = ts1;
+
+ ts1 = te1;
+ te1 = tt;
+ }
+ }
+
+ /* Likewise for interval 2. */
+ if (ts2IsNull)
+ {
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts2 = te2;
+ te2IsNull = true;
+ }
+ else if (!te2IsNull)
+ {
+ if (TIMETZ_GT(ts2, te2))
+ {
+ Datum tt = ts2;
+
+ ts2 = te2;
+ te2 = tt;
+ }
+ }
+
+ /*
+ * At this point neither ts1 nor ts2 is null, so we can consider three
+ * cases: ts1 > ts2, ts1 < ts2, ts1 = ts2
+ */
+ if (TIMETZ_GT(ts1, ts2))
+ {
+ /*
+ * This case is ts1 < te2 OR te1 < te2, which may look redundant but
+ * in the presence of nulls it's not quite completely so.
+ */
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ if (TIMETZ_LT(ts1, te2))
+ PG_RETURN_BOOL(true);
+ if (te1IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te1 is not null then we had ts1 <= te1 above, and we just found
+ * ts1 >= te2, hence te1 >= te2.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else if (TIMETZ_LT(ts1, ts2))
+ {
+ /* This case is ts2 < te1 OR te2 < te1 */
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ if (TIMETZ_LT(ts2, te1))
+ PG_RETURN_BOOL(true);
+ if (te2IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te2 is not null then we had ts2 <= te2 above, and we just found
+ * ts2 >= te1, hence te2 >= te1.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else
+ {
+ /*
+ * For ts1 = ts2 the spec says te1 <> te2 OR te1 = te2, which is a
+ * rather silly way of saying "true if both are nonnull, else null".
+ */
+ if (te1IsNull || te2IsNull)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(true);
+ }
+
+#undef TIMETZ_GT
+#undef TIMETZ_LT
+}
+
+
+Datum
+timetz_time(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *timetz = PG_GETARG_TIMETZADT_P(0);
+ TimeADT result;
+
+ /* swallow the time zone and just return the time */
+ result = timetz->time;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+
+Datum
+time_timetz(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ TimeTzADT *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ GetCurrentDateTime(tm);
+ time2tm(time, tm, &fsec);
+ tz = DetermineTimeZoneOffset(tm, session_timezone);
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = time;
+ result->zone = tz;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+
+/* timestamptz_timetz()
+ * Convert timestamp to timetz data type.
+ */
+Datum
+timestamptz_timetz(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMP(0);
+ TimeTzADT *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ fsec_t fsec;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_NULL();
+
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ tm2timetz(tm, fsec, tz, result);
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+
+/* datetimetz_timestamptz()
+ * Convert date and timetz to timestamp with time zone data type.
+ * Timestamp is stored in GMT, so add the time zone
+ * stored with the timetz to the result.
+ * - thomas 2000-03-10
+ */
+Datum
+datetimetz_timestamptz(PG_FUNCTION_ARGS)
+{
+ DateADT date = PG_GETARG_DATEADT(0);
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(1);
+ TimestampTz result;
+
+ if (DATE_IS_NOBEGIN(date))
+ TIMESTAMP_NOBEGIN(result);
+ else if (DATE_IS_NOEND(date))
+ TIMESTAMP_NOEND(result);
+ else
+ {
+ /*
+ * Date's range is wider than timestamp's, so check for boundaries.
+ * Since dates have the same minimum values as timestamps, only upper
+ * boundary need be checked for overflow.
+ */
+ if (date >= (TIMESTAMP_END_JULIAN - POSTGRES_EPOCH_JDATE))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range for timestamp")));
+ result = date * USECS_PER_DAY + time->time + time->zone * USECS_PER_SEC;
+
+ /*
+ * Since it is possible to go beyond allowed timestamptz range because
+ * of time zone, check for allowed timestamp range after adding tz.
+ */
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range for timestamp")));
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+
+/* timetz_part() and extract_timetz()
+ * Extract specified field from time type.
+ */
+static Datum
+timetz_part_common(PG_FUNCTION_ARGS, bool retnumeric)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(1);
+ int64 intresult;
+ int type,
+ val;
+ char *lowunits;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ int tz;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ timetz2tm(time, tm, &fsec, &tz);
+
+ switch (val)
+ {
+ case DTK_TZ:
+ intresult = -tz;
+ break;
+
+ case DTK_TZ_MINUTE:
+ intresult = (-tz / SECS_PER_MINUTE) % MINS_PER_HOUR;
+ break;
+
+ case DTK_TZ_HOUR:
+ intresult = -tz / SECS_PER_HOUR;
+ break;
+
+ case DTK_MICROSEC:
+ intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
+ break;
+
+ case DTK_MILLISEC:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec * 1000 + fsec / 1000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 3));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
+ break;
+
+ case DTK_SECOND:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec + fsec / 1'000'000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 6));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
+ break;
+
+ case DTK_MINUTE:
+ intresult = tm->tm_min;
+ break;
+
+ case DTK_HOUR:
+ intresult = tm->tm_hour;
+ break;
+
+ case DTK_DAY:
+ case DTK_MONTH:
+ case DTK_QUARTER:
+ case DTK_YEAR:
+ case DTK_DECADE:
+ case DTK_CENTURY:
+ case DTK_MILLENNIUM:
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMETZOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV && val == DTK_EPOCH)
+ {
+ if (retnumeric)
+ /*---
+ * time->time / 1'000'000 + time->zone
+ * = (time->time + time->zone * 1'000'000) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(time->time + time->zone * INT64CONST(1000000), 6));
+ else
+ PG_RETURN_FLOAT8(time->time / 1000000.0 + time->zone);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMETZOID))));
+ intresult = 0;
+ }
+
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+ else
+ PG_RETURN_FLOAT8(intresult);
+}
+
+
+Datum
+timetz_part(PG_FUNCTION_ARGS)
+{
+ return timetz_part_common(fcinfo, false);
+}
+
+Datum
+extract_timetz(PG_FUNCTION_ARGS)
+{
+ return timetz_part_common(fcinfo, true);
+}
+
+/* timetz_zone()
+ * Encode time with time zone type with specified time zone.
+ * Applies DST rules as of the transaction start time.
+ */
+Datum
+timetz_zone(PG_FUNCTION_ARGS)
+{
+ text *zone = PG_GETARG_TEXT_PP(0);
+ TimeTzADT *t = PG_GETARG_TIMETZADT_P(1);
+ TimeTzADT *result;
+ int tz;
+ char tzname[TZ_STRLEN_MAX + 1];
+ char *lowzone;
+ int type,
+ val;
+ pg_tz *tzp;
+
+ /*
+ * Look up the requested timezone. First we look in the timezone
+ * abbreviation table (to handle cases like "EST"), and if that fails, we
+ * look in the timezone database (to handle cases like
+ * "America/New_York"). (This matches the order in which timestamp input
+ * checks the cases; it's important because the timezone database unwisely
+ * uses a few zone names that are identical to offset abbreviations.)
+ */
+ text_to_cstring_buffer(zone, tzname, sizeof(tzname));
+
+ /* DecodeTimezoneAbbrev requires lowercase input */
+ lowzone = downcase_truncate_identifier(tzname,
+ strlen(tzname),
+ false);
+
+ type = DecodeTimezoneAbbrev(0, lowzone, &val, &tzp);
+
+ if (type == TZ || type == DTZ)
+ {
+ /* fixed-offset abbreviation */
+ tz = -val;
+ }
+ else if (type == DYNTZ)
+ {
+ /* dynamic-offset abbreviation, resolve using transaction start time */
+ TimestampTz now = GetCurrentTransactionStartTimestamp();
+ int isdst;
+
+ tz = DetermineTimeZoneAbbrevOffsetTS(now, tzname, tzp, &isdst);
+ }
+ else
+ {
+ /* try it as a full zone name */
+ tzp = pg_tzset(tzname);
+ if (tzp)
+ {
+ /* Get the offset-from-GMT that is valid now for the zone */
+ TimestampTz now = GetCurrentTransactionStartTimestamp();
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ if (timestamp2tm(now, &tz, &tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+ tz = 0; /* keep compiler quiet */
+ }
+ }
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = t->time + (t->zone - tz) * USECS_PER_SEC;
+ /* C99 modulo has the wrong sign convention for negative input */
+ while (result->time < INT64CONST(0))
+ result->time += USECS_PER_DAY;
+ if (result->time >= USECS_PER_DAY)
+ result->time %= USECS_PER_DAY;
+
+ result->zone = tz;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/* timetz_izone()
+ * Encode time with time zone type with specified time interval as time zone.
+ */
+Datum
+timetz_izone(PG_FUNCTION_ARGS)
+{
+ Interval *zone = PG_GETARG_INTERVAL_P(0);
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(1);
+ TimeTzADT *result;
+ int tz;
+
+ if (zone->month != 0 || zone->day != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("interval time zone \"%s\" must not include months or days",
+ DatumGetCString(DirectFunctionCall1(interval_out,
+ PointerGetDatum(zone))))));
+
+ tz = -(zone->time / USECS_PER_SEC);
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = time->time + (time->zone - tz) * USECS_PER_SEC;
+ /* C99 modulo has the wrong sign convention for negative input */
+ while (result->time < INT64CONST(0))
+ result->time += USECS_PER_DAY;
+ if (result->time >= USECS_PER_DAY)
+ result->time %= USECS_PER_DAY;
+
+ result->zone = tz;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
new file mode 100644
index 0000000..8891133
--- /dev/null
+++ b/src/backend/utils/adt/datetime.c
@@ -0,0 +1,5102 @@
+/*-------------------------------------------------------------------------
+ *
+ * datetime.c
+ * Support functions for date/time types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/datetime.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "access/xact.h"
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "common/string.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "nodes/nodeFuncs.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/memutils.h"
+#include "utils/tzparser.h"
+
+static int DecodeNumber(int flen, char *field, bool haveTextMonth,
+ int fmask, int *tmask,
+ struct pg_tm *tm, fsec_t *fsec, bool *is2digits);
+static int DecodeNumberField(int len, char *str,
+ int fmask, int *tmask,
+ struct pg_tm *tm, fsec_t *fsec, bool *is2digits);
+static int DecodeTimeCommon(char *str, int fmask, int range,
+ int *tmask, struct pg_itm *itm);
+static int DecodeTime(char *str, int fmask, int range,
+ int *tmask, struct pg_tm *tm, fsec_t *fsec);
+static int DecodeTimeForInterval(char *str, int fmask, int range,
+ int *tmask, struct pg_itm_in *itm_in);
+static const datetkn *datebsearch(const char *key, const datetkn *base, int nel);
+static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits,
+ struct pg_tm *tm);
+static char *AppendSeconds(char *cp, int sec, fsec_t fsec,
+ int precision, bool fillzeros);
+static bool int64_multiply_add(int64 val, int64 multiplier, int64 *sum);
+static bool AdjustFractMicroseconds(double frac, int64 scale,
+ struct pg_itm_in *itm_in);
+static bool AdjustFractDays(double frac, int scale,
+ struct pg_itm_in *itm_in);
+static bool AdjustFractYears(double frac, int scale,
+ struct pg_itm_in *itm_in);
+static bool AdjustMicroseconds(int64 val, double fval, int64 scale,
+ struct pg_itm_in *itm_in);
+static bool AdjustDays(int64 val, int scale,
+ struct pg_itm_in *itm_in);
+static bool AdjustMonths(int64 val, struct pg_itm_in *itm_in);
+static bool AdjustYears(int64 val, int scale,
+ struct pg_itm_in *itm_in);
+static int DetermineTimeZoneOffsetInternal(struct pg_tm *tm, pg_tz *tzp,
+ pg_time_t *tp);
+static bool DetermineTimeZoneAbbrevOffsetInternal(pg_time_t t,
+ const char *abbr, pg_tz *tzp,
+ int *offset, int *isdst);
+static pg_tz *FetchDynamicTimeZone(TimeZoneAbbrevTable *tbl, const datetkn *tp);
+
+
+const int day_tab[2][13] =
+{
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}
+};
+
+const char *const months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL};
+
+const char *const days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
+"Thursday", "Friday", "Saturday", NULL};
+
+
+/*****************************************************************************
+ * PRIVATE ROUTINES *
+ *****************************************************************************/
+
+/*
+ * datetktbl holds date/time keywords.
+ *
+ * Note that this table must be strictly alphabetically ordered to allow an
+ * O(ln(N)) search algorithm to be used.
+ *
+ * The token field must be NUL-terminated; we truncate entries to TOKMAXLEN
+ * characters to fit.
+ *
+ * The static table contains no TZ, DTZ, or DYNTZ entries; rather those
+ * are loaded from configuration files and stored in zoneabbrevtbl, whose
+ * abbrevs[] field has the same format as the static datetktbl.
+ */
+static const datetkn datetktbl[] = {
+ /* token, type, value */
+ {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
+ {DA_D, ADBC, AD}, /* "ad" for years > 0 */
+ {"allballs", RESERV, DTK_ZULU}, /* 00:00:00 */
+ {"am", AMPM, AM},
+ {"apr", MONTH, 4},
+ {"april", MONTH, 4},
+ {"at", IGNORE_DTF, 0}, /* "at" (throwaway) */
+ {"aug", MONTH, 8},
+ {"august", MONTH, 8},
+ {DB_C, ADBC, BC}, /* "bc" for years <= 0 */
+ {"d", UNITS, DTK_DAY}, /* "day of month" for ISO input */
+ {"dec", MONTH, 12},
+ {"december", MONTH, 12},
+ {"dow", UNITS, DTK_DOW}, /* day of week */
+ {"doy", UNITS, DTK_DOY}, /* day of year */
+ {"dst", DTZMOD, SECS_PER_HOUR},
+ {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
+ {"feb", MONTH, 2},
+ {"february", MONTH, 2},
+ {"fri", DOW, 5},
+ {"friday", DOW, 5},
+ {"h", UNITS, DTK_HOUR}, /* "hour" */
+ {LATE, RESERV, DTK_LATE}, /* "infinity" reserved for "late time" */
+ {"isodow", UNITS, DTK_ISODOW}, /* ISO day of week, Sunday == 7 */
+ {"isoyear", UNITS, DTK_ISOYEAR}, /* year in terms of the ISO week date */
+ {"j", UNITS, DTK_JULIAN},
+ {"jan", MONTH, 1},
+ {"january", MONTH, 1},
+ {"jd", UNITS, DTK_JULIAN},
+ {"jul", MONTH, 7},
+ {"julian", UNITS, DTK_JULIAN},
+ {"july", MONTH, 7},
+ {"jun", MONTH, 6},
+ {"june", MONTH, 6},
+ {"m", UNITS, DTK_MONTH}, /* "month" for ISO input */
+ {"mar", MONTH, 3},
+ {"march", MONTH, 3},
+ {"may", MONTH, 5},
+ {"mm", UNITS, DTK_MINUTE}, /* "minute" for ISO input */
+ {"mon", DOW, 1},
+ {"monday", DOW, 1},
+ {"nov", MONTH, 11},
+ {"november", MONTH, 11},
+ {NOW, RESERV, DTK_NOW}, /* current transaction time */
+ {"oct", MONTH, 10},
+ {"october", MONTH, 10},
+ {"on", IGNORE_DTF, 0}, /* "on" (throwaway) */
+ {"pm", AMPM, PM},
+ {"s", UNITS, DTK_SECOND}, /* "seconds" for ISO input */
+ {"sat", DOW, 6},
+ {"saturday", DOW, 6},
+ {"sep", MONTH, 9},
+ {"sept", MONTH, 9},
+ {"september", MONTH, 9},
+ {"sun", DOW, 0},
+ {"sunday", DOW, 0},
+ {"t", ISOTIME, DTK_TIME}, /* Filler for ISO time fields */
+ {"thu", DOW, 4},
+ {"thur", DOW, 4},
+ {"thurs", DOW, 4},
+ {"thursday", DOW, 4},
+ {TODAY, RESERV, DTK_TODAY}, /* midnight */
+ {TOMORROW, RESERV, DTK_TOMORROW}, /* tomorrow midnight */
+ {"tue", DOW, 2},
+ {"tues", DOW, 2},
+ {"tuesday", DOW, 2},
+ {"wed", DOW, 3},
+ {"wednesday", DOW, 3},
+ {"weds", DOW, 3},
+ {"y", UNITS, DTK_YEAR}, /* "year" for ISO input */
+ {YESTERDAY, RESERV, DTK_YESTERDAY} /* yesterday midnight */
+};
+
+static const int szdatetktbl = sizeof datetktbl / sizeof datetktbl[0];
+
+/*
+ * deltatktbl: same format as datetktbl, but holds keywords used to represent
+ * time units (eg, for intervals, and for EXTRACT).
+ */
+static const datetkn deltatktbl[] = {
+ /* token, type, value */
+ {"@", IGNORE_DTF, 0}, /* postgres relative prefix */
+ {DAGO, AGO, 0}, /* "ago" indicates negative time offset */
+ {"c", UNITS, DTK_CENTURY}, /* "century" relative */
+ {"cent", UNITS, DTK_CENTURY}, /* "century" relative */
+ {"centuries", UNITS, DTK_CENTURY}, /* "centuries" relative */
+ {DCENTURY, UNITS, DTK_CENTURY}, /* "century" relative */
+ {"d", UNITS, DTK_DAY}, /* "day" relative */
+ {DDAY, UNITS, DTK_DAY}, /* "day" relative */
+ {"days", UNITS, DTK_DAY}, /* "days" relative */
+ {"dec", UNITS, DTK_DECADE}, /* "decade" relative */
+ {DDECADE, UNITS, DTK_DECADE}, /* "decade" relative */
+ {"decades", UNITS, DTK_DECADE}, /* "decades" relative */
+ {"decs", UNITS, DTK_DECADE}, /* "decades" relative */
+ {"h", UNITS, DTK_HOUR}, /* "hour" relative */
+ {DHOUR, UNITS, DTK_HOUR}, /* "hour" relative */
+ {"hours", UNITS, DTK_HOUR}, /* "hours" relative */
+ {"hr", UNITS, DTK_HOUR}, /* "hour" relative */
+ {"hrs", UNITS, DTK_HOUR}, /* "hours" relative */
+ {"m", UNITS, DTK_MINUTE}, /* "minute" relative */
+ {"microsecon", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
+ {"mil", UNITS, DTK_MILLENNIUM}, /* "millennium" relative */
+ {"millennia", UNITS, DTK_MILLENNIUM}, /* "millennia" relative */
+ {DMILLENNIUM, UNITS, DTK_MILLENNIUM}, /* "millennium" relative */
+ {"millisecon", UNITS, DTK_MILLISEC}, /* relative */
+ {"mils", UNITS, DTK_MILLENNIUM}, /* "millennia" relative */
+ {"min", UNITS, DTK_MINUTE}, /* "minute" relative */
+ {"mins", UNITS, DTK_MINUTE}, /* "minutes" relative */
+ {DMINUTE, UNITS, DTK_MINUTE}, /* "minute" relative */
+ {"minutes", UNITS, DTK_MINUTE}, /* "minutes" relative */
+ {"mon", UNITS, DTK_MONTH}, /* "months" relative */
+ {"mons", UNITS, DTK_MONTH}, /* "months" relative */
+ {DMONTH, UNITS, DTK_MONTH}, /* "month" relative */
+ {"months", UNITS, DTK_MONTH},
+ {"ms", UNITS, DTK_MILLISEC},
+ {"msec", UNITS, DTK_MILLISEC},
+ {DMILLISEC, UNITS, DTK_MILLISEC},
+ {"mseconds", UNITS, DTK_MILLISEC},
+ {"msecs", UNITS, DTK_MILLISEC},
+ {"qtr", UNITS, DTK_QUARTER}, /* "quarter" relative */
+ {DQUARTER, UNITS, DTK_QUARTER}, /* "quarter" relative */
+ {"s", UNITS, DTK_SECOND},
+ {"sec", UNITS, DTK_SECOND},
+ {DSECOND, UNITS, DTK_SECOND},
+ {"seconds", UNITS, DTK_SECOND},
+ {"secs", UNITS, DTK_SECOND},
+ {DTIMEZONE, UNITS, DTK_TZ}, /* "timezone" time offset */
+ {"timezone_h", UNITS, DTK_TZ_HOUR}, /* timezone hour units */
+ {"timezone_m", UNITS, DTK_TZ_MINUTE}, /* timezone minutes units */
+ {"us", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
+ {"usec", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
+ {DMICROSEC, UNITS, DTK_MICROSEC}, /* "microsecond" relative */
+ {"useconds", UNITS, DTK_MICROSEC}, /* "microseconds" relative */
+ {"usecs", UNITS, DTK_MICROSEC}, /* "microseconds" relative */
+ {"w", UNITS, DTK_WEEK}, /* "week" relative */
+ {DWEEK, UNITS, DTK_WEEK}, /* "week" relative */
+ {"weeks", UNITS, DTK_WEEK}, /* "weeks" relative */
+ {"y", UNITS, DTK_YEAR}, /* "year" relative */
+ {DYEAR, UNITS, DTK_YEAR}, /* "year" relative */
+ {"years", UNITS, DTK_YEAR}, /* "years" relative */
+ {"yr", UNITS, DTK_YEAR}, /* "year" relative */
+ {"yrs", UNITS, DTK_YEAR} /* "years" relative */
+};
+
+static const int szdeltatktbl = sizeof deltatktbl / sizeof deltatktbl[0];
+
+static TimeZoneAbbrevTable *zoneabbrevtbl = NULL;
+
+/* Caches of recent lookup results in the above tables */
+
+static const datetkn *datecache[MAXDATEFIELDS] = {NULL};
+
+static const datetkn *deltacache[MAXDATEFIELDS] = {NULL};
+
+static const datetkn *abbrevcache[MAXDATEFIELDS] = {NULL};
+
+
+/*
+ * Calendar time to Julian date conversions.
+ * Julian date is commonly used in astronomical applications,
+ * since it is numerically accurate and computationally simple.
+ * The algorithms here will accurately convert between Julian day
+ * and calendar date for all non-negative Julian days
+ * (i.e. from Nov 24, -4713 on).
+ *
+ * Rewritten to eliminate overflow problems. This now allows the
+ * routines to work correctly for all Julian day counts from
+ * 0 to 2147483647 (Nov 24, -4713 to Jun 3, 5874898) assuming
+ * a 32-bit integer. Longer types should also work to the limits
+ * of their precision.
+ *
+ * Actually, date2j() will work sanely, in the sense of producing
+ * valid negative Julian dates, significantly before Nov 24, -4713.
+ * We rely on it to do so back to Nov 1, -4713; see IS_VALID_JULIAN()
+ * and associated commentary in timestamp.h.
+ */
+
+int
+date2j(int y, int m, int d)
+{
+ int julian;
+ int century;
+
+ if (m > 2)
+ {
+ m += 1;
+ y += 4800;
+ }
+ else
+ {
+ m += 13;
+ y += 4799;
+ }
+
+ century = y / 100;
+ julian = y * 365 - 32167;
+ julian += y / 4 - century + century / 4;
+ julian += 7834 * m / 256 + d;
+
+ return julian;
+} /* date2j() */
+
+void
+j2date(int jd, int *year, int *month, int *day)
+{
+ unsigned int julian;
+ unsigned int quad;
+ unsigned int extra;
+ int y;
+
+ julian = jd;
+ julian += 32044;
+ quad = julian / 146097;
+ extra = (julian - quad * 146097) * 4 + 3;
+ julian += 60 + quad * 3 + extra / 146097;
+ quad = julian / 1461;
+ julian -= quad * 1461;
+ y = julian * 4 / 1461;
+ julian = ((y != 0) ? ((julian + 305) % 365) : ((julian + 306) % 366))
+ + 123;
+ y += quad * 4;
+ *year = y - 4800;
+ quad = julian * 2141 / 65536;
+ *day = julian - 7834 * quad / 256;
+ *month = (quad + 10) % MONTHS_PER_YEAR + 1;
+} /* j2date() */
+
+
+/*
+ * j2day - convert Julian date to day-of-week (0..6 == Sun..Sat)
+ *
+ * Note: various places use the locution j2day(date - 1) to produce a
+ * result according to the convention 0..6 = Mon..Sun. This is a bit of
+ * a crock, but will work as long as the computation here is just a modulo.
+ */
+int
+j2day(int date)
+{
+ date += 1;
+ date %= 7;
+ /* Cope if division truncates towards zero, as it probably does */
+ if (date < 0)
+ date += 7;
+
+ return date;
+} /* j2day() */
+
+
+/*
+ * GetCurrentDateTime()
+ *
+ * Get the transaction start time ("now()") broken down as a struct pg_tm,
+ * converted according to the session timezone setting.
+ *
+ * This is just a convenience wrapper for GetCurrentTimeUsec, to cover the
+ * case where caller doesn't need either fractional seconds or tz offset.
+ */
+void
+GetCurrentDateTime(struct pg_tm *tm)
+{
+ fsec_t fsec;
+
+ GetCurrentTimeUsec(tm, &fsec, NULL);
+}
+
+/*
+ * GetCurrentTimeUsec()
+ *
+ * Get the transaction start time ("now()") broken down as a struct pg_tm,
+ * including fractional seconds and timezone offset. The time is converted
+ * according to the session timezone setting.
+ *
+ * Callers may pass tzp = NULL if they don't need the offset, but this does
+ * not affect the conversion behavior (unlike timestamp2tm()).
+ *
+ * Internally, we cache the result, since this could be called many times
+ * in a transaction, within which now() doesn't change.
+ */
+void
+GetCurrentTimeUsec(struct pg_tm *tm, fsec_t *fsec, int *tzp)
+{
+ TimestampTz cur_ts = GetCurrentTransactionStartTimestamp();
+
+ /*
+ * The cache key must include both current time and current timezone. By
+ * representing the timezone by just a pointer, we're assuming that
+ * distinct timezone settings could never have the same pointer value.
+ * This is true by virtue of the hashtable used inside pg_tzset();
+ * however, it might need another look if we ever allow entries in that
+ * hash to be recycled.
+ */
+ static TimestampTz cache_ts = 0;
+ static pg_tz *cache_timezone = NULL;
+ static struct pg_tm cache_tm;
+ static fsec_t cache_fsec;
+ static int cache_tz;
+
+ if (cur_ts != cache_ts || session_timezone != cache_timezone)
+ {
+ /*
+ * Make sure cache is marked invalid in case of error after partial
+ * update within timestamp2tm.
+ */
+ cache_timezone = NULL;
+
+ /*
+ * Perform the computation, storing results into cache. We do not
+ * really expect any error here, since current time surely ought to be
+ * within range, but check just for sanity's sake.
+ */
+ if (timestamp2tm(cur_ts, &cache_tz, &cache_tm, &cache_fsec,
+ NULL, session_timezone) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* OK, so mark the cache valid. */
+ cache_ts = cur_ts;
+ cache_timezone = session_timezone;
+ }
+
+ *tm = cache_tm;
+ *fsec = cache_fsec;
+ if (tzp != NULL)
+ *tzp = cache_tz;
+}
+
+
+/*
+ * Append seconds and fractional seconds (if any) at *cp.
+ *
+ * precision is the max number of fraction digits, fillzeros says to
+ * pad to two integral-seconds digits.
+ *
+ * Returns a pointer to the new end of string. No NUL terminator is put
+ * there; callers are responsible for NUL terminating str themselves.
+ *
+ * Note that any sign is stripped from the input sec and fsec values.
+ */
+static char *
+AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros)
+{
+ Assert(precision >= 0);
+
+ if (fillzeros)
+ cp = pg_ultostr_zeropad(cp, Abs(sec), 2);
+ else
+ cp = pg_ultostr(cp, Abs(sec));
+
+ /* fsec_t is just an int32 */
+ if (fsec != 0)
+ {
+ int32 value = Abs(fsec);
+ char *end = &cp[precision + 1];
+ bool gotnonzero = false;
+
+ *cp++ = '.';
+
+ /*
+ * Append the fractional seconds part. Note that we don't want any
+ * trailing zeros here, so since we're building the number in reverse
+ * we'll skip appending zeros until we've output a non-zero digit.
+ */
+ while (precision--)
+ {
+ int32 oldval = value;
+ int32 remainder;
+
+ value /= 10;
+ remainder = oldval - value * 10;
+
+ /* check if we got a non-zero */
+ if (remainder)
+ gotnonzero = true;
+
+ if (gotnonzero)
+ cp[precision] = '0' + remainder;
+ else
+ end = &cp[precision];
+ }
+
+ /*
+ * If we still have a non-zero value then precision must have not been
+ * enough to print the number. We punt the problem to pg_ultostr(),
+ * which will generate a correct answer in the minimum valid width.
+ */
+ if (value)
+ return pg_ultostr(cp, Abs(fsec));
+
+ return end;
+ }
+ else
+ return cp;
+}
+
+
+/*
+ * Variant of above that's specialized to timestamp case.
+ *
+ * Returns a pointer to the new end of string. No NUL terminator is put
+ * there; callers are responsible for NUL terminating str themselves.
+ */
+static char *
+AppendTimestampSeconds(char *cp, struct pg_tm *tm, fsec_t fsec)
+{
+ return AppendSeconds(cp, tm->tm_sec, fsec, MAX_TIMESTAMP_PRECISION, true);
+}
+
+
+/*
+ * Add val * multiplier to *sum.
+ * Returns true if successful, false on overflow.
+ */
+static bool
+int64_multiply_add(int64 val, int64 multiplier, int64 *sum)
+{
+ int64 product;
+
+ if (pg_mul_s64_overflow(val, multiplier, &product) ||
+ pg_add_s64_overflow(*sum, product, sum))
+ return false;
+ return true;
+}
+
+/*
+ * Multiply frac by scale (to produce microseconds) and add to itm_in->tm_usec.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustFractMicroseconds(double frac, int64 scale,
+ struct pg_itm_in *itm_in)
+{
+ int64 usec;
+
+ /* Fast path for common case */
+ if (frac == 0)
+ return true;
+
+ /*
+ * We assume the input frac has abs value less than 1, so overflow of frac
+ * or usec is not an issue for interesting values of scale.
+ */
+ frac *= scale;
+ usec = (int64) frac;
+
+ /* Round off any fractional microsecond */
+ frac -= usec;
+ if (frac > 0.5)
+ usec++;
+ else if (frac < -0.5)
+ usec--;
+
+ return !pg_add_s64_overflow(itm_in->tm_usec, usec, &itm_in->tm_usec);
+}
+
+/*
+ * Multiply frac by scale (to produce days). Add the integral part of the
+ * result to itm_in->tm_mday, the fractional part to itm_in->tm_usec.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustFractDays(double frac, int scale,
+ struct pg_itm_in *itm_in)
+{
+ int extra_days;
+
+ /* Fast path for common case */
+ if (frac == 0)
+ return true;
+
+ /*
+ * We assume the input frac has abs value less than 1, so overflow of frac
+ * or extra_days is not an issue.
+ */
+ frac *= scale;
+ extra_days = (int) frac;
+
+ /* ... but this could overflow, if tm_mday is already nonzero */
+ if (pg_add_s32_overflow(itm_in->tm_mday, extra_days, &itm_in->tm_mday))
+ return false;
+
+ /* Handle any fractional day */
+ frac -= extra_days;
+ return AdjustFractMicroseconds(frac, USECS_PER_DAY, itm_in);
+}
+
+/*
+ * Multiply frac by scale (to produce years), then further scale up to months.
+ * Add the integral part of the result to itm_in->tm_mon, discarding any
+ * fractional part.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustFractYears(double frac, int scale,
+ struct pg_itm_in *itm_in)
+{
+ /*
+ * As above, we assume abs(frac) < 1, so this can't overflow for any
+ * interesting value of scale.
+ */
+ int extra_months = (int) rint(frac * scale * MONTHS_PER_YEAR);
+
+ return !pg_add_s32_overflow(itm_in->tm_mon, extra_months, &itm_in->tm_mon);
+}
+
+/*
+ * Add (val + fval) * scale to itm_in->tm_usec.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustMicroseconds(int64 val, double fval, int64 scale,
+ struct pg_itm_in *itm_in)
+{
+ /* Handle the integer part */
+ if (!int64_multiply_add(val, scale, &itm_in->tm_usec))
+ return false;
+ /* Handle the float part */
+ return AdjustFractMicroseconds(fval, scale, itm_in);
+}
+
+/*
+ * Multiply val by scale (to produce days) and add to itm_in->tm_mday.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustDays(int64 val, int scale, struct pg_itm_in *itm_in)
+{
+ int days;
+
+ if (val < INT_MIN || val > INT_MAX)
+ return false;
+ return !pg_mul_s32_overflow((int32) val, scale, &days) &&
+ !pg_add_s32_overflow(itm_in->tm_mday, days, &itm_in->tm_mday);
+}
+
+/*
+ * Add val to itm_in->tm_mon (no need for scale here, as val is always
+ * in months already).
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustMonths(int64 val, struct pg_itm_in *itm_in)
+{
+ if (val < INT_MIN || val > INT_MAX)
+ return false;
+ return !pg_add_s32_overflow(itm_in->tm_mon, (int32) val, &itm_in->tm_mon);
+}
+
+/*
+ * Multiply val by scale (to produce years) and add to itm_in->tm_year.
+ * Returns true if successful, false if itm_in overflows.
+ */
+static bool
+AdjustYears(int64 val, int scale,
+ struct pg_itm_in *itm_in)
+{
+ int years;
+
+ if (val < INT_MIN || val > INT_MAX)
+ return false;
+ return !pg_mul_s32_overflow((int32) val, scale, &years) &&
+ !pg_add_s32_overflow(itm_in->tm_year, years, &itm_in->tm_year);
+}
+
+
+/*
+ * Parse the fractional part of a number (decimal point and optional digits,
+ * followed by end of string). Returns the fractional value into *frac.
+ *
+ * Returns 0 if successful, DTERR code if bogus input detected.
+ */
+static int
+ParseFraction(char *cp, double *frac)
+{
+ /* Caller should always pass the start of the fraction part */
+ Assert(*cp == '.');
+
+ /*
+ * We want to allow just "." with no digits, but some versions of strtod
+ * will report EINVAL for that, so special-case it.
+ */
+ if (cp[1] == '\0')
+ {
+ *frac = 0;
+ }
+ else
+ {
+ errno = 0;
+ *frac = strtod(cp, &cp);
+ /* check for parse failure */
+ if (*cp != '\0' || errno != 0)
+ return DTERR_BAD_FORMAT;
+ }
+ return 0;
+}
+
+/*
+ * Fetch a fractional-second value with suitable error checking.
+ * Same as ParseFraction except we convert the result to integer microseconds.
+ */
+static int
+ParseFractionalSecond(char *cp, fsec_t *fsec)
+{
+ double frac;
+ int dterr;
+
+ dterr = ParseFraction(cp, &frac);
+ if (dterr)
+ return dterr;
+ *fsec = rint(frac * 1000000);
+ return 0;
+}
+
+
+/* ParseDateTime()
+ * Break string into tokens based on a date/time context.
+ * Returns 0 if successful, DTERR code if bogus input detected.
+ *
+ * timestr - the input string
+ * workbuf - workspace for field string storage. This must be
+ * larger than the largest legal input for this datetime type --
+ * some additional space will be needed to NUL terminate fields.
+ * buflen - the size of workbuf
+ * field[] - pointers to field strings are returned in this array
+ * ftype[] - field type indicators are returned in this array
+ * maxfields - dimensions of the above two arrays
+ * *numfields - set to the actual number of fields detected
+ *
+ * The fields extracted from the input are stored as separate,
+ * null-terminated strings in the workspace at workbuf. Any text is
+ * converted to lower case.
+ *
+ * Several field types are assigned:
+ * DTK_NUMBER - digits and (possibly) a decimal point
+ * DTK_DATE - digits and two delimiters, or digits and text
+ * DTK_TIME - digits, colon delimiters, and possibly a decimal point
+ * DTK_STRING - text (no digits or punctuation)
+ * DTK_SPECIAL - leading "+" or "-" followed by text
+ * DTK_TZ - leading "+" or "-" followed by digits (also eats ':', '.', '-')
+ *
+ * Note that some field types can hold unexpected items:
+ * DTK_NUMBER can hold date fields (yy.ddd)
+ * DTK_STRING can hold months (January) and time zones (PST)
+ * DTK_DATE can hold time zone names (America/New_York, GMT-8)
+ */
+int
+ParseDateTime(const char *timestr, char *workbuf, size_t buflen,
+ char **field, int *ftype, int maxfields, int *numfields)
+{
+ int nf = 0;
+ const char *cp = timestr;
+ char *bufp = workbuf;
+ const char *bufend = workbuf + buflen;
+
+ /*
+ * Set the character pointed-to by "bufptr" to "newchar", and increment
+ * "bufptr". "end" gives the end of the buffer -- we return an error if
+ * there is no space left to append a character to the buffer. Note that
+ * "bufptr" is evaluated twice.
+ */
+#define APPEND_CHAR(bufptr, end, newchar) \
+ do \
+ { \
+ if (((bufptr) + 1) >= (end)) \
+ return DTERR_BAD_FORMAT; \
+ *(bufptr)++ = newchar; \
+ } while (0)
+
+ /* outer loop through fields */
+ while (*cp != '\0')
+ {
+ /* Ignore spaces between fields */
+ if (isspace((unsigned char) *cp))
+ {
+ cp++;
+ continue;
+ }
+
+ /* Record start of current field */
+ if (nf >= maxfields)
+ return DTERR_BAD_FORMAT;
+ field[nf] = bufp;
+
+ /* leading digit? then date or time */
+ if (isdigit((unsigned char) *cp))
+ {
+ APPEND_CHAR(bufp, bufend, *cp++);
+ while (isdigit((unsigned char) *cp))
+ APPEND_CHAR(bufp, bufend, *cp++);
+
+ /* time field? */
+ if (*cp == ':')
+ {
+ ftype[nf] = DTK_TIME;
+ APPEND_CHAR(bufp, bufend, *cp++);
+ while (isdigit((unsigned char) *cp) ||
+ (*cp == ':') || (*cp == '.'))
+ APPEND_CHAR(bufp, bufend, *cp++);
+ }
+ /* date field? allow embedded text month */
+ else if (*cp == '-' || *cp == '/' || *cp == '.')
+ {
+ /* save delimiting character to use later */
+ char delim = *cp;
+
+ APPEND_CHAR(bufp, bufend, *cp++);
+ /* second field is all digits? then no embedded text month */
+ if (isdigit((unsigned char) *cp))
+ {
+ ftype[nf] = ((delim == '.') ? DTK_NUMBER : DTK_DATE);
+ while (isdigit((unsigned char) *cp))
+ APPEND_CHAR(bufp, bufend, *cp++);
+
+ /*
+ * insist that the delimiters match to get a three-field
+ * date.
+ */
+ if (*cp == delim)
+ {
+ ftype[nf] = DTK_DATE;
+ APPEND_CHAR(bufp, bufend, *cp++);
+ while (isdigit((unsigned char) *cp) || *cp == delim)
+ APPEND_CHAR(bufp, bufend, *cp++);
+ }
+ }
+ else
+ {
+ ftype[nf] = DTK_DATE;
+ while (isalnum((unsigned char) *cp) || *cp == delim)
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+ }
+ }
+
+ /*
+ * otherwise, number only and will determine year, month, day, or
+ * concatenated fields later...
+ */
+ else
+ ftype[nf] = DTK_NUMBER;
+ }
+ /* Leading decimal point? Then fractional seconds... */
+ else if (*cp == '.')
+ {
+ APPEND_CHAR(bufp, bufend, *cp++);
+ while (isdigit((unsigned char) *cp))
+ APPEND_CHAR(bufp, bufend, *cp++);
+
+ ftype[nf] = DTK_NUMBER;
+ }
+
+ /*
+ * text? then date string, month, day of week, special, or timezone
+ */
+ else if (isalpha((unsigned char) *cp))
+ {
+ bool is_date;
+
+ ftype[nf] = DTK_STRING;
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+ while (isalpha((unsigned char) *cp))
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+
+ /*
+ * Dates can have embedded '-', '/', or '.' separators. It could
+ * also be a timezone name containing embedded '/', '+', '-', '_',
+ * or ':' (but '_' or ':' can't be the first punctuation). If the
+ * next character is a digit or '+', we need to check whether what
+ * we have so far is a recognized non-timezone keyword --- if so,
+ * don't believe that this is the start of a timezone.
+ */
+ is_date = false;
+ if (*cp == '-' || *cp == '/' || *cp == '.')
+ is_date = true;
+ else if (*cp == '+' || isdigit((unsigned char) *cp))
+ {
+ *bufp = '\0'; /* null-terminate current field value */
+ /* we need search only the core token table, not TZ names */
+ if (datebsearch(field[nf], datetktbl, szdatetktbl) == NULL)
+ is_date = true;
+ }
+ if (is_date)
+ {
+ ftype[nf] = DTK_DATE;
+ do
+ {
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+ } while (*cp == '+' || *cp == '-' ||
+ *cp == '/' || *cp == '_' ||
+ *cp == '.' || *cp == ':' ||
+ isalnum((unsigned char) *cp));
+ }
+ }
+ /* sign? then special or numeric timezone */
+ else if (*cp == '+' || *cp == '-')
+ {
+ APPEND_CHAR(bufp, bufend, *cp++);
+ /* soak up leading whitespace */
+ while (isspace((unsigned char) *cp))
+ cp++;
+ /* numeric timezone? */
+ /* note that "DTK_TZ" could also be a signed float or yyyy-mm */
+ if (isdigit((unsigned char) *cp))
+ {
+ ftype[nf] = DTK_TZ;
+ APPEND_CHAR(bufp, bufend, *cp++);
+ while (isdigit((unsigned char) *cp) ||
+ *cp == ':' || *cp == '.' || *cp == '-')
+ APPEND_CHAR(bufp, bufend, *cp++);
+ }
+ /* special? */
+ else if (isalpha((unsigned char) *cp))
+ {
+ ftype[nf] = DTK_SPECIAL;
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+ while (isalpha((unsigned char) *cp))
+ APPEND_CHAR(bufp, bufend, pg_tolower((unsigned char) *cp++));
+ }
+ /* otherwise something wrong... */
+ else
+ return DTERR_BAD_FORMAT;
+ }
+ /* ignore other punctuation but use as delimiter */
+ else if (ispunct((unsigned char) *cp))
+ {
+ cp++;
+ continue;
+ }
+ /* otherwise, something is not right... */
+ else
+ return DTERR_BAD_FORMAT;
+
+ /* force in a delimiter after each field */
+ *bufp++ = '\0';
+ nf++;
+ }
+
+ *numfields = nf;
+
+ return 0;
+}
+
+
+/* DecodeDateTime()
+ * Interpret previously parsed fields for general date and time.
+ * Return 0 if full date, 1 if only time, and negative DTERR code if problems.
+ * (Currently, all callers treat 1 as an error return too.)
+ *
+ * External format(s):
+ * "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>"
+ * "Fri Feb-7-1997 15:23:27"
+ * "Feb-7-1997 15:23:27"
+ * "2-7-1997 15:23:27"
+ * "1997-2-7 15:23:27"
+ * "1997.038 15:23:27" (day of year 1-366)
+ * Also supports input in compact time:
+ * "970207 152327"
+ * "97038 152327"
+ * "20011225T040506.789-07"
+ *
+ * Use the system-provided functions to get the current time zone
+ * if not specified in the input string.
+ *
+ * If the date is outside the range of pg_time_t (in practice that could only
+ * happen if pg_time_t is just 32 bits), then assume UTC time zone - thomas
+ * 1997-05-27
+ */
+int
+DecodeDateTime(char **field, int *ftype, int nf,
+ int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp)
+{
+ int fmask = 0,
+ tmask,
+ type;
+ int ptype = 0; /* "prefix type" for ISO y2001m02d04 format */
+ int i;
+ int val;
+ int dterr;
+ int mer = HR24;
+ bool haveTextMonth = false;
+ bool isjulian = false;
+ bool is2digits = false;
+ bool bc = false;
+ pg_tz *namedTz = NULL;
+ pg_tz *abbrevTz = NULL;
+ pg_tz *valtz;
+ char *abbrev = NULL;
+ struct pg_tm cur_tm;
+
+ /*
+ * We'll insist on at least all of the date fields, but initialize the
+ * remaining fields in case they are not set later...
+ */
+ *dtype = DTK_DATE;
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ *fsec = 0;
+ /* don't know daylight savings time status apriori */
+ tm->tm_isdst = -1;
+ if (tzp != NULL)
+ *tzp = 0;
+
+ for (i = 0; i < nf; i++)
+ {
+ switch (ftype[i])
+ {
+ case DTK_DATE:
+
+ /*
+ * Integral julian day with attached time zone? All other
+ * forms with JD will be separated into distinct fields, so we
+ * handle just this case here.
+ */
+ if (ptype == DTK_JULIAN)
+ {
+ char *cp;
+ int val;
+
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+
+ errno = 0;
+ val = strtoint(field[i], &cp, 10);
+ if (errno == ERANGE || val < 0)
+ return DTERR_FIELD_OVERFLOW;
+
+ j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ isjulian = true;
+
+ /* Get the time zone from the end of the string */
+ dterr = DecodeTimezone(cp, tzp);
+ if (dterr)
+ return dterr;
+
+ tmask = DTK_DATE_M | DTK_TIME_M | DTK_M(TZ);
+ ptype = 0;
+ break;
+ }
+
+ /*
+ * Already have a date? Then this might be a time zone name
+ * with embedded punctuation (e.g. "America/New_York") or a
+ * run-together time with trailing time zone (e.g. hhmmss-zz).
+ * - thomas 2001-12-25
+ *
+ * We consider it a time zone if we already have month & day.
+ * This is to allow the form "mmm dd hhmmss tz year", which
+ * we've historically accepted.
+ */
+ else if (ptype != 0 ||
+ ((fmask & (DTK_M(MONTH) | DTK_M(DAY))) ==
+ (DTK_M(MONTH) | DTK_M(DAY))))
+ {
+ /* No time zone accepted? Then quit... */
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+
+ if (isdigit((unsigned char) *field[i]) || ptype != 0)
+ {
+ char *cp;
+
+ if (ptype != 0)
+ {
+ /* Sanity check; should not fail this test */
+ if (ptype != DTK_TIME)
+ return DTERR_BAD_FORMAT;
+ ptype = 0;
+ }
+
+ /*
+ * Starts with a digit but we already have a time
+ * field? Then we are in trouble with a date and time
+ * already...
+ */
+ if ((fmask & DTK_TIME_M) == DTK_TIME_M)
+ return DTERR_BAD_FORMAT;
+
+ if ((cp = strchr(field[i], '-')) == NULL)
+ return DTERR_BAD_FORMAT;
+
+ /* Get the time zone from the end of the string */
+ dterr = DecodeTimezone(cp, tzp);
+ if (dterr)
+ return dterr;
+ *cp = '\0';
+
+ /*
+ * Then read the rest of the field as a concatenated
+ * time
+ */
+ dterr = DecodeNumberField(strlen(field[i]), field[i],
+ fmask,
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+
+ /*
+ * modify tmask after returning from
+ * DecodeNumberField()
+ */
+ tmask |= DTK_M(TZ);
+ }
+ else
+ {
+ namedTz = pg_tzset(field[i]);
+ if (!namedTz)
+ {
+ /*
+ * We should return an error code instead of
+ * ereport'ing directly, but then there is no way
+ * to report the bad time zone name.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized",
+ field[i])));
+ }
+ /* we'll apply the zone setting below */
+ tmask = DTK_M(TZ);
+ }
+ }
+ else
+ {
+ dterr = DecodeDate(field[i], fmask,
+ &tmask, &is2digits, tm);
+ if (dterr)
+ return dterr;
+ }
+ break;
+
+ case DTK_TIME:
+
+ /*
+ * This might be an ISO time following a "t" field.
+ */
+ if (ptype != 0)
+ {
+ /* Sanity check; should not fail this test */
+ if (ptype != DTK_TIME)
+ return DTERR_BAD_FORMAT;
+ ptype = 0;
+ }
+ dterr = DecodeTime(field[i], fmask, INTERVAL_FULL_RANGE,
+ &tmask, tm, fsec);
+ if (dterr)
+ return dterr;
+
+ /* check for time overflow */
+ if (time_overflows(tm->tm_hour, tm->tm_min, tm->tm_sec,
+ *fsec))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+
+ case DTK_TZ:
+ {
+ int tz;
+
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+
+ dterr = DecodeTimezone(field[i], &tz);
+ if (dterr)
+ return dterr;
+ *tzp = tz;
+ tmask = DTK_M(TZ);
+ }
+ break;
+
+ case DTK_NUMBER:
+
+ /*
+ * Was this an "ISO date" with embedded field labels? An
+ * example is "y2001m02d04" - thomas 2001-02-04
+ */
+ if (ptype != 0)
+ {
+ char *cp;
+ int val;
+
+ errno = 0;
+ val = strtoint(field[i], &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+
+ /*
+ * only a few kinds are allowed to have an embedded
+ * decimal
+ */
+ if (*cp == '.')
+ switch (ptype)
+ {
+ case DTK_JULIAN:
+ case DTK_TIME:
+ case DTK_SECOND:
+ break;
+ default:
+ return DTERR_BAD_FORMAT;
+ break;
+ }
+ else if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+
+ switch (ptype)
+ {
+ case DTK_YEAR:
+ tm->tm_year = val;
+ tmask = DTK_M(YEAR);
+ break;
+
+ case DTK_MONTH:
+
+ /*
+ * already have a month and hour? then assume
+ * minutes
+ */
+ if ((fmask & DTK_M(MONTH)) != 0 &&
+ (fmask & DTK_M(HOUR)) != 0)
+ {
+ tm->tm_min = val;
+ tmask = DTK_M(MINUTE);
+ }
+ else
+ {
+ tm->tm_mon = val;
+ tmask = DTK_M(MONTH);
+ }
+ break;
+
+ case DTK_DAY:
+ tm->tm_mday = val;
+ tmask = DTK_M(DAY);
+ break;
+
+ case DTK_HOUR:
+ tm->tm_hour = val;
+ tmask = DTK_M(HOUR);
+ break;
+
+ case DTK_MINUTE:
+ tm->tm_min = val;
+ tmask = DTK_M(MINUTE);
+ break;
+
+ case DTK_SECOND:
+ tm->tm_sec = val;
+ tmask = DTK_M(SECOND);
+ if (*cp == '.')
+ {
+ dterr = ParseFractionalSecond(cp, fsec);
+ if (dterr)
+ return dterr;
+ tmask = DTK_ALL_SECS_M;
+ }
+ break;
+
+ case DTK_TZ:
+ tmask = DTK_M(TZ);
+ dterr = DecodeTimezone(field[i], tzp);
+ if (dterr)
+ return dterr;
+ break;
+
+ case DTK_JULIAN:
+ /* previous field was a label for "julian date" */
+ if (val < 0)
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_DATE_M;
+ j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ isjulian = true;
+
+ /* fractional Julian Day? */
+ if (*cp == '.')
+ {
+ double time;
+
+ dterr = ParseFraction(cp, &time);
+ if (dterr)
+ return dterr;
+ time *= USECS_PER_DAY;
+ dt2time(time,
+ &tm->tm_hour, &tm->tm_min,
+ &tm->tm_sec, fsec);
+ tmask |= DTK_TIME_M;
+ }
+ break;
+
+ case DTK_TIME:
+ /* previous field was "t" for ISO time */
+ dterr = DecodeNumberField(strlen(field[i]), field[i],
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ if (tmask != DTK_TIME_M)
+ return DTERR_BAD_FORMAT;
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ break;
+ }
+
+ ptype = 0;
+ *dtype = DTK_DATE;
+ }
+ else
+ {
+ char *cp;
+ int flen;
+
+ flen = strlen(field[i]);
+ cp = strchr(field[i], '.');
+
+ /* Embedded decimal and no date yet? */
+ if (cp != NULL && !(fmask & DTK_DATE_M))
+ {
+ dterr = DecodeDate(field[i], fmask,
+ &tmask, &is2digits, tm);
+ if (dterr)
+ return dterr;
+ }
+ /* embedded decimal and several digits before? */
+ else if (cp != NULL && flen - strlen(cp) > 2)
+ {
+ /*
+ * Interpret as a concatenated date or time Set the
+ * type field to allow decoding other fields later.
+ * Example: 20011223 or 040506
+ */
+ dterr = DecodeNumberField(flen, field[i], fmask,
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ }
+
+ /*
+ * Is this a YMD or HMS specification, or a year number?
+ * YMD and HMS are required to be six digits or more, so
+ * if it is 5 digits, it is a year. If it is six or more
+ * digits, we assume it is YMD or HMS unless no date and
+ * no time values have been specified. This forces 6+
+ * digit years to be at the end of the string, or to use
+ * the ISO date specification.
+ */
+ else if (flen >= 6 && (!(fmask & DTK_DATE_M) ||
+ !(fmask & DTK_TIME_M)))
+ {
+ dterr = DecodeNumberField(flen, field[i], fmask,
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ }
+ /* otherwise it is a single date/time field... */
+ else
+ {
+ dterr = DecodeNumber(flen, field[i],
+ haveTextMonth, fmask,
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr)
+ return dterr;
+ }
+ }
+ break;
+
+ case DTK_STRING:
+ case DTK_SPECIAL:
+ /* timezone abbrevs take precedence over built-in tokens */
+ type = DecodeTimezoneAbbrev(i, field[i], &val, &valtz);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(i, field[i], &val);
+ if (type == IGNORE_DTF)
+ continue;
+
+ tmask = DTK_M(type);
+ switch (type)
+ {
+ case RESERV:
+ switch (val)
+ {
+ case DTK_NOW:
+ tmask = (DTK_DATE_M | DTK_TIME_M | DTK_M(TZ));
+ *dtype = DTK_DATE;
+ GetCurrentTimeUsec(tm, fsec, tzp);
+ break;
+
+ case DTK_YESTERDAY:
+ tmask = DTK_DATE_M;
+ *dtype = DTK_DATE;
+ GetCurrentDateTime(&cur_tm);
+ j2date(date2j(cur_tm.tm_year, cur_tm.tm_mon, cur_tm.tm_mday) - 1,
+ &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ break;
+
+ case DTK_TODAY:
+ tmask = DTK_DATE_M;
+ *dtype = DTK_DATE;
+ GetCurrentDateTime(&cur_tm);
+ tm->tm_year = cur_tm.tm_year;
+ tm->tm_mon = cur_tm.tm_mon;
+ tm->tm_mday = cur_tm.tm_mday;
+ break;
+
+ case DTK_TOMORROW:
+ tmask = DTK_DATE_M;
+ *dtype = DTK_DATE;
+ GetCurrentDateTime(&cur_tm);
+ j2date(date2j(cur_tm.tm_year, cur_tm.tm_mon, cur_tm.tm_mday) + 1,
+ &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ break;
+
+ case DTK_ZULU:
+ tmask = (DTK_TIME_M | DTK_M(TZ));
+ *dtype = DTK_DATE;
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ if (tzp != NULL)
+ *tzp = 0;
+ break;
+
+ default:
+ *dtype = val;
+ }
+
+ break;
+
+ case MONTH:
+
+ /*
+ * already have a (numeric) month? then see if we can
+ * substitute...
+ */
+ if ((fmask & DTK_M(MONTH)) && !haveTextMonth &&
+ !(fmask & DTK_M(DAY)) && tm->tm_mon >= 1 &&
+ tm->tm_mon <= 31)
+ {
+ tm->tm_mday = tm->tm_mon;
+ tmask = DTK_M(DAY);
+ }
+ haveTextMonth = true;
+ tm->tm_mon = val;
+ break;
+
+ case DTZMOD:
+
+ /*
+ * daylight savings time modifier (solves "MET DST"
+ * syntax)
+ */
+ tmask |= DTK_M(DTZ);
+ tm->tm_isdst = 1;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp -= val;
+ break;
+
+ case DTZ:
+
+ /*
+ * set mask for TZ here _or_ check for DTZ later when
+ * getting default timezone
+ */
+ tmask |= DTK_M(TZ);
+ tm->tm_isdst = 1;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp = -val;
+ break;
+
+ case TZ:
+ tm->tm_isdst = 0;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp = -val;
+ break;
+
+ case DYNTZ:
+ tmask |= DTK_M(TZ);
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ /* we'll determine the actual offset later */
+ abbrevTz = valtz;
+ abbrev = field[i];
+ break;
+
+ case AMPM:
+ mer = val;
+ break;
+
+ case ADBC:
+ bc = (val == BC);
+ break;
+
+ case DOW:
+ tm->tm_wday = val;
+ break;
+
+ case UNITS:
+ tmask = 0;
+ ptype = val;
+ break;
+
+ case ISOTIME:
+
+ /*
+ * This is a filler field "t" indicating that the next
+ * field is time. Try to verify that this is sensible.
+ */
+ tmask = 0;
+
+ /* No preceding date? Then quit... */
+ if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ return DTERR_BAD_FORMAT;
+
+ /***
+ * We will need one of the following fields:
+ * DTK_NUMBER should be hhmmss.fff
+ * DTK_TIME should be hh:mm:ss.fff
+ * DTK_DATE should be hhmmss-zz
+ ***/
+ if (i >= nf - 1 ||
+ (ftype[i + 1] != DTK_NUMBER &&
+ ftype[i + 1] != DTK_TIME &&
+ ftype[i + 1] != DTK_DATE))
+ return DTERR_BAD_FORMAT;
+
+ ptype = val;
+ break;
+
+ case UNKNOWN_FIELD:
+
+ /*
+ * Before giving up and declaring error, check to see
+ * if it is an all-alpha timezone name.
+ */
+ namedTz = pg_tzset(field[i]);
+ if (!namedTz)
+ return DTERR_BAD_FORMAT;
+ /* we'll apply the zone setting below */
+ tmask = DTK_M(TZ);
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+
+ if (tmask & fmask)
+ return DTERR_BAD_FORMAT;
+ fmask |= tmask;
+ } /* end loop over fields */
+
+ /* do final checking/adjustment of Y/M/D fields */
+ dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
+ if (dterr)
+ return dterr;
+
+ /* handle AM/PM */
+ if (mer != HR24 && tm->tm_hour > HOURS_PER_DAY / 2)
+ return DTERR_FIELD_OVERFLOW;
+ if (mer == AM && tm->tm_hour == HOURS_PER_DAY / 2)
+ tm->tm_hour = 0;
+ else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
+ tm->tm_hour += HOURS_PER_DAY / 2;
+
+ /* do additional checking for full date specs... */
+ if (*dtype == DTK_DATE)
+ {
+ if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ {
+ if ((fmask & DTK_TIME_M) == DTK_TIME_M)
+ return 1;
+ return DTERR_BAD_FORMAT;
+ }
+
+ /*
+ * If we had a full timezone spec, compute the offset (we could not do
+ * it before, because we need the date to resolve DST status).
+ */
+ if (namedTz != NULL)
+ {
+ /* daylight savings time modifier disallowed with full TZ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ *tzp = DetermineTimeZoneOffset(tm, namedTz);
+ }
+
+ /*
+ * Likewise, if we had a dynamic timezone abbreviation, resolve it
+ * now.
+ */
+ if (abbrevTz != NULL)
+ {
+ /* daylight savings time modifier disallowed with dynamic TZ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ *tzp = DetermineTimeZoneAbbrevOffset(tm, abbrev, abbrevTz);
+ }
+
+ /* timezone not specified? then use session timezone */
+ if (tzp != NULL && !(fmask & DTK_M(TZ)))
+ {
+ /*
+ * daylight savings time modifier but no standard timezone? then
+ * error
+ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ *tzp = DetermineTimeZoneOffset(tm, session_timezone);
+ }
+ }
+
+ return 0;
+}
+
+
+/* DetermineTimeZoneOffset()
+ *
+ * Given a struct pg_tm in which tm_year, tm_mon, tm_mday, tm_hour, tm_min,
+ * and tm_sec fields are set, and a zic-style time zone definition, determine
+ * the applicable GMT offset and daylight-savings status at that time.
+ * Set the struct pg_tm's tm_isdst field accordingly, and return the GMT
+ * offset as the function result.
+ *
+ * Note: if the date is out of the range we can deal with, we return zero
+ * as the GMT offset and set tm_isdst = 0. We don't throw an error here,
+ * though probably some higher-level code will.
+ */
+int
+DetermineTimeZoneOffset(struct pg_tm *tm, pg_tz *tzp)
+{
+ pg_time_t t;
+
+ return DetermineTimeZoneOffsetInternal(tm, tzp, &t);
+}
+
+
+/* DetermineTimeZoneOffsetInternal()
+ *
+ * As above, but also return the actual UTC time imputed to the date/time
+ * into *tp.
+ *
+ * In event of an out-of-range date, we punt by returning zero into *tp.
+ * This is okay for the immediate callers but is a good reason for not
+ * exposing this worker function globally.
+ *
+ * Note: it might seem that we should use mktime() for this, but bitter
+ * experience teaches otherwise. This code is much faster than most versions
+ * of mktime(), anyway.
+ */
+static int
+DetermineTimeZoneOffsetInternal(struct pg_tm *tm, pg_tz *tzp, pg_time_t *tp)
+{
+ int date,
+ sec;
+ pg_time_t day,
+ mytime,
+ prevtime,
+ boundary,
+ beforetime,
+ aftertime;
+ long int before_gmtoff,
+ after_gmtoff;
+ int before_isdst,
+ after_isdst;
+ int res;
+
+ /*
+ * First, generate the pg_time_t value corresponding to the given
+ * y/m/d/h/m/s taken as GMT time. If this overflows, punt and decide the
+ * timezone is GMT. (For a valid Julian date, integer overflow should be
+ * impossible with 64-bit pg_time_t, but let's check for safety.)
+ */
+ if (!IS_VALID_JULIAN(tm->tm_year, tm->tm_mon, tm->tm_mday))
+ goto overflow;
+ date = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - UNIX_EPOCH_JDATE;
+
+ day = ((pg_time_t) date) * SECS_PER_DAY;
+ if (day / SECS_PER_DAY != date)
+ goto overflow;
+ sec = tm->tm_sec + (tm->tm_min + tm->tm_hour * MINS_PER_HOUR) * SECS_PER_MINUTE;
+ mytime = day + sec;
+ /* since sec >= 0, overflow could only be from +day to -mytime */
+ if (mytime < 0 && day > 0)
+ goto overflow;
+
+ /*
+ * Find the DST time boundary just before or following the target time. We
+ * assume that all zones have GMT offsets less than 24 hours, and that DST
+ * boundaries can't be closer together than 48 hours, so backing up 24
+ * hours and finding the "next" boundary will work.
+ */
+ prevtime = mytime - SECS_PER_DAY;
+ if (mytime < 0 && prevtime > 0)
+ goto overflow;
+
+ res = pg_next_dst_boundary(&prevtime,
+ &before_gmtoff, &before_isdst,
+ &boundary,
+ &after_gmtoff, &after_isdst,
+ tzp);
+ if (res < 0)
+ goto overflow; /* failure? */
+
+ if (res == 0)
+ {
+ /* Non-DST zone, life is simple */
+ tm->tm_isdst = before_isdst;
+ *tp = mytime - before_gmtoff;
+ return -(int) before_gmtoff;
+ }
+
+ /*
+ * Form the candidate pg_time_t values with local-time adjustment
+ */
+ beforetime = mytime - before_gmtoff;
+ if ((before_gmtoff > 0 &&
+ mytime < 0 && beforetime > 0) ||
+ (before_gmtoff <= 0 &&
+ mytime > 0 && beforetime < 0))
+ goto overflow;
+ aftertime = mytime - after_gmtoff;
+ if ((after_gmtoff > 0 &&
+ mytime < 0 && aftertime > 0) ||
+ (after_gmtoff <= 0 &&
+ mytime > 0 && aftertime < 0))
+ goto overflow;
+
+ /*
+ * If both before or both after the boundary time, we know what to do. The
+ * boundary time itself is considered to be after the transition, which
+ * means we can accept aftertime == boundary in the second case.
+ */
+ if (beforetime < boundary && aftertime < boundary)
+ {
+ tm->tm_isdst = before_isdst;
+ *tp = beforetime;
+ return -(int) before_gmtoff;
+ }
+ if (beforetime > boundary && aftertime >= boundary)
+ {
+ tm->tm_isdst = after_isdst;
+ *tp = aftertime;
+ return -(int) after_gmtoff;
+ }
+
+ /*
+ * It's an invalid or ambiguous time due to timezone transition. In a
+ * spring-forward transition, prefer the "before" interpretation; in a
+ * fall-back transition, prefer "after". (We used to define and implement
+ * this test as "prefer the standard-time interpretation", but that rule
+ * does not help to resolve the behavior when both times are reported as
+ * standard time; which does happen, eg Europe/Moscow in Oct 2014. Also,
+ * in some zones such as Europe/Dublin, there is widespread confusion
+ * about which time offset is "standard" time, so it's fortunate that our
+ * behavior doesn't depend on that.)
+ */
+ if (beforetime > aftertime)
+ {
+ tm->tm_isdst = before_isdst;
+ *tp = beforetime;
+ return -(int) before_gmtoff;
+ }
+ tm->tm_isdst = after_isdst;
+ *tp = aftertime;
+ return -(int) after_gmtoff;
+
+overflow:
+ /* Given date is out of range, so assume UTC */
+ tm->tm_isdst = 0;
+ *tp = 0;
+ return 0;
+}
+
+
+/* DetermineTimeZoneAbbrevOffset()
+ *
+ * Determine the GMT offset and DST flag to be attributed to a dynamic
+ * time zone abbreviation, that is one whose meaning has changed over time.
+ * *tm contains the local time at which the meaning should be determined,
+ * and tm->tm_isdst receives the DST flag.
+ *
+ * This differs from the behavior of DetermineTimeZoneOffset() in that a
+ * standard-time or daylight-time abbreviation forces use of the corresponding
+ * GMT offset even when the zone was then in DS or standard time respectively.
+ * (However, that happens only if we can match the given abbreviation to some
+ * abbreviation that appears in the IANA timezone data. Otherwise, we fall
+ * back to doing DetermineTimeZoneOffset().)
+ */
+int
+DetermineTimeZoneAbbrevOffset(struct pg_tm *tm, const char *abbr, pg_tz *tzp)
+{
+ pg_time_t t;
+ int zone_offset;
+ int abbr_offset;
+ int abbr_isdst;
+
+ /*
+ * Compute the UTC time we want to probe at. (In event of overflow, we'll
+ * probe at the epoch, which is a bit random but probably doesn't matter.)
+ */
+ zone_offset = DetermineTimeZoneOffsetInternal(tm, tzp, &t);
+
+ /*
+ * Try to match the abbreviation to something in the zone definition.
+ */
+ if (DetermineTimeZoneAbbrevOffsetInternal(t, abbr, tzp,
+ &abbr_offset, &abbr_isdst))
+ {
+ /* Success, so use the abbrev-specific answers. */
+ tm->tm_isdst = abbr_isdst;
+ return abbr_offset;
+ }
+
+ /*
+ * No match, so use the answers we already got from
+ * DetermineTimeZoneOffsetInternal.
+ */
+ return zone_offset;
+}
+
+
+/* DetermineTimeZoneAbbrevOffsetTS()
+ *
+ * As above but the probe time is specified as a TimestampTz (hence, UTC time),
+ * and DST status is returned into *isdst rather than into tm->tm_isdst.
+ */
+int
+DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr,
+ pg_tz *tzp, int *isdst)
+{
+ pg_time_t t = timestamptz_to_time_t(ts);
+ int zone_offset;
+ int abbr_offset;
+ int tz;
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ /*
+ * If the abbrev matches anything in the zone data, this is pretty easy.
+ */
+ if (DetermineTimeZoneAbbrevOffsetInternal(t, abbr, tzp,
+ &abbr_offset, isdst))
+ return abbr_offset;
+
+ /*
+ * Else, break down the timestamp so we can use DetermineTimeZoneOffset.
+ */
+ if (timestamp2tm(ts, &tz, &tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ zone_offset = DetermineTimeZoneOffset(&tm, tzp);
+ *isdst = tm.tm_isdst;
+ return zone_offset;
+}
+
+
+/* DetermineTimeZoneAbbrevOffsetInternal()
+ *
+ * Workhorse for above two functions: work from a pg_time_t probe instant.
+ * On success, return GMT offset and DST status into *offset and *isdst.
+ */
+static bool
+DetermineTimeZoneAbbrevOffsetInternal(pg_time_t t, const char *abbr, pg_tz *tzp,
+ int *offset, int *isdst)
+{
+ char upabbr[TZ_STRLEN_MAX + 1];
+ unsigned char *p;
+ long int gmtoff;
+
+ /* We need to force the abbrev to upper case */
+ strlcpy(upabbr, abbr, sizeof(upabbr));
+ for (p = (unsigned char *) upabbr; *p; p++)
+ *p = pg_toupper(*p);
+
+ /* Look up the abbrev's meaning at this time in this zone */
+ if (pg_interpret_timezone_abbrev(upabbr,
+ &t,
+ &gmtoff,
+ isdst,
+ tzp))
+ {
+ /* Change sign to agree with DetermineTimeZoneOffset() */
+ *offset = (int) -gmtoff;
+ return true;
+ }
+ return false;
+}
+
+
+/* DecodeTimeOnly()
+ * Interpret parsed string as time fields only.
+ * Returns 0 if successful, DTERR code if bogus input detected.
+ *
+ * Note that support for time zone is here for
+ * SQL TIME WITH TIME ZONE, but it reveals
+ * bogosity with SQL date/time standards, since
+ * we must infer a time zone from current time.
+ * - thomas 2000-03-10
+ * Allow specifying date to get a better time zone,
+ * if time zones are allowed. - thomas 2001-12-26
+ */
+int
+DecodeTimeOnly(char **field, int *ftype, int nf,
+ int *dtype, struct pg_tm *tm, fsec_t *fsec, int *tzp)
+{
+ int fmask = 0,
+ tmask,
+ type;
+ int ptype = 0; /* "prefix type" for ISO h04mm05s06 format */
+ int i;
+ int val;
+ int dterr;
+ bool isjulian = false;
+ bool is2digits = false;
+ bool bc = false;
+ int mer = HR24;
+ pg_tz *namedTz = NULL;
+ pg_tz *abbrevTz = NULL;
+ char *abbrev = NULL;
+ pg_tz *valtz;
+
+ *dtype = DTK_TIME;
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ *fsec = 0;
+ /* don't know daylight savings time status apriori */
+ tm->tm_isdst = -1;
+
+ if (tzp != NULL)
+ *tzp = 0;
+
+ for (i = 0; i < nf; i++)
+ {
+ switch (ftype[i])
+ {
+ case DTK_DATE:
+
+ /*
+ * Time zone not allowed? Then should not accept dates or time
+ * zones no matter what else!
+ */
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+
+ /* Under limited circumstances, we will accept a date... */
+ if (i == 0 && nf >= 2 &&
+ (ftype[nf - 1] == DTK_DATE || ftype[1] == DTK_TIME))
+ {
+ dterr = DecodeDate(field[i], fmask,
+ &tmask, &is2digits, tm);
+ if (dterr)
+ return dterr;
+ }
+ /* otherwise, this is a time and/or time zone */
+ else
+ {
+ if (isdigit((unsigned char) *field[i]))
+ {
+ char *cp;
+
+ /*
+ * Starts with a digit but we already have a time
+ * field? Then we are in trouble with time already...
+ */
+ if ((fmask & DTK_TIME_M) == DTK_TIME_M)
+ return DTERR_BAD_FORMAT;
+
+ /*
+ * Should not get here and fail. Sanity check only...
+ */
+ if ((cp = strchr(field[i], '-')) == NULL)
+ return DTERR_BAD_FORMAT;
+
+ /* Get the time zone from the end of the string */
+ dterr = DecodeTimezone(cp, tzp);
+ if (dterr)
+ return dterr;
+ *cp = '\0';
+
+ /*
+ * Then read the rest of the field as a concatenated
+ * time
+ */
+ dterr = DecodeNumberField(strlen(field[i]), field[i],
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ ftype[i] = dterr;
+
+ tmask |= DTK_M(TZ);
+ }
+ else
+ {
+ namedTz = pg_tzset(field[i]);
+ if (!namedTz)
+ {
+ /*
+ * We should return an error code instead of
+ * ereport'ing directly, but then there is no way
+ * to report the bad time zone name.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized",
+ field[i])));
+ }
+ /* we'll apply the zone setting below */
+ ftype[i] = DTK_TZ;
+ tmask = DTK_M(TZ);
+ }
+ }
+ break;
+
+ case DTK_TIME:
+ dterr = DecodeTime(field[i], (fmask | DTK_DATE_M),
+ INTERVAL_FULL_RANGE,
+ &tmask, tm, fsec);
+ if (dterr)
+ return dterr;
+ break;
+
+ case DTK_TZ:
+ {
+ int tz;
+
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+
+ dterr = DecodeTimezone(field[i], &tz);
+ if (dterr)
+ return dterr;
+ *tzp = tz;
+ tmask = DTK_M(TZ);
+ }
+ break;
+
+ case DTK_NUMBER:
+
+ /*
+ * Was this an "ISO time" with embedded field labels? An
+ * example is "h04mm05s06" - thomas 2001-02-04
+ */
+ if (ptype != 0)
+ {
+ char *cp;
+ int val;
+
+ /* Only accept a date under limited circumstances */
+ switch (ptype)
+ {
+ case DTK_JULIAN:
+ case DTK_YEAR:
+ case DTK_MONTH:
+ case DTK_DAY:
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ default:
+ break;
+ }
+
+ errno = 0;
+ val = strtoint(field[i], &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+
+ /*
+ * only a few kinds are allowed to have an embedded
+ * decimal
+ */
+ if (*cp == '.')
+ switch (ptype)
+ {
+ case DTK_JULIAN:
+ case DTK_TIME:
+ case DTK_SECOND:
+ break;
+ default:
+ return DTERR_BAD_FORMAT;
+ break;
+ }
+ else if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+
+ switch (ptype)
+ {
+ case DTK_YEAR:
+ tm->tm_year = val;
+ tmask = DTK_M(YEAR);
+ break;
+
+ case DTK_MONTH:
+
+ /*
+ * already have a month and hour? then assume
+ * minutes
+ */
+ if ((fmask & DTK_M(MONTH)) != 0 &&
+ (fmask & DTK_M(HOUR)) != 0)
+ {
+ tm->tm_min = val;
+ tmask = DTK_M(MINUTE);
+ }
+ else
+ {
+ tm->tm_mon = val;
+ tmask = DTK_M(MONTH);
+ }
+ break;
+
+ case DTK_DAY:
+ tm->tm_mday = val;
+ tmask = DTK_M(DAY);
+ break;
+
+ case DTK_HOUR:
+ tm->tm_hour = val;
+ tmask = DTK_M(HOUR);
+ break;
+
+ case DTK_MINUTE:
+ tm->tm_min = val;
+ tmask = DTK_M(MINUTE);
+ break;
+
+ case DTK_SECOND:
+ tm->tm_sec = val;
+ tmask = DTK_M(SECOND);
+ if (*cp == '.')
+ {
+ dterr = ParseFractionalSecond(cp, fsec);
+ if (dterr)
+ return dterr;
+ tmask = DTK_ALL_SECS_M;
+ }
+ break;
+
+ case DTK_TZ:
+ tmask = DTK_M(TZ);
+ dterr = DecodeTimezone(field[i], tzp);
+ if (dterr)
+ return dterr;
+ break;
+
+ case DTK_JULIAN:
+ /* previous field was a label for "julian date" */
+ if (val < 0)
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_DATE_M;
+ j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ isjulian = true;
+
+ if (*cp == '.')
+ {
+ double time;
+
+ dterr = ParseFraction(cp, &time);
+ if (dterr)
+ return dterr;
+ time *= USECS_PER_DAY;
+ dt2time(time,
+ &tm->tm_hour, &tm->tm_min,
+ &tm->tm_sec, fsec);
+ tmask |= DTK_TIME_M;
+ }
+ break;
+
+ case DTK_TIME:
+ /* previous field was "t" for ISO time */
+ dterr = DecodeNumberField(strlen(field[i]), field[i],
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ ftype[i] = dterr;
+
+ if (tmask != DTK_TIME_M)
+ return DTERR_BAD_FORMAT;
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ break;
+ }
+
+ ptype = 0;
+ *dtype = DTK_DATE;
+ }
+ else
+ {
+ char *cp;
+ int flen;
+
+ flen = strlen(field[i]);
+ cp = strchr(field[i], '.');
+
+ /* Embedded decimal? */
+ if (cp != NULL)
+ {
+ /*
+ * Under limited circumstances, we will accept a
+ * date...
+ */
+ if (i == 0 && nf >= 2 && ftype[nf - 1] == DTK_DATE)
+ {
+ dterr = DecodeDate(field[i], fmask,
+ &tmask, &is2digits, tm);
+ if (dterr)
+ return dterr;
+ }
+ /* embedded decimal and several digits before? */
+ else if (flen - strlen(cp) > 2)
+ {
+ /*
+ * Interpret as a concatenated date or time Set
+ * the type field to allow decoding other fields
+ * later. Example: 20011223 or 040506
+ */
+ dterr = DecodeNumberField(flen, field[i],
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ ftype[i] = dterr;
+ }
+ else
+ return DTERR_BAD_FORMAT;
+ }
+ else if (flen > 4)
+ {
+ dterr = DecodeNumberField(flen, field[i],
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr < 0)
+ return dterr;
+ ftype[i] = dterr;
+ }
+ /* otherwise it is a single date/time field... */
+ else
+ {
+ dterr = DecodeNumber(flen, field[i],
+ false,
+ (fmask | DTK_DATE_M),
+ &tmask, tm,
+ fsec, &is2digits);
+ if (dterr)
+ return dterr;
+ }
+ }
+ break;
+
+ case DTK_STRING:
+ case DTK_SPECIAL:
+ /* timezone abbrevs take precedence over built-in tokens */
+ type = DecodeTimezoneAbbrev(i, field[i], &val, &valtz);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(i, field[i], &val);
+ if (type == IGNORE_DTF)
+ continue;
+
+ tmask = DTK_M(type);
+ switch (type)
+ {
+ case RESERV:
+ switch (val)
+ {
+ case DTK_NOW:
+ tmask = DTK_TIME_M;
+ *dtype = DTK_TIME;
+ GetCurrentTimeUsec(tm, fsec, NULL);
+ break;
+
+ case DTK_ZULU:
+ tmask = (DTK_TIME_M | DTK_M(TZ));
+ *dtype = DTK_TIME;
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ tm->tm_isdst = 0;
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+
+ break;
+
+ case DTZMOD:
+
+ /*
+ * daylight savings time modifier (solves "MET DST"
+ * syntax)
+ */
+ tmask |= DTK_M(DTZ);
+ tm->tm_isdst = 1;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp -= val;
+ break;
+
+ case DTZ:
+
+ /*
+ * set mask for TZ here _or_ check for DTZ later when
+ * getting default timezone
+ */
+ tmask |= DTK_M(TZ);
+ tm->tm_isdst = 1;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp = -val;
+ ftype[i] = DTK_TZ;
+ break;
+
+ case TZ:
+ tm->tm_isdst = 0;
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ *tzp = -val;
+ ftype[i] = DTK_TZ;
+ break;
+
+ case DYNTZ:
+ tmask |= DTK_M(TZ);
+ if (tzp == NULL)
+ return DTERR_BAD_FORMAT;
+ /* we'll determine the actual offset later */
+ abbrevTz = valtz;
+ abbrev = field[i];
+ ftype[i] = DTK_TZ;
+ break;
+
+ case AMPM:
+ mer = val;
+ break;
+
+ case ADBC:
+ bc = (val == BC);
+ break;
+
+ case UNITS:
+ tmask = 0;
+ ptype = val;
+ break;
+
+ case ISOTIME:
+ tmask = 0;
+
+ /***
+ * We will need one of the following fields:
+ * DTK_NUMBER should be hhmmss.fff
+ * DTK_TIME should be hh:mm:ss.fff
+ * DTK_DATE should be hhmmss-zz
+ ***/
+ if (i >= nf - 1 ||
+ (ftype[i + 1] != DTK_NUMBER &&
+ ftype[i + 1] != DTK_TIME &&
+ ftype[i + 1] != DTK_DATE))
+ return DTERR_BAD_FORMAT;
+
+ ptype = val;
+ break;
+
+ case UNKNOWN_FIELD:
+
+ /*
+ * Before giving up and declaring error, check to see
+ * if it is an all-alpha timezone name.
+ */
+ namedTz = pg_tzset(field[i]);
+ if (!namedTz)
+ return DTERR_BAD_FORMAT;
+ /* we'll apply the zone setting below */
+ tmask = DTK_M(TZ);
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+
+ if (tmask & fmask)
+ return DTERR_BAD_FORMAT;
+ fmask |= tmask;
+ } /* end loop over fields */
+
+ /* do final checking/adjustment of Y/M/D fields */
+ dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
+ if (dterr)
+ return dterr;
+
+ /* handle AM/PM */
+ if (mer != HR24 && tm->tm_hour > HOURS_PER_DAY / 2)
+ return DTERR_FIELD_OVERFLOW;
+ if (mer == AM && tm->tm_hour == HOURS_PER_DAY / 2)
+ tm->tm_hour = 0;
+ else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
+ tm->tm_hour += HOURS_PER_DAY / 2;
+
+ /* check for time overflow */
+ if (time_overflows(tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec))
+ return DTERR_FIELD_OVERFLOW;
+
+ if ((fmask & DTK_TIME_M) != DTK_TIME_M)
+ return DTERR_BAD_FORMAT;
+
+ /*
+ * If we had a full timezone spec, compute the offset (we could not do it
+ * before, because we may need the date to resolve DST status).
+ */
+ if (namedTz != NULL)
+ {
+ long int gmtoff;
+
+ /* daylight savings time modifier disallowed with full TZ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ /* if non-DST zone, we do not need to know the date */
+ if (pg_get_timezone_offset(namedTz, &gmtoff))
+ {
+ *tzp = -(int) gmtoff;
+ }
+ else
+ {
+ /* a date has to be specified */
+ if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ return DTERR_BAD_FORMAT;
+ *tzp = DetermineTimeZoneOffset(tm, namedTz);
+ }
+ }
+
+ /*
+ * Likewise, if we had a dynamic timezone abbreviation, resolve it now.
+ */
+ if (abbrevTz != NULL)
+ {
+ struct pg_tm tt,
+ *tmp = &tt;
+
+ /*
+ * daylight savings time modifier but no standard timezone? then error
+ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ if ((fmask & DTK_DATE_M) == 0)
+ GetCurrentDateTime(tmp);
+ else
+ {
+ /* a date has to be specified */
+ if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ return DTERR_BAD_FORMAT;
+ tmp->tm_year = tm->tm_year;
+ tmp->tm_mon = tm->tm_mon;
+ tmp->tm_mday = tm->tm_mday;
+ }
+ tmp->tm_hour = tm->tm_hour;
+ tmp->tm_min = tm->tm_min;
+ tmp->tm_sec = tm->tm_sec;
+ *tzp = DetermineTimeZoneAbbrevOffset(tmp, abbrev, abbrevTz);
+ tm->tm_isdst = tmp->tm_isdst;
+ }
+
+ /* timezone not specified? then use session timezone */
+ if (tzp != NULL && !(fmask & DTK_M(TZ)))
+ {
+ struct pg_tm tt,
+ *tmp = &tt;
+
+ /*
+ * daylight savings time modifier but no standard timezone? then error
+ */
+ if (fmask & DTK_M(DTZMOD))
+ return DTERR_BAD_FORMAT;
+
+ if ((fmask & DTK_DATE_M) == 0)
+ GetCurrentDateTime(tmp);
+ else
+ {
+ /* a date has to be specified */
+ if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ return DTERR_BAD_FORMAT;
+ tmp->tm_year = tm->tm_year;
+ tmp->tm_mon = tm->tm_mon;
+ tmp->tm_mday = tm->tm_mday;
+ }
+ tmp->tm_hour = tm->tm_hour;
+ tmp->tm_min = tm->tm_min;
+ tmp->tm_sec = tm->tm_sec;
+ *tzp = DetermineTimeZoneOffset(tmp, session_timezone);
+ tm->tm_isdst = tmp->tm_isdst;
+ }
+
+ return 0;
+}
+
+/* DecodeDate()
+ * Decode date string which includes delimiters.
+ * Return 0 if okay, a DTERR code if not.
+ *
+ * str: field to be parsed
+ * fmask: bitmask for field types already seen
+ * *tmask: receives bitmask for fields found here
+ * *is2digits: set to true if we find 2-digit year
+ * *tm: field values are stored into appropriate members of this struct
+ */
+static int
+DecodeDate(char *str, int fmask, int *tmask, bool *is2digits,
+ struct pg_tm *tm)
+{
+ fsec_t fsec;
+ int nf = 0;
+ int i,
+ len;
+ int dterr;
+ bool haveTextMonth = false;
+ int type,
+ val,
+ dmask = 0;
+ char *field[MAXDATEFIELDS];
+
+ *tmask = 0;
+
+ /* parse this string... */
+ while (*str != '\0' && nf < MAXDATEFIELDS)
+ {
+ /* skip field separators */
+ while (*str != '\0' && !isalnum((unsigned char) *str))
+ str++;
+
+ if (*str == '\0')
+ return DTERR_BAD_FORMAT; /* end of string after separator */
+
+ field[nf] = str;
+ if (isdigit((unsigned char) *str))
+ {
+ while (isdigit((unsigned char) *str))
+ str++;
+ }
+ else if (isalpha((unsigned char) *str))
+ {
+ while (isalpha((unsigned char) *str))
+ str++;
+ }
+
+ /* Just get rid of any non-digit, non-alpha characters... */
+ if (*str != '\0')
+ *str++ = '\0';
+ nf++;
+ }
+
+ /* look first for text fields, since that will be unambiguous month */
+ for (i = 0; i < nf; i++)
+ {
+ if (isalpha((unsigned char) *field[i]))
+ {
+ type = DecodeSpecial(i, field[i], &val);
+ if (type == IGNORE_DTF)
+ continue;
+
+ dmask = DTK_M(type);
+ switch (type)
+ {
+ case MONTH:
+ tm->tm_mon = val;
+ haveTextMonth = true;
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+ if (fmask & dmask)
+ return DTERR_BAD_FORMAT;
+
+ fmask |= dmask;
+ *tmask |= dmask;
+
+ /* mark this field as being completed */
+ field[i] = NULL;
+ }
+ }
+
+ /* now pick up remaining numeric fields */
+ for (i = 0; i < nf; i++)
+ {
+ if (field[i] == NULL)
+ continue;
+
+ if ((len = strlen(field[i])) <= 0)
+ return DTERR_BAD_FORMAT;
+
+ dterr = DecodeNumber(len, field[i], haveTextMonth, fmask,
+ &dmask, tm,
+ &fsec, is2digits);
+ if (dterr)
+ return dterr;
+
+ if (fmask & dmask)
+ return DTERR_BAD_FORMAT;
+
+ fmask |= dmask;
+ *tmask |= dmask;
+ }
+
+ if ((fmask & ~(DTK_M(DOY) | DTK_M(TZ))) != DTK_DATE_M)
+ return DTERR_BAD_FORMAT;
+
+ /* validation of the field values must wait until ValidateDate() */
+
+ return 0;
+}
+
+/* ValidateDate()
+ * Check valid year/month/day values, handle BC and DOY cases
+ * Return 0 if okay, a DTERR code if not.
+ */
+int
+ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc,
+ struct pg_tm *tm)
+{
+ if (fmask & DTK_M(YEAR))
+ {
+ if (isjulian)
+ {
+ /* tm_year is correct and should not be touched */
+ }
+ else if (bc)
+ {
+ /* there is no year zero in AD/BC notation */
+ if (tm->tm_year <= 0)
+ return DTERR_FIELD_OVERFLOW;
+ /* internally, we represent 1 BC as year zero, 2 BC as -1, etc */
+ tm->tm_year = -(tm->tm_year - 1);
+ }
+ else if (is2digits)
+ {
+ /* process 1 or 2-digit input as 1970-2069 AD, allow '0' and '00' */
+ if (tm->tm_year < 0) /* just paranoia */
+ return DTERR_FIELD_OVERFLOW;
+ if (tm->tm_year < 70)
+ tm->tm_year += 2000;
+ else if (tm->tm_year < 100)
+ tm->tm_year += 1900;
+ }
+ else
+ {
+ /* there is no year zero in AD/BC notation */
+ if (tm->tm_year <= 0)
+ return DTERR_FIELD_OVERFLOW;
+ }
+ }
+
+ /* now that we have correct year, decode DOY */
+ if (fmask & DTK_M(DOY))
+ {
+ j2date(date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1,
+ &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ }
+
+ /* check for valid month */
+ if (fmask & DTK_M(MONTH))
+ {
+ if (tm->tm_mon < 1 || tm->tm_mon > MONTHS_PER_YEAR)
+ return DTERR_MD_FIELD_OVERFLOW;
+ }
+
+ /* minimal check for valid day */
+ if (fmask & DTK_M(DAY))
+ {
+ if (tm->tm_mday < 1 || tm->tm_mday > 31)
+ return DTERR_MD_FIELD_OVERFLOW;
+ }
+
+ if ((fmask & DTK_DATE_M) == DTK_DATE_M)
+ {
+ /*
+ * Check for valid day of month, now that we know for sure the month
+ * and year. Note we don't use MD_FIELD_OVERFLOW here, since it seems
+ * unlikely that "Feb 29" is a YMD-order error.
+ */
+ if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+ return DTERR_FIELD_OVERFLOW;
+ }
+
+ return 0;
+}
+
+
+/* DecodeTimeCommon()
+ * Decode time string which includes delimiters.
+ * Return 0 if okay, a DTERR code if not.
+ * tmask and itm are output parameters.
+ *
+ * This code is shared between the timestamp and interval cases.
+ * We return a struct pg_itm (of which only the tm_usec, tm_sec, tm_min,
+ * and tm_hour fields are used) and let the wrapper functions below
+ * convert and range-check as necessary.
+ */
+static int
+DecodeTimeCommon(char *str, int fmask, int range,
+ int *tmask, struct pg_itm *itm)
+{
+ char *cp;
+ int dterr;
+ fsec_t fsec = 0;
+
+ *tmask = DTK_TIME_M;
+
+ errno = 0;
+ itm->tm_hour = strtoi64(str, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+ if (*cp != ':')
+ return DTERR_BAD_FORMAT;
+ errno = 0;
+ itm->tm_min = strtoint(cp + 1, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+ if (*cp == '\0')
+ {
+ itm->tm_sec = 0;
+ /* If it's a MINUTE TO SECOND interval, take 2 fields as being mm:ss */
+ if (range == (INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND)))
+ {
+ if (itm->tm_hour > INT_MAX || itm->tm_hour < INT_MIN)
+ return DTERR_FIELD_OVERFLOW;
+ itm->tm_sec = itm->tm_min;
+ itm->tm_min = (int) itm->tm_hour;
+ itm->tm_hour = 0;
+ }
+ }
+ else if (*cp == '.')
+ {
+ /* always assume mm:ss.sss is MINUTE TO SECOND */
+ dterr = ParseFractionalSecond(cp, &fsec);
+ if (dterr)
+ return dterr;
+ if (itm->tm_hour > INT_MAX || itm->tm_hour < INT_MIN)
+ return DTERR_FIELD_OVERFLOW;
+ itm->tm_sec = itm->tm_min;
+ itm->tm_min = (int) itm->tm_hour;
+ itm->tm_hour = 0;
+ }
+ else if (*cp == ':')
+ {
+ errno = 0;
+ itm->tm_sec = strtoint(cp + 1, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+ if (*cp == '.')
+ {
+ dterr = ParseFractionalSecond(cp, &fsec);
+ if (dterr)
+ return dterr;
+ }
+ else if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+ }
+ else
+ return DTERR_BAD_FORMAT;
+
+ /* do a sanity check; but caller must check the range of tm_hour */
+ if (itm->tm_hour < 0 ||
+ itm->tm_min < 0 || itm->tm_min > MINS_PER_HOUR - 1 ||
+ itm->tm_sec < 0 || itm->tm_sec > SECS_PER_MINUTE ||
+ fsec < 0 || fsec > USECS_PER_SEC)
+ return DTERR_FIELD_OVERFLOW;
+
+ itm->tm_usec = (int) fsec;
+
+ return 0;
+}
+
+/* DecodeTime()
+ * Decode time string which includes delimiters.
+ * Return 0 if okay, a DTERR code if not.
+ *
+ * This version is used for timestamps. The results are returned into
+ * the tm_hour/tm_min/tm_sec fields of *tm, and microseconds into *fsec.
+ */
+static int
+DecodeTime(char *str, int fmask, int range,
+ int *tmask, struct pg_tm *tm, fsec_t *fsec)
+{
+ struct pg_itm itm;
+ int dterr;
+
+ dterr = DecodeTimeCommon(str, fmask, range,
+ tmask, &itm);
+ if (dterr)
+ return dterr;
+
+ if (itm.tm_hour > INT_MAX)
+ return DTERR_FIELD_OVERFLOW;
+ tm->tm_hour = (int) itm.tm_hour;
+ tm->tm_min = itm.tm_min;
+ tm->tm_sec = itm.tm_sec;
+ *fsec = itm.tm_usec;
+
+ return 0;
+}
+
+/* DecodeTimeForInterval()
+ * Decode time string which includes delimiters.
+ * Return 0 if okay, a DTERR code if not.
+ *
+ * This version is used for intervals. The results are returned into
+ * itm_in->tm_usec.
+ */
+static int
+DecodeTimeForInterval(char *str, int fmask, int range,
+ int *tmask, struct pg_itm_in *itm_in)
+{
+ struct pg_itm itm;
+ int dterr;
+
+ dterr = DecodeTimeCommon(str, fmask, range,
+ tmask, &itm);
+ if (dterr)
+ return dterr;
+
+ itm_in->tm_usec = itm.tm_usec;
+ if (!int64_multiply_add(itm.tm_hour, USECS_PER_HOUR, &itm_in->tm_usec) ||
+ !int64_multiply_add(itm.tm_min, USECS_PER_MINUTE, &itm_in->tm_usec) ||
+ !int64_multiply_add(itm.tm_sec, USECS_PER_SEC, &itm_in->tm_usec))
+ return DTERR_FIELD_OVERFLOW;
+
+ return 0;
+}
+
+
+/* DecodeNumber()
+ * Interpret plain numeric field as a date value in context.
+ * Return 0 if okay, a DTERR code if not.
+ */
+static int
+DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
+ int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
+{
+ int val;
+ char *cp;
+ int dterr;
+
+ *tmask = 0;
+
+ errno = 0;
+ val = strtoint(str, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+ if (cp == str)
+ return DTERR_BAD_FORMAT;
+
+ if (*cp == '.')
+ {
+ /*
+ * More than two digits before decimal point? Then could be a date or
+ * a run-together time: 2001.360 20011225 040506.789
+ */
+ if (cp - str > 2)
+ {
+ dterr = DecodeNumberField(flen, str,
+ (fmask | DTK_DATE_M),
+ tmask, tm,
+ fsec, is2digits);
+ if (dterr < 0)
+ return dterr;
+ return 0;
+ }
+
+ dterr = ParseFractionalSecond(cp, fsec);
+ if (dterr)
+ return dterr;
+ }
+ else if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+
+ /* Special case for day of year */
+ if (flen == 3 && (fmask & DTK_DATE_M) == DTK_M(YEAR) && val >= 1 &&
+ val <= 366)
+ {
+ *tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY));
+ tm->tm_yday = val;
+ /* tm_mon and tm_mday can't actually be set yet ... */
+ return 0;
+ }
+
+ /* Switch based on what we have so far */
+ switch (fmask & DTK_DATE_M)
+ {
+ case 0:
+
+ /*
+ * Nothing so far; make a decision about what we think the input
+ * is. There used to be lots of heuristics here, but the
+ * consensus now is to be paranoid. It *must* be either
+ * YYYY-MM-DD (with a more-than-two-digit year field), or the
+ * field order defined by DateOrder.
+ */
+ if (flen >= 3 || DateOrder == DATEORDER_YMD)
+ {
+ *tmask = DTK_M(YEAR);
+ tm->tm_year = val;
+ }
+ else if (DateOrder == DATEORDER_DMY)
+ {
+ *tmask = DTK_M(DAY);
+ tm->tm_mday = val;
+ }
+ else
+ {
+ *tmask = DTK_M(MONTH);
+ tm->tm_mon = val;
+ }
+ break;
+
+ case (DTK_M(YEAR)):
+ /* Must be at second field of YY-MM-DD */
+ *tmask = DTK_M(MONTH);
+ tm->tm_mon = val;
+ break;
+
+ case (DTK_M(MONTH)):
+ if (haveTextMonth)
+ {
+ /*
+ * We are at the first numeric field of a date that included a
+ * textual month name. We want to support the variants
+ * MON-DD-YYYY, DD-MON-YYYY, and YYYY-MON-DD as unambiguous
+ * inputs. We will also accept MON-DD-YY or DD-MON-YY in
+ * either DMY or MDY modes, as well as YY-MON-DD in YMD mode.
+ */
+ if (flen >= 3 || DateOrder == DATEORDER_YMD)
+ {
+ *tmask = DTK_M(YEAR);
+ tm->tm_year = val;
+ }
+ else
+ {
+ *tmask = DTK_M(DAY);
+ tm->tm_mday = val;
+ }
+ }
+ else
+ {
+ /* Must be at second field of MM-DD-YY */
+ *tmask = DTK_M(DAY);
+ tm->tm_mday = val;
+ }
+ break;
+
+ case (DTK_M(YEAR) | DTK_M(MONTH)):
+ if (haveTextMonth)
+ {
+ /* Need to accept DD-MON-YYYY even in YMD mode */
+ if (flen >= 3 && *is2digits)
+ {
+ /* Guess that first numeric field is day was wrong */
+ *tmask = DTK_M(DAY); /* YEAR is already set */
+ tm->tm_mday = tm->tm_year;
+ tm->tm_year = val;
+ *is2digits = false;
+ }
+ else
+ {
+ *tmask = DTK_M(DAY);
+ tm->tm_mday = val;
+ }
+ }
+ else
+ {
+ /* Must be at third field of YY-MM-DD */
+ *tmask = DTK_M(DAY);
+ tm->tm_mday = val;
+ }
+ break;
+
+ case (DTK_M(DAY)):
+ /* Must be at second field of DD-MM-YY */
+ *tmask = DTK_M(MONTH);
+ tm->tm_mon = val;
+ break;
+
+ case (DTK_M(MONTH) | DTK_M(DAY)):
+ /* Must be at third field of DD-MM-YY or MM-DD-YY */
+ *tmask = DTK_M(YEAR);
+ tm->tm_year = val;
+ break;
+
+ case (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY)):
+ /* we have all the date, so it must be a time field */
+ dterr = DecodeNumberField(flen, str, fmask,
+ tmask, tm,
+ fsec, is2digits);
+ if (dterr < 0)
+ return dterr;
+ return 0;
+
+ default:
+ /* Anything else is bogus input */
+ return DTERR_BAD_FORMAT;
+ }
+
+ /*
+ * When processing a year field, mark it for adjustment if it's only one
+ * or two digits.
+ */
+ if (*tmask == DTK_M(YEAR))
+ *is2digits = (flen <= 2);
+
+ return 0;
+}
+
+
+/* DecodeNumberField()
+ * Interpret numeric string as a concatenated date or time field.
+ * Return a DTK token (>= 0) if successful, a DTERR code (< 0) if not.
+ *
+ * Use the context of previously decoded fields to help with
+ * the interpretation.
+ */
+static int
+DecodeNumberField(int len, char *str, int fmask,
+ int *tmask, struct pg_tm *tm, fsec_t *fsec, bool *is2digits)
+{
+ char *cp;
+
+ /*
+ * Have a decimal point? Then this is a date or something with a seconds
+ * field...
+ */
+ if ((cp = strchr(str, '.')) != NULL)
+ {
+ /*
+ * Can we use ParseFractionalSecond here? Not clear whether trailing
+ * junk should be rejected ...
+ */
+ if (cp[1] == '\0')
+ {
+ /* avoid assuming that strtod will accept "." */
+ *fsec = 0;
+ }
+ else
+ {
+ double frac;
+
+ errno = 0;
+ frac = strtod(cp, NULL);
+ if (errno != 0)
+ return DTERR_BAD_FORMAT;
+ *fsec = rint(frac * 1000000);
+ }
+ /* Now truncate off the fraction for further processing */
+ *cp = '\0';
+ len = strlen(str);
+ }
+ /* No decimal point and no complete date yet? */
+ else if ((fmask & DTK_DATE_M) != DTK_DATE_M)
+ {
+ if (len >= 6)
+ {
+ *tmask = DTK_DATE_M;
+
+ /*
+ * Start from end and consider first 2 as Day, next 2 as Month,
+ * and the rest as Year.
+ */
+ tm->tm_mday = atoi(str + (len - 2));
+ *(str + (len - 2)) = '\0';
+ tm->tm_mon = atoi(str + (len - 4));
+ *(str + (len - 4)) = '\0';
+ tm->tm_year = atoi(str);
+ if ((len - 4) == 2)
+ *is2digits = true;
+
+ return DTK_DATE;
+ }
+ }
+
+ /* not all time fields are specified? */
+ if ((fmask & DTK_TIME_M) != DTK_TIME_M)
+ {
+ /* hhmmss */
+ if (len == 6)
+ {
+ *tmask = DTK_TIME_M;
+ tm->tm_sec = atoi(str + 4);
+ *(str + 4) = '\0';
+ tm->tm_min = atoi(str + 2);
+ *(str + 2) = '\0';
+ tm->tm_hour = atoi(str);
+
+ return DTK_TIME;
+ }
+ /* hhmm? */
+ else if (len == 4)
+ {
+ *tmask = DTK_TIME_M;
+ tm->tm_sec = 0;
+ tm->tm_min = atoi(str + 2);
+ *(str + 2) = '\0';
+ tm->tm_hour = atoi(str);
+
+ return DTK_TIME;
+ }
+ }
+
+ return DTERR_BAD_FORMAT;
+}
+
+
+/* DecodeTimezone()
+ * Interpret string as a numeric timezone.
+ *
+ * Return 0 if okay (and set *tzp), a DTERR code if not okay.
+ */
+int
+DecodeTimezone(char *str, int *tzp)
+{
+ int tz;
+ int hr,
+ min,
+ sec = 0;
+ char *cp;
+
+ /* leading character must be "+" or "-" */
+ if (*str != '+' && *str != '-')
+ return DTERR_BAD_FORMAT;
+
+ errno = 0;
+ hr = strtoint(str + 1, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_TZDISP_OVERFLOW;
+
+ /* explicit delimiter? */
+ if (*cp == ':')
+ {
+ errno = 0;
+ min = strtoint(cp + 1, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_TZDISP_OVERFLOW;
+ if (*cp == ':')
+ {
+ errno = 0;
+ sec = strtoint(cp + 1, &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_TZDISP_OVERFLOW;
+ }
+ }
+ /* otherwise, might have run things together... */
+ else if (*cp == '\0' && strlen(str) > 3)
+ {
+ min = hr % 100;
+ hr = hr / 100;
+ /* we could, but don't, support a run-together hhmmss format */
+ }
+ else
+ min = 0;
+
+ /* Range-check the values; see notes in datatype/timestamp.h */
+ if (hr < 0 || hr > MAX_TZDISP_HOUR)
+ return DTERR_TZDISP_OVERFLOW;
+ if (min < 0 || min >= MINS_PER_HOUR)
+ return DTERR_TZDISP_OVERFLOW;
+ if (sec < 0 || sec >= SECS_PER_MINUTE)
+ return DTERR_TZDISP_OVERFLOW;
+
+ tz = (hr * MINS_PER_HOUR + min) * SECS_PER_MINUTE + sec;
+ if (*str == '-')
+ tz = -tz;
+
+ *tzp = -tz;
+
+ if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+
+ return 0;
+}
+
+
+/* DecodeTimezoneAbbrev()
+ * Interpret string as a timezone abbreviation, if possible.
+ *
+ * Returns an abbreviation type (TZ, DTZ, or DYNTZ), or UNKNOWN_FIELD if
+ * string is not any known abbreviation. On success, set *offset and *tz to
+ * represent the UTC offset (for TZ or DTZ) or underlying zone (for DYNTZ).
+ * Note that full timezone names (such as America/New_York) are not handled
+ * here, mostly for historical reasons.
+ *
+ * Given string must be lowercased already.
+ *
+ * Implement a cache lookup since it is likely that dates
+ * will be related in format.
+ */
+int
+DecodeTimezoneAbbrev(int field, char *lowtoken,
+ int *offset, pg_tz **tz)
+{
+ int type;
+ const datetkn *tp;
+
+ tp = abbrevcache[field];
+ /* use strncmp so that we match truncated tokens */
+ if (tp == NULL || strncmp(lowtoken, tp->token, TOKMAXLEN) != 0)
+ {
+ if (zoneabbrevtbl)
+ tp = datebsearch(lowtoken, zoneabbrevtbl->abbrevs,
+ zoneabbrevtbl->numabbrevs);
+ else
+ tp = NULL;
+ }
+ if (tp == NULL)
+ {
+ type = UNKNOWN_FIELD;
+ *offset = 0;
+ *tz = NULL;
+ }
+ else
+ {
+ abbrevcache[field] = tp;
+ type = tp->type;
+ if (type == DYNTZ)
+ {
+ *offset = 0;
+ *tz = FetchDynamicTimeZone(zoneabbrevtbl, tp);
+ }
+ else
+ {
+ *offset = tp->value;
+ *tz = NULL;
+ }
+ }
+
+ return type;
+}
+
+
+/* DecodeSpecial()
+ * Decode text string using lookup table.
+ *
+ * Recognizes the keywords listed in datetktbl.
+ * Note: at one time this would also recognize timezone abbreviations,
+ * but no more; use DecodeTimezoneAbbrev for that.
+ *
+ * Given string must be lowercased already.
+ *
+ * Implement a cache lookup since it is likely that dates
+ * will be related in format.
+ */
+int
+DecodeSpecial(int field, char *lowtoken, int *val)
+{
+ int type;
+ const datetkn *tp;
+
+ tp = datecache[field];
+ /* use strncmp so that we match truncated tokens */
+ if (tp == NULL || strncmp(lowtoken, tp->token, TOKMAXLEN) != 0)
+ {
+ tp = datebsearch(lowtoken, datetktbl, szdatetktbl);
+ }
+ if (tp == NULL)
+ {
+ type = UNKNOWN_FIELD;
+ *val = 0;
+ }
+ else
+ {
+ datecache[field] = tp;
+ type = tp->type;
+ *val = tp->value;
+ }
+
+ return type;
+}
+
+
+/* ClearPgItmIn
+ *
+ * Zero out a pg_itm_in
+ */
+static inline void
+ClearPgItmIn(struct pg_itm_in *itm_in)
+{
+ itm_in->tm_usec = 0;
+ itm_in->tm_mday = 0;
+ itm_in->tm_mon = 0;
+ itm_in->tm_year = 0;
+}
+
+
+/* DecodeInterval()
+ * Interpret previously parsed fields for general time interval.
+ * Returns 0 if successful, DTERR code if bogus input detected.
+ * dtype and itm_in are output parameters.
+ *
+ * Allow "date" field DTK_DATE since this could be just
+ * an unsigned floating point number. - thomas 1997-11-16
+ *
+ * Allow ISO-style time span, with implicit units on number of days
+ * preceding an hh:mm:ss field. - thomas 1998-04-30
+ */
+int
+DecodeInterval(char **field, int *ftype, int nf, int range,
+ int *dtype, struct pg_itm_in *itm_in)
+{
+ bool force_negative = false;
+ bool is_before = false;
+ char *cp;
+ int fmask = 0,
+ tmask,
+ type,
+ uval;
+ int i;
+ int dterr;
+ int64 val;
+ double fval;
+
+ *dtype = DTK_DELTA;
+ type = IGNORE_DTF;
+ ClearPgItmIn(itm_in);
+
+ /*----------
+ * The SQL standard defines the interval literal
+ * '-1 1:00:00'
+ * to mean "negative 1 days and negative 1 hours", while Postgres
+ * traditionally treats this as meaning "negative 1 days and positive
+ * 1 hours". In SQL_STANDARD intervalstyle, we apply the leading sign
+ * to all fields if there are no other explicit signs.
+ *
+ * We leave the signs alone if there are additional explicit signs.
+ * This protects us against misinterpreting postgres-style dump output,
+ * since the postgres-style output code has always put an explicit sign on
+ * all fields following a negative field. But note that SQL-spec output
+ * is ambiguous and can be misinterpreted on load! (So it's best practice
+ * to dump in postgres style, not SQL style.)
+ *----------
+ */
+ if (IntervalStyle == INTSTYLE_SQL_STANDARD && nf > 0 && *field[0] == '-')
+ {
+ force_negative = true;
+ /* Check for additional explicit signs */
+ for (i = 1; i < nf; i++)
+ {
+ if (*field[i] == '-' || *field[i] == '+')
+ {
+ force_negative = false;
+ break;
+ }
+ }
+ }
+
+ /* read through list backwards to pick up units before values */
+ for (i = nf - 1; i >= 0; i--)
+ {
+ switch (ftype[i])
+ {
+ case DTK_TIME:
+ dterr = DecodeTimeForInterval(field[i], fmask, range,
+ &tmask, itm_in);
+ if (dterr)
+ return dterr;
+ if (force_negative &&
+ itm_in->tm_usec > 0)
+ itm_in->tm_usec = -itm_in->tm_usec;
+ type = DTK_DAY;
+ break;
+
+ case DTK_TZ:
+
+ /*
+ * Timezone means a token with a leading sign character and at
+ * least one digit; there could be ':', '.', '-' embedded in
+ * it as well.
+ */
+ Assert(*field[i] == '-' || *field[i] == '+');
+
+ /*
+ * Check for signed hh:mm or hh:mm:ss. If so, process exactly
+ * like DTK_TIME case above, plus handling the sign.
+ */
+ if (strchr(field[i] + 1, ':') != NULL &&
+ DecodeTimeForInterval(field[i] + 1, fmask, range,
+ &tmask, itm_in) == 0)
+ {
+ if (*field[i] == '-')
+ {
+ /* flip the sign on time field */
+ if (itm_in->tm_usec == PG_INT64_MIN)
+ return DTERR_FIELD_OVERFLOW;
+ itm_in->tm_usec = -itm_in->tm_usec;
+ }
+
+ if (force_negative &&
+ itm_in->tm_usec > 0)
+ itm_in->tm_usec = -itm_in->tm_usec;
+
+ /*
+ * Set the next type to be a day, if units are not
+ * specified. This handles the case of '1 +02:03' since we
+ * are reading right to left.
+ */
+ type = DTK_DAY;
+ break;
+ }
+
+ /*
+ * Otherwise, fall through to DTK_NUMBER case, which can
+ * handle signed float numbers and signed year-month values.
+ */
+
+ /* FALLTHROUGH */
+
+ case DTK_DATE:
+ case DTK_NUMBER:
+ if (type == IGNORE_DTF)
+ {
+ /* use typmod to decide what rightmost field is */
+ switch (range)
+ {
+ case INTERVAL_MASK(YEAR):
+ type = DTK_YEAR;
+ break;
+ case INTERVAL_MASK(MONTH):
+ case INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH):
+ type = DTK_MONTH;
+ break;
+ case INTERVAL_MASK(DAY):
+ type = DTK_DAY;
+ break;
+ case INTERVAL_MASK(HOUR):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR):
+ type = DTK_HOUR;
+ break;
+ case INTERVAL_MASK(MINUTE):
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ type = DTK_MINUTE;
+ break;
+ case INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ type = DTK_SECOND;
+ break;
+ default:
+ type = DTK_SECOND;
+ break;
+ }
+ }
+
+ errno = 0;
+ val = strtoi64(field[i], &cp, 10);
+ if (errno == ERANGE)
+ return DTERR_FIELD_OVERFLOW;
+
+ if (*cp == '-')
+ {
+ /* SQL "years-months" syntax */
+ int val2;
+
+ val2 = strtoint(cp + 1, &cp, 10);
+ if (errno == ERANGE || val2 < 0 || val2 >= MONTHS_PER_YEAR)
+ return DTERR_FIELD_OVERFLOW;
+ if (*cp != '\0')
+ return DTERR_BAD_FORMAT;
+ type = DTK_MONTH;
+ if (*field[i] == '-')
+ val2 = -val2;
+ if (pg_mul_s64_overflow(val, MONTHS_PER_YEAR, &val))
+ return DTERR_FIELD_OVERFLOW;
+ if (pg_add_s64_overflow(val, val2, &val))
+ return DTERR_FIELD_OVERFLOW;
+ fval = 0;
+ }
+ else if (*cp == '.')
+ {
+ dterr = ParseFraction(cp, &fval);
+ if (dterr)
+ return dterr;
+ if (*field[i] == '-')
+ fval = -fval;
+ }
+ else if (*cp == '\0')
+ fval = 0;
+ else
+ return DTERR_BAD_FORMAT;
+
+ tmask = 0; /* DTK_M(type); */
+
+ if (force_negative)
+ {
+ /* val and fval should be of same sign, but test anyway */
+ if (val > 0)
+ val = -val;
+ if (fval > 0)
+ fval = -fval;
+ }
+
+ switch (type)
+ {
+ case DTK_MICROSEC:
+ if (!AdjustMicroseconds(val, fval, 1, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(MICROSECOND);
+ break;
+
+ case DTK_MILLISEC:
+ if (!AdjustMicroseconds(val, fval, 1000, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(MILLISECOND);
+ break;
+
+ case DTK_SECOND:
+ if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+
+ /*
+ * If any subseconds were specified, consider this
+ * microsecond and millisecond input as well.
+ */
+ if (fval == 0)
+ tmask = DTK_M(SECOND);
+ else
+ tmask = DTK_ALL_SECS_M;
+ break;
+
+ case DTK_MINUTE:
+ if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(MINUTE);
+ break;
+
+ case DTK_HOUR:
+ if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(HOUR);
+ type = DTK_DAY; /* set for next field */
+ break;
+
+ case DTK_DAY:
+ if (!AdjustDays(val, 1, itm_in) ||
+ !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(DAY);
+ break;
+
+ case DTK_WEEK:
+ if (!AdjustDays(val, 7, itm_in) ||
+ !AdjustFractDays(fval, 7, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(WEEK);
+ break;
+
+ case DTK_MONTH:
+ if (!AdjustMonths(val, itm_in) ||
+ !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(MONTH);
+ break;
+
+ case DTK_YEAR:
+ if (!AdjustYears(val, 1, itm_in) ||
+ !AdjustFractYears(fval, 1, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(YEAR);
+ break;
+
+ case DTK_DECADE:
+ if (!AdjustYears(val, 10, itm_in) ||
+ !AdjustFractYears(fval, 10, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(DECADE);
+ break;
+
+ case DTK_CENTURY:
+ if (!AdjustYears(val, 100, itm_in) ||
+ !AdjustFractYears(fval, 100, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(CENTURY);
+ break;
+
+ case DTK_MILLENNIUM:
+ if (!AdjustYears(val, 1000, itm_in) ||
+ !AdjustFractYears(fval, 1000, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ tmask = DTK_M(MILLENNIUM);
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+ break;
+
+ case DTK_STRING:
+ case DTK_SPECIAL:
+ type = DecodeUnits(i, field[i], &uval);
+ if (type == IGNORE_DTF)
+ continue;
+
+ tmask = 0; /* DTK_M(type); */
+ switch (type)
+ {
+ case UNITS:
+ type = uval;
+ break;
+
+ case AGO:
+ is_before = true;
+ type = uval;
+ break;
+
+ case RESERV:
+ tmask = (DTK_DATE_M | DTK_TIME_M);
+ *dtype = uval;
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+ break;
+
+ default:
+ return DTERR_BAD_FORMAT;
+ }
+
+ if (tmask & fmask)
+ return DTERR_BAD_FORMAT;
+ fmask |= tmask;
+ }
+
+ /* ensure that at least one time field has been found */
+ if (fmask == 0)
+ return DTERR_BAD_FORMAT;
+
+ /* finally, AGO negates everything */
+ if (is_before)
+ {
+ if (itm_in->tm_usec == PG_INT64_MIN ||
+ itm_in->tm_mday == INT_MIN ||
+ itm_in->tm_mon == INT_MIN ||
+ itm_in->tm_year == INT_MIN)
+ return DTERR_FIELD_OVERFLOW;
+
+ itm_in->tm_usec = -itm_in->tm_usec;
+ itm_in->tm_mday = -itm_in->tm_mday;
+ itm_in->tm_mon = -itm_in->tm_mon;
+ itm_in->tm_year = -itm_in->tm_year;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Helper functions to avoid duplicated code in DecodeISO8601Interval.
+ *
+ * Parse a decimal value and break it into integer and fractional parts.
+ * Set *endptr to end+1 of the parsed substring.
+ * Returns 0 or DTERR code.
+ */
+static int
+ParseISO8601Number(char *str, char **endptr, int64 *ipart, double *fpart)
+{
+ double val;
+
+ /*
+ * Historically this has accepted anything that strtod() would take,
+ * notably including "e" notation, so continue doing that. This is
+ * slightly annoying because the precision of double is less than that of
+ * int64, so we would lose accuracy for inputs larger than 2^53 or so.
+ * However, historically we rejected inputs outside the int32 range,
+ * making that concern moot. What we do now is reject abs(val) above
+ * 1.0e15 (a round number a bit less than 2^50), so that any accepted
+ * value will have an exact integer part, and thereby a fraction part with
+ * abs(*fpart) less than 1. In the absence of field complaints it doesn't
+ * seem worth working harder.
+ */
+ if (!(isdigit((unsigned char) *str) || *str == '-' || *str == '.'))
+ return DTERR_BAD_FORMAT;
+ errno = 0;
+ val = strtod(str, endptr);
+ /* did we not see anything that looks like a double? */
+ if (*endptr == str || errno != 0)
+ return DTERR_BAD_FORMAT;
+ /* watch out for overflow, including infinities; reject NaN too */
+ if (isnan(val) || val < -1.0e15 || val > 1.0e15)
+ return DTERR_FIELD_OVERFLOW;
+ /* be very sure we truncate towards zero (cf dtrunc()) */
+ if (val >= 0)
+ *ipart = (int64) floor(val);
+ else
+ *ipart = (int64) -floor(-val);
+ *fpart = val - *ipart;
+ /* Callers expect this to hold */
+ Assert(*fpart > -1.0 && *fpart < 1.0);
+ return 0;
+}
+
+/*
+ * Determine number of integral digits in a valid ISO 8601 number field
+ * (we should ignore sign and any fraction part)
+ */
+static int
+ISO8601IntegerWidth(char *fieldstart)
+{
+ /* We might have had a leading '-' */
+ if (*fieldstart == '-')
+ fieldstart++;
+ return strspn(fieldstart, "0123456789");
+}
+
+
+/* DecodeISO8601Interval()
+ * Decode an ISO 8601 time interval of the "format with designators"
+ * (section 4.4.3.2) or "alternative format" (section 4.4.3.3)
+ * Examples: P1D for 1 day
+ * PT1H for 1 hour
+ * P2Y6M7DT1H30M for 2 years, 6 months, 7 days 1 hour 30 min
+ * P0002-06-07T01:30:00 the same value in alternative format
+ *
+ * Returns 0 if successful, DTERR code if bogus input detected.
+ * Note: error code should be DTERR_BAD_FORMAT if input doesn't look like
+ * ISO8601, otherwise this could cause unexpected error messages.
+ * dtype and itm_in are output parameters.
+ *
+ * A couple exceptions from the spec:
+ * - a week field ('W') may coexist with other units
+ * - allows decimals in fields other than the least significant unit.
+ */
+int
+DecodeISO8601Interval(char *str,
+ int *dtype, struct pg_itm_in *itm_in)
+{
+ bool datepart = true;
+ bool havefield = false;
+
+ *dtype = DTK_DELTA;
+ ClearPgItmIn(itm_in);
+
+ if (strlen(str) < 2 || str[0] != 'P')
+ return DTERR_BAD_FORMAT;
+
+ str++;
+ while (*str)
+ {
+ char *fieldstart;
+ int64 val;
+ double fval;
+ char unit;
+ int dterr;
+
+ if (*str == 'T') /* T indicates the beginning of the time part */
+ {
+ datepart = false;
+ havefield = false;
+ str++;
+ continue;
+ }
+
+ fieldstart = str;
+ dterr = ParseISO8601Number(str, &str, &val, &fval);
+ if (dterr)
+ return dterr;
+
+ /*
+ * Note: we could step off the end of the string here. Code below
+ * *must* exit the loop if unit == '\0'.
+ */
+ unit = *str++;
+
+ if (datepart)
+ {
+ switch (unit) /* before T: Y M W D */
+ {
+ case 'Y':
+ if (!AdjustYears(val, 1, itm_in) ||
+ !AdjustFractYears(fval, 1, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'M':
+ if (!AdjustMonths(val, itm_in) ||
+ !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'W':
+ if (!AdjustDays(val, 7, itm_in) ||
+ !AdjustFractDays(fval, 7, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'D':
+ if (!AdjustDays(val, 1, itm_in) ||
+ !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'T': /* ISO 8601 4.4.3.3 Alternative Format / Basic */
+ case '\0':
+ if (ISO8601IntegerWidth(fieldstart) == 8 && !havefield)
+ {
+ if (!AdjustYears(val / 10000, 1, itm_in) ||
+ !AdjustMonths((val / 100) % 100, itm_in) ||
+ !AdjustDays(val % 100, 1, itm_in) ||
+ !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (unit == '\0')
+ return 0;
+ datepart = false;
+ havefield = false;
+ continue;
+ }
+ /* Else fall through to extended alternative format */
+ /* FALLTHROUGH */
+ case '-': /* ISO 8601 4.4.3.3 Alternative Format,
+ * Extended */
+ if (havefield)
+ return DTERR_BAD_FORMAT;
+
+ if (!AdjustYears(val, 1, itm_in) ||
+ !AdjustFractYears(fval, 1, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (unit == '\0')
+ return 0;
+ if (unit == 'T')
+ {
+ datepart = false;
+ havefield = false;
+ continue;
+ }
+
+ dterr = ParseISO8601Number(str, &str, &val, &fval);
+ if (dterr)
+ return dterr;
+ if (!AdjustMonths(val, itm_in) ||
+ !AdjustFractDays(fval, DAYS_PER_MONTH, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (*str == '\0')
+ return 0;
+ if (*str == 'T')
+ {
+ datepart = false;
+ havefield = false;
+ continue;
+ }
+ if (*str != '-')
+ return DTERR_BAD_FORMAT;
+ str++;
+
+ dterr = ParseISO8601Number(str, &str, &val, &fval);
+ if (dterr)
+ return dterr;
+ if (!AdjustDays(val, 1, itm_in) ||
+ !AdjustFractMicroseconds(fval, USECS_PER_DAY, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (*str == '\0')
+ return 0;
+ if (*str == 'T')
+ {
+ datepart = false;
+ havefield = false;
+ continue;
+ }
+ return DTERR_BAD_FORMAT;
+ default:
+ /* not a valid date unit suffix */
+ return DTERR_BAD_FORMAT;
+ }
+ }
+ else
+ {
+ switch (unit) /* after T: H M S */
+ {
+ case 'H':
+ if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'M':
+ if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case 'S':
+ if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ break;
+ case '\0': /* ISO 8601 4.4.3.3 Alternative Format */
+ if (ISO8601IntegerWidth(fieldstart) == 6 && !havefield)
+ {
+ if (!AdjustMicroseconds(val / 10000, 0, USECS_PER_HOUR, itm_in) ||
+ !AdjustMicroseconds((val / 100) % 100, 0, USECS_PER_MINUTE, itm_in) ||
+ !AdjustMicroseconds(val % 100, 0, USECS_PER_SEC, itm_in) ||
+ !AdjustFractMicroseconds(fval, 1, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ return 0;
+ }
+ /* Else fall through to extended alternative format */
+ /* FALLTHROUGH */
+ case ':': /* ISO 8601 4.4.3.3 Alternative Format,
+ * Extended */
+ if (havefield)
+ return DTERR_BAD_FORMAT;
+
+ if (!AdjustMicroseconds(val, fval, USECS_PER_HOUR, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (unit == '\0')
+ return 0;
+
+ dterr = ParseISO8601Number(str, &str, &val, &fval);
+ if (dterr)
+ return dterr;
+ if (!AdjustMicroseconds(val, fval, USECS_PER_MINUTE, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (*str == '\0')
+ return 0;
+ if (*str != ':')
+ return DTERR_BAD_FORMAT;
+ str++;
+
+ dterr = ParseISO8601Number(str, &str, &val, &fval);
+ if (dterr)
+ return dterr;
+ if (!AdjustMicroseconds(val, fval, USECS_PER_SEC, itm_in))
+ return DTERR_FIELD_OVERFLOW;
+ if (*str == '\0')
+ return 0;
+ return DTERR_BAD_FORMAT;
+
+ default:
+ /* not a valid time unit suffix */
+ return DTERR_BAD_FORMAT;
+ }
+ }
+
+ havefield = true;
+ }
+
+ return 0;
+}
+
+
+/* DecodeUnits()
+ * Decode text string using lookup table.
+ *
+ * This routine recognizes keywords associated with time interval units.
+ *
+ * Given string must be lowercased already.
+ *
+ * Implement a cache lookup since it is likely that dates
+ * will be related in format.
+ */
+int
+DecodeUnits(int field, char *lowtoken, int *val)
+{
+ int type;
+ const datetkn *tp;
+
+ tp = deltacache[field];
+ /* use strncmp so that we match truncated tokens */
+ if (tp == NULL || strncmp(lowtoken, tp->token, TOKMAXLEN) != 0)
+ {
+ tp = datebsearch(lowtoken, deltatktbl, szdeltatktbl);
+ }
+ if (tp == NULL)
+ {
+ type = UNKNOWN_FIELD;
+ *val = 0;
+ }
+ else
+ {
+ deltacache[field] = tp;
+ type = tp->type;
+ *val = tp->value;
+ }
+
+ return type;
+} /* DecodeUnits() */
+
+/*
+ * Report an error detected by one of the datetime input processing routines.
+ *
+ * dterr is the error code, str is the original input string, datatype is
+ * the name of the datatype we were trying to accept.
+ *
+ * Note: it might seem useless to distinguish DTERR_INTERVAL_OVERFLOW and
+ * DTERR_TZDISP_OVERFLOW from DTERR_FIELD_OVERFLOW, but SQL99 mandates three
+ * separate SQLSTATE codes, so ...
+ */
+void
+DateTimeParseError(int dterr, const char *str, const char *datatype)
+{
+ switch (dterr)
+ {
+ case DTERR_FIELD_OVERFLOW:
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("date/time field value out of range: \"%s\"",
+ str)));
+ break;
+ case DTERR_MD_FIELD_OVERFLOW:
+ /* <nanny>same as above, but add hint about DateStyle</nanny> */
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("date/time field value out of range: \"%s\"",
+ str),
+ errhint("Perhaps you need a different \"datestyle\" setting.")));
+ break;
+ case DTERR_INTERVAL_OVERFLOW:
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERVAL_FIELD_OVERFLOW),
+ errmsg("interval field value out of range: \"%s\"",
+ str)));
+ break;
+ case DTERR_TZDISP_OVERFLOW:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE),
+ errmsg("time zone displacement out of range: \"%s\"",
+ str)));
+ break;
+ case DTERR_BAD_FORMAT:
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ datatype, str)));
+ break;
+ }
+}
+
+/* datebsearch()
+ * Binary search -- from Knuth (6.2.1) Algorithm B. Special case like this
+ * is WAY faster than the generic bsearch().
+ */
+static const datetkn *
+datebsearch(const char *key, const datetkn *base, int nel)
+{
+ if (nel > 0)
+ {
+ const datetkn *last = base + nel - 1,
+ *position;
+ int result;
+
+ while (last >= base)
+ {
+ position = base + ((last - base) >> 1);
+ /* precheck the first character for a bit of extra speed */
+ result = (int) key[0] - (int) position->token[0];
+ if (result == 0)
+ {
+ /* use strncmp so that we match truncated tokens */
+ result = strncmp(key, position->token, TOKMAXLEN);
+ if (result == 0)
+ return position;
+ }
+ if (result < 0)
+ last = position - 1;
+ else
+ base = position + 1;
+ }
+ }
+ return NULL;
+}
+
+/* EncodeTimezone()
+ * Copies representation of a numeric timezone offset to str.
+ *
+ * Returns a pointer to the new end of string. No NUL terminator is put
+ * there; callers are responsible for NUL terminating str themselves.
+ */
+static char *
+EncodeTimezone(char *str, int tz, int style)
+{
+ int hour,
+ min,
+ sec;
+
+ sec = abs(tz);
+ min = sec / SECS_PER_MINUTE;
+ sec -= min * SECS_PER_MINUTE;
+ hour = min / MINS_PER_HOUR;
+ min -= hour * MINS_PER_HOUR;
+
+ /* TZ is negated compared to sign we wish to display ... */
+ *str++ = (tz <= 0 ? '+' : '-');
+
+ if (sec != 0)
+ {
+ str = pg_ultostr_zeropad(str, hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, min, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, sec, 2);
+ }
+ else if (min != 0 || style == USE_XSD_DATES)
+ {
+ str = pg_ultostr_zeropad(str, hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, min, 2);
+ }
+ else
+ str = pg_ultostr_zeropad(str, hour, 2);
+ return str;
+}
+
+/* EncodeDateOnly()
+ * Encode date as local time.
+ */
+void
+EncodeDateOnly(struct pg_tm *tm, int style, char *str)
+{
+ Assert(tm->tm_mon >= 1 && tm->tm_mon <= MONTHS_PER_YEAR);
+
+ switch (style)
+ {
+ case USE_ISO_DATES:
+ case USE_XSD_DATES:
+ /* compatible with ISO date formats */
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ break;
+
+ case USE_SQL_DATES:
+ /* compatible with Oracle/Ingres date formats */
+ if (DateOrder == DATEORDER_DMY)
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ }
+ else
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ }
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ break;
+
+ case USE_GERMAN_DATES:
+ /* German-style date format */
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = '.';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '.';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ break;
+
+ case USE_POSTGRES_DATES:
+ default:
+ /* traditional date-only style for Postgres */
+ if (DateOrder == DATEORDER_DMY)
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ }
+ else
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ }
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ break;
+ }
+
+ if (tm->tm_year <= 0)
+ {
+ memcpy(str, " BC", 3); /* Don't copy NUL */
+ str += 3;
+ }
+ *str = '\0';
+}
+
+
+/* EncodeTimeOnly()
+ * Encode time fields only.
+ *
+ * tm and fsec are the value to encode, print_tz determines whether to include
+ * a time zone (the difference between time and timetz types), tz is the
+ * numeric time zone offset, style is the date style, str is where to write the
+ * output.
+ */
+void
+EncodeTimeOnly(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, int style, char *str)
+{
+ str = pg_ultostr_zeropad(str, tm->tm_hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, tm->tm_min, 2);
+ *str++ = ':';
+ str = AppendSeconds(str, tm->tm_sec, fsec, MAX_TIME_PRECISION, true);
+ if (print_tz)
+ str = EncodeTimezone(str, tz, style);
+ *str = '\0';
+}
+
+
+/* EncodeDateTime()
+ * Encode date and time interpreted as local time.
+ *
+ * tm and fsec are the value to encode, print_tz determines whether to include
+ * a time zone (the difference between timestamp and timestamptz types), tz is
+ * the numeric time zone offset, tzn is the textual time zone, which if
+ * specified will be used instead of tz by some styles, style is the date
+ * style, str is where to write the output.
+ *
+ * Supported date styles:
+ * Postgres - day mon hh:mm:ss yyyy tz
+ * SQL - mm/dd/yyyy hh:mm:ss.ss tz
+ * ISO - yyyy-mm-dd hh:mm:ss+/-tz
+ * German - dd.mm.yyyy hh:mm:ss tz
+ * XSD - yyyy-mm-ddThh:mm:ss.ss+/-tz
+ */
+void
+EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
+{
+ int day;
+
+ Assert(tm->tm_mon >= 1 && tm->tm_mon <= MONTHS_PER_YEAR);
+
+ /*
+ * Negative tm_isdst means we have no valid time zone translation.
+ */
+ if (tm->tm_isdst < 0)
+ print_tz = false;
+
+ switch (style)
+ {
+ case USE_ISO_DATES:
+ case USE_XSD_DATES:
+ /* Compatible with ISO-8601 date formats */
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '-';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = (style == USE_ISO_DATES) ? ' ' : 'T';
+ str = pg_ultostr_zeropad(str, tm->tm_hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, tm->tm_min, 2);
+ *str++ = ':';
+ str = AppendTimestampSeconds(str, tm, fsec);
+ if (print_tz)
+ str = EncodeTimezone(str, tz, style);
+ break;
+
+ case USE_SQL_DATES:
+ /* Compatible with Oracle/Ingres date formats */
+ if (DateOrder == DATEORDER_DMY)
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ }
+ else
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ }
+ *str++ = '/';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ *str++ = ' ';
+ str = pg_ultostr_zeropad(str, tm->tm_hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, tm->tm_min, 2);
+ *str++ = ':';
+ str = AppendTimestampSeconds(str, tm, fsec);
+
+ /*
+ * Note: the uses of %.*s in this function would be risky if the
+ * timezone names ever contain non-ASCII characters, since we are
+ * not being careful to do encoding-aware clipping. However, all
+ * TZ abbreviations in the IANA database are plain ASCII.
+ */
+ if (print_tz)
+ {
+ if (tzn)
+ {
+ sprintf(str, " %.*s", MAXTZLEN, tzn);
+ str += strlen(str);
+ }
+ else
+ str = EncodeTimezone(str, tz, style);
+ }
+ break;
+
+ case USE_GERMAN_DATES:
+ /* German variant on European style */
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = '.';
+ str = pg_ultostr_zeropad(str, tm->tm_mon, 2);
+ *str++ = '.';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+ *str++ = ' ';
+ str = pg_ultostr_zeropad(str, tm->tm_hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, tm->tm_min, 2);
+ *str++ = ':';
+ str = AppendTimestampSeconds(str, tm, fsec);
+
+ if (print_tz)
+ {
+ if (tzn)
+ {
+ sprintf(str, " %.*s", MAXTZLEN, tzn);
+ str += strlen(str);
+ }
+ else
+ str = EncodeTimezone(str, tz, style);
+ }
+ break;
+
+ case USE_POSTGRES_DATES:
+ default:
+ /* Backward-compatible with traditional Postgres abstime dates */
+ day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
+ tm->tm_wday = j2day(day);
+ memcpy(str, days[tm->tm_wday], 3);
+ str += 3;
+ *str++ = ' ';
+ if (DateOrder == DATEORDER_DMY)
+ {
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ *str++ = ' ';
+ memcpy(str, months[tm->tm_mon - 1], 3);
+ str += 3;
+ }
+ else
+ {
+ memcpy(str, months[tm->tm_mon - 1], 3);
+ str += 3;
+ *str++ = ' ';
+ str = pg_ultostr_zeropad(str, tm->tm_mday, 2);
+ }
+ *str++ = ' ';
+ str = pg_ultostr_zeropad(str, tm->tm_hour, 2);
+ *str++ = ':';
+ str = pg_ultostr_zeropad(str, tm->tm_min, 2);
+ *str++ = ':';
+ str = AppendTimestampSeconds(str, tm, fsec);
+ *str++ = ' ';
+ str = pg_ultostr_zeropad(str,
+ (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), 4);
+
+ if (print_tz)
+ {
+ if (tzn)
+ {
+ sprintf(str, " %.*s", MAXTZLEN, tzn);
+ str += strlen(str);
+ }
+ else
+ {
+ /*
+ * We have a time zone, but no string version. Use the
+ * numeric form, but be sure to include a leading space to
+ * avoid formatting something which would be rejected by
+ * the date/time parser later. - thomas 2001-10-19
+ */
+ *str++ = ' ';
+ str = EncodeTimezone(str, tz, style);
+ }
+ }
+ break;
+ }
+
+ if (tm->tm_year <= 0)
+ {
+ memcpy(str, " BC", 3); /* Don't copy NUL */
+ str += 3;
+ }
+ *str = '\0';
+}
+
+
+/*
+ * Helper functions to avoid duplicated code in EncodeInterval.
+ */
+
+/* Append an ISO-8601-style interval field, but only if value isn't zero */
+static char *
+AddISO8601IntPart(char *cp, int64 value, char units)
+{
+ if (value == 0)
+ return cp;
+ sprintf(cp, "%lld%c", (long long) value, units);
+ return cp + strlen(cp);
+}
+
+/* Append a postgres-style interval field, but only if value isn't zero */
+static char *
+AddPostgresIntPart(char *cp, int64 value, const char *units,
+ bool *is_zero, bool *is_before)
+{
+ if (value == 0)
+ return cp;
+ sprintf(cp, "%s%s%lld %s%s",
+ (!*is_zero) ? " " : "",
+ (*is_before && value > 0) ? "+" : "",
+ (long long) value,
+ units,
+ (value != 1) ? "s" : "");
+
+ /*
+ * Each nonzero field sets is_before for (only) the next one. This is a
+ * tad bizarre but it's how it worked before...
+ */
+ *is_before = (value < 0);
+ *is_zero = false;
+ return cp + strlen(cp);
+}
+
+/* Append a verbose-style interval field, but only if value isn't zero */
+static char *
+AddVerboseIntPart(char *cp, int64 value, const char *units,
+ bool *is_zero, bool *is_before)
+{
+ if (value == 0)
+ return cp;
+ /* first nonzero value sets is_before */
+ if (*is_zero)
+ {
+ *is_before = (value < 0);
+ value = Abs(value);
+ }
+ else if (*is_before)
+ value = -value;
+ sprintf(cp, " %lld %s%s", (long long) value, units, (value == 1) ? "" : "s");
+ *is_zero = false;
+ return cp + strlen(cp);
+}
+
+
+/* EncodeInterval()
+ * Interpret time structure as a delta time and convert to string.
+ *
+ * Support "traditional Postgres" and ISO-8601 styles.
+ * Actually, afaik ISO does not address time interval formatting,
+ * but this looks similar to the spec for absolute date/time.
+ * - thomas 1998-04-30
+ *
+ * Actually, afaik, ISO 8601 does specify formats for "time
+ * intervals...[of the]...format with time-unit designators", which
+ * are pretty ugly. The format looks something like
+ * P1Y1M1DT1H1M1.12345S
+ * but useful for exchanging data with computers instead of humans.
+ * - ron 2003-07-14
+ *
+ * And ISO's SQL 2008 standard specifies standards for
+ * "year-month literal"s (that look like '2-3') and
+ * "day-time literal"s (that look like ('4 5:6:7')
+ */
+void
+EncodeInterval(struct pg_itm *itm, int style, char *str)
+{
+ char *cp = str;
+ int year = itm->tm_year;
+ int mon = itm->tm_mon;
+ int64 mday = itm->tm_mday; /* tm_mday could be INT_MIN */
+ int64 hour = itm->tm_hour;
+ int min = itm->tm_min;
+ int sec = itm->tm_sec;
+ int fsec = itm->tm_usec;
+ bool is_before = false;
+ bool is_zero = true;
+
+ /*
+ * The sign of year and month are guaranteed to match, since they are
+ * stored internally as "month". But we'll need to check for is_before and
+ * is_zero when determining the signs of day and hour/minute/seconds
+ * fields.
+ */
+ switch (style)
+ {
+ /* SQL Standard interval format */
+ case INTSTYLE_SQL_STANDARD:
+ {
+ bool has_negative = year < 0 || mon < 0 ||
+ mday < 0 || hour < 0 ||
+ min < 0 || sec < 0 || fsec < 0;
+ bool has_positive = year > 0 || mon > 0 ||
+ mday > 0 || hour > 0 ||
+ min > 0 || sec > 0 || fsec > 0;
+ bool has_year_month = year != 0 || mon != 0;
+ bool has_day_time = mday != 0 || hour != 0 ||
+ min != 0 || sec != 0 || fsec != 0;
+ bool has_day = mday != 0;
+ bool sql_standard_value = !(has_negative && has_positive) &&
+ !(has_year_month && has_day_time);
+
+ /*
+ * SQL Standard wants only 1 "<sign>" preceding the whole
+ * interval ... but can't do that if mixed signs.
+ */
+ if (has_negative && sql_standard_value)
+ {
+ *cp++ = '-';
+ year = -year;
+ mon = -mon;
+ mday = -mday;
+ hour = -hour;
+ min = -min;
+ sec = -sec;
+ fsec = -fsec;
+ }
+
+ if (!has_negative && !has_positive)
+ {
+ sprintf(cp, "0");
+ }
+ else if (!sql_standard_value)
+ {
+ /*
+ * For non sql-standard interval values, force outputting
+ * the signs to avoid ambiguities with intervals with
+ * mixed sign components.
+ */
+ char year_sign = (year < 0 || mon < 0) ? '-' : '+';
+ char day_sign = (mday < 0) ? '-' : '+';
+ char sec_sign = (hour < 0 || min < 0 ||
+ sec < 0 || fsec < 0) ? '-' : '+';
+
+ sprintf(cp, "%c%d-%d %c%lld %c%lld:%02d:",
+ year_sign, abs(year), abs(mon),
+ day_sign, (long long) Abs(mday),
+ sec_sign, (long long) Abs(hour), abs(min));
+ cp += strlen(cp);
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
+ *cp = '\0';
+ }
+ else if (has_year_month)
+ {
+ sprintf(cp, "%d-%d", year, mon);
+ }
+ else if (has_day)
+ {
+ sprintf(cp, "%lld %lld:%02d:",
+ (long long) mday, (long long) hour, min);
+ cp += strlen(cp);
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
+ *cp = '\0';
+ }
+ else
+ {
+ sprintf(cp, "%lld:%02d:", (long long) hour, min);
+ cp += strlen(cp);
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
+ *cp = '\0';
+ }
+ }
+ break;
+
+ /* ISO 8601 "time-intervals by duration only" */
+ case INTSTYLE_ISO_8601:
+ /* special-case zero to avoid printing nothing */
+ if (year == 0 && mon == 0 && mday == 0 &&
+ hour == 0 && min == 0 && sec == 0 && fsec == 0)
+ {
+ sprintf(cp, "PT0S");
+ break;
+ }
+ *cp++ = 'P';
+ cp = AddISO8601IntPart(cp, year, 'Y');
+ cp = AddISO8601IntPart(cp, mon, 'M');
+ cp = AddISO8601IntPart(cp, mday, 'D');
+ if (hour != 0 || min != 0 || sec != 0 || fsec != 0)
+ *cp++ = 'T';
+ cp = AddISO8601IntPart(cp, hour, 'H');
+ cp = AddISO8601IntPart(cp, min, 'M');
+ if (sec != 0 || fsec != 0)
+ {
+ if (sec < 0 || fsec < 0)
+ *cp++ = '-';
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
+ *cp++ = 'S';
+ *cp++ = '\0';
+ }
+ break;
+
+ /* Compatible with postgresql < 8.4 when DateStyle = 'iso' */
+ case INTSTYLE_POSTGRES:
+ cp = AddPostgresIntPart(cp, year, "year", &is_zero, &is_before);
+
+ /*
+ * Ideally we should spell out "month" like we do for "year" and
+ * "day". However, for backward compatibility, we can't easily
+ * fix this. bjm 2011-05-24
+ */
+ cp = AddPostgresIntPart(cp, mon, "mon", &is_zero, &is_before);
+ cp = AddPostgresIntPart(cp, mday, "day", &is_zero, &is_before);
+ if (is_zero || hour != 0 || min != 0 || sec != 0 || fsec != 0)
+ {
+ bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0);
+
+ sprintf(cp, "%s%s%02lld:%02d:",
+ is_zero ? "" : " ",
+ (minus ? "-" : (is_before ? "+" : "")),
+ (long long) Abs(hour), abs(min));
+ cp += strlen(cp);
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
+ *cp = '\0';
+ }
+ break;
+
+ /* Compatible with postgresql < 8.4 when DateStyle != 'iso' */
+ case INTSTYLE_POSTGRES_VERBOSE:
+ default:
+ strcpy(cp, "@");
+ cp++;
+ cp = AddVerboseIntPart(cp, year, "year", &is_zero, &is_before);
+ cp = AddVerboseIntPart(cp, mon, "mon", &is_zero, &is_before);
+ cp = AddVerboseIntPart(cp, mday, "day", &is_zero, &is_before);
+ cp = AddVerboseIntPart(cp, hour, "hour", &is_zero, &is_before);
+ cp = AddVerboseIntPart(cp, min, "min", &is_zero, &is_before);
+ if (sec != 0 || fsec != 0)
+ {
+ *cp++ = ' ';
+ if (sec < 0 || (sec == 0 && fsec < 0))
+ {
+ if (is_zero)
+ is_before = true;
+ else if (!is_before)
+ *cp++ = '-';
+ }
+ else if (is_before)
+ *cp++ = '-';
+ cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
+ /* We output "ago", not negatives, so use abs(). */
+ sprintf(cp, " sec%s",
+ (abs(sec) != 1 || fsec != 0) ? "s" : "");
+ is_zero = false;
+ }
+ /* identically zero? then put in a unitless zero... */
+ if (is_zero)
+ strcat(cp, " 0");
+ if (is_before)
+ strcat(cp, " ago");
+ break;
+ }
+}
+
+
+/*
+ * We've been burnt by stupid errors in the ordering of the datetkn tables
+ * once too often. Arrange to check them during postmaster start.
+ */
+static bool
+CheckDateTokenTable(const char *tablename, const datetkn *base, int nel)
+{
+ bool ok = true;
+ int i;
+
+ for (i = 0; i < nel; i++)
+ {
+ /* check for token strings that don't fit */
+ if (strlen(base[i].token) > TOKMAXLEN)
+ {
+ /* %.*s is safe since all our tokens are ASCII */
+ elog(LOG, "token too long in %s table: \"%.*s\"",
+ tablename,
+ TOKMAXLEN + 1, base[i].token);
+ ok = false;
+ break; /* don't risk applying strcmp */
+ }
+ /* check for out of order */
+ if (i > 0 &&
+ strcmp(base[i - 1].token, base[i].token) >= 0)
+ {
+ elog(LOG, "ordering error in %s table: \"%s\" >= \"%s\"",
+ tablename,
+ base[i - 1].token,
+ base[i].token);
+ ok = false;
+ }
+ }
+ return ok;
+}
+
+bool
+CheckDateTokenTables(void)
+{
+ bool ok = true;
+
+ Assert(UNIX_EPOCH_JDATE == date2j(1970, 1, 1));
+ Assert(POSTGRES_EPOCH_JDATE == date2j(2000, 1, 1));
+
+ ok &= CheckDateTokenTable("datetktbl", datetktbl, szdatetktbl);
+ ok &= CheckDateTokenTable("deltatktbl", deltatktbl, szdeltatktbl);
+ return ok;
+}
+
+/*
+ * Common code for temporal prosupport functions: simplify, if possible,
+ * a call to a temporal type's length-coercion function.
+ *
+ * Types time, timetz, timestamp and timestamptz each have a range of allowed
+ * precisions. An unspecified precision is rigorously equivalent to the
+ * highest specifiable precision. We can replace the function call with a
+ * no-op RelabelType if it is coercing to the same or higher precision as the
+ * input is known to have.
+ *
+ * The input Node is always a FuncExpr, but to reduce the #include footprint
+ * of datetime.h, we declare it as Node *.
+ *
+ * Note: timestamp_scale throws an error when the typmod is out of range, but
+ * we can't get there from a cast: our typmodin will have caught it already.
+ */
+Node *
+TemporalSimplify(int32 max_precis, Node *node)
+{
+ FuncExpr *expr = castNode(FuncExpr, node);
+ Node *ret = NULL;
+ Node *typmod;
+
+ Assert(list_length(expr->args) >= 2);
+
+ typmod = (Node *) lsecond(expr->args);
+
+ if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
+ {
+ Node *source = (Node *) linitial(expr->args);
+ int32 old_precis = exprTypmod(source);
+ int32 new_precis = DatumGetInt32(((Const *) typmod)->constvalue);
+
+ if (new_precis < 0 || new_precis == max_precis ||
+ (old_precis >= 0 && new_precis >= old_precis))
+ ret = relabel_to_typmod(source, new_precis);
+ }
+
+ return ret;
+}
+
+/*
+ * This function gets called during timezone config file load or reload
+ * to create the final array of timezone tokens. The argument array
+ * is already sorted in name order.
+ *
+ * The result is a TimeZoneAbbrevTable (which must be a single malloc'd chunk)
+ * or NULL on malloc failure. No other error conditions are defined.
+ */
+TimeZoneAbbrevTable *
+ConvertTimeZoneAbbrevs(struct tzEntry *abbrevs, int n)
+{
+ TimeZoneAbbrevTable *tbl;
+ Size tbl_size;
+ int i;
+
+ /* Space for fixed fields and datetkn array */
+ tbl_size = offsetof(TimeZoneAbbrevTable, abbrevs) +
+ n * sizeof(datetkn);
+ tbl_size = MAXALIGN(tbl_size);
+ /* Count up space for dynamic abbreviations */
+ for (i = 0; i < n; i++)
+ {
+ struct tzEntry *abbr = abbrevs + i;
+
+ if (abbr->zone != NULL)
+ {
+ Size dsize;
+
+ dsize = offsetof(DynamicZoneAbbrev, zone) +
+ strlen(abbr->zone) + 1;
+ tbl_size += MAXALIGN(dsize);
+ }
+ }
+
+ /* Alloc the result ... */
+ tbl = malloc(tbl_size);
+ if (!tbl)
+ return NULL;
+
+ /* ... and fill it in */
+ tbl->tblsize = tbl_size;
+ tbl->numabbrevs = n;
+ /* in this loop, tbl_size reprises the space calculation above */
+ tbl_size = offsetof(TimeZoneAbbrevTable, abbrevs) +
+ n * sizeof(datetkn);
+ tbl_size = MAXALIGN(tbl_size);
+ for (i = 0; i < n; i++)
+ {
+ struct tzEntry *abbr = abbrevs + i;
+ datetkn *dtoken = tbl->abbrevs + i;
+
+ /* use strlcpy to truncate name if necessary */
+ strlcpy(dtoken->token, abbr->abbrev, TOKMAXLEN + 1);
+ if (abbr->zone != NULL)
+ {
+ /* Allocate a DynamicZoneAbbrev for this abbreviation */
+ DynamicZoneAbbrev *dtza;
+ Size dsize;
+
+ dtza = (DynamicZoneAbbrev *) ((char *) tbl + tbl_size);
+ dtza->tz = NULL;
+ strcpy(dtza->zone, abbr->zone);
+
+ dtoken->type = DYNTZ;
+ /* value is offset from table start to DynamicZoneAbbrev */
+ dtoken->value = (int32) tbl_size;
+
+ dsize = offsetof(DynamicZoneAbbrev, zone) +
+ strlen(abbr->zone) + 1;
+ tbl_size += MAXALIGN(dsize);
+ }
+ else
+ {
+ dtoken->type = abbr->is_dst ? DTZ : TZ;
+ dtoken->value = abbr->offset;
+ }
+ }
+
+ /* Assert the two loops above agreed on size calculations */
+ Assert(tbl->tblsize == tbl_size);
+
+ /* Check the ordering, if testing */
+ Assert(CheckDateTokenTable("timezone abbreviations", tbl->abbrevs, n));
+
+ return tbl;
+}
+
+/*
+ * Install a TimeZoneAbbrevTable as the active table.
+ *
+ * Caller is responsible that the passed table doesn't go away while in use.
+ */
+void
+InstallTimeZoneAbbrevs(TimeZoneAbbrevTable *tbl)
+{
+ zoneabbrevtbl = tbl;
+ /* reset abbrevcache, which may contain pointers into old table */
+ memset(abbrevcache, 0, sizeof(abbrevcache));
+}
+
+/*
+ * Helper subroutine to locate pg_tz timezone for a dynamic abbreviation.
+ */
+static pg_tz *
+FetchDynamicTimeZone(TimeZoneAbbrevTable *tbl, const datetkn *tp)
+{
+ DynamicZoneAbbrev *dtza;
+
+ /* Just some sanity checks to prevent indexing off into nowhere */
+ Assert(tp->type == DYNTZ);
+ Assert(tp->value > 0 && tp->value < tbl->tblsize);
+
+ dtza = (DynamicZoneAbbrev *) ((char *) tbl + tp->value);
+
+ /* Look up the underlying zone if we haven't already */
+ if (dtza->tz == NULL)
+ {
+ dtza->tz = pg_tzset(dtza->zone);
+
+ /*
+ * Ideally we'd let the caller ereport instead of doing it here, but
+ * then there is no way to report the bad time zone name.
+ */
+ if (dtza->tz == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("time zone \"%s\" not recognized",
+ dtza->zone),
+ errdetail("This time zone name appears in the configuration file for time zone abbreviation \"%s\".",
+ tp->token)));
+ }
+ return dtza->tz;
+}
+
+
+/*
+ * This set-returning function reads all the available time zone abbreviations
+ * and returns a set of (abbrev, utc_offset, is_dst).
+ */
+Datum
+pg_timezone_abbrevs(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ int *pindex;
+ Datum result;
+ HeapTuple tuple;
+ Datum values[3];
+ bool nulls[3];
+ const datetkn *tp;
+ char buffer[TOKMAXLEN + 1];
+ int gmtoffset;
+ bool is_dst;
+ unsigned char *p;
+ struct pg_itm_in itm_in;
+ Interval *resInterval;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ TupleDesc tupdesc;
+ MemoryContext oldcontext;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ pindex = (int *) palloc(sizeof(int));
+ *pindex = 0;
+ funcctx->user_fctx = (void *) pindex;
+
+ /*
+ * build tupdesc for result tuples. This must match this function's
+ * pg_proc entry!
+ */
+ tupdesc = CreateTemplateTupleDesc(3);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "abbrev",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "utc_offset",
+ INTERVALOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "is_dst",
+ BOOLOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+ pindex = (int *) funcctx->user_fctx;
+
+ if (zoneabbrevtbl == NULL ||
+ *pindex >= zoneabbrevtbl->numabbrevs)
+ SRF_RETURN_DONE(funcctx);
+
+ tp = zoneabbrevtbl->abbrevs + *pindex;
+
+ switch (tp->type)
+ {
+ case TZ:
+ gmtoffset = tp->value;
+ is_dst = false;
+ break;
+ case DTZ:
+ gmtoffset = tp->value;
+ is_dst = true;
+ break;
+ case DYNTZ:
+ {
+ /* Determine the current meaning of the abbrev */
+ pg_tz *tzp;
+ TimestampTz now;
+ int isdst;
+
+ tzp = FetchDynamicTimeZone(zoneabbrevtbl, tp);
+ now = GetCurrentTransactionStartTimestamp();
+ gmtoffset = -DetermineTimeZoneAbbrevOffsetTS(now,
+ tp->token,
+ tzp,
+ &isdst);
+ is_dst = (bool) isdst;
+ break;
+ }
+ default:
+ elog(ERROR, "unrecognized timezone type %d", (int) tp->type);
+ gmtoffset = 0; /* keep compiler quiet */
+ is_dst = false;
+ break;
+ }
+
+ MemSet(nulls, 0, sizeof(nulls));
+
+ /*
+ * Convert name to text, using upcasing conversion that is the inverse of
+ * what ParseDateTime() uses.
+ */
+ strlcpy(buffer, tp->token, sizeof(buffer));
+ for (p = (unsigned char *) buffer; *p; p++)
+ *p = pg_toupper(*p);
+
+ values[0] = CStringGetTextDatum(buffer);
+
+ /* Convert offset (in seconds) to an interval; can't overflow */
+ MemSet(&itm_in, 0, sizeof(struct pg_itm_in));
+ itm_in.tm_usec = (int64) gmtoffset * USECS_PER_SEC;
+ resInterval = (Interval *) palloc(sizeof(Interval));
+ (void) itmin2interval(&itm_in, resInterval);
+ values[1] = IntervalPGetDatum(resInterval);
+
+ values[2] = BoolGetDatum(is_dst);
+
+ (*pindex)++;
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+/*
+ * This set-returning function reads all the available full time zones
+ * and returns a set of (name, abbrev, utc_offset, is_dst).
+ */
+Datum
+pg_timezone_names(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ pg_tzenum *tzenum;
+ pg_tz *tz;
+ Datum values[4];
+ bool nulls[4];
+ int tzoff;
+ struct pg_tm tm;
+ fsec_t fsec;
+ const char *tzn;
+ Interval *resInterval;
+ struct pg_itm_in itm_in;
+
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* initialize timezone scanning code */
+ tzenum = pg_tzenumerate_start();
+
+ /* search for another zone to display */
+ for (;;)
+ {
+ tz = pg_tzenumerate_next(tzenum);
+ if (!tz)
+ break;
+
+ /* Convert now() to local time in this zone */
+ if (timestamp2tm(GetCurrentTransactionStartTimestamp(),
+ &tzoff, &tm, &fsec, &tzn, tz) != 0)
+ continue; /* ignore if conversion fails */
+
+ /*
+ * IANA's rather silly "Factory" time zone used to emit ridiculously
+ * long "abbreviations" such as "Local time zone must be set--see zic
+ * manual page" or "Local time zone must be set--use tzsetup". While
+ * modern versions of tzdb emit the much saner "-00", it seems some
+ * benighted packagers are hacking the IANA data so that it continues
+ * to produce these strings. To prevent producing a weirdly wide
+ * abbrev column, reject ridiculously long abbreviations.
+ */
+ if (tzn && strlen(tzn) > 31)
+ continue;
+
+ MemSet(nulls, 0, sizeof(nulls));
+
+ values[0] = CStringGetTextDatum(pg_get_timezone_name(tz));
+ values[1] = CStringGetTextDatum(tzn ? tzn : "");
+
+ /* Convert tzoff to an interval; can't overflow */
+ MemSet(&itm_in, 0, sizeof(struct pg_itm_in));
+ itm_in.tm_usec = (int64) -tzoff * USECS_PER_SEC;
+ resInterval = (Interval *) palloc(sizeof(Interval));
+ (void) itmin2interval(&itm_in, resInterval);
+ values[2] = IntervalPGetDatum(resInterval);
+
+ values[3] = BoolGetDatum(tm.tm_isdst > 0);
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ pg_tzenumerate_end(tzenum);
+ return (Datum) 0;
+}
diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
new file mode 100644
index 0000000..f421024
--- /dev/null
+++ b/src/backend/utils/adt/datum.c
@@ -0,0 +1,554 @@
+/*-------------------------------------------------------------------------
+ *
+ * datum.c
+ * POSTGRES Datum (abstract data type) manipulation routines.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/datum.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * In the implementation of these routines we assume the following:
+ *
+ * A) if a type is "byVal" then all the information is stored in the
+ * Datum itself (i.e. no pointers involved!). In this case the
+ * length of the type is always greater than zero and not more than
+ * "sizeof(Datum)"
+ *
+ * B) if a type is not "byVal" and it has a fixed length (typlen > 0),
+ * then the "Datum" always contains a pointer to a stream of bytes.
+ * The number of significant bytes are always equal to the typlen.
+ *
+ * C) if a type is not "byVal" and has typlen == -1,
+ * then the "Datum" always points to a "struct varlena".
+ * This varlena structure has information about the actual length of this
+ * particular instance of the type and about its value.
+ *
+ * D) if a type is not "byVal" and has typlen == -2,
+ * then the "Datum" always points to a null-terminated C string.
+ *
+ * Note that we do not treat "toasted" datums specially; therefore what
+ * will be copied or compared is the compressed data or toast reference.
+ * An exception is made for datumCopy() of an expanded object, however,
+ * because most callers expect to get a simple contiguous (and pfree'able)
+ * result from datumCopy(). See also datumTransfer().
+ */
+
+#include "postgres.h"
+
+#include "access/detoast.h"
+#include "catalog/pg_type_d.h"
+#include "common/hashfn.h"
+#include "fmgr.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/expandeddatum.h"
+
+
+/*-------------------------------------------------------------------------
+ * datumGetSize
+ *
+ * Find the "real" size of a datum, given the datum value,
+ * whether it is a "by value", and the declared type length.
+ * (For TOAST pointer datums, this is the size of the pointer datum.)
+ *
+ * This is essentially an out-of-line version of the att_addlength_datum()
+ * macro in access/tupmacs.h. We do a tad more error checking though.
+ *-------------------------------------------------------------------------
+ */
+Size
+datumGetSize(Datum value, bool typByVal, int typLen)
+{
+ Size size;
+
+ if (typByVal)
+ {
+ /* Pass-by-value types are always fixed-length */
+ Assert(typLen > 0 && typLen <= sizeof(Datum));
+ size = (Size) typLen;
+ }
+ else
+ {
+ if (typLen > 0)
+ {
+ /* Fixed-length pass-by-ref type */
+ size = (Size) typLen;
+ }
+ else if (typLen == -1)
+ {
+ /* It is a varlena datatype */
+ struct varlena *s = (struct varlena *) DatumGetPointer(value);
+
+ if (!PointerIsValid(s))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid Datum pointer")));
+
+ size = (Size) VARSIZE_ANY(s);
+ }
+ else if (typLen == -2)
+ {
+ /* It is a cstring datatype */
+ char *s = (char *) DatumGetPointer(value);
+
+ if (!PointerIsValid(s))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid Datum pointer")));
+
+ size = (Size) (strlen(s) + 1);
+ }
+ else
+ {
+ elog(ERROR, "invalid typLen: %d", typLen);
+ size = 0; /* keep compiler quiet */
+ }
+ }
+
+ return size;
+}
+
+/*-------------------------------------------------------------------------
+ * datumCopy
+ *
+ * Make a copy of a non-NULL datum.
+ *
+ * If the datatype is pass-by-reference, memory is obtained with palloc().
+ *
+ * If the value is a reference to an expanded object, we flatten into memory
+ * obtained with palloc(). We need to copy because one of the main uses of
+ * this function is to copy a datum out of a transient memory context that's
+ * about to be destroyed, and the expanded object is probably in a child
+ * context that will also go away. Moreover, many callers assume that the
+ * result is a single pfree-able chunk.
+ *-------------------------------------------------------------------------
+ */
+Datum
+datumCopy(Datum value, bool typByVal, int typLen)
+{
+ Datum res;
+
+ if (typByVal)
+ res = value;
+ else if (typLen == -1)
+ {
+ /* It is a varlena datatype */
+ struct varlena *vl = (struct varlena *) DatumGetPointer(value);
+
+ if (VARATT_IS_EXTERNAL_EXPANDED(vl))
+ {
+ /* Flatten into the caller's memory context */
+ ExpandedObjectHeader *eoh = DatumGetEOHP(value);
+ Size resultsize;
+ char *resultptr;
+
+ resultsize = EOH_get_flat_size(eoh);
+ resultptr = (char *) palloc(resultsize);
+ EOH_flatten_into(eoh, (void *) resultptr, resultsize);
+ res = PointerGetDatum(resultptr);
+ }
+ else
+ {
+ /* Otherwise, just copy the varlena datum verbatim */
+ Size realSize;
+ char *resultptr;
+
+ realSize = (Size) VARSIZE_ANY(vl);
+ resultptr = (char *) palloc(realSize);
+ memcpy(resultptr, vl, realSize);
+ res = PointerGetDatum(resultptr);
+ }
+ }
+ else
+ {
+ /* Pass by reference, but not varlena, so not toasted */
+ Size realSize;
+ char *resultptr;
+
+ realSize = datumGetSize(value, typByVal, typLen);
+
+ resultptr = (char *) palloc(realSize);
+ memcpy(resultptr, DatumGetPointer(value), realSize);
+ res = PointerGetDatum(resultptr);
+ }
+ return res;
+}
+
+/*-------------------------------------------------------------------------
+ * datumTransfer
+ *
+ * Transfer a non-NULL datum into the current memory context.
+ *
+ * This is equivalent to datumCopy() except when the datum is a read-write
+ * pointer to an expanded object. In that case we merely reparent the object
+ * into the current context, and return its standard R/W pointer (in case the
+ * given one is a transient pointer of shorter lifespan).
+ *-------------------------------------------------------------------------
+ */
+Datum
+datumTransfer(Datum value, bool typByVal, int typLen)
+{
+ if (!typByVal && typLen == -1 &&
+ VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(value)))
+ value = TransferExpandedObject(value, CurrentMemoryContext);
+ else
+ value = datumCopy(value, typByVal, typLen);
+ return value;
+}
+
+/*-------------------------------------------------------------------------
+ * datumIsEqual
+ *
+ * Return true if two datums are equal, false otherwise
+ *
+ * NOTE: XXX!
+ * We just compare the bytes of the two values, one by one.
+ * This routine will return false if there are 2 different
+ * representations of the same value (something along the lines
+ * of say the representation of zero in one's complement arithmetic).
+ * Also, it will probably not give the answer you want if either
+ * datum has been "toasted".
+ *
+ * Do not try to make this any smarter than it currently is with respect
+ * to "toasted" datums, because some of the callers could be working in the
+ * context of an aborted transaction.
+ *-------------------------------------------------------------------------
+ */
+bool
+datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen)
+{
+ bool res;
+
+ if (typByVal)
+ {
+ /*
+ * just compare the two datums. NOTE: just comparing "len" bytes will
+ * not do the work, because we do not know how these bytes are aligned
+ * inside the "Datum". We assume instead that any given datatype is
+ * consistent about how it fills extraneous bits in the Datum.
+ */
+ res = (value1 == value2);
+ }
+ else
+ {
+ Size size1,
+ size2;
+ char *s1,
+ *s2;
+
+ /*
+ * Compare the bytes pointed by the pointers stored in the datums.
+ */
+ size1 = datumGetSize(value1, typByVal, typLen);
+ size2 = datumGetSize(value2, typByVal, typLen);
+ if (size1 != size2)
+ return false;
+ s1 = (char *) DatumGetPointer(value1);
+ s2 = (char *) DatumGetPointer(value2);
+ res = (memcmp(s1, s2, size1) == 0);
+ }
+ return res;
+}
+
+/*-------------------------------------------------------------------------
+ * datum_image_eq
+ *
+ * Compares two datums for identical contents, based on byte images. Return
+ * true if the two datums are equal, false otherwise.
+ *-------------------------------------------------------------------------
+ */
+bool
+datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
+{
+ Size len1,
+ len2;
+ bool result = true;
+
+ if (typByVal)
+ {
+ result = (value1 == value2);
+ }
+ else if (typLen > 0)
+ {
+ result = (memcmp(DatumGetPointer(value1),
+ DatumGetPointer(value2),
+ typLen) == 0);
+ }
+ else if (typLen == -1)
+ {
+ len1 = toast_raw_datum_size(value1);
+ len2 = toast_raw_datum_size(value2);
+ /* No need to de-toast if lengths don't match. */
+ if (len1 != len2)
+ result = false;
+ else
+ {
+ struct varlena *arg1val;
+ struct varlena *arg2val;
+
+ arg1val = PG_DETOAST_DATUM_PACKED(value1);
+ arg2val = PG_DETOAST_DATUM_PACKED(value2);
+
+ result = (memcmp(VARDATA_ANY(arg1val),
+ VARDATA_ANY(arg2val),
+ len1 - VARHDRSZ) == 0);
+
+ /* Only free memory if it's a copy made here. */
+ if ((Pointer) arg1val != (Pointer) value1)
+ pfree(arg1val);
+ if ((Pointer) arg2val != (Pointer) value2)
+ pfree(arg2val);
+ }
+ }
+ else if (typLen == -2)
+ {
+ char *s1,
+ *s2;
+
+ /* Compare cstring datums */
+ s1 = DatumGetCString(value1);
+ s2 = DatumGetCString(value2);
+ len1 = strlen(s1) + 1;
+ len2 = strlen(s2) + 1;
+ if (len1 != len2)
+ return false;
+ result = (memcmp(s1, s2, len1) == 0);
+ }
+ else
+ elog(ERROR, "unexpected typLen: %d", typLen);
+
+ return result;
+}
+
+/*-------------------------------------------------------------------------
+ * datum_image_hash
+ *
+ * Generate a hash value based on the binary representation of 'value'. Most
+ * use cases will want to use the hash function specific to the Datum's type,
+ * however, some corner cases require generating a hash value based on the
+ * actual bits rather than the logical value.
+ *-------------------------------------------------------------------------
+ */
+uint32
+datum_image_hash(Datum value, bool typByVal, int typLen)
+{
+ Size len;
+ uint32 result;
+
+ if (typByVal)
+ result = hash_bytes((unsigned char *) &value, sizeof(Datum));
+ else if (typLen > 0)
+ result = hash_bytes((unsigned char *) DatumGetPointer(value), typLen);
+ else if (typLen == -1)
+ {
+ struct varlena *val;
+
+ len = toast_raw_datum_size(value);
+
+ val = PG_DETOAST_DATUM_PACKED(value);
+
+ result = hash_bytes((unsigned char *) VARDATA_ANY(val), len - VARHDRSZ);
+
+ /* Only free memory if it's a copy made here. */
+ if ((Pointer) val != (Pointer) value)
+ pfree(val);
+ }
+ else if (typLen == -2)
+ {
+ char *s;
+
+ s = DatumGetCString(value);
+ len = strlen(s) + 1;
+
+ result = hash_bytes((unsigned char *) s, len);
+ }
+ else
+ {
+ elog(ERROR, "unexpected typLen: %d", typLen);
+ result = 0; /* keep compiler quiet */
+ }
+
+ return result;
+}
+
+/*-------------------------------------------------------------------------
+ * btequalimage
+ *
+ * Generic "equalimage" support function.
+ *
+ * B-Tree operator classes whose equality function could safely be replaced by
+ * datum_image_eq() in all cases can use this as their "equalimage" support
+ * function.
+ *
+ * Earlier minor releases erroneously associated this function with
+ * interval_ops. Detect that case to rescind deduplication support, without
+ * requiring initdb.
+ *-------------------------------------------------------------------------
+ */
+Datum
+btequalimage(PG_FUNCTION_ARGS)
+{
+ Oid opcintype = PG_GETARG_OID(0);
+
+ PG_RETURN_BOOL(opcintype != INTERVALOID);
+}
+
+/*-------------------------------------------------------------------------
+ * datumEstimateSpace
+ *
+ * Compute the amount of space that datumSerialize will require for a
+ * particular Datum.
+ *-------------------------------------------------------------------------
+ */
+Size
+datumEstimateSpace(Datum value, bool isnull, bool typByVal, int typLen)
+{
+ Size sz = sizeof(int);
+
+ if (!isnull)
+ {
+ /* no need to use add_size, can't overflow */
+ if (typByVal)
+ sz += sizeof(Datum);
+ else if (typLen == -1 &&
+ VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)))
+ {
+ /* Expanded objects need to be flattened, see comment below */
+ sz += EOH_get_flat_size(DatumGetEOHP(value));
+ }
+ else
+ sz += datumGetSize(value, typByVal, typLen);
+ }
+
+ return sz;
+}
+
+/*-------------------------------------------------------------------------
+ * datumSerialize
+ *
+ * Serialize a possibly-NULL datum into caller-provided storage.
+ *
+ * Note: "expanded" objects are flattened so as to produce a self-contained
+ * representation, but other sorts of toast pointers are transferred as-is.
+ * This is because the intended use of this function is to pass the value
+ * to another process within the same database server. The other process
+ * could not access an "expanded" object within this process's memory, but
+ * we assume it can dereference the same TOAST pointers this one can.
+ *
+ * The format is as follows: first, we write a 4-byte header word, which
+ * is either the length of a pass-by-reference datum, -1 for a
+ * pass-by-value datum, or -2 for a NULL. If the value is NULL, nothing
+ * further is written. If it is pass-by-value, sizeof(Datum) bytes
+ * follow. Otherwise, the number of bytes indicated by the header word
+ * follow. The caller is responsible for ensuring that there is enough
+ * storage to store the number of bytes that will be written; use
+ * datumEstimateSpace() to find out how many will be needed.
+ * *start_address is updated to point to the byte immediately following
+ * those written.
+ *-------------------------------------------------------------------------
+ */
+void
+datumSerialize(Datum value, bool isnull, bool typByVal, int typLen,
+ char **start_address)
+{
+ ExpandedObjectHeader *eoh = NULL;
+ int header;
+
+ /* Write header word. */
+ if (isnull)
+ header = -2;
+ else if (typByVal)
+ header = -1;
+ else if (typLen == -1 &&
+ VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)))
+ {
+ eoh = DatumGetEOHP(value);
+ header = EOH_get_flat_size(eoh);
+ }
+ else
+ header = datumGetSize(value, typByVal, typLen);
+ memcpy(*start_address, &header, sizeof(int));
+ *start_address += sizeof(int);
+
+ /* If not null, write payload bytes. */
+ if (!isnull)
+ {
+ if (typByVal)
+ {
+ memcpy(*start_address, &value, sizeof(Datum));
+ *start_address += sizeof(Datum);
+ }
+ else if (eoh)
+ {
+ char *tmp;
+
+ /*
+ * EOH_flatten_into expects the target address to be maxaligned,
+ * so we can't store directly to *start_address.
+ */
+ tmp = (char *) palloc(header);
+ EOH_flatten_into(eoh, (void *) tmp, header);
+ memcpy(*start_address, tmp, header);
+ *start_address += header;
+
+ /* be tidy. */
+ pfree(tmp);
+ }
+ else
+ {
+ memcpy(*start_address, DatumGetPointer(value), header);
+ *start_address += header;
+ }
+ }
+}
+
+/*-------------------------------------------------------------------------
+ * datumRestore
+ *
+ * Restore a possibly-NULL datum previously serialized by datumSerialize.
+ * *start_address is updated according to the number of bytes consumed.
+ *-------------------------------------------------------------------------
+ */
+Datum
+datumRestore(char **start_address, bool *isnull)
+{
+ int header;
+ void *d;
+
+ /* Read header word. */
+ memcpy(&header, *start_address, sizeof(int));
+ *start_address += sizeof(int);
+
+ /* If this datum is NULL, we can stop here. */
+ if (header == -2)
+ {
+ *isnull = true;
+ return (Datum) 0;
+ }
+
+ /* OK, datum is not null. */
+ *isnull = false;
+
+ /* If this datum is pass-by-value, sizeof(Datum) bytes follow. */
+ if (header == -1)
+ {
+ Datum val;
+
+ memcpy(&val, *start_address, sizeof(Datum));
+ *start_address += sizeof(Datum);
+ return val;
+ }
+
+ /* Pass-by-reference case; copy indicated number of bytes. */
+ Assert(header > 0);
+ d = palloc(header);
+ memcpy(d, *start_address, header);
+ *start_address += header;
+ return PointerGetDatum(d);
+}
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
new file mode 100644
index 0000000..b4a2c8d
--- /dev/null
+++ b/src/backend/utils/adt/dbsize.c
@@ -0,0 +1,996 @@
+/*
+ * dbsize.c
+ * Database object size functions, and related inquiries
+ *
+ * Copyright (c) 2002-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/dbsize.c
+ *
+ */
+
+#include "postgres.h"
+
+#include <sys/stat.h>
+
+#include "access/htup_details.h"
+#include "access/relation.h"
+#include "catalog/catalog.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_tablespace.h"
+#include "commands/dbcommands.h"
+#include "commands/tablespace.h"
+#include "miscadmin.h"
+#include "storage/fd.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/numeric.h"
+#include "utils/rel.h"
+#include "utils/relfilenodemap.h"
+#include "utils/relmapper.h"
+#include "utils/syscache.h"
+
+/* Divide by two and round away from zero */
+#define half_rounded(x) (((x) + ((x) < 0 ? -1 : 1)) / 2)
+
+/* Units used in pg_size_pretty functions. All units must be powers of 2 */
+struct size_pretty_unit
+{
+ const char *name; /* bytes, kB, MB, GB etc */
+ uint32 limit; /* upper limit, prior to half rounding after
+ * converting to this unit. */
+ bool round; /* do half rounding for this unit */
+ uint8 unitbits; /* (1 << unitbits) bytes to make 1 of this
+ * unit */
+};
+
+/* When adding units here also update the error message in pg_size_bytes */
+static const struct size_pretty_unit size_pretty_units[] = {
+ {"bytes", 10 * 1024, false, 0},
+ {"kB", 20 * 1024 - 1, true, 10},
+ {"MB", 20 * 1024 - 1, true, 20},
+ {"GB", 20 * 1024 - 1, true, 30},
+ {"TB", 20 * 1024 - 1, true, 40},
+ {"PB", 20 * 1024 - 1, true, 50},
+ {NULL, 0, false, 0}
+};
+
+/* Return physical size of directory contents, or 0 if dir doesn't exist */
+static int64
+db_dir_size(const char *path)
+{
+ int64 dirsize = 0;
+ struct dirent *direntry;
+ DIR *dirdesc;
+ char filename[MAXPGPATH * 2];
+
+ dirdesc = AllocateDir(path);
+
+ if (!dirdesc)
+ return 0;
+
+ while ((direntry = ReadDir(dirdesc, path)) != NULL)
+ {
+ struct stat fst;
+
+ CHECK_FOR_INTERRUPTS();
+
+ if (strcmp(direntry->d_name, ".") == 0 ||
+ strcmp(direntry->d_name, "..") == 0)
+ continue;
+
+ snprintf(filename, sizeof(filename), "%s/%s", path, direntry->d_name);
+
+ if (stat(filename, &fst) < 0)
+ {
+ if (errno == ENOENT)
+ continue;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", filename)));
+ }
+ dirsize += fst.st_size;
+ }
+
+ FreeDir(dirdesc);
+ return dirsize;
+}
+
+/*
+ * calculate size of database in all tablespaces
+ */
+static int64
+calculate_database_size(Oid dbOid)
+{
+ int64 totalsize;
+ DIR *dirdesc;
+ struct dirent *direntry;
+ char dirpath[MAXPGPATH];
+ char pathname[MAXPGPATH + 21 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
+ AclResult aclresult;
+
+ /*
+ * User must have connect privilege for target database or have privileges
+ * of pg_read_all_stats
+ */
+ aclresult = pg_database_aclcheck(dbOid, GetUserId(), ACL_CONNECT);
+ if (aclresult != ACLCHECK_OK &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS))
+ {
+ aclcheck_error(aclresult, OBJECT_DATABASE,
+ get_database_name(dbOid));
+ }
+
+ /* Shared storage in pg_global is not counted */
+
+ /* Include pg_default storage */
+ snprintf(pathname, sizeof(pathname), "base/%u", dbOid);
+ totalsize = db_dir_size(pathname);
+
+ /* Scan the non-default tablespaces */
+ snprintf(dirpath, MAXPGPATH, "pg_tblspc");
+ dirdesc = AllocateDir(dirpath);
+
+ while ((direntry = ReadDir(dirdesc, dirpath)) != NULL)
+ {
+ CHECK_FOR_INTERRUPTS();
+
+ if (strcmp(direntry->d_name, ".") == 0 ||
+ strcmp(direntry->d_name, "..") == 0)
+ continue;
+
+ snprintf(pathname, sizeof(pathname), "pg_tblspc/%s/%s/%u",
+ direntry->d_name, TABLESPACE_VERSION_DIRECTORY, dbOid);
+ totalsize += db_dir_size(pathname);
+ }
+
+ FreeDir(dirdesc);
+
+ return totalsize;
+}
+
+Datum
+pg_database_size_oid(PG_FUNCTION_ARGS)
+{
+ Oid dbOid = PG_GETARG_OID(0);
+ int64 size;
+
+ size = calculate_database_size(dbOid);
+
+ if (size == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT64(size);
+}
+
+Datum
+pg_database_size_name(PG_FUNCTION_ARGS)
+{
+ Name dbName = PG_GETARG_NAME(0);
+ Oid dbOid = get_database_oid(NameStr(*dbName), false);
+ int64 size;
+
+ size = calculate_database_size(dbOid);
+
+ if (size == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT64(size);
+}
+
+
+/*
+ * Calculate total size of tablespace. Returns -1 if the tablespace directory
+ * cannot be found.
+ */
+static int64
+calculate_tablespace_size(Oid tblspcOid)
+{
+ char tblspcPath[MAXPGPATH];
+ char pathname[MAXPGPATH * 2];
+ int64 totalsize = 0;
+ DIR *dirdesc;
+ struct dirent *direntry;
+ AclResult aclresult;
+
+ /*
+ * User must have privileges of pg_read_all_stats or have CREATE privilege
+ * for target tablespace, either explicitly granted or implicitly because
+ * it is default for current database.
+ */
+ if (tblspcOid != MyDatabaseTableSpace &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS))
+ {
+ aclresult = pg_tablespace_aclcheck(tblspcOid, GetUserId(), ACL_CREATE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, OBJECT_TABLESPACE,
+ get_tablespace_name(tblspcOid));
+ }
+
+ if (tblspcOid == DEFAULTTABLESPACE_OID)
+ snprintf(tblspcPath, MAXPGPATH, "base");
+ else if (tblspcOid == GLOBALTABLESPACE_OID)
+ snprintf(tblspcPath, MAXPGPATH, "global");
+ else
+ snprintf(tblspcPath, MAXPGPATH, "pg_tblspc/%u/%s", tblspcOid,
+ TABLESPACE_VERSION_DIRECTORY);
+
+ dirdesc = AllocateDir(tblspcPath);
+
+ if (!dirdesc)
+ return -1;
+
+ while ((direntry = ReadDir(dirdesc, tblspcPath)) != NULL)
+ {
+ struct stat fst;
+
+ CHECK_FOR_INTERRUPTS();
+
+ if (strcmp(direntry->d_name, ".") == 0 ||
+ strcmp(direntry->d_name, "..") == 0)
+ continue;
+
+ snprintf(pathname, sizeof(pathname), "%s/%s", tblspcPath, direntry->d_name);
+
+ if (stat(pathname, &fst) < 0)
+ {
+ if (errno == ENOENT)
+ continue;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", pathname)));
+ }
+
+ if (S_ISDIR(fst.st_mode))
+ totalsize += db_dir_size(pathname);
+
+ totalsize += fst.st_size;
+ }
+
+ FreeDir(dirdesc);
+
+ return totalsize;
+}
+
+Datum
+pg_tablespace_size_oid(PG_FUNCTION_ARGS)
+{
+ Oid tblspcOid = PG_GETARG_OID(0);
+ int64 size;
+
+ size = calculate_tablespace_size(tblspcOid);
+
+ if (size < 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT64(size);
+}
+
+Datum
+pg_tablespace_size_name(PG_FUNCTION_ARGS)
+{
+ Name tblspcName = PG_GETARG_NAME(0);
+ Oid tblspcOid = get_tablespace_oid(NameStr(*tblspcName), false);
+ int64 size;
+
+ size = calculate_tablespace_size(tblspcOid);
+
+ if (size < 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT64(size);
+}
+
+
+/*
+ * calculate size of (one fork of) a relation
+ *
+ * Note: we can safely apply this to temp tables of other sessions, so there
+ * is no check here or at the call sites for that.
+ */
+static int64
+calculate_relation_size(RelFileNode *rfn, BackendId backend, ForkNumber forknum)
+{
+ int64 totalsize = 0;
+ char *relationpath;
+ char pathname[MAXPGPATH];
+ unsigned int segcount = 0;
+
+ relationpath = relpathbackend(*rfn, backend, forknum);
+
+ for (segcount = 0;; segcount++)
+ {
+ struct stat fst;
+
+ CHECK_FOR_INTERRUPTS();
+
+ if (segcount == 0)
+ snprintf(pathname, MAXPGPATH, "%s",
+ relationpath);
+ else
+ snprintf(pathname, MAXPGPATH, "%s.%u",
+ relationpath, segcount);
+
+ if (stat(pathname, &fst) < 0)
+ {
+ if (errno == ENOENT)
+ break;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", pathname)));
+ }
+ totalsize += fst.st_size;
+ }
+
+ return totalsize;
+}
+
+Datum
+pg_relation_size(PG_FUNCTION_ARGS)
+{
+ Oid relOid = PG_GETARG_OID(0);
+ text *forkName = PG_GETARG_TEXT_PP(1);
+ Relation rel;
+ int64 size;
+
+ rel = try_relation_open(relOid, AccessShareLock);
+
+ /*
+ * Before 9.2, we used to throw an error if the relation didn't exist, but
+ * that makes queries like "SELECT pg_relation_size(oid) FROM pg_class"
+ * less robust, because while we scan pg_class with an MVCC snapshot,
+ * someone else might drop the table. It's better to return NULL for
+ * already-dropped tables than throw an error and abort the whole query.
+ */
+ if (rel == NULL)
+ PG_RETURN_NULL();
+
+ size = calculate_relation_size(&(rel->rd_node), rel->rd_backend,
+ forkname_to_number(text_to_cstring(forkName)));
+
+ relation_close(rel, AccessShareLock);
+
+ PG_RETURN_INT64(size);
+}
+
+/*
+ * Calculate total on-disk size of a TOAST relation, including its indexes.
+ * Must not be applied to non-TOAST relations.
+ */
+static int64
+calculate_toast_table_size(Oid toastrelid)
+{
+ int64 size = 0;
+ Relation toastRel;
+ ForkNumber forkNum;
+ ListCell *lc;
+ List *indexlist;
+
+ toastRel = relation_open(toastrelid, AccessShareLock);
+
+ /* toast heap size, including FSM and VM size */
+ for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
+ size += calculate_relation_size(&(toastRel->rd_node),
+ toastRel->rd_backend, forkNum);
+
+ /* toast index size, including FSM and VM size */
+ indexlist = RelationGetIndexList(toastRel);
+
+ /* Size is calculated using all the indexes available */
+ foreach(lc, indexlist)
+ {
+ Relation toastIdxRel;
+
+ toastIdxRel = relation_open(lfirst_oid(lc),
+ AccessShareLock);
+ for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
+ size += calculate_relation_size(&(toastIdxRel->rd_node),
+ toastIdxRel->rd_backend, forkNum);
+
+ relation_close(toastIdxRel, AccessShareLock);
+ }
+ list_free(indexlist);
+ relation_close(toastRel, AccessShareLock);
+
+ return size;
+}
+
+/*
+ * Calculate total on-disk size of a given table,
+ * including FSM and VM, plus TOAST table if any.
+ * Indexes other than the TOAST table's index are not included.
+ *
+ * Note that this also behaves sanely if applied to an index or toast table;
+ * those won't have attached toast tables, but they can have multiple forks.
+ */
+static int64
+calculate_table_size(Relation rel)
+{
+ int64 size = 0;
+ ForkNumber forkNum;
+
+ /*
+ * heap size, including FSM and VM
+ */
+ for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
+ size += calculate_relation_size(&(rel->rd_node), rel->rd_backend,
+ forkNum);
+
+ /*
+ * Size of toast relation
+ */
+ if (OidIsValid(rel->rd_rel->reltoastrelid))
+ size += calculate_toast_table_size(rel->rd_rel->reltoastrelid);
+
+ return size;
+}
+
+/*
+ * Calculate total on-disk size of all indexes attached to the given table.
+ *
+ * Can be applied safely to an index, but you'll just get zero.
+ */
+static int64
+calculate_indexes_size(Relation rel)
+{
+ int64 size = 0;
+
+ /*
+ * Aggregate all indexes on the given relation
+ */
+ if (rel->rd_rel->relhasindex)
+ {
+ List *index_oids = RelationGetIndexList(rel);
+ ListCell *cell;
+
+ foreach(cell, index_oids)
+ {
+ Oid idxOid = lfirst_oid(cell);
+ Relation idxRel;
+ ForkNumber forkNum;
+
+ idxRel = relation_open(idxOid, AccessShareLock);
+
+ for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
+ size += calculate_relation_size(&(idxRel->rd_node),
+ idxRel->rd_backend,
+ forkNum);
+
+ relation_close(idxRel, AccessShareLock);
+ }
+
+ list_free(index_oids);
+ }
+
+ return size;
+}
+
+Datum
+pg_table_size(PG_FUNCTION_ARGS)
+{
+ Oid relOid = PG_GETARG_OID(0);
+ Relation rel;
+ int64 size;
+
+ rel = try_relation_open(relOid, AccessShareLock);
+
+ if (rel == NULL)
+ PG_RETURN_NULL();
+
+ size = calculate_table_size(rel);
+
+ relation_close(rel, AccessShareLock);
+
+ PG_RETURN_INT64(size);
+}
+
+Datum
+pg_indexes_size(PG_FUNCTION_ARGS)
+{
+ Oid relOid = PG_GETARG_OID(0);
+ Relation rel;
+ int64 size;
+
+ rel = try_relation_open(relOid, AccessShareLock);
+
+ if (rel == NULL)
+ PG_RETURN_NULL();
+
+ size = calculate_indexes_size(rel);
+
+ relation_close(rel, AccessShareLock);
+
+ PG_RETURN_INT64(size);
+}
+
+/*
+ * Compute the on-disk size of all files for the relation,
+ * including heap data, index data, toast data, FSM, VM.
+ */
+static int64
+calculate_total_relation_size(Relation rel)
+{
+ int64 size;
+
+ /*
+ * Aggregate the table size, this includes size of the heap, toast and
+ * toast index with free space and visibility map
+ */
+ size = calculate_table_size(rel);
+
+ /*
+ * Add size of all attached indexes as well
+ */
+ size += calculate_indexes_size(rel);
+
+ return size;
+}
+
+Datum
+pg_total_relation_size(PG_FUNCTION_ARGS)
+{
+ Oid relOid = PG_GETARG_OID(0);
+ Relation rel;
+ int64 size;
+
+ rel = try_relation_open(relOid, AccessShareLock);
+
+ if (rel == NULL)
+ PG_RETURN_NULL();
+
+ size = calculate_total_relation_size(rel);
+
+ relation_close(rel, AccessShareLock);
+
+ PG_RETURN_INT64(size);
+}
+
+/*
+ * formatting with size units
+ */
+Datum
+pg_size_pretty(PG_FUNCTION_ARGS)
+{
+ int64 size = PG_GETARG_INT64(0);
+ char buf[64];
+ const struct size_pretty_unit *unit;
+
+ for (unit = size_pretty_units; unit->name != NULL; unit++)
+ {
+ uint8 bits;
+
+ /* use this unit if there are no more units or we're below the limit */
+ if (unit[1].name == NULL || Abs(size) < unit->limit)
+ {
+ if (unit->round)
+ size = half_rounded(size);
+
+ snprintf(buf, sizeof(buf), INT64_FORMAT " %s", size, unit->name);
+ break;
+ }
+
+ /*
+ * Determine the number of bits to use to build the divisor. We may
+ * need to use 1 bit less than the difference between this and the
+ * next unit if the next unit uses half rounding. Or we may need to
+ * shift an extra bit if this unit uses half rounding and the next one
+ * does not. We use division rather than shifting right by this
+ * number of bits to ensure positive and negative values are rounded
+ * in the same way.
+ */
+ bits = (unit[1].unitbits - unit->unitbits - (unit[1].round == true)
+ + (unit->round == true));
+ size /= ((int64) 1) << bits;
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(buf));
+}
+
+static char *
+numeric_to_cstring(Numeric n)
+{
+ Datum d = NumericGetDatum(n);
+
+ return DatumGetCString(DirectFunctionCall1(numeric_out, d));
+}
+
+static bool
+numeric_is_less(Numeric a, Numeric b)
+{
+ Datum da = NumericGetDatum(a);
+ Datum db = NumericGetDatum(b);
+
+ return DatumGetBool(DirectFunctionCall2(numeric_lt, da, db));
+}
+
+static Numeric
+numeric_absolute(Numeric n)
+{
+ Datum d = NumericGetDatum(n);
+ Datum result;
+
+ result = DirectFunctionCall1(numeric_abs, d);
+ return DatumGetNumeric(result);
+}
+
+static Numeric
+numeric_half_rounded(Numeric n)
+{
+ Datum d = NumericGetDatum(n);
+ Datum zero;
+ Datum one;
+ Datum two;
+ Datum result;
+
+ zero = NumericGetDatum(int64_to_numeric(0));
+ one = NumericGetDatum(int64_to_numeric(1));
+ two = NumericGetDatum(int64_to_numeric(2));
+
+ if (DatumGetBool(DirectFunctionCall2(numeric_ge, d, zero)))
+ d = DirectFunctionCall2(numeric_add, d, one);
+ else
+ d = DirectFunctionCall2(numeric_sub, d, one);
+
+ result = DirectFunctionCall2(numeric_div_trunc, d, two);
+ return DatumGetNumeric(result);
+}
+
+static Numeric
+numeric_truncated_divide(Numeric n, int64 divisor)
+{
+ Datum d = NumericGetDatum(n);
+ Datum divisor_numeric;
+ Datum result;
+
+ divisor_numeric = NumericGetDatum(int64_to_numeric(divisor));
+ result = DirectFunctionCall2(numeric_div_trunc, d, divisor_numeric);
+ return DatumGetNumeric(result);
+}
+
+Datum
+pg_size_pretty_numeric(PG_FUNCTION_ARGS)
+{
+ Numeric size = PG_GETARG_NUMERIC(0);
+ char *result = NULL;
+ const struct size_pretty_unit *unit;
+
+ for (unit = size_pretty_units; unit->name != NULL; unit++)
+ {
+ unsigned int shiftby;
+
+ /* use this unit if there are no more units or we're below the limit */
+ if (unit[1].name == NULL ||
+ numeric_is_less(numeric_absolute(size),
+ int64_to_numeric(unit->limit)))
+ {
+ if (unit->round)
+ size = numeric_half_rounded(size);
+
+ result = psprintf("%s %s", numeric_to_cstring(size), unit->name);
+ break;
+ }
+
+ /*
+ * Determine the number of bits to use to build the divisor. We may
+ * need to use 1 bit less than the difference between this and the
+ * next unit if the next unit uses half rounding. Or we may need to
+ * shift an extra bit if this unit uses half rounding and the next one
+ * does not.
+ */
+ shiftby = (unit[1].unitbits - unit->unitbits - (unit[1].round == true)
+ + (unit->round == true));
+ size = numeric_truncated_divide(size, ((int64) 1) << shiftby);
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
+
+/*
+ * Convert a human-readable size to a size in bytes
+ */
+Datum
+pg_size_bytes(PG_FUNCTION_ARGS)
+{
+ text *arg = PG_GETARG_TEXT_PP(0);
+ char *str,
+ *strptr,
+ *endptr;
+ char saved_char;
+ Numeric num;
+ int64 result;
+ bool have_digits = false;
+
+ str = text_to_cstring(arg);
+
+ /* Skip leading whitespace */
+ strptr = str;
+ while (isspace((unsigned char) *strptr))
+ strptr++;
+
+ /* Check that we have a valid number and determine where it ends */
+ endptr = strptr;
+
+ /* Part (1): sign */
+ if (*endptr == '-' || *endptr == '+')
+ endptr++;
+
+ /* Part (2): main digit string */
+ if (isdigit((unsigned char) *endptr))
+ {
+ have_digits = true;
+ do
+ endptr++;
+ while (isdigit((unsigned char) *endptr));
+ }
+
+ /* Part (3): optional decimal point and fractional digits */
+ if (*endptr == '.')
+ {
+ endptr++;
+ if (isdigit((unsigned char) *endptr))
+ {
+ have_digits = true;
+ do
+ endptr++;
+ while (isdigit((unsigned char) *endptr));
+ }
+ }
+
+ /* Complain if we don't have a valid number at this point */
+ if (!have_digits)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid size: \"%s\"", str)));
+
+ /* Part (4): optional exponent */
+ if (*endptr == 'e' || *endptr == 'E')
+ {
+ long exponent;
+ char *cp;
+
+ /*
+ * Note we might one day support EB units, so if what follows 'E'
+ * isn't a number, just treat it all as a unit to be parsed.
+ */
+ exponent = strtol(endptr + 1, &cp, 10);
+ (void) exponent; /* Silence -Wunused-result warnings */
+ if (cp > endptr + 1)
+ endptr = cp;
+ }
+
+ /*
+ * Parse the number, saving the next character, which may be the first
+ * character of the unit string.
+ */
+ saved_char = *endptr;
+ *endptr = '\0';
+
+ num = DatumGetNumeric(DirectFunctionCall3(numeric_in,
+ CStringGetDatum(strptr),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1)));
+
+ *endptr = saved_char;
+
+ /* Skip whitespace between number and unit */
+ strptr = endptr;
+ while (isspace((unsigned char) *strptr))
+ strptr++;
+
+ /* Handle possible unit */
+ if (*strptr != '\0')
+ {
+ const struct size_pretty_unit *unit;
+ int64 multiplier = 0;
+
+ /* Trim any trailing whitespace */
+ endptr = str + VARSIZE_ANY_EXHDR(arg) - 1;
+
+ while (isspace((unsigned char) *endptr))
+ endptr--;
+
+ endptr++;
+ *endptr = '\0';
+
+ for (unit = size_pretty_units; unit->name != NULL; unit++)
+ {
+ /* Parse the unit case-insensitively */
+ if (pg_strcasecmp(strptr, unit->name) == 0)
+ {
+ multiplier = ((int64) 1) << unit->unitbits;
+ break;
+ }
+ }
+
+ /* Verify we found a valid unit in the loop above */
+ if (unit->name == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid size: \"%s\"", text_to_cstring(arg)),
+ errdetail("Invalid size unit: \"%s\".", strptr),
+ errhint("Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\".")));
+
+ if (multiplier > 1)
+ {
+ Numeric mul_num;
+
+ mul_num = int64_to_numeric(multiplier);
+
+ num = DatumGetNumeric(DirectFunctionCall2(numeric_mul,
+ NumericGetDatum(mul_num),
+ NumericGetDatum(num)));
+ }
+ }
+
+ result = DatumGetInt64(DirectFunctionCall1(numeric_int8,
+ NumericGetDatum(num)));
+
+ PG_RETURN_INT64(result);
+}
+
+/*
+ * Get the filenode of a relation
+ *
+ * This is expected to be used in queries like
+ * SELECT pg_relation_filenode(oid) FROM pg_class;
+ * That leads to a couple of choices. We work from the pg_class row alone
+ * rather than actually opening each relation, for efficiency. We don't
+ * fail if we can't find the relation --- some rows might be visible in
+ * the query's MVCC snapshot even though the relations have been dropped.
+ * (Note: we could avoid using the catcache, but there's little point
+ * because the relation mapper also works "in the now".) We also don't
+ * fail if the relation doesn't have storage. In all these cases it
+ * seems better to quietly return NULL.
+ */
+Datum
+pg_relation_filenode(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ Oid result;
+ HeapTuple tuple;
+ Form_pg_class relform;
+
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ PG_RETURN_NULL();
+ relform = (Form_pg_class) GETSTRUCT(tuple);
+
+ if (RELKIND_HAS_STORAGE(relform->relkind))
+ {
+ if (relform->relfilenode)
+ result = relform->relfilenode;
+ else /* Consult the relation mapper */
+ result = RelationMapOidToFilenode(relid,
+ relform->relisshared);
+ }
+ else
+ {
+ /* no storage, return NULL */
+ result = InvalidOid;
+ }
+
+ ReleaseSysCache(tuple);
+
+ if (!OidIsValid(result))
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * Get the relation via (reltablespace, relfilenode)
+ *
+ * This is expected to be used when somebody wants to match an individual file
+ * on the filesystem back to its table. That's not trivially possible via
+ * pg_class, because that doesn't contain the relfilenodes of shared and nailed
+ * tables.
+ *
+ * We don't fail but return NULL if we cannot find a mapping.
+ *
+ * InvalidOid can be passed instead of the current database's default
+ * tablespace.
+ */
+Datum
+pg_filenode_relation(PG_FUNCTION_ARGS)
+{
+ Oid reltablespace = PG_GETARG_OID(0);
+ Oid relfilenode = PG_GETARG_OID(1);
+ Oid heaprel;
+
+ /* test needed so RelidByRelfilenode doesn't misbehave */
+ if (!OidIsValid(relfilenode))
+ PG_RETURN_NULL();
+
+ heaprel = RelidByRelfilenode(reltablespace, relfilenode);
+
+ if (!OidIsValid(heaprel))
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_OID(heaprel);
+}
+
+/*
+ * Get the pathname (relative to $PGDATA) of a relation
+ *
+ * See comments for pg_relation_filenode.
+ */
+Datum
+pg_relation_filepath(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ HeapTuple tuple;
+ Form_pg_class relform;
+ RelFileNode rnode;
+ BackendId backend;
+ char *path;
+
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ PG_RETURN_NULL();
+ relform = (Form_pg_class) GETSTRUCT(tuple);
+
+ if (RELKIND_HAS_STORAGE(relform->relkind))
+ {
+ /* This logic should match RelationInitPhysicalAddr */
+ if (relform->reltablespace)
+ rnode.spcNode = relform->reltablespace;
+ else
+ rnode.spcNode = MyDatabaseTableSpace;
+ if (rnode.spcNode == GLOBALTABLESPACE_OID)
+ rnode.dbNode = InvalidOid;
+ else
+ rnode.dbNode = MyDatabaseId;
+ if (relform->relfilenode)
+ rnode.relNode = relform->relfilenode;
+ else /* Consult the relation mapper */
+ rnode.relNode = RelationMapOidToFilenode(relid,
+ relform->relisshared);
+ }
+ else
+ {
+ /* no storage, return NULL */
+ rnode.relNode = InvalidOid;
+ /* some compilers generate warnings without these next two lines */
+ rnode.dbNode = InvalidOid;
+ rnode.spcNode = InvalidOid;
+ }
+
+ if (!OidIsValid(rnode.relNode))
+ {
+ ReleaseSysCache(tuple);
+ PG_RETURN_NULL();
+ }
+
+ /* Determine owning backend. */
+ switch (relform->relpersistence)
+ {
+ case RELPERSISTENCE_UNLOGGED:
+ case RELPERSISTENCE_PERMANENT:
+ backend = InvalidBackendId;
+ break;
+ case RELPERSISTENCE_TEMP:
+ if (isTempOrTempToastNamespace(relform->relnamespace))
+ backend = BackendIdForTempRelations();
+ else
+ {
+ /* Do it the hard way. */
+ backend = GetTempNamespaceBackendId(relform->relnamespace);
+ Assert(backend != InvalidBackendId);
+ }
+ break;
+ default:
+ elog(ERROR, "invalid relpersistence: %c", relform->relpersistence);
+ backend = InvalidBackendId; /* placate compiler */
+ break;
+ }
+
+ ReleaseSysCache(tuple);
+
+ path = relpathbackend(rnode, backend, MAIN_FORKNUM);
+
+ PG_RETURN_TEXT_P(cstring_to_text(path));
+}
diff --git a/src/backend/utils/adt/domains.c b/src/backend/utils/adt/domains.c
new file mode 100644
index 0000000..3de0cb0
--- /dev/null
+++ b/src/backend/utils/adt/domains.c
@@ -0,0 +1,390 @@
+/*-------------------------------------------------------------------------
+ *
+ * domains.c
+ * I/O functions for domain types.
+ *
+ * The output functions for a domain type are just the same ones provided
+ * by its underlying base type. The input functions, however, must be
+ * prepared to apply any constraints defined by the type. So, we create
+ * special input functions that invoke the base type's input function
+ * and then check the constraints.
+ *
+ * The overhead required for constraint checking can be high, since examining
+ * the catalogs to discover the constraints for a given domain is not cheap.
+ * We have three mechanisms for minimizing this cost:
+ * 1. We rely on the typcache to keep up-to-date copies of the constraints.
+ * 2. In a nest of domains, we flatten the checking of all the levels
+ * into just one operation (the typcache does this for us).
+ * 3. If there are CHECK constraints, we cache a standalone ExprContext
+ * to evaluate them in.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/domains.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "catalog/pg_type.h"
+#include "executor/executor.h"
+#include "lib/stringinfo.h"
+#include "utils/builtins.h"
+#include "utils/expandeddatum.h"
+#include "utils/lsyscache.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+
+/*
+ * structure to cache state across multiple calls
+ */
+typedef struct DomainIOData
+{
+ Oid domain_type;
+ /* Data needed to call base type's input function */
+ Oid typiofunc;
+ Oid typioparam;
+ int32 typtypmod;
+ FmgrInfo proc;
+ /* Reference to cached list of constraint items to check */
+ DomainConstraintRef constraint_ref;
+ /* Context for evaluating CHECK constraints in */
+ ExprContext *econtext;
+ /* Memory context this cache is in */
+ MemoryContext mcxt;
+} DomainIOData;
+
+
+/*
+ * domain_state_setup - initialize the cache for a new domain type.
+ *
+ * Note: we can't re-use the same cache struct for a new domain type,
+ * since there's no provision for releasing the DomainConstraintRef.
+ * If a call site needs to deal with a new domain type, we just leak
+ * the old struct for the duration of the query.
+ */
+static DomainIOData *
+domain_state_setup(Oid domainType, bool binary, MemoryContext mcxt)
+{
+ DomainIOData *my_extra;
+ TypeCacheEntry *typentry;
+ Oid baseType;
+
+ my_extra = (DomainIOData *) MemoryContextAlloc(mcxt, sizeof(DomainIOData));
+
+ /*
+ * Verify that domainType represents a valid domain type. We need to be
+ * careful here because domain_in and domain_recv can be called from SQL,
+ * possibly with incorrect arguments. We use lookup_type_cache mainly
+ * because it will throw a clean user-facing error for a bad OID; but also
+ * it can cache the underlying base type info.
+ */
+ typentry = lookup_type_cache(domainType, TYPECACHE_DOMAIN_BASE_INFO);
+ if (typentry->typtype != TYPTYPE_DOMAIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("type %s is not a domain",
+ format_type_be(domainType))));
+
+ /* Find out the base type */
+ baseType = typentry->domainBaseType;
+ my_extra->typtypmod = typentry->domainBaseTypmod;
+
+ /* Look up underlying I/O function */
+ if (binary)
+ getTypeBinaryInputInfo(baseType,
+ &my_extra->typiofunc,
+ &my_extra->typioparam);
+ else
+ getTypeInputInfo(baseType,
+ &my_extra->typiofunc,
+ &my_extra->typioparam);
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc, mcxt);
+
+ /* Look up constraints for domain */
+ InitDomainConstraintRef(domainType, &my_extra->constraint_ref, mcxt, true);
+
+ /* We don't make an ExprContext until needed */
+ my_extra->econtext = NULL;
+ my_extra->mcxt = mcxt;
+
+ /* Mark cache valid */
+ my_extra->domain_type = domainType;
+
+ return my_extra;
+}
+
+/*
+ * domain_check_input - apply the cached checks.
+ *
+ * This is roughly similar to the handling of CoerceToDomain nodes in
+ * execExpr*.c, but we execute each constraint separately, rather than
+ * compiling them in-line within a larger expression.
+ */
+static void
+domain_check_input(Datum value, bool isnull, DomainIOData *my_extra)
+{
+ ExprContext *econtext = my_extra->econtext;
+ ListCell *l;
+
+ /* Make sure we have up-to-date constraints */
+ UpdateDomainConstraintRef(&my_extra->constraint_ref);
+
+ foreach(l, my_extra->constraint_ref.constraints)
+ {
+ DomainConstraintState *con = (DomainConstraintState *) lfirst(l);
+
+ switch (con->constrainttype)
+ {
+ case DOM_CONSTRAINT_NOTNULL:
+ if (isnull)
+ ereport(ERROR,
+ (errcode(ERRCODE_NOT_NULL_VIOLATION),
+ errmsg("domain %s does not allow null values",
+ format_type_be(my_extra->domain_type)),
+ errdatatype(my_extra->domain_type)));
+ break;
+ case DOM_CONSTRAINT_CHECK:
+ {
+ /* Make the econtext if we didn't already */
+ if (econtext == NULL)
+ {
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(my_extra->mcxt);
+ econtext = CreateStandaloneExprContext();
+ MemoryContextSwitchTo(oldcontext);
+ my_extra->econtext = econtext;
+ }
+
+ /*
+ * Set up value to be returned by CoerceToDomainValue
+ * nodes. Unlike in the generic expression case, this
+ * econtext couldn't be shared with anything else, so no
+ * need to save and restore fields. But we do need to
+ * protect the passed-in value against being changed by
+ * called functions. (It couldn't be a R/W expanded
+ * object for most uses, but that seems possible for
+ * domain_check().)
+ */
+ econtext->domainValue_datum =
+ MakeExpandedObjectReadOnly(value, isnull,
+ my_extra->constraint_ref.tcache->typlen);
+ econtext->domainValue_isNull = isnull;
+
+ if (!ExecCheck(con->check_exprstate, econtext))
+ ereport(ERROR,
+ (errcode(ERRCODE_CHECK_VIOLATION),
+ errmsg("value for domain %s violates check constraint \"%s\"",
+ format_type_be(my_extra->domain_type),
+ con->name),
+ errdomainconstraint(my_extra->domain_type,
+ con->name)));
+ break;
+ }
+ default:
+ elog(ERROR, "unrecognized constraint type: %d",
+ (int) con->constrainttype);
+ break;
+ }
+ }
+
+ /*
+ * Before exiting, call any shutdown callbacks and reset econtext's
+ * per-tuple memory. This avoids leaking non-memory resources, if
+ * anything in the expression(s) has any.
+ */
+ if (econtext)
+ ReScanExprContext(econtext);
+}
+
+
+/*
+ * domain_in - input routine for any domain type.
+ */
+Datum
+domain_in(PG_FUNCTION_ARGS)
+{
+ char *string;
+ Oid domainType;
+ DomainIOData *my_extra;
+ Datum value;
+
+ /*
+ * Since domain_in is not strict, we have to check for null inputs. The
+ * typioparam argument should never be null in normal system usage, but it
+ * could be null in a manual invocation --- if so, just return null.
+ */
+ if (PG_ARGISNULL(0))
+ string = NULL;
+ else
+ string = PG_GETARG_CSTRING(0);
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ domainType = PG_GETARG_OID(1);
+
+ /*
+ * We arrange to look up the needed info just once per series of calls,
+ * assuming the domain type doesn't change underneath us (which really
+ * shouldn't happen, but cope if it does).
+ */
+ my_extra = (DomainIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL || my_extra->domain_type != domainType)
+ {
+ my_extra = domain_state_setup(domainType, false,
+ fcinfo->flinfo->fn_mcxt);
+ fcinfo->flinfo->fn_extra = (void *) my_extra;
+ }
+
+ /*
+ * Invoke the base type's typinput procedure to convert the data.
+ */
+ value = InputFunctionCall(&my_extra->proc,
+ string,
+ my_extra->typioparam,
+ my_extra->typtypmod);
+
+ /*
+ * Do the necessary checks to ensure it's a valid domain value.
+ */
+ domain_check_input(value, (string == NULL), my_extra);
+
+ if (string == NULL)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_DATUM(value);
+}
+
+/*
+ * domain_recv - binary input routine for any domain type.
+ */
+Datum
+domain_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf;
+ Oid domainType;
+ DomainIOData *my_extra;
+ Datum value;
+
+ /*
+ * Since domain_recv is not strict, we have to check for null inputs. The
+ * typioparam argument should never be null in normal system usage, but it
+ * could be null in a manual invocation --- if so, just return null.
+ */
+ if (PG_ARGISNULL(0))
+ buf = NULL;
+ else
+ buf = (StringInfo) PG_GETARG_POINTER(0);
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ domainType = PG_GETARG_OID(1);
+
+ /*
+ * We arrange to look up the needed info just once per series of calls,
+ * assuming the domain type doesn't change underneath us (which really
+ * shouldn't happen, but cope if it does).
+ */
+ my_extra = (DomainIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL || my_extra->domain_type != domainType)
+ {
+ my_extra = domain_state_setup(domainType, true,
+ fcinfo->flinfo->fn_mcxt);
+ fcinfo->flinfo->fn_extra = (void *) my_extra;
+ }
+
+ /*
+ * Invoke the base type's typreceive procedure to convert the data.
+ */
+ value = ReceiveFunctionCall(&my_extra->proc,
+ buf,
+ my_extra->typioparam,
+ my_extra->typtypmod);
+
+ /*
+ * Do the necessary checks to ensure it's a valid domain value.
+ */
+ domain_check_input(value, (buf == NULL), my_extra);
+
+ if (buf == NULL)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_DATUM(value);
+}
+
+/*
+ * domain_check - check that a datum satisfies the constraints of a
+ * domain. extra and mcxt can be passed if they are available from,
+ * say, a FmgrInfo structure, or they can be NULL, in which case the
+ * setup is repeated for each call.
+ */
+void
+domain_check(Datum value, bool isnull, Oid domainType,
+ void **extra, MemoryContext mcxt)
+{
+ DomainIOData *my_extra = NULL;
+
+ if (mcxt == NULL)
+ mcxt = CurrentMemoryContext;
+
+ /*
+ * We arrange to look up the needed info just once per series of calls,
+ * assuming the domain type doesn't change underneath us (which really
+ * shouldn't happen, but cope if it does).
+ */
+ if (extra)
+ my_extra = (DomainIOData *) *extra;
+ if (my_extra == NULL || my_extra->domain_type != domainType)
+ {
+ my_extra = domain_state_setup(domainType, true, mcxt);
+ if (extra)
+ *extra = (void *) my_extra;
+ }
+
+ /*
+ * Do the necessary checks to ensure it's a valid domain value.
+ */
+ domain_check_input(value, isnull, my_extra);
+}
+
+/*
+ * errdatatype --- stores schema_name and datatype_name of a datatype
+ * within the current errordata.
+ */
+int
+errdatatype(Oid datatypeOid)
+{
+ HeapTuple tup;
+ Form_pg_type typtup;
+
+ tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(datatypeOid));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for type %u", datatypeOid);
+ typtup = (Form_pg_type) GETSTRUCT(tup);
+
+ err_generic_string(PG_DIAG_SCHEMA_NAME,
+ get_namespace_name(typtup->typnamespace));
+ err_generic_string(PG_DIAG_DATATYPE_NAME, NameStr(typtup->typname));
+
+ ReleaseSysCache(tup);
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errdomainconstraint --- stores schema_name, datatype_name and
+ * constraint_name of a domain-related constraint within the current errordata.
+ */
+int
+errdomainconstraint(Oid datatypeOid, const char *conname)
+{
+ errdatatype(datatypeOid);
+ err_generic_string(PG_DIAG_CONSTRAINT_NAME, conname);
+
+ return 0; /* return value does not matter */
+}
diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c
new file mode 100644
index 0000000..feb3e83
--- /dev/null
+++ b/src/backend/utils/adt/encode.c
@@ -0,0 +1,602 @@
+/*-------------------------------------------------------------------------
+ *
+ * encode.c
+ * Various data encoding/decoding things.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/encode.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "mb/pg_wchar.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+
+
+/*
+ * Encoding conversion API.
+ * encode_len() and decode_len() compute the amount of space needed, while
+ * encode() and decode() perform the actual conversions. It is okay for
+ * the _len functions to return an overestimate, but not an underestimate.
+ * (Having said that, large overestimates could cause unnecessary errors,
+ * so it's better to get it right.) The conversion routines write to the
+ * buffer at *res and return the true length of their output.
+ */
+struct pg_encoding
+{
+ uint64 (*encode_len) (const char *data, size_t dlen);
+ uint64 (*decode_len) (const char *data, size_t dlen);
+ uint64 (*encode) (const char *data, size_t dlen, char *res);
+ uint64 (*decode) (const char *data, size_t dlen, char *res);
+};
+
+static const struct pg_encoding *pg_find_encoding(const char *name);
+
+/*
+ * SQL functions.
+ */
+
+Datum
+binary_encode(PG_FUNCTION_ARGS)
+{
+ bytea *data = PG_GETARG_BYTEA_PP(0);
+ Datum name = PG_GETARG_DATUM(1);
+ text *result;
+ char *namebuf;
+ char *dataptr;
+ size_t datalen;
+ uint64 resultlen;
+ uint64 res;
+ const struct pg_encoding *enc;
+
+ namebuf = TextDatumGetCString(name);
+
+ enc = pg_find_encoding(namebuf);
+ if (enc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized encoding: \"%s\"", namebuf)));
+
+ dataptr = VARDATA_ANY(data);
+ datalen = VARSIZE_ANY_EXHDR(data);
+
+ resultlen = enc->encode_len(dataptr, datalen);
+
+ /*
+ * resultlen possibly overflows uint32, therefore on 32-bit machines it's
+ * unsafe to rely on palloc's internal check.
+ */
+ if (resultlen > MaxAllocSize - VARHDRSZ)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("result of encoding conversion is too large")));
+
+ result = palloc(VARHDRSZ + resultlen);
+
+ res = enc->encode(dataptr, datalen, VARDATA(result));
+
+ /* Make this FATAL 'cause we've trodden on memory ... */
+ if (res > resultlen)
+ elog(FATAL, "overflow - encode estimate too small");
+
+ SET_VARSIZE(result, VARHDRSZ + res);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+Datum
+binary_decode(PG_FUNCTION_ARGS)
+{
+ text *data = PG_GETARG_TEXT_PP(0);
+ Datum name = PG_GETARG_DATUM(1);
+ bytea *result;
+ char *namebuf;
+ char *dataptr;
+ size_t datalen;
+ uint64 resultlen;
+ uint64 res;
+ const struct pg_encoding *enc;
+
+ namebuf = TextDatumGetCString(name);
+
+ enc = pg_find_encoding(namebuf);
+ if (enc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized encoding: \"%s\"", namebuf)));
+
+ dataptr = VARDATA_ANY(data);
+ datalen = VARSIZE_ANY_EXHDR(data);
+
+ resultlen = enc->decode_len(dataptr, datalen);
+
+ /*
+ * resultlen possibly overflows uint32, therefore on 32-bit machines it's
+ * unsafe to rely on palloc's internal check.
+ */
+ if (resultlen > MaxAllocSize - VARHDRSZ)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("result of decoding conversion is too large")));
+
+ result = palloc(VARHDRSZ + resultlen);
+
+ res = enc->decode(dataptr, datalen, VARDATA(result));
+
+ /* Make this FATAL 'cause we've trodden on memory ... */
+ if (res > resultlen)
+ elog(FATAL, "overflow - decode estimate too small");
+
+ SET_VARSIZE(result, VARHDRSZ + res);
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+
+/*
+ * HEX
+ */
+
+static const char hextbl[] = "0123456789abcdef";
+
+static const int8 hexlookup[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+uint64
+hex_encode(const char *src, size_t len, char *dst)
+{
+ const char *end = src + len;
+
+ while (src < end)
+ {
+ *dst++ = hextbl[(*src >> 4) & 0xF];
+ *dst++ = hextbl[*src & 0xF];
+ src++;
+ }
+ return (uint64) len * 2;
+}
+
+static inline char
+get_hex(const char *cp)
+{
+ unsigned char c = (unsigned char) *cp;
+ int res = -1;
+
+ if (c < 127)
+ res = hexlookup[c];
+
+ if (res < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid hexadecimal digit: \"%.*s\"",
+ pg_mblen(cp), cp)));
+
+ return (char) res;
+}
+
+uint64
+hex_decode(const char *src, size_t len, char *dst)
+{
+ const char *s,
+ *srcend;
+ char v1,
+ v2,
+ *p;
+
+ srcend = src + len;
+ s = src;
+ p = dst;
+ while (s < srcend)
+ {
+ if (*s == ' ' || *s == '\n' || *s == '\t' || *s == '\r')
+ {
+ s++;
+ continue;
+ }
+ v1 = get_hex(s) << 4;
+ s++;
+ if (s >= srcend)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid hexadecimal data: odd number of digits")));
+
+ v2 = get_hex(s);
+ s++;
+ *p++ = v1 | v2;
+ }
+
+ return p - dst;
+}
+
+static uint64
+hex_enc_len(const char *src, size_t srclen)
+{
+ return (uint64) srclen << 1;
+}
+
+static uint64
+hex_dec_len(const char *src, size_t srclen)
+{
+ return (uint64) srclen >> 1;
+}
+
+/*
+ * BASE64
+ */
+
+static const char _base64[] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static const int8 b64lookup[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
+ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
+};
+
+static uint64
+pg_base64_encode(const char *src, size_t len, char *dst)
+{
+ char *p,
+ *lend = dst + 76;
+ const char *s,
+ *end = src + len;
+ int pos = 2;
+ uint32 buf = 0;
+
+ s = src;
+ p = dst;
+
+ while (s < end)
+ {
+ buf |= (unsigned char) *s << (pos << 3);
+ pos--;
+ s++;
+
+ /* write it out */
+ if (pos < 0)
+ {
+ *p++ = _base64[(buf >> 18) & 0x3f];
+ *p++ = _base64[(buf >> 12) & 0x3f];
+ *p++ = _base64[(buf >> 6) & 0x3f];
+ *p++ = _base64[buf & 0x3f];
+
+ pos = 2;
+ buf = 0;
+ }
+ if (p >= lend)
+ {
+ *p++ = '\n';
+ lend = p + 76;
+ }
+ }
+ if (pos != 2)
+ {
+ *p++ = _base64[(buf >> 18) & 0x3f];
+ *p++ = _base64[(buf >> 12) & 0x3f];
+ *p++ = (pos == 0) ? _base64[(buf >> 6) & 0x3f] : '=';
+ *p++ = '=';
+ }
+
+ return p - dst;
+}
+
+static uint64
+pg_base64_decode(const char *src, size_t len, char *dst)
+{
+ const char *srcend = src + len,
+ *s = src;
+ char *p = dst;
+ char c;
+ int b = 0;
+ uint32 buf = 0;
+ int pos = 0,
+ end = 0;
+
+ while (s < srcend)
+ {
+ c = *s++;
+
+ if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
+ continue;
+
+ if (c == '=')
+ {
+ /* end sequence */
+ if (!end)
+ {
+ if (pos == 2)
+ end = 1;
+ else if (pos == 3)
+ end = 2;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unexpected \"=\" while decoding base64 sequence")));
+ }
+ b = 0;
+ }
+ else
+ {
+ b = -1;
+ if (c > 0 && c < 127)
+ b = b64lookup[(unsigned char) c];
+ if (b < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid symbol \"%.*s\" found while decoding base64 sequence",
+ pg_mblen(s - 1), s - 1)));
+ }
+ /* add it to buffer */
+ buf = (buf << 6) + b;
+ pos++;
+ if (pos == 4)
+ {
+ *p++ = (buf >> 16) & 255;
+ if (end == 0 || end > 1)
+ *p++ = (buf >> 8) & 255;
+ if (end == 0 || end > 2)
+ *p++ = buf & 255;
+ buf = 0;
+ pos = 0;
+ }
+ }
+
+ if (pos != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid base64 end sequence"),
+ errhint("Input data is missing padding, is truncated, or is otherwise corrupted.")));
+
+ return p - dst;
+}
+
+
+static uint64
+pg_base64_enc_len(const char *src, size_t srclen)
+{
+ /* 3 bytes will be converted to 4, linefeed after 76 chars */
+ return ((uint64) srclen + 2) * 4 / 3 + (uint64) srclen / (76 * 3 / 4);
+}
+
+static uint64
+pg_base64_dec_len(const char *src, size_t srclen)
+{
+ return ((uint64) srclen * 3) >> 2;
+}
+
+/*
+ * Escape
+ * Minimally escape bytea to text.
+ * De-escape text to bytea.
+ *
+ * We must escape zero bytes and high-bit-set bytes to avoid generating
+ * text that might be invalid in the current encoding, or that might
+ * change to something else if passed through an encoding conversion
+ * (leading to failing to de-escape to the original bytea value).
+ * Also of course backslash itself has to be escaped.
+ *
+ * De-escaping processes \\ and any \### octal
+ */
+
+#define VAL(CH) ((CH) - '0')
+#define DIG(VAL) ((VAL) + '0')
+
+static uint64
+esc_encode(const char *src, size_t srclen, char *dst)
+{
+ const char *end = src + srclen;
+ char *rp = dst;
+ uint64 len = 0;
+
+ while (src < end)
+ {
+ unsigned char c = (unsigned char) *src;
+
+ if (c == '\0' || IS_HIGHBIT_SET(c))
+ {
+ rp[0] = '\\';
+ rp[1] = DIG(c >> 6);
+ rp[2] = DIG((c >> 3) & 7);
+ rp[3] = DIG(c & 7);
+ rp += 4;
+ len += 4;
+ }
+ else if (c == '\\')
+ {
+ rp[0] = '\\';
+ rp[1] = '\\';
+ rp += 2;
+ len += 2;
+ }
+ else
+ {
+ *rp++ = c;
+ len++;
+ }
+
+ src++;
+ }
+
+ return len;
+}
+
+static uint64
+esc_decode(const char *src, size_t srclen, char *dst)
+{
+ const char *end = src + srclen;
+ char *rp = dst;
+ uint64 len = 0;
+
+ while (src < end)
+ {
+ if (src[0] != '\\')
+ *rp++ = *src++;
+ else if (src + 3 < end &&
+ (src[1] >= '0' && src[1] <= '3') &&
+ (src[2] >= '0' && src[2] <= '7') &&
+ (src[3] >= '0' && src[3] <= '7'))
+ {
+ int val;
+
+ val = VAL(src[1]);
+ val <<= 3;
+ val += VAL(src[2]);
+ val <<= 3;
+ *rp++ = val + VAL(src[3]);
+ src += 4;
+ }
+ else if (src + 1 < end &&
+ (src[1] == '\\'))
+ {
+ *rp++ = '\\';
+ src += 2;
+ }
+ else
+ {
+ /*
+ * One backslash, not followed by ### valid octal. Should never
+ * get here, since esc_dec_len does same check.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "bytea")));
+ }
+
+ len++;
+ }
+
+ return len;
+}
+
+static uint64
+esc_enc_len(const char *src, size_t srclen)
+{
+ const char *end = src + srclen;
+ uint64 len = 0;
+
+ while (src < end)
+ {
+ if (*src == '\0' || IS_HIGHBIT_SET(*src))
+ len += 4;
+ else if (*src == '\\')
+ len += 2;
+ else
+ len++;
+
+ src++;
+ }
+
+ return len;
+}
+
+static uint64
+esc_dec_len(const char *src, size_t srclen)
+{
+ const char *end = src + srclen;
+ uint64 len = 0;
+
+ while (src < end)
+ {
+ if (src[0] != '\\')
+ src++;
+ else if (src + 3 < end &&
+ (src[1] >= '0' && src[1] <= '3') &&
+ (src[2] >= '0' && src[2] <= '7') &&
+ (src[3] >= '0' && src[3] <= '7'))
+ {
+ /*
+ * backslash + valid octal
+ */
+ src += 4;
+ }
+ else if (src + 1 < end &&
+ (src[1] == '\\'))
+ {
+ /*
+ * two backslashes = backslash
+ */
+ src += 2;
+ }
+ else
+ {
+ /*
+ * one backslash, not followed by ### valid octal
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "bytea")));
+ }
+
+ len++;
+ }
+ return len;
+}
+
+/*
+ * Common
+ */
+
+static const struct
+{
+ const char *name;
+ struct pg_encoding enc;
+} enclist[] =
+
+{
+ {
+ "hex",
+ {
+ hex_enc_len, hex_dec_len, hex_encode, hex_decode
+ }
+ },
+ {
+ "base64",
+ {
+ pg_base64_enc_len, pg_base64_dec_len, pg_base64_encode, pg_base64_decode
+ }
+ },
+ {
+ "escape",
+ {
+ esc_enc_len, esc_dec_len, esc_encode, esc_decode
+ }
+ },
+ {
+ NULL,
+ {
+ NULL, NULL, NULL, NULL
+ }
+ }
+};
+
+static const struct pg_encoding *
+pg_find_encoding(const char *name)
+{
+ int i;
+
+ for (i = 0; enclist[i].name; i++)
+ if (pg_strcasecmp(enclist[i].name, name) == 0)
+ return &enclist[i].enc;
+
+ return NULL;
+}
diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c
new file mode 100644
index 0000000..0cc7a6d
--- /dev/null
+++ b/src/backend/utils/adt/enum.c
@@ -0,0 +1,610 @@
+/*-------------------------------------------------------------------------
+ *
+ * enum.c
+ * I/O functions, operators, aggregates etc for enum types
+ *
+ * Copyright (c) 2006-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/enum.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/genam.h"
+#include "access/htup_details.h"
+#include "access/table.h"
+#include "catalog/pg_enum.h"
+#include "libpq/pqformat.h"
+#include "storage/procarray.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+
+static Oid enum_endpoint(Oid enumtypoid, ScanDirection direction);
+static ArrayType *enum_range_internal(Oid enumtypoid, Oid lower, Oid upper);
+
+
+/*
+ * Disallow use of an uncommitted pg_enum tuple.
+ *
+ * We need to make sure that uncommitted enum values don't get into indexes.
+ * If they did, and if we then rolled back the pg_enum addition, we'd have
+ * broken the index because value comparisons will not work reliably without
+ * an underlying pg_enum entry. (Note that removal of the heap entry
+ * containing an enum value is not sufficient to ensure that it doesn't appear
+ * in upper levels of indexes.) To do this we prevent an uncommitted row from
+ * being used for any SQL-level purpose. This is stronger than necessary,
+ * since the value might not be getting inserted into a table or there might
+ * be no index on its column, but it's easy to enforce centrally.
+ *
+ * However, it's okay to allow use of uncommitted values belonging to enum
+ * types that were themselves created in the same transaction, because then
+ * any such index would also be new and would go away altogether on rollback.
+ * We don't implement that fully right now, but we do allow free use of enum
+ * values created during CREATE TYPE AS ENUM, which are surely of the same
+ * lifespan as the enum type. (This case is required by "pg_restore -1".)
+ * Values added by ALTER TYPE ADD VALUE are currently restricted, but could
+ * be allowed if the enum type could be proven to have been created earlier
+ * in the same transaction. (Note that comparing tuple xmins would not work
+ * for that, because the type tuple might have been updated in the current
+ * transaction. Subtransactions also create hazards to be accounted for.)
+ *
+ * This function needs to be called (directly or indirectly) in any of the
+ * functions below that could return an enum value to SQL operations.
+ */
+static void
+check_safe_enum_use(HeapTuple enumval_tup)
+{
+ TransactionId xmin;
+ Form_pg_enum en = (Form_pg_enum) GETSTRUCT(enumval_tup);
+
+ /*
+ * If the row is hinted as committed, it's surely safe. This provides a
+ * fast path for all normal use-cases.
+ */
+ if (HeapTupleHeaderXminCommitted(enumval_tup->t_data))
+ return;
+
+ /*
+ * Usually, a row would get hinted as committed when it's read or loaded
+ * into syscache; but just in case not, let's check the xmin directly.
+ */
+ xmin = HeapTupleHeaderGetXmin(enumval_tup->t_data);
+ if (!TransactionIdIsInProgress(xmin) &&
+ TransactionIdDidCommit(xmin))
+ return;
+
+ /*
+ * Check if the enum value is uncommitted. If not, it's safe, because it
+ * was made during CREATE TYPE AS ENUM and can't be shorter-lived than its
+ * owning type. (This'd also be false for values made by other
+ * transactions; but the previous tests should have handled all of those.)
+ */
+ if (!EnumUncommitted(en->oid))
+ return;
+
+ /*
+ * There might well be other tests we could do here to narrow down the
+ * unsafe conditions, but for now just raise an exception.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE),
+ errmsg("unsafe use of new value \"%s\" of enum type %s",
+ NameStr(en->enumlabel),
+ format_type_be(en->enumtypid)),
+ errhint("New enum values must be committed before they can be used.")));
+}
+
+
+/* Basic I/O support */
+
+Datum
+enum_in(PG_FUNCTION_ARGS)
+{
+ char *name = PG_GETARG_CSTRING(0);
+ Oid enumtypoid = PG_GETARG_OID(1);
+ Oid enumoid;
+ HeapTuple tup;
+
+ /* must check length to prevent Assert failure within SearchSysCache */
+ if (strlen(name) >= NAMEDATALEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input value for enum %s: \"%s\"",
+ format_type_be(enumtypoid),
+ name)));
+
+ tup = SearchSysCache2(ENUMTYPOIDNAME,
+ ObjectIdGetDatum(enumtypoid),
+ CStringGetDatum(name));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input value for enum %s: \"%s\"",
+ format_type_be(enumtypoid),
+ name)));
+
+ /* check it's safe to use in SQL */
+ check_safe_enum_use(tup);
+
+ /*
+ * This comes from pg_enum.oid and stores system oids in user tables. This
+ * oid must be preserved by binary upgrades.
+ */
+ enumoid = ((Form_pg_enum) GETSTRUCT(tup))->oid;
+
+ ReleaseSysCache(tup);
+
+ PG_RETURN_OID(enumoid);
+}
+
+Datum
+enum_out(PG_FUNCTION_ARGS)
+{
+ Oid enumval = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple tup;
+ Form_pg_enum en;
+
+ tup = SearchSysCache1(ENUMOID, ObjectIdGetDatum(enumval));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid internal value for enum: %u",
+ enumval)));
+ en = (Form_pg_enum) GETSTRUCT(tup);
+
+ result = pstrdup(NameStr(en->enumlabel));
+
+ ReleaseSysCache(tup);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/* Binary I/O support */
+Datum
+enum_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Oid enumtypoid = PG_GETARG_OID(1);
+ Oid enumoid;
+ HeapTuple tup;
+ char *name;
+ int nbytes;
+
+ name = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+
+ /* must check length to prevent Assert failure within SearchSysCache */
+ if (strlen(name) >= NAMEDATALEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input value for enum %s: \"%s\"",
+ format_type_be(enumtypoid),
+ name)));
+
+ tup = SearchSysCache2(ENUMTYPOIDNAME,
+ ObjectIdGetDatum(enumtypoid),
+ CStringGetDatum(name));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input value for enum %s: \"%s\"",
+ format_type_be(enumtypoid),
+ name)));
+
+ /* check it's safe to use in SQL */
+ check_safe_enum_use(tup);
+
+ enumoid = ((Form_pg_enum) GETSTRUCT(tup))->oid;
+
+ ReleaseSysCache(tup);
+
+ pfree(name);
+
+ PG_RETURN_OID(enumoid);
+}
+
+Datum
+enum_send(PG_FUNCTION_ARGS)
+{
+ Oid enumval = PG_GETARG_OID(0);
+ StringInfoData buf;
+ HeapTuple tup;
+ Form_pg_enum en;
+
+ tup = SearchSysCache1(ENUMOID, ObjectIdGetDatum(enumval));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid internal value for enum: %u",
+ enumval)));
+ en = (Form_pg_enum) GETSTRUCT(tup);
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, NameStr(en->enumlabel), strlen(NameStr(en->enumlabel)));
+
+ ReleaseSysCache(tup);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/* Comparison functions and related */
+
+/*
+ * enum_cmp_internal is the common engine for all the visible comparison
+ * functions, except for enum_eq and enum_ne which can just check for OID
+ * equality directly.
+ */
+static int
+enum_cmp_internal(Oid arg1, Oid arg2, FunctionCallInfo fcinfo)
+{
+ TypeCacheEntry *tcache;
+
+ /*
+ * We don't need the typcache except in the hopefully-uncommon case that
+ * one or both Oids are odd. This means that cursory testing of code that
+ * fails to pass flinfo to an enum comparison function might not disclose
+ * the oversight. To make such errors more obvious, Assert that we have a
+ * place to cache even when we take a fast-path exit.
+ */
+ Assert(fcinfo->flinfo != NULL);
+
+ /* Equal OIDs are equal no matter what */
+ if (arg1 == arg2)
+ return 0;
+
+ /* Fast path: even-numbered Oids are known to compare correctly */
+ if ((arg1 & 1) == 0 && (arg2 & 1) == 0)
+ {
+ if (arg1 < arg2)
+ return -1;
+ else
+ return 1;
+ }
+
+ /* Locate the typcache entry for the enum type */
+ tcache = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (tcache == NULL)
+ {
+ HeapTuple enum_tup;
+ Form_pg_enum en;
+ Oid typeoid;
+
+ /* Get the OID of the enum type containing arg1 */
+ enum_tup = SearchSysCache1(ENUMOID, ObjectIdGetDatum(arg1));
+ if (!HeapTupleIsValid(enum_tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid internal value for enum: %u",
+ arg1)));
+ en = (Form_pg_enum) GETSTRUCT(enum_tup);
+ typeoid = en->enumtypid;
+ ReleaseSysCache(enum_tup);
+ /* Now locate and remember the typcache entry */
+ tcache = lookup_type_cache(typeoid, 0);
+ fcinfo->flinfo->fn_extra = (void *) tcache;
+ }
+
+ /* The remaining comparison logic is in typcache.c */
+ return compare_values_of_enum(tcache, arg1, arg2);
+}
+
+Datum
+enum_lt(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(enum_cmp_internal(a, b, fcinfo) < 0);
+}
+
+Datum
+enum_le(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(enum_cmp_internal(a, b, fcinfo) <= 0);
+}
+
+Datum
+enum_eq(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(a == b);
+}
+
+Datum
+enum_ne(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(a != b);
+}
+
+Datum
+enum_ge(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(enum_cmp_internal(a, b, fcinfo) >= 0);
+}
+
+Datum
+enum_gt(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(enum_cmp_internal(a, b, fcinfo) > 0);
+}
+
+Datum
+enum_smaller(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_OID(enum_cmp_internal(a, b, fcinfo) < 0 ? a : b);
+}
+
+Datum
+enum_larger(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_OID(enum_cmp_internal(a, b, fcinfo) > 0 ? a : b);
+}
+
+Datum
+enum_cmp(PG_FUNCTION_ARGS)
+{
+ Oid a = PG_GETARG_OID(0);
+ Oid b = PG_GETARG_OID(1);
+
+ PG_RETURN_INT32(enum_cmp_internal(a, b, fcinfo));
+}
+
+/* Enum programming support functions */
+
+/*
+ * enum_endpoint: common code for enum_first/enum_last
+ */
+static Oid
+enum_endpoint(Oid enumtypoid, ScanDirection direction)
+{
+ Relation enum_rel;
+ Relation enum_idx;
+ SysScanDesc enum_scan;
+ HeapTuple enum_tuple;
+ ScanKeyData skey;
+ Oid minmax;
+
+ /*
+ * Find the first/last enum member using pg_enum_typid_sortorder_index.
+ * Note we must not use the syscache. See comments for RenumberEnumType
+ * in catalog/pg_enum.c for more info.
+ */
+ ScanKeyInit(&skey,
+ Anum_pg_enum_enumtypid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(enumtypoid));
+
+ enum_rel = table_open(EnumRelationId, AccessShareLock);
+ enum_idx = index_open(EnumTypIdSortOrderIndexId, AccessShareLock);
+ enum_scan = systable_beginscan_ordered(enum_rel, enum_idx, NULL,
+ 1, &skey);
+
+ enum_tuple = systable_getnext_ordered(enum_scan, direction);
+ if (HeapTupleIsValid(enum_tuple))
+ {
+ /* check it's safe to use in SQL */
+ check_safe_enum_use(enum_tuple);
+ minmax = ((Form_pg_enum) GETSTRUCT(enum_tuple))->oid;
+ }
+ else
+ {
+ /* should only happen with an empty enum */
+ minmax = InvalidOid;
+ }
+
+ systable_endscan_ordered(enum_scan);
+ index_close(enum_idx, AccessShareLock);
+ table_close(enum_rel, AccessShareLock);
+
+ return minmax;
+}
+
+Datum
+enum_first(PG_FUNCTION_ARGS)
+{
+ Oid enumtypoid;
+ Oid min;
+
+ /*
+ * We rely on being able to get the specific enum type from the calling
+ * expression tree. Notice that the actual value of the argument isn't
+ * examined at all; in particular it might be NULL.
+ */
+ enumtypoid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (enumtypoid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("could not determine actual enum type")));
+
+ /* Get the OID using the index */
+ min = enum_endpoint(enumtypoid, ForwardScanDirection);
+
+ if (!OidIsValid(min))
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("enum %s contains no values",
+ format_type_be(enumtypoid))));
+
+ PG_RETURN_OID(min);
+}
+
+Datum
+enum_last(PG_FUNCTION_ARGS)
+{
+ Oid enumtypoid;
+ Oid max;
+
+ /*
+ * We rely on being able to get the specific enum type from the calling
+ * expression tree. Notice that the actual value of the argument isn't
+ * examined at all; in particular it might be NULL.
+ */
+ enumtypoid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (enumtypoid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("could not determine actual enum type")));
+
+ /* Get the OID using the index */
+ max = enum_endpoint(enumtypoid, BackwardScanDirection);
+
+ if (!OidIsValid(max))
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("enum %s contains no values",
+ format_type_be(enumtypoid))));
+
+ PG_RETURN_OID(max);
+}
+
+/* 2-argument variant of enum_range */
+Datum
+enum_range_bounds(PG_FUNCTION_ARGS)
+{
+ Oid lower;
+ Oid upper;
+ Oid enumtypoid;
+
+ if (PG_ARGISNULL(0))
+ lower = InvalidOid;
+ else
+ lower = PG_GETARG_OID(0);
+ if (PG_ARGISNULL(1))
+ upper = InvalidOid;
+ else
+ upper = PG_GETARG_OID(1);
+
+ /*
+ * We rely on being able to get the specific enum type from the calling
+ * expression tree. The generic type mechanism should have ensured that
+ * both are of the same type.
+ */
+ enumtypoid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (enumtypoid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("could not determine actual enum type")));
+
+ PG_RETURN_ARRAYTYPE_P(enum_range_internal(enumtypoid, lower, upper));
+}
+
+/* 1-argument variant of enum_range */
+Datum
+enum_range_all(PG_FUNCTION_ARGS)
+{
+ Oid enumtypoid;
+
+ /*
+ * We rely on being able to get the specific enum type from the calling
+ * expression tree. Notice that the actual value of the argument isn't
+ * examined at all; in particular it might be NULL.
+ */
+ enumtypoid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (enumtypoid == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("could not determine actual enum type")));
+
+ PG_RETURN_ARRAYTYPE_P(enum_range_internal(enumtypoid,
+ InvalidOid, InvalidOid));
+}
+
+static ArrayType *
+enum_range_internal(Oid enumtypoid, Oid lower, Oid upper)
+{
+ ArrayType *result;
+ Relation enum_rel;
+ Relation enum_idx;
+ SysScanDesc enum_scan;
+ HeapTuple enum_tuple;
+ ScanKeyData skey;
+ Datum *elems;
+ int max,
+ cnt;
+ bool left_found;
+
+ /*
+ * Scan the enum members in order using pg_enum_typid_sortorder_index.
+ * Note we must not use the syscache. See comments for RenumberEnumType
+ * in catalog/pg_enum.c for more info.
+ */
+ ScanKeyInit(&skey,
+ Anum_pg_enum_enumtypid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(enumtypoid));
+
+ enum_rel = table_open(EnumRelationId, AccessShareLock);
+ enum_idx = index_open(EnumTypIdSortOrderIndexId, AccessShareLock);
+ enum_scan = systable_beginscan_ordered(enum_rel, enum_idx, NULL, 1, &skey);
+
+ max = 64;
+ elems = (Datum *) palloc(max * sizeof(Datum));
+ cnt = 0;
+ left_found = !OidIsValid(lower);
+
+ while (HeapTupleIsValid(enum_tuple = systable_getnext_ordered(enum_scan, ForwardScanDirection)))
+ {
+ Oid enum_oid = ((Form_pg_enum) GETSTRUCT(enum_tuple))->oid;
+
+ if (!left_found && lower == enum_oid)
+ left_found = true;
+
+ if (left_found)
+ {
+ /* check it's safe to use in SQL */
+ check_safe_enum_use(enum_tuple);
+
+ if (cnt >= max)
+ {
+ max *= 2;
+ elems = (Datum *) repalloc(elems, max * sizeof(Datum));
+ }
+
+ elems[cnt++] = ObjectIdGetDatum(enum_oid);
+ }
+
+ if (OidIsValid(upper) && upper == enum_oid)
+ break;
+ }
+
+ systable_endscan_ordered(enum_scan);
+ index_close(enum_idx, AccessShareLock);
+ table_close(enum_rel, AccessShareLock);
+
+ /* and build the result array */
+ /* note this hardwires some details about the representation of Oid */
+ result = construct_array(elems, cnt, enumtypoid,
+ sizeof(Oid), true, TYPALIGN_INT);
+
+ pfree(elems);
+
+ return result;
+}
diff --git a/src/backend/utils/adt/expandeddatum.c b/src/backend/utils/adt/expandeddatum.c
new file mode 100644
index 0000000..e66da9b
--- /dev/null
+++ b/src/backend/utils/adt/expandeddatum.c
@@ -0,0 +1,145 @@
+/*-------------------------------------------------------------------------
+ *
+ * expandeddatum.c
+ * Support functions for "expanded" value representations.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/expandeddatum.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "utils/expandeddatum.h"
+#include "utils/memutils.h"
+
+/*
+ * DatumGetEOHP
+ *
+ * Given a Datum that is an expanded-object reference, extract the pointer.
+ *
+ * This is a bit tedious since the pointer may not be properly aligned;
+ * compare VARATT_EXTERNAL_GET_POINTER().
+ */
+ExpandedObjectHeader *
+DatumGetEOHP(Datum d)
+{
+ varattrib_1b_e *datum = (varattrib_1b_e *) DatumGetPointer(d);
+ varatt_expanded ptr;
+
+ Assert(VARATT_IS_EXTERNAL_EXPANDED(datum));
+ memcpy(&ptr, VARDATA_EXTERNAL(datum), sizeof(ptr));
+ Assert(VARATT_IS_EXPANDED_HEADER(ptr.eohptr));
+ return ptr.eohptr;
+}
+
+/*
+ * EOH_init_header
+ *
+ * Initialize the common header of an expanded object.
+ *
+ * The main thing this encapsulates is initializing the TOAST pointers.
+ */
+void
+EOH_init_header(ExpandedObjectHeader *eohptr,
+ const ExpandedObjectMethods *methods,
+ MemoryContext obj_context)
+{
+ varatt_expanded ptr;
+
+ eohptr->vl_len_ = EOH_HEADER_MAGIC;
+ eohptr->eoh_methods = methods;
+ eohptr->eoh_context = obj_context;
+
+ ptr.eohptr = eohptr;
+
+ SET_VARTAG_EXTERNAL(eohptr->eoh_rw_ptr, VARTAG_EXPANDED_RW);
+ memcpy(VARDATA_EXTERNAL(eohptr->eoh_rw_ptr), &ptr, sizeof(ptr));
+
+ SET_VARTAG_EXTERNAL(eohptr->eoh_ro_ptr, VARTAG_EXPANDED_RO);
+ memcpy(VARDATA_EXTERNAL(eohptr->eoh_ro_ptr), &ptr, sizeof(ptr));
+}
+
+/*
+ * EOH_get_flat_size
+ * EOH_flatten_into
+ *
+ * Convenience functions for invoking the "methods" of an expanded object.
+ */
+
+Size
+EOH_get_flat_size(ExpandedObjectHeader *eohptr)
+{
+ return eohptr->eoh_methods->get_flat_size(eohptr);
+}
+
+void
+EOH_flatten_into(ExpandedObjectHeader *eohptr,
+ void *result, Size allocated_size)
+{
+ eohptr->eoh_methods->flatten_into(eohptr, result, allocated_size);
+}
+
+/*
+ * If the Datum represents a R/W expanded object, change it to R/O.
+ * Otherwise return the original Datum.
+ *
+ * Caller must ensure that the datum is a non-null varlena value. Typically
+ * this is invoked via MakeExpandedObjectReadOnly(), which checks that.
+ */
+Datum
+MakeExpandedObjectReadOnlyInternal(Datum d)
+{
+ ExpandedObjectHeader *eohptr;
+
+ /* Nothing to do if not a read-write expanded-object pointer */
+ if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+ return d;
+
+ /* Now safe to extract the object pointer */
+ eohptr = DatumGetEOHP(d);
+
+ /* Return the built-in read-only pointer instead of given pointer */
+ return EOHPGetRODatum(eohptr);
+}
+
+/*
+ * Transfer ownership of an expanded object to a new parent memory context.
+ * The object must be referenced by a R/W pointer, and what we return is
+ * always its "standard" R/W pointer, which is certain to have the same
+ * lifespan as the object itself. (The passed-in pointer might not, and
+ * in any case wouldn't provide a unique identifier if it's not that one.)
+ */
+Datum
+TransferExpandedObject(Datum d, MemoryContext new_parent)
+{
+ ExpandedObjectHeader *eohptr = DatumGetEOHP(d);
+
+ /* Assert caller gave a R/W pointer */
+ Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));
+
+ /* Transfer ownership */
+ MemoryContextSetParent(eohptr->eoh_context, new_parent);
+
+ /* Return the object's standard read-write pointer */
+ return EOHPGetRWDatum(eohptr);
+}
+
+/*
+ * Delete an expanded object (must be referenced by a R/W pointer).
+ */
+void
+DeleteExpandedObject(Datum d)
+{
+ ExpandedObjectHeader *eohptr = DatumGetEOHP(d);
+
+ /* Assert caller gave a R/W pointer */
+ Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));
+
+ /* Kill it */
+ MemoryContextDelete(eohptr->eoh_context);
+}
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
new file mode 100644
index 0000000..3b3e0a9
--- /dev/null
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -0,0 +1,1633 @@
+/*-------------------------------------------------------------------------
+ *
+ * expandedrecord.c
+ * Functions for manipulating composite expanded objects.
+ *
+ * This module supports "expanded objects" (cf. expandeddatum.h) that can
+ * store values of named composite types, domains over named composite types,
+ * and record types (registered or anonymous).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/expandedrecord.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/detoast.h"
+#include "access/heaptoast.h"
+#include "access/htup_details.h"
+#include "catalog/heap.h"
+#include "catalog/pg_type.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/expandedrecord.h"
+#include "utils/memutils.h"
+#include "utils/typcache.h"
+
+
+/* "Methods" required for an expanded object */
+static Size ER_get_flat_size(ExpandedObjectHeader *eohptr);
+static void ER_flatten_into(ExpandedObjectHeader *eohptr,
+ void *result, Size allocated_size);
+
+static const ExpandedObjectMethods ER_methods =
+{
+ ER_get_flat_size,
+ ER_flatten_into
+};
+
+/* Other local functions */
+static void ER_mc_callback(void *arg);
+static MemoryContext get_short_term_cxt(ExpandedRecordHeader *erh);
+static void build_dummy_expanded_header(ExpandedRecordHeader *main_erh);
+static pg_noinline void check_domain_for_new_field(ExpandedRecordHeader *erh,
+ int fnumber,
+ Datum newValue, bool isnull);
+static pg_noinline void check_domain_for_new_tuple(ExpandedRecordHeader *erh,
+ HeapTuple tuple);
+
+
+/*
+ * Build an expanded record of the specified composite type
+ *
+ * type_id can be RECORDOID, but only if a positive typmod is given.
+ *
+ * The expanded record is initially "empty", having a state logically
+ * equivalent to a NULL composite value (not ROW(NULL, NULL, ...)).
+ * Note that this might not be a valid state for a domain type;
+ * if the caller needs to check that, call
+ * expanded_record_set_tuple(erh, NULL, false, false).
+ *
+ * The expanded object will be a child of parentcontext.
+ */
+ExpandedRecordHeader *
+make_expanded_record_from_typeid(Oid type_id, int32 typmod,
+ MemoryContext parentcontext)
+{
+ ExpandedRecordHeader *erh;
+ int flags = 0;
+ TupleDesc tupdesc;
+ uint64 tupdesc_id;
+ MemoryContext objcxt;
+ char *chunk;
+
+ if (type_id != RECORDOID)
+ {
+ /*
+ * Consult the typcache to see if it's a domain over composite, and in
+ * any case to get the tupdesc and tupdesc identifier.
+ */
+ TypeCacheEntry *typentry;
+
+ typentry = lookup_type_cache(type_id,
+ TYPECACHE_TUPDESC |
+ TYPECACHE_DOMAIN_BASE_INFO);
+ if (typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ flags |= ER_FLAG_IS_DOMAIN;
+ typentry = lookup_type_cache(typentry->domainBaseType,
+ TYPECACHE_TUPDESC);
+ }
+ if (typentry->tupDesc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(type_id))));
+ tupdesc = typentry->tupDesc;
+ tupdesc_id = typentry->tupDesc_identifier;
+ }
+ else
+ {
+ /*
+ * For RECORD types, get the tupdesc and identifier from typcache.
+ */
+ tupdesc = lookup_rowtype_tupdesc(type_id, typmod);
+ tupdesc_id = assign_record_type_identifier(type_id, typmod);
+ }
+
+ /*
+ * Allocate private context for expanded object. We use a regular-size
+ * context, not a small one, to improve the odds that we can fit a tupdesc
+ * into it without needing an extra malloc block. (This code path doesn't
+ * ever need to copy a tupdesc into the expanded record, but let's be
+ * consistent with the other ways of making an expanded record.)
+ */
+ objcxt = AllocSetContextCreate(parentcontext,
+ "expanded record",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Since we already know the number of fields in the tupdesc, we can
+ * allocate the dvalues/dnulls arrays along with the record header. This
+ * is useless if we never need those arrays, but it costs almost nothing,
+ * and it will save a palloc cycle if we do need them.
+ */
+ erh = (ExpandedRecordHeader *)
+ MemoryContextAlloc(objcxt, MAXALIGN(sizeof(ExpandedRecordHeader))
+ + tupdesc->natts * (sizeof(Datum) + sizeof(bool)));
+
+ /* Ensure all header fields are initialized to 0/null */
+ memset(erh, 0, sizeof(ExpandedRecordHeader));
+
+ EOH_init_header(&erh->hdr, &ER_methods, objcxt);
+ erh->er_magic = ER_MAGIC;
+
+ /* Set up dvalues/dnulls, with no valid contents as yet */
+ chunk = (char *) erh + MAXALIGN(sizeof(ExpandedRecordHeader));
+ erh->dvalues = (Datum *) chunk;
+ erh->dnulls = (bool *) (chunk + tupdesc->natts * sizeof(Datum));
+ erh->nfields = tupdesc->natts;
+
+ /* Fill in composite-type identification info */
+ erh->er_decltypeid = type_id;
+ erh->er_typeid = tupdesc->tdtypeid;
+ erh->er_typmod = tupdesc->tdtypmod;
+ erh->er_tupdesc_id = tupdesc_id;
+
+ erh->flags = flags;
+
+ /*
+ * If what we got from the typcache is a refcounted tupdesc, we need to
+ * acquire our own refcount on it. We manage the refcount with a memory
+ * context callback rather than assuming that the CurrentResourceOwner is
+ * longer-lived than this expanded object.
+ */
+ if (tupdesc->tdrefcount >= 0)
+ {
+ /* Register callback to release the refcount */
+ erh->er_mcb.func = ER_mc_callback;
+ erh->er_mcb.arg = (void *) erh;
+ MemoryContextRegisterResetCallback(erh->hdr.eoh_context,
+ &erh->er_mcb);
+
+ /* And save the pointer */
+ erh->er_tupdesc = tupdesc;
+ tupdesc->tdrefcount++;
+
+ /* If we called lookup_rowtype_tupdesc, release the pin it took */
+ if (type_id == RECORDOID)
+ ReleaseTupleDesc(tupdesc);
+ }
+ else
+ {
+ /*
+ * If it's not refcounted, just assume it will outlive the expanded
+ * object. (This can happen for shared record types, for instance.)
+ */
+ erh->er_tupdesc = tupdesc;
+ }
+
+ /*
+ * We don't set ER_FLAG_DVALUES_VALID or ER_FLAG_FVALUE_VALID, so the
+ * record remains logically empty.
+ */
+
+ return erh;
+}
+
+/*
+ * Build an expanded record of the rowtype defined by the tupdesc
+ *
+ * The tupdesc is copied if necessary (i.e., if we can't just bump its
+ * reference count instead).
+ *
+ * The expanded record is initially "empty", having a state logically
+ * equivalent to a NULL composite value (not ROW(NULL, NULL, ...)).
+ *
+ * The expanded object will be a child of parentcontext.
+ */
+ExpandedRecordHeader *
+make_expanded_record_from_tupdesc(TupleDesc tupdesc,
+ MemoryContext parentcontext)
+{
+ ExpandedRecordHeader *erh;
+ uint64 tupdesc_id;
+ MemoryContext objcxt;
+ MemoryContext oldcxt;
+ char *chunk;
+
+ if (tupdesc->tdtypeid != RECORDOID)
+ {
+ /*
+ * If it's a named composite type (not RECORD), we prefer to reference
+ * the typcache's copy of the tupdesc, which is guaranteed to be
+ * refcounted (the given tupdesc might not be). In any case, we need
+ * to consult the typcache to get the correct tupdesc identifier.
+ *
+ * Note that tdtypeid couldn't be a domain type, so we need not
+ * consider that case here.
+ */
+ TypeCacheEntry *typentry;
+
+ typentry = lookup_type_cache(tupdesc->tdtypeid, TYPECACHE_TUPDESC);
+ if (typentry->tupDesc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(tupdesc->tdtypeid))));
+ tupdesc = typentry->tupDesc;
+ tupdesc_id = typentry->tupDesc_identifier;
+ }
+ else
+ {
+ /*
+ * For RECORD types, get the appropriate unique identifier (possibly
+ * freshly assigned).
+ */
+ tupdesc_id = assign_record_type_identifier(tupdesc->tdtypeid,
+ tupdesc->tdtypmod);
+ }
+
+ /*
+ * Allocate private context for expanded object. We use a regular-size
+ * context, not a small one, to improve the odds that we can fit a tupdesc
+ * into it without needing an extra malloc block.
+ */
+ objcxt = AllocSetContextCreate(parentcontext,
+ "expanded record",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Since we already know the number of fields in the tupdesc, we can
+ * allocate the dvalues/dnulls arrays along with the record header. This
+ * is useless if we never need those arrays, but it costs almost nothing,
+ * and it will save a palloc cycle if we do need them.
+ */
+ erh = (ExpandedRecordHeader *)
+ MemoryContextAlloc(objcxt, MAXALIGN(sizeof(ExpandedRecordHeader))
+ + tupdesc->natts * (sizeof(Datum) + sizeof(bool)));
+
+ /* Ensure all header fields are initialized to 0/null */
+ memset(erh, 0, sizeof(ExpandedRecordHeader));
+
+ EOH_init_header(&erh->hdr, &ER_methods, objcxt);
+ erh->er_magic = ER_MAGIC;
+
+ /* Set up dvalues/dnulls, with no valid contents as yet */
+ chunk = (char *) erh + MAXALIGN(sizeof(ExpandedRecordHeader));
+ erh->dvalues = (Datum *) chunk;
+ erh->dnulls = (bool *) (chunk + tupdesc->natts * sizeof(Datum));
+ erh->nfields = tupdesc->natts;
+
+ /* Fill in composite-type identification info */
+ erh->er_decltypeid = erh->er_typeid = tupdesc->tdtypeid;
+ erh->er_typmod = tupdesc->tdtypmod;
+ erh->er_tupdesc_id = tupdesc_id;
+
+ /*
+ * Copy tupdesc if needed, but we prefer to bump its refcount if possible.
+ * We manage the refcount with a memory context callback rather than
+ * assuming that the CurrentResourceOwner is longer-lived than this
+ * expanded object.
+ */
+ if (tupdesc->tdrefcount >= 0)
+ {
+ /* Register callback to release the refcount */
+ erh->er_mcb.func = ER_mc_callback;
+ erh->er_mcb.arg = (void *) erh;
+ MemoryContextRegisterResetCallback(erh->hdr.eoh_context,
+ &erh->er_mcb);
+
+ /* And save the pointer */
+ erh->er_tupdesc = tupdesc;
+ tupdesc->tdrefcount++;
+ }
+ else
+ {
+ /* Just copy it */
+ oldcxt = MemoryContextSwitchTo(objcxt);
+ erh->er_tupdesc = CreateTupleDescCopy(tupdesc);
+ erh->flags |= ER_FLAG_TUPDESC_ALLOCED;
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /*
+ * We don't set ER_FLAG_DVALUES_VALID or ER_FLAG_FVALUE_VALID, so the
+ * record remains logically empty.
+ */
+
+ return erh;
+}
+
+/*
+ * Build an expanded record of the same rowtype as the given expanded record
+ *
+ * This is faster than either of the above routines because we can bypass
+ * typcache lookup(s).
+ *
+ * The expanded record is initially "empty" --- we do not copy whatever
+ * tuple might be in the source expanded record.
+ *
+ * The expanded object will be a child of parentcontext.
+ */
+ExpandedRecordHeader *
+make_expanded_record_from_exprecord(ExpandedRecordHeader *olderh,
+ MemoryContext parentcontext)
+{
+ ExpandedRecordHeader *erh;
+ TupleDesc tupdesc = expanded_record_get_tupdesc(olderh);
+ MemoryContext objcxt;
+ MemoryContext oldcxt;
+ char *chunk;
+
+ /*
+ * Allocate private context for expanded object. We use a regular-size
+ * context, not a small one, to improve the odds that we can fit a tupdesc
+ * into it without needing an extra malloc block.
+ */
+ objcxt = AllocSetContextCreate(parentcontext,
+ "expanded record",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Since we already know the number of fields in the tupdesc, we can
+ * allocate the dvalues/dnulls arrays along with the record header. This
+ * is useless if we never need those arrays, but it costs almost nothing,
+ * and it will save a palloc cycle if we do need them.
+ */
+ erh = (ExpandedRecordHeader *)
+ MemoryContextAlloc(objcxt, MAXALIGN(sizeof(ExpandedRecordHeader))
+ + tupdesc->natts * (sizeof(Datum) + sizeof(bool)));
+
+ /* Ensure all header fields are initialized to 0/null */
+ memset(erh, 0, sizeof(ExpandedRecordHeader));
+
+ EOH_init_header(&erh->hdr, &ER_methods, objcxt);
+ erh->er_magic = ER_MAGIC;
+
+ /* Set up dvalues/dnulls, with no valid contents as yet */
+ chunk = (char *) erh + MAXALIGN(sizeof(ExpandedRecordHeader));
+ erh->dvalues = (Datum *) chunk;
+ erh->dnulls = (bool *) (chunk + tupdesc->natts * sizeof(Datum));
+ erh->nfields = tupdesc->natts;
+
+ /* Fill in composite-type identification info */
+ erh->er_decltypeid = olderh->er_decltypeid;
+ erh->er_typeid = olderh->er_typeid;
+ erh->er_typmod = olderh->er_typmod;
+ erh->er_tupdesc_id = olderh->er_tupdesc_id;
+
+ /* The only flag bit that transfers over is IS_DOMAIN */
+ erh->flags = olderh->flags & ER_FLAG_IS_DOMAIN;
+
+ /*
+ * Copy tupdesc if needed, but we prefer to bump its refcount if possible.
+ * We manage the refcount with a memory context callback rather than
+ * assuming that the CurrentResourceOwner is longer-lived than this
+ * expanded object.
+ */
+ if (tupdesc->tdrefcount >= 0)
+ {
+ /* Register callback to release the refcount */
+ erh->er_mcb.func = ER_mc_callback;
+ erh->er_mcb.arg = (void *) erh;
+ MemoryContextRegisterResetCallback(erh->hdr.eoh_context,
+ &erh->er_mcb);
+
+ /* And save the pointer */
+ erh->er_tupdesc = tupdesc;
+ tupdesc->tdrefcount++;
+ }
+ else if (olderh->flags & ER_FLAG_TUPDESC_ALLOCED)
+ {
+ /* We need to make our own copy of the tupdesc */
+ oldcxt = MemoryContextSwitchTo(objcxt);
+ erh->er_tupdesc = CreateTupleDescCopy(tupdesc);
+ erh->flags |= ER_FLAG_TUPDESC_ALLOCED;
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else
+ {
+ /*
+ * Assume the tupdesc will outlive this expanded object, just like
+ * we're assuming it will outlive the source object.
+ */
+ erh->er_tupdesc = tupdesc;
+ }
+
+ /*
+ * We don't set ER_FLAG_DVALUES_VALID or ER_FLAG_FVALUE_VALID, so the
+ * record remains logically empty.
+ */
+
+ return erh;
+}
+
+/*
+ * Insert given tuple as the value of the expanded record
+ *
+ * It is caller's responsibility that the tuple matches the record's
+ * previously-assigned rowtype. (However domain constraints, if any,
+ * will be checked here.)
+ *
+ * The tuple is physically copied into the expanded record's local storage
+ * if "copy" is true, otherwise it's caller's responsibility that the tuple
+ * will live as long as the expanded record does.
+ *
+ * Out-of-line field values in the tuple are automatically inlined if
+ * "expand_external" is true, otherwise not. (The combination copy = false,
+ * expand_external = true is not sensible and not supported.)
+ *
+ * Alternatively, tuple can be NULL, in which case we just set the expanded
+ * record to be empty.
+ */
+void
+expanded_record_set_tuple(ExpandedRecordHeader *erh,
+ HeapTuple tuple,
+ bool copy,
+ bool expand_external)
+{
+ int oldflags;
+ HeapTuple oldtuple;
+ char *oldfstartptr;
+ char *oldfendptr;
+ int newflags;
+ HeapTuple newtuple;
+ MemoryContext oldcxt;
+
+ /* Shouldn't ever be trying to assign new data to a dummy header */
+ Assert(!(erh->flags & ER_FLAG_IS_DUMMY));
+
+ /*
+ * Before performing the assignment, see if result will satisfy domain.
+ */
+ if (erh->flags & ER_FLAG_IS_DOMAIN)
+ check_domain_for_new_tuple(erh, tuple);
+
+ /*
+ * If we need to get rid of out-of-line field values, do so, using the
+ * short-term context to avoid leaking whatever cruft the toast fetch
+ * might generate.
+ */
+ if (expand_external && tuple)
+ {
+ /* Assert caller didn't ask for unsupported case */
+ Assert(copy);
+ if (HeapTupleHasExternal(tuple))
+ {
+ oldcxt = MemoryContextSwitchTo(get_short_term_cxt(erh));
+ tuple = toast_flatten_tuple(tuple, erh->er_tupdesc);
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else
+ expand_external = false; /* need not clean up below */
+ }
+
+ /*
+ * Initialize new flags, keeping only non-data status bits.
+ */
+ oldflags = erh->flags;
+ newflags = oldflags & ER_FLAGS_NON_DATA;
+
+ /*
+ * Copy tuple into local storage if needed. We must be sure this succeeds
+ * before we start to modify the expanded record's state.
+ */
+ if (copy && tuple)
+ {
+ oldcxt = MemoryContextSwitchTo(erh->hdr.eoh_context);
+ newtuple = heap_copytuple(tuple);
+ newflags |= ER_FLAG_FVALUE_ALLOCED;
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We can now flush anything that detoasting might have leaked. */
+ if (expand_external)
+ MemoryContextReset(erh->er_short_term_cxt);
+ }
+ else
+ newtuple = tuple;
+
+ /* Make copies of fields we're about to overwrite */
+ oldtuple = erh->fvalue;
+ oldfstartptr = erh->fstartptr;
+ oldfendptr = erh->fendptr;
+
+ /*
+ * It's now safe to update the expanded record's state.
+ */
+ if (newtuple)
+ {
+ /* Save flat representation */
+ erh->fvalue = newtuple;
+ erh->fstartptr = (char *) newtuple->t_data;
+ erh->fendptr = ((char *) newtuple->t_data) + newtuple->t_len;
+ newflags |= ER_FLAG_FVALUE_VALID;
+
+ /* Remember if we have any out-of-line field values */
+ if (HeapTupleHasExternal(newtuple))
+ newflags |= ER_FLAG_HAVE_EXTERNAL;
+ }
+ else
+ {
+ erh->fvalue = NULL;
+ erh->fstartptr = erh->fendptr = NULL;
+ }
+
+ erh->flags = newflags;
+
+ /* Reset flat-size info; we don't bother to make it valid now */
+ erh->flat_size = 0;
+
+ /*
+ * Now, release any storage belonging to old field values. It's safe to
+ * do this because ER_FLAG_DVALUES_VALID is no longer set in erh->flags;
+ * even if we fail partway through, the record is valid, and at worst
+ * we've failed to reclaim some space.
+ */
+ if (oldflags & ER_FLAG_DVALUES_ALLOCED)
+ {
+ TupleDesc tupdesc = erh->er_tupdesc;
+ int i;
+
+ for (i = 0; i < erh->nfields; i++)
+ {
+ if (!erh->dnulls[i] &&
+ !(TupleDescAttr(tupdesc, i)->attbyval))
+ {
+ char *oldValue = (char *) DatumGetPointer(erh->dvalues[i]);
+
+ if (oldValue < oldfstartptr || oldValue >= oldfendptr)
+ pfree(oldValue);
+ }
+ }
+ }
+
+ /* Likewise free the old tuple, if it was locally allocated */
+ if (oldflags & ER_FLAG_FVALUE_ALLOCED)
+ heap_freetuple(oldtuple);
+
+ /* We won't make a new deconstructed representation until/unless needed */
+}
+
+/*
+ * make_expanded_record_from_datum: build expanded record from composite Datum
+ *
+ * This combines the functions of make_expanded_record_from_typeid and
+ * expanded_record_set_tuple. However, we do not force a lookup of the
+ * tupdesc immediately, reasoning that it might never be needed.
+ *
+ * The expanded object will be a child of parentcontext.
+ *
+ * Note: a composite datum cannot self-identify as being of a domain type,
+ * so we need not consider domain cases here.
+ */
+Datum
+make_expanded_record_from_datum(Datum recorddatum, MemoryContext parentcontext)
+{
+ ExpandedRecordHeader *erh;
+ HeapTupleHeader tuphdr;
+ HeapTupleData tmptup;
+ HeapTuple newtuple;
+ MemoryContext objcxt;
+ MemoryContext oldcxt;
+
+ /*
+ * Allocate private context for expanded object. We use a regular-size
+ * context, not a small one, to improve the odds that we can fit a tupdesc
+ * into it without needing an extra malloc block.
+ */
+ objcxt = AllocSetContextCreate(parentcontext,
+ "expanded record",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /* Set up expanded record header, initializing fields to 0/null */
+ erh = (ExpandedRecordHeader *)
+ MemoryContextAllocZero(objcxt, sizeof(ExpandedRecordHeader));
+
+ EOH_init_header(&erh->hdr, &ER_methods, objcxt);
+ erh->er_magic = ER_MAGIC;
+
+ /*
+ * Detoast and copy source record into private context, as a HeapTuple.
+ * (If we actually have to detoast the source, we'll leak some memory in
+ * the caller's context, but it doesn't seem worth worrying about.)
+ */
+ tuphdr = DatumGetHeapTupleHeader(recorddatum);
+
+ tmptup.t_len = HeapTupleHeaderGetDatumLength(tuphdr);
+ ItemPointerSetInvalid(&(tmptup.t_self));
+ tmptup.t_tableOid = InvalidOid;
+ tmptup.t_data = tuphdr;
+
+ oldcxt = MemoryContextSwitchTo(objcxt);
+ newtuple = heap_copytuple(&tmptup);
+ erh->flags |= ER_FLAG_FVALUE_ALLOCED;
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Fill in composite-type identification info */
+ erh->er_decltypeid = erh->er_typeid = HeapTupleHeaderGetTypeId(tuphdr);
+ erh->er_typmod = HeapTupleHeaderGetTypMod(tuphdr);
+
+ /* remember we have a flat representation */
+ erh->fvalue = newtuple;
+ erh->fstartptr = (char *) newtuple->t_data;
+ erh->fendptr = ((char *) newtuple->t_data) + newtuple->t_len;
+ erh->flags |= ER_FLAG_FVALUE_VALID;
+
+ /* Shouldn't need to set ER_FLAG_HAVE_EXTERNAL */
+ Assert(!HeapTupleHeaderHasExternal(tuphdr));
+
+ /*
+ * We won't look up the tupdesc till we have to, nor make a deconstructed
+ * representation. We don't have enough info to fill flat_size and
+ * friends, either.
+ */
+
+ /* return a R/W pointer to the expanded record */
+ return EOHPGetRWDatum(&erh->hdr);
+}
+
+/*
+ * get_flat_size method for expanded records
+ *
+ * Note: call this in a reasonably short-lived memory context, in case of
+ * memory leaks from activities such as detoasting.
+ */
+static Size
+ER_get_flat_size(ExpandedObjectHeader *eohptr)
+{
+ ExpandedRecordHeader *erh = (ExpandedRecordHeader *) eohptr;
+ TupleDesc tupdesc;
+ Size len;
+ Size data_len;
+ int hoff;
+ bool hasnull;
+ int i;
+
+ Assert(erh->er_magic == ER_MAGIC);
+
+ /*
+ * The flat representation has to be a valid composite datum. Make sure
+ * that we have a registered, not anonymous, RECORD type.
+ */
+ if (erh->er_typeid == RECORDOID &&
+ erh->er_typmod < 0)
+ {
+ tupdesc = expanded_record_get_tupdesc(erh);
+ assign_record_type_typmod(tupdesc);
+ erh->er_typmod = tupdesc->tdtypmod;
+ }
+
+ /*
+ * If we have a valid flattened value without out-of-line fields, we can
+ * just use it as-is.
+ */
+ if (erh->flags & ER_FLAG_FVALUE_VALID &&
+ !(erh->flags & ER_FLAG_HAVE_EXTERNAL))
+ return erh->fvalue->t_len;
+
+ /* If we have a cached size value, believe that */
+ if (erh->flat_size)
+ return erh->flat_size;
+
+ /* If we haven't yet deconstructed the tuple, do that */
+ if (!(erh->flags & ER_FLAG_DVALUES_VALID))
+ deconstruct_expanded_record(erh);
+
+ /* Tuple descriptor must be valid by now */
+ tupdesc = erh->er_tupdesc;
+
+ /*
+ * Composite datums mustn't contain any out-of-line values.
+ */
+ if (erh->flags & ER_FLAG_HAVE_EXTERNAL)
+ {
+ for (i = 0; i < erh->nfields; i++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (!erh->dnulls[i] &&
+ !attr->attbyval && attr->attlen == -1 &&
+ VARATT_IS_EXTERNAL(DatumGetPointer(erh->dvalues[i])))
+ {
+ /*
+ * expanded_record_set_field_internal can do the actual work
+ * of detoasting. It needn't recheck domain constraints.
+ */
+ expanded_record_set_field_internal(erh, i + 1,
+ erh->dvalues[i], false,
+ true,
+ false);
+ }
+ }
+
+ /*
+ * We have now removed all external field values, so we can clear the
+ * flag about them. This won't cause ER_flatten_into() to mistakenly
+ * take the fast path, since expanded_record_set_field() will have
+ * cleared ER_FLAG_FVALUE_VALID.
+ */
+ erh->flags &= ~ER_FLAG_HAVE_EXTERNAL;
+ }
+
+ /* Test if we currently have any null values */
+ hasnull = false;
+ for (i = 0; i < erh->nfields; i++)
+ {
+ if (erh->dnulls[i])
+ {
+ hasnull = true;
+ break;
+ }
+ }
+
+ /* Determine total space needed */
+ len = offsetof(HeapTupleHeaderData, t_bits);
+
+ if (hasnull)
+ len += BITMAPLEN(tupdesc->natts);
+
+ hoff = len = MAXALIGN(len); /* align user data safely */
+
+ data_len = heap_compute_data_size(tupdesc, erh->dvalues, erh->dnulls);
+
+ len += data_len;
+
+ /* Cache for next time */
+ erh->flat_size = len;
+ erh->data_len = data_len;
+ erh->hoff = hoff;
+ erh->hasnull = hasnull;
+
+ return len;
+}
+
+/*
+ * flatten_into method for expanded records
+ */
+static void
+ER_flatten_into(ExpandedObjectHeader *eohptr,
+ void *result, Size allocated_size)
+{
+ ExpandedRecordHeader *erh = (ExpandedRecordHeader *) eohptr;
+ HeapTupleHeader tuphdr = (HeapTupleHeader) result;
+ TupleDesc tupdesc;
+
+ Assert(erh->er_magic == ER_MAGIC);
+
+ /* Easy if we have a valid flattened value without out-of-line fields */
+ if (erh->flags & ER_FLAG_FVALUE_VALID &&
+ !(erh->flags & ER_FLAG_HAVE_EXTERNAL))
+ {
+ Assert(allocated_size == erh->fvalue->t_len);
+ memcpy(tuphdr, erh->fvalue->t_data, allocated_size);
+ /* The original flattened value might not have datum header fields */
+ HeapTupleHeaderSetDatumLength(tuphdr, allocated_size);
+ HeapTupleHeaderSetTypeId(tuphdr, erh->er_typeid);
+ HeapTupleHeaderSetTypMod(tuphdr, erh->er_typmod);
+ return;
+ }
+
+ /* Else allocation should match previous get_flat_size result */
+ Assert(allocated_size == erh->flat_size);
+
+ /* We'll need the tuple descriptor */
+ tupdesc = expanded_record_get_tupdesc(erh);
+
+ /* We must ensure that any pad space is zero-filled */
+ memset(tuphdr, 0, allocated_size);
+
+ /* Set up header fields of composite Datum */
+ HeapTupleHeaderSetDatumLength(tuphdr, allocated_size);
+ HeapTupleHeaderSetTypeId(tuphdr, erh->er_typeid);
+ HeapTupleHeaderSetTypMod(tuphdr, erh->er_typmod);
+ /* We also make sure that t_ctid is invalid unless explicitly set */
+ ItemPointerSetInvalid(&(tuphdr->t_ctid));
+
+ HeapTupleHeaderSetNatts(tuphdr, tupdesc->natts);
+ tuphdr->t_hoff = erh->hoff;
+
+ /* And fill the data area from dvalues/dnulls */
+ heap_fill_tuple(tupdesc,
+ erh->dvalues,
+ erh->dnulls,
+ (char *) tuphdr + erh->hoff,
+ erh->data_len,
+ &tuphdr->t_infomask,
+ (erh->hasnull ? tuphdr->t_bits : NULL));
+}
+
+/*
+ * Look up the tupdesc for the expanded record's actual type
+ *
+ * Note: code internal to this module is allowed to just fetch
+ * erh->er_tupdesc if ER_FLAG_DVALUES_VALID is set; otherwise it should call
+ * expanded_record_get_tupdesc. This function is the out-of-line portion
+ * of expanded_record_get_tupdesc.
+ */
+TupleDesc
+expanded_record_fetch_tupdesc(ExpandedRecordHeader *erh)
+{
+ TupleDesc tupdesc;
+
+ /* Easy if we already have it (but caller should have checked already) */
+ if (erh->er_tupdesc)
+ return erh->er_tupdesc;
+
+ /* Lookup the composite type's tupdesc using the typcache */
+ tupdesc = lookup_rowtype_tupdesc(erh->er_typeid, erh->er_typmod);
+
+ /*
+ * If it's a refcounted tupdesc rather than a statically allocated one, we
+ * want to manage the refcount with a memory context callback rather than
+ * assuming that the CurrentResourceOwner is longer-lived than this
+ * expanded object.
+ */
+ if (tupdesc->tdrefcount >= 0)
+ {
+ /* Register callback if we didn't already */
+ if (erh->er_mcb.arg == NULL)
+ {
+ erh->er_mcb.func = ER_mc_callback;
+ erh->er_mcb.arg = (void *) erh;
+ MemoryContextRegisterResetCallback(erh->hdr.eoh_context,
+ &erh->er_mcb);
+ }
+
+ /* Remember our own pointer */
+ erh->er_tupdesc = tupdesc;
+ tupdesc->tdrefcount++;
+
+ /* Release the pin lookup_rowtype_tupdesc acquired */
+ ReleaseTupleDesc(tupdesc);
+ }
+ else
+ {
+ /* Just remember the pointer */
+ erh->er_tupdesc = tupdesc;
+ }
+
+ /* In either case, fetch the process-global ID for this tupdesc */
+ erh->er_tupdesc_id = assign_record_type_identifier(tupdesc->tdtypeid,
+ tupdesc->tdtypmod);
+
+ return tupdesc;
+}
+
+/*
+ * Get a HeapTuple representing the current value of the expanded record
+ *
+ * If valid, the originally stored tuple is returned, so caller must not
+ * scribble on it. Otherwise, we return a HeapTuple created in the current
+ * memory context. In either case, no attempt has been made to inline
+ * out-of-line toasted values, so the tuple isn't usable as a composite
+ * datum.
+ *
+ * Returns NULL if expanded record is empty.
+ */
+HeapTuple
+expanded_record_get_tuple(ExpandedRecordHeader *erh)
+{
+ /* Easy case if we still have original tuple */
+ if (erh->flags & ER_FLAG_FVALUE_VALID)
+ return erh->fvalue;
+
+ /* Else just build a tuple from datums */
+ if (erh->flags & ER_FLAG_DVALUES_VALID)
+ return heap_form_tuple(erh->er_tupdesc, erh->dvalues, erh->dnulls);
+
+ /* Expanded record is empty */
+ return NULL;
+}
+
+/*
+ * Memory context reset callback for cleaning up external resources
+ */
+static void
+ER_mc_callback(void *arg)
+{
+ ExpandedRecordHeader *erh = (ExpandedRecordHeader *) arg;
+ TupleDesc tupdesc = erh->er_tupdesc;
+
+ /* Release our privately-managed tupdesc refcount, if any */
+ if (tupdesc)
+ {
+ erh->er_tupdesc = NULL; /* just for luck */
+ if (tupdesc->tdrefcount > 0)
+ {
+ if (--tupdesc->tdrefcount == 0)
+ FreeTupleDesc(tupdesc);
+ }
+ }
+}
+
+/*
+ * DatumGetExpandedRecord: get a writable expanded record from an input argument
+ *
+ * Caution: if the input is a read/write pointer, this returns the input
+ * argument; so callers must be sure that their changes are "safe", that is
+ * they cannot leave the record in a corrupt state.
+ */
+ExpandedRecordHeader *
+DatumGetExpandedRecord(Datum d)
+{
+ /* If it's a writable expanded record already, just return it */
+ if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+ {
+ ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(d);
+
+ Assert(erh->er_magic == ER_MAGIC);
+ return erh;
+ }
+
+ /* Else expand the hard way */
+ d = make_expanded_record_from_datum(d, CurrentMemoryContext);
+ return (ExpandedRecordHeader *) DatumGetEOHP(d);
+}
+
+/*
+ * Create the Datum/isnull representation of an expanded record object
+ * if we didn't do so already. After calling this, it's OK to read the
+ * dvalues/dnulls arrays directly, rather than going through get_field.
+ *
+ * Note that if the object is currently empty ("null"), this will change
+ * it to represent a row of nulls.
+ */
+void
+deconstruct_expanded_record(ExpandedRecordHeader *erh)
+{
+ TupleDesc tupdesc;
+ Datum *dvalues;
+ bool *dnulls;
+ int nfields;
+
+ if (erh->flags & ER_FLAG_DVALUES_VALID)
+ return; /* already valid, nothing to do */
+
+ /* We'll need the tuple descriptor */
+ tupdesc = expanded_record_get_tupdesc(erh);
+
+ /*
+ * Allocate arrays in private context, if we don't have them already. We
+ * don't expect to see a change in nfields here, so while we cope if it
+ * happens, we don't bother avoiding a leak of the old arrays (which might
+ * not be separately palloc'd, anyway).
+ */
+ nfields = tupdesc->natts;
+ if (erh->dvalues == NULL || erh->nfields != nfields)
+ {
+ char *chunk;
+
+ /*
+ * To save a palloc cycle, we allocate both the Datum and isnull
+ * arrays in one palloc chunk.
+ */
+ chunk = MemoryContextAlloc(erh->hdr.eoh_context,
+ nfields * (sizeof(Datum) + sizeof(bool)));
+ dvalues = (Datum *) chunk;
+ dnulls = (bool *) (chunk + nfields * sizeof(Datum));
+ erh->dvalues = dvalues;
+ erh->dnulls = dnulls;
+ erh->nfields = nfields;
+ }
+ else
+ {
+ dvalues = erh->dvalues;
+ dnulls = erh->dnulls;
+ }
+
+ if (erh->flags & ER_FLAG_FVALUE_VALID)
+ {
+ /* Deconstruct tuple */
+ heap_deform_tuple(erh->fvalue, tupdesc, dvalues, dnulls);
+ }
+ else
+ {
+ /* If record was empty, instantiate it as a row of nulls */
+ memset(dvalues, 0, nfields * sizeof(Datum));
+ memset(dnulls, true, nfields * sizeof(bool));
+ }
+
+ /* Mark the dvalues as valid */
+ erh->flags |= ER_FLAG_DVALUES_VALID;
+}
+
+/*
+ * Look up a record field by name
+ *
+ * If there is a field named "fieldname", fill in the contents of finfo
+ * and return "true". Else return "false" without changing *finfo.
+ */
+bool
+expanded_record_lookup_field(ExpandedRecordHeader *erh, const char *fieldname,
+ ExpandedRecordFieldInfo *finfo)
+{
+ TupleDesc tupdesc;
+ int fno;
+ Form_pg_attribute attr;
+ const FormData_pg_attribute *sysattr;
+
+ tupdesc = expanded_record_get_tupdesc(erh);
+
+ /* First, check user-defined attributes */
+ for (fno = 0; fno < tupdesc->natts; fno++)
+ {
+ attr = TupleDescAttr(tupdesc, fno);
+ if (namestrcmp(&attr->attname, fieldname) == 0 &&
+ !attr->attisdropped)
+ {
+ finfo->fnumber = attr->attnum;
+ finfo->ftypeid = attr->atttypid;
+ finfo->ftypmod = attr->atttypmod;
+ finfo->fcollation = attr->attcollation;
+ return true;
+ }
+ }
+
+ /* How about system attributes? */
+ sysattr = SystemAttributeByName(fieldname);
+ if (sysattr != NULL)
+ {
+ finfo->fnumber = sysattr->attnum;
+ finfo->ftypeid = sysattr->atttypid;
+ finfo->ftypmod = sysattr->atttypmod;
+ finfo->fcollation = sysattr->attcollation;
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Fetch value of record field
+ *
+ * expanded_record_get_field is the frontend for this; it handles the
+ * easy inline-able cases.
+ */
+Datum
+expanded_record_fetch_field(ExpandedRecordHeader *erh, int fnumber,
+ bool *isnull)
+{
+ if (fnumber > 0)
+ {
+ /* Empty record has null fields */
+ if (ExpandedRecordIsEmpty(erh))
+ {
+ *isnull = true;
+ return (Datum) 0;
+ }
+ /* Make sure we have deconstructed form */
+ deconstruct_expanded_record(erh);
+ /* Out-of-range field number reads as null */
+ if (unlikely(fnumber > erh->nfields))
+ {
+ *isnull = true;
+ return (Datum) 0;
+ }
+ *isnull = erh->dnulls[fnumber - 1];
+ return erh->dvalues[fnumber - 1];
+ }
+ else
+ {
+ /* System columns read as null if we haven't got flat tuple */
+ if (erh->fvalue == NULL)
+ {
+ *isnull = true;
+ return (Datum) 0;
+ }
+ /* heap_getsysattr doesn't actually use tupdesc, so just pass null */
+ return heap_getsysattr(erh->fvalue, fnumber, NULL, isnull);
+ }
+}
+
+/*
+ * Set value of record field
+ *
+ * If the expanded record is of domain type, the assignment will be rejected
+ * (without changing the record's state) if the domain's constraints would
+ * be violated.
+ *
+ * If expand_external is true and newValue is an out-of-line value, we'll
+ * forcibly detoast it so that the record does not depend on external storage.
+ *
+ * Internal callers can pass check_constraints = false to skip application
+ * of domain constraints. External callers should never do that.
+ */
+void
+expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
+ Datum newValue, bool isnull,
+ bool expand_external,
+ bool check_constraints)
+{
+ TupleDesc tupdesc;
+ Form_pg_attribute attr;
+ Datum *dvalues;
+ bool *dnulls;
+ char *oldValue;
+
+ /*
+ * Shouldn't ever be trying to assign new data to a dummy header, except
+ * in the case of an internal call for field inlining.
+ */
+ Assert(!(erh->flags & ER_FLAG_IS_DUMMY) || !check_constraints);
+
+ /* Before performing the assignment, see if result will satisfy domain */
+ if ((erh->flags & ER_FLAG_IS_DOMAIN) && check_constraints)
+ check_domain_for_new_field(erh, fnumber, newValue, isnull);
+
+ /* If we haven't yet deconstructed the tuple, do that */
+ if (!(erh->flags & ER_FLAG_DVALUES_VALID))
+ deconstruct_expanded_record(erh);
+
+ /* Tuple descriptor must be valid by now */
+ tupdesc = erh->er_tupdesc;
+ Assert(erh->nfields == tupdesc->natts);
+
+ /* Caller error if fnumber is system column or nonexistent column */
+ if (unlikely(fnumber <= 0 || fnumber > erh->nfields))
+ elog(ERROR, "cannot assign to field %d of expanded record", fnumber);
+
+ /*
+ * Copy new field value into record's context, and deal with detoasting,
+ * if needed.
+ */
+ attr = TupleDescAttr(tupdesc, fnumber - 1);
+ if (!isnull && !attr->attbyval)
+ {
+ MemoryContext oldcxt;
+
+ /* If requested, detoast any external value */
+ if (expand_external)
+ {
+ if (attr->attlen == -1 &&
+ VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+ {
+ /* Detoasting should be done in short-lived context. */
+ oldcxt = MemoryContextSwitchTo(get_short_term_cxt(erh));
+ newValue = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(newValue)));
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else
+ expand_external = false; /* need not clean up below */
+ }
+
+ /* Copy value into record's context */
+ oldcxt = MemoryContextSwitchTo(erh->hdr.eoh_context);
+ newValue = datumCopy(newValue, false, attr->attlen);
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We can now flush anything that detoasting might have leaked */
+ if (expand_external)
+ MemoryContextReset(erh->er_short_term_cxt);
+
+ /* Remember that we have field(s) that may need to be pfree'd */
+ erh->flags |= ER_FLAG_DVALUES_ALLOCED;
+
+ /*
+ * While we're here, note whether it's an external toasted value,
+ * because that could mean we need to inline it later. (Think not to
+ * merge this into the previous expand_external logic: datumCopy could
+ * by itself have made the value non-external.)
+ */
+ if (attr->attlen == -1 &&
+ VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+ erh->flags |= ER_FLAG_HAVE_EXTERNAL;
+ }
+
+ /*
+ * We're ready to make irreversible changes.
+ */
+ dvalues = erh->dvalues;
+ dnulls = erh->dnulls;
+
+ /* Flattened value will no longer represent record accurately */
+ erh->flags &= ~ER_FLAG_FVALUE_VALID;
+ /* And we don't know the flattened size either */
+ erh->flat_size = 0;
+
+ /* Grab old field value for pfree'ing, if needed. */
+ if (!attr->attbyval && !dnulls[fnumber - 1])
+ oldValue = (char *) DatumGetPointer(dvalues[fnumber - 1]);
+ else
+ oldValue = NULL;
+
+ /* And finally we can insert the new field. */
+ dvalues[fnumber - 1] = newValue;
+ dnulls[fnumber - 1] = isnull;
+
+ /*
+ * Free old field if needed; this keeps repeated field replacements from
+ * bloating the record's storage. If the pfree somehow fails, it won't
+ * corrupt the record.
+ *
+ * If we're updating a dummy header, we can't risk pfree'ing the old
+ * value, because most likely the expanded record's main header still has
+ * a pointer to it. This won't result in any sustained memory leak, since
+ * whatever we just allocated here is in the short-lived domain check
+ * context.
+ */
+ if (oldValue && !(erh->flags & ER_FLAG_IS_DUMMY))
+ {
+ /* Don't try to pfree a part of the original flat record */
+ if (oldValue < erh->fstartptr || oldValue >= erh->fendptr)
+ pfree(oldValue);
+ }
+}
+
+/*
+ * Set all record field(s)
+ *
+ * Caller must ensure that the provided datums are of the right types
+ * to match the record's previously assigned rowtype.
+ *
+ * If expand_external is true, we'll forcibly detoast out-of-line field values
+ * so that the record does not depend on external storage.
+ *
+ * Unlike repeated application of expanded_record_set_field(), this does not
+ * guarantee to leave the expanded record in a non-corrupt state in event
+ * of an error. Typically it would only be used for initializing a new
+ * expanded record. Also, because we expect this to be applied at most once
+ * in the lifespan of an expanded record, we do not worry about any cruft
+ * that detoasting might leak.
+ */
+void
+expanded_record_set_fields(ExpandedRecordHeader *erh,
+ const Datum *newValues, const bool *isnulls,
+ bool expand_external)
+{
+ TupleDesc tupdesc;
+ Datum *dvalues;
+ bool *dnulls;
+ int fnumber;
+ MemoryContext oldcxt;
+
+ /* Shouldn't ever be trying to assign new data to a dummy header */
+ Assert(!(erh->flags & ER_FLAG_IS_DUMMY));
+
+ /* If we haven't yet deconstructed the tuple, do that */
+ if (!(erh->flags & ER_FLAG_DVALUES_VALID))
+ deconstruct_expanded_record(erh);
+
+ /* Tuple descriptor must be valid by now */
+ tupdesc = erh->er_tupdesc;
+ Assert(erh->nfields == tupdesc->natts);
+
+ /* Flattened value will no longer represent record accurately */
+ erh->flags &= ~ER_FLAG_FVALUE_VALID;
+ /* And we don't know the flattened size either */
+ erh->flat_size = 0;
+
+ oldcxt = MemoryContextSwitchTo(erh->hdr.eoh_context);
+
+ dvalues = erh->dvalues;
+ dnulls = erh->dnulls;
+
+ for (fnumber = 0; fnumber < erh->nfields; fnumber++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+ Datum newValue;
+ bool isnull;
+
+ /* Ignore dropped columns */
+ if (attr->attisdropped)
+ continue;
+
+ newValue = newValues[fnumber];
+ isnull = isnulls[fnumber];
+
+ if (!attr->attbyval)
+ {
+ /*
+ * Copy new field value into record's context, and deal with
+ * detoasting, if needed.
+ */
+ if (!isnull)
+ {
+ /* Is it an external toasted value? */
+ if (attr->attlen == -1 &&
+ VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+ {
+ if (expand_external)
+ {
+ /* Detoast as requested while copying the value */
+ newValue = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(newValue)));
+ }
+ else
+ {
+ /* Just copy the value */
+ newValue = datumCopy(newValue, false, -1);
+ /* If it's still external, remember that */
+ if (VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+ erh->flags |= ER_FLAG_HAVE_EXTERNAL;
+ }
+ }
+ else
+ {
+ /* Not an external value, just copy it */
+ newValue = datumCopy(newValue, false, attr->attlen);
+ }
+
+ /* Remember that we have field(s) that need to be pfree'd */
+ erh->flags |= ER_FLAG_DVALUES_ALLOCED;
+ }
+
+ /*
+ * Free old field value, if any (not likely, since really we ought
+ * to be inserting into an empty record).
+ */
+ if (unlikely(!dnulls[fnumber]))
+ {
+ char *oldValue;
+
+ oldValue = (char *) DatumGetPointer(dvalues[fnumber]);
+ /* Don't try to pfree a part of the original flat record */
+ if (oldValue < erh->fstartptr || oldValue >= erh->fendptr)
+ pfree(oldValue);
+ }
+ }
+
+ /* And finally we can insert the new field. */
+ dvalues[fnumber] = newValue;
+ dnulls[fnumber] = isnull;
+ }
+
+ /*
+ * Because we don't guarantee atomicity of set_fields(), we can just leave
+ * checking of domain constraints to occur as the final step; if it throws
+ * an error, too bad.
+ */
+ if (erh->flags & ER_FLAG_IS_DOMAIN)
+ {
+ /* We run domain_check in a short-lived context to limit cruft */
+ MemoryContextSwitchTo(get_short_term_cxt(erh));
+
+ domain_check(ExpandedRecordGetRODatum(erh), false,
+ erh->er_decltypeid,
+ &erh->er_domaininfo,
+ erh->hdr.eoh_context);
+ }
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * Construct (or reset) working memory context for short-term operations.
+ *
+ * This context is used for domain check evaluation and for detoasting.
+ *
+ * If we don't have a short-lived memory context, make one; if we have one,
+ * reset it to get rid of any leftover cruft. (It is a tad annoying to need a
+ * whole context for this, since it will often go unused --- but it's hard to
+ * avoid memory leaks otherwise. We can make the context small, at least.)
+ */
+static MemoryContext
+get_short_term_cxt(ExpandedRecordHeader *erh)
+{
+ if (erh->er_short_term_cxt == NULL)
+ erh->er_short_term_cxt =
+ AllocSetContextCreate(erh->hdr.eoh_context,
+ "expanded record short-term context",
+ ALLOCSET_SMALL_SIZES);
+ else
+ MemoryContextReset(erh->er_short_term_cxt);
+ return erh->er_short_term_cxt;
+}
+
+/*
+ * Construct "dummy header" for checking domain constraints.
+ *
+ * Since we don't want to modify the state of the expanded record until
+ * we've validated the constraints, our approach is to set up a dummy
+ * record header containing the new field value(s) and then pass that to
+ * domain_check. We retain the dummy header as part of the expanded
+ * record's state to save palloc cycles, but reinitialize (most of)
+ * its contents on each use.
+ */
+static void
+build_dummy_expanded_header(ExpandedRecordHeader *main_erh)
+{
+ ExpandedRecordHeader *erh;
+ TupleDesc tupdesc = expanded_record_get_tupdesc(main_erh);
+
+ /* Ensure we have a short-lived context */
+ (void) get_short_term_cxt(main_erh);
+
+ /*
+ * Allocate dummy header on first time through, or in the unlikely event
+ * that the number of fields changes (in which case we just leak the old
+ * one). Include space for its field values in the request.
+ */
+ erh = main_erh->er_dummy_header;
+ if (erh == NULL || erh->nfields != tupdesc->natts)
+ {
+ char *chunk;
+
+ erh = (ExpandedRecordHeader *)
+ MemoryContextAlloc(main_erh->hdr.eoh_context,
+ MAXALIGN(sizeof(ExpandedRecordHeader))
+ + tupdesc->natts * (sizeof(Datum) + sizeof(bool)));
+
+ /* Ensure all header fields are initialized to 0/null */
+ memset(erh, 0, sizeof(ExpandedRecordHeader));
+
+ /*
+ * We set up the dummy header with an indication that its memory
+ * context is the short-lived context. This is so that, if any
+ * detoasting of out-of-line values happens due to an attempt to
+ * extract a composite datum from the dummy header, the detoasted
+ * stuff will end up in the short-lived context and not cause a leak.
+ * This is cheating a bit on the expanded-object protocol; but since
+ * we never pass a R/W pointer to the dummy object to any other code,
+ * nothing else is authorized to delete or transfer ownership of the
+ * object's context, so it should be safe enough.
+ */
+ EOH_init_header(&erh->hdr, &ER_methods, main_erh->er_short_term_cxt);
+ erh->er_magic = ER_MAGIC;
+
+ /* Set up dvalues/dnulls, with no valid contents as yet */
+ chunk = (char *) erh + MAXALIGN(sizeof(ExpandedRecordHeader));
+ erh->dvalues = (Datum *) chunk;
+ erh->dnulls = (bool *) (chunk + tupdesc->natts * sizeof(Datum));
+ erh->nfields = tupdesc->natts;
+
+ /*
+ * The fields we just set are assumed to remain constant through
+ * multiple uses of the dummy header to check domain constraints. All
+ * other dummy header fields should be explicitly reset below, to
+ * ensure there's not accidental effects of one check on the next one.
+ */
+
+ main_erh->er_dummy_header = erh;
+ }
+
+ /*
+ * If anything inquires about the dummy header's declared type, it should
+ * report the composite base type, not the domain type (since the VALUE in
+ * a domain check constraint is of the base type not the domain). Hence
+ * we do not transfer over the IS_DOMAIN flag, nor indeed any of the main
+ * header's flags, since the dummy header is empty of data at this point.
+ * But don't forget to mark header as dummy.
+ */
+ erh->flags = ER_FLAG_IS_DUMMY;
+
+ /* Copy composite-type identification info */
+ erh->er_decltypeid = erh->er_typeid = main_erh->er_typeid;
+ erh->er_typmod = main_erh->er_typmod;
+
+ /* Dummy header does not need its own tupdesc refcount */
+ erh->er_tupdesc = tupdesc;
+ erh->er_tupdesc_id = main_erh->er_tupdesc_id;
+
+ /*
+ * It's tempting to copy over whatever we know about the flat size, but
+ * there's no point since we're surely about to modify the dummy record's
+ * field(s). Instead just clear anything left over from a previous usage
+ * cycle.
+ */
+ erh->flat_size = 0;
+
+ /* Copy over fvalue if we have it, so that system columns are available */
+ erh->fvalue = main_erh->fvalue;
+ erh->fstartptr = main_erh->fstartptr;
+ erh->fendptr = main_erh->fendptr;
+}
+
+/*
+ * Precheck domain constraints for a set_field operation
+ */
+static pg_noinline void
+check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
+ Datum newValue, bool isnull)
+{
+ ExpandedRecordHeader *dummy_erh;
+ MemoryContext oldcxt;
+
+ /* Construct dummy header to contain proposed new field set */
+ build_dummy_expanded_header(erh);
+ dummy_erh = erh->er_dummy_header;
+
+ /*
+ * If record isn't empty, just deconstruct it (if needed) and copy over
+ * the existing field values. If it is empty, just fill fields with nulls
+ * manually --- don't call deconstruct_expanded_record prematurely.
+ */
+ if (!ExpandedRecordIsEmpty(erh))
+ {
+ deconstruct_expanded_record(erh);
+ memcpy(dummy_erh->dvalues, erh->dvalues,
+ dummy_erh->nfields * sizeof(Datum));
+ memcpy(dummy_erh->dnulls, erh->dnulls,
+ dummy_erh->nfields * sizeof(bool));
+ /* There might be some external values in there... */
+ dummy_erh->flags |= erh->flags & ER_FLAG_HAVE_EXTERNAL;
+ }
+ else
+ {
+ memset(dummy_erh->dvalues, 0, dummy_erh->nfields * sizeof(Datum));
+ memset(dummy_erh->dnulls, true, dummy_erh->nfields * sizeof(bool));
+ }
+
+ /* Either way, we now have valid dvalues */
+ dummy_erh->flags |= ER_FLAG_DVALUES_VALID;
+
+ /* Caller error if fnumber is system column or nonexistent column */
+ if (unlikely(fnumber <= 0 || fnumber > dummy_erh->nfields))
+ elog(ERROR, "cannot assign to field %d of expanded record", fnumber);
+
+ /* Insert proposed new value into dummy field array */
+ dummy_erh->dvalues[fnumber - 1] = newValue;
+ dummy_erh->dnulls[fnumber - 1] = isnull;
+
+ /*
+ * The proposed new value might be external, in which case we'd better set
+ * the flag for that in dummy_erh. (This matters in case something in the
+ * domain check expressions tries to extract a flat value from the dummy
+ * header.)
+ */
+ if (!isnull)
+ {
+ Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+
+ if (!attr->attbyval && attr->attlen == -1 &&
+ VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+ dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
+ }
+
+ /*
+ * We call domain_check in the short-lived context, so that any cruft
+ * leaked by expression evaluation can be reclaimed.
+ */
+ oldcxt = MemoryContextSwitchTo(erh->er_short_term_cxt);
+
+ /*
+ * And now we can apply the check. Note we use main header's domain cache
+ * space, so that caching carries across repeated uses.
+ */
+ domain_check(ExpandedRecordGetRODatum(dummy_erh), false,
+ erh->er_decltypeid,
+ &erh->er_domaininfo,
+ erh->hdr.eoh_context);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We might as well clean up cruft immediately. */
+ MemoryContextReset(erh->er_short_term_cxt);
+}
+
+/*
+ * Precheck domain constraints for a set_tuple operation
+ */
+static pg_noinline void
+check_domain_for_new_tuple(ExpandedRecordHeader *erh, HeapTuple tuple)
+{
+ ExpandedRecordHeader *dummy_erh;
+ MemoryContext oldcxt;
+
+ /* If we're being told to set record to empty, just see if NULL is OK */
+ if (tuple == NULL)
+ {
+ /* We run domain_check in a short-lived context to limit cruft */
+ oldcxt = MemoryContextSwitchTo(get_short_term_cxt(erh));
+
+ domain_check((Datum) 0, true,
+ erh->er_decltypeid,
+ &erh->er_domaininfo,
+ erh->hdr.eoh_context);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We might as well clean up cruft immediately. */
+ MemoryContextReset(erh->er_short_term_cxt);
+
+ return;
+ }
+
+ /* Construct dummy header to contain replacement tuple */
+ build_dummy_expanded_header(erh);
+ dummy_erh = erh->er_dummy_header;
+
+ /* Insert tuple, but don't bother to deconstruct its fields for now */
+ dummy_erh->fvalue = tuple;
+ dummy_erh->fstartptr = (char *) tuple->t_data;
+ dummy_erh->fendptr = ((char *) tuple->t_data) + tuple->t_len;
+ dummy_erh->flags |= ER_FLAG_FVALUE_VALID;
+
+ /* Remember if we have any out-of-line field values */
+ if (HeapTupleHasExternal(tuple))
+ dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
+
+ /*
+ * We call domain_check in the short-lived context, so that any cruft
+ * leaked by expression evaluation can be reclaimed.
+ */
+ oldcxt = MemoryContextSwitchTo(erh->er_short_term_cxt);
+
+ /*
+ * And now we can apply the check. Note we use main header's domain cache
+ * space, so that caching carries across repeated uses.
+ */
+ domain_check(ExpandedRecordGetRODatum(dummy_erh), false,
+ erh->er_decltypeid,
+ &erh->er_domaininfo,
+ erh->hdr.eoh_context);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We might as well clean up cruft immediately. */
+ MemoryContextReset(erh->er_short_term_cxt);
+}
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
new file mode 100644
index 0000000..63bb0f2
--- /dev/null
+++ b/src/backend/utils/adt/float.c
@@ -0,0 +1,4074 @@
+/*-------------------------------------------------------------------------
+ *
+ * float.c
+ * Functions for the built-in floating-point types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/float.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <math.h>
+#include <limits.h>
+
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "common/pg_prng.h"
+#include "common/shortest_dec.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "utils/array.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/sortsupport.h"
+#include "utils/timestamp.h"
+
+
+/*
+ * Configurable GUC parameter
+ *
+ * If >0, use shortest-decimal format for output; this is both the default and
+ * allows for compatibility with clients that explicitly set a value here to
+ * get round-trip-accurate results. If 0 or less, then use the old, slow,
+ * decimal rounding method.
+ */
+int extra_float_digits = 1;
+
+/* Cached constants for degree-based trig functions */
+static bool degree_consts_set = false;
+static float8 sin_30 = 0;
+static float8 one_minus_cos_60 = 0;
+static float8 asin_0_5 = 0;
+static float8 acos_0_5 = 0;
+static float8 atan_1_0 = 0;
+static float8 tan_45 = 0;
+static float8 cot_45 = 0;
+
+/*
+ * These are intentionally not static; don't "fix" them. They will never
+ * be referenced by other files, much less changed; but we don't want the
+ * compiler to know that, else it might try to precompute expressions
+ * involving them. See comments for init_degree_constants().
+ */
+float8 degree_c_thirty = 30.0;
+float8 degree_c_forty_five = 45.0;
+float8 degree_c_sixty = 60.0;
+float8 degree_c_one_half = 0.5;
+float8 degree_c_one = 1.0;
+
+/* State for drandom() and setseed() */
+static bool drandom_seed_set = false;
+static pg_prng_state drandom_seed;
+
+/* Local function prototypes */
+static double sind_q1(double x);
+static double cosd_q1(double x);
+static void init_degree_constants(void);
+
+
+/*
+ * We use these out-of-line ereport() calls to report float overflow,
+ * underflow, and zero-divide, because following our usual practice of
+ * repeating them at each call site would lead to a lot of code bloat.
+ *
+ * This does mean that you don't get a useful error location indicator.
+ */
+pg_noinline void
+float_overflow_error(void)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value out of range: overflow")));
+}
+
+pg_noinline void
+float_underflow_error(void)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value out of range: underflow")));
+}
+
+pg_noinline void
+float_zero_divide_error(void)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+}
+
+
+/*
+ * Returns -1 if 'val' represents negative infinity, 1 if 'val'
+ * represents (positive) infinity, and 0 otherwise. On some platforms,
+ * this is equivalent to the isinf() macro, but not everywhere: C99
+ * does not specify that isinf() needs to distinguish between positive
+ * and negative infinity.
+ */
+int
+is_infinite(double val)
+{
+ int inf = isinf(val);
+
+ if (inf == 0)
+ return 0;
+ else if (val > 0)
+ return 1;
+ else
+ return -1;
+}
+
+
+/* ========== USER I/O ROUTINES ========== */
+
+
+/*
+ * float4in - converts "num" to float4
+ *
+ * Note that this code now uses strtof(), where it used to use strtod().
+ *
+ * The motivation for using strtof() is to avoid a double-rounding problem:
+ * for certain decimal inputs, if you round the input correctly to a double,
+ * and then round the double to a float, the result is incorrect in that it
+ * does not match the result of rounding the decimal value to float directly.
+ *
+ * One of the best examples is 7.038531e-26:
+ *
+ * 0xAE43FDp-107 = 7.03853069185120912085...e-26
+ * midpoint 7.03853100000000022281...e-26
+ * 0xAE43FEp-107 = 7.03853130814879132477...e-26
+ *
+ * making 0xAE43FDp-107 the correct float result, but if you do the conversion
+ * via a double, you get
+ *
+ * 0xAE43FD.7FFFFFF8p-107 = 7.03853099999999907487...e-26
+ * midpoint 7.03853099999999964884...e-26
+ * 0xAE43FD.80000000p-107 = 7.03853100000000022281...e-26
+ * 0xAE43FD.80000008p-107 = 7.03853100000000137076...e-26
+ *
+ * so the value rounds to the double exactly on the midpoint between the two
+ * nearest floats, and then rounding again to a float gives the incorrect
+ * result of 0xAE43FEp-107.
+ *
+ */
+Datum
+float4in(PG_FUNCTION_ARGS)
+{
+ char *num = PG_GETARG_CSTRING(0);
+ char *orig_num;
+ float val;
+ char *endptr;
+
+ /*
+ * endptr points to the first character _after_ the sequence we recognized
+ * as a valid floating point number. orig_num points to the original input
+ * string.
+ */
+ orig_num = num;
+
+ /* skip leading whitespace */
+ while (*num != '\0' && isspace((unsigned char) *num))
+ num++;
+
+ /*
+ * Check for an empty-string input to begin with, to avoid the vagaries of
+ * strtod() on different platforms.
+ */
+ if (*num == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "real", orig_num)));
+
+ errno = 0;
+ val = strtof(num, &endptr);
+
+ /* did we not see anything that looks like a double? */
+ if (endptr == num || errno != 0)
+ {
+ int save_errno = errno;
+
+ /*
+ * C99 requires that strtof() accept NaN, [+-]Infinity, and [+-]Inf,
+ * but not all platforms support all of these (and some accept them
+ * but set ERANGE anyway...) Therefore, we check for these inputs
+ * ourselves if strtof() fails.
+ *
+ * Note: C99 also requires hexadecimal input as well as some extended
+ * forms of NaN, but we consider these forms unportable and don't try
+ * to support them. You can use 'em if your strtof() takes 'em.
+ */
+ if (pg_strncasecmp(num, "NaN", 3) == 0)
+ {
+ val = get_float4_nan();
+ endptr = num + 3;
+ }
+ else if (pg_strncasecmp(num, "Infinity", 8) == 0)
+ {
+ val = get_float4_infinity();
+ endptr = num + 8;
+ }
+ else if (pg_strncasecmp(num, "+Infinity", 9) == 0)
+ {
+ val = get_float4_infinity();
+ endptr = num + 9;
+ }
+ else if (pg_strncasecmp(num, "-Infinity", 9) == 0)
+ {
+ val = -get_float4_infinity();
+ endptr = num + 9;
+ }
+ else if (pg_strncasecmp(num, "inf", 3) == 0)
+ {
+ val = get_float4_infinity();
+ endptr = num + 3;
+ }
+ else if (pg_strncasecmp(num, "+inf", 4) == 0)
+ {
+ val = get_float4_infinity();
+ endptr = num + 4;
+ }
+ else if (pg_strncasecmp(num, "-inf", 4) == 0)
+ {
+ val = -get_float4_infinity();
+ endptr = num + 4;
+ }
+ else if (save_errno == ERANGE)
+ {
+ /*
+ * Some platforms return ERANGE for denormalized numbers (those
+ * that are not zero, but are too close to zero to have full
+ * precision). We'd prefer not to throw error for that, so try to
+ * detect whether it's a "real" out-of-range condition by checking
+ * to see if the result is zero or huge.
+ *
+ * Use isinf() rather than HUGE_VALF on VS2013 because it
+ * generates a spurious overflow warning for -HUGE_VALF. Also use
+ * isinf() if HUGE_VALF is missing.
+ */
+ if (val == 0.0 ||
+#if !defined(HUGE_VALF) || (defined(_MSC_VER) && (_MSC_VER < 1900))
+ isinf(val)
+#else
+ (val >= HUGE_VALF || val <= -HUGE_VALF)
+#endif
+ )
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("\"%s\" is out of range for type real",
+ orig_num)));
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "real", orig_num)));
+ }
+
+ /* skip trailing whitespace */
+ while (*endptr != '\0' && isspace((unsigned char) *endptr))
+ endptr++;
+
+ /* if there is any junk left at the end of the string, bail out */
+ if (*endptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "real", orig_num)));
+
+ PG_RETURN_FLOAT4(val);
+}
+
+/*
+ * float4out - converts a float4 number to a string
+ * using a standard output format
+ */
+Datum
+float4out(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+ char *ascii = (char *) palloc(32);
+ int ndig = FLT_DIG + extra_float_digits;
+
+ if (extra_float_digits > 0)
+ {
+ float_to_shortest_decimal_buf(num, ascii);
+ PG_RETURN_CSTRING(ascii);
+ }
+
+ (void) pg_strfromd(ascii, 32, ndig, num);
+ PG_RETURN_CSTRING(ascii);
+}
+
+/*
+ * float4recv - converts external binary format to float4
+ */
+Datum
+float4recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_FLOAT4(pq_getmsgfloat4(buf));
+}
+
+/*
+ * float4send - converts float4 to binary format
+ */
+Datum
+float4send(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat4(&buf, num);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * float8in - converts "num" to float8
+ */
+Datum
+float8in(PG_FUNCTION_ARGS)
+{
+ char *num = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_FLOAT8(float8in_internal(num, NULL, "double precision", num));
+}
+
+/* Convenience macro: set *have_error flag (if provided) or throw error */
+#define RETURN_ERROR(throw_error, have_error) \
+do { \
+ if (have_error) { \
+ *have_error = true; \
+ return 0.0; \
+ } else { \
+ throw_error; \
+ } \
+} while (0)
+
+/*
+ * float8in_internal_opt_error - guts of float8in()
+ *
+ * This is exposed for use by functions that want a reasonably
+ * platform-independent way of inputting doubles. The behavior is
+ * essentially like strtod + ereport on error, but note the following
+ * differences:
+ * 1. Both leading and trailing whitespace are skipped.
+ * 2. If endptr_p is NULL, we throw error if there's trailing junk.
+ * Otherwise, it's up to the caller to complain about trailing junk.
+ * 3. In event of a syntax error, the report mentions the given type_name
+ * and prints orig_string as the input; this is meant to support use of
+ * this function with types such as "box" and "point", where what we are
+ * parsing here is just a substring of orig_string.
+ *
+ * "num" could validly be declared "const char *", but that results in an
+ * unreasonable amount of extra casting both here and in callers, so we don't.
+ *
+ * When "*have_error" flag is provided, it's set instead of throwing an
+ * error. This is helpful when caller need to handle errors by itself.
+ */
+double
+float8in_internal_opt_error(char *num, char **endptr_p,
+ const char *type_name, const char *orig_string,
+ bool *have_error)
+{
+ double val;
+ char *endptr;
+
+ if (have_error)
+ *have_error = false;
+
+ /* skip leading whitespace */
+ while (*num != '\0' && isspace((unsigned char) *num))
+ num++;
+
+ /*
+ * Check for an empty-string input to begin with, to avoid the vagaries of
+ * strtod() on different platforms.
+ */
+ if (*num == '\0')
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string))),
+ have_error);
+
+ errno = 0;
+ val = strtod(num, &endptr);
+
+ /* did we not see anything that looks like a double? */
+ if (endptr == num || errno != 0)
+ {
+ int save_errno = errno;
+
+ /*
+ * C99 requires that strtod() accept NaN, [+-]Infinity, and [+-]Inf,
+ * but not all platforms support all of these (and some accept them
+ * but set ERANGE anyway...) Therefore, we check for these inputs
+ * ourselves if strtod() fails.
+ *
+ * Note: C99 also requires hexadecimal input as well as some extended
+ * forms of NaN, but we consider these forms unportable and don't try
+ * to support them. You can use 'em if your strtod() takes 'em.
+ */
+ if (pg_strncasecmp(num, "NaN", 3) == 0)
+ {
+ val = get_float8_nan();
+ endptr = num + 3;
+ }
+ else if (pg_strncasecmp(num, "Infinity", 8) == 0)
+ {
+ val = get_float8_infinity();
+ endptr = num + 8;
+ }
+ else if (pg_strncasecmp(num, "+Infinity", 9) == 0)
+ {
+ val = get_float8_infinity();
+ endptr = num + 9;
+ }
+ else if (pg_strncasecmp(num, "-Infinity", 9) == 0)
+ {
+ val = -get_float8_infinity();
+ endptr = num + 9;
+ }
+ else if (pg_strncasecmp(num, "inf", 3) == 0)
+ {
+ val = get_float8_infinity();
+ endptr = num + 3;
+ }
+ else if (pg_strncasecmp(num, "+inf", 4) == 0)
+ {
+ val = get_float8_infinity();
+ endptr = num + 4;
+ }
+ else if (pg_strncasecmp(num, "-inf", 4) == 0)
+ {
+ val = -get_float8_infinity();
+ endptr = num + 4;
+ }
+ else if (save_errno == ERANGE)
+ {
+ /*
+ * Some platforms return ERANGE for denormalized numbers (those
+ * that are not zero, but are too close to zero to have full
+ * precision). We'd prefer not to throw error for that, so try to
+ * detect whether it's a "real" out-of-range condition by checking
+ * to see if the result is zero or huge.
+ *
+ * On error, we intentionally complain about double precision not
+ * the given type name, and we print only the part of the string
+ * that is the current number.
+ */
+ if (val == 0.0 || val >= HUGE_VAL || val <= -HUGE_VAL)
+ {
+ char *errnumber = pstrdup(num);
+
+ errnumber[endptr - num] = '\0';
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("\"%s\" is out of range for type double precision",
+ errnumber))),
+ have_error);
+ }
+ }
+ else
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type "
+ "%s: \"%s\"",
+ type_name, orig_string))),
+ have_error);
+ }
+
+ /* skip trailing whitespace */
+ while (*endptr != '\0' && isspace((unsigned char) *endptr))
+ endptr++;
+
+ /* report stopping point if wanted, else complain if not end of string */
+ if (endptr_p)
+ *endptr_p = endptr;
+ else if (*endptr != '\0')
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type "
+ "%s: \"%s\"",
+ type_name, orig_string))),
+ have_error);
+
+ return val;
+}
+
+/*
+ * Interface to float8in_internal_opt_error() without "have_error" argument.
+ */
+double
+float8in_internal(char *num, char **endptr_p,
+ const char *type_name, const char *orig_string)
+{
+ return float8in_internal_opt_error(num, endptr_p, type_name,
+ orig_string, NULL);
+}
+
+
+/*
+ * float8out - converts float8 number to a string
+ * using a standard output format
+ */
+Datum
+float8out(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_CSTRING(float8out_internal(num));
+}
+
+/*
+ * float8out_internal - guts of float8out()
+ *
+ * This is exposed for use by functions that want a reasonably
+ * platform-independent way of outputting doubles.
+ * The result is always palloc'd.
+ */
+char *
+float8out_internal(double num)
+{
+ char *ascii = (char *) palloc(32);
+ int ndig = DBL_DIG + extra_float_digits;
+
+ if (extra_float_digits > 0)
+ {
+ double_to_shortest_decimal_buf(num, ascii);
+ return ascii;
+ }
+
+ (void) pg_strfromd(ascii, 32, ndig, num);
+ return ascii;
+}
+
+/*
+ * float8recv - converts external binary format to float8
+ */
+Datum
+float8recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_FLOAT8(pq_getmsgfloat8(buf));
+}
+
+/*
+ * float8send - converts float8 to binary format
+ */
+Datum
+float8send(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, num);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/* ========== PUBLIC ROUTINES ========== */
+
+
+/*
+ * ======================
+ * FLOAT4 BASE OPERATIONS
+ * ======================
+ */
+
+/*
+ * float4abs - returns |arg1| (absolute value)
+ */
+Datum
+float4abs(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+
+ PG_RETURN_FLOAT4((float4) fabs(arg1));
+}
+
+/*
+ * float4um - returns -arg1 (unary minus)
+ */
+Datum
+float4um(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 result;
+
+ result = -arg1;
+ PG_RETURN_FLOAT4(result);
+}
+
+Datum
+float4up(PG_FUNCTION_ARGS)
+{
+ float4 arg = PG_GETARG_FLOAT4(0);
+
+ PG_RETURN_FLOAT4(arg);
+}
+
+Datum
+float4larger(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+ float4 result;
+
+ if (float4_gt(arg1, arg2))
+ result = arg1;
+ else
+ result = arg2;
+ PG_RETURN_FLOAT4(result);
+}
+
+Datum
+float4smaller(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+ float4 result;
+
+ if (float4_lt(arg1, arg2))
+ result = arg1;
+ else
+ result = arg2;
+ PG_RETURN_FLOAT4(result);
+}
+
+/*
+ * ======================
+ * FLOAT8 BASE OPERATIONS
+ * ======================
+ */
+
+/*
+ * float8abs - returns |arg1| (absolute value)
+ */
+Datum
+float8abs(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(fabs(arg1));
+}
+
+
+/*
+ * float8um - returns -arg1 (unary minus)
+ */
+Datum
+float8um(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ result = -arg1;
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+float8up(PG_FUNCTION_ARGS)
+{
+ float8 arg = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(arg);
+}
+
+Datum
+float8larger(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+ float8 result;
+
+ if (float8_gt(arg1, arg2))
+ result = arg1;
+ else
+ result = arg2;
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+float8smaller(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+ float8 result;
+
+ if (float8_lt(arg1, arg2))
+ result = arg1;
+ else
+ result = arg2;
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * ====================
+ * ARITHMETIC OPERATORS
+ * ====================
+ */
+
+/*
+ * float4pl - returns arg1 + arg2
+ * float4mi - returns arg1 - arg2
+ * float4mul - returns arg1 * arg2
+ * float4div - returns arg1 / arg2
+ */
+Datum
+float4pl(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT4(float4_pl(arg1, arg2));
+}
+
+Datum
+float4mi(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT4(float4_mi(arg1, arg2));
+}
+
+Datum
+float4mul(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT4(float4_mul(arg1, arg2));
+}
+
+Datum
+float4div(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT4(float4_div(arg1, arg2));
+}
+
+/*
+ * float8pl - returns arg1 + arg2
+ * float8mi - returns arg1 - arg2
+ * float8mul - returns arg1 * arg2
+ * float8div - returns arg1 / arg2
+ */
+Datum
+float8pl(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_pl(arg1, arg2));
+}
+
+Datum
+float8mi(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_mi(arg1, arg2));
+}
+
+Datum
+float8mul(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_mul(arg1, arg2));
+}
+
+Datum
+float8div(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_div(arg1, arg2));
+}
+
+
+/*
+ * ====================
+ * COMPARISON OPERATORS
+ * ====================
+ */
+
+/*
+ * float4{eq,ne,lt,le,gt,ge} - float4/float4 comparison operations
+ */
+int
+float4_cmp_internal(float4 a, float4 b)
+{
+ if (float4_gt(a, b))
+ return 1;
+ if (float4_lt(a, b))
+ return -1;
+ return 0;
+}
+
+Datum
+float4eq(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_eq(arg1, arg2));
+}
+
+Datum
+float4ne(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_ne(arg1, arg2));
+}
+
+Datum
+float4lt(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_lt(arg1, arg2));
+}
+
+Datum
+float4le(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_le(arg1, arg2));
+}
+
+Datum
+float4gt(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_gt(arg1, arg2));
+}
+
+Datum
+float4ge(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float4_ge(arg1, arg2));
+}
+
+Datum
+btfloat4cmp(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_INT32(float4_cmp_internal(arg1, arg2));
+}
+
+static int
+btfloat4fastcmp(Datum x, Datum y, SortSupport ssup)
+{
+ float4 arg1 = DatumGetFloat4(x);
+ float4 arg2 = DatumGetFloat4(y);
+
+ return float4_cmp_internal(arg1, arg2);
+}
+
+Datum
+btfloat4sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = btfloat4fastcmp;
+ PG_RETURN_VOID();
+}
+
+/*
+ * float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations
+ */
+int
+float8_cmp_internal(float8 a, float8 b)
+{
+ if (float8_gt(a, b))
+ return 1;
+ if (float8_lt(a, b))
+ return -1;
+ return 0;
+}
+
+Datum
+float8eq(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_eq(arg1, arg2));
+}
+
+Datum
+float8ne(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_ne(arg1, arg2));
+}
+
+Datum
+float8lt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_lt(arg1, arg2));
+}
+
+Datum
+float8le(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_le(arg1, arg2));
+}
+
+Datum
+float8gt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_gt(arg1, arg2));
+}
+
+Datum
+float8ge(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_ge(arg1, arg2));
+}
+
+Datum
+btfloat8cmp(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));
+}
+
+static int
+btfloat8fastcmp(Datum x, Datum y, SortSupport ssup)
+{
+ float8 arg1 = DatumGetFloat8(x);
+ float8 arg2 = DatumGetFloat8(y);
+
+ return float8_cmp_internal(arg1, arg2);
+}
+
+Datum
+btfloat8sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = btfloat8fastcmp;
+ PG_RETURN_VOID();
+}
+
+Datum
+btfloat48cmp(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ /* widen float4 to float8 and then compare */
+ PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));
+}
+
+Datum
+btfloat84cmp(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ /* widen float4 to float8 and then compare */
+ PG_RETURN_INT32(float8_cmp_internal(arg1, arg2));
+}
+
+/*
+ * in_range support function for float8.
+ *
+ * Note: we needn't supply a float8_float4 variant, as implicit coercion
+ * of the offset value takes care of that scenario just as well.
+ */
+Datum
+in_range_float8_float8(PG_FUNCTION_ARGS)
+{
+ float8 val = PG_GETARG_FLOAT8(0);
+ float8 base = PG_GETARG_FLOAT8(1);
+ float8 offset = PG_GETARG_FLOAT8(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ float8 sum;
+
+ /*
+ * Reject negative or NaN offset. Negative is per spec, and NaN is
+ * because appropriate semantics for that seem non-obvious.
+ */
+ if (isnan(offset) || offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /*
+ * Deal with cases where val and/or base is NaN, following the rule that
+ * NaN sorts after non-NaN (cf float8_cmp_internal). The offset cannot
+ * affect the conclusion.
+ */
+ if (isnan(val))
+ {
+ if (isnan(base))
+ PG_RETURN_BOOL(true); /* NAN = NAN */
+ else
+ PG_RETURN_BOOL(!less); /* NAN > non-NAN */
+ }
+ else if (isnan(base))
+ {
+ PG_RETURN_BOOL(less); /* non-NAN < NAN */
+ }
+
+ /*
+ * Deal with cases where both base and offset are infinite, and computing
+ * base +/- offset would produce NaN. This corresponds to a window frame
+ * whose boundary infinitely precedes +inf or infinitely follows -inf,
+ * which is not well-defined. For consistency with other cases involving
+ * infinities, such as the fact that +inf infinitely follows +inf, we
+ * choose to assume that +inf infinitely precedes +inf and -inf infinitely
+ * follows -inf, and therefore that all finite and infinite values are in
+ * such a window frame.
+ *
+ * offset is known positive, so we need only check the sign of base in
+ * this test.
+ */
+ if (isinf(offset) && isinf(base) &&
+ (sub ? base > 0 : base < 0))
+ PG_RETURN_BOOL(true);
+
+ /*
+ * Otherwise it should be safe to compute base +/- offset. We trust the
+ * FPU to cope if an input is +/-inf or the true sum would overflow, and
+ * produce a suitably signed infinity, which will compare properly against
+ * val whether or not that's infinity.
+ */
+ if (sub)
+ sum = base - offset;
+ else
+ sum = base + offset;
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+/*
+ * in_range support function for float4.
+ *
+ * We would need a float4_float8 variant in any case, so we supply that and
+ * let implicit coercion take care of the float4_float4 case.
+ */
+Datum
+in_range_float4_float8(PG_FUNCTION_ARGS)
+{
+ float4 val = PG_GETARG_FLOAT4(0);
+ float4 base = PG_GETARG_FLOAT4(1);
+ float8 offset = PG_GETARG_FLOAT8(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ float8 sum;
+
+ /*
+ * Reject negative or NaN offset. Negative is per spec, and NaN is
+ * because appropriate semantics for that seem non-obvious.
+ */
+ if (isnan(offset) || offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /*
+ * Deal with cases where val and/or base is NaN, following the rule that
+ * NaN sorts after non-NaN (cf float8_cmp_internal). The offset cannot
+ * affect the conclusion.
+ */
+ if (isnan(val))
+ {
+ if (isnan(base))
+ PG_RETURN_BOOL(true); /* NAN = NAN */
+ else
+ PG_RETURN_BOOL(!less); /* NAN > non-NAN */
+ }
+ else if (isnan(base))
+ {
+ PG_RETURN_BOOL(less); /* non-NAN < NAN */
+ }
+
+ /*
+ * Deal with cases where both base and offset are infinite, and computing
+ * base +/- offset would produce NaN. This corresponds to a window frame
+ * whose boundary infinitely precedes +inf or infinitely follows -inf,
+ * which is not well-defined. For consistency with other cases involving
+ * infinities, such as the fact that +inf infinitely follows +inf, we
+ * choose to assume that +inf infinitely precedes +inf and -inf infinitely
+ * follows -inf, and therefore that all finite and infinite values are in
+ * such a window frame.
+ *
+ * offset is known positive, so we need only check the sign of base in
+ * this test.
+ */
+ if (isinf(offset) && isinf(base) &&
+ (sub ? base > 0 : base < 0))
+ PG_RETURN_BOOL(true);
+
+ /*
+ * Otherwise it should be safe to compute base +/- offset. We trust the
+ * FPU to cope if an input is +/-inf or the true sum would overflow, and
+ * produce a suitably signed infinity, which will compare properly against
+ * val whether or not that's infinity.
+ */
+ if (sub)
+ sum = base - offset;
+ else
+ sum = base + offset;
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+
+/*
+ * ===================
+ * CONVERSION ROUTINES
+ * ===================
+ */
+
+/*
+ * ftod - converts a float4 number to a float8 number
+ */
+Datum
+ftod(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+
+ PG_RETURN_FLOAT8((float8) num);
+}
+
+
+/*
+ * dtof - converts a float8 number to a float4 number
+ */
+Datum
+dtof(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+ float4 result;
+
+ result = (float4) num;
+ if (unlikely(isinf(result)) && !isinf(num))
+ float_overflow_error();
+ if (unlikely(result == 0.0f) && num != 0.0)
+ float_underflow_error();
+
+ PG_RETURN_FLOAT4(result);
+}
+
+
+/*
+ * dtoi4 - converts a float8 number to an int4 number
+ */
+Datum
+dtoi4(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT8_FITS_IN_INT32(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ PG_RETURN_INT32((int32) num);
+}
+
+
+/*
+ * dtoi2 - converts a float8 number to an int2 number
+ */
+Datum
+dtoi2(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT8_FITS_IN_INT16(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ PG_RETURN_INT16((int16) num);
+}
+
+
+/*
+ * i4tod - converts an int4 number to a float8 number
+ */
+Datum
+i4tod(PG_FUNCTION_ARGS)
+{
+ int32 num = PG_GETARG_INT32(0);
+
+ PG_RETURN_FLOAT8((float8) num);
+}
+
+
+/*
+ * i2tod - converts an int2 number to a float8 number
+ */
+Datum
+i2tod(PG_FUNCTION_ARGS)
+{
+ int16 num = PG_GETARG_INT16(0);
+
+ PG_RETURN_FLOAT8((float8) num);
+}
+
+
+/*
+ * ftoi4 - converts a float4 number to an int4 number
+ */
+Datum
+ftoi4(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT4_FITS_IN_INT32(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ PG_RETURN_INT32((int32) num);
+}
+
+
+/*
+ * ftoi2 - converts a float4 number to an int2 number
+ */
+Datum
+ftoi2(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT4_FITS_IN_INT16(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ PG_RETURN_INT16((int16) num);
+}
+
+
+/*
+ * i4tof - converts an int4 number to a float4 number
+ */
+Datum
+i4tof(PG_FUNCTION_ARGS)
+{
+ int32 num = PG_GETARG_INT32(0);
+
+ PG_RETURN_FLOAT4((float4) num);
+}
+
+
+/*
+ * i2tof - converts an int2 number to a float4 number
+ */
+Datum
+i2tof(PG_FUNCTION_ARGS)
+{
+ int16 num = PG_GETARG_INT16(0);
+
+ PG_RETURN_FLOAT4((float4) num);
+}
+
+
+/*
+ * =======================
+ * RANDOM FLOAT8 OPERATORS
+ * =======================
+ */
+
+/*
+ * dround - returns ROUND(arg1)
+ */
+Datum
+dround(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(rint(arg1));
+}
+
+/*
+ * dceil - returns the smallest integer greater than or
+ * equal to the specified float
+ */
+Datum
+dceil(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(ceil(arg1));
+}
+
+/*
+ * dfloor - returns the largest integer lesser than or
+ * equal to the specified float
+ */
+Datum
+dfloor(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(floor(arg1));
+}
+
+/*
+ * dsign - returns -1 if the argument is less than 0, 0
+ * if the argument is equal to 0, and 1 if the
+ * argument is greater than zero.
+ */
+Datum
+dsign(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ if (arg1 > 0)
+ result = 1.0;
+ else if (arg1 < 0)
+ result = -1.0;
+ else
+ result = 0.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * dtrunc - returns truncation-towards-zero of arg1,
+ * arg1 >= 0 ... the greatest integer less
+ * than or equal to arg1
+ * arg1 < 0 ... the least integer greater
+ * than or equal to arg1
+ */
+Datum
+dtrunc(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ if (arg1 >= 0)
+ result = floor(arg1);
+ else
+ result = -floor(-arg1);
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dsqrt - returns square root of arg1
+ */
+Datum
+dsqrt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ if (arg1 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("cannot take square root of a negative number")));
+
+ result = sqrt(arg1);
+ if (unlikely(isinf(result)) && !isinf(arg1))
+ float_overflow_error();
+ if (unlikely(result == 0.0) && arg1 != 0.0)
+ float_underflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dcbrt - returns cube root of arg1
+ */
+Datum
+dcbrt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ result = cbrt(arg1);
+ if (unlikely(isinf(result)) && !isinf(arg1))
+ float_overflow_error();
+ if (unlikely(result == 0.0) && arg1 != 0.0)
+ float_underflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dpow - returns pow(arg1,arg2)
+ */
+Datum
+dpow(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+ float8 result;
+
+ /*
+ * The POSIX spec says that NaN ^ 0 = 1, and 1 ^ NaN = 1, while all other
+ * cases with NaN inputs yield NaN (with no error). Many older platforms
+ * get one or more of these cases wrong, so deal with them via explicit
+ * logic rather than trusting pow(3).
+ */
+ if (isnan(arg1))
+ {
+ if (isnan(arg2) || arg2 != 0.0)
+ PG_RETURN_FLOAT8(get_float8_nan());
+ PG_RETURN_FLOAT8(1.0);
+ }
+ if (isnan(arg2))
+ {
+ if (arg1 != 1.0)
+ PG_RETURN_FLOAT8(get_float8_nan());
+ PG_RETURN_FLOAT8(1.0);
+ }
+
+ /*
+ * The SQL spec requires that we emit a particular SQLSTATE error code for
+ * certain error conditions. Specifically, we don't return a
+ * divide-by-zero error code for 0 ^ -1.
+ */
+ if (arg1 == 0 && arg2 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("zero raised to a negative power is undefined")));
+ if (arg1 < 0 && floor(arg2) != arg2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("a negative number raised to a non-integer power yields a complex result")));
+
+ /*
+ * We don't trust the platform's pow() to handle infinity cases per POSIX
+ * spec either, so deal with those explicitly too. It's easier to handle
+ * infinite y first, so that it doesn't matter if x is also infinite.
+ */
+ if (isinf(arg2))
+ {
+ float8 absx = fabs(arg1);
+
+ if (absx == 1.0)
+ result = 1.0;
+ else if (arg2 > 0.0) /* y = +Inf */
+ {
+ if (absx > 1.0)
+ result = arg2;
+ else
+ result = 0.0;
+ }
+ else /* y = -Inf */
+ {
+ if (absx > 1.0)
+ result = 0.0;
+ else
+ result = -arg2;
+ }
+ }
+ else if (isinf(arg1))
+ {
+ if (arg2 == 0.0)
+ result = 1.0;
+ else if (arg1 > 0.0) /* x = +Inf */
+ {
+ if (arg2 > 0.0)
+ result = arg1;
+ else
+ result = 0.0;
+ }
+ else /* x = -Inf */
+ {
+ /*
+ * Per POSIX, the sign of the result depends on whether y is an
+ * odd integer. Since x < 0, we already know from the previous
+ * domain check that y is an integer. It is odd if y/2 is not
+ * also an integer.
+ */
+ float8 halfy = arg2 / 2; /* should be computed exactly */
+ bool yisoddinteger = (floor(halfy) != halfy);
+
+ if (arg2 > 0.0)
+ result = yisoddinteger ? arg1 : -arg1;
+ else
+ result = yisoddinteger ? -0.0 : 0.0;
+ }
+ }
+ else
+ {
+ /*
+ * pow() sets errno on only some platforms, depending on whether it
+ * follows _IEEE_, _POSIX_, _XOPEN_, or _SVID_, so we must check both
+ * errno and invalid output values. (We can't rely on just the
+ * latter, either; some old platforms return a large-but-finite
+ * HUGE_VAL when reporting overflow.)
+ */
+ errno = 0;
+ result = pow(arg1, arg2);
+ if (errno == EDOM || isnan(result))
+ {
+ /*
+ * We handled all possible domain errors above, so this should be
+ * impossible. However, old glibc versions on x86 have a bug that
+ * causes them to fail this way for abs(y) greater than 2^63:
+ *
+ * https://sourceware.org/bugzilla/show_bug.cgi?id=3866
+ *
+ * Hence, if we get here, assume y is finite but large (large
+ * enough to be certainly even). The result should be 0 if x == 0,
+ * 1.0 if abs(x) == 1.0, otherwise an overflow or underflow error.
+ */
+ if (arg1 == 0.0)
+ result = 0.0; /* we already verified y is positive */
+ else
+ {
+ float8 absx = fabs(arg1);
+
+ if (absx == 1.0)
+ result = 1.0;
+ else if (arg2 >= 0.0 ? (absx > 1.0) : (absx < 1.0))
+ float_overflow_error();
+ else
+ float_underflow_error();
+ }
+ }
+ else if (errno == ERANGE)
+ {
+ if (result != 0.0)
+ float_overflow_error();
+ else
+ float_underflow_error();
+ }
+ else
+ {
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+ if (unlikely(result == 0.0) && arg1 != 0.0)
+ float_underflow_error();
+ }
+ }
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dexp - returns the exponential function of arg1
+ */
+Datum
+dexp(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * Handle NaN and Inf cases explicitly. This avoids needing to assume
+ * that the platform's exp() conforms to POSIX for these cases, and it
+ * removes some edge cases for the overflow checks below.
+ */
+ if (isnan(arg1))
+ result = arg1;
+ else if (isinf(arg1))
+ {
+ /* Per POSIX, exp(-Inf) is 0 */
+ result = (arg1 > 0.0) ? arg1 : 0;
+ }
+ else
+ {
+ /*
+ * On some platforms, exp() will not set errno but just return Inf or
+ * zero to report overflow/underflow; therefore, test both cases.
+ */
+ errno = 0;
+ result = exp(arg1);
+ if (unlikely(errno == ERANGE))
+ {
+ if (result != 0.0)
+ float_overflow_error();
+ else
+ float_underflow_error();
+ }
+ else if (unlikely(isinf(result)))
+ float_overflow_error();
+ else if (unlikely(result == 0.0))
+ float_underflow_error();
+ }
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dlog1 - returns the natural logarithm of arg1
+ */
+Datum
+dlog1(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * Emit particular SQLSTATE error codes for ln(). This is required by the
+ * SQL standard.
+ */
+ if (arg1 == 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of zero")));
+ if (arg1 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of a negative number")));
+
+ result = log(arg1);
+ if (unlikely(isinf(result)) && !isinf(arg1))
+ float_overflow_error();
+ if (unlikely(result == 0.0) && arg1 != 1.0)
+ float_underflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dlog10 - returns the base 10 logarithm of arg1
+ */
+Datum
+dlog10(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * Emit particular SQLSTATE error codes for log(). The SQL spec doesn't
+ * define log(), but it does define ln(), so it makes sense to emit the
+ * same error code for an analogous error condition.
+ */
+ if (arg1 == 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of zero")));
+ if (arg1 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of a negative number")));
+
+ result = log10(arg1);
+ if (unlikely(isinf(result)) && !isinf(arg1))
+ float_overflow_error();
+ if (unlikely(result == 0.0) && arg1 != 1.0)
+ float_underflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dacos - returns the arccos of arg1 (radians)
+ */
+Datum
+dacos(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /*
+ * The principal branch of the inverse cosine function maps values in the
+ * range [-1, 1] to values in the range [0, Pi], so we should reject any
+ * inputs outside that range and the result will always be finite.
+ */
+ if (arg1 < -1.0 || arg1 > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ result = acos(arg1);
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dasin - returns the arcsin of arg1 (radians)
+ */
+Datum
+dasin(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /*
+ * The principal branch of the inverse sine function maps values in the
+ * range [-1, 1] to values in the range [-Pi/2, Pi/2], so we should reject
+ * any inputs outside that range and the result will always be finite.
+ */
+ if (arg1 < -1.0 || arg1 > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ result = asin(arg1);
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * datan - returns the arctan of arg1 (radians)
+ */
+Datum
+datan(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /*
+ * The principal branch of the inverse tangent function maps all inputs to
+ * values in the range [-Pi/2, Pi/2], so the result should always be
+ * finite, even if the input is infinite.
+ */
+ result = atan(arg1);
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * atan2 - returns the arctan of arg1/arg2 (radians)
+ */
+Datum
+datan2(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if either input is NaN */
+ if (isnan(arg1) || isnan(arg2))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /*
+ * atan2 maps all inputs to values in the range [-Pi, Pi], so the result
+ * should always be finite, even if the inputs are infinite.
+ */
+ result = atan2(arg1, arg2);
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dcos - returns the cosine of arg1 (radians)
+ */
+Datum
+dcos(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /*
+ * cos() is periodic and so theoretically can work for all finite inputs,
+ * but some implementations may choose to throw error if the input is so
+ * large that there are no significant digits in the result. So we should
+ * check for errors. POSIX allows an error to be reported either via
+ * errno or via fetestexcept(), but currently we only support checking
+ * errno. (fetestexcept() is rumored to report underflow unreasonably
+ * early on some platforms, so it's not clear that believing it would be a
+ * net improvement anyway.)
+ *
+ * For infinite inputs, POSIX specifies that the trigonometric functions
+ * should return a domain error; but we won't notice that unless the
+ * platform reports via errno, so also explicitly test for infinite
+ * inputs.
+ */
+ errno = 0;
+ result = cos(arg1);
+ if (errno != 0 || isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dcot - returns the cotangent of arg1 (radians)
+ */
+Datum
+dcot(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /* Be sure to throw an error if the input is infinite --- see dcos() */
+ errno = 0;
+ result = tan(arg1);
+ if (errno != 0 || isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ result = 1.0 / result;
+ /* Not checking for overflow because cot(0) == Inf */
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dsin - returns the sine of arg1 (radians)
+ */
+Datum
+dsin(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /* Be sure to throw an error if the input is infinite --- see dcos() */
+ errno = 0;
+ result = sin(arg1);
+ if (errno != 0 || isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dtan - returns the tangent of arg1 (radians)
+ */
+Datum
+dtan(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ /* Be sure to throw an error if the input is infinite --- see dcos() */
+ errno = 0;
+ result = tan(arg1);
+ if (errno != 0 || isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+ /* Not checking for overflow because tan(pi/2) == Inf */
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/* ========== DEGREE-BASED TRIGONOMETRIC FUNCTIONS ========== */
+
+
+/*
+ * Initialize the cached constants declared at the head of this file
+ * (sin_30 etc). The fact that we need those at all, let alone need this
+ * Rube-Goldberg-worthy method of initializing them, is because there are
+ * compilers out there that will precompute expressions such as sin(constant)
+ * using a sin() function different from what will be used at runtime. If we
+ * want exact results, we must ensure that none of the scaling constants used
+ * in the degree-based trig functions are computed that way. To do so, we
+ * compute them from the variables degree_c_thirty etc, which are also really
+ * constants, but the compiler cannot assume that.
+ *
+ * Other hazards we are trying to forestall with this kluge include the
+ * possibility that compilers will rearrange the expressions, or compute
+ * some intermediate results in registers wider than a standard double.
+ *
+ * In the places where we use these constants, the typical pattern is like
+ * volatile float8 sin_x = sin(x * RADIANS_PER_DEGREE);
+ * return (sin_x / sin_30);
+ * where we hope to get a value of exactly 1.0 from the division when x = 30.
+ * The volatile temporary variable is needed on machines with wide float
+ * registers, to ensure that the result of sin(x) is rounded to double width
+ * the same as the value of sin_30 has been. Experimentation with gcc shows
+ * that marking the temp variable volatile is necessary to make the store and
+ * reload actually happen; hopefully the same trick works for other compilers.
+ * (gcc's documentation suggests using the -ffloat-store compiler switch to
+ * ensure this, but that is compiler-specific and it also pessimizes code in
+ * many places where we don't care about this.)
+ */
+static void
+init_degree_constants(void)
+{
+ sin_30 = sin(degree_c_thirty * RADIANS_PER_DEGREE);
+ one_minus_cos_60 = 1.0 - cos(degree_c_sixty * RADIANS_PER_DEGREE);
+ asin_0_5 = asin(degree_c_one_half);
+ acos_0_5 = acos(degree_c_one_half);
+ atan_1_0 = atan(degree_c_one);
+ tan_45 = sind_q1(degree_c_forty_five) / cosd_q1(degree_c_forty_five);
+ cot_45 = cosd_q1(degree_c_forty_five) / sind_q1(degree_c_forty_five);
+ degree_consts_set = true;
+}
+
+#define INIT_DEGREE_CONSTANTS() \
+do { \
+ if (!degree_consts_set) \
+ init_degree_constants(); \
+} while(0)
+
+
+/*
+ * asind_q1 - returns the inverse sine of x in degrees, for x in
+ * the range [0, 1]. The result is an angle in the
+ * first quadrant --- [0, 90] degrees.
+ *
+ * For the 3 special case inputs (0, 0.5 and 1), this
+ * function will return exact values (0, 30 and 90
+ * degrees respectively).
+ */
+static double
+asind_q1(double x)
+{
+ /*
+ * Stitch together inverse sine and cosine functions for the ranges [0,
+ * 0.5] and (0.5, 1]. Each expression below is guaranteed to return
+ * exactly 30 for x=0.5, so the result is a continuous monotonic function
+ * over the full range.
+ */
+ if (x <= 0.5)
+ {
+ volatile float8 asin_x = asin(x);
+
+ return (asin_x / asin_0_5) * 30.0;
+ }
+ else
+ {
+ volatile float8 acos_x = acos(x);
+
+ return 90.0 - (acos_x / acos_0_5) * 60.0;
+ }
+}
+
+
+/*
+ * acosd_q1 - returns the inverse cosine of x in degrees, for x in
+ * the range [0, 1]. The result is an angle in the
+ * first quadrant --- [0, 90] degrees.
+ *
+ * For the 3 special case inputs (0, 0.5 and 1), this
+ * function will return exact values (0, 60 and 90
+ * degrees respectively).
+ */
+static double
+acosd_q1(double x)
+{
+ /*
+ * Stitch together inverse sine and cosine functions for the ranges [0,
+ * 0.5] and (0.5, 1]. Each expression below is guaranteed to return
+ * exactly 60 for x=0.5, so the result is a continuous monotonic function
+ * over the full range.
+ */
+ if (x <= 0.5)
+ {
+ volatile float8 asin_x = asin(x);
+
+ return 90.0 - (asin_x / asin_0_5) * 30.0;
+ }
+ else
+ {
+ volatile float8 acos_x = acos(x);
+
+ return (acos_x / acos_0_5) * 60.0;
+ }
+}
+
+
+/*
+ * dacosd - returns the arccos of arg1 (degrees)
+ */
+Datum
+dacosd(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ INIT_DEGREE_CONSTANTS();
+
+ /*
+ * The principal branch of the inverse cosine function maps values in the
+ * range [-1, 1] to values in the range [0, 180], so we should reject any
+ * inputs outside that range and the result will always be finite.
+ */
+ if (arg1 < -1.0 || arg1 > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ if (arg1 >= 0.0)
+ result = acosd_q1(arg1);
+ else
+ result = 90.0 + asind_q1(-arg1);
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dasind - returns the arcsin of arg1 (degrees)
+ */
+Datum
+dasind(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ INIT_DEGREE_CONSTANTS();
+
+ /*
+ * The principal branch of the inverse sine function maps values in the
+ * range [-1, 1] to values in the range [-90, 90], so we should reject any
+ * inputs outside that range and the result will always be finite.
+ */
+ if (arg1 < -1.0 || arg1 > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ if (arg1 >= 0.0)
+ result = asind_q1(arg1);
+ else
+ result = -asind_q1(-arg1);
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * datand - returns the arctan of arg1 (degrees)
+ */
+Datum
+datand(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+ volatile float8 atan_arg1;
+
+ /* Per the POSIX spec, return NaN if the input is NaN */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ INIT_DEGREE_CONSTANTS();
+
+ /*
+ * The principal branch of the inverse tangent function maps all inputs to
+ * values in the range [-90, 90], so the result should always be finite,
+ * even if the input is infinite. Additionally, we take care to ensure
+ * than when arg1 is 1, the result is exactly 45.
+ */
+ atan_arg1 = atan(arg1);
+ result = (atan_arg1 / atan_1_0) * 45.0;
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * atan2d - returns the arctan of arg1/arg2 (degrees)
+ */
+Datum
+datan2d(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+ float8 result;
+ volatile float8 atan2_arg1_arg2;
+
+ /* Per the POSIX spec, return NaN if either input is NaN */
+ if (isnan(arg1) || isnan(arg2))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ INIT_DEGREE_CONSTANTS();
+
+ /*
+ * atan2d maps all inputs to values in the range [-180, 180], so the
+ * result should always be finite, even if the inputs are infinite.
+ *
+ * Note: this coding assumes that atan(1.0) is a suitable scaling constant
+ * to get an exact result from atan2(). This might well fail on us at
+ * some point, requiring us to decide exactly what inputs we think we're
+ * going to guarantee an exact result for.
+ */
+ atan2_arg1_arg2 = atan2(arg1, arg2);
+ result = (atan2_arg1_arg2 / atan_1_0) * 45.0;
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * sind_0_to_30 - returns the sine of an angle that lies between 0 and
+ * 30 degrees. This will return exactly 0 when x is 0,
+ * and exactly 0.5 when x is 30 degrees.
+ */
+static double
+sind_0_to_30(double x)
+{
+ volatile float8 sin_x = sin(x * RADIANS_PER_DEGREE);
+
+ return (sin_x / sin_30) / 2.0;
+}
+
+
+/*
+ * cosd_0_to_60 - returns the cosine of an angle that lies between 0
+ * and 60 degrees. This will return exactly 1 when x
+ * is 0, and exactly 0.5 when x is 60 degrees.
+ */
+static double
+cosd_0_to_60(double x)
+{
+ volatile float8 one_minus_cos_x = 1.0 - cos(x * RADIANS_PER_DEGREE);
+
+ return 1.0 - (one_minus_cos_x / one_minus_cos_60) / 2.0;
+}
+
+
+/*
+ * sind_q1 - returns the sine of an angle in the first quadrant
+ * (0 to 90 degrees).
+ */
+static double
+sind_q1(double x)
+{
+ /*
+ * Stitch together the sine and cosine functions for the ranges [0, 30]
+ * and (30, 90]. These guarantee to return exact answers at their
+ * endpoints, so the overall result is a continuous monotonic function
+ * that gives exact results when x = 0, 30 and 90 degrees.
+ */
+ if (x <= 30.0)
+ return sind_0_to_30(x);
+ else
+ return cosd_0_to_60(90.0 - x);
+}
+
+
+/*
+ * cosd_q1 - returns the cosine of an angle in the first quadrant
+ * (0 to 90 degrees).
+ */
+static double
+cosd_q1(double x)
+{
+ /*
+ * Stitch together the sine and cosine functions for the ranges [0, 60]
+ * and (60, 90]. These guarantee to return exact answers at their
+ * endpoints, so the overall result is a continuous monotonic function
+ * that gives exact results when x = 0, 60 and 90 degrees.
+ */
+ if (x <= 60.0)
+ return cosd_0_to_60(x);
+ else
+ return sind_0_to_30(90.0 - x);
+}
+
+
+/*
+ * dcosd - returns the cosine of arg1 (degrees)
+ */
+Datum
+dcosd(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+ int sign = 1;
+
+ /*
+ * Per the POSIX spec, return NaN if the input is NaN and throw an error
+ * if the input is infinite.
+ */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ if (isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ INIT_DEGREE_CONSTANTS();
+
+ /* Reduce the range of the input to [0,90] degrees */
+ arg1 = fmod(arg1, 360.0);
+
+ if (arg1 < 0.0)
+ {
+ /* cosd(-x) = cosd(x) */
+ arg1 = -arg1;
+ }
+
+ if (arg1 > 180.0)
+ {
+ /* cosd(360-x) = cosd(x) */
+ arg1 = 360.0 - arg1;
+ }
+
+ if (arg1 > 90.0)
+ {
+ /* cosd(180-x) = -cosd(x) */
+ arg1 = 180.0 - arg1;
+ sign = -sign;
+ }
+
+ result = sign * cosd_q1(arg1);
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dcotd - returns the cotangent of arg1 (degrees)
+ */
+Datum
+dcotd(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+ volatile float8 cot_arg1;
+ int sign = 1;
+
+ /*
+ * Per the POSIX spec, return NaN if the input is NaN and throw an error
+ * if the input is infinite.
+ */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ if (isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ INIT_DEGREE_CONSTANTS();
+
+ /* Reduce the range of the input to [0,90] degrees */
+ arg1 = fmod(arg1, 360.0);
+
+ if (arg1 < 0.0)
+ {
+ /* cotd(-x) = -cotd(x) */
+ arg1 = -arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 180.0)
+ {
+ /* cotd(360-x) = -cotd(x) */
+ arg1 = 360.0 - arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 90.0)
+ {
+ /* cotd(180-x) = -cotd(x) */
+ arg1 = 180.0 - arg1;
+ sign = -sign;
+ }
+
+ cot_arg1 = cosd_q1(arg1) / sind_q1(arg1);
+ result = sign * (cot_arg1 / cot_45);
+
+ /*
+ * On some machines we get cotd(270) = minus zero, but this isn't always
+ * true. For portability, and because the user constituency for this
+ * function probably doesn't want minus zero, force it to plain zero.
+ */
+ if (result == 0.0)
+ result = 0.0;
+
+ /* Not checking for overflow because cotd(0) == Inf */
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dsind - returns the sine of arg1 (degrees)
+ */
+Datum
+dsind(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+ int sign = 1;
+
+ /*
+ * Per the POSIX spec, return NaN if the input is NaN and throw an error
+ * if the input is infinite.
+ */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ if (isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ INIT_DEGREE_CONSTANTS();
+
+ /* Reduce the range of the input to [0,90] degrees */
+ arg1 = fmod(arg1, 360.0);
+
+ if (arg1 < 0.0)
+ {
+ /* sind(-x) = -sind(x) */
+ arg1 = -arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 180.0)
+ {
+ /* sind(360-x) = -sind(x) */
+ arg1 = 360.0 - arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 90.0)
+ {
+ /* sind(180-x) = sind(x) */
+ arg1 = 180.0 - arg1;
+ }
+
+ result = sign * sind_q1(arg1);
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dtand - returns the tangent of arg1 (degrees)
+ */
+Datum
+dtand(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+ volatile float8 tan_arg1;
+ int sign = 1;
+
+ /*
+ * Per the POSIX spec, return NaN if the input is NaN and throw an error
+ * if the input is infinite.
+ */
+ if (isnan(arg1))
+ PG_RETURN_FLOAT8(get_float8_nan());
+
+ if (isinf(arg1))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ INIT_DEGREE_CONSTANTS();
+
+ /* Reduce the range of the input to [0,90] degrees */
+ arg1 = fmod(arg1, 360.0);
+
+ if (arg1 < 0.0)
+ {
+ /* tand(-x) = -tand(x) */
+ arg1 = -arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 180.0)
+ {
+ /* tand(360-x) = -tand(x) */
+ arg1 = 360.0 - arg1;
+ sign = -sign;
+ }
+
+ if (arg1 > 90.0)
+ {
+ /* tand(180-x) = -tand(x) */
+ arg1 = 180.0 - arg1;
+ sign = -sign;
+ }
+
+ tan_arg1 = sind_q1(arg1) / cosd_q1(arg1);
+ result = sign * (tan_arg1 / tan_45);
+
+ /*
+ * On some machines we get tand(180) = minus zero, but this isn't always
+ * true. For portability, and because the user constituency for this
+ * function probably doesn't want minus zero, force it to plain zero.
+ */
+ if (result == 0.0)
+ result = 0.0;
+
+ /* Not checking for overflow because tand(90) == Inf */
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * degrees - returns degrees converted from radians
+ */
+Datum
+degrees(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(float8_div(arg1, RADIANS_PER_DEGREE));
+}
+
+
+/*
+ * dpi - returns the constant PI
+ */
+Datum
+dpi(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(M_PI);
+}
+
+
+/*
+ * radians - returns radians converted from degrees
+ */
+Datum
+radians(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+
+ PG_RETURN_FLOAT8(float8_mul(arg1, RADIANS_PER_DEGREE));
+}
+
+
+/* ========== HYPERBOLIC FUNCTIONS ========== */
+
+
+/*
+ * dsinh - returns the hyperbolic sine of arg1
+ */
+Datum
+dsinh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ errno = 0;
+ result = sinh(arg1);
+
+ /*
+ * if an ERANGE error occurs, it means there is an overflow. For sinh,
+ * the result should be either -infinity or infinity, depending on the
+ * sign of arg1.
+ */
+ if (errno == ERANGE)
+ {
+ if (arg1 < 0)
+ result = -get_float8_infinity();
+ else
+ result = get_float8_infinity();
+ }
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * dcosh - returns the hyperbolic cosine of arg1
+ */
+Datum
+dcosh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ errno = 0;
+ result = cosh(arg1);
+
+ /*
+ * if an ERANGE error occurs, it means there is an overflow. As cosh is
+ * always positive, it always means the result is positive infinity.
+ */
+ if (errno == ERANGE)
+ result = get_float8_infinity();
+
+ if (unlikely(result == 0.0))
+ float_underflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * dtanh - returns the hyperbolic tangent of arg1
+ */
+Datum
+dtanh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * For tanh, we don't need an errno check because it never overflows.
+ */
+ result = tanh(arg1);
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * dasinh - returns the inverse hyperbolic sine of arg1
+ */
+Datum
+dasinh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * For asinh, we don't need an errno check because it never overflows.
+ */
+ result = asinh(arg1);
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * dacosh - returns the inverse hyperbolic cosine of arg1
+ */
+Datum
+dacosh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * acosh is only defined for inputs >= 1.0. By checking this ourselves,
+ * we need not worry about checking for an EDOM error, which is a good
+ * thing because some implementations will report that for NaN. Otherwise,
+ * no error is possible.
+ */
+ if (arg1 < 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ result = acosh(arg1);
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * datanh - returns the inverse hyperbolic tangent of arg1
+ */
+Datum
+datanh(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float8 result;
+
+ /*
+ * atanh is only defined for inputs between -1 and 1. By checking this
+ * ourselves, we need not worry about checking for an EDOM error, which is
+ * a good thing because some implementations will report that for NaN.
+ */
+ if (arg1 < -1.0 || arg1 > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("input is out of range")));
+
+ /*
+ * Also handle the infinity cases ourselves; this is helpful because old
+ * glibc versions may produce the wrong errno for this. All other inputs
+ * cannot produce an error.
+ */
+ if (arg1 == -1.0)
+ result = -get_float8_infinity();
+ else if (arg1 == 1.0)
+ result = get_float8_infinity();
+ else
+ result = atanh(arg1);
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * drandom - returns a random number
+ */
+Datum
+drandom(PG_FUNCTION_ARGS)
+{
+ float8 result;
+
+ /* Initialize random seed, if not done yet in this process */
+ if (unlikely(!drandom_seed_set))
+ {
+ /*
+ * If possible, initialize the seed using high-quality random bits.
+ * Should that fail for some reason, we fall back on a lower-quality
+ * seed based on current time and PID.
+ */
+ if (unlikely(!pg_prng_strong_seed(&drandom_seed)))
+ {
+ TimestampTz now = GetCurrentTimestamp();
+ uint64 iseed;
+
+ /* Mix the PID with the most predictable bits of the timestamp */
+ iseed = (uint64) now ^ ((uint64) MyProcPid << 32);
+ pg_prng_seed(&drandom_seed, iseed);
+ }
+ drandom_seed_set = true;
+ }
+
+ /* pg_prng_double produces desired result range [0.0 - 1.0) */
+ result = pg_prng_double(&drandom_seed);
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+/*
+ * setseed - set seed for the random number generator
+ */
+Datum
+setseed(PG_FUNCTION_ARGS)
+{
+ float8 seed = PG_GETARG_FLOAT8(0);
+
+ if (seed < -1 || seed > 1 || isnan(seed))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("setseed parameter %g is out of allowed range [-1,1]",
+ seed)));
+
+ pg_prng_fseed(&drandom_seed, seed);
+ drandom_seed_set = true;
+
+ PG_RETURN_VOID();
+}
+
+
+
+/*
+ * =========================
+ * FLOAT AGGREGATE OPERATORS
+ * =========================
+ *
+ * float8_accum - accumulate for AVG(), variance aggregates, etc.
+ * float4_accum - same, but input data is float4
+ * float8_avg - produce final result for float AVG()
+ * float8_var_samp - produce final result for float VAR_SAMP()
+ * float8_var_pop - produce final result for float VAR_POP()
+ * float8_stddev_samp - produce final result for float STDDEV_SAMP()
+ * float8_stddev_pop - produce final result for float STDDEV_POP()
+ *
+ * The naive schoolbook implementation of these aggregates works by
+ * accumulating sum(X) and sum(X^2). However, this approach suffers from
+ * large rounding errors in the final computation of quantities like the
+ * population variance (N*sum(X^2) - sum(X)^2) / N^2, since each of the
+ * intermediate terms is potentially very large, while the difference is often
+ * quite small.
+ *
+ * Instead we use the Youngs-Cramer algorithm [1] which works by accumulating
+ * Sx=sum(X) and Sxx=sum((X-Sx/N)^2), using a numerically stable algorithm to
+ * incrementally update those quantities. The final computations of each of
+ * the aggregate values is then trivial and gives more accurate results (for
+ * example, the population variance is just Sxx/N). This algorithm is also
+ * fairly easy to generalize to allow parallel execution without loss of
+ * precision (see, for example, [2]). For more details, and a comparison of
+ * this with other algorithms, see [3].
+ *
+ * The transition datatype for all these aggregates is a 3-element array
+ * of float8, holding the values N, Sx, Sxx in that order.
+ *
+ * Note that we represent N as a float to avoid having to build a special
+ * datatype. Given a reasonable floating-point implementation, there should
+ * be no accuracy loss unless N exceeds 2 ^ 52 or so (by which time the
+ * user will have doubtless lost interest anyway...)
+ *
+ * [1] Some Results Relevant to Choice of Sum and Sum-of-Product Algorithms,
+ * E. A. Youngs and E. M. Cramer, Technometrics Vol 13, No 3, August 1971.
+ *
+ * [2] Updating Formulae and a Pairwise Algorithm for Computing Sample
+ * Variances, T. F. Chan, G. H. Golub & R. J. LeVeque, COMPSTAT 1982.
+ *
+ * [3] Numerically Stable Parallel Computation of (Co-)Variance, Erich
+ * Schubert and Michael Gertz, Proceedings of the 30th International
+ * Conference on Scientific and Statistical Database Management, 2018.
+ */
+
+static float8 *
+check_float8_array(ArrayType *transarray, const char *caller, int n)
+{
+ /*
+ * We expect the input to be an N-element float array; verify that. We
+ * don't need to use deconstruct_array() since the array data is just
+ * going to look like a C array of N float8 values.
+ */
+ if (ARR_NDIM(transarray) != 1 ||
+ ARR_DIMS(transarray)[0] != n ||
+ ARR_HASNULL(transarray) ||
+ ARR_ELEMTYPE(transarray) != FLOAT8OID)
+ elog(ERROR, "%s: expected %d-element float8 array", caller, n);
+ return (float8 *) ARR_DATA_PTR(transarray);
+}
+
+/*
+ * float8_combine
+ *
+ * An aggregate combine function used to combine two 3 fields
+ * aggregate transition data into a single transition data.
+ * This function is used only in two stage aggregation and
+ * shouldn't be called outside aggregate context.
+ */
+Datum
+float8_combine(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1);
+ float8 *transvalues1;
+ float8 *transvalues2;
+ float8 N1,
+ Sx1,
+ Sxx1,
+ N2,
+ Sx2,
+ Sxx2,
+ tmp,
+ N,
+ Sx,
+ Sxx;
+
+ transvalues1 = check_float8_array(transarray1, "float8_combine", 3);
+ transvalues2 = check_float8_array(transarray2, "float8_combine", 3);
+
+ N1 = transvalues1[0];
+ Sx1 = transvalues1[1];
+ Sxx1 = transvalues1[2];
+
+ N2 = transvalues2[0];
+ Sx2 = transvalues2[1];
+ Sxx2 = transvalues2[2];
+
+ /*--------------------
+ * The transition values combine using a generalization of the
+ * Youngs-Cramer algorithm as follows:
+ *
+ * N = N1 + N2
+ * Sx = Sx1 + Sx2
+ * Sxx = Sxx1 + Sxx2 + N1 * N2 * (Sx1/N1 - Sx2/N2)^2 / N;
+ *
+ * It's worth handling the special cases N1 = 0 and N2 = 0 separately
+ * since those cases are trivial, and we then don't need to worry about
+ * division-by-zero errors in the general case.
+ *--------------------
+ */
+ if (N1 == 0.0)
+ {
+ N = N2;
+ Sx = Sx2;
+ Sxx = Sxx2;
+ }
+ else if (N2 == 0.0)
+ {
+ N = N1;
+ Sx = Sx1;
+ Sxx = Sxx1;
+ }
+ else
+ {
+ N = N1 + N2;
+ Sx = float8_pl(Sx1, Sx2);
+ tmp = Sx1 / N1 - Sx2 / N2;
+ Sxx = Sxx1 + Sxx2 + N1 * N2 * tmp * tmp / N;
+ if (unlikely(isinf(Sxx)) && !isinf(Sxx1) && !isinf(Sxx2))
+ float_overflow_error();
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we construct a
+ * new array with the updated transition data and return it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ transvalues1[0] = N;
+ transvalues1[1] = Sx;
+ transvalues1[2] = Sxx;
+
+ PG_RETURN_ARRAYTYPE_P(transarray1);
+ }
+ else
+ {
+ Datum transdatums[3];
+ ArrayType *result;
+
+ transdatums[0] = Float8GetDatumFast(N);
+ transdatums[1] = Float8GetDatumFast(Sx);
+ transdatums[2] = Float8GetDatumFast(Sxx);
+
+ result = construct_array(transdatums, 3,
+ FLOAT8OID,
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+}
+
+Datum
+float8_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 newval = PG_GETARG_FLOAT8(1);
+ float8 *transvalues;
+ float8 N,
+ Sx,
+ Sxx,
+ tmp;
+
+ transvalues = check_float8_array(transarray, "float8_accum", 3);
+ N = transvalues[0];
+ Sx = transvalues[1];
+ Sxx = transvalues[2];
+
+ /*
+ * Use the Youngs-Cramer algorithm to incorporate the new value into the
+ * transition values.
+ */
+ N += 1.0;
+ Sx += newval;
+ if (transvalues[0] > 0.0)
+ {
+ tmp = newval * N - Sx;
+ Sxx += tmp * tmp / (N * transvalues[0]);
+
+ /*
+ * Overflow check. We only report an overflow error when finite
+ * inputs lead to infinite results. Note also that Sxx should be NaN
+ * if any of the inputs are infinite, so we intentionally prevent Sxx
+ * from becoming infinite.
+ */
+ if (isinf(Sx) || isinf(Sxx))
+ {
+ if (!isinf(transvalues[1]) && !isinf(newval))
+ float_overflow_error();
+
+ Sxx = get_float8_nan();
+ }
+ }
+ else
+ {
+ /*
+ * At the first input, we normally can leave Sxx as 0. However, if
+ * the first input is Inf or NaN, we'd better force Sxx to NaN;
+ * otherwise we will falsely report variance zero when there are no
+ * more inputs.
+ */
+ if (isnan(newval) || isinf(newval))
+ Sxx = get_float8_nan();
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we construct a
+ * new array with the updated transition data and return it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ transvalues[0] = N;
+ transvalues[1] = Sx;
+ transvalues[2] = Sxx;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+ }
+ else
+ {
+ Datum transdatums[3];
+ ArrayType *result;
+
+ transdatums[0] = Float8GetDatumFast(N);
+ transdatums[1] = Float8GetDatumFast(Sx);
+ transdatums[2] = Float8GetDatumFast(Sxx);
+
+ result = construct_array(transdatums, 3,
+ FLOAT8OID,
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+}
+
+Datum
+float4_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+
+ /* do computations as float8 */
+ float8 newval = PG_GETARG_FLOAT4(1);
+ float8 *transvalues;
+ float8 N,
+ Sx,
+ Sxx,
+ tmp;
+
+ transvalues = check_float8_array(transarray, "float4_accum", 3);
+ N = transvalues[0];
+ Sx = transvalues[1];
+ Sxx = transvalues[2];
+
+ /*
+ * Use the Youngs-Cramer algorithm to incorporate the new value into the
+ * transition values.
+ */
+ N += 1.0;
+ Sx += newval;
+ if (transvalues[0] > 0.0)
+ {
+ tmp = newval * N - Sx;
+ Sxx += tmp * tmp / (N * transvalues[0]);
+
+ /*
+ * Overflow check. We only report an overflow error when finite
+ * inputs lead to infinite results. Note also that Sxx should be NaN
+ * if any of the inputs are infinite, so we intentionally prevent Sxx
+ * from becoming infinite.
+ */
+ if (isinf(Sx) || isinf(Sxx))
+ {
+ if (!isinf(transvalues[1]) && !isinf(newval))
+ float_overflow_error();
+
+ Sxx = get_float8_nan();
+ }
+ }
+ else
+ {
+ /*
+ * At the first input, we normally can leave Sxx as 0. However, if
+ * the first input is Inf or NaN, we'd better force Sxx to NaN;
+ * otherwise we will falsely report variance zero when there are no
+ * more inputs.
+ */
+ if (isnan(newval) || isinf(newval))
+ Sxx = get_float8_nan();
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we construct a
+ * new array with the updated transition data and return it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ transvalues[0] = N;
+ transvalues[1] = Sx;
+ transvalues[2] = Sxx;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+ }
+ else
+ {
+ Datum transdatums[3];
+ ArrayType *result;
+
+ transdatums[0] = Float8GetDatumFast(N);
+ transdatums[1] = Float8GetDatumFast(Sx);
+ transdatums[2] = Float8GetDatumFast(Sxx);
+
+ result = construct_array(transdatums, 3,
+ FLOAT8OID,
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+}
+
+Datum
+float8_avg(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sx;
+
+ transvalues = check_float8_array(transarray, "float8_avg", 3);
+ N = transvalues[0];
+ Sx = transvalues[1];
+ /* ignore Sxx */
+
+ /* SQL defines AVG of no values to be NULL */
+ if (N == 0.0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sx / N);
+}
+
+Datum
+float8_var_pop(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx;
+
+ transvalues = check_float8_array(transarray, "float8_var_pop", 3);
+ N = transvalues[0];
+ /* ignore Sx */
+ Sxx = transvalues[2];
+
+ /* Population variance is undefined when N is 0, so return NULL */
+ if (N == 0.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(Sxx / N);
+}
+
+Datum
+float8_var_samp(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx;
+
+ transvalues = check_float8_array(transarray, "float8_var_samp", 3);
+ N = transvalues[0];
+ /* ignore Sx */
+ Sxx = transvalues[2];
+
+ /* Sample variance is undefined when N is 0 or 1, so return NULL */
+ if (N <= 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(Sxx / (N - 1.0));
+}
+
+Datum
+float8_stddev_pop(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx;
+
+ transvalues = check_float8_array(transarray, "float8_stddev_pop", 3);
+ N = transvalues[0];
+ /* ignore Sx */
+ Sxx = transvalues[2];
+
+ /* Population stddev is undefined when N is 0, so return NULL */
+ if (N == 0.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(sqrt(Sxx / N));
+}
+
+Datum
+float8_stddev_samp(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx;
+
+ transvalues = check_float8_array(transarray, "float8_stddev_samp", 3);
+ N = transvalues[0];
+ /* ignore Sx */
+ Sxx = transvalues[2];
+
+ /* Sample stddev is undefined when N is 0 or 1, so return NULL */
+ if (N <= 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(sqrt(Sxx / (N - 1.0)));
+}
+
+/*
+ * =========================
+ * SQL2003 BINARY AGGREGATES
+ * =========================
+ *
+ * As with the preceding aggregates, we use the Youngs-Cramer algorithm to
+ * reduce rounding errors in the aggregate final functions.
+ *
+ * The transition datatype for all these aggregates is a 6-element array of
+ * float8, holding the values N, Sx=sum(X), Sxx=sum((X-Sx/N)^2), Sy=sum(Y),
+ * Syy=sum((Y-Sy/N)^2), Sxy=sum((X-Sx/N)*(Y-Sy/N)) in that order.
+ *
+ * Note that Y is the first argument to all these aggregates!
+ *
+ * It might seem attractive to optimize this by having multiple accumulator
+ * functions that only calculate the sums actually needed. But on most
+ * modern machines, a couple of extra floating-point multiplies will be
+ * insignificant compared to the other per-tuple overhead, so I've chosen
+ * to minimize code space instead.
+ */
+
+Datum
+float8_regr_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 newvalY = PG_GETARG_FLOAT8(1);
+ float8 newvalX = PG_GETARG_FLOAT8(2);
+ float8 *transvalues;
+ float8 N,
+ Sx,
+ Sxx,
+ Sy,
+ Syy,
+ Sxy,
+ tmpX,
+ tmpY,
+ scale;
+
+ transvalues = check_float8_array(transarray, "float8_regr_accum", 6);
+ N = transvalues[0];
+ Sx = transvalues[1];
+ Sxx = transvalues[2];
+ Sy = transvalues[3];
+ Syy = transvalues[4];
+ Sxy = transvalues[5];
+
+ /*
+ * Use the Youngs-Cramer algorithm to incorporate the new values into the
+ * transition values.
+ */
+ N += 1.0;
+ Sx += newvalX;
+ Sy += newvalY;
+ if (transvalues[0] > 0.0)
+ {
+ tmpX = newvalX * N - Sx;
+ tmpY = newvalY * N - Sy;
+ scale = 1.0 / (N * transvalues[0]);
+ Sxx += tmpX * tmpX * scale;
+ Syy += tmpY * tmpY * scale;
+ Sxy += tmpX * tmpY * scale;
+
+ /*
+ * Overflow check. We only report an overflow error when finite
+ * inputs lead to infinite results. Note also that Sxx, Syy and Sxy
+ * should be NaN if any of the relevant inputs are infinite, so we
+ * intentionally prevent them from becoming infinite.
+ */
+ if (isinf(Sx) || isinf(Sxx) || isinf(Sy) || isinf(Syy) || isinf(Sxy))
+ {
+ if (((isinf(Sx) || isinf(Sxx)) &&
+ !isinf(transvalues[1]) && !isinf(newvalX)) ||
+ ((isinf(Sy) || isinf(Syy)) &&
+ !isinf(transvalues[3]) && !isinf(newvalY)) ||
+ (isinf(Sxy) &&
+ !isinf(transvalues[1]) && !isinf(newvalX) &&
+ !isinf(transvalues[3]) && !isinf(newvalY)))
+ float_overflow_error();
+
+ if (isinf(Sxx))
+ Sxx = get_float8_nan();
+ if (isinf(Syy))
+ Syy = get_float8_nan();
+ if (isinf(Sxy))
+ Sxy = get_float8_nan();
+ }
+ }
+ else
+ {
+ /*
+ * At the first input, we normally can leave Sxx et al as 0. However,
+ * if the first input is Inf or NaN, we'd better force the dependent
+ * sums to NaN; otherwise we will falsely report variance zero when
+ * there are no more inputs.
+ */
+ if (isnan(newvalX) || isinf(newvalX))
+ Sxx = Sxy = get_float8_nan();
+ if (isnan(newvalY) || isinf(newvalY))
+ Syy = Sxy = get_float8_nan();
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we construct a
+ * new array with the updated transition data and return it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ transvalues[0] = N;
+ transvalues[1] = Sx;
+ transvalues[2] = Sxx;
+ transvalues[3] = Sy;
+ transvalues[4] = Syy;
+ transvalues[5] = Sxy;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+ }
+ else
+ {
+ Datum transdatums[6];
+ ArrayType *result;
+
+ transdatums[0] = Float8GetDatumFast(N);
+ transdatums[1] = Float8GetDatumFast(Sx);
+ transdatums[2] = Float8GetDatumFast(Sxx);
+ transdatums[3] = Float8GetDatumFast(Sy);
+ transdatums[4] = Float8GetDatumFast(Syy);
+ transdatums[5] = Float8GetDatumFast(Sxy);
+
+ result = construct_array(transdatums, 6,
+ FLOAT8OID,
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+}
+
+/*
+ * float8_regr_combine
+ *
+ * An aggregate combine function used to combine two 6 fields
+ * aggregate transition data into a single transition data.
+ * This function is used only in two stage aggregation and
+ * shouldn't be called outside aggregate context.
+ */
+Datum
+float8_regr_combine(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1);
+ float8 *transvalues1;
+ float8 *transvalues2;
+ float8 N1,
+ Sx1,
+ Sxx1,
+ Sy1,
+ Syy1,
+ Sxy1,
+ N2,
+ Sx2,
+ Sxx2,
+ Sy2,
+ Syy2,
+ Sxy2,
+ tmp1,
+ tmp2,
+ N,
+ Sx,
+ Sxx,
+ Sy,
+ Syy,
+ Sxy;
+
+ transvalues1 = check_float8_array(transarray1, "float8_regr_combine", 6);
+ transvalues2 = check_float8_array(transarray2, "float8_regr_combine", 6);
+
+ N1 = transvalues1[0];
+ Sx1 = transvalues1[1];
+ Sxx1 = transvalues1[2];
+ Sy1 = transvalues1[3];
+ Syy1 = transvalues1[4];
+ Sxy1 = transvalues1[5];
+
+ N2 = transvalues2[0];
+ Sx2 = transvalues2[1];
+ Sxx2 = transvalues2[2];
+ Sy2 = transvalues2[3];
+ Syy2 = transvalues2[4];
+ Sxy2 = transvalues2[5];
+
+ /*--------------------
+ * The transition values combine using a generalization of the
+ * Youngs-Cramer algorithm as follows:
+ *
+ * N = N1 + N2
+ * Sx = Sx1 + Sx2
+ * Sxx = Sxx1 + Sxx2 + N1 * N2 * (Sx1/N1 - Sx2/N2)^2 / N
+ * Sy = Sy1 + Sy2
+ * Syy = Syy1 + Syy2 + N1 * N2 * (Sy1/N1 - Sy2/N2)^2 / N
+ * Sxy = Sxy1 + Sxy2 + N1 * N2 * (Sx1/N1 - Sx2/N2) * (Sy1/N1 - Sy2/N2) / N
+ *
+ * It's worth handling the special cases N1 = 0 and N2 = 0 separately
+ * since those cases are trivial, and we then don't need to worry about
+ * division-by-zero errors in the general case.
+ *--------------------
+ */
+ if (N1 == 0.0)
+ {
+ N = N2;
+ Sx = Sx2;
+ Sxx = Sxx2;
+ Sy = Sy2;
+ Syy = Syy2;
+ Sxy = Sxy2;
+ }
+ else if (N2 == 0.0)
+ {
+ N = N1;
+ Sx = Sx1;
+ Sxx = Sxx1;
+ Sy = Sy1;
+ Syy = Syy1;
+ Sxy = Sxy1;
+ }
+ else
+ {
+ N = N1 + N2;
+ Sx = float8_pl(Sx1, Sx2);
+ tmp1 = Sx1 / N1 - Sx2 / N2;
+ Sxx = Sxx1 + Sxx2 + N1 * N2 * tmp1 * tmp1 / N;
+ if (unlikely(isinf(Sxx)) && !isinf(Sxx1) && !isinf(Sxx2))
+ float_overflow_error();
+ Sy = float8_pl(Sy1, Sy2);
+ tmp2 = Sy1 / N1 - Sy2 / N2;
+ Syy = Syy1 + Syy2 + N1 * N2 * tmp2 * tmp2 / N;
+ if (unlikely(isinf(Syy)) && !isinf(Syy1) && !isinf(Syy2))
+ float_overflow_error();
+ Sxy = Sxy1 + Sxy2 + N1 * N2 * tmp1 * tmp2 / N;
+ if (unlikely(isinf(Sxy)) && !isinf(Sxy1) && !isinf(Sxy2))
+ float_overflow_error();
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we construct a
+ * new array with the updated transition data and return it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ transvalues1[0] = N;
+ transvalues1[1] = Sx;
+ transvalues1[2] = Sxx;
+ transvalues1[3] = Sy;
+ transvalues1[4] = Syy;
+ transvalues1[5] = Sxy;
+
+ PG_RETURN_ARRAYTYPE_P(transarray1);
+ }
+ else
+ {
+ Datum transdatums[6];
+ ArrayType *result;
+
+ transdatums[0] = Float8GetDatumFast(N);
+ transdatums[1] = Float8GetDatumFast(Sx);
+ transdatums[2] = Float8GetDatumFast(Sxx);
+ transdatums[3] = Float8GetDatumFast(Sy);
+ transdatums[4] = Float8GetDatumFast(Syy);
+ transdatums[5] = Float8GetDatumFast(Sxy);
+
+ result = construct_array(transdatums, 6,
+ FLOAT8OID,
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+ }
+}
+
+
+Datum
+float8_regr_sxx(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx;
+
+ transvalues = check_float8_array(transarray, "float8_regr_sxx", 6);
+ N = transvalues[0];
+ Sxx = transvalues[2];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(Sxx);
+}
+
+Datum
+float8_regr_syy(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Syy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_syy", 6);
+ N = transvalues[0];
+ Syy = transvalues[4];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Syy is guaranteed to be non-negative */
+
+ PG_RETURN_FLOAT8(Syy);
+}
+
+Datum
+float8_regr_sxy(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_sxy", 6);
+ N = transvalues[0];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* A negative result is valid here */
+
+ PG_RETURN_FLOAT8(Sxy);
+}
+
+Datum
+float8_regr_avgx(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sx;
+
+ transvalues = check_float8_array(transarray, "float8_regr_avgx", 6);
+ N = transvalues[0];
+ Sx = transvalues[1];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sx / N);
+}
+
+Datum
+float8_regr_avgy(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_avgy", 6);
+ N = transvalues[0];
+ Sy = transvalues[3];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sy / N);
+}
+
+Datum
+float8_covar_pop(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_covar_pop", 6);
+ N = transvalues[0];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sxy / N);
+}
+
+Datum
+float8_covar_samp(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_covar_samp", 6);
+ N = transvalues[0];
+ Sxy = transvalues[5];
+
+ /* if N is <= 1 we should return NULL */
+ if (N < 2.0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sxy / (N - 1.0));
+}
+
+Datum
+float8_corr(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx,
+ Syy,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_corr", 6);
+ N = transvalues[0];
+ Sxx = transvalues[2];
+ Syy = transvalues[4];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx and Syy are guaranteed to be non-negative */
+
+ /* per spec, return NULL for horizontal and vertical lines */
+ if (Sxx == 0 || Syy == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sxy / sqrt(Sxx * Syy));
+}
+
+Datum
+float8_regr_r2(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx,
+ Syy,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_r2", 6);
+ N = transvalues[0];
+ Sxx = transvalues[2];
+ Syy = transvalues[4];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx and Syy are guaranteed to be non-negative */
+
+ /* per spec, return NULL for a vertical line */
+ if (Sxx == 0)
+ PG_RETURN_NULL();
+
+ /* per spec, return 1.0 for a horizontal line */
+ if (Syy == 0)
+ PG_RETURN_FLOAT8(1.0);
+
+ PG_RETURN_FLOAT8((Sxy * Sxy) / (Sxx * Syy));
+}
+
+Datum
+float8_regr_slope(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sxx,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_slope", 6);
+ N = transvalues[0];
+ Sxx = transvalues[2];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ /* per spec, return NULL for a vertical line */
+ if (Sxx == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(Sxy / Sxx);
+}
+
+Datum
+float8_regr_intercept(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ float8 *transvalues;
+ float8 N,
+ Sx,
+ Sxx,
+ Sy,
+ Sxy;
+
+ transvalues = check_float8_array(transarray, "float8_regr_intercept", 6);
+ N = transvalues[0];
+ Sx = transvalues[1];
+ Sxx = transvalues[2];
+ Sy = transvalues[3];
+ Sxy = transvalues[5];
+
+ /* if N is 0 we should return NULL */
+ if (N < 1.0)
+ PG_RETURN_NULL();
+
+ /* Note that Sxx is guaranteed to be non-negative */
+
+ /* per spec, return NULL for a vertical line */
+ if (Sxx == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8((Sy - Sx * Sxy / Sxx) / N);
+}
+
+
+/*
+ * ====================================
+ * MIXED-PRECISION ARITHMETIC OPERATORS
+ * ====================================
+ */
+
+/*
+ * float48pl - returns arg1 + arg2
+ * float48mi - returns arg1 - arg2
+ * float48mul - returns arg1 * arg2
+ * float48div - returns arg1 / arg2
+ */
+Datum
+float48pl(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_pl((float8) arg1, arg2));
+}
+
+Datum
+float48mi(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_mi((float8) arg1, arg2));
+}
+
+Datum
+float48mul(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_mul((float8) arg1, arg2));
+}
+
+Datum
+float48div(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_FLOAT8(float8_div((float8) arg1, arg2));
+}
+
+/*
+ * float84pl - returns arg1 + arg2
+ * float84mi - returns arg1 - arg2
+ * float84mul - returns arg1 * arg2
+ * float84div - returns arg1 / arg2
+ */
+Datum
+float84pl(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT8(float8_pl(arg1, (float8) arg2));
+}
+
+Datum
+float84mi(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT8(float8_mi(arg1, (float8) arg2));
+}
+
+Datum
+float84mul(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT8(float8_mul(arg1, (float8) arg2));
+}
+
+Datum
+float84div(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_FLOAT8(float8_div(arg1, (float8) arg2));
+}
+
+/*
+ * ====================
+ * COMPARISON OPERATORS
+ * ====================
+ */
+
+/*
+ * float48{eq,ne,lt,le,gt,ge} - float4/float8 comparison operations
+ */
+Datum
+float48eq(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_eq((float8) arg1, arg2));
+}
+
+Datum
+float48ne(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_ne((float8) arg1, arg2));
+}
+
+Datum
+float48lt(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_lt((float8) arg1, arg2));
+}
+
+Datum
+float48le(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_le((float8) arg1, arg2));
+}
+
+Datum
+float48gt(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_gt((float8) arg1, arg2));
+}
+
+Datum
+float48ge(PG_FUNCTION_ARGS)
+{
+ float4 arg1 = PG_GETARG_FLOAT4(0);
+ float8 arg2 = PG_GETARG_FLOAT8(1);
+
+ PG_RETURN_BOOL(float8_ge((float8) arg1, arg2));
+}
+
+/*
+ * float84{eq,ne,lt,le,gt,ge} - float8/float4 comparison operations
+ */
+Datum
+float84eq(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_eq(arg1, (float8) arg2));
+}
+
+Datum
+float84ne(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_ne(arg1, (float8) arg2));
+}
+
+Datum
+float84lt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_lt(arg1, (float8) arg2));
+}
+
+Datum
+float84le(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_le(arg1, (float8) arg2));
+}
+
+Datum
+float84gt(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_gt(arg1, (float8) arg2));
+}
+
+Datum
+float84ge(PG_FUNCTION_ARGS)
+{
+ float8 arg1 = PG_GETARG_FLOAT8(0);
+ float4 arg2 = PG_GETARG_FLOAT4(1);
+
+ PG_RETURN_BOOL(float8_ge(arg1, (float8) arg2));
+}
+
+/*
+ * Implements the float8 version of the width_bucket() function
+ * defined by SQL2003. See also width_bucket_numeric().
+ *
+ * 'bound1' and 'bound2' are the lower and upper bounds of the
+ * histogram's range, respectively. 'count' is the number of buckets
+ * in the histogram. width_bucket() returns an integer indicating the
+ * bucket number that 'operand' belongs to in an equiwidth histogram
+ * with the specified characteristics. An operand smaller than the
+ * lower bound is assigned to bucket 0. An operand greater than the
+ * upper bound is assigned to an additional bucket (with number
+ * count+1). We don't allow "NaN" for any of the float8 inputs, and we
+ * don't allow either of the histogram bounds to be +/- infinity.
+ */
+Datum
+width_bucket_float8(PG_FUNCTION_ARGS)
+{
+ float8 operand = PG_GETARG_FLOAT8(0);
+ float8 bound1 = PG_GETARG_FLOAT8(1);
+ float8 bound2 = PG_GETARG_FLOAT8(2);
+ int32 count = PG_GETARG_INT32(3);
+ int32 result;
+
+ if (count <= 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("count must be greater than zero")));
+
+ if (isnan(operand) || isnan(bound1) || isnan(bound2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("operand, lower bound, and upper bound cannot be NaN")));
+
+ /* Note that we allow "operand" to be infinite */
+ if (isinf(bound1) || isinf(bound2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("lower and upper bounds must be finite")));
+
+ if (bound1 < bound2)
+ {
+ if (operand < bound1)
+ result = 0;
+ else if (operand >= bound2)
+ {
+ if (pg_add_s32_overflow(count, 1, &result))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ }
+ else
+ result = ((float8) count * (operand - bound1) / (bound2 - bound1)) + 1;
+ }
+ else if (bound1 > bound2)
+ {
+ if (operand > bound1)
+ result = 0;
+ else if (operand <= bound2)
+ {
+ if (pg_add_s32_overflow(count, 1, &result))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ }
+ else
+ result = ((float8) count * (bound1 - operand) / (bound1 - bound2)) + 1;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("lower bound cannot equal upper bound")));
+ result = 0; /* keep the compiler quiet */
+ }
+
+ PG_RETURN_INT32(result);
+}
diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c
new file mode 100644
index 0000000..2918fdb
--- /dev/null
+++ b/src/backend/utils/adt/format_type.c
@@ -0,0 +1,480 @@
+/*-------------------------------------------------------------------------
+ *
+ * format_type.c
+ * Display type names "nicely".
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/format_type.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "access/htup_details.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_type.h"
+#include "mb/pg_wchar.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
+#include "utils/numeric.h"
+#include "utils/syscache.h"
+
+static char *printTypmod(const char *typname, int32 typmod, Oid typmodout);
+
+
+/*
+ * SQL function: format_type(type_oid, typemod)
+ *
+ * `type_oid' is from pg_type.oid, `typemod' is from
+ * pg_attribute.atttypmod. This function will get the type name and
+ * format it and the modifier to canonical SQL format, if the type is
+ * a standard type. Otherwise you just get pg_type.typname back,
+ * double quoted if it contains funny characters or matches a keyword.
+ *
+ * If typemod is NULL then we are formatting a type name in a context where
+ * no typemod is available, eg a function argument or result type. This
+ * yields a slightly different result from specifying typemod = -1 in some
+ * cases. Given typemod = -1 we feel compelled to produce an output that
+ * the parser will interpret as having typemod -1, so that pg_dump will
+ * produce CREATE TABLE commands that recreate the original state. But
+ * given NULL typemod, we assume that the parser's interpretation of
+ * typemod doesn't matter, and so we are willing to output a slightly
+ * "prettier" representation of the same type. For example, type = bpchar
+ * and typemod = NULL gets you "character", whereas typemod = -1 gets you
+ * "bpchar" --- the former will be interpreted as character(1) by the
+ * parser, which does not yield typemod -1.
+ *
+ * XXX encoding a meaning in typemod = NULL is ugly; it'd have been
+ * cleaner to make two functions of one and two arguments respectively.
+ * Not worth changing it now, however.
+ */
+Datum
+format_type(PG_FUNCTION_ARGS)
+{
+ Oid type_oid;
+ int32 typemod;
+ char *result;
+ bits16 flags = FORMAT_TYPE_ALLOW_INVALID;
+
+ /* Since this function is not strict, we must test for null args */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ type_oid = PG_GETARG_OID(0);
+
+ if (PG_ARGISNULL(1))
+ typemod = -1;
+ else
+ {
+ typemod = PG_GETARG_INT32(1);
+ flags |= FORMAT_TYPE_TYPEMOD_GIVEN;
+ }
+
+ result = format_type_extended(type_oid, typemod, flags);
+
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
+
+/*
+ * format_type_extended
+ * Generate a possibly-qualified type name.
+ *
+ * The default behavior is to only qualify if the type is not in the search
+ * path, to ignore the given typmod, and to raise an error if a non-existent
+ * type_oid is given.
+ *
+ * The following bits in 'flags' modify the behavior:
+ * - FORMAT_TYPE_TYPEMOD_GIVEN
+ * include the typmod in the output (typmod could still be -1 though)
+ * - FORMAT_TYPE_ALLOW_INVALID
+ * if the type OID is invalid or unknown, return ??? or such instead
+ * of failing
+ * - FORMAT_TYPE_INVALID_AS_NULL
+ * if the type OID is invalid or unknown, return NULL instead of ???
+ * or such
+ * - FORMAT_TYPE_FORCE_QUALIFY
+ * always schema-qualify type names, regardless of search_path
+ *
+ * Note that TYPEMOD_GIVEN is not interchangeable with "typemod == -1";
+ * see the comments above for format_type().
+ *
+ * Returns a palloc'd string, or NULL.
+ */
+char *
+format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
+{
+ HeapTuple tuple;
+ Form_pg_type typeform;
+ Oid array_base_type;
+ bool is_array;
+ char *buf;
+ bool with_typemod;
+
+ if (type_oid == InvalidOid)
+ {
+ if ((flags & FORMAT_TYPE_INVALID_AS_NULL) != 0)
+ return NULL;
+ else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0)
+ return pstrdup("-");
+ }
+
+ tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid));
+ if (!HeapTupleIsValid(tuple))
+ {
+ if ((flags & FORMAT_TYPE_INVALID_AS_NULL) != 0)
+ return NULL;
+ else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0)
+ return pstrdup("???");
+ else
+ elog(ERROR, "cache lookup failed for type %u", type_oid);
+ }
+ typeform = (Form_pg_type) GETSTRUCT(tuple);
+
+ /*
+ * Check if it's a "true" array type. Pseudo-array types such as "name"
+ * shouldn't get deconstructed. Also check the toast property, and don't
+ * deconstruct "plain storage" array types --- this is because we don't
+ * want to show oidvector as oid[].
+ */
+ array_base_type = typeform->typelem;
+
+ if (IsTrueArrayType(typeform) &&
+ typeform->typstorage != TYPSTORAGE_PLAIN)
+ {
+ /* Switch our attention to the array element type */
+ ReleaseSysCache(tuple);
+ tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(array_base_type));
+ if (!HeapTupleIsValid(tuple))
+ {
+ if ((flags & FORMAT_TYPE_INVALID_AS_NULL) != 0)
+ return NULL;
+ else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0)
+ return pstrdup("???[]");
+ else
+ elog(ERROR, "cache lookup failed for type %u", type_oid);
+ }
+ typeform = (Form_pg_type) GETSTRUCT(tuple);
+ type_oid = array_base_type;
+ is_array = true;
+ }
+ else
+ is_array = false;
+
+ with_typemod = (flags & FORMAT_TYPE_TYPEMOD_GIVEN) != 0 && (typemod >= 0);
+
+ /*
+ * See if we want to special-case the output for certain built-in types.
+ * Note that these special cases should all correspond to special
+ * productions in gram.y, to ensure that the type name will be taken as a
+ * system type, not a user type of the same name.
+ *
+ * If we do not provide a special-case output here, the type name will be
+ * handled the same way as a user type name --- in particular, it will be
+ * double-quoted if it matches any lexer keyword. This behavior is
+ * essential for some cases, such as types "bit" and "char".
+ */
+ buf = NULL; /* flag for no special case */
+
+ switch (type_oid)
+ {
+ case BITOID:
+ if (with_typemod)
+ buf = printTypmod("bit", typemod, typeform->typmodout);
+ else if ((flags & FORMAT_TYPE_TYPEMOD_GIVEN) != 0)
+ {
+ /*
+ * bit with typmod -1 is not the same as BIT, which means
+ * BIT(1) per SQL spec. Report it as the quoted typename so
+ * that parser will not assign a bogus typmod.
+ */
+ }
+ else
+ buf = pstrdup("bit");
+ break;
+
+ case BOOLOID:
+ buf = pstrdup("boolean");
+ break;
+
+ case BPCHAROID:
+ if (with_typemod)
+ buf = printTypmod("character", typemod, typeform->typmodout);
+ else if ((flags & FORMAT_TYPE_TYPEMOD_GIVEN) != 0)
+ {
+ /*
+ * bpchar with typmod -1 is not the same as CHARACTER, which
+ * means CHARACTER(1) per SQL spec. Report it as bpchar so
+ * that parser will not assign a bogus typmod.
+ */
+ }
+ else
+ buf = pstrdup("character");
+ break;
+
+ case FLOAT4OID:
+ buf = pstrdup("real");
+ break;
+
+ case FLOAT8OID:
+ buf = pstrdup("double precision");
+ break;
+
+ case INT2OID:
+ buf = pstrdup("smallint");
+ break;
+
+ case INT4OID:
+ buf = pstrdup("integer");
+ break;
+
+ case INT8OID:
+ buf = pstrdup("bigint");
+ break;
+
+ case NUMERICOID:
+ if (with_typemod)
+ buf = printTypmod("numeric", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("numeric");
+ break;
+
+ case INTERVALOID:
+ if (with_typemod)
+ buf = printTypmod("interval", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("interval");
+ break;
+
+ case TIMEOID:
+ if (with_typemod)
+ buf = printTypmod("time", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("time without time zone");
+ break;
+
+ case TIMETZOID:
+ if (with_typemod)
+ buf = printTypmod("time", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("time with time zone");
+ break;
+
+ case TIMESTAMPOID:
+ if (with_typemod)
+ buf = printTypmod("timestamp", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("timestamp without time zone");
+ break;
+
+ case TIMESTAMPTZOID:
+ if (with_typemod)
+ buf = printTypmod("timestamp", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("timestamp with time zone");
+ break;
+
+ case VARBITOID:
+ if (with_typemod)
+ buf = printTypmod("bit varying", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("bit varying");
+ break;
+
+ case VARCHAROID:
+ if (with_typemod)
+ buf = printTypmod("character varying", typemod, typeform->typmodout);
+ else
+ buf = pstrdup("character varying");
+ break;
+ }
+
+ if (buf == NULL)
+ {
+ /*
+ * Default handling: report the name as it appears in the catalog.
+ * Here, we must qualify the name if it is not visible in the search
+ * path or if caller requests it; and we must double-quote it if it's
+ * not a standard identifier or if it matches any keyword.
+ */
+ char *nspname;
+ char *typname;
+
+ if ((flags & FORMAT_TYPE_FORCE_QUALIFY) == 0 &&
+ TypeIsVisible(type_oid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name_or_temp(typeform->typnamespace);
+
+ typname = NameStr(typeform->typname);
+
+ buf = quote_qualified_identifier(nspname, typname);
+
+ if (with_typemod)
+ buf = printTypmod(buf, typemod, typeform->typmodout);
+ }
+
+ if (is_array)
+ buf = psprintf("%s[]", buf);
+
+ ReleaseSysCache(tuple);
+
+ return buf;
+}
+
+/*
+ * This version is for use within the backend in error messages, etc.
+ * One difference is that it will fail for an invalid type.
+ *
+ * The result is always a palloc'd string.
+ */
+char *
+format_type_be(Oid type_oid)
+{
+ return format_type_extended(type_oid, -1, 0);
+}
+
+/*
+ * This version returns a name that is always qualified (unless it's one
+ * of the SQL-keyword type names, such as TIMESTAMP WITH TIME ZONE).
+ */
+char *
+format_type_be_qualified(Oid type_oid)
+{
+ return format_type_extended(type_oid, -1, FORMAT_TYPE_FORCE_QUALIFY);
+}
+
+/*
+ * This version allows a nondefault typemod to be specified.
+ */
+char *
+format_type_with_typemod(Oid type_oid, int32 typemod)
+{
+ return format_type_extended(type_oid, typemod, FORMAT_TYPE_TYPEMOD_GIVEN);
+}
+
+/*
+ * Add typmod decoration to the basic type name
+ */
+static char *
+printTypmod(const char *typname, int32 typmod, Oid typmodout)
+{
+ char *res;
+
+ /* Shouldn't be called if typmod is -1 */
+ Assert(typmod >= 0);
+
+ if (typmodout == InvalidOid)
+ {
+ /* Default behavior: just print the integer typmod with parens */
+ res = psprintf("%s(%d)", typname, (int) typmod);
+ }
+ else
+ {
+ /* Use the type-specific typmodout procedure */
+ char *tmstr;
+
+ tmstr = DatumGetCString(OidFunctionCall1(typmodout,
+ Int32GetDatum(typmod)));
+ res = psprintf("%s%s", typname, tmstr);
+ }
+
+ return res;
+}
+
+
+/*
+ * type_maximum_size --- determine maximum width of a variable-width column
+ *
+ * If the max width is indeterminate, return -1. In particular, we return
+ * -1 for any type not known to this routine. We assume the caller has
+ * already determined that the type is a variable-width type, so it's not
+ * necessary to look up the type's pg_type tuple here.
+ *
+ * This may appear unrelated to format_type(), but in fact the two routines
+ * share knowledge of the encoding of typmod for different types, so it's
+ * convenient to keep them together. (XXX now that most of this knowledge
+ * has been pushed out of format_type into the typmodout functions, it's
+ * interesting to wonder if it's worth trying to factor this code too...)
+ */
+int32
+type_maximum_size(Oid type_oid, int32 typemod)
+{
+ if (typemod < 0)
+ return -1;
+
+ switch (type_oid)
+ {
+ case BPCHAROID:
+ case VARCHAROID:
+ /* typemod includes varlena header */
+
+ /* typemod is in characters not bytes */
+ return (typemod - VARHDRSZ) *
+ pg_encoding_max_length(GetDatabaseEncoding())
+ + VARHDRSZ;
+
+ case NUMERICOID:
+ return numeric_maximum_size(typemod);
+
+ case VARBITOID:
+ case BITOID:
+ /* typemod is the (max) number of bits */
+ return (typemod + (BITS_PER_BYTE - 1)) / BITS_PER_BYTE
+ + 2 * sizeof(int32);
+ }
+
+ /* Unknown type, or unlimited-width type such as 'text' */
+ return -1;
+}
+
+
+/*
+ * oidvectortypes - converts a vector of type OIDs to "typname" list
+ */
+Datum
+oidvectortypes(PG_FUNCTION_ARGS)
+{
+ oidvector *oidArray = (oidvector *) PG_GETARG_POINTER(0);
+ char *result;
+ int numargs = oidArray->dim1;
+ int num;
+ size_t total;
+ size_t left;
+
+ total = 20 * numargs + 1;
+ result = palloc(total);
+ result[0] = '\0';
+ left = total - 1;
+
+ for (num = 0; num < numargs; num++)
+ {
+ char *typename = format_type_extended(oidArray->values[num], -1,
+ FORMAT_TYPE_ALLOW_INVALID);
+ size_t slen = strlen(typename);
+
+ if (left < (slen + 2))
+ {
+ total += slen + 2;
+ result = repalloc(result, total);
+ left += slen + 2;
+ }
+
+ if (num > 0)
+ {
+ strcat(result, ", ");
+ left -= 2;
+ }
+ strcat(result, typename);
+ left -= slen;
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
new file mode 100644
index 0000000..7b1f080
--- /dev/null
+++ b/src/backend/utils/adt/formatting.c
@@ -0,0 +1,6729 @@
+/* -----------------------------------------------------------------------
+ * formatting.c
+ *
+ * src/backend/utils/adt/formatting.c
+ *
+ *
+ * Portions Copyright (c) 1999-2022, PostgreSQL Global Development Group
+ *
+ *
+ * TO_CHAR(); TO_TIMESTAMP(); TO_DATE(); TO_NUMBER();
+ *
+ * The PostgreSQL routines for a timestamp/int/float/numeric formatting,
+ * inspired by the Oracle TO_CHAR() / TO_DATE() / TO_NUMBER() routines.
+ *
+ *
+ * Cache & Memory:
+ * Routines use (itself) internal cache for format pictures.
+ *
+ * The cache uses a static buffer and is persistent across transactions. If
+ * the format-picture is bigger than the cache buffer, the parser is called
+ * always.
+ *
+ * NOTE for Number version:
+ * All in this version is implemented as keywords ( => not used
+ * suffixes), because a format picture is for *one* item (number)
+ * only. It not is as a timestamp version, where each keyword (can)
+ * has suffix.
+ *
+ * NOTE for Timestamp routines:
+ * In this module the POSIX 'struct tm' type is *not* used, but rather
+ * PgSQL type, which has tm_mon based on one (*non* zero) and
+ * year *not* based on 1900, but is used full year number.
+ * Module supports AD / BC / AM / PM.
+ *
+ * Supported types for to_char():
+ *
+ * Timestamp, Numeric, int4, int8, float4, float8
+ *
+ * Supported types for reverse conversion:
+ *
+ * Timestamp - to_timestamp()
+ * Date - to_date()
+ * Numeric - to_number()
+ *
+ *
+ * Karel Zak
+ *
+ * TODO
+ * - better number building (formatting) / parsing, now it isn't
+ * ideal code
+ * - use Assert()
+ * - add support for roman number to standard number conversion
+ * - add support for number spelling
+ * - add support for string to string formatting (we must be better
+ * than Oracle :-),
+ * to_char('Hello', 'X X X X X') -> 'H e l l o'
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#ifdef DEBUG_TO_FROM_CHAR
+#define DEBUG_elog_output DEBUG3
+#endif
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <unistd.h>
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+
+/*
+ * towlower() and friends should be in <wctype.h>, but some pre-C99 systems
+ * declare them in <wchar.h>, so include that too.
+ */
+#include <wchar.h>
+#ifdef HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+
+#ifdef USE_ICU
+#include <unicode/ustring.h>
+#endif
+
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "mb/pg_wchar.h"
+#include "parser/scansup.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/float.h"
+#include "utils/formatting.h"
+#include "utils/memutils.h"
+#include "utils/numeric.h"
+#include "utils/pg_locale.h"
+
+/* ----------
+ * Convenience macros for error handling
+ * ----------
+ *
+ * Two macros below help to handle errors in functions that take
+ * 'bool *have_error' argument. When this argument is not NULL, it's expected
+ * that function will suppress ereports when possible. Instead it should
+ * return some default value and set *have_error flag.
+ *
+ * RETURN_ERROR() macro intended to wrap ereport() calls. When have_error
+ * function argument is not NULL, then instead of ereport'ing we set
+ * *have_error flag and go to on_error label. It's supposed that jump
+ * resources will be freed and some 'default' value returned.
+ *
+ * CHECK_ERROR() jumps on_error label when *have_error flag is defined and set.
+ * It's supposed to be used for immediate exit from the function on error
+ * after call of another function with 'bool *have_error' argument.
+ */
+#define RETURN_ERROR(throw_error) \
+do { \
+ if (have_error) \
+ { \
+ *have_error = true; \
+ goto on_error; \
+ } \
+ else \
+ { \
+ throw_error; \
+ } \
+} while (0)
+
+#define CHECK_ERROR \
+do { \
+ if (have_error && *have_error) \
+ goto on_error; \
+} while (0)
+
+/* ----------
+ * Routines flags
+ * ----------
+ */
+#define DCH_FLAG 0x1 /* DATE-TIME flag */
+#define NUM_FLAG 0x2 /* NUMBER flag */
+#define STD_FLAG 0x4 /* STANDARD flag */
+
+/* ----------
+ * KeyWord Index (ascii from position 32 (' ') to 126 (~))
+ * ----------
+ */
+#define KeyWord_INDEX_SIZE ('~' - ' ')
+#define KeyWord_INDEX_FILTER(_c) ((_c) <= ' ' || (_c) >= '~' ? 0 : 1)
+
+/* ----------
+ * Maximal length of one node
+ * ----------
+ */
+#define DCH_MAX_ITEM_SIZ 12 /* max localized day name */
+#define NUM_MAX_ITEM_SIZ 8 /* roman number (RN has 15 chars) */
+
+
+/* ----------
+ * Format parser structs
+ * ----------
+ */
+typedef struct
+{
+ const char *name; /* suffix string */
+ int len, /* suffix length */
+ id, /* used in node->suffix */
+ type; /* prefix / postfix */
+} KeySuffix;
+
+/* ----------
+ * FromCharDateMode
+ * ----------
+ *
+ * This value is used to nominate one of several distinct (and mutually
+ * exclusive) date conventions that a keyword can belong to.
+ */
+typedef enum
+{
+ FROM_CHAR_DATE_NONE = 0, /* Value does not affect date mode. */
+ FROM_CHAR_DATE_GREGORIAN, /* Gregorian (day, month, year) style date */
+ FROM_CHAR_DATE_ISOWEEK /* ISO 8601 week date */
+} FromCharDateMode;
+
+typedef struct
+{
+ const char *name;
+ int len;
+ int id;
+ bool is_digit;
+ FromCharDateMode date_mode;
+} KeyWord;
+
+typedef struct
+{
+ uint8 type; /* NODE_TYPE_XXX, see below */
+ char character[MAX_MULTIBYTE_CHAR_LEN + 1]; /* if type is CHAR */
+ uint8 suffix; /* keyword prefix/suffix code, if any */
+ const KeyWord *key; /* if type is ACTION */
+} FormatNode;
+
+#define NODE_TYPE_END 1
+#define NODE_TYPE_ACTION 2
+#define NODE_TYPE_CHAR 3
+#define NODE_TYPE_SEPARATOR 4
+#define NODE_TYPE_SPACE 5
+
+#define SUFFTYPE_PREFIX 1
+#define SUFFTYPE_POSTFIX 2
+
+#define CLOCK_24_HOUR 0
+#define CLOCK_12_HOUR 1
+
+
+/* ----------
+ * Full months
+ * ----------
+ */
+static const char *const months_full[] = {
+ "January", "February", "March", "April", "May", "June", "July",
+ "August", "September", "October", "November", "December", NULL
+};
+
+static const char *const days_short[] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL
+};
+
+/* ----------
+ * AD / BC
+ * ----------
+ * There is no 0 AD. Years go from 1 BC to 1 AD, so we make it
+ * positive and map year == -1 to year zero, and shift all negative
+ * years up one. For interval years, we just return the year.
+ */
+#define ADJUST_YEAR(year, is_interval) ((is_interval) ? (year) : ((year) <= 0 ? -((year) - 1) : (year)))
+
+#define A_D_STR "A.D."
+#define a_d_STR "a.d."
+#define AD_STR "AD"
+#define ad_STR "ad"
+
+#define B_C_STR "B.C."
+#define b_c_STR "b.c."
+#define BC_STR "BC"
+#define bc_STR "bc"
+
+/*
+ * AD / BC strings for seq_search.
+ *
+ * These are given in two variants, a long form with periods and a standard
+ * form without.
+ *
+ * The array is laid out such that matches for AD have an even index, and
+ * matches for BC have an odd index. So the boolean value for BC is given by
+ * taking the array index of the match, modulo 2.
+ */
+static const char *const adbc_strings[] = {ad_STR, bc_STR, AD_STR, BC_STR, NULL};
+static const char *const adbc_strings_long[] = {a_d_STR, b_c_STR, A_D_STR, B_C_STR, NULL};
+
+/* ----------
+ * AM / PM
+ * ----------
+ */
+#define A_M_STR "A.M."
+#define a_m_STR "a.m."
+#define AM_STR "AM"
+#define am_STR "am"
+
+#define P_M_STR "P.M."
+#define p_m_STR "p.m."
+#define PM_STR "PM"
+#define pm_STR "pm"
+
+/*
+ * AM / PM strings for seq_search.
+ *
+ * These are given in two variants, a long form with periods and a standard
+ * form without.
+ *
+ * The array is laid out such that matches for AM have an even index, and
+ * matches for PM have an odd index. So the boolean value for PM is given by
+ * taking the array index of the match, modulo 2.
+ */
+static const char *const ampm_strings[] = {am_STR, pm_STR, AM_STR, PM_STR, NULL};
+static const char *const ampm_strings_long[] = {a_m_STR, p_m_STR, A_M_STR, P_M_STR, NULL};
+
+/* ----------
+ * Months in roman-numeral
+ * (Must be in reverse order for seq_search (in FROM_CHAR), because
+ * 'VIII' must have higher precedence than 'V')
+ * ----------
+ */
+static const char *const rm_months_upper[] =
+{"XII", "XI", "X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I", NULL};
+
+static const char *const rm_months_lower[] =
+{"xii", "xi", "x", "ix", "viii", "vii", "vi", "v", "iv", "iii", "ii", "i", NULL};
+
+/* ----------
+ * Roman numbers
+ * ----------
+ */
+static const char *const rm1[] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", NULL};
+static const char *const rm10[] = {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", NULL};
+static const char *const rm100[] = {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", NULL};
+
+/* ----------
+ * Ordinal postfixes
+ * ----------
+ */
+static const char *const numTH[] = {"ST", "ND", "RD", "TH", NULL};
+static const char *const numth[] = {"st", "nd", "rd", "th", NULL};
+
+/* ----------
+ * Flags & Options:
+ * ----------
+ */
+#define TH_UPPER 1
+#define TH_LOWER 2
+
+/* ----------
+ * Number description struct
+ * ----------
+ */
+typedef struct
+{
+ int pre, /* (count) numbers before decimal */
+ post, /* (count) numbers after decimal */
+ lsign, /* want locales sign */
+ flag, /* number parameters */
+ pre_lsign_num, /* tmp value for lsign */
+ multi, /* multiplier for 'V' */
+ zero_start, /* position of first zero */
+ zero_end, /* position of last zero */
+ need_locale; /* needs it locale */
+} NUMDesc;
+
+/* ----------
+ * Flags for NUMBER version
+ * ----------
+ */
+#define NUM_F_DECIMAL (1 << 1)
+#define NUM_F_LDECIMAL (1 << 2)
+#define NUM_F_ZERO (1 << 3)
+#define NUM_F_BLANK (1 << 4)
+#define NUM_F_FILLMODE (1 << 5)
+#define NUM_F_LSIGN (1 << 6)
+#define NUM_F_BRACKET (1 << 7)
+#define NUM_F_MINUS (1 << 8)
+#define NUM_F_PLUS (1 << 9)
+#define NUM_F_ROMAN (1 << 10)
+#define NUM_F_MULTI (1 << 11)
+#define NUM_F_PLUS_POST (1 << 12)
+#define NUM_F_MINUS_POST (1 << 13)
+#define NUM_F_EEEE (1 << 14)
+
+#define NUM_LSIGN_PRE (-1)
+#define NUM_LSIGN_POST 1
+#define NUM_LSIGN_NONE 0
+
+/* ----------
+ * Tests
+ * ----------
+ */
+#define IS_DECIMAL(_f) ((_f)->flag & NUM_F_DECIMAL)
+#define IS_LDECIMAL(_f) ((_f)->flag & NUM_F_LDECIMAL)
+#define IS_ZERO(_f) ((_f)->flag & NUM_F_ZERO)
+#define IS_BLANK(_f) ((_f)->flag & NUM_F_BLANK)
+#define IS_FILLMODE(_f) ((_f)->flag & NUM_F_FILLMODE)
+#define IS_BRACKET(_f) ((_f)->flag & NUM_F_BRACKET)
+#define IS_MINUS(_f) ((_f)->flag & NUM_F_MINUS)
+#define IS_LSIGN(_f) ((_f)->flag & NUM_F_LSIGN)
+#define IS_PLUS(_f) ((_f)->flag & NUM_F_PLUS)
+#define IS_ROMAN(_f) ((_f)->flag & NUM_F_ROMAN)
+#define IS_MULTI(_f) ((_f)->flag & NUM_F_MULTI)
+#define IS_EEEE(_f) ((_f)->flag & NUM_F_EEEE)
+
+/* ----------
+ * Format picture cache
+ *
+ * We will cache datetime format pictures up to DCH_CACHE_SIZE bytes long;
+ * likewise number format pictures up to NUM_CACHE_SIZE bytes long.
+ *
+ * For simplicity, the cache entries are fixed-size, so they allow for the
+ * worst case of a FormatNode for each byte in the picture string.
+ *
+ * The CACHE_SIZE constants are computed to make sizeof(DCHCacheEntry) and
+ * sizeof(NUMCacheEntry) be powers of 2, or just less than that, so that
+ * we don't waste too much space by palloc'ing them individually. Be sure
+ * to adjust those macros if you add fields to those structs.
+ *
+ * The max number of entries in each cache is DCH_CACHE_ENTRIES
+ * resp. NUM_CACHE_ENTRIES.
+ * ----------
+ */
+#define DCH_CACHE_OVERHEAD \
+ MAXALIGN(sizeof(bool) + sizeof(int))
+#define NUM_CACHE_OVERHEAD \
+ MAXALIGN(sizeof(bool) + sizeof(int) + sizeof(NUMDesc))
+
+#define DCH_CACHE_SIZE \
+ ((2048 - DCH_CACHE_OVERHEAD) / (sizeof(FormatNode) + sizeof(char)) - 1)
+#define NUM_CACHE_SIZE \
+ ((1024 - NUM_CACHE_OVERHEAD) / (sizeof(FormatNode) + sizeof(char)) - 1)
+
+#define DCH_CACHE_ENTRIES 20
+#define NUM_CACHE_ENTRIES 20
+
+typedef struct
+{
+ FormatNode format[DCH_CACHE_SIZE + 1];
+ char str[DCH_CACHE_SIZE + 1];
+ bool std;
+ bool valid;
+ int age;
+} DCHCacheEntry;
+
+typedef struct
+{
+ FormatNode format[NUM_CACHE_SIZE + 1];
+ char str[NUM_CACHE_SIZE + 1];
+ bool valid;
+ int age;
+ NUMDesc Num;
+} NUMCacheEntry;
+
+/* global cache for date/time format pictures */
+static DCHCacheEntry *DCHCache[DCH_CACHE_ENTRIES];
+static int n_DCHCache = 0; /* current number of entries */
+static int DCHCounter = 0; /* aging-event counter */
+
+/* global cache for number format pictures */
+static NUMCacheEntry *NUMCache[NUM_CACHE_ENTRIES];
+static int n_NUMCache = 0; /* current number of entries */
+static int NUMCounter = 0; /* aging-event counter */
+
+/* ----------
+ * For char->date/time conversion
+ * ----------
+ */
+typedef struct
+{
+ FromCharDateMode mode;
+ int hh,
+ pm,
+ mi,
+ ss,
+ ssss,
+ d, /* stored as 1-7, Sunday = 1, 0 means missing */
+ dd,
+ ddd,
+ mm,
+ ms,
+ year,
+ bc,
+ ww,
+ w,
+ cc,
+ j,
+ us,
+ yysz, /* is it YY or YYYY ? */
+ clock, /* 12 or 24 hour clock? */
+ tzsign, /* +1, -1 or 0 if timezone info is absent */
+ tzh,
+ tzm,
+ ff; /* fractional precision */
+} TmFromChar;
+
+#define ZERO_tmfc(_X) memset(_X, 0, sizeof(TmFromChar))
+
+/* ----------
+ * Debug
+ * ----------
+ */
+#ifdef DEBUG_TO_FROM_CHAR
+#define DEBUG_TMFC(_X) \
+ elog(DEBUG_elog_output, "TMFC:\nmode %d\nhh %d\npm %d\nmi %d\nss %d\nssss %d\nd %d\ndd %d\nddd %d\nmm %d\nms: %d\nyear %d\nbc %d\nww %d\nw %d\ncc %d\nj %d\nus: %d\nyysz: %d\nclock: %d", \
+ (_X)->mode, (_X)->hh, (_X)->pm, (_X)->mi, (_X)->ss, (_X)->ssss, \
+ (_X)->d, (_X)->dd, (_X)->ddd, (_X)->mm, (_X)->ms, (_X)->year, \
+ (_X)->bc, (_X)->ww, (_X)->w, (_X)->cc, (_X)->j, (_X)->us, \
+ (_X)->yysz, (_X)->clock)
+#define DEBUG_TM(_X) \
+ elog(DEBUG_elog_output, "TM:\nsec %d\nyear %d\nmin %d\nwday %d\nhour %d\nyday %d\nmday %d\nnisdst %d\nmon %d\n",\
+ (_X)->tm_sec, (_X)->tm_year,\
+ (_X)->tm_min, (_X)->tm_wday, (_X)->tm_hour, (_X)->tm_yday,\
+ (_X)->tm_mday, (_X)->tm_isdst, (_X)->tm_mon)
+#else
+#define DEBUG_TMFC(_X)
+#define DEBUG_TM(_X)
+#endif
+
+/* ----------
+ * Datetime to char conversion
+ *
+ * To support intervals as well as timestamps, we use a custom "tm" struct
+ * that is almost like struct pg_tm, but has a 64-bit tm_hour field.
+ * We omit the tm_isdst and tm_zone fields, which are not used here.
+ * ----------
+ */
+struct fmt_tm
+{
+ int tm_sec;
+ int tm_min;
+ int64 tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ long int tm_gmtoff;
+};
+
+typedef struct TmToChar
+{
+ struct fmt_tm tm; /* almost the classic 'tm' struct */
+ fsec_t fsec; /* fractional seconds */
+ const char *tzn; /* timezone */
+} TmToChar;
+
+#define tmtcTm(_X) (&(_X)->tm)
+#define tmtcTzn(_X) ((_X)->tzn)
+#define tmtcFsec(_X) ((_X)->fsec)
+
+/* Note: this is used to copy pg_tm to fmt_tm, so not quite a bitwise copy */
+#define COPY_tm(_DST, _SRC) \
+do { \
+ (_DST)->tm_sec = (_SRC)->tm_sec; \
+ (_DST)->tm_min = (_SRC)->tm_min; \
+ (_DST)->tm_hour = (_SRC)->tm_hour; \
+ (_DST)->tm_mday = (_SRC)->tm_mday; \
+ (_DST)->tm_mon = (_SRC)->tm_mon; \
+ (_DST)->tm_year = (_SRC)->tm_year; \
+ (_DST)->tm_wday = (_SRC)->tm_wday; \
+ (_DST)->tm_yday = (_SRC)->tm_yday; \
+ (_DST)->tm_gmtoff = (_SRC)->tm_gmtoff; \
+} while(0)
+
+/* Caution: this is used to zero both pg_tm and fmt_tm structs */
+#define ZERO_tm(_X) \
+do { \
+ memset(_X, 0, sizeof(*(_X))); \
+ (_X)->tm_mday = (_X)->tm_mon = 1; \
+} while(0)
+
+#define ZERO_tmtc(_X) \
+do { \
+ ZERO_tm( tmtcTm(_X) ); \
+ tmtcFsec(_X) = 0; \
+ tmtcTzn(_X) = NULL; \
+} while(0)
+
+/*
+ * to_char(time) appears to to_char() as an interval, so this check
+ * is really for interval and time data types.
+ */
+#define INVALID_FOR_INTERVAL \
+do { \
+ if (is_interval) \
+ ereport(ERROR, \
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT), \
+ errmsg("invalid format specification for an interval value"), \
+ errhint("Intervals are not tied to specific calendar dates."))); \
+} while(0)
+
+/*****************************************************************************
+ * KeyWord definitions
+ *****************************************************************************/
+
+/* ----------
+ * Suffixes (FormatNode.suffix is an OR of these codes)
+ * ----------
+ */
+#define DCH_S_FM 0x01
+#define DCH_S_TH 0x02
+#define DCH_S_th 0x04
+#define DCH_S_SP 0x08
+#define DCH_S_TM 0x10
+
+/* ----------
+ * Suffix tests
+ * ----------
+ */
+#define S_THth(_s) ((((_s) & DCH_S_TH) || ((_s) & DCH_S_th)) ? 1 : 0)
+#define S_TH(_s) (((_s) & DCH_S_TH) ? 1 : 0)
+#define S_th(_s) (((_s) & DCH_S_th) ? 1 : 0)
+#define S_TH_TYPE(_s) (((_s) & DCH_S_TH) ? TH_UPPER : TH_LOWER)
+
+/* Oracle toggles FM behavior, we don't; see docs. */
+#define S_FM(_s) (((_s) & DCH_S_FM) ? 1 : 0)
+#define S_SP(_s) (((_s) & DCH_S_SP) ? 1 : 0)
+#define S_TM(_s) (((_s) & DCH_S_TM) ? 1 : 0)
+
+/* ----------
+ * Suffixes definition for DATE-TIME TO/FROM CHAR
+ * ----------
+ */
+#define TM_SUFFIX_LEN 2
+
+static const KeySuffix DCH_suff[] = {
+ {"FM", 2, DCH_S_FM, SUFFTYPE_PREFIX},
+ {"fm", 2, DCH_S_FM, SUFFTYPE_PREFIX},
+ {"TM", TM_SUFFIX_LEN, DCH_S_TM, SUFFTYPE_PREFIX},
+ {"tm", 2, DCH_S_TM, SUFFTYPE_PREFIX},
+ {"TH", 2, DCH_S_TH, SUFFTYPE_POSTFIX},
+ {"th", 2, DCH_S_th, SUFFTYPE_POSTFIX},
+ {"SP", 2, DCH_S_SP, SUFFTYPE_POSTFIX},
+ /* last */
+ {NULL, 0, 0, 0}
+};
+
+
+/* ----------
+ * Format-pictures (KeyWord).
+ *
+ * The KeyWord field; alphabetic sorted, *BUT* strings alike is sorted
+ * complicated -to-> easy:
+ *
+ * (example: "DDD","DD","Day","D" )
+ *
+ * (this specific sort needs the algorithm for sequential search for strings,
+ * which not has exact end; -> How keyword is in "HH12blabla" ? - "HH"
+ * or "HH12"? You must first try "HH12", because "HH" is in string, but
+ * it is not good.
+ *
+ * (!)
+ * - Position for the keyword is similar as position in the enum DCH/NUM_poz.
+ * (!)
+ *
+ * For fast search is used the 'int index[]', index is ascii table from position
+ * 32 (' ') to 126 (~), in this index is DCH_ / NUM_ enums for each ASCII
+ * position or -1 if char is not used in the KeyWord. Search example for
+ * string "MM":
+ * 1) see in index to index['M' - 32],
+ * 2) take keywords position (enum DCH_MI) from index
+ * 3) run sequential search in keywords[] from this position
+ *
+ * ----------
+ */
+
+typedef enum
+{
+ DCH_A_D,
+ DCH_A_M,
+ DCH_AD,
+ DCH_AM,
+ DCH_B_C,
+ DCH_BC,
+ DCH_CC,
+ DCH_DAY,
+ DCH_DDD,
+ DCH_DD,
+ DCH_DY,
+ DCH_Day,
+ DCH_Dy,
+ DCH_D,
+ DCH_FF1,
+ DCH_FF2,
+ DCH_FF3,
+ DCH_FF4,
+ DCH_FF5,
+ DCH_FF6,
+ DCH_FX, /* global suffix */
+ DCH_HH24,
+ DCH_HH12,
+ DCH_HH,
+ DCH_IDDD,
+ DCH_ID,
+ DCH_IW,
+ DCH_IYYY,
+ DCH_IYY,
+ DCH_IY,
+ DCH_I,
+ DCH_J,
+ DCH_MI,
+ DCH_MM,
+ DCH_MONTH,
+ DCH_MON,
+ DCH_MS,
+ DCH_Month,
+ DCH_Mon,
+ DCH_OF,
+ DCH_P_M,
+ DCH_PM,
+ DCH_Q,
+ DCH_RM,
+ DCH_SSSSS,
+ DCH_SSSS,
+ DCH_SS,
+ DCH_TZH,
+ DCH_TZM,
+ DCH_TZ,
+ DCH_US,
+ DCH_WW,
+ DCH_W,
+ DCH_Y_YYY,
+ DCH_YYYY,
+ DCH_YYY,
+ DCH_YY,
+ DCH_Y,
+ DCH_a_d,
+ DCH_a_m,
+ DCH_ad,
+ DCH_am,
+ DCH_b_c,
+ DCH_bc,
+ DCH_cc,
+ DCH_day,
+ DCH_ddd,
+ DCH_dd,
+ DCH_dy,
+ DCH_d,
+ DCH_ff1,
+ DCH_ff2,
+ DCH_ff3,
+ DCH_ff4,
+ DCH_ff5,
+ DCH_ff6,
+ DCH_fx,
+ DCH_hh24,
+ DCH_hh12,
+ DCH_hh,
+ DCH_iddd,
+ DCH_id,
+ DCH_iw,
+ DCH_iyyy,
+ DCH_iyy,
+ DCH_iy,
+ DCH_i,
+ DCH_j,
+ DCH_mi,
+ DCH_mm,
+ DCH_month,
+ DCH_mon,
+ DCH_ms,
+ DCH_of,
+ DCH_p_m,
+ DCH_pm,
+ DCH_q,
+ DCH_rm,
+ DCH_sssss,
+ DCH_ssss,
+ DCH_ss,
+ DCH_tzh,
+ DCH_tzm,
+ DCH_tz,
+ DCH_us,
+ DCH_ww,
+ DCH_w,
+ DCH_y_yyy,
+ DCH_yyyy,
+ DCH_yyy,
+ DCH_yy,
+ DCH_y,
+
+ /* last */
+ _DCH_last_
+} DCH_poz;
+
+typedef enum
+{
+ NUM_COMMA,
+ NUM_DEC,
+ NUM_0,
+ NUM_9,
+ NUM_B,
+ NUM_C,
+ NUM_D,
+ NUM_E,
+ NUM_FM,
+ NUM_G,
+ NUM_L,
+ NUM_MI,
+ NUM_PL,
+ NUM_PR,
+ NUM_RN,
+ NUM_SG,
+ NUM_SP,
+ NUM_S,
+ NUM_TH,
+ NUM_V,
+ NUM_b,
+ NUM_c,
+ NUM_d,
+ NUM_e,
+ NUM_fm,
+ NUM_g,
+ NUM_l,
+ NUM_mi,
+ NUM_pl,
+ NUM_pr,
+ NUM_rn,
+ NUM_sg,
+ NUM_sp,
+ NUM_s,
+ NUM_th,
+ NUM_v,
+
+ /* last */
+ _NUM_last_
+} NUM_poz;
+
+/* ----------
+ * KeyWords for DATE-TIME version
+ * ----------
+ */
+static const KeyWord DCH_keywords[] = {
+/* name, len, id, is_digit, date_mode */
+ {"A.D.", 4, DCH_A_D, false, FROM_CHAR_DATE_NONE}, /* A */
+ {"A.M.", 4, DCH_A_M, false, FROM_CHAR_DATE_NONE},
+ {"AD", 2, DCH_AD, false, FROM_CHAR_DATE_NONE},
+ {"AM", 2, DCH_AM, false, FROM_CHAR_DATE_NONE},
+ {"B.C.", 4, DCH_B_C, false, FROM_CHAR_DATE_NONE}, /* B */
+ {"BC", 2, DCH_BC, false, FROM_CHAR_DATE_NONE},
+ {"CC", 2, DCH_CC, true, FROM_CHAR_DATE_NONE}, /* C */
+ {"DAY", 3, DCH_DAY, false, FROM_CHAR_DATE_NONE}, /* D */
+ {"DDD", 3, DCH_DDD, true, FROM_CHAR_DATE_GREGORIAN},
+ {"DD", 2, DCH_DD, true, FROM_CHAR_DATE_GREGORIAN},
+ {"DY", 2, DCH_DY, false, FROM_CHAR_DATE_NONE},
+ {"Day", 3, DCH_Day, false, FROM_CHAR_DATE_NONE},
+ {"Dy", 2, DCH_Dy, false, FROM_CHAR_DATE_NONE},
+ {"D", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN},
+ {"FF1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* F */
+ {"FF2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE},
+ {"FF3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE},
+ {"FF4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE},
+ {"FF5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE},
+ {"FF6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE},
+ {"FX", 2, DCH_FX, false, FROM_CHAR_DATE_NONE},
+ {"HH24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* H */
+ {"HH12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE},
+ {"HH", 2, DCH_HH, true, FROM_CHAR_DATE_NONE},
+ {"IDDD", 4, DCH_IDDD, true, FROM_CHAR_DATE_ISOWEEK}, /* I */
+ {"ID", 2, DCH_ID, true, FROM_CHAR_DATE_ISOWEEK},
+ {"IW", 2, DCH_IW, true, FROM_CHAR_DATE_ISOWEEK},
+ {"IYYY", 4, DCH_IYYY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"IYY", 3, DCH_IYY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"IY", 2, DCH_IY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"I", 1, DCH_I, true, FROM_CHAR_DATE_ISOWEEK},
+ {"J", 1, DCH_J, true, FROM_CHAR_DATE_NONE}, /* J */
+ {"MI", 2, DCH_MI, true, FROM_CHAR_DATE_NONE}, /* M */
+ {"MM", 2, DCH_MM, true, FROM_CHAR_DATE_GREGORIAN},
+ {"MONTH", 5, DCH_MONTH, false, FROM_CHAR_DATE_GREGORIAN},
+ {"MON", 3, DCH_MON, false, FROM_CHAR_DATE_GREGORIAN},
+ {"MS", 2, DCH_MS, true, FROM_CHAR_DATE_NONE},
+ {"Month", 5, DCH_Month, false, FROM_CHAR_DATE_GREGORIAN},
+ {"Mon", 3, DCH_Mon, false, FROM_CHAR_DATE_GREGORIAN},
+ {"OF", 2, DCH_OF, false, FROM_CHAR_DATE_NONE}, /* O */
+ {"P.M.", 4, DCH_P_M, false, FROM_CHAR_DATE_NONE}, /* P */
+ {"PM", 2, DCH_PM, false, FROM_CHAR_DATE_NONE},
+ {"Q", 1, DCH_Q, true, FROM_CHAR_DATE_NONE}, /* Q */
+ {"RM", 2, DCH_RM, false, FROM_CHAR_DATE_GREGORIAN}, /* R */
+ {"SSSSS", 5, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* S */
+ {"SSSS", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE},
+ {"SS", 2, DCH_SS, true, FROM_CHAR_DATE_NONE},
+ {"TZH", 3, DCH_TZH, false, FROM_CHAR_DATE_NONE}, /* T */
+ {"TZM", 3, DCH_TZM, true, FROM_CHAR_DATE_NONE},
+ {"TZ", 2, DCH_TZ, false, FROM_CHAR_DATE_NONE},
+ {"US", 2, DCH_US, true, FROM_CHAR_DATE_NONE}, /* U */
+ {"WW", 2, DCH_WW, true, FROM_CHAR_DATE_GREGORIAN}, /* W */
+ {"W", 1, DCH_W, true, FROM_CHAR_DATE_GREGORIAN},
+ {"Y,YYY", 5, DCH_Y_YYY, true, FROM_CHAR_DATE_GREGORIAN}, /* Y */
+ {"YYYY", 4, DCH_YYYY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"YYY", 3, DCH_YYY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"YY", 2, DCH_YY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"Y", 1, DCH_Y, true, FROM_CHAR_DATE_GREGORIAN},
+ {"a.d.", 4, DCH_a_d, false, FROM_CHAR_DATE_NONE}, /* a */
+ {"a.m.", 4, DCH_a_m, false, FROM_CHAR_DATE_NONE},
+ {"ad", 2, DCH_ad, false, FROM_CHAR_DATE_NONE},
+ {"am", 2, DCH_am, false, FROM_CHAR_DATE_NONE},
+ {"b.c.", 4, DCH_b_c, false, FROM_CHAR_DATE_NONE}, /* b */
+ {"bc", 2, DCH_bc, false, FROM_CHAR_DATE_NONE},
+ {"cc", 2, DCH_CC, true, FROM_CHAR_DATE_NONE}, /* c */
+ {"day", 3, DCH_day, false, FROM_CHAR_DATE_NONE}, /* d */
+ {"ddd", 3, DCH_DDD, true, FROM_CHAR_DATE_GREGORIAN},
+ {"dd", 2, DCH_DD, true, FROM_CHAR_DATE_GREGORIAN},
+ {"dy", 2, DCH_dy, false, FROM_CHAR_DATE_NONE},
+ {"d", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN},
+ {"ff1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* f */
+ {"ff2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE},
+ {"ff3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE},
+ {"ff4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE},
+ {"ff5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE},
+ {"ff6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE},
+ {"fx", 2, DCH_FX, false, FROM_CHAR_DATE_NONE},
+ {"hh24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* h */
+ {"hh12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE},
+ {"hh", 2, DCH_HH, true, FROM_CHAR_DATE_NONE},
+ {"iddd", 4, DCH_IDDD, true, FROM_CHAR_DATE_ISOWEEK}, /* i */
+ {"id", 2, DCH_ID, true, FROM_CHAR_DATE_ISOWEEK},
+ {"iw", 2, DCH_IW, true, FROM_CHAR_DATE_ISOWEEK},
+ {"iyyy", 4, DCH_IYYY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"iyy", 3, DCH_IYY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"iy", 2, DCH_IY, true, FROM_CHAR_DATE_ISOWEEK},
+ {"i", 1, DCH_I, true, FROM_CHAR_DATE_ISOWEEK},
+ {"j", 1, DCH_J, true, FROM_CHAR_DATE_NONE}, /* j */
+ {"mi", 2, DCH_MI, true, FROM_CHAR_DATE_NONE}, /* m */
+ {"mm", 2, DCH_MM, true, FROM_CHAR_DATE_GREGORIAN},
+ {"month", 5, DCH_month, false, FROM_CHAR_DATE_GREGORIAN},
+ {"mon", 3, DCH_mon, false, FROM_CHAR_DATE_GREGORIAN},
+ {"ms", 2, DCH_MS, true, FROM_CHAR_DATE_NONE},
+ {"of", 2, DCH_OF, false, FROM_CHAR_DATE_NONE}, /* o */
+ {"p.m.", 4, DCH_p_m, false, FROM_CHAR_DATE_NONE}, /* p */
+ {"pm", 2, DCH_pm, false, FROM_CHAR_DATE_NONE},
+ {"q", 1, DCH_Q, true, FROM_CHAR_DATE_NONE}, /* q */
+ {"rm", 2, DCH_rm, false, FROM_CHAR_DATE_GREGORIAN}, /* r */
+ {"sssss", 5, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* s */
+ {"ssss", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE},
+ {"ss", 2, DCH_SS, true, FROM_CHAR_DATE_NONE},
+ {"tzh", 3, DCH_TZH, false, FROM_CHAR_DATE_NONE}, /* t */
+ {"tzm", 3, DCH_TZM, true, FROM_CHAR_DATE_NONE},
+ {"tz", 2, DCH_tz, false, FROM_CHAR_DATE_NONE},
+ {"us", 2, DCH_US, true, FROM_CHAR_DATE_NONE}, /* u */
+ {"ww", 2, DCH_WW, true, FROM_CHAR_DATE_GREGORIAN}, /* w */
+ {"w", 1, DCH_W, true, FROM_CHAR_DATE_GREGORIAN},
+ {"y,yyy", 5, DCH_Y_YYY, true, FROM_CHAR_DATE_GREGORIAN}, /* y */
+ {"yyyy", 4, DCH_YYYY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"yyy", 3, DCH_YYY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"yy", 2, DCH_YY, true, FROM_CHAR_DATE_GREGORIAN},
+ {"y", 1, DCH_Y, true, FROM_CHAR_DATE_GREGORIAN},
+
+ /* last */
+ {NULL, 0, 0, 0, 0}
+};
+
+/* ----------
+ * KeyWords for NUMBER version
+ *
+ * The is_digit and date_mode fields are not relevant here.
+ * ----------
+ */
+static const KeyWord NUM_keywords[] = {
+/* name, len, id is in Index */
+ {",", 1, NUM_COMMA}, /* , */
+ {".", 1, NUM_DEC}, /* . */
+ {"0", 1, NUM_0}, /* 0 */
+ {"9", 1, NUM_9}, /* 9 */
+ {"B", 1, NUM_B}, /* B */
+ {"C", 1, NUM_C}, /* C */
+ {"D", 1, NUM_D}, /* D */
+ {"EEEE", 4, NUM_E}, /* E */
+ {"FM", 2, NUM_FM}, /* F */
+ {"G", 1, NUM_G}, /* G */
+ {"L", 1, NUM_L}, /* L */
+ {"MI", 2, NUM_MI}, /* M */
+ {"PL", 2, NUM_PL}, /* P */
+ {"PR", 2, NUM_PR},
+ {"RN", 2, NUM_RN}, /* R */
+ {"SG", 2, NUM_SG}, /* S */
+ {"SP", 2, NUM_SP},
+ {"S", 1, NUM_S},
+ {"TH", 2, NUM_TH}, /* T */
+ {"V", 1, NUM_V}, /* V */
+ {"b", 1, NUM_B}, /* b */
+ {"c", 1, NUM_C}, /* c */
+ {"d", 1, NUM_D}, /* d */
+ {"eeee", 4, NUM_E}, /* e */
+ {"fm", 2, NUM_FM}, /* f */
+ {"g", 1, NUM_G}, /* g */
+ {"l", 1, NUM_L}, /* l */
+ {"mi", 2, NUM_MI}, /* m */
+ {"pl", 2, NUM_PL}, /* p */
+ {"pr", 2, NUM_PR},
+ {"rn", 2, NUM_rn}, /* r */
+ {"sg", 2, NUM_SG}, /* s */
+ {"sp", 2, NUM_SP},
+ {"s", 1, NUM_S},
+ {"th", 2, NUM_th}, /* t */
+ {"v", 1, NUM_V}, /* v */
+
+ /* last */
+ {NULL, 0, 0}
+};
+
+
+/* ----------
+ * KeyWords index for DATE-TIME version
+ * ----------
+ */
+static const int DCH_index[KeyWord_INDEX_SIZE] = {
+/*
+0 1 2 3 4 5 6 7 8 9
+*/
+ /*---- first 0..31 chars are skipped ----*/
+
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, DCH_A_D, DCH_B_C, DCH_CC, DCH_DAY, -1,
+ DCH_FF1, -1, DCH_HH24, DCH_IDDD, DCH_J, -1, -1, DCH_MI, -1, DCH_OF,
+ DCH_P_M, DCH_Q, DCH_RM, DCH_SSSSS, DCH_TZH, DCH_US, -1, DCH_WW, -1, DCH_Y_YYY,
+ -1, -1, -1, -1, -1, -1, -1, DCH_a_d, DCH_b_c, DCH_cc,
+ DCH_day, -1, DCH_ff1, -1, DCH_hh24, DCH_iddd, DCH_j, -1, -1, DCH_mi,
+ -1, DCH_of, DCH_p_m, DCH_q, DCH_rm, DCH_sssss, DCH_tzh, DCH_us, -1, DCH_ww,
+ -1, DCH_y_yyy, -1, -1, -1, -1
+
+ /*---- chars over 126 are skipped ----*/
+};
+
+/* ----------
+ * KeyWords index for NUMBER version
+ * ----------
+ */
+static const int NUM_index[KeyWord_INDEX_SIZE] = {
+/*
+0 1 2 3 4 5 6 7 8 9
+*/
+ /*---- first 0..31 chars are skipped ----*/
+
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, NUM_COMMA, -1, NUM_DEC, -1, NUM_0, -1,
+ -1, -1, -1, -1, -1, -1, -1, NUM_9, -1, -1,
+ -1, -1, -1, -1, -1, -1, NUM_B, NUM_C, NUM_D, NUM_E,
+ NUM_FM, NUM_G, -1, -1, -1, -1, NUM_L, NUM_MI, -1, -1,
+ NUM_PL, -1, NUM_RN, NUM_SG, NUM_TH, -1, NUM_V, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, NUM_b, NUM_c,
+ NUM_d, NUM_e, NUM_fm, NUM_g, -1, -1, -1, -1, NUM_l, NUM_mi,
+ -1, -1, NUM_pl, -1, NUM_rn, NUM_sg, NUM_th, -1, NUM_v, -1,
+ -1, -1, -1, -1, -1, -1
+
+ /*---- chars over 126 are skipped ----*/
+};
+
+/* ----------
+ * Number processor struct
+ * ----------
+ */
+typedef struct NUMProc
+{
+ bool is_to_char;
+ NUMDesc *Num; /* number description */
+
+ int sign, /* '-' or '+' */
+ sign_wrote, /* was sign write */
+ num_count, /* number of write digits */
+ num_in, /* is inside number */
+ num_curr, /* current position in number */
+ out_pre_spaces, /* spaces before first digit */
+
+ read_dec, /* to_number - was read dec. point */
+ read_post, /* to_number - number of dec. digit */
+ read_pre; /* to_number - number non-dec. digit */
+
+ char *number, /* string with number */
+ *number_p, /* pointer to current number position */
+ *inout, /* in / out buffer */
+ *inout_p, /* pointer to current inout position */
+ *last_relevant, /* last relevant number after decimal point */
+
+ *L_negative_sign, /* Locale */
+ *L_positive_sign,
+ *decimal,
+ *L_thousands_sep,
+ *L_currency_symbol;
+} NUMProc;
+
+/* Return flags for DCH_from_char() */
+#define DCH_DATED 0x01
+#define DCH_TIMED 0x02
+#define DCH_ZONED 0x04
+
+/* ----------
+ * Functions
+ * ----------
+ */
+static const KeyWord *index_seq_search(const char *str, const KeyWord *kw,
+ const int *index);
+static const KeySuffix *suff_search(const char *str, const KeySuffix *suf, int type);
+static bool is_separator_char(const char *str);
+static void NUMDesc_prepare(NUMDesc *num, FormatNode *n);
+static void parse_format(FormatNode *node, const char *str, const KeyWord *kw,
+ const KeySuffix *suf, const int *index, uint32 flags, NUMDesc *Num);
+
+static void DCH_to_char(FormatNode *node, bool is_interval,
+ TmToChar *in, char *out, Oid collid);
+static void DCH_from_char(FormatNode *node, const char *in, TmFromChar *out,
+ Oid collid, bool std, bool *have_error);
+
+#ifdef DEBUG_TO_FROM_CHAR
+static void dump_index(const KeyWord *k, const int *index);
+static void dump_node(FormatNode *node, int max);
+#endif
+
+static const char *get_th(char *num, int type);
+static char *str_numth(char *dest, char *num, int type);
+static int adjust_partial_year_to_2020(int year);
+static int strspace_len(const char *str);
+static void from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode,
+ bool *have_error);
+static void from_char_set_int(int *dest, const int value, const FormatNode *node,
+ bool *have_error);
+static int from_char_parse_int_len(int *dest, const char **src, const int len,
+ FormatNode *node, bool *have_error);
+static int from_char_parse_int(int *dest, const char **src, FormatNode *node,
+ bool *have_error);
+static int seq_search_ascii(const char *name, const char *const *array, int *len);
+static int seq_search_localized(const char *name, char **array, int *len,
+ Oid collid);
+static int from_char_seq_search(int *dest, const char **src,
+ const char *const *array,
+ char **localized_array, Oid collid,
+ FormatNode *node, bool *have_error);
+static void do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std,
+ struct pg_tm *tm, fsec_t *fsec, int *fprec,
+ uint32 *flags, bool *have_error);
+static char *fill_str(char *str, int c, int max);
+static FormatNode *NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree);
+static char *int_to_roman(int number);
+static void NUM_prepare_locale(NUMProc *Np);
+static char *get_last_relevant_decnum(char *num);
+static void NUM_numpart_from_char(NUMProc *Np, int id, int input_len);
+static void NUM_numpart_to_char(NUMProc *Np, int id);
+static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
+ char *number, int input_len, int to_char_out_pre_spaces,
+ int sign, bool is_to_char, Oid collid);
+static DCHCacheEntry *DCH_cache_getnew(const char *str, bool std);
+static DCHCacheEntry *DCH_cache_search(const char *str, bool std);
+static DCHCacheEntry *DCH_cache_fetch(const char *str, bool std);
+static NUMCacheEntry *NUM_cache_getnew(const char *str);
+static NUMCacheEntry *NUM_cache_search(const char *str);
+static NUMCacheEntry *NUM_cache_fetch(const char *str);
+
+
+/* ----------
+ * Fast sequential search, use index for data selection which
+ * go to seq. cycle (it is very fast for unwanted strings)
+ * (can't be used binary search in format parsing)
+ * ----------
+ */
+static const KeyWord *
+index_seq_search(const char *str, const KeyWord *kw, const int *index)
+{
+ int poz;
+
+ if (!KeyWord_INDEX_FILTER(*str))
+ return NULL;
+
+ if ((poz = *(index + (*str - ' '))) > -1)
+ {
+ const KeyWord *k = kw + poz;
+
+ do
+ {
+ if (strncmp(str, k->name, k->len) == 0)
+ return k;
+ k++;
+ if (!k->name)
+ return NULL;
+ } while (*str == *k->name);
+ }
+ return NULL;
+}
+
+static const KeySuffix *
+suff_search(const char *str, const KeySuffix *suf, int type)
+{
+ const KeySuffix *s;
+
+ for (s = suf; s->name != NULL; s++)
+ {
+ if (s->type != type)
+ continue;
+
+ if (strncmp(str, s->name, s->len) == 0)
+ return s;
+ }
+ return NULL;
+}
+
+static bool
+is_separator_char(const char *str)
+{
+ /* ASCII printable character, but not letter or digit */
+ return (*str > 0x20 && *str < 0x7F &&
+ !(*str >= 'A' && *str <= 'Z') &&
+ !(*str >= 'a' && *str <= 'z') &&
+ !(*str >= '0' && *str <= '9'));
+}
+
+/* ----------
+ * Prepare NUMDesc (number description struct) via FormatNode struct
+ * ----------
+ */
+static void
+NUMDesc_prepare(NUMDesc *num, FormatNode *n)
+{
+ if (n->type != NODE_TYPE_ACTION)
+ return;
+
+ if (IS_EEEE(num) && n->key->id != NUM_E)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("\"EEEE\" must be the last pattern used")));
+
+ switch (n->key->id)
+ {
+ case NUM_9:
+ if (IS_BRACKET(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("\"9\" must be ahead of \"PR\"")));
+ if (IS_MULTI(num))
+ {
+ ++num->multi;
+ break;
+ }
+ if (IS_DECIMAL(num))
+ ++num->post;
+ else
+ ++num->pre;
+ break;
+
+ case NUM_0:
+ if (IS_BRACKET(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("\"0\" must be ahead of \"PR\"")));
+ if (!IS_ZERO(num) && !IS_DECIMAL(num))
+ {
+ num->flag |= NUM_F_ZERO;
+ num->zero_start = num->pre + 1;
+ }
+ if (!IS_DECIMAL(num))
+ ++num->pre;
+ else
+ ++num->post;
+
+ num->zero_end = num->pre + num->post;
+ break;
+
+ case NUM_B:
+ if (num->pre == 0 && num->post == 0 && (!IS_ZERO(num)))
+ num->flag |= NUM_F_BLANK;
+ break;
+
+ case NUM_D:
+ num->flag |= NUM_F_LDECIMAL;
+ num->need_locale = true;
+ /* FALLTHROUGH */
+ case NUM_DEC:
+ if (IS_DECIMAL(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("multiple decimal points")));
+ if (IS_MULTI(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"V\" and decimal point together")));
+ num->flag |= NUM_F_DECIMAL;
+ break;
+
+ case NUM_FM:
+ num->flag |= NUM_F_FILLMODE;
+ break;
+
+ case NUM_S:
+ if (IS_LSIGN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"S\" twice")));
+ if (IS_PLUS(num) || IS_MINUS(num) || IS_BRACKET(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together")));
+ if (!IS_DECIMAL(num))
+ {
+ num->lsign = NUM_LSIGN_PRE;
+ num->pre_lsign_num = num->pre;
+ num->need_locale = true;
+ num->flag |= NUM_F_LSIGN;
+ }
+ else if (num->lsign == NUM_LSIGN_NONE)
+ {
+ num->lsign = NUM_LSIGN_POST;
+ num->need_locale = true;
+ num->flag |= NUM_F_LSIGN;
+ }
+ break;
+
+ case NUM_MI:
+ if (IS_LSIGN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"S\" and \"MI\" together")));
+ num->flag |= NUM_F_MINUS;
+ if (IS_DECIMAL(num))
+ num->flag |= NUM_F_MINUS_POST;
+ break;
+
+ case NUM_PL:
+ if (IS_LSIGN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"S\" and \"PL\" together")));
+ num->flag |= NUM_F_PLUS;
+ if (IS_DECIMAL(num))
+ num->flag |= NUM_F_PLUS_POST;
+ break;
+
+ case NUM_SG:
+ if (IS_LSIGN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"S\" and \"SG\" together")));
+ num->flag |= NUM_F_MINUS;
+ num->flag |= NUM_F_PLUS;
+ break;
+
+ case NUM_PR:
+ if (IS_LSIGN(num) || IS_PLUS(num) || IS_MINUS(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together")));
+ num->flag |= NUM_F_BRACKET;
+ break;
+
+ case NUM_rn:
+ case NUM_RN:
+ num->flag |= NUM_F_ROMAN;
+ break;
+
+ case NUM_L:
+ case NUM_G:
+ num->need_locale = true;
+ break;
+
+ case NUM_V:
+ if (IS_DECIMAL(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"V\" and decimal point together")));
+ num->flag |= NUM_F_MULTI;
+ break;
+
+ case NUM_E:
+ if (IS_EEEE(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("cannot use \"EEEE\" twice")));
+ if (IS_BLANK(num) || IS_FILLMODE(num) || IS_LSIGN(num) ||
+ IS_BRACKET(num) || IS_MINUS(num) || IS_PLUS(num) ||
+ IS_ROMAN(num) || IS_MULTI(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("\"EEEE\" is incompatible with other formats"),
+ errdetail("\"EEEE\" may only be used together with digit and decimal point patterns.")));
+ num->flag |= NUM_F_EEEE;
+ break;
+ }
+}
+
+/* ----------
+ * Format parser, search small keywords and keyword's suffixes, and make
+ * format-node tree.
+ *
+ * for DATE-TIME & NUMBER version
+ * ----------
+ */
+static void
+parse_format(FormatNode *node, const char *str, const KeyWord *kw,
+ const KeySuffix *suf, const int *index, uint32 flags, NUMDesc *Num)
+{
+ FormatNode *n;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "to_char/number(): run parser");
+#endif
+
+ n = node;
+
+ while (*str)
+ {
+ int suffix = 0;
+ const KeySuffix *s;
+
+ /*
+ * Prefix
+ */
+ if ((flags & DCH_FLAG) &&
+ (s = suff_search(str, suf, SUFFTYPE_PREFIX)) != NULL)
+ {
+ suffix |= s->id;
+ if (s->len)
+ str += s->len;
+ }
+
+ /*
+ * Keyword
+ */
+ if (*str && (n->key = index_seq_search(str, kw, index)) != NULL)
+ {
+ n->type = NODE_TYPE_ACTION;
+ n->suffix = suffix;
+ if (n->key->len)
+ str += n->key->len;
+
+ /*
+ * NUM version: Prepare global NUMDesc struct
+ */
+ if (flags & NUM_FLAG)
+ NUMDesc_prepare(Num, n);
+
+ /*
+ * Postfix
+ */
+ if ((flags & DCH_FLAG) && *str &&
+ (s = suff_search(str, suf, SUFFTYPE_POSTFIX)) != NULL)
+ {
+ n->suffix |= s->id;
+ if (s->len)
+ str += s->len;
+ }
+
+ n++;
+ }
+ else if (*str)
+ {
+ int chlen;
+
+ if ((flags & STD_FLAG) && *str != '"')
+ {
+ /*
+ * Standard mode, allow only following separators: "-./,':; ".
+ * However, we support double quotes even in standard mode
+ * (see below). This is our extension of standard mode.
+ */
+ if (strchr("-./,':; ", *str) == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid datetime format separator: \"%s\"",
+ pnstrdup(str, pg_mblen(str)))));
+
+ if (*str == ' ')
+ n->type = NODE_TYPE_SPACE;
+ else
+ n->type = NODE_TYPE_SEPARATOR;
+
+ n->character[0] = *str;
+ n->character[1] = '\0';
+ n->key = NULL;
+ n->suffix = 0;
+ n++;
+ str++;
+ }
+ else if (*str == '"')
+ {
+ /*
+ * Process double-quoted literal string, if any
+ */
+ str++;
+ while (*str)
+ {
+ if (*str == '"')
+ {
+ str++;
+ break;
+ }
+ /* backslash quotes the next character, if any */
+ if (*str == '\\' && *(str + 1))
+ str++;
+ chlen = pg_mblen(str);
+ n->type = NODE_TYPE_CHAR;
+ memcpy(n->character, str, chlen);
+ n->character[chlen] = '\0';
+ n->key = NULL;
+ n->suffix = 0;
+ n++;
+ str += chlen;
+ }
+ }
+ else
+ {
+ /*
+ * Outside double-quoted strings, backslash is only special if
+ * it immediately precedes a double quote.
+ */
+ if (*str == '\\' && *(str + 1) == '"')
+ str++;
+ chlen = pg_mblen(str);
+
+ if ((flags & DCH_FLAG) && is_separator_char(str))
+ n->type = NODE_TYPE_SEPARATOR;
+ else if (isspace((unsigned char) *str))
+ n->type = NODE_TYPE_SPACE;
+ else
+ n->type = NODE_TYPE_CHAR;
+
+ memcpy(n->character, str, chlen);
+ n->character[chlen] = '\0';
+ n->key = NULL;
+ n->suffix = 0;
+ n++;
+ str += chlen;
+ }
+ }
+ }
+
+ n->type = NODE_TYPE_END;
+ n->suffix = 0;
+}
+
+/* ----------
+ * DEBUG: Dump the FormatNode Tree (debug)
+ * ----------
+ */
+#ifdef DEBUG_TO_FROM_CHAR
+
+#define DUMP_THth(_suf) (S_TH(_suf) ? "TH" : (S_th(_suf) ? "th" : " "))
+#define DUMP_FM(_suf) (S_FM(_suf) ? "FM" : " ")
+
+static void
+dump_node(FormatNode *node, int max)
+{
+ FormatNode *n;
+ int a;
+
+ elog(DEBUG_elog_output, "to_from-char(): DUMP FORMAT");
+
+ for (a = 0, n = node; a <= max; n++, a++)
+ {
+ if (n->type == NODE_TYPE_ACTION)
+ elog(DEBUG_elog_output, "%d:\t NODE_TYPE_ACTION '%s'\t(%s,%s)",
+ a, n->key->name, DUMP_THth(n->suffix), DUMP_FM(n->suffix));
+ else if (n->type == NODE_TYPE_CHAR)
+ elog(DEBUG_elog_output, "%d:\t NODE_TYPE_CHAR '%s'",
+ a, n->character);
+ else if (n->type == NODE_TYPE_END)
+ {
+ elog(DEBUG_elog_output, "%d:\t NODE_TYPE_END", a);
+ return;
+ }
+ else
+ elog(DEBUG_elog_output, "%d:\t unknown NODE!", a);
+ }
+}
+#endif /* DEBUG */
+
+/*****************************************************************************
+ * Private utils
+ *****************************************************************************/
+
+/* ----------
+ * Return ST/ND/RD/TH for simple (1..9) numbers
+ * type --> 0 upper, 1 lower
+ * ----------
+ */
+static const char *
+get_th(char *num, int type)
+{
+ int len = strlen(num),
+ last;
+
+ last = *(num + (len - 1));
+ if (!isdigit((unsigned char) last))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("\"%s\" is not a number", num)));
+
+ /*
+ * All "teens" (<x>1[0-9]) get 'TH/th', while <x>[02-9][123] still get
+ * 'ST/st', 'ND/nd', 'RD/rd', respectively
+ */
+ if ((len > 1) && (num[len - 2] == '1'))
+ last = 0;
+
+ switch (last)
+ {
+ case '1':
+ if (type == TH_UPPER)
+ return numTH[0];
+ return numth[0];
+ case '2':
+ if (type == TH_UPPER)
+ return numTH[1];
+ return numth[1];
+ case '3':
+ if (type == TH_UPPER)
+ return numTH[2];
+ return numth[2];
+ default:
+ if (type == TH_UPPER)
+ return numTH[3];
+ return numth[3];
+ }
+}
+
+/* ----------
+ * Convert string-number to ordinal string-number
+ * type --> 0 upper, 1 lower
+ * ----------
+ */
+static char *
+str_numth(char *dest, char *num, int type)
+{
+ if (dest != num)
+ strcpy(dest, num);
+ strcat(dest, get_th(num, type));
+ return dest;
+}
+
+/*****************************************************************************
+ * upper/lower/initcap functions
+ *****************************************************************************/
+
+#ifdef USE_ICU
+
+typedef int32_t (*ICU_Convert_Func) (UChar *dest, int32_t destCapacity,
+ const UChar *src, int32_t srcLength,
+ const char *locale,
+ UErrorCode *pErrorCode);
+
+static int32_t
+icu_convert_case(ICU_Convert_Func func, pg_locale_t mylocale,
+ UChar **buff_dest, UChar *buff_source, int32_t len_source)
+{
+ UErrorCode status;
+ int32_t len_dest;
+
+ len_dest = len_source; /* try first with same length */
+ *buff_dest = palloc(len_dest * sizeof(**buff_dest));
+ status = U_ZERO_ERROR;
+ len_dest = func(*buff_dest, len_dest, buff_source, len_source,
+ mylocale->info.icu.locale, &status);
+ if (status == U_BUFFER_OVERFLOW_ERROR)
+ {
+ /* try again with adjusted length */
+ pfree(*buff_dest);
+ *buff_dest = palloc(len_dest * sizeof(**buff_dest));
+ status = U_ZERO_ERROR;
+ len_dest = func(*buff_dest, len_dest, buff_source, len_source,
+ mylocale->info.icu.locale, &status);
+ }
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("case conversion failed: %s", u_errorName(status))));
+ return len_dest;
+}
+
+static int32_t
+u_strToTitle_default_BI(UChar *dest, int32_t destCapacity,
+ const UChar *src, int32_t srcLength,
+ const char *locale,
+ UErrorCode *pErrorCode)
+{
+ return u_strToTitle(dest, destCapacity, src, srcLength,
+ NULL, locale, pErrorCode);
+}
+
+#endif /* USE_ICU */
+
+/*
+ * If the system provides the needed functions for wide-character manipulation
+ * (which are all standardized by C99), then we implement upper/lower/initcap
+ * using wide-character functions, if necessary. Otherwise we use the
+ * traditional <ctype.h> functions, which of course will not work as desired
+ * in multibyte character sets. Note that in either case we are effectively
+ * assuming that the database character encoding matches the encoding implied
+ * by LC_CTYPE.
+ *
+ * If the system provides locale_t and associated functions (which are
+ * standardized by Open Group's XBD), we can support collations that are
+ * neither default nor C. The code is written to handle both combinations
+ * of have-wide-characters and have-locale_t, though it's rather unlikely
+ * a platform would have the latter without the former.
+ */
+
+/*
+ * collation-aware, wide-character-aware lower function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+str_tolower(const char *buff, size_t nbytes, Oid collid)
+{
+ char *result;
+
+ if (!buff)
+ return NULL;
+
+ if (!OidIsValid(collid))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for %s function",
+ "lower()"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+
+ /* C/POSIX collations use this path regardless of database encoding */
+ if (lc_ctype_is_c(collid))
+ {
+ result = asc_tolower(buff, nbytes);
+ }
+ else
+ {
+ pg_locale_t mylocale;
+
+ mylocale = pg_newlocale_from_collation(collid);
+
+#ifdef USE_ICU
+ if (mylocale && mylocale->provider == COLLPROVIDER_ICU)
+ {
+ int32_t len_uchar;
+ int32_t len_conv;
+ UChar *buff_uchar;
+ UChar *buff_conv;
+
+ len_uchar = icu_to_uchar(&buff_uchar, buff, nbytes);
+ len_conv = icu_convert_case(u_strToLower, mylocale,
+ &buff_conv, buff_uchar, len_uchar);
+ icu_from_uchar(&result, buff_conv, len_conv);
+ pfree(buff_uchar);
+ pfree(buff_conv);
+ }
+ else
+#endif
+ {
+ if (pg_database_encoding_max_length() > 1)
+ {
+ wchar_t *workspace;
+ size_t curr_char;
+ size_t result_size;
+
+ /* Overflow paranoia */
+ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t)))
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ /* Output workspace cannot have more codes than input bytes */
+ workspace = (wchar_t *) palloc((nbytes + 1) * sizeof(wchar_t));
+
+ char2wchar(workspace, nbytes + 1, buff, nbytes, mylocale);
+
+ for (curr_char = 0; workspace[curr_char] != 0; curr_char++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ workspace[curr_char] = towlower_l(workspace[curr_char], mylocale->info.lt);
+ else
+#endif
+ workspace[curr_char] = towlower(workspace[curr_char]);
+ }
+
+ /*
+ * Make result large enough; case change might change number
+ * of bytes
+ */
+ result_size = curr_char * pg_database_encoding_max_length() + 1;
+ result = palloc(result_size);
+
+ wchar2char(result, workspace, result_size, mylocale);
+ pfree(workspace);
+ }
+ else
+ {
+ char *p;
+
+ result = pnstrdup(buff, nbytes);
+
+ /*
+ * Note: we assume that tolower_l() will not be so broken as
+ * to need an isupper_l() guard test. When using the default
+ * collation, we apply the traditional Postgres behavior that
+ * forces ASCII-style treatment of I/i, but in non-default
+ * collations you get exactly what the collation says.
+ */
+ for (p = result; *p; p++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ *p = tolower_l((unsigned char) *p, mylocale->info.lt);
+ else
+#endif
+ *p = pg_tolower((unsigned char) *p);
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+/*
+ * collation-aware, wide-character-aware upper function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+str_toupper(const char *buff, size_t nbytes, Oid collid)
+{
+ char *result;
+
+ if (!buff)
+ return NULL;
+
+ if (!OidIsValid(collid))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for %s function",
+ "upper()"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+
+ /* C/POSIX collations use this path regardless of database encoding */
+ if (lc_ctype_is_c(collid))
+ {
+ result = asc_toupper(buff, nbytes);
+ }
+ else
+ {
+ pg_locale_t mylocale;
+
+ mylocale = pg_newlocale_from_collation(collid);
+
+#ifdef USE_ICU
+ if (mylocale && mylocale->provider == COLLPROVIDER_ICU)
+ {
+ int32_t len_uchar,
+ len_conv;
+ UChar *buff_uchar;
+ UChar *buff_conv;
+
+ len_uchar = icu_to_uchar(&buff_uchar, buff, nbytes);
+ len_conv = icu_convert_case(u_strToUpper, mylocale,
+ &buff_conv, buff_uchar, len_uchar);
+ icu_from_uchar(&result, buff_conv, len_conv);
+ pfree(buff_uchar);
+ pfree(buff_conv);
+ }
+ else
+#endif
+ {
+ if (pg_database_encoding_max_length() > 1)
+ {
+ wchar_t *workspace;
+ size_t curr_char;
+ size_t result_size;
+
+ /* Overflow paranoia */
+ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t)))
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ /* Output workspace cannot have more codes than input bytes */
+ workspace = (wchar_t *) palloc((nbytes + 1) * sizeof(wchar_t));
+
+ char2wchar(workspace, nbytes + 1, buff, nbytes, mylocale);
+
+ for (curr_char = 0; workspace[curr_char] != 0; curr_char++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ workspace[curr_char] = towupper_l(workspace[curr_char], mylocale->info.lt);
+ else
+#endif
+ workspace[curr_char] = towupper(workspace[curr_char]);
+ }
+
+ /*
+ * Make result large enough; case change might change number
+ * of bytes
+ */
+ result_size = curr_char * pg_database_encoding_max_length() + 1;
+ result = palloc(result_size);
+
+ wchar2char(result, workspace, result_size, mylocale);
+ pfree(workspace);
+ }
+ else
+ {
+ char *p;
+
+ result = pnstrdup(buff, nbytes);
+
+ /*
+ * Note: we assume that toupper_l() will not be so broken as
+ * to need an islower_l() guard test. When using the default
+ * collation, we apply the traditional Postgres behavior that
+ * forces ASCII-style treatment of I/i, but in non-default
+ * collations you get exactly what the collation says.
+ */
+ for (p = result; *p; p++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ *p = toupper_l((unsigned char) *p, mylocale->info.lt);
+ else
+#endif
+ *p = pg_toupper((unsigned char) *p);
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+/*
+ * collation-aware, wide-character-aware initcap function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+str_initcap(const char *buff, size_t nbytes, Oid collid)
+{
+ char *result;
+ int wasalnum = false;
+
+ if (!buff)
+ return NULL;
+
+ if (!OidIsValid(collid))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for %s function",
+ "initcap()"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+
+ /* C/POSIX collations use this path regardless of database encoding */
+ if (lc_ctype_is_c(collid))
+ {
+ result = asc_initcap(buff, nbytes);
+ }
+ else
+ {
+ pg_locale_t mylocale;
+
+ mylocale = pg_newlocale_from_collation(collid);
+
+#ifdef USE_ICU
+ if (mylocale && mylocale->provider == COLLPROVIDER_ICU)
+ {
+ int32_t len_uchar,
+ len_conv;
+ UChar *buff_uchar;
+ UChar *buff_conv;
+
+ len_uchar = icu_to_uchar(&buff_uchar, buff, nbytes);
+ len_conv = icu_convert_case(u_strToTitle_default_BI, mylocale,
+ &buff_conv, buff_uchar, len_uchar);
+ icu_from_uchar(&result, buff_conv, len_conv);
+ pfree(buff_uchar);
+ pfree(buff_conv);
+ }
+ else
+#endif
+ {
+ if (pg_database_encoding_max_length() > 1)
+ {
+ wchar_t *workspace;
+ size_t curr_char;
+ size_t result_size;
+
+ /* Overflow paranoia */
+ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t)))
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ /* Output workspace cannot have more codes than input bytes */
+ workspace = (wchar_t *) palloc((nbytes + 1) * sizeof(wchar_t));
+
+ char2wchar(workspace, nbytes + 1, buff, nbytes, mylocale);
+
+ for (curr_char = 0; workspace[curr_char] != 0; curr_char++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ {
+ if (wasalnum)
+ workspace[curr_char] = towlower_l(workspace[curr_char], mylocale->info.lt);
+ else
+ workspace[curr_char] = towupper_l(workspace[curr_char], mylocale->info.lt);
+ wasalnum = iswalnum_l(workspace[curr_char], mylocale->info.lt);
+ }
+ else
+#endif
+ {
+ if (wasalnum)
+ workspace[curr_char] = towlower(workspace[curr_char]);
+ else
+ workspace[curr_char] = towupper(workspace[curr_char]);
+ wasalnum = iswalnum(workspace[curr_char]);
+ }
+ }
+
+ /*
+ * Make result large enough; case change might change number
+ * of bytes
+ */
+ result_size = curr_char * pg_database_encoding_max_length() + 1;
+ result = palloc(result_size);
+
+ wchar2char(result, workspace, result_size, mylocale);
+ pfree(workspace);
+ }
+ else
+ {
+ char *p;
+
+ result = pnstrdup(buff, nbytes);
+
+ /*
+ * Note: we assume that toupper_l()/tolower_l() will not be so
+ * broken as to need guard tests. When using the default
+ * collation, we apply the traditional Postgres behavior that
+ * forces ASCII-style treatment of I/i, but in non-default
+ * collations you get exactly what the collation says.
+ */
+ for (p = result; *p; p++)
+ {
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ {
+ if (wasalnum)
+ *p = tolower_l((unsigned char) *p, mylocale->info.lt);
+ else
+ *p = toupper_l((unsigned char) *p, mylocale->info.lt);
+ wasalnum = isalnum_l((unsigned char) *p, mylocale->info.lt);
+ }
+ else
+#endif
+ {
+ if (wasalnum)
+ *p = pg_tolower((unsigned char) *p);
+ else
+ *p = pg_toupper((unsigned char) *p);
+ wasalnum = isalnum((unsigned char) *p);
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+/*
+ * ASCII-only lower function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_tolower(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ *p = pg_ascii_tolower((unsigned char) *p);
+
+ return result;
+}
+
+/*
+ * ASCII-only upper function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_toupper(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ *p = pg_ascii_toupper((unsigned char) *p);
+
+ return result;
+}
+
+/*
+ * ASCII-only initcap function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_initcap(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+ int wasalnum = false;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ {
+ char c;
+
+ if (wasalnum)
+ *p = c = pg_ascii_tolower((unsigned char) *p);
+ else
+ *p = c = pg_ascii_toupper((unsigned char) *p);
+ /* we don't trust isalnum() here */
+ wasalnum = ((c >= 'A' && c <= 'Z') ||
+ (c >= 'a' && c <= 'z') ||
+ (c >= '0' && c <= '9'));
+ }
+
+ return result;
+}
+
+/* convenience routines for when the input is null-terminated */
+
+static char *
+str_tolower_z(const char *buff, Oid collid)
+{
+ return str_tolower(buff, strlen(buff), collid);
+}
+
+static char *
+str_toupper_z(const char *buff, Oid collid)
+{
+ return str_toupper(buff, strlen(buff), collid);
+}
+
+static char *
+str_initcap_z(const char *buff, Oid collid)
+{
+ return str_initcap(buff, strlen(buff), collid);
+}
+
+static char *
+asc_tolower_z(const char *buff)
+{
+ return asc_tolower(buff, strlen(buff));
+}
+
+static char *
+asc_toupper_z(const char *buff)
+{
+ return asc_toupper(buff, strlen(buff));
+}
+
+/* asc_initcap_z is not currently needed */
+
+
+/* ----------
+ * Skip TM / th in FROM_CHAR
+ *
+ * If S_THth is on, skip two chars, assuming there are two available
+ * ----------
+ */
+#define SKIP_THth(ptr, _suf) \
+ do { \
+ if (S_THth(_suf)) \
+ { \
+ if (*(ptr)) (ptr) += pg_mblen(ptr); \
+ if (*(ptr)) (ptr) += pg_mblen(ptr); \
+ } \
+ } while (0)
+
+
+#ifdef DEBUG_TO_FROM_CHAR
+/* -----------
+ * DEBUG: Call for debug and for index checking; (Show ASCII char
+ * and defined keyword for each used position
+ * ----------
+ */
+static void
+dump_index(const KeyWord *k, const int *index)
+{
+ int i,
+ count = 0,
+ free_i = 0;
+
+ elog(DEBUG_elog_output, "TO-FROM_CHAR: Dump KeyWord Index:");
+
+ for (i = 0; i < KeyWord_INDEX_SIZE; i++)
+ {
+ if (index[i] != -1)
+ {
+ elog(DEBUG_elog_output, "\t%c: %s, ", i + 32, k[index[i]].name);
+ count++;
+ }
+ else
+ {
+ free_i++;
+ elog(DEBUG_elog_output, "\t(%d) %c %d", i, i + 32, index[i]);
+ }
+ }
+ elog(DEBUG_elog_output, "\n\t\tUsed positions: %d,\n\t\tFree positions: %d",
+ count, free_i);
+}
+#endif /* DEBUG */
+
+/* ----------
+ * Return true if next format picture is not digit value
+ * ----------
+ */
+static bool
+is_next_separator(FormatNode *n)
+{
+ if (n->type == NODE_TYPE_END)
+ return false;
+
+ if (n->type == NODE_TYPE_ACTION && S_THth(n->suffix))
+ return true;
+
+ /*
+ * Next node
+ */
+ n++;
+
+ /* end of format string is treated like a non-digit separator */
+ if (n->type == NODE_TYPE_END)
+ return true;
+
+ if (n->type == NODE_TYPE_ACTION)
+ {
+ if (n->key->is_digit)
+ return false;
+
+ return true;
+ }
+ else if (n->character[1] == '\0' &&
+ isdigit((unsigned char) n->character[0]))
+ return false;
+
+ return true; /* some non-digit input (separator) */
+}
+
+
+static int
+adjust_partial_year_to_2020(int year)
+{
+ /*
+ * Adjust all dates toward 2020; this is effectively what happens when we
+ * assume '70' is 1970 and '69' is 2069.
+ */
+ /* Force 0-69 into the 2000's */
+ if (year < 70)
+ return year + 2000;
+ /* Force 70-99 into the 1900's */
+ else if (year < 100)
+ return year + 1900;
+ /* Force 100-519 into the 2000's */
+ else if (year < 520)
+ return year + 2000;
+ /* Force 520-999 into the 1000's */
+ else if (year < 1000)
+ return year + 1000;
+ else
+ return year;
+}
+
+
+static int
+strspace_len(const char *str)
+{
+ int len = 0;
+
+ while (*str && isspace((unsigned char) *str))
+ {
+ str++;
+ len++;
+ }
+ return len;
+}
+
+/*
+ * Set the date mode of a from-char conversion.
+ *
+ * Puke if the date mode has already been set, and the caller attempts to set
+ * it to a conflicting mode.
+ *
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set.
+ */
+static void
+from_char_set_mode(TmFromChar *tmfc, const FromCharDateMode mode, bool *have_error)
+{
+ if (mode != FROM_CHAR_DATE_NONE)
+ {
+ if (tmfc->mode == FROM_CHAR_DATE_NONE)
+ tmfc->mode = mode;
+ else if (tmfc->mode != mode)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid combination of date conventions"),
+ errhint("Do not mix Gregorian and ISO week date "
+ "conventions in a formatting template."))));
+ }
+
+on_error:
+ return;
+}
+
+/*
+ * Set the integer pointed to by 'dest' to the given value.
+ *
+ * Puke if the destination integer has previously been set to some other
+ * non-zero value.
+ *
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set.
+ */
+static void
+from_char_set_int(int *dest, const int value, const FormatNode *node,
+ bool *have_error)
+{
+ if (*dest != 0 && *dest != value)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("conflicting values for \"%s\" field in "
+ "formatting string",
+ node->key->name),
+ errdetail("This value contradicts a previous setting "
+ "for the same field type."))));
+ *dest = value;
+
+on_error:
+ return;
+}
+
+/*
+ * Read a single integer from the source string, into the int pointed to by
+ * 'dest'. If 'dest' is NULL, the result is discarded.
+ *
+ * In fixed-width mode (the node does not have the FM suffix), consume at most
+ * 'len' characters. However, any leading whitespace isn't counted in 'len'.
+ *
+ * We use strtol() to recover the integer value from the source string, in
+ * accordance with the given FormatNode.
+ *
+ * If the conversion completes successfully, src will have been advanced to
+ * point at the character immediately following the last character used in the
+ * conversion.
+ *
+ * Return the number of characters consumed.
+ *
+ * Note that from_char_parse_int() provides a more convenient wrapper where
+ * the length of the field is the same as the length of the format keyword (as
+ * with DD and MI).
+ *
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set
+ * and -1 is returned.
+ */
+static int
+from_char_parse_int_len(int *dest, const char **src, const int len, FormatNode *node,
+ bool *have_error)
+{
+ long result;
+ char copy[DCH_MAX_ITEM_SIZ + 1];
+ const char *init = *src;
+ int used;
+
+ /*
+ * Skip any whitespace before parsing the integer.
+ */
+ *src += strspace_len(*src);
+
+ Assert(len <= DCH_MAX_ITEM_SIZ);
+ used = (int) strlcpy(copy, *src, len + 1);
+
+ if (S_FM(node->suffix) || is_next_separator(node))
+ {
+ /*
+ * This node is in Fill Mode, or the next node is known to be a
+ * non-digit value, so we just slurp as many characters as we can get.
+ */
+ char *endptr;
+
+ errno = 0;
+ result = strtol(init, &endptr, 10);
+ *src = endptr;
+ }
+ else
+ {
+ /*
+ * We need to pull exactly the number of characters given in 'len' out
+ * of the string, and convert those.
+ */
+ char *last;
+
+ if (used < len)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("source string too short for \"%s\" "
+ "formatting field",
+ node->key->name),
+ errdetail("Field requires %d characters, "
+ "but only %d remain.",
+ len, used),
+ errhint("If your source string is not fixed-width, "
+ "try using the \"FM\" modifier."))));
+
+ errno = 0;
+ result = strtol(copy, &last, 10);
+ used = last - copy;
+
+ if (used > 0 && used < len)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid value \"%s\" for \"%s\"",
+ copy, node->key->name),
+ errdetail("Field requires %d characters, "
+ "but only %d could be parsed.",
+ len, used),
+ errhint("If your source string is not fixed-width, "
+ "try using the \"FM\" modifier."))));
+
+ *src += used;
+ }
+
+ if (*src == init)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid value \"%s\" for \"%s\"",
+ copy, node->key->name),
+ errdetail("Value must be an integer."))));
+
+ if (errno == ERANGE || result < INT_MIN || result > INT_MAX)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("value for \"%s\" in source string is out of range",
+ node->key->name),
+ errdetail("Value must be in the range %d to %d.",
+ INT_MIN, INT_MAX))));
+
+ if (dest != NULL)
+ {
+ from_char_set_int(dest, (int) result, node, have_error);
+ CHECK_ERROR;
+ }
+
+ return *src - init;
+
+on_error:
+ return -1;
+}
+
+/*
+ * Call from_char_parse_int_len(), using the length of the format keyword as
+ * the expected length of the field.
+ *
+ * Don't call this function if the field differs in length from the format
+ * keyword (as with HH24; the keyword length is 4, but the field length is 2).
+ * In such cases, call from_char_parse_int_len() instead to specify the
+ * required length explicitly.
+ */
+static int
+from_char_parse_int(int *dest, const char **src, FormatNode *node, bool *have_error)
+{
+ return from_char_parse_int_len(dest, src, node->key->len, node, have_error);
+}
+
+/*
+ * Sequentially search null-terminated "array" for a case-insensitive match
+ * to the initial character(s) of "name".
+ *
+ * Returns array index of match, or -1 for no match.
+ *
+ * *len is set to the length of the match, or 0 for no match.
+ *
+ * Case-insensitivity is defined per pg_ascii_tolower, so this is only
+ * suitable for comparisons to ASCII strings.
+ */
+static int
+seq_search_ascii(const char *name, const char *const *array, int *len)
+{
+ unsigned char firstc;
+ const char *const *a;
+
+ *len = 0;
+
+ /* empty string can't match anything */
+ if (!*name)
+ return -1;
+
+ /* we handle first char specially to gain some speed */
+ firstc = pg_ascii_tolower((unsigned char) *name);
+
+ for (a = array; *a != NULL; a++)
+ {
+ const char *p;
+ const char *n;
+
+ /* compare first chars */
+ if (pg_ascii_tolower((unsigned char) **a) != firstc)
+ continue;
+
+ /* compare rest of string */
+ for (p = *a + 1, n = name + 1;; p++, n++)
+ {
+ /* return success if we matched whole array entry */
+ if (*p == '\0')
+ {
+ *len = n - name;
+ return a - array;
+ }
+ /* else, must have another character in "name" ... */
+ if (*n == '\0')
+ break;
+ /* ... and it must match */
+ if (pg_ascii_tolower((unsigned char) *p) !=
+ pg_ascii_tolower((unsigned char) *n))
+ break;
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * Sequentially search an array of possibly non-English words for
+ * a case-insensitive match to the initial character(s) of "name".
+ *
+ * This has the same API as seq_search_ascii(), but we use a more general
+ * case-folding transformation to achieve case-insensitivity. Case folding
+ * is done per the rules of the collation identified by "collid".
+ *
+ * The array is treated as const, but we don't declare it that way because
+ * the arrays exported by pg_locale.c aren't const.
+ */
+static int
+seq_search_localized(const char *name, char **array, int *len, Oid collid)
+{
+ char **a;
+ char *upper_name;
+ char *lower_name;
+
+ *len = 0;
+
+ /* empty string can't match anything */
+ if (!*name)
+ return -1;
+
+ /*
+ * The case-folding processing done below is fairly expensive, so before
+ * doing that, make a quick pass to see if there is an exact match.
+ */
+ for (a = array; *a != NULL; a++)
+ {
+ int element_len = strlen(*a);
+
+ if (strncmp(name, *a, element_len) == 0)
+ {
+ *len = element_len;
+ return a - array;
+ }
+ }
+
+ /*
+ * Fold to upper case, then to lower case, so that we can match reliably
+ * even in languages in which case conversions are not injective.
+ */
+ upper_name = str_toupper(unconstify(char *, name), strlen(name), collid);
+ lower_name = str_tolower(upper_name, strlen(upper_name), collid);
+ pfree(upper_name);
+
+ for (a = array; *a != NULL; a++)
+ {
+ char *upper_element;
+ char *lower_element;
+ int element_len;
+
+ /* Likewise upper/lower-case array element */
+ upper_element = str_toupper(*a, strlen(*a), collid);
+ lower_element = str_tolower(upper_element, strlen(upper_element),
+ collid);
+ pfree(upper_element);
+ element_len = strlen(lower_element);
+
+ /* Match? */
+ if (strncmp(lower_name, lower_element, element_len) == 0)
+ {
+ *len = element_len;
+ pfree(lower_element);
+ pfree(lower_name);
+ return a - array;
+ }
+ pfree(lower_element);
+ }
+
+ pfree(lower_name);
+ return -1;
+}
+
+/*
+ * Perform a sequential search in 'array' (or 'localized_array', if that's
+ * not NULL) for an entry matching the first character(s) of the 'src'
+ * string case-insensitively.
+ *
+ * The 'array' is presumed to be English words (all-ASCII), but
+ * if 'localized_array' is supplied, that might be non-English
+ * so we need a more expensive case-folding transformation
+ * (which will follow the rules of the collation 'collid').
+ *
+ * If a match is found, copy the array index of the match into the integer
+ * pointed to by 'dest', advance 'src' to the end of the part of the string
+ * which matched, and return the number of characters consumed.
+ *
+ * If the string doesn't match, throw an error if 'have_error' is NULL,
+ * otherwise set '*have_error' and return -1.
+ *
+ * 'node' is used only for error reports: node->key->name identifies the
+ * field type we were searching for.
+ */
+static int
+from_char_seq_search(int *dest, const char **src, const char *const *array,
+ char **localized_array, Oid collid,
+ FormatNode *node, bool *have_error)
+{
+ int len;
+
+ if (localized_array == NULL)
+ *dest = seq_search_ascii(*src, array, &len);
+ else
+ *dest = seq_search_localized(*src, localized_array, &len, collid);
+
+ if (len <= 0)
+ {
+ /*
+ * In the error report, truncate the string at the next whitespace (if
+ * any) to avoid including irrelevant data.
+ */
+ char *copy = pstrdup(*src);
+ char *c;
+
+ for (c = copy; *c; c++)
+ {
+ if (scanner_isspace(*c))
+ {
+ *c = '\0';
+ break;
+ }
+ }
+
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid value \"%s\" for \"%s\"",
+ copy, node->key->name),
+ errdetail("The given value did not match any of "
+ "the allowed values for this field."))));
+ }
+ *src += len;
+ return len;
+
+on_error:
+ return -1;
+}
+
+/* ----------
+ * Process a TmToChar struct as denoted by a list of FormatNodes.
+ * The formatted data is written to the string pointed to by 'out'.
+ * ----------
+ */
+static void
+DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid collid)
+{
+ FormatNode *n;
+ char *s;
+ struct fmt_tm *tm = &in->tm;
+ int i;
+
+ /* cache localized days and months */
+ cache_locale_time();
+
+ s = out;
+ for (n = node; n->type != NODE_TYPE_END; n++)
+ {
+ if (n->type != NODE_TYPE_ACTION)
+ {
+ strcpy(s, n->character);
+ s += strlen(s);
+ continue;
+ }
+
+ switch (n->key->id)
+ {
+ case DCH_A_M:
+ case DCH_P_M:
+ strcpy(s, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)
+ ? P_M_STR : A_M_STR);
+ s += strlen(s);
+ break;
+ case DCH_AM:
+ case DCH_PM:
+ strcpy(s, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)
+ ? PM_STR : AM_STR);
+ s += strlen(s);
+ break;
+ case DCH_a_m:
+ case DCH_p_m:
+ strcpy(s, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)
+ ? p_m_STR : a_m_STR);
+ s += strlen(s);
+ break;
+ case DCH_am:
+ case DCH_pm:
+ strcpy(s, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)
+ ? pm_STR : am_STR);
+ s += strlen(s);
+ break;
+ case DCH_HH:
+ case DCH_HH12:
+
+ /*
+ * display time as shown on a 12-hour clock, even for
+ * intervals
+ */
+ sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3,
+ tm->tm_hour % (HOURS_PER_DAY / 2) == 0 ?
+ (long long) (HOURS_PER_DAY / 2) :
+ (long long) (tm->tm_hour % (HOURS_PER_DAY / 2)));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_HH24:
+ sprintf(s, "%0*lld", S_FM(n->suffix) ? 0 : (tm->tm_hour >= 0) ? 2 : 3,
+ (long long) tm->tm_hour);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_MI:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (tm->tm_min >= 0) ? 2 : 3,
+ tm->tm_min);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_SS:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (tm->tm_sec >= 0) ? 2 : 3,
+ tm->tm_sec);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+
+#define DCH_to_char_fsec(frac_fmt, frac_val) \
+ sprintf(s, frac_fmt, (int) (frac_val)); \
+ if (S_THth(n->suffix)) \
+ str_numth(s, s, S_TH_TYPE(n->suffix)); \
+ s += strlen(s)
+
+ case DCH_FF1: /* tenth of second */
+ DCH_to_char_fsec("%01d", in->fsec / 100000);
+ break;
+ case DCH_FF2: /* hundredth of second */
+ DCH_to_char_fsec("%02d", in->fsec / 10000);
+ break;
+ case DCH_FF3:
+ case DCH_MS: /* millisecond */
+ DCH_to_char_fsec("%03d", in->fsec / 1000);
+ break;
+ case DCH_FF4: /* tenth of a millisecond */
+ DCH_to_char_fsec("%04d", in->fsec / 100);
+ break;
+ case DCH_FF5: /* hundredth of a millisecond */
+ DCH_to_char_fsec("%05d", in->fsec / 10);
+ break;
+ case DCH_FF6:
+ case DCH_US: /* microsecond */
+ DCH_to_char_fsec("%06d", in->fsec);
+ break;
+#undef DCH_to_char_fsec
+ case DCH_SSSS:
+ sprintf(s, "%lld",
+ (long long) (tm->tm_hour * SECS_PER_HOUR +
+ tm->tm_min * SECS_PER_MINUTE +
+ tm->tm_sec));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_tz:
+ INVALID_FOR_INTERVAL;
+ if (tmtcTzn(in))
+ {
+ /* We assume here that timezone names aren't localized */
+ char *p = asc_tolower_z(tmtcTzn(in));
+
+ strcpy(s, p);
+ pfree(p);
+ s += strlen(s);
+ }
+ break;
+ case DCH_TZ:
+ INVALID_FOR_INTERVAL;
+ if (tmtcTzn(in))
+ {
+ strcpy(s, tmtcTzn(in));
+ s += strlen(s);
+ }
+ break;
+ case DCH_TZH:
+ INVALID_FOR_INTERVAL;
+ sprintf(s, "%c%02d",
+ (tm->tm_gmtoff >= 0) ? '+' : '-',
+ abs((int) tm->tm_gmtoff) / SECS_PER_HOUR);
+ s += strlen(s);
+ break;
+ case DCH_TZM:
+ INVALID_FOR_INTERVAL;
+ sprintf(s, "%02d",
+ (abs((int) tm->tm_gmtoff) % SECS_PER_HOUR) / SECS_PER_MINUTE);
+ s += strlen(s);
+ break;
+ case DCH_OF:
+ INVALID_FOR_INTERVAL;
+ sprintf(s, "%c%0*d",
+ (tm->tm_gmtoff >= 0) ? '+' : '-',
+ S_FM(n->suffix) ? 0 : 2,
+ abs((int) tm->tm_gmtoff) / SECS_PER_HOUR);
+ s += strlen(s);
+ if (abs((int) tm->tm_gmtoff) % SECS_PER_HOUR != 0)
+ {
+ sprintf(s, ":%02d",
+ (abs((int) tm->tm_gmtoff) % SECS_PER_HOUR) / SECS_PER_MINUTE);
+ s += strlen(s);
+ }
+ break;
+ case DCH_A_D:
+ case DCH_B_C:
+ INVALID_FOR_INTERVAL;
+ strcpy(s, (tm->tm_year <= 0 ? B_C_STR : A_D_STR));
+ s += strlen(s);
+ break;
+ case DCH_AD:
+ case DCH_BC:
+ INVALID_FOR_INTERVAL;
+ strcpy(s, (tm->tm_year <= 0 ? BC_STR : AD_STR));
+ s += strlen(s);
+ break;
+ case DCH_a_d:
+ case DCH_b_c:
+ INVALID_FOR_INTERVAL;
+ strcpy(s, (tm->tm_year <= 0 ? b_c_STR : a_d_STR));
+ s += strlen(s);
+ break;
+ case DCH_ad:
+ case DCH_bc:
+ INVALID_FOR_INTERVAL;
+ strcpy(s, (tm->tm_year <= 0 ? bc_STR : ad_STR));
+ s += strlen(s);
+ break;
+ case DCH_MONTH:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_toupper_z(localized_full_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_toupper_z(months_full[tm->tm_mon - 1]));
+ s += strlen(s);
+ break;
+ case DCH_Month:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_initcap_z(localized_full_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ months_full[tm->tm_mon - 1]);
+ s += strlen(s);
+ break;
+ case DCH_month:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_tolower_z(localized_full_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_tolower_z(months_full[tm->tm_mon - 1]));
+ s += strlen(s);
+ break;
+ case DCH_MON:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_toupper_z(localized_abbrev_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, asc_toupper_z(months[tm->tm_mon - 1]));
+ s += strlen(s);
+ break;
+ case DCH_Mon:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_initcap_z(localized_abbrev_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, months[tm->tm_mon - 1]);
+ s += strlen(s);
+ break;
+ case DCH_mon:
+ INVALID_FOR_INTERVAL;
+ if (!tm->tm_mon)
+ break;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_tolower_z(localized_abbrev_months[tm->tm_mon - 1], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, asc_tolower_z(months[tm->tm_mon - 1]));
+ s += strlen(s);
+ break;
+ case DCH_MM:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (tm->tm_mon >= 0) ? 2 : 3,
+ tm->tm_mon);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_DAY:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_toupper_z(localized_full_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_toupper_z(days[tm->tm_wday]));
+ s += strlen(s);
+ break;
+ case DCH_Day:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_initcap_z(localized_full_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ days[tm->tm_wday]);
+ s += strlen(s);
+ break;
+ case DCH_day:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_tolower_z(localized_full_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_tolower_z(days[tm->tm_wday]));
+ s += strlen(s);
+ break;
+ case DCH_DY:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_toupper_z(localized_abbrev_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, asc_toupper_z(days_short[tm->tm_wday]));
+ s += strlen(s);
+ break;
+ case DCH_Dy:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_initcap_z(localized_abbrev_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, days_short[tm->tm_wday]);
+ s += strlen(s);
+ break;
+ case DCH_dy:
+ INVALID_FOR_INTERVAL;
+ if (S_TM(n->suffix))
+ {
+ char *str = str_tolower_z(localized_abbrev_days[tm->tm_wday], collid);
+
+ if (strlen(str) <= (n->key->len + TM_SUFFIX_LEN) * DCH_MAX_ITEM_SIZ)
+ strcpy(s, str);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("localized string format value too long")));
+ }
+ else
+ strcpy(s, asc_tolower_z(days_short[tm->tm_wday]));
+ s += strlen(s);
+ break;
+ case DCH_DDD:
+ case DCH_IDDD:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 3,
+ (n->key->id == DCH_DDD) ?
+ tm->tm_yday :
+ date2isoyearday(tm->tm_year, tm->tm_mon, tm->tm_mday));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_DD:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2, tm->tm_mday);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_D:
+ INVALID_FOR_INTERVAL;
+ sprintf(s, "%d", tm->tm_wday + 1);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_ID:
+ INVALID_FOR_INTERVAL;
+ sprintf(s, "%d", (tm->tm_wday == 0) ? 7 : tm->tm_wday);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_WW:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2,
+ (tm->tm_yday - 1) / 7 + 1);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_IW:
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : 2,
+ date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_Q:
+ if (!tm->tm_mon)
+ break;
+ sprintf(s, "%d", (tm->tm_mon - 1) / 3 + 1);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_CC:
+ if (is_interval) /* straight calculation */
+ i = tm->tm_year / 100;
+ else
+ {
+ if (tm->tm_year > 0)
+ /* Century 20 == 1901 - 2000 */
+ i = (tm->tm_year - 1) / 100 + 1;
+ else
+ /* Century 6BC == 600BC - 501BC */
+ i = tm->tm_year / 100 - 1;
+ }
+ if (i <= 99 && i >= -99)
+ sprintf(s, "%0*d", S_FM(n->suffix) ? 0 : (i >= 0) ? 2 : 3, i);
+ else
+ sprintf(s, "%d", i);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_Y_YYY:
+ i = ADJUST_YEAR(tm->tm_year, is_interval) / 1000;
+ sprintf(s, "%d,%03d", i,
+ ADJUST_YEAR(tm->tm_year, is_interval) - (i * 1000));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_YYYY:
+ case DCH_IYYY:
+ sprintf(s, "%0*d",
+ S_FM(n->suffix) ? 0 :
+ (ADJUST_YEAR(tm->tm_year, is_interval) >= 0) ? 4 : 5,
+ (n->key->id == DCH_YYYY ?
+ ADJUST_YEAR(tm->tm_year, is_interval) :
+ ADJUST_YEAR(date2isoyear(tm->tm_year,
+ tm->tm_mon,
+ tm->tm_mday),
+ is_interval)));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_YYY:
+ case DCH_IYY:
+ sprintf(s, "%0*d",
+ S_FM(n->suffix) ? 0 :
+ (ADJUST_YEAR(tm->tm_year, is_interval) >= 0) ? 3 : 4,
+ (n->key->id == DCH_YYY ?
+ ADJUST_YEAR(tm->tm_year, is_interval) :
+ ADJUST_YEAR(date2isoyear(tm->tm_year,
+ tm->tm_mon,
+ tm->tm_mday),
+ is_interval)) % 1000);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_YY:
+ case DCH_IY:
+ sprintf(s, "%0*d",
+ S_FM(n->suffix) ? 0 :
+ (ADJUST_YEAR(tm->tm_year, is_interval) >= 0) ? 2 : 3,
+ (n->key->id == DCH_YY ?
+ ADJUST_YEAR(tm->tm_year, is_interval) :
+ ADJUST_YEAR(date2isoyear(tm->tm_year,
+ tm->tm_mon,
+ tm->tm_mday),
+ is_interval)) % 100);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_Y:
+ case DCH_I:
+ sprintf(s, "%1d",
+ (n->key->id == DCH_Y ?
+ ADJUST_YEAR(tm->tm_year, is_interval) :
+ ADJUST_YEAR(date2isoyear(tm->tm_year,
+ tm->tm_mon,
+ tm->tm_mday),
+ is_interval)) % 10);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_RM:
+ /* FALLTHROUGH */
+ case DCH_rm:
+
+ /*
+ * For intervals, values like '12 month' will be reduced to 0
+ * month and some years. These should be processed.
+ */
+ if (!tm->tm_mon && !tm->tm_year)
+ break;
+ else
+ {
+ int mon = 0;
+ const char *const *months;
+
+ if (n->key->id == DCH_RM)
+ months = rm_months_upper;
+ else
+ months = rm_months_lower;
+
+ /*
+ * Compute the position in the roman-numeral array. Note
+ * that the contents of the array are reversed, December
+ * being first and January last.
+ */
+ if (tm->tm_mon == 0)
+ {
+ /*
+ * This case is special, and tracks the case of full
+ * interval years.
+ */
+ mon = tm->tm_year >= 0 ? 0 : MONTHS_PER_YEAR - 1;
+ }
+ else if (tm->tm_mon < 0)
+ {
+ /*
+ * Negative case. In this case, the calculation is
+ * reversed, where -1 means December, -2 November,
+ * etc.
+ */
+ mon = -1 * (tm->tm_mon + 1);
+ }
+ else
+ {
+ /*
+ * Common case, with a strictly positive value. The
+ * position in the array matches with the value of
+ * tm_mon.
+ */
+ mon = MONTHS_PER_YEAR - tm->tm_mon;
+ }
+
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -4,
+ months[mon]);
+ s += strlen(s);
+ }
+ break;
+ case DCH_W:
+ sprintf(s, "%d", (tm->tm_mday - 1) / 7 + 1);
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ case DCH_J:
+ sprintf(s, "%d", date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
+ if (S_THth(n->suffix))
+ str_numth(s, s, S_TH_TYPE(n->suffix));
+ s += strlen(s);
+ break;
+ }
+ }
+
+ *s = '\0';
+}
+
+/*
+ * Process the string 'in' as denoted by the array of FormatNodes 'node[]'.
+ * The TmFromChar struct pointed to by 'out' is populated with the results.
+ *
+ * 'collid' identifies the collation to use, if needed.
+ * 'std' specifies standard parsing mode.
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set.
+ *
+ * Note: we currently don't have any to_interval() function, so there
+ * is no need here for INVALID_FOR_INTERVAL checks.
+ */
+static void
+DCH_from_char(FormatNode *node, const char *in, TmFromChar *out,
+ Oid collid, bool std, bool *have_error)
+{
+ FormatNode *n;
+ const char *s;
+ int len,
+ value;
+ bool fx_mode = std;
+
+ /* number of extra skipped characters (more than given in format string) */
+ int extra_skip = 0;
+
+ /* cache localized days and months */
+ cache_locale_time();
+
+ for (n = node, s = in; n->type != NODE_TYPE_END && *s != '\0'; n++)
+ {
+ /*
+ * Ignore spaces at the beginning of the string and before fields when
+ * not in FX (fixed width) mode.
+ */
+ if (!fx_mode && (n->type != NODE_TYPE_ACTION || n->key->id != DCH_FX) &&
+ (n->type == NODE_TYPE_ACTION || n == node))
+ {
+ while (*s != '\0' && isspace((unsigned char) *s))
+ {
+ s++;
+ extra_skip++;
+ }
+ }
+
+ if (n->type == NODE_TYPE_SPACE || n->type == NODE_TYPE_SEPARATOR)
+ {
+ if (std)
+ {
+ /*
+ * Standard mode requires strict matching between format
+ * string separators/spaces and input string.
+ */
+ Assert(n->character[0] && !n->character[1]);
+
+ if (*s == n->character[0])
+ s++;
+ else
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("unmatched format separator \"%c\"",
+ n->character[0]))));
+ }
+ else if (!fx_mode)
+ {
+ /*
+ * In non FX (fixed format) mode one format string space or
+ * separator match to one space or separator in input string.
+ * Or match nothing if there is no space or separator in the
+ * current position of input string.
+ */
+ extra_skip--;
+ if (isspace((unsigned char) *s) || is_separator_char(s))
+ {
+ s++;
+ extra_skip++;
+ }
+ }
+ else
+ {
+ /*
+ * In FX mode, on format string space or separator we consume
+ * exactly one character from input string. Notice we don't
+ * insist that the consumed character match the format's
+ * character.
+ */
+ s += pg_mblen(s);
+ }
+ continue;
+ }
+ else if (n->type != NODE_TYPE_ACTION)
+ {
+ /*
+ * Text character, so consume one character from input string.
+ * Notice we don't insist that the consumed character match the
+ * format's character.
+ */
+ if (!fx_mode)
+ {
+ /*
+ * In non FX mode we might have skipped some extra characters
+ * (more than specified in format string) before. In this
+ * case we don't skip input string character, because it might
+ * be part of field.
+ */
+ if (extra_skip > 0)
+ extra_skip--;
+ else
+ s += pg_mblen(s);
+ }
+ else
+ {
+ int chlen = pg_mblen(s);
+
+ /*
+ * Standard mode requires strict match of format characters.
+ */
+ if (std && n->type == NODE_TYPE_CHAR &&
+ strncmp(s, n->character, chlen) != 0)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("unmatched format character \"%s\"",
+ n->character))));
+
+ s += chlen;
+ }
+ continue;
+ }
+
+ from_char_set_mode(out, n->key->date_mode, have_error);
+ CHECK_ERROR;
+
+ switch (n->key->id)
+ {
+ case DCH_FX:
+ fx_mode = true;
+ break;
+ case DCH_A_M:
+ case DCH_P_M:
+ case DCH_a_m:
+ case DCH_p_m:
+ from_char_seq_search(&value, &s, ampm_strings_long,
+ NULL, InvalidOid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->pm, value % 2, n, have_error);
+ CHECK_ERROR;
+ out->clock = CLOCK_12_HOUR;
+ break;
+ case DCH_AM:
+ case DCH_PM:
+ case DCH_am:
+ case DCH_pm:
+ from_char_seq_search(&value, &s, ampm_strings,
+ NULL, InvalidOid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->pm, value % 2, n, have_error);
+ CHECK_ERROR;
+ out->clock = CLOCK_12_HOUR;
+ break;
+ case DCH_HH:
+ case DCH_HH12:
+ from_char_parse_int_len(&out->hh, &s, 2, n, have_error);
+ CHECK_ERROR;
+ out->clock = CLOCK_12_HOUR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_HH24:
+ from_char_parse_int_len(&out->hh, &s, 2, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_MI:
+ from_char_parse_int(&out->mi, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_SS:
+ from_char_parse_int(&out->ss, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_MS: /* millisecond */
+ len = from_char_parse_int_len(&out->ms, &s, 3, n, have_error);
+ CHECK_ERROR;
+
+ /*
+ * 25 is 0.25 and 250 is 0.25 too; 025 is 0.025 and not 0.25
+ */
+ out->ms *= len == 1 ? 100 :
+ len == 2 ? 10 : 1;
+
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_FF1:
+ case DCH_FF2:
+ case DCH_FF3:
+ case DCH_FF4:
+ case DCH_FF5:
+ case DCH_FF6:
+ out->ff = n->key->id - DCH_FF1 + 1;
+ /* fall through */
+ case DCH_US: /* microsecond */
+ len = from_char_parse_int_len(&out->us, &s,
+ n->key->id == DCH_US ? 6 :
+ out->ff, n, have_error);
+ CHECK_ERROR;
+
+ out->us *= len == 1 ? 100000 :
+ len == 2 ? 10000 :
+ len == 3 ? 1000 :
+ len == 4 ? 100 :
+ len == 5 ? 10 : 1;
+
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_SSSS:
+ from_char_parse_int(&out->ssss, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_tz:
+ case DCH_TZ:
+ case DCH_OF:
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("formatting field \"%s\" is only supported in to_char",
+ n->key->name))));
+ CHECK_ERROR;
+ break;
+ case DCH_TZH:
+
+ /*
+ * Value of TZH might be negative. And the issue is that we
+ * might swallow minus sign as the separator. So, if we have
+ * skipped more characters than specified in the format
+ * string, then we consider prepending last skipped minus to
+ * TZH.
+ */
+ if (*s == '+' || *s == '-' || *s == ' ')
+ {
+ out->tzsign = *s == '-' ? -1 : +1;
+ s++;
+ }
+ else
+ {
+ if (extra_skip > 0 && *(s - 1) == '-')
+ out->tzsign = -1;
+ else
+ out->tzsign = +1;
+ }
+
+ from_char_parse_int_len(&out->tzh, &s, 2, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_TZM:
+ /* assign positive timezone sign if TZH was not seen before */
+ if (!out->tzsign)
+ out->tzsign = +1;
+ from_char_parse_int_len(&out->tzm, &s, 2, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_A_D:
+ case DCH_B_C:
+ case DCH_a_d:
+ case DCH_b_c:
+ from_char_seq_search(&value, &s, adbc_strings_long,
+ NULL, InvalidOid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->bc, value % 2, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_AD:
+ case DCH_BC:
+ case DCH_ad:
+ case DCH_bc:
+ from_char_seq_search(&value, &s, adbc_strings,
+ NULL, InvalidOid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->bc, value % 2, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_MONTH:
+ case DCH_Month:
+ case DCH_month:
+ from_char_seq_search(&value, &s, months_full,
+ S_TM(n->suffix) ? localized_full_months : NULL,
+ collid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->mm, value + 1, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_MON:
+ case DCH_Mon:
+ case DCH_mon:
+ from_char_seq_search(&value, &s, months,
+ S_TM(n->suffix) ? localized_abbrev_months : NULL,
+ collid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->mm, value + 1, n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_MM:
+ from_char_parse_int(&out->mm, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_DAY:
+ case DCH_Day:
+ case DCH_day:
+ from_char_seq_search(&value, &s, days,
+ S_TM(n->suffix) ? localized_full_days : NULL,
+ collid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->d, value, n, have_error);
+ CHECK_ERROR;
+ out->d++;
+ break;
+ case DCH_DY:
+ case DCH_Dy:
+ case DCH_dy:
+ from_char_seq_search(&value, &s, days_short,
+ S_TM(n->suffix) ? localized_abbrev_days : NULL,
+ collid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->d, value, n, have_error);
+ CHECK_ERROR;
+ out->d++;
+ break;
+ case DCH_DDD:
+ from_char_parse_int(&out->ddd, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_IDDD:
+ from_char_parse_int_len(&out->ddd, &s, 3, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_DD:
+ from_char_parse_int(&out->dd, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_D:
+ from_char_parse_int(&out->d, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_ID:
+ from_char_parse_int_len(&out->d, &s, 1, n, have_error);
+ CHECK_ERROR;
+ /* Shift numbering to match Gregorian where Sunday = 1 */
+ if (++out->d > 7)
+ out->d = 1;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_WW:
+ case DCH_IW:
+ from_char_parse_int(&out->ww, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_Q:
+
+ /*
+ * We ignore 'Q' when converting to date because it is unclear
+ * which date in the quarter to use, and some people specify
+ * both quarter and month, so if it was honored it might
+ * conflict with the supplied month. That is also why we don't
+ * throw an error.
+ *
+ * We still parse the source string for an integer, but it
+ * isn't stored anywhere in 'out'.
+ */
+ from_char_parse_int((int *) NULL, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_CC:
+ from_char_parse_int(&out->cc, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_Y_YYY:
+ {
+ int matched,
+ years,
+ millennia,
+ nch;
+
+ matched = sscanf(s, "%d,%03d%n", &millennia, &years, &nch);
+ if (matched < 2)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("invalid input string for \"Y,YYY\""))));
+ years += (millennia * 1000);
+ from_char_set_int(&out->year, years, n, have_error);
+ CHECK_ERROR;
+ out->yysz = 4;
+ s += nch;
+ SKIP_THth(s, n->suffix);
+ }
+ break;
+ case DCH_YYYY:
+ case DCH_IYYY:
+ from_char_parse_int(&out->year, &s, n, have_error);
+ CHECK_ERROR;
+ out->yysz = 4;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_YYY:
+ case DCH_IYY:
+ len = from_char_parse_int(&out->year, &s, n, have_error);
+ CHECK_ERROR;
+ if (len < 4)
+ out->year = adjust_partial_year_to_2020(out->year);
+ out->yysz = 3;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_YY:
+ case DCH_IY:
+ len = from_char_parse_int(&out->year, &s, n, have_error);
+ CHECK_ERROR;
+ if (len < 4)
+ out->year = adjust_partial_year_to_2020(out->year);
+ out->yysz = 2;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_Y:
+ case DCH_I:
+ len = from_char_parse_int(&out->year, &s, n, have_error);
+ CHECK_ERROR;
+ if (len < 4)
+ out->year = adjust_partial_year_to_2020(out->year);
+ out->yysz = 1;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_RM:
+ case DCH_rm:
+ from_char_seq_search(&value, &s, rm_months_lower,
+ NULL, InvalidOid,
+ n, have_error);
+ CHECK_ERROR;
+ from_char_set_int(&out->mm, MONTHS_PER_YEAR - value,
+ n, have_error);
+ CHECK_ERROR;
+ break;
+ case DCH_W:
+ from_char_parse_int(&out->w, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ case DCH_J:
+ from_char_parse_int(&out->j, &s, n, have_error);
+ CHECK_ERROR;
+ SKIP_THth(s, n->suffix);
+ break;
+ }
+
+ /* Ignore all spaces after fields */
+ if (!fx_mode)
+ {
+ extra_skip = 0;
+ while (*s != '\0' && isspace((unsigned char) *s))
+ {
+ s++;
+ extra_skip++;
+ }
+ }
+ }
+
+ /*
+ * Standard parsing mode doesn't allow unmatched format patterns or
+ * trailing characters in the input string.
+ */
+ if (std)
+ {
+ if (n->type != NODE_TYPE_END)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("input string is too short for datetime format"))));
+
+ while (*s != '\0' && isspace((unsigned char) *s))
+ s++;
+
+ if (*s != '\0')
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("trailing characters remain in input string "
+ "after datetime format"))));
+ }
+
+on_error:
+ return;
+}
+
+/*
+ * The invariant for DCH cache entry management is that DCHCounter is equal
+ * to the maximum age value among the existing entries, and we increment it
+ * whenever an access occurs. If we approach overflow, deal with that by
+ * halving all the age values, so that we retain a fairly accurate idea of
+ * which entries are oldest.
+ */
+static inline void
+DCH_prevent_counter_overflow(void)
+{
+ if (DCHCounter >= (INT_MAX - 1))
+ {
+ for (int i = 0; i < n_DCHCache; i++)
+ DCHCache[i]->age >>= 1;
+ DCHCounter >>= 1;
+ }
+}
+
+/*
+ * Get mask of date/time/zone components present in format nodes.
+ *
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set.
+ */
+static int
+DCH_datetime_type(FormatNode *node, bool *have_error)
+{
+ FormatNode *n;
+ int flags = 0;
+
+ for (n = node; n->type != NODE_TYPE_END; n++)
+ {
+ if (n->type != NODE_TYPE_ACTION)
+ continue;
+
+ switch (n->key->id)
+ {
+ case DCH_FX:
+ break;
+ case DCH_A_M:
+ case DCH_P_M:
+ case DCH_a_m:
+ case DCH_p_m:
+ case DCH_AM:
+ case DCH_PM:
+ case DCH_am:
+ case DCH_pm:
+ case DCH_HH:
+ case DCH_HH12:
+ case DCH_HH24:
+ case DCH_MI:
+ case DCH_SS:
+ case DCH_MS: /* millisecond */
+ case DCH_US: /* microsecond */
+ case DCH_FF1:
+ case DCH_FF2:
+ case DCH_FF3:
+ case DCH_FF4:
+ case DCH_FF5:
+ case DCH_FF6:
+ case DCH_SSSS:
+ flags |= DCH_TIMED;
+ break;
+ case DCH_tz:
+ case DCH_TZ:
+ case DCH_OF:
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("formatting field \"%s\" is only supported in to_char",
+ n->key->name))));
+ flags |= DCH_ZONED;
+ break;
+ case DCH_TZH:
+ case DCH_TZM:
+ flags |= DCH_ZONED;
+ break;
+ case DCH_A_D:
+ case DCH_B_C:
+ case DCH_a_d:
+ case DCH_b_c:
+ case DCH_AD:
+ case DCH_BC:
+ case DCH_ad:
+ case DCH_bc:
+ case DCH_MONTH:
+ case DCH_Month:
+ case DCH_month:
+ case DCH_MON:
+ case DCH_Mon:
+ case DCH_mon:
+ case DCH_MM:
+ case DCH_DAY:
+ case DCH_Day:
+ case DCH_day:
+ case DCH_DY:
+ case DCH_Dy:
+ case DCH_dy:
+ case DCH_DDD:
+ case DCH_IDDD:
+ case DCH_DD:
+ case DCH_D:
+ case DCH_ID:
+ case DCH_WW:
+ case DCH_Q:
+ case DCH_CC:
+ case DCH_Y_YYY:
+ case DCH_YYYY:
+ case DCH_IYYY:
+ case DCH_YYY:
+ case DCH_IYY:
+ case DCH_YY:
+ case DCH_IY:
+ case DCH_Y:
+ case DCH_I:
+ case DCH_RM:
+ case DCH_rm:
+ case DCH_W:
+ case DCH_J:
+ flags |= DCH_DATED;
+ break;
+ }
+ }
+
+on_error:
+ return flags;
+}
+
+/* select a DCHCacheEntry to hold the given format picture */
+static DCHCacheEntry *
+DCH_cache_getnew(const char *str, bool std)
+{
+ DCHCacheEntry *ent;
+
+ /* Ensure we can advance DCHCounter below */
+ DCH_prevent_counter_overflow();
+
+ /*
+ * If cache is full, remove oldest entry (or recycle first not-valid one)
+ */
+ if (n_DCHCache >= DCH_CACHE_ENTRIES)
+ {
+ DCHCacheEntry *old = DCHCache[0];
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "cache is full (%d)", n_DCHCache);
+#endif
+ if (old->valid)
+ {
+ for (int i = 1; i < DCH_CACHE_ENTRIES; i++)
+ {
+ ent = DCHCache[i];
+ if (!ent->valid)
+ {
+ old = ent;
+ break;
+ }
+ if (ent->age < old->age)
+ old = ent;
+ }
+ }
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "OLD: '%s' AGE: %d", old->str, old->age);
+#endif
+ old->valid = false;
+ strlcpy(old->str, str, DCH_CACHE_SIZE + 1);
+ old->age = (++DCHCounter);
+ /* caller is expected to fill format, then set valid */
+ return old;
+ }
+ else
+ {
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "NEW (%d)", n_DCHCache);
+#endif
+ Assert(DCHCache[n_DCHCache] == NULL);
+ DCHCache[n_DCHCache] = ent = (DCHCacheEntry *)
+ MemoryContextAllocZero(TopMemoryContext, sizeof(DCHCacheEntry));
+ ent->valid = false;
+ strlcpy(ent->str, str, DCH_CACHE_SIZE + 1);
+ ent->std = std;
+ ent->age = (++DCHCounter);
+ /* caller is expected to fill format, then set valid */
+ ++n_DCHCache;
+ return ent;
+ }
+}
+
+/* look for an existing DCHCacheEntry matching the given format picture */
+static DCHCacheEntry *
+DCH_cache_search(const char *str, bool std)
+{
+ /* Ensure we can advance DCHCounter below */
+ DCH_prevent_counter_overflow();
+
+ for (int i = 0; i < n_DCHCache; i++)
+ {
+ DCHCacheEntry *ent = DCHCache[i];
+
+ if (ent->valid && strcmp(ent->str, str) == 0 && ent->std == std)
+ {
+ ent->age = (++DCHCounter);
+ return ent;
+ }
+ }
+
+ return NULL;
+}
+
+/* Find or create a DCHCacheEntry for the given format picture */
+static DCHCacheEntry *
+DCH_cache_fetch(const char *str, bool std)
+{
+ DCHCacheEntry *ent;
+
+ if ((ent = DCH_cache_search(str, std)) == NULL)
+ {
+ /*
+ * Not in the cache, must run parser and save a new format-picture to
+ * the cache. Do not mark the cache entry valid until parsing
+ * succeeds.
+ */
+ ent = DCH_cache_getnew(str, std);
+
+ parse_format(ent->format, str, DCH_keywords, DCH_suff, DCH_index,
+ DCH_FLAG | (std ? STD_FLAG : 0), NULL);
+
+ ent->valid = true;
+ }
+ return ent;
+}
+
+/*
+ * Format a date/time or interval into a string according to fmt.
+ * We parse fmt into a list of FormatNodes. This is then passed to DCH_to_char
+ * for formatting.
+ */
+static text *
+datetime_to_char_body(TmToChar *tmtc, text *fmt, bool is_interval, Oid collid)
+{
+ FormatNode *format;
+ char *fmt_str,
+ *result;
+ bool incache;
+ int fmt_len;
+ text *res;
+
+ /*
+ * Convert fmt to C string
+ */
+ fmt_str = text_to_cstring(fmt);
+ fmt_len = strlen(fmt_str);
+
+ /*
+ * Allocate workspace for result as C string
+ */
+ result = palloc((fmt_len * DCH_MAX_ITEM_SIZ) + 1);
+ *result = '\0';
+
+ if (fmt_len > DCH_CACHE_SIZE)
+ {
+ /*
+ * Allocate new memory if format picture is bigger than static cache
+ * and do not use cache (call parser always)
+ */
+ incache = false;
+
+ format = (FormatNode *) palloc((fmt_len + 1) * sizeof(FormatNode));
+
+ parse_format(format, fmt_str, DCH_keywords,
+ DCH_suff, DCH_index, DCH_FLAG, NULL);
+ }
+ else
+ {
+ /*
+ * Use cache buffers
+ */
+ DCHCacheEntry *ent = DCH_cache_fetch(fmt_str, false);
+
+ incache = true;
+ format = ent->format;
+ }
+
+ /* The real work is here */
+ DCH_to_char(format, is_interval, tmtc, result, collid);
+
+ if (!incache)
+ pfree(format);
+
+ pfree(fmt_str);
+
+ /* convert C-string result to TEXT format */
+ res = cstring_to_text(result);
+
+ pfree(result);
+ return res;
+}
+
+/****************************************************************************
+ * Public routines
+ ***************************************************************************/
+
+/* -------------------
+ * TIMESTAMP to_char()
+ * -------------------
+ */
+Datum
+timestamp_to_char(PG_FUNCTION_ARGS)
+{
+ Timestamp dt = PG_GETARG_TIMESTAMP(0);
+ text *fmt = PG_GETARG_TEXT_PP(1),
+ *res;
+ TmToChar tmtc;
+ struct pg_tm tt;
+ struct fmt_tm *tm;
+ int thisdate;
+
+ if (VARSIZE_ANY_EXHDR(fmt) <= 0 || TIMESTAMP_NOT_FINITE(dt))
+ PG_RETURN_NULL();
+
+ ZERO_tmtc(&tmtc);
+ tm = tmtcTm(&tmtc);
+
+ if (timestamp2tm(dt, NULL, &tt, &tmtcFsec(&tmtc), NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* calculate wday and yday, because timestamp2tm doesn't */
+ thisdate = date2j(tt.tm_year, tt.tm_mon, tt.tm_mday);
+ tt.tm_wday = (thisdate + 1) % 7;
+ tt.tm_yday = thisdate - date2j(tt.tm_year, 1, 1) + 1;
+
+ COPY_tm(tm, &tt);
+
+ if (!(res = datetime_to_char_body(&tmtc, fmt, false, PG_GET_COLLATION())))
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(res);
+}
+
+Datum
+timestamptz_to_char(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt = PG_GETARG_TIMESTAMP(0);
+ text *fmt = PG_GETARG_TEXT_PP(1),
+ *res;
+ TmToChar tmtc;
+ int tz;
+ struct pg_tm tt;
+ struct fmt_tm *tm;
+ int thisdate;
+
+ if (VARSIZE_ANY_EXHDR(fmt) <= 0 || TIMESTAMP_NOT_FINITE(dt))
+ PG_RETURN_NULL();
+
+ ZERO_tmtc(&tmtc);
+ tm = tmtcTm(&tmtc);
+
+ if (timestamp2tm(dt, &tz, &tt, &tmtcFsec(&tmtc), &tmtcTzn(&tmtc), NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* calculate wday and yday, because timestamp2tm doesn't */
+ thisdate = date2j(tt.tm_year, tt.tm_mon, tt.tm_mday);
+ tt.tm_wday = (thisdate + 1) % 7;
+ tt.tm_yday = thisdate - date2j(tt.tm_year, 1, 1) + 1;
+
+ COPY_tm(tm, &tt);
+
+ if (!(res = datetime_to_char_body(&tmtc, fmt, false, PG_GET_COLLATION())))
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(res);
+}
+
+
+/* -------------------
+ * INTERVAL to_char()
+ * -------------------
+ */
+Datum
+interval_to_char(PG_FUNCTION_ARGS)
+{
+ Interval *it = PG_GETARG_INTERVAL_P(0);
+ text *fmt = PG_GETARG_TEXT_PP(1),
+ *res;
+ TmToChar tmtc;
+ struct fmt_tm *tm;
+ struct pg_itm tt,
+ *itm = &tt;
+
+ if (VARSIZE_ANY_EXHDR(fmt) <= 0)
+ PG_RETURN_NULL();
+
+ ZERO_tmtc(&tmtc);
+ tm = tmtcTm(&tmtc);
+
+ interval2itm(*it, itm);
+ tmtc.fsec = itm->tm_usec;
+ tm->tm_sec = itm->tm_sec;
+ tm->tm_min = itm->tm_min;
+ tm->tm_hour = itm->tm_hour;
+ tm->tm_mday = itm->tm_mday;
+ tm->tm_mon = itm->tm_mon;
+ tm->tm_year = itm->tm_year;
+
+ /* wday is meaningless, yday approximates the total span in days */
+ tm->tm_yday = (tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon) * DAYS_PER_MONTH + tm->tm_mday;
+
+ if (!(res = datetime_to_char_body(&tmtc, fmt, true, PG_GET_COLLATION())))
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(res);
+}
+
+/* ---------------------
+ * TO_TIMESTAMP()
+ *
+ * Make Timestamp from date_str which is formatted at argument 'fmt'
+ * ( to_timestamp is reverse to_char() )
+ * ---------------------
+ */
+Datum
+to_timestamp(PG_FUNCTION_ARGS)
+{
+ text *date_txt = PG_GETARG_TEXT_PP(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ Oid collid = PG_GET_COLLATION();
+ Timestamp result;
+ int tz;
+ struct pg_tm tm;
+ fsec_t fsec;
+ int fprec;
+
+ do_to_timestamp(date_txt, fmt, collid, false,
+ &tm, &fsec, &fprec, NULL, NULL);
+
+ /* Use the specified time zone, if any. */
+ if (tm.tm_zone)
+ {
+ int dterr = DecodeTimezone(unconstify(char *, tm.tm_zone), &tz);
+
+ if (dterr)
+ DateTimeParseError(dterr, text_to_cstring(date_txt), "timestamptz");
+ }
+ else
+ tz = DetermineTimeZoneOffset(&tm, session_timezone);
+
+ if (tm2timestamp(&tm, fsec, &tz, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* Use the specified fractional precision, if any. */
+ if (fprec)
+ AdjustTimestampForTypmod(&result, fprec);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* ----------
+ * TO_DATE
+ * Make Date from date_str which is formatted at argument 'fmt'
+ * ----------
+ */
+Datum
+to_date(PG_FUNCTION_ARGS)
+{
+ text *date_txt = PG_GETARG_TEXT_PP(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ Oid collid = PG_GET_COLLATION();
+ DateADT result;
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ do_to_timestamp(date_txt, fmt, collid, false,
+ &tm, &fsec, NULL, NULL, NULL);
+
+ /* Prevent overflow in Julian-day routines */
+ if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"",
+ text_to_cstring(date_txt))));
+
+ result = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
+
+ /* Now check for just-out-of-range dates */
+ if (!IS_VALID_DATE(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"",
+ text_to_cstring(date_txt))));
+
+ PG_RETURN_DATEADT(result);
+}
+
+/*
+ * Convert the 'date_txt' input to a datetime type using argument 'fmt'
+ * as a format string. The collation 'collid' may be used for case-folding
+ * rules in some cases. 'strict' specifies standard parsing mode.
+ *
+ * The actual data type (returned in 'typid', 'typmod') is determined by
+ * the presence of date/time/zone components in the format string.
+ *
+ * When timezone component is present, the corresponding offset is
+ * returned in '*tz'.
+ *
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set
+ * and zero value is returned.
+ */
+Datum
+parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict,
+ Oid *typid, int32 *typmod, int *tz,
+ bool *have_error)
+{
+ struct pg_tm tm;
+ fsec_t fsec;
+ int fprec;
+ uint32 flags;
+
+ do_to_timestamp(date_txt, fmt, collid, strict,
+ &tm, &fsec, &fprec, &flags, have_error);
+ CHECK_ERROR;
+
+ *typmod = fprec ? fprec : -1; /* fractional part precision */
+
+ if (flags & DCH_DATED)
+ {
+ if (flags & DCH_TIMED)
+ {
+ if (flags & DCH_ZONED)
+ {
+ TimestampTz result;
+
+ if (tm.tm_zone)
+ {
+ int dterr = DecodeTimezone(unconstify(char *, tm.tm_zone), tz);
+
+ if (dterr)
+ DateTimeParseError(dterr, text_to_cstring(date_txt), "timestamptz");
+ }
+ else
+ {
+ /*
+ * Time zone is present in format string, but not in input
+ * string. Assuming do_to_timestamp() triggers no error
+ * this should be possible only in non-strict case.
+ */
+ Assert(!strict);
+
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("missing time zone in input string for type timestamptz"))));
+ }
+
+ if (tm2timestamp(&tm, fsec, tz, &result) != 0)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamptz out of range"))));
+
+ AdjustTimestampForTypmod(&result, *typmod);
+
+ *typid = TIMESTAMPTZOID;
+ return TimestampTzGetDatum(result);
+ }
+ else
+ {
+ Timestamp result;
+
+ if (tm2timestamp(&tm, fsec, NULL, &result) != 0)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range"))));
+
+ AdjustTimestampForTypmod(&result, *typmod);
+
+ *typid = TIMESTAMPOID;
+ return TimestampGetDatum(result);
+ }
+ }
+ else
+ {
+ if (flags & DCH_ZONED)
+ {
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("datetime format is zoned but not timed"))));
+ }
+ else
+ {
+ DateADT result;
+
+ /* Prevent overflow in Julian-day routines */
+ if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"",
+ text_to_cstring(date_txt)))));
+
+ result = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) -
+ POSTGRES_EPOCH_JDATE;
+
+ /* Now check for just-out-of-range dates */
+ if (!IS_VALID_DATE(result))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: \"%s\"",
+ text_to_cstring(date_txt)))));
+
+ *typid = DATEOID;
+ return DateADTGetDatum(result);
+ }
+ }
+ }
+ else if (flags & DCH_TIMED)
+ {
+ if (flags & DCH_ZONED)
+ {
+ TimeTzADT *result = palloc(sizeof(TimeTzADT));
+
+ if (tm.tm_zone)
+ {
+ int dterr = DecodeTimezone(unconstify(char *, tm.tm_zone), tz);
+
+ if (dterr)
+ RETURN_ERROR(DateTimeParseError(dterr, text_to_cstring(date_txt), "timetz"));
+ }
+ else
+ {
+ /*
+ * Time zone is present in format string, but not in input
+ * string. Assuming do_to_timestamp() triggers no error this
+ * should be possible only in non-strict case.
+ */
+ Assert(!strict);
+
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("missing time zone in input string for type timetz"))));
+ }
+
+ if (tm2timetz(&tm, fsec, *tz, result) != 0)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timetz out of range"))));
+
+ AdjustTimeForTypmod(&result->time, *typmod);
+
+ *typid = TIMETZOID;
+ return TimeTzADTPGetDatum(result);
+ }
+ else
+ {
+ TimeADT result;
+
+ if (tm2time(&tm, fsec, &result) != 0)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("time out of range"))));
+
+ AdjustTimeForTypmod(&result, *typmod);
+
+ *typid = TIMEOID;
+ return TimeADTGetDatum(result);
+ }
+ }
+ else
+ {
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("datetime format is not dated and not timed"))));
+ }
+
+on_error:
+ return (Datum) 0;
+}
+
+/*
+ * do_to_timestamp: shared code for to_timestamp and to_date
+ *
+ * Parse the 'date_txt' according to 'fmt', return results as a struct pg_tm,
+ * fractional seconds, and fractional precision.
+ *
+ * 'collid' identifies the collation to use, if needed.
+ * 'std' specifies standard parsing mode.
+ * Bit mask of date/time/zone components found in 'fmt' is returned in 'flags',
+ * if that is not NULL.
+ * If 'have_error' is NULL, then errors are thrown, else '*have_error' is set.
+ *
+ * We parse 'fmt' into a list of FormatNodes, which is then passed to
+ * DCH_from_char to populate a TmFromChar with the parsed contents of
+ * 'date_txt'.
+ *
+ * The TmFromChar is then analysed and converted into the final results in
+ * struct 'tm', 'fsec', and 'fprec'.
+ */
+static void
+do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std,
+ struct pg_tm *tm, fsec_t *fsec, int *fprec,
+ uint32 *flags, bool *have_error)
+{
+ FormatNode *format = NULL;
+ TmFromChar tmfc;
+ int fmt_len;
+ char *date_str;
+ int fmask;
+ bool incache = false;
+
+ Assert(tm != NULL);
+ Assert(fsec != NULL);
+
+ date_str = text_to_cstring(date_txt);
+
+ ZERO_tmfc(&tmfc);
+ ZERO_tm(tm);
+ *fsec = 0;
+ if (fprec)
+ *fprec = 0;
+ if (flags)
+ *flags = 0;
+ fmask = 0; /* bit mask for ValidateDate() */
+
+ fmt_len = VARSIZE_ANY_EXHDR(fmt);
+
+ if (fmt_len)
+ {
+ char *fmt_str;
+
+ fmt_str = text_to_cstring(fmt);
+
+ if (fmt_len > DCH_CACHE_SIZE)
+ {
+ /*
+ * Allocate new memory if format picture is bigger than static
+ * cache and do not use cache (call parser always)
+ */
+ format = (FormatNode *) palloc((fmt_len + 1) * sizeof(FormatNode));
+
+ parse_format(format, fmt_str, DCH_keywords, DCH_suff, DCH_index,
+ DCH_FLAG | (std ? STD_FLAG : 0), NULL);
+ }
+ else
+ {
+ /*
+ * Use cache buffers
+ */
+ DCHCacheEntry *ent = DCH_cache_fetch(fmt_str, std);
+
+ incache = true;
+ format = ent->format;
+ }
+
+#ifdef DEBUG_TO_FROM_CHAR
+ /* dump_node(format, fmt_len); */
+ /* dump_index(DCH_keywords, DCH_index); */
+#endif
+
+ DCH_from_char(format, date_str, &tmfc, collid, std, have_error);
+ CHECK_ERROR;
+
+ pfree(fmt_str);
+
+ if (flags)
+ *flags = DCH_datetime_type(format, have_error);
+
+ if (!incache)
+ {
+ pfree(format);
+ format = NULL;
+ }
+
+ CHECK_ERROR;
+ }
+
+ DEBUG_TMFC(&tmfc);
+
+ /*
+ * Convert to_date/to_timestamp input fields to standard 'tm'
+ */
+ if (tmfc.ssss)
+ {
+ int x = tmfc.ssss;
+
+ tm->tm_hour = x / SECS_PER_HOUR;
+ x %= SECS_PER_HOUR;
+ tm->tm_min = x / SECS_PER_MINUTE;
+ x %= SECS_PER_MINUTE;
+ tm->tm_sec = x;
+ }
+
+ if (tmfc.ss)
+ tm->tm_sec = tmfc.ss;
+ if (tmfc.mi)
+ tm->tm_min = tmfc.mi;
+ if (tmfc.hh)
+ tm->tm_hour = tmfc.hh;
+
+ if (tmfc.clock == CLOCK_12_HOUR)
+ {
+ if (tm->tm_hour < 1 || tm->tm_hour > HOURS_PER_DAY / 2)
+ {
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("hour \"%d\" is invalid for the 12-hour clock",
+ tm->tm_hour),
+ errhint("Use the 24-hour clock, or give an hour between 1 and 12."))));
+ }
+
+ if (tmfc.pm && tm->tm_hour < HOURS_PER_DAY / 2)
+ tm->tm_hour += HOURS_PER_DAY / 2;
+ else if (!tmfc.pm && tm->tm_hour == HOURS_PER_DAY / 2)
+ tm->tm_hour = 0;
+ }
+
+ if (tmfc.year)
+ {
+ /*
+ * If CC and YY (or Y) are provided, use YY as 2 low-order digits for
+ * the year in the given century. Keep in mind that the 21st century
+ * AD runs from 2001-2100, not 2000-2099; 6th century BC runs from
+ * 600BC to 501BC.
+ */
+ if (tmfc.cc && tmfc.yysz <= 2)
+ {
+ if (tmfc.bc)
+ tmfc.cc = -tmfc.cc;
+ tm->tm_year = tmfc.year % 100;
+ if (tm->tm_year)
+ {
+ if (tmfc.cc >= 0)
+ tm->tm_year += (tmfc.cc - 1) * 100;
+ else
+ tm->tm_year = (tmfc.cc + 1) * 100 - tm->tm_year + 1;
+ }
+ else
+ {
+ /* find century year for dates ending in "00" */
+ tm->tm_year = tmfc.cc * 100 + ((tmfc.cc >= 0) ? 0 : 1);
+ }
+ }
+ else
+ {
+ /* If a 4-digit year is provided, we use that and ignore CC. */
+ tm->tm_year = tmfc.year;
+ if (tmfc.bc)
+ tm->tm_year = -tm->tm_year;
+ /* correct for our representation of BC years */
+ if (tm->tm_year < 0)
+ tm->tm_year++;
+ }
+ fmask |= DTK_M(YEAR);
+ }
+ else if (tmfc.cc)
+ {
+ /* use first year of century */
+ if (tmfc.bc)
+ tmfc.cc = -tmfc.cc;
+ if (tmfc.cc >= 0)
+ /* +1 because 21st century started in 2001 */
+ tm->tm_year = (tmfc.cc - 1) * 100 + 1;
+ else
+ /* +1 because year == 599 is 600 BC */
+ tm->tm_year = tmfc.cc * 100 + 1;
+ fmask |= DTK_M(YEAR);
+ }
+
+ if (tmfc.j)
+ {
+ j2date(tmfc.j, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ fmask |= DTK_DATE_M;
+ }
+
+ if (tmfc.ww)
+ {
+ if (tmfc.mode == FROM_CHAR_DATE_ISOWEEK)
+ {
+ /*
+ * If tmfc.d is not set, then the date is left at the beginning of
+ * the ISO week (Monday).
+ */
+ if (tmfc.d)
+ isoweekdate2date(tmfc.ww, tmfc.d, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ else
+ isoweek2date(tmfc.ww, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ fmask |= DTK_DATE_M;
+ }
+ else
+ tmfc.ddd = (tmfc.ww - 1) * 7 + 1;
+ }
+
+ if (tmfc.w)
+ tmfc.dd = (tmfc.w - 1) * 7 + 1;
+ if (tmfc.dd)
+ {
+ tm->tm_mday = tmfc.dd;
+ fmask |= DTK_M(DAY);
+ }
+ if (tmfc.mm)
+ {
+ tm->tm_mon = tmfc.mm;
+ fmask |= DTK_M(MONTH);
+ }
+
+ if (tmfc.ddd && (tm->tm_mon <= 1 || tm->tm_mday <= 1))
+ {
+ /*
+ * The month and day field have not been set, so we use the
+ * day-of-year field to populate them. Depending on the date mode,
+ * this field may be interpreted as a Gregorian day-of-year, or an ISO
+ * week date day-of-year.
+ */
+
+ if (!tm->tm_year && !tmfc.bc)
+ {
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_DATETIME_FORMAT),
+ errmsg("cannot calculate day of year without year information"))));
+ }
+
+ if (tmfc.mode == FROM_CHAR_DATE_ISOWEEK)
+ {
+ int j0; /* zeroth day of the ISO year, in Julian */
+
+ j0 = isoweek2j(tm->tm_year, 1) - 1;
+
+ j2date(j0 + tmfc.ddd, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ fmask |= DTK_DATE_M;
+ }
+ else
+ {
+ const int *y;
+ int i;
+
+ static const int ysum[2][13] = {
+ {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},
+ {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}};
+
+ y = ysum[isleap(tm->tm_year)];
+
+ for (i = 1; i <= MONTHS_PER_YEAR; i++)
+ {
+ if (tmfc.ddd <= y[i])
+ break;
+ }
+ if (tm->tm_mon <= 1)
+ tm->tm_mon = i;
+
+ if (tm->tm_mday <= 1)
+ tm->tm_mday = tmfc.ddd - y[i - 1];
+
+ fmask |= DTK_M(MONTH) | DTK_M(DAY);
+ }
+ }
+
+ if (tmfc.ms)
+ *fsec += tmfc.ms * 1000;
+ if (tmfc.us)
+ *fsec += tmfc.us;
+ if (fprec)
+ *fprec = tmfc.ff; /* fractional precision, if specified */
+
+ /* Range-check date fields according to bit mask computed above */
+ if (fmask != 0)
+ {
+ /* We already dealt with AD/BC, so pass isjulian = true */
+ int dterr = ValidateDate(fmask, true, false, false, tm);
+
+ if (dterr != 0)
+ {
+ /*
+ * Force the error to be DTERR_FIELD_OVERFLOW even if ValidateDate
+ * said DTERR_MD_FIELD_OVERFLOW, because we don't want to print an
+ * irrelevant hint about datestyle.
+ */
+ RETURN_ERROR(DateTimeParseError(DTERR_FIELD_OVERFLOW, date_str, "timestamp"));
+ }
+ }
+
+ /* Range-check time fields too */
+ if (tm->tm_hour < 0 || tm->tm_hour >= HOURS_PER_DAY ||
+ tm->tm_min < 0 || tm->tm_min >= MINS_PER_HOUR ||
+ tm->tm_sec < 0 || tm->tm_sec >= SECS_PER_MINUTE ||
+ *fsec < INT64CONST(0) || *fsec >= USECS_PER_SEC)
+ {
+ RETURN_ERROR(DateTimeParseError(DTERR_FIELD_OVERFLOW, date_str, "timestamp"));
+ }
+
+ /* Save parsed time-zone into tm->tm_zone if it was specified */
+ if (tmfc.tzsign)
+ {
+ char *tz;
+
+ if (tmfc.tzh < 0 || tmfc.tzh > MAX_TZDISP_HOUR ||
+ tmfc.tzm < 0 || tmfc.tzm >= MINS_PER_HOUR)
+ {
+ RETURN_ERROR(DateTimeParseError(DTERR_TZDISP_OVERFLOW, date_str, "timestamp"));
+ }
+
+ tz = psprintf("%c%02d:%02d",
+ tmfc.tzsign > 0 ? '+' : '-', tmfc.tzh, tmfc.tzm);
+
+ tm->tm_zone = tz;
+ }
+
+ DEBUG_TM(tm);
+
+on_error:
+
+ if (format && !incache)
+ pfree(format);
+
+ pfree(date_str);
+}
+
+
+/**********************************************************************
+ * the NUMBER version part
+ *********************************************************************/
+
+
+static char *
+fill_str(char *str, int c, int max)
+{
+ memset(str, c, max);
+ *(str + max) = '\0';
+ return str;
+}
+
+#define zeroize_NUM(_n) \
+do { \
+ (_n)->flag = 0; \
+ (_n)->lsign = 0; \
+ (_n)->pre = 0; \
+ (_n)->post = 0; \
+ (_n)->pre_lsign_num = 0; \
+ (_n)->need_locale = 0; \
+ (_n)->multi = 0; \
+ (_n)->zero_start = 0; \
+ (_n)->zero_end = 0; \
+} while(0)
+
+/* This works the same as DCH_prevent_counter_overflow */
+static inline void
+NUM_prevent_counter_overflow(void)
+{
+ if (NUMCounter >= (INT_MAX - 1))
+ {
+ for (int i = 0; i < n_NUMCache; i++)
+ NUMCache[i]->age >>= 1;
+ NUMCounter >>= 1;
+ }
+}
+
+/* select a NUMCacheEntry to hold the given format picture */
+static NUMCacheEntry *
+NUM_cache_getnew(const char *str)
+{
+ NUMCacheEntry *ent;
+
+ /* Ensure we can advance NUMCounter below */
+ NUM_prevent_counter_overflow();
+
+ /*
+ * If cache is full, remove oldest entry (or recycle first not-valid one)
+ */
+ if (n_NUMCache >= NUM_CACHE_ENTRIES)
+ {
+ NUMCacheEntry *old = NUMCache[0];
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Cache is full (%d)", n_NUMCache);
+#endif
+ if (old->valid)
+ {
+ for (int i = 1; i < NUM_CACHE_ENTRIES; i++)
+ {
+ ent = NUMCache[i];
+ if (!ent->valid)
+ {
+ old = ent;
+ break;
+ }
+ if (ent->age < old->age)
+ old = ent;
+ }
+ }
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "OLD: \"%s\" AGE: %d", old->str, old->age);
+#endif
+ old->valid = false;
+ strlcpy(old->str, str, NUM_CACHE_SIZE + 1);
+ old->age = (++NUMCounter);
+ /* caller is expected to fill format and Num, then set valid */
+ return old;
+ }
+ else
+ {
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "NEW (%d)", n_NUMCache);
+#endif
+ Assert(NUMCache[n_NUMCache] == NULL);
+ NUMCache[n_NUMCache] = ent = (NUMCacheEntry *)
+ MemoryContextAllocZero(TopMemoryContext, sizeof(NUMCacheEntry));
+ ent->valid = false;
+ strlcpy(ent->str, str, NUM_CACHE_SIZE + 1);
+ ent->age = (++NUMCounter);
+ /* caller is expected to fill format and Num, then set valid */
+ ++n_NUMCache;
+ return ent;
+ }
+}
+
+/* look for an existing NUMCacheEntry matching the given format picture */
+static NUMCacheEntry *
+NUM_cache_search(const char *str)
+{
+ /* Ensure we can advance NUMCounter below */
+ NUM_prevent_counter_overflow();
+
+ for (int i = 0; i < n_NUMCache; i++)
+ {
+ NUMCacheEntry *ent = NUMCache[i];
+
+ if (ent->valid && strcmp(ent->str, str) == 0)
+ {
+ ent->age = (++NUMCounter);
+ return ent;
+ }
+ }
+
+ return NULL;
+}
+
+/* Find or create a NUMCacheEntry for the given format picture */
+static NUMCacheEntry *
+NUM_cache_fetch(const char *str)
+{
+ NUMCacheEntry *ent;
+
+ if ((ent = NUM_cache_search(str)) == NULL)
+ {
+ /*
+ * Not in the cache, must run parser and save a new format-picture to
+ * the cache. Do not mark the cache entry valid until parsing
+ * succeeds.
+ */
+ ent = NUM_cache_getnew(str);
+
+ zeroize_NUM(&ent->Num);
+
+ parse_format(ent->format, str, NUM_keywords,
+ NULL, NUM_index, NUM_FLAG, &ent->Num);
+
+ ent->valid = true;
+ }
+ return ent;
+}
+
+/* ----------
+ * Cache routine for NUM to_char version
+ * ----------
+ */
+static FormatNode *
+NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree)
+{
+ FormatNode *format = NULL;
+ char *str;
+
+ str = text_to_cstring(pars_str);
+
+ if (len > NUM_CACHE_SIZE)
+ {
+ /*
+ * Allocate new memory if format picture is bigger than static cache
+ * and do not use cache (call parser always)
+ */
+ format = (FormatNode *) palloc((len + 1) * sizeof(FormatNode));
+
+ *shouldFree = true;
+
+ zeroize_NUM(Num);
+
+ parse_format(format, str, NUM_keywords,
+ NULL, NUM_index, NUM_FLAG, Num);
+ }
+ else
+ {
+ /*
+ * Use cache buffers
+ */
+ NUMCacheEntry *ent = NUM_cache_fetch(str);
+
+ *shouldFree = false;
+
+ format = ent->format;
+
+ /*
+ * Copy cache to used struct
+ */
+ Num->flag = ent->Num.flag;
+ Num->lsign = ent->Num.lsign;
+ Num->pre = ent->Num.pre;
+ Num->post = ent->Num.post;
+ Num->pre_lsign_num = ent->Num.pre_lsign_num;
+ Num->need_locale = ent->Num.need_locale;
+ Num->multi = ent->Num.multi;
+ Num->zero_start = ent->Num.zero_start;
+ Num->zero_end = ent->Num.zero_end;
+ }
+
+#ifdef DEBUG_TO_FROM_CHAR
+ /* dump_node(format, len); */
+ dump_index(NUM_keywords, NUM_index);
+#endif
+
+ pfree(str);
+ return format;
+}
+
+
+static char *
+int_to_roman(int number)
+{
+ int len,
+ num;
+ char *p,
+ *result,
+ numstr[12];
+
+ result = (char *) palloc(16);
+ *result = '\0';
+
+ if (number > 3999 || number < 1)
+ {
+ fill_str(result, '#', 15);
+ return result;
+ }
+ len = snprintf(numstr, sizeof(numstr), "%d", number);
+
+ for (p = numstr; *p != '\0'; p++, --len)
+ {
+ num = *p - ('0' + 1);
+ if (num < 0)
+ continue;
+
+ if (len > 3)
+ {
+ while (num-- != -1)
+ strcat(result, "M");
+ }
+ else
+ {
+ if (len == 3)
+ strcat(result, rm100[num]);
+ else if (len == 2)
+ strcat(result, rm10[num]);
+ else if (len == 1)
+ strcat(result, rm1[num]);
+ }
+ }
+ return result;
+}
+
+
+
+/* ----------
+ * Locale
+ * ----------
+ */
+static void
+NUM_prepare_locale(NUMProc *Np)
+{
+ if (Np->Num->need_locale)
+ {
+ struct lconv *lconv;
+
+ /*
+ * Get locales
+ */
+ lconv = PGLC_localeconv();
+
+ /*
+ * Positive / Negative number sign
+ */
+ if (lconv->negative_sign && *lconv->negative_sign)
+ Np->L_negative_sign = lconv->negative_sign;
+ else
+ Np->L_negative_sign = "-";
+
+ if (lconv->positive_sign && *lconv->positive_sign)
+ Np->L_positive_sign = lconv->positive_sign;
+ else
+ Np->L_positive_sign = "+";
+
+ /*
+ * Number decimal point
+ */
+ if (lconv->decimal_point && *lconv->decimal_point)
+ Np->decimal = lconv->decimal_point;
+
+ else
+ Np->decimal = ".";
+
+ if (!IS_LDECIMAL(Np->Num))
+ Np->decimal = ".";
+
+ /*
+ * Number thousands separator
+ *
+ * Some locales (e.g. broken glibc pt_BR), have a comma for decimal,
+ * but "" for thousands_sep, so we set the thousands_sep too.
+ * http://archives.postgresql.org/pgsql-hackers/2007-11/msg00772.php
+ */
+ if (lconv->thousands_sep && *lconv->thousands_sep)
+ Np->L_thousands_sep = lconv->thousands_sep;
+ /* Make sure thousands separator doesn't match decimal point symbol. */
+ else if (strcmp(Np->decimal, ",") != 0)
+ Np->L_thousands_sep = ",";
+ else
+ Np->L_thousands_sep = ".";
+
+ /*
+ * Currency symbol
+ */
+ if (lconv->currency_symbol && *lconv->currency_symbol)
+ Np->L_currency_symbol = lconv->currency_symbol;
+ else
+ Np->L_currency_symbol = " ";
+ }
+ else
+ {
+ /*
+ * Default values
+ */
+ Np->L_negative_sign = "-";
+ Np->L_positive_sign = "+";
+ Np->decimal = ".";
+
+ Np->L_thousands_sep = ",";
+ Np->L_currency_symbol = " ";
+ }
+}
+
+/* ----------
+ * Return pointer of last relevant number after decimal point
+ * 12.0500 --> last relevant is '5'
+ * 12.0000 --> last relevant is '.'
+ * If there is no decimal point, return NULL (which will result in same
+ * behavior as if FM hadn't been specified).
+ * ----------
+ */
+static char *
+get_last_relevant_decnum(char *num)
+{
+ char *result,
+ *p = strchr(num, '.');
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "get_last_relevant_decnum()");
+#endif
+
+ if (!p)
+ return NULL;
+
+ result = p;
+
+ while (*(++p))
+ {
+ if (*p != '0')
+ result = p;
+ }
+
+ return result;
+}
+
+/*
+ * These macros are used in NUM_processor() and its subsidiary routines.
+ * OVERLOAD_TEST: true if we've reached end of input string
+ * AMOUNT_TEST(s): true if at least s bytes remain in string
+ */
+#define OVERLOAD_TEST (Np->inout_p >= Np->inout + input_len)
+#define AMOUNT_TEST(s) (Np->inout_p <= Np->inout + (input_len - (s)))
+
+/* ----------
+ * Number extraction for TO_NUMBER()
+ * ----------
+ */
+static void
+NUM_numpart_from_char(NUMProc *Np, int id, int input_len)
+{
+ bool isread = false;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, " --- scan start --- id=%s",
+ (id == NUM_0 || id == NUM_9) ? "NUM_0/9" : id == NUM_DEC ? "NUM_DEC" : "???");
+#endif
+
+ if (OVERLOAD_TEST)
+ return;
+
+ if (*Np->inout_p == ' ')
+ Np->inout_p++;
+
+ if (OVERLOAD_TEST)
+ return;
+
+ /*
+ * read sign before number
+ */
+ if (*Np->number == ' ' && (id == NUM_0 || id == NUM_9) &&
+ (Np->read_pre + Np->read_post) == 0)
+ {
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read sign (%c), locale positive: %s, negative: %s",
+ *Np->inout_p, Np->L_positive_sign, Np->L_negative_sign);
+#endif
+
+ /*
+ * locale sign
+ */
+ if (IS_LSIGN(Np->Num) && Np->Num->lsign == NUM_LSIGN_PRE)
+ {
+ int x = 0;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read locale pre-sign (%c)", *Np->inout_p);
+#endif
+ if ((x = strlen(Np->L_negative_sign)) &&
+ AMOUNT_TEST(x) &&
+ strncmp(Np->inout_p, Np->L_negative_sign, x) == 0)
+ {
+ Np->inout_p += x;
+ *Np->number = '-';
+ }
+ else if ((x = strlen(Np->L_positive_sign)) &&
+ AMOUNT_TEST(x) &&
+ strncmp(Np->inout_p, Np->L_positive_sign, x) == 0)
+ {
+ Np->inout_p += x;
+ *Np->number = '+';
+ }
+ }
+ else
+ {
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read simple sign (%c)", *Np->inout_p);
+#endif
+
+ /*
+ * simple + - < >
+ */
+ if (*Np->inout_p == '-' || (IS_BRACKET(Np->Num) &&
+ *Np->inout_p == '<'))
+ {
+ *Np->number = '-'; /* set - */
+ Np->inout_p++;
+ }
+ else if (*Np->inout_p == '+')
+ {
+ *Np->number = '+'; /* set + */
+ Np->inout_p++;
+ }
+ }
+ }
+
+ if (OVERLOAD_TEST)
+ return;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Scan for numbers (%c), current number: '%s'", *Np->inout_p, Np->number);
+#endif
+
+ /*
+ * read digit or decimal point
+ */
+ if (isdigit((unsigned char) *Np->inout_p))
+ {
+ if (Np->read_dec && Np->read_post == Np->Num->post)
+ return;
+
+ *Np->number_p = *Np->inout_p;
+ Np->number_p++;
+
+ if (Np->read_dec)
+ Np->read_post++;
+ else
+ Np->read_pre++;
+
+ isread = true;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Read digit (%c)", *Np->inout_p);
+#endif
+ }
+ else if (IS_DECIMAL(Np->Num) && Np->read_dec == false)
+ {
+ /*
+ * We need not test IS_LDECIMAL(Np->Num) explicitly here, because
+ * Np->decimal is always just "." if we don't have a D format token.
+ * So we just unconditionally match to Np->decimal.
+ */
+ int x = strlen(Np->decimal);
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read decimal point (%c)",
+ *Np->inout_p);
+#endif
+ if (x && AMOUNT_TEST(x) && strncmp(Np->inout_p, Np->decimal, x) == 0)
+ {
+ Np->inout_p += x - 1;
+ *Np->number_p = '.';
+ Np->number_p++;
+ Np->read_dec = true;
+ isread = true;
+ }
+ }
+
+ if (OVERLOAD_TEST)
+ return;
+
+ /*
+ * Read sign behind "last" number
+ *
+ * We need sign detection because determine exact position of post-sign is
+ * difficult:
+ *
+ * FM9999.9999999S -> 123.001- 9.9S -> .5- FM9.999999MI ->
+ * 5.01-
+ */
+ if (*Np->number == ' ' && Np->read_pre + Np->read_post > 0)
+ {
+ /*
+ * locale sign (NUM_S) is always anchored behind a last number, if: -
+ * locale sign expected - last read char was NUM_0/9 or NUM_DEC - and
+ * next char is not digit
+ */
+ if (IS_LSIGN(Np->Num) && isread &&
+ (Np->inout_p + 1) < Np->inout + input_len &&
+ !isdigit((unsigned char) *(Np->inout_p + 1)))
+ {
+ int x;
+ char *tmp = Np->inout_p++;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read locale post-sign (%c)", *Np->inout_p);
+#endif
+ if ((x = strlen(Np->L_negative_sign)) &&
+ AMOUNT_TEST(x) &&
+ strncmp(Np->inout_p, Np->L_negative_sign, x) == 0)
+ {
+ Np->inout_p += x - 1; /* -1 .. NUM_processor() do inout_p++ */
+ *Np->number = '-';
+ }
+ else if ((x = strlen(Np->L_positive_sign)) &&
+ AMOUNT_TEST(x) &&
+ strncmp(Np->inout_p, Np->L_positive_sign, x) == 0)
+ {
+ Np->inout_p += x - 1; /* -1 .. NUM_processor() do inout_p++ */
+ *Np->number = '+';
+ }
+ if (*Np->number == ' ')
+ /* no sign read */
+ Np->inout_p = tmp;
+ }
+
+ /*
+ * try read non-locale sign, it's happen only if format is not exact
+ * and we cannot determine sign position of MI/PL/SG, an example:
+ *
+ * FM9.999999MI -> 5.01-
+ *
+ * if (.... && IS_LSIGN(Np->Num)==false) prevents read wrong formats
+ * like to_number('1 -', '9S') where sign is not anchored to last
+ * number.
+ */
+ else if (isread == false && IS_LSIGN(Np->Num) == false &&
+ (IS_PLUS(Np->Num) || IS_MINUS(Np->Num)))
+ {
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "Try read simple post-sign (%c)", *Np->inout_p);
+#endif
+
+ /*
+ * simple + -
+ */
+ if (*Np->inout_p == '-' || *Np->inout_p == '+')
+ /* NUM_processor() do inout_p++ */
+ *Np->number = *Np->inout_p;
+ }
+ }
+}
+
+#define IS_PREDEC_SPACE(_n) \
+ (IS_ZERO((_n)->Num)==false && \
+ (_n)->number == (_n)->number_p && \
+ *(_n)->number == '0' && \
+ (_n)->Num->post != 0)
+
+/* ----------
+ * Add digit or sign to number-string
+ * ----------
+ */
+static void
+NUM_numpart_to_char(NUMProc *Np, int id)
+{
+ int end;
+
+ if (IS_ROMAN(Np->Num))
+ return;
+
+ /* Note: in this elog() output not set '\0' in 'inout' */
+
+#ifdef DEBUG_TO_FROM_CHAR
+
+ /*
+ * Np->num_curr is number of current item in format-picture, it is not
+ * current position in inout!
+ */
+ elog(DEBUG_elog_output,
+ "SIGN_WROTE: %d, CURRENT: %d, NUMBER_P: \"%s\", INOUT: \"%s\"",
+ Np->sign_wrote,
+ Np->num_curr,
+ Np->number_p,
+ Np->inout);
+#endif
+ Np->num_in = false;
+
+ /*
+ * Write sign if real number will write to output Note: IS_PREDEC_SPACE()
+ * handle "9.9" --> " .1"
+ */
+ if (Np->sign_wrote == false &&
+ (Np->num_curr >= Np->out_pre_spaces || (IS_ZERO(Np->Num) && Np->Num->zero_start == Np->num_curr)) &&
+ (IS_PREDEC_SPACE(Np) == false || (Np->last_relevant && *Np->last_relevant == '.')))
+ {
+ if (IS_LSIGN(Np->Num))
+ {
+ if (Np->Num->lsign == NUM_LSIGN_PRE)
+ {
+ if (Np->sign == '-')
+ strcpy(Np->inout_p, Np->L_negative_sign);
+ else
+ strcpy(Np->inout_p, Np->L_positive_sign);
+ Np->inout_p += strlen(Np->inout_p);
+ Np->sign_wrote = true;
+ }
+ }
+ else if (IS_BRACKET(Np->Num))
+ {
+ *Np->inout_p = Np->sign == '+' ? ' ' : '<';
+ ++Np->inout_p;
+ Np->sign_wrote = true;
+ }
+ else if (Np->sign == '+')
+ {
+ if (!IS_FILLMODE(Np->Num))
+ {
+ *Np->inout_p = ' '; /* Write + */
+ ++Np->inout_p;
+ }
+ Np->sign_wrote = true;
+ }
+ else if (Np->sign == '-')
+ { /* Write - */
+ *Np->inout_p = '-';
+ ++Np->inout_p;
+ Np->sign_wrote = true;
+ }
+ }
+
+
+ /*
+ * digits / FM / Zero / Dec. point
+ */
+ if (id == NUM_9 || id == NUM_0 || id == NUM_D || id == NUM_DEC)
+ {
+ if (Np->num_curr < Np->out_pre_spaces &&
+ (Np->Num->zero_start > Np->num_curr || !IS_ZERO(Np->Num)))
+ {
+ /*
+ * Write blank space
+ */
+ if (!IS_FILLMODE(Np->Num))
+ {
+ *Np->inout_p = ' '; /* Write ' ' */
+ ++Np->inout_p;
+ }
+ }
+ else if (IS_ZERO(Np->Num) &&
+ Np->num_curr < Np->out_pre_spaces &&
+ Np->Num->zero_start <= Np->num_curr)
+ {
+ /*
+ * Write ZERO
+ */
+ *Np->inout_p = '0'; /* Write '0' */
+ ++Np->inout_p;
+ Np->num_in = true;
+ }
+ else
+ {
+ /*
+ * Write Decimal point
+ */
+ if (*Np->number_p == '.')
+ {
+ if (!Np->last_relevant || *Np->last_relevant != '.')
+ {
+ strcpy(Np->inout_p, Np->decimal); /* Write DEC/D */
+ Np->inout_p += strlen(Np->inout_p);
+ }
+
+ /*
+ * Ora 'n' -- FM9.9 --> 'n.'
+ */
+ else if (IS_FILLMODE(Np->Num) &&
+ Np->last_relevant && *Np->last_relevant == '.')
+ {
+ strcpy(Np->inout_p, Np->decimal); /* Write DEC/D */
+ Np->inout_p += strlen(Np->inout_p);
+ }
+ }
+ else
+ {
+ /*
+ * Write Digits
+ */
+ if (Np->last_relevant && Np->number_p > Np->last_relevant &&
+ id != NUM_0)
+ ;
+
+ /*
+ * '0.1' -- 9.9 --> ' .1'
+ */
+ else if (IS_PREDEC_SPACE(Np))
+ {
+ if (!IS_FILLMODE(Np->Num))
+ {
+ *Np->inout_p = ' ';
+ ++Np->inout_p;
+ }
+
+ /*
+ * '0' -- FM9.9 --> '0.'
+ */
+ else if (Np->last_relevant && *Np->last_relevant == '.')
+ {
+ *Np->inout_p = '0';
+ ++Np->inout_p;
+ }
+ }
+ else
+ {
+ *Np->inout_p = *Np->number_p; /* Write DIGIT */
+ ++Np->inout_p;
+ Np->num_in = true;
+ }
+ }
+ /* do no exceed string length */
+ if (*Np->number_p)
+ ++Np->number_p;
+ }
+
+ end = Np->num_count + (Np->out_pre_spaces ? 1 : 0) + (IS_DECIMAL(Np->Num) ? 1 : 0);
+
+ if (Np->last_relevant && Np->last_relevant == Np->number_p)
+ end = Np->num_curr;
+
+ if (Np->num_curr + 1 == end)
+ {
+ if (Np->sign_wrote == true && IS_BRACKET(Np->Num))
+ {
+ *Np->inout_p = Np->sign == '+' ? ' ' : '>';
+ ++Np->inout_p;
+ }
+ else if (IS_LSIGN(Np->Num) && Np->Num->lsign == NUM_LSIGN_POST)
+ {
+ if (Np->sign == '-')
+ strcpy(Np->inout_p, Np->L_negative_sign);
+ else
+ strcpy(Np->inout_p, Np->L_positive_sign);
+ Np->inout_p += strlen(Np->inout_p);
+ }
+ }
+ }
+
+ ++Np->num_curr;
+}
+
+/*
+ * Skip over "n" input characters, but only if they aren't numeric data
+ */
+static void
+NUM_eat_non_data_chars(NUMProc *Np, int n, int input_len)
+{
+ while (n-- > 0)
+ {
+ if (OVERLOAD_TEST)
+ break; /* end of input */
+ if (strchr("0123456789.,+-", *Np->inout_p) != NULL)
+ break; /* it's a data character */
+ Np->inout_p += pg_mblen(Np->inout_p);
+ }
+}
+
+static char *
+NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
+ char *number, int input_len, int to_char_out_pre_spaces,
+ int sign, bool is_to_char, Oid collid)
+{
+ FormatNode *n;
+ NUMProc _Np,
+ *Np = &_Np;
+ const char *pattern;
+ int pattern_len;
+
+ MemSet(Np, 0, sizeof(NUMProc));
+
+ Np->Num = Num;
+ Np->is_to_char = is_to_char;
+ Np->number = number;
+ Np->inout = inout;
+ Np->last_relevant = NULL;
+ Np->read_post = 0;
+ Np->read_pre = 0;
+ Np->read_dec = false;
+
+ if (Np->Num->zero_start)
+ --Np->Num->zero_start;
+
+ if (IS_EEEE(Np->Num))
+ {
+ if (!Np->is_to_char)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("\"EEEE\" not supported for input")));
+ return strcpy(inout, number);
+ }
+
+ /*
+ * Roman correction
+ */
+ if (IS_ROMAN(Np->Num))
+ {
+ if (!Np->is_to_char)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("\"RN\" not supported for input")));
+
+ Np->Num->lsign = Np->Num->pre_lsign_num = Np->Num->post =
+ Np->Num->pre = Np->out_pre_spaces = Np->sign = 0;
+
+ if (IS_FILLMODE(Np->Num))
+ {
+ Np->Num->flag = 0;
+ Np->Num->flag |= NUM_F_FILLMODE;
+ }
+ else
+ Np->Num->flag = 0;
+ Np->Num->flag |= NUM_F_ROMAN;
+ }
+
+ /*
+ * Sign
+ */
+ if (is_to_char)
+ {
+ Np->sign = sign;
+
+ /* MI/PL/SG - write sign itself and not in number */
+ if (IS_PLUS(Np->Num) || IS_MINUS(Np->Num))
+ {
+ if (IS_PLUS(Np->Num) && IS_MINUS(Np->Num) == false)
+ Np->sign_wrote = false; /* need sign */
+ else
+ Np->sign_wrote = true; /* needn't sign */
+ }
+ else
+ {
+ if (Np->sign != '-')
+ {
+ if (IS_BRACKET(Np->Num) && IS_FILLMODE(Np->Num))
+ Np->Num->flag &= ~NUM_F_BRACKET;
+ if (IS_MINUS(Np->Num))
+ Np->Num->flag &= ~NUM_F_MINUS;
+ }
+ else if (Np->sign != '+' && IS_PLUS(Np->Num))
+ Np->Num->flag &= ~NUM_F_PLUS;
+
+ if (Np->sign == '+' && IS_FILLMODE(Np->Num) && IS_LSIGN(Np->Num) == false)
+ Np->sign_wrote = true; /* needn't sign */
+ else
+ Np->sign_wrote = false; /* need sign */
+
+ if (Np->Num->lsign == NUM_LSIGN_PRE && Np->Num->pre == Np->Num->pre_lsign_num)
+ Np->Num->lsign = NUM_LSIGN_POST;
+ }
+ }
+ else
+ Np->sign = false;
+
+ /*
+ * Count
+ */
+ Np->num_count = Np->Num->post + Np->Num->pre - 1;
+
+ if (is_to_char)
+ {
+ Np->out_pre_spaces = to_char_out_pre_spaces;
+
+ if (IS_FILLMODE(Np->Num) && IS_DECIMAL(Np->Num))
+ {
+ Np->last_relevant = get_last_relevant_decnum(Np->number);
+
+ /*
+ * If any '0' specifiers are present, make sure we don't strip
+ * those digits. But don't advance last_relevant beyond the last
+ * character of the Np->number string, which is a hazard if the
+ * number got shortened due to precision limitations.
+ */
+ if (Np->last_relevant && Np->Num->zero_end > Np->out_pre_spaces)
+ {
+ int last_zero_pos;
+ char *last_zero;
+
+ /* note that Np->number cannot be zero-length here */
+ last_zero_pos = strlen(Np->number) - 1;
+ last_zero_pos = Min(last_zero_pos,
+ Np->Num->zero_end - Np->out_pre_spaces);
+ last_zero = Np->number + last_zero_pos;
+ if (Np->last_relevant < last_zero)
+ Np->last_relevant = last_zero;
+ }
+ }
+
+ if (Np->sign_wrote == false && Np->out_pre_spaces == 0)
+ ++Np->num_count;
+ }
+ else
+ {
+ Np->out_pre_spaces = 0;
+ *Np->number = ' '; /* sign space */
+ *(Np->number + 1) = '\0';
+ }
+
+ Np->num_in = 0;
+ Np->num_curr = 0;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output,
+ "\n\tSIGN: '%c'\n\tNUM: '%s'\n\tPRE: %d\n\tPOST: %d\n\tNUM_COUNT: %d\n\tNUM_PRE: %d\n\tSIGN_WROTE: %s\n\tZERO: %s\n\tZERO_START: %d\n\tZERO_END: %d\n\tLAST_RELEVANT: %s\n\tBRACKET: %s\n\tPLUS: %s\n\tMINUS: %s\n\tFILLMODE: %s\n\tROMAN: %s\n\tEEEE: %s",
+ Np->sign,
+ Np->number,
+ Np->Num->pre,
+ Np->Num->post,
+ Np->num_count,
+ Np->out_pre_spaces,
+ Np->sign_wrote ? "Yes" : "No",
+ IS_ZERO(Np->Num) ? "Yes" : "No",
+ Np->Num->zero_start,
+ Np->Num->zero_end,
+ Np->last_relevant ? Np->last_relevant : "<not set>",
+ IS_BRACKET(Np->Num) ? "Yes" : "No",
+ IS_PLUS(Np->Num) ? "Yes" : "No",
+ IS_MINUS(Np->Num) ? "Yes" : "No",
+ IS_FILLMODE(Np->Num) ? "Yes" : "No",
+ IS_ROMAN(Np->Num) ? "Yes" : "No",
+ IS_EEEE(Np->Num) ? "Yes" : "No"
+ );
+#endif
+
+ /*
+ * Locale
+ */
+ NUM_prepare_locale(Np);
+
+ /*
+ * Processor direct cycle
+ */
+ if (Np->is_to_char)
+ Np->number_p = Np->number;
+ else
+ Np->number_p = Np->number + 1; /* first char is space for sign */
+
+ for (n = node, Np->inout_p = Np->inout; n->type != NODE_TYPE_END; n++)
+ {
+ if (!Np->is_to_char)
+ {
+ /*
+ * Check at least one byte remains to be scanned. (In actions
+ * below, must use AMOUNT_TEST if we want to read more bytes than
+ * that.)
+ */
+ if (OVERLOAD_TEST)
+ break;
+ }
+
+ /*
+ * Format pictures actions
+ */
+ if (n->type == NODE_TYPE_ACTION)
+ {
+ /*
+ * Create/read digit/zero/blank/sign/special-case
+ *
+ * 'NUM_S' note: The locale sign is anchored to number and we
+ * read/write it when we work with first or last number
+ * (NUM_0/NUM_9). This is why NUM_S is missing in switch().
+ *
+ * Notice the "Np->inout_p++" at the bottom of the loop. This is
+ * why most of the actions advance inout_p one less than you might
+ * expect. In cases where we don't want that increment to happen,
+ * a switch case ends with "continue" not "break".
+ */
+ switch (n->key->id)
+ {
+ case NUM_9:
+ case NUM_0:
+ case NUM_DEC:
+ case NUM_D:
+ if (Np->is_to_char)
+ {
+ NUM_numpart_to_char(Np, n->key->id);
+ continue; /* for() */
+ }
+ else
+ {
+ NUM_numpart_from_char(Np, n->key->id, input_len);
+ break; /* switch() case: */
+ }
+
+ case NUM_COMMA:
+ if (Np->is_to_char)
+ {
+ if (!Np->num_in)
+ {
+ if (IS_FILLMODE(Np->Num))
+ continue;
+ else
+ *Np->inout_p = ' ';
+ }
+ else
+ *Np->inout_p = ',';
+ }
+ else
+ {
+ if (!Np->num_in)
+ {
+ if (IS_FILLMODE(Np->Num))
+ continue;
+ }
+ if (*Np->inout_p != ',')
+ continue;
+ }
+ break;
+
+ case NUM_G:
+ pattern = Np->L_thousands_sep;
+ pattern_len = strlen(pattern);
+ if (Np->is_to_char)
+ {
+ if (!Np->num_in)
+ {
+ if (IS_FILLMODE(Np->Num))
+ continue;
+ else
+ {
+ /* just in case there are MB chars */
+ pattern_len = pg_mbstrlen(pattern);
+ memset(Np->inout_p, ' ', pattern_len);
+ Np->inout_p += pattern_len - 1;
+ }
+ }
+ else
+ {
+ strcpy(Np->inout_p, pattern);
+ Np->inout_p += pattern_len - 1;
+ }
+ }
+ else
+ {
+ if (!Np->num_in)
+ {
+ if (IS_FILLMODE(Np->Num))
+ continue;
+ }
+
+ /*
+ * Because L_thousands_sep typically contains data
+ * characters (either '.' or ','), we can't use
+ * NUM_eat_non_data_chars here. Instead skip only if
+ * the input matches L_thousands_sep.
+ */
+ if (AMOUNT_TEST(pattern_len) &&
+ strncmp(Np->inout_p, pattern, pattern_len) == 0)
+ Np->inout_p += pattern_len - 1;
+ else
+ continue;
+ }
+ break;
+
+ case NUM_L:
+ pattern = Np->L_currency_symbol;
+ if (Np->is_to_char)
+ {
+ strcpy(Np->inout_p, pattern);
+ Np->inout_p += strlen(pattern) - 1;
+ }
+ else
+ {
+ NUM_eat_non_data_chars(Np, pg_mbstrlen(pattern), input_len);
+ continue;
+ }
+ break;
+
+ case NUM_RN:
+ if (IS_FILLMODE(Np->Num))
+ {
+ strcpy(Np->inout_p, Np->number_p);
+ Np->inout_p += strlen(Np->inout_p) - 1;
+ }
+ else
+ {
+ sprintf(Np->inout_p, "%15s", Np->number_p);
+ Np->inout_p += strlen(Np->inout_p) - 1;
+ }
+ break;
+
+ case NUM_rn:
+ if (IS_FILLMODE(Np->Num))
+ {
+ strcpy(Np->inout_p, asc_tolower_z(Np->number_p));
+ Np->inout_p += strlen(Np->inout_p) - 1;
+ }
+ else
+ {
+ sprintf(Np->inout_p, "%15s", asc_tolower_z(Np->number_p));
+ Np->inout_p += strlen(Np->inout_p) - 1;
+ }
+ break;
+
+ case NUM_th:
+ if (IS_ROMAN(Np->Num) || *Np->number == '#' ||
+ Np->sign == '-' || IS_DECIMAL(Np->Num))
+ continue;
+
+ if (Np->is_to_char)
+ {
+ strcpy(Np->inout_p, get_th(Np->number, TH_LOWER));
+ Np->inout_p += 1;
+ }
+ else
+ {
+ /* All variants of 'th' occupy 2 characters */
+ NUM_eat_non_data_chars(Np, 2, input_len);
+ continue;
+ }
+ break;
+
+ case NUM_TH:
+ if (IS_ROMAN(Np->Num) || *Np->number == '#' ||
+ Np->sign == '-' || IS_DECIMAL(Np->Num))
+ continue;
+
+ if (Np->is_to_char)
+ {
+ strcpy(Np->inout_p, get_th(Np->number, TH_UPPER));
+ Np->inout_p += 1;
+ }
+ else
+ {
+ /* All variants of 'TH' occupy 2 characters */
+ NUM_eat_non_data_chars(Np, 2, input_len);
+ continue;
+ }
+ break;
+
+ case NUM_MI:
+ if (Np->is_to_char)
+ {
+ if (Np->sign == '-')
+ *Np->inout_p = '-';
+ else if (IS_FILLMODE(Np->Num))
+ continue;
+ else
+ *Np->inout_p = ' ';
+ }
+ else
+ {
+ if (*Np->inout_p == '-')
+ *Np->number = '-';
+ else
+ {
+ NUM_eat_non_data_chars(Np, 1, input_len);
+ continue;
+ }
+ }
+ break;
+
+ case NUM_PL:
+ if (Np->is_to_char)
+ {
+ if (Np->sign == '+')
+ *Np->inout_p = '+';
+ else if (IS_FILLMODE(Np->Num))
+ continue;
+ else
+ *Np->inout_p = ' ';
+ }
+ else
+ {
+ if (*Np->inout_p == '+')
+ *Np->number = '+';
+ else
+ {
+ NUM_eat_non_data_chars(Np, 1, input_len);
+ continue;
+ }
+ }
+ break;
+
+ case NUM_SG:
+ if (Np->is_to_char)
+ *Np->inout_p = Np->sign;
+ else
+ {
+ if (*Np->inout_p == '-')
+ *Np->number = '-';
+ else if (*Np->inout_p == '+')
+ *Np->number = '+';
+ else
+ {
+ NUM_eat_non_data_chars(Np, 1, input_len);
+ continue;
+ }
+ }
+ break;
+
+ default:
+ continue;
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * In TO_CHAR, non-pattern characters in the format are copied to
+ * the output. In TO_NUMBER, we skip one input character for each
+ * non-pattern format character, whether or not it matches the
+ * format character.
+ */
+ if (Np->is_to_char)
+ {
+ strcpy(Np->inout_p, n->character);
+ Np->inout_p += strlen(Np->inout_p);
+ }
+ else
+ {
+ Np->inout_p += pg_mblen(Np->inout_p);
+ }
+ continue;
+ }
+ Np->inout_p++;
+ }
+
+ if (Np->is_to_char)
+ {
+ *Np->inout_p = '\0';
+ return Np->inout;
+ }
+ else
+ {
+ if (*(Np->number_p - 1) == '.')
+ *(Np->number_p - 1) = '\0';
+ else
+ *Np->number_p = '\0';
+
+ /*
+ * Correction - precision of dec. number
+ */
+ Np->Num->post = Np->read_post;
+
+#ifdef DEBUG_TO_FROM_CHAR
+ elog(DEBUG_elog_output, "TO_NUMBER (number): '%s'", Np->number);
+#endif
+ return Np->number;
+ }
+}
+
+/* ----------
+ * MACRO: Start part of NUM - for all NUM's to_char variants
+ * (sorry, but I hate copy same code - macro is better..)
+ * ----------
+ */
+#define NUM_TOCHAR_prepare \
+do { \
+ int len = VARSIZE_ANY_EXHDR(fmt); \
+ if (len <= 0 || len >= (INT_MAX-VARHDRSZ)/NUM_MAX_ITEM_SIZ) \
+ PG_RETURN_TEXT_P(cstring_to_text("")); \
+ result = (text *) palloc0((len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \
+ format = NUM_cache(len, &Num, fmt, &shouldFree); \
+} while (0)
+
+/* ----------
+ * MACRO: Finish part of NUM
+ * ----------
+ */
+#define NUM_TOCHAR_finish \
+do { \
+ int len; \
+ \
+ NUM_processor(format, &Num, VARDATA(result), numstr, 0, out_pre_spaces, sign, true, PG_GET_COLLATION()); \
+ \
+ if (shouldFree) \
+ pfree(format); \
+ \
+ /* \
+ * Convert null-terminated representation of result to standard text. \
+ * The result is usually much bigger than it needs to be, but there \
+ * seems little point in realloc'ing it smaller. \
+ */ \
+ len = strlen(VARDATA(result)); \
+ SET_VARSIZE(result, len + VARHDRSZ); \
+} while (0)
+
+/* -------------------
+ * NUMERIC to_number() (convert string to numeric)
+ * -------------------
+ */
+Datum
+numeric_to_number(PG_FUNCTION_ARGS)
+{
+ text *value = PG_GETARG_TEXT_PP(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ Datum result;
+ FormatNode *format;
+ char *numstr;
+ bool shouldFree;
+ int len = 0;
+ int scale,
+ precision;
+
+ len = VARSIZE_ANY_EXHDR(fmt);
+
+ if (len <= 0 || len >= INT_MAX / NUM_MAX_ITEM_SIZ)
+ PG_RETURN_NULL();
+
+ format = NUM_cache(len, &Num, fmt, &shouldFree);
+
+ numstr = (char *) palloc((len * NUM_MAX_ITEM_SIZ) + 1);
+
+ NUM_processor(format, &Num, VARDATA_ANY(value), numstr,
+ VARSIZE_ANY_EXHDR(value), 0, 0, false, PG_GET_COLLATION());
+
+ scale = Num.post;
+ precision = Num.pre + Num.multi + scale;
+
+ if (shouldFree)
+ pfree(format);
+
+ result = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(numstr),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(((precision << 16) | scale) + VARHDRSZ));
+
+ if (IS_MULTI(&Num))
+ {
+ Numeric x;
+ Numeric a = int64_to_numeric(10);
+ Numeric b = int64_to_numeric(-Num.multi);
+
+ x = DatumGetNumeric(DirectFunctionCall2(numeric_power,
+ NumericGetDatum(a),
+ NumericGetDatum(b)));
+ result = DirectFunctionCall2(numeric_mul,
+ result,
+ NumericGetDatum(x));
+ }
+
+ pfree(numstr);
+ return result;
+}
+
+/* ------------------
+ * NUMERIC to_char()
+ * ------------------
+ */
+Datum
+numeric_to_char(PG_FUNCTION_ARGS)
+{
+ Numeric value = PG_GETARG_NUMERIC(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ FormatNode *format;
+ text *result;
+ bool shouldFree;
+ int out_pre_spaces = 0,
+ sign = 0;
+ char *numstr,
+ *orgnum,
+ *p;
+ Numeric x;
+
+ NUM_TOCHAR_prepare;
+
+ /*
+ * On DateType depend part (numeric)
+ */
+ if (IS_ROMAN(&Num))
+ {
+ x = DatumGetNumeric(DirectFunctionCall2(numeric_round,
+ NumericGetDatum(value),
+ Int32GetDatum(0)));
+ numstr =
+ int_to_roman(DatumGetInt32(DirectFunctionCall1(numeric_int4,
+ NumericGetDatum(x))));
+ }
+ else if (IS_EEEE(&Num))
+ {
+ orgnum = numeric_out_sci(value, Num.post);
+
+ /*
+ * numeric_out_sci() does not emit a sign for positive numbers. We
+ * need to add a space in this case so that positive and negative
+ * numbers are aligned. Also must check for NaN/infinity cases, which
+ * we handle the same way as in float8_to_char.
+ */
+ if (strcmp(orgnum, "NaN") == 0 ||
+ strcmp(orgnum, "Infinity") == 0 ||
+ strcmp(orgnum, "-Infinity") == 0)
+ {
+ /*
+ * Allow 6 characters for the leading sign, the decimal point,
+ * "e", the exponent's sign and two exponent digits.
+ */
+ numstr = (char *) palloc(Num.pre + Num.post + 7);
+ fill_str(numstr, '#', Num.pre + Num.post + 6);
+ *numstr = ' ';
+ *(numstr + Num.pre + 1) = '.';
+ }
+ else if (*orgnum != '-')
+ {
+ numstr = (char *) palloc(strlen(orgnum) + 2);
+ *numstr = ' ';
+ strcpy(numstr + 1, orgnum);
+ }
+ else
+ {
+ numstr = orgnum;
+ }
+ }
+ else
+ {
+ int numstr_pre_len;
+ Numeric val = value;
+
+ if (IS_MULTI(&Num))
+ {
+ Numeric a = int64_to_numeric(10);
+ Numeric b = int64_to_numeric(Num.multi);
+
+ x = DatumGetNumeric(DirectFunctionCall2(numeric_power,
+ NumericGetDatum(a),
+ NumericGetDatum(b)));
+ val = DatumGetNumeric(DirectFunctionCall2(numeric_mul,
+ NumericGetDatum(value),
+ NumericGetDatum(x)));
+ Num.pre += Num.multi;
+ }
+
+ x = DatumGetNumeric(DirectFunctionCall2(numeric_round,
+ NumericGetDatum(val),
+ Int32GetDatum(Num.post)));
+ orgnum = DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(x)));
+
+ if (*orgnum == '-')
+ {
+ sign = '-';
+ numstr = orgnum + 1;
+ }
+ else
+ {
+ sign = '+';
+ numstr = orgnum;
+ }
+
+ if ((p = strchr(numstr, '.')))
+ numstr_pre_len = p - numstr;
+ else
+ numstr_pre_len = strlen(numstr);
+
+ /* needs padding? */
+ if (numstr_pre_len < Num.pre)
+ out_pre_spaces = Num.pre - numstr_pre_len;
+ /* overflowed prefix digit format? */
+ else if (numstr_pre_len > Num.pre)
+ {
+ numstr = (char *) palloc(Num.pre + Num.post + 2);
+ fill_str(numstr, '#', Num.pre + Num.post + 1);
+ *(numstr + Num.pre) = '.';
+ }
+ }
+
+ NUM_TOCHAR_finish;
+ PG_RETURN_TEXT_P(result);
+}
+
+/* ---------------
+ * INT4 to_char()
+ * ---------------
+ */
+Datum
+int4_to_char(PG_FUNCTION_ARGS)
+{
+ int32 value = PG_GETARG_INT32(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ FormatNode *format;
+ text *result;
+ bool shouldFree;
+ int out_pre_spaces = 0,
+ sign = 0;
+ char *numstr,
+ *orgnum;
+
+ NUM_TOCHAR_prepare;
+
+ /*
+ * On DateType depend part (int32)
+ */
+ if (IS_ROMAN(&Num))
+ numstr = int_to_roman(value);
+ else if (IS_EEEE(&Num))
+ {
+ /* we can do it easily because float8 won't lose any precision */
+ float8 val = (float8) value;
+
+ orgnum = (char *) psprintf("%+.*e", Num.post, val);
+
+ /*
+ * Swap a leading positive sign for a space.
+ */
+ if (*orgnum == '+')
+ *orgnum = ' ';
+
+ numstr = orgnum;
+ }
+ else
+ {
+ int numstr_pre_len;
+
+ if (IS_MULTI(&Num))
+ {
+ orgnum = DatumGetCString(DirectFunctionCall1(int4out,
+ Int32GetDatum(value * ((int32) pow((double) 10, (double) Num.multi)))));
+ Num.pre += Num.multi;
+ }
+ else
+ {
+ orgnum = DatumGetCString(DirectFunctionCall1(int4out,
+ Int32GetDatum(value)));
+ }
+
+ if (*orgnum == '-')
+ {
+ sign = '-';
+ orgnum++;
+ }
+ else
+ sign = '+';
+
+ numstr_pre_len = strlen(orgnum);
+
+ /* post-decimal digits? Pad out with zeros. */
+ if (Num.post)
+ {
+ numstr = (char *) palloc(numstr_pre_len + Num.post + 2);
+ strcpy(numstr, orgnum);
+ *(numstr + numstr_pre_len) = '.';
+ memset(numstr + numstr_pre_len + 1, '0', Num.post);
+ *(numstr + numstr_pre_len + Num.post + 1) = '\0';
+ }
+ else
+ numstr = orgnum;
+
+ /* needs padding? */
+ if (numstr_pre_len < Num.pre)
+ out_pre_spaces = Num.pre - numstr_pre_len;
+ /* overflowed prefix digit format? */
+ else if (numstr_pre_len > Num.pre)
+ {
+ numstr = (char *) palloc(Num.pre + Num.post + 2);
+ fill_str(numstr, '#', Num.pre + Num.post + 1);
+ *(numstr + Num.pre) = '.';
+ }
+ }
+
+ NUM_TOCHAR_finish;
+ PG_RETURN_TEXT_P(result);
+}
+
+/* ---------------
+ * INT8 to_char()
+ * ---------------
+ */
+Datum
+int8_to_char(PG_FUNCTION_ARGS)
+{
+ int64 value = PG_GETARG_INT64(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ FormatNode *format;
+ text *result;
+ bool shouldFree;
+ int out_pre_spaces = 0,
+ sign = 0;
+ char *numstr,
+ *orgnum;
+
+ NUM_TOCHAR_prepare;
+
+ /*
+ * On DateType depend part (int32)
+ */
+ if (IS_ROMAN(&Num))
+ {
+ /* Currently don't support int8 conversion to roman... */
+ numstr = int_to_roman(DatumGetInt32(DirectFunctionCall1(int84, Int64GetDatum(value))));
+ }
+ else if (IS_EEEE(&Num))
+ {
+ /* to avoid loss of precision, must go via numeric not float8 */
+ orgnum = numeric_out_sci(int64_to_numeric(value),
+ Num.post);
+
+ /*
+ * numeric_out_sci() does not emit a sign for positive numbers. We
+ * need to add a space in this case so that positive and negative
+ * numbers are aligned. We don't have to worry about NaN/inf here.
+ */
+ if (*orgnum != '-')
+ {
+ numstr = (char *) palloc(strlen(orgnum) + 2);
+ *numstr = ' ';
+ strcpy(numstr + 1, orgnum);
+ }
+ else
+ {
+ numstr = orgnum;
+ }
+ }
+ else
+ {
+ int numstr_pre_len;
+
+ if (IS_MULTI(&Num))
+ {
+ double multi = pow((double) 10, (double) Num.multi);
+
+ value = DatumGetInt64(DirectFunctionCall2(int8mul,
+ Int64GetDatum(value),
+ DirectFunctionCall1(dtoi8,
+ Float8GetDatum(multi))));
+ Num.pre += Num.multi;
+ }
+
+ orgnum = DatumGetCString(DirectFunctionCall1(int8out,
+ Int64GetDatum(value)));
+
+ if (*orgnum == '-')
+ {
+ sign = '-';
+ orgnum++;
+ }
+ else
+ sign = '+';
+
+ numstr_pre_len = strlen(orgnum);
+
+ /* post-decimal digits? Pad out with zeros. */
+ if (Num.post)
+ {
+ numstr = (char *) palloc(numstr_pre_len + Num.post + 2);
+ strcpy(numstr, orgnum);
+ *(numstr + numstr_pre_len) = '.';
+ memset(numstr + numstr_pre_len + 1, '0', Num.post);
+ *(numstr + numstr_pre_len + Num.post + 1) = '\0';
+ }
+ else
+ numstr = orgnum;
+
+ /* needs padding? */
+ if (numstr_pre_len < Num.pre)
+ out_pre_spaces = Num.pre - numstr_pre_len;
+ /* overflowed prefix digit format? */
+ else if (numstr_pre_len > Num.pre)
+ {
+ numstr = (char *) palloc(Num.pre + Num.post + 2);
+ fill_str(numstr, '#', Num.pre + Num.post + 1);
+ *(numstr + Num.pre) = '.';
+ }
+ }
+
+ NUM_TOCHAR_finish;
+ PG_RETURN_TEXT_P(result);
+}
+
+/* -----------------
+ * FLOAT4 to_char()
+ * -----------------
+ */
+Datum
+float4_to_char(PG_FUNCTION_ARGS)
+{
+ float4 value = PG_GETARG_FLOAT4(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ FormatNode *format;
+ text *result;
+ bool shouldFree;
+ int out_pre_spaces = 0,
+ sign = 0;
+ char *numstr,
+ *p;
+
+ NUM_TOCHAR_prepare;
+
+ if (IS_ROMAN(&Num))
+ numstr = int_to_roman((int) rint(value));
+ else if (IS_EEEE(&Num))
+ {
+ if (isnan(value) || isinf(value))
+ {
+ /*
+ * Allow 6 characters for the leading sign, the decimal point,
+ * "e", the exponent's sign and two exponent digits.
+ */
+ numstr = (char *) palloc(Num.pre + Num.post + 7);
+ fill_str(numstr, '#', Num.pre + Num.post + 6);
+ *numstr = ' ';
+ *(numstr + Num.pre + 1) = '.';
+ }
+ else
+ {
+ numstr = psprintf("%+.*e", Num.post, value);
+
+ /*
+ * Swap a leading positive sign for a space.
+ */
+ if (*numstr == '+')
+ *numstr = ' ';
+ }
+ }
+ else
+ {
+ float4 val = value;
+ char *orgnum;
+ int numstr_pre_len;
+
+ if (IS_MULTI(&Num))
+ {
+ float multi = pow((double) 10, (double) Num.multi);
+
+ val = value * multi;
+ Num.pre += Num.multi;
+ }
+
+ orgnum = psprintf("%.0f", fabs(val));
+ numstr_pre_len = strlen(orgnum);
+
+ /* adjust post digits to fit max float digits */
+ if (numstr_pre_len >= FLT_DIG)
+ Num.post = 0;
+ else if (numstr_pre_len + Num.post > FLT_DIG)
+ Num.post = FLT_DIG - numstr_pre_len;
+ orgnum = psprintf("%.*f", Num.post, val);
+
+ if (*orgnum == '-')
+ { /* < 0 */
+ sign = '-';
+ numstr = orgnum + 1;
+ }
+ else
+ {
+ sign = '+';
+ numstr = orgnum;
+ }
+
+ if ((p = strchr(numstr, '.')))
+ numstr_pre_len = p - numstr;
+ else
+ numstr_pre_len = strlen(numstr);
+
+ /* needs padding? */
+ if (numstr_pre_len < Num.pre)
+ out_pre_spaces = Num.pre - numstr_pre_len;
+ /* overflowed prefix digit format? */
+ else if (numstr_pre_len > Num.pre)
+ {
+ numstr = (char *) palloc(Num.pre + Num.post + 2);
+ fill_str(numstr, '#', Num.pre + Num.post + 1);
+ *(numstr + Num.pre) = '.';
+ }
+ }
+
+ NUM_TOCHAR_finish;
+ PG_RETURN_TEXT_P(result);
+}
+
+/* -----------------
+ * FLOAT8 to_char()
+ * -----------------
+ */
+Datum
+float8_to_char(PG_FUNCTION_ARGS)
+{
+ float8 value = PG_GETARG_FLOAT8(0);
+ text *fmt = PG_GETARG_TEXT_PP(1);
+ NUMDesc Num;
+ FormatNode *format;
+ text *result;
+ bool shouldFree;
+ int out_pre_spaces = 0,
+ sign = 0;
+ char *numstr,
+ *p;
+
+ NUM_TOCHAR_prepare;
+
+ if (IS_ROMAN(&Num))
+ numstr = int_to_roman((int) rint(value));
+ else if (IS_EEEE(&Num))
+ {
+ if (isnan(value) || isinf(value))
+ {
+ /*
+ * Allow 6 characters for the leading sign, the decimal point,
+ * "e", the exponent's sign and two exponent digits.
+ */
+ numstr = (char *) palloc(Num.pre + Num.post + 7);
+ fill_str(numstr, '#', Num.pre + Num.post + 6);
+ *numstr = ' ';
+ *(numstr + Num.pre + 1) = '.';
+ }
+ else
+ {
+ numstr = psprintf("%+.*e", Num.post, value);
+
+ /*
+ * Swap a leading positive sign for a space.
+ */
+ if (*numstr == '+')
+ *numstr = ' ';
+ }
+ }
+ else
+ {
+ float8 val = value;
+ char *orgnum;
+ int numstr_pre_len;
+
+ if (IS_MULTI(&Num))
+ {
+ double multi = pow((double) 10, (double) Num.multi);
+
+ val = value * multi;
+ Num.pre += Num.multi;
+ }
+
+ orgnum = psprintf("%.0f", fabs(val));
+ numstr_pre_len = strlen(orgnum);
+
+ /* adjust post digits to fit max double digits */
+ if (numstr_pre_len >= DBL_DIG)
+ Num.post = 0;
+ else if (numstr_pre_len + Num.post > DBL_DIG)
+ Num.post = DBL_DIG - numstr_pre_len;
+ orgnum = psprintf("%.*f", Num.post, val);
+
+ if (*orgnum == '-')
+ { /* < 0 */
+ sign = '-';
+ numstr = orgnum + 1;
+ }
+ else
+ {
+ sign = '+';
+ numstr = orgnum;
+ }
+
+ if ((p = strchr(numstr, '.')))
+ numstr_pre_len = p - numstr;
+ else
+ numstr_pre_len = strlen(numstr);
+
+ /* needs padding? */
+ if (numstr_pre_len < Num.pre)
+ out_pre_spaces = Num.pre - numstr_pre_len;
+ /* overflowed prefix digit format? */
+ else if (numstr_pre_len > Num.pre)
+ {
+ numstr = (char *) palloc(Num.pre + Num.post + 2);
+ fill_str(numstr, '#', Num.pre + Num.post + 1);
+ *(numstr + Num.pre) = '.';
+ }
+ }
+
+ NUM_TOCHAR_finish;
+ PG_RETURN_TEXT_P(result);
+}
diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c
new file mode 100644
index 0000000..5d2679d
--- /dev/null
+++ b/src/backend/utils/adt/genfile.c
@@ -0,0 +1,709 @@
+/*-------------------------------------------------------------------------
+ *
+ * genfile.c
+ * Functions for direct access to files
+ *
+ *
+ * Copyright (c) 2004-2022, PostgreSQL Global Development Group
+ *
+ * Author: Andreas Pflug <pgadmin@pse-consulting.de>
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/genfile.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "access/htup_details.h"
+#include "access/xlog_internal.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_tablespace_d.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "postmaster/syslogger.h"
+#include "replication/slot.h"
+#include "storage/fd.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/syscache.h"
+#include "utils/timestamp.h"
+
+
+/*
+ * Convert a "text" filename argument to C string, and check it's allowable.
+ *
+ * Filename may be absolute or relative to the DataDir, but we only allow
+ * absolute paths that match DataDir or Log_directory.
+ *
+ * This does a privilege check against the 'pg_read_server_files' role, so
+ * this function is really only appropriate for callers who are only checking
+ * 'read' access. Do not use this function if you are looking for a check
+ * for 'write' or 'program' access without updating it to access the type
+ * of check as an argument and checking the appropriate role membership.
+ */
+static char *
+convert_and_check_filename(text *arg)
+{
+ char *filename;
+
+ filename = text_to_cstring(arg);
+ canonicalize_path(filename); /* filename can change length here */
+
+ /*
+ * Roles with privileges of the 'pg_read_server_files' role are allowed to
+ * access any files on the server as the PG user, so no need to do any
+ * further checks here.
+ */
+ if (has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES))
+ return filename;
+
+ /*
+ * User isn't a member of the pg_read_server_files role, so check if it's
+ * allowable
+ */
+ if (is_absolute_path(filename))
+ {
+ /*
+ * Allow absolute paths if within DataDir or Log_directory, even
+ * though Log_directory might be outside DataDir.
+ */
+ if (!path_is_prefix_of_path(DataDir, filename) &&
+ (!is_absolute_path(Log_directory) ||
+ !path_is_prefix_of_path(Log_directory, filename)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("absolute path not allowed")));
+ }
+ else if (!path_is_relative_and_below_cwd(filename))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("path must be in or below the current directory")));
+
+ return filename;
+}
+
+
+/*
+ * Read a section of a file, returning it as bytea
+ *
+ * Caller is responsible for all permissions checking.
+ *
+ * We read the whole of the file when bytes_to_read is negative.
+ */
+static bytea *
+read_binary_file(const char *filename, int64 seek_offset, int64 bytes_to_read,
+ bool missing_ok)
+{
+ bytea *buf;
+ size_t nbytes = 0;
+ FILE *file;
+
+ /* clamp request size to what we can actually deliver */
+ if (bytes_to_read > (int64) (MaxAllocSize - VARHDRSZ))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("requested length too large")));
+
+ if ((file = AllocateFile(filename, PG_BINARY_R)) == NULL)
+ {
+ if (missing_ok && errno == ENOENT)
+ return NULL;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\" for reading: %m",
+ filename)));
+ }
+
+ if (fseeko(file, (off_t) seek_offset,
+ (seek_offset >= 0) ? SEEK_SET : SEEK_END) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in file \"%s\": %m", filename)));
+
+ if (bytes_to_read >= 0)
+ {
+ /* If passed explicit read size just do it */
+ buf = (bytea *) palloc((Size) bytes_to_read + VARHDRSZ);
+
+ nbytes = fread(VARDATA(buf), 1, (size_t) bytes_to_read, file);
+ }
+ else
+ {
+ /* Negative read size, read rest of file */
+ StringInfoData sbuf;
+
+ initStringInfo(&sbuf);
+ /* Leave room in the buffer for the varlena length word */
+ sbuf.len += VARHDRSZ;
+ Assert(sbuf.len < sbuf.maxlen);
+
+ while (!(feof(file) || ferror(file)))
+ {
+ size_t rbytes;
+
+ /* Minimum amount to read at a time */
+#define MIN_READ_SIZE 4096
+
+ /*
+ * If not at end of file, and sbuf.len is equal to MaxAllocSize -
+ * 1, then either the file is too large, or there is nothing left
+ * to read. Attempt to read one more byte to see if the end of
+ * file has been reached. If not, the file is too large; we'd
+ * rather give the error message for that ourselves.
+ */
+ if (sbuf.len == MaxAllocSize - 1)
+ {
+ char rbuf[1];
+
+ if (fread(rbuf, 1, 1, file) != 0 || !feof(file))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("file length too large")));
+ else
+ break;
+ }
+
+ /* OK, ensure that we can read at least MIN_READ_SIZE */
+ enlargeStringInfo(&sbuf, MIN_READ_SIZE);
+
+ /*
+ * stringinfo.c likes to allocate in powers of 2, so it's likely
+ * that much more space is available than we asked for. Use all
+ * of it, rather than making more fread calls than necessary.
+ */
+ rbytes = fread(sbuf.data + sbuf.len, 1,
+ (size_t) (sbuf.maxlen - sbuf.len - 1), file);
+ sbuf.len += rbytes;
+ nbytes += rbytes;
+ }
+
+ /* Now we can commandeer the stringinfo's buffer as the result */
+ buf = (bytea *) sbuf.data;
+ }
+
+ if (ferror(file))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read file \"%s\": %m", filename)));
+
+ SET_VARSIZE(buf, nbytes + VARHDRSZ);
+
+ FreeFile(file);
+
+ return buf;
+}
+
+/*
+ * Similar to read_binary_file, but we verify that the contents are valid
+ * in the database encoding.
+ */
+static text *
+read_text_file(const char *filename, int64 seek_offset, int64 bytes_to_read,
+ bool missing_ok)
+{
+ bytea *buf;
+
+ buf = read_binary_file(filename, seek_offset, bytes_to_read, missing_ok);
+
+ if (buf != NULL)
+ {
+ /* Make sure the input is valid */
+ pg_verifymbstr(VARDATA(buf), VARSIZE(buf) - VARHDRSZ, false);
+
+ /* OK, we can cast it to text safely */
+ return (text *) buf;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * Read a section of a file, returning it as text
+ *
+ * This function is kept to support adminpack 1.0.
+ */
+Datum
+pg_read_file(PG_FUNCTION_ARGS)
+{
+ text *filename_t = PG_GETARG_TEXT_PP(0);
+ int64 seek_offset = 0;
+ int64 bytes_to_read = -1;
+ bool missing_ok = false;
+ char *filename;
+ text *result;
+
+ if (!superuser())
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser to read files with adminpack 1.0"),
+ /* translator: %s is a SQL function name */
+ errhint("Consider using %s, which is part of core, instead.",
+ "pg_read_file()")));
+
+ /* handle optional arguments */
+ if (PG_NARGS() >= 3)
+ {
+ seek_offset = PG_GETARG_INT64(1);
+ bytes_to_read = PG_GETARG_INT64(2);
+
+ if (bytes_to_read < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("requested length cannot be negative")));
+ }
+ if (PG_NARGS() >= 4)
+ missing_ok = PG_GETARG_BOOL(3);
+
+ filename = convert_and_check_filename(filename_t);
+
+ result = read_text_file(filename, seek_offset, bytes_to_read, missing_ok);
+ if (result)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * Read a section of a file, returning it as text
+ *
+ * No superuser check done here- instead privileges are handled by the
+ * GRANT system.
+ */
+Datum
+pg_read_file_v2(PG_FUNCTION_ARGS)
+{
+ text *filename_t = PG_GETARG_TEXT_PP(0);
+ int64 seek_offset = 0;
+ int64 bytes_to_read = -1;
+ bool missing_ok = false;
+ char *filename;
+ text *result;
+
+ /* handle optional arguments */
+ if (PG_NARGS() >= 3)
+ {
+ seek_offset = PG_GETARG_INT64(1);
+ bytes_to_read = PG_GETARG_INT64(2);
+
+ if (bytes_to_read < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("requested length cannot be negative")));
+ }
+ if (PG_NARGS() >= 4)
+ missing_ok = PG_GETARG_BOOL(3);
+
+ filename = convert_and_check_filename(filename_t);
+
+ result = read_text_file(filename, seek_offset, bytes_to_read, missing_ok);
+ if (result)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * Read a section of a file, returning it as bytea
+ */
+Datum
+pg_read_binary_file(PG_FUNCTION_ARGS)
+{
+ text *filename_t = PG_GETARG_TEXT_PP(0);
+ int64 seek_offset = 0;
+ int64 bytes_to_read = -1;
+ bool missing_ok = false;
+ char *filename;
+ bytea *result;
+
+ /* handle optional arguments */
+ if (PG_NARGS() >= 3)
+ {
+ seek_offset = PG_GETARG_INT64(1);
+ bytes_to_read = PG_GETARG_INT64(2);
+
+ if (bytes_to_read < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("requested length cannot be negative")));
+ }
+ if (PG_NARGS() >= 4)
+ missing_ok = PG_GETARG_BOOL(3);
+
+ filename = convert_and_check_filename(filename_t);
+
+ result = read_binary_file(filename, seek_offset,
+ bytes_to_read, missing_ok);
+ if (result)
+ PG_RETURN_BYTEA_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+
+/*
+ * Wrapper functions for the 1 and 3 argument variants of pg_read_file_v2()
+ * and pg_read_binary_file().
+ *
+ * These are necessary to pass the sanity check in opr_sanity, which checks
+ * that all built-in functions that share the implementing C function take
+ * the same number of arguments.
+ */
+Datum
+pg_read_file_off_len(PG_FUNCTION_ARGS)
+{
+ return pg_read_file_v2(fcinfo);
+}
+
+Datum
+pg_read_file_all(PG_FUNCTION_ARGS)
+{
+ return pg_read_file_v2(fcinfo);
+}
+
+Datum
+pg_read_binary_file_off_len(PG_FUNCTION_ARGS)
+{
+ return pg_read_binary_file(fcinfo);
+}
+
+Datum
+pg_read_binary_file_all(PG_FUNCTION_ARGS)
+{
+ return pg_read_binary_file(fcinfo);
+}
+
+/*
+ * stat a file
+ */
+Datum
+pg_stat_file(PG_FUNCTION_ARGS)
+{
+ text *filename_t = PG_GETARG_TEXT_PP(0);
+ char *filename;
+ struct stat fst;
+ Datum values[6];
+ bool isnull[6];
+ HeapTuple tuple;
+ TupleDesc tupdesc;
+ bool missing_ok = false;
+
+ /* check the optional argument */
+ if (PG_NARGS() == 2)
+ missing_ok = PG_GETARG_BOOL(1);
+
+ filename = convert_and_check_filename(filename_t);
+
+ if (stat(filename, &fst) < 0)
+ {
+ if (missing_ok && errno == ENOENT)
+ PG_RETURN_NULL();
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", filename)));
+ }
+
+ /*
+ * This record type had better match the output parameters declared for me
+ * in pg_proc.h.
+ */
+ tupdesc = CreateTemplateTupleDesc(6);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1,
+ "size", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2,
+ "access", TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3,
+ "modification", TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4,
+ "change", TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5,
+ "creation", TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6,
+ "isdir", BOOLOID, -1, 0);
+ BlessTupleDesc(tupdesc);
+
+ memset(isnull, false, sizeof(isnull));
+
+ values[0] = Int64GetDatum((int64) fst.st_size);
+ values[1] = TimestampTzGetDatum(time_t_to_timestamptz(fst.st_atime));
+ values[2] = TimestampTzGetDatum(time_t_to_timestamptz(fst.st_mtime));
+ /* Unix has file status change time, while Win32 has creation time */
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ values[3] = TimestampTzGetDatum(time_t_to_timestamptz(fst.st_ctime));
+ isnull[4] = true;
+#else
+ isnull[3] = true;
+ values[4] = TimestampTzGetDatum(time_t_to_timestamptz(fst.st_ctime));
+#endif
+ values[5] = BoolGetDatum(S_ISDIR(fst.st_mode));
+
+ tuple = heap_form_tuple(tupdesc, values, isnull);
+
+ pfree(filename);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
+}
+
+/*
+ * stat a file (1 argument version)
+ *
+ * note: this wrapper is necessary to pass the sanity check in opr_sanity,
+ * which checks that all built-in functions that share the implementing C
+ * function take the same number of arguments
+ */
+Datum
+pg_stat_file_1arg(PG_FUNCTION_ARGS)
+{
+ return pg_stat_file(fcinfo);
+}
+
+/*
+ * List a directory (returns the filenames only)
+ */
+Datum
+pg_ls_dir(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ char *location;
+ bool missing_ok = false;
+ bool include_dot_dirs = false;
+ DIR *dirdesc;
+ struct dirent *de;
+
+ location = convert_and_check_filename(PG_GETARG_TEXT_PP(0));
+
+ /* check the optional arguments */
+ if (PG_NARGS() == 3)
+ {
+ if (!PG_ARGISNULL(1))
+ missing_ok = PG_GETARG_BOOL(1);
+ if (!PG_ARGISNULL(2))
+ include_dot_dirs = PG_GETARG_BOOL(2);
+ }
+
+ InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC);
+
+ dirdesc = AllocateDir(location);
+ if (!dirdesc)
+ {
+ /* Return empty tuplestore if appropriate */
+ if (missing_ok && errno == ENOENT)
+ return (Datum) 0;
+ /* Otherwise, we can let ReadDir() throw the error */
+ }
+
+ while ((de = ReadDir(dirdesc, location)) != NULL)
+ {
+ Datum values[1];
+ bool nulls[1];
+
+ if (!include_dot_dirs &&
+ (strcmp(de->d_name, ".") == 0 ||
+ strcmp(de->d_name, "..") == 0))
+ continue;
+
+ values[0] = CStringGetTextDatum(de->d_name);
+ nulls[0] = false;
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc,
+ values, nulls);
+ }
+
+ FreeDir(dirdesc);
+ return (Datum) 0;
+}
+
+/*
+ * List a directory (1 argument version)
+ *
+ * note: this wrapper is necessary to pass the sanity check in opr_sanity,
+ * which checks that all built-in functions that share the implementing C
+ * function take the same number of arguments.
+ */
+Datum
+pg_ls_dir_1arg(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir(fcinfo);
+}
+
+/*
+ * Generic function to return a directory listing of files.
+ *
+ * If the directory isn't there, silently return an empty set if missing_ok.
+ * Other unreadable-directory cases throw an error.
+ */
+static Datum
+pg_ls_dir_files(FunctionCallInfo fcinfo, const char *dir, bool missing_ok)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ DIR *dirdesc;
+ struct dirent *de;
+
+ InitMaterializedSRF(fcinfo, 0);
+
+ /*
+ * Now walk the directory. Note that we must do this within a single SRF
+ * call, not leave the directory open across multiple calls, since we
+ * can't count on the SRF being run to completion.
+ */
+ dirdesc = AllocateDir(dir);
+ if (!dirdesc)
+ {
+ /* Return empty tuplestore if appropriate */
+ if (missing_ok && errno == ENOENT)
+ return (Datum) 0;
+ /* Otherwise, we can let ReadDir() throw the error */
+ }
+
+ while ((de = ReadDir(dirdesc, dir)) != NULL)
+ {
+ Datum values[3];
+ bool nulls[3];
+ char path[MAXPGPATH * 2];
+ struct stat attrib;
+
+ /* Skip hidden files */
+ if (de->d_name[0] == '.')
+ continue;
+
+ /* Get the file info */
+ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
+ if (stat(path, &attrib) < 0)
+ {
+ /* Ignore concurrently-deleted files, else complain */
+ if (errno == ENOENT)
+ continue;
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", path)));
+ }
+
+ /* Ignore anything but regular files */
+ if (!S_ISREG(attrib.st_mode))
+ continue;
+
+ values[0] = CStringGetTextDatum(de->d_name);
+ values[1] = Int64GetDatum((int64) attrib.st_size);
+ values[2] = TimestampTzGetDatum(time_t_to_timestamptz(attrib.st_mtime));
+ memset(nulls, 0, sizeof(nulls));
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ FreeDir(dirdesc);
+ return (Datum) 0;
+}
+
+/* Function to return the list of files in the log directory */
+Datum
+pg_ls_logdir(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir_files(fcinfo, Log_directory, false);
+}
+
+/* Function to return the list of files in the WAL directory */
+Datum
+pg_ls_waldir(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir_files(fcinfo, XLOGDIR, false);
+}
+
+/*
+ * Generic function to return the list of files in pgsql_tmp
+ */
+static Datum
+pg_ls_tmpdir(FunctionCallInfo fcinfo, Oid tblspc)
+{
+ char path[MAXPGPATH];
+
+ if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tblspc)))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("tablespace with OID %u does not exist",
+ tblspc)));
+
+ TempTablespacePath(path, tblspc);
+ return pg_ls_dir_files(fcinfo, path, true);
+}
+
+/*
+ * Function to return the list of temporary files in the pg_default tablespace's
+ * pgsql_tmp directory
+ */
+Datum
+pg_ls_tmpdir_noargs(PG_FUNCTION_ARGS)
+{
+ return pg_ls_tmpdir(fcinfo, DEFAULTTABLESPACE_OID);
+}
+
+/*
+ * Function to return the list of temporary files in the specified tablespace's
+ * pgsql_tmp directory
+ */
+Datum
+pg_ls_tmpdir_1arg(PG_FUNCTION_ARGS)
+{
+ return pg_ls_tmpdir(fcinfo, PG_GETARG_OID(0));
+}
+
+/*
+ * Function to return the list of files in the WAL archive status directory.
+ */
+Datum
+pg_ls_archive_statusdir(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir_files(fcinfo, XLOGDIR "/archive_status", true);
+}
+
+/*
+ * Function to return the list of files in the pg_logical/snapshots directory.
+ */
+Datum
+pg_ls_logicalsnapdir(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir_files(fcinfo, "pg_logical/snapshots", false);
+}
+
+/*
+ * Function to return the list of files in the pg_logical/mappings directory.
+ */
+Datum
+pg_ls_logicalmapdir(PG_FUNCTION_ARGS)
+{
+ return pg_ls_dir_files(fcinfo, "pg_logical/mappings", false);
+}
+
+/*
+ * Function to return the list of files in the pg_replslot/<replication_slot>
+ * directory.
+ */
+Datum
+pg_ls_replslotdir(PG_FUNCTION_ARGS)
+{
+ text *slotname_t;
+ char path[MAXPGPATH];
+ char *slotname;
+
+ slotname_t = PG_GETARG_TEXT_PP(0);
+
+ slotname = text_to_cstring(slotname_t);
+
+ if (!SearchNamedReplicationSlot(slotname, true))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("replication slot \"%s\" does not exist",
+ slotname)));
+
+ snprintf(path, sizeof(path), "pg_replslot/%s", slotname);
+ return pg_ls_dir_files(fcinfo, path, false);
+}
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c
new file mode 100644
index 0000000..f1b632e
--- /dev/null
+++ b/src/backend/utils/adt/geo_ops.c
@@ -0,0 +1,5519 @@
+/*-------------------------------------------------------------------------
+ *
+ * geo_ops.c
+ * 2D geometric operations
+ *
+ * This module implements the geometric functions and operators. The
+ * geometric types are (from simple to more complicated):
+ *
+ * - point
+ * - line
+ * - line segment
+ * - box
+ * - circle
+ * - polygon
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/geo_ops.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+#include <limits.h>
+#include <float.h>
+#include <ctype.h>
+
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/geo_decls.h"
+
+/*
+ * * Type constructors have this form:
+ * void type_construct(Type *result, ...);
+ *
+ * * Operators commonly have signatures such as
+ * void type1_operator_type2(Type *result, Type1 *obj1, Type2 *obj2);
+ *
+ * Common operators are:
+ * * Intersection point:
+ * bool type1_interpt_type2(Point *result, Type1 *obj1, Type2 *obj2);
+ * Return whether the two objects intersect. If *result is not NULL,
+ * it is set to the intersection point.
+ *
+ * * Containment:
+ * bool type1_contain_type2(Type1 *obj1, Type2 *obj2);
+ * Return whether obj1 contains obj2.
+ * bool type1_contain_type2(Type1 *contains_obj, Type1 *contained_obj);
+ * Return whether obj1 contains obj2 (used when types are the same)
+ *
+ * * Distance of closest point in or on obj1 to obj2:
+ * float8 type1_closept_type2(Point *result, Type1 *obj1, Type2 *obj2);
+ * Returns the shortest distance between two objects. If *result is not
+ * NULL, it is set to the closest point in or on obj1 to obj2.
+ *
+ * These functions may be used to implement multiple SQL-level operators. For
+ * example, determining whether two lines are parallel is done by checking
+ * whether they don't intersect.
+ */
+
+/*
+ * Internal routines
+ */
+
+enum path_delim
+{
+ PATH_NONE, PATH_OPEN, PATH_CLOSED
+};
+
+/* Routines for points */
+static inline void point_construct(Point *result, float8 x, float8 y);
+static inline void point_add_point(Point *result, Point *pt1, Point *pt2);
+static inline void point_sub_point(Point *result, Point *pt1, Point *pt2);
+static inline void point_mul_point(Point *result, Point *pt1, Point *pt2);
+static inline void point_div_point(Point *result, Point *pt1, Point *pt2);
+static inline bool point_eq_point(Point *pt1, Point *pt2);
+static inline float8 point_dt(Point *pt1, Point *pt2);
+static inline float8 point_sl(Point *pt1, Point *pt2);
+static int point_inside(Point *p, int npts, Point *plist);
+
+/* Routines for lines */
+static inline void line_construct(LINE *result, Point *pt, float8 m);
+static inline float8 line_sl(LINE *line);
+static inline float8 line_invsl(LINE *line);
+static bool line_interpt_line(Point *result, LINE *l1, LINE *l2);
+static bool line_contain_point(LINE *line, Point *point);
+static float8 line_closept_point(Point *result, LINE *line, Point *pt);
+
+/* Routines for line segments */
+static inline void statlseg_construct(LSEG *lseg, Point *pt1, Point *pt2);
+static inline float8 lseg_sl(LSEG *lseg);
+static inline float8 lseg_invsl(LSEG *lseg);
+static bool lseg_interpt_line(Point *result, LSEG *lseg, LINE *line);
+static bool lseg_interpt_lseg(Point *result, LSEG *l1, LSEG *l2);
+static int lseg_crossing(float8 x, float8 y, float8 px, float8 py);
+static bool lseg_contain_point(LSEG *lseg, Point *point);
+static float8 lseg_closept_point(Point *result, LSEG *lseg, Point *pt);
+static float8 lseg_closept_line(Point *result, LSEG *lseg, LINE *line);
+static float8 lseg_closept_lseg(Point *result, LSEG *on_lseg, LSEG *to_lseg);
+
+/* Routines for boxes */
+static inline void box_construct(BOX *result, Point *pt1, Point *pt2);
+static void box_cn(Point *center, BOX *box);
+static bool box_ov(BOX *box1, BOX *box2);
+static float8 box_ar(BOX *box);
+static float8 box_ht(BOX *box);
+static float8 box_wd(BOX *box);
+static bool box_contain_point(BOX *box, Point *point);
+static bool box_contain_box(BOX *contains_box, BOX *contained_box);
+static bool box_contain_lseg(BOX *box, LSEG *lseg);
+static bool box_interpt_lseg(Point *result, BOX *box, LSEG *lseg);
+static float8 box_closept_point(Point *result, BOX *box, Point *point);
+static float8 box_closept_lseg(Point *result, BOX *box, LSEG *lseg);
+
+/* Routines for circles */
+static float8 circle_ar(CIRCLE *circle);
+
+/* Routines for polygons */
+static void make_bound_box(POLYGON *poly);
+static void poly_to_circle(CIRCLE *result, POLYGON *poly);
+static bool lseg_inside_poly(Point *a, Point *b, POLYGON *poly, int start);
+static bool poly_contain_poly(POLYGON *contains_poly, POLYGON *contained_poly);
+static bool plist_same(int npts, Point *p1, Point *p2);
+static float8 dist_ppoly_internal(Point *pt, POLYGON *poly);
+
+/* Routines for encoding and decoding */
+static float8 single_decode(char *num, char **endptr_p,
+ const char *type_name, const char *orig_string);
+static void single_encode(float8 x, StringInfo str);
+static void pair_decode(char *str, float8 *x, float8 *y, char **endptr_p,
+ const char *type_name, const char *orig_string);
+static void pair_encode(float8 x, float8 y, StringInfo str);
+static int pair_count(char *s, char delim);
+static void path_decode(char *str, bool opentype, int npts, Point *p,
+ bool *isopen, char **endptr_p,
+ const char *type_name, const char *orig_string);
+static char *path_encode(enum path_delim path_delim, int npts, Point *pt);
+
+
+/*
+ * Delimiters for input and output strings.
+ * LDELIM, RDELIM, and DELIM are left, right, and separator delimiters, respectively.
+ * LDELIM_EP, RDELIM_EP are left and right delimiters for paths with endpoints.
+ */
+
+#define LDELIM '('
+#define RDELIM ')'
+#define DELIM ','
+#define LDELIM_EP '['
+#define RDELIM_EP ']'
+#define LDELIM_C '<'
+#define RDELIM_C '>'
+#define LDELIM_L '{'
+#define RDELIM_L '}'
+
+
+/*
+ * Geometric data types are composed of points.
+ * This code tries to support a common format throughout the data types,
+ * to allow for more predictable usage and data type conversion.
+ * The fundamental unit is the point. Other units are line segments,
+ * open paths, boxes, closed paths, and polygons (which should be considered
+ * non-intersecting closed paths).
+ *
+ * Data representation is as follows:
+ * point: (x,y)
+ * line segment: [(x1,y1),(x2,y2)]
+ * box: (x1,y1),(x2,y2)
+ * open path: [(x1,y1),...,(xn,yn)]
+ * closed path: ((x1,y1),...,(xn,yn))
+ * polygon: ((x1,y1),...,(xn,yn))
+ *
+ * For boxes, the points are opposite corners with the first point at the top right.
+ * For closed paths and polygons, the points should be reordered to allow
+ * fast and correct equality comparisons.
+ *
+ * XXX perhaps points in complex shapes should be reordered internally
+ * to allow faster internal operations, but should keep track of input order
+ * and restore that order for text output - tgl 97/01/16
+ */
+
+static float8
+single_decode(char *num, char **endptr_p,
+ const char *type_name, const char *orig_string)
+{
+ return float8in_internal(num, endptr_p, type_name, orig_string);
+} /* single_decode() */
+
+static void
+single_encode(float8 x, StringInfo str)
+{
+ char *xstr = float8out_internal(x);
+
+ appendStringInfoString(str, xstr);
+ pfree(xstr);
+} /* single_encode() */
+
+static void
+pair_decode(char *str, float8 *x, float8 *y, char **endptr_p,
+ const char *type_name, const char *orig_string)
+{
+ bool has_delim;
+
+ while (isspace((unsigned char) *str))
+ str++;
+ if ((has_delim = (*str == LDELIM)))
+ str++;
+
+ *x = float8in_internal(str, &str, type_name, orig_string);
+
+ if (*str++ != DELIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+
+ *y = float8in_internal(str, &str, type_name, orig_string);
+
+ if (has_delim)
+ {
+ if (*str++ != RDELIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+ while (isspace((unsigned char) *str))
+ str++;
+ }
+
+ /* report stopping point if wanted, else complain if not end of string */
+ if (endptr_p)
+ *endptr_p = str;
+ else if (*str != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+}
+
+static void
+pair_encode(float8 x, float8 y, StringInfo str)
+{
+ char *xstr = float8out_internal(x);
+ char *ystr = float8out_internal(y);
+
+ appendStringInfo(str, "%s,%s", xstr, ystr);
+ pfree(xstr);
+ pfree(ystr);
+}
+
+static void
+path_decode(char *str, bool opentype, int npts, Point *p,
+ bool *isopen, char **endptr_p,
+ const char *type_name, const char *orig_string)
+{
+ int depth = 0;
+ char *cp;
+ int i;
+
+ while (isspace((unsigned char) *str))
+ str++;
+ if ((*isopen = (*str == LDELIM_EP)))
+ {
+ /* no open delimiter allowed? */
+ if (!opentype)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+ depth++;
+ str++;
+ }
+ else if (*str == LDELIM)
+ {
+ cp = (str + 1);
+ while (isspace((unsigned char) *cp))
+ cp++;
+ if (*cp == LDELIM)
+ {
+ depth++;
+ str = cp;
+ }
+ else if (strrchr(str, LDELIM) == str)
+ {
+ depth++;
+ str = cp;
+ }
+ }
+
+ for (i = 0; i < npts; i++)
+ {
+ pair_decode(str, &(p->x), &(p->y), &str, type_name, orig_string);
+ if (*str == DELIM)
+ str++;
+ p++;
+ }
+
+ while (depth > 0)
+ {
+ if (*str == RDELIM || (*str == RDELIM_EP && *isopen && depth == 1))
+ {
+ depth--;
+ str++;
+ while (isspace((unsigned char) *str))
+ str++;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+ }
+
+ /* report stopping point if wanted, else complain if not end of string */
+ if (endptr_p)
+ *endptr_p = str;
+ else if (*str != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ type_name, orig_string)));
+} /* path_decode() */
+
+static char *
+path_encode(enum path_delim path_delim, int npts, Point *pt)
+{
+ StringInfoData str;
+ int i;
+
+ initStringInfo(&str);
+
+ switch (path_delim)
+ {
+ case PATH_CLOSED:
+ appendStringInfoChar(&str, LDELIM);
+ break;
+ case PATH_OPEN:
+ appendStringInfoChar(&str, LDELIM_EP);
+ break;
+ case PATH_NONE:
+ break;
+ }
+
+ for (i = 0; i < npts; i++)
+ {
+ if (i > 0)
+ appendStringInfoChar(&str, DELIM);
+ appendStringInfoChar(&str, LDELIM);
+ pair_encode(pt->x, pt->y, &str);
+ appendStringInfoChar(&str, RDELIM);
+ pt++;
+ }
+
+ switch (path_delim)
+ {
+ case PATH_CLOSED:
+ appendStringInfoChar(&str, RDELIM);
+ break;
+ case PATH_OPEN:
+ appendStringInfoChar(&str, RDELIM_EP);
+ break;
+ case PATH_NONE:
+ break;
+ }
+
+ return str.data;
+} /* path_encode() */
+
+/*-------------------------------------------------------------
+ * pair_count - count the number of points
+ * allow the following notation:
+ * '((1,2),(3,4))'
+ * '(1,3,2,4)'
+ * require an odd number of delim characters in the string
+ *-------------------------------------------------------------*/
+static int
+pair_count(char *s, char delim)
+{
+ int ndelim = 0;
+
+ while ((s = strchr(s, delim)) != NULL)
+ {
+ ndelim++;
+ s++;
+ }
+ return (ndelim % 2) ? ((ndelim + 1) / 2) : -1;
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for two-dimensional boxes.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * Formatting and conversion routines.
+ *---------------------------------------------------------*/
+
+/* box_in - convert a string to internal form.
+ *
+ * External format: (two corners of box)
+ * "(f8, f8), (f8, f8)"
+ * also supports the older style "(f8, f8, f8, f8)"
+ */
+Datum
+box_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ BOX *box = (BOX *) palloc(sizeof(BOX));
+ bool isopen;
+ float8 x,
+ y;
+
+ path_decode(str, false, 2, &(box->high), &isopen, NULL, "box", str);
+
+ /* reorder corners if necessary... */
+ if (float8_lt(box->high.x, box->low.x))
+ {
+ x = box->high.x;
+ box->high.x = box->low.x;
+ box->low.x = x;
+ }
+ if (float8_lt(box->high.y, box->low.y))
+ {
+ y = box->high.y;
+ box->high.y = box->low.y;
+ box->low.y = y;
+ }
+
+ PG_RETURN_BOX_P(box);
+}
+
+/* box_out - convert a box to external form.
+ */
+Datum
+box_out(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+
+ PG_RETURN_CSTRING(path_encode(PATH_NONE, 2, &(box->high)));
+}
+
+/*
+ * box_recv - converts external binary format to box
+ */
+Datum
+box_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ BOX *box;
+ float8 x,
+ y;
+
+ box = (BOX *) palloc(sizeof(BOX));
+
+ box->high.x = pq_getmsgfloat8(buf);
+ box->high.y = pq_getmsgfloat8(buf);
+ box->low.x = pq_getmsgfloat8(buf);
+ box->low.y = pq_getmsgfloat8(buf);
+
+ /* reorder corners if necessary... */
+ if (float8_lt(box->high.x, box->low.x))
+ {
+ x = box->high.x;
+ box->high.x = box->low.x;
+ box->low.x = x;
+ }
+ if (float8_lt(box->high.y, box->low.y))
+ {
+ y = box->high.y;
+ box->high.y = box->low.y;
+ box->low.y = y;
+ }
+
+ PG_RETURN_BOX_P(box);
+}
+
+/*
+ * box_send - converts box to binary format
+ */
+Datum
+box_send(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, box->high.x);
+ pq_sendfloat8(&buf, box->high.y);
+ pq_sendfloat8(&buf, box->low.x);
+ pq_sendfloat8(&buf, box->low.y);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/* box_construct - fill in a new box.
+ */
+static inline void
+box_construct(BOX *result, Point *pt1, Point *pt2)
+{
+ if (float8_gt(pt1->x, pt2->x))
+ {
+ result->high.x = pt1->x;
+ result->low.x = pt2->x;
+ }
+ else
+ {
+ result->high.x = pt2->x;
+ result->low.x = pt1->x;
+ }
+ if (float8_gt(pt1->y, pt2->y))
+ {
+ result->high.y = pt1->y;
+ result->low.y = pt2->y;
+ }
+ else
+ {
+ result->high.y = pt2->y;
+ result->low.y = pt1->y;
+ }
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators for BOXes.
+ * <, >, <=, >=, and == are based on box area.
+ *---------------------------------------------------------*/
+
+/* box_same - are two boxes identical?
+ */
+Datum
+box_same(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(point_eq_point(&box1->high, &box2->high) &&
+ point_eq_point(&box1->low, &box2->low));
+}
+
+/* box_overlap - does box1 overlap box2?
+ */
+Datum
+box_overlap(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_ov(box1, box2));
+}
+
+static bool
+box_ov(BOX *box1, BOX *box2)
+{
+ return (FPle(box1->low.x, box2->high.x) &&
+ FPle(box2->low.x, box1->high.x) &&
+ FPle(box1->low.y, box2->high.y) &&
+ FPle(box2->low.y, box1->high.y));
+}
+
+/* box_left - is box1 strictly left of box2?
+ */
+Datum
+box_left(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPlt(box1->high.x, box2->low.x));
+}
+
+/* box_overleft - is the right edge of box1 at or left of
+ * the right edge of box2?
+ *
+ * This is "less than or equal" for the end of a time range,
+ * when time ranges are stored as rectangles.
+ */
+Datum
+box_overleft(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPle(box1->high.x, box2->high.x));
+}
+
+/* box_right - is box1 strictly right of box2?
+ */
+Datum
+box_right(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPgt(box1->low.x, box2->high.x));
+}
+
+/* box_overright - is the left edge of box1 at or right of
+ * the left edge of box2?
+ *
+ * This is "greater than or equal" for time ranges, when time ranges
+ * are stored as rectangles.
+ */
+Datum
+box_overright(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPge(box1->low.x, box2->low.x));
+}
+
+/* box_below - is box1 strictly below box2?
+ */
+Datum
+box_below(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPlt(box1->high.y, box2->low.y));
+}
+
+/* box_overbelow - is the upper edge of box1 at or below
+ * the upper edge of box2?
+ */
+Datum
+box_overbelow(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPle(box1->high.y, box2->high.y));
+}
+
+/* box_above - is box1 strictly above box2?
+ */
+Datum
+box_above(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPgt(box1->low.y, box2->high.y));
+}
+
+/* box_overabove - is the lower edge of box1 at or above
+ * the lower edge of box2?
+ */
+Datum
+box_overabove(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPge(box1->low.y, box2->low.y));
+}
+
+/* box_contained - is box1 contained by box2?
+ */
+Datum
+box_contained(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_contain_box(box2, box1));
+}
+
+/* box_contain - does box1 contain box2?
+ */
+Datum
+box_contain(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_contain_box(box1, box2));
+}
+
+/*
+ * Check whether the second box is in the first box or on its border
+ */
+static bool
+box_contain_box(BOX *contains_box, BOX *contained_box)
+{
+ return FPge(contains_box->high.x, contained_box->high.x) &&
+ FPle(contains_box->low.x, contained_box->low.x) &&
+ FPge(contains_box->high.y, contained_box->high.y) &&
+ FPle(contains_box->low.y, contained_box->low.y);
+}
+
+
+/* box_positionop -
+ * is box1 entirely {above,below} box2?
+ *
+ * box_below_eq and box_above_eq are obsolete versions that (probably
+ * erroneously) accept the equal-boundaries case. Since these are not
+ * in sync with the box_left and box_right code, they are deprecated and
+ * not supported in the PG 8.1 rtree operator class extension.
+ */
+Datum
+box_below_eq(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPle(box1->high.y, box2->low.y));
+}
+
+Datum
+box_above_eq(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPge(box1->low.y, box2->high.y));
+}
+
+
+/* box_relop - is area(box1) relop area(box2), within
+ * our accuracy constraint?
+ */
+Datum
+box_lt(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPlt(box_ar(box1), box_ar(box2)));
+}
+
+Datum
+box_gt(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPgt(box_ar(box1), box_ar(box2)));
+}
+
+Datum
+box_eq(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPeq(box_ar(box1), box_ar(box2)));
+}
+
+Datum
+box_le(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPle(box_ar(box1), box_ar(box2)));
+}
+
+Datum
+box_ge(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(FPge(box_ar(box1), box_ar(box2)));
+}
+
+
+/*----------------------------------------------------------
+ * "Arithmetic" operators on boxes.
+ *---------------------------------------------------------*/
+
+/* box_area - returns the area of the box.
+ */
+Datum
+box_area(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+
+ PG_RETURN_FLOAT8(box_ar(box));
+}
+
+
+/* box_width - returns the width of the box
+ * (horizontal magnitude).
+ */
+Datum
+box_width(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+
+ PG_RETURN_FLOAT8(box_wd(box));
+}
+
+
+/* box_height - returns the height of the box
+ * (vertical magnitude).
+ */
+Datum
+box_height(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+
+ PG_RETURN_FLOAT8(box_ht(box));
+}
+
+
+/* box_distance - returns the distance between the
+ * center points of two boxes.
+ */
+Datum
+box_distance(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+ Point a,
+ b;
+
+ box_cn(&a, box1);
+ box_cn(&b, box2);
+
+ PG_RETURN_FLOAT8(point_dt(&a, &b));
+}
+
+
+/* box_center - returns the center point of the box.
+ */
+Datum
+box_center(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *result = (Point *) palloc(sizeof(Point));
+
+ box_cn(result, box);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/* box_ar - returns the area of the box.
+ */
+static float8
+box_ar(BOX *box)
+{
+ return float8_mul(box_wd(box), box_ht(box));
+}
+
+
+/* box_cn - stores the centerpoint of the box into *center.
+ */
+static void
+box_cn(Point *center, BOX *box)
+{
+ center->x = float8_div(float8_pl(box->high.x, box->low.x), 2.0);
+ center->y = float8_div(float8_pl(box->high.y, box->low.y), 2.0);
+}
+
+
+/* box_wd - returns the width (length) of the box
+ * (horizontal magnitude).
+ */
+static float8
+box_wd(BOX *box)
+{
+ return float8_mi(box->high.x, box->low.x);
+}
+
+
+/* box_ht - returns the height of the box
+ * (vertical magnitude).
+ */
+static float8
+box_ht(BOX *box)
+{
+ return float8_mi(box->high.y, box->low.y);
+}
+
+
+/*----------------------------------------------------------
+ * Funky operations.
+ *---------------------------------------------------------*/
+
+/* box_intersect -
+ * returns the overlapping portion of two boxes,
+ * or NULL if they do not intersect.
+ */
+Datum
+box_intersect(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0);
+ BOX *box2 = PG_GETARG_BOX_P(1);
+ BOX *result;
+
+ if (!box_ov(box1, box2))
+ PG_RETURN_NULL();
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ result->high.x = float8_min(box1->high.x, box2->high.x);
+ result->low.x = float8_max(box1->low.x, box2->low.x);
+ result->high.y = float8_min(box1->high.y, box2->high.y);
+ result->low.y = float8_max(box1->low.y, box2->low.y);
+
+ PG_RETURN_BOX_P(result);
+}
+
+
+/* box_diagonal -
+ * returns a line segment which happens to be the
+ * positive-slope diagonal of "box".
+ */
+Datum
+box_diagonal(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ LSEG *result = (LSEG *) palloc(sizeof(LSEG));
+
+ statlseg_construct(result, &box->high, &box->low);
+
+ PG_RETURN_LSEG_P(result);
+}
+
+/***********************************************************************
+ **
+ ** Routines for 2D lines.
+ **
+ ***********************************************************************/
+
+static bool
+line_decode(char *s, const char *str, LINE *line)
+{
+ /* s was already advanced over leading '{' */
+ line->A = single_decode(s, &s, "line", str);
+ if (*s++ != DELIM)
+ return false;
+ line->B = single_decode(s, &s, "line", str);
+ if (*s++ != DELIM)
+ return false;
+ line->C = single_decode(s, &s, "line", str);
+ if (*s++ != RDELIM_L)
+ return false;
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s != '\0')
+ return false;
+ return true;
+}
+
+Datum
+line_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ LINE *line = (LINE *) palloc(sizeof(LINE));
+ LSEG lseg;
+ bool isopen;
+ char *s;
+
+ s = str;
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s == LDELIM_L)
+ {
+ if (!line_decode(s + 1, str, line))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "line", str)));
+ if (FPzero(line->A) && FPzero(line->B))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid line specification: A and B cannot both be zero")));
+ }
+ else
+ {
+ path_decode(s, true, 2, &lseg.p[0], &isopen, NULL, "line", str);
+ if (point_eq_point(&lseg.p[0], &lseg.p[1]))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid line specification: must be two distinct points")));
+ line_construct(line, &lseg.p[0], lseg_sl(&lseg));
+ }
+
+ PG_RETURN_LINE_P(line);
+}
+
+
+Datum
+line_out(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ char *astr = float8out_internal(line->A);
+ char *bstr = float8out_internal(line->B);
+ char *cstr = float8out_internal(line->C);
+
+ PG_RETURN_CSTRING(psprintf("%c%s%c%s%c%s%c", LDELIM_L, astr, DELIM, bstr,
+ DELIM, cstr, RDELIM_L));
+}
+
+/*
+ * line_recv - converts external binary format to line
+ */
+Datum
+line_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ LINE *line;
+
+ line = (LINE *) palloc(sizeof(LINE));
+
+ line->A = pq_getmsgfloat8(buf);
+ line->B = pq_getmsgfloat8(buf);
+ line->C = pq_getmsgfloat8(buf);
+
+ if (FPzero(line->A) && FPzero(line->B))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid line specification: A and B cannot both be zero")));
+
+ PG_RETURN_LINE_P(line);
+}
+
+/*
+ * line_send - converts line to binary format
+ */
+Datum
+line_send(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, line->A);
+ pq_sendfloat8(&buf, line->B);
+ pq_sendfloat8(&buf, line->C);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*----------------------------------------------------------
+ * Conversion routines from one line formula to internal.
+ * Internal form: Ax+By+C=0
+ *---------------------------------------------------------*/
+
+/*
+ * Fill already-allocated LINE struct from the point and the slope
+ */
+static inline void
+line_construct(LINE *result, Point *pt, float8 m)
+{
+ if (isinf(m))
+ {
+ /* vertical - use "x = C" */
+ result->A = -1.0;
+ result->B = 0.0;
+ result->C = pt->x;
+ }
+ else if (m == 0)
+ {
+ /* horizontal - use "y = C" */
+ result->A = 0.0;
+ result->B = -1.0;
+ result->C = pt->y;
+ }
+ else
+ {
+ /* use "mx - y + yinter = 0" */
+ result->A = m;
+ result->B = -1.0;
+ result->C = float8_mi(pt->y, float8_mul(m, pt->x));
+ /* on some platforms, the preceding expression tends to produce -0 */
+ if (result->C == 0.0)
+ result->C = 0.0;
+ }
+}
+
+/* line_construct_pp()
+ * two points
+ */
+Datum
+line_construct_pp(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+ LINE *result = (LINE *) palloc(sizeof(LINE));
+
+ if (point_eq_point(pt1, pt2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid line specification: must be two distinct points")));
+
+ line_construct(result, pt1, point_sl(pt1, pt2));
+
+ PG_RETURN_LINE_P(result);
+}
+
+
+/*----------------------------------------------------------
+ * Relative position routines.
+ *---------------------------------------------------------*/
+
+Datum
+line_intersect(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_BOOL(line_interpt_line(NULL, l1, l2));
+}
+
+Datum
+line_parallel(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_BOOL(!line_interpt_line(NULL, l1, l2));
+}
+
+Datum
+line_perp(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+
+ if (FPzero(l1->A))
+ PG_RETURN_BOOL(FPzero(l2->B));
+ if (FPzero(l2->A))
+ PG_RETURN_BOOL(FPzero(l1->B));
+ if (FPzero(l1->B))
+ PG_RETURN_BOOL(FPzero(l2->A));
+ if (FPzero(l2->B))
+ PG_RETURN_BOOL(FPzero(l1->A));
+
+ PG_RETURN_BOOL(FPeq(float8_div(float8_mul(l1->A, l2->A),
+ float8_mul(l1->B, l2->B)), -1.0));
+}
+
+Datum
+line_vertical(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+
+ PG_RETURN_BOOL(FPzero(line->B));
+}
+
+Datum
+line_horizontal(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+
+ PG_RETURN_BOOL(FPzero(line->A));
+}
+
+
+/*
+ * Check whether the two lines are the same
+ */
+Datum
+line_eq(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+ float8 ratio;
+
+ /* If any NaNs are involved, insist on exact equality */
+ if (unlikely(isnan(l1->A) || isnan(l1->B) || isnan(l1->C) ||
+ isnan(l2->A) || isnan(l2->B) || isnan(l2->C)))
+ {
+ PG_RETURN_BOOL(float8_eq(l1->A, l2->A) &&
+ float8_eq(l1->B, l2->B) &&
+ float8_eq(l1->C, l2->C));
+ }
+
+ /* Otherwise, lines whose parameters are proportional are the same */
+ if (!FPzero(l2->A))
+ ratio = float8_div(l1->A, l2->A);
+ else if (!FPzero(l2->B))
+ ratio = float8_div(l1->B, l2->B);
+ else if (!FPzero(l2->C))
+ ratio = float8_div(l1->C, l2->C);
+ else
+ ratio = 1.0;
+
+ PG_RETURN_BOOL(FPeq(l1->A, float8_mul(ratio, l2->A)) &&
+ FPeq(l1->B, float8_mul(ratio, l2->B)) &&
+ FPeq(l1->C, float8_mul(ratio, l2->C)));
+}
+
+
+/*----------------------------------------------------------
+ * Line arithmetic routines.
+ *---------------------------------------------------------*/
+
+/*
+ * Return slope of the line
+ */
+static inline float8
+line_sl(LINE *line)
+{
+ if (FPzero(line->A))
+ return 0.0;
+ if (FPzero(line->B))
+ return get_float8_infinity();
+ return float8_div(line->A, -line->B);
+}
+
+
+/*
+ * Return inverse slope of the line
+ */
+static inline float8
+line_invsl(LINE *line)
+{
+ if (FPzero(line->A))
+ return get_float8_infinity();
+ if (FPzero(line->B))
+ return 0.0;
+ return float8_div(line->B, line->A);
+}
+
+
+/* line_distance()
+ * Distance between two lines.
+ */
+Datum
+line_distance(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+ float8 ratio;
+
+ if (line_interpt_line(NULL, l1, l2)) /* intersecting? */
+ PG_RETURN_FLOAT8(0.0);
+
+ if (!FPzero(l1->A) && !isnan(l1->A) && !FPzero(l2->A) && !isnan(l2->A))
+ ratio = float8_div(l1->A, l2->A);
+ else if (!FPzero(l1->B) && !isnan(l1->B) && !FPzero(l2->B) && !isnan(l2->B))
+ ratio = float8_div(l1->B, l2->B);
+ else
+ ratio = 1.0;
+
+ PG_RETURN_FLOAT8(float8_div(fabs(float8_mi(l1->C,
+ float8_mul(ratio, l2->C))),
+ HYPOT(l1->A, l1->B)));
+}
+
+/* line_interpt()
+ * Point where two lines l1, l2 intersect (if any)
+ */
+Datum
+line_interpt(PG_FUNCTION_ARGS)
+{
+ LINE *l1 = PG_GETARG_LINE_P(0);
+ LINE *l2 = PG_GETARG_LINE_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (!line_interpt_line(result, l1, l2))
+ PG_RETURN_NULL();
+ PG_RETURN_POINT_P(result);
+}
+
+/*
+ * Internal version of line_interpt
+ *
+ * Return whether two lines intersect. If *result is not NULL, it is set to
+ * the intersection point.
+ *
+ * NOTE: If the lines are identical then we will find they are parallel
+ * and report "no intersection". This is a little weird, but since
+ * there's no *unique* intersection, maybe it's appropriate behavior.
+ *
+ * If the lines have NaN constants, we will return true, and the intersection
+ * point would have NaN coordinates. We shouldn't return false in this case
+ * because that would mean the lines are parallel.
+ */
+static bool
+line_interpt_line(Point *result, LINE *l1, LINE *l2)
+{
+ float8 x,
+ y;
+
+ if (!FPzero(l1->B))
+ {
+ if (FPeq(l2->A, float8_mul(l1->A, float8_div(l2->B, l1->B))))
+ return false;
+
+ x = float8_div(float8_mi(float8_mul(l1->B, l2->C),
+ float8_mul(l2->B, l1->C)),
+ float8_mi(float8_mul(l1->A, l2->B),
+ float8_mul(l2->A, l1->B)));
+ y = float8_div(-float8_pl(float8_mul(l1->A, x), l1->C), l1->B);
+ }
+ else if (!FPzero(l2->B))
+ {
+ if (FPeq(l1->A, float8_mul(l2->A, float8_div(l1->B, l2->B))))
+ return false;
+
+ x = float8_div(float8_mi(float8_mul(l2->B, l1->C),
+ float8_mul(l1->B, l2->C)),
+ float8_mi(float8_mul(l2->A, l1->B),
+ float8_mul(l1->A, l2->B)));
+ y = float8_div(-float8_pl(float8_mul(l2->A, x), l2->C), l2->B);
+ }
+ else
+ return false;
+
+ /* On some platforms, the preceding expressions tend to produce -0. */
+ if (x == 0.0)
+ x = 0.0;
+ if (y == 0.0)
+ y = 0.0;
+
+ if (result != NULL)
+ point_construct(result, x, y);
+
+ return true;
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D paths (sequences of line segments, also
+ ** called `polylines').
+ **
+ ** This is not a general package for geometric paths,
+ ** which of course include polygons; the emphasis here
+ ** is on (for example) usefulness in wire layout.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * String to path / path to string conversion.
+ * External format:
+ * "((xcoord, ycoord),... )"
+ * "[(xcoord, ycoord),... ]"
+ * "(xcoord, ycoord),... "
+ * "[xcoord, ycoord,... ]"
+ * Also support older format:
+ * "(closed, npts, xcoord, ycoord,... )"
+ *---------------------------------------------------------*/
+
+Datum
+path_area(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+ float8 area = 0.0;
+ int i,
+ j;
+
+ if (!path->closed)
+ PG_RETURN_NULL();
+
+ for (i = 0; i < path->npts; i++)
+ {
+ j = (i + 1) % path->npts;
+ area = float8_pl(area, float8_mul(path->p[i].x, path->p[j].y));
+ area = float8_mi(area, float8_mul(path->p[i].y, path->p[j].x));
+ }
+
+ PG_RETURN_FLOAT8(float8_div(fabs(area), 2.0));
+}
+
+
+Datum
+path_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ PATH *path;
+ bool isopen;
+ char *s;
+ int npts;
+ int size;
+ int base_size;
+ int depth = 0;
+
+ if ((npts = pair_count(str, ',')) <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "path", str)));
+
+ s = str;
+ while (isspace((unsigned char) *s))
+ s++;
+
+ /* skip single leading paren */
+ if ((*s == LDELIM) && (strrchr(s, LDELIM) == s))
+ {
+ s++;
+ depth++;
+ }
+
+ base_size = sizeof(path->p[0]) * npts;
+ size = offsetof(PATH, p) + base_size;
+
+ /* Check for integer overflow */
+ if (base_size / npts != sizeof(path->p[0]) || size <= base_size)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many points requested")));
+
+ path = (PATH *) palloc(size);
+
+ SET_VARSIZE(path, size);
+ path->npts = npts;
+
+ path_decode(s, true, npts, &(path->p[0]), &isopen, &s, "path", str);
+
+ if (depth >= 1)
+ {
+ if (*s++ != RDELIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "path", str)));
+ while (isspace((unsigned char) *s))
+ s++;
+ }
+ if (*s != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "path", str)));
+
+ path->closed = (!isopen);
+ /* prevent instability in unused pad bytes */
+ path->dummy = 0;
+
+ PG_RETURN_PATH_P(path);
+}
+
+
+Datum
+path_out(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+
+ PG_RETURN_CSTRING(path_encode(path->closed ? PATH_CLOSED : PATH_OPEN, path->npts, path->p));
+}
+
+/*
+ * path_recv - converts external binary format to path
+ *
+ * External representation is closed flag (a boolean byte), int32 number
+ * of points, and the points.
+ */
+Datum
+path_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ PATH *path;
+ int closed;
+ int32 npts;
+ int32 i;
+ int size;
+
+ closed = pq_getmsgbyte(buf);
+ npts = pq_getmsgint(buf, sizeof(int32));
+ if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(PATH, p)) / sizeof(Point)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid number of points in external \"path\" value")));
+
+ size = offsetof(PATH, p) + sizeof(path->p[0]) * npts;
+ path = (PATH *) palloc(size);
+
+ SET_VARSIZE(path, size);
+ path->npts = npts;
+ path->closed = (closed ? 1 : 0);
+ /* prevent instability in unused pad bytes */
+ path->dummy = 0;
+
+ for (i = 0; i < npts; i++)
+ {
+ path->p[i].x = pq_getmsgfloat8(buf);
+ path->p[i].y = pq_getmsgfloat8(buf);
+ }
+
+ PG_RETURN_PATH_P(path);
+}
+
+/*
+ * path_send - converts path to binary format
+ */
+Datum
+path_send(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+ StringInfoData buf;
+ int32 i;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, path->closed ? 1 : 0);
+ pq_sendint32(&buf, path->npts);
+ for (i = 0; i < path->npts; i++)
+ {
+ pq_sendfloat8(&buf, path->p[i].x);
+ pq_sendfloat8(&buf, path->p[i].y);
+ }
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators.
+ * These are based on the path cardinality,
+ * as stupid as that sounds.
+ *
+ * Better relops and access methods coming soon.
+ *---------------------------------------------------------*/
+
+Datum
+path_n_lt(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_BOOL(p1->npts < p2->npts);
+}
+
+Datum
+path_n_gt(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_BOOL(p1->npts > p2->npts);
+}
+
+Datum
+path_n_eq(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_BOOL(p1->npts == p2->npts);
+}
+
+Datum
+path_n_le(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_BOOL(p1->npts <= p2->npts);
+}
+
+Datum
+path_n_ge(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_BOOL(p1->npts >= p2->npts);
+}
+
+/*----------------------------------------------------------
+ * Conversion operators.
+ *---------------------------------------------------------*/
+
+Datum
+path_isclosed(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+
+ PG_RETURN_BOOL(path->closed);
+}
+
+Datum
+path_isopen(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+
+ PG_RETURN_BOOL(!path->closed);
+}
+
+Datum
+path_npoints(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+
+ PG_RETURN_INT32(path->npts);
+}
+
+
+Datum
+path_close(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+
+ path->closed = true;
+
+ PG_RETURN_PATH_P(path);
+}
+
+Datum
+path_open(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+
+ path->closed = false;
+
+ PG_RETURN_PATH_P(path);
+}
+
+
+/* path_inter -
+ * Does p1 intersect p2 at any point?
+ * Use bounding boxes for a quick (O(n)) check, then do a
+ * O(n^2) iterative edge check.
+ */
+Datum
+path_inter(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+ BOX b1,
+ b2;
+ int i,
+ j;
+ LSEG seg1,
+ seg2;
+
+ Assert(p1->npts > 0 && p2->npts > 0);
+
+ b1.high.x = b1.low.x = p1->p[0].x;
+ b1.high.y = b1.low.y = p1->p[0].y;
+ for (i = 1; i < p1->npts; i++)
+ {
+ b1.high.x = float8_max(p1->p[i].x, b1.high.x);
+ b1.high.y = float8_max(p1->p[i].y, b1.high.y);
+ b1.low.x = float8_min(p1->p[i].x, b1.low.x);
+ b1.low.y = float8_min(p1->p[i].y, b1.low.y);
+ }
+ b2.high.x = b2.low.x = p2->p[0].x;
+ b2.high.y = b2.low.y = p2->p[0].y;
+ for (i = 1; i < p2->npts; i++)
+ {
+ b2.high.x = float8_max(p2->p[i].x, b2.high.x);
+ b2.high.y = float8_max(p2->p[i].y, b2.high.y);
+ b2.low.x = float8_min(p2->p[i].x, b2.low.x);
+ b2.low.y = float8_min(p2->p[i].y, b2.low.y);
+ }
+ if (!box_ov(&b1, &b2))
+ PG_RETURN_BOOL(false);
+
+ /* pairwise check lseg intersections */
+ for (i = 0; i < p1->npts; i++)
+ {
+ int iprev;
+
+ if (i > 0)
+ iprev = i - 1;
+ else
+ {
+ if (!p1->closed)
+ continue;
+ iprev = p1->npts - 1; /* include the closure segment */
+ }
+
+ for (j = 0; j < p2->npts; j++)
+ {
+ int jprev;
+
+ if (j > 0)
+ jprev = j - 1;
+ else
+ {
+ if (!p2->closed)
+ continue;
+ jprev = p2->npts - 1; /* include the closure segment */
+ }
+
+ statlseg_construct(&seg1, &p1->p[iprev], &p1->p[i]);
+ statlseg_construct(&seg2, &p2->p[jprev], &p2->p[j]);
+ if (lseg_interpt_lseg(NULL, &seg1, &seg2))
+ PG_RETURN_BOOL(true);
+ }
+ }
+
+ /* if we dropped through, no two segs intersected */
+ PG_RETURN_BOOL(false);
+}
+
+/* path_distance()
+ * This essentially does a cartesian product of the lsegs in the
+ * two paths, and finds the min distance between any two lsegs
+ */
+Datum
+path_distance(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+ float8 min = 0.0; /* initialize to keep compiler quiet */
+ bool have_min = false;
+ float8 tmp;
+ int i,
+ j;
+ LSEG seg1,
+ seg2;
+
+ for (i = 0; i < p1->npts; i++)
+ {
+ int iprev;
+
+ if (i > 0)
+ iprev = i - 1;
+ else
+ {
+ if (!p1->closed)
+ continue;
+ iprev = p1->npts - 1; /* include the closure segment */
+ }
+
+ for (j = 0; j < p2->npts; j++)
+ {
+ int jprev;
+
+ if (j > 0)
+ jprev = j - 1;
+ else
+ {
+ if (!p2->closed)
+ continue;
+ jprev = p2->npts - 1; /* include the closure segment */
+ }
+
+ statlseg_construct(&seg1, &p1->p[iprev], &p1->p[i]);
+ statlseg_construct(&seg2, &p2->p[jprev], &p2->p[j]);
+
+ tmp = lseg_closept_lseg(NULL, &seg1, &seg2);
+ if (!have_min || float8_lt(tmp, min))
+ {
+ min = tmp;
+ have_min = true;
+ }
+ }
+ }
+
+ if (!have_min)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(min);
+}
+
+
+/*----------------------------------------------------------
+ * "Arithmetic" operations.
+ *---------------------------------------------------------*/
+
+Datum
+path_length(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+ float8 result = 0.0;
+ int i;
+
+ for (i = 0; i < path->npts; i++)
+ {
+ int iprev;
+
+ if (i > 0)
+ iprev = i - 1;
+ else
+ {
+ if (!path->closed)
+ continue;
+ iprev = path->npts - 1; /* include the closure segment */
+ }
+
+ result = float8_pl(result, point_dt(&path->p[iprev], &path->p[i]));
+ }
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/***********************************************************************
+ **
+ ** Routines for 2D points.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * String to point, point to string conversion.
+ * External format:
+ * "(x,y)"
+ * "x,y"
+ *---------------------------------------------------------*/
+
+Datum
+point_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ Point *point = (Point *) palloc(sizeof(Point));
+
+ pair_decode(str, &point->x, &point->y, NULL, "point", str);
+ PG_RETURN_POINT_P(point);
+}
+
+Datum
+point_out(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+
+ PG_RETURN_CSTRING(path_encode(PATH_NONE, 1, pt));
+}
+
+/*
+ * point_recv - converts external binary format to point
+ */
+Datum
+point_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Point *point;
+
+ point = (Point *) palloc(sizeof(Point));
+ point->x = pq_getmsgfloat8(buf);
+ point->y = pq_getmsgfloat8(buf);
+ PG_RETURN_POINT_P(point);
+}
+
+/*
+ * point_send - converts point to binary format
+ */
+Datum
+point_send(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, pt->x);
+ pq_sendfloat8(&buf, pt->y);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * Initialize a point
+ */
+static inline void
+point_construct(Point *result, float8 x, float8 y)
+{
+ result->x = x;
+ result->y = y;
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators for Points.
+ * Since we do have a sense of coordinates being
+ * "equal" to a given accuracy (point_vert, point_horiz),
+ * the other ops must preserve that sense. This means
+ * that results may, strictly speaking, be a lie (unless
+ * EPSILON = 0.0).
+ *---------------------------------------------------------*/
+
+Datum
+point_left(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPlt(pt1->x, pt2->x));
+}
+
+Datum
+point_right(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPgt(pt1->x, pt2->x));
+}
+
+Datum
+point_above(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPgt(pt1->y, pt2->y));
+}
+
+Datum
+point_below(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPlt(pt1->y, pt2->y));
+}
+
+Datum
+point_vert(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPeq(pt1->x, pt2->x));
+}
+
+Datum
+point_horiz(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(FPeq(pt1->y, pt2->y));
+}
+
+Datum
+point_eq(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(point_eq_point(pt1, pt2));
+}
+
+Datum
+point_ne(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(!point_eq_point(pt1, pt2));
+}
+
+
+/*
+ * Check whether the two points are the same
+ */
+static inline bool
+point_eq_point(Point *pt1, Point *pt2)
+{
+ /* If any NaNs are involved, insist on exact equality */
+ if (unlikely(isnan(pt1->x) || isnan(pt1->y) ||
+ isnan(pt2->x) || isnan(pt2->y)))
+ return (float8_eq(pt1->x, pt2->x) && float8_eq(pt1->y, pt2->y));
+
+ return (FPeq(pt1->x, pt2->x) && FPeq(pt1->y, pt2->y));
+}
+
+
+/*----------------------------------------------------------
+ * "Arithmetic" operators on points.
+ *---------------------------------------------------------*/
+
+Datum
+point_distance(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(point_dt(pt1, pt2));
+}
+
+static inline float8
+point_dt(Point *pt1, Point *pt2)
+{
+ return HYPOT(float8_mi(pt1->x, pt2->x), float8_mi(pt1->y, pt2->y));
+}
+
+Datum
+point_slope(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(point_sl(pt1, pt2));
+}
+
+
+/*
+ * Return slope of two points
+ *
+ * Note that this function returns Inf when the points are the same.
+ */
+static inline float8
+point_sl(Point *pt1, Point *pt2)
+{
+ if (FPeq(pt1->x, pt2->x))
+ return get_float8_infinity();
+ if (FPeq(pt1->y, pt2->y))
+ return 0.0;
+ return float8_div(float8_mi(pt1->y, pt2->y), float8_mi(pt1->x, pt2->x));
+}
+
+
+/*
+ * Return inverse slope of two points
+ *
+ * Note that this function returns 0.0 when the points are the same.
+ */
+static inline float8
+point_invsl(Point *pt1, Point *pt2)
+{
+ if (FPeq(pt1->x, pt2->x))
+ return 0.0;
+ if (FPeq(pt1->y, pt2->y))
+ return get_float8_infinity();
+ return float8_div(float8_mi(pt1->x, pt2->x), float8_mi(pt2->y, pt1->y));
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D line segments.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * String to lseg, lseg to string conversion.
+ * External forms: "[(x1, y1), (x2, y2)]"
+ * "(x1, y1), (x2, y2)"
+ * "x1, y1, x2, y2"
+ * closed form ok "((x1, y1), (x2, y2))"
+ * (old form) "(x1, y1, x2, y2)"
+ *---------------------------------------------------------*/
+
+Datum
+lseg_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ LSEG *lseg = (LSEG *) palloc(sizeof(LSEG));
+ bool isopen;
+
+ path_decode(str, true, 2, &lseg->p[0], &isopen, NULL, "lseg", str);
+ PG_RETURN_LSEG_P(lseg);
+}
+
+
+Datum
+lseg_out(PG_FUNCTION_ARGS)
+{
+ LSEG *ls = PG_GETARG_LSEG_P(0);
+
+ PG_RETURN_CSTRING(path_encode(PATH_OPEN, 2, &ls->p[0]));
+}
+
+/*
+ * lseg_recv - converts external binary format to lseg
+ */
+Datum
+lseg_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ LSEG *lseg;
+
+ lseg = (LSEG *) palloc(sizeof(LSEG));
+
+ lseg->p[0].x = pq_getmsgfloat8(buf);
+ lseg->p[0].y = pq_getmsgfloat8(buf);
+ lseg->p[1].x = pq_getmsgfloat8(buf);
+ lseg->p[1].y = pq_getmsgfloat8(buf);
+
+ PG_RETURN_LSEG_P(lseg);
+}
+
+/*
+ * lseg_send - converts lseg to binary format
+ */
+Datum
+lseg_send(PG_FUNCTION_ARGS)
+{
+ LSEG *ls = PG_GETARG_LSEG_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, ls->p[0].x);
+ pq_sendfloat8(&buf, ls->p[0].y);
+ pq_sendfloat8(&buf, ls->p[1].x);
+ pq_sendfloat8(&buf, ls->p[1].y);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/* lseg_construct -
+ * form a LSEG from two Points.
+ */
+Datum
+lseg_construct(PG_FUNCTION_ARGS)
+{
+ Point *pt1 = PG_GETARG_POINT_P(0);
+ Point *pt2 = PG_GETARG_POINT_P(1);
+ LSEG *result = (LSEG *) palloc(sizeof(LSEG));
+
+ statlseg_construct(result, pt1, pt2);
+
+ PG_RETURN_LSEG_P(result);
+}
+
+/* like lseg_construct, but assume space already allocated */
+static inline void
+statlseg_construct(LSEG *lseg, Point *pt1, Point *pt2)
+{
+ lseg->p[0].x = pt1->x;
+ lseg->p[0].y = pt1->y;
+ lseg->p[1].x = pt2->x;
+ lseg->p[1].y = pt2->y;
+}
+
+
+/*
+ * Return slope of the line segment
+ */
+static inline float8
+lseg_sl(LSEG *lseg)
+{
+ return point_sl(&lseg->p[0], &lseg->p[1]);
+}
+
+
+/*
+ * Return inverse slope of the line segment
+ */
+static inline float8
+lseg_invsl(LSEG *lseg)
+{
+ return point_invsl(&lseg->p[0], &lseg->p[1]);
+}
+
+
+Datum
+lseg_length(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+
+ PG_RETURN_FLOAT8(point_dt(&lseg->p[0], &lseg->p[1]));
+}
+
+/*----------------------------------------------------------
+ * Relative position routines.
+ *---------------------------------------------------------*/
+
+/*
+ ** find intersection of the two lines, and see if it falls on
+ ** both segments.
+ */
+Datum
+lseg_intersect(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(lseg_interpt_lseg(NULL, l1, l2));
+}
+
+
+Datum
+lseg_parallel(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPeq(lseg_sl(l1), lseg_sl(l2)));
+}
+
+/*
+ * Determine if two line segments are perpendicular.
+ */
+Datum
+lseg_perp(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPeq(lseg_sl(l1), lseg_invsl(l2)));
+}
+
+Datum
+lseg_vertical(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+
+ PG_RETURN_BOOL(FPeq(lseg->p[0].x, lseg->p[1].x));
+}
+
+Datum
+lseg_horizontal(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+
+ PG_RETURN_BOOL(FPeq(lseg->p[0].y, lseg->p[1].y));
+}
+
+
+Datum
+lseg_eq(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(point_eq_point(&l1->p[0], &l2->p[0]) &&
+ point_eq_point(&l1->p[1], &l2->p[1]));
+}
+
+Datum
+lseg_ne(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(!point_eq_point(&l1->p[0], &l2->p[0]) ||
+ !point_eq_point(&l1->p[1], &l2->p[1]));
+}
+
+Datum
+lseg_lt(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPlt(point_dt(&l1->p[0], &l1->p[1]),
+ point_dt(&l2->p[0], &l2->p[1])));
+}
+
+Datum
+lseg_le(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPle(point_dt(&l1->p[0], &l1->p[1]),
+ point_dt(&l2->p[0], &l2->p[1])));
+}
+
+Datum
+lseg_gt(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPgt(point_dt(&l1->p[0], &l1->p[1]),
+ point_dt(&l2->p[0], &l2->p[1])));
+}
+
+Datum
+lseg_ge(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(FPge(point_dt(&l1->p[0], &l1->p[1]),
+ point_dt(&l2->p[0], &l2->p[1])));
+}
+
+
+/*----------------------------------------------------------
+ * Line arithmetic routines.
+ *---------------------------------------------------------*/
+
+/* lseg_distance -
+ * If two segments don't intersect, then the closest
+ * point will be from one of the endpoints to the other
+ * segment.
+ */
+Datum
+lseg_distance(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_FLOAT8(lseg_closept_lseg(NULL, l1, l2));
+}
+
+
+Datum
+lseg_center(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ result->x = float8_div(float8_pl(lseg->p[0].x, lseg->p[1].x), 2.0);
+ result->y = float8_div(float8_pl(lseg->p[0].y, lseg->p[1].y), 2.0);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*
+ * Return whether the two segments intersect. If *result is not NULL,
+ * it is set to the intersection point.
+ *
+ * This function is almost perfectly symmetric, even though it doesn't look
+ * like it. See lseg_interpt_line() for the other half of it.
+ */
+static bool
+lseg_interpt_lseg(Point *result, LSEG *l1, LSEG *l2)
+{
+ Point interpt;
+ LINE tmp;
+
+ line_construct(&tmp, &l2->p[0], lseg_sl(l2));
+ if (!lseg_interpt_line(&interpt, l1, &tmp))
+ return false;
+
+ /*
+ * If the line intersection point isn't within l2, there is no valid
+ * segment intersection point at all.
+ */
+ if (!lseg_contain_point(l2, &interpt))
+ return false;
+
+ if (result != NULL)
+ *result = interpt;
+
+ return true;
+}
+
+Datum
+lseg_interpt(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (!lseg_interpt_lseg(result, l1, l2))
+ PG_RETURN_NULL();
+ PG_RETURN_POINT_P(result);
+}
+
+/***********************************************************************
+ **
+ ** Routines for position comparisons of differently-typed
+ ** 2D objects.
+ **
+ ***********************************************************************/
+
+/*---------------------------------------------------------------------
+ * dist_
+ * Minimum distance from one object to another.
+ *-------------------------------------------------------------------*/
+
+/*
+ * Distance from a point to a line
+ */
+Datum
+dist_pl(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_FLOAT8(line_closept_point(NULL, line, pt));
+}
+
+/*
+ * Distance from a line to a point
+ */
+Datum
+dist_lp(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ Point *pt = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(line_closept_point(NULL, line, pt));
+}
+
+/*
+ * Distance from a point to a lseg
+ */
+Datum
+dist_ps(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_FLOAT8(lseg_closept_point(NULL, lseg, pt));
+}
+
+/*
+ * Distance from a lseg to a point
+ */
+Datum
+dist_sp(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ Point *pt = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(lseg_closept_point(NULL, lseg, pt));
+}
+
+static float8
+dist_ppath_internal(Point *pt, PATH *path)
+{
+ float8 result = 0.0; /* keep compiler quiet */
+ bool have_min = false;
+ float8 tmp;
+ int i;
+ LSEG lseg;
+
+ Assert(path->npts > 0);
+
+ /*
+ * The distance from a point to a path is the smallest distance from the
+ * point to any of its constituent segments.
+ */
+ for (i = 0; i < path->npts; i++)
+ {
+ int iprev;
+
+ if (i > 0)
+ iprev = i - 1;
+ else
+ {
+ if (!path->closed)
+ continue;
+ iprev = path->npts - 1; /* Include the closure segment */
+ }
+
+ statlseg_construct(&lseg, &path->p[iprev], &path->p[i]);
+ tmp = lseg_closept_point(NULL, &lseg, pt);
+ if (!have_min || float8_lt(tmp, result))
+ {
+ result = tmp;
+ have_min = true;
+ }
+ }
+
+ return result;
+}
+
+/*
+ * Distance from a point to a path
+ */
+Datum
+dist_ppath(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ PATH *path = PG_GETARG_PATH_P(1);
+
+ PG_RETURN_FLOAT8(dist_ppath_internal(pt, path));
+}
+
+/*
+ * Distance from a path to a point
+ */
+Datum
+dist_pathp(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+ Point *pt = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(dist_ppath_internal(pt, path));
+}
+
+/*
+ * Distance from a point to a box
+ */
+Datum
+dist_pb(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_FLOAT8(box_closept_point(NULL, box, pt));
+}
+
+/*
+ * Distance from a box to a point
+ */
+Datum
+dist_bp(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *pt = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(box_closept_point(NULL, box, pt));
+}
+
+/*
+ * Distance from a lseg to a line
+ */
+Datum
+dist_sl(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_FLOAT8(lseg_closept_line(NULL, lseg, line));
+}
+
+/*
+ * Distance from a line to a lseg
+ */
+Datum
+dist_ls(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_FLOAT8(lseg_closept_line(NULL, lseg, line));
+}
+
+/*
+ * Distance from a lseg to a box
+ */
+Datum
+dist_sb(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_FLOAT8(box_closept_lseg(NULL, box, lseg));
+}
+
+/*
+ * Distance from a box to a lseg
+ */
+Datum
+dist_bs(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_FLOAT8(box_closept_lseg(NULL, box, lseg));
+}
+
+static float8
+dist_cpoly_internal(CIRCLE *circle, POLYGON *poly)
+{
+ float8 result;
+
+ /* calculate distance to center, and subtract radius */
+ result = float8_mi(dist_ppoly_internal(&circle->center, poly),
+ circle->radius);
+ if (result < 0.0)
+ result = 0.0;
+
+ return result;
+}
+
+/*
+ * Distance from a circle to a polygon
+ */
+Datum
+dist_cpoly(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ POLYGON *poly = PG_GETARG_POLYGON_P(1);
+
+ PG_RETURN_FLOAT8(dist_cpoly_internal(circle, poly));
+}
+
+/*
+ * Distance from a polygon to a circle
+ */
+Datum
+dist_polyc(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_FLOAT8(dist_cpoly_internal(circle, poly));
+}
+
+/*
+ * Distance from a point to a polygon
+ */
+Datum
+dist_ppoly(PG_FUNCTION_ARGS)
+{
+ Point *point = PG_GETARG_POINT_P(0);
+ POLYGON *poly = PG_GETARG_POLYGON_P(1);
+
+ PG_RETURN_FLOAT8(dist_ppoly_internal(point, poly));
+}
+
+Datum
+dist_polyp(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_FLOAT8(dist_ppoly_internal(point, poly));
+}
+
+static float8
+dist_ppoly_internal(Point *pt, POLYGON *poly)
+{
+ float8 result;
+ float8 d;
+ int i;
+ LSEG seg;
+
+ if (point_inside(pt, poly->npts, poly->p) != 0)
+ return 0.0;
+
+ /* initialize distance with segment between first and last points */
+ seg.p[0].x = poly->p[0].x;
+ seg.p[0].y = poly->p[0].y;
+ seg.p[1].x = poly->p[poly->npts - 1].x;
+ seg.p[1].y = poly->p[poly->npts - 1].y;
+ result = lseg_closept_point(NULL, &seg, pt);
+
+ /* check distances for other segments */
+ for (i = 0; i < poly->npts - 1; i++)
+ {
+ seg.p[0].x = poly->p[i].x;
+ seg.p[0].y = poly->p[i].y;
+ seg.p[1].x = poly->p[i + 1].x;
+ seg.p[1].y = poly->p[i + 1].y;
+ d = lseg_closept_point(NULL, &seg, pt);
+ if (float8_lt(d, result))
+ result = d;
+ }
+
+ return result;
+}
+
+
+/*---------------------------------------------------------------------
+ * interpt_
+ * Intersection point of objects.
+ * We choose to ignore the "point" of intersection between
+ * lines and boxes, since there are typically two.
+ *-------------------------------------------------------------------*/
+
+/*
+ * Return whether the line segment intersect with the line. If *result is not
+ * NULL, it is set to the intersection point.
+ */
+static bool
+lseg_interpt_line(Point *result, LSEG *lseg, LINE *line)
+{
+ Point interpt;
+ LINE tmp;
+
+ /*
+ * First, we promote the line segment to a line, because we know how to
+ * find the intersection point of two lines. If they don't have an
+ * intersection point, we are done.
+ */
+ line_construct(&tmp, &lseg->p[0], lseg_sl(lseg));
+ if (!line_interpt_line(&interpt, &tmp, line))
+ return false;
+
+ /*
+ * Then, we check whether the intersection point is actually on the line
+ * segment.
+ */
+ if (!lseg_contain_point(lseg, &interpt))
+ return false;
+ if (result != NULL)
+ {
+ /*
+ * If there is an intersection, then check explicitly for matching
+ * endpoints since there may be rounding effects with annoying LSB
+ * residue.
+ */
+ if (point_eq_point(&lseg->p[0], &interpt))
+ *result = lseg->p[0];
+ else if (point_eq_point(&lseg->p[1], &interpt))
+ *result = lseg->p[1];
+ else
+ *result = interpt;
+ }
+
+ return true;
+}
+
+/*---------------------------------------------------------------------
+ * close_
+ * Point of closest proximity between objects.
+ *-------------------------------------------------------------------*/
+
+/*
+ * If *result is not NULL, it is set to the intersection point of a
+ * perpendicular of the line through the point. Returns the distance
+ * of those two points.
+ */
+static float8
+line_closept_point(Point *result, LINE *line, Point *point)
+{
+ Point closept;
+ LINE tmp;
+
+ /*
+ * We drop a perpendicular to find the intersection point. Ordinarily we
+ * should always find it, but that can fail in the presence of NaN
+ * coordinates, and perhaps even from simple roundoff issues.
+ */
+ line_construct(&tmp, point, line_invsl(line));
+ if (!line_interpt_line(&closept, &tmp, line))
+ {
+ if (result != NULL)
+ *result = *point;
+
+ return get_float8_nan();
+ }
+
+ if (result != NULL)
+ *result = closept;
+
+ return point_dt(&closept, point);
+}
+
+Datum
+close_pl(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(line_closept_point(result, line, pt)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*
+ * Closest point on line segment to specified point.
+ *
+ * If *result is not NULL, set it to the closest point on the line segment
+ * to the point. Returns the distance of the two points.
+ */
+static float8
+lseg_closept_point(Point *result, LSEG *lseg, Point *pt)
+{
+ Point closept;
+ LINE tmp;
+
+ /*
+ * To find the closest point, we draw a perpendicular line from the point
+ * to the line segment.
+ */
+ line_construct(&tmp, pt, point_invsl(&lseg->p[0], &lseg->p[1]));
+ lseg_closept_line(&closept, lseg, &tmp);
+
+ if (result != NULL)
+ *result = closept;
+
+ return point_dt(&closept, pt);
+}
+
+Datum
+close_ps(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(lseg_closept_point(result, lseg, pt)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*
+ * Closest point on line segment to line segment
+ */
+static float8
+lseg_closept_lseg(Point *result, LSEG *on_lseg, LSEG *to_lseg)
+{
+ Point point;
+ float8 dist,
+ d;
+
+ /* First, we handle the case when the line segments are intersecting. */
+ if (lseg_interpt_lseg(result, on_lseg, to_lseg))
+ return 0.0;
+
+ /*
+ * Then, we find the closest points from the endpoints of the second line
+ * segment, and keep the closest one.
+ */
+ dist = lseg_closept_point(result, on_lseg, &to_lseg->p[0]);
+ d = lseg_closept_point(&point, on_lseg, &to_lseg->p[1]);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = point;
+ }
+
+ /* The closest point can still be one of the endpoints, so we test them. */
+ d = lseg_closept_point(NULL, to_lseg, &on_lseg->p[0]);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = on_lseg->p[0];
+ }
+ d = lseg_closept_point(NULL, to_lseg, &on_lseg->p[1]);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = on_lseg->p[1];
+ }
+
+ return dist;
+}
+
+Datum
+close_lseg(PG_FUNCTION_ARGS)
+{
+ LSEG *l1 = PG_GETARG_LSEG_P(0);
+ LSEG *l2 = PG_GETARG_LSEG_P(1);
+ Point *result;
+
+ if (lseg_sl(l1) == lseg_sl(l2))
+ PG_RETURN_NULL();
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(lseg_closept_lseg(result, l2, l1)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*
+ * Closest point on or in box to specified point.
+ *
+ * If *result is not NULL, set it to the closest point on the box to the
+ * given point, and return the distance of the two points.
+ */
+static float8
+box_closept_point(Point *result, BOX *box, Point *pt)
+{
+ float8 dist,
+ d;
+ Point point,
+ closept;
+ LSEG lseg;
+
+ if (box_contain_point(box, pt))
+ {
+ if (result != NULL)
+ *result = *pt;
+
+ return 0.0;
+ }
+
+ /* pairwise check lseg distances */
+ point.x = box->low.x;
+ point.y = box->high.y;
+ statlseg_construct(&lseg, &box->low, &point);
+ dist = lseg_closept_point(result, &lseg, pt);
+
+ statlseg_construct(&lseg, &box->high, &point);
+ d = lseg_closept_point(&closept, &lseg, pt);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ point.x = box->high.x;
+ point.y = box->low.y;
+ statlseg_construct(&lseg, &box->low, &point);
+ d = lseg_closept_point(&closept, &lseg, pt);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ statlseg_construct(&lseg, &box->high, &point);
+ d = lseg_closept_point(&closept, &lseg, pt);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ return dist;
+}
+
+Datum
+close_pb(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(box_closept_point(result, box, pt)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+/*
+ * Closest point on line segment to line.
+ *
+ * Return the distance between the line and the closest point of the line
+ * segment to the line. If *result is not NULL, set it to that point.
+ *
+ * NOTE: When the lines are parallel, endpoints of one of the line segment
+ * are FPeq(), in presence of NaN or Infinite coordinates, or perhaps =
+ * even because of simple roundoff issues, there may not be a single closest
+ * point. We are likely to set the result to the second endpoint in these
+ * cases.
+ */
+static float8
+lseg_closept_line(Point *result, LSEG *lseg, LINE *line)
+{
+ float8 dist1,
+ dist2;
+
+ if (lseg_interpt_line(result, lseg, line))
+ return 0.0;
+
+ dist1 = line_closept_point(NULL, line, &lseg->p[0]);
+ dist2 = line_closept_point(NULL, line, &lseg->p[1]);
+
+ if (dist1 < dist2)
+ {
+ if (result != NULL)
+ *result = lseg->p[0];
+
+ return dist1;
+ }
+ else
+ {
+ if (result != NULL)
+ *result = lseg->p[1];
+
+ return dist2;
+ }
+}
+
+Datum
+close_ls(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+ Point *result;
+
+ if (lseg_sl(lseg) == line_sl(line))
+ PG_RETURN_NULL();
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(lseg_closept_line(result, lseg, line)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*
+ * Closest point on or in box to line segment.
+ *
+ * Returns the distance between the closest point on or in the box to
+ * the line segment. If *result is not NULL, it is set to that point.
+ */
+static float8
+box_closept_lseg(Point *result, BOX *box, LSEG *lseg)
+{
+ float8 dist,
+ d;
+ Point point,
+ closept;
+ LSEG bseg;
+
+ if (box_interpt_lseg(result, box, lseg))
+ return 0.0;
+
+ /* pairwise check lseg distances */
+ point.x = box->low.x;
+ point.y = box->high.y;
+ statlseg_construct(&bseg, &box->low, &point);
+ dist = lseg_closept_lseg(result, &bseg, lseg);
+
+ statlseg_construct(&bseg, &box->high, &point);
+ d = lseg_closept_lseg(&closept, &bseg, lseg);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ point.x = box->high.x;
+ point.y = box->low.y;
+ statlseg_construct(&bseg, &box->low, &point);
+ d = lseg_closept_lseg(&closept, &bseg, lseg);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ statlseg_construct(&bseg, &box->high, &point);
+ d = lseg_closept_lseg(&closept, &bseg, lseg);
+ if (float8_lt(d, dist))
+ {
+ dist = d;
+ if (result != NULL)
+ *result = closept;
+ }
+
+ return dist;
+}
+
+Datum
+close_sb(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ if (isnan(box_closept_lseg(result, box, lseg)))
+ PG_RETURN_NULL();
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/*---------------------------------------------------------------------
+ * on_
+ * Whether one object lies completely within another.
+ *-------------------------------------------------------------------*/
+
+/*
+ * Does the point satisfy the equation?
+ */
+static bool
+line_contain_point(LINE *line, Point *point)
+{
+ return FPzero(float8_pl(float8_pl(float8_mul(line->A, point->x),
+ float8_mul(line->B, point->y)),
+ line->C));
+}
+
+Datum
+on_pl(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_BOOL(line_contain_point(line, pt));
+}
+
+
+/*
+ * Determine colinearity by detecting a triangle inequality.
+ * This algorithm seems to behave nicely even with lsb residues - tgl 1997-07-09
+ */
+static bool
+lseg_contain_point(LSEG *lseg, Point *pt)
+{
+ return FPeq(point_dt(pt, &lseg->p[0]) +
+ point_dt(pt, &lseg->p[1]),
+ point_dt(&lseg->p[0], &lseg->p[1]));
+}
+
+Datum
+on_ps(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ LSEG *lseg = PG_GETARG_LSEG_P(1);
+
+ PG_RETURN_BOOL(lseg_contain_point(lseg, pt));
+}
+
+
+/*
+ * Check whether the point is in the box or on its border
+ */
+static bool
+box_contain_point(BOX *box, Point *point)
+{
+ return box->high.x >= point->x && box->low.x <= point->x &&
+ box->high.y >= point->y && box->low.y <= point->y;
+}
+
+Datum
+on_pb(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_contain_point(box, pt));
+}
+
+Datum
+box_contain_pt(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *pt = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(box_contain_point(box, pt));
+}
+
+/* on_ppath -
+ * Whether a point lies within (on) a polyline.
+ * If open, we have to (groan) check each segment.
+ * (uses same algorithm as for point intersecting segment - tgl 1997-07-09)
+ * If closed, we use the old O(n) ray method for point-in-polygon.
+ * The ray is horizontal, from pt out to the right.
+ * Each segment that crosses the ray counts as an
+ * intersection; note that an endpoint or edge may touch
+ * but not cross.
+ * (we can do p-in-p in lg(n), but it takes preprocessing)
+ */
+Datum
+on_ppath(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ PATH *path = PG_GETARG_PATH_P(1);
+ int i,
+ n;
+ float8 a,
+ b;
+
+ /*-- OPEN --*/
+ if (!path->closed)
+ {
+ n = path->npts - 1;
+ a = point_dt(pt, &path->p[0]);
+ for (i = 0; i < n; i++)
+ {
+ b = point_dt(pt, &path->p[i + 1]);
+ if (FPeq(float8_pl(a, b), point_dt(&path->p[i], &path->p[i + 1])))
+ PG_RETURN_BOOL(true);
+ a = b;
+ }
+ PG_RETURN_BOOL(false);
+ }
+
+ /*-- CLOSED --*/
+ PG_RETURN_BOOL(point_inside(pt, path->npts, path->p) != 0);
+}
+
+
+/*
+ * Check whether the line segment is on the line or close enough
+ *
+ * It is, if both of its points are on the line or close enough.
+ */
+Datum
+on_sl(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_BOOL(line_contain_point(line, &lseg->p[0]) &&
+ line_contain_point(line, &lseg->p[1]));
+}
+
+
+/*
+ * Check whether the line segment is in the box or on its border
+ *
+ * It is, if both of its points are in the box or on its border.
+ */
+static bool
+box_contain_lseg(BOX *box, LSEG *lseg)
+{
+ return box_contain_point(box, &lseg->p[0]) &&
+ box_contain_point(box, &lseg->p[1]);
+}
+
+Datum
+on_sb(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_contain_lseg(box, lseg));
+}
+
+/*---------------------------------------------------------------------
+ * inter_
+ * Whether one object intersects another.
+ *-------------------------------------------------------------------*/
+
+Datum
+inter_sl(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ LINE *line = PG_GETARG_LINE_P(1);
+
+ PG_RETURN_BOOL(lseg_interpt_line(NULL, lseg, line));
+}
+
+
+/*
+ * Do line segment and box intersect?
+ *
+ * Segment completely inside box counts as intersection.
+ * If you want only segments crossing box boundaries,
+ * try converting box to path first.
+ *
+ * This function also sets the *result to the closest point on the line
+ * segment to the center of the box when they overlap and the result is
+ * not NULL. It is somewhat arbitrary, but maybe the best we can do as
+ * there are typically two points they intersect.
+ *
+ * Optimize for non-intersection by checking for box intersection first.
+ * - thomas 1998-01-30
+ */
+static bool
+box_interpt_lseg(Point *result, BOX *box, LSEG *lseg)
+{
+ BOX lbox;
+ LSEG bseg;
+ Point point;
+
+ lbox.low.x = float8_min(lseg->p[0].x, lseg->p[1].x);
+ lbox.low.y = float8_min(lseg->p[0].y, lseg->p[1].y);
+ lbox.high.x = float8_max(lseg->p[0].x, lseg->p[1].x);
+ lbox.high.y = float8_max(lseg->p[0].y, lseg->p[1].y);
+
+ /* nothing close to overlap? then not going to intersect */
+ if (!box_ov(&lbox, box))
+ return false;
+
+ if (result != NULL)
+ {
+ box_cn(&point, box);
+ lseg_closept_point(result, lseg, &point);
+ }
+
+ /* an endpoint of segment is inside box? then clearly intersects */
+ if (box_contain_point(box, &lseg->p[0]) ||
+ box_contain_point(box, &lseg->p[1]))
+ return true;
+
+ /* pairwise check lseg intersections */
+ point.x = box->low.x;
+ point.y = box->high.y;
+ statlseg_construct(&bseg, &box->low, &point);
+ if (lseg_interpt_lseg(NULL, &bseg, lseg))
+ return true;
+
+ statlseg_construct(&bseg, &box->high, &point);
+ if (lseg_interpt_lseg(NULL, &bseg, lseg))
+ return true;
+
+ point.x = box->high.x;
+ point.y = box->low.y;
+ statlseg_construct(&bseg, &box->low, &point);
+ if (lseg_interpt_lseg(NULL, &bseg, lseg))
+ return true;
+
+ statlseg_construct(&bseg, &box->high, &point);
+ if (lseg_interpt_lseg(NULL, &bseg, lseg))
+ return true;
+
+ /* if we dropped through, no two segs intersected */
+ return false;
+}
+
+Datum
+inter_sb(PG_FUNCTION_ARGS)
+{
+ LSEG *lseg = PG_GETARG_LSEG_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+
+ PG_RETURN_BOOL(box_interpt_lseg(NULL, box, lseg));
+}
+
+
+/* inter_lb()
+ * Do line and box intersect?
+ */
+Datum
+inter_lb(PG_FUNCTION_ARGS)
+{
+ LINE *line = PG_GETARG_LINE_P(0);
+ BOX *box = PG_GETARG_BOX_P(1);
+ LSEG bseg;
+ Point p1,
+ p2;
+
+ /* pairwise check lseg intersections */
+ p1.x = box->low.x;
+ p1.y = box->low.y;
+ p2.x = box->low.x;
+ p2.y = box->high.y;
+ statlseg_construct(&bseg, &p1, &p2);
+ if (lseg_interpt_line(NULL, &bseg, line))
+ PG_RETURN_BOOL(true);
+ p1.x = box->high.x;
+ p1.y = box->high.y;
+ statlseg_construct(&bseg, &p1, &p2);
+ if (lseg_interpt_line(NULL, &bseg, line))
+ PG_RETURN_BOOL(true);
+ p2.x = box->high.x;
+ p2.y = box->low.y;
+ statlseg_construct(&bseg, &p1, &p2);
+ if (lseg_interpt_line(NULL, &bseg, line))
+ PG_RETURN_BOOL(true);
+ p1.x = box->low.x;
+ p1.y = box->low.y;
+ statlseg_construct(&bseg, &p1, &p2);
+ if (lseg_interpt_line(NULL, &bseg, line))
+ PG_RETURN_BOOL(true);
+
+ /* if we dropped through, no intersection */
+ PG_RETURN_BOOL(false);
+}
+
+/*------------------------------------------------------------------
+ * The following routines define a data type and operator class for
+ * POLYGONS .... Part of which (the polygon's bounding box) is built on
+ * top of the BOX data type.
+ *
+ * make_bound_box - create the bounding box for the input polygon
+ *------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------
+ * Make the smallest bounding box for the given polygon.
+ *---------------------------------------------------------------------*/
+static void
+make_bound_box(POLYGON *poly)
+{
+ int i;
+ float8 x1,
+ y1,
+ x2,
+ y2;
+
+ Assert(poly->npts > 0);
+
+ x1 = x2 = poly->p[0].x;
+ y2 = y1 = poly->p[0].y;
+ for (i = 1; i < poly->npts; i++)
+ {
+ if (float8_lt(poly->p[i].x, x1))
+ x1 = poly->p[i].x;
+ if (float8_gt(poly->p[i].x, x2))
+ x2 = poly->p[i].x;
+ if (float8_lt(poly->p[i].y, y1))
+ y1 = poly->p[i].y;
+ if (float8_gt(poly->p[i].y, y2))
+ y2 = poly->p[i].y;
+ }
+
+ poly->boundbox.low.x = x1;
+ poly->boundbox.high.x = x2;
+ poly->boundbox.low.y = y1;
+ poly->boundbox.high.y = y2;
+}
+
+/*------------------------------------------------------------------
+ * poly_in - read in the polygon from a string specification
+ *
+ * External format:
+ * "((x0,y0),...,(xn,yn))"
+ * "x0,y0,...,xn,yn"
+ * also supports the older style "(x1,...,xn,y1,...yn)"
+ *------------------------------------------------------------------*/
+Datum
+poly_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ POLYGON *poly;
+ int npts;
+ int size;
+ int base_size;
+ bool isopen;
+
+ if ((npts = pair_count(str, ',')) <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "polygon", str)));
+
+ base_size = sizeof(poly->p[0]) * npts;
+ size = offsetof(POLYGON, p) + base_size;
+
+ /* Check for integer overflow */
+ if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many points requested")));
+
+ poly = (POLYGON *) palloc0(size); /* zero any holes */
+
+ SET_VARSIZE(poly, size);
+ poly->npts = npts;
+
+ path_decode(str, false, npts, &(poly->p[0]), &isopen, NULL, "polygon", str);
+
+ make_bound_box(poly);
+
+ PG_RETURN_POLYGON_P(poly);
+}
+
+/*---------------------------------------------------------------
+ * poly_out - convert internal POLYGON representation to the
+ * character string format "((f8,f8),...,(f8,f8))"
+ *---------------------------------------------------------------*/
+Datum
+poly_out(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+
+ PG_RETURN_CSTRING(path_encode(PATH_CLOSED, poly->npts, poly->p));
+}
+
+/*
+ * poly_recv - converts external binary format to polygon
+ *
+ * External representation is int32 number of points, and the points.
+ * We recompute the bounding box on read, instead of trusting it to
+ * be valid. (Checking it would take just as long, so may as well
+ * omit it from external representation.)
+ */
+Datum
+poly_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ POLYGON *poly;
+ int32 npts;
+ int32 i;
+ int size;
+
+ npts = pq_getmsgint(buf, sizeof(int32));
+ if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p)) / sizeof(Point)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid number of points in external \"polygon\" value")));
+
+ size = offsetof(POLYGON, p) + sizeof(poly->p[0]) * npts;
+ poly = (POLYGON *) palloc0(size); /* zero any holes */
+
+ SET_VARSIZE(poly, size);
+ poly->npts = npts;
+
+ for (i = 0; i < npts; i++)
+ {
+ poly->p[i].x = pq_getmsgfloat8(buf);
+ poly->p[i].y = pq_getmsgfloat8(buf);
+ }
+
+ make_bound_box(poly);
+
+ PG_RETURN_POLYGON_P(poly);
+}
+
+/*
+ * poly_send - converts polygon to binary format
+ */
+Datum
+poly_send(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ StringInfoData buf;
+ int32 i;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, poly->npts);
+ for (i = 0; i < poly->npts; i++)
+ {
+ pq_sendfloat8(&buf, poly->p[i].x);
+ pq_sendfloat8(&buf, poly->p[i].y);
+ }
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*-------------------------------------------------------
+ * Is polygon A strictly left of polygon B? i.e. is
+ * the right most point of A left of the left most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_left(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.high.x < polyb->boundbox.low.x;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A overlapping or left of polygon B? i.e. is
+ * the right most point of A at or left of the right most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_overleft(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.high.x <= polyb->boundbox.high.x;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A strictly right of polygon B? i.e. is
+ * the left most point of A right of the right most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_right(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.low.x > polyb->boundbox.high.x;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A overlapping or right of polygon B? i.e. is
+ * the left most point of A at or right of the left most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_overright(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.low.x >= polyb->boundbox.low.x;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A strictly below polygon B? i.e. is
+ * the upper most point of A below the lower most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_below(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.high.y < polyb->boundbox.low.y;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A overlapping or below polygon B? i.e. is
+ * the upper most point of A at or below the upper most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_overbelow(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.high.y <= polyb->boundbox.high.y;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A strictly above polygon B? i.e. is
+ * the lower most point of A above the upper most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_above(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.low.y > polyb->boundbox.high.y;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-------------------------------------------------------
+ * Is polygon A overlapping or above polygon B? i.e. is
+ * the lower most point of A at or above the lower most point
+ * of B?
+ *-------------------------------------------------------*/
+Datum
+poly_overabove(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = polya->boundbox.low.y >= polyb->boundbox.low.y;
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+
+/*-------------------------------------------------------
+ * Is polygon A the same as polygon B? i.e. are all the
+ * points the same?
+ * Check all points for matches in both forward and reverse
+ * direction since polygons are non-directional and are
+ * closed shapes.
+ *-------------------------------------------------------*/
+Datum
+poly_same(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ if (polya->npts != polyb->npts)
+ result = false;
+ else
+ result = plist_same(polya->npts, polya->p, polyb->p);
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*-----------------------------------------------------------------
+ * Determine if polygon A overlaps polygon B
+ *-----------------------------------------------------------------*/
+static bool
+poly_overlap_internal(POLYGON *polya, POLYGON *polyb)
+{
+ bool result;
+
+ Assert(polya->npts > 0 && polyb->npts > 0);
+
+ /* Quick check by bounding box */
+ result = box_ov(&polya->boundbox, &polyb->boundbox);
+
+ /*
+ * Brute-force algorithm - try to find intersected edges, if so then
+ * polygons are overlapped else check is one polygon inside other or not
+ * by testing single point of them.
+ */
+ if (result)
+ {
+ int ia,
+ ib;
+ LSEG sa,
+ sb;
+
+ /* Init first of polya's edge with last point */
+ sa.p[0] = polya->p[polya->npts - 1];
+ result = false;
+
+ for (ia = 0; ia < polya->npts && !result; ia++)
+ {
+ /* Second point of polya's edge is a current one */
+ sa.p[1] = polya->p[ia];
+
+ /* Init first of polyb's edge with last point */
+ sb.p[0] = polyb->p[polyb->npts - 1];
+
+ for (ib = 0; ib < polyb->npts && !result; ib++)
+ {
+ sb.p[1] = polyb->p[ib];
+ result = lseg_interpt_lseg(NULL, &sa, &sb);
+ sb.p[0] = sb.p[1];
+ }
+
+ /*
+ * move current endpoint to the first point of next edge
+ */
+ sa.p[0] = sa.p[1];
+ }
+
+ if (!result)
+ {
+ result = (point_inside(polya->p, polyb->npts, polyb->p) ||
+ point_inside(polyb->p, polya->npts, polya->p));
+ }
+ }
+
+ return result;
+}
+
+Datum
+poly_overlap(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = poly_overlap_internal(polya, polyb);
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * Tests special kind of segment for in/out of polygon.
+ * Special kind means:
+ * - point a should be on segment s
+ * - segment (a,b) should not be contained by s
+ * Returns true if:
+ * - segment (a,b) is collinear to s and (a,b) is in polygon
+ * - segment (a,b) s not collinear to s. Note: that doesn't
+ * mean that segment is in polygon!
+ */
+
+static bool
+touched_lseg_inside_poly(Point *a, Point *b, LSEG *s, POLYGON *poly, int start)
+{
+ /* point a is on s, b is not */
+ LSEG t;
+
+ t.p[0] = *a;
+ t.p[1] = *b;
+
+ if (point_eq_point(a, s->p))
+ {
+ if (lseg_contain_point(&t, s->p + 1))
+ return lseg_inside_poly(b, s->p + 1, poly, start);
+ }
+ else if (point_eq_point(a, s->p + 1))
+ {
+ if (lseg_contain_point(&t, s->p))
+ return lseg_inside_poly(b, s->p, poly, start);
+ }
+ else if (lseg_contain_point(&t, s->p))
+ {
+ return lseg_inside_poly(b, s->p, poly, start);
+ }
+ else if (lseg_contain_point(&t, s->p + 1))
+ {
+ return lseg_inside_poly(b, s->p + 1, poly, start);
+ }
+
+ return true; /* may be not true, but that will check later */
+}
+
+/*
+ * Returns true if segment (a,b) is in polygon, option
+ * start is used for optimization - function checks
+ * polygon's edges starting from start
+ */
+static bool
+lseg_inside_poly(Point *a, Point *b, POLYGON *poly, int start)
+{
+ LSEG s,
+ t;
+ int i;
+ bool res = true,
+ intersection = false;
+
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ t.p[0] = *a;
+ t.p[1] = *b;
+ s.p[0] = poly->p[(start == 0) ? (poly->npts - 1) : (start - 1)];
+
+ for (i = start; i < poly->npts && res; i++)
+ {
+ Point interpt;
+
+ CHECK_FOR_INTERRUPTS();
+
+ s.p[1] = poly->p[i];
+
+ if (lseg_contain_point(&s, t.p))
+ {
+ if (lseg_contain_point(&s, t.p + 1))
+ return true; /* t is contained by s */
+
+ /* Y-cross */
+ res = touched_lseg_inside_poly(t.p, t.p + 1, &s, poly, i + 1);
+ }
+ else if (lseg_contain_point(&s, t.p + 1))
+ {
+ /* Y-cross */
+ res = touched_lseg_inside_poly(t.p + 1, t.p, &s, poly, i + 1);
+ }
+ else if (lseg_interpt_lseg(&interpt, &t, &s))
+ {
+ /*
+ * segments are X-crossing, go to check each subsegment
+ */
+
+ intersection = true;
+ res = lseg_inside_poly(t.p, &interpt, poly, i + 1);
+ if (res)
+ res = lseg_inside_poly(t.p + 1, &interpt, poly, i + 1);
+ }
+
+ s.p[0] = s.p[1];
+ }
+
+ if (res && !intersection)
+ {
+ Point p;
+
+ /*
+ * if X-intersection wasn't found, then check central point of tested
+ * segment. In opposite case we already check all subsegments
+ */
+ p.x = float8_div(float8_pl(t.p[0].x, t.p[1].x), 2.0);
+ p.y = float8_div(float8_pl(t.p[0].y, t.p[1].y), 2.0);
+
+ res = point_inside(&p, poly->npts, poly->p);
+ }
+
+ return res;
+}
+
+/*
+ * Check whether the first polygon contains the second
+ */
+static bool
+poly_contain_poly(POLYGON *contains_poly, POLYGON *contained_poly)
+{
+ int i;
+ LSEG s;
+
+ Assert(contains_poly->npts > 0 && contained_poly->npts > 0);
+
+ /*
+ * Quick check to see if contained's bounding box is contained in
+ * contains' bb.
+ */
+ if (!box_contain_box(&contains_poly->boundbox, &contained_poly->boundbox))
+ return false;
+
+ s.p[0] = contained_poly->p[contained_poly->npts - 1];
+
+ for (i = 0; i < contained_poly->npts; i++)
+ {
+ s.p[1] = contained_poly->p[i];
+ if (!lseg_inside_poly(s.p, s.p + 1, contains_poly, 0))
+ return false;
+ s.p[0] = s.p[1];
+ }
+
+ return true;
+}
+
+Datum
+poly_contain(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ result = poly_contain_poly(polya, polyb);
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+
+/*-----------------------------------------------------------------
+ * Determine if polygon A is contained by polygon B
+ *-----------------------------------------------------------------*/
+Datum
+poly_contained(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ bool result;
+
+ /* Just switch the arguments and pass it off to poly_contain */
+ result = poly_contain_poly(polyb, polya);
+
+ /*
+ * Avoid leaking memory for toasted inputs ... needed for rtree indexes
+ */
+ PG_FREE_IF_COPY(polya, 0);
+ PG_FREE_IF_COPY(polyb, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+
+Datum
+poly_contain_pt(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ Point *p = PG_GETARG_POINT_P(1);
+
+ PG_RETURN_BOOL(point_inside(p, poly->npts, poly->p) != 0);
+}
+
+Datum
+pt_contained_poly(PG_FUNCTION_ARGS)
+{
+ Point *p = PG_GETARG_POINT_P(0);
+ POLYGON *poly = PG_GETARG_POLYGON_P(1);
+
+ PG_RETURN_BOOL(point_inside(p, poly->npts, poly->p) != 0);
+}
+
+
+Datum
+poly_distance(PG_FUNCTION_ARGS)
+{
+ POLYGON *polya = PG_GETARG_POLYGON_P(0);
+ POLYGON *polyb = PG_GETARG_POLYGON_P(1);
+ float8 min = 0.0; /* initialize to keep compiler quiet */
+ bool have_min = false;
+ float8 tmp;
+ int i,
+ j;
+ LSEG seg1,
+ seg2;
+
+ /*
+ * Distance is zero if polygons overlap. We must check this because the
+ * path distance will not give the right answer if one poly is entirely
+ * within the other.
+ */
+ if (poly_overlap_internal(polya, polyb))
+ PG_RETURN_FLOAT8(0.0);
+
+ /*
+ * When they don't overlap, the distance calculation is identical to that
+ * for closed paths (i.e., we needn't care about the fact that polygons
+ * include their contained areas). See path_distance().
+ */
+ for (i = 0; i < polya->npts; i++)
+ {
+ int iprev;
+
+ if (i > 0)
+ iprev = i - 1;
+ else
+ iprev = polya->npts - 1;
+
+ for (j = 0; j < polyb->npts; j++)
+ {
+ int jprev;
+
+ if (j > 0)
+ jprev = j - 1;
+ else
+ jprev = polyb->npts - 1;
+
+ statlseg_construct(&seg1, &polya->p[iprev], &polya->p[i]);
+ statlseg_construct(&seg2, &polyb->p[jprev], &polyb->p[j]);
+
+ tmp = lseg_closept_lseg(NULL, &seg1, &seg2);
+ if (!have_min || float8_lt(tmp, min))
+ {
+ min = tmp;
+ have_min = true;
+ }
+ }
+ }
+
+ if (!have_min)
+ PG_RETURN_NULL();
+
+ PG_RETURN_FLOAT8(min);
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D points.
+ **
+ ***********************************************************************/
+
+Datum
+construct_point(PG_FUNCTION_ARGS)
+{
+ float8 x = PG_GETARG_FLOAT8(0);
+ float8 y = PG_GETARG_FLOAT8(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ point_construct(result, x, y);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+static inline void
+point_add_point(Point *result, Point *pt1, Point *pt2)
+{
+ point_construct(result,
+ float8_pl(pt1->x, pt2->x),
+ float8_pl(pt1->y, pt2->y));
+}
+
+Datum
+point_add(PG_FUNCTION_ARGS)
+{
+ Point *p1 = PG_GETARG_POINT_P(0);
+ Point *p2 = PG_GETARG_POINT_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ point_add_point(result, p1, p2);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+static inline void
+point_sub_point(Point *result, Point *pt1, Point *pt2)
+{
+ point_construct(result,
+ float8_mi(pt1->x, pt2->x),
+ float8_mi(pt1->y, pt2->y));
+}
+
+Datum
+point_sub(PG_FUNCTION_ARGS)
+{
+ Point *p1 = PG_GETARG_POINT_P(0);
+ Point *p2 = PG_GETARG_POINT_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ point_sub_point(result, p1, p2);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+static inline void
+point_mul_point(Point *result, Point *pt1, Point *pt2)
+{
+ point_construct(result,
+ float8_mi(float8_mul(pt1->x, pt2->x),
+ float8_mul(pt1->y, pt2->y)),
+ float8_pl(float8_mul(pt1->x, pt2->y),
+ float8_mul(pt1->y, pt2->x)));
+}
+
+Datum
+point_mul(PG_FUNCTION_ARGS)
+{
+ Point *p1 = PG_GETARG_POINT_P(0);
+ Point *p2 = PG_GETARG_POINT_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ point_mul_point(result, p1, p2);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+static inline void
+point_div_point(Point *result, Point *pt1, Point *pt2)
+{
+ float8 div;
+
+ div = float8_pl(float8_mul(pt2->x, pt2->x), float8_mul(pt2->y, pt2->y));
+
+ point_construct(result,
+ float8_div(float8_pl(float8_mul(pt1->x, pt2->x),
+ float8_mul(pt1->y, pt2->y)), div),
+ float8_div(float8_mi(float8_mul(pt1->y, pt2->x),
+ float8_mul(pt1->x, pt2->y)), div));
+}
+
+Datum
+point_div(PG_FUNCTION_ARGS)
+{
+ Point *p1 = PG_GETARG_POINT_P(0);
+ Point *p2 = PG_GETARG_POINT_P(1);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ point_div_point(result, p1, p2);
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D boxes.
+ **
+ ***********************************************************************/
+
+Datum
+points_box(PG_FUNCTION_ARGS)
+{
+ Point *p1 = PG_GETARG_POINT_P(0);
+ Point *p2 = PG_GETARG_POINT_P(1);
+ BOX *result;
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ box_construct(result, p1, p2);
+
+ PG_RETURN_BOX_P(result);
+}
+
+Datum
+box_add(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *p = PG_GETARG_POINT_P(1);
+ BOX *result;
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ point_add_point(&result->high, &box->high, p);
+ point_add_point(&result->low, &box->low, p);
+
+ PG_RETURN_BOX_P(result);
+}
+
+Datum
+box_sub(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *p = PG_GETARG_POINT_P(1);
+ BOX *result;
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ point_sub_point(&result->high, &box->high, p);
+ point_sub_point(&result->low, &box->low, p);
+
+ PG_RETURN_BOX_P(result);
+}
+
+Datum
+box_mul(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *p = PG_GETARG_POINT_P(1);
+ BOX *result;
+ Point high,
+ low;
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ point_mul_point(&high, &box->high, p);
+ point_mul_point(&low, &box->low, p);
+
+ box_construct(result, &high, &low);
+
+ PG_RETURN_BOX_P(result);
+}
+
+Datum
+box_div(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ Point *p = PG_GETARG_POINT_P(1);
+ BOX *result;
+ Point high,
+ low;
+
+ result = (BOX *) palloc(sizeof(BOX));
+
+ point_div_point(&high, &box->high, p);
+ point_div_point(&low, &box->low, p);
+
+ box_construct(result, &high, &low);
+
+ PG_RETURN_BOX_P(result);
+}
+
+/*
+ * Convert point to empty box
+ */
+Datum
+point_box(PG_FUNCTION_ARGS)
+{
+ Point *pt = PG_GETARG_POINT_P(0);
+ BOX *box;
+
+ box = (BOX *) palloc(sizeof(BOX));
+
+ box->high.x = pt->x;
+ box->low.x = pt->x;
+ box->high.y = pt->y;
+ box->low.y = pt->y;
+
+ PG_RETURN_BOX_P(box);
+}
+
+/*
+ * Smallest bounding box that includes both of the given boxes
+ */
+Datum
+boxes_bound_box(PG_FUNCTION_ARGS)
+{
+ BOX *box1 = PG_GETARG_BOX_P(0),
+ *box2 = PG_GETARG_BOX_P(1),
+ *container;
+
+ container = (BOX *) palloc(sizeof(BOX));
+
+ container->high.x = float8_max(box1->high.x, box2->high.x);
+ container->low.x = float8_min(box1->low.x, box2->low.x);
+ container->high.y = float8_max(box1->high.y, box2->high.y);
+ container->low.y = float8_min(box1->low.y, box2->low.y);
+
+ PG_RETURN_BOX_P(container);
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D paths.
+ **
+ ***********************************************************************/
+
+/* path_add()
+ * Concatenate two paths (only if they are both open).
+ */
+Datum
+path_add(PG_FUNCTION_ARGS)
+{
+ PATH *p1 = PG_GETARG_PATH_P(0);
+ PATH *p2 = PG_GETARG_PATH_P(1);
+ PATH *result;
+ int size,
+ base_size;
+ int i;
+
+ if (p1->closed || p2->closed)
+ PG_RETURN_NULL();
+
+ base_size = sizeof(p1->p[0]) * (p1->npts + p2->npts);
+ size = offsetof(PATH, p) + base_size;
+
+ /* Check for integer overflow */
+ if (base_size / sizeof(p1->p[0]) != (p1->npts + p2->npts) ||
+ size <= base_size)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many points requested")));
+
+ result = (PATH *) palloc(size);
+
+ SET_VARSIZE(result, size);
+ result->npts = (p1->npts + p2->npts);
+ result->closed = p1->closed;
+ /* prevent instability in unused pad bytes */
+ result->dummy = 0;
+
+ for (i = 0; i < p1->npts; i++)
+ {
+ result->p[i].x = p1->p[i].x;
+ result->p[i].y = p1->p[i].y;
+ }
+ for (i = 0; i < p2->npts; i++)
+ {
+ result->p[i + p1->npts].x = p2->p[i].x;
+ result->p[i + p1->npts].y = p2->p[i].y;
+ }
+
+ PG_RETURN_PATH_P(result);
+}
+
+/* path_add_pt()
+ * Translation operators.
+ */
+Datum
+path_add_pt(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ int i;
+
+ for (i = 0; i < path->npts; i++)
+ point_add_point(&path->p[i], &path->p[i], point);
+
+ PG_RETURN_PATH_P(path);
+}
+
+Datum
+path_sub_pt(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ int i;
+
+ for (i = 0; i < path->npts; i++)
+ point_sub_point(&path->p[i], &path->p[i], point);
+
+ PG_RETURN_PATH_P(path);
+}
+
+/* path_mul_pt()
+ * Rotation and scaling operators.
+ */
+Datum
+path_mul_pt(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ int i;
+
+ for (i = 0; i < path->npts; i++)
+ point_mul_point(&path->p[i], &path->p[i], point);
+
+ PG_RETURN_PATH_P(path);
+}
+
+Datum
+path_div_pt(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P_COPY(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ int i;
+
+ for (i = 0; i < path->npts; i++)
+ point_div_point(&path->p[i], &path->p[i], point);
+
+ PG_RETURN_PATH_P(path);
+}
+
+
+Datum
+path_poly(PG_FUNCTION_ARGS)
+{
+ PATH *path = PG_GETARG_PATH_P(0);
+ POLYGON *poly;
+ int size;
+ int i;
+
+ /* This is not very consistent --- other similar cases return NULL ... */
+ if (!path->closed)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("open path cannot be converted to polygon")));
+
+ /*
+ * Never overflows: the old size fit in MaxAllocSize, and the new size is
+ * just a small constant larger.
+ */
+ size = offsetof(POLYGON, p) + sizeof(poly->p[0]) * path->npts;
+ poly = (POLYGON *) palloc(size);
+
+ SET_VARSIZE(poly, size);
+ poly->npts = path->npts;
+
+ for (i = 0; i < path->npts; i++)
+ {
+ poly->p[i].x = path->p[i].x;
+ poly->p[i].y = path->p[i].y;
+ }
+
+ make_bound_box(poly);
+
+ PG_RETURN_POLYGON_P(poly);
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for 2D polygons.
+ **
+ ***********************************************************************/
+
+Datum
+poly_npoints(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+
+ PG_RETURN_INT32(poly->npts);
+}
+
+
+Datum
+poly_center(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ Point *result;
+ CIRCLE circle;
+
+ result = (Point *) palloc(sizeof(Point));
+
+ poly_to_circle(&circle, poly);
+ *result = circle.center;
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+Datum
+poly_box(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ BOX *box;
+
+ box = (BOX *) palloc(sizeof(BOX));
+ *box = poly->boundbox;
+
+ PG_RETURN_BOX_P(box);
+}
+
+
+/* box_poly()
+ * Convert a box to a polygon.
+ */
+Datum
+box_poly(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ POLYGON *poly;
+ int size;
+
+ /* map four corners of the box to a polygon */
+ size = offsetof(POLYGON, p) + sizeof(poly->p[0]) * 4;
+ poly = (POLYGON *) palloc(size);
+
+ SET_VARSIZE(poly, size);
+ poly->npts = 4;
+
+ poly->p[0].x = box->low.x;
+ poly->p[0].y = box->low.y;
+ poly->p[1].x = box->low.x;
+ poly->p[1].y = box->high.y;
+ poly->p[2].x = box->high.x;
+ poly->p[2].y = box->high.y;
+ poly->p[3].x = box->high.x;
+ poly->p[3].y = box->low.y;
+
+ box_construct(&poly->boundbox, &box->high, &box->low);
+
+ PG_RETURN_POLYGON_P(poly);
+}
+
+
+Datum
+poly_path(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ PATH *path;
+ int size;
+ int i;
+
+ /*
+ * Never overflows: the old size fit in MaxAllocSize, and the new size is
+ * smaller by a small constant.
+ */
+ size = offsetof(PATH, p) + sizeof(path->p[0]) * poly->npts;
+ path = (PATH *) palloc(size);
+
+ SET_VARSIZE(path, size);
+ path->npts = poly->npts;
+ path->closed = true;
+ /* prevent instability in unused pad bytes */
+ path->dummy = 0;
+
+ for (i = 0; i < poly->npts; i++)
+ {
+ path->p[i].x = poly->p[i].x;
+ path->p[i].y = poly->p[i].y;
+ }
+
+ PG_RETURN_PATH_P(path);
+}
+
+
+/***********************************************************************
+ **
+ ** Routines for circles.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * Formatting and conversion routines.
+ *---------------------------------------------------------*/
+
+/* circle_in - convert a string to internal form.
+ *
+ * External format: (center and radius of circle)
+ * "<(f8,f8),f8>"
+ * also supports quick entry style "f8,f8,f8"
+ */
+Datum
+circle_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ CIRCLE *circle = (CIRCLE *) palloc(sizeof(CIRCLE));
+ char *s,
+ *cp;
+ int depth = 0;
+
+ s = str;
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s == LDELIM_C)
+ depth++, s++;
+ else if (*s == LDELIM)
+ {
+ /* If there are two left parens, consume the first one */
+ cp = (s + 1);
+ while (isspace((unsigned char) *cp))
+ cp++;
+ if (*cp == LDELIM)
+ depth++, s = cp;
+ }
+
+ /* pair_decode will consume parens around the pair, if any */
+ pair_decode(s, &circle->center.x, &circle->center.y, &s, "circle", str);
+
+ if (*s == DELIM)
+ s++;
+
+ circle->radius = single_decode(s, &s, "circle", str);
+ /* We have to accept NaN. */
+ if (circle->radius < 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "circle", str)));
+
+ while (depth > 0)
+ {
+ if ((*s == RDELIM) || ((*s == RDELIM_C) && (depth == 1)))
+ {
+ depth--;
+ s++;
+ while (isspace((unsigned char) *s))
+ s++;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "circle", str)));
+ }
+
+ if (*s != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "circle", str)));
+
+ PG_RETURN_CIRCLE_P(circle);
+}
+
+/* circle_out - convert a circle to external form.
+ */
+Datum
+circle_out(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ StringInfoData str;
+
+ initStringInfo(&str);
+
+ appendStringInfoChar(&str, LDELIM_C);
+ appendStringInfoChar(&str, LDELIM);
+ pair_encode(circle->center.x, circle->center.y, &str);
+ appendStringInfoChar(&str, RDELIM);
+ appendStringInfoChar(&str, DELIM);
+ single_encode(circle->radius, &str);
+ appendStringInfoChar(&str, RDELIM_C);
+
+ PG_RETURN_CSTRING(str.data);
+}
+
+/*
+ * circle_recv - converts external binary format to circle
+ */
+Datum
+circle_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ CIRCLE *circle;
+
+ circle = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ circle->center.x = pq_getmsgfloat8(buf);
+ circle->center.y = pq_getmsgfloat8(buf);
+ circle->radius = pq_getmsgfloat8(buf);
+
+ /* We have to accept NaN. */
+ if (circle->radius < 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid radius in external \"circle\" value")));
+
+ PG_RETURN_CIRCLE_P(circle);
+}
+
+/*
+ * circle_send - converts circle to binary format
+ */
+Datum
+circle_send(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendfloat8(&buf, circle->center.x);
+ pq_sendfloat8(&buf, circle->center.y);
+ pq_sendfloat8(&buf, circle->radius);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators for CIRCLEs.
+ * <, >, <=, >=, and == are based on circle area.
+ *---------------------------------------------------------*/
+
+/* circles identical?
+ *
+ * We consider NaNs values to be equal to each other to let those circles
+ * to be found.
+ */
+Datum
+circle_same(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(((isnan(circle1->radius) && isnan(circle2->radius)) ||
+ FPeq(circle1->radius, circle2->radius)) &&
+ point_eq_point(&circle1->center, &circle2->center));
+}
+
+/* circle_overlap - does circle1 overlap circle2?
+ */
+Datum
+circle_overlap(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(point_dt(&circle1->center, &circle2->center),
+ float8_pl(circle1->radius, circle2->radius)));
+}
+
+/* circle_overleft - is the right edge of circle1 at or left of
+ * the right edge of circle2?
+ */
+Datum
+circle_overleft(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(float8_pl(circle1->center.x, circle1->radius),
+ float8_pl(circle2->center.x, circle2->radius)));
+}
+
+/* circle_left - is circle1 strictly left of circle2?
+ */
+Datum
+circle_left(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPlt(float8_pl(circle1->center.x, circle1->radius),
+ float8_mi(circle2->center.x, circle2->radius)));
+}
+
+/* circle_right - is circle1 strictly right of circle2?
+ */
+Datum
+circle_right(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPgt(float8_mi(circle1->center.x, circle1->radius),
+ float8_pl(circle2->center.x, circle2->radius)));
+}
+
+/* circle_overright - is the left edge of circle1 at or right of
+ * the left edge of circle2?
+ */
+Datum
+circle_overright(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPge(float8_mi(circle1->center.x, circle1->radius),
+ float8_mi(circle2->center.x, circle2->radius)));
+}
+
+/* circle_contained - is circle1 contained by circle2?
+ */
+Datum
+circle_contained(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(point_dt(&circle1->center, &circle2->center),
+ float8_mi(circle2->radius, circle1->radius)));
+}
+
+/* circle_contain - does circle1 contain circle2?
+ */
+Datum
+circle_contain(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(point_dt(&circle1->center, &circle2->center),
+ float8_mi(circle1->radius, circle2->radius)));
+}
+
+
+/* circle_below - is circle1 strictly below circle2?
+ */
+Datum
+circle_below(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPlt(float8_pl(circle1->center.y, circle1->radius),
+ float8_mi(circle2->center.y, circle2->radius)));
+}
+
+/* circle_above - is circle1 strictly above circle2?
+ */
+Datum
+circle_above(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPgt(float8_mi(circle1->center.y, circle1->radius),
+ float8_pl(circle2->center.y, circle2->radius)));
+}
+
+/* circle_overbelow - is the upper edge of circle1 at or below
+ * the upper edge of circle2?
+ */
+Datum
+circle_overbelow(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(float8_pl(circle1->center.y, circle1->radius),
+ float8_pl(circle2->center.y, circle2->radius)));
+}
+
+/* circle_overabove - is the lower edge of circle1 at or above
+ * the lower edge of circle2?
+ */
+Datum
+circle_overabove(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPge(float8_mi(circle1->center.y, circle1->radius),
+ float8_mi(circle2->center.y, circle2->radius)));
+}
+
+
+/* circle_relop - is area(circle1) relop area(circle2), within
+ * our accuracy constraint?
+ */
+Datum
+circle_eq(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPeq(circle_ar(circle1), circle_ar(circle2)));
+}
+
+Datum
+circle_ne(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPne(circle_ar(circle1), circle_ar(circle2)));
+}
+
+Datum
+circle_lt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPlt(circle_ar(circle1), circle_ar(circle2)));
+}
+
+Datum
+circle_gt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPgt(circle_ar(circle1), circle_ar(circle2)));
+}
+
+Datum
+circle_le(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPle(circle_ar(circle1), circle_ar(circle2)));
+}
+
+Datum
+circle_ge(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+
+ PG_RETURN_BOOL(FPge(circle_ar(circle1), circle_ar(circle2)));
+}
+
+
+/*----------------------------------------------------------
+ * "Arithmetic" operators on circles.
+ *---------------------------------------------------------*/
+
+/* circle_add_pt()
+ * Translation operator.
+ */
+Datum
+circle_add_pt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ point_add_point(&result->center, &circle->center, point);
+ result->radius = circle->radius;
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+Datum
+circle_sub_pt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ point_sub_point(&result->center, &circle->center, point);
+ result->radius = circle->radius;
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+
+/* circle_mul_pt()
+ * Rotation and scaling operators.
+ */
+Datum
+circle_mul_pt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ point_mul_point(&result->center, &circle->center, point);
+ result->radius = float8_mul(circle->radius, HYPOT(point->x, point->y));
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+Datum
+circle_div_pt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ point_div_point(&result->center, &circle->center, point);
+ result->radius = float8_div(circle->radius, HYPOT(point->x, point->y));
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+
+/* circle_area - returns the area of the circle.
+ */
+Datum
+circle_area(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+
+ PG_RETURN_FLOAT8(circle_ar(circle));
+}
+
+
+/* circle_diameter - returns the diameter of the circle.
+ */
+Datum
+circle_diameter(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+
+ PG_RETURN_FLOAT8(float8_mul(circle->radius, 2.0));
+}
+
+
+/* circle_radius - returns the radius of the circle.
+ */
+Datum
+circle_radius(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+
+ PG_RETURN_FLOAT8(circle->radius);
+}
+
+
+/* circle_distance - returns the distance between
+ * two circles.
+ */
+Datum
+circle_distance(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle1 = PG_GETARG_CIRCLE_P(0);
+ CIRCLE *circle2 = PG_GETARG_CIRCLE_P(1);
+ float8 result;
+
+ result = float8_mi(point_dt(&circle1->center, &circle2->center),
+ float8_pl(circle1->radius, circle2->radius));
+ if (result < 0.0)
+ result = 0.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+
+Datum
+circle_contain_pt(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ float8 d;
+
+ d = point_dt(&circle->center, point);
+ PG_RETURN_BOOL(d <= circle->radius);
+}
+
+
+Datum
+pt_contained_circle(PG_FUNCTION_ARGS)
+{
+ Point *point = PG_GETARG_POINT_P(0);
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(1);
+ float8 d;
+
+ d = point_dt(&circle->center, point);
+ PG_RETURN_BOOL(d <= circle->radius);
+}
+
+
+/* dist_pc - returns the distance between
+ * a point and a circle.
+ */
+Datum
+dist_pc(PG_FUNCTION_ARGS)
+{
+ Point *point = PG_GETARG_POINT_P(0);
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(1);
+ float8 result;
+
+ result = float8_mi(point_dt(point, &circle->center),
+ circle->radius);
+ if (result < 0.0)
+ result = 0.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * Distance from a circle to a point
+ */
+Datum
+dist_cpoint(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *point = PG_GETARG_POINT_P(1);
+ float8 result;
+
+ result = float8_mi(point_dt(point, &circle->center), circle->radius);
+ if (result < 0.0)
+ result = 0.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/* circle_center - returns the center point of the circle.
+ */
+Datum
+circle_center(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ Point *result;
+
+ result = (Point *) palloc(sizeof(Point));
+ result->x = circle->center.x;
+ result->y = circle->center.y;
+
+ PG_RETURN_POINT_P(result);
+}
+
+
+/* circle_ar - returns the area of the circle.
+ */
+static float8
+circle_ar(CIRCLE *circle)
+{
+ return float8_mul(float8_mul(circle->radius, circle->radius), M_PI);
+}
+
+
+/*----------------------------------------------------------
+ * Conversion operators.
+ *---------------------------------------------------------*/
+
+Datum
+cr_circle(PG_FUNCTION_ARGS)
+{
+ Point *center = PG_GETARG_POINT_P(0);
+ float8 radius = PG_GETARG_FLOAT8(1);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ result->center.x = center->x;
+ result->center.y = center->y;
+ result->radius = radius;
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+Datum
+circle_box(PG_FUNCTION_ARGS)
+{
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
+ BOX *box;
+ float8 delta;
+
+ box = (BOX *) palloc(sizeof(BOX));
+
+ delta = float8_div(circle->radius, sqrt(2.0));
+
+ box->high.x = float8_pl(circle->center.x, delta);
+ box->low.x = float8_mi(circle->center.x, delta);
+ box->high.y = float8_pl(circle->center.y, delta);
+ box->low.y = float8_mi(circle->center.y, delta);
+
+ PG_RETURN_BOX_P(box);
+}
+
+/* box_circle()
+ * Convert a box to a circle.
+ */
+Datum
+box_circle(PG_FUNCTION_ARGS)
+{
+ BOX *box = PG_GETARG_BOX_P(0);
+ CIRCLE *circle;
+
+ circle = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ circle->center.x = float8_div(float8_pl(box->high.x, box->low.x), 2.0);
+ circle->center.y = float8_div(float8_pl(box->high.y, box->low.y), 2.0);
+
+ circle->radius = point_dt(&circle->center, &box->high);
+
+ PG_RETURN_CIRCLE_P(circle);
+}
+
+
+Datum
+circle_poly(PG_FUNCTION_ARGS)
+{
+ int32 npts = PG_GETARG_INT32(0);
+ CIRCLE *circle = PG_GETARG_CIRCLE_P(1);
+ POLYGON *poly;
+ int base_size,
+ size;
+ int i;
+ float8 angle;
+ float8 anglestep;
+
+ if (FPzero(circle->radius))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert circle with radius zero to polygon")));
+
+ if (npts < 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("must request at least 2 points")));
+
+ base_size = sizeof(poly->p[0]) * npts;
+ size = offsetof(POLYGON, p) + base_size;
+
+ /* Check for integer overflow */
+ if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many points requested")));
+
+ poly = (POLYGON *) palloc0(size); /* zero any holes */
+ SET_VARSIZE(poly, size);
+ poly->npts = npts;
+
+ anglestep = float8_div(2.0 * M_PI, npts);
+
+ for (i = 0; i < npts; i++)
+ {
+ angle = float8_mul(anglestep, i);
+
+ poly->p[i].x = float8_mi(circle->center.x,
+ float8_mul(circle->radius, cos(angle)));
+ poly->p[i].y = float8_pl(circle->center.y,
+ float8_mul(circle->radius, sin(angle)));
+ }
+
+ make_bound_box(poly);
+
+ PG_RETURN_POLYGON_P(poly);
+}
+
+/*
+ * Convert polygon to circle
+ *
+ * The result must be preallocated.
+ *
+ * XXX This algorithm should use weighted means of line segments
+ * rather than straight average values of points - tgl 97/01/21.
+ */
+static void
+poly_to_circle(CIRCLE *result, POLYGON *poly)
+{
+ int i;
+
+ Assert(poly->npts > 0);
+
+ result->center.x = 0;
+ result->center.y = 0;
+ result->radius = 0;
+
+ for (i = 0; i < poly->npts; i++)
+ point_add_point(&result->center, &result->center, &poly->p[i]);
+ result->center.x = float8_div(result->center.x, poly->npts);
+ result->center.y = float8_div(result->center.y, poly->npts);
+
+ for (i = 0; i < poly->npts; i++)
+ result->radius = float8_pl(result->radius,
+ point_dt(&poly->p[i], &result->center));
+ result->radius = float8_div(result->radius, poly->npts);
+}
+
+Datum
+poly_circle(PG_FUNCTION_ARGS)
+{
+ POLYGON *poly = PG_GETARG_POLYGON_P(0);
+ CIRCLE *result;
+
+ result = (CIRCLE *) palloc(sizeof(CIRCLE));
+
+ poly_to_circle(result, poly);
+
+ PG_RETURN_CIRCLE_P(result);
+}
+
+
+/***********************************************************************
+ **
+ ** Private routines for multiple types.
+ **
+ ***********************************************************************/
+
+/*
+ * Test to see if the point is inside the polygon, returns 1/0, or 2 if
+ * the point is on the polygon.
+ * Code adapted but not copied from integer-based routines in WN: A
+ * Server for the HTTP
+ * version 1.15.1, file wn/image.c
+ * http://hopf.math.northwestern.edu/index.html
+ * Description of algorithm: http://www.linuxjournal.com/article/2197
+ * http://www.linuxjournal.com/article/2029
+ */
+
+#define POINT_ON_POLYGON INT_MAX
+
+static int
+point_inside(Point *p, int npts, Point *plist)
+{
+ float8 x0,
+ y0;
+ float8 prev_x,
+ prev_y;
+ int i = 0;
+ float8 x,
+ y;
+ int cross,
+ total_cross = 0;
+
+ Assert(npts > 0);
+
+ /* compute first polygon point relative to single point */
+ x0 = float8_mi(plist[0].x, p->x);
+ y0 = float8_mi(plist[0].y, p->y);
+
+ prev_x = x0;
+ prev_y = y0;
+ /* loop over polygon points and aggregate total_cross */
+ for (i = 1; i < npts; i++)
+ {
+ /* compute next polygon point relative to single point */
+ x = float8_mi(plist[i].x, p->x);
+ y = float8_mi(plist[i].y, p->y);
+
+ /* compute previous to current point crossing */
+ if ((cross = lseg_crossing(x, y, prev_x, prev_y)) == POINT_ON_POLYGON)
+ return 2;
+ total_cross += cross;
+
+ prev_x = x;
+ prev_y = y;
+ }
+
+ /* now do the first point */
+ if ((cross = lseg_crossing(x0, y0, prev_x, prev_y)) == POINT_ON_POLYGON)
+ return 2;
+ total_cross += cross;
+
+ if (total_cross != 0)
+ return 1;
+ return 0;
+}
+
+
+/* lseg_crossing()
+ * Returns +/-2 if line segment crosses the positive X-axis in a +/- direction.
+ * Returns +/-1 if one point is on the positive X-axis.
+ * Returns 0 if both points are on the positive X-axis, or there is no crossing.
+ * Returns POINT_ON_POLYGON if the segment contains (0,0).
+ * Wow, that is one confusing API, but it is used above, and when summed,
+ * can tell is if a point is in a polygon.
+ */
+
+static int
+lseg_crossing(float8 x, float8 y, float8 prev_x, float8 prev_y)
+{
+ float8 z;
+ int y_sign;
+
+ if (FPzero(y))
+ { /* y == 0, on X axis */
+ if (FPzero(x)) /* (x,y) is (0,0)? */
+ return POINT_ON_POLYGON;
+ else if (FPgt(x, 0))
+ { /* x > 0 */
+ if (FPzero(prev_y)) /* y and prev_y are zero */
+ /* prev_x > 0? */
+ return FPgt(prev_x, 0.0) ? 0 : POINT_ON_POLYGON;
+ return FPlt(prev_y, 0.0) ? 1 : -1;
+ }
+ else
+ { /* x < 0, x not on positive X axis */
+ if (FPzero(prev_y))
+ /* prev_x < 0? */
+ return FPlt(prev_x, 0.0) ? 0 : POINT_ON_POLYGON;
+ return 0;
+ }
+ }
+ else
+ { /* y != 0 */
+ /* compute y crossing direction from previous point */
+ y_sign = FPgt(y, 0.0) ? 1 : -1;
+
+ if (FPzero(prev_y))
+ /* previous point was on X axis, so new point is either off or on */
+ return FPlt(prev_x, 0.0) ? 0 : y_sign;
+ else if ((y_sign < 0 && FPlt(prev_y, 0.0)) ||
+ (y_sign > 0 && FPgt(prev_y, 0.0)))
+ /* both above or below X axis */
+ return 0; /* same sign */
+ else
+ { /* y and prev_y cross X-axis */
+ if (FPge(x, 0.0) && FPgt(prev_x, 0.0))
+ /* both non-negative so cross positive X-axis */
+ return 2 * y_sign;
+ if (FPlt(x, 0.0) && FPle(prev_x, 0.0))
+ /* both non-positive so do not cross positive X-axis */
+ return 0;
+
+ /* x and y cross axes, see URL above point_inside() */
+ z = float8_mi(float8_mul(float8_mi(x, prev_x), y),
+ float8_mul(float8_mi(y, prev_y), x));
+ if (FPzero(z))
+ return POINT_ON_POLYGON;
+ if ((y_sign < 0 && FPlt(z, 0.0)) ||
+ (y_sign > 0 && FPgt(z, 0.0)))
+ return 0;
+ return 2 * y_sign;
+ }
+ }
+}
+
+
+static bool
+plist_same(int npts, Point *p1, Point *p2)
+{
+ int i,
+ ii,
+ j;
+
+ /* find match for first point */
+ for (i = 0; i < npts; i++)
+ {
+ if (point_eq_point(&p2[i], &p1[0]))
+ {
+
+ /* match found? then look forward through remaining points */
+ for (ii = 1, j = i + 1; ii < npts; ii++, j++)
+ {
+ if (j >= npts)
+ j = 0;
+ if (!point_eq_point(&p2[j], &p1[ii]))
+ break;
+ }
+ if (ii == npts)
+ return true;
+
+ /* match not found forwards? then look backwards */
+ for (ii = 1, j = i - 1; ii < npts; ii++, j--)
+ {
+ if (j < 0)
+ j = (npts - 1);
+ if (!point_eq_point(&p2[j], &p1[ii]))
+ break;
+ }
+ if (ii == npts)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Determine the hypotenuse.
+ *
+ * If required, x and y are swapped to make x the larger number. The
+ * traditional formula of x^2+y^2 is rearranged to factor x outside the
+ * sqrt. This allows computation of the hypotenuse for significantly
+ * larger values, and with a higher precision than when using the naive
+ * formula. In particular, this cannot overflow unless the final result
+ * would be out-of-range.
+ *
+ * sqrt( x^2 + y^2 ) = sqrt( x^2( 1 + y^2/x^2) )
+ * = x * sqrt( 1 + y^2/x^2 )
+ * = x * sqrt( 1 + y/x * y/x )
+ *
+ * It is expected that this routine will eventually be replaced with the
+ * C99 hypot() function.
+ *
+ * This implementation conforms to IEEE Std 1003.1 and GLIBC, in that the
+ * case of hypot(inf,nan) results in INF, and not NAN.
+ *-----------------------------------------------------------------------
+ */
+float8
+pg_hypot(float8 x, float8 y)
+{
+ float8 yx,
+ result;
+
+ /* Handle INF and NaN properly */
+ if (isinf(x) || isinf(y))
+ return get_float8_infinity();
+
+ if (isnan(x) || isnan(y))
+ return get_float8_nan();
+
+ /* Else, drop any minus signs */
+ x = fabs(x);
+ y = fabs(y);
+
+ /* Swap x and y if needed to make x the larger one */
+ if (x < y)
+ {
+ float8 temp = x;
+
+ x = y;
+ y = temp;
+ }
+
+ /*
+ * If y is zero, the hypotenuse is x. This test saves a few cycles in
+ * such cases, but more importantly it also protects against
+ * divide-by-zero errors, since now x >= y.
+ */
+ if (y == 0.0)
+ return x;
+
+ /* Determine the hypotenuse */
+ yx = y / x;
+ result = x * sqrt(1.0 + (yx * yx));
+
+ if (unlikely(isinf(result)))
+ float_overflow_error();
+ if (unlikely(result == 0.0))
+ float_underflow_error();
+
+ return result;
+}
diff --git a/src/backend/utils/adt/geo_selfuncs.c b/src/backend/utils/adt/geo_selfuncs.c
new file mode 100644
index 0000000..9deccab
--- /dev/null
+++ b/src/backend/utils/adt/geo_selfuncs.c
@@ -0,0 +1,96 @@
+/*-------------------------------------------------------------------------
+ *
+ * geo_selfuncs.c
+ * Selectivity routines registered in the operator catalog in the
+ * "oprrest" and "oprjoin" attributes.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/geo_selfuncs.c
+ *
+ * XXX These are totally bogus. Perhaps someone will make them do
+ * something reasonable, someday.
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "utils/builtins.h"
+#include "utils/geo_decls.h"
+
+
+/*
+ * Selectivity functions for geometric operators. These are bogus -- unless
+ * we know the actual key distribution in the index, we can't make a good
+ * prediction of the selectivity of these operators.
+ *
+ * Note: the values used here may look unreasonably small. Perhaps they
+ * are. For now, we want to make sure that the optimizer will make use
+ * of a geometric index if one is available, so the selectivity had better
+ * be fairly small.
+ *
+ * In general, GiST needs to search multiple subtrees in order to guarantee
+ * that all occurrences of the same key have been found. Because of this,
+ * the estimated cost for scanning the index ought to be higher than the
+ * output selectivity would indicate. gistcostestimate(), over in selfuncs.c,
+ * ought to be adjusted accordingly --- but until we can generate somewhat
+ * realistic numbers here, it hardly matters...
+ */
+
+
+/*
+ * Selectivity for operators that depend on area, such as "overlap".
+ */
+
+Datum
+areasel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.005);
+}
+
+Datum
+areajoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.005);
+}
+
+/*
+ * positionsel
+ *
+ * How likely is a box to be strictly left of (right of, above, below)
+ * a given box?
+ */
+
+Datum
+positionsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.1);
+}
+
+Datum
+positionjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.1);
+}
+
+/*
+ * contsel -- How likely is a box to contain (be contained by) a given box?
+ *
+ * This is a tighter constraint than "overlap", so produce a smaller
+ * estimate than areasel does.
+ */
+
+Datum
+contsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.001);
+}
+
+Datum
+contjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(0.001);
+}
diff --git a/src/backend/utils/adt/geo_spgist.c b/src/backend/utils/adt/geo_spgist.c
new file mode 100644
index 0000000..5dec466
--- /dev/null
+++ b/src/backend/utils/adt/geo_spgist.c
@@ -0,0 +1,885 @@
+/*-------------------------------------------------------------------------
+ *
+ * geo_spgist.c
+ * SP-GiST implementation of 4-dimensional quad tree over boxes
+ *
+ * This module provides SP-GiST implementation for boxes using quad tree
+ * analogy in 4-dimensional space. SP-GiST doesn't allow indexing of
+ * overlapping objects. We are making 2D objects never-overlapping in
+ * 4D space. This technique has some benefits compared to traditional
+ * R-Tree which is implemented as GiST. The performance tests reveal
+ * that this technique especially beneficial with too much overlapping
+ * objects, so called "spaghetti data".
+ *
+ * Unlike the original quad tree, we are splitting the tree into 16
+ * quadrants in 4D space. It is easier to imagine it as splitting space
+ * two times into 4:
+ *
+ * | |
+ * | |
+ * | -----+-----
+ * | |
+ * | |
+ * -------------+-------------
+ * |
+ * |
+ * |
+ * |
+ * |
+ *
+ * We are using box datatype as the prefix, but we are treating them
+ * as points in 4-dimensional space, because 2D boxes are not enough
+ * to represent the quadrant boundaries in 4D space. They however are
+ * sufficient to point out the additional boundaries of the next
+ * quadrant.
+ *
+ * We are using traversal values provided by SP-GiST to calculate and
+ * to store the bounds of the quadrants, while traversing into the tree.
+ * Traversal value has all the boundaries in the 4D space, and is capable
+ * of transferring the required boundaries to the following traversal
+ * values. In conclusion, three things are necessary to calculate the
+ * next traversal value:
+ *
+ * (1) the traversal value of the parent
+ * (2) the quadrant of the current node
+ * (3) the prefix of the current node
+ *
+ * If we visualize them on our simplified drawing (see the drawing above);
+ * transferred boundaries of (1) would be the outer axis, relevant part
+ * of (2) would be the up right part of the other axis, and (3) would be
+ * the inner axis.
+ *
+ * For example, consider the case of overlapping. When recursion
+ * descends deeper and deeper down the tree, all quadrants in
+ * the current node will be checked for overlapping. The boundaries
+ * will be re-calculated for all quadrants. Overlap check answers
+ * the question: can any box from this quadrant overlap with the given
+ * box? If yes, then this quadrant will be walked. If no, then this
+ * quadrant will be skipped.
+ *
+ * This method provides restrictions for minimum and maximum values of
+ * every dimension of every corner of the box on every level of the tree
+ * except the root. For the root node, we are setting the boundaries
+ * that we don't yet have as infinity.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/geo_spgist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/spgist.h"
+#include "access/spgist_private.h"
+#include "access/stratnum.h"
+#include "catalog/pg_type.h"
+#include "utils/float.h"
+#include "utils/fmgroids.h"
+#include "utils/fmgrprotos.h"
+#include "utils/geo_decls.h"
+
+/*
+ * Comparator for qsort
+ *
+ * We don't need to use the floating point macros in here, because this
+ * is only going to be used in a place to effect the performance
+ * of the index, not the correctness.
+ */
+static int
+compareDoubles(const void *a, const void *b)
+{
+ float8 x = *(float8 *) a;
+ float8 y = *(float8 *) b;
+
+ if (x == y)
+ return 0;
+ return (x > y) ? 1 : -1;
+}
+
+typedef struct
+{
+ float8 low;
+ float8 high;
+} Range;
+
+typedef struct
+{
+ Range left;
+ Range right;
+} RangeBox;
+
+typedef struct
+{
+ RangeBox range_box_x;
+ RangeBox range_box_y;
+} RectBox;
+
+/*
+ * Calculate the quadrant
+ *
+ * The quadrant is 8 bit unsigned integer with 4 least bits in use.
+ * This function accepts BOXes as input. They are not casted to
+ * RangeBoxes, yet. All 4 bits are set by comparing a corner of the box.
+ * This makes 16 quadrants in total.
+ */
+static uint8
+getQuadrant(BOX *centroid, BOX *inBox)
+{
+ uint8 quadrant = 0;
+
+ if (inBox->low.x > centroid->low.x)
+ quadrant |= 0x8;
+
+ if (inBox->high.x > centroid->high.x)
+ quadrant |= 0x4;
+
+ if (inBox->low.y > centroid->low.y)
+ quadrant |= 0x2;
+
+ if (inBox->high.y > centroid->high.y)
+ quadrant |= 0x1;
+
+ return quadrant;
+}
+
+/*
+ * Get RangeBox using BOX
+ *
+ * We are turning the BOX to our structures to emphasize their function
+ * of representing points in 4D space. It also is more convenient to
+ * access the values with this structure.
+ */
+static RangeBox *
+getRangeBox(BOX *box)
+{
+ RangeBox *range_box = (RangeBox *) palloc(sizeof(RangeBox));
+
+ range_box->left.low = box->low.x;
+ range_box->left.high = box->high.x;
+
+ range_box->right.low = box->low.y;
+ range_box->right.high = box->high.y;
+
+ return range_box;
+}
+
+/*
+ * Initialize the traversal value
+ *
+ * In the beginning, we don't have any restrictions. We have to
+ * initialize the struct to cover the whole 4D space.
+ */
+static RectBox *
+initRectBox(void)
+{
+ RectBox *rect_box = (RectBox *) palloc(sizeof(RectBox));
+ float8 infinity = get_float8_infinity();
+
+ rect_box->range_box_x.left.low = -infinity;
+ rect_box->range_box_x.left.high = infinity;
+
+ rect_box->range_box_x.right.low = -infinity;
+ rect_box->range_box_x.right.high = infinity;
+
+ rect_box->range_box_y.left.low = -infinity;
+ rect_box->range_box_y.left.high = infinity;
+
+ rect_box->range_box_y.right.low = -infinity;
+ rect_box->range_box_y.right.high = infinity;
+
+ return rect_box;
+}
+
+/*
+ * Calculate the next traversal value
+ *
+ * All centroids are bounded by RectBox, but SP-GiST only keeps
+ * boxes. When we are traversing the tree, we must calculate RectBox,
+ * using centroid and quadrant.
+ */
+static RectBox *
+nextRectBox(RectBox *rect_box, RangeBox *centroid, uint8 quadrant)
+{
+ RectBox *next_rect_box = (RectBox *) palloc(sizeof(RectBox));
+
+ memcpy(next_rect_box, rect_box, sizeof(RectBox));
+
+ if (quadrant & 0x8)
+ next_rect_box->range_box_x.left.low = centroid->left.low;
+ else
+ next_rect_box->range_box_x.left.high = centroid->left.low;
+
+ if (quadrant & 0x4)
+ next_rect_box->range_box_x.right.low = centroid->left.high;
+ else
+ next_rect_box->range_box_x.right.high = centroid->left.high;
+
+ if (quadrant & 0x2)
+ next_rect_box->range_box_y.left.low = centroid->right.low;
+ else
+ next_rect_box->range_box_y.left.high = centroid->right.low;
+
+ if (quadrant & 0x1)
+ next_rect_box->range_box_y.right.low = centroid->right.high;
+ else
+ next_rect_box->range_box_y.right.high = centroid->right.high;
+
+ return next_rect_box;
+}
+
+/* Can any range from range_box overlap with this argument? */
+static bool
+overlap2D(RangeBox *range_box, Range *query)
+{
+ return FPge(range_box->right.high, query->low) &&
+ FPle(range_box->left.low, query->high);
+}
+
+/* Can any rectangle from rect_box overlap with this argument? */
+static bool
+overlap4D(RectBox *rect_box, RangeBox *query)
+{
+ return overlap2D(&rect_box->range_box_x, &query->left) &&
+ overlap2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any range from range_box contain this argument? */
+static bool
+contain2D(RangeBox *range_box, Range *query)
+{
+ return FPge(range_box->right.high, query->high) &&
+ FPle(range_box->left.low, query->low);
+}
+
+/* Can any rectangle from rect_box contain this argument? */
+static bool
+contain4D(RectBox *rect_box, RangeBox *query)
+{
+ return contain2D(&rect_box->range_box_x, &query->left) &&
+ contain2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any range from range_box be contained by this argument? */
+static bool
+contained2D(RangeBox *range_box, Range *query)
+{
+ return FPle(range_box->left.low, query->high) &&
+ FPge(range_box->left.high, query->low) &&
+ FPle(range_box->right.low, query->high) &&
+ FPge(range_box->right.high, query->low);
+}
+
+/* Can any rectangle from rect_box be contained by this argument? */
+static bool
+contained4D(RectBox *rect_box, RangeBox *query)
+{
+ return contained2D(&rect_box->range_box_x, &query->left) &&
+ contained2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any range from range_box to be lower than this argument? */
+static bool
+lower2D(RangeBox *range_box, Range *query)
+{
+ return FPlt(range_box->left.low, query->low) &&
+ FPlt(range_box->right.low, query->low);
+}
+
+/* Can any range from range_box not extend to the right side of the query? */
+static bool
+overLower2D(RangeBox *range_box, Range *query)
+{
+ return FPle(range_box->left.low, query->high) &&
+ FPle(range_box->right.low, query->high);
+}
+
+/* Can any range from range_box to be higher than this argument? */
+static bool
+higher2D(RangeBox *range_box, Range *query)
+{
+ return FPgt(range_box->left.high, query->high) &&
+ FPgt(range_box->right.high, query->high);
+}
+
+/* Can any range from range_box not extend to the left side of the query? */
+static bool
+overHigher2D(RangeBox *range_box, Range *query)
+{
+ return FPge(range_box->left.high, query->low) &&
+ FPge(range_box->right.high, query->low);
+}
+
+/* Can any rectangle from rect_box be left of this argument? */
+static bool
+left4D(RectBox *rect_box, RangeBox *query)
+{
+ return lower2D(&rect_box->range_box_x, &query->left);
+}
+
+/* Can any rectangle from rect_box does not extend the right of this argument? */
+static bool
+overLeft4D(RectBox *rect_box, RangeBox *query)
+{
+ return overLower2D(&rect_box->range_box_x, &query->left);
+}
+
+/* Can any rectangle from rect_box be right of this argument? */
+static bool
+right4D(RectBox *rect_box, RangeBox *query)
+{
+ return higher2D(&rect_box->range_box_x, &query->left);
+}
+
+/* Can any rectangle from rect_box does not extend the left of this argument? */
+static bool
+overRight4D(RectBox *rect_box, RangeBox *query)
+{
+ return overHigher2D(&rect_box->range_box_x, &query->left);
+}
+
+/* Can any rectangle from rect_box be below of this argument? */
+static bool
+below4D(RectBox *rect_box, RangeBox *query)
+{
+ return lower2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any rectangle from rect_box does not extend above this argument? */
+static bool
+overBelow4D(RectBox *rect_box, RangeBox *query)
+{
+ return overLower2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any rectangle from rect_box be above of this argument? */
+static bool
+above4D(RectBox *rect_box, RangeBox *query)
+{
+ return higher2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Can any rectangle from rect_box does not extend below of this argument? */
+static bool
+overAbove4D(RectBox *rect_box, RangeBox *query)
+{
+ return overHigher2D(&rect_box->range_box_y, &query->right);
+}
+
+/* Lower bound for the distance between point and rect_box */
+static double
+pointToRectBoxDistance(Point *point, RectBox *rect_box)
+{
+ double dx;
+ double dy;
+
+ if (point->x < rect_box->range_box_x.left.low)
+ dx = rect_box->range_box_x.left.low - point->x;
+ else if (point->x > rect_box->range_box_x.right.high)
+ dx = point->x - rect_box->range_box_x.right.high;
+ else
+ dx = 0;
+
+ if (point->y < rect_box->range_box_y.left.low)
+ dy = rect_box->range_box_y.left.low - point->y;
+ else if (point->y > rect_box->range_box_y.right.high)
+ dy = point->y - rect_box->range_box_y.right.high;
+ else
+ dy = 0;
+
+ return HYPOT(dx, dy);
+}
+
+
+/*
+ * SP-GiST config function
+ */
+Datum
+spg_box_quad_config(PG_FUNCTION_ARGS)
+{
+ spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+
+ cfg->prefixType = BOXOID;
+ cfg->labelType = VOIDOID; /* We don't need node labels. */
+ cfg->canReturnData = true;
+ cfg->longValuesOK = false;
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SP-GiST choose function
+ */
+Datum
+spg_box_quad_choose(PG_FUNCTION_ARGS)
+{
+ spgChooseIn *in = (spgChooseIn *) PG_GETARG_POINTER(0);
+ spgChooseOut *out = (spgChooseOut *) PG_GETARG_POINTER(1);
+ BOX *centroid = DatumGetBoxP(in->prefixDatum),
+ *box = DatumGetBoxP(in->leafDatum);
+
+ out->resultType = spgMatchNode;
+ out->result.matchNode.restDatum = BoxPGetDatum(box);
+
+ /* nodeN will be set by core, when allTheSame. */
+ if (!in->allTheSame)
+ out->result.matchNode.nodeN = getQuadrant(centroid, box);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SP-GiST pick-split function
+ *
+ * It splits a list of boxes into quadrants by choosing a central 4D
+ * point as the median of the coordinates of the boxes.
+ */
+Datum
+spg_box_quad_picksplit(PG_FUNCTION_ARGS)
+{
+ spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0);
+ spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1);
+ BOX *centroid;
+ int median,
+ i;
+ float8 *lowXs = palloc(sizeof(float8) * in->nTuples);
+ float8 *highXs = palloc(sizeof(float8) * in->nTuples);
+ float8 *lowYs = palloc(sizeof(float8) * in->nTuples);
+ float8 *highYs = palloc(sizeof(float8) * in->nTuples);
+
+ /* Calculate median of all 4D coordinates */
+ for (i = 0; i < in->nTuples; i++)
+ {
+ BOX *box = DatumGetBoxP(in->datums[i]);
+
+ lowXs[i] = box->low.x;
+ highXs[i] = box->high.x;
+ lowYs[i] = box->low.y;
+ highYs[i] = box->high.y;
+ }
+
+ qsort(lowXs, in->nTuples, sizeof(float8), compareDoubles);
+ qsort(highXs, in->nTuples, sizeof(float8), compareDoubles);
+ qsort(lowYs, in->nTuples, sizeof(float8), compareDoubles);
+ qsort(highYs, in->nTuples, sizeof(float8), compareDoubles);
+
+ median = in->nTuples / 2;
+
+ centroid = palloc(sizeof(BOX));
+
+ centroid->low.x = lowXs[median];
+ centroid->high.x = highXs[median];
+ centroid->low.y = lowYs[median];
+ centroid->high.y = highYs[median];
+
+ /* Fill the output */
+ out->hasPrefix = true;
+ out->prefixDatum = BoxPGetDatum(centroid);
+
+ out->nNodes = 16;
+ out->nodeLabels = NULL; /* We don't need node labels. */
+
+ out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
+ out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
+
+ /*
+ * Assign ranges to corresponding nodes according to quadrants relative to
+ * the "centroid" range
+ */
+ for (i = 0; i < in->nTuples; i++)
+ {
+ BOX *box = DatumGetBoxP(in->datums[i]);
+ uint8 quadrant = getQuadrant(centroid, box);
+
+ out->leafTupleDatums[i] = BoxPGetDatum(box);
+ out->mapTuplesToNodes[i] = quadrant;
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * Check if result of consistent method based on bounding box is exact.
+ */
+static bool
+is_bounding_box_test_exact(StrategyNumber strategy)
+{
+ switch (strategy)
+ {
+ case RTLeftStrategyNumber:
+ case RTOverLeftStrategyNumber:
+ case RTOverRightStrategyNumber:
+ case RTRightStrategyNumber:
+ case RTOverBelowStrategyNumber:
+ case RTBelowStrategyNumber:
+ case RTAboveStrategyNumber:
+ case RTOverAboveStrategyNumber:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+/*
+ * Get bounding box for ScanKey.
+ */
+static BOX *
+spg_box_quad_get_scankey_bbox(ScanKey sk, bool *recheck)
+{
+ switch (sk->sk_subtype)
+ {
+ case BOXOID:
+ return DatumGetBoxP(sk->sk_argument);
+
+ case POLYGONOID:
+ if (recheck && !is_bounding_box_test_exact(sk->sk_strategy))
+ *recheck = true;
+ return &DatumGetPolygonP(sk->sk_argument)->boundbox;
+
+ default:
+ elog(ERROR, "unrecognized scankey subtype: %d", sk->sk_subtype);
+ return NULL;
+ }
+}
+
+/*
+ * SP-GiST inner consistent function
+ */
+Datum
+spg_box_quad_inner_consistent(PG_FUNCTION_ARGS)
+{
+ spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0);
+ spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
+ int i;
+ MemoryContext old_ctx;
+ RectBox *rect_box;
+ uint8 quadrant;
+ RangeBox *centroid,
+ **queries;
+
+ /*
+ * We are saving the traversal value or initialize it an unbounded one, if
+ * we have just begun to walk the tree.
+ */
+ if (in->traversalValue)
+ rect_box = in->traversalValue;
+ else
+ rect_box = initRectBox();
+
+ if (in->allTheSame)
+ {
+ /* Report that all nodes should be visited */
+ out->nNodes = in->nNodes;
+ out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ for (i = 0; i < in->nNodes; i++)
+ out->nodeNumbers[i] = i;
+
+ if (in->norderbys > 0 && in->nNodes > 0)
+ {
+ double *distances = palloc(sizeof(double) * in->norderbys);
+ int j;
+
+ for (j = 0; j < in->norderbys; j++)
+ {
+ Point *pt = DatumGetPointP(in->orderbys[j].sk_argument);
+
+ distances[j] = pointToRectBoxDistance(pt, rect_box);
+ }
+
+ out->distances = (double **) palloc(sizeof(double *) * in->nNodes);
+ out->distances[0] = distances;
+
+ for (i = 1; i < in->nNodes; i++)
+ {
+ out->distances[i] = palloc(sizeof(double) * in->norderbys);
+ memcpy(out->distances[i], distances,
+ sizeof(double) * in->norderbys);
+ }
+ }
+
+ PG_RETURN_VOID();
+ }
+
+ /*
+ * We are casting the prefix and queries to RangeBoxes for ease of the
+ * following operations.
+ */
+ centroid = getRangeBox(DatumGetBoxP(in->prefixDatum));
+ queries = (RangeBox **) palloc(in->nkeys * sizeof(RangeBox *));
+ for (i = 0; i < in->nkeys; i++)
+ {
+ BOX *box = spg_box_quad_get_scankey_bbox(&in->scankeys[i], NULL);
+
+ queries[i] = getRangeBox(box);
+ }
+
+ /* Allocate enough memory for nodes */
+ out->nNodes = 0;
+ out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ out->traversalValues = (void **) palloc(sizeof(void *) * in->nNodes);
+ if (in->norderbys > 0)
+ out->distances = (double **) palloc(sizeof(double *) * in->nNodes);
+
+ /*
+ * We switch memory context, because we want to allocate memory for new
+ * traversal values (next_rect_box) and pass these pieces of memory to
+ * further call of this function.
+ */
+ old_ctx = MemoryContextSwitchTo(in->traversalMemoryContext);
+
+ for (quadrant = 0; quadrant < in->nNodes; quadrant++)
+ {
+ RectBox *next_rect_box = nextRectBox(rect_box, centroid, quadrant);
+ bool flag = true;
+
+ for (i = 0; i < in->nkeys; i++)
+ {
+ StrategyNumber strategy = in->scankeys[i].sk_strategy;
+
+ switch (strategy)
+ {
+ case RTOverlapStrategyNumber:
+ flag = overlap4D(next_rect_box, queries[i]);
+ break;
+
+ case RTContainsStrategyNumber:
+ flag = contain4D(next_rect_box, queries[i]);
+ break;
+
+ case RTSameStrategyNumber:
+ case RTContainedByStrategyNumber:
+ flag = contained4D(next_rect_box, queries[i]);
+ break;
+
+ case RTLeftStrategyNumber:
+ flag = left4D(next_rect_box, queries[i]);
+ break;
+
+ case RTOverLeftStrategyNumber:
+ flag = overLeft4D(next_rect_box, queries[i]);
+ break;
+
+ case RTRightStrategyNumber:
+ flag = right4D(next_rect_box, queries[i]);
+ break;
+
+ case RTOverRightStrategyNumber:
+ flag = overRight4D(next_rect_box, queries[i]);
+ break;
+
+ case RTAboveStrategyNumber:
+ flag = above4D(next_rect_box, queries[i]);
+ break;
+
+ case RTOverAboveStrategyNumber:
+ flag = overAbove4D(next_rect_box, queries[i]);
+ break;
+
+ case RTBelowStrategyNumber:
+ flag = below4D(next_rect_box, queries[i]);
+ break;
+
+ case RTOverBelowStrategyNumber:
+ flag = overBelow4D(next_rect_box, queries[i]);
+ break;
+
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
+ }
+
+ /* If any check is failed, we have found our answer. */
+ if (!flag)
+ break;
+ }
+
+ if (flag)
+ {
+ out->traversalValues[out->nNodes] = next_rect_box;
+ out->nodeNumbers[out->nNodes] = quadrant;
+
+ if (in->norderbys > 0)
+ {
+ double *distances = palloc(sizeof(double) * in->norderbys);
+ int j;
+
+ out->distances[out->nNodes] = distances;
+
+ for (j = 0; j < in->norderbys; j++)
+ {
+ Point *pt = DatumGetPointP(in->orderbys[j].sk_argument);
+
+ distances[j] = pointToRectBoxDistance(pt, next_rect_box);
+ }
+ }
+
+ out->nNodes++;
+ }
+ else
+ {
+ /*
+ * If this node is not selected, we don't need to keep the next
+ * traversal value in the memory context.
+ */
+ pfree(next_rect_box);
+ }
+ }
+
+ /* Switch back */
+ MemoryContextSwitchTo(old_ctx);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SP-GiST inner consistent function
+ */
+Datum
+spg_box_quad_leaf_consistent(PG_FUNCTION_ARGS)
+{
+ spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0);
+ spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1);
+ Datum leaf = in->leafDatum;
+ bool flag = true;
+ int i;
+
+ /* All tests are exact. */
+ out->recheck = false;
+
+ /*
+ * Don't return leafValue unless told to; this is used for both box and
+ * polygon opclasses, and in the latter case the leaf datum is not even of
+ * the right type to return.
+ */
+ if (in->returnData)
+ out->leafValue = leaf;
+
+ /* Perform the required comparison(s) */
+ for (i = 0; i < in->nkeys; i++)
+ {
+ StrategyNumber strategy = in->scankeys[i].sk_strategy;
+ BOX *box = spg_box_quad_get_scankey_bbox(&in->scankeys[i],
+ &out->recheck);
+ Datum query = BoxPGetDatum(box);
+
+ switch (strategy)
+ {
+ case RTOverlapStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_overlap, leaf,
+ query));
+ break;
+
+ case RTContainsStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_contain, leaf,
+ query));
+ break;
+
+ case RTContainedByStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_contained, leaf,
+ query));
+ break;
+
+ case RTSameStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_same, leaf,
+ query));
+ break;
+
+ case RTLeftStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_left, leaf,
+ query));
+ break;
+
+ case RTOverLeftStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_overleft, leaf,
+ query));
+ break;
+
+ case RTRightStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_right, leaf,
+ query));
+ break;
+
+ case RTOverRightStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_overright, leaf,
+ query));
+ break;
+
+ case RTAboveStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_above, leaf,
+ query));
+ break;
+
+ case RTOverAboveStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_overabove, leaf,
+ query));
+ break;
+
+ case RTBelowStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_below, leaf,
+ query));
+ break;
+
+ case RTOverBelowStrategyNumber:
+ flag = DatumGetBool(DirectFunctionCall2(box_overbelow, leaf,
+ query));
+ break;
+
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
+ }
+
+ /* If any check is failed, we have found our answer. */
+ if (!flag)
+ break;
+ }
+
+ if (flag && in->norderbys > 0)
+ {
+ Oid distfnoid = in->orderbys[0].sk_func.fn_oid;
+
+ out->distances = spg_key_orderbys_distances(leaf, false,
+ in->orderbys, in->norderbys);
+
+ /* Recheck is necessary when computing distance to polygon */
+ out->recheckDistances = distfnoid == F_DIST_POLYP;
+ }
+
+ PG_RETURN_BOOL(flag);
+}
+
+
+/*
+ * SP-GiST config function for 2-D types that are lossy represented by their
+ * bounding boxes
+ */
+Datum
+spg_bbox_quad_config(PG_FUNCTION_ARGS)
+{
+ spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+
+ cfg->prefixType = BOXOID; /* A type represented by its bounding box */
+ cfg->labelType = VOIDOID; /* We don't need node labels. */
+ cfg->leafType = BOXOID;
+ cfg->canReturnData = false;
+ cfg->longValuesOK = false;
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SP-GiST compress function for polygons
+ */
+Datum
+spg_poly_quad_compress(PG_FUNCTION_ARGS)
+{
+ POLYGON *polygon = PG_GETARG_POLYGON_P(0);
+ BOX *box;
+
+ box = (BOX *) palloc(sizeof(BOX));
+ *box = polygon->boundbox;
+
+ PG_RETURN_BOX_P(box);
+}
diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c
new file mode 100644
index 0000000..c336599
--- /dev/null
+++ b/src/backend/utils/adt/hbafuncs.c
@@ -0,0 +1,564 @@
+/*-------------------------------------------------------------------------
+ *
+ * hbafuncs.c
+ * Support functions for SQL views of authentication files.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/hbafuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/objectaddress.h"
+#include "common/ip.h"
+#include "funcapi.h"
+#include "libpq/hba.h"
+#include "miscadmin.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/guc.h"
+
+
+static ArrayType *get_hba_options(HbaLine *hba);
+static void fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc,
+ int lineno, HbaLine *hba, const char *err_msg);
+static void fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc);
+static void fill_ident_line(Tuplestorestate *tuple_store, TupleDesc tupdesc,
+ int lineno, IdentLine *ident, const char *err_msg);
+static void fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc);
+
+
+/*
+ * This macro specifies the maximum number of authentication options
+ * that are possible with any given authentication method that is supported.
+ * Currently LDAP supports 11, and there are 3 that are not dependent on
+ * the auth method here. It may not actually be possible to set all of them
+ * at the same time, but we'll set the macro value high enough to be
+ * conservative and avoid warnings from static analysis tools.
+ */
+#define MAX_HBA_OPTIONS 14
+
+/*
+ * Create a text array listing the options specified in the HBA line.
+ * Return NULL if no options are specified.
+ */
+static ArrayType *
+get_hba_options(HbaLine *hba)
+{
+ int noptions;
+ Datum options[MAX_HBA_OPTIONS];
+
+ noptions = 0;
+
+ if (hba->auth_method == uaGSS || hba->auth_method == uaSSPI)
+ {
+ if (hba->include_realm)
+ options[noptions++] =
+ CStringGetTextDatum("include_realm=true");
+
+ if (hba->krb_realm)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("krb_realm=%s", hba->krb_realm));
+ }
+
+ if (hba->usermap)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("map=%s", hba->usermap));
+
+ if (hba->clientcert != clientCertOff)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("clientcert=%s", (hba->clientcert == clientCertCA) ? "verify-ca" : "verify-full"));
+
+ if (hba->pamservice)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("pamservice=%s", hba->pamservice));
+
+ if (hba->auth_method == uaLDAP)
+ {
+ if (hba->ldapserver)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapserver=%s", hba->ldapserver));
+
+ if (hba->ldapport)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport));
+
+ if (hba->ldaptls)
+ options[noptions++] =
+ CStringGetTextDatum("ldaptls=true");
+
+ if (hba->ldapprefix)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapprefix=%s", hba->ldapprefix));
+
+ if (hba->ldapsuffix)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapsuffix=%s", hba->ldapsuffix));
+
+ if (hba->ldapbasedn)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapbasedn=%s", hba->ldapbasedn));
+
+ if (hba->ldapbinddn)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapbinddn=%s", hba->ldapbinddn));
+
+ if (hba->ldapbindpasswd)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapbindpasswd=%s",
+ hba->ldapbindpasswd));
+
+ if (hba->ldapsearchattribute)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapsearchattribute=%s",
+ hba->ldapsearchattribute));
+
+ if (hba->ldapsearchfilter)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapsearchfilter=%s",
+ hba->ldapsearchfilter));
+
+ if (hba->ldapscope)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("ldapscope=%d", hba->ldapscope));
+ }
+
+ if (hba->auth_method == uaRADIUS)
+ {
+ if (hba->radiusservers_s)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("radiusservers=%s", hba->radiusservers_s));
+
+ if (hba->radiussecrets_s)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("radiussecrets=%s", hba->radiussecrets_s));
+
+ if (hba->radiusidentifiers_s)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("radiusidentifiers=%s", hba->radiusidentifiers_s));
+
+ if (hba->radiusports_s)
+ options[noptions++] =
+ CStringGetTextDatum(psprintf("radiusports=%s", hba->radiusports_s));
+ }
+
+ /* If you add more options, consider increasing MAX_HBA_OPTIONS. */
+ Assert(noptions <= MAX_HBA_OPTIONS);
+
+ if (noptions > 0)
+ return construct_array(options, noptions, TEXTOID, -1, false, TYPALIGN_INT);
+ else
+ return NULL;
+}
+
+/* Number of columns in pg_hba_file_rules view */
+#define NUM_PG_HBA_FILE_RULES_ATTS 9
+
+/*
+ * fill_hba_line
+ * Build one row of pg_hba_file_rules view, add it to tuplestore.
+ *
+ * tuple_store: where to store data
+ * tupdesc: tuple descriptor for the view
+ * lineno: pg_hba.conf line number (must always be valid)
+ * hba: parsed line data (can be NULL, in which case err_msg should be set)
+ * err_msg: error message (NULL if none)
+ *
+ * Note: leaks memory, but we don't care since this is run in a short-lived
+ * memory context.
+ */
+static void
+fill_hba_line(Tuplestorestate *tuple_store, TupleDesc tupdesc,
+ int lineno, HbaLine *hba, const char *err_msg)
+{
+ Datum values[NUM_PG_HBA_FILE_RULES_ATTS];
+ bool nulls[NUM_PG_HBA_FILE_RULES_ATTS];
+ char buffer[NI_MAXHOST];
+ HeapTuple tuple;
+ int index;
+ ListCell *lc;
+ const char *typestr;
+ const char *addrstr;
+ const char *maskstr;
+ ArrayType *options;
+
+ Assert(tupdesc->natts == NUM_PG_HBA_FILE_RULES_ATTS);
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
+ index = 0;
+
+ /* line_number */
+ values[index++] = Int32GetDatum(lineno);
+
+ if (hba != NULL)
+ {
+ /* type */
+ /* Avoid a default: case so compiler will warn about missing cases */
+ typestr = NULL;
+ switch (hba->conntype)
+ {
+ case ctLocal:
+ typestr = "local";
+ break;
+ case ctHost:
+ typestr = "host";
+ break;
+ case ctHostSSL:
+ typestr = "hostssl";
+ break;
+ case ctHostNoSSL:
+ typestr = "hostnossl";
+ break;
+ case ctHostGSS:
+ typestr = "hostgssenc";
+ break;
+ case ctHostNoGSS:
+ typestr = "hostnogssenc";
+ break;
+ }
+ if (typestr)
+ values[index++] = CStringGetTextDatum(typestr);
+ else
+ nulls[index++] = true;
+
+ /* database */
+ if (hba->databases)
+ {
+ /*
+ * Flatten AuthToken list to string list. It might seem that we
+ * should re-quote any quoted tokens, but that has been rejected
+ * on the grounds that it makes it harder to compare the array
+ * elements to other system catalogs. That makes entries like
+ * "all" or "samerole" formally ambiguous ... but users who name
+ * databases/roles that way are inflicting their own pain.
+ */
+ List *names = NIL;
+
+ foreach(lc, hba->databases)
+ {
+ AuthToken *tok = lfirst(lc);
+
+ names = lappend(names, tok->string);
+ }
+ values[index++] = PointerGetDatum(strlist_to_textarray(names));
+ }
+ else
+ nulls[index++] = true;
+
+ /* user */
+ if (hba->roles)
+ {
+ /* Flatten AuthToken list to string list; see comment above */
+ List *roles = NIL;
+
+ foreach(lc, hba->roles)
+ {
+ AuthToken *tok = lfirst(lc);
+
+ roles = lappend(roles, tok->string);
+ }
+ values[index++] = PointerGetDatum(strlist_to_textarray(roles));
+ }
+ else
+ nulls[index++] = true;
+
+ /* address and netmask */
+ /* Avoid a default: case so compiler will warn about missing cases */
+ addrstr = maskstr = NULL;
+ switch (hba->ip_cmp_method)
+ {
+ case ipCmpMask:
+ if (hba->hostname)
+ {
+ addrstr = hba->hostname;
+ }
+ else
+ {
+ /*
+ * Note: if pg_getnameinfo_all fails, it'll set buffer to
+ * "???", which we want to return.
+ */
+ if (hba->addrlen > 0)
+ {
+ if (pg_getnameinfo_all(&hba->addr, hba->addrlen,
+ buffer, sizeof(buffer),
+ NULL, 0,
+ NI_NUMERICHOST) == 0)
+ clean_ipv6_addr(hba->addr.ss_family, buffer);
+ addrstr = pstrdup(buffer);
+ }
+ if (hba->masklen > 0)
+ {
+ if (pg_getnameinfo_all(&hba->mask, hba->masklen,
+ buffer, sizeof(buffer),
+ NULL, 0,
+ NI_NUMERICHOST) == 0)
+ clean_ipv6_addr(hba->mask.ss_family, buffer);
+ maskstr = pstrdup(buffer);
+ }
+ }
+ break;
+ case ipCmpAll:
+ addrstr = "all";
+ break;
+ case ipCmpSameHost:
+ addrstr = "samehost";
+ break;
+ case ipCmpSameNet:
+ addrstr = "samenet";
+ break;
+ }
+ if (addrstr)
+ values[index++] = CStringGetTextDatum(addrstr);
+ else
+ nulls[index++] = true;
+ if (maskstr)
+ values[index++] = CStringGetTextDatum(maskstr);
+ else
+ nulls[index++] = true;
+
+ /* auth_method */
+ values[index++] = CStringGetTextDatum(hba_authname(hba->auth_method));
+
+ /* options */
+ options = get_hba_options(hba);
+ if (options)
+ values[index++] = PointerGetDatum(options);
+ else
+ nulls[index++] = true;
+ }
+ else
+ {
+ /* no parsing result, so set relevant fields to nulls */
+ memset(&nulls[1], true, (NUM_PG_HBA_FILE_RULES_ATTS - 2) * sizeof(bool));
+ }
+
+ /* error */
+ if (err_msg)
+ values[NUM_PG_HBA_FILE_RULES_ATTS - 1] = CStringGetTextDatum(err_msg);
+ else
+ nulls[NUM_PG_HBA_FILE_RULES_ATTS - 1] = true;
+
+ tuple = heap_form_tuple(tupdesc, values, nulls);
+ tuplestore_puttuple(tuple_store, tuple);
+}
+
+/*
+ * fill_hba_view
+ * Read the pg_hba.conf file and fill the tuplestore with view records.
+ */
+static void
+fill_hba_view(Tuplestorestate *tuple_store, TupleDesc tupdesc)
+{
+ FILE *file;
+ List *hba_lines = NIL;
+ ListCell *line;
+ MemoryContext linecxt;
+ MemoryContext hbacxt;
+ MemoryContext oldcxt;
+
+ /*
+ * In the unlikely event that we can't open pg_hba.conf, we throw an
+ * error, rather than trying to report it via some sort of view entry.
+ * (Most other error conditions should result in a message in a view
+ * entry.)
+ */
+ file = AllocateFile(HbaFileName, "r");
+ if (file == NULL)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open configuration file \"%s\": %m",
+ HbaFileName)));
+
+ linecxt = tokenize_auth_file(HbaFileName, file, &hba_lines, DEBUG3);
+ FreeFile(file);
+
+ /* Now parse all the lines */
+ hbacxt = AllocSetContextCreate(CurrentMemoryContext,
+ "hba parser context",
+ ALLOCSET_SMALL_SIZES);
+ oldcxt = MemoryContextSwitchTo(hbacxt);
+ foreach(line, hba_lines)
+ {
+ TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line);
+ HbaLine *hbaline = NULL;
+
+ /* don't parse lines that already have errors */
+ if (tok_line->err_msg == NULL)
+ hbaline = parse_hba_line(tok_line, DEBUG3);
+
+ fill_hba_line(tuple_store, tupdesc, tok_line->line_num,
+ hbaline, tok_line->err_msg);
+ }
+
+ /* Free tokenizer memory */
+ MemoryContextDelete(linecxt);
+ /* Free parse_hba_line memory */
+ MemoryContextSwitchTo(oldcxt);
+ MemoryContextDelete(hbacxt);
+}
+
+/*
+ * pg_hba_file_rules
+ *
+ * SQL-accessible set-returning function to return all the entries in the
+ * pg_hba.conf file.
+ */
+Datum
+pg_hba_file_rules(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsi;
+
+ /*
+ * Build tuplestore to hold the result rows. We must use the Materialize
+ * mode to be safe against HBA file changes while the cursor is open. It's
+ * also more efficient than having to look up our current position in the
+ * parsed list every time.
+ */
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* Fill the tuplestore */
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ fill_hba_view(rsi->setResult, rsi->setDesc);
+
+ PG_RETURN_NULL();
+}
+
+/* Number of columns in pg_ident_file_mappings view */
+#define NUM_PG_IDENT_FILE_MAPPINGS_ATTS 5
+
+/*
+ * fill_ident_line: build one row of pg_ident_file_mappings view, add it to
+ * tuplestore
+ *
+ * tuple_store: where to store data
+ * tupdesc: tuple descriptor for the view
+ * lineno: pg_ident.conf line number (must always be valid)
+ * ident: parsed line data (can be NULL, in which case err_msg should be set)
+ * err_msg: error message (NULL if none)
+ *
+ * Note: leaks memory, but we don't care since this is run in a short-lived
+ * memory context.
+ */
+static void
+fill_ident_line(Tuplestorestate *tuple_store, TupleDesc tupdesc,
+ int lineno, IdentLine *ident, const char *err_msg)
+{
+ Datum values[NUM_PG_IDENT_FILE_MAPPINGS_ATTS];
+ bool nulls[NUM_PG_IDENT_FILE_MAPPINGS_ATTS];
+ HeapTuple tuple;
+ int index;
+
+ Assert(tupdesc->natts == NUM_PG_IDENT_FILE_MAPPINGS_ATTS);
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
+ index = 0;
+
+ /* line_number */
+ values[index++] = Int32GetDatum(lineno);
+
+ if (ident != NULL)
+ {
+ values[index++] = CStringGetTextDatum(ident->usermap);
+ values[index++] = CStringGetTextDatum(ident->ident_user);
+ values[index++] = CStringGetTextDatum(ident->pg_role);
+ }
+ else
+ {
+ /* no parsing result, so set relevant fields to nulls */
+ memset(&nulls[1], true, (NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 2) * sizeof(bool));
+ }
+
+ /* error */
+ if (err_msg)
+ values[NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 1] = CStringGetTextDatum(err_msg);
+ else
+ nulls[NUM_PG_IDENT_FILE_MAPPINGS_ATTS - 1] = true;
+
+ tuple = heap_form_tuple(tupdesc, values, nulls);
+ tuplestore_puttuple(tuple_store, tuple);
+}
+
+/*
+ * Read the pg_ident.conf file and fill the tuplestore with view records.
+ */
+static void
+fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc)
+{
+ FILE *file;
+ List *ident_lines = NIL;
+ ListCell *line;
+ MemoryContext linecxt;
+ MemoryContext identcxt;
+ MemoryContext oldcxt;
+
+ /*
+ * In the unlikely event that we can't open pg_ident.conf, we throw an
+ * error, rather than trying to report it via some sort of view entry.
+ * (Most other error conditions should result in a message in a view
+ * entry.)
+ */
+ file = AllocateFile(IdentFileName, "r");
+ if (file == NULL)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open usermap file \"%s\": %m",
+ IdentFileName)));
+
+ linecxt = tokenize_auth_file(IdentFileName, file, &ident_lines, DEBUG3);
+ FreeFile(file);
+
+ /* Now parse all the lines */
+ identcxt = AllocSetContextCreate(CurrentMemoryContext,
+ "ident parser context",
+ ALLOCSET_SMALL_SIZES);
+ oldcxt = MemoryContextSwitchTo(identcxt);
+ foreach(line, ident_lines)
+ {
+ TokenizedAuthLine *tok_line = (TokenizedAuthLine *) lfirst(line);
+ IdentLine *identline = NULL;
+
+ /* don't parse lines that already have errors */
+ if (tok_line->err_msg == NULL)
+ identline = parse_ident_line(tok_line, DEBUG3);
+
+ fill_ident_line(tuple_store, tupdesc, tok_line->line_num, identline,
+ tok_line->err_msg);
+ }
+
+ /* Free tokenizer memory */
+ MemoryContextDelete(linecxt);
+ /* Free parse_ident_line memory */
+ MemoryContextSwitchTo(oldcxt);
+ MemoryContextDelete(identcxt);
+}
+
+/*
+ * SQL-accessible SRF to return all the entries in the pg_ident.conf file.
+ */
+Datum
+pg_ident_file_mappings(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsi;
+
+ /*
+ * Build tuplestore to hold the result rows. We must use the Materialize
+ * mode to be safe against HBA file changes while the cursor is open. It's
+ * also more efficient than having to look up our current position in the
+ * parsed list every time.
+ */
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* Fill the tuplestore */
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ fill_ident_view(rsi->setResult, rsi->setDesc);
+
+ PG_RETURN_NULL();
+}
diff --git a/src/backend/utils/adt/inet_cidr_ntop.c b/src/backend/utils/adt/inet_cidr_ntop.c
new file mode 100644
index 0000000..5f74c05
--- /dev/null
+++ b/src/backend/utils/adt/inet_cidr_ntop.c
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * src/backend/utils/adt/inet_cidr_ntop.c
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static const char rcsid[] = "Id: inet_net_ntop.c,v 1.1.2.2 2004/03/09 09:17:27 marka Exp $";
+#endif
+
+#include "postgres.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "utils/builtins.h"
+#include "utils/inet.h"
+
+
+#ifdef SPRINTF_CHAR
+#define SPRINTF(x) strlen(sprintf/**/x)
+#else
+#define SPRINTF(x) ((size_t)sprintf x)
+#endif
+
+static char *inet_cidr_ntop_ipv4(const u_char *src, int bits,
+ char *dst, size_t size);
+static char *inet_cidr_ntop_ipv6(const u_char *src, int bits,
+ char *dst, size_t size);
+
+/*
+ * char *
+ * pg_inet_cidr_ntop(af, src, bits, dst, size)
+ * convert network number from network to presentation format.
+ * generates CIDR style result always.
+ * return:
+ * pointer to dst, or NULL if an error occurred (check errno).
+ * author:
+ * Paul Vixie (ISC), July 1996
+ */
+char *
+pg_inet_cidr_ntop(int af, const void *src, int bits, char *dst, size_t size)
+{
+ switch (af)
+ {
+ case PGSQL_AF_INET:
+ return inet_cidr_ntop_ipv4(src, bits, dst, size);
+ case PGSQL_AF_INET6:
+ return inet_cidr_ntop_ipv6(src, bits, dst, size);
+ default:
+ errno = EAFNOSUPPORT;
+ return NULL;
+ }
+}
+
+
+/*
+ * static char *
+ * inet_cidr_ntop_ipv4(src, bits, dst, size)
+ * convert IPv4 network number from network to presentation format.
+ * generates CIDR style result always.
+ * return:
+ * pointer to dst, or NULL if an error occurred (check errno).
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 0b11110000 in its fourth octet.
+ * author:
+ * Paul Vixie (ISC), July 1996
+ */
+static char *
+inet_cidr_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size)
+{
+ char *odst = dst;
+ char *t;
+ u_int m;
+ int b;
+
+ if (bits < 0 || bits > 32)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (bits == 0)
+ {
+ if (size < sizeof "0")
+ goto emsgsize;
+ *dst++ = '0';
+ size--;
+ *dst = '\0';
+ }
+
+ /* Format whole octets. */
+ for (b = bits / 8; b > 0; b--)
+ {
+ if (size <= sizeof "255.")
+ goto emsgsize;
+ t = dst;
+ dst += SPRINTF((dst, "%u", *src++));
+ if (b > 1)
+ {
+ *dst++ = '.';
+ *dst = '\0';
+ }
+ size -= (size_t) (dst - t);
+ }
+
+ /* Format partial octet. */
+ b = bits % 8;
+ if (b > 0)
+ {
+ if (size <= sizeof ".255")
+ goto emsgsize;
+ t = dst;
+ if (dst != odst)
+ *dst++ = '.';
+ m = ((1 << b) - 1) << (8 - b);
+ dst += SPRINTF((dst, "%u", *src & m));
+ size -= (size_t) (dst - t);
+ }
+
+ /* Format CIDR /width. */
+ if (size <= sizeof "/32")
+ goto emsgsize;
+ dst += SPRINTF((dst, "/%u", bits));
+ return odst;
+
+emsgsize:
+ errno = EMSGSIZE;
+ return NULL;
+}
+
+/*
+ * static char *
+ * inet_cidr_ntop_ipv6(src, bits, dst, size)
+ * convert IPv6 network number from network to presentation format.
+ * generates CIDR style result always. Picks the shortest representation
+ * unless the IP is really IPv4.
+ * always prints specified number of bits (bits).
+ * return:
+ * pointer to dst, or NULL if an error occurred (check errno).
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 0x11110000 in its fourth octet.
+ * author:
+ * Vadim Kogan (UCB), June 2001
+ * Original version (IPv4) by Paul Vixie (ISC), July 1996
+ */
+
+static char *
+inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
+{
+ u_int m;
+ int b;
+ int p;
+ int zero_s,
+ zero_l,
+ tmp_zero_s,
+ tmp_zero_l;
+ int i;
+ int is_ipv4 = 0;
+ unsigned char inbuf[16];
+ char outbuf[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+ char *cp;
+ int words;
+ u_char *s;
+
+ if (bits < 0 || bits > 128)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ cp = outbuf;
+
+ if (bits == 0)
+ {
+ *cp++ = ':';
+ *cp++ = ':';
+ *cp = '\0';
+ }
+ else
+ {
+ /* Copy src to private buffer. Zero host part. */
+ p = (bits + 7) / 8;
+ memcpy(inbuf, src, p);
+ memset(inbuf + p, 0, 16 - p);
+ b = bits % 8;
+ if (b != 0)
+ {
+ m = ((u_int) ~0) << (8 - b);
+ inbuf[p - 1] &= m;
+ }
+
+ s = inbuf;
+
+ /* how many words need to be displayed in output */
+ words = (bits + 15) / 16;
+ if (words == 1)
+ words = 2;
+
+ /* Find the longest substring of zero's */
+ zero_s = zero_l = tmp_zero_s = tmp_zero_l = 0;
+ for (i = 0; i < (words * 2); i += 2)
+ {
+ if ((s[i] | s[i + 1]) == 0)
+ {
+ if (tmp_zero_l == 0)
+ tmp_zero_s = i / 2;
+ tmp_zero_l++;
+ }
+ else
+ {
+ if (tmp_zero_l && zero_l < tmp_zero_l)
+ {
+ zero_s = tmp_zero_s;
+ zero_l = tmp_zero_l;
+ tmp_zero_l = 0;
+ }
+ }
+ }
+
+ if (tmp_zero_l && zero_l < tmp_zero_l)
+ {
+ zero_s = tmp_zero_s;
+ zero_l = tmp_zero_l;
+ }
+
+ if (zero_l != words && zero_s == 0 && ((zero_l == 6) ||
+ ((zero_l == 5 && s[10] == 0xff && s[11] == 0xff) ||
+ ((zero_l == 7 && s[14] != 0 && s[15] != 1)))))
+ is_ipv4 = 1;
+
+ /* Format whole words. */
+ for (p = 0; p < words; p++)
+ {
+ if (zero_l != 0 && p >= zero_s && p < zero_s + zero_l)
+ {
+ /* Time to skip some zeros */
+ if (p == zero_s)
+ *cp++ = ':';
+ if (p == words - 1)
+ *cp++ = ':';
+ s++;
+ s++;
+ continue;
+ }
+
+ if (is_ipv4 && p > 5)
+ {
+ *cp++ = (p == 6) ? ':' : '.';
+ cp += SPRINTF((cp, "%u", *s++));
+ /* we can potentially drop the last octet */
+ if (p != 7 || bits > 120)
+ {
+ *cp++ = '.';
+ cp += SPRINTF((cp, "%u", *s++));
+ }
+ }
+ else
+ {
+ if (cp != outbuf)
+ *cp++ = ':';
+ cp += SPRINTF((cp, "%x", *s * 256 + s[1]));
+ s += 2;
+ }
+ }
+ }
+ /* Format CIDR /width. */
+ (void) SPRINTF((cp, "/%u", bits));
+ if (strlen(outbuf) + 1 > size)
+ goto emsgsize;
+ strcpy(dst, outbuf);
+
+ return dst;
+
+emsgsize:
+ errno = EMSGSIZE;
+ return NULL;
+}
diff --git a/src/backend/utils/adt/inet_net_pton.c b/src/backend/utils/adt/inet_net_pton.c
new file mode 100644
index 0000000..d3221a1
--- /dev/null
+++ b/src/backend/utils/adt/inet_net_pton.c
@@ -0,0 +1,564 @@
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * src/backend/utils/adt/inet_net_pton.c
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static const char rcsid[] = "Id: inet_net_pton.c,v 1.4.2.3 2004/03/17 00:40:11 marka Exp $";
+#endif
+
+#include "postgres.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "utils/builtins.h" /* pgrminclude ignore */ /* needed on some
+ * platforms */
+#include "utils/inet.h"
+
+
+static int inet_net_pton_ipv4(const char *src, u_char *dst);
+static int inet_cidr_pton_ipv4(const char *src, u_char *dst, size_t size);
+static int inet_net_pton_ipv6(const char *src, u_char *dst);
+static int inet_cidr_pton_ipv6(const char *src, u_char *dst, size_t size);
+
+
+/*
+ * int
+ * pg_inet_net_pton(af, src, dst, size)
+ * convert network number from presentation to network format.
+ * accepts hex octets, hex strings, decimal octets, and /CIDR.
+ * "size" is in bytes and describes "dst".
+ * return:
+ * number of bits, either imputed classfully or specified with /CIDR,
+ * or -1 if some failure occurred (check errno). ENOENT means it was
+ * not a valid network specification.
+ * author:
+ * Paul Vixie (ISC), June 1996
+ *
+ * Changes:
+ * I added the inet_cidr_pton function (also from Paul) and changed
+ * the names to reflect their current use.
+ *
+ */
+int
+pg_inet_net_pton(int af, const char *src, void *dst, size_t size)
+{
+ switch (af)
+ {
+ case PGSQL_AF_INET:
+ return size == -1 ?
+ inet_net_pton_ipv4(src, dst) :
+ inet_cidr_pton_ipv4(src, dst, size);
+ case PGSQL_AF_INET6:
+ return size == -1 ?
+ inet_net_pton_ipv6(src, dst) :
+ inet_cidr_pton_ipv6(src, dst, size);
+ default:
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+}
+
+/*
+ * static int
+ * inet_cidr_pton_ipv4(src, dst, size)
+ * convert IPv4 network number from presentation to network format.
+ * accepts hex octets, hex strings, decimal octets, and /CIDR.
+ * "size" is in bytes and describes "dst".
+ * return:
+ * number of bits, either imputed classfully or specified with /CIDR,
+ * or -1 if some failure occurred (check errno). ENOENT means it was
+ * not an IPv4 network specification.
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 0b11110000 in its fourth octet.
+ * author:
+ * Paul Vixie (ISC), June 1996
+ */
+static int
+inet_cidr_pton_ipv4(const char *src, u_char *dst, size_t size)
+{
+ static const char xdigits[] = "0123456789abcdef";
+ static const char digits[] = "0123456789";
+ int n,
+ ch,
+ tmp = 0,
+ dirty,
+ bits;
+ const u_char *odst = dst;
+
+ ch = *src++;
+ if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
+ && isxdigit((unsigned char) src[1]))
+ {
+ /* Hexadecimal: Eat nybble string. */
+ if (size <= 0U)
+ goto emsgsize;
+ dirty = 0;
+ src++; /* skip x or X. */
+ while ((ch = *src++) != '\0' && isxdigit((unsigned char) ch))
+ {
+ if (isupper((unsigned char) ch))
+ ch = tolower((unsigned char) ch);
+ n = strchr(xdigits, ch) - xdigits;
+ assert(n >= 0 && n <= 15);
+ if (dirty == 0)
+ tmp = n;
+ else
+ tmp = (tmp << 4) | n;
+ if (++dirty == 2)
+ {
+ if (size-- <= 0U)
+ goto emsgsize;
+ *dst++ = (u_char) tmp;
+ dirty = 0;
+ }
+ }
+ if (dirty)
+ { /* Odd trailing nybble? */
+ if (size-- <= 0U)
+ goto emsgsize;
+ *dst++ = (u_char) (tmp << 4);
+ }
+ }
+ else if (isdigit((unsigned char) ch))
+ {
+ /* Decimal: eat dotted digit string. */
+ for (;;)
+ {
+ tmp = 0;
+ do
+ {
+ n = strchr(digits, ch) - digits;
+ assert(n >= 0 && n <= 9);
+ tmp *= 10;
+ tmp += n;
+ if (tmp > 255)
+ goto enoent;
+ } while ((ch = *src++) != '\0' &&
+ isdigit((unsigned char) ch));
+ if (size-- <= 0U)
+ goto emsgsize;
+ *dst++ = (u_char) tmp;
+ if (ch == '\0' || ch == '/')
+ break;
+ if (ch != '.')
+ goto enoent;
+ ch = *src++;
+ if (!isdigit((unsigned char) ch))
+ goto enoent;
+ }
+ }
+ else
+ goto enoent;
+
+ bits = -1;
+ if (ch == '/' && isdigit((unsigned char) src[0]) && dst > odst)
+ {
+ /* CIDR width specifier. Nothing can follow it. */
+ ch = *src++; /* Skip over the /. */
+ bits = 0;
+ do
+ {
+ n = strchr(digits, ch) - digits;
+ assert(n >= 0 && n <= 9);
+ bits *= 10;
+ bits += n;
+ } while ((ch = *src++) != '\0' && isdigit((unsigned char) ch));
+ if (ch != '\0')
+ goto enoent;
+ if (bits > 32)
+ goto emsgsize;
+ }
+
+ /* Fiery death and destruction unless we prefetched EOS. */
+ if (ch != '\0')
+ goto enoent;
+
+ /* If nothing was written to the destination, we found no address. */
+ if (dst == odst)
+ goto enoent;
+ /* If no CIDR spec was given, infer width from net class. */
+ if (bits == -1)
+ {
+ if (*odst >= 240) /* Class E */
+ bits = 32;
+ else if (*odst >= 224) /* Class D */
+ bits = 8;
+ else if (*odst >= 192) /* Class C */
+ bits = 24;
+ else if (*odst >= 128) /* Class B */
+ bits = 16;
+ else
+ /* Class A */
+ bits = 8;
+ /* If imputed mask is narrower than specified octets, widen. */
+ if (bits < ((dst - odst) * 8))
+ bits = (dst - odst) * 8;
+
+ /*
+ * If there are no additional bits specified for a class D address
+ * adjust bits to 4.
+ */
+ if (bits == 8 && *odst == 224)
+ bits = 4;
+ }
+ /* Extend network to cover the actual mask. */
+ while (bits > ((dst - odst) * 8))
+ {
+ if (size-- <= 0U)
+ goto emsgsize;
+ *dst++ = '\0';
+ }
+ return bits;
+
+enoent:
+ errno = ENOENT;
+ return -1;
+
+emsgsize:
+ errno = EMSGSIZE;
+ return -1;
+}
+
+/*
+ * int
+ * inet_net_pton_ipv4(af, src, dst, *bits)
+ * convert network address from presentation to network format.
+ * accepts inet_pton()'s input for this "af" plus trailing "/CIDR".
+ * "dst" is assumed large enough for its "af". "bits" is set to the
+ * /CIDR prefix length, which can have defaults (like /32 for IPv4).
+ * return:
+ * -1 if an error occurred (inspect errno; ENOENT means bad format).
+ * 0 if successful conversion occurred.
+ * note:
+ * 192.5.5.1/28 has a nonzero host part, which means it isn't a network
+ * as called for by inet_cidr_pton() but it can be a host address with
+ * an included netmask.
+ * author:
+ * Paul Vixie (ISC), October 1998
+ */
+static int
+inet_net_pton_ipv4(const char *src, u_char *dst)
+{
+ static const char digits[] = "0123456789";
+ const u_char *odst = dst;
+ int n,
+ ch,
+ tmp,
+ bits;
+ size_t size = 4;
+
+ /* Get the mantissa. */
+ while (ch = *src++, isdigit((unsigned char) ch))
+ {
+ tmp = 0;
+ do
+ {
+ n = strchr(digits, ch) - digits;
+ assert(n >= 0 && n <= 9);
+ tmp *= 10;
+ tmp += n;
+ if (tmp > 255)
+ goto enoent;
+ } while ((ch = *src++) != '\0' && isdigit((unsigned char) ch));
+ if (size-- == 0)
+ goto emsgsize;
+ *dst++ = (u_char) tmp;
+ if (ch == '\0' || ch == '/')
+ break;
+ if (ch != '.')
+ goto enoent;
+ }
+
+ /* Get the prefix length if any. */
+ bits = -1;
+ if (ch == '/' && isdigit((unsigned char) src[0]) && dst > odst)
+ {
+ /* CIDR width specifier. Nothing can follow it. */
+ ch = *src++; /* Skip over the /. */
+ bits = 0;
+ do
+ {
+ n = strchr(digits, ch) - digits;
+ assert(n >= 0 && n <= 9);
+ bits *= 10;
+ bits += n;
+ } while ((ch = *src++) != '\0' && isdigit((unsigned char) ch));
+ if (ch != '\0')
+ goto enoent;
+ if (bits > 32)
+ goto emsgsize;
+ }
+
+ /* Fiery death and destruction unless we prefetched EOS. */
+ if (ch != '\0')
+ goto enoent;
+
+ /* Prefix length can default to /32 only if all four octets spec'd. */
+ if (bits == -1)
+ {
+ if (dst - odst == 4)
+ bits = 32;
+ else
+ goto enoent;
+ }
+
+ /* If nothing was written to the destination, we found no address. */
+ if (dst == odst)
+ goto enoent;
+
+ /* If prefix length overspecifies mantissa, life is bad. */
+ if ((bits / 8) > (dst - odst))
+ goto enoent;
+
+ /* Extend address to four octets. */
+ while (size-- > 0)
+ *dst++ = 0;
+
+ return bits;
+
+enoent:
+ errno = ENOENT;
+ return -1;
+
+emsgsize:
+ errno = EMSGSIZE;
+ return -1;
+}
+
+static int
+getbits(const char *src, int *bitsp)
+{
+ static const char digits[] = "0123456789";
+ int n;
+ int val;
+ char ch;
+
+ val = 0;
+ n = 0;
+ while ((ch = *src++) != '\0')
+ {
+ const char *pch;
+
+ pch = strchr(digits, ch);
+ if (pch != NULL)
+ {
+ if (n++ != 0 && val == 0) /* no leading zeros */
+ return 0;
+ val *= 10;
+ val += (pch - digits);
+ if (val > 128) /* range */
+ return 0;
+ continue;
+ }
+ return 0;
+ }
+ if (n == 0)
+ return 0;
+ *bitsp = val;
+ return 1;
+}
+
+static int
+getv4(const char *src, u_char *dst, int *bitsp)
+{
+ static const char digits[] = "0123456789";
+ u_char *odst = dst;
+ int n;
+ u_int val;
+ char ch;
+
+ val = 0;
+ n = 0;
+ while ((ch = *src++) != '\0')
+ {
+ const char *pch;
+
+ pch = strchr(digits, ch);
+ if (pch != NULL)
+ {
+ if (n++ != 0 && val == 0) /* no leading zeros */
+ return 0;
+ val *= 10;
+ val += (pch - digits);
+ if (val > 255) /* range */
+ return 0;
+ continue;
+ }
+ if (ch == '.' || ch == '/')
+ {
+ if (dst - odst > 3) /* too many octets? */
+ return 0;
+ *dst++ = val;
+ if (ch == '/')
+ return getbits(src, bitsp);
+ val = 0;
+ n = 0;
+ continue;
+ }
+ return 0;
+ }
+ if (n == 0)
+ return 0;
+ if (dst - odst > 3) /* too many octets? */
+ return 0;
+ *dst++ = val;
+ return 1;
+}
+
+static int
+inet_net_pton_ipv6(const char *src, u_char *dst)
+{
+ return inet_cidr_pton_ipv6(src, dst, 16);
+}
+
+#define NS_IN6ADDRSZ 16
+#define NS_INT16SZ 2
+#define NS_INADDRSZ 4
+
+static int
+inet_cidr_pton_ipv6(const char *src, u_char *dst, size_t size)
+{
+ static const char xdigits_l[] = "0123456789abcdef",
+ xdigits_u[] = "0123456789ABCDEF";
+ u_char tmp[NS_IN6ADDRSZ],
+ *tp,
+ *endp,
+ *colonp;
+ const char *xdigits,
+ *curtok;
+ int ch,
+ saw_xdigit;
+ u_int val;
+ int digits;
+ int bits;
+
+ if (size < NS_IN6ADDRSZ)
+ goto emsgsize;
+
+ memset((tp = tmp), '\0', NS_IN6ADDRSZ);
+ endp = tp + NS_IN6ADDRSZ;
+ colonp = NULL;
+ /* Leading :: requires some special handling. */
+ if (*src == ':')
+ if (*++src != ':')
+ goto enoent;
+ curtok = src;
+ saw_xdigit = 0;
+ val = 0;
+ digits = 0;
+ bits = -1;
+ while ((ch = *src++) != '\0')
+ {
+ const char *pch;
+
+ if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
+ pch = strchr((xdigits = xdigits_u), ch);
+ if (pch != NULL)
+ {
+ val <<= 4;
+ val |= (pch - xdigits);
+ if (++digits > 4)
+ goto enoent;
+ saw_xdigit = 1;
+ continue;
+ }
+ if (ch == ':')
+ {
+ curtok = src;
+ if (!saw_xdigit)
+ {
+ if (colonp)
+ goto enoent;
+ colonp = tp;
+ continue;
+ }
+ else if (*src == '\0')
+ goto enoent;
+ if (tp + NS_INT16SZ > endp)
+ goto enoent;
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ saw_xdigit = 0;
+ digits = 0;
+ val = 0;
+ continue;
+ }
+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
+ getv4(curtok, tp, &bits) > 0)
+ {
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ break; /* '\0' was seen by inet_pton4(). */
+ }
+ if (ch == '/' && getbits(src, &bits) > 0)
+ break;
+ goto enoent;
+ }
+ if (saw_xdigit)
+ {
+ if (tp + NS_INT16SZ > endp)
+ goto enoent;
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ }
+ if (bits == -1)
+ bits = 128;
+
+ endp = tmp + 16;
+
+ if (colonp != NULL)
+ {
+ /*
+ * Since some memmove()'s erroneously fail to handle overlapping
+ * regions, we'll do the shift by hand.
+ */
+ const int n = tp - colonp;
+ int i;
+
+ if (tp == endp)
+ goto enoent;
+ for (i = 1; i <= n; i++)
+ {
+ endp[-i] = colonp[n - i];
+ colonp[n - i] = 0;
+ }
+ tp = endp;
+ }
+ if (tp != endp)
+ goto enoent;
+
+ /*
+ * Copy out the result.
+ */
+ memcpy(dst, tmp, NS_IN6ADDRSZ);
+
+ return bits;
+
+enoent:
+ errno = ENOENT;
+ return -1;
+
+emsgsize:
+ errno = EMSGSIZE;
+ return -1;
+}
diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c
new file mode 100644
index 0000000..ff1f46e
--- /dev/null
+++ b/src/backend/utils/adt/int.c
@@ -0,0 +1,1648 @@
+/*-------------------------------------------------------------------------
+ *
+ * int.c
+ * Functions for the built-in integer types (except int8).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/int.c
+ *
+ *-------------------------------------------------------------------------
+ */
+/*
+ * OLD COMMENTS
+ * I/O routines:
+ * int2in, int2out, int2recv, int2send
+ * int4in, int4out, int4recv, int4send
+ * int2vectorin, int2vectorout, int2vectorrecv, int2vectorsend
+ * Boolean operators:
+ * inteq, intne, intlt, intle, intgt, intge
+ * Arithmetic operators:
+ * intpl, intmi, int4mul, intdiv
+ *
+ * Arithmetic operators:
+ * intmod
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <math.h>
+
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "optimizer/optimizer.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+
+#define Int2VectorSize(n) (offsetof(int2vector, values) + (n) * sizeof(int16))
+
+typedef struct
+{
+ int32 current;
+ int32 finish;
+ int32 step;
+} generate_series_fctx;
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+/*
+ * int2in - converts "num" to short
+ */
+Datum
+int2in(PG_FUNCTION_ARGS)
+{
+ char *num = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_INT16(pg_strtoint16(num));
+}
+
+/*
+ * int2out - converts short to "num"
+ */
+Datum
+int2out(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ char *result = (char *) palloc(7); /* sign, 5 digits, '\0' */
+
+ pg_itoa(arg1, result);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * int2recv - converts external binary format to int2
+ */
+Datum
+int2recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_INT16((int16) pq_getmsgint(buf, sizeof(int16)));
+}
+
+/*
+ * int2send - converts int2 to binary format
+ */
+Datum
+int2send(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint16(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * construct int2vector given a raw array of int2s
+ *
+ * If int2s is NULL then caller must fill values[] afterward
+ */
+int2vector *
+buildint2vector(const int16 *int2s, int n)
+{
+ int2vector *result;
+
+ result = (int2vector *) palloc0(Int2VectorSize(n));
+
+ if (n > 0 && int2s)
+ memcpy(result->values, int2s, n * sizeof(int16));
+
+ /*
+ * Attach standard array header. For historical reasons, we set the index
+ * lower bound to 0 not 1.
+ */
+ SET_VARSIZE(result, Int2VectorSize(n));
+ result->ndim = 1;
+ result->dataoffset = 0; /* never any nulls */
+ result->elemtype = INT2OID;
+ result->dim1 = n;
+ result->lbound1 = 0;
+
+ return result;
+}
+
+/*
+ * int2vectorin - converts "num num ..." to internal form
+ */
+Datum
+int2vectorin(PG_FUNCTION_ARGS)
+{
+ char *intString = PG_GETARG_CSTRING(0);
+ int2vector *result;
+ int nalloc;
+ int n;
+
+ nalloc = 32; /* arbitrary initial size guess */
+ result = (int2vector *) palloc0(Int2VectorSize(nalloc));
+
+ for (n = 0;; n++)
+ {
+ long l;
+ char *endp;
+
+ while (*intString && isspace((unsigned char) *intString))
+ intString++;
+ if (*intString == '\0')
+ break;
+
+ if (n >= nalloc)
+ {
+ nalloc *= 2;
+ result = (int2vector *) repalloc(result, Int2VectorSize(nalloc));
+ }
+
+ errno = 0;
+ l = strtol(intString, &endp, 10);
+
+ if (intString == endp)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "smallint", intString)));
+
+ if (errno == ERANGE || l < SHRT_MIN || l > SHRT_MAX)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s", intString,
+ "smallint")));
+
+ if (*endp && *endp != ' ')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "smallint", intString)));
+
+ result->values[n] = l;
+ intString = endp;
+ }
+
+ SET_VARSIZE(result, Int2VectorSize(n));
+ result->ndim = 1;
+ result->dataoffset = 0; /* never any nulls */
+ result->elemtype = INT2OID;
+ result->dim1 = n;
+ result->lbound1 = 0;
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * int2vectorout - converts internal form to "num num ..."
+ */
+Datum
+int2vectorout(PG_FUNCTION_ARGS)
+{
+ int2vector *int2Array = (int2vector *) PG_GETARG_POINTER(0);
+ int num,
+ nnums = int2Array->dim1;
+ char *rp;
+ char *result;
+
+ /* assumes sign, 5 digits, ' ' */
+ rp = result = (char *) palloc(nnums * 7 + 1);
+ for (num = 0; num < nnums; num++)
+ {
+ if (num != 0)
+ *rp++ = ' ';
+ rp += pg_itoa(int2Array->values[num], rp);
+ }
+ *rp = '\0';
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * int2vectorrecv - converts external binary format to int2vector
+ */
+Datum
+int2vectorrecv(PG_FUNCTION_ARGS)
+{
+ LOCAL_FCINFO(locfcinfo, 3);
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ int2vector *result;
+
+ /*
+ * Normally one would call array_recv() using DirectFunctionCall3, but
+ * that does not work since array_recv wants to cache some data using
+ * fcinfo->flinfo->fn_extra. So we need to pass it our own flinfo
+ * parameter.
+ */
+ InitFunctionCallInfoData(*locfcinfo, fcinfo->flinfo, 3,
+ InvalidOid, NULL, NULL);
+
+ locfcinfo->args[0].value = PointerGetDatum(buf);
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = ObjectIdGetDatum(INT2OID);
+ locfcinfo->args[1].isnull = false;
+ locfcinfo->args[2].value = Int32GetDatum(-1);
+ locfcinfo->args[2].isnull = false;
+
+ result = (int2vector *) DatumGetPointer(array_recv(locfcinfo));
+
+ Assert(!locfcinfo->isnull);
+
+ /* sanity checks: int2vector must be 1-D, 0-based, no nulls */
+ if (ARR_NDIM(result) != 1 ||
+ ARR_HASNULL(result) ||
+ ARR_ELEMTYPE(result) != INT2OID ||
+ ARR_LBOUND(result)[0] != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid int2vector data")));
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * int2vectorsend - converts int2vector to binary format
+ */
+Datum
+int2vectorsend(PG_FUNCTION_ARGS)
+{
+ return array_send(fcinfo);
+}
+
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+/*
+ * int4in - converts "num" to int4
+ */
+Datum
+int4in(PG_FUNCTION_ARGS)
+{
+ char *num = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_INT32(pg_strtoint32(num));
+}
+
+/*
+ * int4out - converts int4 to "num"
+ */
+Datum
+int4out(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ char *result = (char *) palloc(12); /* sign, 10 digits, '\0' */
+
+ pg_ltoa(arg1, result);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * int4recv - converts external binary format to int4
+ */
+Datum
+int4recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_INT32((int32) pq_getmsgint(buf, sizeof(int32)));
+}
+
+/*
+ * int4send - converts int4 to binary format
+ */
+Datum
+int4send(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * ===================
+ * CONVERSION ROUTINES
+ * ===================
+ */
+
+Datum
+i2toi4(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+
+ PG_RETURN_INT32((int32) arg1);
+}
+
+Datum
+i4toi2(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+
+ if (unlikely(arg1 < SHRT_MIN) || unlikely(arg1 > SHRT_MAX))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ PG_RETURN_INT16((int16) arg1);
+}
+
+/* Cast int4 -> bool */
+Datum
+int4_bool(PG_FUNCTION_ARGS)
+{
+ if (PG_GETARG_INT32(0) == 0)
+ PG_RETURN_BOOL(false);
+ else
+ PG_RETURN_BOOL(true);
+}
+
+/* Cast bool -> int4 */
+Datum
+bool_int4(PG_FUNCTION_ARGS)
+{
+ if (PG_GETARG_BOOL(0) == false)
+ PG_RETURN_INT32(0);
+ else
+ PG_RETURN_INT32(1);
+}
+
+/*
+ * ============================
+ * COMPARISON OPERATOR ROUTINES
+ * ============================
+ */
+
+/*
+ * inteq - returns 1 iff arg1 == arg2
+ * intne - returns 1 iff arg1 != arg2
+ * intlt - returns 1 iff arg1 < arg2
+ * intle - returns 1 iff arg1 <= arg2
+ * intgt - returns 1 iff arg1 > arg2
+ * intge - returns 1 iff arg1 >= arg2
+ */
+
+Datum
+int4eq(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+int4ne(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+int4lt(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+int4le(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+int4gt(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+int4ge(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+Datum
+int2eq(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+int2ne(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+int2lt(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+int2le(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+int2gt(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+int2ge(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+Datum
+int24eq(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+int24ne(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+int24lt(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+int24le(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+int24gt(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+int24ge(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+Datum
+int42eq(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+int42ne(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+int42lt(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+int42le(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+int42gt(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+int42ge(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+
+/*----------------------------------------------------------
+ * in_range functions for int4 and int2,
+ * including cross-data-type comparisons.
+ *
+ * Note: we provide separate intN_int8 functions for performance
+ * reasons. This forces also providing intN_int2, else cases with a
+ * smallint offset value would fail to resolve which function to use.
+ * But that's an unlikely situation, so don't duplicate code for it.
+ *---------------------------------------------------------*/
+
+Datum
+in_range_int4_int4(PG_FUNCTION_ARGS)
+{
+ int32 val = PG_GETARG_INT32(0);
+ int32 base = PG_GETARG_INT32(1);
+ int32 offset = PG_GETARG_INT32(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ int32 sum;
+
+ if (offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ if (sub)
+ offset = -offset; /* cannot overflow */
+
+ if (unlikely(pg_add_s32_overflow(base, offset, &sum)))
+ {
+ /*
+ * If sub is false, the true sum is surely more than val, so correct
+ * answer is the same as "less". If sub is true, the true sum is
+ * surely less than val, so the answer is "!less".
+ */
+ PG_RETURN_BOOL(sub ? !less : less);
+ }
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+Datum
+in_range_int4_int2(PG_FUNCTION_ARGS)
+{
+ /* Doesn't seem worth duplicating code for, so just invoke int4_int4 */
+ return DirectFunctionCall5(in_range_int4_int4,
+ PG_GETARG_DATUM(0),
+ PG_GETARG_DATUM(1),
+ Int32GetDatum((int32) PG_GETARG_INT16(2)),
+ PG_GETARG_DATUM(3),
+ PG_GETARG_DATUM(4));
+}
+
+Datum
+in_range_int4_int8(PG_FUNCTION_ARGS)
+{
+ /* We must do all the math in int64 */
+ int64 val = (int64) PG_GETARG_INT32(0);
+ int64 base = (int64) PG_GETARG_INT32(1);
+ int64 offset = PG_GETARG_INT64(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ int64 sum;
+
+ if (offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ if (sub)
+ offset = -offset; /* cannot overflow */
+
+ if (unlikely(pg_add_s64_overflow(base, offset, &sum)))
+ {
+ /*
+ * If sub is false, the true sum is surely more than val, so correct
+ * answer is the same as "less". If sub is true, the true sum is
+ * surely less than val, so the answer is "!less".
+ */
+ PG_RETURN_BOOL(sub ? !less : less);
+ }
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+Datum
+in_range_int2_int4(PG_FUNCTION_ARGS)
+{
+ /* We must do all the math in int32 */
+ int32 val = (int32) PG_GETARG_INT16(0);
+ int32 base = (int32) PG_GETARG_INT16(1);
+ int32 offset = PG_GETARG_INT32(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ int32 sum;
+
+ if (offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ if (sub)
+ offset = -offset; /* cannot overflow */
+
+ if (unlikely(pg_add_s32_overflow(base, offset, &sum)))
+ {
+ /*
+ * If sub is false, the true sum is surely more than val, so correct
+ * answer is the same as "less". If sub is true, the true sum is
+ * surely less than val, so the answer is "!less".
+ */
+ PG_RETURN_BOOL(sub ? !less : less);
+ }
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+Datum
+in_range_int2_int2(PG_FUNCTION_ARGS)
+{
+ /* Doesn't seem worth duplicating code for, so just invoke int2_int4 */
+ return DirectFunctionCall5(in_range_int2_int4,
+ PG_GETARG_DATUM(0),
+ PG_GETARG_DATUM(1),
+ Int32GetDatum((int32) PG_GETARG_INT16(2)),
+ PG_GETARG_DATUM(3),
+ PG_GETARG_DATUM(4));
+}
+
+Datum
+in_range_int2_int8(PG_FUNCTION_ARGS)
+{
+ /* Doesn't seem worth duplicating code for, so just invoke int4_int8 */
+ return DirectFunctionCall5(in_range_int4_int8,
+ Int32GetDatum((int32) PG_GETARG_INT16(0)),
+ Int32GetDatum((int32) PG_GETARG_INT16(1)),
+ PG_GETARG_DATUM(2),
+ PG_GETARG_DATUM(3),
+ PG_GETARG_DATUM(4));
+}
+
+
+/*
+ * int[24]pl - returns arg1 + arg2
+ * int[24]mi - returns arg1 - arg2
+ * int[24]mul - returns arg1 * arg2
+ * int[24]div - returns arg1 / arg2
+ */
+
+Datum
+int4um(PG_FUNCTION_ARGS)
+{
+ int32 arg = PG_GETARG_INT32(0);
+
+ if (unlikely(arg == PG_INT32_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(-arg);
+}
+
+Datum
+int4up(PG_FUNCTION_ARGS)
+{
+ int32 arg = PG_GETARG_INT32(0);
+
+ PG_RETURN_INT32(arg);
+}
+
+Datum
+int4pl(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_add_s32_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int4mi(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_sub_s32_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int4mul(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_mul_s32_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int4div(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (arg2 == 0)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * INT_MIN / -1 is problematic, since the result can't be represented on a
+ * two's-complement machine. Some machines produce INT_MIN, some produce
+ * zero, some throw an exception. We can dodge the problem by recognizing
+ * that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT32_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ result = -arg1;
+ PG_RETURN_INT32(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int4inc(PG_FUNCTION_ARGS)
+{
+ int32 arg = PG_GETARG_INT32(0);
+ int32 result;
+
+ if (unlikely(pg_add_s32_overflow(arg, 1, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int2um(PG_FUNCTION_ARGS)
+{
+ int16 arg = PG_GETARG_INT16(0);
+
+ if (unlikely(arg == PG_INT16_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+ PG_RETURN_INT16(-arg);
+}
+
+Datum
+int2up(PG_FUNCTION_ARGS)
+{
+ int16 arg = PG_GETARG_INT16(0);
+
+ PG_RETURN_INT16(arg);
+}
+
+Datum
+int2pl(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int16 result;
+
+ if (unlikely(pg_add_s16_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+ PG_RETURN_INT16(result);
+}
+
+Datum
+int2mi(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int16 result;
+
+ if (unlikely(pg_sub_s16_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+ PG_RETURN_INT16(result);
+}
+
+Datum
+int2mul(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int16 result;
+
+ if (unlikely(pg_mul_s16_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ PG_RETURN_INT16(result);
+}
+
+Datum
+int2div(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int16 result;
+
+ if (arg2 == 0)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * SHRT_MIN / -1 is problematic, since the result can't be represented on
+ * a two's-complement machine. Some machines produce SHRT_MIN, some
+ * produce zero, some throw an exception. We can dodge the problem by
+ * recognizing that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT16_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+ result = -arg1;
+ PG_RETURN_INT16(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT16(result);
+}
+
+Datum
+int24pl(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_add_s32_overflow((int32) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int24mi(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_sub_s32_overflow((int32) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int24mul(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ if (unlikely(pg_mul_s32_overflow((int32) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int24div(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /* No overflow is possible */
+ PG_RETURN_INT32((int32) arg1 / arg2);
+}
+
+Datum
+int42pl(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int32 result;
+
+ if (unlikely(pg_add_s32_overflow(arg1, (int32) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int42mi(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int32 result;
+
+ if (unlikely(pg_sub_s32_overflow(arg1, (int32) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int42mul(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int32 result;
+
+ if (unlikely(pg_mul_s32_overflow(arg1, (int32) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int42div(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int32 result;
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * INT_MIN / -1 is problematic, since the result can't be represented on a
+ * two's-complement machine. Some machines produce INT_MIN, some produce
+ * zero, some throw an exception. We can dodge the problem by recognizing
+ * that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT32_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ result = -arg1;
+ PG_RETURN_INT32(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int4mod(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * Some machines throw a floating-point exception for INT_MIN % -1, which
+ * is a bit silly since the correct answer is perfectly well-defined,
+ * namely zero.
+ */
+ if (arg2 == -1)
+ PG_RETURN_INT32(0);
+
+ /* No overflow is possible */
+
+ PG_RETURN_INT32(arg1 % arg2);
+}
+
+Datum
+int2mod(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * Some machines throw a floating-point exception for INT_MIN % -1, which
+ * is a bit silly since the correct answer is perfectly well-defined,
+ * namely zero. (It's not clear this ever happens when dealing with
+ * int16, but we might as well have the test for safety.)
+ */
+ if (arg2 == -1)
+ PG_RETURN_INT16(0);
+
+ /* No overflow is possible */
+
+ PG_RETURN_INT16(arg1 % arg2);
+}
+
+
+/* int[24]abs()
+ * Absolute value
+ */
+Datum
+int4abs(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 result;
+
+ if (unlikely(arg1 == PG_INT32_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ result = (arg1 < 0) ? -arg1 : arg1;
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int2abs(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 result;
+
+ if (unlikely(arg1 == PG_INT16_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+ result = (arg1 < 0) ? -arg1 : arg1;
+ PG_RETURN_INT16(result);
+}
+
+/*
+ * Greatest Common Divisor
+ *
+ * Returns the largest positive integer that exactly divides both inputs.
+ * Special cases:
+ * - gcd(x, 0) = gcd(0, x) = abs(x)
+ * because 0 is divisible by anything
+ * - gcd(0, 0) = 0
+ * complies with the previous definition and is a common convention
+ *
+ * Special care must be taken if either input is INT_MIN --- gcd(0, INT_MIN),
+ * gcd(INT_MIN, 0) and gcd(INT_MIN, INT_MIN) are all equal to abs(INT_MIN),
+ * which cannot be represented as a 32-bit signed integer.
+ */
+static int32
+int4gcd_internal(int32 arg1, int32 arg2)
+{
+ int32 swap;
+ int32 a1,
+ a2;
+
+ /*
+ * Put the greater absolute value in arg1.
+ *
+ * This would happen automatically in the loop below, but avoids an
+ * expensive modulo operation, and simplifies the special-case handling
+ * for INT_MIN below.
+ *
+ * We do this in negative space in order to handle INT_MIN.
+ */
+ a1 = (arg1 < 0) ? arg1 : -arg1;
+ a2 = (arg2 < 0) ? arg2 : -arg2;
+ if (a1 > a2)
+ {
+ swap = arg1;
+ arg1 = arg2;
+ arg2 = swap;
+ }
+
+ /* Special care needs to be taken with INT_MIN. See comments above. */
+ if (arg1 == PG_INT32_MIN)
+ {
+ if (arg2 == 0 || arg2 == PG_INT32_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ /*
+ * Some machines throw a floating-point exception for INT_MIN % -1,
+ * which is a bit silly since the correct answer is perfectly
+ * well-defined, namely zero. Guard against this and just return the
+ * result, gcd(INT_MIN, -1) = 1.
+ */
+ if (arg2 == -1)
+ return 1;
+ }
+
+ /* Use the Euclidean algorithm to find the GCD */
+ while (arg2 != 0)
+ {
+ swap = arg2;
+ arg2 = arg1 % arg2;
+ arg1 = swap;
+ }
+
+ /*
+ * Make sure the result is positive. (We know we don't have INT_MIN
+ * anymore).
+ */
+ if (arg1 < 0)
+ arg1 = -arg1;
+
+ return arg1;
+}
+
+Datum
+int4gcd(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 result;
+
+ result = int4gcd_internal(arg1, arg2);
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * Least Common Multiple
+ */
+Datum
+int4lcm(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int32 gcd;
+ int32 result;
+
+ /*
+ * Handle lcm(x, 0) = lcm(0, x) = 0 as a special case. This prevents a
+ * division-by-zero error below when x is zero, and an overflow error from
+ * the GCD computation when x = INT_MIN.
+ */
+ if (arg1 == 0 || arg2 == 0)
+ PG_RETURN_INT32(0);
+
+ /* lcm(x, y) = abs(x / gcd(x, y) * y) */
+ gcd = int4gcd_internal(arg1, arg2);
+ arg1 = arg1 / gcd;
+
+ if (unlikely(pg_mul_s32_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ /* If the result is INT_MIN, it cannot be represented. */
+ if (unlikely(result == PG_INT32_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ if (result < 0)
+ result = -result;
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+int2larger(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16((arg1 > arg2) ? arg1 : arg2);
+}
+
+Datum
+int2smaller(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16((arg1 < arg2) ? arg1 : arg2);
+}
+
+Datum
+int4larger(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32((arg1 > arg2) ? arg1 : arg2);
+}
+
+Datum
+int4smaller(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);
+}
+
+/*
+ * Bit-pushing operators
+ *
+ * int[24]and - returns arg1 & arg2
+ * int[24]or - returns arg1 | arg2
+ * int[24]xor - returns arg1 # arg2
+ * int[24]not - returns ~arg1
+ * int[24]shl - returns arg1 << arg2
+ * int[24]shr - returns arg1 >> arg2
+ */
+
+Datum
+int4and(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 & arg2);
+}
+
+Datum
+int4or(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 | arg2);
+}
+
+Datum
+int4xor(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 ^ arg2);
+}
+
+Datum
+int4shl(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 << arg2);
+}
+
+Datum
+int4shr(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 >> arg2);
+}
+
+Datum
+int4not(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+
+ PG_RETURN_INT32(~arg1);
+}
+
+Datum
+int2and(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 & arg2);
+}
+
+Datum
+int2or(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 | arg2);
+}
+
+Datum
+int2xor(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 ^ arg2);
+}
+
+Datum
+int2not(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+
+ PG_RETURN_INT16(~arg1);
+}
+
+
+Datum
+int2shl(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT16(arg1 << arg2);
+}
+
+Datum
+int2shr(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT16(arg1 >> arg2);
+}
+
+/*
+ * non-persistent numeric series generator
+ */
+Datum
+generate_series_int4(PG_FUNCTION_ARGS)
+{
+ return generate_series_step_int4(fcinfo);
+}
+
+Datum
+generate_series_step_int4(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ generate_series_fctx *fctx;
+ int32 result;
+ MemoryContext oldcontext;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ int32 start = PG_GETARG_INT32(0);
+ int32 finish = PG_GETARG_INT32(1);
+ int32 step = 1;
+
+ /* see if we were given an explicit step size */
+ if (PG_NARGS() == 3)
+ step = PG_GETARG_INT32(2);
+ if (step == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot equal zero")));
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ fctx = (generate_series_fctx *) palloc(sizeof(generate_series_fctx));
+
+ /*
+ * Use fctx to keep state from call to call. Seed current with the
+ * original start value
+ */
+ fctx->current = start;
+ fctx->finish = finish;
+ fctx->step = step;
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ /*
+ * get the saved state and use current as the result for this iteration
+ */
+ fctx = funcctx->user_fctx;
+ result = fctx->current;
+
+ if ((fctx->step > 0 && fctx->current <= fctx->finish) ||
+ (fctx->step < 0 && fctx->current >= fctx->finish))
+ {
+ /*
+ * Increment current in preparation for next iteration. If next-value
+ * computation overflows, this is the final result.
+ */
+ if (pg_add_s32_overflow(fctx->current, fctx->step, &fctx->current))
+ fctx->step = 0;
+
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, Int32GetDatum(result));
+ }
+ else
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+}
+
+/*
+ * Planner support function for generate_series(int4, int4 [, int4])
+ */
+Datum
+generate_series_int4_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestRows))
+ {
+ /* Try to estimate the number of rows returned */
+ SupportRequestRows *req = (SupportRequestRows *) rawreq;
+
+ if (is_funcclause(req->node)) /* be paranoid */
+ {
+ List *args = ((FuncExpr *) req->node)->args;
+ Node *arg1,
+ *arg2,
+ *arg3;
+
+ /* We can use estimated argument values here */
+ arg1 = estimate_expression_value(req->root, linitial(args));
+ arg2 = estimate_expression_value(req->root, lsecond(args));
+ if (list_length(args) >= 3)
+ arg3 = estimate_expression_value(req->root, lthird(args));
+ else
+ arg3 = NULL;
+
+ /*
+ * If any argument is constant NULL, we can safely assume that
+ * zero rows are returned. Otherwise, if they're all non-NULL
+ * constants, we can calculate the number of rows that will be
+ * returned. Use double arithmetic to avoid overflow hazards.
+ */
+ if ((IsA(arg1, Const) &&
+ ((Const *) arg1)->constisnull) ||
+ (IsA(arg2, Const) &&
+ ((Const *) arg2)->constisnull) ||
+ (arg3 != NULL && IsA(arg3, Const) &&
+ ((Const *) arg3)->constisnull))
+ {
+ req->rows = 0;
+ ret = (Node *) req;
+ }
+ else if (IsA(arg1, Const) &&
+ IsA(arg2, Const) &&
+ (arg3 == NULL || IsA(arg3, Const)))
+ {
+ double start,
+ finish,
+ step;
+
+ start = DatumGetInt32(((Const *) arg1)->constvalue);
+ finish = DatumGetInt32(((Const *) arg2)->constvalue);
+ step = arg3 ? DatumGetInt32(((Const *) arg3)->constvalue) : 1;
+
+ /* This equation works for either sign of step */
+ if (step != 0)
+ {
+ req->rows = floor((finish - start + step) / step);
+ ret = (Node *) req;
+ }
+ }
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
new file mode 100644
index 0000000..98d4323
--- /dev/null
+++ b/src/backend/utils/adt/int8.c
@@ -0,0 +1,1524 @@
+/*-------------------------------------------------------------------------
+ *
+ * int8.c
+ * Internal 64-bit integer operations
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/int8.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <math.h>
+
+#include "common/int.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "optimizer/optimizer.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+
+
+typedef struct
+{
+ int64 current;
+ int64 finish;
+ int64 step;
+} generate_series_fctx;
+
+
+/***********************************************************************
+ **
+ ** Routines for 64-bit integers.
+ **
+ ***********************************************************************/
+
+/*----------------------------------------------------------
+ * Formatting and conversion routines.
+ *---------------------------------------------------------*/
+
+/* int8in()
+ */
+Datum
+int8in(PG_FUNCTION_ARGS)
+{
+ char *num = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_INT64(pg_strtoint64(num));
+}
+
+
+/* int8out()
+ */
+Datum
+int8out(PG_FUNCTION_ARGS)
+{
+ int64 val = PG_GETARG_INT64(0);
+ char buf[MAXINT8LEN + 1];
+ char *result;
+ int len;
+
+ len = pg_lltoa(val, buf) + 1;
+
+ /*
+ * Since the length is already known, we do a manual palloc() and memcpy()
+ * to avoid the strlen() call that would otherwise be done in pstrdup().
+ */
+ result = palloc(len);
+ memcpy(result, buf, len);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * int8recv - converts external binary format to int8
+ */
+Datum
+int8recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_INT64(pq_getmsgint64(buf));
+}
+
+/*
+ * int8send - converts int8 to binary format
+ */
+Datum
+int8send(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators for int8s, including cross-data-type comparisons.
+ *---------------------------------------------------------*/
+
+/* int8relop()
+ * Is val1 relop val2?
+ */
+Datum
+int8eq(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 == val2);
+}
+
+Datum
+int8ne(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 != val2);
+}
+
+Datum
+int8lt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 < val2);
+}
+
+Datum
+int8gt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 > val2);
+}
+
+Datum
+int8le(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 <= val2);
+}
+
+Datum
+int8ge(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 >= val2);
+}
+
+/* int84relop()
+ * Is 64-bit val1 relop 32-bit val2?
+ */
+Datum
+int84eq(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 == val2);
+}
+
+Datum
+int84ne(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 != val2);
+}
+
+Datum
+int84lt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 < val2);
+}
+
+Datum
+int84gt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 > val2);
+}
+
+Datum
+int84le(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 <= val2);
+}
+
+Datum
+int84ge(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_BOOL(val1 >= val2);
+}
+
+/* int48relop()
+ * Is 32-bit val1 relop 64-bit val2?
+ */
+Datum
+int48eq(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 == val2);
+}
+
+Datum
+int48ne(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 != val2);
+}
+
+Datum
+int48lt(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 < val2);
+}
+
+Datum
+int48gt(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 > val2);
+}
+
+Datum
+int48le(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 <= val2);
+}
+
+Datum
+int48ge(PG_FUNCTION_ARGS)
+{
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 >= val2);
+}
+
+/* int82relop()
+ * Is 64-bit val1 relop 16-bit val2?
+ */
+Datum
+int82eq(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 == val2);
+}
+
+Datum
+int82ne(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 != val2);
+}
+
+Datum
+int82lt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 < val2);
+}
+
+Datum
+int82gt(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 > val2);
+}
+
+Datum
+int82le(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 <= val2);
+}
+
+Datum
+int82ge(PG_FUNCTION_ARGS)
+{
+ int64 val1 = PG_GETARG_INT64(0);
+ int16 val2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_BOOL(val1 >= val2);
+}
+
+/* int28relop()
+ * Is 16-bit val1 relop 64-bit val2?
+ */
+Datum
+int28eq(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 == val2);
+}
+
+Datum
+int28ne(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 != val2);
+}
+
+Datum
+int28lt(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 < val2);
+}
+
+Datum
+int28gt(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 > val2);
+}
+
+Datum
+int28le(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 <= val2);
+}
+
+Datum
+int28ge(PG_FUNCTION_ARGS)
+{
+ int16 val1 = PG_GETARG_INT16(0);
+ int64 val2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_BOOL(val1 >= val2);
+}
+
+/*
+ * in_range support function for int8.
+ *
+ * Note: we needn't supply int8_int4 or int8_int2 variants, as implicit
+ * coercion of the offset value takes care of those scenarios just as well.
+ */
+Datum
+in_range_int8_int8(PG_FUNCTION_ARGS)
+{
+ int64 val = PG_GETARG_INT64(0);
+ int64 base = PG_GETARG_INT64(1);
+ int64 offset = PG_GETARG_INT64(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ int64 sum;
+
+ if (offset < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ if (sub)
+ offset = -offset; /* cannot overflow */
+
+ if (unlikely(pg_add_s64_overflow(base, offset, &sum)))
+ {
+ /*
+ * If sub is false, the true sum is surely more than val, so correct
+ * answer is the same as "less". If sub is true, the true sum is
+ * surely less than val, so the answer is "!less".
+ */
+ PG_RETURN_BOOL(sub ? !less : less);
+ }
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+
+/*----------------------------------------------------------
+ * Arithmetic operators on 64-bit integers.
+ *---------------------------------------------------------*/
+
+Datum
+int8um(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+ int64 result;
+
+ if (unlikely(arg == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ result = -arg;
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8up(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+
+ PG_RETURN_INT64(arg);
+}
+
+Datum
+int8pl(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8mi(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8mul(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_mul_s64_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8div(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (arg2 == 0)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * INT64_MIN / -1 is problematic, since the result can't be represented on
+ * a two's-complement machine. Some machines produce INT64_MIN, some
+ * produce zero, some throw an exception. We can dodge the problem by
+ * recognizing that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ result = -arg1;
+ PG_RETURN_INT64(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT64(result);
+}
+
+/* int8abs()
+ * Absolute value
+ */
+Datum
+int8abs(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 result;
+
+ if (unlikely(arg1 == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ result = (arg1 < 0) ? -arg1 : arg1;
+ PG_RETURN_INT64(result);
+}
+
+/* int8mod()
+ * Modulo operation.
+ */
+Datum
+int8mod(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * Some machines throw a floating-point exception for INT64_MIN % -1,
+ * which is a bit silly since the correct answer is perfectly
+ * well-defined, namely zero.
+ */
+ if (arg2 == -1)
+ PG_RETURN_INT64(0);
+
+ /* No overflow is possible */
+
+ PG_RETURN_INT64(arg1 % arg2);
+}
+
+/*
+ * Greatest Common Divisor
+ *
+ * Returns the largest positive integer that exactly divides both inputs.
+ * Special cases:
+ * - gcd(x, 0) = gcd(0, x) = abs(x)
+ * because 0 is divisible by anything
+ * - gcd(0, 0) = 0
+ * complies with the previous definition and is a common convention
+ *
+ * Special care must be taken if either input is INT64_MIN ---
+ * gcd(0, INT64_MIN), gcd(INT64_MIN, 0) and gcd(INT64_MIN, INT64_MIN) are
+ * all equal to abs(INT64_MIN), which cannot be represented as a 64-bit signed
+ * integer.
+ */
+static int64
+int8gcd_internal(int64 arg1, int64 arg2)
+{
+ int64 swap;
+ int64 a1,
+ a2;
+
+ /*
+ * Put the greater absolute value in arg1.
+ *
+ * This would happen automatically in the loop below, but avoids an
+ * expensive modulo operation, and simplifies the special-case handling
+ * for INT64_MIN below.
+ *
+ * We do this in negative space in order to handle INT64_MIN.
+ */
+ a1 = (arg1 < 0) ? arg1 : -arg1;
+ a2 = (arg2 < 0) ? arg2 : -arg2;
+ if (a1 > a2)
+ {
+ swap = arg1;
+ arg1 = arg2;
+ arg2 = swap;
+ }
+
+ /* Special care needs to be taken with INT64_MIN. See comments above. */
+ if (arg1 == PG_INT64_MIN)
+ {
+ if (arg2 == 0 || arg2 == PG_INT64_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ /*
+ * Some machines throw a floating-point exception for INT64_MIN % -1,
+ * which is a bit silly since the correct answer is perfectly
+ * well-defined, namely zero. Guard against this and just return the
+ * result, gcd(INT64_MIN, -1) = 1.
+ */
+ if (arg2 == -1)
+ return 1;
+ }
+
+ /* Use the Euclidean algorithm to find the GCD */
+ while (arg2 != 0)
+ {
+ swap = arg2;
+ arg2 = arg1 % arg2;
+ arg1 = swap;
+ }
+
+ /*
+ * Make sure the result is positive. (We know we don't have INT64_MIN
+ * anymore).
+ */
+ if (arg1 < 0)
+ arg1 = -arg1;
+
+ return arg1;
+}
+
+Datum
+int8gcd(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ result = int8gcd_internal(arg1, arg2);
+
+ PG_RETURN_INT64(result);
+}
+
+/*
+ * Least Common Multiple
+ */
+Datum
+int8lcm(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 gcd;
+ int64 result;
+
+ /*
+ * Handle lcm(x, 0) = lcm(0, x) = 0 as a special case. This prevents a
+ * division-by-zero error below when x is zero, and an overflow error from
+ * the GCD computation when x = INT64_MIN.
+ */
+ if (arg1 == 0 || arg2 == 0)
+ PG_RETURN_INT64(0);
+
+ /* lcm(x, y) = abs(x / gcd(x, y) * y) */
+ gcd = int8gcd_internal(arg1, arg2);
+ arg1 = arg1 / gcd;
+
+ if (unlikely(pg_mul_s64_overflow(arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ /* If the result is INT64_MIN, it cannot be represented. */
+ if (unlikely(result == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ if (result < 0)
+ result = -result;
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8inc(PG_FUNCTION_ARGS)
+{
+ /*
+ * When int8 is pass-by-reference, we provide this special case to avoid
+ * palloc overhead for COUNT(): when called as an aggregate, we know that
+ * the argument is modifiable local storage, so just update it in-place.
+ * (If int8 is pass-by-value, then of course this is useless as well as
+ * incorrect, so just ifdef it out.)
+ */
+#ifndef USE_FLOAT8_BYVAL /* controls int8 too */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ int64 *arg = (int64 *) PG_GETARG_POINTER(0);
+
+ if (unlikely(pg_add_s64_overflow(*arg, 1, arg)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_POINTER(arg);
+ }
+ else
+#endif
+ {
+ /* Not called as an aggregate, so just do it the dumb way */
+ int64 arg = PG_GETARG_INT64(0);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow(arg, 1, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_INT64(result);
+ }
+}
+
+Datum
+int8dec(PG_FUNCTION_ARGS)
+{
+ /*
+ * When int8 is pass-by-reference, we provide this special case to avoid
+ * palloc overhead for COUNT(): when called as an aggregate, we know that
+ * the argument is modifiable local storage, so just update it in-place.
+ * (If int8 is pass-by-value, then of course this is useless as well as
+ * incorrect, so just ifdef it out.)
+ */
+#ifndef USE_FLOAT8_BYVAL /* controls int8 too */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ int64 *arg = (int64 *) PG_GETARG_POINTER(0);
+
+ if (unlikely(pg_sub_s64_overflow(*arg, 1, arg)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_POINTER(arg);
+ }
+ else
+#endif
+ {
+ /* Not called as an aggregate, so just do it the dumb way */
+ int64 arg = PG_GETARG_INT64(0);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow(arg, 1, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_INT64(result);
+ }
+}
+
+
+/*
+ * These functions are exactly like int8inc/int8dec but are used for
+ * aggregates that count only non-null values. Since the functions are
+ * declared strict, the null checks happen before we ever get here, and all we
+ * need do is increment the state value. We could actually make these pg_proc
+ * entries point right at int8inc/int8dec, but then the opr_sanity regression
+ * test would complain about mismatched entries for a built-in function.
+ */
+
+Datum
+int8inc_any(PG_FUNCTION_ARGS)
+{
+ return int8inc(fcinfo);
+}
+
+Datum
+int8inc_float8_float8(PG_FUNCTION_ARGS)
+{
+ return int8inc(fcinfo);
+}
+
+Datum
+int8dec_any(PG_FUNCTION_ARGS)
+{
+ return int8dec(fcinfo);
+}
+
+/*
+ * int8inc_support
+ * prosupport function for int8inc() and int8inc_any()
+ */
+Datum
+int8inc_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ if (IsA(rawreq, SupportRequestWFuncMonotonic))
+ {
+ SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq;
+ MonotonicFunction monotonic = MONOTONICFUNC_NONE;
+ int frameOptions = req->window_clause->frameOptions;
+
+ /* No ORDER BY clause then all rows are peers */
+ if (req->window_clause->orderClause == NIL)
+ monotonic = MONOTONICFUNC_BOTH;
+ else
+ {
+ /*
+ * Otherwise take into account the frame options. When the frame
+ * bound is the start of the window then the resulting value can
+ * never decrease, therefore is monotonically increasing
+ */
+ if (frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
+ monotonic |= MONOTONICFUNC_INCREASING;
+
+ /*
+ * Likewise, if the frame bound is the end of the window then the
+ * resulting value can never decrease.
+ */
+ if (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING)
+ monotonic |= MONOTONICFUNC_DECREASING;
+ }
+
+ req->monotonic = monotonic;
+ PG_RETURN_POINTER(req);
+ }
+
+ PG_RETURN_POINTER(NULL);
+}
+
+
+Datum
+int8larger(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ result = ((arg1 > arg2) ? arg1 : arg2);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int8smaller(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ result = ((arg1 < arg2) ? arg1 : arg2);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int84pl(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int84mi(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int84mul(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int64 result;
+
+ if (unlikely(pg_mul_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int84div(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+ int64 result;
+
+ if (arg2 == 0)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * INT64_MIN / -1 is problematic, since the result can't be represented on
+ * a two's-complement machine. Some machines produce INT64_MIN, some
+ * produce zero, some throw an exception. We can dodge the problem by
+ * recognizing that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ result = -arg1;
+ PG_RETURN_INT64(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int48pl(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int48mi(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int48mul(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_mul_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int48div(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /* No overflow is possible */
+ PG_RETURN_INT64((int64) arg1 / arg2);
+}
+
+Datum
+int82pl(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int82mi(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int82mul(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int64 result;
+
+ if (unlikely(pg_mul_s64_overflow(arg1, (int64) arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int82div(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+ int64 result;
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /*
+ * INT64_MIN / -1 is problematic, since the result can't be represented on
+ * a two's-complement machine. Some machines produce INT64_MIN, some
+ * produce zero, some throw an exception. We can dodge the problem by
+ * recognizing that division by -1 is the same as negation.
+ */
+ if (arg2 == -1)
+ {
+ if (unlikely(arg1 == PG_INT64_MIN))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ result = -arg1;
+ PG_RETURN_INT64(result);
+ }
+
+ /* No overflow is possible */
+
+ result = arg1 / arg2;
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int28pl(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_add_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int28mi(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_sub_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int28mul(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+ int64 result;
+
+ if (unlikely(pg_mul_s64_overflow((int64) arg1, arg2, &result)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+ PG_RETURN_INT64(result);
+}
+
+Datum
+int28div(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ if (unlikely(arg2 == 0))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ /* ensure compiler realizes we mustn't reach the division (gcc bug) */
+ PG_RETURN_NULL();
+ }
+
+ /* No overflow is possible */
+ PG_RETURN_INT64((int64) arg1 / arg2);
+}
+
+/* Binary arithmetics
+ *
+ * int8and - returns arg1 & arg2
+ * int8or - returns arg1 | arg2
+ * int8xor - returns arg1 # arg2
+ * int8not - returns ~arg1
+ * int8shl - returns arg1 << arg2
+ * int8shr - returns arg1 >> arg2
+ */
+
+Datum
+int8and(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 & arg2);
+}
+
+Datum
+int8or(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 | arg2);
+}
+
+Datum
+int8xor(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 ^ arg2);
+}
+
+Datum
+int8not(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+
+ PG_RETURN_INT64(~arg1);
+}
+
+Datum
+int8shl(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT64(arg1 << arg2);
+}
+
+Datum
+int8shr(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT64(arg1 >> arg2);
+}
+
+/*----------------------------------------------------------
+ * Conversion operators.
+ *---------------------------------------------------------*/
+
+Datum
+int48(PG_FUNCTION_ARGS)
+{
+ int32 arg = PG_GETARG_INT32(0);
+
+ PG_RETURN_INT64((int64) arg);
+}
+
+Datum
+int84(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+
+ if (unlikely(arg < PG_INT32_MIN) || unlikely(arg > PG_INT32_MAX))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ PG_RETURN_INT32((int32) arg);
+}
+
+Datum
+int28(PG_FUNCTION_ARGS)
+{
+ int16 arg = PG_GETARG_INT16(0);
+
+ PG_RETURN_INT64((int64) arg);
+}
+
+Datum
+int82(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+
+ if (unlikely(arg < PG_INT16_MIN) || unlikely(arg > PG_INT16_MAX))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ PG_RETURN_INT16((int16) arg);
+}
+
+Datum
+i8tod(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+ float8 result;
+
+ result = arg;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/* dtoi8()
+ * Convert float8 to 8-byte integer.
+ */
+Datum
+dtoi8(PG_FUNCTION_ARGS)
+{
+ float8 num = PG_GETARG_FLOAT8(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT8_FITS_IN_INT64(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_INT64((int64) num);
+}
+
+Datum
+i8tof(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+ float4 result;
+
+ result = arg;
+
+ PG_RETURN_FLOAT4(result);
+}
+
+/* ftoi8()
+ * Convert float4 to 8-byte integer.
+ */
+Datum
+ftoi8(PG_FUNCTION_ARGS)
+{
+ float4 num = PG_GETARG_FLOAT4(0);
+
+ /*
+ * Get rid of any fractional part in the input. This is so we don't fail
+ * on just-out-of-range values that would round into range. Note
+ * assumption that rint() will pass through a NaN or Inf unchanged.
+ */
+ num = rint(num);
+
+ /* Range check */
+ if (unlikely(isnan(num) || !FLOAT4_FITS_IN_INT64(num)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_INT64((int64) num);
+}
+
+Datum
+i8tooid(PG_FUNCTION_ARGS)
+{
+ int64 arg = PG_GETARG_INT64(0);
+
+ if (unlikely(arg < 0) || unlikely(arg > PG_UINT32_MAX))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("OID out of range")));
+
+ PG_RETURN_OID((Oid) arg);
+}
+
+Datum
+oidtoi8(PG_FUNCTION_ARGS)
+{
+ Oid arg = PG_GETARG_OID(0);
+
+ PG_RETURN_INT64((int64) arg);
+}
+
+/*
+ * non-persistent numeric series generator
+ */
+Datum
+generate_series_int8(PG_FUNCTION_ARGS)
+{
+ return generate_series_step_int8(fcinfo);
+}
+
+Datum
+generate_series_step_int8(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ generate_series_fctx *fctx;
+ int64 result;
+ MemoryContext oldcontext;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ int64 start = PG_GETARG_INT64(0);
+ int64 finish = PG_GETARG_INT64(1);
+ int64 step = 1;
+
+ /* see if we were given an explicit step size */
+ if (PG_NARGS() == 3)
+ step = PG_GETARG_INT64(2);
+ if (step == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot equal zero")));
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ fctx = (generate_series_fctx *) palloc(sizeof(generate_series_fctx));
+
+ /*
+ * Use fctx to keep state from call to call. Seed current with the
+ * original start value
+ */
+ fctx->current = start;
+ fctx->finish = finish;
+ fctx->step = step;
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ /*
+ * get the saved state and use current as the result for this iteration
+ */
+ fctx = funcctx->user_fctx;
+ result = fctx->current;
+
+ if ((fctx->step > 0 && fctx->current <= fctx->finish) ||
+ (fctx->step < 0 && fctx->current >= fctx->finish))
+ {
+ /*
+ * Increment current in preparation for next iteration. If next-value
+ * computation overflows, this is the final result.
+ */
+ if (pg_add_s64_overflow(fctx->current, fctx->step, &fctx->current))
+ fctx->step = 0;
+
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, Int64GetDatum(result));
+ }
+ else
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+}
+
+/*
+ * Planner support function for generate_series(int8, int8 [, int8])
+ */
+Datum
+generate_series_int8_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestRows))
+ {
+ /* Try to estimate the number of rows returned */
+ SupportRequestRows *req = (SupportRequestRows *) rawreq;
+
+ if (is_funcclause(req->node)) /* be paranoid */
+ {
+ List *args = ((FuncExpr *) req->node)->args;
+ Node *arg1,
+ *arg2,
+ *arg3;
+
+ /* We can use estimated argument values here */
+ arg1 = estimate_expression_value(req->root, linitial(args));
+ arg2 = estimate_expression_value(req->root, lsecond(args));
+ if (list_length(args) >= 3)
+ arg3 = estimate_expression_value(req->root, lthird(args));
+ else
+ arg3 = NULL;
+
+ /*
+ * If any argument is constant NULL, we can safely assume that
+ * zero rows are returned. Otherwise, if they're all non-NULL
+ * constants, we can calculate the number of rows that will be
+ * returned. Use double arithmetic to avoid overflow hazards.
+ */
+ if ((IsA(arg1, Const) &&
+ ((Const *) arg1)->constisnull) ||
+ (IsA(arg2, Const) &&
+ ((Const *) arg2)->constisnull) ||
+ (arg3 != NULL && IsA(arg3, Const) &&
+ ((Const *) arg3)->constisnull))
+ {
+ req->rows = 0;
+ ret = (Node *) req;
+ }
+ else if (IsA(arg1, Const) &&
+ IsA(arg2, Const) &&
+ (arg3 == NULL || IsA(arg3, Const)))
+ {
+ double start,
+ finish,
+ step;
+
+ start = DatumGetInt64(((Const *) arg1)->constvalue);
+ finish = DatumGetInt64(((Const *) arg2)->constvalue);
+ step = arg3 ? DatumGetInt64(((Const *) arg3)->constvalue) : 1;
+
+ /* This equation works for either sign of step */
+ if (step != 0)
+ {
+ req->rows = floor((finish - start + step) / step);
+ ret = (Node *) req;
+ }
+ }
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
new file mode 100644
index 0000000..2fececd
--- /dev/null
+++ b/src/backend/utils/adt/json.c
@@ -0,0 +1,1375 @@
+/*-------------------------------------------------------------------------
+ *
+ * json.c
+ * JSON data type support.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/json.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "parser/parse_coerce.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/json.h"
+#include "utils/jsonfuncs.h"
+#include "utils/lsyscache.h"
+#include "utils/typcache.h"
+
+typedef enum /* type categories for datum_to_json */
+{
+ JSONTYPE_NULL, /* null, so we didn't bother to identify */
+ JSONTYPE_BOOL, /* boolean (built-in types only) */
+ JSONTYPE_NUMERIC, /* numeric (ditto) */
+ JSONTYPE_DATE, /* we use special formatting for datetimes */
+ JSONTYPE_TIMESTAMP,
+ JSONTYPE_TIMESTAMPTZ,
+ JSONTYPE_JSON, /* JSON itself (and JSONB) */
+ JSONTYPE_ARRAY, /* array */
+ JSONTYPE_COMPOSITE, /* composite */
+ JSONTYPE_CAST, /* something with an explicit cast to JSON */
+ JSONTYPE_OTHER /* all else */
+} JsonTypeCategory;
+
+typedef struct JsonAggState
+{
+ StringInfo str;
+ JsonTypeCategory key_category;
+ Oid key_output_func;
+ JsonTypeCategory val_category;
+ Oid val_output_func;
+} JsonAggState;
+
+static void composite_to_json(Datum composite, StringInfo result,
+ bool use_line_feeds);
+static void array_dim_to_json(StringInfo result, int dim, int ndims, int *dims,
+ Datum *vals, bool *nulls, int *valcount,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool use_line_feeds);
+static void array_to_json_internal(Datum array, StringInfo result,
+ bool use_line_feeds);
+static void json_categorize_type(Oid typoid,
+ JsonTypeCategory *tcategory,
+ Oid *outfuncoid);
+static void datum_to_json(Datum val, bool is_null, StringInfo result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar);
+static void add_json(Datum val, bool is_null, StringInfo result,
+ Oid val_type, bool key_scalar);
+static text *catenate_stringinfo_string(StringInfo buffer, const char *addon);
+
+/*
+ * Input.
+ */
+Datum
+json_in(PG_FUNCTION_ARGS)
+{
+ char *json = PG_GETARG_CSTRING(0);
+ text *result = cstring_to_text(json);
+ JsonLexContext *lex;
+
+ /* validate it */
+ lex = makeJsonLexContext(result, false);
+ pg_parse_json_or_ereport(lex, &nullSemAction);
+
+ /* Internal representation is the same as text, for now */
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * Output.
+ */
+Datum
+json_out(PG_FUNCTION_ARGS)
+{
+ /* we needn't detoast because text_to_cstring will handle that */
+ Datum txt = PG_GETARG_DATUM(0);
+
+ PG_RETURN_CSTRING(TextDatumGetCString(txt));
+}
+
+/*
+ * Binary send.
+ */
+Datum
+json_send(PG_FUNCTION_ARGS)
+{
+ text *t = PG_GETARG_TEXT_PP(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, VARDATA_ANY(t), VARSIZE_ANY_EXHDR(t));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * Binary receive.
+ */
+Datum
+json_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ char *str;
+ int nbytes;
+ JsonLexContext *lex;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+
+ /* Validate it. */
+ lex = makeJsonLexContextCstringLen(str, nbytes, GetDatabaseEncoding(), false);
+ pg_parse_json_or_ereport(lex, &nullSemAction);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(str, nbytes));
+}
+
+/*
+ * Determine how we want to print values of a given type in datum_to_json.
+ *
+ * Given the datatype OID, return its JsonTypeCategory, as well as the type's
+ * output function OID. If the returned category is JSONTYPE_CAST, we
+ * return the OID of the type->JSON cast function instead.
+ */
+static void
+json_categorize_type(Oid typoid,
+ JsonTypeCategory *tcategory,
+ Oid *outfuncoid)
+{
+ bool typisvarlena;
+
+ /* Look through any domain */
+ typoid = getBaseType(typoid);
+
+ *outfuncoid = InvalidOid;
+
+ /*
+ * We need to get the output function for everything except date and
+ * timestamp types, array and composite types, booleans, and non-builtin
+ * types where there's a cast to json.
+ */
+
+ switch (typoid)
+ {
+ case BOOLOID:
+ *tcategory = JSONTYPE_BOOL;
+ break;
+
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case NUMERICOID:
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ *tcategory = JSONTYPE_NUMERIC;
+ break;
+
+ case DATEOID:
+ *tcategory = JSONTYPE_DATE;
+ break;
+
+ case TIMESTAMPOID:
+ *tcategory = JSONTYPE_TIMESTAMP;
+ break;
+
+ case TIMESTAMPTZOID:
+ *tcategory = JSONTYPE_TIMESTAMPTZ;
+ break;
+
+ case JSONOID:
+ case JSONBOID:
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ *tcategory = JSONTYPE_JSON;
+ break;
+
+ default:
+ /* Check for arrays and composites */
+ if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID
+ || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID)
+ *tcategory = JSONTYPE_ARRAY;
+ else if (type_is_rowtype(typoid)) /* includes RECORDOID */
+ *tcategory = JSONTYPE_COMPOSITE;
+ else
+ {
+ /* It's probably the general case ... */
+ *tcategory = JSONTYPE_OTHER;
+ /* but let's look for a cast to json, if it's not built-in */
+ if (typoid >= FirstNormalObjectId)
+ {
+ Oid castfunc;
+ CoercionPathType ctype;
+
+ ctype = find_coercion_pathway(JSONOID, typoid,
+ COERCION_EXPLICIT,
+ &castfunc);
+ if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc))
+ {
+ *tcategory = JSONTYPE_CAST;
+ *outfuncoid = castfunc;
+ }
+ else
+ {
+ /* non builtin type with no cast */
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ }
+ }
+ else
+ {
+ /* any other builtin type */
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ }
+ }
+ break;
+ }
+}
+
+/*
+ * Turn a Datum into JSON text, appending the string to "result".
+ *
+ * tcategory and outfuncoid are from a previous call to json_categorize_type,
+ * except that if is_null is true then they can be invalid.
+ *
+ * If key_scalar is true, the value is being printed as a key, so insist
+ * it's of an acceptable type, and force it to be quoted.
+ */
+static void
+datum_to_json(Datum val, bool is_null, StringInfo result,
+ JsonTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar)
+{
+ char *outputstr;
+ text *jsontext;
+
+ check_stack_depth();
+
+ /* callers are expected to ensure that null keys are not passed in */
+ Assert(!(key_scalar && is_null));
+
+ if (is_null)
+ {
+ appendStringInfoString(result, "null");
+ return;
+ }
+
+ if (key_scalar &&
+ (tcategory == JSONTYPE_ARRAY ||
+ tcategory == JSONTYPE_COMPOSITE ||
+ tcategory == JSONTYPE_JSON ||
+ tcategory == JSONTYPE_CAST))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("key value must be scalar, not array, composite, or json")));
+
+ switch (tcategory)
+ {
+ case JSONTYPE_ARRAY:
+ array_to_json_internal(val, result, false);
+ break;
+ case JSONTYPE_COMPOSITE:
+ composite_to_json(val, result, false);
+ break;
+ case JSONTYPE_BOOL:
+ outputstr = DatumGetBool(val) ? "true" : "false";
+ if (key_scalar)
+ escape_json(result, outputstr);
+ else
+ appendStringInfoString(result, outputstr);
+ break;
+ case JSONTYPE_NUMERIC:
+ outputstr = OidOutputFunctionCall(outfuncoid, val);
+
+ /*
+ * Don't call escape_json for a non-key if it's a valid JSON
+ * number.
+ */
+ if (!key_scalar && IsValidJsonNumber(outputstr, strlen(outputstr)))
+ appendStringInfoString(result, outputstr);
+ else
+ escape_json(result, outputstr);
+ pfree(outputstr);
+ break;
+ case JSONTYPE_DATE:
+ {
+ char buf[MAXDATELEN + 1];
+
+ JsonEncodeDateTime(buf, val, DATEOID, NULL);
+ appendStringInfo(result, "\"%s\"", buf);
+ }
+ break;
+ case JSONTYPE_TIMESTAMP:
+ {
+ char buf[MAXDATELEN + 1];
+
+ JsonEncodeDateTime(buf, val, TIMESTAMPOID, NULL);
+ appendStringInfo(result, "\"%s\"", buf);
+ }
+ break;
+ case JSONTYPE_TIMESTAMPTZ:
+ {
+ char buf[MAXDATELEN + 1];
+
+ JsonEncodeDateTime(buf, val, TIMESTAMPTZOID, NULL);
+ appendStringInfo(result, "\"%s\"", buf);
+ }
+ break;
+ case JSONTYPE_JSON:
+ /* JSON and JSONB output will already be escaped */
+ outputstr = OidOutputFunctionCall(outfuncoid, val);
+ appendStringInfoString(result, outputstr);
+ pfree(outputstr);
+ break;
+ case JSONTYPE_CAST:
+ /* outfuncoid refers to a cast function, not an output function */
+ jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val));
+ outputstr = text_to_cstring(jsontext);
+ appendStringInfoString(result, outputstr);
+ pfree(outputstr);
+ pfree(jsontext);
+ break;
+ default:
+ outputstr = OidOutputFunctionCall(outfuncoid, val);
+ escape_json(result, outputstr);
+ pfree(outputstr);
+ break;
+ }
+}
+
+/*
+ * Encode 'value' of datetime type 'typid' into JSON string in ISO format using
+ * optionally preallocated buffer 'buf'. Optional 'tzp' determines time-zone
+ * offset (in seconds) in which we want to show timestamptz.
+ */
+char *
+JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp)
+{
+ if (!buf)
+ buf = palloc(MAXDATELEN + 1);
+
+ switch (typid)
+ {
+ case DATEOID:
+ {
+ DateADT date;
+ struct pg_tm tm;
+
+ date = DatumGetDateADT(value);
+
+ /* Same as date_out(), but forcing DateStyle */
+ if (DATE_NOT_FINITE(date))
+ EncodeSpecialDate(date, buf);
+ else
+ {
+ j2date(date + POSTGRES_EPOCH_JDATE,
+ &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday));
+ EncodeDateOnly(&tm, USE_XSD_DATES, buf);
+ }
+ }
+ break;
+ case TIMEOID:
+ {
+ TimeADT time = DatumGetTimeADT(value);
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ /* Same as time_out(), but forcing DateStyle */
+ time2tm(time, tm, &fsec);
+ EncodeTimeOnly(tm, fsec, false, 0, USE_XSD_DATES, buf);
+ }
+ break;
+ case TIMETZOID:
+ {
+ TimeTzADT *time = DatumGetTimeTzADTP(value);
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ /* Same as timetz_out(), but forcing DateStyle */
+ timetz2tm(time, tm, &fsec, &tz);
+ EncodeTimeOnly(tm, fsec, true, tz, USE_XSD_DATES, buf);
+ }
+ break;
+ case TIMESTAMPOID:
+ {
+ Timestamp timestamp;
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ timestamp = DatumGetTimestamp(value);
+ /* Same as timestamp_out(), but forcing DateStyle */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ EncodeSpecialTimestamp(timestamp, buf);
+ else if (timestamp2tm(timestamp, NULL, &tm, &fsec, NULL, NULL) == 0)
+ EncodeDateTime(&tm, fsec, false, 0, NULL, USE_XSD_DATES, buf);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ break;
+ case TIMESTAMPTZOID:
+ {
+ TimestampTz timestamp;
+ struct pg_tm tm;
+ int tz;
+ fsec_t fsec;
+ const char *tzn = NULL;
+
+ timestamp = DatumGetTimestampTz(value);
+
+ /*
+ * If a time zone is specified, we apply the time-zone shift,
+ * convert timestamptz to pg_tm as if it were without a time
+ * zone, and then use the specified time zone for converting
+ * the timestamp into a string.
+ */
+ if (tzp)
+ {
+ tz = *tzp;
+ timestamp -= (TimestampTz) tz * USECS_PER_SEC;
+ }
+
+ /* Same as timestamptz_out(), but forcing DateStyle */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ EncodeSpecialTimestamp(timestamp, buf);
+ else if (timestamp2tm(timestamp, tzp ? NULL : &tz, &tm, &fsec,
+ tzp ? NULL : &tzn, NULL) == 0)
+ {
+ if (tzp)
+ tm.tm_isdst = 1; /* set time-zone presence flag */
+
+ EncodeDateTime(&tm, fsec, true, tz, tzn, USE_XSD_DATES, buf);
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ break;
+ default:
+ elog(ERROR, "unknown jsonb value datetime type oid %u", typid);
+ return NULL;
+ }
+
+ return buf;
+}
+
+/*
+ * Process a single dimension of an array.
+ * If it's the innermost dimension, output the values, otherwise call
+ * ourselves recursively to process the next dimension.
+ */
+static void
+array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, Datum *vals,
+ bool *nulls, int *valcount, JsonTypeCategory tcategory,
+ Oid outfuncoid, bool use_line_feeds)
+{
+ int i;
+ const char *sep;
+
+ Assert(dim < ndims);
+
+ sep = use_line_feeds ? ",\n " : ",";
+
+ appendStringInfoChar(result, '[');
+
+ for (i = 1; i <= dims[dim]; i++)
+ {
+ if (i > 1)
+ appendStringInfoString(result, sep);
+
+ if (dim + 1 == ndims)
+ {
+ datum_to_json(vals[*valcount], nulls[*valcount], result, tcategory,
+ outfuncoid, false);
+ (*valcount)++;
+ }
+ else
+ {
+ /*
+ * Do we want line feeds on inner dimensions of arrays? For now
+ * we'll say no.
+ */
+ array_dim_to_json(result, dim + 1, ndims, dims, vals, nulls,
+ valcount, tcategory, outfuncoid, false);
+ }
+ }
+
+ appendStringInfoChar(result, ']');
+}
+
+/*
+ * Turn an array into JSON.
+ */
+static void
+array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds)
+{
+ ArrayType *v = DatumGetArrayTypeP(array);
+ Oid element_type = ARR_ELEMTYPE(v);
+ int *dim;
+ int ndim;
+ int nitems;
+ int count = 0;
+ Datum *elements;
+ bool *nulls;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ JsonTypeCategory tcategory;
+ Oid outfuncoid;
+
+ ndim = ARR_NDIM(v);
+ dim = ARR_DIMS(v);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ if (nitems <= 0)
+ {
+ appendStringInfoString(result, "[]");
+ return;
+ }
+
+ get_typlenbyvalalign(element_type,
+ &typlen, &typbyval, &typalign);
+
+ json_categorize_type(element_type,
+ &tcategory, &outfuncoid);
+
+ deconstruct_array(v, element_type, typlen, typbyval,
+ typalign, &elements, &nulls,
+ &nitems);
+
+ array_dim_to_json(result, 0, ndim, dim, elements, nulls, &count, tcategory,
+ outfuncoid, use_line_feeds);
+
+ pfree(elements);
+ pfree(nulls);
+}
+
+/*
+ * Turn a composite / record into JSON.
+ */
+static void
+composite_to_json(Datum composite, StringInfo result, bool use_line_feeds)
+{
+ HeapTupleHeader td;
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tmptup,
+ *tuple;
+ int i;
+ bool needsep = false;
+ const char *sep;
+
+ sep = use_line_feeds ? ",\n " : ",";
+
+ td = DatumGetHeapTupleHeader(composite);
+
+ /* Extract rowtype info and find a tupdesc */
+ tupType = HeapTupleHeaderGetTypeId(td);
+ tupTypmod = HeapTupleHeaderGetTypMod(td);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+
+ /* Build a temporary HeapTuple control structure */
+ tmptup.t_len = HeapTupleHeaderGetDatumLength(td);
+ tmptup.t_data = td;
+ tuple = &tmptup;
+
+ appendStringInfoChar(result, '{');
+
+ for (i = 0; i < tupdesc->natts; i++)
+ {
+ Datum val;
+ bool isnull;
+ char *attname;
+ JsonTypeCategory tcategory;
+ Oid outfuncoid;
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+
+ if (needsep)
+ appendStringInfoString(result, sep);
+ needsep = true;
+
+ attname = NameStr(att->attname);
+ escape_json(result, attname);
+ appendStringInfoChar(result, ':');
+
+ val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
+
+ if (isnull)
+ {
+ tcategory = JSONTYPE_NULL;
+ outfuncoid = InvalidOid;
+ }
+ else
+ json_categorize_type(att->atttypid, &tcategory, &outfuncoid);
+
+ datum_to_json(val, isnull, result, tcategory, outfuncoid, false);
+ }
+
+ appendStringInfoChar(result, '}');
+ ReleaseTupleDesc(tupdesc);
+}
+
+/*
+ * Append JSON text for "val" to "result".
+ *
+ * This is just a thin wrapper around datum_to_json. If the same type will be
+ * printed many times, avoid using this; better to do the json_categorize_type
+ * lookups only once.
+ */
+static void
+add_json(Datum val, bool is_null, StringInfo result,
+ Oid val_type, bool key_scalar)
+{
+ JsonTypeCategory tcategory;
+ Oid outfuncoid;
+
+ if (val_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ if (is_null)
+ {
+ tcategory = JSONTYPE_NULL;
+ outfuncoid = InvalidOid;
+ }
+ else
+ json_categorize_type(val_type,
+ &tcategory, &outfuncoid);
+
+ datum_to_json(val, is_null, result, tcategory, outfuncoid, key_scalar);
+}
+
+/*
+ * SQL function array_to_json(row)
+ */
+Datum
+array_to_json(PG_FUNCTION_ARGS)
+{
+ Datum array = PG_GETARG_DATUM(0);
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ array_to_json_internal(array, result, false);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * SQL function array_to_json(row, prettybool)
+ */
+Datum
+array_to_json_pretty(PG_FUNCTION_ARGS)
+{
+ Datum array = PG_GETARG_DATUM(0);
+ bool use_line_feeds = PG_GETARG_BOOL(1);
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ array_to_json_internal(array, result, use_line_feeds);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * SQL function row_to_json(row)
+ */
+Datum
+row_to_json(PG_FUNCTION_ARGS)
+{
+ Datum array = PG_GETARG_DATUM(0);
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ composite_to_json(array, result, false);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * SQL function row_to_json(row, prettybool)
+ */
+Datum
+row_to_json_pretty(PG_FUNCTION_ARGS)
+{
+ Datum array = PG_GETARG_DATUM(0);
+ bool use_line_feeds = PG_GETARG_BOOL(1);
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ composite_to_json(array, result, use_line_feeds);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * SQL function to_json(anyvalue)
+ */
+Datum
+to_json(PG_FUNCTION_ARGS)
+{
+ Datum val = PG_GETARG_DATUM(0);
+ Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ StringInfo result;
+ JsonTypeCategory tcategory;
+ Oid outfuncoid;
+
+ if (val_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ json_categorize_type(val_type,
+ &tcategory, &outfuncoid);
+
+ result = makeStringInfo();
+
+ datum_to_json(val, false, result, tcategory, outfuncoid, false);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * json_agg transition function
+ *
+ * aggregate input column as a json array value.
+ */
+Datum
+json_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggcontext,
+ oldcontext;
+ JsonAggState *state;
+ Datum val;
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "json_agg_transfn called in non-aggregate context");
+ }
+
+ if (PG_ARGISNULL(0))
+ {
+ Oid arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ /*
+ * Make this state object in a context where it will persist for the
+ * duration of the aggregate call. MemoryContextSwitchTo is only
+ * needed the first time, as the StringInfo routines make sure they
+ * use the right context to enlarge the object if necessary.
+ */
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+ state = (JsonAggState *) palloc(sizeof(JsonAggState));
+ state->str = makeStringInfo();
+ MemoryContextSwitchTo(oldcontext);
+
+ appendStringInfoChar(state->str, '[');
+ json_categorize_type(arg_type, &state->val_category,
+ &state->val_output_func);
+ }
+ else
+ {
+ state = (JsonAggState *) PG_GETARG_POINTER(0);
+ appendStringInfoString(state->str, ", ");
+ }
+
+ /* fast path for NULLs */
+ if (PG_ARGISNULL(1))
+ {
+ datum_to_json((Datum) 0, true, state->str, JSONTYPE_NULL,
+ InvalidOid, false);
+ PG_RETURN_POINTER(state);
+ }
+
+ val = PG_GETARG_DATUM(1);
+
+ /* add some whitespace if structured type and not first item */
+ if (!PG_ARGISNULL(0) &&
+ (state->val_category == JSONTYPE_ARRAY ||
+ state->val_category == JSONTYPE_COMPOSITE))
+ {
+ appendStringInfoString(state->str, "\n ");
+ }
+
+ datum_to_json(val, false, state->str, state->val_category,
+ state->val_output_func, false);
+
+ /*
+ * The transition type for json_agg() is declared to be "internal", which
+ * is a pass-by-value type the same size as a pointer. So we can safely
+ * pass the JsonAggState pointer through nodeAgg.c's machinations.
+ */
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * json_agg final function
+ */
+Datum
+json_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ JsonAggState *state;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ?
+ NULL :
+ (JsonAggState *) PG_GETARG_POINTER(0);
+
+ /* NULL result for no rows in, as is standard with aggregates */
+ if (state == NULL)
+ PG_RETURN_NULL();
+
+ /* Else return state with appropriate array terminator added */
+ PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, "]"));
+}
+
+/*
+ * json_object_agg transition function.
+ *
+ * aggregate two input columns as a single json object value.
+ */
+Datum
+json_object_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggcontext,
+ oldcontext;
+ JsonAggState *state;
+ Datum arg;
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "json_object_agg_transfn called in non-aggregate context");
+ }
+
+ if (PG_ARGISNULL(0))
+ {
+ Oid arg_type;
+
+ /*
+ * Make the StringInfo in a context where it will persist for the
+ * duration of the aggregate call. Switching context is only needed
+ * for this initial step, as the StringInfo routines make sure they
+ * use the right context to enlarge the object if necessary.
+ */
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+ state = (JsonAggState *) palloc(sizeof(JsonAggState));
+ state->str = makeStringInfo();
+ MemoryContextSwitchTo(oldcontext);
+
+ arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine data type for argument %d", 1)));
+
+ json_categorize_type(arg_type, &state->key_category,
+ &state->key_output_func);
+
+ arg_type = get_fn_expr_argtype(fcinfo->flinfo, 2);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine data type for argument %d", 2)));
+
+ json_categorize_type(arg_type, &state->val_category,
+ &state->val_output_func);
+
+ appendStringInfoString(state->str, "{ ");
+ }
+ else
+ {
+ state = (JsonAggState *) PG_GETARG_POINTER(0);
+ appendStringInfoString(state->str, ", ");
+ }
+
+ /*
+ * Note: since json_object_agg() is declared as taking type "any", the
+ * parser will not do any type conversion on unknown-type literals (that
+ * is, undecorated strings or NULLs). Such values will arrive here as
+ * type UNKNOWN, which fortunately does not matter to us, since
+ * unknownout() works fine.
+ */
+
+ if (PG_ARGISNULL(1))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("field name must not be null")));
+
+ arg = PG_GETARG_DATUM(1);
+
+ datum_to_json(arg, false, state->str, state->key_category,
+ state->key_output_func, true);
+
+ appendStringInfoString(state->str, " : ");
+
+ if (PG_ARGISNULL(2))
+ arg = (Datum) 0;
+ else
+ arg = PG_GETARG_DATUM(2);
+
+ datum_to_json(arg, PG_ARGISNULL(2), state->str, state->val_category,
+ state->val_output_func, false);
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * json_object_agg final function.
+ */
+Datum
+json_object_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ JsonAggState *state;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ? NULL : (JsonAggState *) PG_GETARG_POINTER(0);
+
+ /* NULL result for no rows in, as is standard with aggregates */
+ if (state == NULL)
+ PG_RETURN_NULL();
+
+ /* Else return state with appropriate object terminator added */
+ PG_RETURN_TEXT_P(catenate_stringinfo_string(state->str, " }"));
+}
+
+/*
+ * Helper function for aggregates: return given StringInfo's contents plus
+ * specified trailing string, as a text datum. We need this because aggregate
+ * final functions are not allowed to modify the aggregate state.
+ */
+static text *
+catenate_stringinfo_string(StringInfo buffer, const char *addon)
+{
+ /* custom version of cstring_to_text_with_len */
+ int buflen = buffer->len;
+ int addlen = strlen(addon);
+ text *result = (text *) palloc(buflen + addlen + VARHDRSZ);
+
+ SET_VARSIZE(result, buflen + addlen + VARHDRSZ);
+ memcpy(VARDATA(result), buffer->data, buflen);
+ memcpy(VARDATA(result) + buflen, addon, addlen);
+
+ return result;
+}
+
+/*
+ * SQL function json_build_object(variadic "any")
+ */
+Datum
+json_build_object(PG_FUNCTION_ARGS)
+{
+ int nargs;
+ int i;
+ const char *sep = "";
+ StringInfo result;
+ Datum *args;
+ bool *nulls;
+ Oid *types;
+
+ /* fetch argument values to build the object */
+ nargs = extract_variadic_args(fcinfo, 0, false, &args, &types, &nulls);
+
+ if (nargs < 0)
+ PG_RETURN_NULL();
+
+ if (nargs % 2 != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument list must have even number of elements"),
+ /* translator: %s is a SQL function name */
+ errhint("The arguments of %s must consist of alternating keys and values.",
+ "json_build_object()")));
+
+ result = makeStringInfo();
+
+ appendStringInfoChar(result, '{');
+
+ for (i = 0; i < nargs; i += 2)
+ {
+ appendStringInfoString(result, sep);
+ sep = ", ";
+
+ /* process key */
+ if (nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument %d cannot be null", i + 1),
+ errhint("Object keys should be text.")));
+
+ add_json(args[i], false, result, types[i], true);
+
+ appendStringInfoString(result, " : ");
+
+ /* process value */
+ add_json(args[i + 1], nulls[i + 1], result, types[i + 1], false);
+ }
+
+ appendStringInfoChar(result, '}');
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * degenerate case of json_build_object where it gets 0 arguments.
+ */
+Datum
+json_build_object_noargs(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TEXT_P(cstring_to_text_with_len("{}", 2));
+}
+
+/*
+ * SQL function json_build_array(variadic "any")
+ */
+Datum
+json_build_array(PG_FUNCTION_ARGS)
+{
+ int nargs;
+ int i;
+ const char *sep = "";
+ StringInfo result;
+ Datum *args;
+ bool *nulls;
+ Oid *types;
+
+ /* fetch argument values to build the array */
+ nargs = extract_variadic_args(fcinfo, 0, false, &args, &types, &nulls);
+
+ if (nargs < 0)
+ PG_RETURN_NULL();
+
+ result = makeStringInfo();
+
+ appendStringInfoChar(result, '[');
+
+ for (i = 0; i < nargs; i++)
+ {
+ appendStringInfoString(result, sep);
+ sep = ", ";
+ add_json(args[i], nulls[i], result, types[i], false);
+ }
+
+ appendStringInfoChar(result, ']');
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len));
+}
+
+/*
+ * degenerate case of json_build_array where it gets 0 arguments.
+ */
+Datum
+json_build_array_noargs(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TEXT_P(cstring_to_text_with_len("[]", 2));
+}
+
+/*
+ * SQL function json_object(text[])
+ *
+ * take a one or two dimensional array of text as key/value pairs
+ * for a json object.
+ */
+Datum
+json_object(PG_FUNCTION_ARGS)
+{
+ ArrayType *in_array = PG_GETARG_ARRAYTYPE_P(0);
+ int ndims = ARR_NDIM(in_array);
+ StringInfoData result;
+ Datum *in_datums;
+ bool *in_nulls;
+ int in_count,
+ count,
+ i;
+ text *rval;
+ char *v;
+
+ switch (ndims)
+ {
+ case 0:
+ PG_RETURN_DATUM(CStringGetTextDatum("{}"));
+ break;
+
+ case 1:
+ if ((ARR_DIMS(in_array)[0]) % 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array must have even number of elements")));
+ break;
+
+ case 2:
+ if ((ARR_DIMS(in_array)[1]) != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array must have two columns")));
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+ }
+
+ deconstruct_array(in_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &in_datums, &in_nulls, &in_count);
+
+ count = in_count / 2;
+
+ initStringInfo(&result);
+
+ appendStringInfoChar(&result, '{');
+
+ for (i = 0; i < count; ++i)
+ {
+ if (in_nulls[i * 2])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null value not allowed for object key")));
+
+ v = TextDatumGetCString(in_datums[i * 2]);
+ if (i > 0)
+ appendStringInfoString(&result, ", ");
+ escape_json(&result, v);
+ appendStringInfoString(&result, " : ");
+ pfree(v);
+ if (in_nulls[i * 2 + 1])
+ appendStringInfoString(&result, "null");
+ else
+ {
+ v = TextDatumGetCString(in_datums[i * 2 + 1]);
+ escape_json(&result, v);
+ pfree(v);
+ }
+ }
+
+ appendStringInfoChar(&result, '}');
+
+ pfree(in_datums);
+ pfree(in_nulls);
+
+ rval = cstring_to_text_with_len(result.data, result.len);
+ pfree(result.data);
+
+ PG_RETURN_TEXT_P(rval);
+}
+
+/*
+ * SQL function json_object(text[], text[])
+ *
+ * take separate key and value arrays of text to construct a json object
+ * pairwise.
+ */
+Datum
+json_object_two_arg(PG_FUNCTION_ARGS)
+{
+ ArrayType *key_array = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType *val_array = PG_GETARG_ARRAYTYPE_P(1);
+ int nkdims = ARR_NDIM(key_array);
+ int nvdims = ARR_NDIM(val_array);
+ StringInfoData result;
+ Datum *key_datums,
+ *val_datums;
+ bool *key_nulls,
+ *val_nulls;
+ int key_count,
+ val_count,
+ i;
+ text *rval;
+ char *v;
+
+ if (nkdims > 1 || nkdims != nvdims)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (nkdims == 0)
+ PG_RETURN_DATUM(CStringGetTextDatum("{}"));
+
+ deconstruct_array(key_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &key_datums, &key_nulls, &key_count);
+
+ deconstruct_array(val_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &val_datums, &val_nulls, &val_count);
+
+ if (key_count != val_count)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("mismatched array dimensions")));
+
+ initStringInfo(&result);
+
+ appendStringInfoChar(&result, '{');
+
+ for (i = 0; i < key_count; ++i)
+ {
+ if (key_nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null value not allowed for object key")));
+
+ v = TextDatumGetCString(key_datums[i]);
+ if (i > 0)
+ appendStringInfoString(&result, ", ");
+ escape_json(&result, v);
+ appendStringInfoString(&result, " : ");
+ pfree(v);
+ if (val_nulls[i])
+ appendStringInfoString(&result, "null");
+ else
+ {
+ v = TextDatumGetCString(val_datums[i]);
+ escape_json(&result, v);
+ pfree(v);
+ }
+ }
+
+ appendStringInfoChar(&result, '}');
+
+ pfree(key_datums);
+ pfree(key_nulls);
+ pfree(val_datums);
+ pfree(val_nulls);
+
+ rval = cstring_to_text_with_len(result.data, result.len);
+ pfree(result.data);
+
+ PG_RETURN_TEXT_P(rval);
+}
+
+
+/*
+ * Produce a JSON string literal, properly escaping characters in the text.
+ */
+void
+escape_json(StringInfo buf, const char *str)
+{
+ const char *p;
+
+ appendStringInfoCharMacro(buf, '"');
+ for (p = str; *p; p++)
+ {
+ switch (*p)
+ {
+ case '\b':
+ appendStringInfoString(buf, "\\b");
+ break;
+ case '\f':
+ appendStringInfoString(buf, "\\f");
+ break;
+ case '\n':
+ appendStringInfoString(buf, "\\n");
+ break;
+ case '\r':
+ appendStringInfoString(buf, "\\r");
+ break;
+ case '\t':
+ appendStringInfoString(buf, "\\t");
+ break;
+ case '"':
+ appendStringInfoString(buf, "\\\"");
+ break;
+ case '\\':
+ appendStringInfoString(buf, "\\\\");
+ break;
+ default:
+ if ((unsigned char) *p < ' ')
+ appendStringInfo(buf, "\\u%04x", (int) *p);
+ else
+ appendStringInfoCharMacro(buf, *p);
+ break;
+ }
+ }
+ appendStringInfoCharMacro(buf, '"');
+}
+
+/*
+ * SQL function json_typeof(json) -> text
+ *
+ * Returns the type of the outermost JSON value as TEXT. Possible types are
+ * "object", "array", "string", "number", "boolean", and "null".
+ *
+ * Performs a single call to json_lex() to get the first token of the supplied
+ * value. This initial token uniquely determines the value's type. As our
+ * input must already have been validated by json_in() or json_recv(), the
+ * initial token should never be JSON_TOKEN_OBJECT_END, JSON_TOKEN_ARRAY_END,
+ * JSON_TOKEN_COLON, JSON_TOKEN_COMMA, or JSON_TOKEN_END.
+ */
+Datum
+json_typeof(PG_FUNCTION_ARGS)
+{
+ text *json;
+
+ JsonLexContext *lex;
+ JsonTokenType tok;
+ char *type;
+ JsonParseErrorType result;
+
+ json = PG_GETARG_TEXT_PP(0);
+ lex = makeJsonLexContext(json, false);
+
+ /* Lex exactly one token from the input and check its type. */
+ result = json_lex(lex);
+ if (result != JSON_SUCCESS)
+ json_ereport_error(result, lex);
+ tok = lex->token_type;
+ switch (tok)
+ {
+ case JSON_TOKEN_OBJECT_START:
+ type = "object";
+ break;
+ case JSON_TOKEN_ARRAY_START:
+ type = "array";
+ break;
+ case JSON_TOKEN_STRING:
+ type = "string";
+ break;
+ case JSON_TOKEN_NUMBER:
+ type = "number";
+ break;
+ case JSON_TOKEN_TRUE:
+ case JSON_TOKEN_FALSE:
+ type = "boolean";
+ break;
+ case JSON_TOKEN_NULL:
+ type = "null";
+ break;
+ default:
+ elog(ERROR, "unexpected json token: %d", tok);
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(type));
+}
diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
new file mode 100644
index 0000000..d253ae6
--- /dev/null
+++ b/src/backend/utils/adt/jsonb.c
@@ -0,0 +1,2086 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonb.c
+ * I/O routines for jsonb type
+ *
+ * Copyright (c) 2014-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/transam.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "parser/parse_coerce.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/json.h"
+#include "utils/jsonb.h"
+#include "utils/jsonfuncs.h"
+#include "utils/lsyscache.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+typedef struct JsonbInState
+{
+ JsonbParseState *parseState;
+ JsonbValue *res;
+} JsonbInState;
+
+/* unlike with json categories, we need to treat json and jsonb differently */
+typedef enum /* type categories for datum_to_jsonb */
+{
+ JSONBTYPE_NULL, /* null, so we didn't bother to identify */
+ JSONBTYPE_BOOL, /* boolean (built-in types only) */
+ JSONBTYPE_NUMERIC, /* numeric (ditto) */
+ JSONBTYPE_DATE, /* we use special formatting for datetimes */
+ JSONBTYPE_TIMESTAMP, /* we use special formatting for timestamp */
+ JSONBTYPE_TIMESTAMPTZ, /* ... and timestamptz */
+ JSONBTYPE_JSON, /* JSON */
+ JSONBTYPE_JSONB, /* JSONB */
+ JSONBTYPE_ARRAY, /* array */
+ JSONBTYPE_COMPOSITE, /* composite */
+ JSONBTYPE_JSONCAST, /* something with an explicit cast to JSON */
+ JSONBTYPE_OTHER /* all else */
+} JsonbTypeCategory;
+
+typedef struct JsonbAggState
+{
+ JsonbInState *res;
+ JsonbTypeCategory key_category;
+ Oid key_output_func;
+ JsonbTypeCategory val_category;
+ Oid val_output_func;
+} JsonbAggState;
+
+static inline Datum jsonb_from_cstring(char *json, int len);
+static size_t checkStringLen(size_t len);
+static void jsonb_in_object_start(void *pstate);
+static void jsonb_in_object_end(void *pstate);
+static void jsonb_in_array_start(void *pstate);
+static void jsonb_in_array_end(void *pstate);
+static void jsonb_in_object_field_start(void *pstate, char *fname, bool isnull);
+static void jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal);
+static void jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype);
+static void jsonb_categorize_type(Oid typoid,
+ JsonbTypeCategory *tcategory,
+ Oid *outfuncoid);
+static void composite_to_jsonb(Datum composite, JsonbInState *result);
+static void array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims,
+ Datum *vals, bool *nulls, int *valcount,
+ JsonbTypeCategory tcategory, Oid outfuncoid);
+static void array_to_jsonb_internal(Datum array, JsonbInState *result);
+static void jsonb_categorize_type(Oid typoid,
+ JsonbTypeCategory *tcategory,
+ Oid *outfuncoid);
+static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
+ JsonbTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar);
+static void add_jsonb(Datum val, bool is_null, JsonbInState *result,
+ Oid val_type, bool key_scalar);
+static JsonbParseState *clone_parse_state(JsonbParseState *state);
+static char *JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len, bool indent);
+static void add_indent(StringInfo out, bool indent, int level);
+
+/*
+ * jsonb type input function
+ */
+Datum
+jsonb_in(PG_FUNCTION_ARGS)
+{
+ char *json = PG_GETARG_CSTRING(0);
+
+ return jsonb_from_cstring(json, strlen(json));
+}
+
+/*
+ * jsonb type recv function
+ *
+ * The type is sent as text in binary mode, so this is almost the same
+ * as the input function, but it's prefixed with a version number so we
+ * can change the binary format sent in future if necessary. For now,
+ * only version 1 is supported.
+ */
+Datum
+jsonb_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ int version = pq_getmsgint(buf, 1);
+ char *str;
+ int nbytes;
+
+ if (version == 1)
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ else
+ elog(ERROR, "unsupported jsonb version number %d", version);
+
+ return jsonb_from_cstring(str, nbytes);
+}
+
+/*
+ * jsonb type output function
+ */
+Datum
+jsonb_out(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ char *out;
+
+ out = JsonbToCString(NULL, &jb->root, VARSIZE(jb));
+
+ PG_RETURN_CSTRING(out);
+}
+
+/*
+ * jsonb type send function
+ *
+ * Just send jsonb as a version number, then a string of text
+ */
+Datum
+jsonb_send(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ StringInfoData buf;
+ StringInfo jtext = makeStringInfo();
+ int version = 1;
+
+ (void) JsonbToCString(jtext, &jb->root, VARSIZE(jb));
+
+ pq_begintypsend(&buf);
+ pq_sendint8(&buf, version);
+ pq_sendtext(&buf, jtext->data, jtext->len);
+ pfree(jtext->data);
+ pfree(jtext);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * Get the type name of a jsonb container.
+ */
+static const char *
+JsonbContainerTypeName(JsonbContainer *jbc)
+{
+ JsonbValue scalar;
+
+ if (JsonbExtractScalar(jbc, &scalar))
+ return JsonbTypeName(&scalar);
+ else if (JsonContainerIsArray(jbc))
+ return "array";
+ else if (JsonContainerIsObject(jbc))
+ return "object";
+ else
+ {
+ elog(ERROR, "invalid jsonb container type: 0x%08x", jbc->header);
+ return "unknown";
+ }
+}
+
+/*
+ * Get the type name of a jsonb value.
+ */
+const char *
+JsonbTypeName(JsonbValue *jbv)
+{
+ switch (jbv->type)
+ {
+ case jbvBinary:
+ return JsonbContainerTypeName(jbv->val.binary.data);
+ case jbvObject:
+ return "object";
+ case jbvArray:
+ return "array";
+ case jbvNumeric:
+ return "number";
+ case jbvString:
+ return "string";
+ case jbvBool:
+ return "boolean";
+ case jbvNull:
+ return "null";
+ case jbvDatetime:
+ switch (jbv->val.datetime.typid)
+ {
+ case DATEOID:
+ return "date";
+ case TIMEOID:
+ return "time without time zone";
+ case TIMETZOID:
+ return "time with time zone";
+ case TIMESTAMPOID:
+ return "timestamp without time zone";
+ case TIMESTAMPTZOID:
+ return "timestamp with time zone";
+ default:
+ elog(ERROR, "unrecognized jsonb value datetime type: %d",
+ jbv->val.datetime.typid);
+ }
+ return "unknown";
+ default:
+ elog(ERROR, "unrecognized jsonb value type: %d", jbv->type);
+ return "unknown";
+ }
+}
+
+/*
+ * SQL function jsonb_typeof(jsonb) -> text
+ *
+ * This function is here because the analog json function is in json.c, since
+ * it uses the json parser internals not exposed elsewhere.
+ */
+Datum
+jsonb_typeof(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ const char *result = JsonbContainerTypeName(&in->root);
+
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
+
+/*
+ * jsonb_from_cstring
+ *
+ * Turns json string into a jsonb Datum.
+ *
+ * Uses the json parser (with hooks) to construct a jsonb.
+ */
+static inline Datum
+jsonb_from_cstring(char *json, int len)
+{
+ JsonLexContext *lex;
+ JsonbInState state;
+ JsonSemAction sem;
+
+ memset(&state, 0, sizeof(state));
+ memset(&sem, 0, sizeof(sem));
+ lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
+
+ sem.semstate = (void *) &state;
+
+ sem.object_start = jsonb_in_object_start;
+ sem.array_start = jsonb_in_array_start;
+ sem.object_end = jsonb_in_object_end;
+ sem.array_end = jsonb_in_array_end;
+ sem.scalar = jsonb_in_scalar;
+ sem.object_field_start = jsonb_in_object_field_start;
+
+ pg_parse_json_or_ereport(lex, &sem);
+
+ /* after parsing, the item member has the composed jsonb structure */
+ PG_RETURN_POINTER(JsonbValueToJsonb(state.res));
+}
+
+static size_t
+checkStringLen(size_t len)
+{
+ if (len > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("string too long to represent as jsonb string"),
+ errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
+ JENTRY_OFFLENMASK)));
+
+ return len;
+}
+
+static void
+jsonb_in_object_start(void *pstate)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_OBJECT, NULL);
+}
+
+static void
+jsonb_in_object_end(void *pstate)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_END_OBJECT, NULL);
+}
+
+static void
+jsonb_in_array_start(void *pstate)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_ARRAY, NULL);
+}
+
+static void
+jsonb_in_array_end(void *pstate)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_END_ARRAY, NULL);
+}
+
+static void
+jsonb_in_object_field_start(void *pstate, char *fname, bool isnull)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+ JsonbValue v;
+
+ Assert(fname != NULL);
+ v.type = jbvString;
+ v.val.string.len = checkStringLen(strlen(fname));
+ v.val.string.val = fname;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_KEY, &v);
+}
+
+static void
+jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)
+{
+ switch (scalarVal->type)
+ {
+ case jbvNull:
+ appendBinaryStringInfo(out, "null", 4);
+ break;
+ case jbvString:
+ escape_json(out, pnstrdup(scalarVal->val.string.val, scalarVal->val.string.len));
+ break;
+ case jbvNumeric:
+ appendStringInfoString(out,
+ DatumGetCString(DirectFunctionCall1(numeric_out,
+ PointerGetDatum(scalarVal->val.numeric))));
+ break;
+ case jbvBool:
+ if (scalarVal->val.boolean)
+ appendBinaryStringInfo(out, "true", 4);
+ else
+ appendBinaryStringInfo(out, "false", 5);
+ break;
+ default:
+ elog(ERROR, "unknown jsonb scalar type");
+ }
+}
+
+/*
+ * For jsonb we always want the de-escaped value - that's what's in token
+ */
+static void
+jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
+{
+ JsonbInState *_state = (JsonbInState *) pstate;
+ JsonbValue v;
+ Datum numd;
+
+ switch (tokentype)
+ {
+
+ case JSON_TOKEN_STRING:
+ Assert(token != NULL);
+ v.type = jbvString;
+ v.val.string.len = checkStringLen(strlen(token));
+ v.val.string.val = token;
+ break;
+ case JSON_TOKEN_NUMBER:
+
+ /*
+ * No need to check size of numeric values, because maximum
+ * numeric size is well below the JsonbValue restriction
+ */
+ Assert(token != NULL);
+ v.type = jbvNumeric;
+ numd = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(token),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ v.val.numeric = DatumGetNumeric(numd);
+ break;
+ case JSON_TOKEN_TRUE:
+ v.type = jbvBool;
+ v.val.boolean = true;
+ break;
+ case JSON_TOKEN_FALSE:
+ v.type = jbvBool;
+ v.val.boolean = false;
+ break;
+ case JSON_TOKEN_NULL:
+ v.type = jbvNull;
+ break;
+ default:
+ /* should not be possible */
+ elog(ERROR, "invalid json token type");
+ break;
+ }
+
+ if (_state->parseState == NULL)
+ {
+ /* single scalar */
+ JsonbValue va;
+
+ va.type = jbvArray;
+ va.val.array.rawScalar = true;
+ va.val.array.nElems = 1;
+
+ _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_ARRAY, &va);
+ _state->res = pushJsonbValue(&_state->parseState, WJB_ELEM, &v);
+ _state->res = pushJsonbValue(&_state->parseState, WJB_END_ARRAY, NULL);
+ }
+ else
+ {
+ JsonbValue *o = &_state->parseState->contVal;
+
+ switch (o->type)
+ {
+ case jbvArray:
+ _state->res = pushJsonbValue(&_state->parseState, WJB_ELEM, &v);
+ break;
+ case jbvObject:
+ _state->res = pushJsonbValue(&_state->parseState, WJB_VALUE, &v);
+ break;
+ default:
+ elog(ERROR, "unexpected parent of nested structure");
+ }
+ }
+}
+
+/*
+ * JsonbToCString
+ * Converts jsonb value to a C-string.
+ *
+ * If 'out' argument is non-null, the resulting C-string is stored inside the
+ * StringBuffer. The resulting string is always returned.
+ *
+ * A typical case for passing the StringInfo in rather than NULL is where the
+ * caller wants access to the len attribute without having to call strlen, e.g.
+ * if they are converting it to a text* object.
+ */
+char *
+JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len)
+{
+ return JsonbToCStringWorker(out, in, estimated_len, false);
+}
+
+/*
+ * same thing but with indentation turned on
+ */
+char *
+JsonbToCStringIndent(StringInfo out, JsonbContainer *in, int estimated_len)
+{
+ return JsonbToCStringWorker(out, in, estimated_len, true);
+}
+
+/*
+ * common worker for above two functions
+ */
+static char *
+JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len, bool indent)
+{
+ bool first = true;
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken type = WJB_DONE;
+ int level = 0;
+ bool redo_switch = false;
+
+ /* If we are indenting, don't add a space after a comma */
+ int ispaces = indent ? 1 : 2;
+
+ /*
+ * Don't indent the very first item. This gets set to the indent flag at
+ * the bottom of the loop.
+ */
+ bool use_indent = false;
+ bool raw_scalar = false;
+ bool last_was_key = false;
+
+ if (out == NULL)
+ out = makeStringInfo();
+
+ enlargeStringInfo(out, (estimated_len >= 0) ? estimated_len : 64);
+
+ it = JsonbIteratorInit(in);
+
+ while (redo_switch ||
+ ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE))
+ {
+ redo_switch = false;
+ switch (type)
+ {
+ case WJB_BEGIN_ARRAY:
+ if (!first)
+ appendBinaryStringInfo(out, ", ", ispaces);
+
+ if (!v.val.array.rawScalar)
+ {
+ add_indent(out, use_indent && !last_was_key, level);
+ appendStringInfoCharMacro(out, '[');
+ }
+ else
+ raw_scalar = true;
+
+ first = true;
+ level++;
+ break;
+ case WJB_BEGIN_OBJECT:
+ if (!first)
+ appendBinaryStringInfo(out, ", ", ispaces);
+
+ add_indent(out, use_indent && !last_was_key, level);
+ appendStringInfoCharMacro(out, '{');
+
+ first = true;
+ level++;
+ break;
+ case WJB_KEY:
+ if (!first)
+ appendBinaryStringInfo(out, ", ", ispaces);
+ first = true;
+
+ add_indent(out, use_indent, level);
+
+ /* json rules guarantee this is a string */
+ jsonb_put_escaped_value(out, &v);
+ appendBinaryStringInfo(out, ": ", 2);
+
+ type = JsonbIteratorNext(&it, &v, false);
+ if (type == WJB_VALUE)
+ {
+ first = false;
+ jsonb_put_escaped_value(out, &v);
+ }
+ else
+ {
+ Assert(type == WJB_BEGIN_OBJECT || type == WJB_BEGIN_ARRAY);
+
+ /*
+ * We need to rerun the current switch() since we need to
+ * output the object which we just got from the iterator
+ * before calling the iterator again.
+ */
+ redo_switch = true;
+ }
+ break;
+ case WJB_ELEM:
+ if (!first)
+ appendBinaryStringInfo(out, ", ", ispaces);
+ first = false;
+
+ if (!raw_scalar)
+ add_indent(out, use_indent, level);
+ jsonb_put_escaped_value(out, &v);
+ break;
+ case WJB_END_ARRAY:
+ level--;
+ if (!raw_scalar)
+ {
+ add_indent(out, use_indent, level);
+ appendStringInfoCharMacro(out, ']');
+ }
+ first = false;
+ break;
+ case WJB_END_OBJECT:
+ level--;
+ add_indent(out, use_indent, level);
+ appendStringInfoCharMacro(out, '}');
+ first = false;
+ break;
+ default:
+ elog(ERROR, "unknown jsonb iterator token type");
+ }
+ use_indent = indent;
+ last_was_key = redo_switch;
+ }
+
+ Assert(level == 0);
+
+ return out->data;
+}
+
+static void
+add_indent(StringInfo out, bool indent, int level)
+{
+ if (indent)
+ {
+ int i;
+
+ appendStringInfoCharMacro(out, '\n');
+ for (i = 0; i < level; i++)
+ appendBinaryStringInfo(out, " ", 4);
+ }
+}
+
+
+/*
+ * Determine how we want to render values of a given type in datum_to_jsonb.
+ *
+ * Given the datatype OID, return its JsonbTypeCategory, as well as the type's
+ * output function OID. If the returned category is JSONBTYPE_JSONCAST,
+ * we return the OID of the relevant cast function instead.
+ */
+static void
+jsonb_categorize_type(Oid typoid,
+ JsonbTypeCategory *tcategory,
+ Oid *outfuncoid)
+{
+ bool typisvarlena;
+
+ /* Look through any domain */
+ typoid = getBaseType(typoid);
+
+ *outfuncoid = InvalidOid;
+
+ /*
+ * We need to get the output function for everything except date and
+ * timestamp types, booleans, array and composite types, json and jsonb,
+ * and non-builtin types where there's a cast to json. In this last case
+ * we return the oid of the cast function instead.
+ */
+
+ switch (typoid)
+ {
+ case BOOLOID:
+ *tcategory = JSONBTYPE_BOOL;
+ break;
+
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case NUMERICOID:
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ *tcategory = JSONBTYPE_NUMERIC;
+ break;
+
+ case DATEOID:
+ *tcategory = JSONBTYPE_DATE;
+ break;
+
+ case TIMESTAMPOID:
+ *tcategory = JSONBTYPE_TIMESTAMP;
+ break;
+
+ case TIMESTAMPTZOID:
+ *tcategory = JSONBTYPE_TIMESTAMPTZ;
+ break;
+
+ case JSONBOID:
+ *tcategory = JSONBTYPE_JSONB;
+ break;
+
+ case JSONOID:
+ *tcategory = JSONBTYPE_JSON;
+ break;
+
+ default:
+ /* Check for arrays and composites */
+ if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID
+ || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID)
+ *tcategory = JSONBTYPE_ARRAY;
+ else if (type_is_rowtype(typoid)) /* includes RECORDOID */
+ *tcategory = JSONBTYPE_COMPOSITE;
+ else
+ {
+ /* It's probably the general case ... */
+ *tcategory = JSONBTYPE_OTHER;
+
+ /*
+ * but first let's look for a cast to json (note: not to
+ * jsonb) if it's not built-in.
+ */
+ if (typoid >= FirstNormalObjectId)
+ {
+ Oid castfunc;
+ CoercionPathType ctype;
+
+ ctype = find_coercion_pathway(JSONOID, typoid,
+ COERCION_EXPLICIT, &castfunc);
+ if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc))
+ {
+ *tcategory = JSONBTYPE_JSONCAST;
+ *outfuncoid = castfunc;
+ }
+ else
+ {
+ /* not a cast type, so just get the usual output func */
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ }
+ }
+ else
+ {
+ /* any other builtin type */
+ getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
+ }
+ break;
+ }
+ }
+}
+
+/*
+ * Turn a Datum into jsonb, adding it to the result JsonbInState.
+ *
+ * tcategory and outfuncoid are from a previous call to json_categorize_type,
+ * except that if is_null is true then they can be invalid.
+ *
+ * If key_scalar is true, the value is stored as a key, so insist
+ * it's of an acceptable type, and force it to be a jbvString.
+ */
+static void
+datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
+ JsonbTypeCategory tcategory, Oid outfuncoid,
+ bool key_scalar)
+{
+ char *outputstr;
+ bool numeric_error;
+ JsonbValue jb;
+ bool scalar_jsonb = false;
+
+ check_stack_depth();
+
+ /* Convert val to a JsonbValue in jb (in most cases) */
+ if (is_null)
+ {
+ Assert(!key_scalar);
+ jb.type = jbvNull;
+ }
+ else if (key_scalar &&
+ (tcategory == JSONBTYPE_ARRAY ||
+ tcategory == JSONBTYPE_COMPOSITE ||
+ tcategory == JSONBTYPE_JSON ||
+ tcategory == JSONBTYPE_JSONB ||
+ tcategory == JSONBTYPE_JSONCAST))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("key value must be scalar, not array, composite, or json")));
+ }
+ else
+ {
+ if (tcategory == JSONBTYPE_JSONCAST)
+ val = OidFunctionCall1(outfuncoid, val);
+
+ switch (tcategory)
+ {
+ case JSONBTYPE_ARRAY:
+ array_to_jsonb_internal(val, result);
+ break;
+ case JSONBTYPE_COMPOSITE:
+ composite_to_jsonb(val, result);
+ break;
+ case JSONBTYPE_BOOL:
+ if (key_scalar)
+ {
+ outputstr = DatumGetBool(val) ? "true" : "false";
+ jb.type = jbvString;
+ jb.val.string.len = strlen(outputstr);
+ jb.val.string.val = outputstr;
+ }
+ else
+ {
+ jb.type = jbvBool;
+ jb.val.boolean = DatumGetBool(val);
+ }
+ break;
+ case JSONBTYPE_NUMERIC:
+ outputstr = OidOutputFunctionCall(outfuncoid, val);
+ if (key_scalar)
+ {
+ /* always quote keys */
+ jb.type = jbvString;
+ jb.val.string.len = strlen(outputstr);
+ jb.val.string.val = outputstr;
+ }
+ else
+ {
+ /*
+ * Make it numeric if it's a valid JSON number, otherwise
+ * a string. Invalid numeric output will always have an
+ * 'N' or 'n' in it (I think).
+ */
+ numeric_error = (strchr(outputstr, 'N') != NULL ||
+ strchr(outputstr, 'n') != NULL);
+ if (!numeric_error)
+ {
+ Datum numd;
+
+ jb.type = jbvNumeric;
+ numd = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(outputstr),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ jb.val.numeric = DatumGetNumeric(numd);
+ pfree(outputstr);
+ }
+ else
+ {
+ jb.type = jbvString;
+ jb.val.string.len = strlen(outputstr);
+ jb.val.string.val = outputstr;
+ }
+ }
+ break;
+ case JSONBTYPE_DATE:
+ jb.type = jbvString;
+ jb.val.string.val = JsonEncodeDateTime(NULL, val,
+ DATEOID, NULL);
+ jb.val.string.len = strlen(jb.val.string.val);
+ break;
+ case JSONBTYPE_TIMESTAMP:
+ jb.type = jbvString;
+ jb.val.string.val = JsonEncodeDateTime(NULL, val,
+ TIMESTAMPOID, NULL);
+ jb.val.string.len = strlen(jb.val.string.val);
+ break;
+ case JSONBTYPE_TIMESTAMPTZ:
+ jb.type = jbvString;
+ jb.val.string.val = JsonEncodeDateTime(NULL, val,
+ TIMESTAMPTZOID, NULL);
+ jb.val.string.len = strlen(jb.val.string.val);
+ break;
+ case JSONBTYPE_JSONCAST:
+ case JSONBTYPE_JSON:
+ {
+ /* parse the json right into the existing result object */
+ JsonLexContext *lex;
+ JsonSemAction sem;
+ text *json = DatumGetTextPP(val);
+
+ lex = makeJsonLexContext(json, true);
+
+ memset(&sem, 0, sizeof(sem));
+
+ sem.semstate = (void *) result;
+
+ sem.object_start = jsonb_in_object_start;
+ sem.array_start = jsonb_in_array_start;
+ sem.object_end = jsonb_in_object_end;
+ sem.array_end = jsonb_in_array_end;
+ sem.scalar = jsonb_in_scalar;
+ sem.object_field_start = jsonb_in_object_field_start;
+
+ pg_parse_json_or_ereport(lex, &sem);
+ }
+ break;
+ case JSONBTYPE_JSONB:
+ {
+ Jsonb *jsonb = DatumGetJsonbP(val);
+ JsonbIterator *it;
+
+ it = JsonbIteratorInit(&jsonb->root);
+
+ if (JB_ROOT_IS_SCALAR(jsonb))
+ {
+ (void) JsonbIteratorNext(&it, &jb, true);
+ Assert(jb.type == jbvArray);
+ (void) JsonbIteratorNext(&it, &jb, true);
+ scalar_jsonb = true;
+ }
+ else
+ {
+ JsonbIteratorToken type;
+
+ while ((type = JsonbIteratorNext(&it, &jb, false))
+ != WJB_DONE)
+ {
+ if (type == WJB_END_ARRAY || type == WJB_END_OBJECT ||
+ type == WJB_BEGIN_ARRAY || type == WJB_BEGIN_OBJECT)
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ else
+ result->res = pushJsonbValue(&result->parseState,
+ type, &jb);
+ }
+ }
+ }
+ break;
+ default:
+ outputstr = OidOutputFunctionCall(outfuncoid, val);
+ jb.type = jbvString;
+ jb.val.string.len = checkStringLen(strlen(outputstr));
+ jb.val.string.val = outputstr;
+ break;
+ }
+ }
+
+ /* Now insert jb into result, unless we did it recursively */
+ if (!is_null && !scalar_jsonb &&
+ tcategory >= JSONBTYPE_JSON && tcategory <= JSONBTYPE_JSONCAST)
+ {
+ /* work has been done recursively */
+ return;
+ }
+ else if (result->parseState == NULL)
+ {
+ /* single root scalar */
+ JsonbValue va;
+
+ va.type = jbvArray;
+ va.val.array.rawScalar = true;
+ va.val.array.nElems = 1;
+
+ result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_ARRAY, &va);
+ result->res = pushJsonbValue(&result->parseState, WJB_ELEM, &jb);
+ result->res = pushJsonbValue(&result->parseState, WJB_END_ARRAY, NULL);
+ }
+ else
+ {
+ JsonbValue *o = &result->parseState->contVal;
+
+ switch (o->type)
+ {
+ case jbvArray:
+ result->res = pushJsonbValue(&result->parseState, WJB_ELEM, &jb);
+ break;
+ case jbvObject:
+ result->res = pushJsonbValue(&result->parseState,
+ key_scalar ? WJB_KEY : WJB_VALUE,
+ &jb);
+ break;
+ default:
+ elog(ERROR, "unexpected parent of nested structure");
+ }
+ }
+}
+
+/*
+ * Process a single dimension of an array.
+ * If it's the innermost dimension, output the values, otherwise call
+ * ourselves recursively to process the next dimension.
+ */
+static void
+array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, Datum *vals,
+ bool *nulls, int *valcount, JsonbTypeCategory tcategory,
+ Oid outfuncoid)
+{
+ int i;
+
+ Assert(dim < ndims);
+
+ result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_ARRAY, NULL);
+
+ for (i = 1; i <= dims[dim]; i++)
+ {
+ if (dim + 1 == ndims)
+ {
+ datum_to_jsonb(vals[*valcount], nulls[*valcount], result, tcategory,
+ outfuncoid, false);
+ (*valcount)++;
+ }
+ else
+ {
+ array_dim_to_jsonb(result, dim + 1, ndims, dims, vals, nulls,
+ valcount, tcategory, outfuncoid);
+ }
+ }
+
+ result->res = pushJsonbValue(&result->parseState, WJB_END_ARRAY, NULL);
+}
+
+/*
+ * Turn an array into JSON.
+ */
+static void
+array_to_jsonb_internal(Datum array, JsonbInState *result)
+{
+ ArrayType *v = DatumGetArrayTypeP(array);
+ Oid element_type = ARR_ELEMTYPE(v);
+ int *dim;
+ int ndim;
+ int nitems;
+ int count = 0;
+ Datum *elements;
+ bool *nulls;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ JsonbTypeCategory tcategory;
+ Oid outfuncoid;
+
+ ndim = ARR_NDIM(v);
+ dim = ARR_DIMS(v);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ if (nitems <= 0)
+ {
+ result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_ARRAY, NULL);
+ result->res = pushJsonbValue(&result->parseState, WJB_END_ARRAY, NULL);
+ return;
+ }
+
+ get_typlenbyvalalign(element_type,
+ &typlen, &typbyval, &typalign);
+
+ jsonb_categorize_type(element_type,
+ &tcategory, &outfuncoid);
+
+ deconstruct_array(v, element_type, typlen, typbyval,
+ typalign, &elements, &nulls,
+ &nitems);
+
+ array_dim_to_jsonb(result, 0, ndim, dim, elements, nulls, &count, tcategory,
+ outfuncoid);
+
+ pfree(elements);
+ pfree(nulls);
+}
+
+/*
+ * Turn a composite / record into JSON.
+ */
+static void
+composite_to_jsonb(Datum composite, JsonbInState *result)
+{
+ HeapTupleHeader td;
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tmptup,
+ *tuple;
+ int i;
+
+ td = DatumGetHeapTupleHeader(composite);
+
+ /* Extract rowtype info and find a tupdesc */
+ tupType = HeapTupleHeaderGetTypeId(td);
+ tupTypmod = HeapTupleHeaderGetTypMod(td);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+
+ /* Build a temporary HeapTuple control structure */
+ tmptup.t_len = HeapTupleHeaderGetDatumLength(td);
+ tmptup.t_data = td;
+ tuple = &tmptup;
+
+ result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_OBJECT, NULL);
+
+ for (i = 0; i < tupdesc->natts; i++)
+ {
+ Datum val;
+ bool isnull;
+ char *attname;
+ JsonbTypeCategory tcategory;
+ Oid outfuncoid;
+ JsonbValue v;
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+
+ attname = NameStr(att->attname);
+
+ v.type = jbvString;
+ /* don't need checkStringLen here - can't exceed maximum name length */
+ v.val.string.len = strlen(attname);
+ v.val.string.val = attname;
+
+ result->res = pushJsonbValue(&result->parseState, WJB_KEY, &v);
+
+ val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
+
+ if (isnull)
+ {
+ tcategory = JSONBTYPE_NULL;
+ outfuncoid = InvalidOid;
+ }
+ else
+ jsonb_categorize_type(att->atttypid, &tcategory, &outfuncoid);
+
+ datum_to_jsonb(val, isnull, result, tcategory, outfuncoid, false);
+ }
+
+ result->res = pushJsonbValue(&result->parseState, WJB_END_OBJECT, NULL);
+ ReleaseTupleDesc(tupdesc);
+}
+
+/*
+ * Append JSON text for "val" to "result".
+ *
+ * This is just a thin wrapper around datum_to_jsonb. If the same type will be
+ * printed many times, avoid using this; better to do the jsonb_categorize_type
+ * lookups only once.
+ */
+
+static void
+add_jsonb(Datum val, bool is_null, JsonbInState *result,
+ Oid val_type, bool key_scalar)
+{
+ JsonbTypeCategory tcategory;
+ Oid outfuncoid;
+
+ if (val_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ if (is_null)
+ {
+ tcategory = JSONBTYPE_NULL;
+ outfuncoid = InvalidOid;
+ }
+ else
+ jsonb_categorize_type(val_type,
+ &tcategory, &outfuncoid);
+
+ datum_to_jsonb(val, is_null, result, tcategory, outfuncoid, key_scalar);
+}
+
+/*
+ * SQL function to_jsonb(anyvalue)
+ */
+Datum
+to_jsonb(PG_FUNCTION_ARGS)
+{
+ Datum val = PG_GETARG_DATUM(0);
+ Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ JsonbInState result;
+ JsonbTypeCategory tcategory;
+ Oid outfuncoid;
+
+ if (val_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ jsonb_categorize_type(val_type,
+ &tcategory, &outfuncoid);
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ datum_to_jsonb(val, false, &result, tcategory, outfuncoid, false);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+/*
+ * SQL function jsonb_build_object(variadic "any")
+ */
+Datum
+jsonb_build_object(PG_FUNCTION_ARGS)
+{
+ int nargs;
+ int i;
+ JsonbInState result;
+ Datum *args;
+ bool *nulls;
+ Oid *types;
+
+ /* build argument values to build the object */
+ nargs = extract_variadic_args(fcinfo, 0, true, &args, &types, &nulls);
+
+ if (nargs < 0)
+ PG_RETURN_NULL();
+
+ if (nargs % 2 != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument list must have even number of elements"),
+ /* translator: %s is a SQL function name */
+ errhint("The arguments of %s must consist of alternating keys and values.",
+ "jsonb_build_object()")));
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL);
+
+ for (i = 0; i < nargs; i += 2)
+ {
+ /* process key */
+ if (nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument %d: key must not be null", i + 1)));
+
+ add_jsonb(args[i], false, &result, types[i], true);
+
+ /* process value */
+ add_jsonb(args[i + 1], nulls[i + 1], &result, types[i + 1], false);
+ }
+
+ result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+/*
+ * degenerate case of jsonb_build_object where it gets 0 arguments.
+ */
+Datum
+jsonb_build_object_noargs(PG_FUNCTION_ARGS)
+{
+ JsonbInState result;
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL);
+ result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+/*
+ * SQL function jsonb_build_array(variadic "any")
+ */
+Datum
+jsonb_build_array(PG_FUNCTION_ARGS)
+{
+ int nargs;
+ int i;
+ JsonbInState result;
+ Datum *args;
+ bool *nulls;
+ Oid *types;
+
+ /* build argument values to build the array */
+ nargs = extract_variadic_args(fcinfo, 0, true, &args, &types, &nulls);
+
+ if (nargs < 0)
+ PG_RETURN_NULL();
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ result.res = pushJsonbValue(&result.parseState, WJB_BEGIN_ARRAY, NULL);
+
+ for (i = 0; i < nargs; i++)
+ add_jsonb(args[i], nulls[i], &result, types[i], false);
+
+ result.res = pushJsonbValue(&result.parseState, WJB_END_ARRAY, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+/*
+ * degenerate case of jsonb_build_array where it gets 0 arguments.
+ */
+Datum
+jsonb_build_array_noargs(PG_FUNCTION_ARGS)
+{
+ JsonbInState result;
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ (void) pushJsonbValue(&result.parseState, WJB_BEGIN_ARRAY, NULL);
+ result.res = pushJsonbValue(&result.parseState, WJB_END_ARRAY, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+
+/*
+ * SQL function jsonb_object(text[])
+ *
+ * take a one or two dimensional array of text as name value pairs
+ * for a jsonb object.
+ *
+ */
+Datum
+jsonb_object(PG_FUNCTION_ARGS)
+{
+ ArrayType *in_array = PG_GETARG_ARRAYTYPE_P(0);
+ int ndims = ARR_NDIM(in_array);
+ Datum *in_datums;
+ bool *in_nulls;
+ int in_count,
+ count,
+ i;
+ JsonbInState result;
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL);
+
+ switch (ndims)
+ {
+ case 0:
+ goto close_object;
+ break;
+
+ case 1:
+ if ((ARR_DIMS(in_array)[0]) % 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array must have even number of elements")));
+ break;
+
+ case 2:
+ if ((ARR_DIMS(in_array)[1]) != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array must have two columns")));
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+ }
+
+ deconstruct_array(in_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &in_datums, &in_nulls, &in_count);
+
+ count = in_count / 2;
+
+ for (i = 0; i < count; ++i)
+ {
+ JsonbValue v;
+ char *str;
+ int len;
+
+ if (in_nulls[i * 2])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null value not allowed for object key")));
+
+ str = TextDatumGetCString(in_datums[i * 2]);
+ len = strlen(str);
+
+ v.type = jbvString;
+
+ v.val.string.len = len;
+ v.val.string.val = str;
+
+ (void) pushJsonbValue(&result.parseState, WJB_KEY, &v);
+
+ if (in_nulls[i * 2 + 1])
+ {
+ v.type = jbvNull;
+ }
+ else
+ {
+ str = TextDatumGetCString(in_datums[i * 2 + 1]);
+ len = strlen(str);
+
+ v.type = jbvString;
+
+ v.val.string.len = len;
+ v.val.string.val = str;
+ }
+
+ (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v);
+ }
+
+ pfree(in_datums);
+ pfree(in_nulls);
+
+close_object:
+ result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+/*
+ * SQL function jsonb_object(text[], text[])
+ *
+ * take separate name and value arrays of text to construct a jsonb object
+ * pairwise.
+ */
+Datum
+jsonb_object_two_arg(PG_FUNCTION_ARGS)
+{
+ ArrayType *key_array = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType *val_array = PG_GETARG_ARRAYTYPE_P(1);
+ int nkdims = ARR_NDIM(key_array);
+ int nvdims = ARR_NDIM(val_array);
+ Datum *key_datums,
+ *val_datums;
+ bool *key_nulls,
+ *val_nulls;
+ int key_count,
+ val_count,
+ i;
+ JsonbInState result;
+
+ memset(&result, 0, sizeof(JsonbInState));
+
+ (void) pushJsonbValue(&result.parseState, WJB_BEGIN_OBJECT, NULL);
+
+ if (nkdims > 1 || nkdims != nvdims)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (nkdims == 0)
+ goto close_object;
+
+ deconstruct_array(key_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &key_datums, &key_nulls, &key_count);
+
+ deconstruct_array(val_array,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &val_datums, &val_nulls, &val_count);
+
+ if (key_count != val_count)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("mismatched array dimensions")));
+
+ for (i = 0; i < key_count; ++i)
+ {
+ JsonbValue v;
+ char *str;
+ int len;
+
+ if (key_nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null value not allowed for object key")));
+
+ str = TextDatumGetCString(key_datums[i]);
+ len = strlen(str);
+
+ v.type = jbvString;
+
+ v.val.string.len = len;
+ v.val.string.val = str;
+
+ (void) pushJsonbValue(&result.parseState, WJB_KEY, &v);
+
+ if (val_nulls[i])
+ {
+ v.type = jbvNull;
+ }
+ else
+ {
+ str = TextDatumGetCString(val_datums[i]);
+ len = strlen(str);
+
+ v.type = jbvString;
+
+ v.val.string.len = len;
+ v.val.string.val = str;
+ }
+
+ (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v);
+ }
+
+ pfree(key_datums);
+ pfree(key_nulls);
+ pfree(val_datums);
+ pfree(val_nulls);
+
+close_object:
+ result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
+}
+
+
+/*
+ * shallow clone of a parse state, suitable for use in aggregate
+ * final functions that will only append to the values rather than
+ * change them.
+ */
+static JsonbParseState *
+clone_parse_state(JsonbParseState *state)
+{
+ JsonbParseState *result,
+ *icursor,
+ *ocursor;
+
+ if (state == NULL)
+ return NULL;
+
+ result = palloc(sizeof(JsonbParseState));
+ icursor = state;
+ ocursor = result;
+ for (;;)
+ {
+ ocursor->contVal = icursor->contVal;
+ ocursor->size = icursor->size;
+ icursor = icursor->next;
+ if (icursor == NULL)
+ break;
+ ocursor->next = palloc(sizeof(JsonbParseState));
+ ocursor = ocursor->next;
+ }
+ ocursor->next = NULL;
+
+ return result;
+}
+
+
+/*
+ * jsonb_agg aggregate function
+ */
+Datum
+jsonb_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext oldcontext,
+ aggcontext;
+ JsonbAggState *state;
+ JsonbInState elem;
+ Datum val;
+ JsonbInState *result;
+ bool single_scalar = false;
+ JsonbIterator *it;
+ Jsonb *jbelem;
+ JsonbValue v;
+ JsonbIteratorToken type;
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "jsonb_agg_transfn called in non-aggregate context");
+ }
+
+ /* set up the accumulator on the first go round */
+
+ if (PG_ARGISNULL(0))
+ {
+ Oid arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+ state = palloc(sizeof(JsonbAggState));
+ result = palloc0(sizeof(JsonbInState));
+ state->res = result;
+ result->res = pushJsonbValue(&result->parseState,
+ WJB_BEGIN_ARRAY, NULL);
+ MemoryContextSwitchTo(oldcontext);
+
+ jsonb_categorize_type(arg_type, &state->val_category,
+ &state->val_output_func);
+ }
+ else
+ {
+ state = (JsonbAggState *) PG_GETARG_POINTER(0);
+ result = state->res;
+ }
+
+ /* turn the argument into jsonb in the normal function context */
+
+ val = PG_ARGISNULL(1) ? (Datum) 0 : PG_GETARG_DATUM(1);
+
+ memset(&elem, 0, sizeof(JsonbInState));
+
+ datum_to_jsonb(val, PG_ARGISNULL(1), &elem, state->val_category,
+ state->val_output_func, false);
+
+ jbelem = JsonbValueToJsonb(elem.res);
+
+ /* switch to the aggregate context for accumulation operations */
+
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+
+ it = JsonbIteratorInit(&jbelem->root);
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (type)
+ {
+ case WJB_BEGIN_ARRAY:
+ if (v.val.array.rawScalar)
+ single_scalar = true;
+ else
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_END_ARRAY:
+ if (!single_scalar)
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_BEGIN_OBJECT:
+ case WJB_END_OBJECT:
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_ELEM:
+ case WJB_KEY:
+ case WJB_VALUE:
+ if (v.type == jbvString)
+ {
+ /* copy string values in the aggregate context */
+ char *buf = palloc(v.val.string.len + 1);
+
+ snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val);
+ v.val.string.val = buf;
+ }
+ else if (v.type == jbvNumeric)
+ {
+ /* same for numeric */
+ v.val.numeric =
+ DatumGetNumeric(DirectFunctionCall1(numeric_uplus,
+ NumericGetDatum(v.val.numeric)));
+ }
+ result->res = pushJsonbValue(&result->parseState,
+ type, &v);
+ break;
+ default:
+ elog(ERROR, "unknown jsonb iterator token type");
+ }
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+jsonb_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ JsonbAggState *arg;
+ JsonbInState result;
+ Jsonb *out;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL(); /* returns null iff no input values */
+
+ arg = (JsonbAggState *) PG_GETARG_POINTER(0);
+
+ /*
+ * We need to do a shallow clone of the argument in case the final
+ * function is called more than once, so we avoid changing the argument. A
+ * shallow clone is sufficient as we aren't going to change any of the
+ * values, just add the final array end marker.
+ */
+
+ result.parseState = clone_parse_state(arg->res->parseState);
+
+ result.res = pushJsonbValue(&result.parseState,
+ WJB_END_ARRAY, NULL);
+
+ out = JsonbValueToJsonb(result.res);
+
+ PG_RETURN_POINTER(out);
+}
+
+/*
+ * jsonb_object_agg aggregate function
+ */
+Datum
+jsonb_object_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext oldcontext,
+ aggcontext;
+ JsonbInState elem;
+ JsonbAggState *state;
+ Datum val;
+ JsonbInState *result;
+ bool single_scalar;
+ JsonbIterator *it;
+ Jsonb *jbkey,
+ *jbval;
+ JsonbValue v;
+ JsonbIteratorToken type;
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "jsonb_object_agg_transfn called in non-aggregate context");
+ }
+
+ /* set up the accumulator on the first go round */
+
+ if (PG_ARGISNULL(0))
+ {
+ Oid arg_type;
+
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+ state = palloc(sizeof(JsonbAggState));
+ result = palloc0(sizeof(JsonbInState));
+ state->res = result;
+ result->res = pushJsonbValue(&result->parseState,
+ WJB_BEGIN_OBJECT, NULL);
+ MemoryContextSwitchTo(oldcontext);
+
+ arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ jsonb_categorize_type(arg_type, &state->key_category,
+ &state->key_output_func);
+
+ arg_type = get_fn_expr_argtype(fcinfo->flinfo, 2);
+
+ if (arg_type == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine input data type")));
+
+ jsonb_categorize_type(arg_type, &state->val_category,
+ &state->val_output_func);
+ }
+ else
+ {
+ state = (JsonbAggState *) PG_GETARG_POINTER(0);
+ result = state->res;
+ }
+
+ /* turn the argument into jsonb in the normal function context */
+
+ if (PG_ARGISNULL(1))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("field name must not be null")));
+
+ val = PG_GETARG_DATUM(1);
+
+ memset(&elem, 0, sizeof(JsonbInState));
+
+ datum_to_jsonb(val, false, &elem, state->key_category,
+ state->key_output_func, true);
+
+ jbkey = JsonbValueToJsonb(elem.res);
+
+ val = PG_ARGISNULL(2) ? (Datum) 0 : PG_GETARG_DATUM(2);
+
+ memset(&elem, 0, sizeof(JsonbInState));
+
+ datum_to_jsonb(val, PG_ARGISNULL(2), &elem, state->val_category,
+ state->val_output_func, false);
+
+ jbval = JsonbValueToJsonb(elem.res);
+
+ it = JsonbIteratorInit(&jbkey->root);
+
+ /* switch to the aggregate context for accumulation operations */
+
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+
+ /*
+ * keys should be scalar, and we should have already checked for that
+ * above when calling datum_to_jsonb, so we only need to look for these
+ * things.
+ */
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (type)
+ {
+ case WJB_BEGIN_ARRAY:
+ if (!v.val.array.rawScalar)
+ elog(ERROR, "unexpected structure for key");
+ break;
+ case WJB_ELEM:
+ if (v.type == jbvString)
+ {
+ /* copy string values in the aggregate context */
+ char *buf = palloc(v.val.string.len + 1);
+
+ snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val);
+ v.val.string.val = buf;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("object keys must be strings")));
+ }
+ result->res = pushJsonbValue(&result->parseState,
+ WJB_KEY, &v);
+ break;
+ case WJB_END_ARRAY:
+ break;
+ default:
+ elog(ERROR, "unexpected structure for key");
+ break;
+ }
+ }
+
+ it = JsonbIteratorInit(&jbval->root);
+
+ single_scalar = false;
+
+ /*
+ * values can be anything, including structured and null, so we treat them
+ * as in json_agg_transfn, except that single scalars are always pushed as
+ * WJB_VALUE items.
+ */
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (type)
+ {
+ case WJB_BEGIN_ARRAY:
+ if (v.val.array.rawScalar)
+ single_scalar = true;
+ else
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_END_ARRAY:
+ if (!single_scalar)
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_BEGIN_OBJECT:
+ case WJB_END_OBJECT:
+ result->res = pushJsonbValue(&result->parseState,
+ type, NULL);
+ break;
+ case WJB_ELEM:
+ case WJB_KEY:
+ case WJB_VALUE:
+ if (v.type == jbvString)
+ {
+ /* copy string values in the aggregate context */
+ char *buf = palloc(v.val.string.len + 1);
+
+ snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val);
+ v.val.string.val = buf;
+ }
+ else if (v.type == jbvNumeric)
+ {
+ /* same for numeric */
+ v.val.numeric =
+ DatumGetNumeric(DirectFunctionCall1(numeric_uplus,
+ NumericGetDatum(v.val.numeric)));
+ }
+ result->res = pushJsonbValue(&result->parseState,
+ single_scalar ? WJB_VALUE : type,
+ &v);
+ break;
+ default:
+ elog(ERROR, "unknown jsonb iterator token type");
+ }
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+jsonb_object_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ JsonbAggState *arg;
+ JsonbInState result;
+ Jsonb *out;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL(); /* returns null iff no input values */
+
+ arg = (JsonbAggState *) PG_GETARG_POINTER(0);
+
+ /*
+ * We need to do a shallow clone of the argument's res field in case the
+ * final function is called more than once, so we avoid changing the
+ * aggregate state value. A shallow clone is sufficient as we aren't
+ * going to change any of the values, just add the final object end
+ * marker.
+ */
+
+ result.parseState = clone_parse_state(arg->res->parseState);
+
+ result.res = pushJsonbValue(&result.parseState,
+ WJB_END_OBJECT, NULL);
+
+ out = JsonbValueToJsonb(result.res);
+
+ PG_RETURN_POINTER(out);
+}
+
+
+/*
+ * Extract scalar value from raw-scalar pseudo-array jsonb.
+ */
+bool
+JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res)
+{
+ JsonbIterator *it;
+ JsonbIteratorToken tok PG_USED_FOR_ASSERTS_ONLY;
+ JsonbValue tmp;
+
+ if (!JsonContainerIsArray(jbc) || !JsonContainerIsScalar(jbc))
+ {
+ /* inform caller about actual type of container */
+ res->type = (JsonContainerIsArray(jbc)) ? jbvArray : jbvObject;
+ return false;
+ }
+
+ /*
+ * A root scalar is stored as an array of one element, so we get the array
+ * and then its first (and only) member.
+ */
+ it = JsonbIteratorInit(jbc);
+
+ tok = JsonbIteratorNext(&it, &tmp, true);
+ Assert(tok == WJB_BEGIN_ARRAY);
+ Assert(tmp.val.array.nElems == 1 && tmp.val.array.rawScalar);
+
+ tok = JsonbIteratorNext(&it, res, true);
+ Assert(tok == WJB_ELEM);
+ Assert(IsAJsonbScalar(res));
+
+ tok = JsonbIteratorNext(&it, &tmp, true);
+ Assert(tok == WJB_END_ARRAY);
+
+ tok = JsonbIteratorNext(&it, &tmp, true);
+ Assert(tok == WJB_DONE);
+
+ return true;
+}
+
+/*
+ * Emit correct, translatable cast error message
+ */
+static void
+cannotCastJsonbValue(enum jbvType type, const char *sqltype)
+{
+ static const struct
+ {
+ enum jbvType type;
+ const char *msg;
+ }
+ messages[] =
+ {
+ {jbvNull, gettext_noop("cannot cast jsonb null to type %s")},
+ {jbvString, gettext_noop("cannot cast jsonb string to type %s")},
+ {jbvNumeric, gettext_noop("cannot cast jsonb numeric to type %s")},
+ {jbvBool, gettext_noop("cannot cast jsonb boolean to type %s")},
+ {jbvArray, gettext_noop("cannot cast jsonb array to type %s")},
+ {jbvObject, gettext_noop("cannot cast jsonb object to type %s")},
+ {jbvBinary, gettext_noop("cannot cast jsonb array or object to type %s")}
+ };
+ int i;
+
+ for (i = 0; i < lengthof(messages); i++)
+ if (messages[i].type == type)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg(messages[i].msg, sqltype)));
+
+ /* should be unreachable */
+ elog(ERROR, "unknown jsonb type: %d", (int) type);
+}
+
+Datum
+jsonb_bool(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvBool)
+ cannotCastJsonbValue(v.type, "boolean");
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_BOOL(v.val.boolean);
+}
+
+Datum
+jsonb_numeric(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Numeric retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "numeric");
+
+ /*
+ * v.val.numeric points into jsonb body, so we need to make a copy to
+ * return
+ */
+ retValue = DatumGetNumericCopy(NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_NUMERIC(retValue);
+}
+
+Datum
+jsonb_int2(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Datum retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "smallint");
+
+ retValue = DirectFunctionCall1(numeric_int2,
+ NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_DATUM(retValue);
+}
+
+Datum
+jsonb_int4(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Datum retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "integer");
+
+ retValue = DirectFunctionCall1(numeric_int4,
+ NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_DATUM(retValue);
+}
+
+Datum
+jsonb_int8(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Datum retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "bigint");
+
+ retValue = DirectFunctionCall1(numeric_int8,
+ NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_DATUM(retValue);
+}
+
+Datum
+jsonb_float4(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Datum retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "real");
+
+ retValue = DirectFunctionCall1(numeric_float4,
+ NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_DATUM(retValue);
+}
+
+Datum
+jsonb_float8(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ JsonbValue v;
+ Datum retValue;
+
+ if (!JsonbExtractScalar(&in->root, &v) || v.type != jbvNumeric)
+ cannotCastJsonbValue(v.type, "double precision");
+
+ retValue = DirectFunctionCall1(numeric_float8,
+ NumericGetDatum(v.val.numeric));
+
+ PG_FREE_IF_COPY(in, 0);
+
+ PG_RETURN_DATUM(retValue);
+}
diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c
new file mode 100644
index 0000000..6c086b4
--- /dev/null
+++ b/src/backend/utils/adt/jsonb_gin.c
@@ -0,0 +1,1411 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonb_gin.c
+ * GIN support functions for jsonb
+ *
+ * Copyright (c) 2014-2022, PostgreSQL Global Development Group
+ *
+ * We provide two opclasses for jsonb indexing: jsonb_ops and jsonb_path_ops.
+ * For their description see json.sgml and comments in jsonb.h.
+ *
+ * The operators support, among the others, "jsonb @? jsonpath" and
+ * "jsonb @@ jsonpath". Expressions containing these operators are easily
+ * expressed through each other.
+ *
+ * jb @? 'path' <=> jb @@ 'EXISTS(path)'
+ * jb @@ 'expr' <=> jb @? '$ ? (expr)'
+ *
+ * Thus, we're going to consider only @@ operator, while regarding @? operator
+ * the same is true for jb @@ 'EXISTS(path)'.
+ *
+ * Result of jsonpath query extraction is a tree, which leaf nodes are index
+ * entries and non-leaf nodes are AND/OR logical expressions. Basically we
+ * extract following statements out of jsonpath:
+ *
+ * 1) "accessors_chain = const",
+ * 2) "EXISTS(accessors_chain)".
+ *
+ * Accessors chain may consist of .key, [*] and [index] accessors. jsonb_ops
+ * additionally supports .* and .**.
+ *
+ * For now, both jsonb_ops and jsonb_path_ops supports only statements of
+ * the 1st find. jsonb_ops might also support statements of the 2nd kind,
+ * but given we have no statistics keys extracted from accessors chain
+ * are likely non-selective. Therefore, we choose to not confuse optimizer
+ * and skip statements of the 2nd kind altogether. In future versions that
+ * might be changed.
+ *
+ * In jsonb_ops statement of the 1st kind is split into expression of AND'ed
+ * keys and const. Sometimes const might be interpreted as both value or key
+ * in jsonb_ops. Then statement of 1st kind is decomposed into the expression
+ * below.
+ *
+ * key1 AND key2 AND ... AND keyN AND (const_as_value OR const_as_key)
+ *
+ * jsonb_path_ops transforms each statement of the 1st kind into single hash
+ * entry below.
+ *
+ * HASH(key1, key2, ... , keyN, const)
+ *
+ * Despite statements of the 2nd kind are not supported by both jsonb_ops and
+ * jsonb_path_ops, EXISTS(path) expressions might be still supported,
+ * when statements of 1st kind could be extracted out of their filters.
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonb_gin.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/gin.h"
+#include "access/stratnum.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/jsonb.h"
+#include "utils/jsonpath.h"
+#include "utils/varlena.h"
+
+typedef struct PathHashStack
+{
+ uint32 hash;
+ struct PathHashStack *parent;
+} PathHashStack;
+
+/* Buffer for GIN entries */
+typedef struct GinEntries
+{
+ Datum *buf;
+ int count;
+ int allocated;
+} GinEntries;
+
+typedef enum JsonPathGinNodeType
+{
+ JSP_GIN_OR,
+ JSP_GIN_AND,
+ JSP_GIN_ENTRY
+} JsonPathGinNodeType;
+
+typedef struct JsonPathGinNode JsonPathGinNode;
+
+/* Node in jsonpath expression tree */
+struct JsonPathGinNode
+{
+ JsonPathGinNodeType type;
+ union
+ {
+ int nargs; /* valid for OR and AND nodes */
+ int entryIndex; /* index in GinEntries array, valid for ENTRY
+ * nodes after entries output */
+ Datum entryDatum; /* path hash or key name/scalar, valid for
+ * ENTRY nodes before entries output */
+ } val;
+ JsonPathGinNode *args[FLEXIBLE_ARRAY_MEMBER]; /* valid for OR and AND
+ * nodes */
+};
+
+/*
+ * jsonb_ops entry extracted from jsonpath item. Corresponding path item
+ * may be: '.key', '.*', '.**', '[index]' or '[*]'.
+ * Entry type is stored in 'type' field.
+ */
+typedef struct JsonPathGinPathItem
+{
+ struct JsonPathGinPathItem *parent;
+ Datum keyName; /* key name (for '.key' path item) or NULL */
+ JsonPathItemType type; /* type of jsonpath item */
+} JsonPathGinPathItem;
+
+/* GIN representation of the extracted json path */
+typedef union JsonPathGinPath
+{
+ JsonPathGinPathItem *items; /* list of path items (jsonb_ops) */
+ uint32 hash; /* hash of the path (jsonb_path_ops) */
+} JsonPathGinPath;
+
+typedef struct JsonPathGinContext JsonPathGinContext;
+
+/* Callback, which stores information about path item into JsonPathGinPath */
+typedef bool (*JsonPathGinAddPathItemFunc) (JsonPathGinPath *path,
+ JsonPathItem *jsp);
+
+/*
+ * Callback, which extracts set of nodes from statement of 1st kind
+ * (scalar != NULL) or statement of 2nd kind (scalar == NULL).
+ */
+typedef List *(*JsonPathGinExtractNodesFunc) (JsonPathGinContext *cxt,
+ JsonPathGinPath path,
+ JsonbValue *scalar,
+ List *nodes);
+
+/* Context for jsonpath entries extraction */
+struct JsonPathGinContext
+{
+ JsonPathGinAddPathItemFunc add_path_item;
+ JsonPathGinExtractNodesFunc extract_nodes;
+ bool lax;
+};
+
+static Datum make_text_key(char flag, const char *str, int len);
+static Datum make_scalar_key(const JsonbValue *scalarVal, bool is_key);
+
+static JsonPathGinNode *extract_jsp_bool_expr(JsonPathGinContext *cxt,
+ JsonPathGinPath path, JsonPathItem *jsp, bool not);
+
+
+/* Initialize GinEntries struct */
+static void
+init_gin_entries(GinEntries *entries, int preallocated)
+{
+ entries->allocated = preallocated;
+ entries->buf = preallocated ? palloc(sizeof(Datum) * preallocated) : NULL;
+ entries->count = 0;
+}
+
+/* Add new entry to GinEntries */
+static int
+add_gin_entry(GinEntries *entries, Datum entry)
+{
+ int id = entries->count;
+
+ if (entries->count >= entries->allocated)
+ {
+ if (entries->allocated)
+ {
+ entries->allocated *= 2;
+ entries->buf = repalloc(entries->buf,
+ sizeof(Datum) * entries->allocated);
+ }
+ else
+ {
+ entries->allocated = 8;
+ entries->buf = palloc(sizeof(Datum) * entries->allocated);
+ }
+ }
+
+ entries->buf[entries->count++] = entry;
+
+ return id;
+}
+
+/*
+ *
+ * jsonb_ops GIN opclass support functions
+ *
+ */
+
+Datum
+gin_compare_jsonb(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int32 result;
+ char *a1p,
+ *a2p;
+ int len1,
+ len2;
+
+ a1p = VARDATA_ANY(arg1);
+ a2p = VARDATA_ANY(arg2);
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ /* Compare text as bttextcmp does, but always using C collation */
+ result = varstr_cmp(a1p, len1, a2p, len2, C_COLLATION_OID);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+gin_extract_jsonb(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = (Jsonb *) PG_GETARG_JSONB_P(0);
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+ int total = JB_ROOT_COUNT(jb);
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+ GinEntries entries;
+
+ /* If the root level is empty, we certainly have no keys */
+ if (total == 0)
+ {
+ *nentries = 0;
+ PG_RETURN_POINTER(NULL);
+ }
+
+ /* Otherwise, use 2 * root count as initial estimate of result size */
+ init_gin_entries(&entries, 2 * total);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (r)
+ {
+ case WJB_KEY:
+ add_gin_entry(&entries, make_scalar_key(&v, true));
+ break;
+ case WJB_ELEM:
+ /* Pretend string array elements are keys, see jsonb.h */
+ add_gin_entry(&entries, make_scalar_key(&v, v.type == jbvString));
+ break;
+ case WJB_VALUE:
+ add_gin_entry(&entries, make_scalar_key(&v, false));
+ break;
+ default:
+ /* we can ignore structural items */
+ break;
+ }
+ }
+
+ *nentries = entries.count;
+
+ PG_RETURN_POINTER(entries.buf);
+}
+
+/* Append JsonPathGinPathItem to JsonPathGinPath (jsonb_ops) */
+static bool
+jsonb_ops__add_path_item(JsonPathGinPath *path, JsonPathItem *jsp)
+{
+ JsonPathGinPathItem *pentry;
+ Datum keyName;
+
+ switch (jsp->type)
+ {
+ case jpiRoot:
+ path->items = NULL; /* reset path */
+ return true;
+
+ case jpiKey:
+ {
+ int len;
+ char *key = jspGetString(jsp, &len);
+
+ keyName = make_text_key(JGINFLAG_KEY, key, len);
+ break;
+ }
+
+ case jpiAny:
+ case jpiAnyKey:
+ case jpiAnyArray:
+ case jpiIndexArray:
+ keyName = PointerGetDatum(NULL);
+ break;
+
+ default:
+ /* other path items like item methods are not supported */
+ return false;
+ }
+
+ pentry = palloc(sizeof(*pentry));
+
+ pentry->type = jsp->type;
+ pentry->keyName = keyName;
+ pentry->parent = path->items;
+
+ path->items = pentry;
+
+ return true;
+}
+
+/* Combine existing path hash with next key hash (jsonb_path_ops) */
+static bool
+jsonb_path_ops__add_path_item(JsonPathGinPath *path, JsonPathItem *jsp)
+{
+ switch (jsp->type)
+ {
+ case jpiRoot:
+ path->hash = 0; /* reset path hash */
+ return true;
+
+ case jpiKey:
+ {
+ JsonbValue jbv;
+
+ jbv.type = jbvString;
+ jbv.val.string.val = jspGetString(jsp, &jbv.val.string.len);
+
+ JsonbHashScalarValue(&jbv, &path->hash);
+ return true;
+ }
+
+ case jpiIndexArray:
+ case jpiAnyArray:
+ return true; /* path hash is unchanged */
+
+ default:
+ /* other items (wildcard paths, item methods) are not supported */
+ return false;
+ }
+}
+
+static JsonPathGinNode *
+make_jsp_entry_node(Datum entry)
+{
+ JsonPathGinNode *node = palloc(offsetof(JsonPathGinNode, args));
+
+ node->type = JSP_GIN_ENTRY;
+ node->val.entryDatum = entry;
+
+ return node;
+}
+
+static JsonPathGinNode *
+make_jsp_entry_node_scalar(JsonbValue *scalar, bool iskey)
+{
+ return make_jsp_entry_node(make_scalar_key(scalar, iskey));
+}
+
+static JsonPathGinNode *
+make_jsp_expr_node(JsonPathGinNodeType type, int nargs)
+{
+ JsonPathGinNode *node = palloc(offsetof(JsonPathGinNode, args) +
+ sizeof(node->args[0]) * nargs);
+
+ node->type = type;
+ node->val.nargs = nargs;
+
+ return node;
+}
+
+static JsonPathGinNode *
+make_jsp_expr_node_args(JsonPathGinNodeType type, List *args)
+{
+ JsonPathGinNode *node = make_jsp_expr_node(type, list_length(args));
+ ListCell *lc;
+ int i = 0;
+
+ foreach(lc, args)
+ node->args[i++] = lfirst(lc);
+
+ return node;
+}
+
+static JsonPathGinNode *
+make_jsp_expr_node_binary(JsonPathGinNodeType type,
+ JsonPathGinNode *arg1, JsonPathGinNode *arg2)
+{
+ JsonPathGinNode *node = make_jsp_expr_node(type, 2);
+
+ node->args[0] = arg1;
+ node->args[1] = arg2;
+
+ return node;
+}
+
+/* Append a list of nodes from the jsonpath (jsonb_ops). */
+static List *
+jsonb_ops__extract_nodes(JsonPathGinContext *cxt, JsonPathGinPath path,
+ JsonbValue *scalar, List *nodes)
+{
+ JsonPathGinPathItem *pentry;
+
+ if (scalar)
+ {
+ JsonPathGinNode *node;
+
+ /*
+ * Append path entry nodes only if scalar is provided. See header
+ * comment for details.
+ */
+ for (pentry = path.items; pentry; pentry = pentry->parent)
+ {
+ if (pentry->type == jpiKey) /* only keys are indexed */
+ nodes = lappend(nodes, make_jsp_entry_node(pentry->keyName));
+ }
+
+ /* Append scalar node for equality queries. */
+ if (scalar->type == jbvString)
+ {
+ JsonPathGinPathItem *last = path.items;
+ GinTernaryValue key_entry;
+
+ /*
+ * Assuming that jsonb_ops interprets string array elements as
+ * keys, we may extract key or non-key entry or even both. In the
+ * latter case we create OR-node. It is possible in lax mode
+ * where arrays are automatically unwrapped, or in strict mode for
+ * jpiAny items.
+ */
+
+ if (cxt->lax)
+ key_entry = GIN_MAYBE;
+ else if (!last) /* root ($) */
+ key_entry = GIN_FALSE;
+ else if (last->type == jpiAnyArray || last->type == jpiIndexArray)
+ key_entry = GIN_TRUE;
+ else if (last->type == jpiAny)
+ key_entry = GIN_MAYBE;
+ else
+ key_entry = GIN_FALSE;
+
+ if (key_entry == GIN_MAYBE)
+ {
+ JsonPathGinNode *n1 = make_jsp_entry_node_scalar(scalar, true);
+ JsonPathGinNode *n2 = make_jsp_entry_node_scalar(scalar, false);
+
+ node = make_jsp_expr_node_binary(JSP_GIN_OR, n1, n2);
+ }
+ else
+ {
+ node = make_jsp_entry_node_scalar(scalar,
+ key_entry == GIN_TRUE);
+ }
+ }
+ else
+ {
+ node = make_jsp_entry_node_scalar(scalar, false);
+ }
+
+ nodes = lappend(nodes, node);
+ }
+
+ return nodes;
+}
+
+/* Append a list of nodes from the jsonpath (jsonb_path_ops). */
+static List *
+jsonb_path_ops__extract_nodes(JsonPathGinContext *cxt, JsonPathGinPath path,
+ JsonbValue *scalar, List *nodes)
+{
+ if (scalar)
+ {
+ /* append path hash node for equality queries */
+ uint32 hash = path.hash;
+
+ JsonbHashScalarValue(scalar, &hash);
+
+ return lappend(nodes,
+ make_jsp_entry_node(UInt32GetDatum(hash)));
+ }
+ else
+ {
+ /* jsonb_path_ops doesn't support EXISTS queries => nothing to append */
+ return nodes;
+ }
+}
+
+/*
+ * Extract a list of expression nodes that need to be AND-ed by the caller.
+ * Extracted expression is 'path == scalar' if 'scalar' is non-NULL, and
+ * 'EXISTS(path)' otherwise.
+ */
+static List *
+extract_jsp_path_expr_nodes(JsonPathGinContext *cxt, JsonPathGinPath path,
+ JsonPathItem *jsp, JsonbValue *scalar)
+{
+ JsonPathItem next;
+ List *nodes = NIL;
+
+ for (;;)
+ {
+ switch (jsp->type)
+ {
+ case jpiCurrent:
+ break;
+
+ case jpiFilter:
+ {
+ JsonPathItem arg;
+ JsonPathGinNode *filter;
+
+ jspGetArg(jsp, &arg);
+
+ filter = extract_jsp_bool_expr(cxt, path, &arg, false);
+
+ if (filter)
+ nodes = lappend(nodes, filter);
+
+ break;
+ }
+
+ default:
+ if (!cxt->add_path_item(&path, jsp))
+
+ /*
+ * Path is not supported by the index opclass, return only
+ * the extracted filter nodes.
+ */
+ return nodes;
+ break;
+ }
+
+ if (!jspGetNext(jsp, &next))
+ break;
+
+ jsp = &next;
+ }
+
+ /*
+ * Append nodes from the path expression itself to the already extracted
+ * list of filter nodes.
+ */
+ return cxt->extract_nodes(cxt, path, scalar, nodes);
+}
+
+/*
+ * Extract an expression node from one of following jsonpath path expressions:
+ * EXISTS(jsp) (when 'scalar' is NULL)
+ * jsp == scalar (when 'scalar' is not NULL).
+ *
+ * The current path (@) is passed in 'path'.
+ */
+static JsonPathGinNode *
+extract_jsp_path_expr(JsonPathGinContext *cxt, JsonPathGinPath path,
+ JsonPathItem *jsp, JsonbValue *scalar)
+{
+ /* extract a list of nodes to be AND-ed */
+ List *nodes = extract_jsp_path_expr_nodes(cxt, path, jsp, scalar);
+
+ if (list_length(nodes) <= 0)
+ /* no nodes were extracted => full scan is needed for this path */
+ return NULL;
+
+ if (list_length(nodes) == 1)
+ return linitial(nodes); /* avoid extra AND-node */
+
+ /* construct AND-node for path with filters */
+ return make_jsp_expr_node_args(JSP_GIN_AND, nodes);
+}
+
+/* Recursively extract nodes from the boolean jsonpath expression. */
+static JsonPathGinNode *
+extract_jsp_bool_expr(JsonPathGinContext *cxt, JsonPathGinPath path,
+ JsonPathItem *jsp, bool not)
+{
+ check_stack_depth();
+
+ switch (jsp->type)
+ {
+ case jpiAnd: /* expr && expr */
+ case jpiOr: /* expr || expr */
+ {
+ JsonPathItem arg;
+ JsonPathGinNode *larg;
+ JsonPathGinNode *rarg;
+ JsonPathGinNodeType type;
+
+ jspGetLeftArg(jsp, &arg);
+ larg = extract_jsp_bool_expr(cxt, path, &arg, not);
+
+ jspGetRightArg(jsp, &arg);
+ rarg = extract_jsp_bool_expr(cxt, path, &arg, not);
+
+ if (!larg || !rarg)
+ {
+ if (jsp->type == jpiOr)
+ return NULL;
+
+ return larg ? larg : rarg;
+ }
+
+ type = not ^ (jsp->type == jpiAnd) ? JSP_GIN_AND : JSP_GIN_OR;
+
+ return make_jsp_expr_node_binary(type, larg, rarg);
+ }
+
+ case jpiNot: /* !expr */
+ {
+ JsonPathItem arg;
+
+ jspGetArg(jsp, &arg);
+
+ /* extract child expression inverting 'not' flag */
+ return extract_jsp_bool_expr(cxt, path, &arg, !not);
+ }
+
+ case jpiExists: /* EXISTS(path) */
+ {
+ JsonPathItem arg;
+
+ if (not)
+ return NULL; /* NOT EXISTS is not supported */
+
+ jspGetArg(jsp, &arg);
+
+ return extract_jsp_path_expr(cxt, path, &arg, NULL);
+ }
+
+ case jpiNotEqual:
+
+ /*
+ * 'not' == true case is not supported here because '!(path !=
+ * scalar)' is not equivalent to 'path == scalar' in the general
+ * case because of sequence comparison semantics: 'path == scalar'
+ * === 'EXISTS (path, @ == scalar)', '!(path != scalar)' ===
+ * 'FOR_ALL(path, @ == scalar)'. So, we should translate '!(path
+ * != scalar)' into GIN query 'path == scalar || EMPTY(path)', but
+ * 'EMPTY(path)' queries are not supported by the both jsonb
+ * opclasses. However in strict mode we could omit 'EMPTY(path)'
+ * part if the path can return exactly one item (it does not
+ * contain wildcard accessors or item methods like .keyvalue()
+ * etc.).
+ */
+ return NULL;
+
+ case jpiEqual: /* path == scalar */
+ {
+ JsonPathItem left_item;
+ JsonPathItem right_item;
+ JsonPathItem *path_item;
+ JsonPathItem *scalar_item;
+ JsonbValue scalar;
+
+ if (not)
+ return NULL;
+
+ jspGetLeftArg(jsp, &left_item);
+ jspGetRightArg(jsp, &right_item);
+
+ if (jspIsScalar(left_item.type))
+ {
+ scalar_item = &left_item;
+ path_item = &right_item;
+ }
+ else if (jspIsScalar(right_item.type))
+ {
+ scalar_item = &right_item;
+ path_item = &left_item;
+ }
+ else
+ return NULL; /* at least one operand should be a scalar */
+
+ switch (scalar_item->type)
+ {
+ case jpiNull:
+ scalar.type = jbvNull;
+ break;
+ case jpiBool:
+ scalar.type = jbvBool;
+ scalar.val.boolean = !!*scalar_item->content.value.data;
+ break;
+ case jpiNumeric:
+ scalar.type = jbvNumeric;
+ scalar.val.numeric =
+ (Numeric) scalar_item->content.value.data;
+ break;
+ case jpiString:
+ scalar.type = jbvString;
+ scalar.val.string.val = scalar_item->content.value.data;
+ scalar.val.string.len =
+ scalar_item->content.value.datalen;
+ break;
+ default:
+ elog(ERROR, "invalid scalar jsonpath item type: %d",
+ scalar_item->type);
+ return NULL;
+ }
+
+ return extract_jsp_path_expr(cxt, path, path_item, &scalar);
+ }
+
+ default:
+ return NULL; /* not a boolean expression */
+ }
+}
+
+/* Recursively emit all GIN entries found in the node tree */
+static void
+emit_jsp_gin_entries(JsonPathGinNode *node, GinEntries *entries)
+{
+ check_stack_depth();
+
+ switch (node->type)
+ {
+ case JSP_GIN_ENTRY:
+ /* replace datum with its index in the array */
+ node->val.entryIndex = add_gin_entry(entries, node->val.entryDatum);
+ break;
+
+ case JSP_GIN_OR:
+ case JSP_GIN_AND:
+ {
+ int i;
+
+ for (i = 0; i < node->val.nargs; i++)
+ emit_jsp_gin_entries(node->args[i], entries);
+
+ break;
+ }
+ }
+}
+
+/*
+ * Recursively extract GIN entries from jsonpath query.
+ * Root expression node is put into (*extra_data)[0].
+ */
+static Datum *
+extract_jsp_query(JsonPath *jp, StrategyNumber strat, bool pathOps,
+ int32 *nentries, Pointer **extra_data)
+{
+ JsonPathGinContext cxt;
+ JsonPathItem root;
+ JsonPathGinNode *node;
+ JsonPathGinPath path = {0};
+ GinEntries entries = {0};
+
+ cxt.lax = (jp->header & JSONPATH_LAX) != 0;
+
+ if (pathOps)
+ {
+ cxt.add_path_item = jsonb_path_ops__add_path_item;
+ cxt.extract_nodes = jsonb_path_ops__extract_nodes;
+ }
+ else
+ {
+ cxt.add_path_item = jsonb_ops__add_path_item;
+ cxt.extract_nodes = jsonb_ops__extract_nodes;
+ }
+
+ jspInit(&root, jp);
+
+ node = strat == JsonbJsonpathExistsStrategyNumber
+ ? extract_jsp_path_expr(&cxt, path, &root, NULL)
+ : extract_jsp_bool_expr(&cxt, path, &root, false);
+
+ if (!node)
+ {
+ *nentries = 0;
+ return NULL;
+ }
+
+ emit_jsp_gin_entries(node, &entries);
+
+ *nentries = entries.count;
+ if (!*nentries)
+ return NULL;
+
+ *extra_data = palloc0(sizeof(**extra_data) * entries.count);
+ **extra_data = (Pointer) node;
+
+ return entries.buf;
+}
+
+/*
+ * Recursively execute jsonpath expression.
+ * 'check' is a bool[] or a GinTernaryValue[] depending on 'ternary' flag.
+ */
+static GinTernaryValue
+execute_jsp_gin_node(JsonPathGinNode *node, void *check, bool ternary)
+{
+ GinTernaryValue res;
+ GinTernaryValue v;
+ int i;
+
+ switch (node->type)
+ {
+ case JSP_GIN_AND:
+ res = GIN_TRUE;
+ for (i = 0; i < node->val.nargs; i++)
+ {
+ v = execute_jsp_gin_node(node->args[i], check, ternary);
+ if (v == GIN_FALSE)
+ return GIN_FALSE;
+ else if (v == GIN_MAYBE)
+ res = GIN_MAYBE;
+ }
+ return res;
+
+ case JSP_GIN_OR:
+ res = GIN_FALSE;
+ for (i = 0; i < node->val.nargs; i++)
+ {
+ v = execute_jsp_gin_node(node->args[i], check, ternary);
+ if (v == GIN_TRUE)
+ return GIN_TRUE;
+ else if (v == GIN_MAYBE)
+ res = GIN_MAYBE;
+ }
+ return res;
+
+ case JSP_GIN_ENTRY:
+ {
+ int index = node->val.entryIndex;
+
+ if (ternary)
+ return ((GinTernaryValue *) check)[index];
+ else
+ return ((bool *) check)[index] ? GIN_TRUE : GIN_FALSE;
+ }
+
+ default:
+ elog(ERROR, "invalid jsonpath gin node type: %d", node->type);
+ return GIN_FALSE; /* keep compiler quiet */
+ }
+}
+
+Datum
+gin_extract_jsonb_query(PG_FUNCTION_ARGS)
+{
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+ StrategyNumber strategy = PG_GETARG_UINT16(2);
+ int32 *searchMode = (int32 *) PG_GETARG_POINTER(6);
+ Datum *entries;
+
+ if (strategy == JsonbContainsStrategyNumber)
+ {
+ /* Query is a jsonb, so just apply gin_extract_jsonb... */
+ entries = (Datum *)
+ DatumGetPointer(DirectFunctionCall2(gin_extract_jsonb,
+ PG_GETARG_DATUM(0),
+ PointerGetDatum(nentries)));
+ /* ...although "contains {}" requires a full index scan */
+ if (*nentries == 0)
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ }
+ else if (strategy == JsonbExistsStrategyNumber)
+ {
+ /* Query is a text string, which we treat as a key */
+ text *query = PG_GETARG_TEXT_PP(0);
+
+ *nentries = 1;
+ entries = (Datum *) palloc(sizeof(Datum));
+ entries[0] = make_text_key(JGINFLAG_KEY,
+ VARDATA_ANY(query),
+ VARSIZE_ANY_EXHDR(query));
+ }
+ else if (strategy == JsonbExistsAnyStrategyNumber ||
+ strategy == JsonbExistsAllStrategyNumber)
+ {
+ /* Query is a text array; each element is treated as a key */
+ ArrayType *query = PG_GETARG_ARRAYTYPE_P(0);
+ Datum *key_datums;
+ bool *key_nulls;
+ int key_count;
+ int i,
+ j;
+
+ deconstruct_array(query,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &key_datums, &key_nulls, &key_count);
+
+ entries = (Datum *) palloc(sizeof(Datum) * key_count);
+
+ for (i = 0, j = 0; i < key_count; i++)
+ {
+ /* Nulls in the array are ignored */
+ if (key_nulls[i])
+ continue;
+ /* We rely on the array elements not being toasted */
+ entries[j++] = make_text_key(JGINFLAG_KEY,
+ VARDATA_ANY(key_datums[i]),
+ VARSIZE_ANY_EXHDR(key_datums[i]));
+ }
+
+ *nentries = j;
+ /* ExistsAll with no keys should match everything */
+ if (j == 0 && strategy == JsonbExistsAllStrategyNumber)
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ JsonPath *jp = PG_GETARG_JSONPATH_P(0);
+ Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
+
+ entries = extract_jsp_query(jp, strategy, false, nentries, extra_data);
+
+ if (!entries)
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ }
+ else
+ {
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+ entries = NULL; /* keep compiler quiet */
+ }
+
+ PG_RETURN_POINTER(entries);
+}
+
+Datum
+gin_consistent_jsonb(PG_FUNCTION_ARGS)
+{
+ bool *check = (bool *) PG_GETARG_POINTER(0);
+ StrategyNumber strategy = PG_GETARG_UINT16(1);
+
+ /* Jsonb *query = PG_GETARG_JSONB_P(2); */
+ int32 nkeys = PG_GETARG_INT32(3);
+
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ bool *recheck = (bool *) PG_GETARG_POINTER(5);
+ bool res = true;
+ int32 i;
+
+ if (strategy == JsonbContainsStrategyNumber)
+ {
+ /*
+ * We must always recheck, since we can't tell from the index whether
+ * the positions of the matched items match the structure of the query
+ * object. (Even if we could, we'd also have to worry about hashed
+ * keys and the index's failure to distinguish keys from string array
+ * elements.) However, the tuple certainly doesn't match unless it
+ * contains all the query keys.
+ */
+ *recheck = true;
+ for (i = 0; i < nkeys; i++)
+ {
+ if (!check[i])
+ {
+ res = false;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbExistsStrategyNumber)
+ {
+ /*
+ * Although the key is certainly present in the index, we must recheck
+ * because (1) the key might be hashed, and (2) the index match might
+ * be for a key that's not at top level of the JSON object. For (1),
+ * we could look at the query key to see if it's hashed and not
+ * recheck if not, but the index lacks enough info to tell about (2).
+ */
+ *recheck = true;
+ res = true;
+ }
+ else if (strategy == JsonbExistsAnyStrategyNumber)
+ {
+ /* As for plain exists, we must recheck */
+ *recheck = true;
+ res = true;
+ }
+ else if (strategy == JsonbExistsAllStrategyNumber)
+ {
+ /* As for plain exists, we must recheck */
+ *recheck = true;
+ /* ... but unless all the keys are present, we can say "false" */
+ for (i = 0; i < nkeys; i++)
+ {
+ if (!check[i])
+ {
+ res = false;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ *recheck = true;
+
+ if (nkeys > 0)
+ {
+ Assert(extra_data && extra_data[0]);
+ res = execute_jsp_gin_node((JsonPathGinNode *) extra_data[0], check,
+ false) != GIN_FALSE;
+ }
+ }
+ else
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+gin_triconsistent_jsonb(PG_FUNCTION_ARGS)
+{
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
+ StrategyNumber strategy = PG_GETARG_UINT16(1);
+
+ /* Jsonb *query = PG_GETARG_JSONB_P(2); */
+ int32 nkeys = PG_GETARG_INT32(3);
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ GinTernaryValue res = GIN_MAYBE;
+ int32 i;
+
+ /*
+ * Note that we never return GIN_TRUE, only GIN_MAYBE or GIN_FALSE; this
+ * corresponds to always forcing recheck in the regular consistent
+ * function, for the reasons listed there.
+ */
+ if (strategy == JsonbContainsStrategyNumber ||
+ strategy == JsonbExistsAllStrategyNumber)
+ {
+ /* All extracted keys must be present */
+ for (i = 0; i < nkeys; i++)
+ {
+ if (check[i] == GIN_FALSE)
+ {
+ res = GIN_FALSE;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbExistsStrategyNumber ||
+ strategy == JsonbExistsAnyStrategyNumber)
+ {
+ /* At least one extracted key must be present */
+ res = GIN_FALSE;
+ for (i = 0; i < nkeys; i++)
+ {
+ if (check[i] == GIN_TRUE ||
+ check[i] == GIN_MAYBE)
+ {
+ res = GIN_MAYBE;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ if (nkeys > 0)
+ {
+ Assert(extra_data && extra_data[0]);
+ res = execute_jsp_gin_node((JsonPathGinNode *) extra_data[0], check,
+ true);
+
+ /* Should always recheck the result */
+ if (res == GIN_TRUE)
+ res = GIN_MAYBE;
+ }
+ }
+ else
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+
+ PG_RETURN_GIN_TERNARY_VALUE(res);
+}
+
+/*
+ *
+ * jsonb_path_ops GIN opclass support functions
+ *
+ * In a jsonb_path_ops index, the GIN keys are uint32 hashes, one per JSON
+ * value; but the JSON key(s) leading to each value are also included in its
+ * hash computation. This means we can only support containment queries,
+ * but the index can distinguish, for example, {"foo": 42} from {"bar": 42}
+ * since different hashes will be generated.
+ *
+ */
+
+Datum
+gin_extract_jsonb_path(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+ int total = JB_ROOT_COUNT(jb);
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+ PathHashStack tail;
+ PathHashStack *stack;
+ GinEntries entries;
+
+ /* If the root level is empty, we certainly have no keys */
+ if (total == 0)
+ {
+ *nentries = 0;
+ PG_RETURN_POINTER(NULL);
+ }
+
+ /* Otherwise, use 2 * root count as initial estimate of result size */
+ init_gin_entries(&entries, 2 * total);
+
+ /* We keep a stack of partial hashes corresponding to parent key levels */
+ tail.parent = NULL;
+ tail.hash = 0;
+ stack = &tail;
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ PathHashStack *parent;
+
+ switch (r)
+ {
+ case WJB_BEGIN_ARRAY:
+ case WJB_BEGIN_OBJECT:
+ /* Push a stack level for this object */
+ parent = stack;
+ stack = (PathHashStack *) palloc(sizeof(PathHashStack));
+
+ /*
+ * We pass forward hashes from outer nesting levels so that
+ * the hashes for nested values will include outer keys as
+ * well as their own keys.
+ *
+ * Nesting an array within another array will not alter
+ * innermost scalar element hash values, but that seems
+ * inconsequential.
+ */
+ stack->hash = parent->hash;
+ stack->parent = parent;
+ break;
+ case WJB_KEY:
+ /* mix this key into the current outer hash */
+ JsonbHashScalarValue(&v, &stack->hash);
+ /* hash is now ready to incorporate the value */
+ break;
+ case WJB_ELEM:
+ case WJB_VALUE:
+ /* mix the element or value's hash into the prepared hash */
+ JsonbHashScalarValue(&v, &stack->hash);
+ /* and emit an index entry */
+ add_gin_entry(&entries, UInt32GetDatum(stack->hash));
+ /* reset hash for next key, value, or sub-object */
+ stack->hash = stack->parent->hash;
+ break;
+ case WJB_END_ARRAY:
+ case WJB_END_OBJECT:
+ /* Pop the stack */
+ parent = stack->parent;
+ pfree(stack);
+ stack = parent;
+ /* reset hash for next key, value, or sub-object */
+ if (stack->parent)
+ stack->hash = stack->parent->hash;
+ else
+ stack->hash = 0;
+ break;
+ default:
+ elog(ERROR, "invalid JsonbIteratorNext rc: %d", (int) r);
+ }
+ }
+
+ *nentries = entries.count;
+
+ PG_RETURN_POINTER(entries.buf);
+}
+
+Datum
+gin_extract_jsonb_query_path(PG_FUNCTION_ARGS)
+{
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+ StrategyNumber strategy = PG_GETARG_UINT16(2);
+ int32 *searchMode = (int32 *) PG_GETARG_POINTER(6);
+ Datum *entries;
+
+ if (strategy == JsonbContainsStrategyNumber)
+ {
+ /* Query is a jsonb, so just apply gin_extract_jsonb_path ... */
+ entries = (Datum *)
+ DatumGetPointer(DirectFunctionCall2(gin_extract_jsonb_path,
+ PG_GETARG_DATUM(0),
+ PointerGetDatum(nentries)));
+
+ /* ... although "contains {}" requires a full index scan */
+ if (*nentries == 0)
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ JsonPath *jp = PG_GETARG_JSONPATH_P(0);
+ Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
+
+ entries = extract_jsp_query(jp, strategy, true, nentries, extra_data);
+
+ if (!entries)
+ *searchMode = GIN_SEARCH_MODE_ALL;
+ }
+ else
+ {
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+ entries = NULL;
+ }
+
+ PG_RETURN_POINTER(entries);
+}
+
+Datum
+gin_consistent_jsonb_path(PG_FUNCTION_ARGS)
+{
+ bool *check = (bool *) PG_GETARG_POINTER(0);
+ StrategyNumber strategy = PG_GETARG_UINT16(1);
+
+ /* Jsonb *query = PG_GETARG_JSONB_P(2); */
+ int32 nkeys = PG_GETARG_INT32(3);
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ bool *recheck = (bool *) PG_GETARG_POINTER(5);
+ bool res = true;
+ int32 i;
+
+ if (strategy == JsonbContainsStrategyNumber)
+ {
+ /*
+ * jsonb_path_ops is necessarily lossy, not only because of hash
+ * collisions but also because it doesn't preserve complete
+ * information about the structure of the JSON object. Besides, there
+ * are some special rules around the containment of raw scalars in
+ * arrays that are not handled here. So we must always recheck a
+ * match. However, if not all of the keys are present, the tuple
+ * certainly doesn't match.
+ */
+ *recheck = true;
+ for (i = 0; i < nkeys; i++)
+ {
+ if (!check[i])
+ {
+ res = false;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ *recheck = true;
+
+ if (nkeys > 0)
+ {
+ Assert(extra_data && extra_data[0]);
+ res = execute_jsp_gin_node((JsonPathGinNode *) extra_data[0], check,
+ false) != GIN_FALSE;
+ }
+ }
+ else
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+gin_triconsistent_jsonb_path(PG_FUNCTION_ARGS)
+{
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
+ StrategyNumber strategy = PG_GETARG_UINT16(1);
+
+ /* Jsonb *query = PG_GETARG_JSONB_P(2); */
+ int32 nkeys = PG_GETARG_INT32(3);
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ GinTernaryValue res = GIN_MAYBE;
+ int32 i;
+
+ if (strategy == JsonbContainsStrategyNumber)
+ {
+ /*
+ * Note that we never return GIN_TRUE, only GIN_MAYBE or GIN_FALSE;
+ * this corresponds to always forcing recheck in the regular
+ * consistent function, for the reasons listed there.
+ */
+ for (i = 0; i < nkeys; i++)
+ {
+ if (check[i] == GIN_FALSE)
+ {
+ res = GIN_FALSE;
+ break;
+ }
+ }
+ }
+ else if (strategy == JsonbJsonpathPredicateStrategyNumber ||
+ strategy == JsonbJsonpathExistsStrategyNumber)
+ {
+ if (nkeys > 0)
+ {
+ Assert(extra_data && extra_data[0]);
+ res = execute_jsp_gin_node((JsonPathGinNode *) extra_data[0], check,
+ true);
+
+ /* Should always recheck the result */
+ if (res == GIN_TRUE)
+ res = GIN_MAYBE;
+ }
+ }
+ else
+ elog(ERROR, "unrecognized strategy number: %d", strategy);
+
+ PG_RETURN_GIN_TERNARY_VALUE(res);
+}
+
+/*
+ * Construct a jsonb_ops GIN key from a flag byte and a textual representation
+ * (which need not be null-terminated). This function is responsible
+ * for hashing overlength text representations; it will add the
+ * JGINFLAG_HASHED bit to the flag value if it does that.
+ */
+static Datum
+make_text_key(char flag, const char *str, int len)
+{
+ text *item;
+ char hashbuf[10];
+
+ if (len > JGIN_MAXLENGTH)
+ {
+ uint32 hashval;
+
+ hashval = DatumGetUInt32(hash_any((const unsigned char *) str, len));
+ snprintf(hashbuf, sizeof(hashbuf), "%08x", hashval);
+ str = hashbuf;
+ len = 8;
+ flag |= JGINFLAG_HASHED;
+ }
+
+ /*
+ * Now build the text Datum. For simplicity we build a 4-byte-header
+ * varlena text Datum here, but we expect it will get converted to short
+ * header format when stored in the index.
+ */
+ item = (text *) palloc(VARHDRSZ + len + 1);
+ SET_VARSIZE(item, VARHDRSZ + len + 1);
+
+ *VARDATA(item) = flag;
+
+ memcpy(VARDATA(item) + 1, str, len);
+
+ return PointerGetDatum(item);
+}
+
+/*
+ * Create a textual representation of a JsonbValue that will serve as a GIN
+ * key in a jsonb_ops index. is_key is true if the JsonbValue is a key,
+ * or if it is a string array element (since we pretend those are keys,
+ * see jsonb.h).
+ */
+static Datum
+make_scalar_key(const JsonbValue *scalarVal, bool is_key)
+{
+ Datum item;
+ char *cstr;
+
+ switch (scalarVal->type)
+ {
+ case jbvNull:
+ Assert(!is_key);
+ item = make_text_key(JGINFLAG_NULL, "", 0);
+ break;
+ case jbvBool:
+ Assert(!is_key);
+ item = make_text_key(JGINFLAG_BOOL,
+ scalarVal->val.boolean ? "t" : "f", 1);
+ break;
+ case jbvNumeric:
+ Assert(!is_key);
+
+ /*
+ * A normalized textual representation, free of trailing zeroes,
+ * is required so that numerically equal values will produce equal
+ * strings.
+ *
+ * It isn't ideal that numerics are stored in a relatively bulky
+ * textual format. However, it's a notationally convenient way of
+ * storing a "union" type in the GIN B-Tree, and indexing Jsonb
+ * strings takes precedence.
+ */
+ cstr = numeric_normalize(scalarVal->val.numeric);
+ item = make_text_key(JGINFLAG_NUM, cstr, strlen(cstr));
+ pfree(cstr);
+ break;
+ case jbvString:
+ item = make_text_key(is_key ? JGINFLAG_KEY : JGINFLAG_STR,
+ scalarVal->val.string.val,
+ scalarVal->val.string.len);
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonb scalar type: %d", scalarVal->type);
+ item = 0; /* keep compiler quiet */
+ break;
+ }
+
+ return item;
+}
diff --git a/src/backend/utils/adt/jsonb_op.c b/src/backend/utils/adt/jsonb_op.c
new file mode 100644
index 0000000..9270520
--- /dev/null
+++ b/src/backend/utils/adt/jsonb_op.c
@@ -0,0 +1,338 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonb_op.c
+ * Special operators for jsonb only, used by various index access methods
+ *
+ * Copyright (c) 2014-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonb_op.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/jsonb.h"
+
+Datum
+jsonb_exists(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ text *key = PG_GETARG_TEXT_PP(1);
+ JsonbValue kval;
+ JsonbValue *v = NULL;
+
+ /*
+ * We only match Object keys (which are naturally always Strings), or
+ * string elements in arrays. In particular, we do not match non-string
+ * scalar elements. Existence of a key/element is only considered at the
+ * top level. No recursion occurs.
+ */
+ kval.type = jbvString;
+ kval.val.string.val = VARDATA_ANY(key);
+ kval.val.string.len = VARSIZE_ANY_EXHDR(key);
+
+ v = findJsonbValueFromContainer(&jb->root,
+ JB_FOBJECT | JB_FARRAY,
+ &kval);
+
+ PG_RETURN_BOOL(v != NULL);
+}
+
+Datum
+jsonb_exists_any(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ ArrayType *keys = PG_GETARG_ARRAYTYPE_P(1);
+ int i;
+ Datum *key_datums;
+ bool *key_nulls;
+ int elem_count;
+
+ deconstruct_array(keys, TEXTOID, -1, false, TYPALIGN_INT,
+ &key_datums, &key_nulls, &elem_count);
+
+ for (i = 0; i < elem_count; i++)
+ {
+ JsonbValue strVal;
+
+ if (key_nulls[i])
+ continue;
+
+ strVal.type = jbvString;
+ /* We rely on the array elements not being toasted */
+ strVal.val.string.val = VARDATA_ANY(key_datums[i]);
+ strVal.val.string.len = VARSIZE_ANY_EXHDR(key_datums[i]);
+
+ if (findJsonbValueFromContainer(&jb->root,
+ JB_FOBJECT | JB_FARRAY,
+ &strVal) != NULL)
+ PG_RETURN_BOOL(true);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+jsonb_exists_all(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ ArrayType *keys = PG_GETARG_ARRAYTYPE_P(1);
+ int i;
+ Datum *key_datums;
+ bool *key_nulls;
+ int elem_count;
+
+ deconstruct_array(keys, TEXTOID, -1, false, TYPALIGN_INT,
+ &key_datums, &key_nulls, &elem_count);
+
+ for (i = 0; i < elem_count; i++)
+ {
+ JsonbValue strVal;
+
+ if (key_nulls[i])
+ continue;
+
+ strVal.type = jbvString;
+ /* We rely on the array elements not being toasted */
+ strVal.val.string.val = VARDATA_ANY(key_datums[i]);
+ strVal.val.string.len = VARSIZE_ANY_EXHDR(key_datums[i]);
+
+ if (findJsonbValueFromContainer(&jb->root,
+ JB_FOBJECT | JB_FARRAY,
+ &strVal) == NULL)
+ PG_RETURN_BOOL(false);
+ }
+
+ PG_RETURN_BOOL(true);
+}
+
+Datum
+jsonb_contains(PG_FUNCTION_ARGS)
+{
+ Jsonb *val = PG_GETARG_JSONB_P(0);
+ Jsonb *tmpl = PG_GETARG_JSONB_P(1);
+
+ JsonbIterator *it1,
+ *it2;
+
+ if (JB_ROOT_IS_OBJECT(val) != JB_ROOT_IS_OBJECT(tmpl))
+ PG_RETURN_BOOL(false);
+
+ it1 = JsonbIteratorInit(&val->root);
+ it2 = JsonbIteratorInit(&tmpl->root);
+
+ PG_RETURN_BOOL(JsonbDeepContains(&it1, &it2));
+}
+
+Datum
+jsonb_contained(PG_FUNCTION_ARGS)
+{
+ /* Commutator of "contains" */
+ Jsonb *tmpl = PG_GETARG_JSONB_P(0);
+ Jsonb *val = PG_GETARG_JSONB_P(1);
+
+ JsonbIterator *it1,
+ *it2;
+
+ if (JB_ROOT_IS_OBJECT(val) != JB_ROOT_IS_OBJECT(tmpl))
+ PG_RETURN_BOOL(false);
+
+ it1 = JsonbIteratorInit(&val->root);
+ it2 = JsonbIteratorInit(&tmpl->root);
+
+ PG_RETURN_BOOL(JsonbDeepContains(&it1, &it2));
+}
+
+Datum
+jsonb_ne(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) != 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * B-Tree operator class operators, support function
+ */
+Datum
+jsonb_lt(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) < 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+jsonb_gt(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) > 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+jsonb_le(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) <= 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+jsonb_ge(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) >= 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+jsonb_eq(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ bool res;
+
+ res = (compareJsonbContainers(&jba->root, &jbb->root) == 0);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+jsonb_cmp(PG_FUNCTION_ARGS)
+{
+ Jsonb *jba = PG_GETARG_JSONB_P(0);
+ Jsonb *jbb = PG_GETARG_JSONB_P(1);
+ int res;
+
+ res = compareJsonbContainers(&jba->root, &jbb->root);
+
+ PG_FREE_IF_COPY(jba, 0);
+ PG_FREE_IF_COPY(jbb, 1);
+ PG_RETURN_INT32(res);
+}
+
+/*
+ * Hash operator class jsonb hashing function
+ */
+Datum
+jsonb_hash(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+ uint32 hash = 0;
+
+ if (JB_ROOT_COUNT(jb) == 0)
+ PG_RETURN_INT32(0);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (r)
+ {
+ /* Rotation is left to JsonbHashScalarValue() */
+ case WJB_BEGIN_ARRAY:
+ hash ^= JB_FARRAY;
+ break;
+ case WJB_BEGIN_OBJECT:
+ hash ^= JB_FOBJECT;
+ break;
+ case WJB_KEY:
+ case WJB_VALUE:
+ case WJB_ELEM:
+ JsonbHashScalarValue(&v, &hash);
+ break;
+ case WJB_END_ARRAY:
+ case WJB_END_OBJECT:
+ break;
+ default:
+ elog(ERROR, "invalid JsonbIteratorNext rc: %d", (int) r);
+ }
+ }
+
+ PG_FREE_IF_COPY(jb, 0);
+ PG_RETURN_INT32(hash);
+}
+
+Datum
+jsonb_hash_extended(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ uint64 seed = PG_GETARG_INT64(1);
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+ uint64 hash = 0;
+
+ if (JB_ROOT_COUNT(jb) == 0)
+ PG_RETURN_UINT64(seed);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ switch (r)
+ {
+ /* Rotation is left to JsonbHashScalarValueExtended() */
+ case WJB_BEGIN_ARRAY:
+ hash ^= ((uint64) JB_FARRAY) << 32 | JB_FARRAY;
+ break;
+ case WJB_BEGIN_OBJECT:
+ hash ^= ((uint64) JB_FOBJECT) << 32 | JB_FOBJECT;
+ break;
+ case WJB_KEY:
+ case WJB_VALUE:
+ case WJB_ELEM:
+ JsonbHashScalarValueExtended(&v, &hash, seed);
+ break;
+ case WJB_END_ARRAY:
+ case WJB_END_OBJECT:
+ break;
+ default:
+ elog(ERROR, "invalid JsonbIteratorNext rc: %d", (int) r);
+ }
+ }
+
+ PG_FREE_IF_COPY(jb, 0);
+ PG_RETURN_UINT64(hash);
+}
diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c
new file mode 100644
index 0000000..6044275
--- /dev/null
+++ b/src/backend/utils/adt/jsonb_util.c
@@ -0,0 +1,1968 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonb_util.c
+ * converting between Jsonb and JsonbValues, and iterating.
+ *
+ * Copyright (c) 2014-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonb_util.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "common/jsonapi.h"
+#include "miscadmin.h"
+#include "port/pg_bitutils.h"
+#include "utils/builtins.h"
+#include "utils/datetime.h"
+#include "utils/json.h"
+#include "utils/jsonb.h"
+#include "utils/memutils.h"
+#include "utils/varlena.h"
+
+/*
+ * Maximum number of elements in an array (or key/value pairs in an object).
+ * This is limited by two things: the size of the JEntry array must fit
+ * in MaxAllocSize, and the number of elements (or pairs) must fit in the bits
+ * reserved for that in the JsonbContainer.header field.
+ *
+ * (The total size of an array's or object's elements is also limited by
+ * JENTRY_OFFLENMASK, but we're not concerned about that here.)
+ */
+#define JSONB_MAX_ELEMS (Min(MaxAllocSize / sizeof(JsonbValue), JB_CMASK))
+#define JSONB_MAX_PAIRS (Min(MaxAllocSize / sizeof(JsonbPair), JB_CMASK))
+
+static void fillJsonbValue(JsonbContainer *container, int index,
+ char *base_addr, uint32 offset,
+ JsonbValue *result);
+static bool equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b);
+static int compareJsonbScalarValue(JsonbValue *a, JsonbValue *b);
+static Jsonb *convertToJsonb(JsonbValue *val);
+static void convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level);
+static void convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level);
+static void convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level);
+static void convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal);
+
+static int reserveFromBuffer(StringInfo buffer, int len);
+static void appendToBuffer(StringInfo buffer, const char *data, int len);
+static void copyToBuffer(StringInfo buffer, int offset, const char *data, int len);
+static short padBufferToInt(StringInfo buffer);
+
+static JsonbIterator *iteratorFromContainer(JsonbContainer *container, JsonbIterator *parent);
+static JsonbIterator *freeAndGetParent(JsonbIterator *it);
+static JsonbParseState *pushState(JsonbParseState **pstate);
+static void appendKey(JsonbParseState *pstate, JsonbValue *scalarVal);
+static void appendValue(JsonbParseState *pstate, JsonbValue *scalarVal);
+static void appendElement(JsonbParseState *pstate, JsonbValue *scalarVal);
+static int lengthCompareJsonbStringValue(const void *a, const void *b);
+static int lengthCompareJsonbString(const char *val1, int len1,
+ const char *val2, int len2);
+static int lengthCompareJsonbPair(const void *a, const void *b, void *arg);
+static void uniqueifyJsonbObject(JsonbValue *object);
+static JsonbValue *pushJsonbValueScalar(JsonbParseState **pstate,
+ JsonbIteratorToken seq,
+ JsonbValue *scalarVal);
+
+void
+JsonbToJsonbValue(Jsonb *jsonb, JsonbValue *val)
+{
+ val->type = jbvBinary;
+ val->val.binary.data = &jsonb->root;
+ val->val.binary.len = VARSIZE(jsonb) - VARHDRSZ;
+}
+
+/*
+ * Turn an in-memory JsonbValue into a Jsonb for on-disk storage.
+ *
+ * Generally we find it more convenient to directly iterate through the Jsonb
+ * representation and only really convert nested scalar values.
+ * JsonbIteratorNext() does this, so that clients of the iteration code don't
+ * have to directly deal with the binary representation (JsonbDeepContains() is
+ * a notable exception, although all exceptions are internal to this module).
+ * In general, functions that accept a JsonbValue argument are concerned with
+ * the manipulation of scalar values, or simple containers of scalar values,
+ * where it would be inconvenient to deal with a great amount of other state.
+ */
+Jsonb *
+JsonbValueToJsonb(JsonbValue *val)
+{
+ Jsonb *out;
+
+ if (IsAJsonbScalar(val))
+ {
+ /* Scalar value */
+ JsonbParseState *pstate = NULL;
+ JsonbValue *res;
+ JsonbValue scalarArray;
+
+ scalarArray.type = jbvArray;
+ scalarArray.val.array.rawScalar = true;
+ scalarArray.val.array.nElems = 1;
+
+ pushJsonbValue(&pstate, WJB_BEGIN_ARRAY, &scalarArray);
+ pushJsonbValue(&pstate, WJB_ELEM, val);
+ res = pushJsonbValue(&pstate, WJB_END_ARRAY, NULL);
+
+ out = convertToJsonb(res);
+ }
+ else if (val->type == jbvObject || val->type == jbvArray)
+ {
+ out = convertToJsonb(val);
+ }
+ else
+ {
+ Assert(val->type == jbvBinary);
+ out = palloc(VARHDRSZ + val->val.binary.len);
+ SET_VARSIZE(out, VARHDRSZ + val->val.binary.len);
+ memcpy(VARDATA(out), val->val.binary.data, val->val.binary.len);
+ }
+
+ return out;
+}
+
+/*
+ * Get the offset of the variable-length portion of a Jsonb node within
+ * the variable-length-data part of its container. The node is identified
+ * by index within the container's JEntry array.
+ */
+uint32
+getJsonbOffset(const JsonbContainer *jc, int index)
+{
+ uint32 offset = 0;
+ int i;
+
+ /*
+ * Start offset of this entry is equal to the end offset of the previous
+ * entry. Walk backwards to the most recent entry stored as an end
+ * offset, returning that offset plus any lengths in between.
+ */
+ for (i = index - 1; i >= 0; i--)
+ {
+ offset += JBE_OFFLENFLD(jc->children[i]);
+ if (JBE_HAS_OFF(jc->children[i]))
+ break;
+ }
+
+ return offset;
+}
+
+/*
+ * Get the length of the variable-length portion of a Jsonb node.
+ * The node is identified by index within the container's JEntry array.
+ */
+uint32
+getJsonbLength(const JsonbContainer *jc, int index)
+{
+ uint32 off;
+ uint32 len;
+
+ /*
+ * If the length is stored directly in the JEntry, just return it.
+ * Otherwise, get the begin offset of the entry, and subtract that from
+ * the stored end+1 offset.
+ */
+ if (JBE_HAS_OFF(jc->children[index]))
+ {
+ off = getJsonbOffset(jc, index);
+ len = JBE_OFFLENFLD(jc->children[index]) - off;
+ }
+ else
+ len = JBE_OFFLENFLD(jc->children[index]);
+
+ return len;
+}
+
+/*
+ * BT comparator worker function. Returns an integer less than, equal to, or
+ * greater than zero, indicating whether a is less than, equal to, or greater
+ * than b. Consistent with the requirements for a B-Tree operator class
+ *
+ * Strings are compared lexically, in contrast with other places where we use a
+ * much simpler comparator logic for searching through Strings. Since this is
+ * called from B-Tree support function 1, we're careful about not leaking
+ * memory here.
+ */
+int
+compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
+{
+ JsonbIterator *ita,
+ *itb;
+ int res = 0;
+
+ ita = JsonbIteratorInit(a);
+ itb = JsonbIteratorInit(b);
+
+ do
+ {
+ JsonbValue va,
+ vb;
+ JsonbIteratorToken ra,
+ rb;
+
+ ra = JsonbIteratorNext(&ita, &va, false);
+ rb = JsonbIteratorNext(&itb, &vb, false);
+
+ if (ra == rb)
+ {
+ if (ra == WJB_DONE)
+ {
+ /* Decisively equal */
+ break;
+ }
+
+ if (ra == WJB_END_ARRAY || ra == WJB_END_OBJECT)
+ {
+ /*
+ * There is no array or object to compare at this stage of
+ * processing. jbvArray/jbvObject values are compared
+ * initially, at the WJB_BEGIN_ARRAY and WJB_BEGIN_OBJECT
+ * tokens.
+ */
+ continue;
+ }
+
+ if (va.type == vb.type)
+ {
+ switch (va.type)
+ {
+ case jbvString:
+ case jbvNull:
+ case jbvNumeric:
+ case jbvBool:
+ res = compareJsonbScalarValue(&va, &vb);
+ break;
+ case jbvArray:
+
+ /*
+ * This could be a "raw scalar" pseudo array. That's
+ * a special case here though, since we still want the
+ * general type-based comparisons to apply, and as far
+ * as we're concerned a pseudo array is just a scalar.
+ */
+ if (va.val.array.rawScalar != vb.val.array.rawScalar)
+ res = (va.val.array.rawScalar) ? -1 : 1;
+ if (va.val.array.nElems != vb.val.array.nElems)
+ res = (va.val.array.nElems > vb.val.array.nElems) ? 1 : -1;
+ break;
+ case jbvObject:
+ if (va.val.object.nPairs != vb.val.object.nPairs)
+ res = (va.val.object.nPairs > vb.val.object.nPairs) ? 1 : -1;
+ break;
+ case jbvBinary:
+ elog(ERROR, "unexpected jbvBinary value");
+ break;
+ case jbvDatetime:
+ elog(ERROR, "unexpected jbvDatetime value");
+ break;
+ }
+ }
+ else
+ {
+ /* Type-defined order */
+ res = (va.type > vb.type) ? 1 : -1;
+ }
+ }
+ else
+ {
+ /*
+ * It's safe to assume that the types differed, and that the va
+ * and vb values passed were set.
+ *
+ * If the two values were of the same container type, then there'd
+ * have been a chance to observe the variation in the number of
+ * elements/pairs (when processing WJB_BEGIN_OBJECT, say). They're
+ * either two heterogeneously-typed containers, or a container and
+ * some scalar type.
+ *
+ * We don't have to consider the WJB_END_ARRAY and WJB_END_OBJECT
+ * cases here, because we would have seen the corresponding
+ * WJB_BEGIN_ARRAY and WJB_BEGIN_OBJECT tokens first, and
+ * concluded that they don't match.
+ */
+ Assert(ra != WJB_END_ARRAY && ra != WJB_END_OBJECT);
+ Assert(rb != WJB_END_ARRAY && rb != WJB_END_OBJECT);
+
+ Assert(va.type != vb.type);
+ Assert(va.type != jbvBinary);
+ Assert(vb.type != jbvBinary);
+ /* Type-defined order */
+ res = (va.type > vb.type) ? 1 : -1;
+ }
+ }
+ while (res == 0);
+
+ while (ita != NULL)
+ {
+ JsonbIterator *i = ita->parent;
+
+ pfree(ita);
+ ita = i;
+ }
+ while (itb != NULL)
+ {
+ JsonbIterator *i = itb->parent;
+
+ pfree(itb);
+ itb = i;
+ }
+
+ return res;
+}
+
+/*
+ * Find value in object (i.e. the "value" part of some key/value pair in an
+ * object), or find a matching element if we're looking through an array. Do
+ * so on the basis of equality of the object keys only, or alternatively
+ * element values only, with a caller-supplied value "key". The "flags"
+ * argument allows the caller to specify which container types are of interest.
+ *
+ * This exported utility function exists to facilitate various cases concerned
+ * with "containment". If asked to look through an object, the caller had
+ * better pass a Jsonb String, because their keys can only be strings.
+ * Otherwise, for an array, any type of JsonbValue will do.
+ *
+ * In order to proceed with the search, it is necessary for callers to have
+ * both specified an interest in exactly one particular container type with an
+ * appropriate flag, as well as having the pointed-to Jsonb container be of
+ * one of those same container types at the top level. (Actually, we just do
+ * whichever makes sense to save callers the trouble of figuring it out - at
+ * most one can make sense, because the container either points to an array
+ * (possibly a "raw scalar" pseudo array) or an object.)
+ *
+ * Note that we can return a jbvBinary JsonbValue if this is called on an
+ * object, but we never do so on an array. If the caller asks to look through
+ * a container type that is not of the type pointed to by the container,
+ * immediately fall through and return NULL. If we cannot find the value,
+ * return NULL. Otherwise, return palloc()'d copy of value.
+ */
+JsonbValue *
+findJsonbValueFromContainer(JsonbContainer *container, uint32 flags,
+ JsonbValue *key)
+{
+ JEntry *children = container->children;
+ int count = JsonContainerSize(container);
+
+ Assert((flags & ~(JB_FARRAY | JB_FOBJECT)) == 0);
+
+ /* Quick out without a palloc cycle if object/array is empty */
+ if (count <= 0)
+ return NULL;
+
+ if ((flags & JB_FARRAY) && JsonContainerIsArray(container))
+ {
+ JsonbValue *result = palloc(sizeof(JsonbValue));
+ char *base_addr = (char *) (children + count);
+ uint32 offset = 0;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ fillJsonbValue(container, i, base_addr, offset, result);
+
+ if (key->type == result->type)
+ {
+ if (equalsJsonbScalarValue(key, result))
+ return result;
+ }
+
+ JBE_ADVANCE_OFFSET(offset, children[i]);
+ }
+
+ pfree(result);
+ }
+ else if ((flags & JB_FOBJECT) && JsonContainerIsObject(container))
+ {
+ /* Object key passed by caller must be a string */
+ Assert(key->type == jbvString);
+
+ return getKeyJsonValueFromContainer(container, key->val.string.val,
+ key->val.string.len, NULL);
+ }
+
+ /* Not found */
+ return NULL;
+}
+
+/*
+ * Find value by key in Jsonb object and fetch it into 'res', which is also
+ * returned.
+ *
+ * 'res' can be passed in as NULL, in which case it's newly palloc'ed here.
+ */
+JsonbValue *
+getKeyJsonValueFromContainer(JsonbContainer *container,
+ const char *keyVal, int keyLen, JsonbValue *res)
+{
+ JEntry *children = container->children;
+ int count = JsonContainerSize(container);
+ char *baseAddr;
+ uint32 stopLow,
+ stopHigh;
+
+ Assert(JsonContainerIsObject(container));
+
+ /* Quick out without a palloc cycle if object is empty */
+ if (count <= 0)
+ return NULL;
+
+ /*
+ * Binary search the container. Since we know this is an object, account
+ * for *Pairs* of Jentrys
+ */
+ baseAddr = (char *) (children + count * 2);
+ stopLow = 0;
+ stopHigh = count;
+ while (stopLow < stopHigh)
+ {
+ uint32 stopMiddle;
+ int difference;
+ const char *candidateVal;
+ int candidateLen;
+
+ stopMiddle = stopLow + (stopHigh - stopLow) / 2;
+
+ candidateVal = baseAddr + getJsonbOffset(container, stopMiddle);
+ candidateLen = getJsonbLength(container, stopMiddle);
+
+ difference = lengthCompareJsonbString(candidateVal, candidateLen,
+ keyVal, keyLen);
+
+ if (difference == 0)
+ {
+ /* Found our key, return corresponding value */
+ int index = stopMiddle + count;
+
+ if (!res)
+ res = palloc(sizeof(JsonbValue));
+
+ fillJsonbValue(container, index, baseAddr,
+ getJsonbOffset(container, index),
+ res);
+
+ return res;
+ }
+ else
+ {
+ if (difference < 0)
+ stopLow = stopMiddle + 1;
+ else
+ stopHigh = stopMiddle;
+ }
+ }
+
+ /* Not found */
+ return NULL;
+}
+
+/*
+ * Get i-th value of a Jsonb array.
+ *
+ * Returns palloc()'d copy of the value, or NULL if it does not exist.
+ */
+JsonbValue *
+getIthJsonbValueFromContainer(JsonbContainer *container, uint32 i)
+{
+ JsonbValue *result;
+ char *base_addr;
+ uint32 nelements;
+
+ if (!JsonContainerIsArray(container))
+ elog(ERROR, "not a jsonb array");
+
+ nelements = JsonContainerSize(container);
+ base_addr = (char *) &container->children[nelements];
+
+ if (i >= nelements)
+ return NULL;
+
+ result = palloc(sizeof(JsonbValue));
+
+ fillJsonbValue(container, i, base_addr,
+ getJsonbOffset(container, i),
+ result);
+
+ return result;
+}
+
+/*
+ * A helper function to fill in a JsonbValue to represent an element of an
+ * array, or a key or value of an object.
+ *
+ * The node's JEntry is at container->children[index], and its variable-length
+ * data is at base_addr + offset. We make the caller determine the offset
+ * since in many cases the caller can amortize that work across multiple
+ * children. When it can't, it can just call getJsonbOffset().
+ *
+ * A nested array or object will be returned as jbvBinary, ie. it won't be
+ * expanded.
+ */
+static void
+fillJsonbValue(JsonbContainer *container, int index,
+ char *base_addr, uint32 offset,
+ JsonbValue *result)
+{
+ JEntry entry = container->children[index];
+
+ if (JBE_ISNULL(entry))
+ {
+ result->type = jbvNull;
+ }
+ else if (JBE_ISSTRING(entry))
+ {
+ result->type = jbvString;
+ result->val.string.val = base_addr + offset;
+ result->val.string.len = getJsonbLength(container, index);
+ Assert(result->val.string.len >= 0);
+ }
+ else if (JBE_ISNUMERIC(entry))
+ {
+ result->type = jbvNumeric;
+ result->val.numeric = (Numeric) (base_addr + INTALIGN(offset));
+ }
+ else if (JBE_ISBOOL_TRUE(entry))
+ {
+ result->type = jbvBool;
+ result->val.boolean = true;
+ }
+ else if (JBE_ISBOOL_FALSE(entry))
+ {
+ result->type = jbvBool;
+ result->val.boolean = false;
+ }
+ else
+ {
+ Assert(JBE_ISCONTAINER(entry));
+ result->type = jbvBinary;
+ /* Remove alignment padding from data pointer and length */
+ result->val.binary.data = (JsonbContainer *) (base_addr + INTALIGN(offset));
+ result->val.binary.len = getJsonbLength(container, index) -
+ (INTALIGN(offset) - offset);
+ }
+}
+
+/*
+ * Push JsonbValue into JsonbParseState.
+ *
+ * Used when parsing JSON tokens to form Jsonb, or when converting an in-memory
+ * JsonbValue to a Jsonb.
+ *
+ * Initial state of *JsonbParseState is NULL, since it'll be allocated here
+ * originally (caller will get JsonbParseState back by reference).
+ *
+ * Only sequential tokens pertaining to non-container types should pass a
+ * JsonbValue. There is one exception -- WJB_BEGIN_ARRAY callers may pass a
+ * "raw scalar" pseudo array to append it - the actual scalar should be passed
+ * next and it will be added as the only member of the array.
+ *
+ * Values of type jbvBinary, which are rolled up arrays and objects,
+ * are unpacked before being added to the result.
+ */
+JsonbValue *
+pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
+ JsonbValue *jbval)
+{
+ JsonbIterator *it;
+ JsonbValue *res = NULL;
+ JsonbValue v;
+ JsonbIteratorToken tok;
+ int i;
+
+ if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE) && jbval->type == jbvObject)
+ {
+ pushJsonbValue(pstate, WJB_BEGIN_OBJECT, NULL);
+ for (i = 0; i < jbval->val.object.nPairs; i++)
+ {
+ pushJsonbValue(pstate, WJB_KEY, &jbval->val.object.pairs[i].key);
+ pushJsonbValue(pstate, WJB_VALUE, &jbval->val.object.pairs[i].value);
+ }
+
+ return pushJsonbValue(pstate, WJB_END_OBJECT, NULL);
+ }
+
+ if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE) && jbval->type == jbvArray)
+ {
+ pushJsonbValue(pstate, WJB_BEGIN_ARRAY, NULL);
+ for (i = 0; i < jbval->val.array.nElems; i++)
+ {
+ pushJsonbValue(pstate, WJB_ELEM, &jbval->val.array.elems[i]);
+ }
+
+ return pushJsonbValue(pstate, WJB_END_ARRAY, NULL);
+ }
+
+ if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE) ||
+ jbval->type != jbvBinary)
+ {
+ /* drop through */
+ return pushJsonbValueScalar(pstate, seq, jbval);
+ }
+
+ /* unpack the binary and add each piece to the pstate */
+ it = JsonbIteratorInit(jbval->val.binary.data);
+
+ if ((jbval->val.binary.data->header & JB_FSCALAR) && *pstate)
+ {
+ tok = JsonbIteratorNext(&it, &v, true);
+ Assert(tok == WJB_BEGIN_ARRAY);
+ Assert(v.type == jbvArray && v.val.array.rawScalar);
+
+ tok = JsonbIteratorNext(&it, &v, true);
+ Assert(tok == WJB_ELEM);
+
+ res = pushJsonbValueScalar(pstate, seq, &v);
+
+ tok = JsonbIteratorNext(&it, &v, true);
+ Assert(tok == WJB_END_ARRAY);
+ Assert(it == NULL);
+
+ return res;
+ }
+
+ while ((tok = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ res = pushJsonbValueScalar(pstate, tok,
+ tok < WJB_BEGIN_ARRAY ||
+ (tok == WJB_BEGIN_ARRAY &&
+ v.val.array.rawScalar) ? &v : NULL);
+
+ return res;
+}
+
+/*
+ * Do the actual pushing, with only scalar or pseudo-scalar-array values
+ * accepted.
+ */
+static JsonbValue *
+pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
+ JsonbValue *scalarVal)
+{
+ JsonbValue *result = NULL;
+
+ switch (seq)
+ {
+ case WJB_BEGIN_ARRAY:
+ Assert(!scalarVal || scalarVal->val.array.rawScalar);
+ *pstate = pushState(pstate);
+ result = &(*pstate)->contVal;
+ (*pstate)->contVal.type = jbvArray;
+ (*pstate)->contVal.val.array.nElems = 0;
+ (*pstate)->contVal.val.array.rawScalar = (scalarVal &&
+ scalarVal->val.array.rawScalar);
+ if (scalarVal && scalarVal->val.array.nElems > 0)
+ {
+ /* Assume that this array is still really a scalar */
+ Assert(scalarVal->type == jbvArray);
+ (*pstate)->size = scalarVal->val.array.nElems;
+ }
+ else
+ {
+ (*pstate)->size = 4;
+ }
+ (*pstate)->contVal.val.array.elems = palloc(sizeof(JsonbValue) *
+ (*pstate)->size);
+ break;
+ case WJB_BEGIN_OBJECT:
+ Assert(!scalarVal);
+ *pstate = pushState(pstate);
+ result = &(*pstate)->contVal;
+ (*pstate)->contVal.type = jbvObject;
+ (*pstate)->contVal.val.object.nPairs = 0;
+ (*pstate)->size = 4;
+ (*pstate)->contVal.val.object.pairs = palloc(sizeof(JsonbPair) *
+ (*pstate)->size);
+ break;
+ case WJB_KEY:
+ Assert(scalarVal->type == jbvString);
+ appendKey(*pstate, scalarVal);
+ break;
+ case WJB_VALUE:
+ Assert(IsAJsonbScalar(scalarVal));
+ appendValue(*pstate, scalarVal);
+ break;
+ case WJB_ELEM:
+ Assert(IsAJsonbScalar(scalarVal));
+ appendElement(*pstate, scalarVal);
+ break;
+ case WJB_END_OBJECT:
+ uniqueifyJsonbObject(&(*pstate)->contVal);
+ /* fall through! */
+ case WJB_END_ARRAY:
+ /* Steps here common to WJB_END_OBJECT case */
+ Assert(!scalarVal);
+ result = &(*pstate)->contVal;
+
+ /*
+ * Pop stack and push current array/object as value in parent
+ * array/object
+ */
+ *pstate = (*pstate)->next;
+ if (*pstate)
+ {
+ switch ((*pstate)->contVal.type)
+ {
+ case jbvArray:
+ appendElement(*pstate, result);
+ break;
+ case jbvObject:
+ appendValue(*pstate, result);
+ break;
+ default:
+ elog(ERROR, "invalid jsonb container type");
+ }
+ }
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonb sequential processing token");
+ }
+
+ return result;
+}
+
+/*
+ * pushJsonbValue() worker: Iteration-like forming of Jsonb
+ */
+static JsonbParseState *
+pushState(JsonbParseState **pstate)
+{
+ JsonbParseState *ns = palloc(sizeof(JsonbParseState));
+
+ ns->next = *pstate;
+ return ns;
+}
+
+/*
+ * pushJsonbValue() worker: Append a pair key to state when generating a Jsonb
+ */
+static void
+appendKey(JsonbParseState *pstate, JsonbValue *string)
+{
+ JsonbValue *object = &pstate->contVal;
+
+ Assert(object->type == jbvObject);
+ Assert(string->type == jbvString);
+
+ if (object->val.object.nPairs >= JSONB_MAX_PAIRS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of jsonb object pairs exceeds the maximum allowed (%zu)",
+ JSONB_MAX_PAIRS)));
+
+ if (object->val.object.nPairs >= pstate->size)
+ {
+ pstate->size *= 2;
+ object->val.object.pairs = repalloc(object->val.object.pairs,
+ sizeof(JsonbPair) * pstate->size);
+ }
+
+ object->val.object.pairs[object->val.object.nPairs].key = *string;
+ object->val.object.pairs[object->val.object.nPairs].order = object->val.object.nPairs;
+}
+
+/*
+ * pushJsonbValue() worker: Append a pair value to state when generating a
+ * Jsonb
+ */
+static void
+appendValue(JsonbParseState *pstate, JsonbValue *scalarVal)
+{
+ JsonbValue *object = &pstate->contVal;
+
+ Assert(object->type == jbvObject);
+
+ object->val.object.pairs[object->val.object.nPairs++].value = *scalarVal;
+}
+
+/*
+ * pushJsonbValue() worker: Append an element to state when generating a Jsonb
+ */
+static void
+appendElement(JsonbParseState *pstate, JsonbValue *scalarVal)
+{
+ JsonbValue *array = &pstate->contVal;
+
+ Assert(array->type == jbvArray);
+
+ if (array->val.array.nElems >= JSONB_MAX_ELEMS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("number of jsonb array elements exceeds the maximum allowed (%zu)",
+ JSONB_MAX_ELEMS)));
+
+ if (array->val.array.nElems >= pstate->size)
+ {
+ pstate->size *= 2;
+ array->val.array.elems = repalloc(array->val.array.elems,
+ sizeof(JsonbValue) * pstate->size);
+ }
+
+ array->val.array.elems[array->val.array.nElems++] = *scalarVal;
+}
+
+/*
+ * Given a JsonbContainer, expand to JsonbIterator to iterate over items
+ * fully expanded to in-memory representation for manipulation.
+ *
+ * See JsonbIteratorNext() for notes on memory management.
+ */
+JsonbIterator *
+JsonbIteratorInit(JsonbContainer *container)
+{
+ return iteratorFromContainer(container, NULL);
+}
+
+/*
+ * Get next JsonbValue while iterating
+ *
+ * Caller should initially pass their own, original iterator. They may get
+ * back a child iterator palloc()'d here instead. The function can be relied
+ * on to free those child iterators, lest the memory allocated for highly
+ * nested objects become unreasonable, but only if callers don't end iteration
+ * early (by breaking upon having found something in a search, for example).
+ *
+ * Callers in such a scenario, that are particularly sensitive to leaking
+ * memory in a long-lived context may walk the ancestral tree from the final
+ * iterator we left them with to its oldest ancestor, pfree()ing as they go.
+ * They do not have to free any other memory previously allocated for iterators
+ * but not accessible as direct ancestors of the iterator they're last passed
+ * back.
+ *
+ * Returns "Jsonb sequential processing" token value. Iterator "state"
+ * reflects the current stage of the process in a less granular fashion, and is
+ * mostly used here to track things internally with respect to particular
+ * iterators.
+ *
+ * Clients of this function should not have to handle any jbvBinary values
+ * (since recursive calls will deal with this), provided skipNested is false.
+ * It is our job to expand the jbvBinary representation without bothering them
+ * with it. However, clients should not take it upon themselves to touch array
+ * or Object element/pair buffers, since their element/pair pointers are
+ * garbage. Also, *val will not be set when returning WJB_END_ARRAY or
+ * WJB_END_OBJECT, on the assumption that it's only useful to access values
+ * when recursing in.
+ */
+JsonbIteratorToken
+JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)
+{
+ if (*it == NULL)
+ return WJB_DONE;
+
+ /*
+ * When stepping into a nested container, we jump back here to start
+ * processing the child. We will not recurse further in one call, because
+ * processing the child will always begin in JBI_ARRAY_START or
+ * JBI_OBJECT_START state.
+ */
+recurse:
+ switch ((*it)->state)
+ {
+ case JBI_ARRAY_START:
+ /* Set v to array on first array call */
+ val->type = jbvArray;
+ val->val.array.nElems = (*it)->nElems;
+
+ /*
+ * v->val.array.elems is not actually set, because we aren't doing
+ * a full conversion
+ */
+ val->val.array.rawScalar = (*it)->isScalar;
+ (*it)->curIndex = 0;
+ (*it)->curDataOffset = 0;
+ (*it)->curValueOffset = 0; /* not actually used */
+ /* Set state for next call */
+ (*it)->state = JBI_ARRAY_ELEM;
+ return WJB_BEGIN_ARRAY;
+
+ case JBI_ARRAY_ELEM:
+ if ((*it)->curIndex >= (*it)->nElems)
+ {
+ /*
+ * All elements within array already processed. Report this
+ * to caller, and give it back original parent iterator (which
+ * independently tracks iteration progress at its level of
+ * nesting).
+ */
+ *it = freeAndGetParent(*it);
+ return WJB_END_ARRAY;
+ }
+
+ fillJsonbValue((*it)->container, (*it)->curIndex,
+ (*it)->dataProper, (*it)->curDataOffset,
+ val);
+
+ JBE_ADVANCE_OFFSET((*it)->curDataOffset,
+ (*it)->children[(*it)->curIndex]);
+ (*it)->curIndex++;
+
+ if (!IsAJsonbScalar(val) && !skipNested)
+ {
+ /* Recurse into container. */
+ *it = iteratorFromContainer(val->val.binary.data, *it);
+ goto recurse;
+ }
+ else
+ {
+ /*
+ * Scalar item in array, or a container and caller didn't want
+ * us to recurse into it.
+ */
+ return WJB_ELEM;
+ }
+
+ case JBI_OBJECT_START:
+ /* Set v to object on first object call */
+ val->type = jbvObject;
+ val->val.object.nPairs = (*it)->nElems;
+
+ /*
+ * v->val.object.pairs is not actually set, because we aren't
+ * doing a full conversion
+ */
+ (*it)->curIndex = 0;
+ (*it)->curDataOffset = 0;
+ (*it)->curValueOffset = getJsonbOffset((*it)->container,
+ (*it)->nElems);
+ /* Set state for next call */
+ (*it)->state = JBI_OBJECT_KEY;
+ return WJB_BEGIN_OBJECT;
+
+ case JBI_OBJECT_KEY:
+ if ((*it)->curIndex >= (*it)->nElems)
+ {
+ /*
+ * All pairs within object already processed. Report this to
+ * caller, and give it back original containing iterator
+ * (which independently tracks iteration progress at its level
+ * of nesting).
+ */
+ *it = freeAndGetParent(*it);
+ return WJB_END_OBJECT;
+ }
+ else
+ {
+ /* Return key of a key/value pair. */
+ fillJsonbValue((*it)->container, (*it)->curIndex,
+ (*it)->dataProper, (*it)->curDataOffset,
+ val);
+ if (val->type != jbvString)
+ elog(ERROR, "unexpected jsonb type as object key");
+
+ /* Set state for next call */
+ (*it)->state = JBI_OBJECT_VALUE;
+ return WJB_KEY;
+ }
+
+ case JBI_OBJECT_VALUE:
+ /* Set state for next call */
+ (*it)->state = JBI_OBJECT_KEY;
+
+ fillJsonbValue((*it)->container, (*it)->curIndex + (*it)->nElems,
+ (*it)->dataProper, (*it)->curValueOffset,
+ val);
+
+ JBE_ADVANCE_OFFSET((*it)->curDataOffset,
+ (*it)->children[(*it)->curIndex]);
+ JBE_ADVANCE_OFFSET((*it)->curValueOffset,
+ (*it)->children[(*it)->curIndex + (*it)->nElems]);
+ (*it)->curIndex++;
+
+ /*
+ * Value may be a container, in which case we recurse with new,
+ * child iterator (unless the caller asked not to, by passing
+ * skipNested).
+ */
+ if (!IsAJsonbScalar(val) && !skipNested)
+ {
+ *it = iteratorFromContainer(val->val.binary.data, *it);
+ goto recurse;
+ }
+ else
+ return WJB_VALUE;
+ }
+
+ elog(ERROR, "invalid iterator state");
+ return -1;
+}
+
+/*
+ * Initialize an iterator for iterating all elements in a container.
+ */
+static JsonbIterator *
+iteratorFromContainer(JsonbContainer *container, JsonbIterator *parent)
+{
+ JsonbIterator *it;
+
+ it = palloc0(sizeof(JsonbIterator));
+ it->container = container;
+ it->parent = parent;
+ it->nElems = JsonContainerSize(container);
+
+ /* Array starts just after header */
+ it->children = container->children;
+
+ switch (container->header & (JB_FARRAY | JB_FOBJECT))
+ {
+ case JB_FARRAY:
+ it->dataProper =
+ (char *) it->children + it->nElems * sizeof(JEntry);
+ it->isScalar = JsonContainerIsScalar(container);
+ /* This is either a "raw scalar", or an array */
+ Assert(!it->isScalar || it->nElems == 1);
+
+ it->state = JBI_ARRAY_START;
+ break;
+
+ case JB_FOBJECT:
+ it->dataProper =
+ (char *) it->children + it->nElems * sizeof(JEntry) * 2;
+ it->state = JBI_OBJECT_START;
+ break;
+
+ default:
+ elog(ERROR, "unknown type of jsonb container");
+ }
+
+ return it;
+}
+
+/*
+ * JsonbIteratorNext() worker: Return parent, while freeing memory for current
+ * iterator
+ */
+static JsonbIterator *
+freeAndGetParent(JsonbIterator *it)
+{
+ JsonbIterator *v = it->parent;
+
+ pfree(it);
+ return v;
+}
+
+/*
+ * Worker for "contains" operator's function
+ *
+ * Formally speaking, containment is top-down, unordered subtree isomorphism.
+ *
+ * Takes iterators that belong to some container type. These iterators
+ * "belong" to those values in the sense that they've just been initialized in
+ * respect of them by the caller (perhaps in a nested fashion).
+ *
+ * "val" is lhs Jsonb, and mContained is rhs Jsonb when called from top level.
+ * We determine if mContained is contained within val.
+ */
+bool
+JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
+{
+ JsonbValue vval,
+ vcontained;
+ JsonbIteratorToken rval,
+ rcont;
+
+ /*
+ * Guard against stack overflow due to overly complex Jsonb.
+ *
+ * Functions called here independently take this precaution, but that
+ * might not be sufficient since this is also a recursive function.
+ */
+ check_stack_depth();
+
+ rval = JsonbIteratorNext(val, &vval, false);
+ rcont = JsonbIteratorNext(mContained, &vcontained, false);
+
+ if (rval != rcont)
+ {
+ /*
+ * The differing return values can immediately be taken as indicating
+ * two differing container types at this nesting level, which is
+ * sufficient reason to give up entirely (but it should be the case
+ * that they're both some container type).
+ */
+ Assert(rval == WJB_BEGIN_OBJECT || rval == WJB_BEGIN_ARRAY);
+ Assert(rcont == WJB_BEGIN_OBJECT || rcont == WJB_BEGIN_ARRAY);
+ return false;
+ }
+ else if (rcont == WJB_BEGIN_OBJECT)
+ {
+ Assert(vval.type == jbvObject);
+ Assert(vcontained.type == jbvObject);
+
+ /*
+ * If the lhs has fewer pairs than the rhs, it can't possibly contain
+ * the rhs. (This conclusion is safe only because we de-duplicate
+ * keys in all Jsonb objects; thus there can be no corresponding
+ * optimization in the array case.) The case probably won't arise
+ * often, but since it's such a cheap check we may as well make it.
+ */
+ if (vval.val.object.nPairs < vcontained.val.object.nPairs)
+ return false;
+
+ /* Work through rhs "is it contained within?" object */
+ for (;;)
+ {
+ JsonbValue *lhsVal; /* lhsVal is from pair in lhs object */
+ JsonbValue lhsValBuf;
+
+ rcont = JsonbIteratorNext(mContained, &vcontained, false);
+
+ /*
+ * When we get through caller's rhs "is it contained within?"
+ * object without failing to find one of its values, it's
+ * contained.
+ */
+ if (rcont == WJB_END_OBJECT)
+ return true;
+
+ Assert(rcont == WJB_KEY);
+ Assert(vcontained.type == jbvString);
+
+ /* First, find value by key... */
+ lhsVal =
+ getKeyJsonValueFromContainer((*val)->container,
+ vcontained.val.string.val,
+ vcontained.val.string.len,
+ &lhsValBuf);
+ if (!lhsVal)
+ return false;
+
+ /*
+ * ...at this stage it is apparent that there is at least a key
+ * match for this rhs pair.
+ */
+ rcont = JsonbIteratorNext(mContained, &vcontained, true);
+
+ Assert(rcont == WJB_VALUE);
+
+ /*
+ * Compare rhs pair's value with lhs pair's value just found using
+ * key
+ */
+ if (lhsVal->type != vcontained.type)
+ {
+ return false;
+ }
+ else if (IsAJsonbScalar(lhsVal))
+ {
+ if (!equalsJsonbScalarValue(lhsVal, &vcontained))
+ return false;
+ }
+ else
+ {
+ /* Nested container value (object or array) */
+ JsonbIterator *nestval,
+ *nestContained;
+
+ Assert(lhsVal->type == jbvBinary);
+ Assert(vcontained.type == jbvBinary);
+
+ nestval = JsonbIteratorInit(lhsVal->val.binary.data);
+ nestContained = JsonbIteratorInit(vcontained.val.binary.data);
+
+ /*
+ * Match "value" side of rhs datum object's pair recursively.
+ * It's a nested structure.
+ *
+ * Note that nesting still has to "match up" at the right
+ * nesting sub-levels. However, there need only be zero or
+ * more matching pairs (or elements) at each nesting level
+ * (provided the *rhs* pairs/elements *all* match on each
+ * level), which enables searching nested structures for a
+ * single String or other primitive type sub-datum quite
+ * effectively (provided the user constructed the rhs nested
+ * structure such that we "know where to look").
+ *
+ * In other words, the mapping of container nodes in the rhs
+ * "vcontained" Jsonb to internal nodes on the lhs is
+ * injective, and parent-child edges on the rhs must be mapped
+ * to parent-child edges on the lhs to satisfy the condition
+ * of containment (plus of course the mapped nodes must be
+ * equal).
+ */
+ if (!JsonbDeepContains(&nestval, &nestContained))
+ return false;
+ }
+ }
+ }
+ else if (rcont == WJB_BEGIN_ARRAY)
+ {
+ JsonbValue *lhsConts = NULL;
+ uint32 nLhsElems = vval.val.array.nElems;
+
+ Assert(vval.type == jbvArray);
+ Assert(vcontained.type == jbvArray);
+
+ /*
+ * Handle distinction between "raw scalar" pseudo arrays, and real
+ * arrays.
+ *
+ * A raw scalar may contain another raw scalar, and an array may
+ * contain a raw scalar, but a raw scalar may not contain an array. We
+ * don't do something like this for the object case, since objects can
+ * only contain pairs, never raw scalars (a pair is represented by an
+ * rhs object argument with a single contained pair).
+ */
+ if (vval.val.array.rawScalar && !vcontained.val.array.rawScalar)
+ return false;
+
+ /* Work through rhs "is it contained within?" array */
+ for (;;)
+ {
+ rcont = JsonbIteratorNext(mContained, &vcontained, true);
+
+ /*
+ * When we get through caller's rhs "is it contained within?"
+ * array without failing to find one of its values, it's
+ * contained.
+ */
+ if (rcont == WJB_END_ARRAY)
+ return true;
+
+ Assert(rcont == WJB_ELEM);
+
+ if (IsAJsonbScalar(&vcontained))
+ {
+ if (!findJsonbValueFromContainer((*val)->container,
+ JB_FARRAY,
+ &vcontained))
+ return false;
+ }
+ else
+ {
+ uint32 i;
+
+ /*
+ * If this is first container found in rhs array (at this
+ * depth), initialize temp lhs array of containers
+ */
+ if (lhsConts == NULL)
+ {
+ uint32 j = 0;
+
+ /* Make room for all possible values */
+ lhsConts = palloc(sizeof(JsonbValue) * nLhsElems);
+
+ for (i = 0; i < nLhsElems; i++)
+ {
+ /* Store all lhs elements in temp array */
+ rcont = JsonbIteratorNext(val, &vval, true);
+ Assert(rcont == WJB_ELEM);
+
+ if (vval.type == jbvBinary)
+ lhsConts[j++] = vval;
+ }
+
+ /* No container elements in temp array, so give up now */
+ if (j == 0)
+ return false;
+
+ /* We may have only partially filled array */
+ nLhsElems = j;
+ }
+
+ /* XXX: Nested array containment is O(N^2) */
+ for (i = 0; i < nLhsElems; i++)
+ {
+ /* Nested container value (object or array) */
+ JsonbIterator *nestval,
+ *nestContained;
+ bool contains;
+
+ nestval = JsonbIteratorInit(lhsConts[i].val.binary.data);
+ nestContained = JsonbIteratorInit(vcontained.val.binary.data);
+
+ contains = JsonbDeepContains(&nestval, &nestContained);
+
+ if (nestval)
+ pfree(nestval);
+ if (nestContained)
+ pfree(nestContained);
+ if (contains)
+ break;
+ }
+
+ /*
+ * Report rhs container value is not contained if couldn't
+ * match rhs container to *some* lhs cont
+ */
+ if (i == nLhsElems)
+ return false;
+ }
+ }
+ }
+ else
+ {
+ elog(ERROR, "invalid jsonb container type");
+ }
+
+ elog(ERROR, "unexpectedly fell off end of jsonb container");
+ return false;
+}
+
+/*
+ * Hash a JsonbValue scalar value, mixing the hash value into an existing
+ * hash provided by the caller.
+ *
+ * Some callers may wish to independently XOR in JB_FOBJECT and JB_FARRAY
+ * flags.
+ */
+void
+JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)
+{
+ uint32 tmp;
+
+ /* Compute hash value for scalarVal */
+ switch (scalarVal->type)
+ {
+ case jbvNull:
+ tmp = 0x01;
+ break;
+ case jbvString:
+ tmp = DatumGetUInt32(hash_any((const unsigned char *) scalarVal->val.string.val,
+ scalarVal->val.string.len));
+ break;
+ case jbvNumeric:
+ /* Must hash equal numerics to equal hash codes */
+ tmp = DatumGetUInt32(DirectFunctionCall1(hash_numeric,
+ NumericGetDatum(scalarVal->val.numeric)));
+ break;
+ case jbvBool:
+ tmp = scalarVal->val.boolean ? 0x02 : 0x04;
+
+ break;
+ default:
+ elog(ERROR, "invalid jsonb scalar type");
+ tmp = 0; /* keep compiler quiet */
+ break;
+ }
+
+ /*
+ * Combine hash values of successive keys, values and elements by rotating
+ * the previous value left 1 bit, then XOR'ing in the new
+ * key/value/element's hash value.
+ */
+ *hash = pg_rotate_left32(*hash, 1);
+ *hash ^= tmp;
+}
+
+/*
+ * Hash a value to a 64-bit value, with a seed. Otherwise, similar to
+ * JsonbHashScalarValue.
+ */
+void
+JsonbHashScalarValueExtended(const JsonbValue *scalarVal, uint64 *hash,
+ uint64 seed)
+{
+ uint64 tmp;
+
+ switch (scalarVal->type)
+ {
+ case jbvNull:
+ tmp = seed + 0x01;
+ break;
+ case jbvString:
+ tmp = DatumGetUInt64(hash_any_extended((const unsigned char *) scalarVal->val.string.val,
+ scalarVal->val.string.len,
+ seed));
+ break;
+ case jbvNumeric:
+ tmp = DatumGetUInt64(DirectFunctionCall2(hash_numeric_extended,
+ NumericGetDatum(scalarVal->val.numeric),
+ UInt64GetDatum(seed)));
+ break;
+ case jbvBool:
+ if (seed)
+ tmp = DatumGetUInt64(DirectFunctionCall2(hashcharextended,
+ BoolGetDatum(scalarVal->val.boolean),
+ UInt64GetDatum(seed)));
+ else
+ tmp = scalarVal->val.boolean ? 0x02 : 0x04;
+
+ break;
+ default:
+ elog(ERROR, "invalid jsonb scalar type");
+ break;
+ }
+
+ *hash = ROTATE_HIGH_AND_LOW_32BITS(*hash);
+ *hash ^= tmp;
+}
+
+/*
+ * Are two scalar JsonbValues of the same type a and b equal?
+ */
+static bool
+equalsJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
+{
+ if (aScalar->type == bScalar->type)
+ {
+ switch (aScalar->type)
+ {
+ case jbvNull:
+ return true;
+ case jbvString:
+ return lengthCompareJsonbStringValue(aScalar, bScalar) == 0;
+ case jbvNumeric:
+ return DatumGetBool(DirectFunctionCall2(numeric_eq,
+ PointerGetDatum(aScalar->val.numeric),
+ PointerGetDatum(bScalar->val.numeric)));
+ case jbvBool:
+ return aScalar->val.boolean == bScalar->val.boolean;
+
+ default:
+ elog(ERROR, "invalid jsonb scalar type");
+ }
+ }
+ elog(ERROR, "jsonb scalar type mismatch");
+ return false;
+}
+
+/*
+ * Compare two scalar JsonbValues, returning -1, 0, or 1.
+ *
+ * Strings are compared using the default collation. Used by B-tree
+ * operators, where a lexical sort order is generally expected.
+ */
+static int
+compareJsonbScalarValue(JsonbValue *aScalar, JsonbValue *bScalar)
+{
+ if (aScalar->type == bScalar->type)
+ {
+ switch (aScalar->type)
+ {
+ case jbvNull:
+ return 0;
+ case jbvString:
+ return varstr_cmp(aScalar->val.string.val,
+ aScalar->val.string.len,
+ bScalar->val.string.val,
+ bScalar->val.string.len,
+ DEFAULT_COLLATION_OID);
+ case jbvNumeric:
+ return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
+ PointerGetDatum(aScalar->val.numeric),
+ PointerGetDatum(bScalar->val.numeric)));
+ case jbvBool:
+ if (aScalar->val.boolean == bScalar->val.boolean)
+ return 0;
+ else if (aScalar->val.boolean > bScalar->val.boolean)
+ return 1;
+ else
+ return -1;
+ default:
+ elog(ERROR, "invalid jsonb scalar type");
+ }
+ }
+ elog(ERROR, "jsonb scalar type mismatch");
+ return -1;
+}
+
+
+/*
+ * Functions for manipulating the resizable buffer used by convertJsonb and
+ * its subroutines.
+ */
+
+/*
+ * Reserve 'len' bytes, at the end of the buffer, enlarging it if necessary.
+ * Returns the offset to the reserved area. The caller is expected to fill
+ * the reserved area later with copyToBuffer().
+ */
+static int
+reserveFromBuffer(StringInfo buffer, int len)
+{
+ int offset;
+
+ /* Make more room if needed */
+ enlargeStringInfo(buffer, len);
+
+ /* remember current offset */
+ offset = buffer->len;
+
+ /* reserve the space */
+ buffer->len += len;
+
+ /*
+ * Keep a trailing null in place, even though it's not useful for us; it
+ * seems best to preserve the invariants of StringInfos.
+ */
+ buffer->data[buffer->len] = '\0';
+
+ return offset;
+}
+
+/*
+ * Copy 'len' bytes to a previously reserved area in buffer.
+ */
+static void
+copyToBuffer(StringInfo buffer, int offset, const char *data, int len)
+{
+ memcpy(buffer->data + offset, data, len);
+}
+
+/*
+ * A shorthand for reserveFromBuffer + copyToBuffer.
+ */
+static void
+appendToBuffer(StringInfo buffer, const char *data, int len)
+{
+ int offset;
+
+ offset = reserveFromBuffer(buffer, len);
+ copyToBuffer(buffer, offset, data, len);
+}
+
+
+/*
+ * Append padding, so that the length of the StringInfo is int-aligned.
+ * Returns the number of padding bytes appended.
+ */
+static short
+padBufferToInt(StringInfo buffer)
+{
+ int padlen,
+ p,
+ offset;
+
+ padlen = INTALIGN(buffer->len) - buffer->len;
+
+ offset = reserveFromBuffer(buffer, padlen);
+
+ /* padlen must be small, so this is probably faster than a memset */
+ for (p = 0; p < padlen; p++)
+ buffer->data[offset + p] = '\0';
+
+ return padlen;
+}
+
+/*
+ * Given a JsonbValue, convert to Jsonb. The result is palloc'd.
+ */
+static Jsonb *
+convertToJsonb(JsonbValue *val)
+{
+ StringInfoData buffer;
+ JEntry jentry;
+ Jsonb *res;
+
+ /* Should not already have binary representation */
+ Assert(val->type != jbvBinary);
+
+ /* Allocate an output buffer. It will be enlarged as needed */
+ initStringInfo(&buffer);
+
+ /* Make room for the varlena header */
+ reserveFromBuffer(&buffer, VARHDRSZ);
+
+ convertJsonbValue(&buffer, &jentry, val, 0);
+
+ /*
+ * Note: the JEntry of the root is discarded. Therefore the root
+ * JsonbContainer struct must contain enough information to tell what kind
+ * of value it is.
+ */
+
+ res = (Jsonb *) buffer.data;
+
+ SET_VARSIZE(res, buffer.len);
+
+ return res;
+}
+
+/*
+ * Subroutine of convertJsonb: serialize a single JsonbValue into buffer.
+ *
+ * The JEntry header for this node is returned in *header. It is filled in
+ * with the length of this value and appropriate type bits. If we wish to
+ * store an end offset rather than a length, it is the caller's responsibility
+ * to adjust for that.
+ *
+ * If the value is an array or an object, this recurses. 'level' is only used
+ * for debugging purposes.
+ */
+static void
+convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
+{
+ check_stack_depth();
+
+ if (!val)
+ return;
+
+ /*
+ * A JsonbValue passed as val should never have a type of jbvBinary, and
+ * neither should any of its sub-components. Those values will be produced
+ * by convertJsonbArray and convertJsonbObject, the results of which will
+ * not be passed back to this function as an argument.
+ */
+
+ if (IsAJsonbScalar(val))
+ convertJsonbScalar(buffer, header, val);
+ else if (val->type == jbvArray)
+ convertJsonbArray(buffer, header, val, level);
+ else if (val->type == jbvObject)
+ convertJsonbObject(buffer, header, val, level);
+ else
+ elog(ERROR, "unknown type of jsonb container to convert");
+}
+
+static void
+convertJsonbArray(StringInfo buffer, JEntry *pheader, JsonbValue *val, int level)
+{
+ int base_offset;
+ int jentry_offset;
+ int i;
+ int totallen;
+ uint32 header;
+ int nElems = val->val.array.nElems;
+
+ /* Remember where in the buffer this array starts. */
+ base_offset = buffer->len;
+
+ /* Align to 4-byte boundary (any padding counts as part of my data) */
+ padBufferToInt(buffer);
+
+ /*
+ * Construct the header Jentry and store it in the beginning of the
+ * variable-length payload.
+ */
+ header = nElems | JB_FARRAY;
+ if (val->val.array.rawScalar)
+ {
+ Assert(nElems == 1);
+ Assert(level == 0);
+ header |= JB_FSCALAR;
+ }
+
+ appendToBuffer(buffer, (char *) &header, sizeof(uint32));
+
+ /* Reserve space for the JEntries of the elements. */
+ jentry_offset = reserveFromBuffer(buffer, sizeof(JEntry) * nElems);
+
+ totallen = 0;
+ for (i = 0; i < nElems; i++)
+ {
+ JsonbValue *elem = &val->val.array.elems[i];
+ int len;
+ JEntry meta;
+
+ /*
+ * Convert element, producing a JEntry and appending its
+ * variable-length data to buffer
+ */
+ convertJsonbValue(buffer, &meta, elem, level + 1);
+
+ len = JBE_OFFLENFLD(meta);
+ totallen += len;
+
+ /*
+ * Bail out if total variable-length data exceeds what will fit in a
+ * JEntry length field. We check this in each iteration, not just
+ * once at the end, to forestall possible integer overflow.
+ */
+ if (totallen > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("total size of jsonb array elements exceeds the maximum of %u bytes",
+ JENTRY_OFFLENMASK)));
+
+ /*
+ * Convert each JB_OFFSET_STRIDE'th length to an offset.
+ */
+ if ((i % JB_OFFSET_STRIDE) == 0)
+ meta = (meta & JENTRY_TYPEMASK) | totallen | JENTRY_HAS_OFF;
+
+ copyToBuffer(buffer, jentry_offset, (char *) &meta, sizeof(JEntry));
+ jentry_offset += sizeof(JEntry);
+ }
+
+ /* Total data size is everything we've appended to buffer */
+ totallen = buffer->len - base_offset;
+
+ /* Check length again, since we didn't include the metadata above */
+ if (totallen > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("total size of jsonb array elements exceeds the maximum of %u bytes",
+ JENTRY_OFFLENMASK)));
+
+ /* Initialize the header of this node in the container's JEntry array */
+ *pheader = JENTRY_ISCONTAINER | totallen;
+}
+
+static void
+convertJsonbObject(StringInfo buffer, JEntry *pheader, JsonbValue *val, int level)
+{
+ int base_offset;
+ int jentry_offset;
+ int i;
+ int totallen;
+ uint32 header;
+ int nPairs = val->val.object.nPairs;
+
+ /* Remember where in the buffer this object starts. */
+ base_offset = buffer->len;
+
+ /* Align to 4-byte boundary (any padding counts as part of my data) */
+ padBufferToInt(buffer);
+
+ /*
+ * Construct the header Jentry and store it in the beginning of the
+ * variable-length payload.
+ */
+ header = nPairs | JB_FOBJECT;
+ appendToBuffer(buffer, (char *) &header, sizeof(uint32));
+
+ /* Reserve space for the JEntries of the keys and values. */
+ jentry_offset = reserveFromBuffer(buffer, sizeof(JEntry) * nPairs * 2);
+
+ /*
+ * Iterate over the keys, then over the values, since that is the ordering
+ * we want in the on-disk representation.
+ */
+ totallen = 0;
+ for (i = 0; i < nPairs; i++)
+ {
+ JsonbPair *pair = &val->val.object.pairs[i];
+ int len;
+ JEntry meta;
+
+ /*
+ * Convert key, producing a JEntry and appending its variable-length
+ * data to buffer
+ */
+ convertJsonbScalar(buffer, &meta, &pair->key);
+
+ len = JBE_OFFLENFLD(meta);
+ totallen += len;
+
+ /*
+ * Bail out if total variable-length data exceeds what will fit in a
+ * JEntry length field. We check this in each iteration, not just
+ * once at the end, to forestall possible integer overflow.
+ */
+ if (totallen > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("total size of jsonb object elements exceeds the maximum of %u bytes",
+ JENTRY_OFFLENMASK)));
+
+ /*
+ * Convert each JB_OFFSET_STRIDE'th length to an offset.
+ */
+ if ((i % JB_OFFSET_STRIDE) == 0)
+ meta = (meta & JENTRY_TYPEMASK) | totallen | JENTRY_HAS_OFF;
+
+ copyToBuffer(buffer, jentry_offset, (char *) &meta, sizeof(JEntry));
+ jentry_offset += sizeof(JEntry);
+ }
+ for (i = 0; i < nPairs; i++)
+ {
+ JsonbPair *pair = &val->val.object.pairs[i];
+ int len;
+ JEntry meta;
+
+ /*
+ * Convert value, producing a JEntry and appending its variable-length
+ * data to buffer
+ */
+ convertJsonbValue(buffer, &meta, &pair->value, level + 1);
+
+ len = JBE_OFFLENFLD(meta);
+ totallen += len;
+
+ /*
+ * Bail out if total variable-length data exceeds what will fit in a
+ * JEntry length field. We check this in each iteration, not just
+ * once at the end, to forestall possible integer overflow.
+ */
+ if (totallen > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("total size of jsonb object elements exceeds the maximum of %u bytes",
+ JENTRY_OFFLENMASK)));
+
+ /*
+ * Convert each JB_OFFSET_STRIDE'th length to an offset.
+ */
+ if (((i + nPairs) % JB_OFFSET_STRIDE) == 0)
+ meta = (meta & JENTRY_TYPEMASK) | totallen | JENTRY_HAS_OFF;
+
+ copyToBuffer(buffer, jentry_offset, (char *) &meta, sizeof(JEntry));
+ jentry_offset += sizeof(JEntry);
+ }
+
+ /* Total data size is everything we've appended to buffer */
+ totallen = buffer->len - base_offset;
+
+ /* Check length again, since we didn't include the metadata above */
+ if (totallen > JENTRY_OFFLENMASK)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("total size of jsonb object elements exceeds the maximum of %u bytes",
+ JENTRY_OFFLENMASK)));
+
+ /* Initialize the header of this node in the container's JEntry array */
+ *pheader = JENTRY_ISCONTAINER | totallen;
+}
+
+static void
+convertJsonbScalar(StringInfo buffer, JEntry *jentry, JsonbValue *scalarVal)
+{
+ int numlen;
+ short padlen;
+
+ switch (scalarVal->type)
+ {
+ case jbvNull:
+ *jentry = JENTRY_ISNULL;
+ break;
+
+ case jbvString:
+ appendToBuffer(buffer, scalarVal->val.string.val, scalarVal->val.string.len);
+
+ *jentry = scalarVal->val.string.len;
+ break;
+
+ case jbvNumeric:
+ numlen = VARSIZE_ANY(scalarVal->val.numeric);
+ padlen = padBufferToInt(buffer);
+
+ appendToBuffer(buffer, (char *) scalarVal->val.numeric, numlen);
+
+ *jentry = JENTRY_ISNUMERIC | (padlen + numlen);
+ break;
+
+ case jbvBool:
+ *jentry = (scalarVal->val.boolean) ?
+ JENTRY_ISBOOL_TRUE : JENTRY_ISBOOL_FALSE;
+ break;
+
+ case jbvDatetime:
+ {
+ char buf[MAXDATELEN + 1];
+ size_t len;
+
+ JsonEncodeDateTime(buf,
+ scalarVal->val.datetime.value,
+ scalarVal->val.datetime.typid,
+ &scalarVal->val.datetime.tz);
+ len = strlen(buf);
+ appendToBuffer(buffer, buf, len);
+
+ *jentry = len;
+ }
+ break;
+
+ default:
+ elog(ERROR, "invalid jsonb scalar type");
+ }
+}
+
+/*
+ * Compare two jbvString JsonbValue values, a and b.
+ *
+ * This is a special qsort() comparator used to sort strings in certain
+ * internal contexts where it is sufficient to have a well-defined sort order.
+ * In particular, object pair keys are sorted according to this criteria to
+ * facilitate cheap binary searches where we don't care about lexical sort
+ * order.
+ *
+ * a and b are first sorted based on their length. If a tie-breaker is
+ * required, only then do we consider string binary equality.
+ */
+static int
+lengthCompareJsonbStringValue(const void *a, const void *b)
+{
+ const JsonbValue *va = (const JsonbValue *) a;
+ const JsonbValue *vb = (const JsonbValue *) b;
+
+ Assert(va->type == jbvString);
+ Assert(vb->type == jbvString);
+
+ return lengthCompareJsonbString(va->val.string.val, va->val.string.len,
+ vb->val.string.val, vb->val.string.len);
+}
+
+/*
+ * Subroutine for lengthCompareJsonbStringValue
+ *
+ * This is also useful separately to implement binary search on
+ * JsonbContainers.
+ */
+static int
+lengthCompareJsonbString(const char *val1, int len1, const char *val2, int len2)
+{
+ if (len1 == len2)
+ return memcmp(val1, val2, len1);
+ else
+ return len1 > len2 ? 1 : -1;
+}
+
+/*
+ * qsort_arg() comparator to compare JsonbPair values.
+ *
+ * Third argument 'binequal' may point to a bool. If it's set, *binequal is set
+ * to true iff a and b have full binary equality, since some callers have an
+ * interest in whether the two values are equal or merely equivalent.
+ *
+ * N.B: String comparisons here are "length-wise"
+ *
+ * Pairs with equals keys are ordered such that the order field is respected.
+ */
+static int
+lengthCompareJsonbPair(const void *a, const void *b, void *binequal)
+{
+ const JsonbPair *pa = (const JsonbPair *) a;
+ const JsonbPair *pb = (const JsonbPair *) b;
+ int res;
+
+ res = lengthCompareJsonbStringValue(&pa->key, &pb->key);
+ if (res == 0 && binequal)
+ *((bool *) binequal) = true;
+
+ /*
+ * Guarantee keeping order of equal pair. Unique algorithm will prefer
+ * first element as value.
+ */
+ if (res == 0)
+ res = (pa->order > pb->order) ? -1 : 1;
+
+ return res;
+}
+
+/*
+ * Sort and unique-ify pairs in JsonbValue object
+ */
+static void
+uniqueifyJsonbObject(JsonbValue *object)
+{
+ bool hasNonUniq = false;
+
+ Assert(object->type == jbvObject);
+
+ if (object->val.object.nPairs > 1)
+ qsort_arg(object->val.object.pairs, object->val.object.nPairs, sizeof(JsonbPair),
+ lengthCompareJsonbPair, &hasNonUniq);
+
+ if (hasNonUniq)
+ {
+ JsonbPair *ptr = object->val.object.pairs + 1,
+ *res = object->val.object.pairs;
+
+ while (ptr - object->val.object.pairs < object->val.object.nPairs)
+ {
+ /* Avoid copying over duplicate */
+ if (lengthCompareJsonbStringValue(ptr, res) != 0)
+ {
+ res++;
+ if (ptr != res)
+ memcpy(res, ptr, sizeof(JsonbPair));
+ }
+ ptr++;
+ }
+
+ object->val.object.nPairs = res + 1 - object->val.object.pairs;
+ }
+}
diff --git a/src/backend/utils/adt/jsonbsubs.c b/src/backend/utils/adt/jsonbsubs.c
new file mode 100644
index 0000000..16f1354
--- /dev/null
+++ b/src/backend/utils/adt/jsonbsubs.c
@@ -0,0 +1,416 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonbsubs.c
+ * Subscripting support functions for jsonb.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonbsubs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "executor/execExpr.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/subscripting.h"
+#include "parser/parse_coerce.h"
+#include "parser/parse_expr.h"
+#include "utils/jsonb.h"
+#include "utils/jsonfuncs.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+
+
+/* SubscriptingRefState.workspace for jsonb subscripting execution */
+typedef struct JsonbSubWorkspace
+{
+ bool expectArray; /* jsonb root is expected to be an array */
+ Oid *indexOid; /* OID of coerced subscript expression, could
+ * be only integer or text */
+ Datum *index; /* Subscript values in Datum format */
+} JsonbSubWorkspace;
+
+
+/*
+ * Finish parse analysis of a SubscriptingRef expression for a jsonb.
+ *
+ * Transform the subscript expressions, coerce them to text,
+ * and determine the result type of the SubscriptingRef node.
+ */
+static void
+jsonb_subscript_transform(SubscriptingRef *sbsref,
+ List *indirection,
+ ParseState *pstate,
+ bool isSlice,
+ bool isAssignment)
+{
+ List *upperIndexpr = NIL;
+ ListCell *idx;
+
+ /*
+ * Transform and convert the subscript expressions. Jsonb subscripting
+ * does not support slices, look only and the upper index.
+ */
+ foreach(idx, indirection)
+ {
+ A_Indices *ai = lfirst_node(A_Indices, idx);
+ Node *subExpr;
+
+ if (isSlice)
+ {
+ Node *expr = ai->uidx ? ai->uidx : ai->lidx;
+
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("jsonb subscript does not support slices"),
+ parser_errposition(pstate, exprLocation(expr))));
+ }
+
+ if (ai->uidx)
+ {
+ Oid subExprType = InvalidOid,
+ targetType = UNKNOWNOID;
+
+ subExpr = transformExpr(pstate, ai->uidx, pstate->p_expr_kind);
+ subExprType = exprType(subExpr);
+
+ if (subExprType != UNKNOWNOID)
+ {
+ Oid targets[2] = {INT4OID, TEXTOID};
+
+ /*
+ * Jsonb can handle multiple subscript types, but cases when a
+ * subscript could be coerced to multiple target types must be
+ * avoided, similar to overloaded functions. It could be
+ * possibly extend with jsonpath in the future.
+ */
+ for (int i = 0; i < 2; i++)
+ {
+ if (can_coerce_type(1, &subExprType, &targets[i], COERCION_IMPLICIT))
+ {
+ /*
+ * One type has already succeeded, it means there are
+ * two coercion targets possible, failure.
+ */
+ if (targetType != UNKNOWNOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("subscript type %s is not supported", format_type_be(subExprType)),
+ errhint("jsonb subscript must be coercible to only one type, integer or text."),
+ parser_errposition(pstate, exprLocation(subExpr))));
+
+ targetType = targets[i];
+ }
+ }
+
+ /*
+ * No suitable types were found, failure.
+ */
+ if (targetType == UNKNOWNOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("subscript type %s is not supported", format_type_be(subExprType)),
+ errhint("jsonb subscript must be coercible to either integer or text."),
+ parser_errposition(pstate, exprLocation(subExpr))));
+ }
+ else
+ targetType = TEXTOID;
+
+ /*
+ * We known from can_coerce_type that coercion will succeed, so
+ * coerce_type could be used. Note the implicit coercion context,
+ * which is required to handle subscripts of different types,
+ * similar to overloaded functions.
+ */
+ subExpr = coerce_type(pstate,
+ subExpr, subExprType,
+ targetType, -1,
+ COERCION_IMPLICIT,
+ COERCE_IMPLICIT_CAST,
+ -1);
+ if (subExpr == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("jsonb subscript must have text type"),
+ parser_errposition(pstate, exprLocation(subExpr))));
+ }
+ else
+ {
+ /*
+ * Slice with omitted upper bound. Should not happen as we already
+ * errored out on slice earlier, but handle this just in case.
+ */
+ Assert(isSlice && ai->is_slice);
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("jsonb subscript does not support slices"),
+ parser_errposition(pstate, exprLocation(ai->uidx))));
+ }
+
+ upperIndexpr = lappend(upperIndexpr, subExpr);
+ }
+
+ /* store the transformed lists into the SubscriptRef node */
+ sbsref->refupperindexpr = upperIndexpr;
+ sbsref->reflowerindexpr = NIL;
+
+ /* Determine the result type of the subscripting operation; always jsonb */
+ sbsref->refrestype = JSONBOID;
+ sbsref->reftypmod = -1;
+}
+
+/*
+ * During execution, process the subscripts in a SubscriptingRef expression.
+ *
+ * The subscript expressions are already evaluated in Datum form in the
+ * SubscriptingRefState's arrays. Check and convert them as necessary.
+ *
+ * If any subscript is NULL, we throw error in assignment cases, or in fetch
+ * cases set result to NULL and return false (instructing caller to skip the
+ * rest of the SubscriptingRef sequence).
+ */
+static bool
+jsonb_subscript_check_subscripts(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref_subscript.state;
+ JsonbSubWorkspace *workspace = (JsonbSubWorkspace *) sbsrefstate->workspace;
+
+ /*
+ * In case if the first subscript is an integer, the source jsonb is
+ * expected to be an array. This information is not used directly, all
+ * such cases are handled within corresponding jsonb assign functions. But
+ * if the source jsonb is NULL the expected type will be used to construct
+ * an empty source.
+ */
+ if (sbsrefstate->numupper > 0 && sbsrefstate->upperprovided[0] &&
+ !sbsrefstate->upperindexnull[0] && workspace->indexOid[0] == INT4OID)
+ workspace->expectArray = true;
+
+ /* Process upper subscripts */
+ for (int i = 0; i < sbsrefstate->numupper; i++)
+ {
+ if (sbsrefstate->upperprovided[i])
+ {
+ /* If any index expr yields NULL, result is NULL or error */
+ if (sbsrefstate->upperindexnull[i])
+ {
+ if (sbsrefstate->isassignment)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("jsonb subscript in assignment must not be null")));
+ *op->resnull = true;
+ return false;
+ }
+
+ /*
+ * For jsonb fetch and assign functions we need to provide path in
+ * text format. Convert if it's not already text.
+ */
+ if (workspace->indexOid[i] == INT4OID)
+ {
+ Datum datum = sbsrefstate->upperindex[i];
+ char *cs = DatumGetCString(DirectFunctionCall1(int4out, datum));
+
+ workspace->index[i] = CStringGetTextDatum(cs);
+ }
+ else
+ workspace->index[i] = sbsrefstate->upperindex[i];
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Evaluate SubscriptingRef fetch for a jsonb element.
+ *
+ * Source container is in step's result variable (it's known not NULL, since
+ * we set fetch_strict to true).
+ */
+static void
+jsonb_subscript_fetch(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ JsonbSubWorkspace *workspace = (JsonbSubWorkspace *) sbsrefstate->workspace;
+ Jsonb *jsonbSource;
+
+ /* Should not get here if source jsonb (or any subscript) is null */
+ Assert(!(*op->resnull));
+
+ jsonbSource = DatumGetJsonbP(*op->resvalue);
+ *op->resvalue = jsonb_get_element(jsonbSource,
+ workspace->index,
+ sbsrefstate->numupper,
+ op->resnull,
+ false);
+}
+
+/*
+ * Evaluate SubscriptingRef assignment for a jsonb element assignment.
+ *
+ * Input container (possibly null) is in result area, replacement value is in
+ * SubscriptingRefState's replacevalue/replacenull.
+ */
+static void
+jsonb_subscript_assign(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+ JsonbSubWorkspace *workspace = (JsonbSubWorkspace *) sbsrefstate->workspace;
+ Jsonb *jsonbSource;
+ JsonbValue replacevalue;
+
+ if (sbsrefstate->replacenull)
+ replacevalue.type = jbvNull;
+ else
+ JsonbToJsonbValue(DatumGetJsonbP(sbsrefstate->replacevalue),
+ &replacevalue);
+
+ /*
+ * In case if the input container is null, set up an empty jsonb and
+ * proceed with the assignment.
+ */
+ if (*op->resnull)
+ {
+ JsonbValue newSource;
+
+ /*
+ * To avoid any surprising results, set up an empty jsonb array in
+ * case of an array is expected (i.e. the first subscript is integer),
+ * otherwise jsonb object.
+ */
+ if (workspace->expectArray)
+ {
+ newSource.type = jbvArray;
+ newSource.val.array.nElems = 0;
+ newSource.val.array.rawScalar = false;
+ }
+ else
+ {
+ newSource.type = jbvObject;
+ newSource.val.object.nPairs = 0;
+ }
+
+ jsonbSource = JsonbValueToJsonb(&newSource);
+ *op->resnull = false;
+ }
+ else
+ jsonbSource = DatumGetJsonbP(*op->resvalue);
+
+ *op->resvalue = jsonb_set_element(jsonbSource,
+ workspace->index,
+ sbsrefstate->numupper,
+ &replacevalue);
+ /* The result is never NULL, so no need to change *op->resnull */
+}
+
+/*
+ * Compute old jsonb element value for a SubscriptingRef assignment
+ * expression. Will only be called if the new-value subexpression
+ * contains SubscriptingRef or FieldStore. This is the same as the
+ * regular fetch case, except that we have to handle a null jsonb,
+ * and the value should be stored into the SubscriptingRefState's
+ * prevvalue/prevnull fields.
+ */
+static void
+jsonb_subscript_fetch_old(ExprState *state,
+ ExprEvalStep *op,
+ ExprContext *econtext)
+{
+ SubscriptingRefState *sbsrefstate = op->d.sbsref.state;
+
+ if (*op->resnull)
+ {
+ /* whole jsonb is null, so any element is too */
+ sbsrefstate->prevvalue = (Datum) 0;
+ sbsrefstate->prevnull = true;
+ }
+ else
+ {
+ Jsonb *jsonbSource = DatumGetJsonbP(*op->resvalue);
+
+ sbsrefstate->prevvalue = jsonb_get_element(jsonbSource,
+ sbsrefstate->upperindex,
+ sbsrefstate->numupper,
+ &sbsrefstate->prevnull,
+ false);
+ }
+}
+
+/*
+ * Set up execution state for a jsonb subscript operation. Opposite to the
+ * arrays subscription, there is no limit for number of subscripts as jsonb
+ * type itself doesn't have nesting limits.
+ */
+static void
+jsonb_exec_setup(const SubscriptingRef *sbsref,
+ SubscriptingRefState *sbsrefstate,
+ SubscriptExecSteps *methods)
+{
+ JsonbSubWorkspace *workspace;
+ ListCell *lc;
+ int nupper = sbsref->refupperindexpr->length;
+ char *ptr;
+
+ /* Allocate type-specific workspace with space for per-subscript data */
+ workspace = palloc0(MAXALIGN(sizeof(JsonbSubWorkspace)) +
+ nupper * (sizeof(Datum) + sizeof(Oid)));
+ workspace->expectArray = false;
+ ptr = ((char *) workspace) + MAXALIGN(sizeof(JsonbSubWorkspace));
+
+ /*
+ * This coding assumes sizeof(Datum) >= sizeof(Oid), else we might
+ * misalign the indexOid pointer
+ */
+ workspace->index = (Datum *) ptr;
+ ptr += nupper * sizeof(Datum);
+ workspace->indexOid = (Oid *) ptr;
+
+ sbsrefstate->workspace = workspace;
+
+ /* Collect subscript data types necessary at execution time */
+ foreach(lc, sbsref->refupperindexpr)
+ {
+ Node *expr = lfirst(lc);
+ int i = foreach_current_index(lc);
+
+ workspace->indexOid[i] = exprType(expr);
+ }
+
+ /*
+ * Pass back pointers to appropriate step execution functions.
+ */
+ methods->sbs_check_subscripts = jsonb_subscript_check_subscripts;
+ methods->sbs_fetch = jsonb_subscript_fetch;
+ methods->sbs_assign = jsonb_subscript_assign;
+ methods->sbs_fetch_old = jsonb_subscript_fetch_old;
+}
+
+/*
+ * jsonb_subscript_handler
+ * Subscripting handler for jsonb.
+ *
+ */
+Datum
+jsonb_subscript_handler(PG_FUNCTION_ARGS)
+{
+ static const SubscriptRoutines sbsroutines = {
+ .transform = jsonb_subscript_transform,
+ .exec_setup = jsonb_exec_setup,
+ .fetch_strict = true, /* fetch returns NULL for NULL inputs */
+ .fetch_leakproof = true, /* fetch returns NULL for bad subscript */
+ .store_leakproof = false /* ... but assignment throws error */
+ };
+
+ PG_RETURN_POINTER(&sbsroutines);
+}
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
new file mode 100644
index 0000000..d473625
--- /dev/null
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -0,0 +1,5546 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonfuncs.c
+ * Functions to process JSON data types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_type.h"
+#include "common/jsonapi.h"
+#include "common/string.h"
+#include "fmgr.h"
+#include "funcapi.h"
+#include "lib/stringinfo.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/hsearch.h"
+#include "utils/json.h"
+#include "utils/jsonb.h"
+#include "utils/jsonfuncs.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+/* Operations available for setPath */
+#define JB_PATH_CREATE 0x0001
+#define JB_PATH_DELETE 0x0002
+#define JB_PATH_REPLACE 0x0004
+#define JB_PATH_INSERT_BEFORE 0x0008
+#define JB_PATH_INSERT_AFTER 0x0010
+#define JB_PATH_CREATE_OR_INSERT \
+ (JB_PATH_INSERT_BEFORE | JB_PATH_INSERT_AFTER | JB_PATH_CREATE)
+#define JB_PATH_FILL_GAPS 0x0020
+#define JB_PATH_CONSISTENT_POSITION 0x0040
+
+/* state for json_object_keys */
+typedef struct OkeysState
+{
+ JsonLexContext *lex;
+ char **result;
+ int result_size;
+ int result_count;
+ int sent_count;
+} OkeysState;
+
+/* state for iterate_json_values function */
+typedef struct IterateJsonStringValuesState
+{
+ JsonLexContext *lex;
+ JsonIterateStringValuesAction action; /* an action that will be applied
+ * to each json value */
+ void *action_state; /* any necessary context for iteration */
+ uint32 flags; /* what kind of elements from a json we want
+ * to iterate */
+} IterateJsonStringValuesState;
+
+/* state for transform_json_string_values function */
+typedef struct TransformJsonStringValuesState
+{
+ JsonLexContext *lex;
+ StringInfo strval; /* resulting json */
+ JsonTransformStringValuesAction action; /* an action that will be applied
+ * to each json value */
+ void *action_state; /* any necessary context for transformation */
+} TransformJsonStringValuesState;
+
+/* state for json_get* functions */
+typedef struct GetState
+{
+ JsonLexContext *lex;
+ text *tresult;
+ char *result_start;
+ bool normalize_results;
+ bool next_scalar;
+ int npath; /* length of each path-related array */
+ char **path_names; /* field name(s) being sought */
+ int *path_indexes; /* array index(es) being sought */
+ bool *pathok; /* is path matched to current depth? */
+ int *array_cur_index; /* current element index at each path
+ * level */
+} GetState;
+
+/* state for json_array_length */
+typedef struct AlenState
+{
+ JsonLexContext *lex;
+ int count;
+} AlenState;
+
+/* state for json_each */
+typedef struct EachState
+{
+ JsonLexContext *lex;
+ Tuplestorestate *tuple_store;
+ TupleDesc ret_tdesc;
+ MemoryContext tmp_cxt;
+ char *result_start;
+ bool normalize_results;
+ bool next_scalar;
+ char *normalized_scalar;
+} EachState;
+
+/* state for json_array_elements */
+typedef struct ElementsState
+{
+ JsonLexContext *lex;
+ const char *function_name;
+ Tuplestorestate *tuple_store;
+ TupleDesc ret_tdesc;
+ MemoryContext tmp_cxt;
+ char *result_start;
+ bool normalize_results;
+ bool next_scalar;
+ char *normalized_scalar;
+} ElementsState;
+
+/* state for get_json_object_as_hash */
+typedef struct JHashState
+{
+ JsonLexContext *lex;
+ const char *function_name;
+ HTAB *hash;
+ char *saved_scalar;
+ char *save_json_start;
+ JsonTokenType saved_token_type;
+} JHashState;
+
+/* hashtable element */
+typedef struct JsonHashEntry
+{
+ char fname[NAMEDATALEN]; /* hash key (MUST BE FIRST) */
+ char *val;
+ JsonTokenType type;
+} JsonHashEntry;
+
+/* structure to cache type I/O metadata needed for populate_scalar() */
+typedef struct ScalarIOData
+{
+ Oid typioparam;
+ FmgrInfo typiofunc;
+} ScalarIOData;
+
+/* these two structures are used recursively */
+typedef struct ColumnIOData ColumnIOData;
+typedef struct RecordIOData RecordIOData;
+
+/* structure to cache metadata needed for populate_array() */
+typedef struct ArrayIOData
+{
+ ColumnIOData *element_info; /* metadata cache */
+ Oid element_type; /* array element type id */
+ int32 element_typmod; /* array element type modifier */
+} ArrayIOData;
+
+/* structure to cache metadata needed for populate_composite() */
+typedef struct CompositeIOData
+{
+ /*
+ * We use pointer to a RecordIOData here because variable-length struct
+ * RecordIOData can't be used directly in ColumnIOData.io union
+ */
+ RecordIOData *record_io; /* metadata cache for populate_record() */
+ TupleDesc tupdesc; /* cached tuple descriptor */
+ /* these fields differ from target type only if domain over composite: */
+ Oid base_typid; /* base type id */
+ int32 base_typmod; /* base type modifier */
+ /* this field is used only if target type is domain over composite: */
+ void *domain_info; /* opaque cache for domain checks */
+} CompositeIOData;
+
+/* structure to cache metadata needed for populate_domain() */
+typedef struct DomainIOData
+{
+ ColumnIOData *base_io; /* metadata cache */
+ Oid base_typid; /* base type id */
+ int32 base_typmod; /* base type modifier */
+ void *domain_info; /* opaque cache for domain checks */
+} DomainIOData;
+
+/* enumeration type categories */
+typedef enum TypeCat
+{
+ TYPECAT_SCALAR = 's',
+ TYPECAT_ARRAY = 'a',
+ TYPECAT_COMPOSITE = 'c',
+ TYPECAT_COMPOSITE_DOMAIN = 'C',
+ TYPECAT_DOMAIN = 'd'
+} TypeCat;
+
+/* these two are stolen from hstore / record_out, used in populate_record* */
+
+/* structure to cache record metadata needed for populate_record_field() */
+struct ColumnIOData
+{
+ Oid typid; /* column type id */
+ int32 typmod; /* column type modifier */
+ TypeCat typcat; /* column type category */
+ ScalarIOData scalar_io; /* metadata cache for direct conversion
+ * through input function */
+ union
+ {
+ ArrayIOData array;
+ CompositeIOData composite;
+ DomainIOData domain;
+ } io; /* metadata cache for various column type
+ * categories */
+};
+
+/* structure to cache record metadata needed for populate_record() */
+struct RecordIOData
+{
+ Oid record_type;
+ int32 record_typmod;
+ int ncolumns;
+ ColumnIOData columns[FLEXIBLE_ARRAY_MEMBER];
+};
+
+/* per-query cache for populate_record_worker and populate_recordset_worker */
+typedef struct PopulateRecordCache
+{
+ Oid argtype; /* declared type of the record argument */
+ ColumnIOData c; /* metadata cache for populate_composite() */
+ MemoryContext fn_mcxt; /* where this is stored */
+} PopulateRecordCache;
+
+/* per-call state for populate_recordset */
+typedef struct PopulateRecordsetState
+{
+ JsonLexContext *lex;
+ const char *function_name;
+ HTAB *json_hash;
+ char *saved_scalar;
+ char *save_json_start;
+ JsonTokenType saved_token_type;
+ Tuplestorestate *tuple_store;
+ HeapTupleHeader rec;
+ PopulateRecordCache *cache;
+} PopulateRecordsetState;
+
+/* common data for populate_array_json() and populate_array_dim_jsonb() */
+typedef struct PopulateArrayContext
+{
+ ArrayBuildState *astate; /* array build state */
+ ArrayIOData *aio; /* metadata cache */
+ MemoryContext acxt; /* array build memory context */
+ MemoryContext mcxt; /* cache memory context */
+ const char *colname; /* for diagnostics only */
+ int *dims; /* dimensions */
+ int *sizes; /* current dimension counters */
+ int ndims; /* number of dimensions */
+} PopulateArrayContext;
+
+/* state for populate_array_json() */
+typedef struct PopulateArrayState
+{
+ JsonLexContext *lex; /* json lexer */
+ PopulateArrayContext *ctx; /* context */
+ char *element_start; /* start of the current array element */
+ char *element_scalar; /* current array element token if it is a
+ * scalar */
+ JsonTokenType element_type; /* current array element type */
+} PopulateArrayState;
+
+/* state for json_strip_nulls */
+typedef struct StripnullState
+{
+ JsonLexContext *lex;
+ StringInfo strval;
+ bool skip_next_null;
+} StripnullState;
+
+/* structure for generalized json/jsonb value passing */
+typedef struct JsValue
+{
+ bool is_json; /* json/jsonb */
+ union
+ {
+ struct
+ {
+ char *str; /* json string */
+ int len; /* json string length or -1 if null-terminated */
+ JsonTokenType type; /* json type */
+ } json; /* json value */
+
+ JsonbValue *jsonb; /* jsonb value */
+ } val;
+} JsValue;
+
+typedef struct JsObject
+{
+ bool is_json; /* json/jsonb */
+ union
+ {
+ HTAB *json_hash;
+ JsonbContainer *jsonb_cont;
+ } val;
+} JsObject;
+
+/* useful macros for testing JsValue properties */
+#define JsValueIsNull(jsv) \
+ ((jsv)->is_json ? \
+ (!(jsv)->val.json.str || (jsv)->val.json.type == JSON_TOKEN_NULL) : \
+ (!(jsv)->val.jsonb || (jsv)->val.jsonb->type == jbvNull))
+
+#define JsValueIsString(jsv) \
+ ((jsv)->is_json ? (jsv)->val.json.type == JSON_TOKEN_STRING \
+ : ((jsv)->val.jsonb && (jsv)->val.jsonb->type == jbvString))
+
+#define JsObjectIsEmpty(jso) \
+ ((jso)->is_json \
+ ? hash_get_num_entries((jso)->val.json_hash) == 0 \
+ : ((jso)->val.jsonb_cont == NULL || \
+ JsonContainerSize((jso)->val.jsonb_cont) == 0))
+
+#define JsObjectFree(jso) \
+ do { \
+ if ((jso)->is_json) \
+ hash_destroy((jso)->val.json_hash); \
+ } while (0)
+
+static int report_json_context(JsonLexContext *lex);
+
+/* semantic action functions for json_object_keys */
+static void okeys_object_field_start(void *state, char *fname, bool isnull);
+static void okeys_array_start(void *state);
+static void okeys_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* semantic action functions for json_get* functions */
+static void get_object_start(void *state);
+static void get_object_end(void *state);
+static void get_object_field_start(void *state, char *fname, bool isnull);
+static void get_object_field_end(void *state, char *fname, bool isnull);
+static void get_array_start(void *state);
+static void get_array_end(void *state);
+static void get_array_element_start(void *state, bool isnull);
+static void get_array_element_end(void *state, bool isnull);
+static void get_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* common worker function for json getter functions */
+static Datum get_path_all(FunctionCallInfo fcinfo, bool as_text);
+static text *get_worker(text *json, char **tpath, int *ipath, int npath,
+ bool normalize_results);
+static Datum get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text);
+static text *JsonbValueAsText(JsonbValue *v);
+
+/* semantic action functions for json_array_length */
+static void alen_object_start(void *state);
+static void alen_scalar(void *state, char *token, JsonTokenType tokentype);
+static void alen_array_element_start(void *state, bool isnull);
+
+/* common workers for json{b}_each* functions */
+static Datum each_worker(FunctionCallInfo fcinfo, bool as_text);
+static Datum each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
+ bool as_text);
+
+/* semantic action functions for json_each */
+static void each_object_field_start(void *state, char *fname, bool isnull);
+static void each_object_field_end(void *state, char *fname, bool isnull);
+static void each_array_start(void *state);
+static void each_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* common workers for json{b}_array_elements_* functions */
+static Datum elements_worker(FunctionCallInfo fcinfo, const char *funcname,
+ bool as_text);
+static Datum elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
+ bool as_text);
+
+/* semantic action functions for json_array_elements */
+static void elements_object_start(void *state);
+static void elements_array_element_start(void *state, bool isnull);
+static void elements_array_element_end(void *state, bool isnull);
+static void elements_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* turn a json object into a hash table */
+static HTAB *get_json_object_as_hash(char *json, int len, const char *funcname);
+
+/* semantic actions for populate_array_json */
+static void populate_array_object_start(void *_state);
+static void populate_array_array_end(void *_state);
+static void populate_array_element_start(void *_state, bool isnull);
+static void populate_array_element_end(void *_state, bool isnull);
+static void populate_array_scalar(void *_state, char *token, JsonTokenType tokentype);
+
+/* semantic action functions for get_json_object_as_hash */
+static void hash_object_field_start(void *state, char *fname, bool isnull);
+static void hash_object_field_end(void *state, char *fname, bool isnull);
+static void hash_array_start(void *state);
+static void hash_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* semantic action functions for populate_recordset */
+static void populate_recordset_object_field_start(void *state, char *fname, bool isnull);
+static void populate_recordset_object_field_end(void *state, char *fname, bool isnull);
+static void populate_recordset_scalar(void *state, char *token, JsonTokenType tokentype);
+static void populate_recordset_object_start(void *state);
+static void populate_recordset_object_end(void *state);
+static void populate_recordset_array_start(void *state);
+static void populate_recordset_array_element_start(void *state, bool isnull);
+
+/* semantic action functions for json_strip_nulls */
+static void sn_object_start(void *state);
+static void sn_object_end(void *state);
+static void sn_array_start(void *state);
+static void sn_array_end(void *state);
+static void sn_object_field_start(void *state, char *fname, bool isnull);
+static void sn_array_element_start(void *state, bool isnull);
+static void sn_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/* worker functions for populate_record, to_record, populate_recordset and to_recordset */
+static Datum populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname,
+ bool is_json, bool have_record_arg);
+static Datum populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
+ bool is_json, bool have_record_arg);
+
+/* helper functions for populate_record[set] */
+static HeapTupleHeader populate_record(TupleDesc tupdesc, RecordIOData **record_p,
+ HeapTupleHeader defaultval, MemoryContext mcxt,
+ JsObject *obj);
+static void get_record_type_from_argument(FunctionCallInfo fcinfo,
+ const char *funcname,
+ PopulateRecordCache *cache);
+static void get_record_type_from_query(FunctionCallInfo fcinfo,
+ const char *funcname,
+ PopulateRecordCache *cache);
+static void JsValueToJsObject(JsValue *jsv, JsObject *jso);
+static Datum populate_composite(CompositeIOData *io, Oid typid,
+ const char *colname, MemoryContext mcxt,
+ HeapTupleHeader defaultval, JsValue *jsv, bool isnull);
+static Datum populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv);
+static void prepare_column_cache(ColumnIOData *column, Oid typid, int32 typmod,
+ MemoryContext mcxt, bool need_scalar);
+static Datum populate_record_field(ColumnIOData *col, Oid typid, int32 typmod,
+ const char *colname, MemoryContext mcxt, Datum defaultval,
+ JsValue *jsv, bool *isnull);
+static RecordIOData *allocate_record_info(MemoryContext mcxt, int ncolumns);
+static bool JsObjectGetField(JsObject *obj, char *field, JsValue *jsv);
+static void populate_recordset_record(PopulateRecordsetState *state, JsObject *obj);
+static void populate_array_json(PopulateArrayContext *ctx, char *json, int len);
+static void populate_array_dim_jsonb(PopulateArrayContext *ctx, JsonbValue *jbv,
+ int ndim);
+static void populate_array_report_expected_array(PopulateArrayContext *ctx, int ndim);
+static void populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims);
+static void populate_array_check_dimension(PopulateArrayContext *ctx, int ndim);
+static void populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv);
+static Datum populate_array(ArrayIOData *aio, const char *colname,
+ MemoryContext mcxt, JsValue *jsv);
+static Datum populate_domain(DomainIOData *io, Oid typid, const char *colname,
+ MemoryContext mcxt, JsValue *jsv, bool isnull);
+
+/* functions supporting jsonb_delete, jsonb_set and jsonb_concat */
+static JsonbValue *IteratorConcat(JsonbIterator **it1, JsonbIterator **it2,
+ JsonbParseState **state);
+static JsonbValue *setPath(JsonbIterator **it, Datum *path_elems,
+ bool *path_nulls, int path_len,
+ JsonbParseState **st, int level, JsonbValue *newval,
+ int op_type);
+static void setPathObject(JsonbIterator **it, Datum *path_elems,
+ bool *path_nulls, int path_len, JsonbParseState **st,
+ int level,
+ JsonbValue *newval, uint32 npairs, int op_type);
+static void setPathArray(JsonbIterator **it, Datum *path_elems,
+ bool *path_nulls, int path_len, JsonbParseState **st,
+ int level,
+ JsonbValue *newval, uint32 nelems, int op_type);
+
+/* function supporting iterate_json_values */
+static void iterate_values_scalar(void *state, char *token, JsonTokenType tokentype);
+static void iterate_values_object_field_start(void *state, char *fname, bool isnull);
+
+/* functions supporting transform_json_string_values */
+static void transform_string_values_object_start(void *state);
+static void transform_string_values_object_end(void *state);
+static void transform_string_values_array_start(void *state);
+static void transform_string_values_array_end(void *state);
+static void transform_string_values_object_field_start(void *state, char *fname, bool isnull);
+static void transform_string_values_array_element_start(void *state, bool isnull);
+static void transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype);
+
+/*
+ * pg_parse_json_or_ereport
+ *
+ * This function is like pg_parse_json, except that it does not return a
+ * JsonParseErrorType. Instead, in case of any failure, this function will
+ * ereport(ERROR).
+ */
+void
+pg_parse_json_or_ereport(JsonLexContext *lex, JsonSemAction *sem)
+{
+ JsonParseErrorType result;
+
+ result = pg_parse_json(lex, sem);
+ if (result != JSON_SUCCESS)
+ json_ereport_error(result, lex);
+}
+
+/*
+ * makeJsonLexContext
+ *
+ * This is like makeJsonLexContextCstringLen, but it accepts a text value
+ * directly.
+ */
+JsonLexContext *
+makeJsonLexContext(text *json, bool need_escapes)
+{
+ /*
+ * Most callers pass a detoasted datum, but it's not clear that they all
+ * do. pg_detoast_datum_packed() is cheap insurance.
+ */
+ json = pg_detoast_datum_packed(json);
+
+ return makeJsonLexContextCstringLen(VARDATA_ANY(json),
+ VARSIZE_ANY_EXHDR(json),
+ GetDatabaseEncoding(),
+ need_escapes);
+}
+
+/*
+ * SQL function json_object_keys
+ *
+ * Returns the set of keys for the object argument.
+ *
+ * This SRF operates in value-per-call mode. It processes the
+ * object during the first call, and the keys are simply stashed
+ * in an array, whose size is expanded as necessary. This is probably
+ * safe enough for a list of keys of a single object, since they are
+ * limited in size to NAMEDATALEN and the number of keys is unlikely to
+ * be so huge that it has major memory implications.
+ */
+Datum
+jsonb_object_keys(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ OkeysState *state;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcontext;
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ bool skipNested = false;
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+
+ if (JB_ROOT_IS_SCALAR(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a scalar",
+ "jsonb_object_keys")));
+ else if (JB_ROOT_IS_ARRAY(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on an array",
+ "jsonb_object_keys")));
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ state = palloc(sizeof(OkeysState));
+
+ state->result_size = JB_ROOT_COUNT(jb);
+ state->result_count = 0;
+ state->sent_count = 0;
+ state->result = palloc(state->result_size * sizeof(char *));
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if (r == WJB_KEY)
+ {
+ char *cstr;
+
+ cstr = palloc(v.val.string.len + 1 * sizeof(char));
+ memcpy(cstr, v.val.string.val, v.val.string.len);
+ cstr[v.val.string.len] = '\0';
+ state->result[state->result_count++] = cstr;
+ }
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = (void *) state;
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ state = (OkeysState *) funcctx->user_fctx;
+
+ if (state->sent_count < state->result_count)
+ {
+ char *nxt = state->result[state->sent_count++];
+
+ SRF_RETURN_NEXT(funcctx, CStringGetTextDatum(nxt));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+/*
+ * Report a JSON error.
+ */
+void
+json_ereport_error(JsonParseErrorType error, JsonLexContext *lex)
+{
+ if (error == JSON_UNICODE_HIGH_ESCAPE ||
+ error == JSON_UNICODE_CODE_POINT_ZERO)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
+ errmsg("unsupported Unicode escape sequence"),
+ errdetail_internal("%s", json_errdetail(error, lex)),
+ report_json_context(lex)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "json"),
+ errdetail_internal("%s", json_errdetail(error, lex)),
+ report_json_context(lex)));
+}
+
+/*
+ * Report a CONTEXT line for bogus JSON input.
+ *
+ * lex->token_terminator must be set to identify the spot where we detected
+ * the error. Note that lex->token_start might be NULL, in case we recognized
+ * error at EOF.
+ *
+ * The return value isn't meaningful, but we make it non-void so that this
+ * can be invoked inside ereport().
+ */
+static int
+report_json_context(JsonLexContext *lex)
+{
+ const char *context_start;
+ const char *context_end;
+ const char *line_start;
+ char *ctxt;
+ int ctxtlen;
+ const char *prefix;
+ const char *suffix;
+
+ /* Choose boundaries for the part of the input we will display */
+ line_start = lex->line_start;
+ context_start = line_start;
+ context_end = lex->token_terminator;
+ Assert(context_end >= context_start);
+
+ /* Advance until we are close enough to context_end */
+ while (context_end - context_start >= 50)
+ {
+ /* Advance to next multibyte character */
+ if (IS_HIGHBIT_SET(*context_start))
+ context_start += pg_mblen(context_start);
+ else
+ context_start++;
+ }
+
+ /*
+ * We add "..." to indicate that the excerpt doesn't start at the
+ * beginning of the line ... but if we're within 3 characters of the
+ * beginning of the line, we might as well just show the whole line.
+ */
+ if (context_start - line_start <= 3)
+ context_start = line_start;
+
+ /* Get a null-terminated copy of the data to present */
+ ctxtlen = context_end - context_start;
+ ctxt = palloc(ctxtlen + 1);
+ memcpy(ctxt, context_start, ctxtlen);
+ ctxt[ctxtlen] = '\0';
+
+ /*
+ * Show the context, prefixing "..." if not starting at start of line, and
+ * suffixing "..." if not ending at end of line.
+ */
+ prefix = (context_start > line_start) ? "..." : "";
+ suffix = (lex->token_type != JSON_TOKEN_END &&
+ context_end - lex->input < lex->input_length &&
+ *context_end != '\n' && *context_end != '\r') ? "..." : "";
+
+ return errcontext("JSON data, line %d: %s%s%s",
+ lex->line_number, prefix, ctxt, suffix);
+}
+
+
+Datum
+json_object_keys(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ OkeysState *state;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *json = PG_GETARG_TEXT_PP(0);
+ JsonLexContext *lex = makeJsonLexContext(json, true);
+ JsonSemAction *sem;
+ MemoryContext oldcontext;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ state = palloc(sizeof(OkeysState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ state->lex = lex;
+ state->result_size = 256;
+ state->result_count = 0;
+ state->sent_count = 0;
+ state->result = palloc(256 * sizeof(char *));
+
+ sem->semstate = (void *) state;
+ sem->array_start = okeys_array_start;
+ sem->scalar = okeys_scalar;
+ sem->object_field_start = okeys_object_field_start;
+ /* remainder are all NULL, courtesy of palloc0 above */
+
+ pg_parse_json_or_ereport(lex, sem);
+ /* keys are now in state->result */
+
+ pfree(lex->strval->data);
+ pfree(lex->strval);
+ pfree(lex);
+ pfree(sem);
+
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = (void *) state;
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ state = (OkeysState *) funcctx->user_fctx;
+
+ if (state->sent_count < state->result_count)
+ {
+ char *nxt = state->result[state->sent_count++];
+
+ SRF_RETURN_NEXT(funcctx, CStringGetTextDatum(nxt));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+static void
+okeys_object_field_start(void *state, char *fname, bool isnull)
+{
+ OkeysState *_state = (OkeysState *) state;
+
+ /* only collecting keys for the top level object */
+ if (_state->lex->lex_level != 1)
+ return;
+
+ /* enlarge result array if necessary */
+ if (_state->result_count >= _state->result_size)
+ {
+ _state->result_size *= 2;
+ _state->result = (char **)
+ repalloc(_state->result, sizeof(char *) * _state->result_size);
+ }
+
+ /* save a copy of the field name */
+ _state->result[_state->result_count++] = pstrdup(fname);
+}
+
+static void
+okeys_array_start(void *state)
+{
+ OkeysState *_state = (OkeysState *) state;
+
+ /* top level must be a json object */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on an array",
+ "json_object_keys")));
+}
+
+static void
+okeys_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ OkeysState *_state = (OkeysState *) state;
+
+ /* top level must be a json object */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a scalar",
+ "json_object_keys")));
+}
+
+/*
+ * json and jsonb getter functions
+ * these implement the -> ->> #> and #>> operators
+ * and the json{b?}_extract_path*(json, text, ...) functions
+ */
+
+
+Datum
+json_object_field(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ text *fname = PG_GETARG_TEXT_PP(1);
+ char *fnamestr = text_to_cstring(fname);
+ text *result;
+
+ result = get_worker(json, &fnamestr, NULL, 1, false);
+
+ if (result != NULL)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_object_field(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ text *key = PG_GETARG_TEXT_PP(1);
+ JsonbValue *v;
+ JsonbValue vbuf;
+
+ if (!JB_ROOT_IS_OBJECT(jb))
+ PG_RETURN_NULL();
+
+ v = getKeyJsonValueFromContainer(&jb->root,
+ VARDATA_ANY(key),
+ VARSIZE_ANY_EXHDR(key),
+ &vbuf);
+
+ if (v != NULL)
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(v));
+
+ PG_RETURN_NULL();
+}
+
+Datum
+json_object_field_text(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ text *fname = PG_GETARG_TEXT_PP(1);
+ char *fnamestr = text_to_cstring(fname);
+ text *result;
+
+ result = get_worker(json, &fnamestr, NULL, 1, true);
+
+ if (result != NULL)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_object_field_text(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ text *key = PG_GETARG_TEXT_PP(1);
+ JsonbValue *v;
+ JsonbValue vbuf;
+
+ if (!JB_ROOT_IS_OBJECT(jb))
+ PG_RETURN_NULL();
+
+ v = getKeyJsonValueFromContainer(&jb->root,
+ VARDATA_ANY(key),
+ VARSIZE_ANY_EXHDR(key),
+ &vbuf);
+
+ if (v != NULL && v->type != jbvNull)
+ PG_RETURN_TEXT_P(JsonbValueAsText(v));
+
+ PG_RETURN_NULL();
+}
+
+Datum
+json_array_element(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ int element = PG_GETARG_INT32(1);
+ text *result;
+
+ result = get_worker(json, NULL, &element, 1, false);
+
+ if (result != NULL)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_array_element(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ int element = PG_GETARG_INT32(1);
+ JsonbValue *v;
+
+ if (!JB_ROOT_IS_ARRAY(jb))
+ PG_RETURN_NULL();
+
+ /* Handle negative subscript */
+ if (element < 0)
+ {
+ uint32 nelements = JB_ROOT_COUNT(jb);
+
+ if (-element > nelements)
+ PG_RETURN_NULL();
+ else
+ element += nelements;
+ }
+
+ v = getIthJsonbValueFromContainer(&jb->root, element);
+ if (v != NULL)
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(v));
+
+ PG_RETURN_NULL();
+}
+
+Datum
+json_array_element_text(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ int element = PG_GETARG_INT32(1);
+ text *result;
+
+ result = get_worker(json, NULL, &element, 1, true);
+
+ if (result != NULL)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_array_element_text(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ int element = PG_GETARG_INT32(1);
+ JsonbValue *v;
+
+ if (!JB_ROOT_IS_ARRAY(jb))
+ PG_RETURN_NULL();
+
+ /* Handle negative subscript */
+ if (element < 0)
+ {
+ uint32 nelements = JB_ROOT_COUNT(jb);
+
+ if (-element > nelements)
+ PG_RETURN_NULL();
+ else
+ element += nelements;
+ }
+
+ v = getIthJsonbValueFromContainer(&jb->root, element);
+
+ if (v != NULL && v->type != jbvNull)
+ PG_RETURN_TEXT_P(JsonbValueAsText(v));
+
+ PG_RETURN_NULL();
+}
+
+Datum
+json_extract_path(PG_FUNCTION_ARGS)
+{
+ return get_path_all(fcinfo, false);
+}
+
+Datum
+json_extract_path_text(PG_FUNCTION_ARGS)
+{
+ return get_path_all(fcinfo, true);
+}
+
+/*
+ * common routine for extract_path functions
+ */
+static Datum
+get_path_all(FunctionCallInfo fcinfo, bool as_text)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ ArrayType *path = PG_GETARG_ARRAYTYPE_P(1);
+ text *result;
+ Datum *pathtext;
+ bool *pathnulls;
+ int npath;
+ char **tpath;
+ int *ipath;
+ int i;
+
+ /*
+ * If the array contains any null elements, return NULL, on the grounds
+ * that you'd have gotten NULL if any RHS value were NULL in a nested
+ * series of applications of the -> operator. (Note: because we also
+ * return NULL for error cases such as no-such-field, this is true
+ * regardless of the contents of the rest of the array.)
+ */
+ if (array_contains_nulls(path))
+ PG_RETURN_NULL();
+
+ deconstruct_array(path, TEXTOID, -1, false, TYPALIGN_INT,
+ &pathtext, &pathnulls, &npath);
+
+ tpath = palloc(npath * sizeof(char *));
+ ipath = palloc(npath * sizeof(int));
+
+ for (i = 0; i < npath; i++)
+ {
+ Assert(!pathnulls[i]);
+ tpath[i] = TextDatumGetCString(pathtext[i]);
+
+ /*
+ * we have no idea at this stage what structure the document is so
+ * just convert anything in the path that we can to an integer and set
+ * all the other integers to INT_MIN which will never match.
+ */
+ if (*tpath[i] != '\0')
+ {
+ int ind;
+ char *endptr;
+
+ errno = 0;
+ ind = strtoint(tpath[i], &endptr, 10);
+ if (endptr == tpath[i] || *endptr != '\0' || errno != 0)
+ ipath[i] = INT_MIN;
+ else
+ ipath[i] = ind;
+ }
+ else
+ ipath[i] = INT_MIN;
+ }
+
+ result = get_worker(json, tpath, ipath, npath, as_text);
+
+ if (result != NULL)
+ PG_RETURN_TEXT_P(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * get_worker
+ *
+ * common worker for all the json getter functions
+ *
+ * json: JSON object (in text form)
+ * tpath[]: field name(s) to extract
+ * ipath[]: array index(es) (zero-based) to extract, accepts negatives
+ * npath: length of tpath[] and/or ipath[]
+ * normalize_results: true to de-escape string and null scalars
+ *
+ * tpath can be NULL, or any one tpath[] entry can be NULL, if an object
+ * field is not to be matched at that nesting level. Similarly, ipath can
+ * be NULL, or any one ipath[] entry can be INT_MIN if an array element is
+ * not to be matched at that nesting level (a json datum should never be
+ * large enough to have -INT_MIN elements due to MaxAllocSize restriction).
+ */
+static text *
+get_worker(text *json,
+ char **tpath,
+ int *ipath,
+ int npath,
+ bool normalize_results)
+{
+ JsonLexContext *lex = makeJsonLexContext(json, true);
+ JsonSemAction *sem = palloc0(sizeof(JsonSemAction));
+ GetState *state = palloc0(sizeof(GetState));
+
+ Assert(npath >= 0);
+
+ state->lex = lex;
+ /* is it "_as_text" variant? */
+ state->normalize_results = normalize_results;
+ state->npath = npath;
+ state->path_names = tpath;
+ state->path_indexes = ipath;
+ state->pathok = palloc0(sizeof(bool) * npath);
+ state->array_cur_index = palloc(sizeof(int) * npath);
+
+ if (npath > 0)
+ state->pathok[0] = true;
+
+ sem->semstate = (void *) state;
+
+ /*
+ * Not all variants need all the semantic routines. Only set the ones that
+ * are actually needed for maximum efficiency.
+ */
+ sem->scalar = get_scalar;
+ if (npath == 0)
+ {
+ sem->object_start = get_object_start;
+ sem->object_end = get_object_end;
+ sem->array_start = get_array_start;
+ sem->array_end = get_array_end;
+ }
+ if (tpath != NULL)
+ {
+ sem->object_field_start = get_object_field_start;
+ sem->object_field_end = get_object_field_end;
+ }
+ if (ipath != NULL)
+ {
+ sem->array_start = get_array_start;
+ sem->array_element_start = get_array_element_start;
+ sem->array_element_end = get_array_element_end;
+ }
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ return state->tresult;
+}
+
+static void
+get_object_start(void *state)
+{
+ GetState *_state = (GetState *) state;
+ int lex_level = _state->lex->lex_level;
+
+ if (lex_level == 0 && _state->npath == 0)
+ {
+ /*
+ * Special case: we should match the entire object. We only need this
+ * at outermost level because at nested levels the match will have
+ * been started by the outer field or array element callback.
+ */
+ _state->result_start = _state->lex->token_start;
+ }
+}
+
+static void
+get_object_end(void *state)
+{
+ GetState *_state = (GetState *) state;
+ int lex_level = _state->lex->lex_level;
+
+ if (lex_level == 0 && _state->npath == 0)
+ {
+ /* Special case: return the entire object */
+ char *start = _state->result_start;
+ int len = _state->lex->prev_token_terminator - start;
+
+ _state->tresult = cstring_to_text_with_len(start, len);
+ }
+}
+
+static void
+get_object_field_start(void *state, char *fname, bool isnull)
+{
+ GetState *_state = (GetState *) state;
+ bool get_next = false;
+ int lex_level = _state->lex->lex_level;
+
+ if (lex_level <= _state->npath &&
+ _state->pathok[lex_level - 1] &&
+ _state->path_names != NULL &&
+ _state->path_names[lex_level - 1] != NULL &&
+ strcmp(fname, _state->path_names[lex_level - 1]) == 0)
+ {
+ if (lex_level < _state->npath)
+ {
+ /* if not at end of path just mark path ok */
+ _state->pathok[lex_level] = true;
+ }
+ else
+ {
+ /* end of path, so we want this value */
+ get_next = true;
+ }
+ }
+
+ if (get_next)
+ {
+ /* this object overrides any previous matching object */
+ _state->tresult = NULL;
+ _state->result_start = NULL;
+
+ if (_state->normalize_results &&
+ _state->lex->token_type == JSON_TOKEN_STRING)
+ {
+ /* for as_text variants, tell get_scalar to set it for us */
+ _state->next_scalar = true;
+ }
+ else
+ {
+ /* for non-as_text variants, just note the json starting point */
+ _state->result_start = _state->lex->token_start;
+ }
+ }
+}
+
+static void
+get_object_field_end(void *state, char *fname, bool isnull)
+{
+ GetState *_state = (GetState *) state;
+ bool get_last = false;
+ int lex_level = _state->lex->lex_level;
+
+ /* same tests as in get_object_field_start */
+ if (lex_level <= _state->npath &&
+ _state->pathok[lex_level - 1] &&
+ _state->path_names != NULL &&
+ _state->path_names[lex_level - 1] != NULL &&
+ strcmp(fname, _state->path_names[lex_level - 1]) == 0)
+ {
+ if (lex_level < _state->npath)
+ {
+ /* done with this field so reset pathok */
+ _state->pathok[lex_level] = false;
+ }
+ else
+ {
+ /* end of path, so we want this value */
+ get_last = true;
+ }
+ }
+
+ /* for as_text scalar case, our work is already done */
+ if (get_last && _state->result_start != NULL)
+ {
+ /*
+ * make a text object from the string from the previously noted json
+ * start up to the end of the previous token (the lexer is by now
+ * ahead of us on whatever came after what we're interested in).
+ */
+ if (isnull && _state->normalize_results)
+ _state->tresult = (text *) NULL;
+ else
+ {
+ char *start = _state->result_start;
+ int len = _state->lex->prev_token_terminator - start;
+
+ _state->tresult = cstring_to_text_with_len(start, len);
+ }
+
+ /* this should be unnecessary but let's do it for cleanliness: */
+ _state->result_start = NULL;
+ }
+}
+
+static void
+get_array_start(void *state)
+{
+ GetState *_state = (GetState *) state;
+ int lex_level = _state->lex->lex_level;
+
+ if (lex_level < _state->npath)
+ {
+ /* Initialize counting of elements in this array */
+ _state->array_cur_index[lex_level] = -1;
+
+ /* INT_MIN value is reserved to represent invalid subscript */
+ if (_state->path_indexes[lex_level] < 0 &&
+ _state->path_indexes[lex_level] != INT_MIN)
+ {
+ /* Negative subscript -- convert to positive-wise subscript */
+ JsonParseErrorType error;
+ int nelements;
+
+ error = json_count_array_elements(_state->lex, &nelements);
+ if (error != JSON_SUCCESS)
+ json_ereport_error(error, _state->lex);
+
+ if (-_state->path_indexes[lex_level] <= nelements)
+ _state->path_indexes[lex_level] += nelements;
+ }
+ }
+ else if (lex_level == 0 && _state->npath == 0)
+ {
+ /*
+ * Special case: we should match the entire array. We only need this
+ * at the outermost level because at nested levels the match will have
+ * been started by the outer field or array element callback.
+ */
+ _state->result_start = _state->lex->token_start;
+ }
+}
+
+static void
+get_array_end(void *state)
+{
+ GetState *_state = (GetState *) state;
+ int lex_level = _state->lex->lex_level;
+
+ if (lex_level == 0 && _state->npath == 0)
+ {
+ /* Special case: return the entire array */
+ char *start = _state->result_start;
+ int len = _state->lex->prev_token_terminator - start;
+
+ _state->tresult = cstring_to_text_with_len(start, len);
+ }
+}
+
+static void
+get_array_element_start(void *state, bool isnull)
+{
+ GetState *_state = (GetState *) state;
+ bool get_next = false;
+ int lex_level = _state->lex->lex_level;
+
+ /* Update array element counter */
+ if (lex_level <= _state->npath)
+ _state->array_cur_index[lex_level - 1]++;
+
+ if (lex_level <= _state->npath &&
+ _state->pathok[lex_level - 1] &&
+ _state->path_indexes != NULL &&
+ _state->array_cur_index[lex_level - 1] == _state->path_indexes[lex_level - 1])
+ {
+ if (lex_level < _state->npath)
+ {
+ /* if not at end of path just mark path ok */
+ _state->pathok[lex_level] = true;
+ }
+ else
+ {
+ /* end of path, so we want this value */
+ get_next = true;
+ }
+ }
+
+ /* same logic as for objects */
+ if (get_next)
+ {
+ _state->tresult = NULL;
+ _state->result_start = NULL;
+
+ if (_state->normalize_results &&
+ _state->lex->token_type == JSON_TOKEN_STRING)
+ {
+ _state->next_scalar = true;
+ }
+ else
+ {
+ _state->result_start = _state->lex->token_start;
+ }
+ }
+}
+
+static void
+get_array_element_end(void *state, bool isnull)
+{
+ GetState *_state = (GetState *) state;
+ bool get_last = false;
+ int lex_level = _state->lex->lex_level;
+
+ /* same tests as in get_array_element_start */
+ if (lex_level <= _state->npath &&
+ _state->pathok[lex_level - 1] &&
+ _state->path_indexes != NULL &&
+ _state->array_cur_index[lex_level - 1] == _state->path_indexes[lex_level - 1])
+ {
+ if (lex_level < _state->npath)
+ {
+ /* done with this element so reset pathok */
+ _state->pathok[lex_level] = false;
+ }
+ else
+ {
+ /* end of path, so we want this value */
+ get_last = true;
+ }
+ }
+
+ /* same logic as for objects */
+ if (get_last && _state->result_start != NULL)
+ {
+ if (isnull && _state->normalize_results)
+ _state->tresult = (text *) NULL;
+ else
+ {
+ char *start = _state->result_start;
+ int len = _state->lex->prev_token_terminator - start;
+
+ _state->tresult = cstring_to_text_with_len(start, len);
+ }
+
+ _state->result_start = NULL;
+ }
+}
+
+static void
+get_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ GetState *_state = (GetState *) state;
+ int lex_level = _state->lex->lex_level;
+
+ /* Check for whole-object match */
+ if (lex_level == 0 && _state->npath == 0)
+ {
+ if (_state->normalize_results && tokentype == JSON_TOKEN_STRING)
+ {
+ /* we want the de-escaped string */
+ _state->next_scalar = true;
+ }
+ else if (_state->normalize_results && tokentype == JSON_TOKEN_NULL)
+ {
+ _state->tresult = (text *) NULL;
+ }
+ else
+ {
+ /*
+ * This is a bit hokey: we will suppress whitespace after the
+ * scalar token, but not whitespace before it. Probably not worth
+ * doing our own space-skipping to avoid that.
+ */
+ char *start = _state->lex->input;
+ int len = _state->lex->prev_token_terminator - start;
+
+ _state->tresult = cstring_to_text_with_len(start, len);
+ }
+ }
+
+ if (_state->next_scalar)
+ {
+ /* a de-escaped text value is wanted, so supply it */
+ _state->tresult = cstring_to_text(token);
+ /* make sure the next call to get_scalar doesn't overwrite it */
+ _state->next_scalar = false;
+ }
+}
+
+Datum
+jsonb_extract_path(PG_FUNCTION_ARGS)
+{
+ return get_jsonb_path_all(fcinfo, false);
+}
+
+Datum
+jsonb_extract_path_text(PG_FUNCTION_ARGS)
+{
+ return get_jsonb_path_all(fcinfo, true);
+}
+
+static Datum
+get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ ArrayType *path = PG_GETARG_ARRAYTYPE_P(1);
+ Datum *pathtext;
+ bool *pathnulls;
+ bool isnull;
+ int npath;
+ Datum res;
+
+ /*
+ * If the array contains any null elements, return NULL, on the grounds
+ * that you'd have gotten NULL if any RHS value were NULL in a nested
+ * series of applications of the -> operator. (Note: because we also
+ * return NULL for error cases such as no-such-field, this is true
+ * regardless of the contents of the rest of the array.)
+ */
+ if (array_contains_nulls(path))
+ PG_RETURN_NULL();
+
+ deconstruct_array(path, TEXTOID, -1, false, TYPALIGN_INT,
+ &pathtext, &pathnulls, &npath);
+
+ res = jsonb_get_element(jb, pathtext, npath, &isnull, as_text);
+
+ if (isnull)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_DATUM(res);
+}
+
+Datum
+jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text)
+{
+ JsonbContainer *container = &jb->root;
+ JsonbValue *jbvp = NULL;
+ int i;
+ bool have_object = false,
+ have_array = false;
+
+ *isnull = false;
+
+ /* Identify whether we have object, array, or scalar at top-level */
+ if (JB_ROOT_IS_OBJECT(jb))
+ have_object = true;
+ else if (JB_ROOT_IS_ARRAY(jb) && !JB_ROOT_IS_SCALAR(jb))
+ have_array = true;
+ else
+ {
+ Assert(JB_ROOT_IS_ARRAY(jb) && JB_ROOT_IS_SCALAR(jb));
+ /* Extract the scalar value, if it is what we'll return */
+ if (npath <= 0)
+ jbvp = getIthJsonbValueFromContainer(container, 0);
+ }
+
+ /*
+ * If the array is empty, return the entire LHS object, on the grounds
+ * that we should do zero field or element extractions. For the
+ * non-scalar case we can just hand back the object without much work. For
+ * the scalar case, fall through and deal with the value below the loop.
+ * (This inconsistency arises because there's no easy way to generate a
+ * JsonbValue directly for root-level containers.)
+ */
+ if (npath <= 0 && jbvp == NULL)
+ {
+ if (as_text)
+ {
+ return PointerGetDatum(cstring_to_text(JsonbToCString(NULL,
+ container,
+ VARSIZE(jb))));
+ }
+ else
+ {
+ /* not text mode - just hand back the jsonb */
+ PG_RETURN_JSONB_P(jb);
+ }
+ }
+
+ for (i = 0; i < npath; i++)
+ {
+ if (have_object)
+ {
+ text *subscr = DatumGetTextPP(path[i]);
+
+ jbvp = getKeyJsonValueFromContainer(container,
+ VARDATA_ANY(subscr),
+ VARSIZE_ANY_EXHDR(subscr),
+ NULL);
+ }
+ else if (have_array)
+ {
+ int lindex;
+ uint32 index;
+ char *indextext = TextDatumGetCString(path[i]);
+ char *endptr;
+
+ errno = 0;
+ lindex = strtoint(indextext, &endptr, 10);
+ if (endptr == indextext || *endptr != '\0' || errno != 0)
+ {
+ *isnull = true;
+ return PointerGetDatum(NULL);
+ }
+
+ if (lindex >= 0)
+ {
+ index = (uint32) lindex;
+ }
+ else
+ {
+ /* Handle negative subscript */
+ uint32 nelements;
+
+ /* Container must be array, but make sure */
+ if (!JsonContainerIsArray(container))
+ elog(ERROR, "not a jsonb array");
+
+ nelements = JsonContainerSize(container);
+
+ if (lindex == INT_MIN || -lindex > nelements)
+ {
+ *isnull = true;
+ return PointerGetDatum(NULL);
+ }
+ else
+ index = nelements + lindex;
+ }
+
+ jbvp = getIthJsonbValueFromContainer(container, index);
+ }
+ else
+ {
+ /* scalar, extraction yields a null */
+ *isnull = true;
+ return PointerGetDatum(NULL);
+ }
+
+ if (jbvp == NULL)
+ {
+ *isnull = true;
+ return PointerGetDatum(NULL);
+ }
+ else if (i == npath - 1)
+ break;
+
+ if (jbvp->type == jbvBinary)
+ {
+ container = jbvp->val.binary.data;
+ have_object = JsonContainerIsObject(container);
+ have_array = JsonContainerIsArray(container);
+ Assert(!JsonContainerIsScalar(container));
+ }
+ else
+ {
+ Assert(IsAJsonbScalar(jbvp));
+ have_object = false;
+ have_array = false;
+ }
+ }
+
+ if (as_text)
+ {
+ if (jbvp->type == jbvNull)
+ {
+ *isnull = true;
+ return PointerGetDatum(NULL);
+ }
+
+ return PointerGetDatum(JsonbValueAsText(jbvp));
+ }
+ else
+ {
+ Jsonb *res = JsonbValueToJsonb(jbvp);
+
+ /* not text mode - just hand back the jsonb */
+ PG_RETURN_JSONB_P(res);
+ }
+}
+
+Datum
+jsonb_set_element(Jsonb *jb, Datum *path, int path_len,
+ JsonbValue *newval)
+{
+ JsonbValue *res;
+ JsonbParseState *state = NULL;
+ JsonbIterator *it;
+ bool *path_nulls = palloc0(path_len * sizeof(bool));
+
+ if (newval->type == jbvArray && newval->val.array.rawScalar)
+ *newval = newval->val.array.elems[0];
+
+ it = JsonbIteratorInit(&jb->root);
+
+ res = setPath(&it, path, path_nulls, path_len, &state, 0, newval,
+ JB_PATH_CREATE | JB_PATH_FILL_GAPS |
+ JB_PATH_CONSISTENT_POSITION);
+
+ pfree(path_nulls);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+static void
+push_null_elements(JsonbParseState **ps, int num)
+{
+ JsonbValue null;
+
+ null.type = jbvNull;
+
+ while (num-- > 0)
+ pushJsonbValue(ps, WJB_ELEM, &null);
+}
+
+/*
+ * Prepare a new structure containing nested empty objects and arrays
+ * corresponding to the specified path, and assign a new value at the end of
+ * this path. E.g. the path [a][0][b] with the new value 1 will produce the
+ * structure {a: [{b: 1}]}.
+ *
+ * Caller is responsible to make sure such path does not exist yet.
+ */
+static void
+push_path(JsonbParseState **st, int level, Datum *path_elems,
+ bool *path_nulls, int path_len, JsonbValue *newval)
+{
+ /*
+ * tpath contains expected type of an empty jsonb created at each level
+ * higher or equal than the current one, either jbvObject or jbvArray.
+ * Since it contains only information about path slice from level to the
+ * end, the access index must be normalized by level.
+ */
+ enum jbvType *tpath = palloc0((path_len - level) * sizeof(enum jbvType));
+ JsonbValue newkey;
+
+ /*
+ * Create first part of the chain with beginning tokens. For the current
+ * level WJB_BEGIN_OBJECT/WJB_BEGIN_ARRAY was already created, so start
+ * with the next one.
+ */
+ for (int i = level + 1; i < path_len; i++)
+ {
+ char *c,
+ *badp;
+ int lindex;
+
+ if (path_nulls[i])
+ break;
+
+ /*
+ * Try to convert to an integer to find out the expected type, object
+ * or array.
+ */
+ c = TextDatumGetCString(path_elems[i]);
+ errno = 0;
+ lindex = strtoint(c, &badp, 10);
+ if (badp == c || *badp != '\0' || errno != 0)
+ {
+ /* text, an object is expected */
+ newkey.type = jbvString;
+ newkey.val.string.val = c;
+ newkey.val.string.len = strlen(c);
+
+ (void) pushJsonbValue(st, WJB_BEGIN_OBJECT, NULL);
+ (void) pushJsonbValue(st, WJB_KEY, &newkey);
+
+ tpath[i - level] = jbvObject;
+ }
+ else
+ {
+ /* integer, an array is expected */
+ (void) pushJsonbValue(st, WJB_BEGIN_ARRAY, NULL);
+
+ push_null_elements(st, lindex);
+
+ tpath[i - level] = jbvArray;
+ }
+ }
+
+ /* Insert an actual value for either an object or array */
+ if (tpath[(path_len - level) - 1] == jbvArray)
+ {
+ (void) pushJsonbValue(st, WJB_ELEM, newval);
+ }
+ else
+ (void) pushJsonbValue(st, WJB_VALUE, newval);
+
+ /*
+ * Close everything up to the last but one level. The last one will be
+ * closed outside of this function.
+ */
+ for (int i = path_len - 1; i > level; i--)
+ {
+ if (path_nulls[i])
+ break;
+
+ if (tpath[i - level] == jbvObject)
+ (void) pushJsonbValue(st, WJB_END_OBJECT, NULL);
+ else
+ (void) pushJsonbValue(st, WJB_END_ARRAY, NULL);
+ }
+}
+
+/*
+ * Return the text representation of the given JsonbValue.
+ */
+static text *
+JsonbValueAsText(JsonbValue *v)
+{
+ switch (v->type)
+ {
+ case jbvNull:
+ return NULL;
+
+ case jbvBool:
+ return v->val.boolean ?
+ cstring_to_text_with_len("true", 4) :
+ cstring_to_text_with_len("false", 5);
+
+ case jbvString:
+ return cstring_to_text_with_len(v->val.string.val,
+ v->val.string.len);
+
+ case jbvNumeric:
+ {
+ Datum cstr;
+
+ cstr = DirectFunctionCall1(numeric_out,
+ PointerGetDatum(v->val.numeric));
+
+ return cstring_to_text(DatumGetCString(cstr));
+ }
+
+ case jbvBinary:
+ {
+ StringInfoData jtext;
+
+ initStringInfo(&jtext);
+ (void) JsonbToCString(&jtext, v->val.binary.data,
+ v->val.binary.len);
+
+ return cstring_to_text_with_len(jtext.data, jtext.len);
+ }
+
+ default:
+ elog(ERROR, "unrecognized jsonb type: %d", (int) v->type);
+ return NULL;
+ }
+}
+
+/*
+ * SQL function json_array_length(json) -> int
+ */
+Datum
+json_array_length(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ AlenState *state;
+ JsonLexContext *lex;
+ JsonSemAction *sem;
+
+ lex = makeJsonLexContext(json, false);
+ state = palloc0(sizeof(AlenState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ /* palloc0 does this for us */
+#if 0
+ state->count = 0;
+#endif
+ state->lex = lex;
+
+ sem->semstate = (void *) state;
+ sem->object_start = alen_object_start;
+ sem->scalar = alen_scalar;
+ sem->array_element_start = alen_array_element_start;
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ PG_RETURN_INT32(state->count);
+}
+
+Datum
+jsonb_array_length(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+
+ if (JB_ROOT_IS_SCALAR(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot get array length of a scalar")));
+ else if (!JB_ROOT_IS_ARRAY(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot get array length of a non-array")));
+
+ PG_RETURN_INT32(JB_ROOT_COUNT(jb));
+}
+
+/*
+ * These next two checks ensure that the json is an array (since it can't be
+ * a scalar or an object).
+ */
+
+static void
+alen_object_start(void *state)
+{
+ AlenState *_state = (AlenState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot get array length of a non-array")));
+}
+
+static void
+alen_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ AlenState *_state = (AlenState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot get array length of a scalar")));
+}
+
+static void
+alen_array_element_start(void *state, bool isnull)
+{
+ AlenState *_state = (AlenState *) state;
+
+ /* just count up all the level 1 elements */
+ if (_state->lex->lex_level == 1)
+ _state->count++;
+}
+
+/*
+ * SQL function json_each and json_each_text
+ *
+ * decompose a json object into key value pairs.
+ *
+ * Unlike json_object_keys() these SRFs operate in materialize mode,
+ * stashing results into a Tuplestore object as they go.
+ * The construction of tuples is done using a temporary memory context
+ * that is cleared out after each tuple is built.
+ */
+Datum
+json_each(PG_FUNCTION_ARGS)
+{
+ return each_worker(fcinfo, false);
+}
+
+Datum
+jsonb_each(PG_FUNCTION_ARGS)
+{
+ return each_worker_jsonb(fcinfo, "jsonb_each", false);
+}
+
+Datum
+json_each_text(PG_FUNCTION_ARGS)
+{
+ return each_worker(fcinfo, true);
+}
+
+Datum
+jsonb_each_text(PG_FUNCTION_ARGS)
+{
+ return each_worker_jsonb(fcinfo, "jsonb_each_text", true);
+}
+
+static Datum
+each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ ReturnSetInfo *rsi;
+ MemoryContext old_cxt,
+ tmp_cxt;
+ bool skipNested = false;
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+
+ if (!JB_ROOT_IS_OBJECT(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a non-object",
+ funcname)));
+
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ InitMaterializedSRF(fcinfo, MAT_SRF_BLESS);
+
+ tmp_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "jsonb_each temporary cxt",
+ ALLOCSET_DEFAULT_SIZES);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if (r == WJB_KEY)
+ {
+ text *key;
+ Datum values[2];
+ bool nulls[2] = {false, false};
+
+ /* Use the tmp context so we can clean up after each tuple is done */
+ old_cxt = MemoryContextSwitchTo(tmp_cxt);
+
+ key = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
+
+ /*
+ * The next thing the iterator fetches should be the value, no
+ * matter what shape it is.
+ */
+ r = JsonbIteratorNext(&it, &v, skipNested);
+ Assert(r != WJB_DONE);
+
+ values[0] = PointerGetDatum(key);
+
+ if (as_text)
+ {
+ if (v.type == jbvNull)
+ {
+ /* a json null is an sql null in text mode */
+ nulls[1] = true;
+ values[1] = (Datum) NULL;
+ }
+ else
+ values[1] = PointerGetDatum(JsonbValueAsText(&v));
+ }
+ else
+ {
+ /* Not in text mode, just return the Jsonb */
+ Jsonb *val = JsonbValueToJsonb(&v);
+
+ values[1] = PointerGetDatum(val);
+ }
+
+ tuplestore_putvalues(rsi->setResult, rsi->setDesc, values, nulls);
+
+ /* clean up and switch back */
+ MemoryContextSwitchTo(old_cxt);
+ MemoryContextReset(tmp_cxt);
+ }
+ }
+
+ MemoryContextDelete(tmp_cxt);
+
+ PG_RETURN_NULL();
+}
+
+
+static Datum
+each_worker(FunctionCallInfo fcinfo, bool as_text)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ JsonLexContext *lex;
+ JsonSemAction *sem;
+ ReturnSetInfo *rsi;
+ EachState *state;
+
+ lex = makeJsonLexContext(json, true);
+ state = palloc0(sizeof(EachState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ InitMaterializedSRF(fcinfo, MAT_SRF_BLESS);
+ state->tuple_store = rsi->setResult;
+ state->ret_tdesc = rsi->setDesc;
+
+ sem->semstate = (void *) state;
+ sem->array_start = each_array_start;
+ sem->scalar = each_scalar;
+ sem->object_field_start = each_object_field_start;
+ sem->object_field_end = each_object_field_end;
+
+ state->normalize_results = as_text;
+ state->next_scalar = false;
+ state->lex = lex;
+ state->tmp_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "json_each temporary cxt",
+ ALLOCSET_DEFAULT_SIZES);
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ MemoryContextDelete(state->tmp_cxt);
+
+ PG_RETURN_NULL();
+}
+
+
+static void
+each_object_field_start(void *state, char *fname, bool isnull)
+{
+ EachState *_state = (EachState *) state;
+
+ /* save a pointer to where the value starts */
+ if (_state->lex->lex_level == 1)
+ {
+ /*
+ * next_scalar will be reset in the object_field_end handler, and
+ * since we know the value is a scalar there is no danger of it being
+ * on while recursing down the tree.
+ */
+ if (_state->normalize_results && _state->lex->token_type == JSON_TOKEN_STRING)
+ _state->next_scalar = true;
+ else
+ _state->result_start = _state->lex->token_start;
+ }
+}
+
+static void
+each_object_field_end(void *state, char *fname, bool isnull)
+{
+ EachState *_state = (EachState *) state;
+ MemoryContext old_cxt;
+ int len;
+ text *val;
+ HeapTuple tuple;
+ Datum values[2];
+ bool nulls[2] = {false, false};
+
+ /* skip over nested objects */
+ if (_state->lex->lex_level != 1)
+ return;
+
+ /* use the tmp context so we can clean up after each tuple is done */
+ old_cxt = MemoryContextSwitchTo(_state->tmp_cxt);
+
+ values[0] = CStringGetTextDatum(fname);
+
+ if (isnull && _state->normalize_results)
+ {
+ nulls[1] = true;
+ values[1] = (Datum) 0;
+ }
+ else if (_state->next_scalar)
+ {
+ values[1] = CStringGetTextDatum(_state->normalized_scalar);
+ _state->next_scalar = false;
+ }
+ else
+ {
+ len = _state->lex->prev_token_terminator - _state->result_start;
+ val = cstring_to_text_with_len(_state->result_start, len);
+ values[1] = PointerGetDatum(val);
+ }
+
+ tuple = heap_form_tuple(_state->ret_tdesc, values, nulls);
+
+ tuplestore_puttuple(_state->tuple_store, tuple);
+
+ /* clean up and switch back */
+ MemoryContextSwitchTo(old_cxt);
+ MemoryContextReset(_state->tmp_cxt);
+}
+
+static void
+each_array_start(void *state)
+{
+ EachState *_state = (EachState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot deconstruct an array as an object")));
+}
+
+static void
+each_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ EachState *_state = (EachState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot deconstruct a scalar")));
+
+ /* supply de-escaped value if required */
+ if (_state->next_scalar)
+ _state->normalized_scalar = token;
+}
+
+/*
+ * SQL functions json_array_elements and json_array_elements_text
+ *
+ * get the elements from a json array
+ *
+ * a lot of this processing is similar to the json_each* functions
+ */
+
+Datum
+jsonb_array_elements(PG_FUNCTION_ARGS)
+{
+ return elements_worker_jsonb(fcinfo, "jsonb_array_elements", false);
+}
+
+Datum
+jsonb_array_elements_text(PG_FUNCTION_ARGS)
+{
+ return elements_worker_jsonb(fcinfo, "jsonb_array_elements_text", true);
+}
+
+static Datum
+elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname,
+ bool as_text)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ ReturnSetInfo *rsi;
+ MemoryContext old_cxt,
+ tmp_cxt;
+ bool skipNested = false;
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken r;
+
+ if (JB_ROOT_IS_SCALAR(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot extract elements from a scalar")));
+ else if (!JB_ROOT_IS_ARRAY(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot extract elements from an object")));
+
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC | MAT_SRF_BLESS);
+
+ tmp_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "jsonb_array_elements temporary cxt",
+ ALLOCSET_DEFAULT_SIZES);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if (r == WJB_ELEM)
+ {
+ Datum values[1];
+ bool nulls[1] = {false};
+
+ /* use the tmp context so we can clean up after each tuple is done */
+ old_cxt = MemoryContextSwitchTo(tmp_cxt);
+
+ if (as_text)
+ {
+ if (v.type == jbvNull)
+ {
+ /* a json null is an sql null in text mode */
+ nulls[0] = true;
+ values[0] = (Datum) NULL;
+ }
+ else
+ values[0] = PointerGetDatum(JsonbValueAsText(&v));
+ }
+ else
+ {
+ /* Not in text mode, just return the Jsonb */
+ Jsonb *val = JsonbValueToJsonb(&v);
+
+ values[0] = PointerGetDatum(val);
+ }
+
+ tuplestore_putvalues(rsi->setResult, rsi->setDesc, values, nulls);
+
+ /* clean up and switch back */
+ MemoryContextSwitchTo(old_cxt);
+ MemoryContextReset(tmp_cxt);
+ }
+ }
+
+ MemoryContextDelete(tmp_cxt);
+
+ PG_RETURN_NULL();
+}
+
+Datum
+json_array_elements(PG_FUNCTION_ARGS)
+{
+ return elements_worker(fcinfo, "json_array_elements", false);
+}
+
+Datum
+json_array_elements_text(PG_FUNCTION_ARGS)
+{
+ return elements_worker(fcinfo, "json_array_elements_text", true);
+}
+
+static Datum
+elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+
+ /* elements only needs escaped strings when as_text */
+ JsonLexContext *lex = makeJsonLexContext(json, as_text);
+ JsonSemAction *sem;
+ ReturnSetInfo *rsi;
+ ElementsState *state;
+
+ state = palloc0(sizeof(ElementsState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC | MAT_SRF_BLESS);
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ state->tuple_store = rsi->setResult;
+ state->ret_tdesc = rsi->setDesc;
+
+ sem->semstate = (void *) state;
+ sem->object_start = elements_object_start;
+ sem->scalar = elements_scalar;
+ sem->array_element_start = elements_array_element_start;
+ sem->array_element_end = elements_array_element_end;
+
+ state->function_name = funcname;
+ state->normalize_results = as_text;
+ state->next_scalar = false;
+ state->lex = lex;
+ state->tmp_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "json_array_elements temporary cxt",
+ ALLOCSET_DEFAULT_SIZES);
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ MemoryContextDelete(state->tmp_cxt);
+
+ PG_RETURN_NULL();
+}
+
+static void
+elements_array_element_start(void *state, bool isnull)
+{
+ ElementsState *_state = (ElementsState *) state;
+
+ /* save a pointer to where the value starts */
+ if (_state->lex->lex_level == 1)
+ {
+ /*
+ * next_scalar will be reset in the array_element_end handler, and
+ * since we know the value is a scalar there is no danger of it being
+ * on while recursing down the tree.
+ */
+ if (_state->normalize_results && _state->lex->token_type == JSON_TOKEN_STRING)
+ _state->next_scalar = true;
+ else
+ _state->result_start = _state->lex->token_start;
+ }
+}
+
+static void
+elements_array_element_end(void *state, bool isnull)
+{
+ ElementsState *_state = (ElementsState *) state;
+ MemoryContext old_cxt;
+ int len;
+ text *val;
+ HeapTuple tuple;
+ Datum values[1];
+ bool nulls[1] = {false};
+
+ /* skip over nested objects */
+ if (_state->lex->lex_level != 1)
+ return;
+
+ /* use the tmp context so we can clean up after each tuple is done */
+ old_cxt = MemoryContextSwitchTo(_state->tmp_cxt);
+
+ if (isnull && _state->normalize_results)
+ {
+ nulls[0] = true;
+ values[0] = (Datum) NULL;
+ }
+ else if (_state->next_scalar)
+ {
+ values[0] = CStringGetTextDatum(_state->normalized_scalar);
+ _state->next_scalar = false;
+ }
+ else
+ {
+ len = _state->lex->prev_token_terminator - _state->result_start;
+ val = cstring_to_text_with_len(_state->result_start, len);
+ values[0] = PointerGetDatum(val);
+ }
+
+ tuple = heap_form_tuple(_state->ret_tdesc, values, nulls);
+
+ tuplestore_puttuple(_state->tuple_store, tuple);
+
+ /* clean up and switch back */
+ MemoryContextSwitchTo(old_cxt);
+ MemoryContextReset(_state->tmp_cxt);
+}
+
+static void
+elements_object_start(void *state)
+{
+ ElementsState *_state = (ElementsState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a non-array",
+ _state->function_name)));
+}
+
+static void
+elements_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ ElementsState *_state = (ElementsState *) state;
+
+ /* json structure check */
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a scalar",
+ _state->function_name)));
+
+ /* supply de-escaped value if required */
+ if (_state->next_scalar)
+ _state->normalized_scalar = token;
+}
+
+/*
+ * SQL function json_populate_record
+ *
+ * set fields in a record from the argument json
+ *
+ * Code adapted shamelessly from hstore's populate_record
+ * which is in turn partly adapted from record_out.
+ *
+ * The json is decomposed into a hash table, in which each
+ * field in the record is then looked up by name. For jsonb
+ * we fetch the values direct from the object.
+ */
+Datum
+jsonb_populate_record(PG_FUNCTION_ARGS)
+{
+ return populate_record_worker(fcinfo, "jsonb_populate_record",
+ false, true);
+}
+
+Datum
+jsonb_to_record(PG_FUNCTION_ARGS)
+{
+ return populate_record_worker(fcinfo, "jsonb_to_record",
+ false, false);
+}
+
+Datum
+json_populate_record(PG_FUNCTION_ARGS)
+{
+ return populate_record_worker(fcinfo, "json_populate_record",
+ true, true);
+}
+
+Datum
+json_to_record(PG_FUNCTION_ARGS)
+{
+ return populate_record_worker(fcinfo, "json_to_record",
+ true, false);
+}
+
+/* helper function for diagnostics */
+static void
+populate_array_report_expected_array(PopulateArrayContext *ctx, int ndim)
+{
+ if (ndim <= 0)
+ {
+ if (ctx->colname)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected JSON array"),
+ errhint("See the value of key \"%s\".", ctx->colname)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected JSON array")));
+ }
+ else
+ {
+ StringInfoData indices;
+ int i;
+
+ initStringInfo(&indices);
+
+ Assert(ctx->ndims > 0 && ndim < ctx->ndims);
+
+ for (i = 0; i < ndim; i++)
+ appendStringInfo(&indices, "[%d]", ctx->sizes[i]);
+
+ if (ctx->colname)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected JSON array"),
+ errhint("See the array element %s of key \"%s\".",
+ indices.data, ctx->colname)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected JSON array"),
+ errhint("See the array element %s.",
+ indices.data)));
+ }
+}
+
+/* set the number of dimensions of the populated array when it becomes known */
+static void
+populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims)
+{
+ int i;
+
+ Assert(ctx->ndims <= 0);
+
+ if (ndims <= 0)
+ populate_array_report_expected_array(ctx, ndims);
+
+ ctx->ndims = ndims;
+ ctx->dims = palloc(sizeof(int) * ndims);
+ ctx->sizes = palloc0(sizeof(int) * ndims);
+
+ for (i = 0; i < ndims; i++)
+ ctx->dims[i] = -1; /* dimensions are unknown yet */
+}
+
+/* check the populated subarray dimension */
+static void
+populate_array_check_dimension(PopulateArrayContext *ctx, int ndim)
+{
+ int dim = ctx->sizes[ndim]; /* current dimension counter */
+
+ if (ctx->dims[ndim] == -1)
+ ctx->dims[ndim] = dim; /* assign dimension if not yet known */
+ else if (ctx->dims[ndim] != dim)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed JSON array"),
+ errdetail("Multidimensional arrays must have "
+ "sub-arrays with matching dimensions.")));
+
+ /* reset the current array dimension size counter */
+ ctx->sizes[ndim] = 0;
+
+ /* increment the parent dimension counter if it is a nested sub-array */
+ if (ndim > 0)
+ ctx->sizes[ndim - 1]++;
+}
+
+static void
+populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv)
+{
+ Datum element;
+ bool element_isnull;
+
+ /* populate the array element */
+ element = populate_record_field(ctx->aio->element_info,
+ ctx->aio->element_type,
+ ctx->aio->element_typmod,
+ NULL, ctx->mcxt, PointerGetDatum(NULL),
+ jsv, &element_isnull);
+
+ accumArrayResult(ctx->astate, element, element_isnull,
+ ctx->aio->element_type, ctx->acxt);
+
+ Assert(ndim > 0);
+ ctx->sizes[ndim - 1]++; /* increment current dimension counter */
+}
+
+/* json object start handler for populate_array_json() */
+static void
+populate_array_object_start(void *_state)
+{
+ PopulateArrayState *state = (PopulateArrayState *) _state;
+ int ndim = state->lex->lex_level;
+
+ if (state->ctx->ndims <= 0)
+ populate_array_assign_ndims(state->ctx, ndim);
+ else if (ndim < state->ctx->ndims)
+ populate_array_report_expected_array(state->ctx, ndim);
+}
+
+/* json array end handler for populate_array_json() */
+static void
+populate_array_array_end(void *_state)
+{
+ PopulateArrayState *state = (PopulateArrayState *) _state;
+ PopulateArrayContext *ctx = state->ctx;
+ int ndim = state->lex->lex_level;
+
+ if (ctx->ndims <= 0)
+ populate_array_assign_ndims(ctx, ndim + 1);
+
+ if (ndim < ctx->ndims)
+ populate_array_check_dimension(ctx, ndim);
+}
+
+/* json array element start handler for populate_array_json() */
+static void
+populate_array_element_start(void *_state, bool isnull)
+{
+ PopulateArrayState *state = (PopulateArrayState *) _state;
+ int ndim = state->lex->lex_level;
+
+ if (state->ctx->ndims <= 0 || ndim == state->ctx->ndims)
+ {
+ /* remember current array element start */
+ state->element_start = state->lex->token_start;
+ state->element_type = state->lex->token_type;
+ state->element_scalar = NULL;
+ }
+}
+
+/* json array element end handler for populate_array_json() */
+static void
+populate_array_element_end(void *_state, bool isnull)
+{
+ PopulateArrayState *state = (PopulateArrayState *) _state;
+ PopulateArrayContext *ctx = state->ctx;
+ int ndim = state->lex->lex_level;
+
+ Assert(ctx->ndims > 0);
+
+ if (ndim == ctx->ndims)
+ {
+ JsValue jsv;
+
+ jsv.is_json = true;
+ jsv.val.json.type = state->element_type;
+
+ if (isnull)
+ {
+ Assert(jsv.val.json.type == JSON_TOKEN_NULL);
+ jsv.val.json.str = NULL;
+ jsv.val.json.len = 0;
+ }
+ else if (state->element_scalar)
+ {
+ jsv.val.json.str = state->element_scalar;
+ jsv.val.json.len = -1; /* null-terminated */
+ }
+ else
+ {
+ jsv.val.json.str = state->element_start;
+ jsv.val.json.len = (state->lex->prev_token_terminator -
+ state->element_start) * sizeof(char);
+ }
+
+ populate_array_element(ctx, ndim, &jsv);
+ }
+}
+
+/* json scalar handler for populate_array_json() */
+static void
+populate_array_scalar(void *_state, char *token, JsonTokenType tokentype)
+{
+ PopulateArrayState *state = (PopulateArrayState *) _state;
+ PopulateArrayContext *ctx = state->ctx;
+ int ndim = state->lex->lex_level;
+
+ if (ctx->ndims <= 0)
+ populate_array_assign_ndims(ctx, ndim);
+ else if (ndim < ctx->ndims)
+ populate_array_report_expected_array(ctx, ndim);
+
+ if (ndim == ctx->ndims)
+ {
+ /* remember the scalar element token */
+ state->element_scalar = token;
+ /* element_type must already be set in populate_array_element_start() */
+ Assert(state->element_type == tokentype);
+ }
+}
+
+/* parse a json array and populate array */
+static void
+populate_array_json(PopulateArrayContext *ctx, char *json, int len)
+{
+ PopulateArrayState state;
+ JsonSemAction sem;
+
+ state.lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
+ state.ctx = ctx;
+
+ memset(&sem, 0, sizeof(sem));
+ sem.semstate = (void *) &state;
+ sem.object_start = populate_array_object_start;
+ sem.array_end = populate_array_array_end;
+ sem.array_element_start = populate_array_element_start;
+ sem.array_element_end = populate_array_element_end;
+ sem.scalar = populate_array_scalar;
+
+ pg_parse_json_or_ereport(state.lex, &sem);
+
+ /* number of dimensions should be already known */
+ Assert(ctx->ndims > 0 && ctx->dims);
+
+ pfree(state.lex);
+}
+
+/*
+ * populate_array_dim_jsonb() -- Iterate recursively through jsonb sub-array
+ * elements and accumulate result using given ArrayBuildState.
+ */
+static void
+populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */
+ JsonbValue *jbv, /* jsonb sub-array */
+ int ndim) /* current dimension */
+{
+ JsonbContainer *jbc = jbv->val.binary.data;
+ JsonbIterator *it;
+ JsonbIteratorToken tok;
+ JsonbValue val;
+ JsValue jsv;
+
+ check_stack_depth();
+
+ if (jbv->type != jbvBinary || !JsonContainerIsArray(jbc))
+ populate_array_report_expected_array(ctx, ndim - 1);
+
+ Assert(!JsonContainerIsScalar(jbc));
+
+ it = JsonbIteratorInit(jbc);
+
+ tok = JsonbIteratorNext(&it, &val, true);
+ Assert(tok == WJB_BEGIN_ARRAY);
+
+ tok = JsonbIteratorNext(&it, &val, true);
+
+ /*
+ * If the number of dimensions is not yet known and we have found end of
+ * the array, or the first child element is not an array, then assign the
+ * number of dimensions now.
+ */
+ if (ctx->ndims <= 0 &&
+ (tok == WJB_END_ARRAY ||
+ (tok == WJB_ELEM &&
+ (val.type != jbvBinary ||
+ !JsonContainerIsArray(val.val.binary.data)))))
+ populate_array_assign_ndims(ctx, ndim);
+
+ jsv.is_json = false;
+ jsv.val.jsonb = &val;
+
+ /* process all the array elements */
+ while (tok == WJB_ELEM)
+ {
+ /*
+ * Recurse only if the dimensions of dimensions is still unknown or if
+ * it is not the innermost dimension.
+ */
+ if (ctx->ndims > 0 && ndim >= ctx->ndims)
+ populate_array_element(ctx, ndim, &jsv);
+ else
+ {
+ /* populate child sub-array */
+ populate_array_dim_jsonb(ctx, &val, ndim + 1);
+
+ /* number of dimensions should be already known */
+ Assert(ctx->ndims > 0 && ctx->dims);
+
+ populate_array_check_dimension(ctx, ndim);
+ }
+
+ tok = JsonbIteratorNext(&it, &val, true);
+ }
+
+ Assert(tok == WJB_END_ARRAY);
+
+ /* free iterator, iterating until WJB_DONE */
+ tok = JsonbIteratorNext(&it, &val, true);
+ Assert(tok == WJB_DONE && !it);
+}
+
+/* recursively populate an array from json/jsonb */
+static Datum
+populate_array(ArrayIOData *aio,
+ const char *colname,
+ MemoryContext mcxt,
+ JsValue *jsv)
+{
+ PopulateArrayContext ctx;
+ Datum result;
+ int *lbs;
+ int i;
+
+ ctx.aio = aio;
+ ctx.mcxt = mcxt;
+ ctx.acxt = CurrentMemoryContext;
+ ctx.astate = initArrayResult(aio->element_type, ctx.acxt, true);
+ ctx.colname = colname;
+ ctx.ndims = 0; /* unknown yet */
+ ctx.dims = NULL;
+ ctx.sizes = NULL;
+
+ if (jsv->is_json)
+ populate_array_json(&ctx, jsv->val.json.str,
+ jsv->val.json.len >= 0 ? jsv->val.json.len
+ : strlen(jsv->val.json.str));
+ else
+ {
+ populate_array_dim_jsonb(&ctx, jsv->val.jsonb, 1);
+ ctx.dims[0] = ctx.sizes[0];
+ }
+
+ Assert(ctx.ndims > 0);
+
+ lbs = palloc(sizeof(int) * ctx.ndims);
+
+ for (i = 0; i < ctx.ndims; i++)
+ lbs[i] = 1;
+
+ result = makeMdArrayResult(ctx.astate, ctx.ndims, ctx.dims, lbs,
+ ctx.acxt, true);
+
+ pfree(ctx.dims);
+ pfree(ctx.sizes);
+ pfree(lbs);
+
+ return result;
+}
+
+static void
+JsValueToJsObject(JsValue *jsv, JsObject *jso)
+{
+ jso->is_json = jsv->is_json;
+
+ if (jsv->is_json)
+ {
+ /* convert plain-text json into a hash table */
+ jso->val.json_hash =
+ get_json_object_as_hash(jsv->val.json.str,
+ jsv->val.json.len >= 0
+ ? jsv->val.json.len
+ : strlen(jsv->val.json.str),
+ "populate_composite");
+ }
+ else
+ {
+ JsonbValue *jbv = jsv->val.jsonb;
+
+ if (jbv->type == jbvBinary &&
+ JsonContainerIsObject(jbv->val.binary.data))
+ {
+ jso->val.jsonb_cont = jbv->val.binary.data;
+ }
+ else
+ {
+ bool is_scalar;
+
+ is_scalar = IsAJsonbScalar(jbv) ||
+ (jbv->type == jbvBinary &&
+ JsonContainerIsScalar(jbv->val.binary.data));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ is_scalar
+ ? errmsg("cannot call %s on a scalar",
+ "populate_composite")
+ : errmsg("cannot call %s on an array",
+ "populate_composite")));
+ }
+ }
+}
+
+/* acquire or update cached tuple descriptor for a composite type */
+static void
+update_cached_tupdesc(CompositeIOData *io, MemoryContext mcxt)
+{
+ if (!io->tupdesc ||
+ io->tupdesc->tdtypeid != io->base_typid ||
+ io->tupdesc->tdtypmod != io->base_typmod)
+ {
+ TupleDesc tupdesc = lookup_rowtype_tupdesc(io->base_typid,
+ io->base_typmod);
+ MemoryContext oldcxt;
+
+ if (io->tupdesc)
+ FreeTupleDesc(io->tupdesc);
+
+ /* copy tuple desc without constraints into cache memory context */
+ oldcxt = MemoryContextSwitchTo(mcxt);
+ io->tupdesc = CreateTupleDescCopy(tupdesc);
+ MemoryContextSwitchTo(oldcxt);
+
+ ReleaseTupleDesc(tupdesc);
+ }
+}
+
+/* recursively populate a composite (row type) value from json/jsonb */
+static Datum
+populate_composite(CompositeIOData *io,
+ Oid typid,
+ const char *colname,
+ MemoryContext mcxt,
+ HeapTupleHeader defaultval,
+ JsValue *jsv,
+ bool isnull)
+{
+ Datum result;
+
+ /* acquire/update cached tuple descriptor */
+ update_cached_tupdesc(io, mcxt);
+
+ if (isnull)
+ result = (Datum) 0;
+ else
+ {
+ HeapTupleHeader tuple;
+ JsObject jso;
+
+ /* prepare input value */
+ JsValueToJsObject(jsv, &jso);
+
+ /* populate resulting record tuple */
+ tuple = populate_record(io->tupdesc, &io->record_io,
+ defaultval, mcxt, &jso);
+ result = HeapTupleHeaderGetDatum(tuple);
+
+ JsObjectFree(&jso);
+ }
+
+ /*
+ * If it's domain over composite, check domain constraints. (This should
+ * probably get refactored so that we can see the TYPECAT value, but for
+ * now, we can tell by comparing typid to base_typid.)
+ */
+ if (typid != io->base_typid && typid != RECORDOID)
+ domain_check(result, isnull, typid, &io->domain_info, mcxt);
+
+ return result;
+}
+
+/* populate non-null scalar value from json/jsonb value */
+static Datum
+populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv)
+{
+ Datum res;
+ char *str = NULL;
+ char *json = NULL;
+
+ if (jsv->is_json)
+ {
+ int len = jsv->val.json.len;
+
+ json = jsv->val.json.str;
+ Assert(json);
+ if (len >= 0)
+ {
+ /* Need to copy non-null-terminated string */
+ str = palloc(len + 1 * sizeof(char));
+ memcpy(str, json, len);
+ str[len] = '\0';
+ }
+ else
+ str = json; /* string is already null-terminated */
+
+ /* If converting to json/jsonb, make string into valid JSON literal */
+ if ((typid == JSONOID || typid == JSONBOID) &&
+ jsv->val.json.type == JSON_TOKEN_STRING)
+ {
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+ escape_json(&buf, str);
+ /* free temporary buffer */
+ if (str != json)
+ pfree(str);
+ str = buf.data;
+ }
+ }
+ else
+ {
+ JsonbValue *jbv = jsv->val.jsonb;
+
+ if (typid == JSONBOID)
+ {
+ Jsonb *jsonb = JsonbValueToJsonb(jbv); /* directly use jsonb */
+
+ return JsonbPGetDatum(jsonb);
+ }
+ /* convert jsonb to string for typio call */
+ else if (typid == JSONOID && jbv->type != jbvBinary)
+ {
+ /*
+ * Convert scalar jsonb (non-scalars are passed here as jbvBinary)
+ * to json string, preserving quotes around top-level strings.
+ */
+ Jsonb *jsonb = JsonbValueToJsonb(jbv);
+
+ str = JsonbToCString(NULL, &jsonb->root, VARSIZE(jsonb));
+ }
+ else if (jbv->type == jbvString) /* quotes are stripped */
+ str = pnstrdup(jbv->val.string.val, jbv->val.string.len);
+ else if (jbv->type == jbvBool)
+ str = pstrdup(jbv->val.boolean ? "true" : "false");
+ else if (jbv->type == jbvNumeric)
+ str = DatumGetCString(DirectFunctionCall1(numeric_out,
+ PointerGetDatum(jbv->val.numeric)));
+ else if (jbv->type == jbvBinary)
+ str = JsonbToCString(NULL, jbv->val.binary.data,
+ jbv->val.binary.len);
+ else
+ elog(ERROR, "unrecognized jsonb type: %d", (int) jbv->type);
+ }
+
+ res = InputFunctionCall(&io->typiofunc, str, io->typioparam, typmod);
+
+ /* free temporary buffer */
+ if (str != json)
+ pfree(str);
+
+ return res;
+}
+
+static Datum
+populate_domain(DomainIOData *io,
+ Oid typid,
+ const char *colname,
+ MemoryContext mcxt,
+ JsValue *jsv,
+ bool isnull)
+{
+ Datum res;
+
+ if (isnull)
+ res = (Datum) 0;
+ else
+ {
+ res = populate_record_field(io->base_io,
+ io->base_typid, io->base_typmod,
+ colname, mcxt, PointerGetDatum(NULL),
+ jsv, &isnull);
+ Assert(!isnull);
+ }
+
+ domain_check(res, isnull, typid, &io->domain_info, mcxt);
+
+ return res;
+}
+
+/* prepare column metadata cache for the given type */
+static void
+prepare_column_cache(ColumnIOData *column,
+ Oid typid,
+ int32 typmod,
+ MemoryContext mcxt,
+ bool need_scalar)
+{
+ HeapTuple tup;
+ Form_pg_type type;
+
+ column->typid = typid;
+ column->typmod = typmod;
+
+ tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+
+ type = (Form_pg_type) GETSTRUCT(tup);
+
+ if (type->typtype == TYPTYPE_DOMAIN)
+ {
+ /*
+ * We can move directly to the bottom base type; domain_check() will
+ * take care of checking all constraints for a stack of domains.
+ */
+ Oid base_typid;
+ int32 base_typmod = typmod;
+
+ base_typid = getBaseTypeAndTypmod(typid, &base_typmod);
+ if (get_typtype(base_typid) == TYPTYPE_COMPOSITE)
+ {
+ /* domain over composite has its own code path */
+ column->typcat = TYPECAT_COMPOSITE_DOMAIN;
+ column->io.composite.record_io = NULL;
+ column->io.composite.tupdesc = NULL;
+ column->io.composite.base_typid = base_typid;
+ column->io.composite.base_typmod = base_typmod;
+ column->io.composite.domain_info = NULL;
+ }
+ else
+ {
+ /* domain over anything else */
+ column->typcat = TYPECAT_DOMAIN;
+ column->io.domain.base_typid = base_typid;
+ column->io.domain.base_typmod = base_typmod;
+ column->io.domain.base_io =
+ MemoryContextAllocZero(mcxt, sizeof(ColumnIOData));
+ column->io.domain.domain_info = NULL;
+ }
+ }
+ else if (type->typtype == TYPTYPE_COMPOSITE || typid == RECORDOID)
+ {
+ column->typcat = TYPECAT_COMPOSITE;
+ column->io.composite.record_io = NULL;
+ column->io.composite.tupdesc = NULL;
+ column->io.composite.base_typid = typid;
+ column->io.composite.base_typmod = typmod;
+ column->io.composite.domain_info = NULL;
+ }
+ else if (IsTrueArrayType(type))
+ {
+ column->typcat = TYPECAT_ARRAY;
+ column->io.array.element_info = MemoryContextAllocZero(mcxt,
+ sizeof(ColumnIOData));
+ column->io.array.element_type = type->typelem;
+ /* array element typemod stored in attribute's typmod */
+ column->io.array.element_typmod = typmod;
+ }
+ else
+ {
+ column->typcat = TYPECAT_SCALAR;
+ need_scalar = true;
+ }
+
+ /* caller can force us to look up scalar_io info even for non-scalars */
+ if (need_scalar)
+ {
+ Oid typioproc;
+
+ getTypeInputInfo(typid, &typioproc, &column->scalar_io.typioparam);
+ fmgr_info_cxt(typioproc, &column->scalar_io.typiofunc, mcxt);
+ }
+
+ ReleaseSysCache(tup);
+}
+
+/* recursively populate a record field or an array element from a json/jsonb value */
+static Datum
+populate_record_field(ColumnIOData *col,
+ Oid typid,
+ int32 typmod,
+ const char *colname,
+ MemoryContext mcxt,
+ Datum defaultval,
+ JsValue *jsv,
+ bool *isnull)
+{
+ TypeCat typcat;
+
+ check_stack_depth();
+
+ /*
+ * Prepare column metadata cache for the given type. Force lookup of the
+ * scalar_io data so that the json string hack below will work.
+ */
+ if (col->typid != typid || col->typmod != typmod)
+ prepare_column_cache(col, typid, typmod, mcxt, true);
+
+ *isnull = JsValueIsNull(jsv);
+
+ typcat = col->typcat;
+
+ /* try to convert json string to a non-scalar type through input function */
+ if (JsValueIsString(jsv) &&
+ (typcat == TYPECAT_ARRAY ||
+ typcat == TYPECAT_COMPOSITE ||
+ typcat == TYPECAT_COMPOSITE_DOMAIN))
+ typcat = TYPECAT_SCALAR;
+
+ /* we must perform domain checks for NULLs, otherwise exit immediately */
+ if (*isnull &&
+ typcat != TYPECAT_DOMAIN &&
+ typcat != TYPECAT_COMPOSITE_DOMAIN)
+ return (Datum) 0;
+
+ switch (typcat)
+ {
+ case TYPECAT_SCALAR:
+ return populate_scalar(&col->scalar_io, typid, typmod, jsv);
+
+ case TYPECAT_ARRAY:
+ return populate_array(&col->io.array, colname, mcxt, jsv);
+
+ case TYPECAT_COMPOSITE:
+ case TYPECAT_COMPOSITE_DOMAIN:
+ return populate_composite(&col->io.composite, typid,
+ colname, mcxt,
+ DatumGetPointer(defaultval)
+ ? DatumGetHeapTupleHeader(defaultval)
+ : NULL,
+ jsv, *isnull);
+
+ case TYPECAT_DOMAIN:
+ return populate_domain(&col->io.domain, typid, colname, mcxt,
+ jsv, *isnull);
+
+ default:
+ elog(ERROR, "unrecognized type category '%c'", typcat);
+ return (Datum) 0;
+ }
+}
+
+static RecordIOData *
+allocate_record_info(MemoryContext mcxt, int ncolumns)
+{
+ RecordIOData *data = (RecordIOData *)
+ MemoryContextAlloc(mcxt,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+
+ data->record_type = InvalidOid;
+ data->record_typmod = 0;
+ data->ncolumns = ncolumns;
+ MemSet(data->columns, 0, sizeof(ColumnIOData) * ncolumns);
+
+ return data;
+}
+
+static bool
+JsObjectGetField(JsObject *obj, char *field, JsValue *jsv)
+{
+ jsv->is_json = obj->is_json;
+
+ if (jsv->is_json)
+ {
+ JsonHashEntry *hashentry = hash_search(obj->val.json_hash, field,
+ HASH_FIND, NULL);
+
+ jsv->val.json.type = hashentry ? hashentry->type : JSON_TOKEN_NULL;
+ jsv->val.json.str = jsv->val.json.type == JSON_TOKEN_NULL ? NULL :
+ hashentry->val;
+ jsv->val.json.len = jsv->val.json.str ? -1 : 0; /* null-terminated */
+
+ return hashentry != NULL;
+ }
+ else
+ {
+ jsv->val.jsonb = !obj->val.jsonb_cont ? NULL :
+ getKeyJsonValueFromContainer(obj->val.jsonb_cont, field, strlen(field),
+ NULL);
+
+ return jsv->val.jsonb != NULL;
+ }
+}
+
+/* populate a record tuple from json/jsonb value */
+static HeapTupleHeader
+populate_record(TupleDesc tupdesc,
+ RecordIOData **record_p,
+ HeapTupleHeader defaultval,
+ MemoryContext mcxt,
+ JsObject *obj)
+{
+ RecordIOData *record = *record_p;
+ Datum *values;
+ bool *nulls;
+ HeapTuple res;
+ int ncolumns = tupdesc->natts;
+ int i;
+
+ /*
+ * if the input json is empty, we can only skip the rest if we were passed
+ * in a non-null record, since otherwise there may be issues with domain
+ * nulls.
+ */
+ if (defaultval && JsObjectIsEmpty(obj))
+ return defaultval;
+
+ /* (re)allocate metadata cache */
+ if (record == NULL ||
+ record->ncolumns != ncolumns)
+ *record_p = record = allocate_record_info(mcxt, ncolumns);
+
+ /* invalidate metadata cache if the record type has changed */
+ if (record->record_type != tupdesc->tdtypeid ||
+ record->record_typmod != tupdesc->tdtypmod)
+ {
+ MemSet(record, 0, offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ record->record_type = tupdesc->tdtypeid;
+ record->record_typmod = tupdesc->tdtypmod;
+ record->ncolumns = ncolumns;
+ }
+
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+
+ if (defaultval)
+ {
+ HeapTupleData tuple;
+
+ /* Build a temporary HeapTuple control structure */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(defaultval);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = defaultval;
+
+ /* Break down the tuple into fields */
+ heap_deform_tuple(&tuple, tupdesc, values, nulls);
+ }
+ else
+ {
+ for (i = 0; i < ncolumns; ++i)
+ {
+ values[i] = (Datum) 0;
+ nulls[i] = true;
+ }
+ }
+
+ for (i = 0; i < ncolumns; ++i)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+ char *colname = NameStr(att->attname);
+ JsValue field = {0};
+ bool found;
+
+ /* Ignore dropped columns in datatype */
+ if (att->attisdropped)
+ {
+ nulls[i] = true;
+ continue;
+ }
+
+ found = JsObjectGetField(obj, colname, &field);
+
+ /*
+ * we can't just skip here if the key wasn't found since we might have
+ * a domain to deal with. If we were passed in a non-null record
+ * datum, we assume that the existing values are valid (if they're
+ * not, then it's not our fault), but if we were passed in a null,
+ * then every field which we don't populate needs to be run through
+ * the input function just in case it's a domain type.
+ */
+ if (defaultval && !found)
+ continue;
+
+ values[i] = populate_record_field(&record->columns[i],
+ att->atttypid,
+ att->atttypmod,
+ colname,
+ mcxt,
+ nulls[i] ? (Datum) 0 : values[i],
+ &field,
+ &nulls[i]);
+ }
+
+ res = heap_form_tuple(tupdesc, values, nulls);
+
+ pfree(values);
+ pfree(nulls);
+
+ return res->t_data;
+}
+
+/*
+ * Setup for json{b}_populate_record{set}: result type will be same as first
+ * argument's type --- unless first argument is "null::record", which we can't
+ * extract type info from; we handle that later.
+ */
+static void
+get_record_type_from_argument(FunctionCallInfo fcinfo,
+ const char *funcname,
+ PopulateRecordCache *cache)
+{
+ cache->argtype = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ prepare_column_cache(&cache->c,
+ cache->argtype, -1,
+ cache->fn_mcxt, false);
+ if (cache->c.typcat != TYPECAT_COMPOSITE &&
+ cache->c.typcat != TYPECAT_COMPOSITE_DOMAIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ /* translator: %s is a function name, eg json_to_record */
+ errmsg("first argument of %s must be a row type",
+ funcname)));
+}
+
+/*
+ * Setup for json{b}_to_record{set}: result type is specified by calling
+ * query. We'll also use this code for json{b}_populate_record{set},
+ * if we discover that the first argument is a null of type RECORD.
+ *
+ * Here it is syntactically impossible to specify the target type
+ * as domain-over-composite.
+ */
+static void
+get_record_type_from_query(FunctionCallInfo fcinfo,
+ const char *funcname,
+ PopulateRecordCache *cache)
+{
+ TupleDesc tupdesc;
+ MemoryContext old_cxt;
+
+ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ /* translator: %s is a function name, eg json_to_record */
+ errmsg("could not determine row type for result of %s",
+ funcname),
+ errhint("Provide a non-null record argument, "
+ "or call the function in the FROM clause "
+ "using a column definition list.")));
+
+ Assert(tupdesc);
+ cache->argtype = tupdesc->tdtypeid;
+
+ /* If we go through this more than once, avoid memory leak */
+ if (cache->c.io.composite.tupdesc)
+ FreeTupleDesc(cache->c.io.composite.tupdesc);
+
+ /* Save identified tupdesc */
+ old_cxt = MemoryContextSwitchTo(cache->fn_mcxt);
+ cache->c.io.composite.tupdesc = CreateTupleDescCopy(tupdesc);
+ cache->c.io.composite.base_typid = tupdesc->tdtypeid;
+ cache->c.io.composite.base_typmod = tupdesc->tdtypmod;
+ MemoryContextSwitchTo(old_cxt);
+}
+
+/*
+ * common worker for json{b}_populate_record() and json{b}_to_record()
+ * is_json and have_record_arg identify the specific function
+ */
+static Datum
+populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
+ bool is_json, bool have_record_arg)
+{
+ int json_arg_num = have_record_arg ? 1 : 0;
+ JsValue jsv = {0};
+ HeapTupleHeader rec;
+ Datum rettuple;
+ JsonbValue jbv;
+ MemoryContext fnmcxt = fcinfo->flinfo->fn_mcxt;
+ PopulateRecordCache *cache = fcinfo->flinfo->fn_extra;
+
+ /*
+ * If first time through, identify input/result record type. Note that
+ * this stanza looks only at fcinfo context, which can't change during the
+ * query; so we may not be able to fully resolve a RECORD input type yet.
+ */
+ if (!cache)
+ {
+ fcinfo->flinfo->fn_extra = cache =
+ MemoryContextAllocZero(fnmcxt, sizeof(*cache));
+ cache->fn_mcxt = fnmcxt;
+
+ if (have_record_arg)
+ get_record_type_from_argument(fcinfo, funcname, cache);
+ else
+ get_record_type_from_query(fcinfo, funcname, cache);
+ }
+
+ /* Collect record arg if we have one */
+ if (!have_record_arg)
+ rec = NULL; /* it's json{b}_to_record() */
+ else if (!PG_ARGISNULL(0))
+ {
+ rec = PG_GETARG_HEAPTUPLEHEADER(0);
+
+ /*
+ * When declared arg type is RECORD, identify actual record type from
+ * the tuple itself.
+ */
+ if (cache->argtype == RECORDOID)
+ {
+ cache->c.io.composite.base_typid = HeapTupleHeaderGetTypeId(rec);
+ cache->c.io.composite.base_typmod = HeapTupleHeaderGetTypMod(rec);
+ }
+ }
+ else
+ {
+ rec = NULL;
+
+ /*
+ * When declared arg type is RECORD, identify actual record type from
+ * calling query, or fail if we can't.
+ */
+ if (cache->argtype == RECORDOID)
+ {
+ get_record_type_from_query(fcinfo, funcname, cache);
+ /* This can't change argtype, which is important for next time */
+ Assert(cache->argtype == RECORDOID);
+ }
+ }
+
+ /* If no JSON argument, just return the record (if any) unchanged */
+ if (PG_ARGISNULL(json_arg_num))
+ {
+ if (rec)
+ PG_RETURN_POINTER(rec);
+ else
+ PG_RETURN_NULL();
+ }
+
+ jsv.is_json = is_json;
+
+ if (is_json)
+ {
+ text *json = PG_GETARG_TEXT_PP(json_arg_num);
+
+ jsv.val.json.str = VARDATA_ANY(json);
+ jsv.val.json.len = VARSIZE_ANY_EXHDR(json);
+ jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in
+ * populate_composite() */
+ }
+ else
+ {
+ Jsonb *jb = PG_GETARG_JSONB_P(json_arg_num);
+
+ jsv.val.jsonb = &jbv;
+
+ /* fill binary jsonb value pointing to jb */
+ jbv.type = jbvBinary;
+ jbv.val.binary.data = &jb->root;
+ jbv.val.binary.len = VARSIZE(jb) - VARHDRSZ;
+ }
+
+ rettuple = populate_composite(&cache->c.io.composite, cache->argtype,
+ NULL, fnmcxt, rec, &jsv, false);
+
+ PG_RETURN_DATUM(rettuple);
+}
+
+/*
+ * get_json_object_as_hash
+ *
+ * decompose a json object into a hash table.
+ */
+static HTAB *
+get_json_object_as_hash(char *json, int len, const char *funcname)
+{
+ HASHCTL ctl;
+ HTAB *tab;
+ JHashState *state;
+ JsonLexContext *lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
+ JsonSemAction *sem;
+
+ ctl.keysize = NAMEDATALEN;
+ ctl.entrysize = sizeof(JsonHashEntry);
+ ctl.hcxt = CurrentMemoryContext;
+ tab = hash_create("json object hashtable",
+ 100,
+ &ctl,
+ HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
+
+ state = palloc0(sizeof(JHashState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ state->function_name = funcname;
+ state->hash = tab;
+ state->lex = lex;
+
+ sem->semstate = (void *) state;
+ sem->array_start = hash_array_start;
+ sem->scalar = hash_scalar;
+ sem->object_field_start = hash_object_field_start;
+ sem->object_field_end = hash_object_field_end;
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ return tab;
+}
+
+static void
+hash_object_field_start(void *state, char *fname, bool isnull)
+{
+ JHashState *_state = (JHashState *) state;
+
+ if (_state->lex->lex_level > 1)
+ return;
+
+ /* remember token type */
+ _state->saved_token_type = _state->lex->token_type;
+
+ if (_state->lex->token_type == JSON_TOKEN_ARRAY_START ||
+ _state->lex->token_type == JSON_TOKEN_OBJECT_START)
+ {
+ /* remember start position of the whole text of the subobject */
+ _state->save_json_start = _state->lex->token_start;
+ }
+ else
+ {
+ /* must be a scalar */
+ _state->save_json_start = NULL;
+ }
+}
+
+static void
+hash_object_field_end(void *state, char *fname, bool isnull)
+{
+ JHashState *_state = (JHashState *) state;
+ JsonHashEntry *hashentry;
+ bool found;
+
+ /*
+ * Ignore nested fields.
+ */
+ if (_state->lex->lex_level > 1)
+ return;
+
+ /*
+ * Ignore field names >= NAMEDATALEN - they can't match a record field.
+ * (Note: without this test, the hash code would truncate the string at
+ * NAMEDATALEN-1, and could then match against a similarly-truncated
+ * record field name. That would be a reasonable behavior, but this code
+ * has previously insisted on exact equality, so we keep this behavior.)
+ */
+ if (strlen(fname) >= NAMEDATALEN)
+ return;
+
+ hashentry = hash_search(_state->hash, fname, HASH_ENTER, &found);
+
+ /*
+ * found being true indicates a duplicate. We don't do anything about
+ * that, a later field with the same name overrides the earlier field.
+ */
+
+ hashentry->type = _state->saved_token_type;
+ Assert(isnull == (hashentry->type == JSON_TOKEN_NULL));
+
+ if (_state->save_json_start != NULL)
+ {
+ int len = _state->lex->prev_token_terminator - _state->save_json_start;
+ char *val = palloc((len + 1) * sizeof(char));
+
+ memcpy(val, _state->save_json_start, len);
+ val[len] = '\0';
+ hashentry->val = val;
+ }
+ else
+ {
+ /* must have had a scalar instead */
+ hashentry->val = _state->saved_scalar;
+ }
+}
+
+static void
+hash_array_start(void *state)
+{
+ JHashState *_state = (JHashState *) state;
+
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on an array", _state->function_name)));
+}
+
+static void
+hash_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ JHashState *_state = (JHashState *) state;
+
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a scalar", _state->function_name)));
+
+ if (_state->lex->lex_level == 1)
+ {
+ _state->saved_scalar = token;
+ /* saved_token_type must already be set in hash_object_field_start() */
+ Assert(_state->saved_token_type == tokentype);
+ }
+}
+
+
+/*
+ * SQL function json_populate_recordset
+ *
+ * set fields in a set of records from the argument json,
+ * which must be an array of objects.
+ *
+ * similar to json_populate_record, but the tuple-building code
+ * is pushed down into the semantic action handlers so it's done
+ * per object in the array.
+ */
+Datum
+jsonb_populate_recordset(PG_FUNCTION_ARGS)
+{
+ return populate_recordset_worker(fcinfo, "jsonb_populate_recordset",
+ false, true);
+}
+
+Datum
+jsonb_to_recordset(PG_FUNCTION_ARGS)
+{
+ return populate_recordset_worker(fcinfo, "jsonb_to_recordset",
+ false, false);
+}
+
+Datum
+json_populate_recordset(PG_FUNCTION_ARGS)
+{
+ return populate_recordset_worker(fcinfo, "json_populate_recordset",
+ true, true);
+}
+
+Datum
+json_to_recordset(PG_FUNCTION_ARGS)
+{
+ return populate_recordset_worker(fcinfo, "json_to_recordset",
+ true, false);
+}
+
+static void
+populate_recordset_record(PopulateRecordsetState *state, JsObject *obj)
+{
+ PopulateRecordCache *cache = state->cache;
+ HeapTupleHeader tuphead;
+ HeapTupleData tuple;
+
+ /* acquire/update cached tuple descriptor */
+ update_cached_tupdesc(&cache->c.io.composite, cache->fn_mcxt);
+
+ /* replace record fields from json */
+ tuphead = populate_record(cache->c.io.composite.tupdesc,
+ &cache->c.io.composite.record_io,
+ state->rec,
+ cache->fn_mcxt,
+ obj);
+
+ /* if it's domain over composite, check domain constraints */
+ if (cache->c.typcat == TYPECAT_COMPOSITE_DOMAIN)
+ domain_check(HeapTupleHeaderGetDatum(tuphead), false,
+ cache->argtype,
+ &cache->c.io.composite.domain_info,
+ cache->fn_mcxt);
+
+ /* ok, save into tuplestore */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(tuphead);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = tuphead;
+
+ tuplestore_puttuple(state->tuple_store, &tuple);
+}
+
+/*
+ * common worker for json{b}_populate_recordset() and json{b}_to_recordset()
+ * is_json and have_record_arg identify the specific function
+ */
+static Datum
+populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname,
+ bool is_json, bool have_record_arg)
+{
+ int json_arg_num = have_record_arg ? 1 : 0;
+ ReturnSetInfo *rsi;
+ MemoryContext old_cxt;
+ HeapTupleHeader rec;
+ PopulateRecordCache *cache = fcinfo->flinfo->fn_extra;
+ PopulateRecordsetState *state;
+
+ rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ if (!rsi || !IsA(rsi, ReturnSetInfo))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+
+ if (!(rsi->allowedModes & SFRM_Materialize))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+
+ rsi->returnMode = SFRM_Materialize;
+
+ /*
+ * If first time through, identify input/result record type. Note that
+ * this stanza looks only at fcinfo context, which can't change during the
+ * query; so we may not be able to fully resolve a RECORD input type yet.
+ */
+ if (!cache)
+ {
+ fcinfo->flinfo->fn_extra = cache =
+ MemoryContextAllocZero(fcinfo->flinfo->fn_mcxt, sizeof(*cache));
+ cache->fn_mcxt = fcinfo->flinfo->fn_mcxt;
+
+ if (have_record_arg)
+ get_record_type_from_argument(fcinfo, funcname, cache);
+ else
+ get_record_type_from_query(fcinfo, funcname, cache);
+ }
+
+ /* Collect record arg if we have one */
+ if (!have_record_arg)
+ rec = NULL; /* it's json{b}_to_recordset() */
+ else if (!PG_ARGISNULL(0))
+ {
+ rec = PG_GETARG_HEAPTUPLEHEADER(0);
+
+ /*
+ * When declared arg type is RECORD, identify actual record type from
+ * the tuple itself.
+ */
+ if (cache->argtype == RECORDOID)
+ {
+ cache->c.io.composite.base_typid = HeapTupleHeaderGetTypeId(rec);
+ cache->c.io.composite.base_typmod = HeapTupleHeaderGetTypMod(rec);
+ }
+ }
+ else
+ {
+ rec = NULL;
+
+ /*
+ * When declared arg type is RECORD, identify actual record type from
+ * calling query, or fail if we can't.
+ */
+ if (cache->argtype == RECORDOID)
+ {
+ get_record_type_from_query(fcinfo, funcname, cache);
+ /* This can't change argtype, which is important for next time */
+ Assert(cache->argtype == RECORDOID);
+ }
+ }
+
+ /* if the json is null send back an empty set */
+ if (PG_ARGISNULL(json_arg_num))
+ PG_RETURN_NULL();
+
+ /*
+ * Forcibly update the cached tupdesc, to ensure we have the right tupdesc
+ * to return even if the JSON contains no rows.
+ */
+ update_cached_tupdesc(&cache->c.io.composite, cache->fn_mcxt);
+
+ state = palloc0(sizeof(PopulateRecordsetState));
+
+ /* make tuplestore in a sufficiently long-lived memory context */
+ old_cxt = MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory);
+ state->tuple_store = tuplestore_begin_heap(rsi->allowedModes &
+ SFRM_Materialize_Random,
+ false, work_mem);
+ MemoryContextSwitchTo(old_cxt);
+
+ state->function_name = funcname;
+ state->cache = cache;
+ state->rec = rec;
+
+ if (is_json)
+ {
+ text *json = PG_GETARG_TEXT_PP(json_arg_num);
+ JsonLexContext *lex;
+ JsonSemAction *sem;
+
+ sem = palloc0(sizeof(JsonSemAction));
+
+ lex = makeJsonLexContext(json, true);
+
+ sem->semstate = (void *) state;
+ sem->array_start = populate_recordset_array_start;
+ sem->array_element_start = populate_recordset_array_element_start;
+ sem->scalar = populate_recordset_scalar;
+ sem->object_field_start = populate_recordset_object_field_start;
+ sem->object_field_end = populate_recordset_object_field_end;
+ sem->object_start = populate_recordset_object_start;
+ sem->object_end = populate_recordset_object_end;
+
+ state->lex = lex;
+
+ pg_parse_json_or_ereport(lex, sem);
+ }
+ else
+ {
+ Jsonb *jb = PG_GETARG_JSONB_P(json_arg_num);
+ JsonbIterator *it;
+ JsonbValue v;
+ bool skipNested = false;
+ JsonbIteratorToken r;
+
+ if (JB_ROOT_IS_SCALAR(jb) || !JB_ROOT_IS_ARRAY(jb))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a non-array",
+ funcname)));
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if (r == WJB_ELEM)
+ {
+ JsObject obj;
+
+ if (v.type != jbvBinary ||
+ !JsonContainerIsObject(v.val.binary.data))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument of %s must be an array of objects",
+ funcname)));
+
+ obj.is_json = false;
+ obj.val.jsonb_cont = v.val.binary.data;
+
+ populate_recordset_record(state, &obj);
+ }
+ }
+ }
+
+ /*
+ * Note: we must copy the cached tupdesc because the executor will free
+ * the passed-back setDesc, but we want to hang onto the cache in case
+ * we're called again in the same query.
+ */
+ rsi->setResult = state->tuple_store;
+ rsi->setDesc = CreateTupleDescCopy(cache->c.io.composite.tupdesc);
+
+ PG_RETURN_NULL();
+}
+
+static void
+populate_recordset_object_start(void *state)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+ int lex_level = _state->lex->lex_level;
+ HASHCTL ctl;
+
+ /* Reject object at top level: we must have an array at level 0 */
+ if (lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on an object",
+ _state->function_name)));
+
+ /* Nested objects require no special processing */
+ if (lex_level > 1)
+ return;
+
+ /* Object at level 1: set up a new hash table for this object */
+ ctl.keysize = NAMEDATALEN;
+ ctl.entrysize = sizeof(JsonHashEntry);
+ ctl.hcxt = CurrentMemoryContext;
+ _state->json_hash = hash_create("json object hashtable",
+ 100,
+ &ctl,
+ HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
+}
+
+static void
+populate_recordset_object_end(void *state)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+ JsObject obj;
+
+ /* Nested objects require no special processing */
+ if (_state->lex->lex_level > 1)
+ return;
+
+ obj.is_json = true;
+ obj.val.json_hash = _state->json_hash;
+
+ /* Otherwise, construct and return a tuple based on this level-1 object */
+ populate_recordset_record(_state, &obj);
+
+ /* Done with hash for this object */
+ hash_destroy(_state->json_hash);
+ _state->json_hash = NULL;
+}
+
+static void
+populate_recordset_array_element_start(void *state, bool isnull)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+
+ if (_state->lex->lex_level == 1 &&
+ _state->lex->token_type != JSON_TOKEN_OBJECT_START)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument of %s must be an array of objects",
+ _state->function_name)));
+}
+
+static void
+populate_recordset_array_start(void *state)
+{
+ /* nothing to do */
+}
+
+static void
+populate_recordset_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+
+ if (_state->lex->lex_level == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot call %s on a scalar",
+ _state->function_name)));
+
+ if (_state->lex->lex_level == 2)
+ _state->saved_scalar = token;
+}
+
+static void
+populate_recordset_object_field_start(void *state, char *fname, bool isnull)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+
+ if (_state->lex->lex_level > 2)
+ return;
+
+ _state->saved_token_type = _state->lex->token_type;
+
+ if (_state->lex->token_type == JSON_TOKEN_ARRAY_START ||
+ _state->lex->token_type == JSON_TOKEN_OBJECT_START)
+ {
+ _state->save_json_start = _state->lex->token_start;
+ }
+ else
+ {
+ _state->save_json_start = NULL;
+ }
+}
+
+static void
+populate_recordset_object_field_end(void *state, char *fname, bool isnull)
+{
+ PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
+ JsonHashEntry *hashentry;
+ bool found;
+
+ /*
+ * Ignore nested fields.
+ */
+ if (_state->lex->lex_level > 2)
+ return;
+
+ /*
+ * Ignore field names >= NAMEDATALEN - they can't match a record field.
+ * (Note: without this test, the hash code would truncate the string at
+ * NAMEDATALEN-1, and could then match against a similarly-truncated
+ * record field name. That would be a reasonable behavior, but this code
+ * has previously insisted on exact equality, so we keep this behavior.)
+ */
+ if (strlen(fname) >= NAMEDATALEN)
+ return;
+
+ hashentry = hash_search(_state->json_hash, fname, HASH_ENTER, &found);
+
+ /*
+ * found being true indicates a duplicate. We don't do anything about
+ * that, a later field with the same name overrides the earlier field.
+ */
+
+ hashentry->type = _state->saved_token_type;
+ Assert(isnull == (hashentry->type == JSON_TOKEN_NULL));
+
+ if (_state->save_json_start != NULL)
+ {
+ int len = _state->lex->prev_token_terminator - _state->save_json_start;
+ char *val = palloc((len + 1) * sizeof(char));
+
+ memcpy(val, _state->save_json_start, len);
+ val[len] = '\0';
+ hashentry->val = val;
+ }
+ else
+ {
+ /* must have had a scalar instead */
+ hashentry->val = _state->saved_scalar;
+ }
+}
+
+/*
+ * Semantic actions for json_strip_nulls.
+ *
+ * Simply repeat the input on the output unless we encounter
+ * a null object field. State for this is set when the field
+ * is started and reset when the scalar action (which must be next)
+ * is called.
+ */
+
+static void
+sn_object_start(void *state)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '{');
+}
+
+static void
+sn_object_end(void *state)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '}');
+}
+
+static void
+sn_array_start(void *state)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '[');
+}
+
+static void
+sn_array_end(void *state)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ appendStringInfoCharMacro(_state->strval, ']');
+}
+
+static void
+sn_object_field_start(void *state, char *fname, bool isnull)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ if (isnull)
+ {
+ /*
+ * The next thing must be a scalar or isnull couldn't be true, so
+ * there is no danger of this state being carried down into a nested
+ * object or array. The flag will be reset in the scalar action.
+ */
+ _state->skip_next_null = true;
+ return;
+ }
+
+ if (_state->strval->data[_state->strval->len - 1] != '{')
+ appendStringInfoCharMacro(_state->strval, ',');
+
+ /*
+ * Unfortunately we don't have the quoted and escaped string any more, so
+ * we have to re-escape it.
+ */
+ escape_json(_state->strval, fname);
+
+ appendStringInfoCharMacro(_state->strval, ':');
+}
+
+static void
+sn_array_element_start(void *state, bool isnull)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ if (_state->strval->data[_state->strval->len - 1] != '[')
+ appendStringInfoCharMacro(_state->strval, ',');
+}
+
+static void
+sn_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ StripnullState *_state = (StripnullState *) state;
+
+ if (_state->skip_next_null)
+ {
+ Assert(tokentype == JSON_TOKEN_NULL);
+ _state->skip_next_null = false;
+ return;
+ }
+
+ if (tokentype == JSON_TOKEN_STRING)
+ escape_json(_state->strval, token);
+ else
+ appendStringInfoString(_state->strval, token);
+}
+
+/*
+ * SQL function json_strip_nulls(json) -> json
+ */
+Datum
+json_strip_nulls(PG_FUNCTION_ARGS)
+{
+ text *json = PG_GETARG_TEXT_PP(0);
+ StripnullState *state;
+ JsonLexContext *lex;
+ JsonSemAction *sem;
+
+ lex = makeJsonLexContext(json, true);
+ state = palloc0(sizeof(StripnullState));
+ sem = palloc0(sizeof(JsonSemAction));
+
+ state->strval = makeStringInfo();
+ state->skip_next_null = false;
+ state->lex = lex;
+
+ sem->semstate = (void *) state;
+ sem->object_start = sn_object_start;
+ sem->object_end = sn_object_end;
+ sem->array_start = sn_array_start;
+ sem->array_end = sn_array_end;
+ sem->scalar = sn_scalar;
+ sem->array_element_start = sn_array_element_start;
+ sem->object_field_start = sn_object_field_start;
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(state->strval->data,
+ state->strval->len));
+}
+
+/*
+ * SQL function jsonb_strip_nulls(jsonb) -> jsonb
+ */
+Datum
+jsonb_strip_nulls(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonbIterator *it;
+ JsonbParseState *parseState = NULL;
+ JsonbValue *res = NULL;
+ JsonbValue v,
+ k;
+ JsonbIteratorToken type;
+ bool last_was_key = false;
+
+ if (JB_ROOT_IS_SCALAR(jb))
+ PG_RETURN_POINTER(jb);
+
+ it = JsonbIteratorInit(&jb->root);
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ Assert(!(type == WJB_KEY && last_was_key));
+
+ if (type == WJB_KEY)
+ {
+ /* stash the key until we know if it has a null value */
+ k = v;
+ last_was_key = true;
+ continue;
+ }
+
+ if (last_was_key)
+ {
+ /* if the last element was a key this one can't be */
+ last_was_key = false;
+
+ /* skip this field if value is null */
+ if (type == WJB_VALUE && v.type == jbvNull)
+ continue;
+
+ /* otherwise, do a delayed push of the key */
+ (void) pushJsonbValue(&parseState, WJB_KEY, &k);
+ }
+
+ if (type == WJB_VALUE || type == WJB_ELEM)
+ res = pushJsonbValue(&parseState, type, &v);
+ else
+ res = pushJsonbValue(&parseState, type, NULL);
+ }
+
+ Assert(res != NULL);
+
+ PG_RETURN_POINTER(JsonbValueToJsonb(res));
+}
+
+/*
+ * SQL function jsonb_pretty (jsonb)
+ *
+ * Pretty-printed text for the jsonb
+ */
+Datum
+jsonb_pretty(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ StringInfo str = makeStringInfo();
+
+ JsonbToCStringIndent(str, &jb->root, VARSIZE(jb));
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(str->data, str->len));
+}
+
+/*
+ * SQL function jsonb_concat (jsonb, jsonb)
+ *
+ * function for || operator
+ */
+Datum
+jsonb_concat(PG_FUNCTION_ARGS)
+{
+ Jsonb *jb1 = PG_GETARG_JSONB_P(0);
+ Jsonb *jb2 = PG_GETARG_JSONB_P(1);
+ JsonbParseState *state = NULL;
+ JsonbValue *res;
+ JsonbIterator *it1,
+ *it2;
+
+ /*
+ * If one of the jsonb is empty, just return the other if it's not scalar
+ * and both are of the same kind. If it's a scalar or they are of
+ * different kinds we need to perform the concatenation even if one is
+ * empty.
+ */
+ if (JB_ROOT_IS_OBJECT(jb1) == JB_ROOT_IS_OBJECT(jb2))
+ {
+ if (JB_ROOT_COUNT(jb1) == 0 && !JB_ROOT_IS_SCALAR(jb2))
+ PG_RETURN_JSONB_P(jb2);
+ else if (JB_ROOT_COUNT(jb2) == 0 && !JB_ROOT_IS_SCALAR(jb1))
+ PG_RETURN_JSONB_P(jb1);
+ }
+
+ it1 = JsonbIteratorInit(&jb1->root);
+ it2 = JsonbIteratorInit(&jb2->root);
+
+ res = IteratorConcat(&it1, &it2, &state);
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+
+/*
+ * SQL function jsonb_delete (jsonb, text)
+ *
+ * return a copy of the jsonb with the indicated item
+ * removed.
+ */
+Datum
+jsonb_delete(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ text *key = PG_GETARG_TEXT_PP(1);
+ char *keyptr = VARDATA_ANY(key);
+ int keylen = VARSIZE_ANY_EXHDR(key);
+ JsonbParseState *state = NULL;
+ JsonbIterator *it;
+ JsonbValue v,
+ *res = NULL;
+ bool skipNested = false;
+ JsonbIteratorToken r;
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot delete from scalar")));
+
+ if (JB_ROOT_COUNT(in) == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if ((r == WJB_ELEM || r == WJB_KEY) &&
+ (v.type == jbvString && keylen == v.val.string.len &&
+ memcmp(keyptr, v.val.string.val, keylen) == 0))
+ {
+ /* skip corresponding value as well */
+ if (r == WJB_KEY)
+ (void) JsonbIteratorNext(&it, &v, true);
+
+ continue;
+ }
+
+ res = pushJsonbValue(&state, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+/*
+ * SQL function jsonb_delete (jsonb, variadic text[])
+ *
+ * return a copy of the jsonb with the indicated items
+ * removed.
+ */
+Datum
+jsonb_delete_array(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ ArrayType *keys = PG_GETARG_ARRAYTYPE_P(1);
+ Datum *keys_elems;
+ bool *keys_nulls;
+ int keys_len;
+ JsonbParseState *state = NULL;
+ JsonbIterator *it;
+ JsonbValue v,
+ *res = NULL;
+ bool skipNested = false;
+ JsonbIteratorToken r;
+
+ if (ARR_NDIM(keys) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot delete from scalar")));
+
+ if (JB_ROOT_COUNT(in) == 0)
+ PG_RETURN_JSONB_P(in);
+
+ deconstruct_array(keys, TEXTOID, -1, false, TYPALIGN_INT,
+ &keys_elems, &keys_nulls, &keys_len);
+
+ if (keys_len == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ while ((r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
+ {
+ skipNested = true;
+
+ if ((r == WJB_ELEM || r == WJB_KEY) && v.type == jbvString)
+ {
+ int i;
+ bool found = false;
+
+ for (i = 0; i < keys_len; i++)
+ {
+ char *keyptr;
+ int keylen;
+
+ if (keys_nulls[i])
+ continue;
+
+ /* We rely on the array elements not being toasted */
+ keyptr = VARDATA_ANY(keys_elems[i]);
+ keylen = VARSIZE_ANY_EXHDR(keys_elems[i]);
+ if (keylen == v.val.string.len &&
+ memcmp(keyptr, v.val.string.val, keylen) == 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ {
+ /* skip corresponding value as well */
+ if (r == WJB_KEY)
+ (void) JsonbIteratorNext(&it, &v, true);
+
+ continue;
+ }
+ }
+
+ res = pushJsonbValue(&state, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+/*
+ * SQL function jsonb_delete (jsonb, int)
+ *
+ * return a copy of the jsonb with the indicated item
+ * removed. Negative int means count back from the
+ * end of the items.
+ */
+Datum
+jsonb_delete_idx(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ int idx = PG_GETARG_INT32(1);
+ JsonbParseState *state = NULL;
+ JsonbIterator *it;
+ uint32 i = 0,
+ n;
+ JsonbValue v,
+ *res = NULL;
+ JsonbIteratorToken r;
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot delete from scalar")));
+
+ if (JB_ROOT_IS_OBJECT(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot delete from object using integer index")));
+
+ if (JB_ROOT_COUNT(in) == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ r = JsonbIteratorNext(&it, &v, false);
+ Assert(r == WJB_BEGIN_ARRAY);
+ n = v.val.array.nElems;
+
+ if (idx < 0)
+ {
+ if (-idx > n)
+ idx = n;
+ else
+ idx = n + idx;
+ }
+
+ if (idx >= n)
+ PG_RETURN_JSONB_P(in);
+
+ pushJsonbValue(&state, r, NULL);
+
+ while ((r = JsonbIteratorNext(&it, &v, true)) != WJB_DONE)
+ {
+ if (r == WJB_ELEM)
+ {
+ if (i++ == idx)
+ continue;
+ }
+
+ res = pushJsonbValue(&state, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+/*
+ * SQL function jsonb_set(jsonb, text[], jsonb, boolean)
+ */
+Datum
+jsonb_set(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ ArrayType *path = PG_GETARG_ARRAYTYPE_P(1);
+ Jsonb *newjsonb = PG_GETARG_JSONB_P(2);
+ JsonbValue newval;
+ bool create = PG_GETARG_BOOL(3);
+ JsonbValue *res = NULL;
+ Datum *path_elems;
+ bool *path_nulls;
+ int path_len;
+ JsonbIterator *it;
+ JsonbParseState *st = NULL;
+
+ JsonbToJsonbValue(newjsonb, &newval);
+
+ if (ARR_NDIM(path) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot set path in scalar")));
+
+ if (JB_ROOT_COUNT(in) == 0 && !create)
+ PG_RETURN_JSONB_P(in);
+
+ deconstruct_array(path, TEXTOID, -1, false, TYPALIGN_INT,
+ &path_elems, &path_nulls, &path_len);
+
+ if (path_len == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ res = setPath(&it, path_elems, path_nulls, path_len, &st,
+ 0, &newval, create ? JB_PATH_CREATE : JB_PATH_REPLACE);
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+
+/*
+ * SQL function jsonb_set_lax(jsonb, text[], jsonb, boolean, text)
+ */
+Datum
+jsonb_set_lax(PG_FUNCTION_ARGS)
+{
+ /* Jsonb *in = PG_GETARG_JSONB_P(0); */
+ /* ArrayType *path = PG_GETARG_ARRAYTYPE_P(1); */
+ /* Jsonb *newval = PG_GETARG_JSONB_P(2); */
+ /* bool create = PG_GETARG_BOOL(3); */
+ text *handle_null;
+ char *handle_val;
+
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1) || PG_ARGISNULL(3))
+ PG_RETURN_NULL();
+
+ /* could happen if they pass in an explicit NULL */
+ if (PG_ARGISNULL(4))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"")));
+
+ /* if the new value isn't an SQL NULL just call jsonb_set */
+ if (!PG_ARGISNULL(2))
+ return jsonb_set(fcinfo);
+
+ handle_null = PG_GETARG_TEXT_P(4);
+ handle_val = text_to_cstring(handle_null);
+
+ if (strcmp(handle_val, "raise_exception") == 0)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("JSON value must not be null"),
+ errdetail("Exception was raised because null_value_treatment is \"raise_exception\"."),
+ errhint("To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed.")));
+ return (Datum) 0; /* silence stupider compilers */
+ }
+ else if (strcmp(handle_val, "use_json_null") == 0)
+ {
+ Datum newval;
+
+ newval = DirectFunctionCall1(jsonb_in, CStringGetDatum("null"));
+
+ fcinfo->args[2].value = newval;
+ fcinfo->args[2].isnull = false;
+ return jsonb_set(fcinfo);
+ }
+ else if (strcmp(handle_val, "delete_key") == 0)
+ {
+ return jsonb_delete_path(fcinfo);
+ }
+ else if (strcmp(handle_val, "return_target") == 0)
+ {
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+
+ PG_RETURN_JSONB_P(in);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"")));
+ return (Datum) 0; /* silence stupider compilers */
+ }
+}
+
+/*
+ * SQL function jsonb_delete_path(jsonb, text[])
+ */
+Datum
+jsonb_delete_path(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ ArrayType *path = PG_GETARG_ARRAYTYPE_P(1);
+ JsonbValue *res = NULL;
+ Datum *path_elems;
+ bool *path_nulls;
+ int path_len;
+ JsonbIterator *it;
+ JsonbParseState *st = NULL;
+
+ if (ARR_NDIM(path) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot delete path in scalar")));
+
+ if (JB_ROOT_COUNT(in) == 0)
+ PG_RETURN_JSONB_P(in);
+
+ deconstruct_array(path, TEXTOID, -1, false, TYPALIGN_INT,
+ &path_elems, &path_nulls, &path_len);
+
+ if (path_len == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ res = setPath(&it, path_elems, path_nulls, path_len, &st,
+ 0, NULL, JB_PATH_DELETE);
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+/*
+ * SQL function jsonb_insert(jsonb, text[], jsonb, boolean)
+ */
+Datum
+jsonb_insert(PG_FUNCTION_ARGS)
+{
+ Jsonb *in = PG_GETARG_JSONB_P(0);
+ ArrayType *path = PG_GETARG_ARRAYTYPE_P(1);
+ Jsonb *newjsonb = PG_GETARG_JSONB_P(2);
+ JsonbValue newval;
+ bool after = PG_GETARG_BOOL(3);
+ JsonbValue *res = NULL;
+ Datum *path_elems;
+ bool *path_nulls;
+ int path_len;
+ JsonbIterator *it;
+ JsonbParseState *st = NULL;
+
+ JsonbToJsonbValue(newjsonb, &newval);
+
+ if (ARR_NDIM(path) > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("wrong number of array subscripts")));
+
+ if (JB_ROOT_IS_SCALAR(in))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot set path in scalar")));
+
+ deconstruct_array(path, TEXTOID, -1, false, TYPALIGN_INT,
+ &path_elems, &path_nulls, &path_len);
+
+ if (path_len == 0)
+ PG_RETURN_JSONB_P(in);
+
+ it = JsonbIteratorInit(&in->root);
+
+ res = setPath(&it, path_elems, path_nulls, path_len, &st, 0, &newval,
+ after ? JB_PATH_INSERT_AFTER : JB_PATH_INSERT_BEFORE);
+
+ Assert(res != NULL);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(res));
+}
+
+/*
+ * Iterate over all jsonb objects and merge them into one.
+ * The logic of this function copied from the same hstore function,
+ * except the case, when it1 & it2 represents jbvObject.
+ * In that case we just append the content of it2 to it1 without any
+ * verifications.
+ */
+static JsonbValue *
+IteratorConcat(JsonbIterator **it1, JsonbIterator **it2,
+ JsonbParseState **state)
+{
+ JsonbValue v1,
+ v2,
+ *res = NULL;
+ JsonbIteratorToken r1,
+ r2,
+ rk1,
+ rk2;
+
+ rk1 = JsonbIteratorNext(it1, &v1, false);
+ rk2 = JsonbIteratorNext(it2, &v2, false);
+
+ /*
+ * JsonbIteratorNext reports raw scalars as if they were single-element
+ * arrays; hence we only need consider "object" and "array" cases here.
+ */
+ if (rk1 == WJB_BEGIN_OBJECT && rk2 == WJB_BEGIN_OBJECT)
+ {
+ /*
+ * Both inputs are objects.
+ *
+ * Append all the tokens from v1 to res, except last WJB_END_OBJECT
+ * (because res will not be finished yet).
+ */
+ pushJsonbValue(state, rk1, NULL);
+ while ((r1 = JsonbIteratorNext(it1, &v1, true)) != WJB_END_OBJECT)
+ pushJsonbValue(state, r1, &v1);
+
+ /*
+ * Append all the tokens from v2 to res, including last WJB_END_OBJECT
+ * (the concatenation will be completed). Any duplicate keys will
+ * automatically override the value from the first object.
+ */
+ while ((r2 = JsonbIteratorNext(it2, &v2, true)) != WJB_DONE)
+ res = pushJsonbValue(state, r2, r2 != WJB_END_OBJECT ? &v2 : NULL);
+ }
+ else if (rk1 == WJB_BEGIN_ARRAY && rk2 == WJB_BEGIN_ARRAY)
+ {
+ /*
+ * Both inputs are arrays.
+ */
+ pushJsonbValue(state, rk1, NULL);
+
+ while ((r1 = JsonbIteratorNext(it1, &v1, true)) != WJB_END_ARRAY)
+ {
+ Assert(r1 == WJB_ELEM);
+ pushJsonbValue(state, r1, &v1);
+ }
+
+ while ((r2 = JsonbIteratorNext(it2, &v2, true)) != WJB_END_ARRAY)
+ {
+ Assert(r2 == WJB_ELEM);
+ pushJsonbValue(state, WJB_ELEM, &v2);
+ }
+
+ res = pushJsonbValue(state, WJB_END_ARRAY, NULL /* signal to sort */ );
+ }
+ else if (rk1 == WJB_BEGIN_OBJECT)
+ {
+ /*
+ * We have object || array.
+ */
+ Assert(rk2 == WJB_BEGIN_ARRAY);
+
+ pushJsonbValue(state, WJB_BEGIN_ARRAY, NULL);
+
+ pushJsonbValue(state, WJB_BEGIN_OBJECT, NULL);
+ while ((r1 = JsonbIteratorNext(it1, &v1, true)) != WJB_DONE)
+ pushJsonbValue(state, r1, r1 != WJB_END_OBJECT ? &v1 : NULL);
+
+ while ((r2 = JsonbIteratorNext(it2, &v2, true)) != WJB_DONE)
+ res = pushJsonbValue(state, r2, r2 != WJB_END_ARRAY ? &v2 : NULL);
+ }
+ else
+ {
+ /*
+ * We have array || object.
+ */
+ Assert(rk1 == WJB_BEGIN_ARRAY);
+ Assert(rk2 == WJB_BEGIN_OBJECT);
+
+ pushJsonbValue(state, WJB_BEGIN_ARRAY, NULL);
+
+ while ((r1 = JsonbIteratorNext(it1, &v1, true)) != WJB_END_ARRAY)
+ pushJsonbValue(state, r1, &v1);
+
+ pushJsonbValue(state, WJB_BEGIN_OBJECT, NULL);
+ while ((r2 = JsonbIteratorNext(it2, &v2, true)) != WJB_DONE)
+ pushJsonbValue(state, r2, r2 != WJB_END_OBJECT ? &v2 : NULL);
+
+ res = pushJsonbValue(state, WJB_END_ARRAY, NULL);
+ }
+
+ return res;
+}
+
+/*
+ * Do most of the heavy work for jsonb_set/jsonb_insert
+ *
+ * If JB_PATH_DELETE bit is set in op_type, the element is to be removed.
+ *
+ * If any bit mentioned in JB_PATH_CREATE_OR_INSERT is set in op_type,
+ * we create the new value if the key or array index does not exist.
+ *
+ * Bits JB_PATH_INSERT_BEFORE and JB_PATH_INSERT_AFTER in op_type
+ * behave as JB_PATH_CREATE if new value is inserted in JsonbObject.
+ *
+ * If JB_PATH_FILL_GAPS bit is set, this will change an assignment logic in
+ * case if target is an array. The assignment index will not be restricted by
+ * number of elements in the array, and if there are any empty slots between
+ * last element of the array and a new one they will be filled with nulls. If
+ * the index is negative, it still will be considered an index from the end
+ * of the array. Of a part of the path is not present and this part is more
+ * than just one last element, this flag will instruct to create the whole
+ * chain of corresponding objects and insert the value.
+ *
+ * JB_PATH_CONSISTENT_POSITION for an array indicates that the caller wants to
+ * keep values with fixed indices. Indices for existing elements could be
+ * changed (shifted forward) in case if the array is prepended with a new value
+ * and a negative index out of the range, so this behavior will be prevented
+ * and return an error.
+ *
+ * All path elements before the last must already exist
+ * whatever bits in op_type are set, or nothing is done.
+ */
+static JsonbValue *
+setPath(JsonbIterator **it, Datum *path_elems,
+ bool *path_nulls, int path_len,
+ JsonbParseState **st, int level, JsonbValue *newval, int op_type)
+{
+ JsonbValue v;
+ JsonbIteratorToken r;
+ JsonbValue *res;
+
+ check_stack_depth();
+
+ if (path_nulls[level])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("path element at position %d is null",
+ level + 1)));
+
+ r = JsonbIteratorNext(it, &v, false);
+
+ switch (r)
+ {
+ case WJB_BEGIN_ARRAY:
+
+ /*
+ * If instructed complain about attempts to replace within a raw
+ * scalar value. This happens even when current level is equal to
+ * path_len, because the last path key should also correspond to
+ * an object or an array, not raw scalar.
+ */
+ if ((op_type & JB_PATH_FILL_GAPS) && (level <= path_len - 1) &&
+ v.val.array.rawScalar)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot replace existing key"),
+ errdetail("The path assumes key is a composite object, "
+ "but it is a scalar value.")));
+
+ (void) pushJsonbValue(st, r, NULL);
+ setPathArray(it, path_elems, path_nulls, path_len, st, level,
+ newval, v.val.array.nElems, op_type);
+ r = JsonbIteratorNext(it, &v, false);
+ Assert(r == WJB_END_ARRAY);
+ res = pushJsonbValue(st, r, NULL);
+ break;
+ case WJB_BEGIN_OBJECT:
+ (void) pushJsonbValue(st, r, NULL);
+ setPathObject(it, path_elems, path_nulls, path_len, st, level,
+ newval, v.val.object.nPairs, op_type);
+ r = JsonbIteratorNext(it, &v, true);
+ Assert(r == WJB_END_OBJECT);
+ res = pushJsonbValue(st, r, NULL);
+ break;
+ case WJB_ELEM:
+ case WJB_VALUE:
+
+ /*
+ * If instructed complain about attempts to replace within a
+ * scalar value. This happens even when current level is equal to
+ * path_len, because the last path key should also correspond to
+ * an object or an array, not an element or value.
+ */
+ if ((op_type & JB_PATH_FILL_GAPS) && (level <= path_len - 1))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot replace existing key"),
+ errdetail("The path assumes key is a composite object, "
+ "but it is a scalar value.")));
+
+ res = pushJsonbValue(st, r, &v);
+ break;
+ default:
+ elog(ERROR, "unrecognized iterator result: %d", (int) r);
+ res = NULL; /* keep compiler quiet */
+ break;
+ }
+
+ return res;
+}
+
+/*
+ * Object walker for setPath
+ */
+static void
+setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
+ int path_len, JsonbParseState **st, int level,
+ JsonbValue *newval, uint32 npairs, int op_type)
+{
+ text *pathelem = NULL;
+ int i;
+ JsonbValue k,
+ v;
+ bool done = false;
+
+ if (level >= path_len || path_nulls[level])
+ done = true;
+ else
+ {
+ /* The path Datum could be toasted, in which case we must detoast it */
+ pathelem = DatumGetTextPP(path_elems[level]);
+ }
+
+ /* empty object is a special case for create */
+ if ((npairs == 0) && (op_type & JB_PATH_CREATE_OR_INSERT) &&
+ (level == path_len - 1))
+ {
+ JsonbValue newkey;
+
+ newkey.type = jbvString;
+ newkey.val.string.val = VARDATA_ANY(pathelem);
+ newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem);
+
+ (void) pushJsonbValue(st, WJB_KEY, &newkey);
+ (void) pushJsonbValue(st, WJB_VALUE, newval);
+ }
+
+ for (i = 0; i < npairs; i++)
+ {
+ JsonbIteratorToken r = JsonbIteratorNext(it, &k, true);
+
+ Assert(r == WJB_KEY);
+
+ if (!done &&
+ k.val.string.len == VARSIZE_ANY_EXHDR(pathelem) &&
+ memcmp(k.val.string.val, VARDATA_ANY(pathelem),
+ k.val.string.len) == 0)
+ {
+ done = true;
+
+ if (level == path_len - 1)
+ {
+ /*
+ * called from jsonb_insert(), it forbids redefining an
+ * existing value
+ */
+ if (op_type & (JB_PATH_INSERT_BEFORE | JB_PATH_INSERT_AFTER))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot replace existing key"),
+ errhint("Try using the function jsonb_set "
+ "to replace key value.")));
+
+ r = JsonbIteratorNext(it, &v, true); /* skip value */
+ if (!(op_type & JB_PATH_DELETE))
+ {
+ (void) pushJsonbValue(st, WJB_KEY, &k);
+ (void) pushJsonbValue(st, WJB_VALUE, newval);
+ }
+ }
+ else
+ {
+ (void) pushJsonbValue(st, r, &k);
+ setPath(it, path_elems, path_nulls, path_len,
+ st, level + 1, newval, op_type);
+ }
+ }
+ else
+ {
+ if ((op_type & JB_PATH_CREATE_OR_INSERT) && !done &&
+ level == path_len - 1 && i == npairs - 1)
+ {
+ JsonbValue newkey;
+
+ newkey.type = jbvString;
+ newkey.val.string.val = VARDATA_ANY(pathelem);
+ newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem);
+
+ (void) pushJsonbValue(st, WJB_KEY, &newkey);
+ (void) pushJsonbValue(st, WJB_VALUE, newval);
+ }
+
+ (void) pushJsonbValue(st, r, &k);
+ r = JsonbIteratorNext(it, &v, false);
+ (void) pushJsonbValue(st, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ if (r == WJB_BEGIN_ARRAY || r == WJB_BEGIN_OBJECT)
+ {
+ int walking_level = 1;
+
+ while (walking_level != 0)
+ {
+ r = JsonbIteratorNext(it, &v, false);
+
+ if (r == WJB_BEGIN_ARRAY || r == WJB_BEGIN_OBJECT)
+ ++walking_level;
+ if (r == WJB_END_ARRAY || r == WJB_END_OBJECT)
+ --walking_level;
+
+ (void) pushJsonbValue(st, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+ }
+ }
+ }
+
+ /*--
+ * If we got here there are only few possibilities:
+ * - no target path was found, and an open object with some keys/values was
+ * pushed into the state
+ * - an object is empty, only WJB_BEGIN_OBJECT is pushed
+ *
+ * In both cases if instructed to create the path when not present,
+ * generate the whole chain of empty objects and insert the new value
+ * there.
+ */
+ if (!done && (op_type & JB_PATH_FILL_GAPS) && (level < path_len - 1))
+ {
+ JsonbValue newkey;
+
+ newkey.type = jbvString;
+ newkey.val.string.val = VARDATA_ANY(pathelem);
+ newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem);
+
+ (void) pushJsonbValue(st, WJB_KEY, &newkey);
+ (void) push_path(st, level, path_elems, path_nulls,
+ path_len, newval);
+
+ /* Result is closed with WJB_END_OBJECT outside of this function */
+ }
+}
+
+/*
+ * Array walker for setPath
+ */
+static void
+setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
+ int path_len, JsonbParseState **st, int level,
+ JsonbValue *newval, uint32 nelems, int op_type)
+{
+ JsonbValue v;
+ int idx,
+ i;
+ bool done = false;
+
+ /* pick correct index */
+ if (level < path_len && !path_nulls[level])
+ {
+ char *c = TextDatumGetCString(path_elems[level]);
+ char *badp;
+
+ errno = 0;
+ idx = strtoint(c, &badp, 10);
+ if (badp == c || *badp != '\0' || errno != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("path element at position %d is not an integer: \"%s\"",
+ level + 1, c)));
+ }
+ else
+ idx = nelems;
+
+ if (idx < 0)
+ {
+ if (-idx > nelems)
+ {
+ /*
+ * If asked to keep elements position consistent, it's not allowed
+ * to prepend the array.
+ */
+ if (op_type & JB_PATH_CONSISTENT_POSITION)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("path element at position %d is out of range: %d",
+ level + 1, idx)));
+ else
+ idx = INT_MIN;
+ }
+ else
+ idx = nelems + idx;
+ }
+
+ /*
+ * Filling the gaps means there are no limits on the positive index are
+ * imposed, we can set any element. Otherwise limit the index by nelems.
+ */
+ if (!(op_type & JB_PATH_FILL_GAPS))
+ {
+ if (idx > 0 && idx > nelems)
+ idx = nelems;
+ }
+
+ /*
+ * if we're creating, and idx == INT_MIN, we prepend the new value to the
+ * array also if the array is empty - in which case we don't really care
+ * what the idx value is
+ */
+ if ((idx == INT_MIN || nelems == 0) && (level == path_len - 1) &&
+ (op_type & JB_PATH_CREATE_OR_INSERT))
+ {
+ Assert(newval != NULL);
+
+ if (op_type & JB_PATH_FILL_GAPS && nelems == 0 && idx > 0)
+ push_null_elements(st, idx);
+
+ (void) pushJsonbValue(st, WJB_ELEM, newval);
+
+ done = true;
+ }
+
+ /* iterate over the array elements */
+ for (i = 0; i < nelems; i++)
+ {
+ JsonbIteratorToken r;
+
+ if (i == idx && level < path_len)
+ {
+ done = true;
+
+ if (level == path_len - 1)
+ {
+ r = JsonbIteratorNext(it, &v, true); /* skip */
+
+ if (op_type & (JB_PATH_INSERT_BEFORE | JB_PATH_CREATE))
+ (void) pushJsonbValue(st, WJB_ELEM, newval);
+
+ /*
+ * We should keep current value only in case of
+ * JB_PATH_INSERT_BEFORE or JB_PATH_INSERT_AFTER because
+ * otherwise it should be deleted or replaced
+ */
+ if (op_type & (JB_PATH_INSERT_AFTER | JB_PATH_INSERT_BEFORE))
+ (void) pushJsonbValue(st, r, &v);
+
+ if (op_type & (JB_PATH_INSERT_AFTER | JB_PATH_REPLACE))
+ (void) pushJsonbValue(st, WJB_ELEM, newval);
+ }
+ else
+ (void) setPath(it, path_elems, path_nulls, path_len,
+ st, level + 1, newval, op_type);
+ }
+ else
+ {
+ r = JsonbIteratorNext(it, &v, false);
+
+ (void) pushJsonbValue(st, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+
+ if (r == WJB_BEGIN_ARRAY || r == WJB_BEGIN_OBJECT)
+ {
+ int walking_level = 1;
+
+ while (walking_level != 0)
+ {
+ r = JsonbIteratorNext(it, &v, false);
+
+ if (r == WJB_BEGIN_ARRAY || r == WJB_BEGIN_OBJECT)
+ ++walking_level;
+ if (r == WJB_END_ARRAY || r == WJB_END_OBJECT)
+ --walking_level;
+
+ (void) pushJsonbValue(st, r, r < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+ }
+ }
+ }
+
+ if ((op_type & JB_PATH_CREATE_OR_INSERT) && !done && level == path_len - 1)
+ {
+ /*
+ * If asked to fill the gaps, idx could be bigger than nelems, so
+ * prepend the new element with nulls if that's the case.
+ */
+ if (op_type & JB_PATH_FILL_GAPS && idx > nelems)
+ push_null_elements(st, idx - nelems);
+
+ (void) pushJsonbValue(st, WJB_ELEM, newval);
+ done = true;
+ }
+
+ /*--
+ * If we got here there are only few possibilities:
+ * - no target path was found, and an open array with some keys/values was
+ * pushed into the state
+ * - an array is empty, only WJB_BEGIN_ARRAY is pushed
+ *
+ * In both cases if instructed to create the path when not present,
+ * generate the whole chain of empty objects and insert the new value
+ * there.
+ */
+ if (!done && (op_type & JB_PATH_FILL_GAPS) && (level < path_len - 1))
+ {
+ if (idx > 0)
+ push_null_elements(st, idx - nelems);
+
+ (void) push_path(st, level, path_elems, path_nulls,
+ path_len, newval);
+
+ /* Result is closed with WJB_END_OBJECT outside of this function */
+ }
+}
+
+/*
+ * Parse information about what elements of a jsonb document we want to iterate
+ * in functions iterate_json(b)_values. This information is presented in jsonb
+ * format, so that it can be easily extended in the future.
+ */
+uint32
+parse_jsonb_index_flags(Jsonb *jb)
+{
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken type;
+ uint32 flags = 0;
+
+ it = JsonbIteratorInit(&jb->root);
+
+ type = JsonbIteratorNext(&it, &v, false);
+
+ /*
+ * We iterate over array (scalar internally is represented as array, so,
+ * we will accept it too) to check all its elements. Flag names are
+ * chosen the same as jsonb_typeof uses.
+ */
+ if (type != WJB_BEGIN_ARRAY)
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("wrong flag type, only arrays and scalars are allowed")));
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) == WJB_ELEM)
+ {
+ if (v.type != jbvString)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("flag array element is not a string"),
+ errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\".")));
+
+ if (v.val.string.len == 3 &&
+ pg_strncasecmp(v.val.string.val, "all", 3) == 0)
+ flags |= jtiAll;
+ else if (v.val.string.len == 3 &&
+ pg_strncasecmp(v.val.string.val, "key", 3) == 0)
+ flags |= jtiKey;
+ else if (v.val.string.len == 6 &&
+ pg_strncasecmp(v.val.string.val, "string", 6) == 0)
+ flags |= jtiString;
+ else if (v.val.string.len == 7 &&
+ pg_strncasecmp(v.val.string.val, "numeric", 7) == 0)
+ flags |= jtiNumeric;
+ else if (v.val.string.len == 7 &&
+ pg_strncasecmp(v.val.string.val, "boolean", 7) == 0)
+ flags |= jtiBool;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("wrong flag in flag array: \"%s\"",
+ pnstrdup(v.val.string.val, v.val.string.len)),
+ errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\".")));
+ }
+
+ /* expect end of array now */
+ if (type != WJB_END_ARRAY)
+ elog(ERROR, "unexpected end of flag array");
+
+ /* get final WJB_DONE and free iterator */
+ type = JsonbIteratorNext(&it, &v, false);
+ if (type != WJB_DONE)
+ elog(ERROR, "unexpected end of flag array");
+
+ return flags;
+}
+
+/*
+ * Iterate over jsonb values or elements, specified by flags, and pass them
+ * together with an iteration state to a specified JsonIterateStringValuesAction.
+ */
+void
+iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state,
+ JsonIterateStringValuesAction action)
+{
+ JsonbIterator *it;
+ JsonbValue v;
+ JsonbIteratorToken type;
+
+ it = JsonbIteratorInit(&jb->root);
+
+ /*
+ * Just recursively iterating over jsonb and call callback on all
+ * corresponding elements
+ */
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ if (type == WJB_KEY)
+ {
+ if (flags & jtiKey)
+ action(state, v.val.string.val, v.val.string.len);
+
+ continue;
+ }
+ else if (!(type == WJB_VALUE || type == WJB_ELEM))
+ {
+ /* do not call callback for composite JsonbValue */
+ continue;
+ }
+
+ /* JsonbValue is a value of object or element of array */
+ switch (v.type)
+ {
+ case jbvString:
+ if (flags & jtiString)
+ action(state, v.val.string.val, v.val.string.len);
+ break;
+ case jbvNumeric:
+ if (flags & jtiNumeric)
+ {
+ char *val;
+
+ val = DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(v.val.numeric)));
+
+ action(state, val, strlen(val));
+ pfree(val);
+ }
+ break;
+ case jbvBool:
+ if (flags & jtiBool)
+ {
+ if (v.val.boolean)
+ action(state, "true", 4);
+ else
+ action(state, "false", 5);
+ }
+ break;
+ default:
+ /* do not call callback for composite JsonbValue */
+ break;
+ }
+ }
+}
+
+/*
+ * Iterate over json values and elements, specified by flags, and pass them
+ * together with an iteration state to a specified JsonIterateStringValuesAction.
+ */
+void
+iterate_json_values(text *json, uint32 flags, void *action_state,
+ JsonIterateStringValuesAction action)
+{
+ JsonLexContext *lex = makeJsonLexContext(json, true);
+ JsonSemAction *sem = palloc0(sizeof(JsonSemAction));
+ IterateJsonStringValuesState *state = palloc0(sizeof(IterateJsonStringValuesState));
+
+ state->lex = lex;
+ state->action = action;
+ state->action_state = action_state;
+ state->flags = flags;
+
+ sem->semstate = (void *) state;
+ sem->scalar = iterate_values_scalar;
+ sem->object_field_start = iterate_values_object_field_start;
+
+ pg_parse_json_or_ereport(lex, sem);
+}
+
+/*
+ * An auxiliary function for iterate_json_values to invoke a specified
+ * JsonIterateStringValuesAction for specified values.
+ */
+static void
+iterate_values_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ IterateJsonStringValuesState *_state = (IterateJsonStringValuesState *) state;
+
+ switch (tokentype)
+ {
+ case JSON_TOKEN_STRING:
+ if (_state->flags & jtiString)
+ _state->action(_state->action_state, token, strlen(token));
+ break;
+ case JSON_TOKEN_NUMBER:
+ if (_state->flags & jtiNumeric)
+ _state->action(_state->action_state, token, strlen(token));
+ break;
+ case JSON_TOKEN_TRUE:
+ case JSON_TOKEN_FALSE:
+ if (_state->flags & jtiBool)
+ _state->action(_state->action_state, token, strlen(token));
+ break;
+ default:
+ /* do not call callback for any other token */
+ break;
+ }
+}
+
+static void
+iterate_values_object_field_start(void *state, char *fname, bool isnull)
+{
+ IterateJsonStringValuesState *_state = (IterateJsonStringValuesState *) state;
+
+ if (_state->flags & jtiKey)
+ {
+ char *val = pstrdup(fname);
+
+ _state->action(_state->action_state, val, strlen(val));
+ }
+}
+
+/*
+ * Iterate over a jsonb, and apply a specified JsonTransformStringValuesAction
+ * to every string value or element. Any necessary context for a
+ * JsonTransformStringValuesAction can be passed in the action_state variable.
+ * Function returns a copy of an original jsonb object with transformed values.
+ */
+Jsonb *
+transform_jsonb_string_values(Jsonb *jsonb, void *action_state,
+ JsonTransformStringValuesAction transform_action)
+{
+ JsonbIterator *it;
+ JsonbValue v,
+ *res = NULL;
+ JsonbIteratorToken type;
+ JsonbParseState *st = NULL;
+ text *out;
+ bool is_scalar = false;
+
+ it = JsonbIteratorInit(&jsonb->root);
+ is_scalar = it->isScalar;
+
+ while ((type = JsonbIteratorNext(&it, &v, false)) != WJB_DONE)
+ {
+ if ((type == WJB_VALUE || type == WJB_ELEM) && v.type == jbvString)
+ {
+ out = transform_action(action_state, v.val.string.val, v.val.string.len);
+ /* out is probably not toasted, but let's be sure */
+ out = pg_detoast_datum_packed(out);
+ v.val.string.val = VARDATA_ANY(out);
+ v.val.string.len = VARSIZE_ANY_EXHDR(out);
+ res = pushJsonbValue(&st, type, type < WJB_BEGIN_ARRAY ? &v : NULL);
+ }
+ else
+ {
+ res = pushJsonbValue(&st, type, (type == WJB_KEY ||
+ type == WJB_VALUE ||
+ type == WJB_ELEM) ? &v : NULL);
+ }
+ }
+
+ if (res->type == jbvArray)
+ res->val.array.rawScalar = is_scalar;
+
+ return JsonbValueToJsonb(res);
+}
+
+/*
+ * Iterate over a json, and apply a specified JsonTransformStringValuesAction
+ * to every string value or element. Any necessary context for a
+ * JsonTransformStringValuesAction can be passed in the action_state variable.
+ * Function returns a StringInfo, which is a copy of an original json with
+ * transformed values.
+ */
+text *
+transform_json_string_values(text *json, void *action_state,
+ JsonTransformStringValuesAction transform_action)
+{
+ JsonLexContext *lex = makeJsonLexContext(json, true);
+ JsonSemAction *sem = palloc0(sizeof(JsonSemAction));
+ TransformJsonStringValuesState *state = palloc0(sizeof(TransformJsonStringValuesState));
+
+ state->lex = lex;
+ state->strval = makeStringInfo();
+ state->action = transform_action;
+ state->action_state = action_state;
+
+ sem->semstate = (void *) state;
+ sem->scalar = transform_string_values_scalar;
+ sem->object_start = transform_string_values_object_start;
+ sem->object_end = transform_string_values_object_end;
+ sem->array_start = transform_string_values_array_start;
+ sem->array_end = transform_string_values_array_end;
+ sem->scalar = transform_string_values_scalar;
+ sem->array_element_start = transform_string_values_array_element_start;
+ sem->object_field_start = transform_string_values_object_field_start;
+
+ pg_parse_json_or_ereport(lex, sem);
+
+ return cstring_to_text_with_len(state->strval->data, state->strval->len);
+}
+
+/*
+ * Set of auxiliary functions for transform_json_string_values to invoke a
+ * specified JsonTransformStringValuesAction for all values and left everything
+ * else untouched.
+ */
+static void
+transform_string_values_object_start(void *state)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '{');
+}
+
+static void
+transform_string_values_object_end(void *state)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '}');
+}
+
+static void
+transform_string_values_array_start(void *state)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ appendStringInfoCharMacro(_state->strval, '[');
+}
+
+static void
+transform_string_values_array_end(void *state)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ appendStringInfoCharMacro(_state->strval, ']');
+}
+
+static void
+transform_string_values_object_field_start(void *state, char *fname, bool isnull)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ if (_state->strval->data[_state->strval->len - 1] != '{')
+ appendStringInfoCharMacro(_state->strval, ',');
+
+ /*
+ * Unfortunately we don't have the quoted and escaped string any more, so
+ * we have to re-escape it.
+ */
+ escape_json(_state->strval, fname);
+ appendStringInfoCharMacro(_state->strval, ':');
+}
+
+static void
+transform_string_values_array_element_start(void *state, bool isnull)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ if (_state->strval->data[_state->strval->len - 1] != '[')
+ appendStringInfoCharMacro(_state->strval, ',');
+}
+
+static void
+transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
+
+ if (tokentype == JSON_TOKEN_STRING)
+ {
+ text *out = _state->action(_state->action_state, token, strlen(token));
+
+ escape_json(_state->strval, text_to_cstring(out));
+ }
+ else
+ appendStringInfoString(_state->strval, token);
+}
diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c
new file mode 100644
index 0000000..f921044
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath.c
@@ -0,0 +1,1080 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath.c
+ * Input/output and supporting routines for jsonpath
+ *
+ * jsonpath expression is a chain of path items. First path item is $, $var,
+ * literal or arithmetic expression. Subsequent path items are accessors
+ * (.key, .*, [subscripts], [*]), filters (? (predicate)) and methods (.type(),
+ * .size() etc).
+ *
+ * For instance, structure of path items for simple expression:
+ *
+ * $.a[*].type()
+ *
+ * is pretty evident:
+ *
+ * $ => .a => [*] => .type()
+ *
+ * Some path items such as arithmetic operations, predicates or array
+ * subscripts may comprise subtrees. For instance, more complex expression
+ *
+ * ($.a + $[1 to 5, 7] ? (@ > 3).double()).type()
+ *
+ * have following structure of path items:
+ *
+ * + => .type()
+ * ___/ \___
+ * / \
+ * $ => .a $ => [] => ? => .double()
+ * _||_ |
+ * / \ >
+ * to to / \
+ * / \ / @ 3
+ * 1 5 7
+ *
+ * Binary encoding of jsonpath constitutes a sequence of 4-bytes aligned
+ * variable-length path items connected by links. Every item has a header
+ * consisting of item type (enum JsonPathItemType) and offset of next item
+ * (zero means no next item). After the header, item may have payload
+ * depending on item type. For instance, payload of '.key' accessor item is
+ * length of key name and key name itself. Payload of '>' arithmetic operator
+ * item is offsets of right and left operands.
+ *
+ * So, binary representation of sample expression above is:
+ * (bottom arrows are next links, top lines are argument links)
+ *
+ * _____
+ * _____ ___/____ \ __
+ * _ /_ \ _____/__/____ \ \ __ _ /_ \
+ * / / \ \ / / / \ \ \ / \ / / \ \
+ * +(LR) $ .a $ [](* to *, * to *) 1 5 7 ?(A) >(LR) @ 3 .double() .type()
+ * | | ^ | ^| ^| ^ ^
+ * | |__| |__||________________________||___________________| |
+ * |_______________________________________________________________________|
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "funcapi.h"
+#include "lib/stringinfo.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/json.h"
+#include "utils/jsonpath.h"
+
+
+static Datum jsonPathFromCstring(char *in, int len);
+static char *jsonPathToCstring(StringInfo out, JsonPath *in,
+ int estimated_len);
+static int flattenJsonPathParseItem(StringInfo buf, JsonPathParseItem *item,
+ int nestingLevel, bool insideArraySubscript);
+static void alignStringInfoInt(StringInfo buf);
+static int32 reserveSpaceForItemPointer(StringInfo buf);
+static void printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
+ bool printBracketes);
+static int operationPriority(JsonPathItemType op);
+
+
+/**************************** INPUT/OUTPUT ********************************/
+
+/*
+ * jsonpath type input function
+ */
+Datum
+jsonpath_in(PG_FUNCTION_ARGS)
+{
+ char *in = PG_GETARG_CSTRING(0);
+ int len = strlen(in);
+
+ return jsonPathFromCstring(in, len);
+}
+
+/*
+ * jsonpath type recv function
+ *
+ * The type is sent as text in binary mode, so this is almost the same
+ * as the input function, but it's prefixed with a version number so we
+ * can change the binary format sent in future if necessary. For now,
+ * only version 1 is supported.
+ */
+Datum
+jsonpath_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ int version = pq_getmsgint(buf, 1);
+ char *str;
+ int nbytes;
+
+ if (version == JSONPATH_VERSION)
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ else
+ elog(ERROR, "unsupported jsonpath version number: %d", version);
+
+ return jsonPathFromCstring(str, nbytes);
+}
+
+/*
+ * jsonpath type output function
+ */
+Datum
+jsonpath_out(PG_FUNCTION_ARGS)
+{
+ JsonPath *in = PG_GETARG_JSONPATH_P(0);
+
+ PG_RETURN_CSTRING(jsonPathToCstring(NULL, in, VARSIZE(in)));
+}
+
+/*
+ * jsonpath type send function
+ *
+ * Just send jsonpath as a version number, then a string of text
+ */
+Datum
+jsonpath_send(PG_FUNCTION_ARGS)
+{
+ JsonPath *in = PG_GETARG_JSONPATH_P(0);
+ StringInfoData buf;
+ StringInfoData jtext;
+ int version = JSONPATH_VERSION;
+
+ initStringInfo(&jtext);
+ (void) jsonPathToCstring(&jtext, in, VARSIZE(in));
+
+ pq_begintypsend(&buf);
+ pq_sendint8(&buf, version);
+ pq_sendtext(&buf, jtext.data, jtext.len);
+ pfree(jtext.data);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * Converts C-string to a jsonpath value.
+ *
+ * Uses jsonpath parser to turn string into an AST, then
+ * flattenJsonPathParseItem() does second pass turning AST into binary
+ * representation of jsonpath.
+ */
+static Datum
+jsonPathFromCstring(char *in, int len)
+{
+ JsonPathParseResult *jsonpath = parsejsonpath(in, len);
+ JsonPath *res;
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+ enlargeStringInfo(&buf, 4 * len /* estimation */ );
+
+ appendStringInfoSpaces(&buf, JSONPATH_HDRSZ);
+
+ if (!jsonpath)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "jsonpath",
+ in)));
+
+ flattenJsonPathParseItem(&buf, jsonpath->expr, 0, false);
+
+ res = (JsonPath *) buf.data;
+ SET_VARSIZE(res, buf.len);
+ res->header = JSONPATH_VERSION;
+ if (jsonpath->lax)
+ res->header |= JSONPATH_LAX;
+
+ PG_RETURN_JSONPATH_P(res);
+}
+
+/*
+ * Converts jsonpath value to a C-string.
+ *
+ * If 'out' argument is non-null, the resulting C-string is stored inside the
+ * StringBuffer. The resulting string is always returned.
+ */
+static char *
+jsonPathToCstring(StringInfo out, JsonPath *in, int estimated_len)
+{
+ StringInfoData buf;
+ JsonPathItem v;
+
+ if (!out)
+ {
+ out = &buf;
+ initStringInfo(out);
+ }
+ enlargeStringInfo(out, estimated_len);
+
+ if (!(in->header & JSONPATH_LAX))
+ appendBinaryStringInfo(out, "strict ", 7);
+
+ jspInit(&v, in);
+ printJsonPathItem(out, &v, false, true);
+
+ return out->data;
+}
+
+/*
+ * Recursive function converting given jsonpath parse item and all its
+ * children into a binary representation.
+ */
+static int
+flattenJsonPathParseItem(StringInfo buf, JsonPathParseItem *item,
+ int nestingLevel, bool insideArraySubscript)
+{
+ /* position from beginning of jsonpath data */
+ int32 pos = buf->len - JSONPATH_HDRSZ;
+ int32 chld;
+ int32 next;
+ int argNestingLevel = 0;
+
+ check_stack_depth();
+ CHECK_FOR_INTERRUPTS();
+
+ appendStringInfoChar(buf, (char) (item->type));
+
+ /*
+ * We align buffer to int32 because a series of int32 values often goes
+ * after the header, and we want to read them directly by dereferencing
+ * int32 pointer (see jspInitByBuffer()).
+ */
+ alignStringInfoInt(buf);
+
+ /*
+ * Reserve space for next item pointer. Actual value will be recorded
+ * later, after next and children items processing.
+ */
+ next = reserveSpaceForItemPointer(buf);
+
+ switch (item->type)
+ {
+ case jpiString:
+ case jpiVariable:
+ case jpiKey:
+ appendBinaryStringInfo(buf, (char *) &item->value.string.len,
+ sizeof(item->value.string.len));
+ appendBinaryStringInfo(buf, item->value.string.val,
+ item->value.string.len);
+ appendStringInfoChar(buf, '\0');
+ break;
+ case jpiNumeric:
+ appendBinaryStringInfo(buf, (char *) item->value.numeric,
+ VARSIZE(item->value.numeric));
+ break;
+ case jpiBool:
+ appendBinaryStringInfo(buf, (char *) &item->value.boolean,
+ sizeof(item->value.boolean));
+ break;
+ case jpiAnd:
+ case jpiOr:
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ case jpiAdd:
+ case jpiSub:
+ case jpiMul:
+ case jpiDiv:
+ case jpiMod:
+ case jpiStartsWith:
+ {
+ /*
+ * First, reserve place for left/right arg's positions, then
+ * record both args and sets actual position in reserved
+ * places.
+ */
+ int32 left = reserveSpaceForItemPointer(buf);
+ int32 right = reserveSpaceForItemPointer(buf);
+
+ chld = !item->value.args.left ? pos :
+ flattenJsonPathParseItem(buf, item->value.args.left,
+ nestingLevel + argNestingLevel,
+ insideArraySubscript);
+ *(int32 *) (buf->data + left) = chld - pos;
+
+ chld = !item->value.args.right ? pos :
+ flattenJsonPathParseItem(buf, item->value.args.right,
+ nestingLevel + argNestingLevel,
+ insideArraySubscript);
+ *(int32 *) (buf->data + right) = chld - pos;
+ }
+ break;
+ case jpiLikeRegex:
+ {
+ int32 offs;
+
+ appendBinaryStringInfo(buf,
+ (char *) &item->value.like_regex.flags,
+ sizeof(item->value.like_regex.flags));
+ offs = reserveSpaceForItemPointer(buf);
+ appendBinaryStringInfo(buf,
+ (char *) &item->value.like_regex.patternlen,
+ sizeof(item->value.like_regex.patternlen));
+ appendBinaryStringInfo(buf, item->value.like_regex.pattern,
+ item->value.like_regex.patternlen);
+ appendStringInfoChar(buf, '\0');
+
+ chld = flattenJsonPathParseItem(buf, item->value.like_regex.expr,
+ nestingLevel,
+ insideArraySubscript);
+ *(int32 *) (buf->data + offs) = chld - pos;
+ }
+ break;
+ case jpiFilter:
+ argNestingLevel++;
+ /* FALLTHROUGH */
+ case jpiIsUnknown:
+ case jpiNot:
+ case jpiPlus:
+ case jpiMinus:
+ case jpiExists:
+ case jpiDatetime:
+ {
+ int32 arg = reserveSpaceForItemPointer(buf);
+
+ chld = !item->value.arg ? pos :
+ flattenJsonPathParseItem(buf, item->value.arg,
+ nestingLevel + argNestingLevel,
+ insideArraySubscript);
+ *(int32 *) (buf->data + arg) = chld - pos;
+ }
+ break;
+ case jpiNull:
+ break;
+ case jpiRoot:
+ break;
+ case jpiAnyArray:
+ case jpiAnyKey:
+ break;
+ case jpiCurrent:
+ if (nestingLevel <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("@ is not allowed in root expressions")));
+ break;
+ case jpiLast:
+ if (!insideArraySubscript)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("LAST is allowed only in array subscripts")));
+ break;
+ case jpiIndexArray:
+ {
+ int32 nelems = item->value.array.nelems;
+ int offset;
+ int i;
+
+ appendBinaryStringInfo(buf, (char *) &nelems, sizeof(nelems));
+
+ offset = buf->len;
+
+ appendStringInfoSpaces(buf, sizeof(int32) * 2 * nelems);
+
+ for (i = 0; i < nelems; i++)
+ {
+ int32 *ppos;
+ int32 topos;
+ int32 frompos =
+ flattenJsonPathParseItem(buf,
+ item->value.array.elems[i].from,
+ nestingLevel, true) - pos;
+
+ if (item->value.array.elems[i].to)
+ topos = flattenJsonPathParseItem(buf,
+ item->value.array.elems[i].to,
+ nestingLevel, true) - pos;
+ else
+ topos = 0;
+
+ ppos = (int32 *) &buf->data[offset + i * 2 * sizeof(int32)];
+
+ ppos[0] = frompos;
+ ppos[1] = topos;
+ }
+ }
+ break;
+ case jpiAny:
+ appendBinaryStringInfo(buf,
+ (char *) &item->value.anybounds.first,
+ sizeof(item->value.anybounds.first));
+ appendBinaryStringInfo(buf,
+ (char *) &item->value.anybounds.last,
+ sizeof(item->value.anybounds.last));
+ break;
+ case jpiType:
+ case jpiSize:
+ case jpiAbs:
+ case jpiFloor:
+ case jpiCeiling:
+ case jpiDouble:
+ case jpiKeyValue:
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonpath item type: %d", item->type);
+ }
+
+ if (item->next)
+ {
+ chld = flattenJsonPathParseItem(buf, item->next, nestingLevel,
+ insideArraySubscript) - pos;
+ *(int32 *) (buf->data + next) = chld;
+ }
+
+ return pos;
+}
+
+/*
+ * Align StringInfo to int by adding zero padding bytes
+ */
+static void
+alignStringInfoInt(StringInfo buf)
+{
+ switch (INTALIGN(buf->len) - buf->len)
+ {
+ case 3:
+ appendStringInfoCharMacro(buf, 0);
+ /* FALLTHROUGH */
+ case 2:
+ appendStringInfoCharMacro(buf, 0);
+ /* FALLTHROUGH */
+ case 1:
+ appendStringInfoCharMacro(buf, 0);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+}
+
+/*
+ * Reserve space for int32 JsonPathItem pointer. Now zero pointer is written,
+ * actual value will be recorded at '(int32 *) &buf->data[pos]' later.
+ */
+static int32
+reserveSpaceForItemPointer(StringInfo buf)
+{
+ int32 pos = buf->len;
+ int32 ptr = 0;
+
+ appendBinaryStringInfo(buf, (char *) &ptr, sizeof(ptr));
+
+ return pos;
+}
+
+/*
+ * Prints text representation of given jsonpath item and all its children.
+ */
+static void
+printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
+ bool printBracketes)
+{
+ JsonPathItem elem;
+ int i;
+
+ check_stack_depth();
+ CHECK_FOR_INTERRUPTS();
+
+ switch (v->type)
+ {
+ case jpiNull:
+ appendStringInfoString(buf, "null");
+ break;
+ case jpiKey:
+ if (inKey)
+ appendStringInfoChar(buf, '.');
+ escape_json(buf, jspGetString(v, NULL));
+ break;
+ case jpiString:
+ escape_json(buf, jspGetString(v, NULL));
+ break;
+ case jpiVariable:
+ appendStringInfoChar(buf, '$');
+ escape_json(buf, jspGetString(v, NULL));
+ break;
+ case jpiNumeric:
+ if (jspHasNext(v))
+ appendStringInfoChar(buf, '(');
+ appendStringInfoString(buf,
+ DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(jspGetNumeric(v)))));
+ if (jspHasNext(v))
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiBool:
+ if (jspGetBool(v))
+ appendBinaryStringInfo(buf, "true", 4);
+ else
+ appendBinaryStringInfo(buf, "false", 5);
+ break;
+ case jpiAnd:
+ case jpiOr:
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ case jpiAdd:
+ case jpiSub:
+ case jpiMul:
+ case jpiDiv:
+ case jpiMod:
+ case jpiStartsWith:
+ if (printBracketes)
+ appendStringInfoChar(buf, '(');
+ jspGetLeftArg(v, &elem);
+ printJsonPathItem(buf, &elem, false,
+ operationPriority(elem.type) <=
+ operationPriority(v->type));
+ appendStringInfoChar(buf, ' ');
+ appendStringInfoString(buf, jspOperationName(v->type));
+ appendStringInfoChar(buf, ' ');
+ jspGetRightArg(v, &elem);
+ printJsonPathItem(buf, &elem, false,
+ operationPriority(elem.type) <=
+ operationPriority(v->type));
+ if (printBracketes)
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiLikeRegex:
+ if (printBracketes)
+ appendStringInfoChar(buf, '(');
+
+ jspInitByBuffer(&elem, v->base, v->content.like_regex.expr);
+ printJsonPathItem(buf, &elem, false,
+ operationPriority(elem.type) <=
+ operationPriority(v->type));
+
+ appendBinaryStringInfo(buf, " like_regex ", 12);
+
+ escape_json(buf, v->content.like_regex.pattern);
+
+ if (v->content.like_regex.flags)
+ {
+ appendBinaryStringInfo(buf, " flag \"", 7);
+
+ if (v->content.like_regex.flags & JSP_REGEX_ICASE)
+ appendStringInfoChar(buf, 'i');
+ if (v->content.like_regex.flags & JSP_REGEX_DOTALL)
+ appendStringInfoChar(buf, 's');
+ if (v->content.like_regex.flags & JSP_REGEX_MLINE)
+ appendStringInfoChar(buf, 'm');
+ if (v->content.like_regex.flags & JSP_REGEX_WSPACE)
+ appendStringInfoChar(buf, 'x');
+ if (v->content.like_regex.flags & JSP_REGEX_QUOTE)
+ appendStringInfoChar(buf, 'q');
+
+ appendStringInfoChar(buf, '"');
+ }
+
+ if (printBracketes)
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiPlus:
+ case jpiMinus:
+ if (printBracketes)
+ appendStringInfoChar(buf, '(');
+ appendStringInfoChar(buf, v->type == jpiPlus ? '+' : '-');
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false,
+ operationPriority(elem.type) <=
+ operationPriority(v->type));
+ if (printBracketes)
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiFilter:
+ appendBinaryStringInfo(buf, "?(", 2);
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false, false);
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiNot:
+ appendBinaryStringInfo(buf, "!(", 2);
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false, false);
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiIsUnknown:
+ appendStringInfoChar(buf, '(');
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false, false);
+ appendBinaryStringInfo(buf, ") is unknown", 12);
+ break;
+ case jpiExists:
+ appendBinaryStringInfo(buf, "exists (", 8);
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false, false);
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiCurrent:
+ Assert(!inKey);
+ appendStringInfoChar(buf, '@');
+ break;
+ case jpiRoot:
+ Assert(!inKey);
+ appendStringInfoChar(buf, '$');
+ break;
+ case jpiLast:
+ appendBinaryStringInfo(buf, "last", 4);
+ break;
+ case jpiAnyArray:
+ appendBinaryStringInfo(buf, "[*]", 3);
+ break;
+ case jpiAnyKey:
+ if (inKey)
+ appendStringInfoChar(buf, '.');
+ appendStringInfoChar(buf, '*');
+ break;
+ case jpiIndexArray:
+ appendStringInfoChar(buf, '[');
+ for (i = 0; i < v->content.array.nelems; i++)
+ {
+ JsonPathItem from;
+ JsonPathItem to;
+ bool range = jspGetArraySubscript(v, &from, &to, i);
+
+ if (i)
+ appendStringInfoChar(buf, ',');
+
+ printJsonPathItem(buf, &from, false, false);
+
+ if (range)
+ {
+ appendBinaryStringInfo(buf, " to ", 4);
+ printJsonPathItem(buf, &to, false, false);
+ }
+ }
+ appendStringInfoChar(buf, ']');
+ break;
+ case jpiAny:
+ if (inKey)
+ appendStringInfoChar(buf, '.');
+
+ if (v->content.anybounds.first == 0 &&
+ v->content.anybounds.last == PG_UINT32_MAX)
+ appendBinaryStringInfo(buf, "**", 2);
+ else if (v->content.anybounds.first == v->content.anybounds.last)
+ {
+ if (v->content.anybounds.first == PG_UINT32_MAX)
+ appendStringInfoString(buf, "**{last}");
+ else
+ appendStringInfo(buf, "**{%u}",
+ v->content.anybounds.first);
+ }
+ else if (v->content.anybounds.first == PG_UINT32_MAX)
+ appendStringInfo(buf, "**{last to %u}",
+ v->content.anybounds.last);
+ else if (v->content.anybounds.last == PG_UINT32_MAX)
+ appendStringInfo(buf, "**{%u to last}",
+ v->content.anybounds.first);
+ else
+ appendStringInfo(buf, "**{%u to %u}",
+ v->content.anybounds.first,
+ v->content.anybounds.last);
+ break;
+ case jpiType:
+ appendBinaryStringInfo(buf, ".type()", 7);
+ break;
+ case jpiSize:
+ appendBinaryStringInfo(buf, ".size()", 7);
+ break;
+ case jpiAbs:
+ appendBinaryStringInfo(buf, ".abs()", 6);
+ break;
+ case jpiFloor:
+ appendBinaryStringInfo(buf, ".floor()", 8);
+ break;
+ case jpiCeiling:
+ appendBinaryStringInfo(buf, ".ceiling()", 10);
+ break;
+ case jpiDouble:
+ appendBinaryStringInfo(buf, ".double()", 9);
+ break;
+ case jpiDatetime:
+ appendBinaryStringInfo(buf, ".datetime(", 10);
+ if (v->content.arg)
+ {
+ jspGetArg(v, &elem);
+ printJsonPathItem(buf, &elem, false, false);
+ }
+ appendStringInfoChar(buf, ')');
+ break;
+ case jpiKeyValue:
+ appendBinaryStringInfo(buf, ".keyvalue()", 11);
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonpath item type: %d", v->type);
+ }
+
+ if (jspGetNext(v, &elem))
+ printJsonPathItem(buf, &elem, true, true);
+}
+
+const char *
+jspOperationName(JsonPathItemType type)
+{
+ switch (type)
+ {
+ case jpiAnd:
+ return "&&";
+ case jpiOr:
+ return "||";
+ case jpiEqual:
+ return "==";
+ case jpiNotEqual:
+ return "!=";
+ case jpiLess:
+ return "<";
+ case jpiGreater:
+ return ">";
+ case jpiLessOrEqual:
+ return "<=";
+ case jpiGreaterOrEqual:
+ return ">=";
+ case jpiPlus:
+ case jpiAdd:
+ return "+";
+ case jpiMinus:
+ case jpiSub:
+ return "-";
+ case jpiMul:
+ return "*";
+ case jpiDiv:
+ return "/";
+ case jpiMod:
+ return "%";
+ case jpiStartsWith:
+ return "starts with";
+ case jpiLikeRegex:
+ return "like_regex";
+ case jpiType:
+ return "type";
+ case jpiSize:
+ return "size";
+ case jpiKeyValue:
+ return "keyvalue";
+ case jpiDouble:
+ return "double";
+ case jpiAbs:
+ return "abs";
+ case jpiFloor:
+ return "floor";
+ case jpiCeiling:
+ return "ceiling";
+ case jpiDatetime:
+ return "datetime";
+ default:
+ elog(ERROR, "unrecognized jsonpath item type: %d", type);
+ return NULL;
+ }
+}
+
+static int
+operationPriority(JsonPathItemType op)
+{
+ switch (op)
+ {
+ case jpiOr:
+ return 0;
+ case jpiAnd:
+ return 1;
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ case jpiStartsWith:
+ return 2;
+ case jpiAdd:
+ case jpiSub:
+ return 3;
+ case jpiMul:
+ case jpiDiv:
+ case jpiMod:
+ return 4;
+ case jpiPlus:
+ case jpiMinus:
+ return 5;
+ default:
+ return 6;
+ }
+}
+
+/******************* Support functions for JsonPath *************************/
+
+/*
+ * Support macros to read stored values
+ */
+
+#define read_byte(v, b, p) do { \
+ (v) = *(uint8*)((b) + (p)); \
+ (p) += 1; \
+} while(0) \
+
+#define read_int32(v, b, p) do { \
+ (v) = *(uint32*)((b) + (p)); \
+ (p) += sizeof(int32); \
+} while(0) \
+
+#define read_int32_n(v, b, p, n) do { \
+ (v) = (void *)((b) + (p)); \
+ (p) += sizeof(int32) * (n); \
+} while(0) \
+
+/*
+ * Read root node and fill root node representation
+ */
+void
+jspInit(JsonPathItem *v, JsonPath *js)
+{
+ Assert((js->header & ~JSONPATH_LAX) == JSONPATH_VERSION);
+ jspInitByBuffer(v, js->data, 0);
+}
+
+/*
+ * Read node from buffer and fill its representation
+ */
+void
+jspInitByBuffer(JsonPathItem *v, char *base, int32 pos)
+{
+ v->base = base + pos;
+
+ read_byte(v->type, base, pos);
+ pos = INTALIGN((uintptr_t) (base + pos)) - (uintptr_t) base;
+ read_int32(v->nextPos, base, pos);
+
+ switch (v->type)
+ {
+ case jpiNull:
+ case jpiRoot:
+ case jpiCurrent:
+ case jpiAnyArray:
+ case jpiAnyKey:
+ case jpiType:
+ case jpiSize:
+ case jpiAbs:
+ case jpiFloor:
+ case jpiCeiling:
+ case jpiDouble:
+ case jpiKeyValue:
+ case jpiLast:
+ break;
+ case jpiKey:
+ case jpiString:
+ case jpiVariable:
+ read_int32(v->content.value.datalen, base, pos);
+ /* FALLTHROUGH */
+ case jpiNumeric:
+ case jpiBool:
+ v->content.value.data = base + pos;
+ break;
+ case jpiAnd:
+ case jpiOr:
+ case jpiAdd:
+ case jpiSub:
+ case jpiMul:
+ case jpiDiv:
+ case jpiMod:
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ case jpiStartsWith:
+ read_int32(v->content.args.left, base, pos);
+ read_int32(v->content.args.right, base, pos);
+ break;
+ case jpiLikeRegex:
+ read_int32(v->content.like_regex.flags, base, pos);
+ read_int32(v->content.like_regex.expr, base, pos);
+ read_int32(v->content.like_regex.patternlen, base, pos);
+ v->content.like_regex.pattern = base + pos;
+ break;
+ case jpiNot:
+ case jpiExists:
+ case jpiIsUnknown:
+ case jpiPlus:
+ case jpiMinus:
+ case jpiFilter:
+ case jpiDatetime:
+ read_int32(v->content.arg, base, pos);
+ break;
+ case jpiIndexArray:
+ read_int32(v->content.array.nelems, base, pos);
+ read_int32_n(v->content.array.elems, base, pos,
+ v->content.array.nelems * 2);
+ break;
+ case jpiAny:
+ read_int32(v->content.anybounds.first, base, pos);
+ read_int32(v->content.anybounds.last, base, pos);
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonpath item type: %d", v->type);
+ }
+}
+
+void
+jspGetArg(JsonPathItem *v, JsonPathItem *a)
+{
+ Assert(v->type == jpiFilter ||
+ v->type == jpiNot ||
+ v->type == jpiIsUnknown ||
+ v->type == jpiExists ||
+ v->type == jpiPlus ||
+ v->type == jpiMinus ||
+ v->type == jpiDatetime);
+
+ jspInitByBuffer(a, v->base, v->content.arg);
+}
+
+bool
+jspGetNext(JsonPathItem *v, JsonPathItem *a)
+{
+ if (jspHasNext(v))
+ {
+ Assert(v->type == jpiString ||
+ v->type == jpiNumeric ||
+ v->type == jpiBool ||
+ v->type == jpiNull ||
+ v->type == jpiKey ||
+ v->type == jpiAny ||
+ v->type == jpiAnyArray ||
+ v->type == jpiAnyKey ||
+ v->type == jpiIndexArray ||
+ v->type == jpiFilter ||
+ v->type == jpiCurrent ||
+ v->type == jpiExists ||
+ v->type == jpiRoot ||
+ v->type == jpiVariable ||
+ v->type == jpiLast ||
+ v->type == jpiAdd ||
+ v->type == jpiSub ||
+ v->type == jpiMul ||
+ v->type == jpiDiv ||
+ v->type == jpiMod ||
+ v->type == jpiPlus ||
+ v->type == jpiMinus ||
+ v->type == jpiEqual ||
+ v->type == jpiNotEqual ||
+ v->type == jpiGreater ||
+ v->type == jpiGreaterOrEqual ||
+ v->type == jpiLess ||
+ v->type == jpiLessOrEqual ||
+ v->type == jpiAnd ||
+ v->type == jpiOr ||
+ v->type == jpiNot ||
+ v->type == jpiIsUnknown ||
+ v->type == jpiType ||
+ v->type == jpiSize ||
+ v->type == jpiAbs ||
+ v->type == jpiFloor ||
+ v->type == jpiCeiling ||
+ v->type == jpiDouble ||
+ v->type == jpiDatetime ||
+ v->type == jpiKeyValue ||
+ v->type == jpiStartsWith ||
+ v->type == jpiLikeRegex);
+
+ if (a)
+ jspInitByBuffer(a, v->base, v->nextPos);
+ return true;
+ }
+
+ return false;
+}
+
+void
+jspGetLeftArg(JsonPathItem *v, JsonPathItem *a)
+{
+ Assert(v->type == jpiAnd ||
+ v->type == jpiOr ||
+ v->type == jpiEqual ||
+ v->type == jpiNotEqual ||
+ v->type == jpiLess ||
+ v->type == jpiGreater ||
+ v->type == jpiLessOrEqual ||
+ v->type == jpiGreaterOrEqual ||
+ v->type == jpiAdd ||
+ v->type == jpiSub ||
+ v->type == jpiMul ||
+ v->type == jpiDiv ||
+ v->type == jpiMod ||
+ v->type == jpiStartsWith);
+
+ jspInitByBuffer(a, v->base, v->content.args.left);
+}
+
+void
+jspGetRightArg(JsonPathItem *v, JsonPathItem *a)
+{
+ Assert(v->type == jpiAnd ||
+ v->type == jpiOr ||
+ v->type == jpiEqual ||
+ v->type == jpiNotEqual ||
+ v->type == jpiLess ||
+ v->type == jpiGreater ||
+ v->type == jpiLessOrEqual ||
+ v->type == jpiGreaterOrEqual ||
+ v->type == jpiAdd ||
+ v->type == jpiSub ||
+ v->type == jpiMul ||
+ v->type == jpiDiv ||
+ v->type == jpiMod ||
+ v->type == jpiStartsWith);
+
+ jspInitByBuffer(a, v->base, v->content.args.right);
+}
+
+bool
+jspGetBool(JsonPathItem *v)
+{
+ Assert(v->type == jpiBool);
+
+ return (bool) *v->content.value.data;
+}
+
+Numeric
+jspGetNumeric(JsonPathItem *v)
+{
+ Assert(v->type == jpiNumeric);
+
+ return (Numeric) v->content.value.data;
+}
+
+char *
+jspGetString(JsonPathItem *v, int32 *len)
+{
+ Assert(v->type == jpiKey ||
+ v->type == jpiString ||
+ v->type == jpiVariable);
+
+ if (len)
+ *len = v->content.value.datalen;
+ return v->content.value.data;
+}
+
+bool
+jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to,
+ int i)
+{
+ Assert(v->type == jpiIndexArray);
+
+ jspInitByBuffer(from, v->base, v->content.array.elems[i].from);
+
+ if (!v->content.array.elems[i].to)
+ return false;
+
+ jspInitByBuffer(to, v->base, v->content.array.elems[i].to);
+
+ return true;
+}
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
new file mode 100644
index 0000000..c8368ea
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -0,0 +1,2812 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_exec.c
+ * Routines for SQL/JSON path execution.
+ *
+ * Jsonpath is executed in the global context stored in JsonPathExecContext,
+ * which is passed to almost every function involved into execution. Entry
+ * point for jsonpath execution is executeJsonPath() function, which
+ * initializes execution context including initial JsonPathItem and JsonbValue,
+ * flags, stack for calculation of @ in filters.
+ *
+ * The result of jsonpath query execution is enum JsonPathExecResult and
+ * if succeeded sequence of JsonbValue, written to JsonValueList *found, which
+ * is passed through the jsonpath items. When found == NULL, we're inside
+ * exists-query and we're interested only in whether result is empty. In this
+ * case execution is stopped once first result item is found, and the only
+ * execution result is JsonPathExecResult. The values of JsonPathExecResult
+ * are following:
+ * - jperOk -- result sequence is not empty
+ * - jperNotFound -- result sequence is empty
+ * - jperError -- error occurred during execution
+ *
+ * Jsonpath is executed recursively (see executeItem()) starting form the
+ * first path item (which in turn might be, for instance, an arithmetic
+ * expression evaluated separately). On each step single JsonbValue obtained
+ * from previous path item is processed. The result of processing is a
+ * sequence of JsonbValue (probably empty), which is passed to the next path
+ * item one by one. When there is no next path item, then JsonbValue is added
+ * to the 'found' list. When found == NULL, then execution functions just
+ * return jperOk (see executeNextItem()).
+ *
+ * Many of jsonpath operations require automatic unwrapping of arrays in lax
+ * mode. So, if input value is array, then corresponding operation is
+ * processed not on array itself, but on all of its members one by one.
+ * executeItemOptUnwrapTarget() function have 'unwrap' argument, which indicates
+ * whether unwrapping of array is needed. When unwrap == true, each of array
+ * members is passed to executeItemOptUnwrapTarget() again but with unwrap == false
+ * in order to avoid subsequent array unwrapping.
+ *
+ * All boolean expressions (predicates) are evaluated by executeBoolItem()
+ * function, which returns tri-state JsonPathBool. When error is occurred
+ * during predicate execution, it returns jpbUnknown. According to standard
+ * predicates can be only inside filters. But we support their usage as
+ * jsonpath expression. This helps us to implement @@ operator. In this case
+ * resulting JsonPathBool is transformed into jsonb bool or null.
+ *
+ * Arithmetic and boolean expression are evaluated recursively from expression
+ * tree top down to the leaves. Therefore, for binary arithmetic expressions
+ * we calculate operands first. Then we check that results are numeric
+ * singleton lists, calculate the result and pass it to the next path item.
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath_exec.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "regex/regex.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/datum.h"
+#include "utils/float.h"
+#include "utils/formatting.h"
+#include "utils/guc.h"
+#include "utils/json.h"
+#include "utils/jsonpath.h"
+#include "utils/timestamp.h"
+#include "utils/varlena.h"
+
+/*
+ * Represents "base object" and it's "id" for .keyvalue() evaluation.
+ */
+typedef struct JsonBaseObjectInfo
+{
+ JsonbContainer *jbc;
+ int id;
+} JsonBaseObjectInfo;
+
+/*
+ * Context of jsonpath execution.
+ */
+typedef struct JsonPathExecContext
+{
+ Jsonb *vars; /* variables to substitute into jsonpath */
+ JsonbValue *root; /* for $ evaluation */
+ JsonbValue *current; /* for @ evaluation */
+ JsonBaseObjectInfo baseObject; /* "base object" for .keyvalue()
+ * evaluation */
+ int lastGeneratedObjectId; /* "id" counter for .keyvalue()
+ * evaluation */
+ int innermostArraySize; /* for LAST array index evaluation */
+ bool laxMode; /* true for "lax" mode, false for "strict"
+ * mode */
+ bool ignoreStructuralErrors; /* with "true" structural errors such
+ * as absence of required json item or
+ * unexpected json item type are
+ * ignored */
+ bool throwErrors; /* with "false" all suppressible errors are
+ * suppressed */
+ bool useTz;
+} JsonPathExecContext;
+
+/* Context for LIKE_REGEX execution. */
+typedef struct JsonLikeRegexContext
+{
+ text *regex;
+ int cflags;
+} JsonLikeRegexContext;
+
+/* Result of jsonpath predicate evaluation */
+typedef enum JsonPathBool
+{
+ jpbFalse = 0,
+ jpbTrue = 1,
+ jpbUnknown = 2
+} JsonPathBool;
+
+/* Result of jsonpath expression evaluation */
+typedef enum JsonPathExecResult
+{
+ jperOk = 0,
+ jperNotFound = 1,
+ jperError = 2
+} JsonPathExecResult;
+
+#define jperIsError(jper) ((jper) == jperError)
+
+/*
+ * List of jsonb values with shortcut for single-value list.
+ */
+typedef struct JsonValueList
+{
+ JsonbValue *singleton;
+ List *list;
+} JsonValueList;
+
+typedef struct JsonValueListIterator
+{
+ JsonbValue *value;
+ List *list;
+ ListCell *next;
+} JsonValueListIterator;
+
+/* strict/lax flags is decomposed into four [un]wrap/error flags */
+#define jspStrictAbsenseOfErrors(cxt) (!(cxt)->laxMode)
+#define jspAutoUnwrap(cxt) ((cxt)->laxMode)
+#define jspAutoWrap(cxt) ((cxt)->laxMode)
+#define jspIgnoreStructuralErrors(cxt) ((cxt)->ignoreStructuralErrors)
+#define jspThrowErrors(cxt) ((cxt)->throwErrors)
+
+/* Convenience macro: return or throw error depending on context */
+#define RETURN_ERROR(throw_error) \
+do { \
+ if (jspThrowErrors(cxt)) \
+ throw_error; \
+ else \
+ return jperError; \
+} while (0)
+
+typedef JsonPathBool (*JsonPathPredicateCallback) (JsonPathItem *jsp,
+ JsonbValue *larg,
+ JsonbValue *rarg,
+ void *param);
+typedef Numeric (*BinaryArithmFunc) (Numeric num1, Numeric num2, bool *error);
+
+static JsonPathExecResult executeJsonPath(JsonPath *path, Jsonb *vars,
+ Jsonb *json, bool throwErrors,
+ JsonValueList *result, bool useTz);
+static JsonPathExecResult executeItem(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, JsonValueList *found);
+static JsonPathExecResult executeItemOptUnwrapTarget(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb,
+ JsonValueList *found, bool unwrap);
+static JsonPathExecResult executeItemUnwrapTargetArray(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb,
+ JsonValueList *found, bool unwrapElements);
+static JsonPathExecResult executeNextItem(JsonPathExecContext *cxt,
+ JsonPathItem *cur, JsonPathItem *next,
+ JsonbValue *v, JsonValueList *found, bool copy);
+static JsonPathExecResult executeItemOptUnwrapResult(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb,
+ bool unwrap, JsonValueList *found);
+static JsonPathExecResult executeItemOptUnwrapResultNoThrow(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, bool unwrap, JsonValueList *found);
+static JsonPathBool executeBoolItem(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, bool canHaveNext);
+static JsonPathBool executeNestedBoolItem(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb);
+static JsonPathExecResult executeAnyItem(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbContainer *jbc, JsonValueList *found,
+ uint32 level, uint32 first, uint32 last,
+ bool ignoreStructuralErrors, bool unwrapNext);
+static JsonPathBool executePredicate(JsonPathExecContext *cxt,
+ JsonPathItem *pred, JsonPathItem *larg, JsonPathItem *rarg,
+ JsonbValue *jb, bool unwrapRightArg,
+ JsonPathPredicateCallback exec, void *param);
+static JsonPathExecResult executeBinaryArithmExpr(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb,
+ BinaryArithmFunc func, JsonValueList *found);
+static JsonPathExecResult executeUnaryArithmExpr(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, PGFunction func,
+ JsonValueList *found);
+static JsonPathBool executeStartsWith(JsonPathItem *jsp,
+ JsonbValue *whole, JsonbValue *initial, void *param);
+static JsonPathBool executeLikeRegex(JsonPathItem *jsp, JsonbValue *str,
+ JsonbValue *rarg, void *param);
+static JsonPathExecResult executeNumericItemMethod(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, bool unwrap, PGFunction func,
+ JsonValueList *found);
+static JsonPathExecResult executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found);
+static JsonPathExecResult executeKeyValueMethod(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, JsonValueList *found);
+static JsonPathExecResult appendBoolResult(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonValueList *found, JsonPathBool res);
+static void getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item,
+ JsonbValue *value);
+static void getJsonPathVariable(JsonPathExecContext *cxt,
+ JsonPathItem *variable, Jsonb *vars, JsonbValue *value);
+static int JsonbArraySize(JsonbValue *jb);
+static JsonPathBool executeComparison(JsonPathItem *cmp, JsonbValue *lv,
+ JsonbValue *rv, void *p);
+static JsonPathBool compareItems(int32 op, JsonbValue *jb1, JsonbValue *jb2,
+ bool useTz);
+static int compareNumeric(Numeric a, Numeric b);
+static JsonbValue *copyJsonbValue(JsonbValue *src);
+static JsonPathExecResult getArrayIndex(JsonPathExecContext *cxt,
+ JsonPathItem *jsp, JsonbValue *jb, int32 *index);
+static JsonBaseObjectInfo setBaseObject(JsonPathExecContext *cxt,
+ JsonbValue *jbv, int32 id);
+static void JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv);
+static int JsonValueListLength(const JsonValueList *jvl);
+static bool JsonValueListIsEmpty(JsonValueList *jvl);
+static JsonbValue *JsonValueListHead(JsonValueList *jvl);
+static List *JsonValueListGetList(JsonValueList *jvl);
+static void JsonValueListInitIterator(const JsonValueList *jvl,
+ JsonValueListIterator *it);
+static JsonbValue *JsonValueListNext(const JsonValueList *jvl,
+ JsonValueListIterator *it);
+static int JsonbType(JsonbValue *jb);
+static JsonbValue *JsonbInitBinary(JsonbValue *jbv, Jsonb *jb);
+static int JsonbType(JsonbValue *jb);
+static JsonbValue *getScalar(JsonbValue *scalar, enum jbvType type);
+static JsonbValue *wrapItemsInArray(const JsonValueList *items);
+static int compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2,
+ bool useTz, bool *have_error);
+
+/****************** User interface to JsonPath executor ********************/
+
+/*
+ * jsonb_path_exists
+ * Returns true if jsonpath returns at least one item for the specified
+ * jsonb value. This function and jsonb_path_match() are used to
+ * implement @? and @@ operators, which in turn are intended to have an
+ * index support. Thus, it's desirable to make it easier to achieve
+ * consistency between index scan results and sequential scan results.
+ * So, we throw as few errors as possible. Regarding this function,
+ * such behavior also matches behavior of JSON_EXISTS() clause of
+ * SQL/JSON. Regarding jsonb_path_match(), this function doesn't have
+ * an analogy in SQL/JSON, so we define its behavior on our own.
+ */
+static Datum
+jsonb_path_exists_internal(FunctionCallInfo fcinfo, bool tz)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonPath *jp = PG_GETARG_JSONPATH_P(1);
+ JsonPathExecResult res;
+ Jsonb *vars = NULL;
+ bool silent = true;
+
+ if (PG_NARGS() == 4)
+ {
+ vars = PG_GETARG_JSONB_P(2);
+ silent = PG_GETARG_BOOL(3);
+ }
+
+ res = executeJsonPath(jp, vars, jb, !silent, NULL, tz);
+
+ PG_FREE_IF_COPY(jb, 0);
+ PG_FREE_IF_COPY(jp, 1);
+
+ if (jperIsError(res))
+ PG_RETURN_NULL();
+
+ PG_RETURN_BOOL(res == jperOk);
+}
+
+Datum
+jsonb_path_exists(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_exists_internal(fcinfo, false);
+}
+
+Datum
+jsonb_path_exists_tz(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_exists_internal(fcinfo, true);
+}
+
+/*
+ * jsonb_path_exists_opr
+ * Implementation of operator "jsonb @? jsonpath" (2-argument version of
+ * jsonb_path_exists()).
+ */
+Datum
+jsonb_path_exists_opr(PG_FUNCTION_ARGS)
+{
+ /* just call the other one -- it can handle both cases */
+ return jsonb_path_exists_internal(fcinfo, false);
+}
+
+/*
+ * jsonb_path_match
+ * Returns jsonpath predicate result item for the specified jsonb value.
+ * See jsonb_path_exists() comment for details regarding error handling.
+ */
+static Datum
+jsonb_path_match_internal(FunctionCallInfo fcinfo, bool tz)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonPath *jp = PG_GETARG_JSONPATH_P(1);
+ JsonValueList found = {0};
+ Jsonb *vars = NULL;
+ bool silent = true;
+
+ if (PG_NARGS() == 4)
+ {
+ vars = PG_GETARG_JSONB_P(2);
+ silent = PG_GETARG_BOOL(3);
+ }
+
+ (void) executeJsonPath(jp, vars, jb, !silent, &found, tz);
+
+ PG_FREE_IF_COPY(jb, 0);
+ PG_FREE_IF_COPY(jp, 1);
+
+ if (JsonValueListLength(&found) == 1)
+ {
+ JsonbValue *jbv = JsonValueListHead(&found);
+
+ if (jbv->type == jbvBool)
+ PG_RETURN_BOOL(jbv->val.boolean);
+
+ if (jbv->type == jbvNull)
+ PG_RETURN_NULL();
+ }
+
+ if (!silent)
+ ereport(ERROR,
+ (errcode(ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED),
+ errmsg("single boolean result is expected")));
+
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_path_match(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_match_internal(fcinfo, false);
+}
+
+Datum
+jsonb_path_match_tz(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_match_internal(fcinfo, true);
+}
+
+/*
+ * jsonb_path_match_opr
+ * Implementation of operator "jsonb @@ jsonpath" (2-argument version of
+ * jsonb_path_match()).
+ */
+Datum
+jsonb_path_match_opr(PG_FUNCTION_ARGS)
+{
+ /* just call the other one -- it can handle both cases */
+ return jsonb_path_match_internal(fcinfo, false);
+}
+
+/*
+ * jsonb_path_query
+ * Executes jsonpath for given jsonb document and returns result as
+ * rowset.
+ */
+static Datum
+jsonb_path_query_internal(FunctionCallInfo fcinfo, bool tz)
+{
+ FuncCallContext *funcctx;
+ List *found;
+ JsonbValue *v;
+ ListCell *c;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ JsonPath *jp;
+ Jsonb *jb;
+ MemoryContext oldcontext;
+ Jsonb *vars;
+ bool silent;
+ JsonValueList found = {0};
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ jb = PG_GETARG_JSONB_P_COPY(0);
+ jp = PG_GETARG_JSONPATH_P_COPY(1);
+ vars = PG_GETARG_JSONB_P_COPY(2);
+ silent = PG_GETARG_BOOL(3);
+
+ (void) executeJsonPath(jp, vars, jb, !silent, &found, tz);
+
+ funcctx->user_fctx = JsonValueListGetList(&found);
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ found = funcctx->user_fctx;
+
+ c = list_head(found);
+
+ if (c == NULL)
+ SRF_RETURN_DONE(funcctx);
+
+ v = lfirst(c);
+ funcctx->user_fctx = list_delete_first(found);
+
+ SRF_RETURN_NEXT(funcctx, JsonbPGetDatum(JsonbValueToJsonb(v)));
+}
+
+Datum
+jsonb_path_query(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_internal(fcinfo, false);
+}
+
+Datum
+jsonb_path_query_tz(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_internal(fcinfo, true);
+}
+
+/*
+ * jsonb_path_query_array
+ * Executes jsonpath for given jsonb document and returns result as
+ * jsonb array.
+ */
+static Datum
+jsonb_path_query_array_internal(FunctionCallInfo fcinfo, bool tz)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonPath *jp = PG_GETARG_JSONPATH_P(1);
+ JsonValueList found = {0};
+ Jsonb *vars = PG_GETARG_JSONB_P(2);
+ bool silent = PG_GETARG_BOOL(3);
+
+ (void) executeJsonPath(jp, vars, jb, !silent, &found, tz);
+
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(wrapItemsInArray(&found)));
+}
+
+Datum
+jsonb_path_query_array(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_array_internal(fcinfo, false);
+}
+
+Datum
+jsonb_path_query_array_tz(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_array_internal(fcinfo, true);
+}
+
+/*
+ * jsonb_path_query_first
+ * Executes jsonpath for given jsonb document and returns first result
+ * item. If there are no items, NULL returned.
+ */
+static Datum
+jsonb_path_query_first_internal(FunctionCallInfo fcinfo, bool tz)
+{
+ Jsonb *jb = PG_GETARG_JSONB_P(0);
+ JsonPath *jp = PG_GETARG_JSONPATH_P(1);
+ JsonValueList found = {0};
+ Jsonb *vars = PG_GETARG_JSONB_P(2);
+ bool silent = PG_GETARG_BOOL(3);
+
+ (void) executeJsonPath(jp, vars, jb, !silent, &found, tz);
+
+ if (JsonValueListLength(&found) >= 1)
+ PG_RETURN_JSONB_P(JsonbValueToJsonb(JsonValueListHead(&found)));
+ else
+ PG_RETURN_NULL();
+}
+
+Datum
+jsonb_path_query_first(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_first_internal(fcinfo, false);
+}
+
+Datum
+jsonb_path_query_first_tz(PG_FUNCTION_ARGS)
+{
+ return jsonb_path_query_first_internal(fcinfo, true);
+}
+
+/********************Execute functions for JsonPath**************************/
+
+/*
+ * Interface to jsonpath executor
+ *
+ * 'path' - jsonpath to be executed
+ * 'vars' - variables to be substituted to jsonpath
+ * 'json' - target document for jsonpath evaluation
+ * 'throwErrors' - whether we should throw suppressible errors
+ * 'result' - list to store result items into
+ *
+ * Returns an error if a recoverable error happens during processing, or NULL
+ * on no error.
+ *
+ * Note, jsonb and jsonpath values should be available and untoasted during
+ * work because JsonPathItem, JsonbValue and result item could have pointers
+ * into input values. If caller needs to just check if document matches
+ * jsonpath, then it doesn't provide a result arg. In this case executor
+ * works till first positive result and does not check the rest if possible.
+ * In other case it tries to find all the satisfied result items.
+ */
+static JsonPathExecResult
+executeJsonPath(JsonPath *path, Jsonb *vars, Jsonb *json, bool throwErrors,
+ JsonValueList *result, bool useTz)
+{
+ JsonPathExecContext cxt;
+ JsonPathExecResult res;
+ JsonPathItem jsp;
+ JsonbValue jbv;
+
+ jspInit(&jsp, path);
+
+ if (!JsonbExtractScalar(&json->root, &jbv))
+ JsonbInitBinary(&jbv, json);
+
+ if (vars && !JsonContainerIsObject(&vars->root))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("\"vars\" argument is not an object"),
+ errdetail("Jsonpath parameters should be encoded as key-value pairs of \"vars\" object.")));
+ }
+
+ cxt.vars = vars;
+ cxt.laxMode = (path->header & JSONPATH_LAX) != 0;
+ cxt.ignoreStructuralErrors = cxt.laxMode;
+ cxt.root = &jbv;
+ cxt.current = &jbv;
+ cxt.baseObject.jbc = NULL;
+ cxt.baseObject.id = 0;
+ cxt.lastGeneratedObjectId = vars ? 2 : 1;
+ cxt.innermostArraySize = -1;
+ cxt.throwErrors = throwErrors;
+ cxt.useTz = useTz;
+
+ if (jspStrictAbsenseOfErrors(&cxt) && !result)
+ {
+ /*
+ * In strict mode we must get a complete list of values to check that
+ * there are no errors at all.
+ */
+ JsonValueList vals = {0};
+
+ res = executeItem(&cxt, &jsp, &jbv, &vals);
+
+ if (jperIsError(res))
+ return res;
+
+ return JsonValueListIsEmpty(&vals) ? jperNotFound : jperOk;
+ }
+
+ res = executeItem(&cxt, &jsp, &jbv, result);
+
+ Assert(!throwErrors || !jperIsError(res));
+
+ return res;
+}
+
+/*
+ * Execute jsonpath with automatic unwrapping of current item in lax mode.
+ */
+static JsonPathExecResult
+executeItem(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found)
+{
+ return executeItemOptUnwrapTarget(cxt, jsp, jb, found, jspAutoUnwrap(cxt));
+}
+
+/*
+ * Main jsonpath executor function: walks on jsonpath structure, finds
+ * relevant parts of jsonb and evaluates expressions over them.
+ * When 'unwrap' is true current SQL/JSON item is unwrapped if it is an array.
+ */
+static JsonPathExecResult
+executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found, bool unwrap)
+{
+ JsonPathItem elem;
+ JsonPathExecResult res = jperNotFound;
+ JsonBaseObjectInfo baseObject;
+
+ check_stack_depth();
+ CHECK_FOR_INTERRUPTS();
+
+ switch (jsp->type)
+ {
+ /* all boolean item types: */
+ case jpiAnd:
+ case jpiOr:
+ case jpiNot:
+ case jpiIsUnknown:
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ case jpiExists:
+ case jpiStartsWith:
+ case jpiLikeRegex:
+ {
+ JsonPathBool st = executeBoolItem(cxt, jsp, jb, true);
+
+ res = appendBoolResult(cxt, jsp, found, st);
+ break;
+ }
+
+ case jpiKey:
+ if (JsonbType(jb) == jbvObject)
+ {
+ JsonbValue *v;
+ JsonbValue key;
+
+ key.type = jbvString;
+ key.val.string.val = jspGetString(jsp, &key.val.string.len);
+
+ v = findJsonbValueFromContainer(jb->val.binary.data,
+ JB_FOBJECT, &key);
+
+ if (v != NULL)
+ {
+ res = executeNextItem(cxt, jsp, NULL,
+ v, found, false);
+
+ /* free value if it was not added to found list */
+ if (jspHasNext(jsp) || !found)
+ pfree(v);
+ }
+ else if (!jspIgnoreStructuralErrors(cxt))
+ {
+ Assert(found);
+
+ if (!jspThrowErrors(cxt))
+ return jperError;
+
+ ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), \
+ errmsg("JSON object does not contain key \"%s\"",
+ pnstrdup(key.val.string.val,
+ key.val.string.len))));
+ }
+ }
+ else if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
+ else if (!jspIgnoreStructuralErrors(cxt))
+ {
+ Assert(found);
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND),
+ errmsg("jsonpath member accessor can only be applied to an object"))));
+ }
+ break;
+
+ case jpiRoot:
+ jb = cxt->root;
+ baseObject = setBaseObject(cxt, jb, 0);
+ res = executeNextItem(cxt, jsp, NULL, jb, found, true);
+ cxt->baseObject = baseObject;
+ break;
+
+ case jpiCurrent:
+ res = executeNextItem(cxt, jsp, NULL, cxt->current,
+ found, true);
+ break;
+
+ case jpiAnyArray:
+ if (JsonbType(jb) == jbvArray)
+ {
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ res = executeItemUnwrapTargetArray(cxt, hasNext ? &elem : NULL,
+ jb, found, jspAutoUnwrap(cxt));
+ }
+ else if (jspAutoWrap(cxt))
+ res = executeNextItem(cxt, jsp, NULL, jb, found, true);
+ else if (!jspIgnoreStructuralErrors(cxt))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_ARRAY_NOT_FOUND),
+ errmsg("jsonpath wildcard array accessor can only be applied to an array"))));
+ break;
+
+ case jpiIndexArray:
+ if (JsonbType(jb) == jbvArray || jspAutoWrap(cxt))
+ {
+ int innermostArraySize = cxt->innermostArraySize;
+ int i;
+ int size = JsonbArraySize(jb);
+ bool singleton = size < 0;
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ if (singleton)
+ size = 1;
+
+ cxt->innermostArraySize = size; /* for LAST evaluation */
+
+ for (i = 0; i < jsp->content.array.nelems; i++)
+ {
+ JsonPathItem from;
+ JsonPathItem to;
+ int32 index;
+ int32 index_from;
+ int32 index_to;
+ bool range = jspGetArraySubscript(jsp, &from,
+ &to, i);
+
+ res = getArrayIndex(cxt, &from, jb, &index_from);
+
+ if (jperIsError(res))
+ break;
+
+ if (range)
+ {
+ res = getArrayIndex(cxt, &to, jb, &index_to);
+
+ if (jperIsError(res))
+ break;
+ }
+ else
+ index_to = index_from;
+
+ if (!jspIgnoreStructuralErrors(cxt) &&
+ (index_from < 0 ||
+ index_from > index_to ||
+ index_to >= size))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_SQL_JSON_SUBSCRIPT),
+ errmsg("jsonpath array subscript is out of bounds"))));
+
+ if (index_from < 0)
+ index_from = 0;
+
+ if (index_to >= size)
+ index_to = size - 1;
+
+ res = jperNotFound;
+
+ for (index = index_from; index <= index_to; index++)
+ {
+ JsonbValue *v;
+ bool copy;
+
+ if (singleton)
+ {
+ v = jb;
+ copy = true;
+ }
+ else
+ {
+ v = getIthJsonbValueFromContainer(jb->val.binary.data,
+ (uint32) index);
+
+ if (v == NULL)
+ continue;
+
+ copy = false;
+ }
+
+ if (!hasNext && !found)
+ return jperOk;
+
+ res = executeNextItem(cxt, jsp, &elem, v, found,
+ copy);
+
+ if (jperIsError(res))
+ break;
+
+ if (res == jperOk && !found)
+ break;
+ }
+
+ if (jperIsError(res))
+ break;
+
+ if (res == jperOk && !found)
+ break;
+ }
+
+ cxt->innermostArraySize = innermostArraySize;
+ }
+ else if (!jspIgnoreStructuralErrors(cxt))
+ {
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_ARRAY_NOT_FOUND),
+ errmsg("jsonpath array accessor can only be applied to an array"))));
+ }
+ break;
+
+ case jpiLast:
+ {
+ JsonbValue tmpjbv;
+ JsonbValue *lastjbv;
+ int last;
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ if (cxt->innermostArraySize < 0)
+ elog(ERROR, "evaluating jsonpath LAST outside of array subscript");
+
+ if (!hasNext && !found)
+ {
+ res = jperOk;
+ break;
+ }
+
+ last = cxt->innermostArraySize - 1;
+
+ lastjbv = hasNext ? &tmpjbv : palloc(sizeof(*lastjbv));
+
+ lastjbv->type = jbvNumeric;
+ lastjbv->val.numeric = int64_to_numeric(last);
+
+ res = executeNextItem(cxt, jsp, &elem,
+ lastjbv, found, hasNext);
+ }
+ break;
+
+ case jpiAnyKey:
+ if (JsonbType(jb) == jbvObject)
+ {
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ if (jb->type != jbvBinary)
+ elog(ERROR, "invalid jsonb object type: %d", jb->type);
+
+ return executeAnyItem
+ (cxt, hasNext ? &elem : NULL,
+ jb->val.binary.data, found, 1, 1, 1,
+ false, jspAutoUnwrap(cxt));
+ }
+ else if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
+ else if (!jspIgnoreStructuralErrors(cxt))
+ {
+ Assert(found);
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_OBJECT_NOT_FOUND),
+ errmsg("jsonpath wildcard member accessor can only be applied to an object"))));
+ }
+ break;
+
+ case jpiAdd:
+ return executeBinaryArithmExpr(cxt, jsp, jb,
+ numeric_add_opt_error, found);
+
+ case jpiSub:
+ return executeBinaryArithmExpr(cxt, jsp, jb,
+ numeric_sub_opt_error, found);
+
+ case jpiMul:
+ return executeBinaryArithmExpr(cxt, jsp, jb,
+ numeric_mul_opt_error, found);
+
+ case jpiDiv:
+ return executeBinaryArithmExpr(cxt, jsp, jb,
+ numeric_div_opt_error, found);
+
+ case jpiMod:
+ return executeBinaryArithmExpr(cxt, jsp, jb,
+ numeric_mod_opt_error, found);
+
+ case jpiPlus:
+ return executeUnaryArithmExpr(cxt, jsp, jb, NULL, found);
+
+ case jpiMinus:
+ return executeUnaryArithmExpr(cxt, jsp, jb, numeric_uminus,
+ found);
+
+ case jpiFilter:
+ {
+ JsonPathBool st;
+
+ if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found,
+ false);
+
+ jspGetArg(jsp, &elem);
+ st = executeNestedBoolItem(cxt, &elem, jb);
+ if (st != jpbTrue)
+ res = jperNotFound;
+ else
+ res = executeNextItem(cxt, jsp, NULL,
+ jb, found, true);
+ break;
+ }
+
+ case jpiAny:
+ {
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ /* first try without any intermediate steps */
+ if (jsp->content.anybounds.first == 0)
+ {
+ bool savedIgnoreStructuralErrors;
+
+ savedIgnoreStructuralErrors = cxt->ignoreStructuralErrors;
+ cxt->ignoreStructuralErrors = true;
+ res = executeNextItem(cxt, jsp, &elem,
+ jb, found, true);
+ cxt->ignoreStructuralErrors = savedIgnoreStructuralErrors;
+
+ if (res == jperOk && !found)
+ break;
+ }
+
+ if (jb->type == jbvBinary)
+ res = executeAnyItem
+ (cxt, hasNext ? &elem : NULL,
+ jb->val.binary.data, found,
+ 1,
+ jsp->content.anybounds.first,
+ jsp->content.anybounds.last,
+ true, jspAutoUnwrap(cxt));
+ break;
+ }
+
+ case jpiNull:
+ case jpiBool:
+ case jpiNumeric:
+ case jpiString:
+ case jpiVariable:
+ {
+ JsonbValue vbuf;
+ JsonbValue *v;
+ bool hasNext = jspGetNext(jsp, &elem);
+
+ if (!hasNext && !found && jsp->type != jpiVariable)
+ {
+ /*
+ * Skip evaluation, but not for variables. We must
+ * trigger an error for the missing variable.
+ */
+ res = jperOk;
+ break;
+ }
+
+ v = hasNext ? &vbuf : palloc(sizeof(*v));
+
+ baseObject = cxt->baseObject;
+ getJsonPathItem(cxt, jsp, v);
+
+ res = executeNextItem(cxt, jsp, &elem,
+ v, found, hasNext);
+ cxt->baseObject = baseObject;
+ }
+ break;
+
+ case jpiType:
+ {
+ JsonbValue *jbv = palloc(sizeof(*jbv));
+
+ jbv->type = jbvString;
+ jbv->val.string.val = pstrdup(JsonbTypeName(jb));
+ jbv->val.string.len = strlen(jbv->val.string.val);
+
+ res = executeNextItem(cxt, jsp, NULL, jbv,
+ found, false);
+ }
+ break;
+
+ case jpiSize:
+ {
+ int size = JsonbArraySize(jb);
+
+ if (size < 0)
+ {
+ if (!jspAutoWrap(cxt))
+ {
+ if (!jspIgnoreStructuralErrors(cxt))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_ARRAY_NOT_FOUND),
+ errmsg("jsonpath item method .%s() can only be applied to an array",
+ jspOperationName(jsp->type)))));
+ break;
+ }
+
+ size = 1;
+ }
+
+ jb = palloc(sizeof(*jb));
+
+ jb->type = jbvNumeric;
+ jb->val.numeric = int64_to_numeric(size);
+
+ res = executeNextItem(cxt, jsp, NULL, jb, found, false);
+ }
+ break;
+
+ case jpiAbs:
+ return executeNumericItemMethod(cxt, jsp, jb, unwrap, numeric_abs,
+ found);
+
+ case jpiFloor:
+ return executeNumericItemMethod(cxt, jsp, jb, unwrap, numeric_floor,
+ found);
+
+ case jpiCeiling:
+ return executeNumericItemMethod(cxt, jsp, jb, unwrap, numeric_ceil,
+ found);
+
+ case jpiDouble:
+ {
+ JsonbValue jbv;
+
+ if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found,
+ false);
+
+ if (jb->type == jbvNumeric)
+ {
+ char *tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(jb->val.numeric)));
+ double val;
+ bool have_error = false;
+
+ val = float8in_internal_opt_error(tmp,
+ NULL,
+ "double precision",
+ tmp,
+ &have_error);
+
+ if (have_error || isinf(val) || isnan(val))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
+ errmsg("numeric argument of jsonpath item method .%s() is out of range for type double precision",
+ jspOperationName(jsp->type)))));
+ res = jperOk;
+ }
+ else if (jb->type == jbvString)
+ {
+ /* cast string as double */
+ double val;
+ char *tmp = pnstrdup(jb->val.string.val,
+ jb->val.string.len);
+ bool have_error = false;
+
+ val = float8in_internal_opt_error(tmp,
+ NULL,
+ "double precision",
+ tmp,
+ &have_error);
+
+ if (have_error || isinf(val) || isnan(val))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
+ errmsg("string argument of jsonpath item method .%s() is not a valid representation of a double precision number",
+ jspOperationName(jsp->type)))));
+
+ jb = &jbv;
+ jb->type = jbvNumeric;
+ jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(float8_numeric,
+ Float8GetDatum(val)));
+ res = jperOk;
+ }
+
+ if (res == jperNotFound)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
+ errmsg("jsonpath item method .%s() can only be applied to a string or numeric value",
+ jspOperationName(jsp->type)))));
+
+ res = executeNextItem(cxt, jsp, NULL, jb, found, true);
+ }
+ break;
+
+ case jpiDatetime:
+ if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
+
+ return executeDateTimeMethod(cxt, jsp, jb, found);
+
+ case jpiKeyValue:
+ if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
+
+ return executeKeyValueMethod(cxt, jsp, jb, found);
+
+ default:
+ elog(ERROR, "unrecognized jsonpath item type: %d", jsp->type);
+ }
+
+ return res;
+}
+
+/*
+ * Unwrap current array item and execute jsonpath for each of its elements.
+ */
+static JsonPathExecResult
+executeItemUnwrapTargetArray(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found,
+ bool unwrapElements)
+{
+ if (jb->type != jbvBinary)
+ {
+ Assert(jb->type != jbvArray);
+ elog(ERROR, "invalid jsonb array value type: %d", jb->type);
+ }
+
+ return executeAnyItem
+ (cxt, jsp, jb->val.binary.data, found, 1, 1, 1,
+ false, unwrapElements);
+}
+
+/*
+ * Execute next jsonpath item if exists. Otherwise put "v" to the "found"
+ * list if provided.
+ */
+static JsonPathExecResult
+executeNextItem(JsonPathExecContext *cxt,
+ JsonPathItem *cur, JsonPathItem *next,
+ JsonbValue *v, JsonValueList *found, bool copy)
+{
+ JsonPathItem elem;
+ bool hasNext;
+
+ if (!cur)
+ hasNext = next != NULL;
+ else if (next)
+ hasNext = jspHasNext(cur);
+ else
+ {
+ next = &elem;
+ hasNext = jspGetNext(cur, next);
+ }
+
+ if (hasNext)
+ return executeItem(cxt, next, v, found);
+
+ if (found)
+ JsonValueListAppend(found, copy ? copyJsonbValue(v) : v);
+
+ return jperOk;
+}
+
+/*
+ * Same as executeItem(), but when "unwrap == true" automatically unwraps
+ * each array item from the resulting sequence in lax mode.
+ */
+static JsonPathExecResult
+executeItemOptUnwrapResult(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, bool unwrap,
+ JsonValueList *found)
+{
+ if (unwrap && jspAutoUnwrap(cxt))
+ {
+ JsonValueList seq = {0};
+ JsonValueListIterator it;
+ JsonPathExecResult res = executeItem(cxt, jsp, jb, &seq);
+ JsonbValue *item;
+
+ if (jperIsError(res))
+ return res;
+
+ JsonValueListInitIterator(&seq, &it);
+ while ((item = JsonValueListNext(&seq, &it)))
+ {
+ Assert(item->type != jbvArray);
+
+ if (JsonbType(item) == jbvArray)
+ executeItemUnwrapTargetArray(cxt, NULL, item, found, false);
+ else
+ JsonValueListAppend(found, item);
+ }
+
+ return jperOk;
+ }
+
+ return executeItem(cxt, jsp, jb, found);
+}
+
+/*
+ * Same as executeItemOptUnwrapResult(), but with error suppression.
+ */
+static JsonPathExecResult
+executeItemOptUnwrapResultNoThrow(JsonPathExecContext *cxt,
+ JsonPathItem *jsp,
+ JsonbValue *jb, bool unwrap,
+ JsonValueList *found)
+{
+ JsonPathExecResult res;
+ bool throwErrors = cxt->throwErrors;
+
+ cxt->throwErrors = false;
+ res = executeItemOptUnwrapResult(cxt, jsp, jb, unwrap, found);
+ cxt->throwErrors = throwErrors;
+
+ return res;
+}
+
+/* Execute boolean-valued jsonpath expression. */
+static JsonPathBool
+executeBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, bool canHaveNext)
+{
+ JsonPathItem larg;
+ JsonPathItem rarg;
+ JsonPathBool res;
+ JsonPathBool res2;
+
+ if (!canHaveNext && jspHasNext(jsp))
+ elog(ERROR, "boolean jsonpath item cannot have next item");
+
+ switch (jsp->type)
+ {
+ case jpiAnd:
+ jspGetLeftArg(jsp, &larg);
+ res = executeBoolItem(cxt, &larg, jb, false);
+
+ if (res == jpbFalse)
+ return jpbFalse;
+
+ /*
+ * SQL/JSON says that we should check second arg in case of
+ * jperError
+ */
+
+ jspGetRightArg(jsp, &rarg);
+ res2 = executeBoolItem(cxt, &rarg, jb, false);
+
+ return res2 == jpbTrue ? res : res2;
+
+ case jpiOr:
+ jspGetLeftArg(jsp, &larg);
+ res = executeBoolItem(cxt, &larg, jb, false);
+
+ if (res == jpbTrue)
+ return jpbTrue;
+
+ jspGetRightArg(jsp, &rarg);
+ res2 = executeBoolItem(cxt, &rarg, jb, false);
+
+ return res2 == jpbFalse ? res : res2;
+
+ case jpiNot:
+ jspGetArg(jsp, &larg);
+
+ res = executeBoolItem(cxt, &larg, jb, false);
+
+ if (res == jpbUnknown)
+ return jpbUnknown;
+
+ return res == jpbTrue ? jpbFalse : jpbTrue;
+
+ case jpiIsUnknown:
+ jspGetArg(jsp, &larg);
+ res = executeBoolItem(cxt, &larg, jb, false);
+ return res == jpbUnknown ? jpbTrue : jpbFalse;
+
+ case jpiEqual:
+ case jpiNotEqual:
+ case jpiLess:
+ case jpiGreater:
+ case jpiLessOrEqual:
+ case jpiGreaterOrEqual:
+ jspGetLeftArg(jsp, &larg);
+ jspGetRightArg(jsp, &rarg);
+ return executePredicate(cxt, jsp, &larg, &rarg, jb, true,
+ executeComparison, cxt);
+
+ case jpiStartsWith: /* 'whole STARTS WITH initial' */
+ jspGetLeftArg(jsp, &larg); /* 'whole' */
+ jspGetRightArg(jsp, &rarg); /* 'initial' */
+ return executePredicate(cxt, jsp, &larg, &rarg, jb, false,
+ executeStartsWith, NULL);
+
+ case jpiLikeRegex: /* 'expr LIKE_REGEX pattern FLAGS flags' */
+ {
+ /*
+ * 'expr' is a sequence-returning expression. 'pattern' is a
+ * regex string literal. SQL/JSON standard requires XQuery
+ * regexes, but we use Postgres regexes here. 'flags' is a
+ * string literal converted to integer flags at compile-time.
+ */
+ JsonLikeRegexContext lrcxt = {0};
+
+ jspInitByBuffer(&larg, jsp->base,
+ jsp->content.like_regex.expr);
+
+ return executePredicate(cxt, jsp, &larg, NULL, jb, false,
+ executeLikeRegex, &lrcxt);
+ }
+
+ case jpiExists:
+ jspGetArg(jsp, &larg);
+
+ if (jspStrictAbsenseOfErrors(cxt))
+ {
+ /*
+ * In strict mode we must get a complete list of values to
+ * check that there are no errors at all.
+ */
+ JsonValueList vals = {0};
+ JsonPathExecResult res =
+ executeItemOptUnwrapResultNoThrow(cxt, &larg, jb,
+ false, &vals);
+
+ if (jperIsError(res))
+ return jpbUnknown;
+
+ return JsonValueListIsEmpty(&vals) ? jpbFalse : jpbTrue;
+ }
+ else
+ {
+ JsonPathExecResult res =
+ executeItemOptUnwrapResultNoThrow(cxt, &larg, jb,
+ false, NULL);
+
+ if (jperIsError(res))
+ return jpbUnknown;
+
+ return res == jperOk ? jpbTrue : jpbFalse;
+ }
+
+ default:
+ elog(ERROR, "invalid boolean jsonpath item type: %d", jsp->type);
+ return jpbUnknown;
+ }
+}
+
+/*
+ * Execute nested (filters etc.) boolean expression pushing current SQL/JSON
+ * item onto the stack.
+ */
+static JsonPathBool
+executeNestedBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb)
+{
+ JsonbValue *prev;
+ JsonPathBool res;
+
+ prev = cxt->current;
+ cxt->current = jb;
+ res = executeBoolItem(cxt, jsp, jb, false);
+ cxt->current = prev;
+
+ return res;
+}
+
+/*
+ * Implementation of several jsonpath nodes:
+ * - jpiAny (.** accessor),
+ * - jpiAnyKey (.* accessor),
+ * - jpiAnyArray ([*] accessor)
+ */
+static JsonPathExecResult
+executeAnyItem(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbContainer *jbc,
+ JsonValueList *found, uint32 level, uint32 first, uint32 last,
+ bool ignoreStructuralErrors, bool unwrapNext)
+{
+ JsonPathExecResult res = jperNotFound;
+ JsonbIterator *it;
+ int32 r;
+ JsonbValue v;
+
+ check_stack_depth();
+
+ if (level > last)
+ return res;
+
+ it = JsonbIteratorInit(jbc);
+
+ /*
+ * Recursively iterate over jsonb objects/arrays
+ */
+ while ((r = JsonbIteratorNext(&it, &v, true)) != WJB_DONE)
+ {
+ if (r == WJB_KEY)
+ {
+ r = JsonbIteratorNext(&it, &v, true);
+ Assert(r == WJB_VALUE);
+ }
+
+ if (r == WJB_VALUE || r == WJB_ELEM)
+ {
+
+ if (level >= first ||
+ (first == PG_UINT32_MAX && last == PG_UINT32_MAX &&
+ v.type != jbvBinary)) /* leaves only requested */
+ {
+ /* check expression */
+ if (jsp)
+ {
+ if (ignoreStructuralErrors)
+ {
+ bool savedIgnoreStructuralErrors;
+
+ savedIgnoreStructuralErrors = cxt->ignoreStructuralErrors;
+ cxt->ignoreStructuralErrors = true;
+ res = executeItemOptUnwrapTarget(cxt, jsp, &v, found, unwrapNext);
+ cxt->ignoreStructuralErrors = savedIgnoreStructuralErrors;
+ }
+ else
+ res = executeItemOptUnwrapTarget(cxt, jsp, &v, found, unwrapNext);
+
+ if (jperIsError(res))
+ break;
+
+ if (res == jperOk && !found)
+ break;
+ }
+ else if (found)
+ JsonValueListAppend(found, copyJsonbValue(&v));
+ else
+ return jperOk;
+ }
+
+ if (level < last && v.type == jbvBinary)
+ {
+ res = executeAnyItem
+ (cxt, jsp, v.val.binary.data, found,
+ level + 1, first, last,
+ ignoreStructuralErrors, unwrapNext);
+
+ if (jperIsError(res))
+ break;
+
+ if (res == jperOk && found == NULL)
+ break;
+ }
+ }
+ }
+
+ return res;
+}
+
+/*
+ * Execute unary or binary predicate.
+ *
+ * Predicates have existence semantics, because their operands are item
+ * sequences. Pairs of items from the left and right operand's sequences are
+ * checked. TRUE returned only if any pair satisfying the condition is found.
+ * In strict mode, even if the desired pair has already been found, all pairs
+ * still need to be examined to check the absence of errors. If any error
+ * occurs, UNKNOWN (analogous to SQL NULL) is returned.
+ */
+static JsonPathBool
+executePredicate(JsonPathExecContext *cxt, JsonPathItem *pred,
+ JsonPathItem *larg, JsonPathItem *rarg, JsonbValue *jb,
+ bool unwrapRightArg, JsonPathPredicateCallback exec,
+ void *param)
+{
+ JsonPathExecResult res;
+ JsonValueListIterator lseqit;
+ JsonValueList lseq = {0};
+ JsonValueList rseq = {0};
+ JsonbValue *lval;
+ bool error = false;
+ bool found = false;
+
+ /* Left argument is always auto-unwrapped. */
+ res = executeItemOptUnwrapResultNoThrow(cxt, larg, jb, true, &lseq);
+ if (jperIsError(res))
+ return jpbUnknown;
+
+ if (rarg)
+ {
+ /* Right argument is conditionally auto-unwrapped. */
+ res = executeItemOptUnwrapResultNoThrow(cxt, rarg, jb,
+ unwrapRightArg, &rseq);
+ if (jperIsError(res))
+ return jpbUnknown;
+ }
+
+ JsonValueListInitIterator(&lseq, &lseqit);
+ while ((lval = JsonValueListNext(&lseq, &lseqit)))
+ {
+ JsonValueListIterator rseqit;
+ JsonbValue *rval;
+ bool first = true;
+
+ JsonValueListInitIterator(&rseq, &rseqit);
+ if (rarg)
+ rval = JsonValueListNext(&rseq, &rseqit);
+ else
+ rval = NULL;
+
+ /* Loop over right arg sequence or do single pass otherwise */
+ while (rarg ? (rval != NULL) : first)
+ {
+ JsonPathBool res = exec(pred, lval, rval, param);
+
+ if (res == jpbUnknown)
+ {
+ if (jspStrictAbsenseOfErrors(cxt))
+ return jpbUnknown;
+
+ error = true;
+ }
+ else if (res == jpbTrue)
+ {
+ if (!jspStrictAbsenseOfErrors(cxt))
+ return jpbTrue;
+
+ found = true;
+ }
+
+ first = false;
+ if (rarg)
+ rval = JsonValueListNext(&rseq, &rseqit);
+ }
+ }
+
+ if (found) /* possible only in strict mode */
+ return jpbTrue;
+
+ if (error) /* possible only in lax mode */
+ return jpbUnknown;
+
+ return jpbFalse;
+}
+
+/*
+ * Execute binary arithmetic expression on singleton numeric operands.
+ * Array operands are automatically unwrapped in lax mode.
+ */
+static JsonPathExecResult
+executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, BinaryArithmFunc func,
+ JsonValueList *found)
+{
+ JsonPathExecResult jper;
+ JsonPathItem elem;
+ JsonValueList lseq = {0};
+ JsonValueList rseq = {0};
+ JsonbValue *lval;
+ JsonbValue *rval;
+ Numeric res;
+
+ jspGetLeftArg(jsp, &elem);
+
+ /*
+ * XXX: By standard only operands of multiplicative expressions are
+ * unwrapped. We extend it to other binary arithmetic expressions too.
+ */
+ jper = executeItemOptUnwrapResult(cxt, &elem, jb, true, &lseq);
+ if (jperIsError(jper))
+ return jper;
+
+ jspGetRightArg(jsp, &elem);
+
+ jper = executeItemOptUnwrapResult(cxt, &elem, jb, true, &rseq);
+ if (jperIsError(jper))
+ return jper;
+
+ if (JsonValueListLength(&lseq) != 1 ||
+ !(lval = getScalar(JsonValueListHead(&lseq), jbvNumeric)))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED),
+ errmsg("left operand of jsonpath operator %s is not a single numeric value",
+ jspOperationName(jsp->type)))));
+
+ if (JsonValueListLength(&rseq) != 1 ||
+ !(rval = getScalar(JsonValueListHead(&rseq), jbvNumeric)))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED),
+ errmsg("right operand of jsonpath operator %s is not a single numeric value",
+ jspOperationName(jsp->type)))));
+
+ if (jspThrowErrors(cxt))
+ {
+ res = func(lval->val.numeric, rval->val.numeric, NULL);
+ }
+ else
+ {
+ bool error = false;
+
+ res = func(lval->val.numeric, rval->val.numeric, &error);
+
+ if (error)
+ return jperError;
+ }
+
+ if (!jspGetNext(jsp, &elem) && !found)
+ return jperOk;
+
+ lval = palloc(sizeof(*lval));
+ lval->type = jbvNumeric;
+ lval->val.numeric = res;
+
+ return executeNextItem(cxt, jsp, &elem, lval, found, false);
+}
+
+/*
+ * Execute unary arithmetic expression for each numeric item in its operand's
+ * sequence. Array operand is automatically unwrapped in lax mode.
+ */
+static JsonPathExecResult
+executeUnaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, PGFunction func, JsonValueList *found)
+{
+ JsonPathExecResult jper;
+ JsonPathExecResult jper2;
+ JsonPathItem elem;
+ JsonValueList seq = {0};
+ JsonValueListIterator it;
+ JsonbValue *val;
+ bool hasNext;
+
+ jspGetArg(jsp, &elem);
+ jper = executeItemOptUnwrapResult(cxt, &elem, jb, true, &seq);
+
+ if (jperIsError(jper))
+ return jper;
+
+ jper = jperNotFound;
+
+ hasNext = jspGetNext(jsp, &elem);
+
+ JsonValueListInitIterator(&seq, &it);
+ while ((val = JsonValueListNext(&seq, &it)))
+ {
+ if ((val = getScalar(val, jbvNumeric)))
+ {
+ if (!found && !hasNext)
+ return jperOk;
+ }
+ else
+ {
+ if (!found && !hasNext)
+ continue; /* skip non-numerics processing */
+
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_NUMBER_NOT_FOUND),
+ errmsg("operand of unary jsonpath operator %s is not a numeric value",
+ jspOperationName(jsp->type)))));
+ }
+
+ if (func)
+ val->val.numeric =
+ DatumGetNumeric(DirectFunctionCall1(func,
+ NumericGetDatum(val->val.numeric)));
+
+ jper2 = executeNextItem(cxt, jsp, &elem, val, found, false);
+
+ if (jperIsError(jper2))
+ return jper2;
+
+ if (jper2 == jperOk)
+ {
+ if (!found)
+ return jperOk;
+ jper = jperOk;
+ }
+ }
+
+ return jper;
+}
+
+/*
+ * STARTS_WITH predicate callback.
+ *
+ * Check if the 'whole' string starts from 'initial' string.
+ */
+static JsonPathBool
+executeStartsWith(JsonPathItem *jsp, JsonbValue *whole, JsonbValue *initial,
+ void *param)
+{
+ if (!(whole = getScalar(whole, jbvString)))
+ return jpbUnknown; /* error */
+
+ if (!(initial = getScalar(initial, jbvString)))
+ return jpbUnknown; /* error */
+
+ if (whole->val.string.len >= initial->val.string.len &&
+ !memcmp(whole->val.string.val,
+ initial->val.string.val,
+ initial->val.string.len))
+ return jpbTrue;
+
+ return jpbFalse;
+}
+
+/*
+ * LIKE_REGEX predicate callback.
+ *
+ * Check if the string matches regex pattern.
+ */
+static JsonPathBool
+executeLikeRegex(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg,
+ void *param)
+{
+ JsonLikeRegexContext *cxt = param;
+
+ if (!(str = getScalar(str, jbvString)))
+ return jpbUnknown;
+
+ /* Cache regex text and converted flags. */
+ if (!cxt->regex)
+ {
+ cxt->regex =
+ cstring_to_text_with_len(jsp->content.like_regex.pattern,
+ jsp->content.like_regex.patternlen);
+ cxt->cflags = jspConvertRegexFlags(jsp->content.like_regex.flags);
+ }
+
+ if (RE_compile_and_execute(cxt->regex, str->val.string.val,
+ str->val.string.len,
+ cxt->cflags, DEFAULT_COLLATION_OID, 0, NULL))
+ return jpbTrue;
+
+ return jpbFalse;
+}
+
+/*
+ * Execute numeric item methods (.abs(), .floor(), .ceil()) using the specified
+ * user function 'func'.
+ */
+static JsonPathExecResult
+executeNumericItemMethod(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, bool unwrap, PGFunction func,
+ JsonValueList *found)
+{
+ JsonPathItem next;
+ Datum datum;
+
+ if (unwrap && JsonbType(jb) == jbvArray)
+ return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
+
+ if (!(jb = getScalar(jb, jbvNumeric)))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
+ errmsg("jsonpath item method .%s() can only be applied to a numeric value",
+ jspOperationName(jsp->type)))));
+
+ datum = DirectFunctionCall1(func, NumericGetDatum(jb->val.numeric));
+
+ if (!jspGetNext(jsp, &next) && !found)
+ return jperOk;
+
+ jb = palloc(sizeof(*jb));
+ jb->type = jbvNumeric;
+ jb->val.numeric = DatumGetNumeric(datum);
+
+ return executeNextItem(cxt, jsp, &next, jb, found, false);
+}
+
+/*
+ * Implementation of the .datetime() method.
+ *
+ * Converts a string into a date/time value. The actual type is determined at run time.
+ * If an argument is provided, this argument is used as a template string.
+ * Otherwise, the first fitting ISO format is selected.
+ */
+static JsonPathExecResult
+executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found)
+{
+ JsonbValue jbvbuf;
+ Datum value;
+ text *datetime;
+ Oid collid;
+ Oid typid;
+ int32 typmod = -1;
+ int tz = 0;
+ bool hasNext;
+ JsonPathExecResult res = jperNotFound;
+ JsonPathItem elem;
+
+ if (!(jb = getScalar(jb, jbvString)))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION),
+ errmsg("jsonpath item method .%s() can only be applied to a string",
+ jspOperationName(jsp->type)))));
+
+ datetime = cstring_to_text_with_len(jb->val.string.val,
+ jb->val.string.len);
+
+ /*
+ * At some point we might wish to have callers supply the collation to
+ * use, but right now it's unclear that they'd be able to do better than
+ * DEFAULT_COLLATION_OID anyway.
+ */
+ collid = DEFAULT_COLLATION_OID;
+
+ if (jsp->content.arg)
+ {
+ text *template;
+ char *template_str;
+ int template_len;
+ bool have_error = false;
+
+ jspGetArg(jsp, &elem);
+
+ if (elem.type != jpiString)
+ elog(ERROR, "invalid jsonpath item type for .datetime() argument");
+
+ template_str = jspGetString(&elem, &template_len);
+
+ template = cstring_to_text_with_len(template_str,
+ template_len);
+
+ value = parse_datetime(datetime, template, collid, true,
+ &typid, &typmod, &tz,
+ jspThrowErrors(cxt) ? NULL : &have_error);
+
+ if (have_error)
+ res = jperError;
+ else
+ res = jperOk;
+ }
+ else
+ {
+ /*
+ * According to SQL/JSON standard enumerate ISO formats for: date,
+ * timetz, time, timestamptz, timestamp.
+ *
+ * We also support ISO 8601 format (with "T") for timestamps, because
+ * to_json[b]() functions use this format.
+ */
+ static const char *fmt_str[] =
+ {
+ "yyyy-mm-dd", /* date */
+ "HH24:MI:SS.USTZH:TZM", /* timetz */
+ "HH24:MI:SS.USTZH",
+ "HH24:MI:SSTZH:TZM",
+ "HH24:MI:SSTZH",
+ "HH24:MI:SS.US", /* time without tz */
+ "HH24:MI:SS",
+ "yyyy-mm-dd HH24:MI:SS.USTZH:TZM", /* timestamptz */
+ "yyyy-mm-dd HH24:MI:SS.USTZH",
+ "yyyy-mm-dd HH24:MI:SSTZH:TZM",
+ "yyyy-mm-dd HH24:MI:SSTZH",
+ "yyyy-mm-dd\"T\"HH24:MI:SS.USTZH:TZM",
+ "yyyy-mm-dd\"T\"HH24:MI:SS.USTZH",
+ "yyyy-mm-dd\"T\"HH24:MI:SSTZH:TZM",
+ "yyyy-mm-dd\"T\"HH24:MI:SSTZH",
+ "yyyy-mm-dd HH24:MI:SS.US", /* timestamp without tz */
+ "yyyy-mm-dd HH24:MI:SS",
+ "yyyy-mm-dd\"T\"HH24:MI:SS.US",
+ "yyyy-mm-dd\"T\"HH24:MI:SS"
+ };
+
+ /* cache for format texts */
+ static text *fmt_txt[lengthof(fmt_str)] = {0};
+ int i;
+
+ /* loop until datetime format fits */
+ for (i = 0; i < lengthof(fmt_str); i++)
+ {
+ bool have_error = false;
+
+ if (!fmt_txt[i])
+ {
+ MemoryContext oldcxt =
+ MemoryContextSwitchTo(TopMemoryContext);
+
+ fmt_txt[i] = cstring_to_text(fmt_str[i]);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ value = parse_datetime(datetime, fmt_txt[i], collid, true,
+ &typid, &typmod, &tz,
+ &have_error);
+
+ if (!have_error)
+ {
+ res = jperOk;
+ break;
+ }
+ }
+
+ if (res == jperNotFound)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION),
+ errmsg("datetime format is not recognized: \"%s\"",
+ text_to_cstring(datetime)),
+ errhint("Use a datetime template argument to specify the input data format."))));
+ }
+
+ pfree(datetime);
+
+ if (jperIsError(res))
+ return res;
+
+ hasNext = jspGetNext(jsp, &elem);
+
+ if (!hasNext && !found)
+ return res;
+
+ jb = hasNext ? &jbvbuf : palloc(sizeof(*jb));
+
+ jb->type = jbvDatetime;
+ jb->val.datetime.value = value;
+ jb->val.datetime.typid = typid;
+ jb->val.datetime.typmod = typmod;
+ jb->val.datetime.tz = tz;
+
+ return executeNextItem(cxt, jsp, &elem, jb, found, hasNext);
+}
+
+/*
+ * Implementation of .keyvalue() method.
+ *
+ * .keyvalue() method returns a sequence of object's key-value pairs in the
+ * following format: '{ "key": key, "value": value, "id": id }'.
+ *
+ * "id" field is an object identifier which is constructed from the two parts:
+ * base object id and its binary offset in base object's jsonb:
+ * id = 10000000000 * base_object_id + obj_offset_in_base_object
+ *
+ * 10000000000 (10^10) -- is a first round decimal number greater than 2^32
+ * (maximal offset in jsonb). Decimal multiplier is used here to improve the
+ * readability of identifiers.
+ *
+ * Base object is usually a root object of the path: context item '$' or path
+ * variable '$var', literals can't produce objects for now. But if the path
+ * contains generated objects (.keyvalue() itself, for example), then they
+ * become base object for the subsequent .keyvalue().
+ *
+ * Id of '$' is 0. Id of '$var' is its ordinal (positive) number in the list
+ * of variables (see getJsonPathVariable()). Ids for generated objects
+ * are assigned using global counter JsonPathExecContext.lastGeneratedObjectId.
+ */
+static JsonPathExecResult
+executeKeyValueMethod(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonbValue *jb, JsonValueList *found)
+{
+ JsonPathExecResult res = jperNotFound;
+ JsonPathItem next;
+ JsonbContainer *jbc;
+ JsonbValue key;
+ JsonbValue val;
+ JsonbValue idval;
+ JsonbValue keystr;
+ JsonbValue valstr;
+ JsonbValue idstr;
+ JsonbIterator *it;
+ JsonbIteratorToken tok;
+ int64 id;
+ bool hasNext;
+
+ if (JsonbType(jb) != jbvObject || jb->type != jbvBinary)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_SQL_JSON_OBJECT_NOT_FOUND),
+ errmsg("jsonpath item method .%s() can only be applied to an object",
+ jspOperationName(jsp->type)))));
+
+ jbc = jb->val.binary.data;
+
+ if (!JsonContainerSize(jbc))
+ return jperNotFound; /* no key-value pairs */
+
+ hasNext = jspGetNext(jsp, &next);
+
+ keystr.type = jbvString;
+ keystr.val.string.val = "key";
+ keystr.val.string.len = 3;
+
+ valstr.type = jbvString;
+ valstr.val.string.val = "value";
+ valstr.val.string.len = 5;
+
+ idstr.type = jbvString;
+ idstr.val.string.val = "id";
+ idstr.val.string.len = 2;
+
+ /* construct object id from its base object and offset inside that */
+ id = jb->type != jbvBinary ? 0 :
+ (int64) ((char *) jbc - (char *) cxt->baseObject.jbc);
+ id += (int64) cxt->baseObject.id * INT64CONST(10000000000);
+
+ idval.type = jbvNumeric;
+ idval.val.numeric = int64_to_numeric(id);
+
+ it = JsonbIteratorInit(jbc);
+
+ while ((tok = JsonbIteratorNext(&it, &key, true)) != WJB_DONE)
+ {
+ JsonBaseObjectInfo baseObject;
+ JsonbValue obj;
+ JsonbParseState *ps;
+ JsonbValue *keyval;
+ Jsonb *jsonb;
+
+ if (tok != WJB_KEY)
+ continue;
+
+ res = jperOk;
+
+ if (!hasNext && !found)
+ break;
+
+ tok = JsonbIteratorNext(&it, &val, true);
+ Assert(tok == WJB_VALUE);
+
+ ps = NULL;
+ pushJsonbValue(&ps, WJB_BEGIN_OBJECT, NULL);
+
+ pushJsonbValue(&ps, WJB_KEY, &keystr);
+ pushJsonbValue(&ps, WJB_VALUE, &key);
+
+ pushJsonbValue(&ps, WJB_KEY, &valstr);
+ pushJsonbValue(&ps, WJB_VALUE, &val);
+
+ pushJsonbValue(&ps, WJB_KEY, &idstr);
+ pushJsonbValue(&ps, WJB_VALUE, &idval);
+
+ keyval = pushJsonbValue(&ps, WJB_END_OBJECT, NULL);
+
+ jsonb = JsonbValueToJsonb(keyval);
+
+ JsonbInitBinary(&obj, jsonb);
+
+ baseObject = setBaseObject(cxt, &obj, cxt->lastGeneratedObjectId++);
+
+ res = executeNextItem(cxt, jsp, &next, &obj, found, true);
+
+ cxt->baseObject = baseObject;
+
+ if (jperIsError(res))
+ return res;
+
+ if (res == jperOk && !found)
+ break;
+ }
+
+ return res;
+}
+
+/*
+ * Convert boolean execution status 'res' to a boolean JSON item and execute
+ * next jsonpath.
+ */
+static JsonPathExecResult
+appendBoolResult(JsonPathExecContext *cxt, JsonPathItem *jsp,
+ JsonValueList *found, JsonPathBool res)
+{
+ JsonPathItem next;
+ JsonbValue jbv;
+
+ if (!jspGetNext(jsp, &next) && !found)
+ return jperOk; /* found singleton boolean value */
+
+ if (res == jpbUnknown)
+ {
+ jbv.type = jbvNull;
+ }
+ else
+ {
+ jbv.type = jbvBool;
+ jbv.val.boolean = res == jpbTrue;
+ }
+
+ return executeNextItem(cxt, jsp, &next, &jbv, found, true);
+}
+
+/*
+ * Convert jsonpath's scalar or variable node to actual jsonb value.
+ *
+ * If node is a variable then its id returned, otherwise 0 returned.
+ */
+static void
+getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item,
+ JsonbValue *value)
+{
+ switch (item->type)
+ {
+ case jpiNull:
+ value->type = jbvNull;
+ break;
+ case jpiBool:
+ value->type = jbvBool;
+ value->val.boolean = jspGetBool(item);
+ break;
+ case jpiNumeric:
+ value->type = jbvNumeric;
+ value->val.numeric = jspGetNumeric(item);
+ break;
+ case jpiString:
+ value->type = jbvString;
+ value->val.string.val = jspGetString(item,
+ &value->val.string.len);
+ break;
+ case jpiVariable:
+ getJsonPathVariable(cxt, item, cxt->vars, value);
+ return;
+ default:
+ elog(ERROR, "unexpected jsonpath item type");
+ }
+}
+
+/*
+ * Get the value of variable passed to jsonpath executor
+ */
+static void
+getJsonPathVariable(JsonPathExecContext *cxt, JsonPathItem *variable,
+ Jsonb *vars, JsonbValue *value)
+{
+ char *varName;
+ int varNameLength;
+ JsonbValue tmp;
+ JsonbValue *v;
+
+ if (!vars)
+ {
+ value->type = jbvNull;
+ return;
+ }
+
+ Assert(variable->type == jpiVariable);
+ varName = jspGetString(variable, &varNameLength);
+ tmp.type = jbvString;
+ tmp.val.string.val = varName;
+ tmp.val.string.len = varNameLength;
+
+ v = findJsonbValueFromContainer(&vars->root, JB_FOBJECT, &tmp);
+
+ if (v)
+ {
+ *value = *v;
+ pfree(v);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("could not find jsonpath variable \"%s\"",
+ pnstrdup(varName, varNameLength))));
+ }
+
+ JsonbInitBinary(&tmp, vars);
+ setBaseObject(cxt, &tmp, 1);
+}
+
+/**************** Support functions for JsonPath execution *****************/
+
+/*
+ * Returns the size of an array item, or -1 if item is not an array.
+ */
+static int
+JsonbArraySize(JsonbValue *jb)
+{
+ Assert(jb->type != jbvArray);
+
+ if (jb->type == jbvBinary)
+ {
+ JsonbContainer *jbc = jb->val.binary.data;
+
+ if (JsonContainerIsArray(jbc) && !JsonContainerIsScalar(jbc))
+ return JsonContainerSize(jbc);
+ }
+
+ return -1;
+}
+
+/* Comparison predicate callback. */
+static JsonPathBool
+executeComparison(JsonPathItem *cmp, JsonbValue *lv, JsonbValue *rv, void *p)
+{
+ JsonPathExecContext *cxt = (JsonPathExecContext *) p;
+
+ return compareItems(cmp->type, lv, rv, cxt->useTz);
+}
+
+/*
+ * Perform per-byte comparison of two strings.
+ */
+static int
+binaryCompareStrings(const char *s1, int len1,
+ const char *s2, int len2)
+{
+ int cmp;
+
+ cmp = memcmp(s1, s2, Min(len1, len2));
+
+ if (cmp != 0)
+ return cmp;
+
+ if (len1 == len2)
+ return 0;
+
+ return len1 < len2 ? -1 : 1;
+}
+
+/*
+ * Compare two strings in the current server encoding using Unicode codepoint
+ * collation.
+ */
+static int
+compareStrings(const char *mbstr1, int mblen1,
+ const char *mbstr2, int mblen2)
+{
+ if (GetDatabaseEncoding() == PG_SQL_ASCII ||
+ GetDatabaseEncoding() == PG_UTF8)
+ {
+ /*
+ * It's known property of UTF-8 strings that their per-byte comparison
+ * result matches codepoints comparison result. ASCII can be
+ * considered as special case of UTF-8.
+ */
+ return binaryCompareStrings(mbstr1, mblen1, mbstr2, mblen2);
+ }
+ else
+ {
+ char *utf8str1,
+ *utf8str2;
+ int cmp,
+ utf8len1,
+ utf8len2;
+
+ /*
+ * We have to convert other encodings to UTF-8 first, then compare.
+ * Input strings may be not null-terminated and pg_server_to_any() may
+ * return them "as is". So, use strlen() only if there is real
+ * conversion.
+ */
+ utf8str1 = pg_server_to_any(mbstr1, mblen1, PG_UTF8);
+ utf8str2 = pg_server_to_any(mbstr2, mblen2, PG_UTF8);
+ utf8len1 = (mbstr1 == utf8str1) ? mblen1 : strlen(utf8str1);
+ utf8len2 = (mbstr2 == utf8str2) ? mblen2 : strlen(utf8str2);
+
+ cmp = binaryCompareStrings(utf8str1, utf8len1, utf8str2, utf8len2);
+
+ /*
+ * If pg_server_to_any() did no real conversion, then we actually
+ * compared original strings. So, we already done.
+ */
+ if (mbstr1 == utf8str1 && mbstr2 == utf8str2)
+ return cmp;
+
+ /* Free memory if needed */
+ if (mbstr1 != utf8str1)
+ pfree(utf8str1);
+ if (mbstr2 != utf8str2)
+ pfree(utf8str2);
+
+ /*
+ * When all Unicode codepoints are equal, return result of binary
+ * comparison. In some edge cases, same characters may have different
+ * representations in encoding. Then our behavior could diverge from
+ * standard. However, that allow us to do simple binary comparison
+ * for "==" operator, which is performance critical in typical cases.
+ * In future to implement strict standard conformance, we can do
+ * normalization of input JSON strings.
+ */
+ if (cmp == 0)
+ return binaryCompareStrings(mbstr1, mblen1, mbstr2, mblen2);
+ else
+ return cmp;
+ }
+}
+
+/*
+ * Compare two SQL/JSON items using comparison operation 'op'.
+ */
+static JsonPathBool
+compareItems(int32 op, JsonbValue *jb1, JsonbValue *jb2, bool useTz)
+{
+ int cmp;
+ bool res;
+
+ if (jb1->type != jb2->type)
+ {
+ if (jb1->type == jbvNull || jb2->type == jbvNull)
+
+ /*
+ * Equality and order comparison of nulls to non-nulls returns
+ * always false, but inequality comparison returns true.
+ */
+ return op == jpiNotEqual ? jpbTrue : jpbFalse;
+
+ /* Non-null items of different types are not comparable. */
+ return jpbUnknown;
+ }
+
+ switch (jb1->type)
+ {
+ case jbvNull:
+ cmp = 0;
+ break;
+ case jbvBool:
+ cmp = jb1->val.boolean == jb2->val.boolean ? 0 :
+ jb1->val.boolean ? 1 : -1;
+ break;
+ case jbvNumeric:
+ cmp = compareNumeric(jb1->val.numeric, jb2->val.numeric);
+ break;
+ case jbvString:
+ if (op == jpiEqual)
+ return jb1->val.string.len != jb2->val.string.len ||
+ memcmp(jb1->val.string.val,
+ jb2->val.string.val,
+ jb1->val.string.len) ? jpbFalse : jpbTrue;
+
+ cmp = compareStrings(jb1->val.string.val, jb1->val.string.len,
+ jb2->val.string.val, jb2->val.string.len);
+ break;
+ case jbvDatetime:
+ {
+ bool cast_error;
+
+ cmp = compareDatetime(jb1->val.datetime.value,
+ jb1->val.datetime.typid,
+ jb2->val.datetime.value,
+ jb2->val.datetime.typid,
+ useTz,
+ &cast_error);
+
+ if (cast_error)
+ return jpbUnknown;
+ }
+ break;
+
+ case jbvBinary:
+ case jbvArray:
+ case jbvObject:
+ return jpbUnknown; /* non-scalars are not comparable */
+
+ default:
+ elog(ERROR, "invalid jsonb value type %d", jb1->type);
+ }
+
+ switch (op)
+ {
+ case jpiEqual:
+ res = (cmp == 0);
+ break;
+ case jpiNotEqual:
+ res = (cmp != 0);
+ break;
+ case jpiLess:
+ res = (cmp < 0);
+ break;
+ case jpiGreater:
+ res = (cmp > 0);
+ break;
+ case jpiLessOrEqual:
+ res = (cmp <= 0);
+ break;
+ case jpiGreaterOrEqual:
+ res = (cmp >= 0);
+ break;
+ default:
+ elog(ERROR, "unrecognized jsonpath operation: %d", op);
+ return jpbUnknown;
+ }
+
+ return res ? jpbTrue : jpbFalse;
+}
+
+/* Compare two numerics */
+static int
+compareNumeric(Numeric a, Numeric b)
+{
+ return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
+ NumericGetDatum(a),
+ NumericGetDatum(b)));
+}
+
+static JsonbValue *
+copyJsonbValue(JsonbValue *src)
+{
+ JsonbValue *dst = palloc(sizeof(*dst));
+
+ *dst = *src;
+
+ return dst;
+}
+
+/*
+ * Execute array subscript expression and convert resulting numeric item to
+ * the integer type with truncation.
+ */
+static JsonPathExecResult
+getArrayIndex(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb,
+ int32 *index)
+{
+ JsonbValue *jbv;
+ JsonValueList found = {0};
+ JsonPathExecResult res = executeItem(cxt, jsp, jb, &found);
+ Datum numeric_index;
+ bool have_error = false;
+
+ if (jperIsError(res))
+ return res;
+
+ if (JsonValueListLength(&found) != 1 ||
+ !(jbv = getScalar(JsonValueListHead(&found), jbvNumeric)))
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_SQL_JSON_SUBSCRIPT),
+ errmsg("jsonpath array subscript is not a single numeric value"))));
+
+ numeric_index = DirectFunctionCall2(numeric_trunc,
+ NumericGetDatum(jbv->val.numeric),
+ Int32GetDatum(0));
+
+ *index = numeric_int4_opt_error(DatumGetNumeric(numeric_index),
+ &have_error);
+
+ if (have_error)
+ RETURN_ERROR(ereport(ERROR,
+ (errcode(ERRCODE_INVALID_SQL_JSON_SUBSCRIPT),
+ errmsg("jsonpath array subscript is out of integer range"))));
+
+ return jperOk;
+}
+
+/* Save base object and its id needed for the execution of .keyvalue(). */
+static JsonBaseObjectInfo
+setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id)
+{
+ JsonBaseObjectInfo baseObject = cxt->baseObject;
+
+ cxt->baseObject.jbc = jbv->type != jbvBinary ? NULL :
+ (JsonbContainer *) jbv->val.binary.data;
+ cxt->baseObject.id = id;
+
+ return baseObject;
+}
+
+static void
+JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv)
+{
+ if (jvl->singleton)
+ {
+ jvl->list = list_make2(jvl->singleton, jbv);
+ jvl->singleton = NULL;
+ }
+ else if (!jvl->list)
+ jvl->singleton = jbv;
+ else
+ jvl->list = lappend(jvl->list, jbv);
+}
+
+static int
+JsonValueListLength(const JsonValueList *jvl)
+{
+ return jvl->singleton ? 1 : list_length(jvl->list);
+}
+
+static bool
+JsonValueListIsEmpty(JsonValueList *jvl)
+{
+ return !jvl->singleton && list_length(jvl->list) <= 0;
+}
+
+static JsonbValue *
+JsonValueListHead(JsonValueList *jvl)
+{
+ return jvl->singleton ? jvl->singleton : linitial(jvl->list);
+}
+
+static List *
+JsonValueListGetList(JsonValueList *jvl)
+{
+ if (jvl->singleton)
+ return list_make1(jvl->singleton);
+
+ return jvl->list;
+}
+
+static void
+JsonValueListInitIterator(const JsonValueList *jvl, JsonValueListIterator *it)
+{
+ if (jvl->singleton)
+ {
+ it->value = jvl->singleton;
+ it->list = NIL;
+ it->next = NULL;
+ }
+ else if (jvl->list != NIL)
+ {
+ it->value = (JsonbValue *) linitial(jvl->list);
+ it->list = jvl->list;
+ it->next = list_second_cell(jvl->list);
+ }
+ else
+ {
+ it->value = NULL;
+ it->list = NIL;
+ it->next = NULL;
+ }
+}
+
+/*
+ * Get the next item from the sequence advancing iterator.
+ */
+static JsonbValue *
+JsonValueListNext(const JsonValueList *jvl, JsonValueListIterator *it)
+{
+ JsonbValue *result = it->value;
+
+ if (it->next)
+ {
+ it->value = lfirst(it->next);
+ it->next = lnext(it->list, it->next);
+ }
+ else
+ {
+ it->value = NULL;
+ }
+
+ return result;
+}
+
+/*
+ * Initialize a binary JsonbValue with the given jsonb container.
+ */
+static JsonbValue *
+JsonbInitBinary(JsonbValue *jbv, Jsonb *jb)
+{
+ jbv->type = jbvBinary;
+ jbv->val.binary.data = &jb->root;
+ jbv->val.binary.len = VARSIZE_ANY_EXHDR(jb);
+
+ return jbv;
+}
+
+/*
+ * Returns jbv* type of JsonbValue. Note, it never returns jbvBinary as is.
+ */
+static int
+JsonbType(JsonbValue *jb)
+{
+ int type = jb->type;
+
+ if (jb->type == jbvBinary)
+ {
+ JsonbContainer *jbc = (void *) jb->val.binary.data;
+
+ /* Scalars should be always extracted during jsonpath execution. */
+ Assert(!JsonContainerIsScalar(jbc));
+
+ if (JsonContainerIsObject(jbc))
+ type = jbvObject;
+ else if (JsonContainerIsArray(jbc))
+ type = jbvArray;
+ else
+ elog(ERROR, "invalid jsonb container type: 0x%08x", jbc->header);
+ }
+
+ return type;
+}
+
+/* Get scalar of given type or NULL on type mismatch */
+static JsonbValue *
+getScalar(JsonbValue *scalar, enum jbvType type)
+{
+ /* Scalars should be always extracted during jsonpath execution. */
+ Assert(scalar->type != jbvBinary ||
+ !JsonContainerIsScalar(scalar->val.binary.data));
+
+ return scalar->type == type ? scalar : NULL;
+}
+
+/* Construct a JSON array from the item list */
+static JsonbValue *
+wrapItemsInArray(const JsonValueList *items)
+{
+ JsonbParseState *ps = NULL;
+ JsonValueListIterator it;
+ JsonbValue *jbv;
+
+ pushJsonbValue(&ps, WJB_BEGIN_ARRAY, NULL);
+
+ JsonValueListInitIterator(items, &it);
+ while ((jbv = JsonValueListNext(items, &it)))
+ pushJsonbValue(&ps, WJB_ELEM, jbv);
+
+ return pushJsonbValue(&ps, WJB_END_ARRAY, NULL);
+}
+
+/* Check if the timezone required for casting from type1 to type2 is used */
+static void
+checkTimezoneIsUsedForCast(bool useTz, const char *type1, const char *type2)
+{
+ if (!useTz)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert value from %s to %s without time zone usage",
+ type1, type2),
+ errhint("Use *_tz() function for time zone support.")));
+}
+
+/* Convert time datum to timetz datum */
+static Datum
+castTimeToTimeTz(Datum time, bool useTz)
+{
+ checkTimezoneIsUsedForCast(useTz, "time", "timetz");
+
+ return DirectFunctionCall1(time_timetz, time);
+}
+
+/*
+ * Compare date to timestamp.
+ * Note that this doesn't involve any timezone considerations.
+ */
+static int
+cmpDateToTimestamp(DateADT date1, Timestamp ts2, bool useTz)
+{
+ return date_cmp_timestamp_internal(date1, ts2);
+}
+
+/*
+ * Compare date to timestamptz.
+ */
+static int
+cmpDateToTimestampTz(DateADT date1, TimestampTz tstz2, bool useTz)
+{
+ checkTimezoneIsUsedForCast(useTz, "date", "timestamptz");
+
+ return date_cmp_timestamptz_internal(date1, tstz2);
+}
+
+/*
+ * Compare timestamp to timestamptz.
+ */
+static int
+cmpTimestampToTimestampTz(Timestamp ts1, TimestampTz tstz2, bool useTz)
+{
+ checkTimezoneIsUsedForCast(useTz, "timestamp", "timestamptz");
+
+ return timestamp_cmp_timestamptz_internal(ts1, tstz2);
+}
+
+/*
+ * Cross-type comparison of two datetime SQL/JSON items. If items are
+ * uncomparable *cast_error flag is set, otherwise *cast_error is unset.
+ * If the cast requires timezone and it is not used, then explicit error is thrown.
+ */
+static int
+compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2,
+ bool useTz, bool *cast_error)
+{
+ PGFunction cmpfunc;
+
+ *cast_error = false;
+
+ switch (typid1)
+ {
+ case DATEOID:
+ switch (typid2)
+ {
+ case DATEOID:
+ cmpfunc = date_cmp;
+
+ break;
+
+ case TIMESTAMPOID:
+ return cmpDateToTimestamp(DatumGetDateADT(val1),
+ DatumGetTimestamp(val2),
+ useTz);
+
+ case TIMESTAMPTZOID:
+ return cmpDateToTimestampTz(DatumGetDateADT(val1),
+ DatumGetTimestampTz(val2),
+ useTz);
+
+ case TIMEOID:
+ case TIMETZOID:
+ *cast_error = true; /* uncomparable types */
+ return 0;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u",
+ typid2);
+ }
+ break;
+
+ case TIMEOID:
+ switch (typid2)
+ {
+ case TIMEOID:
+ cmpfunc = time_cmp;
+
+ break;
+
+ case TIMETZOID:
+ val1 = castTimeToTimeTz(val1, useTz);
+ cmpfunc = timetz_cmp;
+
+ break;
+
+ case DATEOID:
+ case TIMESTAMPOID:
+ case TIMESTAMPTZOID:
+ *cast_error = true; /* uncomparable types */
+ return 0;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u",
+ typid2);
+ }
+ break;
+
+ case TIMETZOID:
+ switch (typid2)
+ {
+ case TIMEOID:
+ val2 = castTimeToTimeTz(val2, useTz);
+ cmpfunc = timetz_cmp;
+
+ break;
+
+ case TIMETZOID:
+ cmpfunc = timetz_cmp;
+
+ break;
+
+ case DATEOID:
+ case TIMESTAMPOID:
+ case TIMESTAMPTZOID:
+ *cast_error = true; /* uncomparable types */
+ return 0;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u",
+ typid2);
+ }
+ break;
+
+ case TIMESTAMPOID:
+ switch (typid2)
+ {
+ case DATEOID:
+ return -cmpDateToTimestamp(DatumGetDateADT(val2),
+ DatumGetTimestamp(val1),
+ useTz);
+
+ case TIMESTAMPOID:
+ cmpfunc = timestamp_cmp;
+
+ break;
+
+ case TIMESTAMPTZOID:
+ return cmpTimestampToTimestampTz(DatumGetTimestamp(val1),
+ DatumGetTimestampTz(val2),
+ useTz);
+
+ case TIMEOID:
+ case TIMETZOID:
+ *cast_error = true; /* uncomparable types */
+ return 0;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u",
+ typid2);
+ }
+ break;
+
+ case TIMESTAMPTZOID:
+ switch (typid2)
+ {
+ case DATEOID:
+ return -cmpDateToTimestampTz(DatumGetDateADT(val2),
+ DatumGetTimestampTz(val1),
+ useTz);
+
+ case TIMESTAMPOID:
+ return -cmpTimestampToTimestampTz(DatumGetTimestamp(val2),
+ DatumGetTimestampTz(val1),
+ useTz);
+
+ case TIMESTAMPTZOID:
+ cmpfunc = timestamp_cmp;
+
+ break;
+
+ case TIMEOID:
+ case TIMETZOID:
+ *cast_error = true; /* uncomparable types */
+ return 0;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u",
+ typid2);
+ }
+ break;
+
+ default:
+ elog(ERROR, "unrecognized SQL/JSON datetime type oid: %u", typid1);
+ }
+
+ if (*cast_error)
+ return 0; /* cast error */
+
+ return DatumGetInt32(DirectFunctionCall2(cmpfunc, val1, val2));
+}
diff --git a/src/backend/utils/adt/jsonpath_gram.c b/src/backend/utils/adt/jsonpath_gram.c
new file mode 100644
index 0000000..a09bcfd
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_gram.c
@@ -0,0 +1,2416 @@
+/* A Bison parser, made by GNU Bison 3.7.5. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30705
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.7.5"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+/* Substitute the variable and function names. */
+#define yyparse jsonpath_yyparse
+#define yylex jsonpath_yylex
+#define yyerror jsonpath_yyerror
+#define yydebug jsonpath_yydebug
+#define yynerrs jsonpath_yynerrs
+
+/* First part of user prologue. */
+#line 1 "jsonpath_gram.y"
+
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_gram.y
+ * Grammar definitions for jsonpath datatype
+ *
+ * Transforms tokenized jsonpath into tree of JsonPathParseItem structs.
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath_gram.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_collation.h"
+#include "fmgr.h"
+#include "miscadmin.h"
+#include "nodes/pg_list.h"
+#include "regex/regex.h"
+#include "utils/builtins.h"
+#include "utils/jsonpath.h"
+
+/* struct JsonPathString is shared between scan and gram */
+typedef struct JsonPathString
+{
+ char *val;
+ int len;
+ int total;
+} JsonPathString;
+
+union YYSTYPE;
+
+/* flex 2.5.4 doesn't bother with a decl for this */
+int jsonpath_yylex(union YYSTYPE *yylval_param);
+int jsonpath_yyparse(JsonPathParseResult **result);
+void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
+
+static JsonPathParseItem *makeItemType(JsonPathItemType type);
+static JsonPathParseItem *makeItemString(JsonPathString *s);
+static JsonPathParseItem *makeItemVariable(JsonPathString *s);
+static JsonPathParseItem *makeItemKey(JsonPathString *s);
+static JsonPathParseItem *makeItemNumeric(JsonPathString *s);
+static JsonPathParseItem *makeItemBool(bool val);
+static JsonPathParseItem *makeItemBinary(JsonPathItemType type,
+ JsonPathParseItem *la,
+ JsonPathParseItem *ra);
+static JsonPathParseItem *makeItemUnary(JsonPathItemType type,
+ JsonPathParseItem *a);
+static JsonPathParseItem *makeItemList(List *list);
+static JsonPathParseItem *makeIndexArray(List *list);
+static JsonPathParseItem *makeAny(int first, int last);
+static JsonPathParseItem *makeItemLikeRegex(JsonPathParseItem *expr,
+ JsonPathString *pattern,
+ JsonPathString *flags);
+
+/*
+ * Bison doesn't allocate anything that needs to live across parser calls,
+ * so we can easily have it use palloc instead of malloc. This prevents
+ * memory leaks if we error out during parsing. Note this only works with
+ * bison >= 2.0. However, in bison 1.875 the default is to use alloca()
+ * if possible, so there's not really much problem anyhow, at least if
+ * you're building with gcc.
+ */
+#define YYMALLOC palloc
+#define YYFREE pfree
+
+
+#line 148 "jsonpath_gram.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int jsonpath_yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ TO_P = 258, /* TO_P */
+ NULL_P = 259, /* NULL_P */
+ TRUE_P = 260, /* TRUE_P */
+ FALSE_P = 261, /* FALSE_P */
+ IS_P = 262, /* IS_P */
+ UNKNOWN_P = 263, /* UNKNOWN_P */
+ EXISTS_P = 264, /* EXISTS_P */
+ IDENT_P = 265, /* IDENT_P */
+ STRING_P = 266, /* STRING_P */
+ NUMERIC_P = 267, /* NUMERIC_P */
+ INT_P = 268, /* INT_P */
+ VARIABLE_P = 269, /* VARIABLE_P */
+ OR_P = 270, /* OR_P */
+ AND_P = 271, /* AND_P */
+ NOT_P = 272, /* NOT_P */
+ LESS_P = 273, /* LESS_P */
+ LESSEQUAL_P = 274, /* LESSEQUAL_P */
+ EQUAL_P = 275, /* EQUAL_P */
+ NOTEQUAL_P = 276, /* NOTEQUAL_P */
+ GREATEREQUAL_P = 277, /* GREATEREQUAL_P */
+ GREATER_P = 278, /* GREATER_P */
+ ANY_P = 279, /* ANY_P */
+ STRICT_P = 280, /* STRICT_P */
+ LAX_P = 281, /* LAX_P */
+ LAST_P = 282, /* LAST_P */
+ STARTS_P = 283, /* STARTS_P */
+ WITH_P = 284, /* WITH_P */
+ LIKE_REGEX_P = 285, /* LIKE_REGEX_P */
+ FLAG_P = 286, /* FLAG_P */
+ ABS_P = 287, /* ABS_P */
+ SIZE_P = 288, /* SIZE_P */
+ TYPE_P = 289, /* TYPE_P */
+ FLOOR_P = 290, /* FLOOR_P */
+ DOUBLE_P = 291, /* DOUBLE_P */
+ CEILING_P = 292, /* CEILING_P */
+ KEYVALUE_P = 293, /* KEYVALUE_P */
+ DATETIME_P = 294, /* DATETIME_P */
+ UMINUS = 295 /* UMINUS */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 80 "jsonpath_gram.y"
+
+ JsonPathString str;
+ List *elems; /* list of JsonPathParseItem */
+ List *indexs; /* list of integers */
+ JsonPathParseItem *value;
+ JsonPathParseResult *result;
+ JsonPathItemType optype;
+ bool boolean;
+ int integer;
+
+#line 246 "jsonpath_gram.c"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+int jsonpath_yyparse (JsonPathParseResult **result);
+
+
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_TO_P = 3, /* TO_P */
+ YYSYMBOL_NULL_P = 4, /* NULL_P */
+ YYSYMBOL_TRUE_P = 5, /* TRUE_P */
+ YYSYMBOL_FALSE_P = 6, /* FALSE_P */
+ YYSYMBOL_IS_P = 7, /* IS_P */
+ YYSYMBOL_UNKNOWN_P = 8, /* UNKNOWN_P */
+ YYSYMBOL_EXISTS_P = 9, /* EXISTS_P */
+ YYSYMBOL_IDENT_P = 10, /* IDENT_P */
+ YYSYMBOL_STRING_P = 11, /* STRING_P */
+ YYSYMBOL_NUMERIC_P = 12, /* NUMERIC_P */
+ YYSYMBOL_INT_P = 13, /* INT_P */
+ YYSYMBOL_VARIABLE_P = 14, /* VARIABLE_P */
+ YYSYMBOL_OR_P = 15, /* OR_P */
+ YYSYMBOL_AND_P = 16, /* AND_P */
+ YYSYMBOL_NOT_P = 17, /* NOT_P */
+ YYSYMBOL_LESS_P = 18, /* LESS_P */
+ YYSYMBOL_LESSEQUAL_P = 19, /* LESSEQUAL_P */
+ YYSYMBOL_EQUAL_P = 20, /* EQUAL_P */
+ YYSYMBOL_NOTEQUAL_P = 21, /* NOTEQUAL_P */
+ YYSYMBOL_GREATEREQUAL_P = 22, /* GREATEREQUAL_P */
+ YYSYMBOL_GREATER_P = 23, /* GREATER_P */
+ YYSYMBOL_ANY_P = 24, /* ANY_P */
+ YYSYMBOL_STRICT_P = 25, /* STRICT_P */
+ YYSYMBOL_LAX_P = 26, /* LAX_P */
+ YYSYMBOL_LAST_P = 27, /* LAST_P */
+ YYSYMBOL_STARTS_P = 28, /* STARTS_P */
+ YYSYMBOL_WITH_P = 29, /* WITH_P */
+ YYSYMBOL_LIKE_REGEX_P = 30, /* LIKE_REGEX_P */
+ YYSYMBOL_FLAG_P = 31, /* FLAG_P */
+ YYSYMBOL_ABS_P = 32, /* ABS_P */
+ YYSYMBOL_SIZE_P = 33, /* SIZE_P */
+ YYSYMBOL_TYPE_P = 34, /* TYPE_P */
+ YYSYMBOL_FLOOR_P = 35, /* FLOOR_P */
+ YYSYMBOL_DOUBLE_P = 36, /* DOUBLE_P */
+ YYSYMBOL_CEILING_P = 37, /* CEILING_P */
+ YYSYMBOL_KEYVALUE_P = 38, /* KEYVALUE_P */
+ YYSYMBOL_DATETIME_P = 39, /* DATETIME_P */
+ YYSYMBOL_40_ = 40, /* '+' */
+ YYSYMBOL_41_ = 41, /* '-' */
+ YYSYMBOL_42_ = 42, /* '*' */
+ YYSYMBOL_43_ = 43, /* '/' */
+ YYSYMBOL_44_ = 44, /* '%' */
+ YYSYMBOL_UMINUS = 45, /* UMINUS */
+ YYSYMBOL_46_ = 46, /* '(' */
+ YYSYMBOL_47_ = 47, /* ')' */
+ YYSYMBOL_48_ = 48, /* '$' */
+ YYSYMBOL_49_ = 49, /* '@' */
+ YYSYMBOL_50_ = 50, /* ',' */
+ YYSYMBOL_51_ = 51, /* '[' */
+ YYSYMBOL_52_ = 52, /* ']' */
+ YYSYMBOL_53_ = 53, /* '{' */
+ YYSYMBOL_54_ = 54, /* '}' */
+ YYSYMBOL_55_ = 55, /* '.' */
+ YYSYMBOL_56_ = 56, /* '?' */
+ YYSYMBOL_YYACCEPT = 57, /* $accept */
+ YYSYMBOL_result = 58, /* result */
+ YYSYMBOL_expr_or_predicate = 59, /* expr_or_predicate */
+ YYSYMBOL_mode = 60, /* mode */
+ YYSYMBOL_scalar_value = 61, /* scalar_value */
+ YYSYMBOL_comp_op = 62, /* comp_op */
+ YYSYMBOL_delimited_predicate = 63, /* delimited_predicate */
+ YYSYMBOL_predicate = 64, /* predicate */
+ YYSYMBOL_starts_with_initial = 65, /* starts_with_initial */
+ YYSYMBOL_path_primary = 66, /* path_primary */
+ YYSYMBOL_accessor_expr = 67, /* accessor_expr */
+ YYSYMBOL_expr = 68, /* expr */
+ YYSYMBOL_index_elem = 69, /* index_elem */
+ YYSYMBOL_index_list = 70, /* index_list */
+ YYSYMBOL_array_accessor = 71, /* array_accessor */
+ YYSYMBOL_any_level = 72, /* any_level */
+ YYSYMBOL_any_path = 73, /* any_path */
+ YYSYMBOL_accessor_op = 74, /* accessor_op */
+ YYSYMBOL_datetime_template = 75, /* datetime_template */
+ YYSYMBOL_opt_datetime_template = 76, /* opt_datetime_template */
+ YYSYMBOL_key = 77, /* key */
+ YYSYMBOL_key_name = 78, /* key_name */
+ YYSYMBOL_method = 79 /* method */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_uint8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 5
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 239
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 57
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 23
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 104
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 143
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 295
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 48, 44, 2, 2,
+ 46, 47, 42, 40, 50, 41, 55, 43, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 56, 49, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 51, 2, 52, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 53, 2, 54, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 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, 37, 38, 39, 45
+};
+
+#if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 130, 130, 136, 140, 141, 145, 146, 147, 151,
+ 152, 153, 154, 155, 156, 157, 161, 162, 163, 164,
+ 165, 166, 170, 171, 175, 176, 177, 178, 179, 180,
+ 182, 184, 185, 190, 191, 195, 196, 197, 198, 202,
+ 203, 204, 205, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 221, 222, 226, 227, 231, 232, 236, 237,
+ 241, 242, 243, 248, 249, 250, 251, 252, 253, 255,
+ 259, 263, 264, 268, 272, 273, 274, 275, 276, 277,
+ 278, 279, 280, 281, 282, 283, 284, 285, 286, 287,
+ 288, 289, 290, 291, 292, 293, 294, 295, 299, 300,
+ 301, 302, 303, 304, 305
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "TO_P", "NULL_P",
+ "TRUE_P", "FALSE_P", "IS_P", "UNKNOWN_P", "EXISTS_P", "IDENT_P",
+ "STRING_P", "NUMERIC_P", "INT_P", "VARIABLE_P", "OR_P", "AND_P", "NOT_P",
+ "LESS_P", "LESSEQUAL_P", "EQUAL_P", "NOTEQUAL_P", "GREATEREQUAL_P",
+ "GREATER_P", "ANY_P", "STRICT_P", "LAX_P", "LAST_P", "STARTS_P",
+ "WITH_P", "LIKE_REGEX_P", "FLAG_P", "ABS_P", "SIZE_P", "TYPE_P",
+ "FLOOR_P", "DOUBLE_P", "CEILING_P", "KEYVALUE_P", "DATETIME_P", "'+'",
+ "'-'", "'*'", "'/'", "'%'", "UMINUS", "'('", "')'", "'$'", "'@'", "','",
+ "'['", "']'", "'{'", "'}'", "'.'", "'?'", "$accept", "result",
+ "expr_or_predicate", "mode", "scalar_value", "comp_op",
+ "delimited_predicate", "predicate", "starts_with_initial",
+ "path_primary", "accessor_expr", "expr", "index_elem", "index_list",
+ "array_accessor", "any_level", "any_path", "accessor_op",
+ "datetime_template", "opt_datetime_template", "key", "key_name",
+ "method", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_int16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 43, 45, 42, 47, 37, 295, 40, 41, 36, 64,
+ 44, 91, 93, 123, 125, 46, 63
+};
+#endif
+
+#define YYPACT_NINF (-44)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-105)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ 7, -44, -44, 18, 51, -44, -44, -44, -44, -43,
+ -44, -44, -44, -44, -3, -44, 114, 114, 51, -44,
+ -44, -44, -44, -44, 10, -44, -35, 195, 114, 51,
+ -44, 51, -44, -44, 14, 165, 51, 51, 68, 140,
+ -9, -44, -44, -44, -44, -44, -44, -44, -44, 37,
+ 60, 114, 114, 114, 114, 114, 114, 46, 20, 195,
+ 30, 3, -35, 59, -44, 24, -2, -44, -41, -44,
+ -44, -44, -44, -44, -44, -44, -44, -44, 31, -44,
+ -44, -44, -44, -44, -44, -44, 48, 50, 52, 61,
+ 67, 69, 78, 83, -44, -44, -44, -44, 84, 51,
+ 17, 100, 79, 79, -44, -44, -44, 62, -44, -44,
+ -35, 75, -44, -44, -44, 114, 114, -44, -8, 121,
+ 86, 54, -44, -44, -44, 123, -44, 62, -44, -44,
+ -44, -1, -44, -44, 88, -44, -44, -44, -8, -44,
+ -44, 82, -44
+};
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 8, 6, 7, 0, 0, 1, 10, 11, 12, 0,
+ 9, 13, 14, 15, 0, 38, 0, 0, 0, 36,
+ 37, 2, 35, 24, 5, 39, 43, 4, 0, 0,
+ 28, 0, 45, 46, 0, 0, 0, 0, 0, 0,
+ 0, 65, 42, 18, 20, 16, 17, 21, 19, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 22, 44, 27, 26, 0, 52, 54, 0, 76,
+ 77, 78, 79, 80, 81, 82, 74, 75, 60, 83,
+ 84, 93, 94, 95, 96, 97, 85, 86, 87, 88,
+ 89, 90, 92, 91, 64, 66, 63, 73, 0, 0,
+ 0, 31, 47, 48, 49, 50, 51, 25, 23, 22,
+ 0, 0, 41, 40, 56, 0, 0, 57, 0, 72,
+ 0, 0, 33, 34, 30, 0, 29, 53, 55, 58,
+ 59, 0, 70, 71, 0, 67, 69, 32, 0, 61,
+ 68, 0, 62
+};
+
+ /* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -44, -44, -44, -44, -44, -44, 124, -14, -44, -44,
+ -44, -4, 21, -44, -44, 1, -44, -18, -44, -44,
+ -44, -44, -44
+};
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_uint8 yydefgoto[] =
+{
+ 0, 3, 21, 4, 22, 56, 23, 24, 124, 25,
+ 26, 59, 67, 68, 41, 131, 95, 112, 133, 134,
+ 96, 97, 98
+};
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int16 yytable[] =
+{
+ 27, 115, 138, 28, 34, 129, 9, -3, 42, 116,
+ 111, 117, 32, 33, 35, 58, 38, 60, 5, 130,
+ 39, 40, 63, 64, 57, 36, 37, 35, 122, 36,
+ 37, 123, 1, 2, 66, 36, 37, 99, 51, 52,
+ 53, 54, 55, 29, 113, 36, 37, 102, 103, 104,
+ 105, 106, 107, 139, 38, 6, 7, 8, 39, 40,
+ 9, 61, 10, 11, 12, 13, 100, 109, 14, 36,
+ 37, 101, 6, 7, 8, 37, 114, 110, 15, 10,
+ 11, 12, 13, 126, 118, 121, 51, 52, 53, 54,
+ 55, 16, 17, 108, -98, 15, -99, 18, -100, 19,
+ 20, 136, 51, 52, 53, 54, 55, -101, 16, 17,
+ 65, 127, 66, -102, 31, -103, 19, 20, 6, 7,
+ 8, 53, 54, 55, -104, 10, 11, 12, 13, 119,
+ 120, 125, 132, 135, 137, 140, 142, 128, 30, 141,
+ 0, 15, 0, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 0, 0, 16, 17, 0, 0, 0, 0,
+ 31, 0, 19, 20, 78, 79, 80, 81, 82, 83,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ 0, 0, 94, 43, 44, 45, 46, 47, 48, 0,
+ 0, 0, 0, 49, 0, 50, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 51, 52, 53, 54, 55,
+ 0, 0, 62, 43, 44, 45, 46, 47, 48, 0,
+ 0, 0, 0, 49, 0, 50, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 51, 52, 53, 54, 55
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 4, 3, 3, 46, 18, 13, 9, 0, 26, 50,
+ 7, 52, 16, 17, 18, 29, 51, 31, 0, 27,
+ 55, 56, 36, 37, 28, 15, 16, 31, 11, 15,
+ 16, 14, 25, 26, 38, 15, 16, 46, 40, 41,
+ 42, 43, 44, 46, 62, 15, 16, 51, 52, 53,
+ 54, 55, 56, 54, 51, 4, 5, 6, 55, 56,
+ 9, 47, 11, 12, 13, 14, 29, 47, 17, 15,
+ 16, 11, 4, 5, 6, 16, 52, 47, 27, 11,
+ 12, 13, 14, 8, 53, 99, 40, 41, 42, 43,
+ 44, 40, 41, 47, 46, 27, 46, 46, 46, 48,
+ 49, 47, 40, 41, 42, 43, 44, 46, 40, 41,
+ 42, 115, 116, 46, 46, 46, 48, 49, 4, 5,
+ 6, 42, 43, 44, 46, 11, 12, 13, 14, 46,
+ 46, 31, 11, 47, 11, 47, 54, 116, 14, 138,
+ -1, 27, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, 40, 41, -1, -1, -1, -1,
+ 46, -1, 48, 49, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ -1, -1, 42, 18, 19, 20, 21, 22, 23, -1,
+ -1, -1, -1, 28, -1, 30, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 40, 41, 42, 43, 44,
+ -1, -1, 47, 18, 19, 20, 21, 22, 23, -1,
+ -1, -1, -1, 28, -1, 30, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 40, 41, 42, 43, 44
+};
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 25, 26, 58, 60, 0, 4, 5, 6, 9,
+ 11, 12, 13, 14, 17, 27, 40, 41, 46, 48,
+ 49, 59, 61, 63, 64, 66, 67, 68, 46, 46,
+ 63, 46, 68, 68, 64, 68, 15, 16, 51, 55,
+ 56, 71, 74, 18, 19, 20, 21, 22, 23, 28,
+ 30, 40, 41, 42, 43, 44, 62, 68, 64, 68,
+ 64, 47, 47, 64, 64, 42, 68, 69, 70, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 42, 73, 77, 78, 79, 46,
+ 29, 11, 68, 68, 68, 68, 68, 68, 47, 47,
+ 47, 7, 74, 74, 52, 3, 50, 52, 53, 46,
+ 46, 64, 11, 14, 65, 31, 8, 68, 69, 13,
+ 27, 72, 11, 75, 76, 47, 47, 11, 3, 54,
+ 47, 72, 54
+};
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 57, 58, 58, 59, 59, 60, 60, 60, 61,
+ 61, 61, 61, 61, 61, 61, 62, 62, 62, 62,
+ 62, 62, 63, 63, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 65, 65, 66, 66, 66, 66, 67,
+ 67, 67, 67, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 69, 69, 70, 70, 71, 71, 72, 72,
+ 73, 73, 73, 74, 74, 74, 74, 74, 74, 74,
+ 75, 76, 76, 77, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 79, 79,
+ 79, 79, 79, 79, 79
+};
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 2, 0, 1, 1, 1, 1, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 3, 4, 1, 3, 3, 3, 2, 5,
+ 4, 3, 5, 1, 1, 1, 1, 1, 1, 1,
+ 4, 4, 2, 1, 3, 2, 2, 3, 3, 3,
+ 3, 3, 1, 3, 1, 3, 3, 3, 1, 1,
+ 1, 4, 6, 2, 2, 1, 2, 4, 5, 4,
+ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (result, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+# ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value, result); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, JsonPathParseResult **result)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ YY_USE (result);
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yykind < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
+# endif
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, JsonPathParseResult **result)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep, result);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule, JsonPathParseResult **result)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)], result);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule, result); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep, JsonPathParseResult **result)
+{
+ YY_USE (yyvaluep);
+ YY_USE (result);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (JsonPathParseResult **result)
+{
+/* Lookahead token kind. */
+int yychar;
+
+
+/* The semantic value of the lookahead symbol. */
+/* Default value used for initialization, for pacifying older GCCs
+ or non-GCC compilers. */
+YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
+YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
+
+ /* Number of syntax errors so far. */
+ int yynerrs = 0;
+
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex (&yylval);
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2: /* result: mode expr_or_predicate */
+#line 130 "jsonpath_gram.y"
+ {
+ *result = palloc(sizeof(JsonPathParseResult));
+ (*result)->expr = (yyvsp[0].value);
+ (*result)->lax = (yyvsp[-1].boolean);
+ (void) yynerrs;
+ }
+#line 1451 "jsonpath_gram.c"
+ break;
+
+ case 3: /* result: %empty */
+#line 136 "jsonpath_gram.y"
+ { *result = NULL; }
+#line 1457 "jsonpath_gram.c"
+ break;
+
+ case 4: /* expr_or_predicate: expr */
+#line 140 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1463 "jsonpath_gram.c"
+ break;
+
+ case 5: /* expr_or_predicate: predicate */
+#line 141 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1469 "jsonpath_gram.c"
+ break;
+
+ case 6: /* mode: STRICT_P */
+#line 145 "jsonpath_gram.y"
+ { (yyval.boolean) = false; }
+#line 1475 "jsonpath_gram.c"
+ break;
+
+ case 7: /* mode: LAX_P */
+#line 146 "jsonpath_gram.y"
+ { (yyval.boolean) = true; }
+#line 1481 "jsonpath_gram.c"
+ break;
+
+ case 8: /* mode: %empty */
+#line 147 "jsonpath_gram.y"
+ { (yyval.boolean) = true; }
+#line 1487 "jsonpath_gram.c"
+ break;
+
+ case 9: /* scalar_value: STRING_P */
+#line 151 "jsonpath_gram.y"
+ { (yyval.value) = makeItemString(&(yyvsp[0].str)); }
+#line 1493 "jsonpath_gram.c"
+ break;
+
+ case 10: /* scalar_value: NULL_P */
+#line 152 "jsonpath_gram.y"
+ { (yyval.value) = makeItemString(NULL); }
+#line 1499 "jsonpath_gram.c"
+ break;
+
+ case 11: /* scalar_value: TRUE_P */
+#line 153 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBool(true); }
+#line 1505 "jsonpath_gram.c"
+ break;
+
+ case 12: /* scalar_value: FALSE_P */
+#line 154 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBool(false); }
+#line 1511 "jsonpath_gram.c"
+ break;
+
+ case 13: /* scalar_value: NUMERIC_P */
+#line 155 "jsonpath_gram.y"
+ { (yyval.value) = makeItemNumeric(&(yyvsp[0].str)); }
+#line 1517 "jsonpath_gram.c"
+ break;
+
+ case 14: /* scalar_value: INT_P */
+#line 156 "jsonpath_gram.y"
+ { (yyval.value) = makeItemNumeric(&(yyvsp[0].str)); }
+#line 1523 "jsonpath_gram.c"
+ break;
+
+ case 15: /* scalar_value: VARIABLE_P */
+#line 157 "jsonpath_gram.y"
+ { (yyval.value) = makeItemVariable(&(yyvsp[0].str)); }
+#line 1529 "jsonpath_gram.c"
+ break;
+
+ case 16: /* comp_op: EQUAL_P */
+#line 161 "jsonpath_gram.y"
+ { (yyval.optype) = jpiEqual; }
+#line 1535 "jsonpath_gram.c"
+ break;
+
+ case 17: /* comp_op: NOTEQUAL_P */
+#line 162 "jsonpath_gram.y"
+ { (yyval.optype) = jpiNotEqual; }
+#line 1541 "jsonpath_gram.c"
+ break;
+
+ case 18: /* comp_op: LESS_P */
+#line 163 "jsonpath_gram.y"
+ { (yyval.optype) = jpiLess; }
+#line 1547 "jsonpath_gram.c"
+ break;
+
+ case 19: /* comp_op: GREATER_P */
+#line 164 "jsonpath_gram.y"
+ { (yyval.optype) = jpiGreater; }
+#line 1553 "jsonpath_gram.c"
+ break;
+
+ case 20: /* comp_op: LESSEQUAL_P */
+#line 165 "jsonpath_gram.y"
+ { (yyval.optype) = jpiLessOrEqual; }
+#line 1559 "jsonpath_gram.c"
+ break;
+
+ case 21: /* comp_op: GREATEREQUAL_P */
+#line 166 "jsonpath_gram.y"
+ { (yyval.optype) = jpiGreaterOrEqual; }
+#line 1565 "jsonpath_gram.c"
+ break;
+
+ case 22: /* delimited_predicate: '(' predicate ')' */
+#line 170 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[-1].value); }
+#line 1571 "jsonpath_gram.c"
+ break;
+
+ case 23: /* delimited_predicate: EXISTS_P '(' expr ')' */
+#line 171 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiExists, (yyvsp[-1].value)); }
+#line 1577 "jsonpath_gram.c"
+ break;
+
+ case 24: /* predicate: delimited_predicate */
+#line 175 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1583 "jsonpath_gram.c"
+ break;
+
+ case 25: /* predicate: expr comp_op expr */
+#line 176 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary((yyvsp[-1].optype), (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1589 "jsonpath_gram.c"
+ break;
+
+ case 26: /* predicate: predicate AND_P predicate */
+#line 177 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiAnd, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1595 "jsonpath_gram.c"
+ break;
+
+ case 27: /* predicate: predicate OR_P predicate */
+#line 178 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiOr, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1601 "jsonpath_gram.c"
+ break;
+
+ case 28: /* predicate: NOT_P delimited_predicate */
+#line 179 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiNot, (yyvsp[0].value)); }
+#line 1607 "jsonpath_gram.c"
+ break;
+
+ case 29: /* predicate: '(' predicate ')' IS_P UNKNOWN_P */
+#line 181 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiIsUnknown, (yyvsp[-3].value)); }
+#line 1613 "jsonpath_gram.c"
+ break;
+
+ case 30: /* predicate: expr STARTS_P WITH_P starts_with_initial */
+#line 183 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiStartsWith, (yyvsp[-3].value), (yyvsp[0].value)); }
+#line 1619 "jsonpath_gram.c"
+ break;
+
+ case 31: /* predicate: expr LIKE_REGEX_P STRING_P */
+#line 184 "jsonpath_gram.y"
+ { (yyval.value) = makeItemLikeRegex((yyvsp[-2].value), &(yyvsp[0].str), NULL); }
+#line 1625 "jsonpath_gram.c"
+ break;
+
+ case 32: /* predicate: expr LIKE_REGEX_P STRING_P FLAG_P STRING_P */
+#line 186 "jsonpath_gram.y"
+ { (yyval.value) = makeItemLikeRegex((yyvsp[-4].value), &(yyvsp[-2].str), &(yyvsp[0].str)); }
+#line 1631 "jsonpath_gram.c"
+ break;
+
+ case 33: /* starts_with_initial: STRING_P */
+#line 190 "jsonpath_gram.y"
+ { (yyval.value) = makeItemString(&(yyvsp[0].str)); }
+#line 1637 "jsonpath_gram.c"
+ break;
+
+ case 34: /* starts_with_initial: VARIABLE_P */
+#line 191 "jsonpath_gram.y"
+ { (yyval.value) = makeItemVariable(&(yyvsp[0].str)); }
+#line 1643 "jsonpath_gram.c"
+ break;
+
+ case 35: /* path_primary: scalar_value */
+#line 195 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1649 "jsonpath_gram.c"
+ break;
+
+ case 36: /* path_primary: '$' */
+#line 196 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType(jpiRoot); }
+#line 1655 "jsonpath_gram.c"
+ break;
+
+ case 37: /* path_primary: '@' */
+#line 197 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType(jpiCurrent); }
+#line 1661 "jsonpath_gram.c"
+ break;
+
+ case 38: /* path_primary: LAST_P */
+#line 198 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType(jpiLast); }
+#line 1667 "jsonpath_gram.c"
+ break;
+
+ case 39: /* accessor_expr: path_primary */
+#line 202 "jsonpath_gram.y"
+ { (yyval.elems) = list_make1((yyvsp[0].value)); }
+#line 1673 "jsonpath_gram.c"
+ break;
+
+ case 40: /* accessor_expr: '(' expr ')' accessor_op */
+#line 203 "jsonpath_gram.y"
+ { (yyval.elems) = list_make2((yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1679 "jsonpath_gram.c"
+ break;
+
+ case 41: /* accessor_expr: '(' predicate ')' accessor_op */
+#line 204 "jsonpath_gram.y"
+ { (yyval.elems) = list_make2((yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1685 "jsonpath_gram.c"
+ break;
+
+ case 42: /* accessor_expr: accessor_expr accessor_op */
+#line 205 "jsonpath_gram.y"
+ { (yyval.elems) = lappend((yyvsp[-1].elems), (yyvsp[0].value)); }
+#line 1691 "jsonpath_gram.c"
+ break;
+
+ case 43: /* expr: accessor_expr */
+#line 209 "jsonpath_gram.y"
+ { (yyval.value) = makeItemList((yyvsp[0].elems)); }
+#line 1697 "jsonpath_gram.c"
+ break;
+
+ case 44: /* expr: '(' expr ')' */
+#line 210 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[-1].value); }
+#line 1703 "jsonpath_gram.c"
+ break;
+
+ case 45: /* expr: '+' expr */
+#line 211 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiPlus, (yyvsp[0].value)); }
+#line 1709 "jsonpath_gram.c"
+ break;
+
+ case 46: /* expr: '-' expr */
+#line 212 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiMinus, (yyvsp[0].value)); }
+#line 1715 "jsonpath_gram.c"
+ break;
+
+ case 47: /* expr: expr '+' expr */
+#line 213 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiAdd, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1721 "jsonpath_gram.c"
+ break;
+
+ case 48: /* expr: expr '-' expr */
+#line 214 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiSub, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1727 "jsonpath_gram.c"
+ break;
+
+ case 49: /* expr: expr '*' expr */
+#line 215 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiMul, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1733 "jsonpath_gram.c"
+ break;
+
+ case 50: /* expr: expr '/' expr */
+#line 216 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiDiv, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1739 "jsonpath_gram.c"
+ break;
+
+ case 51: /* expr: expr '%' expr */
+#line 217 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiMod, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1745 "jsonpath_gram.c"
+ break;
+
+ case 52: /* index_elem: expr */
+#line 221 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiSubscript, (yyvsp[0].value), NULL); }
+#line 1751 "jsonpath_gram.c"
+ break;
+
+ case 53: /* index_elem: expr TO_P expr */
+#line 222 "jsonpath_gram.y"
+ { (yyval.value) = makeItemBinary(jpiSubscript, (yyvsp[-2].value), (yyvsp[0].value)); }
+#line 1757 "jsonpath_gram.c"
+ break;
+
+ case 54: /* index_list: index_elem */
+#line 226 "jsonpath_gram.y"
+ { (yyval.indexs) = list_make1((yyvsp[0].value)); }
+#line 1763 "jsonpath_gram.c"
+ break;
+
+ case 55: /* index_list: index_list ',' index_elem */
+#line 227 "jsonpath_gram.y"
+ { (yyval.indexs) = lappend((yyvsp[-2].indexs), (yyvsp[0].value)); }
+#line 1769 "jsonpath_gram.c"
+ break;
+
+ case 56: /* array_accessor: '[' '*' ']' */
+#line 231 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType(jpiAnyArray); }
+#line 1775 "jsonpath_gram.c"
+ break;
+
+ case 57: /* array_accessor: '[' index_list ']' */
+#line 232 "jsonpath_gram.y"
+ { (yyval.value) = makeIndexArray((yyvsp[-1].indexs)); }
+#line 1781 "jsonpath_gram.c"
+ break;
+
+ case 58: /* any_level: INT_P */
+#line 236 "jsonpath_gram.y"
+ { (yyval.integer) = pg_strtoint32((yyvsp[0].str).val); }
+#line 1787 "jsonpath_gram.c"
+ break;
+
+ case 59: /* any_level: LAST_P */
+#line 237 "jsonpath_gram.y"
+ { (yyval.integer) = -1; }
+#line 1793 "jsonpath_gram.c"
+ break;
+
+ case 60: /* any_path: ANY_P */
+#line 241 "jsonpath_gram.y"
+ { (yyval.value) = makeAny(0, -1); }
+#line 1799 "jsonpath_gram.c"
+ break;
+
+ case 61: /* any_path: ANY_P '{' any_level '}' */
+#line 242 "jsonpath_gram.y"
+ { (yyval.value) = makeAny((yyvsp[-1].integer), (yyvsp[-1].integer)); }
+#line 1805 "jsonpath_gram.c"
+ break;
+
+ case 62: /* any_path: ANY_P '{' any_level TO_P any_level '}' */
+#line 244 "jsonpath_gram.y"
+ { (yyval.value) = makeAny((yyvsp[-3].integer), (yyvsp[-1].integer)); }
+#line 1811 "jsonpath_gram.c"
+ break;
+
+ case 63: /* accessor_op: '.' key */
+#line 248 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1817 "jsonpath_gram.c"
+ break;
+
+ case 64: /* accessor_op: '.' '*' */
+#line 249 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType(jpiAnyKey); }
+#line 1823 "jsonpath_gram.c"
+ break;
+
+ case 65: /* accessor_op: array_accessor */
+#line 250 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1829 "jsonpath_gram.c"
+ break;
+
+ case 66: /* accessor_op: '.' any_path */
+#line 251 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1835 "jsonpath_gram.c"
+ break;
+
+ case 67: /* accessor_op: '.' method '(' ')' */
+#line 252 "jsonpath_gram.y"
+ { (yyval.value) = makeItemType((yyvsp[-2].optype)); }
+#line 1841 "jsonpath_gram.c"
+ break;
+
+ case 68: /* accessor_op: '.' DATETIME_P '(' opt_datetime_template ')' */
+#line 254 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiDatetime, (yyvsp[-1].value)); }
+#line 1847 "jsonpath_gram.c"
+ break;
+
+ case 69: /* accessor_op: '?' '(' predicate ')' */
+#line 255 "jsonpath_gram.y"
+ { (yyval.value) = makeItemUnary(jpiFilter, (yyvsp[-1].value)); }
+#line 1853 "jsonpath_gram.c"
+ break;
+
+ case 70: /* datetime_template: STRING_P */
+#line 259 "jsonpath_gram.y"
+ { (yyval.value) = makeItemString(&(yyvsp[0].str)); }
+#line 1859 "jsonpath_gram.c"
+ break;
+
+ case 71: /* opt_datetime_template: datetime_template */
+#line 263 "jsonpath_gram.y"
+ { (yyval.value) = (yyvsp[0].value); }
+#line 1865 "jsonpath_gram.c"
+ break;
+
+ case 72: /* opt_datetime_template: %empty */
+#line 264 "jsonpath_gram.y"
+ { (yyval.value) = NULL; }
+#line 1871 "jsonpath_gram.c"
+ break;
+
+ case 73: /* key: key_name */
+#line 268 "jsonpath_gram.y"
+ { (yyval.value) = makeItemKey(&(yyvsp[0].str)); }
+#line 1877 "jsonpath_gram.c"
+ break;
+
+ case 98: /* method: ABS_P */
+#line 299 "jsonpath_gram.y"
+ { (yyval.optype) = jpiAbs; }
+#line 1883 "jsonpath_gram.c"
+ break;
+
+ case 99: /* method: SIZE_P */
+#line 300 "jsonpath_gram.y"
+ { (yyval.optype) = jpiSize; }
+#line 1889 "jsonpath_gram.c"
+ break;
+
+ case 100: /* method: TYPE_P */
+#line 301 "jsonpath_gram.y"
+ { (yyval.optype) = jpiType; }
+#line 1895 "jsonpath_gram.c"
+ break;
+
+ case 101: /* method: FLOOR_P */
+#line 302 "jsonpath_gram.y"
+ { (yyval.optype) = jpiFloor; }
+#line 1901 "jsonpath_gram.c"
+ break;
+
+ case 102: /* method: DOUBLE_P */
+#line 303 "jsonpath_gram.y"
+ { (yyval.optype) = jpiDouble; }
+#line 1907 "jsonpath_gram.c"
+ break;
+
+ case 103: /* method: CEILING_P */
+#line 304 "jsonpath_gram.y"
+ { (yyval.optype) = jpiCeiling; }
+#line 1913 "jsonpath_gram.c"
+ break;
+
+ case 104: /* method: KEYVALUE_P */
+#line 305 "jsonpath_gram.y"
+ { (yyval.optype) = jpiKeyValue; }
+#line 1919 "jsonpath_gram.c"
+ break;
+
+
+#line 1923 "jsonpath_gram.c"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (result, YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, result);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp, result);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+
+#if !defined yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (result, YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturn;
+#endif
+
+
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return. |
+`-------------------------------------------------------*/
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, result);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, result);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 307 "jsonpath_gram.y"
+
+
+/*
+ * The helper functions below allocate and fill JsonPathParseItem's of various
+ * types.
+ */
+
+static JsonPathParseItem *
+makeItemType(JsonPathItemType type)
+{
+ JsonPathParseItem *v = palloc(sizeof(*v));
+
+ CHECK_FOR_INTERRUPTS();
+
+ v->type = type;
+ v->next = NULL;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemString(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ if (s == NULL)
+ {
+ v = makeItemType(jpiNull);
+ }
+ else
+ {
+ v = makeItemType(jpiString);
+ v->value.string.val = s->val;
+ v->value.string.len = s->len;
+ }
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemVariable(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemType(jpiVariable);
+ v->value.string.val = s->val;
+ v->value.string.len = s->len;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemKey(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemString(s);
+ v->type = jpiKey;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemNumeric(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemType(jpiNumeric);
+ v->value.numeric =
+ DatumGetNumeric(DirectFunctionCall3(numeric_in,
+ CStringGetDatum(s->val),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1)));
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemBool(bool val)
+{
+ JsonPathParseItem *v = makeItemType(jpiBool);
+
+ v->value.boolean = val;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemBinary(JsonPathItemType type, JsonPathParseItem *la, JsonPathParseItem *ra)
+{
+ JsonPathParseItem *v = makeItemType(type);
+
+ v->value.args.left = la;
+ v->value.args.right = ra;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemUnary(JsonPathItemType type, JsonPathParseItem *a)
+{
+ JsonPathParseItem *v;
+
+ if (type == jpiPlus && a->type == jpiNumeric && !a->next)
+ return a;
+
+ if (type == jpiMinus && a->type == jpiNumeric && !a->next)
+ {
+ v = makeItemType(jpiNumeric);
+ v->value.numeric =
+ DatumGetNumeric(DirectFunctionCall1(numeric_uminus,
+ NumericGetDatum(a->value.numeric)));
+ return v;
+ }
+
+ v = makeItemType(type);
+
+ v->value.arg = a;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemList(List *list)
+{
+ JsonPathParseItem *head,
+ *end;
+ ListCell *cell;
+
+ head = end = (JsonPathParseItem *) linitial(list);
+
+ if (list_length(list) == 1)
+ return head;
+
+ /* append items to the end of already existing list */
+ while (end->next)
+ end = end->next;
+
+ for_each_from(cell, list, 1)
+ {
+ JsonPathParseItem *c = (JsonPathParseItem *) lfirst(cell);
+
+ end->next = c;
+ end = c;
+ }
+
+ return head;
+}
+
+static JsonPathParseItem *
+makeIndexArray(List *list)
+{
+ JsonPathParseItem *v = makeItemType(jpiIndexArray);
+ ListCell *cell;
+ int i = 0;
+
+ Assert(list_length(list) > 0);
+ v->value.array.nelems = list_length(list);
+
+ v->value.array.elems = palloc(sizeof(v->value.array.elems[0]) *
+ v->value.array.nelems);
+
+ foreach(cell, list)
+ {
+ JsonPathParseItem *jpi = lfirst(cell);
+
+ Assert(jpi->type == jpiSubscript);
+
+ v->value.array.elems[i].from = jpi->value.args.left;
+ v->value.array.elems[i++].to = jpi->value.args.right;
+ }
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeAny(int first, int last)
+{
+ JsonPathParseItem *v = makeItemType(jpiAny);
+
+ v->value.anybounds.first = (first >= 0) ? first : PG_UINT32_MAX;
+ v->value.anybounds.last = (last >= 0) ? last : PG_UINT32_MAX;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemLikeRegex(JsonPathParseItem *expr, JsonPathString *pattern,
+ JsonPathString *flags)
+{
+ JsonPathParseItem *v = makeItemType(jpiLikeRegex);
+ int i;
+ int cflags;
+
+ v->value.like_regex.expr = expr;
+ v->value.like_regex.pattern = pattern->val;
+ v->value.like_regex.patternlen = pattern->len;
+
+ /* Parse the flags string, convert to bitmask. Duplicate flags are OK. */
+ v->value.like_regex.flags = 0;
+ for (i = 0; flags && i < flags->len; i++)
+ {
+ switch (flags->val[i])
+ {
+ case 'i':
+ v->value.like_regex.flags |= JSP_REGEX_ICASE;
+ break;
+ case 's':
+ v->value.like_regex.flags |= JSP_REGEX_DOTALL;
+ break;
+ case 'm':
+ v->value.like_regex.flags |= JSP_REGEX_MLINE;
+ break;
+ case 'x':
+ v->value.like_regex.flags |= JSP_REGEX_WSPACE;
+ break;
+ case 'q':
+ v->value.like_regex.flags |= JSP_REGEX_QUOTE;
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate.",
+ pg_mblen(flags->val + i), flags->val + i)));
+ break;
+ }
+ }
+
+ /* Convert flags to what RE_compile_and_cache needs */
+ cflags = jspConvertRegexFlags(v->value.like_regex.flags);
+
+ /* check regex validity */
+ (void) RE_compile_and_cache(cstring_to_text_with_len(pattern->val,
+ pattern->len),
+ cflags, DEFAULT_COLLATION_OID);
+
+ return v;
+}
+
+/*
+ * Convert from XQuery regex flags to those recognized by our regex library.
+ */
+int
+jspConvertRegexFlags(uint32 xflags)
+{
+ /* By default, XQuery is very nearly the same as Spencer's AREs */
+ int cflags = REG_ADVANCED;
+
+ /* Ignore-case means the same thing, too, modulo locale issues */
+ if (xflags & JSP_REGEX_ICASE)
+ cflags |= REG_ICASE;
+
+ /* Per XQuery spec, if 'q' is specified then 'm', 's', 'x' are ignored */
+ if (xflags & JSP_REGEX_QUOTE)
+ {
+ cflags &= ~REG_ADVANCED;
+ cflags |= REG_QUOTE;
+ }
+ else
+ {
+ /* Note that dotall mode is the default in POSIX */
+ if (!(xflags & JSP_REGEX_DOTALL))
+ cflags |= REG_NLSTOP;
+ if (xflags & JSP_REGEX_MLINE)
+ cflags |= REG_NLANCH;
+
+ /*
+ * XQuery's 'x' mode is related to Spencer's expanded mode, but it's
+ * not really enough alike to justify treating JSP_REGEX_WSPACE as
+ * REG_EXPANDED. For now we treat 'x' as unimplemented; perhaps in
+ * future we'll modify the regex library to have an option for
+ * XQuery-style ignore-whitespace mode.
+ */
+ if (xflags & JSP_REGEX_WSPACE)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("XQuery \"x\" flag (expanded regular expressions) is not implemented")));
+ }
+
+ /*
+ * We'll never need sub-match details at execution. While
+ * RE_compile_and_execute would set this flag anyway, force it on here to
+ * ensure that the regex cache entries created by makeItemLikeRegex are
+ * useful.
+ */
+ cflags |= REG_NOSUB;
+
+ return cflags;
+}
+
+/*
+ * jsonpath_scan.l is compiled as part of jsonpath_gram.y. Currently, this is
+ * unavoidable because jsonpath_gram does not create a .h file to export its
+ * token symbols. If these files ever grow large enough to be worth compiling
+ * separately, that could be fixed; but for now it seems like useless
+ * complication.
+ */
+
+#include "jsonpath_scan.c"
diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y
new file mode 100644
index 0000000..91e4308
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_gram.y
@@ -0,0 +1,606 @@
+%{
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_gram.y
+ * Grammar definitions for jsonpath datatype
+ *
+ * Transforms tokenized jsonpath into tree of JsonPathParseItem structs.
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath_gram.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_collation.h"
+#include "fmgr.h"
+#include "miscadmin.h"
+#include "nodes/pg_list.h"
+#include "regex/regex.h"
+#include "utils/builtins.h"
+#include "utils/jsonpath.h"
+
+/* struct JsonPathString is shared between scan and gram */
+typedef struct JsonPathString
+{
+ char *val;
+ int len;
+ int total;
+} JsonPathString;
+
+union YYSTYPE;
+
+/* flex 2.5.4 doesn't bother with a decl for this */
+int jsonpath_yylex(union YYSTYPE *yylval_param);
+int jsonpath_yyparse(JsonPathParseResult **result);
+void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
+
+static JsonPathParseItem *makeItemType(JsonPathItemType type);
+static JsonPathParseItem *makeItemString(JsonPathString *s);
+static JsonPathParseItem *makeItemVariable(JsonPathString *s);
+static JsonPathParseItem *makeItemKey(JsonPathString *s);
+static JsonPathParseItem *makeItemNumeric(JsonPathString *s);
+static JsonPathParseItem *makeItemBool(bool val);
+static JsonPathParseItem *makeItemBinary(JsonPathItemType type,
+ JsonPathParseItem *la,
+ JsonPathParseItem *ra);
+static JsonPathParseItem *makeItemUnary(JsonPathItemType type,
+ JsonPathParseItem *a);
+static JsonPathParseItem *makeItemList(List *list);
+static JsonPathParseItem *makeIndexArray(List *list);
+static JsonPathParseItem *makeAny(int first, int last);
+static JsonPathParseItem *makeItemLikeRegex(JsonPathParseItem *expr,
+ JsonPathString *pattern,
+ JsonPathString *flags);
+
+/*
+ * Bison doesn't allocate anything that needs to live across parser calls,
+ * so we can easily have it use palloc instead of malloc. This prevents
+ * memory leaks if we error out during parsing. Note this only works with
+ * bison >= 2.0. However, in bison 1.875 the default is to use alloca()
+ * if possible, so there's not really much problem anyhow, at least if
+ * you're building with gcc.
+ */
+#define YYMALLOC palloc
+#define YYFREE pfree
+
+%}
+
+/* BISON Declarations */
+%pure-parser
+%expect 0
+%name-prefix="jsonpath_yy"
+%parse-param {JsonPathParseResult **result}
+
+%union
+{
+ JsonPathString str;
+ List *elems; /* list of JsonPathParseItem */
+ List *indexs; /* list of integers */
+ JsonPathParseItem *value;
+ JsonPathParseResult *result;
+ JsonPathItemType optype;
+ bool boolean;
+ int integer;
+}
+
+%token <str> TO_P NULL_P TRUE_P FALSE_P IS_P UNKNOWN_P EXISTS_P
+%token <str> IDENT_P STRING_P NUMERIC_P INT_P VARIABLE_P
+%token <str> OR_P AND_P NOT_P
+%token <str> LESS_P LESSEQUAL_P EQUAL_P NOTEQUAL_P GREATEREQUAL_P GREATER_P
+%token <str> ANY_P STRICT_P LAX_P LAST_P STARTS_P WITH_P LIKE_REGEX_P FLAG_P
+%token <str> ABS_P SIZE_P TYPE_P FLOOR_P DOUBLE_P CEILING_P KEYVALUE_P
+%token <str> DATETIME_P
+
+%type <result> result
+
+%type <value> scalar_value path_primary expr array_accessor
+ any_path accessor_op key predicate delimited_predicate
+ index_elem starts_with_initial expr_or_predicate
+ datetime_template opt_datetime_template
+
+%type <elems> accessor_expr
+
+%type <indexs> index_list
+
+%type <optype> comp_op method
+
+%type <boolean> mode
+
+%type <str> key_name
+
+%type <integer> any_level
+
+%left OR_P
+%left AND_P
+%right NOT_P
+%left '+' '-'
+%left '*' '/' '%'
+%left UMINUS
+%nonassoc '(' ')'
+
+/* Grammar follows */
+%%
+
+result:
+ mode expr_or_predicate {
+ *result = palloc(sizeof(JsonPathParseResult));
+ (*result)->expr = $2;
+ (*result)->lax = $1;
+ (void) yynerrs;
+ }
+ | /* EMPTY */ { *result = NULL; }
+ ;
+
+expr_or_predicate:
+ expr { $$ = $1; }
+ | predicate { $$ = $1; }
+ ;
+
+mode:
+ STRICT_P { $$ = false; }
+ | LAX_P { $$ = true; }
+ | /* EMPTY */ { $$ = true; }
+ ;
+
+scalar_value:
+ STRING_P { $$ = makeItemString(&$1); }
+ | NULL_P { $$ = makeItemString(NULL); }
+ | TRUE_P { $$ = makeItemBool(true); }
+ | FALSE_P { $$ = makeItemBool(false); }
+ | NUMERIC_P { $$ = makeItemNumeric(&$1); }
+ | INT_P { $$ = makeItemNumeric(&$1); }
+ | VARIABLE_P { $$ = makeItemVariable(&$1); }
+ ;
+
+comp_op:
+ EQUAL_P { $$ = jpiEqual; }
+ | NOTEQUAL_P { $$ = jpiNotEqual; }
+ | LESS_P { $$ = jpiLess; }
+ | GREATER_P { $$ = jpiGreater; }
+ | LESSEQUAL_P { $$ = jpiLessOrEqual; }
+ | GREATEREQUAL_P { $$ = jpiGreaterOrEqual; }
+ ;
+
+delimited_predicate:
+ '(' predicate ')' { $$ = $2; }
+ | EXISTS_P '(' expr ')' { $$ = makeItemUnary(jpiExists, $3); }
+ ;
+
+predicate:
+ delimited_predicate { $$ = $1; }
+ | expr comp_op expr { $$ = makeItemBinary($2, $1, $3); }
+ | predicate AND_P predicate { $$ = makeItemBinary(jpiAnd, $1, $3); }
+ | predicate OR_P predicate { $$ = makeItemBinary(jpiOr, $1, $3); }
+ | NOT_P delimited_predicate { $$ = makeItemUnary(jpiNot, $2); }
+ | '(' predicate ')' IS_P UNKNOWN_P
+ { $$ = makeItemUnary(jpiIsUnknown, $2); }
+ | expr STARTS_P WITH_P starts_with_initial
+ { $$ = makeItemBinary(jpiStartsWith, $1, $4); }
+ | expr LIKE_REGEX_P STRING_P { $$ = makeItemLikeRegex($1, &$3, NULL); }
+ | expr LIKE_REGEX_P STRING_P FLAG_P STRING_P
+ { $$ = makeItemLikeRegex($1, &$3, &$5); }
+ ;
+
+starts_with_initial:
+ STRING_P { $$ = makeItemString(&$1); }
+ | VARIABLE_P { $$ = makeItemVariable(&$1); }
+ ;
+
+path_primary:
+ scalar_value { $$ = $1; }
+ | '$' { $$ = makeItemType(jpiRoot); }
+ | '@' { $$ = makeItemType(jpiCurrent); }
+ | LAST_P { $$ = makeItemType(jpiLast); }
+ ;
+
+accessor_expr:
+ path_primary { $$ = list_make1($1); }
+ | '(' expr ')' accessor_op { $$ = list_make2($2, $4); }
+ | '(' predicate ')' accessor_op { $$ = list_make2($2, $4); }
+ | accessor_expr accessor_op { $$ = lappend($1, $2); }
+ ;
+
+expr:
+ accessor_expr { $$ = makeItemList($1); }
+ | '(' expr ')' { $$ = $2; }
+ | '+' expr %prec UMINUS { $$ = makeItemUnary(jpiPlus, $2); }
+ | '-' expr %prec UMINUS { $$ = makeItemUnary(jpiMinus, $2); }
+ | expr '+' expr { $$ = makeItemBinary(jpiAdd, $1, $3); }
+ | expr '-' expr { $$ = makeItemBinary(jpiSub, $1, $3); }
+ | expr '*' expr { $$ = makeItemBinary(jpiMul, $1, $3); }
+ | expr '/' expr { $$ = makeItemBinary(jpiDiv, $1, $3); }
+ | expr '%' expr { $$ = makeItemBinary(jpiMod, $1, $3); }
+ ;
+
+index_elem:
+ expr { $$ = makeItemBinary(jpiSubscript, $1, NULL); }
+ | expr TO_P expr { $$ = makeItemBinary(jpiSubscript, $1, $3); }
+ ;
+
+index_list:
+ index_elem { $$ = list_make1($1); }
+ | index_list ',' index_elem { $$ = lappend($1, $3); }
+ ;
+
+array_accessor:
+ '[' '*' ']' { $$ = makeItemType(jpiAnyArray); }
+ | '[' index_list ']' { $$ = makeIndexArray($2); }
+ ;
+
+any_level:
+ INT_P { $$ = pg_strtoint32($1.val); }
+ | LAST_P { $$ = -1; }
+ ;
+
+any_path:
+ ANY_P { $$ = makeAny(0, -1); }
+ | ANY_P '{' any_level '}' { $$ = makeAny($3, $3); }
+ | ANY_P '{' any_level TO_P any_level '}'
+ { $$ = makeAny($3, $5); }
+ ;
+
+accessor_op:
+ '.' key { $$ = $2; }
+ | '.' '*' { $$ = makeItemType(jpiAnyKey); }
+ | array_accessor { $$ = $1; }
+ | '.' any_path { $$ = $2; }
+ | '.' method '(' ')' { $$ = makeItemType($2); }
+ | '.' DATETIME_P '(' opt_datetime_template ')'
+ { $$ = makeItemUnary(jpiDatetime, $4); }
+ | '?' '(' predicate ')' { $$ = makeItemUnary(jpiFilter, $3); }
+ ;
+
+datetime_template:
+ STRING_P { $$ = makeItemString(&$1); }
+ ;
+
+opt_datetime_template:
+ datetime_template { $$ = $1; }
+ | /* EMPTY */ { $$ = NULL; }
+ ;
+
+key:
+ key_name { $$ = makeItemKey(&$1); }
+ ;
+
+key_name:
+ IDENT_P
+ | STRING_P
+ | TO_P
+ | NULL_P
+ | TRUE_P
+ | FALSE_P
+ | IS_P
+ | UNKNOWN_P
+ | EXISTS_P
+ | STRICT_P
+ | LAX_P
+ | ABS_P
+ | SIZE_P
+ | TYPE_P
+ | FLOOR_P
+ | DOUBLE_P
+ | CEILING_P
+ | DATETIME_P
+ | KEYVALUE_P
+ | LAST_P
+ | STARTS_P
+ | WITH_P
+ | LIKE_REGEX_P
+ | FLAG_P
+ ;
+
+method:
+ ABS_P { $$ = jpiAbs; }
+ | SIZE_P { $$ = jpiSize; }
+ | TYPE_P { $$ = jpiType; }
+ | FLOOR_P { $$ = jpiFloor; }
+ | DOUBLE_P { $$ = jpiDouble; }
+ | CEILING_P { $$ = jpiCeiling; }
+ | KEYVALUE_P { $$ = jpiKeyValue; }
+ ;
+%%
+
+/*
+ * The helper functions below allocate and fill JsonPathParseItem's of various
+ * types.
+ */
+
+static JsonPathParseItem *
+makeItemType(JsonPathItemType type)
+{
+ JsonPathParseItem *v = palloc(sizeof(*v));
+
+ CHECK_FOR_INTERRUPTS();
+
+ v->type = type;
+ v->next = NULL;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemString(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ if (s == NULL)
+ {
+ v = makeItemType(jpiNull);
+ }
+ else
+ {
+ v = makeItemType(jpiString);
+ v->value.string.val = s->val;
+ v->value.string.len = s->len;
+ }
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemVariable(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemType(jpiVariable);
+ v->value.string.val = s->val;
+ v->value.string.len = s->len;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemKey(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemString(s);
+ v->type = jpiKey;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemNumeric(JsonPathString *s)
+{
+ JsonPathParseItem *v;
+
+ v = makeItemType(jpiNumeric);
+ v->value.numeric =
+ DatumGetNumeric(DirectFunctionCall3(numeric_in,
+ CStringGetDatum(s->val),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1)));
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemBool(bool val)
+{
+ JsonPathParseItem *v = makeItemType(jpiBool);
+
+ v->value.boolean = val;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemBinary(JsonPathItemType type, JsonPathParseItem *la, JsonPathParseItem *ra)
+{
+ JsonPathParseItem *v = makeItemType(type);
+
+ v->value.args.left = la;
+ v->value.args.right = ra;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemUnary(JsonPathItemType type, JsonPathParseItem *a)
+{
+ JsonPathParseItem *v;
+
+ if (type == jpiPlus && a->type == jpiNumeric && !a->next)
+ return a;
+
+ if (type == jpiMinus && a->type == jpiNumeric && !a->next)
+ {
+ v = makeItemType(jpiNumeric);
+ v->value.numeric =
+ DatumGetNumeric(DirectFunctionCall1(numeric_uminus,
+ NumericGetDatum(a->value.numeric)));
+ return v;
+ }
+
+ v = makeItemType(type);
+
+ v->value.arg = a;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemList(List *list)
+{
+ JsonPathParseItem *head,
+ *end;
+ ListCell *cell;
+
+ head = end = (JsonPathParseItem *) linitial(list);
+
+ if (list_length(list) == 1)
+ return head;
+
+ /* append items to the end of already existing list */
+ while (end->next)
+ end = end->next;
+
+ for_each_from(cell, list, 1)
+ {
+ JsonPathParseItem *c = (JsonPathParseItem *) lfirst(cell);
+
+ end->next = c;
+ end = c;
+ }
+
+ return head;
+}
+
+static JsonPathParseItem *
+makeIndexArray(List *list)
+{
+ JsonPathParseItem *v = makeItemType(jpiIndexArray);
+ ListCell *cell;
+ int i = 0;
+
+ Assert(list_length(list) > 0);
+ v->value.array.nelems = list_length(list);
+
+ v->value.array.elems = palloc(sizeof(v->value.array.elems[0]) *
+ v->value.array.nelems);
+
+ foreach(cell, list)
+ {
+ JsonPathParseItem *jpi = lfirst(cell);
+
+ Assert(jpi->type == jpiSubscript);
+
+ v->value.array.elems[i].from = jpi->value.args.left;
+ v->value.array.elems[i++].to = jpi->value.args.right;
+ }
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeAny(int first, int last)
+{
+ JsonPathParseItem *v = makeItemType(jpiAny);
+
+ v->value.anybounds.first = (first >= 0) ? first : PG_UINT32_MAX;
+ v->value.anybounds.last = (last >= 0) ? last : PG_UINT32_MAX;
+
+ return v;
+}
+
+static JsonPathParseItem *
+makeItemLikeRegex(JsonPathParseItem *expr, JsonPathString *pattern,
+ JsonPathString *flags)
+{
+ JsonPathParseItem *v = makeItemType(jpiLikeRegex);
+ int i;
+ int cflags;
+
+ v->value.like_regex.expr = expr;
+ v->value.like_regex.pattern = pattern->val;
+ v->value.like_regex.patternlen = pattern->len;
+
+ /* Parse the flags string, convert to bitmask. Duplicate flags are OK. */
+ v->value.like_regex.flags = 0;
+ for (i = 0; flags && i < flags->len; i++)
+ {
+ switch (flags->val[i])
+ {
+ case 'i':
+ v->value.like_regex.flags |= JSP_REGEX_ICASE;
+ break;
+ case 's':
+ v->value.like_regex.flags |= JSP_REGEX_DOTALL;
+ break;
+ case 'm':
+ v->value.like_regex.flags |= JSP_REGEX_MLINE;
+ break;
+ case 'x':
+ v->value.like_regex.flags |= JSP_REGEX_WSPACE;
+ break;
+ case 'q':
+ v->value.like_regex.flags |= JSP_REGEX_QUOTE;
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate.",
+ pg_mblen(flags->val + i), flags->val + i)));
+ break;
+ }
+ }
+
+ /* Convert flags to what RE_compile_and_cache needs */
+ cflags = jspConvertRegexFlags(v->value.like_regex.flags);
+
+ /* check regex validity */
+ (void) RE_compile_and_cache(cstring_to_text_with_len(pattern->val,
+ pattern->len),
+ cflags, DEFAULT_COLLATION_OID);
+
+ return v;
+}
+
+/*
+ * Convert from XQuery regex flags to those recognized by our regex library.
+ */
+int
+jspConvertRegexFlags(uint32 xflags)
+{
+ /* By default, XQuery is very nearly the same as Spencer's AREs */
+ int cflags = REG_ADVANCED;
+
+ /* Ignore-case means the same thing, too, modulo locale issues */
+ if (xflags & JSP_REGEX_ICASE)
+ cflags |= REG_ICASE;
+
+ /* Per XQuery spec, if 'q' is specified then 'm', 's', 'x' are ignored */
+ if (xflags & JSP_REGEX_QUOTE)
+ {
+ cflags &= ~REG_ADVANCED;
+ cflags |= REG_QUOTE;
+ }
+ else
+ {
+ /* Note that dotall mode is the default in POSIX */
+ if (!(xflags & JSP_REGEX_DOTALL))
+ cflags |= REG_NLSTOP;
+ if (xflags & JSP_REGEX_MLINE)
+ cflags |= REG_NLANCH;
+
+ /*
+ * XQuery's 'x' mode is related to Spencer's expanded mode, but it's
+ * not really enough alike to justify treating JSP_REGEX_WSPACE as
+ * REG_EXPANDED. For now we treat 'x' as unimplemented; perhaps in
+ * future we'll modify the regex library to have an option for
+ * XQuery-style ignore-whitespace mode.
+ */
+ if (xflags & JSP_REGEX_WSPACE)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("XQuery \"x\" flag (expanded regular expressions) is not implemented")));
+ }
+
+ /*
+ * We'll never need sub-match details at execution. While
+ * RE_compile_and_execute would set this flag anyway, force it on here to
+ * ensure that the regex cache entries created by makeItemLikeRegex are
+ * useful.
+ */
+ cflags |= REG_NOSUB;
+
+ return cflags;
+}
+
+/*
+ * jsonpath_scan.l is compiled as part of jsonpath_gram.y. Currently, this is
+ * unavoidable because jsonpath_gram does not create a .h file to export its
+ * token symbols. If these files ever grow large enough to be worth compiling
+ * separately, that could be fixed; but for now it seems like useless
+ * complication.
+ */
+
+#include "jsonpath_scan.c"
diff --git a/src/backend/utils/adt/jsonpath_scan.c b/src/backend/utils/adt/jsonpath_scan.c
new file mode 100644
index 0000000..e1a9d2a
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_scan.c
@@ -0,0 +1,4873 @@
+#line 2 "jsonpath_scan.c"
+
+#line 4 "jsonpath_scan.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer jsonpath_yy_create_buffer
+#define yy_delete_buffer jsonpath_yy_delete_buffer
+#define yy_scan_buffer jsonpath_yy_scan_buffer
+#define yy_scan_string jsonpath_yy_scan_string
+#define yy_scan_bytes jsonpath_yy_scan_bytes
+#define yy_init_buffer jsonpath_yy_init_buffer
+#define yy_flush_buffer jsonpath_yy_flush_buffer
+#define yy_load_buffer_state jsonpath_yy_load_buffer_state
+#define yy_switch_to_buffer jsonpath_yy_switch_to_buffer
+#define yypush_buffer_state jsonpath_yypush_buffer_state
+#define yypop_buffer_state jsonpath_yypop_buffer_state
+#define yyensure_buffer_stack jsonpath_yyensure_buffer_stack
+#define yy_flex_debug jsonpath_yy_flex_debug
+#define yyin jsonpath_yyin
+#define yyleng jsonpath_yyleng
+#define yylex jsonpath_yylex
+#define yylineno jsonpath_yylineno
+#define yyout jsonpath_yyout
+#define yyrestart jsonpath_yyrestart
+#define yytext jsonpath_yytext
+#define yywrap jsonpath_yywrap
+#define yyalloc jsonpath_yyalloc
+#define yyrealloc jsonpath_yyrealloc
+#define yyfree jsonpath_yyfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define jsonpath_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer jsonpath_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define jsonpath_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer jsonpath_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define jsonpath_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer jsonpath_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define jsonpath_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string jsonpath_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define jsonpath_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes jsonpath_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define jsonpath_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer jsonpath_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define jsonpath_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer jsonpath_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define jsonpath_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state jsonpath_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define jsonpath_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer jsonpath_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define jsonpath_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state jsonpath_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define jsonpath_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state jsonpath_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define jsonpath_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack jsonpath_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define jsonpath_yylex_ALREADY_DEFINED
+#else
+#define yylex jsonpath_yylex
+#endif
+
+#ifdef yyrestart
+#define jsonpath_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart jsonpath_yyrestart
+#endif
+
+#ifdef yylex_init
+#define jsonpath_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init jsonpath_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define jsonpath_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra jsonpath_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define jsonpath_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy jsonpath_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define jsonpath_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug jsonpath_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define jsonpath_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug jsonpath_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define jsonpath_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra jsonpath_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define jsonpath_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra jsonpath_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define jsonpath_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in jsonpath_yyget_in
+#endif
+
+#ifdef yyset_in
+#define jsonpath_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in jsonpath_yyset_in
+#endif
+
+#ifdef yyget_out
+#define jsonpath_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out jsonpath_yyget_out
+#endif
+
+#ifdef yyset_out
+#define jsonpath_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out jsonpath_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define jsonpath_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng jsonpath_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define jsonpath_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text jsonpath_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define jsonpath_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno jsonpath_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define jsonpath_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno jsonpath_yyset_lineno
+#endif
+
+#ifdef yywrap
+#define jsonpath_yywrap_ALREADY_DEFINED
+#else
+#define yywrap jsonpath_yywrap
+#endif
+
+#ifdef yyget_lval
+#define jsonpath_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval jsonpath_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define jsonpath_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval jsonpath_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define jsonpath_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc jsonpath_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define jsonpath_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc jsonpath_yyrealloc
+#endif
+
+#ifdef yyfree
+#define jsonpath_yyfree_ALREADY_DEFINED
+#else
+#define yyfree jsonpath_yyfree
+#endif
+
+#ifdef yytext
+#define jsonpath_yytext_ALREADY_DEFINED
+#else
+#define yytext jsonpath_yytext
+#endif
+
+#ifdef yyleng
+#define jsonpath_yyleng_ALREADY_DEFINED
+#else
+#define yyleng jsonpath_yyleng
+#endif
+
+#ifdef yyin
+#define jsonpath_yyin_ALREADY_DEFINED
+#else
+#define yyin jsonpath_yyin
+#endif
+
+#ifdef yyout
+#define jsonpath_yyout_ALREADY_DEFINED
+#else
+#define yyout jsonpath_yyout
+#endif
+
+#ifdef yy_flex_debug
+#define jsonpath_yy_flex_debug_ALREADY_DEFINED
+#else
+#define yy_flex_debug jsonpath_yy_flex_debug
+#endif
+
+#ifdef yylineno
+#define jsonpath_yylineno_ALREADY_DEFINED
+#else
+#define yylineno jsonpath_yylineno
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
+void yy_delete_buffer ( YY_BUFFER_STATE b );
+void yy_flush_buffer ( YY_BUFFER_STATE b );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
+
+void *yyalloc ( yy_size_t );
+void *yyrealloc ( void *, yy_size_t );
+void yyfree ( void * );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define jsonpath_yywrap() (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef const struct yy_trans_info *yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 50
+#define YY_END_OF_BUFFER 51
+struct yy_trans_info
+ {
+ flex_int16_t yy_verify;
+ flex_int16_t yy_nxt;
+ };
+static const struct yy_trans_info yy_transition[10558] =
+ {
+ { 0, 0 }, { 0,10302 }, { 0, 0 }, { 0,10300 }, { 1,2580 },
+ { 2,2580 }, { 3,2580 }, { 4,2580 }, { 5,2580 }, { 6,2580 },
+ { 7,2580 }, { 8,2580 }, { 9,2838 }, { 10,2838 }, { 11,2580 },
+ { 12,2838 }, { 13,2838 }, { 14,2580 }, { 15,2580 }, { 16,2580 },
+ { 17,2580 }, { 18,2580 }, { 19,2580 }, { 20,2580 }, { 21,2580 },
+ { 22,2580 }, { 23,2580 }, { 24,2580 }, { 25,2580 }, { 26,2580 },
+ { 27,2580 }, { 28,2580 }, { 29,2580 }, { 30,2580 }, { 31,2580 },
+ { 32,2838 }, { 33,2642 }, { 34,2644 }, { 35,2672 }, { 36,2857 },
+ { 37,2672 }, { 38,2854 }, { 39,2580 }, { 40,2672 }, { 41,2672 },
+ { 42,3115 }, { 43,2672 }, { 44,2672 }, { 45,2672 }, { 46,3117 },
+
+ { 47,3119 }, { 48,3176 }, { 49,3434 }, { 50,3434 }, { 51,3434 },
+ { 52,3434 }, { 53,3434 }, { 54,3434 }, { 55,3434 }, { 56,3434 },
+ { 57,3434 }, { 58,2672 }, { 59,2580 }, { 60,3124 }, { 61,3127 },
+ { 62,3147 }, { 63,2672 }, { 64,2672 }, { 65,2580 }, { 66,2580 },
+ { 67,2580 }, { 68,2580 }, { 69,2580 }, { 70,2580 }, { 71,2580 },
+ { 72,2580 }, { 73,2580 }, { 74,2580 }, { 75,2580 }, { 76,2580 },
+ { 77,2580 }, { 78,2580 }, { 79,2580 }, { 80,2580 }, { 81,2580 },
+ { 82,2580 }, { 83,2580 }, { 84,2580 }, { 85,2580 }, { 86,2580 },
+ { 87,2580 }, { 88,2580 }, { 89,2580 }, { 90,2580 }, { 91,2672 },
+ { 92,3149 }, { 93,2672 }, { 94,2580 }, { 95,2580 }, { 96,2580 },
+
+ { 97,2580 }, { 98,2580 }, { 99,2580 }, { 100,2580 }, { 101,2580 },
+ { 102,2580 }, { 103,2580 }, { 104,2580 }, { 105,2580 }, { 106,2580 },
+ { 107,2580 }, { 108,2580 }, { 109,2580 }, { 110,2580 }, { 111,2580 },
+ { 112,2580 }, { 113,2580 }, { 114,2580 }, { 115,2580 }, { 116,2580 },
+ { 117,2580 }, { 118,2580 }, { 119,2580 }, { 120,2580 }, { 121,2580 },
+ { 122,2580 }, { 123,2672 }, { 124,3692 }, { 125,2672 }, { 126,2580 },
+ { 127,2580 }, { 128,2580 }, { 129,2580 }, { 130,2580 }, { 131,2580 },
+ { 132,2580 }, { 133,2580 }, { 134,2580 }, { 135,2580 }, { 136,2580 },
+ { 137,2580 }, { 138,2580 }, { 139,2580 }, { 140,2580 }, { 141,2580 },
+ { 142,2580 }, { 143,2580 }, { 144,2580 }, { 145,2580 }, { 146,2580 },
+
+ { 147,2580 }, { 148,2580 }, { 149,2580 }, { 150,2580 }, { 151,2580 },
+ { 152,2580 }, { 153,2580 }, { 154,2580 }, { 155,2580 }, { 156,2580 },
+ { 157,2580 }, { 158,2580 }, { 159,2580 }, { 160,2580 }, { 161,2580 },
+ { 162,2580 }, { 163,2580 }, { 164,2580 }, { 165,2580 }, { 166,2580 },
+ { 167,2580 }, { 168,2580 }, { 169,2580 }, { 170,2580 }, { 171,2580 },
+ { 172,2580 }, { 173,2580 }, { 174,2580 }, { 175,2580 }, { 176,2580 },
+ { 177,2580 }, { 178,2580 }, { 179,2580 }, { 180,2580 }, { 181,2580 },
+ { 182,2580 }, { 183,2580 }, { 184,2580 }, { 185,2580 }, { 186,2580 },
+ { 187,2580 }, { 188,2580 }, { 189,2580 }, { 190,2580 }, { 191,2580 },
+ { 192,2580 }, { 193,2580 }, { 194,2580 }, { 195,2580 }, { 196,2580 },
+
+ { 197,2580 }, { 198,2580 }, { 199,2580 }, { 200,2580 }, { 201,2580 },
+ { 202,2580 }, { 203,2580 }, { 204,2580 }, { 205,2580 }, { 206,2580 },
+ { 207,2580 }, { 208,2580 }, { 209,2580 }, { 210,2580 }, { 211,2580 },
+ { 212,2580 }, { 213,2580 }, { 214,2580 }, { 215,2580 }, { 216,2580 },
+ { 217,2580 }, { 218,2580 }, { 219,2580 }, { 220,2580 }, { 221,2580 },
+ { 222,2580 }, { 223,2580 }, { 224,2580 }, { 225,2580 }, { 226,2580 },
+ { 227,2580 }, { 228,2580 }, { 229,2580 }, { 230,2580 }, { 231,2580 },
+ { 232,2580 }, { 233,2580 }, { 234,2580 }, { 235,2580 }, { 236,2580 },
+ { 237,2580 }, { 238,2580 }, { 239,2580 }, { 240,2580 }, { 241,2580 },
+ { 242,2580 }, { 243,2580 }, { 244,2580 }, { 245,2580 }, { 246,2580 },
+
+ { 247,2580 }, { 248,2580 }, { 249,2580 }, { 250,2580 }, { 251,2580 },
+ { 252,2580 }, { 253,2580 }, { 254,2580 }, { 255,2580 }, { 256,2580 },
+ { 0, 0 }, { 0,10042 }, { 1,2322 }, { 2,2322 }, { 3,2322 },
+ { 4,2322 }, { 5,2322 }, { 6,2322 }, { 7,2322 }, { 8,2322 },
+ { 9,2580 }, { 10,2580 }, { 11,2322 }, { 12,2580 }, { 13,2580 },
+ { 14,2322 }, { 15,2322 }, { 16,2322 }, { 17,2322 }, { 18,2322 },
+ { 19,2322 }, { 20,2322 }, { 21,2322 }, { 22,2322 }, { 23,2322 },
+ { 24,2322 }, { 25,2322 }, { 26,2322 }, { 27,2322 }, { 28,2322 },
+ { 29,2322 }, { 30,2322 }, { 31,2322 }, { 32,2580 }, { 33,2384 },
+ { 34,2386 }, { 35,2414 }, { 36,2599 }, { 37,2414 }, { 38,2596 },
+
+ { 39,2322 }, { 40,2414 }, { 41,2414 }, { 42,2857 }, { 43,2414 },
+ { 44,2414 }, { 45,2414 }, { 46,2859 }, { 47,2861 }, { 48,2918 },
+ { 49,3176 }, { 50,3176 }, { 51,3176 }, { 52,3176 }, { 53,3176 },
+ { 54,3176 }, { 55,3176 }, { 56,3176 }, { 57,3176 }, { 58,2414 },
+ { 59,2322 }, { 60,2866 }, { 61,2869 }, { 62,2889 }, { 63,2414 },
+ { 64,2414 }, { 65,2322 }, { 66,2322 }, { 67,2322 }, { 68,2322 },
+ { 69,2322 }, { 70,2322 }, { 71,2322 }, { 72,2322 }, { 73,2322 },
+ { 74,2322 }, { 75,2322 }, { 76,2322 }, { 77,2322 }, { 78,2322 },
+ { 79,2322 }, { 80,2322 }, { 81,2322 }, { 82,2322 }, { 83,2322 },
+ { 84,2322 }, { 85,2322 }, { 86,2322 }, { 87,2322 }, { 88,2322 },
+
+ { 89,2322 }, { 90,2322 }, { 91,2414 }, { 92,2891 }, { 93,2414 },
+ { 94,2322 }, { 95,2322 }, { 96,2322 }, { 97,2322 }, { 98,2322 },
+ { 99,2322 }, { 100,2322 }, { 101,2322 }, { 102,2322 }, { 103,2322 },
+ { 104,2322 }, { 105,2322 }, { 106,2322 }, { 107,2322 }, { 108,2322 },
+ { 109,2322 }, { 110,2322 }, { 111,2322 }, { 112,2322 }, { 113,2322 },
+ { 114,2322 }, { 115,2322 }, { 116,2322 }, { 117,2322 }, { 118,2322 },
+ { 119,2322 }, { 120,2322 }, { 121,2322 }, { 122,2322 }, { 123,2414 },
+ { 124,3434 }, { 125,2414 }, { 126,2322 }, { 127,2322 }, { 128,2322 },
+ { 129,2322 }, { 130,2322 }, { 131,2322 }, { 132,2322 }, { 133,2322 },
+ { 134,2322 }, { 135,2322 }, { 136,2322 }, { 137,2322 }, { 138,2322 },
+
+ { 139,2322 }, { 140,2322 }, { 141,2322 }, { 142,2322 }, { 143,2322 },
+ { 144,2322 }, { 145,2322 }, { 146,2322 }, { 147,2322 }, { 148,2322 },
+ { 149,2322 }, { 150,2322 }, { 151,2322 }, { 152,2322 }, { 153,2322 },
+ { 154,2322 }, { 155,2322 }, { 156,2322 }, { 157,2322 }, { 158,2322 },
+ { 159,2322 }, { 160,2322 }, { 161,2322 }, { 162,2322 }, { 163,2322 },
+ { 164,2322 }, { 165,2322 }, { 166,2322 }, { 167,2322 }, { 168,2322 },
+ { 169,2322 }, { 170,2322 }, { 171,2322 }, { 172,2322 }, { 173,2322 },
+ { 174,2322 }, { 175,2322 }, { 176,2322 }, { 177,2322 }, { 178,2322 },
+ { 179,2322 }, { 180,2322 }, { 181,2322 }, { 182,2322 }, { 183,2322 },
+ { 184,2322 }, { 185,2322 }, { 186,2322 }, { 187,2322 }, { 188,2322 },
+
+ { 189,2322 }, { 190,2322 }, { 191,2322 }, { 192,2322 }, { 193,2322 },
+ { 194,2322 }, { 195,2322 }, { 196,2322 }, { 197,2322 }, { 198,2322 },
+ { 199,2322 }, { 200,2322 }, { 201,2322 }, { 202,2322 }, { 203,2322 },
+ { 204,2322 }, { 205,2322 }, { 206,2322 }, { 207,2322 }, { 208,2322 },
+ { 209,2322 }, { 210,2322 }, { 211,2322 }, { 212,2322 }, { 213,2322 },
+ { 214,2322 }, { 215,2322 }, { 216,2322 }, { 217,2322 }, { 218,2322 },
+ { 219,2322 }, { 220,2322 }, { 221,2322 }, { 222,2322 }, { 223,2322 },
+ { 224,2322 }, { 225,2322 }, { 226,2322 }, { 227,2322 }, { 228,2322 },
+ { 229,2322 }, { 230,2322 }, { 231,2322 }, { 232,2322 }, { 233,2322 },
+ { 234,2322 }, { 235,2322 }, { 236,2322 }, { 237,2322 }, { 238,2322 },
+
+ { 239,2322 }, { 240,2322 }, { 241,2322 }, { 242,2322 }, { 243,2322 },
+ { 244,2322 }, { 245,2322 }, { 246,2322 }, { 247,2322 }, { 248,2322 },
+ { 249,2322 }, { 250,2322 }, { 251,2322 }, { 252,2322 }, { 253,2322 },
+ { 254,2322 }, { 255,2322 }, { 256,2322 }, { 0, 0 }, { 0,9784 },
+ { 1,3208 }, { 2,3208 }, { 3,3208 }, { 4,3208 }, { 5,3208 },
+ { 6,3208 }, { 7,3208 }, { 8,3208 }, { 9,3208 }, { 10,3208 },
+ { 11,3208 }, { 12,3208 }, { 13,3208 }, { 14,3208 }, { 15,3208 },
+ { 16,3208 }, { 17,3208 }, { 18,3208 }, { 19,3208 }, { 20,3208 },
+ { 21,3208 }, { 22,3208 }, { 23,3208 }, { 24,3208 }, { 25,3208 },
+ { 26,3208 }, { 27,3208 }, { 28,3208 }, { 29,3208 }, { 30,3208 },
+
+ { 31,3208 }, { 32,3208 }, { 33,3208 }, { 34,3178 }, { 35,3208 },
+ { 36,3208 }, { 37,3208 }, { 38,3208 }, { 39,3208 }, { 40,3208 },
+ { 41,3208 }, { 42,3208 }, { 43,3208 }, { 44,3208 }, { 45,3208 },
+ { 46,3208 }, { 47,3208 }, { 48,3208 }, { 49,3208 }, { 50,3208 },
+ { 51,3208 }, { 52,3208 }, { 53,3208 }, { 54,3208 }, { 55,3208 },
+ { 56,3208 }, { 57,3208 }, { 58,3208 }, { 59,3208 }, { 60,3208 },
+ { 61,3208 }, { 62,3208 }, { 63,3208 }, { 64,3208 }, { 65,3208 },
+ { 66,3208 }, { 67,3208 }, { 68,3208 }, { 69,3208 }, { 70,3208 },
+ { 71,3208 }, { 72,3208 }, { 73,3208 }, { 74,3208 }, { 75,3208 },
+ { 76,3208 }, { 77,3208 }, { 78,3208 }, { 79,3208 }, { 80,3208 },
+
+ { 81,3208 }, { 82,3208 }, { 83,3208 }, { 84,3208 }, { 85,3208 },
+ { 86,3208 }, { 87,3208 }, { 88,3208 }, { 89,3208 }, { 90,3208 },
+ { 91,3208 }, { 92,3466 }, { 93,3208 }, { 94,3208 }, { 95,3208 },
+ { 96,3208 }, { 97,3208 }, { 98,3208 }, { 99,3208 }, { 100,3208 },
+ { 101,3208 }, { 102,3208 }, { 103,3208 }, { 104,3208 }, { 105,3208 },
+ { 106,3208 }, { 107,3208 }, { 108,3208 }, { 109,3208 }, { 110,3208 },
+ { 111,3208 }, { 112,3208 }, { 113,3208 }, { 114,3208 }, { 115,3208 },
+ { 116,3208 }, { 117,3208 }, { 118,3208 }, { 119,3208 }, { 120,3208 },
+ { 121,3208 }, { 122,3208 }, { 123,3208 }, { 124,3208 }, { 125,3208 },
+ { 126,3208 }, { 127,3208 }, { 128,3208 }, { 129,3208 }, { 130,3208 },
+
+ { 131,3208 }, { 132,3208 }, { 133,3208 }, { 134,3208 }, { 135,3208 },
+ { 136,3208 }, { 137,3208 }, { 138,3208 }, { 139,3208 }, { 140,3208 },
+ { 141,3208 }, { 142,3208 }, { 143,3208 }, { 144,3208 }, { 145,3208 },
+ { 146,3208 }, { 147,3208 }, { 148,3208 }, { 149,3208 }, { 150,3208 },
+ { 151,3208 }, { 152,3208 }, { 153,3208 }, { 154,3208 }, { 155,3208 },
+ { 156,3208 }, { 157,3208 }, { 158,3208 }, { 159,3208 }, { 160,3208 },
+ { 161,3208 }, { 162,3208 }, { 163,3208 }, { 164,3208 }, { 165,3208 },
+ { 166,3208 }, { 167,3208 }, { 168,3208 }, { 169,3208 }, { 170,3208 },
+ { 171,3208 }, { 172,3208 }, { 173,3208 }, { 174,3208 }, { 175,3208 },
+ { 176,3208 }, { 177,3208 }, { 178,3208 }, { 179,3208 }, { 180,3208 },
+
+ { 181,3208 }, { 182,3208 }, { 183,3208 }, { 184,3208 }, { 185,3208 },
+ { 186,3208 }, { 187,3208 }, { 188,3208 }, { 189,3208 }, { 190,3208 },
+ { 191,3208 }, { 192,3208 }, { 193,3208 }, { 194,3208 }, { 195,3208 },
+ { 196,3208 }, { 197,3208 }, { 198,3208 }, { 199,3208 }, { 200,3208 },
+ { 201,3208 }, { 202,3208 }, { 203,3208 }, { 204,3208 }, { 205,3208 },
+ { 206,3208 }, { 207,3208 }, { 208,3208 }, { 209,3208 }, { 210,3208 },
+ { 211,3208 }, { 212,3208 }, { 213,3208 }, { 214,3208 }, { 215,3208 },
+ { 216,3208 }, { 217,3208 }, { 218,3208 }, { 219,3208 }, { 220,3208 },
+ { 221,3208 }, { 222,3208 }, { 223,3208 }, { 224,3208 }, { 225,3208 },
+ { 226,3208 }, { 227,3208 }, { 228,3208 }, { 229,3208 }, { 230,3208 },
+
+ { 231,3208 }, { 232,3208 }, { 233,3208 }, { 234,3208 }, { 235,3208 },
+ { 236,3208 }, { 237,3208 }, { 238,3208 }, { 239,3208 }, { 240,3208 },
+ { 241,3208 }, { 242,3208 }, { 243,3208 }, { 244,3208 }, { 245,3208 },
+ { 246,3208 }, { 247,3208 }, { 248,3208 }, { 249,3208 }, { 250,3208 },
+ { 251,3208 }, { 252,3208 }, { 253,3208 }, { 254,3208 }, { 255,3208 },
+ { 256,3208 }, { 0, 0 }, { 0,9526 }, { 1,2950 }, { 2,2950 },
+ { 3,2950 }, { 4,2950 }, { 5,2950 }, { 6,2950 }, { 7,2950 },
+ { 8,2950 }, { 9,2950 }, { 10,2950 }, { 11,2950 }, { 12,2950 },
+ { 13,2950 }, { 14,2950 }, { 15,2950 }, { 16,2950 }, { 17,2950 },
+ { 18,2950 }, { 19,2950 }, { 20,2950 }, { 21,2950 }, { 22,2950 },
+
+ { 23,2950 }, { 24,2950 }, { 25,2950 }, { 26,2950 }, { 27,2950 },
+ { 28,2950 }, { 29,2950 }, { 30,2950 }, { 31,2950 }, { 32,2950 },
+ { 33,2950 }, { 34,2920 }, { 35,2950 }, { 36,2950 }, { 37,2950 },
+ { 38,2950 }, { 39,2950 }, { 40,2950 }, { 41,2950 }, { 42,2950 },
+ { 43,2950 }, { 44,2950 }, { 45,2950 }, { 46,2950 }, { 47,2950 },
+ { 48,2950 }, { 49,2950 }, { 50,2950 }, { 51,2950 }, { 52,2950 },
+ { 53,2950 }, { 54,2950 }, { 55,2950 }, { 56,2950 }, { 57,2950 },
+ { 58,2950 }, { 59,2950 }, { 60,2950 }, { 61,2950 }, { 62,2950 },
+ { 63,2950 }, { 64,2950 }, { 65,2950 }, { 66,2950 }, { 67,2950 },
+ { 68,2950 }, { 69,2950 }, { 70,2950 }, { 71,2950 }, { 72,2950 },
+
+ { 73,2950 }, { 74,2950 }, { 75,2950 }, { 76,2950 }, { 77,2950 },
+ { 78,2950 }, { 79,2950 }, { 80,2950 }, { 81,2950 }, { 82,2950 },
+ { 83,2950 }, { 84,2950 }, { 85,2950 }, { 86,2950 }, { 87,2950 },
+ { 88,2950 }, { 89,2950 }, { 90,2950 }, { 91,2950 }, { 92,3208 },
+ { 93,2950 }, { 94,2950 }, { 95,2950 }, { 96,2950 }, { 97,2950 },
+ { 98,2950 }, { 99,2950 }, { 100,2950 }, { 101,2950 }, { 102,2950 },
+ { 103,2950 }, { 104,2950 }, { 105,2950 }, { 106,2950 }, { 107,2950 },
+ { 108,2950 }, { 109,2950 }, { 110,2950 }, { 111,2950 }, { 112,2950 },
+ { 113,2950 }, { 114,2950 }, { 115,2950 }, { 116,2950 }, { 117,2950 },
+ { 118,2950 }, { 119,2950 }, { 120,2950 }, { 121,2950 }, { 122,2950 },
+
+ { 123,2950 }, { 124,2950 }, { 125,2950 }, { 126,2950 }, { 127,2950 },
+ { 128,2950 }, { 129,2950 }, { 130,2950 }, { 131,2950 }, { 132,2950 },
+ { 133,2950 }, { 134,2950 }, { 135,2950 }, { 136,2950 }, { 137,2950 },
+ { 138,2950 }, { 139,2950 }, { 140,2950 }, { 141,2950 }, { 142,2950 },
+ { 143,2950 }, { 144,2950 }, { 145,2950 }, { 146,2950 }, { 147,2950 },
+ { 148,2950 }, { 149,2950 }, { 150,2950 }, { 151,2950 }, { 152,2950 },
+ { 153,2950 }, { 154,2950 }, { 155,2950 }, { 156,2950 }, { 157,2950 },
+ { 158,2950 }, { 159,2950 }, { 160,2950 }, { 161,2950 }, { 162,2950 },
+ { 163,2950 }, { 164,2950 }, { 165,2950 }, { 166,2950 }, { 167,2950 },
+ { 168,2950 }, { 169,2950 }, { 170,2950 }, { 171,2950 }, { 172,2950 },
+
+ { 173,2950 }, { 174,2950 }, { 175,2950 }, { 176,2950 }, { 177,2950 },
+ { 178,2950 }, { 179,2950 }, { 180,2950 }, { 181,2950 }, { 182,2950 },
+ { 183,2950 }, { 184,2950 }, { 185,2950 }, { 186,2950 }, { 187,2950 },
+ { 188,2950 }, { 189,2950 }, { 190,2950 }, { 191,2950 }, { 192,2950 },
+ { 193,2950 }, { 194,2950 }, { 195,2950 }, { 196,2950 }, { 197,2950 },
+ { 198,2950 }, { 199,2950 }, { 200,2950 }, { 201,2950 }, { 202,2950 },
+ { 203,2950 }, { 204,2950 }, { 205,2950 }, { 206,2950 }, { 207,2950 },
+ { 208,2950 }, { 209,2950 }, { 210,2950 }, { 211,2950 }, { 212,2950 },
+ { 213,2950 }, { 214,2950 }, { 215,2950 }, { 216,2950 }, { 217,2950 },
+ { 218,2950 }, { 219,2950 }, { 220,2950 }, { 221,2950 }, { 222,2950 },
+
+ { 223,2950 }, { 224,2950 }, { 225,2950 }, { 226,2950 }, { 227,2950 },
+ { 228,2950 }, { 229,2950 }, { 230,2950 }, { 231,2950 }, { 232,2950 },
+ { 233,2950 }, { 234,2950 }, { 235,2950 }, { 236,2950 }, { 237,2950 },
+ { 238,2950 }, { 239,2950 }, { 240,2950 }, { 241,2950 }, { 242,2950 },
+ { 243,2950 }, { 244,2950 }, { 245,2950 }, { 246,2950 }, { 247,2950 },
+ { 248,2950 }, { 249,2950 }, { 250,2950 }, { 251,2950 }, { 252,2950 },
+ { 253,2950 }, { 254,2950 }, { 255,2950 }, { 256,2950 }, { 0, 0 },
+ { 0,9268 }, { 1,3208 }, { 2,3208 }, { 3,3208 }, { 4,3208 },
+ { 5,3208 }, { 6,3208 }, { 7,3208 }, { 8,3208 }, { 9,3466 },
+ { 10,3466 }, { 11,3208 }, { 12,3466 }, { 13,3466 }, { 14,3208 },
+
+ { 15,3208 }, { 16,3208 }, { 17,3208 }, { 18,3208 }, { 19,3208 },
+ { 20,3208 }, { 21,3208 }, { 22,3208 }, { 23,3208 }, { 24,3208 },
+ { 25,3208 }, { 26,3208 }, { 27,3208 }, { 28,3208 }, { 29,3208 },
+ { 30,3208 }, { 31,3208 }, { 32,3466 }, { 33,2664 }, { 34,2664 },
+ { 35,2664 }, { 36,2664 }, { 37,2664 }, { 38,2664 }, { 39,3208 },
+ { 40,2664 }, { 41,2664 }, { 42,2664 }, { 43,2664 }, { 44,2664 },
+ { 45,2664 }, { 46,2664 }, { 47,2684 }, { 48,3208 }, { 49,3208 },
+ { 50,3208 }, { 51,3208 }, { 52,3208 }, { 53,3208 }, { 54,3208 },
+ { 55,3208 }, { 56,3208 }, { 57,3208 }, { 58,2664 }, { 59,3208 },
+ { 60,2664 }, { 61,2664 }, { 62,2664 }, { 63,2664 }, { 64,2664 },
+
+ { 65,3208 }, { 66,3208 }, { 67,3208 }, { 68,3208 }, { 69,3208 },
+ { 70,3208 }, { 71,3208 }, { 72,3208 }, { 73,3208 }, { 74,3208 },
+ { 75,3208 }, { 76,3208 }, { 77,3208 }, { 78,3208 }, { 79,3208 },
+ { 80,3208 }, { 81,3208 }, { 82,3208 }, { 83,3208 }, { 84,3208 },
+ { 85,3208 }, { 86,3208 }, { 87,3208 }, { 88,3208 }, { 89,3208 },
+ { 90,3208 }, { 91,2664 }, { 92,2950 }, { 93,2664 }, { 94,3208 },
+ { 95,3208 }, { 96,3208 }, { 97,3208 }, { 98,3208 }, { 99,3208 },
+ { 100,3208 }, { 101,3208 }, { 102,3208 }, { 103,3208 }, { 104,3208 },
+ { 105,3208 }, { 106,3208 }, { 107,3208 }, { 108,3208 }, { 109,3208 },
+ { 110,3208 }, { 111,3208 }, { 112,3208 }, { 113,3208 }, { 114,3208 },
+
+ { 115,3208 }, { 116,3208 }, { 117,3208 }, { 118,3208 }, { 119,3208 },
+ { 120,3208 }, { 121,3208 }, { 122,3208 }, { 123,2664 }, { 124,2664 },
+ { 125,2664 }, { 126,3208 }, { 127,3208 }, { 128,3208 }, { 129,3208 },
+ { 130,3208 }, { 131,3208 }, { 132,3208 }, { 133,3208 }, { 134,3208 },
+ { 135,3208 }, { 136,3208 }, { 137,3208 }, { 138,3208 }, { 139,3208 },
+ { 140,3208 }, { 141,3208 }, { 142,3208 }, { 143,3208 }, { 144,3208 },
+ { 145,3208 }, { 146,3208 }, { 147,3208 }, { 148,3208 }, { 149,3208 },
+ { 150,3208 }, { 151,3208 }, { 152,3208 }, { 153,3208 }, { 154,3208 },
+ { 155,3208 }, { 156,3208 }, { 157,3208 }, { 158,3208 }, { 159,3208 },
+ { 160,3208 }, { 161,3208 }, { 162,3208 }, { 163,3208 }, { 164,3208 },
+
+ { 165,3208 }, { 166,3208 }, { 167,3208 }, { 168,3208 }, { 169,3208 },
+ { 170,3208 }, { 171,3208 }, { 172,3208 }, { 173,3208 }, { 174,3208 },
+ { 175,3208 }, { 176,3208 }, { 177,3208 }, { 178,3208 }, { 179,3208 },
+ { 180,3208 }, { 181,3208 }, { 182,3208 }, { 183,3208 }, { 184,3208 },
+ { 185,3208 }, { 186,3208 }, { 187,3208 }, { 188,3208 }, { 189,3208 },
+ { 190,3208 }, { 191,3208 }, { 192,3208 }, { 193,3208 }, { 194,3208 },
+ { 195,3208 }, { 196,3208 }, { 197,3208 }, { 198,3208 }, { 199,3208 },
+ { 200,3208 }, { 201,3208 }, { 202,3208 }, { 203,3208 }, { 204,3208 },
+ { 205,3208 }, { 206,3208 }, { 207,3208 }, { 208,3208 }, { 209,3208 },
+ { 210,3208 }, { 211,3208 }, { 212,3208 }, { 213,3208 }, { 214,3208 },
+
+ { 215,3208 }, { 216,3208 }, { 217,3208 }, { 218,3208 }, { 219,3208 },
+ { 220,3208 }, { 221,3208 }, { 222,3208 }, { 223,3208 }, { 224,3208 },
+ { 225,3208 }, { 226,3208 }, { 227,3208 }, { 228,3208 }, { 229,3208 },
+ { 230,3208 }, { 231,3208 }, { 232,3208 }, { 233,3208 }, { 234,3208 },
+ { 235,3208 }, { 236,3208 }, { 237,3208 }, { 238,3208 }, { 239,3208 },
+ { 240,3208 }, { 241,3208 }, { 242,3208 }, { 243,3208 }, { 244,3208 },
+ { 245,3208 }, { 246,3208 }, { 247,3208 }, { 248,3208 }, { 249,3208 },
+ { 250,3208 }, { 251,3208 }, { 252,3208 }, { 253,3208 }, { 254,3208 },
+ { 255,3208 }, { 256,3208 }, { 0, 0 }, { 0,9010 }, { 1,2950 },
+ { 2,2950 }, { 3,2950 }, { 4,2950 }, { 5,2950 }, { 6,2950 },
+
+ { 7,2950 }, { 8,2950 }, { 9,3208 }, { 10,3208 }, { 11,2950 },
+ { 12,3208 }, { 13,3208 }, { 14,2950 }, { 15,2950 }, { 16,2950 },
+ { 17,2950 }, { 18,2950 }, { 19,2950 }, { 20,2950 }, { 21,2950 },
+ { 22,2950 }, { 23,2950 }, { 24,2950 }, { 25,2950 }, { 26,2950 },
+ { 27,2950 }, { 28,2950 }, { 29,2950 }, { 30,2950 }, { 31,2950 },
+ { 32,3208 }, { 33,2406 }, { 34,2406 }, { 35,2406 }, { 36,2406 },
+ { 37,2406 }, { 38,2406 }, { 39,2950 }, { 40,2406 }, { 41,2406 },
+ { 42,2406 }, { 43,2406 }, { 44,2406 }, { 45,2406 }, { 46,2406 },
+ { 47,2426 }, { 48,2950 }, { 49,2950 }, { 50,2950 }, { 51,2950 },
+ { 52,2950 }, { 53,2950 }, { 54,2950 }, { 55,2950 }, { 56,2950 },
+
+ { 57,2950 }, { 58,2406 }, { 59,2950 }, { 60,2406 }, { 61,2406 },
+ { 62,2406 }, { 63,2406 }, { 64,2406 }, { 65,2950 }, { 66,2950 },
+ { 67,2950 }, { 68,2950 }, { 69,2950 }, { 70,2950 }, { 71,2950 },
+ { 72,2950 }, { 73,2950 }, { 74,2950 }, { 75,2950 }, { 76,2950 },
+ { 77,2950 }, { 78,2950 }, { 79,2950 }, { 80,2950 }, { 81,2950 },
+ { 82,2950 }, { 83,2950 }, { 84,2950 }, { 85,2950 }, { 86,2950 },
+ { 87,2950 }, { 88,2950 }, { 89,2950 }, { 90,2950 }, { 91,2406 },
+ { 92,2692 }, { 93,2406 }, { 94,2950 }, { 95,2950 }, { 96,2950 },
+ { 97,2950 }, { 98,2950 }, { 99,2950 }, { 100,2950 }, { 101,2950 },
+ { 102,2950 }, { 103,2950 }, { 104,2950 }, { 105,2950 }, { 106,2950 },
+
+ { 107,2950 }, { 108,2950 }, { 109,2950 }, { 110,2950 }, { 111,2950 },
+ { 112,2950 }, { 113,2950 }, { 114,2950 }, { 115,2950 }, { 116,2950 },
+ { 117,2950 }, { 118,2950 }, { 119,2950 }, { 120,2950 }, { 121,2950 },
+ { 122,2950 }, { 123,2406 }, { 124,2406 }, { 125,2406 }, { 126,2950 },
+ { 127,2950 }, { 128,2950 }, { 129,2950 }, { 130,2950 }, { 131,2950 },
+ { 132,2950 }, { 133,2950 }, { 134,2950 }, { 135,2950 }, { 136,2950 },
+ { 137,2950 }, { 138,2950 }, { 139,2950 }, { 140,2950 }, { 141,2950 },
+ { 142,2950 }, { 143,2950 }, { 144,2950 }, { 145,2950 }, { 146,2950 },
+ { 147,2950 }, { 148,2950 }, { 149,2950 }, { 150,2950 }, { 151,2950 },
+ { 152,2950 }, { 153,2950 }, { 154,2950 }, { 155,2950 }, { 156,2950 },
+
+ { 157,2950 }, { 158,2950 }, { 159,2950 }, { 160,2950 }, { 161,2950 },
+ { 162,2950 }, { 163,2950 }, { 164,2950 }, { 165,2950 }, { 166,2950 },
+ { 167,2950 }, { 168,2950 }, { 169,2950 }, { 170,2950 }, { 171,2950 },
+ { 172,2950 }, { 173,2950 }, { 174,2950 }, { 175,2950 }, { 176,2950 },
+ { 177,2950 }, { 178,2950 }, { 179,2950 }, { 180,2950 }, { 181,2950 },
+ { 182,2950 }, { 183,2950 }, { 184,2950 }, { 185,2950 }, { 186,2950 },
+ { 187,2950 }, { 188,2950 }, { 189,2950 }, { 190,2950 }, { 191,2950 },
+ { 192,2950 }, { 193,2950 }, { 194,2950 }, { 195,2950 }, { 196,2950 },
+ { 197,2950 }, { 198,2950 }, { 199,2950 }, { 200,2950 }, { 201,2950 },
+ { 202,2950 }, { 203,2950 }, { 204,2950 }, { 205,2950 }, { 206,2950 },
+
+ { 207,2950 }, { 208,2950 }, { 209,2950 }, { 210,2950 }, { 211,2950 },
+ { 212,2950 }, { 213,2950 }, { 214,2950 }, { 215,2950 }, { 216,2950 },
+ { 217,2950 }, { 218,2950 }, { 219,2950 }, { 220,2950 }, { 221,2950 },
+ { 222,2950 }, { 223,2950 }, { 224,2950 }, { 225,2950 }, { 226,2950 },
+ { 227,2950 }, { 228,2950 }, { 229,2950 }, { 230,2950 }, { 231,2950 },
+ { 232,2950 }, { 233,2950 }, { 234,2950 }, { 235,2950 }, { 236,2950 },
+ { 237,2950 }, { 238,2950 }, { 239,2950 }, { 240,2950 }, { 241,2950 },
+ { 242,2950 }, { 243,2950 }, { 244,2950 }, { 245,2950 }, { 246,2950 },
+ { 247,2950 }, { 248,2950 }, { 249,2950 }, { 250,2950 }, { 251,2950 },
+ { 252,2950 }, { 253,2950 }, { 254,2950 }, { 255,2950 }, { 256,2950 },
+
+ { 0, 0 }, { 0,8752 }, { 1,2176 }, { 2,2176 }, { 3,2176 },
+ { 4,2176 }, { 5,2176 }, { 6,2176 }, { 7,2176 }, { 8,2176 },
+ { 9,2176 }, { 10,2176 }, { 11,2176 }, { 12,2176 }, { 13,2176 },
+ { 14,2176 }, { 15,2176 }, { 16,2176 }, { 17,2176 }, { 18,2176 },
+ { 19,2176 }, { 20,2176 }, { 21,2176 }, { 22,2176 }, { 23,2176 },
+ { 24,2176 }, { 25,2176 }, { 26,2176 }, { 27,2176 }, { 28,2176 },
+ { 29,2176 }, { 30,2176 }, { 31,2176 }, { 32,2176 }, { 33,2176 },
+ { 34,2170 }, { 35,2176 }, { 36,2176 }, { 37,2176 }, { 38,2176 },
+ { 39,2176 }, { 40,2176 }, { 41,2176 }, { 42,2176 }, { 43,2176 },
+ { 44,2176 }, { 45,2176 }, { 46,2176 }, { 47,2176 }, { 48,2176 },
+
+ { 49,2176 }, { 50,2176 }, { 51,2176 }, { 52,2176 }, { 53,2176 },
+ { 54,2176 }, { 55,2176 }, { 56,2176 }, { 57,2176 }, { 58,2176 },
+ { 59,2176 }, { 60,2176 }, { 61,2176 }, { 62,2176 }, { 63,2176 },
+ { 64,2176 }, { 65,2176 }, { 66,2176 }, { 67,2176 }, { 68,2176 },
+ { 69,2176 }, { 70,2176 }, { 71,2176 }, { 72,2176 }, { 73,2176 },
+ { 74,2176 }, { 75,2176 }, { 76,2176 }, { 77,2176 }, { 78,2176 },
+ { 79,2176 }, { 80,2176 }, { 81,2176 }, { 82,2176 }, { 83,2176 },
+ { 84,2176 }, { 85,2176 }, { 86,2176 }, { 87,2176 }, { 88,2176 },
+ { 89,2176 }, { 90,2176 }, { 91,2176 }, { 92,2434 }, { 93,2176 },
+ { 94,2176 }, { 95,2176 }, { 96,2176 }, { 97,2176 }, { 98,2176 },
+
+ { 99,2176 }, { 100,2176 }, { 101,2176 }, { 102,2176 }, { 103,2176 },
+ { 104,2176 }, { 105,2176 }, { 106,2176 }, { 107,2176 }, { 108,2176 },
+ { 109,2176 }, { 110,2176 }, { 111,2176 }, { 112,2176 }, { 113,2176 },
+ { 114,2176 }, { 115,2176 }, { 116,2176 }, { 117,2176 }, { 118,2176 },
+ { 119,2176 }, { 120,2176 }, { 121,2176 }, { 122,2176 }, { 123,2176 },
+ { 124,2176 }, { 125,2176 }, { 126,2176 }, { 127,2176 }, { 128,2176 },
+ { 129,2176 }, { 130,2176 }, { 131,2176 }, { 132,2176 }, { 133,2176 },
+ { 134,2176 }, { 135,2176 }, { 136,2176 }, { 137,2176 }, { 138,2176 },
+ { 139,2176 }, { 140,2176 }, { 141,2176 }, { 142,2176 }, { 143,2176 },
+ { 144,2176 }, { 145,2176 }, { 146,2176 }, { 147,2176 }, { 148,2176 },
+
+ { 149,2176 }, { 150,2176 }, { 151,2176 }, { 152,2176 }, { 153,2176 },
+ { 154,2176 }, { 155,2176 }, { 156,2176 }, { 157,2176 }, { 158,2176 },
+ { 159,2176 }, { 160,2176 }, { 161,2176 }, { 162,2176 }, { 163,2176 },
+ { 164,2176 }, { 165,2176 }, { 166,2176 }, { 167,2176 }, { 168,2176 },
+ { 169,2176 }, { 170,2176 }, { 171,2176 }, { 172,2176 }, { 173,2176 },
+ { 174,2176 }, { 175,2176 }, { 176,2176 }, { 177,2176 }, { 178,2176 },
+ { 179,2176 }, { 180,2176 }, { 181,2176 }, { 182,2176 }, { 183,2176 },
+ { 184,2176 }, { 185,2176 }, { 186,2176 }, { 187,2176 }, { 188,2176 },
+ { 189,2176 }, { 190,2176 }, { 191,2176 }, { 192,2176 }, { 193,2176 },
+ { 194,2176 }, { 195,2176 }, { 196,2176 }, { 197,2176 }, { 198,2176 },
+
+ { 199,2176 }, { 200,2176 }, { 201,2176 }, { 202,2176 }, { 203,2176 },
+ { 204,2176 }, { 205,2176 }, { 206,2176 }, { 207,2176 }, { 208,2176 },
+ { 209,2176 }, { 210,2176 }, { 211,2176 }, { 212,2176 }, { 213,2176 },
+ { 214,2176 }, { 215,2176 }, { 216,2176 }, { 217,2176 }, { 218,2176 },
+ { 219,2176 }, { 220,2176 }, { 221,2176 }, { 222,2176 }, { 223,2176 },
+ { 224,2176 }, { 225,2176 }, { 226,2176 }, { 227,2176 }, { 228,2176 },
+ { 229,2176 }, { 230,2176 }, { 231,2176 }, { 232,2176 }, { 233,2176 },
+ { 234,2176 }, { 235,2176 }, { 236,2176 }, { 237,2176 }, { 238,2176 },
+ { 239,2176 }, { 240,2176 }, { 241,2176 }, { 242,2176 }, { 243,2176 },
+ { 244,2176 }, { 245,2176 }, { 246,2176 }, { 247,2176 }, { 248,2176 },
+
+ { 249,2176 }, { 250,2176 }, { 251,2176 }, { 252,2176 }, { 253,2176 },
+ { 254,2176 }, { 255,2176 }, { 256,2176 }, { 0, 0 }, { 0,8494 },
+ { 1,1918 }, { 2,1918 }, { 3,1918 }, { 4,1918 }, { 5,1918 },
+ { 6,1918 }, { 7,1918 }, { 8,1918 }, { 9,1918 }, { 10,1918 },
+ { 11,1918 }, { 12,1918 }, { 13,1918 }, { 14,1918 }, { 15,1918 },
+ { 16,1918 }, { 17,1918 }, { 18,1918 }, { 19,1918 }, { 20,1918 },
+ { 21,1918 }, { 22,1918 }, { 23,1918 }, { 24,1918 }, { 25,1918 },
+ { 26,1918 }, { 27,1918 }, { 28,1918 }, { 29,1918 }, { 30,1918 },
+ { 31,1918 }, { 32,1918 }, { 33,1918 }, { 34,1912 }, { 35,1918 },
+ { 36,1918 }, { 37,1918 }, { 38,1918 }, { 39,1918 }, { 40,1918 },
+
+ { 41,1918 }, { 42,1918 }, { 43,1918 }, { 44,1918 }, { 45,1918 },
+ { 46,1918 }, { 47,1918 }, { 48,1918 }, { 49,1918 }, { 50,1918 },
+ { 51,1918 }, { 52,1918 }, { 53,1918 }, { 54,1918 }, { 55,1918 },
+ { 56,1918 }, { 57,1918 }, { 58,1918 }, { 59,1918 }, { 60,1918 },
+ { 61,1918 }, { 62,1918 }, { 63,1918 }, { 64,1918 }, { 65,1918 },
+ { 66,1918 }, { 67,1918 }, { 68,1918 }, { 69,1918 }, { 70,1918 },
+ { 71,1918 }, { 72,1918 }, { 73,1918 }, { 74,1918 }, { 75,1918 },
+ { 76,1918 }, { 77,1918 }, { 78,1918 }, { 79,1918 }, { 80,1918 },
+ { 81,1918 }, { 82,1918 }, { 83,1918 }, { 84,1918 }, { 85,1918 },
+ { 86,1918 }, { 87,1918 }, { 88,1918 }, { 89,1918 }, { 90,1918 },
+
+ { 91,1918 }, { 92,2176 }, { 93,1918 }, { 94,1918 }, { 95,1918 },
+ { 96,1918 }, { 97,1918 }, { 98,1918 }, { 99,1918 }, { 100,1918 },
+ { 101,1918 }, { 102,1918 }, { 103,1918 }, { 104,1918 }, { 105,1918 },
+ { 106,1918 }, { 107,1918 }, { 108,1918 }, { 109,1918 }, { 110,1918 },
+ { 111,1918 }, { 112,1918 }, { 113,1918 }, { 114,1918 }, { 115,1918 },
+ { 116,1918 }, { 117,1918 }, { 118,1918 }, { 119,1918 }, { 120,1918 },
+ { 121,1918 }, { 122,1918 }, { 123,1918 }, { 124,1918 }, { 125,1918 },
+ { 126,1918 }, { 127,1918 }, { 128,1918 }, { 129,1918 }, { 130,1918 },
+ { 131,1918 }, { 132,1918 }, { 133,1918 }, { 134,1918 }, { 135,1918 },
+ { 136,1918 }, { 137,1918 }, { 138,1918 }, { 139,1918 }, { 140,1918 },
+
+ { 141,1918 }, { 142,1918 }, { 143,1918 }, { 144,1918 }, { 145,1918 },
+ { 146,1918 }, { 147,1918 }, { 148,1918 }, { 149,1918 }, { 150,1918 },
+ { 151,1918 }, { 152,1918 }, { 153,1918 }, { 154,1918 }, { 155,1918 },
+ { 156,1918 }, { 157,1918 }, { 158,1918 }, { 159,1918 }, { 160,1918 },
+ { 161,1918 }, { 162,1918 }, { 163,1918 }, { 164,1918 }, { 165,1918 },
+ { 166,1918 }, { 167,1918 }, { 168,1918 }, { 169,1918 }, { 170,1918 },
+ { 171,1918 }, { 172,1918 }, { 173,1918 }, { 174,1918 }, { 175,1918 },
+ { 176,1918 }, { 177,1918 }, { 178,1918 }, { 179,1918 }, { 180,1918 },
+ { 181,1918 }, { 182,1918 }, { 183,1918 }, { 184,1918 }, { 185,1918 },
+ { 186,1918 }, { 187,1918 }, { 188,1918 }, { 189,1918 }, { 190,1918 },
+
+ { 191,1918 }, { 192,1918 }, { 193,1918 }, { 194,1918 }, { 195,1918 },
+ { 196,1918 }, { 197,1918 }, { 198,1918 }, { 199,1918 }, { 200,1918 },
+ { 201,1918 }, { 202,1918 }, { 203,1918 }, { 204,1918 }, { 205,1918 },
+ { 206,1918 }, { 207,1918 }, { 208,1918 }, { 209,1918 }, { 210,1918 },
+ { 211,1918 }, { 212,1918 }, { 213,1918 }, { 214,1918 }, { 215,1918 },
+ { 216,1918 }, { 217,1918 }, { 218,1918 }, { 219,1918 }, { 220,1918 },
+ { 221,1918 }, { 222,1918 }, { 223,1918 }, { 224,1918 }, { 225,1918 },
+ { 226,1918 }, { 227,1918 }, { 228,1918 }, { 229,1918 }, { 230,1918 },
+ { 231,1918 }, { 232,1918 }, { 233,1918 }, { 234,1918 }, { 235,1918 },
+ { 236,1918 }, { 237,1918 }, { 238,1918 }, { 239,1918 }, { 240,1918 },
+
+ { 241,1918 }, { 242,1918 }, { 243,1918 }, { 244,1918 }, { 245,1918 },
+ { 246,1918 }, { 247,1918 }, { 248,1918 }, { 249,1918 }, { 250,1918 },
+ { 251,1918 }, { 252,1918 }, { 253,1918 }, { 254,1918 }, { 255,1918 },
+ { 256,1918 }, { 0, 0 }, { 0,8236 }, { 1,2468 }, { 2,2468 },
+ { 3,2468 }, { 4,2468 }, { 5,2468 }, { 6,2468 }, { 7,2468 },
+ { 8,2468 }, { 9,2468 }, { 10,2468 }, { 11,2468 }, { 12,2468 },
+ { 13,2468 }, { 14,2468 }, { 15,2468 }, { 16,2468 }, { 17,2468 },
+ { 18,2468 }, { 19,2468 }, { 20,2468 }, { 21,2468 }, { 22,2468 },
+ { 23,2468 }, { 24,2468 }, { 25,2468 }, { 26,2468 }, { 27,2468 },
+ { 28,2468 }, { 29,2468 }, { 30,2468 }, { 31,2468 }, { 32,2468 },
+
+ { 33,2468 }, { 34,2468 }, { 35,2468 }, { 36,2468 }, { 37,2468 },
+ { 38,2468 }, { 39,2468 }, { 40,2468 }, { 41,2468 }, { 42,2189 },
+ { 43,2468 }, { 44,2468 }, { 45,2468 }, { 46,2468 }, { 47,2468 },
+ { 48,2468 }, { 49,2468 }, { 50,2468 }, { 51,2468 }, { 52,2468 },
+ { 53,2468 }, { 54,2468 }, { 55,2468 }, { 56,2468 }, { 57,2468 },
+ { 58,2468 }, { 59,2468 }, { 60,2468 }, { 61,2468 }, { 62,2468 },
+ { 63,2468 }, { 64,2468 }, { 65,2468 }, { 66,2468 }, { 67,2468 },
+ { 68,2468 }, { 69,2468 }, { 70,2468 }, { 71,2468 }, { 72,2468 },
+ { 73,2468 }, { 74,2468 }, { 75,2468 }, { 76,2468 }, { 77,2468 },
+ { 78,2468 }, { 79,2468 }, { 80,2468 }, { 81,2468 }, { 82,2468 },
+
+ { 83,2468 }, { 84,2468 }, { 85,2468 }, { 86,2468 }, { 87,2468 },
+ { 88,2468 }, { 89,2468 }, { 90,2468 }, { 91,2468 }, { 92,2468 },
+ { 93,2468 }, { 94,2468 }, { 95,2468 }, { 96,2468 }, { 97,2468 },
+ { 98,2468 }, { 99,2468 }, { 100,2468 }, { 101,2468 }, { 102,2468 },
+ { 103,2468 }, { 104,2468 }, { 105,2468 }, { 106,2468 }, { 107,2468 },
+ { 108,2468 }, { 109,2468 }, { 110,2468 }, { 111,2468 }, { 112,2468 },
+ { 113,2468 }, { 114,2468 }, { 115,2468 }, { 116,2468 }, { 117,2468 },
+ { 118,2468 }, { 119,2468 }, { 120,2468 }, { 121,2468 }, { 122,2468 },
+ { 123,2468 }, { 124,2468 }, { 125,2468 }, { 126,2468 }, { 127,2468 },
+ { 128,2468 }, { 129,2468 }, { 130,2468 }, { 131,2468 }, { 132,2468 },
+
+ { 133,2468 }, { 134,2468 }, { 135,2468 }, { 136,2468 }, { 137,2468 },
+ { 138,2468 }, { 139,2468 }, { 140,2468 }, { 141,2468 }, { 142,2468 },
+ { 143,2468 }, { 144,2468 }, { 145,2468 }, { 146,2468 }, { 147,2468 },
+ { 148,2468 }, { 149,2468 }, { 150,2468 }, { 151,2468 }, { 152,2468 },
+ { 153,2468 }, { 154,2468 }, { 155,2468 }, { 156,2468 }, { 157,2468 },
+ { 158,2468 }, { 159,2468 }, { 160,2468 }, { 161,2468 }, { 162,2468 },
+ { 163,2468 }, { 164,2468 }, { 165,2468 }, { 166,2468 }, { 167,2468 },
+ { 168,2468 }, { 169,2468 }, { 170,2468 }, { 171,2468 }, { 172,2468 },
+ { 173,2468 }, { 174,2468 }, { 175,2468 }, { 176,2468 }, { 177,2468 },
+ { 178,2468 }, { 179,2468 }, { 180,2468 }, { 181,2468 }, { 182,2468 },
+
+ { 183,2468 }, { 184,2468 }, { 185,2468 }, { 186,2468 }, { 187,2468 },
+ { 188,2468 }, { 189,2468 }, { 190,2468 }, { 191,2468 }, { 192,2468 },
+ { 193,2468 }, { 194,2468 }, { 195,2468 }, { 196,2468 }, { 197,2468 },
+ { 198,2468 }, { 199,2468 }, { 200,2468 }, { 201,2468 }, { 202,2468 },
+ { 203,2468 }, { 204,2468 }, { 205,2468 }, { 206,2468 }, { 207,2468 },
+ { 208,2468 }, { 209,2468 }, { 210,2468 }, { 211,2468 }, { 212,2468 },
+ { 213,2468 }, { 214,2468 }, { 215,2468 }, { 216,2468 }, { 217,2468 },
+ { 218,2468 }, { 219,2468 }, { 220,2468 }, { 221,2468 }, { 222,2468 },
+ { 223,2468 }, { 224,2468 }, { 225,2468 }, { 226,2468 }, { 227,2468 },
+ { 228,2468 }, { 229,2468 }, { 230,2468 }, { 231,2468 }, { 232,2468 },
+
+ { 233,2468 }, { 234,2468 }, { 235,2468 }, { 236,2468 }, { 237,2468 },
+ { 238,2468 }, { 239,2468 }, { 240,2468 }, { 241,2468 }, { 242,2468 },
+ { 243,2468 }, { 244,2468 }, { 245,2468 }, { 246,2468 }, { 247,2468 },
+ { 248,2468 }, { 249,2468 }, { 250,2468 }, { 251,2468 }, { 252,2468 },
+ { 253,2468 }, { 254,2468 }, { 255,2468 }, { 256,2468 }, { 0, 0 },
+ { 0,7978 }, { 1,2210 }, { 2,2210 }, { 3,2210 }, { 4,2210 },
+ { 5,2210 }, { 6,2210 }, { 7,2210 }, { 8,2210 }, { 9,2210 },
+ { 10,2210 }, { 11,2210 }, { 12,2210 }, { 13,2210 }, { 14,2210 },
+ { 15,2210 }, { 16,2210 }, { 17,2210 }, { 18,2210 }, { 19,2210 },
+ { 20,2210 }, { 21,2210 }, { 22,2210 }, { 23,2210 }, { 24,2210 },
+
+ { 25,2210 }, { 26,2210 }, { 27,2210 }, { 28,2210 }, { 29,2210 },
+ { 30,2210 }, { 31,2210 }, { 32,2210 }, { 33,2210 }, { 34,2210 },
+ { 35,2210 }, { 36,2210 }, { 37,2210 }, { 38,2210 }, { 39,2210 },
+ { 40,2210 }, { 41,2210 }, { 42,1931 }, { 43,2210 }, { 44,2210 },
+ { 45,2210 }, { 46,2210 }, { 47,2210 }, { 48,2210 }, { 49,2210 },
+ { 50,2210 }, { 51,2210 }, { 52,2210 }, { 53,2210 }, { 54,2210 },
+ { 55,2210 }, { 56,2210 }, { 57,2210 }, { 58,2210 }, { 59,2210 },
+ { 60,2210 }, { 61,2210 }, { 62,2210 }, { 63,2210 }, { 64,2210 },
+ { 65,2210 }, { 66,2210 }, { 67,2210 }, { 68,2210 }, { 69,2210 },
+ { 70,2210 }, { 71,2210 }, { 72,2210 }, { 73,2210 }, { 74,2210 },
+
+ { 75,2210 }, { 76,2210 }, { 77,2210 }, { 78,2210 }, { 79,2210 },
+ { 80,2210 }, { 81,2210 }, { 82,2210 }, { 83,2210 }, { 84,2210 },
+ { 85,2210 }, { 86,2210 }, { 87,2210 }, { 88,2210 }, { 89,2210 },
+ { 90,2210 }, { 91,2210 }, { 92,2210 }, { 93,2210 }, { 94,2210 },
+ { 95,2210 }, { 96,2210 }, { 97,2210 }, { 98,2210 }, { 99,2210 },
+ { 100,2210 }, { 101,2210 }, { 102,2210 }, { 103,2210 }, { 104,2210 },
+ { 105,2210 }, { 106,2210 }, { 107,2210 }, { 108,2210 }, { 109,2210 },
+ { 110,2210 }, { 111,2210 }, { 112,2210 }, { 113,2210 }, { 114,2210 },
+ { 115,2210 }, { 116,2210 }, { 117,2210 }, { 118,2210 }, { 119,2210 },
+ { 120,2210 }, { 121,2210 }, { 122,2210 }, { 123,2210 }, { 124,2210 },
+
+ { 125,2210 }, { 126,2210 }, { 127,2210 }, { 128,2210 }, { 129,2210 },
+ { 130,2210 }, { 131,2210 }, { 132,2210 }, { 133,2210 }, { 134,2210 },
+ { 135,2210 }, { 136,2210 }, { 137,2210 }, { 138,2210 }, { 139,2210 },
+ { 140,2210 }, { 141,2210 }, { 142,2210 }, { 143,2210 }, { 144,2210 },
+ { 145,2210 }, { 146,2210 }, { 147,2210 }, { 148,2210 }, { 149,2210 },
+ { 150,2210 }, { 151,2210 }, { 152,2210 }, { 153,2210 }, { 154,2210 },
+ { 155,2210 }, { 156,2210 }, { 157,2210 }, { 158,2210 }, { 159,2210 },
+ { 160,2210 }, { 161,2210 }, { 162,2210 }, { 163,2210 }, { 164,2210 },
+ { 165,2210 }, { 166,2210 }, { 167,2210 }, { 168,2210 }, { 169,2210 },
+ { 170,2210 }, { 171,2210 }, { 172,2210 }, { 173,2210 }, { 174,2210 },
+
+ { 175,2210 }, { 176,2210 }, { 177,2210 }, { 178,2210 }, { 179,2210 },
+ { 180,2210 }, { 181,2210 }, { 182,2210 }, { 183,2210 }, { 184,2210 },
+ { 185,2210 }, { 186,2210 }, { 187,2210 }, { 188,2210 }, { 189,2210 },
+ { 190,2210 }, { 191,2210 }, { 192,2210 }, { 193,2210 }, { 194,2210 },
+ { 195,2210 }, { 196,2210 }, { 197,2210 }, { 198,2210 }, { 199,2210 },
+ { 200,2210 }, { 201,2210 }, { 202,2210 }, { 203,2210 }, { 204,2210 },
+ { 205,2210 }, { 206,2210 }, { 207,2210 }, { 208,2210 }, { 209,2210 },
+ { 210,2210 }, { 211,2210 }, { 212,2210 }, { 213,2210 }, { 214,2210 },
+ { 215,2210 }, { 216,2210 }, { 217,2210 }, { 218,2210 }, { 219,2210 },
+ { 220,2210 }, { 221,2210 }, { 222,2210 }, { 223,2210 }, { 224,2210 },
+
+ { 225,2210 }, { 226,2210 }, { 227,2210 }, { 228,2210 }, { 229,2210 },
+ { 230,2210 }, { 231,2210 }, { 232,2210 }, { 233,2210 }, { 234,2210 },
+ { 235,2210 }, { 236,2210 }, { 237,2210 }, { 238,2210 }, { 239,2210 },
+ { 240,2210 }, { 241,2210 }, { 242,2210 }, { 243,2210 }, { 244,2210 },
+ { 245,2210 }, { 246,2210 }, { 247,2210 }, { 248,2210 }, { 249,2210 },
+ { 250,2210 }, { 251,2210 }, { 252,2210 }, { 253,2210 }, { 254,2210 },
+ { 255,2210 }, { 256,2210 }, { 0, 49 }, { 0,7720 }, { 1,2210 },
+ { 2,2210 }, { 3,2210 }, { 4,2210 }, { 5,2210 }, { 6,2210 },
+ { 7,2210 }, { 8,2210 }, { 0, 0 }, { 0, 0 }, { 11,2210 },
+ { 0, 0 }, { 0, 0 }, { 14,2210 }, { 15,2210 }, { 16,2210 },
+
+ { 17,2210 }, { 18,2210 }, { 19,2210 }, { 20,2210 }, { 21,2210 },
+ { 22,2210 }, { 23,2210 }, { 24,2210 }, { 25,2210 }, { 26,2210 },
+ { 27,2210 }, { 28,2210 }, { 29,2210 }, { 30,2210 }, { 31,2210 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39,2210 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48,2210 }, { 49,2210 }, { 50,2210 }, { 51,2210 },
+ { 52,2210 }, { 53,2210 }, { 54,2210 }, { 55,2210 }, { 56,2210 },
+ { 57,2210 }, { 0, 0 }, { 59,2210 }, { 0, 0 }, { 0, 26 },
+ { 0,7658 }, { 0, 47 }, { 0,7656 }, { 65,2210 }, { 66,2210 },
+
+ { 67,2210 }, { 68,2210 }, { 69,2210 }, { 70,2210 }, { 71,2210 },
+ { 72,2210 }, { 73,2210 }, { 74,2210 }, { 75,2210 }, { 76,2210 },
+ { 77,2210 }, { 78,2210 }, { 79,2210 }, { 80,2210 }, { 81,2210 },
+ { 82,2210 }, { 83,2210 }, { 84,2210 }, { 85,2210 }, { 86,2210 },
+ { 87,2210 }, { 88,2210 }, { 89,2210 }, { 90,2210 }, { 0, 37 },
+ { 0,7628 }, { 0, 0 }, { 94,2210 }, { 95,2210 }, { 96,2210 },
+ { 97,2210 }, { 98,2210 }, { 99,2210 }, { 100,2210 }, { 101,2210 },
+ { 102,2210 }, { 103,2210 }, { 104,2210 }, { 105,2210 }, { 106,2210 },
+ { 107,2210 }, { 108,2210 }, { 109,2210 }, { 110,2210 }, { 111,2210 },
+ { 112,2210 }, { 113,2210 }, { 114,2210 }, { 115,2210 }, { 116,2210 },
+
+ { 117,2210 }, { 118,2210 }, { 119,2210 }, { 120,2210 }, { 121,2210 },
+ { 122,2210 }, { 61,1631 }, { 0, 0 }, { 0, 0 }, { 126,2210 },
+ { 127,2210 }, { 128,2210 }, { 129,2210 }, { 130,2210 }, { 131,2210 },
+ { 132,2210 }, { 133,2210 }, { 134,2210 }, { 135,2210 }, { 136,2210 },
+ { 137,2210 }, { 138,2210 }, { 139,2210 }, { 140,2210 }, { 141,2210 },
+ { 142,2210 }, { 143,2210 }, { 144,2210 }, { 145,2210 }, { 146,2210 },
+ { 147,2210 }, { 148,2210 }, { 149,2210 }, { 150,2210 }, { 151,2210 },
+ { 152,2210 }, { 153,2210 }, { 154,2210 }, { 155,2210 }, { 156,2210 },
+ { 157,2210 }, { 158,2210 }, { 159,2210 }, { 160,2210 }, { 161,2210 },
+ { 162,2210 }, { 163,2210 }, { 164,2210 }, { 165,2210 }, { 166,2210 },
+
+ { 167,2210 }, { 168,2210 }, { 169,2210 }, { 170,2210 }, { 171,2210 },
+ { 172,2210 }, { 173,2210 }, { 174,2210 }, { 175,2210 }, { 176,2210 },
+ { 177,2210 }, { 178,2210 }, { 179,2210 }, { 180,2210 }, { 181,2210 },
+ { 182,2210 }, { 183,2210 }, { 184,2210 }, { 185,2210 }, { 186,2210 },
+ { 187,2210 }, { 188,2210 }, { 189,2210 }, { 190,2210 }, { 191,2210 },
+ { 192,2210 }, { 193,2210 }, { 194,2210 }, { 195,2210 }, { 196,2210 },
+ { 197,2210 }, { 198,2210 }, { 199,2210 }, { 200,2210 }, { 201,2210 },
+ { 202,2210 }, { 203,2210 }, { 204,2210 }, { 205,2210 }, { 206,2210 },
+ { 207,2210 }, { 208,2210 }, { 209,2210 }, { 210,2210 }, { 211,2210 },
+ { 212,2210 }, { 213,2210 }, { 214,2210 }, { 215,2210 }, { 216,2210 },
+
+ { 217,2210 }, { 218,2210 }, { 219,2210 }, { 220,2210 }, { 221,2210 },
+ { 222,2210 }, { 223,2210 }, { 224,2210 }, { 225,2210 }, { 226,2210 },
+ { 227,2210 }, { 228,2210 }, { 229,2210 }, { 230,2210 }, { 231,2210 },
+ { 232,2210 }, { 233,2210 }, { 234,2210 }, { 235,2210 }, { 236,2210 },
+ { 237,2210 }, { 238,2210 }, { 239,2210 }, { 240,2210 }, { 241,2210 },
+ { 242,2210 }, { 243,2210 }, { 244,2210 }, { 245,2210 }, { 246,2210 },
+ { 247,2210 }, { 248,2210 }, { 249,2210 }, { 250,2210 }, { 251,2210 },
+ { 252,2210 }, { 253,2210 }, { 254,2210 }, { 255,2210 }, { 256,2210 },
+ { 0, 38 }, { 0,7462 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 9,2210 }, { 10,2210 }, { 0, 0 }, { 12,2210 }, { 13,2210 },
+ { 0, 0 }, { 0, 37 }, { 0,7446 }, { 0, 0 }, { 0, 37 },
+ { 0,7443 }, { 1,2210 }, { 2,2210 }, { 3,2210 }, { 4,2210 },
+ { 5,2210 }, { 6,2210 }, { 7,2210 }, { 8,2210 }, { 0, 0 },
+ { 0, 0 }, { 11,2210 }, { 0, 0 }, { 32,2210 }, { 14,2210 },
+ { 15,2210 }, { 16,2210 }, { 17,2210 }, { 18,2210 }, { 19,2210 },
+ { 20,2210 }, { 21,2210 }, { 22,2210 }, { 23,2210 }, { 24,2210 },
+ { 25,2210 }, { 26,2210 }, { 27,2210 }, { 28,2210 }, { 29,2210 },
+ { 30,2210 }, { 31,2210 }, { 0, 0 }, { 0, 0 }, { 34,1418 },
+ { 38,1423 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,2210 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,2210 }, { 49,2210 },
+ { 50,2210 }, { 51,2210 }, { 52,2210 }, { 53,2210 }, { 54,2210 },
+ { 55,2210 }, { 56,2210 }, { 57,2210 }, { 0, 0 }, { 59,2210 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65,2210 }, { 66,2210 }, { 67,2210 }, { 68,2210 }, { 69,2210 },
+ { 70,2210 }, { 71,2210 }, { 72,2210 }, { 73,2210 }, { 74,2210 },
+ { 75,2210 }, { 76,2210 }, { 77,2210 }, { 78,2210 }, { 79,2210 },
+ { 80,2210 }, { 81,2210 }, { 82,2210 }, { 83,2210 }, { 84,2210 },
+ { 85,2210 }, { 86,2210 }, { 87,2210 }, { 88,2210 }, { 89,2210 },
+
+ { 90,2210 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,2210 },
+ { 95,2210 }, { 96,2210 }, { 97,2210 }, { 98,2210 }, { 99,2210 },
+ { 100,2210 }, { 101,2210 }, { 102,2210 }, { 103,2210 }, { 104,2210 },
+ { 105,2210 }, { 106,2210 }, { 107,2210 }, { 108,2210 }, { 109,2210 },
+ { 110,2210 }, { 111,2210 }, { 112,2210 }, { 113,2210 }, { 114,2210 },
+ { 115,2210 }, { 116,2210 }, { 117,2210 }, { 118,2210 }, { 119,2210 },
+ { 120,2210 }, { 121,2210 }, { 122,2210 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 126,2210 }, { 127,2210 }, { 128,2210 }, { 129,2210 },
+ { 130,2210 }, { 131,2210 }, { 132,2210 }, { 133,2210 }, { 134,2210 },
+ { 135,2210 }, { 136,2210 }, { 137,2210 }, { 138,2210 }, { 139,2210 },
+
+ { 140,2210 }, { 141,2210 }, { 142,2210 }, { 143,2210 }, { 144,2210 },
+ { 145,2210 }, { 146,2210 }, { 147,2210 }, { 148,2210 }, { 149,2210 },
+ { 150,2210 }, { 151,2210 }, { 152,2210 }, { 153,2210 }, { 154,2210 },
+ { 155,2210 }, { 156,2210 }, { 157,2210 }, { 158,2210 }, { 159,2210 },
+ { 160,2210 }, { 161,2210 }, { 162,2210 }, { 163,2210 }, { 164,2210 },
+ { 165,2210 }, { 166,2210 }, { 167,2210 }, { 168,2210 }, { 169,2210 },
+ { 170,2210 }, { 171,2210 }, { 172,2210 }, { 173,2210 }, { 174,2210 },
+ { 175,2210 }, { 176,2210 }, { 177,2210 }, { 178,2210 }, { 179,2210 },
+ { 180,2210 }, { 181,2210 }, { 182,2210 }, { 183,2210 }, { 184,2210 },
+ { 185,2210 }, { 186,2210 }, { 187,2210 }, { 188,2210 }, { 189,2210 },
+
+ { 190,2210 }, { 191,2210 }, { 192,2210 }, { 193,2210 }, { 194,2210 },
+ { 195,2210 }, { 196,2210 }, { 197,2210 }, { 198,2210 }, { 199,2210 },
+ { 200,2210 }, { 201,2210 }, { 202,2210 }, { 203,2210 }, { 204,2210 },
+ { 205,2210 }, { 206,2210 }, { 207,2210 }, { 208,2210 }, { 209,2210 },
+ { 210,2210 }, { 211,2210 }, { 212,2210 }, { 213,2210 }, { 214,2210 },
+ { 215,2210 }, { 216,2210 }, { 217,2210 }, { 218,2210 }, { 219,2210 },
+ { 220,2210 }, { 221,2210 }, { 222,2210 }, { 223,2210 }, { 224,2210 },
+ { 225,2210 }, { 226,2210 }, { 227,2210 }, { 228,2210 }, { 229,2210 },
+ { 230,2210 }, { 231,2210 }, { 232,2210 }, { 233,2210 }, { 234,2210 },
+ { 235,2210 }, { 236,2210 }, { 237,2210 }, { 238,2210 }, { 239,2210 },
+
+ { 240,2210 }, { 241,2210 }, { 242,2210 }, { 243,2210 }, { 244,2210 },
+ { 245,2210 }, { 246,2210 }, { 247,2210 }, { 248,2210 }, { 249,2210 },
+ { 250,2210 }, { 251,2210 }, { 252,2210 }, { 253,2210 }, { 254,2210 },
+ { 255,2210 }, { 256,2210 }, { 0, 37 }, { 0,7185 }, { 0, 37 },
+ { 0,7183 }, { 0, 37 }, { 0,7181 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 28 }, { 0,7176 }, { 0, 0 }, { 0, 37 },
+ { 0,7173 }, { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 34 },
+
+ { 0,7153 }, { 0, 48 }, { 0,7151 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 42,1166 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 42,1164 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,2208 }, { 49,2208 },
+ { 50,2208 }, { 51,2208 }, { 52,2208 }, { 53,2208 }, { 54,2208 },
+ { 55,2208 }, { 56,2208 }, { 57,2208 }, { 0, 42 }, { 0,7124 },
+ { 1,2407 }, { 2,2407 }, { 3,2407 }, { 4,2407 }, { 5,2407 },
+ { 6,2407 }, { 7,2407 }, { 8,2407 }, { 61,1161 }, { 62,1163 },
+ { 11,2407 }, { 61,1175 }, { 0, 0 }, { 14,2407 }, { 15,2407 },
+ { 16,2407 }, { 17,2407 }, { 18,2407 }, { 19,2407 }, { 20,2407 },
+
+ { 21,2407 }, { 22,2407 }, { 23,2407 }, { 24,2407 }, { 25,2407 },
+ { 26,2407 }, { 27,2407 }, { 28,2407 }, { 29,2407 }, { 30,2407 },
+ { 31,2407 }, { 61,1157 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,2407 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 46,2665 }, { 0, 0 }, { 48,2407 }, { 49,2407 }, { 50,2407 },
+ { 51,2407 }, { 52,2407 }, { 53,2407 }, { 54,2407 }, { 55,2407 },
+ { 56,2407 }, { 57,2407 }, { 0, 0 }, { 59,2407 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,2407 },
+ { 66,2407 }, { 67,2407 }, { 68,2407 }, { 69,2923 }, { 70,2407 },
+
+ { 71,2407 }, { 72,2407 }, { 73,2407 }, { 74,2407 }, { 75,2407 },
+ { 76,2407 }, { 77,2407 }, { 78,2407 }, { 79,2407 }, { 80,2407 },
+ { 81,2407 }, { 82,2407 }, { 83,2407 }, { 84,2407 }, { 85,2407 },
+ { 86,2407 }, { 87,2407 }, { 88,2407 }, { 89,2407 }, { 90,2407 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,2407 }, { 95,2407 },
+ { 96,2407 }, { 97,2407 }, { 98,2407 }, { 99,2407 }, { 100,2407 },
+ { 101,2923 }, { 102,2407 }, { 103,2407 }, { 104,2407 }, { 105,2407 },
+ { 106,2407 }, { 107,2407 }, { 108,2407 }, { 109,2407 }, { 110,2407 },
+ { 111,2407 }, { 112,2407 }, { 113,2407 }, { 114,2407 }, { 115,2407 },
+ { 116,2407 }, { 117,2407 }, { 118,2407 }, { 119,2407 }, { 120,2407 },
+
+ { 121,2407 }, { 122,2407 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 126,2407 }, { 127,2407 }, { 128,2407 }, { 129,2407 }, { 130,2407 },
+ { 131,2407 }, { 132,2407 }, { 133,2407 }, { 134,2407 }, { 135,2407 },
+ { 136,2407 }, { 137,2407 }, { 138,2407 }, { 139,2407 }, { 140,2407 },
+ { 141,2407 }, { 142,2407 }, { 143,2407 }, { 144,2407 }, { 145,2407 },
+ { 146,2407 }, { 147,2407 }, { 148,2407 }, { 149,2407 }, { 150,2407 },
+ { 151,2407 }, { 152,2407 }, { 153,2407 }, { 154,2407 }, { 155,2407 },
+ { 156,2407 }, { 157,2407 }, { 158,2407 }, { 159,2407 }, { 160,2407 },
+ { 161,2407 }, { 162,2407 }, { 163,2407 }, { 164,2407 }, { 165,2407 },
+ { 166,2407 }, { 167,2407 }, { 168,2407 }, { 169,2407 }, { 170,2407 },
+
+ { 171,2407 }, { 172,2407 }, { 173,2407 }, { 174,2407 }, { 175,2407 },
+ { 176,2407 }, { 177,2407 }, { 178,2407 }, { 179,2407 }, { 180,2407 },
+ { 181,2407 }, { 182,2407 }, { 183,2407 }, { 184,2407 }, { 185,2407 },
+ { 186,2407 }, { 187,2407 }, { 188,2407 }, { 189,2407 }, { 190,2407 },
+ { 191,2407 }, { 192,2407 }, { 193,2407 }, { 194,2407 }, { 195,2407 },
+ { 196,2407 }, { 197,2407 }, { 198,2407 }, { 199,2407 }, { 200,2407 },
+ { 201,2407 }, { 202,2407 }, { 203,2407 }, { 204,2407 }, { 205,2407 },
+ { 206,2407 }, { 207,2407 }, { 208,2407 }, { 209,2407 }, { 210,2407 },
+ { 211,2407 }, { 212,2407 }, { 213,2407 }, { 214,2407 }, { 215,2407 },
+ { 216,2407 }, { 217,2407 }, { 218,2407 }, { 219,2407 }, { 220,2407 },
+
+ { 221,2407 }, { 222,2407 }, { 223,2407 }, { 224,2407 }, { 225,2407 },
+ { 226,2407 }, { 227,2407 }, { 228,2407 }, { 229,2407 }, { 230,2407 },
+ { 231,2407 }, { 232,2407 }, { 233,2407 }, { 234,2407 }, { 235,2407 },
+ { 236,2407 }, { 237,2407 }, { 238,2407 }, { 239,2407 }, { 240,2407 },
+ { 241,2407 }, { 242,2407 }, { 243,2407 }, { 244,2407 }, { 245,2407 },
+ { 246,2407 }, { 247,2407 }, { 248,2407 }, { 249,2407 }, { 250,2407 },
+ { 251,2407 }, { 252,2407 }, { 253,2407 }, { 254,2407 }, { 255,2407 },
+ { 256,2407 }, { 0, 42 }, { 0,6866 }, { 1,2149 }, { 2,2149 },
+ { 3,2149 }, { 4,2149 }, { 5,2149 }, { 6,2149 }, { 7,2149 },
+ { 8,2149 }, { 0, 0 }, { 0, 0 }, { 11,2149 }, { 0, 0 },
+
+ { 0, 0 }, { 14,2149 }, { 15,2149 }, { 16,2149 }, { 17,2149 },
+ { 18,2149 }, { 19,2149 }, { 20,2149 }, { 21,2149 }, { 22,2149 },
+ { 23,2149 }, { 24,2149 }, { 25,2149 }, { 26,2149 }, { 27,2149 },
+ { 28,2149 }, { 29,2149 }, { 30,2149 }, { 31,2149 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 39,2149 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 46,2407 }, { 0, 0 },
+ { 48,2923 }, { 49,2923 }, { 50,2923 }, { 51,2923 }, { 52,2923 },
+ { 53,2923 }, { 54,2923 }, { 55,2923 }, { 56,2923 }, { 57,2923 },
+ { 0, 0 }, { 59,2149 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 0, 0 }, { 65,2149 }, { 66,2149 }, { 67,2149 },
+ { 68,2149 }, { 69,2665 }, { 70,2149 }, { 71,2149 }, { 72,2149 },
+ { 73,2149 }, { 74,2149 }, { 75,2149 }, { 76,2149 }, { 77,2149 },
+ { 78,2149 }, { 79,2149 }, { 80,2149 }, { 81,2149 }, { 82,2149 },
+ { 83,2149 }, { 84,2149 }, { 85,2149 }, { 86,2149 }, { 87,2149 },
+ { 88,2149 }, { 89,2149 }, { 90,2149 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 94,2149 }, { 95,2149 }, { 96,2149 }, { 97,2149 },
+ { 98,2149 }, { 99,2149 }, { 100,2149 }, { 101,2665 }, { 102,2149 },
+ { 103,2149 }, { 104,2149 }, { 105,2149 }, { 106,2149 }, { 107,2149 },
+ { 108,2149 }, { 109,2149 }, { 110,2149 }, { 111,2149 }, { 112,2149 },
+
+ { 113,2149 }, { 114,2149 }, { 115,2149 }, { 116,2149 }, { 117,2149 },
+ { 118,2149 }, { 119,2149 }, { 120,2149 }, { 121,2149 }, { 122,2149 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126,2149 }, { 127,2149 },
+ { 128,2149 }, { 129,2149 }, { 130,2149 }, { 131,2149 }, { 132,2149 },
+ { 133,2149 }, { 134,2149 }, { 135,2149 }, { 136,2149 }, { 137,2149 },
+ { 138,2149 }, { 139,2149 }, { 140,2149 }, { 141,2149 }, { 142,2149 },
+ { 143,2149 }, { 144,2149 }, { 145,2149 }, { 146,2149 }, { 147,2149 },
+ { 148,2149 }, { 149,2149 }, { 150,2149 }, { 151,2149 }, { 152,2149 },
+ { 153,2149 }, { 154,2149 }, { 155,2149 }, { 156,2149 }, { 157,2149 },
+ { 158,2149 }, { 159,2149 }, { 160,2149 }, { 161,2149 }, { 162,2149 },
+
+ { 163,2149 }, { 164,2149 }, { 165,2149 }, { 166,2149 }, { 167,2149 },
+ { 168,2149 }, { 169,2149 }, { 170,2149 }, { 171,2149 }, { 172,2149 },
+ { 173,2149 }, { 174,2149 }, { 175,2149 }, { 176,2149 }, { 177,2149 },
+ { 178,2149 }, { 179,2149 }, { 180,2149 }, { 181,2149 }, { 182,2149 },
+ { 183,2149 }, { 184,2149 }, { 185,2149 }, { 186,2149 }, { 187,2149 },
+ { 188,2149 }, { 189,2149 }, { 190,2149 }, { 191,2149 }, { 192,2149 },
+ { 193,2149 }, { 194,2149 }, { 195,2149 }, { 196,2149 }, { 197,2149 },
+ { 198,2149 }, { 199,2149 }, { 200,2149 }, { 201,2149 }, { 202,2149 },
+ { 203,2149 }, { 204,2149 }, { 205,2149 }, { 206,2149 }, { 207,2149 },
+ { 208,2149 }, { 209,2149 }, { 210,2149 }, { 211,2149 }, { 212,2149 },
+
+ { 213,2149 }, { 214,2149 }, { 215,2149 }, { 216,2149 }, { 217,2149 },
+ { 218,2149 }, { 219,2149 }, { 220,2149 }, { 221,2149 }, { 222,2149 },
+ { 223,2149 }, { 224,2149 }, { 225,2149 }, { 226,2149 }, { 227,2149 },
+ { 228,2149 }, { 229,2149 }, { 230,2149 }, { 231,2149 }, { 232,2149 },
+ { 233,2149 }, { 234,2149 }, { 235,2149 }, { 236,2149 }, { 237,2149 },
+ { 238,2149 }, { 239,2149 }, { 240,2149 }, { 241,2149 }, { 242,2149 },
+ { 243,2149 }, { 244,2149 }, { 245,2149 }, { 246,2149 }, { 247,2149 },
+ { 248,2149 }, { 249,2149 }, { 250,2149 }, { 251,2149 }, { 252,2149 },
+ { 253,2149 }, { 254,2149 }, { 255,2149 }, { 256,2149 }, { 0, 37 },
+ { 0,6608 }, { 0, 18 }, { 0,6606 }, { 0, 4 }, { 0,6604 },
+
+ { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 4 }, { 0,6584 },
+ { 0, 19 }, { 0,6582 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 20 }, { 0,6576 }, { 1,2891 }, { 2,2891 },
+ { 3,2891 }, { 4,2891 }, { 5,2891 }, { 6,2891 }, { 7,2891 },
+ { 8,2891 }, { 9,2891 }, { 10,2891 }, { 11,2891 }, { 12,2891 },
+ { 13,2891 }, { 14,2891 }, { 15,2891 }, { 16,2891 }, { 17,2891 },
+ { 18,2891 }, { 19,2891 }, { 20,2891 }, { 21,2891 }, { 22,2891 },
+
+ { 23,2891 }, { 24,2891 }, { 25,2891 }, { 26,2891 }, { 27,2891 },
+ { 28,2891 }, { 29,2891 }, { 30,2891 }, { 31,2891 }, { 32,2891 },
+ { 33,2891 }, { 42, 801 }, { 35,2891 }, { 36,2891 }, { 37,2891 },
+ { 38,2891 }, { 39,2891 }, { 40,2891 }, { 41,2891 }, { 42,2891 },
+ { 43,2891 }, { 44,2891 }, { 45,2891 }, { 46,2891 }, { 47,2891 },
+ { 48,2891 }, { 49,2891 }, { 50,2891 }, { 51,2891 }, { 52,2891 },
+ { 53,2891 }, { 54,2891 }, { 55,2891 }, { 56,2891 }, { 57,2891 },
+ { 58,2891 }, { 59,2891 }, { 60,2891 }, { 61,2891 }, { 62,2891 },
+ { 63,2891 }, { 64,2891 }, { 65,2891 }, { 66,2891 }, { 67,2891 },
+ { 68,2891 }, { 69,2891 }, { 70,2891 }, { 71,2891 }, { 72,2891 },
+
+ { 73,2891 }, { 74,2891 }, { 75,2891 }, { 76,2891 }, { 77,2891 },
+ { 78,2891 }, { 79,2891 }, { 80,2891 }, { 81,2891 }, { 82,2891 },
+ { 83,2891 }, { 84,2891 }, { 85,2891 }, { 86,2891 }, { 87,2891 },
+ { 88,2891 }, { 89,2891 }, { 90,2891 }, { 91,2891 }, { 124, 640 },
+ { 93,2891 }, { 94,2891 }, { 95,2891 }, { 96,2891 }, { 97,2891 },
+ { 98,2891 }, { 99,2891 }, { 100,2891 }, { 101,2891 }, { 102,2891 },
+ { 103,2891 }, { 104,2891 }, { 105,2891 }, { 106,2891 }, { 107,2891 },
+ { 108,2891 }, { 109,2891 }, { 110,2891 }, { 111,2891 }, { 112,2891 },
+ { 113,2891 }, { 114,2891 }, { 115,2891 }, { 116,2891 }, { 117,2891 },
+ { 118,2891 }, { 119,2891 }, { 120,2891 }, { 121,2891 }, { 122,2891 },
+
+ { 123,2891 }, { 124,2891 }, { 125,2891 }, { 126,2891 }, { 127,2891 },
+ { 128,2891 }, { 129,2891 }, { 130,2891 }, { 131,2891 }, { 132,2891 },
+ { 133,2891 }, { 134,2891 }, { 135,2891 }, { 136,2891 }, { 137,2891 },
+ { 138,2891 }, { 139,2891 }, { 140,2891 }, { 141,2891 }, { 142,2891 },
+ { 143,2891 }, { 144,2891 }, { 145,2891 }, { 146,2891 }, { 147,2891 },
+ { 148,2891 }, { 149,2891 }, { 150,2891 }, { 151,2891 }, { 152,2891 },
+ { 153,2891 }, { 154,2891 }, { 155,2891 }, { 156,2891 }, { 157,2891 },
+ { 158,2891 }, { 159,2891 }, { 160,2891 }, { 161,2891 }, { 162,2891 },
+ { 163,2891 }, { 164,2891 }, { 165,2891 }, { 166,2891 }, { 167,2891 },
+ { 168,2891 }, { 169,2891 }, { 170,2891 }, { 171,2891 }, { 172,2891 },
+
+ { 173,2891 }, { 174,2891 }, { 175,2891 }, { 176,2891 }, { 177,2891 },
+ { 178,2891 }, { 179,2891 }, { 180,2891 }, { 181,2891 }, { 182,2891 },
+ { 183,2891 }, { 184,2891 }, { 185,2891 }, { 186,2891 }, { 187,2891 },
+ { 188,2891 }, { 189,2891 }, { 190,2891 }, { 191,2891 }, { 192,2891 },
+ { 193,2891 }, { 194,2891 }, { 195,2891 }, { 196,2891 }, { 197,2891 },
+ { 198,2891 }, { 199,2891 }, { 200,2891 }, { 201,2891 }, { 202,2891 },
+ { 203,2891 }, { 204,2891 }, { 205,2891 }, { 206,2891 }, { 207,2891 },
+ { 208,2891 }, { 209,2891 }, { 210,2891 }, { 211,2891 }, { 212,2891 },
+ { 213,2891 }, { 214,2891 }, { 215,2891 }, { 216,2891 }, { 217,2891 },
+ { 218,2891 }, { 219,2891 }, { 220,2891 }, { 221,2891 }, { 222,2891 },
+
+ { 223,2891 }, { 224,2891 }, { 225,2891 }, { 226,2891 }, { 227,2891 },
+ { 228,2891 }, { 229,2891 }, { 230,2891 }, { 231,2891 }, { 232,2891 },
+ { 233,2891 }, { 234,2891 }, { 235,2891 }, { 236,2891 }, { 237,2891 },
+ { 238,2891 }, { 239,2891 }, { 240,2891 }, { 241,2891 }, { 242,2891 },
+ { 243,2891 }, { 244,2891 }, { 245,2891 }, { 246,2891 }, { 247,2891 },
+ { 248,2891 }, { 249,2891 }, { 250,2891 }, { 251,2891 }, { 252,2891 },
+ { 253,2891 }, { 254,2891 }, { 255,2891 }, { 256,2891 }, { 0, 17 },
+ { 0,6318 }, { 1, 382 }, { 2, 382 }, { 3, 382 }, { 4, 382 },
+ { 5, 382 }, { 6, 382 }, { 7, 382 }, { 8, 382 }, { 9, 382 },
+ { 0, 0 }, { 11, 382 }, { 12, 382 }, { 13, 382 }, { 14, 382 },
+
+ { 15, 382 }, { 16, 382 }, { 17, 382 }, { 18, 382 }, { 19, 382 },
+ { 20, 382 }, { 21, 382 }, { 22, 382 }, { 23, 382 }, { 24, 382 },
+ { 25, 382 }, { 26, 382 }, { 27, 382 }, { 28, 382 }, { 29, 382 },
+ { 30, 382 }, { 31, 382 }, { 32, 382 }, { 33, 382 }, { 34, 382 },
+ { 35, 382 }, { 36, 382 }, { 37, 382 }, { 38, 382 }, { 39, 382 },
+ { 40, 382 }, { 41, 382 }, { 42, 382 }, { 43, 382 }, { 44, 382 },
+ { 45, 382 }, { 46, 382 }, { 47, 382 }, { 48, 382 }, { 49, 382 },
+ { 50, 382 }, { 51, 382 }, { 52, 382 }, { 53, 382 }, { 54, 382 },
+ { 55, 382 }, { 56, 382 }, { 57, 382 }, { 58, 382 }, { 59, 382 },
+ { 60, 382 }, { 61, 382 }, { 62, 382 }, { 63, 382 }, { 64, 382 },
+
+ { 65, 382 }, { 66, 382 }, { 67, 382 }, { 68, 382 }, { 69, 382 },
+ { 70, 382 }, { 71, 382 }, { 72, 382 }, { 73, 382 }, { 74, 382 },
+ { 75, 382 }, { 76, 382 }, { 77, 382 }, { 78, 382 }, { 79, 382 },
+ { 80, 382 }, { 81, 382 }, { 82, 382 }, { 83, 382 }, { 84, 382 },
+ { 85, 382 }, { 86, 382 }, { 87, 382 }, { 88, 382 }, { 89, 382 },
+ { 90, 382 }, { 91, 382 }, { 92, 382 }, { 93, 382 }, { 94, 382 },
+ { 95, 382 }, { 96, 382 }, { 97, 382 }, { 98, 518 }, { 99, 382 },
+ { 100, 382 }, { 101, 382 }, { 102, 520 }, { 103, 382 }, { 104, 382 },
+ { 105, 382 }, { 106, 382 }, { 107, 382 }, { 108, 382 }, { 109, 382 },
+ { 110, 522 }, { 111, 382 }, { 112, 382 }, { 113, 382 }, { 114, 524 },
+
+ { 115, 382 }, { 116, 531 }, { 117,2891 }, { 118, 533 }, { 119, 382 },
+ { 120,2929 }, { 121, 382 }, { 122, 382 }, { 123, 382 }, { 124, 382 },
+ { 125, 382 }, { 126, 382 }, { 127, 382 }, { 128, 382 }, { 129, 382 },
+ { 130, 382 }, { 131, 382 }, { 132, 382 }, { 133, 382 }, { 134, 382 },
+ { 135, 382 }, { 136, 382 }, { 137, 382 }, { 138, 382 }, { 139, 382 },
+ { 140, 382 }, { 141, 382 }, { 142, 382 }, { 143, 382 }, { 144, 382 },
+ { 145, 382 }, { 146, 382 }, { 147, 382 }, { 148, 382 }, { 149, 382 },
+ { 150, 382 }, { 151, 382 }, { 152, 382 }, { 153, 382 }, { 154, 382 },
+ { 155, 382 }, { 156, 382 }, { 157, 382 }, { 158, 382 }, { 159, 382 },
+ { 160, 382 }, { 161, 382 }, { 162, 382 }, { 163, 382 }, { 164, 382 },
+
+ { 165, 382 }, { 166, 382 }, { 167, 382 }, { 168, 382 }, { 169, 382 },
+ { 170, 382 }, { 171, 382 }, { 172, 382 }, { 173, 382 }, { 174, 382 },
+ { 175, 382 }, { 176, 382 }, { 177, 382 }, { 178, 382 }, { 179, 382 },
+ { 180, 382 }, { 181, 382 }, { 182, 382 }, { 183, 382 }, { 184, 382 },
+ { 185, 382 }, { 186, 382 }, { 187, 382 }, { 188, 382 }, { 189, 382 },
+ { 190, 382 }, { 191, 382 }, { 192, 382 }, { 193, 382 }, { 194, 382 },
+ { 195, 382 }, { 196, 382 }, { 197, 382 }, { 198, 382 }, { 199, 382 },
+ { 200, 382 }, { 201, 382 }, { 202, 382 }, { 203, 382 }, { 204, 382 },
+ { 205, 382 }, { 206, 382 }, { 207, 382 }, { 208, 382 }, { 209, 382 },
+ { 210, 382 }, { 211, 382 }, { 212, 382 }, { 213, 382 }, { 214, 382 },
+
+ { 215, 382 }, { 216, 382 }, { 217, 382 }, { 218, 382 }, { 219, 382 },
+ { 220, 382 }, { 221, 382 }, { 222, 382 }, { 223, 382 }, { 224, 382 },
+ { 225, 382 }, { 226, 382 }, { 227, 382 }, { 228, 382 }, { 229, 382 },
+ { 230, 382 }, { 231, 382 }, { 232, 382 }, { 233, 382 }, { 234, 382 },
+ { 235, 382 }, { 236, 382 }, { 237, 382 }, { 238, 382 }, { 239, 382 },
+ { 240, 382 }, { 241, 382 }, { 242, 382 }, { 243, 382 }, { 244, 382 },
+ { 245, 382 }, { 246, 382 }, { 247, 382 }, { 248, 382 }, { 249, 382 },
+ { 250, 382 }, { 251, 382 }, { 252, 382 }, { 253, 382 }, { 254, 382 },
+ { 255, 382 }, { 256, 382 }, { 0, 1 }, { 0,6060 }, { 1,2775 },
+ { 2,2775 }, { 3,2775 }, { 4,2775 }, { 5,2775 }, { 6,2775 },
+
+ { 7,2775 }, { 8,2775 }, { 0, 0 }, { 0, 0 }, { 11,2775 },
+ { 0, 23 }, { 0,6047 }, { 14,2775 }, { 15,2775 }, { 16,2775 },
+ { 17,2775 }, { 18,2775 }, { 19,2775 }, { 20,2775 }, { 21,2775 },
+ { 22,2775 }, { 23,2775 }, { 24,2775 }, { 25,2775 }, { 26,2775 },
+ { 27,2775 }, { 28,2775 }, { 29,2775 }, { 30,2775 }, { 31,2775 },
+ { 0, 32 }, { 0,6027 }, { 0, 36 }, { 0,6025 }, { 0, 24 },
+ { 0,6023 }, { 0, 0 }, { 39,2775 }, { 0, 27 }, { 0,6019 },
+ { 0, 39 }, { 0,6017 }, { 0, 29 }, { 0,6015 }, { 0, 31 },
+ { 0,6013 }, { 48,2775 }, { 49,2775 }, { 50,2775 }, { 51,2775 },
+ { 52,2775 }, { 53,2775 }, { 54,2775 }, { 55,2775 }, { 56,2775 },
+
+ { 57,2775 }, { 0, 0 }, { 59,2775 }, { 47, 266 }, { 0, 30 },
+ { 0,5998 }, { 0, 33 }, { 0,5996 }, { 65,2775 }, { 66,2775 },
+ { 67,2775 }, { 68,2775 }, { 69,2775 }, { 70,2775 }, { 71,2775 },
+ { 72,2775 }, { 73,2775 }, { 74,2775 }, { 75,2775 }, { 76,2775 },
+ { 77,2775 }, { 78,2775 }, { 79,2775 }, { 80,2775 }, { 81,2775 },
+ { 82,2775 }, { 83,2775 }, { 84,2775 }, { 85,2775 }, { 86,2775 },
+ { 87,2775 }, { 88,2775 }, { 89,2775 }, { 90,2775 }, { 0, 25 },
+ { 0,5968 }, { 0, 0 }, { 94,2775 }, { 95,2775 }, { 96,2775 },
+ { 97,2775 }, { 98,2775 }, { 99,2775 }, { 100,2775 }, { 101,2775 },
+ { 102,2775 }, { 103,2775 }, { 104,2775 }, { 105,2775 }, { 106,2775 },
+
+ { 107,2775 }, { 108,2775 }, { 109,2775 }, { 110,2775 }, { 111,2775 },
+ { 112,2775 }, { 113,2775 }, { 114,2775 }, { 115,2775 }, { 116,2775 },
+ { 117,2775 }, { 118,2775 }, { 119,2775 }, { 120,2775 }, { 121,2775 },
+ { 122,2775 }, { 0, 16 }, { 0,5936 }, { 0, 0 }, { 126,2775 },
+ { 127,2775 }, { 128,2775 }, { 129,2775 }, { 130,2775 }, { 131,2775 },
+ { 132,2775 }, { 133,2775 }, { 134,2775 }, { 135,2775 }, { 136,2775 },
+ { 137,2775 }, { 138,2775 }, { 139,2775 }, { 140,2775 }, { 141,2775 },
+ { 142,2775 }, { 143,2775 }, { 144,2775 }, { 145,2775 }, { 146,2775 },
+ { 147,2775 }, { 148,2775 }, { 149,2775 }, { 150,2775 }, { 151,2775 },
+ { 152,2775 }, { 153,2775 }, { 154,2775 }, { 155,2775 }, { 156,2775 },
+
+ { 157,2775 }, { 158,2775 }, { 159,2775 }, { 160,2775 }, { 161,2775 },
+ { 162,2775 }, { 163,2775 }, { 164,2775 }, { 165,2775 }, { 166,2775 },
+ { 167,2775 }, { 168,2775 }, { 169,2775 }, { 170,2775 }, { 171,2775 },
+ { 172,2775 }, { 173,2775 }, { 174,2775 }, { 175,2775 }, { 176,2775 },
+ { 177,2775 }, { 178,2775 }, { 179,2775 }, { 180,2775 }, { 181,2775 },
+ { 182,2775 }, { 183,2775 }, { 184,2775 }, { 185,2775 }, { 186,2775 },
+ { 187,2775 }, { 188,2775 }, { 189,2775 }, { 190,2775 }, { 191,2775 },
+ { 192,2775 }, { 193,2775 }, { 194,2775 }, { 195,2775 }, { 196,2775 },
+ { 197,2775 }, { 198,2775 }, { 199,2775 }, { 200,2775 }, { 201,2775 },
+ { 202,2775 }, { 203,2775 }, { 204,2775 }, { 205,2775 }, { 206,2775 },
+
+ { 207,2775 }, { 208,2775 }, { 209,2775 }, { 210,2775 }, { 211,2775 },
+ { 212,2775 }, { 213,2775 }, { 214,2775 }, { 215,2775 }, { 216,2775 },
+ { 217,2775 }, { 218,2775 }, { 219,2775 }, { 220,2775 }, { 221,2775 },
+ { 222,2775 }, { 223,2775 }, { 224,2775 }, { 225,2775 }, { 226,2775 },
+ { 227,2775 }, { 228,2775 }, { 229,2775 }, { 230,2775 }, { 231,2775 },
+ { 232,2775 }, { 233,2775 }, { 234,2775 }, { 235,2775 }, { 236,2775 },
+ { 237,2775 }, { 238,2775 }, { 239,2775 }, { 240,2775 }, { 241,2775 },
+ { 242,2775 }, { 243,2775 }, { 244,2775 }, { 245,2775 }, { 246,2775 },
+ { 247,2775 }, { 248,2775 }, { 249,2775 }, { 250,2775 }, { 251,2775 },
+ { 252,2775 }, { 253,2775 }, { 254,2775 }, { 255,2775 }, { 256,2775 },
+
+ { 0, 2 }, { 0,5802 }, { 0, 5 }, { 0,5800 }, { 0, 6 },
+ { 0,5798 }, { 0, 7 }, { 0,5796 }, { 0, 8 }, { 0,5794 },
+ { 9,2775 }, { 10,2775 }, { 0, 0 }, { 12,2775 }, { 13,2775 },
+ { 0, 9 }, { 0,5787 }, { 0, 10 }, { 0,5785 }, { 0, 3 },
+ { 0,5783 }, { 0, 21 }, { 0,5781 }, { 0, 45 }, { 0,5779 },
+ { 0, 12 }, { 0,5777 }, { 0, 46 }, { 0,5775 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,2775 }, { 0, 22 },
+ { 0,5768 }, { 1,2775 }, { 2,2775 }, { 3,2775 }, { 4,2775 },
+ { 5,2775 }, { 6,2775 }, { 7,2775 }, { 8,2775 }, { 9,2775 },
+ { 10,2775 }, { 11,2775 }, { 12,2775 }, { 13,2775 }, { 14,2775 },
+
+ { 15,2775 }, { 16,2775 }, { 17,2775 }, { 18,2775 }, { 19,2775 },
+ { 20,2775 }, { 21,2775 }, { 22,2775 }, { 23,2775 }, { 24,2775 },
+ { 25,2775 }, { 26,2775 }, { 27,2775 }, { 28,2775 }, { 29,2775 },
+ { 30,2775 }, { 31,2775 }, { 32,2775 }, { 33,2775 }, { 34,2775 },
+ { 35,2775 }, { 36,2775 }, { 37,2775 }, { 38,2775 }, { 39,2775 },
+ { 40,2775 }, { 41,2775 }, { 0, 0 }, { 43,2775 }, { 44,2775 },
+ { 45,2775 }, { 46,2775 }, { 47,2775 }, { 48,2775 }, { 49,2775 },
+ { 50,2775 }, { 51,2775 }, { 52,2775 }, { 53,2775 }, { 54,2775 },
+ { 55,2775 }, { 56,2775 }, { 57,2775 }, { 58,2775 }, { 59,2775 },
+ { 60,2775 }, { 61,2775 }, { 62,2775 }, { 63,2775 }, { 64,2775 },
+
+ { 65,2775 }, { 66,2775 }, { 67,2775 }, { 68,2775 }, { 69,2775 },
+ { 70,2775 }, { 71,2775 }, { 72,2775 }, { 73,2775 }, { 74,2775 },
+ { 75,2775 }, { 76,2775 }, { 77,2775 }, { 78,2775 }, { 79,2775 },
+ { 80,2775 }, { 81,2775 }, { 82,2775 }, { 83,2775 }, { 84,2775 },
+ { 85,2775 }, { 86,2775 }, { 87,2775 }, { 88,2775 }, { 89,2775 },
+ { 90,2775 }, { 91,2775 }, { 92,2775 }, { 93,2775 }, { 94,2775 },
+ { 95,2775 }, { 96,2775 }, { 97,2775 }, { 98,2775 }, { 99,2775 },
+ { 100,2775 }, { 101,2775 }, { 102,2775 }, { 103,2775 }, { 104,2775 },
+ { 105,2775 }, { 106,2775 }, { 107,2775 }, { 108,2775 }, { 109,2775 },
+ { 110,2775 }, { 111,2775 }, { 112,2775 }, { 113,2775 }, { 114,2775 },
+
+ { 115,2775 }, { 116,2775 }, { 117,2775 }, { 118,2775 }, { 119,2775 },
+ { 120,2775 }, { 121,2775 }, { 122,2775 }, { 123,2775 }, { 124,2775 },
+ { 125,2775 }, { 126,2775 }, { 127,2775 }, { 128,2775 }, { 129,2775 },
+ { 130,2775 }, { 131,2775 }, { 132,2775 }, { 133,2775 }, { 134,2775 },
+ { 135,2775 }, { 136,2775 }, { 137,2775 }, { 138,2775 }, { 139,2775 },
+ { 140,2775 }, { 141,2775 }, { 142,2775 }, { 143,2775 }, { 144,2775 },
+ { 145,2775 }, { 146,2775 }, { 147,2775 }, { 148,2775 }, { 149,2775 },
+ { 150,2775 }, { 151,2775 }, { 152,2775 }, { 153,2775 }, { 154,2775 },
+ { 155,2775 }, { 156,2775 }, { 157,2775 }, { 158,2775 }, { 159,2775 },
+ { 160,2775 }, { 161,2775 }, { 162,2775 }, { 163,2775 }, { 164,2775 },
+
+ { 165,2775 }, { 166,2775 }, { 167,2775 }, { 168,2775 }, { 169,2775 },
+ { 170,2775 }, { 171,2775 }, { 172,2775 }, { 173,2775 }, { 174,2775 },
+ { 175,2775 }, { 176,2775 }, { 177,2775 }, { 178,2775 }, { 179,2775 },
+ { 180,2775 }, { 181,2775 }, { 182,2775 }, { 183,2775 }, { 184,2775 },
+ { 185,2775 }, { 186,2775 }, { 187,2775 }, { 188,2775 }, { 189,2775 },
+ { 190,2775 }, { 191,2775 }, { 192,2775 }, { 193,2775 }, { 194,2775 },
+ { 195,2775 }, { 196,2775 }, { 197,2775 }, { 198,2775 }, { 199,2775 },
+ { 200,2775 }, { 201,2775 }, { 202,2775 }, { 203,2775 }, { 204,2775 },
+ { 205,2775 }, { 206,2775 }, { 207,2775 }, { 208,2775 }, { 209,2775 },
+ { 210,2775 }, { 211,2775 }, { 212,2775 }, { 213,2775 }, { 214,2775 },
+
+ { 215,2775 }, { 216,2775 }, { 217,2775 }, { 218,2775 }, { 219,2775 },
+ { 220,2775 }, { 221,2775 }, { 222,2775 }, { 223,2775 }, { 224,2775 },
+ { 225,2775 }, { 226,2775 }, { 227,2775 }, { 228,2775 }, { 229,2775 },
+ { 230,2775 }, { 231,2775 }, { 232,2775 }, { 233,2775 }, { 234,2775 },
+ { 235,2775 }, { 236,2775 }, { 237,2775 }, { 238,2775 }, { 239,2775 },
+ { 240,2775 }, { 241,2775 }, { 242,2775 }, { 243,2775 }, { 244,2775 },
+ { 245,2775 }, { 246,2775 }, { 247,2775 }, { 248,2775 }, { 249,2775 },
+ { 250,2775 }, { 251,2775 }, { 252,2775 }, { 253,2775 }, { 254,2775 },
+ { 255,2775 }, { 256,2775 }, { 0, 49 }, { 0,5510 }, { 1, 0 },
+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },
+
+ { 7, 0 }, { 8, 0 }, { 0, 0 }, { 0, 0 }, { 11, 0 },
+ { 0, 0 }, { 0, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },
+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },
+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },
+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },
+ { 0, 11 }, { 0,5477 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },
+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },
+
+ { 57, 0 }, { 0, 0 }, { 59, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 0 }, { 66, 0 },
+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },
+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },
+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },
+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },
+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },
+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },
+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },
+
+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },
+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },
+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },
+ { 122, 0 }, { 0, 0 }, { 0, 0 }, { 92,2052 }, { 126, 0 },
+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },
+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },
+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },
+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },
+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },
+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },
+
+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },
+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },
+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },
+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },
+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },
+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },
+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },
+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },
+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },
+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },
+
+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },
+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },
+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },
+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },
+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },
+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },
+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },
+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },
+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },
+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },
+
+ { 0, 38 }, { 0,5252 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 9, 0 }, { 10, 0 }, { 0, 0 }, { 12, 0 }, { 13, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 35 },
+ { 0,5233 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },
+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 0, 0 },
+ { 0, 0 }, { 11, 0 }, { 0, 0 }, { 32, 0 }, { 14, 0 },
+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },
+ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },
+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },
+
+ { 30, 0 }, { 31, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 },
+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },
+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 }, { 59, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },
+ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },
+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },
+
+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },
+ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },
+ { 90, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94, 0 },
+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },
+ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },
+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },
+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },
+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },
+ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },
+
+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },
+ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },
+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },
+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },
+ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },
+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },
+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },
+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },
+ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },
+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },
+
+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },
+ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },
+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },
+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },
+ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },
+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },
+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },
+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },
+ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },
+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },
+
+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },
+ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },
+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },
+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },
+ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },
+ { 255, 0 }, { 256, 0 }, { 0, 41 }, { 0,4975 }, { 1,-804 },
+ { 2,-804 }, { 3,-804 }, { 4,-804 }, { 5,-804 }, { 6,-804 },
+ { 7,-804 }, { 8,-804 }, { 0, 0 }, { 0, 0 }, { 11,-804 },
+ { 0, 0 }, { 0, 0 }, { 14,-804 }, { 15,-804 }, { 16,-804 },
+ { 17,-804 }, { 18,-804 }, { 19,-804 }, { 20,-804 }, { 21,-804 },
+
+ { 22,-804 }, { 23,-804 }, { 24,-804 }, { 25,-804 }, { 26,-804 },
+ { 27,-804 }, { 28,-804 }, { 29,-804 }, { 30,-804 }, { 31,-804 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39,-804 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48,2240 }, { 49,2240 }, { 50,2240 }, { 51,2240 },
+ { 52,2240 }, { 53,2240 }, { 54,2240 }, { 55,2240 }, { 56,2240 },
+ { 57,2240 }, { 0, 0 }, { 59,-804 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-804 }, { 66,-804 },
+ { 67,-804 }, { 68,-804 }, { 69,2498 }, { 70,-804 }, { 71,-804 },
+
+ { 72,-804 }, { 73,-804 }, { 74,-804 }, { 75,-804 }, { 76,-804 },
+ { 77,-804 }, { 78,-804 }, { 79,-804 }, { 80,-804 }, { 81,-804 },
+ { 82,-804 }, { 83,-804 }, { 84,-804 }, { 85,-804 }, { 86,-804 },
+ { 87,-804 }, { 88,-804 }, { 89,-804 }, { 90,-804 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 94,-804 }, { 95,-804 }, { 96,-804 },
+ { 97,-804 }, { 98,-804 }, { 99,-804 }, { 100,-804 }, { 101,2498 },
+ { 102,-804 }, { 103,-804 }, { 104,-804 }, { 105,-804 }, { 106,-804 },
+ { 107,-804 }, { 108,-804 }, { 109,-804 }, { 110,-804 }, { 111,-804 },
+ { 112,-804 }, { 113,-804 }, { 114,-804 }, { 115,-804 }, { 116,-804 },
+ { 117,-804 }, { 118,-804 }, { 119,-804 }, { 120,-804 }, { 121,-804 },
+
+ { 122,-804 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126,-804 },
+ { 127,-804 }, { 128,-804 }, { 129,-804 }, { 130,-804 }, { 131,-804 },
+ { 132,-804 }, { 133,-804 }, { 134,-804 }, { 135,-804 }, { 136,-804 },
+ { 137,-804 }, { 138,-804 }, { 139,-804 }, { 140,-804 }, { 141,-804 },
+ { 142,-804 }, { 143,-804 }, { 144,-804 }, { 145,-804 }, { 146,-804 },
+ { 147,-804 }, { 148,-804 }, { 149,-804 }, { 150,-804 }, { 151,-804 },
+ { 152,-804 }, { 153,-804 }, { 154,-804 }, { 155,-804 }, { 156,-804 },
+ { 157,-804 }, { 158,-804 }, { 159,-804 }, { 160,-804 }, { 161,-804 },
+ { 162,-804 }, { 163,-804 }, { 164,-804 }, { 165,-804 }, { 166,-804 },
+ { 167,-804 }, { 168,-804 }, { 169,-804 }, { 170,-804 }, { 171,-804 },
+
+ { 172,-804 }, { 173,-804 }, { 174,-804 }, { 175,-804 }, { 176,-804 },
+ { 177,-804 }, { 178,-804 }, { 179,-804 }, { 180,-804 }, { 181,-804 },
+ { 182,-804 }, { 183,-804 }, { 184,-804 }, { 185,-804 }, { 186,-804 },
+ { 187,-804 }, { 188,-804 }, { 189,-804 }, { 190,-804 }, { 191,-804 },
+ { 192,-804 }, { 193,-804 }, { 194,-804 }, { 195,-804 }, { 196,-804 },
+ { 197,-804 }, { 198,-804 }, { 199,-804 }, { 200,-804 }, { 201,-804 },
+ { 202,-804 }, { 203,-804 }, { 204,-804 }, { 205,-804 }, { 206,-804 },
+ { 207,-804 }, { 208,-804 }, { 209,-804 }, { 210,-804 }, { 211,-804 },
+ { 212,-804 }, { 213,-804 }, { 214,-804 }, { 215,-804 }, { 216,-804 },
+ { 217,-804 }, { 218,-804 }, { 219,-804 }, { 220,-804 }, { 221,-804 },
+
+ { 222,-804 }, { 223,-804 }, { 224,-804 }, { 225,-804 }, { 226,-804 },
+ { 227,-804 }, { 228,-804 }, { 229,-804 }, { 230,-804 }, { 231,-804 },
+ { 232,-804 }, { 233,-804 }, { 234,-804 }, { 235,-804 }, { 236,-804 },
+ { 237,-804 }, { 238,-804 }, { 239,-804 }, { 240,-804 }, { 241,-804 },
+ { 242,-804 }, { 243,-804 }, { 244,-804 }, { 245,-804 }, { 246,-804 },
+ { 247,-804 }, { 248,-804 }, { 249,-804 }, { 250,-804 }, { 251,-804 },
+ { 252,-804 }, { 253,-804 }, { 254,-804 }, { 255,-804 }, { 256,-804 },
+ { 0, 44 }, { 0,4717 }, { 1,-793 }, { 2,-793 }, { 3,-793 },
+ { 4,-793 }, { 5,-793 }, { 6,-793 }, { 7,-793 }, { 8,-793 },
+ { 0, 0 }, { 0, 0 }, { 11,-793 }, { 0, 0 }, { 0, 0 },
+
+ { 14,-793 }, { 15,-793 }, { 16,-793 }, { 17,-793 }, { 18,-793 },
+ { 19,-793 }, { 20,-793 }, { 21,-793 }, { 22,-793 }, { 23,-793 },
+ { 24,-793 }, { 25,-793 }, { 26,-793 }, { 27,-793 }, { 28,-793 },
+ { 29,-793 }, { 30,-793 }, { 31,-793 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 39,-793 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-793 },
+ { 49,-793 }, { 50,-793 }, { 51,-793 }, { 52,-793 }, { 53,-793 },
+ { 54,-793 }, { 55,-793 }, { 56,-793 }, { 57,-793 }, { 0, 0 },
+ { 59,-793 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 65,-793 }, { 66,-793 }, { 67,-793 }, { 68,-793 },
+ { 69,-793 }, { 70,-793 }, { 71,-793 }, { 72,-793 }, { 73,-793 },
+ { 74,-793 }, { 75,-793 }, { 76,-793 }, { 77,-793 }, { 78,-793 },
+ { 79,-793 }, { 80,-793 }, { 81,-793 }, { 82,-793 }, { 83,-793 },
+ { 84,-793 }, { 85,-793 }, { 86,-793 }, { 87,-793 }, { 88,-793 },
+ { 89,-793 }, { 90,-793 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 94,-793 }, { 95,-793 }, { 96,-793 }, { 97,-793 }, { 98,-793 },
+ { 99,-793 }, { 100,-793 }, { 101,-793 }, { 102,-793 }, { 103,-793 },
+ { 104,-793 }, { 105,-793 }, { 106,-793 }, { 107,-793 }, { 108,-793 },
+ { 109,-793 }, { 110,-793 }, { 111,-793 }, { 112,-793 }, { 113,-793 },
+
+ { 114,-793 }, { 115,-793 }, { 116,-793 }, { 117,-793 }, { 118,-793 },
+ { 119,-793 }, { 120,-793 }, { 121,-793 }, { 122,-793 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 126,-793 }, { 127,-793 }, { 128,-793 },
+ { 129,-793 }, { 130,-793 }, { 131,-793 }, { 132,-793 }, { 133,-793 },
+ { 134,-793 }, { 135,-793 }, { 136,-793 }, { 137,-793 }, { 138,-793 },
+ { 139,-793 }, { 140,-793 }, { 141,-793 }, { 142,-793 }, { 143,-793 },
+ { 144,-793 }, { 145,-793 }, { 146,-793 }, { 147,-793 }, { 148,-793 },
+ { 149,-793 }, { 150,-793 }, { 151,-793 }, { 152,-793 }, { 153,-793 },
+ { 154,-793 }, { 155,-793 }, { 156,-793 }, { 157,-793 }, { 158,-793 },
+ { 159,-793 }, { 160,-793 }, { 161,-793 }, { 162,-793 }, { 163,-793 },
+
+ { 164,-793 }, { 165,-793 }, { 166,-793 }, { 167,-793 }, { 168,-793 },
+ { 169,-793 }, { 170,-793 }, { 171,-793 }, { 172,-793 }, { 173,-793 },
+ { 174,-793 }, { 175,-793 }, { 176,-793 }, { 177,-793 }, { 178,-793 },
+ { 179,-793 }, { 180,-793 }, { 181,-793 }, { 182,-793 }, { 183,-793 },
+ { 184,-793 }, { 185,-793 }, { 186,-793 }, { 187,-793 }, { 188,-793 },
+ { 189,-793 }, { 190,-793 }, { 191,-793 }, { 192,-793 }, { 193,-793 },
+ { 194,-793 }, { 195,-793 }, { 196,-793 }, { 197,-793 }, { 198,-793 },
+ { 199,-793 }, { 200,-793 }, { 201,-793 }, { 202,-793 }, { 203,-793 },
+ { 204,-793 }, { 205,-793 }, { 206,-793 }, { 207,-793 }, { 208,-793 },
+ { 209,-793 }, { 210,-793 }, { 211,-793 }, { 212,-793 }, { 213,-793 },
+
+ { 214,-793 }, { 215,-793 }, { 216,-793 }, { 217,-793 }, { 218,-793 },
+ { 219,-793 }, { 220,-793 }, { 221,-793 }, { 222,-793 }, { 223,-793 },
+ { 224,-793 }, { 225,-793 }, { 226,-793 }, { 227,-793 }, { 228,-793 },
+ { 229,-793 }, { 230,-793 }, { 231,-793 }, { 232,-793 }, { 233,-793 },
+ { 234,-793 }, { 235,-793 }, { 236,-793 }, { 237,-793 }, { 238,-793 },
+ { 239,-793 }, { 240,-793 }, { 241,-793 }, { 242,-793 }, { 243,-793 },
+ { 244,-793 }, { 245,-793 }, { 246,-793 }, { 247,-793 }, { 248,-793 },
+ { 249,-793 }, { 250,-793 }, { 251,-793 }, { 252,-793 }, { 253,-793 },
+ { 254,-793 }, { 255,-793 }, { 256,-793 }, { 0, 41 }, { 0,4459 },
+ { 1,-1320 }, { 2,-1320 }, { 3,-1320 }, { 4,-1320 }, { 5,-1320 },
+
+ { 6,-1320 }, { 7,-1320 }, { 8,-1320 }, { 0, 0 }, { 0, 0 },
+ { 11,-1320 }, { 0, 0 }, { 0, 0 }, { 14,-1320 }, { 15,-1320 },
+ { 16,-1320 }, { 17,-1320 }, { 18,-1320 }, { 19,-1320 }, { 20,-1320 },
+ { 21,-1320 }, { 22,-1320 }, { 23,-1320 }, { 24,-1320 }, { 25,-1320 },
+ { 26,-1320 }, { 27,-1320 }, { 28,-1320 }, { 29,-1320 }, { 30,-1320 },
+ { 31,-1320 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-1320 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 48,2041 }, { 49,2041 }, { 50,2041 },
+ { 51,2041 }, { 52,2041 }, { 53,2041 }, { 54,2041 }, { 55,2041 },
+
+ { 56,2041 }, { 57,2041 }, { 0, 0 }, { 59,-1320 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-1320 },
+ { 66,-1320 }, { 67,-1320 }, { 68,-1320 }, { 69,1982 }, { 70,-1320 },
+ { 71,-1320 }, { 72,-1320 }, { 73,-1320 }, { 74,-1320 }, { 75,-1320 },
+ { 76,-1320 }, { 77,-1320 }, { 78,-1320 }, { 79,-1320 }, { 80,-1320 },
+ { 81,-1320 }, { 82,-1320 }, { 83,-1320 }, { 84,-1320 }, { 85,-1320 },
+ { 86,-1320 }, { 87,-1320 }, { 88,-1320 }, { 89,-1320 }, { 90,-1320 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,-1320 }, { 95,-1320 },
+ { 96,-1320 }, { 97,-1320 }, { 98,-1320 }, { 99,-1320 }, { 100,-1320 },
+ { 101,1982 }, { 102,-1320 }, { 103,-1320 }, { 104,-1320 }, { 105,-1320 },
+
+ { 106,-1320 }, { 107,-1320 }, { 108,-1320 }, { 109,-1320 }, { 110,-1320 },
+ { 111,-1320 }, { 112,-1320 }, { 113,-1320 }, { 114,-1320 }, { 115,-1320 },
+ { 116,-1320 }, { 117,-1320 }, { 118,-1320 }, { 119,-1320 }, { 120,-1320 },
+ { 121,-1320 }, { 122,-1320 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 126,-1320 }, { 127,-1320 }, { 128,-1320 }, { 129,-1320 }, { 130,-1320 },
+ { 131,-1320 }, { 132,-1320 }, { 133,-1320 }, { 134,-1320 }, { 135,-1320 },
+ { 136,-1320 }, { 137,-1320 }, { 138,-1320 }, { 139,-1320 }, { 140,-1320 },
+ { 141,-1320 }, { 142,-1320 }, { 143,-1320 }, { 144,-1320 }, { 145,-1320 },
+ { 146,-1320 }, { 147,-1320 }, { 148,-1320 }, { 149,-1320 }, { 150,-1320 },
+ { 151,-1320 }, { 152,-1320 }, { 153,-1320 }, { 154,-1320 }, { 155,-1320 },
+
+ { 156,-1320 }, { 157,-1320 }, { 158,-1320 }, { 159,-1320 }, { 160,-1320 },
+ { 161,-1320 }, { 162,-1320 }, { 163,-1320 }, { 164,-1320 }, { 165,-1320 },
+ { 166,-1320 }, { 167,-1320 }, { 168,-1320 }, { 169,-1320 }, { 170,-1320 },
+ { 171,-1320 }, { 172,-1320 }, { 173,-1320 }, { 174,-1320 }, { 175,-1320 },
+ { 176,-1320 }, { 177,-1320 }, { 178,-1320 }, { 179,-1320 }, { 180,-1320 },
+ { 181,-1320 }, { 182,-1320 }, { 183,-1320 }, { 184,-1320 }, { 185,-1320 },
+ { 186,-1320 }, { 187,-1320 }, { 188,-1320 }, { 189,-1320 }, { 190,-1320 },
+ { 191,-1320 }, { 192,-1320 }, { 193,-1320 }, { 194,-1320 }, { 195,-1320 },
+ { 196,-1320 }, { 197,-1320 }, { 198,-1320 }, { 199,-1320 }, { 200,-1320 },
+ { 201,-1320 }, { 202,-1320 }, { 203,-1320 }, { 204,-1320 }, { 205,-1320 },
+
+ { 206,-1320 }, { 207,-1320 }, { 208,-1320 }, { 209,-1320 }, { 210,-1320 },
+ { 211,-1320 }, { 212,-1320 }, { 213,-1320 }, { 214,-1320 }, { 215,-1320 },
+ { 216,-1320 }, { 217,-1320 }, { 218,-1320 }, { 219,-1320 }, { 220,-1320 },
+ { 221,-1320 }, { 222,-1320 }, { 223,-1320 }, { 224,-1320 }, { 225,-1320 },
+ { 226,-1320 }, { 227,-1320 }, { 228,-1320 }, { 229,-1320 }, { 230,-1320 },
+ { 231,-1320 }, { 232,-1320 }, { 233,-1320 }, { 234,-1320 }, { 235,-1320 },
+ { 236,-1320 }, { 237,-1320 }, { 238,-1320 }, { 239,-1320 }, { 240,-1320 },
+ { 241,-1320 }, { 242,-1320 }, { 243,-1320 }, { 244,-1320 }, { 245,-1320 },
+ { 246,-1320 }, { 247,-1320 }, { 248,-1320 }, { 249,-1320 }, { 250,-1320 },
+ { 251,-1320 }, { 252,-1320 }, { 253,-1320 }, { 254,-1320 }, { 255,-1320 },
+
+ { 256,-1320 }, { 0, 44 }, { 0,4201 }, { 1,-1309 }, { 2,-1309 },
+ { 3,-1309 }, { 4,-1309 }, { 5,-1309 }, { 6,-1309 }, { 7,-1309 },
+ { 8,-1309 }, { 0, 0 }, { 0, 0 }, { 11,-1309 }, { 0, 0 },
+ { 0, 0 }, { 14,-1309 }, { 15,-1309 }, { 16,-1309 }, { 17,-1309 },
+ { 18,-1309 }, { 19,-1309 }, { 20,-1309 }, { 21,-1309 }, { 22,-1309 },
+ { 23,-1309 }, { 24,-1309 }, { 25,-1309 }, { 26,-1309 }, { 27,-1309 },
+ { 28,-1309 }, { 29,-1309 }, { 30,-1309 }, { 31,-1309 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 39,-1309 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 43,2041 }, { 0, 0 }, { 45,2041 }, { 0, 0 }, { 0, 0 },
+
+ { 48,2100 }, { 49,2100 }, { 50,2100 }, { 51,2100 }, { 52,2100 },
+ { 53,2100 }, { 54,2100 }, { 55,2100 }, { 56,2100 }, { 57,2100 },
+ { 0, 0 }, { 59,-1309 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 65,-1309 }, { 66,-1309 }, { 67,-1309 },
+ { 68,-1309 }, { 69,-1309 }, { 70,-1309 }, { 71,-1309 }, { 72,-1309 },
+ { 73,-1309 }, { 74,-1309 }, { 75,-1309 }, { 76,-1309 }, { 77,-1309 },
+ { 78,-1309 }, { 79,-1309 }, { 80,-1309 }, { 81,-1309 }, { 82,-1309 },
+ { 83,-1309 }, { 84,-1309 }, { 85,-1309 }, { 86,-1309 }, { 87,-1309 },
+ { 88,-1309 }, { 89,-1309 }, { 90,-1309 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 94,-1309 }, { 95,-1309 }, { 96,-1309 }, { 97,-1309 },
+
+ { 98,-1309 }, { 99,-1309 }, { 100,-1309 }, { 101,-1309 }, { 102,-1309 },
+ { 103,-1309 }, { 104,-1309 }, { 105,-1309 }, { 106,-1309 }, { 107,-1309 },
+ { 108,-1309 }, { 109,-1309 }, { 110,-1309 }, { 111,-1309 }, { 112,-1309 },
+ { 113,-1309 }, { 114,-1309 }, { 115,-1309 }, { 116,-1309 }, { 117,-1309 },
+ { 118,-1309 }, { 119,-1309 }, { 120,-1309 }, { 121,-1309 }, { 122,-1309 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126,-1309 }, { 127,-1309 },
+ { 128,-1309 }, { 129,-1309 }, { 130,-1309 }, { 131,-1309 }, { 132,-1309 },
+ { 133,-1309 }, { 134,-1309 }, { 135,-1309 }, { 136,-1309 }, { 137,-1309 },
+ { 138,-1309 }, { 139,-1309 }, { 140,-1309 }, { 141,-1309 }, { 142,-1309 },
+ { 143,-1309 }, { 144,-1309 }, { 145,-1309 }, { 146,-1309 }, { 147,-1309 },
+
+ { 148,-1309 }, { 149,-1309 }, { 150,-1309 }, { 151,-1309 }, { 152,-1309 },
+ { 153,-1309 }, { 154,-1309 }, { 155,-1309 }, { 156,-1309 }, { 157,-1309 },
+ { 158,-1309 }, { 159,-1309 }, { 160,-1309 }, { 161,-1309 }, { 162,-1309 },
+ { 163,-1309 }, { 164,-1309 }, { 165,-1309 }, { 166,-1309 }, { 167,-1309 },
+ { 168,-1309 }, { 169,-1309 }, { 170,-1309 }, { 171,-1309 }, { 172,-1309 },
+ { 173,-1309 }, { 174,-1309 }, { 175,-1309 }, { 176,-1309 }, { 177,-1309 },
+ { 178,-1309 }, { 179,-1309 }, { 180,-1309 }, { 181,-1309 }, { 182,-1309 },
+ { 183,-1309 }, { 184,-1309 }, { 185,-1309 }, { 186,-1309 }, { 187,-1309 },
+ { 188,-1309 }, { 189,-1309 }, { 190,-1309 }, { 191,-1309 }, { 192,-1309 },
+ { 193,-1309 }, { 194,-1309 }, { 195,-1309 }, { 196,-1309 }, { 197,-1309 },
+
+ { 198,-1309 }, { 199,-1309 }, { 200,-1309 }, { 201,-1309 }, { 202,-1309 },
+ { 203,-1309 }, { 204,-1309 }, { 205,-1309 }, { 206,-1309 }, { 207,-1309 },
+ { 208,-1309 }, { 209,-1309 }, { 210,-1309 }, { 211,-1309 }, { 212,-1309 },
+ { 213,-1309 }, { 214,-1309 }, { 215,-1309 }, { 216,-1309 }, { 217,-1309 },
+ { 218,-1309 }, { 219,-1309 }, { 220,-1309 }, { 221,-1309 }, { 222,-1309 },
+ { 223,-1309 }, { 224,-1309 }, { 225,-1309 }, { 226,-1309 }, { 227,-1309 },
+ { 228,-1309 }, { 229,-1309 }, { 230,-1309 }, { 231,-1309 }, { 232,-1309 },
+ { 233,-1309 }, { 234,-1309 }, { 235,-1309 }, { 236,-1309 }, { 237,-1309 },
+ { 238,-1309 }, { 239,-1309 }, { 240,-1309 }, { 241,-1309 }, { 242,-1309 },
+ { 243,-1309 }, { 244,-1309 }, { 245,-1309 }, { 246,-1309 }, { 247,-1309 },
+
+ { 248,-1309 }, { 249,-1309 }, { 250,-1309 }, { 251,-1309 }, { 252,-1309 },
+ { 253,-1309 }, { 254,-1309 }, { 255,-1309 }, { 256,-1309 }, { 0, 42 },
+ { 0,3943 }, { 1,-774 }, { 2,-774 }, { 3,-774 }, { 4,-774 },
+ { 5,-774 }, { 6,-774 }, { 7,-774 }, { 8,-774 }, { 0, 0 },
+ { 0, 0 }, { 11,-774 }, { 0, 0 }, { 0, 0 }, { 14,-774 },
+ { 15,-774 }, { 16,-774 }, { 17,-774 }, { 18,-774 }, { 19,-774 },
+ { 20,-774 }, { 21,-774 }, { 22,-774 }, { 23,-774 }, { 24,-774 },
+ { 25,-774 }, { 26,-774 }, { 27,-774 }, { 28,-774 }, { 29,-774 },
+ { 30,-774 }, { 31,-774 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-774 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 46,-516 }, { 0, 0 }, { 48, 0 }, { 49, 0 },
+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },
+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 }, { 59,-774 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65,-774 }, { 66,-774 }, { 67,-774 }, { 68,-774 }, { 69,-258 },
+ { 70,-774 }, { 71,-774 }, { 72,-774 }, { 73,-774 }, { 74,-774 },
+ { 75,-774 }, { 76,-774 }, { 77,-774 }, { 78,-774 }, { 79,-774 },
+ { 80,-774 }, { 81,-774 }, { 82,-774 }, { 83,-774 }, { 84,-774 },
+ { 85,-774 }, { 86,-774 }, { 87,-774 }, { 88,-774 }, { 89,-774 },
+
+ { 90,-774 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,-774 },
+ { 95,-774 }, { 96,-774 }, { 97,-774 }, { 98,-774 }, { 99,-774 },
+ { 100,-774 }, { 101,-258 }, { 102,-774 }, { 103,-774 }, { 104,-774 },
+ { 105,-774 }, { 106,-774 }, { 107,-774 }, { 108,-774 }, { 109,-774 },
+ { 110,-774 }, { 111,-774 }, { 112,-774 }, { 113,-774 }, { 114,-774 },
+ { 115,-774 }, { 116,-774 }, { 117,-774 }, { 118,-774 }, { 119,-774 },
+ { 120,-774 }, { 121,-774 }, { 122,-774 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 126,-774 }, { 127,-774 }, { 128,-774 }, { 129,-774 },
+ { 130,-774 }, { 131,-774 }, { 132,-774 }, { 133,-774 }, { 134,-774 },
+ { 135,-774 }, { 136,-774 }, { 137,-774 }, { 138,-774 }, { 139,-774 },
+
+ { 140,-774 }, { 141,-774 }, { 142,-774 }, { 143,-774 }, { 144,-774 },
+ { 145,-774 }, { 146,-774 }, { 147,-774 }, { 148,-774 }, { 149,-774 },
+ { 150,-774 }, { 151,-774 }, { 152,-774 }, { 153,-774 }, { 154,-774 },
+ { 155,-774 }, { 156,-774 }, { 157,-774 }, { 158,-774 }, { 159,-774 },
+ { 160,-774 }, { 161,-774 }, { 162,-774 }, { 163,-774 }, { 164,-774 },
+ { 165,-774 }, { 166,-774 }, { 167,-774 }, { 168,-774 }, { 169,-774 },
+ { 170,-774 }, { 171,-774 }, { 172,-774 }, { 173,-774 }, { 174,-774 },
+ { 175,-774 }, { 176,-774 }, { 177,-774 }, { 178,-774 }, { 179,-774 },
+ { 180,-774 }, { 181,-774 }, { 182,-774 }, { 183,-774 }, { 184,-774 },
+ { 185,-774 }, { 186,-774 }, { 187,-774 }, { 188,-774 }, { 189,-774 },
+
+ { 190,-774 }, { 191,-774 }, { 192,-774 }, { 193,-774 }, { 194,-774 },
+ { 195,-774 }, { 196,-774 }, { 197,-774 }, { 198,-774 }, { 199,-774 },
+ { 200,-774 }, { 201,-774 }, { 202,-774 }, { 203,-774 }, { 204,-774 },
+ { 205,-774 }, { 206,-774 }, { 207,-774 }, { 208,-774 }, { 209,-774 },
+ { 210,-774 }, { 211,-774 }, { 212,-774 }, { 213,-774 }, { 214,-774 },
+ { 215,-774 }, { 216,-774 }, { 217,-774 }, { 218,-774 }, { 219,-774 },
+ { 220,-774 }, { 221,-774 }, { 222,-774 }, { 223,-774 }, { 224,-774 },
+ { 225,-774 }, { 226,-774 }, { 227,-774 }, { 228,-774 }, { 229,-774 },
+ { 230,-774 }, { 231,-774 }, { 232,-774 }, { 233,-774 }, { 234,-774 },
+ { 235,-774 }, { 236,-774 }, { 237,-774 }, { 238,-774 }, { 239,-774 },
+
+ { 240,-774 }, { 241,-774 }, { 242,-774 }, { 243,-774 }, { 244,-774 },
+ { 245,-774 }, { 246,-774 }, { 247,-774 }, { 248,-774 }, { 249,-774 },
+ { 250,-774 }, { 251,-774 }, { 252,-774 }, { 253,-774 }, { 254,-774 },
+ { 255,-774 }, { 256,-774 }, { 0, 20 }, { 0,3685 }, { 1, 0 },
+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },
+ { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 },
+ { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },
+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },
+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },
+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },
+
+ { 32, 0 }, { 33, 0 }, { 0, 0 }, { 35, 0 }, { 36, 0 },
+ { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 },
+ { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 },
+ { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },
+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },
+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },
+ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },
+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },
+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },
+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },
+
+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },
+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },
+ { 0, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },
+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },
+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },
+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },
+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },
+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },
+ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },
+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },
+
+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },
+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },
+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },
+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },
+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },
+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },
+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },
+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },
+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },
+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },
+
+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },
+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },
+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },
+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },
+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },
+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },
+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },
+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },
+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },
+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },
+
+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },
+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },
+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },
+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },
+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },
+ { 0, 13 }, { 0,3427 }, { 0, 15 }, { 0,3425 }, { 0, 13 },
+ { 0,3423 }, { 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, 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 }, { 0, 0 }, { 0, 14 }, { 0,3389 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,1584 },
+ { 49,1584 }, { 50,1584 }, { 51,1584 }, { 52,1584 }, { 53,1584 },
+ { 54,1584 }, { 55,1584 }, { 56,1584 }, { 57,1584 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 65,1584 }, { 66,1584 }, { 67,1584 }, { 68,1584 },
+ { 69,1584 }, { 70,1584 }, { 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 }, { 48,1607 }, { 49,1607 }, { 50,1607 },
+ { 51,1607 }, { 52,1607 }, { 53,1607 }, { 54,1607 }, { 55,1607 },
+ { 56,1607 }, { 57,1607 }, { 0, 0 }, { 97,1584 }, { 98,1584 },
+ { 99,1584 }, { 100,1584 }, { 101,1584 }, { 102,1584 }, { 65,1607 },
+ { 66,1607 }, { 67,1607 }, { 68,1607 }, { 69,1607 }, { 70,1607 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 117,3091 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 123,1607 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 125,-2054 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 97,1607 }, { 98,1607 }, { 99,1607 }, { 100,1607 },
+ { 101,1607 }, { 102,1607 }, { 0, 1 }, { 0,3285 }, { 1, 0 },
+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },
+ { 7, 0 }, { 8, 0 }, { 0, 0 }, { 0, 0 }, { 11, 0 },
+ { 0, 0 }, { 0, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },
+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },
+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },
+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },
+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },
+ { 57, 0 }, { 0, 0 }, { 59, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 0 }, { 66, 0 },
+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },
+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },
+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },
+
+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },
+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },
+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },
+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },
+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },
+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },
+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },
+ { 122, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126, 0 },
+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },
+
+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },
+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },
+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },
+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },
+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },
+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },
+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },
+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },
+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },
+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },
+
+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },
+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },
+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },
+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },
+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },
+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },
+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },
+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },
+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },
+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },
+
+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },
+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },
+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },
+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },
+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },
+ { 0, 2 }, { 0,3027 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 9, 0 }, { 10, 0 }, { 0, 0 }, { 12, 0 }, { 13, 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 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 22 },
+ { 0,2993 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },
+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 },
+ { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 },
+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },
+ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },
+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },
+ { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 },
+ { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 },
+
+ { 40, 0 }, { 41, 0 }, { 0, 0 }, { 43, 0 }, { 44, 0 },
+ { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 },
+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },
+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 },
+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },
+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },
+ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },
+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },
+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },
+ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },
+
+ { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 },
+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },
+ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },
+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },
+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },
+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },
+ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 },
+ { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },
+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },
+ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },
+
+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },
+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },
+ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },
+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },
+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },
+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },
+ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },
+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },
+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },
+ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },
+
+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },
+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },
+ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },
+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },
+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },
+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },
+ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },
+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },
+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },
+ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },
+
+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },
+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },
+ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },
+ { 255, 0 }, { 256, 0 }, { 0, 41 }, { 0,2735 }, { 1,-3044 },
+ { 2,-3044 }, { 3,-3044 }, { 4,-3044 }, { 5,-3044 }, { 6,-3044 },
+ { 7,-3044 }, { 8,-3044 }, { 0, 0 }, { 0, 0 }, { 11,-3044 },
+ { 0, 0 }, { 0, 0 }, { 14,-3044 }, { 15,-3044 }, { 16,-3044 },
+ { 17,-3044 }, { 18,-3044 }, { 19,-3044 }, { 20,-3044 }, { 21,-3044 },
+ { 22,-3044 }, { 23,-3044 }, { 24,-3044 }, { 25,-3044 }, { 26,-3044 },
+ { 27,-3044 }, { 28,-3044 }, { 29,-3044 }, { 30,-3044 }, { 31,-3044 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39,-3044 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },
+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },
+ { 57, 0 }, { 0, 0 }, { 59,-3044 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-3044 }, { 66,-3044 },
+ { 67,-3044 }, { 68,-3044 }, { 69, 258 }, { 70,-3044 }, { 71,-3044 },
+ { 72,-3044 }, { 73,-3044 }, { 74,-3044 }, { 75,-3044 }, { 76,-3044 },
+ { 77,-3044 }, { 78,-3044 }, { 79,-3044 }, { 80,-3044 }, { 81,-3044 },
+
+ { 82,-3044 }, { 83,-3044 }, { 84,-3044 }, { 85,-3044 }, { 86,-3044 },
+ { 87,-3044 }, { 88,-3044 }, { 89,-3044 }, { 90,-3044 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 94,-3044 }, { 95,-3044 }, { 96,-3044 },
+ { 97,-3044 }, { 98,-3044 }, { 99,-3044 }, { 100,-3044 }, { 101, 258 },
+ { 102,-3044 }, { 103,-3044 }, { 104,-3044 }, { 105,-3044 }, { 106,-3044 },
+ { 107,-3044 }, { 108,-3044 }, { 109,-3044 }, { 110,-3044 }, { 111,-3044 },
+ { 112,-3044 }, { 113,-3044 }, { 114,-3044 }, { 115,-3044 }, { 116,-3044 },
+ { 117,-3044 }, { 118,-3044 }, { 119,-3044 }, { 120,-3044 }, { 121,-3044 },
+ { 122,-3044 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126,-3044 },
+ { 127,-3044 }, { 128,-3044 }, { 129,-3044 }, { 130,-3044 }, { 131,-3044 },
+
+ { 132,-3044 }, { 133,-3044 }, { 134,-3044 }, { 135,-3044 }, { 136,-3044 },
+ { 137,-3044 }, { 138,-3044 }, { 139,-3044 }, { 140,-3044 }, { 141,-3044 },
+ { 142,-3044 }, { 143,-3044 }, { 144,-3044 }, { 145,-3044 }, { 146,-3044 },
+ { 147,-3044 }, { 148,-3044 }, { 149,-3044 }, { 150,-3044 }, { 151,-3044 },
+ { 152,-3044 }, { 153,-3044 }, { 154,-3044 }, { 155,-3044 }, { 156,-3044 },
+ { 157,-3044 }, { 158,-3044 }, { 159,-3044 }, { 160,-3044 }, { 161,-3044 },
+ { 162,-3044 }, { 163,-3044 }, { 164,-3044 }, { 165,-3044 }, { 166,-3044 },
+ { 167,-3044 }, { 168,-3044 }, { 169,-3044 }, { 170,-3044 }, { 171,-3044 },
+ { 172,-3044 }, { 173,-3044 }, { 174,-3044 }, { 175,-3044 }, { 176,-3044 },
+ { 177,-3044 }, { 178,-3044 }, { 179,-3044 }, { 180,-3044 }, { 181,-3044 },
+
+ { 182,-3044 }, { 183,-3044 }, { 184,-3044 }, { 185,-3044 }, { 186,-3044 },
+ { 187,-3044 }, { 188,-3044 }, { 189,-3044 }, { 190,-3044 }, { 191,-3044 },
+ { 192,-3044 }, { 193,-3044 }, { 194,-3044 }, { 195,-3044 }, { 196,-3044 },
+ { 197,-3044 }, { 198,-3044 }, { 199,-3044 }, { 200,-3044 }, { 201,-3044 },
+ { 202,-3044 }, { 203,-3044 }, { 204,-3044 }, { 205,-3044 }, { 206,-3044 },
+ { 207,-3044 }, { 208,-3044 }, { 209,-3044 }, { 210,-3044 }, { 211,-3044 },
+ { 212,-3044 }, { 213,-3044 }, { 214,-3044 }, { 215,-3044 }, { 216,-3044 },
+ { 217,-3044 }, { 218,-3044 }, { 219,-3044 }, { 220,-3044 }, { 221,-3044 },
+ { 222,-3044 }, { 223,-3044 }, { 224,-3044 }, { 225,-3044 }, { 226,-3044 },
+ { 227,-3044 }, { 228,-3044 }, { 229,-3044 }, { 230,-3044 }, { 231,-3044 },
+
+ { 232,-3044 }, { 233,-3044 }, { 234,-3044 }, { 235,-3044 }, { 236,-3044 },
+ { 237,-3044 }, { 238,-3044 }, { 239,-3044 }, { 240,-3044 }, { 241,-3044 },
+ { 242,-3044 }, { 243,-3044 }, { 244,-3044 }, { 245,-3044 }, { 246,-3044 },
+ { 247,-3044 }, { 248,-3044 }, { 249,-3044 }, { 250,-3044 }, { 251,-3044 },
+ { 252,-3044 }, { 253,-3044 }, { 254,-3044 }, { 255,-3044 }, { 256,-3044 },
+ { 0, 45 }, { 0,2477 }, { 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, 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 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 43, 317 },
+ { 0, 0 }, { 45, 317 }, { 0, 0 }, { 0, 0 }, { 48, 799 },
+ { 49, 799 }, { 50, 799 }, { 51, 799 }, { 52, 799 }, { 53, 799 },
+ { 54, 799 }, { 55, 799 }, { 56, 799 }, { 57, 799 }, { 0, 41 },
+ { 0,2418 }, { 1,-3361 }, { 2,-3361 }, { 3,-3361 }, { 4,-3361 },
+ { 5,-3361 }, { 6,-3361 }, { 7,-3361 }, { 8,-3361 }, { 0, 0 },
+ { 0, 0 }, { 11,-3361 }, { 0, 0 }, { 0, 0 }, { 14,-3361 },
+
+ { 15,-3361 }, { 16,-3361 }, { 17,-3361 }, { 18,-3361 }, { 19,-3361 },
+ { 20,-3361 }, { 21,-3361 }, { 22,-3361 }, { 23,-3361 }, { 24,-3361 },
+ { 25,-3361 }, { 26,-3361 }, { 27,-3361 }, { 28,-3361 }, { 29,-3361 },
+ { 30,-3361 }, { 31,-3361 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-3361 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 },
+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },
+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 }, { 59,-3361 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 65,-3361 }, { 66,-3361 }, { 67,-3361 }, { 68,-3361 }, { 69, -59 },
+ { 70,-3361 }, { 71,-3361 }, { 72,-3361 }, { 73,-3361 }, { 74,-3361 },
+ { 75,-3361 }, { 76,-3361 }, { 77,-3361 }, { 78,-3361 }, { 79,-3361 },
+ { 80,-3361 }, { 81,-3361 }, { 82,-3361 }, { 83,-3361 }, { 84,-3361 },
+ { 85,-3361 }, { 86,-3361 }, { 87,-3361 }, { 88,-3361 }, { 89,-3361 },
+ { 90,-3361 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,-3361 },
+ { 95,-3361 }, { 96,-3361 }, { 97,-3361 }, { 98,-3361 }, { 99,-3361 },
+ { 100,-3361 }, { 101, -59 }, { 102,-3361 }, { 103,-3361 }, { 104,-3361 },
+ { 105,-3361 }, { 106,-3361 }, { 107,-3361 }, { 108,-3361 }, { 109,-3361 },
+ { 110,-3361 }, { 111,-3361 }, { 112,-3361 }, { 113,-3361 }, { 114,-3361 },
+
+ { 115,-3361 }, { 116,-3361 }, { 117,-3361 }, { 118,-3361 }, { 119,-3361 },
+ { 120,-3361 }, { 121,-3361 }, { 122,-3361 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 126,-3361 }, { 127,-3361 }, { 128,-3361 }, { 129,-3361 },
+ { 130,-3361 }, { 131,-3361 }, { 132,-3361 }, { 133,-3361 }, { 134,-3361 },
+ { 135,-3361 }, { 136,-3361 }, { 137,-3361 }, { 138,-3361 }, { 139,-3361 },
+ { 140,-3361 }, { 141,-3361 }, { 142,-3361 }, { 143,-3361 }, { 144,-3361 },
+ { 145,-3361 }, { 146,-3361 }, { 147,-3361 }, { 148,-3361 }, { 149,-3361 },
+ { 150,-3361 }, { 151,-3361 }, { 152,-3361 }, { 153,-3361 }, { 154,-3361 },
+ { 155,-3361 }, { 156,-3361 }, { 157,-3361 }, { 158,-3361 }, { 159,-3361 },
+ { 160,-3361 }, { 161,-3361 }, { 162,-3361 }, { 163,-3361 }, { 164,-3361 },
+
+ { 165,-3361 }, { 166,-3361 }, { 167,-3361 }, { 168,-3361 }, { 169,-3361 },
+ { 170,-3361 }, { 171,-3361 }, { 172,-3361 }, { 173,-3361 }, { 174,-3361 },
+ { 175,-3361 }, { 176,-3361 }, { 177,-3361 }, { 178,-3361 }, { 179,-3361 },
+ { 180,-3361 }, { 181,-3361 }, { 182,-3361 }, { 183,-3361 }, { 184,-3361 },
+ { 185,-3361 }, { 186,-3361 }, { 187,-3361 }, { 188,-3361 }, { 189,-3361 },
+ { 190,-3361 }, { 191,-3361 }, { 192,-3361 }, { 193,-3361 }, { 194,-3361 },
+ { 195,-3361 }, { 196,-3361 }, { 197,-3361 }, { 198,-3361 }, { 199,-3361 },
+ { 200,-3361 }, { 201,-3361 }, { 202,-3361 }, { 203,-3361 }, { 204,-3361 },
+ { 205,-3361 }, { 206,-3361 }, { 207,-3361 }, { 208,-3361 }, { 209,-3361 },
+ { 210,-3361 }, { 211,-3361 }, { 212,-3361 }, { 213,-3361 }, { 214,-3361 },
+
+ { 215,-3361 }, { 216,-3361 }, { 217,-3361 }, { 218,-3361 }, { 219,-3361 },
+ { 220,-3361 }, { 221,-3361 }, { 222,-3361 }, { 223,-3361 }, { 224,-3361 },
+ { 225,-3361 }, { 226,-3361 }, { 227,-3361 }, { 228,-3361 }, { 229,-3361 },
+ { 230,-3361 }, { 231,-3361 }, { 232,-3361 }, { 233,-3361 }, { 234,-3361 },
+ { 235,-3361 }, { 236,-3361 }, { 237,-3361 }, { 238,-3361 }, { 239,-3361 },
+ { 240,-3361 }, { 241,-3361 }, { 242,-3361 }, { 243,-3361 }, { 244,-3361 },
+ { 245,-3361 }, { 246,-3361 }, { 247,-3361 }, { 248,-3361 }, { 249,-3361 },
+ { 250,-3361 }, { 251,-3361 }, { 252,-3361 }, { 253,-3361 }, { 254,-3361 },
+ { 255,-3361 }, { 256,-3361 }, { 0, 43 }, { 0,2160 }, { 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, 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 },
+ { 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, 0 }, { 48, 482 }, { 49, 482 }, { 50, 482 }, { 51, 482 },
+ { 52, 482 }, { 53, 482 }, { 54, 482 }, { 55, 482 }, { 56, 482 },
+
+ { 57, 482 }, { 0, 40 }, { 0,2101 }, { 1, 681 }, { 2, 681 },
+ { 3, 681 }, { 4, 681 }, { 5, 681 }, { 6, 681 }, { 7, 681 },
+ { 8, 681 }, { 0, 0 }, { 0, 0 }, { 11, 681 }, { 0, 0 },
+ { 0, 0 }, { 14, 681 }, { 15, 681 }, { 16, 681 }, { 17, 681 },
+ { 18, 681 }, { 19, 681 }, { 20, 681 }, { 21, 681 }, { 22, 681 },
+ { 23, 681 }, { 24, 681 }, { 25, 681 }, { 26, 681 }, { 27, 681 },
+ { 28, 681 }, { 29, 681 }, { 30, 681 }, { 31, 681 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 39, 681 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 48, 939 }, { 49, 939 }, { 50, 939 }, { 51, 939 }, { 52, 939 },
+ { 53, 939 }, { 54, 939 }, { 55, 939 }, { 56, 939 }, { 57, 939 },
+ { 0, 0 }, { 59, 681 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 65, 681 }, { 66, 681 }, { 67, 681 },
+ { 68, 681 }, { 69, 681 }, { 70, 681 }, { 71, 681 }, { 72, 681 },
+ { 73, 681 }, { 74, 681 }, { 75, 681 }, { 76, 681 }, { 77, 681 },
+ { 78, 681 }, { 79, 681 }, { 80, 681 }, { 81, 681 }, { 82, 681 },
+ { 83, 681 }, { 84, 681 }, { 85, 681 }, { 86, 681 }, { 87, 681 },
+ { 88, 681 }, { 89, 681 }, { 90, 681 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 94, 681 }, { 95, 681 }, { 96, 681 }, { 97, 681 },
+
+ { 98, 681 }, { 99, 681 }, { 100, 681 }, { 101, 681 }, { 102, 681 },
+ { 103, 681 }, { 104, 681 }, { 105, 681 }, { 106, 681 }, { 107, 681 },
+ { 108, 681 }, { 109, 681 }, { 110, 681 }, { 111, 681 }, { 112, 681 },
+ { 113, 681 }, { 114, 681 }, { 115, 681 }, { 116, 681 }, { 117, 681 },
+ { 118, 681 }, { 119, 681 }, { 120, 681 }, { 121, 681 }, { 122, 681 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126, 681 }, { 127, 681 },
+ { 128, 681 }, { 129, 681 }, { 130, 681 }, { 131, 681 }, { 132, 681 },
+ { 133, 681 }, { 134, 681 }, { 135, 681 }, { 136, 681 }, { 137, 681 },
+ { 138, 681 }, { 139, 681 }, { 140, 681 }, { 141, 681 }, { 142, 681 },
+ { 143, 681 }, { 144, 681 }, { 145, 681 }, { 146, 681 }, { 147, 681 },
+
+ { 148, 681 }, { 149, 681 }, { 150, 681 }, { 151, 681 }, { 152, 681 },
+ { 153, 681 }, { 154, 681 }, { 155, 681 }, { 156, 681 }, { 157, 681 },
+ { 158, 681 }, { 159, 681 }, { 160, 681 }, { 161, 681 }, { 162, 681 },
+ { 163, 681 }, { 164, 681 }, { 165, 681 }, { 166, 681 }, { 167, 681 },
+ { 168, 681 }, { 169, 681 }, { 170, 681 }, { 171, 681 }, { 172, 681 },
+ { 173, 681 }, { 174, 681 }, { 175, 681 }, { 176, 681 }, { 177, 681 },
+ { 178, 681 }, { 179, 681 }, { 180, 681 }, { 181, 681 }, { 182, 681 },
+ { 183, 681 }, { 184, 681 }, { 185, 681 }, { 186, 681 }, { 187, 681 },
+ { 188, 681 }, { 189, 681 }, { 190, 681 }, { 191, 681 }, { 192, 681 },
+ { 193, 681 }, { 194, 681 }, { 195, 681 }, { 196, 681 }, { 197, 681 },
+
+ { 198, 681 }, { 199, 681 }, { 200, 681 }, { 201, 681 }, { 202, 681 },
+ { 203, 681 }, { 204, 681 }, { 205, 681 }, { 206, 681 }, { 207, 681 },
+ { 208, 681 }, { 209, 681 }, { 210, 681 }, { 211, 681 }, { 212, 681 },
+ { 213, 681 }, { 214, 681 }, { 215, 681 }, { 216, 681 }, { 217, 681 },
+ { 218, 681 }, { 219, 681 }, { 220, 681 }, { 221, 681 }, { 222, 681 },
+ { 223, 681 }, { 224, 681 }, { 225, 681 }, { 226, 681 }, { 227, 681 },
+ { 228, 681 }, { 229, 681 }, { 230, 681 }, { 231, 681 }, { 232, 681 },
+ { 233, 681 }, { 234, 681 }, { 235, 681 }, { 236, 681 }, { 237, 681 },
+ { 238, 681 }, { 239, 681 }, { 240, 681 }, { 241, 681 }, { 242, 681 },
+ { 243, 681 }, { 244, 681 }, { 245, 681 }, { 246, 681 }, { 247, 681 },
+
+ { 248, 681 }, { 249, 681 }, { 250, 681 }, { 251, 681 }, { 252, 681 },
+ { 253, 681 }, { 254, 681 }, { 255, 681 }, { 256, 681 }, { 0, 13 },
+ { 0,1843 }, { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 13 }, { 0,1820 }, { 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, 0 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 939 }, { 49, 939 },
+ { 50, 939 }, { 51, 939 }, { 52, 939 }, { 53, 939 }, { 54, 939 },
+ { 55, 939 }, { 56, 939 }, { 57, 939 }, { 0, 0 }, { 0, 0 },
+ { 0, 14 }, { 0,1782 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65, 939 }, { 66, 939 }, { 67, 939 }, { 68, 939 }, { 69, 939 },
+ { 70, 939 }, { 48, 939 }, { 49, 939 }, { 50, 939 }, { 51, 939 },
+ { 52, 939 }, { 53, 939 }, { 54, 939 }, { 55, 939 }, { 56, 939 },
+ { 57, 939 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 939 }, { 66, 939 },
+
+ { 67, 939 }, { 68, 939 }, { 69, 939 }, { 70, 939 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 97, 939 }, { 98, 939 }, { 99, 939 },
+ { 100, 939 }, { 101, 939 }, { 102, 939 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-3995 },
+ { 49,-3995 }, { 50,-3995 }, { 51,-3995 }, { 52,-3995 }, { 53,-3995 },
+ { 54,-3995 }, { 55,-3995 }, { 56,-3995 }, { 57,-3995 }, { 0, 0 },
+ { 97, 939 }, { 98, 939 }, { 99, 939 }, { 100, 939 }, { 101, 939 },
+ { 102, 939 }, { 65,-3995 }, { 66,-3995 }, { 67,-3995 }, { 68,-3995 },
+ { 69,-3995 }, { 70,-3995 }, { 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, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-3995 }, { 98,-3995 },
+ { 99,-3995 }, { 100,-3995 }, { 101,-3995 }, { 102,-3995 }, { 0, 40 },
+ { 0,1678 }, { 1,-4097 }, { 2,-4097 }, { 3,-4097 }, { 4,-4097 },
+ { 5,-4097 }, { 6,-4097 }, { 7,-4097 }, { 8,-4097 }, { 0, 0 },
+ { 0, 0 }, { 11,-4097 }, { 0, 0 }, { 0, 0 }, { 14,-4097 },
+ { 15,-4097 }, { 16,-4097 }, { 17,-4097 }, { 18,-4097 }, { 19,-4097 },
+ { 20,-4097 }, { 21,-4097 }, { 22,-4097 }, { 23,-4097 }, { 24,-4097 },
+
+ { 25,-4097 }, { 26,-4097 }, { 27,-4097 }, { 28,-4097 }, { 29,-4097 },
+ { 30,-4097 }, { 31,-4097 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-4097 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 909 }, { 49, 909 },
+ { 50, 909 }, { 51, 909 }, { 52, 909 }, { 53, 909 }, { 54, 909 },
+ { 55, 909 }, { 56, 909 }, { 57, 909 }, { 0, 0 }, { 59,-4097 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65,-4097 }, { 66,-4097 }, { 67,-4097 }, { 68,-4097 }, { 69,-4097 },
+ { 70,-4097 }, { 71,-4097 }, { 72,-4097 }, { 73,-4097 }, { 74,-4097 },
+
+ { 75,-4097 }, { 76,-4097 }, { 77,-4097 }, { 78,-4097 }, { 79,-4097 },
+ { 80,-4097 }, { 81,-4097 }, { 82,-4097 }, { 83,-4097 }, { 84,-4097 },
+ { 85,-4097 }, { 86,-4097 }, { 87,-4097 }, { 88,-4097 }, { 89,-4097 },
+ { 90,-4097 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,-4097 },
+ { 95,-4097 }, { 96,-4097 }, { 97,-4097 }, { 98,-4097 }, { 99,-4097 },
+ { 100,-4097 }, { 101,-4097 }, { 102,-4097 }, { 103,-4097 }, { 104,-4097 },
+ { 105,-4097 }, { 106,-4097 }, { 107,-4097 }, { 108,-4097 }, { 109,-4097 },
+ { 110,-4097 }, { 111,-4097 }, { 112,-4097 }, { 113,-4097 }, { 114,-4097 },
+ { 115,-4097 }, { 116,-4097 }, { 117,-4097 }, { 118,-4097 }, { 119,-4097 },
+ { 120,-4097 }, { 121,-4097 }, { 122,-4097 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 126,-4097 }, { 127,-4097 }, { 128,-4097 }, { 129,-4097 },
+ { 130,-4097 }, { 131,-4097 }, { 132,-4097 }, { 133,-4097 }, { 134,-4097 },
+ { 135,-4097 }, { 136,-4097 }, { 137,-4097 }, { 138,-4097 }, { 139,-4097 },
+ { 140,-4097 }, { 141,-4097 }, { 142,-4097 }, { 143,-4097 }, { 144,-4097 },
+ { 145,-4097 }, { 146,-4097 }, { 147,-4097 }, { 148,-4097 }, { 149,-4097 },
+ { 150,-4097 }, { 151,-4097 }, { 152,-4097 }, { 153,-4097 }, { 154,-4097 },
+ { 155,-4097 }, { 156,-4097 }, { 157,-4097 }, { 158,-4097 }, { 159,-4097 },
+ { 160,-4097 }, { 161,-4097 }, { 162,-4097 }, { 163,-4097 }, { 164,-4097 },
+ { 165,-4097 }, { 166,-4097 }, { 167,-4097 }, { 168,-4097 }, { 169,-4097 },
+ { 170,-4097 }, { 171,-4097 }, { 172,-4097 }, { 173,-4097 }, { 174,-4097 },
+
+ { 175,-4097 }, { 176,-4097 }, { 177,-4097 }, { 178,-4097 }, { 179,-4097 },
+ { 180,-4097 }, { 181,-4097 }, { 182,-4097 }, { 183,-4097 }, { 184,-4097 },
+ { 185,-4097 }, { 186,-4097 }, { 187,-4097 }, { 188,-4097 }, { 189,-4097 },
+ { 190,-4097 }, { 191,-4097 }, { 192,-4097 }, { 193,-4097 }, { 194,-4097 },
+ { 195,-4097 }, { 196,-4097 }, { 197,-4097 }, { 198,-4097 }, { 199,-4097 },
+ { 200,-4097 }, { 201,-4097 }, { 202,-4097 }, { 203,-4097 }, { 204,-4097 },
+ { 205,-4097 }, { 206,-4097 }, { 207,-4097 }, { 208,-4097 }, { 209,-4097 },
+ { 210,-4097 }, { 211,-4097 }, { 212,-4097 }, { 213,-4097 }, { 214,-4097 },
+ { 215,-4097 }, { 216,-4097 }, { 217,-4097 }, { 218,-4097 }, { 219,-4097 },
+ { 220,-4097 }, { 221,-4097 }, { 222,-4097 }, { 223,-4097 }, { 224,-4097 },
+
+ { 225,-4097 }, { 226,-4097 }, { 227,-4097 }, { 228,-4097 }, { 229,-4097 },
+ { 230,-4097 }, { 231,-4097 }, { 232,-4097 }, { 233,-4097 }, { 234,-4097 },
+ { 235,-4097 }, { 236,-4097 }, { 237,-4097 }, { 238,-4097 }, { 239,-4097 },
+ { 240,-4097 }, { 241,-4097 }, { 242,-4097 }, { 243,-4097 }, { 244,-4097 },
+ { 245,-4097 }, { 246,-4097 }, { 247,-4097 }, { 248,-4097 }, { 249,-4097 },
+ { 250,-4097 }, { 251,-4097 }, { 252,-4097 }, { 253,-4097 }, { 254,-4097 },
+ { 255,-4097 }, { 256,-4097 }, { 0, 46 }, { 0,1420 }, { 1,-4090 },
+ { 2,-4090 }, { 3,-4090 }, { 4,-4090 }, { 5,-4090 }, { 6,-4090 },
+ { 7,-4090 }, { 8,-4090 }, { 0, 0 }, { 0, 0 }, { 11,-4090 },
+ { 0, 0 }, { 0, 0 }, { 14,-4090 }, { 15,-4090 }, { 16,-4090 },
+
+ { 17,-4090 }, { 18,-4090 }, { 19,-4090 }, { 20,-4090 }, { 21,-4090 },
+ { 22,-4090 }, { 23,-4090 }, { 24,-4090 }, { 25,-4090 }, { 26,-4090 },
+ { 27,-4090 }, { 28,-4090 }, { 29,-4090 }, { 30,-4090 }, { 31,-4090 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 39,-4090 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 48,-4090 }, { 49,-4090 }, { 50,-4090 }, { 51,-4090 },
+ { 52,-4090 }, { 53,-4090 }, { 54,-4090 }, { 55,-4090 }, { 56,-4090 },
+ { 57,-4090 }, { 0, 0 }, { 59,-4090 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-4090 }, { 66,-4090 },
+
+ { 67,-4090 }, { 68,-4090 }, { 69,-4090 }, { 70,-4090 }, { 71,-4090 },
+ { 72,-4090 }, { 73,-4090 }, { 74,-4090 }, { 75,-4090 }, { 76,-4090 },
+ { 77,-4090 }, { 78,-4090 }, { 79,-4090 }, { 80,-4090 }, { 81,-4090 },
+ { 82,-4090 }, { 83,-4090 }, { 84,-4090 }, { 85,-4090 }, { 86,-4090 },
+ { 87,-4090 }, { 88,-4090 }, { 89,-4090 }, { 90,-4090 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 94,-4090 }, { 95,-4090 }, { 96,-4090 },
+ { 97,-4090 }, { 98,-4090 }, { 99,-4090 }, { 100,-4090 }, { 101,-4090 },
+ { 102,-4090 }, { 103,-4090 }, { 104,-4090 }, { 105,-4090 }, { 106,-4090 },
+ { 107,-4090 }, { 108,-4090 }, { 109,-4090 }, { 110,-4090 }, { 111,-4090 },
+ { 112,-4090 }, { 113,-4090 }, { 114,-4090 }, { 115,-4090 }, { 116,-4090 },
+
+ { 117,-4090 }, { 118,-4090 }, { 119,-4090 }, { 120,-4090 }, { 121,-4090 },
+ { 122,-4090 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 126,-4090 },
+ { 127,-4090 }, { 128,-4090 }, { 129,-4090 }, { 130,-4090 }, { 131,-4090 },
+ { 132,-4090 }, { 133,-4090 }, { 134,-4090 }, { 135,-4090 }, { 136,-4090 },
+ { 137,-4090 }, { 138,-4090 }, { 139,-4090 }, { 140,-4090 }, { 141,-4090 },
+ { 142,-4090 }, { 143,-4090 }, { 144,-4090 }, { 145,-4090 }, { 146,-4090 },
+ { 147,-4090 }, { 148,-4090 }, { 149,-4090 }, { 150,-4090 }, { 151,-4090 },
+ { 152,-4090 }, { 153,-4090 }, { 154,-4090 }, { 155,-4090 }, { 156,-4090 },
+ { 157,-4090 }, { 158,-4090 }, { 159,-4090 }, { 160,-4090 }, { 161,-4090 },
+ { 162,-4090 }, { 163,-4090 }, { 164,-4090 }, { 165,-4090 }, { 166,-4090 },
+
+ { 167,-4090 }, { 168,-4090 }, { 169,-4090 }, { 170,-4090 }, { 171,-4090 },
+ { 172,-4090 }, { 173,-4090 }, { 174,-4090 }, { 175,-4090 }, { 176,-4090 },
+ { 177,-4090 }, { 178,-4090 }, { 179,-4090 }, { 180,-4090 }, { 181,-4090 },
+ { 182,-4090 }, { 183,-4090 }, { 184,-4090 }, { 185,-4090 }, { 186,-4090 },
+ { 187,-4090 }, { 188,-4090 }, { 189,-4090 }, { 190,-4090 }, { 191,-4090 },
+ { 192,-4090 }, { 193,-4090 }, { 194,-4090 }, { 195,-4090 }, { 196,-4090 },
+ { 197,-4090 }, { 198,-4090 }, { 199,-4090 }, { 200,-4090 }, { 201,-4090 },
+ { 202,-4090 }, { 203,-4090 }, { 204,-4090 }, { 205,-4090 }, { 206,-4090 },
+ { 207,-4090 }, { 208,-4090 }, { 209,-4090 }, { 210,-4090 }, { 211,-4090 },
+ { 212,-4090 }, { 213,-4090 }, { 214,-4090 }, { 215,-4090 }, { 216,-4090 },
+
+ { 217,-4090 }, { 218,-4090 }, { 219,-4090 }, { 220,-4090 }, { 221,-4090 },
+ { 222,-4090 }, { 223,-4090 }, { 224,-4090 }, { 225,-4090 }, { 226,-4090 },
+ { 227,-4090 }, { 228,-4090 }, { 229,-4090 }, { 230,-4090 }, { 231,-4090 },
+ { 232,-4090 }, { 233,-4090 }, { 234,-4090 }, { 235,-4090 }, { 236,-4090 },
+ { 237,-4090 }, { 238,-4090 }, { 239,-4090 }, { 240,-4090 }, { 241,-4090 },
+ { 242,-4090 }, { 243,-4090 }, { 244,-4090 }, { 245,-4090 }, { 246,-4090 },
+ { 247,-4090 }, { 248,-4090 }, { 249,-4090 }, { 250,-4090 }, { 251,-4090 },
+ { 252,-4090 }, { 253,-4090 }, { 254,-4090 }, { 255,-4090 }, { 256,-4090 },
+ { 0, 40 }, { 0,1162 }, { 1,-258 }, { 2,-258 }, { 3,-258 },
+ { 4,-258 }, { 5,-258 }, { 6,-258 }, { 7,-258 }, { 8,-258 },
+
+ { 0, 0 }, { 0, 0 }, { 11,-258 }, { 0, 0 }, { 0, 0 },
+ { 14,-258 }, { 15,-258 }, { 16,-258 }, { 17,-258 }, { 18,-258 },
+ { 19,-258 }, { 20,-258 }, { 21,-258 }, { 22,-258 }, { 23,-258 },
+ { 24,-258 }, { 25,-258 }, { 26,-258 }, { 27,-258 }, { 28,-258 },
+ { 29,-258 }, { 30,-258 }, { 31,-258 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 39,-258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 },
+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },
+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 },
+
+ { 59,-258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 65,-258 }, { 66,-258 }, { 67,-258 }, { 68,-258 },
+ { 69,-258 }, { 70,-258 }, { 71,-258 }, { 72,-258 }, { 73,-258 },
+ { 74,-258 }, { 75,-258 }, { 76,-258 }, { 77,-258 }, { 78,-258 },
+ { 79,-258 }, { 80,-258 }, { 81,-258 }, { 82,-258 }, { 83,-258 },
+ { 84,-258 }, { 85,-258 }, { 86,-258 }, { 87,-258 }, { 88,-258 },
+ { 89,-258 }, { 90,-258 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 94,-258 }, { 95,-258 }, { 96,-258 }, { 97,-258 }, { 98,-258 },
+ { 99,-258 }, { 100,-258 }, { 101,-258 }, { 102,-258 }, { 103,-258 },
+ { 104,-258 }, { 105,-258 }, { 106,-258 }, { 107,-258 }, { 108,-258 },
+
+ { 109,-258 }, { 110,-258 }, { 111,-258 }, { 112,-258 }, { 113,-258 },
+ { 114,-258 }, { 115,-258 }, { 116,-258 }, { 117,-258 }, { 118,-258 },
+ { 119,-258 }, { 120,-258 }, { 121,-258 }, { 122,-258 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 126,-258 }, { 127,-258 }, { 128,-258 },
+ { 129,-258 }, { 130,-258 }, { 131,-258 }, { 132,-258 }, { 133,-258 },
+ { 134,-258 }, { 135,-258 }, { 136,-258 }, { 137,-258 }, { 138,-258 },
+ { 139,-258 }, { 140,-258 }, { 141,-258 }, { 142,-258 }, { 143,-258 },
+ { 144,-258 }, { 145,-258 }, { 146,-258 }, { 147,-258 }, { 148,-258 },
+ { 149,-258 }, { 150,-258 }, { 151,-258 }, { 152,-258 }, { 153,-258 },
+ { 154,-258 }, { 155,-258 }, { 156,-258 }, { 157,-258 }, { 158,-258 },
+
+ { 159,-258 }, { 160,-258 }, { 161,-258 }, { 162,-258 }, { 163,-258 },
+ { 164,-258 }, { 165,-258 }, { 166,-258 }, { 167,-258 }, { 168,-258 },
+ { 169,-258 }, { 170,-258 }, { 171,-258 }, { 172,-258 }, { 173,-258 },
+ { 174,-258 }, { 175,-258 }, { 176,-258 }, { 177,-258 }, { 178,-258 },
+ { 179,-258 }, { 180,-258 }, { 181,-258 }, { 182,-258 }, { 183,-258 },
+ { 184,-258 }, { 185,-258 }, { 186,-258 }, { 187,-258 }, { 188,-258 },
+ { 189,-258 }, { 190,-258 }, { 191,-258 }, { 192,-258 }, { 193,-258 },
+ { 194,-258 }, { 195,-258 }, { 196,-258 }, { 197,-258 }, { 198,-258 },
+ { 199,-258 }, { 200,-258 }, { 201,-258 }, { 202,-258 }, { 203,-258 },
+ { 204,-258 }, { 205,-258 }, { 206,-258 }, { 207,-258 }, { 208,-258 },
+
+ { 209,-258 }, { 210,-258 }, { 211,-258 }, { 212,-258 }, { 213,-258 },
+ { 214,-258 }, { 215,-258 }, { 216,-258 }, { 217,-258 }, { 218,-258 },
+ { 219,-258 }, { 220,-258 }, { 221,-258 }, { 222,-258 }, { 223,-258 },
+ { 224,-258 }, { 225,-258 }, { 226,-258 }, { 227,-258 }, { 228,-258 },
+ { 229,-258 }, { 230,-258 }, { 231,-258 }, { 232,-258 }, { 233,-258 },
+ { 234,-258 }, { 235,-258 }, { 236,-258 }, { 237,-258 }, { 238,-258 },
+ { 239,-258 }, { 240,-258 }, { 241,-258 }, { 242,-258 }, { 243,-258 },
+ { 244,-258 }, { 245,-258 }, { 246,-258 }, { 247,-258 }, { 248,-258 },
+ { 249,-258 }, { 250,-258 }, { 251,-258 }, { 252,-258 }, { 253,-258 },
+ { 254,-258 }, { 255,-258 }, { 256,-258 }, { 0, 13 }, { 0, 904 },
+
+ { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 13 }, { 0, 881 }, { 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, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 48, 393 }, { 49, 393 }, { 50, 393 },
+
+ { 51, 393 }, { 52, 393 }, { 53, 393 }, { 54, 393 }, { 55, 393 },
+ { 56, 393 }, { 57, 393 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 393 },
+ { 66, 393 }, { 67, 393 }, { 68, 393 }, { 69, 393 }, { 70, 393 },
+ { 48, 393 }, { 49, 393 }, { 50, 393 }, { 51, 393 }, { 52, 393 },
+ { 53, 393 }, { 54, 393 }, { 55, 393 }, { 56, 393 }, { 57, 393 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 65, 393 }, { 66, 393 }, { 67, 393 },
+ { 68, 393 }, { 69, 393 }, { 70, 393 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 97, 393 }, { 98, 393 }, { 99, 393 }, { 100, 393 },
+
+ { 101, 393 }, { 102, 393 }, { 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, 0 }, { 0, 0 }, { 97, 393 },
+ { 98, 393 }, { 99, 393 }, { 100, 393 }, { 101, 393 }, { 102, 393 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 40 }, { 0, 769 },
+ { 1,-5006 }, { 2,-5006 }, { 3,-5006 }, { 4,-5006 }, { 5,-5006 },
+ { 6,-5006 }, { 7,-5006 }, { 8,-5006 }, { 0, 0 }, { 0, 0 },
+ { 11,-5006 }, { 0, 0 }, { 125,-4596 }, { 14,-5006 }, { 15,-5006 },
+
+ { 16,-5006 }, { 17,-5006 }, { 18,-5006 }, { 19,-5006 }, { 20,-5006 },
+ { 21,-5006 }, { 22,-5006 }, { 23,-5006 }, { 24,-5006 }, { 25,-5006 },
+ { 26,-5006 }, { 27,-5006 }, { 28,-5006 }, { 29,-5006 }, { 30,-5006 },
+ { 31,-5006 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-5006 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },
+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },
+ { 56, 0 }, { 57, 0 }, { 0, 0 }, { 59,-5006 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-5006 },
+
+ { 66,-5006 }, { 67,-5006 }, { 68,-5006 }, { 69,-5006 }, { 70,-5006 },
+ { 71,-5006 }, { 72,-5006 }, { 73,-5006 }, { 74,-5006 }, { 75,-5006 },
+ { 76,-5006 }, { 77,-5006 }, { 78,-5006 }, { 79,-5006 }, { 80,-5006 },
+ { 81,-5006 }, { 82,-5006 }, { 83,-5006 }, { 84,-5006 }, { 85,-5006 },
+ { 86,-5006 }, { 87,-5006 }, { 88,-5006 }, { 89,-5006 }, { 90,-5006 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,-5006 }, { 95,-5006 },
+ { 96,-5006 }, { 97,-5006 }, { 98,-5006 }, { 99,-5006 }, { 100,-5006 },
+ { 101,-5006 }, { 102,-5006 }, { 103,-5006 }, { 104,-5006 }, { 105,-5006 },
+ { 106,-5006 }, { 107,-5006 }, { 108,-5006 }, { 109,-5006 }, { 110,-5006 },
+ { 111,-5006 }, { 112,-5006 }, { 113,-5006 }, { 114,-5006 }, { 115,-5006 },
+
+ { 116,-5006 }, { 117,-5006 }, { 118,-5006 }, { 119,-5006 }, { 120,-5006 },
+ { 121,-5006 }, { 122,-5006 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 126,-5006 }, { 127,-5006 }, { 128,-5006 }, { 129,-5006 }, { 130,-5006 },
+ { 131,-5006 }, { 132,-5006 }, { 133,-5006 }, { 134,-5006 }, { 135,-5006 },
+ { 136,-5006 }, { 137,-5006 }, { 138,-5006 }, { 139,-5006 }, { 140,-5006 },
+ { 141,-5006 }, { 142,-5006 }, { 143,-5006 }, { 144,-5006 }, { 145,-5006 },
+ { 146,-5006 }, { 147,-5006 }, { 148,-5006 }, { 149,-5006 }, { 150,-5006 },
+ { 151,-5006 }, { 152,-5006 }, { 153,-5006 }, { 154,-5006 }, { 155,-5006 },
+ { 156,-5006 }, { 157,-5006 }, { 158,-5006 }, { 159,-5006 }, { 160,-5006 },
+ { 161,-5006 }, { 162,-5006 }, { 163,-5006 }, { 164,-5006 }, { 165,-5006 },
+
+ { 166,-5006 }, { 167,-5006 }, { 168,-5006 }, { 169,-5006 }, { 170,-5006 },
+ { 171,-5006 }, { 172,-5006 }, { 173,-5006 }, { 174,-5006 }, { 175,-5006 },
+ { 176,-5006 }, { 177,-5006 }, { 178,-5006 }, { 179,-5006 }, { 180,-5006 },
+ { 181,-5006 }, { 182,-5006 }, { 183,-5006 }, { 184,-5006 }, { 185,-5006 },
+ { 186,-5006 }, { 187,-5006 }, { 188,-5006 }, { 189,-5006 }, { 190,-5006 },
+ { 191,-5006 }, { 192,-5006 }, { 193,-5006 }, { 194,-5006 }, { 195,-5006 },
+ { 196,-5006 }, { 197,-5006 }, { 198,-5006 }, { 199,-5006 }, { 200,-5006 },
+ { 201,-5006 }, { 202,-5006 }, { 203,-5006 }, { 204,-5006 }, { 205,-5006 },
+ { 206,-5006 }, { 207,-5006 }, { 208,-5006 }, { 209,-5006 }, { 210,-5006 },
+ { 211,-5006 }, { 212,-5006 }, { 213,-5006 }, { 214,-5006 }, { 215,-5006 },
+
+ { 216,-5006 }, { 217,-5006 }, { 218,-5006 }, { 219,-5006 }, { 220,-5006 },
+ { 221,-5006 }, { 222,-5006 }, { 223,-5006 }, { 224,-5006 }, { 225,-5006 },
+ { 226,-5006 }, { 227,-5006 }, { 228,-5006 }, { 229,-5006 }, { 230,-5006 },
+ { 231,-5006 }, { 232,-5006 }, { 233,-5006 }, { 234,-5006 }, { 235,-5006 },
+ { 236,-5006 }, { 237,-5006 }, { 238,-5006 }, { 239,-5006 }, { 240,-5006 },
+ { 241,-5006 }, { 242,-5006 }, { 243,-5006 }, { 244,-5006 }, { 245,-5006 },
+ { 246,-5006 }, { 247,-5006 }, { 248,-5006 }, { 249,-5006 }, { 250,-5006 },
+ { 251,-5006 }, { 252,-5006 }, { 253,-5006 }, { 254,-5006 }, { 255,-5006 },
+ { 256,-5006 }, { 0, 13 }, { 0, 511 }, { 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, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 13 },
+ { 0, 488 }, { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 48,-4966 }, { 49,-4966 }, { 50,-4966 }, { 51,-4966 }, { 52,-4966 },
+ { 53,-4966 }, { 54,-4966 }, { 55,-4966 }, { 56,-4966 }, { 57,-4966 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 13 }, { 0, 450 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 65,-4966 }, { 66,-4966 }, { 67,-4966 },
+ { 68,-4966 }, { 69,-4966 }, { 70,-4966 }, { 48, 38 }, { 49, 38 },
+ { 50, 38 }, { 51, 38 }, { 52, 38 }, { 53, 38 }, { 54, 38 },
+ { 55, 38 }, { 56, 38 }, { 57, 38 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65, 38 }, { 66, 38 }, { 67, 38 }, { 68, 38 }, { 69, 38 },
+ { 70, 38 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-4966 },
+ { 98,-4966 }, { 99,-4966 }, { 100,-4966 }, { 101,-4966 }, { 102,-4966 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 48, 78 }, { 49, 78 }, { 50, 78 }, { 51, 78 },
+ { 52, 78 }, { 53, 78 }, { 54, 78 }, { 55, 78 }, { 56, 78 },
+ { 57, 78 }, { 0, 0 }, { 97, 38 }, { 98, 38 }, { 99, 38 },
+ { 100, 38 }, { 101, 38 }, { 102, 38 }, { 65, 78 }, { 66, 78 },
+ { 67, 78 }, { 68, 78 }, { 69, 78 }, { 70, 78 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 13 }, { 0, 372 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 125,-4989 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 97, 78 }, { 98, 78 }, { 99, 78 }, { 100, 78 }, { 101, 78 },
+ { 102, 78 }, { 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, 13 }, { 0, 334 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 125,-5027 }, { 48, 114 },
+ { 49, 114 }, { 50, 114 }, { 51, 114 }, { 52, 114 }, { 53, 114 },
+ { 54, 114 }, { 55, 114 }, { 56, 114 }, { 57, 114 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 65, 114 }, { 66, 114 }, { 67, 114 }, { 68, 114 },
+
+ { 69, 114 }, { 70, 114 }, { 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 }, { 48,-1509 }, { 49,-1509 }, { 50,-1509 },
+ { 51,-1509 }, { 52,-1509 }, { 53,-1509 }, { 54,-1509 }, { 55,-1509 },
+ { 56,-1509 }, { 57,-1509 }, { 0, 0 }, { 97, 114 }, { 98, 114 },
+ { 99, 114 }, { 100, 114 }, { 101, 114 }, { 102, 114 }, { 65,-1509 },
+ { 66,-1509 }, { 67,-1509 }, { 68,-1509 }, { 69,-1509 }, { 70,-1509 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 13 },
+ { 0, 258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 125,-5105 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 97,-1509 }, { 98,-1509 }, { 99,-1509 }, { 100,-1509 },
+ { 101,-1509 }, { 102,-1509 }, { 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, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 123,-1486 }, { 48,-3165 }, { 49,-3165 },
+ { 50,-3165 }, { 51,-3165 }, { 52,-3165 }, { 53,-3165 }, { 54,-3165 },
+
+ { 55,-3165 }, { 56,-3165 }, { 57,-3165 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 65,-3165 }, { 66,-3165 }, { 67,-3165 }, { 68,-3165 }, { 69,-3165 },
+ { 70,-3165 }, { 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, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 97,-3165 }, { 98,-3165 }, { 99,-3165 },
+ { 100,-3165 }, { 101,-3165 }, { 102,-3165 }, { 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, 0 }, { 0, 0 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+ { 125,-5219 }, { 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, 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 }, { 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, 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 }, { 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, 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 }, { 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, 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 },
+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+
+ { 0, 0 }, { 0, 0 }, { 257, 51 }, { 1, 0 }, };
+
+static const struct yy_trans_info *yy_start_state_list[11] =
+ {
+ &yy_transition[1],
+ &yy_transition[3],
+ &yy_transition[261],
+ &yy_transition[519],
+ &yy_transition[777],
+ &yy_transition[1035],
+ &yy_transition[1293],
+ &yy_transition[1551],
+ &yy_transition[1809],
+ &yy_transition[2067],
+ &yy_transition[2325],
+
+ } ;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "jsonpath_scan.l"
+#line 2 "jsonpath_scan.l"
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_scan.l
+ * Lexical parser for jsonpath datatype
+ *
+ * Splits jsonpath string into tokens represented as JsonPathString structs.
+ * Decodes unicode and hex escaped strings.
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath_scan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "mb/pg_wchar.h"
+#include "nodes/pg_list.h"
+
+static JsonPathString scanstring;
+
+/* Handles to the buffer that the lexer uses internally */
+static YY_BUFFER_STATE scanbufhandle;
+static char *scanbuf;
+static int scanbuflen;
+
+static void addstring(bool init, char *s, int l);
+static void addchar(bool init, char s);
+static enum yytokentype checkKeyword(void);
+static void parseUnicode(char *s, int l);
+static void parseHexChar(char *s);
+
+/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
+#undef fprintf
+#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
+
+static void
+fprintf_to_ereport(const char *fmt, const char *msg)
+{
+ ereport(ERROR, (errmsg_internal("%s", msg)));
+}
+
+/* LCOV_EXCL_START */
+
+#line 2982 "jsonpath_scan.c"
+#define YY_NO_INPUT 1
+/*
+ * We use exclusive states for quoted and non-quoted strings,
+ * quoted variable names and C-style comments.
+ * Exclusive states:
+ * <xq> - quoted strings
+ * <xnq> - non-quoted strings
+ * <xvq> - quoted variable names
+ * <xc> - C-style comment
+ */
+
+/* "other" means anything that's not special, blank, or '\' or '"' */
+#line 2995 "jsonpath_scan.c"
+
+#define INITIAL 0
+#define xq 1
+#define xnq 2
+#define xvq 3
+#define xc 4
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in ( void );
+
+void yyset_in ( FILE * _in_str );
+
+FILE *yyget_out ( void );
+
+void yyset_out ( FILE * _out_str );
+
+ int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number );
+
+YYSTYPE * yyget_lval ( void );
+
+void yyset_lval ( YYSTYPE * yylval_param );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex \
+ (YYSTYPE * yylval_param );
+
+#define YY_DECL int yylex \
+ (YYSTYPE * yylval_param )
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+
+ YYSTYPE * yylval;
+
+ yylval = yylval_param;
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ {
+#line 99 "jsonpath_scan.l"
+
+
+#line 3227 "jsonpath_scan.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yy_start_state_list[(yy_start)];
+yy_match:
+ {
+ const struct yy_trans_info *yy_trans_info;
+
+ YY_CHAR yy_c;
+
+ for ( yy_c = YY_SC_TO_UI(*yy_cp);
+ (yy_trans_info = &yy_current_state[yy_c])->
+ yy_verify == yy_c;
+ yy_c = YY_SC_TO_UI(*++yy_cp) )
+ yy_current_state += yy_trans_info->yy_nxt;
+ }
+
+yy_find_action:
+ yy_act = yy_current_state[-1].yy_nxt;
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 101 "jsonpath_scan.l"
+{
+ addstring(false, yytext, yyleng);
+ }
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 105 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 111 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ BEGIN xc;
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 116 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ yyless(0);
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+ YY_BREAK
+case YY_STATE_EOF(xnq):
+#line 123 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 129 "jsonpath_scan.l"
+{ addchar(false, '\b'); }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 131 "jsonpath_scan.l"
+{ addchar(false, '\f'); }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 133 "jsonpath_scan.l"
+{ addchar(false, '\n'); }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 135 "jsonpath_scan.l"
+{ addchar(false, '\r'); }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 137 "jsonpath_scan.l"
+{ addchar(false, '\t'); }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 139 "jsonpath_scan.l"
+{ addchar(false, '\v'); }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 141 "jsonpath_scan.l"
+{ parseUnicode(yytext, yyleng); }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 143 "jsonpath_scan.l"
+{ parseHexChar(yytext); }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 145 "jsonpath_scan.l"
+{ yyerror(NULL, "invalid unicode sequence"); }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 147 "jsonpath_scan.l"
+{ yyerror(NULL, "invalid hex character sequence"); }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 149 "jsonpath_scan.l"
+{
+ /* throw back the \\, and treat as unicode */
+ yyless(yyleng - 1);
+ parseUnicode(yytext, yyleng);
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 155 "jsonpath_scan.l"
+{ addchar(false, yytext[1]); }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 157 "jsonpath_scan.l"
+{ yyerror(NULL, "unexpected end after backslash"); }
+ YY_BREAK
+case YY_STATE_EOF(xq):
+case YY_STATE_EOF(xvq):
+#line 159 "jsonpath_scan.l"
+{ yyerror(NULL, "unexpected end of quoted string"); }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 161 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return STRING_P;
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 167 "jsonpath_scan.l"
+{
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return VARIABLE_P;
+ }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 173 "jsonpath_scan.l"
+{ addstring(false, yytext, yyleng); }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 175 "jsonpath_scan.l"
+{ BEGIN INITIAL; }
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 177 "jsonpath_scan.l"
+{ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 179 "jsonpath_scan.l"
+{ }
+ YY_BREAK
+case YY_STATE_EOF(xc):
+#line 181 "jsonpath_scan.l"
+{ yyerror(NULL, "unexpected end of comment"); }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 183 "jsonpath_scan.l"
+{ return AND_P; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 185 "jsonpath_scan.l"
+{ return OR_P; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 187 "jsonpath_scan.l"
+{ return NOT_P; }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 189 "jsonpath_scan.l"
+{ return ANY_P; }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 191 "jsonpath_scan.l"
+{ return LESS_P; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 193 "jsonpath_scan.l"
+{ return LESSEQUAL_P; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 195 "jsonpath_scan.l"
+{ return EQUAL_P; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 197 "jsonpath_scan.l"
+{ return NOTEQUAL_P; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 199 "jsonpath_scan.l"
+{ return NOTEQUAL_P; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 201 "jsonpath_scan.l"
+{ return GREATEREQUAL_P; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 203 "jsonpath_scan.l"
+{ return GREATER_P; }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 205 "jsonpath_scan.l"
+{
+ addstring(true, yytext + 1, yyleng - 1);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return VARIABLE_P;
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 212 "jsonpath_scan.l"
+{
+ addchar(true, '\0');
+ BEGIN xvq;
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 217 "jsonpath_scan.l"
+{ return *yytext; }
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 219 "jsonpath_scan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 221 "jsonpath_scan.l"
+{
+ addchar(true, '\0');
+ BEGIN xc;
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 226 "jsonpath_scan.l"
+{
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return NUMERIC_P;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 233 "jsonpath_scan.l"
+{
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return NUMERIC_P;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 240 "jsonpath_scan.l"
+{
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return INT_P;
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 247 "jsonpath_scan.l"
+{ yyerror(NULL, "invalid numeric literal"); }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 248 "jsonpath_scan.l"
+{ yyerror(NULL, "trailing junk after numeric literal"); }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 249 "jsonpath_scan.l"
+{ yyerror(NULL, "trailing junk after numeric literal"); }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 250 "jsonpath_scan.l"
+{ yyerror(NULL, "trailing junk after numeric literal"); }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 252 "jsonpath_scan.l"
+{
+ addchar(true, '\0');
+ BEGIN xq;
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 257 "jsonpath_scan.l"
+{
+ yyless(0);
+ addchar(true, '\0');
+ BEGIN xnq;
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 263 "jsonpath_scan.l"
+{
+ addstring(true, yytext, yyleng);
+ BEGIN xnq;
+ }
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+#line 268 "jsonpath_scan.l"
+{ yyterminate(); }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 270 "jsonpath_scan.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 3601 "jsonpath_scan.c"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = (yytext_ptr);
+ int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+
+ yy_current_state = yy_start_state_list[(yy_start)];
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ yy_current_state += yy_current_state[(*yy_cp ? YY_SC_TO_UI(*yy_cp) : 256)].yy_nxt;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ int yy_is_jam;
+
+ int yy_c = 256;
+ const struct yy_trans_info *yy_trans_info;
+
+ yy_trans_info = &yy_current_state[(unsigned int) yy_c];
+ yy_current_state += yy_trans_info->yy_nxt;
+ yy_is_jam = (yy_trans_info->yy_verify != yy_c);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf );
+
+ yyfree( (void *) b );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ *
+ */
+void yyset_lineno (int _line_number )
+{
+
+ yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str )
+{
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str )
+{
+ yyout = _out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug )
+{
+ yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = NULL;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = NULL;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+#define YYTABLES_NAME "yytables"
+
+#line 270 "jsonpath_scan.l"
+
+
+/* LCOV_EXCL_STOP */
+
+void
+jsonpath_yyerror(JsonPathParseResult **result, const char *message)
+{
+ if (*yytext == YY_END_OF_BUFFER_CHAR)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ /* translator: %s is typically "syntax error" */
+ errmsg("%s at end of jsonpath input", _(message))));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ /* translator: first %s is typically "syntax error" */
+ errmsg("%s at or near \"%s\" of jsonpath input",
+ _(message), yytext)));
+ }
+}
+
+typedef struct JsonPathKeyword
+{
+ int16 len;
+ bool lowercase;
+ int val;
+ const char *keyword;
+} JsonPathKeyword;
+
+/*
+ * Array of key words should be sorted by length and then
+ * alphabetical order
+ */
+static const JsonPathKeyword keywords[] = {
+ { 2, false, IS_P, "is"},
+ { 2, false, TO_P, "to"},
+ { 3, false, ABS_P, "abs"},
+ { 3, false, LAX_P, "lax"},
+ { 4, false, FLAG_P, "flag"},
+ { 4, false, LAST_P, "last"},
+ { 4, true, NULL_P, "null"},
+ { 4, false, SIZE_P, "size"},
+ { 4, true, TRUE_P, "true"},
+ { 4, false, TYPE_P, "type"},
+ { 4, false, WITH_P, "with"},
+ { 5, true, FALSE_P, "false"},
+ { 5, false, FLOOR_P, "floor"},
+ { 6, false, DOUBLE_P, "double"},
+ { 6, false, EXISTS_P, "exists"},
+ { 6, false, STARTS_P, "starts"},
+ { 6, false, STRICT_P, "strict"},
+ { 7, false, CEILING_P, "ceiling"},
+ { 7, false, UNKNOWN_P, "unknown"},
+ { 8, false, DATETIME_P, "datetime"},
+ { 8, false, KEYVALUE_P, "keyvalue"},
+ { 10,false, LIKE_REGEX_P, "like_regex"},
+};
+
+/* Check if current scanstring value is a keyword */
+static enum yytokentype
+checkKeyword()
+{
+ int res = IDENT_P;
+ int diff;
+ const JsonPathKeyword *StopLow = keywords,
+ *StopHigh = keywords + lengthof(keywords),
+ *StopMiddle;
+
+ if (scanstring.len > keywords[lengthof(keywords) - 1].len)
+ return res;
+
+ while (StopLow < StopHigh)
+ {
+ StopMiddle = StopLow + ((StopHigh - StopLow) >> 1);
+
+ if (StopMiddle->len == scanstring.len)
+ diff = pg_strncasecmp(StopMiddle->keyword, scanstring.val,
+ scanstring.len);
+ else
+ diff = StopMiddle->len - scanstring.len;
+
+ if (diff < 0)
+ StopLow = StopMiddle + 1;
+ else if (diff > 0)
+ StopHigh = StopMiddle;
+ else
+ {
+ if (StopMiddle->lowercase)
+ diff = strncmp(StopMiddle->keyword, scanstring.val,
+ scanstring.len);
+
+ if (diff == 0)
+ res = StopMiddle->val;
+
+ break;
+ }
+ }
+
+ return res;
+}
+
+/*
+ * Called before any actual parsing is done
+ */
+static void
+jsonpath_scanner_init(const char *str, int slen)
+{
+ if (slen <= 0)
+ slen = strlen(str);
+
+ /*
+ * Might be left over after ereport()
+ */
+ yy_init_globals();
+
+ /*
+ * Make a scan buffer with special termination needed by flex.
+ */
+
+ scanbuflen = slen;
+ scanbuf = palloc(slen + 2);
+ memcpy(scanbuf, str, slen);
+ scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
+ scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);
+
+ BEGIN(INITIAL);
+}
+
+
+/*
+ * Called after parsing is done to clean up after jsonpath_scanner_init()
+ */
+static void
+jsonpath_scanner_finish(void)
+{
+ yy_delete_buffer(scanbufhandle);
+ pfree(scanbuf);
+}
+
+/*
+ * Resize scanstring so that it can append string of given length.
+ * Reinitialize if required.
+ */
+static void
+resizeString(bool init, int appendLen)
+{
+ if (init)
+ {
+ scanstring.total = Max(32, appendLen);
+ scanstring.val = (char *) palloc(scanstring.total);
+ scanstring.len = 0;
+ }
+ else
+ {
+ if (scanstring.len + appendLen >= scanstring.total)
+ {
+ while (scanstring.len + appendLen >= scanstring.total)
+ scanstring.total *= 2;
+ scanstring.val = repalloc(scanstring.val, scanstring.total);
+ }
+ }
+}
+
+/* Add set of bytes at "s" of length "l" to scanstring */
+static void
+addstring(bool init, char *s, int l)
+{
+ resizeString(init, l + 1);
+ memcpy(scanstring.val + scanstring.len, s, l);
+ scanstring.len += l;
+}
+
+/* Add single byte "c" to scanstring */
+static void
+addchar(bool init, char c)
+{
+ resizeString(init, 1);
+ scanstring.val[scanstring.len] = c;
+ if (c != '\0')
+ scanstring.len++;
+}
+
+/* Interface to jsonpath parser */
+JsonPathParseResult *
+parsejsonpath(const char *str, int len)
+{
+ JsonPathParseResult *parseresult;
+
+ jsonpath_scanner_init(str, len);
+
+ if (jsonpath_yyparse((void *) &parseresult) != 0)
+ jsonpath_yyerror(NULL, "bogus input"); /* shouldn't happen */
+
+ jsonpath_scanner_finish();
+
+ return parseresult;
+}
+
+/* Turn hex character into integer */
+static int
+hexval(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 0xA;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 0xA;
+ jsonpath_yyerror(NULL, "invalid hexadecimal digit");
+ return 0; /* not reached */
+}
+
+/* Add given unicode character to scanstring */
+static void
+addUnicodeChar(int ch)
+{
+ if (ch == 0)
+ {
+ /* We can't allow this, since our TEXT type doesn't */
+ ereport(ERROR,
+ (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
+ errmsg("unsupported Unicode escape sequence"),
+ errdetail("\\u0000 cannot be converted to text.")));
+ }
+ else
+ {
+ char cbuf[MAX_UNICODE_EQUIVALENT_STRING + 1];
+
+ pg_unicode_to_server(ch, (unsigned char *) cbuf);
+ addstring(false, cbuf, strlen(cbuf));
+ }
+}
+
+/* Add unicode character, processing any surrogate pairs */
+static void
+addUnicode(int ch, int *hi_surrogate)
+{
+ if (is_utf16_surrogate_first(ch))
+ {
+ if (*hi_surrogate != -1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode high surrogate must not follow "
+ "a high surrogate.")));
+ *hi_surrogate = ch;
+ return;
+ }
+ else if (is_utf16_surrogate_second(ch))
+ {
+ if (*hi_surrogate == -1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ ch = surrogate_pair_to_codepoint(*hi_surrogate, ch);
+ *hi_surrogate = -1;
+ }
+ else if (*hi_surrogate != -1)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ }
+
+ addUnicodeChar(ch);
+}
+
+/*
+ * parseUnicode was adopted from json_lex_string() in
+ * src/backend/utils/adt/json.c
+ */
+static void
+parseUnicode(char *s, int l)
+{
+ int i = 2;
+ int hi_surrogate = -1;
+
+ for (i = 2; i < l; i += 2) /* skip '\u' */
+ {
+ int ch = 0;
+ int j;
+
+ if (s[i] == '{') /* parse '\u{XX...}' */
+ {
+ while (s[++i] != '}' && i < l)
+ ch = (ch << 4) | hexval(s[i]);
+ i++; /* skip '}' */
+ }
+ else /* parse '\uXXXX' */
+ {
+ for (j = 0; j < 4 && i < l; j++)
+ ch = (ch << 4) | hexval(s[i++]);
+ }
+
+ addUnicode(ch, &hi_surrogate);
+ }
+
+ if (hi_surrogate != -1)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ }
+}
+
+/* Parse sequence of hex-encoded characters */
+static void
+parseHexChar(char *s)
+{
+ int ch = (hexval(s[2]) << 4) |
+ hexval(s[3]);
+
+ addUnicodeChar(ch);
+}
+
+/*
+ * Interface functions to make flex use palloc() instead of malloc().
+ * It'd be better to make these static, but flex insists otherwise.
+ */
+
+void *
+jsonpath_yyalloc(yy_size_t bytes)
+{
+ return palloc(bytes);
+}
+
+void *
+jsonpath_yyrealloc(void *ptr, yy_size_t bytes)
+{
+ if (ptr)
+ return repalloc(ptr, bytes);
+ else
+ return palloc(bytes);
+}
+
+void
+jsonpath_yyfree(void *ptr)
+{
+ if (ptr)
+ pfree(ptr);
+}
+
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
new file mode 100644
index 0000000..4351f6e
--- /dev/null
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -0,0 +1,619 @@
+%{
+/*-------------------------------------------------------------------------
+ *
+ * jsonpath_scan.l
+ * Lexical parser for jsonpath datatype
+ *
+ * Splits jsonpath string into tokens represented as JsonPathString structs.
+ * Decodes unicode and hex escaped strings.
+ *
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/jsonpath_scan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "mb/pg_wchar.h"
+#include "nodes/pg_list.h"
+
+static JsonPathString scanstring;
+
+/* Handles to the buffer that the lexer uses internally */
+static YY_BUFFER_STATE scanbufhandle;
+static char *scanbuf;
+static int scanbuflen;
+
+static void addstring(bool init, char *s, int l);
+static void addchar(bool init, char s);
+static enum yytokentype checkKeyword(void);
+static void parseUnicode(char *s, int l);
+static void parseHexChar(char *s);
+
+/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
+#undef fprintf
+#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
+
+static void
+fprintf_to_ereport(const char *fmt, const char *msg)
+{
+ ereport(ERROR, (errmsg_internal("%s", msg)));
+}
+
+/* LCOV_EXCL_START */
+
+%}
+
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="jsonpath_yy"
+%option bison-bridge
+%option noyyalloc
+%option noyyrealloc
+%option noyyfree
+
+/*
+ * We use exclusive states for quoted and non-quoted strings,
+ * quoted variable names and C-style comments.
+ * Exclusive states:
+ * <xq> - quoted strings
+ * <xnq> - non-quoted strings
+ * <xvq> - quoted variable names
+ * <xc> - C-style comment
+ */
+
+%x xq
+%x xnq
+%x xvq
+%x xc
+
+special [\?\%\$\.\[\]\{\}\(\)\|\&\!\=\<\>\@\#\,\*:\-\+\/]
+blank [ \t\n\r\f]
+/* "other" means anything that's not special, blank, or '\' or '"' */
+other [^\?\%\$\.\[\]\{\}\(\)\|\&\!\=\<\>\@\#\,\*:\-\+\/\\\" \t\n\r\f]
+
+digit [0-9]
+integer (0|[1-9]{digit}*)
+decimal ({integer}\.{digit}*|\.{digit}+)
+real ({integer}|{decimal})[Ee][-+]?{digit}+
+realfail ({integer}|{decimal})[Ee][-+]
+
+integer_junk {integer}{other}
+decimal_junk {decimal}{other}
+real_junk {real}{other}
+
+hex_dig [0-9A-Fa-f]
+unicode \\u({hex_dig}{4}|\{{hex_dig}{1,6}\})
+unicodefail \\u({hex_dig}{0,3}|\{{hex_dig}{0,6})
+hex_char \\x{hex_dig}{2}
+hex_fail \\x{hex_dig}{0,1}
+
+%%
+
+<xnq>{other}+ {
+ addstring(false, yytext, yyleng);
+ }
+
+<xnq>{blank}+ {
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+
+<xnq>\/\* {
+ yylval->str = scanstring;
+ BEGIN xc;
+ }
+
+<xnq>({special}|\") {
+ yylval->str = scanstring;
+ yyless(0);
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+
+<xnq><<EOF>> {
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return checkKeyword();
+ }
+
+<xnq,xq,xvq>\\b { addchar(false, '\b'); }
+
+<xnq,xq,xvq>\\f { addchar(false, '\f'); }
+
+<xnq,xq,xvq>\\n { addchar(false, '\n'); }
+
+<xnq,xq,xvq>\\r { addchar(false, '\r'); }
+
+<xnq,xq,xvq>\\t { addchar(false, '\t'); }
+
+<xnq,xq,xvq>\\v { addchar(false, '\v'); }
+
+<xnq,xq,xvq>{unicode}+ { parseUnicode(yytext, yyleng); }
+
+<xnq,xq,xvq>{hex_char} { parseHexChar(yytext); }
+
+<xnq,xq,xvq>{unicode}*{unicodefail} { yyerror(NULL, "invalid unicode sequence"); }
+
+<xnq,xq,xvq>{hex_fail} { yyerror(NULL, "invalid hex character sequence"); }
+
+<xnq,xq,xvq>{unicode}+\\ {
+ /* throw back the \\, and treat as unicode */
+ yyless(yyleng - 1);
+ parseUnicode(yytext, yyleng);
+ }
+
+<xnq,xq,xvq>\\. { addchar(false, yytext[1]); }
+
+<xnq,xq,xvq>\\ { yyerror(NULL, "unexpected end after backslash"); }
+
+<xq,xvq><<EOF>> { yyerror(NULL, "unexpected end of quoted string"); }
+
+<xq>\" {
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return STRING_P;
+ }
+
+<xvq>\" {
+ yylval->str = scanstring;
+ BEGIN INITIAL;
+ return VARIABLE_P;
+ }
+
+<xq,xvq>[^\\\"]+ { addstring(false, yytext, yyleng); }
+
+<xc>\*\/ { BEGIN INITIAL; }
+
+<xc>[^\*]+ { }
+
+<xc>\* { }
+
+<xc><<EOF>> { yyerror(NULL, "unexpected end of comment"); }
+
+\&\& { return AND_P; }
+
+\|\| { return OR_P; }
+
+\! { return NOT_P; }
+
+\*\* { return ANY_P; }
+
+\< { return LESS_P; }
+
+\<\= { return LESSEQUAL_P; }
+
+\=\= { return EQUAL_P; }
+
+\<\> { return NOTEQUAL_P; }
+
+\!\= { return NOTEQUAL_P; }
+
+\>\= { return GREATEREQUAL_P; }
+
+\> { return GREATER_P; }
+
+\${other}+ {
+ addstring(true, yytext + 1, yyleng - 1);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return VARIABLE_P;
+ }
+
+\$\" {
+ addchar(true, '\0');
+ BEGIN xvq;
+ }
+
+{special} { return *yytext; }
+
+{blank}+ { /* ignore */ }
+
+\/\* {
+ addchar(true, '\0');
+ BEGIN xc;
+ }
+
+{real} {
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return NUMERIC_P;
+ }
+
+{decimal} {
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return NUMERIC_P;
+ }
+
+{integer} {
+ addstring(true, yytext, yyleng);
+ addchar(false, '\0');
+ yylval->str = scanstring;
+ return INT_P;
+ }
+
+{realfail} { yyerror(NULL, "invalid numeric literal"); }
+{integer_junk} { yyerror(NULL, "trailing junk after numeric literal"); }
+{decimal_junk} { yyerror(NULL, "trailing junk after numeric literal"); }
+{real_junk} { yyerror(NULL, "trailing junk after numeric literal"); }
+
+\" {
+ addchar(true, '\0');
+ BEGIN xq;
+ }
+
+\\ {
+ yyless(0);
+ addchar(true, '\0');
+ BEGIN xnq;
+ }
+
+{other}+ {
+ addstring(true, yytext, yyleng);
+ BEGIN xnq;
+ }
+
+<<EOF>> { yyterminate(); }
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+void
+jsonpath_yyerror(JsonPathParseResult **result, const char *message)
+{
+ if (*yytext == YY_END_OF_BUFFER_CHAR)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ /* translator: %s is typically "syntax error" */
+ errmsg("%s at end of jsonpath input", _(message))));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ /* translator: first %s is typically "syntax error" */
+ errmsg("%s at or near \"%s\" of jsonpath input",
+ _(message), yytext)));
+ }
+}
+
+typedef struct JsonPathKeyword
+{
+ int16 len;
+ bool lowercase;
+ int val;
+ const char *keyword;
+} JsonPathKeyword;
+
+/*
+ * Array of key words should be sorted by length and then
+ * alphabetical order
+ */
+static const JsonPathKeyword keywords[] = {
+ { 2, false, IS_P, "is"},
+ { 2, false, TO_P, "to"},
+ { 3, false, ABS_P, "abs"},
+ { 3, false, LAX_P, "lax"},
+ { 4, false, FLAG_P, "flag"},
+ { 4, false, LAST_P, "last"},
+ { 4, true, NULL_P, "null"},
+ { 4, false, SIZE_P, "size"},
+ { 4, true, TRUE_P, "true"},
+ { 4, false, TYPE_P, "type"},
+ { 4, false, WITH_P, "with"},
+ { 5, true, FALSE_P, "false"},
+ { 5, false, FLOOR_P, "floor"},
+ { 6, false, DOUBLE_P, "double"},
+ { 6, false, EXISTS_P, "exists"},
+ { 6, false, STARTS_P, "starts"},
+ { 6, false, STRICT_P, "strict"},
+ { 7, false, CEILING_P, "ceiling"},
+ { 7, false, UNKNOWN_P, "unknown"},
+ { 8, false, DATETIME_P, "datetime"},
+ { 8, false, KEYVALUE_P, "keyvalue"},
+ { 10,false, LIKE_REGEX_P, "like_regex"},
+};
+
+/* Check if current scanstring value is a keyword */
+static enum yytokentype
+checkKeyword()
+{
+ int res = IDENT_P;
+ int diff;
+ const JsonPathKeyword *StopLow = keywords,
+ *StopHigh = keywords + lengthof(keywords),
+ *StopMiddle;
+
+ if (scanstring.len > keywords[lengthof(keywords) - 1].len)
+ return res;
+
+ while (StopLow < StopHigh)
+ {
+ StopMiddle = StopLow + ((StopHigh - StopLow) >> 1);
+
+ if (StopMiddle->len == scanstring.len)
+ diff = pg_strncasecmp(StopMiddle->keyword, scanstring.val,
+ scanstring.len);
+ else
+ diff = StopMiddle->len - scanstring.len;
+
+ if (diff < 0)
+ StopLow = StopMiddle + 1;
+ else if (diff > 0)
+ StopHigh = StopMiddle;
+ else
+ {
+ if (StopMiddle->lowercase)
+ diff = strncmp(StopMiddle->keyword, scanstring.val,
+ scanstring.len);
+
+ if (diff == 0)
+ res = StopMiddle->val;
+
+ break;
+ }
+ }
+
+ return res;
+}
+
+/*
+ * Called before any actual parsing is done
+ */
+static void
+jsonpath_scanner_init(const char *str, int slen)
+{
+ if (slen <= 0)
+ slen = strlen(str);
+
+ /*
+ * Might be left over after ereport()
+ */
+ yy_init_globals();
+
+ /*
+ * Make a scan buffer with special termination needed by flex.
+ */
+
+ scanbuflen = slen;
+ scanbuf = palloc(slen + 2);
+ memcpy(scanbuf, str, slen);
+ scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
+ scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);
+
+ BEGIN(INITIAL);
+}
+
+
+/*
+ * Called after parsing is done to clean up after jsonpath_scanner_init()
+ */
+static void
+jsonpath_scanner_finish(void)
+{
+ yy_delete_buffer(scanbufhandle);
+ pfree(scanbuf);
+}
+
+/*
+ * Resize scanstring so that it can append string of given length.
+ * Reinitialize if required.
+ */
+static void
+resizeString(bool init, int appendLen)
+{
+ if (init)
+ {
+ scanstring.total = Max(32, appendLen);
+ scanstring.val = (char *) palloc(scanstring.total);
+ scanstring.len = 0;
+ }
+ else
+ {
+ if (scanstring.len + appendLen >= scanstring.total)
+ {
+ while (scanstring.len + appendLen >= scanstring.total)
+ scanstring.total *= 2;
+ scanstring.val = repalloc(scanstring.val, scanstring.total);
+ }
+ }
+}
+
+/* Add set of bytes at "s" of length "l" to scanstring */
+static void
+addstring(bool init, char *s, int l)
+{
+ resizeString(init, l + 1);
+ memcpy(scanstring.val + scanstring.len, s, l);
+ scanstring.len += l;
+}
+
+/* Add single byte "c" to scanstring */
+static void
+addchar(bool init, char c)
+{
+ resizeString(init, 1);
+ scanstring.val[scanstring.len] = c;
+ if (c != '\0')
+ scanstring.len++;
+}
+
+/* Interface to jsonpath parser */
+JsonPathParseResult *
+parsejsonpath(const char *str, int len)
+{
+ JsonPathParseResult *parseresult;
+
+ jsonpath_scanner_init(str, len);
+
+ if (jsonpath_yyparse((void *) &parseresult) != 0)
+ jsonpath_yyerror(NULL, "bogus input"); /* shouldn't happen */
+
+ jsonpath_scanner_finish();
+
+ return parseresult;
+}
+
+/* Turn hex character into integer */
+static int
+hexval(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 0xA;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 0xA;
+ jsonpath_yyerror(NULL, "invalid hexadecimal digit");
+ return 0; /* not reached */
+}
+
+/* Add given unicode character to scanstring */
+static void
+addUnicodeChar(int ch)
+{
+ if (ch == 0)
+ {
+ /* We can't allow this, since our TEXT type doesn't */
+ ereport(ERROR,
+ (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
+ errmsg("unsupported Unicode escape sequence"),
+ errdetail("\\u0000 cannot be converted to text.")));
+ }
+ else
+ {
+ char cbuf[MAX_UNICODE_EQUIVALENT_STRING + 1];
+
+ pg_unicode_to_server(ch, (unsigned char *) cbuf);
+ addstring(false, cbuf, strlen(cbuf));
+ }
+}
+
+/* Add unicode character, processing any surrogate pairs */
+static void
+addUnicode(int ch, int *hi_surrogate)
+{
+ if (is_utf16_surrogate_first(ch))
+ {
+ if (*hi_surrogate != -1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode high surrogate must not follow "
+ "a high surrogate.")));
+ *hi_surrogate = ch;
+ return;
+ }
+ else if (is_utf16_surrogate_second(ch))
+ {
+ if (*hi_surrogate == -1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ ch = surrogate_pair_to_codepoint(*hi_surrogate, ch);
+ *hi_surrogate = -1;
+ }
+ else if (*hi_surrogate != -1)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ }
+
+ addUnicodeChar(ch);
+}
+
+/*
+ * parseUnicode was adopted from json_lex_string() in
+ * src/backend/utils/adt/json.c
+ */
+static void
+parseUnicode(char *s, int l)
+{
+ int i = 2;
+ int hi_surrogate = -1;
+
+ for (i = 2; i < l; i += 2) /* skip '\u' */
+ {
+ int ch = 0;
+ int j;
+
+ if (s[i] == '{') /* parse '\u{XX...}' */
+ {
+ while (s[++i] != '}' && i < l)
+ ch = (ch << 4) | hexval(s[i]);
+ i++; /* skip '}' */
+ }
+ else /* parse '\uXXXX' */
+ {
+ for (j = 0; j < 4 && i < l; j++)
+ ch = (ch << 4) | hexval(s[i++]);
+ }
+
+ addUnicode(ch, &hi_surrogate);
+ }
+
+ if (hi_surrogate != -1)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "jsonpath"),
+ errdetail("Unicode low surrogate must follow a high "
+ "surrogate.")));
+ }
+}
+
+/* Parse sequence of hex-encoded characters */
+static void
+parseHexChar(char *s)
+{
+ int ch = (hexval(s[2]) << 4) |
+ hexval(s[3]);
+
+ addUnicodeChar(ch);
+}
+
+/*
+ * Interface functions to make flex use palloc() instead of malloc().
+ * It'd be better to make these static, but flex insists otherwise.
+ */
+
+void *
+jsonpath_yyalloc(yy_size_t bytes)
+{
+ return palloc(bytes);
+}
+
+void *
+jsonpath_yyrealloc(void *ptr, yy_size_t bytes)
+{
+ if (ptr)
+ return repalloc(ptr, bytes);
+ else
+ return palloc(bytes);
+}
+
+void
+jsonpath_yyfree(void *ptr)
+{
+ if (ptr)
+ pfree(ptr);
+}
diff --git a/src/backend/utils/adt/levenshtein.c b/src/backend/utils/adt/levenshtein.c
new file mode 100644
index 0000000..3026cc2
--- /dev/null
+++ b/src/backend/utils/adt/levenshtein.c
@@ -0,0 +1,401 @@
+/*-------------------------------------------------------------------------
+ *
+ * levenshtein.c
+ * Levenshtein distance implementation.
+ *
+ * Original author: Joe Conway <mail@joeconway.com>
+ *
+ * This file is included by varlena.c twice, to provide matching code for (1)
+ * Levenshtein distance with custom costings, and (2) Levenshtein distance with
+ * custom costings and a "max" value above which exact distances are not
+ * interesting. Before the inclusion, we rely on the presence of the inline
+ * function rest_of_char_same().
+ *
+ * Written based on a description of the algorithm by Michael Gilleland found
+ * at http://www.merriampark.com/ld.htm. Also looked at levenshtein.c in the
+ * PHP 4.0.6 distribution for inspiration. Configurable penalty costs
+ * extension is introduced by Volkan YAZICI <volkan.yazici@gmail.com.
+ *
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/levenshtein.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#define MAX_LEVENSHTEIN_STRLEN 255
+
+/*
+ * Calculates Levenshtein distance metric between supplied strings, which are
+ * not necessarily null-terminated.
+ *
+ * source: source string, of length slen bytes.
+ * target: target string, of length tlen bytes.
+ * ins_c, del_c, sub_c: costs to charge for character insertion, deletion,
+ * and substitution respectively; (1, 1, 1) costs suffice for common
+ * cases, but your mileage may vary.
+ * max_d: if provided and >= 0, maximum distance we care about; see below.
+ * trusted: caller is trusted and need not obey MAX_LEVENSHTEIN_STRLEN.
+ *
+ * One way to compute Levenshtein distance is to incrementally construct
+ * an (m+1)x(n+1) matrix where cell (i, j) represents the minimum number
+ * of operations required to transform the first i characters of s into
+ * the first j characters of t. The last column of the final row is the
+ * answer.
+ *
+ * We use that algorithm here with some modification. In lieu of holding
+ * the entire array in memory at once, we'll just use two arrays of size
+ * m+1 for storing accumulated values. At each step one array represents
+ * the "previous" row and one is the "current" row of the notional large
+ * array.
+ *
+ * If max_d >= 0, we only need to provide an accurate answer when that answer
+ * is less than or equal to max_d. From any cell in the matrix, there is
+ * theoretical "minimum residual distance" from that cell to the last column
+ * of the final row. This minimum residual distance is zero when the
+ * untransformed portions of the strings are of equal length (because we might
+ * get lucky and find all the remaining characters matching) and is otherwise
+ * based on the minimum number of insertions or deletions needed to make them
+ * equal length. The residual distance grows as we move toward the upper
+ * right or lower left corners of the matrix. When the max_d bound is
+ * usefully tight, we can use this property to avoid computing the entirety
+ * of each row; instead, we maintain a start_column and stop_column that
+ * identify the portion of the matrix close to the diagonal which can still
+ * affect the final answer.
+ */
+int
+#ifdef LEVENSHTEIN_LESS_EQUAL
+varstr_levenshtein_less_equal(const char *source, int slen,
+ const char *target, int tlen,
+ int ins_c, int del_c, int sub_c,
+ int max_d, bool trusted)
+#else
+varstr_levenshtein(const char *source, int slen,
+ const char *target, int tlen,
+ int ins_c, int del_c, int sub_c,
+ bool trusted)
+#endif
+{
+ int m,
+ n;
+ int *prev;
+ int *curr;
+ int *s_char_len = NULL;
+ int i,
+ j;
+ const char *y;
+
+ /*
+ * For varstr_levenshtein_less_equal, we have real variables called
+ * start_column and stop_column; otherwise it's just short-hand for 0 and
+ * m.
+ */
+#ifdef LEVENSHTEIN_LESS_EQUAL
+ int start_column,
+ stop_column;
+
+#undef START_COLUMN
+#undef STOP_COLUMN
+#define START_COLUMN start_column
+#define STOP_COLUMN stop_column
+#else
+#undef START_COLUMN
+#undef STOP_COLUMN
+#define START_COLUMN 0
+#define STOP_COLUMN m
+#endif
+
+ /* Convert string lengths (in bytes) to lengths in characters */
+ m = pg_mbstrlen_with_len(source, slen);
+ n = pg_mbstrlen_with_len(target, tlen);
+
+ /*
+ * We can transform an empty s into t with n insertions, or a non-empty t
+ * into an empty s with m deletions.
+ */
+ if (!m)
+ return n * ins_c;
+ if (!n)
+ return m * del_c;
+
+ /*
+ * For security concerns, restrict excessive CPU+RAM usage. (This
+ * implementation uses O(m) memory and has O(mn) complexity.) If
+ * "trusted" is true, caller is responsible for not making excessive
+ * requests, typically by using a small max_d along with strings that are
+ * bounded, though not necessarily to MAX_LEVENSHTEIN_STRLEN exactly.
+ */
+ if (!trusted &&
+ (m > MAX_LEVENSHTEIN_STRLEN ||
+ n > MAX_LEVENSHTEIN_STRLEN))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("levenshtein argument exceeds maximum length of %d characters",
+ MAX_LEVENSHTEIN_STRLEN)));
+
+#ifdef LEVENSHTEIN_LESS_EQUAL
+ /* Initialize start and stop columns. */
+ start_column = 0;
+ stop_column = m + 1;
+
+ /*
+ * If max_d >= 0, determine whether the bound is impossibly tight. If so,
+ * return max_d + 1 immediately. Otherwise, determine whether it's tight
+ * enough to limit the computation we must perform. If so, figure out
+ * initial stop column.
+ */
+ if (max_d >= 0)
+ {
+ int min_theo_d; /* Theoretical minimum distance. */
+ int max_theo_d; /* Theoretical maximum distance. */
+ int net_inserts = n - m;
+
+ min_theo_d = net_inserts < 0 ?
+ -net_inserts * del_c : net_inserts * ins_c;
+ if (min_theo_d > max_d)
+ return max_d + 1;
+ if (ins_c + del_c < sub_c)
+ sub_c = ins_c + del_c;
+ max_theo_d = min_theo_d + sub_c * Min(m, n);
+ if (max_d >= max_theo_d)
+ max_d = -1;
+ else if (ins_c + del_c > 0)
+ {
+ /*
+ * Figure out how much of the first row of the notional matrix we
+ * need to fill in. If the string is growing, the theoretical
+ * minimum distance already incorporates the cost of deleting the
+ * number of characters necessary to make the two strings equal in
+ * length. Each additional deletion forces another insertion, so
+ * the best-case total cost increases by ins_c + del_c. If the
+ * string is shrinking, the minimum theoretical cost assumes no
+ * excess deletions; that is, we're starting no further right than
+ * column n - m. If we do start further right, the best-case
+ * total cost increases by ins_c + del_c for each move right.
+ */
+ int slack_d = max_d - min_theo_d;
+ int best_column = net_inserts < 0 ? -net_inserts : 0;
+
+ stop_column = best_column + (slack_d / (ins_c + del_c)) + 1;
+ if (stop_column > m)
+ stop_column = m + 1;
+ }
+ }
+#endif
+
+ /*
+ * In order to avoid calling pg_mblen() repeatedly on each character in s,
+ * we cache all the lengths before starting the main loop -- but if all
+ * the characters in both strings are single byte, then we skip this and
+ * use a fast-path in the main loop. If only one string contains
+ * multi-byte characters, we still build the array, so that the fast-path
+ * needn't deal with the case where the array hasn't been initialized.
+ */
+ if (m != slen || n != tlen)
+ {
+ int i;
+ const char *cp = source;
+
+ s_char_len = (int *) palloc((m + 1) * sizeof(int));
+ for (i = 0; i < m; ++i)
+ {
+ s_char_len[i] = pg_mblen(cp);
+ cp += s_char_len[i];
+ }
+ s_char_len[i] = 0;
+ }
+
+ /* One more cell for initialization column and row. */
+ ++m;
+ ++n;
+
+ /* Previous and current rows of notional array. */
+ prev = (int *) palloc(2 * m * sizeof(int));
+ curr = prev + m;
+
+ /*
+ * To transform the first i characters of s into the first 0 characters of
+ * t, we must perform i deletions.
+ */
+ for (i = START_COLUMN; i < STOP_COLUMN; i++)
+ prev[i] = i * del_c;
+
+ /* Loop through rows of the notional array */
+ for (y = target, j = 1; j < n; j++)
+ {
+ int *temp;
+ const char *x = source;
+ int y_char_len = n != tlen + 1 ? pg_mblen(y) : 1;
+
+#ifdef LEVENSHTEIN_LESS_EQUAL
+
+ /*
+ * In the best case, values percolate down the diagonal unchanged, so
+ * we must increment stop_column unless it's already on the right end
+ * of the array. The inner loop will read prev[stop_column], so we
+ * have to initialize it even though it shouldn't affect the result.
+ */
+ if (stop_column < m)
+ {
+ prev[stop_column] = max_d + 1;
+ ++stop_column;
+ }
+
+ /*
+ * The main loop fills in curr, but curr[0] needs a special case: to
+ * transform the first 0 characters of s into the first j characters
+ * of t, we must perform j insertions. However, if start_column > 0,
+ * this special case does not apply.
+ */
+ if (start_column == 0)
+ {
+ curr[0] = j * ins_c;
+ i = 1;
+ }
+ else
+ i = start_column;
+#else
+ curr[0] = j * ins_c;
+ i = 1;
+#endif
+
+ /*
+ * This inner loop is critical to performance, so we include a
+ * fast-path to handle the (fairly common) case where no multibyte
+ * characters are in the mix. The fast-path is entitled to assume
+ * that if s_char_len is not initialized then BOTH strings contain
+ * only single-byte characters.
+ */
+ if (s_char_len != NULL)
+ {
+ for (; i < STOP_COLUMN; i++)
+ {
+ int ins;
+ int del;
+ int sub;
+ int x_char_len = s_char_len[i - 1];
+
+ /*
+ * Calculate costs for insertion, deletion, and substitution.
+ *
+ * When calculating cost for substitution, we compare the last
+ * character of each possibly-multibyte character first,
+ * because that's enough to rule out most mis-matches. If we
+ * get past that test, then we compare the lengths and the
+ * remaining bytes.
+ */
+ ins = prev[i] + ins_c;
+ del = curr[i - 1] + del_c;
+ if (x[x_char_len - 1] == y[y_char_len - 1]
+ && x_char_len == y_char_len &&
+ (x_char_len == 1 || rest_of_char_same(x, y, x_char_len)))
+ sub = prev[i - 1];
+ else
+ sub = prev[i - 1] + sub_c;
+
+ /* Take the one with minimum cost. */
+ curr[i] = Min(ins, del);
+ curr[i] = Min(curr[i], sub);
+
+ /* Point to next character. */
+ x += x_char_len;
+ }
+ }
+ else
+ {
+ for (; i < STOP_COLUMN; i++)
+ {
+ int ins;
+ int del;
+ int sub;
+
+ /* Calculate costs for insertion, deletion, and substitution. */
+ ins = prev[i] + ins_c;
+ del = curr[i - 1] + del_c;
+ sub = prev[i - 1] + ((*x == *y) ? 0 : sub_c);
+
+ /* Take the one with minimum cost. */
+ curr[i] = Min(ins, del);
+ curr[i] = Min(curr[i], sub);
+
+ /* Point to next character. */
+ x++;
+ }
+ }
+
+ /* Swap current row with previous row. */
+ temp = curr;
+ curr = prev;
+ prev = temp;
+
+ /* Point to next character. */
+ y += y_char_len;
+
+#ifdef LEVENSHTEIN_LESS_EQUAL
+
+ /*
+ * This chunk of code represents a significant performance hit if used
+ * in the case where there is no max_d bound. This is probably not
+ * because the max_d >= 0 test itself is expensive, but rather because
+ * the possibility of needing to execute this code prevents tight
+ * optimization of the loop as a whole.
+ */
+ if (max_d >= 0)
+ {
+ /*
+ * The "zero point" is the column of the current row where the
+ * remaining portions of the strings are of equal length. There
+ * are (n - 1) characters in the target string, of which j have
+ * been transformed. There are (m - 1) characters in the source
+ * string, so we want to find the value for zp where (n - 1) - j =
+ * (m - 1) - zp.
+ */
+ int zp = j - (n - m);
+
+ /* Check whether the stop column can slide left. */
+ while (stop_column > 0)
+ {
+ int ii = stop_column - 1;
+ int net_inserts = ii - zp;
+
+ if (prev[ii] + (net_inserts > 0 ? net_inserts * ins_c :
+ -net_inserts * del_c) <= max_d)
+ break;
+ stop_column--;
+ }
+
+ /* Check whether the start column can slide right. */
+ while (start_column < stop_column)
+ {
+ int net_inserts = start_column - zp;
+
+ if (prev[start_column] +
+ (net_inserts > 0 ? net_inserts * ins_c :
+ -net_inserts * del_c) <= max_d)
+ break;
+
+ /*
+ * We'll never again update these values, so we must make sure
+ * there's nothing here that could confuse any future
+ * iteration of the outer loop.
+ */
+ prev[start_column] = max_d + 1;
+ curr[start_column] = max_d + 1;
+ if (start_column != 0)
+ source += (s_char_len != NULL) ? s_char_len[start_column - 1] : 1;
+ start_column++;
+ }
+
+ /* If they cross, we're going to exceed the bound. */
+ if (start_column >= stop_column)
+ return max_d + 1;
+ }
+#endif
+ }
+
+ /*
+ * Because the final value was swapped from the previous row to the
+ * current row, that's where we'll find it.
+ */
+ return prev[m - 1];
+}
diff --git a/src/backend/utils/adt/like.c b/src/backend/utils/adt/like.c
new file mode 100644
index 0000000..e02fc37
--- /dev/null
+++ b/src/backend/utils/adt/like.c
@@ -0,0 +1,455 @@
+/*-------------------------------------------------------------------------
+ *
+ * like.c
+ * like expression handling code.
+ *
+ * NOTES
+ * A big hack of the regexp.c code!! Contributed by
+ * Keith Parks <emkxp01@mtcc.demon.co.uk> (7/95).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/like.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_collation.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/pg_locale.h"
+
+
+#define LIKE_TRUE 1
+#define LIKE_FALSE 0
+#define LIKE_ABORT (-1)
+
+
+static int SB_MatchText(const char *t, int tlen, const char *p, int plen,
+ pg_locale_t locale, bool locale_is_c);
+static text *SB_do_like_escape(text *, text *);
+
+static int MB_MatchText(const char *t, int tlen, const char *p, int plen,
+ pg_locale_t locale, bool locale_is_c);
+static text *MB_do_like_escape(text *, text *);
+
+static int UTF8_MatchText(const char *t, int tlen, const char *p, int plen,
+ pg_locale_t locale, bool locale_is_c);
+
+static int SB_IMatchText(const char *t, int tlen, const char *p, int plen,
+ pg_locale_t locale, bool locale_is_c);
+
+static int GenericMatchText(const char *s, int slen, const char *p, int plen, Oid collation);
+static int Generic_Text_IC_like(text *str, text *pat, Oid collation);
+
+/*--------------------
+ * Support routine for MatchText. Compares given multibyte streams
+ * as wide characters. If they match, returns 1 otherwise returns 0.
+ *--------------------
+ */
+static inline int
+wchareq(const char *p1, const char *p2)
+{
+ int p1_len;
+
+ /* Optimization: quickly compare the first byte. */
+ if (*p1 != *p2)
+ return 0;
+
+ p1_len = pg_mblen(p1);
+ if (pg_mblen(p2) != p1_len)
+ return 0;
+
+ /* They are the same length */
+ while (p1_len--)
+ {
+ if (*p1++ != *p2++)
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ * Formerly we had a routine iwchareq() here that tried to do case-insensitive
+ * comparison of multibyte characters. It did not work at all, however,
+ * because it relied on tolower() which has a single-byte API ... and
+ * towlower() wouldn't be much better since we have no suitably cheap way
+ * of getting a single character transformed to the system's wchar_t format.
+ * So now, we just downcase the strings using lower() and apply regular LIKE
+ * comparison. This should be revisited when we install better locale support.
+ */
+
+/*
+ * We do handle case-insensitive matching for single-byte encodings using
+ * fold-on-the-fly processing, however.
+ */
+static char
+SB_lower_char(unsigned char c, pg_locale_t locale, bool locale_is_c)
+{
+ if (locale_is_c)
+ return pg_ascii_tolower(c);
+#ifdef HAVE_LOCALE_T
+ else if (locale)
+ return tolower_l(c, locale->info.lt);
+#endif
+ else
+ return pg_tolower(c);
+}
+
+
+#define NextByte(p, plen) ((p)++, (plen)--)
+
+/* Set up to compile like_match.c for multibyte characters */
+#define CHAREQ(p1, p2) wchareq((p1), (p2))
+#define NextChar(p, plen) \
+ do { int __l = pg_mblen(p); (p) +=__l; (plen) -=__l; } while (0)
+#define CopyAdvChar(dst, src, srclen) \
+ do { int __l = pg_mblen(src); \
+ (srclen) -= __l; \
+ while (__l-- > 0) \
+ *(dst)++ = *(src)++; \
+ } while (0)
+
+#define MatchText MB_MatchText
+#define do_like_escape MB_do_like_escape
+
+#include "like_match.c"
+
+/* Set up to compile like_match.c for single-byte characters */
+#define CHAREQ(p1, p2) (*(p1) == *(p2))
+#define NextChar(p, plen) NextByte((p), (plen))
+#define CopyAdvChar(dst, src, srclen) (*(dst)++ = *(src)++, (srclen)--)
+
+#define MatchText SB_MatchText
+#define do_like_escape SB_do_like_escape
+
+#include "like_match.c"
+
+/* setup to compile like_match.c for single byte case insensitive matches */
+#define MATCH_LOWER(t) SB_lower_char((unsigned char) (t), locale, locale_is_c)
+#define NextChar(p, plen) NextByte((p), (plen))
+#define MatchText SB_IMatchText
+
+#include "like_match.c"
+
+/* setup to compile like_match.c for UTF8 encoding, using fast NextChar */
+
+#define NextChar(p, plen) \
+ do { (p)++; (plen)--; } while ((plen) > 0 && (*(p) & 0xC0) == 0x80 )
+#define MatchText UTF8_MatchText
+
+#include "like_match.c"
+
+/* Generic for all cases not requiring inline case-folding */
+static inline int
+GenericMatchText(const char *s, int slen, const char *p, int plen, Oid collation)
+{
+ if (collation && !lc_ctype_is_c(collation))
+ {
+ pg_locale_t locale = pg_newlocale_from_collation(collation);
+
+ if (locale && !locale->deterministic)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("nondeterministic collations are not supported for LIKE")));
+ }
+
+ if (pg_database_encoding_max_length() == 1)
+ return SB_MatchText(s, slen, p, plen, 0, true);
+ else if (GetDatabaseEncoding() == PG_UTF8)
+ return UTF8_MatchText(s, slen, p, plen, 0, true);
+ else
+ return MB_MatchText(s, slen, p, plen, 0, true);
+}
+
+static inline int
+Generic_Text_IC_like(text *str, text *pat, Oid collation)
+{
+ char *s,
+ *p;
+ int slen,
+ plen;
+ pg_locale_t locale = 0;
+ bool locale_is_c = false;
+
+ if (!OidIsValid(collation))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for ILIKE"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+
+ if (lc_ctype_is_c(collation))
+ locale_is_c = true;
+ else
+ locale = pg_newlocale_from_collation(collation);
+
+ if (locale && !locale->deterministic)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("nondeterministic collations are not supported for ILIKE")));
+
+ /*
+ * For efficiency reasons, in the single byte case we don't call lower()
+ * on the pattern and text, but instead call SB_lower_char on each
+ * character. In the multi-byte case we don't have much choice :-(. Also,
+ * ICU does not support single-character case folding, so we go the long
+ * way.
+ */
+
+ if (pg_database_encoding_max_length() > 1 || (locale && locale->provider == COLLPROVIDER_ICU))
+ {
+ pat = DatumGetTextPP(DirectFunctionCall1Coll(lower, collation,
+ PointerGetDatum(pat)));
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+ str = DatumGetTextPP(DirectFunctionCall1Coll(lower, collation,
+ PointerGetDatum(str)));
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ if (GetDatabaseEncoding() == PG_UTF8)
+ return UTF8_MatchText(s, slen, p, plen, 0, true);
+ else
+ return MB_MatchText(s, slen, p, plen, 0, true);
+ }
+ else
+ {
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ return SB_IMatchText(s, slen, p, plen, locale, locale_is_c);
+ }
+}
+
+/*
+ * interface routines called by the function manager
+ */
+
+Datum
+namelike(PG_FUNCTION_ARGS)
+{
+ Name str = PG_GETARG_NAME(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = NameStr(*str);
+ slen = strlen(s);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (GenericMatchText(s, slen, p, plen, PG_GET_COLLATION()) == LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+namenlike(PG_FUNCTION_ARGS)
+{
+ Name str = PG_GETARG_NAME(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = NameStr(*str);
+ slen = strlen(s);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (GenericMatchText(s, slen, p, plen, PG_GET_COLLATION()) != LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+textlike(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (GenericMatchText(s, slen, p, plen, PG_GET_COLLATION()) == LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+textnlike(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (GenericMatchText(s, slen, p, plen, PG_GET_COLLATION()) != LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bytealike(PG_FUNCTION_ARGS)
+{
+ bytea *str = PG_GETARG_BYTEA_PP(0);
+ bytea *pat = PG_GETARG_BYTEA_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (SB_MatchText(s, slen, p, plen, 0, true) == LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+byteanlike(PG_FUNCTION_ARGS)
+{
+ bytea *str = PG_GETARG_BYTEA_PP(0);
+ bytea *pat = PG_GETARG_BYTEA_PP(1);
+ bool result;
+ char *s,
+ *p;
+ int slen,
+ plen;
+
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+
+ result = (SB_MatchText(s, slen, p, plen, 0, true) != LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * Case-insensitive versions
+ */
+
+Datum
+nameiclike(PG_FUNCTION_ARGS)
+{
+ Name str = PG_GETARG_NAME(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ text *strtext;
+
+ strtext = DatumGetTextPP(DirectFunctionCall1(name_text,
+ NameGetDatum(str)));
+ result = (Generic_Text_IC_like(strtext, pat, PG_GET_COLLATION()) == LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+nameicnlike(PG_FUNCTION_ARGS)
+{
+ Name str = PG_GETARG_NAME(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+ text *strtext;
+
+ strtext = DatumGetTextPP(DirectFunctionCall1(name_text,
+ NameGetDatum(str)));
+ result = (Generic_Text_IC_like(strtext, pat, PG_GET_COLLATION()) != LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+texticlike(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (Generic_Text_IC_like(str, pat, PG_GET_COLLATION()) == LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+texticnlike(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pat = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (Generic_Text_IC_like(str, pat, PG_GET_COLLATION()) != LIKE_TRUE);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * like_escape() --- given a pattern and an ESCAPE string,
+ * convert the pattern to use Postgres' standard backslash escape convention.
+ */
+Datum
+like_escape(PG_FUNCTION_ARGS)
+{
+ text *pat = PG_GETARG_TEXT_PP(0);
+ text *esc = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ if (pg_database_encoding_max_length() == 1)
+ result = SB_do_like_escape(pat, esc);
+ else
+ result = MB_do_like_escape(pat, esc);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * like_escape_bytea() --- given a pattern and an ESCAPE string,
+ * convert the pattern to use Postgres' standard backslash escape convention.
+ */
+Datum
+like_escape_bytea(PG_FUNCTION_ARGS)
+{
+ bytea *pat = PG_GETARG_BYTEA_PP(0);
+ bytea *esc = PG_GETARG_BYTEA_PP(1);
+ bytea *result = SB_do_like_escape((text *) pat, (text *) esc);
+
+ PG_RETURN_BYTEA_P((bytea *) result);
+}
diff --git a/src/backend/utils/adt/like_match.c b/src/backend/utils/adt/like_match.c
new file mode 100644
index 0000000..e876560
--- /dev/null
+++ b/src/backend/utils/adt/like_match.c
@@ -0,0 +1,360 @@
+/*-------------------------------------------------------------------------
+ *
+ * like_match.c
+ * LIKE pattern matching internal code.
+ *
+ * This file is included by like.c four times, to provide matching code for
+ * (1) single-byte encodings, (2) UTF8, (3) other multi-byte encodings,
+ * and (4) case insensitive matches in single-byte encodings.
+ * (UTF8 is a special case because we can use a much more efficient version
+ * of NextChar than can be used for general multi-byte encodings.)
+ *
+ * Before the inclusion, we need to define the following macros:
+ *
+ * NextChar
+ * MatchText - to name of function wanted
+ * do_like_escape - name of function if wanted - needs CHAREQ and CopyAdvChar
+ * MATCH_LOWER - define for case (4) to specify case folding for 1-byte chars
+ *
+ * Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/like_match.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Originally written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986.
+ * Rich $alz is now <rsalz@bbn.com>.
+ * Special thanks to Lars Mathiesen <thorinn@diku.dk> for the
+ * LIKE_ABORT code.
+ *
+ * This code was shamelessly stolen from the "pql" code by myself and
+ * slightly modified :)
+ *
+ * All references to the word "star" were replaced by "percent"
+ * All references to the word "wild" were replaced by "like"
+ *
+ * All the nice shell RE matching stuff was replaced by just "_" and "%"
+ *
+ * As I don't have a copy of the SQL standard handy I wasn't sure whether
+ * to leave in the '\' escape character handling.
+ *
+ * Keith Parks. <keith@mtcc.demon.co.uk>
+ *
+ * SQL lets you specify the escape character by saying
+ * LIKE <pattern> ESCAPE <escape character>. We are a small operation
+ * so we force you to use '\'. - ay 7/95
+ *
+ * Now we have the like_escape() function that converts patterns with
+ * any specified escape character (or none at all) to the internal
+ * default escape character, which is still '\'. - tgl 9/2000
+ *
+ * The code is rewritten to avoid requiring null-terminated strings,
+ * which in turn allows us to leave out some memcpy() operations.
+ * This code should be faster and take less memory, but no promises...
+ * - thomas 2000-08-06
+ */
+
+
+/*--------------------
+ * Match text and pattern, return LIKE_TRUE, LIKE_FALSE, or LIKE_ABORT.
+ *
+ * LIKE_TRUE: they match
+ * LIKE_FALSE: they don't match
+ * LIKE_ABORT: not only don't they match, but the text is too short.
+ *
+ * If LIKE_ABORT is returned, then no suffix of the text can match the
+ * pattern either, so an upper-level % scan can stop scanning now.
+ *--------------------
+ */
+
+#ifdef MATCH_LOWER
+#define GETCHAR(t) MATCH_LOWER(t)
+#else
+#define GETCHAR(t) (t)
+#endif
+
+static int
+MatchText(const char *t, int tlen, const char *p, int plen,
+ pg_locale_t locale, bool locale_is_c)
+{
+ /* Fast path for match-everything pattern */
+ if (plen == 1 && *p == '%')
+ return LIKE_TRUE;
+
+ /* Since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ /*
+ * In this loop, we advance by char when matching wildcards (and thus on
+ * recursive entry to this function we are properly char-synced). On other
+ * occasions it is safe to advance by byte, as the text and pattern will
+ * be in lockstep. This allows us to perform all comparisons between the
+ * text and pattern on a byte by byte basis, even for multi-byte
+ * encodings.
+ */
+ while (tlen > 0 && plen > 0)
+ {
+ if (*p == '\\')
+ {
+ /* Next pattern byte must match literally, whatever it is */
+ NextByte(p, plen);
+ /* ... and there had better be one, per SQL standard */
+ if (plen <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
+ errmsg("LIKE pattern must not end with escape character")));
+ if (GETCHAR(*p) != GETCHAR(*t))
+ return LIKE_FALSE;
+ }
+ else if (*p == '%')
+ {
+ char firstpat;
+
+ /*
+ * % processing is essentially a search for a text position at
+ * which the remainder of the text matches the remainder of the
+ * pattern, using a recursive call to check each potential match.
+ *
+ * If there are wildcards immediately following the %, we can skip
+ * over them first, using the idea that any sequence of N _'s and
+ * one or more %'s is equivalent to N _'s and one % (ie, it will
+ * match any sequence of at least N text characters). In this way
+ * we will always run the recursive search loop using a pattern
+ * fragment that begins with a literal character-to-match, thereby
+ * not recursing more than we have to.
+ */
+ NextByte(p, plen);
+
+ while (plen > 0)
+ {
+ if (*p == '%')
+ NextByte(p, plen);
+ else if (*p == '_')
+ {
+ /* If not enough text left to match the pattern, ABORT */
+ if (tlen <= 0)
+ return LIKE_ABORT;
+ NextChar(t, tlen);
+ NextByte(p, plen);
+ }
+ else
+ break; /* Reached a non-wildcard pattern char */
+ }
+
+ /*
+ * If we're at end of pattern, match: we have a trailing % which
+ * matches any remaining text string.
+ */
+ if (plen <= 0)
+ return LIKE_TRUE;
+
+ /*
+ * Otherwise, scan for a text position at which we can match the
+ * rest of the pattern. The first remaining pattern char is known
+ * to be a regular or escaped literal character, so we can compare
+ * the first pattern byte to each text byte to avoid recursing
+ * more than we have to. This fact also guarantees that we don't
+ * have to consider a match to the zero-length substring at the
+ * end of the text.
+ */
+ if (*p == '\\')
+ {
+ if (plen < 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
+ errmsg("LIKE pattern must not end with escape character")));
+ firstpat = GETCHAR(p[1]);
+ }
+ else
+ firstpat = GETCHAR(*p);
+
+ while (tlen > 0)
+ {
+ if (GETCHAR(*t) == firstpat)
+ {
+ int matched = MatchText(t, tlen, p, plen,
+ locale, locale_is_c);
+
+ if (matched != LIKE_FALSE)
+ return matched; /* TRUE or ABORT */
+ }
+
+ NextChar(t, tlen);
+ }
+
+ /*
+ * End of text with no match, so no point in trying later places
+ * to start matching this pattern.
+ */
+ return LIKE_ABORT;
+ }
+ else if (*p == '_')
+ {
+ /* _ matches any single character, and we know there is one */
+ NextChar(t, tlen);
+ NextByte(p, plen);
+ continue;
+ }
+ else if (GETCHAR(*p) != GETCHAR(*t))
+ {
+ /* non-wildcard pattern char fails to match text char */
+ return LIKE_FALSE;
+ }
+
+ /*
+ * Pattern and text match, so advance.
+ *
+ * It is safe to use NextByte instead of NextChar here, even for
+ * multi-byte character sets, because we are not following immediately
+ * after a wildcard character. If we are in the middle of a multibyte
+ * character, we must already have matched at least one byte of the
+ * character from both text and pattern; so we cannot get out-of-sync
+ * on character boundaries. And we know that no backend-legal
+ * encoding allows ASCII characters such as '%' to appear as non-first
+ * bytes of characters, so we won't mistakenly detect a new wildcard.
+ */
+ NextByte(t, tlen);
+ NextByte(p, plen);
+ }
+
+ if (tlen > 0)
+ return LIKE_FALSE; /* end of pattern, but not of text */
+
+ /*
+ * End of text, but perhaps not of pattern. Match iff the remaining
+ * pattern can match a zero-length string, ie, it's zero or more %'s.
+ */
+ while (plen > 0 && *p == '%')
+ NextByte(p, plen);
+ if (plen <= 0)
+ return LIKE_TRUE;
+
+ /*
+ * End of text with no match, so no point in trying later places to start
+ * matching this pattern.
+ */
+ return LIKE_ABORT;
+} /* MatchText() */
+
+/*
+ * like_escape() --- given a pattern and an ESCAPE string,
+ * convert the pattern to use Postgres' standard backslash escape convention.
+ */
+#ifdef do_like_escape
+
+static text *
+do_like_escape(text *pat, text *esc)
+{
+ text *result;
+ char *p,
+ *e,
+ *r;
+ int plen,
+ elen;
+ bool afterescape;
+
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+ e = VARDATA_ANY(esc);
+ elen = VARSIZE_ANY_EXHDR(esc);
+
+ /*
+ * Worst-case pattern growth is 2x --- unlikely, but it's hardly worth
+ * trying to calculate the size more accurately than that.
+ */
+ result = (text *) palloc(plen * 2 + VARHDRSZ);
+ r = VARDATA(result);
+
+ if (elen == 0)
+ {
+ /*
+ * No escape character is wanted. Double any backslashes in the
+ * pattern to make them act like ordinary characters.
+ */
+ while (plen > 0)
+ {
+ if (*p == '\\')
+ *r++ = '\\';
+ CopyAdvChar(r, p, plen);
+ }
+ }
+ else
+ {
+ /*
+ * The specified escape must be only a single character.
+ */
+ NextChar(e, elen);
+ if (elen != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
+ errmsg("invalid escape string"),
+ errhint("Escape string must be empty or one character.")));
+
+ e = VARDATA_ANY(esc);
+
+ /*
+ * If specified escape is '\', just copy the pattern as-is.
+ */
+ if (*e == '\\')
+ {
+ memcpy(result, pat, VARSIZE_ANY(pat));
+ return result;
+ }
+
+ /*
+ * Otherwise, convert occurrences of the specified escape character to
+ * '\', and double occurrences of '\' --- unless they immediately
+ * follow an escape character!
+ */
+ afterescape = false;
+ while (plen > 0)
+ {
+ if (CHAREQ(p, e) && !afterescape)
+ {
+ *r++ = '\\';
+ NextChar(p, plen);
+ afterescape = true;
+ }
+ else if (*p == '\\')
+ {
+ *r++ = '\\';
+ if (!afterescape)
+ *r++ = '\\';
+ NextChar(p, plen);
+ afterescape = false;
+ }
+ else
+ {
+ CopyAdvChar(r, p, plen);
+ afterescape = false;
+ }
+ }
+ }
+
+ SET_VARSIZE(result, r - ((char *) result));
+
+ return result;
+}
+#endif /* do_like_escape */
+
+#ifdef CHAREQ
+#undef CHAREQ
+#endif
+
+#undef NextChar
+#undef CopyAdvChar
+#undef MatchText
+
+#ifdef do_like_escape
+#undef do_like_escape
+#endif
+
+#undef GETCHAR
+
+#ifdef MATCH_LOWER
+#undef MATCH_LOWER
+
+#endif
diff --git a/src/backend/utils/adt/like_support.c b/src/backend/utils/adt/like_support.c
new file mode 100644
index 0000000..2d3aaaa
--- /dev/null
+++ b/src/backend/utils/adt/like_support.c
@@ -0,0 +1,1800 @@
+/*-------------------------------------------------------------------------
+ *
+ * like_support.c
+ * Planner support functions for LIKE, regex, and related operators.
+ *
+ * These routines handle special optimization of operators that can be
+ * used with index scans even though they are not known to the executor's
+ * indexscan machinery. The key idea is that these operators allow us
+ * to derive approximate indexscan qual clauses, such that any tuples
+ * that pass the operator clause itself must also satisfy the simpler
+ * indexscan condition(s). Then we can use the indexscan machinery
+ * to avoid scanning as much of the table as we'd otherwise have to,
+ * while applying the original operator as a qpqual condition to ensure
+ * we deliver only the tuples we want. (In essence, we're using a regular
+ * index as if it were a lossy index.)
+ *
+ * An example of what we're doing is
+ * textfield LIKE 'abc%def'
+ * from which we can generate the indexscanable conditions
+ * textfield >= 'abc' AND textfield < 'abd'
+ * which allow efficient scanning of an index on textfield.
+ * (In reality, character set and collation issues make the transformation
+ * from LIKE to indexscan limits rather harder than one might think ...
+ * but that's the basic idea.)
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/like_support.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "access/stratnum.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_opfamily.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_type.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/lsyscache.h"
+#include "utils/pg_locale.h"
+#include "utils/selfuncs.h"
+#include "utils/varlena.h"
+
+
+typedef enum
+{
+ Pattern_Type_Like,
+ Pattern_Type_Like_IC,
+ Pattern_Type_Regex,
+ Pattern_Type_Regex_IC,
+ Pattern_Type_Prefix
+} Pattern_Type;
+
+typedef enum
+{
+ Pattern_Prefix_None, Pattern_Prefix_Partial, Pattern_Prefix_Exact
+} Pattern_Prefix_Status;
+
+static Node *like_regex_support(Node *rawreq, Pattern_Type ptype);
+static List *match_pattern_prefix(Node *leftop,
+ Node *rightop,
+ Pattern_Type ptype,
+ Oid expr_coll,
+ Oid opfamily,
+ Oid indexcollation);
+static double patternsel_common(PlannerInfo *root,
+ Oid oprid,
+ Oid opfuncid,
+ List *args,
+ int varRelid,
+ Oid collation,
+ Pattern_Type ptype,
+ bool negate);
+static Pattern_Prefix_Status pattern_fixed_prefix(Const *patt,
+ Pattern_Type ptype,
+ Oid collation,
+ Const **prefix,
+ Selectivity *rest_selec);
+static Selectivity prefix_selectivity(PlannerInfo *root,
+ VariableStatData *vardata,
+ Oid eqopr, Oid ltopr, Oid geopr,
+ Oid collation,
+ Const *prefixcon);
+static Selectivity like_selectivity(const char *patt, int pattlen,
+ bool case_insensitive);
+static Selectivity regex_selectivity(const char *patt, int pattlen,
+ bool case_insensitive,
+ int fixed_prefix_len);
+static int pattern_char_isalpha(char c, bool is_multibyte,
+ pg_locale_t locale, bool locale_is_c);
+static Const *make_greater_string(const Const *str_const, FmgrInfo *ltproc,
+ Oid collation);
+static Datum string_to_datum(const char *str, Oid datatype);
+static Const *string_to_const(const char *str, Oid datatype);
+static Const *string_to_bytea_const(const char *str, size_t str_len);
+
+
+/*
+ * Planner support functions for LIKE, regex, and related operators
+ */
+Datum
+textlike_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ PG_RETURN_POINTER(like_regex_support(rawreq, Pattern_Type_Like));
+}
+
+Datum
+texticlike_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ PG_RETURN_POINTER(like_regex_support(rawreq, Pattern_Type_Like_IC));
+}
+
+Datum
+textregexeq_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ PG_RETURN_POINTER(like_regex_support(rawreq, Pattern_Type_Regex));
+}
+
+Datum
+texticregexeq_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ PG_RETURN_POINTER(like_regex_support(rawreq, Pattern_Type_Regex_IC));
+}
+
+Datum
+text_starts_with_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ PG_RETURN_POINTER(like_regex_support(rawreq, Pattern_Type_Prefix));
+}
+
+/* Common code for the above */
+static Node *
+like_regex_support(Node *rawreq, Pattern_Type ptype)
+{
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSelectivity))
+ {
+ /*
+ * Make a selectivity estimate for a function call, just as we'd do if
+ * the call was via the corresponding operator.
+ */
+ SupportRequestSelectivity *req = (SupportRequestSelectivity *) rawreq;
+ Selectivity s1;
+
+ if (req->is_join)
+ {
+ /*
+ * For the moment we just punt. If patternjoinsel is ever
+ * improved to do better, this should be made to call it.
+ */
+ s1 = DEFAULT_MATCH_SEL;
+ }
+ else
+ {
+ /* Share code with operator restriction selectivity functions */
+ s1 = patternsel_common(req->root,
+ InvalidOid,
+ req->funcid,
+ req->args,
+ req->varRelid,
+ req->inputcollid,
+ ptype,
+ false);
+ }
+ req->selectivity = s1;
+ ret = (Node *) req;
+ }
+ else if (IsA(rawreq, SupportRequestIndexCondition))
+ {
+ /* Try to convert operator/function call to index conditions */
+ SupportRequestIndexCondition *req = (SupportRequestIndexCondition *) rawreq;
+
+ /*
+ * Currently we have no "reverse" match operators with the pattern on
+ * the left, so we only need consider cases with the indexkey on the
+ * left.
+ */
+ if (req->indexarg != 0)
+ return NULL;
+
+ if (is_opclause(req->node))
+ {
+ OpExpr *clause = (OpExpr *) req->node;
+
+ Assert(list_length(clause->args) == 2);
+ ret = (Node *)
+ match_pattern_prefix((Node *) linitial(clause->args),
+ (Node *) lsecond(clause->args),
+ ptype,
+ clause->inputcollid,
+ req->opfamily,
+ req->indexcollation);
+ }
+ else if (is_funcclause(req->node)) /* be paranoid */
+ {
+ FuncExpr *clause = (FuncExpr *) req->node;
+
+ Assert(list_length(clause->args) == 2);
+ ret = (Node *)
+ match_pattern_prefix((Node *) linitial(clause->args),
+ (Node *) lsecond(clause->args),
+ ptype,
+ clause->inputcollid,
+ req->opfamily,
+ req->indexcollation);
+ }
+ }
+
+ return ret;
+}
+
+/*
+ * match_pattern_prefix
+ * Try to generate an indexqual for a LIKE or regex operator.
+ */
+static List *
+match_pattern_prefix(Node *leftop,
+ Node *rightop,
+ Pattern_Type ptype,
+ Oid expr_coll,
+ Oid opfamily,
+ Oid indexcollation)
+{
+ List *result;
+ Const *patt;
+ Const *prefix;
+ Pattern_Prefix_Status pstatus;
+ Oid ldatatype;
+ Oid rdatatype;
+ Oid eqopr;
+ Oid ltopr;
+ Oid geopr;
+ Oid preopr = InvalidOid;
+ bool collation_aware;
+ Expr *expr;
+ FmgrInfo ltproc;
+ Const *greaterstr;
+
+ /*
+ * Can't do anything with a non-constant or NULL pattern argument.
+ *
+ * Note that since we restrict ourselves to cases with a hard constant on
+ * the RHS, it's a-fortiori a pseudoconstant, and we don't need to worry
+ * about verifying that.
+ */
+ if (!IsA(rightop, Const) ||
+ ((Const *) rightop)->constisnull)
+ return NIL;
+ patt = (Const *) rightop;
+
+ /*
+ * Not supported if the expression collation is nondeterministic. The
+ * optimized equality or prefix tests use bytewise comparisons, which is
+ * not consistent with nondeterministic collations. The actual
+ * pattern-matching implementation functions will later error out that
+ * pattern-matching is not supported with nondeterministic collations. (We
+ * could also error out here, but by doing it later we get more precise
+ * error messages.) (It should be possible to support at least
+ * Pattern_Prefix_Exact, but no point as long as the actual
+ * pattern-matching implementations don't support it.)
+ *
+ * expr_coll is not set for a non-collation-aware data type such as bytea.
+ */
+ if (expr_coll && !get_collation_isdeterministic(expr_coll))
+ return NIL;
+
+ /*
+ * Try to extract a fixed prefix from the pattern.
+ */
+ pstatus = pattern_fixed_prefix(patt, ptype, expr_coll,
+ &prefix, NULL);
+
+ /* fail if no fixed prefix */
+ if (pstatus == Pattern_Prefix_None)
+ return NIL;
+
+ /*
+ * Identify the operators we want to use, based on the type of the
+ * left-hand argument. Usually these are just the type's regular
+ * comparison operators, but if we are considering one of the semi-legacy
+ * "pattern" opclasses, use the "pattern" operators instead. Those are
+ * not collation-sensitive but always use C collation, as we want. The
+ * selected operators also determine the needed type of the prefix
+ * constant.
+ */
+ ldatatype = exprType(leftop);
+ switch (ldatatype)
+ {
+ case TEXTOID:
+ if (opfamily == TEXT_PATTERN_BTREE_FAM_OID)
+ {
+ eqopr = TextEqualOperator;
+ ltopr = TextPatternLessOperator;
+ geopr = TextPatternGreaterEqualOperator;
+ collation_aware = false;
+ }
+ else if (opfamily == TEXT_SPGIST_FAM_OID)
+ {
+ eqopr = TextEqualOperator;
+ ltopr = TextPatternLessOperator;
+ geopr = TextPatternGreaterEqualOperator;
+ /* This opfamily has direct support for prefixing */
+ preopr = TextPrefixOperator;
+ collation_aware = false;
+ }
+ else
+ {
+ eqopr = TextEqualOperator;
+ ltopr = TextLessOperator;
+ geopr = TextGreaterEqualOperator;
+ collation_aware = true;
+ }
+ rdatatype = TEXTOID;
+ break;
+ case NAMEOID:
+
+ /*
+ * Note that here, we need the RHS type to be text, so that the
+ * comparison value isn't improperly truncated to NAMEDATALEN.
+ */
+ eqopr = NameEqualTextOperator;
+ ltopr = NameLessTextOperator;
+ geopr = NameGreaterEqualTextOperator;
+ collation_aware = true;
+ rdatatype = TEXTOID;
+ break;
+ case BPCHAROID:
+ if (opfamily == BPCHAR_PATTERN_BTREE_FAM_OID)
+ {
+ eqopr = BpcharEqualOperator;
+ ltopr = BpcharPatternLessOperator;
+ geopr = BpcharPatternGreaterEqualOperator;
+ collation_aware = false;
+ }
+ else
+ {
+ eqopr = BpcharEqualOperator;
+ ltopr = BpcharLessOperator;
+ geopr = BpcharGreaterEqualOperator;
+ collation_aware = true;
+ }
+ rdatatype = BPCHAROID;
+ break;
+ case BYTEAOID:
+ eqopr = ByteaEqualOperator;
+ ltopr = ByteaLessOperator;
+ geopr = ByteaGreaterEqualOperator;
+ collation_aware = false;
+ rdatatype = BYTEAOID;
+ break;
+ default:
+ /* Can't get here unless we're attached to the wrong operator */
+ return NIL;
+ }
+
+ /*
+ * If necessary, coerce the prefix constant to the right type. The given
+ * prefix constant is either text or bytea type, therefore the only case
+ * where we need to do anything is when converting text to bpchar. Those
+ * two types are binary-compatible, so relabeling the Const node is
+ * sufficient.
+ */
+ if (prefix->consttype != rdatatype)
+ {
+ Assert(prefix->consttype == TEXTOID &&
+ rdatatype == BPCHAROID);
+ prefix->consttype = rdatatype;
+ }
+
+ /*
+ * If we found an exact-match pattern, generate an "=" indexqual.
+ *
+ * Here and below, check to see whether the desired operator is actually
+ * supported by the index opclass, and fail quietly if not. This allows
+ * us to not be concerned with specific opclasses (except for the legacy
+ * "pattern" cases); any index that correctly implements the operators
+ * will work.
+ */
+ if (pstatus == Pattern_Prefix_Exact)
+ {
+ if (!op_in_opfamily(eqopr, opfamily))
+ return NIL;
+ expr = make_opclause(eqopr, BOOLOID, false,
+ (Expr *) leftop, (Expr *) prefix,
+ InvalidOid, indexcollation);
+ result = list_make1(expr);
+ return result;
+ }
+
+ /*
+ * Otherwise, we have a nonempty required prefix of the values. Some
+ * opclasses support prefix checks directly, otherwise we'll try to
+ * generate a range constraint.
+ */
+ if (OidIsValid(preopr) && op_in_opfamily(preopr, opfamily))
+ {
+ expr = make_opclause(preopr, BOOLOID, false,
+ (Expr *) leftop, (Expr *) prefix,
+ InvalidOid, indexcollation);
+ result = list_make1(expr);
+ return result;
+ }
+
+ /*
+ * Since we need a range constraint, it's only going to work reliably if
+ * the index is collation-insensitive or has "C" collation. Note that
+ * here we are looking at the index's collation, not the expression's
+ * collation -- this test is *not* dependent on the LIKE/regex operator's
+ * collation.
+ */
+ if (collation_aware &&
+ !lc_collate_is_c(indexcollation))
+ return NIL;
+
+ /*
+ * We can always say "x >= prefix".
+ */
+ if (!op_in_opfamily(geopr, opfamily))
+ return NIL;
+ expr = make_opclause(geopr, BOOLOID, false,
+ (Expr *) leftop, (Expr *) prefix,
+ InvalidOid, indexcollation);
+ result = list_make1(expr);
+
+ /*-------
+ * If we can create a string larger than the prefix, we can say
+ * "x < greaterstr". NB: we rely on make_greater_string() to generate
+ * a guaranteed-greater string, not just a probably-greater string.
+ * In general this is only guaranteed in C locale, so we'd better be
+ * using a C-locale index collation.
+ *-------
+ */
+ if (!op_in_opfamily(ltopr, opfamily))
+ return result;
+ fmgr_info(get_opcode(ltopr), &ltproc);
+ greaterstr = make_greater_string(prefix, &ltproc, indexcollation);
+ if (greaterstr)
+ {
+ expr = make_opclause(ltopr, BOOLOID, false,
+ (Expr *) leftop, (Expr *) greaterstr,
+ InvalidOid, indexcollation);
+ result = lappend(result, expr);
+ }
+
+ return result;
+}
+
+
+/*
+ * patternsel_common - generic code for pattern-match restriction selectivity.
+ *
+ * To support using this from either the operator or function paths, caller
+ * may pass either operator OID or underlying function OID; we look up the
+ * latter from the former if needed. (We could just have patternsel() call
+ * get_opcode(), but the work would be wasted if we don't have a need to
+ * compare a fixed prefix to the pg_statistic data.)
+ *
+ * Note that oprid and/or opfuncid should be for the positive-match operator
+ * even when negate is true.
+ */
+static double
+patternsel_common(PlannerInfo *root,
+ Oid oprid,
+ Oid opfuncid,
+ List *args,
+ int varRelid,
+ Oid collation,
+ Pattern_Type ptype,
+ bool negate)
+{
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Datum constval;
+ Oid consttype;
+ Oid vartype;
+ Oid rdatatype;
+ Oid eqopr;
+ Oid ltopr;
+ Oid geopr;
+ Pattern_Prefix_Status pstatus;
+ Const *patt;
+ Const *prefix = NULL;
+ Selectivity rest_selec = 0;
+ double nullfrac = 0.0;
+ double result;
+
+ /*
+ * Initialize result to the appropriate default estimate depending on
+ * whether it's a match or not-match operator.
+ */
+ if (negate)
+ result = 1.0 - DEFAULT_MATCH_SEL;
+ else
+ result = DEFAULT_MATCH_SEL;
+
+ /*
+ * If expression is not variable op constant, then punt and return the
+ * default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ return result;
+ if (!varonleft || !IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ return result;
+ }
+
+ /*
+ * If the constant is NULL, assume operator is strict and return zero, ie,
+ * operator will never return TRUE. (It's zero even for a negator op.)
+ */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ return 0.0;
+ }
+ constval = ((Const *) other)->constvalue;
+ consttype = ((Const *) other)->consttype;
+
+ /*
+ * The right-hand const is type text or bytea for all supported operators.
+ * We do not expect to see binary-compatible types here, since
+ * const-folding should have relabeled the const to exactly match the
+ * operator's declared type.
+ */
+ if (consttype != TEXTOID && consttype != BYTEAOID)
+ {
+ ReleaseVariableStats(vardata);
+ return result;
+ }
+
+ /*
+ * Similarly, the exposed type of the left-hand side should be one of
+ * those we know. (Do not look at vardata.atttype, which might be
+ * something binary-compatible but different.) We can use it to identify
+ * the comparison operators and the required type of the comparison
+ * constant, much as in match_pattern_prefix().
+ */
+ vartype = vardata.vartype;
+
+ switch (vartype)
+ {
+ case TEXTOID:
+ eqopr = TextEqualOperator;
+ ltopr = TextLessOperator;
+ geopr = TextGreaterEqualOperator;
+ rdatatype = TEXTOID;
+ break;
+ case NAMEOID:
+
+ /*
+ * Note that here, we need the RHS type to be text, so that the
+ * comparison value isn't improperly truncated to NAMEDATALEN.
+ */
+ eqopr = NameEqualTextOperator;
+ ltopr = NameLessTextOperator;
+ geopr = NameGreaterEqualTextOperator;
+ rdatatype = TEXTOID;
+ break;
+ case BPCHAROID:
+ eqopr = BpcharEqualOperator;
+ ltopr = BpcharLessOperator;
+ geopr = BpcharGreaterEqualOperator;
+ rdatatype = BPCHAROID;
+ break;
+ case BYTEAOID:
+ eqopr = ByteaEqualOperator;
+ ltopr = ByteaLessOperator;
+ geopr = ByteaGreaterEqualOperator;
+ rdatatype = BYTEAOID;
+ break;
+ default:
+ /* Can't get here unless we're attached to the wrong operator */
+ ReleaseVariableStats(vardata);
+ return result;
+ }
+
+ /*
+ * Grab the nullfrac for use below.
+ */
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ Form_pg_statistic stats;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+ nullfrac = stats->stanullfrac;
+ }
+
+ /*
+ * Pull out any fixed prefix implied by the pattern, and estimate the
+ * fractional selectivity of the remainder of the pattern. Unlike many
+ * other selectivity estimators, we use the pattern operator's actual
+ * collation for this step. This is not because we expect the collation
+ * to make a big difference in the selectivity estimate (it seldom would),
+ * but because we want to be sure we cache compiled regexps under the
+ * right cache key, so that they can be re-used at runtime.
+ */
+ patt = (Const *) other;
+ pstatus = pattern_fixed_prefix(patt, ptype, collation,
+ &prefix, &rest_selec);
+
+ /*
+ * If necessary, coerce the prefix constant to the right type. The only
+ * case where we need to do anything is when converting text to bpchar.
+ * Those two types are binary-compatible, so relabeling the Const node is
+ * sufficient.
+ */
+ if (prefix && prefix->consttype != rdatatype)
+ {
+ Assert(prefix->consttype == TEXTOID &&
+ rdatatype == BPCHAROID);
+ prefix->consttype = rdatatype;
+ }
+
+ if (pstatus == Pattern_Prefix_Exact)
+ {
+ /*
+ * Pattern specifies an exact match, so estimate as for '='
+ */
+ result = var_eq_const(&vardata, eqopr, collation, prefix->constvalue,
+ false, true, false);
+ }
+ else
+ {
+ /*
+ * Not exact-match pattern. If we have a sufficiently large
+ * histogram, estimate selectivity for the histogram part of the
+ * population by counting matches in the histogram. If not, estimate
+ * selectivity of the fixed prefix and remainder of pattern
+ * separately, then combine the two to get an estimate of the
+ * selectivity for the part of the column population represented by
+ * the histogram. (For small histograms, we combine these
+ * approaches.)
+ *
+ * We then add up data for any most-common-values values; these are
+ * not in the histogram population, and we can get exact answers for
+ * them by applying the pattern operator, so there's no reason to
+ * approximate. (If the MCVs cover a significant part of the total
+ * population, this gives us a big leg up in accuracy.)
+ */
+ Selectivity selec;
+ int hist_size;
+ FmgrInfo opproc;
+ double mcv_selec,
+ sumcommon;
+
+ /* Try to use the histogram entries to get selectivity */
+ if (!OidIsValid(opfuncid))
+ opfuncid = get_opcode(oprid);
+ fmgr_info(opfuncid, &opproc);
+
+ selec = histogram_selectivity(&vardata, &opproc, collation,
+ constval, true,
+ 10, 1, &hist_size);
+
+ /* If not at least 100 entries, use the heuristic method */
+ if (hist_size < 100)
+ {
+ Selectivity heursel;
+ Selectivity prefixsel;
+
+ if (pstatus == Pattern_Prefix_Partial)
+ prefixsel = prefix_selectivity(root, &vardata,
+ eqopr, ltopr, geopr,
+ collation,
+ prefix);
+ else
+ prefixsel = 1.0;
+ heursel = prefixsel * rest_selec;
+
+ if (selec < 0) /* fewer than 10 histogram entries? */
+ selec = heursel;
+ else
+ {
+ /*
+ * For histogram sizes from 10 to 100, we combine the
+ * histogram and heuristic selectivities, putting increasingly
+ * more trust in the histogram for larger sizes.
+ */
+ double hist_weight = hist_size / 100.0;
+
+ selec = selec * hist_weight + heursel * (1.0 - hist_weight);
+ }
+ }
+
+ /* In any case, don't believe extremely small or large estimates. */
+ if (selec < 0.0001)
+ selec = 0.0001;
+ else if (selec > 0.9999)
+ selec = 0.9999;
+
+ /*
+ * If we have most-common-values info, add up the fractions of the MCV
+ * entries that satisfy MCV OP PATTERN. These fractions contribute
+ * directly to the result selectivity. Also add up the total fraction
+ * represented by MCV entries.
+ */
+ mcv_selec = mcv_selectivity(&vardata, &opproc, collation,
+ constval, true,
+ &sumcommon);
+
+ /*
+ * Now merge the results from the MCV and histogram calculations,
+ * realizing that the histogram covers only the non-null values that
+ * are not listed in MCV.
+ */
+ selec *= 1.0 - nullfrac - sumcommon;
+ selec += mcv_selec;
+ result = selec;
+ }
+
+ /* now adjust if we wanted not-match rather than match */
+ if (negate)
+ result = 1.0 - result - nullfrac;
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(result);
+
+ if (prefix)
+ {
+ pfree(DatumGetPointer(prefix->constvalue));
+ pfree(prefix);
+ }
+
+ ReleaseVariableStats(vardata);
+
+ return result;
+}
+
+/*
+ * Fix impedance mismatch between SQL-callable functions and patternsel_common
+ */
+static double
+patternsel(PG_FUNCTION_ARGS, Pattern_Type ptype, bool negate)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ Oid collation = PG_GET_COLLATION();
+
+ /*
+ * If this is for a NOT LIKE or similar operator, get the corresponding
+ * positive-match operator and work with that.
+ */
+ if (negate)
+ {
+ operator = get_negator(operator);
+ if (!OidIsValid(operator))
+ elog(ERROR, "patternsel called for operator without a negator");
+ }
+
+ return patternsel_common(root,
+ operator,
+ InvalidOid,
+ args,
+ varRelid,
+ collation,
+ ptype,
+ negate);
+}
+
+/*
+ * regexeqsel - Selectivity of regular-expression pattern match.
+ */
+Datum
+regexeqsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Regex, false));
+}
+
+/*
+ * icregexeqsel - Selectivity of case-insensitive regex match.
+ */
+Datum
+icregexeqsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Regex_IC, false));
+}
+
+/*
+ * likesel - Selectivity of LIKE pattern match.
+ */
+Datum
+likesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Like, false));
+}
+
+/*
+ * prefixsel - selectivity of prefix operator
+ */
+Datum
+prefixsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Prefix, false));
+}
+
+/*
+ *
+ * iclikesel - Selectivity of ILIKE pattern match.
+ */
+Datum
+iclikesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Like_IC, false));
+}
+
+/*
+ * regexnesel - Selectivity of regular-expression pattern non-match.
+ */
+Datum
+regexnesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Regex, true));
+}
+
+/*
+ * icregexnesel - Selectivity of case-insensitive regex non-match.
+ */
+Datum
+icregexnesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Regex_IC, true));
+}
+
+/*
+ * nlikesel - Selectivity of LIKE pattern non-match.
+ */
+Datum
+nlikesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Like, true));
+}
+
+/*
+ * icnlikesel - Selectivity of ILIKE pattern non-match.
+ */
+Datum
+icnlikesel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternsel(fcinfo, Pattern_Type_Like_IC, true));
+}
+
+/*
+ * patternjoinsel - Generic code for pattern-match join selectivity.
+ */
+static double
+patternjoinsel(PG_FUNCTION_ARGS, Pattern_Type ptype, bool negate)
+{
+ /* For the moment we just punt. */
+ return negate ? (1.0 - DEFAULT_MATCH_SEL) : DEFAULT_MATCH_SEL;
+}
+
+/*
+ * regexeqjoinsel - Join selectivity of regular-expression pattern match.
+ */
+Datum
+regexeqjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Regex, false));
+}
+
+/*
+ * icregexeqjoinsel - Join selectivity of case-insensitive regex match.
+ */
+Datum
+icregexeqjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Regex_IC, false));
+}
+
+/*
+ * likejoinsel - Join selectivity of LIKE pattern match.
+ */
+Datum
+likejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Like, false));
+}
+
+/*
+ * prefixjoinsel - Join selectivity of prefix operator
+ */
+Datum
+prefixjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Prefix, false));
+}
+
+/*
+ * iclikejoinsel - Join selectivity of ILIKE pattern match.
+ */
+Datum
+iclikejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Like_IC, false));
+}
+
+/*
+ * regexnejoinsel - Join selectivity of regex non-match.
+ */
+Datum
+regexnejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Regex, true));
+}
+
+/*
+ * icregexnejoinsel - Join selectivity of case-insensitive regex non-match.
+ */
+Datum
+icregexnejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Regex_IC, true));
+}
+
+/*
+ * nlikejoinsel - Join selectivity of LIKE pattern non-match.
+ */
+Datum
+nlikejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Like, true));
+}
+
+/*
+ * icnlikejoinsel - Join selectivity of ILIKE pattern non-match.
+ */
+Datum
+icnlikejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(patternjoinsel(fcinfo, Pattern_Type_Like_IC, true));
+}
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Pattern analysis functions
+ *
+ * These routines support analysis of LIKE and regular-expression patterns
+ * by the planner/optimizer. It's important that they agree with the
+ * regular-expression code in backend/regex/ and the LIKE code in
+ * backend/utils/adt/like.c. Also, the computation of the fixed prefix
+ * must be conservative: if we report a string longer than the true fixed
+ * prefix, the query may produce actually wrong answers, rather than just
+ * getting a bad selectivity estimate!
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Extract the fixed prefix, if any, for a pattern.
+ *
+ * *prefix is set to a palloc'd prefix string (in the form of a Const node),
+ * or to NULL if no fixed prefix exists for the pattern.
+ * If rest_selec is not NULL, *rest_selec is set to an estimate of the
+ * selectivity of the remainder of the pattern (without any fixed prefix).
+ * The prefix Const has the same type (TEXT or BYTEA) as the input pattern.
+ *
+ * The return value distinguishes no fixed prefix, a partial prefix,
+ * or an exact-match-only pattern.
+ */
+
+static Pattern_Prefix_Status
+like_fixed_prefix(Const *patt_const, bool case_insensitive, Oid collation,
+ Const **prefix_const, Selectivity *rest_selec)
+{
+ char *match;
+ char *patt;
+ int pattlen;
+ Oid typeid = patt_const->consttype;
+ int pos,
+ match_pos;
+ bool is_multibyte = (pg_database_encoding_max_length() > 1);
+ pg_locale_t locale = 0;
+ bool locale_is_c = false;
+
+ /* the right-hand const is type text or bytea */
+ Assert(typeid == BYTEAOID || typeid == TEXTOID);
+
+ if (case_insensitive)
+ {
+ if (typeid == BYTEAOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("case insensitive matching not supported on type bytea")));
+
+ if (!OidIsValid(collation))
+ {
+ /*
+ * This typically means that the parser could not resolve a
+ * conflict of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for ILIKE"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+
+ /* If case-insensitive, we need locale info */
+ if (lc_ctype_is_c(collation))
+ locale_is_c = true;
+ else
+ locale = pg_newlocale_from_collation(collation);
+ }
+
+ if (typeid != BYTEAOID)
+ {
+ patt = TextDatumGetCString(patt_const->constvalue);
+ pattlen = strlen(patt);
+ }
+ else
+ {
+ bytea *bstr = DatumGetByteaPP(patt_const->constvalue);
+
+ pattlen = VARSIZE_ANY_EXHDR(bstr);
+ patt = (char *) palloc(pattlen);
+ memcpy(patt, VARDATA_ANY(bstr), pattlen);
+ Assert((Pointer) bstr == DatumGetPointer(patt_const->constvalue));
+ }
+
+ match = palloc(pattlen + 1);
+ match_pos = 0;
+ for (pos = 0; pos < pattlen; pos++)
+ {
+ /* % and _ are wildcard characters in LIKE */
+ if (patt[pos] == '%' ||
+ patt[pos] == '_')
+ break;
+
+ /* Backslash escapes the next character */
+ if (patt[pos] == '\\')
+ {
+ pos++;
+ if (pos >= pattlen)
+ break;
+ }
+
+ /* Stop if case-varying character (it's sort of a wildcard) */
+ if (case_insensitive &&
+ pattern_char_isalpha(patt[pos], is_multibyte, locale, locale_is_c))
+ break;
+
+ match[match_pos++] = patt[pos];
+ }
+
+ match[match_pos] = '\0';
+
+ if (typeid != BYTEAOID)
+ *prefix_const = string_to_const(match, typeid);
+ else
+ *prefix_const = string_to_bytea_const(match, match_pos);
+
+ if (rest_selec != NULL)
+ *rest_selec = like_selectivity(&patt[pos], pattlen - pos,
+ case_insensitive);
+
+ pfree(patt);
+ pfree(match);
+
+ /* in LIKE, an empty pattern is an exact match! */
+ if (pos == pattlen)
+ return Pattern_Prefix_Exact; /* reached end of pattern, so exact */
+
+ if (match_pos > 0)
+ return Pattern_Prefix_Partial;
+
+ return Pattern_Prefix_None;
+}
+
+static Pattern_Prefix_Status
+regex_fixed_prefix(Const *patt_const, bool case_insensitive, Oid collation,
+ Const **prefix_const, Selectivity *rest_selec)
+{
+ Oid typeid = patt_const->consttype;
+ char *prefix;
+ bool exact;
+
+ /*
+ * Should be unnecessary, there are no bytea regex operators defined. As
+ * such, it should be noted that the rest of this function has *not* been
+ * made safe for binary (possibly NULL containing) strings.
+ */
+ if (typeid == BYTEAOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("regular-expression matching not supported on type bytea")));
+
+ /* Use the regexp machinery to extract the prefix, if any */
+ prefix = regexp_fixed_prefix(DatumGetTextPP(patt_const->constvalue),
+ case_insensitive, collation,
+ &exact);
+
+ if (prefix == NULL)
+ {
+ *prefix_const = NULL;
+
+ if (rest_selec != NULL)
+ {
+ char *patt = TextDatumGetCString(patt_const->constvalue);
+
+ *rest_selec = regex_selectivity(patt, strlen(patt),
+ case_insensitive,
+ 0);
+ pfree(patt);
+ }
+
+ return Pattern_Prefix_None;
+ }
+
+ *prefix_const = string_to_const(prefix, typeid);
+
+ if (rest_selec != NULL)
+ {
+ if (exact)
+ {
+ /* Exact match, so there's no additional selectivity */
+ *rest_selec = 1.0;
+ }
+ else
+ {
+ char *patt = TextDatumGetCString(patt_const->constvalue);
+
+ *rest_selec = regex_selectivity(patt, strlen(patt),
+ case_insensitive,
+ strlen(prefix));
+ pfree(patt);
+ }
+ }
+
+ pfree(prefix);
+
+ if (exact)
+ return Pattern_Prefix_Exact; /* pattern specifies exact match */
+ else
+ return Pattern_Prefix_Partial;
+}
+
+static Pattern_Prefix_Status
+pattern_fixed_prefix(Const *patt, Pattern_Type ptype, Oid collation,
+ Const **prefix, Selectivity *rest_selec)
+{
+ Pattern_Prefix_Status result;
+
+ switch (ptype)
+ {
+ case Pattern_Type_Like:
+ result = like_fixed_prefix(patt, false, collation,
+ prefix, rest_selec);
+ break;
+ case Pattern_Type_Like_IC:
+ result = like_fixed_prefix(patt, true, collation,
+ prefix, rest_selec);
+ break;
+ case Pattern_Type_Regex:
+ result = regex_fixed_prefix(patt, false, collation,
+ prefix, rest_selec);
+ break;
+ case Pattern_Type_Regex_IC:
+ result = regex_fixed_prefix(patt, true, collation,
+ prefix, rest_selec);
+ break;
+ case Pattern_Type_Prefix:
+ /* Prefix type work is trivial. */
+ result = Pattern_Prefix_Partial;
+ *prefix = makeConst(patt->consttype,
+ patt->consttypmod,
+ patt->constcollid,
+ patt->constlen,
+ datumCopy(patt->constvalue,
+ patt->constbyval,
+ patt->constlen),
+ patt->constisnull,
+ patt->constbyval);
+ if (rest_selec != NULL)
+ *rest_selec = 1.0; /* all */
+ break;
+ default:
+ elog(ERROR, "unrecognized ptype: %d", (int) ptype);
+ result = Pattern_Prefix_None; /* keep compiler quiet */
+ break;
+ }
+ return result;
+}
+
+/*
+ * Estimate the selectivity of a fixed prefix for a pattern match.
+ *
+ * A fixed prefix "foo" is estimated as the selectivity of the expression
+ * "variable >= 'foo' AND variable < 'fop'".
+ *
+ * The selectivity estimate is with respect to the portion of the column
+ * population represented by the histogram --- the caller must fold this
+ * together with info about MCVs and NULLs.
+ *
+ * We use the given comparison operators and collation to do the estimation.
+ * The given variable and Const must be of the associated datatype(s).
+ *
+ * XXX Note: we make use of the upper bound to estimate operator selectivity
+ * even if the locale is such that we cannot rely on the upper-bound string.
+ * The selectivity only needs to be approximately right anyway, so it seems
+ * more useful to use the upper-bound code than not.
+ */
+static Selectivity
+prefix_selectivity(PlannerInfo *root, VariableStatData *vardata,
+ Oid eqopr, Oid ltopr, Oid geopr,
+ Oid collation,
+ Const *prefixcon)
+{
+ Selectivity prefixsel;
+ FmgrInfo opproc;
+ Const *greaterstrcon;
+ Selectivity eq_sel;
+
+ /* Estimate the selectivity of "x >= prefix" */
+ fmgr_info(get_opcode(geopr), &opproc);
+
+ prefixsel = ineq_histogram_selectivity(root, vardata,
+ geopr, &opproc, true, true,
+ collation,
+ prefixcon->constvalue,
+ prefixcon->consttype);
+
+ if (prefixsel < 0.0)
+ {
+ /* No histogram is present ... return a suitable default estimate */
+ return DEFAULT_MATCH_SEL;
+ }
+
+ /*
+ * If we can create a string larger than the prefix, say "x < greaterstr".
+ */
+ fmgr_info(get_opcode(ltopr), &opproc);
+ greaterstrcon = make_greater_string(prefixcon, &opproc, collation);
+ if (greaterstrcon)
+ {
+ Selectivity topsel;
+
+ topsel = ineq_histogram_selectivity(root, vardata,
+ ltopr, &opproc, false, false,
+ collation,
+ greaterstrcon->constvalue,
+ greaterstrcon->consttype);
+
+ /* ineq_histogram_selectivity worked before, it shouldn't fail now */
+ Assert(topsel >= 0.0);
+
+ /*
+ * Merge the two selectivities in the same way as for a range query
+ * (see clauselist_selectivity()). Note that we don't need to worry
+ * about double-exclusion of nulls, since ineq_histogram_selectivity
+ * doesn't count those anyway.
+ */
+ prefixsel = topsel + prefixsel - 1.0;
+ }
+
+ /*
+ * If the prefix is long then the two bounding values might be too close
+ * together for the histogram to distinguish them usefully, resulting in a
+ * zero estimate (plus or minus roundoff error). To avoid returning a
+ * ridiculously small estimate, compute the estimated selectivity for
+ * "variable = 'foo'", and clamp to that. (Obviously, the resultant
+ * estimate should be at least that.)
+ *
+ * We apply this even if we couldn't make a greater string. That case
+ * suggests that the prefix is near the maximum possible, and thus
+ * probably off the end of the histogram, and thus we probably got a very
+ * small estimate from the >= condition; so we still need to clamp.
+ */
+ eq_sel = var_eq_const(vardata, eqopr, collation, prefixcon->constvalue,
+ false, true, false);
+
+ prefixsel = Max(prefixsel, eq_sel);
+
+ return prefixsel;
+}
+
+
+/*
+ * Estimate the selectivity of a pattern of the specified type.
+ * Note that any fixed prefix of the pattern will have been removed already,
+ * so actually we may be looking at just a fragment of the pattern.
+ *
+ * For now, we use a very simplistic approach: fixed characters reduce the
+ * selectivity a good deal, character ranges reduce it a little,
+ * wildcards (such as % for LIKE or .* for regex) increase it.
+ */
+
+#define FIXED_CHAR_SEL 0.20 /* about 1/5 */
+#define CHAR_RANGE_SEL 0.25
+#define ANY_CHAR_SEL 0.9 /* not 1, since it won't match end-of-string */
+#define FULL_WILDCARD_SEL 5.0
+#define PARTIAL_WILDCARD_SEL 2.0
+
+static Selectivity
+like_selectivity(const char *patt, int pattlen, bool case_insensitive)
+{
+ Selectivity sel = 1.0;
+ int pos;
+
+ /* Skip any leading wildcard; it's already factored into initial sel */
+ for (pos = 0; pos < pattlen; pos++)
+ {
+ if (patt[pos] != '%' && patt[pos] != '_')
+ break;
+ }
+
+ for (; pos < pattlen; pos++)
+ {
+ /* % and _ are wildcard characters in LIKE */
+ if (patt[pos] == '%')
+ sel *= FULL_WILDCARD_SEL;
+ else if (patt[pos] == '_')
+ sel *= ANY_CHAR_SEL;
+ else if (patt[pos] == '\\')
+ {
+ /* Backslash quotes the next character */
+ pos++;
+ if (pos >= pattlen)
+ break;
+ sel *= FIXED_CHAR_SEL;
+ }
+ else
+ sel *= FIXED_CHAR_SEL;
+ }
+ /* Could get sel > 1 if multiple wildcards */
+ if (sel > 1.0)
+ sel = 1.0;
+ return sel;
+}
+
+static Selectivity
+regex_selectivity_sub(const char *patt, int pattlen, bool case_insensitive)
+{
+ Selectivity sel = 1.0;
+ int paren_depth = 0;
+ int paren_pos = 0; /* dummy init to keep compiler quiet */
+ int pos;
+
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ for (pos = 0; pos < pattlen; pos++)
+ {
+ if (patt[pos] == '(')
+ {
+ if (paren_depth == 0)
+ paren_pos = pos; /* remember start of parenthesized item */
+ paren_depth++;
+ }
+ else if (patt[pos] == ')' && paren_depth > 0)
+ {
+ paren_depth--;
+ if (paren_depth == 0)
+ sel *= regex_selectivity_sub(patt + (paren_pos + 1),
+ pos - (paren_pos + 1),
+ case_insensitive);
+ }
+ else if (patt[pos] == '|' && paren_depth == 0)
+ {
+ /*
+ * If unquoted | is present at paren level 0 in pattern, we have
+ * multiple alternatives; sum their probabilities.
+ */
+ sel += regex_selectivity_sub(patt + (pos + 1),
+ pattlen - (pos + 1),
+ case_insensitive);
+ break; /* rest of pattern is now processed */
+ }
+ else if (patt[pos] == '[')
+ {
+ bool negclass = false;
+
+ if (patt[++pos] == '^')
+ {
+ negclass = true;
+ pos++;
+ }
+ if (patt[pos] == ']') /* ']' at start of class is not special */
+ pos++;
+ while (pos < pattlen && patt[pos] != ']')
+ pos++;
+ if (paren_depth == 0)
+ sel *= (negclass ? (1.0 - CHAR_RANGE_SEL) : CHAR_RANGE_SEL);
+ }
+ else if (patt[pos] == '.')
+ {
+ if (paren_depth == 0)
+ sel *= ANY_CHAR_SEL;
+ }
+ else if (patt[pos] == '*' ||
+ patt[pos] == '?' ||
+ patt[pos] == '+')
+ {
+ /* Ought to be smarter about quantifiers... */
+ if (paren_depth == 0)
+ sel *= PARTIAL_WILDCARD_SEL;
+ }
+ else if (patt[pos] == '{')
+ {
+ while (pos < pattlen && patt[pos] != '}')
+ pos++;
+ if (paren_depth == 0)
+ sel *= PARTIAL_WILDCARD_SEL;
+ }
+ else if (patt[pos] == '\\')
+ {
+ /* backslash quotes the next character */
+ pos++;
+ if (pos >= pattlen)
+ break;
+ if (paren_depth == 0)
+ sel *= FIXED_CHAR_SEL;
+ }
+ else
+ {
+ if (paren_depth == 0)
+ sel *= FIXED_CHAR_SEL;
+ }
+ }
+ /* Could get sel > 1 if multiple wildcards */
+ if (sel > 1.0)
+ sel = 1.0;
+ return sel;
+}
+
+static Selectivity
+regex_selectivity(const char *patt, int pattlen, bool case_insensitive,
+ int fixed_prefix_len)
+{
+ Selectivity sel;
+
+ /* If patt doesn't end with $, consider it to have a trailing wildcard */
+ if (pattlen > 0 && patt[pattlen - 1] == '$' &&
+ (pattlen == 1 || patt[pattlen - 2] != '\\'))
+ {
+ /* has trailing $ */
+ sel = regex_selectivity_sub(patt, pattlen - 1, case_insensitive);
+ }
+ else
+ {
+ /* no trailing $ */
+ sel = regex_selectivity_sub(patt, pattlen, case_insensitive);
+ sel *= FULL_WILDCARD_SEL;
+ }
+
+ /*
+ * If there's a fixed prefix, discount its selectivity. We have to be
+ * careful here since a very long prefix could result in pow's result
+ * underflowing to zero (in which case "sel" probably has as well).
+ */
+ if (fixed_prefix_len > 0)
+ {
+ double prefixsel = pow(FIXED_CHAR_SEL, fixed_prefix_len);
+
+ if (prefixsel > 0.0)
+ sel /= prefixsel;
+ }
+
+ /* Make sure result stays in range */
+ CLAMP_PROBABILITY(sel);
+ return sel;
+}
+
+/*
+ * Check whether char is a letter (and, hence, subject to case-folding)
+ *
+ * In multibyte character sets or with ICU, we can't use isalpha, and it does
+ * not seem worth trying to convert to wchar_t to use iswalpha or u_isalpha.
+ * Instead, just assume any non-ASCII char is potentially case-varying, and
+ * hard-wire knowledge of which ASCII chars are letters.
+ */
+static int
+pattern_char_isalpha(char c, bool is_multibyte,
+ pg_locale_t locale, bool locale_is_c)
+{
+ if (locale_is_c)
+ return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
+ else if (is_multibyte && IS_HIGHBIT_SET(c))
+ return true;
+ else if (locale && locale->provider == COLLPROVIDER_ICU)
+ return IS_HIGHBIT_SET(c) ||
+ (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
+#ifdef HAVE_LOCALE_T
+ else if (locale && locale->provider == COLLPROVIDER_LIBC)
+ return isalpha_l((unsigned char) c, locale->info.lt);
+#endif
+ else
+ return isalpha((unsigned char) c);
+}
+
+
+/*
+ * For bytea, the increment function need only increment the current byte
+ * (there are no multibyte characters to worry about).
+ */
+static bool
+byte_increment(unsigned char *ptr, int len)
+{
+ if (*ptr >= 255)
+ return false;
+ (*ptr)++;
+ return true;
+}
+
+/*
+ * Try to generate a string greater than the given string or any
+ * string it is a prefix of. If successful, return a palloc'd string
+ * in the form of a Const node; else return NULL.
+ *
+ * The caller must provide the appropriate "less than" comparison function
+ * for testing the strings, along with the collation to use.
+ *
+ * The key requirement here is that given a prefix string, say "foo",
+ * we must be able to generate another string "fop" that is greater than
+ * all strings "foobar" starting with "foo". We can test that we have
+ * generated a string greater than the prefix string, but in non-C collations
+ * that is not a bulletproof guarantee that an extension of the string might
+ * not sort after it; an example is that "foo " is less than "foo!", but it
+ * is not clear that a "dictionary" sort ordering will consider "foo!" less
+ * than "foo bar". CAUTION: Therefore, this function should be used only for
+ * estimation purposes when working in a non-C collation.
+ *
+ * To try to catch most cases where an extended string might otherwise sort
+ * before the result value, we determine which of the strings "Z", "z", "y",
+ * and "9" is seen as largest by the collation, and append that to the given
+ * prefix before trying to find a string that compares as larger.
+ *
+ * To search for a greater string, we repeatedly "increment" the rightmost
+ * character, using an encoding-specific character incrementer function.
+ * When it's no longer possible to increment the last character, we truncate
+ * off that character and start incrementing the next-to-rightmost.
+ * For example, if "z" were the last character in the sort order, then we
+ * could produce "foo" as a string greater than "fonz".
+ *
+ * This could be rather slow in the worst case, but in most cases we
+ * won't have to try more than one or two strings before succeeding.
+ *
+ * Note that it's important for the character incrementer not to be too anal
+ * about producing every possible character code, since in some cases the only
+ * way to get a larger string is to increment a previous character position.
+ * So we don't want to spend too much time trying every possible character
+ * code at the last position. A good rule of thumb is to be sure that we
+ * don't try more than 256*K values for a K-byte character (and definitely
+ * not 256^K, which is what an exhaustive search would approach).
+ */
+static Const *
+make_greater_string(const Const *str_const, FmgrInfo *ltproc, Oid collation)
+{
+ Oid datatype = str_const->consttype;
+ char *workstr;
+ int len;
+ Datum cmpstr;
+ char *cmptxt = NULL;
+ mbcharacter_incrementer charinc;
+
+ /*
+ * Get a modifiable copy of the prefix string in C-string format, and set
+ * up the string we will compare to as a Datum. In C locale this can just
+ * be the given prefix string, otherwise we need to add a suffix. Type
+ * BYTEA sorts bytewise so it never needs a suffix either.
+ */
+ if (datatype == BYTEAOID)
+ {
+ bytea *bstr = DatumGetByteaPP(str_const->constvalue);
+
+ len = VARSIZE_ANY_EXHDR(bstr);
+ workstr = (char *) palloc(len);
+ memcpy(workstr, VARDATA_ANY(bstr), len);
+ Assert((Pointer) bstr == DatumGetPointer(str_const->constvalue));
+ cmpstr = str_const->constvalue;
+ }
+ else
+ {
+ if (datatype == NAMEOID)
+ workstr = DatumGetCString(DirectFunctionCall1(nameout,
+ str_const->constvalue));
+ else
+ workstr = TextDatumGetCString(str_const->constvalue);
+ len = strlen(workstr);
+ if (lc_collate_is_c(collation) || len == 0)
+ cmpstr = str_const->constvalue;
+ else
+ {
+ /* If first time through, determine the suffix to use */
+ static char suffixchar = 0;
+ static Oid suffixcollation = 0;
+
+ if (!suffixchar || suffixcollation != collation)
+ {
+ char *best;
+
+ best = "Z";
+ if (varstr_cmp(best, 1, "z", 1, collation) < 0)
+ best = "z";
+ if (varstr_cmp(best, 1, "y", 1, collation) < 0)
+ best = "y";
+ if (varstr_cmp(best, 1, "9", 1, collation) < 0)
+ best = "9";
+ suffixchar = *best;
+ suffixcollation = collation;
+ }
+
+ /* And build the string to compare to */
+ if (datatype == NAMEOID)
+ {
+ cmptxt = palloc(len + 2);
+ memcpy(cmptxt, workstr, len);
+ cmptxt[len] = suffixchar;
+ cmptxt[len + 1] = '\0';
+ cmpstr = PointerGetDatum(cmptxt);
+ }
+ else
+ {
+ cmptxt = palloc(VARHDRSZ + len + 1);
+ SET_VARSIZE(cmptxt, VARHDRSZ + len + 1);
+ memcpy(VARDATA(cmptxt), workstr, len);
+ *(VARDATA(cmptxt) + len) = suffixchar;
+ cmpstr = PointerGetDatum(cmptxt);
+ }
+ }
+ }
+
+ /* Select appropriate character-incrementer function */
+ if (datatype == BYTEAOID)
+ charinc = byte_increment;
+ else
+ charinc = pg_database_encoding_character_incrementer();
+
+ /* And search ... */
+ while (len > 0)
+ {
+ int charlen;
+ unsigned char *lastchar;
+
+ /* Identify the last character --- for bytea, just the last byte */
+ if (datatype == BYTEAOID)
+ charlen = 1;
+ else
+ charlen = len - pg_mbcliplen(workstr, len, len - 1);
+ lastchar = (unsigned char *) (workstr + len - charlen);
+
+ /*
+ * Try to generate a larger string by incrementing the last character
+ * (for BYTEA, we treat each byte as a character).
+ *
+ * Note: the incrementer function is expected to return true if it's
+ * generated a valid-per-the-encoding new character, otherwise false.
+ * The contents of the character on false return are unspecified.
+ */
+ while (charinc(lastchar, charlen))
+ {
+ Const *workstr_const;
+
+ if (datatype == BYTEAOID)
+ workstr_const = string_to_bytea_const(workstr, len);
+ else
+ workstr_const = string_to_const(workstr, datatype);
+
+ if (DatumGetBool(FunctionCall2Coll(ltproc,
+ collation,
+ cmpstr,
+ workstr_const->constvalue)))
+ {
+ /* Successfully made a string larger than cmpstr */
+ if (cmptxt)
+ pfree(cmptxt);
+ pfree(workstr);
+ return workstr_const;
+ }
+
+ /* No good, release unusable value and try again */
+ pfree(DatumGetPointer(workstr_const->constvalue));
+ pfree(workstr_const);
+ }
+
+ /*
+ * No luck here, so truncate off the last character and try to
+ * increment the next one.
+ */
+ len -= charlen;
+ workstr[len] = '\0';
+ }
+
+ /* Failed... */
+ if (cmptxt)
+ pfree(cmptxt);
+ pfree(workstr);
+
+ return NULL;
+}
+
+/*
+ * Generate a Datum of the appropriate type from a C string.
+ * Note that all of the supported types are pass-by-ref, so the
+ * returned value should be pfree'd if no longer needed.
+ */
+static Datum
+string_to_datum(const char *str, Oid datatype)
+{
+ Assert(str != NULL);
+
+ /*
+ * We cheat a little by assuming that CStringGetTextDatum() will do for
+ * bpchar and varchar constants too...
+ */
+ if (datatype == NAMEOID)
+ return DirectFunctionCall1(namein, CStringGetDatum(str));
+ else if (datatype == BYTEAOID)
+ return DirectFunctionCall1(byteain, CStringGetDatum(str));
+ else
+ return CStringGetTextDatum(str);
+}
+
+/*
+ * Generate a Const node of the appropriate type from a C string.
+ */
+static Const *
+string_to_const(const char *str, Oid datatype)
+{
+ Datum conval = string_to_datum(str, datatype);
+ Oid collation;
+ int constlen;
+
+ /*
+ * We only need to support a few datatypes here, so hard-wire properties
+ * instead of incurring the expense of catalog lookups.
+ */
+ switch (datatype)
+ {
+ case TEXTOID:
+ case VARCHAROID:
+ case BPCHAROID:
+ collation = DEFAULT_COLLATION_OID;
+ constlen = -1;
+ break;
+
+ case NAMEOID:
+ collation = C_COLLATION_OID;
+ constlen = NAMEDATALEN;
+ break;
+
+ case BYTEAOID:
+ collation = InvalidOid;
+ constlen = -1;
+ break;
+
+ default:
+ elog(ERROR, "unexpected datatype in string_to_const: %u",
+ datatype);
+ return NULL;
+ }
+
+ return makeConst(datatype, -1, collation, constlen,
+ conval, false, false);
+}
+
+/*
+ * Generate a Const node of bytea type from a binary C string and a length.
+ */
+static Const *
+string_to_bytea_const(const char *str, size_t str_len)
+{
+ bytea *bstr = palloc(VARHDRSZ + str_len);
+ Datum conval;
+
+ memcpy(VARDATA(bstr), str, str_len);
+ SET_VARSIZE(bstr, VARHDRSZ + str_len);
+ conval = PointerGetDatum(bstr);
+
+ return makeConst(BYTEAOID, -1, InvalidOid, -1, conval, false, false);
+}
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c
new file mode 100644
index 0000000..023a004
--- /dev/null
+++ b/src/backend/utils/adt/lockfuncs.c
@@ -0,0 +1,1069 @@
+/*-------------------------------------------------------------------------
+ *
+ * lockfuncs.c
+ * Functions for SQL access to various lock-manager capabilities.
+ *
+ * Copyright (c) 2002-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/lockfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/xact.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "storage/predicate_internals.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+
+
+/*
+ * This must match enum LockTagType! Also, be sure to document any changes
+ * in the docs for the pg_locks view and for wait event types.
+ */
+const char *const LockTagTypeNames[] = {
+ "relation",
+ "extend",
+ "frozenid",
+ "page",
+ "tuple",
+ "transactionid",
+ "virtualxid",
+ "spectoken",
+ "object",
+ "userlock",
+ "advisory"
+};
+
+StaticAssertDecl(lengthof(LockTagTypeNames) == (LOCKTAG_ADVISORY + 1),
+ "array length mismatch");
+
+/* This must match enum PredicateLockTargetType (predicate_internals.h) */
+static const char *const PredicateLockTagTypeNames[] = {
+ "relation",
+ "page",
+ "tuple"
+};
+
+StaticAssertDecl(lengthof(PredicateLockTagTypeNames) == (PREDLOCKTAG_TUPLE + 1),
+ "array length mismatch");
+
+/* Working status for pg_lock_status */
+typedef struct
+{
+ LockData *lockData; /* state data from lmgr */
+ int currIdx; /* current PROCLOCK index */
+ PredicateLockData *predLockData; /* state data for pred locks */
+ int predLockIdx; /* current index for pred lock */
+} PG_Lock_Status;
+
+/* Number of columns in pg_locks output */
+#define NUM_LOCK_STATUS_COLUMNS 16
+
+/*
+ * VXIDGetDatum - Construct a text representation of a VXID
+ *
+ * This is currently only used in pg_lock_status, so we put it here.
+ */
+static Datum
+VXIDGetDatum(BackendId bid, LocalTransactionId lxid)
+{
+ /*
+ * The representation is "<bid>/<lxid>", decimal and unsigned decimal
+ * respectively. Note that elog.c also knows how to format a vxid.
+ */
+ char vxidstr[32];
+
+ snprintf(vxidstr, sizeof(vxidstr), "%d/%u", bid, lxid);
+
+ return CStringGetTextDatum(vxidstr);
+}
+
+
+/*
+ * pg_lock_status - produce a view with one row per held or awaited lock mode
+ */
+Datum
+pg_lock_status(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ PG_Lock_Status *mystatus;
+ LockData *lockData;
+ PredicateLockData *predLockData;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ TupleDesc tupdesc;
+ MemoryContext oldcontext;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* build tupdesc for result tuples */
+ /* this had better match function's declaration in pg_proc.h */
+ tupdesc = CreateTemplateTupleDesc(NUM_LOCK_STATUS_COLUMNS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "locktype",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "database",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "relation",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "page",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "tuple",
+ INT2OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "virtualxid",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "transactionid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "classid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "objid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "objsubid",
+ INT2OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 11, "virtualtransaction",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 12, "pid",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 13, "mode",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 14, "granted",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 15, "fastpath",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 16, "waitstart",
+ TIMESTAMPTZOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ /*
+ * Collect all the locking information that we will format and send
+ * out as a result set.
+ */
+ mystatus = (PG_Lock_Status *) palloc(sizeof(PG_Lock_Status));
+ funcctx->user_fctx = (void *) mystatus;
+
+ mystatus->lockData = GetLockStatusData();
+ mystatus->currIdx = 0;
+ mystatus->predLockData = GetPredicateLockStatusData();
+ mystatus->predLockIdx = 0;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ mystatus = (PG_Lock_Status *) funcctx->user_fctx;
+ lockData = mystatus->lockData;
+
+ while (mystatus->currIdx < lockData->nelements)
+ {
+ bool granted;
+ LOCKMODE mode = 0;
+ const char *locktypename;
+ char tnbuf[32];
+ Datum values[NUM_LOCK_STATUS_COLUMNS];
+ bool nulls[NUM_LOCK_STATUS_COLUMNS];
+ HeapTuple tuple;
+ Datum result;
+ LockInstanceData *instance;
+
+ instance = &(lockData->locks[mystatus->currIdx]);
+
+ /*
+ * Look to see if there are any held lock modes in this PROCLOCK. If
+ * so, report, and destructively modify lockData so we don't report
+ * again.
+ */
+ granted = false;
+ if (instance->holdMask)
+ {
+ for (mode = 0; mode < MAX_LOCKMODES; mode++)
+ {
+ if (instance->holdMask & LOCKBIT_ON(mode))
+ {
+ granted = true;
+ instance->holdMask &= LOCKBIT_OFF(mode);
+ break;
+ }
+ }
+ }
+
+ /*
+ * If no (more) held modes to report, see if PROC is waiting for a
+ * lock on this lock.
+ */
+ if (!granted)
+ {
+ if (instance->waitLockMode != NoLock)
+ {
+ /* Yes, so report it with proper mode */
+ mode = instance->waitLockMode;
+
+ /*
+ * We are now done with this PROCLOCK, so advance pointer to
+ * continue with next one on next call.
+ */
+ mystatus->currIdx++;
+ }
+ else
+ {
+ /*
+ * Okay, we've displayed all the locks associated with this
+ * PROCLOCK, proceed to the next one.
+ */
+ mystatus->currIdx++;
+ continue;
+ }
+ }
+
+ /*
+ * Form tuple with appropriate data.
+ */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, false, sizeof(nulls));
+
+ if (instance->locktag.locktag_type <= LOCKTAG_LAST_TYPE)
+ locktypename = LockTagTypeNames[instance->locktag.locktag_type];
+ else
+ {
+ snprintf(tnbuf, sizeof(tnbuf), "unknown %d",
+ (int) instance->locktag.locktag_type);
+ locktypename = tnbuf;
+ }
+ values[0] = CStringGetTextDatum(locktypename);
+
+ switch ((LockTagType) instance->locktag.locktag_type)
+ {
+ case LOCKTAG_RELATION:
+ case LOCKTAG_RELATION_EXTEND:
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ values[2] = ObjectIdGetDatum(instance->locktag.locktag_field2);
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_DATABASE_FROZEN_IDS:
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ nulls[2] = true;
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_PAGE:
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ values[2] = ObjectIdGetDatum(instance->locktag.locktag_field2);
+ values[3] = UInt32GetDatum(instance->locktag.locktag_field3);
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_TUPLE:
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ values[2] = ObjectIdGetDatum(instance->locktag.locktag_field2);
+ values[3] = UInt32GetDatum(instance->locktag.locktag_field3);
+ values[4] = UInt16GetDatum(instance->locktag.locktag_field4);
+ nulls[5] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_TRANSACTION:
+ values[6] =
+ TransactionIdGetDatum(instance->locktag.locktag_field1);
+ nulls[1] = true;
+ nulls[2] = true;
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_VIRTUALTRANSACTION:
+ values[5] = VXIDGetDatum(instance->locktag.locktag_field1,
+ instance->locktag.locktag_field2);
+ nulls[1] = true;
+ nulls[2] = true;
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ break;
+ case LOCKTAG_OBJECT:
+ case LOCKTAG_USERLOCK:
+ case LOCKTAG_ADVISORY:
+ default: /* treat unknown locktags like OBJECT */
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ values[7] = ObjectIdGetDatum(instance->locktag.locktag_field2);
+ values[8] = ObjectIdGetDatum(instance->locktag.locktag_field3);
+ values[9] = Int16GetDatum(instance->locktag.locktag_field4);
+ nulls[2] = true;
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[6] = true;
+ break;
+ }
+
+ values[10] = VXIDGetDatum(instance->backend, instance->lxid);
+ if (instance->pid != 0)
+ values[11] = Int32GetDatum(instance->pid);
+ else
+ nulls[11] = true;
+ values[12] = CStringGetTextDatum(GetLockmodeName(instance->locktag.locktag_lockmethodid, mode));
+ values[13] = BoolGetDatum(granted);
+ values[14] = BoolGetDatum(instance->fastpath);
+ if (!granted && instance->waitStart != 0)
+ values[15] = TimestampTzGetDatum(instance->waitStart);
+ else
+ nulls[15] = true;
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+
+ /*
+ * Have returned all regular locks. Now start on the SIREAD predicate
+ * locks.
+ */
+ predLockData = mystatus->predLockData;
+ if (mystatus->predLockIdx < predLockData->nelements)
+ {
+ PredicateLockTargetType lockType;
+
+ PREDICATELOCKTARGETTAG *predTag = &(predLockData->locktags[mystatus->predLockIdx]);
+ SERIALIZABLEXACT *xact = &(predLockData->xacts[mystatus->predLockIdx]);
+ Datum values[NUM_LOCK_STATUS_COLUMNS];
+ bool nulls[NUM_LOCK_STATUS_COLUMNS];
+ HeapTuple tuple;
+ Datum result;
+
+ mystatus->predLockIdx++;
+
+ /*
+ * Form tuple with appropriate data.
+ */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, false, sizeof(nulls));
+
+ /* lock type */
+ lockType = GET_PREDICATELOCKTARGETTAG_TYPE(*predTag);
+
+ values[0] = CStringGetTextDatum(PredicateLockTagTypeNames[lockType]);
+
+ /* lock target */
+ values[1] = GET_PREDICATELOCKTARGETTAG_DB(*predTag);
+ values[2] = GET_PREDICATELOCKTARGETTAG_RELATION(*predTag);
+ if (lockType == PREDLOCKTAG_TUPLE)
+ values[4] = GET_PREDICATELOCKTARGETTAG_OFFSET(*predTag);
+ else
+ nulls[4] = true;
+ if ((lockType == PREDLOCKTAG_TUPLE) ||
+ (lockType == PREDLOCKTAG_PAGE))
+ values[3] = GET_PREDICATELOCKTARGETTAG_PAGE(*predTag);
+ else
+ nulls[3] = true;
+
+ /* these fields are targets for other types of locks */
+ nulls[5] = true; /* virtualxid */
+ nulls[6] = true; /* transactionid */
+ nulls[7] = true; /* classid */
+ nulls[8] = true; /* objid */
+ nulls[9] = true; /* objsubid */
+
+ /* lock holder */
+ values[10] = VXIDGetDatum(xact->vxid.backendId,
+ xact->vxid.localTransactionId);
+ if (xact->pid != 0)
+ values[11] = Int32GetDatum(xact->pid);
+ else
+ nulls[11] = true;
+
+ /*
+ * Lock mode. Currently all predicate locks are SIReadLocks, which are
+ * always held (never waiting) and have no fast path
+ */
+ values[12] = CStringGetTextDatum("SIReadLock");
+ values[13] = BoolGetDatum(true);
+ values[14] = BoolGetDatum(false);
+ nulls[15] = true;
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/*
+ * pg_blocking_pids - produce an array of the PIDs blocking given PID
+ *
+ * The reported PIDs are those that hold a lock conflicting with blocked_pid's
+ * current request (hard block), or are requesting such a lock and are ahead
+ * of blocked_pid in the lock's wait queue (soft block).
+ *
+ * In parallel-query cases, we report all PIDs blocking any member of the
+ * given PID's lock group, and the reported PIDs are those of the blocking
+ * PIDs' lock group leaders. This allows callers to compare the result to
+ * lists of clients' pg_backend_pid() results even during a parallel query.
+ *
+ * Parallel query makes it possible for there to be duplicate PIDs in the
+ * result (either because multiple waiters are blocked by same PID, or
+ * because multiple blockers have same group leader PID). We do not bother
+ * to eliminate such duplicates from the result.
+ *
+ * We need not consider predicate locks here, since those don't block anything.
+ */
+Datum
+pg_blocking_pids(PG_FUNCTION_ARGS)
+{
+ int blocked_pid = PG_GETARG_INT32(0);
+ Datum *arrayelems;
+ int narrayelems;
+ BlockedProcsData *lockData; /* state data from lmgr */
+ int i,
+ j;
+
+ /* Collect a snapshot of lock manager state */
+ lockData = GetBlockerStatusData(blocked_pid);
+
+ /* We can't need more output entries than there are reported PROCLOCKs */
+ arrayelems = (Datum *) palloc(lockData->nlocks * sizeof(Datum));
+ narrayelems = 0;
+
+ /* For each blocked proc in the lock group ... */
+ for (i = 0; i < lockData->nprocs; i++)
+ {
+ BlockedProcData *bproc = &lockData->procs[i];
+ LockInstanceData *instances = &lockData->locks[bproc->first_lock];
+ int *preceding_waiters = &lockData->waiter_pids[bproc->first_waiter];
+ LockInstanceData *blocked_instance;
+ LockMethod lockMethodTable;
+ int conflictMask;
+
+ /*
+ * Locate the blocked proc's own entry in the LockInstanceData array.
+ * There should be exactly one matching entry.
+ */
+ blocked_instance = NULL;
+ for (j = 0; j < bproc->num_locks; j++)
+ {
+ LockInstanceData *instance = &(instances[j]);
+
+ if (instance->pid == bproc->pid)
+ {
+ Assert(blocked_instance == NULL);
+ blocked_instance = instance;
+ }
+ }
+ Assert(blocked_instance != NULL);
+
+ lockMethodTable = GetLockTagsMethodTable(&(blocked_instance->locktag));
+ conflictMask = lockMethodTable->conflictTab[blocked_instance->waitLockMode];
+
+ /* Now scan the PROCLOCK data for conflicting procs */
+ for (j = 0; j < bproc->num_locks; j++)
+ {
+ LockInstanceData *instance = &(instances[j]);
+
+ /* A proc never blocks itself, so ignore that entry */
+ if (instance == blocked_instance)
+ continue;
+ /* Members of same lock group never block each other, either */
+ if (instance->leaderPid == blocked_instance->leaderPid)
+ continue;
+
+ if (conflictMask & instance->holdMask)
+ {
+ /* hard block: blocked by lock already held by this entry */
+ }
+ else if (instance->waitLockMode != NoLock &&
+ (conflictMask & LOCKBIT_ON(instance->waitLockMode)))
+ {
+ /* conflict in lock requests; who's in front in wait queue? */
+ bool ahead = false;
+ int k;
+
+ for (k = 0; k < bproc->num_waiters; k++)
+ {
+ if (preceding_waiters[k] == instance->pid)
+ {
+ /* soft block: this entry is ahead of blocked proc */
+ ahead = true;
+ break;
+ }
+ }
+ if (!ahead)
+ continue; /* not blocked by this entry */
+ }
+ else
+ {
+ /* not blocked by this entry */
+ continue;
+ }
+
+ /* blocked by this entry, so emit a record */
+ arrayelems[narrayelems++] = Int32GetDatum(instance->leaderPid);
+ }
+ }
+
+ /* Assert we didn't overrun arrayelems[] */
+ Assert(narrayelems <= lockData->nlocks);
+
+ /* Construct array, using hardwired knowledge about int4 type */
+ PG_RETURN_ARRAYTYPE_P(construct_array(arrayelems, narrayelems,
+ INT4OID,
+ sizeof(int32), true, TYPALIGN_INT));
+}
+
+
+/*
+ * pg_safe_snapshot_blocking_pids - produce an array of the PIDs blocking
+ * given PID from getting a safe snapshot
+ *
+ * XXX this does not consider parallel-query cases; not clear how big a
+ * problem that is in practice
+ */
+Datum
+pg_safe_snapshot_blocking_pids(PG_FUNCTION_ARGS)
+{
+ int blocked_pid = PG_GETARG_INT32(0);
+ int *blockers;
+ int num_blockers;
+ Datum *blocker_datums;
+
+ /* A buffer big enough for any possible blocker list without truncation */
+ blockers = (int *) palloc(MaxBackends * sizeof(int));
+
+ /* Collect a snapshot of processes waited for by GetSafeSnapshot */
+ num_blockers =
+ GetSafeSnapshotBlockingPids(blocked_pid, blockers, MaxBackends);
+
+ /* Convert int array to Datum array */
+ if (num_blockers > 0)
+ {
+ int i;
+
+ blocker_datums = (Datum *) palloc(num_blockers * sizeof(Datum));
+ for (i = 0; i < num_blockers; ++i)
+ blocker_datums[i] = Int32GetDatum(blockers[i]);
+ }
+ else
+ blocker_datums = NULL;
+
+ /* Construct array, using hardwired knowledge about int4 type */
+ PG_RETURN_ARRAYTYPE_P(construct_array(blocker_datums, num_blockers,
+ INT4OID,
+ sizeof(int32), true, TYPALIGN_INT));
+}
+
+
+/*
+ * pg_isolation_test_session_is_blocked - support function for isolationtester
+ *
+ * Check if specified PID is blocked by any of the PIDs listed in the second
+ * argument. Currently, this looks for blocking caused by waiting for
+ * heavyweight locks or safe snapshots. We ignore blockage caused by PIDs
+ * not directly under the isolationtester's control, eg autovacuum.
+ *
+ * This is an undocumented function intended for use by the isolation tester,
+ * and may change in future releases as required for testing purposes.
+ */
+Datum
+pg_isolation_test_session_is_blocked(PG_FUNCTION_ARGS)
+{
+ int blocked_pid = PG_GETARG_INT32(0);
+ ArrayType *interesting_pids_a = PG_GETARG_ARRAYTYPE_P(1);
+ ArrayType *blocking_pids_a;
+ int32 *interesting_pids;
+ int32 *blocking_pids;
+ int num_interesting_pids;
+ int num_blocking_pids;
+ int dummy;
+ int i,
+ j;
+
+ /* Validate the passed-in array */
+ Assert(ARR_ELEMTYPE(interesting_pids_a) == INT4OID);
+ if (array_contains_nulls(interesting_pids_a))
+ elog(ERROR, "array must not contain nulls");
+ interesting_pids = (int32 *) ARR_DATA_PTR(interesting_pids_a);
+ num_interesting_pids = ArrayGetNItems(ARR_NDIM(interesting_pids_a),
+ ARR_DIMS(interesting_pids_a));
+
+ /*
+ * Get the PIDs of all sessions blocking the given session's attempt to
+ * acquire heavyweight locks.
+ */
+ blocking_pids_a =
+ DatumGetArrayTypeP(DirectFunctionCall1(pg_blocking_pids, blocked_pid));
+
+ Assert(ARR_ELEMTYPE(blocking_pids_a) == INT4OID);
+ Assert(!array_contains_nulls(blocking_pids_a));
+ blocking_pids = (int32 *) ARR_DATA_PTR(blocking_pids_a);
+ num_blocking_pids = ArrayGetNItems(ARR_NDIM(blocking_pids_a),
+ ARR_DIMS(blocking_pids_a));
+
+ /*
+ * Check if any of these are in the list of interesting PIDs, that being
+ * the sessions that the isolation tester is running. We don't use
+ * "arrayoverlaps" here, because it would lead to cache lookups and one of
+ * our goals is to run quickly with debug_discard_caches > 0. We expect
+ * blocking_pids to be usually empty and otherwise a very small number in
+ * isolation tester cases, so make that the outer loop of a naive search
+ * for a match.
+ */
+ for (i = 0; i < num_blocking_pids; i++)
+ for (j = 0; j < num_interesting_pids; j++)
+ {
+ if (blocking_pids[i] == interesting_pids[j])
+ PG_RETURN_BOOL(true);
+ }
+
+ /*
+ * Check if blocked_pid is waiting for a safe snapshot. We could in
+ * theory check the resulting array of blocker PIDs against the
+ * interesting PIDs list, but since there is no danger of autovacuum
+ * blocking GetSafeSnapshot there seems to be no point in expending cycles
+ * on allocating a buffer and searching for overlap; so it's presently
+ * sufficient for the isolation tester's purposes to use a single element
+ * buffer and check if the number of safe snapshot blockers is non-zero.
+ */
+ if (GetSafeSnapshotBlockingPids(blocked_pid, &dummy, 1) > 0)
+ PG_RETURN_BOOL(true);
+
+ PG_RETURN_BOOL(false);
+}
+
+
+/*
+ * Functions for manipulating advisory locks
+ *
+ * We make use of the locktag fields as follows:
+ *
+ * field1: MyDatabaseId ... ensures locks are local to each database
+ * field2: first of 2 int4 keys, or high-order half of an int8 key
+ * field3: second of 2 int4 keys, or low-order half of an int8 key
+ * field4: 1 if using an int8 key, 2 if using 2 int4 keys
+ */
+#define SET_LOCKTAG_INT64(tag, key64) \
+ SET_LOCKTAG_ADVISORY(tag, \
+ MyDatabaseId, \
+ (uint32) ((key64) >> 32), \
+ (uint32) (key64), \
+ 1)
+#define SET_LOCKTAG_INT32(tag, key1, key2) \
+ SET_LOCKTAG_ADVISORY(tag, MyDatabaseId, key1, key2, 2)
+
+/*
+ * pg_advisory_lock(int8) - acquire exclusive lock on an int8 key
+ */
+Datum
+pg_advisory_lock_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ (void) LockAcquire(&tag, ExclusiveLock, true, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_xact_lock(int8) - acquire xact scoped
+ * exclusive lock on an int8 key
+ */
+Datum
+pg_advisory_xact_lock_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ (void) LockAcquire(&tag, ExclusiveLock, false, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_lock_shared(int8) - acquire share lock on an int8 key
+ */
+Datum
+pg_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ (void) LockAcquire(&tag, ShareLock, true, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_xact_lock_shared(int8) - acquire xact scoped
+ * share lock on an int8 key
+ */
+Datum
+pg_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ (void) LockAcquire(&tag, ShareLock, false, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_try_advisory_lock(int8) - acquire exclusive lock on an int8 key, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_lock_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockAcquire(&tag, ExclusiveLock, true, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_xact_lock(int8) - acquire xact scoped
+ * exclusive lock on an int8 key, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_xact_lock_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockAcquire(&tag, ExclusiveLock, false, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_lock_shared(int8) - acquire share lock on an int8 key, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockAcquire(&tag, ShareLock, true, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_xact_lock_shared(int8) - acquire xact scoped
+ * share lock on an int8 key, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockAcquire(&tag, ShareLock, false, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_advisory_unlock(int8) - release exclusive lock on an int8 key
+ *
+ * Returns true if successful, false if lock was not held
+*/
+Datum
+pg_advisory_unlock_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ bool res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockRelease(&tag, ExclusiveLock, true);
+
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * pg_advisory_unlock_shared(int8) - release share lock on an int8 key
+ *
+ * Returns true if successful, false if lock was not held
+ */
+Datum
+pg_advisory_unlock_shared_int8(PG_FUNCTION_ARGS)
+{
+ int64 key = PG_GETARG_INT64(0);
+ LOCKTAG tag;
+ bool res;
+
+ SET_LOCKTAG_INT64(tag, key);
+
+ res = LockRelease(&tag, ShareLock, true);
+
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * pg_advisory_lock(int4, int4) - acquire exclusive lock on 2 int4 keys
+ */
+Datum
+pg_advisory_lock_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ (void) LockAcquire(&tag, ExclusiveLock, true, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_xact_lock(int4, int4) - acquire xact scoped
+ * exclusive lock on 2 int4 keys
+ */
+Datum
+pg_advisory_xact_lock_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ (void) LockAcquire(&tag, ExclusiveLock, false, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_lock_shared(int4, int4) - acquire share lock on 2 int4 keys
+ */
+Datum
+pg_advisory_lock_shared_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ (void) LockAcquire(&tag, ShareLock, true, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_advisory_xact_lock_shared(int4, int4) - acquire xact scoped
+ * share lock on 2 int4 keys
+ */
+Datum
+pg_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ (void) LockAcquire(&tag, ShareLock, false, false);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * pg_try_advisory_lock(int4, int4) - acquire exclusive lock on 2 int4 keys, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_lock_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockAcquire(&tag, ExclusiveLock, true, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_xact_lock(int4, int4) - acquire xact scoped
+ * exclusive lock on 2 int4 keys, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_xact_lock_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockAcquire(&tag, ExclusiveLock, false, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_lock_shared(int4, int4) - acquire share lock on 2 int4 keys, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_lock_shared_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockAcquire(&tag, ShareLock, true, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_try_advisory_xact_lock_shared(int4, int4) - acquire xact scoped
+ * share lock on 2 int4 keys, no wait
+ *
+ * Returns true if successful, false if lock not available
+ */
+Datum
+pg_try_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ LockAcquireResult res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockAcquire(&tag, ShareLock, false, true);
+
+ PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
+}
+
+/*
+ * pg_advisory_unlock(int4, int4) - release exclusive lock on 2 int4 keys
+ *
+ * Returns true if successful, false if lock was not held
+*/
+Datum
+pg_advisory_unlock_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ bool res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockRelease(&tag, ExclusiveLock, true);
+
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * pg_advisory_unlock_shared(int4, int4) - release share lock on 2 int4 keys
+ *
+ * Returns true if successful, false if lock was not held
+ */
+Datum
+pg_advisory_unlock_shared_int4(PG_FUNCTION_ARGS)
+{
+ int32 key1 = PG_GETARG_INT32(0);
+ int32 key2 = PG_GETARG_INT32(1);
+ LOCKTAG tag;
+ bool res;
+
+ SET_LOCKTAG_INT32(tag, key1, key2);
+
+ res = LockRelease(&tag, ShareLock, true);
+
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * pg_advisory_unlock_all() - release all advisory locks
+ */
+Datum
+pg_advisory_unlock_all(PG_FUNCTION_ARGS)
+{
+ LockReleaseSession(USER_LOCKMETHOD);
+
+ PG_RETURN_VOID();
+}
diff --git a/src/backend/utils/adt/mac.c b/src/backend/utils/adt/mac.c
new file mode 100644
index 0000000..ac7342c
--- /dev/null
+++ b/src/backend/utils/adt/mac.c
@@ -0,0 +1,531 @@
+/*-------------------------------------------------------------------------
+ *
+ * mac.c
+ * PostgreSQL type definitions for 6 byte, EUI-48, MAC addresses.
+ *
+ * Portions Copyright (c) 1998-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/mac.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "common/hashfn.h"
+#include "lib/hyperloglog.h"
+#include "libpq/pqformat.h"
+#include "port/pg_bswap.h"
+#include "utils/builtins.h"
+#include "utils/guc.h"
+#include "utils/inet.h"
+#include "utils/sortsupport.h"
+
+
+/*
+ * Utility macros used for sorting and comparing:
+ */
+
+#define hibits(addr) \
+ ((unsigned long)(((addr)->a<<16)|((addr)->b<<8)|((addr)->c)))
+
+#define lobits(addr) \
+ ((unsigned long)(((addr)->d<<16)|((addr)->e<<8)|((addr)->f)))
+
+/* sortsupport for macaddr */
+typedef struct
+{
+ int64 input_count; /* number of non-null values seen */
+ bool estimating; /* true if estimating cardinality */
+
+ hyperLogLogState abbr_card; /* cardinality estimator */
+} macaddr_sortsupport_state;
+
+static int macaddr_cmp_internal(macaddr *a1, macaddr *a2);
+static int macaddr_fast_cmp(Datum x, Datum y, SortSupport ssup);
+static bool macaddr_abbrev_abort(int memtupcount, SortSupport ssup);
+static Datum macaddr_abbrev_convert(Datum original, SortSupport ssup);
+
+/*
+ * MAC address reader. Accepts several common notations.
+ */
+
+Datum
+macaddr_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ macaddr *result;
+ int a,
+ b,
+ c,
+ d,
+ e,
+ f;
+ char junk[2];
+ int count;
+
+ /* %1s matches iff there is trailing non-whitespace garbage */
+
+ count = sscanf(str, "%x:%x:%x:%x:%x:%x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%x-%x-%x-%x-%x-%x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr",
+ str)));
+
+ if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
+ (c < 0) || (c > 255) || (d < 0) || (d > 255) ||
+ (e < 0) || (e > 255) || (f < 0) || (f > 255))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("invalid octet value in \"macaddr\" value: \"%s\"", str)));
+
+ result = (macaddr *) palloc(sizeof(macaddr));
+
+ result->a = a;
+ result->b = b;
+ result->c = c;
+ result->d = d;
+ result->e = e;
+ result->f = f;
+
+ PG_RETURN_MACADDR_P(result);
+}
+
+/*
+ * MAC address output function. Fixed format.
+ */
+
+Datum
+macaddr_out(PG_FUNCTION_ARGS)
+{
+ macaddr *addr = PG_GETARG_MACADDR_P(0);
+ char *result;
+
+ result = (char *) palloc(32);
+
+ snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
+ addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * macaddr_recv - converts external binary format to macaddr
+ *
+ * The external representation is just the six bytes, MSB first.
+ */
+Datum
+macaddr_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ macaddr *addr;
+
+ addr = (macaddr *) palloc(sizeof(macaddr));
+
+ addr->a = pq_getmsgbyte(buf);
+ addr->b = pq_getmsgbyte(buf);
+ addr->c = pq_getmsgbyte(buf);
+ addr->d = pq_getmsgbyte(buf);
+ addr->e = pq_getmsgbyte(buf);
+ addr->f = pq_getmsgbyte(buf);
+
+ PG_RETURN_MACADDR_P(addr);
+}
+
+/*
+ * macaddr_send - converts macaddr to binary format
+ */
+Datum
+macaddr_send(PG_FUNCTION_ARGS)
+{
+ macaddr *addr = PG_GETARG_MACADDR_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, addr->a);
+ pq_sendbyte(&buf, addr->b);
+ pq_sendbyte(&buf, addr->c);
+ pq_sendbyte(&buf, addr->d);
+ pq_sendbyte(&buf, addr->e);
+ pq_sendbyte(&buf, addr->f);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * Comparison function for sorting:
+ */
+
+static int
+macaddr_cmp_internal(macaddr *a1, macaddr *a2)
+{
+ if (hibits(a1) < hibits(a2))
+ return -1;
+ else if (hibits(a1) > hibits(a2))
+ return 1;
+ else if (lobits(a1) < lobits(a2))
+ return -1;
+ else if (lobits(a1) > lobits(a2))
+ return 1;
+ else
+ return 0;
+}
+
+Datum
+macaddr_cmp(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_INT32(macaddr_cmp_internal(a1, a2));
+}
+
+/*
+ * Boolean comparisons.
+ */
+
+Datum
+macaddr_lt(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) < 0);
+}
+
+Datum
+macaddr_le(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) <= 0);
+}
+
+Datum
+macaddr_eq(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) == 0);
+}
+
+Datum
+macaddr_ge(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) >= 0);
+}
+
+Datum
+macaddr_gt(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) > 0);
+}
+
+Datum
+macaddr_ne(PG_FUNCTION_ARGS)
+{
+ macaddr *a1 = PG_GETARG_MACADDR_P(0);
+ macaddr *a2 = PG_GETARG_MACADDR_P(1);
+
+ PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) != 0);
+}
+
+/*
+ * Support function for hash indexes on macaddr.
+ */
+Datum
+hashmacaddr(PG_FUNCTION_ARGS)
+{
+ macaddr *key = PG_GETARG_MACADDR_P(0);
+
+ return hash_any((unsigned char *) key, sizeof(macaddr));
+}
+
+Datum
+hashmacaddrextended(PG_FUNCTION_ARGS)
+{
+ macaddr *key = PG_GETARG_MACADDR_P(0);
+
+ return hash_any_extended((unsigned char *) key, sizeof(macaddr),
+ PG_GETARG_INT64(1));
+}
+
+/*
+ * Arithmetic functions: bitwise NOT, AND, OR.
+ */
+Datum
+macaddr_not(PG_FUNCTION_ARGS)
+{
+ macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *result;
+
+ result = (macaddr *) palloc(sizeof(macaddr));
+ result->a = ~addr->a;
+ result->b = ~addr->b;
+ result->c = ~addr->c;
+ result->d = ~addr->d;
+ result->e = ~addr->e;
+ result->f = ~addr->f;
+ PG_RETURN_MACADDR_P(result);
+}
+
+Datum
+macaddr_and(PG_FUNCTION_ARGS)
+{
+ macaddr *addr1 = PG_GETARG_MACADDR_P(0);
+ macaddr *addr2 = PG_GETARG_MACADDR_P(1);
+ macaddr *result;
+
+ result = (macaddr *) palloc(sizeof(macaddr));
+ result->a = addr1->a & addr2->a;
+ result->b = addr1->b & addr2->b;
+ result->c = addr1->c & addr2->c;
+ result->d = addr1->d & addr2->d;
+ result->e = addr1->e & addr2->e;
+ result->f = addr1->f & addr2->f;
+ PG_RETURN_MACADDR_P(result);
+}
+
+Datum
+macaddr_or(PG_FUNCTION_ARGS)
+{
+ macaddr *addr1 = PG_GETARG_MACADDR_P(0);
+ macaddr *addr2 = PG_GETARG_MACADDR_P(1);
+ macaddr *result;
+
+ result = (macaddr *) palloc(sizeof(macaddr));
+ result->a = addr1->a | addr2->a;
+ result->b = addr1->b | addr2->b;
+ result->c = addr1->c | addr2->c;
+ result->d = addr1->d | addr2->d;
+ result->e = addr1->e | addr2->e;
+ result->f = addr1->f | addr2->f;
+ PG_RETURN_MACADDR_P(result);
+}
+
+/*
+ * Truncation function to allow comparing mac manufacturers.
+ * From suggestion by Alex Pilosov <alex@pilosoft.com>
+ */
+Datum
+macaddr_trunc(PG_FUNCTION_ARGS)
+{
+ macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *result;
+
+ result = (macaddr *) palloc(sizeof(macaddr));
+
+ result->a = addr->a;
+ result->b = addr->b;
+ result->c = addr->c;
+ result->d = 0;
+ result->e = 0;
+ result->f = 0;
+
+ PG_RETURN_MACADDR_P(result);
+}
+
+/*
+ * SortSupport strategy function. Populates a SortSupport struct with the
+ * information necessary to use comparison by abbreviated keys.
+ */
+Datum
+macaddr_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = macaddr_fast_cmp;
+ ssup->ssup_extra = NULL;
+
+ if (ssup->abbreviate)
+ {
+ macaddr_sortsupport_state *uss;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ uss = palloc(sizeof(macaddr_sortsupport_state));
+ uss->input_count = 0;
+ uss->estimating = true;
+ initHyperLogLog(&uss->abbr_card, 10);
+
+ ssup->ssup_extra = uss;
+
+ ssup->comparator = ssup_datum_unsigned_cmp;
+ ssup->abbrev_converter = macaddr_abbrev_convert;
+ ssup->abbrev_abort = macaddr_abbrev_abort;
+ ssup->abbrev_full_comparator = macaddr_fast_cmp;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SortSupport "traditional" comparison function. Pulls two MAC addresses from
+ * the heap and runs a standard comparison on them.
+ */
+static int
+macaddr_fast_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ macaddr *arg1 = DatumGetMacaddrP(x);
+ macaddr *arg2 = DatumGetMacaddrP(y);
+
+ return macaddr_cmp_internal(arg1, arg2);
+}
+
+/*
+ * Callback for estimating effectiveness of abbreviated key optimization.
+ *
+ * We pay no attention to the cardinality of the non-abbreviated data, because
+ * there is no equality fast-path within authoritative macaddr comparator.
+ */
+static bool
+macaddr_abbrev_abort(int memtupcount, SortSupport ssup)
+{
+ macaddr_sortsupport_state *uss = ssup->ssup_extra;
+ double abbr_card;
+
+ if (memtupcount < 10000 || uss->input_count < 10000 || !uss->estimating)
+ return false;
+
+ abbr_card = estimateHyperLogLog(&uss->abbr_card);
+
+ /*
+ * If we have >100k distinct values, then even if we were sorting many
+ * billion rows we'd likely still break even, and the penalty of undoing
+ * that many rows of abbrevs would probably not be worth it. At this point
+ * we stop counting because we know that we're now fully committed.
+ */
+ if (abbr_card > 100000.0)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "macaddr_abbrev: estimation ends at cardinality %f"
+ " after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count, memtupcount);
+#endif
+ uss->estimating = false;
+ return false;
+ }
+
+ /*
+ * Target minimum cardinality is 1 per ~2k of non-null inputs. 0.5 row
+ * fudge factor allows us to abort earlier on genuinely pathological data
+ * where we've had exactly one abbreviated value in the first 2k
+ * (non-null) rows.
+ */
+ if (abbr_card < uss->input_count / 2000.0 + 0.5)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "macaddr_abbrev: aborting abbreviation at cardinality %f"
+ " below threshold %f after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count / 2000.0 + 0.5, uss->input_count,
+ memtupcount);
+#endif
+ return true;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "macaddr_abbrev: cardinality %f after " INT64_FORMAT
+ " values (%d rows)", abbr_card, uss->input_count, memtupcount);
+#endif
+
+ return false;
+}
+
+/*
+ * SortSupport conversion routine. Converts original macaddr representation
+ * to abbreviated key representation.
+ *
+ * Packs the bytes of a 6-byte MAC address into a Datum and treats it as an
+ * unsigned integer for purposes of comparison. On a 64-bit machine, there
+ * will be two zeroed bytes of padding. The integer is converted to native
+ * endianness to facilitate easy comparison.
+ */
+static Datum
+macaddr_abbrev_convert(Datum original, SortSupport ssup)
+{
+ macaddr_sortsupport_state *uss = ssup->ssup_extra;
+ macaddr *authoritative = DatumGetMacaddrP(original);
+ Datum res;
+
+ /*
+ * On a 64-bit machine, zero out the 8-byte datum and copy the 6 bytes of
+ * the MAC address in. There will be two bytes of zero padding on the end
+ * of the least significant bits.
+ */
+#if SIZEOF_DATUM == 8
+ memset(&res, 0, SIZEOF_DATUM);
+ memcpy(&res, authoritative, sizeof(macaddr));
+#else /* SIZEOF_DATUM != 8 */
+ memcpy(&res, authoritative, SIZEOF_DATUM);
+#endif
+ uss->input_count += 1;
+
+ /*
+ * Cardinality estimation. The estimate uses uint32, so on a 64-bit
+ * architecture, XOR the two 32-bit halves together to produce slightly
+ * more entropy. The two zeroed bytes won't have any practical impact on
+ * this operation.
+ */
+ if (uss->estimating)
+ {
+ uint32 tmp;
+
+#if SIZEOF_DATUM == 8
+ tmp = (uint32) res ^ (uint32) ((uint64) res >> 32);
+#else /* SIZEOF_DATUM != 8 */
+ tmp = (uint32) res;
+#endif
+
+ addHyperLogLog(&uss->abbr_card, DatumGetUInt32(hash_uint32(tmp)));
+ }
+
+ /*
+ * Byteswap on little-endian machines.
+ *
+ * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer
+ * 3-way comparator) works correctly on all platforms. Without this, the
+ * comparator would have to call memcmp() with a pair of pointers to the
+ * first byte of each abbreviated key, which is slower.
+ */
+ res = DatumBigEndianToNative(res);
+
+ return res;
+}
diff --git a/src/backend/utils/adt/mac8.c b/src/backend/utils/adt/mac8.c
new file mode 100644
index 0000000..24d219f
--- /dev/null
+++ b/src/backend/utils/adt/mac8.c
@@ -0,0 +1,577 @@
+/*-------------------------------------------------------------------------
+ *
+ * mac8.c
+ * PostgreSQL type definitions for 8 byte (EUI-64) MAC addresses.
+ *
+ * EUI-48 (6 byte) MAC addresses are accepted as input and are stored in
+ * EUI-64 format, with the 4th and 5th bytes set to FF and FE, respectively.
+ *
+ * Output is always in 8 byte (EUI-64) format.
+ *
+ * The following code is written with the assumption that the OUI field
+ * size is 24 bits.
+ *
+ * Portions Copyright (c) 1998-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/mac8.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "common/hashfn.h"
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+
+/*
+ * Utility macros used for sorting and comparing:
+ */
+#define hibits(addr) \
+ ((unsigned long)(((addr)->a<<24) | ((addr)->b<<16) | ((addr)->c<<8) | ((addr)->d)))
+
+#define lobits(addr) \
+ ((unsigned long)(((addr)->e<<24) | ((addr)->f<<16) | ((addr)->g<<8) | ((addr)->h)))
+
+static unsigned char hex2_to_uchar(const unsigned char *ptr, const unsigned char *str);
+
+static const signed char hexlookup[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+/*
+ * hex2_to_uchar - convert 2 hex digits to a byte (unsigned char)
+ *
+ * This will ereport() if the end of the string is reached ('\0' found), or if
+ * either character is not a valid hex digit.
+ *
+ * ptr is the pointer to where the digits to convert are in the string, str is
+ * the entire string, which is used only for error reporting.
+ */
+static inline unsigned char
+hex2_to_uchar(const unsigned char *ptr, const unsigned char *str)
+{
+ unsigned char ret = 0;
+ signed char lookup;
+
+ /* Handle the first character */
+ if (*ptr > 127)
+ goto invalid_input;
+
+ lookup = hexlookup[*ptr];
+ if (lookup < 0)
+ goto invalid_input;
+
+ ret = lookup << 4;
+
+ /* Move to the second character */
+ ptr++;
+
+ if (*ptr > 127)
+ goto invalid_input;
+
+ lookup = hexlookup[*ptr];
+ if (lookup < 0)
+ goto invalid_input;
+
+ ret += lookup;
+
+ return ret;
+
+invalid_input:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr8",
+ str)));
+
+ /* We do not actually reach here */
+ return 0;
+}
+
+/*
+ * MAC address (EUI-48 and EUI-64) reader. Accepts several common notations.
+ */
+Datum
+macaddr8_in(PG_FUNCTION_ARGS)
+{
+ const unsigned char *str = (unsigned char *) PG_GETARG_CSTRING(0);
+ const unsigned char *ptr = str;
+ macaddr8 *result;
+ unsigned char a = 0,
+ b = 0,
+ c = 0,
+ d = 0,
+ e = 0,
+ f = 0,
+ g = 0,
+ h = 0;
+ int count = 0;
+ unsigned char spacer = '\0';
+
+ /* skip leading spaces */
+ while (*ptr && isspace(*ptr))
+ ptr++;
+
+ /* digits must always come in pairs */
+ while (*ptr && *(ptr + 1))
+ {
+ /*
+ * Attempt to decode each byte, which must be 2 hex digits in a row.
+ * If either digit is not hex, hex2_to_uchar will throw ereport() for
+ * us. Either 6 or 8 byte MAC addresses are supported.
+ */
+
+ /* Attempt to collect a byte */
+ count++;
+
+ switch (count)
+ {
+ case 1:
+ a = hex2_to_uchar(ptr, str);
+ break;
+ case 2:
+ b = hex2_to_uchar(ptr, str);
+ break;
+ case 3:
+ c = hex2_to_uchar(ptr, str);
+ break;
+ case 4:
+ d = hex2_to_uchar(ptr, str);
+ break;
+ case 5:
+ e = hex2_to_uchar(ptr, str);
+ break;
+ case 6:
+ f = hex2_to_uchar(ptr, str);
+ break;
+ case 7:
+ g = hex2_to_uchar(ptr, str);
+ break;
+ case 8:
+ h = hex2_to_uchar(ptr, str);
+ break;
+ default:
+ /* must be trailing garbage... */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr8",
+ str)));
+ }
+
+ /* Move forward to where the next byte should be */
+ ptr += 2;
+
+ /* Check for a spacer, these are valid, anything else is not */
+ if (*ptr == ':' || *ptr == '-' || *ptr == '.')
+ {
+ /* remember the spacer used, if it changes then it isn't valid */
+ if (spacer == '\0')
+ spacer = *ptr;
+
+ /* Have to use the same spacer throughout */
+ else if (spacer != *ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr8",
+ str)));
+
+ /* move past the spacer */
+ ptr++;
+ }
+
+ /* allow trailing whitespace after if we have 6 or 8 bytes */
+ if (count == 6 || count == 8)
+ {
+ if (isspace(*ptr))
+ {
+ while (*++ptr && isspace(*ptr));
+
+ /* If we found a space and then non-space, it's invalid */
+ if (*ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr8",
+ str)));
+ }
+ }
+ }
+
+ /* Convert a 6 byte MAC address to macaddr8 */
+ if (count == 6)
+ {
+ h = f;
+ g = e;
+ f = d;
+
+ d = 0xFF;
+ e = 0xFE;
+ }
+ else if (count != 8)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"", "macaddr8",
+ str)));
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+
+ result->a = a;
+ result->b = b;
+ result->c = c;
+ result->d = d;
+ result->e = e;
+ result->f = f;
+ result->g = g;
+ result->h = h;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+/*
+ * MAC8 address (EUI-64) output function. Fixed format.
+ */
+Datum
+macaddr8_out(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ char *result;
+
+ result = (char *) palloc(32);
+
+ snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+ addr->a, addr->b, addr->c, addr->d,
+ addr->e, addr->f, addr->g, addr->h);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * macaddr8_recv - converts external binary format(EUI-48 and EUI-64) to macaddr8
+ *
+ * The external representation is just the eight bytes, MSB first.
+ */
+Datum
+macaddr8_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ macaddr8 *addr;
+
+ addr = (macaddr8 *) palloc0(sizeof(macaddr8));
+
+ addr->a = pq_getmsgbyte(buf);
+ addr->b = pq_getmsgbyte(buf);
+ addr->c = pq_getmsgbyte(buf);
+
+ if (buf->len == 6)
+ {
+ addr->d = 0xFF;
+ addr->e = 0xFE;
+ }
+ else
+ {
+ addr->d = pq_getmsgbyte(buf);
+ addr->e = pq_getmsgbyte(buf);
+ }
+
+ addr->f = pq_getmsgbyte(buf);
+ addr->g = pq_getmsgbyte(buf);
+ addr->h = pq_getmsgbyte(buf);
+
+ PG_RETURN_MACADDR8_P(addr);
+}
+
+/*
+ * macaddr8_send - converts macaddr8(EUI-64) to binary format
+ */
+Datum
+macaddr8_send(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, addr->a);
+ pq_sendbyte(&buf, addr->b);
+ pq_sendbyte(&buf, addr->c);
+ pq_sendbyte(&buf, addr->d);
+ pq_sendbyte(&buf, addr->e);
+ pq_sendbyte(&buf, addr->f);
+ pq_sendbyte(&buf, addr->g);
+ pq_sendbyte(&buf, addr->h);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * macaddr8_cmp_internal - comparison function for sorting:
+ */
+static int32
+macaddr8_cmp_internal(macaddr8 *a1, macaddr8 *a2)
+{
+ if (hibits(a1) < hibits(a2))
+ return -1;
+ else if (hibits(a1) > hibits(a2))
+ return 1;
+ else if (lobits(a1) < lobits(a2))
+ return -1;
+ else if (lobits(a1) > lobits(a2))
+ return 1;
+ else
+ return 0;
+}
+
+Datum
+macaddr8_cmp(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_INT32(macaddr8_cmp_internal(a1, a2));
+}
+
+/*
+ * Boolean comparison functions.
+ */
+
+Datum
+macaddr8_lt(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) < 0);
+}
+
+Datum
+macaddr8_le(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) <= 0);
+}
+
+Datum
+macaddr8_eq(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) == 0);
+}
+
+Datum
+macaddr8_ge(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) >= 0);
+}
+
+Datum
+macaddr8_gt(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) > 0);
+}
+
+Datum
+macaddr8_ne(PG_FUNCTION_ARGS)
+{
+ macaddr8 *a1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *a2 = PG_GETARG_MACADDR8_P(1);
+
+ PG_RETURN_BOOL(macaddr8_cmp_internal(a1, a2) != 0);
+}
+
+/*
+ * Support function for hash indexes on macaddr8.
+ */
+Datum
+hashmacaddr8(PG_FUNCTION_ARGS)
+{
+ macaddr8 *key = PG_GETARG_MACADDR8_P(0);
+
+ return hash_any((unsigned char *) key, sizeof(macaddr8));
+}
+
+Datum
+hashmacaddr8extended(PG_FUNCTION_ARGS)
+{
+ macaddr8 *key = PG_GETARG_MACADDR8_P(0);
+
+ return hash_any_extended((unsigned char *) key, sizeof(macaddr8),
+ PG_GETARG_INT64(1));
+}
+
+/*
+ * Arithmetic functions: bitwise NOT, AND, OR.
+ */
+Datum
+macaddr8_not(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+ result->a = ~addr->a;
+ result->b = ~addr->b;
+ result->c = ~addr->c;
+ result->d = ~addr->d;
+ result->e = ~addr->e;
+ result->f = ~addr->f;
+ result->g = ~addr->g;
+ result->h = ~addr->h;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+Datum
+macaddr8_and(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *addr2 = PG_GETARG_MACADDR8_P(1);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+ result->a = addr1->a & addr2->a;
+ result->b = addr1->b & addr2->b;
+ result->c = addr1->c & addr2->c;
+ result->d = addr1->d & addr2->d;
+ result->e = addr1->e & addr2->e;
+ result->f = addr1->f & addr2->f;
+ result->g = addr1->g & addr2->g;
+ result->h = addr1->h & addr2->h;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+Datum
+macaddr8_or(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr1 = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *addr2 = PG_GETARG_MACADDR8_P(1);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+ result->a = addr1->a | addr2->a;
+ result->b = addr1->b | addr2->b;
+ result->c = addr1->c | addr2->c;
+ result->d = addr1->d | addr2->d;
+ result->e = addr1->e | addr2->e;
+ result->f = addr1->f | addr2->f;
+ result->g = addr1->g | addr2->g;
+ result->h = addr1->h | addr2->h;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+/*
+ * Truncation function to allow comparing macaddr8 manufacturers.
+ */
+Datum
+macaddr8_trunc(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+
+ result->a = addr->a;
+ result->b = addr->b;
+ result->c = addr->c;
+ result->d = 0;
+ result->e = 0;
+ result->f = 0;
+ result->g = 0;
+ result->h = 0;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+/*
+ * Set 7th bit for modified EUI-64 as used in IPv6.
+ */
+Datum
+macaddr8_set7bit(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+
+ result->a = addr->a | 0x02;
+ result->b = addr->b;
+ result->c = addr->c;
+ result->d = addr->d;
+ result->e = addr->e;
+ result->f = addr->f;
+ result->g = addr->g;
+ result->h = addr->h;
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+/*----------------------------------------------------------
+ * Conversion operators.
+ *---------------------------------------------------------*/
+
+Datum
+macaddrtomacaddr8(PG_FUNCTION_ARGS)
+{
+ macaddr *addr6 = PG_GETARG_MACADDR_P(0);
+ macaddr8 *result;
+
+ result = (macaddr8 *) palloc0(sizeof(macaddr8));
+
+ result->a = addr6->a;
+ result->b = addr6->b;
+ result->c = addr6->c;
+ result->d = 0xFF;
+ result->e = 0xFE;
+ result->f = addr6->d;
+ result->g = addr6->e;
+ result->h = addr6->f;
+
+
+ PG_RETURN_MACADDR8_P(result);
+}
+
+Datum
+macaddr8tomacaddr(PG_FUNCTION_ARGS)
+{
+ macaddr8 *addr = PG_GETARG_MACADDR8_P(0);
+ macaddr *result;
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+
+ if ((addr->d != 0xFF) || (addr->e != 0xFE))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("macaddr8 data out of range to convert to macaddr"),
+ errhint("Only addresses that have FF and FE as values in the "
+ "4th and 5th bytes from the left, for example "
+ "xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted "
+ "from macaddr8 to macaddr.")));
+
+ result->a = addr->a;
+ result->b = addr->b;
+ result->c = addr->c;
+ result->d = addr->f;
+ result->e = addr->g;
+ result->f = addr->h;
+
+ PG_RETURN_MACADDR_P(result);
+}
diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c
new file mode 100644
index 0000000..04b7aa2
--- /dev/null
+++ b/src/backend/utils/adt/mcxtfuncs.c
@@ -0,0 +1,195 @@
+/*-------------------------------------------------------------------------
+ *
+ * mcxtfuncs.c
+ * Functions to show backend memory context.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/mcxtfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "mb/pg_wchar.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "utils/builtins.h"
+
+/* ----------
+ * The max bytes for showing identifiers of MemoryContext.
+ * ----------
+ */
+#define MEMORY_CONTEXT_IDENT_DISPLAY_SIZE 1024
+
+/*
+ * PutMemoryContextsStatsTupleStore
+ * One recursion level for pg_get_backend_memory_contexts.
+ */
+static void
+PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore,
+ TupleDesc tupdesc, MemoryContext context,
+ const char *parent, int level)
+{
+#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS 9
+
+ Datum values[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS];
+ bool nulls[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS];
+ MemoryContextCounters stat;
+ MemoryContext child;
+ const char *name;
+ const char *ident;
+
+ AssertArg(MemoryContextIsValid(context));
+
+ name = context->name;
+ ident = context->ident;
+
+ /*
+ * To be consistent with logging output, we label dynahash contexts with
+ * just the hash table name as with MemoryContextStatsPrint().
+ */
+ if (ident && strcmp(name, "dynahash") == 0)
+ {
+ name = ident;
+ ident = NULL;
+ }
+
+ /* Examine the context itself */
+ memset(&stat, 0, sizeof(stat));
+ (*context->methods->stats) (context, NULL, (void *) &level, &stat, true);
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
+
+ if (name)
+ values[0] = CStringGetTextDatum(name);
+ else
+ nulls[0] = true;
+
+ if (ident)
+ {
+ int idlen = strlen(ident);
+ char clipped_ident[MEMORY_CONTEXT_IDENT_DISPLAY_SIZE];
+
+ /*
+ * Some identifiers such as SQL query string can be very long,
+ * truncate oversize identifiers.
+ */
+ if (idlen >= MEMORY_CONTEXT_IDENT_DISPLAY_SIZE)
+ idlen = pg_mbcliplen(ident, idlen, MEMORY_CONTEXT_IDENT_DISPLAY_SIZE - 1);
+
+ memcpy(clipped_ident, ident, idlen);
+ clipped_ident[idlen] = '\0';
+ values[1] = CStringGetTextDatum(clipped_ident);
+ }
+ else
+ nulls[1] = true;
+
+ if (parent)
+ values[2] = CStringGetTextDatum(parent);
+ else
+ nulls[2] = true;
+
+ values[3] = Int32GetDatum(level);
+ values[4] = Int64GetDatum(stat.totalspace);
+ values[5] = Int64GetDatum(stat.nblocks);
+ values[6] = Int64GetDatum(stat.freespace);
+ values[7] = Int64GetDatum(stat.freechunks);
+ values[8] = Int64GetDatum(stat.totalspace - stat.freespace);
+ tuplestore_putvalues(tupstore, tupdesc, values, nulls);
+
+ for (child = context->firstchild; child != NULL; child = child->nextchild)
+ {
+ PutMemoryContextsStatsTupleStore(tupstore, tupdesc,
+ child, name, level + 1);
+ }
+}
+
+/*
+ * pg_get_backend_memory_contexts
+ * SQL SRF showing backend memory context.
+ */
+Datum
+pg_get_backend_memory_contexts(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ InitMaterializedSRF(fcinfo, 0);
+ PutMemoryContextsStatsTupleStore(rsinfo->setResult, rsinfo->setDesc,
+ TopMemoryContext, NULL, 0);
+
+ return (Datum) 0;
+}
+
+/*
+ * pg_log_backend_memory_contexts
+ * Signal a backend or an auxiliary process to log its memory contexts.
+ *
+ * By default, only superusers are allowed to signal to log the memory
+ * contexts because allowing any users to issue this request at an unbounded
+ * rate would cause lots of log messages and which can lead to denial of
+ * service. Additional roles can be permitted with GRANT.
+ *
+ * On receipt of this signal, a backend or an auxiliary process sets the flag
+ * in the signal handler, which causes the next CHECK_FOR_INTERRUPTS()
+ * or process-specific interrupt handler to log the memory contexts.
+ */
+Datum
+pg_log_backend_memory_contexts(PG_FUNCTION_ARGS)
+{
+ int pid = PG_GETARG_INT32(0);
+ PGPROC *proc;
+ BackendId backendId = InvalidBackendId;
+
+ proc = BackendPidGetProc(pid);
+
+ /*
+ * See if the process with given pid is a backend or an auxiliary process.
+ *
+ * If the given process is a backend, use its backend id in
+ * SendProcSignal() later to speed up the operation. Otherwise, don't do
+ * that because auxiliary processes (except the startup process) don't
+ * have a valid backend id.
+ */
+ if (proc != NULL)
+ backendId = proc->backendId;
+ else
+ proc = AuxiliaryPidGetProc(pid);
+
+ /*
+ * BackendPidGetProc() and AuxiliaryPidGetProc() return NULL if the pid
+ * isn't valid; but by the time we reach kill(), a process for which we
+ * get a valid proc here might have terminated on its own. There's no way
+ * to acquire a lock on an arbitrary process to prevent that. But since
+ * this mechanism is usually used to debug a backend or an auxiliary
+ * process running and consuming lots of memory, that it might end on its
+ * own first and its memory contexts are not logged is not a problem.
+ */
+ if (proc == NULL)
+ {
+ /*
+ * This is just a warning so a loop-through-resultset will not abort
+ * if one backend terminated on its own during the run.
+ */
+ ereport(WARNING,
+ (errmsg("PID %d is not a PostgreSQL server process", pid)));
+ PG_RETURN_BOOL(false);
+ }
+
+ if (SendProcSignal(pid, PROCSIG_LOG_MEMORY_CONTEXT, backendId) < 0)
+ {
+ /* Again, just a warning to allow loops */
+ ereport(WARNING,
+ (errmsg("could not send signal to process %d: %m", pid)));
+ PG_RETURN_BOOL(false);
+ }
+
+ PG_RETURN_BOOL(true);
+}
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
new file mode 100644
index 0000000..6d8fa92
--- /dev/null
+++ b/src/backend/utils/adt/misc.c
@@ -0,0 +1,950 @@
+/*-------------------------------------------------------------------------
+ *
+ * misc.c
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/misc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#include "access/sysattr.h"
+#include "access/table.h"
+#include "catalog/catalog.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/pg_type.h"
+#include "catalog/system_fk_info.h"
+#include "commands/dbcommands.h"
+#include "commands/tablespace.h"
+#include "common/keywords.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "parser/scansup.h"
+#include "pgstat.h"
+#include "postmaster/syslogger.h"
+#include "rewrite/rewriteHandler.h"
+#include "storage/fd.h"
+#include "storage/latch.h"
+#include "tcop/tcopprot.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
+#include "utils/ruleutils.h"
+#include "utils/timestamp.h"
+
+/*
+ * Common subroutine for num_nulls() and num_nonnulls().
+ * Returns true if successful, false if function should return NULL.
+ * If successful, total argument count and number of nulls are
+ * returned into *nargs and *nulls.
+ */
+static bool
+count_nulls(FunctionCallInfo fcinfo,
+ int32 *nargs, int32 *nulls)
+{
+ int32 count = 0;
+ int i;
+
+ /* Did we get a VARIADIC array argument, or separate arguments? */
+ if (get_fn_expr_variadic(fcinfo->flinfo))
+ {
+ ArrayType *arr;
+ int ndims,
+ nitems,
+ *dims;
+ bits8 *bitmap;
+
+ Assert(PG_NARGS() == 1);
+
+ /*
+ * If we get a null as VARIADIC array argument, we can't say anything
+ * useful about the number of elements, so return NULL. This behavior
+ * is consistent with other variadic functions - see concat_internal.
+ */
+ if (PG_ARGISNULL(0))
+ return false;
+
+ /*
+ * Non-null argument had better be an array. We assume that any call
+ * context that could let get_fn_expr_variadic return true will have
+ * checked that a VARIADIC-labeled parameter actually is an array. So
+ * it should be okay to just Assert that it's an array rather than
+ * doing a full-fledged error check.
+ */
+ Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, 0))));
+
+ /* OK, safe to fetch the array value */
+ arr = PG_GETARG_ARRAYTYPE_P(0);
+
+ /* Count the array elements */
+ ndims = ARR_NDIM(arr);
+ dims = ARR_DIMS(arr);
+ nitems = ArrayGetNItems(ndims, dims);
+
+ /* Count those that are NULL */
+ bitmap = ARR_NULLBITMAP(arr);
+ if (bitmap)
+ {
+ int bitmask = 1;
+
+ for (i = 0; i < nitems; i++)
+ {
+ if ((*bitmap & bitmask) == 0)
+ count++;
+
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ bitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+
+ *nargs = nitems;
+ *nulls = count;
+ }
+ else
+ {
+ /* Separate arguments, so just count 'em */
+ for (i = 0; i < PG_NARGS(); i++)
+ {
+ if (PG_ARGISNULL(i))
+ count++;
+ }
+
+ *nargs = PG_NARGS();
+ *nulls = count;
+ }
+
+ return true;
+}
+
+/*
+ * num_nulls()
+ * Count the number of NULL arguments
+ */
+Datum
+pg_num_nulls(PG_FUNCTION_ARGS)
+{
+ int32 nargs,
+ nulls;
+
+ if (!count_nulls(fcinfo, &nargs, &nulls))
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(nulls);
+}
+
+/*
+ * num_nonnulls()
+ * Count the number of non-NULL arguments
+ */
+Datum
+pg_num_nonnulls(PG_FUNCTION_ARGS)
+{
+ int32 nargs,
+ nulls;
+
+ if (!count_nulls(fcinfo, &nargs, &nulls))
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(nargs - nulls);
+}
+
+
+/*
+ * current_database()
+ * Expose the current database to the user
+ */
+Datum
+current_database(PG_FUNCTION_ARGS)
+{
+ Name db;
+
+ db = (Name) palloc(NAMEDATALEN);
+
+ namestrcpy(db, get_database_name(MyDatabaseId));
+ PG_RETURN_NAME(db);
+}
+
+
+/*
+ * current_query()
+ * Expose the current query to the user (useful in stored procedures)
+ * We might want to use ActivePortal->sourceText someday.
+ */
+Datum
+current_query(PG_FUNCTION_ARGS)
+{
+ /* there is no easy way to access the more concise 'query_string' */
+ if (debug_query_string)
+ PG_RETURN_TEXT_P(cstring_to_text(debug_query_string));
+ else
+ PG_RETURN_NULL();
+}
+
+/* Function to find out which databases make use of a tablespace */
+
+Datum
+pg_tablespace_databases(PG_FUNCTION_ARGS)
+{
+ Oid tablespaceOid = PG_GETARG_OID(0);
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ char *location;
+ DIR *dirdesc;
+ struct dirent *de;
+
+ InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC);
+
+ if (tablespaceOid == GLOBALTABLESPACE_OID)
+ {
+ ereport(WARNING,
+ (errmsg("global tablespace never has databases")));
+ /* return empty tuplestore */
+ return (Datum) 0;
+ }
+
+ if (tablespaceOid == DEFAULTTABLESPACE_OID)
+ location = psprintf("base");
+ else
+ location = psprintf("pg_tblspc/%u/%s", tablespaceOid,
+ TABLESPACE_VERSION_DIRECTORY);
+
+ dirdesc = AllocateDir(location);
+
+ if (!dirdesc)
+ {
+ /* the only expected error is ENOENT */
+ if (errno != ENOENT)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open directory \"%s\": %m",
+ location)));
+ ereport(WARNING,
+ (errmsg("%u is not a tablespace OID", tablespaceOid)));
+ /* return empty tuplestore */
+ return (Datum) 0;
+ }
+
+ while ((de = ReadDir(dirdesc, location)) != NULL)
+ {
+ Oid datOid = atooid(de->d_name);
+ char *subdir;
+ bool isempty;
+ Datum values[1];
+ bool nulls[1];
+
+ /* this test skips . and .., but is awfully weak */
+ if (!datOid)
+ continue;
+
+ /* if database subdir is empty, don't report tablespace as used */
+
+ subdir = psprintf("%s/%s", location, de->d_name);
+ isempty = directory_is_empty(subdir);
+ pfree(subdir);
+
+ if (isempty)
+ continue; /* indeed, nothing in it */
+
+ values[0] = ObjectIdGetDatum(datOid);
+ nulls[0] = false;
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc,
+ values, nulls);
+ }
+
+ FreeDir(dirdesc);
+ return (Datum) 0;
+}
+
+
+/*
+ * pg_tablespace_location - get location for a tablespace
+ */
+Datum
+pg_tablespace_location(PG_FUNCTION_ARGS)
+{
+ Oid tablespaceOid = PG_GETARG_OID(0);
+ char sourcepath[MAXPGPATH];
+ char targetpath[MAXPGPATH];
+ int rllen;
+#ifndef WIN32
+ struct stat st;
+#endif
+
+ /*
+ * It's useful to apply this function to pg_class.reltablespace, wherein
+ * zero means "the database's default tablespace". So, rather than
+ * throwing an error for zero, we choose to assume that's what is meant.
+ */
+ if (tablespaceOid == InvalidOid)
+ tablespaceOid = MyDatabaseTableSpace;
+
+ /*
+ * Return empty string for the cluster's default tablespaces
+ */
+ if (tablespaceOid == DEFAULTTABLESPACE_OID ||
+ tablespaceOid == GLOBALTABLESPACE_OID)
+ PG_RETURN_TEXT_P(cstring_to_text(""));
+
+#if defined(HAVE_READLINK) || defined(WIN32)
+
+ /*
+ * Find the location of the tablespace by reading the symbolic link that
+ * is in pg_tblspc/<oid>.
+ */
+ snprintf(sourcepath, sizeof(sourcepath), "pg_tblspc/%u", tablespaceOid);
+
+ /*
+ * Before reading the link, check if the source path is a link or a
+ * junction point. Note that a directory is possible for a tablespace
+ * created with allow_in_place_tablespaces enabled. If a directory is
+ * found, a relative path to the data directory is returned.
+ */
+#ifdef WIN32
+ if (!pgwin32_is_junction(sourcepath))
+ PG_RETURN_TEXT_P(cstring_to_text(sourcepath));
+#else
+ if (lstat(sourcepath, &st) < 0)
+ {
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m",
+ sourcepath)));
+ }
+
+ if (!S_ISLNK(st.st_mode))
+ PG_RETURN_TEXT_P(cstring_to_text(sourcepath));
+#endif
+
+ /*
+ * In presence of a link or a junction point, return the path pointing to.
+ */
+ rllen = readlink(sourcepath, targetpath, sizeof(targetpath));
+ if (rllen < 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read symbolic link \"%s\": %m",
+ sourcepath)));
+ if (rllen >= sizeof(targetpath))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("symbolic link \"%s\" target is too long",
+ sourcepath)));
+ targetpath[rllen] = '\0';
+
+ PG_RETURN_TEXT_P(cstring_to_text(targetpath));
+#else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("tablespaces are not supported on this platform")));
+ PG_RETURN_NULL();
+#endif
+}
+
+/*
+ * pg_sleep - delay for N seconds
+ */
+Datum
+pg_sleep(PG_FUNCTION_ARGS)
+{
+ float8 secs = PG_GETARG_FLOAT8(0);
+ float8 endtime;
+
+ /*
+ * We sleep using WaitLatch, to ensure that we'll wake up promptly if an
+ * important signal (such as SIGALRM or SIGINT) arrives. Because
+ * WaitLatch's upper limit of delay is INT_MAX milliseconds, and the user
+ * might ask for more than that, we sleep for at most 10 minutes and then
+ * loop.
+ *
+ * By computing the intended stop time initially, we avoid accumulation of
+ * extra delay across multiple sleeps. This also ensures we won't delay
+ * less than the specified time when WaitLatch is terminated early by a
+ * non-query-canceling signal such as SIGHUP.
+ */
+#define GetNowFloat() ((float8) GetCurrentTimestamp() / 1000000.0)
+
+ endtime = GetNowFloat() + secs;
+
+ for (;;)
+ {
+ float8 delay;
+ long delay_ms;
+
+ CHECK_FOR_INTERRUPTS();
+
+ delay = endtime - GetNowFloat();
+ if (delay >= 600.0)
+ delay_ms = 600000;
+ else if (delay > 0.0)
+ delay_ms = (long) ceil(delay * 1000.0);
+ else
+ break;
+
+ (void) WaitLatch(MyLatch,
+ WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
+ delay_ms,
+ WAIT_EVENT_PG_SLEEP);
+ ResetLatch(MyLatch);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/* Function to return the list of grammar keywords */
+Datum
+pg_get_keywords(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcontext;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ tupdesc = CreateTemplateTupleDesc(5);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "word",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "catcode",
+ CHAROID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "barelabel",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "catdesc",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "baredesc",
+ TEXTOID, -1, 0);
+
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+
+ if (funcctx->call_cntr < ScanKeywords.num_keywords)
+ {
+ char *values[5];
+ HeapTuple tuple;
+
+ /* cast-away-const is ugly but alternatives aren't much better */
+ values[0] = unconstify(char *,
+ GetScanKeyword(funcctx->call_cntr,
+ &ScanKeywords));
+
+ switch (ScanKeywordCategories[funcctx->call_cntr])
+ {
+ case UNRESERVED_KEYWORD:
+ values[1] = "U";
+ values[3] = _("unreserved");
+ break;
+ case COL_NAME_KEYWORD:
+ values[1] = "C";
+ values[3] = _("unreserved (cannot be function or type name)");
+ break;
+ case TYPE_FUNC_NAME_KEYWORD:
+ values[1] = "T";
+ values[3] = _("reserved (can be function or type name)");
+ break;
+ case RESERVED_KEYWORD:
+ values[1] = "R";
+ values[3] = _("reserved");
+ break;
+ default: /* shouldn't be possible */
+ values[1] = NULL;
+ values[3] = NULL;
+ break;
+ }
+
+ if (ScanKeywordBareLabel[funcctx->call_cntr])
+ {
+ values[2] = "true";
+ values[4] = _("can be bare label");
+ }
+ else
+ {
+ values[2] = "false";
+ values[4] = _("requires AS");
+ }
+
+ tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
+
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/* Function to return the list of catalog foreign key relationships */
+Datum
+pg_get_catalog_foreign_keys(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ FmgrInfo *arrayinp;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcontext;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ tupdesc = CreateTemplateTupleDesc(6);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "fktable",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "fkcols",
+ TEXTARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "pktable",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "pkcols",
+ TEXTARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "is_array",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "is_opt",
+ BOOLOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ /*
+ * We use array_in to convert the C strings in sys_fk_relationships[]
+ * to text arrays. But we cannot use DirectFunctionCallN to call
+ * array_in, and it wouldn't be very efficient if we could. Fill an
+ * FmgrInfo to use for the call.
+ */
+ arrayinp = (FmgrInfo *) palloc(sizeof(FmgrInfo));
+ fmgr_info(F_ARRAY_IN, arrayinp);
+ funcctx->user_fctx = arrayinp;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ arrayinp = (FmgrInfo *) funcctx->user_fctx;
+
+ if (funcctx->call_cntr < lengthof(sys_fk_relationships))
+ {
+ const SysFKRelationship *fkrel = &sys_fk_relationships[funcctx->call_cntr];
+ Datum values[6];
+ bool nulls[6];
+ HeapTuple tuple;
+
+ memset(nulls, false, sizeof(nulls));
+
+ values[0] = ObjectIdGetDatum(fkrel->fk_table);
+ values[1] = FunctionCall3(arrayinp,
+ CStringGetDatum(fkrel->fk_columns),
+ ObjectIdGetDatum(TEXTOID),
+ Int32GetDatum(-1));
+ values[2] = ObjectIdGetDatum(fkrel->pk_table);
+ values[3] = FunctionCall3(arrayinp,
+ CStringGetDatum(fkrel->pk_columns),
+ ObjectIdGetDatum(TEXTOID),
+ Int32GetDatum(-1));
+ values[4] = BoolGetDatum(fkrel->is_array);
+ values[5] = BoolGetDatum(fkrel->is_opt);
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/*
+ * Return the type of the argument.
+ */
+Datum
+pg_typeof(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_OID(get_fn_expr_argtype(fcinfo->flinfo, 0));
+}
+
+
+/*
+ * Implementation of the COLLATE FOR expression; returns the collation
+ * of the argument.
+ */
+Datum
+pg_collation_for(PG_FUNCTION_ARGS)
+{
+ Oid typeid;
+ Oid collid;
+
+ typeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+ if (!typeid)
+ PG_RETURN_NULL();
+ if (!type_is_collatable(typeid) && typeid != UNKNOWNOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("collations are not supported by type %s",
+ format_type_be(typeid))));
+
+ collid = PG_GET_COLLATION();
+ if (!collid)
+ PG_RETURN_NULL();
+ PG_RETURN_TEXT_P(cstring_to_text(generate_collation_name(collid)));
+}
+
+
+/*
+ * pg_relation_is_updatable - determine which update events the specified
+ * relation supports.
+ *
+ * This relies on relation_is_updatable() in rewriteHandler.c, which see
+ * for additional information.
+ */
+Datum
+pg_relation_is_updatable(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+ bool include_triggers = PG_GETARG_BOOL(1);
+
+ PG_RETURN_INT32(relation_is_updatable(reloid, NIL, include_triggers, NULL));
+}
+
+/*
+ * pg_column_is_updatable - determine whether a column is updatable
+ *
+ * This function encapsulates the decision about just what
+ * information_schema.columns.is_updatable actually means. It's not clear
+ * whether deletability of the column's relation should be required, so
+ * we want that decision in C code where we could change it without initdb.
+ */
+Datum
+pg_column_is_updatable(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+ AttrNumber attnum = PG_GETARG_INT16(1);
+ AttrNumber col = attnum - FirstLowInvalidHeapAttributeNumber;
+ bool include_triggers = PG_GETARG_BOOL(2);
+ int events;
+
+ /* System columns are never updatable */
+ if (attnum <= 0)
+ PG_RETURN_BOOL(false);
+
+ events = relation_is_updatable(reloid, NIL, include_triggers,
+ bms_make_singleton(col));
+
+ /* We require both updatability and deletability of the relation */
+#define REQ_EVENTS ((1 << CMD_UPDATE) | (1 << CMD_DELETE))
+
+ PG_RETURN_BOOL((events & REQ_EVENTS) == REQ_EVENTS);
+}
+
+
+/*
+ * Is character a valid identifier start?
+ * Must match scan.l's {ident_start} character class.
+ */
+static bool
+is_ident_start(unsigned char c)
+{
+ /* Underscores and ASCII letters are OK */
+ if (c == '_')
+ return true;
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
+ return true;
+ /* Any high-bit-set character is OK (might be part of a multibyte char) */
+ if (IS_HIGHBIT_SET(c))
+ return true;
+ return false;
+}
+
+/*
+ * Is character a valid identifier continuation?
+ * Must match scan.l's {ident_cont} character class.
+ */
+static bool
+is_ident_cont(unsigned char c)
+{
+ /* Can be digit or dollar sign ... */
+ if ((c >= '0' && c <= '9') || c == '$')
+ return true;
+ /* ... or an identifier start character */
+ return is_ident_start(c);
+}
+
+/*
+ * parse_ident - parse a SQL qualified identifier into separate identifiers.
+ * When strict mode is active (second parameter), then any chars after
+ * the last identifier are disallowed.
+ */
+Datum
+parse_ident(PG_FUNCTION_ARGS)
+{
+ text *qualname = PG_GETARG_TEXT_PP(0);
+ bool strict = PG_GETARG_BOOL(1);
+ char *qualname_str = text_to_cstring(qualname);
+ ArrayBuildState *astate = NULL;
+ char *nextp;
+ bool after_dot = false;
+
+ /*
+ * The code below scribbles on qualname_str in some cases, so we should
+ * reconvert qualname if we need to show the original string in error
+ * messages.
+ */
+ nextp = qualname_str;
+
+ /* skip leading whitespace */
+ while (scanner_isspace(*nextp))
+ nextp++;
+
+ for (;;)
+ {
+ char *curname;
+ bool missing_ident = true;
+
+ if (*nextp == '"')
+ {
+ char *endp;
+
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname)),
+ errdetail("String has unclosed double quotes.")));
+ if (endp[1] != '"')
+ break;
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ nextp = endp + 1;
+ *endp = '\0';
+
+ if (endp - curname == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname)),
+ errdetail("Quoted identifier must not be empty.")));
+
+ astate = accumArrayResult(astate, CStringGetTextDatum(curname),
+ false, TEXTOID, CurrentMemoryContext);
+ missing_ident = false;
+ }
+ else if (is_ident_start((unsigned char) *nextp))
+ {
+ char *downname;
+ int len;
+ text *part;
+
+ curname = nextp++;
+ while (is_ident_cont((unsigned char) *nextp))
+ nextp++;
+
+ len = nextp - curname;
+
+ /*
+ * We don't implicitly truncate identifiers. This is useful for
+ * allowing the user to check for specific parts of the identifier
+ * being too long. It's easy enough for the user to get the
+ * truncated names by casting our output to name[].
+ */
+ downname = downcase_identifier(curname, len, false, false);
+ part = cstring_to_text_with_len(downname, len);
+ astate = accumArrayResult(astate, PointerGetDatum(part), false,
+ TEXTOID, CurrentMemoryContext);
+ missing_ident = false;
+ }
+
+ if (missing_ident)
+ {
+ /* Different error messages based on where we failed. */
+ if (*nextp == '.')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname)),
+ errdetail("No valid identifier before \".\".")));
+ else if (after_dot)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname)),
+ errdetail("No valid identifier after \".\".")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname))));
+ }
+
+ while (scanner_isspace(*nextp))
+ nextp++;
+
+ if (*nextp == '.')
+ {
+ after_dot = true;
+ nextp++;
+ while (scanner_isspace(*nextp))
+ nextp++;
+ }
+ else if (*nextp == '\0')
+ {
+ break;
+ }
+ else
+ {
+ if (strict)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("string is not a valid identifier: \"%s\"",
+ text_to_cstring(qualname))));
+ break;
+ }
+ }
+
+ PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext));
+}
+
+/*
+ * pg_current_logfile
+ *
+ * Report current log file used by log collector by scanning current_logfiles.
+ */
+Datum
+pg_current_logfile(PG_FUNCTION_ARGS)
+{
+ FILE *fd;
+ char lbuffer[MAXPGPATH];
+ char *logfmt;
+
+ /* The log format parameter is optional */
+ if (PG_NARGS() == 0 || PG_ARGISNULL(0))
+ logfmt = NULL;
+ else
+ {
+ logfmt = text_to_cstring(PG_GETARG_TEXT_PP(0));
+
+ if (strcmp(logfmt, "stderr") != 0 &&
+ strcmp(logfmt, "csvlog") != 0 &&
+ strcmp(logfmt, "jsonlog") != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("log format \"%s\" is not supported", logfmt),
+ errhint("The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\".")));
+ }
+
+ fd = AllocateFile(LOG_METAINFO_DATAFILE, "r");
+ if (fd == NULL)
+ {
+ if (errno != ENOENT)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read file \"%s\": %m",
+ LOG_METAINFO_DATAFILE)));
+ PG_RETURN_NULL();
+ }
+
+#ifdef WIN32
+ /* syslogger.c writes CRLF line endings on Windows */
+ _setmode(_fileno(fd), _O_TEXT);
+#endif
+
+ /*
+ * Read the file to gather current log filename(s) registered by the
+ * syslogger.
+ */
+ while (fgets(lbuffer, sizeof(lbuffer), fd) != NULL)
+ {
+ char *log_format;
+ char *log_filepath;
+ char *nlpos;
+
+ /* Extract log format and log file path from the line. */
+ log_format = lbuffer;
+ log_filepath = strchr(lbuffer, ' ');
+ if (log_filepath == NULL)
+ {
+ /* Uh oh. No space found, so file content is corrupted. */
+ elog(ERROR,
+ "missing space character in \"%s\"", LOG_METAINFO_DATAFILE);
+ break;
+ }
+
+ *log_filepath = '\0';
+ log_filepath++;
+ nlpos = strchr(log_filepath, '\n');
+ if (nlpos == NULL)
+ {
+ /* Uh oh. No newline found, so file content is corrupted. */
+ elog(ERROR,
+ "missing newline character in \"%s\"", LOG_METAINFO_DATAFILE);
+ break;
+ }
+ *nlpos = '\0';
+
+ if (logfmt == NULL || strcmp(logfmt, log_format) == 0)
+ {
+ FreeFile(fd);
+ PG_RETURN_TEXT_P(cstring_to_text(log_filepath));
+ }
+ }
+
+ /* Close the current log filename file. */
+ FreeFile(fd);
+
+ PG_RETURN_NULL();
+}
+
+/*
+ * Report current log file used by log collector (1 argument version)
+ *
+ * note: this wrapper is necessary to pass the sanity check in opr_sanity,
+ * which checks that all built-in functions that share the implementing C
+ * function take the same number of arguments
+ */
+Datum
+pg_current_logfile_1arg(PG_FUNCTION_ARGS)
+{
+ return pg_current_logfile(fcinfo);
+}
+
+/*
+ * SQL wrapper around RelationGetReplicaIndex().
+ */
+Datum
+pg_get_replica_identity_index(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+ Oid idxoid;
+ Relation rel;
+
+ rel = table_open(reloid, AccessShareLock);
+ idxoid = RelationGetReplicaIndex(rel);
+ table_close(rel, AccessShareLock);
+
+ if (OidIsValid(idxoid))
+ PG_RETURN_OID(idxoid);
+ else
+ PG_RETURN_NULL();
+}
diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
new file mode 100644
index 0000000..da5c7d0
--- /dev/null
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -0,0 +1,2920 @@
+/*-------------------------------------------------------------------------
+ *
+ * multirangetypes.c
+ * I/O functions, operators, and support functions for multirange types.
+ *
+ * The stored (serialized) format of a multirange value is:
+ *
+ * 12 bytes: MultirangeType struct including varlena header, multirange
+ * type's OID and the number of ranges in the multirange.
+ * 4 * (rangesCount - 1) bytes: 32-bit items pointing to the each range
+ * in the multirange starting from
+ * the second one.
+ * 1 * rangesCount bytes : 8-bit flags for each range in the multirange
+ * The rest of the multirange are range bound values pointed by multirange
+ * items.
+ *
+ * Majority of items contain lengths of corresponding range bound values.
+ * Thanks to that items are typically low numbers. This makes multiranges
+ * compression-friendly. Every MULTIRANGE_ITEM_OFFSET_STRIDE item contains
+ * an offset of the corresponding range bound values. That allows fast lookups
+ * for a particular range index. Offsets are counted starting from the end of
+ * flags aligned to the bound type.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/multirangetypes.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/tupmacs.h"
+#include "common/hashfn.h"
+#include "funcapi.h"
+#include "lib/stringinfo.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "port/pg_bitutils.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/rangetypes.h"
+#include "utils/multirangetypes.h"
+#include "utils/array.h"
+#include "utils/memutils.h"
+
+/* fn_extra cache entry for one of the range I/O functions */
+typedef struct MultirangeIOData
+{
+ TypeCacheEntry *typcache; /* multirange type's typcache entry */
+ FmgrInfo typioproc; /* range type's I/O proc */
+ Oid typioparam; /* range type's I/O parameter */
+} MultirangeIOData;
+
+typedef enum
+{
+ MULTIRANGE_BEFORE_RANGE,
+ MULTIRANGE_IN_RANGE,
+ MULTIRANGE_IN_RANGE_ESCAPED,
+ MULTIRANGE_IN_RANGE_QUOTED,
+ MULTIRANGE_IN_RANGE_QUOTED_ESCAPED,
+ MULTIRANGE_AFTER_RANGE,
+ MULTIRANGE_FINISHED,
+} MultirangeParseState;
+
+/*
+ * Macros for accessing past MultirangeType parts of multirange: items, flags
+ * and boundaries.
+ */
+#define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
+ sizeof(MultirangeType)))
+#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
+ sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
+#define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (mr) + \
+ att_align_nominal(sizeof(MultirangeType) + \
+ ((mr)->rangeCount - 1) * sizeof(uint32) + \
+ (mr)->rangeCount * sizeof(uint8), (align)))
+
+#define MULTIRANGE_ITEM_OFF_BIT 0x80000000
+#define MULTIRANGE_ITEM_GET_OFFLEN(item) ((item) & 0x7FFFFFFF)
+#define MULTIRANGE_ITEM_HAS_OFF(item) ((item) & MULTIRANGE_ITEM_OFF_BIT)
+#define MULTIRANGE_ITEM_OFFSET_STRIDE 4
+
+typedef int (*multirange_bsearch_comparison) (TypeCacheEntry *typcache,
+ RangeBound *lower,
+ RangeBound *upper,
+ void *key,
+ bool *match);
+
+static MultirangeIOData *get_multirange_io_data(FunctionCallInfo fcinfo,
+ Oid mltrngtypid,
+ IOFuncSelector func);
+static int32 multirange_canonicalize(TypeCacheEntry *rangetyp,
+ int32 input_range_count,
+ RangeType **ranges);
+
+/*
+ *----------------------------------------------------------
+ * I/O FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+/*
+ * Converts string to multirange.
+ *
+ * We expect curly brackets to bound the list, with zero or more ranges
+ * separated by commas. We accept whitespace anywhere: before/after our
+ * brackets and around the commas. Ranges can be the empty literal or some
+ * stuff inside parens/brackets. Mostly we delegate parsing the individual
+ * range contents to range_in, but we have to detect quoting and
+ * backslash-escaping which can happen for range bounds. Backslashes can
+ * escape something inside or outside a quoted string, and a quoted string
+ * can escape quote marks with either backslashes or double double-quotes.
+ */
+Datum
+multirange_in(PG_FUNCTION_ARGS)
+{
+ char *input_str = PG_GETARG_CSTRING(0);
+ Oid mltrngtypoid = PG_GETARG_OID(1);
+ Oid typmod = PG_GETARG_INT32(2);
+ TypeCacheEntry *rangetyp;
+ int32 ranges_seen = 0;
+ int32 range_count = 0;
+ int32 range_capacity = 8;
+ RangeType *range;
+ RangeType **ranges = palloc(range_capacity * sizeof(RangeType *));
+ MultirangeIOData *cache;
+ MultirangeType *ret;
+ MultirangeParseState parse_state;
+ const char *ptr = input_str;
+ const char *range_str_begin = NULL;
+ int32 range_str_len;
+ char *range_str;
+
+ cache = get_multirange_io_data(fcinfo, mltrngtypoid, IOFunc_input);
+ rangetyp = cache->typcache->rngtype;
+
+ /* consume whitespace */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (*ptr == '{')
+ ptr++;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed multirange literal: \"%s\"",
+ input_str),
+ errdetail("Missing left brace.")));
+
+ /* consume ranges */
+ parse_state = MULTIRANGE_BEFORE_RANGE;
+ for (; parse_state != MULTIRANGE_FINISHED; ptr++)
+ {
+ char ch = *ptr;
+
+ if (ch == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed multirange literal: \"%s\"",
+ input_str),
+ errdetail("Unexpected end of input.")));
+
+ /* skip whitespace */
+ if (isspace((unsigned char) ch))
+ continue;
+
+ switch (parse_state)
+ {
+ case MULTIRANGE_BEFORE_RANGE:
+ if (ch == '[' || ch == '(')
+ {
+ range_str_begin = ptr;
+ parse_state = MULTIRANGE_IN_RANGE;
+ }
+ else if (ch == '}' && ranges_seen == 0)
+ parse_state = MULTIRANGE_FINISHED;
+ else if (pg_strncasecmp(ptr, RANGE_EMPTY_LITERAL,
+ strlen(RANGE_EMPTY_LITERAL)) == 0)
+ {
+ ranges_seen++;
+ /* nothing to do with an empty range */
+ ptr += strlen(RANGE_EMPTY_LITERAL) - 1;
+ parse_state = MULTIRANGE_AFTER_RANGE;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed multirange literal: \"%s\"",
+ input_str),
+ errdetail("Expected range start.")));
+ break;
+ case MULTIRANGE_IN_RANGE:
+ if (ch == ']' || ch == ')')
+ {
+ range_str_len = ptr - range_str_begin + 1;
+ range_str = pnstrdup(range_str_begin, range_str_len);
+ if (range_capacity == range_count)
+ {
+ range_capacity *= 2;
+ ranges = (RangeType **)
+ repalloc(ranges, range_capacity * sizeof(RangeType *));
+ }
+ ranges_seen++;
+ range = DatumGetRangeTypeP(InputFunctionCall(&cache->typioproc,
+ range_str,
+ cache->typioparam,
+ typmod));
+ if (!RangeIsEmpty(range))
+ ranges[range_count++] = range;
+ parse_state = MULTIRANGE_AFTER_RANGE;
+ }
+ else
+ {
+ if (ch == '"')
+ parse_state = MULTIRANGE_IN_RANGE_QUOTED;
+ else if (ch == '\\')
+ parse_state = MULTIRANGE_IN_RANGE_ESCAPED;
+
+ /*
+ * We will include this character into range_str once we
+ * find the end of the range value.
+ */
+ }
+ break;
+ case MULTIRANGE_IN_RANGE_ESCAPED:
+
+ /*
+ * We will include this character into range_str once we find
+ * the end of the range value.
+ */
+ parse_state = MULTIRANGE_IN_RANGE;
+ break;
+ case MULTIRANGE_IN_RANGE_QUOTED:
+ if (ch == '"')
+ if (*(ptr + 1) == '"')
+ {
+ /* two quote marks means an escaped quote mark */
+ ptr++;
+ }
+ else
+ parse_state = MULTIRANGE_IN_RANGE;
+ else if (ch == '\\')
+ parse_state = MULTIRANGE_IN_RANGE_QUOTED_ESCAPED;
+
+ /*
+ * We will include this character into range_str once we find
+ * the end of the range value.
+ */
+ break;
+ case MULTIRANGE_AFTER_RANGE:
+ if (ch == ',')
+ parse_state = MULTIRANGE_BEFORE_RANGE;
+ else if (ch == '}')
+ parse_state = MULTIRANGE_FINISHED;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed multirange literal: \"%s\"",
+ input_str),
+ errdetail("Expected comma or end of multirange.")));
+ break;
+ case MULTIRANGE_IN_RANGE_QUOTED_ESCAPED:
+
+ /*
+ * We will include this character into range_str once we find
+ * the end of the range value.
+ */
+ parse_state = MULTIRANGE_IN_RANGE_QUOTED;
+ break;
+ default:
+ elog(ERROR, "unknown parse state: %d", parse_state);
+ }
+ }
+
+ /* consume whitespace */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (*ptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed multirange literal: \"%s\"",
+ input_str),
+ errdetail("Junk after closing right brace.")));
+
+ ret = make_multirange(mltrngtypoid, rangetyp, range_count, ranges);
+ PG_RETURN_MULTIRANGE_P(ret);
+}
+
+Datum
+multirange_out(PG_FUNCTION_ARGS)
+{
+ MultirangeType *multirange = PG_GETARG_MULTIRANGE_P(0);
+ Oid mltrngtypoid = MultirangeTypeGetOid(multirange);
+ MultirangeIOData *cache;
+ StringInfoData buf;
+ RangeType *range;
+ char *rangeStr;
+ int32 range_count;
+ int32 i;
+ RangeType **ranges;
+
+ cache = get_multirange_io_data(fcinfo, mltrngtypoid, IOFunc_output);
+
+ initStringInfo(&buf);
+
+ appendStringInfoChar(&buf, '{');
+
+ multirange_deserialize(cache->typcache->rngtype, multirange, &range_count, &ranges);
+ for (i = 0; i < range_count; i++)
+ {
+ if (i > 0)
+ appendStringInfoChar(&buf, ',');
+ range = ranges[i];
+ rangeStr = OutputFunctionCall(&cache->typioproc, RangeTypePGetDatum(range));
+ appendStringInfoString(&buf, rangeStr);
+ }
+
+ appendStringInfoChar(&buf, '}');
+
+ PG_RETURN_CSTRING(buf.data);
+}
+
+/*
+ * Binary representation: First a int32-sized count of ranges, followed by
+ * ranges in their native binary representation.
+ */
+Datum
+multirange_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Oid mltrngtypoid = PG_GETARG_OID(1);
+ int32 typmod = PG_GETARG_INT32(2);
+ MultirangeIOData *cache;
+ uint32 range_count;
+ RangeType **ranges;
+ MultirangeType *ret;
+ StringInfoData tmpbuf;
+
+ cache = get_multirange_io_data(fcinfo, mltrngtypoid, IOFunc_receive);
+
+ range_count = pq_getmsgint(buf, 4);
+ ranges = palloc(range_count * sizeof(RangeType *));
+
+ initStringInfo(&tmpbuf);
+ for (int i = 0; i < range_count; i++)
+ {
+ uint32 range_len = pq_getmsgint(buf, 4);
+ const char *range_data = pq_getmsgbytes(buf, range_len);
+
+ resetStringInfo(&tmpbuf);
+ appendBinaryStringInfo(&tmpbuf, range_data, range_len);
+
+ ranges[i] = DatumGetRangeTypeP(ReceiveFunctionCall(&cache->typioproc,
+ &tmpbuf,
+ cache->typioparam,
+ typmod));
+ }
+ pfree(tmpbuf.data);
+
+ pq_getmsgend(buf);
+
+ ret = make_multirange(mltrngtypoid, cache->typcache->rngtype,
+ range_count, ranges);
+ PG_RETURN_MULTIRANGE_P(ret);
+}
+
+Datum
+multirange_send(PG_FUNCTION_ARGS)
+{
+ MultirangeType *multirange = PG_GETARG_MULTIRANGE_P(0);
+ Oid mltrngtypoid = MultirangeTypeGetOid(multirange);
+ StringInfo buf = makeStringInfo();
+ RangeType **ranges;
+ int32 range_count;
+ MultirangeIOData *cache;
+
+ cache = get_multirange_io_data(fcinfo, mltrngtypoid, IOFunc_send);
+
+ /* construct output */
+ pq_begintypsend(buf);
+
+ pq_sendint32(buf, multirange->rangeCount);
+
+ multirange_deserialize(cache->typcache->rngtype, multirange, &range_count, &ranges);
+ for (int i = 0; i < range_count; i++)
+ {
+ Datum range;
+
+ range = RangeTypePGetDatum(ranges[i]);
+ range = PointerGetDatum(SendFunctionCall(&cache->typioproc, range));
+
+ pq_sendint32(buf, VARSIZE(range) - VARHDRSZ);
+ pq_sendbytes(buf, VARDATA(range), VARSIZE(range) - VARHDRSZ);
+ }
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(buf));
+}
+
+/*
+ * get_multirange_io_data: get cached information needed for multirange type I/O
+ *
+ * The multirange I/O functions need a bit more cached info than other multirange
+ * functions, so they store a MultirangeIOData struct in fn_extra, not just a
+ * pointer to a type cache entry.
+ */
+static MultirangeIOData *
+get_multirange_io_data(FunctionCallInfo fcinfo, Oid mltrngtypid, IOFuncSelector func)
+{
+ MultirangeIOData *cache = (MultirangeIOData *) fcinfo->flinfo->fn_extra;
+
+ if (cache == NULL || cache->typcache->type_id != mltrngtypid)
+ {
+ Oid typiofunc;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ char typdelim;
+
+ cache = (MultirangeIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(MultirangeIOData));
+ cache->typcache = lookup_type_cache(mltrngtypid, TYPECACHE_MULTIRANGE_INFO);
+ if (cache->typcache->rngtype == NULL)
+ elog(ERROR, "type %u is not a multirange type", mltrngtypid);
+
+ /* get_type_io_data does more than we need, but is convenient */
+ get_type_io_data(cache->typcache->rngtype->type_id,
+ func,
+ &typlen,
+ &typbyval,
+ &typalign,
+ &typdelim,
+ &cache->typioparam,
+ &typiofunc);
+
+ if (!OidIsValid(typiofunc))
+ {
+ /* this could only happen for receive or send */
+ if (func == IOFunc_receive)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary input function available for type %s",
+ format_type_be(cache->typcache->rngtype->type_id))));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary output function available for type %s",
+ format_type_be(cache->typcache->rngtype->type_id))));
+ }
+ fmgr_info_cxt(typiofunc, &cache->typioproc,
+ fcinfo->flinfo->fn_mcxt);
+
+ fcinfo->flinfo->fn_extra = (void *) cache;
+ }
+
+ return cache;
+}
+
+/*
+ * Converts a list of arbitrary ranges into a list that is sorted and merged.
+ * Changes the contents of `ranges`.
+ *
+ * Returns the number of slots actually used, which may be less than
+ * input_range_count but never more.
+ *
+ * We assume that no input ranges are null, but empties are okay.
+ */
+static int32
+multirange_canonicalize(TypeCacheEntry *rangetyp, int32 input_range_count,
+ RangeType **ranges)
+{
+ RangeType *lastRange = NULL;
+ RangeType *currentRange;
+ int32 i;
+ int32 output_range_count = 0;
+
+ /* Sort the ranges so we can find the ones that overlap/meet. */
+ qsort_arg(ranges, input_range_count, sizeof(RangeType *), range_compare,
+ rangetyp);
+
+ /* Now merge where possible: */
+ for (i = 0; i < input_range_count; i++)
+ {
+ currentRange = ranges[i];
+ if (RangeIsEmpty(currentRange))
+ continue;
+
+ if (lastRange == NULL)
+ {
+ ranges[output_range_count++] = lastRange = currentRange;
+ continue;
+ }
+
+ /*
+ * range_adjacent_internal gives true if *either* A meets B or B meets
+ * A, which is not quite want we want, but we rely on the sorting
+ * above to rule out B meets A ever happening.
+ */
+ if (range_adjacent_internal(rangetyp, lastRange, currentRange))
+ {
+ /* The two ranges touch (without overlap), so merge them: */
+ ranges[output_range_count - 1] = lastRange =
+ range_union_internal(rangetyp, lastRange, currentRange, false);
+ }
+ else if (range_before_internal(rangetyp, lastRange, currentRange))
+ {
+ /* There's a gap, so make a new entry: */
+ lastRange = ranges[output_range_count] = currentRange;
+ output_range_count++;
+ }
+ else
+ {
+ /* They must overlap, so merge them: */
+ ranges[output_range_count - 1] = lastRange =
+ range_union_internal(rangetyp, lastRange, currentRange, true);
+ }
+ }
+
+ return output_range_count;
+}
+
+/*
+ *----------------------------------------------------------
+ * SUPPORT FUNCTIONS
+ *
+ * These functions aren't in pg_proc, but are useful for
+ * defining new generic multirange functions in C.
+ *----------------------------------------------------------
+ */
+
+/*
+ * multirange_get_typcache: get cached information about a multirange type
+ *
+ * This is for use by multirange-related functions that follow the convention
+ * of using the fn_extra field as a pointer to the type cache entry for
+ * the multirange type. Functions that need to cache more information than
+ * that must fend for themselves.
+ */
+TypeCacheEntry *
+multirange_get_typcache(FunctionCallInfo fcinfo, Oid mltrngtypid)
+{
+ TypeCacheEntry *typcache = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+
+ if (typcache == NULL ||
+ typcache->type_id != mltrngtypid)
+ {
+ typcache = lookup_type_cache(mltrngtypid, TYPECACHE_MULTIRANGE_INFO);
+ if (typcache->rngtype == NULL)
+ elog(ERROR, "type %u is not a multirange type", mltrngtypid);
+ fcinfo->flinfo->fn_extra = (void *) typcache;
+ }
+
+ return typcache;
+}
+
+
+/*
+ * Estimate size occupied by serialized multirange.
+ */
+static Size
+multirange_size_estimate(TypeCacheEntry *rangetyp, int32 range_count,
+ RangeType **ranges)
+{
+ char elemalign = rangetyp->rngelemtype->typalign;
+ Size size;
+ int32 i;
+
+ /*
+ * Count space for MultirangeType struct, items and flags.
+ */
+ size = att_align_nominal(sizeof(MultirangeType) +
+ Max(range_count - 1, 0) * sizeof(uint32) +
+ range_count * sizeof(uint8), elemalign);
+
+ /* Count space for range bounds */
+ for (i = 0; i < range_count; i++)
+ size += att_align_nominal(VARSIZE(ranges[i]) -
+ sizeof(RangeType) -
+ sizeof(char), elemalign);
+
+ return size;
+}
+
+/*
+ * Write multirange data into pre-allocated space.
+ */
+static void
+write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp,
+ int32 range_count, RangeType **ranges)
+{
+ uint32 *items;
+ uint32 prev_offset = 0;
+ uint8 *flags;
+ int32 i;
+ Pointer begin,
+ ptr;
+ char elemalign = rangetyp->rngelemtype->typalign;
+
+ items = MultirangeGetItemsPtr(multirange);
+ flags = MultirangeGetFlagsPtr(multirange);
+ ptr = begin = MultirangeGetBoundariesPtr(multirange, elemalign);
+ for (i = 0; i < range_count; i++)
+ {
+ uint32 len;
+
+ if (i > 0)
+ {
+ /*
+ * Every range, except the first one, has an item. Every
+ * MULTIRANGE_ITEM_OFFSET_STRIDE item contains an offset, others
+ * contain lengths.
+ */
+ items[i - 1] = ptr - begin;
+ if ((i % MULTIRANGE_ITEM_OFFSET_STRIDE) != 0)
+ items[i - 1] -= prev_offset;
+ else
+ items[i - 1] |= MULTIRANGE_ITEM_OFF_BIT;
+ prev_offset = ptr - begin;
+ }
+ flags[i] = *((Pointer) ranges[i] + VARSIZE(ranges[i]) - sizeof(char));
+ len = VARSIZE(ranges[i]) - sizeof(RangeType) - sizeof(char);
+ memcpy(ptr, (Pointer) (ranges[i] + 1), len);
+ ptr += att_align_nominal(len, elemalign);
+ }
+}
+
+
+/*
+ * This serializes the multirange from a list of non-null ranges. It also
+ * sorts the ranges and merges any that touch. The ranges should already be
+ * detoasted, and there should be no NULLs. This should be used by most
+ * callers.
+ *
+ * Note that we may change the `ranges` parameter (the pointers, but not
+ * any already-existing RangeType contents).
+ */
+MultirangeType *
+make_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count,
+ RangeType **ranges)
+{
+ MultirangeType *multirange;
+ Size size;
+
+ /* Sort and merge input ranges. */
+ range_count = multirange_canonicalize(rangetyp, range_count, ranges);
+
+ /* Note: zero-fill is required here, just as in heap tuples */
+ size = multirange_size_estimate(rangetyp, range_count, ranges);
+ multirange = palloc0(size);
+ SET_VARSIZE(multirange, size);
+
+ /* Now fill in the datum */
+ multirange->multirangetypid = mltrngtypoid;
+ multirange->rangeCount = range_count;
+
+ write_multirange_data(multirange, rangetyp, range_count, ranges);
+
+ return multirange;
+}
+
+/*
+ * Get offset of bounds values of the i'th range in the multirange.
+ */
+static uint32
+multirange_get_bounds_offset(const MultirangeType *multirange, int32 i)
+{
+ uint32 *items = MultirangeGetItemsPtr(multirange);
+ uint32 offset = 0;
+
+ /*
+ * Summarize lengths till we meet an offset.
+ */
+ while (i > 0)
+ {
+ offset += MULTIRANGE_ITEM_GET_OFFLEN(items[i - 1]);
+ if (MULTIRANGE_ITEM_HAS_OFF(items[i - 1]))
+ break;
+ i--;
+ }
+ return offset;
+}
+
+/*
+ * Fetch the i'th range from the multirange.
+ */
+RangeType *
+multirange_get_range(TypeCacheEntry *rangetyp,
+ const MultirangeType *multirange, int i)
+{
+ uint32 offset;
+ uint8 flags;
+ Pointer begin,
+ ptr;
+ int16 typlen = rangetyp->rngelemtype->typlen;
+ char typalign = rangetyp->rngelemtype->typalign;
+ uint32 len;
+ RangeType *range;
+
+ Assert(i < multirange->rangeCount);
+
+ offset = multirange_get_bounds_offset(multirange, i);
+ flags = MultirangeGetFlagsPtr(multirange)[i];
+ ptr = begin = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
+
+ /*
+ * Calculate the size of bound values. In principle, we could get offset
+ * of the next range bound values and calculate accordingly. But range
+ * bound values are aligned, so we have to walk the values to get the
+ * exact size.
+ */
+ if (RANGE_HAS_LBOUND(flags))
+ ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+ ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ }
+ len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
+
+ range = palloc0(len);
+ SET_VARSIZE(range, len);
+ range->rangetypid = rangetyp->type_id;
+
+ memcpy(range + 1, begin, ptr - begin);
+ *((uint8 *) (range + 1) + (ptr - begin)) = flags;
+
+ return range;
+}
+
+/*
+ * Fetch bounds from the i'th range of the multirange. This is the shortcut for
+ * doing the same thing as multirange_get_range() + range_deserialize(), but
+ * performing fewer operations.
+ */
+void
+multirange_get_bounds(TypeCacheEntry *rangetyp,
+ const MultirangeType *multirange,
+ uint32 i, RangeBound *lower, RangeBound *upper)
+{
+ uint32 offset;
+ uint8 flags;
+ Pointer ptr;
+ int16 typlen = rangetyp->rngelemtype->typlen;
+ char typalign = rangetyp->rngelemtype->typalign;
+ bool typbyval = rangetyp->rngelemtype->typbyval;
+ Datum lbound;
+ Datum ubound;
+
+ Assert(i < multirange->rangeCount);
+
+ offset = multirange_get_bounds_offset(multirange, i);
+ flags = MultirangeGetFlagsPtr(multirange)[i];
+ ptr = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
+
+ /* multirange can't contain empty ranges */
+ Assert((flags & RANGE_EMPTY) == 0);
+
+ /* fetch lower bound, if any */
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ /* att_align_pointer cannot be necessary here */
+ lbound = fetch_att(ptr, typbyval, typlen);
+ ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ }
+ else
+ lbound = (Datum) 0;
+
+ /* fetch upper bound, if any */
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+ ubound = fetch_att(ptr, typbyval, typlen);
+ /* no need for att_addlength_pointer */
+ }
+ else
+ ubound = (Datum) 0;
+
+ /* emit results */
+ lower->val = lbound;
+ lower->infinite = (flags & RANGE_LB_INF) != 0;
+ lower->inclusive = (flags & RANGE_LB_INC) != 0;
+ lower->lower = true;
+
+ upper->val = ubound;
+ upper->infinite = (flags & RANGE_UB_INF) != 0;
+ upper->inclusive = (flags & RANGE_UB_INC) != 0;
+ upper->lower = false;
+}
+
+/*
+ * Construct union range from the multirange.
+ */
+RangeType *
+multirange_get_union_range(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr)
+{
+ RangeBound lower,
+ upper,
+ tmp;
+
+ if (MultirangeIsEmpty(mr))
+ return make_empty_range(rangetyp);
+
+ multirange_get_bounds(rangetyp, mr, 0, &lower, &tmp);
+ multirange_get_bounds(rangetyp, mr, mr->rangeCount - 1, &tmp, &upper);
+
+ return make_range(rangetyp, &lower, &upper, false);
+}
+
+
+/*
+ * multirange_deserialize: deconstruct a multirange value
+ *
+ * NB: the given multirange object must be fully detoasted; it cannot have a
+ * short varlena header.
+ */
+void
+multirange_deserialize(TypeCacheEntry *rangetyp,
+ const MultirangeType *multirange, int32 *range_count,
+ RangeType ***ranges)
+{
+ *range_count = multirange->rangeCount;
+
+ /* Convert each ShortRangeType into a RangeType */
+ if (*range_count > 0)
+ {
+ int i;
+
+ *ranges = palloc(*range_count * sizeof(RangeType *));
+ for (i = 0; i < *range_count; i++)
+ (*ranges)[i] = multirange_get_range(rangetyp, multirange, i);
+ }
+ else
+ {
+ *ranges = NULL;
+ }
+}
+
+MultirangeType *
+make_empty_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp)
+{
+ return make_multirange(mltrngtypoid, rangetyp, 0, NULL);
+}
+
+/*
+ * Similar to range_overlaps_internal(), but takes range bounds instead of
+ * ranges as arguments.
+ */
+static bool
+range_bounds_overlaps(TypeCacheEntry *typcache,
+ RangeBound *lower1, RangeBound *upper1,
+ RangeBound *lower2, RangeBound *upper2)
+{
+ if (range_cmp_bounds(typcache, lower1, lower2) >= 0 &&
+ range_cmp_bounds(typcache, lower1, upper2) <= 0)
+ return true;
+
+ if (range_cmp_bounds(typcache, lower2, lower1) >= 0 &&
+ range_cmp_bounds(typcache, lower2, upper1) <= 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * Similar to range_contains_internal(), but takes range bounds instead of
+ * ranges as arguments.
+ */
+static bool
+range_bounds_contains(TypeCacheEntry *typcache,
+ RangeBound *lower1, RangeBound *upper1,
+ RangeBound *lower2, RangeBound *upper2)
+{
+ if (range_cmp_bounds(typcache, lower1, lower2) <= 0 &&
+ range_cmp_bounds(typcache, upper1, upper2) >= 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * Check if the given key matches any range in multirange using binary search.
+ * If the required range isn't found, that counts as a mismatch. When the
+ * required range is found, the comparison function can still report this as
+ * either match or mismatch. For instance, if we search for containment, we can
+ * found a range, which is overlapping but not containing the key range, and
+ * that would count as a mismatch.
+ */
+static bool
+multirange_bsearch_match(TypeCacheEntry *typcache, const MultirangeType *mr,
+ void *key, multirange_bsearch_comparison cmp_func)
+{
+ uint32 l,
+ u,
+ idx;
+ int comparison;
+ bool match = false;
+
+ l = 0;
+ u = mr->rangeCount;
+ while (l < u)
+ {
+ RangeBound lower,
+ upper;
+
+ idx = (l + u) / 2;
+ multirange_get_bounds(typcache, mr, idx, &lower, &upper);
+ comparison = (*cmp_func) (typcache, &lower, &upper, key, &match);
+
+ if (comparison < 0)
+ u = idx;
+ else if (comparison > 0)
+ l = idx + 1;
+ else
+ return match;
+ }
+
+ return false;
+}
+
+/*
+ *----------------------------------------------------------
+ * GENERIC FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+/*
+ * Construct multirange value from zero or more ranges. Since this is a
+ * variadic function we get passed an array. The array must contain ranges
+ * that match our return value, and there must be no NULLs.
+ */
+Datum
+multirange_constructor2(PG_FUNCTION_ARGS)
+{
+ Oid mltrngtypid = get_fn_expr_rettype(fcinfo->flinfo);
+ Oid rngtypid;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rangetyp;
+ ArrayType *rangeArray;
+ int range_count;
+ Datum *elements;
+ bool *nulls;
+ RangeType **ranges;
+ int dims;
+ int i;
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypid);
+ rangetyp = typcache->rngtype;
+
+ /*
+ * A no-arg invocation should call multirange_constructor0 instead, but
+ * returning an empty range is what that does.
+ */
+
+ if (PG_NARGS() == 0)
+ PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypid, rangetyp, 0, NULL));
+
+ /*
+ * This check should be guaranteed by our signature, but let's do it just
+ * in case.
+ */
+
+ if (PG_ARGISNULL(0))
+ elog(ERROR,
+ "multirange values cannot contain null members");
+
+ rangeArray = PG_GETARG_ARRAYTYPE_P(0);
+
+ dims = ARR_NDIM(rangeArray);
+ if (dims > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_CARDINALITY_VIOLATION),
+ errmsg("multiranges cannot be constructed from multidimensional arrays")));
+
+ rngtypid = ARR_ELEMTYPE(rangeArray);
+ if (rngtypid != rangetyp->type_id)
+ elog(ERROR, "type %u does not match constructor type", rngtypid);
+
+ /*
+ * Be careful: we can still be called with zero ranges, like this:
+ * `int4multirange(variadic '{}'::int4range[])
+ */
+ if (dims == 0)
+ {
+ range_count = 0;
+ ranges = NULL;
+ }
+ else
+ {
+ deconstruct_array(rangeArray, rngtypid, rangetyp->typlen, rangetyp->typbyval,
+ rangetyp->typalign, &elements, &nulls, &range_count);
+
+ ranges = palloc0(range_count * sizeof(RangeType *));
+ for (i = 0; i < range_count; i++)
+ {
+ if (nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("multirange values cannot contain null members")));
+
+ /* make_multirange will do its own copy */
+ ranges[i] = DatumGetRangeTypeP(elements[i]);
+ }
+ }
+
+ PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypid, rangetyp, range_count, ranges));
+}
+
+/*
+ * Construct multirange value from a single range. It'd be nice if we could
+ * just use multirange_constructor2 for this case, but we need a non-variadic
+ * single-arg function to let us define a CAST from a range to its multirange.
+ */
+Datum
+multirange_constructor1(PG_FUNCTION_ARGS)
+{
+ Oid mltrngtypid = get_fn_expr_rettype(fcinfo->flinfo);
+ Oid rngtypid;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rangetyp;
+ RangeType *range;
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypid);
+ rangetyp = typcache->rngtype;
+
+ /*
+ * This check should be guaranteed by our signature, but let's do it just
+ * in case.
+ */
+
+ if (PG_ARGISNULL(0))
+ elog(ERROR,
+ "multirange values cannot contain null members");
+
+ range = PG_GETARG_RANGE_P(0);
+
+ /* Make sure the range type matches. */
+ rngtypid = RangeTypeGetOid(range);
+ if (rngtypid != rangetyp->type_id)
+ elog(ERROR, "type %u does not match constructor type", rngtypid);
+
+ PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypid, rangetyp, 1, &range));
+}
+
+/*
+ * Constructor just like multirange_constructor1, but opr_sanity gets angry
+ * if the same internal function handles multiple functions with different arg
+ * counts.
+ */
+Datum
+multirange_constructor0(PG_FUNCTION_ARGS)
+{
+ Oid mltrngtypid;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rangetyp;
+
+ /* This should always be called without arguments */
+ if (PG_NARGS() != 0)
+ elog(ERROR,
+ "niladic multirange constructor must not receive arguments");
+
+ mltrngtypid = get_fn_expr_rettype(fcinfo->flinfo);
+ typcache = multirange_get_typcache(fcinfo, mltrngtypid);
+ rangetyp = typcache->rngtype;
+
+ PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypid, rangetyp, 0, NULL));
+}
+
+
+/* multirange, multirange -> multirange type functions */
+
+/* multirange union */
+Datum
+multirange_union(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+ int32 range_count1;
+ int32 range_count2;
+ int32 range_count3;
+ RangeType **ranges1;
+ RangeType **ranges2;
+ RangeType **ranges3;
+
+ if (MultirangeIsEmpty(mr1))
+ PG_RETURN_MULTIRANGE_P(mr2);
+ if (MultirangeIsEmpty(mr2))
+ PG_RETURN_MULTIRANGE_P(mr1);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ multirange_deserialize(typcache->rngtype, mr1, &range_count1, &ranges1);
+ multirange_deserialize(typcache->rngtype, mr2, &range_count2, &ranges2);
+
+ range_count3 = range_count1 + range_count2;
+ ranges3 = palloc0(range_count3 * sizeof(RangeType *));
+ memcpy(ranges3, ranges1, range_count1 * sizeof(RangeType *));
+ memcpy(ranges3 + range_count1, ranges2, range_count2 * sizeof(RangeType *));
+ PG_RETURN_MULTIRANGE_P(make_multirange(typcache->type_id, typcache->rngtype,
+ range_count3, ranges3));
+}
+
+/* multirange minus */
+Datum
+multirange_minus(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ Oid mltrngtypoid = MultirangeTypeGetOid(mr1);
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rangetyp;
+ int32 range_count1;
+ int32 range_count2;
+ RangeType **ranges1;
+ RangeType **ranges2;
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+ rangetyp = typcache->rngtype;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ PG_RETURN_MULTIRANGE_P(mr1);
+
+ multirange_deserialize(typcache->rngtype, mr1, &range_count1, &ranges1);
+ multirange_deserialize(typcache->rngtype, mr2, &range_count2, &ranges2);
+
+ PG_RETURN_MULTIRANGE_P(multirange_minus_internal(mltrngtypoid,
+ rangetyp,
+ range_count1,
+ ranges1,
+ range_count2,
+ ranges2));
+}
+
+MultirangeType *
+multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp,
+ int32 range_count1, RangeType **ranges1,
+ int32 range_count2, RangeType **ranges2)
+{
+ RangeType *r1;
+ RangeType *r2;
+ RangeType **ranges3;
+ int32 range_count3;
+ int32 i1;
+ int32 i2;
+
+ /*
+ * Worst case: every range in ranges1 makes a different cut to some range
+ * in ranges2.
+ */
+ ranges3 = palloc0((range_count1 + range_count2) * sizeof(RangeType *));
+ range_count3 = 0;
+
+ /*
+ * For each range in mr1, keep subtracting until it's gone or the ranges
+ * in mr2 have passed it. After a subtraction we assign what's left back
+ * to r1. The parallel progress through mr1 and mr2 is similar to
+ * multirange_overlaps_multirange_internal.
+ */
+ r2 = ranges2[0];
+ for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
+ {
+ r1 = ranges1[i1];
+
+ /* Discard r2s while r2 << r1 */
+ while (r2 != NULL && range_before_internal(rangetyp, r2, r1))
+ {
+ r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
+ }
+
+ while (r2 != NULL)
+ {
+ if (range_split_internal(rangetyp, r1, r2, &ranges3[range_count3], &r1))
+ {
+ /*
+ * If r2 takes a bite out of the middle of r1, we need two
+ * outputs
+ */
+ range_count3++;
+ r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
+ }
+ else if (range_overlaps_internal(rangetyp, r1, r2))
+ {
+ /*
+ * If r2 overlaps r1, replace r1 with r1 - r2.
+ */
+ r1 = range_minus_internal(rangetyp, r1, r2);
+
+ /*
+ * If r2 goes past r1, then we need to stay with it, in case
+ * it hits future r1s. Otherwise we need to keep r1, in case
+ * future r2s hit it. Since we already subtracted, there's no
+ * point in using the overright/overleft calls.
+ */
+ if (RangeIsEmpty(r1) || range_before_internal(rangetyp, r1, r2))
+ break;
+ else
+ r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
+ }
+ else
+ {
+ /*
+ * This and all future r2s are past r1, so keep them. Also
+ * assign whatever is left of r1 to the result.
+ */
+ break;
+ }
+ }
+
+ /*
+ * Nothing else can remove anything from r1, so keep it. Even if r1 is
+ * empty here, make_multirange will remove it.
+ */
+ ranges3[range_count3++] = r1;
+ }
+
+ return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
+}
+
+/* multirange intersection */
+Datum
+multirange_intersect(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ Oid mltrngtypoid = MultirangeTypeGetOid(mr1);
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rangetyp;
+ int32 range_count1;
+ int32 range_count2;
+ RangeType **ranges1;
+ RangeType **ranges2;
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+ rangetyp = typcache->rngtype;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ PG_RETURN_MULTIRANGE_P(make_empty_multirange(mltrngtypoid, rangetyp));
+
+ multirange_deserialize(rangetyp, mr1, &range_count1, &ranges1);
+ multirange_deserialize(rangetyp, mr2, &range_count2, &ranges2);
+
+ PG_RETURN_MULTIRANGE_P(multirange_intersect_internal(mltrngtypoid,
+ rangetyp,
+ range_count1,
+ ranges1,
+ range_count2,
+ ranges2));
+}
+
+MultirangeType *
+multirange_intersect_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp,
+ int32 range_count1, RangeType **ranges1,
+ int32 range_count2, RangeType **ranges2)
+{
+ RangeType *r1;
+ RangeType *r2;
+ RangeType **ranges3;
+ int32 range_count3;
+ int32 i1;
+ int32 i2;
+
+ if (range_count1 == 0 || range_count2 == 0)
+ return make_multirange(mltrngtypoid, rangetyp, 0, NULL);
+
+ /*-----------------------------------------------
+ * Worst case is a stitching pattern like this:
+ *
+ * mr1: --- --- --- ---
+ * mr2: --- --- ---
+ * mr3: - - - - - -
+ *
+ * That seems to be range_count1 + range_count2 - 1,
+ * but one extra won't hurt.
+ *-----------------------------------------------
+ */
+ ranges3 = palloc0((range_count1 + range_count2) * sizeof(RangeType *));
+ range_count3 = 0;
+
+ /*
+ * For each range in mr1, keep intersecting until the ranges in mr2 have
+ * passed it. The parallel progress through mr1 and mr2 is similar to
+ * multirange_minus_multirange_internal, but we don't have to assign back
+ * to r1.
+ */
+ r2 = ranges2[0];
+ for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
+ {
+ r1 = ranges1[i1];
+
+ /* Discard r2s while r2 << r1 */
+ while (r2 != NULL && range_before_internal(rangetyp, r2, r1))
+ {
+ r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
+ }
+
+ while (r2 != NULL)
+ {
+ if (range_overlaps_internal(rangetyp, r1, r2))
+ {
+ /* Keep the overlapping part */
+ ranges3[range_count3++] = range_intersect_internal(rangetyp, r1, r2);
+
+ /* If we "used up" all of r2, go to the next one... */
+ if (range_overleft_internal(rangetyp, r2, r1))
+ r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
+
+ /* ...otherwise go to the next r1 */
+ else
+ break;
+ }
+ else
+ /* We're past r1, so move to the next one */
+ break;
+ }
+
+ /* If we're out of r2s, there can be no more intersections */
+ if (r2 == NULL)
+ break;
+ }
+
+ return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
+}
+
+/*
+ * range_agg_transfn: combine adjacent/overlapping ranges.
+ *
+ * All we do here is gather the input ranges into an array
+ * so that the finalfn can sort and combine them.
+ */
+Datum
+range_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggContext;
+ Oid rngtypoid;
+ ArrayBuildState *state;
+
+ if (!AggCheckCallContext(fcinfo, &aggContext))
+ elog(ERROR, "range_agg_transfn called in non-aggregate context");
+
+ rngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ if (!type_is_range(rngtypoid))
+ elog(ERROR, "range_agg must be called with a range");
+
+ if (PG_ARGISNULL(0))
+ state = initArrayResult(rngtypoid, aggContext, false);
+ else
+ state = (ArrayBuildState *) PG_GETARG_POINTER(0);
+
+ /* skip NULLs */
+ if (!PG_ARGISNULL(1))
+ accumArrayResult(state, PG_GETARG_DATUM(1), false, rngtypoid, aggContext);
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * range_agg_finalfn: use our internal array to merge touching ranges.
+ *
+ * Shared by range_agg_finalfn(anyrange) and
+ * multirange_agg_finalfn(anymultirange).
+ */
+Datum
+range_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggContext;
+ Oid mltrngtypoid;
+ TypeCacheEntry *typcache;
+ ArrayBuildState *state;
+ int32 range_count;
+ RangeType **ranges;
+ int i;
+
+ if (!AggCheckCallContext(fcinfo, &aggContext))
+ elog(ERROR, "range_agg_finalfn called in non-aggregate context");
+
+ state = PG_ARGISNULL(0) ? NULL : (ArrayBuildState *) PG_GETARG_POINTER(0);
+ if (state == NULL)
+ /* This shouldn't be possible, but just in case.... */
+ PG_RETURN_NULL();
+
+ /* Also return NULL if we had zero inputs, like other aggregates */
+ range_count = state->nelems;
+ if (range_count == 0)
+ PG_RETURN_NULL();
+
+ mltrngtypoid = get_fn_expr_rettype(fcinfo->flinfo);
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+
+ ranges = palloc0(range_count * sizeof(RangeType *));
+ for (i = 0; i < range_count; i++)
+ ranges[i] = DatumGetRangeTypeP(state->dvalues[i]);
+
+ PG_RETURN_MULTIRANGE_P(make_multirange(mltrngtypoid, typcache->rngtype, range_count, ranges));
+}
+
+/*
+ * multirange_agg_transfn: combine adjacent/overlapping multiranges.
+ *
+ * All we do here is gather the input multiranges' ranges into an array so
+ * that the finalfn can sort and combine them.
+ */
+Datum
+multirange_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggContext;
+ Oid mltrngtypoid;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *rngtypcache;
+ ArrayBuildState *state;
+
+ if (!AggCheckCallContext(fcinfo, &aggContext))
+ elog(ERROR, "multirange_agg_transfn called in non-aggregate context");
+
+ mltrngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ if (!type_is_multirange(mltrngtypoid))
+ elog(ERROR, "range_agg must be called with a multirange");
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+ rngtypcache = typcache->rngtype;
+
+ if (PG_ARGISNULL(0))
+ state = initArrayResult(rngtypcache->type_id, aggContext, false);
+ else
+ state = (ArrayBuildState *) PG_GETARG_POINTER(0);
+
+ /* skip NULLs */
+ if (!PG_ARGISNULL(1))
+ {
+ MultirangeType *current;
+ int32 range_count;
+ RangeType **ranges;
+
+ current = PG_GETARG_MULTIRANGE_P(1);
+ multirange_deserialize(rngtypcache, current, &range_count, &ranges);
+ if (range_count == 0)
+ {
+ /*
+ * Add an empty range so we get an empty result (not a null
+ * result).
+ */
+ accumArrayResult(state,
+ RangeTypePGetDatum(make_empty_range(rngtypcache)),
+ false, rngtypcache->type_id, aggContext);
+ }
+ else
+ {
+ for (int32 i = 0; i < range_count; i++)
+ accumArrayResult(state, RangeTypePGetDatum(ranges[i]), false, rngtypcache->type_id, aggContext);
+ }
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+multirange_intersect_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggContext;
+ Oid mltrngtypoid;
+ TypeCacheEntry *typcache;
+ MultirangeType *result;
+ MultirangeType *current;
+ int32 range_count1;
+ int32 range_count2;
+ RangeType **ranges1;
+ RangeType **ranges2;
+
+ if (!AggCheckCallContext(fcinfo, &aggContext))
+ elog(ERROR, "multirange_intersect_agg_transfn called in non-aggregate context");
+
+ mltrngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ if (!type_is_multirange(mltrngtypoid))
+ elog(ERROR, "range_intersect_agg must be called with a multirange");
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+
+ /* strictness ensures these are non-null */
+ result = PG_GETARG_MULTIRANGE_P(0);
+ current = PG_GETARG_MULTIRANGE_P(1);
+
+ multirange_deserialize(typcache->rngtype, result, &range_count1, &ranges1);
+ multirange_deserialize(typcache->rngtype, current, &range_count2, &ranges2);
+
+ result = multirange_intersect_internal(mltrngtypoid,
+ typcache->rngtype,
+ range_count1,
+ ranges1,
+ range_count2,
+ ranges2);
+ PG_RETURN_RANGE_P(result);
+}
+
+
+/* multirange -> element type functions */
+
+/* extract lower bound value */
+Datum
+multirange_lower(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_NULL();
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ multirange_get_bounds(typcache->rngtype, mr, 0,
+ &lower, &upper);
+
+ if (!lower.infinite)
+ PG_RETURN_DATUM(lower.val);
+ else
+ PG_RETURN_NULL();
+}
+
+/* extract upper bound value */
+Datum
+multirange_upper(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_NULL();
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1,
+ &lower, &upper);
+
+ if (!upper.infinite)
+ PG_RETURN_DATUM(upper.val);
+ else
+ PG_RETURN_NULL();
+}
+
+
+/* multirange -> bool functions */
+
+/* is multirange empty? */
+Datum
+multirange_empty(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+
+ PG_RETURN_BOOL(MultirangeIsEmpty(mr));
+}
+
+/* is lower bound inclusive? */
+Datum
+multirange_lower_inc(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ multirange_get_bounds(typcache->rngtype, mr, 0,
+ &lower, &upper);
+
+ PG_RETURN_BOOL(lower.inclusive);
+}
+
+/* is upper bound inclusive? */
+Datum
+multirange_upper_inc(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1,
+ &lower, &upper);
+
+ PG_RETURN_BOOL(upper.inclusive);
+}
+
+/* is lower bound infinite? */
+Datum
+multirange_lower_inf(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ multirange_get_bounds(typcache->rngtype, mr, 0,
+ &lower, &upper);
+
+ PG_RETURN_BOOL(lower.infinite);
+}
+
+/* is upper bound infinite? */
+Datum
+multirange_upper_inf(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ if (MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1,
+ &lower, &upper);
+
+ PG_RETURN_BOOL(upper.infinite);
+}
+
+
+
+/* multirange, element -> bool functions */
+
+/* contains? */
+Datum
+multirange_contains_elem(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ Datum val = PG_GETARG_DATUM(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(multirange_contains_elem_internal(typcache->rngtype, mr, val));
+}
+
+/* contained by? */
+Datum
+elem_contained_by_multirange(PG_FUNCTION_ARGS)
+{
+ Datum val = PG_GETARG_DATUM(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(multirange_contains_elem_internal(typcache->rngtype, mr, val));
+}
+
+/*
+ * Comparison function for checking if any range of multirange contains given
+ * key element using binary search.
+ */
+static int
+multirange_elem_bsearch_comparison(TypeCacheEntry *typcache,
+ RangeBound *lower, RangeBound *upper,
+ void *key, bool *match)
+{
+ Datum val = *((Datum *) key);
+ int cmp;
+
+ if (!lower->infinite)
+ {
+ cmp = DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ lower->val, val));
+ if (cmp > 0 || (cmp == 0 && !lower->inclusive))
+ return -1;
+ }
+
+ if (!upper->infinite)
+ {
+ cmp = DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ upper->val, val));
+ if (cmp < 0 || (cmp == 0 && !upper->inclusive))
+ return 1;
+ }
+
+ *match = true;
+ return 0;
+}
+
+/*
+ * Test whether multirange mr contains a specific element value.
+ */
+bool
+multirange_contains_elem_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr, Datum val)
+{
+ if (MultirangeIsEmpty(mr))
+ return false;
+
+ return multirange_bsearch_match(rangetyp, mr, &val,
+ multirange_elem_bsearch_comparison);
+}
+
+/* multirange, range -> bool functions */
+
+/* contains? */
+Datum
+multirange_contains_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(multirange_contains_range_internal(typcache->rngtype, mr, r));
+}
+
+Datum
+range_contains_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_contains_multirange_internal(typcache->rngtype, r, mr));
+}
+
+/* contained by? */
+Datum
+range_contained_by_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(multirange_contains_range_internal(typcache->rngtype, mr, r));
+}
+
+Datum
+multirange_contained_by_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_contains_multirange_internal(typcache->rngtype, r, mr));
+}
+
+/*
+ * Comparison function for checking if any range of multirange contains given
+ * key range using binary search.
+ */
+static int
+multirange_range_contains_bsearch_comparison(TypeCacheEntry *typcache,
+ RangeBound *lower, RangeBound *upper,
+ void *key, bool *match)
+{
+ RangeBound *keyLower = (RangeBound *) key;
+ RangeBound *keyUpper = (RangeBound *) key + 1;
+
+ /* Check if key range is strictly in the left or in the right */
+ if (range_cmp_bounds(typcache, keyUpper, lower) < 0)
+ return -1;
+ if (range_cmp_bounds(typcache, keyLower, upper) > 0)
+ return 1;
+
+ /*
+ * At this point we found overlapping range. But we have to check if it
+ * really contains the key range. Anyway, we have to stop our search
+ * here, because multirange contains only non-overlapping ranges.
+ */
+ *match = range_bounds_contains(typcache, lower, upper, keyLower, keyUpper);
+
+ return 0;
+}
+
+/*
+ * Test whether multirange mr contains a specific range r.
+ */
+bool
+multirange_contains_range_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr,
+ const RangeType *r)
+{
+ RangeBound bounds[2];
+ bool empty;
+
+ /*
+ * Every multirange contains an infinite number of empty ranges, even an
+ * empty one.
+ */
+ if (RangeIsEmpty(r))
+ return true;
+
+ if (MultirangeIsEmpty(mr))
+ return false;
+
+ range_deserialize(rangetyp, r, &bounds[0], &bounds[1], &empty);
+ Assert(!empty);
+
+ return multirange_bsearch_match(rangetyp, mr, bounds,
+ multirange_range_contains_bsearch_comparison);
+}
+
+/*
+ * Test whether range r contains a multirange mr.
+ */
+bool
+range_contains_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2,
+ tmp;
+ bool empty;
+
+ /*
+ * Every range contains an infinite number of empty multiranges, even an
+ * empty one.
+ */
+ if (MultirangeIsEmpty(mr))
+ return true;
+
+ if (RangeIsEmpty(r))
+ return false;
+
+ /* Range contains multirange iff it contains its union range. */
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+ multirange_get_bounds(rangetyp, mr, 0, &lower2, &tmp);
+ multirange_get_bounds(rangetyp, mr, mr->rangeCount - 1, &tmp, &upper2);
+
+ return range_bounds_contains(rangetyp, &lower1, &upper1, &lower2, &upper2);
+}
+
+
+/* multirange, multirange -> bool functions */
+
+/* equality (internal version) */
+bool
+multirange_eq_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr1,
+ const MultirangeType *mr2)
+{
+ int32 range_count_1;
+ int32 range_count_2;
+ int32 i;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ /* Different types should be prevented by ANYMULTIRANGE matching rules */
+ if (MultirangeTypeGetOid(mr1) != MultirangeTypeGetOid(mr2))
+ elog(ERROR, "multirange types do not match");
+
+ range_count_1 = mr1->rangeCount;
+ range_count_2 = mr2->rangeCount;
+
+ if (range_count_1 != range_count_2)
+ return false;
+
+ for (i = 0; i < range_count_1; i++)
+ {
+ multirange_get_bounds(rangetyp, mr1, i, &lower1, &upper1);
+ multirange_get_bounds(rangetyp, mr2, i, &lower2, &upper2);
+
+ if (range_cmp_bounds(rangetyp, &lower1, &lower2) != 0 ||
+ range_cmp_bounds(rangetyp, &upper1, &upper2) != 0)
+ return false;
+ }
+
+ return true;
+}
+
+/* equality */
+Datum
+multirange_eq(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_eq_internal(typcache->rngtype, mr1, mr2));
+}
+
+/* inequality (internal version) */
+bool
+multirange_ne_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr1,
+ const MultirangeType *mr2)
+{
+ return (!multirange_eq_internal(rangetyp, mr1, mr2));
+}
+
+/* inequality */
+Datum
+multirange_ne(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_ne_internal(typcache->rngtype, mr1, mr2));
+}
+
+/* overlaps? */
+Datum
+range_overlaps_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_overlaps_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_overlaps_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_overlaps_multirange_internal(typcache->rngtype, mr1, mr2));
+}
+
+/*
+ * Comparison function for checking if any range of multirange overlaps given
+ * key range using binary search.
+ */
+static int
+multirange_range_overlaps_bsearch_comparison(TypeCacheEntry *typcache,
+ RangeBound *lower, RangeBound *upper,
+ void *key, bool *match)
+{
+ RangeBound *keyLower = (RangeBound *) key;
+ RangeBound *keyUpper = (RangeBound *) key + 1;
+
+ if (range_cmp_bounds(typcache, keyUpper, lower) < 0)
+ return -1;
+ if (range_cmp_bounds(typcache, keyLower, upper) > 0)
+ return 1;
+
+ *match = true;
+ return 0;
+}
+
+bool
+range_overlaps_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound bounds[2];
+ bool empty;
+
+ /*
+ * Empties never overlap, even with empties. (This seems strange since
+ * they *do* contain each other, but we want to follow how ranges work.)
+ */
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return false;
+
+ range_deserialize(rangetyp, r, &bounds[0], &bounds[1], &empty);
+ Assert(!empty);
+
+ return multirange_bsearch_match(rangetyp, mr, bounds,
+ multirange_range_overlaps_bsearch_comparison);
+}
+
+bool
+multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr1,
+ const MultirangeType *mr2)
+{
+ int32 range_count1;
+ int32 range_count2;
+ int32 i1;
+ int32 i2;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ /*
+ * Empties never overlap, even with empties. (This seems strange since
+ * they *do* contain each other, but we want to follow how ranges work.)
+ */
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ return false;
+
+ range_count1 = mr1->rangeCount;
+ range_count2 = mr2->rangeCount;
+
+ /*
+ * Every range in mr1 gets a chance to overlap with the ranges in mr2, but
+ * we can use their ordering to avoid O(n^2). This is similar to
+ * range_overlaps_multirange where r1 : r2 :: mrr : r, but there if we
+ * don't find an overlap with r we're done, and here if we don't find an
+ * overlap with r2 we try the next r2.
+ */
+ i1 = 0;
+ multirange_get_bounds(rangetyp, mr1, i1, &lower1, &upper1);
+ for (i1 = 0, i2 = 0; i2 < range_count2; i2++)
+ {
+ multirange_get_bounds(rangetyp, mr2, i2, &lower2, &upper2);
+
+ /* Discard r1s while r1 << r2 */
+ while (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0)
+ {
+ if (++i1 >= range_count1)
+ return false;
+ multirange_get_bounds(rangetyp, mr1, i1, &lower1, &upper1);
+ }
+
+ /*
+ * If r1 && r2, we're done, otherwise we failed to find an overlap for
+ * r2, so go to the next one.
+ */
+ if (range_bounds_overlaps(rangetyp, &lower1, &upper1, &lower2, &upper2))
+ return true;
+ }
+
+ /* We looked through all of mr2 without finding an overlap */
+ return false;
+}
+
+/* does not extend to right of? */
+bool
+range_overleft_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+ multirange_get_bounds(rangetyp, mr, mr->rangeCount - 1,
+ &lower2, &upper2);
+
+ PG_RETURN_BOOL(range_cmp_bounds(rangetyp, &upper1, &upper2) <= 0);
+}
+
+Datum
+range_overleft_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_overleft_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_overleft_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+
+ if (MultirangeIsEmpty(mr) || RangeIsEmpty(r))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1,
+ &lower1, &upper1);
+ range_deserialize(typcache->rngtype, r, &lower2, &upper2, &empty);
+ Assert(!empty);
+
+ PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &upper1, &upper2) <= 0);
+}
+
+Datum
+multirange_overleft_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ multirange_get_bounds(typcache->rngtype, mr1, mr1->rangeCount - 1,
+ &lower1, &upper1);
+ multirange_get_bounds(typcache->rngtype, mr2, mr2->rangeCount - 1,
+ &lower2, &upper2);
+
+ PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &upper1, &upper2) <= 0);
+}
+
+/* does not extend to left of? */
+bool
+range_overright_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ PG_RETURN_BOOL(false);
+
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+ multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2);
+
+ return (range_cmp_bounds(rangetyp, &lower1, &lower2) >= 0);
+}
+
+Datum
+range_overright_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_overright_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_overright_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+
+ if (MultirangeIsEmpty(mr) || RangeIsEmpty(r))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ multirange_get_bounds(typcache->rngtype, mr, 0, &lower1, &upper1);
+ range_deserialize(typcache->rngtype, r, &lower2, &upper2, &empty);
+ Assert(!empty);
+
+ PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &lower1, &lower2) >= 0);
+}
+
+Datum
+multirange_overright_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ PG_RETURN_BOOL(false);
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ multirange_get_bounds(typcache->rngtype, mr1, 0, &lower1, &upper1);
+ multirange_get_bounds(typcache->rngtype, mr2, 0, &lower2, &upper2);
+
+ PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &lower1, &lower2) >= 0);
+}
+
+/* contains? */
+Datum
+multirange_contains_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache->rngtype, mr1, mr2));
+}
+
+/* contained by? */
+Datum
+multirange_contained_by_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache->rngtype, mr2, mr1));
+}
+
+/*
+ * Test whether multirange mr1 contains every range from another multirange mr2.
+ */
+bool
+multirange_contains_multirange_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr1,
+ const MultirangeType *mr2)
+{
+ int32 range_count1 = mr1->rangeCount;
+ int32 range_count2 = mr2->rangeCount;
+ int i1,
+ i2;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ /*
+ * We follow the same logic for empties as ranges: - an empty multirange
+ * contains an empty range/multirange. - an empty multirange can't contain
+ * any other range/multirange. - an empty multirange is contained by any
+ * other range/multirange.
+ */
+
+ if (range_count2 == 0)
+ return true;
+ if (range_count1 == 0)
+ return false;
+
+ /*
+ * Every range in mr2 must be contained by some range in mr1. To avoid
+ * O(n^2) we walk through both ranges in tandem.
+ */
+ i1 = 0;
+ multirange_get_bounds(rangetyp, mr1, i1, &lower1, &upper1);
+ for (i2 = 0; i2 < range_count2; i2++)
+ {
+ multirange_get_bounds(rangetyp, mr2, i2, &lower2, &upper2);
+
+ /* Discard r1s while r1 << r2 */
+ while (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0)
+ {
+ if (++i1 >= range_count1)
+ return false;
+ multirange_get_bounds(rangetyp, mr1, i1, &lower1, &upper1);
+ }
+
+ /*
+ * If r1 @> r2, go to the next r2, otherwise return false (since every
+ * r1[n] and r1[n+1] must have a gap). Note this will give weird
+ * answers if you don't canonicalize, e.g. with a custom
+ * int2multirange {[1,1], [2,2]} there is a "gap". But that is
+ * consistent with other range operators, e.g. '[1,1]'::int2range -|-
+ * '[2,2]'::int2range is false.
+ */
+ if (!range_bounds_contains(rangetyp, &lower1, &upper1,
+ &lower2, &upper2))
+ return false;
+ }
+
+ /* All ranges in mr2 are satisfied */
+ return true;
+}
+
+/* strictly left of? */
+Datum
+range_before_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_before_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_before_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_after_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_before_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_before_multirange_internal(typcache->rngtype, mr1, mr2));
+}
+
+/* strictly right of? */
+Datum
+range_after_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_after_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_after_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_before_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_after_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ PG_RETURN_BOOL(multirange_before_multirange_internal(typcache->rngtype, mr2, mr1));
+}
+
+/* strictly left of? (internal version) */
+bool
+range_before_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return false;
+
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+
+ multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2);
+
+ return (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0);
+}
+
+bool
+multirange_before_multirange_internal(TypeCacheEntry *rangetyp,
+ const MultirangeType *mr1,
+ const MultirangeType *mr2)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ return false;
+
+ multirange_get_bounds(rangetyp, mr1, mr1->rangeCount - 1,
+ &lower1, &upper1);
+ multirange_get_bounds(rangetyp, mr2, 0,
+ &lower2, &upper2);
+
+ return (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0);
+}
+
+/* strictly right of? (internal version) */
+bool
+range_after_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+ int32 range_count;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return false;
+
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+
+ range_count = mr->rangeCount;
+ multirange_get_bounds(rangetyp, mr, range_count - 1,
+ &lower2, &upper2);
+
+ return (range_cmp_bounds(rangetyp, &lower1, &upper2) > 0);
+}
+
+bool
+range_adjacent_multirange_internal(TypeCacheEntry *rangetyp,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+ bool empty;
+ int32 range_count;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return false;
+
+ range_deserialize(rangetyp, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+
+ range_count = mr->rangeCount;
+ multirange_get_bounds(rangetyp, mr, 0,
+ &lower2, &upper2);
+
+ if (bounds_adjacent(rangetyp, upper1, lower2))
+ return true;
+
+ if (range_count > 1)
+ multirange_get_bounds(rangetyp, mr, range_count - 1,
+ &lower2, &upper2);
+
+ if (bounds_adjacent(rangetyp, upper2, lower1))
+ return true;
+
+ return false;
+}
+
+/* adjacent to? */
+Datum
+range_adjacent_multirange(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_adjacent_range(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return false;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+
+ PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache->rngtype, r, mr));
+}
+
+Datum
+multirange_adjacent_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ TypeCacheEntry *typcache;
+ int32 range_count1;
+ int32 range_count2;
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
+ return false;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ range_count1 = mr1->rangeCount;
+ range_count2 = mr2->rangeCount;
+ multirange_get_bounds(typcache->rngtype, mr1, range_count1 - 1,
+ &lower1, &upper1);
+ multirange_get_bounds(typcache->rngtype, mr2, 0,
+ &lower2, &upper2);
+ if (bounds_adjacent(typcache->rngtype, upper1, lower2))
+ PG_RETURN_BOOL(true);
+
+ if (range_count1 > 1)
+ multirange_get_bounds(typcache->rngtype, mr1, 0,
+ &lower1, &upper1);
+ if (range_count2 > 1)
+ multirange_get_bounds(typcache->rngtype, mr2, range_count2 - 1,
+ &lower2, &upper2);
+ if (bounds_adjacent(typcache->rngtype, upper2, lower1))
+ PG_RETURN_BOOL(true);
+ PG_RETURN_BOOL(false);
+}
+
+/* Btree support */
+
+/* btree comparator */
+Datum
+multirange_cmp(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr1 = PG_GETARG_MULTIRANGE_P(0);
+ MultirangeType *mr2 = PG_GETARG_MULTIRANGE_P(1);
+ int32 range_count_1;
+ int32 range_count_2;
+ int32 range_count_max;
+ int32 i;
+ TypeCacheEntry *typcache;
+ int cmp = 0; /* If both are empty we'll use this. */
+
+ /* Different types should be prevented by ANYMULTIRANGE matching rules */
+ if (MultirangeTypeGetOid(mr1) != MultirangeTypeGetOid(mr2))
+ elog(ERROR, "multirange types do not match");
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1));
+
+ range_count_1 = mr1->rangeCount;
+ range_count_2 = mr2->rangeCount;
+
+ /* Loop over source data */
+ range_count_max = Max(range_count_1, range_count_2);
+ for (i = 0; i < range_count_max; i++)
+ {
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2;
+
+ /*
+ * If one multirange is shorter, it's as if it had empty ranges at the
+ * end to extend its length. An empty range compares earlier than any
+ * other range, so the shorter multirange comes before the longer.
+ * This is the same behavior as in other types, e.g. in strings 'aaa'
+ * < 'aaaaaa'.
+ */
+ if (i >= range_count_1)
+ {
+ cmp = -1;
+ break;
+ }
+ if (i >= range_count_2)
+ {
+ cmp = 1;
+ break;
+ }
+
+ multirange_get_bounds(typcache->rngtype, mr1, i, &lower1, &upper1);
+ multirange_get_bounds(typcache->rngtype, mr2, i, &lower2, &upper2);
+
+ cmp = range_cmp_bounds(typcache->rngtype, &lower1, &lower2);
+ if (cmp == 0)
+ cmp = range_cmp_bounds(typcache->rngtype, &upper1, &upper2);
+ if (cmp != 0)
+ break;
+ }
+
+ PG_FREE_IF_COPY(mr1, 0);
+ PG_FREE_IF_COPY(mr2, 1);
+
+ PG_RETURN_INT32(cmp);
+}
+
+/* inequality operators using the multirange_cmp function */
+Datum
+multirange_lt(PG_FUNCTION_ARGS)
+{
+ int cmp = multirange_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp < 0);
+}
+
+Datum
+multirange_le(PG_FUNCTION_ARGS)
+{
+ int cmp = multirange_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp <= 0);
+}
+
+Datum
+multirange_ge(PG_FUNCTION_ARGS)
+{
+ int cmp = multirange_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp >= 0);
+}
+
+Datum
+multirange_gt(PG_FUNCTION_ARGS)
+{
+ int cmp = multirange_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp > 0);
+}
+
+/* multirange -> range functions */
+
+/* Find the smallest range that includes everything in the multirange */
+Datum
+range_merge_from_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ Oid mltrngtypoid = MultirangeTypeGetOid(mr);
+ TypeCacheEntry *typcache;
+ RangeType *result;
+
+ typcache = multirange_get_typcache(fcinfo, mltrngtypoid);
+
+ if (MultirangeIsEmpty(mr))
+ {
+ result = make_empty_range(typcache->rngtype);
+ }
+ else if (mr->rangeCount == 1)
+ {
+ result = multirange_get_range(typcache->rngtype, mr, 0);
+ }
+ else
+ {
+ RangeBound firstLower,
+ firstUpper,
+ lastLower,
+ lastUpper;
+
+ multirange_get_bounds(typcache->rngtype, mr, 0,
+ &firstLower, &firstUpper);
+ multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1,
+ &lastLower, &lastUpper);
+
+ result = make_range(typcache->rngtype, &firstLower, &lastUpper, false);
+ }
+
+ PG_RETURN_RANGE_P(result);
+}
+
+/* Turn multirange into a set of ranges */
+Datum
+multirange_unnest(PG_FUNCTION_ARGS)
+{
+ typedef struct
+ {
+ MultirangeType *mr;
+ TypeCacheEntry *typcache;
+ int index;
+ } multirange_unnest_fctx;
+
+ FuncCallContext *funcctx;
+ multirange_unnest_fctx *fctx;
+ MemoryContext oldcontext;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ MultirangeType *mr;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /*
+ * Get the multirange value and detoast if needed. We can't do this
+ * earlier because if we have to detoast, we want the detoasted copy
+ * to be in multi_call_memory_ctx, so it will go away when we're done
+ * and not before. (If no detoast happens, we assume the originally
+ * passed multirange will stick around till then.)
+ */
+ mr = PG_GETARG_MULTIRANGE_P(0);
+
+ /* allocate memory for user context */
+ fctx = (multirange_unnest_fctx *) palloc(sizeof(multirange_unnest_fctx));
+
+ /* initialize state */
+ fctx->mr = mr;
+ fctx->index = 0;
+ fctx->typcache = lookup_type_cache(MultirangeTypeGetOid(mr),
+ TYPECACHE_MULTIRANGE_INFO);
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+ fctx = funcctx->user_fctx;
+
+ if (fctx->index < fctx->mr->rangeCount)
+ {
+ RangeType *range;
+
+ range = multirange_get_range(fctx->typcache->rngtype,
+ fctx->mr,
+ fctx->index);
+ fctx->index++;
+
+ SRF_RETURN_NEXT(funcctx, RangeTypePGetDatum(range));
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/* Hash support */
+
+/* hash a multirange value */
+Datum
+hash_multirange(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ uint32 result = 1;
+ TypeCacheEntry *typcache,
+ *scache;
+ int32 range_count,
+ i;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ scache = typcache->rngtype->rngelemtype;
+ if (!OidIsValid(scache->hash_proc_finfo.fn_oid))
+ {
+ scache = lookup_type_cache(scache->type_id,
+ TYPECACHE_HASH_PROC_FINFO);
+ if (!OidIsValid(scache->hash_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(scache->type_id))));
+ }
+
+ range_count = mr->rangeCount;
+ for (i = 0; i < range_count; i++)
+ {
+ RangeBound lower,
+ upper;
+ uint8 flags = MultirangeGetFlagsPtr(mr)[i];
+ uint32 lower_hash;
+ uint32 upper_hash;
+ uint32 range_hash;
+
+ multirange_get_bounds(typcache->rngtype, mr, i, &lower, &upper);
+
+ if (RANGE_HAS_LBOUND(flags))
+ lower_hash = DatumGetUInt32(FunctionCall1Coll(&scache->hash_proc_finfo,
+ typcache->rngtype->rng_collation,
+ lower.val));
+ else
+ lower_hash = 0;
+
+ if (RANGE_HAS_UBOUND(flags))
+ upper_hash = DatumGetUInt32(FunctionCall1Coll(&scache->hash_proc_finfo,
+ typcache->rngtype->rng_collation,
+ upper.val));
+ else
+ upper_hash = 0;
+
+ /* Merge hashes of flags and bounds */
+ range_hash = hash_uint32((uint32) flags);
+ range_hash ^= lower_hash;
+ range_hash = pg_rotate_left32(range_hash, 1);
+ range_hash ^= upper_hash;
+
+ /*
+ * Use the same approach as hash_array to combine the individual
+ * elements' hash values:
+ */
+ result = (result << 5) - result + range_hash;
+ }
+
+ PG_FREE_IF_COPY(mr, 0);
+
+ PG_RETURN_UINT32(result);
+}
+
+/*
+ * Returns 64-bit value by hashing a value to a 64-bit value, with a seed.
+ * Otherwise, similar to hash_multirange.
+ */
+Datum
+hash_multirange_extended(PG_FUNCTION_ARGS)
+{
+ MultirangeType *mr = PG_GETARG_MULTIRANGE_P(0);
+ Datum seed = PG_GETARG_DATUM(1);
+ uint64 result = 1;
+ TypeCacheEntry *typcache,
+ *scache;
+ int32 range_count,
+ i;
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ scache = typcache->rngtype->rngelemtype;
+ if (!OidIsValid(scache->hash_extended_proc_finfo.fn_oid))
+ {
+ scache = lookup_type_cache(scache->type_id,
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO);
+ if (!OidIsValid(scache->hash_extended_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(scache->type_id))));
+ }
+
+ range_count = mr->rangeCount;
+ for (i = 0; i < range_count; i++)
+ {
+ RangeBound lower,
+ upper;
+ uint8 flags = MultirangeGetFlagsPtr(mr)[i];
+ uint64 lower_hash;
+ uint64 upper_hash;
+ uint64 range_hash;
+
+ multirange_get_bounds(typcache->rngtype, mr, i, &lower, &upper);
+
+ if (RANGE_HAS_LBOUND(flags))
+ lower_hash = DatumGetUInt64(FunctionCall2Coll(&scache->hash_extended_proc_finfo,
+ typcache->rngtype->rng_collation,
+ lower.val,
+ seed));
+ else
+ lower_hash = 0;
+
+ if (RANGE_HAS_UBOUND(flags))
+ upper_hash = DatumGetUInt64(FunctionCall2Coll(&scache->hash_extended_proc_finfo,
+ typcache->rngtype->rng_collation,
+ upper.val,
+ seed));
+ else
+ upper_hash = 0;
+
+ /* Merge hashes of flags and bounds */
+ range_hash = DatumGetUInt64(hash_uint32_extended((uint32) flags,
+ DatumGetInt64(seed)));
+ range_hash ^= lower_hash;
+ range_hash = ROTATE_HIGH_AND_LOW_32BITS(range_hash);
+ range_hash ^= upper_hash;
+
+ /*
+ * Use the same approach as hash_array to combine the individual
+ * elements' hash values:
+ */
+ result = (result << 5) - result + range_hash;
+ }
+
+ PG_FREE_IF_COPY(mr, 0);
+
+ PG_RETURN_UINT64(result);
+}
diff --git a/src/backend/utils/adt/multirangetypes_selfuncs.c b/src/backend/utils/adt/multirangetypes_selfuncs.c
new file mode 100644
index 0000000..3af91b8
--- /dev/null
+++ b/src/backend/utils/adt/multirangetypes_selfuncs.c
@@ -0,0 +1,1336 @@
+/*-------------------------------------------------------------------------
+ *
+ * multirangetypes_selfuncs.c
+ * Functions for selectivity estimation of multirange operators
+ *
+ * Estimates are based on histograms of lower and upper bounds, and the
+ * fraction of empty multiranges.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/multirangetypes_selfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_type.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/lsyscache.h"
+#include "utils/rangetypes.h"
+#include "utils/multirangetypes.h"
+#include "utils/selfuncs.h"
+#include "utils/typcache.h"
+
+static double calc_multirangesel(TypeCacheEntry *typcache,
+ VariableStatData *vardata,
+ const MultirangeType *constval, Oid operator);
+static double default_multirange_selectivity(Oid operator);
+static double calc_hist_selectivity(TypeCacheEntry *typcache,
+ VariableStatData *vardata,
+ const MultirangeType *constval,
+ Oid operator);
+static double calc_hist_selectivity_scalar(TypeCacheEntry *typcache,
+ const RangeBound *constbound,
+ const RangeBound *hist,
+ int hist_nvalues, bool equal);
+static int rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value,
+ const RangeBound *hist, int hist_length, bool equal);
+static float8 get_position(TypeCacheEntry *typcache, const RangeBound *value,
+ const RangeBound *hist1, const RangeBound *hist2);
+static float8 get_len_position(double value, double hist1, double hist2);
+static float8 get_distance(TypeCacheEntry *typcache, const RangeBound *bound1,
+ const RangeBound *bound2);
+static int length_hist_bsearch(Datum *length_hist_values,
+ int length_hist_nvalues, double value,
+ bool equal);
+static double calc_length_hist_frac(Datum *length_hist_values,
+ int length_hist_nvalues, double length1,
+ double length2, bool equal);
+static double calc_hist_selectivity_contained(TypeCacheEntry *typcache,
+ const RangeBound *lower,
+ RangeBound *upper,
+ const RangeBound *hist_lower,
+ int hist_nvalues,
+ Datum *length_hist_values,
+ int length_hist_nvalues);
+static double calc_hist_selectivity_contains(TypeCacheEntry *typcache,
+ const RangeBound *lower,
+ const RangeBound *upper,
+ const RangeBound *hist_lower,
+ int hist_nvalues,
+ Datum *length_hist_values,
+ int length_hist_nvalues);
+
+/*
+ * Returns a default selectivity estimate for given operator, when we don't
+ * have statistics or cannot use them for some reason.
+ */
+static double
+default_multirange_selectivity(Oid operator)
+{
+ switch (operator)
+ {
+ case OID_MULTIRANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RANGE_OP:
+ case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
+ return 0.01;
+
+ case OID_RANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_RANGE_MULTIRANGE_CONTAINED_OP:
+ case OID_MULTIRANGE_CONTAINS_RANGE_OP:
+ case OID_MULTIRANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+ case OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP:
+ return 0.005;
+
+ case OID_MULTIRANGE_CONTAINS_ELEM_OP:
+ case OID_MULTIRANGE_ELEM_CONTAINED_OP:
+
+ /*
+ * "multirange @> elem" is more or less identical to a scalar
+ * inequality "A >= b AND A <= c".
+ */
+ return DEFAULT_MULTIRANGE_INEQ_SEL;
+
+ case OID_MULTIRANGE_LESS_OP:
+ case OID_MULTIRANGE_LESS_EQUAL_OP:
+ case OID_MULTIRANGE_GREATER_OP:
+ case OID_MULTIRANGE_GREATER_EQUAL_OP:
+ case OID_MULTIRANGE_LEFT_RANGE_OP:
+ case OID_MULTIRANGE_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_RIGHT_RANGE_OP:
+ case OID_MULTIRANGE_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_RIGHT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP:
+ case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ /* these are similar to regular scalar inequalities */
+ return DEFAULT_INEQ_SEL;
+
+ default:
+
+ /*
+ * all multirange operators should be handled above, but just in
+ * case
+ */
+ return 0.01;
+ }
+}
+
+/*
+ * multirangesel -- restriction selectivity for multirange operators
+ */
+Datum
+multirangesel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Selectivity selec;
+ TypeCacheEntry *typcache = NULL;
+ MultirangeType *constmultirange = NULL;
+ RangeType *constrange = NULL;
+
+ /*
+ * If expression is not (variable op something) or (something op
+ * variable), then punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ PG_RETURN_FLOAT8(default_multirange_selectivity(operator));
+
+ /*
+ * Can't do anything useful if the something is not a constant, either.
+ */
+ if (!IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(default_multirange_selectivity(operator));
+ }
+
+ /*
+ * All the multirange operators are strict, so we can cope with a NULL
+ * constant right away.
+ */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(0.0);
+ }
+
+ /*
+ * If var is on the right, commute the operator, so that we can assume the
+ * var is on the left in what follows.
+ */
+ if (!varonleft)
+ {
+ /* we have other Op var, commute to make var Op other */
+ operator = get_commutator(operator);
+ if (!operator)
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(default_multirange_selectivity(operator));
+ }
+ }
+
+ /*
+ * OK, there's a Var and a Const we're dealing with here. We need the
+ * Const to be of same multirange type as the column, else we can't do
+ * anything useful. (Such cases will likely fail at runtime, but here we'd
+ * rather just return a default estimate.)
+ *
+ * If the operator is "multirange @> element", the constant should be of
+ * the element type of the multirange column. Convert it to a multirange
+ * that includes only that single point, so that we don't need special
+ * handling for that in what follows.
+ */
+ if (operator == OID_MULTIRANGE_CONTAINS_ELEM_OP)
+ {
+ typcache = multirange_get_typcache(fcinfo, vardata.vartype);
+
+ if (((Const *) other)->consttype == typcache->rngtype->rngelemtype->type_id)
+ {
+ RangeBound lower,
+ upper;
+
+ lower.inclusive = true;
+ lower.val = ((Const *) other)->constvalue;
+ lower.infinite = false;
+ lower.lower = true;
+ upper.inclusive = true;
+ upper.val = ((Const *) other)->constvalue;
+ upper.infinite = false;
+ upper.lower = false;
+ constrange = range_serialize(typcache->rngtype, &lower, &upper, false);
+ constmultirange = make_multirange(typcache->type_id, typcache->rngtype,
+ 1, &constrange);
+ }
+ }
+ else if (operator == OID_RANGE_MULTIRANGE_CONTAINED_OP ||
+ operator == OID_MULTIRANGE_CONTAINS_RANGE_OP ||
+ operator == OID_MULTIRANGE_OVERLAPS_RANGE_OP ||
+ operator == OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP ||
+ operator == OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP ||
+ operator == OID_MULTIRANGE_LEFT_RANGE_OP ||
+ operator == OID_MULTIRANGE_RIGHT_RANGE_OP)
+ {
+ /*
+ * Promote a range in "multirange OP range" just like we do an element
+ * in "multirange OP element".
+ */
+ typcache = multirange_get_typcache(fcinfo, vardata.vartype);
+ if (((Const *) other)->consttype == typcache->rngtype->type_id)
+ {
+ constrange = DatumGetRangeTypeP(((Const *) other)->constvalue);
+ constmultirange = make_multirange(typcache->type_id, typcache->rngtype,
+ 1, &constrange);
+ }
+ }
+ else if (operator == OID_RANGE_OVERLAPS_MULTIRANGE_OP ||
+ operator == OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP ||
+ operator == OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP ||
+ operator == OID_RANGE_LEFT_MULTIRANGE_OP ||
+ operator == OID_RANGE_RIGHT_MULTIRANGE_OP ||
+ operator == OID_RANGE_CONTAINS_MULTIRANGE_OP ||
+ operator == OID_MULTIRANGE_ELEM_CONTAINED_OP ||
+ operator == OID_MULTIRANGE_RANGE_CONTAINED_OP)
+ {
+ /*
+ * Here, the Var is the elem/range, not the multirange. For now we
+ * just punt and return the default estimate. In future we could
+ * disassemble the multirange constant to do something more
+ * intelligent.
+ */
+ }
+ else if (((Const *) other)->consttype == vardata.vartype)
+ {
+ /* Both sides are the same multirange type */
+ typcache = multirange_get_typcache(fcinfo, vardata.vartype);
+
+ constmultirange = DatumGetMultirangeTypeP(((Const *) other)->constvalue);
+ }
+
+ /*
+ * If we got a valid constant on one side of the operator, proceed to
+ * estimate using statistics. Otherwise punt and return a default constant
+ * estimate. Note that calc_multirangesel need not handle
+ * OID_MULTIRANGE_*_CONTAINED_OP.
+ */
+ if (constmultirange)
+ selec = calc_multirangesel(typcache, &vardata, constmultirange, operator);
+ else
+ selec = default_multirange_selectivity(operator);
+
+ ReleaseVariableStats(vardata);
+
+ CLAMP_PROBABILITY(selec);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+static double
+calc_multirangesel(TypeCacheEntry *typcache, VariableStatData *vardata,
+ const MultirangeType *constval, Oid operator)
+{
+ double hist_selec;
+ double selec;
+ float4 empty_frac,
+ null_frac;
+
+ /*
+ * First look up the fraction of NULLs and empty multiranges from
+ * pg_statistic.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ Form_pg_statistic stats;
+ AttStatsSlot sslot;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+ null_frac = stats->stanullfrac;
+
+ /* Try to get fraction of empty multiranges */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM,
+ InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ if (sslot.nnumbers != 1)
+ elog(ERROR, "invalid empty fraction statistic"); /* shouldn't happen */
+ empty_frac = sslot.numbers[0];
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /* No empty fraction statistic. Assume no empty ranges. */
+ empty_frac = 0.0;
+ }
+ }
+ else
+ {
+ /*
+ * No stats are available. Follow through the calculations below
+ * anyway, assuming no NULLs and no empty multiranges. This still
+ * allows us to give a better-than-nothing estimate based on whether
+ * the constant is an empty multirange or not.
+ */
+ null_frac = 0.0;
+ empty_frac = 0.0;
+ }
+
+ if (MultirangeIsEmpty(constval))
+ {
+ /*
+ * An empty multirange matches all multiranges, all empty multiranges,
+ * or nothing, depending on the operator
+ */
+ switch (operator)
+ {
+ /* these return false if either argument is empty */
+ case OID_MULTIRANGE_OVERLAPS_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_LEFT_RANGE_OP:
+ case OID_MULTIRANGE_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_RIGHT_RANGE_OP:
+ case OID_MULTIRANGE_RIGHT_MULTIRANGE_OP:
+ /* nothing is less than an empty multirange */
+ case OID_MULTIRANGE_LESS_OP:
+ selec = 0.0;
+ break;
+
+ /*
+ * only empty multiranges can be contained by an empty
+ * multirange
+ */
+ case OID_RANGE_MULTIRANGE_CONTAINED_OP:
+ case OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP:
+ /* only empty ranges are <= an empty multirange */
+ case OID_MULTIRANGE_LESS_EQUAL_OP:
+ selec = empty_frac;
+ break;
+
+ /* everything contains an empty multirange */
+ case OID_MULTIRANGE_CONTAINS_RANGE_OP:
+ case OID_MULTIRANGE_CONTAINS_MULTIRANGE_OP:
+ /* everything is >= an empty multirange */
+ case OID_MULTIRANGE_GREATER_EQUAL_OP:
+ selec = 1.0;
+ break;
+
+ /* all non-empty multiranges are > an empty multirange */
+ case OID_MULTIRANGE_GREATER_OP:
+ selec = 1.0 - empty_frac;
+ break;
+
+ /* an element cannot be empty */
+ case OID_MULTIRANGE_CONTAINS_ELEM_OP:
+
+ /* filtered out by multirangesel() */
+ case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_ELEM_CONTAINED_OP:
+ case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+
+ default:
+ elog(ERROR, "unexpected operator %u", operator);
+ selec = 0.0; /* keep compiler quiet */
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * Calculate selectivity using bound histograms. If that fails for
+ * some reason, e.g no histogram in pg_statistic, use the default
+ * constant estimate for the fraction of non-empty values. This is
+ * still somewhat better than just returning the default estimate,
+ * because this still takes into account the fraction of empty and
+ * NULL tuples, if we had statistics for them.
+ */
+ hist_selec = calc_hist_selectivity(typcache, vardata, constval,
+ operator);
+ if (hist_selec < 0.0)
+ hist_selec = default_multirange_selectivity(operator);
+
+ /*
+ * Now merge the results for the empty multiranges and histogram
+ * calculations, realizing that the histogram covers only the
+ * non-null, non-empty values.
+ */
+ if (operator == OID_RANGE_MULTIRANGE_CONTAINED_OP ||
+ operator == OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP)
+ {
+ /* empty is contained by anything non-empty */
+ selec = (1.0 - empty_frac) * hist_selec + empty_frac;
+ }
+ else
+ {
+ /* with any other operator, empty Op non-empty matches nothing */
+ selec = (1.0 - empty_frac) * hist_selec;
+ }
+ }
+
+ /* all multirange operators are strict */
+ selec *= (1.0 - null_frac);
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * Calculate multirange operator selectivity using histograms of multirange bounds.
+ *
+ * This estimate is for the portion of values that are not empty and not
+ * NULL.
+ */
+static double
+calc_hist_selectivity(TypeCacheEntry *typcache, VariableStatData *vardata,
+ const MultirangeType *constval, Oid operator)
+{
+ TypeCacheEntry *rng_typcache = typcache->rngtype;
+ AttStatsSlot hslot;
+ AttStatsSlot lslot;
+ int nhist;
+ RangeBound *hist_lower;
+ RangeBound *hist_upper;
+ int i;
+ RangeBound const_lower;
+ RangeBound const_upper;
+ RangeBound tmp;
+ double hist_selec;
+
+ /* Can't use the histogram with insecure multirange support functions */
+ if (!statistic_proc_security_check(vardata,
+ rng_typcache->rng_cmp_proc_finfo.fn_oid))
+ return -1;
+ if (OidIsValid(rng_typcache->rng_subdiff_finfo.fn_oid) &&
+ !statistic_proc_security_check(vardata,
+ rng_typcache->rng_subdiff_finfo.fn_oid))
+ return -1;
+
+ /* Try to get histogram of ranges */
+ if (!(HeapTupleIsValid(vardata->statsTuple) &&
+ get_attstatsslot(&hslot, vardata->statsTuple,
+ STATISTIC_KIND_BOUNDS_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES)))
+ return -1.0;
+
+ /* check that it's a histogram, not just a dummy entry */
+ if (hslot.nvalues < 2)
+ {
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+
+ /*
+ * Convert histogram of ranges into histograms of its lower and upper
+ * bounds.
+ */
+ nhist = hslot.nvalues;
+ hist_lower = (RangeBound *) palloc(sizeof(RangeBound) * nhist);
+ hist_upper = (RangeBound *) palloc(sizeof(RangeBound) * nhist);
+ for (i = 0; i < nhist; i++)
+ {
+ bool empty;
+
+ range_deserialize(rng_typcache, DatumGetRangeTypeP(hslot.values[i]),
+ &hist_lower[i], &hist_upper[i], &empty);
+ /* The histogram should not contain any empty ranges */
+ if (empty)
+ elog(ERROR, "bounds histogram contains an empty range");
+ }
+
+ /* @> and @< also need a histogram of range lengths */
+ if (operator == OID_MULTIRANGE_CONTAINS_RANGE_OP ||
+ operator == OID_MULTIRANGE_CONTAINS_MULTIRANGE_OP ||
+ operator == OID_MULTIRANGE_RANGE_CONTAINED_OP ||
+ operator == OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP)
+ {
+ if (!(HeapTupleIsValid(vardata->statsTuple) &&
+ get_attstatsslot(&lslot, vardata->statsTuple,
+ STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM,
+ InvalidOid,
+ ATTSTATSSLOT_VALUES)))
+ {
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+
+ /* check that it's a histogram, not just a dummy entry */
+ if (lslot.nvalues < 2)
+ {
+ free_attstatsslot(&lslot);
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+ }
+ else
+ memset(&lslot, 0, sizeof(lslot));
+
+ /* Extract the bounds of the constant value. */
+ Assert(constval->rangeCount > 0);
+ multirange_get_bounds(rng_typcache, constval, 0,
+ &const_lower, &tmp);
+ multirange_get_bounds(rng_typcache, constval, constval->rangeCount - 1,
+ &tmp, &const_upper);
+
+ /*
+ * Calculate selectivity comparing the lower or upper bound of the
+ * constant with the histogram of lower or upper bounds.
+ */
+ switch (operator)
+ {
+ case OID_MULTIRANGE_LESS_OP:
+
+ /*
+ * The regular b-tree comparison operators (<, <=, >, >=) compare
+ * the lower bounds first, and the upper bounds for values with
+ * equal lower bounds. Estimate that by comparing the lower bounds
+ * only. This gives a fairly accurate estimate assuming there
+ * aren't many rows with a lower bound equal to the constant's
+ * lower bound.
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_MULTIRANGE_LESS_EQUAL_OP:
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_MULTIRANGE_GREATER_OP:
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_MULTIRANGE_GREATER_EQUAL_OP:
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_MULTIRANGE_LEFT_RANGE_OP:
+ case OID_MULTIRANGE_LEFT_MULTIRANGE_OP:
+ /* var << const when upper(var) < lower(const) */
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_upper, nhist, false);
+ break;
+
+ case OID_MULTIRANGE_RIGHT_RANGE_OP:
+ case OID_MULTIRANGE_RIGHT_MULTIRANGE_OP:
+ /* var >> const when lower(var) > upper(const) */
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(rng_typcache, &const_upper,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ /* compare lower bounds */
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ /* compare upper bounds */
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache, &const_upper,
+ hist_upper, nhist, true);
+ break;
+
+ case OID_MULTIRANGE_OVERLAPS_RANGE_OP:
+ case OID_MULTIRANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_CONTAINS_ELEM_OP:
+
+ /*
+ * A && B <=> NOT (A << B OR A >> B).
+ *
+ * Since A << B and A >> B are mutually exclusive events we can
+ * sum their probabilities to find probability of (A << B OR A >>
+ * B).
+ *
+ * "multirange @> elem" is equivalent to "multirange &&
+ * {[elem,elem]}". The caller already constructed the singular
+ * range from the element constant, so just treat it the same as
+ * &&.
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache,
+ &const_lower, hist_upper,
+ nhist, false);
+ hist_selec +=
+ (1.0 - calc_hist_selectivity_scalar(rng_typcache,
+ &const_upper, hist_lower,
+ nhist, true));
+ hist_selec = 1.0 - hist_selec;
+ break;
+
+ case OID_MULTIRANGE_CONTAINS_RANGE_OP:
+ case OID_MULTIRANGE_CONTAINS_MULTIRANGE_OP:
+ hist_selec =
+ calc_hist_selectivity_contains(rng_typcache, &const_lower,
+ &const_upper, hist_lower, nhist,
+ lslot.values, lslot.nvalues);
+ break;
+
+ case OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP:
+ case OID_RANGE_MULTIRANGE_CONTAINED_OP:
+ if (const_lower.infinite)
+ {
+ /*
+ * Lower bound no longer matters. Just estimate the fraction
+ * with an upper bound <= const upper bound
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(rng_typcache, &const_upper,
+ hist_upper, nhist, true);
+ }
+ else if (const_upper.infinite)
+ {
+ hist_selec =
+ 1.0 - calc_hist_selectivity_scalar(rng_typcache, &const_lower,
+ hist_lower, nhist, false);
+ }
+ else
+ {
+ hist_selec =
+ calc_hist_selectivity_contained(rng_typcache, &const_lower,
+ &const_upper, hist_lower, nhist,
+ lslot.values, lslot.nvalues);
+ }
+ break;
+
+ /* filtered out by multirangesel() */
+ case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_ELEM_CONTAINED_OP:
+ case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+
+ default:
+ elog(ERROR, "unknown multirange operator %u", operator);
+ hist_selec = -1.0; /* keep compiler quiet */
+ break;
+ }
+
+ free_attstatsslot(&lslot);
+ free_attstatsslot(&hslot);
+
+ return hist_selec;
+}
+
+
+/*
+ * Look up the fraction of values less than (or equal, if 'equal' argument
+ * is true) a given const in a histogram of range bounds.
+ */
+static double
+calc_hist_selectivity_scalar(TypeCacheEntry *typcache, const RangeBound *constbound,
+ const RangeBound *hist, int hist_nvalues, bool equal)
+{
+ Selectivity selec;
+ int index;
+
+ /*
+ * Find the histogram bin the given constant falls into. Estimate
+ * selectivity as the number of preceding whole bins.
+ */
+ index = rbound_bsearch(typcache, constbound, hist, hist_nvalues, equal);
+ selec = (Selectivity) (Max(index, 0)) / (Selectivity) (hist_nvalues - 1);
+
+ /* Adjust using linear interpolation within the bin */
+ if (index >= 0 && index < hist_nvalues - 1)
+ selec += get_position(typcache, constbound, &hist[index],
+ &hist[index + 1]) / (Selectivity) (hist_nvalues - 1);
+
+ return selec;
+}
+
+/*
+ * Binary search on an array of range bounds. Returns greatest index of range
+ * bound in array which is less(less or equal) than given range bound. If all
+ * range bounds in array are greater or equal(greater) than given range bound,
+ * return -1. When "equal" flag is set conditions in brackets are used.
+ *
+ * This function is used in scalar operator selectivity estimation. Another
+ * goal of this function is to find a histogram bin where to stop
+ * interpolation of portion of bounds which are less than or equal to given bound.
+ */
+static int
+rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value, const RangeBound *hist,
+ int hist_length, bool equal)
+{
+ int lower = -1,
+ upper = hist_length - 1,
+ cmp,
+ middle;
+
+ while (lower < upper)
+ {
+ middle = (lower + upper + 1) / 2;
+ cmp = range_cmp_bounds(typcache, &hist[middle], value);
+
+ if (cmp < 0 || (equal && cmp == 0))
+ lower = middle;
+ else
+ upper = middle - 1;
+ }
+ return lower;
+}
+
+
+/*
+ * Binary search on length histogram. Returns greatest index of range length in
+ * histogram which is less than (less than or equal) the given length value. If
+ * all lengths in the histogram are greater than (greater than or equal) the
+ * given length, returns -1.
+ */
+static int
+length_hist_bsearch(Datum *length_hist_values, int length_hist_nvalues,
+ double value, bool equal)
+{
+ int lower = -1,
+ upper = length_hist_nvalues - 1,
+ middle;
+
+ while (lower < upper)
+ {
+ double middleval;
+
+ middle = (lower + upper + 1) / 2;
+
+ middleval = DatumGetFloat8(length_hist_values[middle]);
+ if (middleval < value || (equal && middleval <= value))
+ lower = middle;
+ else
+ upper = middle - 1;
+ }
+ return lower;
+}
+
+/*
+ * Get relative position of value in histogram bin in [0,1] range.
+ */
+static float8
+get_position(TypeCacheEntry *typcache, const RangeBound *value, const RangeBound *hist1,
+ const RangeBound *hist2)
+{
+ bool has_subdiff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+ float8 position;
+
+ if (!hist1->infinite && !hist2->infinite)
+ {
+ float8 bin_width;
+
+ /*
+ * Both bounds are finite. Assuming the subtype's comparison function
+ * works sanely, the value must be finite, too, because it lies
+ * somewhere between the bounds. If it doesn't, arbitrarily return
+ * 0.5.
+ */
+ if (value->infinite)
+ return 0.5;
+
+ /* Can't interpolate without subdiff function */
+ if (!has_subdiff)
+ return 0.5;
+
+ /* Calculate relative position using subdiff function. */
+ bin_width = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ hist2->val,
+ hist1->val));
+ if (isnan(bin_width) || bin_width <= 0.0)
+ return 0.5; /* punt for NaN or zero-width bin */
+
+ position = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ value->val,
+ hist1->val))
+ / bin_width;
+
+ if (isnan(position))
+ return 0.5; /* punt for NaN from subdiff, Inf/Inf, etc */
+
+ /* Relative position must be in [0,1] range */
+ position = Max(position, 0.0);
+ position = Min(position, 1.0);
+ return position;
+ }
+ else if (hist1->infinite && !hist2->infinite)
+ {
+ /*
+ * Lower bin boundary is -infinite, upper is finite. If the value is
+ * -infinite, return 0.0 to indicate it's equal to the lower bound.
+ * Otherwise return 1.0 to indicate it's infinitely far from the lower
+ * bound.
+ */
+ return ((value->infinite && value->lower) ? 0.0 : 1.0);
+ }
+ else if (!hist1->infinite && hist2->infinite)
+ {
+ /* same as above, but in reverse */
+ return ((value->infinite && !value->lower) ? 1.0 : 0.0);
+ }
+ else
+ {
+ /*
+ * If both bin boundaries are infinite, they should be equal to each
+ * other, and the value should also be infinite and equal to both
+ * bounds. (But don't Assert that, to avoid crashing if a user creates
+ * a datatype with a broken comparison function).
+ *
+ * Assume the value to lie in the middle of the infinite bounds.
+ */
+ return 0.5;
+ }
+}
+
+
+/*
+ * Get relative position of value in a length histogram bin in [0,1] range.
+ */
+static double
+get_len_position(double value, double hist1, double hist2)
+{
+ if (!isinf(hist1) && !isinf(hist2))
+ {
+ /*
+ * Both bounds are finite. The value should be finite too, because it
+ * lies somewhere between the bounds. If it doesn't, just return
+ * something.
+ */
+ if (isinf(value))
+ return 0.5;
+
+ return 1.0 - (hist2 - value) / (hist2 - hist1);
+ }
+ else if (isinf(hist1) && !isinf(hist2))
+ {
+ /*
+ * Lower bin boundary is -infinite, upper is finite. Return 1.0 to
+ * indicate the value is infinitely far from the lower bound.
+ */
+ return 1.0;
+ }
+ else if (isinf(hist1) && isinf(hist2))
+ {
+ /* same as above, but in reverse */
+ return 0.0;
+ }
+ else
+ {
+ /*
+ * If both bin boundaries are infinite, they should be equal to each
+ * other, and the value should also be infinite and equal to both
+ * bounds. (But don't Assert that, to avoid crashing unnecessarily if
+ * the caller messes up)
+ *
+ * Assume the value to lie in the middle of the infinite bounds.
+ */
+ return 0.5;
+ }
+}
+
+/*
+ * Measure distance between two range bounds.
+ */
+static float8
+get_distance(TypeCacheEntry *typcache, const RangeBound *bound1, const RangeBound *bound2)
+{
+ bool has_subdiff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+
+ if (!bound1->infinite && !bound2->infinite)
+ {
+ /*
+ * Neither bound is infinite, use subdiff function or return default
+ * value of 1.0 if no subdiff is available.
+ */
+ if (has_subdiff)
+ {
+ float8 res;
+
+ res = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ bound2->val,
+ bound1->val));
+ /* Reject possible NaN result, also negative result */
+ if (isnan(res) || res < 0.0)
+ return 1.0;
+ else
+ return res;
+ }
+ else
+ return 1.0;
+ }
+ else if (bound1->infinite && bound2->infinite)
+ {
+ /* Both bounds are infinite */
+ if (bound1->lower == bound2->lower)
+ return 0.0;
+ else
+ return get_float8_infinity();
+ }
+ else
+ {
+ /* One bound is infinite, the other is not */
+ return get_float8_infinity();
+ }
+}
+
+/*
+ * Calculate the average of function P(x), in the interval [length1, length2],
+ * where P(x) is the fraction of tuples with length < x (or length <= x if
+ * 'equal' is true).
+ */
+static double
+calc_length_hist_frac(Datum *length_hist_values, int length_hist_nvalues,
+ double length1, double length2, bool equal)
+{
+ double frac;
+ double A,
+ B,
+ PA,
+ PB;
+ double pos;
+ int i;
+ double area;
+
+ Assert(length2 >= length1);
+
+ if (length2 < 0.0)
+ return 0.0; /* shouldn't happen, but doesn't hurt to check */
+
+ /* All lengths in the table are <= infinite. */
+ if (isinf(length2) && equal)
+ return 1.0;
+
+ /*----------
+ * The average of a function between A and B can be calculated by the
+ * formula:
+ *
+ * B
+ * 1 /
+ * ------- | P(x)dx
+ * B - A /
+ * A
+ *
+ * The geometrical interpretation of the integral is the area under the
+ * graph of P(x). P(x) is defined by the length histogram. We calculate
+ * the area in a piecewise fashion, iterating through the length histogram
+ * bins. Each bin is a trapezoid:
+ *
+ * P(x2)
+ * /|
+ * / |
+ * P(x1)/ |
+ * | |
+ * | |
+ * ---+---+--
+ * x1 x2
+ *
+ * where x1 and x2 are the boundaries of the current histogram, and P(x1)
+ * and P(x1) are the cumulative fraction of tuples at the boundaries.
+ *
+ * The area of each trapezoid is 1/2 * (P(x2) + P(x1)) * (x2 - x1)
+ *
+ * The first bin contains the lower bound passed by the caller, so we
+ * use linear interpolation between the previous and next histogram bin
+ * boundary to calculate P(x1). Likewise for the last bin: we use linear
+ * interpolation to calculate P(x2). For the bins in between, x1 and x2
+ * lie on histogram bin boundaries, so P(x1) and P(x2) are simply:
+ * P(x1) = (bin index) / (number of bins)
+ * P(x2) = (bin index + 1 / (number of bins)
+ */
+
+ /* First bin, the one that contains lower bound */
+ i = length_hist_bsearch(length_hist_values, length_hist_nvalues, length1, equal);
+ if (i >= length_hist_nvalues - 1)
+ return 1.0;
+
+ if (i < 0)
+ {
+ i = 0;
+ pos = 0.0;
+ }
+ else
+ {
+ /* interpolate length1's position in the bin */
+ pos = get_len_position(length1,
+ DatumGetFloat8(length_hist_values[i]),
+ DatumGetFloat8(length_hist_values[i + 1]));
+ }
+ PB = (((double) i) + pos) / (double) (length_hist_nvalues - 1);
+ B = length1;
+
+ /*
+ * In the degenerate case that length1 == length2, simply return
+ * P(length1). This is not merely an optimization: if length1 == length2,
+ * we'd divide by zero later on.
+ */
+ if (length2 == length1)
+ return PB;
+
+ /*
+ * Loop through all the bins, until we hit the last bin, the one that
+ * contains the upper bound. (if lower and upper bounds are in the same
+ * bin, this falls out immediately)
+ */
+ area = 0.0;
+ for (; i < length_hist_nvalues - 1; i++)
+ {
+ double bin_upper = DatumGetFloat8(length_hist_values[i + 1]);
+
+ /* check if we've reached the last bin */
+ if (!(bin_upper < length2 || (equal && bin_upper <= length2)))
+ break;
+
+ /* the upper bound of previous bin is the lower bound of this bin */
+ A = B;
+ PA = PB;
+
+ B = bin_upper;
+ PB = (double) i / (double) (length_hist_nvalues - 1);
+
+ /*
+ * Add the area of this trapezoid to the total. The point of the
+ * if-check is to avoid NaN, in the corner case that PA == PB == 0,
+ * and B - A == Inf. The area of a zero-height trapezoid (PA == PB ==
+ * 0) is zero, regardless of the width (B - A).
+ */
+ if (PA > 0 || PB > 0)
+ area += 0.5 * (PB + PA) * (B - A);
+ }
+
+ /* Last bin */
+ A = B;
+ PA = PB;
+
+ B = length2; /* last bin ends at the query upper bound */
+ if (i >= length_hist_nvalues - 1)
+ pos = 0.0;
+ else
+ {
+ if (DatumGetFloat8(length_hist_values[i]) == DatumGetFloat8(length_hist_values[i + 1]))
+ pos = 0.0;
+ else
+ pos = get_len_position(length2,
+ DatumGetFloat8(length_hist_values[i]),
+ DatumGetFloat8(length_hist_values[i + 1]));
+ }
+ PB = (((double) i) + pos) / (double) (length_hist_nvalues - 1);
+
+ if (PA > 0 || PB > 0)
+ area += 0.5 * (PB + PA) * (B - A);
+
+ /*
+ * Ok, we have calculated the area, ie. the integral. Divide by width to
+ * get the requested average.
+ *
+ * Avoid NaN arising from infinite / infinite. This happens at least if
+ * length2 is infinite. It's not clear what the correct value would be in
+ * that case, so 0.5 seems as good as any value.
+ */
+ if (isinf(area) && isinf(length2))
+ frac = 0.5;
+ else
+ frac = area / (length2 - length1);
+
+ return frac;
+}
+
+/*
+ * Calculate selectivity of "var <@ const" operator, ie. estimate the fraction
+ * of multiranges that fall within the constant lower and upper bounds. This uses
+ * the histograms of range lower bounds and range lengths, on the assumption
+ * that the range lengths are independent of the lower bounds.
+ *
+ * The caller has already checked that constant lower and upper bounds are
+ * finite.
+ */
+static double
+calc_hist_selectivity_contained(TypeCacheEntry *typcache,
+ const RangeBound *lower, RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues)
+{
+ int i,
+ upper_index;
+ float8 prev_dist;
+ double bin_width;
+ double upper_bin_width;
+ double sum_frac;
+
+ /*
+ * Begin by finding the bin containing the upper bound, in the lower bound
+ * histogram. Any range with a lower bound > constant upper bound can't
+ * match, ie. there are no matches in bins greater than upper_index.
+ */
+ upper->inclusive = !upper->inclusive;
+ upper->lower = true;
+ upper_index = rbound_bsearch(typcache, upper, hist_lower, hist_nvalues,
+ false);
+
+ /*
+ * If the upper bound value is below the histogram's lower limit, there
+ * are no matches.
+ */
+ if (upper_index < 0)
+ return 0.0;
+
+ /*
+ * If the upper bound value is at or beyond the histogram's upper limit,
+ * start our loop at the last actual bin, as though the upper bound were
+ * within that bin; get_position will clamp its result to 1.0 anyway.
+ * (This corresponds to assuming that the data population above the
+ * histogram's upper limit is empty, exactly like what we just assumed for
+ * the lower limit.)
+ */
+ upper_index = Min(upper_index, hist_nvalues - 2);
+
+ /*
+ * Calculate upper_bin_width, ie. the fraction of the (upper_index,
+ * upper_index + 1) bin which is greater than upper bound of query range
+ * using linear interpolation of subdiff function.
+ */
+ upper_bin_width = get_position(typcache, upper,
+ &hist_lower[upper_index],
+ &hist_lower[upper_index + 1]);
+
+ /*
+ * In the loop, dist and prev_dist are the distance of the "current" bin's
+ * lower and upper bounds from the constant upper bound.
+ *
+ * bin_width represents the width of the current bin. Normally it is 1.0,
+ * meaning a full width bin, but can be less in the corner cases: start
+ * and end of the loop. We start with bin_width = upper_bin_width, because
+ * we begin at the bin containing the upper bound.
+ */
+ prev_dist = 0.0;
+ bin_width = upper_bin_width;
+
+ sum_frac = 0.0;
+ for (i = upper_index; i >= 0; i--)
+ {
+ double dist;
+ double length_hist_frac;
+ bool final_bin = false;
+
+ /*
+ * dist -- distance from upper bound of query range to lower bound of
+ * the current bin in the lower bound histogram. Or to the lower bound
+ * of the constant range, if this is the final bin, containing the
+ * constant lower bound.
+ */
+ if (range_cmp_bounds(typcache, &hist_lower[i], lower) < 0)
+ {
+ dist = get_distance(typcache, lower, upper);
+
+ /*
+ * Subtract from bin_width the portion of this bin that we want to
+ * ignore.
+ */
+ bin_width -= get_position(typcache, lower, &hist_lower[i],
+ &hist_lower[i + 1]);
+ if (bin_width < 0.0)
+ bin_width = 0.0;
+ final_bin = true;
+ }
+ else
+ dist = get_distance(typcache, &hist_lower[i], upper);
+
+ /*
+ * Estimate the fraction of tuples in this bin that are narrow enough
+ * to not exceed the distance to the upper bound of the query range.
+ */
+ length_hist_frac = calc_length_hist_frac(length_hist_values,
+ length_hist_nvalues,
+ prev_dist, dist, true);
+
+ /*
+ * Add the fraction of tuples in this bin, with a suitable length, to
+ * the total.
+ */
+ sum_frac += length_hist_frac * bin_width / (double) (hist_nvalues - 1);
+
+ if (final_bin)
+ break;
+
+ bin_width = 1.0;
+ prev_dist = dist;
+ }
+
+ return sum_frac;
+}
+
+/*
+ * Calculate selectivity of "var @> const" operator, ie. estimate the fraction
+ * of multiranges that contain the constant lower and upper bounds. This uses
+ * the histograms of range lower bounds and range lengths, on the assumption
+ * that the range lengths are independent of the lower bounds.
+ */
+static double
+calc_hist_selectivity_contains(TypeCacheEntry *typcache,
+ const RangeBound *lower, const RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues)
+{
+ int i,
+ lower_index;
+ double bin_width,
+ lower_bin_width;
+ double sum_frac;
+ float8 prev_dist;
+
+ /* Find the bin containing the lower bound of query range. */
+ lower_index = rbound_bsearch(typcache, lower, hist_lower, hist_nvalues,
+ true);
+
+ /*
+ * If the lower bound value is below the histogram's lower limit, there
+ * are no matches.
+ */
+ if (lower_index < 0)
+ return 0.0;
+
+ /*
+ * If the lower bound value is at or beyond the histogram's upper limit,
+ * start our loop at the last actual bin, as though the upper bound were
+ * within that bin; get_position will clamp its result to 1.0 anyway.
+ * (This corresponds to assuming that the data population above the
+ * histogram's upper limit is empty, exactly like what we just assumed for
+ * the lower limit.)
+ */
+ lower_index = Min(lower_index, hist_nvalues - 2);
+
+ /*
+ * Calculate lower_bin_width, ie. the fraction of the of (lower_index,
+ * lower_index + 1) bin which is greater than lower bound of query range
+ * using linear interpolation of subdiff function.
+ */
+ lower_bin_width = get_position(typcache, lower, &hist_lower[lower_index],
+ &hist_lower[lower_index + 1]);
+
+ /*
+ * Loop through all the lower bound bins, smaller than the query lower
+ * bound. In the loop, dist and prev_dist are the distance of the
+ * "current" bin's lower and upper bounds from the constant upper bound.
+ * We begin from query lower bound, and walk backwards, so the first bin's
+ * upper bound is the query lower bound, and its distance to the query
+ * upper bound is the length of the query range.
+ *
+ * bin_width represents the width of the current bin. Normally it is 1.0,
+ * meaning a full width bin, except for the first bin, which is only
+ * counted up to the constant lower bound.
+ */
+ prev_dist = get_distance(typcache, lower, upper);
+ sum_frac = 0.0;
+ bin_width = lower_bin_width;
+ for (i = lower_index; i >= 0; i--)
+ {
+ float8 dist;
+ double length_hist_frac;
+
+ /*
+ * dist -- distance from upper bound of query range to current value
+ * of lower bound histogram or lower bound of query range (if we've
+ * reach it).
+ */
+ dist = get_distance(typcache, &hist_lower[i], upper);
+
+ /*
+ * Get average fraction of length histogram which covers intervals
+ * longer than (or equal to) distance to upper bound of query range.
+ */
+ length_hist_frac =
+ 1.0 - calc_length_hist_frac(length_hist_values,
+ length_hist_nvalues,
+ prev_dist, dist, false);
+
+ sum_frac += length_hist_frac * bin_width / (double) (hist_nvalues - 1);
+
+ bin_width = 1.0;
+ prev_dist = dist;
+ }
+
+ return sum_frac;
+}
diff --git a/src/backend/utils/adt/name.c b/src/backend/utils/adt/name.c
new file mode 100644
index 0000000..e8bba36
--- /dev/null
+++ b/src/backend/utils/adt/name.c
@@ -0,0 +1,359 @@
+/*-------------------------------------------------------------------------
+ *
+ * name.c
+ * Functions for the built-in type "name".
+ *
+ * name replaces char16 and is carefully implemented so that it
+ * is a string of physical length NAMEDATALEN.
+ * DO NOT use hard-coded constants anywhere
+ * always use NAMEDATALEN as the symbolic constant! - jolly 8/21/95
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/name.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/namespace.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "libpq/pqformat.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/varlena.h"
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES (none) *
+ *****************************************************************************/
+
+
+/*
+ * namein - converts "..." to internal representation
+ *
+ * Note:
+ * [Old] Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls
+ * Now, always NULL terminated
+ */
+Datum
+namein(PG_FUNCTION_ARGS)
+{
+ char *s = PG_GETARG_CSTRING(0);
+ Name result;
+ int len;
+
+ len = strlen(s);
+
+ /* Truncate oversize input */
+ if (len >= NAMEDATALEN)
+ len = pg_mbcliplen(s, len, NAMEDATALEN - 1);
+
+ /* We use palloc0 here to ensure result is zero-padded */
+ result = (Name) palloc0(NAMEDATALEN);
+ memcpy(NameStr(*result), s, len);
+
+ PG_RETURN_NAME(result);
+}
+
+/*
+ * nameout - converts internal representation to "..."
+ */
+Datum
+nameout(PG_FUNCTION_ARGS)
+{
+ Name s = PG_GETARG_NAME(0);
+
+ PG_RETURN_CSTRING(pstrdup(NameStr(*s)));
+}
+
+/*
+ * namerecv - converts external binary format to name
+ */
+Datum
+namerecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Name result;
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ if (nbytes >= NAMEDATALEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_NAME_TOO_LONG),
+ errmsg("identifier too long"),
+ errdetail("Identifier must be less than %d characters.",
+ NAMEDATALEN)));
+ result = (NameData *) palloc0(NAMEDATALEN);
+ memcpy(result, str, nbytes);
+ pfree(str);
+ PG_RETURN_NAME(result);
+}
+
+/*
+ * namesend - converts name to binary format
+ */
+Datum
+namesend(PG_FUNCTION_ARGS)
+{
+ Name s = PG_GETARG_NAME(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, NameStr(*s), strlen(NameStr(*s)));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*****************************************************************************
+ * COMPARISON/SORTING ROUTINES *
+ *****************************************************************************/
+
+/*
+ * nameeq - returns 1 iff arguments are equal
+ * namene - returns 1 iff arguments are not equal
+ * namelt - returns 1 iff a < b
+ * namele - returns 1 iff a <= b
+ * namegt - returns 1 iff a > b
+ * namege - returns 1 iff a >= b
+ *
+ * Note that the use of strncmp with NAMEDATALEN limit is mostly historical;
+ * strcmp would do as well, because we do not allow NAME values that don't
+ * have a '\0' terminator. Whatever might be past the terminator is not
+ * considered relevant to comparisons.
+ */
+static int
+namecmp(Name arg1, Name arg2, Oid collid)
+{
+ /* Fast path for common case used in system catalogs */
+ if (collid == C_COLLATION_OID)
+ return strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN);
+
+ /* Else rely on the varstr infrastructure */
+ return varstr_cmp(NameStr(*arg1), strlen(NameStr(*arg1)),
+ NameStr(*arg2), strlen(NameStr(*arg2)),
+ collid);
+}
+
+Datum
+nameeq(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) == 0);
+}
+
+Datum
+namene(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) != 0);
+}
+
+Datum
+namelt(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) < 0);
+}
+
+Datum
+namele(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) <= 0);
+}
+
+Datum
+namegt(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) > 0);
+}
+
+Datum
+namege(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_BOOL(namecmp(arg1, arg2, PG_GET_COLLATION()) >= 0);
+}
+
+Datum
+btnamecmp(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ Name arg2 = PG_GETARG_NAME(1);
+
+ PG_RETURN_INT32(namecmp(arg1, arg2, PG_GET_COLLATION()));
+}
+
+Datum
+btnamesortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ Oid collid = ssup->ssup_collation;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport */
+ varstr_sortsupport(ssup, NAMEOID, collid);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
+
+
+/*****************************************************************************
+ * MISCELLANEOUS PUBLIC ROUTINES *
+ *****************************************************************************/
+
+void
+namestrcpy(Name name, const char *str)
+{
+ /* NB: We need to zero-pad the destination. */
+ strncpy(NameStr(*name), str, NAMEDATALEN);
+ NameStr(*name)[NAMEDATALEN - 1] = '\0';
+}
+
+/*
+ * Compare a NAME to a C string
+ *
+ * Assumes C collation always; be careful when using this for
+ * anything but equality checks!
+ */
+int
+namestrcmp(Name name, const char *str)
+{
+ if (!name && !str)
+ return 0;
+ if (!name)
+ return -1; /* NULL < anything */
+ if (!str)
+ return 1; /* NULL < anything */
+ return strncmp(NameStr(*name), str, NAMEDATALEN);
+}
+
+
+/*
+ * SQL-functions CURRENT_USER, SESSION_USER
+ */
+Datum
+current_user(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId(), false))));
+}
+
+Datum
+session_user(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId(), false))));
+}
+
+
+/*
+ * SQL-functions CURRENT_SCHEMA, CURRENT_SCHEMAS
+ */
+Datum
+current_schema(PG_FUNCTION_ARGS)
+{
+ List *search_path = fetch_search_path(false);
+ char *nspname;
+
+ if (search_path == NIL)
+ PG_RETURN_NULL();
+ nspname = get_namespace_name(linitial_oid(search_path));
+ list_free(search_path);
+ if (!nspname)
+ PG_RETURN_NULL(); /* recently-deleted namespace? */
+ PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname)));
+}
+
+Datum
+current_schemas(PG_FUNCTION_ARGS)
+{
+ List *search_path = fetch_search_path(PG_GETARG_BOOL(0));
+ ListCell *l;
+ Datum *names;
+ int i;
+ ArrayType *array;
+
+ names = (Datum *) palloc(list_length(search_path) * sizeof(Datum));
+ i = 0;
+ foreach(l, search_path)
+ {
+ char *nspname;
+
+ nspname = get_namespace_name(lfirst_oid(l));
+ if (nspname) /* watch out for deleted namespace */
+ {
+ names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));
+ i++;
+ }
+ }
+ list_free(search_path);
+
+ array = construct_array(names, i,
+ NAMEOID,
+ NAMEDATALEN, /* sizeof(Name) */
+ false, /* Name is not by-val */
+ TYPALIGN_CHAR); /* alignment of Name */
+
+ PG_RETURN_POINTER(array);
+}
+
+/*
+ * SQL-function nameconcatoid(name, oid) returns name
+ *
+ * This is used in the information_schema to produce specific_name columns,
+ * which are supposed to be unique per schema. We achieve that (in an ugly
+ * way) by appending the object's OID. The result is the same as
+ * ($1::text || '_' || $2::text)::name
+ * except that, if it would not fit in NAMEDATALEN, we make it do so by
+ * truncating the name input (not the oid).
+ */
+Datum
+nameconcatoid(PG_FUNCTION_ARGS)
+{
+ Name nam = PG_GETARG_NAME(0);
+ Oid oid = PG_GETARG_OID(1);
+ Name result;
+ char suffix[20];
+ int suflen;
+ int namlen;
+
+ suflen = snprintf(suffix, sizeof(suffix), "_%u", oid);
+ namlen = strlen(NameStr(*nam));
+
+ /* Truncate oversize input by truncating name part, not suffix */
+ if (namlen + suflen >= NAMEDATALEN)
+ namlen = pg_mbcliplen(NameStr(*nam), namlen, NAMEDATALEN - 1 - suflen);
+
+ /* We use palloc0 here to ensure result is zero-padded */
+ result = (Name) palloc0(NAMEDATALEN);
+ memcpy(NameStr(*result), NameStr(*nam), namlen);
+ memcpy(NameStr(*result) + namlen, suffix, suflen);
+
+ PG_RETURN_NAME(result);
+}
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
new file mode 100644
index 0000000..ae11de0
--- /dev/null
+++ b/src/backend/utils/adt/network.c
@@ -0,0 +1,2114 @@
+/*
+ * PostgreSQL type definitions for the INET and CIDR types.
+ *
+ * src/backend/utils/adt/network.c
+ *
+ * Jon Postel RIP 16 Oct 1998
+ */
+
+#include "postgres.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "access/stratnum.h"
+#include "catalog/pg_opfamily.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "common/ip.h"
+#include "lib/hyperloglog.h"
+#include "libpq/libpq-be.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/guc.h"
+#include "utils/inet.h"
+#include "utils/lsyscache.h"
+#include "utils/sortsupport.h"
+
+
+/*
+ * An IPv4 netmask size is a value in the range of 0 - 32, which is
+ * represented with 6 bits in inet/cidr abbreviated keys where possible.
+ *
+ * An IPv4 inet/cidr abbreviated key can use up to 25 bits for subnet
+ * component.
+ */
+#define ABBREV_BITS_INET4_NETMASK_SIZE 6
+#define ABBREV_BITS_INET4_SUBNET 25
+
+/* sortsupport for inet/cidr */
+typedef struct
+{
+ int64 input_count; /* number of non-null values seen */
+ bool estimating; /* true if estimating cardinality */
+
+ hyperLogLogState abbr_card; /* cardinality estimator */
+} network_sortsupport_state;
+
+static int32 network_cmp_internal(inet *a1, inet *a2);
+static int network_fast_cmp(Datum x, Datum y, SortSupport ssup);
+static bool network_abbrev_abort(int memtupcount, SortSupport ssup);
+static Datum network_abbrev_convert(Datum original, SortSupport ssup);
+static List *match_network_function(Node *leftop,
+ Node *rightop,
+ int indexarg,
+ Oid funcid,
+ Oid opfamily);
+static List *match_network_subset(Node *leftop,
+ Node *rightop,
+ bool is_eq,
+ Oid opfamily);
+static bool addressOK(unsigned char *a, int bits, int family);
+static inet *internal_inetpl(inet *ip, int64 addend);
+
+
+/*
+ * Common INET/CIDR input routine
+ */
+static inet *
+network_in(char *src, bool is_cidr)
+{
+ int bits;
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ /*
+ * First, check to see if this is an IPv6 or IPv4 address. IPv6 addresses
+ * will have a : somewhere in them (several, in fact) so if there is one
+ * present, assume it's V6, otherwise assume it's V4.
+ */
+
+ if (strchr(src, ':') != NULL)
+ ip_family(dst) = PGSQL_AF_INET6;
+ else
+ ip_family(dst) = PGSQL_AF_INET;
+
+ bits = pg_inet_net_pton(ip_family(dst), src, ip_addr(dst),
+ is_cidr ? ip_addrsize(dst) : -1);
+ if ((bits < 0) || (bits > ip_maxbits(dst)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ /* translator: first %s is inet or cidr */
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ is_cidr ? "cidr" : "inet", src)));
+
+ /*
+ * Error check: CIDR values must not have any bits set beyond the masklen.
+ */
+ if (is_cidr)
+ {
+ if (!addressOK(ip_addr(dst), bits, ip_family(dst)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid cidr value: \"%s\"", src),
+ errdetail("Value has bits set to right of mask.")));
+ }
+
+ ip_bits(dst) = bits;
+ SET_INET_VARSIZE(dst);
+
+ return dst;
+}
+
+Datum
+inet_in(PG_FUNCTION_ARGS)
+{
+ char *src = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_INET_P(network_in(src, false));
+}
+
+Datum
+cidr_in(PG_FUNCTION_ARGS)
+{
+ char *src = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_INET_P(network_in(src, true));
+}
+
+
+/*
+ * Common INET/CIDR output routine
+ */
+static char *
+network_out(inet *src, bool is_cidr)
+{
+ char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+ char *dst;
+ int len;
+
+ dst = pg_inet_net_ntop(ip_family(src), ip_addr(src), ip_bits(src),
+ tmp, sizeof(tmp));
+ if (dst == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
+ /* For CIDR, add /n if not present */
+ if (is_cidr && strchr(tmp, '/') == NULL)
+ {
+ len = strlen(tmp);
+ snprintf(tmp + len, sizeof(tmp) - len, "/%u", ip_bits(src));
+ }
+
+ return pstrdup(tmp);
+}
+
+Datum
+inet_out(PG_FUNCTION_ARGS)
+{
+ inet *src = PG_GETARG_INET_PP(0);
+
+ PG_RETURN_CSTRING(network_out(src, false));
+}
+
+Datum
+cidr_out(PG_FUNCTION_ARGS)
+{
+ inet *src = PG_GETARG_INET_PP(0);
+
+ PG_RETURN_CSTRING(network_out(src, true));
+}
+
+
+/*
+ * network_recv - converts external binary format to inet
+ *
+ * The external representation is (one byte apiece for)
+ * family, bits, is_cidr, address length, address in network byte order.
+ *
+ * Presence of is_cidr is largely for historical reasons, though it might
+ * allow some code-sharing on the client side. We send it correctly on
+ * output, but ignore the value on input.
+ */
+static inet *
+network_recv(StringInfo buf, bool is_cidr)
+{
+ inet *addr;
+ char *addrptr;
+ int bits;
+ int nb,
+ i;
+
+ /* make sure any unused bits in a CIDR value are zeroed */
+ addr = (inet *) palloc0(sizeof(inet));
+
+ ip_family(addr) = pq_getmsgbyte(buf);
+ if (ip_family(addr) != PGSQL_AF_INET &&
+ ip_family(addr) != PGSQL_AF_INET6)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ /* translator: %s is inet or cidr */
+ errmsg("invalid address family in external \"%s\" value",
+ is_cidr ? "cidr" : "inet")));
+ bits = pq_getmsgbyte(buf);
+ if (bits < 0 || bits > ip_maxbits(addr))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ /* translator: %s is inet or cidr */
+ errmsg("invalid bits in external \"%s\" value",
+ is_cidr ? "cidr" : "inet")));
+ ip_bits(addr) = bits;
+ i = pq_getmsgbyte(buf); /* ignore is_cidr */
+ nb = pq_getmsgbyte(buf);
+ if (nb != ip_addrsize(addr))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ /* translator: %s is inet or cidr */
+ errmsg("invalid length in external \"%s\" value",
+ is_cidr ? "cidr" : "inet")));
+
+ addrptr = (char *) ip_addr(addr);
+ for (i = 0; i < nb; i++)
+ addrptr[i] = pq_getmsgbyte(buf);
+
+ /*
+ * Error check: CIDR values must not have any bits set beyond the masklen.
+ */
+ if (is_cidr)
+ {
+ if (!addressOK(ip_addr(addr), bits, ip_family(addr)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid external \"cidr\" value"),
+ errdetail("Value has bits set to right of mask.")));
+ }
+
+ SET_INET_VARSIZE(addr);
+
+ return addr;
+}
+
+Datum
+inet_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_INET_P(network_recv(buf, false));
+}
+
+Datum
+cidr_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_INET_P(network_recv(buf, true));
+}
+
+
+/*
+ * network_send - converts inet to binary format
+ */
+static bytea *
+network_send(inet *addr, bool is_cidr)
+{
+ StringInfoData buf;
+ char *addrptr;
+ int nb,
+ i;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, ip_family(addr));
+ pq_sendbyte(&buf, ip_bits(addr));
+ pq_sendbyte(&buf, is_cidr);
+ nb = ip_addrsize(addr);
+ if (nb < 0)
+ nb = 0;
+ pq_sendbyte(&buf, nb);
+ addrptr = (char *) ip_addr(addr);
+ for (i = 0; i < nb; i++)
+ pq_sendbyte(&buf, addrptr[i]);
+ return pq_endtypsend(&buf);
+}
+
+Datum
+inet_send(PG_FUNCTION_ARGS)
+{
+ inet *addr = PG_GETARG_INET_PP(0);
+
+ PG_RETURN_BYTEA_P(network_send(addr, false));
+}
+
+Datum
+cidr_send(PG_FUNCTION_ARGS)
+{
+ inet *addr = PG_GETARG_INET_PP(0);
+
+ PG_RETURN_BYTEA_P(network_send(addr, true));
+}
+
+
+Datum
+inet_to_cidr(PG_FUNCTION_ARGS)
+{
+ inet *src = PG_GETARG_INET_PP(0);
+ int bits;
+
+ bits = ip_bits(src);
+
+ /* safety check */
+ if ((bits < 0) || (bits > ip_maxbits(src)))
+ elog(ERROR, "invalid inet bit length: %d", bits);
+
+ PG_RETURN_INET_P(cidr_set_masklen_internal(src, bits));
+}
+
+Datum
+inet_set_masklen(PG_FUNCTION_ARGS)
+{
+ inet *src = PG_GETARG_INET_PP(0);
+ int bits = PG_GETARG_INT32(1);
+ inet *dst;
+
+ if (bits == -1)
+ bits = ip_maxbits(src);
+
+ if ((bits < 0) || (bits > ip_maxbits(src)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid mask length: %d", bits)));
+
+ /* clone the original data */
+ dst = (inet *) palloc(VARSIZE_ANY(src));
+ memcpy(dst, src, VARSIZE_ANY(src));
+
+ ip_bits(dst) = bits;
+
+ PG_RETURN_INET_P(dst);
+}
+
+Datum
+cidr_set_masklen(PG_FUNCTION_ARGS)
+{
+ inet *src = PG_GETARG_INET_PP(0);
+ int bits = PG_GETARG_INT32(1);
+
+ if (bits == -1)
+ bits = ip_maxbits(src);
+
+ if ((bits < 0) || (bits > ip_maxbits(src)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid mask length: %d", bits)));
+
+ PG_RETURN_INET_P(cidr_set_masklen_internal(src, bits));
+}
+
+/*
+ * Copy src and set mask length to 'bits' (which must be valid for the family)
+ */
+inet *
+cidr_set_masklen_internal(const inet *src, int bits)
+{
+ inet *dst = (inet *) palloc0(sizeof(inet));
+
+ ip_family(dst) = ip_family(src);
+ ip_bits(dst) = bits;
+
+ if (bits > 0)
+ {
+ Assert(bits <= ip_maxbits(dst));
+
+ /* Clone appropriate bytes of the address, leaving the rest 0 */
+ memcpy(ip_addr(dst), ip_addr(src), (bits + 7) / 8);
+
+ /* Clear any unwanted bits in the last partial byte */
+ if (bits % 8)
+ ip_addr(dst)[bits / 8] &= ~(0xFF >> (bits % 8));
+ }
+
+ /* Set varlena header correctly */
+ SET_INET_VARSIZE(dst);
+
+ return dst;
+}
+
+/*
+ * Basic comparison function for sorting and inet/cidr comparisons.
+ *
+ * Comparison is first on the common bits of the network part, then on
+ * the length of the network part, and then on the whole unmasked address.
+ * The effect is that the network part is the major sort key, and for
+ * equal network parts we sort on the host part. Note this is only sane
+ * for CIDR if address bits to the right of the mask are guaranteed zero;
+ * otherwise logically-equal CIDRs might compare different.
+ */
+
+static int32
+network_cmp_internal(inet *a1, inet *a2)
+{
+ if (ip_family(a1) == ip_family(a2))
+ {
+ int order;
+
+ order = bitncmp(ip_addr(a1), ip_addr(a2),
+ Min(ip_bits(a1), ip_bits(a2)));
+ if (order != 0)
+ return order;
+ order = ((int) ip_bits(a1)) - ((int) ip_bits(a2));
+ if (order != 0)
+ return order;
+ return bitncmp(ip_addr(a1), ip_addr(a2), ip_maxbits(a1));
+ }
+
+ return ip_family(a1) - ip_family(a2);
+}
+
+Datum
+network_cmp(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_INT32(network_cmp_internal(a1, a2));
+}
+
+/*
+ * SortSupport strategy routine
+ */
+Datum
+network_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = network_fast_cmp;
+ ssup->ssup_extra = NULL;
+
+ if (ssup->abbreviate)
+ {
+ network_sortsupport_state *uss;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ uss = palloc(sizeof(network_sortsupport_state));
+ uss->input_count = 0;
+ uss->estimating = true;
+ initHyperLogLog(&uss->abbr_card, 10);
+
+ ssup->ssup_extra = uss;
+
+ ssup->comparator = ssup_datum_unsigned_cmp;
+ ssup->abbrev_converter = network_abbrev_convert;
+ ssup->abbrev_abort = network_abbrev_abort;
+ ssup->abbrev_full_comparator = network_fast_cmp;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SortSupport comparison func
+ */
+static int
+network_fast_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ inet *arg1 = DatumGetInetPP(x);
+ inet *arg2 = DatumGetInetPP(y);
+
+ return network_cmp_internal(arg1, arg2);
+}
+
+/*
+ * Callback for estimating effectiveness of abbreviated key optimization.
+ *
+ * We pay no attention to the cardinality of the non-abbreviated data, because
+ * there is no equality fast-path within authoritative inet comparator.
+ */
+static bool
+network_abbrev_abort(int memtupcount, SortSupport ssup)
+{
+ network_sortsupport_state *uss = ssup->ssup_extra;
+ double abbr_card;
+
+ if (memtupcount < 10000 || uss->input_count < 10000 || !uss->estimating)
+ return false;
+
+ abbr_card = estimateHyperLogLog(&uss->abbr_card);
+
+ /*
+ * If we have >100k distinct values, then even if we were sorting many
+ * billion rows we'd likely still break even, and the penalty of undoing
+ * that many rows of abbrevs would probably not be worth it. At this point
+ * we stop counting because we know that we're now fully committed.
+ */
+ if (abbr_card > 100000.0)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "network_abbrev: estimation ends at cardinality %f"
+ " after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count, memtupcount);
+#endif
+ uss->estimating = false;
+ return false;
+ }
+
+ /*
+ * Target minimum cardinality is 1 per ~2k of non-null inputs. 0.5 row
+ * fudge factor allows us to abort earlier on genuinely pathological data
+ * where we've had exactly one abbreviated value in the first 2k
+ * (non-null) rows.
+ */
+ if (abbr_card < uss->input_count / 2000.0 + 0.5)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "network_abbrev: aborting abbreviation at cardinality %f"
+ " below threshold %f after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count / 2000.0 + 0.5, uss->input_count,
+ memtupcount);
+#endif
+ return true;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "network_abbrev: cardinality %f after " INT64_FORMAT
+ " values (%d rows)", abbr_card, uss->input_count, memtupcount);
+#endif
+
+ return false;
+}
+
+/*
+ * SortSupport conversion routine. Converts original inet/cidr representation
+ * to abbreviated key representation that works with simple 3-way unsigned int
+ * comparisons. The network_cmp_internal() rules for sorting inet/cidr datums
+ * are followed by abbreviated comparisons by an encoding scheme that
+ * conditions keys through careful use of padding.
+ *
+ * Some background: inet values have three major components (take for example
+ * the address 1.2.3.4/24):
+ *
+ * * A network, or netmasked bits (1.2.3.0).
+ * * A netmask size (/24).
+ * * A subnet, or bits outside of the netmask (0.0.0.4).
+ *
+ * cidr values are the same except that with only the first two components --
+ * all their subnet bits *must* be zero (1.2.3.0/24).
+ *
+ * IPv4 and IPv6 are identical in this makeup, with the difference being that
+ * IPv4 addresses have a maximum of 32 bits compared to IPv6's 64 bits, so in
+ * IPv6 each part may be larger.
+ *
+ * inet/cidr types compare using these sorting rules. If inequality is detected
+ * at any step, comparison is finished. If any rule is a tie, the algorithm
+ * drops through to the next to break it:
+ *
+ * 1. IPv4 always appears before IPv6.
+ * 2. Network bits are compared.
+ * 3. Netmask size is compared.
+ * 4. All bits are compared (having made it here, we know that both
+ * netmasked bits and netmask size are equal, so we're in effect only
+ * comparing subnet bits).
+ *
+ * When generating abbreviated keys for SortSupport, we pack as much as we can
+ * into a datum while ensuring that when comparing those keys as integers,
+ * these rules will be respected. Exact contents depend on IP family and datum
+ * size.
+ *
+ * IPv4
+ * ----
+ *
+ * 4 byte datums:
+ *
+ * Start with 1 bit for the IP family (IPv4 or IPv6; this bit is present in
+ * every case below) followed by all but 1 of the netmasked bits.
+ *
+ * +----------+---------------------+
+ * | 1 bit IP | 31 bits network | (1 bit network
+ * | family | (truncated) | omitted)
+ * +----------+---------------------+
+ *
+ * 8 byte datums:
+ *
+ * We have space to store all netmasked bits, followed by the netmask size,
+ * followed by 25 bits of the subnet (25 bits is usually more than enough in
+ * practice). cidr datums always have all-zero subnet bits.
+ *
+ * +----------+-----------------------+--------------+--------------------+
+ * | 1 bit IP | 32 bits network | 6 bits | 25 bits subnet |
+ * | family | (full) | network size | (truncated) |
+ * +----------+-----------------------+--------------+--------------------+
+ *
+ * IPv6
+ * ----
+ *
+ * 4 byte datums:
+ *
+ * +----------+---------------------+
+ * | 1 bit IP | 31 bits network | (up to 97 bits
+ * | family | (truncated) | network omitted)
+ * +----------+---------------------+
+ *
+ * 8 byte datums:
+ *
+ * +----------+---------------------------------+
+ * | 1 bit IP | 63 bits network | (up to 65 bits
+ * | family | (truncated) | network omitted)
+ * +----------+---------------------------------+
+ */
+static Datum
+network_abbrev_convert(Datum original, SortSupport ssup)
+{
+ network_sortsupport_state *uss = ssup->ssup_extra;
+ inet *authoritative = DatumGetInetPP(original);
+ Datum res,
+ ipaddr_datum,
+ subnet_bitmask,
+ network;
+ int subnet_size;
+
+ Assert(ip_family(authoritative) == PGSQL_AF_INET ||
+ ip_family(authoritative) == PGSQL_AF_INET6);
+
+ /*
+ * Get an unsigned integer representation of the IP address by taking its
+ * first 4 or 8 bytes. Always take all 4 bytes of an IPv4 address. Take
+ * the first 8 bytes of an IPv6 address with an 8 byte datum and 4 bytes
+ * otherwise.
+ *
+ * We're consuming an array of unsigned char, so byteswap on little endian
+ * systems (an inet's ipaddr field stores the most significant byte
+ * first).
+ */
+ if (ip_family(authoritative) == PGSQL_AF_INET)
+ {
+ uint32 ipaddr_datum32;
+
+ memcpy(&ipaddr_datum32, ip_addr(authoritative), sizeof(uint32));
+
+ /* Must byteswap on little-endian machines */
+#ifndef WORDS_BIGENDIAN
+ ipaddr_datum = pg_bswap32(ipaddr_datum32);
+#else
+ ipaddr_datum = ipaddr_datum32;
+#endif
+
+ /* Initialize result without setting ipfamily bit */
+ res = (Datum) 0;
+ }
+ else
+ {
+ memcpy(&ipaddr_datum, ip_addr(authoritative), sizeof(Datum));
+
+ /* Must byteswap on little-endian machines */
+ ipaddr_datum = DatumBigEndianToNative(ipaddr_datum);
+
+ /* Initialize result with ipfamily (most significant) bit set */
+ res = ((Datum) 1) << (SIZEOF_DATUM * BITS_PER_BYTE - 1);
+ }
+
+ /*
+ * ipaddr_datum must be "split": high order bits go in "network" component
+ * of abbreviated key (often with zeroed bits at the end due to masking),
+ * while low order bits go in "subnet" component when there is space for
+ * one. This is often accomplished by generating a temp datum subnet
+ * bitmask, which we may reuse later when generating the subnet bits
+ * themselves. (Note that subnet bits are only used with IPv4 datums on
+ * platforms where datum is 8 bytes.)
+ *
+ * The number of bits in subnet is used to generate a datum subnet
+ * bitmask. For example, with a /24 IPv4 datum there are 8 subnet bits
+ * (since 32 - 24 is 8), so the final subnet bitmask is B'1111 1111'. We
+ * need explicit handling for cases where the ipaddr bits cannot all fit
+ * in a datum, though (otherwise we'd incorrectly mask the network
+ * component with IPv6 values).
+ */
+ subnet_size = ip_maxbits(authoritative) - ip_bits(authoritative);
+ Assert(subnet_size >= 0);
+ /* subnet size must work with prefix ipaddr cases */
+ subnet_size %= SIZEOF_DATUM * BITS_PER_BYTE;
+ if (ip_bits(authoritative) == 0)
+ {
+ /* Fit as many ipaddr bits as possible into subnet */
+ subnet_bitmask = ((Datum) 0) - 1;
+ network = 0;
+ }
+ else if (ip_bits(authoritative) < SIZEOF_DATUM * BITS_PER_BYTE)
+ {
+ /* Split ipaddr bits between network and subnet */
+ subnet_bitmask = (((Datum) 1) << subnet_size) - 1;
+ network = ipaddr_datum & ~subnet_bitmask;
+ }
+ else
+ {
+ /* Fit as many ipaddr bits as possible into network */
+ subnet_bitmask = 0;
+ network = ipaddr_datum;
+ }
+
+#if SIZEOF_DATUM == 8
+ if (ip_family(authoritative) == PGSQL_AF_INET)
+ {
+ /*
+ * IPv4 with 8 byte datums: keep all 32 netmasked bits, netmask size,
+ * and most significant 25 subnet bits
+ */
+ Datum netmask_size = (Datum) ip_bits(authoritative);
+ Datum subnet;
+
+ /*
+ * Shift left 31 bits: 6 bits netmask size + 25 subnet bits.
+ *
+ * We don't make any distinction between network bits that are zero
+ * due to masking and "true"/non-masked zero bits. An abbreviated
+ * comparison that is resolved by comparing a non-masked and non-zero
+ * bit to a masked/zeroed bit is effectively resolved based on
+ * ip_bits(), even though the comparison won't reach the netmask_size
+ * bits.
+ */
+ network <<= (ABBREV_BITS_INET4_NETMASK_SIZE +
+ ABBREV_BITS_INET4_SUBNET);
+
+ /* Shift size to make room for subnet bits at the end */
+ netmask_size <<= ABBREV_BITS_INET4_SUBNET;
+
+ /* Extract subnet bits without shifting them */
+ subnet = ipaddr_datum & subnet_bitmask;
+
+ /*
+ * If we have more than 25 subnet bits, we can't fit everything. Shift
+ * subnet down to avoid clobbering bits that are only supposed to be
+ * used for netmask_size.
+ *
+ * Discarding the least significant subnet bits like this is correct
+ * because abbreviated comparisons that are resolved at the subnet
+ * level must have had equal netmask_size/ip_bits() values in order to
+ * get that far.
+ */
+ if (subnet_size > ABBREV_BITS_INET4_SUBNET)
+ subnet >>= subnet_size - ABBREV_BITS_INET4_SUBNET;
+
+ /*
+ * Assemble the final abbreviated key without clobbering the ipfamily
+ * bit that must remain a zero.
+ */
+ res |= network | netmask_size | subnet;
+ }
+ else
+#endif
+ {
+ /*
+ * 4 byte datums, or IPv6 with 8 byte datums: Use as many of the
+ * netmasked bits as will fit in final abbreviated key. Avoid
+ * clobbering the ipfamily bit that was set earlier.
+ */
+ res |= network >> 1;
+ }
+
+ uss->input_count += 1;
+
+ /* Hash abbreviated key */
+ if (uss->estimating)
+ {
+ uint32 tmp;
+
+#if SIZEOF_DATUM == 8
+ tmp = (uint32) res ^ (uint32) ((uint64) res >> 32);
+#else /* SIZEOF_DATUM != 8 */
+ tmp = (uint32) res;
+#endif
+
+ addHyperLogLog(&uss->abbr_card, DatumGetUInt32(hash_uint32(tmp)));
+ }
+
+ return res;
+}
+
+/*
+ * Boolean ordering tests.
+ */
+Datum
+network_lt(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) < 0);
+}
+
+Datum
+network_le(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) <= 0);
+}
+
+Datum
+network_eq(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) == 0);
+}
+
+Datum
+network_ge(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) >= 0);
+}
+
+Datum
+network_gt(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) > 0);
+}
+
+Datum
+network_ne(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
+}
+
+/*
+ * MIN/MAX support functions.
+ */
+Datum
+network_smaller(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (network_cmp_internal(a1, a2) < 0)
+ PG_RETURN_INET_P(a1);
+ else
+ PG_RETURN_INET_P(a2);
+}
+
+Datum
+network_larger(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (network_cmp_internal(a1, a2) > 0)
+ PG_RETURN_INET_P(a1);
+ else
+ PG_RETURN_INET_P(a2);
+}
+
+/*
+ * Support function for hash indexes on inet/cidr.
+ */
+Datum
+hashinet(PG_FUNCTION_ARGS)
+{
+ inet *addr = PG_GETARG_INET_PP(0);
+ int addrsize = ip_addrsize(addr);
+
+ /* XXX this assumes there are no pad bytes in the data structure */
+ return hash_any((unsigned char *) VARDATA_ANY(addr), addrsize + 2);
+}
+
+Datum
+hashinetextended(PG_FUNCTION_ARGS)
+{
+ inet *addr = PG_GETARG_INET_PP(0);
+ int addrsize = ip_addrsize(addr);
+
+ return hash_any_extended((unsigned char *) VARDATA_ANY(addr), addrsize + 2,
+ PG_GETARG_INT64(1));
+}
+
+/*
+ * Boolean network-inclusion tests.
+ */
+Datum
+network_sub(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (ip_family(a1) == ip_family(a2))
+ {
+ PG_RETURN_BOOL(ip_bits(a1) > ip_bits(a2) &&
+ bitncmp(ip_addr(a1), ip_addr(a2), ip_bits(a2)) == 0);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+network_subeq(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (ip_family(a1) == ip_family(a2))
+ {
+ PG_RETURN_BOOL(ip_bits(a1) >= ip_bits(a2) &&
+ bitncmp(ip_addr(a1), ip_addr(a2), ip_bits(a2)) == 0);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+network_sup(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (ip_family(a1) == ip_family(a2))
+ {
+ PG_RETURN_BOOL(ip_bits(a1) < ip_bits(a2) &&
+ bitncmp(ip_addr(a1), ip_addr(a2), ip_bits(a1)) == 0);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+network_supeq(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (ip_family(a1) == ip_family(a2))
+ {
+ PG_RETURN_BOOL(ip_bits(a1) <= ip_bits(a2) &&
+ bitncmp(ip_addr(a1), ip_addr(a2), ip_bits(a1)) == 0);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+network_overlap(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ if (ip_family(a1) == ip_family(a2))
+ {
+ PG_RETURN_BOOL(bitncmp(ip_addr(a1), ip_addr(a2),
+ Min(ip_bits(a1), ip_bits(a2))) == 0);
+ }
+
+ PG_RETURN_BOOL(false);
+}
+
+/*
+ * Planner support function for network subset/superset operators
+ */
+Datum
+network_subset_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestIndexCondition))
+ {
+ /* Try to convert operator/function call to index conditions */
+ SupportRequestIndexCondition *req = (SupportRequestIndexCondition *) rawreq;
+
+ if (is_opclause(req->node))
+ {
+ OpExpr *clause = (OpExpr *) req->node;
+
+ Assert(list_length(clause->args) == 2);
+ ret = (Node *)
+ match_network_function((Node *) linitial(clause->args),
+ (Node *) lsecond(clause->args),
+ req->indexarg,
+ req->funcid,
+ req->opfamily);
+ }
+ else if (is_funcclause(req->node)) /* be paranoid */
+ {
+ FuncExpr *clause = (FuncExpr *) req->node;
+
+ Assert(list_length(clause->args) == 2);
+ ret = (Node *)
+ match_network_function((Node *) linitial(clause->args),
+ (Node *) lsecond(clause->args),
+ req->indexarg,
+ req->funcid,
+ req->opfamily);
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/*
+ * match_network_function
+ * Try to generate an indexqual for a network subset/superset function.
+ *
+ * This layer is just concerned with identifying the function and swapping
+ * the arguments if necessary.
+ */
+static List *
+match_network_function(Node *leftop,
+ Node *rightop,
+ int indexarg,
+ Oid funcid,
+ Oid opfamily)
+{
+ switch (funcid)
+ {
+ case F_NETWORK_SUB:
+ /* indexkey must be on the left */
+ if (indexarg != 0)
+ return NIL;
+ return match_network_subset(leftop, rightop, false, opfamily);
+
+ case F_NETWORK_SUBEQ:
+ /* indexkey must be on the left */
+ if (indexarg != 0)
+ return NIL;
+ return match_network_subset(leftop, rightop, true, opfamily);
+
+ case F_NETWORK_SUP:
+ /* indexkey must be on the right */
+ if (indexarg != 1)
+ return NIL;
+ return match_network_subset(rightop, leftop, false, opfamily);
+
+ case F_NETWORK_SUPEQ:
+ /* indexkey must be on the right */
+ if (indexarg != 1)
+ return NIL;
+ return match_network_subset(rightop, leftop, true, opfamily);
+
+ default:
+
+ /*
+ * We'd only get here if somebody attached this support function
+ * to an unexpected function. Maybe we should complain, but for
+ * now, do nothing.
+ */
+ return NIL;
+ }
+}
+
+/*
+ * match_network_subset
+ * Try to generate an indexqual for a network subset function.
+ */
+static List *
+match_network_subset(Node *leftop,
+ Node *rightop,
+ bool is_eq,
+ Oid opfamily)
+{
+ List *result;
+ Datum rightopval;
+ Oid datatype = INETOID;
+ Oid opr1oid;
+ Oid opr2oid;
+ Datum opr1right;
+ Datum opr2right;
+ Expr *expr;
+
+ /*
+ * Can't do anything with a non-constant or NULL comparison value.
+ *
+ * Note that since we restrict ourselves to cases with a hard constant on
+ * the RHS, it's a-fortiori a pseudoconstant, and we don't need to worry
+ * about verifying that.
+ */
+ if (!IsA(rightop, Const) ||
+ ((Const *) rightop)->constisnull)
+ return NIL;
+ rightopval = ((Const *) rightop)->constvalue;
+
+ /*
+ * Must check that index's opfamily supports the operators we will want to
+ * apply.
+ *
+ * We insist on the opfamily being the specific one we expect, else we'd
+ * do the wrong thing if someone were to make a reverse-sort opfamily with
+ * the same operators.
+ */
+ if (opfamily != NETWORK_BTREE_FAM_OID)
+ return NIL;
+
+ /*
+ * create clause "key >= network_scan_first( rightopval )", or ">" if the
+ * operator disallows equality.
+ *
+ * Note: seeing that this function supports only fixed values for opfamily
+ * and datatype, we could just hard-wire the operator OIDs instead of
+ * looking them up. But for now it seems better to be general.
+ */
+ if (is_eq)
+ {
+ opr1oid = get_opfamily_member(opfamily, datatype, datatype,
+ BTGreaterEqualStrategyNumber);
+ if (opr1oid == InvalidOid)
+ elog(ERROR, "no >= operator for opfamily %u", opfamily);
+ }
+ else
+ {
+ opr1oid = get_opfamily_member(opfamily, datatype, datatype,
+ BTGreaterStrategyNumber);
+ if (opr1oid == InvalidOid)
+ elog(ERROR, "no > operator for opfamily %u", opfamily);
+ }
+
+ opr1right = network_scan_first(rightopval);
+
+ expr = make_opclause(opr1oid, BOOLOID, false,
+ (Expr *) leftop,
+ (Expr *) makeConst(datatype, -1,
+ InvalidOid, /* not collatable */
+ -1, opr1right,
+ false, false),
+ InvalidOid, InvalidOid);
+ result = list_make1(expr);
+
+ /* create clause "key <= network_scan_last( rightopval )" */
+
+ opr2oid = get_opfamily_member(opfamily, datatype, datatype,
+ BTLessEqualStrategyNumber);
+ if (opr2oid == InvalidOid)
+ elog(ERROR, "no <= operator for opfamily %u", opfamily);
+
+ opr2right = network_scan_last(rightopval);
+
+ expr = make_opclause(opr2oid, BOOLOID, false,
+ (Expr *) leftop,
+ (Expr *) makeConst(datatype, -1,
+ InvalidOid, /* not collatable */
+ -1, opr2right,
+ false, false),
+ InvalidOid, InvalidOid);
+ result = lappend(result, expr);
+
+ return result;
+}
+
+
+/*
+ * Extract data from a network datatype.
+ */
+Datum
+network_host(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ char *ptr;
+ char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+
+ /* force display of max bits, regardless of masklen... */
+ if (pg_inet_net_ntop(ip_family(ip), ip_addr(ip), ip_maxbits(ip),
+ tmp, sizeof(tmp)) == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
+ /* Suppress /n if present (shouldn't happen now) */
+ if ((ptr = strchr(tmp, '/')) != NULL)
+ *ptr = '\0';
+
+ PG_RETURN_TEXT_P(cstring_to_text(tmp));
+}
+
+/*
+ * network_show implements the inet and cidr casts to text. This is not
+ * quite the same behavior as network_out, hence we can't drop it in favor
+ * of CoerceViaIO.
+ */
+Datum
+network_show(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ int len;
+ char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+
+ if (pg_inet_net_ntop(ip_family(ip), ip_addr(ip), ip_maxbits(ip),
+ tmp, sizeof(tmp)) == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
+ /* Add /n if not present (which it won't be) */
+ if (strchr(tmp, '/') == NULL)
+ {
+ len = strlen(tmp);
+ snprintf(tmp + len, sizeof(tmp) - len, "/%u", ip_bits(ip));
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(tmp));
+}
+
+Datum
+inet_abbrev(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ char *dst;
+ char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+
+ dst = pg_inet_net_ntop(ip_family(ip), ip_addr(ip),
+ ip_bits(ip), tmp, sizeof(tmp));
+
+ if (dst == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format inet value: %m")));
+
+ PG_RETURN_TEXT_P(cstring_to_text(tmp));
+}
+
+Datum
+cidr_abbrev(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ char *dst;
+ char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
+
+ dst = pg_inet_cidr_ntop(ip_family(ip), ip_addr(ip),
+ ip_bits(ip), tmp, sizeof(tmp));
+
+ if (dst == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("could not format cidr value: %m")));
+
+ PG_RETURN_TEXT_P(cstring_to_text(tmp));
+}
+
+Datum
+network_masklen(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+
+ PG_RETURN_INT32(ip_bits(ip));
+}
+
+Datum
+network_family(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+
+ switch (ip_family(ip))
+ {
+ case PGSQL_AF_INET:
+ PG_RETURN_INT32(4);
+ break;
+ case PGSQL_AF_INET6:
+ PG_RETURN_INT32(6);
+ break;
+ default:
+ PG_RETURN_INT32(0);
+ break;
+ }
+}
+
+Datum
+network_broadcast(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *dst;
+ int byte;
+ int bits;
+ int maxbytes;
+ unsigned char mask;
+ unsigned char *a,
+ *b;
+
+ /* make sure any unused bits are zeroed */
+ dst = (inet *) palloc0(sizeof(inet));
+
+ maxbytes = ip_addrsize(ip);
+ bits = ip_bits(ip);
+ a = ip_addr(ip);
+ b = ip_addr(dst);
+
+ for (byte = 0; byte < maxbytes; byte++)
+ {
+ if (bits >= 8)
+ {
+ mask = 0x00;
+ bits -= 8;
+ }
+ else if (bits == 0)
+ mask = 0xff;
+ else
+ {
+ mask = 0xff >> bits;
+ bits = 0;
+ }
+
+ b[byte] = a[byte] | mask;
+ }
+
+ ip_family(dst) = ip_family(ip);
+ ip_bits(dst) = ip_bits(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+Datum
+network_network(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *dst;
+ int byte;
+ int bits;
+ unsigned char mask;
+ unsigned char *a,
+ *b;
+
+ /* make sure any unused bits are zeroed */
+ dst = (inet *) palloc0(sizeof(inet));
+
+ bits = ip_bits(ip);
+ a = ip_addr(ip);
+ b = ip_addr(dst);
+
+ byte = 0;
+
+ while (bits)
+ {
+ if (bits >= 8)
+ {
+ mask = 0xff;
+ bits -= 8;
+ }
+ else
+ {
+ mask = 0xff << (8 - bits);
+ bits = 0;
+ }
+
+ b[byte] = a[byte] & mask;
+ byte++;
+ }
+
+ ip_family(dst) = ip_family(ip);
+ ip_bits(dst) = ip_bits(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+Datum
+network_netmask(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *dst;
+ int byte;
+ int bits;
+ unsigned char mask;
+ unsigned char *b;
+
+ /* make sure any unused bits are zeroed */
+ dst = (inet *) palloc0(sizeof(inet));
+
+ bits = ip_bits(ip);
+ b = ip_addr(dst);
+
+ byte = 0;
+
+ while (bits)
+ {
+ if (bits >= 8)
+ {
+ mask = 0xff;
+ bits -= 8;
+ }
+ else
+ {
+ mask = 0xff << (8 - bits);
+ bits = 0;
+ }
+
+ b[byte] = mask;
+ byte++;
+ }
+
+ ip_family(dst) = ip_family(ip);
+ ip_bits(dst) = ip_maxbits(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+Datum
+network_hostmask(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *dst;
+ int byte;
+ int bits;
+ int maxbytes;
+ unsigned char mask;
+ unsigned char *b;
+
+ /* make sure any unused bits are zeroed */
+ dst = (inet *) palloc0(sizeof(inet));
+
+ maxbytes = ip_addrsize(ip);
+ bits = ip_maxbits(ip) - ip_bits(ip);
+ b = ip_addr(dst);
+
+ byte = maxbytes - 1;
+
+ while (bits)
+ {
+ if (bits >= 8)
+ {
+ mask = 0xff;
+ bits -= 8;
+ }
+ else
+ {
+ mask = 0xff >> (8 - bits);
+ bits = 0;
+ }
+
+ b[byte] = mask;
+ byte--;
+ }
+
+ ip_family(dst) = ip_family(ip);
+ ip_bits(dst) = ip_maxbits(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+/*
+ * Returns true if the addresses are from the same family, or false. Used to
+ * check that we can create a network which contains both of the networks.
+ */
+Datum
+inet_same_family(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
+
+ PG_RETURN_BOOL(ip_family(a1) == ip_family(a2));
+}
+
+/*
+ * Returns the smallest CIDR which contains both of the inputs.
+ */
+Datum
+inet_merge(PG_FUNCTION_ARGS)
+{
+ inet *a1 = PG_GETARG_INET_PP(0),
+ *a2 = PG_GETARG_INET_PP(1);
+ int commonbits;
+
+ if (ip_family(a1) != ip_family(a2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot merge addresses from different families")));
+
+ commonbits = bitncommon(ip_addr(a1), ip_addr(a2),
+ Min(ip_bits(a1), ip_bits(a2)));
+
+ PG_RETURN_INET_P(cidr_set_masklen_internal(a1, commonbits));
+}
+
+/*
+ * Convert a value of a network datatype to an approximate scalar value.
+ * This is used for estimating selectivities of inequality operators
+ * involving network types.
+ *
+ * On failure (e.g., unsupported typid), set *failure to true;
+ * otherwise, that variable is not changed.
+ */
+double
+convert_network_to_scalar(Datum value, Oid typid, bool *failure)
+{
+ switch (typid)
+ {
+ case INETOID:
+ case CIDROID:
+ {
+ inet *ip = DatumGetInetPP(value);
+ int len;
+ double res;
+ int i;
+
+ /*
+ * Note that we don't use the full address for IPv6.
+ */
+ if (ip_family(ip) == PGSQL_AF_INET)
+ len = 4;
+ else
+ len = 5;
+
+ res = ip_family(ip);
+ for (i = 0; i < len; i++)
+ {
+ res *= 256;
+ res += ip_addr(ip)[i];
+ }
+ return res;
+ }
+ case MACADDROID:
+ {
+ macaddr *mac = DatumGetMacaddrP(value);
+ double res;
+
+ res = (mac->a << 16) | (mac->b << 8) | (mac->c);
+ res *= 256 * 256 * 256;
+ res += (mac->d << 16) | (mac->e << 8) | (mac->f);
+ return res;
+ }
+ case MACADDR8OID:
+ {
+ macaddr8 *mac = DatumGetMacaddr8P(value);
+ double res;
+
+ res = (mac->a << 24) | (mac->b << 16) | (mac->c << 8) | (mac->d);
+ res *= ((double) 256) * 256 * 256 * 256;
+ res += (mac->e << 24) | (mac->f << 16) | (mac->g << 8) | (mac->h);
+ return res;
+ }
+ }
+
+ *failure = true;
+ return 0;
+}
+
+/*
+ * int
+ * bitncmp(l, r, n)
+ * compare bit masks l and r, for n bits.
+ * return:
+ * <0, >0, or 0 in the libc tradition.
+ * note:
+ * network byte order assumed. this means 192.5.5.240/28 has
+ * 0x11110000 in its fourth octet.
+ * author:
+ * Paul Vixie (ISC), June 1996
+ */
+int
+bitncmp(const unsigned char *l, const unsigned char *r, int n)
+{
+ unsigned int lb,
+ rb;
+ int x,
+ b;
+
+ b = n / 8;
+ x = memcmp(l, r, b);
+ if (x || (n % 8) == 0)
+ return x;
+
+ lb = l[b];
+ rb = r[b];
+ for (b = n % 8; b > 0; b--)
+ {
+ if (IS_HIGHBIT_SET(lb) != IS_HIGHBIT_SET(rb))
+ {
+ if (IS_HIGHBIT_SET(lb))
+ return 1;
+ return -1;
+ }
+ lb <<= 1;
+ rb <<= 1;
+ }
+ return 0;
+}
+
+/*
+ * bitncommon: compare bit masks l and r, for up to n bits.
+ *
+ * Returns the number of leading bits that match (0 to n).
+ */
+int
+bitncommon(const unsigned char *l, const unsigned char *r, int n)
+{
+ int byte,
+ nbits;
+
+ /* number of bits to examine in last byte */
+ nbits = n % 8;
+
+ /* check whole bytes */
+ for (byte = 0; byte < n / 8; byte++)
+ {
+ if (l[byte] != r[byte])
+ {
+ /* at least one bit in the last byte is not common */
+ nbits = 7;
+ break;
+ }
+ }
+
+ /* check bits in last partial byte */
+ if (nbits != 0)
+ {
+ /* calculate diff of first non-matching bytes */
+ unsigned int diff = l[byte] ^ r[byte];
+
+ /* compare the bits from the most to the least */
+ while ((diff >> (8 - nbits)) != 0)
+ nbits--;
+ }
+
+ return (8 * byte) + nbits;
+}
+
+
+/*
+ * Verify a CIDR address is OK (doesn't have bits set past the masklen)
+ */
+static bool
+addressOK(unsigned char *a, int bits, int family)
+{
+ int byte;
+ int nbits;
+ int maxbits;
+ int maxbytes;
+ unsigned char mask;
+
+ if (family == PGSQL_AF_INET)
+ {
+ maxbits = 32;
+ maxbytes = 4;
+ }
+ else
+ {
+ maxbits = 128;
+ maxbytes = 16;
+ }
+ Assert(bits <= maxbits);
+
+ if (bits == maxbits)
+ return true;
+
+ byte = bits / 8;
+
+ nbits = bits % 8;
+ mask = 0xff;
+ if (bits != 0)
+ mask >>= nbits;
+
+ while (byte < maxbytes)
+ {
+ if ((a[byte] & mask) != 0)
+ return false;
+ mask = 0xff;
+ byte++;
+ }
+
+ return true;
+}
+
+
+/*
+ * These functions are used by planner to generate indexscan limits
+ * for clauses a << b and a <<= b
+ */
+
+/* return the minimal value for an IP on a given network */
+Datum
+network_scan_first(Datum in)
+{
+ return DirectFunctionCall1(network_network, in);
+}
+
+/*
+ * return "last" IP on a given network. It's the broadcast address,
+ * however, masklen has to be set to its max bits, since
+ * 192.168.0.255/24 is considered less than 192.168.0.255/32
+ *
+ * inet_set_masklen() hacked to max out the masklength to 128 for IPv6
+ * and 32 for IPv4 when given '-1' as argument.
+ */
+Datum
+network_scan_last(Datum in)
+{
+ return DirectFunctionCall2(inet_set_masklen,
+ DirectFunctionCall1(network_broadcast, in),
+ Int32GetDatum(-1));
+}
+
+
+/*
+ * IP address that the client is connecting from (NULL if Unix socket)
+ */
+Datum
+inet_client_addr(PG_FUNCTION_ARGS)
+{
+ Port *port = MyProcPort;
+ char remote_host[NI_MAXHOST];
+ int ret;
+
+ if (port == NULL)
+ PG_RETURN_NULL();
+
+ switch (port->raddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ default:
+ PG_RETURN_NULL();
+ }
+
+ remote_host[0] = '\0';
+
+ ret = pg_getnameinfo_all(&port->raddr.addr, port->raddr.salen,
+ remote_host, sizeof(remote_host),
+ NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ clean_ipv6_addr(port->raddr.addr.ss_family, remote_host);
+
+ PG_RETURN_INET_P(network_in(remote_host, false));
+}
+
+
+/*
+ * port that the client is connecting from (NULL if Unix socket)
+ */
+Datum
+inet_client_port(PG_FUNCTION_ARGS)
+{
+ Port *port = MyProcPort;
+ char remote_port[NI_MAXSERV];
+ int ret;
+
+ if (port == NULL)
+ PG_RETURN_NULL();
+
+ switch (port->raddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ default:
+ PG_RETURN_NULL();
+ }
+
+ remote_port[0] = '\0';
+
+ ret = pg_getnameinfo_all(&port->raddr.addr, port->raddr.salen,
+ NULL, 0,
+ remote_port, sizeof(remote_port),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(remote_port)));
+}
+
+
+/*
+ * IP address that the server accepted the connection on (NULL if Unix socket)
+ */
+Datum
+inet_server_addr(PG_FUNCTION_ARGS)
+{
+ Port *port = MyProcPort;
+ char local_host[NI_MAXHOST];
+ int ret;
+
+ if (port == NULL)
+ PG_RETURN_NULL();
+
+ switch (port->laddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ default:
+ PG_RETURN_NULL();
+ }
+
+ local_host[0] = '\0';
+
+ ret = pg_getnameinfo_all(&port->laddr.addr, port->laddr.salen,
+ local_host, sizeof(local_host),
+ NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ clean_ipv6_addr(port->laddr.addr.ss_family, local_host);
+
+ PG_RETURN_INET_P(network_in(local_host, false));
+}
+
+
+/*
+ * port that the server accepted the connection on (NULL if Unix socket)
+ */
+Datum
+inet_server_port(PG_FUNCTION_ARGS)
+{
+ Port *port = MyProcPort;
+ char local_port[NI_MAXSERV];
+ int ret;
+
+ if (port == NULL)
+ PG_RETURN_NULL();
+
+ switch (port->laddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ default:
+ PG_RETURN_NULL();
+ }
+
+ local_port[0] = '\0';
+
+ ret = pg_getnameinfo_all(&port->laddr.addr, port->laddr.salen,
+ NULL, 0,
+ local_port, sizeof(local_port),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(local_port)));
+}
+
+
+Datum
+inetnot(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ {
+ int nb = ip_addrsize(ip);
+ unsigned char *pip = ip_addr(ip);
+ unsigned char *pdst = ip_addr(dst);
+
+ while (--nb >= 0)
+ pdst[nb] = ~pip[nb];
+ }
+ ip_bits(dst) = ip_bits(ip);
+
+ ip_family(dst) = ip_family(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+
+Datum
+inetand(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ if (ip_family(ip) != ip_family(ip2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot AND inet values of different sizes")));
+ else
+ {
+ int nb = ip_addrsize(ip);
+ unsigned char *pip = ip_addr(ip);
+ unsigned char *pip2 = ip_addr(ip2);
+ unsigned char *pdst = ip_addr(dst);
+
+ while (--nb >= 0)
+ pdst[nb] = pip[nb] & pip2[nb];
+ }
+ ip_bits(dst) = Max(ip_bits(ip), ip_bits(ip2));
+
+ ip_family(dst) = ip_family(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+
+Datum
+inetor(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ if (ip_family(ip) != ip_family(ip2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot OR inet values of different sizes")));
+ else
+ {
+ int nb = ip_addrsize(ip);
+ unsigned char *pip = ip_addr(ip);
+ unsigned char *pip2 = ip_addr(ip2);
+ unsigned char *pdst = ip_addr(dst);
+
+ while (--nb >= 0)
+ pdst[nb] = pip[nb] | pip2[nb];
+ }
+ ip_bits(dst) = Max(ip_bits(ip), ip_bits(ip2));
+
+ ip_family(dst) = ip_family(ip);
+ SET_INET_VARSIZE(dst);
+
+ PG_RETURN_INET_P(dst);
+}
+
+
+static inet *
+internal_inetpl(inet *ip, int64 addend)
+{
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ {
+ int nb = ip_addrsize(ip);
+ unsigned char *pip = ip_addr(ip);
+ unsigned char *pdst = ip_addr(dst);
+ int carry = 0;
+
+ while (--nb >= 0)
+ {
+ carry = pip[nb] + (int) (addend & 0xFF) + carry;
+ pdst[nb] = (unsigned char) (carry & 0xFF);
+ carry >>= 8;
+
+ /*
+ * We have to be careful about right-shifting addend because
+ * right-shift isn't portable for negative values, while simply
+ * dividing by 256 doesn't work (the standard rounding is in the
+ * wrong direction, besides which there may be machines out there
+ * that round the wrong way). So, explicitly clear the low-order
+ * byte to remove any doubt about the correct result of the
+ * division, and then divide rather than shift.
+ */
+ addend &= ~((int64) 0xFF);
+ addend /= 0x100;
+ }
+
+ /*
+ * At this point we should have addend and carry both zero if original
+ * addend was >= 0, or addend -1 and carry 1 if original addend was <
+ * 0. Anything else means overflow.
+ */
+ if (!((addend == 0 && carry == 0) ||
+ (addend == -1 && carry == 1)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("result is out of range")));
+ }
+
+ ip_bits(dst) = ip_bits(ip);
+ ip_family(dst) = ip_family(ip);
+ SET_INET_VARSIZE(dst);
+
+ return dst;
+}
+
+
+Datum
+inetpl(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ int64 addend = PG_GETARG_INT64(1);
+
+ PG_RETURN_INET_P(internal_inetpl(ip, addend));
+}
+
+
+Datum
+inetmi_int8(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ int64 addend = PG_GETARG_INT64(1);
+
+ PG_RETURN_INET_P(internal_inetpl(ip, -addend));
+}
+
+
+Datum
+inetmi(PG_FUNCTION_ARGS)
+{
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
+ int64 res = 0;
+
+ if (ip_family(ip) != ip_family(ip2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot subtract inet values of different sizes")));
+ else
+ {
+ /*
+ * We form the difference using the traditional complement, increment,
+ * and add rule, with the increment part being handled by starting the
+ * carry off at 1. If you don't think integer arithmetic is done in
+ * two's complement, too bad.
+ */
+ int nb = ip_addrsize(ip);
+ int byte = 0;
+ unsigned char *pip = ip_addr(ip);
+ unsigned char *pip2 = ip_addr(ip2);
+ int carry = 1;
+
+ while (--nb >= 0)
+ {
+ int lobyte;
+
+ carry = pip[nb] + (~pip2[nb] & 0xFF) + carry;
+ lobyte = carry & 0xFF;
+ if (byte < sizeof(int64))
+ {
+ res |= ((int64) lobyte) << (byte * 8);
+ }
+ else
+ {
+ /*
+ * Input wider than int64: check for overflow. All bytes to
+ * the left of what will fit should be 0 or 0xFF, depending on
+ * sign of the now-complete result.
+ */
+ if ((res < 0) ? (lobyte != 0xFF) : (lobyte != 0))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("result is out of range")));
+ }
+ carry >>= 8;
+ byte++;
+ }
+
+ /*
+ * If input is narrower than int64, overflow is not possible, but we
+ * have to do proper sign extension.
+ */
+ if (carry == 0 && byte < sizeof(int64))
+ res |= ((uint64) (int64) -1) << (byte * 8);
+ }
+
+ PG_RETURN_INT64(res);
+}
+
+
+/*
+ * clean_ipv6_addr --- remove any '%zone' part from an IPv6 address string
+ *
+ * XXX This should go away someday!
+ *
+ * This is a kluge needed because we don't yet support zones in stored inet
+ * values. Since the result of getnameinfo() might include a zone spec,
+ * call this to remove it anywhere we want to feed getnameinfo's output to
+ * network_in. Beats failing entirely.
+ *
+ * An alternative approach would be to let network_in ignore %-parts for
+ * itself, but that would mean we'd silently drop zone specs in user input,
+ * which seems not such a good idea.
+ */
+void
+clean_ipv6_addr(int addr_family, char *addr)
+{
+#ifdef HAVE_IPV6
+ if (addr_family == AF_INET6)
+ {
+ char *pct = strchr(addr, '%');
+
+ if (pct)
+ *pct = '\0';
+ }
+#endif
+}
diff --git a/src/backend/utils/adt/network_gist.c b/src/backend/utils/adt/network_gist.c
new file mode 100644
index 0000000..95d16df
--- /dev/null
+++ b/src/backend/utils/adt/network_gist.c
@@ -0,0 +1,809 @@
+/*-------------------------------------------------------------------------
+ *
+ * network_gist.c
+ * GiST support for network types.
+ *
+ * The key thing to understand about this code is the definition of the
+ * "union" of a set of INET/CIDR values. It works like this:
+ * 1. If the values are not all of the same IP address family, the "union"
+ * is a dummy value with family number zero, minbits zero, commonbits zero,
+ * address all zeroes. Otherwise:
+ * 2. The union has the common IP address family number.
+ * 3. The union's minbits value is the smallest netmask length ("ip_bits")
+ * of all the input values.
+ * 4. Let C be the number of leading address bits that are in common among
+ * all the input values (C ranges from 0 to ip_maxbits for the family).
+ * 5. The union's commonbits value is C.
+ * 6. The union's address value is the same as the common prefix for its
+ * first C bits, and is zeroes to the right of that. The physical width
+ * of the address value is ip_maxbits for the address family.
+ *
+ * In a leaf index entry (representing a single key), commonbits is equal to
+ * ip_maxbits for the address family, minbits is the same as the represented
+ * value's ip_bits, and the address is equal to the represented address.
+ * Although it may appear that we're wasting a byte by storing the union
+ * format and not just the represented INET/CIDR value in leaf keys, the
+ * extra byte is actually "free" because of alignment considerations.
+ *
+ * Note that this design tracks minbits and commonbits independently; in any
+ * given union value, either might be smaller than the other. This does not
+ * help us much when descending the tree, because of the way inet comparison
+ * is defined: at non-leaf nodes we can't compare more than minbits bits
+ * even if we know them. However, it greatly improves the quality of split
+ * decisions. Preliminary testing suggests that searches are as much as
+ * twice as fast as for a simpler design in which a single field doubles as
+ * the common prefix length and the minimum ip_bits value.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/network_gist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/socket.h>
+
+#include "access/gist.h"
+#include "access/stratnum.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+
+/*
+ * Operator strategy numbers used in the GiST inet_ops opclass
+ */
+#define INETSTRAT_OVERLAPS RTOverlapStrategyNumber
+#define INETSTRAT_EQ RTEqualStrategyNumber
+#define INETSTRAT_NE RTNotEqualStrategyNumber
+#define INETSTRAT_LT RTLessStrategyNumber
+#define INETSTRAT_LE RTLessEqualStrategyNumber
+#define INETSTRAT_GT RTGreaterStrategyNumber
+#define INETSTRAT_GE RTGreaterEqualStrategyNumber
+#define INETSTRAT_SUB RTSubStrategyNumber
+#define INETSTRAT_SUBEQ RTSubEqualStrategyNumber
+#define INETSTRAT_SUP RTSuperStrategyNumber
+#define INETSTRAT_SUPEQ RTSuperEqualStrategyNumber
+
+
+/*
+ * Representation of a GiST INET/CIDR index key. This is not identical to
+ * INET/CIDR because we need to keep track of the length of the common address
+ * prefix as well as the minimum netmask length. However, as long as it
+ * follows varlena header rules, the core GiST code won't know the difference.
+ * For simplicity we always use 1-byte-header varlena format.
+ */
+typedef struct GistInetKey
+{
+ uint8 va_header; /* varlena header --- don't touch directly */
+ unsigned char family; /* PGSQL_AF_INET, PGSQL_AF_INET6, or zero */
+ unsigned char minbits; /* minimum number of bits in netmask */
+ unsigned char commonbits; /* number of common prefix bits in addresses */
+ unsigned char ipaddr[16]; /* up to 128 bits of common address */
+} GistInetKey;
+
+#define DatumGetInetKeyP(X) ((GistInetKey *) DatumGetPointer(X))
+#define InetKeyPGetDatum(X) PointerGetDatum(X)
+
+/*
+ * Access macros; not really exciting, but we use these for notational
+ * consistency with access to INET/CIDR values. Note that family-zero values
+ * are stored with 4 bytes of address, not 16.
+ */
+#define gk_ip_family(gkptr) ((gkptr)->family)
+#define gk_ip_minbits(gkptr) ((gkptr)->minbits)
+#define gk_ip_commonbits(gkptr) ((gkptr)->commonbits)
+#define gk_ip_addr(gkptr) ((gkptr)->ipaddr)
+#define ip_family_maxbits(fam) ((fam) == PGSQL_AF_INET6 ? 128 : 32)
+
+/* These require that the family field has been set: */
+#define gk_ip_addrsize(gkptr) \
+ (gk_ip_family(gkptr) == PGSQL_AF_INET6 ? 16 : 4)
+#define gk_ip_maxbits(gkptr) \
+ ip_family_maxbits(gk_ip_family(gkptr))
+#define SET_GK_VARSIZE(dst) \
+ SET_VARSIZE_SHORT(dst, offsetof(GistInetKey, ipaddr) + gk_ip_addrsize(dst))
+
+
+/*
+ * The GiST query consistency check
+ */
+Datum
+inet_gist_consistent(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *ent = (GISTENTRY *) PG_GETARG_POINTER(0);
+ inet *query = PG_GETARG_INET_PP(1);
+ StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
+
+ /* Oid subtype = PG_GETARG_OID(3); */
+ bool *recheck = (bool *) PG_GETARG_POINTER(4);
+ GistInetKey *key = DatumGetInetKeyP(ent->key);
+ int minbits,
+ order;
+
+ /* All operators served by this function are exact. */
+ *recheck = false;
+
+ /*
+ * Check 0: different families
+ *
+ * If key represents multiple address families, its children could match
+ * anything. This can only happen on an inner index page.
+ */
+ if (gk_ip_family(key) == 0)
+ {
+ Assert(!GIST_LEAF(ent));
+ PG_RETURN_BOOL(true);
+ }
+
+ /*
+ * Check 1: different families
+ *
+ * Matching families do not help any of the strategies.
+ */
+ if (gk_ip_family(key) != ip_family(query))
+ {
+ switch (strategy)
+ {
+ case INETSTRAT_LT:
+ case INETSTRAT_LE:
+ if (gk_ip_family(key) < ip_family(query))
+ PG_RETURN_BOOL(true);
+ break;
+
+ case INETSTRAT_GE:
+ case INETSTRAT_GT:
+ if (gk_ip_family(key) > ip_family(query))
+ PG_RETURN_BOOL(true);
+ break;
+
+ case INETSTRAT_NE:
+ PG_RETURN_BOOL(true);
+ }
+ /* For all other cases, we can be sure there is no match */
+ PG_RETURN_BOOL(false);
+ }
+
+ /*
+ * Check 2: network bit count
+ *
+ * Network bit count (ip_bits) helps to check leaves for sub network and
+ * sup network operators. At non-leaf nodes, we know every child value
+ * has ip_bits >= gk_ip_minbits(key), so we can avoid descending in some
+ * cases too.
+ */
+ switch (strategy)
+ {
+ case INETSTRAT_SUB:
+ if (GIST_LEAF(ent) && gk_ip_minbits(key) <= ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_SUBEQ:
+ if (GIST_LEAF(ent) && gk_ip_minbits(key) < ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_SUPEQ:
+ case INETSTRAT_EQ:
+ if (gk_ip_minbits(key) > ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_SUP:
+ if (gk_ip_minbits(key) >= ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+ }
+
+ /*
+ * Check 3: common network bits
+ *
+ * Compare available common prefix bits to the query, but not beyond
+ * either the query's netmask or the minimum netmask among the represented
+ * values. If these bits don't match the query, we have our answer (and
+ * may or may not need to descend, depending on the operator). If they do
+ * match, and we are not at a leaf, we descend in all cases.
+ *
+ * Note this is the final check for operators that only consider the
+ * network part of the address.
+ */
+ minbits = Min(gk_ip_commonbits(key), gk_ip_minbits(key));
+ minbits = Min(minbits, ip_bits(query));
+
+ order = bitncmp(gk_ip_addr(key), ip_addr(query), minbits);
+
+ switch (strategy)
+ {
+ case INETSTRAT_SUB:
+ case INETSTRAT_SUBEQ:
+ case INETSTRAT_OVERLAPS:
+ case INETSTRAT_SUPEQ:
+ case INETSTRAT_SUP:
+ PG_RETURN_BOOL(order == 0);
+
+ case INETSTRAT_LT:
+ case INETSTRAT_LE:
+ if (order > 0)
+ PG_RETURN_BOOL(false);
+ if (order < 0 || !GIST_LEAF(ent))
+ PG_RETURN_BOOL(true);
+ break;
+
+ case INETSTRAT_EQ:
+ if (order != 0)
+ PG_RETURN_BOOL(false);
+ if (!GIST_LEAF(ent))
+ PG_RETURN_BOOL(true);
+ break;
+
+ case INETSTRAT_GE:
+ case INETSTRAT_GT:
+ if (order < 0)
+ PG_RETURN_BOOL(false);
+ if (order > 0 || !GIST_LEAF(ent))
+ PG_RETURN_BOOL(true);
+ break;
+
+ case INETSTRAT_NE:
+ if (order != 0 || !GIST_LEAF(ent))
+ PG_RETURN_BOOL(true);
+ break;
+ }
+
+ /*
+ * Remaining checks are only for leaves and basic comparison strategies.
+ * See network_cmp_internal() in network.c for the implementation we need
+ * to match. Note that in a leaf key, commonbits should equal the address
+ * length, so we compared the whole network parts above.
+ */
+ Assert(GIST_LEAF(ent));
+
+ /*
+ * Check 4: network bit count
+ *
+ * Next step is to compare netmask widths.
+ */
+ switch (strategy)
+ {
+ case INETSTRAT_LT:
+ case INETSTRAT_LE:
+ if (gk_ip_minbits(key) < ip_bits(query))
+ PG_RETURN_BOOL(true);
+ if (gk_ip_minbits(key) > ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_EQ:
+ if (gk_ip_minbits(key) != ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_GE:
+ case INETSTRAT_GT:
+ if (gk_ip_minbits(key) > ip_bits(query))
+ PG_RETURN_BOOL(true);
+ if (gk_ip_minbits(key) < ip_bits(query))
+ PG_RETURN_BOOL(false);
+ break;
+
+ case INETSTRAT_NE:
+ if (gk_ip_minbits(key) != ip_bits(query))
+ PG_RETURN_BOOL(true);
+ break;
+ }
+
+ /*
+ * Check 5: whole address
+ *
+ * Netmask bit counts are the same, so check all the address bits.
+ */
+ order = bitncmp(gk_ip_addr(key), ip_addr(query), gk_ip_maxbits(key));
+
+ switch (strategy)
+ {
+ case INETSTRAT_LT:
+ PG_RETURN_BOOL(order < 0);
+
+ case INETSTRAT_LE:
+ PG_RETURN_BOOL(order <= 0);
+
+ case INETSTRAT_EQ:
+ PG_RETURN_BOOL(order == 0);
+
+ case INETSTRAT_GE:
+ PG_RETURN_BOOL(order >= 0);
+
+ case INETSTRAT_GT:
+ PG_RETURN_BOOL(order > 0);
+
+ case INETSTRAT_NE:
+ PG_RETURN_BOOL(order != 0);
+ }
+
+ elog(ERROR, "unknown strategy for inet GiST");
+ PG_RETURN_BOOL(false); /* keep compiler quiet */
+}
+
+/*
+ * Calculate parameters of the union of some GistInetKeys.
+ *
+ * Examine the keys in elements m..n inclusive of the GISTENTRY array,
+ * and compute these output parameters:
+ * *minfamily_p = minimum IP address family number
+ * *maxfamily_p = maximum IP address family number
+ * *minbits_p = minimum netmask width
+ * *commonbits_p = number of leading bits in common among the addresses
+ *
+ * minbits and commonbits are forced to zero if there's more than one
+ * address family.
+ */
+static void
+calc_inet_union_params(GISTENTRY *ent,
+ int m, int n,
+ int *minfamily_p,
+ int *maxfamily_p,
+ int *minbits_p,
+ int *commonbits_p)
+{
+ int minfamily,
+ maxfamily,
+ minbits,
+ commonbits;
+ unsigned char *addr;
+ GistInetKey *tmp;
+ int i;
+
+ /* Must be at least one key. */
+ Assert(m <= n);
+
+ /* Initialize variables using the first key. */
+ tmp = DatumGetInetKeyP(ent[m].key);
+ minfamily = maxfamily = gk_ip_family(tmp);
+ minbits = gk_ip_minbits(tmp);
+ commonbits = gk_ip_commonbits(tmp);
+ addr = gk_ip_addr(tmp);
+
+ /* Scan remaining keys. */
+ for (i = m + 1; i <= n; i++)
+ {
+ tmp = DatumGetInetKeyP(ent[i].key);
+
+ /* Determine range of family numbers */
+ if (minfamily > gk_ip_family(tmp))
+ minfamily = gk_ip_family(tmp);
+ if (maxfamily < gk_ip_family(tmp))
+ maxfamily = gk_ip_family(tmp);
+
+ /* Find minimum minbits */
+ if (minbits > gk_ip_minbits(tmp))
+ minbits = gk_ip_minbits(tmp);
+
+ /* Find minimum number of bits in common */
+ if (commonbits > gk_ip_commonbits(tmp))
+ commonbits = gk_ip_commonbits(tmp);
+ if (commonbits > 0)
+ commonbits = bitncommon(addr, gk_ip_addr(tmp), commonbits);
+ }
+
+ /* Force minbits/commonbits to zero if more than one family. */
+ if (minfamily != maxfamily)
+ minbits = commonbits = 0;
+
+ *minfamily_p = minfamily;
+ *maxfamily_p = maxfamily;
+ *minbits_p = minbits;
+ *commonbits_p = commonbits;
+}
+
+/*
+ * Same as above, but the GISTENTRY elements to examine are those with
+ * indices listed in the offsets[] array.
+ */
+static void
+calc_inet_union_params_indexed(GISTENTRY *ent,
+ OffsetNumber *offsets, int noffsets,
+ int *minfamily_p,
+ int *maxfamily_p,
+ int *minbits_p,
+ int *commonbits_p)
+{
+ int minfamily,
+ maxfamily,
+ minbits,
+ commonbits;
+ unsigned char *addr;
+ GistInetKey *tmp;
+ int i;
+
+ /* Must be at least one key. */
+ Assert(noffsets > 0);
+
+ /* Initialize variables using the first key. */
+ tmp = DatumGetInetKeyP(ent[offsets[0]].key);
+ minfamily = maxfamily = gk_ip_family(tmp);
+ minbits = gk_ip_minbits(tmp);
+ commonbits = gk_ip_commonbits(tmp);
+ addr = gk_ip_addr(tmp);
+
+ /* Scan remaining keys. */
+ for (i = 1; i < noffsets; i++)
+ {
+ tmp = DatumGetInetKeyP(ent[offsets[i]].key);
+
+ /* Determine range of family numbers */
+ if (minfamily > gk_ip_family(tmp))
+ minfamily = gk_ip_family(tmp);
+ if (maxfamily < gk_ip_family(tmp))
+ maxfamily = gk_ip_family(tmp);
+
+ /* Find minimum minbits */
+ if (minbits > gk_ip_minbits(tmp))
+ minbits = gk_ip_minbits(tmp);
+
+ /* Find minimum number of bits in common */
+ if (commonbits > gk_ip_commonbits(tmp))
+ commonbits = gk_ip_commonbits(tmp);
+ if (commonbits > 0)
+ commonbits = bitncommon(addr, gk_ip_addr(tmp), commonbits);
+ }
+
+ /* Force minbits/commonbits to zero if more than one family. */
+ if (minfamily != maxfamily)
+ minbits = commonbits = 0;
+
+ *minfamily_p = minfamily;
+ *maxfamily_p = maxfamily;
+ *minbits_p = minbits;
+ *commonbits_p = commonbits;
+}
+
+/*
+ * Construct a GistInetKey representing a union value.
+ *
+ * Inputs are the family/minbits/commonbits values to use, plus a pointer to
+ * the address field of one of the union inputs. (Since we're going to copy
+ * just the bits-in-common, it doesn't matter which one.)
+ */
+static GistInetKey *
+build_inet_union_key(int family, int minbits, int commonbits,
+ unsigned char *addr)
+{
+ GistInetKey *result;
+
+ /* Make sure any unused bits are zeroed. */
+ result = (GistInetKey *) palloc0(sizeof(GistInetKey));
+
+ gk_ip_family(result) = family;
+ gk_ip_minbits(result) = minbits;
+ gk_ip_commonbits(result) = commonbits;
+
+ /* Clone appropriate bytes of the address. */
+ if (commonbits > 0)
+ memcpy(gk_ip_addr(result), addr, (commonbits + 7) / 8);
+
+ /* Clean any unwanted bits in the last partial byte. */
+ if (commonbits % 8 != 0)
+ gk_ip_addr(result)[commonbits / 8] &= ~(0xFF >> (commonbits % 8));
+
+ /* Set varlena header correctly. */
+ SET_GK_VARSIZE(result);
+
+ return result;
+}
+
+
+/*
+ * The GiST union function
+ *
+ * See comments at head of file for the definition of the union.
+ */
+Datum
+inet_gist_union(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GISTENTRY *ent = entryvec->vector;
+ int minfamily,
+ maxfamily,
+ minbits,
+ commonbits;
+ unsigned char *addr;
+ GistInetKey *tmp,
+ *result;
+
+ /* Determine parameters of the union. */
+ calc_inet_union_params(ent, 0, entryvec->n - 1,
+ &minfamily, &maxfamily,
+ &minbits, &commonbits);
+
+ /* If more than one family, emit family number zero. */
+ if (minfamily != maxfamily)
+ minfamily = 0;
+
+ /* Initialize address using the first key. */
+ tmp = DatumGetInetKeyP(ent[0].key);
+ addr = gk_ip_addr(tmp);
+
+ /* Construct the union value. */
+ result = build_inet_union_key(minfamily, minbits, commonbits, addr);
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * The GiST compress function
+ *
+ * Convert an inet value to GistInetKey.
+ */
+Datum
+inet_gist_compress(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ GISTENTRY *retval;
+
+ if (entry->leafkey)
+ {
+ retval = palloc(sizeof(GISTENTRY));
+ if (DatumGetPointer(entry->key) != NULL)
+ {
+ inet *in = DatumGetInetPP(entry->key);
+ GistInetKey *r;
+
+ r = (GistInetKey *) palloc0(sizeof(GistInetKey));
+
+ gk_ip_family(r) = ip_family(in);
+ gk_ip_minbits(r) = ip_bits(in);
+ gk_ip_commonbits(r) = gk_ip_maxbits(r);
+ memcpy(gk_ip_addr(r), ip_addr(in), gk_ip_addrsize(r));
+ SET_GK_VARSIZE(r);
+
+ gistentryinit(*retval, PointerGetDatum(r),
+ entry->rel, entry->page,
+ entry->offset, false);
+ }
+ else
+ {
+ gistentryinit(*retval, (Datum) 0,
+ entry->rel, entry->page,
+ entry->offset, false);
+ }
+ }
+ else
+ retval = entry;
+ PG_RETURN_POINTER(retval);
+}
+
+/*
+ * We do not need a decompress function, because the other GiST inet
+ * support functions work with the GistInetKey representation.
+ */
+
+/*
+ * The GiST fetch function
+ *
+ * Reconstruct the original inet datum from a GistInetKey.
+ */
+Datum
+inet_gist_fetch(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ GistInetKey *key = DatumGetInetKeyP(entry->key);
+ GISTENTRY *retval;
+ inet *dst;
+
+ dst = (inet *) palloc0(sizeof(inet));
+
+ ip_family(dst) = gk_ip_family(key);
+ ip_bits(dst) = gk_ip_minbits(key);
+ memcpy(ip_addr(dst), gk_ip_addr(key), ip_addrsize(dst));
+ SET_INET_VARSIZE(dst);
+
+ retval = palloc(sizeof(GISTENTRY));
+ gistentryinit(*retval, InetPGetDatum(dst), entry->rel, entry->page,
+ entry->offset, false);
+
+ PG_RETURN_POINTER(retval);
+}
+
+/*
+ * The GiST page split penalty function
+ *
+ * Charge a large penalty if address family doesn't match, or a somewhat
+ * smaller one if the new value would degrade the union's minbits
+ * (minimum netmask width). Otherwise, penalty is inverse of the
+ * new number of common address bits.
+ */
+Datum
+inet_gist_penalty(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *origent = (GISTENTRY *) PG_GETARG_POINTER(0);
+ GISTENTRY *newent = (GISTENTRY *) PG_GETARG_POINTER(1);
+ float *penalty = (float *) PG_GETARG_POINTER(2);
+ GistInetKey *orig = DatumGetInetKeyP(origent->key),
+ *new = DatumGetInetKeyP(newent->key);
+ int commonbits;
+
+ if (gk_ip_family(orig) == gk_ip_family(new))
+ {
+ if (gk_ip_minbits(orig) <= gk_ip_minbits(new))
+ {
+ commonbits = bitncommon(gk_ip_addr(orig), gk_ip_addr(new),
+ Min(gk_ip_commonbits(orig),
+ gk_ip_commonbits(new)));
+ if (commonbits > 0)
+ *penalty = 1.0f / commonbits;
+ else
+ *penalty = 2;
+ }
+ else
+ *penalty = 3;
+ }
+ else
+ *penalty = 4;
+
+ PG_RETURN_POINTER(penalty);
+}
+
+/*
+ * The GiST PickSplit method
+ *
+ * There are two ways to split. First one is to split by address families,
+ * if there are multiple families appearing in the input.
+ *
+ * The second and more common way is to split by addresses. To achieve this,
+ * determine the number of leading bits shared by all the keys, then split on
+ * the next bit. (We don't currently consider the netmask widths while doing
+ * this; should we?) If we fail to get a nontrivial split that way, split
+ * 50-50.
+ */
+Datum
+inet_gist_picksplit(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GIST_SPLITVEC *splitvec = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
+ GISTENTRY *ent = entryvec->vector;
+ int minfamily,
+ maxfamily,
+ minbits,
+ commonbits;
+ unsigned char *addr;
+ GistInetKey *tmp,
+ *left_union,
+ *right_union;
+ int maxoff,
+ nbytes;
+ OffsetNumber i,
+ *left,
+ *right;
+
+ maxoff = entryvec->n - 1;
+ nbytes = (maxoff + 1) * sizeof(OffsetNumber);
+
+ left = (OffsetNumber *) palloc(nbytes);
+ right = (OffsetNumber *) palloc(nbytes);
+
+ splitvec->spl_left = left;
+ splitvec->spl_right = right;
+
+ splitvec->spl_nleft = 0;
+ splitvec->spl_nright = 0;
+
+ /* Determine parameters of the union of all the inputs. */
+ calc_inet_union_params(ent, FirstOffsetNumber, maxoff,
+ &minfamily, &maxfamily,
+ &minbits, &commonbits);
+
+ if (minfamily != maxfamily)
+ {
+ /* Multiple families, so split by family. */
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ /*
+ * If there's more than 2 families, all but maxfamily go into the
+ * left union. This could only happen if the inputs include some
+ * IPv4, some IPv6, and some already-multiple-family unions.
+ */
+ tmp = DatumGetInetKeyP(ent[i].key);
+ if (gk_ip_family(tmp) != maxfamily)
+ left[splitvec->spl_nleft++] = i;
+ else
+ right[splitvec->spl_nright++] = i;
+ }
+ }
+ else
+ {
+ /*
+ * Split on the next bit after the common bits. If that yields a
+ * trivial split, try the next bit position to the right. Repeat till
+ * success; or if we run out of bits, do an arbitrary 50-50 split.
+ */
+ int maxbits = ip_family_maxbits(minfamily);
+
+ while (commonbits < maxbits)
+ {
+ /* Split using the commonbits'th bit position. */
+ int bitbyte = commonbits / 8;
+ int bitmask = 0x80 >> (commonbits % 8);
+
+ splitvec->spl_nleft = splitvec->spl_nright = 0;
+
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ tmp = DatumGetInetKeyP(ent[i].key);
+ addr = gk_ip_addr(tmp);
+ if ((addr[bitbyte] & bitmask) == 0)
+ left[splitvec->spl_nleft++] = i;
+ else
+ right[splitvec->spl_nright++] = i;
+ }
+
+ if (splitvec->spl_nleft > 0 && splitvec->spl_nright > 0)
+ break; /* success */
+ commonbits++;
+ }
+
+ if (commonbits >= maxbits)
+ {
+ /* Failed ... do a 50-50 split. */
+ splitvec->spl_nleft = splitvec->spl_nright = 0;
+
+ for (i = FirstOffsetNumber; i <= maxoff / 2; i = OffsetNumberNext(i))
+ {
+ left[splitvec->spl_nleft++] = i;
+ }
+ for (; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ right[splitvec->spl_nright++] = i;
+ }
+ }
+ }
+
+ /*
+ * Compute the union value for each side from scratch. In most cases we
+ * could approximate the union values with what we already know, but this
+ * ensures that each side has minbits and commonbits set as high as
+ * possible.
+ */
+ calc_inet_union_params_indexed(ent, left, splitvec->spl_nleft,
+ &minfamily, &maxfamily,
+ &minbits, &commonbits);
+ if (minfamily != maxfamily)
+ minfamily = 0;
+ tmp = DatumGetInetKeyP(ent[left[0]].key);
+ addr = gk_ip_addr(tmp);
+ left_union = build_inet_union_key(minfamily, minbits, commonbits, addr);
+ splitvec->spl_ldatum = PointerGetDatum(left_union);
+
+ calc_inet_union_params_indexed(ent, right, splitvec->spl_nright,
+ &minfamily, &maxfamily,
+ &minbits, &commonbits);
+ if (minfamily != maxfamily)
+ minfamily = 0;
+ tmp = DatumGetInetKeyP(ent[right[0]].key);
+ addr = gk_ip_addr(tmp);
+ right_union = build_inet_union_key(minfamily, minbits, commonbits, addr);
+ splitvec->spl_rdatum = PointerGetDatum(right_union);
+
+ PG_RETURN_POINTER(splitvec);
+}
+
+/*
+ * The GiST equality function
+ */
+Datum
+inet_gist_same(PG_FUNCTION_ARGS)
+{
+ GistInetKey *left = DatumGetInetKeyP(PG_GETARG_DATUM(0));
+ GistInetKey *right = DatumGetInetKeyP(PG_GETARG_DATUM(1));
+ bool *result = (bool *) PG_GETARG_POINTER(2);
+
+ *result = (gk_ip_family(left) == gk_ip_family(right) &&
+ gk_ip_minbits(left) == gk_ip_minbits(right) &&
+ gk_ip_commonbits(left) == gk_ip_commonbits(right) &&
+ memcmp(gk_ip_addr(left), gk_ip_addr(right),
+ gk_ip_addrsize(left)) == 0);
+
+ PG_RETURN_POINTER(result);
+}
diff --git a/src/backend/utils/adt/network_selfuncs.c b/src/backend/utils/adt/network_selfuncs.c
new file mode 100644
index 0000000..4919637
--- /dev/null
+++ b/src/backend/utils/adt/network_selfuncs.c
@@ -0,0 +1,972 @@
+/*-------------------------------------------------------------------------
+ *
+ * network_selfuncs.c
+ * Functions for selectivity estimation of inet/cidr operators
+ *
+ * This module provides estimators for the subnet inclusion and overlap
+ * operators. Estimates are based on null fraction, most common values,
+ * and histogram of inet/cidr columns.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/network_selfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_statistic.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+#include "utils/lsyscache.h"
+#include "utils/selfuncs.h"
+
+
+/* Default selectivity for the inet overlap operator */
+#define DEFAULT_OVERLAP_SEL 0.01
+
+/* Default selectivity for the various inclusion operators */
+#define DEFAULT_INCLUSION_SEL 0.005
+
+/* Default selectivity for specified operator */
+#define DEFAULT_SEL(operator) \
+ ((operator) == OID_INET_OVERLAP_OP ? \
+ DEFAULT_OVERLAP_SEL : DEFAULT_INCLUSION_SEL)
+
+/* Maximum number of items to consider in join selectivity calculations */
+#define MAX_CONSIDERED_ELEMS 1024
+
+static Selectivity networkjoinsel_inner(Oid operator,
+ VariableStatData *vardata1, VariableStatData *vardata2);
+static Selectivity networkjoinsel_semi(Oid operator,
+ VariableStatData *vardata1, VariableStatData *vardata2);
+static Selectivity mcv_population(float4 *mcv_numbers, int mcv_nvalues);
+static Selectivity inet_hist_value_sel(Datum *values, int nvalues,
+ Datum constvalue, int opr_codenum);
+static Selectivity inet_mcv_join_sel(Datum *mcv1_values,
+ float4 *mcv1_numbers, int mcv1_nvalues, Datum *mcv2_values,
+ float4 *mcv2_numbers, int mcv2_nvalues, Oid operator);
+static Selectivity inet_mcv_hist_sel(Datum *mcv_values, float4 *mcv_numbers,
+ int mcv_nvalues, Datum *hist_values, int hist_nvalues,
+ int opr_codenum);
+static Selectivity inet_hist_inclusion_join_sel(Datum *hist1_values,
+ int hist1_nvalues,
+ Datum *hist2_values, int hist2_nvalues,
+ int opr_codenum);
+static Selectivity inet_semi_join_sel(Datum lhs_value,
+ bool mcv_exists, Datum *mcv_values, int mcv_nvalues,
+ bool hist_exists, Datum *hist_values, int hist_nvalues,
+ double hist_weight,
+ FmgrInfo *proc, int opr_codenum);
+static int inet_opr_codenum(Oid operator);
+static int inet_inclusion_cmp(inet *left, inet *right, int opr_codenum);
+static int inet_masklen_inclusion_cmp(inet *left, inet *right,
+ int opr_codenum);
+static int inet_hist_match_divider(inet *boundary, inet *query,
+ int opr_codenum);
+
+/*
+ * Selectivity estimation for the subnet inclusion/overlap operators
+ */
+Datum
+networksel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Selectivity selec,
+ mcv_selec,
+ non_mcv_selec;
+ Datum constvalue;
+ Form_pg_statistic stats;
+ AttStatsSlot hslot;
+ double sumcommon,
+ nullfrac;
+ FmgrInfo proc;
+
+ /*
+ * If expression is not (variable op something) or (something op
+ * variable), then punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+
+ /*
+ * Can't do anything useful if the something is not a constant, either.
+ */
+ if (!IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+ }
+
+ /* All of the operators handled here are strict. */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(0.0);
+ }
+ constvalue = ((Const *) other)->constvalue;
+
+ /* Otherwise, we need stats in order to produce a non-default estimate. */
+ if (!HeapTupleIsValid(vardata.statsTuple))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(DEFAULT_SEL(operator));
+ }
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+ nullfrac = stats->stanullfrac;
+
+ /*
+ * If we have most-common-values info, add up the fractions of the MCV
+ * entries that satisfy MCV OP CONST. These fractions contribute directly
+ * to the result selectivity. Also add up the total fraction represented
+ * by MCV entries.
+ */
+ fmgr_info(get_opcode(operator), &proc);
+ mcv_selec = mcv_selectivity(&vardata, &proc, InvalidOid,
+ constvalue, varonleft,
+ &sumcommon);
+
+ /*
+ * If we have a histogram, use it to estimate the proportion of the
+ * non-MCV population that satisfies the clause. If we don't, apply the
+ * default selectivity to that population.
+ */
+ if (get_attstatsslot(&hslot, vardata.statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES))
+ {
+ int opr_codenum = inet_opr_codenum(operator);
+
+ /* Commute if needed, so we can consider histogram to be on the left */
+ if (!varonleft)
+ opr_codenum = -opr_codenum;
+ non_mcv_selec = inet_hist_value_sel(hslot.values, hslot.nvalues,
+ constvalue, opr_codenum);
+
+ free_attstatsslot(&hslot);
+ }
+ else
+ non_mcv_selec = DEFAULT_SEL(operator);
+
+ /* Combine selectivities for MCV and non-MCV populations */
+ selec = mcv_selec + (1.0 - nullfrac - sumcommon) * non_mcv_selec;
+
+ /* Result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ ReleaseVariableStats(vardata);
+
+ PG_RETURN_FLOAT8(selec);
+}
+
+/*
+ * Join selectivity estimation for the subnet inclusion/overlap operators
+ *
+ * This function has the same structure as eqjoinsel() in selfuncs.c.
+ *
+ * Throughout networkjoinsel and its subroutines, we have a performance issue
+ * in that the amount of work to be done is O(N^2) in the length of the MCV
+ * and histogram arrays. To keep the runtime from getting out of hand when
+ * large statistics targets have been set, we arbitrarily limit the number of
+ * values considered to 1024 (MAX_CONSIDERED_ELEMS). For the MCV arrays, this
+ * is easy: just consider at most the first N elements. (Since the MCVs are
+ * sorted by decreasing frequency, this correctly gets us the first N MCVs.)
+ * For the histogram arrays, we decimate; that is consider only every k'th
+ * element, where k is chosen so that no more than MAX_CONSIDERED_ELEMS
+ * elements are considered. This should still give us a good random sample of
+ * the non-MCV population. Decimation is done on-the-fly in the loops that
+ * iterate over the histogram arrays.
+ */
+Datum
+networkjoinsel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+#ifdef NOT_USED
+ JoinType jointype = (JoinType) PG_GETARG_INT16(3);
+#endif
+ SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) PG_GETARG_POINTER(4);
+ double selec;
+ VariableStatData vardata1;
+ VariableStatData vardata2;
+ bool join_is_reversed;
+
+ get_join_variables(root, args, sjinfo,
+ &vardata1, &vardata2, &join_is_reversed);
+
+ switch (sjinfo->jointype)
+ {
+ case JOIN_INNER:
+ case JOIN_LEFT:
+ case JOIN_FULL:
+
+ /*
+ * Selectivity for left/full join is not exactly the same as inner
+ * join, but we neglect the difference, as eqjoinsel does.
+ */
+ selec = networkjoinsel_inner(operator, &vardata1, &vardata2);
+ break;
+ case JOIN_SEMI:
+ case JOIN_ANTI:
+ /* Here, it's important that we pass the outer var on the left. */
+ if (!join_is_reversed)
+ selec = networkjoinsel_semi(operator, &vardata1, &vardata2);
+ else
+ selec = networkjoinsel_semi(get_commutator(operator),
+ &vardata2, &vardata1);
+ break;
+ default:
+ /* other values not expected here */
+ elog(ERROR, "unrecognized join type: %d",
+ (int) sjinfo->jointype);
+ selec = 0; /* keep compiler quiet */
+ break;
+ }
+
+ ReleaseVariableStats(vardata1);
+ ReleaseVariableStats(vardata2);
+
+ CLAMP_PROBABILITY(selec);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+/*
+ * Inner join selectivity estimation for subnet inclusion/overlap operators
+ *
+ * Calculates MCV vs MCV, MCV vs histogram and histogram vs histogram
+ * selectivity for join using the subnet inclusion operators. Unlike the
+ * join selectivity function for the equality operator, eqjoinsel_inner(),
+ * one to one matching of the values is not enough. Network inclusion
+ * operators are likely to match many to many, so we must check all pairs.
+ * (Note: it might be possible to exploit understanding of the histogram's
+ * btree ordering to reduce the work needed, but we don't currently try.)
+ * Also, MCV vs histogram selectivity is not neglected as in eqjoinsel_inner().
+ */
+static Selectivity
+networkjoinsel_inner(Oid operator,
+ VariableStatData *vardata1, VariableStatData *vardata2)
+{
+ Form_pg_statistic stats;
+ double nullfrac1 = 0.0,
+ nullfrac2 = 0.0;
+ Selectivity selec = 0.0,
+ sumcommon1 = 0.0,
+ sumcommon2 = 0.0;
+ bool mcv1_exists = false,
+ mcv2_exists = false,
+ hist1_exists = false,
+ hist2_exists = false;
+ int opr_codenum;
+ int mcv1_length = 0,
+ mcv2_length = 0;
+ AttStatsSlot mcv1_slot;
+ AttStatsSlot mcv2_slot;
+ AttStatsSlot hist1_slot;
+ AttStatsSlot hist2_slot;
+
+ if (HeapTupleIsValid(vardata1->statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(vardata1->statsTuple);
+ nullfrac1 = stats->stanullfrac;
+
+ mcv1_exists = get_attstatsslot(&mcv1_slot, vardata1->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ hist1_exists = get_attstatsslot(&hist1_slot, vardata1->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES);
+ /* Arbitrarily limit number of MCVs considered */
+ mcv1_length = Min(mcv1_slot.nvalues, MAX_CONSIDERED_ELEMS);
+ if (mcv1_exists)
+ sumcommon1 = mcv_population(mcv1_slot.numbers, mcv1_length);
+ }
+ else
+ {
+ memset(&mcv1_slot, 0, sizeof(mcv1_slot));
+ memset(&hist1_slot, 0, sizeof(hist1_slot));
+ }
+
+ if (HeapTupleIsValid(vardata2->statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(vardata2->statsTuple);
+ nullfrac2 = stats->stanullfrac;
+
+ mcv2_exists = get_attstatsslot(&mcv2_slot, vardata2->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ hist2_exists = get_attstatsslot(&hist2_slot, vardata2->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES);
+ /* Arbitrarily limit number of MCVs considered */
+ mcv2_length = Min(mcv2_slot.nvalues, MAX_CONSIDERED_ELEMS);
+ if (mcv2_exists)
+ sumcommon2 = mcv_population(mcv2_slot.numbers, mcv2_length);
+ }
+ else
+ {
+ memset(&mcv2_slot, 0, sizeof(mcv2_slot));
+ memset(&hist2_slot, 0, sizeof(hist2_slot));
+ }
+
+ opr_codenum = inet_opr_codenum(operator);
+
+ /*
+ * Calculate selectivity for MCV vs MCV matches.
+ */
+ if (mcv1_exists && mcv2_exists)
+ selec += inet_mcv_join_sel(mcv1_slot.values, mcv1_slot.numbers,
+ mcv1_length,
+ mcv2_slot.values, mcv2_slot.numbers,
+ mcv2_length,
+ operator);
+
+ /*
+ * Add in selectivities for MCV vs histogram matches, scaling according to
+ * the fractions of the populations represented by the histograms. Note
+ * that the second case needs to commute the operator.
+ */
+ if (mcv1_exists && hist2_exists)
+ selec += (1.0 - nullfrac2 - sumcommon2) *
+ inet_mcv_hist_sel(mcv1_slot.values, mcv1_slot.numbers, mcv1_length,
+ hist2_slot.values, hist2_slot.nvalues,
+ opr_codenum);
+ if (mcv2_exists && hist1_exists)
+ selec += (1.0 - nullfrac1 - sumcommon1) *
+ inet_mcv_hist_sel(mcv2_slot.values, mcv2_slot.numbers, mcv2_length,
+ hist1_slot.values, hist1_slot.nvalues,
+ -opr_codenum);
+
+ /*
+ * Add in selectivity for histogram vs histogram matches, again scaling
+ * appropriately.
+ */
+ if (hist1_exists && hist2_exists)
+ selec += (1.0 - nullfrac1 - sumcommon1) *
+ (1.0 - nullfrac2 - sumcommon2) *
+ inet_hist_inclusion_join_sel(hist1_slot.values, hist1_slot.nvalues,
+ hist2_slot.values, hist2_slot.nvalues,
+ opr_codenum);
+
+ /*
+ * If useful statistics are not available then use the default estimate.
+ * We can apply null fractions if known, though.
+ */
+ if ((!mcv1_exists && !hist1_exists) || (!mcv2_exists && !hist2_exists))
+ selec = (1.0 - nullfrac1) * (1.0 - nullfrac2) * DEFAULT_SEL(operator);
+
+ /* Release stats. */
+ free_attstatsslot(&mcv1_slot);
+ free_attstatsslot(&mcv2_slot);
+ free_attstatsslot(&hist1_slot);
+ free_attstatsslot(&hist2_slot);
+
+ return selec;
+}
+
+/*
+ * Semi join selectivity estimation for subnet inclusion/overlap operators
+ *
+ * Calculates MCV vs MCV, MCV vs histogram, histogram vs MCV, and histogram vs
+ * histogram selectivity for semi/anti join cases.
+ */
+static Selectivity
+networkjoinsel_semi(Oid operator,
+ VariableStatData *vardata1, VariableStatData *vardata2)
+{
+ Form_pg_statistic stats;
+ Selectivity selec = 0.0,
+ sumcommon1 = 0.0,
+ sumcommon2 = 0.0;
+ double nullfrac1 = 0.0,
+ nullfrac2 = 0.0,
+ hist2_weight = 0.0;
+ bool mcv1_exists = false,
+ mcv2_exists = false,
+ hist1_exists = false,
+ hist2_exists = false;
+ int opr_codenum;
+ FmgrInfo proc;
+ int i,
+ mcv1_length = 0,
+ mcv2_length = 0;
+ AttStatsSlot mcv1_slot;
+ AttStatsSlot mcv2_slot;
+ AttStatsSlot hist1_slot;
+ AttStatsSlot hist2_slot;
+
+ if (HeapTupleIsValid(vardata1->statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(vardata1->statsTuple);
+ nullfrac1 = stats->stanullfrac;
+
+ mcv1_exists = get_attstatsslot(&mcv1_slot, vardata1->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ hist1_exists = get_attstatsslot(&hist1_slot, vardata1->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES);
+ /* Arbitrarily limit number of MCVs considered */
+ mcv1_length = Min(mcv1_slot.nvalues, MAX_CONSIDERED_ELEMS);
+ if (mcv1_exists)
+ sumcommon1 = mcv_population(mcv1_slot.numbers, mcv1_length);
+ }
+ else
+ {
+ memset(&mcv1_slot, 0, sizeof(mcv1_slot));
+ memset(&hist1_slot, 0, sizeof(hist1_slot));
+ }
+
+ if (HeapTupleIsValid(vardata2->statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(vardata2->statsTuple);
+ nullfrac2 = stats->stanullfrac;
+
+ mcv2_exists = get_attstatsslot(&mcv2_slot, vardata2->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ hist2_exists = get_attstatsslot(&hist2_slot, vardata2->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES);
+ /* Arbitrarily limit number of MCVs considered */
+ mcv2_length = Min(mcv2_slot.nvalues, MAX_CONSIDERED_ELEMS);
+ if (mcv2_exists)
+ sumcommon2 = mcv_population(mcv2_slot.numbers, mcv2_length);
+ }
+ else
+ {
+ memset(&mcv2_slot, 0, sizeof(mcv2_slot));
+ memset(&hist2_slot, 0, sizeof(hist2_slot));
+ }
+
+ opr_codenum = inet_opr_codenum(operator);
+ fmgr_info(get_opcode(operator), &proc);
+
+ /* Estimate number of input rows represented by RHS histogram. */
+ if (hist2_exists && vardata2->rel)
+ hist2_weight = (1.0 - nullfrac2 - sumcommon2) * vardata2->rel->rows;
+
+ /*
+ * Consider each element of the LHS MCV list, matching it to whatever RHS
+ * stats we have. Scale according to the known frequency of the MCV.
+ */
+ if (mcv1_exists && (mcv2_exists || hist2_exists))
+ {
+ for (i = 0; i < mcv1_length; i++)
+ {
+ selec += mcv1_slot.numbers[i] *
+ inet_semi_join_sel(mcv1_slot.values[i],
+ mcv2_exists, mcv2_slot.values, mcv2_length,
+ hist2_exists,
+ hist2_slot.values, hist2_slot.nvalues,
+ hist2_weight,
+ &proc, opr_codenum);
+ }
+ }
+
+ /*
+ * Consider each element of the LHS histogram, except for the first and
+ * last elements, which we exclude on the grounds that they're outliers
+ * and thus not very representative. Scale on the assumption that each
+ * such histogram element represents an equal share of the LHS histogram
+ * population (which is a bit bogus, because the members of its bucket may
+ * not all act the same with respect to the join clause, but it's hard to
+ * do better).
+ *
+ * If there are too many histogram elements, decimate to limit runtime.
+ */
+ if (hist1_exists && hist1_slot.nvalues > 2 && (mcv2_exists || hist2_exists))
+ {
+ double hist_selec_sum = 0.0;
+ int k,
+ n;
+
+ k = (hist1_slot.nvalues - 3) / MAX_CONSIDERED_ELEMS + 1;
+
+ n = 0;
+ for (i = 1; i < hist1_slot.nvalues - 1; i += k)
+ {
+ hist_selec_sum +=
+ inet_semi_join_sel(hist1_slot.values[i],
+ mcv2_exists, mcv2_slot.values, mcv2_length,
+ hist2_exists,
+ hist2_slot.values, hist2_slot.nvalues,
+ hist2_weight,
+ &proc, opr_codenum);
+ n++;
+ }
+
+ selec += (1.0 - nullfrac1 - sumcommon1) * hist_selec_sum / n;
+ }
+
+ /*
+ * If useful statistics are not available then use the default estimate.
+ * We can apply null fractions if known, though.
+ */
+ if ((!mcv1_exists && !hist1_exists) || (!mcv2_exists && !hist2_exists))
+ selec = (1.0 - nullfrac1) * (1.0 - nullfrac2) * DEFAULT_SEL(operator);
+
+ /* Release stats. */
+ free_attstatsslot(&mcv1_slot);
+ free_attstatsslot(&mcv2_slot);
+ free_attstatsslot(&hist1_slot);
+ free_attstatsslot(&hist2_slot);
+
+ return selec;
+}
+
+/*
+ * Compute the fraction of a relation's population that is represented
+ * by the MCV list.
+ */
+static Selectivity
+mcv_population(float4 *mcv_numbers, int mcv_nvalues)
+{
+ Selectivity sumcommon = 0.0;
+ int i;
+
+ for (i = 0; i < mcv_nvalues; i++)
+ {
+ sumcommon += mcv_numbers[i];
+ }
+
+ return sumcommon;
+}
+
+/*
+ * Inet histogram vs single value selectivity estimation
+ *
+ * Estimate the fraction of the histogram population that satisfies
+ * "value OPR CONST". (The result needs to be scaled to reflect the
+ * proportion of the total population represented by the histogram.)
+ *
+ * The histogram is originally for the inet btree comparison operators.
+ * Only the common bits of the network part and the length of the network part
+ * (masklen) are interesting for the subnet inclusion operators. Fortunately,
+ * btree comparison treats the network part as the major sort key. Even so,
+ * the length of the network part would not really be significant in the
+ * histogram. This would lead to big mistakes for data sets with uneven
+ * masklen distribution. To reduce this problem, comparisons with the left
+ * and the right sides of the buckets are used together.
+ *
+ * Histogram bucket matches are calculated in two forms. If the constant
+ * matches both bucket endpoints the bucket is considered as fully matched.
+ * The second form is to match the bucket partially; we recognize this when
+ * the constant matches just one endpoint, or the two endpoints fall on
+ * opposite sides of the constant. (Note that when the constant matches an
+ * interior histogram element, it gets credit for partial matches to the
+ * buckets on both sides, while a match to a histogram endpoint gets credit
+ * for only one partial match. This is desirable.)
+ *
+ * The divider in the partial bucket match is imagined as the distance
+ * between the decisive bits and the common bits of the addresses. It will
+ * be used as a power of two as it is the natural scale for the IP network
+ * inclusion. This partial bucket match divider calculation is an empirical
+ * formula and subject to change with more experiment.
+ *
+ * For a partial match, we try to calculate dividers for both of the
+ * boundaries. If the address family of a boundary value does not match the
+ * constant or comparison of the length of the network parts is not correct
+ * for the operator, the divider for that boundary will not be taken into
+ * account. If both of the dividers are valid, the greater one will be used
+ * to minimize the mistake in buckets that have disparate masklens. This
+ * calculation is unfair when dividers can be calculated for both of the
+ * boundaries but they are far from each other; but it is not a common
+ * situation as the boundaries are expected to share most of their significant
+ * bits of their masklens. The mistake would be greater, if we would use the
+ * minimum instead of the maximum, and we don't know a sensible way to combine
+ * them.
+ *
+ * For partial match in buckets that have different address families on the
+ * left and right sides, only the boundary with the same address family is
+ * taken into consideration. This can cause more mistakes for these buckets
+ * if the masklens of their boundaries are also disparate. But this can only
+ * happen in one bucket, since only two address families exist. It seems a
+ * better option than not considering these buckets at all.
+ */
+static Selectivity
+inet_hist_value_sel(Datum *values, int nvalues, Datum constvalue,
+ int opr_codenum)
+{
+ Selectivity match = 0.0;
+ inet *query,
+ *left,
+ *right;
+ int i,
+ k,
+ n;
+ int left_order,
+ right_order,
+ left_divider,
+ right_divider;
+
+ /* guard against zero-divide below */
+ if (nvalues <= 1)
+ return 0.0;
+
+ /* if there are too many histogram elements, decimate to limit runtime */
+ k = (nvalues - 2) / MAX_CONSIDERED_ELEMS + 1;
+
+ query = DatumGetInetPP(constvalue);
+
+ /* "left" is the left boundary value of the current bucket ... */
+ left = DatumGetInetPP(values[0]);
+ left_order = inet_inclusion_cmp(left, query, opr_codenum);
+
+ n = 0;
+ for (i = k; i < nvalues; i += k)
+ {
+ /* ... and "right" is the right boundary value */
+ right = DatumGetInetPP(values[i]);
+ right_order = inet_inclusion_cmp(right, query, opr_codenum);
+
+ if (left_order == 0 && right_order == 0)
+ {
+ /* The whole bucket matches, since both endpoints do. */
+ match += 1.0;
+ }
+ else if ((left_order <= 0 && right_order >= 0) ||
+ (left_order >= 0 && right_order <= 0))
+ {
+ /* Partial bucket match. */
+ left_divider = inet_hist_match_divider(left, query, opr_codenum);
+ right_divider = inet_hist_match_divider(right, query, opr_codenum);
+
+ if (left_divider >= 0 || right_divider >= 0)
+ match += 1.0 / pow(2.0, Max(left_divider, right_divider));
+ }
+
+ /* Shift the variables. */
+ left = right;
+ left_order = right_order;
+
+ /* Count the number of buckets considered. */
+ n++;
+ }
+
+ return match / n;
+}
+
+/*
+ * Inet MCV vs MCV join selectivity estimation
+ *
+ * We simply add up the fractions of the populations that satisfy the clause.
+ * The result is exact and does not need to be scaled further.
+ */
+static Selectivity
+inet_mcv_join_sel(Datum *mcv1_values, float4 *mcv1_numbers, int mcv1_nvalues,
+ Datum *mcv2_values, float4 *mcv2_numbers, int mcv2_nvalues,
+ Oid operator)
+{
+ Selectivity selec = 0.0;
+ FmgrInfo proc;
+ int i,
+ j;
+
+ fmgr_info(get_opcode(operator), &proc);
+
+ for (i = 0; i < mcv1_nvalues; i++)
+ {
+ for (j = 0; j < mcv2_nvalues; j++)
+ if (DatumGetBool(FunctionCall2(&proc,
+ mcv1_values[i],
+ mcv2_values[j])))
+ selec += mcv1_numbers[i] * mcv2_numbers[j];
+ }
+ return selec;
+}
+
+/*
+ * Inet MCV vs histogram join selectivity estimation
+ *
+ * For each MCV on the lefthand side, estimate the fraction of the righthand's
+ * histogram population that satisfies the join clause, and add those up,
+ * scaling by the MCV's frequency. The result still needs to be scaled
+ * according to the fraction of the righthand's population represented by
+ * the histogram.
+ */
+static Selectivity
+inet_mcv_hist_sel(Datum *mcv_values, float4 *mcv_numbers, int mcv_nvalues,
+ Datum *hist_values, int hist_nvalues,
+ int opr_codenum)
+{
+ Selectivity selec = 0.0;
+ int i;
+
+ /*
+ * We'll call inet_hist_value_selec with the histogram on the left, so we
+ * must commute the operator.
+ */
+ opr_codenum = -opr_codenum;
+
+ for (i = 0; i < mcv_nvalues; i++)
+ {
+ selec += mcv_numbers[i] *
+ inet_hist_value_sel(hist_values, hist_nvalues, mcv_values[i],
+ opr_codenum);
+ }
+ return selec;
+}
+
+/*
+ * Inet histogram vs histogram join selectivity estimation
+ *
+ * Here, we take all values listed in the second histogram (except for the
+ * first and last elements, which are excluded on the grounds of possibly
+ * not being very representative) and treat them as a uniform sample of
+ * the non-MCV population for that relation. For each one, we apply
+ * inet_hist_value_selec to see what fraction of the first histogram
+ * it matches.
+ *
+ * We could alternatively do this the other way around using the operator's
+ * commutator. XXX would it be worthwhile to do it both ways and take the
+ * average? That would at least avoid non-commutative estimation results.
+ */
+static Selectivity
+inet_hist_inclusion_join_sel(Datum *hist1_values, int hist1_nvalues,
+ Datum *hist2_values, int hist2_nvalues,
+ int opr_codenum)
+{
+ double match = 0.0;
+ int i,
+ k,
+ n;
+
+ if (hist2_nvalues <= 2)
+ return 0.0; /* no interior histogram elements */
+
+ /* if there are too many histogram elements, decimate to limit runtime */
+ k = (hist2_nvalues - 3) / MAX_CONSIDERED_ELEMS + 1;
+
+ n = 0;
+ for (i = 1; i < hist2_nvalues - 1; i += k)
+ {
+ match += inet_hist_value_sel(hist1_values, hist1_nvalues,
+ hist2_values[i], opr_codenum);
+ n++;
+ }
+
+ return match / n;
+}
+
+/*
+ * Inet semi join selectivity estimation for one value
+ *
+ * The function calculates the probability that there is at least one row
+ * in the RHS table that satisfies the "lhs_value op column" condition.
+ * It is used in semi join estimation to check a sample from the left hand
+ * side table.
+ *
+ * The MCV and histogram from the right hand side table should be provided as
+ * arguments with the lhs_value from the left hand side table for the join.
+ * hist_weight is the total number of rows represented by the histogram.
+ * For example, if the table has 1000 rows, and 10% of the rows are in the MCV
+ * list, and another 10% are NULLs, hist_weight would be 800.
+ *
+ * First, the lhs_value will be matched to the most common values. If it
+ * matches any of them, 1.0 will be returned, because then there is surely
+ * a match.
+ *
+ * Otherwise, the histogram will be used to estimate the number of rows in
+ * the second table that match the condition. If the estimate is greater
+ * than 1.0, 1.0 will be returned, because it means there is a greater chance
+ * that the lhs_value will match more than one row in the table. If it is
+ * between 0.0 and 1.0, it will be returned as the probability.
+ */
+static Selectivity
+inet_semi_join_sel(Datum lhs_value,
+ bool mcv_exists, Datum *mcv_values, int mcv_nvalues,
+ bool hist_exists, Datum *hist_values, int hist_nvalues,
+ double hist_weight,
+ FmgrInfo *proc, int opr_codenum)
+{
+ if (mcv_exists)
+ {
+ int i;
+
+ for (i = 0; i < mcv_nvalues; i++)
+ {
+ if (DatumGetBool(FunctionCall2(proc,
+ lhs_value,
+ mcv_values[i])))
+ return 1.0;
+ }
+ }
+
+ if (hist_exists && hist_weight > 0)
+ {
+ Selectivity hist_selec;
+
+ /* Commute operator, since we're passing lhs_value on the right */
+ hist_selec = inet_hist_value_sel(hist_values, hist_nvalues,
+ lhs_value, -opr_codenum);
+
+ if (hist_selec > 0)
+ return Min(1.0, hist_weight * hist_selec);
+ }
+
+ return 0.0;
+}
+
+/*
+ * Assign useful code numbers for the subnet inclusion/overlap operators
+ *
+ * Only inet_masklen_inclusion_cmp() and inet_hist_match_divider() depend
+ * on the exact codes assigned here; but many other places in this file
+ * know that they can negate a code to obtain the code for the commutator
+ * operator.
+ */
+static int
+inet_opr_codenum(Oid operator)
+{
+ switch (operator)
+ {
+ case OID_INET_SUP_OP:
+ return -2;
+ case OID_INET_SUPEQ_OP:
+ return -1;
+ case OID_INET_OVERLAP_OP:
+ return 0;
+ case OID_INET_SUBEQ_OP:
+ return 1;
+ case OID_INET_SUB_OP:
+ return 2;
+ default:
+ elog(ERROR, "unrecognized operator %u for inet selectivity",
+ operator);
+ }
+ return 0; /* unreached, but keep compiler quiet */
+}
+
+/*
+ * Comparison function for the subnet inclusion/overlap operators
+ *
+ * If the comparison is okay for the specified inclusion operator, the return
+ * value will be 0. Otherwise the return value will be less than or greater
+ * than 0 as appropriate for the operator.
+ *
+ * Comparison is compatible with the basic comparison function for the inet
+ * type. See network_cmp_internal() in network.c for the original. Basic
+ * comparison operators are implemented with the network_cmp_internal()
+ * function. It is possible to implement the subnet inclusion operators with
+ * this function.
+ *
+ * Comparison is first on the common bits of the network part, then on the
+ * length of the network part (masklen) as in the network_cmp_internal()
+ * function. Only the first part is in this function. The second part is
+ * separated to another function for reusability. The difference between the
+ * second part and the original network_cmp_internal() is that the inclusion
+ * operator is considered while comparing the lengths of the network parts.
+ * See the inet_masklen_inclusion_cmp() function below.
+ */
+static int
+inet_inclusion_cmp(inet *left, inet *right, int opr_codenum)
+{
+ if (ip_family(left) == ip_family(right))
+ {
+ int order;
+
+ order = bitncmp(ip_addr(left), ip_addr(right),
+ Min(ip_bits(left), ip_bits(right)));
+ if (order != 0)
+ return order;
+
+ return inet_masklen_inclusion_cmp(left, right, opr_codenum);
+ }
+
+ return ip_family(left) - ip_family(right);
+}
+
+/*
+ * Masklen comparison function for the subnet inclusion/overlap operators
+ *
+ * Compares the lengths of the network parts of the inputs. If the comparison
+ * is okay for the specified inclusion operator, the return value will be 0.
+ * Otherwise the return value will be less than or greater than 0 as
+ * appropriate for the operator.
+ */
+static int
+inet_masklen_inclusion_cmp(inet *left, inet *right, int opr_codenum)
+{
+ int order;
+
+ order = (int) ip_bits(left) - (int) ip_bits(right);
+
+ /*
+ * Return 0 if the operator would accept this combination of masklens.
+ * Note that opr_codenum zero (overlaps) will accept all cases.
+ */
+ if ((order > 0 && opr_codenum >= 0) ||
+ (order == 0 && opr_codenum >= -1 && opr_codenum <= 1) ||
+ (order < 0 && opr_codenum <= 0))
+ return 0;
+
+ /*
+ * Otherwise, return a negative value for sup/supeq (notionally, the RHS
+ * needs to have a larger masklen than it has, which would make it sort
+ * later), or a positive value for sub/subeq (vice versa).
+ */
+ return opr_codenum;
+}
+
+/*
+ * Inet histogram partial match divider calculation
+ *
+ * First the families and the lengths of the network parts are compared using
+ * the subnet inclusion operator. If those are acceptable for the operator,
+ * the divider will be calculated using the masklens and the common bits of
+ * the addresses. -1 will be returned if it cannot be calculated.
+ *
+ * See commentary for inet_hist_value_sel() for some rationale for this.
+ */
+static int
+inet_hist_match_divider(inet *boundary, inet *query, int opr_codenum)
+{
+ if (ip_family(boundary) == ip_family(query) &&
+ inet_masklen_inclusion_cmp(boundary, query, opr_codenum) == 0)
+ {
+ int min_bits,
+ decisive_bits;
+
+ min_bits = Min(ip_bits(boundary), ip_bits(query));
+
+ /*
+ * Set decisive_bits to the masklen of the one that should contain the
+ * other according to the operator.
+ */
+ if (opr_codenum < 0)
+ decisive_bits = ip_bits(boundary);
+ else if (opr_codenum > 0)
+ decisive_bits = ip_bits(query);
+ else
+ decisive_bits = min_bits;
+
+ /*
+ * Now return the number of non-common decisive bits. (This will be
+ * zero if the boundary and query in fact match, else positive.)
+ */
+ if (min_bits > 0)
+ return decisive_bits - bitncommon(ip_addr(boundary),
+ ip_addr(query),
+ min_bits);
+ return decisive_bits;
+ }
+
+ return -1;
+}
diff --git a/src/backend/utils/adt/network_spgist.c b/src/backend/utils/adt/network_spgist.c
new file mode 100644
index 0000000..3832156
--- /dev/null
+++ b/src/backend/utils/adt/network_spgist.c
@@ -0,0 +1,711 @@
+/*-------------------------------------------------------------------------
+ *
+ * network_spgist.c
+ * SP-GiST support for network types.
+ *
+ * We split inet index entries first by address family (IPv4 or IPv6).
+ * If the entries below a given inner tuple are all of the same family,
+ * we identify their common prefix and split by the next bit of the address,
+ * and by whether their masklens exceed the length of the common prefix.
+ *
+ * An inner tuple that has both IPv4 and IPv6 children has a null prefix
+ * and exactly two nodes, the first being for IPv4 and the second for IPv6.
+ *
+ * Otherwise, the prefix is a CIDR value representing the common prefix,
+ * and there are exactly four nodes. Node numbers 0 and 1 are for addresses
+ * with the same masklen as the prefix, while node numbers 2 and 3 are for
+ * addresses with larger masklen. (We do not allow a tuple to contain
+ * entries with masklen smaller than its prefix's.) Node numbers 0 and 1
+ * are distinguished by the next bit of the address after the common prefix,
+ * and likewise for node numbers 2 and 3. If there are no more bits in
+ * the address family, everything goes into node 0 (which will probably
+ * lead to creating an allTheSame tuple).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/network_spgist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/socket.h>
+
+#include "access/spgist.h"
+#include "catalog/pg_type.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+
+
+static int inet_spg_node_number(const inet *val, int commonbits);
+static int inet_spg_consistent_bitmap(const inet *prefix, int nkeys,
+ ScanKey scankeys, bool leaf);
+
+/*
+ * The SP-GiST configuration function
+ */
+Datum
+inet_spg_config(PG_FUNCTION_ARGS)
+{
+ /* spgConfigIn *cfgin = (spgConfigIn *) PG_GETARG_POINTER(0); */
+ spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+
+ cfg->prefixType = CIDROID;
+ cfg->labelType = VOIDOID;
+ cfg->canReturnData = true;
+ cfg->longValuesOK = false;
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * The SP-GiST choose function
+ */
+Datum
+inet_spg_choose(PG_FUNCTION_ARGS)
+{
+ spgChooseIn *in = (spgChooseIn *) PG_GETARG_POINTER(0);
+ spgChooseOut *out = (spgChooseOut *) PG_GETARG_POINTER(1);
+ inet *val = DatumGetInetPP(in->datum),
+ *prefix;
+ int commonbits;
+
+ /*
+ * If we're looking at a tuple that splits by address family, choose the
+ * appropriate subnode.
+ */
+ if (!in->hasPrefix)
+ {
+ /* allTheSame isn't possible for such a tuple */
+ Assert(!in->allTheSame);
+ Assert(in->nNodes == 2);
+
+ out->resultType = spgMatchNode;
+ out->result.matchNode.nodeN = (ip_family(val) == PGSQL_AF_INET) ? 0 : 1;
+ out->result.matchNode.restDatum = InetPGetDatum(val);
+
+ PG_RETURN_VOID();
+ }
+
+ /* Else it must split by prefix */
+ Assert(in->nNodes == 4 || in->allTheSame);
+
+ prefix = DatumGetInetPP(in->prefixDatum);
+ commonbits = ip_bits(prefix);
+
+ /*
+ * We cannot put addresses from different families under the same inner
+ * node, so we have to split if the new value's family is different.
+ */
+ if (ip_family(val) != ip_family(prefix))
+ {
+ /* Set up 2-node tuple */
+ out->resultType = spgSplitTuple;
+ out->result.splitTuple.prefixHasPrefix = false;
+ out->result.splitTuple.prefixNNodes = 2;
+ out->result.splitTuple.prefixNodeLabels = NULL;
+
+ /* Identify which node the existing data goes into */
+ out->result.splitTuple.childNodeN =
+ (ip_family(prefix) == PGSQL_AF_INET) ? 0 : 1;
+
+ out->result.splitTuple.postfixHasPrefix = true;
+ out->result.splitTuple.postfixPrefixDatum = InetPGetDatum(prefix);
+
+ PG_RETURN_VOID();
+ }
+
+ /*
+ * If the new value does not match the existing prefix, we have to split.
+ */
+ if (ip_bits(val) < commonbits ||
+ bitncmp(ip_addr(prefix), ip_addr(val), commonbits) != 0)
+ {
+ /* Determine new prefix length for the split tuple */
+ commonbits = bitncommon(ip_addr(prefix), ip_addr(val),
+ Min(ip_bits(val), commonbits));
+
+ /* Set up 4-node tuple */
+ out->resultType = spgSplitTuple;
+ out->result.splitTuple.prefixHasPrefix = true;
+ out->result.splitTuple.prefixPrefixDatum =
+ InetPGetDatum(cidr_set_masklen_internal(val, commonbits));
+ out->result.splitTuple.prefixNNodes = 4;
+ out->result.splitTuple.prefixNodeLabels = NULL;
+
+ /* Identify which node the existing data goes into */
+ out->result.splitTuple.childNodeN =
+ inet_spg_node_number(prefix, commonbits);
+
+ out->result.splitTuple.postfixHasPrefix = true;
+ out->result.splitTuple.postfixPrefixDatum = InetPGetDatum(prefix);
+
+ PG_RETURN_VOID();
+ }
+
+ /*
+ * All OK, choose the node to descend into. (If this tuple is marked
+ * allTheSame, the core code will ignore our choice of nodeN; but we need
+ * not account for that case explicitly here.)
+ */
+ out->resultType = spgMatchNode;
+ out->result.matchNode.nodeN = inet_spg_node_number(val, commonbits);
+ out->result.matchNode.restDatum = InetPGetDatum(val);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * The GiST PickSplit method
+ */
+Datum
+inet_spg_picksplit(PG_FUNCTION_ARGS)
+{
+ spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0);
+ spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1);
+ inet *prefix,
+ *tmp;
+ int i,
+ commonbits;
+ bool differentFamilies = false;
+
+ /* Initialize the prefix with the first item */
+ prefix = DatumGetInetPP(in->datums[0]);
+ commonbits = ip_bits(prefix);
+
+ /* Examine remaining items to discover minimum common prefix length */
+ for (i = 1; i < in->nTuples; i++)
+ {
+ tmp = DatumGetInetPP(in->datums[i]);
+
+ if (ip_family(tmp) != ip_family(prefix))
+ {
+ differentFamilies = true;
+ break;
+ }
+
+ if (ip_bits(tmp) < commonbits)
+ commonbits = ip_bits(tmp);
+ commonbits = bitncommon(ip_addr(prefix), ip_addr(tmp), commonbits);
+ if (commonbits == 0)
+ break;
+ }
+
+ /* Don't need labels; allocate output arrays */
+ out->nodeLabels = NULL;
+ out->mapTuplesToNodes = (int *) palloc(sizeof(int) * in->nTuples);
+ out->leafTupleDatums = (Datum *) palloc(sizeof(Datum) * in->nTuples);
+
+ if (differentFamilies)
+ {
+ /* Set up 2-node tuple */
+ out->hasPrefix = false;
+ out->nNodes = 2;
+
+ for (i = 0; i < in->nTuples; i++)
+ {
+ tmp = DatumGetInetPP(in->datums[i]);
+ out->mapTuplesToNodes[i] =
+ (ip_family(tmp) == PGSQL_AF_INET) ? 0 : 1;
+ out->leafTupleDatums[i] = InetPGetDatum(tmp);
+ }
+ }
+ else
+ {
+ /* Set up 4-node tuple */
+ out->hasPrefix = true;
+ out->prefixDatum =
+ InetPGetDatum(cidr_set_masklen_internal(prefix, commonbits));
+ out->nNodes = 4;
+
+ for (i = 0; i < in->nTuples; i++)
+ {
+ tmp = DatumGetInetPP(in->datums[i]);
+ out->mapTuplesToNodes[i] = inet_spg_node_number(tmp, commonbits);
+ out->leafTupleDatums[i] = InetPGetDatum(tmp);
+ }
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * The SP-GiST query consistency check for inner tuples
+ */
+Datum
+inet_spg_inner_consistent(PG_FUNCTION_ARGS)
+{
+ spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0);
+ spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
+ int i;
+ int which;
+
+ if (!in->hasPrefix)
+ {
+ Assert(!in->allTheSame);
+ Assert(in->nNodes == 2);
+
+ /* Identify which child nodes need to be visited */
+ which = 1 | (1 << 1);
+
+ for (i = 0; i < in->nkeys; i++)
+ {
+ StrategyNumber strategy = in->scankeys[i].sk_strategy;
+ inet *argument = DatumGetInetPP(in->scankeys[i].sk_argument);
+
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (ip_family(argument) == PGSQL_AF_INET)
+ which &= 1;
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (ip_family(argument) == PGSQL_AF_INET6)
+ which &= (1 << 1);
+ break;
+
+ case RTNotEqualStrategyNumber:
+ break;
+
+ default:
+ /* all other ops can only match addrs of same family */
+ if (ip_family(argument) == PGSQL_AF_INET)
+ which &= 1;
+ else
+ which &= (1 << 1);
+ break;
+ }
+ }
+ }
+ else if (!in->allTheSame)
+ {
+ Assert(in->nNodes == 4);
+
+ /* Identify which child nodes need to be visited */
+ which = inet_spg_consistent_bitmap(DatumGetInetPP(in->prefixDatum),
+ in->nkeys, in->scankeys, false);
+ }
+ else
+ {
+ /* Must visit all nodes; we assume there are less than 32 of 'em */
+ which = ~0;
+ }
+
+ out->nNodes = 0;
+
+ if (which)
+ {
+ out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+
+ for (i = 0; i < in->nNodes; i++)
+ {
+ if (which & (1 << i))
+ {
+ out->nodeNumbers[out->nNodes] = i;
+ out->nNodes++;
+ }
+ }
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * The SP-GiST query consistency check for leaf tuples
+ */
+Datum
+inet_spg_leaf_consistent(PG_FUNCTION_ARGS)
+{
+ spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0);
+ spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1);
+ inet *leaf = DatumGetInetPP(in->leafDatum);
+
+ /* All tests are exact. */
+ out->recheck = false;
+
+ /* Leaf is what it is... */
+ out->leafValue = InetPGetDatum(leaf);
+
+ /* Use common code to apply the tests. */
+ PG_RETURN_BOOL(inet_spg_consistent_bitmap(leaf, in->nkeys, in->scankeys,
+ true));
+}
+
+/*
+ * Calculate node number (within a 4-node, single-family inner index tuple)
+ *
+ * The value must have the same family as the node's prefix, and
+ * commonbits is the mask length of the prefix. We use even or odd
+ * nodes according to the next address bit after the commonbits,
+ * and low or high nodes according to whether the value's mask length
+ * is larger than commonbits.
+ */
+static int
+inet_spg_node_number(const inet *val, int commonbits)
+{
+ int nodeN = 0;
+
+ if (commonbits < ip_maxbits(val) &&
+ ip_addr(val)[commonbits / 8] & (1 << (7 - commonbits % 8)))
+ nodeN |= 1;
+ if (commonbits < ip_bits(val))
+ nodeN |= 2;
+
+ return nodeN;
+}
+
+/*
+ * Calculate bitmap of node numbers that are consistent with the query
+ *
+ * This can be used either at a 4-way inner tuple, or at a leaf tuple.
+ * In the latter case, we should return a boolean result (0 or 1)
+ * not a bitmap.
+ *
+ * This definition is pretty odd, but the inner and leaf consistency checks
+ * are mostly common and it seems best to keep them in one function.
+ */
+static int
+inet_spg_consistent_bitmap(const inet *prefix, int nkeys, ScanKey scankeys,
+ bool leaf)
+{
+ int bitmap;
+ int commonbits,
+ i;
+
+ /* Initialize result to allow visiting all children */
+ if (leaf)
+ bitmap = 1;
+ else
+ bitmap = 1 | (1 << 1) | (1 << 2) | (1 << 3);
+
+ commonbits = ip_bits(prefix);
+
+ for (i = 0; i < nkeys; i++)
+ {
+ inet *argument = DatumGetInetPP(scankeys[i].sk_argument);
+ StrategyNumber strategy = scankeys[i].sk_strategy;
+ int order;
+
+ /*
+ * Check 0: different families
+ *
+ * Matching families do not help any of the strategies.
+ */
+ if (ip_family(argument) != ip_family(prefix))
+ {
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (ip_family(argument) < ip_family(prefix))
+ bitmap = 0;
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (ip_family(argument) > ip_family(prefix))
+ bitmap = 0;
+ break;
+
+ case RTNotEqualStrategyNumber:
+ break;
+
+ default:
+ /* For all other cases, we can be sure there is no match */
+ bitmap = 0;
+ break;
+ }
+
+ if (!bitmap)
+ break;
+
+ /* Other checks make no sense with different families. */
+ continue;
+ }
+
+ /*
+ * Check 1: network bit count
+ *
+ * Network bit count (ip_bits) helps to check leaves for sub network
+ * and sup network operators. At non-leaf nodes, we know every child
+ * value has greater ip_bits, so we can avoid descending in some cases
+ * too.
+ *
+ * This check is less expensive than checking the address bits, so we
+ * are doing this before, but it has to be done after for the basic
+ * comparison strategies, because ip_bits only affect their results
+ * when the common network bits are the same.
+ */
+ switch (strategy)
+ {
+ case RTSubStrategyNumber:
+ if (commonbits <= ip_bits(argument))
+ bitmap &= (1 << 2) | (1 << 3);
+ break;
+
+ case RTSubEqualStrategyNumber:
+ if (commonbits < ip_bits(argument))
+ bitmap &= (1 << 2) | (1 << 3);
+ break;
+
+ case RTSuperStrategyNumber:
+ if (commonbits == ip_bits(argument) - 1)
+ bitmap &= 1 | (1 << 1);
+ else if (commonbits >= ip_bits(argument))
+ bitmap = 0;
+ break;
+
+ case RTSuperEqualStrategyNumber:
+ if (commonbits == ip_bits(argument))
+ bitmap &= 1 | (1 << 1);
+ else if (commonbits > ip_bits(argument))
+ bitmap = 0;
+ break;
+
+ case RTEqualStrategyNumber:
+ if (commonbits < ip_bits(argument))
+ bitmap &= (1 << 2) | (1 << 3);
+ else if (commonbits == ip_bits(argument))
+ bitmap &= 1 | (1 << 1);
+ else
+ bitmap = 0;
+ break;
+ }
+
+ if (!bitmap)
+ break;
+
+ /*
+ * Check 2: common network bits
+ *
+ * Compare available common prefix bits to the query, but not beyond
+ * either the query's netmask or the minimum netmask among the
+ * represented values. If these bits don't match the query, we can
+ * eliminate some cases.
+ */
+ order = bitncmp(ip_addr(prefix), ip_addr(argument),
+ Min(commonbits, ip_bits(argument)));
+
+ if (order != 0)
+ {
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (order > 0)
+ bitmap = 0;
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (order < 0)
+ bitmap = 0;
+ break;
+
+ case RTNotEqualStrategyNumber:
+ break;
+
+ default:
+ /* For all other cases, we can be sure there is no match */
+ bitmap = 0;
+ break;
+ }
+
+ if (!bitmap)
+ break;
+
+ /*
+ * Remaining checks make no sense when common bits don't match.
+ */
+ continue;
+ }
+
+ /*
+ * Check 3: next network bit
+ *
+ * We can filter out branch 2 or 3 using the next network bit of the
+ * argument, if it is available.
+ *
+ * This check matters for the performance of the search. The results
+ * would be correct without it.
+ */
+ if (bitmap & ((1 << 2) | (1 << 3)) &&
+ commonbits < ip_bits(argument))
+ {
+ int nextbit;
+
+ nextbit = ip_addr(argument)[commonbits / 8] &
+ (1 << (7 - commonbits % 8));
+
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (!nextbit)
+ bitmap &= 1 | (1 << 1) | (1 << 2);
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (nextbit)
+ bitmap &= 1 | (1 << 1) | (1 << 3);
+ break;
+
+ case RTNotEqualStrategyNumber:
+ break;
+
+ default:
+ if (!nextbit)
+ bitmap &= 1 | (1 << 1) | (1 << 2);
+ else
+ bitmap &= 1 | (1 << 1) | (1 << 3);
+ break;
+ }
+
+ if (!bitmap)
+ break;
+ }
+
+ /*
+ * Remaining checks are only for the basic comparison strategies. This
+ * test relies on the strategy number ordering defined in stratnum.h.
+ */
+ if (strategy < RTEqualStrategyNumber ||
+ strategy > RTGreaterEqualStrategyNumber)
+ continue;
+
+ /*
+ * Check 4: network bit count
+ *
+ * At this point, we know that the common network bits of the prefix
+ * and the argument are the same, so we can go forward and check the
+ * ip_bits.
+ */
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (commonbits == ip_bits(argument))
+ bitmap &= 1 | (1 << 1);
+ else if (commonbits > ip_bits(argument))
+ bitmap = 0;
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (commonbits < ip_bits(argument))
+ bitmap &= (1 << 2) | (1 << 3);
+ break;
+ }
+
+ if (!bitmap)
+ break;
+
+ /* Remaining checks don't make sense with different ip_bits. */
+ if (commonbits != ip_bits(argument))
+ continue;
+
+ /*
+ * Check 5: next host bit
+ *
+ * We can filter out branch 0 or 1 using the next host bit of the
+ * argument, if it is available.
+ *
+ * This check matters for the performance of the search. The results
+ * would be correct without it. There is no point in running it for
+ * leafs as we have to check the whole address on the next step.
+ */
+ if (!leaf && bitmap & (1 | (1 << 1)) &&
+ commonbits < ip_maxbits(argument))
+ {
+ int nextbit;
+
+ nextbit = ip_addr(argument)[commonbits / 8] &
+ (1 << (7 - commonbits % 8));
+
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ case RTLessEqualStrategyNumber:
+ if (!nextbit)
+ bitmap &= 1 | (1 << 2) | (1 << 3);
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ case RTGreaterStrategyNumber:
+ if (nextbit)
+ bitmap &= (1 << 1) | (1 << 2) | (1 << 3);
+ break;
+
+ case RTNotEqualStrategyNumber:
+ break;
+
+ default:
+ if (!nextbit)
+ bitmap &= 1 | (1 << 2) | (1 << 3);
+ else
+ bitmap &= (1 << 1) | (1 << 2) | (1 << 3);
+ break;
+ }
+
+ if (!bitmap)
+ break;
+ }
+
+ /*
+ * Check 6: whole address
+ *
+ * This is the last check for correctness of the basic comparison
+ * strategies. It's only appropriate at leaf entries.
+ */
+ if (leaf)
+ {
+ /* Redo ordering comparison using all address bits */
+ order = bitncmp(ip_addr(prefix), ip_addr(argument),
+ ip_maxbits(prefix));
+
+ switch (strategy)
+ {
+ case RTLessStrategyNumber:
+ if (order >= 0)
+ bitmap = 0;
+ break;
+
+ case RTLessEqualStrategyNumber:
+ if (order > 0)
+ bitmap = 0;
+ break;
+
+ case RTEqualStrategyNumber:
+ if (order != 0)
+ bitmap = 0;
+ break;
+
+ case RTGreaterEqualStrategyNumber:
+ if (order < 0)
+ bitmap = 0;
+ break;
+
+ case RTGreaterStrategyNumber:
+ if (order <= 0)
+ bitmap = 0;
+ break;
+
+ case RTNotEqualStrategyNumber:
+ if (order == 0)
+ bitmap = 0;
+ break;
+ }
+
+ if (!bitmap)
+ break;
+ }
+ }
+
+ return bitmap;
+}
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
new file mode 100644
index 0000000..a1c9d69
--- /dev/null
+++ b/src/backend/utils/adt/numeric.c
@@ -0,0 +1,11484 @@
+/*-------------------------------------------------------------------------
+ *
+ * numeric.c
+ * An exact numeric data type for the Postgres database system
+ *
+ * Original coding 1998, Jan Wieck. Heavily revised 2003, Tom Lane.
+ *
+ * Many of the algorithmic ideas are borrowed from David M. Smith's "FM"
+ * multiple-precision math library, most recently published as Algorithm
+ * 786: Multiple-Precision Complex Arithmetic and Functions, ACM
+ * Transactions on Mathematical Software, Vol. 24, No. 4, December 1998,
+ * pages 359-367.
+ *
+ * Copyright (c) 1998-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/numeric.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "common/int.h"
+#include "funcapi.h"
+#include "lib/hyperloglog.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/float.h"
+#include "utils/guc.h"
+#include "utils/numeric.h"
+#include "utils/pg_lsn.h"
+#include "utils/sortsupport.h"
+
+/* ----------
+ * Uncomment the following to enable compilation of dump_numeric()
+ * and dump_var() and to get a dump of any result produced by make_result().
+ * ----------
+#define NUMERIC_DEBUG
+ */
+
+
+/* ----------
+ * Local data types
+ *
+ * Numeric values are represented in a base-NBASE floating point format.
+ * Each "digit" ranges from 0 to NBASE-1. The type NumericDigit is signed
+ * and wide enough to store a digit. We assume that NBASE*NBASE can fit in
+ * an int. Although the purely calculational routines could handle any even
+ * NBASE that's less than sqrt(INT_MAX), in practice we are only interested
+ * in NBASE a power of ten, so that I/O conversions and decimal rounding
+ * are easy. Also, it's actually more efficient if NBASE is rather less than
+ * sqrt(INT_MAX), so that there is "headroom" for mul_var and div_var_fast to
+ * postpone processing carries.
+ *
+ * Values of NBASE other than 10000 are considered of historical interest only
+ * and are no longer supported in any sense; no mechanism exists for the client
+ * to discover the base, so every client supporting binary mode expects the
+ * base-10000 format. If you plan to change this, also note the numeric
+ * abbreviation code, which assumes NBASE=10000.
+ * ----------
+ */
+
+#if 0
+#define NBASE 10
+#define HALF_NBASE 5
+#define DEC_DIGITS 1 /* decimal digits per NBASE digit */
+#define MUL_GUARD_DIGITS 4 /* these are measured in NBASE digits */
+#define DIV_GUARD_DIGITS 8
+
+typedef signed char NumericDigit;
+#endif
+
+#if 0
+#define NBASE 100
+#define HALF_NBASE 50
+#define DEC_DIGITS 2 /* decimal digits per NBASE digit */
+#define MUL_GUARD_DIGITS 3 /* these are measured in NBASE digits */
+#define DIV_GUARD_DIGITS 6
+
+typedef signed char NumericDigit;
+#endif
+
+#if 1
+#define NBASE 10000
+#define HALF_NBASE 5000
+#define DEC_DIGITS 4 /* decimal digits per NBASE digit */
+#define MUL_GUARD_DIGITS 2 /* these are measured in NBASE digits */
+#define DIV_GUARD_DIGITS 4
+
+typedef int16 NumericDigit;
+#endif
+
+/*
+ * The Numeric type as stored on disk.
+ *
+ * If the high bits of the first word of a NumericChoice (n_header, or
+ * n_short.n_header, or n_long.n_sign_dscale) are NUMERIC_SHORT, then the
+ * numeric follows the NumericShort format; if they are NUMERIC_POS or
+ * NUMERIC_NEG, it follows the NumericLong format. If they are NUMERIC_SPECIAL,
+ * the value is a NaN or Infinity. We currently always store SPECIAL values
+ * using just two bytes (i.e. only n_header), but previous releases used only
+ * the NumericLong format, so we might find 4-byte NaNs (though not infinities)
+ * on disk if a database has been migrated using pg_upgrade. In either case,
+ * the low-order bits of a special value's header are reserved and currently
+ * should always be set to zero.
+ *
+ * In the NumericShort format, the remaining 14 bits of the header word
+ * (n_short.n_header) are allocated as follows: 1 for sign (positive or
+ * negative), 6 for dynamic scale, and 7 for weight. In practice, most
+ * commonly-encountered values can be represented this way.
+ *
+ * In the NumericLong format, the remaining 14 bits of the header word
+ * (n_long.n_sign_dscale) represent the display scale; and the weight is
+ * stored separately in n_weight.
+ *
+ * NOTE: by convention, values in the packed form have been stripped of
+ * all leading and trailing zero digits (where a "digit" is of base NBASE).
+ * In particular, if the value is zero, there will be no digits at all!
+ * The weight is arbitrary in that case, but we normally set it to zero.
+ */
+
+struct NumericShort
+{
+ uint16 n_header; /* Sign + display scale + weight */
+ NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]; /* Digits */
+};
+
+struct NumericLong
+{
+ uint16 n_sign_dscale; /* Sign + display scale */
+ int16 n_weight; /* Weight of 1st digit */
+ NumericDigit n_data[FLEXIBLE_ARRAY_MEMBER]; /* Digits */
+};
+
+union NumericChoice
+{
+ uint16 n_header; /* Header word */
+ struct NumericLong n_long; /* Long form (4-byte header) */
+ struct NumericShort n_short; /* Short form (2-byte header) */
+};
+
+struct NumericData
+{
+ int32 vl_len_; /* varlena header (do not touch directly!) */
+ union NumericChoice choice; /* choice of format */
+};
+
+
+/*
+ * Interpretation of high bits.
+ */
+
+#define NUMERIC_SIGN_MASK 0xC000
+#define NUMERIC_POS 0x0000
+#define NUMERIC_NEG 0x4000
+#define NUMERIC_SHORT 0x8000
+#define NUMERIC_SPECIAL 0xC000
+
+#define NUMERIC_FLAGBITS(n) ((n)->choice.n_header & NUMERIC_SIGN_MASK)
+#define NUMERIC_IS_SHORT(n) (NUMERIC_FLAGBITS(n) == NUMERIC_SHORT)
+#define NUMERIC_IS_SPECIAL(n) (NUMERIC_FLAGBITS(n) == NUMERIC_SPECIAL)
+
+#define NUMERIC_HDRSZ (VARHDRSZ + sizeof(uint16) + sizeof(int16))
+#define NUMERIC_HDRSZ_SHORT (VARHDRSZ + sizeof(uint16))
+
+/*
+ * If the flag bits are NUMERIC_SHORT or NUMERIC_SPECIAL, we want the short
+ * header; otherwise, we want the long one. Instead of testing against each
+ * value, we can just look at the high bit, for a slight efficiency gain.
+ */
+#define NUMERIC_HEADER_IS_SHORT(n) (((n)->choice.n_header & 0x8000) != 0)
+#define NUMERIC_HEADER_SIZE(n) \
+ (VARHDRSZ + sizeof(uint16) + \
+ (NUMERIC_HEADER_IS_SHORT(n) ? 0 : sizeof(int16)))
+
+/*
+ * Definitions for special values (NaN, positive infinity, negative infinity).
+ *
+ * The two bits after the NUMERIC_SPECIAL bits are 00 for NaN, 01 for positive
+ * infinity, 11 for negative infinity. (This makes the sign bit match where
+ * it is in a short-format value, though we make no use of that at present.)
+ * We could mask off the remaining bits before testing the active bits, but
+ * currently those bits must be zeroes, so masking would just add cycles.
+ */
+#define NUMERIC_EXT_SIGN_MASK 0xF000 /* high bits plus NaN/Inf flag bits */
+#define NUMERIC_NAN 0xC000
+#define NUMERIC_PINF 0xD000
+#define NUMERIC_NINF 0xF000
+#define NUMERIC_INF_SIGN_MASK 0x2000
+
+#define NUMERIC_EXT_FLAGBITS(n) ((n)->choice.n_header & NUMERIC_EXT_SIGN_MASK)
+#define NUMERIC_IS_NAN(n) ((n)->choice.n_header == NUMERIC_NAN)
+#define NUMERIC_IS_PINF(n) ((n)->choice.n_header == NUMERIC_PINF)
+#define NUMERIC_IS_NINF(n) ((n)->choice.n_header == NUMERIC_NINF)
+#define NUMERIC_IS_INF(n) \
+ (((n)->choice.n_header & ~NUMERIC_INF_SIGN_MASK) == NUMERIC_PINF)
+
+/*
+ * Short format definitions.
+ */
+
+#define NUMERIC_SHORT_SIGN_MASK 0x2000
+#define NUMERIC_SHORT_DSCALE_MASK 0x1F80
+#define NUMERIC_SHORT_DSCALE_SHIFT 7
+#define NUMERIC_SHORT_DSCALE_MAX \
+ (NUMERIC_SHORT_DSCALE_MASK >> NUMERIC_SHORT_DSCALE_SHIFT)
+#define NUMERIC_SHORT_WEIGHT_SIGN_MASK 0x0040
+#define NUMERIC_SHORT_WEIGHT_MASK 0x003F
+#define NUMERIC_SHORT_WEIGHT_MAX NUMERIC_SHORT_WEIGHT_MASK
+#define NUMERIC_SHORT_WEIGHT_MIN (-(NUMERIC_SHORT_WEIGHT_MASK+1))
+
+/*
+ * Extract sign, display scale, weight. These macros extract field values
+ * suitable for the NumericVar format from the Numeric (on-disk) format.
+ *
+ * Note that we don't trouble to ensure that dscale and weight read as zero
+ * for an infinity; however, that doesn't matter since we never convert
+ * "special" numerics to NumericVar form. Only the constants defined below
+ * (const_nan, etc) ever represent a non-finite value as a NumericVar.
+ */
+
+#define NUMERIC_DSCALE_MASK 0x3FFF
+#define NUMERIC_DSCALE_MAX NUMERIC_DSCALE_MASK
+
+#define NUMERIC_SIGN(n) \
+ (NUMERIC_IS_SHORT(n) ? \
+ (((n)->choice.n_short.n_header & NUMERIC_SHORT_SIGN_MASK) ? \
+ NUMERIC_NEG : NUMERIC_POS) : \
+ (NUMERIC_IS_SPECIAL(n) ? \
+ NUMERIC_EXT_FLAGBITS(n) : NUMERIC_FLAGBITS(n)))
+#define NUMERIC_DSCALE(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \
+ ((n)->choice.n_short.n_header & NUMERIC_SHORT_DSCALE_MASK) \
+ >> NUMERIC_SHORT_DSCALE_SHIFT \
+ : ((n)->choice.n_long.n_sign_dscale & NUMERIC_DSCALE_MASK))
+#define NUMERIC_WEIGHT(n) (NUMERIC_HEADER_IS_SHORT((n)) ? \
+ (((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_SIGN_MASK ? \
+ ~NUMERIC_SHORT_WEIGHT_MASK : 0) \
+ | ((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_MASK)) \
+ : ((n)->choice.n_long.n_weight))
+
+/* ----------
+ * NumericVar is the format we use for arithmetic. The digit-array part
+ * is the same as the NumericData storage format, but the header is more
+ * complex.
+ *
+ * The value represented by a NumericVar is determined by the sign, weight,
+ * ndigits, and digits[] array. If it is a "special" value (NaN or Inf)
+ * then only the sign field matters; ndigits should be zero, and the weight
+ * and dscale fields are ignored.
+ *
+ * Note: the first digit of a NumericVar's value is assumed to be multiplied
+ * by NBASE ** weight. Another way to say it is that there are weight+1
+ * digits before the decimal point. It is possible to have weight < 0.
+ *
+ * buf points at the physical start of the palloc'd digit buffer for the
+ * NumericVar. digits points at the first digit in actual use (the one
+ * with the specified weight). We normally leave an unused digit or two
+ * (preset to zeroes) between buf and digits, so that there is room to store
+ * a carry out of the top digit without reallocating space. We just need to
+ * decrement digits (and increment weight) to make room for the carry digit.
+ * (There is no such extra space in a numeric value stored in the database,
+ * only in a NumericVar in memory.)
+ *
+ * If buf is NULL then the digit buffer isn't actually palloc'd and should
+ * not be freed --- see the constants below for an example.
+ *
+ * dscale, or display scale, is the nominal precision expressed as number
+ * of digits after the decimal point (it must always be >= 0 at present).
+ * dscale may be more than the number of physically stored fractional digits,
+ * implying that we have suppressed storage of significant trailing zeroes.
+ * It should never be less than the number of stored digits, since that would
+ * imply hiding digits that are present. NOTE that dscale is always expressed
+ * in *decimal* digits, and so it may correspond to a fractional number of
+ * base-NBASE digits --- divide by DEC_DIGITS to convert to NBASE digits.
+ *
+ * rscale, or result scale, is the target precision for a computation.
+ * Like dscale it is expressed as number of *decimal* digits after the decimal
+ * point, and is always >= 0 at present.
+ * Note that rscale is not stored in variables --- it's figured on-the-fly
+ * from the dscales of the inputs.
+ *
+ * While we consistently use "weight" to refer to the base-NBASE weight of
+ * a numeric value, it is convenient in some scale-related calculations to
+ * make use of the base-10 weight (ie, the approximate log10 of the value).
+ * To avoid confusion, such a decimal-units weight is called a "dweight".
+ *
+ * NB: All the variable-level functions are written in a style that makes it
+ * possible to give one and the same variable as argument and destination.
+ * This is feasible because the digit buffer is separate from the variable.
+ * ----------
+ */
+typedef struct NumericVar
+{
+ int ndigits; /* # of digits in digits[] - can be 0! */
+ int weight; /* weight of first digit */
+ int sign; /* NUMERIC_POS, _NEG, _NAN, _PINF, or _NINF */
+ int dscale; /* display scale */
+ NumericDigit *buf; /* start of palloc'd space for digits[] */
+ NumericDigit *digits; /* base-NBASE digits */
+} NumericVar;
+
+
+/* ----------
+ * Data for generate_series
+ * ----------
+ */
+typedef struct
+{
+ NumericVar current;
+ NumericVar stop;
+ NumericVar step;
+} generate_series_numeric_fctx;
+
+
+/* ----------
+ * Sort support.
+ * ----------
+ */
+typedef struct
+{
+ void *buf; /* buffer for short varlenas */
+ int64 input_count; /* number of non-null values seen */
+ bool estimating; /* true if estimating cardinality */
+
+ hyperLogLogState abbr_card; /* cardinality estimator */
+} NumericSortSupport;
+
+
+/* ----------
+ * Fast sum accumulator.
+ *
+ * NumericSumAccum is used to implement SUM(), and other standard aggregates
+ * that track the sum of input values. It uses 32-bit integers to store the
+ * digits, instead of the normal 16-bit integers (with NBASE=10000). This
+ * way, we can safely accumulate up to NBASE - 1 values without propagating
+ * carry, before risking overflow of any of the digits. 'num_uncarried'
+ * tracks how many values have been accumulated without propagating carry.
+ *
+ * Positive and negative values are accumulated separately, in 'pos_digits'
+ * and 'neg_digits'. This is simpler and faster than deciding whether to add
+ * or subtract from the current value, for each new value (see sub_var() for
+ * the logic we avoid by doing this). Both buffers are of same size, and
+ * have the same weight and scale. In accum_sum_final(), the positive and
+ * negative sums are added together to produce the final result.
+ *
+ * When a new value has a larger ndigits or weight than the accumulator
+ * currently does, the accumulator is enlarged to accommodate the new value.
+ * We normally have one zero digit reserved for carry propagation, and that
+ * is indicated by the 'have_carry_space' flag. When accum_sum_carry() uses
+ * up the reserved digit, it clears the 'have_carry_space' flag. The next
+ * call to accum_sum_add() will enlarge the buffer, to make room for the
+ * extra digit, and set the flag again.
+ *
+ * To initialize a new accumulator, simply reset all fields to zeros.
+ *
+ * The accumulator does not handle NaNs.
+ * ----------
+ */
+typedef struct NumericSumAccum
+{
+ int ndigits;
+ int weight;
+ int dscale;
+ int num_uncarried;
+ bool have_carry_space;
+ int32 *pos_digits;
+ int32 *neg_digits;
+} NumericSumAccum;
+
+
+/*
+ * We define our own macros for packing and unpacking abbreviated-key
+ * representations for numeric values in order to avoid depending on
+ * USE_FLOAT8_BYVAL. The type of abbreviation we use is based only on
+ * the size of a datum, not the argument-passing convention for float8.
+ *
+ * The range of abbreviations for finite values is from +PG_INT64/32_MAX
+ * to -PG_INT64/32_MAX. NaN has the abbreviation PG_INT64/32_MIN, and we
+ * define the sort ordering to make that work out properly (see further
+ * comments below). PINF and NINF share the abbreviations of the largest
+ * and smallest finite abbreviation classes.
+ */
+#define NUMERIC_ABBREV_BITS (SIZEOF_DATUM * BITS_PER_BYTE)
+#if SIZEOF_DATUM == 8
+#define NumericAbbrevGetDatum(X) ((Datum) (X))
+#define DatumGetNumericAbbrev(X) ((int64) (X))
+#define NUMERIC_ABBREV_NAN NumericAbbrevGetDatum(PG_INT64_MIN)
+#define NUMERIC_ABBREV_PINF NumericAbbrevGetDatum(-PG_INT64_MAX)
+#define NUMERIC_ABBREV_NINF NumericAbbrevGetDatum(PG_INT64_MAX)
+#else
+#define NumericAbbrevGetDatum(X) ((Datum) (X))
+#define DatumGetNumericAbbrev(X) ((int32) (X))
+#define NUMERIC_ABBREV_NAN NumericAbbrevGetDatum(PG_INT32_MIN)
+#define NUMERIC_ABBREV_PINF NumericAbbrevGetDatum(-PG_INT32_MAX)
+#define NUMERIC_ABBREV_NINF NumericAbbrevGetDatum(PG_INT32_MAX)
+#endif
+
+
+/* ----------
+ * Some preinitialized constants
+ * ----------
+ */
+static const NumericDigit const_zero_data[1] = {0};
+static const NumericVar const_zero =
+{0, 0, NUMERIC_POS, 0, NULL, (NumericDigit *) const_zero_data};
+
+static const NumericDigit const_one_data[1] = {1};
+static const NumericVar const_one =
+{1, 0, NUMERIC_POS, 0, NULL, (NumericDigit *) const_one_data};
+
+static const NumericVar const_minus_one =
+{1, 0, NUMERIC_NEG, 0, NULL, (NumericDigit *) const_one_data};
+
+static const NumericDigit const_two_data[1] = {2};
+static const NumericVar const_two =
+{1, 0, NUMERIC_POS, 0, NULL, (NumericDigit *) const_two_data};
+
+#if DEC_DIGITS == 4
+static const NumericDigit const_zero_point_nine_data[1] = {9000};
+#elif DEC_DIGITS == 2
+static const NumericDigit const_zero_point_nine_data[1] = {90};
+#elif DEC_DIGITS == 1
+static const NumericDigit const_zero_point_nine_data[1] = {9};
+#endif
+static const NumericVar const_zero_point_nine =
+{1, -1, NUMERIC_POS, 1, NULL, (NumericDigit *) const_zero_point_nine_data};
+
+#if DEC_DIGITS == 4
+static const NumericDigit const_one_point_one_data[2] = {1, 1000};
+#elif DEC_DIGITS == 2
+static const NumericDigit const_one_point_one_data[2] = {1, 10};
+#elif DEC_DIGITS == 1
+static const NumericDigit const_one_point_one_data[2] = {1, 1};
+#endif
+static const NumericVar const_one_point_one =
+{2, 0, NUMERIC_POS, 1, NULL, (NumericDigit *) const_one_point_one_data};
+
+static const NumericVar const_nan =
+{0, 0, NUMERIC_NAN, 0, NULL, NULL};
+
+static const NumericVar const_pinf =
+{0, 0, NUMERIC_PINF, 0, NULL, NULL};
+
+static const NumericVar const_ninf =
+{0, 0, NUMERIC_NINF, 0, NULL, NULL};
+
+#if DEC_DIGITS == 4
+static const int round_powers[4] = {0, 1000, 100, 10};
+#endif
+
+
+/* ----------
+ * Local functions
+ * ----------
+ */
+
+#ifdef NUMERIC_DEBUG
+static void dump_numeric(const char *str, Numeric num);
+static void dump_var(const char *str, NumericVar *var);
+#else
+#define dump_numeric(s,n)
+#define dump_var(s,v)
+#endif
+
+#define digitbuf_alloc(ndigits) \
+ ((NumericDigit *) palloc((ndigits) * sizeof(NumericDigit)))
+#define digitbuf_free(buf) \
+ do { \
+ if ((buf) != NULL) \
+ pfree(buf); \
+ } while (0)
+
+#define init_var(v) memset(v, 0, sizeof(NumericVar))
+
+#define NUMERIC_DIGITS(num) (NUMERIC_HEADER_IS_SHORT(num) ? \
+ (num)->choice.n_short.n_data : (num)->choice.n_long.n_data)
+#define NUMERIC_NDIGITS(num) \
+ ((VARSIZE(num) - NUMERIC_HEADER_SIZE(num)) / sizeof(NumericDigit))
+#define NUMERIC_CAN_BE_SHORT(scale,weight) \
+ ((scale) <= NUMERIC_SHORT_DSCALE_MAX && \
+ (weight) <= NUMERIC_SHORT_WEIGHT_MAX && \
+ (weight) >= NUMERIC_SHORT_WEIGHT_MIN)
+
+static void alloc_var(NumericVar *var, int ndigits);
+static void free_var(NumericVar *var);
+static void zero_var(NumericVar *var);
+
+static const char *set_var_from_str(const char *str, const char *cp,
+ NumericVar *dest);
+static void set_var_from_num(Numeric value, NumericVar *dest);
+static void init_var_from_num(Numeric num, NumericVar *dest);
+static void set_var_from_var(const NumericVar *value, NumericVar *dest);
+static char *get_str_from_var(const NumericVar *var);
+static char *get_str_from_var_sci(const NumericVar *var, int rscale);
+
+static void numericvar_serialize(StringInfo buf, const NumericVar *var);
+static void numericvar_deserialize(StringInfo buf, NumericVar *var);
+
+static Numeric duplicate_numeric(Numeric num);
+static Numeric make_result(const NumericVar *var);
+static Numeric make_result_opt_error(const NumericVar *var, bool *error);
+
+static void apply_typmod(NumericVar *var, int32 typmod);
+static void apply_typmod_special(Numeric num, int32 typmod);
+
+static bool numericvar_to_int32(const NumericVar *var, int32 *result);
+static bool numericvar_to_int64(const NumericVar *var, int64 *result);
+static void int64_to_numericvar(int64 val, NumericVar *var);
+static bool numericvar_to_uint64(const NumericVar *var, uint64 *result);
+#ifdef HAVE_INT128
+static bool numericvar_to_int128(const NumericVar *var, int128 *result);
+static void int128_to_numericvar(int128 val, NumericVar *var);
+#endif
+static double numericvar_to_double_no_overflow(const NumericVar *var);
+
+static Datum numeric_abbrev_convert(Datum original_datum, SortSupport ssup);
+static bool numeric_abbrev_abort(int memtupcount, SortSupport ssup);
+static int numeric_fast_cmp(Datum x, Datum y, SortSupport ssup);
+static int numeric_cmp_abbrev(Datum x, Datum y, SortSupport ssup);
+
+static Datum numeric_abbrev_convert_var(const NumericVar *var,
+ NumericSortSupport *nss);
+
+static int cmp_numerics(Numeric num1, Numeric num2);
+static int cmp_var(const NumericVar *var1, const NumericVar *var2);
+static int cmp_var_common(const NumericDigit *var1digits, int var1ndigits,
+ int var1weight, int var1sign,
+ const NumericDigit *var2digits, int var2ndigits,
+ int var2weight, int var2sign);
+static void add_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void sub_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void mul_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result,
+ int rscale);
+static void div_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result,
+ int rscale, bool round);
+static void div_var_fast(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result, int rscale, bool round);
+static void div_var_int(const NumericVar *var, int ival, int ival_weight,
+ NumericVar *result, int rscale, bool round);
+static int select_div_scale(const NumericVar *var1, const NumericVar *var2);
+static void mod_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void div_mod_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *quot, NumericVar *rem);
+static void ceil_var(const NumericVar *var, NumericVar *result);
+static void floor_var(const NumericVar *var, NumericVar *result);
+
+static void gcd_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void sqrt_var(const NumericVar *arg, NumericVar *result, int rscale);
+static void exp_var(const NumericVar *arg, NumericVar *result, int rscale);
+static int estimate_ln_dweight(const NumericVar *var);
+static void ln_var(const NumericVar *arg, NumericVar *result, int rscale);
+static void log_var(const NumericVar *base, const NumericVar *num,
+ NumericVar *result);
+static void power_var(const NumericVar *base, const NumericVar *exp,
+ NumericVar *result);
+static void power_var_int(const NumericVar *base, int exp, NumericVar *result,
+ int rscale);
+static void power_ten_int(int exp, NumericVar *result);
+
+static int cmp_abs(const NumericVar *var1, const NumericVar *var2);
+static int cmp_abs_common(const NumericDigit *var1digits, int var1ndigits,
+ int var1weight,
+ const NumericDigit *var2digits, int var2ndigits,
+ int var2weight);
+static void add_abs(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void sub_abs(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result);
+static void round_var(NumericVar *var, int rscale);
+static void trunc_var(NumericVar *var, int rscale);
+static void strip_var(NumericVar *var);
+static void compute_bucket(Numeric operand, Numeric bound1, Numeric bound2,
+ const NumericVar *count_var, bool reversed_bounds,
+ NumericVar *result_var);
+
+static void accum_sum_add(NumericSumAccum *accum, const NumericVar *var1);
+static void accum_sum_rescale(NumericSumAccum *accum, const NumericVar *val);
+static void accum_sum_carry(NumericSumAccum *accum);
+static void accum_sum_reset(NumericSumAccum *accum);
+static void accum_sum_final(NumericSumAccum *accum, NumericVar *result);
+static void accum_sum_copy(NumericSumAccum *dst, NumericSumAccum *src);
+static void accum_sum_combine(NumericSumAccum *accum, NumericSumAccum *accum2);
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Input-, output- and rounding-functions
+ *
+ * ----------------------------------------------------------------------
+ */
+
+
+/*
+ * numeric_in() -
+ *
+ * Input function for numeric data type
+ */
+Datum
+numeric_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ Numeric res;
+ const char *cp;
+
+ /* Skip leading spaces */
+ cp = str;
+ while (*cp)
+ {
+ if (!isspace((unsigned char) *cp))
+ break;
+ cp++;
+ }
+
+ /*
+ * Check for NaN and infinities. We recognize the same strings allowed by
+ * float8in().
+ */
+ if (pg_strncasecmp(cp, "NaN", 3) == 0)
+ {
+ res = make_result(&const_nan);
+ cp += 3;
+ }
+ else if (pg_strncasecmp(cp, "Infinity", 8) == 0)
+ {
+ res = make_result(&const_pinf);
+ cp += 8;
+ }
+ else if (pg_strncasecmp(cp, "+Infinity", 9) == 0)
+ {
+ res = make_result(&const_pinf);
+ cp += 9;
+ }
+ else if (pg_strncasecmp(cp, "-Infinity", 9) == 0)
+ {
+ res = make_result(&const_ninf);
+ cp += 9;
+ }
+ else if (pg_strncasecmp(cp, "inf", 3) == 0)
+ {
+ res = make_result(&const_pinf);
+ cp += 3;
+ }
+ else if (pg_strncasecmp(cp, "+inf", 4) == 0)
+ {
+ res = make_result(&const_pinf);
+ cp += 4;
+ }
+ else if (pg_strncasecmp(cp, "-inf", 4) == 0)
+ {
+ res = make_result(&const_ninf);
+ cp += 4;
+ }
+ else
+ {
+ /*
+ * Use set_var_from_str() to parse a normal numeric value
+ */
+ NumericVar value;
+
+ init_var(&value);
+
+ cp = set_var_from_str(str, cp, &value);
+
+ /*
+ * We duplicate a few lines of code here because we would like to
+ * throw any trailing-junk syntax error before any semantic error
+ * resulting from apply_typmod. We can't easily fold the two cases
+ * together because we mustn't apply apply_typmod to a NaN/Inf.
+ */
+ while (*cp)
+ {
+ if (!isspace((unsigned char) *cp))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric", str)));
+ cp++;
+ }
+
+ apply_typmod(&value, typmod);
+
+ res = make_result(&value);
+ free_var(&value);
+
+ PG_RETURN_NUMERIC(res);
+ }
+
+ /* Should be nothing left but spaces */
+ while (*cp)
+ {
+ if (!isspace((unsigned char) *cp))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric", str)));
+ cp++;
+ }
+
+ /* As above, throw any typmod error after finishing syntax check */
+ apply_typmod_special(res, typmod);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_out() -
+ *
+ * Output function for numeric data type
+ */
+Datum
+numeric_out(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar x;
+ char *str;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ PG_RETURN_CSTRING(pstrdup("Infinity"));
+ else if (NUMERIC_IS_NINF(num))
+ PG_RETURN_CSTRING(pstrdup("-Infinity"));
+ else
+ PG_RETURN_CSTRING(pstrdup("NaN"));
+ }
+
+ /*
+ * Get the number in the variable format.
+ */
+ init_var_from_num(num, &x);
+
+ str = get_str_from_var(&x);
+
+ PG_RETURN_CSTRING(str);
+}
+
+/*
+ * numeric_is_nan() -
+ *
+ * Is Numeric value a NaN?
+ */
+bool
+numeric_is_nan(Numeric num)
+{
+ return NUMERIC_IS_NAN(num);
+}
+
+/*
+ * numeric_is_inf() -
+ *
+ * Is Numeric value an infinity?
+ */
+bool
+numeric_is_inf(Numeric num)
+{
+ return NUMERIC_IS_INF(num);
+}
+
+/*
+ * numeric_is_integral() -
+ *
+ * Is Numeric value integral?
+ */
+static bool
+numeric_is_integral(Numeric num)
+{
+ NumericVar arg;
+
+ /* Reject NaN, but infinities are considered integral */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_NAN(num))
+ return false;
+ return true;
+ }
+
+ /* Integral if there are no digits to the right of the decimal point */
+ init_var_from_num(num, &arg);
+
+ return (arg.ndigits == 0 || arg.ndigits <= arg.weight + 1);
+}
+
+/*
+ * make_numeric_typmod() -
+ *
+ * Pack numeric precision and scale values into a typmod. The upper 16 bits
+ * are used for the precision (though actually not all these bits are needed,
+ * since the maximum allowed precision is 1000). The lower 16 bits are for
+ * the scale, but since the scale is constrained to the range [-1000, 1000],
+ * we use just the lower 11 of those 16 bits, and leave the remaining 5 bits
+ * unset, for possible future use.
+ *
+ * For purely historical reasons VARHDRSZ is then added to the result, thus
+ * the unused space in the upper 16 bits is not all as freely available as it
+ * might seem. (We can't let the result overflow to a negative int32, as
+ * other parts of the system would interpret that as not-a-valid-typmod.)
+ */
+static inline int32
+make_numeric_typmod(int precision, int scale)
+{
+ return ((precision << 16) | (scale & 0x7ff)) + VARHDRSZ;
+}
+
+/*
+ * Because of the offset, valid numeric typmods are at least VARHDRSZ
+ */
+static inline bool
+is_valid_numeric_typmod(int32 typmod)
+{
+ return typmod >= (int32) VARHDRSZ;
+}
+
+/*
+ * numeric_typmod_precision() -
+ *
+ * Extract the precision from a numeric typmod --- see make_numeric_typmod().
+ */
+static inline int
+numeric_typmod_precision(int32 typmod)
+{
+ return ((typmod - VARHDRSZ) >> 16) & 0xffff;
+}
+
+/*
+ * numeric_typmod_scale() -
+ *
+ * Extract the scale from a numeric typmod --- see make_numeric_typmod().
+ *
+ * Note that the scale may be negative, so we must do sign extension when
+ * unpacking it. We do this using the bit hack (x^1024)-1024, which sign
+ * extends an 11-bit two's complement number x.
+ */
+static inline int
+numeric_typmod_scale(int32 typmod)
+{
+ return (((typmod - VARHDRSZ) & 0x7ff) ^ 1024) - 1024;
+}
+
+/*
+ * numeric_maximum_size() -
+ *
+ * Maximum size of a numeric with given typmod, or -1 if unlimited/unknown.
+ */
+int32
+numeric_maximum_size(int32 typmod)
+{
+ int precision;
+ int numeric_digits;
+
+ if (!is_valid_numeric_typmod(typmod))
+ return -1;
+
+ /* precision (ie, max # of digits) is in upper bits of typmod */
+ precision = numeric_typmod_precision(typmod);
+
+ /*
+ * This formula computes the maximum number of NumericDigits we could need
+ * in order to store the specified number of decimal digits. Because the
+ * weight is stored as a number of NumericDigits rather than a number of
+ * decimal digits, it's possible that the first NumericDigit will contain
+ * only a single decimal digit. Thus, the first two decimal digits can
+ * require two NumericDigits to store, but it isn't until we reach
+ * DEC_DIGITS + 2 decimal digits that we potentially need a third
+ * NumericDigit.
+ */
+ numeric_digits = (precision + 2 * (DEC_DIGITS - 1)) / DEC_DIGITS;
+
+ /*
+ * In most cases, the size of a numeric will be smaller than the value
+ * computed below, because the varlena header will typically get toasted
+ * down to a single byte before being stored on disk, and it may also be
+ * possible to use a short numeric header. But our job here is to compute
+ * the worst case.
+ */
+ return NUMERIC_HDRSZ + (numeric_digits * sizeof(NumericDigit));
+}
+
+/*
+ * numeric_out_sci() -
+ *
+ * Output function for numeric data type in scientific notation.
+ */
+char *
+numeric_out_sci(Numeric num, int scale)
+{
+ NumericVar x;
+ char *str;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ return pstrdup("Infinity");
+ else if (NUMERIC_IS_NINF(num))
+ return pstrdup("-Infinity");
+ else
+ return pstrdup("NaN");
+ }
+
+ init_var_from_num(num, &x);
+
+ str = get_str_from_var_sci(&x, scale);
+
+ return str;
+}
+
+/*
+ * numeric_normalize() -
+ *
+ * Output function for numeric data type, suppressing insignificant trailing
+ * zeroes and then any trailing decimal point. The intent of this is to
+ * produce strings that are equal if and only if the input numeric values
+ * compare equal.
+ */
+char *
+numeric_normalize(Numeric num)
+{
+ NumericVar x;
+ char *str;
+ int last;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ return pstrdup("Infinity");
+ else if (NUMERIC_IS_NINF(num))
+ return pstrdup("-Infinity");
+ else
+ return pstrdup("NaN");
+ }
+
+ init_var_from_num(num, &x);
+
+ str = get_str_from_var(&x);
+
+ /* If there's no decimal point, there's certainly nothing to remove. */
+ if (strchr(str, '.') != NULL)
+ {
+ /*
+ * Back up over trailing fractional zeroes. Since there is a decimal
+ * point, this loop will terminate safely.
+ */
+ last = strlen(str) - 1;
+ while (str[last] == '0')
+ last--;
+
+ /* We want to get rid of the decimal point too, if it's now last. */
+ if (str[last] == '.')
+ last--;
+
+ /* Delete whatever we backed up over. */
+ str[last + 1] = '\0';
+ }
+
+ return str;
+}
+
+/*
+ * numeric_recv - converts external binary format to numeric
+ *
+ * External format is a sequence of int16's:
+ * ndigits, weight, sign, dscale, NumericDigits.
+ */
+Datum
+numeric_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ NumericVar value;
+ Numeric res;
+ int len,
+ i;
+
+ init_var(&value);
+
+ len = (uint16) pq_getmsgint(buf, sizeof(uint16));
+
+ alloc_var(&value, len);
+
+ value.weight = (int16) pq_getmsgint(buf, sizeof(int16));
+ /* we allow any int16 for weight --- OK? */
+
+ value.sign = (uint16) pq_getmsgint(buf, sizeof(uint16));
+ if (!(value.sign == NUMERIC_POS ||
+ value.sign == NUMERIC_NEG ||
+ value.sign == NUMERIC_NAN ||
+ value.sign == NUMERIC_PINF ||
+ value.sign == NUMERIC_NINF))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid sign in external \"numeric\" value")));
+
+ value.dscale = (uint16) pq_getmsgint(buf, sizeof(uint16));
+ if ((value.dscale & NUMERIC_DSCALE_MASK) != value.dscale)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid scale in external \"numeric\" value")));
+
+ for (i = 0; i < len; i++)
+ {
+ NumericDigit d = pq_getmsgint(buf, sizeof(NumericDigit));
+
+ if (d < 0 || d >= NBASE)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid digit in external \"numeric\" value")));
+ value.digits[i] = d;
+ }
+
+ /*
+ * If the given dscale would hide any digits, truncate those digits away.
+ * We could alternatively throw an error, but that would take a bunch of
+ * extra code (about as much as trunc_var involves), and it might cause
+ * client compatibility issues. Be careful not to apply trunc_var to
+ * special values, as it could do the wrong thing; we don't need it
+ * anyway, since make_result will ignore all but the sign field.
+ *
+ * After doing that, be sure to check the typmod restriction.
+ */
+ if (value.sign == NUMERIC_POS ||
+ value.sign == NUMERIC_NEG)
+ {
+ trunc_var(&value, value.dscale);
+
+ apply_typmod(&value, typmod);
+
+ res = make_result(&value);
+ }
+ else
+ {
+ /* apply_typmod_special wants us to make the Numeric first */
+ res = make_result(&value);
+
+ apply_typmod_special(res, typmod);
+ }
+
+ free_var(&value);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+/*
+ * numeric_send - converts numeric to binary format
+ */
+Datum
+numeric_send(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar x;
+ StringInfoData buf;
+ int i;
+
+ init_var_from_num(num, &x);
+
+ pq_begintypsend(&buf);
+
+ pq_sendint16(&buf, x.ndigits);
+ pq_sendint16(&buf, x.weight);
+ pq_sendint16(&buf, x.sign);
+ pq_sendint16(&buf, x.dscale);
+ for (i = 0; i < x.ndigits; i++)
+ pq_sendint16(&buf, x.digits[i]);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * numeric_support()
+ *
+ * Planner support function for the numeric() length coercion function.
+ *
+ * Flatten calls that solely represent increases in allowable precision.
+ * Scale changes mutate every datum, so they are unoptimizable. Some values,
+ * e.g. 1E-1001, can only fit into an unconstrained numeric, so a change from
+ * an unconstrained numeric to any constrained numeric is also unoptimizable.
+ */
+Datum
+numeric_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+ FuncExpr *expr = req->fcall;
+ Node *typmod;
+
+ Assert(list_length(expr->args) >= 2);
+
+ typmod = (Node *) lsecond(expr->args);
+
+ if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
+ {
+ Node *source = (Node *) linitial(expr->args);
+ int32 old_typmod = exprTypmod(source);
+ int32 new_typmod = DatumGetInt32(((Const *) typmod)->constvalue);
+ int32 old_scale = numeric_typmod_scale(old_typmod);
+ int32 new_scale = numeric_typmod_scale(new_typmod);
+ int32 old_precision = numeric_typmod_precision(old_typmod);
+ int32 new_precision = numeric_typmod_precision(new_typmod);
+
+ /*
+ * If new_typmod is invalid, the destination is unconstrained;
+ * that's always OK. If old_typmod is valid, the source is
+ * constrained, and we're OK if the scale is unchanged and the
+ * precision is not decreasing. See further notes in function
+ * header comment.
+ */
+ if (!is_valid_numeric_typmod(new_typmod) ||
+ (is_valid_numeric_typmod(old_typmod) &&
+ new_scale == old_scale && new_precision >= old_precision))
+ ret = relabel_to_typmod(source, new_typmod);
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/*
+ * numeric() -
+ *
+ * This is a special function called by the Postgres database system
+ * before a value is stored in a tuple's attribute. The precision and
+ * scale of the attribute have to be applied on the value.
+ */
+Datum
+numeric (PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ Numeric new;
+ int precision;
+ int scale;
+ int ddigits;
+ int maxdigits;
+ int dscale;
+ NumericVar var;
+
+ /*
+ * Handle NaN and infinities: if apply_typmod_special doesn't complain,
+ * just return a copy of the input.
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ apply_typmod_special(num, typmod);
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+ }
+
+ /*
+ * If the value isn't a valid type modifier, simply return a copy of the
+ * input value
+ */
+ if (!is_valid_numeric_typmod(typmod))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ /*
+ * Get the precision and scale out of the typmod value
+ */
+ precision = numeric_typmod_precision(typmod);
+ scale = numeric_typmod_scale(typmod);
+ maxdigits = precision - scale;
+
+ /* The target display scale is non-negative */
+ dscale = Max(scale, 0);
+
+ /*
+ * If the number is certainly in bounds and due to the target scale no
+ * rounding could be necessary, just make a copy of the input and modify
+ * its scale fields, unless the larger scale forces us to abandon the
+ * short representation. (Note we assume the existing dscale is
+ * honest...)
+ */
+ ddigits = (NUMERIC_WEIGHT(num) + 1) * DEC_DIGITS;
+ if (ddigits <= maxdigits && scale >= NUMERIC_DSCALE(num)
+ && (NUMERIC_CAN_BE_SHORT(dscale, NUMERIC_WEIGHT(num))
+ || !NUMERIC_IS_SHORT(num)))
+ {
+ new = duplicate_numeric(num);
+ if (NUMERIC_IS_SHORT(num))
+ new->choice.n_short.n_header =
+ (num->choice.n_short.n_header & ~NUMERIC_SHORT_DSCALE_MASK)
+ | (dscale << NUMERIC_SHORT_DSCALE_SHIFT);
+ else
+ new->choice.n_long.n_sign_dscale = NUMERIC_SIGN(new) |
+ ((uint16) dscale & NUMERIC_DSCALE_MASK);
+ PG_RETURN_NUMERIC(new);
+ }
+
+ /*
+ * We really need to fiddle with things - unpack the number into a
+ * variable and let apply_typmod() do it.
+ */
+ init_var(&var);
+
+ set_var_from_num(num, &var);
+ apply_typmod(&var, typmod);
+ new = make_result(&var);
+
+ free_var(&var);
+
+ PG_RETURN_NUMERIC(new);
+}
+
+Datum
+numerictypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+ int32 *tl;
+ int n;
+ int32 typmod;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ if (n == 2)
+ {
+ if (tl[0] < 1 || tl[0] > NUMERIC_MAX_PRECISION)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("NUMERIC precision %d must be between 1 and %d",
+ tl[0], NUMERIC_MAX_PRECISION)));
+ if (tl[1] < NUMERIC_MIN_SCALE || tl[1] > NUMERIC_MAX_SCALE)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("NUMERIC scale %d must be between %d and %d",
+ tl[1], NUMERIC_MIN_SCALE, NUMERIC_MAX_SCALE)));
+ typmod = make_numeric_typmod(tl[0], tl[1]);
+ }
+ else if (n == 1)
+ {
+ if (tl[0] < 1 || tl[0] > NUMERIC_MAX_PRECISION)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("NUMERIC precision %d must be between 1 and %d",
+ tl[0], NUMERIC_MAX_PRECISION)));
+ /* scale defaults to zero */
+ typmod = make_numeric_typmod(tl[0], 0);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid NUMERIC type modifier")));
+ typmod = 0; /* keep compiler quiet */
+ }
+
+ PG_RETURN_INT32(typmod);
+}
+
+Datum
+numerictypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+ char *res = (char *) palloc(64);
+
+ if (is_valid_numeric_typmod(typmod))
+ snprintf(res, 64, "(%d,%d)",
+ numeric_typmod_precision(typmod),
+ numeric_typmod_scale(typmod));
+ else
+ *res = '\0';
+
+ PG_RETURN_CSTRING(res);
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Sign manipulation, rounding and the like
+ *
+ * ----------------------------------------------------------------------
+ */
+
+Datum
+numeric_abs(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+
+ /*
+ * Do it the easy way directly on the packed format
+ */
+ res = duplicate_numeric(num);
+
+ if (NUMERIC_IS_SHORT(num))
+ res->choice.n_short.n_header =
+ num->choice.n_short.n_header & ~NUMERIC_SHORT_SIGN_MASK;
+ else if (NUMERIC_IS_SPECIAL(num))
+ {
+ /* This changes -Inf to Inf, and doesn't affect NaN */
+ res->choice.n_short.n_header =
+ num->choice.n_short.n_header & ~NUMERIC_INF_SIGN_MASK;
+ }
+ else
+ res->choice.n_long.n_sign_dscale = NUMERIC_POS | NUMERIC_DSCALE(num);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+Datum
+numeric_uminus(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+
+ /*
+ * Do it the easy way directly on the packed format
+ */
+ res = duplicate_numeric(num);
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ /* Flip the sign, if it's Inf or -Inf */
+ if (!NUMERIC_IS_NAN(num))
+ res->choice.n_short.n_header =
+ num->choice.n_short.n_header ^ NUMERIC_INF_SIGN_MASK;
+ }
+
+ /*
+ * The packed format is known to be totally zero digit trimmed always. So
+ * once we've eliminated specials, we can identify a zero by the fact that
+ * there are no digits at all. Do nothing to a zero.
+ */
+ else if (NUMERIC_NDIGITS(num) != 0)
+ {
+ /* Else, flip the sign */
+ if (NUMERIC_IS_SHORT(num))
+ res->choice.n_short.n_header =
+ num->choice.n_short.n_header ^ NUMERIC_SHORT_SIGN_MASK;
+ else if (NUMERIC_SIGN(num) == NUMERIC_POS)
+ res->choice.n_long.n_sign_dscale =
+ NUMERIC_NEG | NUMERIC_DSCALE(num);
+ else
+ res->choice.n_long.n_sign_dscale =
+ NUMERIC_POS | NUMERIC_DSCALE(num);
+ }
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+Datum
+numeric_uplus(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+}
+
+
+/*
+ * numeric_sign_internal() -
+ *
+ * Returns -1 if the argument is less than 0, 0 if the argument is equal
+ * to 0, and 1 if the argument is greater than zero. Caller must have
+ * taken care of the NaN case, but we can handle infinities here.
+ */
+static int
+numeric_sign_internal(Numeric num)
+{
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ Assert(!NUMERIC_IS_NAN(num));
+ /* Must be Inf or -Inf */
+ if (NUMERIC_IS_PINF(num))
+ return 1;
+ else
+ return -1;
+ }
+
+ /*
+ * The packed format is known to be totally zero digit trimmed always. So
+ * once we've eliminated specials, we can identify a zero by the fact that
+ * there are no digits at all.
+ */
+ else if (NUMERIC_NDIGITS(num) == 0)
+ return 0;
+ else if (NUMERIC_SIGN(num) == NUMERIC_NEG)
+ return -1;
+ else
+ return 1;
+}
+
+/*
+ * numeric_sign() -
+ *
+ * returns -1 if the argument is less than 0, 0 if the argument is equal
+ * to 0, and 1 if the argument is greater than zero.
+ */
+Datum
+numeric_sign(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+
+ /*
+ * Handle NaN (infinities can be handled normally)
+ */
+ if (NUMERIC_IS_NAN(num))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ switch (numeric_sign_internal(num))
+ {
+ case 0:
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ case 1:
+ PG_RETURN_NUMERIC(make_result(&const_one));
+ case -1:
+ PG_RETURN_NUMERIC(make_result(&const_minus_one));
+ }
+
+ Assert(false);
+ return (Datum) 0;
+}
+
+
+/*
+ * numeric_round() -
+ *
+ * Round a value to have 'scale' digits after the decimal point.
+ * We allow negative 'scale', implying rounding before the decimal
+ * point --- Oracle interprets rounding that way.
+ */
+Datum
+numeric_round(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ int32 scale = PG_GETARG_INT32(1);
+ Numeric res;
+ NumericVar arg;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ /*
+ * Limit the scale value to avoid possible overflow in calculations
+ */
+ scale = Max(scale, -NUMERIC_MAX_RESULT_SCALE);
+ scale = Min(scale, NUMERIC_MAX_RESULT_SCALE);
+
+ /*
+ * Unpack the argument and round it at the proper digit position
+ */
+ init_var(&arg);
+ set_var_from_num(num, &arg);
+
+ round_var(&arg, scale);
+
+ /* We don't allow negative output dscale */
+ if (scale < 0)
+ arg.dscale = 0;
+
+ /*
+ * Return the rounded result
+ */
+ res = make_result(&arg);
+
+ free_var(&arg);
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_trunc() -
+ *
+ * Truncate a value to have 'scale' digits after the decimal point.
+ * We allow negative 'scale', implying a truncation before the decimal
+ * point --- Oracle interprets truncation that way.
+ */
+Datum
+numeric_trunc(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ int32 scale = PG_GETARG_INT32(1);
+ Numeric res;
+ NumericVar arg;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ /*
+ * Limit the scale value to avoid possible overflow in calculations
+ */
+ scale = Max(scale, -NUMERIC_MAX_RESULT_SCALE);
+ scale = Min(scale, NUMERIC_MAX_RESULT_SCALE);
+
+ /*
+ * Unpack the argument and truncate it at the proper digit position
+ */
+ init_var(&arg);
+ set_var_from_num(num, &arg);
+
+ trunc_var(&arg, scale);
+
+ /* We don't allow negative output dscale */
+ if (scale < 0)
+ arg.dscale = 0;
+
+ /*
+ * Return the truncated result
+ */
+ res = make_result(&arg);
+
+ free_var(&arg);
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_ceil() -
+ *
+ * Return the smallest integer greater than or equal to the argument
+ */
+Datum
+numeric_ceil(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar result;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ init_var_from_num(num, &result);
+ ceil_var(&result, &result);
+
+ res = make_result(&result);
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_floor() -
+ *
+ * Return the largest integer equal to or less than the argument
+ */
+Datum
+numeric_floor(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar result;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ init_var_from_num(num, &result);
+ floor_var(&result, &result);
+
+ res = make_result(&result);
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * generate_series_numeric() -
+ *
+ * Generate series of numeric.
+ */
+Datum
+generate_series_numeric(PG_FUNCTION_ARGS)
+{
+ return generate_series_step_numeric(fcinfo);
+}
+
+Datum
+generate_series_step_numeric(PG_FUNCTION_ARGS)
+{
+ generate_series_numeric_fctx *fctx;
+ FuncCallContext *funcctx;
+ MemoryContext oldcontext;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ Numeric start_num = PG_GETARG_NUMERIC(0);
+ Numeric stop_num = PG_GETARG_NUMERIC(1);
+ NumericVar steploc = const_one;
+
+ /* Reject NaN and infinities in start and stop values */
+ if (NUMERIC_IS_SPECIAL(start_num))
+ {
+ if (NUMERIC_IS_NAN(start_num))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("start value cannot be NaN")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("start value cannot be infinity")));
+ }
+ if (NUMERIC_IS_SPECIAL(stop_num))
+ {
+ if (NUMERIC_IS_NAN(stop_num))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("stop value cannot be NaN")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("stop value cannot be infinity")));
+ }
+
+ /* see if we were given an explicit step size */
+ if (PG_NARGS() == 3)
+ {
+ Numeric step_num = PG_GETARG_NUMERIC(2);
+
+ if (NUMERIC_IS_SPECIAL(step_num))
+ {
+ if (NUMERIC_IS_NAN(step_num))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot be NaN")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot be infinity")));
+ }
+
+ init_var_from_num(step_num, &steploc);
+
+ if (cmp_var(&steploc, &const_zero) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot equal zero")));
+ }
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * Switch to memory context appropriate for multiple function calls.
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ fctx = (generate_series_numeric_fctx *)
+ palloc(sizeof(generate_series_numeric_fctx));
+
+ /*
+ * Use fctx to keep state from call to call. Seed current with the
+ * original start value. We must copy the start_num and stop_num
+ * values rather than pointing to them, since we may have detoasted
+ * them in the per-call context.
+ */
+ init_var(&fctx->current);
+ init_var(&fctx->stop);
+ init_var(&fctx->step);
+
+ set_var_from_num(start_num, &fctx->current);
+ set_var_from_num(stop_num, &fctx->stop);
+ set_var_from_var(&steploc, &fctx->step);
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ /*
+ * Get the saved state and use current state as the result of this
+ * iteration.
+ */
+ fctx = funcctx->user_fctx;
+
+ if ((fctx->step.sign == NUMERIC_POS &&
+ cmp_var(&fctx->current, &fctx->stop) <= 0) ||
+ (fctx->step.sign == NUMERIC_NEG &&
+ cmp_var(&fctx->current, &fctx->stop) >= 0))
+ {
+ Numeric result = make_result(&fctx->current);
+
+ /* switch to memory context appropriate for iteration calculation */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* increment current in preparation for next iteration */
+ add_var(&fctx->current, &fctx->step, &fctx->current);
+ MemoryContextSwitchTo(oldcontext);
+
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, NumericGetDatum(result));
+ }
+ else
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/*
+ * Implements the numeric version of the width_bucket() function
+ * defined by SQL2003. See also width_bucket_float8().
+ *
+ * 'bound1' and 'bound2' are the lower and upper bounds of the
+ * histogram's range, respectively. 'count' is the number of buckets
+ * in the histogram. width_bucket() returns an integer indicating the
+ * bucket number that 'operand' belongs to in an equiwidth histogram
+ * with the specified characteristics. An operand smaller than the
+ * lower bound is assigned to bucket 0. An operand greater than the
+ * upper bound is assigned to an additional bucket (with number
+ * count+1). We don't allow "NaN" for any of the numeric arguments.
+ */
+Datum
+width_bucket_numeric(PG_FUNCTION_ARGS)
+{
+ Numeric operand = PG_GETARG_NUMERIC(0);
+ Numeric bound1 = PG_GETARG_NUMERIC(1);
+ Numeric bound2 = PG_GETARG_NUMERIC(2);
+ int32 count = PG_GETARG_INT32(3);
+ NumericVar count_var;
+ NumericVar result_var;
+ int32 result;
+
+ if (count <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("count must be greater than zero")));
+
+ if (NUMERIC_IS_SPECIAL(operand) ||
+ NUMERIC_IS_SPECIAL(bound1) ||
+ NUMERIC_IS_SPECIAL(bound2))
+ {
+ if (NUMERIC_IS_NAN(operand) ||
+ NUMERIC_IS_NAN(bound1) ||
+ NUMERIC_IS_NAN(bound2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("operand, lower bound, and upper bound cannot be NaN")));
+ /* We allow "operand" to be infinite; cmp_numerics will cope */
+ if (NUMERIC_IS_INF(bound1) || NUMERIC_IS_INF(bound2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("lower and upper bounds must be finite")));
+ }
+
+ init_var(&result_var);
+ init_var(&count_var);
+
+ /* Convert 'count' to a numeric, for ease of use later */
+ int64_to_numericvar((int64) count, &count_var);
+
+ switch (cmp_numerics(bound1, bound2))
+ {
+ case 0:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION),
+ errmsg("lower bound cannot equal upper bound")));
+ break;
+
+ /* bound1 < bound2 */
+ case -1:
+ if (cmp_numerics(operand, bound1) < 0)
+ set_var_from_var(&const_zero, &result_var);
+ else if (cmp_numerics(operand, bound2) >= 0)
+ add_var(&count_var, &const_one, &result_var);
+ else
+ compute_bucket(operand, bound1, bound2, &count_var, false,
+ &result_var);
+ break;
+
+ /* bound1 > bound2 */
+ case 1:
+ if (cmp_numerics(operand, bound1) > 0)
+ set_var_from_var(&const_zero, &result_var);
+ else if (cmp_numerics(operand, bound2) <= 0)
+ add_var(&count_var, &const_one, &result_var);
+ else
+ compute_bucket(operand, bound1, bound2, &count_var, true,
+ &result_var);
+ break;
+ }
+
+ /* if result exceeds the range of a legal int4, we ereport here */
+ if (!numericvar_to_int32(&result_var, &result))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ free_var(&count_var);
+ free_var(&result_var);
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * If 'operand' is not outside the bucket range, determine the correct
+ * bucket for it to go. The calculations performed by this function
+ * are derived directly from the SQL2003 spec. Note however that we
+ * multiply by count before dividing, to avoid unnecessary roundoff error.
+ */
+static void
+compute_bucket(Numeric operand, Numeric bound1, Numeric bound2,
+ const NumericVar *count_var, bool reversed_bounds,
+ NumericVar *result_var)
+{
+ NumericVar bound1_var;
+ NumericVar bound2_var;
+ NumericVar operand_var;
+
+ init_var_from_num(bound1, &bound1_var);
+ init_var_from_num(bound2, &bound2_var);
+ init_var_from_num(operand, &operand_var);
+
+ if (!reversed_bounds)
+ {
+ sub_var(&operand_var, &bound1_var, &operand_var);
+ sub_var(&bound2_var, &bound1_var, &bound2_var);
+ }
+ else
+ {
+ sub_var(&bound1_var, &operand_var, &operand_var);
+ sub_var(&bound1_var, &bound2_var, &bound2_var);
+ }
+
+ mul_var(&operand_var, count_var, &operand_var,
+ operand_var.dscale + count_var->dscale);
+ div_var(&operand_var, &bound2_var, result_var,
+ select_div_scale(&operand_var, &bound2_var), true);
+ add_var(result_var, &const_one, result_var);
+ floor_var(result_var, result_var);
+
+ free_var(&bound1_var);
+ free_var(&bound2_var);
+ free_var(&operand_var);
+}
+
+/* ----------------------------------------------------------------------
+ *
+ * Comparison functions
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ *
+ * Sort support:
+ *
+ * We implement the sortsupport strategy routine in order to get the benefit of
+ * abbreviation. The ordinary numeric comparison can be quite slow as a result
+ * of palloc/pfree cycles (due to detoasting packed values for alignment);
+ * while this could be worked on itself, the abbreviation strategy gives more
+ * speedup in many common cases.
+ *
+ * Two different representations are used for the abbreviated form, one in
+ * int32 and one in int64, whichever fits into a by-value Datum. In both cases
+ * the representation is negated relative to the original value, because we use
+ * the largest negative value for NaN, which sorts higher than other values. We
+ * convert the absolute value of the numeric to a 31-bit or 63-bit positive
+ * value, and then negate it if the original number was positive.
+ *
+ * We abort the abbreviation process if the abbreviation cardinality is below
+ * 0.01% of the row count (1 per 10k non-null rows). The actual break-even
+ * point is somewhat below that, perhaps 1 per 30k (at 1 per 100k there's a
+ * very small penalty), but we don't want to build up too many abbreviated
+ * values before first testing for abort, so we take the slightly pessimistic
+ * number. We make no attempt to estimate the cardinality of the real values,
+ * since it plays no part in the cost model here (if the abbreviation is equal,
+ * the cost of comparing equal and unequal underlying values is comparable).
+ * We discontinue even checking for abort (saving us the hashing overhead) if
+ * the estimated cardinality gets to 100k; that would be enough to support many
+ * billions of rows while doing no worse than breaking even.
+ *
+ * ----------------------------------------------------------------------
+ */
+
+/*
+ * Sort support strategy routine.
+ */
+Datum
+numeric_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = numeric_fast_cmp;
+
+ if (ssup->abbreviate)
+ {
+ NumericSortSupport *nss;
+ MemoryContext oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ nss = palloc(sizeof(NumericSortSupport));
+
+ /*
+ * palloc a buffer for handling unaligned packed values in addition to
+ * the support struct
+ */
+ nss->buf = palloc(VARATT_SHORT_MAX + VARHDRSZ + 1);
+
+ nss->input_count = 0;
+ nss->estimating = true;
+ initHyperLogLog(&nss->abbr_card, 10);
+
+ ssup->ssup_extra = nss;
+
+ ssup->abbrev_full_comparator = ssup->comparator;
+ ssup->comparator = numeric_cmp_abbrev;
+ ssup->abbrev_converter = numeric_abbrev_convert;
+ ssup->abbrev_abort = numeric_abbrev_abort;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * Abbreviate a numeric datum, handling NaNs and detoasting
+ * (must not leak memory!)
+ */
+static Datum
+numeric_abbrev_convert(Datum original_datum, SortSupport ssup)
+{
+ NumericSortSupport *nss = ssup->ssup_extra;
+ void *original_varatt = PG_DETOAST_DATUM_PACKED(original_datum);
+ Numeric value;
+ Datum result;
+
+ nss->input_count += 1;
+
+ /*
+ * This is to handle packed datums without needing a palloc/pfree cycle;
+ * we keep and reuse a buffer large enough to handle any short datum.
+ */
+ if (VARATT_IS_SHORT(original_varatt))
+ {
+ void *buf = nss->buf;
+ Size sz = VARSIZE_SHORT(original_varatt) - VARHDRSZ_SHORT;
+
+ Assert(sz <= VARATT_SHORT_MAX - VARHDRSZ_SHORT);
+
+ SET_VARSIZE(buf, VARHDRSZ + sz);
+ memcpy(VARDATA(buf), VARDATA_SHORT(original_varatt), sz);
+
+ value = (Numeric) buf;
+ }
+ else
+ value = (Numeric) original_varatt;
+
+ if (NUMERIC_IS_SPECIAL(value))
+ {
+ if (NUMERIC_IS_PINF(value))
+ result = NUMERIC_ABBREV_PINF;
+ else if (NUMERIC_IS_NINF(value))
+ result = NUMERIC_ABBREV_NINF;
+ else
+ result = NUMERIC_ABBREV_NAN;
+ }
+ else
+ {
+ NumericVar var;
+
+ init_var_from_num(value, &var);
+
+ result = numeric_abbrev_convert_var(&var, nss);
+ }
+
+ /* should happen only for external/compressed toasts */
+ if ((Pointer) original_varatt != DatumGetPointer(original_datum))
+ pfree(original_varatt);
+
+ return result;
+}
+
+/*
+ * Consider whether to abort abbreviation.
+ *
+ * We pay no attention to the cardinality of the non-abbreviated data. There is
+ * no reason to do so: unlike text, we have no fast check for equal values, so
+ * we pay the full overhead whenever the abbreviations are equal regardless of
+ * whether the underlying values are also equal.
+ */
+static bool
+numeric_abbrev_abort(int memtupcount, SortSupport ssup)
+{
+ NumericSortSupport *nss = ssup->ssup_extra;
+ double abbr_card;
+
+ if (memtupcount < 10000 || nss->input_count < 10000 || !nss->estimating)
+ return false;
+
+ abbr_card = estimateHyperLogLog(&nss->abbr_card);
+
+ /*
+ * If we have >100k distinct values, then even if we were sorting many
+ * billion rows we'd likely still break even, and the penalty of undoing
+ * that many rows of abbrevs would probably not be worth it. Stop even
+ * counting at that point.
+ */
+ if (abbr_card > 100000.0)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "numeric_abbrev: estimation ends at cardinality %f"
+ " after " INT64_FORMAT " values (%d rows)",
+ abbr_card, nss->input_count, memtupcount);
+#endif
+ nss->estimating = false;
+ return false;
+ }
+
+ /*
+ * Target minimum cardinality is 1 per ~10k of non-null inputs. (The
+ * break even point is somewhere between one per 100k rows, where
+ * abbreviation has a very slight penalty, and 1 per 10k where it wins by
+ * a measurable percentage.) We use the relatively pessimistic 10k
+ * threshold, and add a 0.5 row fudge factor, because it allows us to
+ * abort earlier on genuinely pathological data where we've had exactly
+ * one abbreviated value in the first 10k (non-null) rows.
+ */
+ if (abbr_card < nss->input_count / 10000.0 + 0.5)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "numeric_abbrev: aborting abbreviation at cardinality %f"
+ " below threshold %f after " INT64_FORMAT " values (%d rows)",
+ abbr_card, nss->input_count / 10000.0 + 0.5,
+ nss->input_count, memtupcount);
+#endif
+ return true;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "numeric_abbrev: cardinality %f"
+ " after " INT64_FORMAT " values (%d rows)",
+ abbr_card, nss->input_count, memtupcount);
+#endif
+
+ return false;
+}
+
+/*
+ * Non-fmgr interface to the comparison routine to allow sortsupport to elide
+ * the fmgr call. The saving here is small given how slow numeric comparisons
+ * are, but it is a required part of the sort support API when abbreviations
+ * are performed.
+ *
+ * Two palloc/pfree cycles could be saved here by using persistent buffers for
+ * aligning short-varlena inputs, but this has not so far been considered to
+ * be worth the effort.
+ */
+static int
+numeric_fast_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ Numeric nx = DatumGetNumeric(x);
+ Numeric ny = DatumGetNumeric(y);
+ int result;
+
+ result = cmp_numerics(nx, ny);
+
+ if ((Pointer) nx != DatumGetPointer(x))
+ pfree(nx);
+ if ((Pointer) ny != DatumGetPointer(y))
+ pfree(ny);
+
+ return result;
+}
+
+/*
+ * Compare abbreviations of values. (Abbreviations may be equal where the true
+ * values differ, but if the abbreviations differ, they must reflect the
+ * ordering of the true values.)
+ */
+static int
+numeric_cmp_abbrev(Datum x, Datum y, SortSupport ssup)
+{
+ /*
+ * NOTE WELL: this is intentionally backwards, because the abbreviation is
+ * negated relative to the original value, to handle NaN/infinity cases.
+ */
+ if (DatumGetNumericAbbrev(x) < DatumGetNumericAbbrev(y))
+ return 1;
+ if (DatumGetNumericAbbrev(x) > DatumGetNumericAbbrev(y))
+ return -1;
+ return 0;
+}
+
+/*
+ * Abbreviate a NumericVar according to the available bit size.
+ *
+ * The 31-bit value is constructed as:
+ *
+ * 0 + 7bits digit weight + 24 bits digit value
+ *
+ * where the digit weight is in single decimal digits, not digit words, and
+ * stored in excess-44 representation[1]. The 24-bit digit value is the 7 most
+ * significant decimal digits of the value converted to binary. Values whose
+ * weights would fall outside the representable range are rounded off to zero
+ * (which is also used to represent actual zeros) or to 0x7FFFFFFF (which
+ * otherwise cannot occur). Abbreviation therefore fails to gain any advantage
+ * where values are outside the range 10^-44 to 10^83, which is not considered
+ * to be a serious limitation, or when values are of the same magnitude and
+ * equal in the first 7 decimal digits, which is considered to be an
+ * unavoidable limitation given the available bits. (Stealing three more bits
+ * to compare another digit would narrow the range of representable weights by
+ * a factor of 8, which starts to look like a real limiting factor.)
+ *
+ * (The value 44 for the excess is essentially arbitrary)
+ *
+ * The 63-bit value is constructed as:
+ *
+ * 0 + 7bits weight + 4 x 14-bit packed digit words
+ *
+ * The weight in this case is again stored in excess-44, but this time it is
+ * the original weight in digit words (i.e. powers of 10000). The first four
+ * digit words of the value (if present; trailing zeros are assumed as needed)
+ * are packed into 14 bits each to form the rest of the value. Again,
+ * out-of-range values are rounded off to 0 or 0x7FFFFFFFFFFFFFFF. The
+ * representable range in this case is 10^-176 to 10^332, which is considered
+ * to be good enough for all practical purposes, and comparison of 4 words
+ * means that at least 13 decimal digits are compared, which is considered to
+ * be a reasonable compromise between effectiveness and efficiency in computing
+ * the abbreviation.
+ *
+ * (The value 44 for the excess is even more arbitrary here, it was chosen just
+ * to match the value used in the 31-bit case)
+ *
+ * [1] - Excess-k representation means that the value is offset by adding 'k'
+ * and then treated as unsigned, so the smallest representable value is stored
+ * with all bits zero. This allows simple comparisons to work on the composite
+ * value.
+ */
+
+#if NUMERIC_ABBREV_BITS == 64
+
+static Datum
+numeric_abbrev_convert_var(const NumericVar *var, NumericSortSupport *nss)
+{
+ int ndigits = var->ndigits;
+ int weight = var->weight;
+ int64 result;
+
+ if (ndigits == 0 || weight < -44)
+ {
+ result = 0;
+ }
+ else if (weight > 83)
+ {
+ result = PG_INT64_MAX;
+ }
+ else
+ {
+ result = ((int64) (weight + 44) << 56);
+
+ switch (ndigits)
+ {
+ default:
+ result |= ((int64) var->digits[3]);
+ /* FALLTHROUGH */
+ case 3:
+ result |= ((int64) var->digits[2]) << 14;
+ /* FALLTHROUGH */
+ case 2:
+ result |= ((int64) var->digits[1]) << 28;
+ /* FALLTHROUGH */
+ case 1:
+ result |= ((int64) var->digits[0]) << 42;
+ break;
+ }
+ }
+
+ /* the abbrev is negated relative to the original */
+ if (var->sign == NUMERIC_POS)
+ result = -result;
+
+ if (nss->estimating)
+ {
+ uint32 tmp = ((uint32) result
+ ^ (uint32) ((uint64) result >> 32));
+
+ addHyperLogLog(&nss->abbr_card, DatumGetUInt32(hash_uint32(tmp)));
+ }
+
+ return NumericAbbrevGetDatum(result);
+}
+
+#endif /* NUMERIC_ABBREV_BITS == 64 */
+
+#if NUMERIC_ABBREV_BITS == 32
+
+static Datum
+numeric_abbrev_convert_var(const NumericVar *var, NumericSortSupport *nss)
+{
+ int ndigits = var->ndigits;
+ int weight = var->weight;
+ int32 result;
+
+ if (ndigits == 0 || weight < -11)
+ {
+ result = 0;
+ }
+ else if (weight > 20)
+ {
+ result = PG_INT32_MAX;
+ }
+ else
+ {
+ NumericDigit nxt1 = (ndigits > 1) ? var->digits[1] : 0;
+
+ weight = (weight + 11) * 4;
+
+ result = var->digits[0];
+
+ /*
+ * "result" now has 1 to 4 nonzero decimal digits. We pack in more
+ * digits to make 7 in total (largest we can fit in 24 bits)
+ */
+
+ if (result > 999)
+ {
+ /* already have 4 digits, add 3 more */
+ result = (result * 1000) + (nxt1 / 10);
+ weight += 3;
+ }
+ else if (result > 99)
+ {
+ /* already have 3 digits, add 4 more */
+ result = (result * 10000) + nxt1;
+ weight += 2;
+ }
+ else if (result > 9)
+ {
+ NumericDigit nxt2 = (ndigits > 2) ? var->digits[2] : 0;
+
+ /* already have 2 digits, add 5 more */
+ result = (result * 100000) + (nxt1 * 10) + (nxt2 / 1000);
+ weight += 1;
+ }
+ else
+ {
+ NumericDigit nxt2 = (ndigits > 2) ? var->digits[2] : 0;
+
+ /* already have 1 digit, add 6 more */
+ result = (result * 1000000) + (nxt1 * 100) + (nxt2 / 100);
+ }
+
+ result = result | (weight << 24);
+ }
+
+ /* the abbrev is negated relative to the original */
+ if (var->sign == NUMERIC_POS)
+ result = -result;
+
+ if (nss->estimating)
+ {
+ uint32 tmp = (uint32) result;
+
+ addHyperLogLog(&nss->abbr_card, DatumGetUInt32(hash_uint32(tmp)));
+ }
+
+ return NumericAbbrevGetDatum(result);
+}
+
+#endif /* NUMERIC_ABBREV_BITS == 32 */
+
+/*
+ * Ordinary (non-sortsupport) comparisons follow.
+ */
+
+Datum
+numeric_cmp(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ int result;
+
+ result = cmp_numerics(num1, num2);
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+
+Datum
+numeric_eq(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) == 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+numeric_ne(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) != 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+numeric_gt(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) > 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+numeric_ge(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) >= 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+numeric_lt(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) < 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+numeric_le(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
+
+ result = cmp_numerics(num1, num2) <= 0;
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+static int
+cmp_numerics(Numeric num1, Numeric num2)
+{
+ int result;
+
+ /*
+ * We consider all NANs to be equal and larger than any non-NAN (including
+ * Infinity). This is somewhat arbitrary; the important thing is to have
+ * a consistent sort order.
+ */
+ if (NUMERIC_IS_SPECIAL(num1))
+ {
+ if (NUMERIC_IS_NAN(num1))
+ {
+ if (NUMERIC_IS_NAN(num2))
+ result = 0; /* NAN = NAN */
+ else
+ result = 1; /* NAN > non-NAN */
+ }
+ else if (NUMERIC_IS_PINF(num1))
+ {
+ if (NUMERIC_IS_NAN(num2))
+ result = -1; /* PINF < NAN */
+ else if (NUMERIC_IS_PINF(num2))
+ result = 0; /* PINF = PINF */
+ else
+ result = 1; /* PINF > anything else */
+ }
+ else /* num1 must be NINF */
+ {
+ if (NUMERIC_IS_NINF(num2))
+ result = 0; /* NINF = NINF */
+ else
+ result = -1; /* NINF < anything else */
+ }
+ }
+ else if (NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NINF(num2))
+ result = 1; /* normal > NINF */
+ else
+ result = -1; /* normal < NAN or PINF */
+ }
+ else
+ {
+ result = cmp_var_common(NUMERIC_DIGITS(num1), NUMERIC_NDIGITS(num1),
+ NUMERIC_WEIGHT(num1), NUMERIC_SIGN(num1),
+ NUMERIC_DIGITS(num2), NUMERIC_NDIGITS(num2),
+ NUMERIC_WEIGHT(num2), NUMERIC_SIGN(num2));
+ }
+
+ return result;
+}
+
+/*
+ * in_range support function for numeric.
+ */
+Datum
+in_range_numeric_numeric(PG_FUNCTION_ARGS)
+{
+ Numeric val = PG_GETARG_NUMERIC(0);
+ Numeric base = PG_GETARG_NUMERIC(1);
+ Numeric offset = PG_GETARG_NUMERIC(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ bool result;
+
+ /*
+ * Reject negative (including -Inf) or NaN offset. Negative is per spec,
+ * and NaN is because appropriate semantics for that seem non-obvious.
+ */
+ if (NUMERIC_IS_NAN(offset) ||
+ NUMERIC_IS_NINF(offset) ||
+ NUMERIC_SIGN(offset) == NUMERIC_NEG)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /*
+ * Deal with cases where val and/or base is NaN, following the rule that
+ * NaN sorts after non-NaN (cf cmp_numerics). The offset cannot affect
+ * the conclusion.
+ */
+ if (NUMERIC_IS_NAN(val))
+ {
+ if (NUMERIC_IS_NAN(base))
+ result = true; /* NAN = NAN */
+ else
+ result = !less; /* NAN > non-NAN */
+ }
+ else if (NUMERIC_IS_NAN(base))
+ {
+ result = less; /* non-NAN < NAN */
+ }
+
+ /*
+ * Deal with infinite offset (necessarily +Inf, at this point).
+ */
+ else if (NUMERIC_IS_SPECIAL(offset))
+ {
+ Assert(NUMERIC_IS_PINF(offset));
+ if (sub ? NUMERIC_IS_PINF(base) : NUMERIC_IS_NINF(base))
+ {
+ /*
+ * base +/- offset would produce NaN, so return true for any val
+ * (see in_range_float8_float8() for reasoning).
+ */
+ result = true;
+ }
+ else if (sub)
+ {
+ /* base - offset must be -inf */
+ if (less)
+ result = NUMERIC_IS_NINF(val); /* only -inf is <= sum */
+ else
+ result = true; /* any val is >= sum */
+ }
+ else
+ {
+ /* base + offset must be +inf */
+ if (less)
+ result = true; /* any val is <= sum */
+ else
+ result = NUMERIC_IS_PINF(val); /* only +inf is >= sum */
+ }
+ }
+
+ /*
+ * Deal with cases where val and/or base is infinite. The offset, being
+ * now known finite, cannot affect the conclusion.
+ */
+ else if (NUMERIC_IS_SPECIAL(val))
+ {
+ if (NUMERIC_IS_PINF(val))
+ {
+ if (NUMERIC_IS_PINF(base))
+ result = true; /* PINF = PINF */
+ else
+ result = !less; /* PINF > any other non-NAN */
+ }
+ else /* val must be NINF */
+ {
+ if (NUMERIC_IS_NINF(base))
+ result = true; /* NINF = NINF */
+ else
+ result = less; /* NINF < anything else */
+ }
+ }
+ else if (NUMERIC_IS_SPECIAL(base))
+ {
+ if (NUMERIC_IS_NINF(base))
+ result = !less; /* normal > NINF */
+ else
+ result = less; /* normal < PINF */
+ }
+ else
+ {
+ /*
+ * Otherwise go ahead and compute base +/- offset. While it's
+ * possible for this to overflow the numeric format, it's unlikely
+ * enough that we don't take measures to prevent it.
+ */
+ NumericVar valv;
+ NumericVar basev;
+ NumericVar offsetv;
+ NumericVar sum;
+
+ init_var_from_num(val, &valv);
+ init_var_from_num(base, &basev);
+ init_var_from_num(offset, &offsetv);
+ init_var(&sum);
+
+ if (sub)
+ sub_var(&basev, &offsetv, &sum);
+ else
+ add_var(&basev, &offsetv, &sum);
+
+ if (less)
+ result = (cmp_var(&valv, &sum) <= 0);
+ else
+ result = (cmp_var(&valv, &sum) >= 0);
+
+ free_var(&sum);
+ }
+
+ PG_FREE_IF_COPY(val, 0);
+ PG_FREE_IF_COPY(base, 1);
+ PG_FREE_IF_COPY(offset, 2);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+hash_numeric(PG_FUNCTION_ARGS)
+{
+ Numeric key = PG_GETARG_NUMERIC(0);
+ Datum digit_hash;
+ Datum result;
+ int weight;
+ int start_offset;
+ int end_offset;
+ int i;
+ int hash_len;
+ NumericDigit *digits;
+
+ /* If it's NaN or infinity, don't try to hash the rest of the fields */
+ if (NUMERIC_IS_SPECIAL(key))
+ PG_RETURN_UINT32(0);
+
+ weight = NUMERIC_WEIGHT(key);
+ start_offset = 0;
+ end_offset = 0;
+
+ /*
+ * Omit any leading or trailing zeros from the input to the hash. The
+ * numeric implementation *should* guarantee that leading and trailing
+ * zeros are suppressed, but we're paranoid. Note that we measure the
+ * starting and ending offsets in units of NumericDigits, not bytes.
+ */
+ digits = NUMERIC_DIGITS(key);
+ for (i = 0; i < NUMERIC_NDIGITS(key); i++)
+ {
+ if (digits[i] != (NumericDigit) 0)
+ break;
+
+ start_offset++;
+
+ /*
+ * The weight is effectively the # of digits before the decimal point,
+ * so decrement it for each leading zero we skip.
+ */
+ weight--;
+ }
+
+ /*
+ * If there are no non-zero digits, then the value of the number is zero,
+ * regardless of any other fields.
+ */
+ if (NUMERIC_NDIGITS(key) == start_offset)
+ PG_RETURN_UINT32(-1);
+
+ for (i = NUMERIC_NDIGITS(key) - 1; i >= 0; i--)
+ {
+ if (digits[i] != (NumericDigit) 0)
+ break;
+
+ end_offset++;
+ }
+
+ /* If we get here, there should be at least one non-zero digit */
+ Assert(start_offset + end_offset < NUMERIC_NDIGITS(key));
+
+ /*
+ * Note that we don't hash on the Numeric's scale, since two numerics can
+ * compare equal but have different scales. We also don't hash on the
+ * sign, although we could: since a sign difference implies inequality,
+ * this shouldn't affect correctness.
+ */
+ hash_len = NUMERIC_NDIGITS(key) - start_offset - end_offset;
+ digit_hash = hash_any((unsigned char *) (NUMERIC_DIGITS(key) + start_offset),
+ hash_len * sizeof(NumericDigit));
+
+ /* Mix in the weight, via XOR */
+ result = digit_hash ^ weight;
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * Returns 64-bit value by hashing a value to a 64-bit value, with a seed.
+ * Otherwise, similar to hash_numeric.
+ */
+Datum
+hash_numeric_extended(PG_FUNCTION_ARGS)
+{
+ Numeric key = PG_GETARG_NUMERIC(0);
+ uint64 seed = PG_GETARG_INT64(1);
+ Datum digit_hash;
+ Datum result;
+ int weight;
+ int start_offset;
+ int end_offset;
+ int i;
+ int hash_len;
+ NumericDigit *digits;
+
+ /* If it's NaN or infinity, don't try to hash the rest of the fields */
+ if (NUMERIC_IS_SPECIAL(key))
+ PG_RETURN_UINT64(seed);
+
+ weight = NUMERIC_WEIGHT(key);
+ start_offset = 0;
+ end_offset = 0;
+
+ digits = NUMERIC_DIGITS(key);
+ for (i = 0; i < NUMERIC_NDIGITS(key); i++)
+ {
+ if (digits[i] != (NumericDigit) 0)
+ break;
+
+ start_offset++;
+
+ weight--;
+ }
+
+ if (NUMERIC_NDIGITS(key) == start_offset)
+ PG_RETURN_UINT64(seed - 1);
+
+ for (i = NUMERIC_NDIGITS(key) - 1; i >= 0; i--)
+ {
+ if (digits[i] != (NumericDigit) 0)
+ break;
+
+ end_offset++;
+ }
+
+ Assert(start_offset + end_offset < NUMERIC_NDIGITS(key));
+
+ hash_len = NUMERIC_NDIGITS(key) - start_offset - end_offset;
+ digit_hash = hash_any_extended((unsigned char *) (NUMERIC_DIGITS(key)
+ + start_offset),
+ hash_len * sizeof(NumericDigit),
+ seed);
+
+ result = UInt64GetDatum(DatumGetUInt64(digit_hash) ^ weight);
+
+ PG_RETURN_DATUM(result);
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Basic arithmetic functions
+ *
+ * ----------------------------------------------------------------------
+ */
+
+
+/*
+ * numeric_add() -
+ *
+ * Add two numerics
+ */
+Datum
+numeric_add(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+
+ res = numeric_add_opt_error(num1, num2, NULL);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+/*
+ * numeric_add_opt_error() -
+ *
+ * Internal version of numeric_add(). If "*have_error" flag is provided,
+ * on error it's set to true, NULL returned. This is helpful when caller
+ * need to handle errors by itself.
+ */
+Numeric
+numeric_add_opt_error(Numeric num1, Numeric num2, bool *have_error)
+{
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ return make_result(&const_nan);
+ if (NUMERIC_IS_PINF(num1))
+ {
+ if (NUMERIC_IS_NINF(num2))
+ return make_result(&const_nan); /* Inf + -Inf */
+ else
+ return make_result(&const_pinf);
+ }
+ if (NUMERIC_IS_NINF(num1))
+ {
+ if (NUMERIC_IS_PINF(num2))
+ return make_result(&const_nan); /* -Inf + Inf */
+ else
+ return make_result(&const_ninf);
+ }
+ /* by here, num1 must be finite, so num2 is not */
+ if (NUMERIC_IS_PINF(num2))
+ return make_result(&const_pinf);
+ Assert(NUMERIC_IS_NINF(num2));
+ return make_result(&const_ninf);
+ }
+
+ /*
+ * Unpack the values, let add_var() compute the result and return it.
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+ add_var(&arg1, &arg2, &result);
+
+ res = make_result_opt_error(&result, have_error);
+
+ free_var(&result);
+
+ return res;
+}
+
+
+/*
+ * numeric_sub() -
+ *
+ * Subtract one numeric from another
+ */
+Datum
+numeric_sub(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+
+ res = numeric_sub_opt_error(num1, num2, NULL);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_sub_opt_error() -
+ *
+ * Internal version of numeric_sub(). If "*have_error" flag is provided,
+ * on error it's set to true, NULL returned. This is helpful when caller
+ * need to handle errors by itself.
+ */
+Numeric
+numeric_sub_opt_error(Numeric num1, Numeric num2, bool *have_error)
+{
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ return make_result(&const_nan);
+ if (NUMERIC_IS_PINF(num1))
+ {
+ if (NUMERIC_IS_PINF(num2))
+ return make_result(&const_nan); /* Inf - Inf */
+ else
+ return make_result(&const_pinf);
+ }
+ if (NUMERIC_IS_NINF(num1))
+ {
+ if (NUMERIC_IS_NINF(num2))
+ return make_result(&const_nan); /* -Inf - -Inf */
+ else
+ return make_result(&const_ninf);
+ }
+ /* by here, num1 must be finite, so num2 is not */
+ if (NUMERIC_IS_PINF(num2))
+ return make_result(&const_ninf);
+ Assert(NUMERIC_IS_NINF(num2));
+ return make_result(&const_pinf);
+ }
+
+ /*
+ * Unpack the values, let sub_var() compute the result and return it.
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+ sub_var(&arg1, &arg2, &result);
+
+ res = make_result_opt_error(&result, have_error);
+
+ free_var(&result);
+
+ return res;
+}
+
+
+/*
+ * numeric_mul() -
+ *
+ * Calculate the product of two numerics
+ */
+Datum
+numeric_mul(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+
+ res = numeric_mul_opt_error(num1, num2, NULL);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_mul_opt_error() -
+ *
+ * Internal version of numeric_mul(). If "*have_error" flag is provided,
+ * on error it's set to true, NULL returned. This is helpful when caller
+ * need to handle errors by itself.
+ */
+Numeric
+numeric_mul_opt_error(Numeric num1, Numeric num2, bool *have_error)
+{
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ return make_result(&const_nan);
+ if (NUMERIC_IS_PINF(num1))
+ {
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ return make_result(&const_nan); /* Inf * 0 */
+ case 1:
+ return make_result(&const_pinf);
+ case -1:
+ return make_result(&const_ninf);
+ }
+ Assert(false);
+ }
+ if (NUMERIC_IS_NINF(num1))
+ {
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ return make_result(&const_nan); /* -Inf * 0 */
+ case 1:
+ return make_result(&const_ninf);
+ case -1:
+ return make_result(&const_pinf);
+ }
+ Assert(false);
+ }
+ /* by here, num1 must be finite, so num2 is not */
+ if (NUMERIC_IS_PINF(num2))
+ {
+ switch (numeric_sign_internal(num1))
+ {
+ case 0:
+ return make_result(&const_nan); /* 0 * Inf */
+ case 1:
+ return make_result(&const_pinf);
+ case -1:
+ return make_result(&const_ninf);
+ }
+ Assert(false);
+ }
+ Assert(NUMERIC_IS_NINF(num2));
+ switch (numeric_sign_internal(num1))
+ {
+ case 0:
+ return make_result(&const_nan); /* 0 * -Inf */
+ case 1:
+ return make_result(&const_ninf);
+ case -1:
+ return make_result(&const_pinf);
+ }
+ Assert(false);
+ }
+
+ /*
+ * Unpack the values, let mul_var() compute the result and return it.
+ * Unlike add_var() and sub_var(), mul_var() will round its result. In the
+ * case of numeric_mul(), which is invoked for the * operator on numerics,
+ * we request exact representation for the product (rscale = sum(dscale of
+ * arg1, dscale of arg2)). If the exact result has more digits after the
+ * decimal point than can be stored in a numeric, we round it. Rounding
+ * after computing the exact result ensures that the final result is
+ * correctly rounded (rounding in mul_var() using a truncated product
+ * would not guarantee this).
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+ mul_var(&arg1, &arg2, &result, arg1.dscale + arg2.dscale);
+
+ if (result.dscale > NUMERIC_DSCALE_MAX)
+ round_var(&result, NUMERIC_DSCALE_MAX);
+
+ res = make_result_opt_error(&result, have_error);
+
+ free_var(&result);
+
+ return res;
+}
+
+
+/*
+ * numeric_div() -
+ *
+ * Divide one numeric into another
+ */
+Datum
+numeric_div(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+
+ res = numeric_div_opt_error(num1, num2, NULL);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_div_opt_error() -
+ *
+ * Internal version of numeric_div(). If "*have_error" flag is provided,
+ * on error it's set to true, NULL returned. This is helpful when caller
+ * need to handle errors by itself.
+ */
+Numeric
+numeric_div_opt_error(Numeric num1, Numeric num2, bool *have_error)
+{
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+ int rscale;
+
+ if (have_error)
+ *have_error = false;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ return make_result(&const_nan);
+ if (NUMERIC_IS_PINF(num1))
+ {
+ if (NUMERIC_IS_SPECIAL(num2))
+ return make_result(&const_nan); /* Inf / [-]Inf */
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ if (have_error)
+ {
+ *have_error = true;
+ return NULL;
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ break;
+ case 1:
+ return make_result(&const_pinf);
+ case -1:
+ return make_result(&const_ninf);
+ }
+ Assert(false);
+ }
+ if (NUMERIC_IS_NINF(num1))
+ {
+ if (NUMERIC_IS_SPECIAL(num2))
+ return make_result(&const_nan); /* -Inf / [-]Inf */
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ if (have_error)
+ {
+ *have_error = true;
+ return NULL;
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ break;
+ case 1:
+ return make_result(&const_ninf);
+ case -1:
+ return make_result(&const_pinf);
+ }
+ Assert(false);
+ }
+ /* by here, num1 must be finite, so num2 is not */
+
+ /*
+ * POSIX would have us return zero or minus zero if num1 is zero, and
+ * otherwise throw an underflow error. But the numeric type doesn't
+ * really do underflow, so let's just return zero.
+ */
+ return make_result(&const_zero);
+ }
+
+ /*
+ * Unpack the arguments
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+
+ /*
+ * Select scale for division result
+ */
+ rscale = select_div_scale(&arg1, &arg2);
+
+ /*
+ * If "have_error" is provided, check for division by zero here
+ */
+ if (have_error && (arg2.ndigits == 0 || arg2.digits[0] == 0))
+ {
+ *have_error = true;
+ return NULL;
+ }
+
+ /*
+ * Do the divide and return the result
+ */
+ div_var(&arg1, &arg2, &result, rscale, true);
+
+ res = make_result_opt_error(&result, have_error);
+
+ free_var(&result);
+
+ return res;
+}
+
+
+/*
+ * numeric_div_trunc() -
+ *
+ * Divide one numeric into another, truncating the result to an integer
+ */
+Datum
+numeric_div_trunc(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ if (NUMERIC_IS_PINF(num1))
+ {
+ if (NUMERIC_IS_SPECIAL(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan)); /* Inf / [-]Inf */
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ break;
+ case 1:
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ case -1:
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+ }
+ Assert(false);
+ }
+ if (NUMERIC_IS_NINF(num1))
+ {
+ if (NUMERIC_IS_SPECIAL(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan)); /* -Inf / [-]Inf */
+ switch (numeric_sign_internal(num2))
+ {
+ case 0:
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ break;
+ case 1:
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+ case -1:
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ }
+ Assert(false);
+ }
+ /* by here, num1 must be finite, so num2 is not */
+
+ /*
+ * POSIX would have us return zero or minus zero if num1 is zero, and
+ * otherwise throw an underflow error. But the numeric type doesn't
+ * really do underflow, so let's just return zero.
+ */
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ }
+
+ /*
+ * Unpack the arguments
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+
+ /*
+ * Do the divide and return the result
+ */
+ div_var(&arg1, &arg2, &result, 0, false);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_mod() -
+ *
+ * Calculate the modulo of two numerics
+ */
+Datum
+numeric_mod(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+
+ res = numeric_mod_opt_error(num1, num2, NULL);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_mod_opt_error() -
+ *
+ * Internal version of numeric_mod(). If "*have_error" flag is provided,
+ * on error it's set to true, NULL returned. This is helpful when caller
+ * need to handle errors by itself.
+ */
+Numeric
+numeric_mod_opt_error(Numeric num1, Numeric num2, bool *have_error)
+{
+ Numeric res;
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+
+ if (have_error)
+ *have_error = false;
+
+ /*
+ * Handle NaN and infinities. We follow POSIX fmod() on this, except that
+ * POSIX treats x-is-infinite and y-is-zero identically, raising EDOM and
+ * returning NaN. We choose to throw error only for y-is-zero.
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ return make_result(&const_nan);
+ if (NUMERIC_IS_INF(num1))
+ {
+ if (numeric_sign_internal(num2) == 0)
+ {
+ if (have_error)
+ {
+ *have_error = true;
+ return NULL;
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ }
+ /* Inf % any nonzero = NaN */
+ return make_result(&const_nan);
+ }
+ /* num2 must be [-]Inf; result is num1 regardless of sign of num2 */
+ return duplicate_numeric(num1);
+ }
+
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+
+ /*
+ * If "have_error" is provided, check for division by zero here
+ */
+ if (have_error && (arg2.ndigits == 0 || arg2.digits[0] == 0))
+ {
+ *have_error = true;
+ return NULL;
+ }
+
+ mod_var(&arg1, &arg2, &result);
+
+ res = make_result_opt_error(&result, NULL);
+
+ free_var(&result);
+
+ return res;
+}
+
+
+/*
+ * numeric_inc() -
+ *
+ * Increment a number by one
+ */
+Datum
+numeric_inc(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar arg;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ /*
+ * Compute the result and return it
+ */
+ init_var_from_num(num, &arg);
+
+ add_var(&arg, &const_one, &arg);
+
+ res = make_result(&arg);
+
+ free_var(&arg);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_smaller() -
+ *
+ * Return the smaller of two numbers
+ */
+Datum
+numeric_smaller(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+
+ /*
+ * Use cmp_numerics so that this will agree with the comparison operators,
+ * particularly as regards comparisons involving NaN.
+ */
+ if (cmp_numerics(num1, num2) < 0)
+ PG_RETURN_NUMERIC(num1);
+ else
+ PG_RETURN_NUMERIC(num2);
+}
+
+
+/*
+ * numeric_larger() -
+ *
+ * Return the larger of two numbers
+ */
+Datum
+numeric_larger(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+
+ /*
+ * Use cmp_numerics so that this will agree with the comparison operators,
+ * particularly as regards comparisons involving NaN.
+ */
+ if (cmp_numerics(num1, num2) > 0)
+ PG_RETURN_NUMERIC(num1);
+ else
+ PG_RETURN_NUMERIC(num2);
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Advanced math functions
+ *
+ * ----------------------------------------------------------------------
+ */
+
+/*
+ * numeric_gcd() -
+ *
+ * Calculate the greatest common divisor of two numerics
+ */
+Datum
+numeric_gcd(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities: we consider the result to be NaN in all such
+ * cases.
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ /*
+ * Unpack the arguments
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+
+ /*
+ * Find the GCD and return the result
+ */
+ gcd_var(&arg1, &arg2, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_lcm() -
+ *
+ * Calculate the least common multiple of two numerics
+ */
+Datum
+numeric_lcm(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ Numeric res;
+
+ /*
+ * Handle NaN and infinities: we consider the result to be NaN in all such
+ * cases.
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ /*
+ * Unpack the arguments
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ init_var(&result);
+
+ /*
+ * Compute the result using lcm(x, y) = abs(x / gcd(x, y) * y), returning
+ * zero if either input is zero.
+ *
+ * Note that the division is guaranteed to be exact, returning an integer
+ * result, so the LCM is an integral multiple of both x and y. A display
+ * scale of Min(x.dscale, y.dscale) would be sufficient to represent it,
+ * but as with other numeric functions, we choose to return a result whose
+ * display scale is no smaller than either input.
+ */
+ if (arg1.ndigits == 0 || arg2.ndigits == 0)
+ set_var_from_var(&const_zero, &result);
+ else
+ {
+ gcd_var(&arg1, &arg2, &result);
+ div_var(&arg1, &result, &result, 0, false);
+ mul_var(&arg2, &result, &result, arg2.dscale);
+ result.sign = NUMERIC_POS;
+ }
+
+ result.dscale = Max(arg1.dscale, arg2.dscale);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_fac()
+ *
+ * Compute factorial
+ */
+Datum
+numeric_fac(PG_FUNCTION_ARGS)
+{
+ int64 num = PG_GETARG_INT64(0);
+ Numeric res;
+ NumericVar fact;
+ NumericVar result;
+
+ if (num < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("factorial of a negative number is undefined")));
+ if (num <= 1)
+ {
+ res = make_result(&const_one);
+ PG_RETURN_NUMERIC(res);
+ }
+ /* Fail immediately if the result would overflow */
+ if (num > 32177)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+
+ init_var(&fact);
+ init_var(&result);
+
+ int64_to_numericvar(num, &result);
+
+ for (num = num - 1; num > 1; num--)
+ {
+ /* this loop can take awhile, so allow it to be interrupted */
+ CHECK_FOR_INTERRUPTS();
+
+ int64_to_numericvar(num, &fact);
+
+ mul_var(&result, &fact, &result, 0);
+ }
+
+ res = make_result(&result);
+
+ free_var(&fact);
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_sqrt() -
+ *
+ * Compute the square root of a numeric.
+ */
+Datum
+numeric_sqrt(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar arg;
+ NumericVar result;
+ int sweight;
+ int rscale;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ /* error should match that in sqrt_var() */
+ if (NUMERIC_IS_NINF(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("cannot take square root of a negative number")));
+ /* For NAN or PINF, just duplicate the input */
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+ }
+
+ /*
+ * Unpack the argument and determine the result scale. We choose a scale
+ * to give at least NUMERIC_MIN_SIG_DIGITS significant digits; but in any
+ * case not less than the input's dscale.
+ */
+ init_var_from_num(num, &arg);
+
+ init_var(&result);
+
+ /* Assume the input was normalized, so arg.weight is accurate */
+ sweight = (arg.weight + 1) * DEC_DIGITS / 2 - 1;
+
+ rscale = NUMERIC_MIN_SIG_DIGITS - sweight;
+ rscale = Max(rscale, arg.dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ /*
+ * Let sqrt_var() do the calculation and return the result.
+ */
+ sqrt_var(&arg, &result, rscale);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_exp() -
+ *
+ * Raise e to the power of x
+ */
+Datum
+numeric_exp(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar arg;
+ NumericVar result;
+ int rscale;
+ double val;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ /* Per POSIX, exp(-Inf) is zero */
+ if (NUMERIC_IS_NINF(num))
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ /* For NAN or PINF, just duplicate the input */
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+ }
+
+ /*
+ * Unpack the argument and determine the result scale. We choose a scale
+ * to give at least NUMERIC_MIN_SIG_DIGITS significant digits; but in any
+ * case not less than the input's dscale.
+ */
+ init_var_from_num(num, &arg);
+
+ init_var(&result);
+
+ /* convert input to float8, ignoring overflow */
+ val = numericvar_to_double_no_overflow(&arg);
+
+ /*
+ * log10(result) = num * log10(e), so this is approximately the decimal
+ * weight of the result:
+ */
+ val *= 0.434294481903252;
+
+ /* limit to something that won't cause integer overflow */
+ val = Max(val, -NUMERIC_MAX_RESULT_SCALE);
+ val = Min(val, NUMERIC_MAX_RESULT_SCALE);
+
+ rscale = NUMERIC_MIN_SIG_DIGITS - (int) val;
+ rscale = Max(rscale, arg.dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ /*
+ * Let exp_var() do the calculation and return the result.
+ */
+ exp_var(&arg, &result, rscale);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_ln() -
+ *
+ * Compute the natural logarithm of x
+ */
+Datum
+numeric_ln(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar arg;
+ NumericVar result;
+ int ln_dweight;
+ int rscale;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_NINF(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of a negative number")));
+ /* For NAN or PINF, just duplicate the input */
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+ }
+
+ init_var_from_num(num, &arg);
+ init_var(&result);
+
+ /* Estimated dweight of logarithm */
+ ln_dweight = estimate_ln_dweight(&arg);
+
+ rscale = NUMERIC_MIN_SIG_DIGITS - ln_dweight;
+ rscale = Max(rscale, arg.dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ ln_var(&arg, &result, rscale);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_log() -
+ *
+ * Compute the logarithm of x in a given base
+ */
+Datum
+numeric_log(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ int sign1,
+ sign2;
+
+ if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ /* fail on negative inputs including -Inf, as log_var would */
+ sign1 = numeric_sign_internal(num1);
+ sign2 = numeric_sign_internal(num2);
+ if (sign1 < 0 || sign2 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of a negative number")));
+ /* fail on zero inputs, as log_var would */
+ if (sign1 == 0 || sign2 == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of zero")));
+ if (NUMERIC_IS_PINF(num1))
+ {
+ /* log(Inf, Inf) reduces to Inf/Inf, so it's NaN */
+ if (NUMERIC_IS_PINF(num2))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ /* log(Inf, finite-positive) is zero (we don't throw underflow) */
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ }
+ Assert(NUMERIC_IS_PINF(num2));
+ /* log(finite-positive, Inf) is Inf */
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ }
+
+ /*
+ * Initialize things
+ */
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+ init_var(&result);
+
+ /*
+ * Call log_var() to compute and return the result; note it handles scale
+ * selection itself.
+ */
+ log_var(&arg1, &arg2, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/*
+ * numeric_power() -
+ *
+ * Raise x to the power of y
+ */
+Datum
+numeric_power(PG_FUNCTION_ARGS)
+{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ Numeric res;
+ NumericVar arg1;
+ NumericVar arg2;
+ NumericVar result;
+ int sign1,
+ sign2;
+
+ /*
+ * Handle NaN and infinities
+ */
+ if (NUMERIC_IS_SPECIAL(num1) || NUMERIC_IS_SPECIAL(num2))
+ {
+ /*
+ * We follow the POSIX spec for pow(3), which says that NaN ^ 0 = 1,
+ * and 1 ^ NaN = 1, while all other cases with NaN inputs yield NaN
+ * (with no error).
+ */
+ if (NUMERIC_IS_NAN(num1))
+ {
+ if (!NUMERIC_IS_SPECIAL(num2))
+ {
+ init_var_from_num(num2, &arg2);
+ if (cmp_var(&arg2, &const_zero) == 0)
+ PG_RETURN_NUMERIC(make_result(&const_one));
+ }
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ }
+ if (NUMERIC_IS_NAN(num2))
+ {
+ if (!NUMERIC_IS_SPECIAL(num1))
+ {
+ init_var_from_num(num1, &arg1);
+ if (cmp_var(&arg1, &const_one) == 0)
+ PG_RETURN_NUMERIC(make_result(&const_one));
+ }
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ }
+ /* At least one input is infinite, but error rules still apply */
+ sign1 = numeric_sign_internal(num1);
+ sign2 = numeric_sign_internal(num2);
+ if (sign1 == 0 && sign2 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("zero raised to a negative power is undefined")));
+ if (sign1 < 0 && !numeric_is_integral(num2))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("a negative number raised to a non-integer power yields a complex result")));
+
+ /*
+ * POSIX gives this series of rules for pow(3) with infinite inputs:
+ *
+ * For any value of y, if x is +1, 1.0 shall be returned.
+ */
+ if (!NUMERIC_IS_SPECIAL(num1))
+ {
+ init_var_from_num(num1, &arg1);
+ if (cmp_var(&arg1, &const_one) == 0)
+ PG_RETURN_NUMERIC(make_result(&const_one));
+ }
+
+ /*
+ * For any value of x, if y is [-]0, 1.0 shall be returned.
+ */
+ if (sign2 == 0)
+ PG_RETURN_NUMERIC(make_result(&const_one));
+
+ /*
+ * For any odd integer value of y > 0, if x is [-]0, [-]0 shall be
+ * returned. For y > 0 and not an odd integer, if x is [-]0, +0 shall
+ * be returned. (Since we don't deal in minus zero, we need not
+ * distinguish these two cases.)
+ */
+ if (sign1 == 0 && sign2 > 0)
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+
+ /*
+ * If x is -1, and y is [-]Inf, 1.0 shall be returned.
+ *
+ * For |x| < 1, if y is -Inf, +Inf shall be returned.
+ *
+ * For |x| > 1, if y is -Inf, +0 shall be returned.
+ *
+ * For |x| < 1, if y is +Inf, +0 shall be returned.
+ *
+ * For |x| > 1, if y is +Inf, +Inf shall be returned.
+ */
+ if (NUMERIC_IS_INF(num2))
+ {
+ bool abs_x_gt_one;
+
+ if (NUMERIC_IS_SPECIAL(num1))
+ abs_x_gt_one = true; /* x is either Inf or -Inf */
+ else
+ {
+ init_var_from_num(num1, &arg1);
+ if (cmp_var(&arg1, &const_minus_one) == 0)
+ PG_RETURN_NUMERIC(make_result(&const_one));
+ arg1.sign = NUMERIC_POS; /* now arg1 = abs(x) */
+ abs_x_gt_one = (cmp_var(&arg1, &const_one) > 0);
+ }
+ if (abs_x_gt_one == (sign2 > 0))
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ else
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ }
+
+ /*
+ * For y < 0, if x is +Inf, +0 shall be returned.
+ *
+ * For y > 0, if x is +Inf, +Inf shall be returned.
+ */
+ if (NUMERIC_IS_PINF(num1))
+ {
+ if (sign2 > 0)
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ else
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+ }
+
+ Assert(NUMERIC_IS_NINF(num1));
+
+ /*
+ * For y an odd integer < 0, if x is -Inf, -0 shall be returned. For
+ * y < 0 and not an odd integer, if x is -Inf, +0 shall be returned.
+ * (Again, we need not distinguish these two cases.)
+ */
+ if (sign2 < 0)
+ PG_RETURN_NUMERIC(make_result(&const_zero));
+
+ /*
+ * For y an odd integer > 0, if x is -Inf, -Inf shall be returned. For
+ * y > 0 and not an odd integer, if x is -Inf, +Inf shall be returned.
+ */
+ init_var_from_num(num2, &arg2);
+ if (arg2.ndigits > 0 && arg2.ndigits == arg2.weight + 1 &&
+ (arg2.digits[arg2.ndigits - 1] & 1))
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+ else
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ }
+
+ /*
+ * The SQL spec requires that we emit a particular SQLSTATE error code for
+ * certain error conditions. Specifically, we don't return a
+ * divide-by-zero error code for 0 ^ -1. Raising a negative number to a
+ * non-integer power must produce the same error code, but that case is
+ * handled in power_var().
+ */
+ sign1 = numeric_sign_internal(num1);
+ sign2 = numeric_sign_internal(num2);
+
+ if (sign1 == 0 && sign2 < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("zero raised to a negative power is undefined")));
+
+ /*
+ * Initialize things
+ */
+ init_var(&result);
+ init_var_from_num(num1, &arg1);
+ init_var_from_num(num2, &arg2);
+
+ /*
+ * Call power_var() to compute and return the result; note it handles
+ * scale selection itself.
+ */
+ power_var(&arg1, &arg2, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+/*
+ * numeric_scale() -
+ *
+ * Returns the scale, i.e. the count of decimal digits in the fractional part
+ */
+Datum
+numeric_scale(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(NUMERIC_DSCALE(num));
+}
+
+/*
+ * Calculate minimum scale for value.
+ */
+static int
+get_min_scale(NumericVar *var)
+{
+ int min_scale;
+ int last_digit_pos;
+
+ /*
+ * Ordinarily, the input value will be "stripped" so that the last
+ * NumericDigit is nonzero. But we don't want to get into an infinite
+ * loop if it isn't, so explicitly find the last nonzero digit.
+ */
+ last_digit_pos = var->ndigits - 1;
+ while (last_digit_pos >= 0 &&
+ var->digits[last_digit_pos] == 0)
+ last_digit_pos--;
+
+ if (last_digit_pos >= 0)
+ {
+ /* compute min_scale assuming that last ndigit has no zeroes */
+ min_scale = (last_digit_pos - var->weight) * DEC_DIGITS;
+
+ /*
+ * We could get a negative result if there are no digits after the
+ * decimal point. In this case the min_scale must be zero.
+ */
+ if (min_scale > 0)
+ {
+ /*
+ * Reduce min_scale if trailing digit(s) in last NumericDigit are
+ * zero.
+ */
+ NumericDigit last_digit = var->digits[last_digit_pos];
+
+ while (last_digit % 10 == 0)
+ {
+ min_scale--;
+ last_digit /= 10;
+ }
+ }
+ else
+ min_scale = 0;
+ }
+ else
+ min_scale = 0; /* result if input is zero */
+
+ return min_scale;
+}
+
+/*
+ * Returns minimum scale required to represent supplied value without loss.
+ */
+Datum
+numeric_min_scale(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar arg;
+ int min_scale;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NULL();
+
+ init_var_from_num(num, &arg);
+ min_scale = get_min_scale(&arg);
+ free_var(&arg);
+
+ PG_RETURN_INT32(min_scale);
+}
+
+/*
+ * Reduce scale of numeric value to represent supplied value without loss.
+ */
+Datum
+numeric_trim_scale(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ Numeric res;
+ NumericVar result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ PG_RETURN_NUMERIC(duplicate_numeric(num));
+
+ init_var_from_num(num, &result);
+ result.dscale = get_min_scale(&result);
+ res = make_result(&result);
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Type conversion functions
+ *
+ * ----------------------------------------------------------------------
+ */
+
+Numeric
+int64_to_numeric(int64 val)
+{
+ Numeric res;
+ NumericVar result;
+
+ init_var(&result);
+
+ int64_to_numericvar(val, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ return res;
+}
+
+/*
+ * Convert val1/(10**log10val2) to numeric. This is much faster than normal
+ * numeric division.
+ */
+Numeric
+int64_div_fast_to_numeric(int64 val1, int log10val2)
+{
+ Numeric res;
+ NumericVar result;
+ int rscale;
+ int w;
+ int m;
+
+ init_var(&result);
+
+ /* result scale */
+ rscale = log10val2 < 0 ? 0 : log10val2;
+
+ /* how much to decrease the weight by */
+ w = log10val2 / DEC_DIGITS;
+ /* how much is left to divide by */
+ m = log10val2 % DEC_DIGITS;
+ if (m < 0)
+ {
+ m += DEC_DIGITS;
+ w--;
+ }
+
+ /*
+ * If there is anything left to divide by (10^m with 0 < m < DEC_DIGITS),
+ * multiply the dividend by 10^(DEC_DIGITS - m), and shift the weight by
+ * one more.
+ */
+ if (m > 0)
+ {
+#if DEC_DIGITS == 4
+ static const int pow10[] = {1, 10, 100, 1000};
+#elif DEC_DIGITS == 2
+ static const int pow10[] = {1, 10};
+#elif DEC_DIGITS == 1
+ static const int pow10[] = {1};
+#else
+#error unsupported NBASE
+#endif
+ int64 factor = pow10[DEC_DIGITS - m];
+ int64 new_val1;
+
+ StaticAssertStmt(lengthof(pow10) == DEC_DIGITS, "mismatch with DEC_DIGITS");
+
+ if (unlikely(pg_mul_s64_overflow(val1, factor, &new_val1)))
+ {
+#ifdef HAVE_INT128
+ /* do the multiplication using 128-bit integers */
+ int128 tmp;
+
+ tmp = (int128) val1 * (int128) factor;
+
+ int128_to_numericvar(tmp, &result);
+#else
+ /* do the multiplication using numerics */
+ NumericVar tmp;
+
+ init_var(&tmp);
+
+ int64_to_numericvar(val1, &result);
+ int64_to_numericvar(factor, &tmp);
+ mul_var(&result, &tmp, &result, 0);
+
+ free_var(&tmp);
+#endif
+ }
+ else
+ int64_to_numericvar(new_val1, &result);
+
+ w++;
+ }
+ else
+ int64_to_numericvar(val1, &result);
+
+ result.weight -= w;
+ result.dscale = rscale;
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ return res;
+}
+
+Datum
+int4_numeric(PG_FUNCTION_ARGS)
+{
+ int32 val = PG_GETARG_INT32(0);
+
+ PG_RETURN_NUMERIC(int64_to_numeric(val));
+}
+
+int32
+numeric_int4_opt_error(Numeric num, bool *have_error)
+{
+ NumericVar x;
+ int32 result;
+
+ if (have_error)
+ *have_error = false;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (have_error)
+ {
+ *have_error = true;
+ return 0;
+ }
+ else
+ {
+ if (NUMERIC_IS_NAN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert NaN to %s", "integer")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert infinity to %s", "integer")));
+ }
+ }
+
+ /* Convert to variable format, then convert to int4 */
+ init_var_from_num(num, &x);
+
+ if (!numericvar_to_int32(&x, &result))
+ {
+ if (have_error)
+ {
+ *have_error = true;
+ return 0;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+ }
+ }
+
+ return result;
+}
+
+Datum
+numeric_int4(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+
+ PG_RETURN_INT32(numeric_int4_opt_error(num, NULL));
+}
+
+/*
+ * Given a NumericVar, convert it to an int32. If the NumericVar
+ * exceeds the range of an int32, false is returned, otherwise true is returned.
+ * The input NumericVar is *not* free'd.
+ */
+static bool
+numericvar_to_int32(const NumericVar *var, int32 *result)
+{
+ int64 val;
+
+ if (!numericvar_to_int64(var, &val))
+ return false;
+
+ if (unlikely(val < PG_INT32_MIN) || unlikely(val > PG_INT32_MAX))
+ return false;
+
+ /* Down-convert to int4 */
+ *result = (int32) val;
+
+ return true;
+}
+
+Datum
+int8_numeric(PG_FUNCTION_ARGS)
+{
+ int64 val = PG_GETARG_INT64(0);
+
+ PG_RETURN_NUMERIC(int64_to_numeric(val));
+}
+
+
+Datum
+numeric_int8(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar x;
+ int64 result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_NAN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert NaN to %s", "bigint")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert infinity to %s", "bigint")));
+ }
+
+ /* Convert to variable format and thence to int8 */
+ init_var_from_num(num, &x);
+
+ if (!numericvar_to_int64(&x, &result))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+int2_numeric(PG_FUNCTION_ARGS)
+{
+ int16 val = PG_GETARG_INT16(0);
+
+ PG_RETURN_NUMERIC(int64_to_numeric(val));
+}
+
+
+Datum
+numeric_int2(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar x;
+ int64 val;
+ int16 result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_NAN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert NaN to %s", "smallint")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert infinity to %s", "smallint")));
+ }
+
+ /* Convert to variable format and thence to int8 */
+ init_var_from_num(num, &x);
+
+ if (!numericvar_to_int64(&x, &val))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ if (unlikely(val < PG_INT16_MIN) || unlikely(val > PG_INT16_MAX))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("smallint out of range")));
+
+ /* Down-convert to int2 */
+ result = (int16) val;
+
+ PG_RETURN_INT16(result);
+}
+
+
+Datum
+float8_numeric(PG_FUNCTION_ARGS)
+{
+ float8 val = PG_GETARG_FLOAT8(0);
+ Numeric res;
+ NumericVar result;
+ char buf[DBL_DIG + 100];
+
+ if (isnan(val))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ if (isinf(val))
+ {
+ if (val < 0)
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+ else
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ }
+
+ snprintf(buf, sizeof(buf), "%.*g", DBL_DIG, val);
+
+ init_var(&result);
+
+ /* Assume we need not worry about leading/trailing spaces */
+ (void) set_var_from_str(buf, buf, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+Datum
+numeric_float8(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ char *tmp;
+ Datum result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ PG_RETURN_FLOAT8(get_float8_infinity());
+ else if (NUMERIC_IS_NINF(num))
+ PG_RETURN_FLOAT8(-get_float8_infinity());
+ else
+ PG_RETURN_FLOAT8(get_float8_nan());
+ }
+
+ tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(num)));
+
+ result = DirectFunctionCall1(float8in, CStringGetDatum(tmp));
+
+ pfree(tmp);
+
+ PG_RETURN_DATUM(result);
+}
+
+
+/*
+ * Convert numeric to float8; if out of range, return +/- HUGE_VAL
+ *
+ * (internal helper function, not directly callable from SQL)
+ */
+Datum
+numeric_float8_no_overflow(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ double val;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ val = HUGE_VAL;
+ else if (NUMERIC_IS_NINF(num))
+ val = -HUGE_VAL;
+ else
+ val = get_float8_nan();
+ }
+ else
+ {
+ NumericVar x;
+
+ init_var_from_num(num, &x);
+ val = numericvar_to_double_no_overflow(&x);
+ }
+
+ PG_RETURN_FLOAT8(val);
+}
+
+Datum
+float4_numeric(PG_FUNCTION_ARGS)
+{
+ float4 val = PG_GETARG_FLOAT4(0);
+ Numeric res;
+ NumericVar result;
+ char buf[FLT_DIG + 100];
+
+ if (isnan(val))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ if (isinf(val))
+ {
+ if (val < 0)
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+ else
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ }
+
+ snprintf(buf, sizeof(buf), "%.*g", FLT_DIG, val);
+
+ init_var(&result);
+
+ /* Assume we need not worry about leading/trailing spaces */
+ (void) set_var_from_str(buf, buf, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+}
+
+
+Datum
+numeric_float4(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ char *tmp;
+ Datum result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_PINF(num))
+ PG_RETURN_FLOAT4(get_float4_infinity());
+ else if (NUMERIC_IS_NINF(num))
+ PG_RETURN_FLOAT4(-get_float4_infinity());
+ else
+ PG_RETURN_FLOAT4(get_float4_nan());
+ }
+
+ tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
+ NumericGetDatum(num)));
+
+ result = DirectFunctionCall1(float4in, CStringGetDatum(tmp));
+
+ pfree(tmp);
+
+ PG_RETURN_DATUM(result);
+}
+
+
+Datum
+numeric_pg_lsn(PG_FUNCTION_ARGS)
+{
+ Numeric num = PG_GETARG_NUMERIC(0);
+ NumericVar x;
+ XLogRecPtr result;
+
+ if (NUMERIC_IS_SPECIAL(num))
+ {
+ if (NUMERIC_IS_NAN(num))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert NaN to %s", "pg_lsn")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot convert infinity to %s", "pg_lsn")));
+ }
+
+ /* Convert to variable format and thence to pg_lsn */
+ init_var_from_num(num, &x);
+
+ if (!numericvar_to_uint64(&x, (uint64 *) &result))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("pg_lsn out of range")));
+
+ PG_RETURN_LSN(result);
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Aggregate functions
+ *
+ * The transition datatype for all these aggregates is declared as INTERNAL.
+ * Actually, it's a pointer to a NumericAggState allocated in the aggregate
+ * context. The digit buffers for the NumericVars will be there too.
+ *
+ * On platforms which support 128-bit integers some aggregates instead use a
+ * 128-bit integer based transition datatype to speed up calculations.
+ *
+ * ----------------------------------------------------------------------
+ */
+
+typedef struct NumericAggState
+{
+ bool calcSumX2; /* if true, calculate sumX2 */
+ MemoryContext agg_context; /* context we're calculating in */
+ int64 N; /* count of processed numbers */
+ NumericSumAccum sumX; /* sum of processed numbers */
+ NumericSumAccum sumX2; /* sum of squares of processed numbers */
+ int maxScale; /* maximum scale seen so far */
+ int64 maxScaleCount; /* number of values seen with maximum scale */
+ /* These counts are *not* included in N! Use NA_TOTAL_COUNT() as needed */
+ int64 NaNcount; /* count of NaN values */
+ int64 pInfcount; /* count of +Inf values */
+ int64 nInfcount; /* count of -Inf values */
+} NumericAggState;
+
+#define NA_TOTAL_COUNT(na) \
+ ((na)->N + (na)->NaNcount + (na)->pInfcount + (na)->nInfcount)
+
+/*
+ * Prepare state data for a numeric aggregate function that needs to compute
+ * sum, count and optionally sum of squares of the input.
+ */
+static NumericAggState *
+makeNumericAggState(FunctionCallInfo fcinfo, bool calcSumX2)
+{
+ NumericAggState *state;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state = (NumericAggState *) palloc0(sizeof(NumericAggState));
+ state->calcSumX2 = calcSumX2;
+ state->agg_context = agg_context;
+
+ MemoryContextSwitchTo(old_context);
+
+ return state;
+}
+
+/*
+ * Like makeNumericAggState(), but allocate the state in the current memory
+ * context.
+ */
+static NumericAggState *
+makeNumericAggStateCurrentContext(bool calcSumX2)
+{
+ NumericAggState *state;
+
+ state = (NumericAggState *) palloc0(sizeof(NumericAggState));
+ state->calcSumX2 = calcSumX2;
+ state->agg_context = CurrentMemoryContext;
+
+ return state;
+}
+
+/*
+ * Accumulate a new input value for numeric aggregate functions.
+ */
+static void
+do_numeric_accum(NumericAggState *state, Numeric newval)
+{
+ NumericVar X;
+ NumericVar X2;
+ MemoryContext old_context;
+
+ /* Count NaN/infinity inputs separately from all else */
+ if (NUMERIC_IS_SPECIAL(newval))
+ {
+ if (NUMERIC_IS_PINF(newval))
+ state->pInfcount++;
+ else if (NUMERIC_IS_NINF(newval))
+ state->nInfcount++;
+ else
+ state->NaNcount++;
+ return;
+ }
+
+ /* load processed number in short-lived context */
+ init_var_from_num(newval, &X);
+
+ /*
+ * Track the highest input dscale that we've seen, to support inverse
+ * transitions (see do_numeric_discard).
+ */
+ if (X.dscale > state->maxScale)
+ {
+ state->maxScale = X.dscale;
+ state->maxScaleCount = 1;
+ }
+ else if (X.dscale == state->maxScale)
+ state->maxScaleCount++;
+
+ /* if we need X^2, calculate that in short-lived context */
+ if (state->calcSumX2)
+ {
+ init_var(&X2);
+ mul_var(&X, &X, &X2, X.dscale * 2);
+ }
+
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(state->agg_context);
+
+ state->N++;
+
+ /* Accumulate sums */
+ accum_sum_add(&(state->sumX), &X);
+
+ if (state->calcSumX2)
+ accum_sum_add(&(state->sumX2), &X2);
+
+ MemoryContextSwitchTo(old_context);
+}
+
+/*
+ * Attempt to remove an input value from the aggregated state.
+ *
+ * If the value cannot be removed then the function will return false; the
+ * possible reasons for failing are described below.
+ *
+ * If we aggregate the values 1.01 and 2 then the result will be 3.01.
+ * If we are then asked to un-aggregate the 1.01 then we must fail as we
+ * won't be able to tell what the new aggregated value's dscale should be.
+ * We don't want to return 2.00 (dscale = 2), since the sum's dscale would
+ * have been zero if we'd really aggregated only 2.
+ *
+ * Note: alternatively, we could count the number of inputs with each possible
+ * dscale (up to some sane limit). Not yet clear if it's worth the trouble.
+ */
+static bool
+do_numeric_discard(NumericAggState *state, Numeric newval)
+{
+ NumericVar X;
+ NumericVar X2;
+ MemoryContext old_context;
+
+ /* Count NaN/infinity inputs separately from all else */
+ if (NUMERIC_IS_SPECIAL(newval))
+ {
+ if (NUMERIC_IS_PINF(newval))
+ state->pInfcount--;
+ else if (NUMERIC_IS_NINF(newval))
+ state->nInfcount--;
+ else
+ state->NaNcount--;
+ return true;
+ }
+
+ /* load processed number in short-lived context */
+ init_var_from_num(newval, &X);
+
+ /*
+ * state->sumX's dscale is the maximum dscale of any of the inputs.
+ * Removing the last input with that dscale would require us to recompute
+ * the maximum dscale of the *remaining* inputs, which we cannot do unless
+ * no more non-NaN inputs remain at all. So we report a failure instead,
+ * and force the aggregation to be redone from scratch.
+ */
+ if (X.dscale == state->maxScale)
+ {
+ if (state->maxScaleCount > 1 || state->maxScale == 0)
+ {
+ /*
+ * Some remaining inputs have same dscale, or dscale hasn't gotten
+ * above zero anyway
+ */
+ state->maxScaleCount--;
+ }
+ else if (state->N == 1)
+ {
+ /* No remaining non-NaN inputs at all, so reset maxScale */
+ state->maxScale = 0;
+ state->maxScaleCount = 0;
+ }
+ else
+ {
+ /* Correct new maxScale is uncertain, must fail */
+ return false;
+ }
+ }
+
+ /* if we need X^2, calculate that in short-lived context */
+ if (state->calcSumX2)
+ {
+ init_var(&X2);
+ mul_var(&X, &X, &X2, X.dscale * 2);
+ }
+
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(state->agg_context);
+
+ if (state->N-- > 1)
+ {
+ /* Negate X, to subtract it from the sum */
+ X.sign = (X.sign == NUMERIC_POS ? NUMERIC_NEG : NUMERIC_POS);
+ accum_sum_add(&(state->sumX), &X);
+
+ if (state->calcSumX2)
+ {
+ /* Negate X^2. X^2 is always positive */
+ X2.sign = NUMERIC_NEG;
+ accum_sum_add(&(state->sumX2), &X2);
+ }
+ }
+ else
+ {
+ /* Zero the sums */
+ Assert(state->N == 0);
+
+ accum_sum_reset(&state->sumX);
+ if (state->calcSumX2)
+ accum_sum_reset(&state->sumX2);
+ }
+
+ MemoryContextSwitchTo(old_context);
+
+ return true;
+}
+
+/*
+ * Generic transition function for numeric aggregates that require sumX2.
+ */
+Datum
+numeric_accum(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makeNumericAggState(fcinfo, true);
+
+ if (!PG_ARGISNULL(1))
+ do_numeric_accum(state, PG_GETARG_NUMERIC(1));
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * Generic combine function for numeric aggregates which require sumX2
+ */
+Datum
+numeric_combine(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state1;
+ NumericAggState *state2;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state1 = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+ state2 = PG_ARGISNULL(1) ? NULL : (NumericAggState *) PG_GETARG_POINTER(1);
+
+ if (state2 == NULL)
+ PG_RETURN_POINTER(state1);
+
+ /* manually copy all fields from state2 to state1 */
+ if (state1 == NULL)
+ {
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state1 = makeNumericAggStateCurrentContext(true);
+ state1->N = state2->N;
+ state1->NaNcount = state2->NaNcount;
+ state1->pInfcount = state2->pInfcount;
+ state1->nInfcount = state2->nInfcount;
+ state1->maxScale = state2->maxScale;
+ state1->maxScaleCount = state2->maxScaleCount;
+
+ accum_sum_copy(&state1->sumX, &state2->sumX);
+ accum_sum_copy(&state1->sumX2, &state2->sumX2);
+
+ MemoryContextSwitchTo(old_context);
+
+ PG_RETURN_POINTER(state1);
+ }
+
+ state1->N += state2->N;
+ state1->NaNcount += state2->NaNcount;
+ state1->pInfcount += state2->pInfcount;
+ state1->nInfcount += state2->nInfcount;
+
+ if (state2->N > 0)
+ {
+ /*
+ * These are currently only needed for moving aggregates, but let's do
+ * the right thing anyway...
+ */
+ if (state2->maxScale > state1->maxScale)
+ {
+ state1->maxScale = state2->maxScale;
+ state1->maxScaleCount = state2->maxScaleCount;
+ }
+ else if (state2->maxScale == state1->maxScale)
+ state1->maxScaleCount += state2->maxScaleCount;
+
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ /* Accumulate sums */
+ accum_sum_combine(&state1->sumX, &state2->sumX);
+ accum_sum_combine(&state1->sumX2, &state2->sumX2);
+
+ MemoryContextSwitchTo(old_context);
+ }
+ PG_RETURN_POINTER(state1);
+}
+
+/*
+ * Generic transition function for numeric aggregates that don't require sumX2.
+ */
+Datum
+numeric_avg_accum(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makeNumericAggState(fcinfo, false);
+
+ if (!PG_ARGISNULL(1))
+ do_numeric_accum(state, PG_GETARG_NUMERIC(1));
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * Combine function for numeric aggregates which don't require sumX2
+ */
+Datum
+numeric_avg_combine(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state1;
+ NumericAggState *state2;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state1 = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+ state2 = PG_ARGISNULL(1) ? NULL : (NumericAggState *) PG_GETARG_POINTER(1);
+
+ if (state2 == NULL)
+ PG_RETURN_POINTER(state1);
+
+ /* manually copy all fields from state2 to state1 */
+ if (state1 == NULL)
+ {
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state1 = makeNumericAggStateCurrentContext(false);
+ state1->N = state2->N;
+ state1->NaNcount = state2->NaNcount;
+ state1->pInfcount = state2->pInfcount;
+ state1->nInfcount = state2->nInfcount;
+ state1->maxScale = state2->maxScale;
+ state1->maxScaleCount = state2->maxScaleCount;
+
+ accum_sum_copy(&state1->sumX, &state2->sumX);
+
+ MemoryContextSwitchTo(old_context);
+
+ PG_RETURN_POINTER(state1);
+ }
+
+ state1->N += state2->N;
+ state1->NaNcount += state2->NaNcount;
+ state1->pInfcount += state2->pInfcount;
+ state1->nInfcount += state2->nInfcount;
+
+ if (state2->N > 0)
+ {
+ /*
+ * These are currently only needed for moving aggregates, but let's do
+ * the right thing anyway...
+ */
+ if (state2->maxScale > state1->maxScale)
+ {
+ state1->maxScale = state2->maxScale;
+ state1->maxScaleCount = state2->maxScaleCount;
+ }
+ else if (state2->maxScale == state1->maxScale)
+ state1->maxScaleCount += state2->maxScaleCount;
+
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ /* Accumulate sums */
+ accum_sum_combine(&state1->sumX, &state2->sumX);
+
+ MemoryContextSwitchTo(old_context);
+ }
+ PG_RETURN_POINTER(state1);
+}
+
+/*
+ * numeric_avg_serialize
+ * Serialize NumericAggState for numeric aggregates that don't require
+ * sumX2.
+ */
+Datum
+numeric_avg_serialize(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ StringInfoData buf;
+ bytea *result;
+ NumericVar tmp_var;
+
+ /* Ensure we disallow calling when not in aggregate context */
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state = (NumericAggState *) PG_GETARG_POINTER(0);
+
+ init_var(&tmp_var);
+
+ pq_begintypsend(&buf);
+
+ /* N */
+ pq_sendint64(&buf, state->N);
+
+ /* sumX */
+ accum_sum_final(&state->sumX, &tmp_var);
+ numericvar_serialize(&buf, &tmp_var);
+
+ /* maxScale */
+ pq_sendint32(&buf, state->maxScale);
+
+ /* maxScaleCount */
+ pq_sendint64(&buf, state->maxScaleCount);
+
+ /* NaNcount */
+ pq_sendint64(&buf, state->NaNcount);
+
+ /* pInfcount */
+ pq_sendint64(&buf, state->pInfcount);
+
+ /* nInfcount */
+ pq_sendint64(&buf, state->nInfcount);
+
+ result = pq_endtypsend(&buf);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * numeric_avg_deserialize
+ * Deserialize bytea into NumericAggState for numeric aggregates that
+ * don't require sumX2.
+ */
+Datum
+numeric_avg_deserialize(PG_FUNCTION_ARGS)
+{
+ bytea *sstate;
+ NumericAggState *result;
+ StringInfoData buf;
+ NumericVar tmp_var;
+
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ sstate = PG_GETARG_BYTEA_PP(0);
+
+ init_var(&tmp_var);
+
+ /*
+ * Copy the bytea into a StringInfo so that we can "receive" it using the
+ * standard recv-function infrastructure.
+ */
+ initStringInfo(&buf);
+ appendBinaryStringInfo(&buf,
+ VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate));
+
+ result = makeNumericAggStateCurrentContext(false);
+
+ /* N */
+ result->N = pq_getmsgint64(&buf);
+
+ /* sumX */
+ numericvar_deserialize(&buf, &tmp_var);
+ accum_sum_add(&(result->sumX), &tmp_var);
+
+ /* maxScale */
+ result->maxScale = pq_getmsgint(&buf, 4);
+
+ /* maxScaleCount */
+ result->maxScaleCount = pq_getmsgint64(&buf);
+
+ /* NaNcount */
+ result->NaNcount = pq_getmsgint64(&buf);
+
+ /* pInfcount */
+ result->pInfcount = pq_getmsgint64(&buf);
+
+ /* nInfcount */
+ result->nInfcount = pq_getmsgint64(&buf);
+
+ pq_getmsgend(&buf);
+ pfree(buf.data);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * numeric_serialize
+ * Serialization function for NumericAggState for numeric aggregates that
+ * require sumX2.
+ */
+Datum
+numeric_serialize(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ StringInfoData buf;
+ bytea *result;
+ NumericVar tmp_var;
+
+ /* Ensure we disallow calling when not in aggregate context */
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state = (NumericAggState *) PG_GETARG_POINTER(0);
+
+ init_var(&tmp_var);
+
+ pq_begintypsend(&buf);
+
+ /* N */
+ pq_sendint64(&buf, state->N);
+
+ /* sumX */
+ accum_sum_final(&state->sumX, &tmp_var);
+ numericvar_serialize(&buf, &tmp_var);
+
+ /* sumX2 */
+ accum_sum_final(&state->sumX2, &tmp_var);
+ numericvar_serialize(&buf, &tmp_var);
+
+ /* maxScale */
+ pq_sendint32(&buf, state->maxScale);
+
+ /* maxScaleCount */
+ pq_sendint64(&buf, state->maxScaleCount);
+
+ /* NaNcount */
+ pq_sendint64(&buf, state->NaNcount);
+
+ /* pInfcount */
+ pq_sendint64(&buf, state->pInfcount);
+
+ /* nInfcount */
+ pq_sendint64(&buf, state->nInfcount);
+
+ result = pq_endtypsend(&buf);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * numeric_deserialize
+ * Deserialization function for NumericAggState for numeric aggregates that
+ * require sumX2.
+ */
+Datum
+numeric_deserialize(PG_FUNCTION_ARGS)
+{
+ bytea *sstate;
+ NumericAggState *result;
+ StringInfoData buf;
+ NumericVar tmp_var;
+
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ sstate = PG_GETARG_BYTEA_PP(0);
+
+ init_var(&tmp_var);
+
+ /*
+ * Copy the bytea into a StringInfo so that we can "receive" it using the
+ * standard recv-function infrastructure.
+ */
+ initStringInfo(&buf);
+ appendBinaryStringInfo(&buf,
+ VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate));
+
+ result = makeNumericAggStateCurrentContext(false);
+
+ /* N */
+ result->N = pq_getmsgint64(&buf);
+
+ /* sumX */
+ numericvar_deserialize(&buf, &tmp_var);
+ accum_sum_add(&(result->sumX), &tmp_var);
+
+ /* sumX2 */
+ numericvar_deserialize(&buf, &tmp_var);
+ accum_sum_add(&(result->sumX2), &tmp_var);
+
+ /* maxScale */
+ result->maxScale = pq_getmsgint(&buf, 4);
+
+ /* maxScaleCount */
+ result->maxScaleCount = pq_getmsgint64(&buf);
+
+ /* NaNcount */
+ result->NaNcount = pq_getmsgint64(&buf);
+
+ /* pInfcount */
+ result->pInfcount = pq_getmsgint64(&buf);
+
+ /* nInfcount */
+ result->nInfcount = pq_getmsgint64(&buf);
+
+ pq_getmsgend(&buf);
+ pfree(buf.data);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * Generic inverse transition function for numeric aggregates
+ * (with or without requirement for X^2).
+ */
+Datum
+numeric_accum_inv(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* Should not get here with no state */
+ if (state == NULL)
+ elog(ERROR, "numeric_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+ /* If we fail to perform the inverse transition, return NULL */
+ if (!do_numeric_discard(state, PG_GETARG_NUMERIC(1)))
+ PG_RETURN_NULL();
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+
+/*
+ * Integer data types in general use Numeric accumulators to share code
+ * and avoid risk of overflow.
+ *
+ * However for performance reasons optimized special-purpose accumulator
+ * routines are used when possible.
+ *
+ * On platforms with 128-bit integer support, the 128-bit routines will be
+ * used when sum(X) or sum(X*X) fit into 128-bit.
+ *
+ * For 16 and 32 bit inputs, the N and sum(X) fit into 64-bit so the 64-bit
+ * accumulators will be used for SUM and AVG of these data types.
+ */
+
+#ifdef HAVE_INT128
+typedef struct Int128AggState
+{
+ bool calcSumX2; /* if true, calculate sumX2 */
+ int64 N; /* count of processed numbers */
+ int128 sumX; /* sum of processed numbers */
+ int128 sumX2; /* sum of squares of processed numbers */
+} Int128AggState;
+
+/*
+ * Prepare state data for a 128-bit aggregate function that needs to compute
+ * sum, count and optionally sum of squares of the input.
+ */
+static Int128AggState *
+makeInt128AggState(FunctionCallInfo fcinfo, bool calcSumX2)
+{
+ Int128AggState *state;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state = (Int128AggState *) palloc0(sizeof(Int128AggState));
+ state->calcSumX2 = calcSumX2;
+
+ MemoryContextSwitchTo(old_context);
+
+ return state;
+}
+
+/*
+ * Like makeInt128AggState(), but allocate the state in the current memory
+ * context.
+ */
+static Int128AggState *
+makeInt128AggStateCurrentContext(bool calcSumX2)
+{
+ Int128AggState *state;
+
+ state = (Int128AggState *) palloc0(sizeof(Int128AggState));
+ state->calcSumX2 = calcSumX2;
+
+ return state;
+}
+
+/*
+ * Accumulate a new input value for 128-bit aggregate functions.
+ */
+static void
+do_int128_accum(Int128AggState *state, int128 newval)
+{
+ if (state->calcSumX2)
+ state->sumX2 += newval * newval;
+
+ state->sumX += newval;
+ state->N++;
+}
+
+/*
+ * Remove an input value from the aggregated state.
+ */
+static void
+do_int128_discard(Int128AggState *state, int128 newval)
+{
+ if (state->calcSumX2)
+ state->sumX2 -= newval * newval;
+
+ state->sumX -= newval;
+ state->N--;
+}
+
+typedef Int128AggState PolyNumAggState;
+#define makePolyNumAggState makeInt128AggState
+#define makePolyNumAggStateCurrentContext makeInt128AggStateCurrentContext
+#else
+typedef NumericAggState PolyNumAggState;
+#define makePolyNumAggState makeNumericAggState
+#define makePolyNumAggStateCurrentContext makeNumericAggStateCurrentContext
+#endif
+
+Datum
+int2_accum(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makePolyNumAggState(fcinfo, true);
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_accum(state, (int128) PG_GETARG_INT16(1));
+#else
+ do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT16(1)));
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+int4_accum(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makePolyNumAggState(fcinfo, true);
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_accum(state, (int128) PG_GETARG_INT32(1));
+#else
+ do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT32(1)));
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+int8_accum(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makeNumericAggState(fcinfo, true);
+
+ if (!PG_ARGISNULL(1))
+ do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT64(1)));
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * Combine function for numeric aggregates which require sumX2
+ */
+Datum
+numeric_poly_combine(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state1;
+ PolyNumAggState *state2;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state1 = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+ state2 = PG_ARGISNULL(1) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(1);
+
+ if (state2 == NULL)
+ PG_RETURN_POINTER(state1);
+
+ /* manually copy all fields from state2 to state1 */
+ if (state1 == NULL)
+ {
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state1 = makePolyNumAggState(fcinfo, true);
+ state1->N = state2->N;
+
+#ifdef HAVE_INT128
+ state1->sumX = state2->sumX;
+ state1->sumX2 = state2->sumX2;
+#else
+ accum_sum_copy(&state1->sumX, &state2->sumX);
+ accum_sum_copy(&state1->sumX2, &state2->sumX2);
+#endif
+
+ MemoryContextSwitchTo(old_context);
+
+ PG_RETURN_POINTER(state1);
+ }
+
+ if (state2->N > 0)
+ {
+ state1->N += state2->N;
+
+#ifdef HAVE_INT128
+ state1->sumX += state2->sumX;
+ state1->sumX2 += state2->sumX2;
+#else
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ /* Accumulate sums */
+ accum_sum_combine(&state1->sumX, &state2->sumX);
+ accum_sum_combine(&state1->sumX2, &state2->sumX2);
+
+ MemoryContextSwitchTo(old_context);
+#endif
+
+ }
+ PG_RETURN_POINTER(state1);
+}
+
+/*
+ * numeric_poly_serialize
+ * Serialize PolyNumAggState into bytea for aggregate functions which
+ * require sumX2.
+ */
+Datum
+numeric_poly_serialize(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+ StringInfoData buf;
+ bytea *result;
+ NumericVar tmp_var;
+
+ /* Ensure we disallow calling when not in aggregate context */
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state = (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /*
+ * If the platform supports int128 then sumX and sumX2 will be a 128 bit
+ * integer type. Here we'll convert that into a numeric type so that the
+ * combine state is in the same format for both int128 enabled machines
+ * and machines which don't support that type. The logic here is that one
+ * day we might like to send these over to another server for further
+ * processing and we want a standard format to work with.
+ */
+
+ init_var(&tmp_var);
+
+ pq_begintypsend(&buf);
+
+ /* N */
+ pq_sendint64(&buf, state->N);
+
+ /* sumX */
+#ifdef HAVE_INT128
+ int128_to_numericvar(state->sumX, &tmp_var);
+#else
+ accum_sum_final(&state->sumX, &tmp_var);
+#endif
+ numericvar_serialize(&buf, &tmp_var);
+
+ /* sumX2 */
+#ifdef HAVE_INT128
+ int128_to_numericvar(state->sumX2, &tmp_var);
+#else
+ accum_sum_final(&state->sumX2, &tmp_var);
+#endif
+ numericvar_serialize(&buf, &tmp_var);
+
+ result = pq_endtypsend(&buf);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * numeric_poly_deserialize
+ * Deserialize PolyNumAggState from bytea for aggregate functions which
+ * require sumX2.
+ */
+Datum
+numeric_poly_deserialize(PG_FUNCTION_ARGS)
+{
+ bytea *sstate;
+ PolyNumAggState *result;
+ StringInfoData buf;
+ NumericVar tmp_var;
+
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ sstate = PG_GETARG_BYTEA_PP(0);
+
+ init_var(&tmp_var);
+
+ /*
+ * Copy the bytea into a StringInfo so that we can "receive" it using the
+ * standard recv-function infrastructure.
+ */
+ initStringInfo(&buf);
+ appendBinaryStringInfo(&buf,
+ VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate));
+
+ result = makePolyNumAggStateCurrentContext(false);
+
+ /* N */
+ result->N = pq_getmsgint64(&buf);
+
+ /* sumX */
+ numericvar_deserialize(&buf, &tmp_var);
+#ifdef HAVE_INT128
+ numericvar_to_int128(&tmp_var, &result->sumX);
+#else
+ accum_sum_add(&result->sumX, &tmp_var);
+#endif
+
+ /* sumX2 */
+ numericvar_deserialize(&buf, &tmp_var);
+#ifdef HAVE_INT128
+ numericvar_to_int128(&tmp_var, &result->sumX2);
+#else
+ accum_sum_add(&result->sumX2, &tmp_var);
+#endif
+
+ pq_getmsgend(&buf);
+ pfree(buf.data);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * Transition function for int8 input when we don't need sumX2.
+ */
+Datum
+int8_avg_accum(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Create the state data on the first call */
+ if (state == NULL)
+ state = makePolyNumAggState(fcinfo, false);
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_accum(state, (int128) PG_GETARG_INT64(1));
+#else
+ do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT64(1)));
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+/*
+ * Combine function for PolyNumAggState for aggregates which don't require
+ * sumX2
+ */
+Datum
+int8_avg_combine(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state1;
+ PolyNumAggState *state2;
+ MemoryContext agg_context;
+ MemoryContext old_context;
+
+ if (!AggCheckCallContext(fcinfo, &agg_context))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state1 = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+ state2 = PG_ARGISNULL(1) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(1);
+
+ if (state2 == NULL)
+ PG_RETURN_POINTER(state1);
+
+ /* manually copy all fields from state2 to state1 */
+ if (state1 == NULL)
+ {
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ state1 = makePolyNumAggState(fcinfo, false);
+ state1->N = state2->N;
+
+#ifdef HAVE_INT128
+ state1->sumX = state2->sumX;
+#else
+ accum_sum_copy(&state1->sumX, &state2->sumX);
+#endif
+ MemoryContextSwitchTo(old_context);
+
+ PG_RETURN_POINTER(state1);
+ }
+
+ if (state2->N > 0)
+ {
+ state1->N += state2->N;
+
+#ifdef HAVE_INT128
+ state1->sumX += state2->sumX;
+#else
+ /* The rest of this needs to work in the aggregate context */
+ old_context = MemoryContextSwitchTo(agg_context);
+
+ /* Accumulate sums */
+ accum_sum_combine(&state1->sumX, &state2->sumX);
+
+ MemoryContextSwitchTo(old_context);
+#endif
+
+ }
+ PG_RETURN_POINTER(state1);
+}
+
+/*
+ * int8_avg_serialize
+ * Serialize PolyNumAggState into bytea using the standard
+ * recv-function infrastructure.
+ */
+Datum
+int8_avg_serialize(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+ StringInfoData buf;
+ bytea *result;
+ NumericVar tmp_var;
+
+ /* Ensure we disallow calling when not in aggregate context */
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ state = (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /*
+ * If the platform supports int128 then sumX will be a 128 integer type.
+ * Here we'll convert that into a numeric type so that the combine state
+ * is in the same format for both int128 enabled machines and machines
+ * which don't support that type. The logic here is that one day we might
+ * like to send these over to another server for further processing and we
+ * want a standard format to work with.
+ */
+
+ init_var(&tmp_var);
+
+ pq_begintypsend(&buf);
+
+ /* N */
+ pq_sendint64(&buf, state->N);
+
+ /* sumX */
+#ifdef HAVE_INT128
+ int128_to_numericvar(state->sumX, &tmp_var);
+#else
+ accum_sum_final(&state->sumX, &tmp_var);
+#endif
+ numericvar_serialize(&buf, &tmp_var);
+
+ result = pq_endtypsend(&buf);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * int8_avg_deserialize
+ * Deserialize bytea back into PolyNumAggState.
+ */
+Datum
+int8_avg_deserialize(PG_FUNCTION_ARGS)
+{
+ bytea *sstate;
+ PolyNumAggState *result;
+ StringInfoData buf;
+ NumericVar tmp_var;
+
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ sstate = PG_GETARG_BYTEA_PP(0);
+
+ init_var(&tmp_var);
+
+ /*
+ * Copy the bytea into a StringInfo so that we can "receive" it using the
+ * standard recv-function infrastructure.
+ */
+ initStringInfo(&buf);
+ appendBinaryStringInfo(&buf,
+ VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate));
+
+ result = makePolyNumAggStateCurrentContext(false);
+
+ /* N */
+ result->N = pq_getmsgint64(&buf);
+
+ /* sumX */
+ numericvar_deserialize(&buf, &tmp_var);
+#ifdef HAVE_INT128
+ numericvar_to_int128(&tmp_var, &result->sumX);
+#else
+ accum_sum_add(&result->sumX, &tmp_var);
+#endif
+
+ pq_getmsgend(&buf);
+ pfree(buf.data);
+
+ free_var(&tmp_var);
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * Inverse transition functions to go with the above.
+ */
+
+Datum
+int2_accum_inv(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Should not get here with no state */
+ if (state == NULL)
+ elog(ERROR, "int2_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_discard(state, (int128) PG_GETARG_INT16(1));
+#else
+ /* Should never fail, all inputs have dscale 0 */
+ if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT16(1))))
+ elog(ERROR, "do_numeric_discard failed unexpectedly");
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+int4_accum_inv(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Should not get here with no state */
+ if (state == NULL)
+ elog(ERROR, "int4_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_discard(state, (int128) PG_GETARG_INT32(1));
+#else
+ /* Should never fail, all inputs have dscale 0 */
+ if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT32(1))))
+ elog(ERROR, "do_numeric_discard failed unexpectedly");
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+int8_accum_inv(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* Should not get here with no state */
+ if (state == NULL)
+ elog(ERROR, "int8_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+ /* Should never fail, all inputs have dscale 0 */
+ if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT64(1))))
+ elog(ERROR, "do_numeric_discard failed unexpectedly");
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+int8_avg_accum_inv(PG_FUNCTION_ARGS)
+{
+ PolyNumAggState *state;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* Should not get here with no state */
+ if (state == NULL)
+ elog(ERROR, "int8_avg_accum_inv called with NULL state");
+
+ if (!PG_ARGISNULL(1))
+ {
+#ifdef HAVE_INT128
+ do_int128_discard(state, (int128) PG_GETARG_INT64(1));
+#else
+ /* Should never fail, all inputs have dscale 0 */
+ if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT64(1))))
+ elog(ERROR, "do_numeric_discard failed unexpectedly");
+#endif
+ }
+
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+numeric_poly_sum(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ Numeric res;
+ NumericVar result;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* If there were no non-null inputs, return NULL */
+ if (state == NULL || state->N == 0)
+ PG_RETURN_NULL();
+
+ init_var(&result);
+
+ int128_to_numericvar(state->sumX, &result);
+
+ res = make_result(&result);
+
+ free_var(&result);
+
+ PG_RETURN_NUMERIC(res);
+#else
+ return numeric_sum(fcinfo);
+#endif
+}
+
+Datum
+numeric_poly_avg(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ NumericVar result;
+ Datum countd,
+ sumd;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ /* If there were no non-null inputs, return NULL */
+ if (state == NULL || state->N == 0)
+ PG_RETURN_NULL();
+
+ init_var(&result);
+
+ int128_to_numericvar(state->sumX, &result);
+
+ countd = NumericGetDatum(int64_to_numeric(state->N));
+ sumd = NumericGetDatum(make_result(&result));
+
+ free_var(&result);
+
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_div, sumd, countd));
+#else
+ return numeric_avg(fcinfo);
+#endif
+}
+
+Datum
+numeric_avg(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ Datum N_datum;
+ Datum sumX_datum;
+ NumericVar sumX_var;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* If there were no non-null inputs, return NULL */
+ if (state == NULL || NA_TOTAL_COUNT(state) == 0)
+ PG_RETURN_NULL();
+
+ if (state->NaNcount > 0) /* there was at least one NaN input */
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ /* adding plus and minus infinities gives NaN */
+ if (state->pInfcount > 0 && state->nInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ if (state->pInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ if (state->nInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+
+ N_datum = NumericGetDatum(int64_to_numeric(state->N));
+
+ init_var(&sumX_var);
+ accum_sum_final(&state->sumX, &sumX_var);
+ sumX_datum = NumericGetDatum(make_result(&sumX_var));
+ free_var(&sumX_var);
+
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_div, sumX_datum, N_datum));
+}
+
+Datum
+numeric_sum(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ NumericVar sumX_var;
+ Numeric result;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ /* If there were no non-null inputs, return NULL */
+ if (state == NULL || NA_TOTAL_COUNT(state) == 0)
+ PG_RETURN_NULL();
+
+ if (state->NaNcount > 0) /* there was at least one NaN input */
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+
+ /* adding plus and minus infinities gives NaN */
+ if (state->pInfcount > 0 && state->nInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_nan));
+ if (state->pInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_pinf));
+ if (state->nInfcount > 0)
+ PG_RETURN_NUMERIC(make_result(&const_ninf));
+
+ init_var(&sumX_var);
+ accum_sum_final(&state->sumX, &sumX_var);
+ result = make_result(&sumX_var);
+ free_var(&sumX_var);
+
+ PG_RETURN_NUMERIC(result);
+}
+
+/*
+ * Workhorse routine for the standard deviance and variance
+ * aggregates. 'state' is aggregate's transition state.
+ * 'variance' specifies whether we should calculate the
+ * variance or the standard deviation. 'sample' indicates whether the
+ * caller is interested in the sample or the population
+ * variance/stddev.
+ *
+ * If appropriate variance statistic is undefined for the input,
+ * *is_null is set to true and NULL is returned.
+ */
+static Numeric
+numeric_stddev_internal(NumericAggState *state,
+ bool variance, bool sample,
+ bool *is_null)
+{
+ Numeric res;
+ NumericVar vN,
+ vsumX,
+ vsumX2,
+ vNminus1;
+ int64 totCount;
+ int rscale;
+
+ /*
+ * Sample stddev and variance are undefined when N <= 1; population stddev
+ * is undefined when N == 0. Return NULL in either case (note that NaNs
+ * and infinities count as normal inputs for this purpose).
+ */
+ if (state == NULL || (totCount = NA_TOTAL_COUNT(state)) == 0)
+ {
+ *is_null = true;
+ return NULL;
+ }
+
+ if (sample && totCount <= 1)
+ {
+ *is_null = true;
+ return NULL;
+ }
+
+ *is_null = false;
+
+ /*
+ * Deal with NaN and infinity cases. By analogy to the behavior of the
+ * float8 functions, any infinity input produces NaN output.
+ */
+ if (state->NaNcount > 0 || state->pInfcount > 0 || state->nInfcount > 0)
+ return make_result(&const_nan);
+
+ /* OK, normal calculation applies */
+ init_var(&vN);
+ init_var(&vsumX);
+ init_var(&vsumX2);
+
+ int64_to_numericvar(state->N, &vN);
+ accum_sum_final(&(state->sumX), &vsumX);
+ accum_sum_final(&(state->sumX2), &vsumX2);
+
+ init_var(&vNminus1);
+ sub_var(&vN, &const_one, &vNminus1);
+
+ /* compute rscale for mul_var calls */
+ rscale = vsumX.dscale * 2;
+
+ mul_var(&vsumX, &vsumX, &vsumX, rscale); /* vsumX = sumX * sumX */
+ mul_var(&vN, &vsumX2, &vsumX2, rscale); /* vsumX2 = N * sumX2 */
+ sub_var(&vsumX2, &vsumX, &vsumX2); /* N * sumX2 - sumX * sumX */
+
+ if (cmp_var(&vsumX2, &const_zero) <= 0)
+ {
+ /* Watch out for roundoff error producing a negative numerator */
+ res = make_result(&const_zero);
+ }
+ else
+ {
+ if (sample)
+ mul_var(&vN, &vNminus1, &vNminus1, 0); /* N * (N - 1) */
+ else
+ mul_var(&vN, &vN, &vNminus1, 0); /* N * N */
+ rscale = select_div_scale(&vsumX2, &vNminus1);
+ div_var(&vsumX2, &vNminus1, &vsumX, rscale, true); /* variance */
+ if (!variance)
+ sqrt_var(&vsumX, &vsumX, rscale); /* stddev */
+
+ res = make_result(&vsumX);
+ }
+
+ free_var(&vNminus1);
+ free_var(&vsumX);
+ free_var(&vsumX2);
+
+ return res;
+}
+
+Datum
+numeric_var_samp(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_stddev_internal(state, true, true, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+}
+
+Datum
+numeric_stddev_samp(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_stddev_internal(state, false, true, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+}
+
+Datum
+numeric_var_pop(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_stddev_internal(state, true, false, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+}
+
+Datum
+numeric_stddev_pop(PG_FUNCTION_ARGS)
+{
+ NumericAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_stddev_internal(state, false, false, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+}
+
+#ifdef HAVE_INT128
+static Numeric
+numeric_poly_stddev_internal(Int128AggState *state,
+ bool variance, bool sample,
+ bool *is_null)
+{
+ NumericAggState numstate;
+ Numeric res;
+
+ /* Initialize an empty agg state */
+ memset(&numstate, 0, sizeof(NumericAggState));
+
+ if (state)
+ {
+ NumericVar tmp_var;
+
+ numstate.N = state->N;
+
+ init_var(&tmp_var);
+
+ int128_to_numericvar(state->sumX, &tmp_var);
+ accum_sum_add(&numstate.sumX, &tmp_var);
+
+ int128_to_numericvar(state->sumX2, &tmp_var);
+ accum_sum_add(&numstate.sumX2, &tmp_var);
+
+ free_var(&tmp_var);
+ }
+
+ res = numeric_stddev_internal(&numstate, variance, sample, is_null);
+
+ if (numstate.sumX.ndigits > 0)
+ {
+ pfree(numstate.sumX.pos_digits);
+ pfree(numstate.sumX.neg_digits);
+ }
+ if (numstate.sumX2.ndigits > 0)
+ {
+ pfree(numstate.sumX2.pos_digits);
+ pfree(numstate.sumX2.neg_digits);
+ }
+
+ return res;
+}
+#endif
+
+Datum
+numeric_poly_var_samp(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_poly_stddev_internal(state, true, true, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+#else
+ return numeric_var_samp(fcinfo);
+#endif
+}
+
+Datum
+numeric_poly_stddev_samp(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_poly_stddev_internal(state, false, true, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+#else
+ return numeric_stddev_samp(fcinfo);
+#endif
+}
+
+Datum
+numeric_poly_var_pop(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_poly_stddev_internal(state, true, false, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+#else
+ return numeric_var_pop(fcinfo);
+#endif
+}
+
+Datum
+numeric_poly_stddev_pop(PG_FUNCTION_ARGS)
+{
+#ifdef HAVE_INT128
+ PolyNumAggState *state;
+ Numeric res;
+ bool is_null;
+
+ state = PG_ARGISNULL(0) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(0);
+
+ res = numeric_poly_stddev_internal(state, false, false, &is_null);
+
+ if (is_null)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_NUMERIC(res);
+#else
+ return numeric_stddev_pop(fcinfo);
+#endif
+}
+
+/*
+ * SUM transition functions for integer datatypes.
+ *
+ * To avoid overflow, we use accumulators wider than the input datatype.
+ * A Numeric accumulator is needed for int8 input; for int4 and int2
+ * inputs, we use int8 accumulators which should be sufficient for practical
+ * purposes. (The latter two therefore don't really belong in this file,
+ * but we keep them here anyway.)
+ *
+ * Because SQL defines the SUM() of no values to be NULL, not zero,
+ * the initial condition of the transition data value needs to be NULL. This
+ * means we can't rely on ExecAgg to automatically insert the first non-null
+ * data value into the transition data: it doesn't know how to do the type
+ * conversion. The upshot is that these routines have to be marked non-strict
+ * and handle substitution of the first non-null input themselves.
+ *
+ * Note: these functions are used only in plain aggregation mode.
+ * In moving-aggregate mode, we use intX_avg_accum and intX_avg_accum_inv.
+ */
+
+Datum
+int2_sum(PG_FUNCTION_ARGS)
+{
+ int64 newval;
+
+ if (PG_ARGISNULL(0))
+ {
+ /* No non-null input seen so far... */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL(); /* still no non-null */
+ /* This is the first non-null input. */
+ newval = (int64) PG_GETARG_INT16(1);
+ PG_RETURN_INT64(newval);
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to avoid palloc overhead. If not, we need to return
+ * the new value of the transition variable. (If int8 is pass-by-value,
+ * then of course this is useless as well as incorrect, so just ifdef it
+ * out.)
+ */
+#ifndef USE_FLOAT8_BYVAL /* controls int8 too */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ int64 *oldsum = (int64 *) PG_GETARG_POINTER(0);
+
+ /* Leave the running sum unchanged in the new input is null */
+ if (!PG_ARGISNULL(1))
+ *oldsum = *oldsum + (int64) PG_GETARG_INT16(1);
+
+ PG_RETURN_POINTER(oldsum);
+ }
+ else
+#endif
+ {
+ int64 oldsum = PG_GETARG_INT64(0);
+
+ /* Leave sum unchanged if new input is null. */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_INT64(oldsum);
+
+ /* OK to do the addition. */
+ newval = oldsum + (int64) PG_GETARG_INT16(1);
+
+ PG_RETURN_INT64(newval);
+ }
+}
+
+Datum
+int4_sum(PG_FUNCTION_ARGS)
+{
+ int64 newval;
+
+ if (PG_ARGISNULL(0))
+ {
+ /* No non-null input seen so far... */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL(); /* still no non-null */
+ /* This is the first non-null input. */
+ newval = (int64) PG_GETARG_INT32(1);
+ PG_RETURN_INT64(newval);
+ }
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to avoid palloc overhead. If not, we need to return
+ * the new value of the transition variable. (If int8 is pass-by-value,
+ * then of course this is useless as well as incorrect, so just ifdef it
+ * out.)
+ */
+#ifndef USE_FLOAT8_BYVAL /* controls int8 too */
+ if (AggCheckCallContext(fcinfo, NULL))
+ {
+ int64 *oldsum = (int64 *) PG_GETARG_POINTER(0);
+
+ /* Leave the running sum unchanged in the new input is null */
+ if (!PG_ARGISNULL(1))
+ *oldsum = *oldsum + (int64) PG_GETARG_INT32(1);
+
+ PG_RETURN_POINTER(oldsum);
+ }
+ else
+#endif
+ {
+ int64 oldsum = PG_GETARG_INT64(0);
+
+ /* Leave sum unchanged if new input is null. */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_INT64(oldsum);
+
+ /* OK to do the addition. */
+ newval = oldsum + (int64) PG_GETARG_INT32(1);
+
+ PG_RETURN_INT64(newval);
+ }
+}
+
+/*
+ * Note: this function is obsolete, it's no longer used for SUM(int8).
+ */
+Datum
+int8_sum(PG_FUNCTION_ARGS)
+{
+ Numeric oldsum;
+
+ if (PG_ARGISNULL(0))
+ {
+ /* No non-null input seen so far... */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL(); /* still no non-null */
+ /* This is the first non-null input. */
+ PG_RETURN_NUMERIC(int64_to_numeric(PG_GETARG_INT64(1)));
+ }
+
+ /*
+ * Note that we cannot special-case the aggregate case here, as we do for
+ * int2_sum and int4_sum: numeric is of variable size, so we cannot modify
+ * our first parameter in-place.
+ */
+
+ oldsum = PG_GETARG_NUMERIC(0);
+
+ /* Leave sum unchanged if new input is null. */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NUMERIC(oldsum);
+
+ /* OK to do the addition. */
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_add,
+ NumericGetDatum(oldsum),
+ NumericGetDatum(int64_to_numeric(PG_GETARG_INT64(1)))));
+}
+
+
+/*
+ * Routines for avg(int2) and avg(int4). The transition datatype
+ * is a two-element int8 array, holding count and sum.
+ *
+ * These functions are also used for sum(int2) and sum(int4) when
+ * operating in moving-aggregate mode, since for correct inverse transitions
+ * we need to count the inputs.
+ */
+
+typedef struct Int8TransTypeData
+{
+ int64 count;
+ int64 sum;
+} Int8TransTypeData;
+
+Datum
+int2_avg_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray;
+ int16 newval = PG_GETARG_INT16(1);
+ Int8TransTypeData *transdata;
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we need to make
+ * a copy of it before scribbling on it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ transarray = PG_GETARG_ARRAYTYPE_P(0);
+ else
+ transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+ transdata->count++;
+ transdata->sum += newval;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+}
+
+Datum
+int4_avg_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray;
+ int32 newval = PG_GETARG_INT32(1);
+ Int8TransTypeData *transdata;
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we need to make
+ * a copy of it before scribbling on it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ transarray = PG_GETARG_ARRAYTYPE_P(0);
+ else
+ transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+ transdata->count++;
+ transdata->sum += newval;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+}
+
+Datum
+int4_avg_combine(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray1;
+ ArrayType *transarray2;
+ Int8TransTypeData *state1;
+ Int8TransTypeData *state2;
+
+ if (!AggCheckCallContext(fcinfo, NULL))
+ elog(ERROR, "aggregate function called in non-aggregate context");
+
+ transarray1 = PG_GETARG_ARRAYTYPE_P(0);
+ transarray2 = PG_GETARG_ARRAYTYPE_P(1);
+
+ if (ARR_HASNULL(transarray1) ||
+ ARR_SIZE(transarray1) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ if (ARR_HASNULL(transarray2) ||
+ ARR_SIZE(transarray2) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ state1 = (Int8TransTypeData *) ARR_DATA_PTR(transarray1);
+ state2 = (Int8TransTypeData *) ARR_DATA_PTR(transarray2);
+
+ state1->count += state2->count;
+ state1->sum += state2->sum;
+
+ PG_RETURN_ARRAYTYPE_P(transarray1);
+}
+
+Datum
+int2_avg_accum_inv(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray;
+ int16 newval = PG_GETARG_INT16(1);
+ Int8TransTypeData *transdata;
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we need to make
+ * a copy of it before scribbling on it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ transarray = PG_GETARG_ARRAYTYPE_P(0);
+ else
+ transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+ transdata->count--;
+ transdata->sum -= newval;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+}
+
+Datum
+int4_avg_accum_inv(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray;
+ int32 newval = PG_GETARG_INT32(1);
+ Int8TransTypeData *transdata;
+
+ /*
+ * If we're invoked as an aggregate, we can cheat and modify our first
+ * parameter in-place to reduce palloc overhead. Otherwise we need to make
+ * a copy of it before scribbling on it.
+ */
+ if (AggCheckCallContext(fcinfo, NULL))
+ transarray = PG_GETARG_ARRAYTYPE_P(0);
+ else
+ transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+ transdata->count--;
+ transdata->sum -= newval;
+
+ PG_RETURN_ARRAYTYPE_P(transarray);
+}
+
+Datum
+int8_avg(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ Int8TransTypeData *transdata;
+ Datum countd,
+ sumd;
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+
+ /* SQL defines AVG of no values to be NULL */
+ if (transdata->count == 0)
+ PG_RETURN_NULL();
+
+ countd = NumericGetDatum(int64_to_numeric(transdata->count));
+ sumd = NumericGetDatum(int64_to_numeric(transdata->sum));
+
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_div, sumd, countd));
+}
+
+/*
+ * SUM(int2) and SUM(int4) both return int8, so we can use this
+ * final function for both.
+ */
+Datum
+int2int4_sum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ Int8TransTypeData *transdata;
+
+ if (ARR_HASNULL(transarray) ||
+ ARR_SIZE(transarray) != ARR_OVERHEAD_NONULLS(1) + sizeof(Int8TransTypeData))
+ elog(ERROR, "expected 2-element int8 array");
+ transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
+
+ /* SQL defines SUM of no values to be NULL */
+ if (transdata->count == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(Int64GetDatumFast(transdata->sum));
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Debug support
+ *
+ * ----------------------------------------------------------------------
+ */
+
+#ifdef NUMERIC_DEBUG
+
+/*
+ * dump_numeric() - Dump a value in the db storage format for debugging
+ */
+static void
+dump_numeric(const char *str, Numeric num)
+{
+ NumericDigit *digits = NUMERIC_DIGITS(num);
+ int ndigits;
+ int i;
+
+ ndigits = NUMERIC_NDIGITS(num);
+
+ printf("%s: NUMERIC w=%d d=%d ", str,
+ NUMERIC_WEIGHT(num), NUMERIC_DSCALE(num));
+ switch (NUMERIC_SIGN(num))
+ {
+ case NUMERIC_POS:
+ printf("POS");
+ break;
+ case NUMERIC_NEG:
+ printf("NEG");
+ break;
+ case NUMERIC_NAN:
+ printf("NaN");
+ break;
+ case NUMERIC_PINF:
+ printf("Infinity");
+ break;
+ case NUMERIC_NINF:
+ printf("-Infinity");
+ break;
+ default:
+ printf("SIGN=0x%x", NUMERIC_SIGN(num));
+ break;
+ }
+
+ for (i = 0; i < ndigits; i++)
+ printf(" %0*d", DEC_DIGITS, digits[i]);
+ printf("\n");
+}
+
+
+/*
+ * dump_var() - Dump a value in the variable format for debugging
+ */
+static void
+dump_var(const char *str, NumericVar *var)
+{
+ int i;
+
+ printf("%s: VAR w=%d d=%d ", str, var->weight, var->dscale);
+ switch (var->sign)
+ {
+ case NUMERIC_POS:
+ printf("POS");
+ break;
+ case NUMERIC_NEG:
+ printf("NEG");
+ break;
+ case NUMERIC_NAN:
+ printf("NaN");
+ break;
+ case NUMERIC_PINF:
+ printf("Infinity");
+ break;
+ case NUMERIC_NINF:
+ printf("-Infinity");
+ break;
+ default:
+ printf("SIGN=0x%x", var->sign);
+ break;
+ }
+
+ for (i = 0; i < var->ndigits; i++)
+ printf(" %0*d", DEC_DIGITS, var->digits[i]);
+
+ printf("\n");
+}
+#endif /* NUMERIC_DEBUG */
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Local functions follow
+ *
+ * In general, these do not support "special" (NaN or infinity) inputs;
+ * callers should handle those possibilities first.
+ * (There are one or two exceptions, noted in their header comments.)
+ *
+ * ----------------------------------------------------------------------
+ */
+
+
+/*
+ * alloc_var() -
+ *
+ * Allocate a digit buffer of ndigits digits (plus a spare digit for rounding)
+ */
+static void
+alloc_var(NumericVar *var, int ndigits)
+{
+ digitbuf_free(var->buf);
+ var->buf = digitbuf_alloc(ndigits + 1);
+ var->buf[0] = 0; /* spare digit for rounding */
+ var->digits = var->buf + 1;
+ var->ndigits = ndigits;
+}
+
+
+/*
+ * free_var() -
+ *
+ * Return the digit buffer of a variable to the free pool
+ */
+static void
+free_var(NumericVar *var)
+{
+ digitbuf_free(var->buf);
+ var->buf = NULL;
+ var->digits = NULL;
+ var->sign = NUMERIC_NAN;
+}
+
+
+/*
+ * zero_var() -
+ *
+ * Set a variable to ZERO.
+ * Note: its dscale is not touched.
+ */
+static void
+zero_var(NumericVar *var)
+{
+ digitbuf_free(var->buf);
+ var->buf = NULL;
+ var->digits = NULL;
+ var->ndigits = 0;
+ var->weight = 0; /* by convention; doesn't really matter */
+ var->sign = NUMERIC_POS; /* anything but NAN... */
+}
+
+
+/*
+ * set_var_from_str()
+ *
+ * Parse a string and put the number into a variable
+ *
+ * This function does not handle leading or trailing spaces. It returns
+ * the end+1 position parsed, so that caller can check for trailing
+ * spaces/garbage if deemed necessary.
+ *
+ * cp is the place to actually start parsing; str is what to use in error
+ * reports. (Typically cp would be the same except advanced over spaces.)
+ */
+static const char *
+set_var_from_str(const char *str, const char *cp, NumericVar *dest)
+{
+ bool have_dp = false;
+ int i;
+ unsigned char *decdigits;
+ int sign = NUMERIC_POS;
+ int dweight = -1;
+ int ddigits;
+ int dscale = 0;
+ int weight;
+ int ndigits;
+ int offset;
+ NumericDigit *digits;
+
+ /*
+ * We first parse the string to extract decimal digits and determine the
+ * correct decimal weight. Then convert to NBASE representation.
+ */
+ switch (*cp)
+ {
+ case '+':
+ sign = NUMERIC_POS;
+ cp++;
+ break;
+
+ case '-':
+ sign = NUMERIC_NEG;
+ cp++;
+ break;
+ }
+
+ if (*cp == '.')
+ {
+ have_dp = true;
+ cp++;
+ }
+
+ if (!isdigit((unsigned char) *cp))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric", str)));
+
+ decdigits = (unsigned char *) palloc(strlen(cp) + DEC_DIGITS * 2);
+
+ /* leading padding for digit alignment later */
+ memset(decdigits, 0, DEC_DIGITS);
+ i = DEC_DIGITS;
+
+ while (*cp)
+ {
+ if (isdigit((unsigned char) *cp))
+ {
+ decdigits[i++] = *cp++ - '0';
+ if (!have_dp)
+ dweight++;
+ else
+ dscale++;
+ }
+ else if (*cp == '.')
+ {
+ if (have_dp)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric", str)));
+ have_dp = true;
+ cp++;
+ }
+ else
+ break;
+ }
+
+ ddigits = i - DEC_DIGITS;
+ /* trailing padding for digit alignment later */
+ memset(decdigits + i, 0, DEC_DIGITS - 1);
+
+ /* Handle exponent, if any */
+ if (*cp == 'e' || *cp == 'E')
+ {
+ long exponent;
+ char *endptr;
+
+ cp++;
+ exponent = strtol(cp, &endptr, 10);
+ if (endptr == cp)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric", str)));
+ cp = endptr;
+
+ /*
+ * At this point, dweight and dscale can't be more than about
+ * INT_MAX/2 due to the MaxAllocSize limit on string length, so
+ * constraining the exponent similarly should be enough to prevent
+ * integer overflow in this function. If the value is too large to
+ * fit in storage format, make_result() will complain about it later;
+ * for consistency use the same ereport errcode/text as make_result().
+ */
+ if (exponent >= INT_MAX / 2 || exponent <= -(INT_MAX / 2))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ dweight += (int) exponent;
+ dscale -= (int) exponent;
+ if (dscale < 0)
+ dscale = 0;
+ }
+
+ /*
+ * Okay, convert pure-decimal representation to base NBASE. First we need
+ * to determine the converted weight and ndigits. offset is the number of
+ * decimal zeroes to insert before the first given digit to have a
+ * correctly aligned first NBASE digit.
+ */
+ if (dweight >= 0)
+ weight = (dweight + 1 + DEC_DIGITS - 1) / DEC_DIGITS - 1;
+ else
+ weight = -((-dweight - 1) / DEC_DIGITS + 1);
+ offset = (weight + 1) * DEC_DIGITS - (dweight + 1);
+ ndigits = (ddigits + offset + DEC_DIGITS - 1) / DEC_DIGITS;
+
+ alloc_var(dest, ndigits);
+ dest->sign = sign;
+ dest->weight = weight;
+ dest->dscale = dscale;
+
+ i = DEC_DIGITS - offset;
+ digits = dest->digits;
+
+ while (ndigits-- > 0)
+ {
+#if DEC_DIGITS == 4
+ *digits++ = ((decdigits[i] * 10 + decdigits[i + 1]) * 10 +
+ decdigits[i + 2]) * 10 + decdigits[i + 3];
+#elif DEC_DIGITS == 2
+ *digits++ = decdigits[i] * 10 + decdigits[i + 1];
+#elif DEC_DIGITS == 1
+ *digits++ = decdigits[i];
+#else
+#error unsupported NBASE
+#endif
+ i += DEC_DIGITS;
+ }
+
+ pfree(decdigits);
+
+ /* Strip any leading/trailing zeroes, and normalize weight if zero */
+ strip_var(dest);
+
+ /* Return end+1 position for caller */
+ return cp;
+}
+
+
+/*
+ * set_var_from_num() -
+ *
+ * Convert the packed db format into a variable
+ */
+static void
+set_var_from_num(Numeric num, NumericVar *dest)
+{
+ int ndigits;
+
+ ndigits = NUMERIC_NDIGITS(num);
+
+ alloc_var(dest, ndigits);
+
+ dest->weight = NUMERIC_WEIGHT(num);
+ dest->sign = NUMERIC_SIGN(num);
+ dest->dscale = NUMERIC_DSCALE(num);
+
+ memcpy(dest->digits, NUMERIC_DIGITS(num), ndigits * sizeof(NumericDigit));
+}
+
+
+/*
+ * init_var_from_num() -
+ *
+ * Initialize a variable from packed db format. The digits array is not
+ * copied, which saves some cycles when the resulting var is not modified.
+ * Also, there's no need to call free_var(), as long as you don't assign any
+ * other value to it (with set_var_* functions, or by using the var as the
+ * destination of a function like add_var())
+ *
+ * CAUTION: Do not modify the digits buffer of a var initialized with this
+ * function, e.g by calling round_var() or trunc_var(), as the changes will
+ * propagate to the original Numeric! It's OK to use it as the destination
+ * argument of one of the calculational functions, though.
+ */
+static void
+init_var_from_num(Numeric num, NumericVar *dest)
+{
+ dest->ndigits = NUMERIC_NDIGITS(num);
+ dest->weight = NUMERIC_WEIGHT(num);
+ dest->sign = NUMERIC_SIGN(num);
+ dest->dscale = NUMERIC_DSCALE(num);
+ dest->digits = NUMERIC_DIGITS(num);
+ dest->buf = NULL; /* digits array is not palloc'd */
+}
+
+
+/*
+ * set_var_from_var() -
+ *
+ * Copy one variable into another
+ */
+static void
+set_var_from_var(const NumericVar *value, NumericVar *dest)
+{
+ NumericDigit *newbuf;
+
+ newbuf = digitbuf_alloc(value->ndigits + 1);
+ newbuf[0] = 0; /* spare digit for rounding */
+ if (value->ndigits > 0) /* else value->digits might be null */
+ memcpy(newbuf + 1, value->digits,
+ value->ndigits * sizeof(NumericDigit));
+
+ digitbuf_free(dest->buf);
+
+ memmove(dest, value, sizeof(NumericVar));
+ dest->buf = newbuf;
+ dest->digits = newbuf + 1;
+}
+
+
+/*
+ * get_str_from_var() -
+ *
+ * Convert a var to text representation (guts of numeric_out).
+ * The var is displayed to the number of digits indicated by its dscale.
+ * Returns a palloc'd string.
+ */
+static char *
+get_str_from_var(const NumericVar *var)
+{
+ int dscale;
+ char *str;
+ char *cp;
+ char *endcp;
+ int i;
+ int d;
+ NumericDigit dig;
+
+#if DEC_DIGITS > 1
+ NumericDigit d1;
+#endif
+
+ dscale = var->dscale;
+
+ /*
+ * Allocate space for the result.
+ *
+ * i is set to the # of decimal digits before decimal point. dscale is the
+ * # of decimal digits we will print after decimal point. We may generate
+ * as many as DEC_DIGITS-1 excess digits at the end, and in addition we
+ * need room for sign, decimal point, null terminator.
+ */
+ i = (var->weight + 1) * DEC_DIGITS;
+ if (i <= 0)
+ i = 1;
+
+ str = palloc(i + dscale + DEC_DIGITS + 2);
+ cp = str;
+
+ /*
+ * Output a dash for negative values
+ */
+ if (var->sign == NUMERIC_NEG)
+ *cp++ = '-';
+
+ /*
+ * Output all digits before the decimal point
+ */
+ if (var->weight < 0)
+ {
+ d = var->weight + 1;
+ *cp++ = '0';
+ }
+ else
+ {
+ for (d = 0; d <= var->weight; d++)
+ {
+ dig = (d < var->ndigits) ? var->digits[d] : 0;
+ /* In the first digit, suppress extra leading decimal zeroes */
+#if DEC_DIGITS == 4
+ {
+ bool putit = (d > 0);
+
+ d1 = dig / 1000;
+ dig -= d1 * 1000;
+ putit |= (d1 > 0);
+ if (putit)
+ *cp++ = d1 + '0';
+ d1 = dig / 100;
+ dig -= d1 * 100;
+ putit |= (d1 > 0);
+ if (putit)
+ *cp++ = d1 + '0';
+ d1 = dig / 10;
+ dig -= d1 * 10;
+ putit |= (d1 > 0);
+ if (putit)
+ *cp++ = d1 + '0';
+ *cp++ = dig + '0';
+ }
+#elif DEC_DIGITS == 2
+ d1 = dig / 10;
+ dig -= d1 * 10;
+ if (d1 > 0 || d > 0)
+ *cp++ = d1 + '0';
+ *cp++ = dig + '0';
+#elif DEC_DIGITS == 1
+ *cp++ = dig + '0';
+#else
+#error unsupported NBASE
+#endif
+ }
+ }
+
+ /*
+ * If requested, output a decimal point and all the digits that follow it.
+ * We initially put out a multiple of DEC_DIGITS digits, then truncate if
+ * needed.
+ */
+ if (dscale > 0)
+ {
+ *cp++ = '.';
+ endcp = cp + dscale;
+ for (i = 0; i < dscale; d++, i += DEC_DIGITS)
+ {
+ dig = (d >= 0 && d < var->ndigits) ? var->digits[d] : 0;
+#if DEC_DIGITS == 4
+ d1 = dig / 1000;
+ dig -= d1 * 1000;
+ *cp++ = d1 + '0';
+ d1 = dig / 100;
+ dig -= d1 * 100;
+ *cp++ = d1 + '0';
+ d1 = dig / 10;
+ dig -= d1 * 10;
+ *cp++ = d1 + '0';
+ *cp++ = dig + '0';
+#elif DEC_DIGITS == 2
+ d1 = dig / 10;
+ dig -= d1 * 10;
+ *cp++ = d1 + '0';
+ *cp++ = dig + '0';
+#elif DEC_DIGITS == 1
+ *cp++ = dig + '0';
+#else
+#error unsupported NBASE
+#endif
+ }
+ cp = endcp;
+ }
+
+ /*
+ * terminate the string and return it
+ */
+ *cp = '\0';
+ return str;
+}
+
+/*
+ * get_str_from_var_sci() -
+ *
+ * Convert a var to a normalised scientific notation text representation.
+ * This function does the heavy lifting for numeric_out_sci().
+ *
+ * This notation has the general form a * 10^b, where a is known as the
+ * "significand" and b is known as the "exponent".
+ *
+ * Because we can't do superscript in ASCII (and because we want to copy
+ * printf's behaviour) we display the exponent using E notation, with a
+ * minimum of two exponent digits.
+ *
+ * For example, the value 1234 could be output as 1.2e+03.
+ *
+ * We assume that the exponent can fit into an int32.
+ *
+ * rscale is the number of decimal digits desired after the decimal point in
+ * the output, negative values will be treated as meaning zero.
+ *
+ * Returns a palloc'd string.
+ */
+static char *
+get_str_from_var_sci(const NumericVar *var, int rscale)
+{
+ int32 exponent;
+ NumericVar tmp_var;
+ size_t len;
+ char *str;
+ char *sig_out;
+
+ if (rscale < 0)
+ rscale = 0;
+
+ /*
+ * Determine the exponent of this number in normalised form.
+ *
+ * This is the exponent required to represent the number with only one
+ * significant digit before the decimal place.
+ */
+ if (var->ndigits > 0)
+ {
+ exponent = (var->weight + 1) * DEC_DIGITS;
+
+ /*
+ * Compensate for leading decimal zeroes in the first numeric digit by
+ * decrementing the exponent.
+ */
+ exponent -= DEC_DIGITS - (int) log10(var->digits[0]);
+ }
+ else
+ {
+ /*
+ * If var has no digits, then it must be zero.
+ *
+ * Zero doesn't technically have a meaningful exponent in normalised
+ * notation, but we just display the exponent as zero for consistency
+ * of output.
+ */
+ exponent = 0;
+ }
+
+ /*
+ * Divide var by 10^exponent to get the significand, rounding to rscale
+ * decimal digits in the process.
+ */
+ init_var(&tmp_var);
+
+ power_ten_int(exponent, &tmp_var);
+ div_var(var, &tmp_var, &tmp_var, rscale, true);
+ sig_out = get_str_from_var(&tmp_var);
+
+ free_var(&tmp_var);
+
+ /*
+ * Allocate space for the result.
+ *
+ * In addition to the significand, we need room for the exponent
+ * decoration ("e"), the sign of the exponent, up to 10 digits for the
+ * exponent itself, and of course the null terminator.
+ */
+ len = strlen(sig_out) + 13;
+ str = palloc(len);
+ snprintf(str, len, "%se%+03d", sig_out, exponent);
+
+ pfree(sig_out);
+
+ return str;
+}
+
+
+/*
+ * numericvar_serialize - serialize NumericVar to binary format
+ *
+ * At variable level, no checks are performed on the weight or dscale, allowing
+ * us to pass around intermediate values with higher precision than supported
+ * by the numeric type. Note: this is incompatible with numeric_send/recv(),
+ * which use 16-bit integers for these fields.
+ */
+static void
+numericvar_serialize(StringInfo buf, const NumericVar *var)
+{
+ int i;
+
+ pq_sendint32(buf, var->ndigits);
+ pq_sendint32(buf, var->weight);
+ pq_sendint32(buf, var->sign);
+ pq_sendint32(buf, var->dscale);
+ for (i = 0; i < var->ndigits; i++)
+ pq_sendint16(buf, var->digits[i]);
+}
+
+/*
+ * numericvar_deserialize - deserialize binary format to NumericVar
+ */
+static void
+numericvar_deserialize(StringInfo buf, NumericVar *var)
+{
+ int len,
+ i;
+
+ len = pq_getmsgint(buf, sizeof(int32));
+
+ alloc_var(var, len); /* sets var->ndigits */
+
+ var->weight = pq_getmsgint(buf, sizeof(int32));
+ var->sign = pq_getmsgint(buf, sizeof(int32));
+ var->dscale = pq_getmsgint(buf, sizeof(int32));
+ for (i = 0; i < len; i++)
+ var->digits[i] = pq_getmsgint(buf, sizeof(int16));
+}
+
+
+/*
+ * duplicate_numeric() - copy a packed-format Numeric
+ *
+ * This will handle NaN and Infinity cases.
+ */
+static Numeric
+duplicate_numeric(Numeric num)
+{
+ Numeric res;
+
+ res = (Numeric) palloc(VARSIZE(num));
+ memcpy(res, num, VARSIZE(num));
+ return res;
+}
+
+/*
+ * make_result_opt_error() -
+ *
+ * Create the packed db numeric format in palloc()'d memory from
+ * a variable. This will handle NaN and Infinity cases.
+ *
+ * If "have_error" isn't NULL, on overflow *have_error is set to true and
+ * NULL is returned. This is helpful when caller needs to handle errors.
+ */
+static Numeric
+make_result_opt_error(const NumericVar *var, bool *have_error)
+{
+ Numeric result;
+ NumericDigit *digits = var->digits;
+ int weight = var->weight;
+ int sign = var->sign;
+ int n;
+ Size len;
+
+ if (have_error)
+ *have_error = false;
+
+ if ((sign & NUMERIC_SIGN_MASK) == NUMERIC_SPECIAL)
+ {
+ /*
+ * Verify valid special value. This could be just an Assert, perhaps,
+ * but it seems worthwhile to expend a few cycles to ensure that we
+ * never write any nonzero reserved bits to disk.
+ */
+ if (!(sign == NUMERIC_NAN ||
+ sign == NUMERIC_PINF ||
+ sign == NUMERIC_NINF))
+ elog(ERROR, "invalid numeric sign value 0x%x", sign);
+
+ result = (Numeric) palloc(NUMERIC_HDRSZ_SHORT);
+
+ SET_VARSIZE(result, NUMERIC_HDRSZ_SHORT);
+ result->choice.n_header = sign;
+ /* the header word is all we need */
+
+ dump_numeric("make_result()", result);
+ return result;
+ }
+
+ n = var->ndigits;
+
+ /* truncate leading zeroes */
+ while (n > 0 && *digits == 0)
+ {
+ digits++;
+ weight--;
+ n--;
+ }
+ /* truncate trailing zeroes */
+ while (n > 0 && digits[n - 1] == 0)
+ n--;
+
+ /* If zero result, force to weight=0 and positive sign */
+ if (n == 0)
+ {
+ weight = 0;
+ sign = NUMERIC_POS;
+ }
+
+ /* Build the result */
+ if (NUMERIC_CAN_BE_SHORT(var->dscale, weight))
+ {
+ len = NUMERIC_HDRSZ_SHORT + n * sizeof(NumericDigit);
+ result = (Numeric) palloc(len);
+ SET_VARSIZE(result, len);
+ result->choice.n_short.n_header =
+ (sign == NUMERIC_NEG ? (NUMERIC_SHORT | NUMERIC_SHORT_SIGN_MASK)
+ : NUMERIC_SHORT)
+ | (var->dscale << NUMERIC_SHORT_DSCALE_SHIFT)
+ | (weight < 0 ? NUMERIC_SHORT_WEIGHT_SIGN_MASK : 0)
+ | (weight & NUMERIC_SHORT_WEIGHT_MASK);
+ }
+ else
+ {
+ len = NUMERIC_HDRSZ + n * sizeof(NumericDigit);
+ result = (Numeric) palloc(len);
+ SET_VARSIZE(result, len);
+ result->choice.n_long.n_sign_dscale =
+ sign | (var->dscale & NUMERIC_DSCALE_MASK);
+ result->choice.n_long.n_weight = weight;
+ }
+
+ Assert(NUMERIC_NDIGITS(result) == n);
+ if (n > 0)
+ memcpy(NUMERIC_DIGITS(result), digits, n * sizeof(NumericDigit));
+
+ /* Check for overflow of int16 fields */
+ if (NUMERIC_WEIGHT(result) != weight ||
+ NUMERIC_DSCALE(result) != var->dscale)
+ {
+ if (have_error)
+ {
+ *have_error = true;
+ return NULL;
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ }
+ }
+
+ dump_numeric("make_result()", result);
+ return result;
+}
+
+
+/*
+ * make_result() -
+ *
+ * An interface to make_result_opt_error() without "have_error" argument.
+ */
+static Numeric
+make_result(const NumericVar *var)
+{
+ return make_result_opt_error(var, NULL);
+}
+
+
+/*
+ * apply_typmod() -
+ *
+ * Do bounds checking and rounding according to the specified typmod.
+ * Note that this is only applied to normal finite values.
+ */
+static void
+apply_typmod(NumericVar *var, int32 typmod)
+{
+ int precision;
+ int scale;
+ int maxdigits;
+ int ddigits;
+ int i;
+
+ /* Do nothing if we have an invalid typmod */
+ if (!is_valid_numeric_typmod(typmod))
+ return;
+
+ precision = numeric_typmod_precision(typmod);
+ scale = numeric_typmod_scale(typmod);
+ maxdigits = precision - scale;
+
+ /* Round to target scale (and set var->dscale) */
+ round_var(var, scale);
+
+ /* but don't allow var->dscale to be negative */
+ if (var->dscale < 0)
+ var->dscale = 0;
+
+ /*
+ * Check for overflow - note we can't do this before rounding, because
+ * rounding could raise the weight. Also note that the var's weight could
+ * be inflated by leading zeroes, which will be stripped before storage
+ * but perhaps might not have been yet. In any case, we must recognize a
+ * true zero, whose weight doesn't mean anything.
+ */
+ ddigits = (var->weight + 1) * DEC_DIGITS;
+ if (ddigits > maxdigits)
+ {
+ /* Determine true weight; and check for all-zero result */
+ for (i = 0; i < var->ndigits; i++)
+ {
+ NumericDigit dig = var->digits[i];
+
+ if (dig)
+ {
+ /* Adjust for any high-order decimal zero digits */
+#if DEC_DIGITS == 4
+ if (dig < 10)
+ ddigits -= 3;
+ else if (dig < 100)
+ ddigits -= 2;
+ else if (dig < 1000)
+ ddigits -= 1;
+#elif DEC_DIGITS == 2
+ if (dig < 10)
+ ddigits -= 1;
+#elif DEC_DIGITS == 1
+ /* no adjustment */
+#else
+#error unsupported NBASE
+#endif
+ if (ddigits > maxdigits)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("numeric field overflow"),
+ errdetail("A field with precision %d, scale %d must round to an absolute value less than %s%d.",
+ precision, scale,
+ /* Display 10^0 as 1 */
+ maxdigits ? "10^" : "",
+ maxdigits ? maxdigits : 1
+ )));
+ break;
+ }
+ ddigits -= DEC_DIGITS;
+ }
+ }
+}
+
+/*
+ * apply_typmod_special() -
+ *
+ * Do bounds checking according to the specified typmod, for an Inf or NaN.
+ * For convenience of most callers, the value is presented in packed form.
+ */
+static void
+apply_typmod_special(Numeric num, int32 typmod)
+{
+ int precision;
+ int scale;
+
+ Assert(NUMERIC_IS_SPECIAL(num)); /* caller error if not */
+
+ /*
+ * NaN is allowed regardless of the typmod; that's rather dubious perhaps,
+ * but it's a longstanding behavior. Inf is rejected if we have any
+ * typmod restriction, since an infinity shouldn't be claimed to fit in
+ * any finite number of digits.
+ */
+ if (NUMERIC_IS_NAN(num))
+ return;
+
+ /* Do nothing if we have a default typmod (-1) */
+ if (!is_valid_numeric_typmod(typmod))
+ return;
+
+ precision = numeric_typmod_precision(typmod);
+ scale = numeric_typmod_scale(typmod);
+
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("numeric field overflow"),
+ errdetail("A field with precision %d, scale %d cannot hold an infinite value.",
+ precision, scale)));
+}
+
+
+/*
+ * Convert numeric to int8, rounding if needed.
+ *
+ * If overflow, return false (no error is raised). Return true if okay.
+ */
+static bool
+numericvar_to_int64(const NumericVar *var, int64 *result)
+{
+ NumericDigit *digits;
+ int ndigits;
+ int weight;
+ int i;
+ int64 val;
+ bool neg;
+ NumericVar rounded;
+
+ /* Round to nearest integer */
+ init_var(&rounded);
+ set_var_from_var(var, &rounded);
+ round_var(&rounded, 0);
+
+ /* Check for zero input */
+ strip_var(&rounded);
+ ndigits = rounded.ndigits;
+ if (ndigits == 0)
+ {
+ *result = 0;
+ free_var(&rounded);
+ return true;
+ }
+
+ /*
+ * For input like 10000000000, we must treat stripped digits as real. So
+ * the loop assumes there are weight+1 digits before the decimal point.
+ */
+ weight = rounded.weight;
+ Assert(weight >= 0 && ndigits <= weight + 1);
+
+ /*
+ * Construct the result. To avoid issues with converting a value
+ * corresponding to INT64_MIN (which can't be represented as a positive 64
+ * bit two's complement integer), accumulate value as a negative number.
+ */
+ digits = rounded.digits;
+ neg = (rounded.sign == NUMERIC_NEG);
+ val = -digits[0];
+ for (i = 1; i <= weight; i++)
+ {
+ if (unlikely(pg_mul_s64_overflow(val, NBASE, &val)))
+ {
+ free_var(&rounded);
+ return false;
+ }
+
+ if (i < ndigits)
+ {
+ if (unlikely(pg_sub_s64_overflow(val, digits[i], &val)))
+ {
+ free_var(&rounded);
+ return false;
+ }
+ }
+ }
+
+ free_var(&rounded);
+
+ if (!neg)
+ {
+ if (unlikely(val == PG_INT64_MIN))
+ return false;
+ val = -val;
+ }
+ *result = val;
+
+ return true;
+}
+
+/*
+ * Convert int8 value to numeric.
+ */
+static void
+int64_to_numericvar(int64 val, NumericVar *var)
+{
+ uint64 uval,
+ newuval;
+ NumericDigit *ptr;
+ int ndigits;
+
+ /* int64 can require at most 19 decimal digits; add one for safety */
+ alloc_var(var, 20 / DEC_DIGITS);
+ if (val < 0)
+ {
+ var->sign = NUMERIC_NEG;
+ uval = -val;
+ }
+ else
+ {
+ var->sign = NUMERIC_POS;
+ uval = val;
+ }
+ var->dscale = 0;
+ if (val == 0)
+ {
+ var->ndigits = 0;
+ var->weight = 0;
+ return;
+ }
+ ptr = var->digits + var->ndigits;
+ ndigits = 0;
+ do
+ {
+ ptr--;
+ ndigits++;
+ newuval = uval / NBASE;
+ *ptr = uval - newuval * NBASE;
+ uval = newuval;
+ } while (uval);
+ var->digits = ptr;
+ var->ndigits = ndigits;
+ var->weight = ndigits - 1;
+}
+
+/*
+ * Convert numeric to uint64, rounding if needed.
+ *
+ * If overflow, return false (no error is raised). Return true if okay.
+ */
+static bool
+numericvar_to_uint64(const NumericVar *var, uint64 *result)
+{
+ NumericDigit *digits;
+ int ndigits;
+ int weight;
+ int i;
+ uint64 val;
+ NumericVar rounded;
+
+ /* Round to nearest integer */
+ init_var(&rounded);
+ set_var_from_var(var, &rounded);
+ round_var(&rounded, 0);
+
+ /* Check for zero input */
+ strip_var(&rounded);
+ ndigits = rounded.ndigits;
+ if (ndigits == 0)
+ {
+ *result = 0;
+ free_var(&rounded);
+ return true;
+ }
+
+ /* Check for negative input */
+ if (rounded.sign == NUMERIC_NEG)
+ {
+ free_var(&rounded);
+ return false;
+ }
+
+ /*
+ * For input like 10000000000, we must treat stripped digits as real. So
+ * the loop assumes there are weight+1 digits before the decimal point.
+ */
+ weight = rounded.weight;
+ Assert(weight >= 0 && ndigits <= weight + 1);
+
+ /* Construct the result */
+ digits = rounded.digits;
+ val = digits[0];
+ for (i = 1; i <= weight; i++)
+ {
+ if (unlikely(pg_mul_u64_overflow(val, NBASE, &val)))
+ {
+ free_var(&rounded);
+ return false;
+ }
+
+ if (i < ndigits)
+ {
+ if (unlikely(pg_add_u64_overflow(val, digits[i], &val)))
+ {
+ free_var(&rounded);
+ return false;
+ }
+ }
+ }
+
+ free_var(&rounded);
+
+ *result = val;
+
+ return true;
+}
+
+#ifdef HAVE_INT128
+/*
+ * Convert numeric to int128, rounding if needed.
+ *
+ * If overflow, return false (no error is raised). Return true if okay.
+ */
+static bool
+numericvar_to_int128(const NumericVar *var, int128 *result)
+{
+ NumericDigit *digits;
+ int ndigits;
+ int weight;
+ int i;
+ int128 val,
+ oldval;
+ bool neg;
+ NumericVar rounded;
+
+ /* Round to nearest integer */
+ init_var(&rounded);
+ set_var_from_var(var, &rounded);
+ round_var(&rounded, 0);
+
+ /* Check for zero input */
+ strip_var(&rounded);
+ ndigits = rounded.ndigits;
+ if (ndigits == 0)
+ {
+ *result = 0;
+ free_var(&rounded);
+ return true;
+ }
+
+ /*
+ * For input like 10000000000, we must treat stripped digits as real. So
+ * the loop assumes there are weight+1 digits before the decimal point.
+ */
+ weight = rounded.weight;
+ Assert(weight >= 0 && ndigits <= weight + 1);
+
+ /* Construct the result */
+ digits = rounded.digits;
+ neg = (rounded.sign == NUMERIC_NEG);
+ val = digits[0];
+ for (i = 1; i <= weight; i++)
+ {
+ oldval = val;
+ val *= NBASE;
+ if (i < ndigits)
+ val += digits[i];
+
+ /*
+ * The overflow check is a bit tricky because we want to accept
+ * INT128_MIN, which will overflow the positive accumulator. We can
+ * detect this case easily though because INT128_MIN is the only
+ * nonzero value for which -val == val (on a two's complement machine,
+ * anyway).
+ */
+ if ((val / NBASE) != oldval) /* possible overflow? */
+ {
+ if (!neg || (-val) != val || val == 0 || oldval < 0)
+ {
+ free_var(&rounded);
+ return false;
+ }
+ }
+ }
+
+ free_var(&rounded);
+
+ *result = neg ? -val : val;
+ return true;
+}
+
+/*
+ * Convert 128 bit integer to numeric.
+ */
+static void
+int128_to_numericvar(int128 val, NumericVar *var)
+{
+ uint128 uval,
+ newuval;
+ NumericDigit *ptr;
+ int ndigits;
+
+ /* int128 can require at most 39 decimal digits; add one for safety */
+ alloc_var(var, 40 / DEC_DIGITS);
+ if (val < 0)
+ {
+ var->sign = NUMERIC_NEG;
+ uval = -val;
+ }
+ else
+ {
+ var->sign = NUMERIC_POS;
+ uval = val;
+ }
+ var->dscale = 0;
+ if (val == 0)
+ {
+ var->ndigits = 0;
+ var->weight = 0;
+ return;
+ }
+ ptr = var->digits + var->ndigits;
+ ndigits = 0;
+ do
+ {
+ ptr--;
+ ndigits++;
+ newuval = uval / NBASE;
+ *ptr = uval - newuval * NBASE;
+ uval = newuval;
+ } while (uval);
+ var->digits = ptr;
+ var->ndigits = ndigits;
+ var->weight = ndigits - 1;
+}
+#endif
+
+/*
+ * Convert a NumericVar to float8; if out of range, return +/- HUGE_VAL
+ */
+static double
+numericvar_to_double_no_overflow(const NumericVar *var)
+{
+ char *tmp;
+ double val;
+ char *endptr;
+
+ tmp = get_str_from_var(var);
+
+ /* unlike float8in, we ignore ERANGE from strtod */
+ val = strtod(tmp, &endptr);
+ if (*endptr != '\0')
+ {
+ /* shouldn't happen ... */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "double precision", tmp)));
+ }
+
+ pfree(tmp);
+
+ return val;
+}
+
+
+/*
+ * cmp_var() -
+ *
+ * Compare two values on variable level. We assume zeroes have been
+ * truncated to no digits.
+ */
+static int
+cmp_var(const NumericVar *var1, const NumericVar *var2)
+{
+ return cmp_var_common(var1->digits, var1->ndigits,
+ var1->weight, var1->sign,
+ var2->digits, var2->ndigits,
+ var2->weight, var2->sign);
+}
+
+/*
+ * cmp_var_common() -
+ *
+ * Main routine of cmp_var(). This function can be used by both
+ * NumericVar and Numeric.
+ */
+static int
+cmp_var_common(const NumericDigit *var1digits, int var1ndigits,
+ int var1weight, int var1sign,
+ const NumericDigit *var2digits, int var2ndigits,
+ int var2weight, int var2sign)
+{
+ if (var1ndigits == 0)
+ {
+ if (var2ndigits == 0)
+ return 0;
+ if (var2sign == NUMERIC_NEG)
+ return 1;
+ return -1;
+ }
+ if (var2ndigits == 0)
+ {
+ if (var1sign == NUMERIC_POS)
+ return 1;
+ return -1;
+ }
+
+ if (var1sign == NUMERIC_POS)
+ {
+ if (var2sign == NUMERIC_NEG)
+ return 1;
+ return cmp_abs_common(var1digits, var1ndigits, var1weight,
+ var2digits, var2ndigits, var2weight);
+ }
+
+ if (var2sign == NUMERIC_POS)
+ return -1;
+
+ return cmp_abs_common(var2digits, var2ndigits, var2weight,
+ var1digits, var1ndigits, var1weight);
+}
+
+
+/*
+ * add_var() -
+ *
+ * Full version of add functionality on variable level (handling signs).
+ * result might point to one of the operands too without danger.
+ */
+static void
+add_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ /*
+ * Decide on the signs of the two variables what to do
+ */
+ if (var1->sign == NUMERIC_POS)
+ {
+ if (var2->sign == NUMERIC_POS)
+ {
+ /*
+ * Both are positive result = +(ABS(var1) + ABS(var2))
+ */
+ add_abs(var1, var2, result);
+ result->sign = NUMERIC_POS;
+ }
+ else
+ {
+ /*
+ * var1 is positive, var2 is negative Must compare absolute values
+ */
+ switch (cmp_abs(var1, var2))
+ {
+ case 0:
+ /* ----------
+ * ABS(var1) == ABS(var2)
+ * result = ZERO
+ * ----------
+ */
+ zero_var(result);
+ result->dscale = Max(var1->dscale, var2->dscale);
+ break;
+
+ case 1:
+ /* ----------
+ * ABS(var1) > ABS(var2)
+ * result = +(ABS(var1) - ABS(var2))
+ * ----------
+ */
+ sub_abs(var1, var2, result);
+ result->sign = NUMERIC_POS;
+ break;
+
+ case -1:
+ /* ----------
+ * ABS(var1) < ABS(var2)
+ * result = -(ABS(var2) - ABS(var1))
+ * ----------
+ */
+ sub_abs(var2, var1, result);
+ result->sign = NUMERIC_NEG;
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (var2->sign == NUMERIC_POS)
+ {
+ /* ----------
+ * var1 is negative, var2 is positive
+ * Must compare absolute values
+ * ----------
+ */
+ switch (cmp_abs(var1, var2))
+ {
+ case 0:
+ /* ----------
+ * ABS(var1) == ABS(var2)
+ * result = ZERO
+ * ----------
+ */
+ zero_var(result);
+ result->dscale = Max(var1->dscale, var2->dscale);
+ break;
+
+ case 1:
+ /* ----------
+ * ABS(var1) > ABS(var2)
+ * result = -(ABS(var1) - ABS(var2))
+ * ----------
+ */
+ sub_abs(var1, var2, result);
+ result->sign = NUMERIC_NEG;
+ break;
+
+ case -1:
+ /* ----------
+ * ABS(var1) < ABS(var2)
+ * result = +(ABS(var2) - ABS(var1))
+ * ----------
+ */
+ sub_abs(var2, var1, result);
+ result->sign = NUMERIC_POS;
+ break;
+ }
+ }
+ else
+ {
+ /* ----------
+ * Both are negative
+ * result = -(ABS(var1) + ABS(var2))
+ * ----------
+ */
+ add_abs(var1, var2, result);
+ result->sign = NUMERIC_NEG;
+ }
+ }
+}
+
+
+/*
+ * sub_var() -
+ *
+ * Full version of sub functionality on variable level (handling signs).
+ * result might point to one of the operands too without danger.
+ */
+static void
+sub_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ /*
+ * Decide on the signs of the two variables what to do
+ */
+ if (var1->sign == NUMERIC_POS)
+ {
+ if (var2->sign == NUMERIC_NEG)
+ {
+ /* ----------
+ * var1 is positive, var2 is negative
+ * result = +(ABS(var1) + ABS(var2))
+ * ----------
+ */
+ add_abs(var1, var2, result);
+ result->sign = NUMERIC_POS;
+ }
+ else
+ {
+ /* ----------
+ * Both are positive
+ * Must compare absolute values
+ * ----------
+ */
+ switch (cmp_abs(var1, var2))
+ {
+ case 0:
+ /* ----------
+ * ABS(var1) == ABS(var2)
+ * result = ZERO
+ * ----------
+ */
+ zero_var(result);
+ result->dscale = Max(var1->dscale, var2->dscale);
+ break;
+
+ case 1:
+ /* ----------
+ * ABS(var1) > ABS(var2)
+ * result = +(ABS(var1) - ABS(var2))
+ * ----------
+ */
+ sub_abs(var1, var2, result);
+ result->sign = NUMERIC_POS;
+ break;
+
+ case -1:
+ /* ----------
+ * ABS(var1) < ABS(var2)
+ * result = -(ABS(var2) - ABS(var1))
+ * ----------
+ */
+ sub_abs(var2, var1, result);
+ result->sign = NUMERIC_NEG;
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (var2->sign == NUMERIC_NEG)
+ {
+ /* ----------
+ * Both are negative
+ * Must compare absolute values
+ * ----------
+ */
+ switch (cmp_abs(var1, var2))
+ {
+ case 0:
+ /* ----------
+ * ABS(var1) == ABS(var2)
+ * result = ZERO
+ * ----------
+ */
+ zero_var(result);
+ result->dscale = Max(var1->dscale, var2->dscale);
+ break;
+
+ case 1:
+ /* ----------
+ * ABS(var1) > ABS(var2)
+ * result = -(ABS(var1) - ABS(var2))
+ * ----------
+ */
+ sub_abs(var1, var2, result);
+ result->sign = NUMERIC_NEG;
+ break;
+
+ case -1:
+ /* ----------
+ * ABS(var1) < ABS(var2)
+ * result = +(ABS(var2) - ABS(var1))
+ * ----------
+ */
+ sub_abs(var2, var1, result);
+ result->sign = NUMERIC_POS;
+ break;
+ }
+ }
+ else
+ {
+ /* ----------
+ * var1 is negative, var2 is positive
+ * result = -(ABS(var1) + ABS(var2))
+ * ----------
+ */
+ add_abs(var1, var2, result);
+ result->sign = NUMERIC_NEG;
+ }
+ }
+}
+
+
+/*
+ * mul_var() -
+ *
+ * Multiplication on variable level. Product of var1 * var2 is stored
+ * in result. Result is rounded to no more than rscale fractional digits.
+ */
+static void
+mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result,
+ int rscale)
+{
+ int res_ndigits;
+ int res_sign;
+ int res_weight;
+ int maxdigits;
+ int *dig;
+ int carry;
+ int maxdig;
+ int newdig;
+ int var1ndigits;
+ int var2ndigits;
+ NumericDigit *var1digits;
+ NumericDigit *var2digits;
+ NumericDigit *res_digits;
+ int i,
+ i1,
+ i2;
+
+ /*
+ * Arrange for var1 to be the shorter of the two numbers. This improves
+ * performance because the inner multiplication loop is much simpler than
+ * the outer loop, so it's better to have a smaller number of iterations
+ * of the outer loop. This also reduces the number of times that the
+ * accumulator array needs to be normalized.
+ */
+ if (var1->ndigits > var2->ndigits)
+ {
+ const NumericVar *tmp = var1;
+
+ var1 = var2;
+ var2 = tmp;
+ }
+
+ /* copy these values into local vars for speed in inner loop */
+ var1ndigits = var1->ndigits;
+ var2ndigits = var2->ndigits;
+ var1digits = var1->digits;
+ var2digits = var2->digits;
+
+ if (var1ndigits == 0 || var2ndigits == 0)
+ {
+ /* one or both inputs is zero; so is result */
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /* Determine result sign and (maximum possible) weight */
+ if (var1->sign == var2->sign)
+ res_sign = NUMERIC_POS;
+ else
+ res_sign = NUMERIC_NEG;
+ res_weight = var1->weight + var2->weight + 2;
+
+ /*
+ * Determine the number of result digits to compute. If the exact result
+ * would have more than rscale fractional digits, truncate the computation
+ * with MUL_GUARD_DIGITS guard digits, i.e., ignore input digits that
+ * would only contribute to the right of that. (This will give the exact
+ * rounded-to-rscale answer unless carries out of the ignored positions
+ * would have propagated through more than MUL_GUARD_DIGITS digits.)
+ *
+ * Note: an exact computation could not produce more than var1ndigits +
+ * var2ndigits digits, but we allocate one extra output digit in case
+ * rscale-driven rounding produces a carry out of the highest exact digit.
+ */
+ res_ndigits = var1ndigits + var2ndigits + 1;
+ maxdigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS +
+ MUL_GUARD_DIGITS;
+ res_ndigits = Min(res_ndigits, maxdigits);
+
+ if (res_ndigits < 3)
+ {
+ /* All input digits will be ignored; so result is zero */
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * We do the arithmetic in an array "dig[]" of signed int's. Since
+ * INT_MAX is noticeably larger than NBASE*NBASE, this gives us headroom
+ * to avoid normalizing carries immediately.
+ *
+ * maxdig tracks the maximum possible value of any dig[] entry; when this
+ * threatens to exceed INT_MAX, we take the time to propagate carries.
+ * Furthermore, we need to ensure that overflow doesn't occur during the
+ * carry propagation passes either. The carry values could be as much as
+ * INT_MAX/NBASE, so really we must normalize when digits threaten to
+ * exceed INT_MAX - INT_MAX/NBASE.
+ *
+ * To avoid overflow in maxdig itself, it actually represents the max
+ * possible value divided by NBASE-1, ie, at the top of the loop it is
+ * known that no dig[] entry exceeds maxdig * (NBASE-1).
+ */
+ dig = (int *) palloc0(res_ndigits * sizeof(int));
+ maxdig = 0;
+
+ /*
+ * The least significant digits of var1 should be ignored if they don't
+ * contribute directly to the first res_ndigits digits of the result that
+ * we are computing.
+ *
+ * Digit i1 of var1 and digit i2 of var2 are multiplied and added to digit
+ * i1+i2+2 of the accumulator array, so we need only consider digits of
+ * var1 for which i1 <= res_ndigits - 3.
+ */
+ for (i1 = Min(var1ndigits - 1, res_ndigits - 3); i1 >= 0; i1--)
+ {
+ NumericDigit var1digit = var1digits[i1];
+
+ if (var1digit == 0)
+ continue;
+
+ /* Time to normalize? */
+ maxdig += var1digit;
+ if (maxdig > (INT_MAX - INT_MAX / NBASE) / (NBASE - 1))
+ {
+ /* Yes, do it */
+ carry = 0;
+ for (i = res_ndigits - 1; i >= 0; i--)
+ {
+ newdig = dig[i] + carry;
+ if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ dig[i] = newdig;
+ }
+ Assert(carry == 0);
+ /* Reset maxdig to indicate new worst-case */
+ maxdig = 1 + var1digit;
+ }
+
+ /*
+ * Add the appropriate multiple of var2 into the accumulator.
+ *
+ * As above, digits of var2 can be ignored if they don't contribute,
+ * so we only include digits for which i1+i2+2 < res_ndigits.
+ *
+ * This inner loop is the performance bottleneck for multiplication,
+ * so we want to keep it simple enough so that it can be
+ * auto-vectorized. Accordingly, process the digits left-to-right
+ * even though schoolbook multiplication would suggest right-to-left.
+ * Since we aren't propagating carries in this loop, the order does
+ * not matter.
+ */
+ {
+ int i2limit = Min(var2ndigits, res_ndigits - i1 - 2);
+ int *dig_i1_2 = &dig[i1 + 2];
+
+ for (i2 = 0; i2 < i2limit; i2++)
+ dig_i1_2[i2] += var1digit * var2digits[i2];
+ }
+ }
+
+ /*
+ * Now we do a final carry propagation pass to normalize the result, which
+ * we combine with storing the result digits into the output. Note that
+ * this is still done at full precision w/guard digits.
+ */
+ alloc_var(result, res_ndigits);
+ res_digits = result->digits;
+ carry = 0;
+ for (i = res_ndigits - 1; i >= 0; i--)
+ {
+ newdig = dig[i] + carry;
+ if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ res_digits[i] = newdig;
+ }
+ Assert(carry == 0);
+
+ pfree(dig);
+
+ /*
+ * Finally, round the result to the requested precision.
+ */
+ result->weight = res_weight;
+ result->sign = res_sign;
+
+ /* Round to target rscale (and set result->dscale) */
+ round_var(result, rscale);
+
+ /* Strip leading and trailing zeroes */
+ strip_var(result);
+}
+
+
+/*
+ * div_var() -
+ *
+ * Division on variable level. Quotient of var1 / var2 is stored in result.
+ * The quotient is figured to exactly rscale fractional digits.
+ * If round is true, it is rounded at the rscale'th digit; if false, it
+ * is truncated (towards zero) at that digit.
+ */
+static void
+div_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result,
+ int rscale, bool round)
+{
+ int div_ndigits;
+ int res_ndigits;
+ int res_sign;
+ int res_weight;
+ int carry;
+ int borrow;
+ int divisor1;
+ int divisor2;
+ NumericDigit *dividend;
+ NumericDigit *divisor;
+ NumericDigit *res_digits;
+ int i;
+ int j;
+
+ /* copy these values into local vars for speed in inner loop */
+ int var1ndigits = var1->ndigits;
+ int var2ndigits = var2->ndigits;
+
+ /*
+ * First of all division by zero check; we must not be handed an
+ * unnormalized divisor.
+ */
+ if (var2ndigits == 0 || var2->digits[0] == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ /*
+ * If the divisor has just one or two digits, delegate to div_var_int(),
+ * which uses fast short division.
+ */
+ if (var2ndigits <= 2)
+ {
+ int idivisor;
+ int idivisor_weight;
+
+ idivisor = var2->digits[0];
+ idivisor_weight = var2->weight;
+ if (var2ndigits == 2)
+ {
+ idivisor = idivisor * NBASE + var2->digits[1];
+ idivisor_weight--;
+ }
+ if (var2->sign == NUMERIC_NEG)
+ idivisor = -idivisor;
+
+ div_var_int(var1, idivisor, idivisor_weight, result, rscale, round);
+ return;
+ }
+
+ /*
+ * Otherwise, perform full long division.
+ */
+
+ /* Result zero check */
+ if (var1ndigits == 0)
+ {
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * Determine the result sign, weight and number of digits to calculate.
+ * The weight figured here is correct if the emitted quotient has no
+ * leading zero digits; otherwise strip_var() will fix things up.
+ */
+ if (var1->sign == var2->sign)
+ res_sign = NUMERIC_POS;
+ else
+ res_sign = NUMERIC_NEG;
+ res_weight = var1->weight - var2->weight;
+ /* The number of accurate result digits we need to produce: */
+ res_ndigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS;
+ /* ... but always at least 1 */
+ res_ndigits = Max(res_ndigits, 1);
+ /* If rounding needed, figure one more digit to ensure correct result */
+ if (round)
+ res_ndigits++;
+
+ /*
+ * The working dividend normally requires res_ndigits + var2ndigits
+ * digits, but make it at least var1ndigits so we can load all of var1
+ * into it. (There will be an additional digit dividend[0] in the
+ * dividend space, but for consistency with Knuth's notation we don't
+ * count that in div_ndigits.)
+ */
+ div_ndigits = res_ndigits + var2ndigits;
+ div_ndigits = Max(div_ndigits, var1ndigits);
+
+ /*
+ * We need a workspace with room for the working dividend (div_ndigits+1
+ * digits) plus room for the possibly-normalized divisor (var2ndigits
+ * digits). It is convenient also to have a zero at divisor[0] with the
+ * actual divisor data in divisor[1 .. var2ndigits]. Transferring the
+ * digits into the workspace also allows us to realloc the result (which
+ * might be the same as either input var) before we begin the main loop.
+ * Note that we use palloc0 to ensure that divisor[0], dividend[0], and
+ * any additional dividend positions beyond var1ndigits, start out 0.
+ */
+ dividend = (NumericDigit *)
+ palloc0((div_ndigits + var2ndigits + 2) * sizeof(NumericDigit));
+ divisor = dividend + (div_ndigits + 1);
+ memcpy(dividend + 1, var1->digits, var1ndigits * sizeof(NumericDigit));
+ memcpy(divisor + 1, var2->digits, var2ndigits * sizeof(NumericDigit));
+
+ /*
+ * Now we can realloc the result to hold the generated quotient digits.
+ */
+ alloc_var(result, res_ndigits);
+ res_digits = result->digits;
+
+ /*
+ * The full multiple-place algorithm is taken from Knuth volume 2,
+ * Algorithm 4.3.1D.
+ *
+ * We need the first divisor digit to be >= NBASE/2. If it isn't, make it
+ * so by scaling up both the divisor and dividend by the factor "d". (The
+ * reason for allocating dividend[0] above is to leave room for possible
+ * carry here.)
+ */
+ if (divisor[1] < HALF_NBASE)
+ {
+ int d = NBASE / (divisor[1] + 1);
+
+ carry = 0;
+ for (i = var2ndigits; i > 0; i--)
+ {
+ carry += divisor[i] * d;
+ divisor[i] = carry % NBASE;
+ carry = carry / NBASE;
+ }
+ Assert(carry == 0);
+ carry = 0;
+ /* at this point only var1ndigits of dividend can be nonzero */
+ for (i = var1ndigits; i >= 0; i--)
+ {
+ carry += dividend[i] * d;
+ dividend[i] = carry % NBASE;
+ carry = carry / NBASE;
+ }
+ Assert(carry == 0);
+ Assert(divisor[1] >= HALF_NBASE);
+ }
+ /* First 2 divisor digits are used repeatedly in main loop */
+ divisor1 = divisor[1];
+ divisor2 = divisor[2];
+
+ /*
+ * Begin the main loop. Each iteration of this loop produces the j'th
+ * quotient digit by dividing dividend[j .. j + var2ndigits] by the
+ * divisor; this is essentially the same as the common manual procedure
+ * for long division.
+ */
+ for (j = 0; j < res_ndigits; j++)
+ {
+ /* Estimate quotient digit from the first two dividend digits */
+ int next2digits = dividend[j] * NBASE + dividend[j + 1];
+ int qhat;
+
+ /*
+ * If next2digits are 0, then quotient digit must be 0 and there's no
+ * need to adjust the working dividend. It's worth testing here to
+ * fall out ASAP when processing trailing zeroes in a dividend.
+ */
+ if (next2digits == 0)
+ {
+ res_digits[j] = 0;
+ continue;
+ }
+
+ if (dividend[j] == divisor1)
+ qhat = NBASE - 1;
+ else
+ qhat = next2digits / divisor1;
+
+ /*
+ * Adjust quotient digit if it's too large. Knuth proves that after
+ * this step, the quotient digit will be either correct or just one
+ * too large. (Note: it's OK to use dividend[j+2] here because we
+ * know the divisor length is at least 2.)
+ */
+ while (divisor2 * qhat >
+ (next2digits - qhat * divisor1) * NBASE + dividend[j + 2])
+ qhat--;
+
+ /* As above, need do nothing more when quotient digit is 0 */
+ if (qhat > 0)
+ {
+ NumericDigit *dividend_j = &dividend[j];
+
+ /*
+ * Multiply the divisor by qhat, and subtract that from the
+ * working dividend. The multiplication and subtraction are
+ * folded together here, noting that qhat <= NBASE (since it might
+ * be one too large), and so the intermediate result "tmp_result"
+ * is in the range [-NBASE^2, NBASE - 1], and "borrow" is in the
+ * range [0, NBASE].
+ */
+ borrow = 0;
+ for (i = var2ndigits; i >= 0; i--)
+ {
+ int tmp_result;
+
+ tmp_result = dividend_j[i] - borrow - divisor[i] * qhat;
+ borrow = (NBASE - 1 - tmp_result) / NBASE;
+ dividend_j[i] = tmp_result + borrow * NBASE;
+ }
+
+ /*
+ * If we got a borrow out of the top dividend digit, then indeed
+ * qhat was one too large. Fix it, and add back the divisor to
+ * correct the working dividend. (Knuth proves that this will
+ * occur only about 3/NBASE of the time; hence, it's a good idea
+ * to test this code with small NBASE to be sure this section gets
+ * exercised.)
+ */
+ if (borrow)
+ {
+ qhat--;
+ carry = 0;
+ for (i = var2ndigits; i >= 0; i--)
+ {
+ carry += dividend_j[i] + divisor[i];
+ if (carry >= NBASE)
+ {
+ dividend_j[i] = carry - NBASE;
+ carry = 1;
+ }
+ else
+ {
+ dividend_j[i] = carry;
+ carry = 0;
+ }
+ }
+ /* A carry should occur here to cancel the borrow above */
+ Assert(carry == 1);
+ }
+ }
+
+ /* And we're done with this quotient digit */
+ res_digits[j] = qhat;
+ }
+
+ pfree(dividend);
+
+ /*
+ * Finally, round or truncate the result to the requested precision.
+ */
+ result->weight = res_weight;
+ result->sign = res_sign;
+
+ /* Round or truncate to target rscale (and set result->dscale) */
+ if (round)
+ round_var(result, rscale);
+ else
+ trunc_var(result, rscale);
+
+ /* Strip leading and trailing zeroes */
+ strip_var(result);
+}
+
+
+/*
+ * div_var_fast() -
+ *
+ * This has the same API as div_var, but is implemented using the division
+ * algorithm from the "FM" library, rather than Knuth's schoolbook-division
+ * approach. This is significantly faster but can produce inaccurate
+ * results, because it sometimes has to propagate rounding to the left,
+ * and so we can never be entirely sure that we know the requested digits
+ * exactly. We compute DIV_GUARD_DIGITS extra digits, but there is
+ * no certainty that that's enough. We use this only in the transcendental
+ * function calculation routines, where everything is approximate anyway.
+ *
+ * Although we provide a "round" argument for consistency with div_var,
+ * it is unwise to use this function with round=false. In truncation mode
+ * it is possible to get a result with no significant digits, for example
+ * with rscale=0 we might compute 0.99999... and truncate that to 0 when
+ * the correct answer is 1.
+ */
+static void
+div_var_fast(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *result, int rscale, bool round)
+{
+ int div_ndigits;
+ int load_ndigits;
+ int res_sign;
+ int res_weight;
+ int *div;
+ int qdigit;
+ int carry;
+ int maxdiv;
+ int newdig;
+ NumericDigit *res_digits;
+ double fdividend,
+ fdivisor,
+ fdivisorinverse,
+ fquotient;
+ int qi;
+ int i;
+
+ /* copy these values into local vars for speed in inner loop */
+ int var1ndigits = var1->ndigits;
+ int var2ndigits = var2->ndigits;
+ NumericDigit *var1digits = var1->digits;
+ NumericDigit *var2digits = var2->digits;
+
+ /*
+ * First of all division by zero check; we must not be handed an
+ * unnormalized divisor.
+ */
+ if (var2ndigits == 0 || var2digits[0] == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ /*
+ * If the divisor has just one or two digits, delegate to div_var_int(),
+ * which uses fast short division.
+ */
+ if (var2ndigits <= 2)
+ {
+ int idivisor;
+ int idivisor_weight;
+
+ idivisor = var2->digits[0];
+ idivisor_weight = var2->weight;
+ if (var2ndigits == 2)
+ {
+ idivisor = idivisor * NBASE + var2->digits[1];
+ idivisor_weight--;
+ }
+ if (var2->sign == NUMERIC_NEG)
+ idivisor = -idivisor;
+
+ div_var_int(var1, idivisor, idivisor_weight, result, rscale, round);
+ return;
+ }
+
+ /*
+ * Otherwise, perform full long division.
+ */
+
+ /* Result zero check */
+ if (var1ndigits == 0)
+ {
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * Determine the result sign, weight and number of digits to calculate
+ */
+ if (var1->sign == var2->sign)
+ res_sign = NUMERIC_POS;
+ else
+ res_sign = NUMERIC_NEG;
+ res_weight = var1->weight - var2->weight + 1;
+ /* The number of accurate result digits we need to produce: */
+ div_ndigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS;
+ /* Add guard digits for roundoff error */
+ div_ndigits += DIV_GUARD_DIGITS;
+ if (div_ndigits < DIV_GUARD_DIGITS)
+ div_ndigits = DIV_GUARD_DIGITS;
+
+ /*
+ * We do the arithmetic in an array "div[]" of signed int's. Since
+ * INT_MAX is noticeably larger than NBASE*NBASE, this gives us headroom
+ * to avoid normalizing carries immediately.
+ *
+ * We start with div[] containing one zero digit followed by the
+ * dividend's digits (plus appended zeroes to reach the desired precision
+ * including guard digits). Each step of the main loop computes an
+ * (approximate) quotient digit and stores it into div[], removing one
+ * position of dividend space. A final pass of carry propagation takes
+ * care of any mistaken quotient digits.
+ *
+ * Note that div[] doesn't necessarily contain all of the digits from the
+ * dividend --- the desired precision plus guard digits might be less than
+ * the dividend's precision. This happens, for example, in the square
+ * root algorithm, where we typically divide a 2N-digit number by an
+ * N-digit number, and only require a result with N digits of precision.
+ */
+ div = (int *) palloc0((div_ndigits + 1) * sizeof(int));
+ load_ndigits = Min(div_ndigits, var1ndigits);
+ for (i = 0; i < load_ndigits; i++)
+ div[i + 1] = var1digits[i];
+
+ /*
+ * We estimate each quotient digit using floating-point arithmetic, taking
+ * the first four digits of the (current) dividend and divisor. This must
+ * be float to avoid overflow. The quotient digits will generally be off
+ * by no more than one from the exact answer.
+ */
+ fdivisor = (double) var2digits[0];
+ for (i = 1; i < 4; i++)
+ {
+ fdivisor *= NBASE;
+ if (i < var2ndigits)
+ fdivisor += (double) var2digits[i];
+ }
+ fdivisorinverse = 1.0 / fdivisor;
+
+ /*
+ * maxdiv tracks the maximum possible absolute value of any div[] entry;
+ * when this threatens to exceed INT_MAX, we take the time to propagate
+ * carries. Furthermore, we need to ensure that overflow doesn't occur
+ * during the carry propagation passes either. The carry values may have
+ * an absolute value as high as INT_MAX/NBASE + 1, so really we must
+ * normalize when digits threaten to exceed INT_MAX - INT_MAX/NBASE - 1.
+ *
+ * To avoid overflow in maxdiv itself, it represents the max absolute
+ * value divided by NBASE-1, ie, at the top of the loop it is known that
+ * no div[] entry has an absolute value exceeding maxdiv * (NBASE-1).
+ *
+ * Actually, though, that holds good only for div[] entries after div[qi];
+ * the adjustment done at the bottom of the loop may cause div[qi + 1] to
+ * exceed the maxdiv limit, so that div[qi] in the next iteration is
+ * beyond the limit. This does not cause problems, as explained below.
+ */
+ maxdiv = 1;
+
+ /*
+ * Outer loop computes next quotient digit, which will go into div[qi]
+ */
+ for (qi = 0; qi < div_ndigits; qi++)
+ {
+ /* Approximate the current dividend value */
+ fdividend = (double) div[qi];
+ for (i = 1; i < 4; i++)
+ {
+ fdividend *= NBASE;
+ if (qi + i <= div_ndigits)
+ fdividend += (double) div[qi + i];
+ }
+ /* Compute the (approximate) quotient digit */
+ fquotient = fdividend * fdivisorinverse;
+ qdigit = (fquotient >= 0.0) ? ((int) fquotient) :
+ (((int) fquotient) - 1); /* truncate towards -infinity */
+
+ if (qdigit != 0)
+ {
+ /* Do we need to normalize now? */
+ maxdiv += Abs(qdigit);
+ if (maxdiv > (INT_MAX - INT_MAX / NBASE - 1) / (NBASE - 1))
+ {
+ /*
+ * Yes, do it. Note that if var2ndigits is much smaller than
+ * div_ndigits, we can save a significant amount of effort
+ * here by noting that we only need to normalise those div[]
+ * entries touched where prior iterations subtracted multiples
+ * of the divisor.
+ */
+ carry = 0;
+ for (i = Min(qi + var2ndigits - 2, div_ndigits); i > qi; i--)
+ {
+ newdig = div[i] + carry;
+ if (newdig < 0)
+ {
+ carry = -((-newdig - 1) / NBASE) - 1;
+ newdig -= carry * NBASE;
+ }
+ else if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ div[i] = newdig;
+ }
+ newdig = div[qi] + carry;
+ div[qi] = newdig;
+
+ /*
+ * All the div[] digits except possibly div[qi] are now in the
+ * range 0..NBASE-1. We do not need to consider div[qi] in
+ * the maxdiv value anymore, so we can reset maxdiv to 1.
+ */
+ maxdiv = 1;
+
+ /*
+ * Recompute the quotient digit since new info may have
+ * propagated into the top four dividend digits
+ */
+ fdividend = (double) div[qi];
+ for (i = 1; i < 4; i++)
+ {
+ fdividend *= NBASE;
+ if (qi + i <= div_ndigits)
+ fdividend += (double) div[qi + i];
+ }
+ /* Compute the (approximate) quotient digit */
+ fquotient = fdividend * fdivisorinverse;
+ qdigit = (fquotient >= 0.0) ? ((int) fquotient) :
+ (((int) fquotient) - 1); /* truncate towards -infinity */
+ maxdiv += Abs(qdigit);
+ }
+
+ /*
+ * Subtract off the appropriate multiple of the divisor.
+ *
+ * The digits beyond div[qi] cannot overflow, because we know they
+ * will fall within the maxdiv limit. As for div[qi] itself, note
+ * that qdigit is approximately trunc(div[qi] / vardigits[0]),
+ * which would make the new value simply div[qi] mod vardigits[0].
+ * The lower-order terms in qdigit can change this result by not
+ * more than about twice INT_MAX/NBASE, so overflow is impossible.
+ *
+ * This inner loop is the performance bottleneck for division, so
+ * code it in the same way as the inner loop of mul_var() so that
+ * it can be auto-vectorized. We cast qdigit to NumericDigit
+ * before multiplying to allow the compiler to generate more
+ * efficient code (using 16-bit multiplication), which is safe
+ * since we know that the quotient digit is off by at most one, so
+ * there is no overflow risk.
+ */
+ if (qdigit != 0)
+ {
+ int istop = Min(var2ndigits, div_ndigits - qi + 1);
+ int *div_qi = &div[qi];
+
+ for (i = 0; i < istop; i++)
+ div_qi[i] -= ((NumericDigit) qdigit) * var2digits[i];
+ }
+ }
+
+ /*
+ * The dividend digit we are about to replace might still be nonzero.
+ * Fold it into the next digit position.
+ *
+ * There is no risk of overflow here, although proving that requires
+ * some care. Much as with the argument for div[qi] not overflowing,
+ * if we consider the first two terms in the numerator and denominator
+ * of qdigit, we can see that the final value of div[qi + 1] will be
+ * approximately a remainder mod (vardigits[0]*NBASE + vardigits[1]).
+ * Accounting for the lower-order terms is a bit complicated but ends
+ * up adding not much more than INT_MAX/NBASE to the possible range.
+ * Thus, div[qi + 1] cannot overflow here, and in its role as div[qi]
+ * in the next loop iteration, it can't be large enough to cause
+ * overflow in the carry propagation step (if any), either.
+ *
+ * But having said that: div[qi] can be more than INT_MAX/NBASE, as
+ * noted above, which means that the product div[qi] * NBASE *can*
+ * overflow. When that happens, adding it to div[qi + 1] will always
+ * cause a canceling overflow so that the end result is correct. We
+ * could avoid the intermediate overflow by doing the multiplication
+ * and addition in int64 arithmetic, but so far there appears no need.
+ */
+ div[qi + 1] += div[qi] * NBASE;
+
+ div[qi] = qdigit;
+ }
+
+ /*
+ * Approximate and store the last quotient digit (div[div_ndigits])
+ */
+ fdividend = (double) div[qi];
+ for (i = 1; i < 4; i++)
+ fdividend *= NBASE;
+ fquotient = fdividend * fdivisorinverse;
+ qdigit = (fquotient >= 0.0) ? ((int) fquotient) :
+ (((int) fquotient) - 1); /* truncate towards -infinity */
+ div[qi] = qdigit;
+
+ /*
+ * Because the quotient digits might be off by one, some of them might be
+ * -1 or NBASE at this point. The represented value is correct in a
+ * mathematical sense, but it doesn't look right. We do a final carry
+ * propagation pass to normalize the digits, which we combine with storing
+ * the result digits into the output. Note that this is still done at
+ * full precision w/guard digits.
+ */
+ alloc_var(result, div_ndigits + 1);
+ res_digits = result->digits;
+ carry = 0;
+ for (i = div_ndigits; i >= 0; i--)
+ {
+ newdig = div[i] + carry;
+ if (newdig < 0)
+ {
+ carry = -((-newdig - 1) / NBASE) - 1;
+ newdig -= carry * NBASE;
+ }
+ else if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ res_digits[i] = newdig;
+ }
+ Assert(carry == 0);
+
+ pfree(div);
+
+ /*
+ * Finally, round the result to the requested precision.
+ */
+ result->weight = res_weight;
+ result->sign = res_sign;
+
+ /* Round to target rscale (and set result->dscale) */
+ if (round)
+ round_var(result, rscale);
+ else
+ trunc_var(result, rscale);
+
+ /* Strip leading and trailing zeroes */
+ strip_var(result);
+}
+
+
+/*
+ * div_var_int() -
+ *
+ * Divide a numeric variable by a 32-bit integer with the specified weight.
+ * The quotient var / (ival * NBASE^ival_weight) is stored in result.
+ */
+static void
+div_var_int(const NumericVar *var, int ival, int ival_weight,
+ NumericVar *result, int rscale, bool round)
+{
+ NumericDigit *var_digits = var->digits;
+ int var_ndigits = var->ndigits;
+ int res_sign;
+ int res_weight;
+ int res_ndigits;
+ NumericDigit *res_buf;
+ NumericDigit *res_digits;
+ uint32 divisor;
+ int i;
+
+ /* Guard against division by zero */
+ if (ival == 0)
+ ereport(ERROR,
+ errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero"));
+
+ /* Result zero check */
+ if (var_ndigits == 0)
+ {
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * Determine the result sign, weight and number of digits to calculate.
+ * The weight figured here is correct if the emitted quotient has no
+ * leading zero digits; otherwise strip_var() will fix things up.
+ */
+ if (var->sign == NUMERIC_POS)
+ res_sign = ival > 0 ? NUMERIC_POS : NUMERIC_NEG;
+ else
+ res_sign = ival > 0 ? NUMERIC_NEG : NUMERIC_POS;
+ res_weight = var->weight - ival_weight;
+ /* The number of accurate result digits we need to produce: */
+ res_ndigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS;
+ /* ... but always at least 1 */
+ res_ndigits = Max(res_ndigits, 1);
+ /* If rounding needed, figure one more digit to ensure correct result */
+ if (round)
+ res_ndigits++;
+
+ res_buf = digitbuf_alloc(res_ndigits + 1);
+ res_buf[0] = 0; /* spare digit for later rounding */
+ res_digits = res_buf + 1;
+
+ /*
+ * Now compute the quotient digits. This is the short division algorithm
+ * described in Knuth volume 2, section 4.3.1 exercise 16, except that we
+ * allow the divisor to exceed the internal base.
+ *
+ * In this algorithm, the carry from one digit to the next is at most
+ * divisor - 1. Therefore, while processing the next digit, carry may
+ * become as large as divisor * NBASE - 1, and so it requires a 64-bit
+ * integer if this exceeds UINT_MAX.
+ */
+ divisor = Abs(ival);
+
+ if (divisor <= UINT_MAX / NBASE)
+ {
+ /* carry cannot overflow 32 bits */
+ uint32 carry = 0;
+
+ for (i = 0; i < res_ndigits; i++)
+ {
+ carry = carry * NBASE + (i < var_ndigits ? var_digits[i] : 0);
+ res_digits[i] = (NumericDigit) (carry / divisor);
+ carry = carry % divisor;
+ }
+ }
+ else
+ {
+ /* carry may exceed 32 bits */
+ uint64 carry = 0;
+
+ for (i = 0; i < res_ndigits; i++)
+ {
+ carry = carry * NBASE + (i < var_ndigits ? var_digits[i] : 0);
+ res_digits[i] = (NumericDigit) (carry / divisor);
+ carry = carry % divisor;
+ }
+ }
+
+ /* Store the quotient in result */
+ digitbuf_free(result->buf);
+ result->ndigits = res_ndigits;
+ result->buf = res_buf;
+ result->digits = res_digits;
+ result->weight = res_weight;
+ result->sign = res_sign;
+
+ /* Round or truncate to target rscale (and set result->dscale) */
+ if (round)
+ round_var(result, rscale);
+ else
+ trunc_var(result, rscale);
+
+ /* Strip leading/trailing zeroes */
+ strip_var(result);
+}
+
+
+/*
+ * Default scale selection for division
+ *
+ * Returns the appropriate result scale for the division result.
+ */
+static int
+select_div_scale(const NumericVar *var1, const NumericVar *var2)
+{
+ int weight1,
+ weight2,
+ qweight,
+ i;
+ NumericDigit firstdigit1,
+ firstdigit2;
+ int rscale;
+
+ /*
+ * The result scale of a division isn't specified in any SQL standard. For
+ * PostgreSQL we select a result scale that will give at least
+ * NUMERIC_MIN_SIG_DIGITS significant digits, so that numeric gives a
+ * result no less accurate than float8; but use a scale not less than
+ * either input's display scale.
+ */
+
+ /* Get the actual (normalized) weight and first digit of each input */
+
+ weight1 = 0; /* values to use if var1 is zero */
+ firstdigit1 = 0;
+ for (i = 0; i < var1->ndigits; i++)
+ {
+ firstdigit1 = var1->digits[i];
+ if (firstdigit1 != 0)
+ {
+ weight1 = var1->weight - i;
+ break;
+ }
+ }
+
+ weight2 = 0; /* values to use if var2 is zero */
+ firstdigit2 = 0;
+ for (i = 0; i < var2->ndigits; i++)
+ {
+ firstdigit2 = var2->digits[i];
+ if (firstdigit2 != 0)
+ {
+ weight2 = var2->weight - i;
+ break;
+ }
+ }
+
+ /*
+ * Estimate weight of quotient. If the two first digits are equal, we
+ * can't be sure, but assume that var1 is less than var2.
+ */
+ qweight = weight1 - weight2;
+ if (firstdigit1 <= firstdigit2)
+ qweight--;
+
+ /* Select result scale */
+ rscale = NUMERIC_MIN_SIG_DIGITS - qweight * DEC_DIGITS;
+ rscale = Max(rscale, var1->dscale);
+ rscale = Max(rscale, var2->dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ return rscale;
+}
+
+
+/*
+ * mod_var() -
+ *
+ * Calculate the modulo of two numerics at variable level
+ */
+static void
+mod_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ NumericVar tmp;
+
+ init_var(&tmp);
+
+ /* ---------
+ * We do this using the equation
+ * mod(x,y) = x - trunc(x/y)*y
+ * div_var can be persuaded to give us trunc(x/y) directly.
+ * ----------
+ */
+ div_var(var1, var2, &tmp, 0, false);
+
+ mul_var(var2, &tmp, &tmp, var2->dscale);
+
+ sub_var(var1, &tmp, result);
+
+ free_var(&tmp);
+}
+
+
+/*
+ * div_mod_var() -
+ *
+ * Calculate the truncated integer quotient and numeric remainder of two
+ * numeric variables. The remainder is precise to var2's dscale.
+ */
+static void
+div_mod_var(const NumericVar *var1, const NumericVar *var2,
+ NumericVar *quot, NumericVar *rem)
+{
+ NumericVar q;
+ NumericVar r;
+
+ init_var(&q);
+ init_var(&r);
+
+ /*
+ * Use div_var_fast() to get an initial estimate for the integer quotient.
+ * This might be inaccurate (per the warning in div_var_fast's comments),
+ * but we can correct it below.
+ */
+ div_var_fast(var1, var2, &q, 0, false);
+
+ /* Compute initial estimate of remainder using the quotient estimate. */
+ mul_var(var2, &q, &r, var2->dscale);
+ sub_var(var1, &r, &r);
+
+ /*
+ * Adjust the results if necessary --- the remainder should have the same
+ * sign as var1, and its absolute value should be less than the absolute
+ * value of var2.
+ */
+ while (r.ndigits != 0 && r.sign != var1->sign)
+ {
+ /* The absolute value of the quotient is too large */
+ if (var1->sign == var2->sign)
+ {
+ sub_var(&q, &const_one, &q);
+ add_var(&r, var2, &r);
+ }
+ else
+ {
+ add_var(&q, &const_one, &q);
+ sub_var(&r, var2, &r);
+ }
+ }
+
+ while (cmp_abs(&r, var2) >= 0)
+ {
+ /* The absolute value of the quotient is too small */
+ if (var1->sign == var2->sign)
+ {
+ add_var(&q, &const_one, &q);
+ sub_var(&r, var2, &r);
+ }
+ else
+ {
+ sub_var(&q, &const_one, &q);
+ add_var(&r, var2, &r);
+ }
+ }
+
+ set_var_from_var(&q, quot);
+ set_var_from_var(&r, rem);
+
+ free_var(&q);
+ free_var(&r);
+}
+
+
+/*
+ * ceil_var() -
+ *
+ * Return the smallest integer greater than or equal to the argument
+ * on variable level
+ */
+static void
+ceil_var(const NumericVar *var, NumericVar *result)
+{
+ NumericVar tmp;
+
+ init_var(&tmp);
+ set_var_from_var(var, &tmp);
+
+ trunc_var(&tmp, 0);
+
+ if (var->sign == NUMERIC_POS && cmp_var(var, &tmp) != 0)
+ add_var(&tmp, &const_one, &tmp);
+
+ set_var_from_var(&tmp, result);
+ free_var(&tmp);
+}
+
+
+/*
+ * floor_var() -
+ *
+ * Return the largest integer equal to or less than the argument
+ * on variable level
+ */
+static void
+floor_var(const NumericVar *var, NumericVar *result)
+{
+ NumericVar tmp;
+
+ init_var(&tmp);
+ set_var_from_var(var, &tmp);
+
+ trunc_var(&tmp, 0);
+
+ if (var->sign == NUMERIC_NEG && cmp_var(var, &tmp) != 0)
+ sub_var(&tmp, &const_one, &tmp);
+
+ set_var_from_var(&tmp, result);
+ free_var(&tmp);
+}
+
+
+/*
+ * gcd_var() -
+ *
+ * Calculate the greatest common divisor of two numerics at variable level
+ */
+static void
+gcd_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ int res_dscale;
+ int cmp;
+ NumericVar tmp_arg;
+ NumericVar mod;
+
+ res_dscale = Max(var1->dscale, var2->dscale);
+
+ /*
+ * Arrange for var1 to be the number with the greater absolute value.
+ *
+ * This would happen automatically in the loop below, but avoids an
+ * expensive modulo operation.
+ */
+ cmp = cmp_abs(var1, var2);
+ if (cmp < 0)
+ {
+ const NumericVar *tmp = var1;
+
+ var1 = var2;
+ var2 = tmp;
+ }
+
+ /*
+ * Also avoid the taking the modulo if the inputs have the same absolute
+ * value, or if the smaller input is zero.
+ */
+ if (cmp == 0 || var2->ndigits == 0)
+ {
+ set_var_from_var(var1, result);
+ result->sign = NUMERIC_POS;
+ result->dscale = res_dscale;
+ return;
+ }
+
+ init_var(&tmp_arg);
+ init_var(&mod);
+
+ /* Use the Euclidean algorithm to find the GCD */
+ set_var_from_var(var1, &tmp_arg);
+ set_var_from_var(var2, result);
+
+ for (;;)
+ {
+ /* this loop can take a while, so allow it to be interrupted */
+ CHECK_FOR_INTERRUPTS();
+
+ mod_var(&tmp_arg, result, &mod);
+ if (mod.ndigits == 0)
+ break;
+ set_var_from_var(result, &tmp_arg);
+ set_var_from_var(&mod, result);
+ }
+ result->sign = NUMERIC_POS;
+ result->dscale = res_dscale;
+
+ free_var(&tmp_arg);
+ free_var(&mod);
+}
+
+
+/*
+ * sqrt_var() -
+ *
+ * Compute the square root of x using the Karatsuba Square Root algorithm.
+ * NOTE: we allow rscale < 0 here, implying rounding before the decimal
+ * point.
+ */
+static void
+sqrt_var(const NumericVar *arg, NumericVar *result, int rscale)
+{
+ int stat;
+ int res_weight;
+ int res_ndigits;
+ int src_ndigits;
+ int step;
+ int ndigits[32];
+ int blen;
+ int64 arg_int64;
+ int src_idx;
+ int64 s_int64;
+ int64 r_int64;
+ NumericVar s_var;
+ NumericVar r_var;
+ NumericVar a0_var;
+ NumericVar a1_var;
+ NumericVar q_var;
+ NumericVar u_var;
+
+ stat = cmp_var(arg, &const_zero);
+ if (stat == 0)
+ {
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * SQL2003 defines sqrt() in terms of power, so we need to emit the right
+ * SQLSTATE error code if the operand is negative.
+ */
+ if (stat < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("cannot take square root of a negative number")));
+
+ init_var(&s_var);
+ init_var(&r_var);
+ init_var(&a0_var);
+ init_var(&a1_var);
+ init_var(&q_var);
+ init_var(&u_var);
+
+ /*
+ * The result weight is half the input weight, rounded towards minus
+ * infinity --- res_weight = floor(arg->weight / 2).
+ */
+ if (arg->weight >= 0)
+ res_weight = arg->weight / 2;
+ else
+ res_weight = -((-arg->weight - 1) / 2 + 1);
+
+ /*
+ * Number of NBASE digits to compute. To ensure correct rounding, compute
+ * at least 1 extra decimal digit. We explicitly allow rscale to be
+ * negative here, but must always compute at least 1 NBASE digit. Thus
+ * res_ndigits = res_weight + 1 + ceil((rscale + 1) / DEC_DIGITS) or 1.
+ */
+ if (rscale + 1 >= 0)
+ res_ndigits = res_weight + 1 + (rscale + DEC_DIGITS) / DEC_DIGITS;
+ else
+ res_ndigits = res_weight + 1 - (-rscale - 1) / DEC_DIGITS;
+ res_ndigits = Max(res_ndigits, 1);
+
+ /*
+ * Number of source NBASE digits logically required to produce a result
+ * with this precision --- every digit before the decimal point, plus 2
+ * for each result digit after the decimal point (or minus 2 for each
+ * result digit we round before the decimal point).
+ */
+ src_ndigits = arg->weight + 1 + (res_ndigits - res_weight - 1) * 2;
+ src_ndigits = Max(src_ndigits, 1);
+
+ /* ----------
+ * From this point on, we treat the input and the result as integers and
+ * compute the integer square root and remainder using the Karatsuba
+ * Square Root algorithm, which may be written recursively as follows:
+ *
+ * SqrtRem(n = a3*b^3 + a2*b^2 + a1*b + a0):
+ * [ for some base b, and coefficients a0,a1,a2,a3 chosen so that
+ * 0 <= a0,a1,a2 < b and a3 >= b/4 ]
+ * Let (s,r) = SqrtRem(a3*b + a2)
+ * Let (q,u) = DivRem(r*b + a1, 2*s)
+ * Let s = s*b + q
+ * Let r = u*b + a0 - q^2
+ * If r < 0 Then
+ * Let r = r + s
+ * Let s = s - 1
+ * Let r = r + s
+ * Return (s,r)
+ *
+ * See "Karatsuba Square Root", Paul Zimmermann, INRIA Research Report
+ * RR-3805, November 1999. At the time of writing this was available
+ * on the net at <https://hal.inria.fr/inria-00072854>.
+ *
+ * The way to read the assumption "n = a3*b^3 + a2*b^2 + a1*b + a0" is
+ * "choose a base b such that n requires at least four base-b digits to
+ * express; then those digits are a3,a2,a1,a0, with a3 possibly larger
+ * than b". For optimal performance, b should have approximately a
+ * quarter the number of digits in the input, so that the outer square
+ * root computes roughly twice as many digits as the inner one. For
+ * simplicity, we choose b = NBASE^blen, an integer power of NBASE.
+ *
+ * We implement the algorithm iteratively rather than recursively, to
+ * allow the working variables to be reused. With this approach, each
+ * digit of the input is read precisely once --- src_idx tracks the number
+ * of input digits used so far.
+ *
+ * The array ndigits[] holds the number of NBASE digits of the input that
+ * will have been used at the end of each iteration, which roughly doubles
+ * each time. Note that the array elements are stored in reverse order,
+ * so if the final iteration requires src_ndigits = 37 input digits, the
+ * array will contain [37,19,11,7,5,3], and we would start by computing
+ * the square root of the 3 most significant NBASE digits.
+ *
+ * In each iteration, we choose blen to be the largest integer for which
+ * the input number has a3 >= b/4, when written in the form above. In
+ * general, this means blen = src_ndigits / 4 (truncated), but if
+ * src_ndigits is a multiple of 4, that might lead to the coefficient a3
+ * being less than b/4 (if the first input digit is less than NBASE/4), in
+ * which case we choose blen = src_ndigits / 4 - 1. The number of digits
+ * in the inner square root is then src_ndigits - 2*blen. So, for
+ * example, if we have src_ndigits = 26 initially, the array ndigits[]
+ * will be either [26,14,8,4] or [26,14,8,6,4], depending on the size of
+ * the first input digit.
+ *
+ * Additionally, we can put an upper bound on the number of steps required
+ * as follows --- suppose that the number of source digits is an n-bit
+ * number in the range [2^(n-1), 2^n-1], then blen will be in the range
+ * [2^(n-3)-1, 2^(n-2)-1] and the number of digits in the inner square
+ * root will be in the range [2^(n-2), 2^(n-1)+1]. In the next step, blen
+ * will be in the range [2^(n-4)-1, 2^(n-3)] and the number of digits in
+ * the next inner square root will be in the range [2^(n-3), 2^(n-2)+1].
+ * This pattern repeats, and in the worst case the array ndigits[] will
+ * contain [2^n-1, 2^(n-1)+1, 2^(n-2)+1, ... 9, 5, 3], and the computation
+ * will require n steps. Therefore, since all digit array sizes are
+ * signed 32-bit integers, the number of steps required is guaranteed to
+ * be less than 32.
+ * ----------
+ */
+ step = 0;
+ while ((ndigits[step] = src_ndigits) > 4)
+ {
+ /* Choose b so that a3 >= b/4, as described above */
+ blen = src_ndigits / 4;
+ if (blen * 4 == src_ndigits && arg->digits[0] < NBASE / 4)
+ blen--;
+
+ /* Number of digits in the next step (inner square root) */
+ src_ndigits -= 2 * blen;
+ step++;
+ }
+
+ /*
+ * First iteration (innermost square root and remainder):
+ *
+ * Here src_ndigits <= 4, and the input fits in an int64. Its square root
+ * has at most 9 decimal digits, so estimate it using double precision
+ * arithmetic, which will in fact almost certainly return the correct
+ * result with no further correction required.
+ */
+ arg_int64 = arg->digits[0];
+ for (src_idx = 1; src_idx < src_ndigits; src_idx++)
+ {
+ arg_int64 *= NBASE;
+ if (src_idx < arg->ndigits)
+ arg_int64 += arg->digits[src_idx];
+ }
+
+ s_int64 = (int64) sqrt((double) arg_int64);
+ r_int64 = arg_int64 - s_int64 * s_int64;
+
+ /*
+ * Use Newton's method to correct the result, if necessary.
+ *
+ * This uses integer division with truncation to compute the truncated
+ * integer square root by iterating using the formula x -> (x + n/x) / 2.
+ * This is known to converge to isqrt(n), unless n+1 is a perfect square.
+ * If n+1 is a perfect square, the sequence will oscillate between the two
+ * values isqrt(n) and isqrt(n)+1, so we can be assured of convergence by
+ * checking the remainder.
+ */
+ while (r_int64 < 0 || r_int64 > 2 * s_int64)
+ {
+ s_int64 = (s_int64 + arg_int64 / s_int64) / 2;
+ r_int64 = arg_int64 - s_int64 * s_int64;
+ }
+
+ /*
+ * Iterations with src_ndigits <= 8:
+ *
+ * The next 1 or 2 iterations compute larger (outer) square roots with
+ * src_ndigits <= 8, so the result still fits in an int64 (even though the
+ * input no longer does) and we can continue to compute using int64
+ * variables to avoid more expensive numeric computations.
+ *
+ * It is fairly easy to see that there is no risk of the intermediate
+ * values below overflowing 64-bit integers. In the worst case, the
+ * previous iteration will have computed a 3-digit square root (of a
+ * 6-digit input less than NBASE^6 / 4), so at the start of this
+ * iteration, s will be less than NBASE^3 / 2 = 10^12 / 2, and r will be
+ * less than 10^12. In this case, blen will be 1, so numer will be less
+ * than 10^17, and denom will be less than 10^12 (and hence u will also be
+ * less than 10^12). Finally, since q^2 = u*b + a0 - r, we can also be
+ * sure that q^2 < 10^17. Therefore all these quantities fit comfortably
+ * in 64-bit integers.
+ */
+ step--;
+ while (step >= 0 && (src_ndigits = ndigits[step]) <= 8)
+ {
+ int b;
+ int a0;
+ int a1;
+ int i;
+ int64 numer;
+ int64 denom;
+ int64 q;
+ int64 u;
+
+ blen = (src_ndigits - src_idx) / 2;
+
+ /* Extract a1 and a0, and compute b */
+ a0 = 0;
+ a1 = 0;
+ b = 1;
+
+ for (i = 0; i < blen; i++, src_idx++)
+ {
+ b *= NBASE;
+ a1 *= NBASE;
+ if (src_idx < arg->ndigits)
+ a1 += arg->digits[src_idx];
+ }
+
+ for (i = 0; i < blen; i++, src_idx++)
+ {
+ a0 *= NBASE;
+ if (src_idx < arg->ndigits)
+ a0 += arg->digits[src_idx];
+ }
+
+ /* Compute (q,u) = DivRem(r*b + a1, 2*s) */
+ numer = r_int64 * b + a1;
+ denom = 2 * s_int64;
+ q = numer / denom;
+ u = numer - q * denom;
+
+ /* Compute s = s*b + q and r = u*b + a0 - q^2 */
+ s_int64 = s_int64 * b + q;
+ r_int64 = u * b + a0 - q * q;
+
+ if (r_int64 < 0)
+ {
+ /* s is too large by 1; set r += s, s--, r += s */
+ r_int64 += s_int64;
+ s_int64--;
+ r_int64 += s_int64;
+ }
+
+ Assert(src_idx == src_ndigits); /* All input digits consumed */
+ step--;
+ }
+
+ /*
+ * On platforms with 128-bit integer support, we can further delay the
+ * need to use numeric variables.
+ */
+#ifdef HAVE_INT128
+ if (step >= 0)
+ {
+ int128 s_int128;
+ int128 r_int128;
+
+ s_int128 = s_int64;
+ r_int128 = r_int64;
+
+ /*
+ * Iterations with src_ndigits <= 16:
+ *
+ * The result fits in an int128 (even though the input doesn't) so we
+ * use int128 variables to avoid more expensive numeric computations.
+ */
+ while (step >= 0 && (src_ndigits = ndigits[step]) <= 16)
+ {
+ int64 b;
+ int64 a0;
+ int64 a1;
+ int64 i;
+ int128 numer;
+ int128 denom;
+ int128 q;
+ int128 u;
+
+ blen = (src_ndigits - src_idx) / 2;
+
+ /* Extract a1 and a0, and compute b */
+ a0 = 0;
+ a1 = 0;
+ b = 1;
+
+ for (i = 0; i < blen; i++, src_idx++)
+ {
+ b *= NBASE;
+ a1 *= NBASE;
+ if (src_idx < arg->ndigits)
+ a1 += arg->digits[src_idx];
+ }
+
+ for (i = 0; i < blen; i++, src_idx++)
+ {
+ a0 *= NBASE;
+ if (src_idx < arg->ndigits)
+ a0 += arg->digits[src_idx];
+ }
+
+ /* Compute (q,u) = DivRem(r*b + a1, 2*s) */
+ numer = r_int128 * b + a1;
+ denom = 2 * s_int128;
+ q = numer / denom;
+ u = numer - q * denom;
+
+ /* Compute s = s*b + q and r = u*b + a0 - q^2 */
+ s_int128 = s_int128 * b + q;
+ r_int128 = u * b + a0 - q * q;
+
+ if (r_int128 < 0)
+ {
+ /* s is too large by 1; set r += s, s--, r += s */
+ r_int128 += s_int128;
+ s_int128--;
+ r_int128 += s_int128;
+ }
+
+ Assert(src_idx == src_ndigits); /* All input digits consumed */
+ step--;
+ }
+
+ /*
+ * All remaining iterations require numeric variables. Convert the
+ * integer values to NumericVar and continue. Note that in the final
+ * iteration we don't need the remainder, so we can save a few cycles
+ * there by not fully computing it.
+ */
+ int128_to_numericvar(s_int128, &s_var);
+ if (step >= 0)
+ int128_to_numericvar(r_int128, &r_var);
+ }
+ else
+ {
+ int64_to_numericvar(s_int64, &s_var);
+ /* step < 0, so we certainly don't need r */
+ }
+#else /* !HAVE_INT128 */
+ int64_to_numericvar(s_int64, &s_var);
+ if (step >= 0)
+ int64_to_numericvar(r_int64, &r_var);
+#endif /* HAVE_INT128 */
+
+ /*
+ * The remaining iterations with src_ndigits > 8 (or 16, if have int128)
+ * use numeric variables.
+ */
+ while (step >= 0)
+ {
+ int tmp_len;
+
+ src_ndigits = ndigits[step];
+ blen = (src_ndigits - src_idx) / 2;
+
+ /* Extract a1 and a0 */
+ if (src_idx < arg->ndigits)
+ {
+ tmp_len = Min(blen, arg->ndigits - src_idx);
+ alloc_var(&a1_var, tmp_len);
+ memcpy(a1_var.digits, arg->digits + src_idx,
+ tmp_len * sizeof(NumericDigit));
+ a1_var.weight = blen - 1;
+ a1_var.sign = NUMERIC_POS;
+ a1_var.dscale = 0;
+ strip_var(&a1_var);
+ }
+ else
+ {
+ zero_var(&a1_var);
+ a1_var.dscale = 0;
+ }
+ src_idx += blen;
+
+ if (src_idx < arg->ndigits)
+ {
+ tmp_len = Min(blen, arg->ndigits - src_idx);
+ alloc_var(&a0_var, tmp_len);
+ memcpy(a0_var.digits, arg->digits + src_idx,
+ tmp_len * sizeof(NumericDigit));
+ a0_var.weight = blen - 1;
+ a0_var.sign = NUMERIC_POS;
+ a0_var.dscale = 0;
+ strip_var(&a0_var);
+ }
+ else
+ {
+ zero_var(&a0_var);
+ a0_var.dscale = 0;
+ }
+ src_idx += blen;
+
+ /* Compute (q,u) = DivRem(r*b + a1, 2*s) */
+ set_var_from_var(&r_var, &q_var);
+ q_var.weight += blen;
+ add_var(&q_var, &a1_var, &q_var);
+ add_var(&s_var, &s_var, &u_var);
+ div_mod_var(&q_var, &u_var, &q_var, &u_var);
+
+ /* Compute s = s*b + q */
+ s_var.weight += blen;
+ add_var(&s_var, &q_var, &s_var);
+
+ /*
+ * Compute r = u*b + a0 - q^2.
+ *
+ * In the final iteration, we don't actually need r; we just need to
+ * know whether it is negative, so that we know whether to adjust s.
+ * So instead of the final subtraction we can just compare.
+ */
+ u_var.weight += blen;
+ add_var(&u_var, &a0_var, &u_var);
+ mul_var(&q_var, &q_var, &q_var, 0);
+
+ if (step > 0)
+ {
+ /* Need r for later iterations */
+ sub_var(&u_var, &q_var, &r_var);
+ if (r_var.sign == NUMERIC_NEG)
+ {
+ /* s is too large by 1; set r += s, s--, r += s */
+ add_var(&r_var, &s_var, &r_var);
+ sub_var(&s_var, &const_one, &s_var);
+ add_var(&r_var, &s_var, &r_var);
+ }
+ }
+ else
+ {
+ /* Don't need r anymore, except to test if s is too large by 1 */
+ if (cmp_var(&u_var, &q_var) < 0)
+ sub_var(&s_var, &const_one, &s_var);
+ }
+
+ Assert(src_idx == src_ndigits); /* All input digits consumed */
+ step--;
+ }
+
+ /*
+ * Construct the final result, rounding it to the requested precision.
+ */
+ set_var_from_var(&s_var, result);
+ result->weight = res_weight;
+ result->sign = NUMERIC_POS;
+
+ /* Round to target rscale (and set result->dscale) */
+ round_var(result, rscale);
+
+ /* Strip leading and trailing zeroes */
+ strip_var(result);
+
+ free_var(&s_var);
+ free_var(&r_var);
+ free_var(&a0_var);
+ free_var(&a1_var);
+ free_var(&q_var);
+ free_var(&u_var);
+}
+
+
+/*
+ * exp_var() -
+ *
+ * Raise e to the power of x, computed to rscale fractional digits
+ */
+static void
+exp_var(const NumericVar *arg, NumericVar *result, int rscale)
+{
+ NumericVar x;
+ NumericVar elem;
+ int ni;
+ double val;
+ int dweight;
+ int ndiv2;
+ int sig_digits;
+ int local_rscale;
+
+ init_var(&x);
+ init_var(&elem);
+
+ set_var_from_var(arg, &x);
+
+ /*
+ * Estimate the dweight of the result using floating point arithmetic, so
+ * that we can choose an appropriate local rscale for the calculation.
+ */
+ val = numericvar_to_double_no_overflow(&x);
+
+ /* Guard against overflow/underflow */
+ /* If you change this limit, see also power_var()'s limit */
+ if (Abs(val) >= NUMERIC_MAX_RESULT_SCALE * 3)
+ {
+ if (val > 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /* decimal weight = log10(e^x) = x * log10(e) */
+ dweight = (int) (val * 0.434294481903252);
+
+ /*
+ * Reduce x to the range -0.01 <= x <= 0.01 (approximately) by dividing by
+ * 2^ndiv2, to improve the convergence rate of the Taylor series.
+ *
+ * Note that the overflow check above ensures that Abs(x) < 6000, which
+ * means that ndiv2 <= 20 here.
+ */
+ if (Abs(val) > 0.01)
+ {
+ ndiv2 = 1;
+ val /= 2;
+
+ while (Abs(val) > 0.01)
+ {
+ ndiv2++;
+ val /= 2;
+ }
+
+ local_rscale = x.dscale + ndiv2;
+ div_var_int(&x, 1 << ndiv2, 0, &x, local_rscale, true);
+ }
+ else
+ ndiv2 = 0;
+
+ /*
+ * Set the scale for the Taylor series expansion. The final result has
+ * (dweight + rscale + 1) significant digits. In addition, we have to
+ * raise the Taylor series result to the power 2^ndiv2, which introduces
+ * an error of up to around log10(2^ndiv2) digits, so work with this many
+ * extra digits of precision (plus a few more for good measure).
+ */
+ sig_digits = 1 + dweight + rscale + (int) (ndiv2 * 0.301029995663981);
+ sig_digits = Max(sig_digits, 0) + 8;
+
+ local_rscale = sig_digits - 1;
+
+ /*
+ * Use the Taylor series
+ *
+ * exp(x) = 1 + x + x^2/2! + x^3/3! + ...
+ *
+ * Given the limited range of x, this should converge reasonably quickly.
+ * We run the series until the terms fall below the local_rscale limit.
+ */
+ add_var(&const_one, &x, result);
+
+ mul_var(&x, &x, &elem, local_rscale);
+ ni = 2;
+ div_var_int(&elem, ni, 0, &elem, local_rscale, true);
+
+ while (elem.ndigits != 0)
+ {
+ add_var(result, &elem, result);
+
+ mul_var(&elem, &x, &elem, local_rscale);
+ ni++;
+ div_var_int(&elem, ni, 0, &elem, local_rscale, true);
+ }
+
+ /*
+ * Compensate for the argument range reduction. Since the weight of the
+ * result doubles with each multiplication, we can reduce the local rscale
+ * as we proceed.
+ */
+ while (ndiv2-- > 0)
+ {
+ local_rscale = sig_digits - result->weight * 2 * DEC_DIGITS;
+ local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ mul_var(result, result, result, local_rscale);
+ }
+
+ /* Round to requested rscale */
+ round_var(result, rscale);
+
+ free_var(&x);
+ free_var(&elem);
+}
+
+
+/*
+ * Estimate the dweight of the most significant decimal digit of the natural
+ * logarithm of a number.
+ *
+ * Essentially, we're approximating log10(abs(ln(var))). This is used to
+ * determine the appropriate rscale when computing natural logarithms.
+ *
+ * Note: many callers call this before range-checking the input. Therefore,
+ * we must be robust against values that are invalid to apply ln() to.
+ * We don't wish to throw an error here, so just return zero in such cases.
+ */
+static int
+estimate_ln_dweight(const NumericVar *var)
+{
+ int ln_dweight;
+
+ /* Caller should fail on ln(negative), but for the moment return zero */
+ if (var->sign != NUMERIC_POS)
+ return 0;
+
+ if (cmp_var(var, &const_zero_point_nine) >= 0 &&
+ cmp_var(var, &const_one_point_one) <= 0)
+ {
+ /*
+ * 0.9 <= var <= 1.1
+ *
+ * ln(var) has a negative weight (possibly very large). To get a
+ * reasonably accurate result, estimate it using ln(1+x) ~= x.
+ */
+ NumericVar x;
+
+ init_var(&x);
+ sub_var(var, &const_one, &x);
+
+ if (x.ndigits > 0)
+ {
+ /* Use weight of most significant decimal digit of x */
+ ln_dweight = x.weight * DEC_DIGITS + (int) log10(x.digits[0]);
+ }
+ else
+ {
+ /* x = 0. Since ln(1) = 0 exactly, we don't need extra digits */
+ ln_dweight = 0;
+ }
+
+ free_var(&x);
+ }
+ else
+ {
+ /*
+ * Estimate the logarithm using the first couple of digits from the
+ * input number. This will give an accurate result whenever the input
+ * is not too close to 1.
+ */
+ if (var->ndigits > 0)
+ {
+ int digits;
+ int dweight;
+ double ln_var;
+
+ digits = var->digits[0];
+ dweight = var->weight * DEC_DIGITS;
+
+ if (var->ndigits > 1)
+ {
+ digits = digits * NBASE + var->digits[1];
+ dweight -= DEC_DIGITS;
+ }
+
+ /*----------
+ * We have var ~= digits * 10^dweight
+ * so ln(var) ~= ln(digits) + dweight * ln(10)
+ *----------
+ */
+ ln_var = log((double) digits) + dweight * 2.302585092994046;
+ ln_dweight = (int) log10(Abs(ln_var));
+ }
+ else
+ {
+ /* Caller should fail on ln(0), but for the moment return zero */
+ ln_dweight = 0;
+ }
+ }
+
+ return ln_dweight;
+}
+
+
+/*
+ * ln_var() -
+ *
+ * Compute the natural log of x
+ */
+static void
+ln_var(const NumericVar *arg, NumericVar *result, int rscale)
+{
+ NumericVar x;
+ NumericVar xx;
+ int ni;
+ NumericVar elem;
+ NumericVar fact;
+ int nsqrt;
+ int local_rscale;
+ int cmp;
+
+ cmp = cmp_var(arg, &const_zero);
+ if (cmp == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of zero")));
+ else if (cmp < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_LOG),
+ errmsg("cannot take logarithm of a negative number")));
+
+ init_var(&x);
+ init_var(&xx);
+ init_var(&elem);
+ init_var(&fact);
+
+ set_var_from_var(arg, &x);
+ set_var_from_var(&const_two, &fact);
+
+ /*
+ * Reduce input into range 0.9 < x < 1.1 with repeated sqrt() operations.
+ *
+ * The final logarithm will have up to around rscale+6 significant digits.
+ * Each sqrt() will roughly halve the weight of x, so adjust the local
+ * rscale as we work so that we keep this many significant digits at each
+ * step (plus a few more for good measure).
+ *
+ * Note that we allow local_rscale < 0 during this input reduction
+ * process, which implies rounding before the decimal point. sqrt_var()
+ * explicitly supports this, and it significantly reduces the work
+ * required to reduce very large inputs to the required range. Once the
+ * input reduction is complete, x.weight will be 0 and its display scale
+ * will be non-negative again.
+ */
+ nsqrt = 0;
+ while (cmp_var(&x, &const_zero_point_nine) <= 0)
+ {
+ local_rscale = rscale - x.weight * DEC_DIGITS / 2 + 8;
+ sqrt_var(&x, &x, local_rscale);
+ mul_var(&fact, &const_two, &fact, 0);
+ nsqrt++;
+ }
+ while (cmp_var(&x, &const_one_point_one) >= 0)
+ {
+ local_rscale = rscale - x.weight * DEC_DIGITS / 2 + 8;
+ sqrt_var(&x, &x, local_rscale);
+ mul_var(&fact, &const_two, &fact, 0);
+ nsqrt++;
+ }
+
+ /*
+ * We use the Taylor series for 0.5 * ln((1+z)/(1-z)),
+ *
+ * z + z^3/3 + z^5/5 + ...
+ *
+ * where z = (x-1)/(x+1) is in the range (approximately) -0.053 .. 0.048
+ * due to the above range-reduction of x.
+ *
+ * The convergence of this is not as fast as one would like, but is
+ * tolerable given that z is small.
+ *
+ * The Taylor series result will be multiplied by 2^(nsqrt+1), which has a
+ * decimal weight of (nsqrt+1) * log10(2), so work with this many extra
+ * digits of precision (plus a few more for good measure).
+ */
+ local_rscale = rscale + (int) ((nsqrt + 1) * 0.301029995663981) + 8;
+
+ sub_var(&x, &const_one, result);
+ add_var(&x, &const_one, &elem);
+ div_var_fast(result, &elem, result, local_rscale, true);
+ set_var_from_var(result, &xx);
+ mul_var(result, result, &x, local_rscale);
+
+ ni = 1;
+
+ for (;;)
+ {
+ ni += 2;
+ mul_var(&xx, &x, &xx, local_rscale);
+ div_var_int(&xx, ni, 0, &elem, local_rscale, true);
+
+ if (elem.ndigits == 0)
+ break;
+
+ add_var(result, &elem, result);
+
+ if (elem.weight < (result->weight - local_rscale * 2 / DEC_DIGITS))
+ break;
+ }
+
+ /* Compensate for argument range reduction, round to requested rscale */
+ mul_var(result, &fact, result, rscale);
+
+ free_var(&x);
+ free_var(&xx);
+ free_var(&elem);
+ free_var(&fact);
+}
+
+
+/*
+ * log_var() -
+ *
+ * Compute the logarithm of num in a given base.
+ *
+ * Note: this routine chooses dscale of the result.
+ */
+static void
+log_var(const NumericVar *base, const NumericVar *num, NumericVar *result)
+{
+ NumericVar ln_base;
+ NumericVar ln_num;
+ int ln_base_dweight;
+ int ln_num_dweight;
+ int result_dweight;
+ int rscale;
+ int ln_base_rscale;
+ int ln_num_rscale;
+
+ init_var(&ln_base);
+ init_var(&ln_num);
+
+ /* Estimated dweights of ln(base), ln(num) and the final result */
+ ln_base_dweight = estimate_ln_dweight(base);
+ ln_num_dweight = estimate_ln_dweight(num);
+ result_dweight = ln_num_dweight - ln_base_dweight;
+
+ /*
+ * Select the scale of the result so that it will have at least
+ * NUMERIC_MIN_SIG_DIGITS significant digits and is not less than either
+ * input's display scale.
+ */
+ rscale = NUMERIC_MIN_SIG_DIGITS - result_dweight;
+ rscale = Max(rscale, base->dscale);
+ rscale = Max(rscale, num->dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ /*
+ * Set the scales for ln(base) and ln(num) so that they each have more
+ * significant digits than the final result.
+ */
+ ln_base_rscale = rscale + result_dweight - ln_base_dweight + 8;
+ ln_base_rscale = Max(ln_base_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ ln_num_rscale = rscale + result_dweight - ln_num_dweight + 8;
+ ln_num_rscale = Max(ln_num_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ /* Form natural logarithms */
+ ln_var(base, &ln_base, ln_base_rscale);
+ ln_var(num, &ln_num, ln_num_rscale);
+
+ /* Divide and round to the required scale */
+ div_var_fast(&ln_num, &ln_base, result, rscale, true);
+
+ free_var(&ln_num);
+ free_var(&ln_base);
+}
+
+
+/*
+ * power_var() -
+ *
+ * Raise base to the power of exp
+ *
+ * Note: this routine chooses dscale of the result.
+ */
+static void
+power_var(const NumericVar *base, const NumericVar *exp, NumericVar *result)
+{
+ int res_sign;
+ NumericVar abs_base;
+ NumericVar ln_base;
+ NumericVar ln_num;
+ int ln_dweight;
+ int rscale;
+ int sig_digits;
+ int local_rscale;
+ double val;
+
+ /* If exp can be represented as an integer, use power_var_int */
+ if (exp->ndigits == 0 || exp->ndigits <= exp->weight + 1)
+ {
+ /* exact integer, but does it fit in int? */
+ int64 expval64;
+
+ if (numericvar_to_int64(exp, &expval64))
+ {
+ if (expval64 >= PG_INT32_MIN && expval64 <= PG_INT32_MAX)
+ {
+ /* Okay, select rscale */
+ rscale = NUMERIC_MIN_SIG_DIGITS;
+ rscale = Max(rscale, base->dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ power_var_int(base, (int) expval64, result, rscale);
+ return;
+ }
+ }
+ }
+
+ /*
+ * This avoids log(0) for cases of 0 raised to a non-integer. 0 ^ 0 is
+ * handled by power_var_int().
+ */
+ if (cmp_var(base, &const_zero) == 0)
+ {
+ set_var_from_var(&const_zero, result);
+ result->dscale = NUMERIC_MIN_SIG_DIGITS; /* no need to round */
+ return;
+ }
+
+ init_var(&abs_base);
+ init_var(&ln_base);
+ init_var(&ln_num);
+
+ /*
+ * If base is negative, insist that exp be an integer. The result is then
+ * positive if exp is even and negative if exp is odd.
+ */
+ if (base->sign == NUMERIC_NEG)
+ {
+ /*
+ * Check that exp is an integer. This error code is defined by the
+ * SQL standard, and matches other errors in numeric_power().
+ */
+ if (exp->ndigits > 0 && exp->ndigits > exp->weight + 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION),
+ errmsg("a negative number raised to a non-integer power yields a complex result")));
+
+ /* Test if exp is odd or even */
+ if (exp->ndigits > 0 && exp->ndigits == exp->weight + 1 &&
+ (exp->digits[exp->ndigits - 1] & 1))
+ res_sign = NUMERIC_NEG;
+ else
+ res_sign = NUMERIC_POS;
+
+ /* Then work with abs(base) below */
+ set_var_from_var(base, &abs_base);
+ abs_base.sign = NUMERIC_POS;
+ base = &abs_base;
+ }
+ else
+ res_sign = NUMERIC_POS;
+
+ /*----------
+ * Decide on the scale for the ln() calculation. For this we need an
+ * estimate of the weight of the result, which we obtain by doing an
+ * initial low-precision calculation of exp * ln(base).
+ *
+ * We want result = e ^ (exp * ln(base))
+ * so result dweight = log10(result) = exp * ln(base) * log10(e)
+ *
+ * We also perform a crude overflow test here so that we can exit early if
+ * the full-precision result is sure to overflow, and to guard against
+ * integer overflow when determining the scale for the real calculation.
+ * exp_var() supports inputs up to NUMERIC_MAX_RESULT_SCALE * 3, so the
+ * result will overflow if exp * ln(base) >= NUMERIC_MAX_RESULT_SCALE * 3.
+ * Since the values here are only approximations, we apply a small fuzz
+ * factor to this overflow test and let exp_var() determine the exact
+ * overflow threshold so that it is consistent for all inputs.
+ *----------
+ */
+ ln_dweight = estimate_ln_dweight(base);
+
+ /*
+ * Set the scale for the low-precision calculation, computing ln(base) to
+ * around 8 significant digits. Note that ln_dweight may be as small as
+ * -SHRT_MAX, so the scale may exceed NUMERIC_MAX_DISPLAY_SCALE here.
+ */
+ local_rscale = 8 - ln_dweight;
+ local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ ln_var(base, &ln_base, local_rscale);
+
+ mul_var(&ln_base, exp, &ln_num, local_rscale);
+
+ val = numericvar_to_double_no_overflow(&ln_num);
+
+ /* initial overflow/underflow test with fuzz factor */
+ if (Abs(val) > NUMERIC_MAX_RESULT_SCALE * 3.01)
+ {
+ if (val > 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ zero_var(result);
+ result->dscale = NUMERIC_MAX_DISPLAY_SCALE;
+ return;
+ }
+
+ val *= 0.434294481903252; /* approximate decimal result weight */
+
+ /* choose the result scale */
+ rscale = NUMERIC_MIN_SIG_DIGITS - (int) val;
+ rscale = Max(rscale, base->dscale);
+ rscale = Max(rscale, exp->dscale);
+ rscale = Max(rscale, NUMERIC_MIN_DISPLAY_SCALE);
+ rscale = Min(rscale, NUMERIC_MAX_DISPLAY_SCALE);
+
+ /* significant digits required in the result */
+ sig_digits = rscale + (int) val;
+ sig_digits = Max(sig_digits, 0);
+
+ /* set the scale for the real exp * ln(base) calculation */
+ local_rscale = sig_digits - ln_dweight + 8;
+ local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ /* and do the real calculation */
+
+ ln_var(base, &ln_base, local_rscale);
+
+ mul_var(&ln_base, exp, &ln_num, local_rscale);
+
+ exp_var(&ln_num, result, rscale);
+
+ if (res_sign == NUMERIC_NEG && result->ndigits > 0)
+ result->sign = NUMERIC_NEG;
+
+ free_var(&ln_num);
+ free_var(&ln_base);
+ free_var(&abs_base);
+}
+
+/*
+ * power_var_int() -
+ *
+ * Raise base to the power of exp, where exp is an integer.
+ */
+static void
+power_var_int(const NumericVar *base, int exp, NumericVar *result, int rscale)
+{
+ double f;
+ int p;
+ int i;
+ int sig_digits;
+ unsigned int mask;
+ bool neg;
+ NumericVar base_prod;
+ int local_rscale;
+
+ /* Handle some common special cases, as well as corner cases */
+ switch (exp)
+ {
+ case 0:
+
+ /*
+ * While 0 ^ 0 can be either 1 or indeterminate (error), we treat
+ * it as 1 because most programming languages do this. SQL:2003
+ * also requires a return value of 1.
+ * https://en.wikipedia.org/wiki/Exponentiation#Zero_to_the_zero_power
+ */
+ set_var_from_var(&const_one, result);
+ result->dscale = rscale; /* no need to round */
+ return;
+ case 1:
+ set_var_from_var(base, result);
+ round_var(result, rscale);
+ return;
+ case -1:
+ div_var(&const_one, base, result, rscale, true);
+ return;
+ case 2:
+ mul_var(base, base, result, rscale);
+ return;
+ default:
+ break;
+ }
+
+ /* Handle the special case where the base is zero */
+ if (base->ndigits == 0)
+ {
+ if (exp < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * The general case repeatedly multiplies base according to the bit
+ * pattern of exp.
+ *
+ * First we need to estimate the weight of the result so that we know how
+ * many significant digits are needed.
+ */
+ f = base->digits[0];
+ p = base->weight * DEC_DIGITS;
+
+ for (i = 1; i < base->ndigits && i * DEC_DIGITS < 16; i++)
+ {
+ f = f * NBASE + base->digits[i];
+ p -= DEC_DIGITS;
+ }
+
+ /*----------
+ * We have base ~= f * 10^p
+ * so log10(result) = log10(base^exp) ~= exp * (log10(f) + p)
+ *----------
+ */
+ f = exp * (log10(f) + p);
+
+ /*
+ * Apply crude overflow/underflow tests so we can exit early if the result
+ * certainly will overflow/underflow.
+ */
+ if (f > 3 * SHRT_MAX * DEC_DIGITS)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ if (f + 1 < -rscale || f + 1 < -NUMERIC_MAX_DISPLAY_SCALE)
+ {
+ zero_var(result);
+ result->dscale = rscale;
+ return;
+ }
+
+ /*
+ * Approximate number of significant digits in the result. Note that the
+ * underflow test above means that this is necessarily >= 0.
+ */
+ sig_digits = 1 + rscale + (int) f;
+
+ /*
+ * The multiplications to produce the result may introduce an error of up
+ * to around log10(abs(exp)) digits, so work with this many extra digits
+ * of precision (plus a few more for good measure).
+ */
+ sig_digits += (int) log(fabs((double) exp)) + 8;
+
+ /*
+ * Now we can proceed with the multiplications.
+ */
+ neg = (exp < 0);
+ mask = Abs(exp);
+
+ init_var(&base_prod);
+ set_var_from_var(base, &base_prod);
+
+ if (mask & 1)
+ set_var_from_var(base, result);
+ else
+ set_var_from_var(&const_one, result);
+
+ while ((mask >>= 1) > 0)
+ {
+ /*
+ * Do the multiplications using rscales large enough to hold the
+ * results to the required number of significant digits, but don't
+ * waste time by exceeding the scales of the numbers themselves.
+ */
+ local_rscale = sig_digits - 2 * base_prod.weight * DEC_DIGITS;
+ local_rscale = Min(local_rscale, 2 * base_prod.dscale);
+ local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ mul_var(&base_prod, &base_prod, &base_prod, local_rscale);
+
+ if (mask & 1)
+ {
+ local_rscale = sig_digits -
+ (base_prod.weight + result->weight) * DEC_DIGITS;
+ local_rscale = Min(local_rscale,
+ base_prod.dscale + result->dscale);
+ local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE);
+
+ mul_var(&base_prod, result, result, local_rscale);
+ }
+
+ /*
+ * When abs(base) > 1, the number of digits to the left of the decimal
+ * point in base_prod doubles at each iteration, so if exp is large we
+ * could easily spend large amounts of time and memory space doing the
+ * multiplications. But once the weight exceeds what will fit in
+ * int16, the final result is guaranteed to overflow (or underflow, if
+ * exp < 0), so we can give up before wasting too many cycles.
+ */
+ if (base_prod.weight > SHRT_MAX || result->weight > SHRT_MAX)
+ {
+ /* overflow, unless neg, in which case result should be 0 */
+ if (!neg)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value overflows numeric format")));
+ zero_var(result);
+ neg = false;
+ break;
+ }
+ }
+
+ free_var(&base_prod);
+
+ /* Compensate for input sign, and round to requested rscale */
+ if (neg)
+ div_var_fast(&const_one, result, result, rscale, true);
+ else
+ round_var(result, rscale);
+}
+
+/*
+ * power_ten_int() -
+ *
+ * Raise ten to the power of exp, where exp is an integer. Note that unlike
+ * power_var_int(), this does no overflow/underflow checking or rounding.
+ */
+static void
+power_ten_int(int exp, NumericVar *result)
+{
+ /* Construct the result directly, starting from 10^0 = 1 */
+ set_var_from_var(&const_one, result);
+
+ /* Scale needed to represent the result exactly */
+ result->dscale = exp < 0 ? -exp : 0;
+
+ /* Base-NBASE weight of result and remaining exponent */
+ if (exp >= 0)
+ result->weight = exp / DEC_DIGITS;
+ else
+ result->weight = (exp + 1) / DEC_DIGITS - 1;
+
+ exp -= result->weight * DEC_DIGITS;
+
+ /* Final adjustment of the result's single NBASE digit */
+ while (exp-- > 0)
+ result->digits[0] *= 10;
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Following are the lowest level functions that operate unsigned
+ * on the variable level
+ *
+ * ----------------------------------------------------------------------
+ */
+
+
+/* ----------
+ * cmp_abs() -
+ *
+ * Compare the absolute values of var1 and var2
+ * Returns: -1 for ABS(var1) < ABS(var2)
+ * 0 for ABS(var1) == ABS(var2)
+ * 1 for ABS(var1) > ABS(var2)
+ * ----------
+ */
+static int
+cmp_abs(const NumericVar *var1, const NumericVar *var2)
+{
+ return cmp_abs_common(var1->digits, var1->ndigits, var1->weight,
+ var2->digits, var2->ndigits, var2->weight);
+}
+
+/* ----------
+ * cmp_abs_common() -
+ *
+ * Main routine of cmp_abs(). This function can be used by both
+ * NumericVar and Numeric.
+ * ----------
+ */
+static int
+cmp_abs_common(const NumericDigit *var1digits, int var1ndigits, int var1weight,
+ const NumericDigit *var2digits, int var2ndigits, int var2weight)
+{
+ int i1 = 0;
+ int i2 = 0;
+
+ /* Check any digits before the first common digit */
+
+ while (var1weight > var2weight && i1 < var1ndigits)
+ {
+ if (var1digits[i1++] != 0)
+ return 1;
+ var1weight--;
+ }
+ while (var2weight > var1weight && i2 < var2ndigits)
+ {
+ if (var2digits[i2++] != 0)
+ return -1;
+ var2weight--;
+ }
+
+ /* At this point, either w1 == w2 or we've run out of digits */
+
+ if (var1weight == var2weight)
+ {
+ while (i1 < var1ndigits && i2 < var2ndigits)
+ {
+ int stat = var1digits[i1++] - var2digits[i2++];
+
+ if (stat)
+ {
+ if (stat > 0)
+ return 1;
+ return -1;
+ }
+ }
+ }
+
+ /*
+ * At this point, we've run out of digits on one side or the other; so any
+ * remaining nonzero digits imply that side is larger
+ */
+ while (i1 < var1ndigits)
+ {
+ if (var1digits[i1++] != 0)
+ return 1;
+ }
+ while (i2 < var2ndigits)
+ {
+ if (var2digits[i2++] != 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * add_abs() -
+ *
+ * Add the absolute values of two variables into result.
+ * result might point to one of the operands without danger.
+ */
+static void
+add_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ NumericDigit *res_buf;
+ NumericDigit *res_digits;
+ int res_ndigits;
+ int res_weight;
+ int res_rscale,
+ rscale1,
+ rscale2;
+ int res_dscale;
+ int i,
+ i1,
+ i2;
+ int carry = 0;
+
+ /* copy these values into local vars for speed in inner loop */
+ int var1ndigits = var1->ndigits;
+ int var2ndigits = var2->ndigits;
+ NumericDigit *var1digits = var1->digits;
+ NumericDigit *var2digits = var2->digits;
+
+ res_weight = Max(var1->weight, var2->weight) + 1;
+
+ res_dscale = Max(var1->dscale, var2->dscale);
+
+ /* Note: here we are figuring rscale in base-NBASE digits */
+ rscale1 = var1->ndigits - var1->weight - 1;
+ rscale2 = var2->ndigits - var2->weight - 1;
+ res_rscale = Max(rscale1, rscale2);
+
+ res_ndigits = res_rscale + res_weight + 1;
+ if (res_ndigits <= 0)
+ res_ndigits = 1;
+
+ res_buf = digitbuf_alloc(res_ndigits + 1);
+ res_buf[0] = 0; /* spare digit for later rounding */
+ res_digits = res_buf + 1;
+
+ i1 = res_rscale + var1->weight + 1;
+ i2 = res_rscale + var2->weight + 1;
+ for (i = res_ndigits - 1; i >= 0; i--)
+ {
+ i1--;
+ i2--;
+ if (i1 >= 0 && i1 < var1ndigits)
+ carry += var1digits[i1];
+ if (i2 >= 0 && i2 < var2ndigits)
+ carry += var2digits[i2];
+
+ if (carry >= NBASE)
+ {
+ res_digits[i] = carry - NBASE;
+ carry = 1;
+ }
+ else
+ {
+ res_digits[i] = carry;
+ carry = 0;
+ }
+ }
+
+ Assert(carry == 0); /* else we failed to allow for carry out */
+
+ digitbuf_free(result->buf);
+ result->ndigits = res_ndigits;
+ result->buf = res_buf;
+ result->digits = res_digits;
+ result->weight = res_weight;
+ result->dscale = res_dscale;
+
+ /* Remove leading/trailing zeroes */
+ strip_var(result);
+}
+
+
+/*
+ * sub_abs()
+ *
+ * Subtract the absolute value of var2 from the absolute value of var1
+ * and store in result. result might point to one of the operands
+ * without danger.
+ *
+ * ABS(var1) MUST BE GREATER OR EQUAL ABS(var2) !!!
+ */
+static void
+sub_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
+{
+ NumericDigit *res_buf;
+ NumericDigit *res_digits;
+ int res_ndigits;
+ int res_weight;
+ int res_rscale,
+ rscale1,
+ rscale2;
+ int res_dscale;
+ int i,
+ i1,
+ i2;
+ int borrow = 0;
+
+ /* copy these values into local vars for speed in inner loop */
+ int var1ndigits = var1->ndigits;
+ int var2ndigits = var2->ndigits;
+ NumericDigit *var1digits = var1->digits;
+ NumericDigit *var2digits = var2->digits;
+
+ res_weight = var1->weight;
+
+ res_dscale = Max(var1->dscale, var2->dscale);
+
+ /* Note: here we are figuring rscale in base-NBASE digits */
+ rscale1 = var1->ndigits - var1->weight - 1;
+ rscale2 = var2->ndigits - var2->weight - 1;
+ res_rscale = Max(rscale1, rscale2);
+
+ res_ndigits = res_rscale + res_weight + 1;
+ if (res_ndigits <= 0)
+ res_ndigits = 1;
+
+ res_buf = digitbuf_alloc(res_ndigits + 1);
+ res_buf[0] = 0; /* spare digit for later rounding */
+ res_digits = res_buf + 1;
+
+ i1 = res_rscale + var1->weight + 1;
+ i2 = res_rscale + var2->weight + 1;
+ for (i = res_ndigits - 1; i >= 0; i--)
+ {
+ i1--;
+ i2--;
+ if (i1 >= 0 && i1 < var1ndigits)
+ borrow += var1digits[i1];
+ if (i2 >= 0 && i2 < var2ndigits)
+ borrow -= var2digits[i2];
+
+ if (borrow < 0)
+ {
+ res_digits[i] = borrow + NBASE;
+ borrow = -1;
+ }
+ else
+ {
+ res_digits[i] = borrow;
+ borrow = 0;
+ }
+ }
+
+ Assert(borrow == 0); /* else caller gave us var1 < var2 */
+
+ digitbuf_free(result->buf);
+ result->ndigits = res_ndigits;
+ result->buf = res_buf;
+ result->digits = res_digits;
+ result->weight = res_weight;
+ result->dscale = res_dscale;
+
+ /* Remove leading/trailing zeroes */
+ strip_var(result);
+}
+
+/*
+ * round_var
+ *
+ * Round the value of a variable to no more than rscale decimal digits
+ * after the decimal point. NOTE: we allow rscale < 0 here, implying
+ * rounding before the decimal point.
+ */
+static void
+round_var(NumericVar *var, int rscale)
+{
+ NumericDigit *digits = var->digits;
+ int di;
+ int ndigits;
+ int carry;
+
+ var->dscale = rscale;
+
+ /* decimal digits wanted */
+ di = (var->weight + 1) * DEC_DIGITS + rscale;
+
+ /*
+ * If di = 0, the value loses all digits, but could round up to 1 if its
+ * first extra digit is >= 5. If di < 0 the result must be 0.
+ */
+ if (di < 0)
+ {
+ var->ndigits = 0;
+ var->weight = 0;
+ var->sign = NUMERIC_POS;
+ }
+ else
+ {
+ /* NBASE digits wanted */
+ ndigits = (di + DEC_DIGITS - 1) / DEC_DIGITS;
+
+ /* 0, or number of decimal digits to keep in last NBASE digit */
+ di %= DEC_DIGITS;
+
+ if (ndigits < var->ndigits ||
+ (ndigits == var->ndigits && di > 0))
+ {
+ var->ndigits = ndigits;
+
+#if DEC_DIGITS == 1
+ /* di must be zero */
+ carry = (digits[ndigits] >= HALF_NBASE) ? 1 : 0;
+#else
+ if (di == 0)
+ carry = (digits[ndigits] >= HALF_NBASE) ? 1 : 0;
+ else
+ {
+ /* Must round within last NBASE digit */
+ int extra,
+ pow10;
+
+#if DEC_DIGITS == 4
+ pow10 = round_powers[di];
+#elif DEC_DIGITS == 2
+ pow10 = 10;
+#else
+#error unsupported NBASE
+#endif
+ extra = digits[--ndigits] % pow10;
+ digits[ndigits] -= extra;
+ carry = 0;
+ if (extra >= pow10 / 2)
+ {
+ pow10 += digits[ndigits];
+ if (pow10 >= NBASE)
+ {
+ pow10 -= NBASE;
+ carry = 1;
+ }
+ digits[ndigits] = pow10;
+ }
+ }
+#endif
+
+ /* Propagate carry if needed */
+ while (carry)
+ {
+ carry += digits[--ndigits];
+ if (carry >= NBASE)
+ {
+ digits[ndigits] = carry - NBASE;
+ carry = 1;
+ }
+ else
+ {
+ digits[ndigits] = carry;
+ carry = 0;
+ }
+ }
+
+ if (ndigits < 0)
+ {
+ Assert(ndigits == -1); /* better not have added > 1 digit */
+ Assert(var->digits > var->buf);
+ var->digits--;
+ var->ndigits++;
+ var->weight++;
+ }
+ }
+ }
+}
+
+/*
+ * trunc_var
+ *
+ * Truncate (towards zero) the value of a variable at rscale decimal digits
+ * after the decimal point. NOTE: we allow rscale < 0 here, implying
+ * truncation before the decimal point.
+ */
+static void
+trunc_var(NumericVar *var, int rscale)
+{
+ int di;
+ int ndigits;
+
+ var->dscale = rscale;
+
+ /* decimal digits wanted */
+ di = (var->weight + 1) * DEC_DIGITS + rscale;
+
+ /*
+ * If di <= 0, the value loses all digits.
+ */
+ if (di <= 0)
+ {
+ var->ndigits = 0;
+ var->weight = 0;
+ var->sign = NUMERIC_POS;
+ }
+ else
+ {
+ /* NBASE digits wanted */
+ ndigits = (di + DEC_DIGITS - 1) / DEC_DIGITS;
+
+ if (ndigits <= var->ndigits)
+ {
+ var->ndigits = ndigits;
+
+#if DEC_DIGITS == 1
+ /* no within-digit stuff to worry about */
+#else
+ /* 0, or number of decimal digits to keep in last NBASE digit */
+ di %= DEC_DIGITS;
+
+ if (di > 0)
+ {
+ /* Must truncate within last NBASE digit */
+ NumericDigit *digits = var->digits;
+ int extra,
+ pow10;
+
+#if DEC_DIGITS == 4
+ pow10 = round_powers[di];
+#elif DEC_DIGITS == 2
+ pow10 = 10;
+#else
+#error unsupported NBASE
+#endif
+ extra = digits[--ndigits] % pow10;
+ digits[ndigits] -= extra;
+ }
+#endif
+ }
+ }
+}
+
+/*
+ * strip_var
+ *
+ * Strip any leading and trailing zeroes from a numeric variable
+ */
+static void
+strip_var(NumericVar *var)
+{
+ NumericDigit *digits = var->digits;
+ int ndigits = var->ndigits;
+
+ /* Strip leading zeroes */
+ while (ndigits > 0 && *digits == 0)
+ {
+ digits++;
+ var->weight--;
+ ndigits--;
+ }
+
+ /* Strip trailing zeroes */
+ while (ndigits > 0 && digits[ndigits - 1] == 0)
+ ndigits--;
+
+ /* If it's zero, normalize the sign and weight */
+ if (ndigits == 0)
+ {
+ var->sign = NUMERIC_POS;
+ var->weight = 0;
+ }
+
+ var->digits = digits;
+ var->ndigits = ndigits;
+}
+
+
+/* ----------------------------------------------------------------------
+ *
+ * Fast sum accumulator functions
+ *
+ * ----------------------------------------------------------------------
+ */
+
+/*
+ * Reset the accumulator's value to zero. The buffers to hold the digits
+ * are not free'd.
+ */
+static void
+accum_sum_reset(NumericSumAccum *accum)
+{
+ int i;
+
+ accum->dscale = 0;
+ for (i = 0; i < accum->ndigits; i++)
+ {
+ accum->pos_digits[i] = 0;
+ accum->neg_digits[i] = 0;
+ }
+}
+
+/*
+ * Accumulate a new value.
+ */
+static void
+accum_sum_add(NumericSumAccum *accum, const NumericVar *val)
+{
+ int32 *accum_digits;
+ int i,
+ val_i;
+ int val_ndigits;
+ NumericDigit *val_digits;
+
+ /*
+ * If we have accumulated too many values since the last carry
+ * propagation, do it now, to avoid overflowing. (We could allow more
+ * than NBASE - 1, if we reserved two extra digits, rather than one, for
+ * carry propagation. But even with NBASE - 1, this needs to be done so
+ * seldom, that the performance difference is negligible.)
+ */
+ if (accum->num_uncarried == NBASE - 1)
+ accum_sum_carry(accum);
+
+ /*
+ * Adjust the weight or scale of the old value, so that it can accommodate
+ * the new value.
+ */
+ accum_sum_rescale(accum, val);
+
+ /* */
+ if (val->sign == NUMERIC_POS)
+ accum_digits = accum->pos_digits;
+ else
+ accum_digits = accum->neg_digits;
+
+ /* copy these values into local vars for speed in loop */
+ val_ndigits = val->ndigits;
+ val_digits = val->digits;
+
+ i = accum->weight - val->weight;
+ for (val_i = 0; val_i < val_ndigits; val_i++)
+ {
+ accum_digits[i] += (int32) val_digits[val_i];
+ i++;
+ }
+
+ accum->num_uncarried++;
+}
+
+/*
+ * Propagate carries.
+ */
+static void
+accum_sum_carry(NumericSumAccum *accum)
+{
+ int i;
+ int ndigits;
+ int32 *dig;
+ int32 carry;
+ int32 newdig = 0;
+
+ /*
+ * If no new values have been added since last carry propagation, nothing
+ * to do.
+ */
+ if (accum->num_uncarried == 0)
+ return;
+
+ /*
+ * We maintain that the weight of the accumulator is always one larger
+ * than needed to hold the current value, before carrying, to make sure
+ * there is enough space for the possible extra digit when carry is
+ * propagated. We cannot expand the buffer here, unless we require
+ * callers of accum_sum_final() to switch to the right memory context.
+ */
+ Assert(accum->pos_digits[0] == 0 && accum->neg_digits[0] == 0);
+
+ ndigits = accum->ndigits;
+
+ /* Propagate carry in the positive sum */
+ dig = accum->pos_digits;
+ carry = 0;
+ for (i = ndigits - 1; i >= 0; i--)
+ {
+ newdig = dig[i] + carry;
+ if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ dig[i] = newdig;
+ }
+ /* Did we use up the digit reserved for carry propagation? */
+ if (newdig > 0)
+ accum->have_carry_space = false;
+
+ /* And the same for the negative sum */
+ dig = accum->neg_digits;
+ carry = 0;
+ for (i = ndigits - 1; i >= 0; i--)
+ {
+ newdig = dig[i] + carry;
+ if (newdig >= NBASE)
+ {
+ carry = newdig / NBASE;
+ newdig -= carry * NBASE;
+ }
+ else
+ carry = 0;
+ dig[i] = newdig;
+ }
+ if (newdig > 0)
+ accum->have_carry_space = false;
+
+ accum->num_uncarried = 0;
+}
+
+/*
+ * Re-scale accumulator to accommodate new value.
+ *
+ * If the new value has more digits than the current digit buffers in the
+ * accumulator, enlarge the buffers.
+ */
+static void
+accum_sum_rescale(NumericSumAccum *accum, const NumericVar *val)
+{
+ int old_weight = accum->weight;
+ int old_ndigits = accum->ndigits;
+ int accum_ndigits;
+ int accum_weight;
+ int accum_rscale;
+ int val_rscale;
+
+ accum_weight = old_weight;
+ accum_ndigits = old_ndigits;
+
+ /*
+ * Does the new value have a larger weight? If so, enlarge the buffers,
+ * and shift the existing value to the new weight, by adding leading
+ * zeros.
+ *
+ * We enforce that the accumulator always has a weight one larger than
+ * needed for the inputs, so that we have space for an extra digit at the
+ * final carry-propagation phase, if necessary.
+ */
+ if (val->weight >= accum_weight)
+ {
+ accum_weight = val->weight + 1;
+ accum_ndigits = accum_ndigits + (accum_weight - old_weight);
+ }
+
+ /*
+ * Even though the new value is small, we might've used up the space
+ * reserved for the carry digit in the last call to accum_sum_carry(). If
+ * so, enlarge to make room for another one.
+ */
+ else if (!accum->have_carry_space)
+ {
+ accum_weight++;
+ accum_ndigits++;
+ }
+
+ /* Is the new value wider on the right side? */
+ accum_rscale = accum_ndigits - accum_weight - 1;
+ val_rscale = val->ndigits - val->weight - 1;
+ if (val_rscale > accum_rscale)
+ accum_ndigits = accum_ndigits + (val_rscale - accum_rscale);
+
+ if (accum_ndigits != old_ndigits ||
+ accum_weight != old_weight)
+ {
+ int32 *new_pos_digits;
+ int32 *new_neg_digits;
+ int weightdiff;
+
+ weightdiff = accum_weight - old_weight;
+
+ new_pos_digits = palloc0(accum_ndigits * sizeof(int32));
+ new_neg_digits = palloc0(accum_ndigits * sizeof(int32));
+
+ if (accum->pos_digits)
+ {
+ memcpy(&new_pos_digits[weightdiff], accum->pos_digits,
+ old_ndigits * sizeof(int32));
+ pfree(accum->pos_digits);
+
+ memcpy(&new_neg_digits[weightdiff], accum->neg_digits,
+ old_ndigits * sizeof(int32));
+ pfree(accum->neg_digits);
+ }
+
+ accum->pos_digits = new_pos_digits;
+ accum->neg_digits = new_neg_digits;
+
+ accum->weight = accum_weight;
+ accum->ndigits = accum_ndigits;
+
+ Assert(accum->pos_digits[0] == 0 && accum->neg_digits[0] == 0);
+ accum->have_carry_space = true;
+ }
+
+ if (val->dscale > accum->dscale)
+ accum->dscale = val->dscale;
+}
+
+/*
+ * Return the current value of the accumulator. This perform final carry
+ * propagation, and adds together the positive and negative sums.
+ *
+ * Unlike all the other routines, the caller is not required to switch to
+ * the memory context that holds the accumulator.
+ */
+static void
+accum_sum_final(NumericSumAccum *accum, NumericVar *result)
+{
+ int i;
+ NumericVar pos_var;
+ NumericVar neg_var;
+
+ if (accum->ndigits == 0)
+ {
+ set_var_from_var(&const_zero, result);
+ return;
+ }
+
+ /* Perform final carry */
+ accum_sum_carry(accum);
+
+ /* Create NumericVars representing the positive and negative sums */
+ init_var(&pos_var);
+ init_var(&neg_var);
+
+ pos_var.ndigits = neg_var.ndigits = accum->ndigits;
+ pos_var.weight = neg_var.weight = accum->weight;
+ pos_var.dscale = neg_var.dscale = accum->dscale;
+ pos_var.sign = NUMERIC_POS;
+ neg_var.sign = NUMERIC_NEG;
+
+ pos_var.buf = pos_var.digits = digitbuf_alloc(accum->ndigits);
+ neg_var.buf = neg_var.digits = digitbuf_alloc(accum->ndigits);
+
+ for (i = 0; i < accum->ndigits; i++)
+ {
+ Assert(accum->pos_digits[i] < NBASE);
+ pos_var.digits[i] = (int16) accum->pos_digits[i];
+
+ Assert(accum->neg_digits[i] < NBASE);
+ neg_var.digits[i] = (int16) accum->neg_digits[i];
+ }
+
+ /* And add them together */
+ add_var(&pos_var, &neg_var, result);
+
+ /* Remove leading/trailing zeroes */
+ strip_var(result);
+}
+
+/*
+ * Copy an accumulator's state.
+ *
+ * 'dst' is assumed to be uninitialized beforehand. No attempt is made at
+ * freeing old values.
+ */
+static void
+accum_sum_copy(NumericSumAccum *dst, NumericSumAccum *src)
+{
+ dst->pos_digits = palloc(src->ndigits * sizeof(int32));
+ dst->neg_digits = palloc(src->ndigits * sizeof(int32));
+
+ memcpy(dst->pos_digits, src->pos_digits, src->ndigits * sizeof(int32));
+ memcpy(dst->neg_digits, src->neg_digits, src->ndigits * sizeof(int32));
+ dst->num_uncarried = src->num_uncarried;
+ dst->ndigits = src->ndigits;
+ dst->weight = src->weight;
+ dst->dscale = src->dscale;
+}
+
+/*
+ * Add the current value of 'accum2' into 'accum'.
+ */
+static void
+accum_sum_combine(NumericSumAccum *accum, NumericSumAccum *accum2)
+{
+ NumericVar tmp_var;
+
+ init_var(&tmp_var);
+
+ accum_sum_final(accum2, &tmp_var);
+ accum_sum_add(accum, &tmp_var);
+
+ free_var(&tmp_var);
+}
diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c
new file mode 100644
index 0000000..cc3f95d
--- /dev/null
+++ b/src/backend/utils/adt/numutils.c
@@ -0,0 +1,604 @@
+/*-------------------------------------------------------------------------
+ *
+ * numutils.c
+ * utility functions for I/O of built-in numeric types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/numutils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+#include <limits.h>
+#include <ctype.h>
+
+#include "common/int.h"
+#include "utils/builtins.h"
+#include "port/pg_bitutils.h"
+
+/*
+ * A table of all two-digit numbers. This is used to speed up decimal digit
+ * generation by copying pairs of digits into the final output.
+ */
+static const char DIGIT_TABLE[200] =
+"00" "01" "02" "03" "04" "05" "06" "07" "08" "09"
+"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" "37" "38" "39"
+"40" "41" "42" "43" "44" "45" "46" "47" "48" "49"
+"50" "51" "52" "53" "54" "55" "56" "57" "58" "59"
+"60" "61" "62" "63" "64" "65" "66" "67" "68" "69"
+"70" "71" "72" "73" "74" "75" "76" "77" "78" "79"
+"80" "81" "82" "83" "84" "85" "86" "87" "88" "89"
+"90" "91" "92" "93" "94" "95" "96" "97" "98" "99";
+
+/*
+ * Adapted from http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
+ */
+static inline int
+decimalLength32(const uint32 v)
+{
+ int t;
+ static const uint32 PowersOfTen[] = {
+ 1, 10, 100,
+ 1000, 10000, 100000,
+ 1000000, 10000000, 100000000,
+ 1000000000
+ };
+
+ /*
+ * Compute base-10 logarithm by dividing the base-2 logarithm by a
+ * good-enough approximation of the base-2 logarithm of 10
+ */
+ t = (pg_leftmost_one_pos32(v) + 1) * 1233 / 4096;
+ return t + (v >= PowersOfTen[t]);
+}
+
+static inline int
+decimalLength64(const uint64 v)
+{
+ int t;
+ static const uint64 PowersOfTen[] = {
+ UINT64CONST(1), UINT64CONST(10),
+ UINT64CONST(100), UINT64CONST(1000),
+ UINT64CONST(10000), UINT64CONST(100000),
+ UINT64CONST(1000000), UINT64CONST(10000000),
+ UINT64CONST(100000000), UINT64CONST(1000000000),
+ UINT64CONST(10000000000), UINT64CONST(100000000000),
+ UINT64CONST(1000000000000), UINT64CONST(10000000000000),
+ UINT64CONST(100000000000000), UINT64CONST(1000000000000000),
+ UINT64CONST(10000000000000000), UINT64CONST(100000000000000000),
+ UINT64CONST(1000000000000000000), UINT64CONST(10000000000000000000)
+ };
+
+ /*
+ * Compute base-10 logarithm by dividing the base-2 logarithm by a
+ * good-enough approximation of the base-2 logarithm of 10
+ */
+ t = (pg_leftmost_one_pos64(v) + 1) * 1233 / 4096;
+ return t + (v >= PowersOfTen[t]);
+}
+
+/*
+ * Convert input string to a signed 16 bit integer.
+ *
+ * Allows any number of leading or trailing whitespace characters. Will throw
+ * ereport() upon bad input format or overflow.
+ *
+ * NB: Accumulate input as a negative number, to deal with two's complement
+ * representation of the most negative number, which can't be represented as a
+ * positive number.
+ */
+int16
+pg_strtoint16(const char *s)
+{
+ const char *ptr = s;
+ int16 tmp = 0;
+ bool neg = false;
+
+ /* skip leading spaces */
+ while (likely(*ptr) && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* handle sign */
+ if (*ptr == '-')
+ {
+ ptr++;
+ neg = true;
+ }
+ else if (*ptr == '+')
+ ptr++;
+
+ /* require at least one digit */
+ if (unlikely(!isdigit((unsigned char) *ptr)))
+ goto invalid_syntax;
+
+ /* process digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ {
+ int8 digit = (*ptr++ - '0');
+
+ if (unlikely(pg_mul_s16_overflow(tmp, 10, &tmp)) ||
+ unlikely(pg_sub_s16_overflow(tmp, digit, &tmp)))
+ goto out_of_range;
+ }
+
+ /* allow trailing whitespace, but not other trailing chars */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (unlikely(*ptr != '\0'))
+ goto invalid_syntax;
+
+ if (!neg)
+ {
+ /* could fail if input is most negative number */
+ if (unlikely(tmp == PG_INT16_MIN))
+ goto out_of_range;
+ tmp = -tmp;
+ }
+
+ return tmp;
+
+out_of_range:
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ s, "smallint")));
+
+invalid_syntax:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "smallint", s)));
+
+ return 0; /* keep compiler quiet */
+}
+
+/*
+ * Convert input string to a signed 32 bit integer.
+ *
+ * Allows any number of leading or trailing whitespace characters. Will throw
+ * ereport() upon bad input format or overflow.
+ *
+ * NB: Accumulate input as a negative number, to deal with two's complement
+ * representation of the most negative number, which can't be represented as a
+ * positive number.
+ */
+int32
+pg_strtoint32(const char *s)
+{
+ const char *ptr = s;
+ int32 tmp = 0;
+ bool neg = false;
+
+ /* skip leading spaces */
+ while (likely(*ptr) && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* handle sign */
+ if (*ptr == '-')
+ {
+ ptr++;
+ neg = true;
+ }
+ else if (*ptr == '+')
+ ptr++;
+
+ /* require at least one digit */
+ if (unlikely(!isdigit((unsigned char) *ptr)))
+ goto invalid_syntax;
+
+ /* process digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ {
+ int8 digit = (*ptr++ - '0');
+
+ if (unlikely(pg_mul_s32_overflow(tmp, 10, &tmp)) ||
+ unlikely(pg_sub_s32_overflow(tmp, digit, &tmp)))
+ goto out_of_range;
+ }
+
+ /* allow trailing whitespace, but not other trailing chars */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (unlikely(*ptr != '\0'))
+ goto invalid_syntax;
+
+ if (!neg)
+ {
+ /* could fail if input is most negative number */
+ if (unlikely(tmp == PG_INT32_MIN))
+ goto out_of_range;
+ tmp = -tmp;
+ }
+
+ return tmp;
+
+out_of_range:
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ s, "integer")));
+
+invalid_syntax:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "integer", s)));
+
+ return 0; /* keep compiler quiet */
+}
+
+/*
+ * Convert input string to a signed 64 bit integer.
+ *
+ * Allows any number of leading or trailing whitespace characters. Will throw
+ * ereport() upon bad input format or overflow.
+ *
+ * NB: Accumulate input as a negative number, to deal with two's complement
+ * representation of the most negative number, which can't be represented as a
+ * positive number.
+ */
+int64
+pg_strtoint64(const char *s)
+{
+ const char *ptr = s;
+ int64 tmp = 0;
+ bool neg = false;
+
+ /*
+ * Do our own scan, rather than relying on sscanf which might be broken
+ * for long long.
+ *
+ * As INT64_MIN can't be stored as a positive 64 bit integer, accumulate
+ * value as a negative number.
+ */
+
+ /* skip leading spaces */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* handle sign */
+ if (*ptr == '-')
+ {
+ ptr++;
+ neg = true;
+ }
+ else if (*ptr == '+')
+ ptr++;
+
+ /* require at least one digit */
+ if (unlikely(!isdigit((unsigned char) *ptr)))
+ goto invalid_syntax;
+
+ /* process digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ {
+ int8 digit = (*ptr++ - '0');
+
+ if (unlikely(pg_mul_s64_overflow(tmp, 10, &tmp)) ||
+ unlikely(pg_sub_s64_overflow(tmp, digit, &tmp)))
+ goto out_of_range;
+ }
+
+ /* allow trailing whitespace, but not other trailing chars */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (unlikely(*ptr != '\0'))
+ goto invalid_syntax;
+
+ if (!neg)
+ {
+ /* could fail if input is most negative number */
+ if (unlikely(tmp == PG_INT64_MIN))
+ goto out_of_range;
+ tmp = -tmp;
+ }
+
+ return tmp;
+
+out_of_range:
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ s, "bigint")));
+
+invalid_syntax:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "bigint", s)));
+
+ return 0; /* keep compiler quiet */
+}
+
+/*
+ * pg_itoa: converts a signed 16-bit integer to its string representation
+ * and returns strlen(a).
+ *
+ * Caller must ensure that 'a' points to enough memory to hold the result
+ * (at least 7 bytes, counting a leading sign and trailing NUL).
+ *
+ * It doesn't seem worth implementing this separately.
+ */
+int
+pg_itoa(int16 i, char *a)
+{
+ return pg_ltoa((int32) i, a);
+}
+
+/*
+ * pg_ultoa_n: converts an unsigned 32-bit integer to its string representation,
+ * not NUL-terminated, and returns the length of that string representation
+ *
+ * Caller must ensure that 'a' points to enough memory to hold the result (at
+ * least 10 bytes)
+ */
+int
+pg_ultoa_n(uint32 value, char *a)
+{
+ int olength,
+ i = 0;
+
+ /* Degenerate case */
+ if (value == 0)
+ {
+ *a = '0';
+ return 1;
+ }
+
+ olength = decimalLength32(value);
+
+ /* Compute the result string. */
+ while (value >= 10000)
+ {
+ const uint32 c = value - 10000 * (value / 10000);
+ const uint32 c0 = (c % 100) << 1;
+ const uint32 c1 = (c / 100) << 1;
+
+ char *pos = a + olength - i;
+
+ value /= 10000;
+
+ memcpy(pos - 2, DIGIT_TABLE + c0, 2);
+ memcpy(pos - 4, DIGIT_TABLE + c1, 2);
+ i += 4;
+ }
+ if (value >= 100)
+ {
+ const uint32 c = (value % 100) << 1;
+
+ char *pos = a + olength - i;
+
+ value /= 100;
+
+ memcpy(pos - 2, DIGIT_TABLE + c, 2);
+ i += 2;
+ }
+ if (value >= 10)
+ {
+ const uint32 c = value << 1;
+
+ char *pos = a + olength - i;
+
+ memcpy(pos - 2, DIGIT_TABLE + c, 2);
+ }
+ else
+ {
+ *a = (char) ('0' + value);
+ }
+
+ return olength;
+}
+
+/*
+ * pg_ltoa: converts a signed 32-bit integer to its string representation and
+ * returns strlen(a).
+ *
+ * It is the caller's responsibility to ensure that a is at least 12 bytes long,
+ * which is enough room to hold a minus sign, a maximally long int32, and the
+ * above terminating NUL.
+ */
+int
+pg_ltoa(int32 value, char *a)
+{
+ uint32 uvalue = (uint32) value;
+ int len = 0;
+
+ if (value < 0)
+ {
+ uvalue = (uint32) 0 - uvalue;
+ a[len++] = '-';
+ }
+ len += pg_ultoa_n(uvalue, a + len);
+ a[len] = '\0';
+ return len;
+}
+
+/*
+ * Get the decimal representation, not NUL-terminated, and return the length of
+ * same. Caller must ensure that a points to at least MAXINT8LEN bytes.
+ */
+int
+pg_ulltoa_n(uint64 value, char *a)
+{
+ int olength,
+ i = 0;
+ uint32 value2;
+
+ /* Degenerate case */
+ if (value == 0)
+ {
+ *a = '0';
+ return 1;
+ }
+
+ olength = decimalLength64(value);
+
+ /* Compute the result string. */
+ while (value >= 100000000)
+ {
+ const uint64 q = value / 100000000;
+ uint32 value2 = (uint32) (value - 100000000 * q);
+
+ const uint32 c = value2 % 10000;
+ const uint32 d = value2 / 10000;
+ const uint32 c0 = (c % 100) << 1;
+ const uint32 c1 = (c / 100) << 1;
+ const uint32 d0 = (d % 100) << 1;
+ const uint32 d1 = (d / 100) << 1;
+
+ char *pos = a + olength - i;
+
+ value = q;
+
+ memcpy(pos - 2, DIGIT_TABLE + c0, 2);
+ memcpy(pos - 4, DIGIT_TABLE + c1, 2);
+ memcpy(pos - 6, DIGIT_TABLE + d0, 2);
+ memcpy(pos - 8, DIGIT_TABLE + d1, 2);
+ i += 8;
+ }
+
+ /* Switch to 32-bit for speed */
+ value2 = (uint32) value;
+
+ if (value2 >= 10000)
+ {
+ const uint32 c = value2 - 10000 * (value2 / 10000);
+ const uint32 c0 = (c % 100) << 1;
+ const uint32 c1 = (c / 100) << 1;
+
+ char *pos = a + olength - i;
+
+ value2 /= 10000;
+
+ memcpy(pos - 2, DIGIT_TABLE + c0, 2);
+ memcpy(pos - 4, DIGIT_TABLE + c1, 2);
+ i += 4;
+ }
+ if (value2 >= 100)
+ {
+ const uint32 c = (value2 % 100) << 1;
+ char *pos = a + olength - i;
+
+ value2 /= 100;
+
+ memcpy(pos - 2, DIGIT_TABLE + c, 2);
+ i += 2;
+ }
+ if (value2 >= 10)
+ {
+ const uint32 c = value2 << 1;
+ char *pos = a + olength - i;
+
+ memcpy(pos - 2, DIGIT_TABLE + c, 2);
+ }
+ else
+ *a = (char) ('0' + value2);
+
+ return olength;
+}
+
+/*
+ * pg_lltoa: converts a signed 64-bit integer to its string representation and
+ * returns strlen(a).
+ *
+ * Caller must ensure that 'a' points to enough memory to hold the result
+ * (at least MAXINT8LEN + 1 bytes, counting a leading sign and trailing NUL).
+ */
+int
+pg_lltoa(int64 value, char *a)
+{
+ uint64 uvalue = value;
+ int len = 0;
+
+ if (value < 0)
+ {
+ uvalue = (uint64) 0 - uvalue;
+ a[len++] = '-';
+ }
+
+ len += pg_ulltoa_n(uvalue, a + len);
+ a[len] = '\0';
+ return len;
+}
+
+
+/*
+ * pg_ultostr_zeropad
+ * Converts 'value' into a decimal string representation stored at 'str'.
+ * 'minwidth' specifies the minimum width of the result; any extra space
+ * is filled up by prefixing the number with zeros.
+ *
+ * Returns the ending address of the string result (the last character written
+ * plus 1). Note that no NUL terminator is written.
+ *
+ * The intended use-case for this function is to build strings that contain
+ * multiple individual numbers, for example:
+ *
+ * str = pg_ultostr_zeropad(str, hours, 2);
+ * *str++ = ':';
+ * str = pg_ultostr_zeropad(str, mins, 2);
+ * *str++ = ':';
+ * str = pg_ultostr_zeropad(str, secs, 2);
+ * *str = '\0';
+ *
+ * Note: Caller must ensure that 'str' points to enough memory to hold the
+ * result.
+ */
+char *
+pg_ultostr_zeropad(char *str, uint32 value, int32 minwidth)
+{
+ int len;
+
+ Assert(minwidth > 0);
+
+ if (value < 100 && minwidth == 2) /* Short cut for common case */
+ {
+ memcpy(str, DIGIT_TABLE + value * 2, 2);
+ return str + 2;
+ }
+
+ len = pg_ultoa_n(value, str);
+ if (len >= minwidth)
+ return str + len;
+
+ memmove(str + minwidth - len, str, len);
+ memset(str, '0', minwidth - len);
+ return str + minwidth;
+}
+
+/*
+ * pg_ultostr
+ * Converts 'value' into a decimal string representation stored at 'str'.
+ *
+ * Returns the ending address of the string result (the last character written
+ * plus 1). Note that no NUL terminator is written.
+ *
+ * The intended use-case for this function is to build strings that contain
+ * multiple individual numbers, for example:
+ *
+ * str = pg_ultostr(str, a);
+ * *str++ = ' ';
+ * str = pg_ultostr(str, b);
+ * *str = '\0';
+ *
+ * Note: Caller must ensure that 'str' points to enough memory to hold the
+ * result.
+ */
+char *
+pg_ultostr(char *str, uint32 value)
+{
+ int len = pg_ultoa_n(value, str);
+
+ return str + len;
+}
diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c
new file mode 100644
index 0000000..7de31d7
--- /dev/null
+++ b/src/backend/utils/adt/oid.c
@@ -0,0 +1,468 @@
+/*-------------------------------------------------------------------------
+ *
+ * oid.c
+ * Functions for the built-in type Oid ... also oidvector.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/oid.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "catalog/pg_type.h"
+#include "libpq/pqformat.h"
+#include "nodes/value.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+
+
+#define OidVectorSize(n) (offsetof(oidvector, values) + (n) * sizeof(Oid))
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+static Oid
+oidin_subr(const char *s, char **endloc)
+{
+ unsigned long cvt;
+ char *endptr;
+ Oid result;
+
+ if (*s == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "oid", s)));
+
+ errno = 0;
+ cvt = strtoul(s, &endptr, 10);
+
+ /*
+ * strtoul() normally only sets ERANGE. On some systems it also may set
+ * EINVAL, which simply means it couldn't parse the input string. This is
+ * handled by the second "if" consistent across platforms.
+ */
+ if (errno && errno != ERANGE && errno != EINVAL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "oid", s)));
+
+ if (endptr == s && *s != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "oid", s)));
+
+ if (errno == ERANGE)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ s, "oid")));
+
+ if (endloc)
+ {
+ /* caller wants to deal with rest of string */
+ *endloc = endptr;
+ }
+ else
+ {
+ /* allow only whitespace after number */
+ while (*endptr && isspace((unsigned char) *endptr))
+ endptr++;
+ if (*endptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "oid", s)));
+ }
+
+ result = (Oid) cvt;
+
+ /*
+ * Cope with possibility that unsigned long is wider than Oid, in which
+ * case strtoul will not raise an error for some values that are out of
+ * the range of Oid.
+ *
+ * For backwards compatibility, we want to accept inputs that are given
+ * with a minus sign, so allow the input value if it matches after either
+ * signed or unsigned extension to long.
+ *
+ * To ensure consistent results on 32-bit and 64-bit platforms, make sure
+ * the error message is the same as if strtoul() had returned ERANGE.
+ */
+#if OID_MAX != ULONG_MAX
+ if (cvt != (unsigned long) result &&
+ cvt != (unsigned long) ((int) result))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("value \"%s\" is out of range for type %s",
+ s, "oid")));
+#endif
+
+ return result;
+}
+
+Datum
+oidin(PG_FUNCTION_ARGS)
+{
+ char *s = PG_GETARG_CSTRING(0);
+ Oid result;
+
+ result = oidin_subr(s, NULL);
+ PG_RETURN_OID(result);
+}
+
+Datum
+oidout(PG_FUNCTION_ARGS)
+{
+ Oid o = PG_GETARG_OID(0);
+ char *result = (char *) palloc(12);
+
+ snprintf(result, 12, "%u", o);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * oidrecv - converts external binary format to oid
+ */
+Datum
+oidrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_OID((Oid) pq_getmsgint(buf, sizeof(Oid)));
+}
+
+/*
+ * oidsend - converts oid to binary format
+ */
+Datum
+oidsend(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * construct oidvector given a raw array of Oids
+ *
+ * If oids is NULL then caller must fill values[] afterward
+ */
+oidvector *
+buildoidvector(const Oid *oids, int n)
+{
+ oidvector *result;
+
+ result = (oidvector *) palloc0(OidVectorSize(n));
+
+ if (n > 0 && oids)
+ memcpy(result->values, oids, n * sizeof(Oid));
+
+ /*
+ * Attach standard array header. For historical reasons, we set the index
+ * lower bound to 0 not 1.
+ */
+ SET_VARSIZE(result, OidVectorSize(n));
+ result->ndim = 1;
+ result->dataoffset = 0; /* never any nulls */
+ result->elemtype = OIDOID;
+ result->dim1 = n;
+ result->lbound1 = 0;
+
+ return result;
+}
+
+/*
+ * oidvectorin - converts "num num ..." to internal form
+ */
+Datum
+oidvectorin(PG_FUNCTION_ARGS)
+{
+ char *oidString = PG_GETARG_CSTRING(0);
+ oidvector *result;
+ int nalloc;
+ int n;
+
+ nalloc = 32; /* arbitrary initial size guess */
+ result = (oidvector *) palloc0(OidVectorSize(nalloc));
+
+ for (n = 0;; n++)
+ {
+ while (*oidString && isspace((unsigned char) *oidString))
+ oidString++;
+ if (*oidString == '\0')
+ break;
+
+ if (n >= nalloc)
+ {
+ nalloc *= 2;
+ result = (oidvector *) repalloc(result, OidVectorSize(nalloc));
+ }
+
+ result->values[n] = oidin_subr(oidString, &oidString);
+ }
+
+ SET_VARSIZE(result, OidVectorSize(n));
+ result->ndim = 1;
+ result->dataoffset = 0; /* never any nulls */
+ result->elemtype = OIDOID;
+ result->dim1 = n;
+ result->lbound1 = 0;
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * oidvectorout - converts internal form to "num num ..."
+ */
+Datum
+oidvectorout(PG_FUNCTION_ARGS)
+{
+ oidvector *oidArray = (oidvector *) PG_GETARG_POINTER(0);
+ int num,
+ nnums = oidArray->dim1;
+ char *rp;
+ char *result;
+
+ /* assumes sign, 10 digits, ' ' */
+ rp = result = (char *) palloc(nnums * 12 + 1);
+ for (num = 0; num < nnums; num++)
+ {
+ if (num != 0)
+ *rp++ = ' ';
+ sprintf(rp, "%u", oidArray->values[num]);
+ while (*++rp != '\0')
+ ;
+ }
+ *rp = '\0';
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * oidvectorrecv - converts external binary format to oidvector
+ */
+Datum
+oidvectorrecv(PG_FUNCTION_ARGS)
+{
+ LOCAL_FCINFO(locfcinfo, 3);
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ oidvector *result;
+
+ /*
+ * Normally one would call array_recv() using DirectFunctionCall3, but
+ * that does not work since array_recv wants to cache some data using
+ * fcinfo->flinfo->fn_extra. So we need to pass it our own flinfo
+ * parameter.
+ */
+ InitFunctionCallInfoData(*locfcinfo, fcinfo->flinfo, 3,
+ InvalidOid, NULL, NULL);
+
+ locfcinfo->args[0].value = PointerGetDatum(buf);
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = ObjectIdGetDatum(OIDOID);
+ locfcinfo->args[1].isnull = false;
+ locfcinfo->args[2].value = Int32GetDatum(-1);
+ locfcinfo->args[2].isnull = false;
+
+ result = (oidvector *) DatumGetPointer(array_recv(locfcinfo));
+
+ Assert(!locfcinfo->isnull);
+
+ /* sanity checks: oidvector must be 1-D, 0-based, no nulls */
+ if (ARR_NDIM(result) != 1 ||
+ ARR_HASNULL(result) ||
+ ARR_ELEMTYPE(result) != OIDOID ||
+ ARR_LBOUND(result)[0] != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid oidvector data")));
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ * oidvectorsend - converts oidvector to binary format
+ */
+Datum
+oidvectorsend(PG_FUNCTION_ARGS)
+{
+ return array_send(fcinfo);
+}
+
+/*
+ * oidparse - get OID from ICONST/FCONST node
+ */
+Oid
+oidparse(Node *node)
+{
+ switch (nodeTag(node))
+ {
+ case T_Integer:
+ return intVal(node);
+ case T_Float:
+
+ /*
+ * Values too large for int4 will be represented as Float
+ * constants by the lexer. Accept these if they are valid OID
+ * strings.
+ */
+ return oidin_subr(castNode(Float, node)->fval, NULL);
+ default:
+ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
+ }
+ return InvalidOid; /* keep compiler quiet */
+}
+
+/* qsort comparison function for Oids */
+int
+oid_cmp(const void *p1, const void *p2)
+{
+ Oid v1 = *((const Oid *) p1);
+ Oid v2 = *((const Oid *) p2);
+
+ if (v1 < v2)
+ return -1;
+ if (v1 > v2)
+ return 1;
+ return 0;
+}
+
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+Datum
+oideq(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
+
+Datum
+oidne(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 != arg2);
+}
+
+Datum
+oidlt(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 < arg2);
+}
+
+Datum
+oidle(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 <= arg2);
+}
+
+Datum
+oidge(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 >= arg2);
+}
+
+Datum
+oidgt(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_BOOL(arg1 > arg2);
+}
+
+Datum
+oidlarger(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_OID((arg1 > arg2) ? arg1 : arg2);
+}
+
+Datum
+oidsmaller(PG_FUNCTION_ARGS)
+{
+ Oid arg1 = PG_GETARG_OID(0);
+ Oid arg2 = PG_GETARG_OID(1);
+
+ PG_RETURN_OID((arg1 < arg2) ? arg1 : arg2);
+}
+
+Datum
+oidvectoreq(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp == 0);
+}
+
+Datum
+oidvectorne(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp != 0);
+}
+
+Datum
+oidvectorlt(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp < 0);
+}
+
+Datum
+oidvectorle(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp <= 0);
+}
+
+Datum
+oidvectorge(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp >= 0);
+}
+
+Datum
+oidvectorgt(PG_FUNCTION_ARGS)
+{
+ int32 cmp = DatumGetInt32(btoidvectorcmp(fcinfo));
+
+ PG_RETURN_BOOL(cmp > 0);
+}
diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c
new file mode 100644
index 0000000..6a5ce1c
--- /dev/null
+++ b/src/backend/utils/adt/oracle_compat.c
@@ -0,0 +1,1156 @@
+/*-------------------------------------------------------------------------
+ * oracle_compat.c
+ * Oracle compatible functions.
+ *
+ * Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * Author: Edmund Mergl <E.Mergl@bawue.de>
+ * Multibyte enhancement: Tatsuo Ishii <ishii@postgresql.org>
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/oracle_compat.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "common/int.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/formatting.h"
+#include "utils/memutils.h"
+
+
+static text *dotrim(const char *string, int stringlen,
+ const char *set, int setlen,
+ bool doltrim, bool dortrim);
+static bytea *dobyteatrim(bytea *string, bytea *set,
+ bool doltrim, bool dortrim);
+
+
+/********************************************************************
+ *
+ * lower
+ *
+ * Syntax:
+ *
+ * text lower(text string)
+ *
+ * Purpose:
+ *
+ * Returns string, with all letters forced to lowercase.
+ *
+ ********************************************************************/
+
+Datum
+lower(PG_FUNCTION_ARGS)
+{
+ text *in_string = PG_GETARG_TEXT_PP(0);
+ char *out_string;
+ text *result;
+
+ out_string = str_tolower(VARDATA_ANY(in_string),
+ VARSIZE_ANY_EXHDR(in_string),
+ PG_GET_COLLATION());
+ result = cstring_to_text(out_string);
+ pfree(out_string);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+
+/********************************************************************
+ *
+ * upper
+ *
+ * Syntax:
+ *
+ * text upper(text string)
+ *
+ * Purpose:
+ *
+ * Returns string, with all letters forced to uppercase.
+ *
+ ********************************************************************/
+
+Datum
+upper(PG_FUNCTION_ARGS)
+{
+ text *in_string = PG_GETARG_TEXT_PP(0);
+ char *out_string;
+ text *result;
+
+ out_string = str_toupper(VARDATA_ANY(in_string),
+ VARSIZE_ANY_EXHDR(in_string),
+ PG_GET_COLLATION());
+ result = cstring_to_text(out_string);
+ pfree(out_string);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+
+/********************************************************************
+ *
+ * initcap
+ *
+ * Syntax:
+ *
+ * text initcap(text string)
+ *
+ * Purpose:
+ *
+ * Returns string, with first letter of each word in uppercase, all
+ * other letters in lowercase. A word is defined as a sequence of
+ * alphanumeric characters, delimited by non-alphanumeric
+ * characters.
+ *
+ ********************************************************************/
+
+Datum
+initcap(PG_FUNCTION_ARGS)
+{
+ text *in_string = PG_GETARG_TEXT_PP(0);
+ char *out_string;
+ text *result;
+
+ out_string = str_initcap(VARDATA_ANY(in_string),
+ VARSIZE_ANY_EXHDR(in_string),
+ PG_GET_COLLATION());
+ result = cstring_to_text(out_string);
+ pfree(out_string);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+
+/********************************************************************
+ *
+ * lpad
+ *
+ * Syntax:
+ *
+ * text lpad(text string1, int4 len, text string2)
+ *
+ * Purpose:
+ *
+ * Returns string1, left-padded to length len with the sequence of
+ * characters in string2. If len is less than the length of string1,
+ * instead truncate (on the right) to len.
+ *
+ ********************************************************************/
+
+Datum
+lpad(PG_FUNCTION_ARGS)
+{
+ text *string1 = PG_GETARG_TEXT_PP(0);
+ int32 len = PG_GETARG_INT32(1);
+ text *string2 = PG_GETARG_TEXT_PP(2);
+ text *ret;
+ char *ptr1,
+ *ptr2,
+ *ptr2start,
+ *ptr2end,
+ *ptr_ret;
+ int m,
+ s1len,
+ s2len;
+ int bytelen;
+
+ /* Negative len is silently taken as zero */
+ if (len < 0)
+ len = 0;
+
+ s1len = VARSIZE_ANY_EXHDR(string1);
+ if (s1len < 0)
+ s1len = 0; /* shouldn't happen */
+
+ s2len = VARSIZE_ANY_EXHDR(string2);
+ if (s2len < 0)
+ s2len = 0; /* shouldn't happen */
+
+ s1len = pg_mbstrlen_with_len(VARDATA_ANY(string1), s1len);
+
+ if (s1len > len)
+ s1len = len; /* truncate string1 to len chars */
+
+ if (s2len <= 0)
+ len = s1len; /* nothing to pad with, so don't pad */
+
+ /* compute worst-case output length */
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested length too large")));
+
+ ret = (text *) palloc(bytelen);
+
+ m = len - s1len;
+
+ ptr2 = ptr2start = VARDATA_ANY(string2);
+ ptr2end = ptr2 + s2len;
+ ptr_ret = VARDATA(ret);
+
+ while (m--)
+ {
+ int mlen = pg_mblen(ptr2);
+
+ memcpy(ptr_ret, ptr2, mlen);
+ ptr_ret += mlen;
+ ptr2 += mlen;
+ if (ptr2 == ptr2end) /* wrap around at end of s2 */
+ ptr2 = ptr2start;
+ }
+
+ ptr1 = VARDATA_ANY(string1);
+
+ while (s1len--)
+ {
+ int mlen = pg_mblen(ptr1);
+
+ memcpy(ptr_ret, ptr1, mlen);
+ ptr_ret += mlen;
+ ptr1 += mlen;
+ }
+
+ SET_VARSIZE(ret, ptr_ret - (char *) ret);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+
+/********************************************************************
+ *
+ * rpad
+ *
+ * Syntax:
+ *
+ * text rpad(text string1, int4 len, text string2)
+ *
+ * Purpose:
+ *
+ * Returns string1, right-padded to length len with the sequence of
+ * characters in string2. If len is less than the length of string1,
+ * instead truncate (on the right) to len.
+ *
+ ********************************************************************/
+
+Datum
+rpad(PG_FUNCTION_ARGS)
+{
+ text *string1 = PG_GETARG_TEXT_PP(0);
+ int32 len = PG_GETARG_INT32(1);
+ text *string2 = PG_GETARG_TEXT_PP(2);
+ text *ret;
+ char *ptr1,
+ *ptr2,
+ *ptr2start,
+ *ptr2end,
+ *ptr_ret;
+ int m,
+ s1len,
+ s2len;
+ int bytelen;
+
+ /* Negative len is silently taken as zero */
+ if (len < 0)
+ len = 0;
+
+ s1len = VARSIZE_ANY_EXHDR(string1);
+ if (s1len < 0)
+ s1len = 0; /* shouldn't happen */
+
+ s2len = VARSIZE_ANY_EXHDR(string2);
+ if (s2len < 0)
+ s2len = 0; /* shouldn't happen */
+
+ s1len = pg_mbstrlen_with_len(VARDATA_ANY(string1), s1len);
+
+ if (s1len > len)
+ s1len = len; /* truncate string1 to len chars */
+
+ if (s2len <= 0)
+ len = s1len; /* nothing to pad with, so don't pad */
+
+ /* compute worst-case output length */
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), len,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested length too large")));
+
+ ret = (text *) palloc(bytelen);
+
+ m = len - s1len;
+
+ ptr1 = VARDATA_ANY(string1);
+ ptr_ret = VARDATA(ret);
+
+ while (s1len--)
+ {
+ int mlen = pg_mblen(ptr1);
+
+ memcpy(ptr_ret, ptr1, mlen);
+ ptr_ret += mlen;
+ ptr1 += mlen;
+ }
+
+ ptr2 = ptr2start = VARDATA_ANY(string2);
+ ptr2end = ptr2 + s2len;
+
+ while (m--)
+ {
+ int mlen = pg_mblen(ptr2);
+
+ memcpy(ptr_ret, ptr2, mlen);
+ ptr_ret += mlen;
+ ptr2 += mlen;
+ if (ptr2 == ptr2end) /* wrap around at end of s2 */
+ ptr2 = ptr2start;
+ }
+
+ SET_VARSIZE(ret, ptr_ret - (char *) ret);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+
+/********************************************************************
+ *
+ * btrim
+ *
+ * Syntax:
+ *
+ * text btrim(text string, text set)
+ *
+ * Purpose:
+ *
+ * Returns string with characters removed from the front and back
+ * up to the first character not in set.
+ *
+ ********************************************************************/
+
+Datum
+btrim(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *set = PG_GETARG_TEXT_PP(1);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ VARDATA_ANY(set), VARSIZE_ANY_EXHDR(set),
+ true, true);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+/********************************************************************
+ *
+ * btrim1 --- btrim with set fixed as ' '
+ *
+ ********************************************************************/
+
+Datum
+btrim1(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ " ", 1,
+ true, true);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+/*
+ * Common implementation for btrim, ltrim, rtrim
+ */
+static text *
+dotrim(const char *string, int stringlen,
+ const char *set, int setlen,
+ bool doltrim, bool dortrim)
+{
+ int i;
+
+ /* Nothing to do if either string or set is empty */
+ if (stringlen > 0 && setlen > 0)
+ {
+ if (pg_database_encoding_max_length() > 1)
+ {
+ /*
+ * In the multibyte-encoding case, build arrays of pointers to
+ * character starts, so that we can avoid inefficient checks in
+ * the inner loops.
+ */
+ const char **stringchars;
+ const char **setchars;
+ int *stringmblen;
+ int *setmblen;
+ int stringnchars;
+ int setnchars;
+ int resultndx;
+ int resultnchars;
+ const char *p;
+ int len;
+ int mblen;
+ const char *str_pos;
+ int str_len;
+
+ stringchars = (const char **) palloc(stringlen * sizeof(char *));
+ stringmblen = (int *) palloc(stringlen * sizeof(int));
+ stringnchars = 0;
+ p = string;
+ len = stringlen;
+ while (len > 0)
+ {
+ stringchars[stringnchars] = p;
+ stringmblen[stringnchars] = mblen = pg_mblen(p);
+ stringnchars++;
+ p += mblen;
+ len -= mblen;
+ }
+
+ setchars = (const char **) palloc(setlen * sizeof(char *));
+ setmblen = (int *) palloc(setlen * sizeof(int));
+ setnchars = 0;
+ p = set;
+ len = setlen;
+ while (len > 0)
+ {
+ setchars[setnchars] = p;
+ setmblen[setnchars] = mblen = pg_mblen(p);
+ setnchars++;
+ p += mblen;
+ len -= mblen;
+ }
+
+ resultndx = 0; /* index in stringchars[] */
+ resultnchars = stringnchars;
+
+ if (doltrim)
+ {
+ while (resultnchars > 0)
+ {
+ str_pos = stringchars[resultndx];
+ str_len = stringmblen[resultndx];
+ for (i = 0; i < setnchars; i++)
+ {
+ if (str_len == setmblen[i] &&
+ memcmp(str_pos, setchars[i], str_len) == 0)
+ break;
+ }
+ if (i >= setnchars)
+ break; /* no match here */
+ string += str_len;
+ stringlen -= str_len;
+ resultndx++;
+ resultnchars--;
+ }
+ }
+
+ if (dortrim)
+ {
+ while (resultnchars > 0)
+ {
+ str_pos = stringchars[resultndx + resultnchars - 1];
+ str_len = stringmblen[resultndx + resultnchars - 1];
+ for (i = 0; i < setnchars; i++)
+ {
+ if (str_len == setmblen[i] &&
+ memcmp(str_pos, setchars[i], str_len) == 0)
+ break;
+ }
+ if (i >= setnchars)
+ break; /* no match here */
+ stringlen -= str_len;
+ resultnchars--;
+ }
+ }
+
+ pfree(stringchars);
+ pfree(stringmblen);
+ pfree(setchars);
+ pfree(setmblen);
+ }
+ else
+ {
+ /*
+ * In the single-byte-encoding case, we don't need such overhead.
+ */
+ if (doltrim)
+ {
+ while (stringlen > 0)
+ {
+ char str_ch = *string;
+
+ for (i = 0; i < setlen; i++)
+ {
+ if (str_ch == set[i])
+ break;
+ }
+ if (i >= setlen)
+ break; /* no match here */
+ string++;
+ stringlen--;
+ }
+ }
+
+ if (dortrim)
+ {
+ while (stringlen > 0)
+ {
+ char str_ch = string[stringlen - 1];
+
+ for (i = 0; i < setlen; i++)
+ {
+ if (str_ch == set[i])
+ break;
+ }
+ if (i >= setlen)
+ break; /* no match here */
+ stringlen--;
+ }
+ }
+ }
+ }
+
+ /* Return selected portion of string */
+ return cstring_to_text_with_len(string, stringlen);
+}
+
+/*
+ * Common implementation for bytea versions of btrim, ltrim, rtrim
+ */
+bytea *
+dobyteatrim(bytea *string, bytea *set, bool doltrim, bool dortrim)
+{
+ bytea *ret;
+ char *ptr,
+ *end,
+ *ptr2,
+ *ptr2start,
+ *end2;
+ int m,
+ stringlen,
+ setlen;
+
+ stringlen = VARSIZE_ANY_EXHDR(string);
+ setlen = VARSIZE_ANY_EXHDR(set);
+
+ if (stringlen <= 0 || setlen <= 0)
+ return string;
+
+ m = stringlen;
+ ptr = VARDATA_ANY(string);
+ end = ptr + stringlen - 1;
+ ptr2start = VARDATA_ANY(set);
+ end2 = ptr2start + setlen - 1;
+
+ if (doltrim)
+ {
+ while (m > 0)
+ {
+ ptr2 = ptr2start;
+ while (ptr2 <= end2)
+ {
+ if (*ptr == *ptr2)
+ break;
+ ++ptr2;
+ }
+ if (ptr2 > end2)
+ break;
+ ptr++;
+ m--;
+ }
+ }
+
+ if (dortrim)
+ {
+ while (m > 0)
+ {
+ ptr2 = ptr2start;
+ while (ptr2 <= end2)
+ {
+ if (*end == *ptr2)
+ break;
+ ++ptr2;
+ }
+ if (ptr2 > end2)
+ break;
+ end--;
+ m--;
+ }
+ }
+
+ ret = (bytea *) palloc(VARHDRSZ + m);
+ SET_VARSIZE(ret, VARHDRSZ + m);
+ memcpy(VARDATA(ret), ptr, m);
+ return ret;
+}
+
+/********************************************************************
+ *
+ * byteatrim
+ *
+ * Syntax:
+ *
+ * bytea byteatrim(bytea string, bytea set)
+ *
+ * Purpose:
+ *
+ * Returns string with characters removed from the front and back
+ * up to the first character not in set.
+ *
+ * Cloned from btrim and modified as required.
+ ********************************************************************/
+
+Datum
+byteatrim(PG_FUNCTION_ARGS)
+{
+ bytea *string = PG_GETARG_BYTEA_PP(0);
+ bytea *set = PG_GETARG_BYTEA_PP(1);
+ bytea *ret;
+
+ ret = dobyteatrim(string, set, true, true);
+
+ PG_RETURN_BYTEA_P(ret);
+}
+
+/********************************************************************
+ *
+ * bytealtrim
+ *
+ * Syntax:
+ *
+ * bytea bytealtrim(bytea string, bytea set)
+ *
+ * Purpose:
+ *
+ * Returns string with initial characters removed up to the first
+ * character not in set.
+ *
+ ********************************************************************/
+
+Datum
+bytealtrim(PG_FUNCTION_ARGS)
+{
+ bytea *string = PG_GETARG_BYTEA_PP(0);
+ bytea *set = PG_GETARG_BYTEA_PP(1);
+ bytea *ret;
+
+ ret = dobyteatrim(string, set, true, false);
+
+ PG_RETURN_BYTEA_P(ret);
+}
+
+/********************************************************************
+ *
+ * byteartrim
+ *
+ * Syntax:
+ *
+ * bytea byteartrim(bytea string, bytea set)
+ *
+ * Purpose:
+ *
+ * Returns string with final characters removed after the last
+ * character not in set.
+ *
+ ********************************************************************/
+
+Datum
+byteartrim(PG_FUNCTION_ARGS)
+{
+ bytea *string = PG_GETARG_BYTEA_PP(0);
+ bytea *set = PG_GETARG_BYTEA_PP(1);
+ bytea *ret;
+
+ ret = dobyteatrim(string, set, false, true);
+
+ PG_RETURN_BYTEA_P(ret);
+}
+
+/********************************************************************
+ *
+ * ltrim
+ *
+ * Syntax:
+ *
+ * text ltrim(text string, text set)
+ *
+ * Purpose:
+ *
+ * Returns string with initial characters removed up to the first
+ * character not in set.
+ *
+ ********************************************************************/
+
+Datum
+ltrim(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *set = PG_GETARG_TEXT_PP(1);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ VARDATA_ANY(set), VARSIZE_ANY_EXHDR(set),
+ true, false);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+/********************************************************************
+ *
+ * ltrim1 --- ltrim with set fixed as ' '
+ *
+ ********************************************************************/
+
+Datum
+ltrim1(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ " ", 1,
+ true, false);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+/********************************************************************
+ *
+ * rtrim
+ *
+ * Syntax:
+ *
+ * text rtrim(text string, text set)
+ *
+ * Purpose:
+ *
+ * Returns string with final characters removed after the last
+ * character not in set.
+ *
+ ********************************************************************/
+
+Datum
+rtrim(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *set = PG_GETARG_TEXT_PP(1);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ VARDATA_ANY(set), VARSIZE_ANY_EXHDR(set),
+ false, true);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+/********************************************************************
+ *
+ * rtrim1 --- rtrim with set fixed as ' '
+ *
+ ********************************************************************/
+
+Datum
+rtrim1(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *ret;
+
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string),
+ " ", 1,
+ false, true);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+
+/********************************************************************
+ *
+ * translate
+ *
+ * Syntax:
+ *
+ * text translate(text string, text from, text to)
+ *
+ * Purpose:
+ *
+ * Returns string after replacing all occurrences of characters in from
+ * with the corresponding character in to. If from is longer than to,
+ * occurrences of the extra characters in from are deleted.
+ * Improved by Edwin Ramirez <ramirez@doc.mssm.edu>.
+ *
+ ********************************************************************/
+
+Datum
+translate(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ text *from = PG_GETARG_TEXT_PP(1);
+ text *to = PG_GETARG_TEXT_PP(2);
+ text *result;
+ char *from_ptr,
+ *to_ptr,
+ *to_end;
+ char *source,
+ *target;
+ int m,
+ fromlen,
+ tolen,
+ retlen,
+ i;
+ int bytelen;
+ int len;
+ int source_len;
+ int from_index;
+
+ m = VARSIZE_ANY_EXHDR(string);
+ if (m <= 0)
+ PG_RETURN_TEXT_P(string);
+ source = VARDATA_ANY(string);
+
+ fromlen = VARSIZE_ANY_EXHDR(from);
+ from_ptr = VARDATA_ANY(from);
+ tolen = VARSIZE_ANY_EXHDR(to);
+ to_ptr = VARDATA_ANY(to);
+ to_end = to_ptr + tolen;
+
+ /*
+ * The worst-case expansion is to substitute a max-length character for a
+ * single-byte character at each position of the string.
+ */
+ if (unlikely(pg_mul_s32_overflow(pg_database_encoding_max_length(), m,
+ &bytelen)) ||
+ unlikely(pg_add_s32_overflow(bytelen, VARHDRSZ, &bytelen)) ||
+ unlikely(!AllocSizeIsValid(bytelen)))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested length too large")));
+
+ result = (text *) palloc(bytelen);
+
+ target = VARDATA(result);
+ retlen = 0;
+
+ while (m > 0)
+ {
+ source_len = pg_mblen(source);
+ from_index = 0;
+
+ for (i = 0; i < fromlen; i += len)
+ {
+ len = pg_mblen(&from_ptr[i]);
+ if (len == source_len &&
+ memcmp(source, &from_ptr[i], len) == 0)
+ break;
+
+ from_index++;
+ }
+ if (i < fromlen)
+ {
+ /* substitute, or delete if no corresponding "to" character */
+ char *p = to_ptr;
+
+ for (i = 0; i < from_index; i++)
+ {
+ if (p >= to_end)
+ break;
+ p += pg_mblen(p);
+ }
+ if (p < to_end)
+ {
+ len = pg_mblen(p);
+ memcpy(target, p, len);
+ target += len;
+ retlen += len;
+ }
+ }
+ else
+ {
+ /* no match, so copy */
+ memcpy(target, source, source_len);
+ target += source_len;
+ retlen += source_len;
+ }
+
+ source += source_len;
+ m -= source_len;
+ }
+
+ SET_VARSIZE(result, retlen + VARHDRSZ);
+
+ /*
+ * The function result is probably much bigger than needed, if we're using
+ * a multibyte encoding, but it's not worth reallocating it; the result
+ * probably won't live long anyway.
+ */
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/********************************************************************
+ *
+ * ascii
+ *
+ * Syntax:
+ *
+ * int ascii(text string)
+ *
+ * Purpose:
+ *
+ * Returns the decimal representation of the first character from
+ * string.
+ * If the string is empty we return 0.
+ * If the database encoding is UTF8, we return the Unicode codepoint.
+ * If the database encoding is any other multi-byte encoding, we
+ * return the value of the first byte if it is an ASCII character
+ * (range 1 .. 127), or raise an error.
+ * For all other encodings we return the value of the first byte,
+ * (range 1..255).
+ *
+ ********************************************************************/
+
+Datum
+ascii(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ int encoding = GetDatabaseEncoding();
+ unsigned char *data;
+
+ if (VARSIZE_ANY_EXHDR(string) <= 0)
+ PG_RETURN_INT32(0);
+
+ data = (unsigned char *) VARDATA_ANY(string);
+
+ if (encoding == PG_UTF8 && *data > 127)
+ {
+ /* return the code point for Unicode */
+
+ int result = 0,
+ tbytes = 0,
+ i;
+
+ if (*data >= 0xF0)
+ {
+ result = *data & 0x07;
+ tbytes = 3;
+ }
+ else if (*data >= 0xE0)
+ {
+ result = *data & 0x0F;
+ tbytes = 2;
+ }
+ else
+ {
+ Assert(*data > 0xC0);
+ result = *data & 0x1f;
+ tbytes = 1;
+ }
+
+ Assert(tbytes > 0);
+
+ for (i = 1; i <= tbytes; i++)
+ {
+ Assert((data[i] & 0xC0) == 0x80);
+ result = (result << 6) + (data[i] & 0x3f);
+ }
+
+ PG_RETURN_INT32(result);
+ }
+ else
+ {
+ if (pg_encoding_max_length(encoding) > 1 && *data > 127)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested character too large")));
+
+
+ PG_RETURN_INT32((int32) *data);
+ }
+}
+
+/********************************************************************
+ *
+ * chr
+ *
+ * Syntax:
+ *
+ * text chr(int val)
+ *
+ * Purpose:
+ *
+ * Returns the character having the binary equivalent to val.
+ *
+ * For UTF8 we treat the argument as a Unicode code point.
+ * For other multi-byte encodings we raise an error for arguments
+ * outside the strict ASCII range (1..127).
+ *
+ * It's important that we don't ever return a value that is not valid
+ * in the database encoding, so that this doesn't become a way for
+ * invalid data to enter the database.
+ *
+ ********************************************************************/
+
+Datum
+chr (PG_FUNCTION_ARGS)
+{
+ int32 arg = PG_GETARG_INT32(0);
+ uint32 cvalue;
+ text *result;
+ int encoding = GetDatabaseEncoding();
+
+ /*
+ * Error out on arguments that make no sense or that we can't validly
+ * represent in the encoding.
+ */
+ if (arg < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("character number must be positive")));
+ else if (arg == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("null character not permitted")));
+
+ cvalue = arg;
+
+ if (encoding == PG_UTF8 && cvalue > 127)
+ {
+ /* for Unicode we treat the argument as a code point */
+ int bytes;
+ unsigned char *wch;
+
+ /*
+ * We only allow valid Unicode code points; per RFC3629 that stops at
+ * U+10FFFF, even though 4-byte UTF8 sequences can hold values up to
+ * U+1FFFFF.
+ */
+ if (cvalue > 0x0010ffff)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested character too large for encoding: %u",
+ cvalue)));
+
+ if (cvalue > 0xffff)
+ bytes = 4;
+ else if (cvalue > 0x07ff)
+ bytes = 3;
+ else
+ bytes = 2;
+
+ result = (text *) palloc(VARHDRSZ + bytes);
+ SET_VARSIZE(result, VARHDRSZ + bytes);
+ wch = (unsigned char *) VARDATA(result);
+
+ if (bytes == 2)
+ {
+ wch[0] = 0xC0 | ((cvalue >> 6) & 0x1F);
+ wch[1] = 0x80 | (cvalue & 0x3F);
+ }
+ else if (bytes == 3)
+ {
+ wch[0] = 0xE0 | ((cvalue >> 12) & 0x0F);
+ wch[1] = 0x80 | ((cvalue >> 6) & 0x3F);
+ wch[2] = 0x80 | (cvalue & 0x3F);
+ }
+ else
+ {
+ wch[0] = 0xF0 | ((cvalue >> 18) & 0x07);
+ wch[1] = 0x80 | ((cvalue >> 12) & 0x3F);
+ wch[2] = 0x80 | ((cvalue >> 6) & 0x3F);
+ wch[3] = 0x80 | (cvalue & 0x3F);
+ }
+
+ /*
+ * The preceding range check isn't sufficient, because UTF8 excludes
+ * Unicode "surrogate pair" codes. Make sure what we created is valid
+ * UTF8.
+ */
+ if (!pg_utf8_islegal(wch, bytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested character not valid for encoding: %u",
+ cvalue)));
+ }
+ else
+ {
+ bool is_mb;
+
+ is_mb = pg_encoding_max_length(encoding) > 1;
+
+ if ((is_mb && (cvalue > 127)) || (!is_mb && (cvalue > 255)))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested character too large for encoding: %u",
+ cvalue)));
+
+ result = (text *) palloc(VARHDRSZ + 1);
+ SET_VARSIZE(result, VARHDRSZ + 1);
+ *VARDATA(result) = (char) cvalue;
+ }
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/********************************************************************
+ *
+ * repeat
+ *
+ * Syntax:
+ *
+ * text repeat(text string, int val)
+ *
+ * Purpose:
+ *
+ * Repeat string by val.
+ *
+ ********************************************************************/
+
+Datum
+repeat(PG_FUNCTION_ARGS)
+{
+ text *string = PG_GETARG_TEXT_PP(0);
+ int32 count = PG_GETARG_INT32(1);
+ text *result;
+ int slen,
+ tlen;
+ int i;
+ char *cp,
+ *sp;
+
+ if (count < 0)
+ count = 0;
+
+ slen = VARSIZE_ANY_EXHDR(string);
+
+ if (unlikely(pg_mul_s32_overflow(count, slen, &tlen)) ||
+ unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen)) ||
+ unlikely(!AllocSizeIsValid(tlen)))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("requested length too large")));
+
+ result = (text *) palloc(tlen);
+
+ SET_VARSIZE(result, tlen);
+ cp = VARDATA(result);
+ sp = VARDATA_ANY(string);
+ for (i = 0; i < count; i++)
+ {
+ memcpy(cp, sp, slen);
+ cp += slen;
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ PG_RETURN_TEXT_P(result);
+}
diff --git a/src/backend/utils/adt/orderedsetaggs.c b/src/backend/utils/adt/orderedsetaggs.c
new file mode 100644
index 0000000..6d4f6b7
--- /dev/null
+++ b/src/backend/utils/adt/orderedsetaggs.c
@@ -0,0 +1,1431 @@
+/*-------------------------------------------------------------------------
+ *
+ * orderedsetaggs.c
+ * Ordered-set aggregate functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/orderedsetaggs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "catalog/pg_aggregate.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_type.h"
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/optimizer.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/timestamp.h"
+#include "utils/tuplesort.h"
+
+
+/*
+ * Generic support for ordered-set aggregates
+ *
+ * The state for an ordered-set aggregate is divided into a per-group struct
+ * (which is the internal-type transition state datum returned to nodeAgg.c)
+ * and a per-query struct, which contains data and sub-objects that we can
+ * create just once per query because they will not change across groups.
+ * The per-query struct and subsidiary data live in the executor's per-query
+ * memory context, and go away implicitly at ExecutorEnd().
+ *
+ * These structs are set up during the first call of the transition function.
+ * Because we allow nodeAgg.c to merge ordered-set aggregates (but not
+ * hypothetical aggregates) with identical inputs and transition functions,
+ * this info must not depend on the particular aggregate (ie, particular
+ * final-function), nor on the direct argument(s) of the aggregate.
+ */
+
+typedef struct OSAPerQueryState
+{
+ /* Representative Aggref for this aggregate: */
+ Aggref *aggref;
+ /* Memory context containing this struct and other per-query data: */
+ MemoryContext qcontext;
+ /* Context for expression evaluation */
+ ExprContext *econtext;
+ /* Do we expect multiple final-function calls within one group? */
+ bool rescan_needed;
+
+ /* These fields are used only when accumulating tuples: */
+
+ /* Tuple descriptor for tuples inserted into sortstate: */
+ TupleDesc tupdesc;
+ /* Tuple slot we can use for inserting/extracting tuples: */
+ TupleTableSlot *tupslot;
+ /* Per-sort-column sorting information */
+ int numSortCols;
+ AttrNumber *sortColIdx;
+ Oid *sortOperators;
+ Oid *eqOperators;
+ Oid *sortCollations;
+ bool *sortNullsFirsts;
+ /* Equality operator call info, created only if needed: */
+ ExprState *compareTuple;
+
+ /* These fields are used only when accumulating datums: */
+
+ /* Info about datatype of datums being sorted: */
+ Oid sortColType;
+ int16 typLen;
+ bool typByVal;
+ char typAlign;
+ /* Info about sort ordering: */
+ Oid sortOperator;
+ Oid eqOperator;
+ Oid sortCollation;
+ bool sortNullsFirst;
+ /* Equality operator call info, created only if needed: */
+ FmgrInfo equalfn;
+} OSAPerQueryState;
+
+typedef struct OSAPerGroupState
+{
+ /* Link to the per-query state for this aggregate: */
+ OSAPerQueryState *qstate;
+ /* Memory context containing per-group data: */
+ MemoryContext gcontext;
+ /* Sort object we're accumulating data in: */
+ Tuplesortstate *sortstate;
+ /* Number of normal rows inserted into sortstate: */
+ int64 number_of_rows;
+ /* Have we already done tuplesort_performsort? */
+ bool sort_done;
+} OSAPerGroupState;
+
+static void ordered_set_shutdown(Datum arg);
+
+
+/*
+ * Set up working state for an ordered-set aggregate
+ */
+static OSAPerGroupState *
+ordered_set_startup(FunctionCallInfo fcinfo, bool use_tuples)
+{
+ OSAPerGroupState *osastate;
+ OSAPerQueryState *qstate;
+ MemoryContext gcontext;
+ MemoryContext oldcontext;
+ int tuplesortopt;
+
+ /*
+ * Check we're called as aggregate (and not a window function), and get
+ * the Agg node's group-lifespan context (which might change from group to
+ * group, so we shouldn't cache it in the per-query state).
+ */
+ if (AggCheckCallContext(fcinfo, &gcontext) != AGG_CONTEXT_AGGREGATE)
+ elog(ERROR, "ordered-set aggregate called in non-aggregate context");
+
+ /*
+ * We keep a link to the per-query state in fn_extra; if it's not there,
+ * create it, and do the per-query setup we need.
+ */
+ qstate = (OSAPerQueryState *) fcinfo->flinfo->fn_extra;
+ if (qstate == NULL)
+ {
+ Aggref *aggref;
+ MemoryContext qcontext;
+ List *sortlist;
+ int numSortCols;
+
+ /* Get the Aggref so we can examine aggregate's arguments */
+ aggref = AggGetAggref(fcinfo);
+ if (!aggref)
+ elog(ERROR, "ordered-set aggregate called in non-aggregate context");
+ if (!AGGKIND_IS_ORDERED_SET(aggref->aggkind))
+ elog(ERROR, "ordered-set aggregate support function called for non-ordered-set aggregate");
+
+ /*
+ * Prepare per-query structures in the fn_mcxt, which we assume is the
+ * executor's per-query context; in any case it's the right place to
+ * keep anything found via fn_extra.
+ */
+ qcontext = fcinfo->flinfo->fn_mcxt;
+ oldcontext = MemoryContextSwitchTo(qcontext);
+
+ qstate = (OSAPerQueryState *) palloc0(sizeof(OSAPerQueryState));
+ qstate->aggref = aggref;
+ qstate->qcontext = qcontext;
+
+ /* We need to support rescans if the trans state is shared */
+ qstate->rescan_needed = AggStateIsShared(fcinfo);
+
+ /* Extract the sort information */
+ sortlist = aggref->aggorder;
+ numSortCols = list_length(sortlist);
+
+ if (use_tuples)
+ {
+ bool ishypothetical = (aggref->aggkind == AGGKIND_HYPOTHETICAL);
+ ListCell *lc;
+ int i;
+
+ if (ishypothetical)
+ numSortCols++; /* make space for flag column */
+ qstate->numSortCols = numSortCols;
+ qstate->sortColIdx = (AttrNumber *) palloc(numSortCols * sizeof(AttrNumber));
+ qstate->sortOperators = (Oid *) palloc(numSortCols * sizeof(Oid));
+ qstate->eqOperators = (Oid *) palloc(numSortCols * sizeof(Oid));
+ qstate->sortCollations = (Oid *) palloc(numSortCols * sizeof(Oid));
+ qstate->sortNullsFirsts = (bool *) palloc(numSortCols * sizeof(bool));
+
+ i = 0;
+ foreach(lc, sortlist)
+ {
+ SortGroupClause *sortcl = (SortGroupClause *) lfirst(lc);
+ TargetEntry *tle = get_sortgroupclause_tle(sortcl,
+ aggref->args);
+
+ /* the parser should have made sure of this */
+ Assert(OidIsValid(sortcl->sortop));
+
+ qstate->sortColIdx[i] = tle->resno;
+ qstate->sortOperators[i] = sortcl->sortop;
+ qstate->eqOperators[i] = sortcl->eqop;
+ qstate->sortCollations[i] = exprCollation((Node *) tle->expr);
+ qstate->sortNullsFirsts[i] = sortcl->nulls_first;
+ i++;
+ }
+
+ if (ishypothetical)
+ {
+ /* Add an integer flag column as the last sort column */
+ qstate->sortColIdx[i] = list_length(aggref->args) + 1;
+ qstate->sortOperators[i] = Int4LessOperator;
+ qstate->eqOperators[i] = Int4EqualOperator;
+ qstate->sortCollations[i] = InvalidOid;
+ qstate->sortNullsFirsts[i] = false;
+ i++;
+ }
+
+ Assert(i == numSortCols);
+
+ /*
+ * Get a tupledesc corresponding to the aggregated inputs
+ * (including sort expressions) of the agg.
+ */
+ qstate->tupdesc = ExecTypeFromTL(aggref->args);
+
+ /* If we need a flag column, hack the tupledesc to include that */
+ if (ishypothetical)
+ {
+ TupleDesc newdesc;
+ int natts = qstate->tupdesc->natts;
+
+ newdesc = CreateTemplateTupleDesc(natts + 1);
+ for (i = 1; i <= natts; i++)
+ TupleDescCopyEntry(newdesc, i, qstate->tupdesc, i);
+
+ TupleDescInitEntry(newdesc,
+ (AttrNumber) ++natts,
+ "flag",
+ INT4OID,
+ -1,
+ 0);
+
+ FreeTupleDesc(qstate->tupdesc);
+ qstate->tupdesc = newdesc;
+ }
+
+ /* Create slot we'll use to store/retrieve rows */
+ qstate->tupslot = MakeSingleTupleTableSlot(qstate->tupdesc,
+ &TTSOpsMinimalTuple);
+ }
+ else
+ {
+ /* Sort single datums */
+ SortGroupClause *sortcl;
+ TargetEntry *tle;
+
+ if (numSortCols != 1 || aggref->aggkind == AGGKIND_HYPOTHETICAL)
+ elog(ERROR, "ordered-set aggregate support function does not support multiple aggregated columns");
+
+ sortcl = (SortGroupClause *) linitial(sortlist);
+ tle = get_sortgroupclause_tle(sortcl, aggref->args);
+
+ /* the parser should have made sure of this */
+ Assert(OidIsValid(sortcl->sortop));
+
+ /* Save sort ordering info */
+ qstate->sortColType = exprType((Node *) tle->expr);
+ qstate->sortOperator = sortcl->sortop;
+ qstate->eqOperator = sortcl->eqop;
+ qstate->sortCollation = exprCollation((Node *) tle->expr);
+ qstate->sortNullsFirst = sortcl->nulls_first;
+
+ /* Save datatype info */
+ get_typlenbyvalalign(qstate->sortColType,
+ &qstate->typLen,
+ &qstate->typByVal,
+ &qstate->typAlign);
+ }
+
+ fcinfo->flinfo->fn_extra = (void *) qstate;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* Now build the stuff we need in group-lifespan context */
+ oldcontext = MemoryContextSwitchTo(gcontext);
+
+ osastate = (OSAPerGroupState *) palloc(sizeof(OSAPerGroupState));
+ osastate->qstate = qstate;
+ osastate->gcontext = gcontext;
+
+ tuplesortopt = TUPLESORT_NONE;
+
+ if (qstate->rescan_needed)
+ tuplesortopt |= TUPLESORT_RANDOMACCESS;
+
+ /*
+ * Initialize tuplesort object.
+ */
+ if (use_tuples)
+ osastate->sortstate = tuplesort_begin_heap(qstate->tupdesc,
+ qstate->numSortCols,
+ qstate->sortColIdx,
+ qstate->sortOperators,
+ qstate->sortCollations,
+ qstate->sortNullsFirsts,
+ work_mem,
+ NULL,
+ tuplesortopt);
+ else
+ osastate->sortstate = tuplesort_begin_datum(qstate->sortColType,
+ qstate->sortOperator,
+ qstate->sortCollation,
+ qstate->sortNullsFirst,
+ work_mem,
+ NULL,
+ tuplesortopt);
+
+ osastate->number_of_rows = 0;
+ osastate->sort_done = false;
+
+ /* Now register a shutdown callback to clean things up at end of group */
+ AggRegisterCallback(fcinfo,
+ ordered_set_shutdown,
+ PointerGetDatum(osastate));
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return osastate;
+}
+
+/*
+ * Clean up when evaluation of an ordered-set aggregate is complete.
+ *
+ * We don't need to bother freeing objects in the per-group memory context,
+ * since that will get reset anyway by nodeAgg.c; nor should we free anything
+ * in the per-query context, which will get cleared (if this was the last
+ * group) by ExecutorEnd. But we must take care to release any potential
+ * non-memory resources.
+ *
+ * In the case where we're not expecting multiple finalfn calls, we could
+ * arguably rely on the finalfn to clean up; but it's easier and more testable
+ * if we just do it the same way in either case.
+ */
+static void
+ordered_set_shutdown(Datum arg)
+{
+ OSAPerGroupState *osastate = (OSAPerGroupState *) DatumGetPointer(arg);
+
+ /* Tuplesort object might have temp files. */
+ if (osastate->sortstate)
+ tuplesort_end(osastate->sortstate);
+ osastate->sortstate = NULL;
+ /* The tupleslot probably can't be holding a pin, but let's be safe. */
+ if (osastate->qstate->tupslot)
+ ExecClearTuple(osastate->qstate->tupslot);
+}
+
+
+/*
+ * Generic transition function for ordered-set aggregates
+ * with a single input column in which we want to suppress nulls
+ */
+Datum
+ordered_set_transition(PG_FUNCTION_ARGS)
+{
+ OSAPerGroupState *osastate;
+
+ /* If first call, create the transition state workspace */
+ if (PG_ARGISNULL(0))
+ osastate = ordered_set_startup(fcinfo, false);
+ else
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* Load the datum into the tuplesort object, but only if it's not null */
+ if (!PG_ARGISNULL(1))
+ {
+ tuplesort_putdatum(osastate->sortstate, PG_GETARG_DATUM(1), false);
+ osastate->number_of_rows++;
+ }
+
+ PG_RETURN_POINTER(osastate);
+}
+
+/*
+ * Generic transition function for ordered-set aggregates
+ * with (potentially) multiple aggregated input columns
+ */
+Datum
+ordered_set_transition_multi(PG_FUNCTION_ARGS)
+{
+ OSAPerGroupState *osastate;
+ TupleTableSlot *slot;
+ int nargs;
+ int i;
+
+ /* If first call, create the transition state workspace */
+ if (PG_ARGISNULL(0))
+ osastate = ordered_set_startup(fcinfo, true);
+ else
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* Form a tuple from all the other inputs besides the transition value */
+ slot = osastate->qstate->tupslot;
+ ExecClearTuple(slot);
+ nargs = PG_NARGS() - 1;
+ for (i = 0; i < nargs; i++)
+ {
+ slot->tts_values[i] = PG_GETARG_DATUM(i + 1);
+ slot->tts_isnull[i] = PG_ARGISNULL(i + 1);
+ }
+ if (osastate->qstate->aggref->aggkind == AGGKIND_HYPOTHETICAL)
+ {
+ /* Add a zero flag value to mark this row as a normal input row */
+ slot->tts_values[i] = Int32GetDatum(0);
+ slot->tts_isnull[i] = false;
+ i++;
+ }
+ Assert(i == slot->tts_tupleDescriptor->natts);
+ ExecStoreVirtualTuple(slot);
+
+ /* Load the row into the tuplesort object */
+ tuplesort_puttupleslot(osastate->sortstate, slot);
+ osastate->number_of_rows++;
+
+ PG_RETURN_POINTER(osastate);
+}
+
+
+/*
+ * percentile_disc(float8) within group(anyelement) - discrete percentile
+ */
+Datum
+percentile_disc_final(PG_FUNCTION_ARGS)
+{
+ OSAPerGroupState *osastate;
+ double percentile;
+ Datum val;
+ bool isnull;
+ int64 rownum;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* Get and check the percentile argument */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+
+ percentile = PG_GETARG_FLOAT8(1);
+
+ if (percentile < 0 || percentile > 1 || isnan(percentile))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("percentile value %g is not between 0 and 1",
+ percentile)));
+
+ /* If there were no regular rows, the result is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* number_of_rows could be zero if we only saw NULL input values */
+ if (osastate->number_of_rows == 0)
+ PG_RETURN_NULL();
+
+ /* Finish the sort, or rescan if we already did */
+ if (!osastate->sort_done)
+ {
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+ }
+ else
+ tuplesort_rescan(osastate->sortstate);
+
+ /*----------
+ * We need the smallest K such that (K/N) >= percentile.
+ * N>0, therefore K >= N*percentile, therefore K = ceil(N*percentile).
+ * So we skip K-1 rows (if K>0) and return the next row fetched.
+ *----------
+ */
+ rownum = (int64) ceil(percentile * osastate->number_of_rows);
+ Assert(rownum <= osastate->number_of_rows);
+
+ if (rownum > 1)
+ {
+ if (!tuplesort_skiptuples(osastate->sortstate, rownum - 1, true))
+ elog(ERROR, "missing row in percentile_disc");
+ }
+
+ if (!tuplesort_getdatum(osastate->sortstate, true, &val, &isnull, NULL))
+ elog(ERROR, "missing row in percentile_disc");
+
+ /* We shouldn't have stored any nulls, but do the right thing anyway */
+ if (isnull)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_DATUM(val);
+}
+
+
+/*
+ * For percentile_cont, we need a way to interpolate between consecutive
+ * values. Use a helper function for that, so that we can share the rest
+ * of the code between types.
+ */
+typedef Datum (*LerpFunc) (Datum lo, Datum hi, double pct);
+
+static Datum
+float8_lerp(Datum lo, Datum hi, double pct)
+{
+ double loval = DatumGetFloat8(lo);
+ double hival = DatumGetFloat8(hi);
+
+ return Float8GetDatum(loval + (pct * (hival - loval)));
+}
+
+static Datum
+interval_lerp(Datum lo, Datum hi, double pct)
+{
+ Datum diff_result = DirectFunctionCall2(interval_mi, hi, lo);
+ Datum mul_result = DirectFunctionCall2(interval_mul,
+ diff_result,
+ Float8GetDatumFast(pct));
+
+ return DirectFunctionCall2(interval_pl, mul_result, lo);
+}
+
+/*
+ * Continuous percentile
+ */
+static Datum
+percentile_cont_final_common(FunctionCallInfo fcinfo,
+ Oid expect_type,
+ LerpFunc lerpfunc)
+{
+ OSAPerGroupState *osastate;
+ double percentile;
+ int64 first_row = 0;
+ int64 second_row = 0;
+ Datum val;
+ Datum first_val;
+ Datum second_val;
+ double proportion;
+ bool isnull;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* Get and check the percentile argument */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+
+ percentile = PG_GETARG_FLOAT8(1);
+
+ if (percentile < 0 || percentile > 1 || isnan(percentile))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("percentile value %g is not between 0 and 1",
+ percentile)));
+
+ /* If there were no regular rows, the result is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* number_of_rows could be zero if we only saw NULL input values */
+ if (osastate->number_of_rows == 0)
+ PG_RETURN_NULL();
+
+ Assert(expect_type == osastate->qstate->sortColType);
+
+ /* Finish the sort, or rescan if we already did */
+ if (!osastate->sort_done)
+ {
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+ }
+ else
+ tuplesort_rescan(osastate->sortstate);
+
+ first_row = floor(percentile * (osastate->number_of_rows - 1));
+ second_row = ceil(percentile * (osastate->number_of_rows - 1));
+
+ Assert(first_row < osastate->number_of_rows);
+
+ if (!tuplesort_skiptuples(osastate->sortstate, first_row, true))
+ elog(ERROR, "missing row in percentile_cont");
+
+ if (!tuplesort_getdatum(osastate->sortstate, true, &first_val, &isnull, NULL))
+ elog(ERROR, "missing row in percentile_cont");
+ if (isnull)
+ PG_RETURN_NULL();
+
+ if (first_row == second_row)
+ {
+ val = first_val;
+ }
+ else
+ {
+ if (!tuplesort_getdatum(osastate->sortstate, true, &second_val, &isnull, NULL))
+ elog(ERROR, "missing row in percentile_cont");
+
+ if (isnull)
+ PG_RETURN_NULL();
+
+ proportion = (percentile * (osastate->number_of_rows - 1)) - first_row;
+ val = lerpfunc(first_val, second_val, proportion);
+ }
+
+ PG_RETURN_DATUM(val);
+}
+
+/*
+ * percentile_cont(float8) within group (float8) - continuous percentile
+ */
+Datum
+percentile_cont_float8_final(PG_FUNCTION_ARGS)
+{
+ return percentile_cont_final_common(fcinfo, FLOAT8OID, float8_lerp);
+}
+
+/*
+ * percentile_cont(float8) within group (interval) - continuous percentile
+ */
+Datum
+percentile_cont_interval_final(PG_FUNCTION_ARGS)
+{
+ return percentile_cont_final_common(fcinfo, INTERVALOID, interval_lerp);
+}
+
+
+/*
+ * Support code for handling arrays of percentiles
+ *
+ * Note: in each pct_info entry, second_row should be equal to or
+ * exactly one more than first_row.
+ */
+struct pct_info
+{
+ int64 first_row; /* first row to sample */
+ int64 second_row; /* possible second row to sample */
+ double proportion; /* interpolation fraction */
+ int idx; /* index of this item in original array */
+};
+
+/*
+ * Sort comparator to sort pct_infos by first_row then second_row
+ */
+static int
+pct_info_cmp(const void *pa, const void *pb)
+{
+ const struct pct_info *a = (const struct pct_info *) pa;
+ const struct pct_info *b = (const struct pct_info *) pb;
+
+ if (a->first_row != b->first_row)
+ return (a->first_row < b->first_row) ? -1 : 1;
+ if (a->second_row != b->second_row)
+ return (a->second_row < b->second_row) ? -1 : 1;
+ return 0;
+}
+
+/*
+ * Construct array showing which rows to sample for percentiles.
+ */
+static struct pct_info *
+setup_pct_info(int num_percentiles,
+ Datum *percentiles_datum,
+ bool *percentiles_null,
+ int64 rowcount,
+ bool continuous)
+{
+ struct pct_info *pct_info;
+ int i;
+
+ pct_info = (struct pct_info *) palloc(num_percentiles * sizeof(struct pct_info));
+
+ for (i = 0; i < num_percentiles; i++)
+ {
+ pct_info[i].idx = i;
+
+ if (percentiles_null[i])
+ {
+ /* dummy entry for any NULL in array */
+ pct_info[i].first_row = 0;
+ pct_info[i].second_row = 0;
+ pct_info[i].proportion = 0;
+ }
+ else
+ {
+ double p = DatumGetFloat8(percentiles_datum[i]);
+
+ if (p < 0 || p > 1 || isnan(p))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("percentile value %g is not between 0 and 1",
+ p)));
+
+ if (continuous)
+ {
+ pct_info[i].first_row = 1 + floor(p * (rowcount - 1));
+ pct_info[i].second_row = 1 + ceil(p * (rowcount - 1));
+ pct_info[i].proportion = (p * (rowcount - 1)) - floor(p * (rowcount - 1));
+ }
+ else
+ {
+ /*----------
+ * We need the smallest K such that (K/N) >= percentile.
+ * N>0, therefore K >= N*percentile, therefore
+ * K = ceil(N*percentile); but not less than 1.
+ *----------
+ */
+ int64 row = (int64) ceil(p * rowcount);
+
+ row = Max(1, row);
+ pct_info[i].first_row = row;
+ pct_info[i].second_row = row;
+ pct_info[i].proportion = 0;
+ }
+ }
+ }
+
+ /*
+ * The parameter array wasn't necessarily in sorted order, but we need to
+ * visit the rows in order, so sort by first_row/second_row.
+ */
+ qsort(pct_info, num_percentiles, sizeof(struct pct_info), pct_info_cmp);
+
+ return pct_info;
+}
+
+/*
+ * percentile_disc(float8[]) within group (anyelement) - discrete percentiles
+ */
+Datum
+percentile_disc_multi_final(PG_FUNCTION_ARGS)
+{
+ OSAPerGroupState *osastate;
+ ArrayType *param;
+ Datum *percentiles_datum;
+ bool *percentiles_null;
+ int num_percentiles;
+ struct pct_info *pct_info;
+ Datum *result_datum;
+ bool *result_isnull;
+ int64 rownum = 0;
+ Datum val = (Datum) 0;
+ bool isnull = true;
+ int i;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* If there were no regular rows, the result is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* number_of_rows could be zero if we only saw NULL input values */
+ if (osastate->number_of_rows == 0)
+ PG_RETURN_NULL();
+
+ /* Deconstruct the percentile-array input */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ param = PG_GETARG_ARRAYTYPE_P(1);
+
+ deconstruct_array(param, FLOAT8OID,
+ /* hard-wired info on type float8 */
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE,
+ &percentiles_datum,
+ &percentiles_null,
+ &num_percentiles);
+
+ if (num_percentiles == 0)
+ PG_RETURN_POINTER(construct_empty_array(osastate->qstate->sortColType));
+
+ pct_info = setup_pct_info(num_percentiles,
+ percentiles_datum,
+ percentiles_null,
+ osastate->number_of_rows,
+ false);
+
+ result_datum = (Datum *) palloc(num_percentiles * sizeof(Datum));
+ result_isnull = (bool *) palloc(num_percentiles * sizeof(bool));
+
+ /*
+ * Start by dealing with any nulls in the param array - those are sorted
+ * to the front on row=0, so set the corresponding result indexes to null
+ */
+ for (i = 0; i < num_percentiles; i++)
+ {
+ int idx = pct_info[i].idx;
+
+ if (pct_info[i].first_row > 0)
+ break;
+
+ result_datum[idx] = (Datum) 0;
+ result_isnull[idx] = true;
+ }
+
+ /*
+ * If there's anything left after doing the nulls, then grind the input
+ * and extract the needed values
+ */
+ if (i < num_percentiles)
+ {
+ /* Finish the sort, or rescan if we already did */
+ if (!osastate->sort_done)
+ {
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+ }
+ else
+ tuplesort_rescan(osastate->sortstate);
+
+ for (; i < num_percentiles; i++)
+ {
+ int64 target_row = pct_info[i].first_row;
+ int idx = pct_info[i].idx;
+
+ /* Advance to target row, if not already there */
+ if (target_row > rownum)
+ {
+ if (!tuplesort_skiptuples(osastate->sortstate, target_row - rownum - 1, true))
+ elog(ERROR, "missing row in percentile_disc");
+
+ if (!tuplesort_getdatum(osastate->sortstate, true, &val, &isnull, NULL))
+ elog(ERROR, "missing row in percentile_disc");
+
+ rownum = target_row;
+ }
+
+ result_datum[idx] = val;
+ result_isnull[idx] = isnull;
+ }
+ }
+
+ /* We make the output array the same shape as the input */
+ PG_RETURN_POINTER(construct_md_array(result_datum, result_isnull,
+ ARR_NDIM(param),
+ ARR_DIMS(param),
+ ARR_LBOUND(param),
+ osastate->qstate->sortColType,
+ osastate->qstate->typLen,
+ osastate->qstate->typByVal,
+ osastate->qstate->typAlign));
+}
+
+/*
+ * percentile_cont(float8[]) within group () - continuous percentiles
+ */
+static Datum
+percentile_cont_multi_final_common(FunctionCallInfo fcinfo,
+ Oid expect_type,
+ int16 typLen, bool typByVal, char typAlign,
+ LerpFunc lerpfunc)
+{
+ OSAPerGroupState *osastate;
+ ArrayType *param;
+ Datum *percentiles_datum;
+ bool *percentiles_null;
+ int num_percentiles;
+ struct pct_info *pct_info;
+ Datum *result_datum;
+ bool *result_isnull;
+ int64 rownum = 0;
+ Datum first_val = (Datum) 0;
+ Datum second_val = (Datum) 0;
+ bool isnull;
+ int i;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* If there were no regular rows, the result is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* number_of_rows could be zero if we only saw NULL input values */
+ if (osastate->number_of_rows == 0)
+ PG_RETURN_NULL();
+
+ Assert(expect_type == osastate->qstate->sortColType);
+
+ /* Deconstruct the percentile-array input */
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ param = PG_GETARG_ARRAYTYPE_P(1);
+
+ deconstruct_array(param, FLOAT8OID,
+ /* hard-wired info on type float8 */
+ sizeof(float8), FLOAT8PASSBYVAL, TYPALIGN_DOUBLE,
+ &percentiles_datum,
+ &percentiles_null,
+ &num_percentiles);
+
+ if (num_percentiles == 0)
+ PG_RETURN_POINTER(construct_empty_array(osastate->qstate->sortColType));
+
+ pct_info = setup_pct_info(num_percentiles,
+ percentiles_datum,
+ percentiles_null,
+ osastate->number_of_rows,
+ true);
+
+ result_datum = (Datum *) palloc(num_percentiles * sizeof(Datum));
+ result_isnull = (bool *) palloc(num_percentiles * sizeof(bool));
+
+ /*
+ * Start by dealing with any nulls in the param array - those are sorted
+ * to the front on row=0, so set the corresponding result indexes to null
+ */
+ for (i = 0; i < num_percentiles; i++)
+ {
+ int idx = pct_info[i].idx;
+
+ if (pct_info[i].first_row > 0)
+ break;
+
+ result_datum[idx] = (Datum) 0;
+ result_isnull[idx] = true;
+ }
+
+ /*
+ * If there's anything left after doing the nulls, then grind the input
+ * and extract the needed values
+ */
+ if (i < num_percentiles)
+ {
+ /* Finish the sort, or rescan if we already did */
+ if (!osastate->sort_done)
+ {
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+ }
+ else
+ tuplesort_rescan(osastate->sortstate);
+
+ for (; i < num_percentiles; i++)
+ {
+ int64 first_row = pct_info[i].first_row;
+ int64 second_row = pct_info[i].second_row;
+ int idx = pct_info[i].idx;
+
+ /*
+ * Advance to first_row, if not already there. Note that we might
+ * already have rownum beyond first_row, in which case first_val
+ * is already correct. (This occurs when interpolating between
+ * the same two input rows as for the previous percentile.)
+ */
+ if (first_row > rownum)
+ {
+ if (!tuplesort_skiptuples(osastate->sortstate, first_row - rownum - 1, true))
+ elog(ERROR, "missing row in percentile_cont");
+
+ if (!tuplesort_getdatum(osastate->sortstate, true, &first_val,
+ &isnull, NULL) || isnull)
+ elog(ERROR, "missing row in percentile_cont");
+
+ rownum = first_row;
+ /* Always advance second_val to be latest input value */
+ second_val = first_val;
+ }
+ else if (first_row == rownum)
+ {
+ /*
+ * We are already at the desired row, so we must previously
+ * have read its value into second_val (and perhaps first_val
+ * as well, but this assignment is harmless in that case).
+ */
+ first_val = second_val;
+ }
+
+ /* Fetch second_row if needed */
+ if (second_row > rownum)
+ {
+ if (!tuplesort_getdatum(osastate->sortstate, true, &second_val,
+ &isnull, NULL) || isnull)
+ elog(ERROR, "missing row in percentile_cont");
+ rownum++;
+ }
+ /* We should now certainly be on second_row exactly */
+ Assert(second_row == rownum);
+
+ /* Compute appropriate result */
+ if (second_row > first_row)
+ result_datum[idx] = lerpfunc(first_val, second_val,
+ pct_info[i].proportion);
+ else
+ result_datum[idx] = first_val;
+
+ result_isnull[idx] = false;
+ }
+ }
+
+ /* We make the output array the same shape as the input */
+ PG_RETURN_POINTER(construct_md_array(result_datum, result_isnull,
+ ARR_NDIM(param),
+ ARR_DIMS(param), ARR_LBOUND(param),
+ expect_type,
+ typLen,
+ typByVal,
+ typAlign));
+}
+
+/*
+ * percentile_cont(float8[]) within group (float8) - continuous percentiles
+ */
+Datum
+percentile_cont_float8_multi_final(PG_FUNCTION_ARGS)
+{
+ return percentile_cont_multi_final_common(fcinfo,
+ FLOAT8OID,
+ /* hard-wired info on type float8 */
+ sizeof(float8),
+ FLOAT8PASSBYVAL,
+ TYPALIGN_DOUBLE,
+ float8_lerp);
+}
+
+/*
+ * percentile_cont(float8[]) within group (interval) - continuous percentiles
+ */
+Datum
+percentile_cont_interval_multi_final(PG_FUNCTION_ARGS)
+{
+ return percentile_cont_multi_final_common(fcinfo,
+ INTERVALOID,
+ /* hard-wired info on type interval */
+ 16, false, TYPALIGN_DOUBLE,
+ interval_lerp);
+}
+
+
+/*
+ * mode() within group (anyelement) - most common value
+ */
+Datum
+mode_final(PG_FUNCTION_ARGS)
+{
+ OSAPerGroupState *osastate;
+ Datum val;
+ bool isnull;
+ Datum mode_val = (Datum) 0;
+ int64 mode_freq = 0;
+ Datum last_val = (Datum) 0;
+ int64 last_val_freq = 0;
+ bool last_val_is_mode = false;
+ FmgrInfo *equalfn;
+ Datum abbrev_val = (Datum) 0;
+ Datum last_abbrev_val = (Datum) 0;
+ bool shouldfree;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* If there were no regular rows, the result is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+
+ /* number_of_rows could be zero if we only saw NULL input values */
+ if (osastate->number_of_rows == 0)
+ PG_RETURN_NULL();
+
+ /* Look up the equality function for the datatype, if we didn't already */
+ equalfn = &(osastate->qstate->equalfn);
+ if (!OidIsValid(equalfn->fn_oid))
+ fmgr_info_cxt(get_opcode(osastate->qstate->eqOperator), equalfn,
+ osastate->qstate->qcontext);
+
+ shouldfree = !(osastate->qstate->typByVal);
+
+ /* Finish the sort, or rescan if we already did */
+ if (!osastate->sort_done)
+ {
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+ }
+ else
+ tuplesort_rescan(osastate->sortstate);
+
+ /* Scan tuples and count frequencies */
+ while (tuplesort_getdatum(osastate->sortstate, true, &val, &isnull, &abbrev_val))
+ {
+ /* we don't expect any nulls, but ignore them if found */
+ if (isnull)
+ continue;
+
+ if (last_val_freq == 0)
+ {
+ /* first nonnull value - it's the mode for now */
+ mode_val = last_val = val;
+ mode_freq = last_val_freq = 1;
+ last_val_is_mode = true;
+ last_abbrev_val = abbrev_val;
+ }
+ else if (abbrev_val == last_abbrev_val &&
+ DatumGetBool(FunctionCall2Coll(equalfn, PG_GET_COLLATION(), val, last_val)))
+ {
+ /* value equal to previous value, count it */
+ if (last_val_is_mode)
+ mode_freq++; /* needn't maintain last_val_freq */
+ else if (++last_val_freq > mode_freq)
+ {
+ /* last_val becomes new mode */
+ if (shouldfree)
+ pfree(DatumGetPointer(mode_val));
+ mode_val = last_val;
+ mode_freq = last_val_freq;
+ last_val_is_mode = true;
+ }
+ if (shouldfree)
+ pfree(DatumGetPointer(val));
+ }
+ else
+ {
+ /* val should replace last_val */
+ if (shouldfree && !last_val_is_mode)
+ pfree(DatumGetPointer(last_val));
+ last_val = val;
+ /* avoid equality function calls by reusing abbreviated keys */
+ last_abbrev_val = abbrev_val;
+ last_val_freq = 1;
+ last_val_is_mode = false;
+ }
+
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ if (shouldfree && !last_val_is_mode)
+ pfree(DatumGetPointer(last_val));
+
+ if (mode_freq)
+ PG_RETURN_DATUM(mode_val);
+ else
+ PG_RETURN_NULL();
+}
+
+
+/*
+ * Common code to sanity-check args for hypothetical-set functions. No need
+ * for friendly errors, these can only happen if someone's messing up the
+ * aggregate definitions. The checks are needed for security, however.
+ */
+static void
+hypothetical_check_argtypes(FunctionCallInfo fcinfo, int nargs,
+ TupleDesc tupdesc)
+{
+ int i;
+
+ /* check that we have an int4 flag column */
+ if (!tupdesc ||
+ (nargs + 1) != tupdesc->natts ||
+ TupleDescAttr(tupdesc, nargs)->atttypid != INT4OID)
+ elog(ERROR, "type mismatch in hypothetical-set function");
+
+ /* check that direct args match in type with aggregated args */
+ for (i = 0; i < nargs; i++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (get_fn_expr_argtype(fcinfo->flinfo, i + 1) != attr->atttypid)
+ elog(ERROR, "type mismatch in hypothetical-set function");
+ }
+}
+
+/*
+ * compute rank of hypothetical row
+ *
+ * flag should be -1 to sort hypothetical row ahead of its peers, or +1
+ * to sort behind.
+ * total number of regular rows is returned into *number_of_rows.
+ */
+static int64
+hypothetical_rank_common(FunctionCallInfo fcinfo, int flag,
+ int64 *number_of_rows)
+{
+ int nargs = PG_NARGS() - 1;
+ int64 rank = 1;
+ OSAPerGroupState *osastate;
+ TupleTableSlot *slot;
+ int i;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* If there were no regular rows, the rank is always 1 */
+ if (PG_ARGISNULL(0))
+ {
+ *number_of_rows = 0;
+ return 1;
+ }
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+ *number_of_rows = osastate->number_of_rows;
+
+ /* Adjust nargs to be the number of direct (or aggregated) args */
+ if (nargs % 2 != 0)
+ elog(ERROR, "wrong number of arguments in hypothetical-set function");
+ nargs /= 2;
+
+ hypothetical_check_argtypes(fcinfo, nargs, osastate->qstate->tupdesc);
+
+ /* because we need a hypothetical row, we can't share transition state */
+ Assert(!osastate->sort_done);
+
+ /* insert the hypothetical row into the sort */
+ slot = osastate->qstate->tupslot;
+ ExecClearTuple(slot);
+ for (i = 0; i < nargs; i++)
+ {
+ slot->tts_values[i] = PG_GETARG_DATUM(i + 1);
+ slot->tts_isnull[i] = PG_ARGISNULL(i + 1);
+ }
+ slot->tts_values[i] = Int32GetDatum(flag);
+ slot->tts_isnull[i] = false;
+ ExecStoreVirtualTuple(slot);
+
+ tuplesort_puttupleslot(osastate->sortstate, slot);
+
+ /* finish the sort */
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+
+ /* iterate till we find the hypothetical row */
+ while (tuplesort_gettupleslot(osastate->sortstate, true, true, slot, NULL))
+ {
+ bool isnull;
+ Datum d = slot_getattr(slot, nargs + 1, &isnull);
+
+ if (!isnull && DatumGetInt32(d) != 0)
+ break;
+
+ rank++;
+
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ ExecClearTuple(slot);
+
+ return rank;
+}
+
+
+/*
+ * rank() - rank of hypothetical row
+ */
+Datum
+hypothetical_rank_final(PG_FUNCTION_ARGS)
+{
+ int64 rank;
+ int64 rowcount;
+
+ rank = hypothetical_rank_common(fcinfo, -1, &rowcount);
+
+ PG_RETURN_INT64(rank);
+}
+
+/*
+ * percent_rank() - percentile rank of hypothetical row
+ */
+Datum
+hypothetical_percent_rank_final(PG_FUNCTION_ARGS)
+{
+ int64 rank;
+ int64 rowcount;
+ double result_val;
+
+ rank = hypothetical_rank_common(fcinfo, -1, &rowcount);
+
+ if (rowcount == 0)
+ PG_RETURN_FLOAT8(0);
+
+ result_val = (double) (rank - 1) / (double) (rowcount);
+
+ PG_RETURN_FLOAT8(result_val);
+}
+
+/*
+ * cume_dist() - cumulative distribution of hypothetical row
+ */
+Datum
+hypothetical_cume_dist_final(PG_FUNCTION_ARGS)
+{
+ int64 rank;
+ int64 rowcount;
+ double result_val;
+
+ rank = hypothetical_rank_common(fcinfo, 1, &rowcount);
+
+ result_val = (double) (rank) / (double) (rowcount + 1);
+
+ PG_RETURN_FLOAT8(result_val);
+}
+
+/*
+ * dense_rank() - rank of hypothetical row without gaps in ranking
+ */
+Datum
+hypothetical_dense_rank_final(PG_FUNCTION_ARGS)
+{
+ ExprContext *econtext;
+ ExprState *compareTuple;
+ int nargs = PG_NARGS() - 1;
+ int64 rank = 1;
+ int64 duplicate_count = 0;
+ OSAPerGroupState *osastate;
+ int numDistinctCols;
+ Datum abbrevVal = (Datum) 0;
+ Datum abbrevOld = (Datum) 0;
+ TupleTableSlot *slot;
+ TupleTableSlot *extraslot;
+ TupleTableSlot *slot2;
+ int i;
+
+ Assert(AggCheckCallContext(fcinfo, NULL) == AGG_CONTEXT_AGGREGATE);
+
+ /* If there were no regular rows, the rank is always 1 */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_INT64(rank);
+
+ osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
+ econtext = osastate->qstate->econtext;
+ if (!econtext)
+ {
+ MemoryContext oldcontext;
+
+ /* Make sure to we create econtext under correct parent context. */
+ oldcontext = MemoryContextSwitchTo(osastate->qstate->qcontext);
+ osastate->qstate->econtext = CreateStandaloneExprContext();
+ econtext = osastate->qstate->econtext;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* Adjust nargs to be the number of direct (or aggregated) args */
+ if (nargs % 2 != 0)
+ elog(ERROR, "wrong number of arguments in hypothetical-set function");
+ nargs /= 2;
+
+ hypothetical_check_argtypes(fcinfo, nargs, osastate->qstate->tupdesc);
+
+ /*
+ * When comparing tuples, we can omit the flag column since we will only
+ * compare rows with flag == 0.
+ */
+ numDistinctCols = osastate->qstate->numSortCols - 1;
+
+ /* Build tuple comparator, if we didn't already */
+ compareTuple = osastate->qstate->compareTuple;
+ if (compareTuple == NULL)
+ {
+ AttrNumber *sortColIdx = osastate->qstate->sortColIdx;
+ MemoryContext oldContext;
+
+ oldContext = MemoryContextSwitchTo(osastate->qstate->qcontext);
+ compareTuple = execTuplesMatchPrepare(osastate->qstate->tupdesc,
+ numDistinctCols,
+ sortColIdx,
+ osastate->qstate->eqOperators,
+ osastate->qstate->sortCollations,
+ NULL);
+ MemoryContextSwitchTo(oldContext);
+ osastate->qstate->compareTuple = compareTuple;
+ }
+
+ /* because we need a hypothetical row, we can't share transition state */
+ Assert(!osastate->sort_done);
+
+ /* insert the hypothetical row into the sort */
+ slot = osastate->qstate->tupslot;
+ ExecClearTuple(slot);
+ for (i = 0; i < nargs; i++)
+ {
+ slot->tts_values[i] = PG_GETARG_DATUM(i + 1);
+ slot->tts_isnull[i] = PG_ARGISNULL(i + 1);
+ }
+ slot->tts_values[i] = Int32GetDatum(-1);
+ slot->tts_isnull[i] = false;
+ ExecStoreVirtualTuple(slot);
+
+ tuplesort_puttupleslot(osastate->sortstate, slot);
+
+ /* finish the sort */
+ tuplesort_performsort(osastate->sortstate);
+ osastate->sort_done = true;
+
+ /*
+ * We alternate fetching into tupslot and extraslot so that we have the
+ * previous row available for comparisons. This is accomplished by
+ * swapping the slot pointer variables after each row.
+ */
+ extraslot = MakeSingleTupleTableSlot(osastate->qstate->tupdesc,
+ &TTSOpsMinimalTuple);
+ slot2 = extraslot;
+
+ /* iterate till we find the hypothetical row */
+ while (tuplesort_gettupleslot(osastate->sortstate, true, true, slot,
+ &abbrevVal))
+ {
+ bool isnull;
+ Datum d = slot_getattr(slot, nargs + 1, &isnull);
+ TupleTableSlot *tmpslot;
+
+ if (!isnull && DatumGetInt32(d) != 0)
+ break;
+
+ /* count non-distinct tuples */
+ econtext->ecxt_outertuple = slot;
+ econtext->ecxt_innertuple = slot2;
+
+ if (!TupIsNull(slot2) &&
+ abbrevVal == abbrevOld &&
+ ExecQualAndReset(compareTuple, econtext))
+ duplicate_count++;
+
+ tmpslot = slot2;
+ slot2 = slot;
+ slot = tmpslot;
+ /* avoid ExecQual() calls by reusing abbreviated keys */
+ abbrevOld = abbrevVal;
+
+ rank++;
+
+ CHECK_FOR_INTERRUPTS();
+ }
+
+ ExecClearTuple(slot);
+ ExecClearTuple(slot2);
+
+ ExecDropSingleTupleTableSlot(extraslot);
+
+ rank = rank - duplicate_count;
+
+ PG_RETURN_INT64(rank);
+}
diff --git a/src/backend/utils/adt/partitionfuncs.c b/src/backend/utils/adt/partitionfuncs.c
new file mode 100644
index 0000000..0243bc0
--- /dev/null
+++ b/src/backend/utils/adt/partitionfuncs.c
@@ -0,0 +1,249 @@
+/*-------------------------------------------------------------------------
+ *
+ * partitionfuncs.c
+ * Functions for accessing partition-related metadata
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/partitionfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "catalog/partition.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_inherits.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "utils/fmgrprotos.h"
+#include "utils/lsyscache.h"
+#include "utils/syscache.h"
+
+/*
+ * Checks if a given relation can be part of a partition tree. Returns
+ * false if the relation cannot be processed, in which case it is up to
+ * the caller to decide what to do, by either raising an error or doing
+ * something else.
+ */
+static bool
+check_rel_can_be_partition(Oid relid)
+{
+ char relkind;
+ bool relispartition;
+
+ /* Check if relation exists */
+ if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(relid)))
+ return false;
+
+ relkind = get_rel_relkind(relid);
+ relispartition = get_rel_relispartition(relid);
+
+ /* Only allow relation types that can appear in partition trees. */
+ if (!relispartition && !RELKIND_HAS_PARTITIONS(relkind))
+ return false;
+
+ return true;
+}
+
+/*
+ * pg_partition_tree
+ *
+ * Produce a view with one row per member of a partition tree, beginning
+ * from the top-most parent given by the caller. This gives information
+ * about each partition, its immediate partitioned parent, if it is
+ * a leaf partition and its level in the hierarchy.
+ */
+Datum
+pg_partition_tree(PG_FUNCTION_ARGS)
+{
+#define PG_PARTITION_TREE_COLS 4
+ Oid rootrelid = PG_GETARG_OID(0);
+ FuncCallContext *funcctx;
+ List *partitions;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcxt;
+ TupleDesc tupdesc;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ if (!check_rel_can_be_partition(rootrelid))
+ SRF_RETURN_DONE(funcctx);
+
+ /* switch to memory context appropriate for multiple function calls */
+ oldcxt = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /*
+ * Find all members of inheritance set. We only need AccessShareLock
+ * on the children for the partition information lookup.
+ */
+ partitions = find_all_inheritors(rootrelid, AccessShareLock, NULL);
+
+ tupdesc = CreateTemplateTupleDesc(PG_PARTITION_TREE_COLS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "relid",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "parentid",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "isleaf",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "level",
+ INT4OID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ /* The only state we need is the partition list */
+ funcctx->user_fctx = (void *) partitions;
+
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+ partitions = (List *) funcctx->user_fctx;
+
+ if (funcctx->call_cntr < list_length(partitions))
+ {
+ Datum result;
+ Datum values[PG_PARTITION_TREE_COLS];
+ bool nulls[PG_PARTITION_TREE_COLS];
+ HeapTuple tuple;
+ Oid parentid = InvalidOid;
+ Oid relid = list_nth_oid(partitions, funcctx->call_cntr);
+ char relkind = get_rel_relkind(relid);
+ int level = 0;
+ List *ancestors = get_partition_ancestors(relid);
+ ListCell *lc;
+
+ /*
+ * Form tuple with appropriate data.
+ */
+ MemSet(nulls, 0, sizeof(nulls));
+ MemSet(values, 0, sizeof(values));
+
+ /* relid */
+ values[0] = ObjectIdGetDatum(relid);
+
+ /* parentid */
+ if (ancestors != NIL)
+ parentid = linitial_oid(ancestors);
+ if (OidIsValid(parentid))
+ values[1] = ObjectIdGetDatum(parentid);
+ else
+ nulls[1] = true;
+
+ /* isleaf */
+ values[2] = BoolGetDatum(!RELKIND_HAS_PARTITIONS(relkind));
+
+ /* level */
+ if (relid != rootrelid)
+ {
+ foreach(lc, ancestors)
+ {
+ level++;
+ if (lfirst_oid(lc) == rootrelid)
+ break;
+ }
+ }
+ values[3] = Int32GetDatum(level);
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+
+ /* done when there are no more elements left */
+ SRF_RETURN_DONE(funcctx);
+}
+
+/*
+ * pg_partition_root
+ *
+ * Returns the top-most parent of the partition tree to which a given
+ * relation belongs, or NULL if it's not (or cannot be) part of any
+ * partition tree.
+ */
+Datum
+pg_partition_root(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ Oid rootrelid;
+ List *ancestors;
+
+ if (!check_rel_can_be_partition(relid))
+ PG_RETURN_NULL();
+
+ /* fetch the list of ancestors */
+ ancestors = get_partition_ancestors(relid);
+
+ /*
+ * If the input relation is already the top-most parent, just return
+ * itself.
+ */
+ if (ancestors == NIL)
+ PG_RETURN_OID(relid);
+
+ rootrelid = llast_oid(ancestors);
+ list_free(ancestors);
+
+ /*
+ * "rootrelid" must contain a valid OID, given that the input relation is
+ * a valid partition tree member as checked above.
+ */
+ Assert(OidIsValid(rootrelid));
+ PG_RETURN_OID(rootrelid);
+}
+
+/*
+ * pg_partition_ancestors
+ *
+ * Produces a view with one row per ancestor of the given partition,
+ * including the input relation itself.
+ */
+Datum
+pg_partition_ancestors(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ FuncCallContext *funcctx;
+ List *ancestors;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcxt;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ if (!check_rel_can_be_partition(relid))
+ SRF_RETURN_DONE(funcctx);
+
+ oldcxt = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ ancestors = get_partition_ancestors(relid);
+ ancestors = lcons_oid(relid, ancestors);
+
+ /* The only state we need is the ancestors list */
+ funcctx->user_fctx = (void *) ancestors;
+
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ ancestors = (List *) funcctx->user_fctx;
+
+ if (funcctx->call_cntr < list_length(ancestors))
+ {
+ Oid relid = list_nth_oid(ancestors, funcctx->call_cntr);
+
+ SRF_RETURN_NEXT(funcctx, ObjectIdGetDatum(relid));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
new file mode 100644
index 0000000..3c8fbe6
--- /dev/null
+++ b/src/backend/utils/adt/pg_locale.c
@@ -0,0 +1,2187 @@
+/*-----------------------------------------------------------------------
+ *
+ * PostgreSQL locale utilities
+ *
+ * Portions Copyright (c) 2002-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/adt/pg_locale.c
+ *
+ *-----------------------------------------------------------------------
+ */
+
+/*----------
+ * Here is how the locale stuff is handled: LC_COLLATE and LC_CTYPE
+ * are fixed at CREATE DATABASE time, stored in pg_database, and cannot
+ * be changed. Thus, the effects of strcoll(), strxfrm(), isupper(),
+ * toupper(), etc. are always in the same fixed locale.
+ *
+ * LC_MESSAGES is settable at run time and will take effect
+ * immediately.
+ *
+ * The other categories, LC_MONETARY, LC_NUMERIC, and LC_TIME are also
+ * settable at run-time. However, we don't actually set those locale
+ * categories permanently. This would have bizarre effects like no
+ * longer accepting standard floating-point literals in some locales.
+ * Instead, we only set these locale categories briefly when needed,
+ * cache the required information obtained from localeconv() or
+ * strftime(), and then set the locale categories back to "C".
+ * The cached information is only used by the formatting functions
+ * (to_char, etc.) and the money type. For the user, this should all be
+ * transparent.
+ *
+ * !!! NOW HEAR THIS !!!
+ *
+ * We've been bitten repeatedly by this bug, so let's try to keep it in
+ * mind in future: on some platforms, the locale functions return pointers
+ * to static data that will be overwritten by any later locale function.
+ * Thus, for example, the obvious-looking sequence
+ * save = setlocale(category, NULL);
+ * if (!setlocale(category, value))
+ * fail = true;
+ * setlocale(category, save);
+ * DOES NOT WORK RELIABLY: on some platforms the second setlocale() call
+ * will change the memory save is pointing at. To do this sort of thing
+ * safely, you *must* pstrdup what setlocale returns the first time.
+ *
+ * The POSIX locale standard is available here:
+ *
+ * http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html
+ *----------
+ */
+
+
+#include "postgres.h"
+
+#include <time.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_control.h"
+#include "mb/pg_wchar.h"
+#include "utils/builtins.h"
+#include "utils/formatting.h"
+#include "utils/hsearch.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/pg_locale.h"
+#include "utils/syscache.h"
+
+#ifdef USE_ICU
+#include <unicode/ucnv.h>
+#endif
+
+#ifdef __GLIBC__
+#include <gnu/libc-version.h>
+#endif
+
+#ifdef WIN32
+#include <shlwapi.h>
+#endif
+
+#define MAX_L10N_DATA 80
+
+
+/* GUC settings */
+char *locale_messages;
+char *locale_monetary;
+char *locale_numeric;
+char *locale_time;
+
+/*
+ * lc_time localization cache.
+ *
+ * We use only the first 7 or 12 entries of these arrays. The last array
+ * element is left as NULL for the convenience of outside code that wants
+ * to sequentially scan these arrays.
+ */
+char *localized_abbrev_days[7 + 1];
+char *localized_full_days[7 + 1];
+char *localized_abbrev_months[12 + 1];
+char *localized_full_months[12 + 1];
+
+/* is the databases's LC_CTYPE the C locale? */
+bool database_ctype_is_c = false;
+
+/* indicates whether locale information cache is valid */
+static bool CurrentLocaleConvValid = false;
+static bool CurrentLCTimeValid = false;
+
+/* Cache for collation-related knowledge */
+
+typedef struct
+{
+ Oid collid; /* hash key: pg_collation OID */
+ bool collate_is_c; /* is collation's LC_COLLATE C? */
+ bool ctype_is_c; /* is collation's LC_CTYPE C? */
+ bool flags_valid; /* true if above flags are valid */
+ pg_locale_t locale; /* locale_t struct, or 0 if not valid */
+} collation_cache_entry;
+
+static HTAB *collation_cache = NULL;
+
+
+#if defined(WIN32) && defined(LC_MESSAGES)
+static char *IsoLocaleName(const char *); /* MSVC specific */
+#endif
+
+#ifdef USE_ICU
+static void icu_set_collation_attributes(UCollator *collator, const char *loc);
+#endif
+
+/*
+ * pg_perm_setlocale
+ *
+ * This wraps the libc function setlocale(), with two additions. First, when
+ * changing LC_CTYPE, update gettext's encoding for the current message
+ * domain. GNU gettext automatically tracks LC_CTYPE on most platforms, but
+ * not on Windows. Second, if the operation is successful, the corresponding
+ * LC_XXX environment variable is set to match. By setting the environment
+ * variable, we ensure that any subsequent use of setlocale(..., "") will
+ * preserve the settings made through this routine. Of course, LC_ALL must
+ * also be unset to fully ensure that, but that has to be done elsewhere after
+ * all the individual LC_XXX variables have been set correctly. (Thank you
+ * Perl for making this kluge necessary.)
+ */
+char *
+pg_perm_setlocale(int category, const char *locale)
+{
+ char *result;
+ const char *envvar;
+
+#ifndef WIN32
+ result = setlocale(category, locale);
+#else
+
+ /*
+ * On Windows, setlocale(LC_MESSAGES) does not work, so just assume that
+ * the given value is good and set it in the environment variables. We
+ * must ignore attempts to set to "", which means "keep using the old
+ * environment value".
+ */
+#ifdef LC_MESSAGES
+ if (category == LC_MESSAGES)
+ {
+ result = (char *) locale;
+ if (locale == NULL || locale[0] == '\0')
+ return result;
+ }
+ else
+#endif
+ result = setlocale(category, locale);
+#endif /* WIN32 */
+
+ if (result == NULL)
+ return result; /* fall out immediately on failure */
+
+ /*
+ * Use the right encoding in translated messages. Under ENABLE_NLS, let
+ * pg_bind_textdomain_codeset() figure it out. Under !ENABLE_NLS, message
+ * format strings are ASCII, but database-encoding strings may enter the
+ * message via %s. This makes the overall message encoding equal to the
+ * database encoding.
+ */
+ if (category == LC_CTYPE)
+ {
+ static char save_lc_ctype[LOCALE_NAME_BUFLEN];
+
+ /* copy setlocale() return value before callee invokes it again */
+ strlcpy(save_lc_ctype, result, sizeof(save_lc_ctype));
+ result = save_lc_ctype;
+
+#ifdef ENABLE_NLS
+ SetMessageEncoding(pg_bind_textdomain_codeset(textdomain(NULL)));
+#else
+ SetMessageEncoding(GetDatabaseEncoding());
+#endif
+ }
+
+ switch (category)
+ {
+ case LC_COLLATE:
+ envvar = "LC_COLLATE";
+ break;
+ case LC_CTYPE:
+ envvar = "LC_CTYPE";
+ break;
+#ifdef LC_MESSAGES
+ case LC_MESSAGES:
+ envvar = "LC_MESSAGES";
+#ifdef WIN32
+ result = IsoLocaleName(locale);
+ if (result == NULL)
+ result = (char *) locale;
+ elog(DEBUG3, "IsoLocaleName() executed; locale: \"%s\"", result);
+#endif /* WIN32 */
+ break;
+#endif /* LC_MESSAGES */
+ case LC_MONETARY:
+ envvar = "LC_MONETARY";
+ break;
+ case LC_NUMERIC:
+ envvar = "LC_NUMERIC";
+ break;
+ case LC_TIME:
+ envvar = "LC_TIME";
+ break;
+ default:
+ elog(FATAL, "unrecognized LC category: %d", category);
+ return NULL; /* keep compiler quiet */
+ }
+
+ if (setenv(envvar, result, 1) != 0)
+ return NULL;
+
+ return result;
+}
+
+
+/*
+ * Is the locale name valid for the locale category?
+ *
+ * If successful, and canonname isn't NULL, a palloc'd copy of the locale's
+ * canonical name is stored there. This is especially useful for figuring out
+ * what locale name "" means (ie, the server environment value). (Actually,
+ * it seems that on most implementations that's the only thing it's good for;
+ * we could wish that setlocale gave back a canonically spelled version of
+ * the locale name, but typically it doesn't.)
+ */
+bool
+check_locale(int category, const char *locale, char **canonname)
+{
+ char *save;
+ char *res;
+
+ if (canonname)
+ *canonname = NULL; /* in case of failure */
+
+ save = setlocale(category, NULL);
+ if (!save)
+ return false; /* won't happen, we hope */
+
+ /* save may be pointing at a modifiable scratch variable, see above. */
+ save = pstrdup(save);
+
+ /* set the locale with setlocale, to see if it accepts it. */
+ res = setlocale(category, locale);
+
+ /* save canonical name if requested. */
+ if (res && canonname)
+ *canonname = pstrdup(res);
+
+ /* restore old value. */
+ if (!setlocale(category, save))
+ elog(WARNING, "failed to restore old locale \"%s\"", save);
+ pfree(save);
+
+ return (res != NULL);
+}
+
+
+/*
+ * GUC check/assign hooks
+ *
+ * For most locale categories, the assign hook doesn't actually set the locale
+ * permanently, just reset flags so that the next use will cache the
+ * appropriate values. (See explanation at the top of this file.)
+ *
+ * Note: we accept value = "" as selecting the postmaster's environment
+ * value, whatever it was (so long as the environment setting is legal).
+ * This will have been locked down by an earlier call to pg_perm_setlocale.
+ */
+bool
+check_locale_monetary(char **newval, void **extra, GucSource source)
+{
+ return check_locale(LC_MONETARY, *newval, NULL);
+}
+
+void
+assign_locale_monetary(const char *newval, void *extra)
+{
+ CurrentLocaleConvValid = false;
+}
+
+bool
+check_locale_numeric(char **newval, void **extra, GucSource source)
+{
+ return check_locale(LC_NUMERIC, *newval, NULL);
+}
+
+void
+assign_locale_numeric(const char *newval, void *extra)
+{
+ CurrentLocaleConvValid = false;
+}
+
+bool
+check_locale_time(char **newval, void **extra, GucSource source)
+{
+ return check_locale(LC_TIME, *newval, NULL);
+}
+
+void
+assign_locale_time(const char *newval, void *extra)
+{
+ CurrentLCTimeValid = false;
+}
+
+/*
+ * We allow LC_MESSAGES to actually be set globally.
+ *
+ * Note: we normally disallow value = "" because it wouldn't have consistent
+ * semantics (it'd effectively just use the previous value). However, this
+ * is the value passed for PGC_S_DEFAULT, so don't complain in that case,
+ * not even if the attempted setting fails due to invalid environment value.
+ * The idea there is just to accept the environment setting *if possible*
+ * during startup, until we can read the proper value from postgresql.conf.
+ */
+bool
+check_locale_messages(char **newval, void **extra, GucSource source)
+{
+ if (**newval == '\0')
+ {
+ if (source == PGC_S_DEFAULT)
+ return true;
+ else
+ return false;
+ }
+
+ /*
+ * LC_MESSAGES category does not exist everywhere, but accept it anyway
+ *
+ * On Windows, we can't even check the value, so accept blindly
+ */
+#if defined(LC_MESSAGES) && !defined(WIN32)
+ return check_locale(LC_MESSAGES, *newval, NULL);
+#else
+ return true;
+#endif
+}
+
+void
+assign_locale_messages(const char *newval, void *extra)
+{
+ /*
+ * LC_MESSAGES category does not exist everywhere, but accept it anyway.
+ * We ignore failure, as per comment above.
+ */
+#ifdef LC_MESSAGES
+ (void) pg_perm_setlocale(LC_MESSAGES, newval);
+#endif
+}
+
+
+/*
+ * Frees the malloced content of a struct lconv. (But not the struct
+ * itself.) It's important that this not throw elog(ERROR).
+ */
+static void
+free_struct_lconv(struct lconv *s)
+{
+ if (s->decimal_point)
+ free(s->decimal_point);
+ if (s->thousands_sep)
+ free(s->thousands_sep);
+ if (s->grouping)
+ free(s->grouping);
+ if (s->int_curr_symbol)
+ free(s->int_curr_symbol);
+ if (s->currency_symbol)
+ free(s->currency_symbol);
+ if (s->mon_decimal_point)
+ free(s->mon_decimal_point);
+ if (s->mon_thousands_sep)
+ free(s->mon_thousands_sep);
+ if (s->mon_grouping)
+ free(s->mon_grouping);
+ if (s->positive_sign)
+ free(s->positive_sign);
+ if (s->negative_sign)
+ free(s->negative_sign);
+}
+
+/*
+ * Check that all fields of a struct lconv (or at least, the ones we care
+ * about) are non-NULL. The field list must match free_struct_lconv().
+ */
+static bool
+struct_lconv_is_valid(struct lconv *s)
+{
+ if (s->decimal_point == NULL)
+ return false;
+ if (s->thousands_sep == NULL)
+ return false;
+ if (s->grouping == NULL)
+ return false;
+ if (s->int_curr_symbol == NULL)
+ return false;
+ if (s->currency_symbol == NULL)
+ return false;
+ if (s->mon_decimal_point == NULL)
+ return false;
+ if (s->mon_thousands_sep == NULL)
+ return false;
+ if (s->mon_grouping == NULL)
+ return false;
+ if (s->positive_sign == NULL)
+ return false;
+ if (s->negative_sign == NULL)
+ return false;
+ return true;
+}
+
+
+/*
+ * Convert the strdup'd string at *str from the specified encoding to the
+ * database encoding.
+ */
+static void
+db_encoding_convert(int encoding, char **str)
+{
+ char *pstr;
+ char *mstr;
+
+ /* convert the string to the database encoding */
+ pstr = pg_any_to_server(*str, strlen(*str), encoding);
+ if (pstr == *str)
+ return; /* no conversion happened */
+
+ /* need it malloc'd not palloc'd */
+ mstr = strdup(pstr);
+ if (mstr == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ /* replace old string */
+ free(*str);
+ *str = mstr;
+
+ pfree(pstr);
+}
+
+
+/*
+ * Return the POSIX lconv struct (contains number/money formatting
+ * information) with locale information for all categories.
+ */
+struct lconv *
+PGLC_localeconv(void)
+{
+ static struct lconv CurrentLocaleConv;
+ static bool CurrentLocaleConvAllocated = false;
+ struct lconv *extlconv;
+ struct lconv worklconv;
+ char *save_lc_monetary;
+ char *save_lc_numeric;
+#ifdef WIN32
+ char *save_lc_ctype;
+#endif
+
+ /* Did we do it already? */
+ if (CurrentLocaleConvValid)
+ return &CurrentLocaleConv;
+
+ /* Free any already-allocated storage */
+ if (CurrentLocaleConvAllocated)
+ {
+ free_struct_lconv(&CurrentLocaleConv);
+ CurrentLocaleConvAllocated = false;
+ }
+
+ /*
+ * This is tricky because we really don't want to risk throwing error
+ * while the locale is set to other than our usual settings. Therefore,
+ * the process is: collect the usual settings, set locale to special
+ * setting, copy relevant data into worklconv using strdup(), restore
+ * normal settings, convert data to desired encoding, and finally stash
+ * the collected data in CurrentLocaleConv. This makes it safe if we
+ * throw an error during encoding conversion or run out of memory anywhere
+ * in the process. All data pointed to by struct lconv members is
+ * allocated with strdup, to avoid premature elog(ERROR) and to allow
+ * using a single cleanup routine.
+ */
+ memset(&worklconv, 0, sizeof(worklconv));
+
+ /* Save prevailing values of monetary and numeric locales */
+ save_lc_monetary = setlocale(LC_MONETARY, NULL);
+ if (!save_lc_monetary)
+ elog(ERROR, "setlocale(NULL) failed");
+ save_lc_monetary = pstrdup(save_lc_monetary);
+
+ save_lc_numeric = setlocale(LC_NUMERIC, NULL);
+ if (!save_lc_numeric)
+ elog(ERROR, "setlocale(NULL) failed");
+ save_lc_numeric = pstrdup(save_lc_numeric);
+
+#ifdef WIN32
+
+ /*
+ * The POSIX standard explicitly says that it is undefined what happens if
+ * LC_MONETARY or LC_NUMERIC imply an encoding (codeset) different from
+ * that implied by LC_CTYPE. In practice, all Unix-ish platforms seem to
+ * believe that localeconv() should return strings that are encoded in the
+ * codeset implied by the LC_MONETARY or LC_NUMERIC locale name. Hence,
+ * once we have successfully collected the localeconv() results, we will
+ * convert them from that codeset to the desired server encoding.
+ *
+ * Windows, of course, resolutely does things its own way; on that
+ * platform LC_CTYPE has to match LC_MONETARY/LC_NUMERIC to get sane
+ * results. Hence, we must temporarily set that category as well.
+ */
+
+ /* Save prevailing value of ctype locale */
+ save_lc_ctype = setlocale(LC_CTYPE, NULL);
+ if (!save_lc_ctype)
+ elog(ERROR, "setlocale(NULL) failed");
+ save_lc_ctype = pstrdup(save_lc_ctype);
+
+ /* Here begins the critical section where we must not throw error */
+
+ /* use numeric to set the ctype */
+ setlocale(LC_CTYPE, locale_numeric);
+#endif
+
+ /* Get formatting information for numeric */
+ setlocale(LC_NUMERIC, locale_numeric);
+ extlconv = localeconv();
+
+ /* Must copy data now in case setlocale() overwrites it */
+ worklconv.decimal_point = strdup(extlconv->decimal_point);
+ worklconv.thousands_sep = strdup(extlconv->thousands_sep);
+ worklconv.grouping = strdup(extlconv->grouping);
+
+#ifdef WIN32
+ /* use monetary to set the ctype */
+ setlocale(LC_CTYPE, locale_monetary);
+#endif
+
+ /* Get formatting information for monetary */
+ setlocale(LC_MONETARY, locale_monetary);
+ extlconv = localeconv();
+
+ /* Must copy data now in case setlocale() overwrites it */
+ worklconv.int_curr_symbol = strdup(extlconv->int_curr_symbol);
+ worklconv.currency_symbol = strdup(extlconv->currency_symbol);
+ worklconv.mon_decimal_point = strdup(extlconv->mon_decimal_point);
+ worklconv.mon_thousands_sep = strdup(extlconv->mon_thousands_sep);
+ worklconv.mon_grouping = strdup(extlconv->mon_grouping);
+ worklconv.positive_sign = strdup(extlconv->positive_sign);
+ worklconv.negative_sign = strdup(extlconv->negative_sign);
+ /* Copy scalar fields as well */
+ worklconv.int_frac_digits = extlconv->int_frac_digits;
+ worklconv.frac_digits = extlconv->frac_digits;
+ worklconv.p_cs_precedes = extlconv->p_cs_precedes;
+ worklconv.p_sep_by_space = extlconv->p_sep_by_space;
+ worklconv.n_cs_precedes = extlconv->n_cs_precedes;
+ worklconv.n_sep_by_space = extlconv->n_sep_by_space;
+ worklconv.p_sign_posn = extlconv->p_sign_posn;
+ worklconv.n_sign_posn = extlconv->n_sign_posn;
+
+ /*
+ * Restore the prevailing locale settings; failure to do so is fatal.
+ * Possibly we could limp along with nondefault LC_MONETARY or LC_NUMERIC,
+ * but proceeding with the wrong value of LC_CTYPE would certainly be bad
+ * news; and considering that the prevailing LC_MONETARY and LC_NUMERIC
+ * are almost certainly "C", there's really no reason that restoring those
+ * should fail.
+ */
+#ifdef WIN32
+ if (!setlocale(LC_CTYPE, save_lc_ctype))
+ elog(FATAL, "failed to restore LC_CTYPE to \"%s\"", save_lc_ctype);
+#endif
+ if (!setlocale(LC_MONETARY, save_lc_monetary))
+ elog(FATAL, "failed to restore LC_MONETARY to \"%s\"", save_lc_monetary);
+ if (!setlocale(LC_NUMERIC, save_lc_numeric))
+ elog(FATAL, "failed to restore LC_NUMERIC to \"%s\"", save_lc_numeric);
+
+ /*
+ * At this point we've done our best to clean up, and can call functions
+ * that might possibly throw errors with a clean conscience. But let's
+ * make sure we don't leak any already-strdup'd fields in worklconv.
+ */
+ PG_TRY();
+ {
+ int encoding;
+
+ /* Release the pstrdup'd locale names */
+ pfree(save_lc_monetary);
+ pfree(save_lc_numeric);
+#ifdef WIN32
+ pfree(save_lc_ctype);
+#endif
+
+ /* If any of the preceding strdup calls failed, complain now. */
+ if (!struct_lconv_is_valid(&worklconv))
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ /*
+ * Now we must perform encoding conversion from whatever's associated
+ * with the locales into the database encoding. If we can't identify
+ * the encoding implied by LC_NUMERIC or LC_MONETARY (ie we get -1),
+ * use PG_SQL_ASCII, which will result in just validating that the
+ * strings are OK in the database encoding.
+ */
+ encoding = pg_get_encoding_from_locale(locale_numeric, true);
+ if (encoding < 0)
+ encoding = PG_SQL_ASCII;
+
+ db_encoding_convert(encoding, &worklconv.decimal_point);
+ db_encoding_convert(encoding, &worklconv.thousands_sep);
+ /* grouping is not text and does not require conversion */
+
+ encoding = pg_get_encoding_from_locale(locale_monetary, true);
+ if (encoding < 0)
+ encoding = PG_SQL_ASCII;
+
+ db_encoding_convert(encoding, &worklconv.int_curr_symbol);
+ db_encoding_convert(encoding, &worklconv.currency_symbol);
+ db_encoding_convert(encoding, &worklconv.mon_decimal_point);
+ db_encoding_convert(encoding, &worklconv.mon_thousands_sep);
+ /* mon_grouping is not text and does not require conversion */
+ db_encoding_convert(encoding, &worklconv.positive_sign);
+ db_encoding_convert(encoding, &worklconv.negative_sign);
+ }
+ PG_CATCH();
+ {
+ free_struct_lconv(&worklconv);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ /*
+ * Everything is good, so save the results.
+ */
+ CurrentLocaleConv = worklconv;
+ CurrentLocaleConvAllocated = true;
+ CurrentLocaleConvValid = true;
+ return &CurrentLocaleConv;
+}
+
+#ifdef WIN32
+/*
+ * On Windows, strftime() returns its output in encoding CP_ACP (the default
+ * operating system codepage for the computer), which is likely different
+ * from SERVER_ENCODING. This is especially important in Japanese versions
+ * of Windows which will use SJIS encoding, which we don't support as a
+ * server encoding.
+ *
+ * So, instead of using strftime(), use wcsftime() to return the value in
+ * wide characters (internally UTF16) and then convert to UTF8, which we
+ * know how to handle directly.
+ *
+ * Note that this only affects the calls to strftime() in this file, which are
+ * used to get the locale-aware strings. Other parts of the backend use
+ * pg_strftime(), which isn't locale-aware and does not need to be replaced.
+ */
+static size_t
+strftime_win32(char *dst, size_t dstlen,
+ const char *format, const struct tm *tm)
+{
+ size_t len;
+ wchar_t wformat[8]; /* formats used below need 3 chars */
+ wchar_t wbuf[MAX_L10N_DATA];
+
+ /*
+ * Get a wchar_t version of the format string. We only actually use
+ * plain-ASCII formats in this file, so we can say that they're UTF8.
+ */
+ len = MultiByteToWideChar(CP_UTF8, 0, format, -1,
+ wformat, lengthof(wformat));
+ if (len == 0)
+ elog(ERROR, "could not convert format string from UTF-8: error code %lu",
+ GetLastError());
+
+ len = wcsftime(wbuf, MAX_L10N_DATA, wformat, tm);
+ if (len == 0)
+ {
+ /*
+ * wcsftime failed, possibly because the result would not fit in
+ * MAX_L10N_DATA. Return 0 with the contents of dst unspecified.
+ */
+ return 0;
+ }
+
+ len = WideCharToMultiByte(CP_UTF8, 0, wbuf, len, dst, dstlen - 1,
+ NULL, NULL);
+ if (len == 0)
+ elog(ERROR, "could not convert string to UTF-8: error code %lu",
+ GetLastError());
+
+ dst[len] = '\0';
+
+ return len;
+}
+
+/* redefine strftime() */
+#define strftime(a,b,c,d) strftime_win32(a,b,c,d)
+#endif /* WIN32 */
+
+/*
+ * Subroutine for cache_locale_time().
+ * Convert the given string from encoding "encoding" to the database
+ * encoding, and store the result at *dst, replacing any previous value.
+ */
+static void
+cache_single_string(char **dst, const char *src, int encoding)
+{
+ char *ptr;
+ char *olddst;
+
+ /* Convert the string to the database encoding, or validate it's OK */
+ ptr = pg_any_to_server(src, strlen(src), encoding);
+
+ /* Store the string in long-lived storage, replacing any previous value */
+ olddst = *dst;
+ *dst = MemoryContextStrdup(TopMemoryContext, ptr);
+ if (olddst)
+ pfree(olddst);
+
+ /* Might as well clean up any palloc'd conversion result, too */
+ if (ptr != src)
+ pfree(ptr);
+}
+
+/*
+ * Update the lc_time localization cache variables if needed.
+ */
+void
+cache_locale_time(void)
+{
+ char buf[(2 * 7 + 2 * 12) * MAX_L10N_DATA];
+ char *bufptr;
+ time_t timenow;
+ struct tm *timeinfo;
+ bool strftimefail = false;
+ int encoding;
+ int i;
+ char *save_lc_time;
+#ifdef WIN32
+ char *save_lc_ctype;
+#endif
+
+ /* did we do this already? */
+ if (CurrentLCTimeValid)
+ return;
+
+ elog(DEBUG3, "cache_locale_time() executed; locale: \"%s\"", locale_time);
+
+ /*
+ * As in PGLC_localeconv(), it's critical that we not throw error while
+ * libc's locale settings have nondefault values. Hence, we just call
+ * strftime() within the critical section, and then convert and save its
+ * results afterwards.
+ */
+
+ /* Save prevailing value of time locale */
+ save_lc_time = setlocale(LC_TIME, NULL);
+ if (!save_lc_time)
+ elog(ERROR, "setlocale(NULL) failed");
+ save_lc_time = pstrdup(save_lc_time);
+
+#ifdef WIN32
+
+ /*
+ * On Windows, it appears that wcsftime() internally uses LC_CTYPE, so we
+ * must set it here. This code looks the same as what PGLC_localeconv()
+ * does, but the underlying reason is different: this does NOT determine
+ * the encoding we'll get back from strftime_win32().
+ */
+
+ /* Save prevailing value of ctype locale */
+ save_lc_ctype = setlocale(LC_CTYPE, NULL);
+ if (!save_lc_ctype)
+ elog(ERROR, "setlocale(NULL) failed");
+ save_lc_ctype = pstrdup(save_lc_ctype);
+
+ /* use lc_time to set the ctype */
+ setlocale(LC_CTYPE, locale_time);
+#endif
+
+ setlocale(LC_TIME, locale_time);
+
+ /* We use times close to current time as data for strftime(). */
+ timenow = time(NULL);
+ timeinfo = localtime(&timenow);
+
+ /* Store the strftime results in MAX_L10N_DATA-sized portions of buf[] */
+ bufptr = buf;
+
+ /*
+ * MAX_L10N_DATA is sufficient buffer space for every known locale, and
+ * POSIX defines no strftime() errors. (Buffer space exhaustion is not an
+ * error.) An implementation might report errors (e.g. ENOMEM) by
+ * returning 0 (or, less plausibly, a negative value) and setting errno.
+ * Report errno just in case the implementation did that, but clear it in
+ * advance of the calls so we don't emit a stale, unrelated errno.
+ */
+ errno = 0;
+
+ /* localized days */
+ for (i = 0; i < 7; i++)
+ {
+ timeinfo->tm_wday = i;
+ if (strftime(bufptr, MAX_L10N_DATA, "%a", timeinfo) <= 0)
+ strftimefail = true;
+ bufptr += MAX_L10N_DATA;
+ if (strftime(bufptr, MAX_L10N_DATA, "%A", timeinfo) <= 0)
+ strftimefail = true;
+ bufptr += MAX_L10N_DATA;
+ }
+
+ /* localized months */
+ for (i = 0; i < 12; i++)
+ {
+ timeinfo->tm_mon = i;
+ timeinfo->tm_mday = 1; /* make sure we don't have invalid date */
+ if (strftime(bufptr, MAX_L10N_DATA, "%b", timeinfo) <= 0)
+ strftimefail = true;
+ bufptr += MAX_L10N_DATA;
+ if (strftime(bufptr, MAX_L10N_DATA, "%B", timeinfo) <= 0)
+ strftimefail = true;
+ bufptr += MAX_L10N_DATA;
+ }
+
+ /*
+ * Restore the prevailing locale settings; as in PGLC_localeconv(),
+ * failure to do so is fatal.
+ */
+#ifdef WIN32
+ if (!setlocale(LC_CTYPE, save_lc_ctype))
+ elog(FATAL, "failed to restore LC_CTYPE to \"%s\"", save_lc_ctype);
+#endif
+ if (!setlocale(LC_TIME, save_lc_time))
+ elog(FATAL, "failed to restore LC_TIME to \"%s\"", save_lc_time);
+
+ /*
+ * At this point we've done our best to clean up, and can throw errors, or
+ * call functions that might throw errors, with a clean conscience.
+ */
+ if (strftimefail)
+ elog(ERROR, "strftime() failed: %m");
+
+ /* Release the pstrdup'd locale names */
+ pfree(save_lc_time);
+#ifdef WIN32
+ pfree(save_lc_ctype);
+#endif
+
+#ifndef WIN32
+
+ /*
+ * As in PGLC_localeconv(), we must convert strftime()'s output from the
+ * encoding implied by LC_TIME to the database encoding. If we can't
+ * identify the LC_TIME encoding, just perform encoding validation.
+ */
+ encoding = pg_get_encoding_from_locale(locale_time, true);
+ if (encoding < 0)
+ encoding = PG_SQL_ASCII;
+
+#else
+
+ /*
+ * On Windows, strftime_win32() always returns UTF8 data, so convert from
+ * that if necessary.
+ */
+ encoding = PG_UTF8;
+
+#endif /* WIN32 */
+
+ bufptr = buf;
+
+ /* localized days */
+ for (i = 0; i < 7; i++)
+ {
+ cache_single_string(&localized_abbrev_days[i], bufptr, encoding);
+ bufptr += MAX_L10N_DATA;
+ cache_single_string(&localized_full_days[i], bufptr, encoding);
+ bufptr += MAX_L10N_DATA;
+ }
+ localized_abbrev_days[7] = NULL;
+ localized_full_days[7] = NULL;
+
+ /* localized months */
+ for (i = 0; i < 12; i++)
+ {
+ cache_single_string(&localized_abbrev_months[i], bufptr, encoding);
+ bufptr += MAX_L10N_DATA;
+ cache_single_string(&localized_full_months[i], bufptr, encoding);
+ bufptr += MAX_L10N_DATA;
+ }
+ localized_abbrev_months[12] = NULL;
+ localized_full_months[12] = NULL;
+
+ CurrentLCTimeValid = true;
+}
+
+
+#if defined(WIN32) && defined(LC_MESSAGES)
+/*
+ * Convert a Windows setlocale() argument to a Unix-style one.
+ *
+ * Regardless of platform, we install message catalogs under a Unix-style
+ * LL[_CC][.ENCODING][@VARIANT] naming convention. Only LC_MESSAGES settings
+ * following that style will elicit localized interface strings.
+ *
+ * Before Visual Studio 2012 (msvcr110.dll), Windows setlocale() accepted "C"
+ * (but not "c") and strings of the form <Language>[_<Country>][.<CodePage>],
+ * case-insensitive. setlocale() returns the fully-qualified form; for
+ * example, setlocale("thaI") returns "Thai_Thailand.874". Internally,
+ * setlocale() and _create_locale() select a "locale identifier"[1] and store
+ * it in an undocumented _locale_t field. From that LCID, we can retrieve the
+ * ISO 639 language and the ISO 3166 country. Character encoding does not
+ * matter, because the server and client encodings govern that.
+ *
+ * Windows Vista introduced the "locale name" concept[2], closely following
+ * RFC 4646. Locale identifiers are now deprecated. Starting with Visual
+ * Studio 2012, setlocale() accepts locale names in addition to the strings it
+ * accepted historically. It does not standardize them; setlocale("Th-tH")
+ * returns "Th-tH". setlocale(category, "") still returns a traditional
+ * string. Furthermore, msvcr110.dll changed the undocumented _locale_t
+ * content to carry locale names instead of locale identifiers.
+ *
+ * Visual Studio 2015 should still be able to do the same as Visual Studio
+ * 2012, but the declaration of locale_name is missing in _locale_t, causing
+ * this code compilation to fail, hence this falls back instead on to
+ * enumerating all system locales by using EnumSystemLocalesEx to find the
+ * required locale name. If the input argument is in Unix-style then we can
+ * get ISO Locale name directly by using GetLocaleInfoEx() with LCType as
+ * LOCALE_SNAME.
+ *
+ * MinGW headers declare _create_locale(), but msvcrt.dll lacks that symbol in
+ * releases before Windows 8. IsoLocaleName() always fails in a MinGW-built
+ * postgres.exe, so only Unix-style values of the lc_messages GUC can elicit
+ * localized messages. In particular, every lc_messages setting that initdb
+ * can select automatically will yield only C-locale messages. XXX This could
+ * be fixed by running the fully-qualified locale name through a lookup table.
+ *
+ * This function returns a pointer to a static buffer bearing the converted
+ * name or NULL if conversion fails.
+ *
+ * [1] https://docs.microsoft.com/en-us/windows/win32/intl/locale-identifiers
+ * [2] https://docs.microsoft.com/en-us/windows/win32/intl/locale-names
+ */
+
+#if _MSC_VER >= 1900
+/*
+ * Callback function for EnumSystemLocalesEx() in get_iso_localename().
+ *
+ * This function enumerates all system locales, searching for one that matches
+ * an input with the format: <Language>[_<Country>], e.g.
+ * English[_United States]
+ *
+ * The input is a three wchar_t array as an LPARAM. The first element is the
+ * locale_name we want to match, the second element is an allocated buffer
+ * where the Unix-style locale is copied if a match is found, and the third
+ * element is the search status, 1 if a match was found, 0 otherwise.
+ */
+static BOOL CALLBACK
+search_locale_enum(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
+{
+ wchar_t test_locale[LOCALE_NAME_MAX_LENGTH];
+ wchar_t **argv;
+
+ (void) (dwFlags);
+
+ argv = (wchar_t **) lparam;
+ *argv[2] = (wchar_t) 0;
+
+ memset(test_locale, 0, sizeof(test_locale));
+
+ /* Get the name of the <Language> in English */
+ if (GetLocaleInfoEx(pStr, LOCALE_SENGLISHLANGUAGENAME,
+ test_locale, LOCALE_NAME_MAX_LENGTH))
+ {
+ /*
+ * If the enumerated locale does not have a hyphen ("en") OR the
+ * lc_message input does not have an underscore ("English"), we only
+ * need to compare the <Language> tags.
+ */
+ if (wcsrchr(pStr, '-') == NULL || wcsrchr(argv[0], '_') == NULL)
+ {
+ if (_wcsicmp(argv[0], test_locale) == 0)
+ {
+ wcscpy(argv[1], pStr);
+ *argv[2] = (wchar_t) 1;
+ return FALSE;
+ }
+ }
+
+ /*
+ * We have to compare a full <Language>_<Country> tag, so we append
+ * the underscore and name of the country/region in English, e.g.
+ * "English_United States".
+ */
+ else
+ {
+ size_t len;
+
+ wcscat(test_locale, L"_");
+ len = wcslen(test_locale);
+ if (GetLocaleInfoEx(pStr, LOCALE_SENGLISHCOUNTRYNAME,
+ test_locale + len,
+ LOCALE_NAME_MAX_LENGTH - len))
+ {
+ if (_wcsicmp(argv[0], test_locale) == 0)
+ {
+ wcscpy(argv[1], pStr);
+ *argv[2] = (wchar_t) 1;
+ return FALSE;
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/*
+ * This function converts a Windows locale name to an ISO formatted version
+ * for Visual Studio 2015 or greater.
+ *
+ * Returns NULL, if no valid conversion was found.
+ */
+static char *
+get_iso_localename(const char *winlocname)
+{
+ wchar_t wc_locale_name[LOCALE_NAME_MAX_LENGTH];
+ wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
+ static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
+ char *period;
+ int len;
+ int ret_val;
+
+ /*
+ * Valid locales have the following syntax:
+ * <Language>[_<Country>[.<CodePage>]]
+ *
+ * GetLocaleInfoEx can only take locale name without code-page and for the
+ * purpose of this API the code-page doesn't matter.
+ */
+ period = strchr(winlocname, '.');
+ if (period != NULL)
+ len = period - winlocname;
+ else
+ len = pg_mbstrlen(winlocname);
+
+ memset(wc_locale_name, 0, sizeof(wc_locale_name));
+ memset(buffer, 0, sizeof(buffer));
+ MultiByteToWideChar(CP_ACP, 0, winlocname, len, wc_locale_name,
+ LOCALE_NAME_MAX_LENGTH);
+
+ /*
+ * If the lc_messages is already a Unix-style string, we have a direct
+ * match with LOCALE_SNAME, e.g. en-US, en_US.
+ */
+ ret_val = GetLocaleInfoEx(wc_locale_name, LOCALE_SNAME, (LPWSTR) &buffer,
+ LOCALE_NAME_MAX_LENGTH);
+ if (!ret_val)
+ {
+ /*
+ * Search for a locale in the system that matches language and country
+ * name.
+ */
+ wchar_t *argv[3];
+
+ argv[0] = wc_locale_name;
+ argv[1] = buffer;
+ argv[2] = (wchar_t *) &ret_val;
+ EnumSystemLocalesEx(search_locale_enum, LOCALE_WINDOWS, (LPARAM) argv,
+ NULL);
+ }
+
+ if (ret_val)
+ {
+ size_t rc;
+ char *hyphen;
+
+ /* Locale names use only ASCII, any conversion locale suffices. */
+ rc = wchar2char(iso_lc_messages, buffer, sizeof(iso_lc_messages), NULL);
+ if (rc == -1 || rc == sizeof(iso_lc_messages))
+ return NULL;
+
+ /*
+ * Simply replace the hyphen with an underscore. See comments in
+ * IsoLocaleName.
+ */
+ hyphen = strchr(iso_lc_messages, '-');
+ if (hyphen)
+ *hyphen = '_';
+ return iso_lc_messages;
+ }
+
+ return NULL;
+}
+#endif /* _MSC_VER >= 1900 */
+
+static char *
+IsoLocaleName(const char *winlocname)
+{
+#if defined(_MSC_VER)
+ static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
+
+ if (pg_strcasecmp("c", winlocname) == 0 ||
+ pg_strcasecmp("posix", winlocname) == 0)
+ {
+ strcpy(iso_lc_messages, "C");
+ return iso_lc_messages;
+ }
+ else
+ {
+#if (_MSC_VER >= 1900) /* Visual Studio 2015 or later */
+ return get_iso_localename(winlocname);
+#else
+ _locale_t loct;
+
+ loct = _create_locale(LC_CTYPE, winlocname);
+ if (loct != NULL)
+ {
+ size_t rc;
+ char *hyphen;
+
+ /* Locale names use only ASCII, any conversion locale suffices. */
+ rc = wchar2char(iso_lc_messages, loct->locinfo->locale_name[LC_CTYPE],
+ sizeof(iso_lc_messages), NULL);
+ _free_locale(loct);
+ if (rc == -1 || rc == sizeof(iso_lc_messages))
+ return NULL;
+
+ /*
+ * Since the message catalogs sit on a case-insensitive
+ * filesystem, we need not standardize letter case here. So long
+ * as we do not ship message catalogs for which it would matter,
+ * we also need not translate the script/variant portion, e.g.
+ * uz-Cyrl-UZ to uz_UZ@cyrillic. Simply replace the hyphen with
+ * an underscore.
+ *
+ * Note that the locale name can be less-specific than the value
+ * we would derive under earlier Visual Studio releases. For
+ * example, French_France.1252 yields just "fr". This does not
+ * affect any of the country-specific message catalogs available
+ * as of this writing (pt_BR, zh_CN, zh_TW).
+ */
+ hyphen = strchr(iso_lc_messages, '-');
+ if (hyphen)
+ *hyphen = '_';
+ return iso_lc_messages;
+ }
+#endif /* Visual Studio 2015 or later */
+ }
+#endif /* defined(_MSC_VER) */
+ return NULL; /* Not supported on this version of msvc/mingw */
+}
+#endif /* WIN32 && LC_MESSAGES */
+
+
+/*
+ * Detect aging strxfrm() implementations that, in a subset of locales, write
+ * past the specified buffer length. Affected users must update OS packages
+ * before using PostgreSQL 9.5 or later.
+ *
+ * Assume that the bug can come and go from one postmaster startup to another
+ * due to physical replication among diverse machines. Assume that the bug's
+ * presence will not change during the life of a particular postmaster. Given
+ * those assumptions, call this no less than once per postmaster startup per
+ * LC_COLLATE setting used. No known-affected system offers strxfrm_l(), so
+ * there is no need to consider pg_collation locales.
+ */
+void
+check_strxfrm_bug(void)
+{
+ char buf[32];
+ const int canary = 0x7F;
+ bool ok = true;
+
+ /*
+ * Given a two-byte ASCII string and length limit 7, 8 or 9, Solaris 10
+ * 05/08 returns 18 and modifies 10 bytes. It respects limits above or
+ * below that range.
+ *
+ * The bug is present in Solaris 8 as well; it is absent in Solaris 10
+ * 01/13 and Solaris 11.2. Affected locales include is_IS.ISO8859-1,
+ * en_US.UTF-8, en_US.ISO8859-1, and ru_RU.KOI8-R. Unaffected locales
+ * include de_DE.UTF-8, de_DE.ISO8859-1, zh_TW.UTF-8, and C.
+ */
+ buf[7] = canary;
+ (void) strxfrm(buf, "ab", 7);
+ if (buf[7] != canary)
+ ok = false;
+
+ /*
+ * illumos bug #1594 was present in the source tree from 2010-10-11 to
+ * 2012-02-01. Given an ASCII string of any length and length limit 1,
+ * affected systems ignore the length limit and modify a number of bytes
+ * one less than the return value. The problem inputs for this bug do not
+ * overlap those for the Solaris bug, hence a distinct test.
+ *
+ * Affected systems include smartos-20110926T021612Z. Affected locales
+ * include en_US.ISO8859-1 and en_US.UTF-8. Unaffected locales include C.
+ */
+ buf[1] = canary;
+ (void) strxfrm(buf, "a", 1);
+ if (buf[1] != canary)
+ ok = false;
+
+ if (!ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYSTEM_ERROR),
+ errmsg_internal("strxfrm(), in locale \"%s\", writes past the specified array length",
+ setlocale(LC_COLLATE, NULL)),
+ errhint("Apply system library package updates.")));
+}
+
+
+/*
+ * Cache mechanism for collation information.
+ *
+ * We cache two flags: whether the collation's LC_COLLATE or LC_CTYPE is C
+ * (or POSIX), so we can optimize a few code paths in various places.
+ * For the built-in C and POSIX collations, we can know that without even
+ * doing a cache lookup, but we want to support aliases for C/POSIX too.
+ * For the "default" collation, there are separate static cache variables,
+ * since consulting the pg_collation catalog doesn't tell us what we need.
+ *
+ * Also, if a pg_locale_t has been requested for a collation, we cache that
+ * for the life of a backend.
+ *
+ * Note that some code relies on the flags not reporting false negatives
+ * (that is, saying it's not C when it is). For example, char2wchar()
+ * could fail if the locale is C, so str_tolower() shouldn't call it
+ * in that case.
+ *
+ * Note that we currently lack any way to flush the cache. Since we don't
+ * support ALTER COLLATION, this is OK. The worst case is that someone
+ * drops a collation, and a useless cache entry hangs around in existing
+ * backends.
+ */
+
+static collation_cache_entry *
+lookup_collation_cache(Oid collation, bool set_flags)
+{
+ collation_cache_entry *cache_entry;
+ bool found;
+
+ Assert(OidIsValid(collation));
+ Assert(collation != DEFAULT_COLLATION_OID);
+
+ if (collation_cache == NULL)
+ {
+ /* First time through, initialize the hash table */
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(collation_cache_entry);
+ collation_cache = hash_create("Collation cache", 100, &ctl,
+ HASH_ELEM | HASH_BLOBS);
+ }
+
+ cache_entry = hash_search(collation_cache, &collation, HASH_ENTER, &found);
+ if (!found)
+ {
+ /*
+ * Make sure cache entry is marked invalid, in case we fail before
+ * setting things.
+ */
+ cache_entry->flags_valid = false;
+ cache_entry->locale = 0;
+ }
+
+ if (set_flags && !cache_entry->flags_valid)
+ {
+ /* Attempt to set the flags */
+ HeapTuple tp;
+ Form_pg_collation collform;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collation));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for collation %u", collation);
+ collform = (Form_pg_collation) GETSTRUCT(tp);
+
+ if (collform->collprovider == COLLPROVIDER_LIBC)
+ {
+ Datum datum;
+ bool isnull;
+ const char *collcollate;
+ const char *collctype;
+
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull);
+ Assert(!isnull);
+ collcollate = TextDatumGetCString(datum);
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull);
+ Assert(!isnull);
+ collctype = TextDatumGetCString(datum);
+
+ cache_entry->collate_is_c = ((strcmp(collcollate, "C") == 0) ||
+ (strcmp(collcollate, "POSIX") == 0));
+ cache_entry->ctype_is_c = ((strcmp(collctype, "C") == 0) ||
+ (strcmp(collctype, "POSIX") == 0));
+ }
+ else
+ {
+ cache_entry->collate_is_c = false;
+ cache_entry->ctype_is_c = false;
+ }
+
+ cache_entry->flags_valid = true;
+
+ ReleaseSysCache(tp);
+ }
+
+ return cache_entry;
+}
+
+
+/*
+ * Detect whether collation's LC_COLLATE property is C
+ */
+bool
+lc_collate_is_c(Oid collation)
+{
+ /*
+ * If we're asked about "collation 0", return false, so that the code will
+ * go into the non-C path and report that the collation is bogus.
+ */
+ if (!OidIsValid(collation))
+ return false;
+
+ /*
+ * If we're asked about the default collation, we have to inquire of the C
+ * library. Cache the result so we only have to compute it once.
+ */
+ if (collation == DEFAULT_COLLATION_OID)
+ {
+ static int result = -1;
+ char *localeptr;
+
+ if (default_locale.provider == COLLPROVIDER_ICU)
+ return false;
+
+ if (result >= 0)
+ return (bool) result;
+ localeptr = setlocale(LC_COLLATE, NULL);
+ if (!localeptr)
+ elog(ERROR, "invalid LC_COLLATE setting");
+
+ if (strcmp(localeptr, "C") == 0)
+ result = true;
+ else if (strcmp(localeptr, "POSIX") == 0)
+ result = true;
+ else
+ result = false;
+ return (bool) result;
+ }
+
+ /*
+ * If we're asked about the built-in C/POSIX collations, we know that.
+ */
+ if (collation == C_COLLATION_OID ||
+ collation == POSIX_COLLATION_OID)
+ return true;
+
+ /*
+ * Otherwise, we have to consult pg_collation, but we cache that.
+ */
+ return (lookup_collation_cache(collation, true))->collate_is_c;
+}
+
+/*
+ * Detect whether collation's LC_CTYPE property is C
+ */
+bool
+lc_ctype_is_c(Oid collation)
+{
+ /*
+ * If we're asked about "collation 0", return false, so that the code will
+ * go into the non-C path and report that the collation is bogus.
+ */
+ if (!OidIsValid(collation))
+ return false;
+
+ /*
+ * If we're asked about the default collation, we have to inquire of the C
+ * library. Cache the result so we only have to compute it once.
+ */
+ if (collation == DEFAULT_COLLATION_OID)
+ {
+ static int result = -1;
+ char *localeptr;
+
+ if (default_locale.provider == COLLPROVIDER_ICU)
+ return false;
+
+ if (result >= 0)
+ return (bool) result;
+ localeptr = setlocale(LC_CTYPE, NULL);
+ if (!localeptr)
+ elog(ERROR, "invalid LC_CTYPE setting");
+
+ if (strcmp(localeptr, "C") == 0)
+ result = true;
+ else if (strcmp(localeptr, "POSIX") == 0)
+ result = true;
+ else
+ result = false;
+ return (bool) result;
+ }
+
+ /*
+ * If we're asked about the built-in C/POSIX collations, we know that.
+ */
+ if (collation == C_COLLATION_OID ||
+ collation == POSIX_COLLATION_OID)
+ return true;
+
+ /*
+ * Otherwise, we have to consult pg_collation, but we cache that.
+ */
+ return (lookup_collation_cache(collation, true))->ctype_is_c;
+}
+
+struct pg_locale_struct default_locale;
+
+void
+make_icu_collator(const char *iculocstr,
+ struct pg_locale_struct *resultp)
+{
+#ifdef USE_ICU
+ UCollator *collator;
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+ collator = ucol_open(iculocstr, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("could not open collator for locale \"%s\": %s",
+ iculocstr, u_errorName(status))));
+
+ if (U_ICU_VERSION_MAJOR_NUM < 54)
+ icu_set_collation_attributes(collator, iculocstr);
+
+ /* We will leak this string if the caller errors later :-( */
+ resultp->info.icu.locale = MemoryContextStrdup(TopMemoryContext, iculocstr);
+ resultp->info.icu.ucol = collator;
+#else /* not USE_ICU */
+ /* could get here if a collation was created by a build with ICU */
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("ICU is not supported in this build")));
+#endif /* not USE_ICU */
+}
+
+
+/* simple subroutine for reporting errors from newlocale() */
+#ifdef HAVE_LOCALE_T
+static void
+report_newlocale_failure(const char *localename)
+{
+ int save_errno;
+
+ /*
+ * Windows doesn't provide any useful error indication from
+ * _create_locale(), and BSD-derived platforms don't seem to feel they
+ * need to set errno either (even though POSIX is pretty clear that
+ * newlocale should do so). So, if errno hasn't been set, assume ENOENT
+ * is what to report.
+ */
+ if (errno == 0)
+ errno = ENOENT;
+
+ /*
+ * ENOENT means "no such locale", not "no such file", so clarify that
+ * errno with an errdetail message.
+ */
+ save_errno = errno; /* auxiliary funcs might change errno */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not create locale \"%s\": %m",
+ localename),
+ (save_errno == ENOENT ?
+ errdetail("The operating system could not find any locale data for the locale name \"%s\".",
+ localename) : 0)));
+}
+#endif /* HAVE_LOCALE_T */
+
+
+/*
+ * Create a locale_t from a collation OID. Results are cached for the
+ * lifetime of the backend. Thus, do not free the result with freelocale().
+ *
+ * As a special optimization, the default/database collation returns 0.
+ * Callers should then revert to the non-locale_t-enabled code path.
+ * Also, callers should avoid calling this before going down a C/POSIX
+ * fastpath, because such a fastpath should work even on platforms without
+ * locale_t support in the C library.
+ *
+ * For simplicity, we always generate COLLATE + CTYPE even though we
+ * might only need one of them. Since this is called only once per session,
+ * it shouldn't cost much.
+ */
+pg_locale_t
+pg_newlocale_from_collation(Oid collid)
+{
+ collation_cache_entry *cache_entry;
+
+ /* Callers must pass a valid OID */
+ Assert(OidIsValid(collid));
+
+ if (collid == DEFAULT_COLLATION_OID)
+ {
+ if (default_locale.provider == COLLPROVIDER_ICU)
+ return &default_locale;
+ else
+ return (pg_locale_t) 0;
+ }
+
+ cache_entry = lookup_collation_cache(collid, false);
+
+ if (cache_entry->locale == 0)
+ {
+ /* We haven't computed this yet in this session, so do it */
+ HeapTuple tp;
+ Form_pg_collation collform;
+ struct pg_locale_struct result;
+ pg_locale_t resultp;
+ Datum datum;
+ bool isnull;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for collation %u", collid);
+ collform = (Form_pg_collation) GETSTRUCT(tp);
+
+ /* We'll fill in the result struct locally before allocating memory */
+ memset(&result, 0, sizeof(result));
+ result.provider = collform->collprovider;
+ result.deterministic = collform->collisdeterministic;
+
+ if (collform->collprovider == COLLPROVIDER_LIBC)
+ {
+#ifdef HAVE_LOCALE_T
+ const char *collcollate;
+ const char *collctype pg_attribute_unused();
+ locale_t loc;
+
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull);
+ Assert(!isnull);
+ collcollate = TextDatumGetCString(datum);
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull);
+ Assert(!isnull);
+ collctype = TextDatumGetCString(datum);
+
+ if (strcmp(collcollate, collctype) == 0)
+ {
+ /* Normal case where they're the same */
+ errno = 0;
+#ifndef WIN32
+ loc = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK, collcollate,
+ NULL);
+#else
+ loc = _create_locale(LC_ALL, collcollate);
+#endif
+ if (!loc)
+ report_newlocale_failure(collcollate);
+ }
+ else
+ {
+#ifndef WIN32
+ /* We need two newlocale() steps */
+ locale_t loc1;
+
+ errno = 0;
+ loc1 = newlocale(LC_COLLATE_MASK, collcollate, NULL);
+ if (!loc1)
+ report_newlocale_failure(collcollate);
+ errno = 0;
+ loc = newlocale(LC_CTYPE_MASK, collctype, loc1);
+ if (!loc)
+ report_newlocale_failure(collctype);
+#else
+
+ /*
+ * XXX The _create_locale() API doesn't appear to support
+ * this. Could perhaps be worked around by changing
+ * pg_locale_t to contain two separate fields.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("collations with different collate and ctype values are not supported on this platform")));
+#endif
+ }
+
+ result.info.lt = loc;
+#else /* not HAVE_LOCALE_T */
+ /* platform that doesn't support locale_t */
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("collation provider LIBC is not supported on this platform")));
+#endif /* not HAVE_LOCALE_T */
+ }
+ else if (collform->collprovider == COLLPROVIDER_ICU)
+ {
+ const char *iculocstr;
+
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colliculocale, &isnull);
+ Assert(!isnull);
+ iculocstr = TextDatumGetCString(datum);
+ make_icu_collator(iculocstr, &result);
+ }
+
+ datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collversion,
+ &isnull);
+ if (!isnull)
+ {
+ char *actual_versionstr;
+ char *collversionstr;
+
+ collversionstr = TextDatumGetCString(datum);
+
+ datum = SysCacheGetAttr(COLLOID, tp, collform->collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate, &isnull);
+ Assert(!isnull);
+
+ actual_versionstr = get_collation_actual_version(collform->collprovider,
+ TextDatumGetCString(datum));
+ if (!actual_versionstr)
+ {
+ /*
+ * This could happen when specifying a version in CREATE
+ * COLLATION but the provider does not support versioning, or
+ * manually creating a mess in the catalogs.
+ */
+ ereport(ERROR,
+ (errmsg("collation \"%s\" has no actual version, but a version was recorded",
+ NameStr(collform->collname))));
+ }
+
+ if (strcmp(actual_versionstr, collversionstr) != 0)
+ ereport(WARNING,
+ (errmsg("collation \"%s\" has version mismatch",
+ NameStr(collform->collname)),
+ errdetail("The collation in the database was created using version %s, "
+ "but the operating system provides version %s.",
+ collversionstr, actual_versionstr),
+ errhint("Rebuild all objects affected by this collation and run "
+ "ALTER COLLATION %s REFRESH VERSION, "
+ "or build PostgreSQL with the right library version.",
+ quote_qualified_identifier(get_namespace_name(collform->collnamespace),
+ NameStr(collform->collname)))));
+ }
+
+ ReleaseSysCache(tp);
+
+ /* We'll keep the pg_locale_t structures in TopMemoryContext */
+ resultp = MemoryContextAlloc(TopMemoryContext, sizeof(*resultp));
+ *resultp = result;
+
+ cache_entry->locale = resultp;
+ }
+
+ return cache_entry->locale;
+}
+
+/*
+ * Get provider-specific collation version string for the given collation from
+ * the operating system/library.
+ */
+char *
+get_collation_actual_version(char collprovider, const char *collcollate)
+{
+ char *collversion = NULL;
+
+#ifdef USE_ICU
+ if (collprovider == COLLPROVIDER_ICU)
+ {
+ UCollator *collator;
+ UErrorCode status;
+ UVersionInfo versioninfo;
+ char buf[U_MAX_VERSION_STRING_LENGTH];
+
+ status = U_ZERO_ERROR;
+ collator = ucol_open(collcollate, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("could not open collator for locale \"%s\": %s",
+ collcollate, u_errorName(status))));
+ ucol_getVersion(collator, versioninfo);
+ ucol_close(collator);
+
+ u_versionToString(versioninfo, buf);
+ collversion = pstrdup(buf);
+ }
+ else
+#endif
+ if (collprovider == COLLPROVIDER_LIBC &&
+ pg_strcasecmp("C", collcollate) != 0 &&
+ pg_strncasecmp("C.", collcollate, 2) != 0 &&
+ pg_strcasecmp("POSIX", collcollate) != 0)
+ {
+#if defined(__GLIBC__)
+ /* Use the glibc version because we don't have anything better. */
+ collversion = pstrdup(gnu_get_libc_version());
+#elif defined(LC_VERSION_MASK)
+ locale_t loc;
+
+ /* Look up FreeBSD collation version. */
+ loc = newlocale(LC_COLLATE, collcollate, NULL);
+ if (loc)
+ {
+ collversion =
+ pstrdup(querylocale(LC_COLLATE_MASK | LC_VERSION_MASK, loc));
+ freelocale(loc);
+ }
+ else
+ ereport(ERROR,
+ (errmsg("could not load locale \"%s\"", collcollate)));
+#elif defined(WIN32) && _WIN32_WINNT >= 0x0600
+ /*
+ * If we are targeting Windows Vista and above, we can ask for a name
+ * given a collation name (earlier versions required a location code
+ * that we don't have).
+ */
+ NLSVERSIONINFOEX version = {sizeof(NLSVERSIONINFOEX)};
+ WCHAR wide_collcollate[LOCALE_NAME_MAX_LENGTH];
+
+ MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wide_collcollate,
+ LOCALE_NAME_MAX_LENGTH);
+ if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version))
+ {
+ /*
+ * GetNLSVersionEx() wants a language tag such as "en-US", not a
+ * locale name like "English_United States.1252". Until those
+ * values can be prevented from entering the system, or 100%
+ * reliably converted to the more useful tag format, tolerate the
+ * resulting error and report that we have no version data.
+ */
+ if (GetLastError() == ERROR_INVALID_PARAMETER)
+ return NULL;
+
+ ereport(ERROR,
+ (errmsg("could not get collation version for locale \"%s\": error code %lu",
+ collcollate,
+ GetLastError())));
+ }
+ collversion = psprintf("%d.%d,%d.%d",
+ (version.dwNLSVersion >> 8) & 0xFFFF,
+ version.dwNLSVersion & 0xFF,
+ (version.dwDefinedVersion >> 8) & 0xFFFF,
+ version.dwDefinedVersion & 0xFF);
+#endif
+ }
+
+ return collversion;
+}
+
+
+#ifdef USE_ICU
+/*
+ * Converter object for converting between ICU's UChar strings and C strings
+ * in database encoding. Since the database encoding doesn't change, we only
+ * need one of these per session.
+ */
+static UConverter *icu_converter = NULL;
+
+static void
+init_icu_converter(void)
+{
+ const char *icu_encoding_name;
+ UErrorCode status;
+ UConverter *conv;
+
+ if (icu_converter)
+ return; /* already done */
+
+ icu_encoding_name = get_encoding_name_for_icu(GetDatabaseEncoding());
+ if (!icu_encoding_name)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("encoding \"%s\" not supported by ICU",
+ pg_encoding_to_char(GetDatabaseEncoding()))));
+
+ status = U_ZERO_ERROR;
+ conv = ucnv_open(icu_encoding_name, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("could not open ICU converter for encoding \"%s\": %s",
+ icu_encoding_name, u_errorName(status))));
+
+ icu_converter = conv;
+}
+
+/*
+ * Convert a string in the database encoding into a string of UChars.
+ *
+ * The source string at buff is of length nbytes
+ * (it needn't be nul-terminated)
+ *
+ * *buff_uchar receives a pointer to the palloc'd result string, and
+ * the function's result is the number of UChars generated.
+ *
+ * The result string is nul-terminated, though most callers rely on the
+ * result length instead.
+ */
+int32_t
+icu_to_uchar(UChar **buff_uchar, const char *buff, size_t nbytes)
+{
+ UErrorCode status;
+ int32_t len_uchar;
+
+ init_icu_converter();
+
+ status = U_ZERO_ERROR;
+ len_uchar = ucnv_toUChars(icu_converter, NULL, 0,
+ buff, nbytes, &status);
+ if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
+ ereport(ERROR,
+ (errmsg("%s failed: %s", "ucnv_toUChars", u_errorName(status))));
+
+ *buff_uchar = palloc((len_uchar + 1) * sizeof(**buff_uchar));
+
+ status = U_ZERO_ERROR;
+ len_uchar = ucnv_toUChars(icu_converter, *buff_uchar, len_uchar + 1,
+ buff, nbytes, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("%s failed: %s", "ucnv_toUChars", u_errorName(status))));
+
+ return len_uchar;
+}
+
+/*
+ * Convert a string of UChars into the database encoding.
+ *
+ * The source string at buff_uchar is of length len_uchar
+ * (it needn't be nul-terminated)
+ *
+ * *result receives a pointer to the palloc'd result string, and the
+ * function's result is the number of bytes generated (not counting nul).
+ *
+ * The result string is nul-terminated.
+ */
+int32_t
+icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar)
+{
+ UErrorCode status;
+ int32_t len_result;
+
+ init_icu_converter();
+
+ status = U_ZERO_ERROR;
+ len_result = ucnv_fromUChars(icu_converter, NULL, 0,
+ buff_uchar, len_uchar, &status);
+ if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
+ ereport(ERROR,
+ (errmsg("%s failed: %s", "ucnv_fromUChars",
+ u_errorName(status))));
+
+ *result = palloc(len_result + 1);
+
+ status = U_ZERO_ERROR;
+ len_result = ucnv_fromUChars(icu_converter, *result, len_result + 1,
+ buff_uchar, len_uchar, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("%s failed: %s", "ucnv_fromUChars",
+ u_errorName(status))));
+
+ return len_result;
+}
+
+/*
+ * Parse collation attributes and apply them to the open collator. This takes
+ * a string like "und@colStrength=primary;colCaseLevel=yes" and parses and
+ * applies the key-value arguments.
+ *
+ * Starting with ICU version 54, the attributes are processed automatically by
+ * ucol_open(), so this is only necessary for emulating this behavior on older
+ * versions.
+ */
+pg_attribute_unused()
+static void
+icu_set_collation_attributes(UCollator *collator, const char *loc)
+{
+ char *str = asc_tolower(loc, strlen(loc));
+
+ str = strchr(str, '@');
+ if (!str)
+ return;
+ str++;
+
+ for (char *token = strtok(str, ";"); token; token = strtok(NULL, ";"))
+ {
+ char *e = strchr(token, '=');
+
+ if (e)
+ {
+ char *name;
+ char *value;
+ UColAttribute uattr;
+ UColAttributeValue uvalue;
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+
+ *e = '\0';
+ name = token;
+ value = e + 1;
+
+ /*
+ * See attribute name and value lists in ICU i18n/coll.cpp
+ */
+ if (strcmp(name, "colstrength") == 0)
+ uattr = UCOL_STRENGTH;
+ else if (strcmp(name, "colbackwards") == 0)
+ uattr = UCOL_FRENCH_COLLATION;
+ else if (strcmp(name, "colcaselevel") == 0)
+ uattr = UCOL_CASE_LEVEL;
+ else if (strcmp(name, "colcasefirst") == 0)
+ uattr = UCOL_CASE_FIRST;
+ else if (strcmp(name, "colalternate") == 0)
+ uattr = UCOL_ALTERNATE_HANDLING;
+ else if (strcmp(name, "colnormalization") == 0)
+ uattr = UCOL_NORMALIZATION_MODE;
+ else if (strcmp(name, "colnumeric") == 0)
+ uattr = UCOL_NUMERIC_COLLATION;
+ else
+ /* ignore if unknown */
+ continue;
+
+ if (strcmp(value, "primary") == 0)
+ uvalue = UCOL_PRIMARY;
+ else if (strcmp(value, "secondary") == 0)
+ uvalue = UCOL_SECONDARY;
+ else if (strcmp(value, "tertiary") == 0)
+ uvalue = UCOL_TERTIARY;
+ else if (strcmp(value, "quaternary") == 0)
+ uvalue = UCOL_QUATERNARY;
+ else if (strcmp(value, "identical") == 0)
+ uvalue = UCOL_IDENTICAL;
+ else if (strcmp(value, "no") == 0)
+ uvalue = UCOL_OFF;
+ else if (strcmp(value, "yes") == 0)
+ uvalue = UCOL_ON;
+ else if (strcmp(value, "shifted") == 0)
+ uvalue = UCOL_SHIFTED;
+ else if (strcmp(value, "non-ignorable") == 0)
+ uvalue = UCOL_NON_IGNORABLE;
+ else if (strcmp(value, "lower") == 0)
+ uvalue = UCOL_LOWER_FIRST;
+ else if (strcmp(value, "upper") == 0)
+ uvalue = UCOL_UPPER_FIRST;
+ else
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+
+ if (status == U_ZERO_ERROR)
+ ucol_setAttribute(collator, uattr, uvalue, &status);
+
+ /*
+ * Pretend the error came from ucol_open(), for consistent error
+ * message across ICU versions.
+ */
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("could not open collator for locale \"%s\": %s",
+ loc, u_errorName(status))));
+ }
+ }
+}
+
+#endif /* USE_ICU */
+
+/*
+ * Check if the given locale ID is valid, and ereport(ERROR) if it isn't.
+ */
+void
+check_icu_locale(const char *icu_locale)
+{
+#ifdef USE_ICU
+ UCollator *collator;
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+ collator = ucol_open(icu_locale, &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("could not open collator for locale \"%s\": %s",
+ icu_locale, u_errorName(status))));
+
+ if (U_ICU_VERSION_MAJOR_NUM < 54)
+ icu_set_collation_attributes(collator, icu_locale);
+ ucol_close(collator);
+#else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("ICU is not supported in this build")));
+#endif
+}
+
+/*
+ * These functions convert from/to libc's wchar_t, *not* pg_wchar_t.
+ * Therefore we keep them here rather than with the mbutils code.
+ */
+
+/*
+ * wchar2char --- convert wide characters to multibyte format
+ *
+ * This has the same API as the standard wcstombs_l() function; in particular,
+ * tolen is the maximum number of bytes to store at *to, and *from must be
+ * zero-terminated. The output will be zero-terminated iff there is room.
+ */
+size_t
+wchar2char(char *to, const wchar_t *from, size_t tolen, pg_locale_t locale)
+{
+ size_t result;
+
+ Assert(!locale || locale->provider == COLLPROVIDER_LIBC);
+
+ if (tolen == 0)
+ return 0;
+
+#ifdef WIN32
+
+ /*
+ * On Windows, the "Unicode" locales assume UTF16 not UTF8 encoding, and
+ * for some reason mbstowcs and wcstombs won't do this for us, so we use
+ * MultiByteToWideChar().
+ */
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ result = WideCharToMultiByte(CP_UTF8, 0, from, -1, to, tolen,
+ NULL, NULL);
+ /* A zero return is failure */
+ if (result <= 0)
+ result = -1;
+ else
+ {
+ Assert(result <= tolen);
+ /* Microsoft counts the zero terminator in the result */
+ result--;
+ }
+ }
+ else
+#endif /* WIN32 */
+ if (locale == (pg_locale_t) 0)
+ {
+ /* Use wcstombs directly for the default locale */
+ result = wcstombs(to, from, tolen);
+ }
+ else
+ {
+#ifdef HAVE_LOCALE_T
+#ifdef HAVE_WCSTOMBS_L
+ /* Use wcstombs_l for nondefault locales */
+ result = wcstombs_l(to, from, tolen, locale->info.lt);
+#else /* !HAVE_WCSTOMBS_L */
+ /* We have to temporarily set the locale as current ... ugh */
+ locale_t save_locale = uselocale(locale->info.lt);
+
+ result = wcstombs(to, from, tolen);
+
+ uselocale(save_locale);
+#endif /* HAVE_WCSTOMBS_L */
+#else /* !HAVE_LOCALE_T */
+ /* Can't have locale != 0 without HAVE_LOCALE_T */
+ elog(ERROR, "wcstombs_l is not available");
+ result = 0; /* keep compiler quiet */
+#endif /* HAVE_LOCALE_T */
+ }
+
+ return result;
+}
+
+/*
+ * char2wchar --- convert multibyte characters to wide characters
+ *
+ * This has almost the API of mbstowcs_l(), except that *from need not be
+ * null-terminated; instead, the number of input bytes is specified as
+ * fromlen. Also, we ereport() rather than returning -1 for invalid
+ * input encoding. tolen is the maximum number of wchar_t's to store at *to.
+ * The output will be zero-terminated iff there is room.
+ */
+size_t
+char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen,
+ pg_locale_t locale)
+{
+ size_t result;
+
+ Assert(!locale || locale->provider == COLLPROVIDER_LIBC);
+
+ if (tolen == 0)
+ return 0;
+
+#ifdef WIN32
+ /* See WIN32 "Unicode" comment above */
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ /* Win32 API does not work for zero-length input */
+ if (fromlen == 0)
+ result = 0;
+ else
+ {
+ result = MultiByteToWideChar(CP_UTF8, 0, from, fromlen, to, tolen - 1);
+ /* A zero return is failure */
+ if (result == 0)
+ result = -1;
+ }
+
+ if (result != -1)
+ {
+ Assert(result < tolen);
+ /* Append trailing null wchar (MultiByteToWideChar() does not) */
+ to[result] = 0;
+ }
+ }
+ else
+#endif /* WIN32 */
+ {
+ /* mbstowcs requires ending '\0' */
+ char *str = pnstrdup(from, fromlen);
+
+ if (locale == (pg_locale_t) 0)
+ {
+ /* Use mbstowcs directly for the default locale */
+ result = mbstowcs(to, str, tolen);
+ }
+ else
+ {
+#ifdef HAVE_LOCALE_T
+#ifdef HAVE_MBSTOWCS_L
+ /* Use mbstowcs_l for nondefault locales */
+ result = mbstowcs_l(to, str, tolen, locale->info.lt);
+#else /* !HAVE_MBSTOWCS_L */
+ /* We have to temporarily set the locale as current ... ugh */
+ locale_t save_locale = uselocale(locale->info.lt);
+
+ result = mbstowcs(to, str, tolen);
+
+ uselocale(save_locale);
+#endif /* HAVE_MBSTOWCS_L */
+#else /* !HAVE_LOCALE_T */
+ /* Can't have locale != 0 without HAVE_LOCALE_T */
+ elog(ERROR, "mbstowcs_l is not available");
+ result = 0; /* keep compiler quiet */
+#endif /* HAVE_LOCALE_T */
+ }
+
+ pfree(str);
+ }
+
+ if (result == -1)
+ {
+ /*
+ * Invalid multibyte character encountered. We try to give a useful
+ * error message by letting pg_verifymbstr check the string. But it's
+ * possible that the string is OK to us, and not OK to mbstowcs ---
+ * this suggests that the LC_CTYPE locale is different from the
+ * database encoding. Give a generic error message if pg_verifymbstr
+ * can't find anything wrong.
+ */
+ pg_verifymbstr(from, fromlen, false); /* might not return */
+ /* but if it does ... */
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("invalid multibyte character for locale"),
+ errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
+ }
+
+ return result;
+}
diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c
new file mode 100644
index 0000000..4540878
--- /dev/null
+++ b/src/backend/utils/adt/pg_lsn.c
@@ -0,0 +1,313 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_lsn.c
+ * Operations for the pg_lsn datatype.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/pg_lsn.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+#include "utils/numeric.h"
+#include "utils/pg_lsn.h"
+
+#define MAXPG_LSNLEN 17
+#define MAXPG_LSNCOMPONENT 8
+
+/*----------------------------------------------------------
+ * Formatting and conversion routines.
+ *---------------------------------------------------------*/
+
+XLogRecPtr
+pg_lsn_in_internal(const char *str, bool *have_error)
+{
+ int len1,
+ len2;
+ uint32 id,
+ off;
+ XLogRecPtr result;
+
+ Assert(have_error != NULL);
+ *have_error = false;
+
+ /* Sanity check input format. */
+ len1 = strspn(str, "0123456789abcdefABCDEF");
+ if (len1 < 1 || len1 > MAXPG_LSNCOMPONENT || str[len1] != '/')
+ {
+ *have_error = true;
+ return InvalidXLogRecPtr;
+ }
+ len2 = strspn(str + len1 + 1, "0123456789abcdefABCDEF");
+ if (len2 < 1 || len2 > MAXPG_LSNCOMPONENT || str[len1 + 1 + len2] != '\0')
+ {
+ *have_error = true;
+ return InvalidXLogRecPtr;
+ }
+
+ /* Decode result. */
+ id = (uint32) strtoul(str, NULL, 16);
+ off = (uint32) strtoul(str + len1 + 1, NULL, 16);
+ result = ((uint64) id << 32) | off;
+
+ return result;
+}
+
+Datum
+pg_lsn_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ XLogRecPtr result;
+ bool have_error = false;
+
+ result = pg_lsn_in_internal(str, &have_error);
+ if (have_error)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "pg_lsn", str)));
+
+ PG_RETURN_LSN(result);
+}
+
+Datum
+pg_lsn_out(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn = PG_GETARG_LSN(0);
+ char buf[MAXPG_LSNLEN + 1];
+ char *result;
+
+ snprintf(buf, sizeof buf, "%X/%X", LSN_FORMAT_ARGS(lsn));
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+Datum
+pg_lsn_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ XLogRecPtr result;
+
+ result = pq_getmsgint64(buf);
+ PG_RETURN_LSN(result);
+}
+
+Datum
+pg_lsn_send(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn = PG_GETARG_LSN(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, lsn);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*----------------------------------------------------------
+ * Operators for PostgreSQL LSNs
+ *---------------------------------------------------------*/
+
+Datum
+pg_lsn_eq(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 == lsn2);
+}
+
+Datum
+pg_lsn_ne(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 != lsn2);
+}
+
+Datum
+pg_lsn_lt(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 < lsn2);
+}
+
+Datum
+pg_lsn_gt(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 > lsn2);
+}
+
+Datum
+pg_lsn_le(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 <= lsn2);
+}
+
+Datum
+pg_lsn_ge(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_BOOL(lsn1 >= lsn2);
+}
+
+Datum
+pg_lsn_larger(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_LSN((lsn1 > lsn2) ? lsn1 : lsn2);
+}
+
+Datum
+pg_lsn_smaller(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+
+ PG_RETURN_LSN((lsn1 < lsn2) ? lsn1 : lsn2);
+}
+
+/* btree index opclass support */
+Datum
+pg_lsn_cmp(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr a = PG_GETARG_LSN(0);
+ XLogRecPtr b = PG_GETARG_LSN(1);
+
+ if (a > b)
+ PG_RETURN_INT32(1);
+ else if (a == b)
+ PG_RETURN_INT32(0);
+ else
+ PG_RETURN_INT32(-1);
+}
+
+/* hash index opclass support */
+Datum
+pg_lsn_hash(PG_FUNCTION_ARGS)
+{
+ /* We can use hashint8 directly */
+ return hashint8(fcinfo);
+}
+
+Datum
+pg_lsn_hash_extended(PG_FUNCTION_ARGS)
+{
+ return hashint8extended(fcinfo);
+}
+
+
+/*----------------------------------------------------------
+ * Arithmetic operators on PostgreSQL LSNs.
+ *---------------------------------------------------------*/
+
+Datum
+pg_lsn_mi(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn1 = PG_GETARG_LSN(0);
+ XLogRecPtr lsn2 = PG_GETARG_LSN(1);
+ char buf[256];
+ Datum result;
+
+ /* Output could be as large as plus or minus 2^63 - 1. */
+ if (lsn1 < lsn2)
+ snprintf(buf, sizeof buf, "-" UINT64_FORMAT, lsn2 - lsn1);
+ else
+ snprintf(buf, sizeof buf, UINT64_FORMAT, lsn1 - lsn2);
+
+ /* Convert to numeric. */
+ result = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(buf),
+ ObjectIdGetDatum(0),
+ Int32GetDatum(-1));
+
+ return result;
+}
+
+/*
+ * Add the number of bytes to pg_lsn, giving a new pg_lsn.
+ * Must handle both positive and negative numbers of bytes.
+ */
+Datum
+pg_lsn_pli(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn = PG_GETARG_LSN(0);
+ Numeric nbytes = PG_GETARG_NUMERIC(1);
+ Datum num;
+ Datum res;
+ char buf[32];
+
+ if (numeric_is_nan(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot add NaN to pg_lsn")));
+
+ /* Convert to numeric */
+ snprintf(buf, sizeof(buf), UINT64_FORMAT, lsn);
+ num = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(buf),
+ ObjectIdGetDatum(0),
+ Int32GetDatum(-1));
+
+ /* Add two numerics */
+ res = DirectFunctionCall2(numeric_add,
+ NumericGetDatum(num),
+ NumericGetDatum(nbytes));
+
+ /* Convert to pg_lsn */
+ return DirectFunctionCall1(numeric_pg_lsn, res);
+}
+
+/*
+ * Subtract the number of bytes from pg_lsn, giving a new pg_lsn.
+ * Must handle both positive and negative numbers of bytes.
+ */
+Datum
+pg_lsn_mii(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr lsn = PG_GETARG_LSN(0);
+ Numeric nbytes = PG_GETARG_NUMERIC(1);
+ Datum num;
+ Datum res;
+ char buf[32];
+
+ if (numeric_is_nan(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot subtract NaN from pg_lsn")));
+
+ /* Convert to numeric */
+ snprintf(buf, sizeof(buf), UINT64_FORMAT, lsn);
+ num = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(buf),
+ ObjectIdGetDatum(0),
+ Int32GetDatum(-1));
+
+ /* Subtract two numerics */
+ res = DirectFunctionCall2(numeric_sub,
+ NumericGetDatum(num),
+ NumericGetDatum(nbytes));
+
+ /* Convert to pg_lsn */
+ return DirectFunctionCall1(numeric_pg_lsn, res);
+}
diff --git a/src/backend/utils/adt/pg_upgrade_support.c b/src/backend/utils/adt/pg_upgrade_support.c
new file mode 100644
index 0000000..67b9675
--- /dev/null
+++ b/src/backend/utils/adt/pg_upgrade_support.c
@@ -0,0 +1,265 @@
+/*
+ * pg_upgrade_support.c
+ *
+ * server-side functions to set backend global variables
+ * to control oid and relfilenode assignment, and do other special
+ * hacks needed for pg_upgrade.
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/backend/utils/adt/pg_upgrade_support.c
+ */
+
+#include "postgres.h"
+
+#include "catalog/binary_upgrade.h"
+#include "catalog/heap.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_type.h"
+#include "commands/extension.h"
+#include "miscadmin.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+
+
+#define CHECK_IS_BINARY_UPGRADE \
+do { \
+ if (!IsBinaryUpgrade) \
+ ereport(ERROR, \
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), \
+ errmsg("function can only be called when server is in binary upgrade mode"))); \
+} while (0)
+
+Datum
+binary_upgrade_set_next_pg_tablespace_oid(PG_FUNCTION_ARGS)
+{
+ Oid tbspoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_pg_tablespace_oid = tbspoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_pg_type_oid(PG_FUNCTION_ARGS)
+{
+ Oid typoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_pg_type_oid = typoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
+{
+ Oid typoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_array_pg_type_oid = typoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_multirange_pg_type_oid(PG_FUNCTION_ARGS)
+{
+ Oid typoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_mrng_pg_type_oid = typoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_multirange_array_pg_type_oid(PG_FUNCTION_ARGS)
+{
+ Oid typoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_mrng_array_pg_type_oid = typoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_heap_pg_class_oid = reloid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_heap_relfilenode(PG_FUNCTION_ARGS)
+{
+ Oid nodeoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_heap_pg_class_relfilenode = nodeoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_index_pg_class_oid = reloid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_index_relfilenode(PG_FUNCTION_ARGS)
+{
+ Oid nodeoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_index_pg_class_relfilenode = nodeoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
+{
+ Oid reloid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_toast_pg_class_oid = reloid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_toast_relfilenode(PG_FUNCTION_ARGS)
+{
+ Oid nodeoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_toast_pg_class_relfilenode = nodeoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_pg_enum_oid(PG_FUNCTION_ARGS)
+{
+ Oid enumoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_pg_enum_oid = enumoid;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS)
+{
+ Oid authoid = PG_GETARG_OID(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_next_pg_authid_oid = authoid;
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS)
+{
+ text *extName;
+ text *schemaName;
+ bool relocatable;
+ text *extVersion;
+ Datum extConfig;
+ Datum extCondition;
+ List *requiredExtensions;
+
+ CHECK_IS_BINARY_UPGRADE;
+
+ /* We must check these things before dereferencing the arguments */
+ if (PG_ARGISNULL(0) ||
+ PG_ARGISNULL(1) ||
+ PG_ARGISNULL(2) ||
+ PG_ARGISNULL(3))
+ elog(ERROR, "null argument to binary_upgrade_create_empty_extension is not allowed");
+
+ extName = PG_GETARG_TEXT_PP(0);
+ schemaName = PG_GETARG_TEXT_PP(1);
+ relocatable = PG_GETARG_BOOL(2);
+ extVersion = PG_GETARG_TEXT_PP(3);
+
+ if (PG_ARGISNULL(4))
+ extConfig = PointerGetDatum(NULL);
+ else
+ extConfig = PG_GETARG_DATUM(4);
+
+ if (PG_ARGISNULL(5))
+ extCondition = PointerGetDatum(NULL);
+ else
+ extCondition = PG_GETARG_DATUM(5);
+
+ requiredExtensions = NIL;
+ if (!PG_ARGISNULL(6))
+ {
+ ArrayType *textArray = PG_GETARG_ARRAYTYPE_P(6);
+ Datum *textDatums;
+ int ndatums;
+ int i;
+
+ deconstruct_array(textArray,
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &textDatums, NULL, &ndatums);
+ for (i = 0; i < ndatums; i++)
+ {
+ char *extName = TextDatumGetCString(textDatums[i]);
+ Oid extOid = get_extension_oid(extName, false);
+
+ requiredExtensions = lappend_oid(requiredExtensions, extOid);
+ }
+ }
+
+ InsertExtensionTuple(text_to_cstring(extName),
+ GetUserId(),
+ get_namespace_oid(text_to_cstring(schemaName), false),
+ relocatable,
+ text_to_cstring(extVersion),
+ extConfig,
+ extCondition,
+ requiredExtensions);
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_record_init_privs(PG_FUNCTION_ARGS)
+{
+ bool record_init_privs = PG_GETARG_BOOL(0);
+
+ CHECK_IS_BINARY_UPGRADE;
+ binary_upgrade_record_init_privs = record_init_privs;
+
+ PG_RETURN_VOID();
+}
+
+Datum
+binary_upgrade_set_missing_value(PG_FUNCTION_ARGS)
+{
+ Oid table_id = PG_GETARG_OID(0);
+ text *attname = PG_GETARG_TEXT_P(1);
+ text *value = PG_GETARG_TEXT_P(2);
+ char *cattname = text_to_cstring(attname);
+ char *cvalue = text_to_cstring(value);
+
+ CHECK_IS_BINARY_UPGRADE;
+ SetAttrMissing(table_id, cattname, cvalue);
+
+ PG_RETURN_VOID();
+}
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
new file mode 100644
index 0000000..6ef7ead
--- /dev/null
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -0,0 +1,2422 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgstatfuncs.c
+ * Functions for accessing various forms of statistics data
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/pgstatfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/xlog.h"
+#include "access/xlogprefetcher.h"
+#include "catalog/catalog.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_type.h"
+#include "common/ip.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "postmaster/bgworker_internals.h"
+#include "postmaster/postmaster.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+#include "utils/timestamp.h"
+
+#define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32 *)&(var))))
+
+#define HAS_PGSTAT_PERMISSIONS(role) (has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS) || has_privs_of_role(GetUserId(), role))
+
+Datum
+pg_stat_get_numscans(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->numscans);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_returned);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_inserted);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_updated);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_deleted);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->tuples_hot_updated);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->n_live_tuples);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->n_dead_tuples);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->changes_since_analyze);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_ins_since_vacuum(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->inserts_since_vacuum);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->blocks_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->blocks_hit);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = tabentry->vacuum_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = tabentry->autovac_vacuum_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = tabentry->analyze_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = tabentry->autovac_analyze_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->vacuum_count);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->autovac_vacuum_count);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_analyze_count(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->analyze_count);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->autovac_analyze_count);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_function_calls(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_StatFuncEntry *funcentry;
+
+ if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_INT64(funcentry->f_numcalls);
+}
+
+Datum
+pg_stat_get_function_total_time(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_StatFuncEntry *funcentry;
+
+ if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ /* convert counter from microsec to millisec for display */
+ PG_RETURN_FLOAT8(((double) funcentry->f_total_time) / 1000.0);
+}
+
+Datum
+pg_stat_get_function_self_time(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_StatFuncEntry *funcentry;
+
+ if ((funcentry = pgstat_fetch_stat_funcentry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ /* convert counter from microsec to millisec for display */
+ PG_RETURN_FLOAT8(((double) funcentry->f_self_time) / 1000.0);
+}
+
+Datum
+pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ int *fctx;
+ int32 result;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
+ 2 * sizeof(int));
+ funcctx->user_fctx = fctx;
+
+ fctx[0] = 0;
+ fctx[1] = pgstat_fetch_stat_numbackends();
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+ fctx = funcctx->user_fctx;
+
+ fctx[0] += 1;
+ result = fctx[0];
+
+ if (result <= fctx[1])
+ {
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, Int32GetDatum(result));
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/*
+ * Returns command progress information for the named command.
+ */
+Datum
+pg_stat_get_progress_info(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_PROGRESS_COLS PGSTAT_NUM_PROGRESS_PARAM + 3
+ int num_backends = pgstat_fetch_stat_numbackends();
+ int curr_backend;
+ char *cmd = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ ProgressCommandType cmdtype;
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ /* Translate command name into command type code. */
+ if (pg_strcasecmp(cmd, "VACUUM") == 0)
+ cmdtype = PROGRESS_COMMAND_VACUUM;
+ else if (pg_strcasecmp(cmd, "ANALYZE") == 0)
+ cmdtype = PROGRESS_COMMAND_ANALYZE;
+ else if (pg_strcasecmp(cmd, "CLUSTER") == 0)
+ cmdtype = PROGRESS_COMMAND_CLUSTER;
+ else if (pg_strcasecmp(cmd, "CREATE INDEX") == 0)
+ cmdtype = PROGRESS_COMMAND_CREATE_INDEX;
+ else if (pg_strcasecmp(cmd, "BASEBACKUP") == 0)
+ cmdtype = PROGRESS_COMMAND_BASEBACKUP;
+ else if (pg_strcasecmp(cmd, "COPY") == 0)
+ cmdtype = PROGRESS_COMMAND_COPY;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid command name: \"%s\"", cmd)));
+
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* 1-based index */
+ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++)
+ {
+ LocalPgBackendStatus *local_beentry;
+ PgBackendStatus *beentry;
+ Datum values[PG_STAT_GET_PROGRESS_COLS];
+ bool nulls[PG_STAT_GET_PROGRESS_COLS];
+ int i;
+
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ local_beentry = pgstat_fetch_stat_local_beentry(curr_backend);
+
+ if (!local_beentry)
+ continue;
+
+ beentry = &local_beentry->backendStatus;
+
+ /*
+ * Report values for only those backends which are running the given
+ * command.
+ */
+ if (!beentry || beentry->st_progress_command != cmdtype)
+ continue;
+
+ /* Value available to all callers */
+ values[0] = Int32GetDatum(beentry->st_procpid);
+ values[1] = ObjectIdGetDatum(beentry->st_databaseid);
+
+ /* show rest of the values including relid only to role members */
+ if (HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ {
+ values[2] = ObjectIdGetDatum(beentry->st_progress_command_target);
+ for (i = 0; i < PGSTAT_NUM_PROGRESS_PARAM; i++)
+ values[i + 3] = Int64GetDatum(beentry->st_progress_param[i]);
+ }
+ else
+ {
+ nulls[2] = true;
+ for (i = 0; i < PGSTAT_NUM_PROGRESS_PARAM; i++)
+ nulls[i + 3] = true;
+ }
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ return (Datum) 0;
+}
+
+/*
+ * Returns activity of PG backends.
+ */
+Datum
+pg_stat_get_activity(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_ACTIVITY_COLS 30
+ int num_backends = pgstat_fetch_stat_numbackends();
+ int curr_backend;
+ int pid = PG_ARGISNULL(0) ? -1 : PG_GETARG_INT32(0);
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* 1-based index */
+ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++)
+ {
+ /* for each row */
+ Datum values[PG_STAT_GET_ACTIVITY_COLS];
+ bool nulls[PG_STAT_GET_ACTIVITY_COLS];
+ LocalPgBackendStatus *local_beentry;
+ PgBackendStatus *beentry;
+ PGPROC *proc;
+ const char *wait_event_type = NULL;
+ const char *wait_event = NULL;
+
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ /* Get the next one in the list */
+ local_beentry = pgstat_fetch_stat_local_beentry(curr_backend);
+ if (!local_beentry)
+ {
+ int i;
+
+ /* Ignore missing entries if looking for specific PID */
+ if (pid != -1)
+ continue;
+
+ for (i = 0; i < lengthof(nulls); i++)
+ nulls[i] = true;
+
+ nulls[5] = false;
+ values[5] = CStringGetTextDatum("<backend information not available>");
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ continue;
+ }
+
+ beentry = &local_beentry->backendStatus;
+
+ /* If looking for specific PID, ignore all the others */
+ if (pid != -1 && beentry->st_procpid != pid)
+ continue;
+
+ /* Values available to all callers */
+ if (beentry->st_databaseid != InvalidOid)
+ values[0] = ObjectIdGetDatum(beentry->st_databaseid);
+ else
+ nulls[0] = true;
+
+ values[1] = Int32GetDatum(beentry->st_procpid);
+
+ if (beentry->st_userid != InvalidOid)
+ values[2] = ObjectIdGetDatum(beentry->st_userid);
+ else
+ nulls[2] = true;
+
+ if (beentry->st_appname)
+ values[3] = CStringGetTextDatum(beentry->st_appname);
+ else
+ nulls[3] = true;
+
+ if (TransactionIdIsValid(local_beentry->backend_xid))
+ values[15] = TransactionIdGetDatum(local_beentry->backend_xid);
+ else
+ nulls[15] = true;
+
+ if (TransactionIdIsValid(local_beentry->backend_xmin))
+ values[16] = TransactionIdGetDatum(local_beentry->backend_xmin);
+ else
+ nulls[16] = true;
+
+ /* Values only available to role member or pg_read_all_stats */
+ if (HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ {
+ SockAddr zero_clientaddr;
+ char *clipped_activity;
+
+ switch (beentry->st_state)
+ {
+ case STATE_IDLE:
+ values[4] = CStringGetTextDatum("idle");
+ break;
+ case STATE_RUNNING:
+ values[4] = CStringGetTextDatum("active");
+ break;
+ case STATE_IDLEINTRANSACTION:
+ values[4] = CStringGetTextDatum("idle in transaction");
+ break;
+ case STATE_FASTPATH:
+ values[4] = CStringGetTextDatum("fastpath function call");
+ break;
+ case STATE_IDLEINTRANSACTION_ABORTED:
+ values[4] = CStringGetTextDatum("idle in transaction (aborted)");
+ break;
+ case STATE_DISABLED:
+ values[4] = CStringGetTextDatum("disabled");
+ break;
+ case STATE_UNDEFINED:
+ nulls[4] = true;
+ break;
+ }
+
+ clipped_activity = pgstat_clip_activity(beentry->st_activity_raw);
+ values[5] = CStringGetTextDatum(clipped_activity);
+ pfree(clipped_activity);
+
+ /* leader_pid */
+ nulls[28] = true;
+
+ proc = BackendPidGetProc(beentry->st_procpid);
+
+ if (proc == NULL && (beentry->st_backendType != B_BACKEND))
+ {
+ /*
+ * For an auxiliary process, retrieve process info from
+ * AuxiliaryProcs stored in shared-memory.
+ */
+ proc = AuxiliaryPidGetProc(beentry->st_procpid);
+ }
+
+ /*
+ * If a PGPROC entry was retrieved, display wait events and lock
+ * group leader information if any. To avoid extra overhead, no
+ * extra lock is being held, so there is no guarantee of
+ * consistency across multiple rows.
+ */
+ if (proc != NULL)
+ {
+ uint32 raw_wait_event;
+ PGPROC *leader;
+
+ raw_wait_event = UINT32_ACCESS_ONCE(proc->wait_event_info);
+ wait_event_type = pgstat_get_wait_event_type(raw_wait_event);
+ wait_event = pgstat_get_wait_event(raw_wait_event);
+
+ leader = proc->lockGroupLeader;
+
+ /*
+ * Show the leader only for active parallel workers. This
+ * leaves the field as NULL for the leader of a parallel
+ * group.
+ */
+ if (leader && leader->pid != beentry->st_procpid)
+ {
+ values[28] = Int32GetDatum(leader->pid);
+ nulls[28] = false;
+ }
+ }
+
+ if (wait_event_type)
+ values[6] = CStringGetTextDatum(wait_event_type);
+ else
+ nulls[6] = true;
+
+ if (wait_event)
+ values[7] = CStringGetTextDatum(wait_event);
+ else
+ nulls[7] = true;
+
+ /*
+ * Don't expose transaction time for walsenders; it confuses
+ * monitoring, particularly because we don't keep the time up-to-
+ * date.
+ */
+ if (beentry->st_xact_start_timestamp != 0 &&
+ beentry->st_backendType != B_WAL_SENDER)
+ values[8] = TimestampTzGetDatum(beentry->st_xact_start_timestamp);
+ else
+ nulls[8] = true;
+
+ if (beentry->st_activity_start_timestamp != 0)
+ values[9] = TimestampTzGetDatum(beentry->st_activity_start_timestamp);
+ else
+ nulls[9] = true;
+
+ if (beentry->st_proc_start_timestamp != 0)
+ values[10] = TimestampTzGetDatum(beentry->st_proc_start_timestamp);
+ else
+ nulls[10] = true;
+
+ if (beentry->st_state_start_timestamp != 0)
+ values[11] = TimestampTzGetDatum(beentry->st_state_start_timestamp);
+ else
+ nulls[11] = true;
+
+ /* A zeroed client addr means we don't know */
+ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+ if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
+ sizeof(zero_clientaddr)) == 0)
+ {
+ nulls[12] = true;
+ nulls[13] = true;
+ nulls[14] = true;
+ }
+ else
+ {
+ if (beentry->st_clientaddr.addr.ss_family == AF_INET
+#ifdef HAVE_IPV6
+ || beentry->st_clientaddr.addr.ss_family == AF_INET6
+#endif
+ )
+ {
+ char remote_host[NI_MAXHOST];
+ char remote_port[NI_MAXSERV];
+ int ret;
+
+ remote_host[0] = '\0';
+ remote_port[0] = '\0';
+ ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
+ beentry->st_clientaddr.salen,
+ remote_host, sizeof(remote_host),
+ remote_port, sizeof(remote_port),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret == 0)
+ {
+ clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
+ values[12] = DirectFunctionCall1(inet_in,
+ CStringGetDatum(remote_host));
+ if (beentry->st_clienthostname &&
+ beentry->st_clienthostname[0])
+ values[13] = CStringGetTextDatum(beentry->st_clienthostname);
+ else
+ nulls[13] = true;
+ values[14] = Int32GetDatum(atoi(remote_port));
+ }
+ else
+ {
+ nulls[12] = true;
+ nulls[13] = true;
+ nulls[14] = true;
+ }
+ }
+ else if (beentry->st_clientaddr.addr.ss_family == AF_UNIX)
+ {
+ /*
+ * Unix sockets always reports NULL for host and -1 for
+ * port, so it's possible to tell the difference to
+ * connections we have no permissions to view, or with
+ * errors.
+ */
+ nulls[12] = true;
+ nulls[13] = true;
+ values[14] = Int32GetDatum(-1);
+ }
+ else
+ {
+ /* Unknown address type, should never happen */
+ nulls[12] = true;
+ nulls[13] = true;
+ nulls[14] = true;
+ }
+ }
+ /* Add backend type */
+ if (beentry->st_backendType == B_BG_WORKER)
+ {
+ const char *bgw_type;
+
+ bgw_type = GetBackgroundWorkerTypeByPid(beentry->st_procpid);
+ if (bgw_type)
+ values[17] = CStringGetTextDatum(bgw_type);
+ else
+ nulls[17] = true;
+ }
+ else
+ values[17] =
+ CStringGetTextDatum(GetBackendTypeDesc(beentry->st_backendType));
+
+ /* SSL information */
+ if (beentry->st_ssl)
+ {
+ values[18] = BoolGetDatum(true); /* ssl */
+ values[19] = CStringGetTextDatum(beentry->st_sslstatus->ssl_version);
+ values[20] = CStringGetTextDatum(beentry->st_sslstatus->ssl_cipher);
+ values[21] = Int32GetDatum(beentry->st_sslstatus->ssl_bits);
+
+ if (beentry->st_sslstatus->ssl_client_dn[0])
+ values[22] = CStringGetTextDatum(beentry->st_sslstatus->ssl_client_dn);
+ else
+ nulls[22] = true;
+
+ if (beentry->st_sslstatus->ssl_client_serial[0])
+ values[23] = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(beentry->st_sslstatus->ssl_client_serial),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ else
+ nulls[23] = true;
+
+ if (beentry->st_sslstatus->ssl_issuer_dn[0])
+ values[24] = CStringGetTextDatum(beentry->st_sslstatus->ssl_issuer_dn);
+ else
+ nulls[24] = true;
+ }
+ else
+ {
+ values[18] = BoolGetDatum(false); /* ssl */
+ nulls[19] = nulls[20] = nulls[21] = nulls[22] = nulls[23] = nulls[24] = true;
+ }
+
+ /* GSSAPI information */
+ if (beentry->st_gss)
+ {
+ values[25] = BoolGetDatum(beentry->st_gssstatus->gss_auth); /* gss_auth */
+ values[26] = CStringGetTextDatum(beentry->st_gssstatus->gss_princ);
+ values[27] = BoolGetDatum(beentry->st_gssstatus->gss_enc); /* GSS Encryption in use */
+ }
+ else
+ {
+ values[25] = BoolGetDatum(false); /* gss_auth */
+ nulls[26] = true; /* No GSS principal */
+ values[27] = BoolGetDatum(false); /* GSS Encryption not in
+ * use */
+ }
+ if (beentry->st_query_id == 0)
+ nulls[29] = true;
+ else
+ values[29] = UInt64GetDatum(beentry->st_query_id);
+ }
+ else
+ {
+ /* No permissions to view data about this session */
+ values[5] = CStringGetTextDatum("<insufficient privilege>");
+ nulls[4] = true;
+ nulls[6] = true;
+ nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ nulls[10] = true;
+ nulls[11] = true;
+ nulls[12] = true;
+ nulls[13] = true;
+ nulls[14] = true;
+ nulls[17] = true;
+ nulls[18] = true;
+ nulls[19] = true;
+ nulls[20] = true;
+ nulls[21] = true;
+ nulls[22] = true;
+ nulls[23] = true;
+ nulls[24] = true;
+ nulls[25] = true;
+ nulls[26] = true;
+ nulls[27] = true;
+ nulls[28] = true;
+ nulls[29] = true;
+ }
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+
+ /* If only a single backend was requested, and we found it, break. */
+ if (pid != -1)
+ break;
+ }
+
+ return (Datum) 0;
+}
+
+
+Datum
+pg_backend_pid(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT32(MyProcPid);
+}
+
+
+Datum
+pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT32(beentry->st_procpid);
+}
+
+
+Datum
+pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(beentry->st_databaseid);
+}
+
+
+Datum
+pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(beentry->st_userid);
+}
+
+
+Datum
+pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+ const char *activity;
+ char *clipped_activity;
+ text *ret;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ activity = "<backend information not available>";
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ activity = "<insufficient privilege>";
+ else if (*(beentry->st_activity_raw) == '\0')
+ activity = "<command string not enabled>";
+ else
+ activity = beentry->st_activity_raw;
+
+ clipped_activity = pgstat_clip_activity(activity);
+ ret = cstring_to_text(activity);
+ pfree(clipped_activity);
+
+ PG_RETURN_TEXT_P(ret);
+}
+
+Datum
+pg_stat_get_backend_wait_event_type(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+ PGPROC *proc;
+ const char *wait_event_type = NULL;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ wait_event_type = "<backend information not available>";
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ wait_event_type = "<insufficient privilege>";
+ else if ((proc = BackendPidGetProc(beentry->st_procpid)) != NULL)
+ wait_event_type = pgstat_get_wait_event_type(proc->wait_event_info);
+
+ if (!wait_event_type)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(cstring_to_text(wait_event_type));
+}
+
+Datum
+pg_stat_get_backend_wait_event(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+ PGPROC *proc;
+ const char *wait_event = NULL;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ wait_event = "<backend information not available>";
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ wait_event = "<insufficient privilege>";
+ else if ((proc = BackendPidGetProc(beentry->st_procpid)) != NULL)
+ wait_event = pgstat_get_wait_event(proc->wait_event_info);
+
+ if (!wait_event)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(cstring_to_text(wait_event));
+}
+
+
+Datum
+pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ TimestampTz result;
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ PG_RETURN_NULL();
+
+ result = beentry->st_activity_start_timestamp;
+
+ /*
+ * No time recorded for start of current query -- this is the case if the
+ * user hasn't enabled query-level stats collection.
+ */
+ if (result == 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+
+Datum
+pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ TimestampTz result;
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ PG_RETURN_NULL();
+
+ result = beentry->st_xact_start_timestamp;
+
+ if (result == 0) /* not in a transaction */
+ PG_RETURN_NULL();
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+
+Datum
+pg_stat_get_backend_start(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ TimestampTz result;
+ PgBackendStatus *beentry;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ PG_RETURN_NULL();
+
+ result = beentry->st_proc_start_timestamp;
+
+ if (result == 0) /* probably can't happen? */
+ PG_RETURN_NULL();
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+
+Datum
+pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+ SockAddr zero_clientaddr;
+ char remote_host[NI_MAXHOST];
+ int ret;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ PG_RETURN_NULL();
+
+ /* A zeroed client addr means we don't know */
+ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+ if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
+ sizeof(zero_clientaddr)) == 0)
+ PG_RETURN_NULL();
+
+ switch (beentry->st_clientaddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ default:
+ PG_RETURN_NULL();
+ }
+
+ remote_host[0] = '\0';
+ ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
+ beentry->st_clientaddr.salen,
+ remote_host, sizeof(remote_host),
+ NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host);
+
+ PG_RETURN_INET_P(DirectFunctionCall1(inet_in,
+ CStringGetDatum(remote_host)));
+}
+
+Datum
+pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
+{
+ int32 beid = PG_GETARG_INT32(0);
+ PgBackendStatus *beentry;
+ SockAddr zero_clientaddr;
+ char remote_port[NI_MAXSERV];
+ int ret;
+
+ if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
+ PG_RETURN_NULL();
+
+ else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid))
+ PG_RETURN_NULL();
+
+ /* A zeroed client addr means we don't know */
+ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+ if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
+ sizeof(zero_clientaddr)) == 0)
+ PG_RETURN_NULL();
+
+ switch (beentry->st_clientaddr.addr.ss_family)
+ {
+ case AF_INET:
+#ifdef HAVE_IPV6
+ case AF_INET6:
+#endif
+ break;
+ case AF_UNIX:
+ PG_RETURN_INT32(-1);
+ default:
+ PG_RETURN_NULL();
+ }
+
+ remote_port[0] = '\0';
+ ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
+ beentry->st_clientaddr.salen,
+ NULL, 0,
+ remote_port, sizeof(remote_port),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret != 0)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(DirectFunctionCall1(int4in,
+ CStringGetDatum(remote_port)));
+}
+
+
+Datum
+pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int32 result;
+ int tot_backends = pgstat_fetch_stat_numbackends();
+ int beid;
+
+ result = 0;
+ for (beid = 1; beid <= tot_backends; beid++)
+ {
+ PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
+
+ if (beentry && beentry->st_databaseid == dbid)
+ result++;
+ }
+
+ PG_RETURN_INT32(result);
+}
+
+
+Datum
+pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_xact_commit);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_xact_rollback);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_blocks_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_blocks_hit);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_tuples_returned);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_tuples_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_tuples_inserted);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_tuples_updated);
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_tuples_deleted);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = dbentry->stat_reset_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_db_temp_files(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = dbentry->n_temp_files;
+
+ PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = dbentry->n_temp_bytes;
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_tablespace);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_lock);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_snapshot);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_bufferpin);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_startup_deadlock);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_conflict_tablespace +
+ dbentry->n_conflict_lock +
+ dbentry->n_conflict_snapshot +
+ dbentry->n_conflict_bufferpin +
+ dbentry->n_conflict_startup_deadlock);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_deadlocks);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_checksum_failures(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_StatDBEntry *dbentry;
+
+ if (!DataChecksumsEnabled())
+ PG_RETURN_NULL();
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (dbentry->n_checksum_failures);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_checksum_last_failure(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatDBEntry *dbentry;
+
+ if (!DataChecksumsEnabled())
+ PG_RETURN_NULL();
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = dbentry->last_checksum_failure;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+Datum
+pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ double result;
+ PgStat_StatDBEntry *dbentry;
+
+ /* convert counter from microsec to millisec for display */
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = ((double) dbentry->n_block_read_time) / 1000.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ double result;
+ PgStat_StatDBEntry *dbentry;
+
+ /* convert counter from microsec to millisec for display */
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
+ result = 0;
+ else
+ result = ((double) dbentry->n_block_write_time) / 1000.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+pg_stat_get_db_session_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ double result = 0.0;
+ PgStat_StatDBEntry *dbentry;
+
+ /* convert counter from microsec to millisec for display */
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = ((double) dbentry->total_session_time) / 1000.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+pg_stat_get_db_active_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ double result = 0.0;
+ PgStat_StatDBEntry *dbentry;
+
+ /* convert counter from microsec to millisec for display */
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = ((double) dbentry->total_active_time) / 1000.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+pg_stat_get_db_idle_in_transaction_time(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ double result = 0.0;
+ PgStat_StatDBEntry *dbentry;
+
+ /* convert counter from microsec to millisec for display */
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = ((double) dbentry->total_idle_in_xact_time) / 1000.0;
+
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+pg_stat_get_db_sessions(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result = 0;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = (int64) (dbentry->n_sessions);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_sessions_abandoned(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result = 0;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = (int64) (dbentry->n_sessions_abandoned);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_sessions_fatal(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result = 0;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = (int64) (dbentry->n_sessions_fatal);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_db_sessions_killed(PG_FUNCTION_ARGS)
+{
+ Oid dbid = PG_GETARG_OID(0);
+ int64 result = 0;
+ PgStat_StatDBEntry *dbentry;
+
+ if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) != NULL)
+ result = (int64) (dbentry->n_sessions_killed);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->timed_checkpoints);
+}
+
+Datum
+pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->requested_checkpoints);
+}
+
+Datum
+pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_written_checkpoints);
+}
+
+Datum
+pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_bgwriter()->buf_written_clean);
+}
+
+Datum
+pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_bgwriter()->maxwritten_clean);
+}
+
+Datum
+pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS)
+{
+ /* time is already in msec, just convert to double for presentation */
+ PG_RETURN_FLOAT8((double)
+ pgstat_fetch_stat_checkpointer()->checkpoint_write_time);
+}
+
+Datum
+pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS)
+{
+ /* time is already in msec, just convert to double for presentation */
+ PG_RETURN_FLOAT8((double)
+ pgstat_fetch_stat_checkpointer()->checkpoint_sync_time);
+}
+
+Datum
+pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(pgstat_fetch_stat_bgwriter()->stat_reset_timestamp);
+}
+
+Datum
+pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_written_backend);
+}
+
+Datum
+pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_fsync_backend);
+}
+
+Datum
+pg_stat_get_buf_alloc(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT64(pgstat_fetch_stat_bgwriter()->buf_alloc);
+}
+
+/*
+ * Returns statistics of WAL activity
+ */
+Datum
+pg_stat_get_wal(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_WAL_COLS 9
+ TupleDesc tupdesc;
+ Datum values[PG_STAT_GET_WAL_COLS];
+ bool nulls[PG_STAT_GET_WAL_COLS];
+ char buf[256];
+ PgStat_WalStats *wal_stats;
+
+ /* Initialise values and NULL flags arrays */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ /* Initialise attributes information in the tuple descriptor */
+ tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_WAL_COLS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "wal_records",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "wal_fpi",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "wal_bytes",
+ NUMERICOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "wal_buffers_full",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "wal_write",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "wal_sync",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "wal_write_time",
+ FLOAT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "wal_sync_time",
+ FLOAT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "stats_reset",
+ TIMESTAMPTZOID, -1, 0);
+
+ BlessTupleDesc(tupdesc);
+
+ /* Get statistics about WAL activity */
+ wal_stats = pgstat_fetch_stat_wal();
+
+ /* Fill values and NULLs */
+ values[0] = Int64GetDatum(wal_stats->wal_records);
+ values[1] = Int64GetDatum(wal_stats->wal_fpi);
+
+ /* Convert to numeric. */
+ snprintf(buf, sizeof buf, UINT64_FORMAT, wal_stats->wal_bytes);
+ values[2] = DirectFunctionCall3(numeric_in,
+ CStringGetDatum(buf),
+ ObjectIdGetDatum(0),
+ Int32GetDatum(-1));
+
+ values[3] = Int64GetDatum(wal_stats->wal_buffers_full);
+ values[4] = Int64GetDatum(wal_stats->wal_write);
+ values[5] = Int64GetDatum(wal_stats->wal_sync);
+
+ /* Convert counters from microsec to millisec for display */
+ values[6] = Float8GetDatum(((double) wal_stats->wal_write_time) / 1000.0);
+ values[7] = Float8GetDatum(((double) wal_stats->wal_sync_time) / 1000.0);
+
+ values[8] = TimestampTzGetDatum(wal_stats->stat_reset_timestamp);
+
+ /* Returns the record as Datum */
+ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
+}
+
+/*
+ * Returns statistics of SLRU caches.
+ */
+Datum
+pg_stat_get_slru(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_SLRU_COLS 9
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ int i;
+ PgStat_SLRUStats *stats;
+
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* request SLRU stats from the cumulative stats system */
+ stats = pgstat_fetch_slru();
+
+ for (i = 0;; i++)
+ {
+ /* for each row */
+ Datum values[PG_STAT_GET_SLRU_COLS];
+ bool nulls[PG_STAT_GET_SLRU_COLS];
+ PgStat_SLRUStats stat;
+ const char *name;
+
+ name = pgstat_get_slru_name(i);
+
+ if (!name)
+ break;
+
+ stat = stats[i];
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ values[0] = PointerGetDatum(cstring_to_text(name));
+ values[1] = Int64GetDatum(stat.blocks_zeroed);
+ values[2] = Int64GetDatum(stat.blocks_hit);
+ values[3] = Int64GetDatum(stat.blocks_read);
+ values[4] = Int64GetDatum(stat.blocks_written);
+ values[5] = Int64GetDatum(stat.blocks_exists);
+ values[6] = Int64GetDatum(stat.flush);
+ values[7] = Int64GetDatum(stat.truncate);
+ values[8] = TimestampTzGetDatum(stat.stat_reset_timestamp);
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ return (Datum) 0;
+}
+
+Datum
+pg_stat_get_xact_numscans(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_numscans);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_returned);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+ PgStat_TableXactStatus *trans;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ {
+ result = tabentry->t_counts.t_tuples_inserted;
+ /* live subtransactions' counts aren't in t_tuples_inserted yet */
+ for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
+ result += trans->tuples_inserted;
+ }
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+ PgStat_TableXactStatus *trans;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ {
+ result = tabentry->t_counts.t_tuples_updated;
+ /* live subtransactions' counts aren't in t_tuples_updated yet */
+ for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
+ result += trans->tuples_updated;
+ }
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+ PgStat_TableXactStatus *trans;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ {
+ result = tabentry->t_counts.t_tuples_deleted;
+ /* live subtransactions' counts aren't in t_tuples_deleted yet */
+ for (trans = tabentry->trans; trans != NULL; trans = trans->upper)
+ result += trans->tuples_deleted;
+ }
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_tuples_hot_updated);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_blocks_fetched);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ int64 result;
+ PgStat_TableStatus *tabentry;
+
+ if ((tabentry = find_tabstat_entry(relid)) == NULL)
+ result = 0;
+ else
+ result = (int64) (tabentry->t_counts.t_blocks_hit);
+
+ PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = find_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_INT64(funcentry->f_counts.f_numcalls);
+}
+
+Datum
+pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = find_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_total_time));
+}
+
+Datum
+pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ PgStat_BackendFunctionEntry *funcentry;
+
+ if ((funcentry = find_funcstat_entry(funcid)) == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time));
+}
+
+
+/* Get the timestamp of the current statistics snapshot */
+Datum
+pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS)
+{
+ bool have_snapshot;
+ TimestampTz ts;
+
+ ts = pgstat_get_stat_snapshot_timestamp(&have_snapshot);
+
+ if (!have_snapshot)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TIMESTAMPTZ(ts);
+}
+
+/* Discard the active statistics snapshot */
+Datum
+pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
+{
+ pgstat_clear_snapshot();
+
+ PG_RETURN_VOID();
+}
+
+
+/* Force statistics to be reported at the next occasion */
+Datum
+pg_stat_force_next_flush(PG_FUNCTION_ARGS)
+{
+ pgstat_force_next_flush();
+
+ PG_RETURN_VOID();
+}
+
+
+/* Reset all counters for the current database */
+Datum
+pg_stat_reset(PG_FUNCTION_ARGS)
+{
+ pgstat_reset_counters();
+
+ PG_RETURN_VOID();
+}
+
+/* Reset some shared cluster-wide counters */
+Datum
+pg_stat_reset_shared(PG_FUNCTION_ARGS)
+{
+ char *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
+
+ if (strcmp(target, "archiver") == 0)
+ pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER);
+ else if (strcmp(target, "bgwriter") == 0)
+ {
+ /*
+ * Historically checkpointer was part of bgwriter, continue to reset
+ * both for now.
+ */
+ pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER);
+ pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER);
+ }
+ else if (strcmp(target, "recovery_prefetch") == 0)
+ XLogPrefetchResetStats();
+ else if (strcmp(target, "wal") == 0)
+ pgstat_reset_of_kind(PGSTAT_KIND_WAL);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized reset target: \"%s\"", target),
+ errhint("Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\".")));
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * Reset a statistics for a single object, which may be of current
+ * database or shared across all databases in the cluster.
+ */
+Datum
+pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS)
+{
+ Oid taboid = PG_GETARG_OID(0);
+ Oid dboid = (IsSharedRelation(taboid) ? InvalidOid : MyDatabaseId);
+
+ pgstat_reset(PGSTAT_KIND_RELATION, dboid, taboid);
+
+ PG_RETURN_VOID();
+}
+
+Datum
+pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS)
+{
+ Oid funcoid = PG_GETARG_OID(0);
+
+ pgstat_reset(PGSTAT_KIND_FUNCTION, MyDatabaseId, funcoid);
+
+ PG_RETURN_VOID();
+}
+
+/* Reset SLRU counters (a specific one or all of them). */
+Datum
+pg_stat_reset_slru(PG_FUNCTION_ARGS)
+{
+ char *target = NULL;
+
+ if (PG_ARGISNULL(0))
+ pgstat_reset_of_kind(PGSTAT_KIND_SLRU);
+ else
+ {
+ target = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ pgstat_reset_slru(target);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/* Reset replication slots stats (a specific one or all of them). */
+Datum
+pg_stat_reset_replication_slot(PG_FUNCTION_ARGS)
+{
+ char *target = NULL;
+
+ if (PG_ARGISNULL(0))
+ pgstat_reset_of_kind(PGSTAT_KIND_REPLSLOT);
+ else
+ {
+ target = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ pgstat_reset_replslot(target);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/* Reset subscription stats (a specific one or all of them) */
+Datum
+pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS)
+{
+ Oid subid;
+
+ if (PG_ARGISNULL(0))
+ {
+ /* Clear all subscription stats */
+ pgstat_reset_of_kind(PGSTAT_KIND_SUBSCRIPTION);
+ }
+ else
+ {
+ subid = PG_GETARG_OID(0);
+
+ if (!OidIsValid(subid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid subscription OID %u", subid)));
+ pgstat_reset(PGSTAT_KIND_SUBSCRIPTION, InvalidOid, subid);
+ }
+
+ PG_RETURN_VOID();
+}
+
+Datum
+pg_stat_get_archiver(PG_FUNCTION_ARGS)
+{
+ TupleDesc tupdesc;
+ Datum values[7];
+ bool nulls[7];
+ PgStat_ArchiverStats *archiver_stats;
+
+ /* Initialise values and NULL flags arrays */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ /* Initialise attributes information in the tuple descriptor */
+ tupdesc = CreateTemplateTupleDesc(7);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "archived_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "last_archived_wal",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "last_archived_time",
+ TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "failed_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "last_failed_wal",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "last_failed_time",
+ TIMESTAMPTZOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stats_reset",
+ TIMESTAMPTZOID, -1, 0);
+
+ BlessTupleDesc(tupdesc);
+
+ /* Get statistics about the archiver process */
+ archiver_stats = pgstat_fetch_stat_archiver();
+
+ /* Fill values and NULLs */
+ values[0] = Int64GetDatum(archiver_stats->archived_count);
+ if (*(archiver_stats->last_archived_wal) == '\0')
+ nulls[1] = true;
+ else
+ values[1] = CStringGetTextDatum(archiver_stats->last_archived_wal);
+
+ if (archiver_stats->last_archived_timestamp == 0)
+ nulls[2] = true;
+ else
+ values[2] = TimestampTzGetDatum(archiver_stats->last_archived_timestamp);
+
+ values[3] = Int64GetDatum(archiver_stats->failed_count);
+ if (*(archiver_stats->last_failed_wal) == '\0')
+ nulls[4] = true;
+ else
+ values[4] = CStringGetTextDatum(archiver_stats->last_failed_wal);
+
+ if (archiver_stats->last_failed_timestamp == 0)
+ nulls[5] = true;
+ else
+ values[5] = TimestampTzGetDatum(archiver_stats->last_failed_timestamp);
+
+ if (archiver_stats->stat_reset_timestamp == 0)
+ nulls[6] = true;
+ else
+ values[6] = TimestampTzGetDatum(archiver_stats->stat_reset_timestamp);
+
+ /* Returns the record as Datum */
+ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
+}
+
+/*
+ * Get the statistics for the replication slot. If the slot statistics is not
+ * available, return all-zeroes stats.
+ */
+Datum
+pg_stat_get_replication_slot(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_REPLICATION_SLOT_COLS 10
+ text *slotname_text = PG_GETARG_TEXT_P(0);
+ NameData slotname;
+ TupleDesc tupdesc;
+ Datum values[PG_STAT_GET_REPLICATION_SLOT_COLS];
+ bool nulls[PG_STAT_GET_REPLICATION_SLOT_COLS];
+ PgStat_StatReplSlotEntry *slotent;
+ PgStat_StatReplSlotEntry allzero;
+
+ /* Initialise values and NULL flags arrays */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ /* Initialise attributes information in the tuple descriptor */
+ tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_REPLICATION_SLOT_COLS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "slot_name",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "spill_txns",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "spill_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "spill_bytes",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "stream_txns",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "stream_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "stream_bytes",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "total_txns",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "total_bytes",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "stats_reset",
+ TIMESTAMPTZOID, -1, 0);
+ BlessTupleDesc(tupdesc);
+
+ namestrcpy(&slotname, text_to_cstring(slotname_text));
+ slotent = pgstat_fetch_replslot(slotname);
+ if (!slotent)
+ {
+ /*
+ * If the slot is not found, initialise its stats. This is possible if
+ * the create slot message is lost.
+ */
+ memset(&allzero, 0, sizeof(PgStat_StatReplSlotEntry));
+ slotent = &allzero;
+ }
+
+ values[0] = CStringGetTextDatum(NameStr(slotname));
+ values[1] = Int64GetDatum(slotent->spill_txns);
+ values[2] = Int64GetDatum(slotent->spill_count);
+ values[3] = Int64GetDatum(slotent->spill_bytes);
+ values[4] = Int64GetDatum(slotent->stream_txns);
+ values[5] = Int64GetDatum(slotent->stream_count);
+ values[6] = Int64GetDatum(slotent->stream_bytes);
+ values[7] = Int64GetDatum(slotent->total_txns);
+ values[8] = Int64GetDatum(slotent->total_bytes);
+
+ if (slotent->stat_reset_timestamp == 0)
+ nulls[9] = true;
+ else
+ values[9] = TimestampTzGetDatum(slotent->stat_reset_timestamp);
+
+ /* Returns the record as Datum */
+ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
+}
+
+/*
+ * Get the subscription statistics for the given subscription. If the
+ * subscription statistics is not available, return all-zeros stats.
+ */
+Datum
+pg_stat_get_subscription_stats(PG_FUNCTION_ARGS)
+{
+#define PG_STAT_GET_SUBSCRIPTION_STATS_COLS 4
+ Oid subid = PG_GETARG_OID(0);
+ TupleDesc tupdesc;
+ Datum values[PG_STAT_GET_SUBSCRIPTION_STATS_COLS];
+ bool nulls[PG_STAT_GET_SUBSCRIPTION_STATS_COLS];
+ PgStat_StatSubEntry *subentry;
+ PgStat_StatSubEntry allzero;
+
+ /* Get subscription stats */
+ subentry = pgstat_fetch_stat_subscription(subid);
+
+ /* Initialise attributes information in the tuple descriptor */
+ tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_SUBSCRIPTION_STATS_COLS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "subid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "apply_error_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "sync_error_count",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "stats_reset",
+ TIMESTAMPTZOID, -1, 0);
+ BlessTupleDesc(tupdesc);
+
+ /* Initialise values and NULL flags arrays */
+ MemSet(values, 0, sizeof(values));
+ MemSet(nulls, 0, sizeof(nulls));
+
+ if (!subentry)
+ {
+ /* If the subscription is not found, initialise its stats */
+ memset(&allzero, 0, sizeof(PgStat_StatSubEntry));
+ subentry = &allzero;
+ }
+
+ /* subid */
+ values[0] = ObjectIdGetDatum(subid);
+
+ /* apply_error_count */
+ values[1] = Int64GetDatum(subentry->apply_error_count);
+
+ /* sync_error_count */
+ values[2] = Int64GetDatum(subentry->sync_error_count);
+
+ /* stats_reset */
+ if (subentry->stat_reset_timestamp == 0)
+ nulls[3] = true;
+ else
+ values[3] = TimestampTzGetDatum(subentry->stat_reset_timestamp);
+
+ /* Returns the record as Datum */
+ PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
+}
+
+/*
+ * Checks for presence of stats for object with provided kind, database oid,
+ * object oid.
+ *
+ * This is useful for tests, but not really anything else. Therefore not
+ * documented.
+ */
+Datum
+pg_stat_have_stats(PG_FUNCTION_ARGS)
+{
+ char *stats_type = text_to_cstring(PG_GETARG_TEXT_P(0));
+ Oid dboid = PG_GETARG_OID(1);
+ Oid objoid = PG_GETARG_OID(2);
+ PgStat_Kind kind = pgstat_get_kind_from_str(stats_type);
+
+ PG_RETURN_BOOL(pgstat_have_entry(kind, dboid, objoid));
+}
diff --git a/src/backend/utils/adt/pseudotypes.c b/src/backend/utils/adt/pseudotypes.c
new file mode 100644
index 0000000..c820250
--- /dev/null
+++ b/src/backend/utils/adt/pseudotypes.c
@@ -0,0 +1,391 @@
+/*-------------------------------------------------------------------------
+ *
+ * pseudotypes.c
+ * Functions for the system pseudo-types.
+ *
+ * A pseudo-type isn't really a type and never has any operations, but
+ * we do need to supply input and output functions to satisfy the links
+ * in the pseudo-type's entry in pg_type. In most cases the functions
+ * just throw an error if invoked. (XXX the error messages here cover
+ * the most common case, but might be confusing in some contexts. Can
+ * we do better?)
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/pseudotypes.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "libpq/pqformat.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/rangetypes.h"
+#include "utils/multirangetypes.h"
+
+
+/*
+ * These macros generate input and output functions for a pseudo-type that
+ * will reject all input and output attempts. (But for some types, only
+ * the input function need be dummy.)
+ */
+#define PSEUDOTYPE_DUMMY_INPUT_FUNC(typname) \
+Datum \
+typname##_in(PG_FUNCTION_ARGS) \
+{ \
+ ereport(ERROR, \
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
+ errmsg("cannot accept a value of type %s", #typname))); \
+\
+ PG_RETURN_VOID(); /* keep compiler quiet */ \
+} \
+\
+extern int no_such_variable
+
+#define PSEUDOTYPE_DUMMY_IO_FUNCS(typname) \
+PSEUDOTYPE_DUMMY_INPUT_FUNC(typname); \
+\
+Datum \
+typname##_out(PG_FUNCTION_ARGS) \
+{ \
+ ereport(ERROR, \
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
+ errmsg("cannot display a value of type %s", #typname))); \
+\
+ PG_RETURN_VOID(); /* keep compiler quiet */ \
+} \
+\
+extern int no_such_variable
+
+/*
+ * Likewise for binary send/receive functions. We don't bother with these
+ * at all for many pseudotypes, but some have them. (By convention, if
+ * a type has a send function it should have a receive function, even if
+ * that's only dummy.)
+ */
+#define PSEUDOTYPE_DUMMY_RECEIVE_FUNC(typname) \
+Datum \
+typname##_recv(PG_FUNCTION_ARGS) \
+{ \
+ ereport(ERROR, \
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
+ errmsg("cannot accept a value of type %s", #typname))); \
+\
+ PG_RETURN_VOID(); /* keep compiler quiet */ \
+} \
+\
+extern int no_such_variable
+
+#define PSEUDOTYPE_DUMMY_BINARY_IO_FUNCS(typname) \
+PSEUDOTYPE_DUMMY_RECEIVE_FUNC(typname); \
+\
+Datum \
+typname##_send(PG_FUNCTION_ARGS) \
+{ \
+ ereport(ERROR, \
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
+ errmsg("cannot display a value of type %s", #typname))); \
+\
+ PG_RETURN_VOID(); /* keep compiler quiet */ \
+} \
+\
+extern int no_such_variable
+
+
+/*
+ * cstring
+ *
+ * cstring is marked as a pseudo-type because we don't want people using it
+ * in tables. But it's really a perfectly functional type, so provide
+ * a full set of working I/O functions for it. Among other things, this
+ * allows manual invocation of datatype I/O functions, along the lines of
+ * "SELECT foo_in('blah')" or "SELECT foo_out(some-foo-value)".
+ */
+Datum
+cstring_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_CSTRING(pstrdup(str));
+}
+
+Datum
+cstring_out(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_CSTRING(pstrdup(str));
+}
+
+Datum
+cstring_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ PG_RETURN_CSTRING(str);
+}
+
+Datum
+cstring_send(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, str, strlen(str));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * anyarray
+ *
+ * We need to allow output of anyarray so that, e.g., pg_statistic columns
+ * can be printed. Input has to be disallowed, however.
+ *
+ * XXX anyarray_recv could actually be made to work, since the incoming
+ * array data would contain the element type OID. It seems unlikely that
+ * it'd be sufficiently type-safe, though.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anyarray);
+PSEUDOTYPE_DUMMY_RECEIVE_FUNC(anyarray);
+
+Datum
+anyarray_out(PG_FUNCTION_ARGS)
+{
+ return array_out(fcinfo);
+}
+
+Datum
+anyarray_send(PG_FUNCTION_ARGS)
+{
+ return array_send(fcinfo);
+}
+
+/*
+ * anycompatiblearray
+ *
+ * We may as well allow output, since we do for anyarray.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anycompatiblearray);
+PSEUDOTYPE_DUMMY_RECEIVE_FUNC(anycompatiblearray);
+
+Datum
+anycompatiblearray_out(PG_FUNCTION_ARGS)
+{
+ return array_out(fcinfo);
+}
+
+Datum
+anycompatiblearray_send(PG_FUNCTION_ARGS)
+{
+ return array_send(fcinfo);
+}
+
+/*
+ * anyenum
+ *
+ * We may as well allow output, since enum_out will in fact work.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anyenum);
+
+Datum
+anyenum_out(PG_FUNCTION_ARGS)
+{
+ return enum_out(fcinfo);
+}
+
+/*
+ * anyrange
+ *
+ * We may as well allow output, since range_out will in fact work.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anyrange);
+
+Datum
+anyrange_out(PG_FUNCTION_ARGS)
+{
+ return range_out(fcinfo);
+}
+
+/*
+ * anycompatiblerange
+ *
+ * We may as well allow output, since range_out will in fact work.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anycompatiblerange);
+
+Datum
+anycompatiblerange_out(PG_FUNCTION_ARGS)
+{
+ return range_out(fcinfo);
+}
+
+/*
+ * anycompatiblemultirange
+ *
+ * We may as well allow output, since multirange_out will in fact work.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(anycompatiblemultirange);
+
+Datum
+anycompatiblemultirange_out(PG_FUNCTION_ARGS)
+{
+ return multirange_out(fcinfo);
+}
+
+/*
+ * anymultirange_in - input routine for pseudo-type ANYMULTIRANGE.
+ */
+Datum
+anymultirange_in(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot accept a value of type %s", "anymultirange")));
+
+ PG_RETURN_VOID(); /* keep compiler quiet */
+}
+
+/*
+ * anymultirange_out - output routine for pseudo-type ANYMULTIRANGE.
+ *
+ * We may as well allow this, since multirange_out will in fact work.
+ */
+Datum
+anymultirange_out(PG_FUNCTION_ARGS)
+{
+ return multirange_out(fcinfo);
+}
+
+/*
+ * void
+ *
+ * We support void_in so that PL functions can return VOID without any
+ * special hack in the PL handler. Whatever value the PL thinks it's
+ * returning will just be ignored. Conversely, void_out and void_send
+ * are needed so that "SELECT function_returning_void(...)" works.
+ */
+Datum
+void_in(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_VOID(); /* you were expecting something different? */
+}
+
+Datum
+void_out(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_CSTRING(pstrdup(""));
+}
+
+Datum
+void_recv(PG_FUNCTION_ARGS)
+{
+ /*
+ * Note that since we consume no bytes, an attempt to send anything but an
+ * empty string will result in an "invalid message format" error.
+ */
+ PG_RETURN_VOID();
+}
+
+Datum
+void_send(PG_FUNCTION_ARGS)
+{
+ StringInfoData buf;
+
+ /* send an empty string */
+ pq_begintypsend(&buf);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * shell
+ *
+ * shell_in and shell_out are entered in pg_type for "shell" types
+ * (those not yet filled in). They should be unreachable, but we
+ * set them up just in case some code path tries to do I/O without
+ * having checked pg_type.typisdefined anywhere along the way.
+ */
+Datum
+shell_in(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot accept a value of a shell type")));
+
+ PG_RETURN_VOID(); /* keep compiler quiet */
+}
+
+Datum
+shell_out(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot display a value of a shell type")));
+
+ PG_RETURN_VOID(); /* keep compiler quiet */
+}
+
+
+/*
+ * pg_node_tree
+ *
+ * pg_node_tree isn't really a pseudotype --- it's real enough to be a table
+ * column --- but it presently has no operations of its own, and disallows
+ * input too, so its I/O functions seem to fit here as much as anywhere.
+ *
+ * We must disallow input of pg_node_tree values because the SQL functions
+ * that operate on the type are not secure against malformed input.
+ * We do want to allow output, though.
+ */
+PSEUDOTYPE_DUMMY_INPUT_FUNC(pg_node_tree);
+PSEUDOTYPE_DUMMY_RECEIVE_FUNC(pg_node_tree);
+
+Datum
+pg_node_tree_out(PG_FUNCTION_ARGS)
+{
+ return textout(fcinfo);
+}
+
+Datum
+pg_node_tree_send(PG_FUNCTION_ARGS)
+{
+ return textsend(fcinfo);
+}
+
+/*
+ * pg_ddl_command
+ *
+ * Like pg_node_tree, pg_ddl_command isn't really a pseudotype; it's here
+ * for the same reasons as that one.
+ *
+ * We don't have any good way to output this type directly, so punt
+ * for output as well as input.
+ */
+PSEUDOTYPE_DUMMY_IO_FUNCS(pg_ddl_command);
+PSEUDOTYPE_DUMMY_BINARY_IO_FUNCS(pg_ddl_command);
+
+
+/*
+ * Dummy I/O functions for various other pseudotypes.
+ */
+PSEUDOTYPE_DUMMY_IO_FUNCS(any);
+PSEUDOTYPE_DUMMY_IO_FUNCS(trigger);
+PSEUDOTYPE_DUMMY_IO_FUNCS(event_trigger);
+PSEUDOTYPE_DUMMY_IO_FUNCS(language_handler);
+PSEUDOTYPE_DUMMY_IO_FUNCS(fdw_handler);
+PSEUDOTYPE_DUMMY_IO_FUNCS(table_am_handler);
+PSEUDOTYPE_DUMMY_IO_FUNCS(index_am_handler);
+PSEUDOTYPE_DUMMY_IO_FUNCS(tsm_handler);
+PSEUDOTYPE_DUMMY_IO_FUNCS(internal);
+PSEUDOTYPE_DUMMY_IO_FUNCS(anyelement);
+PSEUDOTYPE_DUMMY_IO_FUNCS(anynonarray);
+PSEUDOTYPE_DUMMY_IO_FUNCS(anycompatible);
+PSEUDOTYPE_DUMMY_IO_FUNCS(anycompatiblenonarray);
diff --git a/src/backend/utils/adt/quote.c b/src/backend/utils/adt/quote.c
new file mode 100644
index 0000000..0a46674
--- /dev/null
+++ b/src/backend/utils/adt/quote.c
@@ -0,0 +1,131 @@
+/*-------------------------------------------------------------------------
+ *
+ * quote.c
+ * Functions for quoting identifiers and literals
+ *
+ * Portions Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/quote.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "utils/builtins.h"
+
+
+/*
+ * quote_ident -
+ * returns a properly quoted identifier
+ */
+Datum
+quote_ident(PG_FUNCTION_ARGS)
+{
+ text *t = PG_GETARG_TEXT_PP(0);
+ const char *qstr;
+ char *str;
+
+ str = text_to_cstring(t);
+ qstr = quote_identifier(str);
+ PG_RETURN_TEXT_P(cstring_to_text(qstr));
+}
+
+/*
+ * quote_literal_internal -
+ * helper function for quote_literal and quote_literal_cstr
+ *
+ * NOTE: think not to make this function's behavior change with
+ * standard_conforming_strings. We don't know where the result
+ * literal will be used, and so we must generate a result that
+ * will work with either setting. Take a look at what dblink
+ * uses this for before thinking you know better.
+ */
+static size_t
+quote_literal_internal(char *dst, const char *src, size_t len)
+{
+ const char *s;
+ char *savedst = dst;
+
+ for (s = src; s < src + len; s++)
+ {
+ if (*s == '\\')
+ {
+ *dst++ = ESCAPE_STRING_SYNTAX;
+ break;
+ }
+ }
+
+ *dst++ = '\'';
+ while (len-- > 0)
+ {
+ if (SQL_STR_DOUBLE(*src, true))
+ *dst++ = *src;
+ *dst++ = *src++;
+ }
+ *dst++ = '\'';
+
+ return dst - savedst;
+}
+
+/*
+ * quote_literal -
+ * returns a properly quoted literal
+ */
+Datum
+quote_literal(PG_FUNCTION_ARGS)
+{
+ text *t = PG_GETARG_TEXT_PP(0);
+ text *result;
+ char *cp1;
+ char *cp2;
+ int len;
+
+ len = VARSIZE_ANY_EXHDR(t);
+ /* We make a worst-case result area; wasting a little space is OK */
+ result = (text *) palloc(len * 2 + 3 + VARHDRSZ);
+
+ cp1 = VARDATA_ANY(t);
+ cp2 = VARDATA(result);
+
+ SET_VARSIZE(result, VARHDRSZ + quote_literal_internal(cp2, cp1, len));
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * quote_literal_cstr -
+ * returns a properly quoted literal
+ */
+char *
+quote_literal_cstr(const char *rawstr)
+{
+ char *result;
+ int len;
+ int newlen;
+
+ len = strlen(rawstr);
+ /* We make a worst-case result area; wasting a little space is OK */
+ result = palloc(len * 2 + 3 + 1);
+
+ newlen = quote_literal_internal(result, rawstr, len);
+ result[newlen] = '\0';
+
+ return result;
+}
+
+/*
+ * quote_nullable -
+ * Returns a properly quoted literal, with null values returned
+ * as the text string 'NULL'.
+ */
+Datum
+quote_nullable(PG_FUNCTION_ARGS)
+{
+ if (PG_ARGISNULL(0))
+ PG_RETURN_TEXT_P(cstring_to_text("NULL"));
+ else
+ PG_RETURN_DATUM(DirectFunctionCall1(quote_literal,
+ PG_GETARG_DATUM(0)));
+}
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
new file mode 100644
index 0000000..db980c2
--- /dev/null
+++ b/src/backend/utils/adt/rangetypes.c
@@ -0,0 +1,2622 @@
+/*-------------------------------------------------------------------------
+ *
+ * rangetypes.c
+ * I/O functions, operators, and support functions for range types.
+ *
+ * The stored (serialized) format of a range value is:
+ *
+ * 4 bytes: varlena header
+ * 4 bytes: range type's OID
+ * Lower boundary value, if any, aligned according to subtype's typalign
+ * Upper boundary value, if any, aligned according to subtype's typalign
+ * 1 byte for flags
+ *
+ * This representation is chosen to avoid needing any padding before the
+ * lower boundary value, even when it requires double alignment. We can
+ * expect that the varlena header is presented to us on a suitably aligned
+ * boundary (possibly after detoasting), and then the lower boundary is too.
+ * Note that this means we can't work with a packed (short varlena header)
+ * value; we must detoast it first.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rangetypes.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/tupmacs.h"
+#include "common/hashfn.h"
+#include "lib/stringinfo.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "port/pg_bitutils.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/lsyscache.h"
+#include "utils/rangetypes.h"
+#include "utils/timestamp.h"
+
+
+/* fn_extra cache entry for one of the range I/O functions */
+typedef struct RangeIOData
+{
+ TypeCacheEntry *typcache; /* range type's typcache entry */
+ FmgrInfo typioproc; /* element type's I/O function */
+ Oid typioparam; /* element type's I/O parameter */
+} RangeIOData;
+
+
+static RangeIOData *get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid,
+ IOFuncSelector func);
+static char range_parse_flags(const char *flags_str);
+static void range_parse(const char *input_str, char *flags, char **lbound_str,
+ char **ubound_str);
+static const char *range_parse_bound(const char *string, const char *ptr,
+ char **bound_str, bool *infinite);
+static char *range_deparse(char flags, const char *lbound_str,
+ const char *ubound_str);
+static char *range_bound_escape(const char *value);
+static Size datum_compute_size(Size sz, Datum datum, bool typbyval,
+ char typalign, int16 typlen, char typstorage);
+static Pointer datum_write(Pointer ptr, Datum datum, bool typbyval,
+ char typalign, int16 typlen, char typstorage);
+
+
+/*
+ *----------------------------------------------------------
+ * I/O FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+Datum
+range_in(PG_FUNCTION_ARGS)
+{
+ char *input_str = PG_GETARG_CSTRING(0);
+ Oid rngtypoid = PG_GETARG_OID(1);
+ Oid typmod = PG_GETARG_INT32(2);
+ RangeType *range;
+ RangeIOData *cache;
+ char flags;
+ char *lbound_str;
+ char *ubound_str;
+ RangeBound lower;
+ RangeBound upper;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ cache = get_range_io_data(fcinfo, rngtypoid, IOFunc_input);
+
+ /* parse */
+ range_parse(input_str, &flags, &lbound_str, &ubound_str);
+
+ /* call element type's input function */
+ if (RANGE_HAS_LBOUND(flags))
+ lower.val = InputFunctionCall(&cache->typioproc, lbound_str,
+ cache->typioparam, typmod);
+ if (RANGE_HAS_UBOUND(flags))
+ upper.val = InputFunctionCall(&cache->typioproc, ubound_str,
+ cache->typioparam, typmod);
+
+ lower.infinite = (flags & RANGE_LB_INF) != 0;
+ lower.inclusive = (flags & RANGE_LB_INC) != 0;
+ lower.lower = true;
+ upper.infinite = (flags & RANGE_UB_INF) != 0;
+ upper.inclusive = (flags & RANGE_UB_INC) != 0;
+ upper.lower = false;
+
+ /* serialize and canonicalize */
+ range = make_range(cache->typcache, &lower, &upper, flags & RANGE_EMPTY);
+
+ PG_RETURN_RANGE_P(range);
+}
+
+Datum
+range_out(PG_FUNCTION_ARGS)
+{
+ RangeType *range = PG_GETARG_RANGE_P(0);
+ char *output_str;
+ RangeIOData *cache;
+ char flags;
+ char *lbound_str = NULL;
+ char *ubound_str = NULL;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ cache = get_range_io_data(fcinfo, RangeTypeGetOid(range), IOFunc_output);
+
+ /* deserialize */
+ range_deserialize(cache->typcache, range, &lower, &upper, &empty);
+ flags = range_get_flags(range);
+
+ /* call element type's output function */
+ if (RANGE_HAS_LBOUND(flags))
+ lbound_str = OutputFunctionCall(&cache->typioproc, lower.val);
+ if (RANGE_HAS_UBOUND(flags))
+ ubound_str = OutputFunctionCall(&cache->typioproc, upper.val);
+
+ /* construct result string */
+ output_str = range_deparse(flags, lbound_str, ubound_str);
+
+ PG_RETURN_CSTRING(output_str);
+}
+
+/*
+ * Binary representation: The first byte is the flags, then the lower bound
+ * (if present), then the upper bound (if present). Each bound is represented
+ * by a 4-byte length header and the binary representation of that bound (as
+ * returned by a call to the send function for the subtype).
+ */
+
+Datum
+range_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Oid rngtypoid = PG_GETARG_OID(1);
+ int32 typmod = PG_GETARG_INT32(2);
+ RangeType *range;
+ RangeIOData *cache;
+ char flags;
+ RangeBound lower;
+ RangeBound upper;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ cache = get_range_io_data(fcinfo, rngtypoid, IOFunc_receive);
+
+ /* receive the flags... */
+ flags = (unsigned char) pq_getmsgbyte(buf);
+
+ /*
+ * Mask out any unsupported flags, particularly RANGE_xB_NULL which would
+ * confuse following tests. Note that range_serialize will take care of
+ * cleaning up any inconsistencies in the remaining flags.
+ */
+ flags &= (RANGE_EMPTY |
+ RANGE_LB_INC |
+ RANGE_LB_INF |
+ RANGE_UB_INC |
+ RANGE_UB_INF);
+
+ /* receive the bounds ... */
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ uint32 bound_len = pq_getmsgint(buf, 4);
+ const char *bound_data = pq_getmsgbytes(buf, bound_len);
+ StringInfoData bound_buf;
+
+ initStringInfo(&bound_buf);
+ appendBinaryStringInfo(&bound_buf, bound_data, bound_len);
+
+ lower.val = ReceiveFunctionCall(&cache->typioproc,
+ &bound_buf,
+ cache->typioparam,
+ typmod);
+ pfree(bound_buf.data);
+ }
+ else
+ lower.val = (Datum) 0;
+
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ uint32 bound_len = pq_getmsgint(buf, 4);
+ const char *bound_data = pq_getmsgbytes(buf, bound_len);
+ StringInfoData bound_buf;
+
+ initStringInfo(&bound_buf);
+ appendBinaryStringInfo(&bound_buf, bound_data, bound_len);
+
+ upper.val = ReceiveFunctionCall(&cache->typioproc,
+ &bound_buf,
+ cache->typioparam,
+ typmod);
+ pfree(bound_buf.data);
+ }
+ else
+ upper.val = (Datum) 0;
+
+ pq_getmsgend(buf);
+
+ /* finish constructing RangeBound representation */
+ lower.infinite = (flags & RANGE_LB_INF) != 0;
+ lower.inclusive = (flags & RANGE_LB_INC) != 0;
+ lower.lower = true;
+ upper.infinite = (flags & RANGE_UB_INF) != 0;
+ upper.inclusive = (flags & RANGE_UB_INC) != 0;
+ upper.lower = false;
+
+ /* serialize and canonicalize */
+ range = make_range(cache->typcache, &lower, &upper, flags & RANGE_EMPTY);
+
+ PG_RETURN_RANGE_P(range);
+}
+
+Datum
+range_send(PG_FUNCTION_ARGS)
+{
+ RangeType *range = PG_GETARG_RANGE_P(0);
+ StringInfo buf = makeStringInfo();
+ RangeIOData *cache;
+ char flags;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ cache = get_range_io_data(fcinfo, RangeTypeGetOid(range), IOFunc_send);
+
+ /* deserialize */
+ range_deserialize(cache->typcache, range, &lower, &upper, &empty);
+ flags = range_get_flags(range);
+
+ /* construct output */
+ pq_begintypsend(buf);
+
+ pq_sendbyte(buf, flags);
+
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ Datum bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
+ lower.val));
+ uint32 bound_len = VARSIZE(bound) - VARHDRSZ;
+ char *bound_data = VARDATA(bound);
+
+ pq_sendint32(buf, bound_len);
+ pq_sendbytes(buf, bound_data, bound_len);
+ }
+
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ Datum bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
+ upper.val));
+ uint32 bound_len = VARSIZE(bound) - VARHDRSZ;
+ char *bound_data = VARDATA(bound);
+
+ pq_sendint32(buf, bound_len);
+ pq_sendbytes(buf, bound_data, bound_len);
+ }
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(buf));
+}
+
+/*
+ * get_range_io_data: get cached information needed for range type I/O
+ *
+ * The range I/O functions need a bit more cached info than other range
+ * functions, so they store a RangeIOData struct in fn_extra, not just a
+ * pointer to a type cache entry.
+ */
+static RangeIOData *
+get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid, IOFuncSelector func)
+{
+ RangeIOData *cache = (RangeIOData *) fcinfo->flinfo->fn_extra;
+
+ if (cache == NULL || cache->typcache->type_id != rngtypid)
+ {
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ char typdelim;
+ Oid typiofunc;
+
+ cache = (RangeIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(RangeIOData));
+ cache->typcache = lookup_type_cache(rngtypid, TYPECACHE_RANGE_INFO);
+ if (cache->typcache->rngelemtype == NULL)
+ elog(ERROR, "type %u is not a range type", rngtypid);
+
+ /* get_type_io_data does more than we need, but is convenient */
+ get_type_io_data(cache->typcache->rngelemtype->type_id,
+ func,
+ &typlen,
+ &typbyval,
+ &typalign,
+ &typdelim,
+ &cache->typioparam,
+ &typiofunc);
+
+ if (!OidIsValid(typiofunc))
+ {
+ /* this could only happen for receive or send */
+ if (func == IOFunc_receive)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary input function available for type %s",
+ format_type_be(cache->typcache->rngelemtype->type_id))));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary output function available for type %s",
+ format_type_be(cache->typcache->rngelemtype->type_id))));
+ }
+ fmgr_info_cxt(typiofunc, &cache->typioproc,
+ fcinfo->flinfo->fn_mcxt);
+
+ fcinfo->flinfo->fn_extra = (void *) cache;
+ }
+
+ return cache;
+}
+
+
+/*
+ *----------------------------------------------------------
+ * GENERIC FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+/* Construct standard-form range value from two arguments */
+Datum
+range_constructor2(PG_FUNCTION_ARGS)
+{
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
+ RangeType *range;
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+
+ typcache = range_get_typcache(fcinfo, rngtypid);
+
+ lower.val = PG_ARGISNULL(0) ? (Datum) 0 : arg1;
+ lower.infinite = PG_ARGISNULL(0);
+ lower.inclusive = true;
+ lower.lower = true;
+
+ upper.val = PG_ARGISNULL(1) ? (Datum) 0 : arg2;
+ upper.infinite = PG_ARGISNULL(1);
+ upper.inclusive = false;
+ upper.lower = false;
+
+ range = make_range(typcache, &lower, &upper, false);
+
+ PG_RETURN_RANGE_P(range);
+}
+
+/* Construct general range value from three arguments */
+Datum
+range_constructor3(PG_FUNCTION_ARGS)
+{
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
+ RangeType *range;
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ char flags;
+
+ typcache = range_get_typcache(fcinfo, rngtypid);
+
+ if (PG_ARGISNULL(2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("range constructor flags argument must not be null")));
+
+ flags = range_parse_flags(text_to_cstring(PG_GETARG_TEXT_PP(2)));
+
+ lower.val = PG_ARGISNULL(0) ? (Datum) 0 : arg1;
+ lower.infinite = PG_ARGISNULL(0);
+ lower.inclusive = (flags & RANGE_LB_INC) != 0;
+ lower.lower = true;
+
+ upper.val = PG_ARGISNULL(1) ? (Datum) 0 : arg2;
+ upper.infinite = PG_ARGISNULL(1);
+ upper.inclusive = (flags & RANGE_UB_INC) != 0;
+ upper.lower = false;
+
+ range = make_range(typcache, &lower, &upper, false);
+
+ PG_RETURN_RANGE_P(range);
+}
+
+
+/* range -> subtype functions */
+
+/* extract lower bound value */
+Datum
+range_lower(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ range_deserialize(typcache, r1, &lower, &upper, &empty);
+
+ /* Return NULL if there's no finite lower bound */
+ if (empty || lower.infinite)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(lower.val);
+}
+
+/* extract upper bound value */
+Datum
+range_upper(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ range_deserialize(typcache, r1, &lower, &upper, &empty);
+
+ /* Return NULL if there's no finite upper bound */
+ if (empty || upper.infinite)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(upper.val);
+}
+
+
+/* range -> bool functions */
+
+/* is range empty? */
+Datum
+range_empty(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ char flags = range_get_flags(r1);
+
+ PG_RETURN_BOOL(flags & RANGE_EMPTY);
+}
+
+/* is lower bound inclusive? */
+Datum
+range_lower_inc(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ char flags = range_get_flags(r1);
+
+ PG_RETURN_BOOL(flags & RANGE_LB_INC);
+}
+
+/* is upper bound inclusive? */
+Datum
+range_upper_inc(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ char flags = range_get_flags(r1);
+
+ PG_RETURN_BOOL(flags & RANGE_UB_INC);
+}
+
+/* is lower bound infinite? */
+Datum
+range_lower_inf(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ char flags = range_get_flags(r1);
+
+ PG_RETURN_BOOL(flags & RANGE_LB_INF);
+}
+
+/* is upper bound infinite? */
+Datum
+range_upper_inf(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ char flags = range_get_flags(r1);
+
+ PG_RETURN_BOOL(flags & RANGE_UB_INF);
+}
+
+
+/* range, element -> bool functions */
+
+/* contains? */
+Datum
+range_contains_elem(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ Datum val = PG_GETARG_DATUM(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ PG_RETURN_BOOL(range_contains_elem_internal(typcache, r, val));
+}
+
+/* contained by? */
+Datum
+elem_contained_by_range(PG_FUNCTION_ARGS)
+{
+ Datum val = PG_GETARG_DATUM(0);
+ RangeType *r = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ PG_RETURN_BOOL(range_contains_elem_internal(typcache, r, val));
+}
+
+
+/* range, range -> bool functions */
+
+/* equality (internal version) */
+bool
+range_eq_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ if (empty1 && empty2)
+ return true;
+ if (empty1 != empty2)
+ return false;
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) != 0)
+ return false;
+
+ if (range_cmp_bounds(typcache, &upper1, &upper2) != 0)
+ return false;
+
+ return true;
+}
+
+/* equality */
+Datum
+range_eq(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_eq_internal(typcache, r1, r2));
+}
+
+/* inequality (internal version) */
+bool
+range_ne_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ return (!range_eq_internal(typcache, r1, r2));
+}
+
+/* inequality */
+Datum
+range_ne(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_ne_internal(typcache, r1, r2));
+}
+
+/* contains? */
+Datum
+range_contains(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_contains_internal(typcache, r1, r2));
+}
+
+/* contained by? */
+Datum
+range_contained_by(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_contained_by_internal(typcache, r1, r2));
+}
+
+/* strictly left of? (internal version) */
+bool
+range_before_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range is neither before nor after any other range */
+ if (empty1 || empty2)
+ return false;
+
+ return (range_cmp_bounds(typcache, &upper1, &lower2) < 0);
+}
+
+/* strictly left of? */
+Datum
+range_before(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_before_internal(typcache, r1, r2));
+}
+
+/* strictly right of? (internal version) */
+bool
+range_after_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range is neither before nor after any other range */
+ if (empty1 || empty2)
+ return false;
+
+ return (range_cmp_bounds(typcache, &lower1, &upper2) > 0);
+}
+
+/* strictly right of? */
+Datum
+range_after(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_after_internal(typcache, r1, r2));
+}
+
+/*
+ * Check if two bounds A and B are "adjacent", where A is an upper bound and B
+ * is a lower bound. For the bounds to be adjacent, each subtype value must
+ * satisfy strictly one of the bounds: there are no values which satisfy both
+ * bounds (i.e. less than A and greater than B); and there are no values which
+ * satisfy neither bound (i.e. greater than A and less than B).
+ *
+ * For discrete ranges, we rely on the canonicalization function to see if A..B
+ * normalizes to empty. (If there is no canonicalization function, it's
+ * impossible for such a range to normalize to empty, so we needn't bother to
+ * try.)
+ *
+ * If A == B, the ranges are adjacent only if the bounds have different
+ * inclusive flags (i.e., exactly one of the ranges includes the common
+ * boundary point).
+ *
+ * And if A > B then the ranges are not adjacent in this order.
+ */
+bool
+bounds_adjacent(TypeCacheEntry *typcache, RangeBound boundA, RangeBound boundB)
+{
+ int cmp;
+
+ Assert(!boundA.lower && boundB.lower);
+
+ cmp = range_cmp_bound_values(typcache, &boundA, &boundB);
+ if (cmp < 0)
+ {
+ RangeType *r;
+
+ /*
+ * Bounds do not overlap; see if there are points in between.
+ */
+
+ /* in a continuous subtype, there are assumed to be points between */
+ if (!OidIsValid(typcache->rng_canonical_finfo.fn_oid))
+ return false;
+
+ /*
+ * The bounds are of a discrete range type; so make a range A..B and
+ * see if it's empty.
+ */
+
+ /* flip the inclusion flags */
+ boundA.inclusive = !boundA.inclusive;
+ boundB.inclusive = !boundB.inclusive;
+ /* change upper/lower labels to avoid Assert failures */
+ boundA.lower = true;
+ boundB.lower = false;
+ r = make_range(typcache, &boundA, &boundB, false);
+ return RangeIsEmpty(r);
+ }
+ else if (cmp == 0)
+ return boundA.inclusive != boundB.inclusive;
+ else
+ return false; /* bounds overlap */
+}
+
+/* adjacent to (but not overlapping)? (internal version) */
+bool
+range_adjacent_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range is not adjacent to any other range */
+ if (empty1 || empty2)
+ return false;
+
+ /*
+ * Given two ranges A..B and C..D, the ranges are adjacent if and only if
+ * B is adjacent to C, or D is adjacent to A.
+ */
+ return (bounds_adjacent(typcache, upper1, lower2) ||
+ bounds_adjacent(typcache, upper2, lower1));
+}
+
+/* adjacent to (but not overlapping)? */
+Datum
+range_adjacent(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_adjacent_internal(typcache, r1, r2));
+}
+
+/* overlaps? (internal version) */
+bool
+range_overlaps_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range does not overlap any other range */
+ if (empty1 || empty2)
+ return false;
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) >= 0 &&
+ range_cmp_bounds(typcache, &lower1, &upper2) <= 0)
+ return true;
+
+ if (range_cmp_bounds(typcache, &lower2, &lower1) >= 0 &&
+ range_cmp_bounds(typcache, &lower2, &upper1) <= 0)
+ return true;
+
+ return false;
+}
+
+/* overlaps? */
+Datum
+range_overlaps(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_overlaps_internal(typcache, r1, r2));
+}
+
+/* does not extend to right of? (internal version) */
+bool
+range_overleft_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range is neither before nor after any other range */
+ if (empty1 || empty2)
+ return false;
+
+ if (range_cmp_bounds(typcache, &upper1, &upper2) <= 0)
+ return true;
+
+ return false;
+}
+
+/* does not extend to right of? */
+Datum
+range_overleft(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_overleft_internal(typcache, r1, r2));
+}
+
+/* does not extend to left of? (internal version) */
+bool
+range_overright_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* An empty range is neither before nor after any other range */
+ if (empty1 || empty2)
+ return false;
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) >= 0)
+ return true;
+
+ return false;
+}
+
+/* does not extend to left of? */
+Datum
+range_overright(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_BOOL(range_overright_internal(typcache, r1, r2));
+}
+
+
+/* range, range -> range functions */
+
+/* set difference */
+Datum
+range_minus(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ RangeType *ret;
+ TypeCacheEntry *typcache;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ ret = range_minus_internal(typcache, r1, r2);
+ if (ret)
+ PG_RETURN_RANGE_P(ret);
+ else
+ PG_RETURN_NULL();
+}
+
+RangeType *
+range_minus_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+ int cmp_l1l2,
+ cmp_l1u2,
+ cmp_u1l2,
+ cmp_u1u2;
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* if either is empty, r1 is the correct answer */
+ if (empty1 || empty2)
+ return r1;
+
+ cmp_l1l2 = range_cmp_bounds(typcache, &lower1, &lower2);
+ cmp_l1u2 = range_cmp_bounds(typcache, &lower1, &upper2);
+ cmp_u1l2 = range_cmp_bounds(typcache, &upper1, &lower2);
+ cmp_u1u2 = range_cmp_bounds(typcache, &upper1, &upper2);
+
+ if (cmp_l1l2 < 0 && cmp_u1u2 > 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("result of range difference would not be contiguous")));
+
+ if (cmp_l1u2 > 0 || cmp_u1l2 < 0)
+ return r1;
+
+ if (cmp_l1l2 >= 0 && cmp_u1u2 <= 0)
+ return make_empty_range(typcache);
+
+ if (cmp_l1l2 <= 0 && cmp_u1l2 >= 0 && cmp_u1u2 <= 0)
+ {
+ lower2.inclusive = !lower2.inclusive;
+ lower2.lower = false; /* it will become the upper bound */
+ return make_range(typcache, &lower1, &lower2, false);
+ }
+
+ if (cmp_l1l2 >= 0 && cmp_u1u2 >= 0 && cmp_l1u2 <= 0)
+ {
+ upper2.inclusive = !upper2.inclusive;
+ upper2.lower = true; /* it will become the lower bound */
+ return make_range(typcache, &upper2, &upper1, false);
+ }
+
+ elog(ERROR, "unexpected case in range_minus");
+ return NULL;
+}
+
+/*
+ * Set union. If strict is true, it is an error that the two input ranges
+ * are not adjacent or overlapping.
+ */
+RangeType *
+range_union_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2,
+ bool strict)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+ RangeBound *result_lower;
+ RangeBound *result_upper;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* if either is empty, the other is the correct answer */
+ if (empty1)
+ return r2;
+ if (empty2)
+ return r1;
+
+ if (strict &&
+ !DatumGetBool(range_overlaps_internal(typcache, r1, r2)) &&
+ !DatumGetBool(range_adjacent_internal(typcache, r1, r2)))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("result of range union would not be contiguous")));
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) < 0)
+ result_lower = &lower1;
+ else
+ result_lower = &lower2;
+
+ if (range_cmp_bounds(typcache, &upper1, &upper2) > 0)
+ result_upper = &upper1;
+ else
+ result_upper = &upper2;
+
+ return make_range(typcache, result_lower, result_upper, false);
+}
+
+Datum
+range_union(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_RANGE_P(range_union_internal(typcache, r1, r2, true));
+}
+
+/*
+ * range merge: like set union, except also allow and account for non-adjacent
+ * input ranges.
+ */
+Datum
+range_merge(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_RANGE_P(range_union_internal(typcache, r1, r2, false));
+}
+
+/* set intersection */
+Datum
+range_intersect(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ PG_RETURN_RANGE_P(range_intersect_internal(typcache, r1, r2));
+}
+
+RangeType *
+range_intersect_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+ RangeBound *result_lower;
+ RangeBound *result_upper;
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ if (empty1 || empty2 || !range_overlaps_internal(typcache, r1, r2))
+ return make_empty_range(typcache);
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) >= 0)
+ result_lower = &lower1;
+ else
+ result_lower = &lower2;
+
+ if (range_cmp_bounds(typcache, &upper1, &upper2) <= 0)
+ result_upper = &upper1;
+ else
+ result_upper = &upper2;
+
+ return make_range(typcache, result_lower, result_upper, false);
+}
+
+/* range, range -> range, range functions */
+
+/*
+ * range_split_internal - if r2 intersects the middle of r1, leaving non-empty
+ * ranges on both sides, then return true and set output1 and output2 to the
+ * results of r1 - r2 (in order). Otherwise return false and don't set output1
+ * or output2. Neither input range should be empty.
+ */
+bool
+range_split_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2,
+ RangeType **output1, RangeType **output2)
+{
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) < 0 &&
+ range_cmp_bounds(typcache, &upper1, &upper2) > 0)
+ {
+ /*
+ * Need to invert inclusive/exclusive for the lower2 and upper2
+ * points. They can't be infinite though. We're allowed to overwrite
+ * these RangeBounds since they only exist locally.
+ */
+ lower2.inclusive = !lower2.inclusive;
+ lower2.lower = false;
+ upper2.inclusive = !upper2.inclusive;
+ upper2.lower = true;
+
+ *output1 = make_range(typcache, &lower1, &lower2, false);
+ *output2 = make_range(typcache, &upper2, &upper1, false);
+ return true;
+ }
+
+ return false;
+}
+
+/* range -> range aggregate functions */
+
+Datum
+range_intersect_agg_transfn(PG_FUNCTION_ARGS)
+{
+ MemoryContext aggContext;
+ Oid rngtypoid;
+ TypeCacheEntry *typcache;
+ RangeType *result;
+ RangeType *current;
+
+ if (!AggCheckCallContext(fcinfo, &aggContext))
+ elog(ERROR, "range_intersect_agg_transfn called in non-aggregate context");
+
+ rngtypoid = get_fn_expr_argtype(fcinfo->flinfo, 1);
+ if (!type_is_range(rngtypoid))
+ elog(ERROR, "range_intersect_agg must be called with a range");
+
+ typcache = range_get_typcache(fcinfo, rngtypoid);
+
+ /* strictness ensures these are non-null */
+ result = PG_GETARG_RANGE_P(0);
+ current = PG_GETARG_RANGE_P(1);
+
+ result = range_intersect_internal(typcache, result, current);
+ PG_RETURN_RANGE_P(result);
+}
+
+
+/* Btree support */
+
+/* btree comparator */
+Datum
+range_cmp(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ TypeCacheEntry *typcache;
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+ int cmp;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* For b-tree use, empty ranges sort before all else */
+ if (empty1 && empty2)
+ cmp = 0;
+ else if (empty1)
+ cmp = -1;
+ else if (empty2)
+ cmp = 1;
+ else
+ {
+ cmp = range_cmp_bounds(typcache, &lower1, &lower2);
+ if (cmp == 0)
+ cmp = range_cmp_bounds(typcache, &upper1, &upper2);
+ }
+
+ PG_FREE_IF_COPY(r1, 0);
+ PG_FREE_IF_COPY(r2, 1);
+
+ PG_RETURN_INT32(cmp);
+}
+
+/* inequality operators using the range_cmp function */
+Datum
+range_lt(PG_FUNCTION_ARGS)
+{
+ int cmp = range_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp < 0);
+}
+
+Datum
+range_le(PG_FUNCTION_ARGS)
+{
+ int cmp = range_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp <= 0);
+}
+
+Datum
+range_ge(PG_FUNCTION_ARGS)
+{
+ int cmp = range_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp >= 0);
+}
+
+Datum
+range_gt(PG_FUNCTION_ARGS)
+{
+ int cmp = range_cmp(fcinfo);
+
+ PG_RETURN_BOOL(cmp > 0);
+}
+
+/* Hash support */
+
+/* hash a range value */
+Datum
+hash_range(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ uint32 result;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *scache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+ char flags;
+ uint32 lower_hash;
+ uint32 upper_hash;
+
+ check_stack_depth(); /* recurses when subtype is a range type */
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ /* deserialize */
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+ flags = range_get_flags(r);
+
+ /*
+ * Look up the element type's hash function, if not done already.
+ */
+ scache = typcache->rngelemtype;
+ if (!OidIsValid(scache->hash_proc_finfo.fn_oid))
+ {
+ scache = lookup_type_cache(scache->type_id, TYPECACHE_HASH_PROC_FINFO);
+ if (!OidIsValid(scache->hash_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(scache->type_id))));
+ }
+
+ /*
+ * Apply the hash function to each bound.
+ */
+ if (RANGE_HAS_LBOUND(flags))
+ lower_hash = DatumGetUInt32(FunctionCall1Coll(&scache->hash_proc_finfo,
+ typcache->rng_collation,
+ lower.val));
+ else
+ lower_hash = 0;
+
+ if (RANGE_HAS_UBOUND(flags))
+ upper_hash = DatumGetUInt32(FunctionCall1Coll(&scache->hash_proc_finfo,
+ typcache->rng_collation,
+ upper.val));
+ else
+ upper_hash = 0;
+
+ /* Merge hashes of flags and bounds */
+ result = hash_uint32((uint32) flags);
+ result ^= lower_hash;
+ result = pg_rotate_left32(result, 1);
+ result ^= upper_hash;
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * Returns 64-bit value by hashing a value to a 64-bit value, with a seed.
+ * Otherwise, similar to hash_range.
+ */
+Datum
+hash_range_extended(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ Datum seed = PG_GETARG_DATUM(1);
+ uint64 result;
+ TypeCacheEntry *typcache;
+ TypeCacheEntry *scache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+ char flags;
+ uint64 lower_hash;
+ uint64 upper_hash;
+
+ check_stack_depth();
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+ flags = range_get_flags(r);
+
+ scache = typcache->rngelemtype;
+ if (!OidIsValid(scache->hash_extended_proc_finfo.fn_oid))
+ {
+ scache = lookup_type_cache(scache->type_id,
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO);
+ if (!OidIsValid(scache->hash_extended_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(scache->type_id))));
+ }
+
+ if (RANGE_HAS_LBOUND(flags))
+ lower_hash = DatumGetUInt64(FunctionCall2Coll(&scache->hash_extended_proc_finfo,
+ typcache->rng_collation,
+ lower.val,
+ seed));
+ else
+ lower_hash = 0;
+
+ if (RANGE_HAS_UBOUND(flags))
+ upper_hash = DatumGetUInt64(FunctionCall2Coll(&scache->hash_extended_proc_finfo,
+ typcache->rng_collation,
+ upper.val,
+ seed));
+ else
+ upper_hash = 0;
+
+ /* Merge hashes of flags and bounds */
+ result = DatumGetUInt64(hash_uint32_extended((uint32) flags,
+ DatumGetInt64(seed)));
+ result ^= lower_hash;
+ result = ROTATE_HIGH_AND_LOW_32BITS(result);
+ result ^= upper_hash;
+
+ PG_RETURN_UINT64(result);
+}
+
+/*
+ *----------------------------------------------------------
+ * CANONICAL FUNCTIONS
+ *
+ * Functions for specific built-in range types.
+ *----------------------------------------------------------
+ */
+
+Datum
+int4range_canonical(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+
+ if (empty)
+ PG_RETURN_RANGE_P(r);
+
+ if (!lower.infinite && !lower.inclusive)
+ {
+ lower.val = DirectFunctionCall2(int4pl, lower.val, Int32GetDatum(1));
+ lower.inclusive = true;
+ }
+
+ if (!upper.infinite && upper.inclusive)
+ {
+ upper.val = DirectFunctionCall2(int4pl, upper.val, Int32GetDatum(1));
+ upper.inclusive = false;
+ }
+
+ PG_RETURN_RANGE_P(range_serialize(typcache, &lower, &upper, false));
+}
+
+Datum
+int8range_canonical(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+
+ if (empty)
+ PG_RETURN_RANGE_P(r);
+
+ if (!lower.infinite && !lower.inclusive)
+ {
+ lower.val = DirectFunctionCall2(int8pl, lower.val, Int64GetDatum(1));
+ lower.inclusive = true;
+ }
+
+ if (!upper.infinite && upper.inclusive)
+ {
+ upper.val = DirectFunctionCall2(int8pl, upper.val, Int64GetDatum(1));
+ upper.inclusive = false;
+ }
+
+ PG_RETURN_RANGE_P(range_serialize(typcache, &lower, &upper, false));
+}
+
+Datum
+daterange_canonical(PG_FUNCTION_ARGS)
+{
+ RangeType *r = PG_GETARG_RANGE_P(0);
+ TypeCacheEntry *typcache;
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r));
+
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+
+ if (empty)
+ PG_RETURN_RANGE_P(r);
+
+ if (!lower.infinite && !DATE_NOT_FINITE(DatumGetDateADT(lower.val)) &&
+ !lower.inclusive)
+ {
+ lower.val = DirectFunctionCall2(date_pli, lower.val, Int32GetDatum(1));
+ lower.inclusive = true;
+ }
+
+ if (!upper.infinite && !DATE_NOT_FINITE(DatumGetDateADT(upper.val)) &&
+ upper.inclusive)
+ {
+ upper.val = DirectFunctionCall2(date_pli, upper.val, Int32GetDatum(1));
+ upper.inclusive = false;
+ }
+
+ PG_RETURN_RANGE_P(range_serialize(typcache, &lower, &upper, false));
+}
+
+/*
+ *----------------------------------------------------------
+ * SUBTYPE_DIFF FUNCTIONS
+ *
+ * Functions for specific built-in range types.
+ *
+ * Note that subtype_diff does return the difference, not the absolute value
+ * of the difference, and it must take care to avoid overflow.
+ * (numrange_subdiff is at some risk there ...)
+ *----------------------------------------------------------
+ */
+
+Datum
+int4range_subdiff(PG_FUNCTION_ARGS)
+{
+ int32 v1 = PG_GETARG_INT32(0);
+ int32 v2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_FLOAT8((float8) v1 - (float8) v2);
+}
+
+Datum
+int8range_subdiff(PG_FUNCTION_ARGS)
+{
+ int64 v1 = PG_GETARG_INT64(0);
+ int64 v2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_FLOAT8((float8) v1 - (float8) v2);
+}
+
+Datum
+numrange_subdiff(PG_FUNCTION_ARGS)
+{
+ Datum v1 = PG_GETARG_DATUM(0);
+ Datum v2 = PG_GETARG_DATUM(1);
+ Datum numresult;
+ float8 floatresult;
+
+ numresult = DirectFunctionCall2(numeric_sub, v1, v2);
+
+ floatresult = DatumGetFloat8(DirectFunctionCall1(numeric_float8,
+ numresult));
+
+ PG_RETURN_FLOAT8(floatresult);
+}
+
+Datum
+daterange_subdiff(PG_FUNCTION_ARGS)
+{
+ int32 v1 = PG_GETARG_INT32(0);
+ int32 v2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_FLOAT8((float8) v1 - (float8) v2);
+}
+
+Datum
+tsrange_subdiff(PG_FUNCTION_ARGS)
+{
+ Timestamp v1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp v2 = PG_GETARG_TIMESTAMP(1);
+ float8 result;
+
+ result = ((float8) v1 - (float8) v2) / USECS_PER_SEC;
+ PG_RETURN_FLOAT8(result);
+}
+
+Datum
+tstzrange_subdiff(PG_FUNCTION_ARGS)
+{
+ Timestamp v1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp v2 = PG_GETARG_TIMESTAMP(1);
+ float8 result;
+
+ result = ((float8) v1 - (float8) v2) / USECS_PER_SEC;
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ *----------------------------------------------------------
+ * SUPPORT FUNCTIONS
+ *
+ * These functions aren't in pg_proc, but are useful for
+ * defining new generic range functions in C.
+ *----------------------------------------------------------
+ */
+
+/*
+ * range_get_typcache: get cached information about a range type
+ *
+ * This is for use by range-related functions that follow the convention
+ * of using the fn_extra field as a pointer to the type cache entry for
+ * the range type. Functions that need to cache more information than
+ * that must fend for themselves.
+ */
+TypeCacheEntry *
+range_get_typcache(FunctionCallInfo fcinfo, Oid rngtypid)
+{
+ TypeCacheEntry *typcache = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+
+ if (typcache == NULL ||
+ typcache->type_id != rngtypid)
+ {
+ typcache = lookup_type_cache(rngtypid, TYPECACHE_RANGE_INFO);
+ if (typcache->rngelemtype == NULL)
+ elog(ERROR, "type %u is not a range type", rngtypid);
+ fcinfo->flinfo->fn_extra = (void *) typcache;
+ }
+
+ return typcache;
+}
+
+/*
+ * range_serialize: construct a range value from bounds and empty-flag
+ *
+ * This does not force canonicalization of the range value. In most cases,
+ * external callers should only be canonicalization functions. Note that
+ * we perform some datatype-independent canonicalization checks anyway.
+ */
+RangeType *
+range_serialize(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper,
+ bool empty)
+{
+ RangeType *range;
+ int cmp;
+ Size msize;
+ Pointer ptr;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ char typstorage;
+ char flags = 0;
+
+ /*
+ * Verify range is not invalid on its face, and construct flags value,
+ * preventing any non-canonical combinations such as infinite+inclusive.
+ */
+ Assert(lower->lower);
+ Assert(!upper->lower);
+
+ if (empty)
+ flags |= RANGE_EMPTY;
+ else
+ {
+ cmp = range_cmp_bound_values(typcache, lower, upper);
+
+ /* error check: if lower bound value is above upper, it's wrong */
+ if (cmp > 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("range lower bound must be less than or equal to range upper bound")));
+
+ /* if bounds are equal, and not both inclusive, range is empty */
+ if (cmp == 0 && !(lower->inclusive && upper->inclusive))
+ flags |= RANGE_EMPTY;
+ else
+ {
+ /* infinite boundaries are never inclusive */
+ if (lower->infinite)
+ flags |= RANGE_LB_INF;
+ else if (lower->inclusive)
+ flags |= RANGE_LB_INC;
+ if (upper->infinite)
+ flags |= RANGE_UB_INF;
+ else if (upper->inclusive)
+ flags |= RANGE_UB_INC;
+ }
+ }
+
+ /* Fetch information about range's element type */
+ typlen = typcache->rngelemtype->typlen;
+ typbyval = typcache->rngelemtype->typbyval;
+ typalign = typcache->rngelemtype->typalign;
+ typstorage = typcache->rngelemtype->typstorage;
+
+ /* Count space for varlena header and range type's OID */
+ msize = sizeof(RangeType);
+ Assert(msize == MAXALIGN(msize));
+
+ /* Count space for bounds */
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ /*
+ * Make sure item to be inserted is not toasted. It is essential that
+ * we not insert an out-of-line toast value pointer into a range
+ * object, for the same reasons that arrays and records can't contain
+ * them. It would work to store a compressed-in-line value, but we
+ * prefer to decompress and then let compression be applied to the
+ * whole range object if necessary. But, unlike arrays, we do allow
+ * short-header varlena objects to stay as-is.
+ */
+ if (typlen == -1)
+ lower->val = PointerGetDatum(PG_DETOAST_DATUM_PACKED(lower->val));
+
+ msize = datum_compute_size(msize, lower->val, typbyval, typalign,
+ typlen, typstorage);
+ }
+
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ /* Make sure item to be inserted is not toasted */
+ if (typlen == -1)
+ upper->val = PointerGetDatum(PG_DETOAST_DATUM_PACKED(upper->val));
+
+ msize = datum_compute_size(msize, upper->val, typbyval, typalign,
+ typlen, typstorage);
+ }
+
+ /* Add space for flag byte */
+ msize += sizeof(char);
+
+ /* Note: zero-fill is required here, just as in heap tuples */
+ range = (RangeType *) palloc0(msize);
+ SET_VARSIZE(range, msize);
+
+ /* Now fill in the datum */
+ range->rangetypid = typcache->type_id;
+
+ ptr = (char *) (range + 1);
+
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ Assert(lower->lower);
+ ptr = datum_write(ptr, lower->val, typbyval, typalign, typlen,
+ typstorage);
+ }
+
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ Assert(!upper->lower);
+ ptr = datum_write(ptr, upper->val, typbyval, typalign, typlen,
+ typstorage);
+ }
+
+ *((char *) ptr) = flags;
+
+ return range;
+}
+
+/*
+ * range_deserialize: deconstruct a range value
+ *
+ * NB: the given range object must be fully detoasted; it cannot have a
+ * short varlena header.
+ *
+ * Note that if the element type is pass-by-reference, the datums in the
+ * RangeBound structs will be pointers into the given range object.
+ */
+void
+range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
+ RangeBound *lower, RangeBound *upper, bool *empty)
+{
+ char flags;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
+ Pointer ptr;
+ Datum lbound;
+ Datum ubound;
+
+ /* assert caller passed the right typcache entry */
+ Assert(RangeTypeGetOid(range) == typcache->type_id);
+
+ /* fetch the flag byte from datum's last byte */
+ flags = *((const char *) range + VARSIZE(range) - 1);
+
+ /* fetch information about range's element type */
+ typlen = typcache->rngelemtype->typlen;
+ typbyval = typcache->rngelemtype->typbyval;
+ typalign = typcache->rngelemtype->typalign;
+
+ /* initialize data pointer just after the range OID */
+ ptr = (Pointer) (range + 1);
+
+ /* fetch lower bound, if any */
+ if (RANGE_HAS_LBOUND(flags))
+ {
+ /* att_align_pointer cannot be necessary here */
+ lbound = fetch_att(ptr, typbyval, typlen);
+ ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ }
+ else
+ lbound = (Datum) 0;
+
+ /* fetch upper bound, if any */
+ if (RANGE_HAS_UBOUND(flags))
+ {
+ ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+ ubound = fetch_att(ptr, typbyval, typlen);
+ /* no need for att_addlength_pointer */
+ }
+ else
+ ubound = (Datum) 0;
+
+ /* emit results */
+
+ *empty = (flags & RANGE_EMPTY) != 0;
+
+ lower->val = lbound;
+ lower->infinite = (flags & RANGE_LB_INF) != 0;
+ lower->inclusive = (flags & RANGE_LB_INC) != 0;
+ lower->lower = true;
+
+ upper->val = ubound;
+ upper->infinite = (flags & RANGE_UB_INF) != 0;
+ upper->inclusive = (flags & RANGE_UB_INC) != 0;
+ upper->lower = false;
+}
+
+/*
+ * range_get_flags: just get the flags from a RangeType value.
+ *
+ * This is frequently useful in places that only need the flags and not
+ * the full results of range_deserialize.
+ */
+char
+range_get_flags(const RangeType *range)
+{
+ /* fetch the flag byte from datum's last byte */
+ return *((char *) range + VARSIZE(range) - 1);
+}
+
+/*
+ * range_set_contain_empty: set the RANGE_CONTAIN_EMPTY bit in the value.
+ *
+ * This is only needed in GiST operations, so we don't include a provision
+ * for setting it in range_serialize; rather, this function must be applied
+ * afterwards.
+ */
+void
+range_set_contain_empty(RangeType *range)
+{
+ char *flagsp;
+
+ /* flag byte is datum's last byte */
+ flagsp = (char *) range + VARSIZE(range) - 1;
+
+ *flagsp |= RANGE_CONTAIN_EMPTY;
+}
+
+/*
+ * This both serializes and canonicalizes (if applicable) the range.
+ * This should be used by most callers.
+ */
+RangeType *
+make_range(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper,
+ bool empty)
+{
+ RangeType *range;
+
+ range = range_serialize(typcache, lower, upper, empty);
+
+ /* no need to call canonical on empty ranges ... */
+ if (OidIsValid(typcache->rng_canonical_finfo.fn_oid) &&
+ !RangeIsEmpty(range))
+ range = DatumGetRangeTypeP(FunctionCall1(&typcache->rng_canonical_finfo,
+ RangeTypePGetDatum(range)));
+
+ return range;
+}
+
+/*
+ * Compare two range boundary points, returning <0, 0, or >0 according to
+ * whether b1 is less than, equal to, or greater than b2.
+ *
+ * The boundaries can be any combination of upper and lower; so it's useful
+ * for a variety of operators.
+ *
+ * The simple case is when b1 and b2 are both finite and inclusive, in which
+ * case the result is just a comparison of the values held in b1 and b2.
+ *
+ * If a bound is exclusive, then we need to know whether it's a lower bound,
+ * in which case we treat the boundary point as "just greater than" the held
+ * value; or an upper bound, in which case we treat the boundary point as
+ * "just less than" the held value.
+ *
+ * If a bound is infinite, it represents minus infinity (less than every other
+ * point) if it's a lower bound; or plus infinity (greater than every other
+ * point) if it's an upper bound.
+ *
+ * There is only one case where two boundaries compare equal but are not
+ * identical: when both bounds are inclusive and hold the same finite value,
+ * but one is an upper bound and the other a lower bound.
+ */
+int
+range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1, const RangeBound *b2)
+{
+ int32 result;
+
+ /*
+ * First, handle cases involving infinity, which don't require invoking
+ * the comparison proc.
+ */
+ if (b1->infinite && b2->infinite)
+ {
+ /*
+ * Both are infinity, so they are equal unless one is lower and the
+ * other not.
+ */
+ if (b1->lower == b2->lower)
+ return 0;
+ else
+ return b1->lower ? -1 : 1;
+ }
+ else if (b1->infinite)
+ return b1->lower ? -1 : 1;
+ else if (b2->infinite)
+ return b2->lower ? 1 : -1;
+
+ /*
+ * Both boundaries are finite, so compare the held values.
+ */
+ result = DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ b1->val, b2->val));
+
+ /*
+ * If the comparison is anything other than equal, we're done. If they
+ * compare equal though, we still have to consider whether the boundaries
+ * are inclusive or exclusive.
+ */
+ if (result == 0)
+ {
+ if (!b1->inclusive && !b2->inclusive)
+ {
+ /* both are exclusive */
+ if (b1->lower == b2->lower)
+ return 0;
+ else
+ return b1->lower ? 1 : -1;
+ }
+ else if (!b1->inclusive)
+ return b1->lower ? 1 : -1;
+ else if (!b2->inclusive)
+ return b2->lower ? -1 : 1;
+ else
+ {
+ /*
+ * Both are inclusive and the values held are equal, so they are
+ * equal regardless of whether they are upper or lower boundaries,
+ * or a mix.
+ */
+ return 0;
+ }
+ }
+
+ return result;
+}
+
+/*
+ * Compare two range boundary point values, returning <0, 0, or >0 according
+ * to whether b1 is less than, equal to, or greater than b2.
+ *
+ * This is similar to but simpler than range_cmp_bounds(). We just compare
+ * the values held in b1 and b2, ignoring inclusive/exclusive flags. The
+ * lower/upper flags only matter for infinities, where they tell us if the
+ * infinity is plus or minus.
+ */
+int
+range_cmp_bound_values(TypeCacheEntry *typcache, const RangeBound *b1,
+ const RangeBound *b2)
+{
+ /*
+ * First, handle cases involving infinity, which don't require invoking
+ * the comparison proc.
+ */
+ if (b1->infinite && b2->infinite)
+ {
+ /*
+ * Both are infinity, so they are equal unless one is lower and the
+ * other not.
+ */
+ if (b1->lower == b2->lower)
+ return 0;
+ else
+ return b1->lower ? -1 : 1;
+ }
+ else if (b1->infinite)
+ return b1->lower ? -1 : 1;
+ else if (b2->infinite)
+ return b2->lower ? 1 : -1;
+
+ /*
+ * Both boundaries are finite, so compare the held values.
+ */
+ return DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ b1->val, b2->val));
+}
+
+/*
+ * qsort callback for sorting ranges.
+ *
+ * Two empty ranges compare equal; an empty range sorts to the left of any
+ * non-empty range. Two non-empty ranges are sorted by lower bound first
+ * and by upper bound next.
+ */
+int
+range_compare(const void *key1, const void *key2, void *arg)
+{
+ RangeType *r1 = *(RangeType **) key1;
+ RangeType *r2 = *(RangeType **) key2;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+ RangeBound lower1;
+ RangeBound upper1;
+ RangeBound lower2;
+ RangeBound upper2;
+ bool empty1;
+ bool empty2;
+ int cmp;
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ if (empty1 && empty2)
+ cmp = 0;
+ else if (empty1)
+ cmp = -1;
+ else if (empty2)
+ cmp = 1;
+ else
+ {
+ cmp = range_cmp_bounds(typcache, &lower1, &lower2);
+ if (cmp == 0)
+ cmp = range_cmp_bounds(typcache, &upper1, &upper2);
+ }
+
+ return cmp;
+}
+
+/*
+ * Build an empty range value of the type indicated by the typcache entry.
+ */
+RangeType *
+make_empty_range(TypeCacheEntry *typcache)
+{
+ RangeBound lower;
+ RangeBound upper;
+
+ lower.val = (Datum) 0;
+ lower.infinite = false;
+ lower.inclusive = false;
+ lower.lower = true;
+
+ upper.val = (Datum) 0;
+ upper.infinite = false;
+ upper.inclusive = false;
+ upper.lower = false;
+
+ return make_range(typcache, &lower, &upper, true);
+}
+
+
+/*
+ *----------------------------------------------------------
+ * STATIC FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+/*
+ * Given a string representing the flags for the range type, return the flags
+ * represented as a char.
+ */
+static char
+range_parse_flags(const char *flags_str)
+{
+ char flags = 0;
+
+ if (flags_str[0] == '\0' ||
+ flags_str[1] == '\0' ||
+ flags_str[2] != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid range bound flags"),
+ errhint("Valid values are \"[]\", \"[)\", \"(]\", and \"()\".")));
+
+ switch (flags_str[0])
+ {
+ case '[':
+ flags |= RANGE_LB_INC;
+ break;
+ case '(':
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid range bound flags"),
+ errhint("Valid values are \"[]\", \"[)\", \"(]\", and \"()\".")));
+ }
+
+ switch (flags_str[1])
+ {
+ case ']':
+ flags |= RANGE_UB_INC;
+ break;
+ case ')':
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid range bound flags"),
+ errhint("Valid values are \"[]\", \"[)\", \"(]\", and \"()\".")));
+ }
+
+ return flags;
+}
+
+/*
+ * Parse range input.
+ *
+ * Input parameters:
+ * string: input string to be parsed
+ * Output parameters:
+ * *flags: receives flags bitmask
+ * *lbound_str: receives palloc'd lower bound string, or NULL if none
+ * *ubound_str: receives palloc'd upper bound string, or NULL if none
+ *
+ * This is modeled somewhat after record_in in rowtypes.c.
+ * The input syntax is:
+ * <range> := EMPTY
+ * | <lb-inc> <string>, <string> <ub-inc>
+ * <lb-inc> := '[' | '('
+ * <ub-inc> := ']' | ')'
+ *
+ * Whitespace before or after <range> is ignored. Whitespace within a <string>
+ * is taken literally and becomes part of the input string for that bound.
+ *
+ * A <string> of length zero is taken as "infinite" (i.e. no bound), unless it
+ * is surrounded by double-quotes, in which case it is the literal empty
+ * string.
+ *
+ * Within a <string>, special characters (such as comma, parenthesis, or
+ * brackets) can be enclosed in double-quotes or escaped with backslash. Within
+ * double-quotes, a double-quote can be escaped with double-quote or backslash.
+ */
+static void
+range_parse(const char *string, char *flags, char **lbound_str,
+ char **ubound_str)
+{
+ const char *ptr = string;
+ bool infinite;
+
+ *flags = 0;
+
+ /* consume whitespace */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* check for empty range */
+ if (pg_strncasecmp(ptr, RANGE_EMPTY_LITERAL,
+ strlen(RANGE_EMPTY_LITERAL)) == 0)
+ {
+ *flags = RANGE_EMPTY;
+ *lbound_str = NULL;
+ *ubound_str = NULL;
+
+ ptr += strlen(RANGE_EMPTY_LITERAL);
+
+ /* the rest should be whitespace */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* should have consumed everything */
+ if (*ptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Junk after \"empty\" key word.")));
+
+ return;
+ }
+
+ if (*ptr == '[')
+ {
+ *flags |= RANGE_LB_INC;
+ ptr++;
+ }
+ else if (*ptr == '(')
+ ptr++;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Missing left parenthesis or bracket.")));
+
+ ptr = range_parse_bound(string, ptr, lbound_str, &infinite);
+ if (infinite)
+ *flags |= RANGE_LB_INF;
+
+ if (*ptr == ',')
+ ptr++;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Missing comma after lower bound.")));
+
+ ptr = range_parse_bound(string, ptr, ubound_str, &infinite);
+ if (infinite)
+ *flags |= RANGE_UB_INF;
+
+ if (*ptr == ']')
+ {
+ *flags |= RANGE_UB_INC;
+ ptr++;
+ }
+ else if (*ptr == ')')
+ ptr++;
+ else /* must be a comma */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Too many commas.")));
+
+ /* consume whitespace */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (*ptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Junk after right parenthesis or bracket.")));
+}
+
+/*
+ * Helper for range_parse: parse and de-quote one bound string.
+ *
+ * We scan until finding comma, right parenthesis, or right bracket.
+ *
+ * Input parameters:
+ * string: entire input string (used only for error reports)
+ * ptr: where to start parsing bound
+ * Output parameters:
+ * *bound_str: receives palloc'd bound string, or NULL if none
+ * *infinite: set true if no bound, else false
+ *
+ * The return value is the scan ptr, advanced past the bound string.
+ */
+static const char *
+range_parse_bound(const char *string, const char *ptr,
+ char **bound_str, bool *infinite)
+{
+ StringInfoData buf;
+
+ /* Check for null: completely empty input means null */
+ if (*ptr == ',' || *ptr == ')' || *ptr == ']')
+ {
+ *bound_str = NULL;
+ *infinite = true;
+ }
+ else
+ {
+ /* Extract string for this bound */
+ bool inquote = false;
+
+ initStringInfo(&buf);
+ while (inquote || !(*ptr == ',' || *ptr == ')' || *ptr == ']'))
+ {
+ char ch = *ptr++;
+
+ if (ch == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Unexpected end of input.")));
+ if (ch == '\\')
+ {
+ if (*ptr == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed range literal: \"%s\"",
+ string),
+ errdetail("Unexpected end of input.")));
+ appendStringInfoChar(&buf, *ptr++);
+ }
+ else if (ch == '"')
+ {
+ if (!inquote)
+ inquote = true;
+ else if (*ptr == '"')
+ {
+ /* doubled quote within quote sequence */
+ appendStringInfoChar(&buf, *ptr++);
+ }
+ else
+ inquote = false;
+ }
+ else
+ appendStringInfoChar(&buf, ch);
+ }
+
+ *bound_str = buf.data;
+ *infinite = false;
+ }
+
+ return ptr;
+}
+
+/*
+ * Convert a deserialized range value to text form
+ *
+ * Inputs are the flags byte, and the two bound values already converted to
+ * text (but not yet quoted). If no bound value, pass NULL.
+ *
+ * Result is a palloc'd string
+ */
+static char *
+range_deparse(char flags, const char *lbound_str, const char *ubound_str)
+{
+ StringInfoData buf;
+
+ if (flags & RANGE_EMPTY)
+ return pstrdup(RANGE_EMPTY_LITERAL);
+
+ initStringInfo(&buf);
+
+ appendStringInfoChar(&buf, (flags & RANGE_LB_INC) ? '[' : '(');
+
+ if (RANGE_HAS_LBOUND(flags))
+ appendStringInfoString(&buf, range_bound_escape(lbound_str));
+
+ appendStringInfoChar(&buf, ',');
+
+ if (RANGE_HAS_UBOUND(flags))
+ appendStringInfoString(&buf, range_bound_escape(ubound_str));
+
+ appendStringInfoChar(&buf, (flags & RANGE_UB_INC) ? ']' : ')');
+
+ return buf.data;
+}
+
+/*
+ * Helper for range_deparse: quote a bound value as needed
+ *
+ * Result is a palloc'd string
+ */
+static char *
+range_bound_escape(const char *value)
+{
+ bool nq;
+ const char *ptr;
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+
+ /* Detect whether we need double quotes for this value */
+ nq = (value[0] == '\0'); /* force quotes for empty string */
+ for (ptr = value; *ptr; ptr++)
+ {
+ char ch = *ptr;
+
+ if (ch == '"' || ch == '\\' ||
+ ch == '(' || ch == ')' ||
+ ch == '[' || ch == ']' ||
+ ch == ',' ||
+ isspace((unsigned char) ch))
+ {
+ nq = true;
+ break;
+ }
+ }
+
+ /* And emit the string */
+ if (nq)
+ appendStringInfoChar(&buf, '"');
+ for (ptr = value; *ptr; ptr++)
+ {
+ char ch = *ptr;
+
+ if (ch == '"' || ch == '\\')
+ appendStringInfoChar(&buf, ch);
+ appendStringInfoChar(&buf, ch);
+ }
+ if (nq)
+ appendStringInfoChar(&buf, '"');
+
+ return buf.data;
+}
+
+/*
+ * Test whether range r1 contains range r2.
+ *
+ * Caller has already checked that they are the same range type, and looked up
+ * the necessary typcache entry.
+ */
+bool
+range_contains_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ RangeBound lower1;
+ RangeBound upper1;
+ bool empty1;
+ RangeBound lower2;
+ RangeBound upper2;
+ bool empty2;
+
+ /* Different types should be prevented by ANYRANGE matching rules */
+ if (RangeTypeGetOid(r1) != RangeTypeGetOid(r2))
+ elog(ERROR, "range types do not match");
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+
+ /* If either range is empty, the answer is easy */
+ if (empty2)
+ return true;
+ else if (empty1)
+ return false;
+
+ /* Else we must have lower1 <= lower2 and upper1 >= upper2 */
+ if (range_cmp_bounds(typcache, &lower1, &lower2) > 0)
+ return false;
+ if (range_cmp_bounds(typcache, &upper1, &upper2) < 0)
+ return false;
+
+ return true;
+}
+
+bool
+range_contained_by_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
+{
+ return range_contains_internal(typcache, r2, r1);
+}
+
+/*
+ * Test whether range r contains a specific element value.
+ */
+bool
+range_contains_elem_internal(TypeCacheEntry *typcache, const RangeType *r, Datum val)
+{
+ RangeBound lower;
+ RangeBound upper;
+ bool empty;
+ int32 cmp;
+
+ range_deserialize(typcache, r, &lower, &upper, &empty);
+
+ if (empty)
+ return false;
+
+ if (!lower.infinite)
+ {
+ cmp = DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ lower.val, val));
+ if (cmp > 0)
+ return false;
+ if (cmp == 0 && !lower.inclusive)
+ return false;
+ }
+
+ if (!upper.infinite)
+ {
+ cmp = DatumGetInt32(FunctionCall2Coll(&typcache->rng_cmp_proc_finfo,
+ typcache->rng_collation,
+ upper.val, val));
+ if (cmp < 0)
+ return false;
+ if (cmp == 0 && !upper.inclusive)
+ return false;
+ }
+
+ return true;
+}
+
+
+/*
+ * datum_compute_size() and datum_write() are used to insert the bound
+ * values into a range object. They are modeled after heaptuple.c's
+ * heap_compute_data_size() and heap_fill_tuple(), but we need not handle
+ * null values here. TYPE_IS_PACKABLE must test the same conditions as
+ * heaptuple.c's ATT_IS_PACKABLE macro. See the comments thare for more
+ * details.
+ */
+
+/* Does datatype allow packing into the 1-byte-header varlena format? */
+#define TYPE_IS_PACKABLE(typlen, typstorage) \
+ ((typlen) == -1 && (typstorage) != TYPSTORAGE_PLAIN)
+
+/*
+ * Increment data_length by the space needed by the datum, including any
+ * preceding alignment padding.
+ */
+static Size
+datum_compute_size(Size data_length, Datum val, bool typbyval, char typalign,
+ int16 typlen, char typstorage)
+{
+ if (TYPE_IS_PACKABLE(typlen, typstorage) &&
+ VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
+ {
+ /*
+ * we're anticipating converting to a short varlena header, so adjust
+ * length and don't count any alignment
+ */
+ data_length += VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(val));
+ }
+ else
+ {
+ data_length = att_align_datum(data_length, typalign, typlen, val);
+ data_length = att_addlength_datum(data_length, typlen, val);
+ }
+
+ return data_length;
+}
+
+/*
+ * Write the given datum beginning at ptr (after advancing to correct
+ * alignment, if needed). Return the pointer incremented by space used.
+ */
+static Pointer
+datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign,
+ int16 typlen, char typstorage)
+{
+ Size data_length;
+
+ if (typbyval)
+ {
+ /* pass-by-value */
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ store_att_byval(ptr, datum, typlen);
+ data_length = typlen;
+ }
+ else if (typlen == -1)
+ {
+ /* varlena */
+ Pointer val = DatumGetPointer(datum);
+
+ if (VARATT_IS_EXTERNAL(val))
+ {
+ /*
+ * Throw error, because we must never put a toast pointer inside a
+ * range object. Caller should have detoasted it.
+ */
+ elog(ERROR, "cannot store a toast pointer inside a range");
+ data_length = 0; /* keep compiler quiet */
+ }
+ else if (VARATT_IS_SHORT(val))
+ {
+ /* no alignment for short varlenas */
+ data_length = VARSIZE_SHORT(val);
+ memcpy(ptr, val, data_length);
+ }
+ else if (TYPE_IS_PACKABLE(typlen, typstorage) &&
+ VARATT_CAN_MAKE_SHORT(val))
+ {
+ /* convert to short varlena -- no alignment */
+ data_length = VARATT_CONVERTED_SHORT_SIZE(val);
+ SET_VARSIZE_SHORT(ptr, data_length);
+ memcpy(ptr + 1, VARDATA(val), data_length - 1);
+ }
+ else
+ {
+ /* full 4-byte header varlena */
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ data_length = VARSIZE(val);
+ memcpy(ptr, val, data_length);
+ }
+ }
+ else if (typlen == -2)
+ {
+ /* cstring ... never needs alignment */
+ Assert(typalign == TYPALIGN_CHAR);
+ data_length = strlen(DatumGetCString(datum)) + 1;
+ memcpy(ptr, DatumGetPointer(datum), data_length);
+ }
+ else
+ {
+ /* fixed-length pass-by-reference */
+ ptr = (char *) att_align_nominal(ptr, typalign);
+ Assert(typlen > 0);
+ data_length = typlen;
+ memcpy(ptr, DatumGetPointer(datum), data_length);
+ }
+
+ ptr += data_length;
+
+ return ptr;
+}
diff --git a/src/backend/utils/adt/rangetypes_gist.c b/src/backend/utils/adt/rangetypes_gist.c
new file mode 100644
index 0000000..fbf39db
--- /dev/null
+++ b/src/backend/utils/adt/rangetypes_gist.c
@@ -0,0 +1,1798 @@
+/*-------------------------------------------------------------------------
+ *
+ * rangetypes_gist.c
+ * GiST support for range types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rangetypes_gist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/gist.h"
+#include "access/stratnum.h"
+#include "utils/datum.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/multirangetypes.h"
+#include "utils/rangetypes.h"
+
+/*
+ * Range class properties used to segregate different classes of ranges in
+ * GiST. Each unique combination of properties is a class. CLS_EMPTY cannot
+ * be combined with anything else.
+ */
+#define CLS_NORMAL 0 /* Ordinary finite range (no bits set) */
+#define CLS_LOWER_INF 1 /* Lower bound is infinity */
+#define CLS_UPPER_INF 2 /* Upper bound is infinity */
+#define CLS_CONTAIN_EMPTY 4 /* Contains underlying empty ranges */
+#define CLS_EMPTY 8 /* Special class for empty ranges */
+
+#define CLS_COUNT 9 /* # of classes; includes all combinations of
+ * properties. CLS_EMPTY doesn't combine with
+ * anything else, so it's only 2^3 + 1. */
+
+/*
+ * Minimum accepted ratio of split for items of the same class. If the items
+ * are of different classes, we will separate along those lines regardless of
+ * the ratio.
+ */
+#define LIMIT_RATIO 0.3
+
+/* Constants for fixed penalty values */
+#define INFINITE_BOUND_PENALTY 2.0
+#define CONTAIN_EMPTY_PENALTY 1.0
+#define DEFAULT_SUBTYPE_DIFF_PENALTY 1.0
+
+/*
+ * Per-item data for range_gist_single_sorting_split.
+ */
+typedef struct
+{
+ int index;
+ RangeBound bound;
+} SingleBoundSortItem;
+
+/* place on left or right side of split? */
+typedef enum
+{
+ SPLIT_LEFT = 0, /* makes initialization to SPLIT_LEFT easier */
+ SPLIT_RIGHT
+} SplitLR;
+
+/*
+ * Context for range_gist_consider_split.
+ */
+typedef struct
+{
+ TypeCacheEntry *typcache; /* typcache for range type */
+ bool has_subtype_diff; /* does it have subtype_diff? */
+ int entries_count; /* total number of entries being split */
+
+ /* Information about currently selected split follows */
+
+ bool first; /* true if no split was selected yet */
+
+ RangeBound *left_upper; /* upper bound of left interval */
+ RangeBound *right_lower; /* lower bound of right interval */
+
+ float4 ratio; /* split ratio */
+ float4 overlap; /* overlap between left and right predicate */
+ int common_left; /* # common entries destined for each side */
+ int common_right;
+} ConsiderSplitContext;
+
+/*
+ * Bounds extracted from a non-empty range, for use in
+ * range_gist_double_sorting_split.
+ */
+typedef struct
+{
+ RangeBound lower;
+ RangeBound upper;
+} NonEmptyRange;
+
+/*
+ * Represents information about an entry that can be placed in either group
+ * without affecting overlap over selected axis ("common entry").
+ */
+typedef struct
+{
+ /* Index of entry in the initial array */
+ int index;
+ /* Delta between closeness of range to each of the two groups */
+ double delta;
+} CommonEntry;
+
+/* Helper macros to place an entry in the left or right group during split */
+/* Note direct access to variables v, typcache, left_range, right_range */
+#define PLACE_LEFT(range, off) \
+ do { \
+ if (v->spl_nleft > 0) \
+ left_range = range_super_union(typcache, left_range, range); \
+ else \
+ left_range = (range); \
+ v->spl_left[v->spl_nleft++] = (off); \
+ } while(0)
+
+#define PLACE_RIGHT(range, off) \
+ do { \
+ if (v->spl_nright > 0) \
+ right_range = range_super_union(typcache, right_range, range); \
+ else \
+ right_range = (range); \
+ v->spl_right[v->spl_nright++] = (off); \
+ } while(0)
+
+/* Copy a RangeType datum (hardwires typbyval and typlen for ranges...) */
+#define rangeCopy(r) \
+ ((RangeType *) DatumGetPointer(datumCopy(PointerGetDatum(r), \
+ false, -1)))
+
+static RangeType *range_super_union(TypeCacheEntry *typcache, RangeType *r1,
+ RangeType *r2);
+static bool range_gist_consistent_int_range(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const RangeType *query);
+static bool range_gist_consistent_int_multirange(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const MultirangeType *query);
+static bool range_gist_consistent_int_element(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ Datum query);
+static bool range_gist_consistent_leaf_range(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const RangeType *query);
+static bool range_gist_consistent_leaf_multirange(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const MultirangeType *query);
+static bool range_gist_consistent_leaf_element(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ Datum query);
+static void range_gist_fallback_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v);
+static void range_gist_class_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v,
+ SplitLR *classes_groups);
+static void range_gist_single_sorting_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v,
+ bool use_upper_bound);
+static void range_gist_double_sorting_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v);
+static void range_gist_consider_split(ConsiderSplitContext *context,
+ RangeBound *right_lower, int min_left_count,
+ RangeBound *left_upper, int max_left_count);
+static int get_gist_range_class(RangeType *range);
+static int single_bound_cmp(const void *a, const void *b, void *arg);
+static int interval_cmp_lower(const void *a, const void *b, void *arg);
+static int interval_cmp_upper(const void *a, const void *b, void *arg);
+static int common_entry_cmp(const void *i1, const void *i2);
+static float8 call_subtype_diff(TypeCacheEntry *typcache,
+ Datum val1, Datum val2);
+
+
+/* GiST query consistency check */
+Datum
+range_gist_consistent(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ Datum query = PG_GETARG_DATUM(1);
+ StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
+ bool result;
+ Oid subtype = PG_GETARG_OID(3);
+ bool *recheck = (bool *) PG_GETARG_POINTER(4);
+ RangeType *key = DatumGetRangeTypeP(entry->key);
+ TypeCacheEntry *typcache;
+
+ /* All operators served by this function are exact */
+ *recheck = false;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(key));
+
+ /*
+ * Perform consistent checking using function corresponding to key type
+ * (leaf or internal) and query subtype (range, multirange, or element).
+ * Note that invalid subtype means that query type matches key type
+ * (range).
+ */
+ if (GIST_LEAF(entry))
+ {
+ if (!OidIsValid(subtype) || subtype == ANYRANGEOID)
+ result = range_gist_consistent_leaf_range(typcache, strategy, key,
+ DatumGetRangeTypeP(query));
+ else if (subtype == ANYMULTIRANGEOID)
+ result = range_gist_consistent_leaf_multirange(typcache, strategy, key,
+ DatumGetMultirangeTypeP(query));
+ else
+ result = range_gist_consistent_leaf_element(typcache, strategy,
+ key, query);
+ }
+ else
+ {
+ if (!OidIsValid(subtype) || subtype == ANYRANGEOID)
+ result = range_gist_consistent_int_range(typcache, strategy, key,
+ DatumGetRangeTypeP(query));
+ else if (subtype == ANYMULTIRANGEOID)
+ result = range_gist_consistent_int_multirange(typcache, strategy, key,
+ DatumGetMultirangeTypeP(query));
+ else
+ result = range_gist_consistent_int_element(typcache, strategy,
+ key, query);
+ }
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * GiST compress method for multiranges: multirange is approximated as union
+ * range with no gaps.
+ */
+Datum
+multirange_gist_compress(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+
+ if (entry->leafkey)
+ {
+ MultirangeType *mr = DatumGetMultirangeTypeP(entry->key);
+ RangeType *r;
+ TypeCacheEntry *typcache;
+ GISTENTRY *retval = palloc(sizeof(GISTENTRY));
+
+ typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr));
+ r = multirange_get_union_range(typcache->rngtype, mr);
+
+ gistentryinit(*retval, RangeTypePGetDatum(r),
+ entry->rel, entry->page, entry->offset, false);
+
+ PG_RETURN_POINTER(retval);
+ }
+
+ PG_RETURN_POINTER(entry);
+}
+
+/* GiST query consistency check for multiranges */
+Datum
+multirange_gist_consistent(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ Datum query = PG_GETARG_DATUM(1);
+ StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
+ bool result;
+ Oid subtype = PG_GETARG_OID(3);
+ bool *recheck = (bool *) PG_GETARG_POINTER(4);
+ RangeType *key = DatumGetRangeTypeP(entry->key);
+ TypeCacheEntry *typcache;
+
+ /*
+ * All operators served by this function are inexact because multirange is
+ * approximated by union range with no gaps.
+ */
+ *recheck = true;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(key));
+
+ /*
+ * Perform consistent checking using function corresponding to key type
+ * (leaf or internal) and query subtype (range, multirange, or element).
+ * Note that invalid subtype means that query type matches key type
+ * (multirange).
+ */
+ if (GIST_LEAF(entry))
+ {
+ if (!OidIsValid(subtype) || subtype == ANYMULTIRANGEOID)
+ result = range_gist_consistent_leaf_multirange(typcache, strategy, key,
+ DatumGetMultirangeTypeP(query));
+ else if (subtype == ANYRANGEOID)
+ result = range_gist_consistent_leaf_range(typcache, strategy, key,
+ DatumGetRangeTypeP(query));
+ else
+ result = range_gist_consistent_leaf_element(typcache, strategy,
+ key, query);
+ }
+ else
+ {
+ if (!OidIsValid(subtype) || subtype == ANYMULTIRANGEOID)
+ result = range_gist_consistent_int_multirange(typcache, strategy, key,
+ DatumGetMultirangeTypeP(query));
+ else if (subtype == ANYRANGEOID)
+ result = range_gist_consistent_int_range(typcache, strategy, key,
+ DatumGetRangeTypeP(query));
+ else
+ result = range_gist_consistent_int_element(typcache, strategy,
+ key, query);
+ }
+ PG_RETURN_BOOL(result);
+}
+
+/* form union range */
+Datum
+range_gist_union(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GISTENTRY *ent = entryvec->vector;
+ RangeType *result_range;
+ TypeCacheEntry *typcache;
+ int i;
+
+ result_range = DatumGetRangeTypeP(ent[0].key);
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(result_range));
+
+ for (i = 1; i < entryvec->n; i++)
+ {
+ result_range = range_super_union(typcache, result_range,
+ DatumGetRangeTypeP(ent[i].key));
+ }
+
+ PG_RETURN_RANGE_P(result_range);
+}
+
+/*
+ * We store ranges as ranges in GiST indexes, so we do not need
+ * compress, decompress, or fetch functions. Note this implies a limit
+ * on the size of range values that can be indexed.
+ */
+
+/*
+ * GiST page split penalty function.
+ *
+ * The penalty function has the following goals (in order from most to least
+ * important):
+ * - Keep normal ranges separate
+ * - Avoid broadening the class of the original predicate
+ * - Avoid broadening (as determined by subtype_diff) the original predicate
+ * - Favor adding ranges to narrower original predicates
+ */
+Datum
+range_gist_penalty(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);
+ float *penalty = (float *) PG_GETARG_POINTER(2);
+ RangeType *orig = DatumGetRangeTypeP(origentry->key);
+ RangeType *new = DatumGetRangeTypeP(newentry->key);
+ TypeCacheEntry *typcache;
+ bool has_subtype_diff;
+ RangeBound orig_lower,
+ new_lower,
+ orig_upper,
+ new_upper;
+ bool orig_empty,
+ new_empty;
+
+ if (RangeTypeGetOid(orig) != RangeTypeGetOid(new))
+ elog(ERROR, "range types do not match");
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(orig));
+
+ has_subtype_diff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+
+ range_deserialize(typcache, orig, &orig_lower, &orig_upper, &orig_empty);
+ range_deserialize(typcache, new, &new_lower, &new_upper, &new_empty);
+
+ /*
+ * Distinct branches for handling distinct classes of ranges. Note that
+ * penalty values only need to be commensurate within the same class of
+ * new range.
+ */
+ if (new_empty)
+ {
+ /* Handle insertion of empty range */
+ if (orig_empty)
+ {
+ /*
+ * The best case is to insert it to empty original range.
+ * Insertion here means no broadening of original range. Also
+ * original range is the most narrow.
+ */
+ *penalty = 0.0;
+ }
+ else if (RangeIsOrContainsEmpty(orig))
+ {
+ /*
+ * The second case is to insert empty range into range which
+ * contains at least one underlying empty range. There is still
+ * no broadening of original range, but original range is not as
+ * narrow as possible.
+ */
+ *penalty = CONTAIN_EMPTY_PENALTY;
+ }
+ else if (orig_lower.infinite && orig_upper.infinite)
+ {
+ /*
+ * Original range requires broadening. (-inf; +inf) is most far
+ * from normal range in this case.
+ */
+ *penalty = 2 * CONTAIN_EMPTY_PENALTY;
+ }
+ else if (orig_lower.infinite || orig_upper.infinite)
+ {
+ /*
+ * (-inf, x) or (x, +inf) original ranges are closer to normal
+ * ranges, so it's worse to mix it with empty ranges.
+ */
+ *penalty = 3 * CONTAIN_EMPTY_PENALTY;
+ }
+ else
+ {
+ /*
+ * The least preferred case is broadening of normal range.
+ */
+ *penalty = 4 * CONTAIN_EMPTY_PENALTY;
+ }
+ }
+ else if (new_lower.infinite && new_upper.infinite)
+ {
+ /* Handle insertion of (-inf, +inf) range */
+ if (orig_lower.infinite && orig_upper.infinite)
+ {
+ /*
+ * Best case is inserting to (-inf, +inf) original range.
+ */
+ *penalty = 0.0;
+ }
+ else if (orig_lower.infinite || orig_upper.infinite)
+ {
+ /*
+ * When original range is (-inf, x) or (x, +inf) it requires
+ * broadening of original range (extension of one bound to
+ * infinity).
+ */
+ *penalty = INFINITE_BOUND_PENALTY;
+ }
+ else
+ {
+ /*
+ * Insertion to normal original range is least preferred.
+ */
+ *penalty = 2 * INFINITE_BOUND_PENALTY;
+ }
+
+ if (RangeIsOrContainsEmpty(orig))
+ {
+ /*
+ * Original range is narrower when it doesn't contain empty
+ * ranges. Add additional penalty otherwise.
+ */
+ *penalty += CONTAIN_EMPTY_PENALTY;
+ }
+ }
+ else if (new_lower.infinite)
+ {
+ /* Handle insertion of (-inf, x) range */
+ if (!orig_empty && orig_lower.infinite)
+ {
+ if (orig_upper.infinite)
+ {
+ /*
+ * (-inf, +inf) range won't be extended by insertion of (-inf,
+ * x) range. It's a less desirable case than insertion to
+ * (-inf, y) original range without extension, because in that
+ * case original range is narrower. But we can't express that
+ * in single float value.
+ */
+ *penalty = 0.0;
+ }
+ else
+ {
+ if (range_cmp_bounds(typcache, &new_upper, &orig_upper) > 0)
+ {
+ /*
+ * Get extension of original range using subtype_diff. Use
+ * constant if subtype_diff unavailable.
+ */
+ if (has_subtype_diff)
+ *penalty = call_subtype_diff(typcache,
+ new_upper.val,
+ orig_upper.val);
+ else
+ *penalty = DEFAULT_SUBTYPE_DIFF_PENALTY;
+ }
+ else
+ {
+ /* No extension of original range */
+ *penalty = 0.0;
+ }
+ }
+ }
+ else
+ {
+ /*
+ * If lower bound of original range is not -inf, then extension of
+ * it is infinity.
+ */
+ *penalty = get_float4_infinity();
+ }
+ }
+ else if (new_upper.infinite)
+ {
+ /* Handle insertion of (x, +inf) range */
+ if (!orig_empty && orig_upper.infinite)
+ {
+ if (orig_lower.infinite)
+ {
+ /*
+ * (-inf, +inf) range won't be extended by insertion of (x,
+ * +inf) range. It's a less desirable case than insertion to
+ * (y, +inf) original range without extension, because in that
+ * case original range is narrower. But we can't express that
+ * in single float value.
+ */
+ *penalty = 0.0;
+ }
+ else
+ {
+ if (range_cmp_bounds(typcache, &new_lower, &orig_lower) < 0)
+ {
+ /*
+ * Get extension of original range using subtype_diff. Use
+ * constant if subtype_diff unavailable.
+ */
+ if (has_subtype_diff)
+ *penalty = call_subtype_diff(typcache,
+ orig_lower.val,
+ new_lower.val);
+ else
+ *penalty = DEFAULT_SUBTYPE_DIFF_PENALTY;
+ }
+ else
+ {
+ /* No extension of original range */
+ *penalty = 0.0;
+ }
+ }
+ }
+ else
+ {
+ /*
+ * If upper bound of original range is not +inf, then extension of
+ * it is infinity.
+ */
+ *penalty = get_float4_infinity();
+ }
+ }
+ else
+ {
+ /* Handle insertion of normal (non-empty, non-infinite) range */
+ if (orig_empty || orig_lower.infinite || orig_upper.infinite)
+ {
+ /*
+ * Avoid mixing normal ranges with infinite and empty ranges.
+ */
+ *penalty = get_float4_infinity();
+ }
+ else
+ {
+ /*
+ * Calculate extension of original range by calling subtype_diff.
+ * Use constant if subtype_diff unavailable.
+ */
+ float8 diff = 0.0;
+
+ if (range_cmp_bounds(typcache, &new_lower, &orig_lower) < 0)
+ {
+ if (has_subtype_diff)
+ diff += call_subtype_diff(typcache,
+ orig_lower.val,
+ new_lower.val);
+ else
+ diff += DEFAULT_SUBTYPE_DIFF_PENALTY;
+ }
+ if (range_cmp_bounds(typcache, &new_upper, &orig_upper) > 0)
+ {
+ if (has_subtype_diff)
+ diff += call_subtype_diff(typcache,
+ new_upper.val,
+ orig_upper.val);
+ else
+ diff += DEFAULT_SUBTYPE_DIFF_PENALTY;
+ }
+ *penalty = diff;
+ }
+ }
+
+ PG_RETURN_POINTER(penalty);
+}
+
+/*
+ * The GiST PickSplit method for ranges
+ *
+ * Primarily, we try to segregate ranges of different classes. If splitting
+ * ranges of the same class, use the appropriate split method for that class.
+ */
+Datum
+range_gist_picksplit(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
+ TypeCacheEntry *typcache;
+ OffsetNumber i;
+ RangeType *pred_left;
+ int nbytes;
+ OffsetNumber maxoff;
+ int count_in_classes[CLS_COUNT];
+ int j;
+ int non_empty_classes_count = 0;
+ int biggest_class = -1;
+ int biggest_class_count = 0;
+ int total_count;
+
+ /* use first item to look up range type's info */
+ pred_left = DatumGetRangeTypeP(entryvec->vector[FirstOffsetNumber].key);
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(pred_left));
+
+ maxoff = entryvec->n - 1;
+ nbytes = (maxoff + 1) * sizeof(OffsetNumber);
+ v->spl_left = (OffsetNumber *) palloc(nbytes);
+ v->spl_right = (OffsetNumber *) palloc(nbytes);
+
+ /*
+ * Get count distribution of range classes.
+ */
+ memset(count_in_classes, 0, sizeof(count_in_classes));
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[i].key);
+
+ count_in_classes[get_gist_range_class(range)]++;
+ }
+
+ /*
+ * Count non-empty classes and find biggest class.
+ */
+ total_count = maxoff;
+ for (j = 0; j < CLS_COUNT; j++)
+ {
+ if (count_in_classes[j] > 0)
+ {
+ if (count_in_classes[j] > biggest_class_count)
+ {
+ biggest_class_count = count_in_classes[j];
+ biggest_class = j;
+ }
+ non_empty_classes_count++;
+ }
+ }
+
+ Assert(non_empty_classes_count > 0);
+
+ if (non_empty_classes_count == 1)
+ {
+ /* One non-empty class, so split inside class */
+ if ((biggest_class & ~CLS_CONTAIN_EMPTY) == CLS_NORMAL)
+ {
+ /* double sorting split for normal ranges */
+ range_gist_double_sorting_split(typcache, entryvec, v);
+ }
+ else if ((biggest_class & ~CLS_CONTAIN_EMPTY) == CLS_LOWER_INF)
+ {
+ /* upper bound sorting split for (-inf, x) ranges */
+ range_gist_single_sorting_split(typcache, entryvec, v, true);
+ }
+ else if ((biggest_class & ~CLS_CONTAIN_EMPTY) == CLS_UPPER_INF)
+ {
+ /* lower bound sorting split for (x, +inf) ranges */
+ range_gist_single_sorting_split(typcache, entryvec, v, false);
+ }
+ else
+ {
+ /* trivial split for all (-inf, +inf) or all empty ranges */
+ range_gist_fallback_split(typcache, entryvec, v);
+ }
+ }
+ else
+ {
+ /*
+ * Class based split.
+ *
+ * To which side of the split should each class go? Initialize them
+ * all to go to the left side.
+ */
+ SplitLR classes_groups[CLS_COUNT];
+
+ memset(classes_groups, 0, sizeof(classes_groups));
+
+ if (count_in_classes[CLS_NORMAL] > 0)
+ {
+ /* separate normal ranges if any */
+ classes_groups[CLS_NORMAL] = SPLIT_RIGHT;
+ }
+ else
+ {
+ /*----------
+ * Try to split classes in one of two ways:
+ * 1) containing infinities - not containing infinities
+ * 2) containing empty - not containing empty
+ *
+ * Select the way which balances the ranges between left and right
+ * the best. If split in these ways is not possible, there are at
+ * most 3 classes, so just separate biggest class.
+ *----------
+ */
+ int infCount,
+ nonInfCount;
+ int emptyCount,
+ nonEmptyCount;
+
+ nonInfCount =
+ count_in_classes[CLS_NORMAL] +
+ count_in_classes[CLS_CONTAIN_EMPTY] +
+ count_in_classes[CLS_EMPTY];
+ infCount = total_count - nonInfCount;
+
+ nonEmptyCount =
+ count_in_classes[CLS_NORMAL] +
+ count_in_classes[CLS_LOWER_INF] +
+ count_in_classes[CLS_UPPER_INF] +
+ count_in_classes[CLS_LOWER_INF | CLS_UPPER_INF];
+ emptyCount = total_count - nonEmptyCount;
+
+ if (infCount > 0 && nonInfCount > 0 &&
+ (Abs(infCount - nonInfCount) <=
+ Abs(emptyCount - nonEmptyCount)))
+ {
+ classes_groups[CLS_NORMAL] = SPLIT_RIGHT;
+ classes_groups[CLS_CONTAIN_EMPTY] = SPLIT_RIGHT;
+ classes_groups[CLS_EMPTY] = SPLIT_RIGHT;
+ }
+ else if (emptyCount > 0 && nonEmptyCount > 0)
+ {
+ classes_groups[CLS_NORMAL] = SPLIT_RIGHT;
+ classes_groups[CLS_LOWER_INF] = SPLIT_RIGHT;
+ classes_groups[CLS_UPPER_INF] = SPLIT_RIGHT;
+ classes_groups[CLS_LOWER_INF | CLS_UPPER_INF] = SPLIT_RIGHT;
+ }
+ else
+ {
+ /*
+ * Either total_count == emptyCount or total_count ==
+ * infCount.
+ */
+ classes_groups[biggest_class] = SPLIT_RIGHT;
+ }
+ }
+
+ range_gist_class_split(typcache, entryvec, v, classes_groups);
+ }
+
+ PG_RETURN_POINTER(v);
+}
+
+/* equality comparator for GiST */
+Datum
+range_gist_same(PG_FUNCTION_ARGS)
+{
+ RangeType *r1 = PG_GETARG_RANGE_P(0);
+ RangeType *r2 = PG_GETARG_RANGE_P(1);
+ bool *result = (bool *) PG_GETARG_POINTER(2);
+
+ /*
+ * range_eq will ignore the RANGE_CONTAIN_EMPTY flag, so we have to check
+ * that for ourselves. More generally, if the entries have been properly
+ * normalized, then unequal flags bytes must mean unequal ranges ... so
+ * let's just test all the flag bits at once.
+ */
+ if (range_get_flags(r1) != range_get_flags(r2))
+ *result = false;
+ else
+ {
+ TypeCacheEntry *typcache;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
+
+ *result = range_eq_internal(typcache, r1, r2);
+ }
+
+ PG_RETURN_POINTER(result);
+}
+
+/*
+ *----------------------------------------------------------
+ * STATIC FUNCTIONS
+ *----------------------------------------------------------
+ */
+
+/*
+ * Return the smallest range that contains r1 and r2
+ *
+ * This differs from regular range_union in two critical ways:
+ * 1. It won't throw an error for non-adjacent r1 and r2, but just absorb
+ * the intervening values into the result range.
+ * 2. We track whether any empty range has been union'd into the result,
+ * so that contained_by searches can be indexed. Note that this means
+ * that *all* unions formed within the GiST index must go through here.
+ */
+static RangeType *
+range_super_union(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2)
+{
+ RangeType *result;
+ RangeBound lower1,
+ lower2;
+ RangeBound upper1,
+ upper2;
+ bool empty1,
+ empty2;
+ char flags1,
+ flags2;
+ RangeBound *result_lower;
+ RangeBound *result_upper;
+
+ range_deserialize(typcache, r1, &lower1, &upper1, &empty1);
+ range_deserialize(typcache, r2, &lower2, &upper2, &empty2);
+ flags1 = range_get_flags(r1);
+ flags2 = range_get_flags(r2);
+
+ if (empty1)
+ {
+ /* We can return r2 as-is if it already is or contains empty */
+ if (flags2 & (RANGE_EMPTY | RANGE_CONTAIN_EMPTY))
+ return r2;
+ /* Else we'd better copy it (modify-in-place isn't safe) */
+ r2 = rangeCopy(r2);
+ range_set_contain_empty(r2);
+ return r2;
+ }
+ if (empty2)
+ {
+ /* We can return r1 as-is if it already is or contains empty */
+ if (flags1 & (RANGE_EMPTY | RANGE_CONTAIN_EMPTY))
+ return r1;
+ /* Else we'd better copy it (modify-in-place isn't safe) */
+ r1 = rangeCopy(r1);
+ range_set_contain_empty(r1);
+ return r1;
+ }
+
+ if (range_cmp_bounds(typcache, &lower1, &lower2) <= 0)
+ result_lower = &lower1;
+ else
+ result_lower = &lower2;
+
+ if (range_cmp_bounds(typcache, &upper1, &upper2) >= 0)
+ result_upper = &upper1;
+ else
+ result_upper = &upper2;
+
+ /* optimization to avoid constructing a new range */
+ if (result_lower == &lower1 && result_upper == &upper1 &&
+ ((flags1 & RANGE_CONTAIN_EMPTY) || !(flags2 & RANGE_CONTAIN_EMPTY)))
+ return r1;
+ if (result_lower == &lower2 && result_upper == &upper2 &&
+ ((flags2 & RANGE_CONTAIN_EMPTY) || !(flags1 & RANGE_CONTAIN_EMPTY)))
+ return r2;
+
+ result = make_range(typcache, result_lower, result_upper, false);
+
+ if ((flags1 & RANGE_CONTAIN_EMPTY) || (flags2 & RANGE_CONTAIN_EMPTY))
+ range_set_contain_empty(result);
+
+ return result;
+}
+
+static bool
+multirange_union_range_equal(TypeCacheEntry *typcache,
+ const RangeType *r,
+ const MultirangeType *mr)
+{
+ RangeBound lower1,
+ upper1,
+ lower2,
+ upper2,
+ tmp;
+ bool empty;
+
+ if (RangeIsEmpty(r) || MultirangeIsEmpty(mr))
+ return (RangeIsEmpty(r) && MultirangeIsEmpty(mr));
+
+ range_deserialize(typcache, r, &lower1, &upper1, &empty);
+ Assert(!empty);
+ multirange_get_bounds(typcache, mr, 0, &lower2, &tmp);
+ multirange_get_bounds(typcache, mr, mr->rangeCount - 1, &tmp, &upper2);
+
+ return (range_cmp_bounds(typcache, &lower1, &lower2) == 0 &&
+ range_cmp_bounds(typcache, &upper1, &upper2) == 0);
+}
+
+/*
+ * GiST consistent test on an index internal page with range query
+ */
+static bool
+range_gist_consistent_int_range(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const RangeType *query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ if (RangeIsEmpty(key) || RangeIsEmpty(query))
+ return false;
+ return (!range_overright_internal(typcache, key, query));
+ case RANGESTRAT_OVERLEFT:
+ if (RangeIsEmpty(key) || RangeIsEmpty(query))
+ return false;
+ return (!range_after_internal(typcache, key, query));
+ case RANGESTRAT_OVERLAPS:
+ return range_overlaps_internal(typcache, key, query);
+ case RANGESTRAT_OVERRIGHT:
+ if (RangeIsEmpty(key) || RangeIsEmpty(query))
+ return false;
+ return (!range_before_internal(typcache, key, query));
+ case RANGESTRAT_AFTER:
+ if (RangeIsEmpty(key) || RangeIsEmpty(query))
+ return false;
+ return (!range_overleft_internal(typcache, key, query));
+ case RANGESTRAT_ADJACENT:
+ if (RangeIsEmpty(key) || RangeIsEmpty(query))
+ return false;
+ if (range_adjacent_internal(typcache, key, query))
+ return true;
+ return range_overlaps_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINS:
+ return range_contains_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINED_BY:
+
+ /*
+ * Empty ranges are contained by anything, so if key is or
+ * contains any empty ranges, we must descend into it. Otherwise,
+ * descend only if key overlaps the query.
+ */
+ if (RangeIsOrContainsEmpty(key))
+ return true;
+ return range_overlaps_internal(typcache, key, query);
+ case RANGESTRAT_EQ:
+
+ /*
+ * If query is empty, descend only if the key is or contains any
+ * empty ranges. Otherwise, descend if key contains query.
+ */
+ if (RangeIsEmpty(query))
+ return RangeIsOrContainsEmpty(key);
+ return range_contains_internal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * GiST consistent test on an index internal page with multirange query
+ */
+static bool
+range_gist_consistent_int_multirange(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const MultirangeType *query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ if (RangeIsEmpty(key) || MultirangeIsEmpty(query))
+ return false;
+ return (!range_overright_multirange_internal(typcache, key, query));
+ case RANGESTRAT_OVERLEFT:
+ if (RangeIsEmpty(key) || MultirangeIsEmpty(query))
+ return false;
+ return (!range_after_multirange_internal(typcache, key, query));
+ case RANGESTRAT_OVERLAPS:
+ return range_overlaps_multirange_internal(typcache, key, query);
+ case RANGESTRAT_OVERRIGHT:
+ if (RangeIsEmpty(key) || MultirangeIsEmpty(query))
+ return false;
+ return (!range_before_multirange_internal(typcache, key, query));
+ case RANGESTRAT_AFTER:
+ if (RangeIsEmpty(key) || MultirangeIsEmpty(query))
+ return false;
+ return (!range_overleft_multirange_internal(typcache, key, query));
+ case RANGESTRAT_ADJACENT:
+ if (RangeIsEmpty(key) || MultirangeIsEmpty(query))
+ return false;
+ if (range_adjacent_multirange_internal(typcache, key, query))
+ return true;
+ return range_overlaps_multirange_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINS:
+ return range_contains_multirange_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINED_BY:
+
+ /*
+ * Empty ranges are contained by anything, so if key is or
+ * contains any empty ranges, we must descend into it. Otherwise,
+ * descend only if key overlaps the query.
+ */
+ if (RangeIsOrContainsEmpty(key))
+ return true;
+ return range_overlaps_multirange_internal(typcache, key, query);
+ case RANGESTRAT_EQ:
+
+ /*
+ * If query is empty, descend only if the key is or contains any
+ * empty ranges. Otherwise, descend if key contains query.
+ */
+ if (MultirangeIsEmpty(query))
+ return RangeIsOrContainsEmpty(key);
+ return range_contains_multirange_internal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * GiST consistent test on an index internal page with element query
+ */
+static bool
+range_gist_consistent_int_element(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ Datum query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_CONTAINS_ELEM:
+ return range_contains_elem_internal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * GiST consistent test on an index leaf page with range query
+ */
+static bool
+range_gist_consistent_leaf_range(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const RangeType *query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ return range_before_internal(typcache, key, query);
+ case RANGESTRAT_OVERLEFT:
+ return range_overleft_internal(typcache, key, query);
+ case RANGESTRAT_OVERLAPS:
+ return range_overlaps_internal(typcache, key, query);
+ case RANGESTRAT_OVERRIGHT:
+ return range_overright_internal(typcache, key, query);
+ case RANGESTRAT_AFTER:
+ return range_after_internal(typcache, key, query);
+ case RANGESTRAT_ADJACENT:
+ return range_adjacent_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINS:
+ return range_contains_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINED_BY:
+ return range_contained_by_internal(typcache, key, query);
+ case RANGESTRAT_EQ:
+ return range_eq_internal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * GiST consistent test on an index leaf page with multirange query
+ */
+static bool
+range_gist_consistent_leaf_multirange(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ const MultirangeType *query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ return range_before_multirange_internal(typcache, key, query);
+ case RANGESTRAT_OVERLEFT:
+ return range_overleft_multirange_internal(typcache, key, query);
+ case RANGESTRAT_OVERLAPS:
+ return range_overlaps_multirange_internal(typcache, key, query);
+ case RANGESTRAT_OVERRIGHT:
+ return range_overright_multirange_internal(typcache, key, query);
+ case RANGESTRAT_AFTER:
+ return range_after_multirange_internal(typcache, key, query);
+ case RANGESTRAT_ADJACENT:
+ return range_adjacent_multirange_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINS:
+ return range_contains_multirange_internal(typcache, key, query);
+ case RANGESTRAT_CONTAINED_BY:
+ return multirange_contains_range_internal(typcache, query, key);
+ case RANGESTRAT_EQ:
+ return multirange_union_range_equal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * GiST consistent test on an index leaf page with element query
+ */
+static bool
+range_gist_consistent_leaf_element(TypeCacheEntry *typcache,
+ StrategyNumber strategy,
+ const RangeType *key,
+ Datum query)
+{
+ switch (strategy)
+ {
+ case RANGESTRAT_CONTAINS_ELEM:
+ return range_contains_elem_internal(typcache, key, query);
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * Trivial split: half of entries will be placed on one page
+ * and the other half on the other page.
+ */
+static void
+range_gist_fallback_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v)
+{
+ RangeType *left_range = NULL;
+ RangeType *right_range = NULL;
+ OffsetNumber i,
+ maxoff,
+ split_idx;
+
+ maxoff = entryvec->n - 1;
+ /* Split entries before this to left page, after to right: */
+ split_idx = (maxoff - FirstOffsetNumber) / 2 + FirstOffsetNumber;
+
+ v->spl_nleft = 0;
+ v->spl_nright = 0;
+ for (i = FirstOffsetNumber; i <= maxoff; i++)
+ {
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[i].key);
+
+ if (i < split_idx)
+ PLACE_LEFT(range, i);
+ else
+ PLACE_RIGHT(range, i);
+ }
+
+ v->spl_ldatum = RangeTypePGetDatum(left_range);
+ v->spl_rdatum = RangeTypePGetDatum(right_range);
+}
+
+/*
+ * Split based on classes of ranges.
+ *
+ * See get_gist_range_class for class definitions.
+ * classes_groups is an array of length CLS_COUNT indicating the side of the
+ * split to which each class should go.
+ */
+static void
+range_gist_class_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v,
+ SplitLR *classes_groups)
+{
+ RangeType *left_range = NULL;
+ RangeType *right_range = NULL;
+ OffsetNumber i,
+ maxoff;
+
+ maxoff = entryvec->n - 1;
+
+ v->spl_nleft = 0;
+ v->spl_nright = 0;
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[i].key);
+ int class;
+
+ /* Get class of range */
+ class = get_gist_range_class(range);
+
+ /* Place range to appropriate page */
+ if (classes_groups[class] == SPLIT_LEFT)
+ PLACE_LEFT(range, i);
+ else
+ {
+ Assert(classes_groups[class] == SPLIT_RIGHT);
+ PLACE_RIGHT(range, i);
+ }
+ }
+
+ v->spl_ldatum = RangeTypePGetDatum(left_range);
+ v->spl_rdatum = RangeTypePGetDatum(right_range);
+}
+
+/*
+ * Sorting based split. First half of entries according to the sort will be
+ * placed to one page, and second half of entries will be placed to other
+ * page. use_upper_bound parameter indicates whether to use upper or lower
+ * bound for sorting.
+ */
+static void
+range_gist_single_sorting_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v,
+ bool use_upper_bound)
+{
+ SingleBoundSortItem *sortItems;
+ RangeType *left_range = NULL;
+ RangeType *right_range = NULL;
+ OffsetNumber i,
+ maxoff,
+ split_idx;
+
+ maxoff = entryvec->n - 1;
+
+ sortItems = (SingleBoundSortItem *)
+ palloc(maxoff * sizeof(SingleBoundSortItem));
+
+ /*
+ * Prepare auxiliary array and sort the values.
+ */
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[i].key);
+ RangeBound bound2;
+ bool empty;
+
+ sortItems[i - 1].index = i;
+ /* Put appropriate bound into array */
+ if (use_upper_bound)
+ range_deserialize(typcache, range, &bound2,
+ &sortItems[i - 1].bound, &empty);
+ else
+ range_deserialize(typcache, range, &sortItems[i - 1].bound,
+ &bound2, &empty);
+ Assert(!empty);
+ }
+
+ qsort_arg(sortItems, maxoff, sizeof(SingleBoundSortItem),
+ single_bound_cmp, typcache);
+
+ split_idx = maxoff / 2;
+
+ v->spl_nleft = 0;
+ v->spl_nright = 0;
+
+ for (i = 0; i < maxoff; i++)
+ {
+ int idx = sortItems[i].index;
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[idx].key);
+
+ if (i < split_idx)
+ PLACE_LEFT(range, idx);
+ else
+ PLACE_RIGHT(range, idx);
+ }
+
+ v->spl_ldatum = RangeTypePGetDatum(left_range);
+ v->spl_rdatum = RangeTypePGetDatum(right_range);
+}
+
+/*
+ * Double sorting split algorithm.
+ *
+ * The algorithm considers dividing ranges into two groups. The first (left)
+ * group contains general left bound. The second (right) group contains
+ * general right bound. The challenge is to find upper bound of left group
+ * and lower bound of right group so that overlap of groups is minimal and
+ * ratio of distribution is acceptable. Algorithm finds for each lower bound of
+ * right group minimal upper bound of left group, and for each upper bound of
+ * left group maximal lower bound of right group. For each found pair
+ * range_gist_consider_split considers replacement of currently selected
+ * split with the new one.
+ *
+ * After that, all the entries are divided into three groups:
+ * 1) Entries which should be placed to the left group
+ * 2) Entries which should be placed to the right group
+ * 3) "Common entries" which can be placed to either group without affecting
+ * amount of overlap.
+ *
+ * The common ranges are distributed by difference of distance from lower
+ * bound of common range to lower bound of right group and distance from upper
+ * bound of common range to upper bound of left group.
+ *
+ * For details see:
+ * "A new double sorting-based node splitting algorithm for R-tree",
+ * A. Korotkov
+ * http://syrcose.ispras.ru/2011/files/SYRCoSE2011_Proceedings.pdf#page=36
+ */
+static void
+range_gist_double_sorting_split(TypeCacheEntry *typcache,
+ GistEntryVector *entryvec,
+ GIST_SPLITVEC *v)
+{
+ ConsiderSplitContext context;
+ OffsetNumber i,
+ maxoff;
+ RangeType *range,
+ *left_range = NULL,
+ *right_range = NULL;
+ int common_entries_count;
+ NonEmptyRange *by_lower,
+ *by_upper;
+ CommonEntry *common_entries;
+ int nentries,
+ i1,
+ i2;
+ RangeBound *right_lower,
+ *left_upper;
+
+ memset(&context, 0, sizeof(ConsiderSplitContext));
+ context.typcache = typcache;
+ context.has_subtype_diff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+
+ maxoff = entryvec->n - 1;
+ nentries = context.entries_count = maxoff - FirstOffsetNumber + 1;
+ context.first = true;
+
+ /* Allocate arrays for sorted range bounds */
+ by_lower = (NonEmptyRange *) palloc(nentries * sizeof(NonEmptyRange));
+ by_upper = (NonEmptyRange *) palloc(nentries * sizeof(NonEmptyRange));
+
+ /* Fill arrays of bounds */
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ RangeType *range = DatumGetRangeTypeP(entryvec->vector[i].key);
+ bool empty;
+
+ range_deserialize(typcache, range,
+ &by_lower[i - FirstOffsetNumber].lower,
+ &by_lower[i - FirstOffsetNumber].upper,
+ &empty);
+ Assert(!empty);
+ }
+
+ /*
+ * Make two arrays of range bounds: one sorted by lower bound and another
+ * sorted by upper bound.
+ */
+ memcpy(by_upper, by_lower, nentries * sizeof(NonEmptyRange));
+ qsort_arg(by_lower, nentries, sizeof(NonEmptyRange),
+ interval_cmp_lower, typcache);
+ qsort_arg(by_upper, nentries, sizeof(NonEmptyRange),
+ interval_cmp_upper, typcache);
+
+ /*----------
+ * The goal is to form a left and right range, so that every entry
+ * range is contained by either left or right interval (or both).
+ *
+ * For example, with the ranges (0,1), (1,3), (2,3), (2,4):
+ *
+ * 0 1 2 3 4
+ * +-+
+ * +---+
+ * +-+
+ * +---+
+ *
+ * The left and right ranges are of the form (0,a) and (b,4).
+ * We first consider splits where b is the lower bound of an entry.
+ * We iterate through all entries, and for each b, calculate the
+ * smallest possible a. Then we consider splits where a is the
+ * upper bound of an entry, and for each a, calculate the greatest
+ * possible b.
+ *
+ * In the above example, the first loop would consider splits:
+ * b=0: (0,1)-(0,4)
+ * b=1: (0,1)-(1,4)
+ * b=2: (0,3)-(2,4)
+ *
+ * And the second loop:
+ * a=1: (0,1)-(1,4)
+ * a=3: (0,3)-(2,4)
+ * a=4: (0,4)-(2,4)
+ *----------
+ */
+
+ /*
+ * Iterate over lower bound of right group, finding smallest possible
+ * upper bound of left group.
+ */
+ i1 = 0;
+ i2 = 0;
+ right_lower = &by_lower[i1].lower;
+ left_upper = &by_upper[i2].lower;
+ while (true)
+ {
+ /*
+ * Find next lower bound of right group.
+ */
+ while (i1 < nentries &&
+ range_cmp_bounds(typcache, right_lower,
+ &by_lower[i1].lower) == 0)
+ {
+ if (range_cmp_bounds(typcache, &by_lower[i1].upper,
+ left_upper) > 0)
+ left_upper = &by_lower[i1].upper;
+ i1++;
+ }
+ if (i1 >= nentries)
+ break;
+ right_lower = &by_lower[i1].lower;
+
+ /*
+ * Find count of ranges which anyway should be placed to the left
+ * group.
+ */
+ while (i2 < nentries &&
+ range_cmp_bounds(typcache, &by_upper[i2].upper,
+ left_upper) <= 0)
+ i2++;
+
+ /*
+ * Consider found split to see if it's better than what we had.
+ */
+ range_gist_consider_split(&context, right_lower, i1, left_upper, i2);
+ }
+
+ /*
+ * Iterate over upper bound of left group finding greatest possible lower
+ * bound of right group.
+ */
+ i1 = nentries - 1;
+ i2 = nentries - 1;
+ right_lower = &by_lower[i1].upper;
+ left_upper = &by_upper[i2].upper;
+ while (true)
+ {
+ /*
+ * Find next upper bound of left group.
+ */
+ while (i2 >= 0 &&
+ range_cmp_bounds(typcache, left_upper,
+ &by_upper[i2].upper) == 0)
+ {
+ if (range_cmp_bounds(typcache, &by_upper[i2].lower,
+ right_lower) < 0)
+ right_lower = &by_upper[i2].lower;
+ i2--;
+ }
+ if (i2 < 0)
+ break;
+ left_upper = &by_upper[i2].upper;
+
+ /*
+ * Find count of intervals which anyway should be placed to the right
+ * group.
+ */
+ while (i1 >= 0 &&
+ range_cmp_bounds(typcache, &by_lower[i1].lower,
+ right_lower) >= 0)
+ i1--;
+
+ /*
+ * Consider found split to see if it's better than what we had.
+ */
+ range_gist_consider_split(&context, right_lower, i1 + 1,
+ left_upper, i2 + 1);
+ }
+
+ /*
+ * If we failed to find any acceptable splits, use trivial split.
+ */
+ if (context.first)
+ {
+ range_gist_fallback_split(typcache, entryvec, v);
+ return;
+ }
+
+ /*
+ * Ok, we have now selected bounds of the groups. Now we have to
+ * distribute entries themselves. At first we distribute entries which can
+ * be placed unambiguously and collect "common entries" to array.
+ */
+
+ /* Allocate vectors for results */
+ v->spl_left = (OffsetNumber *) palloc(nentries * sizeof(OffsetNumber));
+ v->spl_right = (OffsetNumber *) palloc(nentries * sizeof(OffsetNumber));
+ v->spl_nleft = 0;
+ v->spl_nright = 0;
+
+ /*
+ * Allocate an array for "common entries" - entries which can be placed to
+ * either group without affecting overlap along selected axis.
+ */
+ common_entries_count = 0;
+ common_entries = (CommonEntry *) palloc(nentries * sizeof(CommonEntry));
+
+ /*
+ * Distribute entries which can be distributed unambiguously, and collect
+ * common entries.
+ */
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ RangeBound lower,
+ upper;
+ bool empty;
+
+ /*
+ * Get upper and lower bounds along selected axis.
+ */
+ range = DatumGetRangeTypeP(entryvec->vector[i].key);
+
+ range_deserialize(typcache, range, &lower, &upper, &empty);
+
+ if (range_cmp_bounds(typcache, &upper, context.left_upper) <= 0)
+ {
+ /* Fits in the left group */
+ if (range_cmp_bounds(typcache, &lower, context.right_lower) >= 0)
+ {
+ /* Fits also in the right group, so "common entry" */
+ common_entries[common_entries_count].index = i;
+ if (context.has_subtype_diff)
+ {
+ /*
+ * delta = (lower - context.right_lower) -
+ * (context.left_upper - upper)
+ */
+ common_entries[common_entries_count].delta =
+ call_subtype_diff(typcache,
+ lower.val,
+ context.right_lower->val) -
+ call_subtype_diff(typcache,
+ context.left_upper->val,
+ upper.val);
+ }
+ else
+ {
+ /* Without subtype_diff, take all deltas as zero */
+ common_entries[common_entries_count].delta = 0;
+ }
+ common_entries_count++;
+ }
+ else
+ {
+ /* Doesn't fit to the right group, so join to the left group */
+ PLACE_LEFT(range, i);
+ }
+ }
+ else
+ {
+ /*
+ * Each entry should fit on either left or right group. Since this
+ * entry didn't fit in the left group, it better fit in the right
+ * group.
+ */
+ Assert(range_cmp_bounds(typcache, &lower,
+ context.right_lower) >= 0);
+ PLACE_RIGHT(range, i);
+ }
+ }
+
+ /*
+ * Distribute "common entries", if any.
+ */
+ if (common_entries_count > 0)
+ {
+ /*
+ * Sort "common entries" by calculated deltas in order to distribute
+ * the most ambiguous entries first.
+ */
+ qsort(common_entries, common_entries_count, sizeof(CommonEntry),
+ common_entry_cmp);
+
+ /*
+ * Distribute "common entries" between groups according to sorting.
+ */
+ for (i = 0; i < common_entries_count; i++)
+ {
+ int idx = common_entries[i].index;
+
+ range = DatumGetRangeTypeP(entryvec->vector[idx].key);
+
+ /*
+ * Check if we have to place this entry in either group to achieve
+ * LIMIT_RATIO.
+ */
+ if (i < context.common_left)
+ PLACE_LEFT(range, idx);
+ else
+ PLACE_RIGHT(range, idx);
+ }
+ }
+
+ v->spl_ldatum = PointerGetDatum(left_range);
+ v->spl_rdatum = PointerGetDatum(right_range);
+}
+
+/*
+ * Consider replacement of currently selected split with a better one
+ * during range_gist_double_sorting_split.
+ */
+static void
+range_gist_consider_split(ConsiderSplitContext *context,
+ RangeBound *right_lower, int min_left_count,
+ RangeBound *left_upper, int max_left_count)
+{
+ int left_count,
+ right_count;
+ float4 ratio,
+ overlap;
+
+ /*
+ * Calculate entries distribution ratio assuming most uniform distribution
+ * of common entries.
+ */
+ if (min_left_count >= (context->entries_count + 1) / 2)
+ left_count = min_left_count;
+ else if (max_left_count <= context->entries_count / 2)
+ left_count = max_left_count;
+ else
+ left_count = context->entries_count / 2;
+ right_count = context->entries_count - left_count;
+
+ /*
+ * Ratio of split: quotient between size of smaller group and total
+ * entries count. This is necessarily 0.5 or less; if it's less than
+ * LIMIT_RATIO then we will never accept the new split.
+ */
+ ratio = ((float4) Min(left_count, right_count)) /
+ ((float4) context->entries_count);
+
+ if (ratio > LIMIT_RATIO)
+ {
+ bool selectthis = false;
+
+ /*
+ * The ratio is acceptable, so compare current split with previously
+ * selected one. We search for minimal overlap (allowing negative
+ * values) and minimal ratio secondarily. If subtype_diff is
+ * available, it's used for overlap measure. Without subtype_diff we
+ * use number of "common entries" as an overlap measure.
+ */
+ if (context->has_subtype_diff)
+ overlap = call_subtype_diff(context->typcache,
+ left_upper->val,
+ right_lower->val);
+ else
+ overlap = max_left_count - min_left_count;
+
+ /* If there is no previous selection, select this split */
+ if (context->first)
+ selectthis = true;
+ else
+ {
+ /*
+ * Choose the new split if it has a smaller overlap, or same
+ * overlap but better ratio.
+ */
+ if (overlap < context->overlap ||
+ (overlap == context->overlap && ratio > context->ratio))
+ selectthis = true;
+ }
+
+ if (selectthis)
+ {
+ /* save information about selected split */
+ context->first = false;
+ context->ratio = ratio;
+ context->overlap = overlap;
+ context->right_lower = right_lower;
+ context->left_upper = left_upper;
+ context->common_left = max_left_count - left_count;
+ context->common_right = left_count - min_left_count;
+ }
+ }
+}
+
+/*
+ * Find class number for range.
+ *
+ * The class number is a valid combination of the properties of the
+ * range. Note: the highest possible number is 8, because CLS_EMPTY
+ * can't be combined with anything else.
+ */
+static int
+get_gist_range_class(RangeType *range)
+{
+ int classNumber;
+ char flags;
+
+ flags = range_get_flags(range);
+ if (flags & RANGE_EMPTY)
+ {
+ classNumber = CLS_EMPTY;
+ }
+ else
+ {
+ classNumber = 0;
+ if (flags & RANGE_LB_INF)
+ classNumber |= CLS_LOWER_INF;
+ if (flags & RANGE_UB_INF)
+ classNumber |= CLS_UPPER_INF;
+ if (flags & RANGE_CONTAIN_EMPTY)
+ classNumber |= CLS_CONTAIN_EMPTY;
+ }
+ return classNumber;
+}
+
+/*
+ * Comparison function for range_gist_single_sorting_split.
+ */
+static int
+single_bound_cmp(const void *a, const void *b, void *arg)
+{
+ SingleBoundSortItem *i1 = (SingleBoundSortItem *) a;
+ SingleBoundSortItem *i2 = (SingleBoundSortItem *) b;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+
+ return range_cmp_bounds(typcache, &i1->bound, &i2->bound);
+}
+
+/*
+ * Compare NonEmptyRanges by lower bound.
+ */
+static int
+interval_cmp_lower(const void *a, const void *b, void *arg)
+{
+ NonEmptyRange *i1 = (NonEmptyRange *) a;
+ NonEmptyRange *i2 = (NonEmptyRange *) b;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+
+ return range_cmp_bounds(typcache, &i1->lower, &i2->lower);
+}
+
+/*
+ * Compare NonEmptyRanges by upper bound.
+ */
+static int
+interval_cmp_upper(const void *a, const void *b, void *arg)
+{
+ NonEmptyRange *i1 = (NonEmptyRange *) a;
+ NonEmptyRange *i2 = (NonEmptyRange *) b;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+
+ return range_cmp_bounds(typcache, &i1->upper, &i2->upper);
+}
+
+/*
+ * Compare CommonEntrys by their deltas.
+ */
+static int
+common_entry_cmp(const void *i1, const void *i2)
+{
+ double delta1 = ((CommonEntry *) i1)->delta;
+ double delta2 = ((CommonEntry *) i2)->delta;
+
+ if (delta1 < delta2)
+ return -1;
+ else if (delta1 > delta2)
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * Convenience function to invoke type-specific subtype_diff function.
+ * Caller must have already checked that there is one for the range type.
+ */
+static float8
+call_subtype_diff(TypeCacheEntry *typcache, Datum val1, Datum val2)
+{
+ float8 value;
+
+ value = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ val1, val2));
+ /* Cope with buggy subtype_diff function by returning zero */
+ if (value >= 0.0)
+ return value;
+ return 0.0;
+}
diff --git a/src/backend/utils/adt/rangetypes_selfuncs.c b/src/backend/utils/adt/rangetypes_selfuncs.c
new file mode 100644
index 0000000..c2795f4
--- /dev/null
+++ b/src/backend/utils/adt/rangetypes_selfuncs.c
@@ -0,0 +1,1223 @@
+/*-------------------------------------------------------------------------
+ *
+ * rangetypes_selfuncs.c
+ * Functions for selectivity estimation of range operators
+ *
+ * Estimates are based on histograms of lower and upper bounds, and the
+ * fraction of empty ranges.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rangetypes_selfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_type.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/lsyscache.h"
+#include "utils/rangetypes.h"
+#include "utils/selfuncs.h"
+#include "utils/typcache.h"
+
+static double calc_rangesel(TypeCacheEntry *typcache, VariableStatData *vardata,
+ const RangeType *constval, Oid operator);
+static double default_range_selectivity(Oid operator);
+static double calc_hist_selectivity(TypeCacheEntry *typcache,
+ VariableStatData *vardata, const RangeType *constval,
+ Oid operator);
+static double calc_hist_selectivity_scalar(TypeCacheEntry *typcache,
+ const RangeBound *constbound,
+ const RangeBound *hist, int hist_nvalues,
+ bool equal);
+static int rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value,
+ const RangeBound *hist, int hist_length, bool equal);
+static float8 get_position(TypeCacheEntry *typcache, const RangeBound *value,
+ const RangeBound *hist1, const RangeBound *hist2);
+static float8 get_len_position(double value, double hist1, double hist2);
+static float8 get_distance(TypeCacheEntry *typcache, const RangeBound *bound1,
+ const RangeBound *bound2);
+static int length_hist_bsearch(Datum *length_hist_values,
+ int length_hist_nvalues, double value, bool equal);
+static double calc_length_hist_frac(Datum *length_hist_values,
+ int length_hist_nvalues, double length1, double length2, bool equal);
+static double calc_hist_selectivity_contained(TypeCacheEntry *typcache,
+ const RangeBound *lower, RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues);
+static double calc_hist_selectivity_contains(TypeCacheEntry *typcache,
+ const RangeBound *lower, const RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues);
+
+/*
+ * Returns a default selectivity estimate for given operator, when we don't
+ * have statistics or cannot use them for some reason.
+ */
+static double
+default_range_selectivity(Oid operator)
+{
+ switch (operator)
+ {
+ case OID_RANGE_OVERLAP_OP:
+ return 0.01;
+
+ case OID_RANGE_CONTAINS_OP:
+ case OID_RANGE_CONTAINED_OP:
+ return 0.005;
+
+ case OID_RANGE_CONTAINS_ELEM_OP:
+ case OID_RANGE_ELEM_CONTAINED_OP:
+
+ /*
+ * "range @> elem" is more or less identical to a scalar
+ * inequality "A >= b AND A <= c".
+ */
+ return DEFAULT_RANGE_INEQ_SEL;
+
+ case OID_RANGE_LESS_OP:
+ case OID_RANGE_LESS_EQUAL_OP:
+ case OID_RANGE_GREATER_OP:
+ case OID_RANGE_GREATER_EQUAL_OP:
+ case OID_RANGE_LEFT_OP:
+ case OID_RANGE_RIGHT_OP:
+ case OID_RANGE_OVERLAPS_LEFT_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_OP:
+ /* these are similar to regular scalar inequalities */
+ return DEFAULT_INEQ_SEL;
+
+ default:
+ /* all range operators should be handled above, but just in case */
+ return 0.01;
+ }
+}
+
+/*
+ * rangesel -- restriction selectivity for range operators
+ */
+Datum
+rangesel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Selectivity selec;
+ TypeCacheEntry *typcache = NULL;
+ RangeType *constrange = NULL;
+
+ /*
+ * If expression is not (variable op something) or (something op
+ * variable), then punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ PG_RETURN_FLOAT8(default_range_selectivity(operator));
+
+ /*
+ * Can't do anything useful if the something is not a constant, either.
+ */
+ if (!IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(default_range_selectivity(operator));
+ }
+
+ /*
+ * All the range operators are strict, so we can cope with a NULL constant
+ * right away.
+ */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(0.0);
+ }
+
+ /*
+ * If var is on the right, commute the operator, so that we can assume the
+ * var is on the left in what follows.
+ */
+ if (!varonleft)
+ {
+ /* we have other Op var, commute to make var Op other */
+ operator = get_commutator(operator);
+ if (!operator)
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(default_range_selectivity(operator));
+ }
+ }
+
+ /*
+ * OK, there's a Var and a Const we're dealing with here. We need the
+ * Const to be of same range type as the column, else we can't do anything
+ * useful. (Such cases will likely fail at runtime, but here we'd rather
+ * just return a default estimate.)
+ *
+ * If the operator is "range @> element", the constant should be of the
+ * element type of the range column. Convert it to a range that includes
+ * only that single point, so that we don't need special handling for that
+ * in what follows.
+ */
+ if (operator == OID_RANGE_CONTAINS_ELEM_OP)
+ {
+ typcache = range_get_typcache(fcinfo, vardata.vartype);
+
+ if (((Const *) other)->consttype == typcache->rngelemtype->type_id)
+ {
+ RangeBound lower,
+ upper;
+
+ lower.inclusive = true;
+ lower.val = ((Const *) other)->constvalue;
+ lower.infinite = false;
+ lower.lower = true;
+ upper.inclusive = true;
+ upper.val = ((Const *) other)->constvalue;
+ upper.infinite = false;
+ upper.lower = false;
+ constrange = range_serialize(typcache, &lower, &upper, false);
+ }
+ }
+ else if (operator == OID_RANGE_ELEM_CONTAINED_OP)
+ {
+ /*
+ * Here, the Var is the elem, not the range. For now we just punt and
+ * return the default estimate. In future we could disassemble the
+ * range constant and apply scalarineqsel ...
+ */
+ }
+ else if (((Const *) other)->consttype == vardata.vartype)
+ {
+ /* Both sides are the same range type */
+ typcache = range_get_typcache(fcinfo, vardata.vartype);
+
+ constrange = DatumGetRangeTypeP(((Const *) other)->constvalue);
+ }
+
+ /*
+ * If we got a valid constant on one side of the operator, proceed to
+ * estimate using statistics. Otherwise punt and return a default constant
+ * estimate. Note that calc_rangesel need not handle
+ * OID_RANGE_ELEM_CONTAINED_OP.
+ */
+ if (constrange)
+ selec = calc_rangesel(typcache, &vardata, constrange, operator);
+ else
+ selec = default_range_selectivity(operator);
+
+ ReleaseVariableStats(vardata);
+
+ CLAMP_PROBABILITY(selec);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+static double
+calc_rangesel(TypeCacheEntry *typcache, VariableStatData *vardata,
+ const RangeType *constval, Oid operator)
+{
+ double hist_selec;
+ double selec;
+ float4 empty_frac,
+ null_frac;
+
+ /*
+ * First look up the fraction of NULLs and empty ranges from pg_statistic.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ Form_pg_statistic stats;
+ AttStatsSlot sslot;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+ null_frac = stats->stanullfrac;
+
+ /* Try to get fraction of empty ranges */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM,
+ InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ if (sslot.nnumbers != 1)
+ elog(ERROR, "invalid empty fraction statistic"); /* shouldn't happen */
+ empty_frac = sslot.numbers[0];
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /* No empty fraction statistic. Assume no empty ranges. */
+ empty_frac = 0.0;
+ }
+ }
+ else
+ {
+ /*
+ * No stats are available. Follow through the calculations below
+ * anyway, assuming no NULLs and no empty ranges. This still allows us
+ * to give a better-than-nothing estimate based on whether the
+ * constant is an empty range or not.
+ */
+ null_frac = 0.0;
+ empty_frac = 0.0;
+ }
+
+ if (RangeIsEmpty(constval))
+ {
+ /*
+ * An empty range matches all ranges, all empty ranges, or nothing,
+ * depending on the operator
+ */
+ switch (operator)
+ {
+ /* these return false if either argument is empty */
+ case OID_RANGE_OVERLAP_OP:
+ case OID_RANGE_OVERLAPS_LEFT_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_OP:
+ case OID_RANGE_LEFT_OP:
+ case OID_RANGE_RIGHT_OP:
+ /* nothing is less than an empty range */
+ case OID_RANGE_LESS_OP:
+ selec = 0.0;
+ break;
+
+ /* only empty ranges can be contained by an empty range */
+ case OID_RANGE_CONTAINED_OP:
+ /* only empty ranges are <= an empty range */
+ case OID_RANGE_LESS_EQUAL_OP:
+ selec = empty_frac;
+ break;
+
+ /* everything contains an empty range */
+ case OID_RANGE_CONTAINS_OP:
+ /* everything is >= an empty range */
+ case OID_RANGE_GREATER_EQUAL_OP:
+ selec = 1.0;
+ break;
+
+ /* all non-empty ranges are > an empty range */
+ case OID_RANGE_GREATER_OP:
+ selec = 1.0 - empty_frac;
+ break;
+
+ /* an element cannot be empty */
+ case OID_RANGE_CONTAINS_ELEM_OP:
+ default:
+ elog(ERROR, "unexpected operator %u", operator);
+ selec = 0.0; /* keep compiler quiet */
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * Calculate selectivity using bound histograms. If that fails for
+ * some reason, e.g no histogram in pg_statistic, use the default
+ * constant estimate for the fraction of non-empty values. This is
+ * still somewhat better than just returning the default estimate,
+ * because this still takes into account the fraction of empty and
+ * NULL tuples, if we had statistics for them.
+ */
+ hist_selec = calc_hist_selectivity(typcache, vardata, constval,
+ operator);
+ if (hist_selec < 0.0)
+ hist_selec = default_range_selectivity(operator);
+
+ /*
+ * Now merge the results for the empty ranges and histogram
+ * calculations, realizing that the histogram covers only the
+ * non-null, non-empty values.
+ */
+ if (operator == OID_RANGE_CONTAINED_OP)
+ {
+ /* empty is contained by anything non-empty */
+ selec = (1.0 - empty_frac) * hist_selec + empty_frac;
+ }
+ else
+ {
+ /* with any other operator, empty Op non-empty matches nothing */
+ selec = (1.0 - empty_frac) * hist_selec;
+ }
+ }
+
+ /* all range operators are strict */
+ selec *= (1.0 - null_frac);
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * Calculate range operator selectivity using histograms of range bounds.
+ *
+ * This estimate is for the portion of values that are not empty and not
+ * NULL.
+ */
+static double
+calc_hist_selectivity(TypeCacheEntry *typcache, VariableStatData *vardata,
+ const RangeType *constval, Oid operator)
+{
+ AttStatsSlot hslot;
+ AttStatsSlot lslot;
+ int nhist;
+ RangeBound *hist_lower;
+ RangeBound *hist_upper;
+ int i;
+ RangeBound const_lower;
+ RangeBound const_upper;
+ bool empty;
+ double hist_selec;
+
+ /* Can't use the histogram with insecure range support functions */
+ if (!statistic_proc_security_check(vardata,
+ typcache->rng_cmp_proc_finfo.fn_oid))
+ return -1;
+ if (OidIsValid(typcache->rng_subdiff_finfo.fn_oid) &&
+ !statistic_proc_security_check(vardata,
+ typcache->rng_subdiff_finfo.fn_oid))
+ return -1;
+
+ /* Try to get histogram of ranges */
+ if (!(HeapTupleIsValid(vardata->statsTuple) &&
+ get_attstatsslot(&hslot, vardata->statsTuple,
+ STATISTIC_KIND_BOUNDS_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES)))
+ return -1.0;
+
+ /* check that it's a histogram, not just a dummy entry */
+ if (hslot.nvalues < 2)
+ {
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+
+ /*
+ * Convert histogram of ranges into histograms of its lower and upper
+ * bounds.
+ */
+ nhist = hslot.nvalues;
+ hist_lower = (RangeBound *) palloc(sizeof(RangeBound) * nhist);
+ hist_upper = (RangeBound *) palloc(sizeof(RangeBound) * nhist);
+ for (i = 0; i < nhist; i++)
+ {
+ range_deserialize(typcache, DatumGetRangeTypeP(hslot.values[i]),
+ &hist_lower[i], &hist_upper[i], &empty);
+ /* The histogram should not contain any empty ranges */
+ if (empty)
+ elog(ERROR, "bounds histogram contains an empty range");
+ }
+
+ /* @> and @< also need a histogram of range lengths */
+ if (operator == OID_RANGE_CONTAINS_OP ||
+ operator == OID_RANGE_CONTAINED_OP)
+ {
+ if (!(HeapTupleIsValid(vardata->statsTuple) &&
+ get_attstatsslot(&lslot, vardata->statsTuple,
+ STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM,
+ InvalidOid,
+ ATTSTATSSLOT_VALUES)))
+ {
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+
+ /* check that it's a histogram, not just a dummy entry */
+ if (lslot.nvalues < 2)
+ {
+ free_attstatsslot(&lslot);
+ free_attstatsslot(&hslot);
+ return -1.0;
+ }
+ }
+ else
+ memset(&lslot, 0, sizeof(lslot));
+
+ /* Extract the bounds of the constant value. */
+ range_deserialize(typcache, constval, &const_lower, &const_upper, &empty);
+ Assert(!empty);
+
+ /*
+ * Calculate selectivity comparing the lower or upper bound of the
+ * constant with the histogram of lower or upper bounds.
+ */
+ switch (operator)
+ {
+ case OID_RANGE_LESS_OP:
+
+ /*
+ * The regular b-tree comparison operators (<, <=, >, >=) compare
+ * the lower bounds first, and the upper bounds for values with
+ * equal lower bounds. Estimate that by comparing the lower bounds
+ * only. This gives a fairly accurate estimate assuming there
+ * aren't many rows with a lower bound equal to the constant's
+ * lower bound.
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_RANGE_LESS_EQUAL_OP:
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_RANGE_GREATER_OP:
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_RANGE_GREATER_EQUAL_OP:
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_RANGE_LEFT_OP:
+ /* var << const when upper(var) < lower(const) */
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_upper, nhist, false);
+ break;
+
+ case OID_RANGE_RIGHT_OP:
+ /* var >> const when lower(var) > upper(const) */
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(typcache, &const_upper,
+ hist_lower, nhist, true);
+ break;
+
+ case OID_RANGE_OVERLAPS_RIGHT_OP:
+ /* compare lower bounds */
+ hist_selec =
+ 1 - calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, false);
+ break;
+
+ case OID_RANGE_OVERLAPS_LEFT_OP:
+ /* compare upper bounds */
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_upper,
+ hist_upper, nhist, true);
+ break;
+
+ case OID_RANGE_OVERLAP_OP:
+ case OID_RANGE_CONTAINS_ELEM_OP:
+
+ /*
+ * A && B <=> NOT (A << B OR A >> B).
+ *
+ * Since A << B and A >> B are mutually exclusive events we can
+ * sum their probabilities to find probability of (A << B OR A >>
+ * B).
+ *
+ * "range @> elem" is equivalent to "range && [elem,elem]". The
+ * caller already constructed the singular range from the element
+ * constant, so just treat it the same as &&.
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_lower, hist_upper,
+ nhist, false);
+ hist_selec +=
+ (1.0 - calc_hist_selectivity_scalar(typcache, &const_upper, hist_lower,
+ nhist, true));
+ hist_selec = 1.0 - hist_selec;
+ break;
+
+ case OID_RANGE_CONTAINS_OP:
+ hist_selec =
+ calc_hist_selectivity_contains(typcache, &const_lower,
+ &const_upper, hist_lower, nhist,
+ lslot.values, lslot.nvalues);
+ break;
+
+ case OID_RANGE_CONTAINED_OP:
+ if (const_lower.infinite)
+ {
+ /*
+ * Lower bound no longer matters. Just estimate the fraction
+ * with an upper bound <= const upper bound
+ */
+ hist_selec =
+ calc_hist_selectivity_scalar(typcache, &const_upper,
+ hist_upper, nhist, true);
+ }
+ else if (const_upper.infinite)
+ {
+ hist_selec =
+ 1.0 - calc_hist_selectivity_scalar(typcache, &const_lower,
+ hist_lower, nhist, false);
+ }
+ else
+ {
+ hist_selec =
+ calc_hist_selectivity_contained(typcache, &const_lower,
+ &const_upper, hist_lower, nhist,
+ lslot.values, lslot.nvalues);
+ }
+ break;
+
+ default:
+ elog(ERROR, "unknown range operator %u", operator);
+ hist_selec = -1.0; /* keep compiler quiet */
+ break;
+ }
+
+ free_attstatsslot(&lslot);
+ free_attstatsslot(&hslot);
+
+ return hist_selec;
+}
+
+
+/*
+ * Look up the fraction of values less than (or equal, if 'equal' argument
+ * is true) a given const in a histogram of range bounds.
+ */
+static double
+calc_hist_selectivity_scalar(TypeCacheEntry *typcache, const RangeBound *constbound,
+ const RangeBound *hist, int hist_nvalues, bool equal)
+{
+ Selectivity selec;
+ int index;
+
+ /*
+ * Find the histogram bin the given constant falls into. Estimate
+ * selectivity as the number of preceding whole bins.
+ */
+ index = rbound_bsearch(typcache, constbound, hist, hist_nvalues, equal);
+ selec = (Selectivity) (Max(index, 0)) / (Selectivity) (hist_nvalues - 1);
+
+ /* Adjust using linear interpolation within the bin */
+ if (index >= 0 && index < hist_nvalues - 1)
+ selec += get_position(typcache, constbound, &hist[index],
+ &hist[index + 1]) / (Selectivity) (hist_nvalues - 1);
+
+ return selec;
+}
+
+/*
+ * Binary search on an array of range bounds. Returns greatest index of range
+ * bound in array which is less(less or equal) than given range bound. If all
+ * range bounds in array are greater or equal(greater) than given range bound,
+ * return -1. When "equal" flag is set conditions in brackets are used.
+ *
+ * This function is used in scalar operator selectivity estimation. Another
+ * goal of this function is to find a histogram bin where to stop
+ * interpolation of portion of bounds which are less than or equal to given bound.
+ */
+static int
+rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value, const RangeBound *hist,
+ int hist_length, bool equal)
+{
+ int lower = -1,
+ upper = hist_length - 1,
+ cmp,
+ middle;
+
+ while (lower < upper)
+ {
+ middle = (lower + upper + 1) / 2;
+ cmp = range_cmp_bounds(typcache, &hist[middle], value);
+
+ if (cmp < 0 || (equal && cmp == 0))
+ lower = middle;
+ else
+ upper = middle - 1;
+ }
+ return lower;
+}
+
+
+/*
+ * Binary search on length histogram. Returns greatest index of range length in
+ * histogram which is less than (less than or equal) the given length value. If
+ * all lengths in the histogram are greater than (greater than or equal) the
+ * given length, returns -1.
+ */
+static int
+length_hist_bsearch(Datum *length_hist_values, int length_hist_nvalues,
+ double value, bool equal)
+{
+ int lower = -1,
+ upper = length_hist_nvalues - 1,
+ middle;
+
+ while (lower < upper)
+ {
+ double middleval;
+
+ middle = (lower + upper + 1) / 2;
+
+ middleval = DatumGetFloat8(length_hist_values[middle]);
+ if (middleval < value || (equal && middleval <= value))
+ lower = middle;
+ else
+ upper = middle - 1;
+ }
+ return lower;
+}
+
+/*
+ * Get relative position of value in histogram bin in [0,1] range.
+ */
+static float8
+get_position(TypeCacheEntry *typcache, const RangeBound *value, const RangeBound *hist1,
+ const RangeBound *hist2)
+{
+ bool has_subdiff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+ float8 position;
+
+ if (!hist1->infinite && !hist2->infinite)
+ {
+ float8 bin_width;
+
+ /*
+ * Both bounds are finite. Assuming the subtype's comparison function
+ * works sanely, the value must be finite, too, because it lies
+ * somewhere between the bounds. If it doesn't, arbitrarily return
+ * 0.5.
+ */
+ if (value->infinite)
+ return 0.5;
+
+ /* Can't interpolate without subdiff function */
+ if (!has_subdiff)
+ return 0.5;
+
+ /* Calculate relative position using subdiff function. */
+ bin_width = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ hist2->val,
+ hist1->val));
+ if (isnan(bin_width) || bin_width <= 0.0)
+ return 0.5; /* punt for NaN or zero-width bin */
+
+ position = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ value->val,
+ hist1->val))
+ / bin_width;
+
+ if (isnan(position))
+ return 0.5; /* punt for NaN from subdiff, Inf/Inf, etc */
+
+ /* Relative position must be in [0,1] range */
+ position = Max(position, 0.0);
+ position = Min(position, 1.0);
+ return position;
+ }
+ else if (hist1->infinite && !hist2->infinite)
+ {
+ /*
+ * Lower bin boundary is -infinite, upper is finite. If the value is
+ * -infinite, return 0.0 to indicate it's equal to the lower bound.
+ * Otherwise return 1.0 to indicate it's infinitely far from the lower
+ * bound.
+ */
+ return ((value->infinite && value->lower) ? 0.0 : 1.0);
+ }
+ else if (!hist1->infinite && hist2->infinite)
+ {
+ /* same as above, but in reverse */
+ return ((value->infinite && !value->lower) ? 1.0 : 0.0);
+ }
+ else
+ {
+ /*
+ * If both bin boundaries are infinite, they should be equal to each
+ * other, and the value should also be infinite and equal to both
+ * bounds. (But don't Assert that, to avoid crashing if a user creates
+ * a datatype with a broken comparison function).
+ *
+ * Assume the value to lie in the middle of the infinite bounds.
+ */
+ return 0.5;
+ }
+}
+
+
+/*
+ * Get relative position of value in a length histogram bin in [0,1] range.
+ */
+static double
+get_len_position(double value, double hist1, double hist2)
+{
+ if (!isinf(hist1) && !isinf(hist2))
+ {
+ /*
+ * Both bounds are finite. The value should be finite too, because it
+ * lies somewhere between the bounds. If it doesn't, just return
+ * something.
+ */
+ if (isinf(value))
+ return 0.5;
+
+ return 1.0 - (hist2 - value) / (hist2 - hist1);
+ }
+ else if (isinf(hist1) && !isinf(hist2))
+ {
+ /*
+ * Lower bin boundary is -infinite, upper is finite. Return 1.0 to
+ * indicate the value is infinitely far from the lower bound.
+ */
+ return 1.0;
+ }
+ else if (isinf(hist1) && isinf(hist2))
+ {
+ /* same as above, but in reverse */
+ return 0.0;
+ }
+ else
+ {
+ /*
+ * If both bin boundaries are infinite, they should be equal to each
+ * other, and the value should also be infinite and equal to both
+ * bounds. (But don't Assert that, to avoid crashing unnecessarily if
+ * the caller messes up)
+ *
+ * Assume the value to lie in the middle of the infinite bounds.
+ */
+ return 0.5;
+ }
+}
+
+/*
+ * Measure distance between two range bounds.
+ */
+static float8
+get_distance(TypeCacheEntry *typcache, const RangeBound *bound1, const RangeBound *bound2)
+{
+ bool has_subdiff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+
+ if (!bound1->infinite && !bound2->infinite)
+ {
+ /*
+ * Neither bound is infinite, use subdiff function or return default
+ * value of 1.0 if no subdiff is available.
+ */
+ if (has_subdiff)
+ {
+ float8 res;
+
+ res = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ bound2->val,
+ bound1->val));
+ /* Reject possible NaN result, also negative result */
+ if (isnan(res) || res < 0.0)
+ return 1.0;
+ else
+ return res;
+ }
+ else
+ return 1.0;
+ }
+ else if (bound1->infinite && bound2->infinite)
+ {
+ /* Both bounds are infinite */
+ if (bound1->lower == bound2->lower)
+ return 0.0;
+ else
+ return get_float8_infinity();
+ }
+ else
+ {
+ /* One bound is infinite, the other is not */
+ return get_float8_infinity();
+ }
+}
+
+/*
+ * Calculate the average of function P(x), in the interval [length1, length2],
+ * where P(x) is the fraction of tuples with length < x (or length <= x if
+ * 'equal' is true).
+ */
+static double
+calc_length_hist_frac(Datum *length_hist_values, int length_hist_nvalues,
+ double length1, double length2, bool equal)
+{
+ double frac;
+ double A,
+ B,
+ PA,
+ PB;
+ double pos;
+ int i;
+ double area;
+
+ Assert(length2 >= length1);
+
+ if (length2 < 0.0)
+ return 0.0; /* shouldn't happen, but doesn't hurt to check */
+
+ /* All lengths in the table are <= infinite. */
+ if (isinf(length2) && equal)
+ return 1.0;
+
+ /*----------
+ * The average of a function between A and B can be calculated by the
+ * formula:
+ *
+ * B
+ * 1 /
+ * ------- | P(x)dx
+ * B - A /
+ * A
+ *
+ * The geometrical interpretation of the integral is the area under the
+ * graph of P(x). P(x) is defined by the length histogram. We calculate
+ * the area in a piecewise fashion, iterating through the length histogram
+ * bins. Each bin is a trapezoid:
+ *
+ * P(x2)
+ * /|
+ * / |
+ * P(x1)/ |
+ * | |
+ * | |
+ * ---+---+--
+ * x1 x2
+ *
+ * where x1 and x2 are the boundaries of the current histogram, and P(x1)
+ * and P(x1) are the cumulative fraction of tuples at the boundaries.
+ *
+ * The area of each trapezoid is 1/2 * (P(x2) + P(x1)) * (x2 - x1)
+ *
+ * The first bin contains the lower bound passed by the caller, so we
+ * use linear interpolation between the previous and next histogram bin
+ * boundary to calculate P(x1). Likewise for the last bin: we use linear
+ * interpolation to calculate P(x2). For the bins in between, x1 and x2
+ * lie on histogram bin boundaries, so P(x1) and P(x2) are simply:
+ * P(x1) = (bin index) / (number of bins)
+ * P(x2) = (bin index + 1 / (number of bins)
+ */
+
+ /* First bin, the one that contains lower bound */
+ i = length_hist_bsearch(length_hist_values, length_hist_nvalues, length1, equal);
+ if (i >= length_hist_nvalues - 1)
+ return 1.0;
+
+ if (i < 0)
+ {
+ i = 0;
+ pos = 0.0;
+ }
+ else
+ {
+ /* interpolate length1's position in the bin */
+ pos = get_len_position(length1,
+ DatumGetFloat8(length_hist_values[i]),
+ DatumGetFloat8(length_hist_values[i + 1]));
+ }
+ PB = (((double) i) + pos) / (double) (length_hist_nvalues - 1);
+ B = length1;
+
+ /*
+ * In the degenerate case that length1 == length2, simply return
+ * P(length1). This is not merely an optimization: if length1 == length2,
+ * we'd divide by zero later on.
+ */
+ if (length2 == length1)
+ return PB;
+
+ /*
+ * Loop through all the bins, until we hit the last bin, the one that
+ * contains the upper bound. (if lower and upper bounds are in the same
+ * bin, this falls out immediately)
+ */
+ area = 0.0;
+ for (; i < length_hist_nvalues - 1; i++)
+ {
+ double bin_upper = DatumGetFloat8(length_hist_values[i + 1]);
+
+ /* check if we've reached the last bin */
+ if (!(bin_upper < length2 || (equal && bin_upper <= length2)))
+ break;
+
+ /* the upper bound of previous bin is the lower bound of this bin */
+ A = B;
+ PA = PB;
+
+ B = bin_upper;
+ PB = (double) i / (double) (length_hist_nvalues - 1);
+
+ /*
+ * Add the area of this trapezoid to the total. The point of the
+ * if-check is to avoid NaN, in the corner case that PA == PB == 0,
+ * and B - A == Inf. The area of a zero-height trapezoid (PA == PB ==
+ * 0) is zero, regardless of the width (B - A).
+ */
+ if (PA > 0 || PB > 0)
+ area += 0.5 * (PB + PA) * (B - A);
+ }
+
+ /* Last bin */
+ A = B;
+ PA = PB;
+
+ B = length2; /* last bin ends at the query upper bound */
+ if (i >= length_hist_nvalues - 1)
+ pos = 0.0;
+ else
+ {
+ if (DatumGetFloat8(length_hist_values[i]) == DatumGetFloat8(length_hist_values[i + 1]))
+ pos = 0.0;
+ else
+ pos = get_len_position(length2, DatumGetFloat8(length_hist_values[i]), DatumGetFloat8(length_hist_values[i + 1]));
+ }
+ PB = (((double) i) + pos) / (double) (length_hist_nvalues - 1);
+
+ if (PA > 0 || PB > 0)
+ area += 0.5 * (PB + PA) * (B - A);
+
+ /*
+ * Ok, we have calculated the area, ie. the integral. Divide by width to
+ * get the requested average.
+ *
+ * Avoid NaN arising from infinite / infinite. This happens at least if
+ * length2 is infinite. It's not clear what the correct value would be in
+ * that case, so 0.5 seems as good as any value.
+ */
+ if (isinf(area) && isinf(length2))
+ frac = 0.5;
+ else
+ frac = area / (length2 - length1);
+
+ return frac;
+}
+
+/*
+ * Calculate selectivity of "var <@ const" operator, ie. estimate the fraction
+ * of ranges that fall within the constant lower and upper bounds. This uses
+ * the histograms of range lower bounds and range lengths, on the assumption
+ * that the range lengths are independent of the lower bounds.
+ *
+ * The caller has already checked that constant lower and upper bounds are
+ * finite.
+ */
+static double
+calc_hist_selectivity_contained(TypeCacheEntry *typcache,
+ const RangeBound *lower, RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues)
+{
+ int i,
+ upper_index;
+ float8 prev_dist;
+ double bin_width;
+ double upper_bin_width;
+ double sum_frac;
+
+ /*
+ * Begin by finding the bin containing the upper bound, in the lower bound
+ * histogram. Any range with a lower bound > constant upper bound can't
+ * match, ie. there are no matches in bins greater than upper_index.
+ */
+ upper->inclusive = !upper->inclusive;
+ upper->lower = true;
+ upper_index = rbound_bsearch(typcache, upper, hist_lower, hist_nvalues,
+ false);
+
+ /*
+ * If the upper bound value is below the histogram's lower limit, there
+ * are no matches.
+ */
+ if (upper_index < 0)
+ return 0.0;
+
+ /*
+ * If the upper bound value is at or beyond the histogram's upper limit,
+ * start our loop at the last actual bin, as though the upper bound were
+ * within that bin; get_position will clamp its result to 1.0 anyway.
+ * (This corresponds to assuming that the data population above the
+ * histogram's upper limit is empty, exactly like what we just assumed for
+ * the lower limit.)
+ */
+ upper_index = Min(upper_index, hist_nvalues - 2);
+
+ /*
+ * Calculate upper_bin_width, ie. the fraction of the (upper_index,
+ * upper_index + 1) bin which is greater than upper bound of query range
+ * using linear interpolation of subdiff function.
+ */
+ upper_bin_width = get_position(typcache, upper,
+ &hist_lower[upper_index],
+ &hist_lower[upper_index + 1]);
+
+ /*
+ * In the loop, dist and prev_dist are the distance of the "current" bin's
+ * lower and upper bounds from the constant upper bound.
+ *
+ * bin_width represents the width of the current bin. Normally it is 1.0,
+ * meaning a full width bin, but can be less in the corner cases: start
+ * and end of the loop. We start with bin_width = upper_bin_width, because
+ * we begin at the bin containing the upper bound.
+ */
+ prev_dist = 0.0;
+ bin_width = upper_bin_width;
+
+ sum_frac = 0.0;
+ for (i = upper_index; i >= 0; i--)
+ {
+ double dist;
+ double length_hist_frac;
+ bool final_bin = false;
+
+ /*
+ * dist -- distance from upper bound of query range to lower bound of
+ * the current bin in the lower bound histogram. Or to the lower bound
+ * of the constant range, if this is the final bin, containing the
+ * constant lower bound.
+ */
+ if (range_cmp_bounds(typcache, &hist_lower[i], lower) < 0)
+ {
+ dist = get_distance(typcache, lower, upper);
+
+ /*
+ * Subtract from bin_width the portion of this bin that we want to
+ * ignore.
+ */
+ bin_width -= get_position(typcache, lower, &hist_lower[i],
+ &hist_lower[i + 1]);
+ if (bin_width < 0.0)
+ bin_width = 0.0;
+ final_bin = true;
+ }
+ else
+ dist = get_distance(typcache, &hist_lower[i], upper);
+
+ /*
+ * Estimate the fraction of tuples in this bin that are narrow enough
+ * to not exceed the distance to the upper bound of the query range.
+ */
+ length_hist_frac = calc_length_hist_frac(length_hist_values,
+ length_hist_nvalues,
+ prev_dist, dist, true);
+
+ /*
+ * Add the fraction of tuples in this bin, with a suitable length, to
+ * the total.
+ */
+ sum_frac += length_hist_frac * bin_width / (double) (hist_nvalues - 1);
+
+ if (final_bin)
+ break;
+
+ bin_width = 1.0;
+ prev_dist = dist;
+ }
+
+ return sum_frac;
+}
+
+/*
+ * Calculate selectivity of "var @> const" operator, ie. estimate the fraction
+ * of ranges that contain the constant lower and upper bounds. This uses
+ * the histograms of range lower bounds and range lengths, on the assumption
+ * that the range lengths are independent of the lower bounds.
+ */
+static double
+calc_hist_selectivity_contains(TypeCacheEntry *typcache,
+ const RangeBound *lower, const RangeBound *upper,
+ const RangeBound *hist_lower, int hist_nvalues,
+ Datum *length_hist_values, int length_hist_nvalues)
+{
+ int i,
+ lower_index;
+ double bin_width,
+ lower_bin_width;
+ double sum_frac;
+ float8 prev_dist;
+
+ /* Find the bin containing the lower bound of query range. */
+ lower_index = rbound_bsearch(typcache, lower, hist_lower, hist_nvalues,
+ true);
+
+ /*
+ * If the lower bound value is below the histogram's lower limit, there
+ * are no matches.
+ */
+ if (lower_index < 0)
+ return 0.0;
+
+ /*
+ * If the lower bound value is at or beyond the histogram's upper limit,
+ * start our loop at the last actual bin, as though the upper bound were
+ * within that bin; get_position will clamp its result to 1.0 anyway.
+ * (This corresponds to assuming that the data population above the
+ * histogram's upper limit is empty, exactly like what we just assumed for
+ * the lower limit.)
+ */
+ lower_index = Min(lower_index, hist_nvalues - 2);
+
+ /*
+ * Calculate lower_bin_width, ie. the fraction of the of (lower_index,
+ * lower_index + 1) bin which is greater than lower bound of query range
+ * using linear interpolation of subdiff function.
+ */
+ lower_bin_width = get_position(typcache, lower, &hist_lower[lower_index],
+ &hist_lower[lower_index + 1]);
+
+ /*
+ * Loop through all the lower bound bins, smaller than the query lower
+ * bound. In the loop, dist and prev_dist are the distance of the
+ * "current" bin's lower and upper bounds from the constant upper bound.
+ * We begin from query lower bound, and walk backwards, so the first bin's
+ * upper bound is the query lower bound, and its distance to the query
+ * upper bound is the length of the query range.
+ *
+ * bin_width represents the width of the current bin. Normally it is 1.0,
+ * meaning a full width bin, except for the first bin, which is only
+ * counted up to the constant lower bound.
+ */
+ prev_dist = get_distance(typcache, lower, upper);
+ sum_frac = 0.0;
+ bin_width = lower_bin_width;
+ for (i = lower_index; i >= 0; i--)
+ {
+ float8 dist;
+ double length_hist_frac;
+
+ /*
+ * dist -- distance from upper bound of query range to current value
+ * of lower bound histogram or lower bound of query range (if we've
+ * reach it).
+ */
+ dist = get_distance(typcache, &hist_lower[i], upper);
+
+ /*
+ * Get average fraction of length histogram which covers intervals
+ * longer than (or equal to) distance to upper bound of query range.
+ */
+ length_hist_frac =
+ 1.0 - calc_length_hist_frac(length_hist_values,
+ length_hist_nvalues,
+ prev_dist, dist, false);
+
+ sum_frac += length_hist_frac * bin_width / (double) (hist_nvalues - 1);
+
+ bin_width = 1.0;
+ prev_dist = dist;
+ }
+
+ return sum_frac;
+}
diff --git a/src/backend/utils/adt/rangetypes_spgist.c b/src/backend/utils/adt/rangetypes_spgist.c
new file mode 100644
index 0000000..1190b80
--- /dev/null
+++ b/src/backend/utils/adt/rangetypes_spgist.c
@@ -0,0 +1,1000 @@
+/*-------------------------------------------------------------------------
+ *
+ * rangetypes_spgist.c
+ * implementation of quad tree over ranges mapped to 2d-points for SP-GiST.
+ *
+ * Quad tree is a data structure similar to a binary tree, but is adapted to
+ * 2d data. Each inner node of a quad tree contains a point (centroid) which
+ * divides the 2d-space into 4 quadrants. Each quadrant is associated with a
+ * child node.
+ *
+ * Ranges are mapped to 2d-points so that the lower bound is one dimension,
+ * and the upper bound is another. By convention, we visualize the lower bound
+ * to be the horizontal axis, and upper bound the vertical axis.
+ *
+ * One quirk with this mapping is the handling of empty ranges. An empty range
+ * doesn't have lower and upper bounds, so it cannot be mapped to 2d space in
+ * a straightforward way. To cope with that, the root node can have a 5th
+ * quadrant, which is reserved for empty ranges. Furthermore, there can be
+ * inner nodes in the tree with no centroid. They contain only two child nodes,
+ * one for empty ranges and another for non-empty ones. Such a node can appear
+ * as the root node, or in the tree under the 5th child of the root node (in
+ * which case it will only contain empty nodes).
+ *
+ * The SP-GiST picksplit function uses medians along both axes as the centroid.
+ * This implementation only uses the comparison function of the range element
+ * datatype, therefore it works for any range type.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rangetypes_spgist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/spgist.h"
+#include "access/stratnum.h"
+#include "catalog/pg_type.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/rangetypes.h"
+
+static int16 getQuadrant(TypeCacheEntry *typcache, const RangeType *centroid,
+ const RangeType *tst);
+static int bound_cmp(const void *a, const void *b, void *arg);
+
+static int adjacent_inner_consistent(TypeCacheEntry *typcache,
+ const RangeBound *arg, const RangeBound *centroid,
+ const RangeBound *prev);
+static int adjacent_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *arg,
+ const RangeBound *centroid);
+
+/*
+ * SP-GiST 'config' interface function.
+ */
+Datum
+spg_range_quad_config(PG_FUNCTION_ARGS)
+{
+ /* spgConfigIn *cfgin = (spgConfigIn *) PG_GETARG_POINTER(0); */
+ spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+
+ cfg->prefixType = ANYRANGEOID;
+ cfg->labelType = VOIDOID; /* we don't need node labels */
+ cfg->canReturnData = true;
+ cfg->longValuesOK = false;
+ PG_RETURN_VOID();
+}
+
+/*----------
+ * Determine which quadrant a 2d-mapped range falls into, relative to the
+ * centroid.
+ *
+ * Quadrants are numbered like this:
+ *
+ * 4 | 1
+ * ----+----
+ * 3 | 2
+ *
+ * Where the lower bound of range is the horizontal axis and upper bound the
+ * vertical axis.
+ *
+ * Ranges on one of the axes are taken to lie in the quadrant with higher value
+ * along perpendicular axis. That is, a value on the horizontal axis is taken
+ * to belong to quadrant 1 or 4, and a value on the vertical axis is taken to
+ * belong to quadrant 1 or 2. A range equal to centroid is taken to lie in
+ * quadrant 1.
+ *
+ * Empty ranges are taken to lie in the special quadrant 5.
+ *----------
+ */
+static int16
+getQuadrant(TypeCacheEntry *typcache, const RangeType *centroid, const RangeType *tst)
+{
+ RangeBound centroidLower,
+ centroidUpper;
+ bool centroidEmpty;
+ RangeBound lower,
+ upper;
+ bool empty;
+
+ range_deserialize(typcache, centroid, &centroidLower, &centroidUpper,
+ &centroidEmpty);
+ range_deserialize(typcache, tst, &lower, &upper, &empty);
+
+ if (empty)
+ return 5;
+
+ if (range_cmp_bounds(typcache, &lower, &centroidLower) >= 0)
+ {
+ if (range_cmp_bounds(typcache, &upper, &centroidUpper) >= 0)
+ return 1;
+ else
+ return 2;
+ }
+ else
+ {
+ if (range_cmp_bounds(typcache, &upper, &centroidUpper) >= 0)
+ return 4;
+ else
+ return 3;
+ }
+}
+
+/*
+ * Choose SP-GiST function: choose path for addition of new range.
+ */
+Datum
+spg_range_quad_choose(PG_FUNCTION_ARGS)
+{
+ spgChooseIn *in = (spgChooseIn *) PG_GETARG_POINTER(0);
+ spgChooseOut *out = (spgChooseOut *) PG_GETARG_POINTER(1);
+ RangeType *inRange = DatumGetRangeTypeP(in->datum),
+ *centroid;
+ int16 quadrant;
+ TypeCacheEntry *typcache;
+
+ if (in->allTheSame)
+ {
+ out->resultType = spgMatchNode;
+ /* nodeN will be set by core */
+ out->result.matchNode.levelAdd = 0;
+ out->result.matchNode.restDatum = RangeTypePGetDatum(inRange);
+ PG_RETURN_VOID();
+ }
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(inRange));
+
+ /*
+ * A node with no centroid divides ranges purely on whether they're empty
+ * or not. All empty ranges go to child node 0, all non-empty ranges go to
+ * node 1.
+ */
+ if (!in->hasPrefix)
+ {
+ out->resultType = spgMatchNode;
+ if (RangeIsEmpty(inRange))
+ out->result.matchNode.nodeN = 0;
+ else
+ out->result.matchNode.nodeN = 1;
+ out->result.matchNode.levelAdd = 1;
+ out->result.matchNode.restDatum = RangeTypePGetDatum(inRange);
+ PG_RETURN_VOID();
+ }
+
+ centroid = DatumGetRangeTypeP(in->prefixDatum);
+ quadrant = getQuadrant(typcache, centroid, inRange);
+
+ Assert(quadrant <= in->nNodes);
+
+ /* Select node matching to quadrant number */
+ out->resultType = spgMatchNode;
+ out->result.matchNode.nodeN = quadrant - 1;
+ out->result.matchNode.levelAdd = 1;
+ out->result.matchNode.restDatum = RangeTypePGetDatum(inRange);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * Bound comparison for sorting.
+ */
+static int
+bound_cmp(const void *a, const void *b, void *arg)
+{
+ RangeBound *ba = (RangeBound *) a;
+ RangeBound *bb = (RangeBound *) b;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+
+ return range_cmp_bounds(typcache, ba, bb);
+}
+
+/*
+ * Picksplit SP-GiST function: split ranges into nodes. Select "centroid"
+ * range and distribute ranges according to quadrants.
+ */
+Datum
+spg_range_quad_picksplit(PG_FUNCTION_ARGS)
+{
+ spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0);
+ spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1);
+ int i;
+ int j;
+ int nonEmptyCount;
+ RangeType *centroid;
+ bool empty;
+ TypeCacheEntry *typcache;
+
+ /* Use the median values of lower and upper bounds as the centroid range */
+ RangeBound *lowerBounds,
+ *upperBounds;
+
+ typcache = range_get_typcache(fcinfo,
+ RangeTypeGetOid(DatumGetRangeTypeP(in->datums[0])));
+
+ /* Allocate memory for bounds */
+ lowerBounds = palloc(sizeof(RangeBound) * in->nTuples);
+ upperBounds = palloc(sizeof(RangeBound) * in->nTuples);
+ j = 0;
+
+ /* Deserialize bounds of ranges, count non-empty ranges */
+ for (i = 0; i < in->nTuples; i++)
+ {
+ range_deserialize(typcache, DatumGetRangeTypeP(in->datums[i]),
+ &lowerBounds[j], &upperBounds[j], &empty);
+ if (!empty)
+ j++;
+ }
+ nonEmptyCount = j;
+
+ /*
+ * All the ranges are empty. The best we can do is to construct an inner
+ * node with no centroid, and put all ranges into node 0. If non-empty
+ * ranges are added later, they will be routed to node 1.
+ */
+ if (nonEmptyCount == 0)
+ {
+ out->nNodes = 2;
+ out->hasPrefix = false;
+ /* Prefix is empty */
+ out->prefixDatum = PointerGetDatum(NULL);
+ out->nodeLabels = NULL;
+
+ out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
+ out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
+
+ /* Place all ranges into node 0 */
+ for (i = 0; i < in->nTuples; i++)
+ {
+ RangeType *range = DatumGetRangeTypeP(in->datums[i]);
+
+ out->leafTupleDatums[i] = RangeTypePGetDatum(range);
+ out->mapTuplesToNodes[i] = 0;
+ }
+ PG_RETURN_VOID();
+ }
+
+ /* Sort range bounds in order to find medians */
+ qsort_arg(lowerBounds, nonEmptyCount, sizeof(RangeBound),
+ bound_cmp, typcache);
+ qsort_arg(upperBounds, nonEmptyCount, sizeof(RangeBound),
+ bound_cmp, typcache);
+
+ /* Construct "centroid" range from medians of lower and upper bounds */
+ centroid = range_serialize(typcache, &lowerBounds[nonEmptyCount / 2],
+ &upperBounds[nonEmptyCount / 2], false);
+ out->hasPrefix = true;
+ out->prefixDatum = RangeTypePGetDatum(centroid);
+
+ /* Create node for empty ranges only if it is a root node */
+ out->nNodes = (in->level == 0) ? 5 : 4;
+ out->nodeLabels = NULL; /* we don't need node labels */
+
+ out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
+ out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
+
+ /*
+ * Assign ranges to corresponding nodes according to quadrants relative to
+ * "centroid" range.
+ */
+ for (i = 0; i < in->nTuples; i++)
+ {
+ RangeType *range = DatumGetRangeTypeP(in->datums[i]);
+ int16 quadrant = getQuadrant(typcache, centroid, range);
+
+ out->leafTupleDatums[i] = RangeTypePGetDatum(range);
+ out->mapTuplesToNodes[i] = quadrant - 1;
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SP-GiST consistent function for inner nodes: check which nodes are
+ * consistent with given set of queries.
+ */
+Datum
+spg_range_quad_inner_consistent(PG_FUNCTION_ARGS)
+{
+ spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0);
+ spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
+ int which;
+ int i;
+ MemoryContext oldCtx;
+
+ /*
+ * For adjacent search we need also previous centroid (if any) to improve
+ * the precision of the consistent check. In this case needPrevious flag
+ * is set and centroid is passed into traversalValue.
+ */
+ bool needPrevious = false;
+
+ if (in->allTheSame)
+ {
+ /* Report that all nodes should be visited */
+ out->nNodes = in->nNodes;
+ out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ for (i = 0; i < in->nNodes; i++)
+ out->nodeNumbers[i] = i;
+ PG_RETURN_VOID();
+ }
+
+ if (!in->hasPrefix)
+ {
+ /*
+ * No centroid on this inner node. Such a node has two child nodes,
+ * the first for empty ranges, and the second for non-empty ones.
+ */
+ Assert(in->nNodes == 2);
+
+ /*
+ * Nth bit of which variable means that (N - 1)th node should be
+ * visited. Initially all bits are set. Bits of nodes which should be
+ * skipped will be unset.
+ */
+ which = (1 << 1) | (1 << 2);
+ for (i = 0; i < in->nkeys; i++)
+ {
+ StrategyNumber strategy = in->scankeys[i].sk_strategy;
+ bool empty;
+
+ /*
+ * The only strategy when second argument of operator is not range
+ * is RANGESTRAT_CONTAINS_ELEM.
+ */
+ if (strategy != RANGESTRAT_CONTAINS_ELEM)
+ empty = RangeIsEmpty(DatumGetRangeTypeP(in->scankeys[i].sk_argument));
+ else
+ empty = false;
+
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ case RANGESTRAT_OVERLEFT:
+ case RANGESTRAT_OVERLAPS:
+ case RANGESTRAT_OVERRIGHT:
+ case RANGESTRAT_AFTER:
+ case RANGESTRAT_ADJACENT:
+ /* These strategies return false if any argument is empty */
+ if (empty)
+ which = 0;
+ else
+ which &= (1 << 2);
+ break;
+
+ case RANGESTRAT_CONTAINS:
+
+ /*
+ * All ranges contain an empty range. Only non-empty
+ * ranges can contain a non-empty range.
+ */
+ if (!empty)
+ which &= (1 << 2);
+ break;
+
+ case RANGESTRAT_CONTAINED_BY:
+
+ /*
+ * Only an empty range is contained by an empty range.
+ * Both empty and non-empty ranges can be contained by a
+ * non-empty range.
+ */
+ if (empty)
+ which &= (1 << 1);
+ break;
+
+ case RANGESTRAT_CONTAINS_ELEM:
+ which &= (1 << 2);
+ break;
+
+ case RANGESTRAT_EQ:
+ if (empty)
+ which &= (1 << 1);
+ else
+ which &= (1 << 2);
+ break;
+
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ break;
+ }
+ if (which == 0)
+ break; /* no need to consider remaining conditions */
+ }
+ }
+ else
+ {
+ RangeBound centroidLower,
+ centroidUpper;
+ bool centroidEmpty;
+ TypeCacheEntry *typcache;
+ RangeType *centroid;
+
+ /* This node has a centroid. Fetch it. */
+ centroid = DatumGetRangeTypeP(in->prefixDatum);
+ typcache = range_get_typcache(fcinfo,
+ RangeTypeGetOid(DatumGetRangeTypeP(centroid)));
+ range_deserialize(typcache, centroid, &centroidLower, &centroidUpper,
+ &centroidEmpty);
+
+ Assert(in->nNodes == 4 || in->nNodes == 5);
+
+ /*
+ * Nth bit of which variable means that (N - 1)th node (Nth quadrant)
+ * should be visited. Initially all bits are set. Bits of nodes which
+ * can be skipped will be unset.
+ */
+ which = (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
+
+ for (i = 0; i < in->nkeys; i++)
+ {
+ StrategyNumber strategy;
+ RangeBound lower,
+ upper;
+ bool empty;
+ RangeType *range = NULL;
+
+ RangeType *prevCentroid = NULL;
+ RangeBound prevLower,
+ prevUpper;
+ bool prevEmpty;
+
+ /* Restrictions on range bounds according to scan strategy */
+ RangeBound *minLower = NULL,
+ *maxLower = NULL,
+ *minUpper = NULL,
+ *maxUpper = NULL;
+
+ /* Are the restrictions on range bounds inclusive? */
+ bool inclusive = true;
+ bool strictEmpty = true;
+ int cmp,
+ which1,
+ which2;
+
+ strategy = in->scankeys[i].sk_strategy;
+
+ /*
+ * RANGESTRAT_CONTAINS_ELEM is just like RANGESTRAT_CONTAINS, but
+ * the argument is a single element. Expand the single element to
+ * a range containing only the element, and treat it like
+ * RANGESTRAT_CONTAINS.
+ */
+ if (strategy == RANGESTRAT_CONTAINS_ELEM)
+ {
+ lower.inclusive = true;
+ lower.infinite = false;
+ lower.lower = true;
+ lower.val = in->scankeys[i].sk_argument;
+
+ upper.inclusive = true;
+ upper.infinite = false;
+ upper.lower = false;
+ upper.val = in->scankeys[i].sk_argument;
+
+ empty = false;
+
+ strategy = RANGESTRAT_CONTAINS;
+ }
+ else
+ {
+ range = DatumGetRangeTypeP(in->scankeys[i].sk_argument);
+ range_deserialize(typcache, range, &lower, &upper, &empty);
+ }
+
+ /*
+ * Most strategies are handled by forming a bounding box from the
+ * search key, defined by a minLower, maxLower, minUpper,
+ * maxUpper. Some modify 'which' directly, to specify exactly
+ * which quadrants need to be visited.
+ *
+ * For most strategies, nothing matches an empty search key, and
+ * an empty range never matches a non-empty key. If a strategy
+ * does not behave like that wrt. empty ranges, set strictEmpty to
+ * false.
+ */
+ switch (strategy)
+ {
+ case RANGESTRAT_BEFORE:
+
+ /*
+ * Range A is before range B if upper bound of A is lower
+ * than lower bound of B.
+ */
+ maxUpper = &lower;
+ inclusive = false;
+ break;
+
+ case RANGESTRAT_OVERLEFT:
+
+ /*
+ * Range A is overleft to range B if upper bound of A is
+ * less than or equal to upper bound of B.
+ */
+ maxUpper = &upper;
+ break;
+
+ case RANGESTRAT_OVERLAPS:
+
+ /*
+ * Non-empty ranges overlap, if lower bound of each range
+ * is lower or equal to upper bound of the other range.
+ */
+ maxLower = &upper;
+ minUpper = &lower;
+ break;
+
+ case RANGESTRAT_OVERRIGHT:
+
+ /*
+ * Range A is overright to range B if lower bound of A is
+ * greater than or equal to lower bound of B.
+ */
+ minLower = &lower;
+ break;
+
+ case RANGESTRAT_AFTER:
+
+ /*
+ * Range A is after range B if lower bound of A is greater
+ * than upper bound of B.
+ */
+ minLower = &upper;
+ inclusive = false;
+ break;
+
+ case RANGESTRAT_ADJACENT:
+ if (empty)
+ break; /* Skip to strictEmpty check. */
+
+ /*
+ * Previously selected quadrant could exclude possibility
+ * for lower or upper bounds to be adjacent. Deserialize
+ * previous centroid range if present for checking this.
+ */
+ if (in->traversalValue)
+ {
+ prevCentroid = DatumGetRangeTypeP(in->traversalValue);
+ range_deserialize(typcache, prevCentroid,
+ &prevLower, &prevUpper, &prevEmpty);
+ }
+
+ /*
+ * For a range's upper bound to be adjacent to the
+ * argument's lower bound, it will be found along the line
+ * adjacent to (and just below) Y=lower. Therefore, if the
+ * argument's lower bound is less than the centroid's
+ * upper bound, the line falls in quadrants 2 and 3; if
+ * greater, the line falls in quadrants 1 and 4. (see
+ * adjacent_cmp_bounds for description of edge cases).
+ */
+ cmp = adjacent_inner_consistent(typcache, &lower,
+ &centroidUpper,
+ prevCentroid ? &prevUpper : NULL);
+ if (cmp > 0)
+ which1 = (1 << 1) | (1 << 4);
+ else if (cmp < 0)
+ which1 = (1 << 2) | (1 << 3);
+ else
+ which1 = 0;
+
+ /*
+ * Also search for ranges's adjacent to argument's upper
+ * bound. They will be found along the line adjacent to
+ * (and just right of) X=upper, which falls in quadrants 3
+ * and 4, or 1 and 2.
+ */
+ cmp = adjacent_inner_consistent(typcache, &upper,
+ &centroidLower,
+ prevCentroid ? &prevLower : NULL);
+ if (cmp > 0)
+ which2 = (1 << 1) | (1 << 2);
+ else if (cmp < 0)
+ which2 = (1 << 3) | (1 << 4);
+ else
+ which2 = 0;
+
+ /* We must chase down ranges adjacent to either bound. */
+ which &= which1 | which2;
+
+ needPrevious = true;
+ break;
+
+ case RANGESTRAT_CONTAINS:
+
+ /*
+ * Non-empty range A contains non-empty range B if lower
+ * bound of A is lower or equal to lower bound of range B
+ * and upper bound of range A is greater than or equal to
+ * upper bound of range A.
+ *
+ * All non-empty ranges contain an empty range.
+ */
+ strictEmpty = false;
+ if (!empty)
+ {
+ which &= (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4);
+ maxLower = &lower;
+ minUpper = &upper;
+ }
+ break;
+
+ case RANGESTRAT_CONTAINED_BY:
+ /* The opposite of contains. */
+ strictEmpty = false;
+ if (empty)
+ {
+ /* An empty range is only contained by an empty range */
+ which &= (1 << 5);
+ }
+ else
+ {
+ minLower = &lower;
+ maxUpper = &upper;
+ }
+ break;
+
+ case RANGESTRAT_EQ:
+
+ /*
+ * Equal range can be only in the same quadrant where
+ * argument would be placed to.
+ */
+ strictEmpty = false;
+ which &= (1 << getQuadrant(typcache, centroid, range));
+ break;
+
+ default:
+ elog(ERROR, "unrecognized range strategy: %d", strategy);
+ break;
+ }
+
+ if (strictEmpty)
+ {
+ if (empty)
+ {
+ /* Scan key is empty, no branches are satisfying */
+ which = 0;
+ break;
+ }
+ else
+ {
+ /* Shouldn't visit tree branch with empty ranges */
+ which &= (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4);
+ }
+ }
+
+ /*
+ * Using the bounding box, see which quadrants we have to descend
+ * into.
+ */
+ if (minLower)
+ {
+ /*
+ * If the centroid's lower bound is less than or equal to the
+ * minimum lower bound, anything in the 3rd and 4th quadrants
+ * will have an even smaller lower bound, and thus can't
+ * match.
+ */
+ if (range_cmp_bounds(typcache, &centroidLower, minLower) <= 0)
+ which &= (1 << 1) | (1 << 2) | (1 << 5);
+ }
+ if (maxLower)
+ {
+ /*
+ * If the centroid's lower bound is greater than the maximum
+ * lower bound, anything in the 1st and 2nd quadrants will
+ * also have a greater than or equal lower bound, and thus
+ * can't match. If the centroid's lower bound is equal to the
+ * maximum lower bound, we can still exclude the 1st and 2nd
+ * quadrants if we're looking for a value strictly greater
+ * than the maximum.
+ */
+ int cmp;
+
+ cmp = range_cmp_bounds(typcache, &centroidLower, maxLower);
+ if (cmp > 0 || (!inclusive && cmp == 0))
+ which &= (1 << 3) | (1 << 4) | (1 << 5);
+ }
+ if (minUpper)
+ {
+ /*
+ * If the centroid's upper bound is less than or equal to the
+ * minimum upper bound, anything in the 2nd and 3rd quadrants
+ * will have an even smaller upper bound, and thus can't
+ * match.
+ */
+ if (range_cmp_bounds(typcache, &centroidUpper, minUpper) <= 0)
+ which &= (1 << 1) | (1 << 4) | (1 << 5);
+ }
+ if (maxUpper)
+ {
+ /*
+ * If the centroid's upper bound is greater than the maximum
+ * upper bound, anything in the 1st and 4th quadrants will
+ * also have a greater than or equal upper bound, and thus
+ * can't match. If the centroid's upper bound is equal to the
+ * maximum upper bound, we can still exclude the 1st and 4th
+ * quadrants if we're looking for a value strictly greater
+ * than the maximum.
+ */
+ int cmp;
+
+ cmp = range_cmp_bounds(typcache, &centroidUpper, maxUpper);
+ if (cmp > 0 || (!inclusive && cmp == 0))
+ which &= (1 << 2) | (1 << 3) | (1 << 5);
+ }
+
+ if (which == 0)
+ break; /* no need to consider remaining conditions */
+ }
+ }
+
+ /* We must descend into the quadrant(s) identified by 'which' */
+ out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ if (needPrevious)
+ out->traversalValues = (void **) palloc(sizeof(void *) * in->nNodes);
+ out->nNodes = 0;
+
+ /*
+ * Elements of traversalValues should be allocated in
+ * traversalMemoryContext
+ */
+ oldCtx = MemoryContextSwitchTo(in->traversalMemoryContext);
+
+ for (i = 1; i <= in->nNodes; i++)
+ {
+ if (which & (1 << i))
+ {
+ /* Save previous prefix if needed */
+ if (needPrevious)
+ {
+ Datum previousCentroid;
+
+ /*
+ * We know, that in->prefixDatum in this place is varlena,
+ * because it's range
+ */
+ previousCentroid = datumCopy(in->prefixDatum, false, -1);
+ out->traversalValues[out->nNodes] = (void *) previousCentroid;
+ }
+ out->nodeNumbers[out->nNodes] = i - 1;
+ out->nNodes++;
+ }
+ }
+
+ MemoryContextSwitchTo(oldCtx);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * adjacent_cmp_bounds
+ *
+ * Given an argument and centroid bound, this function determines if any
+ * bounds that are adjacent to the argument are smaller than, or greater than
+ * or equal to centroid. For brevity, we call the arg < centroid "left", and
+ * arg >= centroid case "right". This corresponds to how the quadrants are
+ * arranged, if you imagine that "left" is equivalent to "down" and "right"
+ * is equivalent to "up".
+ *
+ * For the "left" case, returns -1, and for the "right" case, returns 1.
+ */
+static int
+adjacent_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *arg,
+ const RangeBound *centroid)
+{
+ int cmp;
+
+ Assert(arg->lower != centroid->lower);
+
+ cmp = range_cmp_bounds(typcache, arg, centroid);
+
+ if (centroid->lower)
+ {
+ /*------
+ * The argument is an upper bound, we are searching for adjacent lower
+ * bounds. A matching adjacent lower bound must be *larger* than the
+ * argument, but only just.
+ *
+ * The following table illustrates the desired result with a fixed
+ * argument bound, and different centroids. The CMP column shows
+ * the value of 'cmp' variable, and ADJ shows whether the argument
+ * and centroid are adjacent, per bounds_adjacent(). (N) means we
+ * don't need to check for that case, because it's implied by CMP.
+ * With the argument range [..., 500), the adjacent range we're
+ * searching for is [500, ...):
+ *
+ * ARGUMENT CENTROID CMP ADJ
+ * [..., 500) [498, ...) > (N) [500, ...) is to the right
+ * [..., 500) [499, ...) = (N) [500, ...) is to the right
+ * [..., 500) [500, ...) < Y [500, ...) is to the right
+ * [..., 500) [501, ...) < N [500, ...) is to the left
+ *
+ * So, we must search left when the argument is smaller than, and not
+ * adjacent, to the centroid. Otherwise search right.
+ *------
+ */
+ if (cmp < 0 && !bounds_adjacent(typcache, *arg, *centroid))
+ return -1;
+ else
+ return 1;
+ }
+ else
+ {
+ /*------
+ * The argument is a lower bound, we are searching for adjacent upper
+ * bounds. A matching adjacent upper bound must be *smaller* than the
+ * argument, but only just.
+ *
+ * ARGUMENT CENTROID CMP ADJ
+ * [500, ...) [..., 499) > (N) [..., 500) is to the right
+ * [500, ...) [..., 500) > (Y) [..., 500) is to the right
+ * [500, ...) [..., 501) = (N) [..., 500) is to the left
+ * [500, ...) [..., 502) < (N) [..., 500) is to the left
+ *
+ * We must search left when the argument is smaller than or equal to
+ * the centroid. Otherwise search right. We don't need to check
+ * whether the argument is adjacent with the centroid, because it
+ * doesn't matter.
+ *------
+ */
+ if (cmp <= 0)
+ return -1;
+ else
+ return 1;
+ }
+}
+
+/*----------
+ * adjacent_inner_consistent
+ *
+ * Like adjacent_cmp_bounds, but also takes into account the previous
+ * level's centroid. We might've traversed left (or right) at the previous
+ * node, in search for ranges adjacent to the other bound, even though we
+ * already ruled out the possibility for any matches in that direction for
+ * this bound. By comparing the argument with the previous centroid, and
+ * the previous centroid with the current centroid, we can determine which
+ * direction we should've moved in at previous level, and which direction we
+ * actually moved.
+ *
+ * If there can be any matches to the left, returns -1. If to the right,
+ * returns 1. If there can be no matches below this centroid, because we
+ * already ruled them out at the previous level, returns 0.
+ *
+ * XXX: Comparing just the previous and current level isn't foolproof; we
+ * might still search some branches unnecessarily. For example, imagine that
+ * we are searching for value 15, and we traverse the following centroids
+ * (only considering one bound for the moment):
+ *
+ * Level 1: 20
+ * Level 2: 50
+ * Level 3: 25
+ *
+ * At this point, previous centroid is 50, current centroid is 25, and the
+ * target value is to the left. But because we already moved right from
+ * centroid 20 to 50 in the first level, there cannot be any values < 20 in
+ * the current branch. But we don't know that just by looking at the previous
+ * and current centroid, so we traverse left, unnecessarily. The reason we are
+ * down this branch is that we're searching for matches with the *other*
+ * bound. If we kept track of which bound we are searching for explicitly,
+ * instead of deducing that from the previous and current centroid, we could
+ * avoid some unnecessary work.
+ *----------
+ */
+static int
+adjacent_inner_consistent(TypeCacheEntry *typcache, const RangeBound *arg,
+ const RangeBound *centroid, const RangeBound *prev)
+{
+ if (prev)
+ {
+ int prevcmp;
+ int cmp;
+
+ /*
+ * Which direction were we supposed to traverse at previous level,
+ * left or right?
+ */
+ prevcmp = adjacent_cmp_bounds(typcache, arg, prev);
+
+ /* and which direction did we actually go? */
+ cmp = range_cmp_bounds(typcache, centroid, prev);
+
+ /* if the two don't agree, there's nothing to see here */
+ if ((prevcmp < 0 && cmp >= 0) || (prevcmp > 0 && cmp < 0))
+ return 0;
+ }
+
+ return adjacent_cmp_bounds(typcache, arg, centroid);
+}
+
+/*
+ * SP-GiST consistent function for leaf nodes: check leaf value against query
+ * using corresponding function.
+ */
+Datum
+spg_range_quad_leaf_consistent(PG_FUNCTION_ARGS)
+{
+ spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0);
+ spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1);
+ RangeType *leafRange = DatumGetRangeTypeP(in->leafDatum);
+ TypeCacheEntry *typcache;
+ bool res;
+ int i;
+
+ /* all tests are exact */
+ out->recheck = false;
+
+ /* leafDatum is what it is... */
+ out->leafValue = in->leafDatum;
+
+ typcache = range_get_typcache(fcinfo, RangeTypeGetOid(leafRange));
+
+ /* Perform the required comparison(s) */
+ res = true;
+ for (i = 0; i < in->nkeys; i++)
+ {
+ Datum keyDatum = in->scankeys[i].sk_argument;
+
+ /* Call the function corresponding to the scan strategy */
+ switch (in->scankeys[i].sk_strategy)
+ {
+ case RANGESTRAT_BEFORE:
+ res = range_before_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_OVERLEFT:
+ res = range_overleft_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_OVERLAPS:
+ res = range_overlaps_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_OVERRIGHT:
+ res = range_overright_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_AFTER:
+ res = range_after_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_ADJACENT:
+ res = range_adjacent_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_CONTAINS:
+ res = range_contains_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_CONTAINED_BY:
+ res = range_contained_by_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ case RANGESTRAT_CONTAINS_ELEM:
+ res = range_contains_elem_internal(typcache, leafRange,
+ keyDatum);
+ break;
+ case RANGESTRAT_EQ:
+ res = range_eq_internal(typcache, leafRange,
+ DatumGetRangeTypeP(keyDatum));
+ break;
+ default:
+ elog(ERROR, "unrecognized range strategy: %d",
+ in->scankeys[i].sk_strategy);
+ break;
+ }
+
+ /*
+ * If leaf datum doesn't match to a query key, no need to check
+ * subsequent keys.
+ */
+ if (!res)
+ break;
+ }
+
+ PG_RETURN_BOOL(res);
+}
diff --git a/src/backend/utils/adt/rangetypes_typanalyze.c b/src/backend/utils/adt/rangetypes_typanalyze.c
new file mode 100644
index 0000000..2043d3f
--- /dev/null
+++ b/src/backend/utils/adt/rangetypes_typanalyze.c
@@ -0,0 +1,427 @@
+/*-------------------------------------------------------------------------
+ *
+ * rangetypes_typanalyze.c
+ * Functions for gathering statistics from range columns
+ *
+ * For a range type column, histograms of lower and upper bounds, and
+ * the fraction of NULL and empty ranges are collected.
+ *
+ * Both histograms have the same length, and they are combined into a
+ * single array of ranges. This has the same shape as the histogram that
+ * std_typanalyze would collect, but the values are different. Each range
+ * in the array is a valid range, even though the lower and upper bounds
+ * come from different tuples. In theory, the standard scalar selectivity
+ * functions could be used with the combined histogram.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rangetypes_typanalyze.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_operator.h"
+#include "commands/vacuum.h"
+#include "utils/float.h"
+#include "utils/fmgrprotos.h"
+#include "utils/lsyscache.h"
+#include "utils/rangetypes.h"
+#include "utils/multirangetypes.h"
+
+static int float8_qsort_cmp(const void *a1, const void *a2, void *arg);
+static int range_bound_qsort_cmp(const void *a1, const void *a2, void *arg);
+static void compute_range_stats(VacAttrStats *stats,
+ AnalyzeAttrFetchFunc fetchfunc, int samplerows,
+ double totalrows);
+
+/*
+ * range_typanalyze -- typanalyze function for range columns
+ */
+Datum
+range_typanalyze(PG_FUNCTION_ARGS)
+{
+ VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0);
+ TypeCacheEntry *typcache;
+ Form_pg_attribute attr = stats->attr;
+
+ /* Get information about range type; note column might be a domain */
+ typcache = range_get_typcache(fcinfo, getBaseType(stats->attrtypid));
+
+ if (attr->attstattarget < 0)
+ attr->attstattarget = default_statistics_target;
+
+ stats->compute_stats = compute_range_stats;
+ stats->extra_data = typcache;
+ /* same as in std_typanalyze */
+ stats->minrows = 300 * attr->attstattarget;
+
+ PG_RETURN_BOOL(true);
+}
+
+/*
+ * multirange_typanalyze -- typanalyze function for multirange columns
+ *
+ * We do the same analysis as for ranges, but on the smallest range that
+ * completely includes the multirange.
+ */
+Datum
+multirange_typanalyze(PG_FUNCTION_ARGS)
+{
+ VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0);
+ TypeCacheEntry *typcache;
+ Form_pg_attribute attr = stats->attr;
+
+ /* Get information about multirange type; note column might be a domain */
+ typcache = multirange_get_typcache(fcinfo, getBaseType(stats->attrtypid));
+
+ if (attr->attstattarget < 0)
+ attr->attstattarget = default_statistics_target;
+
+ stats->compute_stats = compute_range_stats;
+ stats->extra_data = typcache;
+ /* same as in std_typanalyze */
+ stats->minrows = 300 * attr->attstattarget;
+
+ PG_RETURN_BOOL(true);
+}
+
+/*
+ * Comparison function for sorting float8s, used for range lengths.
+ */
+static int
+float8_qsort_cmp(const void *a1, const void *a2, void *arg)
+{
+ const float8 *f1 = (const float8 *) a1;
+ const float8 *f2 = (const float8 *) a2;
+
+ if (*f1 < *f2)
+ return -1;
+ else if (*f1 == *f2)
+ return 0;
+ else
+ return 1;
+}
+
+/*
+ * Comparison function for sorting RangeBounds.
+ */
+static int
+range_bound_qsort_cmp(const void *a1, const void *a2, void *arg)
+{
+ RangeBound *b1 = (RangeBound *) a1;
+ RangeBound *b2 = (RangeBound *) a2;
+ TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
+
+ return range_cmp_bounds(typcache, b1, b2);
+}
+
+/*
+ * compute_range_stats() -- compute statistics for a range column
+ */
+static void
+compute_range_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
+ int samplerows, double totalrows)
+{
+ TypeCacheEntry *typcache = (TypeCacheEntry *) stats->extra_data;
+ TypeCacheEntry *mltrng_typcache = NULL;
+ bool has_subdiff;
+ int null_cnt = 0;
+ int non_null_cnt = 0;
+ int non_empty_cnt = 0;
+ int empty_cnt = 0;
+ int range_no;
+ int slot_idx;
+ int num_bins = stats->attr->attstattarget;
+ int num_hist;
+ float8 *lengths;
+ RangeBound *lowers,
+ *uppers;
+ double total_width = 0;
+
+ if (typcache->typtype == TYPTYPE_MULTIRANGE)
+ {
+ mltrng_typcache = typcache;
+ typcache = typcache->rngtype;
+ }
+ else
+ Assert(typcache->typtype == TYPTYPE_RANGE);
+ has_subdiff = OidIsValid(typcache->rng_subdiff_finfo.fn_oid);
+
+ /* Allocate memory to hold range bounds and lengths of the sample ranges. */
+ lowers = (RangeBound *) palloc(sizeof(RangeBound) * samplerows);
+ uppers = (RangeBound *) palloc(sizeof(RangeBound) * samplerows);
+ lengths = (float8 *) palloc(sizeof(float8) * samplerows);
+
+ /* Loop over the sample ranges. */
+ for (range_no = 0; range_no < samplerows; range_no++)
+ {
+ Datum value;
+ bool isnull,
+ empty;
+ MultirangeType *multirange;
+ RangeType *range;
+ RangeBound lower,
+ upper;
+ float8 length;
+
+ vacuum_delay_point();
+
+ value = fetchfunc(stats, range_no, &isnull);
+ if (isnull)
+ {
+ /* range is null, just count that */
+ null_cnt++;
+ continue;
+ }
+
+ /*
+ * XXX: should we ignore wide values, like std_typanalyze does, to
+ * avoid bloating the statistics table?
+ */
+ total_width += VARSIZE_ANY(DatumGetPointer(value));
+
+ /* Get range and deserialize it for further analysis. */
+ if (mltrng_typcache != NULL)
+ {
+ /* Treat multiranges like a big range without gaps. */
+ multirange = DatumGetMultirangeTypeP(value);
+ if (!MultirangeIsEmpty(multirange))
+ {
+ RangeBound tmp;
+
+ multirange_get_bounds(typcache, multirange, 0,
+ &lower, &tmp);
+ multirange_get_bounds(typcache, multirange,
+ multirange->rangeCount - 1,
+ &tmp, &upper);
+ empty = false;
+ }
+ else
+ {
+ empty = true;
+ }
+ }
+ else
+ {
+ range = DatumGetRangeTypeP(value);
+ range_deserialize(typcache, range, &lower, &upper, &empty);
+ }
+
+ if (!empty)
+ {
+ /* Remember bounds and length for further usage in histograms */
+ lowers[non_empty_cnt] = lower;
+ uppers[non_empty_cnt] = upper;
+
+ if (lower.infinite || upper.infinite)
+ {
+ /* Length of any kind of an infinite range is infinite */
+ length = get_float8_infinity();
+ }
+ else if (has_subdiff)
+ {
+ /*
+ * For an ordinary range, use subdiff function between upper
+ * and lower bound values.
+ */
+ length = DatumGetFloat8(FunctionCall2Coll(&typcache->rng_subdiff_finfo,
+ typcache->rng_collation,
+ upper.val, lower.val));
+ }
+ else
+ {
+ /* Use default value of 1.0 if no subdiff is available. */
+ length = 1.0;
+ }
+ lengths[non_empty_cnt] = length;
+
+ non_empty_cnt++;
+ }
+ else
+ empty_cnt++;
+
+ non_null_cnt++;
+ }
+
+ slot_idx = 0;
+
+ /* We can only compute real stats if we found some non-null values. */
+ if (non_null_cnt > 0)
+ {
+ Datum *bound_hist_values;
+ Datum *length_hist_values;
+ int pos,
+ posfrac,
+ delta,
+ deltafrac,
+ i;
+ MemoryContext old_cxt;
+ float4 *emptyfrac;
+
+ stats->stats_valid = true;
+ /* Do the simple null-frac and width stats */
+ stats->stanullfrac = (double) null_cnt / (double) samplerows;
+ stats->stawidth = total_width / (double) non_null_cnt;
+
+ /* Estimate that non-null values are unique */
+ stats->stadistinct = -1.0 * (1.0 - stats->stanullfrac);
+
+ /* Must copy the target values into anl_context */
+ old_cxt = MemoryContextSwitchTo(stats->anl_context);
+
+ /*
+ * Generate a bounds histogram slot entry if there are at least two
+ * values.
+ */
+ if (non_empty_cnt >= 2)
+ {
+ /* Sort bound values */
+ qsort_interruptible(lowers, non_empty_cnt, sizeof(RangeBound),
+ range_bound_qsort_cmp, typcache);
+ qsort_interruptible(uppers, non_empty_cnt, sizeof(RangeBound),
+ range_bound_qsort_cmp, typcache);
+
+ num_hist = non_empty_cnt;
+ if (num_hist > num_bins)
+ num_hist = num_bins + 1;
+
+ bound_hist_values = (Datum *) palloc(num_hist * sizeof(Datum));
+
+ /*
+ * The object of this loop is to construct ranges from first and
+ * last entries in lowers[] and uppers[] along with evenly-spaced
+ * values in between. So the i'th value is a range of lowers[(i *
+ * (nvals - 1)) / (num_hist - 1)] and uppers[(i * (nvals - 1)) /
+ * (num_hist - 1)]. But computing that subscript directly risks
+ * integer overflow when the stats target is more than a couple
+ * thousand. Instead we add (nvals - 1) / (num_hist - 1) to pos
+ * at each step, tracking the integral and fractional parts of the
+ * sum separately.
+ */
+ delta = (non_empty_cnt - 1) / (num_hist - 1);
+ deltafrac = (non_empty_cnt - 1) % (num_hist - 1);
+ pos = posfrac = 0;
+
+ for (i = 0; i < num_hist; i++)
+ {
+ bound_hist_values[i] = PointerGetDatum(range_serialize(typcache,
+ &lowers[pos],
+ &uppers[pos],
+ false));
+ pos += delta;
+ posfrac += deltafrac;
+ if (posfrac >= (num_hist - 1))
+ {
+ /* fractional part exceeds 1, carry to integer part */
+ pos++;
+ posfrac -= (num_hist - 1);
+ }
+ }
+
+ stats->stakind[slot_idx] = STATISTIC_KIND_BOUNDS_HISTOGRAM;
+ stats->stavalues[slot_idx] = bound_hist_values;
+ stats->numvalues[slot_idx] = num_hist;
+
+ /* Store ranges even if we're analyzing a multirange column */
+ stats->statypid[slot_idx] = typcache->type_id;
+ stats->statyplen[slot_idx] = typcache->typlen;
+ stats->statypbyval[slot_idx] = typcache->typbyval;
+ stats->statypalign[slot_idx] = typcache->typalign;
+
+ slot_idx++;
+ }
+
+ /*
+ * Generate a length histogram slot entry if there are at least two
+ * values.
+ */
+ if (non_empty_cnt >= 2)
+ {
+ /*
+ * Ascending sort of range lengths for further filling of
+ * histogram
+ */
+ qsort_interruptible(lengths, non_empty_cnt, sizeof(float8),
+ float8_qsort_cmp, NULL);
+
+ num_hist = non_empty_cnt;
+ if (num_hist > num_bins)
+ num_hist = num_bins + 1;
+
+ length_hist_values = (Datum *) palloc(num_hist * sizeof(Datum));
+
+ /*
+ * The object of this loop is to copy the first and last lengths[]
+ * entries along with evenly-spaced values in between. So the i'th
+ * value is lengths[(i * (nvals - 1)) / (num_hist - 1)]. But
+ * computing that subscript directly risks integer overflow when
+ * the stats target is more than a couple thousand. Instead we
+ * add (nvals - 1) / (num_hist - 1) to pos at each step, tracking
+ * the integral and fractional parts of the sum separately.
+ */
+ delta = (non_empty_cnt - 1) / (num_hist - 1);
+ deltafrac = (non_empty_cnt - 1) % (num_hist - 1);
+ pos = posfrac = 0;
+
+ for (i = 0; i < num_hist; i++)
+ {
+ length_hist_values[i] = Float8GetDatum(lengths[pos]);
+ pos += delta;
+ posfrac += deltafrac;
+ if (posfrac >= (num_hist - 1))
+ {
+ /* fractional part exceeds 1, carry to integer part */
+ pos++;
+ posfrac -= (num_hist - 1);
+ }
+ }
+ }
+ else
+ {
+ /*
+ * Even when we don't create the histogram, store an empty array
+ * to mean "no histogram". We can't just leave stavalues NULL,
+ * because get_attstatsslot() errors if you ask for stavalues, and
+ * it's NULL. We'll still store the empty fraction in stanumbers.
+ */
+ length_hist_values = palloc(0);
+ num_hist = 0;
+ }
+ stats->staop[slot_idx] = Float8LessOperator;
+ stats->stacoll[slot_idx] = InvalidOid;
+ stats->stavalues[slot_idx] = length_hist_values;
+ stats->numvalues[slot_idx] = num_hist;
+ stats->statypid[slot_idx] = FLOAT8OID;
+ stats->statyplen[slot_idx] = sizeof(float8);
+ stats->statypbyval[slot_idx] = FLOAT8PASSBYVAL;
+ stats->statypalign[slot_idx] = 'd';
+
+ /* Store the fraction of empty ranges */
+ emptyfrac = (float4 *) palloc(sizeof(float4));
+ *emptyfrac = ((double) empty_cnt) / ((double) non_null_cnt);
+ stats->stanumbers[slot_idx] = emptyfrac;
+ stats->numnumbers[slot_idx] = 1;
+
+ stats->stakind[slot_idx] = STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM;
+ slot_idx++;
+
+ MemoryContextSwitchTo(old_cxt);
+ }
+ else if (null_cnt > 0)
+ {
+ /* We found only nulls; assume the column is entirely null */
+ stats->stats_valid = true;
+ stats->stanullfrac = 1.0;
+ stats->stawidth = 0; /* "unknown" */
+ stats->stadistinct = 0.0; /* "unknown" */
+ }
+
+ /*
+ * We don't need to bother cleaning up any of our temporary palloc's. The
+ * hashtable should also go away, as it used a child memory context.
+ */
+}
diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c
new file mode 100644
index 0000000..0e0c5d5
--- /dev/null
+++ b/src/backend/utils/adt/regexp.c
@@ -0,0 +1,1996 @@
+/*-------------------------------------------------------------------------
+ *
+ * regexp.c
+ * Postgres' interface to the regular expression package.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/regexp.c
+ *
+ * Alistair Crooks added the code for the regex caching
+ * agc - cached the regular expressions used - there's a good chance
+ * that we'll get a hit, so this saves a compile step for every
+ * attempted match. I haven't actually measured the speed improvement,
+ * but it `looks' a lot quicker visually when watching regression
+ * test output.
+ *
+ * agc - incorporated Keith Bostic's Berkeley regex code into
+ * the tree for all ports. To distinguish this regex code from any that
+ * is existent on a platform, I've prepended the string "pg_" to
+ * the functions regcomp, regerror, regexec and regfree.
+ * Fixed a bug that was originally a typo by me, where `i' was used
+ * instead of `oldest' when compiling regular expressions - benign
+ * results mostly, although occasionally it bit you...
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "regex/regex.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/varlena.h"
+
+#define PG_GETARG_TEXT_PP_IF_EXISTS(_n) \
+ (PG_NARGS() > (_n) ? PG_GETARG_TEXT_PP(_n) : NULL)
+
+
+/* all the options of interest for regex functions */
+typedef struct pg_re_flags
+{
+ int cflags; /* compile flags for Spencer's regex code */
+ bool glob; /* do it globally (for each occurrence) */
+} pg_re_flags;
+
+/* cross-call state for regexp_match and regexp_split functions */
+typedef struct regexp_matches_ctx
+{
+ text *orig_str; /* data string in original TEXT form */
+ int nmatches; /* number of places where pattern matched */
+ int npatterns; /* number of capturing subpatterns */
+ /* We store start char index and end+1 char index for each match */
+ /* so the number of entries in match_locs is nmatches * npatterns * 2 */
+ int *match_locs; /* 0-based character indexes */
+ int next_match; /* 0-based index of next match to process */
+ /* workspace for build_regexp_match_result() */
+ Datum *elems; /* has npatterns elements */
+ bool *nulls; /* has npatterns elements */
+ pg_wchar *wide_str; /* wide-char version of original string */
+ char *conv_buf; /* conversion buffer, if needed */
+ int conv_bufsiz; /* size thereof */
+} regexp_matches_ctx;
+
+/*
+ * We cache precompiled regular expressions using a "self organizing list"
+ * structure, in which recently-used items tend to be near the front.
+ * Whenever we use an entry, it's moved up to the front of the list.
+ * Over time, an item's average position corresponds to its frequency of use.
+ *
+ * When we first create an entry, it's inserted at the front of
+ * the array, dropping the entry at the end of the array if necessary to
+ * make room. (This might seem to be weighting the new entry too heavily,
+ * but if we insert new entries further back, we'll be unable to adjust to
+ * a sudden shift in the query mix where we are presented with MAX_CACHED_RES
+ * never-before-seen items used circularly. We ought to be able to handle
+ * that case, so we have to insert at the front.)
+ *
+ * Knuth mentions a variant strategy in which a used item is moved up just
+ * one place in the list. Although he says this uses fewer comparisons on
+ * average, it seems not to adapt very well to the situation where you have
+ * both some reusable patterns and a steady stream of non-reusable patterns.
+ * A reusable pattern that isn't used at least as often as non-reusable
+ * patterns are seen will "fail to keep up" and will drop off the end of the
+ * cache. With move-to-front, a reusable pattern is guaranteed to stay in
+ * the cache as long as it's used at least once in every MAX_CACHED_RES uses.
+ */
+
+/* this is the maximum number of cached regular expressions */
+#ifndef MAX_CACHED_RES
+#define MAX_CACHED_RES 32
+#endif
+
+/* this structure describes one cached regular expression */
+typedef struct cached_re_str
+{
+ char *cre_pat; /* original RE (not null terminated!) */
+ int cre_pat_len; /* length of original RE, in bytes */
+ int cre_flags; /* compile flags: extended,icase etc */
+ Oid cre_collation; /* collation to use */
+ regex_t cre_re; /* the compiled regular expression */
+} cached_re_str;
+
+static int num_res = 0; /* # of cached re's */
+static cached_re_str re_array[MAX_CACHED_RES]; /* cached re's */
+
+
+/* Local functions */
+static regexp_matches_ctx *setup_regexp_matches(text *orig_str, text *pattern,
+ pg_re_flags *flags,
+ int start_search,
+ Oid collation,
+ bool use_subpatterns,
+ bool ignore_degenerate,
+ bool fetching_unmatched);
+static ArrayType *build_regexp_match_result(regexp_matches_ctx *matchctx);
+static Datum build_regexp_split_result(regexp_matches_ctx *splitctx);
+
+
+/*
+ * RE_compile_and_cache - compile a RE, caching if possible
+ *
+ * Returns regex_t *
+ *
+ * text_re --- the pattern, expressed as a TEXT object
+ * cflags --- compile options for the pattern
+ * collation --- collation to use for LC_CTYPE-dependent behavior
+ *
+ * Pattern is given in the database encoding. We internally convert to
+ * an array of pg_wchar, which is what Spencer's regex package wants.
+ */
+regex_t *
+RE_compile_and_cache(text *text_re, int cflags, Oid collation)
+{
+ int text_re_len = VARSIZE_ANY_EXHDR(text_re);
+ char *text_re_val = VARDATA_ANY(text_re);
+ pg_wchar *pattern;
+ int pattern_len;
+ int i;
+ int regcomp_result;
+ cached_re_str re_temp;
+ char errMsg[100];
+
+ /*
+ * Look for a match among previously compiled REs. Since the data
+ * structure is self-organizing with most-used entries at the front, our
+ * search strategy can just be to scan from the front.
+ */
+ for (i = 0; i < num_res; i++)
+ {
+ if (re_array[i].cre_pat_len == text_re_len &&
+ re_array[i].cre_flags == cflags &&
+ re_array[i].cre_collation == collation &&
+ memcmp(re_array[i].cre_pat, text_re_val, text_re_len) == 0)
+ {
+ /*
+ * Found a match; move it to front if not there already.
+ */
+ if (i > 0)
+ {
+ re_temp = re_array[i];
+ memmove(&re_array[1], &re_array[0], i * sizeof(cached_re_str));
+ re_array[0] = re_temp;
+ }
+
+ return &re_array[0].cre_re;
+ }
+ }
+
+ /*
+ * Couldn't find it, so try to compile the new RE. To avoid leaking
+ * resources on failure, we build into the re_temp local.
+ */
+
+ /* Convert pattern string to wide characters */
+ pattern = (pg_wchar *) palloc((text_re_len + 1) * sizeof(pg_wchar));
+ pattern_len = pg_mb2wchar_with_len(text_re_val,
+ pattern,
+ text_re_len);
+
+ regcomp_result = pg_regcomp(&re_temp.cre_re,
+ pattern,
+ pattern_len,
+ cflags,
+ collation);
+
+ pfree(pattern);
+
+ if (regcomp_result != REG_OKAY)
+ {
+ /* re didn't compile (no need for pg_regfree, if so) */
+
+ /*
+ * Here and in other places in this file, do CHECK_FOR_INTERRUPTS
+ * before reporting a regex error. This is so that if the regex
+ * library aborts and returns REG_CANCEL, we don't print an error
+ * message that implies the regex was invalid.
+ */
+ CHECK_FOR_INTERRUPTS();
+
+ pg_regerror(regcomp_result, &re_temp.cre_re, errMsg, sizeof(errMsg));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+ errmsg("invalid regular expression: %s", errMsg)));
+ }
+
+ /*
+ * We use malloc/free for the cre_pat field because the storage has to
+ * persist across transactions, and because we want to get control back on
+ * out-of-memory. The Max() is because some malloc implementations return
+ * NULL for malloc(0).
+ */
+ re_temp.cre_pat = malloc(Max(text_re_len, 1));
+ if (re_temp.cre_pat == NULL)
+ {
+ pg_regfree(&re_temp.cre_re);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ }
+ memcpy(re_temp.cre_pat, text_re_val, text_re_len);
+ re_temp.cre_pat_len = text_re_len;
+ re_temp.cre_flags = cflags;
+ re_temp.cre_collation = collation;
+
+ /*
+ * Okay, we have a valid new item in re_temp; insert it into the storage
+ * array. Discard last entry if needed.
+ */
+ if (num_res >= MAX_CACHED_RES)
+ {
+ --num_res;
+ Assert(num_res < MAX_CACHED_RES);
+ pg_regfree(&re_array[num_res].cre_re);
+ free(re_array[num_res].cre_pat);
+ }
+
+ if (num_res > 0)
+ memmove(&re_array[1], &re_array[0], num_res * sizeof(cached_re_str));
+
+ re_array[0] = re_temp;
+ num_res++;
+
+ return &re_array[0].cre_re;
+}
+
+/*
+ * RE_wchar_execute - execute a RE on pg_wchar data
+ *
+ * Returns true on match, false on no match
+ *
+ * re --- the compiled pattern as returned by RE_compile_and_cache
+ * data --- the data to match against (need not be null-terminated)
+ * data_len --- the length of the data string
+ * start_search -- the offset in the data to start searching
+ * nmatch, pmatch --- optional return area for match details
+ *
+ * Data is given as array of pg_wchar which is what Spencer's regex package
+ * wants.
+ */
+static bool
+RE_wchar_execute(regex_t *re, pg_wchar *data, int data_len,
+ int start_search, int nmatch, regmatch_t *pmatch)
+{
+ int regexec_result;
+ char errMsg[100];
+
+ /* Perform RE match and return result */
+ regexec_result = pg_regexec(re,
+ data,
+ data_len,
+ start_search,
+ NULL, /* no details */
+ nmatch,
+ pmatch,
+ 0);
+
+ if (regexec_result != REG_OKAY && regexec_result != REG_NOMATCH)
+ {
+ /* re failed??? */
+ CHECK_FOR_INTERRUPTS();
+ pg_regerror(regexec_result, re, errMsg, sizeof(errMsg));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+ errmsg("regular expression failed: %s", errMsg)));
+ }
+
+ return (regexec_result == REG_OKAY);
+}
+
+/*
+ * RE_execute - execute a RE
+ *
+ * Returns true on match, false on no match
+ *
+ * re --- the compiled pattern as returned by RE_compile_and_cache
+ * dat --- the data to match against (need not be null-terminated)
+ * dat_len --- the length of the data string
+ * nmatch, pmatch --- optional return area for match details
+ *
+ * Data is given in the database encoding. We internally
+ * convert to array of pg_wchar which is what Spencer's regex package wants.
+ */
+static bool
+RE_execute(regex_t *re, char *dat, int dat_len,
+ int nmatch, regmatch_t *pmatch)
+{
+ pg_wchar *data;
+ int data_len;
+ bool match;
+
+ /* Convert data string to wide characters */
+ data = (pg_wchar *) palloc((dat_len + 1) * sizeof(pg_wchar));
+ data_len = pg_mb2wchar_with_len(dat, data, dat_len);
+
+ /* Perform RE match and return result */
+ match = RE_wchar_execute(re, data, data_len, 0, nmatch, pmatch);
+
+ pfree(data);
+ return match;
+}
+
+/*
+ * RE_compile_and_execute - compile and execute a RE
+ *
+ * Returns true on match, false on no match
+ *
+ * text_re --- the pattern, expressed as a TEXT object
+ * dat --- the data to match against (need not be null-terminated)
+ * dat_len --- the length of the data string
+ * cflags --- compile options for the pattern
+ * collation --- collation to use for LC_CTYPE-dependent behavior
+ * nmatch, pmatch --- optional return area for match details
+ *
+ * Both pattern and data are given in the database encoding. We internally
+ * convert to array of pg_wchar which is what Spencer's regex package wants.
+ */
+bool
+RE_compile_and_execute(text *text_re, char *dat, int dat_len,
+ int cflags, Oid collation,
+ int nmatch, regmatch_t *pmatch)
+{
+ regex_t *re;
+
+ /* Use REG_NOSUB if caller does not want sub-match details */
+ if (nmatch < 2)
+ cflags |= REG_NOSUB;
+
+ /* Compile RE */
+ re = RE_compile_and_cache(text_re, cflags, collation);
+
+ return RE_execute(re, dat, dat_len, nmatch, pmatch);
+}
+
+
+/*
+ * parse_re_flags - parse the options argument of regexp_match and friends
+ *
+ * flags --- output argument, filled with desired options
+ * opts --- TEXT object, or NULL for defaults
+ *
+ * This accepts all the options allowed by any of the callers; callers that
+ * don't want some have to reject them after the fact.
+ */
+static void
+parse_re_flags(pg_re_flags *flags, text *opts)
+{
+ /* regex flavor is always folded into the compile flags */
+ flags->cflags = REG_ADVANCED;
+ flags->glob = false;
+
+ if (opts)
+ {
+ char *opt_p = VARDATA_ANY(opts);
+ int opt_len = VARSIZE_ANY_EXHDR(opts);
+ int i;
+
+ for (i = 0; i < opt_len; i++)
+ {
+ switch (opt_p[i])
+ {
+ case 'g':
+ flags->glob = true;
+ break;
+ case 'b': /* BREs (but why???) */
+ flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED | REG_QUOTE);
+ break;
+ case 'c': /* case sensitive */
+ flags->cflags &= ~REG_ICASE;
+ break;
+ case 'e': /* plain EREs */
+ flags->cflags |= REG_EXTENDED;
+ flags->cflags &= ~(REG_ADVANCED | REG_QUOTE);
+ break;
+ case 'i': /* case insensitive */
+ flags->cflags |= REG_ICASE;
+ break;
+ case 'm': /* Perloid synonym for n */
+ case 'n': /* \n affects ^ $ . [^ */
+ flags->cflags |= REG_NEWLINE;
+ break;
+ case 'p': /* ~Perl, \n affects . [^ */
+ flags->cflags |= REG_NLSTOP;
+ flags->cflags &= ~REG_NLANCH;
+ break;
+ case 'q': /* literal string */
+ flags->cflags |= REG_QUOTE;
+ flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED);
+ break;
+ case 's': /* single line, \n ordinary */
+ flags->cflags &= ~REG_NEWLINE;
+ break;
+ case 't': /* tight syntax */
+ flags->cflags &= ~REG_EXPANDED;
+ break;
+ case 'w': /* weird, \n affects ^ $ only */
+ flags->cflags &= ~REG_NLSTOP;
+ flags->cflags |= REG_NLANCH;
+ break;
+ case 'x': /* expanded syntax */
+ flags->cflags |= REG_EXPANDED;
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid regular expression option: \"%.*s\"",
+ pg_mblen(opt_p + i), opt_p + i)));
+ break;
+ }
+ }
+ }
+}
+
+
+/*
+ * interface routines called by the function manager
+ */
+
+Datum
+nameregexeq(PG_FUNCTION_ARGS)
+{
+ Name n = PG_GETARG_NAME(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(RE_compile_and_execute(p,
+ NameStr(*n),
+ strlen(NameStr(*n)),
+ REG_ADVANCED,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+nameregexne(PG_FUNCTION_ARGS)
+{
+ Name n = PG_GETARG_NAME(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(!RE_compile_and_execute(p,
+ NameStr(*n),
+ strlen(NameStr(*n)),
+ REG_ADVANCED,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+textregexeq(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(RE_compile_and_execute(p,
+ VARDATA_ANY(s),
+ VARSIZE_ANY_EXHDR(s),
+ REG_ADVANCED,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+textregexne(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(!RE_compile_and_execute(p,
+ VARDATA_ANY(s),
+ VARSIZE_ANY_EXHDR(s),
+ REG_ADVANCED,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+
+/*
+ * routines that use the regexp stuff, but ignore the case.
+ * for this, we use the REG_ICASE flag to pg_regcomp
+ */
+
+
+Datum
+nameicregexeq(PG_FUNCTION_ARGS)
+{
+ Name n = PG_GETARG_NAME(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(RE_compile_and_execute(p,
+ NameStr(*n),
+ strlen(NameStr(*n)),
+ REG_ADVANCED | REG_ICASE,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+nameicregexne(PG_FUNCTION_ARGS)
+{
+ Name n = PG_GETARG_NAME(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(!RE_compile_and_execute(p,
+ NameStr(*n),
+ strlen(NameStr(*n)),
+ REG_ADVANCED | REG_ICASE,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+texticregexeq(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(RE_compile_and_execute(p,
+ VARDATA_ANY(s),
+ VARSIZE_ANY_EXHDR(s),
+ REG_ADVANCED | REG_ICASE,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+Datum
+texticregexne(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_BOOL(!RE_compile_and_execute(p,
+ VARDATA_ANY(s),
+ VARSIZE_ANY_EXHDR(s),
+ REG_ADVANCED | REG_ICASE,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+
+/*
+ * textregexsubstr()
+ * Return a substring matched by a regular expression.
+ */
+Datum
+textregexsubstr(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+ regex_t *re;
+ regmatch_t pmatch[2];
+ int so,
+ eo;
+
+ /* Compile RE */
+ re = RE_compile_and_cache(p, REG_ADVANCED, PG_GET_COLLATION());
+
+ /*
+ * We pass two regmatch_t structs to get info about the overall match and
+ * the match for the first parenthesized subexpression (if any). If there
+ * is a parenthesized subexpression, we return what it matched; else
+ * return what the whole regexp matched.
+ */
+ if (!RE_execute(re,
+ VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s),
+ 2, pmatch))
+ PG_RETURN_NULL(); /* definitely no match */
+
+ if (re->re_nsub > 0)
+ {
+ /* has parenthesized subexpressions, use the first one */
+ so = pmatch[1].rm_so;
+ eo = pmatch[1].rm_eo;
+ }
+ else
+ {
+ /* no parenthesized subexpression, use whole match */
+ so = pmatch[0].rm_so;
+ eo = pmatch[0].rm_eo;
+ }
+
+ /*
+ * It is possible to have a match to the whole pattern but no match for a
+ * subexpression; for example 'foo(bar)?' is considered to match 'foo' but
+ * there is no subexpression match. So this extra test for match failure
+ * is not redundant.
+ */
+ if (so < 0 || eo < 0)
+ PG_RETURN_NULL();
+
+ return DirectFunctionCall3(text_substr,
+ PointerGetDatum(s),
+ Int32GetDatum(so + 1),
+ Int32GetDatum(eo - so));
+}
+
+/*
+ * textregexreplace_noopt()
+ * Return a string matched by a regular expression, with replacement.
+ *
+ * This version doesn't have an option argument: we default to case
+ * sensitive match, replace the first instance only.
+ */
+Datum
+textregexreplace_noopt(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+ text *r = PG_GETARG_TEXT_PP(2);
+
+ PG_RETURN_TEXT_P(replace_text_regexp(s, p, r,
+ REG_ADVANCED, PG_GET_COLLATION(),
+ 0, 1));
+}
+
+/*
+ * textregexreplace()
+ * Return a string matched by a regular expression, with replacement.
+ */
+Datum
+textregexreplace(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+ text *r = PG_GETARG_TEXT_PP(2);
+ text *opt = PG_GETARG_TEXT_PP(3);
+ pg_re_flags flags;
+
+ /*
+ * regexp_replace() with four arguments will be preferentially resolved as
+ * this form when the fourth argument is of type UNKNOWN. However, the
+ * user might have intended to call textregexreplace_extended_no_n. If we
+ * see flags that look like an integer, emit the same error that
+ * parse_re_flags would, but add a HINT about how to fix it.
+ */
+ if (VARSIZE_ANY_EXHDR(opt) > 0)
+ {
+ char *opt_p = VARDATA_ANY(opt);
+
+ if (*opt_p >= '0' && *opt_p <= '9')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid regular expression option: \"%.*s\"",
+ pg_mblen(opt_p), opt_p),
+ errhint("If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly.")));
+ }
+
+ parse_re_flags(&flags, opt);
+
+ PG_RETURN_TEXT_P(replace_text_regexp(s, p, r,
+ flags.cflags, PG_GET_COLLATION(),
+ 0, flags.glob ? 0 : 1));
+}
+
+/*
+ * textregexreplace_extended()
+ * Return a string matched by a regular expression, with replacement.
+ * Extends textregexreplace by allowing a start position and the
+ * choice of the occurrence to replace (0 means all occurrences).
+ */
+Datum
+textregexreplace_extended(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ text *p = PG_GETARG_TEXT_PP(1);
+ text *r = PG_GETARG_TEXT_PP(2);
+ int start = 1;
+ int n = 1;
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(5);
+ pg_re_flags re_flags;
+
+ /* Collect optional parameters */
+ if (PG_NARGS() > 3)
+ {
+ start = PG_GETARG_INT32(3);
+ if (start <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "start", start)));
+ }
+ if (PG_NARGS() > 4)
+ {
+ n = PG_GETARG_INT32(4);
+ if (n < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "n", n)));
+ }
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+
+ /* If N was not specified, deduce it from the 'g' flag */
+ if (PG_NARGS() <= 4)
+ n = re_flags.glob ? 0 : 1;
+
+ /* Do the replacement(s) */
+ PG_RETURN_TEXT_P(replace_text_regexp(s, p, r,
+ re_flags.cflags, PG_GET_COLLATION(),
+ start - 1, n));
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+textregexreplace_extended_no_n(PG_FUNCTION_ARGS)
+{
+ return textregexreplace_extended(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+textregexreplace_extended_no_flags(PG_FUNCTION_ARGS)
+{
+ return textregexreplace_extended(fcinfo);
+}
+
+/*
+ * similar_to_escape(), similar_escape()
+ *
+ * Convert a SQL "SIMILAR TO" regexp pattern to POSIX style, so it can be
+ * used by our regexp engine.
+ *
+ * similar_escape_internal() is the common workhorse for three SQL-exposed
+ * functions. esc_text can be passed as NULL to select the default escape
+ * (which is '\'), or as an empty string to select no escape character.
+ */
+static text *
+similar_escape_internal(text *pat_text, text *esc_text)
+{
+ text *result;
+ char *p,
+ *e,
+ *r;
+ int plen,
+ elen;
+ bool afterescape = false;
+ bool incharclass = false;
+ int nquotes = 0;
+
+ p = VARDATA_ANY(pat_text);
+ plen = VARSIZE_ANY_EXHDR(pat_text);
+ if (esc_text == NULL)
+ {
+ /* No ESCAPE clause provided; default to backslash as escape */
+ e = "\\";
+ elen = 1;
+ }
+ else
+ {
+ e = VARDATA_ANY(esc_text);
+ elen = VARSIZE_ANY_EXHDR(esc_text);
+ if (elen == 0)
+ e = NULL; /* no escape character */
+ else if (elen > 1)
+ {
+ int escape_mblen = pg_mbstrlen_with_len(e, elen);
+
+ if (escape_mblen > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
+ errmsg("invalid escape string"),
+ errhint("Escape string must be empty or one character.")));
+ }
+ }
+
+ /*----------
+ * We surround the transformed input string with
+ * ^(?: ... )$
+ * which requires some explanation. We need "^" and "$" to force
+ * the pattern to match the entire input string as per the SQL spec.
+ * The "(?:" and ")" are a non-capturing set of parens; we have to have
+ * parens in case the string contains "|", else the "^" and "$" will
+ * be bound into the first and last alternatives which is not what we
+ * want, and the parens must be non capturing because we don't want them
+ * to count when selecting output for SUBSTRING.
+ *
+ * When the pattern is divided into three parts by escape-double-quotes,
+ * what we emit is
+ * ^(?:part1){1,1}?(part2){1,1}(?:part3)$
+ * which requires even more explanation. The "{1,1}?" on part1 makes it
+ * non-greedy so that it will match the smallest possible amount of text
+ * not the largest, as required by SQL. The plain parens around part2
+ * are capturing parens so that that part is what controls the result of
+ * SUBSTRING. The "{1,1}" forces part2 to be greedy, so that it matches
+ * the largest possible amount of text; hence part3 must match the
+ * smallest amount of text, as required by SQL. We don't need an explicit
+ * greediness marker on part3. Note that this also confines the effects
+ * of any "|" characters to the respective part, which is what we want.
+ *
+ * The SQL spec says that SUBSTRING's pattern must contain exactly two
+ * escape-double-quotes, but we only complain if there's more than two.
+ * With none, we act as though part1 and part3 are empty; with one, we
+ * act as though part3 is empty. Both behaviors fall out of omitting
+ * the relevant part separators in the above expansion. If the result
+ * of this function is used in a plain regexp match (SIMILAR TO), the
+ * escape-double-quotes have no effect on the match behavior.
+ *----------
+ */
+
+ /*
+ * We need room for the prefix/postfix and part separators, plus as many
+ * as 3 output bytes per input byte; since the input is at most 1GB this
+ * can't overflow size_t.
+ */
+ result = (text *) palloc(VARHDRSZ + 23 + 3 * (size_t) plen);
+ r = VARDATA(result);
+
+ *r++ = '^';
+ *r++ = '(';
+ *r++ = '?';
+ *r++ = ':';
+
+ while (plen > 0)
+ {
+ char pchar = *p;
+
+ /*
+ * If both the escape character and the current character from the
+ * pattern are multi-byte, we need to take the slow path.
+ *
+ * But if one of them is single-byte, we can process the pattern one
+ * byte at a time, ignoring multi-byte characters. (This works
+ * because all server-encodings have the property that a valid
+ * multi-byte character representation cannot contain the
+ * representation of a valid single-byte character.)
+ */
+
+ if (elen > 1)
+ {
+ int mblen = pg_mblen(p);
+
+ if (mblen > 1)
+ {
+ /* slow, multi-byte path */
+ if (afterescape)
+ {
+ *r++ = '\\';
+ memcpy(r, p, mblen);
+ r += mblen;
+ afterescape = false;
+ }
+ else if (e && elen == mblen && memcmp(e, p, mblen) == 0)
+ {
+ /* SQL escape character; do not send to output */
+ afterescape = true;
+ }
+ else
+ {
+ /*
+ * We know it's a multi-byte character, so we don't need
+ * to do all the comparisons to single-byte characters
+ * that we do below.
+ */
+ memcpy(r, p, mblen);
+ r += mblen;
+ }
+
+ p += mblen;
+ plen -= mblen;
+
+ continue;
+ }
+ }
+
+ /* fast path */
+ if (afterescape)
+ {
+ if (pchar == '"' && !incharclass) /* escape-double-quote? */
+ {
+ /* emit appropriate part separator, per notes above */
+ if (nquotes == 0)
+ {
+ *r++ = ')';
+ *r++ = '{';
+ *r++ = '1';
+ *r++ = ',';
+ *r++ = '1';
+ *r++ = '}';
+ *r++ = '?';
+ *r++ = '(';
+ }
+ else if (nquotes == 1)
+ {
+ *r++ = ')';
+ *r++ = '{';
+ *r++ = '1';
+ *r++ = ',';
+ *r++ = '1';
+ *r++ = '}';
+ *r++ = '(';
+ *r++ = '?';
+ *r++ = ':';
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER),
+ errmsg("SQL regular expression may not contain more than two escape-double-quote separators")));
+ nquotes++;
+ }
+ else
+ {
+ /*
+ * We allow any character at all to be escaped; notably, this
+ * allows access to POSIX character-class escapes such as
+ * "\d". The SQL spec is considerably more restrictive.
+ */
+ *r++ = '\\';
+ *r++ = pchar;
+ }
+ afterescape = false;
+ }
+ else if (e && pchar == *e)
+ {
+ /* SQL escape character; do not send to output */
+ afterescape = true;
+ }
+ else if (incharclass)
+ {
+ if (pchar == '\\')
+ *r++ = '\\';
+ *r++ = pchar;
+ if (pchar == ']')
+ incharclass = false;
+ }
+ else if (pchar == '[')
+ {
+ *r++ = pchar;
+ incharclass = true;
+ }
+ else if (pchar == '%')
+ {
+ *r++ = '.';
+ *r++ = '*';
+ }
+ else if (pchar == '_')
+ *r++ = '.';
+ else if (pchar == '(')
+ {
+ /* convert to non-capturing parenthesis */
+ *r++ = '(';
+ *r++ = '?';
+ *r++ = ':';
+ }
+ else if (pchar == '\\' || pchar == '.' ||
+ pchar == '^' || pchar == '$')
+ {
+ *r++ = '\\';
+ *r++ = pchar;
+ }
+ else
+ *r++ = pchar;
+ p++, plen--;
+ }
+
+ *r++ = ')';
+ *r++ = '$';
+
+ SET_VARSIZE(result, r - ((char *) result));
+
+ return result;
+}
+
+/*
+ * similar_to_escape(pattern, escape)
+ */
+Datum
+similar_to_escape_2(PG_FUNCTION_ARGS)
+{
+ text *pat_text = PG_GETARG_TEXT_PP(0);
+ text *esc_text = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ result = similar_escape_internal(pat_text, esc_text);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * similar_to_escape(pattern)
+ * Inserts a default escape character.
+ */
+Datum
+similar_to_escape_1(PG_FUNCTION_ARGS)
+{
+ text *pat_text = PG_GETARG_TEXT_PP(0);
+ text *result;
+
+ result = similar_escape_internal(pat_text, NULL);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * similar_escape(pattern, escape)
+ *
+ * Legacy function for compatibility with views stored using the
+ * pre-v13 expansion of SIMILAR TO. Unlike the above functions, this
+ * is non-strict, which leads to not-per-spec handling of "ESCAPE NULL".
+ */
+Datum
+similar_escape(PG_FUNCTION_ARGS)
+{
+ text *pat_text;
+ text *esc_text;
+ text *result;
+
+ /* This function is not strict, so must test explicitly */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ pat_text = PG_GETARG_TEXT_PP(0);
+
+ if (PG_ARGISNULL(1))
+ esc_text = NULL; /* use default escape character */
+ else
+ esc_text = PG_GETARG_TEXT_PP(1);
+
+ result = similar_escape_internal(pat_text, esc_text);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * regexp_count()
+ * Return the number of matches of a pattern within a string.
+ */
+Datum
+regexp_count(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ int start = 1;
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(3);
+ pg_re_flags re_flags;
+ regexp_matches_ctx *matchctx;
+
+ /* Collect optional parameters */
+ if (PG_NARGS() > 2)
+ {
+ start = PG_GETARG_INT32(2);
+ if (start <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "start", start)));
+ }
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_count()")));
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
+ /* Do the matching */
+ matchctx = setup_regexp_matches(str, pattern, &re_flags, start - 1,
+ PG_GET_COLLATION(),
+ false, /* can ignore subexprs */
+ false, false);
+
+ PG_RETURN_INT32(matchctx->nmatches);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_count_no_start(PG_FUNCTION_ARGS)
+{
+ return regexp_count(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_count_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_count(fcinfo);
+}
+
+/*
+ * regexp_instr()
+ * Return the match's position within the string
+ */
+Datum
+regexp_instr(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ int start = 1;
+ int n = 1;
+ int endoption = 0;
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(5);
+ int subexpr = 0;
+ int pos;
+ pg_re_flags re_flags;
+ regexp_matches_ctx *matchctx;
+
+ /* Collect optional parameters */
+ if (PG_NARGS() > 2)
+ {
+ start = PG_GETARG_INT32(2);
+ if (start <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "start", start)));
+ }
+ if (PG_NARGS() > 3)
+ {
+ n = PG_GETARG_INT32(3);
+ if (n <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "n", n)));
+ }
+ if (PG_NARGS() > 4)
+ {
+ endoption = PG_GETARG_INT32(4);
+ if (endoption != 0 && endoption != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "endoption", endoption)));
+ }
+ if (PG_NARGS() > 6)
+ {
+ subexpr = PG_GETARG_INT32(6);
+ if (subexpr < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "subexpr", subexpr)));
+ }
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_instr()")));
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
+ /* Do the matching */
+ matchctx = setup_regexp_matches(str, pattern, &re_flags, start - 1,
+ PG_GET_COLLATION(),
+ (subexpr > 0), /* need submatches? */
+ false, false);
+
+ /* When n exceeds matches return 0 (includes case of no matches) */
+ if (n > matchctx->nmatches)
+ PG_RETURN_INT32(0);
+
+ /* When subexpr exceeds number of subexpressions return 0 */
+ if (subexpr > matchctx->npatterns)
+ PG_RETURN_INT32(0);
+
+ /* Select the appropriate match position to return */
+ pos = (n - 1) * matchctx->npatterns;
+ if (subexpr > 0)
+ pos += subexpr - 1;
+ pos *= 2;
+ if (endoption == 1)
+ pos += 1;
+
+ if (matchctx->match_locs[pos] >= 0)
+ PG_RETURN_INT32(matchctx->match_locs[pos] + 1);
+ else
+ PG_RETURN_INT32(0); /* position not identifiable */
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_instr_no_start(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_instr_no_n(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_instr_no_endoption(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_instr_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_instr_no_subexpr(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+/*
+ * regexp_like()
+ * Test for a pattern match within a string.
+ */
+Datum
+regexp_like(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_like()")));
+
+ /* Otherwise it's like textregexeq/texticregexeq */
+ PG_RETURN_BOOL(RE_compile_and_execute(pattern,
+ VARDATA_ANY(str),
+ VARSIZE_ANY_EXHDR(str),
+ re_flags.cflags,
+ PG_GET_COLLATION(),
+ 0, NULL));
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_like_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_like(fcinfo);
+}
+
+/*
+ * regexp_match()
+ * Return the first substring(s) matching a pattern within a string.
+ */
+Datum
+regexp_match(PG_FUNCTION_ARGS)
+{
+ text *orig_str = PG_GETARG_TEXT_PP(0);
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+ regexp_matches_ctx *matchctx;
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_match()"),
+ errhint("Use the regexp_matches function instead.")));
+
+ matchctx = setup_regexp_matches(orig_str, pattern, &re_flags, 0,
+ PG_GET_COLLATION(), true, false, false);
+
+ if (matchctx->nmatches == 0)
+ PG_RETURN_NULL();
+
+ Assert(matchctx->nmatches == 1);
+
+ /* Create workspace that build_regexp_match_result needs */
+ matchctx->elems = (Datum *) palloc(sizeof(Datum) * matchctx->npatterns);
+ matchctx->nulls = (bool *) palloc(sizeof(bool) * matchctx->npatterns);
+
+ PG_RETURN_DATUM(PointerGetDatum(build_regexp_match_result(matchctx)));
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_match_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_match(fcinfo);
+}
+
+/*
+ * regexp_matches()
+ * Return a table of all matches of a pattern within a string.
+ */
+Datum
+regexp_matches(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ regexp_matches_ctx *matchctx;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+ MemoryContext oldcontext;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+
+ /* be sure to copy the input string into the multi-call ctx */
+ matchctx = setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern,
+ &re_flags, 0,
+ PG_GET_COLLATION(),
+ true, false, false);
+
+ /* Pre-create workspace that build_regexp_match_result needs */
+ matchctx->elems = (Datum *) palloc(sizeof(Datum) * matchctx->npatterns);
+ matchctx->nulls = (bool *) palloc(sizeof(bool) * matchctx->npatterns);
+
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = (void *) matchctx;
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ matchctx = (regexp_matches_ctx *) funcctx->user_fctx;
+
+ if (matchctx->next_match < matchctx->nmatches)
+ {
+ ArrayType *result_ary;
+
+ result_ary = build_regexp_match_result(matchctx);
+ matchctx->next_match++;
+ SRF_RETURN_NEXT(funcctx, PointerGetDatum(result_ary));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_matches_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_matches(fcinfo);
+}
+
+/*
+ * setup_regexp_matches --- do the initial matching for regexp_match,
+ * regexp_split, and related functions
+ *
+ * To avoid having to re-find the compiled pattern on each call, we do
+ * all the matching in one swoop. The returned regexp_matches_ctx contains
+ * the locations of all the substrings matching the pattern.
+ *
+ * start_search: the character (not byte) offset in orig_str at which to
+ * begin the search. Returned positions are relative to orig_str anyway.
+ * use_subpatterns: collect data about matches to parenthesized subexpressions.
+ * ignore_degenerate: ignore zero-length matches.
+ * fetching_unmatched: caller wants to fetch unmatched substrings.
+ *
+ * We don't currently assume that fetching_unmatched is exclusive of fetching
+ * the matched text too; if it's set, the conversion buffer is large enough to
+ * fetch any single matched or unmatched string, but not any larger
+ * substring. (In practice, when splitting the matches are usually small
+ * anyway, and it didn't seem worth complicating the code further.)
+ */
+static regexp_matches_ctx *
+setup_regexp_matches(text *orig_str, text *pattern, pg_re_flags *re_flags,
+ int start_search,
+ Oid collation,
+ bool use_subpatterns,
+ bool ignore_degenerate,
+ bool fetching_unmatched)
+{
+ regexp_matches_ctx *matchctx = palloc0(sizeof(regexp_matches_ctx));
+ int eml = pg_database_encoding_max_length();
+ int orig_len;
+ pg_wchar *wide_str;
+ int wide_len;
+ int cflags;
+ regex_t *cpattern;
+ regmatch_t *pmatch;
+ int pmatch_len;
+ int array_len;
+ int array_idx;
+ int prev_match_end;
+ int prev_valid_match_end;
+ int maxlen = 0; /* largest fetch length in characters */
+
+ /* save original string --- we'll extract result substrings from it */
+ matchctx->orig_str = orig_str;
+
+ /* convert string to pg_wchar form for matching */
+ orig_len = VARSIZE_ANY_EXHDR(orig_str);
+ wide_str = (pg_wchar *) palloc(sizeof(pg_wchar) * (orig_len + 1));
+ wide_len = pg_mb2wchar_with_len(VARDATA_ANY(orig_str), wide_str, orig_len);
+
+ /* set up the compiled pattern */
+ cflags = re_flags->cflags;
+ if (!use_subpatterns)
+ cflags |= REG_NOSUB;
+ cpattern = RE_compile_and_cache(pattern, cflags, collation);
+
+ /* do we want to remember subpatterns? */
+ if (use_subpatterns && cpattern->re_nsub > 0)
+ {
+ matchctx->npatterns = cpattern->re_nsub;
+ pmatch_len = cpattern->re_nsub + 1;
+ }
+ else
+ {
+ use_subpatterns = false;
+ matchctx->npatterns = 1;
+ pmatch_len = 1;
+ }
+
+ /* temporary output space for RE package */
+ pmatch = palloc(sizeof(regmatch_t) * pmatch_len);
+
+ /*
+ * the real output space (grown dynamically if needed)
+ *
+ * use values 2^n-1, not 2^n, so that we hit the limit at 2^28-1 rather
+ * than at 2^27
+ */
+ array_len = re_flags->glob ? 255 : 31;
+ matchctx->match_locs = (int *) palloc(sizeof(int) * array_len);
+ array_idx = 0;
+
+ /* search for the pattern, perhaps repeatedly */
+ prev_match_end = 0;
+ prev_valid_match_end = 0;
+ while (RE_wchar_execute(cpattern, wide_str, wide_len, start_search,
+ pmatch_len, pmatch))
+ {
+ /*
+ * If requested, ignore degenerate matches, which are zero-length
+ * matches occurring at the start or end of a string or just after a
+ * previous match.
+ */
+ if (!ignore_degenerate ||
+ (pmatch[0].rm_so < wide_len &&
+ pmatch[0].rm_eo > prev_match_end))
+ {
+ /* enlarge output space if needed */
+ while (array_idx + matchctx->npatterns * 2 + 1 > array_len)
+ {
+ array_len += array_len + 1; /* 2^n-1 => 2^(n+1)-1 */
+ if (array_len > MaxAllocSize / sizeof(int))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many regular expression matches")));
+ matchctx->match_locs = (int *) repalloc(matchctx->match_locs,
+ sizeof(int) * array_len);
+ }
+
+ /* save this match's locations */
+ if (use_subpatterns)
+ {
+ int i;
+
+ for (i = 1; i <= matchctx->npatterns; i++)
+ {
+ int so = pmatch[i].rm_so;
+ int eo = pmatch[i].rm_eo;
+
+ matchctx->match_locs[array_idx++] = so;
+ matchctx->match_locs[array_idx++] = eo;
+ if (so >= 0 && eo >= 0 && (eo - so) > maxlen)
+ maxlen = (eo - so);
+ }
+ }
+ else
+ {
+ int so = pmatch[0].rm_so;
+ int eo = pmatch[0].rm_eo;
+
+ matchctx->match_locs[array_idx++] = so;
+ matchctx->match_locs[array_idx++] = eo;
+ if (so >= 0 && eo >= 0 && (eo - so) > maxlen)
+ maxlen = (eo - so);
+ }
+ matchctx->nmatches++;
+
+ /*
+ * check length of unmatched portion between end of previous valid
+ * (nondegenerate, or degenerate but not ignored) match and start
+ * of current one
+ */
+ if (fetching_unmatched &&
+ pmatch[0].rm_so >= 0 &&
+ (pmatch[0].rm_so - prev_valid_match_end) > maxlen)
+ maxlen = (pmatch[0].rm_so - prev_valid_match_end);
+ prev_valid_match_end = pmatch[0].rm_eo;
+ }
+ prev_match_end = pmatch[0].rm_eo;
+
+ /* if not glob, stop after one match */
+ if (!re_flags->glob)
+ break;
+
+ /*
+ * Advance search position. Normally we start the next search at the
+ * end of the previous match; but if the match was of zero length, we
+ * have to advance by one character, or we'd just find the same match
+ * again.
+ */
+ start_search = prev_match_end;
+ if (pmatch[0].rm_so == pmatch[0].rm_eo)
+ start_search++;
+ if (start_search > wide_len)
+ break;
+ }
+
+ /*
+ * check length of unmatched portion between end of last match and end of
+ * input string
+ */
+ if (fetching_unmatched &&
+ (wide_len - prev_valid_match_end) > maxlen)
+ maxlen = (wide_len - prev_valid_match_end);
+
+ /*
+ * Keep a note of the end position of the string for the benefit of
+ * splitting code.
+ */
+ matchctx->match_locs[array_idx] = wide_len;
+
+ if (eml > 1)
+ {
+ int64 maxsiz = eml * (int64) maxlen;
+ int conv_bufsiz;
+
+ /*
+ * Make the conversion buffer large enough for any substring of
+ * interest.
+ *
+ * Worst case: assume we need the maximum size (maxlen*eml), but take
+ * advantage of the fact that the original string length in bytes is
+ * an upper bound on the byte length of any fetched substring (and we
+ * know that len+1 is safe to allocate because the varlena header is
+ * longer than 1 byte).
+ */
+ if (maxsiz > orig_len)
+ conv_bufsiz = orig_len + 1;
+ else
+ conv_bufsiz = maxsiz + 1; /* safe since maxsiz < 2^30 */
+
+ matchctx->conv_buf = palloc(conv_bufsiz);
+ matchctx->conv_bufsiz = conv_bufsiz;
+ matchctx->wide_str = wide_str;
+ }
+ else
+ {
+ /* No need to keep the wide string if we're in a single-byte charset. */
+ pfree(wide_str);
+ matchctx->wide_str = NULL;
+ matchctx->conv_buf = NULL;
+ matchctx->conv_bufsiz = 0;
+ }
+
+ /* Clean up temp storage */
+ pfree(pmatch);
+
+ return matchctx;
+}
+
+/*
+ * build_regexp_match_result - build output array for current match
+ */
+static ArrayType *
+build_regexp_match_result(regexp_matches_ctx *matchctx)
+{
+ char *buf = matchctx->conv_buf;
+ Datum *elems = matchctx->elems;
+ bool *nulls = matchctx->nulls;
+ int dims[1];
+ int lbs[1];
+ int loc;
+ int i;
+
+ /* Extract matching substrings from the original string */
+ loc = matchctx->next_match * matchctx->npatterns * 2;
+ for (i = 0; i < matchctx->npatterns; i++)
+ {
+ int so = matchctx->match_locs[loc++];
+ int eo = matchctx->match_locs[loc++];
+
+ if (so < 0 || eo < 0)
+ {
+ elems[i] = (Datum) 0;
+ nulls[i] = true;
+ }
+ else if (buf)
+ {
+ int len = pg_wchar2mb_with_len(matchctx->wide_str + so,
+ buf,
+ eo - so);
+
+ Assert(len < matchctx->conv_bufsiz);
+ elems[i] = PointerGetDatum(cstring_to_text_with_len(buf, len));
+ nulls[i] = false;
+ }
+ else
+ {
+ elems[i] = DirectFunctionCall3(text_substr,
+ PointerGetDatum(matchctx->orig_str),
+ Int32GetDatum(so + 1),
+ Int32GetDatum(eo - so));
+ nulls[i] = false;
+ }
+ }
+
+ /* And form an array */
+ dims[0] = matchctx->npatterns;
+ lbs[0] = 1;
+ /* XXX: this hardcodes assumptions about the text type */
+ return construct_md_array(elems, nulls, 1, dims, lbs,
+ TEXTOID, -1, false, TYPALIGN_INT);
+}
+
+/*
+ * regexp_split_to_table()
+ * Split the string at matches of the pattern, returning the
+ * split-out substrings as a table.
+ */
+Datum
+regexp_split_to_table(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ regexp_matches_ctx *splitctx;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+ MemoryContext oldcontext;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_split_to_table()")));
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
+ /* be sure to copy the input string into the multi-call ctx */
+ splitctx = setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern,
+ &re_flags, 0,
+ PG_GET_COLLATION(),
+ false, true, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = (void *) splitctx;
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ splitctx = (regexp_matches_ctx *) funcctx->user_fctx;
+
+ if (splitctx->next_match <= splitctx->nmatches)
+ {
+ Datum result = build_regexp_split_result(splitctx);
+
+ splitctx->next_match++;
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_split_to_table_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_split_to_table(fcinfo);
+}
+
+/*
+ * regexp_split_to_array()
+ * Split the string at matches of the pattern, returning the
+ * split-out substrings as an array.
+ */
+Datum
+regexp_split_to_array(PG_FUNCTION_ARGS)
+{
+ ArrayBuildState *astate = NULL;
+ pg_re_flags re_flags;
+ regexp_matches_ctx *splitctx;
+
+ /* Determine options */
+ parse_re_flags(&re_flags, PG_GETARG_TEXT_PP_IF_EXISTS(2));
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_split_to_array()")));
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
+ splitctx = setup_regexp_matches(PG_GETARG_TEXT_PP(0),
+ PG_GETARG_TEXT_PP(1),
+ &re_flags, 0,
+ PG_GET_COLLATION(),
+ false, true, true);
+
+ while (splitctx->next_match <= splitctx->nmatches)
+ {
+ astate = accumArrayResult(astate,
+ build_regexp_split_result(splitctx),
+ false,
+ TEXTOID,
+ CurrentMemoryContext);
+ splitctx->next_match++;
+ }
+
+ PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext));
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_split_to_array_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_split_to_array(fcinfo);
+}
+
+/*
+ * build_regexp_split_result - build output string for current match
+ *
+ * We return the string between the current match and the previous one,
+ * or the string after the last match when next_match == nmatches.
+ */
+static Datum
+build_regexp_split_result(regexp_matches_ctx *splitctx)
+{
+ char *buf = splitctx->conv_buf;
+ int startpos;
+ int endpos;
+
+ if (splitctx->next_match > 0)
+ startpos = splitctx->match_locs[splitctx->next_match * 2 - 1];
+ else
+ startpos = 0;
+ if (startpos < 0)
+ elog(ERROR, "invalid match ending position");
+
+ endpos = splitctx->match_locs[splitctx->next_match * 2];
+ if (endpos < startpos)
+ elog(ERROR, "invalid match starting position");
+
+ if (buf)
+ {
+ int len;
+
+ len = pg_wchar2mb_with_len(splitctx->wide_str + startpos,
+ buf,
+ endpos - startpos);
+ Assert(len < splitctx->conv_bufsiz);
+ return PointerGetDatum(cstring_to_text_with_len(buf, len));
+ }
+ else
+ {
+ return DirectFunctionCall3(text_substr,
+ PointerGetDatum(splitctx->orig_str),
+ Int32GetDatum(startpos + 1),
+ Int32GetDatum(endpos - startpos));
+ }
+}
+
+/*
+ * regexp_substr()
+ * Return the substring that matches a regular expression pattern
+ */
+Datum
+regexp_substr(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *pattern = PG_GETARG_TEXT_PP(1);
+ int start = 1;
+ int n = 1;
+ text *flags = PG_GETARG_TEXT_PP_IF_EXISTS(4);
+ int subexpr = 0;
+ int so,
+ eo,
+ pos;
+ pg_re_flags re_flags;
+ regexp_matches_ctx *matchctx;
+
+ /* Collect optional parameters */
+ if (PG_NARGS() > 2)
+ {
+ start = PG_GETARG_INT32(2);
+ if (start <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "start", start)));
+ }
+ if (PG_NARGS() > 3)
+ {
+ n = PG_GETARG_INT32(3);
+ if (n <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "n", n)));
+ }
+ if (PG_NARGS() > 5)
+ {
+ subexpr = PG_GETARG_INT32(5);
+ if (subexpr < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": %d",
+ "subexpr", subexpr)));
+ }
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ /* translator: %s is a SQL function name */
+ errmsg("%s does not support the \"global\" option",
+ "regexp_substr()")));
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
+ /* Do the matching */
+ matchctx = setup_regexp_matches(str, pattern, &re_flags, start - 1,
+ PG_GET_COLLATION(),
+ (subexpr > 0), /* need submatches? */
+ false, false);
+
+ /* When n exceeds matches return NULL (includes case of no matches) */
+ if (n > matchctx->nmatches)
+ PG_RETURN_NULL();
+
+ /* When subexpr exceeds number of subexpressions return NULL */
+ if (subexpr > matchctx->npatterns)
+ PG_RETURN_NULL();
+
+ /* Select the appropriate match position to return */
+ pos = (n - 1) * matchctx->npatterns;
+ if (subexpr > 0)
+ pos += subexpr - 1;
+ pos *= 2;
+ so = matchctx->match_locs[pos];
+ eo = matchctx->match_locs[pos + 1];
+
+ if (so < 0 || eo < 0)
+ PG_RETURN_NULL(); /* unidentifiable location */
+
+ PG_RETURN_DATUM(DirectFunctionCall3(text_substr,
+ PointerGetDatum(matchctx->orig_str),
+ Int32GetDatum(so + 1),
+ Int32GetDatum(eo - so)));
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_substr_no_start(PG_FUNCTION_ARGS)
+{
+ return regexp_substr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_substr_no_n(PG_FUNCTION_ARGS)
+{
+ return regexp_substr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_substr_no_flags(PG_FUNCTION_ARGS)
+{
+ return regexp_substr(fcinfo);
+}
+
+/* This is separate to keep the opr_sanity regression test from complaining */
+Datum
+regexp_substr_no_subexpr(PG_FUNCTION_ARGS)
+{
+ return regexp_substr(fcinfo);
+}
+
+/*
+ * regexp_fixed_prefix - extract fixed prefix, if any, for a regexp
+ *
+ * The result is NULL if there is no fixed prefix, else a palloc'd string.
+ * If it is an exact match, not just a prefix, *exact is returned as true.
+ */
+char *
+regexp_fixed_prefix(text *text_re, bool case_insensitive, Oid collation,
+ bool *exact)
+{
+ char *result;
+ regex_t *re;
+ int cflags;
+ int re_result;
+ pg_wchar *str;
+ size_t slen;
+ size_t maxlen;
+ char errMsg[100];
+
+ *exact = false; /* default result */
+
+ /* Compile RE */
+ cflags = REG_ADVANCED;
+ if (case_insensitive)
+ cflags |= REG_ICASE;
+
+ re = RE_compile_and_cache(text_re, cflags | REG_NOSUB, collation);
+
+ /* Examine it to see if there's a fixed prefix */
+ re_result = pg_regprefix(re, &str, &slen);
+
+ switch (re_result)
+ {
+ case REG_NOMATCH:
+ return NULL;
+
+ case REG_PREFIX:
+ /* continue with wchar conversion */
+ break;
+
+ case REG_EXACT:
+ *exact = true;
+ /* continue with wchar conversion */
+ break;
+
+ default:
+ /* re failed??? */
+ CHECK_FOR_INTERRUPTS();
+ pg_regerror(re_result, re, errMsg, sizeof(errMsg));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+ errmsg("regular expression failed: %s", errMsg)));
+ break;
+ }
+
+ /* Convert pg_wchar result back to database encoding */
+ maxlen = pg_database_encoding_max_length() * slen + 1;
+ result = (char *) palloc(maxlen);
+ slen = pg_wchar2mb_with_len(str, result, slen);
+ Assert(slen < maxlen);
+
+ free(str);
+
+ return result;
+}
diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c
new file mode 100644
index 0000000..6d4c1c2
--- /dev/null
+++ b/src/backend/utils/adt/regproc.c
@@ -0,0 +1,2062 @@
+/*-------------------------------------------------------------------------
+ *
+ * regproc.c
+ * Functions for the built-in types regproc, regclass, regtype, etc.
+ *
+ * These types are all binary-compatible with type Oid, and rely on Oid
+ * for comparison and so forth. Their only interesting behavior is in
+ * special I/O conversion routines.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/regproc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "access/htup_details.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_ts_config.h"
+#include "catalog/pg_ts_dict.h"
+#include "catalog/pg_type.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "parser/parse_type.h"
+#include "parser/scansup.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/regproc.h"
+#include "utils/syscache.h"
+#include "utils/varlena.h"
+
+static void parseNameAndArgTypes(const char *string, bool allowNone,
+ List **names, int *nargs, Oid *argtypes);
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+/*
+ * regprocin - converts "proname" to proc OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_proc entry.
+ */
+Datum
+regprocin(PG_FUNCTION_ARGS)
+{
+ char *pro_name_or_oid = PG_GETARG_CSTRING(0);
+ RegProcedure result = InvalidOid;
+ List *names;
+ FuncCandidateList clist;
+
+ /* '-' ? */
+ if (strcmp(pro_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (pro_name_or_oid[0] >= '0' &&
+ pro_name_or_oid[0] <= '9' &&
+ strspn(pro_name_or_oid, "0123456789") == strlen(pro_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(pro_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* Else it's a name, possibly schema-qualified */
+
+ /*
+ * We should never get here in bootstrap mode, as all references should
+ * have been resolved by genbki.pl.
+ */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regproc values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_proc entries in the current search path.
+ */
+ names = stringToQualifiedNameList(pro_name_or_oid);
+ clist = FuncnameGetCandidates(names, -1, NIL, false, false, false, false);
+
+ if (clist == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("function \"%s\" does not exist", pro_name_or_oid)));
+ else if (clist->next != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_AMBIGUOUS_FUNCTION),
+ errmsg("more than one function named \"%s\"",
+ pro_name_or_oid)));
+
+ result = clist->oid;
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regproc - converts "proname" to proc OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regproc(PG_FUNCTION_ARGS)
+{
+ char *pro_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ List *names;
+ FuncCandidateList clist;
+
+ /*
+ * Parse the name into components and see if it matches any pg_proc
+ * entries in the current search path.
+ */
+ names = stringToQualifiedNameList(pro_name);
+ clist = FuncnameGetCandidates(names, -1, NIL, false, false, false, true);
+
+ if (clist == NULL || clist->next != NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(clist->oid);
+}
+
+/*
+ * regprocout - converts proc OID to "pro_name"
+ */
+Datum
+regprocout(PG_FUNCTION_ARGS)
+{
+ RegProcedure proid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple proctup;
+
+ if (proid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(proid));
+
+ if (HeapTupleIsValid(proctup))
+ {
+ Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(proctup);
+ char *proname = NameStr(procform->proname);
+
+ /*
+ * In bootstrap mode, skip the fancy namespace stuff and just return
+ * the proc name. (This path is only needed for debugging output
+ * anyway.)
+ */
+ if (IsBootstrapProcessingMode())
+ result = pstrdup(proname);
+ else
+ {
+ char *nspname;
+ FuncCandidateList clist;
+
+ /*
+ * Would this proc be found (uniquely!) by regprocin? If not,
+ * qualify it.
+ */
+ clist = FuncnameGetCandidates(list_make1(makeString(proname)),
+ -1, NIL, false, false, false, false);
+ if (clist != NULL && clist->next == NULL &&
+ clist->oid == proid)
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(procform->pronamespace);
+
+ result = quote_qualified_identifier(nspname, proname);
+ }
+
+ ReleaseSysCache(proctup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_proc entry, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", proid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regprocrecv - converts external binary format to regproc
+ */
+Datum
+regprocrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regprocsend - converts regproc to binary format
+ */
+Datum
+regprocsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regprocedurein - converts "proname(args)" to proc OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_proc entry.
+ */
+Datum
+regprocedurein(PG_FUNCTION_ARGS)
+{
+ char *pro_name_or_oid = PG_GETARG_CSTRING(0);
+ RegProcedure result = InvalidOid;
+ List *names;
+ int nargs;
+ Oid argtypes[FUNC_MAX_ARGS];
+ FuncCandidateList clist;
+
+ /* '-' ? */
+ if (strcmp(pro_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (pro_name_or_oid[0] >= '0' &&
+ pro_name_or_oid[0] <= '9' &&
+ strspn(pro_name_or_oid, "0123456789") == strlen(pro_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(pro_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regprocedure values must be OIDs in bootstrap mode");
+
+ /*
+ * Else it's a name and arguments. Parse the name and arguments, look up
+ * potential matches in the current namespace search list, and scan to see
+ * which one exactly matches the given argument types. (There will not be
+ * more than one match.)
+ */
+ parseNameAndArgTypes(pro_name_or_oid, false, &names, &nargs, argtypes);
+
+ clist = FuncnameGetCandidates(names, nargs, NIL, false, false,
+ false, false);
+
+ for (; clist; clist = clist->next)
+ {
+ if (memcmp(clist->args, argtypes, nargs * sizeof(Oid)) == 0)
+ break;
+ }
+
+ if (clist == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("function \"%s\" does not exist", pro_name_or_oid)));
+
+ result = clist->oid;
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regprocedure - converts "proname(args)" to proc OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regprocedure(PG_FUNCTION_ARGS)
+{
+ char *pro_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ List *names;
+ int nargs;
+ Oid argtypes[FUNC_MAX_ARGS];
+ FuncCandidateList clist;
+
+ /*
+ * Parse the name and arguments, look up potential matches in the current
+ * namespace search list, and scan to see which one exactly matches the
+ * given argument types. (There will not be more than one match.)
+ */
+ parseNameAndArgTypes(pro_name, false, &names, &nargs, argtypes);
+
+ clist = FuncnameGetCandidates(names, nargs, NIL, false, false, false, true);
+
+ for (; clist; clist = clist->next)
+ {
+ if (memcmp(clist->args, argtypes, nargs * sizeof(Oid)) == 0)
+ PG_RETURN_OID(clist->oid);
+ }
+
+ PG_RETURN_NULL();
+}
+
+/*
+ * format_procedure - converts proc OID to "pro_name(args)"
+ *
+ * This exports the useful functionality of regprocedureout for use
+ * in other backend modules. The result is a palloc'd string.
+ */
+char *
+format_procedure(Oid procedure_oid)
+{
+ return format_procedure_extended(procedure_oid, 0);
+}
+
+char *
+format_procedure_qualified(Oid procedure_oid)
+{
+ return format_procedure_extended(procedure_oid, FORMAT_PROC_FORCE_QUALIFY);
+}
+
+/*
+ * format_procedure_extended - converts procedure OID to "pro_name(args)"
+ *
+ * This exports the useful functionality of regprocedureout for use
+ * in other backend modules. The result is a palloc'd string, or NULL.
+ *
+ * Routine to produce regprocedure names; see format_procedure above.
+ *
+ * The following bits in 'flags' modify the behavior:
+ * - FORMAT_PROC_INVALID_AS_NULL
+ * if the procedure OID is invalid or unknown, return NULL instead
+ * of the numeric OID.
+ * - FORMAT_PROC_FORCE_QUALIFY
+ * always schema-qualify procedure names, regardless of search_path
+ */
+char *
+format_procedure_extended(Oid procedure_oid, bits16 flags)
+{
+ char *result;
+ HeapTuple proctup;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procedure_oid));
+
+ if (HeapTupleIsValid(proctup))
+ {
+ Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(proctup);
+ char *proname = NameStr(procform->proname);
+ int nargs = procform->pronargs;
+ int i;
+ char *nspname;
+ StringInfoData buf;
+
+ /* XXX no support here for bootstrap mode */
+ Assert(!IsBootstrapProcessingMode());
+
+ initStringInfo(&buf);
+
+ /*
+ * Would this proc be found (given the right args) by regprocedurein?
+ * If not, or if caller requests it, we need to qualify it.
+ */
+ if ((flags & FORMAT_PROC_FORCE_QUALIFY) == 0 &&
+ FunctionIsVisible(procedure_oid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(procform->pronamespace);
+
+ appendStringInfo(&buf, "%s(",
+ quote_qualified_identifier(nspname, proname));
+ for (i = 0; i < nargs; i++)
+ {
+ Oid thisargtype = procform->proargtypes.values[i];
+
+ if (i > 0)
+ appendStringInfoChar(&buf, ',');
+ appendStringInfoString(&buf,
+ (flags & FORMAT_PROC_FORCE_QUALIFY) != 0 ?
+ format_type_be_qualified(thisargtype) :
+ format_type_be(thisargtype));
+ }
+ appendStringInfoChar(&buf, ')');
+
+ result = buf.data;
+
+ ReleaseSysCache(proctup);
+ }
+ else if ((flags & FORMAT_PROC_INVALID_AS_NULL) != 0)
+ {
+ /* If object is undefined, return NULL as wanted by caller */
+ result = NULL;
+ }
+ else
+ {
+ /* If OID doesn't match any pg_proc entry, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", procedure_oid);
+ }
+
+ return result;
+}
+
+/*
+ * Output an objname/objargs representation for the procedure with the
+ * given OID. If it doesn't exist, an error is thrown.
+ *
+ * This can be used to feed get_object_address.
+ */
+void
+format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs,
+ bool missing_ok)
+{
+ HeapTuple proctup;
+ Form_pg_proc procform;
+ int nargs;
+ int i;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procedure_oid));
+
+ if (!HeapTupleIsValid(proctup))
+ {
+ if (!missing_ok)
+ elog(ERROR, "cache lookup failed for procedure with OID %u", procedure_oid);
+ return;
+ }
+
+ procform = (Form_pg_proc) GETSTRUCT(proctup);
+ nargs = procform->pronargs;
+
+ *objnames = list_make2(get_namespace_name_or_temp(procform->pronamespace),
+ pstrdup(NameStr(procform->proname)));
+ *objargs = NIL;
+ for (i = 0; i < nargs; i++)
+ {
+ Oid thisargtype = procform->proargtypes.values[i];
+
+ *objargs = lappend(*objargs, format_type_be_qualified(thisargtype));
+ }
+
+ ReleaseSysCache(proctup);
+}
+
+/*
+ * regprocedureout - converts proc OID to "pro_name(args)"
+ */
+Datum
+regprocedureout(PG_FUNCTION_ARGS)
+{
+ RegProcedure proid = PG_GETARG_OID(0);
+ char *result;
+
+ if (proid == InvalidOid)
+ result = pstrdup("-");
+ else
+ result = format_procedure(proid);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regprocedurerecv - converts external binary format to regprocedure
+ */
+Datum
+regprocedurerecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regproceduresend - converts regprocedure to binary format
+ */
+Datum
+regproceduresend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regoperin - converts "oprname" to operator OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '0' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_operator entry.
+ */
+Datum
+regoperin(PG_FUNCTION_ARGS)
+{
+ char *opr_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result = InvalidOid;
+ List *names;
+ FuncCandidateList clist;
+
+ /* '0' ? */
+ if (strcmp(opr_name_or_oid, "0") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (opr_name_or_oid[0] >= '0' &&
+ opr_name_or_oid[0] <= '9' &&
+ strspn(opr_name_or_oid, "0123456789") == strlen(opr_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(opr_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* Else it's a name, possibly schema-qualified */
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regoper values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_operator entries in the current search path.
+ */
+ names = stringToQualifiedNameList(opr_name_or_oid);
+ clist = OpernameGetCandidates(names, '\0', false);
+
+ if (clist == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("operator does not exist: %s", opr_name_or_oid)));
+ else if (clist->next != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_AMBIGUOUS_FUNCTION),
+ errmsg("more than one operator named %s",
+ opr_name_or_oid)));
+
+ result = clist->oid;
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regoper - converts "oprname" to operator OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regoper(PG_FUNCTION_ARGS)
+{
+ char *opr_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ List *names;
+ FuncCandidateList clist;
+
+ /*
+ * Parse the name into components and see if it matches any pg_operator
+ * entries in the current search path.
+ */
+ names = stringToQualifiedNameList(opr_name);
+ clist = OpernameGetCandidates(names, '\0', true);
+
+ if (clist == NULL || clist->next != NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(clist->oid);
+}
+
+/*
+ * regoperout - converts operator OID to "opr_name"
+ */
+Datum
+regoperout(PG_FUNCTION_ARGS)
+{
+ Oid oprid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple opertup;
+
+ if (oprid == InvalidOid)
+ {
+ result = pstrdup("0");
+ PG_RETURN_CSTRING(result);
+ }
+
+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oprid));
+
+ if (HeapTupleIsValid(opertup))
+ {
+ Form_pg_operator operform = (Form_pg_operator) GETSTRUCT(opertup);
+ char *oprname = NameStr(operform->oprname);
+
+ /*
+ * In bootstrap mode, skip the fancy namespace stuff and just return
+ * the oper name. (This path is only needed for debugging output
+ * anyway.)
+ */
+ if (IsBootstrapProcessingMode())
+ result = pstrdup(oprname);
+ else
+ {
+ FuncCandidateList clist;
+
+ /*
+ * Would this oper be found (uniquely!) by regoperin? If not,
+ * qualify it.
+ */
+ clist = OpernameGetCandidates(list_make1(makeString(oprname)),
+ '\0', false);
+ if (clist != NULL && clist->next == NULL &&
+ clist->oid == oprid)
+ result = pstrdup(oprname);
+ else
+ {
+ const char *nspname;
+
+ nspname = get_namespace_name(operform->oprnamespace);
+ nspname = quote_identifier(nspname);
+ result = (char *) palloc(strlen(nspname) + strlen(oprname) + 2);
+ sprintf(result, "%s.%s", nspname, oprname);
+ }
+ }
+
+ ReleaseSysCache(opertup);
+ }
+ else
+ {
+ /*
+ * If OID doesn't match any pg_operator entry, return it numerically
+ */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", oprid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regoperrecv - converts external binary format to regoper
+ */
+Datum
+regoperrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regopersend - converts regoper to binary format
+ */
+Datum
+regopersend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regoperatorin - converts "oprname(args)" to operator OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '0' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_operator entry.
+ */
+Datum
+regoperatorin(PG_FUNCTION_ARGS)
+{
+ char *opr_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result;
+ List *names;
+ int nargs;
+ Oid argtypes[FUNC_MAX_ARGS];
+
+ /* '0' ? */
+ if (strcmp(opr_name_or_oid, "0") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (opr_name_or_oid[0] >= '0' &&
+ opr_name_or_oid[0] <= '9' &&
+ strspn(opr_name_or_oid, "0123456789") == strlen(opr_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(opr_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regoperator values must be OIDs in bootstrap mode");
+
+ /*
+ * Else it's a name and arguments. Parse the name and arguments, look up
+ * potential matches in the current namespace search list, and scan to see
+ * which one exactly matches the given argument types. (There will not be
+ * more than one match.)
+ */
+ parseNameAndArgTypes(opr_name_or_oid, true, &names, &nargs, argtypes);
+ if (nargs == 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_PARAMETER),
+ errmsg("missing argument"),
+ errhint("Use NONE to denote the missing argument of a unary operator.")));
+ if (nargs != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_ARGUMENTS),
+ errmsg("too many arguments"),
+ errhint("Provide two argument types for operator.")));
+
+ result = OpernameGetOprid(names, argtypes[0], argtypes[1]);
+
+ if (!OidIsValid(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("operator does not exist: %s", opr_name_or_oid)));
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regoperator - converts "oprname(args)" to operator OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regoperator(PG_FUNCTION_ARGS)
+{
+ char *opr_name_or_oid = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ List *names;
+ int nargs;
+ Oid argtypes[FUNC_MAX_ARGS];
+
+ /*
+ * Parse the name and arguments, look up potential matches in the current
+ * namespace search list, and scan to see which one exactly matches the
+ * given argument types. (There will not be more than one match.)
+ */
+ parseNameAndArgTypes(opr_name_or_oid, true, &names, &nargs, argtypes);
+ if (nargs == 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_PARAMETER),
+ errmsg("missing argument"),
+ errhint("Use NONE to denote the missing argument of a unary operator.")));
+ if (nargs != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_ARGUMENTS),
+ errmsg("too many arguments"),
+ errhint("Provide two argument types for operator.")));
+
+ result = OpernameGetOprid(names, argtypes[0], argtypes[1]);
+
+ if (!OidIsValid(result))
+ PG_RETURN_NULL();
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * format_operator_extended - converts operator OID to "opr_name(args)"
+ *
+ * This exports the useful functionality of regoperatorout for use
+ * in other backend modules. The result is a palloc'd string, or NULL.
+ *
+ * The following bits in 'flags' modify the behavior:
+ * - FORMAT_OPERATOR_INVALID_AS_NULL
+ * if the operator OID is invalid or unknown, return NULL instead
+ * of the numeric OID.
+ * - FORMAT_OPERATOR_FORCE_QUALIFY
+ * always schema-qualify operator names, regardless of search_path
+ */
+char *
+format_operator_extended(Oid operator_oid, bits16 flags)
+{
+ char *result;
+ HeapTuple opertup;
+
+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operator_oid));
+
+ if (HeapTupleIsValid(opertup))
+ {
+ Form_pg_operator operform = (Form_pg_operator) GETSTRUCT(opertup);
+ char *oprname = NameStr(operform->oprname);
+ char *nspname;
+ StringInfoData buf;
+
+ /* XXX no support here for bootstrap mode */
+ Assert(!IsBootstrapProcessingMode());
+
+ initStringInfo(&buf);
+
+ /*
+ * Would this oper be found (given the right args) by regoperatorin?
+ * If not, or if caller explicitly requests it, we need to qualify it.
+ */
+ if ((flags & FORMAT_OPERATOR_FORCE_QUALIFY) != 0 ||
+ !OperatorIsVisible(operator_oid))
+ {
+ nspname = get_namespace_name(operform->oprnamespace);
+ appendStringInfo(&buf, "%s.",
+ quote_identifier(nspname));
+ }
+
+ appendStringInfo(&buf, "%s(", oprname);
+
+ if (operform->oprleft)
+ appendStringInfo(&buf, "%s,",
+ (flags & FORMAT_OPERATOR_FORCE_QUALIFY) != 0 ?
+ format_type_be_qualified(operform->oprleft) :
+ format_type_be(operform->oprleft));
+ else
+ appendStringInfoString(&buf, "NONE,");
+
+ if (operform->oprright)
+ appendStringInfo(&buf, "%s)",
+ (flags & FORMAT_OPERATOR_FORCE_QUALIFY) != 0 ?
+ format_type_be_qualified(operform->oprright) :
+ format_type_be(operform->oprright));
+ else
+ appendStringInfoString(&buf, "NONE)");
+
+ result = buf.data;
+
+ ReleaseSysCache(opertup);
+ }
+ else if ((flags & FORMAT_OPERATOR_INVALID_AS_NULL) != 0)
+ {
+ /* If object is undefined, return NULL as wanted by caller */
+ result = NULL;
+ }
+ else
+ {
+ /*
+ * If OID doesn't match any pg_operator entry, return it numerically
+ */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", operator_oid);
+ }
+
+ return result;
+}
+
+char *
+format_operator(Oid operator_oid)
+{
+ return format_operator_extended(operator_oid, 0);
+}
+
+char *
+format_operator_qualified(Oid operator_oid)
+{
+ return format_operator_extended(operator_oid,
+ FORMAT_OPERATOR_FORCE_QUALIFY);
+}
+
+void
+format_operator_parts(Oid operator_oid, List **objnames, List **objargs,
+ bool missing_ok)
+{
+ HeapTuple opertup;
+ Form_pg_operator oprForm;
+
+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operator_oid));
+ if (!HeapTupleIsValid(opertup))
+ {
+ if (!missing_ok)
+ elog(ERROR, "cache lookup failed for operator with OID %u",
+ operator_oid);
+ return;
+ }
+
+ oprForm = (Form_pg_operator) GETSTRUCT(opertup);
+ *objnames = list_make2(get_namespace_name_or_temp(oprForm->oprnamespace),
+ pstrdup(NameStr(oprForm->oprname)));
+ *objargs = NIL;
+ if (oprForm->oprleft)
+ *objargs = lappend(*objargs,
+ format_type_be_qualified(oprForm->oprleft));
+ if (oprForm->oprright)
+ *objargs = lappend(*objargs,
+ format_type_be_qualified(oprForm->oprright));
+
+ ReleaseSysCache(opertup);
+}
+
+/*
+ * regoperatorout - converts operator OID to "opr_name(args)"
+ */
+Datum
+regoperatorout(PG_FUNCTION_ARGS)
+{
+ Oid oprid = PG_GETARG_OID(0);
+ char *result;
+
+ if (oprid == InvalidOid)
+ result = pstrdup("0");
+ else
+ result = format_operator(oprid);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regoperatorrecv - converts external binary format to regoperator
+ */
+Datum
+regoperatorrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regoperatorsend - converts regoperator to binary format
+ */
+Datum
+regoperatorsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regclassin - converts "classname" to class OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_class entry.
+ */
+Datum
+regclassin(PG_FUNCTION_ARGS)
+{
+ char *class_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result = InvalidOid;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(class_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (class_name_or_oid[0] >= '0' &&
+ class_name_or_oid[0] <= '9' &&
+ strspn(class_name_or_oid, "0123456789") == strlen(class_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(class_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* Else it's a name, possibly schema-qualified */
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regclass values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_class entries in the current search path.
+ */
+ names = stringToQualifiedNameList(class_name_or_oid);
+
+ /* We might not even have permissions on this relation; don't lock it. */
+ result = RangeVarGetRelid(makeRangeVarFromNameList(names), NoLock, false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regclass - converts "classname" to class OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regclass(PG_FUNCTION_ARGS)
+{
+ char *class_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ List *names;
+
+ /*
+ * Parse the name into components and see if it matches any pg_class
+ * entries in the current search path.
+ */
+ names = stringToQualifiedNameList(class_name);
+
+ /* We might not even have permissions on this relation; don't lock it. */
+ result = RangeVarGetRelid(makeRangeVarFromNameList(names), NoLock, true);
+
+ if (OidIsValid(result))
+ PG_RETURN_OID(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * regclassout - converts class OID to "class_name"
+ */
+Datum
+regclassout(PG_FUNCTION_ARGS)
+{
+ Oid classid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple classtup;
+
+ if (classid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ classtup = SearchSysCache1(RELOID, ObjectIdGetDatum(classid));
+
+ if (HeapTupleIsValid(classtup))
+ {
+ Form_pg_class classform = (Form_pg_class) GETSTRUCT(classtup);
+ char *classname = NameStr(classform->relname);
+
+ /*
+ * In bootstrap mode, skip the fancy namespace stuff and just return
+ * the class name. (This path is only needed for debugging output
+ * anyway.)
+ */
+ if (IsBootstrapProcessingMode())
+ result = pstrdup(classname);
+ else
+ {
+ char *nspname;
+
+ /*
+ * Would this class be found by regclassin? If not, qualify it.
+ */
+ if (RelationIsVisible(classid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(classform->relnamespace);
+
+ result = quote_qualified_identifier(nspname, classname);
+ }
+
+ ReleaseSysCache(classtup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_class entry, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", classid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regclassrecv - converts external binary format to regclass
+ */
+Datum
+regclassrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regclasssend - converts regclass to binary format
+ */
+Datum
+regclasssend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regcollationin - converts "collationname" to collation OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_collation entry.
+ */
+Datum
+regcollationin(PG_FUNCTION_ARGS)
+{
+ char *collation_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result = InvalidOid;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(collation_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (collation_name_or_oid[0] >= '0' &&
+ collation_name_or_oid[0] <= '9' &&
+ strspn(collation_name_or_oid, "0123456789") == strlen(collation_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(collation_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* Else it's a name, possibly schema-qualified */
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regcollation values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_collation entries in the current search path.
+ */
+ names = stringToQualifiedNameList(collation_name_or_oid);
+
+ result = get_collation_oid(names, false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regcollation - converts "collationname" to collation OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regcollation(PG_FUNCTION_ARGS)
+{
+ char *collation_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ List *names;
+
+ /*
+ * Parse the name into components and see if it matches any pg_collation
+ * entries in the current search path.
+ */
+ names = stringToQualifiedNameList(collation_name);
+
+ /* We might not even have permissions on this relation; don't lock it. */
+ result = get_collation_oid(names, true);
+
+ if (OidIsValid(result))
+ PG_RETURN_OID(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * regcollationout - converts collation OID to "collation_name"
+ */
+Datum
+regcollationout(PG_FUNCTION_ARGS)
+{
+ Oid collationid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple collationtup;
+
+ if (collationid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ collationtup = SearchSysCache1(COLLOID, ObjectIdGetDatum(collationid));
+
+ if (HeapTupleIsValid(collationtup))
+ {
+ Form_pg_collation collationform = (Form_pg_collation) GETSTRUCT(collationtup);
+ char *collationname = NameStr(collationform->collname);
+
+ /*
+ * In bootstrap mode, skip the fancy namespace stuff and just return
+ * the collation name. (This path is only needed for debugging output
+ * anyway.)
+ */
+ if (IsBootstrapProcessingMode())
+ result = pstrdup(collationname);
+ else
+ {
+ char *nspname;
+
+ /*
+ * Would this collation be found by regcollationin? If not,
+ * qualify it.
+ */
+ if (CollationIsVisible(collationid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(collationform->collnamespace);
+
+ result = quote_qualified_identifier(nspname, collationname);
+ }
+
+ ReleaseSysCache(collationtup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_collation entry, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", collationid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regcollationrecv - converts external binary format to regcollation
+ */
+Datum
+regcollationrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regcollationsend - converts regcollation to binary format
+ */
+Datum
+regcollationsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regtypein - converts "typename" to type OID
+ *
+ * The type name can be specified using the full type syntax recognized by
+ * the parser; for example, DOUBLE PRECISION and INTEGER[] will work and be
+ * translated to the correct type names. (We ignore any typmod info
+ * generated by the parser, however.)
+ *
+ * We also accept a numeric OID, for symmetry with the output routine,
+ * and for possible use in bootstrap mode.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_type entry.
+ */
+Datum
+regtypein(PG_FUNCTION_ARGS)
+{
+ char *typ_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result = InvalidOid;
+ int32 typmod;
+
+ /* '-' ? */
+ if (strcmp(typ_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (typ_name_or_oid[0] >= '0' &&
+ typ_name_or_oid[0] <= '9' &&
+ strspn(typ_name_or_oid, "0123456789") == strlen(typ_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(typ_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* Else it's a type name, possibly schema-qualified or decorated */
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regtype values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: invoke the full parser to deal with special cases such as
+ * array syntax.
+ */
+ parseTypeString(typ_name_or_oid, &result, &typmod, false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regtype - converts "typename" to type OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regtype(PG_FUNCTION_ARGS)
+{
+ char *typ_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ int32 typmod;
+
+ /*
+ * Invoke the full parser to deal with special cases such as array syntax.
+ */
+ parseTypeString(typ_name, &result, &typmod, true);
+
+ if (OidIsValid(result))
+ PG_RETURN_OID(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * regtypeout - converts type OID to "typ_name"
+ */
+Datum
+regtypeout(PG_FUNCTION_ARGS)
+{
+ Oid typid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple typetup;
+
+ if (typid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ typetup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+
+ if (HeapTupleIsValid(typetup))
+ {
+ Form_pg_type typeform = (Form_pg_type) GETSTRUCT(typetup);
+
+ /*
+ * In bootstrap mode, skip the fancy namespace stuff and just return
+ * the type name. (This path is only needed for debugging output
+ * anyway.)
+ */
+ if (IsBootstrapProcessingMode())
+ {
+ char *typname = NameStr(typeform->typname);
+
+ result = pstrdup(typname);
+ }
+ else
+ result = format_type_be(typid);
+
+ ReleaseSysCache(typetup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_type entry, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", typid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regtyperecv - converts external binary format to regtype
+ */
+Datum
+regtyperecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regtypesend - converts regtype to binary format
+ */
+Datum
+regtypesend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regconfigin - converts "tsconfigname" to tsconfig OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_ts_config entry.
+ */
+Datum
+regconfigin(PG_FUNCTION_ARGS)
+{
+ char *cfg_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(cfg_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (cfg_name_or_oid[0] >= '0' &&
+ cfg_name_or_oid[0] <= '9' &&
+ strspn(cfg_name_or_oid, "0123456789") == strlen(cfg_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(cfg_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regconfig values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_ts_config entries in the current search path.
+ */
+ names = stringToQualifiedNameList(cfg_name_or_oid);
+
+ result = get_ts_config_oid(names, false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * regconfigout - converts tsconfig OID to "tsconfigname"
+ */
+Datum
+regconfigout(PG_FUNCTION_ARGS)
+{
+ Oid cfgid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple cfgtup;
+
+ if (cfgid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ cfgtup = SearchSysCache1(TSCONFIGOID, ObjectIdGetDatum(cfgid));
+
+ if (HeapTupleIsValid(cfgtup))
+ {
+ Form_pg_ts_config cfgform = (Form_pg_ts_config) GETSTRUCT(cfgtup);
+ char *cfgname = NameStr(cfgform->cfgname);
+ char *nspname;
+
+ /*
+ * Would this config be found by regconfigin? If not, qualify it.
+ */
+ if (TSConfigIsVisible(cfgid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(cfgform->cfgnamespace);
+
+ result = quote_qualified_identifier(nspname, cfgname);
+
+ ReleaseSysCache(cfgtup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_ts_config row, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", cfgid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regconfigrecv - converts external binary format to regconfig
+ */
+Datum
+regconfigrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regconfigsend - converts regconfig to binary format
+ */
+Datum
+regconfigsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+
+/*
+ * regdictionaryin - converts "tsdictionaryname" to tsdictionary OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_ts_dict entry.
+ */
+Datum
+regdictionaryin(PG_FUNCTION_ARGS)
+{
+ char *dict_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(dict_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (dict_name_or_oid[0] >= '0' &&
+ dict_name_or_oid[0] <= '9' &&
+ strspn(dict_name_or_oid, "0123456789") == strlen(dict_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(dict_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regdictionary values must be OIDs in bootstrap mode");
+
+ /*
+ * Normal case: parse the name into components and see if it matches any
+ * pg_ts_dict entries in the current search path.
+ */
+ names = stringToQualifiedNameList(dict_name_or_oid);
+
+ result = get_ts_dict_oid(names, false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * regdictionaryout - converts tsdictionary OID to "tsdictionaryname"
+ */
+Datum
+regdictionaryout(PG_FUNCTION_ARGS)
+{
+ Oid dictid = PG_GETARG_OID(0);
+ char *result;
+ HeapTuple dicttup;
+
+ if (dictid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ dicttup = SearchSysCache1(TSDICTOID, ObjectIdGetDatum(dictid));
+
+ if (HeapTupleIsValid(dicttup))
+ {
+ Form_pg_ts_dict dictform = (Form_pg_ts_dict) GETSTRUCT(dicttup);
+ char *dictname = NameStr(dictform->dictname);
+ char *nspname;
+
+ /*
+ * Would this dictionary be found by regdictionaryin? If not, qualify
+ * it.
+ */
+ if (TSDictionaryIsVisible(dictid))
+ nspname = NULL;
+ else
+ nspname = get_namespace_name(dictform->dictnamespace);
+
+ result = quote_qualified_identifier(nspname, dictname);
+
+ ReleaseSysCache(dicttup);
+ }
+ else
+ {
+ /* If OID doesn't match any pg_ts_dict row, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", dictid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regdictionaryrecv - converts external binary format to regdictionary
+ */
+Datum
+regdictionaryrecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regdictionarysend - converts regdictionary to binary format
+ */
+Datum
+regdictionarysend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+/*
+ * regrolein - converts "rolename" to role OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_authid entry.
+ */
+Datum
+regrolein(PG_FUNCTION_ARGS)
+{
+ char *role_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(role_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (role_name_or_oid[0] >= '0' &&
+ role_name_or_oid[0] <= '9' &&
+ strspn(role_name_or_oid, "0123456789") == strlen(role_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(role_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regrole values must be OIDs in bootstrap mode");
+
+ /* Normal case: see if the name matches any pg_authid entry. */
+ names = stringToQualifiedNameList(role_name_or_oid);
+
+ if (list_length(names) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ result = get_role_oid(strVal(linitial(names)), false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regrole - converts "rolename" to role OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regrole(PG_FUNCTION_ARGS)
+{
+ char *role_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ List *names;
+
+ names = stringToQualifiedNameList(role_name);
+
+ if (list_length(names) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ result = get_role_oid(strVal(linitial(names)), true);
+
+ if (OidIsValid(result))
+ PG_RETURN_OID(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * regroleout - converts role OID to "role_name"
+ */
+Datum
+regroleout(PG_FUNCTION_ARGS)
+{
+ Oid roleoid = PG_GETARG_OID(0);
+ char *result;
+
+ if (roleoid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ result = GetUserNameFromId(roleoid, true);
+
+ if (result)
+ {
+ /* pstrdup is not really necessary, but it avoids a compiler warning */
+ result = pstrdup(quote_identifier(result));
+ }
+ else
+ {
+ /* If OID doesn't match any role, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", roleoid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regrolerecv - converts external binary format to regrole
+ */
+Datum
+regrolerecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regrolesend - converts regrole to binary format
+ */
+Datum
+regrolesend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+/*
+ * regnamespacein - converts "nspname" to namespace OID
+ *
+ * We also accept a numeric OID, for symmetry with the output routine.
+ *
+ * '-' signifies unknown (OID 0). In all other cases, the input must
+ * match an existing pg_namespace entry.
+ */
+Datum
+regnamespacein(PG_FUNCTION_ARGS)
+{
+ char *nsp_name_or_oid = PG_GETARG_CSTRING(0);
+ Oid result;
+ List *names;
+
+ /* '-' ? */
+ if (strcmp(nsp_name_or_oid, "-") == 0)
+ PG_RETURN_OID(InvalidOid);
+
+ /* Numeric OID? */
+ if (nsp_name_or_oid[0] >= '0' &&
+ nsp_name_or_oid[0] <= '9' &&
+ strspn(nsp_name_or_oid, "0123456789") == strlen(nsp_name_or_oid))
+ {
+ result = DatumGetObjectId(DirectFunctionCall1(oidin,
+ CStringGetDatum(nsp_name_or_oid)));
+ PG_RETURN_OID(result);
+ }
+
+ /* The rest of this wouldn't work in bootstrap mode */
+ if (IsBootstrapProcessingMode())
+ elog(ERROR, "regnamespace values must be OIDs in bootstrap mode");
+
+ /* Normal case: see if the name matches any pg_namespace entry. */
+ names = stringToQualifiedNameList(nsp_name_or_oid);
+
+ if (list_length(names) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ result = get_namespace_oid(strVal(linitial(names)), false);
+
+ PG_RETURN_OID(result);
+}
+
+/*
+ * to_regnamespace - converts "nspname" to namespace OID
+ *
+ * If the name is not found, we return NULL.
+ */
+Datum
+to_regnamespace(PG_FUNCTION_ARGS)
+{
+ char *nsp_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ Oid result;
+ List *names;
+
+ names = stringToQualifiedNameList(nsp_name);
+
+ if (list_length(names) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ result = get_namespace_oid(strVal(linitial(names)), true);
+
+ if (OidIsValid(result))
+ PG_RETURN_OID(result);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * regnamespaceout - converts namespace OID to "nsp_name"
+ */
+Datum
+regnamespaceout(PG_FUNCTION_ARGS)
+{
+ Oid nspid = PG_GETARG_OID(0);
+ char *result;
+
+ if (nspid == InvalidOid)
+ {
+ result = pstrdup("-");
+ PG_RETURN_CSTRING(result);
+ }
+
+ result = get_namespace_name(nspid);
+
+ if (result)
+ {
+ /* pstrdup is not really necessary, but it avoids a compiler warning */
+ result = pstrdup(quote_identifier(result));
+ }
+ else
+ {
+ /* If OID doesn't match any namespace, return it numerically */
+ result = (char *) palloc(NAMEDATALEN);
+ snprintf(result, NAMEDATALEN, "%u", nspid);
+ }
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * regnamespacerecv - converts external binary format to regnamespace
+ */
+Datum
+regnamespacerecv(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidrecv, so share code */
+ return oidrecv(fcinfo);
+}
+
+/*
+ * regnamespacesend - converts regnamespace to binary format
+ */
+Datum
+regnamespacesend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as oidsend, so share code */
+ return oidsend(fcinfo);
+}
+
+/*
+ * text_regclass: convert text to regclass
+ *
+ * This could be replaced by CoerceViaIO, except that we need to treat
+ * text-to-regclass as an implicit cast to support legacy forms of nextval()
+ * and related functions.
+ */
+Datum
+text_regclass(PG_FUNCTION_ARGS)
+{
+ text *relname = PG_GETARG_TEXT_PP(0);
+ Oid result;
+ RangeVar *rv;
+
+ rv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
+
+ /* We might not even have permissions on this relation; don't lock it. */
+ result = RangeVarGetRelid(rv, NoLock, false);
+
+ PG_RETURN_OID(result);
+}
+
+
+/*
+ * Given a C string, parse it into a qualified-name list.
+ */
+List *
+stringToQualifiedNameList(const char *string)
+{
+ char *rawname;
+ List *result = NIL;
+ List *namelist;
+ ListCell *l;
+
+ /* We need a modifiable copy of the input string. */
+ rawname = pstrdup(string);
+
+ if (!SplitIdentifierString(rawname, '.', &namelist))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ if (namelist == NIL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ foreach(l, namelist)
+ {
+ char *curname = (char *) lfirst(l);
+
+ result = lappend(result, makeString(pstrdup(curname)));
+ }
+
+ pfree(rawname);
+ list_free(namelist);
+
+ return result;
+}
+
+/*****************************************************************************
+ * SUPPORT ROUTINES *
+ *****************************************************************************/
+
+/*
+ * Given a C string, parse it into a qualified function or operator name
+ * followed by a parenthesized list of type names. Reduce the
+ * type names to an array of OIDs (returned into *nargs and *argtypes;
+ * the argtypes array should be of size FUNC_MAX_ARGS). The function or
+ * operator name is returned to *names as a List of Strings.
+ *
+ * If allowNone is true, accept "NONE" and return it as InvalidOid (this is
+ * for unary operators).
+ */
+static void
+parseNameAndArgTypes(const char *string, bool allowNone, List **names,
+ int *nargs, Oid *argtypes)
+{
+ char *rawname;
+ char *ptr;
+ char *ptr2;
+ char *typename;
+ bool in_quote;
+ bool had_comma;
+ int paren_count;
+ Oid typeid;
+ int32 typmod;
+
+ /* We need a modifiable copy of the input string. */
+ rawname = pstrdup(string);
+
+ /* Scan to find the expected left paren; mustn't be quoted */
+ in_quote = false;
+ for (ptr = rawname; *ptr; ptr++)
+ {
+ if (*ptr == '"')
+ in_quote = !in_quote;
+ else if (*ptr == '(' && !in_quote)
+ break;
+ }
+ if (*ptr == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected a left parenthesis")));
+
+ /* Separate the name and parse it into a list */
+ *ptr++ = '\0';
+ *names = stringToQualifiedNameList(rawname);
+
+ /* Check for the trailing right parenthesis and remove it */
+ ptr2 = ptr + strlen(ptr);
+ while (--ptr2 > ptr)
+ {
+ if (!scanner_isspace(*ptr2))
+ break;
+ }
+ if (*ptr2 != ')')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected a right parenthesis")));
+
+ *ptr2 = '\0';
+
+ /* Separate the remaining string into comma-separated type names */
+ *nargs = 0;
+ had_comma = false;
+
+ for (;;)
+ {
+ /* allow leading whitespace */
+ while (scanner_isspace(*ptr))
+ ptr++;
+ if (*ptr == '\0')
+ {
+ /* End of string. Okay unless we had a comma before. */
+ if (had_comma)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("expected a type name")));
+ break;
+ }
+ typename = ptr;
+ /* Find end of type name --- end of string or comma */
+ /* ... but not a quoted or parenthesized comma */
+ in_quote = false;
+ paren_count = 0;
+ for (; *ptr; ptr++)
+ {
+ if (*ptr == '"')
+ in_quote = !in_quote;
+ else if (*ptr == ',' && !in_quote && paren_count == 0)
+ break;
+ else if (!in_quote)
+ {
+ switch (*ptr)
+ {
+ case '(':
+ case '[':
+ paren_count++;
+ break;
+ case ')':
+ case ']':
+ paren_count--;
+ break;
+ }
+ }
+ }
+ if (in_quote || paren_count != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("improper type name")));
+
+ ptr2 = ptr;
+ if (*ptr == ',')
+ {
+ had_comma = true;
+ *ptr++ = '\0';
+ }
+ else
+ {
+ had_comma = false;
+ Assert(*ptr == '\0');
+ }
+ /* Lop off trailing whitespace */
+ while (--ptr2 >= typename)
+ {
+ if (!scanner_isspace(*ptr2))
+ break;
+ *ptr2 = '\0';
+ }
+
+ if (allowNone && pg_strcasecmp(typename, "none") == 0)
+ {
+ /* Special case for NONE */
+ typeid = InvalidOid;
+ typmod = -1;
+ }
+ else
+ {
+ /* Use full parser to resolve the type name */
+ parseTypeString(typename, &typeid, &typmod, false);
+ }
+ if (*nargs >= FUNC_MAX_ARGS)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_ARGUMENTS),
+ errmsg("too many arguments")));
+
+ argtypes[*nargs] = typeid;
+ (*nargs)++;
+ }
+
+ pfree(rawname);
+}
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
new file mode 100644
index 0000000..51b3fdc
--- /dev/null
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -0,0 +1,3020 @@
+/*-------------------------------------------------------------------------
+ *
+ * ri_triggers.c
+ *
+ * Generic trigger procedures for referential integrity constraint
+ * checks.
+ *
+ * Note about memory management: the private hashtables kept here live
+ * across query and transaction boundaries, in fact they live as long as
+ * the backend does. This works because the hashtable structures
+ * themselves are allocated by dynahash.c in its permanent DynaHashCxt,
+ * and the SPI plans they point to are saved using SPI_keepplan().
+ * There is not currently any provision for throwing away a no-longer-needed
+ * plan --- consider improving this someday.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/adt/ri_triggers.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/sysattr.h"
+#include "access/table.h"
+#include "access/tableam.h"
+#include "access/xact.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_type.h"
+#include "commands/trigger.h"
+#include "executor/executor.h"
+#include "executor/spi.h"
+#include "lib/ilist.h"
+#include "miscadmin.h"
+#include "parser/parse_coerce.h"
+#include "parser/parse_relation.h"
+#include "storage/bufmgr.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/guc.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/rls.h"
+#include "utils/ruleutils.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+/*
+ * Local definitions
+ */
+
+#define RI_MAX_NUMKEYS INDEX_MAX_KEYS
+
+#define RI_INIT_CONSTRAINTHASHSIZE 64
+#define RI_INIT_QUERYHASHSIZE (RI_INIT_CONSTRAINTHASHSIZE * 4)
+
+#define RI_KEYS_ALL_NULL 0
+#define RI_KEYS_SOME_NULL 1
+#define RI_KEYS_NONE_NULL 2
+
+/* RI query type codes */
+/* these queries are executed against the PK (referenced) table: */
+#define RI_PLAN_CHECK_LOOKUPPK 1
+#define RI_PLAN_CHECK_LOOKUPPK_FROM_PK 2
+#define RI_PLAN_LAST_ON_PK RI_PLAN_CHECK_LOOKUPPK_FROM_PK
+/* these queries are executed against the FK (referencing) table: */
+#define RI_PLAN_CASCADE_ONDELETE 3
+#define RI_PLAN_CASCADE_ONUPDATE 4
+/* For RESTRICT, the same plan can be used for both ON DELETE and ON UPDATE triggers. */
+#define RI_PLAN_RESTRICT 5
+#define RI_PLAN_SETNULL_ONDELETE 6
+#define RI_PLAN_SETNULL_ONUPDATE 7
+#define RI_PLAN_SETDEFAULT_ONDELETE 8
+#define RI_PLAN_SETDEFAULT_ONUPDATE 9
+
+#define MAX_QUOTED_NAME_LEN (NAMEDATALEN*2+3)
+#define MAX_QUOTED_REL_NAME_LEN (MAX_QUOTED_NAME_LEN*2)
+
+#define RIAttName(rel, attnum) NameStr(*attnumAttName(rel, attnum))
+#define RIAttType(rel, attnum) attnumTypeId(rel, attnum)
+#define RIAttCollation(rel, attnum) attnumCollationId(rel, attnum)
+
+#define RI_TRIGTYPE_INSERT 1
+#define RI_TRIGTYPE_UPDATE 2
+#define RI_TRIGTYPE_DELETE 3
+
+
+/*
+ * RI_ConstraintInfo
+ *
+ * Information extracted from an FK pg_constraint entry. This is cached in
+ * ri_constraint_cache.
+ */
+typedef struct RI_ConstraintInfo
+{
+ Oid constraint_id; /* OID of pg_constraint entry (hash key) */
+ bool valid; /* successfully initialized? */
+ Oid constraint_root_id; /* OID of topmost ancestor constraint;
+ * same as constraint_id if not inherited */
+ uint32 oidHashValue; /* hash value of constraint_id */
+ uint32 rootHashValue; /* hash value of constraint_root_id */
+ NameData conname; /* name of the FK constraint */
+ Oid pk_relid; /* referenced relation */
+ Oid fk_relid; /* referencing relation */
+ char confupdtype; /* foreign key's ON UPDATE action */
+ char confdeltype; /* foreign key's ON DELETE action */
+ int ndelsetcols; /* number of columns referenced in ON DELETE
+ * SET clause */
+ int16 confdelsetcols[RI_MAX_NUMKEYS]; /* attnums of cols to set on
+ * delete */
+ char confmatchtype; /* foreign key's match type */
+ int nkeys; /* number of key columns */
+ int16 pk_attnums[RI_MAX_NUMKEYS]; /* attnums of referenced cols */
+ int16 fk_attnums[RI_MAX_NUMKEYS]; /* attnums of referencing cols */
+ Oid pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */
+ Oid pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */
+ Oid ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */
+ dlist_node valid_link; /* Link in list of valid entries */
+} RI_ConstraintInfo;
+
+/*
+ * RI_QueryKey
+ *
+ * The key identifying a prepared SPI plan in our query hashtable
+ */
+typedef struct RI_QueryKey
+{
+ Oid constr_id; /* OID of pg_constraint entry */
+ int32 constr_queryno; /* query type ID, see RI_PLAN_XXX above */
+} RI_QueryKey;
+
+/*
+ * RI_QueryHashEntry
+ */
+typedef struct RI_QueryHashEntry
+{
+ RI_QueryKey key;
+ SPIPlanPtr plan;
+} RI_QueryHashEntry;
+
+/*
+ * RI_CompareKey
+ *
+ * The key identifying an entry showing how to compare two values
+ */
+typedef struct RI_CompareKey
+{
+ Oid eq_opr; /* the equality operator to apply */
+ Oid typeid; /* the data type to apply it to */
+} RI_CompareKey;
+
+/*
+ * RI_CompareHashEntry
+ */
+typedef struct RI_CompareHashEntry
+{
+ RI_CompareKey key;
+ bool valid; /* successfully initialized? */
+ FmgrInfo eq_opr_finfo; /* call info for equality fn */
+ FmgrInfo cast_func_finfo; /* in case we must coerce input */
+} RI_CompareHashEntry;
+
+
+/*
+ * Local data
+ */
+static HTAB *ri_constraint_cache = NULL;
+static HTAB *ri_query_cache = NULL;
+static HTAB *ri_compare_cache = NULL;
+static dlist_head ri_constraint_cache_valid_list;
+static int ri_constraint_cache_valid_count = 0;
+
+
+/*
+ * Local function prototypes
+ */
+static bool ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
+ TupleTableSlot *oldslot,
+ const RI_ConstraintInfo *riinfo);
+static Datum ri_restrict(TriggerData *trigdata, bool is_no_action);
+static Datum ri_set(TriggerData *trigdata, bool is_set_null, int tgkind);
+static void quoteOneName(char *buffer, const char *name);
+static void quoteRelationName(char *buffer, Relation rel);
+static void ri_GenerateQual(StringInfo buf,
+ const char *sep,
+ const char *leftop, Oid leftoptype,
+ Oid opoid,
+ const char *rightop, Oid rightoptype);
+static void ri_GenerateQualCollation(StringInfo buf, Oid collation);
+static int ri_NullCheck(TupleDesc tupdesc, TupleTableSlot *slot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk);
+static void ri_BuildQueryKey(RI_QueryKey *key,
+ const RI_ConstraintInfo *riinfo,
+ int32 constr_queryno);
+static bool ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk);
+static bool ri_AttributesEqual(Oid eq_opr, Oid typeid,
+ Datum oldvalue, Datum newvalue);
+
+static void ri_InitHashTables(void);
+static void InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue);
+static SPIPlanPtr ri_FetchPreparedPlan(RI_QueryKey *key);
+static void ri_HashPreparedPlan(RI_QueryKey *key, SPIPlanPtr plan);
+static RI_CompareHashEntry *ri_HashCompareOp(Oid eq_opr, Oid typeid);
+
+static void ri_CheckTrigger(FunctionCallInfo fcinfo, const char *funcname,
+ int tgkind);
+static const RI_ConstraintInfo *ri_FetchConstraintInfo(Trigger *trigger,
+ Relation trig_rel, bool rel_is_pk);
+static const RI_ConstraintInfo *ri_LoadConstraintInfo(Oid constraintOid);
+static Oid get_ri_constraint_root(Oid constrOid);
+static SPIPlanPtr ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes,
+ RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel);
+static bool ri_PerformCheck(const RI_ConstraintInfo *riinfo,
+ RI_QueryKey *qkey, SPIPlanPtr qplan,
+ Relation fk_rel, Relation pk_rel,
+ TupleTableSlot *oldslot, TupleTableSlot *newslot,
+ bool detectNewRows, int expect_OK);
+static void ri_ExtractValues(Relation rel, TupleTableSlot *slot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk,
+ Datum *vals, char *nulls);
+static void ri_ReportViolation(const RI_ConstraintInfo *riinfo,
+ Relation pk_rel, Relation fk_rel,
+ TupleTableSlot *violatorslot, TupleDesc tupdesc,
+ int queryno, bool partgone) pg_attribute_noreturn();
+
+
+/*
+ * RI_FKey_check -
+ *
+ * Check foreign key existence (combined for INSERT and UPDATE).
+ */
+static Datum
+RI_FKey_check(TriggerData *trigdata)
+{
+ const RI_ConstraintInfo *riinfo;
+ Relation fk_rel;
+ Relation pk_rel;
+ TupleTableSlot *newslot;
+ RI_QueryKey qkey;
+ SPIPlanPtr qplan;
+
+ riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+ trigdata->tg_relation, false);
+
+ if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
+ newslot = trigdata->tg_newslot;
+ else
+ newslot = trigdata->tg_trigslot;
+
+ /*
+ * We should not even consider checking the row if it is no longer valid,
+ * since it was either deleted (so the deferred check should be skipped)
+ * or updated (in which case only the latest version of the row should be
+ * checked). Test its liveness according to SnapshotSelf. We need pin
+ * and lock on the buffer to call HeapTupleSatisfiesVisibility. Caller
+ * should be holding pin, but not lock.
+ */
+ if (!table_tuple_satisfies_snapshot(trigdata->tg_relation, newslot, SnapshotSelf))
+ return PointerGetDatum(NULL);
+
+ /*
+ * Get the relation descriptors of the FK and PK tables.
+ *
+ * pk_rel is opened in RowShareLock mode since that's what our eventual
+ * SELECT FOR KEY SHARE will get on it.
+ */
+ fk_rel = trigdata->tg_relation;
+ pk_rel = table_open(riinfo->pk_relid, RowShareLock);
+
+ switch (ri_NullCheck(RelationGetDescr(fk_rel), newslot, riinfo, false))
+ {
+ case RI_KEYS_ALL_NULL:
+
+ /*
+ * No further check needed - an all-NULL key passes every type of
+ * foreign key constraint.
+ */
+ table_close(pk_rel, RowShareLock);
+ return PointerGetDatum(NULL);
+
+ case RI_KEYS_SOME_NULL:
+
+ /*
+ * This is the only case that differs between the three kinds of
+ * MATCH.
+ */
+ switch (riinfo->confmatchtype)
+ {
+ case FKCONSTR_MATCH_FULL:
+
+ /*
+ * Not allowed - MATCH FULL says either all or none of the
+ * attributes can be NULLs
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),
+ errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"",
+ RelationGetRelationName(fk_rel),
+ NameStr(riinfo->conname)),
+ errdetail("MATCH FULL does not allow mixing of null and nonnull key values."),
+ errtableconstraint(fk_rel,
+ NameStr(riinfo->conname))));
+ table_close(pk_rel, RowShareLock);
+ return PointerGetDatum(NULL);
+
+ case FKCONSTR_MATCH_SIMPLE:
+
+ /*
+ * MATCH SIMPLE - if ANY column is null, the key passes
+ * the constraint.
+ */
+ table_close(pk_rel, RowShareLock);
+ return PointerGetDatum(NULL);
+
+#ifdef NOT_USED
+ case FKCONSTR_MATCH_PARTIAL:
+
+ /*
+ * MATCH PARTIAL - all non-null columns must match. (not
+ * implemented, can be done by modifying the query below
+ * to only include non-null columns, or by writing a
+ * special version here)
+ */
+ break;
+#endif
+ }
+
+ case RI_KEYS_NONE_NULL:
+
+ /*
+ * Have a full qualified key - continue below for all three kinds
+ * of MATCH.
+ */
+ break;
+ }
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /* Fetch or prepare a saved plan for the real check */
+ ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ char pkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ Oid queryoids[RI_MAX_NUMKEYS];
+ const char *pk_only;
+
+ /* ----------
+ * The query string built is
+ * SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
+ * FOR KEY SHARE OF x
+ * The type id's for the $ parameters are those of the
+ * corresponding FK attributes.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(pkrelname, pk_rel);
+ appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+ pk_only, pkrelname);
+ querysep = "WHERE";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(pk_rel, riinfo->pk_attnums[i]));
+ sprintf(paramname, "$%d", i + 1);
+ ri_GenerateQual(&querybuf, querysep,
+ attname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ paramname, fk_type);
+ querysep = "AND";
+ queryoids[i] = fk_type;
+ }
+ appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * Now check that foreign key exists in PK table
+ *
+ * XXX detectNewRows must be true when a partitioned table is on the
+ * referenced side. The reason is that our snapshot must be fresh in
+ * order for the hack in find_inheritance_children() to work.
+ */
+ ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ NULL, newslot,
+ pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE,
+ SPI_OK_SELECT);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ table_close(pk_rel, RowShareLock);
+
+ return PointerGetDatum(NULL);
+}
+
+
+/*
+ * RI_FKey_check_ins -
+ *
+ * Check foreign key existence at insert event on FK table.
+ */
+Datum
+RI_FKey_check_ins(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_check_ins", RI_TRIGTYPE_INSERT);
+
+ /* Share code with UPDATE case. */
+ return RI_FKey_check((TriggerData *) fcinfo->context);
+}
+
+
+/*
+ * RI_FKey_check_upd -
+ *
+ * Check foreign key existence at update event on FK table.
+ */
+Datum
+RI_FKey_check_upd(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_check_upd", RI_TRIGTYPE_UPDATE);
+
+ /* Share code with INSERT case. */
+ return RI_FKey_check((TriggerData *) fcinfo->context);
+}
+
+
+/*
+ * ri_Check_Pk_Match
+ *
+ * Check to see if another PK row has been created that provides the same
+ * key values as the "oldslot" that's been modified or deleted in our trigger
+ * event. Returns true if a match is found in the PK table.
+ *
+ * We assume the caller checked that the oldslot contains no NULL key values,
+ * since otherwise a match is impossible.
+ */
+static bool
+ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
+ TupleTableSlot *oldslot,
+ const RI_ConstraintInfo *riinfo)
+{
+ SPIPlanPtr qplan;
+ RI_QueryKey qkey;
+ bool result;
+
+ /* Only called for non-null rows */
+ Assert(ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) == RI_KEYS_NONE_NULL);
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * Fetch or prepare a saved plan for checking PK table with values coming
+ * from a PK row
+ */
+ ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK_FROM_PK);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ char pkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ const char *pk_only;
+ Oid queryoids[RI_MAX_NUMKEYS];
+
+ /* ----------
+ * The query string built is
+ * SELECT 1 FROM [ONLY] <pktable> x WHERE pkatt1 = $1 [AND ...]
+ * FOR KEY SHARE OF x
+ * The type id's for the $ parameters are those of the
+ * PK attributes themselves.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(pkrelname, pk_rel);
+ appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+ pk_only, pkrelname);
+ querysep = "WHERE";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(pk_rel, riinfo->pk_attnums[i]));
+ sprintf(paramname, "$%d", i + 1);
+ ri_GenerateQual(&querybuf, querysep,
+ attname, pk_type,
+ riinfo->pp_eq_oprs[i],
+ paramname, pk_type);
+ querysep = "AND";
+ queryoids[i] = pk_type;
+ }
+ appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * We have a plan now. Run it.
+ */
+ result = ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ oldslot, NULL,
+ true, /* treat like update */
+ SPI_OK_SELECT);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ return result;
+}
+
+
+/*
+ * RI_FKey_noaction_del -
+ *
+ * Give an error and roll back the current transaction if the
+ * delete has resulted in a violation of the given referential
+ * integrity constraint.
+ */
+Datum
+RI_FKey_noaction_del(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_noaction_del", RI_TRIGTYPE_DELETE);
+
+ /* Share code with RESTRICT/UPDATE cases. */
+ return ri_restrict((TriggerData *) fcinfo->context, true);
+}
+
+/*
+ * RI_FKey_restrict_del -
+ *
+ * Restrict delete from PK table to rows unreferenced by foreign key.
+ *
+ * The SQL standard intends that this referential action occur exactly when
+ * the delete is performed, rather than after. This appears to be
+ * the only difference between "NO ACTION" and "RESTRICT". In Postgres
+ * we still implement this as an AFTER trigger, but it's non-deferrable.
+ */
+Datum
+RI_FKey_restrict_del(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_restrict_del", RI_TRIGTYPE_DELETE);
+
+ /* Share code with NO ACTION/UPDATE cases. */
+ return ri_restrict((TriggerData *) fcinfo->context, false);
+}
+
+/*
+ * RI_FKey_noaction_upd -
+ *
+ * Give an error and roll back the current transaction if the
+ * update has resulted in a violation of the given referential
+ * integrity constraint.
+ */
+Datum
+RI_FKey_noaction_upd(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_noaction_upd", RI_TRIGTYPE_UPDATE);
+
+ /* Share code with RESTRICT/DELETE cases. */
+ return ri_restrict((TriggerData *) fcinfo->context, true);
+}
+
+/*
+ * RI_FKey_restrict_upd -
+ *
+ * Restrict update of PK to rows unreferenced by foreign key.
+ *
+ * The SQL standard intends that this referential action occur exactly when
+ * the update is performed, rather than after. This appears to be
+ * the only difference between "NO ACTION" and "RESTRICT". In Postgres
+ * we still implement this as an AFTER trigger, but it's non-deferrable.
+ */
+Datum
+RI_FKey_restrict_upd(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_restrict_upd", RI_TRIGTYPE_UPDATE);
+
+ /* Share code with NO ACTION/DELETE cases. */
+ return ri_restrict((TriggerData *) fcinfo->context, false);
+}
+
+/*
+ * ri_restrict -
+ *
+ * Common code for ON DELETE RESTRICT, ON DELETE NO ACTION,
+ * ON UPDATE RESTRICT, and ON UPDATE NO ACTION.
+ */
+static Datum
+ri_restrict(TriggerData *trigdata, bool is_no_action)
+{
+ const RI_ConstraintInfo *riinfo;
+ Relation fk_rel;
+ Relation pk_rel;
+ TupleTableSlot *oldslot;
+ RI_QueryKey qkey;
+ SPIPlanPtr qplan;
+
+ riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+ trigdata->tg_relation, true);
+
+ /*
+ * Get the relation descriptors of the FK and PK tables and the old tuple.
+ *
+ * fk_rel is opened in RowShareLock mode since that's what our eventual
+ * SELECT FOR KEY SHARE will get on it.
+ */
+ fk_rel = table_open(riinfo->fk_relid, RowShareLock);
+ pk_rel = trigdata->tg_relation;
+ oldslot = trigdata->tg_trigslot;
+
+ /*
+ * If another PK row now exists providing the old key values, we should
+ * not do anything. However, this check should only be made in the NO
+ * ACTION case; in RESTRICT cases we don't wish to allow another row to be
+ * substituted.
+ */
+ if (is_no_action &&
+ ri_Check_Pk_Match(pk_rel, fk_rel, oldslot, riinfo))
+ {
+ table_close(fk_rel, RowShareLock);
+ return PointerGetDatum(NULL);
+ }
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * Fetch or prepare a saved plan for the restrict lookup (it's the same
+ * query for delete and update cases)
+ */
+ ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_RESTRICT);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ Oid queryoids[RI_MAX_NUMKEYS];
+ const char *fk_only;
+
+ /* ----------
+ * The query string built is
+ * SELECT 1 FROM [ONLY] <fktable> x WHERE $1 = fkatt1 [AND ...]
+ * FOR KEY SHARE OF x
+ * The type id's for the $ parameters are those of the
+ * corresponding PK attributes.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(fkrelname, fk_rel);
+ appendStringInfo(&querybuf, "SELECT 1 FROM %s%s x",
+ fk_only, fkrelname);
+ querysep = "WHERE";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ sprintf(paramname, "$%d", i + 1);
+ ri_GenerateQual(&querybuf, querysep,
+ paramname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ attname, fk_type);
+ if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ querysep = "AND";
+ queryoids[i] = pk_type;
+ }
+ appendStringInfoString(&querybuf, " FOR KEY SHARE OF x");
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * We have a plan now. Run it to check for existing references.
+ */
+ ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ oldslot, NULL,
+ true, /* must detect new rows */
+ SPI_OK_SELECT);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ table_close(fk_rel, RowShareLock);
+
+ return PointerGetDatum(NULL);
+}
+
+
+/*
+ * RI_FKey_cascade_del -
+ *
+ * Cascaded delete foreign key references at delete event on PK table.
+ */
+Datum
+RI_FKey_cascade_del(PG_FUNCTION_ARGS)
+{
+ TriggerData *trigdata = (TriggerData *) fcinfo->context;
+ const RI_ConstraintInfo *riinfo;
+ Relation fk_rel;
+ Relation pk_rel;
+ TupleTableSlot *oldslot;
+ RI_QueryKey qkey;
+ SPIPlanPtr qplan;
+
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_cascade_del", RI_TRIGTYPE_DELETE);
+
+ riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+ trigdata->tg_relation, true);
+
+ /*
+ * Get the relation descriptors of the FK and PK tables and the old tuple.
+ *
+ * fk_rel is opened in RowExclusiveLock mode since that's what our
+ * eventual DELETE will get on it.
+ */
+ fk_rel = table_open(riinfo->fk_relid, RowExclusiveLock);
+ pk_rel = trigdata->tg_relation;
+ oldslot = trigdata->tg_trigslot;
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /* Fetch or prepare a saved plan for the cascaded delete */
+ ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONDELETE);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ Oid queryoids[RI_MAX_NUMKEYS];
+ const char *fk_only;
+
+ /* ----------
+ * The query string built is
+ * DELETE FROM [ONLY] <fktable> WHERE $1 = fkatt1 [AND ...]
+ * The type id's for the $ parameters are those of the
+ * corresponding PK attributes.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(fkrelname, fk_rel);
+ appendStringInfo(&querybuf, "DELETE FROM %s%s",
+ fk_only, fkrelname);
+ querysep = "WHERE";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ sprintf(paramname, "$%d", i + 1);
+ ri_GenerateQual(&querybuf, querysep,
+ paramname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ attname, fk_type);
+ if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ querysep = "AND";
+ queryoids[i] = pk_type;
+ }
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * We have a plan now. Build up the arguments from the key values in the
+ * deleted PK tuple and delete the referencing rows
+ */
+ ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ oldslot, NULL,
+ true, /* must detect new rows */
+ SPI_OK_DELETE);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ table_close(fk_rel, RowExclusiveLock);
+
+ return PointerGetDatum(NULL);
+}
+
+
+/*
+ * RI_FKey_cascade_upd -
+ *
+ * Cascaded update foreign key references at update event on PK table.
+ */
+Datum
+RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
+{
+ TriggerData *trigdata = (TriggerData *) fcinfo->context;
+ const RI_ConstraintInfo *riinfo;
+ Relation fk_rel;
+ Relation pk_rel;
+ TupleTableSlot *newslot;
+ TupleTableSlot *oldslot;
+ RI_QueryKey qkey;
+ SPIPlanPtr qplan;
+
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_cascade_upd", RI_TRIGTYPE_UPDATE);
+
+ riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+ trigdata->tg_relation, true);
+
+ /*
+ * Get the relation descriptors of the FK and PK tables and the new and
+ * old tuple.
+ *
+ * fk_rel is opened in RowExclusiveLock mode since that's what our
+ * eventual UPDATE will get on it.
+ */
+ fk_rel = table_open(riinfo->fk_relid, RowExclusiveLock);
+ pk_rel = trigdata->tg_relation;
+ newslot = trigdata->tg_newslot;
+ oldslot = trigdata->tg_trigslot;
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /* Fetch or prepare a saved plan for the cascaded update */
+ ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONUPDATE);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ StringInfoData qualbuf;
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ const char *qualsep;
+ Oid queryoids[RI_MAX_NUMKEYS * 2];
+ const char *fk_only;
+
+ /* ----------
+ * The query string built is
+ * UPDATE [ONLY] <fktable> SET fkatt1 = $1 [, ...]
+ * WHERE $n = fkatt1 [AND ...]
+ * The type id's for the $ parameters are those of the
+ * corresponding PK attributes. Note that we are assuming
+ * there is an assignment cast from the PK to the FK type;
+ * else the parser will fail.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ initStringInfo(&qualbuf);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(fkrelname, fk_rel);
+ appendStringInfo(&querybuf, "UPDATE %s%s SET",
+ fk_only, fkrelname);
+ querysep = "";
+ qualsep = "WHERE";
+ for (int i = 0, j = riinfo->nkeys; i < riinfo->nkeys; i++, j++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ appendStringInfo(&querybuf,
+ "%s %s = $%d",
+ querysep, attname, i + 1);
+ sprintf(paramname, "$%d", j + 1);
+ ri_GenerateQual(&qualbuf, qualsep,
+ paramname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ attname, fk_type);
+ if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ querysep = ",";
+ qualsep = "AND";
+ queryoids[i] = pk_type;
+ queryoids[j] = pk_type;
+ }
+ appendBinaryStringInfo(&querybuf, qualbuf.data, qualbuf.len);
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys * 2, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * We have a plan now. Run it to update the existing references.
+ */
+ ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ oldslot, newslot,
+ true, /* must detect new rows */
+ SPI_OK_UPDATE);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ table_close(fk_rel, RowExclusiveLock);
+
+ return PointerGetDatum(NULL);
+}
+
+
+/*
+ * RI_FKey_setnull_del -
+ *
+ * Set foreign key references to NULL values at delete event on PK table.
+ */
+Datum
+RI_FKey_setnull_del(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_setnull_del", RI_TRIGTYPE_DELETE);
+
+ /* Share code with UPDATE case */
+ return ri_set((TriggerData *) fcinfo->context, true, RI_TRIGTYPE_DELETE);
+}
+
+/*
+ * RI_FKey_setnull_upd -
+ *
+ * Set foreign key references to NULL at update event on PK table.
+ */
+Datum
+RI_FKey_setnull_upd(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_setnull_upd", RI_TRIGTYPE_UPDATE);
+
+ /* Share code with DELETE case */
+ return ri_set((TriggerData *) fcinfo->context, true, RI_TRIGTYPE_UPDATE);
+}
+
+/*
+ * RI_FKey_setdefault_del -
+ *
+ * Set foreign key references to defaults at delete event on PK table.
+ */
+Datum
+RI_FKey_setdefault_del(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_setdefault_del", RI_TRIGTYPE_DELETE);
+
+ /* Share code with UPDATE case */
+ return ri_set((TriggerData *) fcinfo->context, false, RI_TRIGTYPE_DELETE);
+}
+
+/*
+ * RI_FKey_setdefault_upd -
+ *
+ * Set foreign key references to defaults at update event on PK table.
+ */
+Datum
+RI_FKey_setdefault_upd(PG_FUNCTION_ARGS)
+{
+ /* Check that this is a valid trigger call on the right time and event. */
+ ri_CheckTrigger(fcinfo, "RI_FKey_setdefault_upd", RI_TRIGTYPE_UPDATE);
+
+ /* Share code with DELETE case */
+ return ri_set((TriggerData *) fcinfo->context, false, RI_TRIGTYPE_UPDATE);
+}
+
+/*
+ * ri_set -
+ *
+ * Common code for ON DELETE SET NULL, ON DELETE SET DEFAULT, ON UPDATE SET
+ * NULL, and ON UPDATE SET DEFAULT.
+ */
+static Datum
+ri_set(TriggerData *trigdata, bool is_set_null, int tgkind)
+{
+ const RI_ConstraintInfo *riinfo;
+ Relation fk_rel;
+ Relation pk_rel;
+ TupleTableSlot *oldslot;
+ RI_QueryKey qkey;
+ SPIPlanPtr qplan;
+ int32 queryno;
+
+ riinfo = ri_FetchConstraintInfo(trigdata->tg_trigger,
+ trigdata->tg_relation, true);
+
+ /*
+ * Get the relation descriptors of the FK and PK tables and the old tuple.
+ *
+ * fk_rel is opened in RowExclusiveLock mode since that's what our
+ * eventual UPDATE will get on it.
+ */
+ fk_rel = table_open(riinfo->fk_relid, RowExclusiveLock);
+ pk_rel = trigdata->tg_relation;
+ oldslot = trigdata->tg_trigslot;
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * Fetch or prepare a saved plan for the trigger.
+ */
+ switch (tgkind)
+ {
+ case RI_TRIGTYPE_UPDATE:
+ queryno = is_set_null
+ ? RI_PLAN_SETNULL_ONUPDATE
+ : RI_PLAN_SETDEFAULT_ONUPDATE;
+ break;
+ case RI_TRIGTYPE_DELETE:
+ queryno = is_set_null
+ ? RI_PLAN_SETNULL_ONDELETE
+ : RI_PLAN_SETDEFAULT_ONDELETE;
+ break;
+ default:
+ elog(ERROR, "invalid tgkind passed to ri_set");
+ }
+
+ ri_BuildQueryKey(&qkey, riinfo, queryno);
+
+ if ((qplan = ri_FetchPreparedPlan(&qkey)) == NULL)
+ {
+ StringInfoData querybuf;
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char attname[MAX_QUOTED_NAME_LEN];
+ char paramname[16];
+ const char *querysep;
+ const char *qualsep;
+ Oid queryoids[RI_MAX_NUMKEYS];
+ const char *fk_only;
+ int num_cols_to_set;
+ const int16 *set_cols;
+
+ switch (tgkind)
+ {
+ case RI_TRIGTYPE_UPDATE:
+ num_cols_to_set = riinfo->nkeys;
+ set_cols = riinfo->fk_attnums;
+ break;
+ case RI_TRIGTYPE_DELETE:
+
+ /*
+ * If confdelsetcols are present, then we only update the
+ * columns specified in that array, otherwise we update all
+ * the referencing columns.
+ */
+ if (riinfo->ndelsetcols != 0)
+ {
+ num_cols_to_set = riinfo->ndelsetcols;
+ set_cols = riinfo->confdelsetcols;
+ }
+ else
+ {
+ num_cols_to_set = riinfo->nkeys;
+ set_cols = riinfo->fk_attnums;
+ }
+ break;
+ default:
+ elog(ERROR, "invalid tgkind passed to ri_set");
+ }
+
+ /* ----------
+ * The query string built is
+ * UPDATE [ONLY] <fktable> SET fkatt1 = {NULL|DEFAULT} [, ...]
+ * WHERE $1 = fkatt1 [AND ...]
+ * The type id's for the $ parameters are those of the
+ * corresponding PK attributes.
+ * ----------
+ */
+ initStringInfo(&querybuf);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ quoteRelationName(fkrelname, fk_rel);
+ appendStringInfo(&querybuf, "UPDATE %s%s SET",
+ fk_only, fkrelname);
+
+ /*
+ * Add assignment clauses
+ */
+ querysep = "";
+ for (int i = 0; i < num_cols_to_set; i++)
+ {
+ quoteOneName(attname, RIAttName(fk_rel, set_cols[i]));
+ appendStringInfo(&querybuf,
+ "%s %s = %s",
+ querysep, attname,
+ is_set_null ? "NULL" : "DEFAULT");
+ querysep = ",";
+ }
+
+ /*
+ * Add WHERE clause
+ */
+ qualsep = "WHERE";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(attname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+
+ sprintf(paramname, "$%d", i + 1);
+ ri_GenerateQual(&querybuf, qualsep,
+ paramname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ attname, fk_type);
+ if (pk_coll != fk_coll && !get_collation_isdeterministic(pk_coll))
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ qualsep = "AND";
+ queryoids[i] = pk_type;
+ }
+
+ /* Prepare and save the plan */
+ qplan = ri_PlanCheck(querybuf.data, riinfo->nkeys, queryoids,
+ &qkey, fk_rel, pk_rel);
+ }
+
+ /*
+ * We have a plan now. Run it to update the existing references.
+ */
+ ri_PerformCheck(riinfo, &qkey, qplan,
+ fk_rel, pk_rel,
+ oldslot, NULL,
+ true, /* must detect new rows */
+ SPI_OK_UPDATE);
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ table_close(fk_rel, RowExclusiveLock);
+
+ if (is_set_null)
+ return PointerGetDatum(NULL);
+ else
+ {
+ /*
+ * If we just deleted or updated the PK row whose key was equal to the
+ * FK columns' default values, and a referencing row exists in the FK
+ * table, we would have updated that row to the same values it already
+ * had --- and RI_FKey_fk_upd_check_required would hence believe no
+ * check is necessary. So we need to do another lookup now and in
+ * case a reference still exists, abort the operation. That is
+ * already implemented in the NO ACTION trigger, so just run it. (This
+ * recheck is only needed in the SET DEFAULT case, since CASCADE would
+ * remove such rows in case of a DELETE operation or would change the
+ * FK key values in case of an UPDATE, while SET NULL is certain to
+ * result in rows that satisfy the FK constraint.)
+ */
+ return ri_restrict(trigdata, true);
+ }
+}
+
+
+/*
+ * RI_FKey_pk_upd_check_required -
+ *
+ * Check if we really need to fire the RI trigger for an update or delete to a PK
+ * relation. This is called by the AFTER trigger queue manager to see if
+ * it can skip queuing an instance of an RI trigger. Returns true if the
+ * trigger must be fired, false if we can prove the constraint will still
+ * be satisfied.
+ *
+ * newslot will be NULL if this is called for a delete.
+ */
+bool
+RI_FKey_pk_upd_check_required(Trigger *trigger, Relation pk_rel,
+ TupleTableSlot *oldslot, TupleTableSlot *newslot)
+{
+ const RI_ConstraintInfo *riinfo;
+
+ riinfo = ri_FetchConstraintInfo(trigger, pk_rel, true);
+
+ /*
+ * If any old key value is NULL, the row could not have been referenced by
+ * an FK row, so no check is needed.
+ */
+ if (ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) != RI_KEYS_NONE_NULL)
+ return false;
+
+ /* If all old and new key values are equal, no check is needed */
+ if (newslot && ri_KeysEqual(pk_rel, oldslot, newslot, riinfo, true))
+ return false;
+
+ /* Else we need to fire the trigger. */
+ return true;
+}
+
+/*
+ * RI_FKey_fk_upd_check_required -
+ *
+ * Check if we really need to fire the RI trigger for an update to an FK
+ * relation. This is called by the AFTER trigger queue manager to see if
+ * it can skip queuing an instance of an RI trigger. Returns true if the
+ * trigger must be fired, false if we can prove the constraint will still
+ * be satisfied.
+ */
+bool
+RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel,
+ TupleTableSlot *oldslot, TupleTableSlot *newslot)
+{
+ const RI_ConstraintInfo *riinfo;
+ int ri_nullcheck;
+ Datum xminDatum;
+ TransactionId xmin;
+ bool isnull;
+
+ /*
+ * AfterTriggerSaveEvent() handles things such that this function is never
+ * called for partitioned tables.
+ */
+ Assert(fk_rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE);
+
+ riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
+
+ ri_nullcheck = ri_NullCheck(RelationGetDescr(fk_rel), newslot, riinfo, false);
+
+ /*
+ * If all new key values are NULL, the row satisfies the constraint, so no
+ * check is needed.
+ */
+ if (ri_nullcheck == RI_KEYS_ALL_NULL)
+ return false;
+
+ /*
+ * If some new key values are NULL, the behavior depends on the match
+ * type.
+ */
+ else if (ri_nullcheck == RI_KEYS_SOME_NULL)
+ {
+ switch (riinfo->confmatchtype)
+ {
+ case FKCONSTR_MATCH_SIMPLE:
+
+ /*
+ * If any new key value is NULL, the row must satisfy the
+ * constraint, so no check is needed.
+ */
+ return false;
+
+ case FKCONSTR_MATCH_PARTIAL:
+
+ /*
+ * Don't know, must run full check.
+ */
+ break;
+
+ case FKCONSTR_MATCH_FULL:
+
+ /*
+ * If some new key values are NULL, the row fails the
+ * constraint. We must not throw error here, because the row
+ * might get invalidated before the constraint is to be
+ * checked, but we should queue the event to apply the check
+ * later.
+ */
+ return true;
+ }
+ }
+
+ /*
+ * Continues here for no new key values are NULL, or we couldn't decide
+ * yet.
+ */
+
+ /*
+ * If the original row was inserted by our own transaction, we must fire
+ * the trigger whether or not the keys are equal. This is because our
+ * UPDATE will invalidate the INSERT so that the INSERT RI trigger will
+ * not do anything; so we had better do the UPDATE check. (We could skip
+ * this if we knew the INSERT trigger already fired, but there is no easy
+ * way to know that.)
+ */
+ xminDatum = slot_getsysattr(oldslot, MinTransactionIdAttributeNumber, &isnull);
+ Assert(!isnull);
+ xmin = DatumGetTransactionId(xminDatum);
+ if (TransactionIdIsCurrentTransactionId(xmin))
+ return true;
+
+ /* If all old and new key values are equal, no check is needed */
+ if (ri_KeysEqual(fk_rel, oldslot, newslot, riinfo, false))
+ return false;
+
+ /* Else we need to fire the trigger. */
+ return true;
+}
+
+/*
+ * RI_Initial_Check -
+ *
+ * Check an entire table for non-matching values using a single query.
+ * This is not a trigger procedure, but is called during ALTER TABLE
+ * ADD FOREIGN KEY to validate the initial table contents.
+ *
+ * We expect that the caller has made provision to prevent any problems
+ * caused by concurrent actions. This could be either by locking rel and
+ * pkrel at ShareRowExclusiveLock or higher, or by otherwise ensuring
+ * that triggers implementing the checks are already active.
+ * Hence, we do not need to lock individual rows for the check.
+ *
+ * If the check fails because the current user doesn't have permissions
+ * to read both tables, return false to let our caller know that they will
+ * need to do something else to check the constraint.
+ */
+bool
+RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
+{
+ const RI_ConstraintInfo *riinfo;
+ StringInfoData querybuf;
+ char pkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char pkattname[MAX_QUOTED_NAME_LEN + 3];
+ char fkattname[MAX_QUOTED_NAME_LEN + 3];
+ RangeTblEntry *pkrte;
+ RangeTblEntry *fkrte;
+ const char *sep;
+ const char *fk_only;
+ const char *pk_only;
+ int save_nestlevel;
+ char workmembuf[32];
+ int spi_result;
+ SPIPlanPtr qplan;
+
+ riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
+
+ /*
+ * Check to make sure current user has enough permissions to do the test
+ * query. (If not, caller can fall back to the trigger method, which
+ * works because it changes user IDs on the fly.)
+ *
+ * XXX are there any other show-stopper conditions to check?
+ */
+ pkrte = makeNode(RangeTblEntry);
+ pkrte->rtekind = RTE_RELATION;
+ pkrte->relid = RelationGetRelid(pk_rel);
+ pkrte->relkind = pk_rel->rd_rel->relkind;
+ pkrte->rellockmode = AccessShareLock;
+ pkrte->requiredPerms = ACL_SELECT;
+
+ fkrte = makeNode(RangeTblEntry);
+ fkrte->rtekind = RTE_RELATION;
+ fkrte->relid = RelationGetRelid(fk_rel);
+ fkrte->relkind = fk_rel->rd_rel->relkind;
+ fkrte->rellockmode = AccessShareLock;
+ fkrte->requiredPerms = ACL_SELECT;
+
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ int attno;
+
+ attno = riinfo->pk_attnums[i] - FirstLowInvalidHeapAttributeNumber;
+ pkrte->selectedCols = bms_add_member(pkrte->selectedCols, attno);
+
+ attno = riinfo->fk_attnums[i] - FirstLowInvalidHeapAttributeNumber;
+ fkrte->selectedCols = bms_add_member(fkrte->selectedCols, attno);
+ }
+
+ if (!ExecCheckRTPerms(list_make2(fkrte, pkrte), false))
+ return false;
+
+ /*
+ * Also punt if RLS is enabled on either table unless this role has the
+ * bypassrls right or is the table owner of the table(s) involved which
+ * have RLS enabled.
+ */
+ if (!has_bypassrls_privilege(GetUserId()) &&
+ ((pk_rel->rd_rel->relrowsecurity &&
+ !pg_class_ownercheck(pkrte->relid, GetUserId())) ||
+ (fk_rel->rd_rel->relrowsecurity &&
+ !pg_class_ownercheck(fkrte->relid, GetUserId()))))
+ return false;
+
+ /*----------
+ * The query string built is:
+ * SELECT fk.keycols FROM [ONLY] relname fk
+ * LEFT OUTER JOIN [ONLY] pkrelname pk
+ * ON (pk.pkkeycol1=fk.keycol1 [AND ...])
+ * WHERE pk.pkkeycol1 IS NULL AND
+ * For MATCH SIMPLE:
+ * (fk.keycol1 IS NOT NULL [AND ...])
+ * For MATCH FULL:
+ * (fk.keycol1 IS NOT NULL [OR ...])
+ *
+ * We attach COLLATE clauses to the operators when comparing columns
+ * that have different collations.
+ *----------
+ */
+ initStringInfo(&querybuf);
+ appendStringInfoString(&querybuf, "SELECT ");
+ sep = "";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ quoteOneName(fkattname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ sep = ", ";
+ }
+
+ quoteRelationName(pkrelname, pk_rel);
+ quoteRelationName(fkrelname, fk_rel);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ pk_only = pk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ appendStringInfo(&querybuf,
+ " FROM %s%s fk LEFT OUTER JOIN %s%s pk ON",
+ fk_only, fkrelname, pk_only, pkrelname);
+
+ strcpy(pkattname, "pk.");
+ strcpy(fkattname, "fk.");
+ sep = "(";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(pkattname + 3,
+ RIAttName(pk_rel, riinfo->pk_attnums[i]));
+ quoteOneName(fkattname + 3,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ ri_GenerateQual(&querybuf, sep,
+ pkattname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ fkattname, fk_type);
+ if (pk_coll != fk_coll)
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ sep = "AND";
+ }
+
+ /*
+ * It's sufficient to test any one pk attribute for null to detect a join
+ * failure.
+ */
+ quoteOneName(pkattname, RIAttName(pk_rel, riinfo->pk_attnums[0]));
+ appendStringInfo(&querybuf, ") WHERE pk.%s IS NULL AND (", pkattname);
+
+ sep = "";
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ appendStringInfo(&querybuf,
+ "%sfk.%s IS NOT NULL",
+ sep, fkattname);
+ switch (riinfo->confmatchtype)
+ {
+ case FKCONSTR_MATCH_SIMPLE:
+ sep = " AND ";
+ break;
+ case FKCONSTR_MATCH_FULL:
+ sep = " OR ";
+ break;
+ }
+ }
+ appendStringInfoChar(&querybuf, ')');
+
+ /*
+ * Temporarily increase work_mem so that the check query can be executed
+ * more efficiently. It seems okay to do this because the query is simple
+ * enough to not use a multiple of work_mem, and one typically would not
+ * have many large foreign-key validations happening concurrently. So
+ * this seems to meet the criteria for being considered a "maintenance"
+ * operation, and accordingly we use maintenance_work_mem. However, we
+ * must also set hash_mem_multiplier to 1, since it is surely not okay to
+ * let that get applied to the maintenance_work_mem value.
+ *
+ * We use the equivalent of a function SET option to allow the setting to
+ * persist for exactly the duration of the check query. guc.c also takes
+ * care of undoing the setting on error.
+ */
+ save_nestlevel = NewGUCNestLevel();
+
+ snprintf(workmembuf, sizeof(workmembuf), "%d", maintenance_work_mem);
+ (void) set_config_option("work_mem", workmembuf,
+ PGC_USERSET, PGC_S_SESSION,
+ GUC_ACTION_SAVE, true, 0, false);
+ (void) set_config_option("hash_mem_multiplier", "1",
+ PGC_USERSET, PGC_S_SESSION,
+ GUC_ACTION_SAVE, true, 0, false);
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * Generate the plan. We don't need to cache it, and there are no
+ * arguments to the plan.
+ */
+ qplan = SPI_prepare(querybuf.data, 0, NULL);
+
+ if (qplan == NULL)
+ elog(ERROR, "SPI_prepare returned %s for %s",
+ SPI_result_code_string(SPI_result), querybuf.data);
+
+ /*
+ * Run the plan. For safety we force a current snapshot to be used. (In
+ * transaction-snapshot mode, this arguably violates transaction isolation
+ * rules, but we really haven't got much choice.) We don't need to
+ * register the snapshot, because SPI_execute_snapshot will see to it. We
+ * need at most one tuple returned, so pass limit = 1.
+ */
+ spi_result = SPI_execute_snapshot(qplan,
+ NULL, NULL,
+ GetLatestSnapshot(),
+ InvalidSnapshot,
+ true, false, 1);
+
+ /* Check result */
+ if (spi_result != SPI_OK_SELECT)
+ elog(ERROR, "SPI_execute_snapshot returned %s", SPI_result_code_string(spi_result));
+
+ /* Did we find a tuple violating the constraint? */
+ if (SPI_processed > 0)
+ {
+ TupleTableSlot *slot;
+ HeapTuple tuple = SPI_tuptable->vals[0];
+ TupleDesc tupdesc = SPI_tuptable->tupdesc;
+ RI_ConstraintInfo fake_riinfo;
+
+ slot = MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual);
+
+ heap_deform_tuple(tuple, tupdesc,
+ slot->tts_values, slot->tts_isnull);
+ ExecStoreVirtualTuple(slot);
+
+ /*
+ * The columns to look at in the result tuple are 1..N, not whatever
+ * they are in the fk_rel. Hack up riinfo so that the subroutines
+ * called here will behave properly.
+ *
+ * In addition to this, we have to pass the correct tupdesc to
+ * ri_ReportViolation, overriding its normal habit of using the pk_rel
+ * or fk_rel's tupdesc.
+ */
+ memcpy(&fake_riinfo, riinfo, sizeof(RI_ConstraintInfo));
+ for (int i = 0; i < fake_riinfo.nkeys; i++)
+ fake_riinfo.fk_attnums[i] = i + 1;
+
+ /*
+ * If it's MATCH FULL, and there are any nulls in the FK keys,
+ * complain about that rather than the lack of a match. MATCH FULL
+ * disallows partially-null FK rows.
+ */
+ if (fake_riinfo.confmatchtype == FKCONSTR_MATCH_FULL &&
+ ri_NullCheck(tupdesc, slot, &fake_riinfo, false) != RI_KEYS_NONE_NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),
+ errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"",
+ RelationGetRelationName(fk_rel),
+ NameStr(fake_riinfo.conname)),
+ errdetail("MATCH FULL does not allow mixing of null and nonnull key values."),
+ errtableconstraint(fk_rel,
+ NameStr(fake_riinfo.conname))));
+
+ /*
+ * We tell ri_ReportViolation we were doing the RI_PLAN_CHECK_LOOKUPPK
+ * query, which isn't true, but will cause it to use
+ * fake_riinfo.fk_attnums as we need.
+ */
+ ri_ReportViolation(&fake_riinfo,
+ pk_rel, fk_rel,
+ slot, tupdesc,
+ RI_PLAN_CHECK_LOOKUPPK, false);
+
+ ExecDropSingleTupleTableSlot(slot);
+ }
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ /*
+ * Restore work_mem and hash_mem_multiplier.
+ */
+ AtEOXact_GUC(true, save_nestlevel);
+
+ return true;
+}
+
+/*
+ * RI_PartitionRemove_Check -
+ *
+ * Verify no referencing values exist, when a partition is detached on
+ * the referenced side of a foreign key constraint.
+ */
+void
+RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
+{
+ const RI_ConstraintInfo *riinfo;
+ StringInfoData querybuf;
+ char *constraintDef;
+ char pkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char fkrelname[MAX_QUOTED_REL_NAME_LEN];
+ char pkattname[MAX_QUOTED_NAME_LEN + 3];
+ char fkattname[MAX_QUOTED_NAME_LEN + 3];
+ const char *sep;
+ const char *fk_only;
+ int save_nestlevel;
+ char workmembuf[32];
+ int spi_result;
+ SPIPlanPtr qplan;
+ int i;
+
+ riinfo = ri_FetchConstraintInfo(trigger, fk_rel, false);
+
+ /*
+ * We don't check permissions before displaying the error message, on the
+ * assumption that the user detaching the partition must have enough
+ * privileges to examine the table contents anyhow.
+ */
+
+ /*----------
+ * The query string built is:
+ * SELECT fk.keycols FROM [ONLY] relname fk
+ * JOIN pkrelname pk
+ * ON (pk.pkkeycol1=fk.keycol1 [AND ...])
+ * WHERE (<partition constraint>) AND
+ * For MATCH SIMPLE:
+ * (fk.keycol1 IS NOT NULL [AND ...])
+ * For MATCH FULL:
+ * (fk.keycol1 IS NOT NULL [OR ...])
+ *
+ * We attach COLLATE clauses to the operators when comparing columns
+ * that have different collations.
+ *----------
+ */
+ initStringInfo(&querybuf);
+ appendStringInfoString(&querybuf, "SELECT ");
+ sep = "";
+ for (i = 0; i < riinfo->nkeys; i++)
+ {
+ quoteOneName(fkattname,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ appendStringInfo(&querybuf, "%sfk.%s", sep, fkattname);
+ sep = ", ";
+ }
+
+ quoteRelationName(pkrelname, pk_rel);
+ quoteRelationName(fkrelname, fk_rel);
+ fk_only = fk_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE ?
+ "" : "ONLY ";
+ appendStringInfo(&querybuf,
+ " FROM %s%s fk JOIN %s pk ON",
+ fk_only, fkrelname, pkrelname);
+ strcpy(pkattname, "pk.");
+ strcpy(fkattname, "fk.");
+ sep = "(";
+ for (i = 0; i < riinfo->nkeys; i++)
+ {
+ Oid pk_type = RIAttType(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_type = RIAttType(fk_rel, riinfo->fk_attnums[i]);
+ Oid pk_coll = RIAttCollation(pk_rel, riinfo->pk_attnums[i]);
+ Oid fk_coll = RIAttCollation(fk_rel, riinfo->fk_attnums[i]);
+
+ quoteOneName(pkattname + 3,
+ RIAttName(pk_rel, riinfo->pk_attnums[i]));
+ quoteOneName(fkattname + 3,
+ RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ ri_GenerateQual(&querybuf, sep,
+ pkattname, pk_type,
+ riinfo->pf_eq_oprs[i],
+ fkattname, fk_type);
+ if (pk_coll != fk_coll)
+ ri_GenerateQualCollation(&querybuf, pk_coll);
+ sep = "AND";
+ }
+
+ /*
+ * Start the WHERE clause with the partition constraint (except if this is
+ * the default partition and there's no other partition, because the
+ * partition constraint is the empty string in that case.)
+ */
+ constraintDef = pg_get_partconstrdef_string(RelationGetRelid(pk_rel), "pk");
+ if (constraintDef && constraintDef[0] != '\0')
+ appendStringInfo(&querybuf, ") WHERE %s AND (",
+ constraintDef);
+ else
+ appendStringInfoString(&querybuf, ") WHERE (");
+
+ sep = "";
+ for (i = 0; i < riinfo->nkeys; i++)
+ {
+ quoteOneName(fkattname, RIAttName(fk_rel, riinfo->fk_attnums[i]));
+ appendStringInfo(&querybuf,
+ "%sfk.%s IS NOT NULL",
+ sep, fkattname);
+ switch (riinfo->confmatchtype)
+ {
+ case FKCONSTR_MATCH_SIMPLE:
+ sep = " AND ";
+ break;
+ case FKCONSTR_MATCH_FULL:
+ sep = " OR ";
+ break;
+ }
+ }
+ appendStringInfoChar(&querybuf, ')');
+
+ /*
+ * Temporarily increase work_mem so that the check query can be executed
+ * more efficiently. It seems okay to do this because the query is simple
+ * enough to not use a multiple of work_mem, and one typically would not
+ * have many large foreign-key validations happening concurrently. So
+ * this seems to meet the criteria for being considered a "maintenance"
+ * operation, and accordingly we use maintenance_work_mem. However, we
+ * must also set hash_mem_multiplier to 1, since it is surely not okay to
+ * let that get applied to the maintenance_work_mem value.
+ *
+ * We use the equivalent of a function SET option to allow the setting to
+ * persist for exactly the duration of the check query. guc.c also takes
+ * care of undoing the setting on error.
+ */
+ save_nestlevel = NewGUCNestLevel();
+
+ snprintf(workmembuf, sizeof(workmembuf), "%d", maintenance_work_mem);
+ (void) set_config_option("work_mem", workmembuf,
+ PGC_USERSET, PGC_S_SESSION,
+ GUC_ACTION_SAVE, true, 0, false);
+ (void) set_config_option("hash_mem_multiplier", "1",
+ PGC_USERSET, PGC_S_SESSION,
+ GUC_ACTION_SAVE, true, 0, false);
+
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * Generate the plan. We don't need to cache it, and there are no
+ * arguments to the plan.
+ */
+ qplan = SPI_prepare(querybuf.data, 0, NULL);
+
+ if (qplan == NULL)
+ elog(ERROR, "SPI_prepare returned %s for %s",
+ SPI_result_code_string(SPI_result), querybuf.data);
+
+ /*
+ * Run the plan. For safety we force a current snapshot to be used. (In
+ * transaction-snapshot mode, this arguably violates transaction isolation
+ * rules, but we really haven't got much choice.) We don't need to
+ * register the snapshot, because SPI_execute_snapshot will see to it. We
+ * need at most one tuple returned, so pass limit = 1.
+ */
+ spi_result = SPI_execute_snapshot(qplan,
+ NULL, NULL,
+ GetLatestSnapshot(),
+ InvalidSnapshot,
+ true, false, 1);
+
+ /* Check result */
+ if (spi_result != SPI_OK_SELECT)
+ elog(ERROR, "SPI_execute_snapshot returned %s", SPI_result_code_string(spi_result));
+
+ /* Did we find a tuple that would violate the constraint? */
+ if (SPI_processed > 0)
+ {
+ TupleTableSlot *slot;
+ HeapTuple tuple = SPI_tuptable->vals[0];
+ TupleDesc tupdesc = SPI_tuptable->tupdesc;
+ RI_ConstraintInfo fake_riinfo;
+
+ slot = MakeSingleTupleTableSlot(tupdesc, &TTSOpsVirtual);
+
+ heap_deform_tuple(tuple, tupdesc,
+ slot->tts_values, slot->tts_isnull);
+ ExecStoreVirtualTuple(slot);
+
+ /*
+ * The columns to look at in the result tuple are 1..N, not whatever
+ * they are in the fk_rel. Hack up riinfo so that ri_ReportViolation
+ * will behave properly.
+ *
+ * In addition to this, we have to pass the correct tupdesc to
+ * ri_ReportViolation, overriding its normal habit of using the pk_rel
+ * or fk_rel's tupdesc.
+ */
+ memcpy(&fake_riinfo, riinfo, sizeof(RI_ConstraintInfo));
+ for (i = 0; i < fake_riinfo.nkeys; i++)
+ fake_riinfo.pk_attnums[i] = i + 1;
+
+ ri_ReportViolation(&fake_riinfo, pk_rel, fk_rel,
+ slot, tupdesc, 0, true);
+ }
+
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ /*
+ * Restore work_mem and hash_mem_multiplier.
+ */
+ AtEOXact_GUC(true, save_nestlevel);
+}
+
+
+/* ----------
+ * Local functions below
+ * ----------
+ */
+
+
+/*
+ * quoteOneName --- safely quote a single SQL name
+ *
+ * buffer must be MAX_QUOTED_NAME_LEN long (includes room for \0)
+ */
+static void
+quoteOneName(char *buffer, const char *name)
+{
+ /* Rather than trying to be smart, just always quote it. */
+ *buffer++ = '"';
+ while (*name)
+ {
+ if (*name == '"')
+ *buffer++ = '"';
+ *buffer++ = *name++;
+ }
+ *buffer++ = '"';
+ *buffer = '\0';
+}
+
+/*
+ * quoteRelationName --- safely quote a fully qualified relation name
+ *
+ * buffer must be MAX_QUOTED_REL_NAME_LEN long (includes room for \0)
+ */
+static void
+quoteRelationName(char *buffer, Relation rel)
+{
+ quoteOneName(buffer, get_namespace_name(RelationGetNamespace(rel)));
+ buffer += strlen(buffer);
+ *buffer++ = '.';
+ quoteOneName(buffer, RelationGetRelationName(rel));
+}
+
+/*
+ * ri_GenerateQual --- generate a WHERE clause equating two variables
+ *
+ * This basically appends " sep leftop op rightop" to buf, adding casts
+ * and schema qualification as needed to ensure that the parser will select
+ * the operator we specify. leftop and rightop should be parenthesized
+ * if they aren't variables or parameters.
+ */
+static void
+ri_GenerateQual(StringInfo buf,
+ const char *sep,
+ const char *leftop, Oid leftoptype,
+ Oid opoid,
+ const char *rightop, Oid rightoptype)
+{
+ appendStringInfo(buf, " %s ", sep);
+ generate_operator_clause(buf, leftop, leftoptype, opoid,
+ rightop, rightoptype);
+}
+
+/*
+ * ri_GenerateQualCollation --- add a COLLATE spec to a WHERE clause
+ *
+ * At present, we intentionally do not use this function for RI queries that
+ * compare a variable to a $n parameter. Since parameter symbols always have
+ * default collation, the effect will be to use the variable's collation.
+ * Now that is only strictly correct when testing the referenced column, since
+ * the SQL standard specifies that RI comparisons should use the referenced
+ * column's collation. However, so long as all collations have the same
+ * notion of equality (which they do, because texteq reduces to bitwise
+ * equality), there's no visible semantic impact from using the referencing
+ * column's collation when testing it, and this is a good thing to do because
+ * it lets us use a normal index on the referencing column. However, we do
+ * have to use this function when directly comparing the referencing and
+ * referenced columns, if they are of different collations; else the parser
+ * will fail to resolve the collation to use.
+ */
+static void
+ri_GenerateQualCollation(StringInfo buf, Oid collation)
+{
+ HeapTuple tp;
+ Form_pg_collation colltup;
+ char *collname;
+ char onename[MAX_QUOTED_NAME_LEN];
+
+ /* Nothing to do if it's a noncollatable data type */
+ if (!OidIsValid(collation))
+ return;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collation));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for collation %u", collation);
+ colltup = (Form_pg_collation) GETSTRUCT(tp);
+ collname = NameStr(colltup->collname);
+
+ /*
+ * We qualify the name always, for simplicity and to ensure the query is
+ * not search-path-dependent.
+ */
+ quoteOneName(onename, get_namespace_name(colltup->collnamespace));
+ appendStringInfo(buf, " COLLATE %s", onename);
+ quoteOneName(onename, collname);
+ appendStringInfo(buf, ".%s", onename);
+
+ ReleaseSysCache(tp);
+}
+
+/* ----------
+ * ri_BuildQueryKey -
+ *
+ * Construct a hashtable key for a prepared SPI plan of an FK constraint.
+ *
+ * key: output argument, *key is filled in based on the other arguments
+ * riinfo: info derived from pg_constraint entry
+ * constr_queryno: an internal number identifying the query type
+ * (see RI_PLAN_XXX constants at head of file)
+ * ----------
+ */
+static void
+ri_BuildQueryKey(RI_QueryKey *key, const RI_ConstraintInfo *riinfo,
+ int32 constr_queryno)
+{
+ /*
+ * Inherited constraints with a common ancestor can share ri_query_cache
+ * entries for all query types except RI_PLAN_CHECK_LOOKUPPK_FROM_PK.
+ * Except in that case, the query processes the other table involved in
+ * the FK constraint (i.e., not the table on which the trigger has been
+ * fired), and so it will be the same for all members of the inheritance
+ * tree. So we may use the root constraint's OID in the hash key, rather
+ * than the constraint's own OID. This avoids creating duplicate SPI
+ * plans, saving lots of work and memory when there are many partitions
+ * with similar FK constraints.
+ *
+ * (Note that we must still have a separate RI_ConstraintInfo for each
+ * constraint, because partitions can have different column orders,
+ * resulting in different pk_attnums[] or fk_attnums[] array contents.)
+ *
+ * We assume struct RI_QueryKey contains no padding bytes, else we'd need
+ * to use memset to clear them.
+ */
+ if (constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK)
+ key->constr_id = riinfo->constraint_root_id;
+ else
+ key->constr_id = riinfo->constraint_id;
+ key->constr_queryno = constr_queryno;
+}
+
+/*
+ * Check that RI trigger function was called in expected context
+ */
+static void
+ri_CheckTrigger(FunctionCallInfo fcinfo, const char *funcname, int tgkind)
+{
+ TriggerData *trigdata = (TriggerData *) fcinfo->context;
+
+ if (!CALLED_AS_TRIGGER(fcinfo))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("function \"%s\" was not called by trigger manager", funcname)));
+
+ /*
+ * Check proper event
+ */
+ if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) ||
+ !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("function \"%s\" must be fired AFTER ROW", funcname)));
+
+ switch (tgkind)
+ {
+ case RI_TRIGTYPE_INSERT:
+ if (!TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("function \"%s\" must be fired for INSERT", funcname)));
+ break;
+ case RI_TRIGTYPE_UPDATE:
+ if (!TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("function \"%s\" must be fired for UPDATE", funcname)));
+ break;
+ case RI_TRIGTYPE_DELETE:
+ if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("function \"%s\" must be fired for DELETE", funcname)));
+ break;
+ }
+}
+
+
+/*
+ * Fetch the RI_ConstraintInfo struct for the trigger's FK constraint.
+ */
+static const RI_ConstraintInfo *
+ri_FetchConstraintInfo(Trigger *trigger, Relation trig_rel, bool rel_is_pk)
+{
+ Oid constraintOid = trigger->tgconstraint;
+ const RI_ConstraintInfo *riinfo;
+
+ /*
+ * Check that the FK constraint's OID is available; it might not be if
+ * we've been invoked via an ordinary trigger or an old-style "constraint
+ * trigger".
+ */
+ if (!OidIsValid(constraintOid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+ errmsg("no pg_constraint entry for trigger \"%s\" on table \"%s\"",
+ trigger->tgname, RelationGetRelationName(trig_rel)),
+ errhint("Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT.")));
+
+ /* Find or create a hashtable entry for the constraint */
+ riinfo = ri_LoadConstraintInfo(constraintOid);
+
+ /* Do some easy cross-checks against the trigger call data */
+ if (rel_is_pk)
+ {
+ if (riinfo->fk_relid != trigger->tgconstrrelid ||
+ riinfo->pk_relid != RelationGetRelid(trig_rel))
+ elog(ERROR, "wrong pg_constraint entry for trigger \"%s\" on table \"%s\"",
+ trigger->tgname, RelationGetRelationName(trig_rel));
+ }
+ else
+ {
+ if (riinfo->fk_relid != RelationGetRelid(trig_rel) ||
+ riinfo->pk_relid != trigger->tgconstrrelid)
+ elog(ERROR, "wrong pg_constraint entry for trigger \"%s\" on table \"%s\"",
+ trigger->tgname, RelationGetRelationName(trig_rel));
+ }
+
+ if (riinfo->confmatchtype != FKCONSTR_MATCH_FULL &&
+ riinfo->confmatchtype != FKCONSTR_MATCH_PARTIAL &&
+ riinfo->confmatchtype != FKCONSTR_MATCH_SIMPLE)
+ elog(ERROR, "unrecognized confmatchtype: %d",
+ riinfo->confmatchtype);
+
+ if (riinfo->confmatchtype == FKCONSTR_MATCH_PARTIAL)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("MATCH PARTIAL not yet implemented")));
+
+ return riinfo;
+}
+
+/*
+ * Fetch or create the RI_ConstraintInfo struct for an FK constraint.
+ */
+static const RI_ConstraintInfo *
+ri_LoadConstraintInfo(Oid constraintOid)
+{
+ RI_ConstraintInfo *riinfo;
+ bool found;
+ HeapTuple tup;
+ Form_pg_constraint conForm;
+
+ /*
+ * On the first call initialize the hashtable
+ */
+ if (!ri_constraint_cache)
+ ri_InitHashTables();
+
+ /*
+ * Find or create a hash entry. If we find a valid one, just return it.
+ */
+ riinfo = (RI_ConstraintInfo *) hash_search(ri_constraint_cache,
+ (void *) &constraintOid,
+ HASH_ENTER, &found);
+ if (!found)
+ riinfo->valid = false;
+ else if (riinfo->valid)
+ return riinfo;
+
+ /*
+ * Fetch the pg_constraint row so we can fill in the entry.
+ */
+ tup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(constraintOid));
+ if (!HeapTupleIsValid(tup)) /* should not happen */
+ elog(ERROR, "cache lookup failed for constraint %u", constraintOid);
+ conForm = (Form_pg_constraint) GETSTRUCT(tup);
+
+ if (conForm->contype != CONSTRAINT_FOREIGN) /* should not happen */
+ elog(ERROR, "constraint %u is not a foreign key constraint",
+ constraintOid);
+
+ /* And extract data */
+ Assert(riinfo->constraint_id == constraintOid);
+ if (OidIsValid(conForm->conparentid))
+ riinfo->constraint_root_id =
+ get_ri_constraint_root(conForm->conparentid);
+ else
+ riinfo->constraint_root_id = constraintOid;
+ riinfo->oidHashValue = GetSysCacheHashValue1(CONSTROID,
+ ObjectIdGetDatum(constraintOid));
+ riinfo->rootHashValue = GetSysCacheHashValue1(CONSTROID,
+ ObjectIdGetDatum(riinfo->constraint_root_id));
+ memcpy(&riinfo->conname, &conForm->conname, sizeof(NameData));
+ riinfo->pk_relid = conForm->confrelid;
+ riinfo->fk_relid = conForm->conrelid;
+ riinfo->confupdtype = conForm->confupdtype;
+ riinfo->confdeltype = conForm->confdeltype;
+ riinfo->confmatchtype = conForm->confmatchtype;
+
+ DeconstructFkConstraintRow(tup,
+ &riinfo->nkeys,
+ riinfo->fk_attnums,
+ riinfo->pk_attnums,
+ riinfo->pf_eq_oprs,
+ riinfo->pp_eq_oprs,
+ riinfo->ff_eq_oprs,
+ &riinfo->ndelsetcols,
+ riinfo->confdelsetcols);
+
+ ReleaseSysCache(tup);
+
+ /*
+ * For efficient processing of invalidation messages below, we keep a
+ * doubly-linked list, and a count, of all currently valid entries.
+ */
+ dlist_push_tail(&ri_constraint_cache_valid_list, &riinfo->valid_link);
+ ri_constraint_cache_valid_count++;
+
+ riinfo->valid = true;
+
+ return riinfo;
+}
+
+/*
+ * get_ri_constraint_root
+ * Returns the OID of the constraint's root parent
+ */
+static Oid
+get_ri_constraint_root(Oid constrOid)
+{
+ for (;;)
+ {
+ HeapTuple tuple;
+ Oid constrParentOid;
+
+ tuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(constrOid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for constraint %u", constrOid);
+ constrParentOid = ((Form_pg_constraint) GETSTRUCT(tuple))->conparentid;
+ ReleaseSysCache(tuple);
+ if (!OidIsValid(constrParentOid))
+ break; /* we reached the root constraint */
+ constrOid = constrParentOid;
+ }
+ return constrOid;
+}
+
+/*
+ * Callback for pg_constraint inval events
+ *
+ * While most syscache callbacks just flush all their entries, pg_constraint
+ * gets enough update traffic that it's probably worth being smarter.
+ * Invalidate any ri_constraint_cache entry associated with the syscache
+ * entry with the specified hash value, or all entries if hashvalue == 0.
+ *
+ * Note: at the time a cache invalidation message is processed there may be
+ * active references to the cache. Because of this we never remove entries
+ * from the cache, but only mark them invalid, which is harmless to active
+ * uses. (Any query using an entry should hold a lock sufficient to keep that
+ * data from changing under it --- but we may get cache flushes anyway.)
+ */
+static void
+InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
+{
+ dlist_mutable_iter iter;
+
+ Assert(ri_constraint_cache != NULL);
+
+ /*
+ * If the list of currently valid entries gets excessively large, we mark
+ * them all invalid so we can empty the list. This arrangement avoids
+ * O(N^2) behavior in situations where a session touches many foreign keys
+ * and also does many ALTER TABLEs, such as a restore from pg_dump.
+ */
+ if (ri_constraint_cache_valid_count > 1000)
+ hashvalue = 0; /* pretend it's a cache reset */
+
+ dlist_foreach_modify(iter, &ri_constraint_cache_valid_list)
+ {
+ RI_ConstraintInfo *riinfo = dlist_container(RI_ConstraintInfo,
+ valid_link, iter.cur);
+
+ /*
+ * We must invalidate not only entries directly matching the given
+ * hash value, but also child entries, in case the invalidation
+ * affects a root constraint.
+ */
+ if (hashvalue == 0 ||
+ riinfo->oidHashValue == hashvalue ||
+ riinfo->rootHashValue == hashvalue)
+ {
+ riinfo->valid = false;
+ /* Remove invalidated entries from the list, too */
+ dlist_delete(iter.cur);
+ ri_constraint_cache_valid_count--;
+ }
+ }
+}
+
+
+/*
+ * Prepare execution plan for a query to enforce an RI restriction
+ */
+static SPIPlanPtr
+ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes,
+ RI_QueryKey *qkey, Relation fk_rel, Relation pk_rel)
+{
+ SPIPlanPtr qplan;
+ Relation query_rel;
+ Oid save_userid;
+ int save_sec_context;
+
+ /*
+ * Use the query type code to determine whether the query is run against
+ * the PK or FK table; we'll do the check as that table's owner
+ */
+ if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK)
+ query_rel = pk_rel;
+ else
+ query_rel = fk_rel;
+
+ /* Switch to proper UID to perform check as */
+ GetUserIdAndSecContext(&save_userid, &save_sec_context);
+ SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner,
+ save_sec_context | SECURITY_LOCAL_USERID_CHANGE |
+ SECURITY_NOFORCE_RLS);
+
+ /* Create the plan */
+ qplan = SPI_prepare(querystr, nargs, argtypes);
+
+ if (qplan == NULL)
+ elog(ERROR, "SPI_prepare returned %s for %s", SPI_result_code_string(SPI_result), querystr);
+
+ /* Restore UID and security context */
+ SetUserIdAndSecContext(save_userid, save_sec_context);
+
+ /* Save the plan */
+ SPI_keepplan(qplan);
+ ri_HashPreparedPlan(qkey, qplan);
+
+ return qplan;
+}
+
+/*
+ * Perform a query to enforce an RI restriction
+ */
+static bool
+ri_PerformCheck(const RI_ConstraintInfo *riinfo,
+ RI_QueryKey *qkey, SPIPlanPtr qplan,
+ Relation fk_rel, Relation pk_rel,
+ TupleTableSlot *oldslot, TupleTableSlot *newslot,
+ bool detectNewRows, int expect_OK)
+{
+ Relation query_rel,
+ source_rel;
+ bool source_is_pk;
+ Snapshot test_snapshot;
+ Snapshot crosscheck_snapshot;
+ int limit;
+ int spi_result;
+ Oid save_userid;
+ int save_sec_context;
+ Datum vals[RI_MAX_NUMKEYS * 2];
+ char nulls[RI_MAX_NUMKEYS * 2];
+
+ /*
+ * Use the query type code to determine whether the query is run against
+ * the PK or FK table; we'll do the check as that table's owner
+ */
+ if (qkey->constr_queryno <= RI_PLAN_LAST_ON_PK)
+ query_rel = pk_rel;
+ else
+ query_rel = fk_rel;
+
+ /*
+ * The values for the query are taken from the table on which the trigger
+ * is called - it is normally the other one with respect to query_rel. An
+ * exception is ri_Check_Pk_Match(), which uses the PK table for both (and
+ * sets queryno to RI_PLAN_CHECK_LOOKUPPK_FROM_PK). We might eventually
+ * need some less klugy way to determine this.
+ */
+ if (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK)
+ {
+ source_rel = fk_rel;
+ source_is_pk = false;
+ }
+ else
+ {
+ source_rel = pk_rel;
+ source_is_pk = true;
+ }
+
+ /* Extract the parameters to be passed into the query */
+ if (newslot)
+ {
+ ri_ExtractValues(source_rel, newslot, riinfo, source_is_pk,
+ vals, nulls);
+ if (oldslot)
+ ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk,
+ vals + riinfo->nkeys, nulls + riinfo->nkeys);
+ }
+ else
+ {
+ ri_ExtractValues(source_rel, oldslot, riinfo, source_is_pk,
+ vals, nulls);
+ }
+
+ /*
+ * In READ COMMITTED mode, we just need to use an up-to-date regular
+ * snapshot, and we will see all rows that could be interesting. But in
+ * transaction-snapshot mode, we can't change the transaction snapshot. If
+ * the caller passes detectNewRows == false then it's okay to do the query
+ * with the transaction snapshot; otherwise we use a current snapshot, and
+ * tell the executor to error out if it finds any rows under the current
+ * snapshot that wouldn't be visible per the transaction snapshot. Note
+ * that SPI_execute_snapshot will register the snapshots, so we don't need
+ * to bother here.
+ */
+ if (IsolationUsesXactSnapshot() && detectNewRows)
+ {
+ CommandCounterIncrement(); /* be sure all my own work is visible */
+ test_snapshot = GetLatestSnapshot();
+ crosscheck_snapshot = GetTransactionSnapshot();
+ }
+ else
+ {
+ /* the default SPI behavior is okay */
+ test_snapshot = InvalidSnapshot;
+ crosscheck_snapshot = InvalidSnapshot;
+ }
+
+ /*
+ * If this is a select query (e.g., for a 'no action' or 'restrict'
+ * trigger), we only need to see if there is a single row in the table,
+ * matching the key. Otherwise, limit = 0 - because we want the query to
+ * affect ALL the matching rows.
+ */
+ limit = (expect_OK == SPI_OK_SELECT) ? 1 : 0;
+
+ /* Switch to proper UID to perform check as */
+ GetUserIdAndSecContext(&save_userid, &save_sec_context);
+ SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner,
+ save_sec_context | SECURITY_LOCAL_USERID_CHANGE |
+ SECURITY_NOFORCE_RLS);
+
+ /* Finally we can run the query. */
+ spi_result = SPI_execute_snapshot(qplan,
+ vals, nulls,
+ test_snapshot, crosscheck_snapshot,
+ false, false, limit);
+
+ /* Restore UID and security context */
+ SetUserIdAndSecContext(save_userid, save_sec_context);
+
+ /* Check result */
+ if (spi_result < 0)
+ elog(ERROR, "SPI_execute_snapshot returned %s", SPI_result_code_string(spi_result));
+
+ if (expect_OK >= 0 && spi_result != expect_OK)
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result",
+ RelationGetRelationName(pk_rel),
+ NameStr(riinfo->conname),
+ RelationGetRelationName(fk_rel)),
+ errhint("This is most likely due to a rule having rewritten the query.")));
+
+ /* XXX wouldn't it be clearer to do this part at the caller? */
+ if (qkey->constr_queryno != RI_PLAN_CHECK_LOOKUPPK_FROM_PK &&
+ expect_OK == SPI_OK_SELECT &&
+ (SPI_processed == 0) == (qkey->constr_queryno == RI_PLAN_CHECK_LOOKUPPK))
+ ri_ReportViolation(riinfo,
+ pk_rel, fk_rel,
+ newslot ? newslot : oldslot,
+ NULL,
+ qkey->constr_queryno, false);
+
+ return SPI_processed != 0;
+}
+
+/*
+ * Extract fields from a tuple into Datum/nulls arrays
+ */
+static void
+ri_ExtractValues(Relation rel, TupleTableSlot *slot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk,
+ Datum *vals, char *nulls)
+{
+ const int16 *attnums;
+ bool isnull;
+
+ if (rel_is_pk)
+ attnums = riinfo->pk_attnums;
+ else
+ attnums = riinfo->fk_attnums;
+
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ vals[i] = slot_getattr(slot, attnums[i], &isnull);
+ nulls[i] = isnull ? 'n' : ' ';
+ }
+}
+
+/*
+ * Produce an error report
+ *
+ * If the failed constraint was on insert/update to the FK table,
+ * we want the key names and values extracted from there, and the error
+ * message to look like 'key blah is not present in PK'.
+ * Otherwise, the attr names and values come from the PK table and the
+ * message looks like 'key blah is still referenced from FK'.
+ */
+static void
+ri_ReportViolation(const RI_ConstraintInfo *riinfo,
+ Relation pk_rel, Relation fk_rel,
+ TupleTableSlot *violatorslot, TupleDesc tupdesc,
+ int queryno, bool partgone)
+{
+ StringInfoData key_names;
+ StringInfoData key_values;
+ bool onfk;
+ const int16 *attnums;
+ Oid rel_oid;
+ AclResult aclresult;
+ bool has_perm = true;
+
+ /*
+ * Determine which relation to complain about. If tupdesc wasn't passed
+ * by caller, assume the violator tuple came from there.
+ */
+ onfk = (queryno == RI_PLAN_CHECK_LOOKUPPK);
+ if (onfk)
+ {
+ attnums = riinfo->fk_attnums;
+ rel_oid = fk_rel->rd_id;
+ if (tupdesc == NULL)
+ tupdesc = fk_rel->rd_att;
+ }
+ else
+ {
+ attnums = riinfo->pk_attnums;
+ rel_oid = pk_rel->rd_id;
+ if (tupdesc == NULL)
+ tupdesc = pk_rel->rd_att;
+ }
+
+ /*
+ * Check permissions- if the user does not have access to view the data in
+ * any of the key columns then we don't include the errdetail() below.
+ *
+ * Check if RLS is enabled on the relation first. If so, we don't return
+ * any specifics to avoid leaking data.
+ *
+ * Check table-level permissions next and, failing that, column-level
+ * privileges.
+ *
+ * When a partition at the referenced side is being detached/dropped, we
+ * needn't check, since the user must be the table owner anyway.
+ */
+ if (partgone)
+ has_perm = true;
+ else if (check_enable_rls(rel_oid, InvalidOid, true) != RLS_ENABLED)
+ {
+ aclresult = pg_class_aclcheck(rel_oid, GetUserId(), ACL_SELECT);
+ if (aclresult != ACLCHECK_OK)
+ {
+ /* Try for column-level permissions */
+ for (int idx = 0; idx < riinfo->nkeys; idx++)
+ {
+ aclresult = pg_attribute_aclcheck(rel_oid, attnums[idx],
+ GetUserId(),
+ ACL_SELECT);
+
+ /* No access to the key */
+ if (aclresult != ACLCHECK_OK)
+ {
+ has_perm = false;
+ break;
+ }
+ }
+ }
+ }
+ else
+ has_perm = false;
+
+ if (has_perm)
+ {
+ /* Get printable versions of the keys involved */
+ initStringInfo(&key_names);
+ initStringInfo(&key_values);
+ for (int idx = 0; idx < riinfo->nkeys; idx++)
+ {
+ int fnum = attnums[idx];
+ Form_pg_attribute att = TupleDescAttr(tupdesc, fnum - 1);
+ char *name,
+ *val;
+ Datum datum;
+ bool isnull;
+
+ name = NameStr(att->attname);
+
+ datum = slot_getattr(violatorslot, fnum, &isnull);
+ if (!isnull)
+ {
+ Oid foutoid;
+ bool typisvarlena;
+
+ getTypeOutputInfo(att->atttypid, &foutoid, &typisvarlena);
+ val = OidOutputFunctionCall(foutoid, datum);
+ }
+ else
+ val = "null";
+
+ if (idx > 0)
+ {
+ appendStringInfoString(&key_names, ", ");
+ appendStringInfoString(&key_values, ", ");
+ }
+ appendStringInfoString(&key_names, name);
+ appendStringInfoString(&key_values, val);
+ }
+ }
+
+ if (partgone)
+ ereport(ERROR,
+ (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),
+ errmsg("removing partition \"%s\" violates foreign key constraint \"%s\"",
+ RelationGetRelationName(pk_rel),
+ NameStr(riinfo->conname)),
+ errdetail("Key (%s)=(%s) is still referenced from table \"%s\".",
+ key_names.data, key_values.data,
+ RelationGetRelationName(fk_rel)),
+ errtableconstraint(fk_rel, NameStr(riinfo->conname))));
+ else if (onfk)
+ ereport(ERROR,
+ (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),
+ errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"",
+ RelationGetRelationName(fk_rel),
+ NameStr(riinfo->conname)),
+ has_perm ?
+ errdetail("Key (%s)=(%s) is not present in table \"%s\".",
+ key_names.data, key_values.data,
+ RelationGetRelationName(pk_rel)) :
+ errdetail("Key is not present in table \"%s\".",
+ RelationGetRelationName(pk_rel)),
+ errtableconstraint(fk_rel, NameStr(riinfo->conname))));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),
+ errmsg("update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"",
+ RelationGetRelationName(pk_rel),
+ NameStr(riinfo->conname),
+ RelationGetRelationName(fk_rel)),
+ has_perm ?
+ errdetail("Key (%s)=(%s) is still referenced from table \"%s\".",
+ key_names.data, key_values.data,
+ RelationGetRelationName(fk_rel)) :
+ errdetail("Key is still referenced from table \"%s\".",
+ RelationGetRelationName(fk_rel)),
+ errtableconstraint(fk_rel, NameStr(riinfo->conname))));
+}
+
+
+/*
+ * ri_NullCheck -
+ *
+ * Determine the NULL state of all key values in a tuple
+ *
+ * Returns one of RI_KEYS_ALL_NULL, RI_KEYS_NONE_NULL or RI_KEYS_SOME_NULL.
+ */
+static int
+ri_NullCheck(TupleDesc tupDesc,
+ TupleTableSlot *slot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk)
+{
+ const int16 *attnums;
+ bool allnull = true;
+ bool nonenull = true;
+
+ if (rel_is_pk)
+ attnums = riinfo->pk_attnums;
+ else
+ attnums = riinfo->fk_attnums;
+
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ if (slot_attisnull(slot, attnums[i]))
+ nonenull = false;
+ else
+ allnull = false;
+ }
+
+ if (allnull)
+ return RI_KEYS_ALL_NULL;
+
+ if (nonenull)
+ return RI_KEYS_NONE_NULL;
+
+ return RI_KEYS_SOME_NULL;
+}
+
+
+/*
+ * ri_InitHashTables -
+ *
+ * Initialize our internal hash tables.
+ */
+static void
+ri_InitHashTables(void)
+{
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(RI_ConstraintInfo);
+ ri_constraint_cache = hash_create("RI constraint cache",
+ RI_INIT_CONSTRAINTHASHSIZE,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+
+ /* Arrange to flush cache on pg_constraint changes */
+ CacheRegisterSyscacheCallback(CONSTROID,
+ InvalidateConstraintCacheCallBack,
+ (Datum) 0);
+
+ ctl.keysize = sizeof(RI_QueryKey);
+ ctl.entrysize = sizeof(RI_QueryHashEntry);
+ ri_query_cache = hash_create("RI query cache",
+ RI_INIT_QUERYHASHSIZE,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+
+ ctl.keysize = sizeof(RI_CompareKey);
+ ctl.entrysize = sizeof(RI_CompareHashEntry);
+ ri_compare_cache = hash_create("RI compare cache",
+ RI_INIT_QUERYHASHSIZE,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+}
+
+
+/*
+ * ri_FetchPreparedPlan -
+ *
+ * Lookup for a query key in our private hash table of prepared
+ * and saved SPI execution plans. Return the plan if found or NULL.
+ */
+static SPIPlanPtr
+ri_FetchPreparedPlan(RI_QueryKey *key)
+{
+ RI_QueryHashEntry *entry;
+ SPIPlanPtr plan;
+
+ /*
+ * On the first call initialize the hashtable
+ */
+ if (!ri_query_cache)
+ ri_InitHashTables();
+
+ /*
+ * Lookup for the key
+ */
+ entry = (RI_QueryHashEntry *) hash_search(ri_query_cache,
+ (void *) key,
+ HASH_FIND, NULL);
+ if (entry == NULL)
+ return NULL;
+
+ /*
+ * Check whether the plan is still valid. If it isn't, we don't want to
+ * simply rely on plancache.c to regenerate it; rather we should start
+ * from scratch and rebuild the query text too. This is to cover cases
+ * such as table/column renames. We depend on the plancache machinery to
+ * detect possible invalidations, though.
+ *
+ * CAUTION: this check is only trustworthy if the caller has already
+ * locked both FK and PK rels.
+ */
+ plan = entry->plan;
+ if (plan && SPI_plan_is_valid(plan))
+ return plan;
+
+ /*
+ * Otherwise we might as well flush the cached plan now, to free a little
+ * memory space before we make a new one.
+ */
+ entry->plan = NULL;
+ if (plan)
+ SPI_freeplan(plan);
+
+ return NULL;
+}
+
+
+/*
+ * ri_HashPreparedPlan -
+ *
+ * Add another plan to our private SPI query plan hashtable.
+ */
+static void
+ri_HashPreparedPlan(RI_QueryKey *key, SPIPlanPtr plan)
+{
+ RI_QueryHashEntry *entry;
+ bool found;
+
+ /*
+ * On the first call initialize the hashtable
+ */
+ if (!ri_query_cache)
+ ri_InitHashTables();
+
+ /*
+ * Add the new plan. We might be overwriting an entry previously found
+ * invalid by ri_FetchPreparedPlan.
+ */
+ entry = (RI_QueryHashEntry *) hash_search(ri_query_cache,
+ (void *) key,
+ HASH_ENTER, &found);
+ Assert(!found || entry->plan == NULL);
+ entry->plan = plan;
+}
+
+
+/*
+ * ri_KeysEqual -
+ *
+ * Check if all key values in OLD and NEW are equal.
+ *
+ * Note: at some point we might wish to redefine this as checking for
+ * "IS NOT DISTINCT" rather than "=", that is, allow two nulls to be
+ * considered equal. Currently there is no need since all callers have
+ * previously found at least one of the rows to contain no nulls.
+ */
+static bool
+ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
+ const RI_ConstraintInfo *riinfo, bool rel_is_pk)
+{
+ const int16 *attnums;
+
+ if (rel_is_pk)
+ attnums = riinfo->pk_attnums;
+ else
+ attnums = riinfo->fk_attnums;
+
+ /* XXX: could be worthwhile to fetch all necessary attrs at once */
+ for (int i = 0; i < riinfo->nkeys; i++)
+ {
+ Datum oldvalue;
+ Datum newvalue;
+ bool isnull;
+
+ /*
+ * Get one attribute's oldvalue. If it is NULL - they're not equal.
+ */
+ oldvalue = slot_getattr(oldslot, attnums[i], &isnull);
+ if (isnull)
+ return false;
+
+ /*
+ * Get one attribute's newvalue. If it is NULL - they're not equal.
+ */
+ newvalue = slot_getattr(newslot, attnums[i], &isnull);
+ if (isnull)
+ return false;
+
+ if (rel_is_pk)
+ {
+ /*
+ * If we are looking at the PK table, then do a bytewise
+ * comparison. We must propagate PK changes if the value is
+ * changed to one that "looks" different but would compare as
+ * equal using the equality operator. This only makes a
+ * difference for ON UPDATE CASCADE, but for consistency we treat
+ * all changes to the PK the same.
+ */
+ Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+
+ if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
+ return false;
+ }
+ else
+ {
+ /*
+ * For the FK table, compare with the appropriate equality
+ * operator. Changes that compare equal will still satisfy the
+ * constraint after the update.
+ */
+ if (!ri_AttributesEqual(riinfo->ff_eq_oprs[i], RIAttType(rel, attnums[i]),
+ oldvalue, newvalue))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+/*
+ * ri_AttributesEqual -
+ *
+ * Call the appropriate equality comparison operator for two values.
+ *
+ * NB: we have already checked that neither value is null.
+ */
+static bool
+ri_AttributesEqual(Oid eq_opr, Oid typeid,
+ Datum oldvalue, Datum newvalue)
+{
+ RI_CompareHashEntry *entry = ri_HashCompareOp(eq_opr, typeid);
+
+ /* Do we need to cast the values? */
+ if (OidIsValid(entry->cast_func_finfo.fn_oid))
+ {
+ oldvalue = FunctionCall3(&entry->cast_func_finfo,
+ oldvalue,
+ Int32GetDatum(-1), /* typmod */
+ BoolGetDatum(false)); /* implicit coercion */
+ newvalue = FunctionCall3(&entry->cast_func_finfo,
+ newvalue,
+ Int32GetDatum(-1), /* typmod */
+ BoolGetDatum(false)); /* implicit coercion */
+ }
+
+ /*
+ * Apply the comparison operator.
+ *
+ * Note: This function is part of a call stack that determines whether an
+ * update to a row is significant enough that it needs checking or action
+ * on the other side of a foreign-key constraint. Therefore, the
+ * comparison here would need to be done with the collation of the *other*
+ * table. For simplicity (e.g., we might not even have the other table
+ * open), we'll just use the default collation here, which could lead to
+ * some false negatives. All this would break if we ever allow
+ * database-wide collations to be nondeterministic.
+ */
+ return DatumGetBool(FunctionCall2Coll(&entry->eq_opr_finfo,
+ DEFAULT_COLLATION_OID,
+ oldvalue, newvalue));
+}
+
+/*
+ * ri_HashCompareOp -
+ *
+ * See if we know how to compare two values, and create a new hash entry
+ * if not.
+ */
+static RI_CompareHashEntry *
+ri_HashCompareOp(Oid eq_opr, Oid typeid)
+{
+ RI_CompareKey key;
+ RI_CompareHashEntry *entry;
+ bool found;
+
+ /*
+ * On the first call initialize the hashtable
+ */
+ if (!ri_compare_cache)
+ ri_InitHashTables();
+
+ /*
+ * Find or create a hash entry. Note we're assuming RI_CompareKey
+ * contains no struct padding.
+ */
+ key.eq_opr = eq_opr;
+ key.typeid = typeid;
+ entry = (RI_CompareHashEntry *) hash_search(ri_compare_cache,
+ (void *) &key,
+ HASH_ENTER, &found);
+ if (!found)
+ entry->valid = false;
+
+ /*
+ * If not already initialized, do so. Since we'll keep this hash entry
+ * for the life of the backend, put any subsidiary info for the function
+ * cache structs into TopMemoryContext.
+ */
+ if (!entry->valid)
+ {
+ Oid lefttype,
+ righttype,
+ castfunc;
+ CoercionPathType pathtype;
+
+ /* We always need to know how to call the equality operator */
+ fmgr_info_cxt(get_opcode(eq_opr), &entry->eq_opr_finfo,
+ TopMemoryContext);
+
+ /*
+ * If we chose to use a cast from FK to PK type, we may have to apply
+ * the cast function to get to the operator's input type.
+ *
+ * XXX eventually it would be good to support array-coercion cases
+ * here and in ri_AttributesEqual(). At the moment there is no point
+ * because cases involving nonidentical array types will be rejected
+ * at constraint creation time.
+ *
+ * XXX perhaps also consider supporting CoerceViaIO? No need at the
+ * moment since that will never be generated for implicit coercions.
+ */
+ op_input_types(eq_opr, &lefttype, &righttype);
+ Assert(lefttype == righttype);
+ if (typeid == lefttype)
+ castfunc = InvalidOid; /* simplest case */
+ else
+ {
+ pathtype = find_coercion_pathway(lefttype, typeid,
+ COERCION_IMPLICIT,
+ &castfunc);
+ if (pathtype != COERCION_PATH_FUNC &&
+ pathtype != COERCION_PATH_RELABELTYPE)
+ {
+ /*
+ * The declared input type of the eq_opr might be a
+ * polymorphic type such as ANYARRAY or ANYENUM, or other
+ * special cases such as RECORD; find_coercion_pathway
+ * currently doesn't subsume these special cases.
+ */
+ if (!IsBinaryCoercible(typeid, lefttype))
+ elog(ERROR, "no conversion function from %s to %s",
+ format_type_be(typeid),
+ format_type_be(lefttype));
+ }
+ }
+ if (OidIsValid(castfunc))
+ fmgr_info_cxt(castfunc, &entry->cast_func_finfo,
+ TopMemoryContext);
+ else
+ entry->cast_func_finfo.fn_oid = InvalidOid;
+ entry->valid = true;
+ }
+
+ return entry;
+}
+
+
+/*
+ * Given a trigger function OID, determine whether it is an RI trigger,
+ * and if so whether it is attached to PK or FK relation.
+ */
+int
+RI_FKey_trigger_type(Oid tgfoid)
+{
+ switch (tgfoid)
+ {
+ case F_RI_FKEY_CASCADE_DEL:
+ case F_RI_FKEY_CASCADE_UPD:
+ case F_RI_FKEY_RESTRICT_DEL:
+ case F_RI_FKEY_RESTRICT_UPD:
+ case F_RI_FKEY_SETNULL_DEL:
+ case F_RI_FKEY_SETNULL_UPD:
+ case F_RI_FKEY_SETDEFAULT_DEL:
+ case F_RI_FKEY_SETDEFAULT_UPD:
+ case F_RI_FKEY_NOACTION_DEL:
+ case F_RI_FKEY_NOACTION_UPD:
+ return RI_TRIGGER_PK;
+
+ case F_RI_FKEY_CHECK_INS:
+ case F_RI_FKEY_CHECK_UPD:
+ return RI_TRIGGER_FK;
+ }
+
+ return RI_TRIGGER_NONE;
+}
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
new file mode 100644
index 0000000..db843a0
--- /dev/null
+++ b/src/backend/utils/adt/rowtypes.c
@@ -0,0 +1,2017 @@
+/*-------------------------------------------------------------------------
+ *
+ * rowtypes.c
+ * I/O and comparison functions for generic composite types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/rowtypes.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "access/detoast.h"
+#include "access/htup_details.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/lsyscache.h"
+#include "utils/typcache.h"
+
+
+/*
+ * structure to cache metadata needed for record I/O
+ */
+typedef struct ColumnIOData
+{
+ Oid column_type;
+ Oid typiofunc;
+ Oid typioparam;
+ bool typisvarlena;
+ FmgrInfo proc;
+} ColumnIOData;
+
+typedef struct RecordIOData
+{
+ Oid record_type;
+ int32 record_typmod;
+ int ncolumns;
+ ColumnIOData columns[FLEXIBLE_ARRAY_MEMBER];
+} RecordIOData;
+
+/*
+ * structure to cache metadata needed for record comparison
+ */
+typedef struct ColumnCompareData
+{
+ TypeCacheEntry *typentry; /* has everything we need, actually */
+} ColumnCompareData;
+
+typedef struct RecordCompareData
+{
+ int ncolumns; /* allocated length of columns[] */
+ Oid record1_type;
+ int32 record1_typmod;
+ Oid record2_type;
+ int32 record2_typmod;
+ ColumnCompareData columns[FLEXIBLE_ARRAY_MEMBER];
+} RecordCompareData;
+
+
+/*
+ * record_in - input routine for any composite type.
+ */
+Datum
+record_in(PG_FUNCTION_ARGS)
+{
+ char *string = PG_GETARG_CSTRING(0);
+ Oid tupType = PG_GETARG_OID(1);
+ int32 tupTypmod = PG_GETARG_INT32(2);
+ HeapTupleHeader result;
+ TupleDesc tupdesc;
+ HeapTuple tuple;
+ RecordIOData *my_extra;
+ bool needComma = false;
+ int ncolumns;
+ int i;
+ char *ptr;
+ Datum *values;
+ bool *nulls;
+ StringInfoData buf;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /*
+ * Give a friendly error message if we did not get enough info to identify
+ * the target record type. (lookup_rowtype_tupdesc would fail anyway, but
+ * with a non-user-friendly message.) In ordinary SQL usage, we'll get -1
+ * for typmod, since composite types and RECORD have no type modifiers at
+ * the SQL level, and thus must fail for RECORD. However some callers can
+ * supply a valid typmod, and then we can do something useful for RECORD.
+ */
+ if (tupType == RECORDOID && tupTypmod < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("input of anonymous composite types is not implemented")));
+
+ /*
+ * This comes from the composite type's pg_type.oid and stores system oids
+ * in user tables, specifically DatumTupleFields. This oid must be
+ * preserved by binary upgrades.
+ */
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /*
+ * We arrange to look up the needed I/O info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns != ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ my_extra->record_type = InvalidOid;
+ my_extra->record_typmod = 0;
+ }
+
+ if (my_extra->record_type != tupType ||
+ my_extra->record_typmod != tupTypmod)
+ {
+ MemSet(my_extra, 0,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra->record_type = tupType;
+ my_extra->record_typmod = tupTypmod;
+ my_extra->ncolumns = ncolumns;
+ }
+
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+
+ /*
+ * Scan the string. We use "buf" to accumulate the de-quoted data for
+ * each column, which is then fed to the appropriate input converter.
+ */
+ ptr = string;
+ /* Allow leading whitespace */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+ if (*ptr++ != '(')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"", string),
+ errdetail("Missing left parenthesis.")));
+
+ initStringInfo(&buf);
+
+ for (i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+ ColumnIOData *column_info = &my_extra->columns[i];
+ Oid column_type = att->atttypid;
+ char *column_data;
+
+ /* Ignore dropped columns in datatype, but fill with nulls */
+ if (att->attisdropped)
+ {
+ values[i] = (Datum) 0;
+ nulls[i] = true;
+ continue;
+ }
+
+ if (needComma)
+ {
+ /* Skip comma that separates prior field from this one */
+ if (*ptr == ',')
+ ptr++;
+ else
+ /* *ptr must be ')' */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"", string),
+ errdetail("Too few columns.")));
+ }
+
+ /* Check for null: completely empty input means null */
+ if (*ptr == ',' || *ptr == ')')
+ {
+ column_data = NULL;
+ nulls[i] = true;
+ }
+ else
+ {
+ /* Extract string for this column */
+ bool inquote = false;
+
+ resetStringInfo(&buf);
+ while (inquote || !(*ptr == ',' || *ptr == ')'))
+ {
+ char ch = *ptr++;
+
+ if (ch == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"",
+ string),
+ errdetail("Unexpected end of input.")));
+ if (ch == '\\')
+ {
+ if (*ptr == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"",
+ string),
+ errdetail("Unexpected end of input.")));
+ appendStringInfoChar(&buf, *ptr++);
+ }
+ else if (ch == '"')
+ {
+ if (!inquote)
+ inquote = true;
+ else if (*ptr == '"')
+ {
+ /* doubled quote within quote sequence */
+ appendStringInfoChar(&buf, *ptr++);
+ }
+ else
+ inquote = false;
+ }
+ else
+ appendStringInfoChar(&buf, ch);
+ }
+
+ column_data = buf.data;
+ nulls[i] = false;
+ }
+
+ /*
+ * Convert the column value
+ */
+ if (column_info->column_type != column_type)
+ {
+ getTypeInputInfo(column_type,
+ &column_info->typiofunc,
+ &column_info->typioparam);
+ fmgr_info_cxt(column_info->typiofunc, &column_info->proc,
+ fcinfo->flinfo->fn_mcxt);
+ column_info->column_type = column_type;
+ }
+
+ values[i] = InputFunctionCall(&column_info->proc,
+ column_data,
+ column_info->typioparam,
+ att->atttypmod);
+
+ /*
+ * Prep for next column
+ */
+ needComma = true;
+ }
+
+ if (*ptr++ != ')')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"", string),
+ errdetail("Too many columns.")));
+ /* Allow trailing whitespace */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+ if (*ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("malformed record literal: \"%s\"", string),
+ errdetail("Junk after right parenthesis.")));
+
+ tuple = heap_form_tuple(tupdesc, values, nulls);
+
+ /*
+ * We cannot return tuple->t_data because heap_form_tuple allocates it as
+ * part of a larger chunk, and our caller may expect to be able to pfree
+ * our result. So must copy the info into a new palloc chunk.
+ */
+ result = (HeapTupleHeader) palloc(tuple->t_len);
+ memcpy(result, tuple->t_data, tuple->t_len);
+
+ heap_freetuple(tuple);
+ pfree(buf.data);
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ PG_RETURN_HEAPTUPLEHEADER(result);
+}
+
+/*
+ * record_out - output routine for any composite type.
+ */
+Datum
+record_out(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader rec = PG_GETARG_HEAPTUPLEHEADER(0);
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tuple;
+ RecordIOData *my_extra;
+ bool needComma = false;
+ int ncolumns;
+ int i;
+ Datum *values;
+ bool *nulls;
+ StringInfoData buf;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from the tuple itself */
+ tupType = HeapTupleHeaderGetTypeId(rec);
+ tupTypmod = HeapTupleHeaderGetTypMod(rec);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /* Build a temporary HeapTuple control structure */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(rec);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = rec;
+
+ /*
+ * We arrange to look up the needed I/O info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns != ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ my_extra->record_type = InvalidOid;
+ my_extra->record_typmod = 0;
+ }
+
+ if (my_extra->record_type != tupType ||
+ my_extra->record_typmod != tupTypmod)
+ {
+ MemSet(my_extra, 0,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra->record_type = tupType;
+ my_extra->record_typmod = tupTypmod;
+ my_extra->ncolumns = ncolumns;
+ }
+
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+
+ /* Break down the tuple into fields */
+ heap_deform_tuple(&tuple, tupdesc, values, nulls);
+
+ /* And build the result string */
+ initStringInfo(&buf);
+
+ appendStringInfoChar(&buf, '(');
+
+ for (i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+ ColumnIOData *column_info = &my_extra->columns[i];
+ Oid column_type = att->atttypid;
+ Datum attr;
+ char *value;
+ char *tmp;
+ bool nq;
+
+ /* Ignore dropped columns in datatype */
+ if (att->attisdropped)
+ continue;
+
+ if (needComma)
+ appendStringInfoChar(&buf, ',');
+ needComma = true;
+
+ if (nulls[i])
+ {
+ /* emit nothing... */
+ continue;
+ }
+
+ /*
+ * Convert the column value to text
+ */
+ if (column_info->column_type != column_type)
+ {
+ getTypeOutputInfo(column_type,
+ &column_info->typiofunc,
+ &column_info->typisvarlena);
+ fmgr_info_cxt(column_info->typiofunc, &column_info->proc,
+ fcinfo->flinfo->fn_mcxt);
+ column_info->column_type = column_type;
+ }
+
+ attr = values[i];
+ value = OutputFunctionCall(&column_info->proc, attr);
+
+ /* Detect whether we need double quotes for this value */
+ nq = (value[0] == '\0'); /* force quotes for empty string */
+ for (tmp = value; *tmp; tmp++)
+ {
+ char ch = *tmp;
+
+ if (ch == '"' || ch == '\\' ||
+ ch == '(' || ch == ')' || ch == ',' ||
+ isspace((unsigned char) ch))
+ {
+ nq = true;
+ break;
+ }
+ }
+
+ /* And emit the string */
+ if (nq)
+ appendStringInfoCharMacro(&buf, '"');
+ for (tmp = value; *tmp; tmp++)
+ {
+ char ch = *tmp;
+
+ if (ch == '"' || ch == '\\')
+ appendStringInfoCharMacro(&buf, ch);
+ appendStringInfoCharMacro(&buf, ch);
+ }
+ if (nq)
+ appendStringInfoCharMacro(&buf, '"');
+ }
+
+ appendStringInfoChar(&buf, ')');
+
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ PG_RETURN_CSTRING(buf.data);
+}
+
+/*
+ * record_recv - binary input routine for any composite type.
+ */
+Datum
+record_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ Oid tupType = PG_GETARG_OID(1);
+ int32 tupTypmod = PG_GETARG_INT32(2);
+ HeapTupleHeader result;
+ TupleDesc tupdesc;
+ HeapTuple tuple;
+ RecordIOData *my_extra;
+ int ncolumns;
+ int usercols;
+ int validcols;
+ int i;
+ Datum *values;
+ bool *nulls;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /*
+ * Give a friendly error message if we did not get enough info to identify
+ * the target record type. (lookup_rowtype_tupdesc would fail anyway, but
+ * with a non-user-friendly message.) In ordinary SQL usage, we'll get -1
+ * for typmod, since composite types and RECORD have no type modifiers at
+ * the SQL level, and thus must fail for RECORD. However some callers can
+ * supply a valid typmod, and then we can do something useful for RECORD.
+ */
+ if (tupType == RECORDOID && tupTypmod < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("input of anonymous composite types is not implemented")));
+
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /*
+ * We arrange to look up the needed I/O info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns != ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ my_extra->record_type = InvalidOid;
+ my_extra->record_typmod = 0;
+ }
+
+ if (my_extra->record_type != tupType ||
+ my_extra->record_typmod != tupTypmod)
+ {
+ MemSet(my_extra, 0,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra->record_type = tupType;
+ my_extra->record_typmod = tupTypmod;
+ my_extra->ncolumns = ncolumns;
+ }
+
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+
+ /* Fetch number of columns user thinks it has */
+ usercols = pq_getmsgint(buf, 4);
+
+ /* Need to scan to count nondeleted columns */
+ validcols = 0;
+ for (i = 0; i < ncolumns; i++)
+ {
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
+ validcols++;
+ }
+ if (usercols != validcols)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("wrong number of columns: %d, expected %d",
+ usercols, validcols)));
+
+ /* Process each column */
+ for (i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+ ColumnIOData *column_info = &my_extra->columns[i];
+ Oid column_type = att->atttypid;
+ Oid coltypoid;
+ int itemlen;
+ StringInfoData item_buf;
+ StringInfo bufptr;
+ char csave;
+
+ /* Ignore dropped columns in datatype, but fill with nulls */
+ if (att->attisdropped)
+ {
+ values[i] = (Datum) 0;
+ nulls[i] = true;
+ continue;
+ }
+
+ /* Check column type recorded in the data */
+ coltypoid = pq_getmsgint(buf, sizeof(Oid));
+
+ /*
+ * From a security standpoint, it doesn't matter whether the input's
+ * column type matches what we expect: the column type's receive
+ * function has to be robust enough to cope with invalid data.
+ * However, from a user-friendliness standpoint, it's nicer to
+ * complain about type mismatches than to throw "improper binary
+ * format" errors. But there's a problem: only built-in types have
+ * OIDs that are stable enough to believe that a mismatch is a real
+ * issue. So complain only if both OIDs are in the built-in range.
+ * Otherwise, carry on with the column type we "should" be getting.
+ */
+ if (coltypoid != column_type &&
+ coltypoid < FirstGenbkiObjectId &&
+ column_type < FirstGenbkiObjectId)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("binary data has type %u (%s) instead of expected %u (%s) in record column %d",
+ coltypoid,
+ format_type_extended(coltypoid, -1,
+ FORMAT_TYPE_ALLOW_INVALID),
+ column_type,
+ format_type_extended(column_type, -1,
+ FORMAT_TYPE_ALLOW_INVALID),
+ i + 1)));
+
+ /* Get and check the item length */
+ itemlen = pq_getmsgint(buf, 4);
+ if (itemlen < -1 || itemlen > (buf->len - buf->cursor))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("insufficient data left in message")));
+
+ if (itemlen == -1)
+ {
+ /* -1 length means NULL */
+ bufptr = NULL;
+ nulls[i] = true;
+ csave = 0; /* keep compiler quiet */
+ }
+ else
+ {
+ /*
+ * Rather than copying data around, we just set up a phony
+ * StringInfo pointing to the correct portion of the input buffer.
+ * We assume we can scribble on the input buffer so as to maintain
+ * the convention that StringInfos have a trailing null.
+ */
+ item_buf.data = &buf->data[buf->cursor];
+ item_buf.maxlen = itemlen + 1;
+ item_buf.len = itemlen;
+ item_buf.cursor = 0;
+
+ buf->cursor += itemlen;
+
+ csave = buf->data[buf->cursor];
+ buf->data[buf->cursor] = '\0';
+
+ bufptr = &item_buf;
+ nulls[i] = false;
+ }
+
+ /* Now call the column's receiveproc */
+ if (column_info->column_type != column_type)
+ {
+ getTypeBinaryInputInfo(column_type,
+ &column_info->typiofunc,
+ &column_info->typioparam);
+ fmgr_info_cxt(column_info->typiofunc, &column_info->proc,
+ fcinfo->flinfo->fn_mcxt);
+ column_info->column_type = column_type;
+ }
+
+ values[i] = ReceiveFunctionCall(&column_info->proc,
+ bufptr,
+ column_info->typioparam,
+ att->atttypmod);
+
+ if (bufptr)
+ {
+ /* Trouble if it didn't eat the whole buffer */
+ if (item_buf.cursor != itemlen)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("improper binary format in record column %d",
+ i + 1)));
+
+ buf->data[buf->cursor] = csave;
+ }
+ }
+
+ tuple = heap_form_tuple(tupdesc, values, nulls);
+
+ /*
+ * We cannot return tuple->t_data because heap_form_tuple allocates it as
+ * part of a larger chunk, and our caller may expect to be able to pfree
+ * our result. So must copy the info into a new palloc chunk.
+ */
+ result = (HeapTupleHeader) palloc(tuple->t_len);
+ memcpy(result, tuple->t_data, tuple->t_len);
+
+ heap_freetuple(tuple);
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ PG_RETURN_HEAPTUPLEHEADER(result);
+}
+
+/*
+ * record_send - binary output routine for any composite type.
+ */
+Datum
+record_send(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader rec = PG_GETARG_HEAPTUPLEHEADER(0);
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tuple;
+ RecordIOData *my_extra;
+ int ncolumns;
+ int validcols;
+ int i;
+ Datum *values;
+ bool *nulls;
+ StringInfoData buf;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from the tuple itself */
+ tupType = HeapTupleHeaderGetTypeId(rec);
+ tupTypmod = HeapTupleHeaderGetTypMod(rec);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /* Build a temporary HeapTuple control structure */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(rec);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = rec;
+
+ /*
+ * We arrange to look up the needed I/O info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns != ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
+ my_extra->record_type = InvalidOid;
+ my_extra->record_typmod = 0;
+ }
+
+ if (my_extra->record_type != tupType ||
+ my_extra->record_typmod != tupTypmod)
+ {
+ MemSet(my_extra, 0,
+ offsetof(RecordIOData, columns) +
+ ncolumns * sizeof(ColumnIOData));
+ my_extra->record_type = tupType;
+ my_extra->record_typmod = tupTypmod;
+ my_extra->ncolumns = ncolumns;
+ }
+
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+
+ /* Break down the tuple into fields */
+ heap_deform_tuple(&tuple, tupdesc, values, nulls);
+
+ /* And build the result string */
+ pq_begintypsend(&buf);
+
+ /* Need to scan to count nondeleted columns */
+ validcols = 0;
+ for (i = 0; i < ncolumns; i++)
+ {
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
+ validcols++;
+ }
+ pq_sendint32(&buf, validcols);
+
+ for (i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+ ColumnIOData *column_info = &my_extra->columns[i];
+ Oid column_type = att->atttypid;
+ Datum attr;
+ bytea *outputbytes;
+
+ /* Ignore dropped columns in datatype */
+ if (att->attisdropped)
+ continue;
+
+ pq_sendint32(&buf, column_type);
+
+ if (nulls[i])
+ {
+ /* emit -1 data length to signify a NULL */
+ pq_sendint32(&buf, -1);
+ continue;
+ }
+
+ /*
+ * Convert the column value to binary
+ */
+ if (column_info->column_type != column_type)
+ {
+ getTypeBinaryOutputInfo(column_type,
+ &column_info->typiofunc,
+ &column_info->typisvarlena);
+ fmgr_info_cxt(column_info->typiofunc, &column_info->proc,
+ fcinfo->flinfo->fn_mcxt);
+ column_info->column_type = column_type;
+ }
+
+ attr = values[i];
+ outputbytes = SendFunctionCall(&column_info->proc, attr);
+ pq_sendint32(&buf, VARSIZE(outputbytes) - VARHDRSZ);
+ pq_sendbytes(&buf, VARDATA(outputbytes),
+ VARSIZE(outputbytes) - VARHDRSZ);
+ }
+
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * record_cmp()
+ * Internal comparison function for records.
+ *
+ * Returns -1, 0 or 1
+ *
+ * Do not assume that the two inputs are exactly the same record type;
+ * for instance we might be comparing an anonymous ROW() construct against a
+ * named composite type. We will compare as long as they have the same number
+ * of non-dropped columns of the same types.
+ */
+static int
+record_cmp(FunctionCallInfo fcinfo)
+{
+ HeapTupleHeader record1 = PG_GETARG_HEAPTUPLEHEADER(0);
+ HeapTupleHeader record2 = PG_GETARG_HEAPTUPLEHEADER(1);
+ int result = 0;
+ Oid tupType1;
+ Oid tupType2;
+ int32 tupTypmod1;
+ int32 tupTypmod2;
+ TupleDesc tupdesc1;
+ TupleDesc tupdesc2;
+ HeapTupleData tuple1;
+ HeapTupleData tuple2;
+ int ncolumns1;
+ int ncolumns2;
+ RecordCompareData *my_extra;
+ int ncols;
+ Datum *values1;
+ Datum *values2;
+ bool *nulls1;
+ bool *nulls2;
+ int i1;
+ int i2;
+ int j;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from the tuples */
+ tupType1 = HeapTupleHeaderGetTypeId(record1);
+ tupTypmod1 = HeapTupleHeaderGetTypMod(record1);
+ tupdesc1 = lookup_rowtype_tupdesc(tupType1, tupTypmod1);
+ ncolumns1 = tupdesc1->natts;
+ tupType2 = HeapTupleHeaderGetTypeId(record2);
+ tupTypmod2 = HeapTupleHeaderGetTypMod(record2);
+ tupdesc2 = lookup_rowtype_tupdesc(tupType2, tupTypmod2);
+ ncolumns2 = tupdesc2->natts;
+
+ /* Build temporary HeapTuple control structures */
+ tuple1.t_len = HeapTupleHeaderGetDatumLength(record1);
+ ItemPointerSetInvalid(&(tuple1.t_self));
+ tuple1.t_tableOid = InvalidOid;
+ tuple1.t_data = record1;
+ tuple2.t_len = HeapTupleHeaderGetDatumLength(record2);
+ ItemPointerSetInvalid(&(tuple2.t_self));
+ tuple2.t_tableOid = InvalidOid;
+ tuple2.t_data = record2;
+
+ /*
+ * We arrange to look up the needed comparison info just once per series
+ * of calls, assuming the record types don't change underneath us.
+ */
+ ncols = Max(ncolumns1, ncolumns2);
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncols)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncols * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncols;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ my_extra->record2_type = InvalidOid;
+ my_extra->record2_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType1 ||
+ my_extra->record1_typmod != tupTypmod1 ||
+ my_extra->record2_type != tupType2 ||
+ my_extra->record2_typmod != tupTypmod2)
+ {
+ MemSet(my_extra->columns, 0, ncols * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType1;
+ my_extra->record1_typmod = tupTypmod1;
+ my_extra->record2_type = tupType2;
+ my_extra->record2_typmod = tupTypmod2;
+ }
+
+ /* Break down the tuples into fields */
+ values1 = (Datum *) palloc(ncolumns1 * sizeof(Datum));
+ nulls1 = (bool *) palloc(ncolumns1 * sizeof(bool));
+ heap_deform_tuple(&tuple1, tupdesc1, values1, nulls1);
+ values2 = (Datum *) palloc(ncolumns2 * sizeof(Datum));
+ nulls2 = (bool *) palloc(ncolumns2 * sizeof(bool));
+ heap_deform_tuple(&tuple2, tupdesc2, values2, nulls2);
+
+ /*
+ * Scan corresponding columns, allowing for dropped columns in different
+ * places in the two rows. i1 and i2 are physical column indexes, j is
+ * the logical column index.
+ */
+ i1 = i2 = j = 0;
+ while (i1 < ncolumns1 || i2 < ncolumns2)
+ {
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+ TypeCacheEntry *typentry;
+ Oid collation;
+
+ /*
+ * Skip dropped columns
+ */
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
+ {
+ i1++;
+ continue;
+ }
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
+ {
+ i2++;
+ continue;
+ }
+ if (i1 >= ncolumns1 || i2 >= ncolumns2)
+ break; /* we'll deal with mismatch below loop */
+
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
+ /*
+ * Have two matching columns, they must be same type
+ */
+ if (att1->atttypid != att2->atttypid)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare dissimilar column types %s and %s at record column %d",
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
+ j + 1)));
+
+ /*
+ * If they're not same collation, we don't complain here, but the
+ * comparison function might.
+ */
+ collation = att1->attcollation;
+ if (collation != att2->attcollation)
+ collation = InvalidOid;
+
+ /*
+ * Lookup the comparison function if not done already
+ */
+ typentry = my_extra->columns[j].typentry;
+ if (typentry == NULL ||
+ typentry->type_id != att1->atttypid)
+ {
+ typentry = lookup_type_cache(att1->atttypid,
+ TYPECACHE_CMP_PROC_FINFO);
+ if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a comparison function for type %s",
+ format_type_be(typentry->type_id))));
+ my_extra->columns[j].typentry = typentry;
+ }
+
+ /*
+ * We consider two NULLs equal; NULL > not-NULL.
+ */
+ if (!nulls1[i1] || !nulls2[i2])
+ {
+ LOCAL_FCINFO(locfcinfo, 2);
+ int32 cmpresult;
+
+ if (nulls1[i1])
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ if (nulls2[i2])
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+
+ /* Compare the pair of elements */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->cmp_proc_finfo, 2,
+ collation, NULL, NULL);
+ locfcinfo->args[0].value = values1[i1];
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = values2[i2];
+ locfcinfo->args[1].isnull = false;
+ cmpresult = DatumGetInt32(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect comparison support functions to return null */
+ Assert(!locfcinfo->isnull);
+
+ if (cmpresult < 0)
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+ else if (cmpresult > 0)
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ }
+
+ /* equal, so continue to next column */
+ i1++, i2++, j++;
+ }
+
+ /*
+ * If we didn't break out of the loop early, check for column count
+ * mismatch. (We do not report such mismatch if we found unequal column
+ * values; is that a feature or a bug?)
+ */
+ if (result == 0)
+ {
+ if (i1 != ncolumns1 || i2 != ncolumns2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare record types with different numbers of columns")));
+ }
+
+ pfree(values1);
+ pfree(nulls1);
+ pfree(values2);
+ pfree(nulls2);
+ ReleaseTupleDesc(tupdesc1);
+ ReleaseTupleDesc(tupdesc2);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record1, 0);
+ PG_FREE_IF_COPY(record2, 1);
+
+ return result;
+}
+
+/*
+ * record_eq :
+ * compares two records for equality
+ * result :
+ * returns true if the records are equal, false otherwise.
+ *
+ * Note: we do not use record_cmp here, since equality may be meaningful in
+ * datatypes that don't have a total ordering (and hence no btree support).
+ */
+Datum
+record_eq(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader record1 = PG_GETARG_HEAPTUPLEHEADER(0);
+ HeapTupleHeader record2 = PG_GETARG_HEAPTUPLEHEADER(1);
+ bool result = true;
+ Oid tupType1;
+ Oid tupType2;
+ int32 tupTypmod1;
+ int32 tupTypmod2;
+ TupleDesc tupdesc1;
+ TupleDesc tupdesc2;
+ HeapTupleData tuple1;
+ HeapTupleData tuple2;
+ int ncolumns1;
+ int ncolumns2;
+ RecordCompareData *my_extra;
+ int ncols;
+ Datum *values1;
+ Datum *values2;
+ bool *nulls1;
+ bool *nulls2;
+ int i1;
+ int i2;
+ int j;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from the tuples */
+ tupType1 = HeapTupleHeaderGetTypeId(record1);
+ tupTypmod1 = HeapTupleHeaderGetTypMod(record1);
+ tupdesc1 = lookup_rowtype_tupdesc(tupType1, tupTypmod1);
+ ncolumns1 = tupdesc1->natts;
+ tupType2 = HeapTupleHeaderGetTypeId(record2);
+ tupTypmod2 = HeapTupleHeaderGetTypMod(record2);
+ tupdesc2 = lookup_rowtype_tupdesc(tupType2, tupTypmod2);
+ ncolumns2 = tupdesc2->natts;
+
+ /* Build temporary HeapTuple control structures */
+ tuple1.t_len = HeapTupleHeaderGetDatumLength(record1);
+ ItemPointerSetInvalid(&(tuple1.t_self));
+ tuple1.t_tableOid = InvalidOid;
+ tuple1.t_data = record1;
+ tuple2.t_len = HeapTupleHeaderGetDatumLength(record2);
+ ItemPointerSetInvalid(&(tuple2.t_self));
+ tuple2.t_tableOid = InvalidOid;
+ tuple2.t_data = record2;
+
+ /*
+ * We arrange to look up the needed comparison info just once per series
+ * of calls, assuming the record types don't change underneath us.
+ */
+ ncols = Max(ncolumns1, ncolumns2);
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncols)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncols * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncols;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ my_extra->record2_type = InvalidOid;
+ my_extra->record2_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType1 ||
+ my_extra->record1_typmod != tupTypmod1 ||
+ my_extra->record2_type != tupType2 ||
+ my_extra->record2_typmod != tupTypmod2)
+ {
+ MemSet(my_extra->columns, 0, ncols * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType1;
+ my_extra->record1_typmod = tupTypmod1;
+ my_extra->record2_type = tupType2;
+ my_extra->record2_typmod = tupTypmod2;
+ }
+
+ /* Break down the tuples into fields */
+ values1 = (Datum *) palloc(ncolumns1 * sizeof(Datum));
+ nulls1 = (bool *) palloc(ncolumns1 * sizeof(bool));
+ heap_deform_tuple(&tuple1, tupdesc1, values1, nulls1);
+ values2 = (Datum *) palloc(ncolumns2 * sizeof(Datum));
+ nulls2 = (bool *) palloc(ncolumns2 * sizeof(bool));
+ heap_deform_tuple(&tuple2, tupdesc2, values2, nulls2);
+
+ /*
+ * Scan corresponding columns, allowing for dropped columns in different
+ * places in the two rows. i1 and i2 are physical column indexes, j is
+ * the logical column index.
+ */
+ i1 = i2 = j = 0;
+ while (i1 < ncolumns1 || i2 < ncolumns2)
+ {
+ LOCAL_FCINFO(locfcinfo, 2);
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+ TypeCacheEntry *typentry;
+ Oid collation;
+ bool oprresult;
+
+ /*
+ * Skip dropped columns
+ */
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
+ {
+ i1++;
+ continue;
+ }
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
+ {
+ i2++;
+ continue;
+ }
+ if (i1 >= ncolumns1 || i2 >= ncolumns2)
+ break; /* we'll deal with mismatch below loop */
+
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
+ /*
+ * Have two matching columns, they must be same type
+ */
+ if (att1->atttypid != att2->atttypid)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare dissimilar column types %s and %s at record column %d",
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
+ j + 1)));
+
+ /*
+ * If they're not same collation, we don't complain here, but the
+ * equality function might.
+ */
+ collation = att1->attcollation;
+ if (collation != att2->attcollation)
+ collation = InvalidOid;
+
+ /*
+ * Lookup the equality function if not done already
+ */
+ typentry = my_extra->columns[j].typentry;
+ if (typentry == NULL ||
+ typentry->type_id != att1->atttypid)
+ {
+ typentry = lookup_type_cache(att1->atttypid,
+ TYPECACHE_EQ_OPR_FINFO);
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(typentry->type_id))));
+ my_extra->columns[j].typentry = typentry;
+ }
+
+ /*
+ * We consider two NULLs equal; NULL > not-NULL.
+ */
+ if (!nulls1[i1] || !nulls2[i2])
+ {
+ if (nulls1[i1] || nulls2[i2])
+ {
+ result = false;
+ break;
+ }
+
+ /* Compare the pair of elements */
+ InitFunctionCallInfoData(*locfcinfo, &typentry->eq_opr_finfo, 2,
+ collation, NULL, NULL);
+ locfcinfo->args[0].value = values1[i1];
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = values2[i2];
+ locfcinfo->args[1].isnull = false;
+ oprresult = DatumGetBool(FunctionCallInvoke(locfcinfo));
+ if (locfcinfo->isnull || !oprresult)
+ {
+ result = false;
+ break;
+ }
+ }
+
+ /* equal, so continue to next column */
+ i1++, i2++, j++;
+ }
+
+ /*
+ * If we didn't break out of the loop early, check for column count
+ * mismatch. (We do not report such mismatch if we found unequal column
+ * values; is that a feature or a bug?)
+ */
+ if (result)
+ {
+ if (i1 != ncolumns1 || i2 != ncolumns2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare record types with different numbers of columns")));
+ }
+
+ pfree(values1);
+ pfree(nulls1);
+ pfree(values2);
+ pfree(nulls2);
+ ReleaseTupleDesc(tupdesc1);
+ ReleaseTupleDesc(tupdesc2);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record1, 0);
+ PG_FREE_IF_COPY(record2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+record_ne(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(!DatumGetBool(record_eq(fcinfo)));
+}
+
+Datum
+record_lt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_cmp(fcinfo) < 0);
+}
+
+Datum
+record_gt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_cmp(fcinfo) > 0);
+}
+
+Datum
+record_le(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_cmp(fcinfo) <= 0);
+}
+
+Datum
+record_ge(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_cmp(fcinfo) >= 0);
+}
+
+Datum
+btrecordcmp(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT32(record_cmp(fcinfo));
+}
+
+
+/*
+ * record_image_cmp :
+ * Internal byte-oriented comparison function for records.
+ *
+ * Returns -1, 0 or 1
+ *
+ * Note: The normal concepts of "equality" do not apply here; different
+ * representation of values considered to be equal are not considered to be
+ * identical. As an example, for the citext type 'A' and 'a' are equal, but
+ * they are not identical.
+ */
+static int
+record_image_cmp(FunctionCallInfo fcinfo)
+{
+ HeapTupleHeader record1 = PG_GETARG_HEAPTUPLEHEADER(0);
+ HeapTupleHeader record2 = PG_GETARG_HEAPTUPLEHEADER(1);
+ int result = 0;
+ Oid tupType1;
+ Oid tupType2;
+ int32 tupTypmod1;
+ int32 tupTypmod2;
+ TupleDesc tupdesc1;
+ TupleDesc tupdesc2;
+ HeapTupleData tuple1;
+ HeapTupleData tuple2;
+ int ncolumns1;
+ int ncolumns2;
+ RecordCompareData *my_extra;
+ int ncols;
+ Datum *values1;
+ Datum *values2;
+ bool *nulls1;
+ bool *nulls2;
+ int i1;
+ int i2;
+ int j;
+
+ /* Extract type info from the tuples */
+ tupType1 = HeapTupleHeaderGetTypeId(record1);
+ tupTypmod1 = HeapTupleHeaderGetTypMod(record1);
+ tupdesc1 = lookup_rowtype_tupdesc(tupType1, tupTypmod1);
+ ncolumns1 = tupdesc1->natts;
+ tupType2 = HeapTupleHeaderGetTypeId(record2);
+ tupTypmod2 = HeapTupleHeaderGetTypMod(record2);
+ tupdesc2 = lookup_rowtype_tupdesc(tupType2, tupTypmod2);
+ ncolumns2 = tupdesc2->natts;
+
+ /* Build temporary HeapTuple control structures */
+ tuple1.t_len = HeapTupleHeaderGetDatumLength(record1);
+ ItemPointerSetInvalid(&(tuple1.t_self));
+ tuple1.t_tableOid = InvalidOid;
+ tuple1.t_data = record1;
+ tuple2.t_len = HeapTupleHeaderGetDatumLength(record2);
+ ItemPointerSetInvalid(&(tuple2.t_self));
+ tuple2.t_tableOid = InvalidOid;
+ tuple2.t_data = record2;
+
+ /*
+ * We arrange to look up the needed comparison info just once per series
+ * of calls, assuming the record types don't change underneath us.
+ */
+ ncols = Max(ncolumns1, ncolumns2);
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncols)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncols * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncols;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ my_extra->record2_type = InvalidOid;
+ my_extra->record2_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType1 ||
+ my_extra->record1_typmod != tupTypmod1 ||
+ my_extra->record2_type != tupType2 ||
+ my_extra->record2_typmod != tupTypmod2)
+ {
+ MemSet(my_extra->columns, 0, ncols * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType1;
+ my_extra->record1_typmod = tupTypmod1;
+ my_extra->record2_type = tupType2;
+ my_extra->record2_typmod = tupTypmod2;
+ }
+
+ /* Break down the tuples into fields */
+ values1 = (Datum *) palloc(ncolumns1 * sizeof(Datum));
+ nulls1 = (bool *) palloc(ncolumns1 * sizeof(bool));
+ heap_deform_tuple(&tuple1, tupdesc1, values1, nulls1);
+ values2 = (Datum *) palloc(ncolumns2 * sizeof(Datum));
+ nulls2 = (bool *) palloc(ncolumns2 * sizeof(bool));
+ heap_deform_tuple(&tuple2, tupdesc2, values2, nulls2);
+
+ /*
+ * Scan corresponding columns, allowing for dropped columns in different
+ * places in the two rows. i1 and i2 are physical column indexes, j is
+ * the logical column index.
+ */
+ i1 = i2 = j = 0;
+ while (i1 < ncolumns1 || i2 < ncolumns2)
+ {
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+
+ /*
+ * Skip dropped columns
+ */
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
+ {
+ i1++;
+ continue;
+ }
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
+ {
+ i2++;
+ continue;
+ }
+ if (i1 >= ncolumns1 || i2 >= ncolumns2)
+ break; /* we'll deal with mismatch below loop */
+
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
+ /*
+ * Have two matching columns, they must be same type
+ */
+ if (att1->atttypid != att2->atttypid)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare dissimilar column types %s and %s at record column %d",
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
+ j + 1)));
+
+ /*
+ * The same type should have the same length (or both should be
+ * variable).
+ */
+ Assert(att1->attlen == att2->attlen);
+
+ /*
+ * We consider two NULLs equal; NULL > not-NULL.
+ */
+ if (!nulls1[i1] || !nulls2[i2])
+ {
+ int cmpresult = 0;
+
+ if (nulls1[i1])
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ if (nulls2[i2])
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+
+ /* Compare the pair of elements */
+ if (att1->attbyval)
+ {
+ if (values1[i1] != values2[i2])
+ cmpresult = (values1[i1] < values2[i2]) ? -1 : 1;
+ }
+ else if (att1->attlen > 0)
+ {
+ cmpresult = memcmp(DatumGetPointer(values1[i1]),
+ DatumGetPointer(values2[i2]),
+ att1->attlen);
+ }
+ else if (att1->attlen == -1)
+ {
+ Size len1,
+ len2;
+ struct varlena *arg1val;
+ struct varlena *arg2val;
+
+ len1 = toast_raw_datum_size(values1[i1]);
+ len2 = toast_raw_datum_size(values2[i2]);
+ arg1val = PG_DETOAST_DATUM_PACKED(values1[i1]);
+ arg2val = PG_DETOAST_DATUM_PACKED(values2[i2]);
+
+ cmpresult = memcmp(VARDATA_ANY(arg1val),
+ VARDATA_ANY(arg2val),
+ Min(len1, len2) - VARHDRSZ);
+ if ((cmpresult == 0) && (len1 != len2))
+ cmpresult = (len1 < len2) ? -1 : 1;
+
+ if ((Pointer) arg1val != (Pointer) values1[i1])
+ pfree(arg1val);
+ if ((Pointer) arg2val != (Pointer) values2[i2])
+ pfree(arg2val);
+ }
+ else
+ elog(ERROR, "unexpected attlen: %d", att1->attlen);
+
+ if (cmpresult < 0)
+ {
+ /* arg1 is less than arg2 */
+ result = -1;
+ break;
+ }
+ else if (cmpresult > 0)
+ {
+ /* arg1 is greater than arg2 */
+ result = 1;
+ break;
+ }
+ }
+
+ /* equal, so continue to next column */
+ i1++, i2++, j++;
+ }
+
+ /*
+ * If we didn't break out of the loop early, check for column count
+ * mismatch. (We do not report such mismatch if we found unequal column
+ * values; is that a feature or a bug?)
+ */
+ if (result == 0)
+ {
+ if (i1 != ncolumns1 || i2 != ncolumns2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare record types with different numbers of columns")));
+ }
+
+ pfree(values1);
+ pfree(nulls1);
+ pfree(values2);
+ pfree(nulls2);
+ ReleaseTupleDesc(tupdesc1);
+ ReleaseTupleDesc(tupdesc2);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record1, 0);
+ PG_FREE_IF_COPY(record2, 1);
+
+ return result;
+}
+
+/*
+ * record_image_eq :
+ * compares two records for identical contents, based on byte images
+ * result :
+ * returns true if the records are identical, false otherwise.
+ *
+ * Note: we do not use record_image_cmp here, since we can avoid
+ * de-toasting for unequal lengths this way.
+ */
+Datum
+record_image_eq(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader record1 = PG_GETARG_HEAPTUPLEHEADER(0);
+ HeapTupleHeader record2 = PG_GETARG_HEAPTUPLEHEADER(1);
+ bool result = true;
+ Oid tupType1;
+ Oid tupType2;
+ int32 tupTypmod1;
+ int32 tupTypmod2;
+ TupleDesc tupdesc1;
+ TupleDesc tupdesc2;
+ HeapTupleData tuple1;
+ HeapTupleData tuple2;
+ int ncolumns1;
+ int ncolumns2;
+ RecordCompareData *my_extra;
+ int ncols;
+ Datum *values1;
+ Datum *values2;
+ bool *nulls1;
+ bool *nulls2;
+ int i1;
+ int i2;
+ int j;
+
+ /* Extract type info from the tuples */
+ tupType1 = HeapTupleHeaderGetTypeId(record1);
+ tupTypmod1 = HeapTupleHeaderGetTypMod(record1);
+ tupdesc1 = lookup_rowtype_tupdesc(tupType1, tupTypmod1);
+ ncolumns1 = tupdesc1->natts;
+ tupType2 = HeapTupleHeaderGetTypeId(record2);
+ tupTypmod2 = HeapTupleHeaderGetTypMod(record2);
+ tupdesc2 = lookup_rowtype_tupdesc(tupType2, tupTypmod2);
+ ncolumns2 = tupdesc2->natts;
+
+ /* Build temporary HeapTuple control structures */
+ tuple1.t_len = HeapTupleHeaderGetDatumLength(record1);
+ ItemPointerSetInvalid(&(tuple1.t_self));
+ tuple1.t_tableOid = InvalidOid;
+ tuple1.t_data = record1;
+ tuple2.t_len = HeapTupleHeaderGetDatumLength(record2);
+ ItemPointerSetInvalid(&(tuple2.t_self));
+ tuple2.t_tableOid = InvalidOid;
+ tuple2.t_data = record2;
+
+ /*
+ * We arrange to look up the needed comparison info just once per series
+ * of calls, assuming the record types don't change underneath us.
+ */
+ ncols = Max(ncolumns1, ncolumns2);
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncols)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncols * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncols;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ my_extra->record2_type = InvalidOid;
+ my_extra->record2_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType1 ||
+ my_extra->record1_typmod != tupTypmod1 ||
+ my_extra->record2_type != tupType2 ||
+ my_extra->record2_typmod != tupTypmod2)
+ {
+ MemSet(my_extra->columns, 0, ncols * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType1;
+ my_extra->record1_typmod = tupTypmod1;
+ my_extra->record2_type = tupType2;
+ my_extra->record2_typmod = tupTypmod2;
+ }
+
+ /* Break down the tuples into fields */
+ values1 = (Datum *) palloc(ncolumns1 * sizeof(Datum));
+ nulls1 = (bool *) palloc(ncolumns1 * sizeof(bool));
+ heap_deform_tuple(&tuple1, tupdesc1, values1, nulls1);
+ values2 = (Datum *) palloc(ncolumns2 * sizeof(Datum));
+ nulls2 = (bool *) palloc(ncolumns2 * sizeof(bool));
+ heap_deform_tuple(&tuple2, tupdesc2, values2, nulls2);
+
+ /*
+ * Scan corresponding columns, allowing for dropped columns in different
+ * places in the two rows. i1 and i2 are physical column indexes, j is
+ * the logical column index.
+ */
+ i1 = i2 = j = 0;
+ while (i1 < ncolumns1 || i2 < ncolumns2)
+ {
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+
+ /*
+ * Skip dropped columns
+ */
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
+ {
+ i1++;
+ continue;
+ }
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
+ {
+ i2++;
+ continue;
+ }
+ if (i1 >= ncolumns1 || i2 >= ncolumns2)
+ break; /* we'll deal with mismatch below loop */
+
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
+ /*
+ * Have two matching columns, they must be same type
+ */
+ if (att1->atttypid != att2->atttypid)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare dissimilar column types %s and %s at record column %d",
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
+ j + 1)));
+
+ /*
+ * We consider two NULLs equal; NULL > not-NULL.
+ */
+ if (!nulls1[i1] || !nulls2[i2])
+ {
+ if (nulls1[i1] || nulls2[i2])
+ {
+ result = false;
+ break;
+ }
+
+ /* Compare the pair of elements */
+ result = datum_image_eq(values1[i1], values2[i2], att1->attbyval, att2->attlen);
+ if (!result)
+ break;
+ }
+
+ /* equal, so continue to next column */
+ i1++, i2++, j++;
+ }
+
+ /*
+ * If we didn't break out of the loop early, check for column count
+ * mismatch. (We do not report such mismatch if we found unequal column
+ * values; is that a feature or a bug?)
+ */
+ if (result)
+ {
+ if (i1 != ncolumns1 || i2 != ncolumns2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("cannot compare record types with different numbers of columns")));
+ }
+
+ pfree(values1);
+ pfree(nulls1);
+ pfree(values2);
+ pfree(nulls2);
+ ReleaseTupleDesc(tupdesc1);
+ ReleaseTupleDesc(tupdesc2);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record1, 0);
+ PG_FREE_IF_COPY(record2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+record_image_ne(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(!DatumGetBool(record_image_eq(fcinfo)));
+}
+
+Datum
+record_image_lt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_image_cmp(fcinfo) < 0);
+}
+
+Datum
+record_image_gt(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_image_cmp(fcinfo) > 0);
+}
+
+Datum
+record_image_le(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_image_cmp(fcinfo) <= 0);
+}
+
+Datum
+record_image_ge(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(record_image_cmp(fcinfo) >= 0);
+}
+
+Datum
+btrecordimagecmp(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_INT32(record_image_cmp(fcinfo));
+}
+
+
+/*
+ * Row type hash functions
+ */
+
+Datum
+hash_record(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader record = PG_GETARG_HEAPTUPLEHEADER(0);
+ uint32 result = 0;
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tuple;
+ int ncolumns;
+ RecordCompareData *my_extra;
+ Datum *values;
+ bool *nulls;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from tuple */
+ tupType = HeapTupleHeaderGetTypeId(record);
+ tupTypmod = HeapTupleHeaderGetTypMod(record);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /* Build temporary HeapTuple control structure */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(record);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = record;
+
+ /*
+ * We arrange to look up the needed hashing info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncolumns * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncolumns;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType ||
+ my_extra->record1_typmod != tupTypmod)
+ {
+ MemSet(my_extra->columns, 0, ncolumns * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType;
+ my_extra->record1_typmod = tupTypmod;
+ }
+
+ /* Break down the tuple into fields */
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+ heap_deform_tuple(&tuple, tupdesc, values, nulls);
+
+ for (int i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att;
+ TypeCacheEntry *typentry;
+ uint32 element_hash;
+
+ att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+
+ /*
+ * Lookup the hash function if not done already
+ */
+ typentry = my_extra->columns[i].typentry;
+ if (typentry == NULL ||
+ typentry->type_id != att->atttypid)
+ {
+ typentry = lookup_type_cache(att->atttypid,
+ TYPECACHE_HASH_PROC_FINFO);
+ if (!OidIsValid(typentry->hash_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify a hash function for type %s",
+ format_type_be(typentry->type_id))));
+ my_extra->columns[i].typentry = typentry;
+ }
+
+ /* Compute hash of element */
+ if (nulls[i])
+ {
+ element_hash = 0;
+ }
+ else
+ {
+ LOCAL_FCINFO(locfcinfo, 1);
+
+ InitFunctionCallInfoData(*locfcinfo, &typentry->hash_proc_finfo, 1,
+ att->attcollation, NULL, NULL);
+ locfcinfo->args[0].value = values[i];
+ locfcinfo->args[0].isnull = false;
+ element_hash = DatumGetUInt32(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect hash support functions to return null */
+ Assert(!locfcinfo->isnull);
+ }
+
+ /* see hash_array() */
+ result = (result << 5) - result + element_hash;
+ }
+
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record, 0);
+
+ PG_RETURN_UINT32(result);
+}
+
+Datum
+hash_record_extended(PG_FUNCTION_ARGS)
+{
+ HeapTupleHeader record = PG_GETARG_HEAPTUPLEHEADER(0);
+ uint64 seed = PG_GETARG_INT64(1);
+ uint64 result = 0;
+ Oid tupType;
+ int32 tupTypmod;
+ TupleDesc tupdesc;
+ HeapTupleData tuple;
+ int ncolumns;
+ RecordCompareData *my_extra;
+ Datum *values;
+ bool *nulls;
+
+ check_stack_depth(); /* recurses for record-type columns */
+
+ /* Extract type info from tuple */
+ tupType = HeapTupleHeaderGetTypeId(record);
+ tupTypmod = HeapTupleHeaderGetTypMod(record);
+ tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
+ ncolumns = tupdesc->natts;
+
+ /* Build temporary HeapTuple control structure */
+ tuple.t_len = HeapTupleHeaderGetDatumLength(record);
+ ItemPointerSetInvalid(&(tuple.t_self));
+ tuple.t_tableOid = InvalidOid;
+ tuple.t_data = record;
+
+ /*
+ * We arrange to look up the needed hashing info just once per series of
+ * calls, assuming the record type doesn't change underneath us.
+ */
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL ||
+ my_extra->ncolumns < ncolumns)
+ {
+ fcinfo->flinfo->fn_extra =
+ MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ offsetof(RecordCompareData, columns) +
+ ncolumns * sizeof(ColumnCompareData));
+ my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
+ my_extra->ncolumns = ncolumns;
+ my_extra->record1_type = InvalidOid;
+ my_extra->record1_typmod = 0;
+ }
+
+ if (my_extra->record1_type != tupType ||
+ my_extra->record1_typmod != tupTypmod)
+ {
+ MemSet(my_extra->columns, 0, ncolumns * sizeof(ColumnCompareData));
+ my_extra->record1_type = tupType;
+ my_extra->record1_typmod = tupTypmod;
+ }
+
+ /* Break down the tuple into fields */
+ values = (Datum *) palloc(ncolumns * sizeof(Datum));
+ nulls = (bool *) palloc(ncolumns * sizeof(bool));
+ heap_deform_tuple(&tuple, tupdesc, values, nulls);
+
+ for (int i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute att;
+ TypeCacheEntry *typentry;
+ uint64 element_hash;
+
+ att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+
+ /*
+ * Lookup the hash function if not done already
+ */
+ typentry = my_extra->columns[i].typentry;
+ if (typentry == NULL ||
+ typentry->type_id != att->atttypid)
+ {
+ typentry = lookup_type_cache(att->atttypid,
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO);
+ if (!OidIsValid(typentry->hash_extended_proc_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an extended hash function for type %s",
+ format_type_be(typentry->type_id))));
+ my_extra->columns[i].typentry = typentry;
+ }
+
+ /* Compute hash of element */
+ if (nulls[i])
+ {
+ element_hash = 0;
+ }
+ else
+ {
+ LOCAL_FCINFO(locfcinfo, 2);
+
+ InitFunctionCallInfoData(*locfcinfo, &typentry->hash_extended_proc_finfo, 2,
+ att->attcollation, NULL, NULL);
+ locfcinfo->args[0].value = values[i];
+ locfcinfo->args[0].isnull = false;
+ locfcinfo->args[1].value = Int64GetDatum(seed);
+ locfcinfo->args[0].isnull = false;
+ element_hash = DatumGetUInt64(FunctionCallInvoke(locfcinfo));
+
+ /* We don't expect hash support functions to return null */
+ Assert(!locfcinfo->isnull);
+ }
+
+ /* see hash_array_extended() */
+ result = (result << 5) - result + element_hash;
+ }
+
+ pfree(values);
+ pfree(nulls);
+ ReleaseTupleDesc(tupdesc);
+
+ /* Avoid leaking memory when handed toasted input. */
+ PG_FREE_IF_COPY(record, 0);
+
+ PG_RETURN_UINT64(result);
+}
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
new file mode 100644
index 0000000..a1c1831
--- /dev/null
+++ b/src/backend/utils/adt/ruleutils.c
@@ -0,0 +1,12406 @@
+/*-------------------------------------------------------------------------
+ *
+ * ruleutils.c
+ * Functions to convert stored expressions/querytrees back to
+ * source text
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/ruleutils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "access/amapi.h"
+#include "access/htup_details.h"
+#include "access/relation.h"
+#include "access/sysattr.h"
+#include "access/table.h"
+#include "catalog/pg_aggregate.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_depend.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_partitioned_table.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_statistic_ext.h"
+#include "catalog/pg_trigger.h"
+#include "catalog/pg_type.h"
+#include "commands/defrem.h"
+#include "commands/tablespace.h"
+#include "common/keywords.h"
+#include "executor/spi.h"
+#include "funcapi.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/pathnodes.h"
+#include "optimizer/optimizer.h"
+#include "parser/parse_agg.h"
+#include "parser/parse_func.h"
+#include "parser/parse_node.h"
+#include "parser/parse_oper.h"
+#include "parser/parse_relation.h"
+#include "parser/parser.h"
+#include "parser/parsetree.h"
+#include "rewrite/rewriteHandler.h"
+#include "rewrite/rewriteManip.h"
+#include "rewrite/rewriteSupport.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/guc.h"
+#include "utils/hsearch.h"
+#include "utils/lsyscache.h"
+#include "utils/partcache.h"
+#include "utils/rel.h"
+#include "utils/ruleutils.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+#include "utils/varlena.h"
+#include "utils/xml.h"
+
+/* ----------
+ * Pretty formatting constants
+ * ----------
+ */
+
+/* Indent counts */
+#define PRETTYINDENT_STD 8
+#define PRETTYINDENT_JOIN 4
+#define PRETTYINDENT_VAR 4
+
+#define PRETTYINDENT_LIMIT 40 /* wrap limit */
+
+/* Pretty flags */
+#define PRETTYFLAG_PAREN 0x0001
+#define PRETTYFLAG_INDENT 0x0002
+#define PRETTYFLAG_SCHEMA 0x0004
+
+/* Standard conversion of a "bool pretty" option to detailed flags */
+#define GET_PRETTY_FLAGS(pretty) \
+ ((pretty) ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT | PRETTYFLAG_SCHEMA) \
+ : PRETTYFLAG_INDENT)
+
+/* Default line length for pretty-print wrapping: 0 means wrap always */
+#define WRAP_COLUMN_DEFAULT 0
+
+/* macros to test if pretty action needed */
+#define PRETTY_PAREN(context) ((context)->prettyFlags & PRETTYFLAG_PAREN)
+#define PRETTY_INDENT(context) ((context)->prettyFlags & PRETTYFLAG_INDENT)
+#define PRETTY_SCHEMA(context) ((context)->prettyFlags & PRETTYFLAG_SCHEMA)
+
+
+/* ----------
+ * Local data types
+ * ----------
+ */
+
+/* Context info needed for invoking a recursive querytree display routine */
+typedef struct
+{
+ StringInfo buf; /* output buffer to append to */
+ List *namespaces; /* List of deparse_namespace nodes */
+ List *windowClause; /* Current query level's WINDOW clause */
+ List *windowTList; /* targetlist for resolving WINDOW clause */
+ int prettyFlags; /* enabling of pretty-print functions */
+ int wrapColumn; /* max line length, or -1 for no limit */
+ int indentLevel; /* current indent level for pretty-print */
+ bool varprefix; /* true to print prefixes on Vars */
+ ParseExprKind special_exprkind; /* set only for exprkinds needing special
+ * handling */
+ Bitmapset *appendparents; /* if not null, map child Vars of these relids
+ * back to the parent rel */
+} deparse_context;
+
+/*
+ * Each level of query context around a subtree needs a level of Var namespace.
+ * A Var having varlevelsup=N refers to the N'th item (counting from 0) in
+ * the current context's namespaces list.
+ *
+ * rtable is the list of actual RTEs from the Query or PlannedStmt.
+ * rtable_names holds the alias name to be used for each RTE (either a C
+ * string, or NULL for nameless RTEs such as unnamed joins).
+ * rtable_columns holds the column alias names to be used for each RTE.
+ *
+ * subplans is a list of Plan trees for SubPlans and CTEs (it's only used
+ * in the PlannedStmt case).
+ * ctes is a list of CommonTableExpr nodes (only used in the Query case).
+ * appendrels, if not null (it's only used in the PlannedStmt case), is an
+ * array of AppendRelInfo nodes, indexed by child relid. We use that to map
+ * child-table Vars to their inheritance parents.
+ *
+ * In some cases we need to make names of merged JOIN USING columns unique
+ * across the whole query, not only per-RTE. If so, unique_using is true
+ * and using_names is a list of C strings representing names already assigned
+ * to USING columns.
+ *
+ * When deparsing plan trees, there is always just a single item in the
+ * deparse_namespace list (since a plan tree never contains Vars with
+ * varlevelsup > 0). We store the Plan node that is the immediate
+ * parent of the expression to be deparsed, as well as a list of that
+ * Plan's ancestors. In addition, we store its outer and inner subplan nodes,
+ * as well as their targetlists, and the index tlist if the current plan node
+ * might contain INDEX_VAR Vars. (These fields could be derived on-the-fly
+ * from the current Plan node, but it seems notationally clearer to set them
+ * up as separate fields.)
+ */
+typedef struct
+{
+ List *rtable; /* List of RangeTblEntry nodes */
+ List *rtable_names; /* Parallel list of names for RTEs */
+ List *rtable_columns; /* Parallel list of deparse_columns structs */
+ List *subplans; /* List of Plan trees for SubPlans */
+ List *ctes; /* List of CommonTableExpr nodes */
+ AppendRelInfo **appendrels; /* Array of AppendRelInfo nodes, or NULL */
+ /* Workspace for column alias assignment: */
+ bool unique_using; /* Are we making USING names globally unique */
+ List *using_names; /* List of assigned names for USING columns */
+ /* Remaining fields are used only when deparsing a Plan tree: */
+ Plan *plan; /* immediate parent of current expression */
+ List *ancestors; /* ancestors of plan */
+ Plan *outer_plan; /* outer subnode, or NULL if none */
+ Plan *inner_plan; /* inner subnode, or NULL if none */
+ List *outer_tlist; /* referent for OUTER_VAR Vars */
+ List *inner_tlist; /* referent for INNER_VAR Vars */
+ List *index_tlist; /* referent for INDEX_VAR Vars */
+ /* Special namespace representing a function signature: */
+ char *funcname;
+ int numargs;
+ char **argnames;
+} deparse_namespace;
+
+/*
+ * Per-relation data about column alias names.
+ *
+ * Selecting aliases is unreasonably complicated because of the need to dump
+ * rules/views whose underlying tables may have had columns added, deleted, or
+ * renamed since the query was parsed. We must nonetheless print the rule/view
+ * in a form that can be reloaded and will produce the same results as before.
+ *
+ * For each RTE used in the query, we must assign column aliases that are
+ * unique within that RTE. SQL does not require this of the original query,
+ * but due to factors such as *-expansion we need to be able to uniquely
+ * reference every column in a decompiled query. As long as we qualify all
+ * column references, per-RTE uniqueness is sufficient for that.
+ *
+ * However, we can't ensure per-column name uniqueness for unnamed join RTEs,
+ * since they just inherit column names from their input RTEs, and we can't
+ * rename the columns at the join level. Most of the time this isn't an issue
+ * because we don't need to reference the join's output columns as such; we
+ * can reference the input columns instead. That approach can fail for merged
+ * JOIN USING columns, however, so when we have one of those in an unnamed
+ * join, we have to make that column's alias globally unique across the whole
+ * query to ensure it can be referenced unambiguously.
+ *
+ * Another problem is that a JOIN USING clause requires the columns to be
+ * merged to have the same aliases in both input RTEs, and that no other
+ * columns in those RTEs or their children conflict with the USING names.
+ * To handle that, we do USING-column alias assignment in a recursive
+ * traversal of the query's jointree. When descending through a JOIN with
+ * USING, we preassign the USING column names to the child columns, overriding
+ * other rules for column alias assignment. We also mark each RTE with a list
+ * of all USING column names selected for joins containing that RTE, so that
+ * when we assign other columns' aliases later, we can avoid conflicts.
+ *
+ * Another problem is that if a JOIN's input tables have had columns added or
+ * deleted since the query was parsed, we must generate a column alias list
+ * for the join that matches the current set of input columns --- otherwise, a
+ * change in the number of columns in the left input would throw off matching
+ * of aliases to columns of the right input. Thus, positions in the printable
+ * column alias list are not necessarily one-for-one with varattnos of the
+ * JOIN, so we need a separate new_colnames[] array for printing purposes.
+ */
+typedef struct
+{
+ /*
+ * colnames is an array containing column aliases to use for columns that
+ * existed when the query was parsed. Dropped columns have NULL entries.
+ * This array can be directly indexed by varattno to get a Var's name.
+ *
+ * Non-NULL entries are guaranteed unique within the RTE, *except* when
+ * this is for an unnamed JOIN RTE. In that case we merely copy up names
+ * from the two input RTEs.
+ *
+ * During the recursive descent in set_using_names(), forcible assignment
+ * of a child RTE's column name is represented by pre-setting that element
+ * of the child's colnames array. So at that stage, NULL entries in this
+ * array just mean that no name has been preassigned, not necessarily that
+ * the column is dropped.
+ */
+ int num_cols; /* length of colnames[] array */
+ char **colnames; /* array of C strings and NULLs */
+
+ /*
+ * new_colnames is an array containing column aliases to use for columns
+ * that would exist if the query was re-parsed against the current
+ * definitions of its base tables. This is what to print as the column
+ * alias list for the RTE. This array does not include dropped columns,
+ * but it will include columns added since original parsing. Indexes in
+ * it therefore have little to do with current varattno values. As above,
+ * entries are unique unless this is for an unnamed JOIN RTE. (In such an
+ * RTE, we never actually print this array, but we must compute it anyway
+ * for possible use in computing column names of upper joins.) The
+ * parallel array is_new_col marks which of these columns are new since
+ * original parsing. Entries with is_new_col false must match the
+ * non-NULL colnames entries one-for-one.
+ */
+ int num_new_cols; /* length of new_colnames[] array */
+ char **new_colnames; /* array of C strings */
+ bool *is_new_col; /* array of bool flags */
+
+ /* This flag tells whether we should actually print a column alias list */
+ bool printaliases;
+
+ /* This list has all names used as USING names in joins above this RTE */
+ List *parentUsing; /* names assigned to parent merged columns */
+
+ /*
+ * If this struct is for a JOIN RTE, we fill these fields during the
+ * set_using_names() pass to describe its relationship to its child RTEs.
+ *
+ * leftattnos and rightattnos are arrays with one entry per existing
+ * output column of the join (hence, indexable by join varattno). For a
+ * simple reference to a column of the left child, leftattnos[i] is the
+ * child RTE's attno and rightattnos[i] is zero; and conversely for a
+ * column of the right child. But for merged columns produced by JOIN
+ * USING/NATURAL JOIN, both leftattnos[i] and rightattnos[i] are nonzero.
+ * Note that a simple reference might be to a child RTE column that's been
+ * dropped; but that's OK since the column could not be used in the query.
+ *
+ * If it's a JOIN USING, usingNames holds the alias names selected for the
+ * merged columns (these might be different from the original USING list,
+ * if we had to modify names to achieve uniqueness).
+ */
+ int leftrti; /* rangetable index of left child */
+ int rightrti; /* rangetable index of right child */
+ int *leftattnos; /* left-child varattnos of join cols, or 0 */
+ int *rightattnos; /* right-child varattnos of join cols, or 0 */
+ List *usingNames; /* names assigned to merged columns */
+} deparse_columns;
+
+/* This macro is analogous to rt_fetch(), but for deparse_columns structs */
+#define deparse_columns_fetch(rangetable_index, dpns) \
+ ((deparse_columns *) list_nth((dpns)->rtable_columns, (rangetable_index)-1))
+
+/*
+ * Entry in set_rtable_names' hash table
+ */
+typedef struct
+{
+ char name[NAMEDATALEN]; /* Hash key --- must be first */
+ int counter; /* Largest addition used so far for name */
+} NameHashEntry;
+
+/* Callback signature for resolve_special_varno() */
+typedef void (*rsv_callback) (Node *node, deparse_context *context,
+ void *callback_arg);
+
+
+/* ----------
+ * Global data
+ * ----------
+ */
+static SPIPlanPtr plan_getrulebyoid = NULL;
+static const char *query_getrulebyoid = "SELECT * FROM pg_catalog.pg_rewrite WHERE oid = $1";
+static SPIPlanPtr plan_getviewrule = NULL;
+static const char *query_getviewrule = "SELECT * FROM pg_catalog.pg_rewrite WHERE ev_class = $1 AND rulename = $2";
+
+/* GUC parameters */
+bool quote_all_identifiers = false;
+
+
+/* ----------
+ * Local functions
+ *
+ * Most of these functions used to use fixed-size buffers to build their
+ * results. Now, they take an (already initialized) StringInfo object
+ * as a parameter, and append their text output to its contents.
+ * ----------
+ */
+static char *deparse_expression_pretty(Node *expr, List *dpcontext,
+ bool forceprefix, bool showimplicit,
+ int prettyFlags, int startIndent);
+static char *pg_get_viewdef_worker(Oid viewoid,
+ int prettyFlags, int wrapColumn);
+static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
+static int decompile_column_index_array(Datum column_index_array, Oid relId,
+ StringInfo buf);
+static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
+static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
+ const Oid *excludeOps,
+ bool attrsOnly, bool keysOnly,
+ bool showTblSpc, bool inherits,
+ int prettyFlags, bool missing_ok);
+static char *pg_get_statisticsobj_worker(Oid statextid, bool columns_only,
+ bool missing_ok);
+static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags,
+ bool attrsOnly, bool missing_ok);
+static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
+ int prettyFlags, bool missing_ok);
+static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname,
+ int prettyFlags);
+static int print_function_arguments(StringInfo buf, HeapTuple proctup,
+ bool print_table_args, bool print_defaults);
+static void print_function_rettype(StringInfo buf, HeapTuple proctup);
+static void print_function_trftypes(StringInfo buf, HeapTuple proctup);
+static void print_function_sqlbody(StringInfo buf, HeapTuple proctup);
+static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces,
+ Bitmapset *rels_used);
+static void set_deparse_for_query(deparse_namespace *dpns, Query *query,
+ List *parent_namespaces);
+static void set_simple_column_names(deparse_namespace *dpns);
+static bool has_dangerous_join_using(deparse_namespace *dpns, Node *jtnode);
+static void set_using_names(deparse_namespace *dpns, Node *jtnode,
+ List *parentUsing);
+static void set_relation_column_names(deparse_namespace *dpns,
+ RangeTblEntry *rte,
+ deparse_columns *colinfo);
+static void set_join_column_names(deparse_namespace *dpns, RangeTblEntry *rte,
+ deparse_columns *colinfo);
+static bool colname_is_unique(const char *colname, deparse_namespace *dpns,
+ deparse_columns *colinfo);
+static char *make_colname_unique(char *colname, deparse_namespace *dpns,
+ deparse_columns *colinfo);
+static void expand_colnames_array_to(deparse_columns *colinfo, int n);
+static void identify_join_columns(JoinExpr *j, RangeTblEntry *jrte,
+ deparse_columns *colinfo);
+static char *get_rtable_name(int rtindex, deparse_context *context);
+static void set_deparse_plan(deparse_namespace *dpns, Plan *plan);
+static Plan *find_recursive_union(deparse_namespace *dpns,
+ WorkTableScan *wtscan);
+static void push_child_plan(deparse_namespace *dpns, Plan *plan,
+ deparse_namespace *save_dpns);
+static void pop_child_plan(deparse_namespace *dpns,
+ deparse_namespace *save_dpns);
+static void push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell,
+ deparse_namespace *save_dpns);
+static void pop_ancestor_plan(deparse_namespace *dpns,
+ deparse_namespace *save_dpns);
+static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
+ int prettyFlags);
+static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
+ int prettyFlags, int wrapColumn);
+static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,
+ TupleDesc resultDesc, bool colNamesVisible,
+ int prettyFlags, int wrapColumn, int startIndent);
+static void get_values_def(List *values_lists, deparse_context *context);
+static void get_with_clause(Query *query, deparse_context *context);
+static void get_select_query_def(Query *query, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible);
+static void get_insert_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
+static void get_update_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
+static void get_update_query_targetlist_def(Query *query, List *targetList,
+ deparse_context *context,
+ RangeTblEntry *rte);
+static void get_delete_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
+static void get_merge_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
+static void get_utility_query_def(Query *query, deparse_context *context);
+static void get_basic_select_query(Query *query, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible);
+static void get_target_list(List *targetList, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible);
+static void get_setop_query(Node *setOp, Query *query,
+ deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible);
+static Node *get_rule_sortgroupclause(Index ref, List *tlist,
+ bool force_colno,
+ deparse_context *context);
+static void get_rule_groupingset(GroupingSet *gset, List *targetlist,
+ bool omit_parens, deparse_context *context);
+static void get_rule_orderby(List *orderList, List *targetList,
+ bool force_colno, deparse_context *context);
+static void get_rule_windowclause(Query *query, deparse_context *context);
+static void get_rule_windowspec(WindowClause *wc, List *targetList,
+ deparse_context *context);
+static char *get_variable(Var *var, int levelsup, bool istoplevel,
+ deparse_context *context);
+static void get_special_variable(Node *node, deparse_context *context,
+ void *callback_arg);
+static void resolve_special_varno(Node *node, deparse_context *context,
+ rsv_callback callback, void *callback_arg);
+static Node *find_param_referent(Param *param, deparse_context *context,
+ deparse_namespace **dpns_p, ListCell **ancestor_cell_p);
+static void get_parameter(Param *param, deparse_context *context);
+static const char *get_simple_binary_op_name(OpExpr *expr);
+static bool isSimpleNode(Node *node, Node *parentNode, int prettyFlags);
+static void appendContextKeyword(deparse_context *context, const char *str,
+ int indentBefore, int indentAfter, int indentPlus);
+static void removeStringInfoSpaces(StringInfo str);
+static void get_rule_expr(Node *node, deparse_context *context,
+ bool showimplicit);
+static void get_rule_expr_toplevel(Node *node, deparse_context *context,
+ bool showimplicit);
+static void get_rule_list_toplevel(List *lst, deparse_context *context,
+ bool showimplicit);
+static void get_rule_expr_funccall(Node *node, deparse_context *context,
+ bool showimplicit);
+static bool looks_like_function(Node *node);
+static void get_oper_expr(OpExpr *expr, deparse_context *context);
+static void get_func_expr(FuncExpr *expr, deparse_context *context,
+ bool showimplicit);
+static void get_agg_expr(Aggref *aggref, deparse_context *context,
+ Aggref *original_aggref);
+static void get_agg_combine_expr(Node *node, deparse_context *context,
+ void *callback_arg);
+static void get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context);
+static bool get_func_sql_syntax(FuncExpr *expr, deparse_context *context);
+static void get_coercion_expr(Node *arg, deparse_context *context,
+ Oid resulttype, int32 resulttypmod,
+ Node *parentNode);
+static void get_const_expr(Const *constval, deparse_context *context,
+ int showtype);
+static void get_const_collation(Const *constval, deparse_context *context);
+static void simple_quote_literal(StringInfo buf, const char *val);
+static void get_sublink_expr(SubLink *sublink, deparse_context *context);
+static void get_tablefunc(TableFunc *tf, deparse_context *context,
+ bool showimplicit);
+static void get_from_clause(Query *query, const char *prefix,
+ deparse_context *context);
+static void get_from_clause_item(Node *jtnode, Query *query,
+ deparse_context *context);
+static void get_rte_alias(RangeTblEntry *rte, int varno, bool use_as,
+ deparse_context *context);
+static void get_column_alias_list(deparse_columns *colinfo,
+ deparse_context *context);
+static void get_from_clause_coldeflist(RangeTblFunction *rtfunc,
+ deparse_columns *colinfo,
+ deparse_context *context);
+static void get_tablesample_def(TableSampleClause *tablesample,
+ deparse_context *context);
+static void get_opclass_name(Oid opclass, Oid actual_datatype,
+ StringInfo buf);
+static Node *processIndirection(Node *node, deparse_context *context);
+static void printSubscripts(SubscriptingRef *sbsref, deparse_context *context);
+static char *get_relation_name(Oid relid);
+static char *generate_relation_name(Oid relid, List *namespaces);
+static char *generate_qualified_relation_name(Oid relid);
+static char *generate_function_name(Oid funcid, int nargs,
+ List *argnames, Oid *argtypes,
+ bool has_variadic, bool *use_variadic_p,
+ ParseExprKind special_exprkind);
+static char *generate_operator_name(Oid operid, Oid arg1, Oid arg2);
+static void add_cast_to(StringInfo buf, Oid typid);
+static char *generate_qualified_type_name(Oid typid);
+static text *string_to_text(char *str);
+static char *flatten_reloptions(Oid relid);
+static void get_reloptions(StringInfo buf, Datum reloptions);
+
+#define only_marker(rte) ((rte)->inh ? "" : "ONLY ")
+
+
+/* ----------
+ * pg_get_ruledef - Do it all and return a text
+ * that could be used as a statement
+ * to recreate the rule
+ * ----------
+ */
+Datum
+pg_get_ruledef(PG_FUNCTION_ARGS)
+{
+ Oid ruleoid = PG_GETARG_OID(0);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ res = pg_get_ruledef_worker(ruleoid, prettyFlags);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+
+Datum
+pg_get_ruledef_ext(PG_FUNCTION_ARGS)
+{
+ Oid ruleoid = PG_GETARG_OID(0);
+ bool pretty = PG_GETARG_BOOL(1);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ res = pg_get_ruledef_worker(ruleoid, prettyFlags);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+
+static char *
+pg_get_ruledef_worker(Oid ruleoid, int prettyFlags)
+{
+ Datum args[1];
+ char nulls[1];
+ int spirc;
+ HeapTuple ruletup;
+ TupleDesc rulettc;
+ StringInfoData buf;
+
+ /*
+ * Do this first so that string is alloc'd in outer context not SPI's.
+ */
+ initStringInfo(&buf);
+
+ /*
+ * Connect to SPI manager
+ */
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * On the first call prepare the plan to lookup pg_rewrite. We read
+ * pg_rewrite over the SPI manager instead of using the syscache to be
+ * checked for read access on pg_rewrite.
+ */
+ if (plan_getrulebyoid == NULL)
+ {
+ Oid argtypes[1];
+ SPIPlanPtr plan;
+
+ argtypes[0] = OIDOID;
+ plan = SPI_prepare(query_getrulebyoid, 1, argtypes);
+ if (plan == NULL)
+ elog(ERROR, "SPI_prepare failed for \"%s\"", query_getrulebyoid);
+ SPI_keepplan(plan);
+ plan_getrulebyoid = plan;
+ }
+
+ /*
+ * Get the pg_rewrite tuple for this rule
+ */
+ args[0] = ObjectIdGetDatum(ruleoid);
+ nulls[0] = ' ';
+ spirc = SPI_execute_plan(plan_getrulebyoid, args, nulls, true, 0);
+ if (spirc != SPI_OK_SELECT)
+ elog(ERROR, "failed to get pg_rewrite tuple for rule %u", ruleoid);
+ if (SPI_processed != 1)
+ {
+ /*
+ * There is no tuple data available here, just keep the output buffer
+ * empty.
+ */
+ }
+ else
+ {
+ /*
+ * Get the rule's definition and put it into executor's memory
+ */
+ ruletup = SPI_tuptable->vals[0];
+ rulettc = SPI_tuptable->tupdesc;
+ make_ruledef(&buf, ruletup, rulettc, prettyFlags);
+ }
+
+ /*
+ * Disconnect from SPI manager
+ */
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ if (buf.len == 0)
+ return NULL;
+
+ return buf.data;
+}
+
+
+/* ----------
+ * pg_get_viewdef - Mainly the same thing, but we
+ * only return the SELECT part of a view
+ * ----------
+ */
+Datum
+pg_get_viewdef(PG_FUNCTION_ARGS)
+{
+ /* By OID */
+ Oid viewoid = PG_GETARG_OID(0);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ res = pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+
+Datum
+pg_get_viewdef_ext(PG_FUNCTION_ARGS)
+{
+ /* By OID */
+ Oid viewoid = PG_GETARG_OID(0);
+ bool pretty = PG_GETARG_BOOL(1);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ res = pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+Datum
+pg_get_viewdef_wrap(PG_FUNCTION_ARGS)
+{
+ /* By OID */
+ Oid viewoid = PG_GETARG_OID(0);
+ int wrap = PG_GETARG_INT32(1);
+ int prettyFlags;
+ char *res;
+
+ /* calling this implies we want pretty printing */
+ prettyFlags = GET_PRETTY_FLAGS(true);
+
+ res = pg_get_viewdef_worker(viewoid, prettyFlags, wrap);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+Datum
+pg_get_viewdef_name(PG_FUNCTION_ARGS)
+{
+ /* By qualified name */
+ text *viewname = PG_GETARG_TEXT_PP(0);
+ int prettyFlags;
+ RangeVar *viewrel;
+ Oid viewoid;
+ char *res;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ /* Look up view name. Can't lock it - we might not have privileges. */
+ viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname));
+ viewoid = RangeVarGetRelid(viewrel, NoLock, false);
+
+ res = pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+
+Datum
+pg_get_viewdef_name_ext(PG_FUNCTION_ARGS)
+{
+ /* By qualified name */
+ text *viewname = PG_GETARG_TEXT_PP(0);
+ bool pretty = PG_GETARG_BOOL(1);
+ int prettyFlags;
+ RangeVar *viewrel;
+ Oid viewoid;
+ char *res;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ /* Look up view name. Can't lock it - we might not have privileges. */
+ viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname));
+ viewoid = RangeVarGetRelid(viewrel, NoLock, false);
+
+ res = pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/*
+ * Common code for by-OID and by-name variants of pg_get_viewdef
+ */
+static char *
+pg_get_viewdef_worker(Oid viewoid, int prettyFlags, int wrapColumn)
+{
+ Datum args[2];
+ char nulls[2];
+ int spirc;
+ HeapTuple ruletup;
+ TupleDesc rulettc;
+ StringInfoData buf;
+
+ /*
+ * Do this first so that string is alloc'd in outer context not SPI's.
+ */
+ initStringInfo(&buf);
+
+ /*
+ * Connect to SPI manager
+ */
+ if (SPI_connect() != SPI_OK_CONNECT)
+ elog(ERROR, "SPI_connect failed");
+
+ /*
+ * On the first call prepare the plan to lookup pg_rewrite. We read
+ * pg_rewrite over the SPI manager instead of using the syscache to be
+ * checked for read access on pg_rewrite.
+ */
+ if (plan_getviewrule == NULL)
+ {
+ Oid argtypes[2];
+ SPIPlanPtr plan;
+
+ argtypes[0] = OIDOID;
+ argtypes[1] = NAMEOID;
+ plan = SPI_prepare(query_getviewrule, 2, argtypes);
+ if (plan == NULL)
+ elog(ERROR, "SPI_prepare failed for \"%s\"", query_getviewrule);
+ SPI_keepplan(plan);
+ plan_getviewrule = plan;
+ }
+
+ /*
+ * Get the pg_rewrite tuple for the view's SELECT rule
+ */
+ args[0] = ObjectIdGetDatum(viewoid);
+ args[1] = DirectFunctionCall1(namein, CStringGetDatum(ViewSelectRuleName));
+ nulls[0] = ' ';
+ nulls[1] = ' ';
+ spirc = SPI_execute_plan(plan_getviewrule, args, nulls, true, 0);
+ if (spirc != SPI_OK_SELECT)
+ elog(ERROR, "failed to get pg_rewrite tuple for view %u", viewoid);
+ if (SPI_processed != 1)
+ {
+ /*
+ * There is no tuple data available here, just keep the output buffer
+ * empty.
+ */
+ }
+ else
+ {
+ /*
+ * Get the rule's definition and put it into executor's memory
+ */
+ ruletup = SPI_tuptable->vals[0];
+ rulettc = SPI_tuptable->tupdesc;
+ make_viewdef(&buf, ruletup, rulettc, prettyFlags, wrapColumn);
+ }
+
+ /*
+ * Disconnect from SPI manager
+ */
+ if (SPI_finish() != SPI_OK_FINISH)
+ elog(ERROR, "SPI_finish failed");
+
+ if (buf.len == 0)
+ return NULL;
+
+ return buf.data;
+}
+
+/* ----------
+ * pg_get_triggerdef - Get the definition of a trigger
+ * ----------
+ */
+Datum
+pg_get_triggerdef(PG_FUNCTION_ARGS)
+{
+ Oid trigid = PG_GETARG_OID(0);
+ char *res;
+
+ res = pg_get_triggerdef_worker(trigid, false);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+Datum
+pg_get_triggerdef_ext(PG_FUNCTION_ARGS)
+{
+ Oid trigid = PG_GETARG_OID(0);
+ bool pretty = PG_GETARG_BOOL(1);
+ char *res;
+
+ res = pg_get_triggerdef_worker(trigid, pretty);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+static char *
+pg_get_triggerdef_worker(Oid trigid, bool pretty)
+{
+ HeapTuple ht_trig;
+ Form_pg_trigger trigrec;
+ StringInfoData buf;
+ Relation tgrel;
+ ScanKeyData skey[1];
+ SysScanDesc tgscan;
+ int findx = 0;
+ char *tgname;
+ char *tgoldtable;
+ char *tgnewtable;
+ Datum value;
+ bool isnull;
+
+ /*
+ * Fetch the pg_trigger tuple by the Oid of the trigger
+ */
+ tgrel = table_open(TriggerRelationId, AccessShareLock);
+
+ ScanKeyInit(&skey[0],
+ Anum_pg_trigger_oid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(trigid));
+
+ tgscan = systable_beginscan(tgrel, TriggerOidIndexId, true,
+ NULL, 1, skey);
+
+ ht_trig = systable_getnext(tgscan);
+
+ if (!HeapTupleIsValid(ht_trig))
+ {
+ systable_endscan(tgscan);
+ table_close(tgrel, AccessShareLock);
+ return NULL;
+ }
+
+ trigrec = (Form_pg_trigger) GETSTRUCT(ht_trig);
+
+ /*
+ * Start the trigger definition. Note that the trigger's name should never
+ * be schema-qualified, but the trigger rel's name may be.
+ */
+ initStringInfo(&buf);
+
+ tgname = NameStr(trigrec->tgname);
+ appendStringInfo(&buf, "CREATE %sTRIGGER %s ",
+ OidIsValid(trigrec->tgconstraint) ? "CONSTRAINT " : "",
+ quote_identifier(tgname));
+
+ if (TRIGGER_FOR_BEFORE(trigrec->tgtype))
+ appendStringInfoString(&buf, "BEFORE");
+ else if (TRIGGER_FOR_AFTER(trigrec->tgtype))
+ appendStringInfoString(&buf, "AFTER");
+ else if (TRIGGER_FOR_INSTEAD(trigrec->tgtype))
+ appendStringInfoString(&buf, "INSTEAD OF");
+ else
+ elog(ERROR, "unexpected tgtype value: %d", trigrec->tgtype);
+
+ if (TRIGGER_FOR_INSERT(trigrec->tgtype))
+ {
+ appendStringInfoString(&buf, " INSERT");
+ findx++;
+ }
+ if (TRIGGER_FOR_DELETE(trigrec->tgtype))
+ {
+ if (findx > 0)
+ appendStringInfoString(&buf, " OR DELETE");
+ else
+ appendStringInfoString(&buf, " DELETE");
+ findx++;
+ }
+ if (TRIGGER_FOR_UPDATE(trigrec->tgtype))
+ {
+ if (findx > 0)
+ appendStringInfoString(&buf, " OR UPDATE");
+ else
+ appendStringInfoString(&buf, " UPDATE");
+ findx++;
+ /* tgattr is first var-width field, so OK to access directly */
+ if (trigrec->tgattr.dim1 > 0)
+ {
+ int i;
+
+ appendStringInfoString(&buf, " OF ");
+ for (i = 0; i < trigrec->tgattr.dim1; i++)
+ {
+ char *attname;
+
+ if (i > 0)
+ appendStringInfoString(&buf, ", ");
+ attname = get_attname(trigrec->tgrelid,
+ trigrec->tgattr.values[i], false);
+ appendStringInfoString(&buf, quote_identifier(attname));
+ }
+ }
+ }
+ if (TRIGGER_FOR_TRUNCATE(trigrec->tgtype))
+ {
+ if (findx > 0)
+ appendStringInfoString(&buf, " OR TRUNCATE");
+ else
+ appendStringInfoString(&buf, " TRUNCATE");
+ findx++;
+ }
+
+ /*
+ * In non-pretty mode, always schema-qualify the target table name for
+ * safety. In pretty mode, schema-qualify only if not visible.
+ */
+ appendStringInfo(&buf, " ON %s ",
+ pretty ?
+ generate_relation_name(trigrec->tgrelid, NIL) :
+ generate_qualified_relation_name(trigrec->tgrelid));
+
+ if (OidIsValid(trigrec->tgconstraint))
+ {
+ if (OidIsValid(trigrec->tgconstrrelid))
+ appendStringInfo(&buf, "FROM %s ",
+ generate_relation_name(trigrec->tgconstrrelid, NIL));
+ if (!trigrec->tgdeferrable)
+ appendStringInfoString(&buf, "NOT ");
+ appendStringInfoString(&buf, "DEFERRABLE INITIALLY ");
+ if (trigrec->tginitdeferred)
+ appendStringInfoString(&buf, "DEFERRED ");
+ else
+ appendStringInfoString(&buf, "IMMEDIATE ");
+ }
+
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgoldtable,
+ tgrel->rd_att, &isnull);
+ if (!isnull)
+ tgoldtable = NameStr(*DatumGetName(value));
+ else
+ tgoldtable = NULL;
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgnewtable,
+ tgrel->rd_att, &isnull);
+ if (!isnull)
+ tgnewtable = NameStr(*DatumGetName(value));
+ else
+ tgnewtable = NULL;
+ if (tgoldtable != NULL || tgnewtable != NULL)
+ {
+ appendStringInfoString(&buf, "REFERENCING ");
+ if (tgoldtable != NULL)
+ appendStringInfo(&buf, "OLD TABLE AS %s ",
+ quote_identifier(tgoldtable));
+ if (tgnewtable != NULL)
+ appendStringInfo(&buf, "NEW TABLE AS %s ",
+ quote_identifier(tgnewtable));
+ }
+
+ if (TRIGGER_FOR_ROW(trigrec->tgtype))
+ appendStringInfoString(&buf, "FOR EACH ROW ");
+ else
+ appendStringInfoString(&buf, "FOR EACH STATEMENT ");
+
+ /* If the trigger has a WHEN qualification, add that */
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgqual,
+ tgrel->rd_att, &isnull);
+ if (!isnull)
+ {
+ Node *qual;
+ char relkind;
+ deparse_context context;
+ deparse_namespace dpns;
+ RangeTblEntry *oldrte;
+ RangeTblEntry *newrte;
+
+ appendStringInfoString(&buf, "WHEN (");
+
+ qual = stringToNode(TextDatumGetCString(value));
+
+ relkind = get_rel_relkind(trigrec->tgrelid);
+
+ /* Build minimal OLD and NEW RTEs for the rel */
+ oldrte = makeNode(RangeTblEntry);
+ oldrte->rtekind = RTE_RELATION;
+ oldrte->relid = trigrec->tgrelid;
+ oldrte->relkind = relkind;
+ oldrte->rellockmode = AccessShareLock;
+ oldrte->alias = makeAlias("old", NIL);
+ oldrte->eref = oldrte->alias;
+ oldrte->lateral = false;
+ oldrte->inh = false;
+ oldrte->inFromCl = true;
+
+ newrte = makeNode(RangeTblEntry);
+ newrte->rtekind = RTE_RELATION;
+ newrte->relid = trigrec->tgrelid;
+ newrte->relkind = relkind;
+ newrte->rellockmode = AccessShareLock;
+ newrte->alias = makeAlias("new", NIL);
+ newrte->eref = newrte->alias;
+ newrte->lateral = false;
+ newrte->inh = false;
+ newrte->inFromCl = true;
+
+ /* Build two-element rtable */
+ memset(&dpns, 0, sizeof(dpns));
+ dpns.rtable = list_make2(oldrte, newrte);
+ dpns.subplans = NIL;
+ dpns.ctes = NIL;
+ dpns.appendrels = NULL;
+ set_rtable_names(&dpns, NIL, NULL);
+ set_simple_column_names(&dpns);
+
+ /* Set up context with one-deep namespace stack */
+ context.buf = &buf;
+ context.namespaces = list_make1(&dpns);
+ context.windowClause = NIL;
+ context.windowTList = NIL;
+ context.varprefix = true;
+ context.prettyFlags = GET_PRETTY_FLAGS(pretty);
+ context.wrapColumn = WRAP_COLUMN_DEFAULT;
+ context.indentLevel = PRETTYINDENT_STD;
+ context.special_exprkind = EXPR_KIND_NONE;
+ context.appendparents = NULL;
+
+ get_rule_expr(qual, &context, false);
+
+ appendStringInfoString(&buf, ") ");
+ }
+
+ appendStringInfo(&buf, "EXECUTE FUNCTION %s(",
+ generate_function_name(trigrec->tgfoid, 0,
+ NIL, NULL,
+ false, NULL, EXPR_KIND_NONE));
+
+ if (trigrec->tgnargs > 0)
+ {
+ char *p;
+ int i;
+
+ value = fastgetattr(ht_trig, Anum_pg_trigger_tgargs,
+ tgrel->rd_att, &isnull);
+ if (isnull)
+ elog(ERROR, "tgargs is null for trigger %u", trigid);
+ p = (char *) VARDATA_ANY(DatumGetByteaPP(value));
+ for (i = 0; i < trigrec->tgnargs; i++)
+ {
+ if (i > 0)
+ appendStringInfoString(&buf, ", ");
+ simple_quote_literal(&buf, p);
+ /* advance p to next string embedded in tgargs */
+ while (*p)
+ p++;
+ p++;
+ }
+ }
+
+ /* We deliberately do not put semi-colon at end */
+ appendStringInfoChar(&buf, ')');
+
+ /* Clean up */
+ systable_endscan(tgscan);
+
+ table_close(tgrel, AccessShareLock);
+
+ return buf.data;
+}
+
+/* ----------
+ * pg_get_indexdef - Get the definition of an index
+ *
+ * In the extended version, there is a colno argument as well as pretty bool.
+ * if colno == 0, we want a complete index definition.
+ * if colno > 0, we only want the Nth index key's variable or expression.
+ *
+ * Note that the SQL-function versions of this omit any info about the
+ * index tablespace; this is intentional because pg_dump wants it that way.
+ * However pg_get_indexdef_string() includes the index tablespace.
+ * ----------
+ */
+Datum
+pg_get_indexdef(PG_FUNCTION_ARGS)
+{
+ Oid indexrelid = PG_GETARG_OID(0);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ res = pg_get_indexdef_worker(indexrelid, 0, NULL,
+ false, false,
+ false, false,
+ prettyFlags, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+Datum
+pg_get_indexdef_ext(PG_FUNCTION_ARGS)
+{
+ Oid indexrelid = PG_GETARG_OID(0);
+ int32 colno = PG_GETARG_INT32(1);
+ bool pretty = PG_GETARG_BOOL(2);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ res = pg_get_indexdef_worker(indexrelid, colno, NULL,
+ colno != 0, false,
+ false, false,
+ prettyFlags, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/*
+ * Internal version for use by ALTER TABLE.
+ * Includes a tablespace clause in the result.
+ * Returns a palloc'd C string; no pretty-printing.
+ */
+char *
+pg_get_indexdef_string(Oid indexrelid)
+{
+ return pg_get_indexdef_worker(indexrelid, 0, NULL,
+ false, false,
+ true, true,
+ 0, false);
+}
+
+/* Internal version that just reports the key-column definitions */
+char *
+pg_get_indexdef_columns(Oid indexrelid, bool pretty)
+{
+ int prettyFlags;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ return pg_get_indexdef_worker(indexrelid, 0, NULL,
+ true, true,
+ false, false,
+ prettyFlags, false);
+}
+
+/* Internal version, extensible with flags to control its behavior */
+char *
+pg_get_indexdef_columns_extended(Oid indexrelid, bits16 flags)
+{
+ bool pretty = ((flags & RULE_INDEXDEF_PRETTY) != 0);
+ bool keys_only = ((flags & RULE_INDEXDEF_KEYS_ONLY) != 0);
+ int prettyFlags;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ return pg_get_indexdef_worker(indexrelid, 0, NULL,
+ true, keys_only,
+ false, false,
+ prettyFlags, false);
+}
+
+/*
+ * Internal workhorse to decompile an index definition.
+ *
+ * This is now used for exclusion constraints as well: if excludeOps is not
+ * NULL then it points to an array of exclusion operator OIDs.
+ */
+static char *
+pg_get_indexdef_worker(Oid indexrelid, int colno,
+ const Oid *excludeOps,
+ bool attrsOnly, bool keysOnly,
+ bool showTblSpc, bool inherits,
+ int prettyFlags, bool missing_ok)
+{
+ /* might want a separate isConstraint parameter later */
+ bool isConstraint = (excludeOps != NULL);
+ HeapTuple ht_idx;
+ HeapTuple ht_idxrel;
+ HeapTuple ht_am;
+ Form_pg_index idxrec;
+ Form_pg_class idxrelrec;
+ Form_pg_am amrec;
+ IndexAmRoutine *amroutine;
+ List *indexprs;
+ ListCell *indexpr_item;
+ List *context;
+ Oid indrelid;
+ int keyno;
+ Datum indcollDatum;
+ Datum indclassDatum;
+ Datum indoptionDatum;
+ bool isnull;
+ oidvector *indcollation;
+ oidvector *indclass;
+ int2vector *indoption;
+ StringInfoData buf;
+ char *str;
+ char *sep;
+
+ /*
+ * Fetch the pg_index tuple by the Oid of the index
+ */
+ ht_idx = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexrelid));
+ if (!HeapTupleIsValid(ht_idx))
+ {
+ if (missing_ok)
+ return NULL;
+ elog(ERROR, "cache lookup failed for index %u", indexrelid);
+ }
+ idxrec = (Form_pg_index) GETSTRUCT(ht_idx);
+
+ indrelid = idxrec->indrelid;
+ Assert(indexrelid == idxrec->indexrelid);
+
+ /* Must get indcollation, indclass, and indoption the hard way */
+ indcollDatum = SysCacheGetAttr(INDEXRELID, ht_idx,
+ Anum_pg_index_indcollation, &isnull);
+ Assert(!isnull);
+ indcollation = (oidvector *) DatumGetPointer(indcollDatum);
+
+ indclassDatum = SysCacheGetAttr(INDEXRELID, ht_idx,
+ Anum_pg_index_indclass, &isnull);
+ Assert(!isnull);
+ indclass = (oidvector *) DatumGetPointer(indclassDatum);
+
+ indoptionDatum = SysCacheGetAttr(INDEXRELID, ht_idx,
+ Anum_pg_index_indoption, &isnull);
+ Assert(!isnull);
+ indoption = (int2vector *) DatumGetPointer(indoptionDatum);
+
+ /*
+ * Fetch the pg_class tuple of the index relation
+ */
+ ht_idxrel = SearchSysCache1(RELOID, ObjectIdGetDatum(indexrelid));
+ if (!HeapTupleIsValid(ht_idxrel))
+ elog(ERROR, "cache lookup failed for relation %u", indexrelid);
+ idxrelrec = (Form_pg_class) GETSTRUCT(ht_idxrel);
+
+ /*
+ * Fetch the pg_am tuple of the index' access method
+ */
+ ht_am = SearchSysCache1(AMOID, ObjectIdGetDatum(idxrelrec->relam));
+ if (!HeapTupleIsValid(ht_am))
+ elog(ERROR, "cache lookup failed for access method %u",
+ idxrelrec->relam);
+ amrec = (Form_pg_am) GETSTRUCT(ht_am);
+
+ /* Fetch the index AM's API struct */
+ amroutine = GetIndexAmRoutine(amrec->amhandler);
+
+ /*
+ * Get the index expressions, if any. (NOTE: we do not use the relcache
+ * versions of the expressions and predicate, because we want to display
+ * non-const-folded expressions.)
+ */
+ if (!heap_attisnull(ht_idx, Anum_pg_index_indexprs, NULL))
+ {
+ Datum exprsDatum;
+ bool isnull;
+ char *exprsString;
+
+ exprsDatum = SysCacheGetAttr(INDEXRELID, ht_idx,
+ Anum_pg_index_indexprs, &isnull);
+ Assert(!isnull);
+ exprsString = TextDatumGetCString(exprsDatum);
+ indexprs = (List *) stringToNode(exprsString);
+ pfree(exprsString);
+ }
+ else
+ indexprs = NIL;
+
+ indexpr_item = list_head(indexprs);
+
+ context = deparse_context_for(get_relation_name(indrelid), indrelid);
+
+ /*
+ * Start the index definition. Note that the index's name should never be
+ * schema-qualified, but the indexed rel's name may be.
+ */
+ initStringInfo(&buf);
+
+ if (!attrsOnly)
+ {
+ if (!isConstraint)
+ appendStringInfo(&buf, "CREATE %sINDEX %s ON %s%s USING %s (",
+ idxrec->indisunique ? "UNIQUE " : "",
+ quote_identifier(NameStr(idxrelrec->relname)),
+ idxrelrec->relkind == RELKIND_PARTITIONED_INDEX
+ && !inherits ? "ONLY " : "",
+ (prettyFlags & PRETTYFLAG_SCHEMA) ?
+ generate_relation_name(indrelid, NIL) :
+ generate_qualified_relation_name(indrelid),
+ quote_identifier(NameStr(amrec->amname)));
+ else /* currently, must be EXCLUDE constraint */
+ appendStringInfo(&buf, "EXCLUDE USING %s (",
+ quote_identifier(NameStr(amrec->amname)));
+ }
+
+ /*
+ * Report the indexed attributes
+ */
+ sep = "";
+ for (keyno = 0; keyno < idxrec->indnatts; keyno++)
+ {
+ AttrNumber attnum = idxrec->indkey.values[keyno];
+ Oid keycoltype;
+ Oid keycolcollation;
+
+ /*
+ * Ignore non-key attributes if told to.
+ */
+ if (keysOnly && keyno >= idxrec->indnkeyatts)
+ break;
+
+ /* Otherwise, print INCLUDE to divide key and non-key attrs. */
+ if (!colno && keyno == idxrec->indnkeyatts)
+ {
+ appendStringInfoString(&buf, ") INCLUDE (");
+ sep = "";
+ }
+
+ if (!colno)
+ appendStringInfoString(&buf, sep);
+ sep = ", ";
+
+ if (attnum != 0)
+ {
+ /* Simple index column */
+ char *attname;
+ int32 keycoltypmod;
+
+ attname = get_attname(indrelid, attnum, false);
+ if (!colno || colno == keyno + 1)
+ appendStringInfoString(&buf, quote_identifier(attname));
+ get_atttypetypmodcoll(indrelid, attnum,
+ &keycoltype, &keycoltypmod,
+ &keycolcollation);
+ }
+ else
+ {
+ /* expressional index */
+ Node *indexkey;
+
+ if (indexpr_item == NULL)
+ elog(ERROR, "too few entries in indexprs list");
+ indexkey = (Node *) lfirst(indexpr_item);
+ indexpr_item = lnext(indexprs, indexpr_item);
+ /* Deparse */
+ str = deparse_expression_pretty(indexkey, context, false, false,
+ prettyFlags, 0);
+ if (!colno || colno == keyno + 1)
+ {
+ /* Need parens if it's not a bare function call */
+ if (looks_like_function(indexkey))
+ appendStringInfoString(&buf, str);
+ else
+ appendStringInfo(&buf, "(%s)", str);
+ }
+ keycoltype = exprType(indexkey);
+ keycolcollation = exprCollation(indexkey);
+ }
+
+ /* Print additional decoration for (selected) key columns */
+ if (!attrsOnly && keyno < idxrec->indnkeyatts &&
+ (!colno || colno == keyno + 1))
+ {
+ int16 opt = indoption->values[keyno];
+ Oid indcoll = indcollation->values[keyno];
+ Datum attoptions = get_attoptions(indexrelid, keyno + 1);
+ bool has_options = attoptions != (Datum) 0;
+
+ /* Add collation, if not default for column */
+ if (OidIsValid(indcoll) && indcoll != keycolcollation)
+ appendStringInfo(&buf, " COLLATE %s",
+ generate_collation_name((indcoll)));
+
+ /* Add the operator class name, if not default */
+ get_opclass_name(indclass->values[keyno],
+ has_options ? InvalidOid : keycoltype, &buf);
+
+ if (has_options)
+ {
+ appendStringInfoString(&buf, " (");
+ get_reloptions(&buf, attoptions);
+ appendStringInfoChar(&buf, ')');
+ }
+
+ /* Add options if relevant */
+ if (amroutine->amcanorder)
+ {
+ /* if it supports sort ordering, report DESC and NULLS opts */
+ if (opt & INDOPTION_DESC)
+ {
+ appendStringInfoString(&buf, " DESC");
+ /* NULLS FIRST is the default in this case */
+ if (!(opt & INDOPTION_NULLS_FIRST))
+ appendStringInfoString(&buf, " NULLS LAST");
+ }
+ else
+ {
+ if (opt & INDOPTION_NULLS_FIRST)
+ appendStringInfoString(&buf, " NULLS FIRST");
+ }
+ }
+
+ /* Add the exclusion operator if relevant */
+ if (excludeOps != NULL)
+ appendStringInfo(&buf, " WITH %s",
+ generate_operator_name(excludeOps[keyno],
+ keycoltype,
+ keycoltype));
+ }
+ }
+
+ if (!attrsOnly)
+ {
+ appendStringInfoChar(&buf, ')');
+
+ if (idxrec->indnullsnotdistinct)
+ appendStringInfo(&buf, " NULLS NOT DISTINCT");
+
+ /*
+ * If it has options, append "WITH (options)"
+ */
+ str = flatten_reloptions(indexrelid);
+ if (str)
+ {
+ appendStringInfo(&buf, " WITH (%s)", str);
+ pfree(str);
+ }
+
+ /*
+ * Print tablespace, but only if requested
+ */
+ if (showTblSpc)
+ {
+ Oid tblspc;
+
+ tblspc = get_rel_tablespace(indexrelid);
+ if (OidIsValid(tblspc))
+ {
+ if (isConstraint)
+ appendStringInfoString(&buf, " USING INDEX");
+ appendStringInfo(&buf, " TABLESPACE %s",
+ quote_identifier(get_tablespace_name(tblspc)));
+ }
+ }
+
+ /*
+ * If it's a partial index, decompile and append the predicate
+ */
+ if (!heap_attisnull(ht_idx, Anum_pg_index_indpred, NULL))
+ {
+ Node *node;
+ Datum predDatum;
+ bool isnull;
+ char *predString;
+
+ /* Convert text string to node tree */
+ predDatum = SysCacheGetAttr(INDEXRELID, ht_idx,
+ Anum_pg_index_indpred, &isnull);
+ Assert(!isnull);
+ predString = TextDatumGetCString(predDatum);
+ node = (Node *) stringToNode(predString);
+ pfree(predString);
+
+ /* Deparse */
+ str = deparse_expression_pretty(node, context, false, false,
+ prettyFlags, 0);
+ if (isConstraint)
+ appendStringInfo(&buf, " WHERE (%s)", str);
+ else
+ appendStringInfo(&buf, " WHERE %s", str);
+ }
+ }
+
+ /* Clean up */
+ ReleaseSysCache(ht_idx);
+ ReleaseSysCache(ht_idxrel);
+ ReleaseSysCache(ht_am);
+
+ return buf.data;
+}
+
+/* ----------
+ * pg_get_querydef
+ *
+ * Public entry point to deparse one query parsetree.
+ * The pretty flags are determined by GET_PRETTY_FLAGS(pretty).
+ *
+ * The result is a palloc'd C string.
+ * ----------
+ */
+char *
+pg_get_querydef(Query *query, bool pretty)
+{
+ StringInfoData buf;
+ int prettyFlags;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ initStringInfo(&buf);
+
+ get_query_def(query, &buf, NIL, NULL, true,
+ prettyFlags, WRAP_COLUMN_DEFAULT, 0);
+
+ return buf.data;
+}
+
+/*
+ * pg_get_statisticsobjdef
+ * Get the definition of an extended statistics object
+ */
+Datum
+pg_get_statisticsobjdef(PG_FUNCTION_ARGS)
+{
+ Oid statextid = PG_GETARG_OID(0);
+ char *res;
+
+ res = pg_get_statisticsobj_worker(statextid, false, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/*
+ * Internal version for use by ALTER TABLE.
+ * Includes a tablespace clause in the result.
+ * Returns a palloc'd C string; no pretty-printing.
+ */
+char *
+pg_get_statisticsobjdef_string(Oid statextid)
+{
+ return pg_get_statisticsobj_worker(statextid, false, false);
+}
+
+/*
+ * pg_get_statisticsobjdef_columns
+ * Get columns and expressions for an extended statistics object
+ */
+Datum
+pg_get_statisticsobjdef_columns(PG_FUNCTION_ARGS)
+{
+ Oid statextid = PG_GETARG_OID(0);
+ char *res;
+
+ res = pg_get_statisticsobj_worker(statextid, true, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/*
+ * Internal workhorse to decompile an extended statistics object.
+ */
+static char *
+pg_get_statisticsobj_worker(Oid statextid, bool columns_only, bool missing_ok)
+{
+ Form_pg_statistic_ext statextrec;
+ HeapTuple statexttup;
+ StringInfoData buf;
+ int colno;
+ char *nsp;
+ ArrayType *arr;
+ char *enabled;
+ Datum datum;
+ bool isnull;
+ bool ndistinct_enabled;
+ bool dependencies_enabled;
+ bool mcv_enabled;
+ int i;
+ List *context;
+ ListCell *lc;
+ List *exprs = NIL;
+ bool has_exprs;
+ int ncolumns;
+
+ statexttup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statextid));
+
+ if (!HeapTupleIsValid(statexttup))
+ {
+ if (missing_ok)
+ return NULL;
+ elog(ERROR, "cache lookup failed for statistics object %u", statextid);
+ }
+
+ /* has the statistics expressions? */
+ has_exprs = !heap_attisnull(statexttup, Anum_pg_statistic_ext_stxexprs, NULL);
+
+ statextrec = (Form_pg_statistic_ext) GETSTRUCT(statexttup);
+
+ /*
+ * Get the statistics expressions, if any. (NOTE: we do not use the
+ * relcache versions of the expressions, because we want to display
+ * non-const-folded expressions.)
+ */
+ if (has_exprs)
+ {
+ Datum exprsDatum;
+ bool isnull;
+ char *exprsString;
+
+ exprsDatum = SysCacheGetAttr(STATEXTOID, statexttup,
+ Anum_pg_statistic_ext_stxexprs, &isnull);
+ Assert(!isnull);
+ exprsString = TextDatumGetCString(exprsDatum);
+ exprs = (List *) stringToNode(exprsString);
+ pfree(exprsString);
+ }
+ else
+ exprs = NIL;
+
+ /* count the number of columns (attributes and expressions) */
+ ncolumns = statextrec->stxkeys.dim1 + list_length(exprs);
+
+ initStringInfo(&buf);
+
+ if (!columns_only)
+ {
+ nsp = get_namespace_name_or_temp(statextrec->stxnamespace);
+ appendStringInfo(&buf, "CREATE STATISTICS %s",
+ quote_qualified_identifier(nsp,
+ NameStr(statextrec->stxname)));
+
+ /*
+ * Decode the stxkind column so that we know which stats types to
+ * print.
+ */
+ datum = SysCacheGetAttr(STATEXTOID, statexttup,
+ Anum_pg_statistic_ext_stxkind, &isnull);
+ Assert(!isnull);
+ arr = DatumGetArrayTypeP(datum);
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != CHAROID)
+ elog(ERROR, "stxkind is not a 1-D char array");
+ enabled = (char *) ARR_DATA_PTR(arr);
+
+ ndistinct_enabled = false;
+ dependencies_enabled = false;
+ mcv_enabled = false;
+
+ for (i = 0; i < ARR_DIMS(arr)[0]; i++)
+ {
+ if (enabled[i] == STATS_EXT_NDISTINCT)
+ ndistinct_enabled = true;
+ else if (enabled[i] == STATS_EXT_DEPENDENCIES)
+ dependencies_enabled = true;
+ else if (enabled[i] == STATS_EXT_MCV)
+ mcv_enabled = true;
+
+ /* ignore STATS_EXT_EXPRESSIONS (it's built automatically) */
+ }
+
+ /*
+ * If any option is disabled, then we'll need to append the types
+ * clause to show which options are enabled. We omit the types clause
+ * on purpose when all options are enabled, so a pg_dump/pg_restore
+ * will create all statistics types on a newer postgres version, if
+ * the statistics had all options enabled on the original version.
+ *
+ * But if the statistics is defined on just a single column, it has to
+ * be an expression statistics. In that case we don't need to specify
+ * kinds.
+ */
+ if ((!ndistinct_enabled || !dependencies_enabled || !mcv_enabled) &&
+ (ncolumns > 1))
+ {
+ bool gotone = false;
+
+ appendStringInfoString(&buf, " (");
+
+ if (ndistinct_enabled)
+ {
+ appendStringInfoString(&buf, "ndistinct");
+ gotone = true;
+ }
+
+ if (dependencies_enabled)
+ {
+ appendStringInfo(&buf, "%sdependencies", gotone ? ", " : "");
+ gotone = true;
+ }
+
+ if (mcv_enabled)
+ appendStringInfo(&buf, "%smcv", gotone ? ", " : "");
+
+ appendStringInfoChar(&buf, ')');
+ }
+
+ appendStringInfoString(&buf, " ON ");
+ }
+
+ /* decode simple column references */
+ for (colno = 0; colno < statextrec->stxkeys.dim1; colno++)
+ {
+ AttrNumber attnum = statextrec->stxkeys.values[colno];
+ char *attname;
+
+ if (colno > 0)
+ appendStringInfoString(&buf, ", ");
+
+ attname = get_attname(statextrec->stxrelid, attnum, false);
+
+ appendStringInfoString(&buf, quote_identifier(attname));
+ }
+
+ context = deparse_context_for(get_relation_name(statextrec->stxrelid),
+ statextrec->stxrelid);
+
+ foreach(lc, exprs)
+ {
+ Node *expr = (Node *) lfirst(lc);
+ char *str;
+ int prettyFlags = PRETTYFLAG_PAREN;
+
+ str = deparse_expression_pretty(expr, context, false, false,
+ prettyFlags, 0);
+
+ if (colno > 0)
+ appendStringInfoString(&buf, ", ");
+
+ /* Need parens if it's not a bare function call */
+ if (looks_like_function(expr))
+ appendStringInfoString(&buf, str);
+ else
+ appendStringInfo(&buf, "(%s)", str);
+
+ colno++;
+ }
+
+ if (!columns_only)
+ appendStringInfo(&buf, " FROM %s",
+ generate_relation_name(statextrec->stxrelid, NIL));
+
+ ReleaseSysCache(statexttup);
+
+ return buf.data;
+}
+
+/*
+ * Generate text array of expressions for statistics object.
+ */
+Datum
+pg_get_statisticsobjdef_expressions(PG_FUNCTION_ARGS)
+{
+ Oid statextid = PG_GETARG_OID(0);
+ Form_pg_statistic_ext statextrec;
+ HeapTuple statexttup;
+ Datum datum;
+ bool isnull;
+ List *context;
+ ListCell *lc;
+ List *exprs = NIL;
+ bool has_exprs;
+ char *tmp;
+ ArrayBuildState *astate = NULL;
+
+ statexttup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statextid));
+
+ if (!HeapTupleIsValid(statexttup))
+ PG_RETURN_NULL();
+
+ /* Does the stats object have expressions? */
+ has_exprs = !heap_attisnull(statexttup, Anum_pg_statistic_ext_stxexprs, NULL);
+
+ /* no expressions? we're done */
+ if (!has_exprs)
+ {
+ ReleaseSysCache(statexttup);
+ PG_RETURN_NULL();
+ }
+
+ statextrec = (Form_pg_statistic_ext) GETSTRUCT(statexttup);
+
+ /*
+ * Get the statistics expressions, and deparse them into text values.
+ */
+ datum = SysCacheGetAttr(STATEXTOID, statexttup,
+ Anum_pg_statistic_ext_stxexprs, &isnull);
+
+ Assert(!isnull);
+ tmp = TextDatumGetCString(datum);
+ exprs = (List *) stringToNode(tmp);
+ pfree(tmp);
+
+ context = deparse_context_for(get_relation_name(statextrec->stxrelid),
+ statextrec->stxrelid);
+
+ foreach(lc, exprs)
+ {
+ Node *expr = (Node *) lfirst(lc);
+ char *str;
+ int prettyFlags = PRETTYFLAG_INDENT;
+
+ str = deparse_expression_pretty(expr, context, false, false,
+ prettyFlags, 0);
+
+ astate = accumArrayResult(astate,
+ PointerGetDatum(cstring_to_text(str)),
+ false,
+ TEXTOID,
+ CurrentMemoryContext);
+ }
+
+ ReleaseSysCache(statexttup);
+
+ PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext));
+}
+
+/*
+ * pg_get_partkeydef
+ *
+ * Returns the partition key specification, ie, the following:
+ *
+ * PARTITION BY { RANGE | LIST | HASH } (column opt_collation opt_opclass [, ...])
+ */
+Datum
+pg_get_partkeydef(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ char *res;
+
+ res = pg_get_partkeydef_worker(relid, PRETTYFLAG_INDENT, false, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/* Internal version that just reports the column definitions */
+char *
+pg_get_partkeydef_columns(Oid relid, bool pretty)
+{
+ int prettyFlags;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ return pg_get_partkeydef_worker(relid, prettyFlags, true, false);
+}
+
+/*
+ * Internal workhorse to decompile a partition key definition.
+ */
+static char *
+pg_get_partkeydef_worker(Oid relid, int prettyFlags,
+ bool attrsOnly, bool missing_ok)
+{
+ Form_pg_partitioned_table form;
+ HeapTuple tuple;
+ oidvector *partclass;
+ oidvector *partcollation;
+ List *partexprs;
+ ListCell *partexpr_item;
+ List *context;
+ Datum datum;
+ bool isnull;
+ StringInfoData buf;
+ int keyno;
+ char *str;
+ char *sep;
+
+ tuple = SearchSysCache1(PARTRELID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ {
+ if (missing_ok)
+ return NULL;
+ elog(ERROR, "cache lookup failed for partition key of %u", relid);
+ }
+
+ form = (Form_pg_partitioned_table) GETSTRUCT(tuple);
+
+ Assert(form->partrelid == relid);
+
+ /* Must get partclass and partcollation the hard way */
+ datum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partclass, &isnull);
+ Assert(!isnull);
+ partclass = (oidvector *) DatumGetPointer(datum);
+
+ datum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partcollation, &isnull);
+ Assert(!isnull);
+ partcollation = (oidvector *) DatumGetPointer(datum);
+
+
+ /*
+ * Get the expressions, if any. (NOTE: we do not use the relcache
+ * versions of the expressions, because we want to display
+ * non-const-folded expressions.)
+ */
+ if (!heap_attisnull(tuple, Anum_pg_partitioned_table_partexprs, NULL))
+ {
+ Datum exprsDatum;
+ bool isnull;
+ char *exprsString;
+
+ exprsDatum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partexprs, &isnull);
+ Assert(!isnull);
+ exprsString = TextDatumGetCString(exprsDatum);
+ partexprs = (List *) stringToNode(exprsString);
+
+ if (!IsA(partexprs, List))
+ elog(ERROR, "unexpected node type found in partexprs: %d",
+ (int) nodeTag(partexprs));
+
+ pfree(exprsString);
+ }
+ else
+ partexprs = NIL;
+
+ partexpr_item = list_head(partexprs);
+ context = deparse_context_for(get_relation_name(relid), relid);
+
+ initStringInfo(&buf);
+
+ switch (form->partstrat)
+ {
+ case PARTITION_STRATEGY_HASH:
+ if (!attrsOnly)
+ appendStringInfoString(&buf, "HASH");
+ break;
+ case PARTITION_STRATEGY_LIST:
+ if (!attrsOnly)
+ appendStringInfoString(&buf, "LIST");
+ break;
+ case PARTITION_STRATEGY_RANGE:
+ if (!attrsOnly)
+ appendStringInfoString(&buf, "RANGE");
+ break;
+ default:
+ elog(ERROR, "unexpected partition strategy: %d",
+ (int) form->partstrat);
+ }
+
+ if (!attrsOnly)
+ appendStringInfoString(&buf, " (");
+ sep = "";
+ for (keyno = 0; keyno < form->partnatts; keyno++)
+ {
+ AttrNumber attnum = form->partattrs.values[keyno];
+ Oid keycoltype;
+ Oid keycolcollation;
+ Oid partcoll;
+
+ appendStringInfoString(&buf, sep);
+ sep = ", ";
+ if (attnum != 0)
+ {
+ /* Simple attribute reference */
+ char *attname;
+ int32 keycoltypmod;
+
+ attname = get_attname(relid, attnum, false);
+ appendStringInfoString(&buf, quote_identifier(attname));
+ get_atttypetypmodcoll(relid, attnum,
+ &keycoltype, &keycoltypmod,
+ &keycolcollation);
+ }
+ else
+ {
+ /* Expression */
+ Node *partkey;
+
+ if (partexpr_item == NULL)
+ elog(ERROR, "too few entries in partexprs list");
+ partkey = (Node *) lfirst(partexpr_item);
+ partexpr_item = lnext(partexprs, partexpr_item);
+
+ /* Deparse */
+ str = deparse_expression_pretty(partkey, context, false, false,
+ prettyFlags, 0);
+ /* Need parens if it's not a bare function call */
+ if (looks_like_function(partkey))
+ appendStringInfoString(&buf, str);
+ else
+ appendStringInfo(&buf, "(%s)", str);
+
+ keycoltype = exprType(partkey);
+ keycolcollation = exprCollation(partkey);
+ }
+
+ /* Add collation, if not default for column */
+ partcoll = partcollation->values[keyno];
+ if (!attrsOnly && OidIsValid(partcoll) && partcoll != keycolcollation)
+ appendStringInfo(&buf, " COLLATE %s",
+ generate_collation_name((partcoll)));
+
+ /* Add the operator class name, if not default */
+ if (!attrsOnly)
+ get_opclass_name(partclass->values[keyno], keycoltype, &buf);
+ }
+
+ if (!attrsOnly)
+ appendStringInfoChar(&buf, ')');
+
+ /* Clean up */
+ ReleaseSysCache(tuple);
+
+ return buf.data;
+}
+
+/*
+ * pg_get_partition_constraintdef
+ *
+ * Returns partition constraint expression as a string for the input relation
+ */
+Datum
+pg_get_partition_constraintdef(PG_FUNCTION_ARGS)
+{
+ Oid relationId = PG_GETARG_OID(0);
+ Expr *constr_expr;
+ int prettyFlags;
+ List *context;
+ char *consrc;
+
+ constr_expr = get_partition_qual_relid(relationId);
+
+ /* Quick exit if no partition constraint */
+ if (constr_expr == NULL)
+ PG_RETURN_NULL();
+
+ /*
+ * Deparse and return the constraint expression.
+ */
+ prettyFlags = PRETTYFLAG_INDENT;
+ context = deparse_context_for(get_relation_name(relationId), relationId);
+ consrc = deparse_expression_pretty((Node *) constr_expr, context, false,
+ false, prettyFlags, 0);
+
+ PG_RETURN_TEXT_P(string_to_text(consrc));
+}
+
+/*
+ * pg_get_partconstrdef_string
+ *
+ * Returns the partition constraint as a C-string for the input relation, with
+ * the given alias. No pretty-printing.
+ */
+char *
+pg_get_partconstrdef_string(Oid partitionId, char *aliasname)
+{
+ Expr *constr_expr;
+ List *context;
+
+ constr_expr = get_partition_qual_relid(partitionId);
+ context = deparse_context_for(aliasname, partitionId);
+
+ return deparse_expression((Node *) constr_expr, context, true, false);
+}
+
+/*
+ * pg_get_constraintdef
+ *
+ * Returns the definition for the constraint, ie, everything that needs to
+ * appear after "ALTER TABLE ... ADD CONSTRAINT <constraintname>".
+ */
+Datum
+pg_get_constraintdef(PG_FUNCTION_ARGS)
+{
+ Oid constraintId = PG_GETARG_OID(0);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ res = pg_get_constraintdef_worker(constraintId, false, prettyFlags, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+Datum
+pg_get_constraintdef_ext(PG_FUNCTION_ARGS)
+{
+ Oid constraintId = PG_GETARG_OID(0);
+ bool pretty = PG_GETARG_BOOL(1);
+ int prettyFlags;
+ char *res;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ res = pg_get_constraintdef_worker(constraintId, false, prettyFlags, true);
+
+ if (res == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_TEXT_P(string_to_text(res));
+}
+
+/*
+ * Internal version that returns a full ALTER TABLE ... ADD CONSTRAINT command
+ */
+char *
+pg_get_constraintdef_command(Oid constraintId)
+{
+ return pg_get_constraintdef_worker(constraintId, true, 0, false);
+}
+
+/*
+ * As of 9.4, we now use an MVCC snapshot for this.
+ */
+static char *
+pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
+ int prettyFlags, bool missing_ok)
+{
+ HeapTuple tup;
+ Form_pg_constraint conForm;
+ StringInfoData buf;
+ SysScanDesc scandesc;
+ ScanKeyData scankey[1];
+ Snapshot snapshot = RegisterSnapshot(GetTransactionSnapshot());
+ Relation relation = table_open(ConstraintRelationId, AccessShareLock);
+
+ ScanKeyInit(&scankey[0],
+ Anum_pg_constraint_oid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(constraintId));
+
+ scandesc = systable_beginscan(relation,
+ ConstraintOidIndexId,
+ true,
+ snapshot,
+ 1,
+ scankey);
+
+ /*
+ * We later use the tuple with SysCacheGetAttr() as if we had obtained it
+ * via SearchSysCache, which works fine.
+ */
+ tup = systable_getnext(scandesc);
+
+ UnregisterSnapshot(snapshot);
+
+ if (!HeapTupleIsValid(tup))
+ {
+ if (missing_ok)
+ {
+ systable_endscan(scandesc);
+ table_close(relation, AccessShareLock);
+ return NULL;
+ }
+ elog(ERROR, "could not find tuple for constraint %u", constraintId);
+ }
+
+ conForm = (Form_pg_constraint) GETSTRUCT(tup);
+
+ initStringInfo(&buf);
+
+ if (fullCommand)
+ {
+ if (OidIsValid(conForm->conrelid))
+ {
+ /*
+ * Currently, callers want ALTER TABLE (without ONLY) for CHECK
+ * constraints, and other types of constraints don't inherit
+ * anyway so it doesn't matter whether we say ONLY or not. Someday
+ * we might need to let callers specify whether to put ONLY in the
+ * command.
+ */
+ appendStringInfo(&buf, "ALTER TABLE %s ADD CONSTRAINT %s ",
+ generate_qualified_relation_name(conForm->conrelid),
+ quote_identifier(NameStr(conForm->conname)));
+ }
+ else
+ {
+ /* Must be a domain constraint */
+ Assert(OidIsValid(conForm->contypid));
+ appendStringInfo(&buf, "ALTER DOMAIN %s ADD CONSTRAINT %s ",
+ generate_qualified_type_name(conForm->contypid),
+ quote_identifier(NameStr(conForm->conname)));
+ }
+ }
+
+ switch (conForm->contype)
+ {
+ case CONSTRAINT_FOREIGN:
+ {
+ Datum val;
+ bool isnull;
+ const char *string;
+
+ /* Start off the constraint definition */
+ appendStringInfoString(&buf, "FOREIGN KEY (");
+
+ /* Fetch and build referencing-column list */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_conkey, &isnull);
+ if (isnull)
+ elog(ERROR, "null conkey for constraint %u",
+ constraintId);
+
+ decompile_column_index_array(val, conForm->conrelid, &buf);
+
+ /* add foreign relation name */
+ appendStringInfo(&buf, ") REFERENCES %s(",
+ generate_relation_name(conForm->confrelid,
+ NIL));
+
+ /* Fetch and build referenced-column list */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_confkey, &isnull);
+ if (isnull)
+ elog(ERROR, "null confkey for constraint %u",
+ constraintId);
+
+ decompile_column_index_array(val, conForm->confrelid, &buf);
+
+ appendStringInfoChar(&buf, ')');
+
+ /* Add match type */
+ switch (conForm->confmatchtype)
+ {
+ case FKCONSTR_MATCH_FULL:
+ string = " MATCH FULL";
+ break;
+ case FKCONSTR_MATCH_PARTIAL:
+ string = " MATCH PARTIAL";
+ break;
+ case FKCONSTR_MATCH_SIMPLE:
+ string = "";
+ break;
+ default:
+ elog(ERROR, "unrecognized confmatchtype: %d",
+ conForm->confmatchtype);
+ string = ""; /* keep compiler quiet */
+ break;
+ }
+ appendStringInfoString(&buf, string);
+
+ /* Add ON UPDATE and ON DELETE clauses, if needed */
+ switch (conForm->confupdtype)
+ {
+ case FKCONSTR_ACTION_NOACTION:
+ string = NULL; /* suppress default */
+ break;
+ case FKCONSTR_ACTION_RESTRICT:
+ string = "RESTRICT";
+ break;
+ case FKCONSTR_ACTION_CASCADE:
+ string = "CASCADE";
+ break;
+ case FKCONSTR_ACTION_SETNULL:
+ string = "SET NULL";
+ break;
+ case FKCONSTR_ACTION_SETDEFAULT:
+ string = "SET DEFAULT";
+ break;
+ default:
+ elog(ERROR, "unrecognized confupdtype: %d",
+ conForm->confupdtype);
+ string = NULL; /* keep compiler quiet */
+ break;
+ }
+ if (string)
+ appendStringInfo(&buf, " ON UPDATE %s", string);
+
+ switch (conForm->confdeltype)
+ {
+ case FKCONSTR_ACTION_NOACTION:
+ string = NULL; /* suppress default */
+ break;
+ case FKCONSTR_ACTION_RESTRICT:
+ string = "RESTRICT";
+ break;
+ case FKCONSTR_ACTION_CASCADE:
+ string = "CASCADE";
+ break;
+ case FKCONSTR_ACTION_SETNULL:
+ string = "SET NULL";
+ break;
+ case FKCONSTR_ACTION_SETDEFAULT:
+ string = "SET DEFAULT";
+ break;
+ default:
+ elog(ERROR, "unrecognized confdeltype: %d",
+ conForm->confdeltype);
+ string = NULL; /* keep compiler quiet */
+ break;
+ }
+ if (string)
+ appendStringInfo(&buf, " ON DELETE %s", string);
+
+ /*
+ * Add columns specified to SET NULL or SET DEFAULT if
+ * provided.
+ */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_confdelsetcols, &isnull);
+ if (!isnull)
+ {
+ appendStringInfo(&buf, " (");
+ decompile_column_index_array(val, conForm->conrelid, &buf);
+ appendStringInfo(&buf, ")");
+ }
+
+ break;
+ }
+ case CONSTRAINT_PRIMARY:
+ case CONSTRAINT_UNIQUE:
+ {
+ Datum val;
+ bool isnull;
+ Oid indexId;
+ int keyatts;
+ HeapTuple indtup;
+
+ /* Start off the constraint definition */
+ if (conForm->contype == CONSTRAINT_PRIMARY)
+ appendStringInfoString(&buf, "PRIMARY KEY ");
+ else
+ appendStringInfoString(&buf, "UNIQUE ");
+
+ indexId = conForm->conindid;
+
+ indtup = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId));
+ if (!HeapTupleIsValid(indtup))
+ elog(ERROR, "cache lookup failed for index %u", indexId);
+ if (conForm->contype == CONSTRAINT_UNIQUE &&
+ ((Form_pg_index) GETSTRUCT(indtup))->indnullsnotdistinct)
+ appendStringInfoString(&buf, "NULLS NOT DISTINCT ");
+
+ appendStringInfoString(&buf, "(");
+
+ /* Fetch and build target column list */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_conkey, &isnull);
+ if (isnull)
+ elog(ERROR, "null conkey for constraint %u",
+ constraintId);
+
+ keyatts = decompile_column_index_array(val, conForm->conrelid, &buf);
+
+ appendStringInfoChar(&buf, ')');
+
+ /* Build including column list (from pg_index.indkeys) */
+ val = SysCacheGetAttr(INDEXRELID, indtup,
+ Anum_pg_index_indnatts, &isnull);
+ if (isnull)
+ elog(ERROR, "null indnatts for index %u", indexId);
+ if (DatumGetInt32(val) > keyatts)
+ {
+ Datum cols;
+ Datum *keys;
+ int nKeys;
+ int j;
+
+ appendStringInfoString(&buf, " INCLUDE (");
+
+ cols = SysCacheGetAttr(INDEXRELID, indtup,
+ Anum_pg_index_indkey, &isnull);
+ if (isnull)
+ elog(ERROR, "null indkey for index %u", indexId);
+
+ deconstruct_array(DatumGetArrayTypeP(cols),
+ INT2OID, 2, true, TYPALIGN_SHORT,
+ &keys, NULL, &nKeys);
+
+ for (j = keyatts; j < nKeys; j++)
+ {
+ char *colName;
+
+ colName = get_attname(conForm->conrelid,
+ DatumGetInt16(keys[j]), false);
+ if (j > keyatts)
+ appendStringInfoString(&buf, ", ");
+ appendStringInfoString(&buf, quote_identifier(colName));
+ }
+
+ appendStringInfoChar(&buf, ')');
+ }
+ ReleaseSysCache(indtup);
+
+ /* XXX why do we only print these bits if fullCommand? */
+ if (fullCommand && OidIsValid(indexId))
+ {
+ char *options = flatten_reloptions(indexId);
+ Oid tblspc;
+
+ if (options)
+ {
+ appendStringInfo(&buf, " WITH (%s)", options);
+ pfree(options);
+ }
+
+ /*
+ * Print the tablespace, unless it's the database default.
+ * This is to help ALTER TABLE usage of this facility,
+ * which needs this behavior to recreate exact catalog
+ * state.
+ */
+ tblspc = get_rel_tablespace(indexId);
+ if (OidIsValid(tblspc))
+ appendStringInfo(&buf, " USING INDEX TABLESPACE %s",
+ quote_identifier(get_tablespace_name(tblspc)));
+ }
+
+ break;
+ }
+ case CONSTRAINT_CHECK:
+ {
+ Datum val;
+ bool isnull;
+ char *conbin;
+ char *consrc;
+ Node *expr;
+ List *context;
+
+ /* Fetch constraint expression in parsetree form */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_conbin, &isnull);
+ if (isnull)
+ elog(ERROR, "null conbin for constraint %u",
+ constraintId);
+
+ conbin = TextDatumGetCString(val);
+ expr = stringToNode(conbin);
+
+ /* Set up deparsing context for Var nodes in constraint */
+ if (conForm->conrelid != InvalidOid)
+ {
+ /* relation constraint */
+ context = deparse_context_for(get_relation_name(conForm->conrelid),
+ conForm->conrelid);
+ }
+ else
+ {
+ /* domain constraint --- can't have Vars */
+ context = NIL;
+ }
+
+ consrc = deparse_expression_pretty(expr, context, false, false,
+ prettyFlags, 0);
+
+ /*
+ * Now emit the constraint definition, adding NO INHERIT if
+ * necessary.
+ *
+ * There are cases where the constraint expression will be
+ * fully parenthesized and we don't need the outer parens ...
+ * but there are other cases where we do need 'em. Be
+ * conservative for now.
+ *
+ * Note that simply checking for leading '(' and trailing ')'
+ * would NOT be good enough, consider "(x > 0) AND (y > 0)".
+ */
+ appendStringInfo(&buf, "CHECK (%s)%s",
+ consrc,
+ conForm->connoinherit ? " NO INHERIT" : "");
+ break;
+ }
+ case CONSTRAINT_TRIGGER:
+
+ /*
+ * There isn't an ALTER TABLE syntax for creating a user-defined
+ * constraint trigger, but it seems better to print something than
+ * throw an error; if we throw error then this function couldn't
+ * safely be applied to all rows of pg_constraint.
+ */
+ appendStringInfoString(&buf, "TRIGGER");
+ break;
+ case CONSTRAINT_EXCLUSION:
+ {
+ Oid indexOid = conForm->conindid;
+ Datum val;
+ bool isnull;
+ Datum *elems;
+ int nElems;
+ int i;
+ Oid *operators;
+
+ /* Extract operator OIDs from the pg_constraint tuple */
+ val = SysCacheGetAttr(CONSTROID, tup,
+ Anum_pg_constraint_conexclop,
+ &isnull);
+ if (isnull)
+ elog(ERROR, "null conexclop for constraint %u",
+ constraintId);
+
+ deconstruct_array(DatumGetArrayTypeP(val),
+ OIDOID, sizeof(Oid), true, TYPALIGN_INT,
+ &elems, NULL, &nElems);
+
+ operators = (Oid *) palloc(nElems * sizeof(Oid));
+ for (i = 0; i < nElems; i++)
+ operators[i] = DatumGetObjectId(elems[i]);
+
+ /* pg_get_indexdef_worker does the rest */
+ /* suppress tablespace because pg_dump wants it that way */
+ appendStringInfoString(&buf,
+ pg_get_indexdef_worker(indexOid,
+ 0,
+ operators,
+ false,
+ false,
+ false,
+ false,
+ prettyFlags,
+ false));
+ break;
+ }
+ default:
+ elog(ERROR, "invalid constraint type \"%c\"", conForm->contype);
+ break;
+ }
+
+ if (conForm->condeferrable)
+ appendStringInfoString(&buf, " DEFERRABLE");
+ if (conForm->condeferred)
+ appendStringInfoString(&buf, " INITIALLY DEFERRED");
+ if (!conForm->convalidated)
+ appendStringInfoString(&buf, " NOT VALID");
+
+ /* Cleanup */
+ systable_endscan(scandesc);
+ table_close(relation, AccessShareLock);
+
+ return buf.data;
+}
+
+
+/*
+ * Convert an int16[] Datum into a comma-separated list of column names
+ * for the indicated relation; append the list to buf. Returns the number
+ * of keys.
+ */
+static int
+decompile_column_index_array(Datum column_index_array, Oid relId,
+ StringInfo buf)
+{
+ Datum *keys;
+ int nKeys;
+ int j;
+
+ /* Extract data from array of int16 */
+ deconstruct_array(DatumGetArrayTypeP(column_index_array),
+ INT2OID, 2, true, TYPALIGN_SHORT,
+ &keys, NULL, &nKeys);
+
+ for (j = 0; j < nKeys; j++)
+ {
+ char *colName;
+
+ colName = get_attname(relId, DatumGetInt16(keys[j]), false);
+
+ if (j == 0)
+ appendStringInfoString(buf, quote_identifier(colName));
+ else
+ appendStringInfo(buf, ", %s", quote_identifier(colName));
+ }
+
+ return nKeys;
+}
+
+
+/* ----------
+ * pg_get_expr - Decompile an expression tree
+ *
+ * Input: an expression tree in nodeToString form, and a relation OID
+ *
+ * Output: reverse-listed expression
+ *
+ * Currently, the expression can only refer to a single relation, namely
+ * the one specified by the second parameter. This is sufficient for
+ * partial indexes, column default expressions, etc. We also support
+ * Var-free expressions, for which the OID can be InvalidOid.
+ *
+ * We expect this function to work, or throw a reasonably clean error,
+ * for any node tree that can appear in a catalog pg_node_tree column.
+ * Query trees, such as those appearing in pg_rewrite.ev_action, are
+ * not supported. Nor are expressions in more than one relation, which
+ * can appear in places like pg_rewrite.ev_qual.
+ * ----------
+ */
+Datum
+pg_get_expr(PG_FUNCTION_ARGS)
+{
+ text *expr = PG_GETARG_TEXT_PP(0);
+ Oid relid = PG_GETARG_OID(1);
+ int prettyFlags;
+ char *relname;
+
+ prettyFlags = PRETTYFLAG_INDENT;
+
+ if (OidIsValid(relid))
+ {
+ /* Get the name for the relation */
+ relname = get_rel_name(relid);
+
+ /*
+ * If the OID isn't actually valid, don't throw an error, just return
+ * NULL. This is a bit questionable, but it's what we've done
+ * historically, and it can help avoid unwanted failures when
+ * examining catalog entries for just-deleted relations.
+ */
+ if (relname == NULL)
+ PG_RETURN_NULL();
+ }
+ else
+ relname = NULL;
+
+ PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags));
+}
+
+Datum
+pg_get_expr_ext(PG_FUNCTION_ARGS)
+{
+ text *expr = PG_GETARG_TEXT_PP(0);
+ Oid relid = PG_GETARG_OID(1);
+ bool pretty = PG_GETARG_BOOL(2);
+ int prettyFlags;
+ char *relname;
+
+ prettyFlags = GET_PRETTY_FLAGS(pretty);
+
+ if (OidIsValid(relid))
+ {
+ /* Get the name for the relation */
+ relname = get_rel_name(relid);
+ /* See notes above */
+ if (relname == NULL)
+ PG_RETURN_NULL();
+ }
+ else
+ relname = NULL;
+
+ PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags));
+}
+
+static text *
+pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags)
+{
+ Node *node;
+ Node *tst;
+ Relids relids;
+ List *context;
+ char *exprstr;
+ char *str;
+
+ /* Convert input pg_node_tree (really TEXT) object to C string */
+ exprstr = text_to_cstring(expr);
+
+ /* Convert expression to node tree */
+ node = (Node *) stringToNode(exprstr);
+
+ pfree(exprstr);
+
+ /*
+ * Throw error if the input is a querytree rather than an expression tree.
+ * While we could support queries here, there seems no very good reason
+ * to. In most such catalog columns, we'll see a List of Query nodes, or
+ * even nested Lists, so drill down to a non-List node before checking.
+ */
+ tst = node;
+ while (tst && IsA(tst, List))
+ tst = linitial((List *) tst);
+ if (tst && IsA(tst, Query))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("input is a query, not an expression")));
+
+ /*
+ * Throw error if the expression contains Vars we won't be able to
+ * deparse.
+ */
+ relids = pull_varnos(NULL, node);
+ if (OidIsValid(relid))
+ {
+ if (!bms_is_subset(relids, bms_make_singleton(1)))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("expression contains variables of more than one relation")));
+ }
+ else
+ {
+ if (!bms_is_empty(relids))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("expression contains variables")));
+ }
+
+ /* Prepare deparse context if needed */
+ if (OidIsValid(relid))
+ context = deparse_context_for(relname, relid);
+ else
+ context = NIL;
+
+ /* Deparse */
+ str = deparse_expression_pretty(node, context, false, false,
+ prettyFlags, 0);
+
+ return string_to_text(str);
+}
+
+
+/* ----------
+ * pg_get_userbyid - Get a user name by roleid and
+ * fallback to 'unknown (OID=n)'
+ * ----------
+ */
+Datum
+pg_get_userbyid(PG_FUNCTION_ARGS)
+{
+ Oid roleid = PG_GETARG_OID(0);
+ Name result;
+ HeapTuple roletup;
+ Form_pg_authid role_rec;
+
+ /*
+ * Allocate space for the result
+ */
+ result = (Name) palloc(NAMEDATALEN);
+ memset(NameStr(*result), 0, NAMEDATALEN);
+
+ /*
+ * Get the pg_authid entry and print the result
+ */
+ roletup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (HeapTupleIsValid(roletup))
+ {
+ role_rec = (Form_pg_authid) GETSTRUCT(roletup);
+ *result = role_rec->rolname;
+ ReleaseSysCache(roletup);
+ }
+ else
+ sprintf(NameStr(*result), "unknown (OID=%u)", roleid);
+
+ PG_RETURN_NAME(result);
+}
+
+
+/*
+ * pg_get_serial_sequence
+ * Get the name of the sequence used by an identity or serial column,
+ * formatted suitably for passing to setval, nextval or currval.
+ * First parameter is not treated as double-quoted, second parameter
+ * is --- see documentation for reason.
+ */
+Datum
+pg_get_serial_sequence(PG_FUNCTION_ARGS)
+{
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ text *columnname = PG_GETARG_TEXT_PP(1);
+ RangeVar *tablerv;
+ Oid tableOid;
+ char *column;
+ AttrNumber attnum;
+ Oid sequenceId = InvalidOid;
+ Relation depRel;
+ ScanKeyData key[3];
+ SysScanDesc scan;
+ HeapTuple tup;
+
+ /* Look up table name. Can't lock it - we might not have privileges. */
+ tablerv = makeRangeVarFromNameList(textToQualifiedNameList(tablename));
+ tableOid = RangeVarGetRelid(tablerv, NoLock, false);
+
+ /* Get the number of the column */
+ column = text_to_cstring(columnname);
+
+ attnum = get_attnum(tableOid, column);
+ if (attnum == InvalidAttrNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_COLUMN),
+ errmsg("column \"%s\" of relation \"%s\" does not exist",
+ column, tablerv->relname)));
+
+ /* Search the dependency table for the dependent sequence */
+ depRel = table_open(DependRelationId, AccessShareLock);
+
+ ScanKeyInit(&key[0],
+ Anum_pg_depend_refclassid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationRelationId));
+ ScanKeyInit(&key[1],
+ Anum_pg_depend_refobjid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(tableOid));
+ ScanKeyInit(&key[2],
+ Anum_pg_depend_refobjsubid,
+ BTEqualStrategyNumber, F_INT4EQ,
+ Int32GetDatum(attnum));
+
+ scan = systable_beginscan(depRel, DependReferenceIndexId, true,
+ NULL, 3, key);
+
+ while (HeapTupleIsValid(tup = systable_getnext(scan)))
+ {
+ Form_pg_depend deprec = (Form_pg_depend) GETSTRUCT(tup);
+
+ /*
+ * Look for an auto dependency (serial column) or internal dependency
+ * (identity column) of a sequence on a column. (We need the relkind
+ * test because indexes can also have auto dependencies on columns.)
+ */
+ if (deprec->classid == RelationRelationId &&
+ deprec->objsubid == 0 &&
+ (deprec->deptype == DEPENDENCY_AUTO ||
+ deprec->deptype == DEPENDENCY_INTERNAL) &&
+ get_rel_relkind(deprec->objid) == RELKIND_SEQUENCE)
+ {
+ sequenceId = deprec->objid;
+ break;
+ }
+ }
+
+ systable_endscan(scan);
+ table_close(depRel, AccessShareLock);
+
+ if (OidIsValid(sequenceId))
+ {
+ char *result;
+
+ result = generate_qualified_relation_name(sequenceId);
+
+ PG_RETURN_TEXT_P(string_to_text(result));
+ }
+
+ PG_RETURN_NULL();
+}
+
+
+/*
+ * pg_get_functiondef
+ * Returns the complete "CREATE OR REPLACE FUNCTION ..." statement for
+ * the specified function.
+ *
+ * Note: if you change the output format of this function, be careful not
+ * to break psql's rules (in \ef and \sf) for identifying the start of the
+ * function body. To wit: the function body starts on a line that begins with
+ * "AS ", "BEGIN ", or "RETURN ", and no preceding line will look like that.
+ */
+Datum
+pg_get_functiondef(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ StringInfoData buf;
+ StringInfoData dq;
+ HeapTuple proctup;
+ Form_pg_proc proc;
+ bool isfunction;
+ Datum tmp;
+ bool isnull;
+ const char *prosrc;
+ const char *name;
+ const char *nsp;
+ float4 procost;
+ int oldlen;
+
+ initStringInfo(&buf);
+
+ /* Look up the function */
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ proc = (Form_pg_proc) GETSTRUCT(proctup);
+ name = NameStr(proc->proname);
+
+ if (proc->prokind == PROKIND_AGGREGATE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is an aggregate function", name)));
+
+ isfunction = (proc->prokind != PROKIND_PROCEDURE);
+
+ /*
+ * We always qualify the function name, to ensure the right function gets
+ * replaced.
+ */
+ nsp = get_namespace_name_or_temp(proc->pronamespace);
+ appendStringInfo(&buf, "CREATE OR REPLACE %s %s(",
+ isfunction ? "FUNCTION" : "PROCEDURE",
+ quote_qualified_identifier(nsp, name));
+ (void) print_function_arguments(&buf, proctup, false, true);
+ appendStringInfoString(&buf, ")\n");
+ if (isfunction)
+ {
+ appendStringInfoString(&buf, " RETURNS ");
+ print_function_rettype(&buf, proctup);
+ appendStringInfoChar(&buf, '\n');
+ }
+
+ print_function_trftypes(&buf, proctup);
+
+ appendStringInfo(&buf, " LANGUAGE %s\n",
+ quote_identifier(get_language_name(proc->prolang, false)));
+
+ /* Emit some miscellaneous options on one line */
+ oldlen = buf.len;
+
+ if (proc->prokind == PROKIND_WINDOW)
+ appendStringInfoString(&buf, " WINDOW");
+ switch (proc->provolatile)
+ {
+ case PROVOLATILE_IMMUTABLE:
+ appendStringInfoString(&buf, " IMMUTABLE");
+ break;
+ case PROVOLATILE_STABLE:
+ appendStringInfoString(&buf, " STABLE");
+ break;
+ case PROVOLATILE_VOLATILE:
+ break;
+ }
+
+ switch (proc->proparallel)
+ {
+ case PROPARALLEL_SAFE:
+ appendStringInfoString(&buf, " PARALLEL SAFE");
+ break;
+ case PROPARALLEL_RESTRICTED:
+ appendStringInfoString(&buf, " PARALLEL RESTRICTED");
+ break;
+ case PROPARALLEL_UNSAFE:
+ break;
+ }
+
+ if (proc->proisstrict)
+ appendStringInfoString(&buf, " STRICT");
+ if (proc->prosecdef)
+ appendStringInfoString(&buf, " SECURITY DEFINER");
+ if (proc->proleakproof)
+ appendStringInfoString(&buf, " LEAKPROOF");
+
+ /* This code for the default cost and rows should match functioncmds.c */
+ if (proc->prolang == INTERNALlanguageId ||
+ proc->prolang == ClanguageId)
+ procost = 1;
+ else
+ procost = 100;
+ if (proc->procost != procost)
+ appendStringInfo(&buf, " COST %g", proc->procost);
+
+ if (proc->prorows > 0 && proc->prorows != 1000)
+ appendStringInfo(&buf, " ROWS %g", proc->prorows);
+
+ if (proc->prosupport)
+ {
+ Oid argtypes[1];
+
+ /*
+ * We should qualify the support function's name if it wouldn't be
+ * resolved by lookup in the current search path.
+ */
+ argtypes[0] = INTERNALOID;
+ appendStringInfo(&buf, " SUPPORT %s",
+ generate_function_name(proc->prosupport, 1,
+ NIL, argtypes,
+ false, NULL, EXPR_KIND_NONE));
+ }
+
+ if (oldlen != buf.len)
+ appendStringInfoChar(&buf, '\n');
+
+ /* Emit any proconfig options, one per line */
+ tmp = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_proconfig, &isnull);
+ if (!isnull)
+ {
+ ArrayType *a = DatumGetArrayTypeP(tmp);
+ int i;
+
+ Assert(ARR_ELEMTYPE(a) == TEXTOID);
+ Assert(ARR_NDIM(a) == 1);
+ Assert(ARR_LBOUND(a)[0] == 1);
+
+ for (i = 1; i <= ARR_DIMS(a)[0]; i++)
+ {
+ Datum d;
+
+ d = array_ref(a, 1, &i,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ ,
+ &isnull);
+ if (!isnull)
+ {
+ char *configitem = TextDatumGetCString(d);
+ char *pos;
+
+ pos = strchr(configitem, '=');
+ if (pos == NULL)
+ continue;
+ *pos++ = '\0';
+
+ appendStringInfo(&buf, " SET %s TO ",
+ quote_identifier(configitem));
+
+ /*
+ * Variables that are marked GUC_LIST_QUOTE were already fully
+ * quoted by flatten_set_variable_args() before they were put
+ * into the proconfig array. However, because the quoting
+ * rules used there aren't exactly like SQL's, we have to
+ * break the list value apart and then quote the elements as
+ * string literals. (The elements may be double-quoted as-is,
+ * but we can't just feed them to the SQL parser; it would do
+ * the wrong thing with elements that are zero-length or
+ * longer than NAMEDATALEN.)
+ *
+ * Variables that are not so marked should just be emitted as
+ * simple string literals. If the variable is not known to
+ * guc.c, we'll do that; this makes it unsafe to use
+ * GUC_LIST_QUOTE for extension variables.
+ */
+ if (GetConfigOptionFlags(configitem, true) & GUC_LIST_QUOTE)
+ {
+ List *namelist;
+ ListCell *lc;
+
+ /* Parse string into list of identifiers */
+ if (!SplitGUCList(pos, ',', &namelist))
+ {
+ /* this shouldn't fail really */
+ elog(ERROR, "invalid list syntax in proconfig item");
+ }
+ foreach(lc, namelist)
+ {
+ char *curname = (char *) lfirst(lc);
+
+ simple_quote_literal(&buf, curname);
+ if (lnext(namelist, lc))
+ appendStringInfoString(&buf, ", ");
+ }
+ }
+ else
+ simple_quote_literal(&buf, pos);
+ appendStringInfoChar(&buf, '\n');
+ }
+ }
+ }
+
+ /* And finally the function definition ... */
+ (void) SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_prosqlbody, &isnull);
+ if (proc->prolang == SQLlanguageId && !isnull)
+ {
+ print_function_sqlbody(&buf, proctup);
+ }
+ else
+ {
+ appendStringInfoString(&buf, "AS ");
+
+ tmp = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_probin, &isnull);
+ if (!isnull)
+ {
+ simple_quote_literal(&buf, TextDatumGetCString(tmp));
+ appendStringInfoString(&buf, ", "); /* assume prosrc isn't null */
+ }
+
+ tmp = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_prosrc, &isnull);
+ if (isnull)
+ elog(ERROR, "null prosrc");
+ prosrc = TextDatumGetCString(tmp);
+
+ /*
+ * We always use dollar quoting. Figure out a suitable delimiter.
+ *
+ * Since the user is likely to be editing the function body string, we
+ * shouldn't use a short delimiter that he might easily create a
+ * conflict with. Hence prefer "$function$"/"$procedure$", but extend
+ * if needed.
+ */
+ initStringInfo(&dq);
+ appendStringInfoChar(&dq, '$');
+ appendStringInfoString(&dq, (isfunction ? "function" : "procedure"));
+ while (strstr(prosrc, dq.data) != NULL)
+ appendStringInfoChar(&dq, 'x');
+ appendStringInfoChar(&dq, '$');
+
+ appendBinaryStringInfo(&buf, dq.data, dq.len);
+ appendStringInfoString(&buf, prosrc);
+ appendBinaryStringInfo(&buf, dq.data, dq.len);
+ }
+
+ appendStringInfoChar(&buf, '\n');
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(string_to_text(buf.data));
+}
+
+/*
+ * pg_get_function_arguments
+ * Get a nicely-formatted list of arguments for a function.
+ * This is everything that would go between the parentheses in
+ * CREATE FUNCTION.
+ */
+Datum
+pg_get_function_arguments(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ StringInfoData buf;
+ HeapTuple proctup;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ initStringInfo(&buf);
+
+ (void) print_function_arguments(&buf, proctup, false, true);
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(string_to_text(buf.data));
+}
+
+/*
+ * pg_get_function_identity_arguments
+ * Get a formatted list of arguments for a function.
+ * This is everything that would go between the parentheses in
+ * ALTER FUNCTION, etc. In particular, don't print defaults.
+ */
+Datum
+pg_get_function_identity_arguments(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ StringInfoData buf;
+ HeapTuple proctup;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ initStringInfo(&buf);
+
+ (void) print_function_arguments(&buf, proctup, false, false);
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(string_to_text(buf.data));
+}
+
+/*
+ * pg_get_function_result
+ * Get a nicely-formatted version of the result type of a function.
+ * This is what would appear after RETURNS in CREATE FUNCTION.
+ */
+Datum
+pg_get_function_result(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ StringInfoData buf;
+ HeapTuple proctup;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ if (((Form_pg_proc) GETSTRUCT(proctup))->prokind == PROKIND_PROCEDURE)
+ {
+ ReleaseSysCache(proctup);
+ PG_RETURN_NULL();
+ }
+
+ initStringInfo(&buf);
+
+ print_function_rettype(&buf, proctup);
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(string_to_text(buf.data));
+}
+
+/*
+ * Guts of pg_get_function_result: append the function's return type
+ * to the specified buffer.
+ */
+static void
+print_function_rettype(StringInfo buf, HeapTuple proctup)
+{
+ Form_pg_proc proc = (Form_pg_proc) GETSTRUCT(proctup);
+ int ntabargs = 0;
+ StringInfoData rbuf;
+
+ initStringInfo(&rbuf);
+
+ if (proc->proretset)
+ {
+ /* It might be a table function; try to print the arguments */
+ appendStringInfoString(&rbuf, "TABLE(");
+ ntabargs = print_function_arguments(&rbuf, proctup, true, false);
+ if (ntabargs > 0)
+ appendStringInfoChar(&rbuf, ')');
+ else
+ resetStringInfo(&rbuf);
+ }
+
+ if (ntabargs == 0)
+ {
+ /* Not a table function, so do the normal thing */
+ if (proc->proretset)
+ appendStringInfoString(&rbuf, "SETOF ");
+ appendStringInfoString(&rbuf, format_type_be(proc->prorettype));
+ }
+
+ appendBinaryStringInfo(buf, rbuf.data, rbuf.len);
+}
+
+/*
+ * Common code for pg_get_function_arguments and pg_get_function_result:
+ * append the desired subset of arguments to buf. We print only TABLE
+ * arguments when print_table_args is true, and all the others when it's false.
+ * We print argument defaults only if print_defaults is true.
+ * Function return value is the number of arguments printed.
+ */
+static int
+print_function_arguments(StringInfo buf, HeapTuple proctup,
+ bool print_table_args, bool print_defaults)
+{
+ Form_pg_proc proc = (Form_pg_proc) GETSTRUCT(proctup);
+ int numargs;
+ Oid *argtypes;
+ char **argnames;
+ char *argmodes;
+ int insertorderbyat = -1;
+ int argsprinted;
+ int inputargno;
+ int nlackdefaults;
+ List *argdefaults = NIL;
+ ListCell *nextargdefault = NULL;
+ int i;
+
+ numargs = get_func_arg_info(proctup,
+ &argtypes, &argnames, &argmodes);
+
+ nlackdefaults = numargs;
+ if (print_defaults && proc->pronargdefaults > 0)
+ {
+ Datum proargdefaults;
+ bool isnull;
+
+ proargdefaults = SysCacheGetAttr(PROCOID, proctup,
+ Anum_pg_proc_proargdefaults,
+ &isnull);
+ if (!isnull)
+ {
+ char *str;
+
+ str = TextDatumGetCString(proargdefaults);
+ argdefaults = castNode(List, stringToNode(str));
+ pfree(str);
+ nextargdefault = list_head(argdefaults);
+ /* nlackdefaults counts only *input* arguments lacking defaults */
+ nlackdefaults = proc->pronargs - list_length(argdefaults);
+ }
+ }
+
+ /* Check for special treatment of ordered-set aggregates */
+ if (proc->prokind == PROKIND_AGGREGATE)
+ {
+ HeapTuple aggtup;
+ Form_pg_aggregate agg;
+
+ aggtup = SearchSysCache1(AGGFNOID, proc->oid);
+ if (!HeapTupleIsValid(aggtup))
+ elog(ERROR, "cache lookup failed for aggregate %u",
+ proc->oid);
+ agg = (Form_pg_aggregate) GETSTRUCT(aggtup);
+ if (AGGKIND_IS_ORDERED_SET(agg->aggkind))
+ insertorderbyat = agg->aggnumdirectargs;
+ ReleaseSysCache(aggtup);
+ }
+
+ argsprinted = 0;
+ inputargno = 0;
+ for (i = 0; i < numargs; i++)
+ {
+ Oid argtype = argtypes[i];
+ char *argname = argnames ? argnames[i] : NULL;
+ char argmode = argmodes ? argmodes[i] : PROARGMODE_IN;
+ const char *modename;
+ bool isinput;
+
+ switch (argmode)
+ {
+ case PROARGMODE_IN:
+
+ /*
+ * For procedures, explicitly mark all argument modes, so as
+ * to avoid ambiguity with the SQL syntax for DROP PROCEDURE.
+ */
+ if (proc->prokind == PROKIND_PROCEDURE)
+ modename = "IN ";
+ else
+ modename = "";
+ isinput = true;
+ break;
+ case PROARGMODE_INOUT:
+ modename = "INOUT ";
+ isinput = true;
+ break;
+ case PROARGMODE_OUT:
+ modename = "OUT ";
+ isinput = false;
+ break;
+ case PROARGMODE_VARIADIC:
+ modename = "VARIADIC ";
+ isinput = true;
+ break;
+ case PROARGMODE_TABLE:
+ modename = "";
+ isinput = false;
+ break;
+ default:
+ elog(ERROR, "invalid parameter mode '%c'", argmode);
+ modename = NULL; /* keep compiler quiet */
+ isinput = false;
+ break;
+ }
+ if (isinput)
+ inputargno++; /* this is a 1-based counter */
+
+ if (print_table_args != (argmode == PROARGMODE_TABLE))
+ continue;
+
+ if (argsprinted == insertorderbyat)
+ {
+ if (argsprinted)
+ appendStringInfoChar(buf, ' ');
+ appendStringInfoString(buf, "ORDER BY ");
+ }
+ else if (argsprinted)
+ appendStringInfoString(buf, ", ");
+
+ appendStringInfoString(buf, modename);
+ if (argname && argname[0])
+ appendStringInfo(buf, "%s ", quote_identifier(argname));
+ appendStringInfoString(buf, format_type_be(argtype));
+ if (print_defaults && isinput && inputargno > nlackdefaults)
+ {
+ Node *expr;
+
+ Assert(nextargdefault != NULL);
+ expr = (Node *) lfirst(nextargdefault);
+ nextargdefault = lnext(argdefaults, nextargdefault);
+
+ appendStringInfo(buf, " DEFAULT %s",
+ deparse_expression(expr, NIL, false, false));
+ }
+ argsprinted++;
+
+ /* nasty hack: print the last arg twice for variadic ordered-set agg */
+ if (argsprinted == insertorderbyat && i == numargs - 1)
+ {
+ i--;
+ /* aggs shouldn't have defaults anyway, but just to be sure ... */
+ print_defaults = false;
+ }
+ }
+
+ return argsprinted;
+}
+
+static bool
+is_input_argument(int nth, const char *argmodes)
+{
+ return (!argmodes
+ || argmodes[nth] == PROARGMODE_IN
+ || argmodes[nth] == PROARGMODE_INOUT
+ || argmodes[nth] == PROARGMODE_VARIADIC);
+}
+
+/*
+ * Append used transformed types to specified buffer
+ */
+static void
+print_function_trftypes(StringInfo buf, HeapTuple proctup)
+{
+ Oid *trftypes;
+ int ntypes;
+
+ ntypes = get_func_trftypes(proctup, &trftypes);
+ if (ntypes > 0)
+ {
+ int i;
+
+ appendStringInfoString(buf, " TRANSFORM ");
+ for (i = 0; i < ntypes; i++)
+ {
+ if (i != 0)
+ appendStringInfoString(buf, ", ");
+ appendStringInfo(buf, "FOR TYPE %s", format_type_be(trftypes[i]));
+ }
+ appendStringInfoChar(buf, '\n');
+ }
+}
+
+/*
+ * Get textual representation of a function argument's default value. The
+ * second argument of this function is the argument number among all arguments
+ * (i.e. proallargtypes, *not* proargtypes), starting with 1, because that's
+ * how information_schema.sql uses it.
+ */
+Datum
+pg_get_function_arg_default(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ int32 nth_arg = PG_GETARG_INT32(1);
+ HeapTuple proctup;
+ Form_pg_proc proc;
+ int numargs;
+ Oid *argtypes;
+ char **argnames;
+ char *argmodes;
+ int i;
+ List *argdefaults;
+ Node *node;
+ char *str;
+ int nth_inputarg;
+ Datum proargdefaults;
+ bool isnull;
+ int nth_default;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ numargs = get_func_arg_info(proctup, &argtypes, &argnames, &argmodes);
+ if (nth_arg < 1 || nth_arg > numargs || !is_input_argument(nth_arg - 1, argmodes))
+ {
+ ReleaseSysCache(proctup);
+ PG_RETURN_NULL();
+ }
+
+ nth_inputarg = 0;
+ for (i = 0; i < nth_arg; i++)
+ if (is_input_argument(i, argmodes))
+ nth_inputarg++;
+
+ proargdefaults = SysCacheGetAttr(PROCOID, proctup,
+ Anum_pg_proc_proargdefaults,
+ &isnull);
+ if (isnull)
+ {
+ ReleaseSysCache(proctup);
+ PG_RETURN_NULL();
+ }
+
+ str = TextDatumGetCString(proargdefaults);
+ argdefaults = castNode(List, stringToNode(str));
+ pfree(str);
+
+ proc = (Form_pg_proc) GETSTRUCT(proctup);
+
+ /*
+ * Calculate index into proargdefaults: proargdefaults corresponds to the
+ * last N input arguments, where N = pronargdefaults.
+ */
+ nth_default = nth_inputarg - 1 - (proc->pronargs - proc->pronargdefaults);
+
+ if (nth_default < 0 || nth_default >= list_length(argdefaults))
+ {
+ ReleaseSysCache(proctup);
+ PG_RETURN_NULL();
+ }
+ node = list_nth(argdefaults, nth_default);
+ str = deparse_expression(node, NIL, false, false);
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(string_to_text(str));
+}
+
+static void
+print_function_sqlbody(StringInfo buf, HeapTuple proctup)
+{
+ int numargs;
+ Oid *argtypes;
+ char **argnames;
+ char *argmodes;
+ deparse_namespace dpns = {0};
+ Datum tmp;
+ bool isnull;
+ Node *n;
+
+ dpns.funcname = pstrdup(NameStr(((Form_pg_proc) GETSTRUCT(proctup))->proname));
+ numargs = get_func_arg_info(proctup,
+ &argtypes, &argnames, &argmodes);
+ dpns.numargs = numargs;
+ dpns.argnames = argnames;
+
+ tmp = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_prosqlbody, &isnull);
+ Assert(!isnull);
+ n = stringToNode(TextDatumGetCString(tmp));
+
+ if (IsA(n, List))
+ {
+ List *stmts;
+ ListCell *lc;
+
+ stmts = linitial(castNode(List, n));
+
+ appendStringInfoString(buf, "BEGIN ATOMIC\n");
+
+ foreach(lc, stmts)
+ {
+ Query *query = lfirst_node(Query, lc);
+
+ /* It seems advisable to get at least AccessShareLock on rels */
+ AcquireRewriteLocks(query, false, false);
+ get_query_def(query, buf, list_make1(&dpns), NULL, false,
+ PRETTYFLAG_INDENT, WRAP_COLUMN_DEFAULT, 1);
+ appendStringInfoChar(buf, ';');
+ appendStringInfoChar(buf, '\n');
+ }
+
+ appendStringInfoString(buf, "END");
+ }
+ else
+ {
+ Query *query = castNode(Query, n);
+
+ /* It seems advisable to get at least AccessShareLock on rels */
+ AcquireRewriteLocks(query, false, false);
+ get_query_def(query, buf, list_make1(&dpns), NULL, false,
+ 0, WRAP_COLUMN_DEFAULT, 0);
+ }
+}
+
+Datum
+pg_get_function_sqlbody(PG_FUNCTION_ARGS)
+{
+ Oid funcid = PG_GETARG_OID(0);
+ StringInfoData buf;
+ HeapTuple proctup;
+ bool isnull;
+
+ initStringInfo(&buf);
+
+ /* Look up the function */
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ PG_RETURN_NULL();
+
+ (void) SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_prosqlbody, &isnull);
+ if (isnull)
+ {
+ ReleaseSysCache(proctup);
+ PG_RETURN_NULL();
+ }
+
+ print_function_sqlbody(&buf, proctup);
+
+ ReleaseSysCache(proctup);
+
+ PG_RETURN_TEXT_P(cstring_to_text(buf.data));
+}
+
+
+/*
+ * deparse_expression - General utility for deparsing expressions
+ *
+ * calls deparse_expression_pretty with all prettyPrinting disabled
+ */
+char *
+deparse_expression(Node *expr, List *dpcontext,
+ bool forceprefix, bool showimplicit)
+{
+ return deparse_expression_pretty(expr, dpcontext, forceprefix,
+ showimplicit, 0, 0);
+}
+
+/* ----------
+ * deparse_expression_pretty - General utility for deparsing expressions
+ *
+ * expr is the node tree to be deparsed. It must be a transformed expression
+ * tree (ie, not the raw output of gram.y).
+ *
+ * dpcontext is a list of deparse_namespace nodes representing the context
+ * for interpreting Vars in the node tree. It can be NIL if no Vars are
+ * expected.
+ *
+ * forceprefix is true to force all Vars to be prefixed with their table names.
+ *
+ * showimplicit is true to force all implicit casts to be shown explicitly.
+ *
+ * Tries to pretty up the output according to prettyFlags and startIndent.
+ *
+ * The result is a palloc'd string.
+ * ----------
+ */
+static char *
+deparse_expression_pretty(Node *expr, List *dpcontext,
+ bool forceprefix, bool showimplicit,
+ int prettyFlags, int startIndent)
+{
+ StringInfoData buf;
+ deparse_context context;
+
+ initStringInfo(&buf);
+ context.buf = &buf;
+ context.namespaces = dpcontext;
+ context.windowClause = NIL;
+ context.windowTList = NIL;
+ context.varprefix = forceprefix;
+ context.prettyFlags = prettyFlags;
+ context.wrapColumn = WRAP_COLUMN_DEFAULT;
+ context.indentLevel = startIndent;
+ context.special_exprkind = EXPR_KIND_NONE;
+ context.appendparents = NULL;
+
+ get_rule_expr(expr, &context, showimplicit);
+
+ return buf.data;
+}
+
+/* ----------
+ * deparse_context_for - Build deparse context for a single relation
+ *
+ * Given the reference name (alias) and OID of a relation, build deparsing
+ * context for an expression referencing only that relation (as varno 1,
+ * varlevelsup 0). This is sufficient for many uses of deparse_expression.
+ * ----------
+ */
+List *
+deparse_context_for(const char *aliasname, Oid relid)
+{
+ deparse_namespace *dpns;
+ RangeTblEntry *rte;
+
+ dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
+
+ /* Build a minimal RTE for the rel */
+ rte = makeNode(RangeTblEntry);
+ rte->rtekind = RTE_RELATION;
+ rte->relid = relid;
+ rte->relkind = RELKIND_RELATION; /* no need for exactness here */
+ rte->rellockmode = AccessShareLock;
+ rte->alias = makeAlias(aliasname, NIL);
+ rte->eref = rte->alias;
+ rte->lateral = false;
+ rte->inh = false;
+ rte->inFromCl = true;
+
+ /* Build one-element rtable */
+ dpns->rtable = list_make1(rte);
+ dpns->subplans = NIL;
+ dpns->ctes = NIL;
+ dpns->appendrels = NULL;
+ set_rtable_names(dpns, NIL, NULL);
+ set_simple_column_names(dpns);
+
+ /* Return a one-deep namespace stack */
+ return list_make1(dpns);
+}
+
+/*
+ * deparse_context_for_plan_tree - Build deparse context for a Plan tree
+ *
+ * When deparsing an expression in a Plan tree, we use the plan's rangetable
+ * to resolve names of simple Vars. The initialization of column names for
+ * this is rather expensive if the rangetable is large, and it'll be the same
+ * for every expression in the Plan tree; so we do it just once and re-use
+ * the result of this function for each expression. (Note that the result
+ * is not usable until set_deparse_context_plan() is applied to it.)
+ *
+ * In addition to the PlannedStmt, pass the per-RTE alias names
+ * assigned by a previous call to select_rtable_names_for_explain.
+ */
+List *
+deparse_context_for_plan_tree(PlannedStmt *pstmt, List *rtable_names)
+{
+ deparse_namespace *dpns;
+
+ dpns = (deparse_namespace *) palloc0(sizeof(deparse_namespace));
+
+ /* Initialize fields that stay the same across the whole plan tree */
+ dpns->rtable = pstmt->rtable;
+ dpns->rtable_names = rtable_names;
+ dpns->subplans = pstmt->subplans;
+ dpns->ctes = NIL;
+ if (pstmt->appendRelations)
+ {
+ /* Set up the array, indexed by child relid */
+ int ntables = list_length(dpns->rtable);
+ ListCell *lc;
+
+ dpns->appendrels = (AppendRelInfo **)
+ palloc0((ntables + 1) * sizeof(AppendRelInfo *));
+ foreach(lc, pstmt->appendRelations)
+ {
+ AppendRelInfo *appinfo = lfirst_node(AppendRelInfo, lc);
+ Index crelid = appinfo->child_relid;
+
+ Assert(crelid > 0 && crelid <= ntables);
+ Assert(dpns->appendrels[crelid] == NULL);
+ dpns->appendrels[crelid] = appinfo;
+ }
+ }
+ else
+ dpns->appendrels = NULL; /* don't need it */
+
+ /*
+ * Set up column name aliases. We will get rather bogus results for join
+ * RTEs, but that doesn't matter because plan trees don't contain any join
+ * alias Vars.
+ */
+ set_simple_column_names(dpns);
+
+ /* Return a one-deep namespace stack */
+ return list_make1(dpns);
+}
+
+/*
+ * set_deparse_context_plan - Specify Plan node containing expression
+ *
+ * When deparsing an expression in a Plan tree, we might have to resolve
+ * OUTER_VAR, INNER_VAR, or INDEX_VAR references. To do this, the caller must
+ * provide the parent Plan node. Then OUTER_VAR and INNER_VAR references
+ * can be resolved by drilling down into the left and right child plans.
+ * Similarly, INDEX_VAR references can be resolved by reference to the
+ * indextlist given in a parent IndexOnlyScan node, or to the scan tlist in
+ * ForeignScan and CustomScan nodes. (Note that we don't currently support
+ * deparsing of indexquals in regular IndexScan or BitmapIndexScan nodes;
+ * for those, we can only deparse the indexqualorig fields, which won't
+ * contain INDEX_VAR Vars.)
+ *
+ * The ancestors list is a list of the Plan's parent Plan and SubPlan nodes,
+ * the most-closely-nested first. This is needed to resolve PARAM_EXEC
+ * Params. Note we assume that all the Plan nodes share the same rtable.
+ *
+ * Once this function has been called, deparse_expression() can be called on
+ * subsidiary expression(s) of the specified Plan node. To deparse
+ * expressions of a different Plan node in the same Plan tree, re-call this
+ * function to identify the new parent Plan node.
+ *
+ * The result is the same List passed in; this is a notational convenience.
+ */
+List *
+set_deparse_context_plan(List *dpcontext, Plan *plan, List *ancestors)
+{
+ deparse_namespace *dpns;
+
+ /* Should always have one-entry namespace list for Plan deparsing */
+ Assert(list_length(dpcontext) == 1);
+ dpns = (deparse_namespace *) linitial(dpcontext);
+
+ /* Set our attention on the specific plan node passed in */
+ dpns->ancestors = ancestors;
+ set_deparse_plan(dpns, plan);
+
+ return dpcontext;
+}
+
+/*
+ * select_rtable_names_for_explain - Select RTE aliases for EXPLAIN
+ *
+ * Determine the relation aliases we'll use during an EXPLAIN operation.
+ * This is just a frontend to set_rtable_names. We have to expose the aliases
+ * to EXPLAIN because EXPLAIN needs to know the right alias names to print.
+ */
+List *
+select_rtable_names_for_explain(List *rtable, Bitmapset *rels_used)
+{
+ deparse_namespace dpns;
+
+ memset(&dpns, 0, sizeof(dpns));
+ dpns.rtable = rtable;
+ dpns.subplans = NIL;
+ dpns.ctes = NIL;
+ dpns.appendrels = NULL;
+ set_rtable_names(&dpns, NIL, rels_used);
+ /* We needn't bother computing column aliases yet */
+
+ return dpns.rtable_names;
+}
+
+/*
+ * set_rtable_names: select RTE aliases to be used in printing a query
+ *
+ * We fill in dpns->rtable_names with a list of names that is one-for-one with
+ * the already-filled dpns->rtable list. Each RTE name is unique among those
+ * in the new namespace plus any ancestor namespaces listed in
+ * parent_namespaces.
+ *
+ * If rels_used isn't NULL, only RTE indexes listed in it are given aliases.
+ *
+ * Note that this function is only concerned with relation names, not column
+ * names.
+ */
+static void
+set_rtable_names(deparse_namespace *dpns, List *parent_namespaces,
+ Bitmapset *rels_used)
+{
+ HASHCTL hash_ctl;
+ HTAB *names_hash;
+ NameHashEntry *hentry;
+ bool found;
+ int rtindex;
+ ListCell *lc;
+
+ dpns->rtable_names = NIL;
+ /* nothing more to do if empty rtable */
+ if (dpns->rtable == NIL)
+ return;
+
+ /*
+ * We use a hash table to hold known names, so that this process is O(N)
+ * not O(N^2) for N names.
+ */
+ hash_ctl.keysize = NAMEDATALEN;
+ hash_ctl.entrysize = sizeof(NameHashEntry);
+ hash_ctl.hcxt = CurrentMemoryContext;
+ names_hash = hash_create("set_rtable_names names",
+ list_length(dpns->rtable),
+ &hash_ctl,
+ HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
+
+ /* Preload the hash table with names appearing in parent_namespaces */
+ foreach(lc, parent_namespaces)
+ {
+ deparse_namespace *olddpns = (deparse_namespace *) lfirst(lc);
+ ListCell *lc2;
+
+ foreach(lc2, olddpns->rtable_names)
+ {
+ char *oldname = (char *) lfirst(lc2);
+
+ if (oldname == NULL)
+ continue;
+ hentry = (NameHashEntry *) hash_search(names_hash,
+ oldname,
+ HASH_ENTER,
+ &found);
+ /* we do not complain about duplicate names in parent namespaces */
+ hentry->counter = 0;
+ }
+ }
+
+ /* Now we can scan the rtable */
+ rtindex = 1;
+ foreach(lc, dpns->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
+ char *refname;
+
+ /* Just in case this takes an unreasonable amount of time ... */
+ CHECK_FOR_INTERRUPTS();
+
+ if (rels_used && !bms_is_member(rtindex, rels_used))
+ {
+ /* Ignore unreferenced RTE */
+ refname = NULL;
+ }
+ else if (rte->alias)
+ {
+ /* If RTE has a user-defined alias, prefer that */
+ refname = rte->alias->aliasname;
+ }
+ else if (rte->rtekind == RTE_RELATION)
+ {
+ /* Use the current actual name of the relation */
+ refname = get_rel_name(rte->relid);
+ }
+ else if (rte->rtekind == RTE_JOIN)
+ {
+ /* Unnamed join has no refname */
+ refname = NULL;
+ }
+ else
+ {
+ /* Otherwise use whatever the parser assigned */
+ refname = rte->eref->aliasname;
+ }
+
+ /*
+ * If the selected name isn't unique, append digits to make it so, and
+ * make a new hash entry for it once we've got a unique name. For a
+ * very long input name, we might have to truncate to stay within
+ * NAMEDATALEN.
+ */
+ if (refname)
+ {
+ hentry = (NameHashEntry *) hash_search(names_hash,
+ refname,
+ HASH_ENTER,
+ &found);
+ if (found)
+ {
+ /* Name already in use, must choose a new one */
+ int refnamelen = strlen(refname);
+ char *modname = (char *) palloc(refnamelen + 16);
+ NameHashEntry *hentry2;
+
+ do
+ {
+ hentry->counter++;
+ for (;;)
+ {
+ memcpy(modname, refname, refnamelen);
+ sprintf(modname + refnamelen, "_%d", hentry->counter);
+ if (strlen(modname) < NAMEDATALEN)
+ break;
+ /* drop chars from refname to keep all the digits */
+ refnamelen = pg_mbcliplen(refname, refnamelen,
+ refnamelen - 1);
+ }
+ hentry2 = (NameHashEntry *) hash_search(names_hash,
+ modname,
+ HASH_ENTER,
+ &found);
+ } while (found);
+ hentry2->counter = 0; /* init new hash entry */
+ refname = modname;
+ }
+ else
+ {
+ /* Name not previously used, need only initialize hentry */
+ hentry->counter = 0;
+ }
+ }
+
+ dpns->rtable_names = lappend(dpns->rtable_names, refname);
+ rtindex++;
+ }
+
+ hash_destroy(names_hash);
+}
+
+/*
+ * set_deparse_for_query: set up deparse_namespace for deparsing a Query tree
+ *
+ * For convenience, this is defined to initialize the deparse_namespace struct
+ * from scratch.
+ */
+static void
+set_deparse_for_query(deparse_namespace *dpns, Query *query,
+ List *parent_namespaces)
+{
+ ListCell *lc;
+ ListCell *lc2;
+
+ /* Initialize *dpns and fill rtable/ctes links */
+ memset(dpns, 0, sizeof(deparse_namespace));
+ dpns->rtable = query->rtable;
+ dpns->subplans = NIL;
+ dpns->ctes = query->cteList;
+ dpns->appendrels = NULL;
+
+ /* Assign a unique relation alias to each RTE */
+ set_rtable_names(dpns, parent_namespaces, NULL);
+
+ /* Initialize dpns->rtable_columns to contain zeroed structs */
+ dpns->rtable_columns = NIL;
+ while (list_length(dpns->rtable_columns) < list_length(dpns->rtable))
+ dpns->rtable_columns = lappend(dpns->rtable_columns,
+ palloc0(sizeof(deparse_columns)));
+
+ /* If it's a utility query, it won't have a jointree */
+ if (query->jointree)
+ {
+ /* Detect whether global uniqueness of USING names is needed */
+ dpns->unique_using =
+ has_dangerous_join_using(dpns, (Node *) query->jointree);
+
+ /*
+ * Select names for columns merged by USING, via a recursive pass over
+ * the query jointree.
+ */
+ set_using_names(dpns, (Node *) query->jointree, NIL);
+ }
+
+ /*
+ * Now assign remaining column aliases for each RTE. We do this in a
+ * linear scan of the rtable, so as to process RTEs whether or not they
+ * are in the jointree (we mustn't miss NEW.*, INSERT target relations,
+ * etc). JOIN RTEs must be processed after their children, but this is
+ * okay because they appear later in the rtable list than their children
+ * (cf Asserts in identify_join_columns()).
+ */
+ forboth(lc, dpns->rtable, lc2, dpns->rtable_columns)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
+ deparse_columns *colinfo = (deparse_columns *) lfirst(lc2);
+
+ if (rte->rtekind == RTE_JOIN)
+ set_join_column_names(dpns, rte, colinfo);
+ else
+ set_relation_column_names(dpns, rte, colinfo);
+ }
+}
+
+/*
+ * set_simple_column_names: fill in column aliases for non-query situations
+ *
+ * This handles EXPLAIN and cases where we only have relation RTEs. Without
+ * a join tree, we can't do anything smart about join RTEs, but we don't
+ * need to (note that EXPLAIN should never see join alias Vars anyway).
+ * If we do hit a join RTE we'll just process it like a non-table base RTE.
+ */
+static void
+set_simple_column_names(deparse_namespace *dpns)
+{
+ ListCell *lc;
+ ListCell *lc2;
+
+ /* Initialize dpns->rtable_columns to contain zeroed structs */
+ dpns->rtable_columns = NIL;
+ while (list_length(dpns->rtable_columns) < list_length(dpns->rtable))
+ dpns->rtable_columns = lappend(dpns->rtable_columns,
+ palloc0(sizeof(deparse_columns)));
+
+ /* Assign unique column aliases within each RTE */
+ forboth(lc, dpns->rtable, lc2, dpns->rtable_columns)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
+ deparse_columns *colinfo = (deparse_columns *) lfirst(lc2);
+
+ set_relation_column_names(dpns, rte, colinfo);
+ }
+}
+
+/*
+ * has_dangerous_join_using: search jointree for unnamed JOIN USING
+ *
+ * Merged columns of a JOIN USING may act differently from either of the input
+ * columns, either because they are merged with COALESCE (in a FULL JOIN) or
+ * because an implicit coercion of the underlying input column is required.
+ * In such a case the column must be referenced as a column of the JOIN not as
+ * a column of either input. And this is problematic if the join is unnamed
+ * (alias-less): we cannot qualify the column's name with an RTE name, since
+ * there is none. (Forcibly assigning an alias to the join is not a solution,
+ * since that will prevent legal references to tables below the join.)
+ * To ensure that every column in the query is unambiguously referenceable,
+ * we must assign such merged columns names that are globally unique across
+ * the whole query, aliasing other columns out of the way as necessary.
+ *
+ * Because the ensuing re-aliasing is fairly damaging to the readability of
+ * the query, we don't do this unless we have to. So, we must pre-scan
+ * the join tree to see if we have to, before starting set_using_names().
+ */
+static bool
+has_dangerous_join_using(deparse_namespace *dpns, Node *jtnode)
+{
+ if (IsA(jtnode, RangeTblRef))
+ {
+ /* nothing to do here */
+ }
+ else if (IsA(jtnode, FromExpr))
+ {
+ FromExpr *f = (FromExpr *) jtnode;
+ ListCell *lc;
+
+ foreach(lc, f->fromlist)
+ {
+ if (has_dangerous_join_using(dpns, (Node *) lfirst(lc)))
+ return true;
+ }
+ }
+ else if (IsA(jtnode, JoinExpr))
+ {
+ JoinExpr *j = (JoinExpr *) jtnode;
+
+ /* Is it an unnamed JOIN with USING? */
+ if (j->alias == NULL && j->usingClause)
+ {
+ /*
+ * Yes, so check each join alias var to see if any of them are not
+ * simple references to underlying columns. If so, we have a
+ * dangerous situation and must pick unique aliases.
+ */
+ RangeTblEntry *jrte = rt_fetch(j->rtindex, dpns->rtable);
+
+ /* We need only examine the merged columns */
+ for (int i = 0; i < jrte->joinmergedcols; i++)
+ {
+ Node *aliasvar = list_nth(jrte->joinaliasvars, i);
+
+ if (!IsA(aliasvar, Var))
+ return true;
+ }
+ }
+
+ /* Nope, but inspect children */
+ if (has_dangerous_join_using(dpns, j->larg))
+ return true;
+ if (has_dangerous_join_using(dpns, j->rarg))
+ return true;
+ }
+ else
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(jtnode));
+ return false;
+}
+
+/*
+ * set_using_names: select column aliases to be used for merged USING columns
+ *
+ * We do this during a recursive descent of the query jointree.
+ * dpns->unique_using must already be set to determine the global strategy.
+ *
+ * Column alias info is saved in the dpns->rtable_columns list, which is
+ * assumed to be filled with pre-zeroed deparse_columns structs.
+ *
+ * parentUsing is a list of all USING aliases assigned in parent joins of
+ * the current jointree node. (The passed-in list must not be modified.)
+ */
+static void
+set_using_names(deparse_namespace *dpns, Node *jtnode, List *parentUsing)
+{
+ if (IsA(jtnode, RangeTblRef))
+ {
+ /* nothing to do now */
+ }
+ else if (IsA(jtnode, FromExpr))
+ {
+ FromExpr *f = (FromExpr *) jtnode;
+ ListCell *lc;
+
+ foreach(lc, f->fromlist)
+ set_using_names(dpns, (Node *) lfirst(lc), parentUsing);
+ }
+ else if (IsA(jtnode, JoinExpr))
+ {
+ JoinExpr *j = (JoinExpr *) jtnode;
+ RangeTblEntry *rte = rt_fetch(j->rtindex, dpns->rtable);
+ deparse_columns *colinfo = deparse_columns_fetch(j->rtindex, dpns);
+ int *leftattnos;
+ int *rightattnos;
+ deparse_columns *leftcolinfo;
+ deparse_columns *rightcolinfo;
+ int i;
+ ListCell *lc;
+
+ /* Get info about the shape of the join */
+ identify_join_columns(j, rte, colinfo);
+ leftattnos = colinfo->leftattnos;
+ rightattnos = colinfo->rightattnos;
+
+ /* Look up the not-yet-filled-in child deparse_columns structs */
+ leftcolinfo = deparse_columns_fetch(colinfo->leftrti, dpns);
+ rightcolinfo = deparse_columns_fetch(colinfo->rightrti, dpns);
+
+ /*
+ * If this join is unnamed, then we cannot substitute new aliases at
+ * this level, so any name requirements pushed down to here must be
+ * pushed down again to the children.
+ */
+ if (rte->alias == NULL)
+ {
+ for (i = 0; i < colinfo->num_cols; i++)
+ {
+ char *colname = colinfo->colnames[i];
+
+ if (colname == NULL)
+ continue;
+
+ /* Push down to left column, unless it's a system column */
+ if (leftattnos[i] > 0)
+ {
+ expand_colnames_array_to(leftcolinfo, leftattnos[i]);
+ leftcolinfo->colnames[leftattnos[i] - 1] = colname;
+ }
+
+ /* Same on the righthand side */
+ if (rightattnos[i] > 0)
+ {
+ expand_colnames_array_to(rightcolinfo, rightattnos[i]);
+ rightcolinfo->colnames[rightattnos[i] - 1] = colname;
+ }
+ }
+ }
+
+ /*
+ * If there's a USING clause, select the USING column names and push
+ * those names down to the children. We have two strategies:
+ *
+ * If dpns->unique_using is true, we force all USING names to be
+ * unique across the whole query level. In principle we'd only need
+ * the names of dangerous USING columns to be globally unique, but to
+ * safely assign all USING names in a single pass, we have to enforce
+ * the same uniqueness rule for all of them. However, if a USING
+ * column's name has been pushed down from the parent, we should use
+ * it as-is rather than making a uniqueness adjustment. This is
+ * necessary when we're at an unnamed join, and it creates no risk of
+ * ambiguity. Also, if there's a user-written output alias for a
+ * merged column, we prefer to use that rather than the input name;
+ * this simplifies the logic and seems likely to lead to less aliasing
+ * overall.
+ *
+ * If dpns->unique_using is false, we only need USING names to be
+ * unique within their own join RTE. We still need to honor
+ * pushed-down names, though.
+ *
+ * Though significantly different in results, these two strategies are
+ * implemented by the same code, with only the difference of whether
+ * to put assigned names into dpns->using_names.
+ */
+ if (j->usingClause)
+ {
+ /* Copy the input parentUsing list so we don't modify it */
+ parentUsing = list_copy(parentUsing);
+
+ /* USING names must correspond to the first join output columns */
+ expand_colnames_array_to(colinfo, list_length(j->usingClause));
+ i = 0;
+ foreach(lc, j->usingClause)
+ {
+ char *colname = strVal(lfirst(lc));
+
+ /* Assert it's a merged column */
+ Assert(leftattnos[i] != 0 && rightattnos[i] != 0);
+
+ /* Adopt passed-down name if any, else select unique name */
+ if (colinfo->colnames[i] != NULL)
+ colname = colinfo->colnames[i];
+ else
+ {
+ /* Prefer user-written output alias if any */
+ if (rte->alias && i < list_length(rte->alias->colnames))
+ colname = strVal(list_nth(rte->alias->colnames, i));
+ /* Make it appropriately unique */
+ colname = make_colname_unique(colname, dpns, colinfo);
+ if (dpns->unique_using)
+ dpns->using_names = lappend(dpns->using_names,
+ colname);
+ /* Save it as output column name, too */
+ colinfo->colnames[i] = colname;
+ }
+
+ /* Remember selected names for use later */
+ colinfo->usingNames = lappend(colinfo->usingNames, colname);
+ parentUsing = lappend(parentUsing, colname);
+
+ /* Push down to left column, unless it's a system column */
+ if (leftattnos[i] > 0)
+ {
+ expand_colnames_array_to(leftcolinfo, leftattnos[i]);
+ leftcolinfo->colnames[leftattnos[i] - 1] = colname;
+ }
+
+ /* Same on the righthand side */
+ if (rightattnos[i] > 0)
+ {
+ expand_colnames_array_to(rightcolinfo, rightattnos[i]);
+ rightcolinfo->colnames[rightattnos[i] - 1] = colname;
+ }
+
+ i++;
+ }
+ }
+
+ /* Mark child deparse_columns structs with correct parentUsing info */
+ leftcolinfo->parentUsing = parentUsing;
+ rightcolinfo->parentUsing = parentUsing;
+
+ /* Now recursively assign USING column names in children */
+ set_using_names(dpns, j->larg, parentUsing);
+ set_using_names(dpns, j->rarg, parentUsing);
+ }
+ else
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(jtnode));
+}
+
+/*
+ * set_relation_column_names: select column aliases for a non-join RTE
+ *
+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.
+ * If any colnames entries are already filled in, those override local
+ * choices.
+ */
+static void
+set_relation_column_names(deparse_namespace *dpns, RangeTblEntry *rte,
+ deparse_columns *colinfo)
+{
+ int ncolumns;
+ char **real_colnames;
+ bool changed_any;
+ int noldcolumns;
+ int i;
+ int j;
+
+ /*
+ * Construct an array of the current "real" column names of the RTE.
+ * real_colnames[] will be indexed by physical column number, with NULL
+ * entries for dropped columns.
+ */
+ if (rte->rtekind == RTE_RELATION)
+ {
+ /* Relation --- look to the system catalogs for up-to-date info */
+ Relation rel;
+ TupleDesc tupdesc;
+
+ rel = relation_open(rte->relid, AccessShareLock);
+ tupdesc = RelationGetDescr(rel);
+
+ ncolumns = tupdesc->natts;
+ real_colnames = (char **) palloc(ncolumns * sizeof(char *));
+
+ for (i = 0; i < ncolumns; i++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (attr->attisdropped)
+ real_colnames[i] = NULL;
+ else
+ real_colnames[i] = pstrdup(NameStr(attr->attname));
+ }
+ relation_close(rel, AccessShareLock);
+ }
+ else
+ {
+ /* Otherwise get the column names from eref or expandRTE() */
+ List *colnames;
+ ListCell *lc;
+
+ /*
+ * Functions returning composites have the annoying property that some
+ * of the composite type's columns might have been dropped since the
+ * query was parsed. If possible, use expandRTE() to handle that
+ * case, since it has the tedious logic needed to find out about
+ * dropped columns. However, if we're explaining a plan, then we
+ * don't have rte->functions because the planner thinks that won't be
+ * needed later, and that breaks expandRTE(). So in that case we have
+ * to rely on rte->eref, which may lead us to report a dropped
+ * column's old name; that seems close enough for EXPLAIN's purposes.
+ *
+ * For non-RELATION, non-FUNCTION RTEs, we can just look at rte->eref,
+ * which should be sufficiently up-to-date: no other RTE types can
+ * have columns get dropped from under them after parsing.
+ */
+ if (rte->rtekind == RTE_FUNCTION && rte->functions != NIL)
+ {
+ /* Since we're not creating Vars, rtindex etc. don't matter */
+ expandRTE(rte, 1, 0, -1, true /* include dropped */ ,
+ &colnames, NULL);
+ }
+ else
+ colnames = rte->eref->colnames;
+
+ ncolumns = list_length(colnames);
+ real_colnames = (char **) palloc(ncolumns * sizeof(char *));
+
+ i = 0;
+ foreach(lc, colnames)
+ {
+ /*
+ * If the column name we find here is an empty string, then it's a
+ * dropped column, so change to NULL.
+ */
+ char *cname = strVal(lfirst(lc));
+
+ if (cname[0] == '\0')
+ cname = NULL;
+ real_colnames[i] = cname;
+ i++;
+ }
+ }
+
+ /*
+ * Ensure colinfo->colnames has a slot for each column. (It could be long
+ * enough already, if we pushed down a name for the last column.) Note:
+ * it's possible that there are now more columns than there were when the
+ * query was parsed, ie colnames could be longer than rte->eref->colnames.
+ * We must assign unique aliases to the new columns too, else there could
+ * be unresolved conflicts when the view/rule is reloaded.
+ */
+ expand_colnames_array_to(colinfo, ncolumns);
+ Assert(colinfo->num_cols == ncolumns);
+
+ /*
+ * Make sufficiently large new_colnames and is_new_col arrays, too.
+ *
+ * Note: because we leave colinfo->num_new_cols zero until after the loop,
+ * colname_is_unique will not consult that array, which is fine because it
+ * would only be duplicate effort.
+ */
+ colinfo->new_colnames = (char **) palloc(ncolumns * sizeof(char *));
+ colinfo->is_new_col = (bool *) palloc(ncolumns * sizeof(bool));
+
+ /*
+ * Scan the columns, select a unique alias for each one, and store it in
+ * colinfo->colnames and colinfo->new_colnames. The former array has NULL
+ * entries for dropped columns, the latter omits them. Also mark
+ * new_colnames entries as to whether they are new since parse time; this
+ * is the case for entries beyond the length of rte->eref->colnames.
+ */
+ noldcolumns = list_length(rte->eref->colnames);
+ changed_any = false;
+ j = 0;
+ for (i = 0; i < ncolumns; i++)
+ {
+ char *real_colname = real_colnames[i];
+ char *colname = colinfo->colnames[i];
+
+ /* Skip dropped columns */
+ if (real_colname == NULL)
+ {
+ Assert(colname == NULL); /* colnames[i] is already NULL */
+ continue;
+ }
+
+ /* If alias already assigned, that's what to use */
+ if (colname == NULL)
+ {
+ /* If user wrote an alias, prefer that over real column name */
+ if (rte->alias && i < list_length(rte->alias->colnames))
+ colname = strVal(list_nth(rte->alias->colnames, i));
+ else
+ colname = real_colname;
+
+ /* Unique-ify and insert into colinfo */
+ colname = make_colname_unique(colname, dpns, colinfo);
+
+ colinfo->colnames[i] = colname;
+ }
+
+ /* Put names of non-dropped columns in new_colnames[] too */
+ colinfo->new_colnames[j] = colname;
+ /* And mark them as new or not */
+ colinfo->is_new_col[j] = (i >= noldcolumns);
+ j++;
+
+ /* Remember if any assigned aliases differ from "real" name */
+ if (!changed_any && strcmp(colname, real_colname) != 0)
+ changed_any = true;
+ }
+
+ /*
+ * Set correct length for new_colnames[] array. (Note: if columns have
+ * been added, colinfo->num_cols includes them, which is not really quite
+ * right but is harmless, since any new columns must be at the end where
+ * they won't affect varattnos of pre-existing columns.)
+ */
+ colinfo->num_new_cols = j;
+
+ /*
+ * For a relation RTE, we need only print the alias column names if any
+ * are different from the underlying "real" names. For a function RTE,
+ * always emit a complete column alias list; this is to protect against
+ * possible instability of the default column names (eg, from altering
+ * parameter names). For tablefunc RTEs, we never print aliases, because
+ * the column names are part of the clause itself. For other RTE types,
+ * print if we changed anything OR if there were user-written column
+ * aliases (since the latter would be part of the underlying "reality").
+ */
+ if (rte->rtekind == RTE_RELATION)
+ colinfo->printaliases = changed_any;
+ else if (rte->rtekind == RTE_FUNCTION)
+ colinfo->printaliases = true;
+ else if (rte->rtekind == RTE_TABLEFUNC)
+ colinfo->printaliases = false;
+ else if (rte->alias && rte->alias->colnames != NIL)
+ colinfo->printaliases = true;
+ else
+ colinfo->printaliases = changed_any;
+}
+
+/*
+ * set_join_column_names: select column aliases for a join RTE
+ *
+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.
+ * If any colnames entries are already filled in, those override local
+ * choices. Also, names for USING columns were already chosen by
+ * set_using_names(). We further expect that column alias selection has been
+ * completed for both input RTEs.
+ */
+static void
+set_join_column_names(deparse_namespace *dpns, RangeTblEntry *rte,
+ deparse_columns *colinfo)
+{
+ deparse_columns *leftcolinfo;
+ deparse_columns *rightcolinfo;
+ bool changed_any;
+ int noldcolumns;
+ int nnewcolumns;
+ Bitmapset *leftmerged = NULL;
+ Bitmapset *rightmerged = NULL;
+ int i;
+ int j;
+ int ic;
+ int jc;
+
+ /* Look up the previously-filled-in child deparse_columns structs */
+ leftcolinfo = deparse_columns_fetch(colinfo->leftrti, dpns);
+ rightcolinfo = deparse_columns_fetch(colinfo->rightrti, dpns);
+
+ /*
+ * Ensure colinfo->colnames has a slot for each column. (It could be long
+ * enough already, if we pushed down a name for the last column.) Note:
+ * it's possible that one or both inputs now have more columns than there
+ * were when the query was parsed, but we'll deal with that below. We
+ * only need entries in colnames for pre-existing columns.
+ */
+ noldcolumns = list_length(rte->eref->colnames);
+ expand_colnames_array_to(colinfo, noldcolumns);
+ Assert(colinfo->num_cols == noldcolumns);
+
+ /*
+ * Scan the join output columns, select an alias for each one, and store
+ * it in colinfo->colnames. If there are USING columns, set_using_names()
+ * already selected their names, so we can start the loop at the first
+ * non-merged column.
+ */
+ changed_any = false;
+ for (i = list_length(colinfo->usingNames); i < noldcolumns; i++)
+ {
+ char *colname = colinfo->colnames[i];
+ char *real_colname;
+
+ /* Join column must refer to at least one input column */
+ Assert(colinfo->leftattnos[i] != 0 || colinfo->rightattnos[i] != 0);
+
+ /* Get the child column name */
+ if (colinfo->leftattnos[i] > 0)
+ real_colname = leftcolinfo->colnames[colinfo->leftattnos[i] - 1];
+ else if (colinfo->rightattnos[i] > 0)
+ real_colname = rightcolinfo->colnames[colinfo->rightattnos[i] - 1];
+ else
+ {
+ /* We're joining system columns --- use eref name */
+ real_colname = strVal(list_nth(rte->eref->colnames, i));
+ }
+
+ /* If child col has been dropped, no need to assign a join colname */
+ if (real_colname == NULL)
+ {
+ colinfo->colnames[i] = NULL;
+ continue;
+ }
+
+ /* In an unnamed join, just report child column names as-is */
+ if (rte->alias == NULL)
+ {
+ colinfo->colnames[i] = real_colname;
+ continue;
+ }
+
+ /* If alias already assigned, that's what to use */
+ if (colname == NULL)
+ {
+ /* If user wrote an alias, prefer that over real column name */
+ if (rte->alias && i < list_length(rte->alias->colnames))
+ colname = strVal(list_nth(rte->alias->colnames, i));
+ else
+ colname = real_colname;
+
+ /* Unique-ify and insert into colinfo */
+ colname = make_colname_unique(colname, dpns, colinfo);
+
+ colinfo->colnames[i] = colname;
+ }
+
+ /* Remember if any assigned aliases differ from "real" name */
+ if (!changed_any && strcmp(colname, real_colname) != 0)
+ changed_any = true;
+ }
+
+ /*
+ * Calculate number of columns the join would have if it were re-parsed
+ * now, and create storage for the new_colnames and is_new_col arrays.
+ *
+ * Note: colname_is_unique will be consulting new_colnames[] during the
+ * loops below, so its not-yet-filled entries must be zeroes.
+ */
+ nnewcolumns = leftcolinfo->num_new_cols + rightcolinfo->num_new_cols -
+ list_length(colinfo->usingNames);
+ colinfo->num_new_cols = nnewcolumns;
+ colinfo->new_colnames = (char **) palloc0(nnewcolumns * sizeof(char *));
+ colinfo->is_new_col = (bool *) palloc0(nnewcolumns * sizeof(bool));
+
+ /*
+ * Generating the new_colnames array is a bit tricky since any new columns
+ * added since parse time must be inserted in the right places. This code
+ * must match the parser, which will order a join's columns as merged
+ * columns first (in USING-clause order), then non-merged columns from the
+ * left input (in attnum order), then non-merged columns from the right
+ * input (ditto). If one of the inputs is itself a join, its columns will
+ * be ordered according to the same rule, which means newly-added columns
+ * might not be at the end. We can figure out what's what by consulting
+ * the leftattnos and rightattnos arrays plus the input is_new_col arrays.
+ *
+ * In these loops, i indexes leftattnos/rightattnos (so it's join varattno
+ * less one), j indexes new_colnames/is_new_col, and ic/jc have similar
+ * meanings for the current child RTE.
+ */
+
+ /* Handle merged columns; they are first and can't be new */
+ i = j = 0;
+ while (i < noldcolumns &&
+ colinfo->leftattnos[i] != 0 &&
+ colinfo->rightattnos[i] != 0)
+ {
+ /* column name is already determined and known unique */
+ colinfo->new_colnames[j] = colinfo->colnames[i];
+ colinfo->is_new_col[j] = false;
+
+ /* build bitmapsets of child attnums of merged columns */
+ if (colinfo->leftattnos[i] > 0)
+ leftmerged = bms_add_member(leftmerged, colinfo->leftattnos[i]);
+ if (colinfo->rightattnos[i] > 0)
+ rightmerged = bms_add_member(rightmerged, colinfo->rightattnos[i]);
+
+ i++, j++;
+ }
+
+ /* Handle non-merged left-child columns */
+ ic = 0;
+ for (jc = 0; jc < leftcolinfo->num_new_cols; jc++)
+ {
+ char *child_colname = leftcolinfo->new_colnames[jc];
+
+ if (!leftcolinfo->is_new_col[jc])
+ {
+ /* Advance ic to next non-dropped old column of left child */
+ while (ic < leftcolinfo->num_cols &&
+ leftcolinfo->colnames[ic] == NULL)
+ ic++;
+ Assert(ic < leftcolinfo->num_cols);
+ ic++;
+ /* If it is a merged column, we already processed it */
+ if (bms_is_member(ic, leftmerged))
+ continue;
+ /* Else, advance i to the corresponding existing join column */
+ while (i < colinfo->num_cols &&
+ colinfo->colnames[i] == NULL)
+ i++;
+ Assert(i < colinfo->num_cols);
+ Assert(ic == colinfo->leftattnos[i]);
+ /* Use the already-assigned name of this column */
+ colinfo->new_colnames[j] = colinfo->colnames[i];
+ i++;
+ }
+ else
+ {
+ /*
+ * Unique-ify the new child column name and assign, unless we're
+ * in an unnamed join, in which case just copy
+ */
+ if (rte->alias != NULL)
+ {
+ colinfo->new_colnames[j] =
+ make_colname_unique(child_colname, dpns, colinfo);
+ if (!changed_any &&
+ strcmp(colinfo->new_colnames[j], child_colname) != 0)
+ changed_any = true;
+ }
+ else
+ colinfo->new_colnames[j] = child_colname;
+ }
+
+ colinfo->is_new_col[j] = leftcolinfo->is_new_col[jc];
+ j++;
+ }
+
+ /* Handle non-merged right-child columns in exactly the same way */
+ ic = 0;
+ for (jc = 0; jc < rightcolinfo->num_new_cols; jc++)
+ {
+ char *child_colname = rightcolinfo->new_colnames[jc];
+
+ if (!rightcolinfo->is_new_col[jc])
+ {
+ /* Advance ic to next non-dropped old column of right child */
+ while (ic < rightcolinfo->num_cols &&
+ rightcolinfo->colnames[ic] == NULL)
+ ic++;
+ Assert(ic < rightcolinfo->num_cols);
+ ic++;
+ /* If it is a merged column, we already processed it */
+ if (bms_is_member(ic, rightmerged))
+ continue;
+ /* Else, advance i to the corresponding existing join column */
+ while (i < colinfo->num_cols &&
+ colinfo->colnames[i] == NULL)
+ i++;
+ Assert(i < colinfo->num_cols);
+ Assert(ic == colinfo->rightattnos[i]);
+ /* Use the already-assigned name of this column */
+ colinfo->new_colnames[j] = colinfo->colnames[i];
+ i++;
+ }
+ else
+ {
+ /*
+ * Unique-ify the new child column name and assign, unless we're
+ * in an unnamed join, in which case just copy
+ */
+ if (rte->alias != NULL)
+ {
+ colinfo->new_colnames[j] =
+ make_colname_unique(child_colname, dpns, colinfo);
+ if (!changed_any &&
+ strcmp(colinfo->new_colnames[j], child_colname) != 0)
+ changed_any = true;
+ }
+ else
+ colinfo->new_colnames[j] = child_colname;
+ }
+
+ colinfo->is_new_col[j] = rightcolinfo->is_new_col[jc];
+ j++;
+ }
+
+ /* Assert we processed the right number of columns */
+#ifdef USE_ASSERT_CHECKING
+ while (i < colinfo->num_cols && colinfo->colnames[i] == NULL)
+ i++;
+ Assert(i == colinfo->num_cols);
+ Assert(j == nnewcolumns);
+#endif
+
+ /*
+ * For a named join, print column aliases if we changed any from the child
+ * names. Unnamed joins cannot print aliases.
+ */
+ if (rte->alias != NULL)
+ colinfo->printaliases = changed_any;
+ else
+ colinfo->printaliases = false;
+}
+
+/*
+ * colname_is_unique: is colname distinct from already-chosen column names?
+ *
+ * dpns is query-wide info, colinfo is for the column's RTE
+ */
+static bool
+colname_is_unique(const char *colname, deparse_namespace *dpns,
+ deparse_columns *colinfo)
+{
+ int i;
+ ListCell *lc;
+
+ /* Check against already-assigned column aliases within RTE */
+ for (i = 0; i < colinfo->num_cols; i++)
+ {
+ char *oldname = colinfo->colnames[i];
+
+ if (oldname && strcmp(oldname, colname) == 0)
+ return false;
+ }
+
+ /*
+ * If we're building a new_colnames array, check that too (this will be
+ * partially but not completely redundant with the previous checks)
+ */
+ for (i = 0; i < colinfo->num_new_cols; i++)
+ {
+ char *oldname = colinfo->new_colnames[i];
+
+ if (oldname && strcmp(oldname, colname) == 0)
+ return false;
+ }
+
+ /* Also check against USING-column names that must be globally unique */
+ foreach(lc, dpns->using_names)
+ {
+ char *oldname = (char *) lfirst(lc);
+
+ if (strcmp(oldname, colname) == 0)
+ return false;
+ }
+
+ /* Also check against names already assigned for parent-join USING cols */
+ foreach(lc, colinfo->parentUsing)
+ {
+ char *oldname = (char *) lfirst(lc);
+
+ if (strcmp(oldname, colname) == 0)
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * make_colname_unique: modify colname if necessary to make it unique
+ *
+ * dpns is query-wide info, colinfo is for the column's RTE
+ */
+static char *
+make_colname_unique(char *colname, deparse_namespace *dpns,
+ deparse_columns *colinfo)
+{
+ /*
+ * If the selected name isn't unique, append digits to make it so. For a
+ * very long input name, we might have to truncate to stay within
+ * NAMEDATALEN.
+ */
+ if (!colname_is_unique(colname, dpns, colinfo))
+ {
+ int colnamelen = strlen(colname);
+ char *modname = (char *) palloc(colnamelen + 16);
+ int i = 0;
+
+ do
+ {
+ i++;
+ for (;;)
+ {
+ memcpy(modname, colname, colnamelen);
+ sprintf(modname + colnamelen, "_%d", i);
+ if (strlen(modname) < NAMEDATALEN)
+ break;
+ /* drop chars from colname to keep all the digits */
+ colnamelen = pg_mbcliplen(colname, colnamelen,
+ colnamelen - 1);
+ }
+ } while (!colname_is_unique(modname, dpns, colinfo));
+ colname = modname;
+ }
+ return colname;
+}
+
+/*
+ * expand_colnames_array_to: make colinfo->colnames at least n items long
+ *
+ * Any added array entries are initialized to zero.
+ */
+static void
+expand_colnames_array_to(deparse_columns *colinfo, int n)
+{
+ if (n > colinfo->num_cols)
+ {
+ if (colinfo->colnames == NULL)
+ colinfo->colnames = (char **) palloc0(n * sizeof(char *));
+ else
+ {
+ colinfo->colnames = (char **) repalloc(colinfo->colnames,
+ n * sizeof(char *));
+ memset(colinfo->colnames + colinfo->num_cols, 0,
+ (n - colinfo->num_cols) * sizeof(char *));
+ }
+ colinfo->num_cols = n;
+ }
+}
+
+/*
+ * identify_join_columns: figure out where columns of a join come from
+ *
+ * Fills the join-specific fields of the colinfo struct, except for
+ * usingNames which is filled later.
+ */
+static void
+identify_join_columns(JoinExpr *j, RangeTblEntry *jrte,
+ deparse_columns *colinfo)
+{
+ int numjoincols;
+ int jcolno;
+ int rcolno;
+ ListCell *lc;
+
+ /* Extract left/right child RT indexes */
+ if (IsA(j->larg, RangeTblRef))
+ colinfo->leftrti = ((RangeTblRef *) j->larg)->rtindex;
+ else if (IsA(j->larg, JoinExpr))
+ colinfo->leftrti = ((JoinExpr *) j->larg)->rtindex;
+ else
+ elog(ERROR, "unrecognized node type in jointree: %d",
+ (int) nodeTag(j->larg));
+ if (IsA(j->rarg, RangeTblRef))
+ colinfo->rightrti = ((RangeTblRef *) j->rarg)->rtindex;
+ else if (IsA(j->rarg, JoinExpr))
+ colinfo->rightrti = ((JoinExpr *) j->rarg)->rtindex;
+ else
+ elog(ERROR, "unrecognized node type in jointree: %d",
+ (int) nodeTag(j->rarg));
+
+ /* Assert children will be processed earlier than join in second pass */
+ Assert(colinfo->leftrti < j->rtindex);
+ Assert(colinfo->rightrti < j->rtindex);
+
+ /* Initialize result arrays with zeroes */
+ numjoincols = list_length(jrte->joinaliasvars);
+ Assert(numjoincols == list_length(jrte->eref->colnames));
+ colinfo->leftattnos = (int *) palloc0(numjoincols * sizeof(int));
+ colinfo->rightattnos = (int *) palloc0(numjoincols * sizeof(int));
+
+ /*
+ * Deconstruct RTE's joinleftcols/joinrightcols into desired format.
+ * Recall that the column(s) merged due to USING are the first column(s)
+ * of the join output. We need not do anything special while scanning
+ * joinleftcols, but while scanning joinrightcols we must distinguish
+ * merged from unmerged columns.
+ */
+ jcolno = 0;
+ foreach(lc, jrte->joinleftcols)
+ {
+ int leftattno = lfirst_int(lc);
+
+ colinfo->leftattnos[jcolno++] = leftattno;
+ }
+ rcolno = 0;
+ foreach(lc, jrte->joinrightcols)
+ {
+ int rightattno = lfirst_int(lc);
+
+ if (rcolno < jrte->joinmergedcols) /* merged column? */
+ colinfo->rightattnos[rcolno] = rightattno;
+ else
+ colinfo->rightattnos[jcolno++] = rightattno;
+ rcolno++;
+ }
+ Assert(jcolno == numjoincols);
+}
+
+/*
+ * get_rtable_name: convenience function to get a previously assigned RTE alias
+ *
+ * The RTE must belong to the topmost namespace level in "context".
+ */
+static char *
+get_rtable_name(int rtindex, deparse_context *context)
+{
+ deparse_namespace *dpns = (deparse_namespace *) linitial(context->namespaces);
+
+ Assert(rtindex > 0 && rtindex <= list_length(dpns->rtable_names));
+ return (char *) list_nth(dpns->rtable_names, rtindex - 1);
+}
+
+/*
+ * set_deparse_plan: set up deparse_namespace to parse subexpressions
+ * of a given Plan node
+ *
+ * This sets the plan, outer_plan, inner_plan, outer_tlist, inner_tlist,
+ * and index_tlist fields. Caller must already have adjusted the ancestors
+ * list if necessary. Note that the rtable, subplans, and ctes fields do
+ * not need to change when shifting attention to different plan nodes in a
+ * single plan tree.
+ */
+static void
+set_deparse_plan(deparse_namespace *dpns, Plan *plan)
+{
+ dpns->plan = plan;
+
+ /*
+ * We special-case Append and MergeAppend to pretend that the first child
+ * plan is the OUTER referent; we have to interpret OUTER Vars in their
+ * tlists according to one of the children, and the first one is the most
+ * natural choice.
+ */
+ if (IsA(plan, Append))
+ dpns->outer_plan = linitial(((Append *) plan)->appendplans);
+ else if (IsA(plan, MergeAppend))
+ dpns->outer_plan = linitial(((MergeAppend *) plan)->mergeplans);
+ else
+ dpns->outer_plan = outerPlan(plan);
+
+ if (dpns->outer_plan)
+ dpns->outer_tlist = dpns->outer_plan->targetlist;
+ else
+ dpns->outer_tlist = NIL;
+
+ /*
+ * For a SubqueryScan, pretend the subplan is INNER referent. (We don't
+ * use OUTER because that could someday conflict with the normal meaning.)
+ * Likewise, for a CteScan, pretend the subquery's plan is INNER referent.
+ * For a WorkTableScan, locate the parent RecursiveUnion plan node and use
+ * that as INNER referent.
+ *
+ * For MERGE, make the inner tlist point to the merge source tlist, which
+ * is same as the targetlist that the ModifyTable's source plan provides.
+ * For ON CONFLICT .. UPDATE we just need the inner tlist to point to the
+ * excluded expression's tlist. (Similar to the SubqueryScan we don't want
+ * to reuse OUTER, it's used for RETURNING in some modify table cases,
+ * although not INSERT .. CONFLICT).
+ */
+ if (IsA(plan, SubqueryScan))
+ dpns->inner_plan = ((SubqueryScan *) plan)->subplan;
+ else if (IsA(plan, CteScan))
+ dpns->inner_plan = list_nth(dpns->subplans,
+ ((CteScan *) plan)->ctePlanId - 1);
+ else if (IsA(plan, WorkTableScan))
+ dpns->inner_plan = find_recursive_union(dpns,
+ (WorkTableScan *) plan);
+ else if (IsA(plan, ModifyTable))
+ dpns->inner_plan = plan;
+ else
+ dpns->inner_plan = innerPlan(plan);
+
+ if (IsA(plan, ModifyTable))
+ {
+ if (((ModifyTable *) plan)->operation == CMD_MERGE)
+ dpns->inner_tlist = dpns->outer_tlist;
+ else
+ dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist;
+ }
+ else if (dpns->inner_plan)
+ dpns->inner_tlist = dpns->inner_plan->targetlist;
+ else
+ dpns->inner_tlist = NIL;
+
+ /* Set up referent for INDEX_VAR Vars, if needed */
+ if (IsA(plan, IndexOnlyScan))
+ dpns->index_tlist = ((IndexOnlyScan *) plan)->indextlist;
+ else if (IsA(plan, ForeignScan))
+ dpns->index_tlist = ((ForeignScan *) plan)->fdw_scan_tlist;
+ else if (IsA(plan, CustomScan))
+ dpns->index_tlist = ((CustomScan *) plan)->custom_scan_tlist;
+ else
+ dpns->index_tlist = NIL;
+}
+
+/*
+ * Locate the ancestor plan node that is the RecursiveUnion generating
+ * the WorkTableScan's work table. We can match on wtParam, since that
+ * should be unique within the plan tree.
+ */
+static Plan *
+find_recursive_union(deparse_namespace *dpns, WorkTableScan *wtscan)
+{
+ ListCell *lc;
+
+ foreach(lc, dpns->ancestors)
+ {
+ Plan *ancestor = (Plan *) lfirst(lc);
+
+ if (IsA(ancestor, RecursiveUnion) &&
+ ((RecursiveUnion *) ancestor)->wtParam == wtscan->wtParam)
+ return ancestor;
+ }
+ elog(ERROR, "could not find RecursiveUnion for WorkTableScan with wtParam %d",
+ wtscan->wtParam);
+ return NULL;
+}
+
+/*
+ * push_child_plan: temporarily transfer deparsing attention to a child plan
+ *
+ * When expanding an OUTER_VAR or INNER_VAR reference, we must adjust the
+ * deparse context in case the referenced expression itself uses
+ * OUTER_VAR/INNER_VAR. We modify the top stack entry in-place to avoid
+ * affecting levelsup issues (although in a Plan tree there really shouldn't
+ * be any).
+ *
+ * Caller must provide a local deparse_namespace variable to save the
+ * previous state for pop_child_plan.
+ */
+static void
+push_child_plan(deparse_namespace *dpns, Plan *plan,
+ deparse_namespace *save_dpns)
+{
+ /* Save state for restoration later */
+ *save_dpns = *dpns;
+
+ /* Link current plan node into ancestors list */
+ dpns->ancestors = lcons(dpns->plan, dpns->ancestors);
+
+ /* Set attention on selected child */
+ set_deparse_plan(dpns, plan);
+}
+
+/*
+ * pop_child_plan: undo the effects of push_child_plan
+ */
+static void
+pop_child_plan(deparse_namespace *dpns, deparse_namespace *save_dpns)
+{
+ List *ancestors;
+
+ /* Get rid of ancestors list cell added by push_child_plan */
+ ancestors = list_delete_first(dpns->ancestors);
+
+ /* Restore fields changed by push_child_plan */
+ *dpns = *save_dpns;
+
+ /* Make sure dpns->ancestors is right (may be unnecessary) */
+ dpns->ancestors = ancestors;
+}
+
+/*
+ * push_ancestor_plan: temporarily transfer deparsing attention to an
+ * ancestor plan
+ *
+ * When expanding a Param reference, we must adjust the deparse context
+ * to match the plan node that contains the expression being printed;
+ * otherwise we'd fail if that expression itself contains a Param or
+ * OUTER_VAR/INNER_VAR/INDEX_VAR variable.
+ *
+ * The target ancestor is conveniently identified by the ListCell holding it
+ * in dpns->ancestors.
+ *
+ * Caller must provide a local deparse_namespace variable to save the
+ * previous state for pop_ancestor_plan.
+ */
+static void
+push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell,
+ deparse_namespace *save_dpns)
+{
+ Plan *plan = (Plan *) lfirst(ancestor_cell);
+
+ /* Save state for restoration later */
+ *save_dpns = *dpns;
+
+ /* Build a new ancestor list with just this node's ancestors */
+ dpns->ancestors =
+ list_copy_tail(dpns->ancestors,
+ list_cell_number(dpns->ancestors, ancestor_cell) + 1);
+
+ /* Set attention on selected ancestor */
+ set_deparse_plan(dpns, plan);
+}
+
+/*
+ * pop_ancestor_plan: undo the effects of push_ancestor_plan
+ */
+static void
+pop_ancestor_plan(deparse_namespace *dpns, deparse_namespace *save_dpns)
+{
+ /* Free the ancestor list made in push_ancestor_plan */
+ list_free(dpns->ancestors);
+
+ /* Restore fields changed by push_ancestor_plan */
+ *dpns = *save_dpns;
+}
+
+
+/* ----------
+ * make_ruledef - reconstruct the CREATE RULE command
+ * for a given pg_rewrite tuple
+ * ----------
+ */
+static void
+make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
+ int prettyFlags)
+{
+ char *rulename;
+ char ev_type;
+ Oid ev_class;
+ bool is_instead;
+ char *ev_qual;
+ char *ev_action;
+ List *actions;
+ Relation ev_relation;
+ TupleDesc viewResultDesc = NULL;
+ int fno;
+ Datum dat;
+ bool isnull;
+
+ /*
+ * Get the attribute values from the rules tuple
+ */
+ fno = SPI_fnumber(rulettc, "rulename");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ rulename = NameStr(*(DatumGetName(dat)));
+
+ fno = SPI_fnumber(rulettc, "ev_type");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ ev_type = DatumGetChar(dat);
+
+ fno = SPI_fnumber(rulettc, "ev_class");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ ev_class = DatumGetObjectId(dat);
+
+ fno = SPI_fnumber(rulettc, "is_instead");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ is_instead = DatumGetBool(dat);
+
+ fno = SPI_fnumber(rulettc, "ev_qual");
+ ev_qual = SPI_getvalue(ruletup, rulettc, fno);
+ Assert(ev_qual != NULL);
+
+ fno = SPI_fnumber(rulettc, "ev_action");
+ ev_action = SPI_getvalue(ruletup, rulettc, fno);
+ Assert(ev_action != NULL);
+ actions = (List *) stringToNode(ev_action);
+ if (actions == NIL)
+ elog(ERROR, "invalid empty ev_action list");
+
+ ev_relation = table_open(ev_class, AccessShareLock);
+
+ /*
+ * Build the rules definition text
+ */
+ appendStringInfo(buf, "CREATE RULE %s AS",
+ quote_identifier(rulename));
+
+ if (prettyFlags & PRETTYFLAG_INDENT)
+ appendStringInfoString(buf, "\n ON ");
+ else
+ appendStringInfoString(buf, " ON ");
+
+ /* The event the rule is fired for */
+ switch (ev_type)
+ {
+ case '1':
+ appendStringInfoString(buf, "SELECT");
+ viewResultDesc = RelationGetDescr(ev_relation);
+ break;
+
+ case '2':
+ appendStringInfoString(buf, "UPDATE");
+ break;
+
+ case '3':
+ appendStringInfoString(buf, "INSERT");
+ break;
+
+ case '4':
+ appendStringInfoString(buf, "DELETE");
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("rule \"%s\" has unsupported event type %d",
+ rulename, ev_type)));
+ break;
+ }
+
+ /* The relation the rule is fired on */
+ appendStringInfo(buf, " TO %s",
+ (prettyFlags & PRETTYFLAG_SCHEMA) ?
+ generate_relation_name(ev_class, NIL) :
+ generate_qualified_relation_name(ev_class));
+
+ /* If the rule has an event qualification, add it */
+ if (strcmp(ev_qual, "<>") != 0)
+ {
+ Node *qual;
+ Query *query;
+ deparse_context context;
+ deparse_namespace dpns;
+
+ if (prettyFlags & PRETTYFLAG_INDENT)
+ appendStringInfoString(buf, "\n ");
+ appendStringInfoString(buf, " WHERE ");
+
+ qual = stringToNode(ev_qual);
+
+ /*
+ * We need to make a context for recognizing any Vars in the qual
+ * (which can only be references to OLD and NEW). Use the rtable of
+ * the first query in the action list for this purpose.
+ */
+ query = (Query *) linitial(actions);
+
+ /*
+ * If the action is INSERT...SELECT, OLD/NEW have been pushed down
+ * into the SELECT, and that's what we need to look at. (Ugly kluge
+ * ... try to fix this when we redesign querytrees.)
+ */
+ query = getInsertSelectQuery(query, NULL);
+
+ /* Must acquire locks right away; see notes in get_query_def() */
+ AcquireRewriteLocks(query, false, false);
+
+ context.buf = buf;
+ context.namespaces = list_make1(&dpns);
+ context.windowClause = NIL;
+ context.windowTList = NIL;
+ context.varprefix = (list_length(query->rtable) != 1);
+ context.prettyFlags = prettyFlags;
+ context.wrapColumn = WRAP_COLUMN_DEFAULT;
+ context.indentLevel = PRETTYINDENT_STD;
+ context.special_exprkind = EXPR_KIND_NONE;
+ context.appendparents = NULL;
+
+ set_deparse_for_query(&dpns, query, NIL);
+
+ get_rule_expr(qual, &context, false);
+ }
+
+ appendStringInfoString(buf, " DO ");
+
+ /* The INSTEAD keyword (if so) */
+ if (is_instead)
+ appendStringInfoString(buf, "INSTEAD ");
+
+ /* Finally the rules actions */
+ if (list_length(actions) > 1)
+ {
+ ListCell *action;
+ Query *query;
+
+ appendStringInfoChar(buf, '(');
+ foreach(action, actions)
+ {
+ query = (Query *) lfirst(action);
+ get_query_def(query, buf, NIL, viewResultDesc, true,
+ prettyFlags, WRAP_COLUMN_DEFAULT, 0);
+ if (prettyFlags)
+ appendStringInfoString(buf, ";\n");
+ else
+ appendStringInfoString(buf, "; ");
+ }
+ appendStringInfoString(buf, ");");
+ }
+ else
+ {
+ Query *query;
+
+ query = (Query *) linitial(actions);
+ get_query_def(query, buf, NIL, viewResultDesc, true,
+ prettyFlags, WRAP_COLUMN_DEFAULT, 0);
+ appendStringInfoChar(buf, ';');
+ }
+
+ table_close(ev_relation, AccessShareLock);
+}
+
+
+/* ----------
+ * make_viewdef - reconstruct the SELECT part of a
+ * view rewrite rule
+ * ----------
+ */
+static void
+make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
+ int prettyFlags, int wrapColumn)
+{
+ Query *query;
+ char ev_type;
+ Oid ev_class;
+ bool is_instead;
+ char *ev_qual;
+ char *ev_action;
+ List *actions;
+ Relation ev_relation;
+ int fno;
+ Datum dat;
+ bool isnull;
+
+ /*
+ * Get the attribute values from the rules tuple
+ */
+ fno = SPI_fnumber(rulettc, "ev_type");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ ev_type = DatumGetChar(dat);
+
+ fno = SPI_fnumber(rulettc, "ev_class");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ ev_class = DatumGetObjectId(dat);
+
+ fno = SPI_fnumber(rulettc, "is_instead");
+ dat = SPI_getbinval(ruletup, rulettc, fno, &isnull);
+ Assert(!isnull);
+ is_instead = DatumGetBool(dat);
+
+ fno = SPI_fnumber(rulettc, "ev_qual");
+ ev_qual = SPI_getvalue(ruletup, rulettc, fno);
+ Assert(ev_qual != NULL);
+
+ fno = SPI_fnumber(rulettc, "ev_action");
+ ev_action = SPI_getvalue(ruletup, rulettc, fno);
+ Assert(ev_action != NULL);
+ actions = (List *) stringToNode(ev_action);
+
+ if (list_length(actions) != 1)
+ {
+ /* keep output buffer empty and leave */
+ return;
+ }
+
+ query = (Query *) linitial(actions);
+
+ if (ev_type != '1' || !is_instead ||
+ strcmp(ev_qual, "<>") != 0 || query->commandType != CMD_SELECT)
+ {
+ /* keep output buffer empty and leave */
+ return;
+ }
+
+ ev_relation = table_open(ev_class, AccessShareLock);
+
+ get_query_def(query, buf, NIL, RelationGetDescr(ev_relation), true,
+ prettyFlags, wrapColumn, 0);
+ appendStringInfoChar(buf, ';');
+
+ table_close(ev_relation, AccessShareLock);
+}
+
+
+/* ----------
+ * get_query_def - Parse back one query parsetree
+ *
+ * query: parsetree to be displayed
+ * buf: output text is appended to buf
+ * parentnamespace: list (initially empty) of outer-level deparse_namespace's
+ * resultDesc: if not NULL, the output tuple descriptor for the view
+ * represented by a SELECT query. We use the column names from it
+ * to label SELECT output columns, in preference to names in the query
+ * colNamesVisible: true if the surrounding context cares about the output
+ * column names at all (as, for example, an EXISTS() context does not);
+ * when false, we can suppress dummy column labels such as "?column?"
+ * prettyFlags: bitmask of PRETTYFLAG_XXX options
+ * wrapColumn: maximum line length, or -1 to disable wrapping
+ * startIndent: initial indentation amount
+ * ----------
+ */
+static void
+get_query_def(Query *query, StringInfo buf, List *parentnamespace,
+ TupleDesc resultDesc, bool colNamesVisible,
+ int prettyFlags, int wrapColumn, int startIndent)
+{
+ deparse_context context;
+ deparse_namespace dpns;
+
+ /* Guard against excessively long or deeply-nested queries */
+ CHECK_FOR_INTERRUPTS();
+ check_stack_depth();
+
+ /*
+ * Before we begin to examine the query, acquire locks on referenced
+ * relations, and fix up deleted columns in JOIN RTEs. This ensures
+ * consistent results. Note we assume it's OK to scribble on the passed
+ * querytree!
+ *
+ * We are only deparsing the query (we are not about to execute it), so we
+ * only need AccessShareLock on the relations it mentions.
+ */
+ AcquireRewriteLocks(query, false, false);
+
+ context.buf = buf;
+ context.namespaces = lcons(&dpns, list_copy(parentnamespace));
+ context.windowClause = NIL;
+ context.windowTList = NIL;
+ context.varprefix = (parentnamespace != NIL ||
+ list_length(query->rtable) != 1);
+ context.prettyFlags = prettyFlags;
+ context.wrapColumn = wrapColumn;
+ context.indentLevel = startIndent;
+ context.special_exprkind = EXPR_KIND_NONE;
+ context.appendparents = NULL;
+
+ set_deparse_for_query(&dpns, query, parentnamespace);
+
+ switch (query->commandType)
+ {
+ case CMD_SELECT:
+ get_select_query_def(query, &context, resultDesc, colNamesVisible);
+ break;
+
+ case CMD_UPDATE:
+ get_update_query_def(query, &context, colNamesVisible);
+ break;
+
+ case CMD_INSERT:
+ get_insert_query_def(query, &context, colNamesVisible);
+ break;
+
+ case CMD_DELETE:
+ get_delete_query_def(query, &context, colNamesVisible);
+ break;
+
+ case CMD_MERGE:
+ get_merge_query_def(query, &context, colNamesVisible);
+ break;
+
+ case CMD_NOTHING:
+ appendStringInfoString(buf, "NOTHING");
+ break;
+
+ case CMD_UTILITY:
+ get_utility_query_def(query, &context);
+ break;
+
+ default:
+ elog(ERROR, "unrecognized query command type: %d",
+ query->commandType);
+ break;
+ }
+}
+
+/* ----------
+ * get_values_def - Parse back a VALUES list
+ * ----------
+ */
+static void
+get_values_def(List *values_lists, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ bool first_list = true;
+ ListCell *vtl;
+
+ appendStringInfoString(buf, "VALUES ");
+
+ foreach(vtl, values_lists)
+ {
+ List *sublist = (List *) lfirst(vtl);
+ bool first_col = true;
+ ListCell *lc;
+
+ if (first_list)
+ first_list = false;
+ else
+ appendStringInfoString(buf, ", ");
+
+ appendStringInfoChar(buf, '(');
+ foreach(lc, sublist)
+ {
+ Node *col = (Node *) lfirst(lc);
+
+ if (first_col)
+ first_col = false;
+ else
+ appendStringInfoChar(buf, ',');
+
+ /*
+ * Print the value. Whole-row Vars need special treatment.
+ */
+ get_rule_expr_toplevel(col, context, false);
+ }
+ appendStringInfoChar(buf, ')');
+ }
+}
+
+/* ----------
+ * get_with_clause - Parse back a WITH clause
+ * ----------
+ */
+static void
+get_with_clause(Query *query, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ const char *sep;
+ ListCell *l;
+
+ if (query->cteList == NIL)
+ return;
+
+ if (PRETTY_INDENT(context))
+ {
+ context->indentLevel += PRETTYINDENT_STD;
+ appendStringInfoChar(buf, ' ');
+ }
+
+ if (query->hasRecursive)
+ sep = "WITH RECURSIVE ";
+ else
+ sep = "WITH ";
+ foreach(l, query->cteList)
+ {
+ CommonTableExpr *cte = (CommonTableExpr *) lfirst(l);
+
+ appendStringInfoString(buf, sep);
+ appendStringInfoString(buf, quote_identifier(cte->ctename));
+ if (cte->aliascolnames)
+ {
+ bool first = true;
+ ListCell *col;
+
+ appendStringInfoChar(buf, '(');
+ foreach(col, cte->aliascolnames)
+ {
+ if (first)
+ first = false;
+ else
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf,
+ quote_identifier(strVal(lfirst(col))));
+ }
+ appendStringInfoChar(buf, ')');
+ }
+ appendStringInfoString(buf, " AS ");
+ switch (cte->ctematerialized)
+ {
+ case CTEMaterializeDefault:
+ break;
+ case CTEMaterializeAlways:
+ appendStringInfoString(buf, "MATERIALIZED ");
+ break;
+ case CTEMaterializeNever:
+ appendStringInfoString(buf, "NOT MATERIALIZED ");
+ break;
+ }
+ appendStringInfoChar(buf, '(');
+ if (PRETTY_INDENT(context))
+ appendContextKeyword(context, "", 0, 0, 0);
+ get_query_def((Query *) cte->ctequery, buf, context->namespaces, NULL,
+ true,
+ context->prettyFlags, context->wrapColumn,
+ context->indentLevel);
+ if (PRETTY_INDENT(context))
+ appendContextKeyword(context, "", 0, 0, 0);
+ appendStringInfoChar(buf, ')');
+
+ if (cte->search_clause)
+ {
+ bool first = true;
+ ListCell *lc;
+
+ appendStringInfo(buf, " SEARCH %s FIRST BY ",
+ cte->search_clause->search_breadth_first ? "BREADTH" : "DEPTH");
+
+ foreach(lc, cte->search_clause->search_col_list)
+ {
+ if (first)
+ first = false;
+ else
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf,
+ quote_identifier(strVal(lfirst(lc))));
+ }
+
+ appendStringInfo(buf, " SET %s", quote_identifier(cte->search_clause->search_seq_column));
+ }
+
+ if (cte->cycle_clause)
+ {
+ bool first = true;
+ ListCell *lc;
+
+ appendStringInfoString(buf, " CYCLE ");
+
+ foreach(lc, cte->cycle_clause->cycle_col_list)
+ {
+ if (first)
+ first = false;
+ else
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf,
+ quote_identifier(strVal(lfirst(lc))));
+ }
+
+ appendStringInfo(buf, " SET %s", quote_identifier(cte->cycle_clause->cycle_mark_column));
+
+ {
+ Const *cmv = castNode(Const, cte->cycle_clause->cycle_mark_value);
+ Const *cmd = castNode(Const, cte->cycle_clause->cycle_mark_default);
+
+ if (!(cmv->consttype == BOOLOID && !cmv->constisnull && DatumGetBool(cmv->constvalue) == true &&
+ cmd->consttype == BOOLOID && !cmd->constisnull && DatumGetBool(cmd->constvalue) == false))
+ {
+ appendStringInfoString(buf, " TO ");
+ get_rule_expr(cte->cycle_clause->cycle_mark_value, context, false);
+ appendStringInfoString(buf, " DEFAULT ");
+ get_rule_expr(cte->cycle_clause->cycle_mark_default, context, false);
+ }
+ }
+
+ appendStringInfo(buf, " USING %s", quote_identifier(cte->cycle_clause->cycle_path_column));
+ }
+
+ sep = ", ";
+ }
+
+ if (PRETTY_INDENT(context))
+ {
+ context->indentLevel -= PRETTYINDENT_STD;
+ appendContextKeyword(context, "", 0, 0, 0);
+ }
+ else
+ appendStringInfoChar(buf, ' ');
+}
+
+/* ----------
+ * get_select_query_def - Parse back a SELECT parsetree
+ * ----------
+ */
+static void
+get_select_query_def(Query *query, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ List *save_windowclause;
+ List *save_windowtlist;
+ bool force_colno;
+ ListCell *l;
+
+ /* Insert the WITH clause if given */
+ get_with_clause(query, context);
+
+ /* Set up context for possible window functions */
+ save_windowclause = context->windowClause;
+ context->windowClause = query->windowClause;
+ save_windowtlist = context->windowTList;
+ context->windowTList = query->targetList;
+
+ /*
+ * If the Query node has a setOperations tree, then it's the top level of
+ * a UNION/INTERSECT/EXCEPT query; only the WITH, ORDER BY and LIMIT
+ * fields are interesting in the top query itself.
+ */
+ if (query->setOperations)
+ {
+ get_setop_query(query->setOperations, query, context, resultDesc,
+ colNamesVisible);
+ /* ORDER BY clauses must be simple in this case */
+ force_colno = true;
+ }
+ else
+ {
+ get_basic_select_query(query, context, resultDesc, colNamesVisible);
+ force_colno = false;
+ }
+
+ /* Add the ORDER BY clause if given */
+ if (query->sortClause != NIL)
+ {
+ appendContextKeyword(context, " ORDER BY ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_orderby(query->sortClause, query->targetList,
+ force_colno, context);
+ }
+
+ /*
+ * Add the LIMIT/OFFSET clauses if given. If non-default options, use the
+ * standard spelling of LIMIT.
+ */
+ if (query->limitOffset != NULL)
+ {
+ appendContextKeyword(context, " OFFSET ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ get_rule_expr(query->limitOffset, context, false);
+ }
+ if (query->limitCount != NULL)
+ {
+ if (query->limitOption == LIMIT_OPTION_WITH_TIES)
+ {
+ appendContextKeyword(context, " FETCH FIRST ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ get_rule_expr(query->limitCount, context, false);
+ appendStringInfoString(buf, " ROWS WITH TIES");
+ }
+ else
+ {
+ appendContextKeyword(context, " LIMIT ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ if (IsA(query->limitCount, Const) &&
+ ((Const *) query->limitCount)->constisnull)
+ appendStringInfoString(buf, "ALL");
+ else
+ get_rule_expr(query->limitCount, context, false);
+ }
+ }
+
+ /* Add FOR [KEY] UPDATE/SHARE clauses if present */
+ if (query->hasForUpdate)
+ {
+ foreach(l, query->rowMarks)
+ {
+ RowMarkClause *rc = (RowMarkClause *) lfirst(l);
+
+ /* don't print implicit clauses */
+ if (rc->pushedDown)
+ continue;
+
+ switch (rc->strength)
+ {
+ case LCS_NONE:
+ /* we intentionally throw an error for LCS_NONE */
+ elog(ERROR, "unrecognized LockClauseStrength %d",
+ (int) rc->strength);
+ break;
+ case LCS_FORKEYSHARE:
+ appendContextKeyword(context, " FOR KEY SHARE",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ break;
+ case LCS_FORSHARE:
+ appendContextKeyword(context, " FOR SHARE",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ break;
+ case LCS_FORNOKEYUPDATE:
+ appendContextKeyword(context, " FOR NO KEY UPDATE",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ break;
+ case LCS_FORUPDATE:
+ appendContextKeyword(context, " FOR UPDATE",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ break;
+ }
+
+ appendStringInfo(buf, " OF %s",
+ quote_identifier(get_rtable_name(rc->rti,
+ context)));
+ if (rc->waitPolicy == LockWaitError)
+ appendStringInfoString(buf, " NOWAIT");
+ else if (rc->waitPolicy == LockWaitSkip)
+ appendStringInfoString(buf, " SKIP LOCKED");
+ }
+ }
+
+ context->windowClause = save_windowclause;
+ context->windowTList = save_windowtlist;
+}
+
+/*
+ * Detect whether query looks like SELECT ... FROM VALUES(),
+ * with no need to rename the output columns of the VALUES RTE.
+ * If so, return the VALUES RTE. Otherwise return NULL.
+ */
+static RangeTblEntry *
+get_simple_values_rte(Query *query, TupleDesc resultDesc)
+{
+ RangeTblEntry *result = NULL;
+ ListCell *lc;
+
+ /*
+ * We want to detect a match even if the Query also contains OLD or NEW
+ * rule RTEs. So the idea is to scan the rtable and see if there is only
+ * one inFromCl RTE that is a VALUES RTE.
+ */
+ foreach(lc, query->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
+
+ if (rte->rtekind == RTE_VALUES && rte->inFromCl)
+ {
+ if (result)
+ return NULL; /* multiple VALUES (probably not possible) */
+ result = rte;
+ }
+ else if (rte->rtekind == RTE_RELATION && !rte->inFromCl)
+ continue; /* ignore rule entries */
+ else
+ return NULL; /* something else -> not simple VALUES */
+ }
+
+ /*
+ * We don't need to check the targetlist in any great detail, because
+ * parser/analyze.c will never generate a "bare" VALUES RTE --- they only
+ * appear inside auto-generated sub-queries with very restricted
+ * structure. However, DefineView might have modified the tlist by
+ * injecting new column aliases, or we might have some other column
+ * aliases forced by a resultDesc. We can only simplify if the RTE's
+ * column names match the names that get_target_list() would select.
+ */
+ if (result)
+ {
+ ListCell *lcn;
+ int colno;
+
+ if (list_length(query->targetList) != list_length(result->eref->colnames))
+ return NULL; /* this probably cannot happen */
+ colno = 0;
+ forboth(lc, query->targetList, lcn, result->eref->colnames)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(lc);
+ char *cname = strVal(lfirst(lcn));
+ char *colname;
+
+ if (tle->resjunk)
+ return NULL; /* this probably cannot happen */
+
+ /* compute name that get_target_list would use for column */
+ colno++;
+ if (resultDesc && colno <= resultDesc->natts)
+ colname = NameStr(TupleDescAttr(resultDesc, colno - 1)->attname);
+ else
+ colname = tle->resname;
+
+ /* does it match the VALUES RTE? */
+ if (colname == NULL || strcmp(colname, cname) != 0)
+ return NULL; /* column name has been changed */
+ }
+ }
+
+ return result;
+}
+
+static void
+get_basic_select_query(Query *query, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *values_rte;
+ char *sep;
+ ListCell *l;
+
+ if (PRETTY_INDENT(context))
+ {
+ context->indentLevel += PRETTYINDENT_STD;
+ appendStringInfoChar(buf, ' ');
+ }
+
+ /*
+ * If the query looks like SELECT * FROM (VALUES ...), then print just the
+ * VALUES part. This reverses what transformValuesClause() did at parse
+ * time.
+ */
+ values_rte = get_simple_values_rte(query, resultDesc);
+ if (values_rte)
+ {
+ get_values_def(values_rte->values_lists, context);
+ return;
+ }
+
+ /*
+ * Build up the query string - first we say SELECT
+ */
+ if (query->isReturn)
+ appendStringInfoString(buf, "RETURN");
+ else
+ appendStringInfoString(buf, "SELECT");
+
+ /* Add the DISTINCT clause if given */
+ if (query->distinctClause != NIL)
+ {
+ if (query->hasDistinctOn)
+ {
+ appendStringInfoString(buf, " DISTINCT ON (");
+ sep = "";
+ foreach(l, query->distinctClause)
+ {
+ SortGroupClause *srt = (SortGroupClause *) lfirst(l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_sortgroupclause(srt->tleSortGroupRef, query->targetList,
+ false, context);
+ sep = ", ";
+ }
+ appendStringInfoChar(buf, ')');
+ }
+ else
+ appendStringInfoString(buf, " DISTINCT");
+ }
+
+ /* Then we tell what to select (the targetlist) */
+ get_target_list(query->targetList, context, resultDesc, colNamesVisible);
+
+ /* Add the FROM clause if needed */
+ get_from_clause(query, " FROM ", context);
+
+ /* Add the WHERE clause if given */
+ if (query->jointree->quals != NULL)
+ {
+ appendContextKeyword(context, " WHERE ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_expr(query->jointree->quals, context, false);
+ }
+
+ /* Add the GROUP BY clause if given */
+ if (query->groupClause != NULL || query->groupingSets != NULL)
+ {
+ ParseExprKind save_exprkind;
+
+ appendContextKeyword(context, " GROUP BY ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ if (query->groupDistinct)
+ appendStringInfoString(buf, "DISTINCT ");
+
+ save_exprkind = context->special_exprkind;
+ context->special_exprkind = EXPR_KIND_GROUP_BY;
+
+ if (query->groupingSets == NIL)
+ {
+ sep = "";
+ foreach(l, query->groupClause)
+ {
+ SortGroupClause *grp = (SortGroupClause *) lfirst(l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_sortgroupclause(grp->tleSortGroupRef, query->targetList,
+ false, context);
+ sep = ", ";
+ }
+ }
+ else
+ {
+ sep = "";
+ foreach(l, query->groupingSets)
+ {
+ GroupingSet *grp = lfirst(l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_groupingset(grp, query->targetList, true, context);
+ sep = ", ";
+ }
+ }
+
+ context->special_exprkind = save_exprkind;
+ }
+
+ /* Add the HAVING clause if given */
+ if (query->havingQual != NULL)
+ {
+ appendContextKeyword(context, " HAVING ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ get_rule_expr(query->havingQual, context, false);
+ }
+
+ /* Add the WINDOW clause if needed */
+ if (query->windowClause != NIL)
+ get_rule_windowclause(query, context);
+}
+
+/* ----------
+ * get_target_list - Parse back a SELECT target list
+ *
+ * This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
+ *
+ * resultDesc and colNamesVisible are as for get_query_def()
+ * ----------
+ */
+static void
+get_target_list(List *targetList, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ StringInfoData targetbuf;
+ bool last_was_multiline = false;
+ char *sep;
+ int colno;
+ ListCell *l;
+
+ /* we use targetbuf to hold each TLE's text temporarily */
+ initStringInfo(&targetbuf);
+
+ sep = " ";
+ colno = 0;
+ foreach(l, targetList)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
+ char *colname;
+ char *attname;
+
+ if (tle->resjunk)
+ continue; /* ignore junk entries */
+
+ appendStringInfoString(buf, sep);
+ sep = ", ";
+ colno++;
+
+ /*
+ * Put the new field text into targetbuf so we can decide after we've
+ * got it whether or not it needs to go on a new line.
+ */
+ resetStringInfo(&targetbuf);
+ context->buf = &targetbuf;
+
+ /*
+ * We special-case Var nodes rather than using get_rule_expr. This is
+ * needed because get_rule_expr will display a whole-row Var as
+ * "foo.*", which is the preferred notation in most contexts, but at
+ * the top level of a SELECT list it's not right (the parser will
+ * expand that notation into multiple columns, yielding behavior
+ * different from a whole-row Var). We need to call get_variable
+ * directly so that we can tell it to do the right thing, and so that
+ * we can get the attribute name which is the default AS label.
+ */
+ if (tle->expr && (IsA(tle->expr, Var)))
+ {
+ attname = get_variable((Var *) tle->expr, 0, true, context);
+ }
+ else
+ {
+ get_rule_expr((Node *) tle->expr, context, true);
+
+ /*
+ * When colNamesVisible is true, we should always show the
+ * assigned column name explicitly. Otherwise, show it only if
+ * it's not FigureColname's fallback.
+ */
+ attname = colNamesVisible ? NULL : "?column?";
+ }
+
+ /*
+ * Figure out what the result column should be called. In the context
+ * of a view, use the view's tuple descriptor (so as to pick up the
+ * effects of any column RENAME that's been done on the view).
+ * Otherwise, just use what we can find in the TLE.
+ */
+ if (resultDesc && colno <= resultDesc->natts)
+ colname = NameStr(TupleDescAttr(resultDesc, colno - 1)->attname);
+ else
+ colname = tle->resname;
+
+ /* Show AS unless the column's name is correct as-is */
+ if (colname) /* resname could be NULL */
+ {
+ if (attname == NULL || strcmp(attname, colname) != 0)
+ appendStringInfo(&targetbuf, " AS %s", quote_identifier(colname));
+ }
+
+ /* Restore context's output buffer */
+ context->buf = buf;
+
+ /* Consider line-wrapping if enabled */
+ if (PRETTY_INDENT(context) && context->wrapColumn >= 0)
+ {
+ int leading_nl_pos;
+
+ /* Does the new field start with a new line? */
+ if (targetbuf.len > 0 && targetbuf.data[0] == '\n')
+ leading_nl_pos = 0;
+ else
+ leading_nl_pos = -1;
+
+ /* If so, we shouldn't add anything */
+ if (leading_nl_pos >= 0)
+ {
+ /* instead, remove any trailing spaces currently in buf */
+ removeStringInfoSpaces(buf);
+ }
+ else
+ {
+ char *trailing_nl;
+
+ /* Locate the start of the current line in the output buffer */
+ trailing_nl = strrchr(buf->data, '\n');
+ if (trailing_nl == NULL)
+ trailing_nl = buf->data;
+ else
+ trailing_nl++;
+
+ /*
+ * Add a newline, plus some indentation, if the new field is
+ * not the first and either the new field would cause an
+ * overflow or the last field used more than one line.
+ */
+ if (colno > 1 &&
+ ((strlen(trailing_nl) + targetbuf.len > context->wrapColumn) ||
+ last_was_multiline))
+ appendContextKeyword(context, "", -PRETTYINDENT_STD,
+ PRETTYINDENT_STD, PRETTYINDENT_VAR);
+ }
+
+ /* Remember this field's multiline status for next iteration */
+ last_was_multiline =
+ (strchr(targetbuf.data + leading_nl_pos + 1, '\n') != NULL);
+ }
+
+ /* Add the new field */
+ appendBinaryStringInfo(buf, targetbuf.data, targetbuf.len);
+ }
+
+ /* clean up */
+ pfree(targetbuf.data);
+}
+
+static void
+get_setop_query(Node *setOp, Query *query, deparse_context *context,
+ TupleDesc resultDesc, bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ bool need_paren;
+
+ /* Guard against excessively long or deeply-nested queries */
+ CHECK_FOR_INTERRUPTS();
+ check_stack_depth();
+
+ if (IsA(setOp, RangeTblRef))
+ {
+ RangeTblRef *rtr = (RangeTblRef *) setOp;
+ RangeTblEntry *rte = rt_fetch(rtr->rtindex, query->rtable);
+ Query *subquery = rte->subquery;
+
+ Assert(subquery != NULL);
+ Assert(subquery->setOperations == NULL);
+ /* Need parens if WITH, ORDER BY, FOR UPDATE, or LIMIT; see gram.y */
+ need_paren = (subquery->cteList ||
+ subquery->sortClause ||
+ subquery->rowMarks ||
+ subquery->limitOffset ||
+ subquery->limitCount);
+ if (need_paren)
+ appendStringInfoChar(buf, '(');
+ get_query_def(subquery, buf, context->namespaces, resultDesc,
+ colNamesVisible,
+ context->prettyFlags, context->wrapColumn,
+ context->indentLevel);
+ if (need_paren)
+ appendStringInfoChar(buf, ')');
+ }
+ else if (IsA(setOp, SetOperationStmt))
+ {
+ SetOperationStmt *op = (SetOperationStmt *) setOp;
+ int subindent;
+
+ /*
+ * We force parens when nesting two SetOperationStmts, except when the
+ * lefthand input is another setop of the same kind. Syntactically,
+ * we could omit parens in rather more cases, but it seems best to use
+ * parens to flag cases where the setop operator changes. If we use
+ * parens, we also increase the indentation level for the child query.
+ *
+ * There are some cases in which parens are needed around a leaf query
+ * too, but those are more easily handled at the next level down (see
+ * code above).
+ */
+ if (IsA(op->larg, SetOperationStmt))
+ {
+ SetOperationStmt *lop = (SetOperationStmt *) op->larg;
+
+ if (op->op == lop->op && op->all == lop->all)
+ need_paren = false;
+ else
+ need_paren = true;
+ }
+ else
+ need_paren = false;
+
+ if (need_paren)
+ {
+ appendStringInfoChar(buf, '(');
+ subindent = PRETTYINDENT_STD;
+ appendContextKeyword(context, "", subindent, 0, 0);
+ }
+ else
+ subindent = 0;
+
+ get_setop_query(op->larg, query, context, resultDesc, colNamesVisible);
+
+ if (need_paren)
+ appendContextKeyword(context, ") ", -subindent, 0, 0);
+ else if (PRETTY_INDENT(context))
+ appendContextKeyword(context, "", -subindent, 0, 0);
+ else
+ appendStringInfoChar(buf, ' ');
+
+ switch (op->op)
+ {
+ case SETOP_UNION:
+ appendStringInfoString(buf, "UNION ");
+ break;
+ case SETOP_INTERSECT:
+ appendStringInfoString(buf, "INTERSECT ");
+ break;
+ case SETOP_EXCEPT:
+ appendStringInfoString(buf, "EXCEPT ");
+ break;
+ default:
+ elog(ERROR, "unrecognized set op: %d",
+ (int) op->op);
+ }
+ if (op->all)
+ appendStringInfoString(buf, "ALL ");
+
+ /* Always parenthesize if RHS is another setop */
+ need_paren = IsA(op->rarg, SetOperationStmt);
+
+ /*
+ * The indentation code here is deliberately a bit different from that
+ * for the lefthand input, because we want the line breaks in
+ * different places.
+ */
+ if (need_paren)
+ {
+ appendStringInfoChar(buf, '(');
+ subindent = PRETTYINDENT_STD;
+ }
+ else
+ subindent = 0;
+ appendContextKeyword(context, "", subindent, 0, 0);
+
+ get_setop_query(op->rarg, query, context, resultDesc, false);
+
+ if (PRETTY_INDENT(context))
+ context->indentLevel -= subindent;
+ if (need_paren)
+ appendContextKeyword(context, ")", 0, 0, 0);
+ }
+ else
+ {
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(setOp));
+ }
+}
+
+/*
+ * Display a sort/group clause.
+ *
+ * Also returns the expression tree, so caller need not find it again.
+ */
+static Node *
+get_rule_sortgroupclause(Index ref, List *tlist, bool force_colno,
+ deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ TargetEntry *tle;
+ Node *expr;
+
+ tle = get_sortgroupref_tle(ref, tlist);
+ expr = (Node *) tle->expr;
+
+ /*
+ * Use column-number form if requested by caller. Otherwise, if
+ * expression is a constant, force it to be dumped with an explicit cast
+ * as decoration --- this is because a simple integer constant is
+ * ambiguous (and will be misinterpreted by findTargetlistEntry()) if we
+ * dump it without any decoration. If it's anything more complex than a
+ * simple Var, then force extra parens around it, to ensure it can't be
+ * misinterpreted as a cube() or rollup() construct.
+ */
+ if (force_colno)
+ {
+ Assert(!tle->resjunk);
+ appendStringInfo(buf, "%d", tle->resno);
+ }
+ else if (expr && IsA(expr, Const))
+ get_const_expr((Const *) expr, context, 1);
+ else if (!expr || IsA(expr, Var))
+ get_rule_expr(expr, context, true);
+ else
+ {
+ /*
+ * We must force parens for function-like expressions even if
+ * PRETTY_PAREN is off, since those are the ones in danger of
+ * misparsing. For other expressions we need to force them only if
+ * PRETTY_PAREN is on, since otherwise the expression will output them
+ * itself. (We can't skip the parens.)
+ */
+ bool need_paren = (PRETTY_PAREN(context)
+ || IsA(expr, FuncExpr)
+ || IsA(expr, Aggref)
+ || IsA(expr, WindowFunc));
+
+ if (need_paren)
+ appendStringInfoChar(context->buf, '(');
+ get_rule_expr(expr, context, true);
+ if (need_paren)
+ appendStringInfoChar(context->buf, ')');
+ }
+
+ return expr;
+}
+
+/*
+ * Display a GroupingSet
+ */
+static void
+get_rule_groupingset(GroupingSet *gset, List *targetlist,
+ bool omit_parens, deparse_context *context)
+{
+ ListCell *l;
+ StringInfo buf = context->buf;
+ bool omit_child_parens = true;
+ char *sep = "";
+
+ switch (gset->kind)
+ {
+ case GROUPING_SET_EMPTY:
+ appendStringInfoString(buf, "()");
+ return;
+
+ case GROUPING_SET_SIMPLE:
+ {
+ if (!omit_parens || list_length(gset->content) != 1)
+ appendStringInfoChar(buf, '(');
+
+ foreach(l, gset->content)
+ {
+ Index ref = lfirst_int(l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_sortgroupclause(ref, targetlist,
+ false, context);
+ sep = ", ";
+ }
+
+ if (!omit_parens || list_length(gset->content) != 1)
+ appendStringInfoChar(buf, ')');
+ }
+ return;
+
+ case GROUPING_SET_ROLLUP:
+ appendStringInfoString(buf, "ROLLUP(");
+ break;
+ case GROUPING_SET_CUBE:
+ appendStringInfoString(buf, "CUBE(");
+ break;
+ case GROUPING_SET_SETS:
+ appendStringInfoString(buf, "GROUPING SETS (");
+ omit_child_parens = false;
+ break;
+ }
+
+ foreach(l, gset->content)
+ {
+ appendStringInfoString(buf, sep);
+ get_rule_groupingset(lfirst(l), targetlist, omit_child_parens, context);
+ sep = ", ";
+ }
+
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * Display an ORDER BY list.
+ */
+static void
+get_rule_orderby(List *orderList, List *targetList,
+ bool force_colno, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ const char *sep;
+ ListCell *l;
+
+ sep = "";
+ foreach(l, orderList)
+ {
+ SortGroupClause *srt = (SortGroupClause *) lfirst(l);
+ Node *sortexpr;
+ Oid sortcoltype;
+ TypeCacheEntry *typentry;
+
+ appendStringInfoString(buf, sep);
+ sortexpr = get_rule_sortgroupclause(srt->tleSortGroupRef, targetList,
+ force_colno, context);
+ sortcoltype = exprType(sortexpr);
+ /* See whether operator is default < or > for datatype */
+ typentry = lookup_type_cache(sortcoltype,
+ TYPECACHE_LT_OPR | TYPECACHE_GT_OPR);
+ if (srt->sortop == typentry->lt_opr)
+ {
+ /* ASC is default, so emit nothing for it */
+ if (srt->nulls_first)
+ appendStringInfoString(buf, " NULLS FIRST");
+ }
+ else if (srt->sortop == typentry->gt_opr)
+ {
+ appendStringInfoString(buf, " DESC");
+ /* DESC defaults to NULLS FIRST */
+ if (!srt->nulls_first)
+ appendStringInfoString(buf, " NULLS LAST");
+ }
+ else
+ {
+ appendStringInfo(buf, " USING %s",
+ generate_operator_name(srt->sortop,
+ sortcoltype,
+ sortcoltype));
+ /* be specific to eliminate ambiguity */
+ if (srt->nulls_first)
+ appendStringInfoString(buf, " NULLS FIRST");
+ else
+ appendStringInfoString(buf, " NULLS LAST");
+ }
+ sep = ", ";
+ }
+}
+
+/*
+ * Display a WINDOW clause.
+ *
+ * Note that the windowClause list might contain only anonymous window
+ * specifications, in which case we should print nothing here.
+ */
+static void
+get_rule_windowclause(Query *query, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ const char *sep;
+ ListCell *l;
+
+ sep = NULL;
+ foreach(l, query->windowClause)
+ {
+ WindowClause *wc = (WindowClause *) lfirst(l);
+
+ if (wc->name == NULL)
+ continue; /* ignore anonymous windows */
+
+ if (sep == NULL)
+ appendContextKeyword(context, " WINDOW ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ else
+ appendStringInfoString(buf, sep);
+
+ appendStringInfo(buf, "%s AS ", quote_identifier(wc->name));
+
+ get_rule_windowspec(wc, query->targetList, context);
+
+ sep = ", ";
+ }
+}
+
+/*
+ * Display a window definition
+ */
+static void
+get_rule_windowspec(WindowClause *wc, List *targetList,
+ deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ bool needspace = false;
+ const char *sep;
+ ListCell *l;
+
+ appendStringInfoChar(buf, '(');
+ if (wc->refname)
+ {
+ appendStringInfoString(buf, quote_identifier(wc->refname));
+ needspace = true;
+ }
+ /* partition clauses are always inherited, so only print if no refname */
+ if (wc->partitionClause && !wc->refname)
+ {
+ if (needspace)
+ appendStringInfoChar(buf, ' ');
+ appendStringInfoString(buf, "PARTITION BY ");
+ sep = "";
+ foreach(l, wc->partitionClause)
+ {
+ SortGroupClause *grp = (SortGroupClause *) lfirst(l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_sortgroupclause(grp->tleSortGroupRef, targetList,
+ false, context);
+ sep = ", ";
+ }
+ needspace = true;
+ }
+ /* print ordering clause only if not inherited */
+ if (wc->orderClause && !wc->copiedOrder)
+ {
+ if (needspace)
+ appendStringInfoChar(buf, ' ');
+ appendStringInfoString(buf, "ORDER BY ");
+ get_rule_orderby(wc->orderClause, targetList, false, context);
+ needspace = true;
+ }
+ /* framing clause is never inherited, so print unless it's default */
+ if (wc->frameOptions & FRAMEOPTION_NONDEFAULT)
+ {
+ if (needspace)
+ appendStringInfoChar(buf, ' ');
+ if (wc->frameOptions & FRAMEOPTION_RANGE)
+ appendStringInfoString(buf, "RANGE ");
+ else if (wc->frameOptions & FRAMEOPTION_ROWS)
+ appendStringInfoString(buf, "ROWS ");
+ else if (wc->frameOptions & FRAMEOPTION_GROUPS)
+ appendStringInfoString(buf, "GROUPS ");
+ else
+ Assert(false);
+ if (wc->frameOptions & FRAMEOPTION_BETWEEN)
+ appendStringInfoString(buf, "BETWEEN ");
+ if (wc->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
+ appendStringInfoString(buf, "UNBOUNDED PRECEDING ");
+ else if (wc->frameOptions & FRAMEOPTION_START_CURRENT_ROW)
+ appendStringInfoString(buf, "CURRENT ROW ");
+ else if (wc->frameOptions & FRAMEOPTION_START_OFFSET)
+ {
+ get_rule_expr(wc->startOffset, context, false);
+ if (wc->frameOptions & FRAMEOPTION_START_OFFSET_PRECEDING)
+ appendStringInfoString(buf, " PRECEDING ");
+ else if (wc->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING)
+ appendStringInfoString(buf, " FOLLOWING ");
+ else
+ Assert(false);
+ }
+ else
+ Assert(false);
+ if (wc->frameOptions & FRAMEOPTION_BETWEEN)
+ {
+ appendStringInfoString(buf, "AND ");
+ if (wc->frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING)
+ appendStringInfoString(buf, "UNBOUNDED FOLLOWING ");
+ else if (wc->frameOptions & FRAMEOPTION_END_CURRENT_ROW)
+ appendStringInfoString(buf, "CURRENT ROW ");
+ else if (wc->frameOptions & FRAMEOPTION_END_OFFSET)
+ {
+ get_rule_expr(wc->endOffset, context, false);
+ if (wc->frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING)
+ appendStringInfoString(buf, " PRECEDING ");
+ else if (wc->frameOptions & FRAMEOPTION_END_OFFSET_FOLLOWING)
+ appendStringInfoString(buf, " FOLLOWING ");
+ else
+ Assert(false);
+ }
+ else
+ Assert(false);
+ }
+ if (wc->frameOptions & FRAMEOPTION_EXCLUDE_CURRENT_ROW)
+ appendStringInfoString(buf, "EXCLUDE CURRENT ROW ");
+ else if (wc->frameOptions & FRAMEOPTION_EXCLUDE_GROUP)
+ appendStringInfoString(buf, "EXCLUDE GROUP ");
+ else if (wc->frameOptions & FRAMEOPTION_EXCLUDE_TIES)
+ appendStringInfoString(buf, "EXCLUDE TIES ");
+ /* we will now have a trailing space; remove it */
+ buf->len--;
+ }
+ appendStringInfoChar(buf, ')');
+}
+
+/* ----------
+ * get_insert_query_def - Parse back an INSERT parsetree
+ * ----------
+ */
+static void
+get_insert_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *select_rte = NULL;
+ RangeTblEntry *values_rte = NULL;
+ RangeTblEntry *rte;
+ char *sep;
+ ListCell *l;
+ List *strippedexprs;
+
+ /* Insert the WITH clause if given */
+ get_with_clause(query, context);
+
+ /*
+ * If it's an INSERT ... SELECT or multi-row VALUES, there will be a
+ * single RTE for the SELECT or VALUES. Plain VALUES has neither.
+ */
+ foreach(l, query->rtable)
+ {
+ rte = (RangeTblEntry *) lfirst(l);
+
+ if (rte->rtekind == RTE_SUBQUERY)
+ {
+ if (select_rte)
+ elog(ERROR, "too many subquery RTEs in INSERT");
+ select_rte = rte;
+ }
+
+ if (rte->rtekind == RTE_VALUES)
+ {
+ if (values_rte)
+ elog(ERROR, "too many values RTEs in INSERT");
+ values_rte = rte;
+ }
+ }
+ if (select_rte && values_rte)
+ elog(ERROR, "both subquery and values RTEs in INSERT");
+
+ /*
+ * Start the query with INSERT INTO relname
+ */
+ rte = rt_fetch(query->resultRelation, query->rtable);
+ Assert(rte->rtekind == RTE_RELATION);
+
+ if (PRETTY_INDENT(context))
+ {
+ context->indentLevel += PRETTYINDENT_STD;
+ appendStringInfoChar(buf, ' ');
+ }
+ appendStringInfo(buf, "INSERT INTO %s",
+ generate_relation_name(rte->relid, NIL));
+
+ /* Print the relation alias, if needed; INSERT requires explicit AS */
+ get_rte_alias(rte, query->resultRelation, true, context);
+
+ /* always want a space here */
+ appendStringInfoChar(buf, ' ');
+
+ /*
+ * Add the insert-column-names list. Any indirection decoration needed on
+ * the column names can be inferred from the top targetlist.
+ */
+ strippedexprs = NIL;
+ sep = "";
+ if (query->targetList)
+ appendStringInfoChar(buf, '(');
+ foreach(l, query->targetList)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
+
+ if (tle->resjunk)
+ continue; /* ignore junk entries */
+
+ appendStringInfoString(buf, sep);
+ sep = ", ";
+
+ /*
+ * Put out name of target column; look in the catalogs, not at
+ * tle->resname, since resname will fail to track RENAME.
+ */
+ appendStringInfoString(buf,
+ quote_identifier(get_attname(rte->relid,
+ tle->resno,
+ false)));
+
+ /*
+ * Print any indirection needed (subfields or subscripts), and strip
+ * off the top-level nodes representing the indirection assignments.
+ * Add the stripped expressions to strippedexprs. (If it's a
+ * single-VALUES statement, the stripped expressions are the VALUES to
+ * print below. Otherwise they're just Vars and not really
+ * interesting.)
+ */
+ strippedexprs = lappend(strippedexprs,
+ processIndirection((Node *) tle->expr,
+ context));
+ }
+ if (query->targetList)
+ appendStringInfoString(buf, ") ");
+
+ if (query->override)
+ {
+ if (query->override == OVERRIDING_SYSTEM_VALUE)
+ appendStringInfoString(buf, "OVERRIDING SYSTEM VALUE ");
+ else if (query->override == OVERRIDING_USER_VALUE)
+ appendStringInfoString(buf, "OVERRIDING USER VALUE ");
+ }
+
+ if (select_rte)
+ {
+ /* Add the SELECT */
+ get_query_def(select_rte->subquery, buf, context->namespaces, NULL,
+ false,
+ context->prettyFlags, context->wrapColumn,
+ context->indentLevel);
+ }
+ else if (values_rte)
+ {
+ /* Add the multi-VALUES expression lists */
+ get_values_def(values_rte->values_lists, context);
+ }
+ else if (strippedexprs)
+ {
+ /* Add the single-VALUES expression list */
+ appendContextKeyword(context, "VALUES (",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 2);
+ get_rule_list_toplevel(strippedexprs, context, false);
+ appendStringInfoChar(buf, ')');
+ }
+ else
+ {
+ /* No expressions, so it must be DEFAULT VALUES */
+ appendStringInfoString(buf, "DEFAULT VALUES");
+ }
+
+ /* Add ON CONFLICT if present */
+ if (query->onConflict)
+ {
+ OnConflictExpr *confl = query->onConflict;
+
+ appendStringInfoString(buf, " ON CONFLICT");
+
+ if (confl->arbiterElems)
+ {
+ /* Add the single-VALUES expression list */
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) confl->arbiterElems, context, false);
+ appendStringInfoChar(buf, ')');
+
+ /* Add a WHERE clause (for partial indexes) if given */
+ if (confl->arbiterWhere != NULL)
+ {
+ bool save_varprefix;
+
+ /*
+ * Force non-prefixing of Vars, since parser assumes that they
+ * belong to target relation. WHERE clause does not use
+ * InferenceElem, so this is separately required.
+ */
+ save_varprefix = context->varprefix;
+ context->varprefix = false;
+
+ appendContextKeyword(context, " WHERE ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_expr(confl->arbiterWhere, context, false);
+
+ context->varprefix = save_varprefix;
+ }
+ }
+ else if (OidIsValid(confl->constraint))
+ {
+ char *constraint = get_constraint_name(confl->constraint);
+
+ if (!constraint)
+ elog(ERROR, "cache lookup failed for constraint %u",
+ confl->constraint);
+ appendStringInfo(buf, " ON CONSTRAINT %s",
+ quote_identifier(constraint));
+ }
+
+ if (confl->action == ONCONFLICT_NOTHING)
+ {
+ appendStringInfoString(buf, " DO NOTHING");
+ }
+ else
+ {
+ appendStringInfoString(buf, " DO UPDATE SET ");
+ /* Deparse targetlist */
+ get_update_query_targetlist_def(query, confl->onConflictSet,
+ context, rte);
+
+ /* Add a WHERE clause if given */
+ if (confl->onConflictWhere != NULL)
+ {
+ appendContextKeyword(context, " WHERE ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_expr(confl->onConflictWhere, context, false);
+ }
+ }
+ }
+
+ /* Add RETURNING if present */
+ if (query->returningList)
+ {
+ appendContextKeyword(context, " RETURNING",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
+ }
+}
+
+
+/* ----------
+ * get_update_query_def - Parse back an UPDATE parsetree
+ * ----------
+ */
+static void
+get_update_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *rte;
+
+ /* Insert the WITH clause if given */
+ get_with_clause(query, context);
+
+ /*
+ * Start the query with UPDATE relname SET
+ */
+ rte = rt_fetch(query->resultRelation, query->rtable);
+ Assert(rte->rtekind == RTE_RELATION);
+ if (PRETTY_INDENT(context))
+ {
+ appendStringInfoChar(buf, ' ');
+ context->indentLevel += PRETTYINDENT_STD;
+ }
+ appendStringInfo(buf, "UPDATE %s%s",
+ only_marker(rte),
+ generate_relation_name(rte->relid, NIL));
+
+ /* Print the relation alias, if needed */
+ get_rte_alias(rte, query->resultRelation, false, context);
+
+ appendStringInfoString(buf, " SET ");
+
+ /* Deparse targetlist */
+ get_update_query_targetlist_def(query, query->targetList, context, rte);
+
+ /* Add the FROM clause if needed */
+ get_from_clause(query, " FROM ", context);
+
+ /* Add a WHERE clause if given */
+ if (query->jointree->quals != NULL)
+ {
+ appendContextKeyword(context, " WHERE ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_expr(query->jointree->quals, context, false);
+ }
+
+ /* Add RETURNING if present */
+ if (query->returningList)
+ {
+ appendContextKeyword(context, " RETURNING",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
+ }
+}
+
+
+/* ----------
+ * get_update_query_targetlist_def - Parse back an UPDATE targetlist
+ * ----------
+ */
+static void
+get_update_query_targetlist_def(Query *query, List *targetList,
+ deparse_context *context, RangeTblEntry *rte)
+{
+ StringInfo buf = context->buf;
+ ListCell *l;
+ ListCell *next_ma_cell;
+ int remaining_ma_columns;
+ const char *sep;
+ SubLink *cur_ma_sublink;
+ List *ma_sublinks;
+
+ /*
+ * Prepare to deal with MULTIEXPR assignments: collect the source SubLinks
+ * into a list. We expect them to appear, in ID order, in resjunk tlist
+ * entries.
+ */
+ ma_sublinks = NIL;
+ if (query->hasSubLinks) /* else there can't be any */
+ {
+ foreach(l, targetList)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
+
+ if (tle->resjunk && IsA(tle->expr, SubLink))
+ {
+ SubLink *sl = (SubLink *) tle->expr;
+
+ if (sl->subLinkType == MULTIEXPR_SUBLINK)
+ {
+ ma_sublinks = lappend(ma_sublinks, sl);
+ Assert(sl->subLinkId == list_length(ma_sublinks));
+ }
+ }
+ }
+ }
+ next_ma_cell = list_head(ma_sublinks);
+ cur_ma_sublink = NULL;
+ remaining_ma_columns = 0;
+
+ /* Add the comma separated list of 'attname = value' */
+ sep = "";
+ foreach(l, targetList)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
+ Node *expr;
+
+ if (tle->resjunk)
+ continue; /* ignore junk entries */
+
+ /* Emit separator (OK whether we're in multiassignment or not) */
+ appendStringInfoString(buf, sep);
+ sep = ", ";
+
+ /*
+ * Check to see if we're starting a multiassignment group: if so,
+ * output a left paren.
+ */
+ if (next_ma_cell != NULL && cur_ma_sublink == NULL)
+ {
+ /*
+ * We must dig down into the expr to see if it's a PARAM_MULTIEXPR
+ * Param. That could be buried under FieldStores and
+ * SubscriptingRefs and CoerceToDomains (cf processIndirection()),
+ * and underneath those there could be an implicit type coercion.
+ * Because we would ignore implicit type coercions anyway, we
+ * don't need to be as careful as processIndirection() is about
+ * descending past implicit CoerceToDomains.
+ */
+ expr = (Node *) tle->expr;
+ while (expr)
+ {
+ if (IsA(expr, FieldStore))
+ {
+ FieldStore *fstore = (FieldStore *) expr;
+
+ expr = (Node *) linitial(fstore->newvals);
+ }
+ else if (IsA(expr, SubscriptingRef))
+ {
+ SubscriptingRef *sbsref = (SubscriptingRef *) expr;
+
+ if (sbsref->refassgnexpr == NULL)
+ break;
+
+ expr = (Node *) sbsref->refassgnexpr;
+ }
+ else if (IsA(expr, CoerceToDomain))
+ {
+ CoerceToDomain *cdomain = (CoerceToDomain *) expr;
+
+ if (cdomain->coercionformat != COERCE_IMPLICIT_CAST)
+ break;
+ expr = (Node *) cdomain->arg;
+ }
+ else
+ break;
+ }
+ expr = strip_implicit_coercions(expr);
+
+ if (expr && IsA(expr, Param) &&
+ ((Param *) expr)->paramkind == PARAM_MULTIEXPR)
+ {
+ cur_ma_sublink = (SubLink *) lfirst(next_ma_cell);
+ next_ma_cell = lnext(ma_sublinks, next_ma_cell);
+ remaining_ma_columns = count_nonjunk_tlist_entries(((Query *) cur_ma_sublink->subselect)->targetList);
+ Assert(((Param *) expr)->paramid ==
+ ((cur_ma_sublink->subLinkId << 16) | 1));
+ appendStringInfoChar(buf, '(');
+ }
+ }
+
+ /*
+ * Put out name of target column; look in the catalogs, not at
+ * tle->resname, since resname will fail to track RENAME.
+ */
+ appendStringInfoString(buf,
+ quote_identifier(get_attname(rte->relid,
+ tle->resno,
+ false)));
+
+ /*
+ * Print any indirection needed (subfields or subscripts), and strip
+ * off the top-level nodes representing the indirection assignments.
+ */
+ expr = processIndirection((Node *) tle->expr, context);
+
+ /*
+ * If we're in a multiassignment, skip printing anything more, unless
+ * this is the last column; in which case, what we print should be the
+ * sublink, not the Param.
+ */
+ if (cur_ma_sublink != NULL)
+ {
+ if (--remaining_ma_columns > 0)
+ continue; /* not the last column of multiassignment */
+ appendStringInfoChar(buf, ')');
+ expr = (Node *) cur_ma_sublink;
+ cur_ma_sublink = NULL;
+ }
+
+ appendStringInfoString(buf, " = ");
+
+ get_rule_expr(expr, context, false);
+ }
+}
+
+
+/* ----------
+ * get_delete_query_def - Parse back a DELETE parsetree
+ * ----------
+ */
+static void
+get_delete_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *rte;
+
+ /* Insert the WITH clause if given */
+ get_with_clause(query, context);
+
+ /*
+ * Start the query with DELETE FROM relname
+ */
+ rte = rt_fetch(query->resultRelation, query->rtable);
+ Assert(rte->rtekind == RTE_RELATION);
+ if (PRETTY_INDENT(context))
+ {
+ appendStringInfoChar(buf, ' ');
+ context->indentLevel += PRETTYINDENT_STD;
+ }
+ appendStringInfo(buf, "DELETE FROM %s%s",
+ only_marker(rte),
+ generate_relation_name(rte->relid, NIL));
+
+ /* Print the relation alias, if needed */
+ get_rte_alias(rte, query->resultRelation, false, context);
+
+ /* Add the USING clause if given */
+ get_from_clause(query, " USING ", context);
+
+ /* Add a WHERE clause if given */
+ if (query->jointree->quals != NULL)
+ {
+ appendContextKeyword(context, " WHERE ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_rule_expr(query->jointree->quals, context, false);
+ }
+
+ /* Add RETURNING if present */
+ if (query->returningList)
+ {
+ appendContextKeyword(context, " RETURNING",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
+ }
+}
+
+
+/* ----------
+ * get_merge_query_def - Parse back a MERGE parsetree
+ * ----------
+ */
+static void
+get_merge_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *rte;
+ ListCell *lc;
+
+ /* Insert the WITH clause if given */
+ get_with_clause(query, context);
+
+ /*
+ * Start the query with MERGE INTO relname
+ */
+ rte = rt_fetch(query->resultRelation, query->rtable);
+ Assert(rte->rtekind == RTE_RELATION);
+ if (PRETTY_INDENT(context))
+ {
+ appendStringInfoChar(buf, ' ');
+ context->indentLevel += PRETTYINDENT_STD;
+ }
+ appendStringInfo(buf, "MERGE INTO %s%s",
+ only_marker(rte),
+ generate_relation_name(rte->relid, NIL));
+
+ /* Print the relation alias, if needed */
+ get_rte_alias(rte, query->resultRelation, false, context);
+
+ /* Print the source relation and join clause */
+ get_from_clause(query, " USING ", context);
+ appendContextKeyword(context, " ON ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 2);
+ get_rule_expr(query->jointree->quals, context, false);
+
+ /* Print each merge action */
+ foreach(lc, query->mergeActionList)
+ {
+ MergeAction *action = lfirst_node(MergeAction, lc);
+
+ appendContextKeyword(context, " WHEN ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 2);
+ appendStringInfo(buf, "%sMATCHED", action->matched ? "" : "NOT ");
+
+ if (action->qual)
+ {
+ appendContextKeyword(context, " AND ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 3);
+ get_rule_expr(action->qual, context, false);
+ }
+ appendContextKeyword(context, " THEN ",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 3);
+
+ if (action->commandType == CMD_INSERT)
+ {
+ /* This generally matches get_insert_query_def() */
+ List *strippedexprs = NIL;
+ const char *sep = "";
+ ListCell *lc2;
+
+ appendStringInfoString(buf, "INSERT");
+
+ if (action->targetList)
+ appendStringInfoString(buf, " (");
+ foreach(lc2, action->targetList)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(lc2);
+
+ Assert(!tle->resjunk);
+
+ appendStringInfoString(buf, sep);
+ sep = ", ";
+
+ appendStringInfoString(buf,
+ quote_identifier(get_attname(rte->relid,
+ tle->resno,
+ false)));
+ strippedexprs = lappend(strippedexprs,
+ processIndirection((Node *) tle->expr,
+ context));
+ }
+ if (action->targetList)
+ appendStringInfoChar(buf, ')');
+
+ if (action->override)
+ {
+ if (action->override == OVERRIDING_SYSTEM_VALUE)
+ appendStringInfoString(buf, " OVERRIDING SYSTEM VALUE");
+ else if (action->override == OVERRIDING_USER_VALUE)
+ appendStringInfoString(buf, " OVERRIDING USER VALUE");
+ }
+
+ if (strippedexprs)
+ {
+ appendContextKeyword(context, " VALUES (",
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 4);
+ get_rule_list_toplevel(strippedexprs, context, false);
+ appendStringInfoChar(buf, ')');
+ }
+ else
+ appendStringInfoString(buf, " DEFAULT VALUES");
+ }
+ else if (action->commandType == CMD_UPDATE)
+ {
+ appendStringInfoString(buf, "UPDATE SET ");
+ get_update_query_targetlist_def(query, action->targetList,
+ context, rte);
+ }
+ else if (action->commandType == CMD_DELETE)
+ appendStringInfoString(buf, "DELETE");
+ else if (action->commandType == CMD_NOTHING)
+ appendStringInfoString(buf, "DO NOTHING");
+ }
+
+ /* No RETURNING support in MERGE yet */
+ Assert(query->returningList == NIL);
+}
+
+
+/* ----------
+ * get_utility_query_def - Parse back a UTILITY parsetree
+ * ----------
+ */
+static void
+get_utility_query_def(Query *query, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+
+ if (query->utilityStmt && IsA(query->utilityStmt, NotifyStmt))
+ {
+ NotifyStmt *stmt = (NotifyStmt *) query->utilityStmt;
+
+ appendContextKeyword(context, "",
+ 0, PRETTYINDENT_STD, 1);
+ appendStringInfo(buf, "NOTIFY %s",
+ quote_identifier(stmt->conditionname));
+ if (stmt->payload)
+ {
+ appendStringInfoString(buf, ", ");
+ simple_quote_literal(buf, stmt->payload);
+ }
+ }
+ else
+ {
+ /* Currently only NOTIFY utility commands can appear in rules */
+ elog(ERROR, "unexpected utility statement type");
+ }
+}
+
+/*
+ * Display a Var appropriately.
+ *
+ * In some cases (currently only when recursing into an unnamed join)
+ * the Var's varlevelsup has to be interpreted with respect to a context
+ * above the current one; levelsup indicates the offset.
+ *
+ * If istoplevel is true, the Var is at the top level of a SELECT's
+ * targetlist, which means we need special treatment of whole-row Vars.
+ * Instead of the normal "tab.*", we'll print "tab.*::typename", which is a
+ * dirty hack to prevent "tab.*" from being expanded into multiple columns.
+ * (The parser will strip the useless coercion, so no inefficiency is added in
+ * dump and reload.) We used to print just "tab" in such cases, but that is
+ * ambiguous and will yield the wrong result if "tab" is also a plain column
+ * name in the query.
+ *
+ * Returns the attname of the Var, or NULL if the Var has no attname (because
+ * it is a whole-row Var or a subplan output reference).
+ */
+static char *
+get_variable(Var *var, int levelsup, bool istoplevel, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ RangeTblEntry *rte;
+ AttrNumber attnum;
+ int netlevelsup;
+ deparse_namespace *dpns;
+ int varno;
+ AttrNumber varattno;
+ deparse_columns *colinfo;
+ char *refname;
+ char *attname;
+
+ /* Find appropriate nesting depth */
+ netlevelsup = var->varlevelsup + levelsup;
+ if (netlevelsup >= list_length(context->namespaces))
+ elog(ERROR, "bogus varlevelsup: %d offset %d",
+ var->varlevelsup, levelsup);
+ dpns = (deparse_namespace *) list_nth(context->namespaces,
+ netlevelsup);
+
+ /*
+ * If we have a syntactic referent for the Var, and we're working from a
+ * parse tree, prefer to use the syntactic referent. Otherwise, fall back
+ * on the semantic referent. (Forcing use of the semantic referent when
+ * printing plan trees is a design choice that's perhaps more motivated by
+ * backwards compatibility than anything else. But it does have the
+ * advantage of making plans more explicit.)
+ */
+ if (var->varnosyn > 0 && dpns->plan == NULL)
+ {
+ varno = var->varnosyn;
+ varattno = var->varattnosyn;
+ }
+ else
+ {
+ varno = var->varno;
+ varattno = var->varattno;
+ }
+
+ /*
+ * Try to find the relevant RTE in this rtable. In a plan tree, it's
+ * likely that varno is OUTER_VAR or INNER_VAR, in which case we must dig
+ * down into the subplans, or INDEX_VAR, which is resolved similarly. Also
+ * find the aliases previously assigned for this RTE.
+ */
+ if (varno >= 1 && varno <= list_length(dpns->rtable))
+ {
+ /*
+ * We might have been asked to map child Vars to some parent relation.
+ */
+ if (context->appendparents && dpns->appendrels)
+ {
+ int pvarno = varno;
+ AttrNumber pvarattno = varattno;
+ AppendRelInfo *appinfo = dpns->appendrels[pvarno];
+ bool found = false;
+
+ /* Only map up to inheritance parents, not UNION ALL appendrels */
+ while (appinfo &&
+ rt_fetch(appinfo->parent_relid,
+ dpns->rtable)->rtekind == RTE_RELATION)
+ {
+ found = false;
+ if (pvarattno > 0) /* system columns stay as-is */
+ {
+ if (pvarattno > appinfo->num_child_cols)
+ break; /* safety check */
+ pvarattno = appinfo->parent_colnos[pvarattno - 1];
+ if (pvarattno == 0)
+ break; /* Var is local to child */
+ }
+
+ pvarno = appinfo->parent_relid;
+ found = true;
+
+ /* If the parent is itself a child, continue up. */
+ Assert(pvarno > 0 && pvarno <= list_length(dpns->rtable));
+ appinfo = dpns->appendrels[pvarno];
+ }
+
+ /*
+ * If we found an ancestral rel, and that rel is included in
+ * appendparents, print that column not the original one.
+ */
+ if (found && bms_is_member(pvarno, context->appendparents))
+ {
+ varno = pvarno;
+ varattno = pvarattno;
+ }
+ }
+
+ rte = rt_fetch(varno, dpns->rtable);
+ refname = (char *) list_nth(dpns->rtable_names, varno - 1);
+ colinfo = deparse_columns_fetch(varno, dpns);
+ attnum = varattno;
+ }
+ else
+ {
+ resolve_special_varno((Node *) var, context,
+ get_special_variable, NULL);
+ return NULL;
+ }
+
+ /*
+ * The planner will sometimes emit Vars referencing resjunk elements of a
+ * subquery's target list (this is currently only possible if it chooses
+ * to generate a "physical tlist" for a SubqueryScan or CteScan node).
+ * Although we prefer to print subquery-referencing Vars using the
+ * subquery's alias, that's not possible for resjunk items since they have
+ * no alias. So in that case, drill down to the subplan and print the
+ * contents of the referenced tlist item. This works because in a plan
+ * tree, such Vars can only occur in a SubqueryScan or CteScan node, and
+ * we'll have set dpns->inner_plan to reference the child plan node.
+ */
+ if ((rte->rtekind == RTE_SUBQUERY || rte->rtekind == RTE_CTE) &&
+ attnum > list_length(rte->eref->colnames) &&
+ dpns->inner_plan)
+ {
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+
+ tle = get_tle_by_resno(dpns->inner_tlist, attnum);
+ if (!tle)
+ elog(ERROR, "invalid attnum %d for relation \"%s\"",
+ attnum, rte->eref->aliasname);
+
+ Assert(netlevelsup == 0);
+ push_child_plan(dpns, dpns->inner_plan, &save_dpns);
+
+ /*
+ * Force parentheses because our caller probably assumed a Var is a
+ * simple expression.
+ */
+ if (!IsA(tle->expr, Var))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) tle->expr, context, true);
+ if (!IsA(tle->expr, Var))
+ appendStringInfoChar(buf, ')');
+
+ pop_child_plan(dpns, &save_dpns);
+ return NULL;
+ }
+
+ /*
+ * If it's an unnamed join, look at the expansion of the alias variable.
+ * If it's a simple reference to one of the input vars, then recursively
+ * print the name of that var instead. When it's not a simple reference,
+ * we have to just print the unqualified join column name. (This can only
+ * happen with "dangerous" merged columns in a JOIN USING; we took pains
+ * previously to make the unqualified column name unique in such cases.)
+ *
+ * This wouldn't work in decompiling plan trees, because we don't store
+ * joinaliasvars lists after planning; but a plan tree should never
+ * contain a join alias variable.
+ */
+ if (rte->rtekind == RTE_JOIN && rte->alias == NULL)
+ {
+ if (rte->joinaliasvars == NIL)
+ elog(ERROR, "cannot decompile join alias var in plan tree");
+ if (attnum > 0)
+ {
+ Var *aliasvar;
+
+ aliasvar = (Var *) list_nth(rte->joinaliasvars, attnum - 1);
+ /* we intentionally don't strip implicit coercions here */
+ if (aliasvar && IsA(aliasvar, Var))
+ {
+ return get_variable(aliasvar, var->varlevelsup + levelsup,
+ istoplevel, context);
+ }
+ }
+
+ /*
+ * Unnamed join has no refname. (Note: since it's unnamed, there is
+ * no way the user could have referenced it to create a whole-row Var
+ * for it. So we don't have to cover that case below.)
+ */
+ Assert(refname == NULL);
+ }
+
+ if (attnum == InvalidAttrNumber)
+ attname = NULL;
+ else if (attnum > 0)
+ {
+ /* Get column name to use from the colinfo struct */
+ if (attnum > colinfo->num_cols)
+ elog(ERROR, "invalid attnum %d for relation \"%s\"",
+ attnum, rte->eref->aliasname);
+ attname = colinfo->colnames[attnum - 1];
+
+ /*
+ * If we find a Var referencing a dropped column, it seems better to
+ * print something (anything) than to fail. In general this should
+ * not happen, but it used to be possible for some cases involving
+ * functions returning named composite types, and perhaps there are
+ * still bugs out there.
+ */
+ if (attname == NULL)
+ attname = "?dropped?column?";
+ }
+ else
+ {
+ /* System column - name is fixed, get it from the catalog */
+ attname = get_rte_attribute_name(rte, attnum);
+ }
+
+ if (refname && (context->varprefix || attname == NULL))
+ {
+ appendStringInfoString(buf, quote_identifier(refname));
+ appendStringInfoChar(buf, '.');
+ }
+ if (attname)
+ appendStringInfoString(buf, quote_identifier(attname));
+ else
+ {
+ appendStringInfoChar(buf, '*');
+ if (istoplevel)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(var->vartype,
+ var->vartypmod));
+ }
+
+ return attname;
+}
+
+/*
+ * Deparse a Var which references OUTER_VAR, INNER_VAR, or INDEX_VAR. This
+ * routine is actually a callback for resolve_special_varno, which handles
+ * finding the correct TargetEntry. We get the expression contained in that
+ * TargetEntry and just need to deparse it, a job we can throw back on
+ * get_rule_expr.
+ */
+static void
+get_special_variable(Node *node, deparse_context *context, void *callback_arg)
+{
+ StringInfo buf = context->buf;
+
+ /*
+ * For a non-Var referent, force parentheses because our caller probably
+ * assumed a Var is a simple expression.
+ */
+ if (!IsA(node, Var))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr(node, context, true);
+ if (!IsA(node, Var))
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * Chase through plan references to special varnos (OUTER_VAR, INNER_VAR,
+ * INDEX_VAR) until we find a real Var or some kind of non-Var node; then,
+ * invoke the callback provided.
+ */
+static void
+resolve_special_varno(Node *node, deparse_context *context,
+ rsv_callback callback, void *callback_arg)
+{
+ Var *var;
+ deparse_namespace *dpns;
+
+ /* This function is recursive, so let's be paranoid. */
+ check_stack_depth();
+
+ /* If it's not a Var, invoke the callback. */
+ if (!IsA(node, Var))
+ {
+ (*callback) (node, context, callback_arg);
+ return;
+ }
+
+ /* Find appropriate nesting depth */
+ var = (Var *) node;
+ dpns = (deparse_namespace *) list_nth(context->namespaces,
+ var->varlevelsup);
+
+ /*
+ * If varno is special, recurse. (Don't worry about varnosyn; if we're
+ * here, we already decided not to use that.)
+ */
+ if (var->varno == OUTER_VAR && dpns->outer_tlist)
+ {
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+ Bitmapset *save_appendparents;
+
+ tle = get_tle_by_resno(dpns->outer_tlist, var->varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for OUTER_VAR var: %d", var->varattno);
+
+ /*
+ * If we're descending to the first child of an Append or MergeAppend,
+ * update appendparents. This will affect deparsing of all Vars
+ * appearing within the eventually-resolved subexpression.
+ */
+ save_appendparents = context->appendparents;
+
+ if (IsA(dpns->plan, Append))
+ context->appendparents = bms_union(context->appendparents,
+ ((Append *) dpns->plan)->apprelids);
+ else if (IsA(dpns->plan, MergeAppend))
+ context->appendparents = bms_union(context->appendparents,
+ ((MergeAppend *) dpns->plan)->apprelids);
+
+ push_child_plan(dpns, dpns->outer_plan, &save_dpns);
+ resolve_special_varno((Node *) tle->expr, context,
+ callback, callback_arg);
+ pop_child_plan(dpns, &save_dpns);
+ context->appendparents = save_appendparents;
+ return;
+ }
+ else if (var->varno == INNER_VAR && dpns->inner_tlist)
+ {
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+
+ tle = get_tle_by_resno(dpns->inner_tlist, var->varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for INNER_VAR var: %d", var->varattno);
+
+ push_child_plan(dpns, dpns->inner_plan, &save_dpns);
+ resolve_special_varno((Node *) tle->expr, context,
+ callback, callback_arg);
+ pop_child_plan(dpns, &save_dpns);
+ return;
+ }
+ else if (var->varno == INDEX_VAR && dpns->index_tlist)
+ {
+ TargetEntry *tle;
+
+ tle = get_tle_by_resno(dpns->index_tlist, var->varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for INDEX_VAR var: %d", var->varattno);
+
+ resolve_special_varno((Node *) tle->expr, context,
+ callback, callback_arg);
+ return;
+ }
+ else if (var->varno < 1 || var->varno > list_length(dpns->rtable))
+ elog(ERROR, "bogus varno: %d", var->varno);
+
+ /* Not special. Just invoke the callback. */
+ (*callback) (node, context, callback_arg);
+}
+
+/*
+ * Get the name of a field of an expression of composite type. The
+ * expression is usually a Var, but we handle other cases too.
+ *
+ * levelsup is an extra offset to interpret the Var's varlevelsup correctly.
+ *
+ * This is fairly straightforward when the expression has a named composite
+ * type; we need only look up the type in the catalogs. However, the type
+ * could also be RECORD. Since no actual table or view column is allowed to
+ * have type RECORD, a Var of type RECORD must refer to a JOIN or FUNCTION RTE
+ * or to a subquery output. We drill down to find the ultimate defining
+ * expression and attempt to infer the field name from it. We ereport if we
+ * can't determine the name.
+ *
+ * Similarly, a PARAM of type RECORD has to refer to some expression of
+ * a determinable composite type.
+ */
+static const char *
+get_name_for_var_field(Var *var, int fieldno,
+ int levelsup, deparse_context *context)
+{
+ RangeTblEntry *rte;
+ AttrNumber attnum;
+ int netlevelsup;
+ deparse_namespace *dpns;
+ int varno;
+ AttrNumber varattno;
+ TupleDesc tupleDesc;
+ Node *expr;
+
+ /*
+ * If it's a RowExpr that was expanded from a whole-row Var, use the
+ * column names attached to it. (We could let get_expr_result_tupdesc()
+ * handle this, but it's much cheaper to just pull out the name we need.)
+ */
+ if (IsA(var, RowExpr))
+ {
+ RowExpr *r = (RowExpr *) var;
+
+ if (fieldno > 0 && fieldno <= list_length(r->colnames))
+ return strVal(list_nth(r->colnames, fieldno - 1));
+ }
+
+ /*
+ * If it's a Param of type RECORD, try to find what the Param refers to.
+ */
+ if (IsA(var, Param))
+ {
+ Param *param = (Param *) var;
+ ListCell *ancestor_cell;
+
+ expr = find_param_referent(param, context, &dpns, &ancestor_cell);
+ if (expr)
+ {
+ /* Found a match, so recurse to decipher the field name */
+ deparse_namespace save_dpns;
+ const char *result;
+
+ push_ancestor_plan(dpns, ancestor_cell, &save_dpns);
+ result = get_name_for_var_field((Var *) expr, fieldno,
+ 0, context);
+ pop_ancestor_plan(dpns, &save_dpns);
+ return result;
+ }
+ }
+
+ /*
+ * If it's a Var of type RECORD, we have to find what the Var refers to;
+ * if not, we can use get_expr_result_tupdesc().
+ */
+ if (!IsA(var, Var) ||
+ var->vartype != RECORDOID)
+ {
+ tupleDesc = get_expr_result_tupdesc((Node *) var, false);
+ /* Got the tupdesc, so we can extract the field name */
+ Assert(fieldno >= 1 && fieldno <= tupleDesc->natts);
+ return NameStr(TupleDescAttr(tupleDesc, fieldno - 1)->attname);
+ }
+
+ /* Find appropriate nesting depth */
+ netlevelsup = var->varlevelsup + levelsup;
+ if (netlevelsup >= list_length(context->namespaces))
+ elog(ERROR, "bogus varlevelsup: %d offset %d",
+ var->varlevelsup, levelsup);
+ dpns = (deparse_namespace *) list_nth(context->namespaces,
+ netlevelsup);
+
+ /*
+ * If we have a syntactic referent for the Var, and we're working from a
+ * parse tree, prefer to use the syntactic referent. Otherwise, fall back
+ * on the semantic referent. (See comments in get_variable().)
+ */
+ if (var->varnosyn > 0 && dpns->plan == NULL)
+ {
+ varno = var->varnosyn;
+ varattno = var->varattnosyn;
+ }
+ else
+ {
+ varno = var->varno;
+ varattno = var->varattno;
+ }
+
+ /*
+ * Try to find the relevant RTE in this rtable. In a plan tree, it's
+ * likely that varno is OUTER_VAR or INNER_VAR, in which case we must dig
+ * down into the subplans, or INDEX_VAR, which is resolved similarly.
+ *
+ * Note: unlike get_variable and resolve_special_varno, we need not worry
+ * about inheritance mapping: a child Var should have the same datatype as
+ * its parent, and here we're really only interested in the Var's type.
+ */
+ if (varno >= 1 && varno <= list_length(dpns->rtable))
+ {
+ rte = rt_fetch(varno, dpns->rtable);
+ attnum = varattno;
+ }
+ else if (varno == OUTER_VAR && dpns->outer_tlist)
+ {
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+ const char *result;
+
+ tle = get_tle_by_resno(dpns->outer_tlist, varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for OUTER_VAR var: %d", varattno);
+
+ Assert(netlevelsup == 0);
+ push_child_plan(dpns, dpns->outer_plan, &save_dpns);
+
+ result = get_name_for_var_field((Var *) tle->expr, fieldno,
+ levelsup, context);
+
+ pop_child_plan(dpns, &save_dpns);
+ return result;
+ }
+ else if (varno == INNER_VAR && dpns->inner_tlist)
+ {
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+ const char *result;
+
+ tle = get_tle_by_resno(dpns->inner_tlist, varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for INNER_VAR var: %d", varattno);
+
+ Assert(netlevelsup == 0);
+ push_child_plan(dpns, dpns->inner_plan, &save_dpns);
+
+ result = get_name_for_var_field((Var *) tle->expr, fieldno,
+ levelsup, context);
+
+ pop_child_plan(dpns, &save_dpns);
+ return result;
+ }
+ else if (varno == INDEX_VAR && dpns->index_tlist)
+ {
+ TargetEntry *tle;
+ const char *result;
+
+ tle = get_tle_by_resno(dpns->index_tlist, varattno);
+ if (!tle)
+ elog(ERROR, "bogus varattno for INDEX_VAR var: %d", varattno);
+
+ Assert(netlevelsup == 0);
+
+ result = get_name_for_var_field((Var *) tle->expr, fieldno,
+ levelsup, context);
+
+ return result;
+ }
+ else
+ {
+ elog(ERROR, "bogus varno: %d", varno);
+ return NULL; /* keep compiler quiet */
+ }
+
+ if (attnum == InvalidAttrNumber)
+ {
+ /* Var is whole-row reference to RTE, so select the right field */
+ return get_rte_attribute_name(rte, fieldno);
+ }
+
+ /*
+ * This part has essentially the same logic as the parser's
+ * expandRecordVariable() function, but we are dealing with a different
+ * representation of the input context, and we only need one field name
+ * not a TupleDesc. Also, we need special cases for finding subquery and
+ * CTE subplans when deparsing Plan trees.
+ */
+ expr = (Node *) var; /* default if we can't drill down */
+
+ switch (rte->rtekind)
+ {
+ case RTE_RELATION:
+ case RTE_VALUES:
+ case RTE_NAMEDTUPLESTORE:
+ case RTE_RESULT:
+
+ /*
+ * This case should not occur: a column of a table, values list,
+ * or ENR shouldn't have type RECORD. Fall through and fail (most
+ * likely) at the bottom.
+ */
+ break;
+ case RTE_SUBQUERY:
+ /* Subselect-in-FROM: examine sub-select's output expr */
+ {
+ if (rte->subquery)
+ {
+ TargetEntry *ste = get_tle_by_resno(rte->subquery->targetList,
+ attnum);
+
+ if (ste == NULL || ste->resjunk)
+ elog(ERROR, "subquery %s does not have attribute %d",
+ rte->eref->aliasname, attnum);
+ expr = (Node *) ste->expr;
+ if (IsA(expr, Var))
+ {
+ /*
+ * Recurse into the sub-select to see what its Var
+ * refers to. We have to build an additional level of
+ * namespace to keep in step with varlevelsup in the
+ * subselect; furthermore, the subquery RTE might be
+ * from an outer query level, in which case the
+ * namespace for the subselect must have that outer
+ * level as parent namespace.
+ */
+ List *save_nslist = context->namespaces;
+ List *parent_namespaces;
+ deparse_namespace mydpns;
+ const char *result;
+
+ parent_namespaces = list_copy_tail(context->namespaces,
+ netlevelsup);
+
+ set_deparse_for_query(&mydpns, rte->subquery,
+ parent_namespaces);
+
+ context->namespaces = lcons(&mydpns, parent_namespaces);
+
+ result = get_name_for_var_field((Var *) expr, fieldno,
+ 0, context);
+
+ context->namespaces = save_nslist;
+
+ return result;
+ }
+ /* else fall through to inspect the expression */
+ }
+ else
+ {
+ /*
+ * We're deparsing a Plan tree so we don't have complete
+ * RTE entries (in particular, rte->subquery is NULL). But
+ * the only place we'd see a Var directly referencing a
+ * SUBQUERY RTE is in a SubqueryScan plan node, and we can
+ * look into the child plan's tlist instead.
+ */
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+ const char *result;
+
+ if (!dpns->inner_plan)
+ elog(ERROR, "failed to find plan for subquery %s",
+ rte->eref->aliasname);
+ tle = get_tle_by_resno(dpns->inner_tlist, attnum);
+ if (!tle)
+ elog(ERROR, "bogus varattno for subquery var: %d",
+ attnum);
+ Assert(netlevelsup == 0);
+ push_child_plan(dpns, dpns->inner_plan, &save_dpns);
+
+ result = get_name_for_var_field((Var *) tle->expr, fieldno,
+ levelsup, context);
+
+ pop_child_plan(dpns, &save_dpns);
+ return result;
+ }
+ }
+ break;
+ case RTE_JOIN:
+ /* Join RTE --- recursively inspect the alias variable */
+ if (rte->joinaliasvars == NIL)
+ elog(ERROR, "cannot decompile join alias var in plan tree");
+ Assert(attnum > 0 && attnum <= list_length(rte->joinaliasvars));
+ expr = (Node *) list_nth(rte->joinaliasvars, attnum - 1);
+ Assert(expr != NULL);
+ /* we intentionally don't strip implicit coercions here */
+ if (IsA(expr, Var))
+ return get_name_for_var_field((Var *) expr, fieldno,
+ var->varlevelsup + levelsup,
+ context);
+ /* else fall through to inspect the expression */
+ break;
+ case RTE_FUNCTION:
+ case RTE_TABLEFUNC:
+
+ /*
+ * We couldn't get here unless a function is declared with one of
+ * its result columns as RECORD, which is not allowed.
+ */
+ break;
+ case RTE_CTE:
+ /* CTE reference: examine subquery's output expr */
+ {
+ CommonTableExpr *cte = NULL;
+ Index ctelevelsup;
+ ListCell *lc;
+
+ /*
+ * Try to find the referenced CTE using the namespace stack.
+ */
+ ctelevelsup = rte->ctelevelsup + netlevelsup;
+ if (ctelevelsup >= list_length(context->namespaces))
+ lc = NULL;
+ else
+ {
+ deparse_namespace *ctedpns;
+
+ ctedpns = (deparse_namespace *)
+ list_nth(context->namespaces, ctelevelsup);
+ foreach(lc, ctedpns->ctes)
+ {
+ cte = (CommonTableExpr *) lfirst(lc);
+ if (strcmp(cte->ctename, rte->ctename) == 0)
+ break;
+ }
+ }
+ if (lc != NULL)
+ {
+ Query *ctequery = (Query *) cte->ctequery;
+ TargetEntry *ste = get_tle_by_resno(GetCTETargetList(cte),
+ attnum);
+
+ if (ste == NULL || ste->resjunk)
+ elog(ERROR, "CTE %s does not have attribute %d",
+ rte->eref->aliasname, attnum);
+ expr = (Node *) ste->expr;
+ if (IsA(expr, Var))
+ {
+ /*
+ * Recurse into the CTE to see what its Var refers to.
+ * We have to build an additional level of namespace
+ * to keep in step with varlevelsup in the CTE;
+ * furthermore it could be an outer CTE (compare
+ * SUBQUERY case above).
+ */
+ List *save_nslist = context->namespaces;
+ List *parent_namespaces;
+ deparse_namespace mydpns;
+ const char *result;
+
+ parent_namespaces = list_copy_tail(context->namespaces,
+ ctelevelsup);
+
+ set_deparse_for_query(&mydpns, ctequery,
+ parent_namespaces);
+
+ context->namespaces = lcons(&mydpns, parent_namespaces);
+
+ result = get_name_for_var_field((Var *) expr, fieldno,
+ 0, context);
+
+ context->namespaces = save_nslist;
+
+ return result;
+ }
+ /* else fall through to inspect the expression */
+ }
+ else
+ {
+ /*
+ * We're deparsing a Plan tree so we don't have a CTE
+ * list. But the only places we'd see a Var directly
+ * referencing a CTE RTE are in CteScan or WorkTableScan
+ * plan nodes. For those cases, set_deparse_plan arranged
+ * for dpns->inner_plan to be the plan node that emits the
+ * CTE or RecursiveUnion result, and we can look at its
+ * tlist instead.
+ */
+ TargetEntry *tle;
+ deparse_namespace save_dpns;
+ const char *result;
+
+ if (!dpns->inner_plan)
+ elog(ERROR, "failed to find plan for CTE %s",
+ rte->eref->aliasname);
+ tle = get_tle_by_resno(dpns->inner_tlist, attnum);
+ if (!tle)
+ elog(ERROR, "bogus varattno for subquery var: %d",
+ attnum);
+ Assert(netlevelsup == 0);
+ push_child_plan(dpns, dpns->inner_plan, &save_dpns);
+
+ result = get_name_for_var_field((Var *) tle->expr, fieldno,
+ levelsup, context);
+
+ pop_child_plan(dpns, &save_dpns);
+ return result;
+ }
+ }
+ break;
+ }
+
+ /*
+ * We now have an expression we can't expand any more, so see if
+ * get_expr_result_tupdesc() can do anything with it.
+ */
+ tupleDesc = get_expr_result_tupdesc(expr, false);
+ /* Got the tupdesc, so we can extract the field name */
+ Assert(fieldno >= 1 && fieldno <= tupleDesc->natts);
+ return NameStr(TupleDescAttr(tupleDesc, fieldno - 1)->attname);
+}
+
+/*
+ * Try to find the referenced expression for a PARAM_EXEC Param that might
+ * reference a parameter supplied by an upper NestLoop or SubPlan plan node.
+ *
+ * If successful, return the expression and set *dpns_p and *ancestor_cell_p
+ * appropriately for calling push_ancestor_plan(). If no referent can be
+ * found, return NULL.
+ */
+static Node *
+find_param_referent(Param *param, deparse_context *context,
+ deparse_namespace **dpns_p, ListCell **ancestor_cell_p)
+{
+ /* Initialize output parameters to prevent compiler warnings */
+ *dpns_p = NULL;
+ *ancestor_cell_p = NULL;
+
+ /*
+ * If it's a PARAM_EXEC parameter, look for a matching NestLoopParam or
+ * SubPlan argument. This will necessarily be in some ancestor of the
+ * current expression's Plan node.
+ */
+ if (param->paramkind == PARAM_EXEC)
+ {
+ deparse_namespace *dpns;
+ Plan *child_plan;
+ bool in_same_plan_level;
+ ListCell *lc;
+
+ dpns = (deparse_namespace *) linitial(context->namespaces);
+ child_plan = dpns->plan;
+ in_same_plan_level = true;
+
+ foreach(lc, dpns->ancestors)
+ {
+ Node *ancestor = (Node *) lfirst(lc);
+ ListCell *lc2;
+
+ /*
+ * NestLoops transmit params to their inner child only; also, once
+ * we've crawled up out of a subplan, this couldn't possibly be
+ * the right match.
+ */
+ if (IsA(ancestor, NestLoop) &&
+ child_plan == innerPlan(ancestor) &&
+ in_same_plan_level)
+ {
+ NestLoop *nl = (NestLoop *) ancestor;
+
+ foreach(lc2, nl->nestParams)
+ {
+ NestLoopParam *nlp = (NestLoopParam *) lfirst(lc2);
+
+ if (nlp->paramno == param->paramid)
+ {
+ /* Found a match, so return it */
+ *dpns_p = dpns;
+ *ancestor_cell_p = lc;
+ return (Node *) nlp->paramval;
+ }
+ }
+ }
+
+ /*
+ * If ancestor is a SubPlan, check the arguments it provides.
+ */
+ if (IsA(ancestor, SubPlan))
+ {
+ SubPlan *subplan = (SubPlan *) ancestor;
+ ListCell *lc3;
+ ListCell *lc4;
+
+ forboth(lc3, subplan->parParam, lc4, subplan->args)
+ {
+ int paramid = lfirst_int(lc3);
+ Node *arg = (Node *) lfirst(lc4);
+
+ if (paramid == param->paramid)
+ {
+ /*
+ * Found a match, so return it. But, since Vars in
+ * the arg are to be evaluated in the surrounding
+ * context, we have to point to the next ancestor item
+ * that is *not* a SubPlan.
+ */
+ ListCell *rest;
+
+ for_each_cell(rest, dpns->ancestors,
+ lnext(dpns->ancestors, lc))
+ {
+ Node *ancestor2 = (Node *) lfirst(rest);
+
+ if (!IsA(ancestor2, SubPlan))
+ {
+ *dpns_p = dpns;
+ *ancestor_cell_p = rest;
+ return arg;
+ }
+ }
+ elog(ERROR, "SubPlan cannot be outermost ancestor");
+ }
+ }
+
+ /* We have emerged from a subplan. */
+ in_same_plan_level = false;
+
+ /* SubPlan isn't a kind of Plan, so skip the rest */
+ continue;
+ }
+
+ /*
+ * Check to see if we're emerging from an initplan of the current
+ * ancestor plan. Initplans never have any parParams, so no need
+ * to search that list, but we need to know if we should reset
+ * in_same_plan_level.
+ */
+ foreach(lc2, ((Plan *) ancestor)->initPlan)
+ {
+ SubPlan *subplan = lfirst_node(SubPlan, lc2);
+
+ if (child_plan != (Plan *) list_nth(dpns->subplans,
+ subplan->plan_id - 1))
+ continue;
+
+ /* No parameters to be had here. */
+ Assert(subplan->parParam == NIL);
+
+ /* We have emerged from an initplan. */
+ in_same_plan_level = false;
+ break;
+ }
+
+ /* No luck, crawl up to next ancestor */
+ child_plan = (Plan *) ancestor;
+ }
+ }
+
+ /* No referent found */
+ return NULL;
+}
+
+/*
+ * Display a Param appropriately.
+ */
+static void
+get_parameter(Param *param, deparse_context *context)
+{
+ Node *expr;
+ deparse_namespace *dpns;
+ ListCell *ancestor_cell;
+
+ /*
+ * If it's a PARAM_EXEC parameter, try to locate the expression from which
+ * the parameter was computed. Note that failing to find a referent isn't
+ * an error, since the Param might well be a subplan output rather than an
+ * input.
+ */
+ expr = find_param_referent(param, context, &dpns, &ancestor_cell);
+ if (expr)
+ {
+ /* Found a match, so print it */
+ deparse_namespace save_dpns;
+ bool save_varprefix;
+ bool need_paren;
+
+ /* Switch attention to the ancestor plan node */
+ push_ancestor_plan(dpns, ancestor_cell, &save_dpns);
+
+ /*
+ * Force prefixing of Vars, since they won't belong to the relation
+ * being scanned in the original plan node.
+ */
+ save_varprefix = context->varprefix;
+ context->varprefix = true;
+
+ /*
+ * A Param's expansion is typically a Var, Aggref, GroupingFunc, or
+ * upper-level Param, which wouldn't need extra parentheses.
+ * Otherwise, insert parens to ensure the expression looks atomic.
+ */
+ need_paren = !(IsA(expr, Var) ||
+ IsA(expr, Aggref) ||
+ IsA(expr, GroupingFunc) ||
+ IsA(expr, Param));
+ if (need_paren)
+ appendStringInfoChar(context->buf, '(');
+
+ get_rule_expr(expr, context, false);
+
+ if (need_paren)
+ appendStringInfoChar(context->buf, ')');
+
+ context->varprefix = save_varprefix;
+
+ pop_ancestor_plan(dpns, &save_dpns);
+
+ return;
+ }
+
+ /*
+ * If it's an external parameter, see if the outermost namespace provides
+ * function argument names.
+ */
+ if (param->paramkind == PARAM_EXTERN && context->namespaces != NIL)
+ {
+ dpns = llast(context->namespaces);
+ if (dpns->argnames &&
+ param->paramid > 0 &&
+ param->paramid <= dpns->numargs)
+ {
+ char *argname = dpns->argnames[param->paramid - 1];
+
+ if (argname)
+ {
+ bool should_qualify = false;
+ ListCell *lc;
+
+ /*
+ * Qualify the parameter name if there are any other deparse
+ * namespaces with range tables. This avoids qualifying in
+ * trivial cases like "RETURN a + b", but makes it safe in all
+ * other cases.
+ */
+ foreach(lc, context->namespaces)
+ {
+ deparse_namespace *dpns = lfirst(lc);
+
+ if (list_length(dpns->rtable_names) > 0)
+ {
+ should_qualify = true;
+ break;
+ }
+ }
+ if (should_qualify)
+ {
+ appendStringInfoString(context->buf, quote_identifier(dpns->funcname));
+ appendStringInfoChar(context->buf, '.');
+ }
+
+ appendStringInfoString(context->buf, quote_identifier(argname));
+ return;
+ }
+ }
+ }
+
+ /*
+ * Not PARAM_EXEC, or couldn't find referent: just print $N.
+ */
+ appendStringInfo(context->buf, "$%d", param->paramid);
+}
+
+/*
+ * get_simple_binary_op_name
+ *
+ * helper function for isSimpleNode
+ * will return single char binary operator name, or NULL if it's not
+ */
+static const char *
+get_simple_binary_op_name(OpExpr *expr)
+{
+ List *args = expr->args;
+
+ if (list_length(args) == 2)
+ {
+ /* binary operator */
+ Node *arg1 = (Node *) linitial(args);
+ Node *arg2 = (Node *) lsecond(args);
+ const char *op;
+
+ op = generate_operator_name(expr->opno, exprType(arg1), exprType(arg2));
+ if (strlen(op) == 1)
+ return op;
+ }
+ return NULL;
+}
+
+
+/*
+ * isSimpleNode - check if given node is simple (doesn't need parenthesizing)
+ *
+ * true : simple in the context of parent node's type
+ * false : not simple
+ */
+static bool
+isSimpleNode(Node *node, Node *parentNode, int prettyFlags)
+{
+ if (!node)
+ return false;
+
+ switch (nodeTag(node))
+ {
+ case T_Var:
+ case T_Const:
+ case T_Param:
+ case T_CoerceToDomainValue:
+ case T_SetToDefault:
+ case T_CurrentOfExpr:
+ /* single words: always simple */
+ return true;
+
+ case T_SubscriptingRef:
+ case T_ArrayExpr:
+ case T_RowExpr:
+ case T_CoalesceExpr:
+ case T_MinMaxExpr:
+ case T_SQLValueFunction:
+ case T_XmlExpr:
+ case T_NextValueExpr:
+ case T_NullIfExpr:
+ case T_Aggref:
+ case T_GroupingFunc:
+ case T_WindowFunc:
+ case T_FuncExpr:
+ /* function-like: name(..) or name[..] */
+ return true;
+
+ /* CASE keywords act as parentheses */
+ case T_CaseExpr:
+ return true;
+
+ case T_FieldSelect:
+
+ /*
+ * appears simple since . has top precedence, unless parent is
+ * T_FieldSelect itself!
+ */
+ return !IsA(parentNode, FieldSelect);
+
+ case T_FieldStore:
+
+ /*
+ * treat like FieldSelect (probably doesn't matter)
+ */
+ return !IsA(parentNode, FieldStore);
+
+ case T_CoerceToDomain:
+ /* maybe simple, check args */
+ return isSimpleNode((Node *) ((CoerceToDomain *) node)->arg,
+ node, prettyFlags);
+ case T_RelabelType:
+ return isSimpleNode((Node *) ((RelabelType *) node)->arg,
+ node, prettyFlags);
+ case T_CoerceViaIO:
+ return isSimpleNode((Node *) ((CoerceViaIO *) node)->arg,
+ node, prettyFlags);
+ case T_ArrayCoerceExpr:
+ return isSimpleNode((Node *) ((ArrayCoerceExpr *) node)->arg,
+ node, prettyFlags);
+ case T_ConvertRowtypeExpr:
+ return isSimpleNode((Node *) ((ConvertRowtypeExpr *) node)->arg,
+ node, prettyFlags);
+
+ case T_OpExpr:
+ {
+ /* depends on parent node type; needs further checking */
+ if (prettyFlags & PRETTYFLAG_PAREN && IsA(parentNode, OpExpr))
+ {
+ const char *op;
+ const char *parentOp;
+ bool is_lopriop;
+ bool is_hipriop;
+ bool is_lopriparent;
+ bool is_hipriparent;
+
+ op = get_simple_binary_op_name((OpExpr *) node);
+ if (!op)
+ return false;
+
+ /* We know only the basic operators + - and * / % */
+ is_lopriop = (strchr("+-", *op) != NULL);
+ is_hipriop = (strchr("*/%", *op) != NULL);
+ if (!(is_lopriop || is_hipriop))
+ return false;
+
+ parentOp = get_simple_binary_op_name((OpExpr *) parentNode);
+ if (!parentOp)
+ return false;
+
+ is_lopriparent = (strchr("+-", *parentOp) != NULL);
+ is_hipriparent = (strchr("*/%", *parentOp) != NULL);
+ if (!(is_lopriparent || is_hipriparent))
+ return false;
+
+ if (is_hipriop && is_lopriparent)
+ return true; /* op binds tighter than parent */
+
+ if (is_lopriop && is_hipriparent)
+ return false;
+
+ /*
+ * Operators are same priority --- can skip parens only if
+ * we have (a - b) - c, not a - (b - c).
+ */
+ if (node == (Node *) linitial(((OpExpr *) parentNode)->args))
+ return true;
+
+ return false;
+ }
+ /* else do the same stuff as for T_SubLink et al. */
+ }
+ /* FALLTHROUGH */
+
+ case T_SubLink:
+ case T_NullTest:
+ case T_BooleanTest:
+ case T_DistinctExpr:
+ switch (nodeTag(parentNode))
+ {
+ case T_FuncExpr:
+ {
+ /* special handling for casts and COERCE_SQL_SYNTAX */
+ CoercionForm type = ((FuncExpr *) parentNode)->funcformat;
+
+ if (type == COERCE_EXPLICIT_CAST ||
+ type == COERCE_IMPLICIT_CAST ||
+ type == COERCE_SQL_SYNTAX)
+ return false;
+ return true; /* own parentheses */
+ }
+ case T_BoolExpr: /* lower precedence */
+ case T_SubscriptingRef: /* other separators */
+ case T_ArrayExpr: /* other separators */
+ case T_RowExpr: /* other separators */
+ case T_CoalesceExpr: /* own parentheses */
+ case T_MinMaxExpr: /* own parentheses */
+ case T_XmlExpr: /* own parentheses */
+ case T_NullIfExpr: /* other separators */
+ case T_Aggref: /* own parentheses */
+ case T_GroupingFunc: /* own parentheses */
+ case T_WindowFunc: /* own parentheses */
+ case T_CaseExpr: /* other separators */
+ return true;
+ default:
+ return false;
+ }
+
+ case T_BoolExpr:
+ switch (nodeTag(parentNode))
+ {
+ case T_BoolExpr:
+ if (prettyFlags & PRETTYFLAG_PAREN)
+ {
+ BoolExprType type;
+ BoolExprType parentType;
+
+ type = ((BoolExpr *) node)->boolop;
+ parentType = ((BoolExpr *) parentNode)->boolop;
+ switch (type)
+ {
+ case NOT_EXPR:
+ case AND_EXPR:
+ if (parentType == AND_EXPR || parentType == OR_EXPR)
+ return true;
+ break;
+ case OR_EXPR:
+ if (parentType == OR_EXPR)
+ return true;
+ break;
+ }
+ }
+ return false;
+ case T_FuncExpr:
+ {
+ /* special handling for casts and COERCE_SQL_SYNTAX */
+ CoercionForm type = ((FuncExpr *) parentNode)->funcformat;
+
+ if (type == COERCE_EXPLICIT_CAST ||
+ type == COERCE_IMPLICIT_CAST ||
+ type == COERCE_SQL_SYNTAX)
+ return false;
+ return true; /* own parentheses */
+ }
+ case T_SubscriptingRef: /* other separators */
+ case T_ArrayExpr: /* other separators */
+ case T_RowExpr: /* other separators */
+ case T_CoalesceExpr: /* own parentheses */
+ case T_MinMaxExpr: /* own parentheses */
+ case T_XmlExpr: /* own parentheses */
+ case T_NullIfExpr: /* other separators */
+ case T_Aggref: /* own parentheses */
+ case T_GroupingFunc: /* own parentheses */
+ case T_WindowFunc: /* own parentheses */
+ case T_CaseExpr: /* other separators */
+ return true;
+ default:
+ return false;
+ }
+
+ default:
+ break;
+ }
+ /* those we don't know: in dubio complexo */
+ return false;
+}
+
+
+/*
+ * appendContextKeyword - append a keyword to buffer
+ *
+ * If prettyPrint is enabled, perform a line break, and adjust indentation.
+ * Otherwise, just append the keyword.
+ */
+static void
+appendContextKeyword(deparse_context *context, const char *str,
+ int indentBefore, int indentAfter, int indentPlus)
+{
+ StringInfo buf = context->buf;
+
+ if (PRETTY_INDENT(context))
+ {
+ int indentAmount;
+
+ context->indentLevel += indentBefore;
+
+ /* remove any trailing spaces currently in the buffer ... */
+ removeStringInfoSpaces(buf);
+ /* ... then add a newline and some spaces */
+ appendStringInfoChar(buf, '\n');
+
+ if (context->indentLevel < PRETTYINDENT_LIMIT)
+ indentAmount = Max(context->indentLevel, 0) + indentPlus;
+ else
+ {
+ /*
+ * If we're indented more than PRETTYINDENT_LIMIT characters, try
+ * to conserve horizontal space by reducing the per-level
+ * indentation. For best results the scale factor here should
+ * divide all the indent amounts that get added to indentLevel
+ * (PRETTYINDENT_STD, etc). It's important that the indentation
+ * not grow unboundedly, else deeply-nested trees use O(N^2)
+ * whitespace; so we also wrap modulo PRETTYINDENT_LIMIT.
+ */
+ indentAmount = PRETTYINDENT_LIMIT +
+ (context->indentLevel - PRETTYINDENT_LIMIT) /
+ (PRETTYINDENT_STD / 2);
+ indentAmount %= PRETTYINDENT_LIMIT;
+ /* scale/wrap logic affects indentLevel, but not indentPlus */
+ indentAmount += indentPlus;
+ }
+ appendStringInfoSpaces(buf, indentAmount);
+
+ appendStringInfoString(buf, str);
+
+ context->indentLevel += indentAfter;
+ if (context->indentLevel < 0)
+ context->indentLevel = 0;
+ }
+ else
+ appendStringInfoString(buf, str);
+}
+
+/*
+ * removeStringInfoSpaces - delete trailing spaces from a buffer.
+ *
+ * Possibly this should move to stringinfo.c at some point.
+ */
+static void
+removeStringInfoSpaces(StringInfo str)
+{
+ while (str->len > 0 && str->data[str->len - 1] == ' ')
+ str->data[--(str->len)] = '\0';
+}
+
+
+/*
+ * get_rule_expr_paren - deparse expr using get_rule_expr,
+ * embracing the string with parentheses if necessary for prettyPrint.
+ *
+ * Never embrace if prettyFlags=0, because it's done in the calling node.
+ *
+ * Any node that does *not* embrace its argument node by sql syntax (with
+ * parentheses, non-operator keywords like CASE/WHEN/ON, or comma etc) should
+ * use get_rule_expr_paren instead of get_rule_expr so parentheses can be
+ * added.
+ */
+static void
+get_rule_expr_paren(Node *node, deparse_context *context,
+ bool showimplicit, Node *parentNode)
+{
+ bool need_paren;
+
+ need_paren = PRETTY_PAREN(context) &&
+ !isSimpleNode(node, parentNode, context->prettyFlags);
+
+ if (need_paren)
+ appendStringInfoChar(context->buf, '(');
+
+ get_rule_expr(node, context, showimplicit);
+
+ if (need_paren)
+ appendStringInfoChar(context->buf, ')');
+}
+
+
+/* ----------
+ * get_rule_expr - Parse back an expression
+ *
+ * Note: showimplicit determines whether we display any implicit cast that
+ * is present at the top of the expression tree. It is a passed argument,
+ * not a field of the context struct, because we change the value as we
+ * recurse down into the expression. In general we suppress implicit casts
+ * when the result type is known with certainty (eg, the arguments of an
+ * OR must be boolean). We display implicit casts for arguments of functions
+ * and operators, since this is needed to be certain that the same function
+ * or operator will be chosen when the expression is re-parsed.
+ * ----------
+ */
+static void
+get_rule_expr(Node *node, deparse_context *context,
+ bool showimplicit)
+{
+ StringInfo buf = context->buf;
+
+ if (node == NULL)
+ return;
+
+ /* Guard against excessively long or deeply-nested queries */
+ CHECK_FOR_INTERRUPTS();
+ check_stack_depth();
+
+ /*
+ * Each level of get_rule_expr must emit an indivisible term
+ * (parenthesized if necessary) to ensure result is reparsed into the same
+ * expression tree. The only exception is that when the input is a List,
+ * we emit the component items comma-separated with no surrounding
+ * decoration; this is convenient for most callers.
+ */
+ switch (nodeTag(node))
+ {
+ case T_Var:
+ (void) get_variable((Var *) node, 0, false, context);
+ break;
+
+ case T_Const:
+ get_const_expr((Const *) node, context, 0);
+ break;
+
+ case T_Param:
+ get_parameter((Param *) node, context);
+ break;
+
+ case T_Aggref:
+ get_agg_expr((Aggref *) node, context, (Aggref *) node);
+ break;
+
+ case T_GroupingFunc:
+ {
+ GroupingFunc *gexpr = (GroupingFunc *) node;
+
+ appendStringInfoString(buf, "GROUPING(");
+ get_rule_expr((Node *) gexpr->args, context, true);
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_WindowFunc:
+ get_windowfunc_expr((WindowFunc *) node, context);
+ break;
+
+ case T_SubscriptingRef:
+ {
+ SubscriptingRef *sbsref = (SubscriptingRef *) node;
+ bool need_parens;
+
+ /*
+ * If the argument is a CaseTestExpr, we must be inside a
+ * FieldStore, ie, we are assigning to an element of an array
+ * within a composite column. Since we already punted on
+ * displaying the FieldStore's target information, just punt
+ * here too, and display only the assignment source
+ * expression.
+ */
+ if (IsA(sbsref->refexpr, CaseTestExpr))
+ {
+ Assert(sbsref->refassgnexpr);
+ get_rule_expr((Node *) sbsref->refassgnexpr,
+ context, showimplicit);
+ break;
+ }
+
+ /*
+ * Parenthesize the argument unless it's a simple Var or a
+ * FieldSelect. (In particular, if it's another
+ * SubscriptingRef, we *must* parenthesize to avoid
+ * confusion.)
+ */
+ need_parens = !IsA(sbsref->refexpr, Var) &&
+ !IsA(sbsref->refexpr, FieldSelect);
+ if (need_parens)
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) sbsref->refexpr, context, showimplicit);
+ if (need_parens)
+ appendStringInfoChar(buf, ')');
+
+ /*
+ * If there's a refassgnexpr, we want to print the node in the
+ * format "container[subscripts] := refassgnexpr". This is
+ * not legal SQL, so decompilation of INSERT or UPDATE
+ * statements should always use processIndirection as part of
+ * the statement-level syntax. We should only see this when
+ * EXPLAIN tries to print the targetlist of a plan resulting
+ * from such a statement.
+ */
+ if (sbsref->refassgnexpr)
+ {
+ Node *refassgnexpr;
+
+ /*
+ * Use processIndirection to print this node's subscripts
+ * as well as any additional field selections or
+ * subscripting in immediate descendants. It returns the
+ * RHS expr that is actually being "assigned".
+ */
+ refassgnexpr = processIndirection(node, context);
+ appendStringInfoString(buf, " := ");
+ get_rule_expr(refassgnexpr, context, showimplicit);
+ }
+ else
+ {
+ /* Just an ordinary container fetch, so print subscripts */
+ printSubscripts(sbsref, context);
+ }
+ }
+ break;
+
+ case T_FuncExpr:
+ get_func_expr((FuncExpr *) node, context, showimplicit);
+ break;
+
+ case T_NamedArgExpr:
+ {
+ NamedArgExpr *na = (NamedArgExpr *) node;
+
+ appendStringInfo(buf, "%s => ", quote_identifier(na->name));
+ get_rule_expr((Node *) na->arg, context, showimplicit);
+ }
+ break;
+
+ case T_OpExpr:
+ get_oper_expr((OpExpr *) node, context);
+ break;
+
+ case T_DistinctExpr:
+ {
+ DistinctExpr *expr = (DistinctExpr *) node;
+ List *args = expr->args;
+ Node *arg1 = (Node *) linitial(args);
+ Node *arg2 = (Node *) lsecond(args);
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(arg1, context, true, node);
+ appendStringInfoString(buf, " IS DISTINCT FROM ");
+ get_rule_expr_paren(arg2, context, true, node);
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_NullIfExpr:
+ {
+ NullIfExpr *nullifexpr = (NullIfExpr *) node;
+
+ appendStringInfoString(buf, "NULLIF(");
+ get_rule_expr((Node *) nullifexpr->args, context, true);
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_ScalarArrayOpExpr:
+ {
+ ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node;
+ List *args = expr->args;
+ Node *arg1 = (Node *) linitial(args);
+ Node *arg2 = (Node *) lsecond(args);
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(arg1, context, true, node);
+ appendStringInfo(buf, " %s %s (",
+ generate_operator_name(expr->opno,
+ exprType(arg1),
+ get_base_element_type(exprType(arg2))),
+ expr->useOr ? "ANY" : "ALL");
+ get_rule_expr_paren(arg2, context, true, node);
+
+ /*
+ * There's inherent ambiguity in "x op ANY/ALL (y)" when y is
+ * a bare sub-SELECT. Since we're here, the sub-SELECT must
+ * be meant as a scalar sub-SELECT yielding an array value to
+ * be used in ScalarArrayOpExpr; but the grammar will
+ * preferentially interpret such a construct as an ANY/ALL
+ * SubLink. To prevent misparsing the output that way, insert
+ * a dummy coercion (which will be stripped by parse analysis,
+ * so no inefficiency is added in dump and reload). This is
+ * indeed most likely what the user wrote to get the construct
+ * accepted in the first place.
+ */
+ if (IsA(arg2, SubLink) &&
+ ((SubLink *) arg2)->subLinkType == EXPR_SUBLINK)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(exprType(arg2),
+ exprTypmod(arg2)));
+ appendStringInfoChar(buf, ')');
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_BoolExpr:
+ {
+ BoolExpr *expr = (BoolExpr *) node;
+ Node *first_arg = linitial(expr->args);
+ ListCell *arg;
+
+ switch (expr->boolop)
+ {
+ case AND_EXPR:
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(first_arg, context,
+ false, node);
+ for_each_from(arg, expr->args, 1)
+ {
+ appendStringInfoString(buf, " AND ");
+ get_rule_expr_paren((Node *) lfirst(arg), context,
+ false, node);
+ }
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ break;
+
+ case OR_EXPR:
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(first_arg, context,
+ false, node);
+ for_each_from(arg, expr->args, 1)
+ {
+ appendStringInfoString(buf, " OR ");
+ get_rule_expr_paren((Node *) lfirst(arg), context,
+ false, node);
+ }
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ break;
+
+ case NOT_EXPR:
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ appendStringInfoString(buf, "NOT ");
+ get_rule_expr_paren(first_arg, context,
+ false, node);
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ break;
+
+ default:
+ elog(ERROR, "unrecognized boolop: %d",
+ (int) expr->boolop);
+ }
+ }
+ break;
+
+ case T_SubLink:
+ get_sublink_expr((SubLink *) node, context);
+ break;
+
+ case T_SubPlan:
+ {
+ SubPlan *subplan = (SubPlan *) node;
+
+ /*
+ * We cannot see an already-planned subplan in rule deparsing,
+ * only while EXPLAINing a query plan. We don't try to
+ * reconstruct the original SQL, just reference the subplan
+ * that appears elsewhere in EXPLAIN's result.
+ */
+ if (subplan->useHashTable)
+ appendStringInfo(buf, "(hashed %s)", subplan->plan_name);
+ else
+ appendStringInfo(buf, "(%s)", subplan->plan_name);
+ }
+ break;
+
+ case T_AlternativeSubPlan:
+ {
+ AlternativeSubPlan *asplan = (AlternativeSubPlan *) node;
+ ListCell *lc;
+
+ /*
+ * This case cannot be reached in normal usage, since no
+ * AlternativeSubPlan can appear either in parsetrees or
+ * finished plan trees. We keep it just in case somebody
+ * wants to use this code to print planner data structures.
+ */
+ appendStringInfoString(buf, "(alternatives: ");
+ foreach(lc, asplan->subplans)
+ {
+ SubPlan *splan = lfirst_node(SubPlan, lc);
+
+ if (splan->useHashTable)
+ appendStringInfo(buf, "hashed %s", splan->plan_name);
+ else
+ appendStringInfoString(buf, splan->plan_name);
+ if (lnext(asplan->subplans, lc))
+ appendStringInfoString(buf, " or ");
+ }
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_FieldSelect:
+ {
+ FieldSelect *fselect = (FieldSelect *) node;
+ Node *arg = (Node *) fselect->arg;
+ int fno = fselect->fieldnum;
+ const char *fieldname;
+ bool need_parens;
+
+ /*
+ * Parenthesize the argument unless it's an SubscriptingRef or
+ * another FieldSelect. Note in particular that it would be
+ * WRONG to not parenthesize a Var argument; simplicity is not
+ * the issue here, having the right number of names is.
+ */
+ need_parens = !IsA(arg, SubscriptingRef) &&
+ !IsA(arg, FieldSelect);
+ if (need_parens)
+ appendStringInfoChar(buf, '(');
+ get_rule_expr(arg, context, true);
+ if (need_parens)
+ appendStringInfoChar(buf, ')');
+
+ /*
+ * Get and print the field name.
+ */
+ fieldname = get_name_for_var_field((Var *) arg, fno,
+ 0, context);
+ appendStringInfo(buf, ".%s", quote_identifier(fieldname));
+ }
+ break;
+
+ case T_FieldStore:
+ {
+ FieldStore *fstore = (FieldStore *) node;
+ bool need_parens;
+
+ /*
+ * There is no good way to represent a FieldStore as real SQL,
+ * so decompilation of INSERT or UPDATE statements should
+ * always use processIndirection as part of the
+ * statement-level syntax. We should only get here when
+ * EXPLAIN tries to print the targetlist of a plan resulting
+ * from such a statement. The plan case is even harder than
+ * ordinary rules would be, because the planner tries to
+ * collapse multiple assignments to the same field or subfield
+ * into one FieldStore; so we can see a list of target fields
+ * not just one, and the arguments could be FieldStores
+ * themselves. We don't bother to try to print the target
+ * field names; we just print the source arguments, with a
+ * ROW() around them if there's more than one. This isn't
+ * terribly complete, but it's probably good enough for
+ * EXPLAIN's purposes; especially since anything more would be
+ * either hopelessly confusing or an even poorer
+ * representation of what the plan is actually doing.
+ */
+ need_parens = (list_length(fstore->newvals) != 1);
+ if (need_parens)
+ appendStringInfoString(buf, "ROW(");
+ get_rule_expr((Node *) fstore->newvals, context, showimplicit);
+ if (need_parens)
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_RelabelType:
+ {
+ RelabelType *relabel = (RelabelType *) node;
+ Node *arg = (Node *) relabel->arg;
+
+ if (relabel->relabelformat == COERCE_IMPLICIT_CAST &&
+ !showimplicit)
+ {
+ /* don't show the implicit cast */
+ get_rule_expr_paren(arg, context, false, node);
+ }
+ else
+ {
+ get_coercion_expr(arg, context,
+ relabel->resulttype,
+ relabel->resulttypmod,
+ node);
+ }
+ }
+ break;
+
+ case T_CoerceViaIO:
+ {
+ CoerceViaIO *iocoerce = (CoerceViaIO *) node;
+ Node *arg = (Node *) iocoerce->arg;
+
+ if (iocoerce->coerceformat == COERCE_IMPLICIT_CAST &&
+ !showimplicit)
+ {
+ /* don't show the implicit cast */
+ get_rule_expr_paren(arg, context, false, node);
+ }
+ else
+ {
+ get_coercion_expr(arg, context,
+ iocoerce->resulttype,
+ -1,
+ node);
+ }
+ }
+ break;
+
+ case T_ArrayCoerceExpr:
+ {
+ ArrayCoerceExpr *acoerce = (ArrayCoerceExpr *) node;
+ Node *arg = (Node *) acoerce->arg;
+
+ if (acoerce->coerceformat == COERCE_IMPLICIT_CAST &&
+ !showimplicit)
+ {
+ /* don't show the implicit cast */
+ get_rule_expr_paren(arg, context, false, node);
+ }
+ else
+ {
+ get_coercion_expr(arg, context,
+ acoerce->resulttype,
+ acoerce->resulttypmod,
+ node);
+ }
+ }
+ break;
+
+ case T_ConvertRowtypeExpr:
+ {
+ ConvertRowtypeExpr *convert = (ConvertRowtypeExpr *) node;
+ Node *arg = (Node *) convert->arg;
+
+ if (convert->convertformat == COERCE_IMPLICIT_CAST &&
+ !showimplicit)
+ {
+ /* don't show the implicit cast */
+ get_rule_expr_paren(arg, context, false, node);
+ }
+ else
+ {
+ get_coercion_expr(arg, context,
+ convert->resulttype, -1,
+ node);
+ }
+ }
+ break;
+
+ case T_CollateExpr:
+ {
+ CollateExpr *collate = (CollateExpr *) node;
+ Node *arg = (Node *) collate->arg;
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(arg, context, showimplicit, node);
+ appendStringInfo(buf, " COLLATE %s",
+ generate_collation_name(collate->collOid));
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_CaseExpr:
+ {
+ CaseExpr *caseexpr = (CaseExpr *) node;
+ ListCell *temp;
+
+ appendContextKeyword(context, "CASE",
+ 0, PRETTYINDENT_VAR, 0);
+ if (caseexpr->arg)
+ {
+ appendStringInfoChar(buf, ' ');
+ get_rule_expr((Node *) caseexpr->arg, context, true);
+ }
+ foreach(temp, caseexpr->args)
+ {
+ CaseWhen *when = (CaseWhen *) lfirst(temp);
+ Node *w = (Node *) when->expr;
+
+ if (caseexpr->arg)
+ {
+ /*
+ * The parser should have produced WHEN clauses of the
+ * form "CaseTestExpr = RHS", possibly with an
+ * implicit coercion inserted above the CaseTestExpr.
+ * For accurate decompilation of rules it's essential
+ * that we show just the RHS. However in an
+ * expression that's been through the optimizer, the
+ * WHEN clause could be almost anything (since the
+ * equality operator could have been expanded into an
+ * inline function). If we don't recognize the form
+ * of the WHEN clause, just punt and display it as-is.
+ */
+ if (IsA(w, OpExpr))
+ {
+ List *args = ((OpExpr *) w)->args;
+
+ if (list_length(args) == 2 &&
+ IsA(strip_implicit_coercions(linitial(args)),
+ CaseTestExpr))
+ w = (Node *) lsecond(args);
+ }
+ }
+
+ if (!PRETTY_INDENT(context))
+ appendStringInfoChar(buf, ' ');
+ appendContextKeyword(context, "WHEN ",
+ 0, 0, 0);
+ get_rule_expr(w, context, false);
+ appendStringInfoString(buf, " THEN ");
+ get_rule_expr((Node *) when->result, context, true);
+ }
+ if (!PRETTY_INDENT(context))
+ appendStringInfoChar(buf, ' ');
+ appendContextKeyword(context, "ELSE ",
+ 0, 0, 0);
+ get_rule_expr((Node *) caseexpr->defresult, context, true);
+ if (!PRETTY_INDENT(context))
+ appendStringInfoChar(buf, ' ');
+ appendContextKeyword(context, "END",
+ -PRETTYINDENT_VAR, 0, 0);
+ }
+ break;
+
+ case T_CaseTestExpr:
+ {
+ /*
+ * Normally we should never get here, since for expressions
+ * that can contain this node type we attempt to avoid
+ * recursing to it. But in an optimized expression we might
+ * be unable to avoid that (see comments for CaseExpr). If we
+ * do see one, print it as CASE_TEST_EXPR.
+ */
+ appendStringInfoString(buf, "CASE_TEST_EXPR");
+ }
+ break;
+
+ case T_ArrayExpr:
+ {
+ ArrayExpr *arrayexpr = (ArrayExpr *) node;
+
+ appendStringInfoString(buf, "ARRAY[");
+ get_rule_expr((Node *) arrayexpr->elements, context, true);
+ appendStringInfoChar(buf, ']');
+
+ /*
+ * If the array isn't empty, we assume its elements are
+ * coerced to the desired type. If it's empty, though, we
+ * need an explicit coercion to the array type.
+ */
+ if (arrayexpr->elements == NIL)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(arrayexpr->array_typeid, -1));
+ }
+ break;
+
+ case T_RowExpr:
+ {
+ RowExpr *rowexpr = (RowExpr *) node;
+ TupleDesc tupdesc = NULL;
+ ListCell *arg;
+ int i;
+ char *sep;
+
+ /*
+ * If it's a named type and not RECORD, we may have to skip
+ * dropped columns and/or claim there are NULLs for added
+ * columns.
+ */
+ if (rowexpr->row_typeid != RECORDOID)
+ {
+ tupdesc = lookup_rowtype_tupdesc(rowexpr->row_typeid, -1);
+ Assert(list_length(rowexpr->args) <= tupdesc->natts);
+ }
+
+ /*
+ * SQL99 allows "ROW" to be omitted when there is more than
+ * one column, but for simplicity we always print it.
+ */
+ appendStringInfoString(buf, "ROW(");
+ sep = "";
+ i = 0;
+ foreach(arg, rowexpr->args)
+ {
+ Node *e = (Node *) lfirst(arg);
+
+ if (tupdesc == NULL ||
+ !TupleDescAttr(tupdesc, i)->attisdropped)
+ {
+ appendStringInfoString(buf, sep);
+ /* Whole-row Vars need special treatment here */
+ get_rule_expr_toplevel(e, context, true);
+ sep = ", ";
+ }
+ i++;
+ }
+ if (tupdesc != NULL)
+ {
+ while (i < tupdesc->natts)
+ {
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
+ {
+ appendStringInfoString(buf, sep);
+ appendStringInfoString(buf, "NULL");
+ sep = ", ";
+ }
+ i++;
+ }
+
+ ReleaseTupleDesc(tupdesc);
+ }
+ appendStringInfoChar(buf, ')');
+ if (rowexpr->row_format == COERCE_EXPLICIT_CAST)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(rowexpr->row_typeid, -1));
+ }
+ break;
+
+ case T_RowCompareExpr:
+ {
+ RowCompareExpr *rcexpr = (RowCompareExpr *) node;
+
+ /*
+ * SQL99 allows "ROW" to be omitted when there is more than
+ * one column, but for simplicity we always print it. Within
+ * a ROW expression, whole-row Vars need special treatment, so
+ * use get_rule_list_toplevel.
+ */
+ appendStringInfoString(buf, "(ROW(");
+ get_rule_list_toplevel(rcexpr->largs, context, true);
+
+ /*
+ * We assume that the name of the first-column operator will
+ * do for all the rest too. This is definitely open to
+ * failure, eg if some but not all operators were renamed
+ * since the construct was parsed, but there seems no way to
+ * be perfect.
+ */
+ appendStringInfo(buf, ") %s ROW(",
+ generate_operator_name(linitial_oid(rcexpr->opnos),
+ exprType(linitial(rcexpr->largs)),
+ exprType(linitial(rcexpr->rargs))));
+ get_rule_list_toplevel(rcexpr->rargs, context, true);
+ appendStringInfoString(buf, "))");
+ }
+ break;
+
+ case T_CoalesceExpr:
+ {
+ CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
+
+ appendStringInfoString(buf, "COALESCE(");
+ get_rule_expr((Node *) coalesceexpr->args, context, true);
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_MinMaxExpr:
+ {
+ MinMaxExpr *minmaxexpr = (MinMaxExpr *) node;
+
+ switch (minmaxexpr->op)
+ {
+ case IS_GREATEST:
+ appendStringInfoString(buf, "GREATEST(");
+ break;
+ case IS_LEAST:
+ appendStringInfoString(buf, "LEAST(");
+ break;
+ }
+ get_rule_expr((Node *) minmaxexpr->args, context, true);
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_SQLValueFunction:
+ {
+ SQLValueFunction *svf = (SQLValueFunction *) node;
+
+ /*
+ * Note: this code knows that typmod for time, timestamp, and
+ * timestamptz just prints as integer.
+ */
+ switch (svf->op)
+ {
+ case SVFOP_CURRENT_DATE:
+ appendStringInfoString(buf, "CURRENT_DATE");
+ break;
+ case SVFOP_CURRENT_TIME:
+ appendStringInfoString(buf, "CURRENT_TIME");
+ break;
+ case SVFOP_CURRENT_TIME_N:
+ appendStringInfo(buf, "CURRENT_TIME(%d)", svf->typmod);
+ break;
+ case SVFOP_CURRENT_TIMESTAMP:
+ appendStringInfoString(buf, "CURRENT_TIMESTAMP");
+ break;
+ case SVFOP_CURRENT_TIMESTAMP_N:
+ appendStringInfo(buf, "CURRENT_TIMESTAMP(%d)",
+ svf->typmod);
+ break;
+ case SVFOP_LOCALTIME:
+ appendStringInfoString(buf, "LOCALTIME");
+ break;
+ case SVFOP_LOCALTIME_N:
+ appendStringInfo(buf, "LOCALTIME(%d)", svf->typmod);
+ break;
+ case SVFOP_LOCALTIMESTAMP:
+ appendStringInfoString(buf, "LOCALTIMESTAMP");
+ break;
+ case SVFOP_LOCALTIMESTAMP_N:
+ appendStringInfo(buf, "LOCALTIMESTAMP(%d)",
+ svf->typmod);
+ break;
+ case SVFOP_CURRENT_ROLE:
+ appendStringInfoString(buf, "CURRENT_ROLE");
+ break;
+ case SVFOP_CURRENT_USER:
+ appendStringInfoString(buf, "CURRENT_USER");
+ break;
+ case SVFOP_USER:
+ appendStringInfoString(buf, "USER");
+ break;
+ case SVFOP_SESSION_USER:
+ appendStringInfoString(buf, "SESSION_USER");
+ break;
+ case SVFOP_CURRENT_CATALOG:
+ appendStringInfoString(buf, "CURRENT_CATALOG");
+ break;
+ case SVFOP_CURRENT_SCHEMA:
+ appendStringInfoString(buf, "CURRENT_SCHEMA");
+ break;
+ }
+ }
+ break;
+
+ case T_XmlExpr:
+ {
+ XmlExpr *xexpr = (XmlExpr *) node;
+ bool needcomma = false;
+ ListCell *arg;
+ ListCell *narg;
+ Const *con;
+
+ switch (xexpr->op)
+ {
+ case IS_XMLCONCAT:
+ appendStringInfoString(buf, "XMLCONCAT(");
+ break;
+ case IS_XMLELEMENT:
+ appendStringInfoString(buf, "XMLELEMENT(");
+ break;
+ case IS_XMLFOREST:
+ appendStringInfoString(buf, "XMLFOREST(");
+ break;
+ case IS_XMLPARSE:
+ appendStringInfoString(buf, "XMLPARSE(");
+ break;
+ case IS_XMLPI:
+ appendStringInfoString(buf, "XMLPI(");
+ break;
+ case IS_XMLROOT:
+ appendStringInfoString(buf, "XMLROOT(");
+ break;
+ case IS_XMLSERIALIZE:
+ appendStringInfoString(buf, "XMLSERIALIZE(");
+ break;
+ case IS_DOCUMENT:
+ break;
+ }
+ if (xexpr->op == IS_XMLPARSE || xexpr->op == IS_XMLSERIALIZE)
+ {
+ if (xexpr->xmloption == XMLOPTION_DOCUMENT)
+ appendStringInfoString(buf, "DOCUMENT ");
+ else
+ appendStringInfoString(buf, "CONTENT ");
+ }
+ if (xexpr->name)
+ {
+ appendStringInfo(buf, "NAME %s",
+ quote_identifier(map_xml_name_to_sql_identifier(xexpr->name)));
+ needcomma = true;
+ }
+ if (xexpr->named_args)
+ {
+ if (xexpr->op != IS_XMLFOREST)
+ {
+ if (needcomma)
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf, "XMLATTRIBUTES(");
+ needcomma = false;
+ }
+ forboth(arg, xexpr->named_args, narg, xexpr->arg_names)
+ {
+ Node *e = (Node *) lfirst(arg);
+ char *argname = strVal(lfirst(narg));
+
+ if (needcomma)
+ appendStringInfoString(buf, ", ");
+ get_rule_expr((Node *) e, context, true);
+ appendStringInfo(buf, " AS %s",
+ quote_identifier(map_xml_name_to_sql_identifier(argname)));
+ needcomma = true;
+ }
+ if (xexpr->op != IS_XMLFOREST)
+ appendStringInfoChar(buf, ')');
+ }
+ if (xexpr->args)
+ {
+ if (needcomma)
+ appendStringInfoString(buf, ", ");
+ switch (xexpr->op)
+ {
+ case IS_XMLCONCAT:
+ case IS_XMLELEMENT:
+ case IS_XMLFOREST:
+ case IS_XMLPI:
+ case IS_XMLSERIALIZE:
+ /* no extra decoration needed */
+ get_rule_expr((Node *) xexpr->args, context, true);
+ break;
+ case IS_XMLPARSE:
+ Assert(list_length(xexpr->args) == 2);
+
+ get_rule_expr((Node *) linitial(xexpr->args),
+ context, true);
+
+ con = lsecond_node(Const, xexpr->args);
+ Assert(!con->constisnull);
+ if (DatumGetBool(con->constvalue))
+ appendStringInfoString(buf,
+ " PRESERVE WHITESPACE");
+ else
+ appendStringInfoString(buf,
+ " STRIP WHITESPACE");
+ break;
+ case IS_XMLROOT:
+ Assert(list_length(xexpr->args) == 3);
+
+ get_rule_expr((Node *) linitial(xexpr->args),
+ context, true);
+
+ appendStringInfoString(buf, ", VERSION ");
+ con = (Const *) lsecond(xexpr->args);
+ if (IsA(con, Const) &&
+ con->constisnull)
+ appendStringInfoString(buf, "NO VALUE");
+ else
+ get_rule_expr((Node *) con, context, false);
+
+ con = lthird_node(Const, xexpr->args);
+ if (con->constisnull)
+ /* suppress STANDALONE NO VALUE */ ;
+ else
+ {
+ switch (DatumGetInt32(con->constvalue))
+ {
+ case XML_STANDALONE_YES:
+ appendStringInfoString(buf,
+ ", STANDALONE YES");
+ break;
+ case XML_STANDALONE_NO:
+ appendStringInfoString(buf,
+ ", STANDALONE NO");
+ break;
+ case XML_STANDALONE_NO_VALUE:
+ appendStringInfoString(buf,
+ ", STANDALONE NO VALUE");
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case IS_DOCUMENT:
+ get_rule_expr_paren((Node *) xexpr->args, context, false, node);
+ break;
+ }
+ }
+ if (xexpr->op == IS_XMLSERIALIZE)
+ appendStringInfo(buf, " AS %s",
+ format_type_with_typemod(xexpr->type,
+ xexpr->typmod));
+ if (xexpr->op == IS_DOCUMENT)
+ appendStringInfoString(buf, " IS DOCUMENT");
+ else
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_NullTest:
+ {
+ NullTest *ntest = (NullTest *) node;
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren((Node *) ntest->arg, context, true, node);
+
+ /*
+ * For scalar inputs, we prefer to print as IS [NOT] NULL,
+ * which is shorter and traditional. If it's a rowtype input
+ * but we're applying a scalar test, must print IS [NOT]
+ * DISTINCT FROM NULL to be semantically correct.
+ */
+ if (ntest->argisrow ||
+ !type_is_rowtype(exprType((Node *) ntest->arg)))
+ {
+ switch (ntest->nulltesttype)
+ {
+ case IS_NULL:
+ appendStringInfoString(buf, " IS NULL");
+ break;
+ case IS_NOT_NULL:
+ appendStringInfoString(buf, " IS NOT NULL");
+ break;
+ default:
+ elog(ERROR, "unrecognized nulltesttype: %d",
+ (int) ntest->nulltesttype);
+ }
+ }
+ else
+ {
+ switch (ntest->nulltesttype)
+ {
+ case IS_NULL:
+ appendStringInfoString(buf, " IS NOT DISTINCT FROM NULL");
+ break;
+ case IS_NOT_NULL:
+ appendStringInfoString(buf, " IS DISTINCT FROM NULL");
+ break;
+ default:
+ elog(ERROR, "unrecognized nulltesttype: %d",
+ (int) ntest->nulltesttype);
+ }
+ }
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_BooleanTest:
+ {
+ BooleanTest *btest = (BooleanTest *) node;
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren((Node *) btest->arg, context, false, node);
+ switch (btest->booltesttype)
+ {
+ case IS_TRUE:
+ appendStringInfoString(buf, " IS TRUE");
+ break;
+ case IS_NOT_TRUE:
+ appendStringInfoString(buf, " IS NOT TRUE");
+ break;
+ case IS_FALSE:
+ appendStringInfoString(buf, " IS FALSE");
+ break;
+ case IS_NOT_FALSE:
+ appendStringInfoString(buf, " IS NOT FALSE");
+ break;
+ case IS_UNKNOWN:
+ appendStringInfoString(buf, " IS UNKNOWN");
+ break;
+ case IS_NOT_UNKNOWN:
+ appendStringInfoString(buf, " IS NOT UNKNOWN");
+ break;
+ default:
+ elog(ERROR, "unrecognized booltesttype: %d",
+ (int) btest->booltesttype);
+ }
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_CoerceToDomain:
+ {
+ CoerceToDomain *ctest = (CoerceToDomain *) node;
+ Node *arg = (Node *) ctest->arg;
+
+ if (ctest->coercionformat == COERCE_IMPLICIT_CAST &&
+ !showimplicit)
+ {
+ /* don't show the implicit cast */
+ get_rule_expr(arg, context, false);
+ }
+ else
+ {
+ get_coercion_expr(arg, context,
+ ctest->resulttype,
+ ctest->resulttypmod,
+ node);
+ }
+ }
+ break;
+
+ case T_CoerceToDomainValue:
+ appendStringInfoString(buf, "VALUE");
+ break;
+
+ case T_SetToDefault:
+ appendStringInfoString(buf, "DEFAULT");
+ break;
+
+ case T_CurrentOfExpr:
+ {
+ CurrentOfExpr *cexpr = (CurrentOfExpr *) node;
+
+ if (cexpr->cursor_name)
+ appendStringInfo(buf, "CURRENT OF %s",
+ quote_identifier(cexpr->cursor_name));
+ else
+ appendStringInfo(buf, "CURRENT OF $%d",
+ cexpr->cursor_param);
+ }
+ break;
+
+ case T_NextValueExpr:
+ {
+ NextValueExpr *nvexpr = (NextValueExpr *) node;
+
+ /*
+ * This isn't exactly nextval(), but that seems close enough
+ * for EXPLAIN's purposes.
+ */
+ appendStringInfoString(buf, "nextval(");
+ simple_quote_literal(buf,
+ generate_relation_name(nvexpr->seqid,
+ NIL));
+ appendStringInfoChar(buf, ')');
+ }
+ break;
+
+ case T_InferenceElem:
+ {
+ InferenceElem *iexpr = (InferenceElem *) node;
+ bool save_varprefix;
+ bool need_parens;
+
+ /*
+ * InferenceElem can only refer to target relation, so a
+ * prefix is not useful, and indeed would cause parse errors.
+ */
+ save_varprefix = context->varprefix;
+ context->varprefix = false;
+
+ /*
+ * Parenthesize the element unless it's a simple Var or a bare
+ * function call. Follows pg_get_indexdef_worker().
+ */
+ need_parens = !IsA(iexpr->expr, Var);
+ if (IsA(iexpr->expr, FuncExpr) &&
+ ((FuncExpr *) iexpr->expr)->funcformat ==
+ COERCE_EXPLICIT_CALL)
+ need_parens = false;
+
+ if (need_parens)
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) iexpr->expr,
+ context, false);
+ if (need_parens)
+ appendStringInfoChar(buf, ')');
+
+ context->varprefix = save_varprefix;
+
+ if (iexpr->infercollid)
+ appendStringInfo(buf, " COLLATE %s",
+ generate_collation_name(iexpr->infercollid));
+
+ /* Add the operator class name, if not default */
+ if (iexpr->inferopclass)
+ {
+ Oid inferopclass = iexpr->inferopclass;
+ Oid inferopcinputtype = get_opclass_input_type(iexpr->inferopclass);
+
+ get_opclass_name(inferopclass, inferopcinputtype, buf);
+ }
+ }
+ break;
+
+ case T_PartitionBoundSpec:
+ {
+ PartitionBoundSpec *spec = (PartitionBoundSpec *) node;
+ ListCell *cell;
+ char *sep;
+
+ if (spec->is_default)
+ {
+ appendStringInfoString(buf, "DEFAULT");
+ break;
+ }
+
+ switch (spec->strategy)
+ {
+ case PARTITION_STRATEGY_HASH:
+ Assert(spec->modulus > 0 && spec->remainder >= 0);
+ Assert(spec->modulus > spec->remainder);
+
+ appendStringInfoString(buf, "FOR VALUES");
+ appendStringInfo(buf, " WITH (modulus %d, remainder %d)",
+ spec->modulus, spec->remainder);
+ break;
+
+ case PARTITION_STRATEGY_LIST:
+ Assert(spec->listdatums != NIL);
+
+ appendStringInfoString(buf, "FOR VALUES IN (");
+ sep = "";
+ foreach(cell, spec->listdatums)
+ {
+ Const *val = lfirst_node(Const, cell);
+
+ appendStringInfoString(buf, sep);
+ get_const_expr(val, context, -1);
+ sep = ", ";
+ }
+
+ appendStringInfoChar(buf, ')');
+ break;
+
+ case PARTITION_STRATEGY_RANGE:
+ Assert(spec->lowerdatums != NIL &&
+ spec->upperdatums != NIL &&
+ list_length(spec->lowerdatums) ==
+ list_length(spec->upperdatums));
+
+ appendStringInfo(buf, "FOR VALUES FROM %s TO %s",
+ get_range_partbound_string(spec->lowerdatums),
+ get_range_partbound_string(spec->upperdatums));
+ break;
+
+ default:
+ elog(ERROR, "unrecognized partition strategy: %d",
+ (int) spec->strategy);
+ break;
+ }
+ }
+ break;
+
+ case T_List:
+ {
+ char *sep;
+ ListCell *l;
+
+ sep = "";
+ foreach(l, (List *) node)
+ {
+ appendStringInfoString(buf, sep);
+ get_rule_expr((Node *) lfirst(l), context, showimplicit);
+ sep = ", ";
+ }
+ }
+ break;
+
+ case T_TableFunc:
+ get_tablefunc((TableFunc *) node, context, showimplicit);
+ break;
+
+ default:
+ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
+ break;
+ }
+}
+
+/*
+ * get_rule_expr_toplevel - Parse back a toplevel expression
+ *
+ * Same as get_rule_expr(), except that if the expr is just a Var, we pass
+ * istoplevel = true not false to get_variable(). This causes whole-row Vars
+ * to get printed with decoration that will prevent expansion of "*".
+ * We need to use this in contexts such as ROW() and VALUES(), where the
+ * parser would expand "foo.*" appearing at top level. (In principle we'd
+ * use this in get_target_list() too, but that has additional worries about
+ * whether to print AS, so it needs to invoke get_variable() directly anyway.)
+ */
+static void
+get_rule_expr_toplevel(Node *node, deparse_context *context,
+ bool showimplicit)
+{
+ if (node && IsA(node, Var))
+ (void) get_variable((Var *) node, 0, true, context);
+ else
+ get_rule_expr(node, context, showimplicit);
+}
+
+/*
+ * get_rule_list_toplevel - Parse back a list of toplevel expressions
+ *
+ * Apply get_rule_expr_toplevel() to each element of a List.
+ *
+ * This adds commas between the expressions, but caller is responsible
+ * for printing surrounding decoration.
+ */
+static void
+get_rule_list_toplevel(List *lst, deparse_context *context,
+ bool showimplicit)
+{
+ const char *sep;
+ ListCell *lc;
+
+ sep = "";
+ foreach(lc, lst)
+ {
+ Node *e = (Node *) lfirst(lc);
+
+ appendStringInfoString(context->buf, sep);
+ get_rule_expr_toplevel(e, context, showimplicit);
+ sep = ", ";
+ }
+}
+
+/*
+ * get_rule_expr_funccall - Parse back a function-call expression
+ *
+ * Same as get_rule_expr(), except that we guarantee that the output will
+ * look like a function call, or like one of the things the grammar treats as
+ * equivalent to a function call (see the func_expr_windowless production).
+ * This is needed in places where the grammar uses func_expr_windowless and
+ * you can't substitute a parenthesized a_expr. If what we have isn't going
+ * to look like a function call, wrap it in a dummy CAST() expression, which
+ * will satisfy the grammar --- and, indeed, is likely what the user wrote to
+ * produce such a thing.
+ */
+static void
+get_rule_expr_funccall(Node *node, deparse_context *context,
+ bool showimplicit)
+{
+ if (looks_like_function(node))
+ get_rule_expr(node, context, showimplicit);
+ else
+ {
+ StringInfo buf = context->buf;
+
+ appendStringInfoString(buf, "CAST(");
+ /* no point in showing any top-level implicit cast */
+ get_rule_expr(node, context, false);
+ appendStringInfo(buf, " AS %s)",
+ format_type_with_typemod(exprType(node),
+ exprTypmod(node)));
+ }
+}
+
+/*
+ * Helper function to identify node types that satisfy func_expr_windowless.
+ * If in doubt, "false" is always a safe answer.
+ */
+static bool
+looks_like_function(Node *node)
+{
+ if (node == NULL)
+ return false; /* probably shouldn't happen */
+ switch (nodeTag(node))
+ {
+ case T_FuncExpr:
+ /* OK, unless it's going to deparse as a cast */
+ return (((FuncExpr *) node)->funcformat == COERCE_EXPLICIT_CALL ||
+ ((FuncExpr *) node)->funcformat == COERCE_SQL_SYNTAX);
+ case T_NullIfExpr:
+ case T_CoalesceExpr:
+ case T_MinMaxExpr:
+ case T_SQLValueFunction:
+ case T_XmlExpr:
+ /* these are all accepted by func_expr_common_subexpr */
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+
+/*
+ * get_oper_expr - Parse back an OpExpr node
+ */
+static void
+get_oper_expr(OpExpr *expr, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ Oid opno = expr->opno;
+ List *args = expr->args;
+
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ if (list_length(args) == 2)
+ {
+ /* binary operator */
+ Node *arg1 = (Node *) linitial(args);
+ Node *arg2 = (Node *) lsecond(args);
+
+ get_rule_expr_paren(arg1, context, true, (Node *) expr);
+ appendStringInfo(buf, " %s ",
+ generate_operator_name(opno,
+ exprType(arg1),
+ exprType(arg2)));
+ get_rule_expr_paren(arg2, context, true, (Node *) expr);
+ }
+ else
+ {
+ /* prefix operator */
+ Node *arg = (Node *) linitial(args);
+
+ appendStringInfo(buf, "%s ",
+ generate_operator_name(opno,
+ InvalidOid,
+ exprType(arg)));
+ get_rule_expr_paren(arg, context, true, (Node *) expr);
+ }
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * get_func_expr - Parse back a FuncExpr node
+ */
+static void
+get_func_expr(FuncExpr *expr, deparse_context *context,
+ bool showimplicit)
+{
+ StringInfo buf = context->buf;
+ Oid funcoid = expr->funcid;
+ Oid argtypes[FUNC_MAX_ARGS];
+ int nargs;
+ List *argnames;
+ bool use_variadic;
+ ListCell *l;
+
+ /*
+ * If the function call came from an implicit coercion, then just show the
+ * first argument --- unless caller wants to see implicit coercions.
+ */
+ if (expr->funcformat == COERCE_IMPLICIT_CAST && !showimplicit)
+ {
+ get_rule_expr_paren((Node *) linitial(expr->args), context,
+ false, (Node *) expr);
+ return;
+ }
+
+ /*
+ * If the function call came from a cast, then show the first argument
+ * plus an explicit cast operation.
+ */
+ if (expr->funcformat == COERCE_EXPLICIT_CAST ||
+ expr->funcformat == COERCE_IMPLICIT_CAST)
+ {
+ Node *arg = linitial(expr->args);
+ Oid rettype = expr->funcresulttype;
+ int32 coercedTypmod;
+
+ /* Get the typmod if this is a length-coercion function */
+ (void) exprIsLengthCoercion((Node *) expr, &coercedTypmod);
+
+ get_coercion_expr(arg, context,
+ rettype, coercedTypmod,
+ (Node *) expr);
+
+ return;
+ }
+
+ /*
+ * If the function was called using one of the SQL spec's random special
+ * syntaxes, try to reproduce that. If we don't recognize the function,
+ * fall through.
+ */
+ if (expr->funcformat == COERCE_SQL_SYNTAX)
+ {
+ if (get_func_sql_syntax(expr, context))
+ return;
+ }
+
+ /*
+ * Normal function: display as proname(args). First we need to extract
+ * the argument datatypes.
+ */
+ if (list_length(expr->args) > FUNC_MAX_ARGS)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_ARGUMENTS),
+ errmsg("too many arguments")));
+ nargs = 0;
+ argnames = NIL;
+ foreach(l, expr->args)
+ {
+ Node *arg = (Node *) lfirst(l);
+
+ if (IsA(arg, NamedArgExpr))
+ argnames = lappend(argnames, ((NamedArgExpr *) arg)->name);
+ argtypes[nargs] = exprType(arg);
+ nargs++;
+ }
+
+ appendStringInfo(buf, "%s(",
+ generate_function_name(funcoid, nargs,
+ argnames, argtypes,
+ expr->funcvariadic,
+ &use_variadic,
+ context->special_exprkind));
+ nargs = 0;
+ foreach(l, expr->args)
+ {
+ if (nargs++ > 0)
+ appendStringInfoString(buf, ", ");
+ if (use_variadic && lnext(expr->args, l) == NULL)
+ appendStringInfoString(buf, "VARIADIC ");
+ get_rule_expr((Node *) lfirst(l), context, true);
+ }
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * get_agg_expr - Parse back an Aggref node
+ */
+static void
+get_agg_expr(Aggref *aggref, deparse_context *context,
+ Aggref *original_aggref)
+{
+ StringInfo buf = context->buf;
+ Oid argtypes[FUNC_MAX_ARGS];
+ int nargs;
+ bool use_variadic;
+
+ /*
+ * For a combining aggregate, we look up and deparse the corresponding
+ * partial aggregate instead. This is necessary because our input
+ * argument list has been replaced; the new argument list always has just
+ * one element, which will point to a partial Aggref that supplies us with
+ * transition states to combine.
+ */
+ if (DO_AGGSPLIT_COMBINE(aggref->aggsplit))
+ {
+ TargetEntry *tle;
+
+ Assert(list_length(aggref->args) == 1);
+ tle = linitial_node(TargetEntry, aggref->args);
+ resolve_special_varno((Node *) tle->expr, context,
+ get_agg_combine_expr, original_aggref);
+ return;
+ }
+
+ /*
+ * Mark as PARTIAL, if appropriate. We look to the original aggref so as
+ * to avoid printing this when recursing from the code just above.
+ */
+ if (DO_AGGSPLIT_SKIPFINAL(original_aggref->aggsplit))
+ appendStringInfoString(buf, "PARTIAL ");
+
+ /* Extract the argument types as seen by the parser */
+ nargs = get_aggregate_argtypes(aggref, argtypes);
+
+ /* Print the aggregate name, schema-qualified if needed */
+ appendStringInfo(buf, "%s(%s",
+ generate_function_name(aggref->aggfnoid, nargs,
+ NIL, argtypes,
+ aggref->aggvariadic,
+ &use_variadic,
+ context->special_exprkind),
+ (aggref->aggdistinct != NIL) ? "DISTINCT " : "");
+
+ if (AGGKIND_IS_ORDERED_SET(aggref->aggkind))
+ {
+ /*
+ * Ordered-set aggregates do not use "*" syntax. Also, we needn't
+ * worry about inserting VARIADIC. So we can just dump the direct
+ * args as-is.
+ */
+ Assert(!aggref->aggvariadic);
+ get_rule_expr((Node *) aggref->aggdirectargs, context, true);
+ Assert(aggref->aggorder != NIL);
+ appendStringInfoString(buf, ") WITHIN GROUP (ORDER BY ");
+ get_rule_orderby(aggref->aggorder, aggref->args, false, context);
+ }
+ else
+ {
+ /* aggstar can be set only in zero-argument aggregates */
+ if (aggref->aggstar)
+ appendStringInfoChar(buf, '*');
+ else
+ {
+ ListCell *l;
+ int i;
+
+ i = 0;
+ foreach(l, aggref->args)
+ {
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
+ Node *arg = (Node *) tle->expr;
+
+ Assert(!IsA(arg, NamedArgExpr));
+ if (tle->resjunk)
+ continue;
+ if (i++ > 0)
+ appendStringInfoString(buf, ", ");
+ if (use_variadic && i == nargs)
+ appendStringInfoString(buf, "VARIADIC ");
+ get_rule_expr(arg, context, true);
+ }
+ }
+
+ if (aggref->aggorder != NIL)
+ {
+ appendStringInfoString(buf, " ORDER BY ");
+ get_rule_orderby(aggref->aggorder, aggref->args, false, context);
+ }
+ }
+
+ if (aggref->aggfilter != NULL)
+ {
+ appendStringInfoString(buf, ") FILTER (WHERE ");
+ get_rule_expr((Node *) aggref->aggfilter, context, false);
+ }
+
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * This is a helper function for get_agg_expr(). It's used when we deparse
+ * a combining Aggref; resolve_special_varno locates the corresponding partial
+ * Aggref and then calls this.
+ */
+static void
+get_agg_combine_expr(Node *node, deparse_context *context, void *callback_arg)
+{
+ Aggref *aggref;
+ Aggref *original_aggref = callback_arg;
+
+ if (!IsA(node, Aggref))
+ elog(ERROR, "combining Aggref does not point to an Aggref");
+
+ aggref = (Aggref *) node;
+ get_agg_expr(aggref, context, original_aggref);
+}
+
+/*
+ * get_windowfunc_expr - Parse back a WindowFunc node
+ */
+static void
+get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ Oid argtypes[FUNC_MAX_ARGS];
+ int nargs;
+ List *argnames;
+ ListCell *l;
+
+ if (list_length(wfunc->args) > FUNC_MAX_ARGS)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_ARGUMENTS),
+ errmsg("too many arguments")));
+ nargs = 0;
+ argnames = NIL;
+ foreach(l, wfunc->args)
+ {
+ Node *arg = (Node *) lfirst(l);
+
+ if (IsA(arg, NamedArgExpr))
+ argnames = lappend(argnames, ((NamedArgExpr *) arg)->name);
+ argtypes[nargs] = exprType(arg);
+ nargs++;
+ }
+
+ appendStringInfo(buf, "%s(",
+ generate_function_name(wfunc->winfnoid, nargs,
+ argnames, argtypes,
+ false, NULL,
+ context->special_exprkind));
+ /* winstar can be set only in zero-argument aggregates */
+ if (wfunc->winstar)
+ appendStringInfoChar(buf, '*');
+ else
+ get_rule_expr((Node *) wfunc->args, context, true);
+
+ if (wfunc->aggfilter != NULL)
+ {
+ appendStringInfoString(buf, ") FILTER (WHERE ");
+ get_rule_expr((Node *) wfunc->aggfilter, context, false);
+ }
+
+ appendStringInfoString(buf, ") OVER ");
+
+ foreach(l, context->windowClause)
+ {
+ WindowClause *wc = (WindowClause *) lfirst(l);
+
+ if (wc->winref == wfunc->winref)
+ {
+ if (wc->name)
+ appendStringInfoString(buf, quote_identifier(wc->name));
+ else
+ get_rule_windowspec(wc, context->windowTList, context);
+ break;
+ }
+ }
+ if (l == NULL)
+ {
+ if (context->windowClause)
+ elog(ERROR, "could not find window clause for winref %u",
+ wfunc->winref);
+
+ /*
+ * In EXPLAIN, we don't have window context information available, so
+ * we have to settle for this:
+ */
+ appendStringInfoString(buf, "(?)");
+ }
+}
+
+/*
+ * get_func_sql_syntax - Parse back a SQL-syntax function call
+ *
+ * Returns true if we successfully deparsed, false if we did not
+ * recognize the function.
+ */
+static bool
+get_func_sql_syntax(FuncExpr *expr, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ Oid funcoid = expr->funcid;
+
+ switch (funcoid)
+ {
+ case F_TIMEZONE_INTERVAL_TIMESTAMP:
+ case F_TIMEZONE_INTERVAL_TIMESTAMPTZ:
+ case F_TIMEZONE_INTERVAL_TIMETZ:
+ case F_TIMEZONE_TEXT_TIMESTAMP:
+ case F_TIMEZONE_TEXT_TIMESTAMPTZ:
+ case F_TIMEZONE_TEXT_TIMETZ:
+ /* AT TIME ZONE ... note reversed argument order */
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren((Node *) lsecond(expr->args), context, false,
+ (Node *) expr);
+ appendStringInfoString(buf, " AT TIME ZONE ");
+ get_rule_expr_paren((Node *) linitial(expr->args), context, false,
+ (Node *) expr);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_INTERVAL:
+ case F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_TIMESTAMPTZ:
+ case F_OVERLAPS_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ_INTERVAL:
+ case F_OVERLAPS_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ:
+ case F_OVERLAPS_TIMESTAMP_INTERVAL_TIMESTAMP_INTERVAL:
+ case F_OVERLAPS_TIMESTAMP_INTERVAL_TIMESTAMP_TIMESTAMP:
+ case F_OVERLAPS_TIMESTAMP_TIMESTAMP_TIMESTAMP_INTERVAL:
+ case F_OVERLAPS_TIMESTAMP_TIMESTAMP_TIMESTAMP_TIMESTAMP:
+ case F_OVERLAPS_TIMETZ_TIMETZ_TIMETZ_TIMETZ:
+ case F_OVERLAPS_TIME_INTERVAL_TIME_INTERVAL:
+ case F_OVERLAPS_TIME_INTERVAL_TIME_TIME:
+ case F_OVERLAPS_TIME_TIME_TIME_INTERVAL:
+ case F_OVERLAPS_TIME_TIME_TIME_TIME:
+ /* (x1, x2) OVERLAPS (y1, y2) */
+ appendStringInfoString(buf, "((");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, ", ");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoString(buf, ") OVERLAPS (");
+ get_rule_expr((Node *) lthird(expr->args), context, false);
+ appendStringInfoString(buf, ", ");
+ get_rule_expr((Node *) lfourth(expr->args), context, false);
+ appendStringInfoString(buf, "))");
+ return true;
+
+ case F_EXTRACT_TEXT_DATE:
+ case F_EXTRACT_TEXT_TIME:
+ case F_EXTRACT_TEXT_TIMETZ:
+ case F_EXTRACT_TEXT_TIMESTAMP:
+ case F_EXTRACT_TEXT_TIMESTAMPTZ:
+ case F_EXTRACT_TEXT_INTERVAL:
+ /* EXTRACT (x FROM y) */
+ appendStringInfoString(buf, "EXTRACT(");
+ {
+ Const *con = (Const *) linitial(expr->args);
+
+ Assert(IsA(con, Const) &&
+ con->consttype == TEXTOID &&
+ !con->constisnull);
+ appendStringInfoString(buf, TextDatumGetCString(con->constvalue));
+ }
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_IS_NORMALIZED:
+ /* IS xxx NORMALIZED */
+ appendStringInfoString(buf, "(");
+ get_rule_expr_paren((Node *) linitial(expr->args), context, false,
+ (Node *) expr);
+ appendStringInfoString(buf, " IS");
+ if (list_length(expr->args) == 2)
+ {
+ Const *con = (Const *) lsecond(expr->args);
+
+ Assert(IsA(con, Const) &&
+ con->consttype == TEXTOID &&
+ !con->constisnull);
+ appendStringInfo(buf, " %s",
+ TextDatumGetCString(con->constvalue));
+ }
+ appendStringInfoString(buf, " NORMALIZED)");
+ return true;
+
+ case F_PG_COLLATION_FOR:
+ /* COLLATION FOR */
+ appendStringInfoString(buf, "COLLATION FOR (");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_NORMALIZE:
+ /* NORMALIZE() */
+ appendStringInfoString(buf, "NORMALIZE(");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ if (list_length(expr->args) == 2)
+ {
+ Const *con = (Const *) lsecond(expr->args);
+
+ Assert(IsA(con, Const) &&
+ con->consttype == TEXTOID &&
+ !con->constisnull);
+ appendStringInfo(buf, ", %s",
+ TextDatumGetCString(con->constvalue));
+ }
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_OVERLAY_BIT_BIT_INT4:
+ case F_OVERLAY_BIT_BIT_INT4_INT4:
+ case F_OVERLAY_BYTEA_BYTEA_INT4:
+ case F_OVERLAY_BYTEA_BYTEA_INT4_INT4:
+ case F_OVERLAY_TEXT_TEXT_INT4:
+ case F_OVERLAY_TEXT_TEXT_INT4_INT4:
+ /* OVERLAY() */
+ appendStringInfoString(buf, "OVERLAY(");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, " PLACING ");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) lthird(expr->args), context, false);
+ if (list_length(expr->args) == 4)
+ {
+ appendStringInfoString(buf, " FOR ");
+ get_rule_expr((Node *) lfourth(expr->args), context, false);
+ }
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_POSITION_BIT_BIT:
+ case F_POSITION_BYTEA_BYTEA:
+ case F_POSITION_TEXT_TEXT:
+ /* POSITION() ... extra parens since args are b_expr not a_expr */
+ appendStringInfoString(buf, "POSITION((");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoString(buf, ") IN (");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, "))");
+ return true;
+
+ case F_SUBSTRING_BIT_INT4:
+ case F_SUBSTRING_BIT_INT4_INT4:
+ case F_SUBSTRING_BYTEA_INT4:
+ case F_SUBSTRING_BYTEA_INT4_INT4:
+ case F_SUBSTRING_TEXT_INT4:
+ case F_SUBSTRING_TEXT_INT4_INT4:
+ /* SUBSTRING FROM/FOR (i.e., integer-position variants) */
+ appendStringInfoString(buf, "SUBSTRING(");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ if (list_length(expr->args) == 3)
+ {
+ appendStringInfoString(buf, " FOR ");
+ get_rule_expr((Node *) lthird(expr->args), context, false);
+ }
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_SUBSTRING_TEXT_TEXT_TEXT:
+ /* SUBSTRING SIMILAR/ESCAPE */
+ appendStringInfoString(buf, "SUBSTRING(");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, " SIMILAR ");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoString(buf, " ESCAPE ");
+ get_rule_expr((Node *) lthird(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_BTRIM_BYTEA_BYTEA:
+ case F_BTRIM_TEXT:
+ case F_BTRIM_TEXT_TEXT:
+ /* TRIM() */
+ appendStringInfoString(buf, "TRIM(BOTH");
+ if (list_length(expr->args) == 2)
+ {
+ appendStringInfoChar(buf, ' ');
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ }
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_LTRIM_BYTEA_BYTEA:
+ case F_LTRIM_TEXT:
+ case F_LTRIM_TEXT_TEXT:
+ /* TRIM() */
+ appendStringInfoString(buf, "TRIM(LEADING");
+ if (list_length(expr->args) == 2)
+ {
+ appendStringInfoChar(buf, ' ');
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ }
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_RTRIM_BYTEA_BYTEA:
+ case F_RTRIM_TEXT:
+ case F_RTRIM_TEXT_TEXT:
+ /* TRIM() */
+ appendStringInfoString(buf, "TRIM(TRAILING");
+ if (list_length(expr->args) == 2)
+ {
+ appendStringInfoChar(buf, ' ');
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ }
+ appendStringInfoString(buf, " FROM ");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoChar(buf, ')');
+ return true;
+
+ case F_XMLEXISTS:
+ /* XMLEXISTS ... extra parens because args are c_expr */
+ appendStringInfoString(buf, "XMLEXISTS((");
+ get_rule_expr((Node *) linitial(expr->args), context, false);
+ appendStringInfoString(buf, ") PASSING (");
+ get_rule_expr((Node *) lsecond(expr->args), context, false);
+ appendStringInfoString(buf, "))");
+ return true;
+ }
+ return false;
+}
+
+/* ----------
+ * get_coercion_expr
+ *
+ * Make a string representation of a value coerced to a specific type
+ * ----------
+ */
+static void
+get_coercion_expr(Node *arg, deparse_context *context,
+ Oid resulttype, int32 resulttypmod,
+ Node *parentNode)
+{
+ StringInfo buf = context->buf;
+
+ /*
+ * Since parse_coerce.c doesn't immediately collapse application of
+ * length-coercion functions to constants, what we'll typically see in
+ * such cases is a Const with typmod -1 and a length-coercion function
+ * right above it. Avoid generating redundant output. However, beware of
+ * suppressing casts when the user actually wrote something like
+ * 'foo'::text::char(3).
+ *
+ * Note: it might seem that we are missing the possibility of needing to
+ * print a COLLATE clause for such a Const. However, a Const could only
+ * have nondefault collation in a post-constant-folding tree, in which the
+ * length coercion would have been folded too. See also the special
+ * handling of CollateExpr in coerce_to_target_type(): any collation
+ * marking will be above the coercion node, not below it.
+ */
+ if (arg && IsA(arg, Const) &&
+ ((Const *) arg)->consttype == resulttype &&
+ ((Const *) arg)->consttypmod == -1)
+ {
+ /* Show the constant without normal ::typename decoration */
+ get_const_expr((Const *) arg, context, -1);
+ }
+ else
+ {
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr_paren(arg, context, false, parentNode);
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+
+ /*
+ * Never emit resulttype(arg) functional notation. A pg_proc entry could
+ * take precedence, and a resulttype in pg_temp would require schema
+ * qualification that format_type_with_typemod() would usually omit. We've
+ * standardized on arg::resulttype, but CAST(arg AS resulttype) notation
+ * would work fine.
+ */
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(resulttype, resulttypmod));
+}
+
+/* ----------
+ * get_const_expr
+ *
+ * Make a string representation of a Const
+ *
+ * showtype can be -1 to never show "::typename" decoration, or +1 to always
+ * show it, or 0 to show it only if the constant wouldn't be assumed to be
+ * the right type by default.
+ *
+ * If the Const's collation isn't default for its type, show that too.
+ * We mustn't do this when showtype is -1 (since that means the caller will
+ * print "::typename", and we can't put a COLLATE clause in between). It's
+ * caller's responsibility that collation isn't missed in such cases.
+ * ----------
+ */
+static void
+get_const_expr(Const *constval, deparse_context *context, int showtype)
+{
+ StringInfo buf = context->buf;
+ Oid typoutput;
+ bool typIsVarlena;
+ char *extval;
+ bool needlabel = false;
+
+ if (constval->constisnull)
+ {
+ /*
+ * Always label the type of a NULL constant to prevent misdecisions
+ * about type when reparsing.
+ */
+ appendStringInfoString(buf, "NULL");
+ if (showtype >= 0)
+ {
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(constval->consttype,
+ constval->consttypmod));
+ get_const_collation(constval, context);
+ }
+ return;
+ }
+
+ getTypeOutputInfo(constval->consttype,
+ &typoutput, &typIsVarlena);
+
+ extval = OidOutputFunctionCall(typoutput, constval->constvalue);
+
+ switch (constval->consttype)
+ {
+ case INT4OID:
+
+ /*
+ * INT4 can be printed without any decoration, unless it is
+ * negative; in that case print it as '-nnn'::integer to ensure
+ * that the output will re-parse as a constant, not as a constant
+ * plus operator. In most cases we could get away with printing
+ * (-nnn) instead, because of the way that gram.y handles negative
+ * literals; but that doesn't work for INT_MIN, and it doesn't
+ * seem that much prettier anyway.
+ */
+ if (extval[0] != '-')
+ appendStringInfoString(buf, extval);
+ else
+ {
+ appendStringInfo(buf, "'%s'", extval);
+ needlabel = true; /* we must attach a cast */
+ }
+ break;
+
+ case NUMERICOID:
+
+ /*
+ * NUMERIC can be printed without quotes if it looks like a float
+ * constant (not an integer, and not Infinity or NaN) and doesn't
+ * have a leading sign (for the same reason as for INT4).
+ */
+ if (isdigit((unsigned char) extval[0]) &&
+ strcspn(extval, "eE.") != strlen(extval))
+ {
+ appendStringInfoString(buf, extval);
+ }
+ else
+ {
+ appendStringInfo(buf, "'%s'", extval);
+ needlabel = true; /* we must attach a cast */
+ }
+ break;
+
+ case BOOLOID:
+ if (strcmp(extval, "t") == 0)
+ appendStringInfoString(buf, "true");
+ else
+ appendStringInfoString(buf, "false");
+ break;
+
+ default:
+ simple_quote_literal(buf, extval);
+ break;
+ }
+
+ pfree(extval);
+
+ if (showtype < 0)
+ return;
+
+ /*
+ * For showtype == 0, append ::typename unless the constant will be
+ * implicitly typed as the right type when it is read in.
+ *
+ * XXX this code has to be kept in sync with the behavior of the parser,
+ * especially make_const.
+ */
+ switch (constval->consttype)
+ {
+ case BOOLOID:
+ case UNKNOWNOID:
+ /* These types can be left unlabeled */
+ needlabel = false;
+ break;
+ case INT4OID:
+ /* We determined above whether a label is needed */
+ break;
+ case NUMERICOID:
+
+ /*
+ * Float-looking constants will be typed as numeric, which we
+ * checked above; but if there's a nondefault typmod we need to
+ * show it.
+ */
+ needlabel |= (constval->consttypmod >= 0);
+ break;
+ default:
+ needlabel = true;
+ break;
+ }
+ if (needlabel || showtype > 0)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(constval->consttype,
+ constval->consttypmod));
+
+ get_const_collation(constval, context);
+}
+
+/*
+ * helper for get_const_expr: append COLLATE if needed
+ */
+static void
+get_const_collation(Const *constval, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+
+ if (OidIsValid(constval->constcollid))
+ {
+ Oid typcollation = get_typcollation(constval->consttype);
+
+ if (constval->constcollid != typcollation)
+ {
+ appendStringInfo(buf, " COLLATE %s",
+ generate_collation_name(constval->constcollid));
+ }
+ }
+}
+
+/*
+ * simple_quote_literal - Format a string as a SQL literal, append to buf
+ */
+static void
+simple_quote_literal(StringInfo buf, const char *val)
+{
+ const char *valptr;
+
+ /*
+ * We form the string literal according to the prevailing setting of
+ * standard_conforming_strings; we never use E''. User is responsible for
+ * making sure result is used correctly.
+ */
+ appendStringInfoChar(buf, '\'');
+ for (valptr = val; *valptr; valptr++)
+ {
+ char ch = *valptr;
+
+ if (SQL_STR_DOUBLE(ch, !standard_conforming_strings))
+ appendStringInfoChar(buf, ch);
+ appendStringInfoChar(buf, ch);
+ }
+ appendStringInfoChar(buf, '\'');
+}
+
+
+/* ----------
+ * get_sublink_expr - Parse back a sublink
+ * ----------
+ */
+static void
+get_sublink_expr(SubLink *sublink, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ Query *query = (Query *) (sublink->subselect);
+ char *opname = NULL;
+ bool need_paren;
+
+ if (sublink->subLinkType == ARRAY_SUBLINK)
+ appendStringInfoString(buf, "ARRAY(");
+ else
+ appendStringInfoChar(buf, '(');
+
+ /*
+ * Note that we print the name of only the first operator, when there are
+ * multiple combining operators. This is an approximation that could go
+ * wrong in various scenarios (operators in different schemas, renamed
+ * operators, etc) but there is not a whole lot we can do about it, since
+ * the syntax allows only one operator to be shown.
+ */
+ if (sublink->testexpr)
+ {
+ if (IsA(sublink->testexpr, OpExpr))
+ {
+ /* single combining operator */
+ OpExpr *opexpr = (OpExpr *) sublink->testexpr;
+
+ get_rule_expr(linitial(opexpr->args), context, true);
+ opname = generate_operator_name(opexpr->opno,
+ exprType(linitial(opexpr->args)),
+ exprType(lsecond(opexpr->args)));
+ }
+ else if (IsA(sublink->testexpr, BoolExpr))
+ {
+ /* multiple combining operators, = or <> cases */
+ char *sep;
+ ListCell *l;
+
+ appendStringInfoChar(buf, '(');
+ sep = "";
+ foreach(l, ((BoolExpr *) sublink->testexpr)->args)
+ {
+ OpExpr *opexpr = lfirst_node(OpExpr, l);
+
+ appendStringInfoString(buf, sep);
+ get_rule_expr(linitial(opexpr->args), context, true);
+ if (!opname)
+ opname = generate_operator_name(opexpr->opno,
+ exprType(linitial(opexpr->args)),
+ exprType(lsecond(opexpr->args)));
+ sep = ", ";
+ }
+ appendStringInfoChar(buf, ')');
+ }
+ else if (IsA(sublink->testexpr, RowCompareExpr))
+ {
+ /* multiple combining operators, < <= > >= cases */
+ RowCompareExpr *rcexpr = (RowCompareExpr *) sublink->testexpr;
+
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) rcexpr->largs, context, true);
+ opname = generate_operator_name(linitial_oid(rcexpr->opnos),
+ exprType(linitial(rcexpr->largs)),
+ exprType(linitial(rcexpr->rargs)));
+ appendStringInfoChar(buf, ')');
+ }
+ else
+ elog(ERROR, "unrecognized testexpr type: %d",
+ (int) nodeTag(sublink->testexpr));
+ }
+
+ need_paren = true;
+
+ switch (sublink->subLinkType)
+ {
+ case EXISTS_SUBLINK:
+ appendStringInfoString(buf, "EXISTS ");
+ break;
+
+ case ANY_SUBLINK:
+ if (strcmp(opname, "=") == 0) /* Represent = ANY as IN */
+ appendStringInfoString(buf, " IN ");
+ else
+ appendStringInfo(buf, " %s ANY ", opname);
+ break;
+
+ case ALL_SUBLINK:
+ appendStringInfo(buf, " %s ALL ", opname);
+ break;
+
+ case ROWCOMPARE_SUBLINK:
+ appendStringInfo(buf, " %s ", opname);
+ break;
+
+ case EXPR_SUBLINK:
+ case MULTIEXPR_SUBLINK:
+ case ARRAY_SUBLINK:
+ need_paren = false;
+ break;
+
+ case CTE_SUBLINK: /* shouldn't occur in a SubLink */
+ default:
+ elog(ERROR, "unrecognized sublink type: %d",
+ (int) sublink->subLinkType);
+ break;
+ }
+
+ if (need_paren)
+ appendStringInfoChar(buf, '(');
+
+ get_query_def(query, buf, context->namespaces, NULL, false,
+ context->prettyFlags, context->wrapColumn,
+ context->indentLevel);
+
+ if (need_paren)
+ appendStringInfoString(buf, "))");
+ else
+ appendStringInfoChar(buf, ')');
+}
+
+
+/* ----------
+ * get_tablefunc - Parse back a table function
+ * ----------
+ */
+static void
+get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit)
+{
+ StringInfo buf = context->buf;
+
+ /* XMLTABLE is the only existing implementation. */
+
+ appendStringInfoString(buf, "XMLTABLE(");
+
+ if (tf->ns_uris != NIL)
+ {
+ ListCell *lc1,
+ *lc2;
+ bool first = true;
+
+ appendStringInfoString(buf, "XMLNAMESPACES (");
+ forboth(lc1, tf->ns_uris, lc2, tf->ns_names)
+ {
+ Node *expr = (Node *) lfirst(lc1);
+ String *ns_node = lfirst_node(String, lc2);
+
+ if (!first)
+ appendStringInfoString(buf, ", ");
+ else
+ first = false;
+
+ if (ns_node != NULL)
+ {
+ get_rule_expr(expr, context, showimplicit);
+ appendStringInfo(buf, " AS %s", strVal(ns_node));
+ }
+ else
+ {
+ appendStringInfoString(buf, "DEFAULT ");
+ get_rule_expr(expr, context, showimplicit);
+ }
+ }
+ appendStringInfoString(buf, "), ");
+ }
+
+ appendStringInfoChar(buf, '(');
+ get_rule_expr((Node *) tf->rowexpr, context, showimplicit);
+ appendStringInfoString(buf, ") PASSING (");
+ get_rule_expr((Node *) tf->docexpr, context, showimplicit);
+ appendStringInfoChar(buf, ')');
+
+ if (tf->colexprs != NIL)
+ {
+ ListCell *l1;
+ ListCell *l2;
+ ListCell *l3;
+ ListCell *l4;
+ ListCell *l5;
+ int colnum = 0;
+
+ appendStringInfoString(buf, " COLUMNS ");
+ forfive(l1, tf->colnames, l2, tf->coltypes, l3, tf->coltypmods,
+ l4, tf->colexprs, l5, tf->coldefexprs)
+ {
+ char *colname = strVal(lfirst(l1));
+ Oid typid = lfirst_oid(l2);
+ int32 typmod = lfirst_int(l3);
+ Node *colexpr = (Node *) lfirst(l4);
+ Node *coldefexpr = (Node *) lfirst(l5);
+ bool ordinality = (tf->ordinalitycol == colnum);
+ bool notnull = bms_is_member(colnum, tf->notnulls);
+
+ if (colnum > 0)
+ appendStringInfoString(buf, ", ");
+ colnum++;
+
+ appendStringInfo(buf, "%s %s", quote_identifier(colname),
+ ordinality ? "FOR ORDINALITY" :
+ format_type_with_typemod(typid, typmod));
+ if (ordinality)
+ continue;
+
+ if (coldefexpr != NULL)
+ {
+ appendStringInfoString(buf, " DEFAULT (");
+ get_rule_expr((Node *) coldefexpr, context, showimplicit);
+ appendStringInfoChar(buf, ')');
+ }
+ if (colexpr != NULL)
+ {
+ appendStringInfoString(buf, " PATH (");
+ get_rule_expr((Node *) colexpr, context, showimplicit);
+ appendStringInfoChar(buf, ')');
+ }
+ if (notnull)
+ appendStringInfoString(buf, " NOT NULL");
+ }
+ }
+
+ appendStringInfoChar(buf, ')');
+}
+
+/* ----------
+ * get_from_clause - Parse back a FROM clause
+ *
+ * "prefix" is the keyword that denotes the start of the list of FROM
+ * elements. It is FROM when used to parse back SELECT and UPDATE, but
+ * is USING when parsing back DELETE.
+ * ----------
+ */
+static void
+get_from_clause(Query *query, const char *prefix, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ bool first = true;
+ ListCell *l;
+
+ /*
+ * We use the query's jointree as a guide to what to print. However, we
+ * must ignore auto-added RTEs that are marked not inFromCl. (These can
+ * only appear at the top level of the jointree, so it's sufficient to
+ * check here.) This check also ensures we ignore the rule pseudo-RTEs
+ * for NEW and OLD.
+ */
+ foreach(l, query->jointree->fromlist)
+ {
+ Node *jtnode = (Node *) lfirst(l);
+
+ if (IsA(jtnode, RangeTblRef))
+ {
+ int varno = ((RangeTblRef *) jtnode)->rtindex;
+ RangeTblEntry *rte = rt_fetch(varno, query->rtable);
+
+ if (!rte->inFromCl)
+ continue;
+ }
+
+ if (first)
+ {
+ appendContextKeyword(context, prefix,
+ -PRETTYINDENT_STD, PRETTYINDENT_STD, 2);
+ first = false;
+
+ get_from_clause_item(jtnode, query, context);
+ }
+ else
+ {
+ StringInfoData itembuf;
+
+ appendStringInfoString(buf, ", ");
+
+ /*
+ * Put the new FROM item's text into itembuf so we can decide
+ * after we've got it whether or not it needs to go on a new line.
+ */
+ initStringInfo(&itembuf);
+ context->buf = &itembuf;
+
+ get_from_clause_item(jtnode, query, context);
+
+ /* Restore context's output buffer */
+ context->buf = buf;
+
+ /* Consider line-wrapping if enabled */
+ if (PRETTY_INDENT(context) && context->wrapColumn >= 0)
+ {
+ /* Does the new item start with a new line? */
+ if (itembuf.len > 0 && itembuf.data[0] == '\n')
+ {
+ /* If so, we shouldn't add anything */
+ /* instead, remove any trailing spaces currently in buf */
+ removeStringInfoSpaces(buf);
+ }
+ else
+ {
+ char *trailing_nl;
+
+ /* Locate the start of the current line in the buffer */
+ trailing_nl = strrchr(buf->data, '\n');
+ if (trailing_nl == NULL)
+ trailing_nl = buf->data;
+ else
+ trailing_nl++;
+
+ /*
+ * Add a newline, plus some indentation, if the new item
+ * would cause an overflow.
+ */
+ if (strlen(trailing_nl) + itembuf.len > context->wrapColumn)
+ appendContextKeyword(context, "", -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_VAR);
+ }
+ }
+
+ /* Add the new item */
+ appendBinaryStringInfo(buf, itembuf.data, itembuf.len);
+
+ /* clean up */
+ pfree(itembuf.data);
+ }
+ }
+}
+
+static void
+get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ deparse_namespace *dpns = (deparse_namespace *) linitial(context->namespaces);
+
+ if (IsA(jtnode, RangeTblRef))
+ {
+ int varno = ((RangeTblRef *) jtnode)->rtindex;
+ RangeTblEntry *rte = rt_fetch(varno, query->rtable);
+ deparse_columns *colinfo = deparse_columns_fetch(varno, dpns);
+ RangeTblFunction *rtfunc1 = NULL;
+
+ if (rte->lateral)
+ appendStringInfoString(buf, "LATERAL ");
+
+ /* Print the FROM item proper */
+ switch (rte->rtekind)
+ {
+ case RTE_RELATION:
+ /* Normal relation RTE */
+ appendStringInfo(buf, "%s%s",
+ only_marker(rte),
+ generate_relation_name(rte->relid,
+ context->namespaces));
+ break;
+ case RTE_SUBQUERY:
+ /* Subquery RTE */
+ appendStringInfoChar(buf, '(');
+ get_query_def(rte->subquery, buf, context->namespaces, NULL,
+ true,
+ context->prettyFlags, context->wrapColumn,
+ context->indentLevel);
+ appendStringInfoChar(buf, ')');
+ break;
+ case RTE_FUNCTION:
+ /* Function RTE */
+ rtfunc1 = (RangeTblFunction *) linitial(rte->functions);
+
+ /*
+ * Omit ROWS FROM() syntax for just one function, unless it
+ * has both a coldeflist and WITH ORDINALITY. If it has both,
+ * we must use ROWS FROM() syntax to avoid ambiguity about
+ * whether the coldeflist includes the ordinality column.
+ */
+ if (list_length(rte->functions) == 1 &&
+ (rtfunc1->funccolnames == NIL || !rte->funcordinality))
+ {
+ get_rule_expr_funccall(rtfunc1->funcexpr, context, true);
+ /* we'll print the coldeflist below, if it has one */
+ }
+ else
+ {
+ bool all_unnest;
+ ListCell *lc;
+
+ /*
+ * If all the function calls in the list are to unnest,
+ * and none need a coldeflist, then collapse the list back
+ * down to UNNEST(args). (If we had more than one
+ * built-in unnest function, this would get more
+ * difficult.)
+ *
+ * XXX This is pretty ugly, since it makes not-terribly-
+ * future-proof assumptions about what the parser would do
+ * with the output; but the alternative is to emit our
+ * nonstandard ROWS FROM() notation for what might have
+ * been a perfectly spec-compliant multi-argument
+ * UNNEST().
+ */
+ all_unnest = true;
+ foreach(lc, rte->functions)
+ {
+ RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc);
+
+ if (!IsA(rtfunc->funcexpr, FuncExpr) ||
+ ((FuncExpr *) rtfunc->funcexpr)->funcid != F_UNNEST_ANYARRAY ||
+ rtfunc->funccolnames != NIL)
+ {
+ all_unnest = false;
+ break;
+ }
+ }
+
+ if (all_unnest)
+ {
+ List *allargs = NIL;
+
+ foreach(lc, rte->functions)
+ {
+ RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc);
+ List *args = ((FuncExpr *) rtfunc->funcexpr)->args;
+
+ allargs = list_concat(allargs, args);
+ }
+
+ appendStringInfoString(buf, "UNNEST(");
+ get_rule_expr((Node *) allargs, context, true);
+ appendStringInfoChar(buf, ')');
+ }
+ else
+ {
+ int funcno = 0;
+
+ appendStringInfoString(buf, "ROWS FROM(");
+ foreach(lc, rte->functions)
+ {
+ RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc);
+
+ if (funcno > 0)
+ appendStringInfoString(buf, ", ");
+ get_rule_expr_funccall(rtfunc->funcexpr, context, true);
+ if (rtfunc->funccolnames != NIL)
+ {
+ /* Reconstruct the column definition list */
+ appendStringInfoString(buf, " AS ");
+ get_from_clause_coldeflist(rtfunc,
+ NULL,
+ context);
+ }
+ funcno++;
+ }
+ appendStringInfoChar(buf, ')');
+ }
+ /* prevent printing duplicate coldeflist below */
+ rtfunc1 = NULL;
+ }
+ if (rte->funcordinality)
+ appendStringInfoString(buf, " WITH ORDINALITY");
+ break;
+ case RTE_TABLEFUNC:
+ get_tablefunc(rte->tablefunc, context, true);
+ break;
+ case RTE_VALUES:
+ /* Values list RTE */
+ appendStringInfoChar(buf, '(');
+ get_values_def(rte->values_lists, context);
+ appendStringInfoChar(buf, ')');
+ break;
+ case RTE_CTE:
+ appendStringInfoString(buf, quote_identifier(rte->ctename));
+ break;
+ default:
+ elog(ERROR, "unrecognized RTE kind: %d", (int) rte->rtekind);
+ break;
+ }
+
+ /* Print the relation alias, if needed */
+ get_rte_alias(rte, varno, false, context);
+
+ /* Print the column definitions or aliases, if needed */
+ if (rtfunc1 && rtfunc1->funccolnames != NIL)
+ {
+ /* Reconstruct the columndef list, which is also the aliases */
+ get_from_clause_coldeflist(rtfunc1, colinfo, context);
+ }
+ else
+ {
+ /* Else print column aliases as needed */
+ get_column_alias_list(colinfo, context);
+ }
+
+ /* Tablesample clause must go after any alias */
+ if (rte->rtekind == RTE_RELATION && rte->tablesample)
+ get_tablesample_def(rte->tablesample, context);
+ }
+ else if (IsA(jtnode, JoinExpr))
+ {
+ JoinExpr *j = (JoinExpr *) jtnode;
+ deparse_columns *colinfo = deparse_columns_fetch(j->rtindex, dpns);
+ bool need_paren_on_right;
+
+ need_paren_on_right = PRETTY_PAREN(context) &&
+ !IsA(j->rarg, RangeTblRef) &&
+ !(IsA(j->rarg, JoinExpr) && ((JoinExpr *) j->rarg)->alias != NULL);
+
+ if (!PRETTY_PAREN(context) || j->alias != NULL)
+ appendStringInfoChar(buf, '(');
+
+ get_from_clause_item(j->larg, query, context);
+
+ switch (j->jointype)
+ {
+ case JOIN_INNER:
+ if (j->quals)
+ appendContextKeyword(context, " JOIN ",
+ -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_JOIN);
+ else
+ appendContextKeyword(context, " CROSS JOIN ",
+ -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_JOIN);
+ break;
+ case JOIN_LEFT:
+ appendContextKeyword(context, " LEFT JOIN ",
+ -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_JOIN);
+ break;
+ case JOIN_FULL:
+ appendContextKeyword(context, " FULL JOIN ",
+ -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_JOIN);
+ break;
+ case JOIN_RIGHT:
+ appendContextKeyword(context, " RIGHT JOIN ",
+ -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_JOIN);
+ break;
+ default:
+ elog(ERROR, "unrecognized join type: %d",
+ (int) j->jointype);
+ }
+
+ if (need_paren_on_right)
+ appendStringInfoChar(buf, '(');
+ get_from_clause_item(j->rarg, query, context);
+ if (need_paren_on_right)
+ appendStringInfoChar(buf, ')');
+
+ if (j->usingClause)
+ {
+ ListCell *lc;
+ bool first = true;
+
+ appendStringInfoString(buf, " USING (");
+ /* Use the assigned names, not what's in usingClause */
+ foreach(lc, colinfo->usingNames)
+ {
+ char *colname = (char *) lfirst(lc);
+
+ if (first)
+ first = false;
+ else
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf, quote_identifier(colname));
+ }
+ appendStringInfoChar(buf, ')');
+
+ if (j->join_using_alias)
+ appendStringInfo(buf, " AS %s",
+ quote_identifier(j->join_using_alias->aliasname));
+ }
+ else if (j->quals)
+ {
+ appendStringInfoString(buf, " ON ");
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, '(');
+ get_rule_expr(j->quals, context, false);
+ if (!PRETTY_PAREN(context))
+ appendStringInfoChar(buf, ')');
+ }
+ else if (j->jointype != JOIN_INNER)
+ {
+ /* If we didn't say CROSS JOIN above, we must provide an ON */
+ appendStringInfoString(buf, " ON TRUE");
+ }
+
+ if (!PRETTY_PAREN(context) || j->alias != NULL)
+ appendStringInfoChar(buf, ')');
+
+ /* Yes, it's correct to put alias after the right paren ... */
+ if (j->alias != NULL)
+ {
+ /*
+ * Note that it's correct to emit an alias clause if and only if
+ * there was one originally. Otherwise we'd be converting a named
+ * join to unnamed or vice versa, which creates semantic
+ * subtleties we don't want. However, we might print a different
+ * alias name than was there originally.
+ */
+ appendStringInfo(buf, " %s",
+ quote_identifier(get_rtable_name(j->rtindex,
+ context)));
+ get_column_alias_list(colinfo, context);
+ }
+ }
+ else
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(jtnode));
+}
+
+/*
+ * get_rte_alias - print the relation's alias, if needed
+ *
+ * If printed, the alias is preceded by a space, or by " AS " if use_as is true.
+ */
+static void
+get_rte_alias(RangeTblEntry *rte, int varno, bool use_as,
+ deparse_context *context)
+{
+ deparse_namespace *dpns = (deparse_namespace *) linitial(context->namespaces);
+ char *refname = get_rtable_name(varno, context);
+ deparse_columns *colinfo = deparse_columns_fetch(varno, dpns);
+ bool printalias = false;
+
+ if (rte->alias != NULL)
+ {
+ /* Always print alias if user provided one */
+ printalias = true;
+ }
+ else if (colinfo->printaliases)
+ {
+ /* Always print alias if we need to print column aliases */
+ printalias = true;
+ }
+ else if (rte->rtekind == RTE_RELATION)
+ {
+ /*
+ * No need to print alias if it's same as relation name (this would
+ * normally be the case, but not if set_rtable_names had to resolve a
+ * conflict).
+ */
+ if (strcmp(refname, get_relation_name(rte->relid)) != 0)
+ printalias = true;
+ }
+ else if (rte->rtekind == RTE_FUNCTION)
+ {
+ /*
+ * For a function RTE, always print alias. This covers possible
+ * renaming of the function and/or instability of the FigureColname
+ * rules for things that aren't simple functions. Note we'd need to
+ * force it anyway for the columndef list case.
+ */
+ printalias = true;
+ }
+ else if (rte->rtekind == RTE_SUBQUERY ||
+ rte->rtekind == RTE_VALUES)
+ {
+ /* Alias is syntactically required for SUBQUERY and VALUES */
+ printalias = true;
+ }
+ else if (rte->rtekind == RTE_CTE)
+ {
+ /*
+ * No need to print alias if it's same as CTE name (this would
+ * normally be the case, but not if set_rtable_names had to resolve a
+ * conflict).
+ */
+ if (strcmp(refname, rte->ctename) != 0)
+ printalias = true;
+ }
+
+ if (printalias)
+ appendStringInfo(context->buf, "%s%s",
+ use_as ? " AS " : " ",
+ quote_identifier(refname));
+}
+
+/*
+ * get_column_alias_list - print column alias list for an RTE
+ *
+ * Caller must already have printed the relation's alias name.
+ */
+static void
+get_column_alias_list(deparse_columns *colinfo, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ int i;
+ bool first = true;
+
+ /* Don't print aliases if not needed */
+ if (!colinfo->printaliases)
+ return;
+
+ for (i = 0; i < colinfo->num_new_cols; i++)
+ {
+ char *colname = colinfo->new_colnames[i];
+
+ if (first)
+ {
+ appendStringInfoChar(buf, '(');
+ first = false;
+ }
+ else
+ appendStringInfoString(buf, ", ");
+ appendStringInfoString(buf, quote_identifier(colname));
+ }
+ if (!first)
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * get_from_clause_coldeflist - reproduce FROM clause coldeflist
+ *
+ * When printing a top-level coldeflist (which is syntactically also the
+ * relation's column alias list), use column names from colinfo. But when
+ * printing a coldeflist embedded inside ROWS FROM(), we prefer to use the
+ * original coldeflist's names, which are available in rtfunc->funccolnames.
+ * Pass NULL for colinfo to select the latter behavior.
+ *
+ * The coldeflist is appended immediately (no space) to buf. Caller is
+ * responsible for ensuring that an alias or AS is present before it.
+ */
+static void
+get_from_clause_coldeflist(RangeTblFunction *rtfunc,
+ deparse_columns *colinfo,
+ deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ ListCell *l1;
+ ListCell *l2;
+ ListCell *l3;
+ ListCell *l4;
+ int i;
+
+ appendStringInfoChar(buf, '(');
+
+ i = 0;
+ forfour(l1, rtfunc->funccoltypes,
+ l2, rtfunc->funccoltypmods,
+ l3, rtfunc->funccolcollations,
+ l4, rtfunc->funccolnames)
+ {
+ Oid atttypid = lfirst_oid(l1);
+ int32 atttypmod = lfirst_int(l2);
+ Oid attcollation = lfirst_oid(l3);
+ char *attname;
+
+ if (colinfo)
+ attname = colinfo->colnames[i];
+ else
+ attname = strVal(lfirst(l4));
+
+ Assert(attname); /* shouldn't be any dropped columns here */
+
+ if (i > 0)
+ appendStringInfoString(buf, ", ");
+ appendStringInfo(buf, "%s %s",
+ quote_identifier(attname),
+ format_type_with_typemod(atttypid, atttypmod));
+ if (OidIsValid(attcollation) &&
+ attcollation != get_typcollation(atttypid))
+ appendStringInfo(buf, " COLLATE %s",
+ generate_collation_name(attcollation));
+
+ i++;
+ }
+
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * get_tablesample_def - print a TableSampleClause
+ */
+static void
+get_tablesample_def(TableSampleClause *tablesample, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ Oid argtypes[1];
+ int nargs;
+ ListCell *l;
+
+ /*
+ * We should qualify the handler's function name if it wouldn't be
+ * resolved by lookup in the current search path.
+ */
+ argtypes[0] = INTERNALOID;
+ appendStringInfo(buf, " TABLESAMPLE %s (",
+ generate_function_name(tablesample->tsmhandler, 1,
+ NIL, argtypes,
+ false, NULL, EXPR_KIND_NONE));
+
+ nargs = 0;
+ foreach(l, tablesample->args)
+ {
+ if (nargs++ > 0)
+ appendStringInfoString(buf, ", ");
+ get_rule_expr((Node *) lfirst(l), context, false);
+ }
+ appendStringInfoChar(buf, ')');
+
+ if (tablesample->repeatable != NULL)
+ {
+ appendStringInfoString(buf, " REPEATABLE (");
+ get_rule_expr((Node *) tablesample->repeatable, context, false);
+ appendStringInfoChar(buf, ')');
+ }
+}
+
+/*
+ * get_opclass_name - fetch name of an index operator class
+ *
+ * The opclass name is appended (after a space) to buf.
+ *
+ * Output is suppressed if the opclass is the default for the given
+ * actual_datatype. (If you don't want this behavior, just pass
+ * InvalidOid for actual_datatype.)
+ */
+static void
+get_opclass_name(Oid opclass, Oid actual_datatype,
+ StringInfo buf)
+{
+ HeapTuple ht_opc;
+ Form_pg_opclass opcrec;
+ char *opcname;
+ char *nspname;
+
+ ht_opc = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclass));
+ if (!HeapTupleIsValid(ht_opc))
+ elog(ERROR, "cache lookup failed for opclass %u", opclass);
+ opcrec = (Form_pg_opclass) GETSTRUCT(ht_opc);
+
+ if (!OidIsValid(actual_datatype) ||
+ GetDefaultOpClass(actual_datatype, opcrec->opcmethod) != opclass)
+ {
+ /* Okay, we need the opclass name. Do we need to qualify it? */
+ opcname = NameStr(opcrec->opcname);
+ if (OpclassIsVisible(opclass))
+ appendStringInfo(buf, " %s", quote_identifier(opcname));
+ else
+ {
+ nspname = get_namespace_name_or_temp(opcrec->opcnamespace);
+ appendStringInfo(buf, " %s.%s",
+ quote_identifier(nspname),
+ quote_identifier(opcname));
+ }
+ }
+ ReleaseSysCache(ht_opc);
+}
+
+/*
+ * generate_opclass_name
+ * Compute the name to display for an opclass specified by OID
+ *
+ * The result includes all necessary quoting and schema-prefixing.
+ */
+char *
+generate_opclass_name(Oid opclass)
+{
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+ get_opclass_name(opclass, InvalidOid, &buf);
+
+ return &buf.data[1]; /* get_opclass_name() prepends space */
+}
+
+/*
+ * processIndirection - take care of array and subfield assignment
+ *
+ * We strip any top-level FieldStore or assignment SubscriptingRef nodes that
+ * appear in the input, printing them as decoration for the base column
+ * name (which we assume the caller just printed). We might also need to
+ * strip CoerceToDomain nodes, but only ones that appear above assignment
+ * nodes.
+ *
+ * Returns the subexpression that's to be assigned.
+ */
+static Node *
+processIndirection(Node *node, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ CoerceToDomain *cdomain = NULL;
+
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ if (IsA(node, FieldStore))
+ {
+ FieldStore *fstore = (FieldStore *) node;
+ Oid typrelid;
+ char *fieldname;
+
+ /* lookup tuple type */
+ typrelid = get_typ_typrelid(fstore->resulttype);
+ if (!OidIsValid(typrelid))
+ elog(ERROR, "argument type %s of FieldStore is not a tuple type",
+ format_type_be(fstore->resulttype));
+
+ /*
+ * Print the field name. There should only be one target field in
+ * stored rules. There could be more than that in executable
+ * target lists, but this function cannot be used for that case.
+ */
+ Assert(list_length(fstore->fieldnums) == 1);
+ fieldname = get_attname(typrelid,
+ linitial_int(fstore->fieldnums), false);
+ appendStringInfo(buf, ".%s", quote_identifier(fieldname));
+
+ /*
+ * We ignore arg since it should be an uninteresting reference to
+ * the target column or subcolumn.
+ */
+ node = (Node *) linitial(fstore->newvals);
+ }
+ else if (IsA(node, SubscriptingRef))
+ {
+ SubscriptingRef *sbsref = (SubscriptingRef *) node;
+
+ if (sbsref->refassgnexpr == NULL)
+ break;
+
+ printSubscripts(sbsref, context);
+
+ /*
+ * We ignore refexpr since it should be an uninteresting reference
+ * to the target column or subcolumn.
+ */
+ node = (Node *) sbsref->refassgnexpr;
+ }
+ else if (IsA(node, CoerceToDomain))
+ {
+ cdomain = (CoerceToDomain *) node;
+ /* If it's an explicit domain coercion, we're done */
+ if (cdomain->coercionformat != COERCE_IMPLICIT_CAST)
+ break;
+ /* Tentatively descend past the CoerceToDomain */
+ node = (Node *) cdomain->arg;
+ }
+ else
+ break;
+ }
+
+ /*
+ * If we descended past a CoerceToDomain whose argument turned out not to
+ * be a FieldStore or array assignment, back up to the CoerceToDomain.
+ * (This is not enough to be fully correct if there are nested implicit
+ * CoerceToDomains, but such cases shouldn't ever occur.)
+ */
+ if (cdomain && node == (Node *) cdomain->arg)
+ node = (Node *) cdomain;
+
+ return node;
+}
+
+static void
+printSubscripts(SubscriptingRef *sbsref, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ ListCell *lowlist_item;
+ ListCell *uplist_item;
+
+ lowlist_item = list_head(sbsref->reflowerindexpr); /* could be NULL */
+ foreach(uplist_item, sbsref->refupperindexpr)
+ {
+ appendStringInfoChar(buf, '[');
+ if (lowlist_item)
+ {
+ /* If subexpression is NULL, get_rule_expr prints nothing */
+ get_rule_expr((Node *) lfirst(lowlist_item), context, false);
+ appendStringInfoChar(buf, ':');
+ lowlist_item = lnext(sbsref->reflowerindexpr, lowlist_item);
+ }
+ /* If subexpression is NULL, get_rule_expr prints nothing */
+ get_rule_expr((Node *) lfirst(uplist_item), context, false);
+ appendStringInfoChar(buf, ']');
+ }
+}
+
+/*
+ * quote_identifier - Quote an identifier only if needed
+ *
+ * When quotes are needed, we palloc the required space; slightly
+ * space-wasteful but well worth it for notational simplicity.
+ */
+const char *
+quote_identifier(const char *ident)
+{
+ /*
+ * Can avoid quoting if ident starts with a lowercase letter or underscore
+ * and contains only lowercase letters, digits, and underscores, *and* is
+ * not any SQL keyword. Otherwise, supply quotes.
+ */
+ int nquotes = 0;
+ bool safe;
+ const char *ptr;
+ char *result;
+ char *optr;
+
+ /*
+ * would like to use <ctype.h> macros here, but they might yield unwanted
+ * locale-specific results...
+ */
+ safe = ((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_');
+
+ for (ptr = ident; *ptr; ptr++)
+ {
+ char ch = *ptr;
+
+ if ((ch >= 'a' && ch <= 'z') ||
+ (ch >= '0' && ch <= '9') ||
+ (ch == '_'))
+ {
+ /* okay */
+ }
+ else
+ {
+ safe = false;
+ if (ch == '"')
+ nquotes++;
+ }
+ }
+
+ if (quote_all_identifiers)
+ safe = false;
+
+ if (safe)
+ {
+ /*
+ * Check for keyword. We quote keywords except for unreserved ones.
+ * (In some cases we could avoid quoting a col_name or type_func_name
+ * keyword, but it seems much harder than it's worth to tell that.)
+ *
+ * Note: ScanKeywordLookup() does case-insensitive comparison, but
+ * that's fine, since we already know we have all-lower-case.
+ */
+ int kwnum = ScanKeywordLookup(ident, &ScanKeywords);
+
+ if (kwnum >= 0 && ScanKeywordCategories[kwnum] != UNRESERVED_KEYWORD)
+ safe = false;
+ }
+
+ if (safe)
+ return ident; /* no change needed */
+
+ result = (char *) palloc(strlen(ident) + nquotes + 2 + 1);
+
+ optr = result;
+ *optr++ = '"';
+ for (ptr = ident; *ptr; ptr++)
+ {
+ char ch = *ptr;
+
+ if (ch == '"')
+ *optr++ = '"';
+ *optr++ = ch;
+ }
+ *optr++ = '"';
+ *optr = '\0';
+
+ return result;
+}
+
+/*
+ * quote_qualified_identifier - Quote a possibly-qualified identifier
+ *
+ * Return a name of the form qualifier.ident, or just ident if qualifier
+ * is NULL, quoting each component if necessary. The result is palloc'd.
+ */
+char *
+quote_qualified_identifier(const char *qualifier,
+ const char *ident)
+{
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+ if (qualifier)
+ appendStringInfo(&buf, "%s.", quote_identifier(qualifier));
+ appendStringInfoString(&buf, quote_identifier(ident));
+ return buf.data;
+}
+
+/*
+ * get_relation_name
+ * Get the unqualified name of a relation specified by OID
+ *
+ * This differs from the underlying get_rel_name() function in that it will
+ * throw error instead of silently returning NULL if the OID is bad.
+ */
+static char *
+get_relation_name(Oid relid)
+{
+ char *relname = get_rel_name(relid);
+
+ if (!relname)
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ return relname;
+}
+
+/*
+ * generate_relation_name
+ * Compute the name to display for a relation specified by OID
+ *
+ * The result includes all necessary quoting and schema-prefixing.
+ *
+ * If namespaces isn't NIL, it must be a list of deparse_namespace nodes.
+ * We will forcibly qualify the relation name if it equals any CTE name
+ * visible in the namespace list.
+ */
+static char *
+generate_relation_name(Oid relid, List *namespaces)
+{
+ HeapTuple tp;
+ Form_pg_class reltup;
+ bool need_qual;
+ ListCell *nslist;
+ char *relname;
+ char *nspname;
+ char *result;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ reltup = (Form_pg_class) GETSTRUCT(tp);
+ relname = NameStr(reltup->relname);
+
+ /* Check for conflicting CTE name */
+ need_qual = false;
+ foreach(nslist, namespaces)
+ {
+ deparse_namespace *dpns = (deparse_namespace *) lfirst(nslist);
+ ListCell *ctlist;
+
+ foreach(ctlist, dpns->ctes)
+ {
+ CommonTableExpr *cte = (CommonTableExpr *) lfirst(ctlist);
+
+ if (strcmp(cte->ctename, relname) == 0)
+ {
+ need_qual = true;
+ break;
+ }
+ }
+ if (need_qual)
+ break;
+ }
+
+ /* Otherwise, qualify the name if not visible in search path */
+ if (!need_qual)
+ need_qual = !RelationIsVisible(relid);
+
+ if (need_qual)
+ nspname = get_namespace_name_or_temp(reltup->relnamespace);
+ else
+ nspname = NULL;
+
+ result = quote_qualified_identifier(nspname, relname);
+
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+/*
+ * generate_qualified_relation_name
+ * Compute the name to display for a relation specified by OID
+ *
+ * As above, but unconditionally schema-qualify the name.
+ */
+static char *
+generate_qualified_relation_name(Oid relid)
+{
+ HeapTuple tp;
+ Form_pg_class reltup;
+ char *relname;
+ char *nspname;
+ char *result;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ reltup = (Form_pg_class) GETSTRUCT(tp);
+ relname = NameStr(reltup->relname);
+
+ nspname = get_namespace_name_or_temp(reltup->relnamespace);
+ if (!nspname)
+ elog(ERROR, "cache lookup failed for namespace %u",
+ reltup->relnamespace);
+
+ result = quote_qualified_identifier(nspname, relname);
+
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+/*
+ * generate_function_name
+ * Compute the name to display for a function specified by OID,
+ * given that it is being called with the specified actual arg names and
+ * types. (Those matter because of ambiguous-function resolution rules.)
+ *
+ * If we're dealing with a potentially variadic function (in practice, this
+ * means a FuncExpr or Aggref, not some other way of calling a function), then
+ * has_variadic must specify whether variadic arguments have been merged,
+ * and *use_variadic_p will be set to indicate whether to print VARIADIC in
+ * the output. For non-FuncExpr cases, has_variadic should be false and
+ * use_variadic_p can be NULL.
+ *
+ * The result includes all necessary quoting and schema-prefixing.
+ */
+static char *
+generate_function_name(Oid funcid, int nargs, List *argnames, Oid *argtypes,
+ bool has_variadic, bool *use_variadic_p,
+ ParseExprKind special_exprkind)
+{
+ char *result;
+ HeapTuple proctup;
+ Form_pg_proc procform;
+ char *proname;
+ bool use_variadic;
+ char *nspname;
+ FuncDetailCode p_result;
+ Oid p_funcid;
+ Oid p_rettype;
+ bool p_retset;
+ int p_nvargs;
+ Oid p_vatype;
+ Oid *p_true_typeids;
+ bool force_qualify = false;
+
+ proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(proctup))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+ procform = (Form_pg_proc) GETSTRUCT(proctup);
+ proname = NameStr(procform->proname);
+
+ /*
+ * Due to parser hacks to avoid needing to reserve CUBE, we need to force
+ * qualification in some special cases.
+ */
+ if (special_exprkind == EXPR_KIND_GROUP_BY)
+ {
+ if (strcmp(proname, "cube") == 0 || strcmp(proname, "rollup") == 0)
+ force_qualify = true;
+ }
+
+ /*
+ * Determine whether VARIADIC should be printed. We must do this first
+ * since it affects the lookup rules in func_get_detail().
+ *
+ * We always print VARIADIC if the function has a merged variadic-array
+ * argument. Note that this is always the case for functions taking a
+ * VARIADIC argument type other than VARIADIC ANY. If we omitted VARIADIC
+ * and printed the array elements as separate arguments, the call could
+ * match a newer non-VARIADIC function.
+ */
+ if (use_variadic_p)
+ {
+ /* Parser should not have set funcvariadic unless fn is variadic */
+ Assert(!has_variadic || OidIsValid(procform->provariadic));
+ use_variadic = has_variadic;
+ *use_variadic_p = use_variadic;
+ }
+ else
+ {
+ Assert(!has_variadic);
+ use_variadic = false;
+ }
+
+ /*
+ * The idea here is to schema-qualify only if the parser would fail to
+ * resolve the correct function given the unqualified func name with the
+ * specified argtypes and VARIADIC flag. But if we already decided to
+ * force qualification, then we can skip the lookup and pretend we didn't
+ * find it.
+ */
+ if (!force_qualify)
+ p_result = func_get_detail(list_make1(makeString(proname)),
+ NIL, argnames, nargs, argtypes,
+ !use_variadic, true, false,
+ &p_funcid, &p_rettype,
+ &p_retset, &p_nvargs, &p_vatype,
+ &p_true_typeids, NULL);
+ else
+ {
+ p_result = FUNCDETAIL_NOTFOUND;
+ p_funcid = InvalidOid;
+ }
+
+ if ((p_result == FUNCDETAIL_NORMAL ||
+ p_result == FUNCDETAIL_AGGREGATE ||
+ p_result == FUNCDETAIL_WINDOWFUNC) &&
+ p_funcid == funcid)
+ nspname = NULL;
+ else
+ nspname = get_namespace_name_or_temp(procform->pronamespace);
+
+ result = quote_qualified_identifier(nspname, proname);
+
+ ReleaseSysCache(proctup);
+
+ return result;
+}
+
+/*
+ * generate_operator_name
+ * Compute the name to display for an operator specified by OID,
+ * given that it is being called with the specified actual arg types.
+ * (Arg types matter because of ambiguous-operator resolution rules.
+ * Pass InvalidOid for unused arg of a unary operator.)
+ *
+ * The result includes all necessary quoting and schema-prefixing,
+ * plus the OPERATOR() decoration needed to use a qualified operator name
+ * in an expression.
+ */
+static char *
+generate_operator_name(Oid operid, Oid arg1, Oid arg2)
+{
+ StringInfoData buf;
+ HeapTuple opertup;
+ Form_pg_operator operform;
+ char *oprname;
+ char *nspname;
+ Operator p_result;
+
+ initStringInfo(&buf);
+
+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operid));
+ if (!HeapTupleIsValid(opertup))
+ elog(ERROR, "cache lookup failed for operator %u", operid);
+ operform = (Form_pg_operator) GETSTRUCT(opertup);
+ oprname = NameStr(operform->oprname);
+
+ /*
+ * The idea here is to schema-qualify only if the parser would fail to
+ * resolve the correct operator given the unqualified op name with the
+ * specified argtypes.
+ */
+ switch (operform->oprkind)
+ {
+ case 'b':
+ p_result = oper(NULL, list_make1(makeString(oprname)), arg1, arg2,
+ true, -1);
+ break;
+ case 'l':
+ p_result = left_oper(NULL, list_make1(makeString(oprname)), arg2,
+ true, -1);
+ break;
+ default:
+ elog(ERROR, "unrecognized oprkind: %d", operform->oprkind);
+ p_result = NULL; /* keep compiler quiet */
+ break;
+ }
+
+ if (p_result != NULL && oprid(p_result) == operid)
+ nspname = NULL;
+ else
+ {
+ nspname = get_namespace_name_or_temp(operform->oprnamespace);
+ appendStringInfo(&buf, "OPERATOR(%s.", quote_identifier(nspname));
+ }
+
+ appendStringInfoString(&buf, oprname);
+
+ if (nspname)
+ appendStringInfoChar(&buf, ')');
+
+ if (p_result != NULL)
+ ReleaseSysCache(p_result);
+
+ ReleaseSysCache(opertup);
+
+ return buf.data;
+}
+
+/*
+ * generate_operator_clause --- generate a binary-operator WHERE clause
+ *
+ * This is used for internally-generated-and-executed SQL queries, where
+ * precision is essential and readability is secondary. The basic
+ * requirement is to append "leftop op rightop" to buf, where leftop and
+ * rightop are given as strings and are assumed to yield types leftoptype
+ * and rightoptype; the operator is identified by OID. The complexity
+ * comes from needing to be sure that the parser will select the desired
+ * operator when the query is parsed. We always name the operator using
+ * OPERATOR(schema.op) syntax, so as to avoid search-path uncertainties.
+ * We have to emit casts too, if either input isn't already the input type
+ * of the operator; else we are at the mercy of the parser's heuristics for
+ * ambiguous-operator resolution. The caller must ensure that leftop and
+ * rightop are suitable arguments for a cast operation; it's best to insert
+ * parentheses if they aren't just variables or parameters.
+ */
+void
+generate_operator_clause(StringInfo buf,
+ const char *leftop, Oid leftoptype,
+ Oid opoid,
+ const char *rightop, Oid rightoptype)
+{
+ HeapTuple opertup;
+ Form_pg_operator operform;
+ char *oprname;
+ char *nspname;
+
+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(opoid));
+ if (!HeapTupleIsValid(opertup))
+ elog(ERROR, "cache lookup failed for operator %u", opoid);
+ operform = (Form_pg_operator) GETSTRUCT(opertup);
+ Assert(operform->oprkind == 'b');
+ oprname = NameStr(operform->oprname);
+
+ nspname = get_namespace_name(operform->oprnamespace);
+
+ appendStringInfoString(buf, leftop);
+ if (leftoptype != operform->oprleft)
+ add_cast_to(buf, operform->oprleft);
+ appendStringInfo(buf, " OPERATOR(%s.", quote_identifier(nspname));
+ appendStringInfoString(buf, oprname);
+ appendStringInfo(buf, ") %s", rightop);
+ if (rightoptype != operform->oprright)
+ add_cast_to(buf, operform->oprright);
+
+ ReleaseSysCache(opertup);
+}
+
+/*
+ * Add a cast specification to buf. We spell out the type name the hard way,
+ * intentionally not using format_type_be(). This is to avoid corner cases
+ * for CHARACTER, BIT, and perhaps other types, where specifying the type
+ * using SQL-standard syntax results in undesirable data truncation. By
+ * doing it this way we can be certain that the cast will have default (-1)
+ * target typmod.
+ */
+static void
+add_cast_to(StringInfo buf, Oid typid)
+{
+ HeapTuple typetup;
+ Form_pg_type typform;
+ char *typname;
+ char *nspname;
+
+ typetup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(typetup))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typform = (Form_pg_type) GETSTRUCT(typetup);
+
+ typname = NameStr(typform->typname);
+ nspname = get_namespace_name_or_temp(typform->typnamespace);
+
+ appendStringInfo(buf, "::%s.%s",
+ quote_identifier(nspname), quote_identifier(typname));
+
+ ReleaseSysCache(typetup);
+}
+
+/*
+ * generate_qualified_type_name
+ * Compute the name to display for a type specified by OID
+ *
+ * This is different from format_type_be() in that we unconditionally
+ * schema-qualify the name. That also means no special syntax for
+ * SQL-standard type names ... although in current usage, this should
+ * only get used for domains, so such cases wouldn't occur anyway.
+ */
+static char *
+generate_qualified_type_name(Oid typid)
+{
+ HeapTuple tp;
+ Form_pg_type typtup;
+ char *typname;
+ char *nspname;
+ char *result;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ typname = NameStr(typtup->typname);
+
+ nspname = get_namespace_name_or_temp(typtup->typnamespace);
+ if (!nspname)
+ elog(ERROR, "cache lookup failed for namespace %u",
+ typtup->typnamespace);
+
+ result = quote_qualified_identifier(nspname, typname);
+
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+/*
+ * generate_collation_name
+ * Compute the name to display for a collation specified by OID
+ *
+ * The result includes all necessary quoting and schema-prefixing.
+ */
+char *
+generate_collation_name(Oid collid)
+{
+ HeapTuple tp;
+ Form_pg_collation colltup;
+ char *collname;
+ char *nspname;
+ char *result;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for collation %u", collid);
+ colltup = (Form_pg_collation) GETSTRUCT(tp);
+ collname = NameStr(colltup->collname);
+
+ if (!CollationIsVisible(collid))
+ nspname = get_namespace_name_or_temp(colltup->collnamespace);
+ else
+ nspname = NULL;
+
+ result = quote_qualified_identifier(nspname, collname);
+
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+/*
+ * Given a C string, produce a TEXT datum.
+ *
+ * We assume that the input was palloc'd and may be freed.
+ */
+static text *
+string_to_text(char *str)
+{
+ text *result;
+
+ result = cstring_to_text(str);
+ pfree(str);
+ return result;
+}
+
+/*
+ * Generate a C string representing a relation options from text[] datum.
+ */
+static void
+get_reloptions(StringInfo buf, Datum reloptions)
+{
+ Datum *options;
+ int noptions;
+ int i;
+
+ deconstruct_array(DatumGetArrayTypeP(reloptions),
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &options, NULL, &noptions);
+
+ for (i = 0; i < noptions; i++)
+ {
+ char *option = TextDatumGetCString(options[i]);
+ char *name;
+ char *separator;
+ char *value;
+
+ /*
+ * Each array element should have the form name=value. If the "=" is
+ * missing for some reason, treat it like an empty value.
+ */
+ name = option;
+ separator = strchr(option, '=');
+ if (separator)
+ {
+ *separator = '\0';
+ value = separator + 1;
+ }
+ else
+ value = "";
+
+ if (i > 0)
+ appendStringInfoString(buf, ", ");
+ appendStringInfo(buf, "%s=", quote_identifier(name));
+
+ /*
+ * In general we need to quote the value; but to avoid unnecessary
+ * clutter, do not quote if it is an identifier that would not need
+ * quoting. (We could also allow numbers, but that is a bit trickier
+ * than it looks --- for example, are leading zeroes significant? We
+ * don't want to assume very much here about what custom reloptions
+ * might mean.)
+ */
+ if (quote_identifier(value) == value)
+ appendStringInfoString(buf, value);
+ else
+ simple_quote_literal(buf, value);
+
+ pfree(option);
+ }
+}
+
+/*
+ * Generate a C string representing a relation's reloptions, or NULL if none.
+ */
+static char *
+flatten_reloptions(Oid relid)
+{
+ char *result = NULL;
+ HeapTuple tuple;
+ Datum reloptions;
+ bool isnull;
+
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+
+ reloptions = SysCacheGetAttr(RELOID, tuple,
+ Anum_pg_class_reloptions, &isnull);
+ if (!isnull)
+ {
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+ get_reloptions(&buf, reloptions);
+
+ result = buf.data;
+ }
+
+ ReleaseSysCache(tuple);
+
+ return result;
+}
+
+/*
+ * get_range_partbound_string
+ * A C string representation of one range partition bound
+ */
+char *
+get_range_partbound_string(List *bound_datums)
+{
+ deparse_context context;
+ StringInfo buf = makeStringInfo();
+ ListCell *cell;
+ char *sep;
+
+ memset(&context, 0, sizeof(deparse_context));
+ context.buf = buf;
+
+ appendStringInfoChar(buf, '(');
+ sep = "";
+ foreach(cell, bound_datums)
+ {
+ PartitionRangeDatum *datum =
+ lfirst_node(PartitionRangeDatum, cell);
+
+ appendStringInfoString(buf, sep);
+ if (datum->kind == PARTITION_RANGE_DATUM_MINVALUE)
+ appendStringInfoString(buf, "MINVALUE");
+ else if (datum->kind == PARTITION_RANGE_DATUM_MAXVALUE)
+ appendStringInfoString(buf, "MAXVALUE");
+ else
+ {
+ Const *val = castNode(Const, datum->value);
+
+ get_const_expr(val, &context, -1);
+ }
+ sep = ", ";
+ }
+ appendStringInfoChar(buf, ')');
+
+ return buf->data;
+}
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
new file mode 100644
index 0000000..2dd399d
--- /dev/null
+++ b/src/backend/utils/adt/selfuncs.c
@@ -0,0 +1,7961 @@
+/*-------------------------------------------------------------------------
+ *
+ * selfuncs.c
+ * Selectivity functions and index cost estimation functions for
+ * standard operators and index access methods.
+ *
+ * Selectivity routines are registered in the pg_operator catalog
+ * in the "oprrest" and "oprjoin" attributes.
+ *
+ * Index cost functions are located via the index AM's API struct,
+ * which is obtained from the handler function registered in pg_am.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/selfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*----------
+ * Operator selectivity estimation functions are called to estimate the
+ * selectivity of WHERE clauses whose top-level operator is their operator.
+ * We divide the problem into two cases:
+ * Restriction clause estimation: the clause involves vars of just
+ * one relation.
+ * Join clause estimation: the clause involves vars of multiple rels.
+ * Join selectivity estimation is far more difficult and usually less accurate
+ * than restriction estimation.
+ *
+ * When dealing with the inner scan of a nestloop join, we consider the
+ * join's joinclauses as restriction clauses for the inner relation, and
+ * treat vars of the outer relation as parameters (a/k/a constants of unknown
+ * values). So, restriction estimators need to be able to accept an argument
+ * telling which relation is to be treated as the variable.
+ *
+ * The call convention for a restriction estimator (oprrest function) is
+ *
+ * Selectivity oprrest (PlannerInfo *root,
+ * Oid operator,
+ * List *args,
+ * int varRelid);
+ *
+ * root: general information about the query (rtable and RelOptInfo lists
+ * are particularly important for the estimator).
+ * operator: OID of the specific operator in question.
+ * args: argument list from the operator clause.
+ * varRelid: if not zero, the relid (rtable index) of the relation to
+ * be treated as the variable relation. May be zero if the args list
+ * is known to contain vars of only one relation.
+ *
+ * This is represented at the SQL level (in pg_proc) as
+ *
+ * float8 oprrest (internal, oid, internal, int4);
+ *
+ * The result is a selectivity, that is, a fraction (0 to 1) of the rows
+ * of the relation that are expected to produce a TRUE result for the
+ * given operator.
+ *
+ * The call convention for a join estimator (oprjoin function) is similar
+ * except that varRelid is not needed, and instead join information is
+ * supplied:
+ *
+ * Selectivity oprjoin (PlannerInfo *root,
+ * Oid operator,
+ * List *args,
+ * JoinType jointype,
+ * SpecialJoinInfo *sjinfo);
+ *
+ * float8 oprjoin (internal, oid, internal, int2, internal);
+ *
+ * (Before Postgres 8.4, join estimators had only the first four of these
+ * parameters. That signature is still allowed, but deprecated.) The
+ * relationship between jointype and sjinfo is explained in the comments for
+ * clause_selectivity() --- the short version is that jointype is usually
+ * best ignored in favor of examining sjinfo.
+ *
+ * Join selectivity for regular inner and outer joins is defined as the
+ * fraction (0 to 1) of the cross product of the relations that is expected
+ * to produce a TRUE result for the given operator. For both semi and anti
+ * joins, however, the selectivity is defined as the fraction of the left-hand
+ * side relation's rows that are expected to have a match (ie, at least one
+ * row with a TRUE result) in the right-hand side.
+ *
+ * For both oprrest and oprjoin functions, the operator's input collation OID
+ * (if any) is passed using the standard fmgr mechanism, so that the estimator
+ * function can fetch it with PG_GET_COLLATION(). Note, however, that all
+ * statistics in pg_statistic are currently built using the relevant column's
+ * collation.
+ *----------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <math.h>
+
+#include "access/brin.h"
+#include "access/brin_page.h"
+#include "access/gin.h"
+#include "access/table.h"
+#include "access/tableam.h"
+#include "access/visibilitymap.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_statistic_ext.h"
+#include "executor/nodeAgg.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/clauses.h"
+#include "optimizer/cost.h"
+#include "optimizer/optimizer.h"
+#include "optimizer/pathnode.h"
+#include "optimizer/paths.h"
+#include "optimizer/plancat.h"
+#include "parser/parse_clause.h"
+#include "parser/parsetree.h"
+#include "statistics/statistics.h"
+#include "storage/bufmgr.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/index_selfuncs.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/pg_locale.h"
+#include "utils/rel.h"
+#include "utils/selfuncs.h"
+#include "utils/snapmgr.h"
+#include "utils/spccache.h"
+#include "utils/syscache.h"
+#include "utils/timestamp.h"
+#include "utils/typcache.h"
+
+
+/* Hooks for plugins to get control when we ask for stats */
+get_relation_stats_hook_type get_relation_stats_hook = NULL;
+get_index_stats_hook_type get_index_stats_hook = NULL;
+
+static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
+static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
+ VariableStatData *vardata1, VariableStatData *vardata2,
+ double nd1, double nd2,
+ bool isdefault1, bool isdefault2,
+ AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+ Form_pg_statistic stats1, Form_pg_statistic stats2,
+ bool have_mcvs1, bool have_mcvs2);
+static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+ VariableStatData *vardata1, VariableStatData *vardata2,
+ double nd1, double nd2,
+ bool isdefault1, bool isdefault2,
+ AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+ Form_pg_statistic stats1, Form_pg_statistic stats2,
+ bool have_mcvs1, bool have_mcvs2,
+ RelOptInfo *inner_rel);
+static bool estimate_multivariate_ndistinct(PlannerInfo *root,
+ RelOptInfo *rel, List **varinfos, double *ndistinct);
+static bool convert_to_scalar(Datum value, Oid valuetypid, Oid collid,
+ double *scaledvalue,
+ Datum lobound, Datum hibound, Oid boundstypid,
+ double *scaledlobound, double *scaledhibound);
+static double convert_numeric_to_scalar(Datum value, Oid typid, bool *failure);
+static void convert_string_to_scalar(char *value,
+ double *scaledvalue,
+ char *lobound,
+ double *scaledlobound,
+ char *hibound,
+ double *scaledhibound);
+static void convert_bytea_to_scalar(Datum value,
+ double *scaledvalue,
+ Datum lobound,
+ double *scaledlobound,
+ Datum hibound,
+ double *scaledhibound);
+static double convert_one_string_to_scalar(char *value,
+ int rangelo, int rangehi);
+static double convert_one_bytea_to_scalar(unsigned char *value, int valuelen,
+ int rangelo, int rangehi);
+static char *convert_string_datum(Datum value, Oid typid, Oid collid,
+ bool *failure);
+static double convert_timevalue_to_scalar(Datum value, Oid typid,
+ bool *failure);
+static void examine_simple_variable(PlannerInfo *root, Var *var,
+ VariableStatData *vardata);
+static bool get_variable_range(PlannerInfo *root, VariableStatData *vardata,
+ Oid sortop, Oid collation,
+ Datum *min, Datum *max);
+static void get_stats_slot_range(AttStatsSlot *sslot,
+ Oid opfuncoid, FmgrInfo *opproc,
+ Oid collation, int16 typLen, bool typByVal,
+ Datum *min, Datum *max, bool *p_have_data);
+static bool get_actual_variable_range(PlannerInfo *root,
+ VariableStatData *vardata,
+ Oid sortop, Oid collation,
+ Datum *min, Datum *max);
+static bool get_actual_variable_endpoint(Relation heapRel,
+ Relation indexRel,
+ ScanDirection indexscandir,
+ ScanKey scankeys,
+ int16 typLen,
+ bool typByVal,
+ TupleTableSlot *tableslot,
+ MemoryContext outercontext,
+ Datum *endpointDatum);
+static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
+
+
+/*
+ * eqsel - Selectivity of "=" for any data types.
+ *
+ * Note: this routine is also used to estimate selectivity for some
+ * operators that are not "=" but have comparable selectivity behavior,
+ * such as "~=" (geometric approximate-match). Even for "=", we must
+ * keep in mind that the left and right datatypes may differ.
+ */
+Datum
+eqsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8((float8) eqsel_internal(fcinfo, false));
+}
+
+/*
+ * Common code for eqsel() and neqsel()
+ */
+static double
+eqsel_internal(PG_FUNCTION_ARGS, bool negate)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ Oid collation = PG_GET_COLLATION();
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ double selec;
+
+ /*
+ * When asked about <>, we do the estimation using the corresponding =
+ * operator, then convert to <> via "1.0 - eq_selectivity - nullfrac".
+ */
+ if (negate)
+ {
+ operator = get_negator(operator);
+ if (!OidIsValid(operator))
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ return 1.0 - DEFAULT_EQ_SEL;
+ }
+ }
+
+ /*
+ * If expression is not variable = something or something = variable, then
+ * punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ return negate ? (1.0 - DEFAULT_EQ_SEL) : DEFAULT_EQ_SEL;
+
+ /*
+ * We can do a lot better if the something is a constant. (Note: the
+ * Const might result from estimation rather than being a simple constant
+ * in the query.)
+ */
+ if (IsA(other, Const))
+ selec = var_eq_const(&vardata, operator, collation,
+ ((Const *) other)->constvalue,
+ ((Const *) other)->constisnull,
+ varonleft, negate);
+ else
+ selec = var_eq_non_const(&vardata, operator, collation, other,
+ varonleft, negate);
+
+ ReleaseVariableStats(vardata);
+
+ return selec;
+}
+
+/*
+ * var_eq_const --- eqsel for var = const case
+ *
+ * This is exported so that some other estimation functions can use it.
+ */
+double
+var_eq_const(VariableStatData *vardata, Oid operator, Oid collation,
+ Datum constval, bool constisnull,
+ bool varonleft, bool negate)
+{
+ double selec;
+ double nullfrac = 0.0;
+ bool isdefault;
+ Oid opfuncoid;
+
+ /*
+ * If the constant is NULL, assume operator is strict and return zero, ie,
+ * operator will never return TRUE. (It's zero even for a negator op.)
+ */
+ if (constisnull)
+ return 0.0;
+
+ /*
+ * Grab the nullfrac for use below. Note we allow use of nullfrac
+ * regardless of security check.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ Form_pg_statistic stats;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+ nullfrac = stats->stanullfrac;
+ }
+
+ /*
+ * If we matched the var to a unique index or DISTINCT clause, assume
+ * there is exactly one match regardless of anything else. (This is
+ * slightly bogus, since the index or clause's equality operator might be
+ * different from ours, but it's much more likely to be right than
+ * ignoring the information.)
+ */
+ if (vardata->isunique && vardata->rel && vardata->rel->tuples >= 1.0)
+ {
+ selec = 1.0 / vardata->rel->tuples;
+ }
+ else if (HeapTupleIsValid(vardata->statsTuple) &&
+ statistic_proc_security_check(vardata,
+ (opfuncoid = get_opcode(operator))))
+ {
+ AttStatsSlot sslot;
+ bool match = false;
+ int i;
+
+ /*
+ * Is the constant "=" to any of the column's most common values?
+ * (Although the given operator may not really be "=", we will assume
+ * that seeing whether it returns TRUE is an appropriate test. If you
+ * don't like this, maybe you shouldn't be using eqsel for your
+ * operator...)
+ */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS))
+ {
+ LOCAL_FCINFO(fcinfo, 2);
+ FmgrInfo eqproc;
+
+ fmgr_info(opfuncoid, &eqproc);
+
+ /*
+ * Save a few cycles by setting up the fcinfo struct just once.
+ * Using FunctionCallInvoke directly also avoids failure if the
+ * eqproc returns NULL, though really equality functions should
+ * never do that.
+ */
+ InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+ /* be careful to apply operator right way 'round */
+ if (varonleft)
+ fcinfo->args[1].value = constval;
+ else
+ fcinfo->args[0].value = constval;
+
+ for (i = 0; i < sslot.nvalues; i++)
+ {
+ Datum fresult;
+
+ if (varonleft)
+ fcinfo->args[0].value = sslot.values[i];
+ else
+ fcinfo->args[1].value = sslot.values[i];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ {
+ match = true;
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* no most-common-value info available */
+ i = 0; /* keep compiler quiet */
+ }
+
+ if (match)
+ {
+ /*
+ * Constant is "=" to this common value. We know selectivity
+ * exactly (or as exactly as ANALYZE could calculate it, anyway).
+ */
+ selec = sslot.numbers[i];
+ }
+ else
+ {
+ /*
+ * Comparison is against a constant that is neither NULL nor any
+ * of the common values. Its selectivity cannot be more than
+ * this:
+ */
+ double sumcommon = 0.0;
+ double otherdistinct;
+
+ for (i = 0; i < sslot.nnumbers; i++)
+ sumcommon += sslot.numbers[i];
+ selec = 1.0 - sumcommon - nullfrac;
+ CLAMP_PROBABILITY(selec);
+
+ /*
+ * and in fact it's probably a good deal less. We approximate that
+ * all the not-common values share this remaining fraction
+ * equally, so we divide by the number of other distinct values.
+ */
+ otherdistinct = get_variable_numdistinct(vardata, &isdefault) -
+ sslot.nnumbers;
+ if (otherdistinct > 1)
+ selec /= otherdistinct;
+
+ /*
+ * Another cross-check: selectivity shouldn't be estimated as more
+ * than the least common "most common value".
+ */
+ if (sslot.nnumbers > 0 && selec > sslot.numbers[sslot.nnumbers - 1])
+ selec = sslot.numbers[sslot.nnumbers - 1];
+ }
+
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /*
+ * No ANALYZE stats available, so make a guess using estimated number
+ * of distinct values and assuming they are equally common. (The guess
+ * is unlikely to be very good, but we do know a few special cases.)
+ */
+ selec = 1.0 / get_variable_numdistinct(vardata, &isdefault);
+ }
+
+ /* now adjust if we wanted <> rather than = */
+ if (negate)
+ selec = 1.0 - selec - nullfrac;
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * var_eq_non_const --- eqsel for var = something-other-than-const case
+ *
+ * This is exported so that some other estimation functions can use it.
+ */
+double
+var_eq_non_const(VariableStatData *vardata, Oid operator, Oid collation,
+ Node *other,
+ bool varonleft, bool negate)
+{
+ double selec;
+ double nullfrac = 0.0;
+ bool isdefault;
+
+ /*
+ * Grab the nullfrac for use below.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ Form_pg_statistic stats;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+ nullfrac = stats->stanullfrac;
+ }
+
+ /*
+ * If we matched the var to a unique index or DISTINCT clause, assume
+ * there is exactly one match regardless of anything else. (This is
+ * slightly bogus, since the index or clause's equality operator might be
+ * different from ours, but it's much more likely to be right than
+ * ignoring the information.)
+ */
+ if (vardata->isunique && vardata->rel && vardata->rel->tuples >= 1.0)
+ {
+ selec = 1.0 / vardata->rel->tuples;
+ }
+ else if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ double ndistinct;
+ AttStatsSlot sslot;
+
+ /*
+ * Search is for a value that we do not know a priori, but we will
+ * assume it is not NULL. Estimate the selectivity as non-null
+ * fraction divided by number of distinct values, so that we get a
+ * result averaged over all possible values whether common or
+ * uncommon. (Essentially, we are assuming that the not-yet-known
+ * comparison value is equally likely to be any of the possible
+ * values, regardless of their frequency in the table. Is that a good
+ * idea?)
+ */
+ selec = 1.0 - nullfrac;
+ ndistinct = get_variable_numdistinct(vardata, &isdefault);
+ if (ndistinct > 1)
+ selec /= ndistinct;
+
+ /*
+ * Cross-check: selectivity should never be estimated as more than the
+ * most common value's.
+ */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ if (sslot.nnumbers > 0 && selec > sslot.numbers[0])
+ selec = sslot.numbers[0];
+ free_attstatsslot(&sslot);
+ }
+ }
+ else
+ {
+ /*
+ * No ANALYZE stats available, so make a guess using estimated number
+ * of distinct values and assuming they are equally common. (The guess
+ * is unlikely to be very good, but we do know a few special cases.)
+ */
+ selec = 1.0 / get_variable_numdistinct(vardata, &isdefault);
+ }
+
+ /* now adjust if we wanted <> rather than = */
+ if (negate)
+ selec = 1.0 - selec - nullfrac;
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * neqsel - Selectivity of "!=" for any data types.
+ *
+ * This routine is also used for some operators that are not "!="
+ * but have comparable selectivity behavior. See above comments
+ * for eqsel().
+ */
+Datum
+neqsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8((float8) eqsel_internal(fcinfo, true));
+}
+
+/*
+ * scalarineqsel - Selectivity of "<", "<=", ">", ">=" for scalars.
+ *
+ * This is the guts of scalarltsel/scalarlesel/scalargtsel/scalargesel.
+ * The isgt and iseq flags distinguish which of the four cases apply.
+ *
+ * The caller has commuted the clause, if necessary, so that we can treat
+ * the variable as being on the left. The caller must also make sure that
+ * the other side of the clause is a non-null Const, and dissect that into
+ * a value and datatype. (This definition simplifies some callers that
+ * want to estimate against a computed value instead of a Const node.)
+ *
+ * This routine works for any datatype (or pair of datatypes) known to
+ * convert_to_scalar(). If it is applied to some other datatype,
+ * it will return an approximate estimate based on assuming that the constant
+ * value falls in the middle of the bin identified by binary search.
+ */
+static double
+scalarineqsel(PlannerInfo *root, Oid operator, bool isgt, bool iseq,
+ Oid collation,
+ VariableStatData *vardata, Datum constval, Oid consttype)
+{
+ Form_pg_statistic stats;
+ FmgrInfo opproc;
+ double mcv_selec,
+ hist_selec,
+ sumcommon;
+ double selec;
+
+ if (!HeapTupleIsValid(vardata->statsTuple))
+ {
+ /*
+ * No stats are available. Typically this means we have to fall back
+ * on the default estimate; but if the variable is CTID then we can
+ * make an estimate based on comparing the constant to the table size.
+ */
+ if (vardata->var && IsA(vardata->var, Var) &&
+ ((Var *) vardata->var)->varattno == SelfItemPointerAttributeNumber)
+ {
+ ItemPointer itemptr;
+ double block;
+ double density;
+
+ /*
+ * If the relation's empty, we're going to include all of it.
+ * (This is mostly to avoid divide-by-zero below.)
+ */
+ if (vardata->rel->pages == 0)
+ return 1.0;
+
+ itemptr = (ItemPointer) DatumGetPointer(constval);
+ block = ItemPointerGetBlockNumberNoCheck(itemptr);
+
+ /*
+ * Determine the average number of tuples per page (density).
+ *
+ * Since the last page will, on average, be only half full, we can
+ * estimate it to have half as many tuples as earlier pages. So
+ * give it half the weight of a regular page.
+ */
+ density = vardata->rel->tuples / (vardata->rel->pages - 0.5);
+
+ /* If target is the last page, use half the density. */
+ if (block >= vardata->rel->pages - 1)
+ density *= 0.5;
+
+ /*
+ * Using the average tuples per page, calculate how far into the
+ * page the itemptr is likely to be and adjust block accordingly,
+ * by adding that fraction of a whole block (but never more than a
+ * whole block, no matter how high the itemptr's offset is). Here
+ * we are ignoring the possibility of dead-tuple line pointers,
+ * which is fairly bogus, but we lack the info to do better.
+ */
+ if (density > 0.0)
+ {
+ OffsetNumber offset = ItemPointerGetOffsetNumberNoCheck(itemptr);
+
+ block += Min(offset / density, 1.0);
+ }
+
+ /*
+ * Convert relative block number to selectivity. Again, the last
+ * page has only half weight.
+ */
+ selec = block / (vardata->rel->pages - 0.5);
+
+ /*
+ * The calculation so far gave us a selectivity for the "<=" case.
+ * We'll have one fewer tuple for "<" and one additional tuple for
+ * ">=", the latter of which we'll reverse the selectivity for
+ * below, so we can simply subtract one tuple for both cases. The
+ * cases that need this adjustment can be identified by iseq being
+ * equal to isgt.
+ */
+ if (iseq == isgt && vardata->rel->tuples >= 1.0)
+ selec -= (1.0 / vardata->rel->tuples);
+
+ /* Finally, reverse the selectivity for the ">", ">=" cases. */
+ if (isgt)
+ selec = 1.0 - selec;
+
+ CLAMP_PROBABILITY(selec);
+ return selec;
+ }
+
+ /* no stats available, so default result */
+ return DEFAULT_INEQ_SEL;
+ }
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+
+ fmgr_info(get_opcode(operator), &opproc);
+
+ /*
+ * If we have most-common-values info, add up the fractions of the MCV
+ * entries that satisfy MCV OP CONST. These fractions contribute directly
+ * to the result selectivity. Also add up the total fraction represented
+ * by MCV entries.
+ */
+ mcv_selec = mcv_selectivity(vardata, &opproc, collation, constval, true,
+ &sumcommon);
+
+ /*
+ * If there is a histogram, determine which bin the constant falls in, and
+ * compute the resulting contribution to selectivity.
+ */
+ hist_selec = ineq_histogram_selectivity(root, vardata,
+ operator, &opproc, isgt, iseq,
+ collation,
+ constval, consttype);
+
+ /*
+ * Now merge the results from the MCV and histogram calculations,
+ * realizing that the histogram covers only the non-null values that are
+ * not listed in MCV.
+ */
+ selec = 1.0 - stats->stanullfrac - sumcommon;
+
+ if (hist_selec >= 0.0)
+ selec *= hist_selec;
+ else
+ {
+ /*
+ * If no histogram but there are values not accounted for by MCV,
+ * arbitrarily assume half of them will match.
+ */
+ selec *= 0.5;
+ }
+
+ selec += mcv_selec;
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * mcv_selectivity - Examine the MCV list for selectivity estimates
+ *
+ * Determine the fraction of the variable's MCV population that satisfies
+ * the predicate (VAR OP CONST), or (CONST OP VAR) if !varonleft. Also
+ * compute the fraction of the total column population represented by the MCV
+ * list. This code will work for any boolean-returning predicate operator.
+ *
+ * The function result is the MCV selectivity, and the fraction of the
+ * total population is returned into *sumcommonp. Zeroes are returned
+ * if there is no MCV list.
+ */
+double
+mcv_selectivity(VariableStatData *vardata, FmgrInfo *opproc, Oid collation,
+ Datum constval, bool varonleft,
+ double *sumcommonp)
+{
+ double mcv_selec,
+ sumcommon;
+ AttStatsSlot sslot;
+ int i;
+
+ mcv_selec = 0.0;
+ sumcommon = 0.0;
+
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ statistic_proc_security_check(vardata, opproc->fn_oid) &&
+ get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS))
+ {
+ LOCAL_FCINFO(fcinfo, 2);
+
+ /*
+ * We invoke the opproc "by hand" so that we won't fail on NULL
+ * results. Such cases won't arise for normal comparison functions,
+ * but generic_restriction_selectivity could perhaps be used with
+ * operators that can return NULL. A small side benefit is to not
+ * need to re-initialize the fcinfo struct from scratch each time.
+ */
+ InitFunctionCallInfoData(*fcinfo, opproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+ /* be careful to apply operator right way 'round */
+ if (varonleft)
+ fcinfo->args[1].value = constval;
+ else
+ fcinfo->args[0].value = constval;
+
+ for (i = 0; i < sslot.nvalues; i++)
+ {
+ Datum fresult;
+
+ if (varonleft)
+ fcinfo->args[0].value = sslot.values[i];
+ else
+ fcinfo->args[1].value = sslot.values[i];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ mcv_selec += sslot.numbers[i];
+ sumcommon += sslot.numbers[i];
+ }
+ free_attstatsslot(&sslot);
+ }
+
+ *sumcommonp = sumcommon;
+ return mcv_selec;
+}
+
+/*
+ * histogram_selectivity - Examine the histogram for selectivity estimates
+ *
+ * Determine the fraction of the variable's histogram entries that satisfy
+ * the predicate (VAR OP CONST), or (CONST OP VAR) if !varonleft.
+ *
+ * This code will work for any boolean-returning predicate operator, whether
+ * or not it has anything to do with the histogram sort operator. We are
+ * essentially using the histogram just as a representative sample. However,
+ * small histograms are unlikely to be all that representative, so the caller
+ * should be prepared to fall back on some other estimation approach when the
+ * histogram is missing or very small. It may also be prudent to combine this
+ * approach with another one when the histogram is small.
+ *
+ * If the actual histogram size is not at least min_hist_size, we won't bother
+ * to do the calculation at all. Also, if the n_skip parameter is > 0, we
+ * ignore the first and last n_skip histogram elements, on the grounds that
+ * they are outliers and hence not very representative. Typical values for
+ * these parameters are 10 and 1.
+ *
+ * The function result is the selectivity, or -1 if there is no histogram
+ * or it's smaller than min_hist_size.
+ *
+ * The output parameter *hist_size receives the actual histogram size,
+ * or zero if no histogram. Callers may use this number to decide how
+ * much faith to put in the function result.
+ *
+ * Note that the result disregards both the most-common-values (if any) and
+ * null entries. The caller is expected to combine this result with
+ * statistics for those portions of the column population. It may also be
+ * prudent to clamp the result range, ie, disbelieve exact 0 or 1 outputs.
+ */
+double
+histogram_selectivity(VariableStatData *vardata,
+ FmgrInfo *opproc, Oid collation,
+ Datum constval, bool varonleft,
+ int min_hist_size, int n_skip,
+ int *hist_size)
+{
+ double result;
+ AttStatsSlot sslot;
+
+ /* check sanity of parameters */
+ Assert(n_skip >= 0);
+ Assert(min_hist_size > 2 * n_skip);
+
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ statistic_proc_security_check(vardata, opproc->fn_oid) &&
+ get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES))
+ {
+ *hist_size = sslot.nvalues;
+ if (sslot.nvalues >= min_hist_size)
+ {
+ LOCAL_FCINFO(fcinfo, 2);
+ int nmatch = 0;
+ int i;
+
+ /*
+ * We invoke the opproc "by hand" so that we won't fail on NULL
+ * results. Such cases won't arise for normal comparison
+ * functions, but generic_restriction_selectivity could perhaps be
+ * used with operators that can return NULL. A small side benefit
+ * is to not need to re-initialize the fcinfo struct from scratch
+ * each time.
+ */
+ InitFunctionCallInfoData(*fcinfo, opproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+ /* be careful to apply operator right way 'round */
+ if (varonleft)
+ fcinfo->args[1].value = constval;
+ else
+ fcinfo->args[0].value = constval;
+
+ for (i = n_skip; i < sslot.nvalues - n_skip; i++)
+ {
+ Datum fresult;
+
+ if (varonleft)
+ fcinfo->args[0].value = sslot.values[i];
+ else
+ fcinfo->args[1].value = sslot.values[i];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ nmatch++;
+ }
+ result = ((double) nmatch) / ((double) (sslot.nvalues - 2 * n_skip));
+ }
+ else
+ result = -1;
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ *hist_size = 0;
+ result = -1;
+ }
+
+ return result;
+}
+
+/*
+ * generic_restriction_selectivity - Selectivity for almost anything
+ *
+ * This function estimates selectivity for operators that we don't have any
+ * special knowledge about, but are on data types that we collect standard
+ * MCV and/or histogram statistics for. (Additional assumptions are that
+ * the operator is strict and immutable, or at least stable.)
+ *
+ * If we have "VAR OP CONST" or "CONST OP VAR", selectivity is estimated by
+ * applying the operator to each element of the column's MCV and/or histogram
+ * stats, and merging the results using the assumption that the histogram is
+ * a reasonable random sample of the column's non-MCV population. Note that
+ * if the operator's semantics are related to the histogram ordering, this
+ * might not be such a great assumption; other functions such as
+ * scalarineqsel() are probably a better match in such cases.
+ *
+ * Otherwise, fall back to the default selectivity provided by the caller.
+ */
+double
+generic_restriction_selectivity(PlannerInfo *root, Oid oproid, Oid collation,
+ List *args, int varRelid,
+ double default_selectivity)
+{
+ double selec;
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+
+ /*
+ * If expression is not variable OP something or something OP variable,
+ * then punt and return the default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ return default_selectivity;
+
+ /*
+ * If the something is a NULL constant, assume operator is strict and
+ * return zero, ie, operator will never return TRUE.
+ */
+ if (IsA(other, Const) &&
+ ((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ return 0.0;
+ }
+
+ if (IsA(other, Const))
+ {
+ /* Variable is being compared to a known non-null constant */
+ Datum constval = ((Const *) other)->constvalue;
+ FmgrInfo opproc;
+ double mcvsum;
+ double mcvsel;
+ double nullfrac;
+ int hist_size;
+
+ fmgr_info(get_opcode(oproid), &opproc);
+
+ /*
+ * Calculate the selectivity for the column's most common values.
+ */
+ mcvsel = mcv_selectivity(&vardata, &opproc, collation,
+ constval, varonleft,
+ &mcvsum);
+
+ /*
+ * If the histogram is large enough, see what fraction of it matches
+ * the query, and assume that's representative of the non-MCV
+ * population. Otherwise use the default selectivity for the non-MCV
+ * population.
+ */
+ selec = histogram_selectivity(&vardata, &opproc, collation,
+ constval, varonleft,
+ 10, 1, &hist_size);
+ if (selec < 0)
+ {
+ /* Nope, fall back on default */
+ selec = default_selectivity;
+ }
+ else if (hist_size < 100)
+ {
+ /*
+ * For histogram sizes from 10 to 100, we combine the histogram
+ * and default selectivities, putting increasingly more trust in
+ * the histogram for larger sizes.
+ */
+ double hist_weight = hist_size / 100.0;
+
+ selec = selec * hist_weight +
+ default_selectivity * (1.0 - hist_weight);
+ }
+
+ /* In any case, don't believe extremely small or large estimates. */
+ if (selec < 0.0001)
+ selec = 0.0001;
+ else if (selec > 0.9999)
+ selec = 0.9999;
+
+ /* Don't forget to account for nulls. */
+ if (HeapTupleIsValid(vardata.statsTuple))
+ nullfrac = ((Form_pg_statistic) GETSTRUCT(vardata.statsTuple))->stanullfrac;
+ else
+ nullfrac = 0.0;
+
+ /*
+ * Now merge the results from the MCV and histogram calculations,
+ * realizing that the histogram covers only the non-null values that
+ * are not listed in MCV.
+ */
+ selec *= 1.0 - nullfrac - mcvsum;
+ selec += mcvsel;
+ }
+ else
+ {
+ /* Comparison value is not constant, so we can't do anything */
+ selec = default_selectivity;
+ }
+
+ ReleaseVariableStats(vardata);
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return selec;
+}
+
+/*
+ * ineq_histogram_selectivity - Examine the histogram for scalarineqsel
+ *
+ * Determine the fraction of the variable's histogram population that
+ * satisfies the inequality condition, ie, VAR < (or <=, >, >=) CONST.
+ * The isgt and iseq flags distinguish which of the four cases apply.
+ *
+ * While opproc could be looked up from the operator OID, common callers
+ * also need to call it separately, so we make the caller pass both.
+ *
+ * Returns -1 if there is no histogram (valid results will always be >= 0).
+ *
+ * Note that the result disregards both the most-common-values (if any) and
+ * null entries. The caller is expected to combine this result with
+ * statistics for those portions of the column population.
+ *
+ * This is exported so that some other estimation functions can use it.
+ */
+double
+ineq_histogram_selectivity(PlannerInfo *root,
+ VariableStatData *vardata,
+ Oid opoid, FmgrInfo *opproc, bool isgt, bool iseq,
+ Oid collation,
+ Datum constval, Oid consttype)
+{
+ double hist_selec;
+ AttStatsSlot sslot;
+
+ hist_selec = -1.0;
+
+ /*
+ * Someday, ANALYZE might store more than one histogram per rel/att,
+ * corresponding to more than one possible sort ordering defined for the
+ * column type. Right now, we know there is only one, so just grab it and
+ * see if it matches the query.
+ *
+ * Note that we can't use opoid as search argument; the staop appearing in
+ * pg_statistic will be for the relevant '<' operator, but what we have
+ * might be some other inequality operator such as '>='. (Even if opoid
+ * is a '<' operator, it could be cross-type.) Hence we must use
+ * comparison_ops_are_compatible() to see if the operators match.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ statistic_proc_security_check(vardata, opproc->fn_oid) &&
+ get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES))
+ {
+ if (sslot.nvalues > 1 &&
+ sslot.stacoll == collation &&
+ comparison_ops_are_compatible(sslot.staop, opoid))
+ {
+ /*
+ * Use binary search to find the desired location, namely the
+ * right end of the histogram bin containing the comparison value,
+ * which is the leftmost entry for which the comparison operator
+ * succeeds (if isgt) or fails (if !isgt).
+ *
+ * In this loop, we pay no attention to whether the operator iseq
+ * or not; that detail will be mopped up below. (We cannot tell,
+ * anyway, whether the operator thinks the values are equal.)
+ *
+ * If the binary search accesses the first or last histogram
+ * entry, we try to replace that endpoint with the true column min
+ * or max as found by get_actual_variable_range(). This
+ * ameliorates misestimates when the min or max is moving as a
+ * result of changes since the last ANALYZE. Note that this could
+ * result in effectively including MCVs into the histogram that
+ * weren't there before, but we don't try to correct for that.
+ */
+ double histfrac;
+ int lobound = 0; /* first possible slot to search */
+ int hibound = sslot.nvalues; /* last+1 slot to search */
+ bool have_end = false;
+
+ /*
+ * If there are only two histogram entries, we'll want up-to-date
+ * values for both. (If there are more than two, we need at most
+ * one of them to be updated, so we deal with that within the
+ * loop.)
+ */
+ if (sslot.nvalues == 2)
+ have_end = get_actual_variable_range(root,
+ vardata,
+ sslot.staop,
+ collation,
+ &sslot.values[0],
+ &sslot.values[1]);
+
+ while (lobound < hibound)
+ {
+ int probe = (lobound + hibound) / 2;
+ bool ltcmp;
+
+ /*
+ * If we find ourselves about to compare to the first or last
+ * histogram entry, first try to replace it with the actual
+ * current min or max (unless we already did so above).
+ */
+ if (probe == 0 && sslot.nvalues > 2)
+ have_end = get_actual_variable_range(root,
+ vardata,
+ sslot.staop,
+ collation,
+ &sslot.values[0],
+ NULL);
+ else if (probe == sslot.nvalues - 1 && sslot.nvalues > 2)
+ have_end = get_actual_variable_range(root,
+ vardata,
+ sslot.staop,
+ collation,
+ NULL,
+ &sslot.values[probe]);
+
+ ltcmp = DatumGetBool(FunctionCall2Coll(opproc,
+ collation,
+ sslot.values[probe],
+ constval));
+ if (isgt)
+ ltcmp = !ltcmp;
+ if (ltcmp)
+ lobound = probe + 1;
+ else
+ hibound = probe;
+ }
+
+ if (lobound <= 0)
+ {
+ /*
+ * Constant is below lower histogram boundary. More
+ * precisely, we have found that no entry in the histogram
+ * satisfies the inequality clause (if !isgt) or they all do
+ * (if isgt). We estimate that that's true of the entire
+ * table, so set histfrac to 0.0 (which we'll flip to 1.0
+ * below, if isgt).
+ */
+ histfrac = 0.0;
+ }
+ else if (lobound >= sslot.nvalues)
+ {
+ /*
+ * Inverse case: constant is above upper histogram boundary.
+ */
+ histfrac = 1.0;
+ }
+ else
+ {
+ /* We have values[i-1] <= constant <= values[i]. */
+ int i = lobound;
+ double eq_selec = 0;
+ double val,
+ high,
+ low;
+ double binfrac;
+
+ /*
+ * In the cases where we'll need it below, obtain an estimate
+ * of the selectivity of "x = constval". We use a calculation
+ * similar to what var_eq_const() does for a non-MCV constant,
+ * ie, estimate that all distinct non-MCV values occur equally
+ * often. But multiplication by "1.0 - sumcommon - nullfrac"
+ * will be done by our caller, so we shouldn't do that here.
+ * Therefore we can't try to clamp the estimate by reference
+ * to the least common MCV; the result would be too small.
+ *
+ * Note: since this is effectively assuming that constval
+ * isn't an MCV, it's logically dubious if constval in fact is
+ * one. But we have to apply *some* correction for equality,
+ * and anyway we cannot tell if constval is an MCV, since we
+ * don't have a suitable equality operator at hand.
+ */
+ if (i == 1 || isgt == iseq)
+ {
+ double otherdistinct;
+ bool isdefault;
+ AttStatsSlot mcvslot;
+
+ /* Get estimated number of distinct values */
+ otherdistinct = get_variable_numdistinct(vardata,
+ &isdefault);
+
+ /* Subtract off the number of known MCVs */
+ if (get_attstatsslot(&mcvslot, vardata->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ otherdistinct -= mcvslot.nnumbers;
+ free_attstatsslot(&mcvslot);
+ }
+
+ /* If result doesn't seem sane, leave eq_selec at 0 */
+ if (otherdistinct > 1)
+ eq_selec = 1.0 / otherdistinct;
+ }
+
+ /*
+ * Convert the constant and the two nearest bin boundary
+ * values to a uniform comparison scale, and do a linear
+ * interpolation within this bin.
+ */
+ if (convert_to_scalar(constval, consttype, collation,
+ &val,
+ sslot.values[i - 1], sslot.values[i],
+ vardata->vartype,
+ &low, &high))
+ {
+ if (high <= low)
+ {
+ /* cope if bin boundaries appear identical */
+ binfrac = 0.5;
+ }
+ else if (val <= low)
+ binfrac = 0.0;
+ else if (val >= high)
+ binfrac = 1.0;
+ else
+ {
+ binfrac = (val - low) / (high - low);
+
+ /*
+ * Watch out for the possibility that we got a NaN or
+ * Infinity from the division. This can happen
+ * despite the previous checks, if for example "low"
+ * is -Infinity.
+ */
+ if (isnan(binfrac) ||
+ binfrac < 0.0 || binfrac > 1.0)
+ binfrac = 0.5;
+ }
+ }
+ else
+ {
+ /*
+ * Ideally we'd produce an error here, on the grounds that
+ * the given operator shouldn't have scalarXXsel
+ * registered as its selectivity func unless we can deal
+ * with its operand types. But currently, all manner of
+ * stuff is invoking scalarXXsel, so give a default
+ * estimate until that can be fixed.
+ */
+ binfrac = 0.5;
+ }
+
+ /*
+ * Now, compute the overall selectivity across the values
+ * represented by the histogram. We have i-1 full bins and
+ * binfrac partial bin below the constant.
+ */
+ histfrac = (double) (i - 1) + binfrac;
+ histfrac /= (double) (sslot.nvalues - 1);
+
+ /*
+ * At this point, histfrac is an estimate of the fraction of
+ * the population represented by the histogram that satisfies
+ * "x <= constval". Somewhat remarkably, this statement is
+ * true regardless of which operator we were doing the probes
+ * with, so long as convert_to_scalar() delivers reasonable
+ * results. If the probe constant is equal to some histogram
+ * entry, we would have considered the bin to the left of that
+ * entry if probing with "<" or ">=", or the bin to the right
+ * if probing with "<=" or ">"; but binfrac would have come
+ * out as 1.0 in the first case and 0.0 in the second, leading
+ * to the same histfrac in either case. For probe constants
+ * between histogram entries, we find the same bin and get the
+ * same estimate with any operator.
+ *
+ * The fact that the estimate corresponds to "x <= constval"
+ * and not "x < constval" is because of the way that ANALYZE
+ * constructs the histogram: each entry is, effectively, the
+ * rightmost value in its sample bucket. So selectivity
+ * values that are exact multiples of 1/(histogram_size-1)
+ * should be understood as estimates including a histogram
+ * entry plus everything to its left.
+ *
+ * However, that breaks down for the first histogram entry,
+ * which necessarily is the leftmost value in its sample
+ * bucket. That means the first histogram bin is slightly
+ * narrower than the rest, by an amount equal to eq_selec.
+ * Another way to say that is that we want "x <= leftmost" to
+ * be estimated as eq_selec not zero. So, if we're dealing
+ * with the first bin (i==1), rescale to make that true while
+ * adjusting the rest of that bin linearly.
+ */
+ if (i == 1)
+ histfrac += eq_selec * (1.0 - binfrac);
+
+ /*
+ * "x <= constval" is good if we want an estimate for "<=" or
+ * ">", but if we are estimating for "<" or ">=", we now need
+ * to decrease the estimate by eq_selec.
+ */
+ if (isgt == iseq)
+ histfrac -= eq_selec;
+ }
+
+ /*
+ * Now the estimate is finished for "<" and "<=" cases. If we are
+ * estimating for ">" or ">=", flip it.
+ */
+ hist_selec = isgt ? (1.0 - histfrac) : histfrac;
+
+ /*
+ * The histogram boundaries are only approximate to begin with,
+ * and may well be out of date anyway. Therefore, don't believe
+ * extremely small or large selectivity estimates --- unless we
+ * got actual current endpoint values from the table, in which
+ * case just do the usual sanity clamp. Somewhat arbitrarily, we
+ * set the cutoff for other cases at a hundredth of the histogram
+ * resolution.
+ */
+ if (have_end)
+ CLAMP_PROBABILITY(hist_selec);
+ else
+ {
+ double cutoff = 0.01 / (double) (sslot.nvalues - 1);
+
+ if (hist_selec < cutoff)
+ hist_selec = cutoff;
+ else if (hist_selec > 1.0 - cutoff)
+ hist_selec = 1.0 - cutoff;
+ }
+ }
+ else if (sslot.nvalues > 1)
+ {
+ /*
+ * If we get here, we have a histogram but it's not sorted the way
+ * we want. Do a brute-force search to see how many of the
+ * entries satisfy the comparison condition, and take that
+ * fraction as our estimate. (This is identical to the inner loop
+ * of histogram_selectivity; maybe share code?)
+ */
+ LOCAL_FCINFO(fcinfo, 2);
+ int nmatch = 0;
+
+ InitFunctionCallInfoData(*fcinfo, opproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[1].value = constval;
+ for (int i = 0; i < sslot.nvalues; i++)
+ {
+ Datum fresult;
+
+ fcinfo->args[0].value = sslot.values[i];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ nmatch++;
+ }
+ hist_selec = ((double) nmatch) / ((double) sslot.nvalues);
+
+ /*
+ * As above, clamp to a hundredth of the histogram resolution.
+ * This case is surely even less trustworthy than the normal one,
+ * so we shouldn't believe exact 0 or 1 selectivity. (Maybe the
+ * clamp should be more restrictive in this case?)
+ */
+ {
+ double cutoff = 0.01 / (double) (sslot.nvalues - 1);
+
+ if (hist_selec < cutoff)
+ hist_selec = cutoff;
+ else if (hist_selec > 1.0 - cutoff)
+ hist_selec = 1.0 - cutoff;
+ }
+ }
+
+ free_attstatsslot(&sslot);
+ }
+
+ return hist_selec;
+}
+
+/*
+ * Common wrapper function for the selectivity estimators that simply
+ * invoke scalarineqsel().
+ */
+static Datum
+scalarineqsel_wrapper(PG_FUNCTION_ARGS, bool isgt, bool iseq)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ Oid collation = PG_GET_COLLATION();
+ VariableStatData vardata;
+ Node *other;
+ bool varonleft;
+ Datum constval;
+ Oid consttype;
+ double selec;
+
+ /*
+ * If expression is not variable op something or something op variable,
+ * then punt and return a default estimate.
+ */
+ if (!get_restriction_variable(root, args, varRelid,
+ &vardata, &other, &varonleft))
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+
+ /*
+ * Can't do anything useful if the something is not a constant, either.
+ */
+ if (!IsA(other, Const))
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+ }
+
+ /*
+ * If the constant is NULL, assume operator is strict and return zero, ie,
+ * operator will never return TRUE.
+ */
+ if (((Const *) other)->constisnull)
+ {
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(0.0);
+ }
+ constval = ((Const *) other)->constvalue;
+ consttype = ((Const *) other)->consttype;
+
+ /*
+ * Force the var to be on the left to simplify logic in scalarineqsel.
+ */
+ if (!varonleft)
+ {
+ operator = get_commutator(operator);
+ if (!operator)
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ ReleaseVariableStats(vardata);
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+ }
+ isgt = !isgt;
+ }
+
+ /* The rest of the work is done by scalarineqsel(). */
+ selec = scalarineqsel(root, operator, isgt, iseq, collation,
+ &vardata, constval, consttype);
+
+ ReleaseVariableStats(vardata);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+/*
+ * scalarltsel - Selectivity of "<" for scalars.
+ */
+Datum
+scalarltsel(PG_FUNCTION_ARGS)
+{
+ return scalarineqsel_wrapper(fcinfo, false, false);
+}
+
+/*
+ * scalarlesel - Selectivity of "<=" for scalars.
+ */
+Datum
+scalarlesel(PG_FUNCTION_ARGS)
+{
+ return scalarineqsel_wrapper(fcinfo, false, true);
+}
+
+/*
+ * scalargtsel - Selectivity of ">" for scalars.
+ */
+Datum
+scalargtsel(PG_FUNCTION_ARGS)
+{
+ return scalarineqsel_wrapper(fcinfo, true, false);
+}
+
+/*
+ * scalargesel - Selectivity of ">=" for scalars.
+ */
+Datum
+scalargesel(PG_FUNCTION_ARGS)
+{
+ return scalarineqsel_wrapper(fcinfo, true, true);
+}
+
+/*
+ * boolvarsel - Selectivity of Boolean variable.
+ *
+ * This can actually be called on any boolean-valued expression. If it
+ * involves only Vars of the specified relation, and if there are statistics
+ * about the Var or expression (the latter is possible if it's indexed) then
+ * we'll produce a real estimate; otherwise it's just a default.
+ */
+Selectivity
+boolvarsel(PlannerInfo *root, Node *arg, int varRelid)
+{
+ VariableStatData vardata;
+ double selec;
+
+ examine_variable(root, arg, varRelid, &vardata);
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ /*
+ * A boolean variable V is equivalent to the clause V = 't', so we
+ * compute the selectivity as if that is what we have.
+ */
+ selec = var_eq_const(&vardata, BooleanEqualOperator, InvalidOid,
+ BoolGetDatum(true), false, true, false);
+ }
+ else
+ {
+ /* Otherwise, the default estimate is 0.5 */
+ selec = 0.5;
+ }
+ ReleaseVariableStats(vardata);
+ return selec;
+}
+
+/*
+ * booltestsel - Selectivity of BooleanTest Node.
+ */
+Selectivity
+booltestsel(PlannerInfo *root, BoolTestType booltesttype, Node *arg,
+ int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
+{
+ VariableStatData vardata;
+ double selec;
+
+ examine_variable(root, arg, varRelid, &vardata);
+
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ Form_pg_statistic stats;
+ double freq_null;
+ AttStatsSlot sslot;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+ freq_null = stats->stanullfrac;
+
+ if (get_attstatsslot(&sslot, vardata.statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS)
+ && sslot.nnumbers > 0)
+ {
+ double freq_true;
+ double freq_false;
+
+ /*
+ * Get first MCV frequency and derive frequency for true.
+ */
+ if (DatumGetBool(sslot.values[0]))
+ freq_true = sslot.numbers[0];
+ else
+ freq_true = 1.0 - sslot.numbers[0] - freq_null;
+
+ /*
+ * Next derive frequency for false. Then use these as appropriate
+ * to derive frequency for each case.
+ */
+ freq_false = 1.0 - freq_true - freq_null;
+
+ switch (booltesttype)
+ {
+ case IS_UNKNOWN:
+ /* select only NULL values */
+ selec = freq_null;
+ break;
+ case IS_NOT_UNKNOWN:
+ /* select non-NULL values */
+ selec = 1.0 - freq_null;
+ break;
+ case IS_TRUE:
+ /* select only TRUE values */
+ selec = freq_true;
+ break;
+ case IS_NOT_TRUE:
+ /* select non-TRUE values */
+ selec = 1.0 - freq_true;
+ break;
+ case IS_FALSE:
+ /* select only FALSE values */
+ selec = freq_false;
+ break;
+ case IS_NOT_FALSE:
+ /* select non-FALSE values */
+ selec = 1.0 - freq_false;
+ break;
+ default:
+ elog(ERROR, "unrecognized booltesttype: %d",
+ (int) booltesttype);
+ selec = 0.0; /* Keep compiler quiet */
+ break;
+ }
+
+ free_attstatsslot(&sslot);
+ }
+ else
+ {
+ /*
+ * No most-common-value info available. Still have null fraction
+ * information, so use it for IS [NOT] UNKNOWN. Otherwise adjust
+ * for null fraction and assume a 50-50 split of TRUE and FALSE.
+ */
+ switch (booltesttype)
+ {
+ case IS_UNKNOWN:
+ /* select only NULL values */
+ selec = freq_null;
+ break;
+ case IS_NOT_UNKNOWN:
+ /* select non-NULL values */
+ selec = 1.0 - freq_null;
+ break;
+ case IS_TRUE:
+ case IS_FALSE:
+ /* Assume we select half of the non-NULL values */
+ selec = (1.0 - freq_null) / 2.0;
+ break;
+ case IS_NOT_TRUE:
+ case IS_NOT_FALSE:
+ /* Assume we select NULLs plus half of the non-NULLs */
+ /* equiv. to freq_null + (1.0 - freq_null) / 2.0 */
+ selec = (freq_null + 1.0) / 2.0;
+ break;
+ default:
+ elog(ERROR, "unrecognized booltesttype: %d",
+ (int) booltesttype);
+ selec = 0.0; /* Keep compiler quiet */
+ break;
+ }
+ }
+ }
+ else
+ {
+ /*
+ * If we can't get variable statistics for the argument, perhaps
+ * clause_selectivity can do something with it. We ignore the
+ * possibility of a NULL value when using clause_selectivity, and just
+ * assume the value is either TRUE or FALSE.
+ */
+ switch (booltesttype)
+ {
+ case IS_UNKNOWN:
+ selec = DEFAULT_UNK_SEL;
+ break;
+ case IS_NOT_UNKNOWN:
+ selec = DEFAULT_NOT_UNK_SEL;
+ break;
+ case IS_TRUE:
+ case IS_NOT_FALSE:
+ selec = (double) clause_selectivity(root, arg,
+ varRelid,
+ jointype, sjinfo);
+ break;
+ case IS_FALSE:
+ case IS_NOT_TRUE:
+ selec = 1.0 - (double) clause_selectivity(root, arg,
+ varRelid,
+ jointype, sjinfo);
+ break;
+ default:
+ elog(ERROR, "unrecognized booltesttype: %d",
+ (int) booltesttype);
+ selec = 0.0; /* Keep compiler quiet */
+ break;
+ }
+ }
+
+ ReleaseVariableStats(vardata);
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return (Selectivity) selec;
+}
+
+/*
+ * nulltestsel - Selectivity of NullTest Node.
+ */
+Selectivity
+nulltestsel(PlannerInfo *root, NullTestType nulltesttype, Node *arg,
+ int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
+{
+ VariableStatData vardata;
+ double selec;
+
+ examine_variable(root, arg, varRelid, &vardata);
+
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ Form_pg_statistic stats;
+ double freq_null;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+ freq_null = stats->stanullfrac;
+
+ switch (nulltesttype)
+ {
+ case IS_NULL:
+
+ /*
+ * Use freq_null directly.
+ */
+ selec = freq_null;
+ break;
+ case IS_NOT_NULL:
+
+ /*
+ * Select not unknown (not null) values. Calculate from
+ * freq_null.
+ */
+ selec = 1.0 - freq_null;
+ break;
+ default:
+ elog(ERROR, "unrecognized nulltesttype: %d",
+ (int) nulltesttype);
+ return (Selectivity) 0; /* keep compiler quiet */
+ }
+ }
+ else if (vardata.var && IsA(vardata.var, Var) &&
+ ((Var *) vardata.var)->varattno < 0)
+ {
+ /*
+ * There are no stats for system columns, but we know they are never
+ * NULL.
+ */
+ selec = (nulltesttype == IS_NULL) ? 0.0 : 1.0;
+ }
+ else
+ {
+ /*
+ * No ANALYZE stats available, so make a guess
+ */
+ switch (nulltesttype)
+ {
+ case IS_NULL:
+ selec = DEFAULT_UNK_SEL;
+ break;
+ case IS_NOT_NULL:
+ selec = DEFAULT_NOT_UNK_SEL;
+ break;
+ default:
+ elog(ERROR, "unrecognized nulltesttype: %d",
+ (int) nulltesttype);
+ return (Selectivity) 0; /* keep compiler quiet */
+ }
+ }
+
+ ReleaseVariableStats(vardata);
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(selec);
+
+ return (Selectivity) selec;
+}
+
+/*
+ * strip_array_coercion - strip binary-compatible relabeling from an array expr
+ *
+ * For array values, the parser normally generates ArrayCoerceExpr conversions,
+ * but it seems possible that RelabelType might show up. Also, the planner
+ * is not currently tense about collapsing stacked ArrayCoerceExpr nodes,
+ * so we need to be ready to deal with more than one level.
+ */
+static Node *
+strip_array_coercion(Node *node)
+{
+ for (;;)
+ {
+ if (node && IsA(node, ArrayCoerceExpr))
+ {
+ ArrayCoerceExpr *acoerce = (ArrayCoerceExpr *) node;
+
+ /*
+ * If the per-element expression is just a RelabelType on top of
+ * CaseTestExpr, then we know it's a binary-compatible relabeling.
+ */
+ if (IsA(acoerce->elemexpr, RelabelType) &&
+ IsA(((RelabelType *) acoerce->elemexpr)->arg, CaseTestExpr))
+ node = (Node *) acoerce->arg;
+ else
+ break;
+ }
+ else if (node && IsA(node, RelabelType))
+ {
+ /* We don't really expect this case, but may as well cope */
+ node = (Node *) ((RelabelType *) node)->arg;
+ }
+ else
+ break;
+ }
+ return node;
+}
+
+/*
+ * scalararraysel - Selectivity of ScalarArrayOpExpr Node.
+ */
+Selectivity
+scalararraysel(PlannerInfo *root,
+ ScalarArrayOpExpr *clause,
+ bool is_join_clause,
+ int varRelid,
+ JoinType jointype,
+ SpecialJoinInfo *sjinfo)
+{
+ Oid operator = clause->opno;
+ bool useOr = clause->useOr;
+ bool isEquality = false;
+ bool isInequality = false;
+ Node *leftop;
+ Node *rightop;
+ Oid nominal_element_type;
+ Oid nominal_element_collation;
+ TypeCacheEntry *typentry;
+ RegProcedure oprsel;
+ FmgrInfo oprselproc;
+ Selectivity s1;
+ Selectivity s1disjoint;
+
+ /* First, deconstruct the expression */
+ Assert(list_length(clause->args) == 2);
+ leftop = (Node *) linitial(clause->args);
+ rightop = (Node *) lsecond(clause->args);
+
+ /* aggressively reduce both sides to constants */
+ leftop = estimate_expression_value(root, leftop);
+ rightop = estimate_expression_value(root, rightop);
+
+ /* get nominal (after relabeling) element type of rightop */
+ nominal_element_type = get_base_element_type(exprType(rightop));
+ if (!OidIsValid(nominal_element_type))
+ return (Selectivity) 0.5; /* probably shouldn't happen */
+ /* get nominal collation, too, for generating constants */
+ nominal_element_collation = exprCollation(rightop);
+
+ /* look through any binary-compatible relabeling of rightop */
+ rightop = strip_array_coercion(rightop);
+
+ /*
+ * Detect whether the operator is the default equality or inequality
+ * operator of the array element type.
+ */
+ typentry = lookup_type_cache(nominal_element_type, TYPECACHE_EQ_OPR);
+ if (OidIsValid(typentry->eq_opr))
+ {
+ if (operator == typentry->eq_opr)
+ isEquality = true;
+ else if (get_negator(operator) == typentry->eq_opr)
+ isInequality = true;
+ }
+
+ /*
+ * If it is equality or inequality, we might be able to estimate this as a
+ * form of array containment; for instance "const = ANY(column)" can be
+ * treated as "ARRAY[const] <@ column". scalararraysel_containment tries
+ * that, and returns the selectivity estimate if successful, or -1 if not.
+ */
+ if ((isEquality || isInequality) && !is_join_clause)
+ {
+ s1 = scalararraysel_containment(root, leftop, rightop,
+ nominal_element_type,
+ isEquality, useOr, varRelid);
+ if (s1 >= 0.0)
+ return s1;
+ }
+
+ /*
+ * Look up the underlying operator's selectivity estimator. Punt if it
+ * hasn't got one.
+ */
+ if (is_join_clause)
+ oprsel = get_oprjoin(operator);
+ else
+ oprsel = get_oprrest(operator);
+ if (!oprsel)
+ return (Selectivity) 0.5;
+ fmgr_info(oprsel, &oprselproc);
+
+ /*
+ * In the array-containment check above, we must only believe that an
+ * operator is equality or inequality if it is the default btree equality
+ * operator (or its negator) for the element type, since those are the
+ * operators that array containment will use. But in what follows, we can
+ * be a little laxer, and also believe that any operators using eqsel() or
+ * neqsel() as selectivity estimator act like equality or inequality.
+ */
+ if (oprsel == F_EQSEL || oprsel == F_EQJOINSEL)
+ isEquality = true;
+ else if (oprsel == F_NEQSEL || oprsel == F_NEQJOINSEL)
+ isInequality = true;
+
+ /*
+ * We consider three cases:
+ *
+ * 1. rightop is an Array constant: deconstruct the array, apply the
+ * operator's selectivity function for each array element, and merge the
+ * results in the same way that clausesel.c does for AND/OR combinations.
+ *
+ * 2. rightop is an ARRAY[] construct: apply the operator's selectivity
+ * function for each element of the ARRAY[] construct, and merge.
+ *
+ * 3. otherwise, make a guess ...
+ */
+ if (rightop && IsA(rightop, Const))
+ {
+ Datum arraydatum = ((Const *) rightop)->constvalue;
+ bool arrayisnull = ((Const *) rightop)->constisnull;
+ ArrayType *arrayval;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ int num_elems;
+ Datum *elem_values;
+ bool *elem_nulls;
+ int i;
+
+ if (arrayisnull) /* qual can't succeed if null array */
+ return (Selectivity) 0.0;
+ arrayval = DatumGetArrayTypeP(arraydatum);
+ get_typlenbyvalalign(ARR_ELEMTYPE(arrayval),
+ &elmlen, &elmbyval, &elmalign);
+ deconstruct_array(arrayval,
+ ARR_ELEMTYPE(arrayval),
+ elmlen, elmbyval, elmalign,
+ &elem_values, &elem_nulls, &num_elems);
+
+ /*
+ * For generic operators, we assume the probability of success is
+ * independent for each array element. But for "= ANY" or "<> ALL",
+ * if the array elements are distinct (which'd typically be the case)
+ * then the probabilities are disjoint, and we should just sum them.
+ *
+ * If we were being really tense we would try to confirm that the
+ * elements are all distinct, but that would be expensive and it
+ * doesn't seem to be worth the cycles; it would amount to penalizing
+ * well-written queries in favor of poorly-written ones. However, we
+ * do protect ourselves a little bit by checking whether the
+ * disjointness assumption leads to an impossible (out of range)
+ * probability; if so, we fall back to the normal calculation.
+ */
+ s1 = s1disjoint = (useOr ? 0.0 : 1.0);
+
+ for (i = 0; i < num_elems; i++)
+ {
+ List *args;
+ Selectivity s2;
+
+ args = list_make2(leftop,
+ makeConst(nominal_element_type,
+ -1,
+ nominal_element_collation,
+ elmlen,
+ elem_values[i],
+ elem_nulls[i],
+ elmbyval));
+ if (is_join_clause)
+ s2 = DatumGetFloat8(FunctionCall5Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int16GetDatum(jointype),
+ PointerGetDatum(sjinfo)));
+ else
+ s2 = DatumGetFloat8(FunctionCall4Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int32GetDatum(varRelid)));
+
+ if (useOr)
+ {
+ s1 = s1 + s2 - s1 * s2;
+ if (isEquality)
+ s1disjoint += s2;
+ }
+ else
+ {
+ s1 = s1 * s2;
+ if (isInequality)
+ s1disjoint += s2 - 1.0;
+ }
+ }
+
+ /* accept disjoint-probability estimate if in range */
+ if ((useOr ? isEquality : isInequality) &&
+ s1disjoint >= 0.0 && s1disjoint <= 1.0)
+ s1 = s1disjoint;
+ }
+ else if (rightop && IsA(rightop, ArrayExpr) &&
+ !((ArrayExpr *) rightop)->multidims)
+ {
+ ArrayExpr *arrayexpr = (ArrayExpr *) rightop;
+ int16 elmlen;
+ bool elmbyval;
+ ListCell *l;
+
+ get_typlenbyval(arrayexpr->element_typeid,
+ &elmlen, &elmbyval);
+
+ /*
+ * We use the assumption of disjoint probabilities here too, although
+ * the odds of equal array elements are rather higher if the elements
+ * are not all constants (which they won't be, else constant folding
+ * would have reduced the ArrayExpr to a Const). In this path it's
+ * critical to have the sanity check on the s1disjoint estimate.
+ */
+ s1 = s1disjoint = (useOr ? 0.0 : 1.0);
+
+ foreach(l, arrayexpr->elements)
+ {
+ Node *elem = (Node *) lfirst(l);
+ List *args;
+ Selectivity s2;
+
+ /*
+ * Theoretically, if elem isn't of nominal_element_type we should
+ * insert a RelabelType, but it seems unlikely that any operator
+ * estimation function would really care ...
+ */
+ args = list_make2(leftop, elem);
+ if (is_join_clause)
+ s2 = DatumGetFloat8(FunctionCall5Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int16GetDatum(jointype),
+ PointerGetDatum(sjinfo)));
+ else
+ s2 = DatumGetFloat8(FunctionCall4Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int32GetDatum(varRelid)));
+
+ if (useOr)
+ {
+ s1 = s1 + s2 - s1 * s2;
+ if (isEquality)
+ s1disjoint += s2;
+ }
+ else
+ {
+ s1 = s1 * s2;
+ if (isInequality)
+ s1disjoint += s2 - 1.0;
+ }
+ }
+
+ /* accept disjoint-probability estimate if in range */
+ if ((useOr ? isEquality : isInequality) &&
+ s1disjoint >= 0.0 && s1disjoint <= 1.0)
+ s1 = s1disjoint;
+ }
+ else
+ {
+ CaseTestExpr *dummyexpr;
+ List *args;
+ Selectivity s2;
+ int i;
+
+ /*
+ * We need a dummy rightop to pass to the operator selectivity
+ * routine. It can be pretty much anything that doesn't look like a
+ * constant; CaseTestExpr is a convenient choice.
+ */
+ dummyexpr = makeNode(CaseTestExpr);
+ dummyexpr->typeId = nominal_element_type;
+ dummyexpr->typeMod = -1;
+ dummyexpr->collation = clause->inputcollid;
+ args = list_make2(leftop, dummyexpr);
+ if (is_join_clause)
+ s2 = DatumGetFloat8(FunctionCall5Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int16GetDatum(jointype),
+ PointerGetDatum(sjinfo)));
+ else
+ s2 = DatumGetFloat8(FunctionCall4Coll(&oprselproc,
+ clause->inputcollid,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(operator),
+ PointerGetDatum(args),
+ Int32GetDatum(varRelid)));
+ s1 = useOr ? 0.0 : 1.0;
+
+ /*
+ * Arbitrarily assume 10 elements in the eventual array value (see
+ * also estimate_array_length). We don't risk an assumption of
+ * disjoint probabilities here.
+ */
+ for (i = 0; i < 10; i++)
+ {
+ if (useOr)
+ s1 = s1 + s2 - s1 * s2;
+ else
+ s1 = s1 * s2;
+ }
+ }
+
+ /* result should be in range, but make sure... */
+ CLAMP_PROBABILITY(s1);
+
+ return s1;
+}
+
+/*
+ * Estimate number of elements in the array yielded by an expression.
+ *
+ * It's important that this agree with scalararraysel.
+ */
+int
+estimate_array_length(Node *arrayexpr)
+{
+ /* look through any binary-compatible relabeling of arrayexpr */
+ arrayexpr = strip_array_coercion(arrayexpr);
+
+ if (arrayexpr && IsA(arrayexpr, Const))
+ {
+ Datum arraydatum = ((Const *) arrayexpr)->constvalue;
+ bool arrayisnull = ((Const *) arrayexpr)->constisnull;
+ ArrayType *arrayval;
+
+ if (arrayisnull)
+ return 0;
+ arrayval = DatumGetArrayTypeP(arraydatum);
+ return ArrayGetNItems(ARR_NDIM(arrayval), ARR_DIMS(arrayval));
+ }
+ else if (arrayexpr && IsA(arrayexpr, ArrayExpr) &&
+ !((ArrayExpr *) arrayexpr)->multidims)
+ {
+ return list_length(((ArrayExpr *) arrayexpr)->elements);
+ }
+ else
+ {
+ /* default guess --- see also scalararraysel */
+ return 10;
+ }
+}
+
+/*
+ * rowcomparesel - Selectivity of RowCompareExpr Node.
+ *
+ * We estimate RowCompare selectivity by considering just the first (high
+ * order) columns, which makes it equivalent to an ordinary OpExpr. While
+ * this estimate could be refined by considering additional columns, it
+ * seems unlikely that we could do a lot better without multi-column
+ * statistics.
+ */
+Selectivity
+rowcomparesel(PlannerInfo *root,
+ RowCompareExpr *clause,
+ int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
+{
+ Selectivity s1;
+ Oid opno = linitial_oid(clause->opnos);
+ Oid inputcollid = linitial_oid(clause->inputcollids);
+ List *opargs;
+ bool is_join_clause;
+
+ /* Build equivalent arg list for single operator */
+ opargs = list_make2(linitial(clause->largs), linitial(clause->rargs));
+
+ /*
+ * Decide if it's a join clause. This should match clausesel.c's
+ * treat_as_join_clause(), except that we intentionally consider only the
+ * leading columns and not the rest of the clause.
+ */
+ if (varRelid != 0)
+ {
+ /*
+ * Caller is forcing restriction mode (eg, because we are examining an
+ * inner indexscan qual).
+ */
+ is_join_clause = false;
+ }
+ else if (sjinfo == NULL)
+ {
+ /*
+ * It must be a restriction clause, since it's being evaluated at a
+ * scan node.
+ */
+ is_join_clause = false;
+ }
+ else
+ {
+ /*
+ * Otherwise, it's a join if there's more than one relation used.
+ */
+ is_join_clause = (NumRelids(root, (Node *) opargs) > 1);
+ }
+
+ if (is_join_clause)
+ {
+ /* Estimate selectivity for a join clause. */
+ s1 = join_selectivity(root, opno,
+ opargs,
+ inputcollid,
+ jointype,
+ sjinfo);
+ }
+ else
+ {
+ /* Estimate selectivity for a restriction clause. */
+ s1 = restriction_selectivity(root, opno,
+ opargs,
+ inputcollid,
+ varRelid);
+ }
+
+ return s1;
+}
+
+/*
+ * eqjoinsel - Join selectivity of "="
+ */
+Datum
+eqjoinsel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+
+#ifdef NOT_USED
+ JoinType jointype = (JoinType) PG_GETARG_INT16(3);
+#endif
+ SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) PG_GETARG_POINTER(4);
+ Oid collation = PG_GET_COLLATION();
+ double selec;
+ double selec_inner;
+ VariableStatData vardata1;
+ VariableStatData vardata2;
+ double nd1;
+ double nd2;
+ bool isdefault1;
+ bool isdefault2;
+ Oid opfuncoid;
+ AttStatsSlot sslot1;
+ AttStatsSlot sslot2;
+ Form_pg_statistic stats1 = NULL;
+ Form_pg_statistic stats2 = NULL;
+ bool have_mcvs1 = false;
+ bool have_mcvs2 = false;
+ bool join_is_reversed;
+ RelOptInfo *inner_rel;
+
+ get_join_variables(root, args, sjinfo,
+ &vardata1, &vardata2, &join_is_reversed);
+
+ nd1 = get_variable_numdistinct(&vardata1, &isdefault1);
+ nd2 = get_variable_numdistinct(&vardata2, &isdefault2);
+
+ opfuncoid = get_opcode(operator);
+
+ memset(&sslot1, 0, sizeof(sslot1));
+ memset(&sslot2, 0, sizeof(sslot2));
+
+ if (HeapTupleIsValid(vardata1.statsTuple))
+ {
+ /* note we allow use of nullfrac regardless of security check */
+ stats1 = (Form_pg_statistic) GETSTRUCT(vardata1.statsTuple);
+ if (statistic_proc_security_check(&vardata1, opfuncoid))
+ have_mcvs1 = get_attstatsslot(&sslot1, vardata1.statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ }
+
+ if (HeapTupleIsValid(vardata2.statsTuple))
+ {
+ /* note we allow use of nullfrac regardless of security check */
+ stats2 = (Form_pg_statistic) GETSTRUCT(vardata2.statsTuple);
+ if (statistic_proc_security_check(&vardata2, opfuncoid))
+ have_mcvs2 = get_attstatsslot(&sslot2, vardata2.statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
+ }
+
+ /* We need to compute the inner-join selectivity in all cases */
+ selec_inner = eqjoinsel_inner(opfuncoid, collation,
+ &vardata1, &vardata2,
+ nd1, nd2,
+ isdefault1, isdefault2,
+ &sslot1, &sslot2,
+ stats1, stats2,
+ have_mcvs1, have_mcvs2);
+
+ switch (sjinfo->jointype)
+ {
+ case JOIN_INNER:
+ case JOIN_LEFT:
+ case JOIN_FULL:
+ selec = selec_inner;
+ break;
+ case JOIN_SEMI:
+ case JOIN_ANTI:
+
+ /*
+ * Look up the join's inner relation. min_righthand is sufficient
+ * information because neither SEMI nor ANTI joins permit any
+ * reassociation into or out of their RHS, so the righthand will
+ * always be exactly that set of rels.
+ */
+ inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
+
+ if (!join_is_reversed)
+ selec = eqjoinsel_semi(opfuncoid, collation,
+ &vardata1, &vardata2,
+ nd1, nd2,
+ isdefault1, isdefault2,
+ &sslot1, &sslot2,
+ stats1, stats2,
+ have_mcvs1, have_mcvs2,
+ inner_rel);
+ else
+ {
+ Oid commop = get_commutator(operator);
+ Oid commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
+
+ selec = eqjoinsel_semi(commopfuncoid, collation,
+ &vardata2, &vardata1,
+ nd2, nd1,
+ isdefault2, isdefault1,
+ &sslot2, &sslot1,
+ stats2, stats1,
+ have_mcvs2, have_mcvs1,
+ inner_rel);
+ }
+
+ /*
+ * We should never estimate the output of a semijoin to be more
+ * rows than we estimate for an inner join with the same input
+ * rels and join condition; it's obviously impossible for that to
+ * happen. The former estimate is N1 * Ssemi while the latter is
+ * N1 * N2 * Sinner, so we may clamp Ssemi <= N2 * Sinner. Doing
+ * this is worthwhile because of the shakier estimation rules we
+ * use in eqjoinsel_semi, particularly in cases where it has to
+ * punt entirely.
+ */
+ selec = Min(selec, inner_rel->rows * selec_inner);
+ break;
+ default:
+ /* other values not expected here */
+ elog(ERROR, "unrecognized join type: %d",
+ (int) sjinfo->jointype);
+ selec = 0; /* keep compiler quiet */
+ break;
+ }
+
+ free_attstatsslot(&sslot1);
+ free_attstatsslot(&sslot2);
+
+ ReleaseVariableStats(vardata1);
+ ReleaseVariableStats(vardata2);
+
+ CLAMP_PROBABILITY(selec);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+/*
+ * eqjoinsel_inner --- eqjoinsel for normal inner join
+ *
+ * We also use this for LEFT/FULL outer joins; it's not presently clear
+ * that it's worth trying to distinguish them here.
+ */
+static double
+eqjoinsel_inner(Oid opfuncoid, Oid collation,
+ VariableStatData *vardata1, VariableStatData *vardata2,
+ double nd1, double nd2,
+ bool isdefault1, bool isdefault2,
+ AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+ Form_pg_statistic stats1, Form_pg_statistic stats2,
+ bool have_mcvs1, bool have_mcvs2)
+{
+ double selec;
+
+ if (have_mcvs1 && have_mcvs2)
+ {
+ /*
+ * We have most-common-value lists for both relations. Run through
+ * the lists to see which MCVs actually join to each other with the
+ * given operator. This allows us to determine the exact join
+ * selectivity for the portion of the relations represented by the MCV
+ * lists. We still have to estimate for the remaining population, but
+ * in a skewed distribution this gives us a big leg up in accuracy.
+ * For motivation see the analysis in Y. Ioannidis and S.
+ * Christodoulakis, "On the propagation of errors in the size of join
+ * results", Technical Report 1018, Computer Science Dept., University
+ * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
+ */
+ LOCAL_FCINFO(fcinfo, 2);
+ FmgrInfo eqproc;
+ bool *hasmatch1;
+ bool *hasmatch2;
+ double nullfrac1 = stats1->stanullfrac;
+ double nullfrac2 = stats2->stanullfrac;
+ double matchprodfreq,
+ matchfreq1,
+ matchfreq2,
+ unmatchfreq1,
+ unmatchfreq2,
+ otherfreq1,
+ otherfreq2,
+ totalsel1,
+ totalsel2;
+ int i,
+ nmatches;
+
+ fmgr_info(opfuncoid, &eqproc);
+
+ /*
+ * Save a few cycles by setting up the fcinfo struct just once. Using
+ * FunctionCallInvoke directly also avoids failure if the eqproc
+ * returns NULL, though really equality functions should never do
+ * that.
+ */
+ InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+
+ hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
+ hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
+
+ /*
+ * Note we assume that each MCV will match at most one member of the
+ * other MCV list. If the operator isn't really equality, there could
+ * be multiple matches --- but we don't look for them, both for speed
+ * and because the math wouldn't add up...
+ */
+ matchprodfreq = 0.0;
+ nmatches = 0;
+ for (i = 0; i < sslot1->nvalues; i++)
+ {
+ int j;
+
+ fcinfo->args[0].value = sslot1->values[i];
+
+ for (j = 0; j < sslot2->nvalues; j++)
+ {
+ Datum fresult;
+
+ if (hasmatch2[j])
+ continue;
+ fcinfo->args[1].value = sslot2->values[j];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ {
+ hasmatch1[i] = hasmatch2[j] = true;
+ matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+ nmatches++;
+ break;
+ }
+ }
+ }
+ CLAMP_PROBABILITY(matchprodfreq);
+ /* Sum up frequencies of matched and unmatched MCVs */
+ matchfreq1 = unmatchfreq1 = 0.0;
+ for (i = 0; i < sslot1->nvalues; i++)
+ {
+ if (hasmatch1[i])
+ matchfreq1 += sslot1->numbers[i];
+ else
+ unmatchfreq1 += sslot1->numbers[i];
+ }
+ CLAMP_PROBABILITY(matchfreq1);
+ CLAMP_PROBABILITY(unmatchfreq1);
+ matchfreq2 = unmatchfreq2 = 0.0;
+ for (i = 0; i < sslot2->nvalues; i++)
+ {
+ if (hasmatch2[i])
+ matchfreq2 += sslot2->numbers[i];
+ else
+ unmatchfreq2 += sslot2->numbers[i];
+ }
+ CLAMP_PROBABILITY(matchfreq2);
+ CLAMP_PROBABILITY(unmatchfreq2);
+ pfree(hasmatch1);
+ pfree(hasmatch2);
+
+ /*
+ * Compute total frequency of non-null values that are not in the MCV
+ * lists.
+ */
+ otherfreq1 = 1.0 - nullfrac1 - matchfreq1 - unmatchfreq1;
+ otherfreq2 = 1.0 - nullfrac2 - matchfreq2 - unmatchfreq2;
+ CLAMP_PROBABILITY(otherfreq1);
+ CLAMP_PROBABILITY(otherfreq2);
+
+ /*
+ * We can estimate the total selectivity from the point of view of
+ * relation 1 as: the known selectivity for matched MCVs, plus
+ * unmatched MCVs that are assumed to match against random members of
+ * relation 2's non-MCV population, plus non-MCV values that are
+ * assumed to match against random members of relation 2's unmatched
+ * MCVs plus non-MCV values.
+ */
+ totalsel1 = matchprodfreq;
+ if (nd2 > sslot2->nvalues)
+ totalsel1 += unmatchfreq1 * otherfreq2 / (nd2 - sslot2->nvalues);
+ if (nd2 > nmatches)
+ totalsel1 += otherfreq1 * (otherfreq2 + unmatchfreq2) /
+ (nd2 - nmatches);
+ /* Same estimate from the point of view of relation 2. */
+ totalsel2 = matchprodfreq;
+ if (nd1 > sslot1->nvalues)
+ totalsel2 += unmatchfreq2 * otherfreq1 / (nd1 - sslot1->nvalues);
+ if (nd1 > nmatches)
+ totalsel2 += otherfreq2 * (otherfreq1 + unmatchfreq1) /
+ (nd1 - nmatches);
+
+ /*
+ * Use the smaller of the two estimates. This can be justified in
+ * essentially the same terms as given below for the no-stats case: to
+ * a first approximation, we are estimating from the point of view of
+ * the relation with smaller nd.
+ */
+ selec = (totalsel1 < totalsel2) ? totalsel1 : totalsel2;
+ }
+ else
+ {
+ /*
+ * We do not have MCV lists for both sides. Estimate the join
+ * selectivity as MIN(1/nd1,1/nd2)*(1-nullfrac1)*(1-nullfrac2). This
+ * is plausible if we assume that the join operator is strict and the
+ * non-null values are about equally distributed: a given non-null
+ * tuple of rel1 will join to either zero or N2*(1-nullfrac2)/nd2 rows
+ * of rel2, so total join rows are at most
+ * N1*(1-nullfrac1)*N2*(1-nullfrac2)/nd2 giving a join selectivity of
+ * not more than (1-nullfrac1)*(1-nullfrac2)/nd2. By the same logic it
+ * is not more than (1-nullfrac1)*(1-nullfrac2)/nd1, so the expression
+ * with MIN() is an upper bound. Using the MIN() means we estimate
+ * from the point of view of the relation with smaller nd (since the
+ * larger nd is determining the MIN). It is reasonable to assume that
+ * most tuples in this rel will have join partners, so the bound is
+ * probably reasonably tight and should be taken as-is.
+ *
+ * XXX Can we be smarter if we have an MCV list for just one side? It
+ * seems that if we assume equal distribution for the other side, we
+ * end up with the same answer anyway.
+ */
+ double nullfrac1 = stats1 ? stats1->stanullfrac : 0.0;
+ double nullfrac2 = stats2 ? stats2->stanullfrac : 0.0;
+
+ selec = (1.0 - nullfrac1) * (1.0 - nullfrac2);
+ if (nd1 > nd2)
+ selec /= nd1;
+ else
+ selec /= nd2;
+ }
+
+ return selec;
+}
+
+/*
+ * eqjoinsel_semi --- eqjoinsel for semi join
+ *
+ * (Also used for anti join, which we are supposed to estimate the same way.)
+ * Caller has ensured that vardata1 is the LHS variable.
+ * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
+ */
+static double
+eqjoinsel_semi(Oid opfuncoid, Oid collation,
+ VariableStatData *vardata1, VariableStatData *vardata2,
+ double nd1, double nd2,
+ bool isdefault1, bool isdefault2,
+ AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+ Form_pg_statistic stats1, Form_pg_statistic stats2,
+ bool have_mcvs1, bool have_mcvs2,
+ RelOptInfo *inner_rel)
+{
+ double selec;
+
+ /*
+ * We clamp nd2 to be not more than what we estimate the inner relation's
+ * size to be. This is intuitively somewhat reasonable since obviously
+ * there can't be more than that many distinct values coming from the
+ * inner rel. The reason for the asymmetry (ie, that we don't clamp nd1
+ * likewise) is that this is the only pathway by which restriction clauses
+ * applied to the inner rel will affect the join result size estimate,
+ * since set_joinrel_size_estimates will multiply SEMI/ANTI selectivity by
+ * only the outer rel's size. If we clamped nd1 we'd be double-counting
+ * the selectivity of outer-rel restrictions.
+ *
+ * We can apply this clamping both with respect to the base relation from
+ * which the join variable comes (if there is just one), and to the
+ * immediate inner input relation of the current join.
+ *
+ * If we clamp, we can treat nd2 as being a non-default estimate; it's not
+ * great, maybe, but it didn't come out of nowhere either. This is most
+ * helpful when the inner relation is empty and consequently has no stats.
+ */
+ if (vardata2->rel)
+ {
+ if (nd2 >= vardata2->rel->rows)
+ {
+ nd2 = vardata2->rel->rows;
+ isdefault2 = false;
+ }
+ }
+ if (nd2 >= inner_rel->rows)
+ {
+ nd2 = inner_rel->rows;
+ isdefault2 = false;
+ }
+
+ if (have_mcvs1 && have_mcvs2 && OidIsValid(opfuncoid))
+ {
+ /*
+ * We have most-common-value lists for both relations. Run through
+ * the lists to see which MCVs actually join to each other with the
+ * given operator. This allows us to determine the exact join
+ * selectivity for the portion of the relations represented by the MCV
+ * lists. We still have to estimate for the remaining population, but
+ * in a skewed distribution this gives us a big leg up in accuracy.
+ */
+ LOCAL_FCINFO(fcinfo, 2);
+ FmgrInfo eqproc;
+ bool *hasmatch1;
+ bool *hasmatch2;
+ double nullfrac1 = stats1->stanullfrac;
+ double matchfreq1,
+ uncertainfrac,
+ uncertain;
+ int i,
+ nmatches,
+ clamped_nvalues2;
+
+ /*
+ * The clamping above could have resulted in nd2 being less than
+ * sslot2->nvalues; in which case, we assume that precisely the nd2
+ * most common values in the relation will appear in the join input,
+ * and so compare to only the first nd2 members of the MCV list. Of
+ * course this is frequently wrong, but it's the best bet we can make.
+ */
+ clamped_nvalues2 = Min(sslot2->nvalues, nd2);
+
+ fmgr_info(opfuncoid, &eqproc);
+
+ /*
+ * Save a few cycles by setting up the fcinfo struct just once. Using
+ * FunctionCallInvoke directly also avoids failure if the eqproc
+ * returns NULL, though really equality functions should never do
+ * that.
+ */
+ InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+ NULL, NULL);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].isnull = false;
+
+ hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
+ hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
+
+ /*
+ * Note we assume that each MCV will match at most one member of the
+ * other MCV list. If the operator isn't really equality, there could
+ * be multiple matches --- but we don't look for them, both for speed
+ * and because the math wouldn't add up...
+ */
+ nmatches = 0;
+ for (i = 0; i < sslot1->nvalues; i++)
+ {
+ int j;
+
+ fcinfo->args[0].value = sslot1->values[i];
+
+ for (j = 0; j < clamped_nvalues2; j++)
+ {
+ Datum fresult;
+
+ if (hasmatch2[j])
+ continue;
+ fcinfo->args[1].value = sslot2->values[j];
+ fcinfo->isnull = false;
+ fresult = FunctionCallInvoke(fcinfo);
+ if (!fcinfo->isnull && DatumGetBool(fresult))
+ {
+ hasmatch1[i] = hasmatch2[j] = true;
+ nmatches++;
+ break;
+ }
+ }
+ }
+ /* Sum up frequencies of matched MCVs */
+ matchfreq1 = 0.0;
+ for (i = 0; i < sslot1->nvalues; i++)
+ {
+ if (hasmatch1[i])
+ matchfreq1 += sslot1->numbers[i];
+ }
+ CLAMP_PROBABILITY(matchfreq1);
+ pfree(hasmatch1);
+ pfree(hasmatch2);
+
+ /*
+ * Now we need to estimate the fraction of relation 1 that has at
+ * least one join partner. We know for certain that the matched MCVs
+ * do, so that gives us a lower bound, but we're really in the dark
+ * about everything else. Our crude approach is: if nd1 <= nd2 then
+ * assume all non-null rel1 rows have join partners, else assume for
+ * the uncertain rows that a fraction nd2/nd1 have join partners. We
+ * can discount the known-matched MCVs from the distinct-values counts
+ * before doing the division.
+ *
+ * Crude as the above is, it's completely useless if we don't have
+ * reliable ndistinct values for both sides. Hence, if either nd1 or
+ * nd2 is default, punt and assume half of the uncertain rows have
+ * join partners.
+ */
+ if (!isdefault1 && !isdefault2)
+ {
+ nd1 -= nmatches;
+ nd2 -= nmatches;
+ if (nd1 <= nd2 || nd2 < 0)
+ uncertainfrac = 1.0;
+ else
+ uncertainfrac = nd2 / nd1;
+ }
+ else
+ uncertainfrac = 0.5;
+ uncertain = 1.0 - matchfreq1 - nullfrac1;
+ CLAMP_PROBABILITY(uncertain);
+ selec = matchfreq1 + uncertainfrac * uncertain;
+ }
+ else
+ {
+ /*
+ * Without MCV lists for both sides, we can only use the heuristic
+ * about nd1 vs nd2.
+ */
+ double nullfrac1 = stats1 ? stats1->stanullfrac : 0.0;
+
+ if (!isdefault1 && !isdefault2)
+ {
+ if (nd1 <= nd2 || nd2 < 0)
+ selec = 1.0 - nullfrac1;
+ else
+ selec = (nd2 / nd1) * (1.0 - nullfrac1);
+ }
+ else
+ selec = 0.5 * (1.0 - nullfrac1);
+ }
+
+ return selec;
+}
+
+/*
+ * neqjoinsel - Join selectivity of "!="
+ */
+Datum
+neqjoinsel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ JoinType jointype = (JoinType) PG_GETARG_INT16(3);
+ SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) PG_GETARG_POINTER(4);
+ Oid collation = PG_GET_COLLATION();
+ float8 result;
+
+ if (jointype == JOIN_SEMI || jointype == JOIN_ANTI)
+ {
+ /*
+ * For semi-joins, if there is more than one distinct value in the RHS
+ * relation then every non-null LHS row must find a row to join since
+ * it can only be equal to one of them. We'll assume that there is
+ * always more than one distinct RHS value for the sake of stability,
+ * though in theory we could have special cases for empty RHS
+ * (selectivity = 0) and single-distinct-value RHS (selectivity =
+ * fraction of LHS that has the same value as the single RHS value).
+ *
+ * For anti-joins, if we use the same assumption that there is more
+ * than one distinct key in the RHS relation, then every non-null LHS
+ * row must be suppressed by the anti-join.
+ *
+ * So either way, the selectivity estimate should be 1 - nullfrac.
+ */
+ VariableStatData leftvar;
+ VariableStatData rightvar;
+ bool reversed;
+ HeapTuple statsTuple;
+ double nullfrac;
+
+ get_join_variables(root, args, sjinfo, &leftvar, &rightvar, &reversed);
+ statsTuple = reversed ? rightvar.statsTuple : leftvar.statsTuple;
+ if (HeapTupleIsValid(statsTuple))
+ nullfrac = ((Form_pg_statistic) GETSTRUCT(statsTuple))->stanullfrac;
+ else
+ nullfrac = 0.0;
+ ReleaseVariableStats(leftvar);
+ ReleaseVariableStats(rightvar);
+
+ result = 1.0 - nullfrac;
+ }
+ else
+ {
+ /*
+ * We want 1 - eqjoinsel() where the equality operator is the one
+ * associated with this != operator, that is, its negator.
+ */
+ Oid eqop = get_negator(operator);
+
+ if (eqop)
+ {
+ result =
+ DatumGetFloat8(DirectFunctionCall5Coll(eqjoinsel,
+ collation,
+ PointerGetDatum(root),
+ ObjectIdGetDatum(eqop),
+ PointerGetDatum(args),
+ Int16GetDatum(jointype),
+ PointerGetDatum(sjinfo)));
+ }
+ else
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ result = DEFAULT_EQ_SEL;
+ }
+ result = 1.0 - result;
+ }
+
+ PG_RETURN_FLOAT8(result);
+}
+
+/*
+ * scalarltjoinsel - Join selectivity of "<" for scalars
+ */
+Datum
+scalarltjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+}
+
+/*
+ * scalarlejoinsel - Join selectivity of "<=" for scalars
+ */
+Datum
+scalarlejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+}
+
+/*
+ * scalargtjoinsel - Join selectivity of ">" for scalars
+ */
+Datum
+scalargtjoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+}
+
+/*
+ * scalargejoinsel - Join selectivity of ">=" for scalars
+ */
+Datum
+scalargejoinsel(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_FLOAT8(DEFAULT_INEQ_SEL);
+}
+
+
+/*
+ * mergejoinscansel - Scan selectivity of merge join.
+ *
+ * A merge join will stop as soon as it exhausts either input stream.
+ * Therefore, if we can estimate the ranges of both input variables,
+ * we can estimate how much of the input will actually be read. This
+ * can have a considerable impact on the cost when using indexscans.
+ *
+ * Also, we can estimate how much of each input has to be read before the
+ * first join pair is found, which will affect the join's startup time.
+ *
+ * clause should be a clause already known to be mergejoinable. opfamily,
+ * strategy, and nulls_first specify the sort ordering being used.
+ *
+ * The outputs are:
+ * *leftstart is set to the fraction of the left-hand variable expected
+ * to be scanned before the first join pair is found (0 to 1).
+ * *leftend is set to the fraction of the left-hand variable expected
+ * to be scanned before the join terminates (0 to 1).
+ * *rightstart, *rightend similarly for the right-hand variable.
+ */
+void
+mergejoinscansel(PlannerInfo *root, Node *clause,
+ Oid opfamily, int strategy, bool nulls_first,
+ Selectivity *leftstart, Selectivity *leftend,
+ Selectivity *rightstart, Selectivity *rightend)
+{
+ Node *left,
+ *right;
+ VariableStatData leftvar,
+ rightvar;
+ int op_strategy;
+ Oid op_lefttype;
+ Oid op_righttype;
+ Oid opno,
+ collation,
+ lsortop,
+ rsortop,
+ lstatop,
+ rstatop,
+ ltop,
+ leop,
+ revltop,
+ revleop;
+ bool isgt;
+ Datum leftmin,
+ leftmax,
+ rightmin,
+ rightmax;
+ double selec;
+
+ /* Set default results if we can't figure anything out. */
+ /* XXX should default "start" fraction be a bit more than 0? */
+ *leftstart = *rightstart = 0.0;
+ *leftend = *rightend = 1.0;
+
+ /* Deconstruct the merge clause */
+ if (!is_opclause(clause))
+ return; /* shouldn't happen */
+ opno = ((OpExpr *) clause)->opno;
+ collation = ((OpExpr *) clause)->inputcollid;
+ left = get_leftop((Expr *) clause);
+ right = get_rightop((Expr *) clause);
+ if (!right)
+ return; /* shouldn't happen */
+
+ /* Look for stats for the inputs */
+ examine_variable(root, left, 0, &leftvar);
+ examine_variable(root, right, 0, &rightvar);
+
+ /* Extract the operator's declared left/right datatypes */
+ get_op_opfamily_properties(opno, opfamily, false,
+ &op_strategy,
+ &op_lefttype,
+ &op_righttype);
+ Assert(op_strategy == BTEqualStrategyNumber);
+
+ /*
+ * Look up the various operators we need. If we don't find them all, it
+ * probably means the opfamily is broken, but we just fail silently.
+ *
+ * Note: we expect that pg_statistic histograms will be sorted by the '<'
+ * operator, regardless of which sort direction we are considering.
+ */
+ switch (strategy)
+ {
+ case BTLessStrategyNumber:
+ isgt = false;
+ if (op_lefttype == op_righttype)
+ {
+ /* easy case */
+ ltop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTLessStrategyNumber);
+ leop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTLessEqualStrategyNumber);
+ lsortop = ltop;
+ rsortop = ltop;
+ lstatop = lsortop;
+ rstatop = rsortop;
+ revltop = ltop;
+ revleop = leop;
+ }
+ else
+ {
+ ltop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTLessStrategyNumber);
+ leop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTLessEqualStrategyNumber);
+ lsortop = get_opfamily_member(opfamily,
+ op_lefttype, op_lefttype,
+ BTLessStrategyNumber);
+ rsortop = get_opfamily_member(opfamily,
+ op_righttype, op_righttype,
+ BTLessStrategyNumber);
+ lstatop = lsortop;
+ rstatop = rsortop;
+ revltop = get_opfamily_member(opfamily,
+ op_righttype, op_lefttype,
+ BTLessStrategyNumber);
+ revleop = get_opfamily_member(opfamily,
+ op_righttype, op_lefttype,
+ BTLessEqualStrategyNumber);
+ }
+ break;
+ case BTGreaterStrategyNumber:
+ /* descending-order case */
+ isgt = true;
+ if (op_lefttype == op_righttype)
+ {
+ /* easy case */
+ ltop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTGreaterStrategyNumber);
+ leop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTGreaterEqualStrategyNumber);
+ lsortop = ltop;
+ rsortop = ltop;
+ lstatop = get_opfamily_member(opfamily,
+ op_lefttype, op_lefttype,
+ BTLessStrategyNumber);
+ rstatop = lstatop;
+ revltop = ltop;
+ revleop = leop;
+ }
+ else
+ {
+ ltop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTGreaterStrategyNumber);
+ leop = get_opfamily_member(opfamily,
+ op_lefttype, op_righttype,
+ BTGreaterEqualStrategyNumber);
+ lsortop = get_opfamily_member(opfamily,
+ op_lefttype, op_lefttype,
+ BTGreaterStrategyNumber);
+ rsortop = get_opfamily_member(opfamily,
+ op_righttype, op_righttype,
+ BTGreaterStrategyNumber);
+ lstatop = get_opfamily_member(opfamily,
+ op_lefttype, op_lefttype,
+ BTLessStrategyNumber);
+ rstatop = get_opfamily_member(opfamily,
+ op_righttype, op_righttype,
+ BTLessStrategyNumber);
+ revltop = get_opfamily_member(opfamily,
+ op_righttype, op_lefttype,
+ BTGreaterStrategyNumber);
+ revleop = get_opfamily_member(opfamily,
+ op_righttype, op_lefttype,
+ BTGreaterEqualStrategyNumber);
+ }
+ break;
+ default:
+ goto fail; /* shouldn't get here */
+ }
+
+ if (!OidIsValid(lsortop) ||
+ !OidIsValid(rsortop) ||
+ !OidIsValid(lstatop) ||
+ !OidIsValid(rstatop) ||
+ !OidIsValid(ltop) ||
+ !OidIsValid(leop) ||
+ !OidIsValid(revltop) ||
+ !OidIsValid(revleop))
+ goto fail; /* insufficient info in catalogs */
+
+ /* Try to get ranges of both inputs */
+ if (!isgt)
+ {
+ if (!get_variable_range(root, &leftvar, lstatop, collation,
+ &leftmin, &leftmax))
+ goto fail; /* no range available from stats */
+ if (!get_variable_range(root, &rightvar, rstatop, collation,
+ &rightmin, &rightmax))
+ goto fail; /* no range available from stats */
+ }
+ else
+ {
+ /* need to swap the max and min */
+ if (!get_variable_range(root, &leftvar, lstatop, collation,
+ &leftmax, &leftmin))
+ goto fail; /* no range available from stats */
+ if (!get_variable_range(root, &rightvar, rstatop, collation,
+ &rightmax, &rightmin))
+ goto fail; /* no range available from stats */
+ }
+
+ /*
+ * Now, the fraction of the left variable that will be scanned is the
+ * fraction that's <= the right-side maximum value. But only believe
+ * non-default estimates, else stick with our 1.0.
+ */
+ selec = scalarineqsel(root, leop, isgt, true, collation, &leftvar,
+ rightmax, op_righttype);
+ if (selec != DEFAULT_INEQ_SEL)
+ *leftend = selec;
+
+ /* And similarly for the right variable. */
+ selec = scalarineqsel(root, revleop, isgt, true, collation, &rightvar,
+ leftmax, op_lefttype);
+ if (selec != DEFAULT_INEQ_SEL)
+ *rightend = selec;
+
+ /*
+ * Only one of the two "end" fractions can really be less than 1.0;
+ * believe the smaller estimate and reset the other one to exactly 1.0. If
+ * we get exactly equal estimates (as can easily happen with self-joins),
+ * believe neither.
+ */
+ if (*leftend > *rightend)
+ *leftend = 1.0;
+ else if (*leftend < *rightend)
+ *rightend = 1.0;
+ else
+ *leftend = *rightend = 1.0;
+
+ /*
+ * Also, the fraction of the left variable that will be scanned before the
+ * first join pair is found is the fraction that's < the right-side
+ * minimum value. But only believe non-default estimates, else stick with
+ * our own default.
+ */
+ selec = scalarineqsel(root, ltop, isgt, false, collation, &leftvar,
+ rightmin, op_righttype);
+ if (selec != DEFAULT_INEQ_SEL)
+ *leftstart = selec;
+
+ /* And similarly for the right variable. */
+ selec = scalarineqsel(root, revltop, isgt, false, collation, &rightvar,
+ leftmin, op_lefttype);
+ if (selec != DEFAULT_INEQ_SEL)
+ *rightstart = selec;
+
+ /*
+ * Only one of the two "start" fractions can really be more than zero;
+ * believe the larger estimate and reset the other one to exactly 0.0. If
+ * we get exactly equal estimates (as can easily happen with self-joins),
+ * believe neither.
+ */
+ if (*leftstart < *rightstart)
+ *leftstart = 0.0;
+ else if (*leftstart > *rightstart)
+ *rightstart = 0.0;
+ else
+ *leftstart = *rightstart = 0.0;
+
+ /*
+ * If the sort order is nulls-first, we're going to have to skip over any
+ * nulls too. These would not have been counted by scalarineqsel, and we
+ * can safely add in this fraction regardless of whether we believe
+ * scalarineqsel's results or not. But be sure to clamp the sum to 1.0!
+ */
+ if (nulls_first)
+ {
+ Form_pg_statistic stats;
+
+ if (HeapTupleIsValid(leftvar.statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(leftvar.statsTuple);
+ *leftstart += stats->stanullfrac;
+ CLAMP_PROBABILITY(*leftstart);
+ *leftend += stats->stanullfrac;
+ CLAMP_PROBABILITY(*leftend);
+ }
+ if (HeapTupleIsValid(rightvar.statsTuple))
+ {
+ stats = (Form_pg_statistic) GETSTRUCT(rightvar.statsTuple);
+ *rightstart += stats->stanullfrac;
+ CLAMP_PROBABILITY(*rightstart);
+ *rightend += stats->stanullfrac;
+ CLAMP_PROBABILITY(*rightend);
+ }
+ }
+
+ /* Disbelieve start >= end, just in case that can happen */
+ if (*leftstart >= *leftend)
+ {
+ *leftstart = 0.0;
+ *leftend = 1.0;
+ }
+ if (*rightstart >= *rightend)
+ {
+ *rightstart = 0.0;
+ *rightend = 1.0;
+ }
+
+fail:
+ ReleaseVariableStats(leftvar);
+ ReleaseVariableStats(rightvar);
+}
+
+
+/*
+ * matchingsel -- generic matching-operator selectivity support
+ *
+ * Use these for any operators that (a) are on data types for which we collect
+ * standard statistics, and (b) have behavior for which the default estimate
+ * (twice DEFAULT_EQ_SEL) is sane. Typically that is good for match-like
+ * operators.
+ */
+
+Datum
+matchingsel(PG_FUNCTION_ARGS)
+{
+ PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
+ Oid operator = PG_GETARG_OID(1);
+ List *args = (List *) PG_GETARG_POINTER(2);
+ int varRelid = PG_GETARG_INT32(3);
+ Oid collation = PG_GET_COLLATION();
+ double selec;
+
+ /* Use generic restriction selectivity logic. */
+ selec = generic_restriction_selectivity(root, operator, collation,
+ args, varRelid,
+ DEFAULT_MATCHING_SEL);
+
+ PG_RETURN_FLOAT8((float8) selec);
+}
+
+Datum
+matchingjoinsel(PG_FUNCTION_ARGS)
+{
+ /* Just punt, for the moment. */
+ PG_RETURN_FLOAT8(DEFAULT_MATCHING_SEL);
+}
+
+
+/*
+ * Helper routine for estimate_num_groups: add an item to a list of
+ * GroupVarInfos, but only if it's not known equal to any of the existing
+ * entries.
+ */
+typedef struct
+{
+ Node *var; /* might be an expression, not just a Var */
+ RelOptInfo *rel; /* relation it belongs to */
+ double ndistinct; /* # distinct values */
+ bool isdefault; /* true if DEFAULT_NUM_DISTINCT was used */
+} GroupVarInfo;
+
+static List *
+add_unique_group_var(PlannerInfo *root, List *varinfos,
+ Node *var, VariableStatData *vardata)
+{
+ GroupVarInfo *varinfo;
+ double ndistinct;
+ bool isdefault;
+ ListCell *lc;
+
+ ndistinct = get_variable_numdistinct(vardata, &isdefault);
+
+ foreach(lc, varinfos)
+ {
+ varinfo = (GroupVarInfo *) lfirst(lc);
+
+ /* Drop exact duplicates */
+ if (equal(var, varinfo->var))
+ return varinfos;
+
+ /*
+ * Drop known-equal vars, but only if they belong to different
+ * relations (see comments for estimate_num_groups)
+ */
+ if (vardata->rel != varinfo->rel &&
+ exprs_known_equal(root, var, varinfo->var))
+ {
+ if (varinfo->ndistinct <= ndistinct)
+ {
+ /* Keep older item, forget new one */
+ return varinfos;
+ }
+ else
+ {
+ /* Delete the older item */
+ varinfos = foreach_delete_current(varinfos, lc);
+ }
+ }
+ }
+
+ varinfo = (GroupVarInfo *) palloc(sizeof(GroupVarInfo));
+
+ varinfo->var = var;
+ varinfo->rel = vardata->rel;
+ varinfo->ndistinct = ndistinct;
+ varinfo->isdefault = isdefault;
+ varinfos = lappend(varinfos, varinfo);
+ return varinfos;
+}
+
+/*
+ * estimate_num_groups - Estimate number of groups in a grouped query
+ *
+ * Given a query having a GROUP BY clause, estimate how many groups there
+ * will be --- ie, the number of distinct combinations of the GROUP BY
+ * expressions.
+ *
+ * This routine is also used to estimate the number of rows emitted by
+ * a DISTINCT filtering step; that is an isomorphic problem. (Note:
+ * actually, we only use it for DISTINCT when there's no grouping or
+ * aggregation ahead of the DISTINCT.)
+ *
+ * Inputs:
+ * root - the query
+ * groupExprs - list of expressions being grouped by
+ * input_rows - number of rows estimated to arrive at the group/unique
+ * filter step
+ * pgset - NULL, or a List** pointing to a grouping set to filter the
+ * groupExprs against
+ *
+ * Outputs:
+ * estinfo - When passed as non-NULL, the function will set bits in the
+ * "flags" field in order to provide callers with additional information
+ * about the estimation. Currently, we only set the SELFLAG_USED_DEFAULT
+ * bit if we used any default values in the estimation.
+ *
+ * Given the lack of any cross-correlation statistics in the system, it's
+ * impossible to do anything really trustworthy with GROUP BY conditions
+ * involving multiple Vars. We should however avoid assuming the worst
+ * case (all possible cross-product terms actually appear as groups) since
+ * very often the grouped-by Vars are highly correlated. Our current approach
+ * is as follows:
+ * 1. Expressions yielding boolean are assumed to contribute two groups,
+ * independently of their content, and are ignored in the subsequent
+ * steps. This is mainly because tests like "col IS NULL" break the
+ * heuristic used in step 2 especially badly.
+ * 2. Reduce the given expressions to a list of unique Vars used. For
+ * example, GROUP BY a, a + b is treated the same as GROUP BY a, b.
+ * It is clearly correct not to count the same Var more than once.
+ * It is also reasonable to treat f(x) the same as x: f() cannot
+ * increase the number of distinct values (unless it is volatile,
+ * which we consider unlikely for grouping), but it probably won't
+ * reduce the number of distinct values much either.
+ * As a special case, if a GROUP BY expression can be matched to an
+ * expressional index for which we have statistics, then we treat the
+ * whole expression as though it were just a Var.
+ * 3. If the list contains Vars of different relations that are known equal
+ * due to equivalence classes, then drop all but one of the Vars from each
+ * known-equal set, keeping the one with smallest estimated # of values
+ * (since the extra values of the others can't appear in joined rows).
+ * Note the reason we only consider Vars of different relations is that
+ * if we considered ones of the same rel, we'd be double-counting the
+ * restriction selectivity of the equality in the next step.
+ * 4. For Vars within a single source rel, we multiply together the numbers
+ * of values, clamp to the number of rows in the rel (divided by 10 if
+ * more than one Var), and then multiply by a factor based on the
+ * selectivity of the restriction clauses for that rel. When there's
+ * more than one Var, the initial product is probably too high (it's the
+ * worst case) but clamping to a fraction of the rel's rows seems to be a
+ * helpful heuristic for not letting the estimate get out of hand. (The
+ * factor of 10 is derived from pre-Postgres-7.4 practice.) The factor
+ * we multiply by to adjust for the restriction selectivity assumes that
+ * the restriction clauses are independent of the grouping, which may not
+ * be a valid assumption, but it's hard to do better.
+ * 5. If there are Vars from multiple rels, we repeat step 4 for each such
+ * rel, and multiply the results together.
+ * Note that rels not containing grouped Vars are ignored completely, as are
+ * join clauses. Such rels cannot increase the number of groups, and we
+ * assume such clauses do not reduce the number either (somewhat bogus,
+ * but we don't have the info to do better).
+ */
+double
+estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows,
+ List **pgset, EstimationInfo *estinfo)
+{
+ List *varinfos = NIL;
+ double srf_multiplier = 1.0;
+ double numdistinct;
+ ListCell *l;
+ int i;
+
+ /* Zero the estinfo output parameter, if non-NULL */
+ if (estinfo != NULL)
+ memset(estinfo, 0, sizeof(EstimationInfo));
+
+ /*
+ * We don't ever want to return an estimate of zero groups, as that tends
+ * to lead to division-by-zero and other unpleasantness. The input_rows
+ * estimate is usually already at least 1, but clamp it just in case it
+ * isn't.
+ */
+ input_rows = clamp_row_est(input_rows);
+
+ /*
+ * If no grouping columns, there's exactly one group. (This can't happen
+ * for normal cases with GROUP BY or DISTINCT, but it is possible for
+ * corner cases with set operations.)
+ */
+ if (groupExprs == NIL || (pgset && list_length(*pgset) < 1))
+ return 1.0;
+
+ /*
+ * Count groups derived from boolean grouping expressions. For other
+ * expressions, find the unique Vars used, treating an expression as a Var
+ * if we can find stats for it. For each one, record the statistical
+ * estimate of number of distinct values (total in its table, without
+ * regard for filtering).
+ */
+ numdistinct = 1.0;
+
+ i = 0;
+ foreach(l, groupExprs)
+ {
+ Node *groupexpr = (Node *) lfirst(l);
+ double this_srf_multiplier;
+ VariableStatData vardata;
+ List *varshere;
+ ListCell *l2;
+
+ /* is expression in this grouping set? */
+ if (pgset && !list_member_int(*pgset, i++))
+ continue;
+
+ /*
+ * Set-returning functions in grouping columns are a bit problematic.
+ * The code below will effectively ignore their SRF nature and come up
+ * with a numdistinct estimate as though they were scalar functions.
+ * We compensate by scaling up the end result by the largest SRF
+ * rowcount estimate. (This will be an overestimate if the SRF
+ * produces multiple copies of any output value, but it seems best to
+ * assume the SRF's outputs are distinct. In any case, it's probably
+ * pointless to worry too much about this without much better
+ * estimates for SRF output rowcounts than we have today.)
+ */
+ this_srf_multiplier = expression_returns_set_rows(root, groupexpr);
+ if (srf_multiplier < this_srf_multiplier)
+ srf_multiplier = this_srf_multiplier;
+
+ /* Short-circuit for expressions returning boolean */
+ if (exprType(groupexpr) == BOOLOID)
+ {
+ numdistinct *= 2.0;
+ continue;
+ }
+
+ /*
+ * If examine_variable is able to deduce anything about the GROUP BY
+ * expression, treat it as a single variable even if it's really more
+ * complicated.
+ *
+ * XXX This has the consequence that if there's a statistics object on
+ * the expression, we don't split it into individual Vars. This
+ * affects our selection of statistics in
+ * estimate_multivariate_ndistinct, because it's probably better to
+ * use more accurate estimate for each expression and treat them as
+ * independent, than to combine estimates for the extracted variables
+ * when we don't know how that relates to the expressions.
+ */
+ examine_variable(root, groupexpr, 0, &vardata);
+ if (HeapTupleIsValid(vardata.statsTuple) || vardata.isunique)
+ {
+ varinfos = add_unique_group_var(root, varinfos,
+ groupexpr, &vardata);
+ ReleaseVariableStats(vardata);
+ continue;
+ }
+ ReleaseVariableStats(vardata);
+
+ /*
+ * Else pull out the component Vars. Handle PlaceHolderVars by
+ * recursing into their arguments (effectively assuming that the
+ * PlaceHolderVar doesn't change the number of groups, which boils
+ * down to ignoring the possible addition of nulls to the result set).
+ */
+ varshere = pull_var_clause(groupexpr,
+ PVC_RECURSE_AGGREGATES |
+ PVC_RECURSE_WINDOWFUNCS |
+ PVC_RECURSE_PLACEHOLDERS);
+
+ /*
+ * If we find any variable-free GROUP BY item, then either it is a
+ * constant (and we can ignore it) or it contains a volatile function;
+ * in the latter case we punt and assume that each input row will
+ * yield a distinct group.
+ */
+ if (varshere == NIL)
+ {
+ if (contain_volatile_functions(groupexpr))
+ return input_rows;
+ continue;
+ }
+
+ /*
+ * Else add variables to varinfos list
+ */
+ foreach(l2, varshere)
+ {
+ Node *var = (Node *) lfirst(l2);
+
+ examine_variable(root, var, 0, &vardata);
+ varinfos = add_unique_group_var(root, varinfos, var, &vardata);
+ ReleaseVariableStats(vardata);
+ }
+ }
+
+ /*
+ * If now no Vars, we must have an all-constant or all-boolean GROUP BY
+ * list.
+ */
+ if (varinfos == NIL)
+ {
+ /* Apply SRF multiplier as we would do in the long path */
+ numdistinct *= srf_multiplier;
+ /* Round off */
+ numdistinct = ceil(numdistinct);
+ /* Guard against out-of-range answers */
+ if (numdistinct > input_rows)
+ numdistinct = input_rows;
+ if (numdistinct < 1.0)
+ numdistinct = 1.0;
+ return numdistinct;
+ }
+
+ /*
+ * Group Vars by relation and estimate total numdistinct.
+ *
+ * For each iteration of the outer loop, we process the frontmost Var in
+ * varinfos, plus all other Vars in the same relation. We remove these
+ * Vars from the newvarinfos list for the next iteration. This is the
+ * easiest way to group Vars of same rel together.
+ */
+ do
+ {
+ GroupVarInfo *varinfo1 = (GroupVarInfo *) linitial(varinfos);
+ RelOptInfo *rel = varinfo1->rel;
+ double reldistinct = 1;
+ double relmaxndistinct = reldistinct;
+ int relvarcount = 0;
+ List *newvarinfos = NIL;
+ List *relvarinfos = NIL;
+
+ /*
+ * Split the list of varinfos in two - one for the current rel, one
+ * for remaining Vars on other rels.
+ */
+ relvarinfos = lappend(relvarinfos, varinfo1);
+ for_each_from(l, varinfos, 1)
+ {
+ GroupVarInfo *varinfo2 = (GroupVarInfo *) lfirst(l);
+
+ if (varinfo2->rel == varinfo1->rel)
+ {
+ /* varinfos on current rel */
+ relvarinfos = lappend(relvarinfos, varinfo2);
+ }
+ else
+ {
+ /* not time to process varinfo2 yet */
+ newvarinfos = lappend(newvarinfos, varinfo2);
+ }
+ }
+
+ /*
+ * Get the numdistinct estimate for the Vars of this rel. We
+ * iteratively search for multivariate n-distinct with maximum number
+ * of vars; assuming that each var group is independent of the others,
+ * we multiply them together. Any remaining relvarinfos after no more
+ * multivariate matches are found are assumed independent too, so
+ * their individual ndistinct estimates are multiplied also.
+ *
+ * While iterating, count how many separate numdistinct values we
+ * apply. We apply a fudge factor below, but only if we multiplied
+ * more than one such values.
+ */
+ while (relvarinfos)
+ {
+ double mvndistinct;
+
+ if (estimate_multivariate_ndistinct(root, rel, &relvarinfos,
+ &mvndistinct))
+ {
+ reldistinct *= mvndistinct;
+ if (relmaxndistinct < mvndistinct)
+ relmaxndistinct = mvndistinct;
+ relvarcount++;
+ }
+ else
+ {
+ foreach(l, relvarinfos)
+ {
+ GroupVarInfo *varinfo2 = (GroupVarInfo *) lfirst(l);
+
+ reldistinct *= varinfo2->ndistinct;
+ if (relmaxndistinct < varinfo2->ndistinct)
+ relmaxndistinct = varinfo2->ndistinct;
+ relvarcount++;
+
+ /*
+ * When varinfo2's isdefault is set then we'd better set
+ * the SELFLAG_USED_DEFAULT bit in the EstimationInfo.
+ */
+ if (estinfo != NULL && varinfo2->isdefault)
+ estinfo->flags |= SELFLAG_USED_DEFAULT;
+ }
+
+ /* we're done with this relation */
+ relvarinfos = NIL;
+ }
+ }
+
+ /*
+ * Sanity check --- don't divide by zero if empty relation.
+ */
+ Assert(IS_SIMPLE_REL(rel));
+ if (rel->tuples > 0)
+ {
+ /*
+ * Clamp to size of rel, or size of rel / 10 if multiple Vars. The
+ * fudge factor is because the Vars are probably correlated but we
+ * don't know by how much. We should never clamp to less than the
+ * largest ndistinct value for any of the Vars, though, since
+ * there will surely be at least that many groups.
+ */
+ double clamp = rel->tuples;
+
+ if (relvarcount > 1)
+ {
+ clamp *= 0.1;
+ if (clamp < relmaxndistinct)
+ {
+ clamp = relmaxndistinct;
+ /* for sanity in case some ndistinct is too large: */
+ if (clamp > rel->tuples)
+ clamp = rel->tuples;
+ }
+ }
+ if (reldistinct > clamp)
+ reldistinct = clamp;
+
+ /*
+ * Update the estimate based on the restriction selectivity,
+ * guarding against division by zero when reldistinct is zero.
+ * Also skip this if we know that we are returning all rows.
+ */
+ if (reldistinct > 0 && rel->rows < rel->tuples)
+ {
+ /*
+ * Given a table containing N rows with n distinct values in a
+ * uniform distribution, if we select p rows at random then
+ * the expected number of distinct values selected is
+ *
+ * n * (1 - product((N-N/n-i)/(N-i), i=0..p-1))
+ *
+ * = n * (1 - (N-N/n)! / (N-N/n-p)! * (N-p)! / N!)
+ *
+ * See "Approximating block accesses in database
+ * organizations", S. B. Yao, Communications of the ACM,
+ * Volume 20 Issue 4, April 1977 Pages 260-261.
+ *
+ * Alternatively, re-arranging the terms from the factorials,
+ * this may be written as
+ *
+ * n * (1 - product((N-p-i)/(N-i), i=0..N/n-1))
+ *
+ * This form of the formula is more efficient to compute in
+ * the common case where p is larger than N/n. Additionally,
+ * as pointed out by Dell'Era, if i << N for all terms in the
+ * product, it can be approximated by
+ *
+ * n * (1 - ((N-p)/N)^(N/n))
+ *
+ * See "Expected distinct values when selecting from a bag
+ * without replacement", Alberto Dell'Era,
+ * http://www.adellera.it/investigations/distinct_balls/.
+ *
+ * The condition i << N is equivalent to n >> 1, so this is a
+ * good approximation when the number of distinct values in
+ * the table is large. It turns out that this formula also
+ * works well even when n is small.
+ */
+ reldistinct *=
+ (1 - pow((rel->tuples - rel->rows) / rel->tuples,
+ rel->tuples / reldistinct));
+ }
+ reldistinct = clamp_row_est(reldistinct);
+
+ /*
+ * Update estimate of total distinct groups.
+ */
+ numdistinct *= reldistinct;
+ }
+
+ varinfos = newvarinfos;
+ } while (varinfos != NIL);
+
+ /* Now we can account for the effects of any SRFs */
+ numdistinct *= srf_multiplier;
+
+ /* Round off */
+ numdistinct = ceil(numdistinct);
+
+ /* Guard against out-of-range answers */
+ if (numdistinct > input_rows)
+ numdistinct = input_rows;
+ if (numdistinct < 1.0)
+ numdistinct = 1.0;
+
+ return numdistinct;
+}
+
+/*
+ * Estimate hash bucket statistics when the specified expression is used
+ * as a hash key for the given number of buckets.
+ *
+ * This attempts to determine two values:
+ *
+ * 1. The frequency of the most common value of the expression (returns
+ * zero into *mcv_freq if we can't get that).
+ *
+ * 2. The "bucketsize fraction", ie, average number of entries in a bucket
+ * divided by total tuples in relation.
+ *
+ * XXX This is really pretty bogus since we're effectively assuming that the
+ * distribution of hash keys will be the same after applying restriction
+ * clauses as it was in the underlying relation. However, we are not nearly
+ * smart enough to figure out how the restrict clauses might change the
+ * distribution, so this will have to do for now.
+ *
+ * We are passed the number of buckets the executor will use for the given
+ * input relation. If the data were perfectly distributed, with the same
+ * number of tuples going into each available bucket, then the bucketsize
+ * fraction would be 1/nbuckets. But this happy state of affairs will occur
+ * only if (a) there are at least nbuckets distinct data values, and (b)
+ * we have a not-too-skewed data distribution. Otherwise the buckets will
+ * be nonuniformly occupied. If the other relation in the join has a key
+ * distribution similar to this one's, then the most-loaded buckets are
+ * exactly those that will be probed most often. Therefore, the "average"
+ * bucket size for costing purposes should really be taken as something close
+ * to the "worst case" bucket size. We try to estimate this by adjusting the
+ * fraction if there are too few distinct data values, and then scaling up
+ * by the ratio of the most common value's frequency to the average frequency.
+ *
+ * If no statistics are available, use a default estimate of 0.1. This will
+ * discourage use of a hash rather strongly if the inner relation is large,
+ * which is what we want. We do not want to hash unless we know that the
+ * inner rel is well-dispersed (or the alternatives seem much worse).
+ *
+ * The caller should also check that the mcv_freq is not so large that the
+ * most common value would by itself require an impractically large bucket.
+ * In a hash join, the executor can split buckets if they get too big, but
+ * obviously that doesn't help for a bucket that contains many duplicates of
+ * the same value.
+ */
+void
+estimate_hash_bucket_stats(PlannerInfo *root, Node *hashkey, double nbuckets,
+ Selectivity *mcv_freq,
+ Selectivity *bucketsize_frac)
+{
+ VariableStatData vardata;
+ double estfract,
+ ndistinct,
+ stanullfrac,
+ avgfreq;
+ bool isdefault;
+ AttStatsSlot sslot;
+
+ examine_variable(root, hashkey, 0, &vardata);
+
+ /* Look up the frequency of the most common value, if available */
+ *mcv_freq = 0.0;
+
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ if (get_attstatsslot(&sslot, vardata.statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ /*
+ * The first MCV stat is for the most common value.
+ */
+ if (sslot.nnumbers > 0)
+ *mcv_freq = sslot.numbers[0];
+ free_attstatsslot(&sslot);
+ }
+ }
+
+ /* Get number of distinct values */
+ ndistinct = get_variable_numdistinct(&vardata, &isdefault);
+
+ /*
+ * If ndistinct isn't real, punt. We normally return 0.1, but if the
+ * mcv_freq is known to be even higher than that, use it instead.
+ */
+ if (isdefault)
+ {
+ *bucketsize_frac = (Selectivity) Max(0.1, *mcv_freq);
+ ReleaseVariableStats(vardata);
+ return;
+ }
+
+ /* Get fraction that are null */
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ Form_pg_statistic stats;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
+ stanullfrac = stats->stanullfrac;
+ }
+ else
+ stanullfrac = 0.0;
+
+ /* Compute avg freq of all distinct data values in raw relation */
+ avgfreq = (1.0 - stanullfrac) / ndistinct;
+
+ /*
+ * Adjust ndistinct to account for restriction clauses. Observe we are
+ * assuming that the data distribution is affected uniformly by the
+ * restriction clauses!
+ *
+ * XXX Possibly better way, but much more expensive: multiply by
+ * selectivity of rel's restriction clauses that mention the target Var.
+ */
+ if (vardata.rel && vardata.rel->tuples > 0)
+ {
+ ndistinct *= vardata.rel->rows / vardata.rel->tuples;
+ ndistinct = clamp_row_est(ndistinct);
+ }
+
+ /*
+ * Initial estimate of bucketsize fraction is 1/nbuckets as long as the
+ * number of buckets is less than the expected number of distinct values;
+ * otherwise it is 1/ndistinct.
+ */
+ if (ndistinct > nbuckets)
+ estfract = 1.0 / nbuckets;
+ else
+ estfract = 1.0 / ndistinct;
+
+ /*
+ * Adjust estimated bucketsize upward to account for skewed distribution.
+ */
+ if (avgfreq > 0.0 && *mcv_freq > avgfreq)
+ estfract *= *mcv_freq / avgfreq;
+
+ /*
+ * Clamp bucketsize to sane range (the above adjustment could easily
+ * produce an out-of-range result). We set the lower bound a little above
+ * zero, since zero isn't a very sane result.
+ */
+ if (estfract < 1.0e-6)
+ estfract = 1.0e-6;
+ else if (estfract > 1.0)
+ estfract = 1.0;
+
+ *bucketsize_frac = (Selectivity) estfract;
+
+ ReleaseVariableStats(vardata);
+}
+
+/*
+ * estimate_hashagg_tablesize
+ * estimate the number of bytes that a hash aggregate hashtable will
+ * require based on the agg_costs, path width and number of groups.
+ *
+ * We return the result as "double" to forestall any possible overflow
+ * problem in the multiplication by dNumGroups.
+ *
+ * XXX this may be over-estimating the size now that hashagg knows to omit
+ * unneeded columns from the hashtable. Also for mixed-mode grouping sets,
+ * grouping columns not in the hashed set are counted here even though hashagg
+ * won't store them. Is this a problem?
+ */
+double
+estimate_hashagg_tablesize(PlannerInfo *root, Path *path,
+ const AggClauseCosts *agg_costs, double dNumGroups)
+{
+ Size hashentrysize;
+
+ hashentrysize = hash_agg_entry_size(list_length(root->aggtransinfos),
+ path->pathtarget->width,
+ agg_costs->transitionSpace);
+
+ /*
+ * Note that this disregards the effect of fill-factor and growth policy
+ * of the hash table. That's probably ok, given that the default
+ * fill-factor is relatively high. It'd be hard to meaningfully factor in
+ * "double-in-size" growth policies here.
+ */
+ return hashentrysize * dNumGroups;
+}
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Support routines
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Find applicable ndistinct statistics for the given list of VarInfos (which
+ * must all belong to the given rel), and update *ndistinct to the estimate of
+ * the MVNDistinctItem that best matches. If a match it found, *varinfos is
+ * updated to remove the list of matched varinfos.
+ *
+ * Varinfos that aren't for simple Vars are ignored.
+ *
+ * Return true if we're able to find a match, false otherwise.
+ */
+static bool
+estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel,
+ List **varinfos, double *ndistinct)
+{
+ ListCell *lc;
+ int nmatches_vars;
+ int nmatches_exprs;
+ Oid statOid = InvalidOid;
+ MVNDistinct *stats;
+ StatisticExtInfo *matched_info = NULL;
+ RangeTblEntry *rte = planner_rt_fetch(rel->relid, root);
+
+ /* bail out immediately if the table has no extended statistics */
+ if (!rel->statlist)
+ return false;
+
+ /* look for the ndistinct statistics object matching the most vars */
+ nmatches_vars = 0; /* we require at least two matches */
+ nmatches_exprs = 0;
+ foreach(lc, rel->statlist)
+ {
+ ListCell *lc2;
+ StatisticExtInfo *info = (StatisticExtInfo *) lfirst(lc);
+ int nshared_vars = 0;
+ int nshared_exprs = 0;
+
+ /* skip statistics of other kinds */
+ if (info->kind != STATS_EXT_NDISTINCT)
+ continue;
+
+ /* skip statistics with mismatching stxdinherit value */
+ if (info->inherit != rte->inh)
+ continue;
+
+ /*
+ * Determine how many expressions (and variables in non-matched
+ * expressions) match. We'll then use these numbers to pick the
+ * statistics object that best matches the clauses.
+ */
+ foreach(lc2, *varinfos)
+ {
+ ListCell *lc3;
+ GroupVarInfo *varinfo = (GroupVarInfo *) lfirst(lc2);
+ AttrNumber attnum;
+
+ Assert(varinfo->rel == rel);
+
+ /* simple Var, search in statistics keys directly */
+ if (IsA(varinfo->var, Var))
+ {
+ attnum = ((Var *) varinfo->var)->varattno;
+
+ /*
+ * Ignore system attributes - we don't support statistics on
+ * them, so can't match them (and it'd fail as the values are
+ * negative).
+ */
+ if (!AttrNumberIsForUserDefinedAttr(attnum))
+ continue;
+
+ if (bms_is_member(attnum, info->keys))
+ nshared_vars++;
+
+ continue;
+ }
+
+ /* expression - see if it's in the statistics object */
+ foreach(lc3, info->exprs)
+ {
+ Node *expr = (Node *) lfirst(lc3);
+
+ if (equal(varinfo->var, expr))
+ {
+ nshared_exprs++;
+ break;
+ }
+ }
+ }
+
+ if (nshared_vars + nshared_exprs < 2)
+ continue;
+
+ /*
+ * Does this statistics object match more columns than the currently
+ * best object? If so, use this one instead.
+ *
+ * XXX This should break ties using name of the object, or something
+ * like that, to make the outcome stable.
+ */
+ if ((nshared_exprs > nmatches_exprs) ||
+ (((nshared_exprs == nmatches_exprs)) && (nshared_vars > nmatches_vars)))
+ {
+ statOid = info->statOid;
+ nmatches_vars = nshared_vars;
+ nmatches_exprs = nshared_exprs;
+ matched_info = info;
+ }
+ }
+
+ /* No match? */
+ if (statOid == InvalidOid)
+ return false;
+
+ Assert(nmatches_vars + nmatches_exprs > 1);
+
+ stats = statext_ndistinct_load(statOid, rte->inh);
+
+ /*
+ * If we have a match, search it for the specific item that matches (there
+ * must be one), and construct the output values.
+ */
+ if (stats)
+ {
+ int i;
+ List *newlist = NIL;
+ MVNDistinctItem *item = NULL;
+ ListCell *lc2;
+ Bitmapset *matched = NULL;
+ AttrNumber attnum_offset;
+
+ /*
+ * How much we need to offset the attnums? If there are no
+ * expressions, no offset is needed. Otherwise offset enough to move
+ * the lowest one (which is equal to number of expressions) to 1.
+ */
+ if (matched_info->exprs)
+ attnum_offset = (list_length(matched_info->exprs) + 1);
+ else
+ attnum_offset = 0;
+
+ /* see what actually matched */
+ foreach(lc2, *varinfos)
+ {
+ ListCell *lc3;
+ int idx;
+ bool found = false;
+
+ GroupVarInfo *varinfo = (GroupVarInfo *) lfirst(lc2);
+
+ /*
+ * Process a simple Var expression, by matching it to keys
+ * directly. If there's a matching expression, we'll try matching
+ * it later.
+ */
+ if (IsA(varinfo->var, Var))
+ {
+ AttrNumber attnum = ((Var *) varinfo->var)->varattno;
+
+ /*
+ * Ignore expressions on system attributes. Can't rely on the
+ * bms check for negative values.
+ */
+ if (!AttrNumberIsForUserDefinedAttr(attnum))
+ continue;
+
+ /* Is the variable covered by the statistics object? */
+ if (!bms_is_member(attnum, matched_info->keys))
+ continue;
+
+ attnum = attnum + attnum_offset;
+
+ /* ensure sufficient offset */
+ Assert(AttrNumberIsForUserDefinedAttr(attnum));
+
+ matched = bms_add_member(matched, attnum);
+
+ found = true;
+ }
+
+ /*
+ * XXX Maybe we should allow searching the expressions even if we
+ * found an attribute matching the expression? That would handle
+ * trivial expressions like "(a)" but it seems fairly useless.
+ */
+ if (found)
+ continue;
+
+ /* expression - see if it's in the statistics object */
+ idx = 0;
+ foreach(lc3, matched_info->exprs)
+ {
+ Node *expr = (Node *) lfirst(lc3);
+
+ if (equal(varinfo->var, expr))
+ {
+ AttrNumber attnum = -(idx + 1);
+
+ attnum = attnum + attnum_offset;
+
+ /* ensure sufficient offset */
+ Assert(AttrNumberIsForUserDefinedAttr(attnum));
+
+ matched = bms_add_member(matched, attnum);
+
+ /* there should be just one matching expression */
+ break;
+ }
+
+ idx++;
+ }
+ }
+
+ /* Find the specific item that exactly matches the combination */
+ for (i = 0; i < stats->nitems; i++)
+ {
+ int j;
+ MVNDistinctItem *tmpitem = &stats->items[i];
+
+ if (tmpitem->nattributes != bms_num_members(matched))
+ continue;
+
+ /* assume it's the right item */
+ item = tmpitem;
+
+ /* check that all item attributes/expressions fit the match */
+ for (j = 0; j < tmpitem->nattributes; j++)
+ {
+ AttrNumber attnum = tmpitem->attributes[j];
+
+ /*
+ * Thanks to how we constructed the matched bitmap above, we
+ * can just offset all attnums the same way.
+ */
+ attnum = attnum + attnum_offset;
+
+ if (!bms_is_member(attnum, matched))
+ {
+ /* nah, it's not this item */
+ item = NULL;
+ break;
+ }
+ }
+
+ /*
+ * If the item has all the matched attributes, we know it's the
+ * right one - there can't be a better one. matching more.
+ */
+ if (item)
+ break;
+ }
+
+ /*
+ * Make sure we found an item. There has to be one, because ndistinct
+ * statistics includes all combinations of attributes.
+ */
+ if (!item)
+ elog(ERROR, "corrupt MVNDistinct entry");
+
+ /* Form the output varinfo list, keeping only unmatched ones */
+ foreach(lc, *varinfos)
+ {
+ GroupVarInfo *varinfo = (GroupVarInfo *) lfirst(lc);
+ ListCell *lc3;
+ bool found = false;
+
+ /*
+ * Let's look at plain variables first, because it's the most
+ * common case and the check is quite cheap. We can simply get the
+ * attnum and check (with an offset) matched bitmap.
+ */
+ if (IsA(varinfo->var, Var))
+ {
+ AttrNumber attnum = ((Var *) varinfo->var)->varattno;
+
+ /*
+ * If it's a system attribute, we're done. We don't support
+ * extended statistics on system attributes, so it's clearly
+ * not matched. Just keep the expression and continue.
+ */
+ if (!AttrNumberIsForUserDefinedAttr(attnum))
+ {
+ newlist = lappend(newlist, varinfo);
+ continue;
+ }
+
+ /* apply the same offset as above */
+ attnum += attnum_offset;
+
+ /* if it's not matched, keep the varinfo */
+ if (!bms_is_member(attnum, matched))
+ newlist = lappend(newlist, varinfo);
+
+ /* The rest of the loop deals with complex expressions. */
+ continue;
+ }
+
+ /*
+ * Process complex expressions, not just simple Vars.
+ *
+ * First, we search for an exact match of an expression. If we
+ * find one, we can just discard the whole GroupExprInfo, with all
+ * the variables we extracted from it.
+ *
+ * Otherwise we inspect the individual vars, and try matching it
+ * to variables in the item.
+ */
+ foreach(lc3, matched_info->exprs)
+ {
+ Node *expr = (Node *) lfirst(lc3);
+
+ if (equal(varinfo->var, expr))
+ {
+ found = true;
+ break;
+ }
+ }
+
+ /* found exact match, skip */
+ if (found)
+ continue;
+
+ newlist = lappend(newlist, varinfo);
+ }
+
+ *varinfos = newlist;
+ *ndistinct = item->ndistinct;
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * convert_to_scalar
+ * Convert non-NULL values of the indicated types to the comparison
+ * scale needed by scalarineqsel().
+ * Returns "true" if successful.
+ *
+ * XXX this routine is a hack: ideally we should look up the conversion
+ * subroutines in pg_type.
+ *
+ * All numeric datatypes are simply converted to their equivalent
+ * "double" values. (NUMERIC values that are outside the range of "double"
+ * are clamped to +/- HUGE_VAL.)
+ *
+ * String datatypes are converted by convert_string_to_scalar(),
+ * which is explained below. The reason why this routine deals with
+ * three values at a time, not just one, is that we need it for strings.
+ *
+ * The bytea datatype is just enough different from strings that it has
+ * to be treated separately.
+ *
+ * The several datatypes representing absolute times are all converted
+ * to Timestamp, which is actually an int64, and then we promote that to
+ * a double. Note this will give correct results even for the "special"
+ * values of Timestamp, since those are chosen to compare correctly;
+ * see timestamp_cmp.
+ *
+ * The several datatypes representing relative times (intervals) are all
+ * converted to measurements expressed in seconds.
+ */
+static bool
+convert_to_scalar(Datum value, Oid valuetypid, Oid collid, double *scaledvalue,
+ Datum lobound, Datum hibound, Oid boundstypid,
+ double *scaledlobound, double *scaledhibound)
+{
+ bool failure = false;
+
+ /*
+ * Both the valuetypid and the boundstypid should exactly match the
+ * declared input type(s) of the operator we are invoked for. However,
+ * extensions might try to use scalarineqsel as estimator for operators
+ * with input type(s) we don't handle here; in such cases, we want to
+ * return false, not fail. In any case, we mustn't assume that valuetypid
+ * and boundstypid are identical.
+ *
+ * XXX The histogram we are interpolating between points of could belong
+ * to a column that's only binary-compatible with the declared type. In
+ * essence we are assuming that the semantics of binary-compatible types
+ * are enough alike that we can use a histogram generated with one type's
+ * operators to estimate selectivity for the other's. This is outright
+ * wrong in some cases --- in particular signed versus unsigned
+ * interpretation could trip us up. But it's useful enough in the
+ * majority of cases that we do it anyway. Should think about more
+ * rigorous ways to do it.
+ */
+ switch (valuetypid)
+ {
+ /*
+ * Built-in numeric types
+ */
+ case BOOLOID:
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case NUMERICOID:
+ case OIDOID:
+ case REGPROCOID:
+ case REGPROCEDUREOID:
+ case REGOPEROID:
+ case REGOPERATOROID:
+ case REGCLASSOID:
+ case REGTYPEOID:
+ case REGCOLLATIONOID:
+ case REGCONFIGOID:
+ case REGDICTIONARYOID:
+ case REGROLEOID:
+ case REGNAMESPACEOID:
+ *scaledvalue = convert_numeric_to_scalar(value, valuetypid,
+ &failure);
+ *scaledlobound = convert_numeric_to_scalar(lobound, boundstypid,
+ &failure);
+ *scaledhibound = convert_numeric_to_scalar(hibound, boundstypid,
+ &failure);
+ return !failure;
+
+ /*
+ * Built-in string types
+ */
+ case CHAROID:
+ case BPCHAROID:
+ case VARCHAROID:
+ case TEXTOID:
+ case NAMEOID:
+ {
+ char *valstr = convert_string_datum(value, valuetypid,
+ collid, &failure);
+ char *lostr = convert_string_datum(lobound, boundstypid,
+ collid, &failure);
+ char *histr = convert_string_datum(hibound, boundstypid,
+ collid, &failure);
+
+ /*
+ * Bail out if any of the values is not of string type. We
+ * might leak converted strings for the other value(s), but
+ * that's not worth troubling over.
+ */
+ if (failure)
+ return false;
+
+ convert_string_to_scalar(valstr, scaledvalue,
+ lostr, scaledlobound,
+ histr, scaledhibound);
+ pfree(valstr);
+ pfree(lostr);
+ pfree(histr);
+ return true;
+ }
+
+ /*
+ * Built-in bytea type
+ */
+ case BYTEAOID:
+ {
+ /* We only support bytea vs bytea comparison */
+ if (boundstypid != BYTEAOID)
+ return false;
+ convert_bytea_to_scalar(value, scaledvalue,
+ lobound, scaledlobound,
+ hibound, scaledhibound);
+ return true;
+ }
+
+ /*
+ * Built-in time types
+ */
+ case TIMESTAMPOID:
+ case TIMESTAMPTZOID:
+ case DATEOID:
+ case INTERVALOID:
+ case TIMEOID:
+ case TIMETZOID:
+ *scaledvalue = convert_timevalue_to_scalar(value, valuetypid,
+ &failure);
+ *scaledlobound = convert_timevalue_to_scalar(lobound, boundstypid,
+ &failure);
+ *scaledhibound = convert_timevalue_to_scalar(hibound, boundstypid,
+ &failure);
+ return !failure;
+
+ /*
+ * Built-in network types
+ */
+ case INETOID:
+ case CIDROID:
+ case MACADDROID:
+ case MACADDR8OID:
+ *scaledvalue = convert_network_to_scalar(value, valuetypid,
+ &failure);
+ *scaledlobound = convert_network_to_scalar(lobound, boundstypid,
+ &failure);
+ *scaledhibound = convert_network_to_scalar(hibound, boundstypid,
+ &failure);
+ return !failure;
+ }
+ /* Don't know how to convert */
+ *scaledvalue = *scaledlobound = *scaledhibound = 0;
+ return false;
+}
+
+/*
+ * Do convert_to_scalar()'s work for any numeric data type.
+ *
+ * On failure (e.g., unsupported typid), set *failure to true;
+ * otherwise, that variable is not changed.
+ */
+static double
+convert_numeric_to_scalar(Datum value, Oid typid, bool *failure)
+{
+ switch (typid)
+ {
+ case BOOLOID:
+ return (double) DatumGetBool(value);
+ case INT2OID:
+ return (double) DatumGetInt16(value);
+ case INT4OID:
+ return (double) DatumGetInt32(value);
+ case INT8OID:
+ return (double) DatumGetInt64(value);
+ case FLOAT4OID:
+ return (double) DatumGetFloat4(value);
+ case FLOAT8OID:
+ return (double) DatumGetFloat8(value);
+ case NUMERICOID:
+ /* Note: out-of-range values will be clamped to +-HUGE_VAL */
+ return (double)
+ DatumGetFloat8(DirectFunctionCall1(numeric_float8_no_overflow,
+ value));
+ case OIDOID:
+ case REGPROCOID:
+ case REGPROCEDUREOID:
+ case REGOPEROID:
+ case REGOPERATOROID:
+ case REGCLASSOID:
+ case REGTYPEOID:
+ case REGCOLLATIONOID:
+ case REGCONFIGOID:
+ case REGDICTIONARYOID:
+ case REGROLEOID:
+ case REGNAMESPACEOID:
+ /* we can treat OIDs as integers... */
+ return (double) DatumGetObjectId(value);
+ }
+
+ *failure = true;
+ return 0;
+}
+
+/*
+ * Do convert_to_scalar()'s work for any character-string data type.
+ *
+ * String datatypes are converted to a scale that ranges from 0 to 1,
+ * where we visualize the bytes of the string as fractional digits.
+ *
+ * We do not want the base to be 256, however, since that tends to
+ * generate inflated selectivity estimates; few databases will have
+ * occurrences of all 256 possible byte values at each position.
+ * Instead, use the smallest and largest byte values seen in the bounds
+ * as the estimated range for each byte, after some fudging to deal with
+ * the fact that we probably aren't going to see the full range that way.
+ *
+ * An additional refinement is that we discard any common prefix of the
+ * three strings before computing the scaled values. This allows us to
+ * "zoom in" when we encounter a narrow data range. An example is a phone
+ * number database where all the values begin with the same area code.
+ * (Actually, the bounds will be adjacent histogram-bin-boundary values,
+ * so this is more likely to happen than you might think.)
+ */
+static void
+convert_string_to_scalar(char *value,
+ double *scaledvalue,
+ char *lobound,
+ double *scaledlobound,
+ char *hibound,
+ double *scaledhibound)
+{
+ int rangelo,
+ rangehi;
+ char *sptr;
+
+ rangelo = rangehi = (unsigned char) hibound[0];
+ for (sptr = lobound; *sptr; sptr++)
+ {
+ if (rangelo > (unsigned char) *sptr)
+ rangelo = (unsigned char) *sptr;
+ if (rangehi < (unsigned char) *sptr)
+ rangehi = (unsigned char) *sptr;
+ }
+ for (sptr = hibound; *sptr; sptr++)
+ {
+ if (rangelo > (unsigned char) *sptr)
+ rangelo = (unsigned char) *sptr;
+ if (rangehi < (unsigned char) *sptr)
+ rangehi = (unsigned char) *sptr;
+ }
+ /* If range includes any upper-case ASCII chars, make it include all */
+ if (rangelo <= 'Z' && rangehi >= 'A')
+ {
+ if (rangelo > 'A')
+ rangelo = 'A';
+ if (rangehi < 'Z')
+ rangehi = 'Z';
+ }
+ /* Ditto lower-case */
+ if (rangelo <= 'z' && rangehi >= 'a')
+ {
+ if (rangelo > 'a')
+ rangelo = 'a';
+ if (rangehi < 'z')
+ rangehi = 'z';
+ }
+ /* Ditto digits */
+ if (rangelo <= '9' && rangehi >= '0')
+ {
+ if (rangelo > '0')
+ rangelo = '0';
+ if (rangehi < '9')
+ rangehi = '9';
+ }
+
+ /*
+ * If range includes less than 10 chars, assume we have not got enough
+ * data, and make it include regular ASCII set.
+ */
+ if (rangehi - rangelo < 9)
+ {
+ rangelo = ' ';
+ rangehi = 127;
+ }
+
+ /*
+ * Now strip any common prefix of the three strings.
+ */
+ while (*lobound)
+ {
+ if (*lobound != *hibound || *lobound != *value)
+ break;
+ lobound++, hibound++, value++;
+ }
+
+ /*
+ * Now we can do the conversions.
+ */
+ *scaledvalue = convert_one_string_to_scalar(value, rangelo, rangehi);
+ *scaledlobound = convert_one_string_to_scalar(lobound, rangelo, rangehi);
+ *scaledhibound = convert_one_string_to_scalar(hibound, rangelo, rangehi);
+}
+
+static double
+convert_one_string_to_scalar(char *value, int rangelo, int rangehi)
+{
+ int slen = strlen(value);
+ double num,
+ denom,
+ base;
+
+ if (slen <= 0)
+ return 0.0; /* empty string has scalar value 0 */
+
+ /*
+ * There seems little point in considering more than a dozen bytes from
+ * the string. Since base is at least 10, that will give us nominal
+ * resolution of at least 12 decimal digits, which is surely far more
+ * precision than this estimation technique has got anyway (especially in
+ * non-C locales). Also, even with the maximum possible base of 256, this
+ * ensures denom cannot grow larger than 256^13 = 2.03e31, which will not
+ * overflow on any known machine.
+ */
+ if (slen > 12)
+ slen = 12;
+
+ /* Convert initial characters to fraction */
+ base = rangehi - rangelo + 1;
+ num = 0.0;
+ denom = base;
+ while (slen-- > 0)
+ {
+ int ch = (unsigned char) *value++;
+
+ if (ch < rangelo)
+ ch = rangelo - 1;
+ else if (ch > rangehi)
+ ch = rangehi + 1;
+ num += ((double) (ch - rangelo)) / denom;
+ denom *= base;
+ }
+
+ return num;
+}
+
+/*
+ * Convert a string-type Datum into a palloc'd, null-terminated string.
+ *
+ * On failure (e.g., unsupported typid), set *failure to true;
+ * otherwise, that variable is not changed. (We'll return NULL on failure.)
+ *
+ * When using a non-C locale, we must pass the string through strxfrm()
+ * before continuing, so as to generate correct locale-specific results.
+ */
+static char *
+convert_string_datum(Datum value, Oid typid, Oid collid, bool *failure)
+{
+ char *val;
+
+ switch (typid)
+ {
+ case CHAROID:
+ val = (char *) palloc(2);
+ val[0] = DatumGetChar(value);
+ val[1] = '\0';
+ break;
+ case BPCHAROID:
+ case VARCHAROID:
+ case TEXTOID:
+ val = TextDatumGetCString(value);
+ break;
+ case NAMEOID:
+ {
+ NameData *nm = (NameData *) DatumGetPointer(value);
+
+ val = pstrdup(NameStr(*nm));
+ break;
+ }
+ default:
+ *failure = true;
+ return NULL;
+ }
+
+ if (!lc_collate_is_c(collid))
+ {
+ char *xfrmstr;
+ size_t xfrmlen;
+ size_t xfrmlen2 PG_USED_FOR_ASSERTS_ONLY;
+
+ /*
+ * XXX: We could guess at a suitable output buffer size and only call
+ * strxfrm twice if our guess is too small.
+ *
+ * XXX: strxfrm doesn't support UTF-8 encoding on Win32, it can return
+ * bogus data or set an error. This is not really a problem unless it
+ * crashes since it will only give an estimation error and nothing
+ * fatal.
+ */
+ xfrmlen = strxfrm(NULL, val, 0);
+#ifdef WIN32
+
+ /*
+ * On Windows, strxfrm returns INT_MAX when an error occurs. Instead
+ * of trying to allocate this much memory (and fail), just return the
+ * original string unmodified as if we were in the C locale.
+ */
+ if (xfrmlen == INT_MAX)
+ return val;
+#endif
+ xfrmstr = (char *) palloc(xfrmlen + 1);
+ xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1);
+
+ /*
+ * Some systems (e.g., glibc) can return a smaller value from the
+ * second call than the first; thus the Assert must be <= not ==.
+ */
+ Assert(xfrmlen2 <= xfrmlen);
+ pfree(val);
+ val = xfrmstr;
+ }
+
+ return val;
+}
+
+/*
+ * Do convert_to_scalar()'s work for any bytea data type.
+ *
+ * Very similar to convert_string_to_scalar except we can't assume
+ * null-termination and therefore pass explicit lengths around.
+ *
+ * Also, assumptions about likely "normal" ranges of characters have been
+ * removed - a data range of 0..255 is always used, for now. (Perhaps
+ * someday we will add information about actual byte data range to
+ * pg_statistic.)
+ */
+static void
+convert_bytea_to_scalar(Datum value,
+ double *scaledvalue,
+ Datum lobound,
+ double *scaledlobound,
+ Datum hibound,
+ double *scaledhibound)
+{
+ bytea *valuep = DatumGetByteaPP(value);
+ bytea *loboundp = DatumGetByteaPP(lobound);
+ bytea *hiboundp = DatumGetByteaPP(hibound);
+ int rangelo,
+ rangehi,
+ valuelen = VARSIZE_ANY_EXHDR(valuep),
+ loboundlen = VARSIZE_ANY_EXHDR(loboundp),
+ hiboundlen = VARSIZE_ANY_EXHDR(hiboundp),
+ i,
+ minlen;
+ unsigned char *valstr = (unsigned char *) VARDATA_ANY(valuep);
+ unsigned char *lostr = (unsigned char *) VARDATA_ANY(loboundp);
+ unsigned char *histr = (unsigned char *) VARDATA_ANY(hiboundp);
+
+ /*
+ * Assume bytea data is uniformly distributed across all byte values.
+ */
+ rangelo = 0;
+ rangehi = 255;
+
+ /*
+ * Now strip any common prefix of the three strings.
+ */
+ minlen = Min(Min(valuelen, loboundlen), hiboundlen);
+ for (i = 0; i < minlen; i++)
+ {
+ if (*lostr != *histr || *lostr != *valstr)
+ break;
+ lostr++, histr++, valstr++;
+ loboundlen--, hiboundlen--, valuelen--;
+ }
+
+ /*
+ * Now we can do the conversions.
+ */
+ *scaledvalue = convert_one_bytea_to_scalar(valstr, valuelen, rangelo, rangehi);
+ *scaledlobound = convert_one_bytea_to_scalar(lostr, loboundlen, rangelo, rangehi);
+ *scaledhibound = convert_one_bytea_to_scalar(histr, hiboundlen, rangelo, rangehi);
+}
+
+static double
+convert_one_bytea_to_scalar(unsigned char *value, int valuelen,
+ int rangelo, int rangehi)
+{
+ double num,
+ denom,
+ base;
+
+ if (valuelen <= 0)
+ return 0.0; /* empty string has scalar value 0 */
+
+ /*
+ * Since base is 256, need not consider more than about 10 chars (even
+ * this many seems like overkill)
+ */
+ if (valuelen > 10)
+ valuelen = 10;
+
+ /* Convert initial characters to fraction */
+ base = rangehi - rangelo + 1;
+ num = 0.0;
+ denom = base;
+ while (valuelen-- > 0)
+ {
+ int ch = *value++;
+
+ if (ch < rangelo)
+ ch = rangelo - 1;
+ else if (ch > rangehi)
+ ch = rangehi + 1;
+ num += ((double) (ch - rangelo)) / denom;
+ denom *= base;
+ }
+
+ return num;
+}
+
+/*
+ * Do convert_to_scalar()'s work for any timevalue data type.
+ *
+ * On failure (e.g., unsupported typid), set *failure to true;
+ * otherwise, that variable is not changed.
+ */
+static double
+convert_timevalue_to_scalar(Datum value, Oid typid, bool *failure)
+{
+ switch (typid)
+ {
+ case TIMESTAMPOID:
+ return DatumGetTimestamp(value);
+ case TIMESTAMPTZOID:
+ return DatumGetTimestampTz(value);
+ case DATEOID:
+ return date2timestamp_no_overflow(DatumGetDateADT(value));
+ case INTERVALOID:
+ {
+ Interval *interval = DatumGetIntervalP(value);
+
+ /*
+ * Convert the month part of Interval to days using assumed
+ * average month length of 365.25/12.0 days. Not too
+ * accurate, but plenty good enough for our purposes.
+ */
+ return interval->time + interval->day * (double) USECS_PER_DAY +
+ interval->month * ((DAYS_PER_YEAR / (double) MONTHS_PER_YEAR) * USECS_PER_DAY);
+ }
+ case TIMEOID:
+ return DatumGetTimeADT(value);
+ case TIMETZOID:
+ {
+ TimeTzADT *timetz = DatumGetTimeTzADTP(value);
+
+ /* use GMT-equivalent time */
+ return (double) (timetz->time + (timetz->zone * 1000000.0));
+ }
+ }
+
+ *failure = true;
+ return 0;
+}
+
+
+/*
+ * get_restriction_variable
+ * Examine the args of a restriction clause to see if it's of the
+ * form (variable op pseudoconstant) or (pseudoconstant op variable),
+ * where "variable" could be either a Var or an expression in vars of a
+ * single relation. If so, extract information about the variable,
+ * and also indicate which side it was on and the other argument.
+ *
+ * Inputs:
+ * root: the planner info
+ * args: clause argument list
+ * varRelid: see specs for restriction selectivity functions
+ *
+ * Outputs: (these are valid only if true is returned)
+ * *vardata: gets information about variable (see examine_variable)
+ * *other: gets other clause argument, aggressively reduced to a constant
+ * *varonleft: set true if variable is on the left, false if on the right
+ *
+ * Returns true if a variable is identified, otherwise false.
+ *
+ * Note: if there are Vars on both sides of the clause, we must fail, because
+ * callers are expecting that the other side will act like a pseudoconstant.
+ */
+bool
+get_restriction_variable(PlannerInfo *root, List *args, int varRelid,
+ VariableStatData *vardata, Node **other,
+ bool *varonleft)
+{
+ Node *left,
+ *right;
+ VariableStatData rdata;
+
+ /* Fail if not a binary opclause (probably shouldn't happen) */
+ if (list_length(args) != 2)
+ return false;
+
+ left = (Node *) linitial(args);
+ right = (Node *) lsecond(args);
+
+ /*
+ * Examine both sides. Note that when varRelid is nonzero, Vars of other
+ * relations will be treated as pseudoconstants.
+ */
+ examine_variable(root, left, varRelid, vardata);
+ examine_variable(root, right, varRelid, &rdata);
+
+ /*
+ * If one side is a variable and the other not, we win.
+ */
+ if (vardata->rel && rdata.rel == NULL)
+ {
+ *varonleft = true;
+ *other = estimate_expression_value(root, rdata.var);
+ /* Assume we need no ReleaseVariableStats(rdata) here */
+ return true;
+ }
+
+ if (vardata->rel == NULL && rdata.rel)
+ {
+ *varonleft = false;
+ *other = estimate_expression_value(root, vardata->var);
+ /* Assume we need no ReleaseVariableStats(*vardata) here */
+ *vardata = rdata;
+ return true;
+ }
+
+ /* Oops, clause has wrong structure (probably var op var) */
+ ReleaseVariableStats(*vardata);
+ ReleaseVariableStats(rdata);
+
+ return false;
+}
+
+/*
+ * get_join_variables
+ * Apply examine_variable() to each side of a join clause.
+ * Also, attempt to identify whether the join clause has the same
+ * or reversed sense compared to the SpecialJoinInfo.
+ *
+ * We consider the join clause "normal" if it is "lhs_var OP rhs_var",
+ * or "reversed" if it is "rhs_var OP lhs_var". In complicated cases
+ * where we can't tell for sure, we default to assuming it's normal.
+ */
+void
+get_join_variables(PlannerInfo *root, List *args, SpecialJoinInfo *sjinfo,
+ VariableStatData *vardata1, VariableStatData *vardata2,
+ bool *join_is_reversed)
+{
+ Node *left,
+ *right;
+
+ if (list_length(args) != 2)
+ elog(ERROR, "join operator should take two arguments");
+
+ left = (Node *) linitial(args);
+ right = (Node *) lsecond(args);
+
+ examine_variable(root, left, 0, vardata1);
+ examine_variable(root, right, 0, vardata2);
+
+ if (vardata1->rel &&
+ bms_is_subset(vardata1->rel->relids, sjinfo->syn_righthand))
+ *join_is_reversed = true; /* var1 is on RHS */
+ else if (vardata2->rel &&
+ bms_is_subset(vardata2->rel->relids, sjinfo->syn_lefthand))
+ *join_is_reversed = true; /* var2 is on LHS */
+ else
+ *join_is_reversed = false;
+}
+
+/* statext_expressions_load copies the tuple, so just pfree it. */
+static void
+ReleaseDummy(HeapTuple tuple)
+{
+ pfree(tuple);
+}
+
+/*
+ * examine_variable
+ * Try to look up statistical data about an expression.
+ * Fill in a VariableStatData struct to describe the expression.
+ *
+ * Inputs:
+ * root: the planner info
+ * node: the expression tree to examine
+ * varRelid: see specs for restriction selectivity functions
+ *
+ * Outputs: *vardata is filled as follows:
+ * var: the input expression (with any binary relabeling stripped, if
+ * it is or contains a variable; but otherwise the type is preserved)
+ * rel: RelOptInfo for relation containing variable; NULL if expression
+ * contains no Vars (NOTE this could point to a RelOptInfo of a
+ * subquery, not one in the current query).
+ * statsTuple: the pg_statistic entry for the variable, if one exists;
+ * otherwise NULL.
+ * freefunc: pointer to a function to release statsTuple with.
+ * vartype: exposed type of the expression; this should always match
+ * the declared input type of the operator we are estimating for.
+ * atttype, atttypmod: actual type/typmod of the "var" expression. This is
+ * commonly the same as the exposed type of the variable argument,
+ * but can be different in binary-compatible-type cases.
+ * isunique: true if we were able to match the var to a unique index or a
+ * single-column DISTINCT clause, implying its values are unique for
+ * this query. (Caution: this should be trusted for statistical
+ * purposes only, since we do not check indimmediate nor verify that
+ * the exact same definition of equality applies.)
+ * acl_ok: true if current user has permission to read the column(s)
+ * underlying the pg_statistic entry. This is consulted by
+ * statistic_proc_security_check().
+ *
+ * Caller is responsible for doing ReleaseVariableStats() before exiting.
+ */
+void
+examine_variable(PlannerInfo *root, Node *node, int varRelid,
+ VariableStatData *vardata)
+{
+ Node *basenode;
+ Relids varnos;
+ RelOptInfo *onerel;
+
+ /* Make sure we don't return dangling pointers in vardata */
+ MemSet(vardata, 0, sizeof(VariableStatData));
+
+ /* Save the exposed type of the expression */
+ vardata->vartype = exprType(node);
+
+ /* Look inside any binary-compatible relabeling */
+
+ if (IsA(node, RelabelType))
+ basenode = (Node *) ((RelabelType *) node)->arg;
+ else
+ basenode = node;
+
+ /* Fast path for a simple Var */
+
+ if (IsA(basenode, Var) &&
+ (varRelid == 0 || varRelid == ((Var *) basenode)->varno))
+ {
+ Var *var = (Var *) basenode;
+
+ /* Set up result fields other than the stats tuple */
+ vardata->var = basenode; /* return Var without relabeling */
+ vardata->rel = find_base_rel(root, var->varno);
+ vardata->atttype = var->vartype;
+ vardata->atttypmod = var->vartypmod;
+ vardata->isunique = has_unique_index(vardata->rel, var->varattno);
+
+ /* Try to locate some stats */
+ examine_simple_variable(root, var, vardata);
+
+ return;
+ }
+
+ /*
+ * Okay, it's a more complicated expression. Determine variable
+ * membership. Note that when varRelid isn't zero, only vars of that
+ * relation are considered "real" vars.
+ */
+ varnos = pull_varnos(root, basenode);
+
+ onerel = NULL;
+
+ switch (bms_membership(varnos))
+ {
+ case BMS_EMPTY_SET:
+ /* No Vars at all ... must be pseudo-constant clause */
+ break;
+ case BMS_SINGLETON:
+ if (varRelid == 0 || bms_is_member(varRelid, varnos))
+ {
+ onerel = find_base_rel(root,
+ (varRelid ? varRelid : bms_singleton_member(varnos)));
+ vardata->rel = onerel;
+ node = basenode; /* strip any relabeling */
+ }
+ /* else treat it as a constant */
+ break;
+ case BMS_MULTIPLE:
+ if (varRelid == 0)
+ {
+ /* treat it as a variable of a join relation */
+ vardata->rel = find_join_rel(root, varnos);
+ node = basenode; /* strip any relabeling */
+ }
+ else if (bms_is_member(varRelid, varnos))
+ {
+ /* ignore the vars belonging to other relations */
+ vardata->rel = find_base_rel(root, varRelid);
+ node = basenode; /* strip any relabeling */
+ /* note: no point in expressional-index search here */
+ }
+ /* else treat it as a constant */
+ break;
+ }
+
+ bms_free(varnos);
+
+ vardata->var = node;
+ vardata->atttype = exprType(node);
+ vardata->atttypmod = exprTypmod(node);
+
+ if (onerel)
+ {
+ /*
+ * We have an expression in vars of a single relation. Try to match
+ * it to expressional index columns, in hopes of finding some
+ * statistics.
+ *
+ * Note that we consider all index columns including INCLUDE columns,
+ * since there could be stats for such columns. But the test for
+ * uniqueness needs to be warier.
+ *
+ * XXX it's conceivable that there are multiple matches with different
+ * index opfamilies; if so, we need to pick one that matches the
+ * operator we are estimating for. FIXME later.
+ */
+ ListCell *ilist;
+ ListCell *slist;
+
+ foreach(ilist, onerel->indexlist)
+ {
+ IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist);
+ ListCell *indexpr_item;
+ int pos;
+
+ indexpr_item = list_head(index->indexprs);
+ if (indexpr_item == NULL)
+ continue; /* no expressions here... */
+
+ for (pos = 0; pos < index->ncolumns; pos++)
+ {
+ if (index->indexkeys[pos] == 0)
+ {
+ Node *indexkey;
+
+ if (indexpr_item == NULL)
+ elog(ERROR, "too few entries in indexprs list");
+ indexkey = (Node *) lfirst(indexpr_item);
+ if (indexkey && IsA(indexkey, RelabelType))
+ indexkey = (Node *) ((RelabelType *) indexkey)->arg;
+ if (equal(node, indexkey))
+ {
+ /*
+ * Found a match ... is it a unique index? Tests here
+ * should match has_unique_index().
+ */
+ if (index->unique &&
+ index->nkeycolumns == 1 &&
+ pos == 0 &&
+ (index->indpred == NIL || index->predOK))
+ vardata->isunique = true;
+
+ /*
+ * Has it got stats? We only consider stats for
+ * non-partial indexes, since partial indexes probably
+ * don't reflect whole-relation statistics; the above
+ * check for uniqueness is the only info we take from
+ * a partial index.
+ *
+ * An index stats hook, however, must make its own
+ * decisions about what to do with partial indexes.
+ */
+ if (get_index_stats_hook &&
+ (*get_index_stats_hook) (root, index->indexoid,
+ pos + 1, vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats
+ * tuple. If it did supply a tuple, it'd better
+ * have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ !vardata->freefunc)
+ elog(ERROR, "no function provided to release variable stats with");
+ }
+ else if (index->indpred == NIL)
+ {
+ vardata->statsTuple =
+ SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(index->indexoid),
+ Int16GetDatum(pos + 1),
+ BoolGetDatum(false));
+ vardata->freefunc = ReleaseSysCache;
+
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ /* Get index's table for permission check */
+ RangeTblEntry *rte;
+ Oid userid;
+
+ rte = planner_rt_fetch(index->rel->relid, root);
+ Assert(rte->rtekind == RTE_RELATION);
+
+ /*
+ * Use checkAsUser if it's set, in case we're
+ * accessing the table via a view.
+ */
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ /*
+ * For simplicity, we insist on the whole
+ * table being selectable, rather than trying
+ * to identify which column(s) the index
+ * depends on. Also require all rows to be
+ * selectable --- there must be no
+ * securityQuals from security barrier views
+ * or RLS policies.
+ */
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ (pg_class_aclcheck(rte->relid, userid,
+ ACL_SELECT) == ACLCHECK_OK);
+
+ /*
+ * If the user doesn't have permissions to
+ * access an inheritance child relation, check
+ * the permissions of the table actually
+ * mentioned in the query, since most likely
+ * the user does have that permission. Note
+ * that whole-table select privilege on the
+ * parent doesn't quite guarantee that the
+ * user could read all columns of the child.
+ * But in practice it's unlikely that any
+ * interesting security violation could result
+ * from allowing access to the expression
+ * index's stats, so we allow it anyway. See
+ * similar code in examine_simple_variable()
+ * for additional comments.
+ */
+ if (!vardata->acl_ok &&
+ root->append_rel_array != NULL)
+ {
+ AppendRelInfo *appinfo;
+ Index varno = index->rel->relid;
+
+ appinfo = root->append_rel_array[varno];
+ while (appinfo &&
+ planner_rt_fetch(appinfo->parent_relid,
+ root)->rtekind == RTE_RELATION)
+ {
+ varno = appinfo->parent_relid;
+ appinfo = root->append_rel_array[varno];
+ }
+ if (varno != index->rel->relid)
+ {
+ /* Repeat access check on this rel */
+ rte = planner_rt_fetch(varno, root);
+ Assert(rte->rtekind == RTE_RELATION);
+
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ (pg_class_aclcheck(rte->relid,
+ userid,
+ ACL_SELECT) == ACLCHECK_OK);
+ }
+ }
+ }
+ else
+ {
+ /* suppress leakproofness checks later */
+ vardata->acl_ok = true;
+ }
+ }
+ if (vardata->statsTuple)
+ break;
+ }
+ indexpr_item = lnext(index->indexprs, indexpr_item);
+ }
+ }
+ if (vardata->statsTuple)
+ break;
+ }
+
+ /*
+ * Search extended statistics for one with a matching expression.
+ * There might be multiple ones, so just grab the first one. In the
+ * future, we might consider the statistics target (and pick the most
+ * accurate statistics) and maybe some other parameters.
+ */
+ foreach(slist, onerel->statlist)
+ {
+ StatisticExtInfo *info = (StatisticExtInfo *) lfirst(slist);
+ RangeTblEntry *rte = planner_rt_fetch(onerel->relid, root);
+ ListCell *expr_item;
+ int pos;
+
+ /*
+ * Stop once we've found statistics for the expression (either
+ * from extended stats, or for an index in the preceding loop).
+ */
+ if (vardata->statsTuple)
+ break;
+
+ /* skip stats without per-expression stats */
+ if (info->kind != STATS_EXT_EXPRESSIONS)
+ continue;
+
+ /* skip stats with mismatching stxdinherit value */
+ if (info->inherit != rte->inh)
+ continue;
+
+ pos = 0;
+ foreach(expr_item, info->exprs)
+ {
+ Node *expr = (Node *) lfirst(expr_item);
+
+ Assert(expr);
+
+ /* strip RelabelType before comparing it */
+ if (expr && IsA(expr, RelabelType))
+ expr = (Node *) ((RelabelType *) expr)->arg;
+
+ /* found a match, see if we can extract pg_statistic row */
+ if (equal(node, expr))
+ {
+ Oid userid;
+
+ /*
+ * XXX Not sure if we should cache the tuple somewhere.
+ * Now we just create a new copy every time.
+ */
+ vardata->statsTuple =
+ statext_expressions_load(info->statOid, rte->inh, pos);
+
+ vardata->freefunc = ReleaseDummy;
+
+ /*
+ * Use checkAsUser if it's set, in case we're accessing
+ * the table via a view.
+ */
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ /*
+ * For simplicity, we insist on the whole table being
+ * selectable, rather than trying to identify which
+ * column(s) the statistics object depends on. Also
+ * require all rows to be selectable --- there must be no
+ * securityQuals from security barrier views or RLS
+ * policies.
+ */
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ (pg_class_aclcheck(rte->relid, userid,
+ ACL_SELECT) == ACLCHECK_OK);
+
+ /*
+ * If the user doesn't have permissions to access an
+ * inheritance child relation, check the permissions of
+ * the table actually mentioned in the query, since most
+ * likely the user does have that permission. Note that
+ * whole-table select privilege on the parent doesn't
+ * quite guarantee that the user could read all columns of
+ * the child. But in practice it's unlikely that any
+ * interesting security violation could result from
+ * allowing access to the expression stats, so we allow it
+ * anyway. See similar code in examine_simple_variable()
+ * for additional comments.
+ */
+ if (!vardata->acl_ok &&
+ root->append_rel_array != NULL)
+ {
+ AppendRelInfo *appinfo;
+ Index varno = onerel->relid;
+
+ appinfo = root->append_rel_array[varno];
+ while (appinfo &&
+ planner_rt_fetch(appinfo->parent_relid,
+ root)->rtekind == RTE_RELATION)
+ {
+ varno = appinfo->parent_relid;
+ appinfo = root->append_rel_array[varno];
+ }
+ if (varno != onerel->relid)
+ {
+ /* Repeat access check on this rel */
+ rte = planner_rt_fetch(varno, root);
+ Assert(rte->rtekind == RTE_RELATION);
+
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ (pg_class_aclcheck(rte->relid,
+ userid,
+ ACL_SELECT) == ACLCHECK_OK);
+ }
+ }
+
+ break;
+ }
+
+ pos++;
+ }
+ }
+ }
+}
+
+/*
+ * examine_simple_variable
+ * Handle a simple Var for examine_variable
+ *
+ * This is split out as a subroutine so that we can recurse to deal with
+ * Vars referencing subqueries.
+ *
+ * We already filled in all the fields of *vardata except for the stats tuple.
+ */
+static void
+examine_simple_variable(PlannerInfo *root, Var *var,
+ VariableStatData *vardata)
+{
+ RangeTblEntry *rte = root->simple_rte_array[var->varno];
+
+ Assert(IsA(rte, RangeTblEntry));
+
+ if (get_relation_stats_hook &&
+ (*get_relation_stats_hook) (root, rte, var->varattno, vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats tuple. If it did supply
+ * a tuple, it'd better have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata->statsTuple) &&
+ !vardata->freefunc)
+ elog(ERROR, "no function provided to release variable stats with");
+ }
+ else if (rte->rtekind == RTE_RELATION)
+ {
+ /*
+ * Plain table or parent of an inheritance appendrel, so look up the
+ * column in pg_statistic
+ */
+ vardata->statsTuple = SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(rte->relid),
+ Int16GetDatum(var->varattno),
+ BoolGetDatum(rte->inh));
+ vardata->freefunc = ReleaseSysCache;
+
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ Oid userid;
+
+ /*
+ * Check if user has permission to read this column. We require
+ * all rows to be accessible, so there must be no securityQuals
+ * from security barrier views or RLS policies. Use checkAsUser
+ * if it's set, in case we're accessing the table via a view.
+ */
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ ((pg_class_aclcheck(rte->relid, userid,
+ ACL_SELECT) == ACLCHECK_OK) ||
+ (pg_attribute_aclcheck(rte->relid, var->varattno, userid,
+ ACL_SELECT) == ACLCHECK_OK));
+
+ /*
+ * If the user doesn't have permissions to access an inheritance
+ * child relation or specifically this attribute, check the
+ * permissions of the table/column actually mentioned in the
+ * query, since most likely the user does have that permission
+ * (else the query will fail at runtime), and if the user can read
+ * the column there then he can get the values of the child table
+ * too. To do that, we must find out which of the root parent's
+ * attributes the child relation's attribute corresponds to.
+ */
+ if (!vardata->acl_ok && var->varattno > 0 &&
+ root->append_rel_array != NULL)
+ {
+ AppendRelInfo *appinfo;
+ Index varno = var->varno;
+ int varattno = var->varattno;
+ bool found = false;
+
+ appinfo = root->append_rel_array[varno];
+
+ /*
+ * Partitions are mapped to their immediate parent, not the
+ * root parent, so must be ready to walk up multiple
+ * AppendRelInfos. But stop if we hit a parent that is not
+ * RTE_RELATION --- that's a flattened UNION ALL subquery, not
+ * an inheritance parent.
+ */
+ while (appinfo &&
+ planner_rt_fetch(appinfo->parent_relid,
+ root)->rtekind == RTE_RELATION)
+ {
+ int parent_varattno;
+
+ found = false;
+ if (varattno <= 0 || varattno > appinfo->num_child_cols)
+ break; /* safety check */
+ parent_varattno = appinfo->parent_colnos[varattno - 1];
+ if (parent_varattno == 0)
+ break; /* Var is local to child */
+
+ varno = appinfo->parent_relid;
+ varattno = parent_varattno;
+ found = true;
+
+ /* If the parent is itself a child, continue up. */
+ appinfo = root->append_rel_array[varno];
+ }
+
+ /*
+ * In rare cases, the Var may be local to the child table, in
+ * which case, we've got to live with having no access to this
+ * column's stats.
+ */
+ if (!found)
+ return;
+
+ /* Repeat the access check on this parent rel & column */
+ rte = planner_rt_fetch(varno, root);
+ Assert(rte->rtekind == RTE_RELATION);
+
+ userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
+
+ vardata->acl_ok =
+ rte->securityQuals == NIL &&
+ ((pg_class_aclcheck(rte->relid, userid,
+ ACL_SELECT) == ACLCHECK_OK) ||
+ (pg_attribute_aclcheck(rte->relid, varattno, userid,
+ ACL_SELECT) == ACLCHECK_OK));
+ }
+ }
+ else
+ {
+ /* suppress any possible leakproofness checks later */
+ vardata->acl_ok = true;
+ }
+ }
+ else if (rte->rtekind == RTE_SUBQUERY && !rte->inh)
+ {
+ /*
+ * Plain subquery (not one that was converted to an appendrel).
+ */
+ Query *subquery = rte->subquery;
+ RelOptInfo *rel;
+ TargetEntry *ste;
+
+ /*
+ * Punt if it's a whole-row var rather than a plain column reference.
+ */
+ if (var->varattno == InvalidAttrNumber)
+ return;
+
+ /*
+ * Punt if subquery uses set operations or GROUP BY, as these will
+ * mash underlying columns' stats beyond recognition. (Set ops are
+ * particularly nasty; if we forged ahead, we would return stats
+ * relevant to only the leftmost subselect...) DISTINCT is also
+ * problematic, but we check that later because there is a possibility
+ * of learning something even with it.
+ */
+ if (subquery->setOperations ||
+ subquery->groupClause ||
+ subquery->groupingSets)
+ return;
+
+ /*
+ * OK, fetch RelOptInfo for subquery. Note that we don't change the
+ * rel returned in vardata, since caller expects it to be a rel of the
+ * caller's query level. Because we might already be recursing, we
+ * can't use that rel pointer either, but have to look up the Var's
+ * rel afresh.
+ */
+ rel = find_base_rel(root, var->varno);
+
+ /* If the subquery hasn't been planned yet, we have to punt */
+ if (rel->subroot == NULL)
+ return;
+ Assert(IsA(rel->subroot, PlannerInfo));
+
+ /*
+ * Switch our attention to the subquery as mangled by the planner. It
+ * was okay to look at the pre-planning version for the tests above,
+ * but now we need a Var that will refer to the subroot's live
+ * RelOptInfos. For instance, if any subquery pullup happened during
+ * planning, Vars in the targetlist might have gotten replaced, and we
+ * need to see the replacement expressions.
+ */
+ subquery = rel->subroot->parse;
+ Assert(IsA(subquery, Query));
+
+ /* Get the subquery output expression referenced by the upper Var */
+ ste = get_tle_by_resno(subquery->targetList, var->varattno);
+ if (ste == NULL || ste->resjunk)
+ elog(ERROR, "subquery %s does not have attribute %d",
+ rte->eref->aliasname, var->varattno);
+ var = (Var *) ste->expr;
+
+ /*
+ * If subquery uses DISTINCT, we can't make use of any stats for the
+ * variable ... but, if it's the only DISTINCT column, we are entitled
+ * to consider it unique. We do the test this way so that it works
+ * for cases involving DISTINCT ON.
+ */
+ if (subquery->distinctClause)
+ {
+ if (list_length(subquery->distinctClause) == 1 &&
+ targetIsInSortList(ste, InvalidOid, subquery->distinctClause))
+ vardata->isunique = true;
+ /* cannot go further */
+ return;
+ }
+
+ /*
+ * If the sub-query originated from a view with the security_barrier
+ * attribute, we must not look at the variable's statistics, though it
+ * seems all right to notice the existence of a DISTINCT clause. So
+ * stop here.
+ *
+ * This is probably a harsher restriction than necessary; it's
+ * certainly OK for the selectivity estimator (which is a C function,
+ * and therefore omnipotent anyway) to look at the statistics. But
+ * many selectivity estimators will happily *invoke the operator
+ * function* to try to work out a good estimate - and that's not OK.
+ * So for now, don't dig down for stats.
+ */
+ if (rte->security_barrier)
+ return;
+
+ /* Can only handle a simple Var of subquery's query level */
+ if (var && IsA(var, Var) &&
+ var->varlevelsup == 0)
+ {
+ /*
+ * OK, recurse into the subquery. Note that the original setting
+ * of vardata->isunique (which will surely be false) is left
+ * unchanged in this situation. That's what we want, since even
+ * if the underlying column is unique, the subquery may have
+ * joined to other tables in a way that creates duplicates.
+ */
+ examine_simple_variable(rel->subroot, var, vardata);
+ }
+ }
+ else
+ {
+ /*
+ * Otherwise, the Var comes from a FUNCTION, VALUES, or CTE RTE. (We
+ * won't see RTE_JOIN here because join alias Vars have already been
+ * flattened.) There's not much we can do with function outputs, but
+ * maybe someday try to be smarter about VALUES and/or CTEs.
+ */
+ }
+}
+
+/*
+ * Check whether it is permitted to call func_oid passing some of the
+ * pg_statistic data in vardata. We allow this either if the user has SELECT
+ * privileges on the table or column underlying the pg_statistic data or if
+ * the function is marked leak-proof.
+ */
+bool
+statistic_proc_security_check(VariableStatData *vardata, Oid func_oid)
+{
+ if (vardata->acl_ok)
+ return true;
+
+ if (!OidIsValid(func_oid))
+ return false;
+
+ if (get_func_leakproof(func_oid))
+ return true;
+
+ ereport(DEBUG2,
+ (errmsg_internal("not using statistics because function \"%s\" is not leak-proof",
+ get_func_name(func_oid))));
+ return false;
+}
+
+/*
+ * get_variable_numdistinct
+ * Estimate the number of distinct values of a variable.
+ *
+ * vardata: results of examine_variable
+ * *isdefault: set to true if the result is a default rather than based on
+ * anything meaningful.
+ *
+ * NB: be careful to produce a positive integral result, since callers may
+ * compare the result to exact integer counts, or might divide by it.
+ */
+double
+get_variable_numdistinct(VariableStatData *vardata, bool *isdefault)
+{
+ double stadistinct;
+ double stanullfrac = 0.0;
+ double ntuples;
+
+ *isdefault = false;
+
+ /*
+ * Determine the stadistinct value to use. There are cases where we can
+ * get an estimate even without a pg_statistic entry, or can get a better
+ * value than is in pg_statistic. Grab stanullfrac too if we can find it
+ * (otherwise, assume no nulls, for lack of any better idea).
+ */
+ if (HeapTupleIsValid(vardata->statsTuple))
+ {
+ /* Use the pg_statistic entry */
+ Form_pg_statistic stats;
+
+ stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
+ stadistinct = stats->stadistinct;
+ stanullfrac = stats->stanullfrac;
+ }
+ else if (vardata->vartype == BOOLOID)
+ {
+ /*
+ * Special-case boolean columns: presumably, two distinct values.
+ *
+ * Are there any other datatypes we should wire in special estimates
+ * for?
+ */
+ stadistinct = 2.0;
+ }
+ else if (vardata->rel && vardata->rel->rtekind == RTE_VALUES)
+ {
+ /*
+ * If the Var represents a column of a VALUES RTE, assume it's unique.
+ * This could of course be very wrong, but it should tend to be true
+ * in well-written queries. We could consider examining the VALUES'
+ * contents to get some real statistics; but that only works if the
+ * entries are all constants, and it would be pretty expensive anyway.
+ */
+ stadistinct = -1.0; /* unique (and all non null) */
+ }
+ else
+ {
+ /*
+ * We don't keep statistics for system columns, but in some cases we
+ * can infer distinctness anyway.
+ */
+ if (vardata->var && IsA(vardata->var, Var))
+ {
+ switch (((Var *) vardata->var)->varattno)
+ {
+ case SelfItemPointerAttributeNumber:
+ stadistinct = -1.0; /* unique (and all non null) */
+ break;
+ case TableOidAttributeNumber:
+ stadistinct = 1.0; /* only 1 value */
+ break;
+ default:
+ stadistinct = 0.0; /* means "unknown" */
+ break;
+ }
+ }
+ else
+ stadistinct = 0.0; /* means "unknown" */
+
+ /*
+ * XXX consider using estimate_num_groups on expressions?
+ */
+ }
+
+ /*
+ * If there is a unique index or DISTINCT clause for the variable, assume
+ * it is unique no matter what pg_statistic says; the statistics could be
+ * out of date, or we might have found a partial unique index that proves
+ * the var is unique for this query. However, we'd better still believe
+ * the null-fraction statistic.
+ */
+ if (vardata->isunique)
+ stadistinct = -1.0 * (1.0 - stanullfrac);
+
+ /*
+ * If we had an absolute estimate, use that.
+ */
+ if (stadistinct > 0.0)
+ return clamp_row_est(stadistinct);
+
+ /*
+ * Otherwise we need to get the relation size; punt if not available.
+ */
+ if (vardata->rel == NULL)
+ {
+ *isdefault = true;
+ return DEFAULT_NUM_DISTINCT;
+ }
+ ntuples = vardata->rel->tuples;
+ if (ntuples <= 0.0)
+ {
+ *isdefault = true;
+ return DEFAULT_NUM_DISTINCT;
+ }
+
+ /*
+ * If we had a relative estimate, use that.
+ */
+ if (stadistinct < 0.0)
+ return clamp_row_est(-stadistinct * ntuples);
+
+ /*
+ * With no data, estimate ndistinct = ntuples if the table is small, else
+ * use default. We use DEFAULT_NUM_DISTINCT as the cutoff for "small" so
+ * that the behavior isn't discontinuous.
+ */
+ if (ntuples < DEFAULT_NUM_DISTINCT)
+ return clamp_row_est(ntuples);
+
+ *isdefault = true;
+ return DEFAULT_NUM_DISTINCT;
+}
+
+/*
+ * get_variable_range
+ * Estimate the minimum and maximum value of the specified variable.
+ * If successful, store values in *min and *max, and return true.
+ * If no data available, return false.
+ *
+ * sortop is the "<" comparison operator to use. This should generally
+ * be "<" not ">", as only the former is likely to be found in pg_statistic.
+ * The collation must be specified too.
+ */
+static bool
+get_variable_range(PlannerInfo *root, VariableStatData *vardata,
+ Oid sortop, Oid collation,
+ Datum *min, Datum *max)
+{
+ Datum tmin = 0;
+ Datum tmax = 0;
+ bool have_data = false;
+ int16 typLen;
+ bool typByVal;
+ Oid opfuncoid;
+ FmgrInfo opproc;
+ AttStatsSlot sslot;
+
+ /*
+ * XXX It's very tempting to try to use the actual column min and max, if
+ * we can get them relatively-cheaply with an index probe. However, since
+ * this function is called many times during join planning, that could
+ * have unpleasant effects on planning speed. Need more investigation
+ * before enabling this.
+ */
+#ifdef NOT_USED
+ if (get_actual_variable_range(root, vardata, sortop, collation, min, max))
+ return true;
+#endif
+
+ if (!HeapTupleIsValid(vardata->statsTuple))
+ {
+ /* no stats available, so default result */
+ return false;
+ }
+
+ /*
+ * If we can't apply the sortop to the stats data, just fail. In
+ * principle, if there's a histogram and no MCVs, we could return the
+ * histogram endpoints without ever applying the sortop ... but it's
+ * probably not worth trying, because whatever the caller wants to do with
+ * the endpoints would likely fail the security check too.
+ */
+ if (!statistic_proc_security_check(vardata,
+ (opfuncoid = get_opcode(sortop))))
+ return false;
+
+ opproc.fn_oid = InvalidOid; /* mark this as not looked up yet */
+
+ get_typlenbyval(vardata->atttype, &typLen, &typByVal);
+
+ /*
+ * If there is a histogram with the ordering we want, grab the first and
+ * last values.
+ */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, sortop,
+ ATTSTATSSLOT_VALUES))
+ {
+ if (sslot.stacoll == collation && sslot.nvalues > 0)
+ {
+ tmin = datumCopy(sslot.values[0], typByVal, typLen);
+ tmax = datumCopy(sslot.values[sslot.nvalues - 1], typByVal, typLen);
+ have_data = true;
+ }
+ free_attstatsslot(&sslot);
+ }
+
+ /*
+ * Otherwise, if there is a histogram with some other ordering, scan it
+ * and get the min and max values according to the ordering we want. This
+ * of course may not find values that are really extremal according to our
+ * ordering, but it beats ignoring available data.
+ */
+ if (!have_data &&
+ get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_HISTOGRAM, InvalidOid,
+ ATTSTATSSLOT_VALUES))
+ {
+ get_stats_slot_range(&sslot, opfuncoid, &opproc,
+ collation, typLen, typByVal,
+ &tmin, &tmax, &have_data);
+ free_attstatsslot(&sslot);
+ }
+
+ /*
+ * If we have most-common-values info, look for extreme MCVs. This is
+ * needed even if we also have a histogram, since the histogram excludes
+ * the MCVs. However, if we *only* have MCVs and no histogram, we should
+ * be pretty wary of deciding that that is a full representation of the
+ * data. Proceed only if the MCVs represent the whole table (to within
+ * roundoff error).
+ */
+ if (get_attstatsslot(&sslot, vardata->statsTuple,
+ STATISTIC_KIND_MCV, InvalidOid,
+ have_data ? ATTSTATSSLOT_VALUES :
+ (ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS)))
+ {
+ bool use_mcvs = have_data;
+
+ if (!have_data)
+ {
+ double sumcommon = 0.0;
+ double nullfrac;
+ int i;
+
+ for (i = 0; i < sslot.nnumbers; i++)
+ sumcommon += sslot.numbers[i];
+ nullfrac = ((Form_pg_statistic) GETSTRUCT(vardata->statsTuple))->stanullfrac;
+ if (sumcommon + nullfrac > 0.99999)
+ use_mcvs = true;
+ }
+
+ if (use_mcvs)
+ get_stats_slot_range(&sslot, opfuncoid, &opproc,
+ collation, typLen, typByVal,
+ &tmin, &tmax, &have_data);
+ free_attstatsslot(&sslot);
+ }
+
+ *min = tmin;
+ *max = tmax;
+ return have_data;
+}
+
+/*
+ * get_stats_slot_range: scan sslot for min/max values
+ *
+ * Subroutine for get_variable_range: update min/max/have_data according
+ * to what we find in the statistics array.
+ */
+static void
+get_stats_slot_range(AttStatsSlot *sslot, Oid opfuncoid, FmgrInfo *opproc,
+ Oid collation, int16 typLen, bool typByVal,
+ Datum *min, Datum *max, bool *p_have_data)
+{
+ Datum tmin = *min;
+ Datum tmax = *max;
+ bool have_data = *p_have_data;
+ bool found_tmin = false;
+ bool found_tmax = false;
+
+ /* Look up the comparison function, if we didn't already do so */
+ if (opproc->fn_oid != opfuncoid)
+ fmgr_info(opfuncoid, opproc);
+
+ /* Scan all the slot's values */
+ for (int i = 0; i < sslot->nvalues; i++)
+ {
+ if (!have_data)
+ {
+ tmin = tmax = sslot->values[i];
+ found_tmin = found_tmax = true;
+ *p_have_data = have_data = true;
+ continue;
+ }
+ if (DatumGetBool(FunctionCall2Coll(opproc,
+ collation,
+ sslot->values[i], tmin)))
+ {
+ tmin = sslot->values[i];
+ found_tmin = true;
+ }
+ if (DatumGetBool(FunctionCall2Coll(opproc,
+ collation,
+ tmax, sslot->values[i])))
+ {
+ tmax = sslot->values[i];
+ found_tmax = true;
+ }
+ }
+
+ /*
+ * Copy the slot's values, if we found new extreme values.
+ */
+ if (found_tmin)
+ *min = datumCopy(tmin, typByVal, typLen);
+ if (found_tmax)
+ *max = datumCopy(tmax, typByVal, typLen);
+}
+
+
+/*
+ * get_actual_variable_range
+ * Attempt to identify the current *actual* minimum and/or maximum
+ * of the specified variable, by looking for a suitable btree index
+ * and fetching its low and/or high values.
+ * If successful, store values in *min and *max, and return true.
+ * (Either pointer can be NULL if that endpoint isn't needed.)
+ * If unsuccessful, return false.
+ *
+ * sortop is the "<" comparison operator to use.
+ * collation is the required collation.
+ */
+static bool
+get_actual_variable_range(PlannerInfo *root, VariableStatData *vardata,
+ Oid sortop, Oid collation,
+ Datum *min, Datum *max)
+{
+ bool have_data = false;
+ RelOptInfo *rel = vardata->rel;
+ RangeTblEntry *rte;
+ ListCell *lc;
+
+ /* No hope if no relation or it doesn't have indexes */
+ if (rel == NULL || rel->indexlist == NIL)
+ return false;
+ /* If it has indexes it must be a plain relation */
+ rte = root->simple_rte_array[rel->relid];
+ Assert(rte->rtekind == RTE_RELATION);
+
+ /* Search through the indexes to see if any match our problem */
+ foreach(lc, rel->indexlist)
+ {
+ IndexOptInfo *index = (IndexOptInfo *) lfirst(lc);
+ ScanDirection indexscandir;
+
+ /* Ignore non-btree indexes */
+ if (index->relam != BTREE_AM_OID)
+ continue;
+
+ /*
+ * Ignore partial indexes --- we only want stats that cover the entire
+ * relation.
+ */
+ if (index->indpred != NIL)
+ continue;
+
+ /*
+ * The index list might include hypothetical indexes inserted by a
+ * get_relation_info hook --- don't try to access them.
+ */
+ if (index->hypothetical)
+ continue;
+
+ /*
+ * The first index column must match the desired variable, sortop, and
+ * collation --- but we can use a descending-order index.
+ */
+ if (collation != index->indexcollations[0])
+ continue; /* test first 'cause it's cheapest */
+ if (!match_index_to_operand(vardata->var, 0, index))
+ continue;
+ switch (get_op_opfamily_strategy(sortop, index->sortopfamily[0]))
+ {
+ case BTLessStrategyNumber:
+ if (index->reverse_sort[0])
+ indexscandir = BackwardScanDirection;
+ else
+ indexscandir = ForwardScanDirection;
+ break;
+ case BTGreaterStrategyNumber:
+ if (index->reverse_sort[0])
+ indexscandir = ForwardScanDirection;
+ else
+ indexscandir = BackwardScanDirection;
+ break;
+ default:
+ /* index doesn't match the sortop */
+ continue;
+ }
+
+ /*
+ * Found a suitable index to extract data from. Set up some data that
+ * can be used by both invocations of get_actual_variable_endpoint.
+ */
+ {
+ MemoryContext tmpcontext;
+ MemoryContext oldcontext;
+ Relation heapRel;
+ Relation indexRel;
+ TupleTableSlot *slot;
+ int16 typLen;
+ bool typByVal;
+ ScanKeyData scankeys[1];
+
+ /* Make sure any cruft gets recycled when we're done */
+ tmpcontext = AllocSetContextCreate(CurrentMemoryContext,
+ "get_actual_variable_range workspace",
+ ALLOCSET_DEFAULT_SIZES);
+ oldcontext = MemoryContextSwitchTo(tmpcontext);
+
+ /*
+ * Open the table and index so we can read from them. We should
+ * already have some type of lock on each.
+ */
+ heapRel = table_open(rte->relid, NoLock);
+ indexRel = index_open(index->indexoid, NoLock);
+
+ /* build some stuff needed for indexscan execution */
+ slot = table_slot_create(heapRel, NULL);
+ get_typlenbyval(vardata->atttype, &typLen, &typByVal);
+
+ /* set up an IS NOT NULL scan key so that we ignore nulls */
+ ScanKeyEntryInitialize(&scankeys[0],
+ SK_ISNULL | SK_SEARCHNOTNULL,
+ 1, /* index col to scan */
+ InvalidStrategy, /* no strategy */
+ InvalidOid, /* no strategy subtype */
+ InvalidOid, /* no collation */
+ InvalidOid, /* no reg proc for this */
+ (Datum) 0); /* constant */
+
+ /* If min is requested ... */
+ if (min)
+ {
+ have_data = get_actual_variable_endpoint(heapRel,
+ indexRel,
+ indexscandir,
+ scankeys,
+ typLen,
+ typByVal,
+ slot,
+ oldcontext,
+ min);
+ }
+ else
+ {
+ /* If min not requested, still want to fetch max */
+ have_data = true;
+ }
+
+ /* If max is requested, and we didn't already fail ... */
+ if (max && have_data)
+ {
+ /* scan in the opposite direction; all else is the same */
+ have_data = get_actual_variable_endpoint(heapRel,
+ indexRel,
+ -indexscandir,
+ scankeys,
+ typLen,
+ typByVal,
+ slot,
+ oldcontext,
+ max);
+ }
+
+ /* Clean everything up */
+ ExecDropSingleTupleTableSlot(slot);
+
+ index_close(indexRel, NoLock);
+ table_close(heapRel, NoLock);
+
+ MemoryContextSwitchTo(oldcontext);
+ MemoryContextDelete(tmpcontext);
+
+ /* And we're done */
+ break;
+ }
+ }
+
+ return have_data;
+}
+
+/*
+ * Get one endpoint datum (min or max depending on indexscandir) from the
+ * specified index. Return true if successful, false if not.
+ * On success, endpoint value is stored to *endpointDatum (and copied into
+ * outercontext).
+ *
+ * scankeys is a 1-element scankey array set up to reject nulls.
+ * typLen/typByVal describe the datatype of the index's first column.
+ * tableslot is a slot suitable to hold table tuples, in case we need
+ * to probe the heap.
+ * (We could compute these values locally, but that would mean computing them
+ * twice when get_actual_variable_range needs both the min and the max.)
+ *
+ * Failure occurs either when the index is empty, or we decide that it's
+ * taking too long to find a suitable tuple.
+ */
+static bool
+get_actual_variable_endpoint(Relation heapRel,
+ Relation indexRel,
+ ScanDirection indexscandir,
+ ScanKey scankeys,
+ int16 typLen,
+ bool typByVal,
+ TupleTableSlot *tableslot,
+ MemoryContext outercontext,
+ Datum *endpointDatum)
+{
+ bool have_data = false;
+ SnapshotData SnapshotNonVacuumable;
+ IndexScanDesc index_scan;
+ Buffer vmbuffer = InvalidBuffer;
+ BlockNumber last_heap_block = InvalidBlockNumber;
+ int n_visited_heap_pages = 0;
+ ItemPointer tid;
+ Datum values[INDEX_MAX_KEYS];
+ bool isnull[INDEX_MAX_KEYS];
+ MemoryContext oldcontext;
+
+ /*
+ * We use the index-only-scan machinery for this. With mostly-static
+ * tables that's a win because it avoids a heap visit. It's also a win
+ * for dynamic data, but the reason is less obvious; read on for details.
+ *
+ * In principle, we should scan the index with our current active
+ * snapshot, which is the best approximation we've got to what the query
+ * will see when executed. But that won't be exact if a new snap is taken
+ * before running the query, and it can be very expensive if a lot of
+ * recently-dead or uncommitted rows exist at the beginning or end of the
+ * index (because we'll laboriously fetch each one and reject it).
+ * Instead, we use SnapshotNonVacuumable. That will accept recently-dead
+ * and uncommitted rows as well as normal visible rows. On the other
+ * hand, it will reject known-dead rows, and thus not give a bogus answer
+ * when the extreme value has been deleted (unless the deletion was quite
+ * recent); that case motivates not using SnapshotAny here.
+ *
+ * A crucial point here is that SnapshotNonVacuumable, with
+ * GlobalVisTestFor(heapRel) as horizon, yields the inverse of the
+ * condition that the indexscan will use to decide that index entries are
+ * killable (see heap_hot_search_buffer()). Therefore, if the snapshot
+ * rejects a tuple (or more precisely, all tuples of a HOT chain) and we
+ * have to continue scanning past it, we know that the indexscan will mark
+ * that index entry killed. That means that the next
+ * get_actual_variable_endpoint() call will not have to re-consider that
+ * index entry. In this way we avoid repetitive work when this function
+ * is used a lot during planning.
+ *
+ * But using SnapshotNonVacuumable creates a hazard of its own. In a
+ * recently-created index, some index entries may point at "broken" HOT
+ * chains in which not all the tuple versions contain data matching the
+ * index entry. The live tuple version(s) certainly do match the index,
+ * but SnapshotNonVacuumable can accept recently-dead tuple versions that
+ * don't match. Hence, if we took data from the selected heap tuple, we
+ * might get a bogus answer that's not close to the index extremal value,
+ * or could even be NULL. We avoid this hazard because we take the data
+ * from the index entry not the heap.
+ *
+ * Despite all this care, there are situations where we might find many
+ * non-visible tuples near the end of the index. We don't want to expend
+ * a huge amount of time here, so we give up once we've read too many heap
+ * pages. When we fail for that reason, the caller will end up using
+ * whatever extremal value is recorded in pg_statistic.
+ */
+ InitNonVacuumableSnapshot(SnapshotNonVacuumable,
+ GlobalVisTestFor(heapRel));
+
+ index_scan = index_beginscan(heapRel, indexRel,
+ &SnapshotNonVacuumable,
+ 1, 0);
+ /* Set it up for index-only scan */
+ index_scan->xs_want_itup = true;
+ index_rescan(index_scan, scankeys, 1, NULL, 0);
+
+ /* Fetch first/next tuple in specified direction */
+ while ((tid = index_getnext_tid(index_scan, indexscandir)) != NULL)
+ {
+ BlockNumber block = ItemPointerGetBlockNumber(tid);
+
+ if (!VM_ALL_VISIBLE(heapRel,
+ block,
+ &vmbuffer))
+ {
+ /* Rats, we have to visit the heap to check visibility */
+ if (!index_fetch_heap(index_scan, tableslot))
+ {
+ /*
+ * No visible tuple for this index entry, so we need to
+ * advance to the next entry. Before doing so, count heap
+ * page fetches and give up if we've done too many.
+ *
+ * We don't charge a page fetch if this is the same heap page
+ * as the previous tuple. This is on the conservative side,
+ * since other recently-accessed pages are probably still in
+ * buffers too; but it's good enough for this heuristic.
+ */
+#define VISITED_PAGES_LIMIT 100
+
+ if (block != last_heap_block)
+ {
+ last_heap_block = block;
+ n_visited_heap_pages++;
+ if (n_visited_heap_pages > VISITED_PAGES_LIMIT)
+ break;
+ }
+
+ continue; /* no visible tuple, try next index entry */
+ }
+
+ /* We don't actually need the heap tuple for anything */
+ ExecClearTuple(tableslot);
+
+ /*
+ * We don't care whether there's more than one visible tuple in
+ * the HOT chain; if any are visible, that's good enough.
+ */
+ }
+
+ /*
+ * We expect that btree will return data in IndexTuple not HeapTuple
+ * format. It's not lossy either.
+ */
+ if (!index_scan->xs_itup)
+ elog(ERROR, "no data returned for index-only scan");
+ if (index_scan->xs_recheck)
+ elog(ERROR, "unexpected recheck indication from btree");
+
+ /* OK to deconstruct the index tuple */
+ index_deform_tuple(index_scan->xs_itup,
+ index_scan->xs_itupdesc,
+ values, isnull);
+
+ /* Shouldn't have got a null, but be careful */
+ if (isnull[0])
+ elog(ERROR, "found unexpected null value in index \"%s\"",
+ RelationGetRelationName(indexRel));
+
+ /* Copy the index column value out to caller's context */
+ oldcontext = MemoryContextSwitchTo(outercontext);
+ *endpointDatum = datumCopy(values[0], typByVal, typLen);
+ MemoryContextSwitchTo(oldcontext);
+ have_data = true;
+ break;
+ }
+
+ if (vmbuffer != InvalidBuffer)
+ ReleaseBuffer(vmbuffer);
+ index_endscan(index_scan);
+
+ return have_data;
+}
+
+/*
+ * find_join_input_rel
+ * Look up the input relation for a join.
+ *
+ * We assume that the input relation's RelOptInfo must have been constructed
+ * already.
+ */
+static RelOptInfo *
+find_join_input_rel(PlannerInfo *root, Relids relids)
+{
+ RelOptInfo *rel = NULL;
+
+ switch (bms_membership(relids))
+ {
+ case BMS_EMPTY_SET:
+ /* should not happen */
+ break;
+ case BMS_SINGLETON:
+ rel = find_base_rel(root, bms_singleton_member(relids));
+ break;
+ case BMS_MULTIPLE:
+ rel = find_join_rel(root, relids);
+ break;
+ }
+
+ if (rel == NULL)
+ elog(ERROR, "could not find RelOptInfo for given relids");
+
+ return rel;
+}
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Index cost estimation functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Extract the actual indexquals (as RestrictInfos) from an IndexClause list
+ */
+List *
+get_quals_from_indexclauses(List *indexclauses)
+{
+ List *result = NIL;
+ ListCell *lc;
+
+ foreach(lc, indexclauses)
+ {
+ IndexClause *iclause = lfirst_node(IndexClause, lc);
+ ListCell *lc2;
+
+ foreach(lc2, iclause->indexquals)
+ {
+ RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2);
+
+ result = lappend(result, rinfo);
+ }
+ }
+ return result;
+}
+
+/*
+ * Compute the total evaluation cost of the comparison operands in a list
+ * of index qual expressions. Since we know these will be evaluated just
+ * once per scan, there's no need to distinguish startup from per-row cost.
+ *
+ * This can be used either on the result of get_quals_from_indexclauses(),
+ * or directly on an indexorderbys list. In both cases, we expect that the
+ * index key expression is on the left side of binary clauses.
+ */
+Cost
+index_other_operands_eval_cost(PlannerInfo *root, List *indexquals)
+{
+ Cost qual_arg_cost = 0;
+ ListCell *lc;
+
+ foreach(lc, indexquals)
+ {
+ Expr *clause = (Expr *) lfirst(lc);
+ Node *other_operand;
+ QualCost index_qual_cost;
+
+ /*
+ * Index quals will have RestrictInfos, indexorderbys won't. Look
+ * through RestrictInfo if present.
+ */
+ if (IsA(clause, RestrictInfo))
+ clause = ((RestrictInfo *) clause)->clause;
+
+ if (IsA(clause, OpExpr))
+ {
+ OpExpr *op = (OpExpr *) clause;
+
+ other_operand = (Node *) lsecond(op->args);
+ }
+ else if (IsA(clause, RowCompareExpr))
+ {
+ RowCompareExpr *rc = (RowCompareExpr *) clause;
+
+ other_operand = (Node *) rc->rargs;
+ }
+ else if (IsA(clause, ScalarArrayOpExpr))
+ {
+ ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause;
+
+ other_operand = (Node *) lsecond(saop->args);
+ }
+ else if (IsA(clause, NullTest))
+ {
+ other_operand = NULL;
+ }
+ else
+ {
+ elog(ERROR, "unsupported indexqual type: %d",
+ (int) nodeTag(clause));
+ other_operand = NULL; /* keep compiler quiet */
+ }
+
+ cost_qual_eval_node(&index_qual_cost, other_operand, root);
+ qual_arg_cost += index_qual_cost.startup + index_qual_cost.per_tuple;
+ }
+ return qual_arg_cost;
+}
+
+void
+genericcostestimate(PlannerInfo *root,
+ IndexPath *path,
+ double loop_count,
+ GenericCosts *costs)
+{
+ IndexOptInfo *index = path->indexinfo;
+ List *indexQuals = get_quals_from_indexclauses(path->indexclauses);
+ List *indexOrderBys = path->indexorderbys;
+ Cost indexStartupCost;
+ Cost indexTotalCost;
+ Selectivity indexSelectivity;
+ double indexCorrelation;
+ double numIndexPages;
+ double numIndexTuples;
+ double spc_random_page_cost;
+ double num_sa_scans;
+ double num_outer_scans;
+ double num_scans;
+ double qual_op_cost;
+ double qual_arg_cost;
+ List *selectivityQuals;
+ ListCell *l;
+
+ /*
+ * If the index is partial, AND the index predicate with the explicitly
+ * given indexquals to produce a more accurate idea of the index
+ * selectivity.
+ */
+ selectivityQuals = add_predicate_to_index_quals(index, indexQuals);
+
+ /*
+ * Check for ScalarArrayOpExpr index quals, and estimate the number of
+ * index scans that will be performed.
+ */
+ num_sa_scans = 1;
+ foreach(l, indexQuals)
+ {
+ RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
+
+ if (IsA(rinfo->clause, ScalarArrayOpExpr))
+ {
+ ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) rinfo->clause;
+ int alength = estimate_array_length(lsecond(saop->args));
+
+ if (alength > 1)
+ num_sa_scans *= alength;
+ }
+ }
+
+ /* Estimate the fraction of main-table tuples that will be visited */
+ indexSelectivity = clauselist_selectivity(root, selectivityQuals,
+ index->rel->relid,
+ JOIN_INNER,
+ NULL);
+
+ /*
+ * If caller didn't give us an estimate, estimate the number of index
+ * tuples that will be visited. We do it in this rather peculiar-looking
+ * way in order to get the right answer for partial indexes.
+ */
+ numIndexTuples = costs->numIndexTuples;
+ if (numIndexTuples <= 0.0)
+ {
+ numIndexTuples = indexSelectivity * index->rel->tuples;
+
+ /*
+ * The above calculation counts all the tuples visited across all
+ * scans induced by ScalarArrayOpExpr nodes. We want to consider the
+ * average per-indexscan number, so adjust. This is a handy place to
+ * round to integer, too. (If caller supplied tuple estimate, it's
+ * responsible for handling these considerations.)
+ */
+ numIndexTuples = rint(numIndexTuples / num_sa_scans);
+ }
+
+ /*
+ * We can bound the number of tuples by the index size in any case. Also,
+ * always estimate at least one tuple is touched, even when
+ * indexSelectivity estimate is tiny.
+ */
+ if (numIndexTuples > index->tuples)
+ numIndexTuples = index->tuples;
+ if (numIndexTuples < 1.0)
+ numIndexTuples = 1.0;
+
+ /*
+ * Estimate the number of index pages that will be retrieved.
+ *
+ * We use the simplistic method of taking a pro-rata fraction of the total
+ * number of index pages. In effect, this counts only leaf pages and not
+ * any overhead such as index metapage or upper tree levels.
+ *
+ * In practice access to upper index levels is often nearly free because
+ * those tend to stay in cache under load; moreover, the cost involved is
+ * highly dependent on index type. We therefore ignore such costs here
+ * and leave it to the caller to add a suitable charge if needed.
+ */
+ if (index->pages > 1 && index->tuples > 1)
+ numIndexPages = ceil(numIndexTuples * index->pages / index->tuples);
+ else
+ numIndexPages = 1.0;
+
+ /* fetch estimated page cost for tablespace containing index */
+ get_tablespace_page_costs(index->reltablespace,
+ &spc_random_page_cost,
+ NULL);
+
+ /*
+ * Now compute the disk access costs.
+ *
+ * The above calculations are all per-index-scan. However, if we are in a
+ * nestloop inner scan, we can expect the scan to be repeated (with
+ * different search keys) for each row of the outer relation. Likewise,
+ * ScalarArrayOpExpr quals result in multiple index scans. This creates
+ * the potential for cache effects to reduce the number of disk page
+ * fetches needed. We want to estimate the average per-scan I/O cost in
+ * the presence of caching.
+ *
+ * We use the Mackert-Lohman formula (see costsize.c for details) to
+ * estimate the total number of page fetches that occur. While this
+ * wasn't what it was designed for, it seems a reasonable model anyway.
+ * Note that we are counting pages not tuples anymore, so we take N = T =
+ * index size, as if there were one "tuple" per page.
+ */
+ num_outer_scans = loop_count;
+ num_scans = num_sa_scans * num_outer_scans;
+
+ if (num_scans > 1)
+ {
+ double pages_fetched;
+
+ /* total page fetches ignoring cache effects */
+ pages_fetched = numIndexPages * num_scans;
+
+ /* use Mackert and Lohman formula to adjust for cache effects */
+ pages_fetched = index_pages_fetched(pages_fetched,
+ index->pages,
+ (double) index->pages,
+ root);
+
+ /*
+ * Now compute the total disk access cost, and then report a pro-rated
+ * share for each outer scan. (Don't pro-rate for ScalarArrayOpExpr,
+ * since that's internal to the indexscan.)
+ */
+ indexTotalCost = (pages_fetched * spc_random_page_cost)
+ / num_outer_scans;
+ }
+ else
+ {
+ /*
+ * For a single index scan, we just charge spc_random_page_cost per
+ * page touched.
+ */
+ indexTotalCost = numIndexPages * spc_random_page_cost;
+ }
+
+ /*
+ * CPU cost: any complex expressions in the indexquals will need to be
+ * evaluated once at the start of the scan to reduce them to runtime keys
+ * to pass to the index AM (see nodeIndexscan.c). We model the per-tuple
+ * CPU costs as cpu_index_tuple_cost plus one cpu_operator_cost per
+ * indexqual operator. Because we have numIndexTuples as a per-scan
+ * number, we have to multiply by num_sa_scans to get the correct result
+ * for ScalarArrayOpExpr cases. Similarly add in costs for any index
+ * ORDER BY expressions.
+ *
+ * Note: this neglects the possible costs of rechecking lossy operators.
+ * Detecting that that might be needed seems more expensive than it's
+ * worth, though, considering all the other inaccuracies here ...
+ */
+ qual_arg_cost = index_other_operands_eval_cost(root, indexQuals) +
+ index_other_operands_eval_cost(root, indexOrderBys);
+ qual_op_cost = cpu_operator_cost *
+ (list_length(indexQuals) + list_length(indexOrderBys));
+
+ indexStartupCost = qual_arg_cost;
+ indexTotalCost += qual_arg_cost;
+ indexTotalCost += numIndexTuples * num_sa_scans * (cpu_index_tuple_cost + qual_op_cost);
+
+ /*
+ * Generic assumption about index correlation: there isn't any.
+ */
+ indexCorrelation = 0.0;
+
+ /*
+ * Return everything to caller.
+ */
+ costs->indexStartupCost = indexStartupCost;
+ costs->indexTotalCost = indexTotalCost;
+ costs->indexSelectivity = indexSelectivity;
+ costs->indexCorrelation = indexCorrelation;
+ costs->numIndexPages = numIndexPages;
+ costs->numIndexTuples = numIndexTuples;
+ costs->spc_random_page_cost = spc_random_page_cost;
+ costs->num_sa_scans = num_sa_scans;
+}
+
+/*
+ * If the index is partial, add its predicate to the given qual list.
+ *
+ * ANDing the index predicate with the explicitly given indexquals produces
+ * a more accurate idea of the index's selectivity. However, we need to be
+ * careful not to insert redundant clauses, because clauselist_selectivity()
+ * is easily fooled into computing a too-low selectivity estimate. Our
+ * approach is to add only the predicate clause(s) that cannot be proven to
+ * be implied by the given indexquals. This successfully handles cases such
+ * as a qual "x = 42" used with a partial index "WHERE x >= 40 AND x < 50".
+ * There are many other cases where we won't detect redundancy, leading to a
+ * too-low selectivity estimate, which will bias the system in favor of using
+ * partial indexes where possible. That is not necessarily bad though.
+ *
+ * Note that indexQuals contains RestrictInfo nodes while the indpred
+ * does not, so the output list will be mixed. This is OK for both
+ * predicate_implied_by() and clauselist_selectivity(), but might be
+ * problematic if the result were passed to other things.
+ */
+List *
+add_predicate_to_index_quals(IndexOptInfo *index, List *indexQuals)
+{
+ List *predExtraQuals = NIL;
+ ListCell *lc;
+
+ if (index->indpred == NIL)
+ return indexQuals;
+
+ foreach(lc, index->indpred)
+ {
+ Node *predQual = (Node *) lfirst(lc);
+ List *oneQual = list_make1(predQual);
+
+ if (!predicate_implied_by(oneQual, indexQuals, false))
+ predExtraQuals = list_concat(predExtraQuals, oneQual);
+ }
+ return list_concat(predExtraQuals, indexQuals);
+}
+
+
+void
+btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ IndexOptInfo *index = path->indexinfo;
+ GenericCosts costs;
+ Oid relid;
+ AttrNumber colnum;
+ VariableStatData vardata;
+ double numIndexTuples;
+ Cost descentCost;
+ List *indexBoundQuals;
+ int indexcol;
+ bool eqQualHere;
+ bool found_saop;
+ bool found_is_null_op;
+ double num_sa_scans;
+ ListCell *lc;
+
+ /*
+ * For a btree scan, only leading '=' quals plus inequality quals for the
+ * immediately next attribute contribute to index selectivity (these are
+ * the "boundary quals" that determine the starting and stopping points of
+ * the index scan). Additional quals can suppress visits to the heap, so
+ * it's OK to count them in indexSelectivity, but they should not count
+ * for estimating numIndexTuples. So we must examine the given indexquals
+ * to find out which ones count as boundary quals. We rely on the
+ * knowledge that they are given in index column order.
+ *
+ * For a RowCompareExpr, we consider only the first column, just as
+ * rowcomparesel() does.
+ *
+ * If there's a ScalarArrayOpExpr in the quals, we'll actually perform N
+ * index scans not one, but the ScalarArrayOpExpr's operator can be
+ * considered to act the same as it normally does.
+ */
+ indexBoundQuals = NIL;
+ indexcol = 0;
+ eqQualHere = false;
+ found_saop = false;
+ found_is_null_op = false;
+ num_sa_scans = 1;
+ foreach(lc, path->indexclauses)
+ {
+ IndexClause *iclause = lfirst_node(IndexClause, lc);
+ ListCell *lc2;
+
+ if (indexcol != iclause->indexcol)
+ {
+ /* Beginning of a new column's quals */
+ if (!eqQualHere)
+ break; /* done if no '=' qual for indexcol */
+ eqQualHere = false;
+ indexcol++;
+ if (indexcol != iclause->indexcol)
+ break; /* no quals at all for indexcol */
+ }
+
+ /* Examine each indexqual associated with this index clause */
+ foreach(lc2, iclause->indexquals)
+ {
+ RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2);
+ Expr *clause = rinfo->clause;
+ Oid clause_op = InvalidOid;
+ int op_strategy;
+
+ if (IsA(clause, OpExpr))
+ {
+ OpExpr *op = (OpExpr *) clause;
+
+ clause_op = op->opno;
+ }
+ else if (IsA(clause, RowCompareExpr))
+ {
+ RowCompareExpr *rc = (RowCompareExpr *) clause;
+
+ clause_op = linitial_oid(rc->opnos);
+ }
+ else if (IsA(clause, ScalarArrayOpExpr))
+ {
+ ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause;
+ Node *other_operand = (Node *) lsecond(saop->args);
+ int alength = estimate_array_length(other_operand);
+
+ clause_op = saop->opno;
+ found_saop = true;
+ /* count number of SA scans induced by indexBoundQuals only */
+ if (alength > 1)
+ num_sa_scans *= alength;
+ }
+ else if (IsA(clause, NullTest))
+ {
+ NullTest *nt = (NullTest *) clause;
+
+ if (nt->nulltesttype == IS_NULL)
+ {
+ found_is_null_op = true;
+ /* IS NULL is like = for selectivity purposes */
+ eqQualHere = true;
+ }
+ }
+ else
+ elog(ERROR, "unsupported indexqual type: %d",
+ (int) nodeTag(clause));
+
+ /* check for equality operator */
+ if (OidIsValid(clause_op))
+ {
+ op_strategy = get_op_opfamily_strategy(clause_op,
+ index->opfamily[indexcol]);
+ Assert(op_strategy != 0); /* not a member of opfamily?? */
+ if (op_strategy == BTEqualStrategyNumber)
+ eqQualHere = true;
+ }
+
+ indexBoundQuals = lappend(indexBoundQuals, rinfo);
+ }
+ }
+
+ /*
+ * If index is unique and we found an '=' clause for each column, we can
+ * just assume numIndexTuples = 1 and skip the expensive
+ * clauselist_selectivity calculations. However, a ScalarArrayOp or
+ * NullTest invalidates that theory, even though it sets eqQualHere.
+ */
+ if (index->unique &&
+ indexcol == index->nkeycolumns - 1 &&
+ eqQualHere &&
+ !found_saop &&
+ !found_is_null_op)
+ numIndexTuples = 1.0;
+ else
+ {
+ List *selectivityQuals;
+ Selectivity btreeSelectivity;
+
+ /*
+ * If the index is partial, AND the index predicate with the
+ * index-bound quals to produce a more accurate idea of the number of
+ * rows covered by the bound conditions.
+ */
+ selectivityQuals = add_predicate_to_index_quals(index, indexBoundQuals);
+
+ btreeSelectivity = clauselist_selectivity(root, selectivityQuals,
+ index->rel->relid,
+ JOIN_INNER,
+ NULL);
+ numIndexTuples = btreeSelectivity * index->rel->tuples;
+
+ /*
+ * As in genericcostestimate(), we have to adjust for any
+ * ScalarArrayOpExpr quals included in indexBoundQuals, and then round
+ * to integer.
+ */
+ numIndexTuples = rint(numIndexTuples / num_sa_scans);
+ }
+
+ /*
+ * Now do generic index cost estimation.
+ */
+ MemSet(&costs, 0, sizeof(costs));
+ costs.numIndexTuples = numIndexTuples;
+
+ genericcostestimate(root, path, loop_count, &costs);
+
+ /*
+ * Add a CPU-cost component to represent the costs of initial btree
+ * descent. We don't charge any I/O cost for touching upper btree levels,
+ * since they tend to stay in cache, but we still have to do about log2(N)
+ * comparisons to descend a btree of N leaf tuples. We charge one
+ * cpu_operator_cost per comparison.
+ *
+ * If there are ScalarArrayOpExprs, charge this once per SA scan. The
+ * ones after the first one are not startup cost so far as the overall
+ * plan is concerned, so add them only to "total" cost.
+ */
+ if (index->tuples > 1) /* avoid computing log(0) */
+ {
+ descentCost = ceil(log(index->tuples) / log(2.0)) * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+ }
+
+ /*
+ * Even though we're not charging I/O cost for touching upper btree pages,
+ * it's still reasonable to charge some CPU cost per page descended
+ * through. Moreover, if we had no such charge at all, bloated indexes
+ * would appear to have the same search cost as unbloated ones, at least
+ * in cases where only a single leaf page is expected to be visited. This
+ * cost is somewhat arbitrarily set at 50x cpu_operator_cost per page
+ * touched. The number of such pages is btree tree height plus one (ie,
+ * we charge for the leaf page too). As above, charge once per SA scan.
+ */
+ descentCost = (index->tree_height + 1) * 50.0 * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+
+ /*
+ * If we can get an estimate of the first column's ordering correlation C
+ * from pg_statistic, estimate the index correlation as C for a
+ * single-column index, or C * 0.75 for multiple columns. (The idea here
+ * is that multiple columns dilute the importance of the first column's
+ * ordering, but don't negate it entirely. Before 8.0 we divided the
+ * correlation by the number of columns, but that seems too strong.)
+ */
+ MemSet(&vardata, 0, sizeof(vardata));
+
+ if (index->indexkeys[0] != 0)
+ {
+ /* Simple variable --- look to stats for the underlying table */
+ RangeTblEntry *rte = planner_rt_fetch(index->rel->relid, root);
+
+ Assert(rte->rtekind == RTE_RELATION);
+ relid = rte->relid;
+ Assert(relid != InvalidOid);
+ colnum = index->indexkeys[0];
+
+ if (get_relation_stats_hook &&
+ (*get_relation_stats_hook) (root, rte, colnum, &vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats tuple. If it did
+ * supply a tuple, it'd better have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata.statsTuple) &&
+ !vardata.freefunc)
+ elog(ERROR, "no function provided to release variable stats with");
+ }
+ else
+ {
+ vardata.statsTuple = SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(colnum),
+ BoolGetDatum(rte->inh));
+ vardata.freefunc = ReleaseSysCache;
+ }
+ }
+ else
+ {
+ /* Expression --- maybe there are stats for the index itself */
+ relid = index->indexoid;
+ colnum = 1;
+
+ if (get_index_stats_hook &&
+ (*get_index_stats_hook) (root, relid, colnum, &vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats tuple. If it did
+ * supply a tuple, it'd better have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata.statsTuple) &&
+ !vardata.freefunc)
+ elog(ERROR, "no function provided to release variable stats with");
+ }
+ else
+ {
+ vardata.statsTuple = SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(colnum),
+ BoolGetDatum(false));
+ vardata.freefunc = ReleaseSysCache;
+ }
+ }
+
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ Oid sortop;
+ AttStatsSlot sslot;
+
+ sortop = get_opfamily_member(index->opfamily[0],
+ index->opcintype[0],
+ index->opcintype[0],
+ BTLessStrategyNumber);
+ if (OidIsValid(sortop) &&
+ get_attstatsslot(&sslot, vardata.statsTuple,
+ STATISTIC_KIND_CORRELATION, sortop,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ double varCorrelation;
+
+ Assert(sslot.nnumbers == 1);
+ varCorrelation = sslot.numbers[0];
+
+ if (index->reverse_sort[0])
+ varCorrelation = -varCorrelation;
+
+ if (index->nkeycolumns > 1)
+ costs.indexCorrelation = varCorrelation * 0.75;
+ else
+ costs.indexCorrelation = varCorrelation;
+
+ free_attstatsslot(&sslot);
+ }
+ }
+
+ ReleaseVariableStats(vardata);
+
+ *indexStartupCost = costs.indexStartupCost;
+ *indexTotalCost = costs.indexTotalCost;
+ *indexSelectivity = costs.indexSelectivity;
+ *indexCorrelation = costs.indexCorrelation;
+ *indexPages = costs.numIndexPages;
+}
+
+void
+hashcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ GenericCosts costs;
+
+ MemSet(&costs, 0, sizeof(costs));
+
+ genericcostestimate(root, path, loop_count, &costs);
+
+ /*
+ * A hash index has no descent costs as such, since the index AM can go
+ * directly to the target bucket after computing the hash value. There
+ * are a couple of other hash-specific costs that we could conceivably add
+ * here, though:
+ *
+ * Ideally we'd charge spc_random_page_cost for each page in the target
+ * bucket, not just the numIndexPages pages that genericcostestimate
+ * thought we'd visit. However in most cases we don't know which bucket
+ * that will be. There's no point in considering the average bucket size
+ * because the hash AM makes sure that's always one page.
+ *
+ * Likewise, we could consider charging some CPU for each index tuple in
+ * the bucket, if we knew how many there were. But the per-tuple cost is
+ * just a hash value comparison, not a general datatype-dependent
+ * comparison, so any such charge ought to be quite a bit less than
+ * cpu_operator_cost; which makes it probably not worth worrying about.
+ *
+ * A bigger issue is that chance hash-value collisions will result in
+ * wasted probes into the heap. We don't currently attempt to model this
+ * cost on the grounds that it's rare, but maybe it's not rare enough.
+ * (Any fix for this ought to consider the generic lossy-operator problem,
+ * though; it's not entirely hash-specific.)
+ */
+
+ *indexStartupCost = costs.indexStartupCost;
+ *indexTotalCost = costs.indexTotalCost;
+ *indexSelectivity = costs.indexSelectivity;
+ *indexCorrelation = costs.indexCorrelation;
+ *indexPages = costs.numIndexPages;
+}
+
+void
+gistcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ IndexOptInfo *index = path->indexinfo;
+ GenericCosts costs;
+ Cost descentCost;
+
+ MemSet(&costs, 0, sizeof(costs));
+
+ genericcostestimate(root, path, loop_count, &costs);
+
+ /*
+ * We model index descent costs similarly to those for btree, but to do
+ * that we first need an idea of the tree height. We somewhat arbitrarily
+ * assume that the fanout is 100, meaning the tree height is at most
+ * log100(index->pages).
+ *
+ * Although this computation isn't really expensive enough to require
+ * caching, we might as well use index->tree_height to cache it.
+ */
+ if (index->tree_height < 0) /* unknown? */
+ {
+ if (index->pages > 1) /* avoid computing log(0) */
+ index->tree_height = (int) (log(index->pages) / log(100.0));
+ else
+ index->tree_height = 0;
+ }
+
+ /*
+ * Add a CPU-cost component to represent the costs of initial descent. We
+ * just use log(N) here not log2(N) since the branching factor isn't
+ * necessarily two anyway. As for btree, charge once per SA scan.
+ */
+ if (index->tuples > 1) /* avoid computing log(0) */
+ {
+ descentCost = ceil(log(index->tuples)) * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+ }
+
+ /*
+ * Likewise add a per-page charge, calculated the same as for btrees.
+ */
+ descentCost = (index->tree_height + 1) * 50.0 * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+
+ *indexStartupCost = costs.indexStartupCost;
+ *indexTotalCost = costs.indexTotalCost;
+ *indexSelectivity = costs.indexSelectivity;
+ *indexCorrelation = costs.indexCorrelation;
+ *indexPages = costs.numIndexPages;
+}
+
+void
+spgcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ IndexOptInfo *index = path->indexinfo;
+ GenericCosts costs;
+ Cost descentCost;
+
+ MemSet(&costs, 0, sizeof(costs));
+
+ genericcostestimate(root, path, loop_count, &costs);
+
+ /*
+ * We model index descent costs similarly to those for btree, but to do
+ * that we first need an idea of the tree height. We somewhat arbitrarily
+ * assume that the fanout is 100, meaning the tree height is at most
+ * log100(index->pages).
+ *
+ * Although this computation isn't really expensive enough to require
+ * caching, we might as well use index->tree_height to cache it.
+ */
+ if (index->tree_height < 0) /* unknown? */
+ {
+ if (index->pages > 1) /* avoid computing log(0) */
+ index->tree_height = (int) (log(index->pages) / log(100.0));
+ else
+ index->tree_height = 0;
+ }
+
+ /*
+ * Add a CPU-cost component to represent the costs of initial descent. We
+ * just use log(N) here not log2(N) since the branching factor isn't
+ * necessarily two anyway. As for btree, charge once per SA scan.
+ */
+ if (index->tuples > 1) /* avoid computing log(0) */
+ {
+ descentCost = ceil(log(index->tuples)) * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+ }
+
+ /*
+ * Likewise add a per-page charge, calculated the same as for btrees.
+ */
+ descentCost = (index->tree_height + 1) * 50.0 * cpu_operator_cost;
+ costs.indexStartupCost += descentCost;
+ costs.indexTotalCost += costs.num_sa_scans * descentCost;
+
+ *indexStartupCost = costs.indexStartupCost;
+ *indexTotalCost = costs.indexTotalCost;
+ *indexSelectivity = costs.indexSelectivity;
+ *indexCorrelation = costs.indexCorrelation;
+ *indexPages = costs.numIndexPages;
+}
+
+
+/*
+ * Support routines for gincostestimate
+ */
+
+typedef struct
+{
+ bool attHasFullScan[INDEX_MAX_KEYS];
+ bool attHasNormalScan[INDEX_MAX_KEYS];
+ double partialEntries;
+ double exactEntries;
+ double searchEntries;
+ double arrayScans;
+} GinQualCounts;
+
+/*
+ * Estimate the number of index terms that need to be searched for while
+ * testing the given GIN query, and increment the counts in *counts
+ * appropriately. If the query is unsatisfiable, return false.
+ */
+static bool
+gincost_pattern(IndexOptInfo *index, int indexcol,
+ Oid clause_op, Datum query,
+ GinQualCounts *counts)
+{
+ FmgrInfo flinfo;
+ Oid extractProcOid;
+ Oid collation;
+ int strategy_op;
+ Oid lefttype,
+ righttype;
+ int32 nentries = 0;
+ bool *partial_matches = NULL;
+ Pointer *extra_data = NULL;
+ bool *nullFlags = NULL;
+ int32 searchMode = GIN_SEARCH_MODE_DEFAULT;
+ int32 i;
+
+ Assert(indexcol < index->nkeycolumns);
+
+ /*
+ * Get the operator's strategy number and declared input data types within
+ * the index opfamily. (We don't need the latter, but we use
+ * get_op_opfamily_properties because it will throw error if it fails to
+ * find a matching pg_amop entry.)
+ */
+ get_op_opfamily_properties(clause_op, index->opfamily[indexcol], false,
+ &strategy_op, &lefttype, &righttype);
+
+ /*
+ * GIN always uses the "default" support functions, which are those with
+ * lefttype == righttype == the opclass' opcintype (see
+ * IndexSupportInitialize in relcache.c).
+ */
+ extractProcOid = get_opfamily_proc(index->opfamily[indexcol],
+ index->opcintype[indexcol],
+ index->opcintype[indexcol],
+ GIN_EXTRACTQUERY_PROC);
+
+ if (!OidIsValid(extractProcOid))
+ {
+ /* should not happen; throw same error as index_getprocinfo */
+ elog(ERROR, "missing support function %d for attribute %d of index \"%s\"",
+ GIN_EXTRACTQUERY_PROC, indexcol + 1,
+ get_rel_name(index->indexoid));
+ }
+
+ /*
+ * Choose collation to pass to extractProc (should match initGinState).
+ */
+ if (OidIsValid(index->indexcollations[indexcol]))
+ collation = index->indexcollations[indexcol];
+ else
+ collation = DEFAULT_COLLATION_OID;
+
+ fmgr_info(extractProcOid, &flinfo);
+
+ set_fn_opclass_options(&flinfo, index->opclassoptions[indexcol]);
+
+ FunctionCall7Coll(&flinfo,
+ collation,
+ query,
+ PointerGetDatum(&nentries),
+ UInt16GetDatum(strategy_op),
+ PointerGetDatum(&partial_matches),
+ PointerGetDatum(&extra_data),
+ PointerGetDatum(&nullFlags),
+ PointerGetDatum(&searchMode));
+
+ if (nentries <= 0 && searchMode == GIN_SEARCH_MODE_DEFAULT)
+ {
+ /* No match is possible */
+ return false;
+ }
+
+ for (i = 0; i < nentries; i++)
+ {
+ /*
+ * For partial match we haven't any information to estimate number of
+ * matched entries in index, so, we just estimate it as 100
+ */
+ if (partial_matches && partial_matches[i])
+ counts->partialEntries += 100;
+ else
+ counts->exactEntries++;
+
+ counts->searchEntries++;
+ }
+
+ if (searchMode == GIN_SEARCH_MODE_DEFAULT)
+ {
+ counts->attHasNormalScan[indexcol] = true;
+ }
+ else if (searchMode == GIN_SEARCH_MODE_INCLUDE_EMPTY)
+ {
+ /* Treat "include empty" like an exact-match item */
+ counts->attHasNormalScan[indexcol] = true;
+ counts->exactEntries++;
+ counts->searchEntries++;
+ }
+ else
+ {
+ /* It's GIN_SEARCH_MODE_ALL */
+ counts->attHasFullScan[indexcol] = true;
+ }
+
+ return true;
+}
+
+/*
+ * Estimate the number of index terms that need to be searched for while
+ * testing the given GIN index clause, and increment the counts in *counts
+ * appropriately. If the query is unsatisfiable, return false.
+ */
+static bool
+gincost_opexpr(PlannerInfo *root,
+ IndexOptInfo *index,
+ int indexcol,
+ OpExpr *clause,
+ GinQualCounts *counts)
+{
+ Oid clause_op = clause->opno;
+ Node *operand = (Node *) lsecond(clause->args);
+
+ /* aggressively reduce to a constant, and look through relabeling */
+ operand = estimate_expression_value(root, operand);
+
+ if (IsA(operand, RelabelType))
+ operand = (Node *) ((RelabelType *) operand)->arg;
+
+ /*
+ * It's impossible to call extractQuery method for unknown operand. So
+ * unless operand is a Const we can't do much; just assume there will be
+ * one ordinary search entry from the operand at runtime.
+ */
+ if (!IsA(operand, Const))
+ {
+ counts->exactEntries++;
+ counts->searchEntries++;
+ return true;
+ }
+
+ /* If Const is null, there can be no matches */
+ if (((Const *) operand)->constisnull)
+ return false;
+
+ /* Otherwise, apply extractQuery and get the actual term counts */
+ return gincost_pattern(index, indexcol, clause_op,
+ ((Const *) operand)->constvalue,
+ counts);
+}
+
+/*
+ * Estimate the number of index terms that need to be searched for while
+ * testing the given GIN index clause, and increment the counts in *counts
+ * appropriately. If the query is unsatisfiable, return false.
+ *
+ * A ScalarArrayOpExpr will give rise to N separate indexscans at runtime,
+ * each of which involves one value from the RHS array, plus all the
+ * non-array quals (if any). To model this, we average the counts across
+ * the RHS elements, and add the averages to the counts in *counts (which
+ * correspond to per-indexscan costs). We also multiply counts->arrayScans
+ * by N, causing gincostestimate to scale up its estimates accordingly.
+ */
+static bool
+gincost_scalararrayopexpr(PlannerInfo *root,
+ IndexOptInfo *index,
+ int indexcol,
+ ScalarArrayOpExpr *clause,
+ double numIndexEntries,
+ GinQualCounts *counts)
+{
+ Oid clause_op = clause->opno;
+ Node *rightop = (Node *) lsecond(clause->args);
+ ArrayType *arrayval;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ int numElems;
+ Datum *elemValues;
+ bool *elemNulls;
+ GinQualCounts arraycounts;
+ int numPossible = 0;
+ int i;
+
+ Assert(clause->useOr);
+
+ /* aggressively reduce to a constant, and look through relabeling */
+ rightop = estimate_expression_value(root, rightop);
+
+ if (IsA(rightop, RelabelType))
+ rightop = (Node *) ((RelabelType *) rightop)->arg;
+
+ /*
+ * It's impossible to call extractQuery method for unknown operand. So
+ * unless operand is a Const we can't do much; just assume there will be
+ * one ordinary search entry from each array entry at runtime, and fall
+ * back on a probably-bad estimate of the number of array entries.
+ */
+ if (!IsA(rightop, Const))
+ {
+ counts->exactEntries++;
+ counts->searchEntries++;
+ counts->arrayScans *= estimate_array_length(rightop);
+ return true;
+ }
+
+ /* If Const is null, there can be no matches */
+ if (((Const *) rightop)->constisnull)
+ return false;
+
+ /* Otherwise, extract the array elements and iterate over them */
+ arrayval = DatumGetArrayTypeP(((Const *) rightop)->constvalue);
+ get_typlenbyvalalign(ARR_ELEMTYPE(arrayval),
+ &elmlen, &elmbyval, &elmalign);
+ deconstruct_array(arrayval,
+ ARR_ELEMTYPE(arrayval),
+ elmlen, elmbyval, elmalign,
+ &elemValues, &elemNulls, &numElems);
+
+ memset(&arraycounts, 0, sizeof(arraycounts));
+
+ for (i = 0; i < numElems; i++)
+ {
+ GinQualCounts elemcounts;
+
+ /* NULL can't match anything, so ignore, as the executor will */
+ if (elemNulls[i])
+ continue;
+
+ /* Otherwise, apply extractQuery and get the actual term counts */
+ memset(&elemcounts, 0, sizeof(elemcounts));
+
+ if (gincost_pattern(index, indexcol, clause_op, elemValues[i],
+ &elemcounts))
+ {
+ /* We ignore array elements that are unsatisfiable patterns */
+ numPossible++;
+
+ if (elemcounts.attHasFullScan[indexcol] &&
+ !elemcounts.attHasNormalScan[indexcol])
+ {
+ /*
+ * Full index scan will be required. We treat this as if
+ * every key in the index had been listed in the query; is
+ * that reasonable?
+ */
+ elemcounts.partialEntries = 0;
+ elemcounts.exactEntries = numIndexEntries;
+ elemcounts.searchEntries = numIndexEntries;
+ }
+ arraycounts.partialEntries += elemcounts.partialEntries;
+ arraycounts.exactEntries += elemcounts.exactEntries;
+ arraycounts.searchEntries += elemcounts.searchEntries;
+ }
+ }
+
+ if (numPossible == 0)
+ {
+ /* No satisfiable patterns in the array */
+ return false;
+ }
+
+ /*
+ * Now add the averages to the global counts. This will give us an
+ * estimate of the average number of terms searched for in each indexscan,
+ * including contributions from both array and non-array quals.
+ */
+ counts->partialEntries += arraycounts.partialEntries / numPossible;
+ counts->exactEntries += arraycounts.exactEntries / numPossible;
+ counts->searchEntries += arraycounts.searchEntries / numPossible;
+
+ counts->arrayScans *= numPossible;
+
+ return true;
+}
+
+/*
+ * GIN has search behavior completely different from other index types
+ */
+void
+gincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ IndexOptInfo *index = path->indexinfo;
+ List *indexQuals = get_quals_from_indexclauses(path->indexclauses);
+ List *selectivityQuals;
+ double numPages = index->pages,
+ numTuples = index->tuples;
+ double numEntryPages,
+ numDataPages,
+ numPendingPages,
+ numEntries;
+ GinQualCounts counts;
+ bool matchPossible;
+ bool fullIndexScan;
+ double partialScale;
+ double entryPagesFetched,
+ dataPagesFetched,
+ dataPagesFetchedBySel;
+ double qual_op_cost,
+ qual_arg_cost,
+ spc_random_page_cost,
+ outer_scans;
+ Relation indexRel;
+ GinStatsData ginStats;
+ ListCell *lc;
+ int i;
+
+ /*
+ * Obtain statistical information from the meta page, if possible. Else
+ * set ginStats to zeroes, and we'll cope below.
+ */
+ if (!index->hypothetical)
+ {
+ /* Lock should have already been obtained in plancat.c */
+ indexRel = index_open(index->indexoid, NoLock);
+ ginGetStats(indexRel, &ginStats);
+ index_close(indexRel, NoLock);
+ }
+ else
+ {
+ memset(&ginStats, 0, sizeof(ginStats));
+ }
+
+ /*
+ * Assuming we got valid (nonzero) stats at all, nPendingPages can be
+ * trusted, but the other fields are data as of the last VACUUM. We can
+ * scale them up to account for growth since then, but that method only
+ * goes so far; in the worst case, the stats might be for a completely
+ * empty index, and scaling them will produce pretty bogus numbers.
+ * Somewhat arbitrarily, set the cutoff for doing scaling at 4X growth; if
+ * it's grown more than that, fall back to estimating things only from the
+ * assumed-accurate index size. But we'll trust nPendingPages in any case
+ * so long as it's not clearly insane, ie, more than the index size.
+ */
+ if (ginStats.nPendingPages < numPages)
+ numPendingPages = ginStats.nPendingPages;
+ else
+ numPendingPages = 0;
+
+ if (numPages > 0 && ginStats.nTotalPages <= numPages &&
+ ginStats.nTotalPages > numPages / 4 &&
+ ginStats.nEntryPages > 0 && ginStats.nEntries > 0)
+ {
+ /*
+ * OK, the stats seem close enough to sane to be trusted. But we
+ * still need to scale them by the ratio numPages / nTotalPages to
+ * account for growth since the last VACUUM.
+ */
+ double scale = numPages / ginStats.nTotalPages;
+
+ numEntryPages = ceil(ginStats.nEntryPages * scale);
+ numDataPages = ceil(ginStats.nDataPages * scale);
+ numEntries = ceil(ginStats.nEntries * scale);
+ /* ensure we didn't round up too much */
+ numEntryPages = Min(numEntryPages, numPages - numPendingPages);
+ numDataPages = Min(numDataPages,
+ numPages - numPendingPages - numEntryPages);
+ }
+ else
+ {
+ /*
+ * We might get here because it's a hypothetical index, or an index
+ * created pre-9.1 and never vacuumed since upgrading (in which case
+ * its stats would read as zeroes), or just because it's grown too
+ * much since the last VACUUM for us to put our faith in scaling.
+ *
+ * Invent some plausible internal statistics based on the index page
+ * count (and clamp that to at least 10 pages, just in case). We
+ * estimate that 90% of the index is entry pages, and the rest is data
+ * pages. Estimate 100 entries per entry page; this is rather bogus
+ * since it'll depend on the size of the keys, but it's more robust
+ * than trying to predict the number of entries per heap tuple.
+ */
+ numPages = Max(numPages, 10);
+ numEntryPages = floor((numPages - numPendingPages) * 0.90);
+ numDataPages = numPages - numPendingPages - numEntryPages;
+ numEntries = floor(numEntryPages * 100);
+ }
+
+ /* In an empty index, numEntries could be zero. Avoid divide-by-zero */
+ if (numEntries < 1)
+ numEntries = 1;
+
+ /*
+ * If the index is partial, AND the index predicate with the index-bound
+ * quals to produce a more accurate idea of the number of rows covered by
+ * the bound conditions.
+ */
+ selectivityQuals = add_predicate_to_index_quals(index, indexQuals);
+
+ /* Estimate the fraction of main-table tuples that will be visited */
+ *indexSelectivity = clauselist_selectivity(root, selectivityQuals,
+ index->rel->relid,
+ JOIN_INNER,
+ NULL);
+
+ /* fetch estimated page cost for tablespace containing index */
+ get_tablespace_page_costs(index->reltablespace,
+ &spc_random_page_cost,
+ NULL);
+
+ /*
+ * Generic assumption about index correlation: there isn't any.
+ */
+ *indexCorrelation = 0.0;
+
+ /*
+ * Examine quals to estimate number of search entries & partial matches
+ */
+ memset(&counts, 0, sizeof(counts));
+ counts.arrayScans = 1;
+ matchPossible = true;
+
+ foreach(lc, path->indexclauses)
+ {
+ IndexClause *iclause = lfirst_node(IndexClause, lc);
+ ListCell *lc2;
+
+ foreach(lc2, iclause->indexquals)
+ {
+ RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2);
+ Expr *clause = rinfo->clause;
+
+ if (IsA(clause, OpExpr))
+ {
+ matchPossible = gincost_opexpr(root,
+ index,
+ iclause->indexcol,
+ (OpExpr *) clause,
+ &counts);
+ if (!matchPossible)
+ break;
+ }
+ else if (IsA(clause, ScalarArrayOpExpr))
+ {
+ matchPossible = gincost_scalararrayopexpr(root,
+ index,
+ iclause->indexcol,
+ (ScalarArrayOpExpr *) clause,
+ numEntries,
+ &counts);
+ if (!matchPossible)
+ break;
+ }
+ else
+ {
+ /* shouldn't be anything else for a GIN index */
+ elog(ERROR, "unsupported GIN indexqual type: %d",
+ (int) nodeTag(clause));
+ }
+ }
+ }
+
+ /* Fall out if there were any provably-unsatisfiable quals */
+ if (!matchPossible)
+ {
+ *indexStartupCost = 0;
+ *indexTotalCost = 0;
+ *indexSelectivity = 0;
+ return;
+ }
+
+ /*
+ * If attribute has a full scan and at the same time doesn't have normal
+ * scan, then we'll have to scan all non-null entries of that attribute.
+ * Currently, we don't have per-attribute statistics for GIN. Thus, we
+ * must assume the whole GIN index has to be scanned in this case.
+ */
+ fullIndexScan = false;
+ for (i = 0; i < index->nkeycolumns; i++)
+ {
+ if (counts.attHasFullScan[i] && !counts.attHasNormalScan[i])
+ {
+ fullIndexScan = true;
+ break;
+ }
+ }
+
+ if (fullIndexScan || indexQuals == NIL)
+ {
+ /*
+ * Full index scan will be required. We treat this as if every key in
+ * the index had been listed in the query; is that reasonable?
+ */
+ counts.partialEntries = 0;
+ counts.exactEntries = numEntries;
+ counts.searchEntries = numEntries;
+ }
+
+ /* Will we have more than one iteration of a nestloop scan? */
+ outer_scans = loop_count;
+
+ /*
+ * Compute cost to begin scan, first of all, pay attention to pending
+ * list.
+ */
+ entryPagesFetched = numPendingPages;
+
+ /*
+ * Estimate number of entry pages read. We need to do
+ * counts.searchEntries searches. Use a power function as it should be,
+ * but tuples on leaf pages usually is much greater. Here we include all
+ * searches in entry tree, including search of first entry in partial
+ * match algorithm
+ */
+ entryPagesFetched += ceil(counts.searchEntries * rint(pow(numEntryPages, 0.15)));
+
+ /*
+ * Add an estimate of entry pages read by partial match algorithm. It's a
+ * scan over leaf pages in entry tree. We haven't any useful stats here,
+ * so estimate it as proportion. Because counts.partialEntries is really
+ * pretty bogus (see code above), it's possible that it is more than
+ * numEntries; clamp the proportion to ensure sanity.
+ */
+ partialScale = counts.partialEntries / numEntries;
+ partialScale = Min(partialScale, 1.0);
+
+ entryPagesFetched += ceil(numEntryPages * partialScale);
+
+ /*
+ * Partial match algorithm reads all data pages before doing actual scan,
+ * so it's a startup cost. Again, we haven't any useful stats here, so
+ * estimate it as proportion.
+ */
+ dataPagesFetched = ceil(numDataPages * partialScale);
+
+ /*
+ * Calculate cache effects if more than one scan due to nestloops or array
+ * quals. The result is pro-rated per nestloop scan, but the array qual
+ * factor shouldn't be pro-rated (compare genericcostestimate).
+ */
+ if (outer_scans > 1 || counts.arrayScans > 1)
+ {
+ entryPagesFetched *= outer_scans * counts.arrayScans;
+ entryPagesFetched = index_pages_fetched(entryPagesFetched,
+ (BlockNumber) numEntryPages,
+ numEntryPages, root);
+ entryPagesFetched /= outer_scans;
+ dataPagesFetched *= outer_scans * counts.arrayScans;
+ dataPagesFetched = index_pages_fetched(dataPagesFetched,
+ (BlockNumber) numDataPages,
+ numDataPages, root);
+ dataPagesFetched /= outer_scans;
+ }
+
+ /*
+ * Here we use random page cost because logically-close pages could be far
+ * apart on disk.
+ */
+ *indexStartupCost = (entryPagesFetched + dataPagesFetched) * spc_random_page_cost;
+
+ /*
+ * Now compute the number of data pages fetched during the scan.
+ *
+ * We assume every entry to have the same number of items, and that there
+ * is no overlap between them. (XXX: tsvector and array opclasses collect
+ * statistics on the frequency of individual keys; it would be nice to use
+ * those here.)
+ */
+ dataPagesFetched = ceil(numDataPages * counts.exactEntries / numEntries);
+
+ /*
+ * If there is a lot of overlap among the entries, in particular if one of
+ * the entries is very frequent, the above calculation can grossly
+ * under-estimate. As a simple cross-check, calculate a lower bound based
+ * on the overall selectivity of the quals. At a minimum, we must read
+ * one item pointer for each matching entry.
+ *
+ * The width of each item pointer varies, based on the level of
+ * compression. We don't have statistics on that, but an average of
+ * around 3 bytes per item is fairly typical.
+ */
+ dataPagesFetchedBySel = ceil(*indexSelectivity *
+ (numTuples / (BLCKSZ / 3)));
+ if (dataPagesFetchedBySel > dataPagesFetched)
+ dataPagesFetched = dataPagesFetchedBySel;
+
+ /* Account for cache effects, the same as above */
+ if (outer_scans > 1 || counts.arrayScans > 1)
+ {
+ dataPagesFetched *= outer_scans * counts.arrayScans;
+ dataPagesFetched = index_pages_fetched(dataPagesFetched,
+ (BlockNumber) numDataPages,
+ numDataPages, root);
+ dataPagesFetched /= outer_scans;
+ }
+
+ /* And apply random_page_cost as the cost per page */
+ *indexTotalCost = *indexStartupCost +
+ dataPagesFetched * spc_random_page_cost;
+
+ /*
+ * Add on index qual eval costs, much as in genericcostestimate. But we
+ * can disregard indexorderbys, since GIN doesn't support those.
+ */
+ qual_arg_cost = index_other_operands_eval_cost(root, indexQuals);
+ qual_op_cost = cpu_operator_cost * list_length(indexQuals);
+
+ *indexStartupCost += qual_arg_cost;
+ *indexTotalCost += qual_arg_cost;
+ *indexTotalCost += (numTuples * *indexSelectivity) * (cpu_index_tuple_cost + qual_op_cost);
+ *indexPages = dataPagesFetched;
+}
+
+/*
+ * BRIN has search behavior completely different from other index types
+ */
+void
+brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
+ Cost *indexStartupCost, Cost *indexTotalCost,
+ Selectivity *indexSelectivity, double *indexCorrelation,
+ double *indexPages)
+{
+ IndexOptInfo *index = path->indexinfo;
+ List *indexQuals = get_quals_from_indexclauses(path->indexclauses);
+ double numPages = index->pages;
+ RelOptInfo *baserel = index->rel;
+ RangeTblEntry *rte = planner_rt_fetch(baserel->relid, root);
+ Cost spc_seq_page_cost;
+ Cost spc_random_page_cost;
+ double qual_arg_cost;
+ double qualSelectivity;
+ BrinStatsData statsData;
+ double indexRanges;
+ double minimalRanges;
+ double estimatedRanges;
+ double selec;
+ Relation indexRel;
+ ListCell *l;
+ VariableStatData vardata;
+
+ Assert(rte->rtekind == RTE_RELATION);
+
+ /* fetch estimated page cost for the tablespace containing the index */
+ get_tablespace_page_costs(index->reltablespace,
+ &spc_random_page_cost,
+ &spc_seq_page_cost);
+
+ /*
+ * Obtain some data from the index itself, if possible. Otherwise invent
+ * some plausible internal statistics based on the relation page count.
+ */
+ if (!index->hypothetical)
+ {
+ /*
+ * A lock should have already been obtained on the index in plancat.c.
+ */
+ indexRel = index_open(index->indexoid, NoLock);
+ brinGetStats(indexRel, &statsData);
+ index_close(indexRel, NoLock);
+
+ /* work out the actual number of ranges in the index */
+ indexRanges = Max(ceil((double) baserel->pages /
+ statsData.pagesPerRange), 1.0);
+ }
+ else
+ {
+ /*
+ * Assume default number of pages per range, and estimate the number
+ * of ranges based on that.
+ */
+ indexRanges = Max(ceil((double) baserel->pages /
+ BRIN_DEFAULT_PAGES_PER_RANGE), 1.0);
+
+ statsData.pagesPerRange = BRIN_DEFAULT_PAGES_PER_RANGE;
+ statsData.revmapNumPages = (indexRanges / REVMAP_PAGE_MAXITEMS) + 1;
+ }
+
+ /*
+ * Compute index correlation
+ *
+ * Because we can use all index quals equally when scanning, we can use
+ * the largest correlation (in absolute value) among columns used by the
+ * query. Start at zero, the worst possible case. If we cannot find any
+ * correlation statistics, we will keep it as 0.
+ */
+ *indexCorrelation = 0;
+
+ foreach(l, path->indexclauses)
+ {
+ IndexClause *iclause = lfirst_node(IndexClause, l);
+ AttrNumber attnum = index->indexkeys[iclause->indexcol];
+
+ /* attempt to lookup stats in relation for this index column */
+ if (attnum != 0)
+ {
+ /* Simple variable -- look to stats for the underlying table */
+ if (get_relation_stats_hook &&
+ (*get_relation_stats_hook) (root, rte, attnum, &vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats tuple. If it
+ * did supply a tuple, it'd better have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)
+ elog(ERROR,
+ "no function provided to release variable stats with");
+ }
+ else
+ {
+ vardata.statsTuple =
+ SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(rte->relid),
+ Int16GetDatum(attnum),
+ BoolGetDatum(false));
+ vardata.freefunc = ReleaseSysCache;
+ }
+ }
+ else
+ {
+ /*
+ * Looks like we've found an expression column in the index. Let's
+ * see if there's any stats for it.
+ */
+
+ /* get the attnum from the 0-based index. */
+ attnum = iclause->indexcol + 1;
+
+ if (get_index_stats_hook &&
+ (*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))
+ {
+ /*
+ * The hook took control of acquiring a stats tuple. If it
+ * did supply a tuple, it'd better have supplied a freefunc.
+ */
+ if (HeapTupleIsValid(vardata.statsTuple) &&
+ !vardata.freefunc)
+ elog(ERROR, "no function provided to release variable stats with");
+ }
+ else
+ {
+ vardata.statsTuple = SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(index->indexoid),
+ Int16GetDatum(attnum),
+ BoolGetDatum(false));
+ vardata.freefunc = ReleaseSysCache;
+ }
+ }
+
+ if (HeapTupleIsValid(vardata.statsTuple))
+ {
+ AttStatsSlot sslot;
+
+ if (get_attstatsslot(&sslot, vardata.statsTuple,
+ STATISTIC_KIND_CORRELATION, InvalidOid,
+ ATTSTATSSLOT_NUMBERS))
+ {
+ double varCorrelation = 0.0;
+
+ if (sslot.nnumbers > 0)
+ varCorrelation = Abs(sslot.numbers[0]);
+
+ if (varCorrelation > *indexCorrelation)
+ *indexCorrelation = varCorrelation;
+
+ free_attstatsslot(&sslot);
+ }
+ }
+
+ ReleaseVariableStats(vardata);
+ }
+
+ qualSelectivity = clauselist_selectivity(root, indexQuals,
+ baserel->relid,
+ JOIN_INNER, NULL);
+
+ /*
+ * Now calculate the minimum possible ranges we could match with if all of
+ * the rows were in the perfect order in the table's heap.
+ */
+ minimalRanges = ceil(indexRanges * qualSelectivity);
+
+ /*
+ * Now estimate the number of ranges that we'll touch by using the
+ * indexCorrelation from the stats. Careful not to divide by zero (note
+ * we're using the absolute value of the correlation).
+ */
+ if (*indexCorrelation < 1.0e-10)
+ estimatedRanges = indexRanges;
+ else
+ estimatedRanges = Min(minimalRanges / *indexCorrelation, indexRanges);
+
+ /* we expect to visit this portion of the table */
+ selec = estimatedRanges / indexRanges;
+
+ CLAMP_PROBABILITY(selec);
+
+ *indexSelectivity = selec;
+
+ /*
+ * Compute the index qual costs, much as in genericcostestimate, to add to
+ * the index costs. We can disregard indexorderbys, since BRIN doesn't
+ * support those.
+ */
+ qual_arg_cost = index_other_operands_eval_cost(root, indexQuals);
+
+ /*
+ * Compute the startup cost as the cost to read the whole revmap
+ * sequentially, including the cost to execute the index quals.
+ */
+ *indexStartupCost =
+ spc_seq_page_cost * statsData.revmapNumPages * loop_count;
+ *indexStartupCost += qual_arg_cost;
+
+ /*
+ * To read a BRIN index there might be a bit of back and forth over
+ * regular pages, as revmap might point to them out of sequential order;
+ * calculate the total cost as reading the whole index in random order.
+ */
+ *indexTotalCost = *indexStartupCost +
+ spc_random_page_cost * (numPages - statsData.revmapNumPages) * loop_count;
+
+ /*
+ * Charge a small amount per range tuple which we expect to match to. This
+ * is meant to reflect the costs of manipulating the bitmap. The BRIN scan
+ * will set a bit for each page in the range when we find a matching
+ * range, so we must multiply the charge by the number of pages in the
+ * range.
+ */
+ *indexTotalCost += 0.1 * cpu_operator_cost * estimatedRanges *
+ statsData.pagesPerRange;
+
+ *indexPages = index->pages;
+}
diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c
new file mode 100644
index 0000000..83ac589
--- /dev/null
+++ b/src/backend/utils/adt/tid.c
@@ -0,0 +1,429 @@
+/*-------------------------------------------------------------------------
+ *
+ * tid.c
+ * Functions for the built-in type tuple id
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tid.c
+ *
+ * NOTES
+ * input routine largely stolen from boxin().
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <math.h>
+#include <limits.h>
+
+#include "access/heapam.h"
+#include "access/sysattr.h"
+#include "access/tableam.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "parser/parsetree.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/rel.h"
+#include "utils/snapmgr.h"
+#include "utils/varlena.h"
+
+
+#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X))
+#define ItemPointerGetDatum(X) PointerGetDatum(X)
+#define PG_GETARG_ITEMPOINTER(n) DatumGetItemPointer(PG_GETARG_DATUM(n))
+#define PG_RETURN_ITEMPOINTER(x) return ItemPointerGetDatum(x)
+
+#define LDELIM '('
+#define RDELIM ')'
+#define DELIM ','
+#define NTIDARGS 2
+
+static ItemPointer currtid_for_view(Relation viewrel, ItemPointer tid);
+
+/* ----------------------------------------------------------------
+ * tidin
+ * ----------------------------------------------------------------
+ */
+Datum
+tidin(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ char *p,
+ *coord[NTIDARGS];
+ int i;
+ ItemPointer result;
+ BlockNumber blockNumber;
+ OffsetNumber offsetNumber;
+ char *badp;
+ unsigned long cvt;
+
+ for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++)
+ if (*p == DELIM || (*p == LDELIM && i == 0))
+ coord[i++] = p + 1;
+
+ if (i < NTIDARGS)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "tid", str)));
+
+ errno = 0;
+ cvt = strtoul(coord[0], &badp, 10);
+ if (errno || *badp != DELIM)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "tid", str)));
+ blockNumber = (BlockNumber) cvt;
+
+ /*
+ * Cope with possibility that unsigned long is wider than BlockNumber, in
+ * which case strtoul will not raise an error for some values that are out
+ * of the range of BlockNumber. (See similar code in oidin().)
+ */
+#if SIZEOF_LONG > 4
+ if (cvt != (unsigned long) blockNumber &&
+ cvt != (unsigned long) ((int32) blockNumber))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "tid", str)));
+#endif
+
+ cvt = strtoul(coord[1], &badp, 10);
+ if (errno || *badp != RDELIM ||
+ cvt > USHRT_MAX)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "tid", str)));
+ offsetNumber = (OffsetNumber) cvt;
+
+ result = (ItemPointer) palloc(sizeof(ItemPointerData));
+
+ ItemPointerSet(result, blockNumber, offsetNumber);
+
+ PG_RETURN_ITEMPOINTER(result);
+}
+
+/* ----------------------------------------------------------------
+ * tidout
+ * ----------------------------------------------------------------
+ */
+Datum
+tidout(PG_FUNCTION_ARGS)
+{
+ ItemPointer itemPtr = PG_GETARG_ITEMPOINTER(0);
+ BlockNumber blockNumber;
+ OffsetNumber offsetNumber;
+ char buf[32];
+
+ blockNumber = ItemPointerGetBlockNumberNoCheck(itemPtr);
+ offsetNumber = ItemPointerGetOffsetNumberNoCheck(itemPtr);
+
+ /* Perhaps someday we should output this as a record. */
+ snprintf(buf, sizeof(buf), "(%u,%u)", blockNumber, offsetNumber);
+
+ PG_RETURN_CSTRING(pstrdup(buf));
+}
+
+/*
+ * tidrecv - converts external binary format to tid
+ */
+Datum
+tidrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ ItemPointer result;
+ BlockNumber blockNumber;
+ OffsetNumber offsetNumber;
+
+ blockNumber = pq_getmsgint(buf, sizeof(blockNumber));
+ offsetNumber = pq_getmsgint(buf, sizeof(offsetNumber));
+
+ result = (ItemPointer) palloc(sizeof(ItemPointerData));
+
+ ItemPointerSet(result, blockNumber, offsetNumber);
+
+ PG_RETURN_ITEMPOINTER(result);
+}
+
+/*
+ * tidsend - converts tid to binary format
+ */
+Datum
+tidsend(PG_FUNCTION_ARGS)
+{
+ ItemPointer itemPtr = PG_GETARG_ITEMPOINTER(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, ItemPointerGetBlockNumberNoCheck(itemPtr));
+ pq_sendint16(&buf, ItemPointerGetOffsetNumberNoCheck(itemPtr));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+Datum
+tideq(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) == 0);
+}
+
+Datum
+tidne(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) != 0);
+}
+
+Datum
+tidlt(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) < 0);
+}
+
+Datum
+tidle(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) <= 0);
+}
+
+Datum
+tidgt(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) > 0);
+}
+
+Datum
+tidge(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_BOOL(ItemPointerCompare(arg1, arg2) >= 0);
+}
+
+Datum
+bttidcmp(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_INT32(ItemPointerCompare(arg1, arg2));
+}
+
+Datum
+tidlarger(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_ITEMPOINTER(ItemPointerCompare(arg1, arg2) >= 0 ? arg1 : arg2);
+}
+
+Datum
+tidsmaller(PG_FUNCTION_ARGS)
+{
+ ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
+ ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
+
+ PG_RETURN_ITEMPOINTER(ItemPointerCompare(arg1, arg2) <= 0 ? arg1 : arg2);
+}
+
+Datum
+hashtid(PG_FUNCTION_ARGS)
+{
+ ItemPointer key = PG_GETARG_ITEMPOINTER(0);
+
+ /*
+ * While you'll probably have a lot of trouble with a compiler that
+ * insists on appending pad space to struct ItemPointerData, we can at
+ * least make this code work, by not using sizeof(ItemPointerData).
+ * Instead rely on knowing the sizes of the component fields.
+ */
+ return hash_any((unsigned char *) key,
+ sizeof(BlockIdData) + sizeof(OffsetNumber));
+}
+
+Datum
+hashtidextended(PG_FUNCTION_ARGS)
+{
+ ItemPointer key = PG_GETARG_ITEMPOINTER(0);
+ uint64 seed = PG_GETARG_INT64(1);
+
+ /* As above */
+ return hash_any_extended((unsigned char *) key,
+ sizeof(BlockIdData) + sizeof(OffsetNumber),
+ seed);
+}
+
+
+/*
+ * Functions to get latest tid of a specified tuple.
+ *
+ * Maybe these implementations should be moved to another place
+ */
+
+/*
+ * Utility wrapper for current CTID functions.
+ * Returns the latest version of a tuple pointing at "tid" for
+ * relation "rel".
+ */
+static ItemPointer
+currtid_internal(Relation rel, ItemPointer tid)
+{
+ ItemPointer result;
+ AclResult aclresult;
+ Snapshot snapshot;
+ TableScanDesc scan;
+
+ result = (ItemPointer) palloc(sizeof(ItemPointerData));
+
+ aclresult = pg_class_aclcheck(RelationGetRelid(rel), GetUserId(),
+ ACL_SELECT);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, get_relkind_objtype(rel->rd_rel->relkind),
+ RelationGetRelationName(rel));
+
+ if (rel->rd_rel->relkind == RELKIND_VIEW)
+ return currtid_for_view(rel, tid);
+
+ if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind))
+ elog(ERROR, "cannot look at latest visible tid for relation \"%s.%s\"",
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel));
+
+ ItemPointerCopy(tid, result);
+
+ snapshot = RegisterSnapshot(GetLatestSnapshot());
+ scan = table_beginscan_tid(rel, snapshot);
+ table_tuple_get_latest_tid(scan, result);
+ table_endscan(scan);
+ UnregisterSnapshot(snapshot);
+
+ return result;
+}
+
+/*
+ * Handle CTIDs of views.
+ * CTID should be defined in the view and it must
+ * correspond to the CTID of a base relation.
+ */
+static ItemPointer
+currtid_for_view(Relation viewrel, ItemPointer tid)
+{
+ TupleDesc att = RelationGetDescr(viewrel);
+ RuleLock *rulelock;
+ RewriteRule *rewrite;
+ int i,
+ natts = att->natts,
+ tididx = -1;
+
+ for (i = 0; i < natts; i++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(att, i);
+
+ if (strcmp(NameStr(attr->attname), "ctid") == 0)
+ {
+ if (attr->atttypid != TIDOID)
+ elog(ERROR, "ctid isn't of type TID");
+ tididx = i;
+ break;
+ }
+ }
+ if (tididx < 0)
+ elog(ERROR, "currtid cannot handle views with no CTID");
+ rulelock = viewrel->rd_rules;
+ if (!rulelock)
+ elog(ERROR, "the view has no rules");
+ for (i = 0; i < rulelock->numLocks; i++)
+ {
+ rewrite = rulelock->rules[i];
+ if (rewrite->event == CMD_SELECT)
+ {
+ Query *query;
+ TargetEntry *tle;
+
+ if (list_length(rewrite->actions) != 1)
+ elog(ERROR, "only one select rule is allowed in views");
+ query = (Query *) linitial(rewrite->actions);
+ tle = get_tle_by_resno(query->targetList, tididx + 1);
+ if (tle && tle->expr && IsA(tle->expr, Var))
+ {
+ Var *var = (Var *) tle->expr;
+ RangeTblEntry *rte;
+
+ if (!IS_SPECIAL_VARNO(var->varno) &&
+ var->varattno == SelfItemPointerAttributeNumber)
+ {
+ rte = rt_fetch(var->varno, query->rtable);
+ if (rte)
+ {
+ ItemPointer result;
+ Relation rel;
+
+ rel = table_open(rte->relid, AccessShareLock);
+ result = currtid_internal(rel, tid);
+ table_close(rel, AccessShareLock);
+ return result;
+ }
+ }
+ }
+ break;
+ }
+ }
+ elog(ERROR, "currtid cannot handle this view");
+ return NULL;
+}
+
+/*
+ * currtid_byrelname
+ * Get the latest tuple version of the tuple pointing at a CTID, for a
+ * given relation name.
+ */
+Datum
+currtid_byrelname(PG_FUNCTION_ARGS)
+{
+ text *relname = PG_GETARG_TEXT_PP(0);
+ ItemPointer tid = PG_GETARG_ITEMPOINTER(1);
+ ItemPointer result;
+ RangeVar *relrv;
+ Relation rel;
+
+ relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
+ rel = table_openrv(relrv, AccessShareLock);
+
+ /* grab the latest tuple version associated to this CTID */
+ result = currtid_internal(rel, tid);
+
+ table_close(rel, AccessShareLock);
+
+ PG_RETURN_ITEMPOINTER(result);
+}
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
new file mode 100644
index 0000000..f70f829
--- /dev/null
+++ b/src/backend/utils/adt/timestamp.c
@@ -0,0 +1,5921 @@
+/*-------------------------------------------------------------------------
+ *
+ * timestamp.c
+ * Functions for the built-in SQL types "timestamp" and "interval".
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/timestamp.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#include <sys/time.h>
+
+#include "access/xact.h"
+#include "catalog/pg_type.h"
+#include "common/int.h"
+#include "common/int128.h"
+#include "funcapi.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "parser/scansup.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/float.h"
+#include "utils/numeric.h"
+#include "utils/sortsupport.h"
+
+/*
+ * gcc's -ffast-math switch breaks routines that expect exact results from
+ * expressions like timeval / SECS_PER_HOUR, where timeval is double.
+ */
+#ifdef __FAST_MATH__
+#error -ffast-math is known to break this code
+#endif
+
+#define SAMESIGN(a,b) (((a) < 0) == ((b) < 0))
+
+/* Set at postmaster start */
+TimestampTz PgStartTime;
+
+/* Set at configuration reload */
+TimestampTz PgReloadTime;
+
+typedef struct
+{
+ Timestamp current;
+ Timestamp finish;
+ Interval step;
+ int step_sign;
+} generate_series_timestamp_fctx;
+
+typedef struct
+{
+ TimestampTz current;
+ TimestampTz finish;
+ Interval step;
+ int step_sign;
+} generate_series_timestamptz_fctx;
+
+
+static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec);
+static Timestamp dt2local(Timestamp dt, int timezone);
+static void AdjustIntervalForTypmod(Interval *interval, int32 typmod);
+static TimestampTz timestamp2timestamptz(Timestamp timestamp);
+static Timestamp timestamptz2timestamp(TimestampTz timestamp);
+
+
+/* common code for timestamptypmodin and timestamptztypmodin */
+static int32
+anytimestamp_typmodin(bool istz, ArrayType *ta)
+{
+ int32 *tl;
+ int n;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ /*
+ * we're not too tense about good error message here because grammar
+ * shouldn't allow wrong number of modifiers for TIMESTAMP
+ */
+ if (n != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid type modifier")));
+
+ return anytimestamp_typmod_check(istz, tl[0]);
+}
+
+/* exported so parse_expr.c can use it */
+int32
+anytimestamp_typmod_check(bool istz, int32 typmod)
+{
+ if (typmod < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("TIMESTAMP(%d)%s precision must not be negative",
+ typmod, (istz ? " WITH TIME ZONE" : ""))));
+ if (typmod > MAX_TIMESTAMP_PRECISION)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
+ typmod, (istz ? " WITH TIME ZONE" : ""),
+ MAX_TIMESTAMP_PRECISION)));
+ typmod = MAX_TIMESTAMP_PRECISION;
+ }
+
+ return typmod;
+}
+
+/* common code for timestamptypmodout and timestamptztypmodout */
+static char *
+anytimestamp_typmodout(bool istz, int32 typmod)
+{
+ const char *tz = istz ? " with time zone" : " without time zone";
+
+ if (typmod >= 0)
+ return psprintf("(%d)%s", (int) typmod, tz);
+ else
+ return psprintf("%s", tz);
+}
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+/* timestamp_in()
+ * Convert a string to internal form.
+ */
+Datum
+timestamp_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ Timestamp result;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ int dtype;
+ int nf;
+ int dterr;
+ char *field[MAXDATEFIELDS];
+ int ftype[MAXDATEFIELDS];
+ char workbuf[MAXDATELEN + MAXDATEFIELDS];
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz);
+ if (dterr != 0)
+ DateTimeParseError(dterr, str, "timestamp");
+
+ switch (dtype)
+ {
+ case DTK_DATE:
+ if (tm2timestamp(tm, fsec, NULL, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: \"%s\"", str)));
+ break;
+
+ case DTK_EPOCH:
+ result = SetEpochTimestamp();
+ break;
+
+ case DTK_LATE:
+ TIMESTAMP_NOEND(result);
+ break;
+
+ case DTK_EARLY:
+ TIMESTAMP_NOBEGIN(result);
+ break;
+
+ default:
+ elog(ERROR, "unexpected dtype %d while parsing timestamp \"%s\"",
+ dtype, str);
+ TIMESTAMP_NOEND(result);
+ }
+
+ AdjustTimestampForTypmod(&result, typmod);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamp_out()
+ * Convert a timestamp to external form.
+ */
+Datum
+timestamp_out(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ char *result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ char buf[MAXDATELEN + 1];
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ EncodeSpecialTimestamp(timestamp, buf);
+ else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
+ EncodeDateTime(tm, fsec, false, 0, NULL, DateStyle, buf);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * timestamp_recv - converts external binary format to timestamp
+ */
+Datum
+timestamp_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ Timestamp timestamp;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ timestamp = (Timestamp) pq_getmsgint64(buf);
+
+ /* range check: see if timestamp_out would like it */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ /* ok */ ;
+ else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0 ||
+ !IS_VALID_TIMESTAMP(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ AdjustTimestampForTypmod(&timestamp, typmod);
+
+ PG_RETURN_TIMESTAMP(timestamp);
+}
+
+/*
+ * timestamp_send - converts timestamp to binary format
+ */
+Datum
+timestamp_send(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, timestamp);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+timestamptypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anytimestamp_typmodin(false, ta));
+}
+
+Datum
+timestamptypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anytimestamp_typmodout(false, typmod));
+}
+
+
+/*
+ * timestamp_support()
+ *
+ * Planner support function for the timestamp_scale() and timestamptz_scale()
+ * length coercion functions (we need not distinguish them here).
+ */
+Datum
+timestamp_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+
+ ret = TemporalSimplify(MAX_TIMESTAMP_PRECISION, (Node *) req->fcall);
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/* timestamp_scale()
+ * Adjust time type for specified scale factor.
+ * Used by PostgreSQL type system to stuff columns.
+ */
+Datum
+timestamp_scale(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ Timestamp result;
+
+ result = timestamp;
+
+ AdjustTimestampForTypmod(&result, typmod);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/*
+ * AdjustTimestampForTypmodError --- round off a timestamp to suit given typmod
+ * Works for either timestamp or timestamptz.
+ */
+bool
+AdjustTimestampForTypmodError(Timestamp *time, int32 typmod, bool *error)
+{
+ static const int64 TimestampScales[MAX_TIMESTAMP_PRECISION + 1] = {
+ INT64CONST(1000000),
+ INT64CONST(100000),
+ INT64CONST(10000),
+ INT64CONST(1000),
+ INT64CONST(100),
+ INT64CONST(10),
+ INT64CONST(1)
+ };
+
+ static const int64 TimestampOffsets[MAX_TIMESTAMP_PRECISION + 1] = {
+ INT64CONST(500000),
+ INT64CONST(50000),
+ INT64CONST(5000),
+ INT64CONST(500),
+ INT64CONST(50),
+ INT64CONST(5),
+ INT64CONST(0)
+ };
+
+ if (!TIMESTAMP_NOT_FINITE(*time)
+ && (typmod != -1) && (typmod != MAX_TIMESTAMP_PRECISION))
+ {
+ if (typmod < 0 || typmod > MAX_TIMESTAMP_PRECISION)
+ {
+ if (error)
+ {
+ *error = true;
+ return false;
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("timestamp(%d) precision must be between %d and %d",
+ typmod, 0, MAX_TIMESTAMP_PRECISION)));
+ }
+
+ if (*time >= INT64CONST(0))
+ {
+ *time = ((*time + TimestampOffsets[typmod]) / TimestampScales[typmod]) *
+ TimestampScales[typmod];
+ }
+ else
+ {
+ *time = -((((-*time) + TimestampOffsets[typmod]) / TimestampScales[typmod])
+ * TimestampScales[typmod]);
+ }
+ }
+
+ return true;
+}
+
+void
+AdjustTimestampForTypmod(Timestamp *time, int32 typmod)
+{
+ (void) AdjustTimestampForTypmodError(time, typmod, NULL);
+}
+
+/* timestamptz_in()
+ * Convert a string to internal form.
+ */
+Datum
+timestamptz_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimestampTz result;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ int dtype;
+ int nf;
+ int dterr;
+ char *field[MAXDATEFIELDS];
+ int ftype[MAXDATEFIELDS];
+ char workbuf[MAXDATELEN + MAXDATEFIELDS];
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz);
+ if (dterr != 0)
+ DateTimeParseError(dterr, str, "timestamp with time zone");
+
+ switch (dtype)
+ {
+ case DTK_DATE:
+ if (tm2timestamp(tm, fsec, &tz, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: \"%s\"", str)));
+ break;
+
+ case DTK_EPOCH:
+ result = SetEpochTimestamp();
+ break;
+
+ case DTK_LATE:
+ TIMESTAMP_NOEND(result);
+ break;
+
+ case DTK_EARLY:
+ TIMESTAMP_NOBEGIN(result);
+ break;
+
+ default:
+ elog(ERROR, "unexpected dtype %d while parsing timestamptz \"%s\"",
+ dtype, str);
+ TIMESTAMP_NOEND(result);
+ }
+
+ AdjustTimestampForTypmod(&result, typmod);
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/*
+ * Try to parse a timezone specification, and return its timezone offset value
+ * if it's acceptable. Otherwise, an error is thrown.
+ *
+ * Note: some code paths update tm->tm_isdst, and some don't; current callers
+ * don't care, so we don't bother being consistent.
+ */
+static int
+parse_sane_timezone(struct pg_tm *tm, text *zone)
+{
+ char tzname[TZ_STRLEN_MAX + 1];
+ int rt;
+ int tz;
+
+ text_to_cstring_buffer(zone, tzname, sizeof(tzname));
+
+ /*
+ * Look up the requested timezone. First we try to interpret it as a
+ * numeric timezone specification; if DecodeTimezone decides it doesn't
+ * like the format, we look in the timezone abbreviation table (to handle
+ * cases like "EST"), and if that also fails, we look in the timezone
+ * database (to handle cases like "America/New_York"). (This matches the
+ * order in which timestamp input checks the cases; it's important because
+ * the timezone database unwisely uses a few zone names that are identical
+ * to offset abbreviations.)
+ *
+ * Note pg_tzset happily parses numeric input that DecodeTimezone would
+ * reject. To avoid having it accept input that would otherwise be seen
+ * as invalid, it's enough to disallow having a digit in the first
+ * position of our input string.
+ */
+ if (isdigit((unsigned char) *tzname))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "numeric time zone", tzname),
+ errhint("Numeric time zones must have \"-\" or \"+\" as first character.")));
+
+ rt = DecodeTimezone(tzname, &tz);
+ if (rt != 0)
+ {
+ char *lowzone;
+ int type,
+ val;
+ pg_tz *tzp;
+
+ if (rt == DTERR_TZDISP_OVERFLOW)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("numeric time zone \"%s\" out of range", tzname)));
+ else if (rt != DTERR_BAD_FORMAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+
+ /* DecodeTimezoneAbbrev requires lowercase input */
+ lowzone = downcase_truncate_identifier(tzname,
+ strlen(tzname),
+ false);
+ type = DecodeTimezoneAbbrev(0, lowzone, &val, &tzp);
+
+ if (type == TZ || type == DTZ)
+ {
+ /* fixed-offset abbreviation */
+ tz = -val;
+ }
+ else if (type == DYNTZ)
+ {
+ /* dynamic-offset abbreviation, resolve using specified time */
+ tz = DetermineTimeZoneAbbrevOffset(tm, tzname, tzp);
+ }
+ else
+ {
+ /* try it as a full zone name */
+ tzp = pg_tzset(tzname);
+ if (tzp)
+ tz = DetermineTimeZoneOffset(tm, tzp);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+ }
+ }
+
+ return tz;
+}
+
+/*
+ * make_timestamp_internal
+ * workhorse for make_timestamp and make_timestamptz
+ */
+static Timestamp
+make_timestamp_internal(int year, int month, int day,
+ int hour, int min, double sec)
+{
+ struct pg_tm tm;
+ TimeOffset date;
+ TimeOffset time;
+ int dterr;
+ bool bc = false;
+ Timestamp result;
+
+ tm.tm_year = year;
+ tm.tm_mon = month;
+ tm.tm_mday = day;
+
+ /* Handle negative years as BC */
+ if (tm.tm_year < 0)
+ {
+ bc = true;
+ tm.tm_year = -tm.tm_year;
+ }
+
+ dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
+
+ if (dterr != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("date field value out of range: %d-%02d-%02d",
+ year, month, day)));
+
+ if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range: %d-%02d-%02d",
+ year, month, day)));
+
+ date = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
+
+ /* Check for time overflow */
+ if (float_time_overflows(hour, min, sec))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_FIELD_OVERFLOW),
+ errmsg("time field value out of range: %d:%02d:%02g",
+ hour, min, sec)));
+
+ /* This should match tm2time */
+ time = (((hour * MINS_PER_HOUR + min) * SECS_PER_MINUTE)
+ * USECS_PER_SEC) + (int64) rint(sec * USECS_PER_SEC);
+
+ result = date * USECS_PER_DAY + time;
+ /* check for major overflow */
+ if ((result - time) / USECS_PER_DAY != date)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: %d-%02d-%02d %d:%02d:%02g",
+ year, month, day,
+ hour, min, sec)));
+
+ /* check for just-barely overflow (okay except time-of-day wraps) */
+ /* caution: we want to allow 1999-12-31 24:00:00 */
+ if ((result < 0 && date > 0) ||
+ (result > 0 && date < -1))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: %d-%02d-%02d %d:%02d:%02g",
+ year, month, day,
+ hour, min, sec)));
+
+ /* final range check catches just-out-of-range timestamps */
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: %d-%02d-%02d %d:%02d:%02g",
+ year, month, day,
+ hour, min, sec)));
+
+ return result;
+}
+
+/*
+ * make_timestamp() - timestamp constructor
+ */
+Datum
+make_timestamp(PG_FUNCTION_ARGS)
+{
+ int32 year = PG_GETARG_INT32(0);
+ int32 month = PG_GETARG_INT32(1);
+ int32 mday = PG_GETARG_INT32(2);
+ int32 hour = PG_GETARG_INT32(3);
+ int32 min = PG_GETARG_INT32(4);
+ float8 sec = PG_GETARG_FLOAT8(5);
+ Timestamp result;
+
+ result = make_timestamp_internal(year, month, mday,
+ hour, min, sec);
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/*
+ * make_timestamptz() - timestamp with time zone constructor
+ */
+Datum
+make_timestamptz(PG_FUNCTION_ARGS)
+{
+ int32 year = PG_GETARG_INT32(0);
+ int32 month = PG_GETARG_INT32(1);
+ int32 mday = PG_GETARG_INT32(2);
+ int32 hour = PG_GETARG_INT32(3);
+ int32 min = PG_GETARG_INT32(4);
+ float8 sec = PG_GETARG_FLOAT8(5);
+ Timestamp result;
+
+ result = make_timestamp_internal(year, month, mday,
+ hour, min, sec);
+
+ PG_RETURN_TIMESTAMPTZ(timestamp2timestamptz(result));
+}
+
+/*
+ * Construct a timestamp with time zone.
+ * As above, but the time zone is specified as seventh argument.
+ */
+Datum
+make_timestamptz_at_timezone(PG_FUNCTION_ARGS)
+{
+ int32 year = PG_GETARG_INT32(0);
+ int32 month = PG_GETARG_INT32(1);
+ int32 mday = PG_GETARG_INT32(2);
+ int32 hour = PG_GETARG_INT32(3);
+ int32 min = PG_GETARG_INT32(4);
+ float8 sec = PG_GETARG_FLOAT8(5);
+ text *zone = PG_GETARG_TEXT_PP(6);
+ TimestampTz result;
+ Timestamp timestamp;
+ struct pg_tm tt;
+ int tz;
+ fsec_t fsec;
+
+ timestamp = make_timestamp_internal(year, month, mday,
+ hour, min, sec);
+
+ if (timestamp2tm(timestamp, NULL, &tt, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ tz = parse_sane_timezone(&tt, zone);
+
+ result = dt2local(timestamp, -tz);
+
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/*
+ * to_timestamp(double precision)
+ * Convert UNIX epoch to timestamptz.
+ */
+Datum
+float8_timestamptz(PG_FUNCTION_ARGS)
+{
+ float8 seconds = PG_GETARG_FLOAT8(0);
+ TimestampTz result;
+
+ /* Deal with NaN and infinite inputs ... */
+ if (isnan(seconds))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp cannot be NaN")));
+
+ if (isinf(seconds))
+ {
+ if (seconds < 0)
+ TIMESTAMP_NOBEGIN(result);
+ else
+ TIMESTAMP_NOEND(result);
+ }
+ else
+ {
+ /* Out of range? */
+ if (seconds <
+ (float8) SECS_PER_DAY * (DATETIME_MIN_JULIAN - UNIX_EPOCH_JDATE)
+ || seconds >=
+ (float8) SECS_PER_DAY * (TIMESTAMP_END_JULIAN - UNIX_EPOCH_JDATE))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: \"%g\"", seconds)));
+
+ /* Convert UNIX epoch to Postgres epoch */
+ seconds -= ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+
+ seconds = rint(seconds * USECS_PER_SEC);
+ result = (int64) seconds;
+
+ /* Recheck in case roundoff produces something just out of range */
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range: \"%g\"",
+ PG_GETARG_FLOAT8(0))));
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamptz_out()
+ * Convert a timestamp to external form.
+ */
+Datum
+timestamptz_out(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt = PG_GETARG_TIMESTAMPTZ(0);
+ char *result;
+ int tz;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ const char *tzn;
+ char buf[MAXDATELEN + 1];
+
+ if (TIMESTAMP_NOT_FINITE(dt))
+ EncodeSpecialTimestamp(dt, buf);
+ else if (timestamp2tm(dt, &tz, tm, &fsec, &tzn, NULL) == 0)
+ EncodeDateTime(tm, fsec, true, tz, tzn, DateStyle, buf);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * timestamptz_recv - converts external binary format to timestamptz
+ */
+Datum
+timestamptz_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ TimestampTz timestamp;
+ int tz;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ timestamp = (TimestampTz) pq_getmsgint64(buf);
+
+ /* range check: see if timestamptz_out would like it */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ /* ok */ ;
+ else if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0 ||
+ !IS_VALID_TIMESTAMP(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ AdjustTimestampForTypmod(&timestamp, typmod);
+
+ PG_RETURN_TIMESTAMPTZ(timestamp);
+}
+
+/*
+ * timestamptz_send - converts timestamptz to binary format
+ */
+Datum
+timestamptz_send(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, timestamp);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+timestamptztypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anytimestamp_typmodin(true, ta));
+}
+
+Datum
+timestamptztypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anytimestamp_typmodout(true, typmod));
+}
+
+
+/* timestamptz_scale()
+ * Adjust time type for specified scale factor.
+ * Used by PostgreSQL type system to stuff columns.
+ */
+Datum
+timestamptz_scale(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ TimestampTz result;
+
+ result = timestamp;
+
+ AdjustTimestampForTypmod(&result, typmod);
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+
+/* interval_in()
+ * Convert a string to internal form.
+ *
+ * External format(s):
+ * Uses the generic date/time parsing and decoding routines.
+ */
+Datum
+interval_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ Interval *result;
+ struct pg_itm_in tt,
+ *itm_in = &tt;
+ int dtype;
+ int nf;
+ int range;
+ int dterr;
+ char *field[MAXDATEFIELDS];
+ int ftype[MAXDATEFIELDS];
+ char workbuf[256];
+
+ itm_in->tm_year = 0;
+ itm_in->tm_mon = 0;
+ itm_in->tm_mday = 0;
+ itm_in->tm_usec = 0;
+
+ if (typmod >= 0)
+ range = INTERVAL_RANGE(typmod);
+ else
+ range = INTERVAL_FULL_RANGE;
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf), field,
+ ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeInterval(field, ftype, nf, range,
+ &dtype, itm_in);
+
+ /* if those functions think it's a bad format, try ISO8601 style */
+ if (dterr == DTERR_BAD_FORMAT)
+ dterr = DecodeISO8601Interval(str,
+ &dtype, itm_in);
+
+ if (dterr != 0)
+ {
+ if (dterr == DTERR_FIELD_OVERFLOW)
+ dterr = DTERR_INTERVAL_OVERFLOW;
+ DateTimeParseError(dterr, str, "interval");
+ }
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ switch (dtype)
+ {
+ case DTK_DELTA:
+ if (itmin2interval(itm_in, result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ break;
+
+ default:
+ elog(ERROR, "unexpected dtype %d while parsing interval \"%s\"",
+ dtype, str);
+ }
+
+ AdjustIntervalForTypmod(result, typmod);
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* interval_out()
+ * Convert a time span to external form.
+ */
+Datum
+interval_out(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ char *result;
+ struct pg_itm tt,
+ *itm = &tt;
+ char buf[MAXDATELEN + 1];
+
+ interval2itm(*span, itm);
+ EncodeInterval(itm, IntervalStyle, buf);
+
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * interval_recv - converts external binary format to interval
+ */
+Datum
+interval_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 typmod = PG_GETARG_INT32(2);
+ Interval *interval;
+
+ interval = (Interval *) palloc(sizeof(Interval));
+
+ interval->time = pq_getmsgint64(buf);
+ interval->day = pq_getmsgint(buf, sizeof(interval->day));
+ interval->month = pq_getmsgint(buf, sizeof(interval->month));
+
+ AdjustIntervalForTypmod(interval, typmod);
+
+ PG_RETURN_INTERVAL_P(interval);
+}
+
+/*
+ * interval_send - converts interval to binary format
+ */
+Datum
+interval_send(PG_FUNCTION_ARGS)
+{
+ Interval *interval = PG_GETARG_INTERVAL_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, interval->time);
+ pq_sendint32(&buf, interval->day);
+ pq_sendint32(&buf, interval->month);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * The interval typmod stores a "range" in its high 16 bits and a "precision"
+ * in its low 16 bits. Both contribute to defining the resolution of the
+ * type. Range addresses resolution granules larger than one second, and
+ * precision specifies resolution below one second. This representation can
+ * express all SQL standard resolutions, but we implement them all in terms of
+ * truncating rightward from some position. Range is a bitmap of permitted
+ * fields, but only the temporally-smallest such field is significant to our
+ * calculations. Precision is a count of sub-second decimal places to retain.
+ * Setting all bits (INTERVAL_FULL_PRECISION) gives the same truncation
+ * semantics as choosing MAX_INTERVAL_PRECISION.
+ */
+Datum
+intervaltypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+ int32 *tl;
+ int n;
+ int32 typmod;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ /*
+ * tl[0] - interval range (fields bitmask) tl[1] - precision (optional)
+ *
+ * Note we must validate tl[0] even though it's normally guaranteed
+ * correct by the grammar --- consider SELECT 'foo'::"interval"(1000).
+ */
+ if (n > 0)
+ {
+ switch (tl[0])
+ {
+ case INTERVAL_MASK(YEAR):
+ case INTERVAL_MASK(MONTH):
+ case INTERVAL_MASK(DAY):
+ case INTERVAL_MASK(HOUR):
+ case INTERVAL_MASK(MINUTE):
+ case INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ case INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ case INTERVAL_FULL_RANGE:
+ /* all OK */
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid INTERVAL type modifier")));
+ }
+ }
+
+ if (n == 1)
+ {
+ if (tl[0] != INTERVAL_FULL_RANGE)
+ typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, tl[0]);
+ else
+ typmod = -1;
+ }
+ else if (n == 2)
+ {
+ if (tl[1] < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("INTERVAL(%d) precision must not be negative",
+ tl[1])));
+ if (tl[1] > MAX_INTERVAL_PRECISION)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
+ tl[1], MAX_INTERVAL_PRECISION)));
+ typmod = INTERVAL_TYPMOD(MAX_INTERVAL_PRECISION, tl[0]);
+ }
+ else
+ typmod = INTERVAL_TYPMOD(tl[1], tl[0]);
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid INTERVAL type modifier")));
+ typmod = 0; /* keep compiler quiet */
+ }
+
+ PG_RETURN_INT32(typmod);
+}
+
+Datum
+intervaltypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+ char *res = (char *) palloc(64);
+ int fields;
+ int precision;
+ const char *fieldstr;
+
+ if (typmod < 0)
+ {
+ *res = '\0';
+ PG_RETURN_CSTRING(res);
+ }
+
+ fields = INTERVAL_RANGE(typmod);
+ precision = INTERVAL_PRECISION(typmod);
+
+ switch (fields)
+ {
+ case INTERVAL_MASK(YEAR):
+ fieldstr = " year";
+ break;
+ case INTERVAL_MASK(MONTH):
+ fieldstr = " month";
+ break;
+ case INTERVAL_MASK(DAY):
+ fieldstr = " day";
+ break;
+ case INTERVAL_MASK(HOUR):
+ fieldstr = " hour";
+ break;
+ case INTERVAL_MASK(MINUTE):
+ fieldstr = " minute";
+ break;
+ case INTERVAL_MASK(SECOND):
+ fieldstr = " second";
+ break;
+ case INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH):
+ fieldstr = " year to month";
+ break;
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR):
+ fieldstr = " day to hour";
+ break;
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ fieldstr = " day to minute";
+ break;
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ fieldstr = " day to second";
+ break;
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ fieldstr = " hour to minute";
+ break;
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ fieldstr = " hour to second";
+ break;
+ case INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ fieldstr = " minute to second";
+ break;
+ case INTERVAL_FULL_RANGE:
+ fieldstr = "";
+ break;
+ default:
+ elog(ERROR, "invalid INTERVAL typmod: 0x%x", typmod);
+ fieldstr = "";
+ break;
+ }
+
+ if (precision != INTERVAL_FULL_PRECISION)
+ snprintf(res, 64, "%s(%d)", fieldstr, precision);
+ else
+ snprintf(res, 64, "%s", fieldstr);
+
+ PG_RETURN_CSTRING(res);
+}
+
+/*
+ * Given an interval typmod value, return a code for the least-significant
+ * field that the typmod allows to be nonzero, for instance given
+ * INTERVAL DAY TO HOUR we want to identify "hour".
+ *
+ * The results should be ordered by field significance, which means
+ * we can't use the dt.h macros YEAR etc, because for some odd reason
+ * they aren't ordered that way. Instead, arbitrarily represent
+ * SECOND = 0, MINUTE = 1, HOUR = 2, DAY = 3, MONTH = 4, YEAR = 5.
+ */
+static int
+intervaltypmodleastfield(int32 typmod)
+{
+ if (typmod < 0)
+ return 0; /* SECOND */
+
+ switch (INTERVAL_RANGE(typmod))
+ {
+ case INTERVAL_MASK(YEAR):
+ return 5; /* YEAR */
+ case INTERVAL_MASK(MONTH):
+ return 4; /* MONTH */
+ case INTERVAL_MASK(DAY):
+ return 3; /* DAY */
+ case INTERVAL_MASK(HOUR):
+ return 2; /* HOUR */
+ case INTERVAL_MASK(MINUTE):
+ return 1; /* MINUTE */
+ case INTERVAL_MASK(SECOND):
+ return 0; /* SECOND */
+ case INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH):
+ return 4; /* MONTH */
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR):
+ return 2; /* HOUR */
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ return 1; /* MINUTE */
+ case INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ return 0; /* SECOND */
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE):
+ return 1; /* MINUTE */
+ case INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ return 0; /* SECOND */
+ case INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND):
+ return 0; /* SECOND */
+ case INTERVAL_FULL_RANGE:
+ return 0; /* SECOND */
+ default:
+ elog(ERROR, "invalid INTERVAL typmod: 0x%x", typmod);
+ break;
+ }
+ return 0; /* can't get here, but keep compiler quiet */
+}
+
+
+/*
+ * interval_support()
+ *
+ * Planner support function for interval_scale().
+ *
+ * Flatten superfluous calls to interval_scale(). The interval typmod is
+ * complex to permit accepting and regurgitating all SQL standard variations.
+ * For truncation purposes, it boils down to a single, simple granularity.
+ */
+Datum
+interval_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+ FuncExpr *expr = req->fcall;
+ Node *typmod;
+
+ Assert(list_length(expr->args) >= 2);
+
+ typmod = (Node *) lsecond(expr->args);
+
+ if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
+ {
+ Node *source = (Node *) linitial(expr->args);
+ int32 new_typmod = DatumGetInt32(((Const *) typmod)->constvalue);
+ bool noop;
+
+ if (new_typmod < 0)
+ noop = true;
+ else
+ {
+ int32 old_typmod = exprTypmod(source);
+ int old_least_field;
+ int new_least_field;
+ int old_precis;
+ int new_precis;
+
+ old_least_field = intervaltypmodleastfield(old_typmod);
+ new_least_field = intervaltypmodleastfield(new_typmod);
+ if (old_typmod < 0)
+ old_precis = INTERVAL_FULL_PRECISION;
+ else
+ old_precis = INTERVAL_PRECISION(old_typmod);
+ new_precis = INTERVAL_PRECISION(new_typmod);
+
+ /*
+ * Cast is a no-op if least field stays the same or decreases
+ * while precision stays the same or increases. But
+ * precision, which is to say, sub-second precision, only
+ * affects ranges that include SECOND.
+ */
+ noop = (new_least_field <= old_least_field) &&
+ (old_least_field > 0 /* SECOND */ ||
+ new_precis >= MAX_INTERVAL_PRECISION ||
+ new_precis >= old_precis);
+ }
+ if (noop)
+ ret = relabel_to_typmod(source, new_typmod);
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/* interval_scale()
+ * Adjust interval type for specified fields.
+ * Used by PostgreSQL type system to stuff columns.
+ */
+Datum
+interval_scale(PG_FUNCTION_ARGS)
+{
+ Interval *interval = PG_GETARG_INTERVAL_P(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ Interval *result;
+
+ result = palloc(sizeof(Interval));
+ *result = *interval;
+
+ AdjustIntervalForTypmod(result, typmod);
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/*
+ * Adjust interval for specified precision, in both YEAR to SECOND
+ * range and sub-second precision.
+ */
+static void
+AdjustIntervalForTypmod(Interval *interval, int32 typmod)
+{
+ static const int64 IntervalScales[MAX_INTERVAL_PRECISION + 1] = {
+ INT64CONST(1000000),
+ INT64CONST(100000),
+ INT64CONST(10000),
+ INT64CONST(1000),
+ INT64CONST(100),
+ INT64CONST(10),
+ INT64CONST(1)
+ };
+
+ static const int64 IntervalOffsets[MAX_INTERVAL_PRECISION + 1] = {
+ INT64CONST(500000),
+ INT64CONST(50000),
+ INT64CONST(5000),
+ INT64CONST(500),
+ INT64CONST(50),
+ INT64CONST(5),
+ INT64CONST(0)
+ };
+
+ /*
+ * Unspecified range and precision? Then not necessary to adjust. Setting
+ * typmod to -1 is the convention for all data types.
+ */
+ if (typmod >= 0)
+ {
+ int range = INTERVAL_RANGE(typmod);
+ int precision = INTERVAL_PRECISION(typmod);
+
+ /*
+ * Our interpretation of intervals with a limited set of fields is
+ * that fields to the right of the last one specified are zeroed out,
+ * but those to the left of it remain valid. Thus for example there
+ * is no operational difference between INTERVAL YEAR TO MONTH and
+ * INTERVAL MONTH. In some cases we could meaningfully enforce that
+ * higher-order fields are zero; for example INTERVAL DAY could reject
+ * nonzero "month" field. However that seems a bit pointless when we
+ * can't do it consistently. (We cannot enforce a range limit on the
+ * highest expected field, since we do not have any equivalent of
+ * SQL's <interval leading field precision>.) If we ever decide to
+ * revisit this, interval_support will likely require adjusting.
+ *
+ * Note: before PG 8.4 we interpreted a limited set of fields as
+ * actually causing a "modulo" operation on a given value, potentially
+ * losing high-order as well as low-order information. But there is
+ * no support for such behavior in the standard, and it seems fairly
+ * undesirable on data consistency grounds anyway. Now we only
+ * perform truncation or rounding of low-order fields.
+ */
+ if (range == INTERVAL_FULL_RANGE)
+ {
+ /* Do nothing... */
+ }
+ else if (range == INTERVAL_MASK(YEAR))
+ {
+ interval->month = (interval->month / MONTHS_PER_YEAR) * MONTHS_PER_YEAR;
+ interval->day = 0;
+ interval->time = 0;
+ }
+ else if (range == INTERVAL_MASK(MONTH))
+ {
+ interval->day = 0;
+ interval->time = 0;
+ }
+ /* YEAR TO MONTH */
+ else if (range == (INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH)))
+ {
+ interval->day = 0;
+ interval->time = 0;
+ }
+ else if (range == INTERVAL_MASK(DAY))
+ {
+ interval->time = 0;
+ }
+ else if (range == INTERVAL_MASK(HOUR))
+ {
+ interval->time = (interval->time / USECS_PER_HOUR) *
+ USECS_PER_HOUR;
+ }
+ else if (range == INTERVAL_MASK(MINUTE))
+ {
+ interval->time = (interval->time / USECS_PER_MINUTE) *
+ USECS_PER_MINUTE;
+ }
+ else if (range == INTERVAL_MASK(SECOND))
+ {
+ /* fractional-second rounding will be dealt with below */
+ }
+ /* DAY TO HOUR */
+ else if (range == (INTERVAL_MASK(DAY) |
+ INTERVAL_MASK(HOUR)))
+ {
+ interval->time = (interval->time / USECS_PER_HOUR) *
+ USECS_PER_HOUR;
+ }
+ /* DAY TO MINUTE */
+ else if (range == (INTERVAL_MASK(DAY) |
+ INTERVAL_MASK(HOUR) |
+ INTERVAL_MASK(MINUTE)))
+ {
+ interval->time = (interval->time / USECS_PER_MINUTE) *
+ USECS_PER_MINUTE;
+ }
+ /* DAY TO SECOND */
+ else if (range == (INTERVAL_MASK(DAY) |
+ INTERVAL_MASK(HOUR) |
+ INTERVAL_MASK(MINUTE) |
+ INTERVAL_MASK(SECOND)))
+ {
+ /* fractional-second rounding will be dealt with below */
+ }
+ /* HOUR TO MINUTE */
+ else if (range == (INTERVAL_MASK(HOUR) |
+ INTERVAL_MASK(MINUTE)))
+ {
+ interval->time = (interval->time / USECS_PER_MINUTE) *
+ USECS_PER_MINUTE;
+ }
+ /* HOUR TO SECOND */
+ else if (range == (INTERVAL_MASK(HOUR) |
+ INTERVAL_MASK(MINUTE) |
+ INTERVAL_MASK(SECOND)))
+ {
+ /* fractional-second rounding will be dealt with below */
+ }
+ /* MINUTE TO SECOND */
+ else if (range == (INTERVAL_MASK(MINUTE) |
+ INTERVAL_MASK(SECOND)))
+ {
+ /* fractional-second rounding will be dealt with below */
+ }
+ else
+ elog(ERROR, "unrecognized interval typmod: %d", typmod);
+
+ /* Need to adjust sub-second precision? */
+ if (precision != INTERVAL_FULL_PRECISION)
+ {
+ if (precision < 0 || precision > MAX_INTERVAL_PRECISION)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("interval(%d) precision must be between %d and %d",
+ precision, 0, MAX_INTERVAL_PRECISION)));
+
+ if (interval->time >= INT64CONST(0))
+ {
+ interval->time = ((interval->time +
+ IntervalOffsets[precision]) /
+ IntervalScales[precision]) *
+ IntervalScales[precision];
+ }
+ else
+ {
+ interval->time = -(((-interval->time +
+ IntervalOffsets[precision]) /
+ IntervalScales[precision]) *
+ IntervalScales[precision]);
+ }
+ }
+ }
+}
+
+/*
+ * make_interval - numeric Interval constructor
+ */
+Datum
+make_interval(PG_FUNCTION_ARGS)
+{
+ int32 years = PG_GETARG_INT32(0);
+ int32 months = PG_GETARG_INT32(1);
+ int32 weeks = PG_GETARG_INT32(2);
+ int32 days = PG_GETARG_INT32(3);
+ int32 hours = PG_GETARG_INT32(4);
+ int32 mins = PG_GETARG_INT32(5);
+ double secs = PG_GETARG_FLOAT8(6);
+ Interval *result;
+
+ /*
+ * Reject out-of-range inputs. We really ought to check the integer
+ * inputs as well, but it's not entirely clear what limits to apply.
+ */
+ if (isinf(secs) || isnan(secs))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ result = (Interval *) palloc(sizeof(Interval));
+ result->month = years * MONTHS_PER_YEAR + months;
+ result->day = weeks * 7 + days;
+
+ secs = rint(secs * USECS_PER_SEC);
+ result->time = hours * ((int64) SECS_PER_HOUR * USECS_PER_SEC) +
+ mins * ((int64) SECS_PER_MINUTE * USECS_PER_SEC) +
+ (int64) secs;
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* EncodeSpecialTimestamp()
+ * Convert reserved timestamp data type to string.
+ */
+void
+EncodeSpecialTimestamp(Timestamp dt, char *str)
+{
+ if (TIMESTAMP_IS_NOBEGIN(dt))
+ strcpy(str, EARLY);
+ else if (TIMESTAMP_IS_NOEND(dt))
+ strcpy(str, LATE);
+ else /* shouldn't happen */
+ elog(ERROR, "invalid argument for EncodeSpecialTimestamp");
+}
+
+Datum
+now(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp());
+}
+
+Datum
+statement_timestamp(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(GetCurrentStatementStartTimestamp());
+}
+
+Datum
+clock_timestamp(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(GetCurrentTimestamp());
+}
+
+Datum
+pg_postmaster_start_time(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(PgStartTime);
+}
+
+Datum
+pg_conf_load_time(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TIMESTAMPTZ(PgReloadTime);
+}
+
+/*
+ * GetCurrentTimestamp -- get the current operating system time
+ *
+ * Result is in the form of a TimestampTz value, and is expressed to the
+ * full precision of the gettimeofday() syscall
+ */
+TimestampTz
+GetCurrentTimestamp(void)
+{
+ TimestampTz result;
+ struct timeval tp;
+
+ gettimeofday(&tp, NULL);
+
+ result = (TimestampTz) tp.tv_sec -
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+ result = (result * USECS_PER_SEC) + tp.tv_usec;
+
+ return result;
+}
+
+/*
+ * GetSQLCurrentTimestamp -- implements CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(n)
+ */
+TimestampTz
+GetSQLCurrentTimestamp(int32 typmod)
+{
+ TimestampTz ts;
+
+ ts = GetCurrentTransactionStartTimestamp();
+ if (typmod >= 0)
+ AdjustTimestampForTypmod(&ts, typmod);
+ return ts;
+}
+
+/*
+ * GetSQLLocalTimestamp -- implements LOCALTIMESTAMP, LOCALTIMESTAMP(n)
+ */
+Timestamp
+GetSQLLocalTimestamp(int32 typmod)
+{
+ Timestamp ts;
+
+ ts = timestamptz2timestamp(GetCurrentTransactionStartTimestamp());
+ if (typmod >= 0)
+ AdjustTimestampForTypmod(&ts, typmod);
+ return ts;
+}
+
+/*
+ * timeofday(*) -- returns the current time as a text.
+ */
+Datum
+timeofday(PG_FUNCTION_ARGS)
+{
+ struct timeval tp;
+ char templ[128];
+ char buf[128];
+ pg_time_t tt;
+
+ gettimeofday(&tp, NULL);
+ tt = (pg_time_t) tp.tv_sec;
+ pg_strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%06d %Y %Z",
+ pg_localtime(&tt, session_timezone));
+ snprintf(buf, sizeof(buf), templ, tp.tv_usec);
+
+ PG_RETURN_TEXT_P(cstring_to_text(buf));
+}
+
+/*
+ * TimestampDifference -- convert the difference between two timestamps
+ * into integer seconds and microseconds
+ *
+ * This is typically used to calculate a wait timeout for select(2),
+ * which explains the otherwise-odd choice of output format.
+ *
+ * Both inputs must be ordinary finite timestamps (in current usage,
+ * they'll be results from GetCurrentTimestamp()).
+ *
+ * We expect start_time <= stop_time. If not, we return zeros,
+ * since then we're already past the previously determined stop_time.
+ */
+void
+TimestampDifference(TimestampTz start_time, TimestampTz stop_time,
+ long *secs, int *microsecs)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ if (diff <= 0)
+ {
+ *secs = 0;
+ *microsecs = 0;
+ }
+ else
+ {
+ *secs = (long) (diff / USECS_PER_SEC);
+ *microsecs = (int) (diff % USECS_PER_SEC);
+ }
+}
+
+/*
+ * TimestampDifferenceMilliseconds -- convert the difference between two
+ * timestamps into integer milliseconds
+ *
+ * This is typically used to calculate a wait timeout for WaitLatch()
+ * or a related function. The choice of "long" as the result type
+ * is to harmonize with that. It is caller's responsibility that the
+ * input timestamps not be so far apart as to risk overflow of "long"
+ * (which'd happen at about 25 days on machines with 32-bit "long").
+ *
+ * Both inputs must be ordinary finite timestamps (in current usage,
+ * they'll be results from GetCurrentTimestamp()).
+ *
+ * We expect start_time <= stop_time. If not, we return zero,
+ * since then we're already past the previously determined stop_time.
+ *
+ * Note we round up any fractional millisecond, since waiting for just
+ * less than the intended timeout is undesirable.
+ */
+long
+TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ if (diff <= 0)
+ return 0;
+ else
+ return (long) ((diff + 999) / 1000);
+}
+
+/*
+ * TimestampDifferenceExceeds -- report whether the difference between two
+ * timestamps is >= a threshold (expressed in milliseconds)
+ *
+ * Both inputs must be ordinary finite timestamps (in current usage,
+ * they'll be results from GetCurrentTimestamp()).
+ */
+bool
+TimestampDifferenceExceeds(TimestampTz start_time,
+ TimestampTz stop_time,
+ int msec)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ return (diff >= msec * INT64CONST(1000));
+}
+
+/*
+ * Convert a time_t to TimestampTz.
+ *
+ * We do not use time_t internally in Postgres, but this is provided for use
+ * by functions that need to interpret, say, a stat(2) result.
+ *
+ * To avoid having the function's ABI vary depending on the width of time_t,
+ * we declare the argument as pg_time_t, which is cast-compatible with
+ * time_t but always 64 bits wide (unless the platform has no 64-bit type).
+ * This detail should be invisible to callers, at least at source code level.
+ */
+TimestampTz
+time_t_to_timestamptz(pg_time_t tm)
+{
+ TimestampTz result;
+
+ result = (TimestampTz) tm -
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+ result *= USECS_PER_SEC;
+
+ return result;
+}
+
+/*
+ * Convert a TimestampTz to time_t.
+ *
+ * This too is just marginally useful, but some places need it.
+ *
+ * To avoid having the function's ABI vary depending on the width of time_t,
+ * we declare the result as pg_time_t, which is cast-compatible with
+ * time_t but always 64 bits wide (unless the platform has no 64-bit type).
+ * This detail should be invisible to callers, at least at source code level.
+ */
+pg_time_t
+timestamptz_to_time_t(TimestampTz t)
+{
+ pg_time_t result;
+
+ result = (pg_time_t) (t / USECS_PER_SEC +
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY));
+
+ return result;
+}
+
+/*
+ * Produce a C-string representation of a TimestampTz.
+ *
+ * This is mostly for use in emitting messages. The primary difference
+ * from timestamptz_out is that we force the output format to ISO. Note
+ * also that the result is in a static buffer, not pstrdup'd.
+ *
+ * See also pg_strftime.
+ */
+const char *
+timestamptz_to_str(TimestampTz t)
+{
+ static char buf[MAXDATELEN + 1];
+ int tz;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ const char *tzn;
+
+ if (TIMESTAMP_NOT_FINITE(t))
+ EncodeSpecialTimestamp(t, buf);
+ else if (timestamp2tm(t, &tz, tm, &fsec, &tzn, NULL) == 0)
+ EncodeDateTime(tm, fsec, true, tz, tzn, USE_ISO_DATES, buf);
+ else
+ strlcpy(buf, "(timestamp out of range)", sizeof(buf));
+
+ return buf;
+}
+
+
+void
+dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec)
+{
+ TimeOffset time;
+
+ time = jd;
+
+ *hour = time / USECS_PER_HOUR;
+ time -= (*hour) * USECS_PER_HOUR;
+ *min = time / USECS_PER_MINUTE;
+ time -= (*min) * USECS_PER_MINUTE;
+ *sec = time / USECS_PER_SEC;
+ *fsec = time - (*sec * USECS_PER_SEC);
+} /* dt2time() */
+
+
+/*
+ * timestamp2tm() - Convert timestamp data type to POSIX time structure.
+ *
+ * Note that year is _not_ 1900-based, but is an explicit full value.
+ * Also, month is one-based, _not_ zero-based.
+ * Returns:
+ * 0 on success
+ * -1 on out of range
+ *
+ * If attimezone is NULL, the global timezone setting will be used.
+ */
+int
+timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
+{
+ Timestamp date;
+ Timestamp time;
+ pg_time_t utime;
+
+ /* Use session timezone if caller asks for default */
+ if (attimezone == NULL)
+ attimezone = session_timezone;
+
+ time = dt;
+ TMODULO(time, date, USECS_PER_DAY);
+
+ if (time < INT64CONST(0))
+ {
+ time += USECS_PER_DAY;
+ date -= 1;
+ }
+
+ /* add offset to go from J2000 back to standard Julian date */
+ date += POSTGRES_EPOCH_JDATE;
+
+ /* Julian day routine does not work for negative Julian days */
+ if (date < 0 || date > (Timestamp) INT_MAX)
+ return -1;
+
+ j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+ dt2time(time, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
+
+ /* Done if no TZ conversion wanted */
+ if (tzp == NULL)
+ {
+ tm->tm_isdst = -1;
+ tm->tm_gmtoff = 0;
+ tm->tm_zone = NULL;
+ if (tzn != NULL)
+ *tzn = NULL;
+ return 0;
+ }
+
+ /*
+ * If the time falls within the range of pg_time_t, use pg_localtime() to
+ * rotate to the local time zone.
+ *
+ * First, convert to an integral timestamp, avoiding possibly
+ * platform-specific roundoff-in-wrong-direction errors, and adjust to
+ * Unix epoch. Then see if we can convert to pg_time_t without loss. This
+ * coding avoids hardwiring any assumptions about the width of pg_time_t,
+ * so it should behave sanely on machines without int64.
+ */
+ dt = (dt - *fsec) / USECS_PER_SEC +
+ (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY;
+ utime = (pg_time_t) dt;
+ if ((Timestamp) utime == dt)
+ {
+ struct pg_tm *tx = pg_localtime(&utime, attimezone);
+
+ tm->tm_year = tx->tm_year + 1900;
+ tm->tm_mon = tx->tm_mon + 1;
+ tm->tm_mday = tx->tm_mday;
+ tm->tm_hour = tx->tm_hour;
+ tm->tm_min = tx->tm_min;
+ tm->tm_sec = tx->tm_sec;
+ tm->tm_isdst = tx->tm_isdst;
+ tm->tm_gmtoff = tx->tm_gmtoff;
+ tm->tm_zone = tx->tm_zone;
+ *tzp = -tm->tm_gmtoff;
+ if (tzn != NULL)
+ *tzn = tm->tm_zone;
+ }
+ else
+ {
+ /*
+ * When out of range of pg_time_t, treat as GMT
+ */
+ *tzp = 0;
+ /* Mark this as *no* time zone available */
+ tm->tm_isdst = -1;
+ tm->tm_gmtoff = 0;
+ tm->tm_zone = NULL;
+ if (tzn != NULL)
+ *tzn = NULL;
+ }
+
+ return 0;
+}
+
+
+/* tm2timestamp()
+ * Convert a tm structure to a timestamp data type.
+ * Note that year is _not_ 1900-based, but is an explicit full value.
+ * Also, month is one-based, _not_ zero-based.
+ *
+ * Returns -1 on failure (value out of range).
+ */
+int
+tm2timestamp(struct pg_tm *tm, fsec_t fsec, int *tzp, Timestamp *result)
+{
+ TimeOffset date;
+ TimeOffset time;
+
+ /* Prevent overflow in Julian-day routines */
+ if (!IS_VALID_JULIAN(tm->tm_year, tm->tm_mon, tm->tm_mday))
+ {
+ *result = 0; /* keep compiler quiet */
+ return -1;
+ }
+
+ date = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;
+ time = time2t(tm->tm_hour, tm->tm_min, tm->tm_sec, fsec);
+
+ *result = date * USECS_PER_DAY + time;
+ /* check for major overflow */
+ if ((*result - time) / USECS_PER_DAY != date)
+ {
+ *result = 0; /* keep compiler quiet */
+ return -1;
+ }
+ /* check for just-barely overflow (okay except time-of-day wraps) */
+ /* caution: we want to allow 1999-12-31 24:00:00 */
+ if ((*result < 0 && date > 0) ||
+ (*result > 0 && date < -1))
+ {
+ *result = 0; /* keep compiler quiet */
+ return -1;
+ }
+ if (tzp != NULL)
+ *result = dt2local(*result, -(*tzp));
+
+ /* final range check catches just-out-of-range timestamps */
+ if (!IS_VALID_TIMESTAMP(*result))
+ {
+ *result = 0; /* keep compiler quiet */
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* interval2itm()
+ * Convert an Interval to a pg_itm structure.
+ * Note: overflow is not possible, because the pg_itm fields are
+ * wide enough for all possible conversion results.
+ */
+void
+interval2itm(Interval span, struct pg_itm *itm)
+{
+ TimeOffset time;
+ TimeOffset tfrac;
+
+ itm->tm_year = span.month / MONTHS_PER_YEAR;
+ itm->tm_mon = span.month % MONTHS_PER_YEAR;
+ itm->tm_mday = span.day;
+ time = span.time;
+
+ tfrac = time / USECS_PER_HOUR;
+ time -= tfrac * USECS_PER_HOUR;
+ itm->tm_hour = tfrac;
+ tfrac = time / USECS_PER_MINUTE;
+ time -= tfrac * USECS_PER_MINUTE;
+ itm->tm_min = (int) tfrac;
+ tfrac = time / USECS_PER_SEC;
+ time -= tfrac * USECS_PER_SEC;
+ itm->tm_sec = (int) tfrac;
+ itm->tm_usec = (int) time;
+}
+
+/* itm2interval()
+ * Convert a pg_itm structure to an Interval.
+ * Returns 0 if OK, -1 on overflow.
+ */
+int
+itm2interval(struct pg_itm *itm, Interval *span)
+{
+ int64 total_months = (int64) itm->tm_year * MONTHS_PER_YEAR + itm->tm_mon;
+
+ if (total_months > INT_MAX || total_months < INT_MIN)
+ return -1;
+ span->month = (int32) total_months;
+ span->day = itm->tm_mday;
+ if (pg_mul_s64_overflow(itm->tm_hour, USECS_PER_HOUR,
+ &span->time))
+ return -1;
+ /* tm_min, tm_sec are 32 bits, so intermediate products can't overflow */
+ if (pg_add_s64_overflow(span->time, itm->tm_min * USECS_PER_MINUTE,
+ &span->time))
+ return -1;
+ if (pg_add_s64_overflow(span->time, itm->tm_sec * USECS_PER_SEC,
+ &span->time))
+ return -1;
+ if (pg_add_s64_overflow(span->time, itm->tm_usec,
+ &span->time))
+ return -1;
+ return 0;
+}
+
+/* itmin2interval()
+ * Convert a pg_itm_in structure to an Interval.
+ * Returns 0 if OK, -1 on overflow.
+ */
+int
+itmin2interval(struct pg_itm_in *itm_in, Interval *span)
+{
+ int64 total_months = (int64) itm_in->tm_year * MONTHS_PER_YEAR + itm_in->tm_mon;
+
+ if (total_months > INT_MAX || total_months < INT_MIN)
+ return -1;
+ span->month = (int32) total_months;
+ span->day = itm_in->tm_mday;
+ span->time = itm_in->tm_usec;
+ return 0;
+}
+
+static TimeOffset
+time2t(const int hour, const int min, const int sec, const fsec_t fsec)
+{
+ return (((((hour * MINS_PER_HOUR) + min) * SECS_PER_MINUTE) + sec) * USECS_PER_SEC) + fsec;
+}
+
+static Timestamp
+dt2local(Timestamp dt, int tz)
+{
+ dt -= (tz * USECS_PER_SEC);
+ return dt;
+}
+
+
+/*****************************************************************************
+ * PUBLIC ROUTINES *
+ *****************************************************************************/
+
+
+Datum
+timestamp_finite(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+
+ PG_RETURN_BOOL(!TIMESTAMP_NOT_FINITE(timestamp));
+}
+
+Datum
+interval_finite(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(true);
+}
+
+
+/*----------------------------------------------------------
+ * Relational operators for timestamp.
+ *---------------------------------------------------------*/
+
+void
+GetEpochTime(struct pg_tm *tm)
+{
+ struct pg_tm *t0;
+ pg_time_t epoch = 0;
+
+ t0 = pg_gmtime(&epoch);
+
+ if (t0 == NULL)
+ elog(ERROR, "could not convert epoch to timestamp: %m");
+
+ tm->tm_year = t0->tm_year;
+ tm->tm_mon = t0->tm_mon;
+ tm->tm_mday = t0->tm_mday;
+ tm->tm_hour = t0->tm_hour;
+ tm->tm_min = t0->tm_min;
+ tm->tm_sec = t0->tm_sec;
+
+ tm->tm_year += 1900;
+ tm->tm_mon++;
+}
+
+Timestamp
+SetEpochTimestamp(void)
+{
+ Timestamp dt;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ GetEpochTime(tm);
+ /* we don't bother to test for failure ... */
+ tm2timestamp(tm, 0, NULL, &dt);
+
+ return dt;
+} /* SetEpochTimestamp() */
+
+/*
+ * We are currently sharing some code between timestamp and timestamptz.
+ * The comparison functions are among them. - thomas 2001-09-25
+ *
+ * timestamp_relop - is timestamp1 relop timestamp2
+ */
+int
+timestamp_cmp_internal(Timestamp dt1, Timestamp dt2)
+{
+ return (dt1 < dt2) ? -1 : ((dt1 > dt2) ? 1 : 0);
+}
+
+Datum
+timestamp_eq(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) == 0);
+}
+
+Datum
+timestamp_ne(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) != 0);
+}
+
+Datum
+timestamp_lt(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) < 0);
+}
+
+Datum
+timestamp_gt(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) > 0);
+}
+
+Datum
+timestamp_le(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) <= 0);
+}
+
+Datum
+timestamp_ge(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) >= 0);
+}
+
+Datum
+timestamp_cmp(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2));
+}
+
+#if SIZEOF_DATUM < 8
+/* note: this is used for timestamptz also */
+static int
+timestamp_fastcmp(Datum x, Datum y, SortSupport ssup)
+{
+ Timestamp a = DatumGetTimestamp(x);
+ Timestamp b = DatumGetTimestamp(y);
+
+ return timestamp_cmp_internal(a, b);
+}
+#endif
+
+Datum
+timestamp_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+#if SIZEOF_DATUM >= 8
+
+ /*
+ * If this build has pass-by-value timestamps, then we can use a standard
+ * comparator function.
+ */
+ ssup->comparator = ssup_datum_signed_cmp;
+#else
+ ssup->comparator = timestamp_fastcmp;
+#endif
+ PG_RETURN_VOID();
+}
+
+Datum
+timestamp_hash(PG_FUNCTION_ARGS)
+{
+ return hashint8(fcinfo);
+}
+
+Datum
+timestamp_hash_extended(PG_FUNCTION_ARGS)
+{
+ return hashint8extended(fcinfo);
+}
+
+/*
+ * Cross-type comparison functions for timestamp vs timestamptz
+ */
+
+int32
+timestamp_cmp_timestamptz_internal(Timestamp timestampVal, TimestampTz dt2)
+{
+ TimestampTz dt1;
+ int overflow;
+
+ dt1 = timestamp2timestamptz_opt_overflow(timestampVal, &overflow);
+ if (overflow > 0)
+ {
+ /* dt1 is larger than any finite timestamp, but less than infinity */
+ return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+ }
+ if (overflow < 0)
+ {
+ /* dt1 is less than any finite timestamp, but more than -infinity */
+ return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
+ }
+
+ return timestamptz_cmp_internal(dt1, dt2);
+}
+
+Datum
+timestamp_eq_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) == 0);
+}
+
+Datum
+timestamp_ne_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) != 0);
+}
+
+Datum
+timestamp_lt_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) < 0);
+}
+
+Datum
+timestamp_gt_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) > 0);
+}
+
+Datum
+timestamp_le_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) <= 0);
+}
+
+Datum
+timestamp_ge_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) >= 0);
+}
+
+Datum
+timestamp_cmp_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+
+ PG_RETURN_INT32(timestamp_cmp_timestamptz_internal(timestampVal, dt2));
+}
+
+Datum
+timestamptz_eq_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) == 0);
+}
+
+Datum
+timestamptz_ne_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) != 0);
+}
+
+Datum
+timestamptz_lt_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) > 0);
+}
+
+Datum
+timestamptz_gt_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) < 0);
+}
+
+Datum
+timestamptz_le_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) >= 0);
+}
+
+Datum
+timestamptz_ge_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) <= 0);
+}
+
+Datum
+timestamptz_cmp_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ Timestamp timestampVal = PG_GETARG_TIMESTAMP(1);
+
+ PG_RETURN_INT32(-timestamp_cmp_timestamptz_internal(timestampVal, dt1));
+}
+
+
+/*
+ * interval_relop - is interval1 relop interval2
+ *
+ * Interval comparison is based on converting interval values to a linear
+ * representation expressed in the units of the time field (microseconds,
+ * in the case of integer timestamps) with days assumed to be always 24 hours
+ * and months assumed to be always 30 days. To avoid overflow, we need a
+ * wider-than-int64 datatype for the linear representation, so use INT128.
+ */
+
+static inline INT128
+interval_cmp_value(const Interval *interval)
+{
+ INT128 span;
+ int64 days;
+
+ /*
+ * Combine the month and day fields into an integral number of days.
+ * Because the inputs are int32, int64 arithmetic suffices here.
+ */
+ days = interval->month * INT64CONST(30);
+ days += interval->day;
+
+ /* Widen time field to 128 bits */
+ span = int64_to_int128(interval->time);
+
+ /* Scale up days to microseconds, forming a 128-bit product */
+ int128_add_int64_mul_int64(&span, days, USECS_PER_DAY);
+
+ return span;
+}
+
+static int
+interval_cmp_internal(Interval *interval1, Interval *interval2)
+{
+ INT128 span1 = interval_cmp_value(interval1);
+ INT128 span2 = interval_cmp_value(interval2);
+
+ return int128_compare(span1, span2);
+}
+
+Datum
+interval_eq(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) == 0);
+}
+
+Datum
+interval_ne(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) != 0);
+}
+
+Datum
+interval_lt(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) < 0);
+}
+
+Datum
+interval_gt(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) > 0);
+}
+
+Datum
+interval_le(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) <= 0);
+}
+
+Datum
+interval_ge(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_BOOL(interval_cmp_internal(interval1, interval2) >= 0);
+}
+
+Datum
+interval_cmp(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+
+ PG_RETURN_INT32(interval_cmp_internal(interval1, interval2));
+}
+
+/*
+ * Hashing for intervals
+ *
+ * We must produce equal hashvals for values that interval_cmp_internal()
+ * considers equal. So, compute the net span the same way it does,
+ * and then hash that.
+ */
+Datum
+interval_hash(PG_FUNCTION_ARGS)
+{
+ Interval *interval = PG_GETARG_INTERVAL_P(0);
+ INT128 span = interval_cmp_value(interval);
+ int64 span64;
+
+ /*
+ * Use only the least significant 64 bits for hashing. The upper 64 bits
+ * seldom add any useful information, and besides we must do it like this
+ * for compatibility with hashes calculated before use of INT128 was
+ * introduced.
+ */
+ span64 = int128_to_int64(span);
+
+ return DirectFunctionCall1(hashint8, Int64GetDatumFast(span64));
+}
+
+Datum
+interval_hash_extended(PG_FUNCTION_ARGS)
+{
+ Interval *interval = PG_GETARG_INTERVAL_P(0);
+ INT128 span = interval_cmp_value(interval);
+ int64 span64;
+
+ /* Same approach as interval_hash */
+ span64 = int128_to_int64(span);
+
+ return DirectFunctionCall2(hashint8extended, Int64GetDatumFast(span64),
+ PG_GETARG_DATUM(1));
+}
+
+/* overlaps_timestamp() --- implements the SQL OVERLAPS operator.
+ *
+ * Algorithm is per SQL spec. This is much harder than you'd think
+ * because the spec requires us to deliver a non-null answer in some cases
+ * where some of the inputs are null.
+ */
+Datum
+overlaps_timestamp(PG_FUNCTION_ARGS)
+{
+ /*
+ * The arguments are Timestamps, but we leave them as generic Datums to
+ * avoid unnecessary conversions between value and reference forms --- not
+ * to mention possible dereferences of null pointers.
+ */
+ Datum ts1 = PG_GETARG_DATUM(0);
+ Datum te1 = PG_GETARG_DATUM(1);
+ Datum ts2 = PG_GETARG_DATUM(2);
+ Datum te2 = PG_GETARG_DATUM(3);
+ bool ts1IsNull = PG_ARGISNULL(0);
+ bool te1IsNull = PG_ARGISNULL(1);
+ bool ts2IsNull = PG_ARGISNULL(2);
+ bool te2IsNull = PG_ARGISNULL(3);
+
+#define TIMESTAMP_GT(t1,t2) \
+ DatumGetBool(DirectFunctionCall2(timestamp_gt,t1,t2))
+#define TIMESTAMP_LT(t1,t2) \
+ DatumGetBool(DirectFunctionCall2(timestamp_lt,t1,t2))
+
+ /*
+ * If both endpoints of interval 1 are null, the result is null (unknown).
+ * If just one endpoint is null, take ts1 as the non-null one. Otherwise,
+ * take ts1 as the lesser endpoint.
+ */
+ if (ts1IsNull)
+ {
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts1 = te1;
+ te1IsNull = true;
+ }
+ else if (!te1IsNull)
+ {
+ if (TIMESTAMP_GT(ts1, te1))
+ {
+ Datum tt = ts1;
+
+ ts1 = te1;
+ te1 = tt;
+ }
+ }
+
+ /* Likewise for interval 2. */
+ if (ts2IsNull)
+ {
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ /* swap null for non-null */
+ ts2 = te2;
+ te2IsNull = true;
+ }
+ else if (!te2IsNull)
+ {
+ if (TIMESTAMP_GT(ts2, te2))
+ {
+ Datum tt = ts2;
+
+ ts2 = te2;
+ te2 = tt;
+ }
+ }
+
+ /*
+ * At this point neither ts1 nor ts2 is null, so we can consider three
+ * cases: ts1 > ts2, ts1 < ts2, ts1 = ts2
+ */
+ if (TIMESTAMP_GT(ts1, ts2))
+ {
+ /*
+ * This case is ts1 < te2 OR te1 < te2, which may look redundant but
+ * in the presence of nulls it's not quite completely so.
+ */
+ if (te2IsNull)
+ PG_RETURN_NULL();
+ if (TIMESTAMP_LT(ts1, te2))
+ PG_RETURN_BOOL(true);
+ if (te1IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te1 is not null then we had ts1 <= te1 above, and we just found
+ * ts1 >= te2, hence te1 >= te2.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else if (TIMESTAMP_LT(ts1, ts2))
+ {
+ /* This case is ts2 < te1 OR te2 < te1 */
+ if (te1IsNull)
+ PG_RETURN_NULL();
+ if (TIMESTAMP_LT(ts2, te1))
+ PG_RETURN_BOOL(true);
+ if (te2IsNull)
+ PG_RETURN_NULL();
+
+ /*
+ * If te2 is not null then we had ts2 <= te2 above, and we just found
+ * ts2 >= te1, hence te2 >= te1.
+ */
+ PG_RETURN_BOOL(false);
+ }
+ else
+ {
+ /*
+ * For ts1 = ts2 the spec says te1 <> te2 OR te1 = te2, which is a
+ * rather silly way of saying "true if both are non-null, else null".
+ */
+ if (te1IsNull || te2IsNull)
+ PG_RETURN_NULL();
+ PG_RETURN_BOOL(true);
+ }
+
+#undef TIMESTAMP_GT
+#undef TIMESTAMP_LT
+}
+
+
+/*----------------------------------------------------------
+ * "Arithmetic" operators on date/times.
+ *---------------------------------------------------------*/
+
+Datum
+timestamp_smaller(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+ Timestamp result;
+
+ /* use timestamp_cmp_internal to be sure this agrees with comparisons */
+ if (timestamp_cmp_internal(dt1, dt2) < 0)
+ result = dt1;
+ else
+ result = dt2;
+ PG_RETURN_TIMESTAMP(result);
+}
+
+Datum
+timestamp_larger(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+ Timestamp result;
+
+ if (timestamp_cmp_internal(dt1, dt2) > 0)
+ result = dt1;
+ else
+ result = dt2;
+ PG_RETURN_TIMESTAMP(result);
+}
+
+
+Datum
+timestamp_mi(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ if (TIMESTAMP_NOT_FINITE(dt1) || TIMESTAMP_NOT_FINITE(dt2))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("cannot subtract infinite timestamps")));
+
+ result->time = dt1 - dt2;
+
+ result->month = 0;
+ result->day = 0;
+
+ /*----------
+ * This is wrong, but removing it breaks a lot of regression tests.
+ * For example:
+ *
+ * test=> SET timezone = 'EST5EDT';
+ * test=> SELECT
+ * test-> ('2005-10-30 13:22:00-05'::timestamptz -
+ * test(> '2005-10-29 13:22:00-04'::timestamptz);
+ * ?column?
+ * ----------------
+ * 1 day 01:00:00
+ * (1 row)
+ *
+ * so adding that to the first timestamp gets:
+ *
+ * test=> SELECT
+ * test-> ('2005-10-29 13:22:00-04'::timestamptz +
+ * test(> ('2005-10-30 13:22:00-05'::timestamptz -
+ * test(> '2005-10-29 13:22:00-04'::timestamptz)) at time zone 'EST';
+ * timezone
+ * --------------------
+ * 2005-10-30 14:22:00
+ * (1 row)
+ *----------
+ */
+ result = DatumGetIntervalP(DirectFunctionCall1(interval_justify_hours,
+ IntervalPGetDatum(result)));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/*
+ * interval_justify_interval()
+ *
+ * Adjust interval so 'month', 'day', and 'time' portions are within
+ * customary bounds. Specifically:
+ *
+ * 0 <= abs(time) < 24 hours
+ * 0 <= abs(day) < 30 days
+ *
+ * Also, the sign bit on all three fields is made equal, so either
+ * all three fields are negative or all are positive.
+ */
+Datum
+interval_justify_interval(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ Interval *result;
+ TimeOffset wholeday;
+ int32 wholemonth;
+
+ result = (Interval *) palloc(sizeof(Interval));
+ result->month = span->month;
+ result->day = span->day;
+ result->time = span->time;
+
+ /* pre-justify days if it might prevent overflow */
+ if ((result->day > 0 && result->time > 0) ||
+ (result->day < 0 && result->time < 0))
+ {
+ wholemonth = result->day / DAYS_PER_MONTH;
+ result->day -= wholemonth * DAYS_PER_MONTH;
+ if (pg_add_s32_overflow(result->month, wholemonth, &result->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ }
+
+ /*
+ * Since TimeOffset is int64, abs(wholeday) can't exceed about 1.07e8. If
+ * we pre-justified then abs(result->day) is less than DAYS_PER_MONTH, so
+ * this addition can't overflow. If we didn't pre-justify, then day and
+ * time are of different signs, so it still can't overflow.
+ */
+ TMODULO(result->time, wholeday, USECS_PER_DAY);
+ result->day += wholeday;
+
+ wholemonth = result->day / DAYS_PER_MONTH;
+ result->day -= wholemonth * DAYS_PER_MONTH;
+ if (pg_add_s32_overflow(result->month, wholemonth, &result->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ if (result->month > 0 &&
+ (result->day < 0 || (result->day == 0 && result->time < 0)))
+ {
+ result->day += DAYS_PER_MONTH;
+ result->month--;
+ }
+ else if (result->month < 0 &&
+ (result->day > 0 || (result->day == 0 && result->time > 0)))
+ {
+ result->day -= DAYS_PER_MONTH;
+ result->month++;
+ }
+
+ if (result->day > 0 && result->time < 0)
+ {
+ result->time += USECS_PER_DAY;
+ result->day--;
+ }
+ else if (result->day < 0 && result->time > 0)
+ {
+ result->time -= USECS_PER_DAY;
+ result->day++;
+ }
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/*
+ * interval_justify_hours()
+ *
+ * Adjust interval so 'time' contains less than a whole day, adding
+ * the excess to 'day'. This is useful for
+ * situations (such as non-TZ) where '1 day' = '24 hours' is valid,
+ * e.g. interval subtraction and division.
+ */
+Datum
+interval_justify_hours(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ Interval *result;
+ TimeOffset wholeday;
+
+ result = (Interval *) palloc(sizeof(Interval));
+ result->month = span->month;
+ result->day = span->day;
+ result->time = span->time;
+
+ TMODULO(result->time, wholeday, USECS_PER_DAY);
+ if (pg_add_s32_overflow(result->day, wholeday, &result->day))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ if (result->day > 0 && result->time < 0)
+ {
+ result->time += USECS_PER_DAY;
+ result->day--;
+ }
+ else if (result->day < 0 && result->time > 0)
+ {
+ result->time -= USECS_PER_DAY;
+ result->day++;
+ }
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/*
+ * interval_justify_days()
+ *
+ * Adjust interval so 'day' contains less than 30 days, adding
+ * the excess to 'month'.
+ */
+Datum
+interval_justify_days(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ Interval *result;
+ int32 wholemonth;
+
+ result = (Interval *) palloc(sizeof(Interval));
+ result->month = span->month;
+ result->day = span->day;
+ result->time = span->time;
+
+ wholemonth = result->day / DAYS_PER_MONTH;
+ result->day -= wholemonth * DAYS_PER_MONTH;
+ if (pg_add_s32_overflow(result->month, wholemonth, &result->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ if (result->month > 0 && result->day < 0)
+ {
+ result->day += DAYS_PER_MONTH;
+ result->month--;
+ }
+ else if (result->month < 0 && result->day > 0)
+ {
+ result->day -= DAYS_PER_MONTH;
+ result->month++;
+ }
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* timestamp_pl_interval()
+ * Add an interval to a timestamp data type.
+ * Note that interval has provisions for qualitative year/month and day
+ * units, so try to do the right thing with them.
+ * To add a month, increment the month, and use the same day of month.
+ * Then, if the next month has fewer days, set the day of month
+ * to the last day of month.
+ * To add a day, increment the mday, and use the same time of day.
+ * Lastly, add in the "quantitative time".
+ */
+Datum
+timestamp_pl_interval(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ Timestamp result;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ result = timestamp;
+ else
+ {
+ if (span->month != 0)
+ {
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ tm->tm_mon += span->month;
+ if (tm->tm_mon > MONTHS_PER_YEAR)
+ {
+ tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR;
+ tm->tm_mon = ((tm->tm_mon - 1) % MONTHS_PER_YEAR) + 1;
+ }
+ else if (tm->tm_mon < 1)
+ {
+ tm->tm_year += tm->tm_mon / MONTHS_PER_YEAR - 1;
+ tm->tm_mon = tm->tm_mon % MONTHS_PER_YEAR + MONTHS_PER_YEAR;
+ }
+
+ /* adjust for end of month boundary problems... */
+ if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+ tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);
+
+ if (tm2timestamp(tm, fsec, NULL, &timestamp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+
+ if (span->day != 0)
+ {
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int julian;
+
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* Add days by converting to and from Julian */
+ julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day;
+ j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+
+ if (tm2timestamp(tm, fsec, NULL, &timestamp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+
+ timestamp += span->time;
+
+ if (!IS_VALID_TIMESTAMP(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = timestamp;
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+Datum
+timestamp_mi_interval(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ Interval tspan;
+
+ tspan.month = -span->month;
+ tspan.day = -span->day;
+ tspan.time = -span->time;
+
+ return DirectFunctionCall2(timestamp_pl_interval,
+ TimestampGetDatum(timestamp),
+ PointerGetDatum(&tspan));
+}
+
+
+/* timestamptz_pl_interval()
+ * Add an interval to a timestamp with time zone data type.
+ * Note that interval has provisions for qualitative year/month
+ * units, so try to do the right thing with them.
+ * To add a month, increment the month, and use the same day of month.
+ * Then, if the next month has fewer days, set the day of month
+ * to the last day of month.
+ * Lastly, add in the "quantitative time".
+ */
+Datum
+timestamptz_pl_interval(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimestampTz result;
+ int tz;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ result = timestamp;
+ else
+ {
+ if (span->month != 0)
+ {
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ tm->tm_mon += span->month;
+ if (tm->tm_mon > MONTHS_PER_YEAR)
+ {
+ tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR;
+ tm->tm_mon = ((tm->tm_mon - 1) % MONTHS_PER_YEAR) + 1;
+ }
+ else if (tm->tm_mon < 1)
+ {
+ tm->tm_year += tm->tm_mon / MONTHS_PER_YEAR - 1;
+ tm->tm_mon = tm->tm_mon % MONTHS_PER_YEAR + MONTHS_PER_YEAR;
+ }
+
+ /* adjust for end of month boundary problems... */
+ if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+ tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);
+
+ tz = DetermineTimeZoneOffset(tm, session_timezone);
+
+ if (tm2timestamp(tm, fsec, &tz, &timestamp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+
+ if (span->day != 0)
+ {
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int julian;
+
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ /* Add days by converting to and from Julian */
+ julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day;
+ j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
+
+ tz = DetermineTimeZoneOffset(tm, session_timezone);
+
+ if (tm2timestamp(tm, fsec, &tz, &timestamp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+
+ timestamp += span->time;
+
+ if (!IS_VALID_TIMESTAMP(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ result = timestamp;
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+Datum
+timestamptz_mi_interval(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ Interval tspan;
+
+ tspan.month = -span->month;
+ tspan.day = -span->day;
+ tspan.time = -span->time;
+
+ return DirectFunctionCall2(timestamptz_pl_interval,
+ TimestampGetDatum(timestamp),
+ PointerGetDatum(&tspan));
+}
+
+
+Datum
+interval_um(PG_FUNCTION_ARGS)
+{
+ Interval *interval = PG_GETARG_INTERVAL_P(0);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result->time = -interval->time;
+ /* overflow check copied from int4um */
+ if (interval->time != 0 && SAMESIGN(result->time, interval->time))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ result->day = -interval->day;
+ if (interval->day != 0 && SAMESIGN(result->day, interval->day))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ result->month = -interval->month;
+ if (interval->month != 0 && SAMESIGN(result->month, interval->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+
+Datum
+interval_smaller(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+ Interval *result;
+
+ /* use interval_cmp_internal to be sure this agrees with comparisons */
+ if (interval_cmp_internal(interval1, interval2) < 0)
+ result = interval1;
+ else
+ result = interval2;
+ PG_RETURN_INTERVAL_P(result);
+}
+
+Datum
+interval_larger(PG_FUNCTION_ARGS)
+{
+ Interval *interval1 = PG_GETARG_INTERVAL_P(0);
+ Interval *interval2 = PG_GETARG_INTERVAL_P(1);
+ Interval *result;
+
+ if (interval_cmp_internal(interval1, interval2) > 0)
+ result = interval1;
+ else
+ result = interval2;
+ PG_RETURN_INTERVAL_P(result);
+}
+
+Datum
+interval_pl(PG_FUNCTION_ARGS)
+{
+ Interval *span1 = PG_GETARG_INTERVAL_P(0);
+ Interval *span2 = PG_GETARG_INTERVAL_P(1);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result->month = span1->month + span2->month;
+ /* overflow check copied from int4pl */
+ if (SAMESIGN(span1->month, span2->month) &&
+ !SAMESIGN(result->month, span1->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ result->day = span1->day + span2->day;
+ if (SAMESIGN(span1->day, span2->day) &&
+ !SAMESIGN(result->day, span1->day))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ result->time = span1->time + span2->time;
+ if (SAMESIGN(span1->time, span2->time) &&
+ !SAMESIGN(result->time, span1->time))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+Datum
+interval_mi(PG_FUNCTION_ARGS)
+{
+ Interval *span1 = PG_GETARG_INTERVAL_P(0);
+ Interval *span2 = PG_GETARG_INTERVAL_P(1);
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result->month = span1->month - span2->month;
+ /* overflow check copied from int4mi */
+ if (!SAMESIGN(span1->month, span2->month) &&
+ !SAMESIGN(result->month, span1->month))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ result->day = span1->day - span2->day;
+ if (!SAMESIGN(span1->day, span2->day) &&
+ !SAMESIGN(result->day, span1->day))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ result->time = span1->time - span2->time;
+ if (!SAMESIGN(span1->time, span2->time) &&
+ !SAMESIGN(result->time, span1->time))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/*
+ * There is no interval_abs(): it is unclear what value to return:
+ * http://archives.postgresql.org/pgsql-general/2009-10/msg01031.php
+ * http://archives.postgresql.org/pgsql-general/2009-11/msg00041.php
+ */
+
+Datum
+interval_mul(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ float8 factor = PG_GETARG_FLOAT8(1);
+ double month_remainder_days,
+ sec_remainder,
+ result_double;
+ int32 orig_month = span->month,
+ orig_day = span->day;
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ result_double = span->month * factor;
+ if (isnan(result_double) ||
+ result_double > INT_MAX || result_double < INT_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ result->month = (int32) result_double;
+
+ result_double = span->day * factor;
+ if (isnan(result_double) ||
+ result_double > INT_MAX || result_double < INT_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ result->day = (int32) result_double;
+
+ /*
+ * The above correctly handles the whole-number part of the month and day
+ * products, but we have to do something with any fractional part
+ * resulting when the factor is non-integral. We cascade the fractions
+ * down to lower units using the conversion factors DAYS_PER_MONTH and
+ * SECS_PER_DAY. Note we do NOT cascade up, since we are not forced to do
+ * so by the representation. The user can choose to cascade up later,
+ * using justify_hours and/or justify_days.
+ */
+
+ /*
+ * Fractional months full days into days.
+ *
+ * Floating point calculation are inherently imprecise, so these
+ * calculations are crafted to produce the most reliable result possible.
+ * TSROUND() is needed to more accurately produce whole numbers where
+ * appropriate.
+ */
+ month_remainder_days = (orig_month * factor - result->month) * DAYS_PER_MONTH;
+ month_remainder_days = TSROUND(month_remainder_days);
+ sec_remainder = (orig_day * factor - result->day +
+ month_remainder_days - (int) month_remainder_days) * SECS_PER_DAY;
+ sec_remainder = TSROUND(sec_remainder);
+
+ /*
+ * Might have 24:00:00 hours due to rounding, or >24 hours because of time
+ * cascade from months and days. It might still be >24 if the combination
+ * of cascade and the seconds factor operation itself.
+ */
+ if (Abs(sec_remainder) >= SECS_PER_DAY)
+ {
+ result->day += (int) (sec_remainder / SECS_PER_DAY);
+ sec_remainder -= (int) (sec_remainder / SECS_PER_DAY) * SECS_PER_DAY;
+ }
+
+ /* cascade units down */
+ result->day += (int32) month_remainder_days;
+ result_double = rint(span->time * factor + sec_remainder * USECS_PER_SEC);
+ if (isnan(result_double) || !FLOAT8_FITS_IN_INT64(result_double))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ result->time = (int64) result_double;
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+Datum
+mul_d_interval(PG_FUNCTION_ARGS)
+{
+ /* Args are float8 and Interval *, but leave them as generic Datum */
+ Datum factor = PG_GETARG_DATUM(0);
+ Datum span = PG_GETARG_DATUM(1);
+
+ return DirectFunctionCall2(interval_mul, span, factor);
+}
+
+Datum
+interval_div(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ float8 factor = PG_GETARG_FLOAT8(1);
+ double month_remainder_days,
+ sec_remainder;
+ int32 orig_month = span->month,
+ orig_day = span->day;
+ Interval *result;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ if (factor == 0.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DIVISION_BY_ZERO),
+ errmsg("division by zero")));
+
+ result->month = (int32) (span->month / factor);
+ result->day = (int32) (span->day / factor);
+
+ /*
+ * Fractional months full days into days. See comment in interval_mul().
+ */
+ month_remainder_days = (orig_month / factor - result->month) * DAYS_PER_MONTH;
+ month_remainder_days = TSROUND(month_remainder_days);
+ sec_remainder = (orig_day / factor - result->day +
+ month_remainder_days - (int) month_remainder_days) * SECS_PER_DAY;
+ sec_remainder = TSROUND(sec_remainder);
+ if (Abs(sec_remainder) >= SECS_PER_DAY)
+ {
+ result->day += (int) (sec_remainder / SECS_PER_DAY);
+ sec_remainder -= (int) (sec_remainder / SECS_PER_DAY) * SECS_PER_DAY;
+ }
+
+ /* cascade units down */
+ result->day += (int32) month_remainder_days;
+ result->time = rint(span->time / factor + sec_remainder * USECS_PER_SEC);
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+
+/*
+ * in_range support functions for timestamps and intervals.
+ *
+ * Per SQL spec, we support these with interval as the offset type.
+ * The spec's restriction that the offset not be negative is a bit hard to
+ * decipher for intervals, but we choose to interpret it the same as our
+ * interval comparison operators would.
+ */
+
+Datum
+in_range_timestamptz_interval(PG_FUNCTION_ARGS)
+{
+ TimestampTz val = PG_GETARG_TIMESTAMPTZ(0);
+ TimestampTz base = PG_GETARG_TIMESTAMPTZ(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ TimestampTz sum;
+
+ if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /* We don't currently bother to avoid overflow hazards here */
+ if (sub)
+ sum = DatumGetTimestampTz(DirectFunctionCall2(timestamptz_mi_interval,
+ TimestampTzGetDatum(base),
+ IntervalPGetDatum(offset)));
+ else
+ sum = DatumGetTimestampTz(DirectFunctionCall2(timestamptz_pl_interval,
+ TimestampTzGetDatum(base),
+ IntervalPGetDatum(offset)));
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+Datum
+in_range_timestamp_interval(PG_FUNCTION_ARGS)
+{
+ Timestamp val = PG_GETARG_TIMESTAMP(0);
+ Timestamp base = PG_GETARG_TIMESTAMP(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ Timestamp sum;
+
+ if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /* We don't currently bother to avoid overflow hazards here */
+ if (sub)
+ sum = DatumGetTimestamp(DirectFunctionCall2(timestamp_mi_interval,
+ TimestampGetDatum(base),
+ IntervalPGetDatum(offset)));
+ else
+ sum = DatumGetTimestamp(DirectFunctionCall2(timestamp_pl_interval,
+ TimestampGetDatum(base),
+ IntervalPGetDatum(offset)));
+
+ if (less)
+ PG_RETURN_BOOL(val <= sum);
+ else
+ PG_RETURN_BOOL(val >= sum);
+}
+
+Datum
+in_range_interval_interval(PG_FUNCTION_ARGS)
+{
+ Interval *val = PG_GETARG_INTERVAL_P(0);
+ Interval *base = PG_GETARG_INTERVAL_P(1);
+ Interval *offset = PG_GETARG_INTERVAL_P(2);
+ bool sub = PG_GETARG_BOOL(3);
+ bool less = PG_GETARG_BOOL(4);
+ Interval *sum;
+
+ if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+ errmsg("invalid preceding or following size in window function")));
+
+ /* We don't currently bother to avoid overflow hazards here */
+ if (sub)
+ sum = DatumGetIntervalP(DirectFunctionCall2(interval_mi,
+ IntervalPGetDatum(base),
+ IntervalPGetDatum(offset)));
+ else
+ sum = DatumGetIntervalP(DirectFunctionCall2(interval_pl,
+ IntervalPGetDatum(base),
+ IntervalPGetDatum(offset)));
+
+ if (less)
+ PG_RETURN_BOOL(interval_cmp_internal(val, sum) <= 0);
+ else
+ PG_RETURN_BOOL(interval_cmp_internal(val, sum) >= 0);
+}
+
+
+/*
+ * interval_accum, interval_accum_inv, and interval_avg implement the
+ * AVG(interval) aggregate.
+ *
+ * The transition datatype for this aggregate is a 2-element array of
+ * intervals, where the first is the running sum and the second contains
+ * the number of values so far in its 'time' field. This is a bit ugly
+ * but it beats inventing a specialized datatype for the purpose.
+ */
+
+Datum
+interval_accum(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ Interval *newval = PG_GETARG_INTERVAL_P(1);
+ Datum *transdatums;
+ int ndatums;
+ Interval sumX,
+ N;
+ Interval *newsum;
+ ArrayType *result;
+
+ deconstruct_array(transarray,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE,
+ &transdatums, NULL, &ndatums);
+ if (ndatums != 2)
+ elog(ERROR, "expected 2-element interval array");
+
+ sumX = *(DatumGetIntervalP(transdatums[0]));
+ N = *(DatumGetIntervalP(transdatums[1]));
+
+ newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl,
+ IntervalPGetDatum(&sumX),
+ IntervalPGetDatum(newval)));
+ N.time += 1;
+
+ transdatums[0] = IntervalPGetDatum(newsum);
+ transdatums[1] = IntervalPGetDatum(&N);
+
+ result = construct_array(transdatums, 2,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+Datum
+interval_combine(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1);
+ Datum *transdatums1;
+ Datum *transdatums2;
+ int ndatums1;
+ int ndatums2;
+ Interval sum1,
+ N1;
+ Interval sum2,
+ N2;
+
+ Interval *newsum;
+ ArrayType *result;
+
+ deconstruct_array(transarray1,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE,
+ &transdatums1, NULL, &ndatums1);
+ if (ndatums1 != 2)
+ elog(ERROR, "expected 2-element interval array");
+
+ sum1 = *(DatumGetIntervalP(transdatums1[0]));
+ N1 = *(DatumGetIntervalP(transdatums1[1]));
+
+ deconstruct_array(transarray2,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE,
+ &transdatums2, NULL, &ndatums2);
+ if (ndatums2 != 2)
+ elog(ERROR, "expected 2-element interval array");
+
+ sum2 = *(DatumGetIntervalP(transdatums2[0]));
+ N2 = *(DatumGetIntervalP(transdatums2[1]));
+
+ newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl,
+ IntervalPGetDatum(&sum1),
+ IntervalPGetDatum(&sum2)));
+ N1.time += N2.time;
+
+ transdatums1[0] = IntervalPGetDatum(newsum);
+ transdatums1[1] = IntervalPGetDatum(&N1);
+
+ result = construct_array(transdatums1, 2,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+Datum
+interval_accum_inv(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ Interval *newval = PG_GETARG_INTERVAL_P(1);
+ Datum *transdatums;
+ int ndatums;
+ Interval sumX,
+ N;
+ Interval *newsum;
+ ArrayType *result;
+
+ deconstruct_array(transarray,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE,
+ &transdatums, NULL, &ndatums);
+ if (ndatums != 2)
+ elog(ERROR, "expected 2-element interval array");
+
+ sumX = *(DatumGetIntervalP(transdatums[0]));
+ N = *(DatumGetIntervalP(transdatums[1]));
+
+ newsum = DatumGetIntervalP(DirectFunctionCall2(interval_mi,
+ IntervalPGetDatum(&sumX),
+ IntervalPGetDatum(newval)));
+ N.time -= 1;
+
+ transdatums[0] = IntervalPGetDatum(newsum);
+ transdatums[1] = IntervalPGetDatum(&N);
+
+ result = construct_array(transdatums, 2,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE);
+
+ PG_RETURN_ARRAYTYPE_P(result);
+}
+
+Datum
+interval_avg(PG_FUNCTION_ARGS)
+{
+ ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0);
+ Datum *transdatums;
+ int ndatums;
+ Interval sumX,
+ N;
+
+ deconstruct_array(transarray,
+ INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE,
+ &transdatums, NULL, &ndatums);
+ if (ndatums != 2)
+ elog(ERROR, "expected 2-element interval array");
+
+ sumX = *(DatumGetIntervalP(transdatums[0]));
+ N = *(DatumGetIntervalP(transdatums[1]));
+
+ /* SQL defines AVG of no values to be NULL */
+ if (N.time == 0)
+ PG_RETURN_NULL();
+
+ return DirectFunctionCall2(interval_div,
+ IntervalPGetDatum(&sumX),
+ Float8GetDatum((double) N.time));
+}
+
+
+/* timestamp_age()
+ * Calculate time difference while retaining year/month fields.
+ * Note that this does not result in an accurate absolute time span
+ * since year and month are out of context once the arithmetic
+ * is done.
+ */
+Datum
+timestamp_age(PG_FUNCTION_ARGS)
+{
+ Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
+ Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
+ Interval *result;
+ fsec_t fsec1,
+ fsec2;
+ struct pg_itm tt,
+ *tm = &tt;
+ struct pg_tm tt1,
+ *tm1 = &tt1;
+ struct pg_tm tt2,
+ *tm2 = &tt2;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ if (timestamp2tm(dt1, NULL, tm1, &fsec1, NULL, NULL) == 0 &&
+ timestamp2tm(dt2, NULL, tm2, &fsec2, NULL, NULL) == 0)
+ {
+ /* form the symbolic difference */
+ tm->tm_usec = fsec1 - fsec2;
+ tm->tm_sec = tm1->tm_sec - tm2->tm_sec;
+ tm->tm_min = tm1->tm_min - tm2->tm_min;
+ tm->tm_hour = tm1->tm_hour - tm2->tm_hour;
+ tm->tm_mday = tm1->tm_mday - tm2->tm_mday;
+ tm->tm_mon = tm1->tm_mon - tm2->tm_mon;
+ tm->tm_year = tm1->tm_year - tm2->tm_year;
+
+ /* flip sign if necessary... */
+ if (dt1 < dt2)
+ {
+ tm->tm_usec = -tm->tm_usec;
+ tm->tm_sec = -tm->tm_sec;
+ tm->tm_min = -tm->tm_min;
+ tm->tm_hour = -tm->tm_hour;
+ tm->tm_mday = -tm->tm_mday;
+ tm->tm_mon = -tm->tm_mon;
+ tm->tm_year = -tm->tm_year;
+ }
+
+ /* propagate any negative fields into the next higher field */
+ while (tm->tm_usec < 0)
+ {
+ tm->tm_usec += USECS_PER_SEC;
+ tm->tm_sec--;
+ }
+
+ while (tm->tm_sec < 0)
+ {
+ tm->tm_sec += SECS_PER_MINUTE;
+ tm->tm_min--;
+ }
+
+ while (tm->tm_min < 0)
+ {
+ tm->tm_min += MINS_PER_HOUR;
+ tm->tm_hour--;
+ }
+
+ while (tm->tm_hour < 0)
+ {
+ tm->tm_hour += HOURS_PER_DAY;
+ tm->tm_mday--;
+ }
+
+ while (tm->tm_mday < 0)
+ {
+ if (dt1 < dt2)
+ {
+ tm->tm_mday += day_tab[isleap(tm1->tm_year)][tm1->tm_mon - 1];
+ tm->tm_mon--;
+ }
+ else
+ {
+ tm->tm_mday += day_tab[isleap(tm2->tm_year)][tm2->tm_mon - 1];
+ tm->tm_mon--;
+ }
+ }
+
+ while (tm->tm_mon < 0)
+ {
+ tm->tm_mon += MONTHS_PER_YEAR;
+ tm->tm_year--;
+ }
+
+ /* recover sign if necessary... */
+ if (dt1 < dt2)
+ {
+ tm->tm_usec = -tm->tm_usec;
+ tm->tm_sec = -tm->tm_sec;
+ tm->tm_min = -tm->tm_min;
+ tm->tm_hour = -tm->tm_hour;
+ tm->tm_mday = -tm->tm_mday;
+ tm->tm_mon = -tm->tm_mon;
+ tm->tm_year = -tm->tm_year;
+ }
+
+ if (itm2interval(tm, result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+
+/* timestamptz_age()
+ * Calculate time difference while retaining year/month fields.
+ * Note that this does not result in an accurate absolute time span
+ * since year and month are out of context once the arithmetic
+ * is done.
+ */
+Datum
+timestamptz_age(PG_FUNCTION_ARGS)
+{
+ TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
+ TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
+ Interval *result;
+ fsec_t fsec1,
+ fsec2;
+ struct pg_itm tt,
+ *tm = &tt;
+ struct pg_tm tt1,
+ *tm1 = &tt1;
+ struct pg_tm tt2,
+ *tm2 = &tt2;
+ int tz1;
+ int tz2;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ if (timestamp2tm(dt1, &tz1, tm1, &fsec1, NULL, NULL) == 0 &&
+ timestamp2tm(dt2, &tz2, tm2, &fsec2, NULL, NULL) == 0)
+ {
+ /* form the symbolic difference */
+ tm->tm_usec = fsec1 - fsec2;
+ tm->tm_sec = tm1->tm_sec - tm2->tm_sec;
+ tm->tm_min = tm1->tm_min - tm2->tm_min;
+ tm->tm_hour = tm1->tm_hour - tm2->tm_hour;
+ tm->tm_mday = tm1->tm_mday - tm2->tm_mday;
+ tm->tm_mon = tm1->tm_mon - tm2->tm_mon;
+ tm->tm_year = tm1->tm_year - tm2->tm_year;
+
+ /* flip sign if necessary... */
+ if (dt1 < dt2)
+ {
+ tm->tm_usec = -tm->tm_usec;
+ tm->tm_sec = -tm->tm_sec;
+ tm->tm_min = -tm->tm_min;
+ tm->tm_hour = -tm->tm_hour;
+ tm->tm_mday = -tm->tm_mday;
+ tm->tm_mon = -tm->tm_mon;
+ tm->tm_year = -tm->tm_year;
+ }
+
+ /* propagate any negative fields into the next higher field */
+ while (tm->tm_usec < 0)
+ {
+ tm->tm_usec += USECS_PER_SEC;
+ tm->tm_sec--;
+ }
+
+ while (tm->tm_sec < 0)
+ {
+ tm->tm_sec += SECS_PER_MINUTE;
+ tm->tm_min--;
+ }
+
+ while (tm->tm_min < 0)
+ {
+ tm->tm_min += MINS_PER_HOUR;
+ tm->tm_hour--;
+ }
+
+ while (tm->tm_hour < 0)
+ {
+ tm->tm_hour += HOURS_PER_DAY;
+ tm->tm_mday--;
+ }
+
+ while (tm->tm_mday < 0)
+ {
+ if (dt1 < dt2)
+ {
+ tm->tm_mday += day_tab[isleap(tm1->tm_year)][tm1->tm_mon - 1];
+ tm->tm_mon--;
+ }
+ else
+ {
+ tm->tm_mday += day_tab[isleap(tm2->tm_year)][tm2->tm_mon - 1];
+ tm->tm_mon--;
+ }
+ }
+
+ while (tm->tm_mon < 0)
+ {
+ tm->tm_mon += MONTHS_PER_YEAR;
+ tm->tm_year--;
+ }
+
+ /*
+ * Note: we deliberately ignore any difference between tz1 and tz2.
+ */
+
+ /* recover sign if necessary... */
+ if (dt1 < dt2)
+ {
+ tm->tm_usec = -tm->tm_usec;
+ tm->tm_sec = -tm->tm_sec;
+ tm->tm_min = -tm->tm_min;
+ tm->tm_hour = -tm->tm_hour;
+ tm->tm_mday = -tm->tm_mday;
+ tm->tm_mon = -tm->tm_mon;
+ tm->tm_year = -tm->tm_year;
+ }
+
+ if (itm2interval(tm, result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+
+/*----------------------------------------------------------
+ * Conversion operators.
+ *---------------------------------------------------------*/
+
+
+/* timestamp_bin()
+ * Bin timestamp into specified interval.
+ */
+Datum
+timestamp_bin(PG_FUNCTION_ARGS)
+{
+ Interval *stride = PG_GETARG_INTERVAL_P(0);
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
+ Timestamp origin = PG_GETARG_TIMESTAMP(2);
+ Timestamp result,
+ tm_diff,
+ stride_usecs,
+ tm_delta;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMP(timestamp);
+
+ if (TIMESTAMP_NOT_FINITE(origin))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("origin out of range")));
+
+ if (stride->month != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("timestamps cannot be binned into intervals containing months or years")));
+
+ stride_usecs = stride->day * USECS_PER_DAY + stride->time;
+
+ if (stride_usecs <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("stride must be greater than zero")));
+
+ tm_diff = timestamp - origin;
+ tm_delta = tm_diff - tm_diff % stride_usecs;
+
+ /*
+ * Make sure the returned timestamp is at the start of the bin, even if
+ * the origin is in the future.
+ */
+ if (origin > timestamp && stride_usecs > 1)
+ tm_delta -= stride_usecs;
+
+ result = origin + tm_delta;
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamp_trunc()
+ * Truncate timestamp to specified units.
+ */
+Datum
+timestamp_trunc(PG_FUNCTION_ARGS)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
+ Timestamp result;
+ int type,
+ val;
+ char *lowunits;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMP(timestamp);
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ switch (val)
+ {
+ case DTK_WEEK:
+ {
+ int woy;
+
+ woy = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday);
+
+ /*
+ * If it is week 52/53 and the month is January, then the
+ * week must belong to the previous year. Also, some
+ * December dates belong to the next year.
+ */
+ if (woy >= 52 && tm->tm_mon == 1)
+ --tm->tm_year;
+ if (woy <= 1 && tm->tm_mon == MONTHS_PER_YEAR)
+ ++tm->tm_year;
+ isoweek2date(woy, &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ fsec = 0;
+ break;
+ }
+ case DTK_MILLENNIUM:
+ /* see comments in timestamptz_trunc */
+ if (tm->tm_year > 0)
+ tm->tm_year = ((tm->tm_year + 999) / 1000) * 1000 - 999;
+ else
+ tm->tm_year = -((999 - (tm->tm_year - 1)) / 1000) * 1000 + 1;
+ /* FALL THRU */
+ case DTK_CENTURY:
+ /* see comments in timestamptz_trunc */
+ if (tm->tm_year > 0)
+ tm->tm_year = ((tm->tm_year + 99) / 100) * 100 - 99;
+ else
+ tm->tm_year = -((99 - (tm->tm_year - 1)) / 100) * 100 + 1;
+ /* FALL THRU */
+ case DTK_DECADE:
+ /* see comments in timestamptz_trunc */
+ if (val != DTK_MILLENNIUM && val != DTK_CENTURY)
+ {
+ if (tm->tm_year > 0)
+ tm->tm_year = (tm->tm_year / 10) * 10;
+ else
+ tm->tm_year = -((8 - (tm->tm_year - 1)) / 10) * 10;
+ }
+ /* FALL THRU */
+ case DTK_YEAR:
+ tm->tm_mon = 1;
+ /* FALL THRU */
+ case DTK_QUARTER:
+ tm->tm_mon = (3 * ((tm->tm_mon - 1) / 3)) + 1;
+ /* FALL THRU */
+ case DTK_MONTH:
+ tm->tm_mday = 1;
+ /* FALL THRU */
+ case DTK_DAY:
+ tm->tm_hour = 0;
+ /* FALL THRU */
+ case DTK_HOUR:
+ tm->tm_min = 0;
+ /* FALL THRU */
+ case DTK_MINUTE:
+ tm->tm_sec = 0;
+ /* FALL THRU */
+ case DTK_SECOND:
+ fsec = 0;
+ break;
+
+ case DTK_MILLISEC:
+ fsec = (fsec / 1000) * 1000;
+ break;
+
+ case DTK_MICROSEC:
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPOID))));
+ result = 0;
+ }
+
+ if (tm2timestamp(tm, fsec, NULL, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMESTAMPOID))));
+ result = 0;
+ }
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamptz_bin()
+ * Bin timestamptz into specified interval using specified origin.
+ */
+Datum
+timestamptz_bin(PG_FUNCTION_ARGS)
+{
+ Interval *stride = PG_GETARG_INTERVAL_P(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ TimestampTz origin = PG_GETARG_TIMESTAMPTZ(2);
+ TimestampTz result,
+ stride_usecs,
+ tm_diff,
+ tm_delta;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMPTZ(timestamp);
+
+ if (TIMESTAMP_NOT_FINITE(origin))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("origin out of range")));
+
+ if (stride->month != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("timestamps cannot be binned into intervals containing months or years")));
+
+ stride_usecs = stride->day * USECS_PER_DAY + stride->time;
+
+ if (stride_usecs <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("stride must be greater than zero")));
+
+ tm_diff = timestamp - origin;
+ tm_delta = tm_diff - tm_diff % stride_usecs;
+
+ /*
+ * Make sure the returned timestamp is at the start of the bin, even if
+ * the origin is in the future.
+ */
+ if (origin > timestamp && stride_usecs > 1)
+ tm_delta -= stride_usecs;
+
+ result = origin + tm_delta;
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/*
+ * Common code for timestamptz_trunc() and timestamptz_trunc_zone().
+ *
+ * tzp identifies the zone to truncate with respect to. We assume
+ * infinite timestamps have already been rejected.
+ */
+static TimestampTz
+timestamptz_trunc_internal(text *units, TimestampTz timestamp, pg_tz *tzp)
+{
+ TimestampTz result;
+ int tz;
+ int type,
+ val;
+ bool redotz = false;
+ char *lowunits;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ switch (val)
+ {
+ case DTK_WEEK:
+ {
+ int woy;
+
+ woy = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday);
+
+ /*
+ * If it is week 52/53 and the month is January, then the
+ * week must belong to the previous year. Also, some
+ * December dates belong to the next year.
+ */
+ if (woy >= 52 && tm->tm_mon == 1)
+ --tm->tm_year;
+ if (woy <= 1 && tm->tm_mon == MONTHS_PER_YEAR)
+ ++tm->tm_year;
+ isoweek2date(woy, &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday));
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ fsec = 0;
+ redotz = true;
+ break;
+ }
+ /* one may consider DTK_THOUSAND and DTK_HUNDRED... */
+ case DTK_MILLENNIUM:
+
+ /*
+ * truncating to the millennium? what is this supposed to
+ * mean? let us put the first year of the millennium... i.e.
+ * -1000, 1, 1001, 2001...
+ */
+ if (tm->tm_year > 0)
+ tm->tm_year = ((tm->tm_year + 999) / 1000) * 1000 - 999;
+ else
+ tm->tm_year = -((999 - (tm->tm_year - 1)) / 1000) * 1000 + 1;
+ /* FALL THRU */
+ case DTK_CENTURY:
+ /* truncating to the century? as above: -100, 1, 101... */
+ if (tm->tm_year > 0)
+ tm->tm_year = ((tm->tm_year + 99) / 100) * 100 - 99;
+ else
+ tm->tm_year = -((99 - (tm->tm_year - 1)) / 100) * 100 + 1;
+ /* FALL THRU */
+ case DTK_DECADE:
+
+ /*
+ * truncating to the decade? first year of the decade. must
+ * not be applied if year was truncated before!
+ */
+ if (val != DTK_MILLENNIUM && val != DTK_CENTURY)
+ {
+ if (tm->tm_year > 0)
+ tm->tm_year = (tm->tm_year / 10) * 10;
+ else
+ tm->tm_year = -((8 - (tm->tm_year - 1)) / 10) * 10;
+ }
+ /* FALL THRU */
+ case DTK_YEAR:
+ tm->tm_mon = 1;
+ /* FALL THRU */
+ case DTK_QUARTER:
+ tm->tm_mon = (3 * ((tm->tm_mon - 1) / 3)) + 1;
+ /* FALL THRU */
+ case DTK_MONTH:
+ tm->tm_mday = 1;
+ /* FALL THRU */
+ case DTK_DAY:
+ tm->tm_hour = 0;
+ redotz = true; /* for all cases >= DAY */
+ /* FALL THRU */
+ case DTK_HOUR:
+ tm->tm_min = 0;
+ /* FALL THRU */
+ case DTK_MINUTE:
+ tm->tm_sec = 0;
+ /* FALL THRU */
+ case DTK_SECOND:
+ fsec = 0;
+ break;
+ case DTK_MILLISEC:
+ fsec = (fsec / 1000) * 1000;
+ break;
+ case DTK_MICROSEC:
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPTZOID))));
+ result = 0;
+ }
+
+ if (redotz)
+ tz = DetermineTimeZoneOffset(tm, tzp);
+
+ if (tm2timestamp(tm, fsec, &tz, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMESTAMPTZOID))));
+ result = 0;
+ }
+
+ return result;
+}
+
+/* timestamptz_trunc()
+ * Truncate timestamptz to specified units in session timezone.
+ */
+Datum
+timestamptz_trunc(PG_FUNCTION_ARGS)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ TimestampTz result;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMPTZ(timestamp);
+
+ result = timestamptz_trunc_internal(units, timestamp, session_timezone);
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/* timestamptz_trunc_zone()
+ * Truncate timestamptz to specified units in specified timezone.
+ */
+Datum
+timestamptz_trunc_zone(PG_FUNCTION_ARGS)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ text *zone = PG_GETARG_TEXT_PP(2);
+ TimestampTz result;
+ char tzname[TZ_STRLEN_MAX + 1];
+ char *lowzone;
+ int type,
+ val;
+ pg_tz *tzp;
+
+ /*
+ * timestamptz_zone() doesn't look up the zone for infinite inputs, so we
+ * don't do so here either.
+ */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMP(timestamp);
+
+ /*
+ * Look up the requested timezone (see notes in timestamptz_zone()).
+ */
+ text_to_cstring_buffer(zone, tzname, sizeof(tzname));
+
+ /* DecodeTimezoneAbbrev requires lowercase input */
+ lowzone = downcase_truncate_identifier(tzname,
+ strlen(tzname),
+ false);
+
+ type = DecodeTimezoneAbbrev(0, lowzone, &val, &tzp);
+
+ if (type == TZ || type == DTZ)
+ {
+ /* fixed-offset abbreviation, get a pg_tz descriptor for that */
+ tzp = pg_tzset_offset(-val);
+ }
+ else if (type == DYNTZ)
+ {
+ /* dynamic-offset abbreviation, use its referenced timezone */
+ }
+ else
+ {
+ /* try it as a full zone name */
+ tzp = pg_tzset(tzname);
+ if (!tzp)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+ }
+
+ result = timestamptz_trunc_internal(units, timestamp, tzp);
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/* interval_trunc()
+ * Extract specified field from interval.
+ */
+Datum
+interval_trunc(PG_FUNCTION_ARGS)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ Interval *interval = PG_GETARG_INTERVAL_P(1);
+ Interval *result;
+ int type,
+ val;
+ char *lowunits;
+ struct pg_itm tt,
+ *tm = &tt;
+
+ result = (Interval *) palloc(sizeof(Interval));
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ interval2itm(*interval, tm);
+ switch (val)
+ {
+ case DTK_MILLENNIUM:
+ /* caution: C division may have negative remainder */
+ tm->tm_year = (tm->tm_year / 1000) * 1000;
+ /* FALL THRU */
+ case DTK_CENTURY:
+ /* caution: C division may have negative remainder */
+ tm->tm_year = (tm->tm_year / 100) * 100;
+ /* FALL THRU */
+ case DTK_DECADE:
+ /* caution: C division may have negative remainder */
+ tm->tm_year = (tm->tm_year / 10) * 10;
+ /* FALL THRU */
+ case DTK_YEAR:
+ tm->tm_mon = 0;
+ /* FALL THRU */
+ case DTK_QUARTER:
+ tm->tm_mon = 3 * (tm->tm_mon / 3);
+ /* FALL THRU */
+ case DTK_MONTH:
+ tm->tm_mday = 0;
+ /* FALL THRU */
+ case DTK_DAY:
+ tm->tm_hour = 0;
+ /* FALL THRU */
+ case DTK_HOUR:
+ tm->tm_min = 0;
+ /* FALL THRU */
+ case DTK_MINUTE:
+ tm->tm_sec = 0;
+ /* FALL THRU */
+ case DTK_SECOND:
+ tm->tm_usec = 0;
+ break;
+ case DTK_MILLISEC:
+ tm->tm_usec = (tm->tm_usec / 1000) * 1000;
+ break;
+ case DTK_MICROSEC:
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(INTERVALOID)),
+ (val == DTK_WEEK) ? errdetail("Months usually have fractional weeks.") : 0));
+ }
+
+ if (itm2interval(tm, result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("interval out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(INTERVALOID))));
+ }
+
+ PG_RETURN_INTERVAL_P(result);
+}
+
+/* isoweek2j()
+ *
+ * Return the Julian day which corresponds to the first day (Monday) of the given ISO 8601 year and week.
+ * Julian days are used to convert between ISO week dates and Gregorian dates.
+ */
+int
+isoweek2j(int year, int week)
+{
+ int day0,
+ day4;
+
+ /* fourth day of current year */
+ day4 = date2j(year, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ return ((week - 1) * 7) + (day4 - day0);
+}
+
+/* isoweek2date()
+ * Convert ISO week of year number to date.
+ * The year field must be specified with the ISO year!
+ * karel 2000/08/07
+ */
+void
+isoweek2date(int woy, int *year, int *mon, int *mday)
+{
+ j2date(isoweek2j(*year, woy), year, mon, mday);
+}
+
+/* isoweekdate2date()
+ *
+ * Convert an ISO 8601 week date (ISO year, ISO week) into a Gregorian date.
+ * Gregorian day of week sent so weekday strings can be supplied.
+ * Populates year, mon, and mday with the correct Gregorian values.
+ * year must be passed in as the ISO year.
+ */
+void
+isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday)
+{
+ int jday;
+
+ jday = isoweek2j(*year, isoweek);
+ /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
+ if (wday > 1)
+ jday += wday - 2;
+ else
+ jday += 6;
+ j2date(jday, year, mon, mday);
+}
+
+/* date2isoweek()
+ *
+ * Returns ISO week number of year.
+ */
+int
+date2isoweek(int year, int mon, int mday)
+{
+ float8 result;
+ int day0,
+ day4,
+ dayn;
+
+ /* current day */
+ dayn = date2j(year, mon, mday);
+
+ /* fourth day of current year */
+ day4 = date2j(year, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ /*
+ * We need the first week containing a Thursday, otherwise this day falls
+ * into the previous year for purposes of counting weeks
+ */
+ if (dayn < day4 - day0)
+ {
+ day4 = date2j(year - 1, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+ }
+
+ result = (dayn - (day4 - day0)) / 7 + 1;
+
+ /*
+ * Sometimes the last few days in a year will fall into the first week of
+ * the next year, so check for this.
+ */
+ if (result >= 52)
+ {
+ day4 = date2j(year + 1, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ if (dayn >= day4 - day0)
+ result = (dayn - (day4 - day0)) / 7 + 1;
+ }
+
+ return (int) result;
+}
+
+
+/* date2isoyear()
+ *
+ * Returns ISO 8601 year number.
+ * Note: zero or negative results follow the year-zero-exists convention.
+ */
+int
+date2isoyear(int year, int mon, int mday)
+{
+ float8 result;
+ int day0,
+ day4,
+ dayn;
+
+ /* current day */
+ dayn = date2j(year, mon, mday);
+
+ /* fourth day of current year */
+ day4 = date2j(year, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ /*
+ * We need the first week containing a Thursday, otherwise this day falls
+ * into the previous year for purposes of counting weeks
+ */
+ if (dayn < day4 - day0)
+ {
+ day4 = date2j(year - 1, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ year--;
+ }
+
+ result = (dayn - (day4 - day0)) / 7 + 1;
+
+ /*
+ * Sometimes the last few days in a year will fall into the first week of
+ * the next year, so check for this.
+ */
+ if (result >= 52)
+ {
+ day4 = date2j(year + 1, 1, 4);
+
+ /* day0 == offset to first day of week (Monday) */
+ day0 = j2day(day4 - 1);
+
+ if (dayn >= day4 - day0)
+ year++;
+ }
+
+ return year;
+}
+
+
+/* date2isoyearday()
+ *
+ * Returns the ISO 8601 day-of-year, given a Gregorian year, month and day.
+ * Possible return values are 1 through 371 (364 in non-leap years).
+ */
+int
+date2isoyearday(int year, int mon, int mday)
+{
+ return date2j(year, mon, mday) - isoweek2j(date2isoyear(year, mon, mday), 1) + 1;
+}
+
+/*
+ * NonFiniteTimestampTzPart
+ *
+ * Used by timestamp_part and timestamptz_part when extracting from infinite
+ * timestamp[tz]. Returns +/-Infinity if that is the appropriate result,
+ * otherwise returns zero (which should be taken as meaning to return NULL).
+ *
+ * Errors thrown here for invalid units should exactly match those that
+ * would be thrown in the calling functions, else there will be unexpected
+ * discrepancies between finite- and infinite-input cases.
+ */
+static float8
+NonFiniteTimestampTzPart(int type, int unit, char *lowunits,
+ bool isNegative, bool isTz)
+{
+ if ((type != UNITS) && (type != RESERV))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits,
+ format_type_be(isTz ? TIMESTAMPTZOID : TIMESTAMPOID))));
+
+ switch (unit)
+ {
+ /* Oscillating units */
+ case DTK_MICROSEC:
+ case DTK_MILLISEC:
+ case DTK_SECOND:
+ case DTK_MINUTE:
+ case DTK_HOUR:
+ case DTK_DAY:
+ case DTK_MONTH:
+ case DTK_QUARTER:
+ case DTK_WEEK:
+ case DTK_DOW:
+ case DTK_ISODOW:
+ case DTK_DOY:
+ case DTK_TZ:
+ case DTK_TZ_MINUTE:
+ case DTK_TZ_HOUR:
+ return 0.0;
+
+ /* Monotonically-increasing units */
+ case DTK_YEAR:
+ case DTK_DECADE:
+ case DTK_CENTURY:
+ case DTK_MILLENNIUM:
+ case DTK_JULIAN:
+ case DTK_ISOYEAR:
+ case DTK_EPOCH:
+ if (isNegative)
+ return -get_float8_infinity();
+ else
+ return get_float8_infinity();
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits,
+ format_type_be(isTz ? TIMESTAMPTZOID : TIMESTAMPOID))));
+ return 0.0; /* keep compiler quiet */
+ }
+}
+
+/* timestamp_part() and extract_timestamp()
+ * Extract specified field from timestamp.
+ */
+static Datum
+timestamp_part_common(PG_FUNCTION_ARGS, bool retnumeric)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
+ int64 intresult;
+ Timestamp epoch;
+ int type,
+ val;
+ char *lowunits;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ {
+ double r = NonFiniteTimestampTzPart(type, val, lowunits,
+ TIMESTAMP_IS_NOBEGIN(timestamp),
+ false);
+
+ if (r)
+ {
+ if (retnumeric)
+ {
+ if (r < 0)
+ return DirectFunctionCall3(numeric_in,
+ CStringGetDatum("-Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ else if (r > 0)
+ return DirectFunctionCall3(numeric_in,
+ CStringGetDatum("Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ }
+ else
+ PG_RETURN_FLOAT8(r);
+ }
+ else
+ PG_RETURN_NULL();
+ }
+
+ if (type == UNITS)
+ {
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ switch (val)
+ {
+ case DTK_MICROSEC:
+ intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
+ break;
+
+ case DTK_MILLISEC:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec * 1000 + fsec / 1000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 3));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
+ break;
+
+ case DTK_SECOND:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec + fsec / 1'000'000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 6));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
+ break;
+
+ case DTK_MINUTE:
+ intresult = tm->tm_min;
+ break;
+
+ case DTK_HOUR:
+ intresult = tm->tm_hour;
+ break;
+
+ case DTK_DAY:
+ intresult = tm->tm_mday;
+ break;
+
+ case DTK_MONTH:
+ intresult = tm->tm_mon;
+ break;
+
+ case DTK_QUARTER:
+ intresult = (tm->tm_mon - 1) / 3 + 1;
+ break;
+
+ case DTK_WEEK:
+ intresult = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday);
+ break;
+
+ case DTK_YEAR:
+ if (tm->tm_year > 0)
+ intresult = tm->tm_year;
+ else
+ /* there is no year 0, just 1 BC and 1 AD */
+ intresult = tm->tm_year - 1;
+ break;
+
+ case DTK_DECADE:
+
+ /*
+ * what is a decade wrt dates? let us assume that decade 199
+ * is 1990 thru 1999... decade 0 starts on year 1 BC, and -1
+ * is 11 BC thru 2 BC...
+ */
+ if (tm->tm_year >= 0)
+ intresult = tm->tm_year / 10;
+ else
+ intresult = -((8 - (tm->tm_year - 1)) / 10);
+ break;
+
+ case DTK_CENTURY:
+
+ /* ----
+ * centuries AD, c>0: year in [ (c-1)* 100 + 1 : c*100 ]
+ * centuries BC, c<0: year in [ c*100 : (c+1) * 100 - 1]
+ * there is no number 0 century.
+ * ----
+ */
+ if (tm->tm_year > 0)
+ intresult = (tm->tm_year + 99) / 100;
+ else
+ /* caution: C division may have negative remainder */
+ intresult = -((99 - (tm->tm_year - 1)) / 100);
+ break;
+
+ case DTK_MILLENNIUM:
+ /* see comments above. */
+ if (tm->tm_year > 0)
+ intresult = (tm->tm_year + 999) / 1000;
+ else
+ intresult = -((999 - (tm->tm_year - 1)) / 1000);
+ break;
+
+ case DTK_JULIAN:
+ if (retnumeric)
+ PG_RETURN_NUMERIC(numeric_add_opt_error(int64_to_numeric(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)),
+ numeric_div_opt_error(int64_to_numeric(((((tm->tm_hour * MINS_PER_HOUR) + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) * INT64CONST(1000000) + fsec),
+ int64_to_numeric(SECS_PER_DAY * INT64CONST(1000000)),
+ NULL),
+ NULL));
+ else
+ PG_RETURN_FLOAT8(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) +
+ ((((tm->tm_hour * MINS_PER_HOUR) + tm->tm_min) * SECS_PER_MINUTE) +
+ tm->tm_sec + (fsec / 1000000.0)) / (double) SECS_PER_DAY);
+ break;
+
+ case DTK_ISOYEAR:
+ intresult = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday);
+ /* Adjust BC years */
+ if (intresult <= 0)
+ intresult -= 1;
+ break;
+
+ case DTK_DOW:
+ case DTK_ISODOW:
+ intresult = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
+ if (val == DTK_ISODOW && intresult == 0)
+ intresult = 7;
+ break;
+
+ case DTK_DOY:
+ intresult = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
+ - date2j(tm->tm_year, 1, 1) + 1);
+ break;
+
+ case DTK_TZ:
+ case DTK_TZ_MINUTE:
+ case DTK_TZ_HOUR:
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV)
+ {
+ switch (val)
+ {
+ case DTK_EPOCH:
+ epoch = SetEpochTimestamp();
+ /* (timestamp - epoch) / 1000000 */
+ if (retnumeric)
+ {
+ Numeric result;
+
+ if (timestamp < (PG_INT64_MAX + epoch))
+ result = int64_div_fast_to_numeric(timestamp - epoch, 6);
+ else
+ {
+ result = numeric_div_opt_error(numeric_sub_opt_error(int64_to_numeric(timestamp),
+ int64_to_numeric(epoch),
+ NULL),
+ int64_to_numeric(1000000),
+ NULL);
+ result = DatumGetNumeric(DirectFunctionCall2(numeric_round,
+ NumericGetDatum(result),
+ Int32GetDatum(6)));
+ }
+ PG_RETURN_NUMERIC(result);
+ }
+ else
+ {
+ float8 result;
+
+ /* try to avoid precision loss in subtraction */
+ if (timestamp < (PG_INT64_MAX + epoch))
+ result = (timestamp - epoch) / 1000000.0;
+ else
+ result = ((float8) timestamp - epoch) / 1000000.0;
+ PG_RETURN_FLOAT8(result);
+ }
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPOID))));
+ intresult = 0;
+ }
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMESTAMPOID))));
+ intresult = 0;
+ }
+
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+ else
+ PG_RETURN_FLOAT8(intresult);
+}
+
+Datum
+timestamp_part(PG_FUNCTION_ARGS)
+{
+ return timestamp_part_common(fcinfo, false);
+}
+
+Datum
+extract_timestamp(PG_FUNCTION_ARGS)
+{
+ return timestamp_part_common(fcinfo, true);
+}
+
+/* timestamptz_part() and extract_timestamptz()
+ * Extract specified field from timestamp with time zone.
+ */
+static Datum
+timestamptz_part_common(PG_FUNCTION_ARGS, bool retnumeric)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ int64 intresult;
+ Timestamp epoch;
+ int tz;
+ int type,
+ val;
+ char *lowunits;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ {
+ double r = NonFiniteTimestampTzPart(type, val, lowunits,
+ TIMESTAMP_IS_NOBEGIN(timestamp),
+ true);
+
+ if (r)
+ {
+ if (retnumeric)
+ {
+ if (r < 0)
+ return DirectFunctionCall3(numeric_in,
+ CStringGetDatum("-Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ else if (r > 0)
+ return DirectFunctionCall3(numeric_in,
+ CStringGetDatum("Infinity"),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1));
+ }
+ else
+ PG_RETURN_FLOAT8(r);
+ }
+ else
+ PG_RETURN_NULL();
+ }
+
+ if (type == UNITS)
+ {
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ switch (val)
+ {
+ case DTK_TZ:
+ intresult = -tz;
+ break;
+
+ case DTK_TZ_MINUTE:
+ intresult = (-tz / SECS_PER_MINUTE) % MINS_PER_HOUR;
+ break;
+
+ case DTK_TZ_HOUR:
+ intresult = -tz / SECS_PER_HOUR;
+ break;
+
+ case DTK_MICROSEC:
+ intresult = tm->tm_sec * INT64CONST(1000000) + fsec;
+ break;
+
+ case DTK_MILLISEC:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec * 1000 + fsec / 1000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 3));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + fsec / 1000.0);
+ break;
+
+ case DTK_SECOND:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec + fsec / 1'000'000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + fsec, 6));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec + fsec / 1000000.0);
+ break;
+
+ case DTK_MINUTE:
+ intresult = tm->tm_min;
+ break;
+
+ case DTK_HOUR:
+ intresult = tm->tm_hour;
+ break;
+
+ case DTK_DAY:
+ intresult = tm->tm_mday;
+ break;
+
+ case DTK_MONTH:
+ intresult = tm->tm_mon;
+ break;
+
+ case DTK_QUARTER:
+ intresult = (tm->tm_mon - 1) / 3 + 1;
+ break;
+
+ case DTK_WEEK:
+ intresult = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday);
+ break;
+
+ case DTK_YEAR:
+ if (tm->tm_year > 0)
+ intresult = tm->tm_year;
+ else
+ /* there is no year 0, just 1 BC and 1 AD */
+ intresult = tm->tm_year - 1;
+ break;
+
+ case DTK_DECADE:
+ /* see comments in timestamp_part */
+ if (tm->tm_year > 0)
+ intresult = tm->tm_year / 10;
+ else
+ intresult = -((8 - (tm->tm_year - 1)) / 10);
+ break;
+
+ case DTK_CENTURY:
+ /* see comments in timestamp_part */
+ if (tm->tm_year > 0)
+ intresult = (tm->tm_year + 99) / 100;
+ else
+ intresult = -((99 - (tm->tm_year - 1)) / 100);
+ break;
+
+ case DTK_MILLENNIUM:
+ /* see comments in timestamp_part */
+ if (tm->tm_year > 0)
+ intresult = (tm->tm_year + 999) / 1000;
+ else
+ intresult = -((999 - (tm->tm_year - 1)) / 1000);
+ break;
+
+ case DTK_JULIAN:
+ if (retnumeric)
+ PG_RETURN_NUMERIC(numeric_add_opt_error(int64_to_numeric(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)),
+ numeric_div_opt_error(int64_to_numeric(((((tm->tm_hour * MINS_PER_HOUR) + tm->tm_min) * SECS_PER_MINUTE) + tm->tm_sec) * INT64CONST(1000000) + fsec),
+ int64_to_numeric(SECS_PER_DAY * INT64CONST(1000000)),
+ NULL),
+ NULL));
+ else
+ PG_RETURN_FLOAT8(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) +
+ ((((tm->tm_hour * MINS_PER_HOUR) + tm->tm_min) * SECS_PER_MINUTE) +
+ tm->tm_sec + (fsec / 1000000.0)) / (double) SECS_PER_DAY);
+ break;
+
+ case DTK_ISOYEAR:
+ intresult = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday);
+ /* Adjust BC years */
+ if (intresult <= 0)
+ intresult -= 1;
+ break;
+
+ case DTK_DOW:
+ case DTK_ISODOW:
+ intresult = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
+ if (val == DTK_ISODOW && intresult == 0)
+ intresult = 7;
+ break;
+
+ case DTK_DOY:
+ intresult = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
+ - date2j(tm->tm_year, 1, 1) + 1);
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPTZOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV)
+ {
+ switch (val)
+ {
+ case DTK_EPOCH:
+ epoch = SetEpochTimestamp();
+ /* (timestamp - epoch) / 1000000 */
+ if (retnumeric)
+ {
+ Numeric result;
+
+ if (timestamp < (PG_INT64_MAX + epoch))
+ result = int64_div_fast_to_numeric(timestamp - epoch, 6);
+ else
+ {
+ result = numeric_div_opt_error(numeric_sub_opt_error(int64_to_numeric(timestamp),
+ int64_to_numeric(epoch),
+ NULL),
+ int64_to_numeric(1000000),
+ NULL);
+ result = DatumGetNumeric(DirectFunctionCall2(numeric_round,
+ NumericGetDatum(result),
+ Int32GetDatum(6)));
+ }
+ PG_RETURN_NUMERIC(result);
+ }
+ else
+ {
+ float8 result;
+
+ /* try to avoid precision loss in subtraction */
+ if (timestamp < (PG_INT64_MAX + epoch))
+ result = (timestamp - epoch) / 1000000.0;
+ else
+ result = ((float8) timestamp - epoch) / 1000000.0;
+ PG_RETURN_FLOAT8(result);
+ }
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(TIMESTAMPTZOID))));
+ intresult = 0;
+ }
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(TIMESTAMPTZOID))));
+
+ intresult = 0;
+ }
+
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+ else
+ PG_RETURN_FLOAT8(intresult);
+}
+
+Datum
+timestamptz_part(PG_FUNCTION_ARGS)
+{
+ return timestamptz_part_common(fcinfo, false);
+}
+
+Datum
+extract_timestamptz(PG_FUNCTION_ARGS)
+{
+ return timestamptz_part_common(fcinfo, true);
+}
+
+
+/* interval_part() and extract_interval()
+ * Extract specified field from interval.
+ */
+static Datum
+interval_part_common(PG_FUNCTION_ARGS, bool retnumeric)
+{
+ text *units = PG_GETARG_TEXT_PP(0);
+ Interval *interval = PG_GETARG_INTERVAL_P(1);
+ int64 intresult;
+ int type,
+ val;
+ char *lowunits;
+ struct pg_itm tt,
+ *tm = &tt;
+
+ lowunits = downcase_truncate_identifier(VARDATA_ANY(units),
+ VARSIZE_ANY_EXHDR(units),
+ false);
+
+ type = DecodeUnits(0, lowunits, &val);
+ if (type == UNKNOWN_FIELD)
+ type = DecodeSpecial(0, lowunits, &val);
+
+ if (type == UNITS)
+ {
+ interval2itm(*interval, tm);
+ switch (val)
+ {
+ case DTK_MICROSEC:
+ intresult = tm->tm_sec * INT64CONST(1000000) + tm->tm_usec;
+ break;
+
+ case DTK_MILLISEC:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec * 1000 + fsec / 1000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + tm->tm_usec, 3));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec * 1000.0 + tm->tm_usec / 1000.0);
+ break;
+
+ case DTK_SECOND:
+ if (retnumeric)
+ /*---
+ * tm->tm_sec + fsec / 1'000'000
+ * = (tm->tm_sec * 1'000'000 + fsec) / 1'000'000
+ */
+ PG_RETURN_NUMERIC(int64_div_fast_to_numeric(tm->tm_sec * INT64CONST(1000000) + tm->tm_usec, 6));
+ else
+ PG_RETURN_FLOAT8(tm->tm_sec + tm->tm_usec / 1000000.0);
+ break;
+
+ case DTK_MINUTE:
+ intresult = tm->tm_min;
+ break;
+
+ case DTK_HOUR:
+ intresult = tm->tm_hour;
+ break;
+
+ case DTK_DAY:
+ intresult = tm->tm_mday;
+ break;
+
+ case DTK_MONTH:
+ intresult = tm->tm_mon;
+ break;
+
+ case DTK_QUARTER:
+ intresult = (tm->tm_mon / 3) + 1;
+ break;
+
+ case DTK_YEAR:
+ intresult = tm->tm_year;
+ break;
+
+ case DTK_DECADE:
+ /* caution: C division may have negative remainder */
+ intresult = tm->tm_year / 10;
+ break;
+
+ case DTK_CENTURY:
+ /* caution: C division may have negative remainder */
+ intresult = tm->tm_year / 100;
+ break;
+
+ case DTK_MILLENNIUM:
+ /* caution: C division may have negative remainder */
+ intresult = tm->tm_year / 1000;
+ break;
+
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unit \"%s\" not supported for type %s",
+ lowunits, format_type_be(INTERVALOID))));
+ intresult = 0;
+ }
+ }
+ else if (type == RESERV && val == DTK_EPOCH)
+ {
+ if (retnumeric)
+ {
+ Numeric result;
+ int64 secs_from_day_month;
+ int64 val;
+
+ /*
+ * To do this calculation in integer arithmetic even though
+ * DAYS_PER_YEAR is fractional, multiply everything by 4 and then
+ * divide by 4 again at the end. This relies on DAYS_PER_YEAR
+ * being a multiple of 0.25 and on SECS_PER_DAY being a multiple
+ * of 4.
+ */
+ secs_from_day_month = ((int64) (4 * DAYS_PER_YEAR) * (interval->month / MONTHS_PER_YEAR) +
+ (int64) (4 * DAYS_PER_MONTH) * (interval->month % MONTHS_PER_YEAR) +
+ (int64) 4 * interval->day) * (SECS_PER_DAY / 4);
+
+ /*---
+ * result = secs_from_day_month + interval->time / 1'000'000
+ * = (secs_from_day_month * 1'000'000 + interval->time) / 1'000'000
+ */
+
+ /*
+ * Try the computation inside int64; if it overflows, do it in
+ * numeric (slower). This overflow happens around 10^9 days, so
+ * not common in practice.
+ */
+ if (!pg_mul_s64_overflow(secs_from_day_month, 1000000, &val) &&
+ !pg_add_s64_overflow(val, interval->time, &val))
+ result = int64_div_fast_to_numeric(val, 6);
+ else
+ result =
+ numeric_add_opt_error(int64_div_fast_to_numeric(interval->time, 6),
+ int64_to_numeric(secs_from_day_month),
+ NULL);
+
+ PG_RETURN_NUMERIC(result);
+ }
+ else
+ {
+ float8 result;
+
+ result = interval->time / 1000000.0;
+ result += ((double) DAYS_PER_YEAR * SECS_PER_DAY) * (interval->month / MONTHS_PER_YEAR);
+ result += ((double) DAYS_PER_MONTH * SECS_PER_DAY) * (interval->month % MONTHS_PER_YEAR);
+ result += ((double) SECS_PER_DAY) * interval->day;
+
+ PG_RETURN_FLOAT8(result);
+ }
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unit \"%s\" not recognized for type %s",
+ lowunits, format_type_be(INTERVALOID))));
+ intresult = 0;
+ }
+
+ if (retnumeric)
+ PG_RETURN_NUMERIC(int64_to_numeric(intresult));
+ else
+ PG_RETURN_FLOAT8(intresult);
+}
+
+Datum
+interval_part(PG_FUNCTION_ARGS)
+{
+ return interval_part_common(fcinfo, false);
+}
+
+Datum
+extract_interval(PG_FUNCTION_ARGS)
+{
+ return interval_part_common(fcinfo, true);
+}
+
+
+/* timestamp_zone()
+ * Encode timestamp type with specified time zone.
+ * This function is just timestamp2timestamptz() except instead of
+ * shifting to the global timezone, we shift to the specified timezone.
+ * This is different from the other AT TIME ZONE cases because instead
+ * of shifting _to_ a new time zone, it sets the time to _be_ the
+ * specified timezone.
+ */
+Datum
+timestamp_zone(PG_FUNCTION_ARGS)
+{
+ text *zone = PG_GETARG_TEXT_PP(0);
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
+ TimestampTz result;
+ int tz;
+ char tzname[TZ_STRLEN_MAX + 1];
+ char *lowzone;
+ int type,
+ val;
+ pg_tz *tzp;
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMPTZ(timestamp);
+
+ /*
+ * Look up the requested timezone. First we look in the timezone
+ * abbreviation table (to handle cases like "EST"), and if that fails, we
+ * look in the timezone database (to handle cases like
+ * "America/New_York"). (This matches the order in which timestamp input
+ * checks the cases; it's important because the timezone database unwisely
+ * uses a few zone names that are identical to offset abbreviations.)
+ */
+ text_to_cstring_buffer(zone, tzname, sizeof(tzname));
+
+ /* DecodeTimezoneAbbrev requires lowercase input */
+ lowzone = downcase_truncate_identifier(tzname,
+ strlen(tzname),
+ false);
+
+ type = DecodeTimezoneAbbrev(0, lowzone, &val, &tzp);
+
+ if (type == TZ || type == DTZ)
+ {
+ /* fixed-offset abbreviation */
+ tz = val;
+ result = dt2local(timestamp, tz);
+ }
+ else if (type == DYNTZ)
+ {
+ /* dynamic-offset abbreviation, resolve using specified time */
+ if (timestamp2tm(timestamp, NULL, &tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ tz = -DetermineTimeZoneAbbrevOffset(&tm, tzname, tzp);
+ result = dt2local(timestamp, tz);
+ }
+ else
+ {
+ /* try it as a full zone name */
+ tzp = pg_tzset(tzname);
+ if (tzp)
+ {
+ /* Apply the timezone change */
+ if (timestamp2tm(timestamp, NULL, &tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ tz = DetermineTimeZoneOffset(&tm, tzp);
+ if (tm2timestamp(&tm, fsec, &tz, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+ result = 0; /* keep compiler quiet */
+ }
+ }
+
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_TIMESTAMPTZ(result);
+}
+
+/* timestamp_izone()
+ * Encode timestamp type with specified time interval as time zone.
+ */
+Datum
+timestamp_izone(PG_FUNCTION_ARGS)
+{
+ Interval *zone = PG_GETARG_INTERVAL_P(0);
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
+ TimestampTz result;
+ int tz;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMPTZ(timestamp);
+
+ if (zone->month != 0 || zone->day != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("interval time zone \"%s\" must not include months or days",
+ DatumGetCString(DirectFunctionCall1(interval_out,
+ PointerGetDatum(zone))))));
+
+ tz = zone->time / USECS_PER_SEC;
+
+ result = dt2local(timestamp, tz);
+
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_TIMESTAMPTZ(result);
+} /* timestamp_izone() */
+
+/* TimestampTimestampTzRequiresRewrite()
+ *
+ * Returns false if the TimeZone GUC setting causes timestamp_timestamptz and
+ * timestamptz_timestamp to be no-ops, where the return value has the same
+ * bits as the argument. Since project convention is to assume a GUC changes
+ * no more often than STABLE functions change, the answer is valid that long.
+ */
+bool
+TimestampTimestampTzRequiresRewrite(void)
+{
+ long offset;
+
+ if (pg_get_timezone_offset(session_timezone, &offset) && offset == 0)
+ return false;
+ return true;
+}
+
+/* timestamp_timestamptz()
+ * Convert local timestamp to timestamp at GMT
+ */
+Datum
+timestamp_timestamptz(PG_FUNCTION_ARGS)
+{
+ Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
+
+ PG_RETURN_TIMESTAMPTZ(timestamp2timestamptz(timestamp));
+}
+
+/*
+ * Convert timestamp to timestamp with time zone.
+ *
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the timestamp is finite but out of the valid range for timestamptz, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamptz infinity.
+ */
+TimestampTz
+timestamp2timestamptz_opt_overflow(Timestamp timestamp, int *overflow)
+{
+ TimestampTz result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ if (overflow)
+ *overflow = 0;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ return timestamp;
+
+ /* We don't expect this to fail, but check it pro forma */
+ if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
+ {
+ tz = DetermineTimeZoneOffset(tm, session_timezone);
+
+ result = dt2local(timestamp, -tz);
+
+ if (IS_VALID_TIMESTAMP(result))
+ {
+ return result;
+ }
+ else if (overflow)
+ {
+ if (result < MIN_TIMESTAMP)
+ {
+ *overflow = -1;
+ TIMESTAMP_NOBEGIN(result);
+ }
+ else
+ {
+ *overflow = 1;
+ TIMESTAMP_NOEND(result);
+ }
+ return result;
+ }
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ return 0;
+}
+
+/*
+ * Promote timestamp to timestamptz, throwing error for overflow.
+ */
+static TimestampTz
+timestamp2timestamptz(Timestamp timestamp)
+{
+ return timestamp2timestamptz_opt_overflow(timestamp, NULL);
+}
+
+/* timestamptz_timestamp()
+ * Convert timestamp at GMT to local timestamp
+ */
+Datum
+timestamptz_timestamp(PG_FUNCTION_ARGS)
+{
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);
+
+ PG_RETURN_TIMESTAMP(timestamptz2timestamp(timestamp));
+}
+
+static Timestamp
+timestamptz2timestamp(TimestampTz timestamp)
+{
+ Timestamp result;
+ struct pg_tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+ int tz;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ result = timestamp;
+ else
+ {
+ if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ if (tm2timestamp(tm, fsec, NULL, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ return result;
+}
+
+/* timestamptz_zone()
+ * Evaluate timestamp with time zone type at the specified time zone.
+ * Returns a timestamp without time zone.
+ */
+Datum
+timestamptz_zone(PG_FUNCTION_ARGS)
+{
+ text *zone = PG_GETARG_TEXT_PP(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ Timestamp result;
+ int tz;
+ char tzname[TZ_STRLEN_MAX + 1];
+ char *lowzone;
+ int type,
+ val;
+ pg_tz *tzp;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMP(timestamp);
+
+ /*
+ * Look up the requested timezone. First we look in the timezone
+ * abbreviation table (to handle cases like "EST"), and if that fails, we
+ * look in the timezone database (to handle cases like
+ * "America/New_York"). (This matches the order in which timestamp input
+ * checks the cases; it's important because the timezone database unwisely
+ * uses a few zone names that are identical to offset abbreviations.)
+ */
+ text_to_cstring_buffer(zone, tzname, sizeof(tzname));
+
+ /* DecodeTimezoneAbbrev requires lowercase input */
+ lowzone = downcase_truncate_identifier(tzname,
+ strlen(tzname),
+ false);
+
+ type = DecodeTimezoneAbbrev(0, lowzone, &val, &tzp);
+
+ if (type == TZ || type == DTZ)
+ {
+ /* fixed-offset abbreviation */
+ tz = -val;
+ result = dt2local(timestamp, tz);
+ }
+ else if (type == DYNTZ)
+ {
+ /* dynamic-offset abbreviation, resolve using specified time */
+ int isdst;
+
+ tz = DetermineTimeZoneAbbrevOffsetTS(timestamp, tzname, tzp, &isdst);
+ result = dt2local(timestamp, tz);
+ }
+ else
+ {
+ /* try it as a full zone name */
+ tzp = pg_tzset(tzname);
+ if (tzp)
+ {
+ /* Apply the timezone change */
+ struct pg_tm tm;
+ fsec_t fsec;
+
+ if (timestamp2tm(timestamp, &tz, &tm, &fsec, NULL, tzp) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ if (tm2timestamp(&tm, fsec, NULL, &result) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+ }
+ else
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("time zone \"%s\" not recognized", tzname)));
+ result = 0; /* keep compiler quiet */
+ }
+ }
+
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* timestamptz_izone()
+ * Encode timestamp with time zone type with specified time interval as time zone.
+ * Returns a timestamp without time zone.
+ */
+Datum
+timestamptz_izone(PG_FUNCTION_ARGS)
+{
+ Interval *zone = PG_GETARG_INTERVAL_P(0);
+ TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
+ Timestamp result;
+ int tz;
+
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ PG_RETURN_TIMESTAMP(timestamp);
+
+ if (zone->month != 0 || zone->day != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("interval time zone \"%s\" must not include months or days",
+ DatumGetCString(DirectFunctionCall1(interval_out,
+ PointerGetDatum(zone))))));
+
+ tz = -(zone->time / USECS_PER_SEC);
+
+ result = dt2local(timestamp, tz);
+
+ if (!IS_VALID_TIMESTAMP(result))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ PG_RETURN_TIMESTAMP(result);
+}
+
+/* generate_series_timestamp()
+ * Generate the set of timestamps from start to finish by step
+ */
+Datum
+generate_series_timestamp(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ generate_series_timestamp_fctx *fctx;
+ Timestamp result;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ Timestamp start = PG_GETARG_TIMESTAMP(0);
+ Timestamp finish = PG_GETARG_TIMESTAMP(1);
+ Interval *step = PG_GETARG_INTERVAL_P(2);
+ MemoryContext oldcontext;
+ Interval interval_zero;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ fctx = (generate_series_timestamp_fctx *)
+ palloc(sizeof(generate_series_timestamp_fctx));
+
+ /*
+ * Use fctx to keep state from call to call. Seed current with the
+ * original start value
+ */
+ fctx->current = start;
+ fctx->finish = finish;
+ fctx->step = *step;
+
+ /* Determine sign of the interval */
+ MemSet(&interval_zero, 0, sizeof(Interval));
+ fctx->step_sign = interval_cmp_internal(&fctx->step, &interval_zero);
+
+ if (fctx->step_sign == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot equal zero")));
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ /*
+ * get the saved state and use current as the result for this iteration
+ */
+ fctx = funcctx->user_fctx;
+ result = fctx->current;
+
+ if (fctx->step_sign > 0 ?
+ timestamp_cmp_internal(result, fctx->finish) <= 0 :
+ timestamp_cmp_internal(result, fctx->finish) >= 0)
+ {
+ /* increment current in preparation for next iteration */
+ fctx->current = DatumGetTimestamp(DirectFunctionCall2(timestamp_pl_interval,
+ TimestampGetDatum(fctx->current),
+ PointerGetDatum(&fctx->step)));
+
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, TimestampGetDatum(result));
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/* generate_series_timestamptz()
+ * Generate the set of timestamps from start to finish by step
+ */
+Datum
+generate_series_timestamptz(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ generate_series_timestamptz_fctx *fctx;
+ TimestampTz result;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ TimestampTz start = PG_GETARG_TIMESTAMPTZ(0);
+ TimestampTz finish = PG_GETARG_TIMESTAMPTZ(1);
+ Interval *step = PG_GETARG_INTERVAL_P(2);
+ MemoryContext oldcontext;
+ Interval interval_zero;
+
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /* allocate memory for user context */
+ fctx = (generate_series_timestamptz_fctx *)
+ palloc(sizeof(generate_series_timestamptz_fctx));
+
+ /*
+ * Use fctx to keep state from call to call. Seed current with the
+ * original start value
+ */
+ fctx->current = start;
+ fctx->finish = finish;
+ fctx->step = *step;
+
+ /* Determine sign of the interval */
+ MemSet(&interval_zero, 0, sizeof(Interval));
+ fctx->step_sign = interval_cmp_internal(&fctx->step, &interval_zero);
+
+ if (fctx->step_sign == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("step size cannot equal zero")));
+
+ funcctx->user_fctx = fctx;
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ /*
+ * get the saved state and use current as the result for this iteration
+ */
+ fctx = funcctx->user_fctx;
+ result = fctx->current;
+
+ if (fctx->step_sign > 0 ?
+ timestamp_cmp_internal(result, fctx->finish) <= 0 :
+ timestamp_cmp_internal(result, fctx->finish) >= 0)
+ {
+ /* increment current in preparation for next iteration */
+ fctx->current = DatumGetTimestampTz(DirectFunctionCall2(timestamptz_pl_interval,
+ TimestampTzGetDatum(fctx->current),
+ PointerGetDatum(&fctx->step)));
+
+ /* do when there is more left to send */
+ SRF_RETURN_NEXT(funcctx, TimestampTzGetDatum(result));
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
diff --git a/src/backend/utils/adt/trigfuncs.c b/src/backend/utils/adt/trigfuncs.c
new file mode 100644
index 0000000..71b16ca
--- /dev/null
+++ b/src/backend/utils/adt/trigfuncs.c
@@ -0,0 +1,85 @@
+/*-------------------------------------------------------------------------
+ *
+ * trigfuncs.c
+ * Builtin functions for useful trigger support.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/utils/adt/trigfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "commands/trigger.h"
+#include "utils/builtins.h"
+#include "utils/rel.h"
+
+
+/*
+ * suppress_redundant_updates_trigger
+ *
+ * This trigger function will inhibit an update from being done
+ * if the OLD and NEW records are identical.
+ */
+Datum
+suppress_redundant_updates_trigger(PG_FUNCTION_ARGS)
+{
+ TriggerData *trigdata = (TriggerData *) fcinfo->context;
+ HeapTuple newtuple,
+ oldtuple,
+ rettuple;
+ HeapTupleHeader newheader,
+ oldheader;
+
+ /* make sure it's called as a trigger */
+ if (!CALLED_AS_TRIGGER(fcinfo))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("suppress_redundant_updates_trigger: must be called as trigger")));
+
+ /* and that it's called on update */
+ if (!TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("suppress_redundant_updates_trigger: must be called on update")));
+
+ /* and that it's called before update */
+ if (!TRIGGER_FIRED_BEFORE(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("suppress_redundant_updates_trigger: must be called before update")));
+
+ /* and that it's called for each row */
+ if (!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
+ ereport(ERROR,
+ (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
+ errmsg("suppress_redundant_updates_trigger: must be called for each row")));
+
+ /* get tuple data, set default result */
+ rettuple = newtuple = trigdata->tg_newtuple;
+ oldtuple = trigdata->tg_trigtuple;
+
+ newheader = newtuple->t_data;
+ oldheader = oldtuple->t_data;
+
+ /* if the tuple payload is the same ... */
+ if (newtuple->t_len == oldtuple->t_len &&
+ newheader->t_hoff == oldheader->t_hoff &&
+ (HeapTupleHeaderGetNatts(newheader) ==
+ HeapTupleHeaderGetNatts(oldheader)) &&
+ ((newheader->t_infomask & ~HEAP_XACT_MASK) ==
+ (oldheader->t_infomask & ~HEAP_XACT_MASK)) &&
+ memcmp(((char *) newheader) + SizeofHeapTupleHeader,
+ ((char *) oldheader) + SizeofHeapTupleHeader,
+ newtuple->t_len - SizeofHeapTupleHeader) == 0)
+ {
+ /* ... then suppress the update */
+ rettuple = NULL;
+ }
+
+ return PointerGetDatum(rettuple);
+}
diff --git a/src/backend/utils/adt/tsginidx.c b/src/backend/utils/adt/tsginidx.c
new file mode 100644
index 0000000..e272fca
--- /dev/null
+++ b/src/backend/utils/adt/tsginidx.c
@@ -0,0 +1,356 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsginidx.c
+ * GIN support functions for tsvector_ops
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsginidx.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/gin.h"
+#include "access/stratnum.h"
+#include "miscadmin.h"
+#include "tsearch/ts_type.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+
+
+Datum
+gin_cmp_tslexeme(PG_FUNCTION_ARGS)
+{
+ text *a = PG_GETARG_TEXT_PP(0);
+ text *b = PG_GETARG_TEXT_PP(1);
+ int cmp;
+
+ cmp = tsCompareString(VARDATA_ANY(a), VARSIZE_ANY_EXHDR(a),
+ VARDATA_ANY(b), VARSIZE_ANY_EXHDR(b),
+ false);
+
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+ PG_RETURN_INT32(cmp);
+}
+
+Datum
+gin_cmp_prefix(PG_FUNCTION_ARGS)
+{
+ text *a = PG_GETARG_TEXT_PP(0);
+ text *b = PG_GETARG_TEXT_PP(1);
+
+#ifdef NOT_USED
+ StrategyNumber strategy = PG_GETARG_UINT16(2);
+ Pointer extra_data = PG_GETARG_POINTER(3);
+#endif
+ int cmp;
+
+ cmp = tsCompareString(VARDATA_ANY(a), VARSIZE_ANY_EXHDR(a),
+ VARDATA_ANY(b), VARSIZE_ANY_EXHDR(b),
+ true);
+
+ if (cmp < 0)
+ cmp = 1; /* prevent continue scan */
+
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+ PG_RETURN_INT32(cmp);
+}
+
+Datum
+gin_extract_tsvector(PG_FUNCTION_ARGS)
+{
+ TSVector vector = PG_GETARG_TSVECTOR(0);
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+ Datum *entries = NULL;
+
+ *nentries = vector->size;
+ if (vector->size > 0)
+ {
+ int i;
+ WordEntry *we = ARRPTR(vector);
+
+ entries = (Datum *) palloc(sizeof(Datum) * vector->size);
+
+ for (i = 0; i < vector->size; i++)
+ {
+ text *txt;
+
+ txt = cstring_to_text_with_len(STRPTR(vector) + we->pos, we->len);
+ entries[i] = PointerGetDatum(txt);
+
+ we++;
+ }
+ }
+
+ PG_FREE_IF_COPY(vector, 0);
+ PG_RETURN_POINTER(entries);
+}
+
+Datum
+gin_extract_tsquery(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
+
+ /* StrategyNumber strategy = PG_GETARG_UINT16(2); */
+ bool **ptr_partialmatch = (bool **) PG_GETARG_POINTER(3);
+ Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
+
+ /* bool **nullFlags = (bool **) PG_GETARG_POINTER(5); */
+ int32 *searchMode = (int32 *) PG_GETARG_POINTER(6);
+ Datum *entries = NULL;
+
+ *nentries = 0;
+
+ if (query->size > 0)
+ {
+ QueryItem *item = GETQUERY(query);
+ int32 i,
+ j;
+ bool *partialmatch;
+ int *map_item_operand;
+
+ /*
+ * If the query doesn't have any required positive matches (for
+ * instance, it's something like '! foo'), we have to do a full index
+ * scan.
+ */
+ if (tsquery_requires_match(item))
+ *searchMode = GIN_SEARCH_MODE_DEFAULT;
+ else
+ *searchMode = GIN_SEARCH_MODE_ALL;
+
+ /* count number of VAL items */
+ j = 0;
+ for (i = 0; i < query->size; i++)
+ {
+ if (item[i].type == QI_VAL)
+ j++;
+ }
+ *nentries = j;
+
+ entries = (Datum *) palloc(sizeof(Datum) * j);
+ partialmatch = *ptr_partialmatch = (bool *) palloc(sizeof(bool) * j);
+
+ /*
+ * Make map to convert item's number to corresponding operand's (the
+ * same, entry's) number. Entry's number is used in check array in
+ * consistent method. We use the same map for each entry.
+ */
+ *extra_data = (Pointer *) palloc(sizeof(Pointer) * j);
+ map_item_operand = (int *) palloc0(sizeof(int) * query->size);
+
+ /* Now rescan the VAL items and fill in the arrays */
+ j = 0;
+ for (i = 0; i < query->size; i++)
+ {
+ if (item[i].type == QI_VAL)
+ {
+ QueryOperand *val = &item[i].qoperand;
+ text *txt;
+
+ txt = cstring_to_text_with_len(GETOPERAND(query) + val->distance,
+ val->length);
+ entries[j] = PointerGetDatum(txt);
+ partialmatch[j] = val->prefix;
+ (*extra_data)[j] = (Pointer) map_item_operand;
+ map_item_operand[i] = j;
+ j++;
+ }
+ }
+ }
+
+ PG_FREE_IF_COPY(query, 0);
+
+ PG_RETURN_POINTER(entries);
+}
+
+typedef struct
+{
+ QueryItem *first_item;
+ GinTernaryValue *check;
+ int *map_item_operand;
+} GinChkVal;
+
+/*
+ * TS_execute callback for matching a tsquery operand to GIN index data
+ */
+static TSTernaryValue
+checkcondition_gin(void *checkval, QueryOperand *val, ExecPhraseData *data)
+{
+ GinChkVal *gcv = (GinChkVal *) checkval;
+ int j;
+ GinTernaryValue result;
+
+ /* convert item's number to corresponding entry's (operand's) number */
+ j = gcv->map_item_operand[((QueryItem *) val) - gcv->first_item];
+
+ /* determine presence of current entry in indexed value */
+ result = gcv->check[j];
+
+ /*
+ * If any val requiring a weight is used or caller needs position
+ * information then we must recheck, so replace TRUE with MAYBE.
+ */
+ if (result == GIN_TRUE)
+ {
+ if (val->weight != 0 || data != NULL)
+ result = GIN_MAYBE;
+ }
+
+ /*
+ * We rely on GinTernaryValue and TSTernaryValue using equivalent value
+ * assignments. We could use a switch statement to map the values if that
+ * ever stops being true, but it seems unlikely to happen.
+ */
+ return (TSTernaryValue) result;
+}
+
+Datum
+gin_tsquery_consistent(PG_FUNCTION_ARGS)
+{
+ bool *check = (bool *) PG_GETARG_POINTER(0);
+
+ /* StrategyNumber strategy = PG_GETARG_UINT16(1); */
+ TSQuery query = PG_GETARG_TSQUERY(2);
+
+ /* int32 nkeys = PG_GETARG_INT32(3); */
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ bool *recheck = (bool *) PG_GETARG_POINTER(5);
+ bool res = false;
+
+ /* Initially assume query doesn't require recheck */
+ *recheck = false;
+
+ if (query->size > 0)
+ {
+ GinChkVal gcv;
+
+ /*
+ * check-parameter array has one entry for each value (operand) in the
+ * query.
+ */
+ gcv.first_item = GETQUERY(query);
+ StaticAssertStmt(sizeof(GinTernaryValue) == sizeof(bool),
+ "sizes of GinTernaryValue and bool are not equal");
+ gcv.check = (GinTernaryValue *) check;
+ gcv.map_item_operand = (int *) (extra_data[0]);
+
+ switch (TS_execute_ternary(GETQUERY(query),
+ &gcv,
+ TS_EXEC_PHRASE_NO_POS,
+ checkcondition_gin))
+ {
+ case TS_NO:
+ res = false;
+ break;
+ case TS_YES:
+ res = true;
+ break;
+ case TS_MAYBE:
+ res = true;
+ *recheck = true;
+ break;
+ }
+ }
+
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+gin_tsquery_triconsistent(PG_FUNCTION_ARGS)
+{
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
+
+ /* StrategyNumber strategy = PG_GETARG_UINT16(1); */
+ TSQuery query = PG_GETARG_TSQUERY(2);
+
+ /* int32 nkeys = PG_GETARG_INT32(3); */
+ Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
+ GinTernaryValue res = GIN_FALSE;
+
+ if (query->size > 0)
+ {
+ GinChkVal gcv;
+
+ /*
+ * check-parameter array has one entry for each value (operand) in the
+ * query.
+ */
+ gcv.first_item = GETQUERY(query);
+ gcv.check = check;
+ gcv.map_item_operand = (int *) (extra_data[0]);
+
+ res = TS_execute_ternary(GETQUERY(query),
+ &gcv,
+ TS_EXEC_PHRASE_NO_POS,
+ checkcondition_gin);
+ }
+
+ PG_RETURN_GIN_TERNARY_VALUE(res);
+}
+
+/*
+ * Formerly, gin_extract_tsvector had only two arguments. Now it has three,
+ * but we still need a pg_proc entry with two args to support reloading
+ * pre-9.1 contrib/tsearch2 opclass declarations. This compatibility
+ * function should go away eventually. (Note: you might say "hey, but the
+ * code above is only *using* two args, so let's just declare it that way".
+ * If you try that you'll find the opr_sanity regression test complains.)
+ */
+Datum
+gin_extract_tsvector_2args(PG_FUNCTION_ARGS)
+{
+ if (PG_NARGS() < 3) /* should not happen */
+ elog(ERROR, "gin_extract_tsvector requires three arguments");
+ return gin_extract_tsvector(fcinfo);
+}
+
+/*
+ * Likewise, we need a stub version of gin_extract_tsquery declared with
+ * only five arguments.
+ */
+Datum
+gin_extract_tsquery_5args(PG_FUNCTION_ARGS)
+{
+ if (PG_NARGS() < 7) /* should not happen */
+ elog(ERROR, "gin_extract_tsquery requires seven arguments");
+ return gin_extract_tsquery(fcinfo);
+}
+
+/*
+ * Likewise, we need a stub version of gin_tsquery_consistent declared with
+ * only six arguments.
+ */
+Datum
+gin_tsquery_consistent_6args(PG_FUNCTION_ARGS)
+{
+ if (PG_NARGS() < 8) /* should not happen */
+ elog(ERROR, "gin_tsquery_consistent requires eight arguments");
+ return gin_tsquery_consistent(fcinfo);
+}
+
+/*
+ * Likewise, a stub version of gin_extract_tsquery declared with argument
+ * types that are no longer considered appropriate.
+ */
+Datum
+gin_extract_tsquery_oldsig(PG_FUNCTION_ARGS)
+{
+ return gin_extract_tsquery(fcinfo);
+}
+
+/*
+ * Likewise, a stub version of gin_tsquery_consistent declared with argument
+ * types that are no longer considered appropriate.
+ */
+Datum
+gin_tsquery_consistent_oldsig(PG_FUNCTION_ARGS)
+{
+ return gin_tsquery_consistent(fcinfo);
+}
diff --git a/src/backend/utils/adt/tsgistidx.c b/src/backend/utils/adt/tsgistidx.c
new file mode 100644
index 0000000..2c5617a
--- /dev/null
+++ b/src/backend/utils/adt/tsgistidx.c
@@ -0,0 +1,816 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsgistidx.c
+ * GiST support functions for tsvector_ops
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsgistidx.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/gist.h"
+#include "access/heaptoast.h"
+#include "access/reloptions.h"
+#include "lib/qunique.h"
+#include "port/pg_bitutils.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+#include "utils/pg_crc.h"
+
+
+/* tsvector_ops opclass options */
+typedef struct
+{
+ int32 vl_len_; /* varlena header (do not touch directly!) */
+ int siglen; /* signature length */
+} GistTsVectorOptions;
+
+#define SIGLEN_DEFAULT (31 * 4)
+#define SIGLEN_MAX GISTMaxIndexKeySize
+#define GET_SIGLEN() (PG_HAS_OPCLASS_OPTIONS() ? \
+ ((GistTsVectorOptions *) PG_GET_OPCLASS_OPTIONS())->siglen : \
+ SIGLEN_DEFAULT)
+
+#define SIGLENBIT(siglen) ((siglen) * BITS_PER_BYTE)
+
+typedef char *BITVECP;
+
+#define LOOPBYTE(siglen) \
+ for (i = 0; i < siglen; i++)
+
+#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITS_PER_BYTE ) ) )
+#define GETBITBYTE(x,i) ( ((char)(x)) >> (i) & 0x01 )
+#define CLRBIT(x,i) GETBYTE(x,i) &= ~( 0x01 << ( (i) % BITS_PER_BYTE ) )
+#define SETBIT(x,i) GETBYTE(x,i) |= ( 0x01 << ( (i) % BITS_PER_BYTE ) )
+#define GETBIT(x,i) ( (GETBYTE(x,i) >> ( (i) % BITS_PER_BYTE )) & 0x01 )
+
+#define HASHVAL(val, siglen) (((unsigned int)(val)) % SIGLENBIT(siglen))
+#define HASH(sign, val, siglen) SETBIT((sign), HASHVAL(val, siglen))
+
+#define GETENTRY(vec,pos) ((SignTSVector *) DatumGetPointer((vec)->vector[(pos)].key))
+
+/*
+ * type of GiST index key
+ */
+
+typedef struct
+{
+ int32 vl_len_; /* varlena header (do not touch directly!) */
+ int32 flag;
+ char data[FLEXIBLE_ARRAY_MEMBER];
+} SignTSVector;
+
+#define ARRKEY 0x01
+#define SIGNKEY 0x02
+#define ALLISTRUE 0x04
+
+#define ISARRKEY(x) ( ((SignTSVector*)(x))->flag & ARRKEY )
+#define ISSIGNKEY(x) ( ((SignTSVector*)(x))->flag & SIGNKEY )
+#define ISALLTRUE(x) ( ((SignTSVector*)(x))->flag & ALLISTRUE )
+
+#define GTHDRSIZE ( VARHDRSZ + sizeof(int32) )
+#define CALCGTSIZE(flag, len) ( GTHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(int32)) : (((flag) & ALLISTRUE) ? 0 : (len)) ) )
+
+#define GETSIGN(x) ( (BITVECP)( (char*)(x)+GTHDRSIZE ) )
+#define GETSIGLEN(x)( VARSIZE(x) - GTHDRSIZE )
+#define GETARR(x) ( (int32*)( (char*)(x)+GTHDRSIZE ) )
+#define ARRNELEM(x) ( ( VARSIZE(x) - GTHDRSIZE )/sizeof(int32) )
+
+static int32 sizebitvec(BITVECP sign, int siglen);
+
+Datum
+gtsvectorin(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("gtsvector_in not implemented")));
+ PG_RETURN_DATUM(0);
+}
+
+#define SINGOUTSTR "%d true bits, %d false bits"
+#define ARROUTSTR "%d unique words"
+#define EXTRALEN ( 2*13 )
+
+static int outbuf_maxlen = 0;
+
+Datum
+gtsvectorout(PG_FUNCTION_ARGS)
+{
+ SignTSVector *key = (SignTSVector *) PG_DETOAST_DATUM(PG_GETARG_POINTER(0));
+ char *outbuf;
+
+ if (outbuf_maxlen == 0)
+ outbuf_maxlen = 2 * EXTRALEN + Max(strlen(SINGOUTSTR), strlen(ARROUTSTR)) + 1;
+ outbuf = palloc(outbuf_maxlen);
+
+ if (ISARRKEY(key))
+ sprintf(outbuf, ARROUTSTR, (int) ARRNELEM(key));
+ else
+ {
+ int siglen = GETSIGLEN(key);
+ int cnttrue = (ISALLTRUE(key)) ? SIGLENBIT(siglen) : sizebitvec(GETSIGN(key), siglen);
+
+ sprintf(outbuf, SINGOUTSTR, cnttrue, (int) SIGLENBIT(siglen) - cnttrue);
+ }
+
+ PG_FREE_IF_COPY(key, 0);
+ PG_RETURN_POINTER(outbuf);
+}
+
+static int
+compareint(const void *va, const void *vb)
+{
+ int32 a = *((const int32 *) va);
+ int32 b = *((const int32 *) vb);
+
+ if (a == b)
+ return 0;
+ return (a > b) ? 1 : -1;
+}
+
+static void
+makesign(BITVECP sign, SignTSVector *a, int siglen)
+{
+ int32 k,
+ len = ARRNELEM(a);
+ int32 *ptr = GETARR(a);
+
+ MemSet((void *) sign, 0, siglen);
+ for (k = 0; k < len; k++)
+ HASH(sign, ptr[k], siglen);
+}
+
+static SignTSVector *
+gtsvector_alloc(int flag, int len, BITVECP sign)
+{
+ int size = CALCGTSIZE(flag, len);
+ SignTSVector *res = palloc(size);
+
+ SET_VARSIZE(res, size);
+ res->flag = flag;
+
+ if ((flag & (SIGNKEY | ALLISTRUE)) == SIGNKEY && sign)
+ memcpy(GETSIGN(res), sign, len);
+
+ return res;
+}
+
+
+Datum
+gtsvector_compress(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ int siglen = GET_SIGLEN();
+ GISTENTRY *retval = entry;
+
+ if (entry->leafkey)
+ { /* tsvector */
+ TSVector val = DatumGetTSVector(entry->key);
+ SignTSVector *res = gtsvector_alloc(ARRKEY, val->size, NULL);
+ int32 len;
+ int32 *arr;
+ WordEntry *ptr = ARRPTR(val);
+ char *words = STRPTR(val);
+
+ arr = GETARR(res);
+ len = val->size;
+ while (len--)
+ {
+ pg_crc32 c;
+
+ INIT_LEGACY_CRC32(c);
+ COMP_LEGACY_CRC32(c, words + ptr->pos, ptr->len);
+ FIN_LEGACY_CRC32(c);
+
+ *arr = *(int32 *) &c;
+ arr++;
+ ptr++;
+ }
+
+ qsort(GETARR(res), val->size, sizeof(int), compareint);
+ len = qunique(GETARR(res), val->size, sizeof(int), compareint);
+ if (len != val->size)
+ {
+ /*
+ * there is a collision of hash-function; len is always less than
+ * val->size
+ */
+ len = CALCGTSIZE(ARRKEY, len);
+ res = (SignTSVector *) repalloc((void *) res, len);
+ SET_VARSIZE(res, len);
+ }
+
+ /* make signature, if array is too long */
+ if (VARSIZE(res) > TOAST_INDEX_TARGET)
+ {
+ SignTSVector *ressign = gtsvector_alloc(SIGNKEY, siglen, NULL);
+
+ makesign(GETSIGN(ressign), res, siglen);
+ res = ressign;
+ }
+
+ retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
+ gistentryinit(*retval, PointerGetDatum(res),
+ entry->rel, entry->page,
+ entry->offset, false);
+ }
+ else if (ISSIGNKEY(DatumGetPointer(entry->key)) &&
+ !ISALLTRUE(DatumGetPointer(entry->key)))
+ {
+ int32 i;
+ SignTSVector *res;
+ BITVECP sign = GETSIGN(DatumGetPointer(entry->key));
+
+ LOOPBYTE(siglen)
+ {
+ if ((sign[i] & 0xff) != 0xff)
+ PG_RETURN_POINTER(retval);
+ }
+
+ res = gtsvector_alloc(SIGNKEY | ALLISTRUE, siglen, sign);
+ retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
+ gistentryinit(*retval, PointerGetDatum(res),
+ entry->rel, entry->page,
+ entry->offset, false);
+ }
+ PG_RETURN_POINTER(retval);
+}
+
+Datum
+gtsvector_decompress(PG_FUNCTION_ARGS)
+{
+ /*
+ * We need to detoast the stored value, because the other gtsvector
+ * support functions don't cope with toasted values.
+ */
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ SignTSVector *key = (SignTSVector *) PG_DETOAST_DATUM(entry->key);
+
+ if (key != (SignTSVector *) DatumGetPointer(entry->key))
+ {
+ GISTENTRY *retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
+
+ gistentryinit(*retval, PointerGetDatum(key),
+ entry->rel, entry->page,
+ entry->offset, false);
+
+ PG_RETURN_POINTER(retval);
+ }
+
+ PG_RETURN_POINTER(entry);
+}
+
+typedef struct
+{
+ int32 *arrb;
+ int32 *arre;
+} CHKVAL;
+
+/*
+ * TS_execute callback for matching a tsquery operand to GIST leaf-page data
+ */
+static TSTernaryValue
+checkcondition_arr(void *checkval, QueryOperand *val, ExecPhraseData *data)
+{
+ int32 *StopLow = ((CHKVAL *) checkval)->arrb;
+ int32 *StopHigh = ((CHKVAL *) checkval)->arre;
+ int32 *StopMiddle;
+
+ /* Loop invariant: StopLow <= val < StopHigh */
+
+ /*
+ * we are not able to find a prefix by hash value
+ */
+ if (val->prefix)
+ return TS_MAYBE;
+
+ while (StopLow < StopHigh)
+ {
+ StopMiddle = StopLow + (StopHigh - StopLow) / 2;
+ if (*StopMiddle == val->valcrc)
+ return TS_MAYBE;
+ else if (*StopMiddle < val->valcrc)
+ StopLow = StopMiddle + 1;
+ else
+ StopHigh = StopMiddle;
+ }
+
+ return TS_NO;
+}
+
+/*
+ * TS_execute callback for matching a tsquery operand to GIST non-leaf data
+ */
+static TSTernaryValue
+checkcondition_bit(void *checkval, QueryOperand *val, ExecPhraseData *data)
+{
+ void *key = (SignTSVector *) checkval;
+
+ /*
+ * we are not able to find a prefix in signature tree
+ */
+ if (val->prefix)
+ return TS_MAYBE;
+
+ if (GETBIT(GETSIGN(key), HASHVAL(val->valcrc, GETSIGLEN(key))))
+ return TS_MAYBE;
+ else
+ return TS_NO;
+}
+
+Datum
+gtsvector_consistent(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+
+ /* StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); */
+ /* Oid subtype = PG_GETARG_OID(3); */
+ bool *recheck = (bool *) PG_GETARG_POINTER(4);
+ SignTSVector *key = (SignTSVector *) DatumGetPointer(entry->key);
+
+ /* All cases served by this function are inexact */
+ *recheck = true;
+
+ if (!query->size)
+ PG_RETURN_BOOL(false);
+
+ if (ISSIGNKEY(key))
+ {
+ if (ISALLTRUE(key))
+ PG_RETURN_BOOL(true);
+
+ PG_RETURN_BOOL(TS_execute(GETQUERY(query),
+ key,
+ TS_EXEC_PHRASE_NO_POS,
+ checkcondition_bit));
+ }
+ else
+ { /* only leaf pages */
+ CHKVAL chkval;
+
+ chkval.arrb = GETARR(key);
+ chkval.arre = chkval.arrb + ARRNELEM(key);
+ PG_RETURN_BOOL(TS_execute(GETQUERY(query),
+ (void *) &chkval,
+ TS_EXEC_PHRASE_NO_POS,
+ checkcondition_arr));
+ }
+}
+
+static int32
+unionkey(BITVECP sbase, SignTSVector *add, int siglen)
+{
+ int32 i;
+
+ if (ISSIGNKEY(add))
+ {
+ BITVECP sadd = GETSIGN(add);
+
+ if (ISALLTRUE(add))
+ return 1;
+
+ Assert(GETSIGLEN(add) == siglen);
+
+ LOOPBYTE(siglen)
+ sbase[i] |= sadd[i];
+ }
+ else
+ {
+ int32 *ptr = GETARR(add);
+
+ for (i = 0; i < ARRNELEM(add); i++)
+ HASH(sbase, ptr[i], siglen);
+ }
+ return 0;
+}
+
+
+Datum
+gtsvector_union(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ int *size = (int *) PG_GETARG_POINTER(1);
+ int siglen = GET_SIGLEN();
+ SignTSVector *result = gtsvector_alloc(SIGNKEY, siglen, NULL);
+ BITVECP base = GETSIGN(result);
+ int32 i;
+
+ memset(base, 0, siglen);
+
+ for (i = 0; i < entryvec->n; i++)
+ {
+ if (unionkey(base, GETENTRY(entryvec, i), siglen))
+ {
+ result->flag |= ALLISTRUE;
+ SET_VARSIZE(result, CALCGTSIZE(result->flag, siglen));
+ break;
+ }
+ }
+
+ *size = VARSIZE(result);
+
+ PG_RETURN_POINTER(result);
+}
+
+Datum
+gtsvector_same(PG_FUNCTION_ARGS)
+{
+ SignTSVector *a = (SignTSVector *) PG_GETARG_POINTER(0);
+ SignTSVector *b = (SignTSVector *) PG_GETARG_POINTER(1);
+ bool *result = (bool *) PG_GETARG_POINTER(2);
+ int siglen = GET_SIGLEN();
+
+ if (ISSIGNKEY(a))
+ { /* then b also ISSIGNKEY */
+ if (ISALLTRUE(a) && ISALLTRUE(b))
+ *result = true;
+ else if (ISALLTRUE(a))
+ *result = false;
+ else if (ISALLTRUE(b))
+ *result = false;
+ else
+ {
+ int32 i;
+ BITVECP sa = GETSIGN(a),
+ sb = GETSIGN(b);
+
+ Assert(GETSIGLEN(a) == siglen && GETSIGLEN(b) == siglen);
+
+ *result = true;
+ LOOPBYTE(siglen)
+ {
+ if (sa[i] != sb[i])
+ {
+ *result = false;
+ break;
+ }
+ }
+ }
+ }
+ else
+ { /* a and b ISARRKEY */
+ int32 lena = ARRNELEM(a),
+ lenb = ARRNELEM(b);
+
+ if (lena != lenb)
+ *result = false;
+ else
+ {
+ int32 *ptra = GETARR(a),
+ *ptrb = GETARR(b);
+ int32 i;
+
+ *result = true;
+ for (i = 0; i < lena; i++)
+ if (ptra[i] != ptrb[i])
+ {
+ *result = false;
+ break;
+ }
+ }
+ }
+
+ PG_RETURN_POINTER(result);
+}
+
+static int32
+sizebitvec(BITVECP sign, int siglen)
+{
+ return pg_popcount(sign, siglen);
+}
+
+static int
+hemdistsign(BITVECP a, BITVECP b, int siglen)
+{
+ int i,
+ diff,
+ dist = 0;
+
+ LOOPBYTE(siglen)
+ {
+ diff = (unsigned char) (a[i] ^ b[i]);
+ /* Using the popcount functions here isn't likely to win */
+ dist += pg_number_of_ones[diff];
+ }
+ return dist;
+}
+
+static int
+hemdist(SignTSVector *a, SignTSVector *b)
+{
+ int siglena = GETSIGLEN(a);
+ int siglenb = GETSIGLEN(b);
+
+ if (ISALLTRUE(a))
+ {
+ if (ISALLTRUE(b))
+ return 0;
+ else
+ return SIGLENBIT(siglenb) - sizebitvec(GETSIGN(b), siglenb);
+ }
+ else if (ISALLTRUE(b))
+ return SIGLENBIT(siglena) - sizebitvec(GETSIGN(a), siglena);
+
+ Assert(siglena == siglenb);
+
+ return hemdistsign(GETSIGN(a), GETSIGN(b), siglena);
+}
+
+Datum
+gtsvector_penalty(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0); /* always ISSIGNKEY */
+ GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);
+ float *penalty = (float *) PG_GETARG_POINTER(2);
+ int siglen = GET_SIGLEN();
+ SignTSVector *origval = (SignTSVector *) DatumGetPointer(origentry->key);
+ SignTSVector *newval = (SignTSVector *) DatumGetPointer(newentry->key);
+ BITVECP orig = GETSIGN(origval);
+
+ *penalty = 0.0;
+
+ if (ISARRKEY(newval))
+ {
+ BITVECP sign = palloc(siglen);
+
+ makesign(sign, newval, siglen);
+
+ if (ISALLTRUE(origval))
+ {
+ int siglenbit = SIGLENBIT(siglen);
+
+ *penalty =
+ (float) (siglenbit - sizebitvec(sign, siglen)) /
+ (float) (siglenbit + 1);
+ }
+ else
+ *penalty = hemdistsign(sign, orig, siglen);
+
+ pfree(sign);
+ }
+ else
+ *penalty = hemdist(origval, newval);
+ PG_RETURN_POINTER(penalty);
+}
+
+typedef struct
+{
+ bool allistrue;
+ BITVECP sign;
+} CACHESIGN;
+
+static void
+fillcache(CACHESIGN *item, SignTSVector *key, int siglen)
+{
+ item->allistrue = false;
+ if (ISARRKEY(key))
+ makesign(item->sign, key, siglen);
+ else if (ISALLTRUE(key))
+ item->allistrue = true;
+ else
+ memcpy((void *) item->sign, (void *) GETSIGN(key), siglen);
+}
+
+#define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) )
+typedef struct
+{
+ OffsetNumber pos;
+ int32 cost;
+} SPLITCOST;
+
+static int
+comparecost(const void *va, const void *vb)
+{
+ const SPLITCOST *a = (const SPLITCOST *) va;
+ const SPLITCOST *b = (const SPLITCOST *) vb;
+
+ if (a->cost == b->cost)
+ return 0;
+ else
+ return (a->cost > b->cost) ? 1 : -1;
+}
+
+
+static int
+hemdistcache(CACHESIGN *a, CACHESIGN *b, int siglen)
+{
+ if (a->allistrue)
+ {
+ if (b->allistrue)
+ return 0;
+ else
+ return SIGLENBIT(siglen) - sizebitvec(b->sign, siglen);
+ }
+ else if (b->allistrue)
+ return SIGLENBIT(siglen) - sizebitvec(a->sign, siglen);
+
+ return hemdistsign(a->sign, b->sign, siglen);
+}
+
+Datum
+gtsvector_picksplit(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
+ int siglen = GET_SIGLEN();
+ OffsetNumber k,
+ j;
+ SignTSVector *datum_l,
+ *datum_r;
+ BITVECP union_l,
+ union_r;
+ int32 size_alpha,
+ size_beta;
+ int32 size_waste,
+ waste = -1;
+ int32 nbytes;
+ OffsetNumber seed_1 = 0,
+ seed_2 = 0;
+ OffsetNumber *left,
+ *right;
+ OffsetNumber maxoff;
+ BITVECP ptr;
+ int i;
+ CACHESIGN *cache;
+ char *cache_sign;
+ SPLITCOST *costvector;
+
+ maxoff = entryvec->n - 2;
+ nbytes = (maxoff + 2) * sizeof(OffsetNumber);
+ v->spl_left = (OffsetNumber *) palloc(nbytes);
+ v->spl_right = (OffsetNumber *) palloc(nbytes);
+
+ cache = (CACHESIGN *) palloc(sizeof(CACHESIGN) * (maxoff + 2));
+ cache_sign = palloc(siglen * (maxoff + 2));
+
+ for (j = 0; j < maxoff + 2; j++)
+ cache[j].sign = &cache_sign[siglen * j];
+
+ fillcache(&cache[FirstOffsetNumber], GETENTRY(entryvec, FirstOffsetNumber),
+ siglen);
+
+ for (k = FirstOffsetNumber; k < maxoff; k = OffsetNumberNext(k))
+ {
+ for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j))
+ {
+ if (k == FirstOffsetNumber)
+ fillcache(&cache[j], GETENTRY(entryvec, j), siglen);
+
+ size_waste = hemdistcache(&(cache[j]), &(cache[k]), siglen);
+ if (size_waste > waste)
+ {
+ waste = size_waste;
+ seed_1 = k;
+ seed_2 = j;
+ }
+ }
+ }
+
+ left = v->spl_left;
+ v->spl_nleft = 0;
+ right = v->spl_right;
+ v->spl_nright = 0;
+
+ if (seed_1 == 0 || seed_2 == 0)
+ {
+ seed_1 = 1;
+ seed_2 = 2;
+ }
+
+ /* form initial .. */
+ datum_l = gtsvector_alloc(SIGNKEY | (cache[seed_1].allistrue ? ALLISTRUE : 0),
+ siglen, cache[seed_1].sign);
+ datum_r = gtsvector_alloc(SIGNKEY | (cache[seed_2].allistrue ? ALLISTRUE : 0),
+ siglen, cache[seed_2].sign);
+ union_l = GETSIGN(datum_l);
+ union_r = GETSIGN(datum_r);
+ maxoff = OffsetNumberNext(maxoff);
+ fillcache(&cache[maxoff], GETENTRY(entryvec, maxoff), siglen);
+ /* sort before ... */
+ costvector = (SPLITCOST *) palloc(sizeof(SPLITCOST) * maxoff);
+ for (j = FirstOffsetNumber; j <= maxoff; j = OffsetNumberNext(j))
+ {
+ costvector[j - 1].pos = j;
+ size_alpha = hemdistcache(&(cache[seed_1]), &(cache[j]), siglen);
+ size_beta = hemdistcache(&(cache[seed_2]), &(cache[j]), siglen);
+ costvector[j - 1].cost = Abs(size_alpha - size_beta);
+ }
+ qsort((void *) costvector, maxoff, sizeof(SPLITCOST), comparecost);
+
+ for (k = 0; k < maxoff; k++)
+ {
+ j = costvector[k].pos;
+ if (j == seed_1)
+ {
+ *left++ = j;
+ v->spl_nleft++;
+ continue;
+ }
+ else if (j == seed_2)
+ {
+ *right++ = j;
+ v->spl_nright++;
+ continue;
+ }
+
+ if (ISALLTRUE(datum_l) || cache[j].allistrue)
+ {
+ if (ISALLTRUE(datum_l) && cache[j].allistrue)
+ size_alpha = 0;
+ else
+ size_alpha = SIGLENBIT(siglen) -
+ sizebitvec((cache[j].allistrue) ?
+ GETSIGN(datum_l) :
+ cache[j].sign,
+ siglen);
+ }
+ else
+ size_alpha = hemdistsign(cache[j].sign, GETSIGN(datum_l), siglen);
+
+ if (ISALLTRUE(datum_r) || cache[j].allistrue)
+ {
+ if (ISALLTRUE(datum_r) && cache[j].allistrue)
+ size_beta = 0;
+ else
+ size_beta = SIGLENBIT(siglen) -
+ sizebitvec((cache[j].allistrue) ?
+ GETSIGN(datum_r) :
+ cache[j].sign,
+ siglen);
+ }
+ else
+ size_beta = hemdistsign(cache[j].sign, GETSIGN(datum_r), siglen);
+
+ if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.1))
+ {
+ if (ISALLTRUE(datum_l) || cache[j].allistrue)
+ {
+ if (!ISALLTRUE(datum_l))
+ MemSet((void *) GETSIGN(datum_l), 0xff, siglen);
+ }
+ else
+ {
+ ptr = cache[j].sign;
+ LOOPBYTE(siglen)
+ union_l[i] |= ptr[i];
+ }
+ *left++ = j;
+ v->spl_nleft++;
+ }
+ else
+ {
+ if (ISALLTRUE(datum_r) || cache[j].allistrue)
+ {
+ if (!ISALLTRUE(datum_r))
+ MemSet((void *) GETSIGN(datum_r), 0xff, siglen);
+ }
+ else
+ {
+ ptr = cache[j].sign;
+ LOOPBYTE(siglen)
+ union_r[i] |= ptr[i];
+ }
+ *right++ = j;
+ v->spl_nright++;
+ }
+ }
+
+ *right = *left = FirstOffsetNumber;
+ v->spl_ldatum = PointerGetDatum(datum_l);
+ v->spl_rdatum = PointerGetDatum(datum_r);
+
+ PG_RETURN_POINTER(v);
+}
+
+/*
+ * Formerly, gtsvector_consistent was declared in pg_proc.h with arguments
+ * that did not match the documented conventions for GiST support functions.
+ * We fixed that, but we still need a pg_proc entry with the old signature
+ * to support reloading pre-9.6 contrib/tsearch2 opclass declarations.
+ * This compatibility function should go away eventually.
+ */
+Datum
+gtsvector_consistent_oldsig(PG_FUNCTION_ARGS)
+{
+ return gtsvector_consistent(fcinfo);
+}
+
+Datum
+gtsvector_options(PG_FUNCTION_ARGS)
+{
+ local_relopts *relopts = (local_relopts *) PG_GETARG_POINTER(0);
+
+ init_local_reloptions(relopts, sizeof(GistTsVectorOptions));
+ add_local_int_reloption(relopts, "siglen", "signature length",
+ SIGLEN_DEFAULT, 1, SIGLEN_MAX,
+ offsetof(GistTsVectorOptions, siglen));
+
+ PG_RETURN_VOID();
+}
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
new file mode 100644
index 0000000..f54f298
--- /dev/null
+++ b/src/backend/utils/adt/tsquery.c
@@ -0,0 +1,1349 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery.c
+ * I/O functions for tsquery
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "tsearch/ts_locale.h"
+#include "tsearch/ts_type.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/pg_crc.h"
+
+/* FTS operator priorities, see ts_type.h */
+const int tsearch_op_priority[OP_COUNT] =
+{
+ 4, /* OP_NOT */
+ 2, /* OP_AND */
+ 1, /* OP_OR */
+ 3 /* OP_PHRASE */
+};
+
+/*
+ * parser's states
+ */
+typedef enum
+{
+ WAITOPERAND = 1,
+ WAITOPERATOR = 2,
+ WAITFIRSTOPERAND = 3
+} ts_parserstate;
+
+/*
+ * token types for parsing
+ */
+typedef enum
+{
+ PT_END = 0,
+ PT_ERR = 1,
+ PT_VAL = 2,
+ PT_OPR = 3,
+ PT_OPEN = 4,
+ PT_CLOSE = 5
+} ts_tokentype;
+
+/*
+ * get token from query string
+ *
+ * *operator is filled in with OP_* when return values is PT_OPR,
+ * but *weight could contain a distance value in case of phrase operator.
+ * *strval, *lenval and *weight are filled in when return value is PT_VAL
+ *
+ */
+typedef ts_tokentype (*ts_tokenizer) (TSQueryParserState state, int8 *operator,
+ int *lenval, char **strval,
+ int16 *weight, bool *prefix);
+
+struct TSQueryParserStateData
+{
+ /* Tokenizer used for parsing tsquery */
+ ts_tokenizer gettoken;
+
+ /* State of tokenizer function */
+ char *buffer; /* entire string we are scanning */
+ char *buf; /* current scan point */
+ int count; /* nesting count, incremented by (,
+ * decremented by ) */
+ ts_parserstate state;
+
+ /* polish (prefix) notation in list, filled in by push* functions */
+ List *polstr;
+
+ /*
+ * Strings from operands are collected in op. curop is a pointer to the
+ * end of used space of op.
+ */
+ char *op;
+ char *curop;
+ int lenop; /* allocated size of op */
+ int sumlen; /* used size of op */
+
+ /* state for value's parser */
+ TSVectorParseState valstate;
+};
+
+/*
+ * subroutine to parse the modifiers (weight and prefix flag currently)
+ * part, like ':AB*' of a query.
+ */
+static char *
+get_modifiers(char *buf, int16 *weight, bool *prefix)
+{
+ *weight = 0;
+ *prefix = false;
+
+ if (!t_iseq(buf, ':'))
+ return buf;
+
+ buf++;
+ while (*buf && pg_mblen(buf) == 1)
+ {
+ switch (*buf)
+ {
+ case 'a':
+ case 'A':
+ *weight |= 1 << 3;
+ break;
+ case 'b':
+ case 'B':
+ *weight |= 1 << 2;
+ break;
+ case 'c':
+ case 'C':
+ *weight |= 1 << 1;
+ break;
+ case 'd':
+ case 'D':
+ *weight |= 1;
+ break;
+ case '*':
+ *prefix = true;
+ break;
+ default:
+ return buf;
+ }
+ buf++;
+ }
+
+ return buf;
+}
+
+/*
+ * Parse phrase operator. The operator
+ * may take the following forms:
+ *
+ * a <N> b (distance is exactly N lexemes)
+ * a <-> b (default distance = 1)
+ *
+ * The buffer should begin with '<' char
+ */
+static bool
+parse_phrase_operator(TSQueryParserState pstate, int16 *distance)
+{
+ enum
+ {
+ PHRASE_OPEN = 0,
+ PHRASE_DIST,
+ PHRASE_CLOSE,
+ PHRASE_FINISH
+ } state = PHRASE_OPEN;
+ char *ptr = pstate->buf;
+ char *endptr;
+ long l = 1; /* default distance */
+
+ while (*ptr)
+ {
+ switch (state)
+ {
+ case PHRASE_OPEN:
+ if (t_iseq(ptr, '<'))
+ {
+ state = PHRASE_DIST;
+ ptr++;
+ }
+ else
+ return false;
+ break;
+
+ case PHRASE_DIST:
+ if (t_iseq(ptr, '-'))
+ {
+ state = PHRASE_CLOSE;
+ ptr++;
+ continue;
+ }
+
+ if (!t_isdigit(ptr))
+ return false;
+
+ errno = 0;
+ l = strtol(ptr, &endptr, 10);
+ if (ptr == endptr)
+ return false;
+ else if (errno == ERANGE || l < 0 || l > MAXENTRYPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("distance in phrase operator must be an integer value between zero and %d inclusive",
+ MAXENTRYPOS)));
+ else
+ {
+ state = PHRASE_CLOSE;
+ ptr = endptr;
+ }
+ break;
+
+ case PHRASE_CLOSE:
+ if (t_iseq(ptr, '>'))
+ {
+ state = PHRASE_FINISH;
+ ptr++;
+ }
+ else
+ return false;
+ break;
+
+ case PHRASE_FINISH:
+ *distance = (int16) l;
+ pstate->buf = ptr;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*
+ * Parse OR operator used in websearch_to_tsquery(), returns true if we
+ * believe that "OR" literal could be an operator OR
+ */
+static bool
+parse_or_operator(TSQueryParserState pstate)
+{
+ char *ptr = pstate->buf;
+
+ /* it should begin with "OR" literal */
+ if (pg_strncasecmp(ptr, "or", 2) != 0)
+ return false;
+
+ ptr += 2;
+
+ /*
+ * it shouldn't be a part of any word but somewhere later it should be
+ * some operand
+ */
+ if (*ptr == '\0') /* no operand */
+ return false;
+
+ /* it shouldn't be a part of any word */
+ if (t_iseq(ptr, '-') || t_iseq(ptr, '_') || t_isalpha(ptr) || t_isdigit(ptr))
+ return false;
+
+ for (;;)
+ {
+ ptr += pg_mblen(ptr);
+
+ if (*ptr == '\0') /* got end of string without operand */
+ return false;
+
+ /*
+ * Suppose, we found an operand, but could be a not correct operand.
+ * So we still treat OR literal as operation with possibly incorrect
+ * operand and will not search it as lexeme
+ */
+ if (!t_isspace(ptr))
+ break;
+ }
+
+ pstate->buf += 2;
+ return true;
+}
+
+static ts_tokentype
+gettoken_query_standard(TSQueryParserState state, int8 *operator,
+ int *lenval, char **strval,
+ int16 *weight, bool *prefix)
+{
+ *weight = 0;
+ *prefix = false;
+
+ while (true)
+ {
+ switch (state->state)
+ {
+ case WAITFIRSTOPERAND:
+ case WAITOPERAND:
+ if (t_iseq(state->buf, '!'))
+ {
+ state->buf++;
+ state->state = WAITOPERAND;
+ *operator = OP_NOT;
+ return PT_OPR;
+ }
+ else if (t_iseq(state->buf, '('))
+ {
+ state->buf++;
+ state->state = WAITOPERAND;
+ state->count++;
+ return PT_OPEN;
+ }
+ else if (t_iseq(state->buf, ':'))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in tsquery: \"%s\"",
+ state->buffer)));
+ }
+ else if (!t_isspace(state->buf))
+ {
+ /*
+ * We rely on the tsvector parser to parse the value for
+ * us
+ */
+ reset_tsvector_parser(state->valstate, state->buf);
+ if (gettoken_tsvector(state->valstate, strval, lenval,
+ NULL, NULL, &state->buf))
+ {
+ state->buf = get_modifiers(state->buf, weight, prefix);
+ state->state = WAITOPERATOR;
+ return PT_VAL;
+ }
+ else if (state->state == WAITFIRSTOPERAND)
+ {
+ return PT_END;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("no operand in tsquery: \"%s\"",
+ state->buffer)));
+ }
+ break;
+
+ case WAITOPERATOR:
+ if (t_iseq(state->buf, '&'))
+ {
+ state->buf++;
+ state->state = WAITOPERAND;
+ *operator = OP_AND;
+ return PT_OPR;
+ }
+ else if (t_iseq(state->buf, '|'))
+ {
+ state->buf++;
+ state->state = WAITOPERAND;
+ *operator = OP_OR;
+ return PT_OPR;
+ }
+ else if (parse_phrase_operator(state, weight))
+ {
+ /* weight var is used as storage for distance */
+ state->state = WAITOPERAND;
+ *operator = OP_PHRASE;
+ return PT_OPR;
+ }
+ else if (t_iseq(state->buf, ')'))
+ {
+ state->buf++;
+ state->count--;
+ return (state->count < 0) ? PT_ERR : PT_CLOSE;
+ }
+ else if (*state->buf == '\0')
+ {
+ return (state->count) ? PT_ERR : PT_END;
+ }
+ else if (!t_isspace(state->buf))
+ {
+ return PT_ERR;
+ }
+ break;
+ }
+
+ state->buf += pg_mblen(state->buf);
+ }
+}
+
+static ts_tokentype
+gettoken_query_websearch(TSQueryParserState state, int8 *operator,
+ int *lenval, char **strval,
+ int16 *weight, bool *prefix)
+{
+ *weight = 0;
+ *prefix = false;
+
+ while (true)
+ {
+ switch (state->state)
+ {
+ case WAITFIRSTOPERAND:
+ case WAITOPERAND:
+ if (t_iseq(state->buf, '-'))
+ {
+ state->buf++;
+ state->state = WAITOPERAND;
+
+ *operator = OP_NOT;
+ return PT_OPR;
+ }
+ else if (t_iseq(state->buf, '"'))
+ {
+ /* Everything in quotes is processed as a single token */
+
+ /* skip opening quote */
+ state->buf++;
+ *strval = state->buf;
+
+ /* iterate to the closing quote or end of the string */
+ while (*state->buf != '\0' && !t_iseq(state->buf, '"'))
+ state->buf++;
+ *lenval = state->buf - *strval;
+
+ /* skip closing quote if not end of the string */
+ if (*state->buf != '\0')
+ state->buf++;
+
+ state->state = WAITOPERATOR;
+ state->count++;
+ return PT_VAL;
+ }
+ else if (ISOPERATOR(state->buf))
+ {
+ /* or else gettoken_tsvector() will raise an error */
+ state->buf++;
+ state->state = WAITOPERAND;
+ continue;
+ }
+ else if (!t_isspace(state->buf))
+ {
+ /*
+ * We rely on the tsvector parser to parse the value for
+ * us
+ */
+ reset_tsvector_parser(state->valstate, state->buf);
+ if (gettoken_tsvector(state->valstate, strval, lenval,
+ NULL, NULL, &state->buf))
+ {
+ state->state = WAITOPERATOR;
+ return PT_VAL;
+ }
+ else if (state->state == WAITFIRSTOPERAND)
+ {
+ return PT_END;
+ }
+ else
+ {
+ /* finally, we have to provide an operand */
+ pushStop(state);
+ return PT_END;
+ }
+ }
+ break;
+
+ case WAITOPERATOR:
+ if (t_iseq(state->buf, '"'))
+ {
+ /*
+ * put implicit AND after an operand and handle this quote
+ * in WAITOPERAND
+ */
+ state->state = WAITOPERAND;
+ *operator = OP_AND;
+ return PT_OPR;
+ }
+ else if (parse_or_operator(state))
+ {
+ state->state = WAITOPERAND;
+ *operator = OP_OR;
+ return PT_OPR;
+ }
+ else if (*state->buf == '\0')
+ {
+ return PT_END;
+ }
+ else if (!t_isspace(state->buf))
+ {
+ /* put implicit AND after an operand */
+ *operator = OP_AND;
+ state->state = WAITOPERAND;
+ return PT_OPR;
+ }
+ break;
+ }
+
+ state->buf += pg_mblen(state->buf);
+ }
+}
+
+static ts_tokentype
+gettoken_query_plain(TSQueryParserState state, int8 *operator,
+ int *lenval, char **strval,
+ int16 *weight, bool *prefix)
+{
+ *weight = 0;
+ *prefix = false;
+
+ if (*state->buf == '\0')
+ return PT_END;
+
+ *strval = state->buf;
+ *lenval = strlen(state->buf);
+ state->buf += *lenval;
+ state->count++;
+ return PT_VAL;
+}
+
+/*
+ * Push an operator to state->polstr
+ */
+void
+pushOperator(TSQueryParserState state, int8 oper, int16 distance)
+{
+ QueryOperator *tmp;
+
+ Assert(oper == OP_NOT || oper == OP_AND || oper == OP_OR || oper == OP_PHRASE);
+
+ tmp = (QueryOperator *) palloc0(sizeof(QueryOperator));
+ tmp->type = QI_OPR;
+ tmp->oper = oper;
+ tmp->distance = (oper == OP_PHRASE) ? distance : 0;
+ /* left is filled in later with findoprnd */
+
+ state->polstr = lcons(tmp, state->polstr);
+}
+
+static void
+pushValue_internal(TSQueryParserState state, pg_crc32 valcrc, int distance, int lenval, int weight, bool prefix)
+{
+ QueryOperand *tmp;
+
+ if (distance >= MAXSTRPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("value is too big in tsquery: \"%s\"",
+ state->buffer)));
+ if (lenval >= MAXSTRLEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("operand is too long in tsquery: \"%s\"",
+ state->buffer)));
+
+ tmp = (QueryOperand *) palloc0(sizeof(QueryOperand));
+ tmp->type = QI_VAL;
+ tmp->weight = weight;
+ tmp->prefix = prefix;
+ tmp->valcrc = (int32) valcrc;
+ tmp->length = lenval;
+ tmp->distance = distance;
+
+ state->polstr = lcons(tmp, state->polstr);
+}
+
+/*
+ * Push an operand to state->polstr.
+ *
+ * strval must point to a string equal to state->curop. lenval is the length
+ * of the string.
+ */
+void
+pushValue(TSQueryParserState state, char *strval, int lenval, int16 weight, bool prefix)
+{
+ pg_crc32 valcrc;
+
+ if (lenval >= MAXSTRLEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("word is too long in tsquery: \"%s\"",
+ state->buffer)));
+
+ INIT_LEGACY_CRC32(valcrc);
+ COMP_LEGACY_CRC32(valcrc, strval, lenval);
+ FIN_LEGACY_CRC32(valcrc);
+ pushValue_internal(state, valcrc, state->curop - state->op, lenval, weight, prefix);
+
+ /* append the value string to state.op, enlarging buffer if needed first */
+ while (state->curop - state->op + lenval + 1 >= state->lenop)
+ {
+ int used = state->curop - state->op;
+
+ state->lenop *= 2;
+ state->op = (char *) repalloc((void *) state->op, state->lenop);
+ state->curop = state->op + used;
+ }
+ memcpy((void *) state->curop, (void *) strval, lenval);
+ state->curop += lenval;
+ *(state->curop) = '\0';
+ state->curop++;
+ state->sumlen += lenval + 1 /* \0 */ ;
+}
+
+
+/*
+ * Push a stopword placeholder to state->polstr
+ */
+void
+pushStop(TSQueryParserState state)
+{
+ QueryOperand *tmp;
+
+ tmp = (QueryOperand *) palloc0(sizeof(QueryOperand));
+ tmp->type = QI_VALSTOP;
+
+ state->polstr = lcons(tmp, state->polstr);
+}
+
+
+#define STACKDEPTH 32
+
+typedef struct OperatorElement
+{
+ int8 op;
+ int16 distance;
+} OperatorElement;
+
+static void
+pushOpStack(OperatorElement *stack, int *lenstack, int8 op, int16 distance)
+{
+ if (*lenstack == STACKDEPTH) /* internal error */
+ elog(ERROR, "tsquery stack too small");
+
+ stack[*lenstack].op = op;
+ stack[*lenstack].distance = distance;
+
+ (*lenstack)++;
+}
+
+static void
+cleanOpStack(TSQueryParserState state,
+ OperatorElement *stack, int *lenstack, int8 op)
+{
+ int opPriority = OP_PRIORITY(op);
+
+ while (*lenstack)
+ {
+ /* NOT is right associative unlike to others */
+ if ((op != OP_NOT && opPriority > OP_PRIORITY(stack[*lenstack - 1].op)) ||
+ (op == OP_NOT && opPriority >= OP_PRIORITY(stack[*lenstack - 1].op)))
+ break;
+
+ (*lenstack)--;
+ pushOperator(state, stack[*lenstack].op,
+ stack[*lenstack].distance);
+ }
+}
+
+/*
+ * Make polish (prefix) notation of query.
+ *
+ * See parse_tsquery for explanation of pushval.
+ */
+static void
+makepol(TSQueryParserState state,
+ PushFunction pushval,
+ Datum opaque)
+{
+ int8 operator = 0;
+ ts_tokentype type;
+ int lenval = 0;
+ char *strval = NULL;
+ OperatorElement opstack[STACKDEPTH];
+ int lenstack = 0;
+ int16 weight = 0;
+ bool prefix;
+
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ while ((type = state->gettoken(state, &operator,
+ &lenval, &strval,
+ &weight, &prefix)) != PT_END)
+ {
+ switch (type)
+ {
+ case PT_VAL:
+ pushval(opaque, state, strval, lenval, weight, prefix);
+ break;
+ case PT_OPR:
+ cleanOpStack(state, opstack, &lenstack, operator);
+ pushOpStack(opstack, &lenstack, operator, weight);
+ break;
+ case PT_OPEN:
+ makepol(state, pushval, opaque);
+ break;
+ case PT_CLOSE:
+ cleanOpStack(state, opstack, &lenstack, OP_OR /* lowest */ );
+ return;
+ case PT_ERR:
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in tsquery: \"%s\"",
+ state->buffer)));
+ }
+ }
+
+ cleanOpStack(state, opstack, &lenstack, OP_OR /* lowest */ );
+}
+
+static void
+findoprnd_recurse(QueryItem *ptr, uint32 *pos, int nnodes, bool *needcleanup)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (*pos >= nnodes)
+ elog(ERROR, "malformed tsquery: operand not found");
+
+ if (ptr[*pos].type == QI_VAL)
+ {
+ (*pos)++;
+ }
+ else if (ptr[*pos].type == QI_VALSTOP)
+ {
+ *needcleanup = true; /* we'll have to remove stop words */
+ (*pos)++;
+ }
+ else
+ {
+ Assert(ptr[*pos].type == QI_OPR);
+
+ if (ptr[*pos].qoperator.oper == OP_NOT)
+ {
+ ptr[*pos].qoperator.left = 1; /* fixed offset */
+ (*pos)++;
+
+ /* process the only argument */
+ findoprnd_recurse(ptr, pos, nnodes, needcleanup);
+ }
+ else
+ {
+ QueryOperator *curitem = &ptr[*pos].qoperator;
+ int tmp = *pos; /* save current position */
+
+ Assert(curitem->oper == OP_AND ||
+ curitem->oper == OP_OR ||
+ curitem->oper == OP_PHRASE);
+
+ (*pos)++;
+
+ /* process RIGHT argument */
+ findoprnd_recurse(ptr, pos, nnodes, needcleanup);
+
+ curitem->left = *pos - tmp; /* set LEFT arg's offset */
+
+ /* process LEFT argument */
+ findoprnd_recurse(ptr, pos, nnodes, needcleanup);
+ }
+ }
+}
+
+
+/*
+ * Fill in the left-fields previously left unfilled.
+ * The input QueryItems must be in polish (prefix) notation.
+ * Also, set *needcleanup to true if there are any QI_VALSTOP nodes.
+ */
+static void
+findoprnd(QueryItem *ptr, int size, bool *needcleanup)
+{
+ uint32 pos;
+
+ *needcleanup = false;
+ pos = 0;
+ findoprnd_recurse(ptr, &pos, size, needcleanup);
+
+ if (pos != size)
+ elog(ERROR, "malformed tsquery: extra nodes");
+}
+
+
+/*
+ * Each value (operand) in the query is passed to pushval. pushval can
+ * transform the simple value to an arbitrarily complex expression using
+ * pushValue and pushOperator. It must push a single value with pushValue,
+ * a complete expression with all operands, or a stopword placeholder
+ * with pushStop, otherwise the prefix notation representation will be broken,
+ * having an operator with no operand.
+ *
+ * opaque is passed on to pushval as is, pushval can use it to store its
+ * private state.
+ */
+TSQuery
+parse_tsquery(char *buf,
+ PushFunction pushval,
+ Datum opaque,
+ int flags)
+{
+ struct TSQueryParserStateData state;
+ int i;
+ TSQuery query;
+ int commonlen;
+ QueryItem *ptr;
+ ListCell *cell;
+ bool needcleanup;
+ int tsv_flags = P_TSV_OPR_IS_DELIM | P_TSV_IS_TSQUERY;
+
+ /* plain should not be used with web */
+ Assert((flags & (P_TSQ_PLAIN | P_TSQ_WEB)) != (P_TSQ_PLAIN | P_TSQ_WEB));
+
+ /* select suitable tokenizer */
+ if (flags & P_TSQ_PLAIN)
+ state.gettoken = gettoken_query_plain;
+ else if (flags & P_TSQ_WEB)
+ {
+ state.gettoken = gettoken_query_websearch;
+ tsv_flags |= P_TSV_IS_WEB;
+ }
+ else
+ state.gettoken = gettoken_query_standard;
+
+ /* init state */
+ state.buffer = buf;
+ state.buf = buf;
+ state.count = 0;
+ state.state = WAITFIRSTOPERAND;
+ state.polstr = NIL;
+
+ /* init value parser's state */
+ state.valstate = init_tsvector_parser(state.buffer, tsv_flags);
+
+ /* init list of operand */
+ state.sumlen = 0;
+ state.lenop = 64;
+ state.curop = state.op = (char *) palloc(state.lenop);
+ *(state.curop) = '\0';
+
+ /* parse query & make polish notation (postfix, but in reverse order) */
+ makepol(&state, pushval, opaque);
+
+ close_tsvector_parser(state.valstate);
+
+ if (list_length(state.polstr) == 0)
+ {
+ ereport(NOTICE,
+ (errmsg("text-search query doesn't contain lexemes: \"%s\"",
+ state.buffer)));
+ query = (TSQuery) palloc(HDRSIZETQ);
+ SET_VARSIZE(query, HDRSIZETQ);
+ query->size = 0;
+ return query;
+ }
+
+ if (TSQUERY_TOO_BIG(list_length(state.polstr), state.sumlen))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("tsquery is too large")));
+ commonlen = COMPUTESIZE(list_length(state.polstr), state.sumlen);
+
+ /* Pack the QueryItems in the final TSQuery struct to return to caller */
+ query = (TSQuery) palloc0(commonlen);
+ SET_VARSIZE(query, commonlen);
+ query->size = list_length(state.polstr);
+ ptr = GETQUERY(query);
+
+ /* Copy QueryItems to TSQuery */
+ i = 0;
+ foreach(cell, state.polstr)
+ {
+ QueryItem *item = (QueryItem *) lfirst(cell);
+
+ switch (item->type)
+ {
+ case QI_VAL:
+ memcpy(&ptr[i], item, sizeof(QueryOperand));
+ break;
+ case QI_VALSTOP:
+ ptr[i].type = QI_VALSTOP;
+ break;
+ case QI_OPR:
+ memcpy(&ptr[i], item, sizeof(QueryOperator));
+ break;
+ default:
+ elog(ERROR, "unrecognized QueryItem type: %d", item->type);
+ }
+ i++;
+ }
+
+ /* Copy all the operand strings to TSQuery */
+ memcpy((void *) GETOPERAND(query), (void *) state.op, state.sumlen);
+ pfree(state.op);
+
+ /*
+ * Set left operand pointers for every operator. While we're at it,
+ * detect whether there are any QI_VALSTOP nodes.
+ */
+ findoprnd(ptr, query->size, &needcleanup);
+
+ /*
+ * If there are QI_VALSTOP nodes, delete them and simplify the tree.
+ */
+ if (needcleanup)
+ query = cleanup_tsquery_stopwords(query);
+
+ return query;
+}
+
+static void
+pushval_asis(Datum opaque, TSQueryParserState state, char *strval, int lenval,
+ int16 weight, bool prefix)
+{
+ pushValue(state, strval, lenval, weight, prefix);
+}
+
+/*
+ * in without morphology
+ */
+Datum
+tsqueryin(PG_FUNCTION_ARGS)
+{
+ char *in = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_TSQUERY(parse_tsquery(in, pushval_asis, PointerGetDatum(NULL), 0));
+}
+
+/*
+ * out function
+ */
+typedef struct
+{
+ QueryItem *curpol;
+ char *buf;
+ char *cur;
+ char *op;
+ int buflen;
+} INFIX;
+
+/* Makes sure inf->buf is large enough for adding 'addsize' bytes */
+#define RESIZEBUF(inf, addsize) \
+while( ( (inf)->cur - (inf)->buf ) + (addsize) + 1 >= (inf)->buflen ) \
+{ \
+ int len = (inf)->cur - (inf)->buf; \
+ (inf)->buflen *= 2; \
+ (inf)->buf = (char*) repalloc( (void*)(inf)->buf, (inf)->buflen ); \
+ (inf)->cur = (inf)->buf + len; \
+}
+
+/*
+ * recursively traverse the tree and
+ * print it in infix (human-readable) form
+ */
+static void
+infix(INFIX *in, int parentPriority, bool rightPhraseOp)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->curpol->type == QI_VAL)
+ {
+ QueryOperand *curpol = &in->curpol->qoperand;
+ char *op = in->op + curpol->distance;
+ int clen;
+
+ RESIZEBUF(in, curpol->length * (pg_database_encoding_max_length() + 1) + 2 + 6);
+ *(in->cur) = '\'';
+ in->cur++;
+ while (*op)
+ {
+ if (t_iseq(op, '\''))
+ {
+ *(in->cur) = '\'';
+ in->cur++;
+ }
+ else if (t_iseq(op, '\\'))
+ {
+ *(in->cur) = '\\';
+ in->cur++;
+ }
+ COPYCHAR(in->cur, op);
+
+ clen = pg_mblen(op);
+ op += clen;
+ in->cur += clen;
+ }
+ *(in->cur) = '\'';
+ in->cur++;
+ if (curpol->weight || curpol->prefix)
+ {
+ *(in->cur) = ':';
+ in->cur++;
+ if (curpol->prefix)
+ {
+ *(in->cur) = '*';
+ in->cur++;
+ }
+ if (curpol->weight & (1 << 3))
+ {
+ *(in->cur) = 'A';
+ in->cur++;
+ }
+ if (curpol->weight & (1 << 2))
+ {
+ *(in->cur) = 'B';
+ in->cur++;
+ }
+ if (curpol->weight & (1 << 1))
+ {
+ *(in->cur) = 'C';
+ in->cur++;
+ }
+ if (curpol->weight & 1)
+ {
+ *(in->cur) = 'D';
+ in->cur++;
+ }
+ }
+ *(in->cur) = '\0';
+ in->curpol++;
+ }
+ else if (in->curpol->qoperator.oper == OP_NOT)
+ {
+ int priority = QO_PRIORITY(in->curpol);
+
+ if (priority < parentPriority)
+ {
+ RESIZEBUF(in, 2);
+ sprintf(in->cur, "( ");
+ in->cur = strchr(in->cur, '\0');
+ }
+ RESIZEBUF(in, 1);
+ *(in->cur) = '!';
+ in->cur++;
+ *(in->cur) = '\0';
+ in->curpol++;
+
+ infix(in, priority, false);
+ if (priority < parentPriority)
+ {
+ RESIZEBUF(in, 2);
+ sprintf(in->cur, " )");
+ in->cur = strchr(in->cur, '\0');
+ }
+ }
+ else
+ {
+ int8 op = in->curpol->qoperator.oper;
+ int priority = QO_PRIORITY(in->curpol);
+ int16 distance = in->curpol->qoperator.distance;
+ INFIX nrm;
+ bool needParenthesis = false;
+
+ in->curpol++;
+ if (priority < parentPriority ||
+ /* phrase operator depends on order */
+ (op == OP_PHRASE && rightPhraseOp))
+ {
+ needParenthesis = true;
+ RESIZEBUF(in, 2);
+ sprintf(in->cur, "( ");
+ in->cur = strchr(in->cur, '\0');
+ }
+
+ nrm.curpol = in->curpol;
+ nrm.op = in->op;
+ nrm.buflen = 16;
+ nrm.cur = nrm.buf = (char *) palloc(sizeof(char) * nrm.buflen);
+
+ /* get right operand */
+ infix(&nrm, priority, (op == OP_PHRASE));
+
+ /* get & print left operand */
+ in->curpol = nrm.curpol;
+ infix(in, priority, false);
+
+ /* print operator & right operand */
+ RESIZEBUF(in, 3 + (2 + 10 /* distance */ ) + (nrm.cur - nrm.buf));
+ switch (op)
+ {
+ case OP_OR:
+ sprintf(in->cur, " | %s", nrm.buf);
+ break;
+ case OP_AND:
+ sprintf(in->cur, " & %s", nrm.buf);
+ break;
+ case OP_PHRASE:
+ if (distance != 1)
+ sprintf(in->cur, " <%d> %s", distance, nrm.buf);
+ else
+ sprintf(in->cur, " <-> %s", nrm.buf);
+ break;
+ default:
+ /* OP_NOT is handled in above if-branch */
+ elog(ERROR, "unrecognized operator type: %d", op);
+ }
+ in->cur = strchr(in->cur, '\0');
+ pfree(nrm.buf);
+
+ if (needParenthesis)
+ {
+ RESIZEBUF(in, 2);
+ sprintf(in->cur, " )");
+ in->cur = strchr(in->cur, '\0');
+ }
+ }
+}
+
+Datum
+tsqueryout(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ INFIX nrm;
+
+ if (query->size == 0)
+ {
+ char *b = palloc(1);
+
+ *b = '\0';
+ PG_RETURN_POINTER(b);
+ }
+ nrm.curpol = GETQUERY(query);
+ nrm.buflen = 32;
+ nrm.cur = nrm.buf = (char *) palloc(sizeof(char) * nrm.buflen);
+ *(nrm.cur) = '\0';
+ nrm.op = GETOPERAND(query);
+ infix(&nrm, -1 /* lowest priority */ , false);
+
+ PG_FREE_IF_COPY(query, 0);
+ PG_RETURN_CSTRING(nrm.buf);
+}
+
+/*
+ * Binary Input / Output functions. The binary format is as follows:
+ *
+ * uint32 number of operators/operands in the query
+ *
+ * Followed by the operators and operands, in prefix notation. For each
+ * operand:
+ *
+ * uint8 type, QI_VAL
+ * uint8 weight
+ * operand text in client encoding, null-terminated
+ * uint8 prefix
+ *
+ * For each operator:
+ * uint8 type, QI_OPR
+ * uint8 operator, one of OP_AND, OP_PHRASE OP_OR, OP_NOT.
+ * uint16 distance (only for OP_PHRASE)
+ */
+Datum
+tsquerysend(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ StringInfoData buf;
+ int i;
+ QueryItem *item = GETQUERY(query);
+
+ pq_begintypsend(&buf);
+
+ pq_sendint32(&buf, query->size);
+ for (i = 0; i < query->size; i++)
+ {
+ pq_sendint8(&buf, item->type);
+
+ switch (item->type)
+ {
+ case QI_VAL:
+ pq_sendint8(&buf, item->qoperand.weight);
+ pq_sendint8(&buf, item->qoperand.prefix);
+ pq_sendstring(&buf, GETOPERAND(query) + item->qoperand.distance);
+ break;
+ case QI_OPR:
+ pq_sendint8(&buf, item->qoperator.oper);
+ if (item->qoperator.oper == OP_PHRASE)
+ pq_sendint16(&buf, item->qoperator.distance);
+ break;
+ default:
+ elog(ERROR, "unrecognized tsquery node type: %d", item->type);
+ }
+ item++;
+ }
+
+ PG_FREE_IF_COPY(query, 0);
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+tsqueryrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ TSQuery query;
+ int i,
+ len;
+ QueryItem *item;
+ int datalen;
+ char *ptr;
+ uint32 size;
+ const char **operands;
+ bool needcleanup;
+
+ size = pq_getmsgint(buf, sizeof(uint32));
+ if (size > (MaxAllocSize / sizeof(QueryItem)))
+ elog(ERROR, "invalid size of tsquery");
+
+ /* Allocate space to temporarily hold operand strings */
+ operands = palloc(size * sizeof(char *));
+
+ /* Allocate space for all the QueryItems. */
+ len = HDRSIZETQ + sizeof(QueryItem) * size;
+ query = (TSQuery) palloc0(len);
+ query->size = size;
+ item = GETQUERY(query);
+
+ datalen = 0;
+ for (i = 0; i < size; i++)
+ {
+ item->type = (int8) pq_getmsgint(buf, sizeof(int8));
+
+ if (item->type == QI_VAL)
+ {
+ size_t val_len; /* length after recoding to server
+ * encoding */
+ uint8 weight;
+ uint8 prefix;
+ const char *val;
+ pg_crc32 valcrc;
+
+ weight = (uint8) pq_getmsgint(buf, sizeof(uint8));
+ prefix = (uint8) pq_getmsgint(buf, sizeof(uint8));
+ val = pq_getmsgstring(buf);
+ val_len = strlen(val);
+
+ /* Sanity checks */
+
+ if (weight > 0xF)
+ elog(ERROR, "invalid tsquery: invalid weight bitmap");
+
+ if (val_len > MAXSTRLEN)
+ elog(ERROR, "invalid tsquery: operand too long");
+
+ if (datalen > MAXSTRPOS)
+ elog(ERROR, "invalid tsquery: total operand length exceeded");
+
+ /* Looks valid. */
+
+ INIT_LEGACY_CRC32(valcrc);
+ COMP_LEGACY_CRC32(valcrc, val, val_len);
+ FIN_LEGACY_CRC32(valcrc);
+
+ item->qoperand.weight = weight;
+ item->qoperand.prefix = (prefix) ? true : false;
+ item->qoperand.valcrc = (int32) valcrc;
+ item->qoperand.length = val_len;
+ item->qoperand.distance = datalen;
+
+ /*
+ * Operand strings are copied to the final struct after this loop;
+ * here we just collect them to an array
+ */
+ operands[i] = val;
+
+ datalen += val_len + 1; /* + 1 for the '\0' terminator */
+ }
+ else if (item->type == QI_OPR)
+ {
+ int8 oper;
+
+ oper = (int8) pq_getmsgint(buf, sizeof(int8));
+ if (oper != OP_NOT && oper != OP_OR && oper != OP_AND && oper != OP_PHRASE)
+ elog(ERROR, "invalid tsquery: unrecognized operator type %d",
+ (int) oper);
+ if (i == size - 1)
+ elog(ERROR, "invalid pointer to right operand");
+
+ item->qoperator.oper = oper;
+ if (oper == OP_PHRASE)
+ item->qoperator.distance = (int16) pq_getmsgint(buf, sizeof(int16));
+ }
+ else
+ elog(ERROR, "unrecognized tsquery node type: %d", item->type);
+
+ item++;
+ }
+
+ /* Enlarge buffer to make room for the operand values. */
+ query = (TSQuery) repalloc(query, len + datalen);
+ item = GETQUERY(query);
+ ptr = GETOPERAND(query);
+
+ /*
+ * Fill in the left-pointers. Checks that the tree is well-formed as a
+ * side-effect.
+ */
+ findoprnd(item, size, &needcleanup);
+
+ /* Can't have found any QI_VALSTOP nodes */
+ Assert(!needcleanup);
+
+ /* Copy operands to output struct */
+ for (i = 0; i < size; i++)
+ {
+ if (item->type == QI_VAL)
+ {
+ memcpy(ptr, operands[i], item->qoperand.length + 1);
+ ptr += item->qoperand.length + 1;
+ }
+ item++;
+ }
+
+ pfree(operands);
+
+ Assert(ptr - GETOPERAND(query) == datalen);
+
+ SET_VARSIZE(query, len + datalen);
+
+ PG_RETURN_TSQUERY(query);
+}
+
+/*
+ * debug function, used only for view query
+ * which will be executed in non-leaf pages in index
+ */
+Datum
+tsquerytree(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ INFIX nrm;
+ text *res;
+ QueryItem *q;
+ int len;
+
+ if (query->size == 0)
+ {
+ res = (text *) palloc(VARHDRSZ);
+ SET_VARSIZE(res, VARHDRSZ);
+ PG_RETURN_POINTER(res);
+ }
+
+ q = clean_NOT(GETQUERY(query), &len);
+
+ if (!q)
+ {
+ res = cstring_to_text("T");
+ }
+ else
+ {
+ nrm.curpol = q;
+ nrm.buflen = 32;
+ nrm.cur = nrm.buf = (char *) palloc(sizeof(char) * nrm.buflen);
+ *(nrm.cur) = '\0';
+ nrm.op = GETOPERAND(query);
+ infix(&nrm, -1, false);
+ res = cstring_to_text_with_len(nrm.buf, nrm.cur - nrm.buf);
+ pfree(q);
+ }
+
+ PG_FREE_IF_COPY(query, 0);
+
+ PG_RETURN_TEXT_P(res);
+}
diff --git a/src/backend/utils/adt/tsquery_cleanup.c b/src/backend/utils/adt/tsquery_cleanup.c
new file mode 100644
index 0000000..b77a787
--- /dev/null
+++ b/src/backend/utils/adt/tsquery_cleanup.c
@@ -0,0 +1,444 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery_cleanup.c
+ * Cleanup query from NOT values and/or stopword
+ * Utility functions to correct work.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery_cleanup.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
+
+typedef struct NODE
+{
+ struct NODE *left;
+ struct NODE *right;
+ QueryItem *valnode;
+} NODE;
+
+/*
+ * make query tree from plain view of query
+ */
+static NODE *
+maketree(QueryItem *in)
+{
+ NODE *node = (NODE *) palloc(sizeof(NODE));
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ node->valnode = in;
+ node->right = node->left = NULL;
+ if (in->type == QI_OPR)
+ {
+ node->right = maketree(in + 1);
+ if (in->qoperator.oper != OP_NOT)
+ node->left = maketree(in + in->qoperator.left);
+ }
+ return node;
+}
+
+/*
+ * Internal state for plaintree and plainnode
+ */
+typedef struct
+{
+ QueryItem *ptr;
+ int len; /* allocated size of ptr */
+ int cur; /* number of elements in ptr */
+} PLAINTREE;
+
+static void
+plainnode(PLAINTREE *state, NODE *node)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (state->cur == state->len)
+ {
+ state->len *= 2;
+ state->ptr = (QueryItem *) repalloc((void *) state->ptr, state->len * sizeof(QueryItem));
+ }
+ memcpy((void *) &(state->ptr[state->cur]), (void *) node->valnode, sizeof(QueryItem));
+ if (node->valnode->type == QI_VAL)
+ state->cur++;
+ else if (node->valnode->qoperator.oper == OP_NOT)
+ {
+ state->ptr[state->cur].qoperator.left = 1;
+ state->cur++;
+ plainnode(state, node->right);
+ }
+ else
+ {
+ int cur = state->cur;
+
+ state->cur++;
+ plainnode(state, node->right);
+ state->ptr[cur].qoperator.left = state->cur - cur;
+ plainnode(state, node->left);
+ }
+ pfree(node);
+}
+
+/*
+ * make plain view of tree from a NODE-tree representation
+ */
+static QueryItem *
+plaintree(NODE *root, int *len)
+{
+ PLAINTREE pl;
+
+ pl.cur = 0;
+ pl.len = 16;
+ if (root && (root->valnode->type == QI_VAL || root->valnode->type == QI_OPR))
+ {
+ pl.ptr = (QueryItem *) palloc(pl.len * sizeof(QueryItem));
+ plainnode(&pl, root);
+ }
+ else
+ pl.ptr = NULL;
+ *len = pl.cur;
+ return pl.ptr;
+}
+
+static void
+freetree(NODE *node)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (!node)
+ return;
+ if (node->left)
+ freetree(node->left);
+ if (node->right)
+ freetree(node->right);
+ pfree(node);
+}
+
+/*
+ * clean tree for ! operator.
+ * It's useful for debug, but in
+ * other case, such view is used with search in index.
+ * Operator ! always return TRUE
+ */
+static NODE *
+clean_NOT_intree(NODE *node)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (node->valnode->type == QI_VAL)
+ return node;
+
+ if (node->valnode->qoperator.oper == OP_NOT)
+ {
+ freetree(node);
+ return NULL;
+ }
+
+ /* operator & or | */
+ if (node->valnode->qoperator.oper == OP_OR)
+ {
+ if ((node->left = clean_NOT_intree(node->left)) == NULL ||
+ (node->right = clean_NOT_intree(node->right)) == NULL)
+ {
+ freetree(node);
+ return NULL;
+ }
+ }
+ else
+ {
+ NODE *res = node;
+
+ Assert(node->valnode->qoperator.oper == OP_AND ||
+ node->valnode->qoperator.oper == OP_PHRASE);
+
+ node->left = clean_NOT_intree(node->left);
+ node->right = clean_NOT_intree(node->right);
+ if (node->left == NULL && node->right == NULL)
+ {
+ pfree(node);
+ res = NULL;
+ }
+ else if (node->left == NULL)
+ {
+ res = node->right;
+ pfree(node);
+ }
+ else if (node->right == NULL)
+ {
+ res = node->left;
+ pfree(node);
+ }
+ return res;
+ }
+ return node;
+}
+
+QueryItem *
+clean_NOT(QueryItem *ptr, int *len)
+{
+ NODE *root = maketree(ptr);
+
+ return plaintree(clean_NOT_intree(root), len);
+}
+
+
+/*
+ * Remove QI_VALSTOP (stopword) nodes from query tree.
+ *
+ * Returns NULL if the query degenerates to nothing. Input must not be NULL.
+ *
+ * When we remove a phrase operator due to removing one or both of its
+ * arguments, we might need to adjust the distance of a parent phrase
+ * operator. For example, 'a' is a stopword, so:
+ * (b <-> a) <-> c should become b <2> c
+ * b <-> (a <-> c) should become b <2> c
+ * (b <-> (a <-> a)) <-> c should become b <3> c
+ * b <-> ((a <-> a) <-> c) should become b <3> c
+ * To handle that, we define two output parameters:
+ * ladd: amount to add to a phrase distance to the left of this node
+ * radd: amount to add to a phrase distance to the right of this node
+ * We need two outputs because we could need to bubble up adjustments to two
+ * different parent phrase operators. Consider
+ * w <-> (((a <-> x) <2> (y <3> a)) <-> z)
+ * After we've removed the two a's and are considering the <2> node (which is
+ * now just x <2> y), we have an ladd distance of 1 that needs to propagate
+ * up to the topmost (leftmost) <->, and an radd distance of 3 that needs to
+ * propagate to the rightmost <->, so that we'll end up with
+ * w <2> ((x <2> y) <4> z)
+ * Near the bottom of the tree, we may have subtrees consisting only of
+ * stopwords. The distances of any phrase operators within such a subtree are
+ * summed and propagated to both ladd and radd, since we don't know which side
+ * of the lowest surviving phrase operator we are in. The rule is that any
+ * subtree that degenerates to NULL must return equal values of ladd and radd,
+ * and the parent node dealing with it should incorporate only one of those.
+ *
+ * Currently, we only implement this adjustment for adjacent phrase operators.
+ * Thus for example 'x <-> ((a <-> y) | z)' will become 'x <-> (y | z)', which
+ * isn't ideal, but there is no way to represent the really desired semantics
+ * without some redesign of the tsquery structure. Certainly it would not be
+ * any better to convert that to 'x <2> (y | z)'. Since this is such a weird
+ * corner case, let it go for now. But we can fix it in cases where the
+ * intervening non-phrase operator also gets removed, for example
+ * '((x <-> a) | a) <-> y' will become 'x <2> y'.
+ */
+static NODE *
+clean_stopword_intree(NODE *node, int *ladd, int *radd)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ /* default output parameters indicate no change in parent distance */
+ *ladd = *radd = 0;
+
+ if (node->valnode->type == QI_VAL)
+ return node;
+ else if (node->valnode->type == QI_VALSTOP)
+ {
+ pfree(node);
+ return NULL;
+ }
+
+ Assert(node->valnode->type == QI_OPR);
+
+ if (node->valnode->qoperator.oper == OP_NOT)
+ {
+ /* NOT doesn't change pattern width, so just report child distances */
+ node->right = clean_stopword_intree(node->right, ladd, radd);
+ if (!node->right)
+ {
+ freetree(node);
+ return NULL;
+ }
+ }
+ else
+ {
+ NODE *res = node;
+ bool isphrase;
+ int ndistance,
+ lladd,
+ lradd,
+ rladd,
+ rradd;
+
+ /* First, recurse */
+ node->left = clean_stopword_intree(node->left, &lladd, &lradd);
+ node->right = clean_stopword_intree(node->right, &rladd, &rradd);
+
+ /* Check if current node is OP_PHRASE, get its distance */
+ isphrase = (node->valnode->qoperator.oper == OP_PHRASE);
+ ndistance = isphrase ? node->valnode->qoperator.distance : 0;
+
+ if (node->left == NULL && node->right == NULL)
+ {
+ /*
+ * When we collapse out a phrase node entirely, propagate its own
+ * distance into both *ladd and *radd; it is the responsibility of
+ * the parent node to count it only once. Also, for a phrase
+ * node, distances coming from children are summed and propagated
+ * up to parent (we assume lladd == lradd and rladd == rradd, else
+ * rule was broken at a lower level). But if this isn't a phrase
+ * node, take the larger of the two child distances; that
+ * corresponds to what TS_execute will do in non-stopword cases.
+ */
+ if (isphrase)
+ *ladd = *radd = lladd + ndistance + rladd;
+ else
+ *ladd = *radd = Max(lladd, rladd);
+ freetree(node);
+ return NULL;
+ }
+ else if (node->left == NULL)
+ {
+ /* Removing this operator and left subnode */
+ /* lladd and lradd are equal/redundant, don't count both */
+ if (isphrase)
+ {
+ /* operator's own distance must propagate to left */
+ *ladd = lladd + ndistance + rladd;
+ *radd = rradd;
+ }
+ else
+ {
+ /* at non-phrase op, just forget the left subnode entirely */
+ *ladd = rladd;
+ *radd = rradd;
+ }
+ res = node->right;
+ pfree(node);
+ }
+ else if (node->right == NULL)
+ {
+ /* Removing this operator and right subnode */
+ /* rladd and rradd are equal/redundant, don't count both */
+ if (isphrase)
+ {
+ /* operator's own distance must propagate to right */
+ *ladd = lladd;
+ *radd = lradd + ndistance + rradd;
+ }
+ else
+ {
+ /* at non-phrase op, just forget the right subnode entirely */
+ *ladd = lladd;
+ *radd = lradd;
+ }
+ res = node->left;
+ pfree(node);
+ }
+ else if (isphrase)
+ {
+ /* Absorb appropriate corrections at this level */
+ node->valnode->qoperator.distance += lradd + rladd;
+ /* Propagate up any unaccounted-for corrections */
+ *ladd = lladd;
+ *radd = rradd;
+ }
+ else
+ {
+ /* We're keeping a non-phrase operator, so ladd/radd remain 0 */
+ }
+
+ return res;
+ }
+ return node;
+}
+
+/*
+ * Number of elements in query tree
+ */
+static int32
+calcstrlen(NODE *node)
+{
+ int32 size = 0;
+
+ if (node->valnode->type == QI_VAL)
+ {
+ size = node->valnode->qoperand.length + 1;
+ }
+ else
+ {
+ Assert(node->valnode->type == QI_OPR);
+
+ size = calcstrlen(node->right);
+ if (node->valnode->qoperator.oper != OP_NOT)
+ size += calcstrlen(node->left);
+ }
+
+ return size;
+}
+
+/*
+ * Remove QI_VALSTOP (stopword) nodes from TSQuery.
+ */
+TSQuery
+cleanup_tsquery_stopwords(TSQuery in)
+{
+ int32 len,
+ lenstr,
+ commonlen,
+ i;
+ NODE *root;
+ int ladd,
+ radd;
+ TSQuery out;
+ QueryItem *items;
+ char *operands;
+
+ if (in->size == 0)
+ return in;
+
+ /* eliminate stop words */
+ root = clean_stopword_intree(maketree(GETQUERY(in)), &ladd, &radd);
+ if (root == NULL)
+ {
+ ereport(NOTICE,
+ (errmsg("text-search query contains only stop words or doesn't contain lexemes, ignored")));
+ out = palloc(HDRSIZETQ);
+ out->size = 0;
+ SET_VARSIZE(out, HDRSIZETQ);
+ return out;
+ }
+
+ /*
+ * Build TSQuery from plain view
+ */
+
+ lenstr = calcstrlen(root);
+ items = plaintree(root, &len);
+ commonlen = COMPUTESIZE(len, lenstr);
+
+ out = palloc(commonlen);
+ SET_VARSIZE(out, commonlen);
+ out->size = len;
+
+ memcpy(GETQUERY(out), items, len * sizeof(QueryItem));
+
+ items = GETQUERY(out);
+ operands = GETOPERAND(out);
+ for (i = 0; i < out->size; i++)
+ {
+ QueryOperand *op = (QueryOperand *) &items[i];
+
+ if (op->type != QI_VAL)
+ continue;
+
+ memcpy(operands, GETOPERAND(in) + op->distance, op->length);
+ operands[op->length] = '\0';
+ op->distance = operands - GETOPERAND(out);
+ operands += op->length + 1;
+ }
+
+ return out;
+}
diff --git a/src/backend/utils/adt/tsquery_gist.c b/src/backend/utils/adt/tsquery_gist.c
new file mode 100644
index 0000000..801469b
--- /dev/null
+++ b/src/backend/utils/adt/tsquery_gist.c
@@ -0,0 +1,277 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery_gist.c
+ * GiST index support for tsquery
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery_gist.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/gist.h"
+#include "access/stratnum.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+
+#define GETENTRY(vec,pos) DatumGetTSQuerySign((vec)->vector[pos].key)
+
+
+Datum
+gtsquery_compress(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ GISTENTRY *retval = entry;
+
+ if (entry->leafkey)
+ {
+ TSQuerySign sign;
+
+ retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
+ sign = makeTSQuerySign(DatumGetTSQuery(entry->key));
+
+ gistentryinit(*retval, TSQuerySignGetDatum(sign),
+ entry->rel, entry->page,
+ entry->offset, false);
+ }
+
+ PG_RETURN_POINTER(retval);
+}
+
+/*
+ * We do not need a decompress function, because the other gtsquery
+ * support functions work with the compressed representation.
+ */
+
+Datum
+gtsquery_consistent(PG_FUNCTION_ARGS)
+{
+ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
+
+ /* Oid subtype = PG_GETARG_OID(3); */
+ bool *recheck = (bool *) PG_GETARG_POINTER(4);
+ TSQuerySign key = DatumGetTSQuerySign(entry->key);
+ TSQuerySign sq = makeTSQuerySign(query);
+ bool retval;
+
+ /* All cases served by this function are inexact */
+ *recheck = true;
+
+ switch (strategy)
+ {
+ case RTContainsStrategyNumber:
+ if (GIST_LEAF(entry))
+ retval = (key & sq) == sq;
+ else
+ retval = (key & sq) != 0;
+ break;
+ case RTContainedByStrategyNumber:
+ if (GIST_LEAF(entry))
+ retval = (key & sq) == key;
+ else
+ retval = (key & sq) != 0;
+ break;
+ default:
+ retval = false;
+ }
+ PG_RETURN_BOOL(retval);
+}
+
+Datum
+gtsquery_union(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ int *size = (int *) PG_GETARG_POINTER(1);
+ TSQuerySign sign;
+ int i;
+
+ sign = 0;
+
+ for (i = 0; i < entryvec->n; i++)
+ sign |= GETENTRY(entryvec, i);
+
+ *size = sizeof(TSQuerySign);
+
+ PG_RETURN_TSQUERYSIGN(sign);
+}
+
+Datum
+gtsquery_same(PG_FUNCTION_ARGS)
+{
+ TSQuerySign a = PG_GETARG_TSQUERYSIGN(0);
+ TSQuerySign b = PG_GETARG_TSQUERYSIGN(1);
+ bool *result = (bool *) PG_GETARG_POINTER(2);
+
+ *result = (a == b);
+
+ PG_RETURN_POINTER(result);
+}
+
+static int
+sizebitvec(TSQuerySign sign)
+{
+ int size = 0,
+ i;
+
+ for (i = 0; i < TSQS_SIGLEN; i++)
+ size += 0x01 & (sign >> i);
+
+ return size;
+}
+
+static int
+hemdist(TSQuerySign a, TSQuerySign b)
+{
+ TSQuerySign res = a ^ b;
+
+ return sizebitvec(res);
+}
+
+Datum
+gtsquery_penalty(PG_FUNCTION_ARGS)
+{
+ TSQuerySign origval = DatumGetTSQuerySign(((GISTENTRY *) PG_GETARG_POINTER(0))->key);
+ TSQuerySign newval = DatumGetTSQuerySign(((GISTENTRY *) PG_GETARG_POINTER(1))->key);
+ float *penalty = (float *) PG_GETARG_POINTER(2);
+
+ *penalty = hemdist(origval, newval);
+
+ PG_RETURN_POINTER(penalty);
+}
+
+
+typedef struct
+{
+ OffsetNumber pos;
+ int32 cost;
+} SPLITCOST;
+
+static int
+comparecost(const void *a, const void *b)
+{
+ if (((const SPLITCOST *) a)->cost == ((const SPLITCOST *) b)->cost)
+ return 0;
+ else
+ return (((const SPLITCOST *) a)->cost > ((const SPLITCOST *) b)->cost) ? 1 : -1;
+}
+
+#define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) )
+
+Datum
+gtsquery_picksplit(PG_FUNCTION_ARGS)
+{
+ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
+ GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
+ OffsetNumber maxoff = entryvec->n - 2;
+ OffsetNumber k,
+ j;
+ TSQuerySign datum_l,
+ datum_r;
+ int32 size_alpha,
+ size_beta;
+ int32 size_waste,
+ waste = -1;
+ int32 nbytes;
+ OffsetNumber seed_1 = 0,
+ seed_2 = 0;
+ OffsetNumber *left,
+ *right;
+
+ SPLITCOST *costvector;
+
+ nbytes = (maxoff + 2) * sizeof(OffsetNumber);
+ left = v->spl_left = (OffsetNumber *) palloc(nbytes);
+ right = v->spl_right = (OffsetNumber *) palloc(nbytes);
+ v->spl_nleft = v->spl_nright = 0;
+
+ for (k = FirstOffsetNumber; k < maxoff; k = OffsetNumberNext(k))
+ for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j))
+ {
+ size_waste = hemdist(GETENTRY(entryvec, j), GETENTRY(entryvec, k));
+ if (size_waste > waste)
+ {
+ waste = size_waste;
+ seed_1 = k;
+ seed_2 = j;
+ }
+ }
+
+
+ if (seed_1 == 0 || seed_2 == 0)
+ {
+ seed_1 = 1;
+ seed_2 = 2;
+ }
+
+ datum_l = GETENTRY(entryvec, seed_1);
+ datum_r = GETENTRY(entryvec, seed_2);
+
+ maxoff = OffsetNumberNext(maxoff);
+ costvector = (SPLITCOST *) palloc(sizeof(SPLITCOST) * maxoff);
+ for (j = FirstOffsetNumber; j <= maxoff; j = OffsetNumberNext(j))
+ {
+ costvector[j - 1].pos = j;
+ size_alpha = hemdist(GETENTRY(entryvec, seed_1), GETENTRY(entryvec, j));
+ size_beta = hemdist(GETENTRY(entryvec, seed_2), GETENTRY(entryvec, j));
+ costvector[j - 1].cost = abs(size_alpha - size_beta);
+ }
+ qsort((void *) costvector, maxoff, sizeof(SPLITCOST), comparecost);
+
+ for (k = 0; k < maxoff; k++)
+ {
+ j = costvector[k].pos;
+ if (j == seed_1)
+ {
+ *left++ = j;
+ v->spl_nleft++;
+ continue;
+ }
+ else if (j == seed_2)
+ {
+ *right++ = j;
+ v->spl_nright++;
+ continue;
+ }
+ size_alpha = hemdist(datum_l, GETENTRY(entryvec, j));
+ size_beta = hemdist(datum_r, GETENTRY(entryvec, j));
+
+ if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.05))
+ {
+ datum_l |= GETENTRY(entryvec, j);
+ *left++ = j;
+ v->spl_nleft++;
+ }
+ else
+ {
+ datum_r |= GETENTRY(entryvec, j);
+ *right++ = j;
+ v->spl_nright++;
+ }
+ }
+
+ *right = *left = FirstOffsetNumber;
+ v->spl_ldatum = TSQuerySignGetDatum(datum_l);
+ v->spl_rdatum = TSQuerySignGetDatum(datum_r);
+
+ PG_RETURN_POINTER(v);
+}
+
+/*
+ * Formerly, gtsquery_consistent was declared in pg_proc.h with arguments
+ * that did not match the documented conventions for GiST support functions.
+ * We fixed that, but we still need a pg_proc entry with the old signature
+ * to support reloading pre-9.6 contrib/tsearch2 opclass declarations.
+ * This compatibility function should go away eventually.
+ */
+Datum
+gtsquery_consistent_oldsig(PG_FUNCTION_ARGS)
+{
+ return gtsquery_consistent(fcinfo);
+}
diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c
new file mode 100644
index 0000000..a784157
--- /dev/null
+++ b/src/backend/utils/adt/tsquery_op.c
@@ -0,0 +1,358 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery_op.c
+ * Various operations with tsquery
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery_op.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "lib/qunique.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+
+Datum
+tsquery_numnode(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ int nnode = query->size;
+
+ PG_FREE_IF_COPY(query, 0);
+ PG_RETURN_INT32(nnode);
+}
+
+static QTNode *
+join_tsqueries(TSQuery a, TSQuery b, int8 operator, uint16 distance)
+{
+ QTNode *res = (QTNode *) palloc0(sizeof(QTNode));
+
+ res->flags |= QTN_NEEDFREE;
+
+ res->valnode = (QueryItem *) palloc0(sizeof(QueryItem));
+ res->valnode->type = QI_OPR;
+ res->valnode->qoperator.oper = operator;
+ if (operator == OP_PHRASE)
+ res->valnode->qoperator.distance = distance;
+
+ res->child = (QTNode **) palloc0(sizeof(QTNode *) * 2);
+ res->child[0] = QT2QTN(GETQUERY(b), GETOPERAND(b));
+ res->child[1] = QT2QTN(GETQUERY(a), GETOPERAND(a));
+ res->nchild = 2;
+
+ return res;
+}
+
+Datum
+tsquery_and(PG_FUNCTION_ARGS)
+{
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0);
+ TSQuery b = PG_GETARG_TSQUERY_COPY(1);
+ QTNode *res;
+ TSQuery query;
+
+ if (a->size == 0)
+ {
+ PG_FREE_IF_COPY(a, 1);
+ PG_RETURN_POINTER(b);
+ }
+ else if (b->size == 0)
+ {
+ PG_FREE_IF_COPY(b, 1);
+ PG_RETURN_POINTER(a);
+ }
+
+ res = join_tsqueries(a, b, OP_AND, 0);
+
+ query = QTN2QT(res);
+
+ QTNFree(res);
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+
+ PG_RETURN_TSQUERY(query);
+}
+
+Datum
+tsquery_or(PG_FUNCTION_ARGS)
+{
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0);
+ TSQuery b = PG_GETARG_TSQUERY_COPY(1);
+ QTNode *res;
+ TSQuery query;
+
+ if (a->size == 0)
+ {
+ PG_FREE_IF_COPY(a, 1);
+ PG_RETURN_POINTER(b);
+ }
+ else if (b->size == 0)
+ {
+ PG_FREE_IF_COPY(b, 1);
+ PG_RETURN_POINTER(a);
+ }
+
+ res = join_tsqueries(a, b, OP_OR, 0);
+
+ query = QTN2QT(res);
+
+ QTNFree(res);
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+
+ PG_RETURN_TSQUERY(query);
+}
+
+Datum
+tsquery_phrase_distance(PG_FUNCTION_ARGS)
+{
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0);
+ TSQuery b = PG_GETARG_TSQUERY_COPY(1);
+ QTNode *res;
+ TSQuery query;
+ int32 distance = PG_GETARG_INT32(2);
+
+ if (distance < 0 || distance > MAXENTRYPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("distance in phrase operator must be an integer value between zero and %d inclusive",
+ MAXENTRYPOS)));
+ if (a->size == 0)
+ {
+ PG_FREE_IF_COPY(a, 1);
+ PG_RETURN_POINTER(b);
+ }
+ else if (b->size == 0)
+ {
+ PG_FREE_IF_COPY(b, 1);
+ PG_RETURN_POINTER(a);
+ }
+
+ res = join_tsqueries(a, b, OP_PHRASE, (uint16) distance);
+
+ query = QTN2QT(res);
+
+ QTNFree(res);
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+
+ PG_RETURN_TSQUERY(query);
+}
+
+Datum
+tsquery_phrase(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_POINTER(DirectFunctionCall3(tsquery_phrase_distance,
+ PG_GETARG_DATUM(0),
+ PG_GETARG_DATUM(1),
+ Int32GetDatum(1)));
+}
+
+Datum
+tsquery_not(PG_FUNCTION_ARGS)
+{
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0);
+ QTNode *res;
+ TSQuery query;
+
+ if (a->size == 0)
+ PG_RETURN_POINTER(a);
+
+ res = (QTNode *) palloc0(sizeof(QTNode));
+
+ res->flags |= QTN_NEEDFREE;
+
+ res->valnode = (QueryItem *) palloc0(sizeof(QueryItem));
+ res->valnode->type = QI_OPR;
+ res->valnode->qoperator.oper = OP_NOT;
+
+ res->child = (QTNode **) palloc0(sizeof(QTNode *));
+ res->child[0] = QT2QTN(GETQUERY(a), GETOPERAND(a));
+ res->nchild = 1;
+
+ query = QTN2QT(res);
+
+ QTNFree(res);
+ PG_FREE_IF_COPY(a, 0);
+
+ PG_RETURN_POINTER(query);
+}
+
+static int
+CompareTSQ(TSQuery a, TSQuery b)
+{
+ if (a->size != b->size)
+ {
+ return (a->size < b->size) ? -1 : 1;
+ }
+ else if (VARSIZE(a) != VARSIZE(b))
+ {
+ return (VARSIZE(a) < VARSIZE(b)) ? -1 : 1;
+ }
+ else if (a->size != 0)
+ {
+ QTNode *an = QT2QTN(GETQUERY(a), GETOPERAND(a));
+ QTNode *bn = QT2QTN(GETQUERY(b), GETOPERAND(b));
+ int res = QTNodeCompare(an, bn);
+
+ QTNFree(an);
+ QTNFree(bn);
+
+ return res;
+ }
+
+ return 0;
+}
+
+Datum
+tsquery_cmp(PG_FUNCTION_ARGS)
+{
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0);
+ TSQuery b = PG_GETARG_TSQUERY_COPY(1);
+ int res = CompareTSQ(a, b);
+
+ PG_FREE_IF_COPY(a, 0);
+ PG_FREE_IF_COPY(b, 1);
+
+ PG_RETURN_INT32(res);
+}
+
+#define CMPFUNC( NAME, CONDITION ) \
+Datum \
+NAME(PG_FUNCTION_ARGS) { \
+ TSQuery a = PG_GETARG_TSQUERY_COPY(0); \
+ TSQuery b = PG_GETARG_TSQUERY_COPY(1); \
+ int res = CompareTSQ(a,b); \
+ \
+ PG_FREE_IF_COPY(a,0); \
+ PG_FREE_IF_COPY(b,1); \
+ \
+ PG_RETURN_BOOL( CONDITION ); \
+} \
+/* keep compiler quiet - no extra ; */ \
+extern int no_such_variable
+
+CMPFUNC(tsquery_lt, res < 0);
+CMPFUNC(tsquery_le, res <= 0);
+CMPFUNC(tsquery_eq, res == 0);
+CMPFUNC(tsquery_ge, res >= 0);
+CMPFUNC(tsquery_gt, res > 0);
+CMPFUNC(tsquery_ne, res != 0);
+
+TSQuerySign
+makeTSQuerySign(TSQuery a)
+{
+ int i;
+ QueryItem *ptr = GETQUERY(a);
+ TSQuerySign sign = 0;
+
+ for (i = 0; i < a->size; i++)
+ {
+ if (ptr->type == QI_VAL)
+ sign |= ((TSQuerySign) 1) << (((unsigned int) ptr->qoperand.valcrc) % TSQS_SIGLEN);
+ ptr++;
+ }
+
+ return sign;
+}
+
+static char **
+collectTSQueryValues(TSQuery a, int *nvalues_p)
+{
+ QueryItem *ptr = GETQUERY(a);
+ char *operand = GETOPERAND(a);
+ char **values;
+ int nvalues = 0;
+ int i;
+
+ values = (char **) palloc(sizeof(char *) * a->size);
+
+ for (i = 0; i < a->size; i++)
+ {
+ if (ptr->type == QI_VAL)
+ {
+ int len = ptr->qoperand.length;
+ char *val;
+
+ val = palloc(len + 1);
+ memcpy(val, operand + ptr->qoperand.distance, len);
+ val[len] = '\0';
+
+ values[nvalues++] = val;
+ }
+ ptr++;
+ }
+
+ *nvalues_p = nvalues;
+ return values;
+}
+
+static int
+cmp_string(const void *a, const void *b)
+{
+ const char *sa = *((char *const *) a);
+ const char *sb = *((char *const *) b);
+
+ return strcmp(sa, sb);
+}
+
+Datum
+tsq_mcontains(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY(0);
+ TSQuery ex = PG_GETARG_TSQUERY(1);
+ char **query_values;
+ int query_nvalues;
+ char **ex_values;
+ int ex_nvalues;
+ bool result = true;
+
+ /* Extract the query terms into arrays */
+ query_values = collectTSQueryValues(query, &query_nvalues);
+ ex_values = collectTSQueryValues(ex, &ex_nvalues);
+
+ /* Sort and remove duplicates from both arrays */
+ qsort(query_values, query_nvalues, sizeof(char *), cmp_string);
+ query_nvalues = qunique(query_values, query_nvalues, sizeof(char *),
+ cmp_string);
+ qsort(ex_values, ex_nvalues, sizeof(char *), cmp_string);
+ ex_nvalues = qunique(ex_values, ex_nvalues, sizeof(char *), cmp_string);
+
+ if (ex_nvalues > query_nvalues)
+ result = false;
+ else
+ {
+ int i;
+ int j = 0;
+
+ for (i = 0; i < ex_nvalues; i++)
+ {
+ for (; j < query_nvalues; j++)
+ {
+ if (strcmp(ex_values[i], query_values[j]) == 0)
+ break;
+ }
+ if (j == query_nvalues)
+ {
+ result = false;
+ break;
+ }
+ }
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+tsq_mcontained(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(tsq_mcontains,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)));
+}
diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c
new file mode 100644
index 0000000..3bef5d7
--- /dev/null
+++ b/src/backend/utils/adt/tsquery_rewrite.c
@@ -0,0 +1,462 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery_rewrite.c
+ * Utilities for reconstructing tsquery
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery_rewrite.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "executor/spi.h"
+#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+
+
+/*
+ * If "node" is equal to "ex", return a copy of "subs" instead.
+ * If "ex" matches a subset of node's children, return a modified version
+ * of "node" in which those children are replaced with a copy of "subs".
+ * Otherwise return "node" unmodified.
+ *
+ * The QTN_NOCHANGE bit is set in successfully modified nodes, so that
+ * we won't uselessly recurse into them.
+ * Also, set *isfind true if we make a replacement.
+ */
+static QTNode *
+findeq(QTNode *node, QTNode *ex, QTNode *subs, bool *isfind)
+{
+ /* Can't match unless signature matches and node type matches. */
+ if ((node->sign & ex->sign) != ex->sign ||
+ node->valnode->type != ex->valnode->type)
+ return node;
+
+ /* Ignore nodes marked NOCHANGE, too. */
+ if (node->flags & QTN_NOCHANGE)
+ return node;
+
+ if (node->valnode->type == QI_OPR)
+ {
+ /* Must be same operator. */
+ if (node->valnode->qoperator.oper != ex->valnode->qoperator.oper)
+ return node;
+
+ if (node->nchild == ex->nchild)
+ {
+ /*
+ * Simple case: when same number of children, match if equal.
+ * (This is reliable when the children were sorted earlier.)
+ */
+ if (QTNEq(node, ex))
+ {
+ /* Match; delete node and return a copy of subs instead. */
+ QTNFree(node);
+ if (subs)
+ {
+ node = QTNCopy(subs);
+ node->flags |= QTN_NOCHANGE;
+ }
+ else
+ node = NULL;
+ *isfind = true;
+ }
+ }
+ else if (node->nchild > ex->nchild && ex->nchild > 0)
+ {
+ /*
+ * AND and OR are commutative/associative, so we should check if a
+ * subset of the children match. For example, if node is A|B|C,
+ * and ex is B|C, we have a match after we notionally convert node
+ * to A|(B|C). This does not work for NOT or PHRASE nodes, but we
+ * can't get here for those node types because they have a fixed
+ * number of children.
+ *
+ * Because we expect that the children are sorted, it suffices to
+ * make one pass through the two lists to find the matches.
+ */
+ bool *matched;
+ int nmatched;
+ int i,
+ j;
+
+ /* Assert that the subset rule is OK */
+ Assert(node->valnode->qoperator.oper == OP_AND ||
+ node->valnode->qoperator.oper == OP_OR);
+
+ /* matched[] will record which children of node matched */
+ matched = (bool *) palloc0(node->nchild * sizeof(bool));
+ nmatched = 0;
+ i = j = 0;
+ while (i < node->nchild && j < ex->nchild)
+ {
+ int cmp = QTNodeCompare(node->child[i], ex->child[j]);
+
+ if (cmp == 0)
+ {
+ /* match! */
+ matched[i] = true;
+ nmatched++;
+ i++, j++;
+ }
+ else if (cmp < 0)
+ {
+ /* node->child[i] has no match, ignore it */
+ i++;
+ }
+ else
+ {
+ /* ex->child[j] has no match; we can give up immediately */
+ break;
+ }
+ }
+
+ if (nmatched == ex->nchild)
+ {
+ /* collapse out the matched children of node */
+ j = 0;
+ for (i = 0; i < node->nchild; i++)
+ {
+ if (matched[i])
+ QTNFree(node->child[i]);
+ else
+ node->child[j++] = node->child[i];
+ }
+
+ /* and instead insert a copy of subs */
+ if (subs)
+ {
+ subs = QTNCopy(subs);
+ subs->flags |= QTN_NOCHANGE;
+ node->child[j++] = subs;
+ }
+
+ node->nchild = j;
+
+ /*
+ * At this point we might have a node with zero or one child,
+ * which should be simplified. But we leave it to our caller
+ * (dofindsubquery) to take care of that.
+ */
+
+ /*
+ * Re-sort the node to put new child in the right place. This
+ * is a bit bogus, because it won't matter for findsubquery's
+ * remaining processing, and it's insufficient to prepare the
+ * tree for another search (we would need to re-flatten as
+ * well, and we don't want to do that because we'd lose the
+ * QTN_NOCHANGE marking on the new child). But it's needed to
+ * keep the results the same as the regression tests expect.
+ */
+ QTNSort(node);
+
+ *isfind = true;
+ }
+
+ pfree(matched);
+ }
+ }
+ else
+ {
+ Assert(node->valnode->type == QI_VAL);
+
+ if (node->valnode->qoperand.valcrc != ex->valnode->qoperand.valcrc)
+ return node;
+ else if (QTNEq(node, ex))
+ {
+ QTNFree(node);
+ if (subs)
+ {
+ node = QTNCopy(subs);
+ node->flags |= QTN_NOCHANGE;
+ }
+ else
+ {
+ node = NULL;
+ }
+ *isfind = true;
+ }
+ }
+
+ return node;
+}
+
+/*
+ * Recursive guts of findsubquery(): attempt to replace "ex" with "subs"
+ * at the root node, and if we failed to do so, recursively match against
+ * child nodes.
+ *
+ * Delete any void subtrees resulting from the replacement.
+ * In the following example '5' is replaced by empty operand:
+ *
+ * AND -> 6
+ * / \
+ * 5 OR
+ * / \
+ * 6 5
+ */
+static QTNode *
+dofindsubquery(QTNode *root, QTNode *ex, QTNode *subs, bool *isfind)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ /* also, since it's a bit expensive, let's check for query cancel. */
+ CHECK_FOR_INTERRUPTS();
+
+ /* match at the node itself */
+ root = findeq(root, ex, subs, isfind);
+
+ /* unless we matched here, consider matches at child nodes */
+ if (root && (root->flags & QTN_NOCHANGE) == 0 &&
+ root->valnode->type == QI_OPR)
+ {
+ int i,
+ j = 0;
+
+ /*
+ * Any subtrees that are replaced by NULL must be dropped from the
+ * tree.
+ */
+ for (i = 0; i < root->nchild; i++)
+ {
+ root->child[j] = dofindsubquery(root->child[i], ex, subs, isfind);
+ if (root->child[j])
+ j++;
+ }
+
+ root->nchild = j;
+
+ /*
+ * If we have just zero or one remaining child node, simplify out this
+ * operator node.
+ */
+ if (root->nchild == 0)
+ {
+ QTNFree(root);
+ root = NULL;
+ }
+ else if (root->nchild == 1 && root->valnode->qoperator.oper != OP_NOT)
+ {
+ QTNode *nroot = root->child[0];
+
+ pfree(root);
+ root = nroot;
+ }
+ }
+
+ return root;
+}
+
+/*
+ * Substitute "subs" for "ex" throughout the QTNode tree at root.
+ *
+ * If isfind isn't NULL, set *isfind to show whether we made any substitution.
+ *
+ * Both "root" and "ex" must have been through QTNTernary and QTNSort
+ * to ensure reliable matching.
+ */
+QTNode *
+findsubquery(QTNode *root, QTNode *ex, QTNode *subs, bool *isfind)
+{
+ bool DidFind = false;
+
+ root = dofindsubquery(root, ex, subs, &DidFind);
+
+ if (isfind)
+ *isfind = DidFind;
+
+ return root;
+}
+
+Datum
+tsquery_rewrite_query(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY_COPY(0);
+ text *in = PG_GETARG_TEXT_PP(1);
+ TSQuery rewrited = query;
+ MemoryContext outercontext = CurrentMemoryContext;
+ MemoryContext oldcontext;
+ QTNode *tree;
+ char *buf;
+ SPIPlanPtr plan;
+ Portal portal;
+ bool isnull;
+
+ if (query->size == 0)
+ {
+ PG_FREE_IF_COPY(in, 1);
+ PG_RETURN_POINTER(rewrited);
+ }
+
+ tree = QT2QTN(GETQUERY(query), GETOPERAND(query));
+ QTNTernary(tree);
+ QTNSort(tree);
+
+ buf = text_to_cstring(in);
+
+ SPI_connect();
+
+ if ((plan = SPI_prepare(buf, 0, NULL)) == NULL)
+ elog(ERROR, "SPI_prepare(\"%s\") failed", buf);
+
+ if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
+ elog(ERROR, "SPI_cursor_open(\"%s\") failed", buf);
+
+ SPI_cursor_fetch(portal, true, 100);
+
+ if (SPI_tuptable == NULL ||
+ SPI_tuptable->tupdesc->natts != 2 ||
+ SPI_gettypeid(SPI_tuptable->tupdesc, 1) != TSQUERYOID ||
+ SPI_gettypeid(SPI_tuptable->tupdesc, 2) != TSQUERYOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("ts_rewrite query must return two tsquery columns")));
+
+ while (SPI_processed > 0 && tree)
+ {
+ uint64 i;
+
+ for (i = 0; i < SPI_processed && tree; i++)
+ {
+ Datum qdata = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &isnull);
+ Datum sdata;
+
+ if (isnull)
+ continue;
+
+ sdata = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2, &isnull);
+
+ if (!isnull)
+ {
+ TSQuery qtex = DatumGetTSQuery(qdata);
+ TSQuery qtsubs = DatumGetTSQuery(sdata);
+ QTNode *qex,
+ *qsubs = NULL;
+
+ if (qtex->size == 0)
+ {
+ if (qtex != (TSQuery) DatumGetPointer(qdata))
+ pfree(qtex);
+ if (qtsubs != (TSQuery) DatumGetPointer(sdata))
+ pfree(qtsubs);
+ continue;
+ }
+
+ qex = QT2QTN(GETQUERY(qtex), GETOPERAND(qtex));
+
+ QTNTernary(qex);
+ QTNSort(qex);
+
+ if (qtsubs->size)
+ qsubs = QT2QTN(GETQUERY(qtsubs), GETOPERAND(qtsubs));
+
+ oldcontext = MemoryContextSwitchTo(outercontext);
+ tree = findsubquery(tree, qex, qsubs, NULL);
+ MemoryContextSwitchTo(oldcontext);
+
+ QTNFree(qex);
+ if (qtex != (TSQuery) DatumGetPointer(qdata))
+ pfree(qtex);
+ QTNFree(qsubs);
+ if (qtsubs != (TSQuery) DatumGetPointer(sdata))
+ pfree(qtsubs);
+
+ if (tree)
+ {
+ /* ready the tree for another pass */
+ QTNClearFlags(tree, QTN_NOCHANGE);
+ QTNTernary(tree);
+ QTNSort(tree);
+ }
+ }
+ }
+
+ SPI_freetuptable(SPI_tuptable);
+ SPI_cursor_fetch(portal, true, 100);
+ }
+
+ SPI_freetuptable(SPI_tuptable);
+ SPI_cursor_close(portal);
+ SPI_freeplan(plan);
+ SPI_finish();
+
+ if (tree)
+ {
+ QTNBinary(tree);
+ rewrited = QTN2QT(tree);
+ QTNFree(tree);
+ PG_FREE_IF_COPY(query, 0);
+ }
+ else
+ {
+ SET_VARSIZE(rewrited, HDRSIZETQ);
+ rewrited->size = 0;
+ }
+
+ pfree(buf);
+ PG_FREE_IF_COPY(in, 1);
+ PG_RETURN_POINTER(rewrited);
+}
+
+Datum
+tsquery_rewrite(PG_FUNCTION_ARGS)
+{
+ TSQuery query = PG_GETARG_TSQUERY_COPY(0);
+ TSQuery ex = PG_GETARG_TSQUERY(1);
+ TSQuery subst = PG_GETARG_TSQUERY(2);
+ TSQuery rewrited = query;
+ QTNode *tree,
+ *qex,
+ *subs = NULL;
+
+ if (query->size == 0 || ex->size == 0)
+ {
+ PG_FREE_IF_COPY(ex, 1);
+ PG_FREE_IF_COPY(subst, 2);
+ PG_RETURN_POINTER(rewrited);
+ }
+
+ tree = QT2QTN(GETQUERY(query), GETOPERAND(query));
+ QTNTernary(tree);
+ QTNSort(tree);
+
+ qex = QT2QTN(GETQUERY(ex), GETOPERAND(ex));
+ QTNTernary(qex);
+ QTNSort(qex);
+
+ if (subst->size)
+ subs = QT2QTN(GETQUERY(subst), GETOPERAND(subst));
+
+ tree = findsubquery(tree, qex, subs, NULL);
+
+ QTNFree(qex);
+ QTNFree(subs);
+
+ if (!tree)
+ {
+ SET_VARSIZE(rewrited, HDRSIZETQ);
+ rewrited->size = 0;
+ PG_FREE_IF_COPY(ex, 1);
+ PG_FREE_IF_COPY(subst, 2);
+ PG_RETURN_POINTER(rewrited);
+ }
+ else
+ {
+ QTNBinary(tree);
+ rewrited = QTN2QT(tree);
+ QTNFree(tree);
+ }
+
+ PG_FREE_IF_COPY(query, 0);
+ PG_FREE_IF_COPY(ex, 1);
+ PG_FREE_IF_COPY(subst, 2);
+ PG_RETURN_POINTER(rewrited);
+}
diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c
new file mode 100644
index 0000000..191b58e
--- /dev/null
+++ b/src/backend/utils/adt/tsquery_util.c
@@ -0,0 +1,447 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsquery_util.c
+ * Utilities for tsquery datatype
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsquery_util.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
+
+/*
+ * Build QTNode tree for a tsquery given in QueryItem array format.
+ */
+QTNode *
+QT2QTN(QueryItem *in, char *operand)
+{
+ QTNode *node = (QTNode *) palloc0(sizeof(QTNode));
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ node->valnode = in;
+
+ if (in->type == QI_OPR)
+ {
+ node->child = (QTNode **) palloc0(sizeof(QTNode *) * 2);
+ node->child[0] = QT2QTN(in + 1, operand);
+ node->sign = node->child[0]->sign;
+ if (in->qoperator.oper == OP_NOT)
+ node->nchild = 1;
+ else
+ {
+ node->nchild = 2;
+ node->child[1] = QT2QTN(in + in->qoperator.left, operand);
+ node->sign |= node->child[1]->sign;
+ }
+ }
+ else if (operand)
+ {
+ node->word = operand + in->qoperand.distance;
+ node->sign = ((uint32) 1) << (((unsigned int) in->qoperand.valcrc) % 32);
+ }
+
+ return node;
+}
+
+/*
+ * Free a QTNode tree.
+ *
+ * Referenced "word" and "valnode" items are freed if marked as transient
+ * by flags.
+ */
+void
+QTNFree(QTNode *in)
+{
+ if (!in)
+ return;
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->valnode->type == QI_VAL && in->word && (in->flags & QTN_WORDFREE) != 0)
+ pfree(in->word);
+
+ if (in->valnode->type == QI_OPR)
+ {
+ int i;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNFree(in->child[i]);
+ }
+ if (in->child)
+ pfree(in->child);
+
+ if (in->flags & QTN_NEEDFREE)
+ pfree(in->valnode);
+
+ pfree(in);
+}
+
+/*
+ * Sort comparator for QTNodes.
+ *
+ * The sort order is somewhat arbitrary.
+ */
+int
+QTNodeCompare(QTNode *an, QTNode *bn)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (an->valnode->type != bn->valnode->type)
+ return (an->valnode->type > bn->valnode->type) ? -1 : 1;
+
+ if (an->valnode->type == QI_OPR)
+ {
+ QueryOperator *ao = &an->valnode->qoperator;
+ QueryOperator *bo = &bn->valnode->qoperator;
+
+ if (ao->oper != bo->oper)
+ return (ao->oper > bo->oper) ? -1 : 1;
+
+ if (an->nchild != bn->nchild)
+ return (an->nchild > bn->nchild) ? -1 : 1;
+
+ {
+ int i,
+ res;
+
+ for (i = 0; i < an->nchild; i++)
+ if ((res = QTNodeCompare(an->child[i], bn->child[i])) != 0)
+ return res;
+ }
+
+ if (ao->oper == OP_PHRASE && ao->distance != bo->distance)
+ return (ao->distance > bo->distance) ? -1 : 1;
+
+ return 0;
+ }
+ else if (an->valnode->type == QI_VAL)
+ {
+ QueryOperand *ao = &an->valnode->qoperand;
+ QueryOperand *bo = &bn->valnode->qoperand;
+
+ if (ao->valcrc != bo->valcrc)
+ {
+ return (ao->valcrc > bo->valcrc) ? -1 : 1;
+ }
+
+ return tsCompareString(an->word, ao->length, bn->word, bo->length, false);
+ }
+ else
+ {
+ elog(ERROR, "unrecognized QueryItem type: %d", an->valnode->type);
+ return 0; /* keep compiler quiet */
+ }
+}
+
+/*
+ * qsort comparator for QTNode pointers.
+ */
+static int
+cmpQTN(const void *a, const void *b)
+{
+ return QTNodeCompare(*(QTNode *const *) a, *(QTNode *const *) b);
+}
+
+/*
+ * Canonicalize a QTNode tree by sorting the children of AND/OR nodes
+ * into an arbitrary but well-defined order.
+ */
+void
+QTNSort(QTNode *in)
+{
+ int i;
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->valnode->type != QI_OPR)
+ return;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNSort(in->child[i]);
+ if (in->nchild > 1 && in->valnode->qoperator.oper != OP_PHRASE)
+ qsort((void *) in->child, in->nchild, sizeof(QTNode *), cmpQTN);
+}
+
+/*
+ * Are two QTNode trees equal according to QTNodeCompare?
+ */
+bool
+QTNEq(QTNode *a, QTNode *b)
+{
+ uint32 sign = a->sign & b->sign;
+
+ if (!(sign == a->sign && sign == b->sign))
+ return false;
+
+ return (QTNodeCompare(a, b) == 0);
+}
+
+/*
+ * Remove unnecessary intermediate nodes. For example:
+ *
+ * OR OR
+ * a OR -> a b c
+ * b c
+ */
+void
+QTNTernary(QTNode *in)
+{
+ int i;
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->valnode->type != QI_OPR)
+ return;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNTernary(in->child[i]);
+
+ /* Only AND and OR are associative, so don't flatten other node types */
+ if (in->valnode->qoperator.oper != OP_AND &&
+ in->valnode->qoperator.oper != OP_OR)
+ return;
+
+ for (i = 0; i < in->nchild; i++)
+ {
+ QTNode *cc = in->child[i];
+
+ if (cc->valnode->type == QI_OPR &&
+ in->valnode->qoperator.oper == cc->valnode->qoperator.oper)
+ {
+ int oldnchild = in->nchild;
+
+ in->nchild += cc->nchild - 1;
+ in->child = (QTNode **) repalloc(in->child, in->nchild * sizeof(QTNode *));
+
+ if (i + 1 != oldnchild)
+ memmove(in->child + i + cc->nchild, in->child + i + 1,
+ (oldnchild - i - 1) * sizeof(QTNode *));
+
+ memcpy(in->child + i, cc->child, cc->nchild * sizeof(QTNode *));
+ i += cc->nchild - 1;
+
+ if (cc->flags & QTN_NEEDFREE)
+ pfree(cc->valnode);
+ pfree(cc);
+ }
+ }
+}
+
+/*
+ * Convert a tree to binary tree by inserting intermediate nodes.
+ * (Opposite of QTNTernary)
+ */
+void
+QTNBinary(QTNode *in)
+{
+ int i;
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->valnode->type != QI_OPR)
+ return;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNBinary(in->child[i]);
+
+ while (in->nchild > 2)
+ {
+ QTNode *nn = (QTNode *) palloc0(sizeof(QTNode));
+
+ nn->valnode = (QueryItem *) palloc0(sizeof(QueryItem));
+ nn->child = (QTNode **) palloc0(sizeof(QTNode *) * 2);
+
+ nn->nchild = 2;
+ nn->flags = QTN_NEEDFREE;
+
+ nn->child[0] = in->child[0];
+ nn->child[1] = in->child[1];
+ nn->sign = nn->child[0]->sign | nn->child[1]->sign;
+
+ nn->valnode->type = in->valnode->type;
+ nn->valnode->qoperator.oper = in->valnode->qoperator.oper;
+
+ in->child[0] = nn;
+ in->child[1] = in->child[in->nchild - 1];
+ in->nchild--;
+ }
+}
+
+/*
+ * Count the total length of operand strings in tree (including '\0'-
+ * terminators) and the total number of nodes.
+ * Caller must initialize *sumlen and *nnode to zeroes.
+ */
+static void
+cntsize(QTNode *in, int *sumlen, int *nnode)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ *nnode += 1;
+ if (in->valnode->type == QI_OPR)
+ {
+ int i;
+
+ for (i = 0; i < in->nchild; i++)
+ cntsize(in->child[i], sumlen, nnode);
+ }
+ else
+ {
+ *sumlen += in->valnode->qoperand.length + 1;
+ }
+}
+
+typedef struct
+{
+ QueryItem *curitem;
+ char *operand;
+ char *curoperand;
+} QTN2QTState;
+
+/*
+ * Recursively convert a QTNode tree into flat tsquery format.
+ * Caller must have allocated arrays of the correct size.
+ */
+static void
+fillQT(QTN2QTState *state, QTNode *in)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ if (in->valnode->type == QI_VAL)
+ {
+ memcpy(state->curitem, in->valnode, sizeof(QueryOperand));
+
+ memcpy(state->curoperand, in->word, in->valnode->qoperand.length);
+ state->curitem->qoperand.distance = state->curoperand - state->operand;
+ state->curoperand[in->valnode->qoperand.length] = '\0';
+ state->curoperand += in->valnode->qoperand.length + 1;
+ state->curitem++;
+ }
+ else
+ {
+ QueryItem *curitem = state->curitem;
+
+ Assert(in->valnode->type == QI_OPR);
+
+ memcpy(state->curitem, in->valnode, sizeof(QueryOperator));
+
+ Assert(in->nchild <= 2);
+ state->curitem++;
+
+ fillQT(state, in->child[0]);
+
+ if (in->nchild == 2)
+ {
+ curitem->qoperator.left = state->curitem - curitem;
+ fillQT(state, in->child[1]);
+ }
+ }
+}
+
+/*
+ * Build flat tsquery from a QTNode tree.
+ */
+TSQuery
+QTN2QT(QTNode *in)
+{
+ TSQuery out;
+ int len;
+ int sumlen = 0,
+ nnode = 0;
+ QTN2QTState state;
+
+ cntsize(in, &sumlen, &nnode);
+
+ if (TSQUERY_TOO_BIG(nnode, sumlen))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("tsquery is too large")));
+ len = COMPUTESIZE(nnode, sumlen);
+
+ out = (TSQuery) palloc0(len);
+ SET_VARSIZE(out, len);
+ out->size = nnode;
+
+ state.curitem = GETQUERY(out);
+ state.operand = state.curoperand = GETOPERAND(out);
+
+ fillQT(&state, in);
+ return out;
+}
+
+/*
+ * Copy a QTNode tree.
+ *
+ * Modifiable copies of the words and valnodes are made, too.
+ */
+QTNode *
+QTNCopy(QTNode *in)
+{
+ QTNode *out;
+
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ out = (QTNode *) palloc(sizeof(QTNode));
+
+ *out = *in;
+ out->valnode = (QueryItem *) palloc(sizeof(QueryItem));
+ *(out->valnode) = *(in->valnode);
+ out->flags |= QTN_NEEDFREE;
+
+ if (in->valnode->type == QI_VAL)
+ {
+ out->word = palloc(in->valnode->qoperand.length + 1);
+ memcpy(out->word, in->word, in->valnode->qoperand.length);
+ out->word[in->valnode->qoperand.length] = '\0';
+ out->flags |= QTN_WORDFREE;
+ }
+ else
+ {
+ int i;
+
+ out->child = (QTNode **) palloc(sizeof(QTNode *) * in->nchild);
+
+ for (i = 0; i < in->nchild; i++)
+ out->child[i] = QTNCopy(in->child[i]);
+ }
+
+ return out;
+}
+
+/*
+ * Clear the specified flag bit(s) in all nodes of a QTNode tree.
+ */
+void
+QTNClearFlags(QTNode *in, uint32 flags)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ in->flags &= ~flags;
+
+ if (in->valnode->type != QI_VAL)
+ {
+ int i;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNClearFlags(in->child[i], flags);
+ }
+}
diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c
new file mode 100644
index 0000000..3858fc5
--- /dev/null
+++ b/src/backend/utils/adt/tsrank.c
@@ -0,0 +1,1012 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsrank.c
+ * rank tsvector by tsquery
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsrank.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+#include <math.h>
+
+#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+
+static const float weights[] = {0.1f, 0.2f, 0.4f, 1.0f};
+
+#define wpos(wep) ( w[ WEP_GETWEIGHT(wep) ] )
+
+#define RANK_NO_NORM 0x00
+#define RANK_NORM_LOGLENGTH 0x01
+#define RANK_NORM_LENGTH 0x02
+#define RANK_NORM_EXTDIST 0x04
+#define RANK_NORM_UNIQ 0x08
+#define RANK_NORM_LOGUNIQ 0x10
+#define RANK_NORM_RDIVRPLUS1 0x20
+#define DEF_NORM_METHOD RANK_NO_NORM
+
+static float calc_rank_or(const float *w, TSVector t, TSQuery q);
+static float calc_rank_and(const float *w, TSVector t, TSQuery q);
+
+/*
+ * Returns a weight of a word collocation
+ */
+static float4
+word_distance(int32 w)
+{
+ if (w > 100)
+ return 1e-30f;
+
+ return 1.0 / (1.005 + 0.05 * exp(((float4) w) / 1.5 - 2));
+}
+
+static int
+cnt_length(TSVector t)
+{
+ WordEntry *ptr = ARRPTR(t),
+ *end = (WordEntry *) STRPTR(t);
+ int len = 0;
+
+ while (ptr < end)
+ {
+ int clen = POSDATALEN(t, ptr);
+
+ if (clen == 0)
+ len += 1;
+ else
+ len += clen;
+
+ ptr++;
+ }
+
+ return len;
+}
+
+
+#define WordECompareQueryItem(e,q,p,i,m) \
+ tsCompareString((q) + (i)->distance, (i)->length, \
+ (e) + (p)->pos, (p)->len, (m))
+
+
+/*
+ * Returns a pointer to a WordEntry's array corresponding to 'item' from
+ * tsvector 't'. 'q' is the TSQuery containing 'item'.
+ * Returns NULL if not found.
+ */
+static WordEntry *
+find_wordentry(TSVector t, TSQuery q, QueryOperand *item, int32 *nitem)
+{
+ WordEntry *StopLow = ARRPTR(t);
+ WordEntry *StopHigh = (WordEntry *) STRPTR(t);
+ WordEntry *StopMiddle = StopHigh;
+ int difference;
+
+ *nitem = 0;
+
+ /* Loop invariant: StopLow <= item < StopHigh */
+ while (StopLow < StopHigh)
+ {
+ StopMiddle = StopLow + (StopHigh - StopLow) / 2;
+ difference = WordECompareQueryItem(STRPTR(t), GETOPERAND(q), StopMiddle, item, false);
+ if (difference == 0)
+ {
+ StopHigh = StopMiddle;
+ *nitem = 1;
+ break;
+ }
+ else if (difference > 0)
+ StopLow = StopMiddle + 1;
+ else
+ StopHigh = StopMiddle;
+ }
+
+ if (item->prefix)
+ {
+ if (StopLow >= StopHigh)
+ StopMiddle = StopHigh;
+
+ *nitem = 0;
+
+ while (StopMiddle < (WordEntry *) STRPTR(t) &&
+ WordECompareQueryItem(STRPTR(t), GETOPERAND(q), StopMiddle, item, true) == 0)
+ {
+ (*nitem)++;
+ StopMiddle++;
+ }
+ }
+
+ return (*nitem > 0) ? StopHigh : NULL;
+}
+
+
+/*
+ * sort QueryOperands by (length, word)
+ */
+static int
+compareQueryOperand(const void *a, const void *b, void *arg)
+{
+ char *operand = (char *) arg;
+ QueryOperand *qa = (*(QueryOperand *const *) a);
+ QueryOperand *qb = (*(QueryOperand *const *) b);
+
+ return tsCompareString(operand + qa->distance, qa->length,
+ operand + qb->distance, qb->length,
+ false);
+}
+
+/*
+ * Returns a sorted, de-duplicated array of QueryOperands in a query.
+ * The returned QueryOperands are pointers to the original QueryOperands
+ * in the query.
+ *
+ * Length of the returned array is stored in *size
+ */
+static QueryOperand **
+SortAndUniqItems(TSQuery q, int *size)
+{
+ char *operand = GETOPERAND(q);
+ QueryItem *item = GETQUERY(q);
+ QueryOperand **res,
+ **ptr,
+ **prevptr;
+
+ ptr = res = (QueryOperand **) palloc(sizeof(QueryOperand *) * *size);
+
+ /* Collect all operands from the tree to res */
+ while ((*size)--)
+ {
+ if (item->type == QI_VAL)
+ {
+ *ptr = (QueryOperand *) item;
+ ptr++;
+ }
+ item++;
+ }
+
+ *size = ptr - res;
+ if (*size < 2)
+ return res;
+
+ qsort_arg(res, *size, sizeof(QueryOperand *), compareQueryOperand, (void *) operand);
+
+ ptr = res + 1;
+ prevptr = res;
+
+ /* remove duplicates */
+ while (ptr - res < *size)
+ {
+ if (compareQueryOperand((void *) ptr, (void *) prevptr, (void *) operand) != 0)
+ {
+ prevptr++;
+ *prevptr = *ptr;
+ }
+ ptr++;
+ }
+
+ *size = prevptr + 1 - res;
+ return res;
+}
+
+static float
+calc_rank_and(const float *w, TSVector t, TSQuery q)
+{
+ WordEntryPosVector **pos;
+ WordEntryPosVector1 posnull;
+ WordEntryPosVector *POSNULL;
+ int i,
+ k,
+ l,
+ p;
+ WordEntry *entry,
+ *firstentry;
+ WordEntryPos *post,
+ *ct;
+ int32 dimt,
+ lenct,
+ dist,
+ nitem;
+ float res = -1.0;
+ QueryOperand **item;
+ int size = q->size;
+
+ item = SortAndUniqItems(q, &size);
+ if (size < 2)
+ {
+ pfree(item);
+ return calc_rank_or(w, t, q);
+ }
+ pos = (WordEntryPosVector **) palloc0(sizeof(WordEntryPosVector *) * q->size);
+
+ /* A dummy WordEntryPos array to use when haspos is false */
+ posnull.npos = 1;
+ posnull.pos[0] = 0;
+ WEP_SETPOS(posnull.pos[0], MAXENTRYPOS - 1);
+ POSNULL = (WordEntryPosVector *) &posnull;
+
+ for (i = 0; i < size; i++)
+ {
+ firstentry = entry = find_wordentry(t, q, item[i], &nitem);
+ if (!entry)
+ continue;
+
+ while (entry - firstentry < nitem)
+ {
+ if (entry->haspos)
+ pos[i] = _POSVECPTR(t, entry);
+ else
+ pos[i] = POSNULL;
+
+ dimt = pos[i]->npos;
+ post = pos[i]->pos;
+ for (k = 0; k < i; k++)
+ {
+ if (!pos[k])
+ continue;
+ lenct = pos[k]->npos;
+ ct = pos[k]->pos;
+ for (l = 0; l < dimt; l++)
+ {
+ for (p = 0; p < lenct; p++)
+ {
+ dist = Abs((int) WEP_GETPOS(post[l]) - (int) WEP_GETPOS(ct[p]));
+ if (dist || (dist == 0 && (pos[i] == POSNULL || pos[k] == POSNULL)))
+ {
+ float curw;
+
+ if (!dist)
+ dist = MAXENTRYPOS;
+ curw = sqrt(wpos(post[l]) * wpos(ct[p]) * word_distance(dist));
+ res = (res < 0) ? curw : 1.0 - (1.0 - res) * (1.0 - curw);
+ }
+ }
+ }
+ }
+
+ entry++;
+ }
+ }
+ pfree(pos);
+ pfree(item);
+ return res;
+}
+
+static float
+calc_rank_or(const float *w, TSVector t, TSQuery q)
+{
+ WordEntry *entry,
+ *firstentry;
+ WordEntryPosVector1 posnull;
+ WordEntryPos *post;
+ int32 dimt,
+ j,
+ i,
+ nitem;
+ float res = 0.0;
+ QueryOperand **item;
+ int size = q->size;
+
+ /* A dummy WordEntryPos array to use when haspos is false */
+ posnull.npos = 1;
+ posnull.pos[0] = 0;
+
+ item = SortAndUniqItems(q, &size);
+
+ for (i = 0; i < size; i++)
+ {
+ float resj,
+ wjm;
+ int32 jm;
+
+ firstentry = entry = find_wordentry(t, q, item[i], &nitem);
+ if (!entry)
+ continue;
+
+ while (entry - firstentry < nitem)
+ {
+ if (entry->haspos)
+ {
+ dimt = POSDATALEN(t, entry);
+ post = POSDATAPTR(t, entry);
+ }
+ else
+ {
+ dimt = posnull.npos;
+ post = posnull.pos;
+ }
+
+ resj = 0.0;
+ wjm = -1.0;
+ jm = 0;
+ for (j = 0; j < dimt; j++)
+ {
+ resj = resj + wpos(post[j]) / ((j + 1) * (j + 1));
+ if (wpos(post[j]) > wjm)
+ {
+ wjm = wpos(post[j]);
+ jm = j;
+ }
+ }
+/*
+ limit (sum(1/i^2),i=1,inf) = pi^2/6
+ resj = sum(wi/i^2),i=1,noccurrence,
+ wi - should be sorted desc,
+ don't sort for now, just choose maximum weight. This should be corrected
+ Oleg Bartunov
+*/
+ res = res + (wjm + resj - wjm / ((jm + 1) * (jm + 1))) / 1.64493406685;
+
+ entry++;
+ }
+ }
+ if (size > 0)
+ res = res / size;
+ pfree(item);
+ return res;
+}
+
+static float
+calc_rank(const float *w, TSVector t, TSQuery q, int32 method)
+{
+ QueryItem *item = GETQUERY(q);
+ float res = 0.0;
+ int len;
+
+ if (!t->size || !q->size)
+ return 0.0;
+
+ /* XXX: What about NOT? */
+ res = (item->type == QI_OPR && (item->qoperator.oper == OP_AND ||
+ item->qoperator.oper == OP_PHRASE)) ?
+ calc_rank_and(w, t, q) :
+ calc_rank_or(w, t, q);
+
+ if (res < 0)
+ res = 1e-20f;
+
+ if ((method & RANK_NORM_LOGLENGTH) && t->size > 0)
+ res /= log((double) (cnt_length(t) + 1)) / log(2.0);
+
+ if (method & RANK_NORM_LENGTH)
+ {
+ len = cnt_length(t);
+ if (len > 0)
+ res /= (float) len;
+ }
+
+ /* RANK_NORM_EXTDIST not applicable */
+
+ if ((method & RANK_NORM_UNIQ) && t->size > 0)
+ res /= (float) (t->size);
+
+ if ((method & RANK_NORM_LOGUNIQ) && t->size > 0)
+ res /= log((double) (t->size + 1)) / log(2.0);
+
+ if (method & RANK_NORM_RDIVRPLUS1)
+ res /= (res + 1);
+
+ return res;
+}
+
+static const float *
+getWeights(ArrayType *win)
+{
+ static float ws[lengthof(weights)];
+ int i;
+ float4 *arrdata;
+
+ if (win == NULL)
+ return weights;
+
+ if (ARR_NDIM(win) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array of weight must be one-dimensional")));
+
+ if (ArrayGetNItems(ARR_NDIM(win), ARR_DIMS(win)) < lengthof(weights))
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("array of weight is too short")));
+
+ if (array_contains_nulls(win))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("array of weight must not contain nulls")));
+
+ arrdata = (float4 *) ARR_DATA_PTR(win);
+ for (i = 0; i < lengthof(weights); i++)
+ {
+ ws[i] = (arrdata[i] >= 0) ? arrdata[i] : weights[i];
+ if (ws[i] > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("weight out of range")));
+ }
+
+ return ws;
+}
+
+Datum
+ts_rank_wttf(PG_FUNCTION_ARGS)
+{
+ ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ TSVector txt = PG_GETARG_TSVECTOR(1);
+ TSQuery query = PG_GETARG_TSQUERY(2);
+ int method = PG_GETARG_INT32(3);
+ float res;
+
+ res = calc_rank(getWeights(win), txt, query, method);
+
+ PG_FREE_IF_COPY(win, 0);
+ PG_FREE_IF_COPY(txt, 1);
+ PG_FREE_IF_COPY(query, 2);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rank_wtt(PG_FUNCTION_ARGS)
+{
+ ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ TSVector txt = PG_GETARG_TSVECTOR(1);
+ TSQuery query = PG_GETARG_TSQUERY(2);
+ float res;
+
+ res = calc_rank(getWeights(win), txt, query, DEF_NORM_METHOD);
+
+ PG_FREE_IF_COPY(win, 0);
+ PG_FREE_IF_COPY(txt, 1);
+ PG_FREE_IF_COPY(query, 2);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rank_ttf(PG_FUNCTION_ARGS)
+{
+ TSVector txt = PG_GETARG_TSVECTOR(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ int method = PG_GETARG_INT32(2);
+ float res;
+
+ res = calc_rank(getWeights(NULL), txt, query, method);
+
+ PG_FREE_IF_COPY(txt, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rank_tt(PG_FUNCTION_ARGS)
+{
+ TSVector txt = PG_GETARG_TSVECTOR(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ float res;
+
+ res = calc_rank(getWeights(NULL), txt, query, DEF_NORM_METHOD);
+
+ PG_FREE_IF_COPY(txt, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_FLOAT4(res);
+}
+
+typedef struct
+{
+ union
+ {
+ struct
+ { /* compiled doc representation */
+ QueryItem **items;
+ int16 nitem;
+ } query;
+ struct
+ { /* struct is used for preparing doc
+ * representation */
+ QueryItem *item;
+ WordEntry *entry;
+ } map;
+ } data;
+ WordEntryPos pos;
+} DocRepresentation;
+
+static int
+compareDocR(const void *va, const void *vb)
+{
+ const DocRepresentation *a = (const DocRepresentation *) va;
+ const DocRepresentation *b = (const DocRepresentation *) vb;
+
+ if (WEP_GETPOS(a->pos) == WEP_GETPOS(b->pos))
+ {
+ if (WEP_GETWEIGHT(a->pos) == WEP_GETWEIGHT(b->pos))
+ {
+ if (a->data.map.entry == b->data.map.entry)
+ return 0;
+
+ return (a->data.map.entry > b->data.map.entry) ? 1 : -1;
+ }
+
+ return (WEP_GETWEIGHT(a->pos) > WEP_GETWEIGHT(b->pos)) ? 1 : -1;
+ }
+
+ return (WEP_GETPOS(a->pos) > WEP_GETPOS(b->pos)) ? 1 : -1;
+}
+
+#define MAXQROPOS MAXENTRYPOS
+typedef struct
+{
+ bool operandexists;
+ bool reverseinsert; /* indicates insert order, true means
+ * descending order */
+ uint32 npos;
+ WordEntryPos pos[MAXQROPOS];
+} QueryRepresentationOperand;
+
+typedef struct
+{
+ TSQuery query;
+ QueryRepresentationOperand *operandData;
+} QueryRepresentation;
+
+#define QR_GET_OPERAND_DATA(q, v) \
+ ( (q)->operandData + (((QueryItem*)(v)) - GETQUERY((q)->query)) )
+
+/*
+ * TS_execute callback for matching a tsquery operand to QueryRepresentation
+ */
+static TSTernaryValue
+checkcondition_QueryOperand(void *checkval, QueryOperand *val,
+ ExecPhraseData *data)
+{
+ QueryRepresentation *qr = (QueryRepresentation *) checkval;
+ QueryRepresentationOperand *opData = QR_GET_OPERAND_DATA(qr, val);
+
+ if (!opData->operandexists)
+ return TS_NO;
+
+ if (data)
+ {
+ data->npos = opData->npos;
+ data->pos = opData->pos;
+ if (opData->reverseinsert)
+ data->pos += MAXQROPOS - opData->npos;
+ }
+
+ return TS_YES;
+}
+
+typedef struct
+{
+ int pos;
+ int p;
+ int q;
+ DocRepresentation *begin;
+ DocRepresentation *end;
+} CoverExt;
+
+static void
+resetQueryRepresentation(QueryRepresentation *qr, bool reverseinsert)
+{
+ int i;
+
+ for (i = 0; i < qr->query->size; i++)
+ {
+ qr->operandData[i].operandexists = false;
+ qr->operandData[i].reverseinsert = reverseinsert;
+ qr->operandData[i].npos = 0;
+ }
+}
+
+static void
+fillQueryRepresentationData(QueryRepresentation *qr, DocRepresentation *entry)
+{
+ int i;
+ int lastPos;
+ QueryRepresentationOperand *opData;
+
+ for (i = 0; i < entry->data.query.nitem; i++)
+ {
+ if (entry->data.query.items[i]->type != QI_VAL)
+ continue;
+
+ opData = QR_GET_OPERAND_DATA(qr, entry->data.query.items[i]);
+
+ opData->operandexists = true;
+
+ if (opData->npos == 0)
+ {
+ lastPos = (opData->reverseinsert) ? (MAXQROPOS - 1) : 0;
+ opData->pos[lastPos] = entry->pos;
+ opData->npos++;
+ continue;
+ }
+
+ lastPos = opData->reverseinsert ?
+ (MAXQROPOS - opData->npos) :
+ (opData->npos - 1);
+
+ if (WEP_GETPOS(opData->pos[lastPos]) != WEP_GETPOS(entry->pos))
+ {
+ lastPos = opData->reverseinsert ?
+ (MAXQROPOS - 1 - opData->npos) :
+ (opData->npos);
+
+ opData->pos[lastPos] = entry->pos;
+ opData->npos++;
+ }
+ }
+}
+
+static bool
+Cover(DocRepresentation *doc, int len, QueryRepresentation *qr, CoverExt *ext)
+{
+ DocRepresentation *ptr;
+ int lastpos = ext->pos;
+ bool found = false;
+
+ /*
+ * since this function recurses, it could be driven to stack overflow.
+ * (though any decent compiler will optimize away the tail-recursion.
+ */
+ check_stack_depth();
+
+ resetQueryRepresentation(qr, false);
+
+ ext->p = INT_MAX;
+ ext->q = 0;
+ ptr = doc + ext->pos;
+
+ /* find upper bound of cover from current position, move up */
+ while (ptr - doc < len)
+ {
+ fillQueryRepresentationData(qr, ptr);
+
+ if (TS_execute(GETQUERY(qr->query), (void *) qr,
+ TS_EXEC_EMPTY, checkcondition_QueryOperand))
+ {
+ if (WEP_GETPOS(ptr->pos) > ext->q)
+ {
+ ext->q = WEP_GETPOS(ptr->pos);
+ ext->end = ptr;
+ lastpos = ptr - doc;
+ found = true;
+ }
+ break;
+ }
+ ptr++;
+ }
+
+ if (!found)
+ return false;
+
+ resetQueryRepresentation(qr, true);
+
+ ptr = doc + lastpos;
+
+ /* find lower bound of cover from found upper bound, move down */
+ while (ptr >= doc + ext->pos)
+ {
+ /*
+ * we scan doc from right to left, so pos info in reverse order!
+ */
+ fillQueryRepresentationData(qr, ptr);
+
+ if (TS_execute(GETQUERY(qr->query), (void *) qr,
+ TS_EXEC_EMPTY, checkcondition_QueryOperand))
+ {
+ if (WEP_GETPOS(ptr->pos) < ext->p)
+ {
+ ext->begin = ptr;
+ ext->p = WEP_GETPOS(ptr->pos);
+ }
+ break;
+ }
+ ptr--;
+ }
+
+ if (ext->p <= ext->q)
+ {
+ /*
+ * set position for next try to next lexeme after beginning of found
+ * cover
+ */
+ ext->pos = (ptr - doc) + 1;
+ return true;
+ }
+
+ ext->pos++;
+ return Cover(doc, len, qr, ext);
+}
+
+static DocRepresentation *
+get_docrep(TSVector txt, QueryRepresentation *qr, int *doclen)
+{
+ QueryItem *item = GETQUERY(qr->query);
+ WordEntry *entry,
+ *firstentry;
+ WordEntryPos *post;
+ int32 dimt, /* number of 'post' items */
+ j,
+ i,
+ nitem;
+ int len = qr->query->size * 4,
+ cur = 0;
+ DocRepresentation *doc;
+
+ doc = (DocRepresentation *) palloc(sizeof(DocRepresentation) * len);
+
+ /*
+ * Iterate through query to make DocRepresentation for words and it's
+ * entries satisfied by query
+ */
+ for (i = 0; i < qr->query->size; i++)
+ {
+ QueryOperand *curoperand;
+
+ if (item[i].type != QI_VAL)
+ continue;
+
+ curoperand = &item[i].qoperand;
+
+ firstentry = entry = find_wordentry(txt, qr->query, curoperand, &nitem);
+ if (!entry)
+ continue;
+
+ /* iterations over entries in tsvector */
+ while (entry - firstentry < nitem)
+ {
+ if (entry->haspos)
+ {
+ dimt = POSDATALEN(txt, entry);
+ post = POSDATAPTR(txt, entry);
+ }
+ else
+ {
+ /* ignore words without positions */
+ entry++;
+ continue;
+ }
+
+ while (cur + dimt >= len)
+ {
+ len *= 2;
+ doc = (DocRepresentation *) repalloc(doc, sizeof(DocRepresentation) * len);
+ }
+
+ /* iterations over entry's positions */
+ for (j = 0; j < dimt; j++)
+ {
+ if (curoperand->weight == 0 ||
+ curoperand->weight & (1 << WEP_GETWEIGHT(post[j])))
+ {
+ doc[cur].pos = post[j];
+ doc[cur].data.map.entry = entry;
+ doc[cur].data.map.item = (QueryItem *) curoperand;
+ cur++;
+ }
+ }
+
+ entry++;
+ }
+ }
+
+ if (cur > 0)
+ {
+ DocRepresentation *rptr = doc + 1,
+ *wptr = doc,
+ storage;
+
+ /*
+ * Sort representation in ascending order by pos and entry
+ */
+ qsort((void *) doc, cur, sizeof(DocRepresentation), compareDocR);
+
+ /*
+ * Join QueryItem per WordEntry and it's position
+ */
+ storage.pos = doc->pos;
+ storage.data.query.items = palloc(sizeof(QueryItem *) * qr->query->size);
+ storage.data.query.items[0] = doc->data.map.item;
+ storage.data.query.nitem = 1;
+
+ while (rptr - doc < cur)
+ {
+ if (rptr->pos == (rptr - 1)->pos &&
+ rptr->data.map.entry == (rptr - 1)->data.map.entry)
+ {
+ storage.data.query.items[storage.data.query.nitem] = rptr->data.map.item;
+ storage.data.query.nitem++;
+ }
+ else
+ {
+ *wptr = storage;
+ wptr++;
+ storage.pos = rptr->pos;
+ storage.data.query.items = palloc(sizeof(QueryItem *) * qr->query->size);
+ storage.data.query.items[0] = rptr->data.map.item;
+ storage.data.query.nitem = 1;
+ }
+
+ rptr++;
+ }
+
+ *wptr = storage;
+ wptr++;
+
+ *doclen = wptr - doc;
+ return doc;
+ }
+
+ pfree(doc);
+ return NULL;
+}
+
+static float4
+calc_rank_cd(const float4 *arrdata, TSVector txt, TSQuery query, int method)
+{
+ DocRepresentation *doc;
+ int len,
+ i,
+ doclen = 0;
+ CoverExt ext;
+ double Wdoc = 0.0;
+ double invws[lengthof(weights)];
+ double SumDist = 0.0,
+ PrevExtPos = 0.0;
+ int NExtent = 0;
+ QueryRepresentation qr;
+
+
+ for (i = 0; i < lengthof(weights); i++)
+ {
+ invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : weights[i]));
+ if (invws[i] > 1.0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("weight out of range")));
+ invws[i] = 1.0 / invws[i];
+ }
+
+ qr.query = query;
+ qr.operandData = (QueryRepresentationOperand *)
+ palloc0(sizeof(QueryRepresentationOperand) * query->size);
+
+ doc = get_docrep(txt, &qr, &doclen);
+ if (!doc)
+ {
+ pfree(qr.operandData);
+ return 0.0;
+ }
+
+ MemSet(&ext, 0, sizeof(CoverExt));
+ while (Cover(doc, doclen, &qr, &ext))
+ {
+ double Cpos = 0.0;
+ double InvSum = 0.0;
+ double CurExtPos;
+ int nNoise;
+ DocRepresentation *ptr = ext.begin;
+
+ while (ptr <= ext.end)
+ {
+ InvSum += invws[WEP_GETWEIGHT(ptr->pos)];
+ ptr++;
+ }
+
+ Cpos = ((double) (ext.end - ext.begin + 1)) / InvSum;
+
+ /*
+ * if doc are big enough then ext.q may be equal to ext.p due to limit
+ * of positional information. In this case we approximate number of
+ * noise word as half cover's length
+ */
+ nNoise = (ext.q - ext.p) - (ext.end - ext.begin);
+ if (nNoise < 0)
+ nNoise = (ext.end - ext.begin) / 2;
+ Wdoc += Cpos / ((double) (1 + nNoise));
+
+ CurExtPos = ((double) (ext.q + ext.p)) / 2.0;
+ if (NExtent > 0 && CurExtPos > PrevExtPos /* prevent division by
+ * zero in a case of
+ * multiple lexize */ )
+ SumDist += 1.0 / (CurExtPos - PrevExtPos);
+
+ PrevExtPos = CurExtPos;
+ NExtent++;
+ }
+
+ if ((method & RANK_NORM_LOGLENGTH) && txt->size > 0)
+ Wdoc /= log((double) (cnt_length(txt) + 1));
+
+ if (method & RANK_NORM_LENGTH)
+ {
+ len = cnt_length(txt);
+ if (len > 0)
+ Wdoc /= (double) len;
+ }
+
+ if ((method & RANK_NORM_EXTDIST) && NExtent > 0 && SumDist > 0)
+ Wdoc /= ((double) NExtent) / SumDist;
+
+ if ((method & RANK_NORM_UNIQ) && txt->size > 0)
+ Wdoc /= (double) (txt->size);
+
+ if ((method & RANK_NORM_LOGUNIQ) && txt->size > 0)
+ Wdoc /= log((double) (txt->size + 1)) / log(2.0);
+
+ if (method & RANK_NORM_RDIVRPLUS1)
+ Wdoc /= (Wdoc + 1);
+
+ pfree(doc);
+
+ pfree(qr.operandData);
+
+ return (float4) Wdoc;
+}
+
+Datum
+ts_rankcd_wttf(PG_FUNCTION_ARGS)
+{
+ ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ TSVector txt = PG_GETARG_TSVECTOR(1);
+ TSQuery query = PG_GETARG_TSQUERY(2);
+ int method = PG_GETARG_INT32(3);
+ float res;
+
+ res = calc_rank_cd(getWeights(win), txt, query, method);
+
+ PG_FREE_IF_COPY(win, 0);
+ PG_FREE_IF_COPY(txt, 1);
+ PG_FREE_IF_COPY(query, 2);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rankcd_wtt(PG_FUNCTION_ARGS)
+{
+ ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ TSVector txt = PG_GETARG_TSVECTOR(1);
+ TSQuery query = PG_GETARG_TSQUERY(2);
+ float res;
+
+ res = calc_rank_cd(getWeights(win), txt, query, DEF_NORM_METHOD);
+
+ PG_FREE_IF_COPY(win, 0);
+ PG_FREE_IF_COPY(txt, 1);
+ PG_FREE_IF_COPY(query, 2);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rankcd_ttf(PG_FUNCTION_ARGS)
+{
+ TSVector txt = PG_GETARG_TSVECTOR(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ int method = PG_GETARG_INT32(2);
+ float res;
+
+ res = calc_rank_cd(getWeights(NULL), txt, query, method);
+
+ PG_FREE_IF_COPY(txt, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_FLOAT4(res);
+}
+
+Datum
+ts_rankcd_tt(PG_FUNCTION_ARGS)
+{
+ TSVector txt = PG_GETARG_TSVECTOR(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ float res;
+
+ res = calc_rank_cd(getWeights(NULL), txt, query, DEF_NORM_METHOD);
+
+ PG_FREE_IF_COPY(txt, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_FLOAT4(res);
+}
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
new file mode 100644
index 0000000..cb36893
--- /dev/null
+++ b/src/backend/utils/adt/tsvector.c
@@ -0,0 +1,551 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsvector.c
+ * I/O functions for tsvector
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsvector.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "libpq/pqformat.h"
+#include "tsearch/ts_locale.h"
+#include "tsearch/ts_utils.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+
+typedef struct
+{
+ WordEntry entry; /* must be first! */
+ WordEntryPos *pos;
+ int poslen; /* number of elements in pos */
+} WordEntryIN;
+
+
+/* Compare two WordEntryPos values for qsort */
+int
+compareWordEntryPos(const void *a, const void *b)
+{
+ int apos = WEP_GETPOS(*(const WordEntryPos *) a);
+ int bpos = WEP_GETPOS(*(const WordEntryPos *) b);
+
+ if (apos == bpos)
+ return 0;
+ return (apos > bpos) ? 1 : -1;
+}
+
+/*
+ * Removes duplicate pos entries. If there's two entries with same pos but
+ * different weight, the higher weight is retained, so we can't use
+ * qunique here.
+ *
+ * Returns new length.
+ */
+static int
+uniquePos(WordEntryPos *a, int l)
+{
+ WordEntryPos *ptr,
+ *res;
+
+ if (l <= 1)
+ return l;
+
+ qsort((void *) a, l, sizeof(WordEntryPos), compareWordEntryPos);
+
+ res = a;
+ ptr = a + 1;
+ while (ptr - a < l)
+ {
+ if (WEP_GETPOS(*ptr) != WEP_GETPOS(*res))
+ {
+ res++;
+ *res = *ptr;
+ if (res - a >= MAXNUMPOS - 1 ||
+ WEP_GETPOS(*res) == MAXENTRYPOS - 1)
+ break;
+ }
+ else if (WEP_GETWEIGHT(*ptr) > WEP_GETWEIGHT(*res))
+ WEP_SETWEIGHT(*res, WEP_GETWEIGHT(*ptr));
+ ptr++;
+ }
+
+ return res + 1 - a;
+}
+
+/* Compare two WordEntryIN values for qsort */
+static int
+compareentry(const void *va, const void *vb, void *arg)
+{
+ const WordEntryIN *a = (const WordEntryIN *) va;
+ const WordEntryIN *b = (const WordEntryIN *) vb;
+ char *BufferStr = (char *) arg;
+
+ return tsCompareString(&BufferStr[a->entry.pos], a->entry.len,
+ &BufferStr[b->entry.pos], b->entry.len,
+ false);
+}
+
+/*
+ * Sort an array of WordEntryIN, remove duplicates.
+ * *outbuflen receives the amount of space needed for strings and positions.
+ */
+static int
+uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen)
+{
+ int buflen;
+ WordEntryIN *ptr,
+ *res;
+
+ Assert(l >= 1);
+
+ if (l > 1)
+ qsort_arg((void *) a, l, sizeof(WordEntryIN), compareentry,
+ (void *) buf);
+
+ buflen = 0;
+ res = a;
+ ptr = a + 1;
+ while (ptr - a < l)
+ {
+ if (!(ptr->entry.len == res->entry.len &&
+ strncmp(&buf[ptr->entry.pos], &buf[res->entry.pos],
+ res->entry.len) == 0))
+ {
+ /* done accumulating data into *res, count space needed */
+ buflen += res->entry.len;
+ if (res->entry.haspos)
+ {
+ res->poslen = uniquePos(res->pos, res->poslen);
+ buflen = SHORTALIGN(buflen);
+ buflen += res->poslen * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+ res++;
+ if (res != ptr)
+ memcpy(res, ptr, sizeof(WordEntryIN));
+ }
+ else if (ptr->entry.haspos)
+ {
+ if (res->entry.haspos)
+ {
+ /* append ptr's positions to res's positions */
+ int newlen = ptr->poslen + res->poslen;
+
+ res->pos = (WordEntryPos *)
+ repalloc(res->pos, newlen * sizeof(WordEntryPos));
+ memcpy(&res->pos[res->poslen], ptr->pos,
+ ptr->poslen * sizeof(WordEntryPos));
+ res->poslen = newlen;
+ pfree(ptr->pos);
+ }
+ else
+ {
+ /* just give ptr's positions to pos */
+ res->entry.haspos = 1;
+ res->pos = ptr->pos;
+ res->poslen = ptr->poslen;
+ }
+ }
+ ptr++;
+ }
+
+ /* count space needed for last item */
+ buflen += res->entry.len;
+ if (res->entry.haspos)
+ {
+ res->poslen = uniquePos(res->pos, res->poslen);
+ buflen = SHORTALIGN(buflen);
+ buflen += res->poslen * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+
+ *outbuflen = buflen;
+ return res + 1 - a;
+}
+
+static int
+WordEntryCMP(WordEntry *a, WordEntry *b, char *buf)
+{
+ return compareentry(a, b, buf);
+}
+
+
+Datum
+tsvectorin(PG_FUNCTION_ARGS)
+{
+ char *buf = PG_GETARG_CSTRING(0);
+ TSVectorParseState state;
+ WordEntryIN *arr;
+ int totallen;
+ int arrlen; /* allocated size of arr */
+ WordEntry *inarr;
+ int len = 0;
+ TSVector in;
+ int i;
+ char *token;
+ int toklen;
+ WordEntryPos *pos;
+ int poslen;
+ char *strbuf;
+ int stroff;
+
+ /*
+ * Tokens are appended to tmpbuf, cur is a pointer to the end of used
+ * space in tmpbuf.
+ */
+ char *tmpbuf;
+ char *cur;
+ int buflen = 256; /* allocated size of tmpbuf */
+
+ state = init_tsvector_parser(buf, 0);
+
+ arrlen = 64;
+ arr = (WordEntryIN *) palloc(sizeof(WordEntryIN) * arrlen);
+ cur = tmpbuf = (char *) palloc(buflen);
+
+ while (gettoken_tsvector(state, &token, &toklen, &pos, &poslen, NULL))
+ {
+ if (toklen >= MAXSTRLEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("word is too long (%ld bytes, max %ld bytes)",
+ (long) toklen,
+ (long) (MAXSTRLEN - 1))));
+
+ if (cur - tmpbuf > MAXSTRPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("string is too long for tsvector (%ld bytes, max %ld bytes)",
+ (long) (cur - tmpbuf), (long) MAXSTRPOS)));
+
+ /*
+ * Enlarge buffers if needed
+ */
+ if (len >= arrlen)
+ {
+ arrlen *= 2;
+ arr = (WordEntryIN *)
+ repalloc((void *) arr, sizeof(WordEntryIN) * arrlen);
+ }
+ while ((cur - tmpbuf) + toklen >= buflen)
+ {
+ int dist = cur - tmpbuf;
+
+ buflen *= 2;
+ tmpbuf = (char *) repalloc((void *) tmpbuf, buflen);
+ cur = tmpbuf + dist;
+ }
+ arr[len].entry.len = toklen;
+ arr[len].entry.pos = cur - tmpbuf;
+ memcpy((void *) cur, (void *) token, toklen);
+ cur += toklen;
+
+ if (poslen != 0)
+ {
+ arr[len].entry.haspos = 1;
+ arr[len].pos = pos;
+ arr[len].poslen = poslen;
+ }
+ else
+ {
+ arr[len].entry.haspos = 0;
+ arr[len].pos = NULL;
+ arr[len].poslen = 0;
+ }
+ len++;
+ }
+
+ close_tsvector_parser(state);
+
+ if (len > 0)
+ len = uniqueentry(arr, len, tmpbuf, &buflen);
+ else
+ buflen = 0;
+
+ if (buflen > MAXSTRPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("string is too long for tsvector (%d bytes, max %d bytes)", buflen, MAXSTRPOS)));
+
+ totallen = CALCDATASIZE(len, buflen);
+ in = (TSVector) palloc0(totallen);
+ SET_VARSIZE(in, totallen);
+ in->size = len;
+ inarr = ARRPTR(in);
+ strbuf = STRPTR(in);
+ stroff = 0;
+ for (i = 0; i < len; i++)
+ {
+ memcpy(strbuf + stroff, &tmpbuf[arr[i].entry.pos], arr[i].entry.len);
+ arr[i].entry.pos = stroff;
+ stroff += arr[i].entry.len;
+ if (arr[i].entry.haspos)
+ {
+ if (arr[i].poslen > 0xFFFF)
+ elog(ERROR, "positions array too long");
+
+ /* Copy number of positions */
+ stroff = SHORTALIGN(stroff);
+ *(uint16 *) (strbuf + stroff) = (uint16) arr[i].poslen;
+ stroff += sizeof(uint16);
+
+ /* Copy positions */
+ memcpy(strbuf + stroff, arr[i].pos, arr[i].poslen * sizeof(WordEntryPos));
+ stroff += arr[i].poslen * sizeof(WordEntryPos);
+
+ pfree(arr[i].pos);
+ }
+ inarr[i] = arr[i].entry;
+ }
+
+ Assert((strbuf + stroff - (char *) in) == totallen);
+
+ PG_RETURN_TSVECTOR(in);
+}
+
+Datum
+tsvectorout(PG_FUNCTION_ARGS)
+{
+ TSVector out = PG_GETARG_TSVECTOR(0);
+ char *outbuf;
+ int32 i,
+ lenbuf = 0,
+ pp;
+ WordEntry *ptr = ARRPTR(out);
+ char *curbegin,
+ *curin,
+ *curout;
+
+ lenbuf = out->size * 2 /* '' */ + out->size - 1 /* space */ + 2 /* \0 */ ;
+ for (i = 0; i < out->size; i++)
+ {
+ lenbuf += ptr[i].len * 2 * pg_database_encoding_max_length() /* for escape */ ;
+ if (ptr[i].haspos)
+ lenbuf += 1 /* : */ + 7 /* int2 + , + weight */ * POSDATALEN(out, &(ptr[i]));
+ }
+
+ curout = outbuf = (char *) palloc(lenbuf);
+ for (i = 0; i < out->size; i++)
+ {
+ curbegin = curin = STRPTR(out) + ptr->pos;
+ if (i != 0)
+ *curout++ = ' ';
+ *curout++ = '\'';
+ while (curin - curbegin < ptr->len)
+ {
+ int len = pg_mblen(curin);
+
+ if (t_iseq(curin, '\''))
+ *curout++ = '\'';
+ else if (t_iseq(curin, '\\'))
+ *curout++ = '\\';
+
+ while (len--)
+ *curout++ = *curin++;
+ }
+
+ *curout++ = '\'';
+ if ((pp = POSDATALEN(out, ptr)) != 0)
+ {
+ WordEntryPos *wptr;
+
+ *curout++ = ':';
+ wptr = POSDATAPTR(out, ptr);
+ while (pp)
+ {
+ curout += sprintf(curout, "%d", WEP_GETPOS(*wptr));
+ switch (WEP_GETWEIGHT(*wptr))
+ {
+ case 3:
+ *curout++ = 'A';
+ break;
+ case 2:
+ *curout++ = 'B';
+ break;
+ case 1:
+ *curout++ = 'C';
+ break;
+ case 0:
+ default:
+ break;
+ }
+
+ if (pp > 1)
+ *curout++ = ',';
+ pp--;
+ wptr++;
+ }
+ }
+ ptr++;
+ }
+
+ *curout = '\0';
+ PG_FREE_IF_COPY(out, 0);
+ PG_RETURN_CSTRING(outbuf);
+}
+
+/*
+ * Binary Input / Output functions. The binary format is as follows:
+ *
+ * uint32 number of lexemes
+ *
+ * for each lexeme:
+ * lexeme text in client encoding, null-terminated
+ * uint16 number of positions
+ * for each position:
+ * uint16 WordEntryPos
+ */
+
+Datum
+tsvectorsend(PG_FUNCTION_ARGS)
+{
+ TSVector vec = PG_GETARG_TSVECTOR(0);
+ StringInfoData buf;
+ int i,
+ j;
+ WordEntry *weptr = ARRPTR(vec);
+
+ pq_begintypsend(&buf);
+
+ pq_sendint32(&buf, vec->size);
+ for (i = 0; i < vec->size; i++)
+ {
+ uint16 npos;
+
+ /*
+ * the strings in the TSVector array are not null-terminated, so we
+ * have to send the null-terminator separately
+ */
+ pq_sendtext(&buf, STRPTR(vec) + weptr->pos, weptr->len);
+ pq_sendbyte(&buf, '\0');
+
+ npos = POSDATALEN(vec, weptr);
+ pq_sendint16(&buf, npos);
+
+ if (npos > 0)
+ {
+ WordEntryPos *wepptr = POSDATAPTR(vec, weptr);
+
+ for (j = 0; j < npos; j++)
+ pq_sendint16(&buf, wepptr[j]);
+ }
+ weptr++;
+ }
+
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+tsvectorrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ TSVector vec;
+ int i;
+ int32 nentries;
+ int datalen; /* number of bytes used in the variable size
+ * area after fixed size TSVector header and
+ * WordEntries */
+ Size hdrlen;
+ Size len; /* allocated size of vec */
+ bool needSort = false;
+
+ nentries = pq_getmsgint(buf, sizeof(int32));
+ if (nentries < 0 || nentries > (MaxAllocSize / sizeof(WordEntry)))
+ elog(ERROR, "invalid size of tsvector");
+
+ hdrlen = DATAHDRSIZE + sizeof(WordEntry) * nentries;
+
+ len = hdrlen * 2; /* times two to make room for lexemes */
+ vec = (TSVector) palloc0(len);
+ vec->size = nentries;
+
+ datalen = 0;
+ for (i = 0; i < nentries; i++)
+ {
+ const char *lexeme;
+ uint16 npos;
+ size_t lex_len;
+
+ lexeme = pq_getmsgstring(buf);
+ npos = (uint16) pq_getmsgint(buf, sizeof(uint16));
+
+ /* sanity checks */
+
+ lex_len = strlen(lexeme);
+ if (lex_len > MAXSTRLEN)
+ elog(ERROR, "invalid tsvector: lexeme too long");
+
+ if (datalen > MAXSTRPOS)
+ elog(ERROR, "invalid tsvector: maximum total lexeme length exceeded");
+
+ if (npos > MAXNUMPOS)
+ elog(ERROR, "unexpected number of tsvector positions");
+
+ /*
+ * Looks valid. Fill the WordEntry struct, and copy lexeme.
+ *
+ * But make sure the buffer is large enough first.
+ */
+ while (hdrlen + SHORTALIGN(datalen + lex_len) +
+ sizeof(uint16) + npos * sizeof(WordEntryPos) >= len)
+ {
+ len *= 2;
+ vec = (TSVector) repalloc(vec, len);
+ }
+
+ vec->entries[i].haspos = (npos > 0) ? 1 : 0;
+ vec->entries[i].len = lex_len;
+ vec->entries[i].pos = datalen;
+
+ memcpy(STRPTR(vec) + datalen, lexeme, lex_len);
+
+ datalen += lex_len;
+
+ if (i > 0 && WordEntryCMP(&vec->entries[i],
+ &vec->entries[i - 1],
+ STRPTR(vec)) <= 0)
+ needSort = true;
+
+ /* Receive positions */
+ if (npos > 0)
+ {
+ uint16 j;
+ WordEntryPos *wepptr;
+
+ /*
+ * Pad to 2-byte alignment if necessary. Though we used palloc0
+ * for the initial allocation, subsequent repalloc'd memory areas
+ * are not initialized to zero.
+ */
+ if (datalen != SHORTALIGN(datalen))
+ {
+ *(STRPTR(vec) + datalen) = '\0';
+ datalen = SHORTALIGN(datalen);
+ }
+
+ memcpy(STRPTR(vec) + datalen, &npos, sizeof(uint16));
+
+ wepptr = POSDATAPTR(vec, &vec->entries[i]);
+ for (j = 0; j < npos; j++)
+ {
+ wepptr[j] = (WordEntryPos) pq_getmsgint(buf, sizeof(WordEntryPos));
+ if (j > 0 && WEP_GETPOS(wepptr[j]) <= WEP_GETPOS(wepptr[j - 1]))
+ elog(ERROR, "position information is misordered");
+ }
+
+ datalen += sizeof(uint16) + npos * sizeof(WordEntryPos);
+ }
+ }
+
+ SET_VARSIZE(vec, hdrlen + datalen);
+
+ if (needSort)
+ qsort_arg((void *) ARRPTR(vec), vec->size, sizeof(WordEntry),
+ compareentry, (void *) STRPTR(vec));
+
+ PG_RETURN_TSVECTOR(vec);
+}
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
new file mode 100644
index 0000000..2ccd3bd
--- /dev/null
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -0,0 +1,2726 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsvector_op.c
+ * operations over tsvector
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsvector_op.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/htup_details.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_type.h"
+#include "commands/trigger.h"
+#include "executor/spi.h"
+#include "funcapi.h"
+#include "lib/qunique.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "parser/parse_coerce.h"
+#include "tsearch/ts_utils.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/regproc.h"
+#include "utils/rel.h"
+
+
+typedef struct
+{
+ WordEntry *arrb;
+ WordEntry *arre;
+ char *values;
+ char *operand;
+} CHKVAL;
+
+
+typedef struct StatEntry
+{
+ uint32 ndoc; /* zero indicates that we were already here
+ * while walking through the tree */
+ uint32 nentry;
+ struct StatEntry *left;
+ struct StatEntry *right;
+ uint32 lenlexeme;
+ char lexeme[FLEXIBLE_ARRAY_MEMBER];
+} StatEntry;
+
+#define STATENTRYHDRSZ (offsetof(StatEntry, lexeme))
+
+typedef struct
+{
+ int32 weight;
+
+ uint32 maxdepth;
+
+ StatEntry **stack;
+ uint32 stackpos;
+
+ StatEntry *root;
+} TSVectorStat;
+
+
+static TSTernaryValue TS_execute_recurse(QueryItem *curitem, void *arg,
+ uint32 flags,
+ TSExecuteCallback chkcond);
+static int tsvector_bsearch(const TSVector tsv, char *lexeme, int lexeme_len);
+static Datum tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column);
+
+
+/*
+ * Order: haspos, len, word, for all positions (pos, weight)
+ */
+static int
+silly_cmp_tsvector(const TSVector a, const TSVector b)
+{
+ if (VARSIZE(a) < VARSIZE(b))
+ return -1;
+ else if (VARSIZE(a) > VARSIZE(b))
+ return 1;
+ else if (a->size < b->size)
+ return -1;
+ else if (a->size > b->size)
+ return 1;
+ else
+ {
+ WordEntry *aptr = ARRPTR(a);
+ WordEntry *bptr = ARRPTR(b);
+ int i = 0;
+ int res;
+
+
+ for (i = 0; i < a->size; i++)
+ {
+ if (aptr->haspos != bptr->haspos)
+ {
+ return (aptr->haspos > bptr->haspos) ? -1 : 1;
+ }
+ else if ((res = tsCompareString(STRPTR(a) + aptr->pos, aptr->len, STRPTR(b) + bptr->pos, bptr->len, false)) != 0)
+ {
+ return res;
+ }
+ else if (aptr->haspos)
+ {
+ WordEntryPos *ap = POSDATAPTR(a, aptr);
+ WordEntryPos *bp = POSDATAPTR(b, bptr);
+ int j;
+
+ if (POSDATALEN(a, aptr) != POSDATALEN(b, bptr))
+ return (POSDATALEN(a, aptr) > POSDATALEN(b, bptr)) ? -1 : 1;
+
+ for (j = 0; j < POSDATALEN(a, aptr); j++)
+ {
+ if (WEP_GETPOS(*ap) != WEP_GETPOS(*bp))
+ {
+ return (WEP_GETPOS(*ap) > WEP_GETPOS(*bp)) ? -1 : 1;
+ }
+ else if (WEP_GETWEIGHT(*ap) != WEP_GETWEIGHT(*bp))
+ {
+ return (WEP_GETWEIGHT(*ap) > WEP_GETWEIGHT(*bp)) ? -1 : 1;
+ }
+ ap++, bp++;
+ }
+ }
+
+ aptr++;
+ bptr++;
+ }
+ }
+
+ return 0;
+}
+
+#define TSVECTORCMPFUNC( type, action, ret ) \
+Datum \
+tsvector_##type(PG_FUNCTION_ARGS) \
+{ \
+ TSVector a = PG_GETARG_TSVECTOR(0); \
+ TSVector b = PG_GETARG_TSVECTOR(1); \
+ int res = silly_cmp_tsvector(a, b); \
+ PG_FREE_IF_COPY(a,0); \
+ PG_FREE_IF_COPY(b,1); \
+ PG_RETURN_##ret( res action 0 ); \
+} \
+/* keep compiler quiet - no extra ; */ \
+extern int no_such_variable
+
+TSVECTORCMPFUNC(lt, <, BOOL);
+TSVECTORCMPFUNC(le, <=, BOOL);
+TSVECTORCMPFUNC(eq, ==, BOOL);
+TSVECTORCMPFUNC(ge, >=, BOOL);
+TSVECTORCMPFUNC(gt, >, BOOL);
+TSVECTORCMPFUNC(ne, !=, BOOL);
+TSVECTORCMPFUNC(cmp, +, INT32);
+
+Datum
+tsvector_strip(PG_FUNCTION_ARGS)
+{
+ TSVector in = PG_GETARG_TSVECTOR(0);
+ TSVector out;
+ int i,
+ len = 0;
+ WordEntry *arrin = ARRPTR(in),
+ *arrout;
+ char *cur;
+
+ for (i = 0; i < in->size; i++)
+ len += arrin[i].len;
+
+ len = CALCDATASIZE(in->size, len);
+ out = (TSVector) palloc0(len);
+ SET_VARSIZE(out, len);
+ out->size = in->size;
+ arrout = ARRPTR(out);
+ cur = STRPTR(out);
+ for (i = 0; i < in->size; i++)
+ {
+ memcpy(cur, STRPTR(in) + arrin[i].pos, arrin[i].len);
+ arrout[i].haspos = 0;
+ arrout[i].len = arrin[i].len;
+ arrout[i].pos = cur - STRPTR(out);
+ cur += arrout[i].len;
+ }
+
+ PG_FREE_IF_COPY(in, 0);
+ PG_RETURN_POINTER(out);
+}
+
+Datum
+tsvector_length(PG_FUNCTION_ARGS)
+{
+ TSVector in = PG_GETARG_TSVECTOR(0);
+ int32 ret = in->size;
+
+ PG_FREE_IF_COPY(in, 0);
+ PG_RETURN_INT32(ret);
+}
+
+Datum
+tsvector_setweight(PG_FUNCTION_ARGS)
+{
+ TSVector in = PG_GETARG_TSVECTOR(0);
+ char cw = PG_GETARG_CHAR(1);
+ TSVector out;
+ int i,
+ j;
+ WordEntry *entry;
+ WordEntryPos *p;
+ int w = 0;
+
+ switch (cw)
+ {
+ case 'A':
+ case 'a':
+ w = 3;
+ break;
+ case 'B':
+ case 'b':
+ w = 2;
+ break;
+ case 'C':
+ case 'c':
+ w = 1;
+ break;
+ case 'D':
+ case 'd':
+ w = 0;
+ break;
+ default:
+ /* internal error */
+ elog(ERROR, "unrecognized weight: %d", cw);
+ }
+
+ out = (TSVector) palloc(VARSIZE(in));
+ memcpy(out, in, VARSIZE(in));
+ entry = ARRPTR(out);
+ i = out->size;
+ while (i--)
+ {
+ if ((j = POSDATALEN(out, entry)) != 0)
+ {
+ p = POSDATAPTR(out, entry);
+ while (j--)
+ {
+ WEP_SETWEIGHT(*p, w);
+ p++;
+ }
+ }
+ entry++;
+ }
+
+ PG_FREE_IF_COPY(in, 0);
+ PG_RETURN_POINTER(out);
+}
+
+/*
+ * setweight(tsin tsvector, char_weight "char", lexemes "text"[])
+ *
+ * Assign weight w to elements of tsin that are listed in lexemes.
+ */
+Datum
+tsvector_setweight_by_filter(PG_FUNCTION_ARGS)
+{
+ TSVector tsin = PG_GETARG_TSVECTOR(0);
+ char char_weight = PG_GETARG_CHAR(1);
+ ArrayType *lexemes = PG_GETARG_ARRAYTYPE_P(2);
+
+ TSVector tsout;
+ int i,
+ j,
+ nlexemes,
+ weight;
+ WordEntry *entry;
+ Datum *dlexemes;
+ bool *nulls;
+
+ switch (char_weight)
+ {
+ case 'A':
+ case 'a':
+ weight = 3;
+ break;
+ case 'B':
+ case 'b':
+ weight = 2;
+ break;
+ case 'C':
+ case 'c':
+ weight = 1;
+ break;
+ case 'D':
+ case 'd':
+ weight = 0;
+ break;
+ default:
+ /* internal error */
+ elog(ERROR, "unrecognized weight: %c", char_weight);
+ }
+
+ tsout = (TSVector) palloc(VARSIZE(tsin));
+ memcpy(tsout, tsin, VARSIZE(tsin));
+ entry = ARRPTR(tsout);
+
+ deconstruct_array(lexemes, TEXTOID, -1, false, TYPALIGN_INT,
+ &dlexemes, &nulls, &nlexemes);
+
+ /*
+ * Assuming that lexemes array is significantly shorter than tsvector we
+ * can iterate through lexemes performing binary search of each lexeme
+ * from lexemes in tsvector.
+ */
+ for (i = 0; i < nlexemes; i++)
+ {
+ char *lex;
+ int lex_len,
+ lex_pos;
+
+ /* Ignore null array elements, they surely don't match */
+ if (nulls[i])
+ continue;
+
+ lex = VARDATA(dlexemes[i]);
+ lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+ lex_pos = tsvector_bsearch(tsout, lex, lex_len);
+
+ if (lex_pos >= 0 && (j = POSDATALEN(tsout, entry + lex_pos)) != 0)
+ {
+ WordEntryPos *p = POSDATAPTR(tsout, entry + lex_pos);
+
+ while (j--)
+ {
+ WEP_SETWEIGHT(*p, weight);
+ p++;
+ }
+ }
+ }
+
+ PG_FREE_IF_COPY(tsin, 0);
+ PG_FREE_IF_COPY(lexemes, 2);
+
+ PG_RETURN_POINTER(tsout);
+}
+
+#define compareEntry(pa, a, pb, b) \
+ tsCompareString((pa) + (a)->pos, (a)->len, \
+ (pb) + (b)->pos, (b)->len, \
+ false)
+
+/*
+ * Add positions from src to dest after offsetting them by maxpos.
+ * Return the number added (might be less than expected due to overflow)
+ */
+static int32
+add_pos(TSVector src, WordEntry *srcptr,
+ TSVector dest, WordEntry *destptr,
+ int32 maxpos)
+{
+ uint16 *clen = &_POSVECPTR(dest, destptr)->npos;
+ int i;
+ uint16 slen = POSDATALEN(src, srcptr),
+ startlen;
+ WordEntryPos *spos = POSDATAPTR(src, srcptr),
+ *dpos = POSDATAPTR(dest, destptr);
+
+ if (!destptr->haspos)
+ *clen = 0;
+
+ startlen = *clen;
+ for (i = 0;
+ i < slen && *clen < MAXNUMPOS &&
+ (*clen == 0 || WEP_GETPOS(dpos[*clen - 1]) != MAXENTRYPOS - 1);
+ i++)
+ {
+ WEP_SETWEIGHT(dpos[*clen], WEP_GETWEIGHT(spos[i]));
+ WEP_SETPOS(dpos[*clen], LIMITPOS(WEP_GETPOS(spos[i]) + maxpos));
+ (*clen)++;
+ }
+
+ if (*clen != startlen)
+ destptr->haspos = 1;
+ return *clen - startlen;
+}
+
+/*
+ * Perform binary search of given lexeme in TSVector.
+ * Returns lexeme position in TSVector's entry array or -1 if lexeme wasn't
+ * found.
+ */
+static int
+tsvector_bsearch(const TSVector tsv, char *lexeme, int lexeme_len)
+{
+ WordEntry *arrin = ARRPTR(tsv);
+ int StopLow = 0,
+ StopHigh = tsv->size,
+ StopMiddle,
+ cmp;
+
+ while (StopLow < StopHigh)
+ {
+ StopMiddle = (StopLow + StopHigh) / 2;
+
+ cmp = tsCompareString(lexeme, lexeme_len,
+ STRPTR(tsv) + arrin[StopMiddle].pos,
+ arrin[StopMiddle].len,
+ false);
+
+ if (cmp < 0)
+ StopHigh = StopMiddle;
+ else if (cmp > 0)
+ StopLow = StopMiddle + 1;
+ else /* found it */
+ return StopMiddle;
+ }
+
+ return -1;
+}
+
+/*
+ * qsort comparator functions
+ */
+
+static int
+compare_int(const void *va, const void *vb)
+{
+ int a = *((const int *) va);
+ int b = *((const int *) vb);
+
+ if (a == b)
+ return 0;
+ return (a > b) ? 1 : -1;
+}
+
+static int
+compare_text_lexemes(const void *va, const void *vb)
+{
+ Datum a = *((const Datum *) va);
+ Datum b = *((const Datum *) vb);
+ char *alex = VARDATA_ANY(a);
+ int alex_len = VARSIZE_ANY_EXHDR(a);
+ char *blex = VARDATA_ANY(b);
+ int blex_len = VARSIZE_ANY_EXHDR(b);
+
+ return tsCompareString(alex, alex_len, blex, blex_len, false);
+}
+
+/*
+ * Internal routine to delete lexemes from TSVector by array of offsets.
+ *
+ * int *indices_to_delete -- array of lexeme offsets to delete (modified here!)
+ * int indices_count -- size of that array
+ *
+ * Returns new TSVector without given lexemes along with their positions
+ * and weights.
+ */
+static TSVector
+tsvector_delete_by_indices(TSVector tsv, int *indices_to_delete,
+ int indices_count)
+{
+ TSVector tsout;
+ WordEntry *arrin = ARRPTR(tsv),
+ *arrout;
+ char *data = STRPTR(tsv),
+ *dataout;
+ int i, /* index in arrin */
+ j, /* index in arrout */
+ k, /* index in indices_to_delete */
+ curoff; /* index in dataout area */
+
+ /*
+ * Sort the filter array to simplify membership checks below. Also, get
+ * rid of any duplicate entries, so that we can assume that indices_count
+ * is exactly equal to the number of lexemes that will be removed.
+ */
+ if (indices_count > 1)
+ {
+ qsort(indices_to_delete, indices_count, sizeof(int), compare_int);
+ indices_count = qunique(indices_to_delete, indices_count, sizeof(int),
+ compare_int);
+ }
+
+ /*
+ * Here we overestimate tsout size, since we don't know how much space is
+ * used by the deleted lexeme(s). We will set exact size below.
+ */
+ tsout = (TSVector) palloc0(VARSIZE(tsv));
+
+ /* This count must be correct because STRPTR(tsout) relies on it. */
+ tsout->size = tsv->size - indices_count;
+
+ /*
+ * Copy tsv to tsout, skipping lexemes listed in indices_to_delete.
+ */
+ arrout = ARRPTR(tsout);
+ dataout = STRPTR(tsout);
+ curoff = 0;
+ for (i = j = k = 0; i < tsv->size; i++)
+ {
+ /*
+ * If current i is present in indices_to_delete, skip this lexeme.
+ * Since indices_to_delete is already sorted, we only need to check
+ * the current (k'th) entry.
+ */
+ if (k < indices_count && i == indices_to_delete[k])
+ {
+ k++;
+ continue;
+ }
+
+ /* Copy lexeme and its positions and weights */
+ memcpy(dataout + curoff, data + arrin[i].pos, arrin[i].len);
+ arrout[j].haspos = arrin[i].haspos;
+ arrout[j].len = arrin[i].len;
+ arrout[j].pos = curoff;
+ curoff += arrin[i].len;
+ if (arrin[i].haspos)
+ {
+ int len = POSDATALEN(tsv, arrin + i) * sizeof(WordEntryPos)
+ + sizeof(uint16);
+
+ curoff = SHORTALIGN(curoff);
+ memcpy(dataout + curoff,
+ STRPTR(tsv) + SHORTALIGN(arrin[i].pos + arrin[i].len),
+ len);
+ curoff += len;
+ }
+
+ j++;
+ }
+
+ /*
+ * k should now be exactly equal to indices_count. If it isn't then the
+ * caller provided us with indices outside of [0, tsv->size) range and
+ * estimation of tsout's size is wrong.
+ */
+ Assert(k == indices_count);
+
+ SET_VARSIZE(tsout, CALCDATASIZE(tsout->size, curoff));
+ return tsout;
+}
+
+/*
+ * Delete given lexeme from tsvector.
+ * Implementation of user-level ts_delete(tsvector, text).
+ */
+Datum
+tsvector_delete_str(PG_FUNCTION_ARGS)
+{
+ TSVector tsin = PG_GETARG_TSVECTOR(0),
+ tsout;
+ text *tlexeme = PG_GETARG_TEXT_PP(1);
+ char *lexeme = VARDATA_ANY(tlexeme);
+ int lexeme_len = VARSIZE_ANY_EXHDR(tlexeme),
+ skip_index;
+
+ if ((skip_index = tsvector_bsearch(tsin, lexeme, lexeme_len)) == -1)
+ PG_RETURN_POINTER(tsin);
+
+ tsout = tsvector_delete_by_indices(tsin, &skip_index, 1);
+
+ PG_FREE_IF_COPY(tsin, 0);
+ PG_FREE_IF_COPY(tlexeme, 1);
+ PG_RETURN_POINTER(tsout);
+}
+
+/*
+ * Delete given array of lexemes from tsvector.
+ * Implementation of user-level ts_delete(tsvector, text[]).
+ */
+Datum
+tsvector_delete_arr(PG_FUNCTION_ARGS)
+{
+ TSVector tsin = PG_GETARG_TSVECTOR(0),
+ tsout;
+ ArrayType *lexemes = PG_GETARG_ARRAYTYPE_P(1);
+ int i,
+ nlex,
+ skip_count,
+ *skip_indices;
+ Datum *dlexemes;
+ bool *nulls;
+
+ deconstruct_array(lexemes, TEXTOID, -1, false, TYPALIGN_INT,
+ &dlexemes, &nulls, &nlex);
+
+ /*
+ * In typical use case array of lexemes to delete is relatively small. So
+ * here we optimize things for that scenario: iterate through lexarr
+ * performing binary search of each lexeme from lexarr in tsvector.
+ */
+ skip_indices = palloc0(nlex * sizeof(int));
+ for (i = skip_count = 0; i < nlex; i++)
+ {
+ char *lex;
+ int lex_len,
+ lex_pos;
+
+ /* Ignore null array elements, they surely don't match */
+ if (nulls[i])
+ continue;
+
+ lex = VARDATA(dlexemes[i]);
+ lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+ lex_pos = tsvector_bsearch(tsin, lex, lex_len);
+
+ if (lex_pos >= 0)
+ skip_indices[skip_count++] = lex_pos;
+ }
+
+ tsout = tsvector_delete_by_indices(tsin, skip_indices, skip_count);
+
+ pfree(skip_indices);
+ PG_FREE_IF_COPY(tsin, 0);
+ PG_FREE_IF_COPY(lexemes, 1);
+
+ PG_RETURN_POINTER(tsout);
+}
+
+/*
+ * Expand tsvector as table with following columns:
+ * lexeme: lexeme text
+ * positions: integer array of lexeme positions
+ * weights: char array of weights corresponding to positions
+ */
+Datum
+tsvector_unnest(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ TSVector tsin;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcontext;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ tupdesc = CreateTemplateTupleDesc(3);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "lexeme",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "positions",
+ INT2ARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "weights",
+ TEXTARRAYOID, -1, 0);
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ funcctx->user_fctx = PG_GETARG_TSVECTOR_COPY(0);
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ tsin = (TSVector) funcctx->user_fctx;
+
+ if (funcctx->call_cntr < tsin->size)
+ {
+ WordEntry *arrin = ARRPTR(tsin);
+ char *data = STRPTR(tsin);
+ HeapTuple tuple;
+ int j,
+ i = funcctx->call_cntr;
+ bool nulls[] = {false, false, false};
+ Datum values[3];
+
+ values[0] = PointerGetDatum(cstring_to_text_with_len(data + arrin[i].pos, arrin[i].len));
+
+ if (arrin[i].haspos)
+ {
+ WordEntryPosVector *posv;
+ Datum *positions;
+ Datum *weights;
+ char weight;
+
+ /*
+ * Internally tsvector stores position and weight in the same
+ * uint16 (2 bits for weight, 14 for position). Here we extract
+ * that in two separate arrays.
+ */
+ posv = _POSVECPTR(tsin, arrin + i);
+ positions = palloc(posv->npos * sizeof(Datum));
+ weights = palloc(posv->npos * sizeof(Datum));
+ for (j = 0; j < posv->npos; j++)
+ {
+ positions[j] = Int16GetDatum(WEP_GETPOS(posv->pos[j]));
+ weight = 'D' - WEP_GETWEIGHT(posv->pos[j]);
+ weights[j] = PointerGetDatum(cstring_to_text_with_len(&weight,
+ 1));
+ }
+
+ values[1] = PointerGetDatum(construct_array(positions, posv->npos,
+ INT2OID, 2, true, TYPALIGN_SHORT));
+ values[2] = PointerGetDatum(construct_array(weights, posv->npos,
+ TEXTOID, -1, false, TYPALIGN_INT));
+ }
+ else
+ {
+ nulls[1] = nulls[2] = true;
+ }
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+ else
+ {
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/*
+ * Convert tsvector to array of lexemes.
+ */
+Datum
+tsvector_to_array(PG_FUNCTION_ARGS)
+{
+ TSVector tsin = PG_GETARG_TSVECTOR(0);
+ WordEntry *arrin = ARRPTR(tsin);
+ Datum *elements;
+ int i;
+ ArrayType *array;
+
+ elements = palloc(tsin->size * sizeof(Datum));
+
+ for (i = 0; i < tsin->size; i++)
+ {
+ elements[i] = PointerGetDatum(cstring_to_text_with_len(STRPTR(tsin) + arrin[i].pos,
+ arrin[i].len));
+ }
+
+ array = construct_array(elements, tsin->size, TEXTOID, -1, false, TYPALIGN_INT);
+
+ pfree(elements);
+ PG_FREE_IF_COPY(tsin, 0);
+ PG_RETURN_POINTER(array);
+}
+
+/*
+ * Build tsvector from array of lexemes.
+ */
+Datum
+array_to_tsvector(PG_FUNCTION_ARGS)
+{
+ ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
+ TSVector tsout;
+ Datum *dlexemes;
+ WordEntry *arrout;
+ bool *nulls;
+ int nitems,
+ i,
+ tslen,
+ datalen = 0;
+ char *cur;
+
+ deconstruct_array(v, TEXTOID, -1, false, TYPALIGN_INT, &dlexemes, &nulls, &nitems);
+
+ /*
+ * Reject nulls and zero length strings (maybe we should just ignore them,
+ * instead?)
+ */
+ for (i = 0; i < nitems; i++)
+ {
+ if (nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("lexeme array may not contain nulls")));
+
+ if (VARSIZE(dlexemes[i]) - VARHDRSZ == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_ZERO_LENGTH_CHARACTER_STRING),
+ errmsg("lexeme array may not contain empty strings")));
+ }
+
+ /* Sort and de-dup, because this is required for a valid tsvector. */
+ if (nitems > 1)
+ {
+ qsort(dlexemes, nitems, sizeof(Datum), compare_text_lexemes);
+ nitems = qunique(dlexemes, nitems, sizeof(Datum),
+ compare_text_lexemes);
+ }
+
+ /* Calculate space needed for surviving lexemes. */
+ for (i = 0; i < nitems; i++)
+ datalen += VARSIZE(dlexemes[i]) - VARHDRSZ;
+ tslen = CALCDATASIZE(nitems, datalen);
+
+ /* Allocate and fill tsvector. */
+ tsout = (TSVector) palloc0(tslen);
+ SET_VARSIZE(tsout, tslen);
+ tsout->size = nitems;
+
+ arrout = ARRPTR(tsout);
+ cur = STRPTR(tsout);
+ for (i = 0; i < nitems; i++)
+ {
+ char *lex = VARDATA(dlexemes[i]);
+ int lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+
+ memcpy(cur, lex, lex_len);
+ arrout[i].haspos = 0;
+ arrout[i].len = lex_len;
+ arrout[i].pos = cur - STRPTR(tsout);
+ cur += lex_len;
+ }
+
+ PG_FREE_IF_COPY(v, 0);
+ PG_RETURN_POINTER(tsout);
+}
+
+/*
+ * ts_filter(): keep only lexemes with given weights in tsvector.
+ */
+Datum
+tsvector_filter(PG_FUNCTION_ARGS)
+{
+ TSVector tsin = PG_GETARG_TSVECTOR(0),
+ tsout;
+ ArrayType *weights = PG_GETARG_ARRAYTYPE_P(1);
+ WordEntry *arrin = ARRPTR(tsin),
+ *arrout;
+ char *datain = STRPTR(tsin),
+ *dataout;
+ Datum *dweights;
+ bool *nulls;
+ int nweights;
+ int i,
+ j;
+ int cur_pos = 0;
+ char mask = 0;
+
+ deconstruct_array(weights, CHAROID, 1, true, TYPALIGN_CHAR,
+ &dweights, &nulls, &nweights);
+
+ for (i = 0; i < nweights; i++)
+ {
+ char char_weight;
+
+ if (nulls[i])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("weight array may not contain nulls")));
+
+ char_weight = DatumGetChar(dweights[i]);
+ switch (char_weight)
+ {
+ case 'A':
+ case 'a':
+ mask = mask | 8;
+ break;
+ case 'B':
+ case 'b':
+ mask = mask | 4;
+ break;
+ case 'C':
+ case 'c':
+ mask = mask | 2;
+ break;
+ case 'D':
+ case 'd':
+ mask = mask | 1;
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized weight: \"%c\"", char_weight)));
+ }
+ }
+
+ tsout = (TSVector) palloc0(VARSIZE(tsin));
+ tsout->size = tsin->size;
+ arrout = ARRPTR(tsout);
+ dataout = STRPTR(tsout);
+
+ for (i = j = 0; i < tsin->size; i++)
+ {
+ WordEntryPosVector *posvin,
+ *posvout;
+ int npos = 0;
+ int k;
+
+ if (!arrin[i].haspos)
+ continue;
+
+ posvin = _POSVECPTR(tsin, arrin + i);
+ posvout = (WordEntryPosVector *)
+ (dataout + SHORTALIGN(cur_pos + arrin[i].len));
+
+ for (k = 0; k < posvin->npos; k++)
+ {
+ if (mask & (1 << WEP_GETWEIGHT(posvin->pos[k])))
+ posvout->pos[npos++] = posvin->pos[k];
+ }
+
+ /* if no satisfactory positions found, skip lexeme */
+ if (!npos)
+ continue;
+
+ arrout[j].haspos = true;
+ arrout[j].len = arrin[i].len;
+ arrout[j].pos = cur_pos;
+
+ memcpy(dataout + cur_pos, datain + arrin[i].pos, arrin[i].len);
+ posvout->npos = npos;
+ cur_pos += SHORTALIGN(arrin[i].len);
+ cur_pos += POSDATALEN(tsout, arrout + j) * sizeof(WordEntryPos) +
+ sizeof(uint16);
+ j++;
+ }
+
+ tsout->size = j;
+ if (dataout != STRPTR(tsout))
+ memmove(STRPTR(tsout), dataout, cur_pos);
+
+ SET_VARSIZE(tsout, CALCDATASIZE(tsout->size, cur_pos));
+
+ PG_FREE_IF_COPY(tsin, 0);
+ PG_RETURN_POINTER(tsout);
+}
+
+Datum
+tsvector_concat(PG_FUNCTION_ARGS)
+{
+ TSVector in1 = PG_GETARG_TSVECTOR(0);
+ TSVector in2 = PG_GETARG_TSVECTOR(1);
+ TSVector out;
+ WordEntry *ptr;
+ WordEntry *ptr1,
+ *ptr2;
+ WordEntryPos *p;
+ int maxpos = 0,
+ i,
+ j,
+ i1,
+ i2,
+ dataoff,
+ output_bytes,
+ output_size;
+ char *data,
+ *data1,
+ *data2;
+
+ /* Get max position in in1; we'll need this to offset in2's positions */
+ ptr = ARRPTR(in1);
+ i = in1->size;
+ while (i--)
+ {
+ if ((j = POSDATALEN(in1, ptr)) != 0)
+ {
+ p = POSDATAPTR(in1, ptr);
+ while (j--)
+ {
+ if (WEP_GETPOS(*p) > maxpos)
+ maxpos = WEP_GETPOS(*p);
+ p++;
+ }
+ }
+ ptr++;
+ }
+
+ ptr1 = ARRPTR(in1);
+ ptr2 = ARRPTR(in2);
+ data1 = STRPTR(in1);
+ data2 = STRPTR(in2);
+ i1 = in1->size;
+ i2 = in2->size;
+
+ /*
+ * Conservative estimate of space needed. We might need all the data in
+ * both inputs, and conceivably add a pad byte before position data for
+ * each item where there was none before.
+ */
+ output_bytes = VARSIZE(in1) + VARSIZE(in2) + i1 + i2;
+
+ out = (TSVector) palloc0(output_bytes);
+ SET_VARSIZE(out, output_bytes);
+
+ /*
+ * We must make out->size valid so that STRPTR(out) is sensible. We'll
+ * collapse out any unused space at the end.
+ */
+ out->size = in1->size + in2->size;
+
+ ptr = ARRPTR(out);
+ data = STRPTR(out);
+ dataoff = 0;
+ while (i1 && i2)
+ {
+ int cmp = compareEntry(data1, ptr1, data2, ptr2);
+
+ if (cmp < 0)
+ { /* in1 first */
+ ptr->haspos = ptr1->haspos;
+ ptr->len = ptr1->len;
+ memcpy(data + dataoff, data1 + ptr1->pos, ptr1->len);
+ ptr->pos = dataoff;
+ dataoff += ptr1->len;
+ if (ptr->haspos)
+ {
+ dataoff = SHORTALIGN(dataoff);
+ memcpy(data + dataoff, _POSVECPTR(in1, ptr1), POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16));
+ dataoff += POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+
+ ptr++;
+ ptr1++;
+ i1--;
+ }
+ else if (cmp > 0)
+ { /* in2 first */
+ ptr->haspos = ptr2->haspos;
+ ptr->len = ptr2->len;
+ memcpy(data + dataoff, data2 + ptr2->pos, ptr2->len);
+ ptr->pos = dataoff;
+ dataoff += ptr2->len;
+ if (ptr->haspos)
+ {
+ int addlen = add_pos(in2, ptr2, out, ptr, maxpos);
+
+ if (addlen == 0)
+ ptr->haspos = 0;
+ else
+ {
+ dataoff = SHORTALIGN(dataoff);
+ dataoff += addlen * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+ }
+
+ ptr++;
+ ptr2++;
+ i2--;
+ }
+ else
+ {
+ ptr->haspos = ptr1->haspos | ptr2->haspos;
+ ptr->len = ptr1->len;
+ memcpy(data + dataoff, data1 + ptr1->pos, ptr1->len);
+ ptr->pos = dataoff;
+ dataoff += ptr1->len;
+ if (ptr->haspos)
+ {
+ if (ptr1->haspos)
+ {
+ dataoff = SHORTALIGN(dataoff);
+ memcpy(data + dataoff, _POSVECPTR(in1, ptr1), POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16));
+ dataoff += POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16);
+ if (ptr2->haspos)
+ dataoff += add_pos(in2, ptr2, out, ptr, maxpos) * sizeof(WordEntryPos);
+ }
+ else /* must have ptr2->haspos */
+ {
+ int addlen = add_pos(in2, ptr2, out, ptr, maxpos);
+
+ if (addlen == 0)
+ ptr->haspos = 0;
+ else
+ {
+ dataoff = SHORTALIGN(dataoff);
+ dataoff += addlen * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+ }
+ }
+
+ ptr++;
+ ptr1++;
+ ptr2++;
+ i1--;
+ i2--;
+ }
+ }
+
+ while (i1)
+ {
+ ptr->haspos = ptr1->haspos;
+ ptr->len = ptr1->len;
+ memcpy(data + dataoff, data1 + ptr1->pos, ptr1->len);
+ ptr->pos = dataoff;
+ dataoff += ptr1->len;
+ if (ptr->haspos)
+ {
+ dataoff = SHORTALIGN(dataoff);
+ memcpy(data + dataoff, _POSVECPTR(in1, ptr1), POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16));
+ dataoff += POSDATALEN(in1, ptr1) * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+
+ ptr++;
+ ptr1++;
+ i1--;
+ }
+
+ while (i2)
+ {
+ ptr->haspos = ptr2->haspos;
+ ptr->len = ptr2->len;
+ memcpy(data + dataoff, data2 + ptr2->pos, ptr2->len);
+ ptr->pos = dataoff;
+ dataoff += ptr2->len;
+ if (ptr->haspos)
+ {
+ int addlen = add_pos(in2, ptr2, out, ptr, maxpos);
+
+ if (addlen == 0)
+ ptr->haspos = 0;
+ else
+ {
+ dataoff = SHORTALIGN(dataoff);
+ dataoff += addlen * sizeof(WordEntryPos) + sizeof(uint16);
+ }
+ }
+
+ ptr++;
+ ptr2++;
+ i2--;
+ }
+
+ /*
+ * Instead of checking each offset individually, we check for overflow of
+ * pos fields once at the end.
+ */
+ if (dataoff > MAXSTRPOS)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("string is too long for tsvector (%d bytes, max %d bytes)", dataoff, MAXSTRPOS)));
+
+ /*
+ * Adjust sizes (asserting that we didn't overrun the original estimates)
+ * and collapse out any unused array entries.
+ */
+ output_size = ptr - ARRPTR(out);
+ Assert(output_size <= out->size);
+ out->size = output_size;
+ if (data != STRPTR(out))
+ memmove(STRPTR(out), data, dataoff);
+ output_bytes = CALCDATASIZE(out->size, dataoff);
+ Assert(output_bytes <= VARSIZE(out));
+ SET_VARSIZE(out, output_bytes);
+
+ PG_FREE_IF_COPY(in1, 0);
+ PG_FREE_IF_COPY(in2, 1);
+ PG_RETURN_POINTER(out);
+}
+
+/*
+ * Compare two strings by tsvector rules.
+ *
+ * if prefix = true then it returns zero value iff b has prefix a
+ */
+int32
+tsCompareString(char *a, int lena, char *b, int lenb, bool prefix)
+{
+ int cmp;
+
+ if (lena == 0)
+ {
+ if (prefix)
+ cmp = 0; /* empty string is prefix of anything */
+ else
+ cmp = (lenb > 0) ? -1 : 0;
+ }
+ else if (lenb == 0)
+ {
+ cmp = (lena > 0) ? 1 : 0;
+ }
+ else
+ {
+ cmp = memcmp(a, b, Min((unsigned int) lena, (unsigned int) lenb));
+
+ if (prefix)
+ {
+ if (cmp == 0 && lena > lenb)
+ cmp = 1; /* a is longer, so not a prefix of b */
+ }
+ else if (cmp == 0 && lena != lenb)
+ {
+ cmp = (lena < lenb) ? -1 : 1;
+ }
+ }
+
+ return cmp;
+}
+
+/*
+ * Check weight info or/and fill 'data' with the required positions
+ */
+static TSTernaryValue
+checkclass_str(CHKVAL *chkval, WordEntry *entry, QueryOperand *val,
+ ExecPhraseData *data)
+{
+ TSTernaryValue result = TS_NO;
+
+ Assert(data == NULL || data->npos == 0);
+
+ if (entry->haspos)
+ {
+ WordEntryPosVector *posvec;
+
+ /*
+ * We can't use the _POSVECPTR macro here because the pointer to the
+ * tsvector's lexeme storage is already contained in chkval->values.
+ */
+ posvec = (WordEntryPosVector *)
+ (chkval->values + SHORTALIGN(entry->pos + entry->len));
+
+ if (val->weight && data)
+ {
+ WordEntryPos *posvec_iter = posvec->pos;
+ WordEntryPos *dptr;
+
+ /*
+ * Filter position information by weights
+ */
+ dptr = data->pos = palloc(sizeof(WordEntryPos) * posvec->npos);
+ data->allocated = true;
+
+ /* Is there a position with a matching weight? */
+ while (posvec_iter < posvec->pos + posvec->npos)
+ {
+ /* If true, append this position to the data->pos */
+ if (val->weight & (1 << WEP_GETWEIGHT(*posvec_iter)))
+ {
+ *dptr = WEP_GETPOS(*posvec_iter);
+ dptr++;
+ }
+
+ posvec_iter++;
+ }
+
+ data->npos = dptr - data->pos;
+
+ if (data->npos > 0)
+ result = TS_YES;
+ else
+ {
+ pfree(data->pos);
+ data->pos = NULL;
+ data->allocated = false;
+ }
+ }
+ else if (val->weight)
+ {
+ WordEntryPos *posvec_iter = posvec->pos;
+
+ /* Is there a position with a matching weight? */
+ while (posvec_iter < posvec->pos + posvec->npos)
+ {
+ if (val->weight & (1 << WEP_GETWEIGHT(*posvec_iter)))
+ {
+ result = TS_YES;
+ break; /* no need to go further */
+ }
+
+ posvec_iter++;
+ }
+ }
+ else if (data)
+ {
+ data->npos = posvec->npos;
+ data->pos = posvec->pos;
+ data->allocated = false;
+ result = TS_YES;
+ }
+ else
+ {
+ /* simplest case: no weight check, positions not needed */
+ result = TS_YES;
+ }
+ }
+ else
+ {
+ /*
+ * Position info is lacking, so if the caller requires it, we can only
+ * say that maybe there is a match.
+ *
+ * Notice, however, that we *don't* check val->weight here.
+ * Historically, stripped tsvectors are considered to match queries
+ * whether or not the query has a weight restriction; that's a little
+ * dubious but we'll preserve the behavior.
+ */
+ if (data)
+ result = TS_MAYBE;
+ else
+ result = TS_YES;
+ }
+
+ return result;
+}
+
+/*
+ * TS_execute callback for matching a tsquery operand to plain tsvector data
+ */
+static TSTernaryValue
+checkcondition_str(void *checkval, QueryOperand *val, ExecPhraseData *data)
+{
+ CHKVAL *chkval = (CHKVAL *) checkval;
+ WordEntry *StopLow = chkval->arrb;
+ WordEntry *StopHigh = chkval->arre;
+ WordEntry *StopMiddle = StopHigh;
+ TSTernaryValue res = TS_NO;
+
+ /* Loop invariant: StopLow <= val < StopHigh */
+ while (StopLow < StopHigh)
+ {
+ int difference;
+
+ StopMiddle = StopLow + (StopHigh - StopLow) / 2;
+ difference = tsCompareString(chkval->operand + val->distance,
+ val->length,
+ chkval->values + StopMiddle->pos,
+ StopMiddle->len,
+ false);
+
+ if (difference == 0)
+ {
+ /* Check weight info & fill 'data' with positions */
+ res = checkclass_str(chkval, StopMiddle, val, data);
+ break;
+ }
+ else if (difference > 0)
+ StopLow = StopMiddle + 1;
+ else
+ StopHigh = StopMiddle;
+ }
+
+ /*
+ * If it's a prefix search, we should also consider lexemes that the
+ * search term is a prefix of (which will necessarily immediately follow
+ * the place we found in the above loop). But we can skip them if there
+ * was a definite match on the exact term AND the caller doesn't need
+ * position info.
+ */
+ if (val->prefix && (res != TS_YES || data))
+ {
+ WordEntryPos *allpos = NULL;
+ int npos = 0,
+ totalpos = 0;
+
+ /* adjust start position for corner case */
+ if (StopLow >= StopHigh)
+ StopMiddle = StopHigh;
+
+ /* we don't try to re-use any data from the initial match */
+ if (data)
+ {
+ if (data->allocated)
+ pfree(data->pos);
+ data->pos = NULL;
+ data->allocated = false;
+ data->npos = 0;
+ }
+ res = TS_NO;
+
+ while ((res != TS_YES || data) &&
+ StopMiddle < chkval->arre &&
+ tsCompareString(chkval->operand + val->distance,
+ val->length,
+ chkval->values + StopMiddle->pos,
+ StopMiddle->len,
+ true) == 0)
+ {
+ TSTernaryValue subres;
+
+ subres = checkclass_str(chkval, StopMiddle, val, data);
+
+ if (subres != TS_NO)
+ {
+ if (data)
+ {
+ /*
+ * We need to join position information
+ */
+ if (subres == TS_MAYBE)
+ {
+ /*
+ * No position info for this match, so we must report
+ * MAYBE overall.
+ */
+ res = TS_MAYBE;
+ /* forget any previous positions */
+ npos = 0;
+ /* don't leak storage */
+ if (allpos)
+ pfree(allpos);
+ break;
+ }
+
+ while (npos + data->npos > totalpos)
+ {
+ if (totalpos == 0)
+ {
+ totalpos = 256;
+ allpos = palloc(sizeof(WordEntryPos) * totalpos);
+ }
+ else
+ {
+ totalpos *= 2;
+ allpos = repalloc(allpos, sizeof(WordEntryPos) * totalpos);
+ }
+ }
+
+ memcpy(allpos + npos, data->pos, sizeof(WordEntryPos) * data->npos);
+ npos += data->npos;
+
+ /* don't leak storage from individual matches */
+ if (data->allocated)
+ pfree(data->pos);
+ data->pos = NULL;
+ data->allocated = false;
+ /* it's important to reset data->npos before next loop */
+ data->npos = 0;
+ }
+ else
+ {
+ /* Don't need positions, just handle YES/MAYBE */
+ if (subres == TS_YES || res == TS_NO)
+ res = subres;
+ }
+ }
+
+ StopMiddle++;
+ }
+
+ if (data && npos > 0)
+ {
+ /* Sort and make unique array of found positions */
+ data->pos = allpos;
+ qsort(data->pos, npos, sizeof(WordEntryPos), compareWordEntryPos);
+ data->npos = qunique(data->pos, npos, sizeof(WordEntryPos),
+ compareWordEntryPos);
+ data->allocated = true;
+ res = TS_YES;
+ }
+ }
+
+ return res;
+}
+
+/*
+ * Compute output position list for a tsquery operator in phrase mode.
+ *
+ * Merge the position lists in Ldata and Rdata as specified by "emit",
+ * returning the result list into *data. The input position lists must be
+ * sorted and unique, and the output will be as well.
+ *
+ * data: pointer to initially-all-zeroes output struct, or NULL
+ * Ldata, Rdata: input position lists
+ * emit: bitmask of TSPO_XXX flags
+ * Loffset: offset to be added to Ldata positions before comparing/outputting
+ * Roffset: offset to be added to Rdata positions before comparing/outputting
+ * max_npos: maximum possible required size of output position array
+ *
+ * Loffset and Roffset should not be negative, else we risk trying to output
+ * negative positions, which won't fit into WordEntryPos.
+ *
+ * The result is boolean (TS_YES or TS_NO), but for the caller's convenience
+ * we return it as TSTernaryValue.
+ *
+ * Returns TS_YES if any positions were emitted to *data; or if data is NULL,
+ * returns TS_YES if any positions would have been emitted.
+ */
+#define TSPO_L_ONLY 0x01 /* emit positions appearing only in L */
+#define TSPO_R_ONLY 0x02 /* emit positions appearing only in R */
+#define TSPO_BOTH 0x04 /* emit positions appearing in both L&R */
+
+static TSTernaryValue
+TS_phrase_output(ExecPhraseData *data,
+ ExecPhraseData *Ldata,
+ ExecPhraseData *Rdata,
+ int emit,
+ int Loffset,
+ int Roffset,
+ int max_npos)
+{
+ int Lindex,
+ Rindex;
+
+ /* Loop until both inputs are exhausted */
+ Lindex = Rindex = 0;
+ while (Lindex < Ldata->npos || Rindex < Rdata->npos)
+ {
+ int Lpos,
+ Rpos;
+ int output_pos = 0;
+
+ /*
+ * Fetch current values to compare. WEP_GETPOS() is needed because
+ * ExecPhraseData->data can point to a tsvector's WordEntryPosVector.
+ */
+ if (Lindex < Ldata->npos)
+ Lpos = WEP_GETPOS(Ldata->pos[Lindex]) + Loffset;
+ else
+ {
+ /* L array exhausted, so we're done if R_ONLY isn't set */
+ if (!(emit & TSPO_R_ONLY))
+ break;
+ Lpos = INT_MAX;
+ }
+ if (Rindex < Rdata->npos)
+ Rpos = WEP_GETPOS(Rdata->pos[Rindex]) + Roffset;
+ else
+ {
+ /* R array exhausted, so we're done if L_ONLY isn't set */
+ if (!(emit & TSPO_L_ONLY))
+ break;
+ Rpos = INT_MAX;
+ }
+
+ /* Merge-join the two input lists */
+ if (Lpos < Rpos)
+ {
+ /* Lpos is not matched in Rdata, should we output it? */
+ if (emit & TSPO_L_ONLY)
+ output_pos = Lpos;
+ Lindex++;
+ }
+ else if (Lpos == Rpos)
+ {
+ /* Lpos and Rpos match ... should we output it? */
+ if (emit & TSPO_BOTH)
+ output_pos = Rpos;
+ Lindex++;
+ Rindex++;
+ }
+ else /* Lpos > Rpos */
+ {
+ /* Rpos is not matched in Ldata, should we output it? */
+ if (emit & TSPO_R_ONLY)
+ output_pos = Rpos;
+ Rindex++;
+ }
+
+ if (output_pos > 0)
+ {
+ if (data)
+ {
+ /* Store position, first allocating output array if needed */
+ if (data->pos == NULL)
+ {
+ data->pos = (WordEntryPos *)
+ palloc(max_npos * sizeof(WordEntryPos));
+ data->allocated = true;
+ }
+ data->pos[data->npos++] = output_pos;
+ }
+ else
+ {
+ /*
+ * Exact positions not needed, so return TS_YES as soon as we
+ * know there is at least one.
+ */
+ return TS_YES;
+ }
+ }
+ }
+
+ if (data && data->npos > 0)
+ {
+ /* Let's assert we didn't overrun the array */
+ Assert(data->npos <= max_npos);
+ return TS_YES;
+ }
+ return TS_NO;
+}
+
+/*
+ * Execute tsquery at or below an OP_PHRASE operator.
+ *
+ * This handles tsquery execution at recursion levels where we need to care
+ * about match locations.
+ *
+ * In addition to the same arguments used for TS_execute, the caller may pass
+ * a preinitialized-to-zeroes ExecPhraseData struct, to be filled with lexeme
+ * match position info on success. data == NULL if no position data need be
+ * returned. (In practice, outside callers pass NULL, and only the internal
+ * recursion cases pass a data pointer.)
+ * Note: the function assumes data != NULL for operators other than OP_PHRASE.
+ * This is OK because an outside call always starts from an OP_PHRASE node.
+ *
+ * The detailed semantics of the match data, given that the function returned
+ * TS_YES (successful match), are:
+ *
+ * npos > 0, negate = false:
+ * query is matched at specified position(s) (and only those positions)
+ * npos > 0, negate = true:
+ * query is matched at all positions *except* specified position(s)
+ * npos = 0, negate = true:
+ * query is matched at all positions
+ * npos = 0, negate = false:
+ * disallowed (this should result in TS_NO or TS_MAYBE, as appropriate)
+ *
+ * Successful matches also return a "width" value which is the match width in
+ * lexemes, less one. Hence, "width" is zero for simple one-lexeme matches,
+ * and is the sum of the phrase operator distances for phrase matches. Note
+ * that when width > 0, the listed positions represent the ends of matches not
+ * the starts. (This unintuitive rule is needed to avoid possibly generating
+ * negative positions, which wouldn't fit into the WordEntryPos arrays.)
+ *
+ * If the TSExecuteCallback function reports that an operand is present
+ * but fails to provide position(s) for it, we will return TS_MAYBE when
+ * it is possible but not certain that the query is matched.
+ *
+ * When the function returns TS_NO or TS_MAYBE, it must return npos = 0,
+ * negate = false (which is the state initialized by the caller); but the
+ * "width" output in such cases is undefined.
+ */
+static TSTernaryValue
+TS_phrase_execute(QueryItem *curitem, void *arg, uint32 flags,
+ TSExecuteCallback chkcond,
+ ExecPhraseData *data)
+{
+ ExecPhraseData Ldata,
+ Rdata;
+ TSTernaryValue lmatch,
+ rmatch;
+ int Loffset,
+ Roffset,
+ maxwidth;
+
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ /* ... and let's check for query cancel while we're at it */
+ CHECK_FOR_INTERRUPTS();
+
+ if (curitem->type == QI_VAL)
+ return chkcond(arg, (QueryOperand *) curitem, data);
+
+ switch (curitem->qoperator.oper)
+ {
+ case OP_NOT:
+
+ /*
+ * We need not touch data->width, since a NOT operation does not
+ * change the match width.
+ */
+ if (flags & TS_EXEC_SKIP_NOT)
+ {
+ /* with SKIP_NOT, report NOT as "match everywhere" */
+ Assert(data->npos == 0 && !data->negate);
+ data->negate = true;
+ return TS_YES;
+ }
+ switch (TS_phrase_execute(curitem + 1, arg, flags, chkcond, data))
+ {
+ case TS_NO:
+ /* change "match nowhere" to "match everywhere" */
+ Assert(data->npos == 0 && !data->negate);
+ data->negate = true;
+ return TS_YES;
+ case TS_YES:
+ if (data->npos > 0)
+ {
+ /* we have some positions, invert negate flag */
+ data->negate = !data->negate;
+ return TS_YES;
+ }
+ else if (data->negate)
+ {
+ /* change "match everywhere" to "match nowhere" */
+ data->negate = false;
+ return TS_NO;
+ }
+ /* Should not get here if result was TS_YES */
+ Assert(false);
+ break;
+ case TS_MAYBE:
+ /* match positions are, and remain, uncertain */
+ return TS_MAYBE;
+ }
+ break;
+
+ case OP_PHRASE:
+ case OP_AND:
+ memset(&Ldata, 0, sizeof(Ldata));
+ memset(&Rdata, 0, sizeof(Rdata));
+
+ lmatch = TS_phrase_execute(curitem + curitem->qoperator.left,
+ arg, flags, chkcond, &Ldata);
+ if (lmatch == TS_NO)
+ return TS_NO;
+
+ rmatch = TS_phrase_execute(curitem + 1,
+ arg, flags, chkcond, &Rdata);
+ if (rmatch == TS_NO)
+ return TS_NO;
+
+ /*
+ * If either operand has no position information, then we can't
+ * return reliable position data, only a MAYBE result.
+ */
+ if (lmatch == TS_MAYBE || rmatch == TS_MAYBE)
+ return TS_MAYBE;
+
+ if (curitem->qoperator.oper == OP_PHRASE)
+ {
+ /*
+ * Compute Loffset and Roffset suitable for phrase match, and
+ * compute overall width of whole phrase match.
+ */
+ Loffset = curitem->qoperator.distance + Rdata.width;
+ Roffset = 0;
+ if (data)
+ data->width = curitem->qoperator.distance +
+ Ldata.width + Rdata.width;
+ }
+ else
+ {
+ /*
+ * For OP_AND, set output width and alignment like OP_OR (see
+ * comment below)
+ */
+ maxwidth = Max(Ldata.width, Rdata.width);
+ Loffset = maxwidth - Ldata.width;
+ Roffset = maxwidth - Rdata.width;
+ if (data)
+ data->width = maxwidth;
+ }
+
+ if (Ldata.negate && Rdata.negate)
+ {
+ /* !L & !R: treat as !(L | R) */
+ (void) TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_BOTH | TSPO_L_ONLY | TSPO_R_ONLY,
+ Loffset, Roffset,
+ Ldata.npos + Rdata.npos);
+ if (data)
+ data->negate = true;
+ return TS_YES;
+ }
+ else if (Ldata.negate)
+ {
+ /* !L & R */
+ return TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_R_ONLY,
+ Loffset, Roffset,
+ Rdata.npos);
+ }
+ else if (Rdata.negate)
+ {
+ /* L & !R */
+ return TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_L_ONLY,
+ Loffset, Roffset,
+ Ldata.npos);
+ }
+ else
+ {
+ /* straight AND */
+ return TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_BOTH,
+ Loffset, Roffset,
+ Min(Ldata.npos, Rdata.npos));
+ }
+
+ case OP_OR:
+ memset(&Ldata, 0, sizeof(Ldata));
+ memset(&Rdata, 0, sizeof(Rdata));
+
+ lmatch = TS_phrase_execute(curitem + curitem->qoperator.left,
+ arg, flags, chkcond, &Ldata);
+ rmatch = TS_phrase_execute(curitem + 1,
+ arg, flags, chkcond, &Rdata);
+
+ if (lmatch == TS_NO && rmatch == TS_NO)
+ return TS_NO;
+
+ /*
+ * If either operand has no position information, then we can't
+ * return reliable position data, only a MAYBE result.
+ */
+ if (lmatch == TS_MAYBE || rmatch == TS_MAYBE)
+ return TS_MAYBE;
+
+ /*
+ * Cope with undefined output width from failed submatch. (This
+ * takes less code than trying to ensure that all failure returns
+ * set data->width to zero.)
+ */
+ if (lmatch == TS_NO)
+ Ldata.width = 0;
+ if (rmatch == TS_NO)
+ Rdata.width = 0;
+
+ /*
+ * For OP_AND and OP_OR, report the width of the wider of the two
+ * inputs, and align the narrower input's positions to the right
+ * end of that width. This rule deals at least somewhat
+ * reasonably with cases like "x <-> (y | z <-> q)".
+ */
+ maxwidth = Max(Ldata.width, Rdata.width);
+ Loffset = maxwidth - Ldata.width;
+ Roffset = maxwidth - Rdata.width;
+ data->width = maxwidth;
+
+ if (Ldata.negate && Rdata.negate)
+ {
+ /* !L | !R: treat as !(L & R) */
+ (void) TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_BOTH,
+ Loffset, Roffset,
+ Min(Ldata.npos, Rdata.npos));
+ data->negate = true;
+ return TS_YES;
+ }
+ else if (Ldata.negate)
+ {
+ /* !L | R: treat as !(L & !R) */
+ (void) TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_L_ONLY,
+ Loffset, Roffset,
+ Ldata.npos);
+ data->negate = true;
+ return TS_YES;
+ }
+ else if (Rdata.negate)
+ {
+ /* L | !R: treat as !(!L & R) */
+ (void) TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_R_ONLY,
+ Loffset, Roffset,
+ Rdata.npos);
+ data->negate = true;
+ return TS_YES;
+ }
+ else
+ {
+ /* straight OR */
+ return TS_phrase_output(data, &Ldata, &Rdata,
+ TSPO_BOTH | TSPO_L_ONLY | TSPO_R_ONLY,
+ Loffset, Roffset,
+ Ldata.npos + Rdata.npos);
+ }
+
+ default:
+ elog(ERROR, "unrecognized operator: %d", curitem->qoperator.oper);
+ }
+
+ /* not reachable, but keep compiler quiet */
+ return TS_NO;
+}
+
+
+/*
+ * Evaluate tsquery boolean expression.
+ *
+ * curitem: current tsquery item (initially, the first one)
+ * arg: opaque value to pass through to callback function
+ * flags: bitmask of flag bits shown in ts_utils.h
+ * chkcond: callback function to check whether a primitive value is present
+ */
+bool
+TS_execute(QueryItem *curitem, void *arg, uint32 flags,
+ TSExecuteCallback chkcond)
+{
+ /*
+ * If we get TS_MAYBE from the recursion, return true. We could only see
+ * that result if the caller passed TS_EXEC_PHRASE_NO_POS, so there's no
+ * need to check again.
+ */
+ return TS_execute_recurse(curitem, arg, flags, chkcond) != TS_NO;
+}
+
+/*
+ * Evaluate tsquery boolean expression.
+ *
+ * This is the same as TS_execute except that TS_MAYBE is returned as-is.
+ */
+TSTernaryValue
+TS_execute_ternary(QueryItem *curitem, void *arg, uint32 flags,
+ TSExecuteCallback chkcond)
+{
+ return TS_execute_recurse(curitem, arg, flags, chkcond);
+}
+
+/*
+ * TS_execute recursion for operators above any phrase operator. Here we do
+ * not need to worry about lexeme positions. As soon as we hit an OP_PHRASE
+ * operator, we pass it off to TS_phrase_execute which does worry.
+ */
+static TSTernaryValue
+TS_execute_recurse(QueryItem *curitem, void *arg, uint32 flags,
+ TSExecuteCallback chkcond)
+{
+ TSTernaryValue lmatch;
+
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ /* ... and let's check for query cancel while we're at it */
+ CHECK_FOR_INTERRUPTS();
+
+ if (curitem->type == QI_VAL)
+ return chkcond(arg, (QueryOperand *) curitem,
+ NULL /* don't need position info */ );
+
+ switch (curitem->qoperator.oper)
+ {
+ case OP_NOT:
+ if (flags & TS_EXEC_SKIP_NOT)
+ return TS_YES;
+ switch (TS_execute_recurse(curitem + 1, arg, flags, chkcond))
+ {
+ case TS_NO:
+ return TS_YES;
+ case TS_YES:
+ return TS_NO;
+ case TS_MAYBE:
+ return TS_MAYBE;
+ }
+ break;
+
+ case OP_AND:
+ lmatch = TS_execute_recurse(curitem + curitem->qoperator.left, arg,
+ flags, chkcond);
+ if (lmatch == TS_NO)
+ return TS_NO;
+ switch (TS_execute_recurse(curitem + 1, arg, flags, chkcond))
+ {
+ case TS_NO:
+ return TS_NO;
+ case TS_YES:
+ return lmatch;
+ case TS_MAYBE:
+ return TS_MAYBE;
+ }
+ break;
+
+ case OP_OR:
+ lmatch = TS_execute_recurse(curitem + curitem->qoperator.left, arg,
+ flags, chkcond);
+ if (lmatch == TS_YES)
+ return TS_YES;
+ switch (TS_execute_recurse(curitem + 1, arg, flags, chkcond))
+ {
+ case TS_NO:
+ return lmatch;
+ case TS_YES:
+ return TS_YES;
+ case TS_MAYBE:
+ return TS_MAYBE;
+ }
+ break;
+
+ case OP_PHRASE:
+
+ /*
+ * If we get a MAYBE result, and the caller doesn't want that,
+ * convert it to NO. It would be more consistent, perhaps, to
+ * return the result of TS_phrase_execute() verbatim and then
+ * convert MAYBE results at the top of the recursion. But
+ * converting at the topmost phrase operator gives results that
+ * are bug-compatible with the old implementation, so do it like
+ * this for now.
+ */
+ switch (TS_phrase_execute(curitem, arg, flags, chkcond, NULL))
+ {
+ case TS_NO:
+ return TS_NO;
+ case TS_YES:
+ return TS_YES;
+ case TS_MAYBE:
+ return (flags & TS_EXEC_PHRASE_NO_POS) ? TS_MAYBE : TS_NO;
+ }
+ break;
+
+ default:
+ elog(ERROR, "unrecognized operator: %d", curitem->qoperator.oper);
+ }
+
+ /* not reachable, but keep compiler quiet */
+ return TS_NO;
+}
+
+/*
+ * Detect whether a tsquery boolean expression requires any positive matches
+ * to values shown in the tsquery.
+ *
+ * This is needed to know whether a GIN index search requires full index scan.
+ * For example, 'x & !y' requires a match of x, so it's sufficient to scan
+ * entries for x; but 'x | !y' could match rows containing neither x nor y.
+ */
+bool
+tsquery_requires_match(QueryItem *curitem)
+{
+ /* since this function recurses, it could be driven to stack overflow */
+ check_stack_depth();
+
+ if (curitem->type == QI_VAL)
+ return true;
+
+ switch (curitem->qoperator.oper)
+ {
+ case OP_NOT:
+
+ /*
+ * Assume there are no required matches underneath a NOT. For
+ * some cases with nested NOTs, we could prove there's a required
+ * match, but it seems unlikely to be worth the trouble.
+ */
+ return false;
+
+ case OP_PHRASE:
+
+ /*
+ * Treat OP_PHRASE as OP_AND here
+ */
+ case OP_AND:
+ /* If either side requires a match, we're good */
+ if (tsquery_requires_match(curitem + curitem->qoperator.left))
+ return true;
+ else
+ return tsquery_requires_match(curitem + 1);
+
+ case OP_OR:
+ /* Both sides must require a match */
+ if (tsquery_requires_match(curitem + curitem->qoperator.left))
+ return tsquery_requires_match(curitem + 1);
+ else
+ return false;
+
+ default:
+ elog(ERROR, "unrecognized operator: %d", curitem->qoperator.oper);
+ }
+
+ /* not reachable, but keep compiler quiet */
+ return false;
+}
+
+/*
+ * boolean operations
+ */
+Datum
+ts_match_qv(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(ts_match_vq,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)));
+}
+
+Datum
+ts_match_vq(PG_FUNCTION_ARGS)
+{
+ TSVector val = PG_GETARG_TSVECTOR(0);
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ CHKVAL chkval;
+ bool result;
+
+ /* empty query matches nothing */
+ if (!query->size)
+ {
+ PG_FREE_IF_COPY(val, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_BOOL(false);
+ }
+
+ chkval.arrb = ARRPTR(val);
+ chkval.arre = chkval.arrb + val->size;
+ chkval.values = STRPTR(val);
+ chkval.operand = GETOPERAND(query);
+ result = TS_execute(GETQUERY(query),
+ &chkval,
+ TS_EXEC_EMPTY,
+ checkcondition_str);
+
+ PG_FREE_IF_COPY(val, 0);
+ PG_FREE_IF_COPY(query, 1);
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+ts_match_tt(PG_FUNCTION_ARGS)
+{
+ TSVector vector;
+ TSQuery query;
+ bool res;
+
+ vector = DatumGetTSVector(DirectFunctionCall1(to_tsvector,
+ PG_GETARG_DATUM(0)));
+ query = DatumGetTSQuery(DirectFunctionCall1(plainto_tsquery,
+ PG_GETARG_DATUM(1)));
+
+ res = DatumGetBool(DirectFunctionCall2(ts_match_vq,
+ TSVectorGetDatum(vector),
+ TSQueryGetDatum(query)));
+
+ pfree(vector);
+ pfree(query);
+
+ PG_RETURN_BOOL(res);
+}
+
+Datum
+ts_match_tq(PG_FUNCTION_ARGS)
+{
+ TSVector vector;
+ TSQuery query = PG_GETARG_TSQUERY(1);
+ bool res;
+
+ vector = DatumGetTSVector(DirectFunctionCall1(to_tsvector,
+ PG_GETARG_DATUM(0)));
+
+ res = DatumGetBool(DirectFunctionCall2(ts_match_vq,
+ TSVectorGetDatum(vector),
+ TSQueryGetDatum(query)));
+
+ pfree(vector);
+ PG_FREE_IF_COPY(query, 1);
+
+ PG_RETURN_BOOL(res);
+}
+
+/*
+ * ts_stat statistic function support
+ */
+
+
+/*
+ * Returns the number of positions in value 'wptr' within tsvector 'txt',
+ * that have a weight equal to one of the weights in 'weight' bitmask.
+ */
+static int
+check_weight(TSVector txt, WordEntry *wptr, int8 weight)
+{
+ int len = POSDATALEN(txt, wptr);
+ int num = 0;
+ WordEntryPos *ptr = POSDATAPTR(txt, wptr);
+
+ while (len--)
+ {
+ if (weight & (1 << WEP_GETWEIGHT(*ptr)))
+ num++;
+ ptr++;
+ }
+ return num;
+}
+
+#define compareStatWord(a,e,t) \
+ tsCompareString((a)->lexeme, (a)->lenlexeme, \
+ STRPTR(t) + (e)->pos, (e)->len, \
+ false)
+
+static void
+insertStatEntry(MemoryContext persistentContext, TSVectorStat *stat, TSVector txt, uint32 off)
+{
+ WordEntry *we = ARRPTR(txt) + off;
+ StatEntry *node = stat->root,
+ *pnode = NULL;
+ int n,
+ res = 0;
+ uint32 depth = 1;
+
+ if (stat->weight == 0)
+ n = (we->haspos) ? POSDATALEN(txt, we) : 1;
+ else
+ n = (we->haspos) ? check_weight(txt, we, stat->weight) : 0;
+
+ if (n == 0)
+ return; /* nothing to insert */
+
+ while (node)
+ {
+ res = compareStatWord(node, we, txt);
+
+ if (res == 0)
+ {
+ break;
+ }
+ else
+ {
+ pnode = node;
+ node = (res < 0) ? node->left : node->right;
+ }
+ depth++;
+ }
+
+ if (depth > stat->maxdepth)
+ stat->maxdepth = depth;
+
+ if (node == NULL)
+ {
+ node = MemoryContextAlloc(persistentContext, STATENTRYHDRSZ + we->len);
+ node->left = node->right = NULL;
+ node->ndoc = 1;
+ node->nentry = n;
+ node->lenlexeme = we->len;
+ memcpy(node->lexeme, STRPTR(txt) + we->pos, node->lenlexeme);
+
+ if (pnode == NULL)
+ {
+ stat->root = node;
+ }
+ else
+ {
+ if (res < 0)
+ pnode->left = node;
+ else
+ pnode->right = node;
+ }
+ }
+ else
+ {
+ node->ndoc++;
+ node->nentry += n;
+ }
+}
+
+static void
+chooseNextStatEntry(MemoryContext persistentContext, TSVectorStat *stat, TSVector txt,
+ uint32 low, uint32 high, uint32 offset)
+{
+ uint32 pos;
+ uint32 middle = (low + high) >> 1;
+
+ pos = (low + middle) >> 1;
+ if (low != middle && pos >= offset && pos - offset < txt->size)
+ insertStatEntry(persistentContext, stat, txt, pos - offset);
+ pos = (high + middle + 1) >> 1;
+ if (middle + 1 != high && pos >= offset && pos - offset < txt->size)
+ insertStatEntry(persistentContext, stat, txt, pos - offset);
+
+ if (low != middle)
+ chooseNextStatEntry(persistentContext, stat, txt, low, middle, offset);
+ if (high != middle + 1)
+ chooseNextStatEntry(persistentContext, stat, txt, middle + 1, high, offset);
+}
+
+/*
+ * This is written like a custom aggregate function, because the
+ * original plan was to do just that. Unfortunately, an aggregate function
+ * can't return a set, so that plan was abandoned. If that limitation is
+ * lifted in the future, ts_stat could be a real aggregate function so that
+ * you could use it like this:
+ *
+ * SELECT ts_stat(vector_column) FROM vector_table;
+ *
+ * where vector_column is a tsvector-type column in vector_table.
+ */
+
+static TSVectorStat *
+ts_accum(MemoryContext persistentContext, TSVectorStat *stat, Datum data)
+{
+ TSVector txt = DatumGetTSVector(data);
+ uint32 i,
+ nbit = 0,
+ offset;
+
+ if (stat == NULL)
+ { /* Init in first */
+ stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+ stat->maxdepth = 1;
+ }
+
+ /* simple check of correctness */
+ if (txt == NULL || txt->size == 0)
+ {
+ if (txt && txt != (TSVector) DatumGetPointer(data))
+ pfree(txt);
+ return stat;
+ }
+
+ i = txt->size - 1;
+ for (; i > 0; i >>= 1)
+ nbit++;
+
+ nbit = 1 << nbit;
+ offset = (nbit - txt->size) / 2;
+
+ insertStatEntry(persistentContext, stat, txt, (nbit >> 1) - offset);
+ chooseNextStatEntry(persistentContext, stat, txt, 0, nbit, offset);
+
+ return stat;
+}
+
+static void
+ts_setup_firstcall(FunctionCallInfo fcinfo, FuncCallContext *funcctx,
+ TSVectorStat *stat)
+{
+ TupleDesc tupdesc;
+ MemoryContext oldcontext;
+ StatEntry *node;
+
+ funcctx->user_fctx = (void *) stat;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ stat->stack = palloc0(sizeof(StatEntry *) * (stat->maxdepth + 1));
+ stat->stackpos = 0;
+
+ node = stat->root;
+ /* find leftmost value */
+ if (node == NULL)
+ stat->stack[stat->stackpos] = NULL;
+ else
+ for (;;)
+ {
+ stat->stack[stat->stackpos] = node;
+ if (node->left)
+ {
+ stat->stackpos++;
+ node = node->left;
+ }
+ else
+ break;
+ }
+ Assert(stat->stackpos <= stat->maxdepth);
+
+ tupdesc = CreateTemplateTupleDesc(3);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "word",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "ndoc",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "nentry",
+ INT4OID, -1, 0);
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+static StatEntry *
+walkStatEntryTree(TSVectorStat *stat)
+{
+ StatEntry *node = stat->stack[stat->stackpos];
+
+ if (node == NULL)
+ return NULL;
+
+ if (node->ndoc != 0)
+ {
+ /* return entry itself: we already was at left sublink */
+ return node;
+ }
+ else if (node->right && node->right != stat->stack[stat->stackpos + 1])
+ {
+ /* go on right sublink */
+ stat->stackpos++;
+ node = node->right;
+
+ /* find most-left value */
+ for (;;)
+ {
+ stat->stack[stat->stackpos] = node;
+ if (node->left)
+ {
+ stat->stackpos++;
+ node = node->left;
+ }
+ else
+ break;
+ }
+ Assert(stat->stackpos <= stat->maxdepth);
+ }
+ else
+ {
+ /* we already return all left subtree, itself and right subtree */
+ if (stat->stackpos == 0)
+ return NULL;
+
+ stat->stackpos--;
+ return walkStatEntryTree(stat);
+ }
+
+ return node;
+}
+
+static Datum
+ts_process_call(FuncCallContext *funcctx)
+{
+ TSVectorStat *st;
+ StatEntry *entry;
+
+ st = (TSVectorStat *) funcctx->user_fctx;
+
+ entry = walkStatEntryTree(st);
+
+ if (entry != NULL)
+ {
+ Datum result;
+ char *values[3];
+ char ndoc[16];
+ char nentry[16];
+ HeapTuple tuple;
+
+ values[0] = palloc(entry->lenlexeme + 1);
+ memcpy(values[0], entry->lexeme, entry->lenlexeme);
+ (values[0])[entry->lenlexeme] = '\0';
+ sprintf(ndoc, "%d", entry->ndoc);
+ values[1] = ndoc;
+ sprintf(nentry, "%d", entry->nentry);
+ values[2] = nentry;
+
+ tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
+ result = HeapTupleGetDatum(tuple);
+
+ pfree(values[0]);
+
+ /* mark entry as already visited */
+ entry->ndoc = 0;
+
+ return result;
+ }
+
+ return (Datum) 0;
+}
+
+static TSVectorStat *
+ts_stat_sql(MemoryContext persistentContext, text *txt, text *ws)
+{
+ char *query = text_to_cstring(txt);
+ TSVectorStat *stat;
+ bool isnull;
+ Portal portal;
+ SPIPlanPtr plan;
+
+ if ((plan = SPI_prepare(query, 0, NULL)) == NULL)
+ /* internal error */
+ elog(ERROR, "SPI_prepare(\"%s\") failed", query);
+
+ if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
+ /* internal error */
+ elog(ERROR, "SPI_cursor_open(\"%s\") failed", query);
+
+ SPI_cursor_fetch(portal, true, 100);
+
+ if (SPI_tuptable == NULL ||
+ SPI_tuptable->tupdesc->natts != 1 ||
+ !IsBinaryCoercible(SPI_gettypeid(SPI_tuptable->tupdesc, 1),
+ TSVECTOROID))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("ts_stat query must return one tsvector column")));
+
+ stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+ stat->maxdepth = 1;
+
+ if (ws)
+ {
+ char *buf;
+
+ buf = VARDATA_ANY(ws);
+ while (buf - VARDATA_ANY(ws) < VARSIZE_ANY_EXHDR(ws))
+ {
+ if (pg_mblen(buf) == 1)
+ {
+ switch (*buf)
+ {
+ case 'A':
+ case 'a':
+ stat->weight |= 1 << 3;
+ break;
+ case 'B':
+ case 'b':
+ stat->weight |= 1 << 2;
+ break;
+ case 'C':
+ case 'c':
+ stat->weight |= 1 << 1;
+ break;
+ case 'D':
+ case 'd':
+ stat->weight |= 1;
+ break;
+ default:
+ stat->weight |= 0;
+ }
+ }
+ buf += pg_mblen(buf);
+ }
+ }
+
+ while (SPI_processed > 0)
+ {
+ uint64 i;
+
+ for (i = 0; i < SPI_processed; i++)
+ {
+ Datum data = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &isnull);
+
+ if (!isnull)
+ stat = ts_accum(persistentContext, stat, data);
+ }
+
+ SPI_freetuptable(SPI_tuptable);
+ SPI_cursor_fetch(portal, true, 100);
+ }
+
+ SPI_freetuptable(SPI_tuptable);
+ SPI_cursor_close(portal);
+ SPI_freeplan(plan);
+ pfree(query);
+
+ return stat;
+}
+
+Datum
+ts_stat1(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ Datum result;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ TSVectorStat *stat;
+ text *txt = PG_GETARG_TEXT_PP(0);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ SPI_connect();
+ stat = ts_stat_sql(funcctx->multi_call_memory_ctx, txt, NULL);
+ PG_FREE_IF_COPY(txt, 0);
+ ts_setup_firstcall(fcinfo, funcctx, stat);
+ SPI_finish();
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ if ((result = ts_process_call(funcctx)) != (Datum) 0)
+ SRF_RETURN_NEXT(funcctx, result);
+ SRF_RETURN_DONE(funcctx);
+}
+
+Datum
+ts_stat2(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ Datum result;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ TSVectorStat *stat;
+ text *txt = PG_GETARG_TEXT_PP(0);
+ text *ws = PG_GETARG_TEXT_PP(1);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ SPI_connect();
+ stat = ts_stat_sql(funcctx->multi_call_memory_ctx, txt, ws);
+ PG_FREE_IF_COPY(txt, 0);
+ PG_FREE_IF_COPY(ws, 1);
+ ts_setup_firstcall(fcinfo, funcctx, stat);
+ SPI_finish();
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ if ((result = ts_process_call(funcctx)) != (Datum) 0)
+ SRF_RETURN_NEXT(funcctx, result);
+ SRF_RETURN_DONE(funcctx);
+}
+
+
+/*
+ * Triggers for automatic update of a tsvector column from text column(s)
+ *
+ * Trigger arguments are either
+ * name of tsvector col, name of tsconfig to use, name(s) of text col(s)
+ * name of tsvector col, name of regconfig col, name(s) of text col(s)
+ * ie, tsconfig can either be specified by name, or indirectly as the
+ * contents of a regconfig field in the row. If the name is used, it must
+ * be explicitly schema-qualified.
+ */
+Datum
+tsvector_update_trigger_byid(PG_FUNCTION_ARGS)
+{
+ return tsvector_update_trigger(fcinfo, false);
+}
+
+Datum
+tsvector_update_trigger_bycolumn(PG_FUNCTION_ARGS)
+{
+ return tsvector_update_trigger(fcinfo, true);
+}
+
+static Datum
+tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column)
+{
+ TriggerData *trigdata;
+ Trigger *trigger;
+ Relation rel;
+ HeapTuple rettuple = NULL;
+ int tsvector_attr_num,
+ i;
+ ParsedText prs;
+ Datum datum;
+ bool isnull;
+ text *txt;
+ Oid cfgId;
+ bool update_needed;
+
+ /* Check call context */
+ if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */
+ elog(ERROR, "tsvector_update_trigger: not fired by trigger manager");
+
+ trigdata = (TriggerData *) fcinfo->context;
+ if (!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
+ elog(ERROR, "tsvector_update_trigger: must be fired for row");
+ if (!TRIGGER_FIRED_BEFORE(trigdata->tg_event))
+ elog(ERROR, "tsvector_update_trigger: must be fired BEFORE event");
+
+ if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
+ {
+ rettuple = trigdata->tg_trigtuple;
+ update_needed = true;
+ }
+ else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
+ {
+ rettuple = trigdata->tg_newtuple;
+ update_needed = false; /* computed below */
+ }
+ else
+ elog(ERROR, "tsvector_update_trigger: must be fired for INSERT or UPDATE");
+
+ trigger = trigdata->tg_trigger;
+ rel = trigdata->tg_relation;
+
+ if (trigger->tgnargs < 3)
+ elog(ERROR, "tsvector_update_trigger: arguments must be tsvector_field, ts_config, text_field1, ...)");
+
+ /* Find the target tsvector column */
+ tsvector_attr_num = SPI_fnumber(rel->rd_att, trigger->tgargs[0]);
+ if (tsvector_attr_num == SPI_ERROR_NOATTRIBUTE)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_COLUMN),
+ errmsg("tsvector column \"%s\" does not exist",
+ trigger->tgargs[0])));
+ /* This will effectively reject system columns, so no separate test: */
+ if (!IsBinaryCoercible(SPI_gettypeid(rel->rd_att, tsvector_attr_num),
+ TSVECTOROID))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("column \"%s\" is not of tsvector type",
+ trigger->tgargs[0])));
+
+ /* Find the configuration to use */
+ if (config_column)
+ {
+ int config_attr_num;
+
+ config_attr_num = SPI_fnumber(rel->rd_att, trigger->tgargs[1]);
+ if (config_attr_num == SPI_ERROR_NOATTRIBUTE)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_COLUMN),
+ errmsg("configuration column \"%s\" does not exist",
+ trigger->tgargs[1])));
+ if (!IsBinaryCoercible(SPI_gettypeid(rel->rd_att, config_attr_num),
+ REGCONFIGOID))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("column \"%s\" is not of regconfig type",
+ trigger->tgargs[1])));
+
+ datum = SPI_getbinval(rettuple, rel->rd_att, config_attr_num, &isnull);
+ if (isnull)
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("configuration column \"%s\" must not be null",
+ trigger->tgargs[1])));
+ cfgId = DatumGetObjectId(datum);
+ }
+ else
+ {
+ List *names;
+
+ names = stringToQualifiedNameList(trigger->tgargs[1]);
+ /* require a schema so that results are not search path dependent */
+ if (list_length(names) < 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("text search configuration name \"%s\" must be schema-qualified",
+ trigger->tgargs[1])));
+ cfgId = get_ts_config_oid(names, false);
+ }
+
+ /* initialize parse state */
+ prs.lenwords = 32;
+ prs.curwords = 0;
+ prs.pos = 0;
+ prs.words = (ParsedWord *) palloc(sizeof(ParsedWord) * prs.lenwords);
+
+ /* find all words in indexable column(s) */
+ for (i = 2; i < trigger->tgnargs; i++)
+ {
+ int numattr;
+
+ numattr = SPI_fnumber(rel->rd_att, trigger->tgargs[i]);
+ if (numattr == SPI_ERROR_NOATTRIBUTE)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_COLUMN),
+ errmsg("column \"%s\" does not exist",
+ trigger->tgargs[i])));
+ if (!IsBinaryCoercible(SPI_gettypeid(rel->rd_att, numattr), TEXTOID))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("column \"%s\" is not of a character type",
+ trigger->tgargs[i])));
+
+ if (bms_is_member(numattr - FirstLowInvalidHeapAttributeNumber, trigdata->tg_updatedcols))
+ update_needed = true;
+
+ datum = SPI_getbinval(rettuple, rel->rd_att, numattr, &isnull);
+ if (isnull)
+ continue;
+
+ txt = DatumGetTextPP(datum);
+
+ parsetext(cfgId, &prs, VARDATA_ANY(txt), VARSIZE_ANY_EXHDR(txt));
+
+ if (txt != (text *) DatumGetPointer(datum))
+ pfree(txt);
+ }
+
+ if (update_needed)
+ {
+ /* make tsvector value */
+ datum = TSVectorGetDatum(make_tsvector(&prs));
+ isnull = false;
+
+ /* and insert it into tuple */
+ rettuple = heap_modify_tuple_by_cols(rettuple, rel->rd_att,
+ 1, &tsvector_attr_num,
+ &datum, &isnull);
+
+ pfree(DatumGetPointer(datum));
+ }
+
+ return PointerGetDatum(rettuple);
+}
diff --git a/src/backend/utils/adt/tsvector_parser.c b/src/backend/utils/adt/tsvector_parser.c
new file mode 100644
index 0000000..e2460d3
--- /dev/null
+++ b/src/backend/utils/adt/tsvector_parser.c
@@ -0,0 +1,367 @@
+/*-------------------------------------------------------------------------
+ *
+ * tsvector_parser.c
+ * Parser for tsvector
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/tsvector_parser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "tsearch/ts_locale.h"
+#include "tsearch/ts_utils.h"
+
+
+/*
+ * Private state of tsvector parser. Note that tsquery also uses this code to
+ * parse its input, hence the boolean flags. The two flags are both true or
+ * both false in current usage, but we keep them separate for clarity.
+ * is_tsquery affects *only* the content of error messages.
+ */
+struct TSVectorParseStateData
+{
+ char *prsbuf; /* next input character */
+ char *bufstart; /* whole string (used only for errors) */
+ char *word; /* buffer to hold the current word */
+ int len; /* size in bytes allocated for 'word' */
+ int eml; /* max bytes per character */
+ bool oprisdelim; /* treat ! | * ( ) as delimiters? */
+ bool is_tsquery; /* say "tsquery" not "tsvector" in errors? */
+ bool is_web; /* we're in websearch_to_tsquery() */
+};
+
+
+/*
+ * Initializes parser for the input string. If oprisdelim is set, the
+ * following characters are treated as delimiters in addition to whitespace:
+ * ! | & ( )
+ */
+TSVectorParseState
+init_tsvector_parser(char *input, int flags)
+{
+ TSVectorParseState state;
+
+ state = (TSVectorParseState) palloc(sizeof(struct TSVectorParseStateData));
+ state->prsbuf = input;
+ state->bufstart = input;
+ state->len = 32;
+ state->word = (char *) palloc(state->len);
+ state->eml = pg_database_encoding_max_length();
+ state->oprisdelim = (flags & P_TSV_OPR_IS_DELIM) != 0;
+ state->is_tsquery = (flags & P_TSV_IS_TSQUERY) != 0;
+ state->is_web = (flags & P_TSV_IS_WEB) != 0;
+
+ return state;
+}
+
+/*
+ * Reinitializes parser to parse 'input', instead of previous input.
+ */
+void
+reset_tsvector_parser(TSVectorParseState state, char *input)
+{
+ state->prsbuf = input;
+}
+
+/*
+ * Shuts down a tsvector parser.
+ */
+void
+close_tsvector_parser(TSVectorParseState state)
+{
+ pfree(state->word);
+ pfree(state);
+}
+
+/* increase the size of 'word' if needed to hold one more character */
+#define RESIZEPRSBUF \
+do { \
+ int clen = curpos - state->word; \
+ if ( clen + state->eml >= state->len ) \
+ { \
+ state->len *= 2; \
+ state->word = (char *) repalloc(state->word, state->len); \
+ curpos = state->word + clen; \
+ } \
+} while (0)
+
+/* Fills gettoken_tsvector's output parameters, and returns true */
+#define RETURN_TOKEN \
+do { \
+ if (pos_ptr != NULL) \
+ { \
+ *pos_ptr = pos; \
+ *poslen = npos; \
+ } \
+ else if (pos != NULL) \
+ pfree(pos); \
+ \
+ if (strval != NULL) \
+ *strval = state->word; \
+ if (lenval != NULL) \
+ *lenval = curpos - state->word; \
+ if (endptr != NULL) \
+ *endptr = state->prsbuf; \
+ return true; \
+} while(0)
+
+
+/* State codes used in gettoken_tsvector */
+#define WAITWORD 1
+#define WAITENDWORD 2
+#define WAITNEXTCHAR 3
+#define WAITENDCMPLX 4
+#define WAITPOSINFO 5
+#define INPOSINFO 6
+#define WAITPOSDELIM 7
+#define WAITCHARCMPLX 8
+
+#define PRSSYNTAXERROR prssyntaxerror(state)
+
+static void
+prssyntaxerror(TSVectorParseState state)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ state->is_tsquery ?
+ errmsg("syntax error in tsquery: \"%s\"", state->bufstart) :
+ errmsg("syntax error in tsvector: \"%s\"", state->bufstart)));
+}
+
+
+/*
+ * Get next token from string being parsed. Returns true if successful,
+ * false if end of input string is reached. On success, these output
+ * parameters are filled in:
+ *
+ * *strval pointer to token
+ * *lenval length of *strval
+ * *pos_ptr pointer to a palloc'd array of positions and weights
+ * associated with the token. If the caller is not interested
+ * in the information, NULL can be supplied. Otherwise
+ * the caller is responsible for pfreeing the array.
+ * *poslen number of elements in *pos_ptr
+ * *endptr scan resumption point
+ *
+ * Pass NULL for unwanted output parameters.
+ */
+bool
+gettoken_tsvector(TSVectorParseState state,
+ char **strval, int *lenval,
+ WordEntryPos **pos_ptr, int *poslen,
+ char **endptr)
+{
+ int oldstate = 0;
+ char *curpos = state->word;
+ int statecode = WAITWORD;
+
+ /*
+ * pos is for collecting the comma delimited list of positions followed by
+ * the actual token.
+ */
+ WordEntryPos *pos = NULL;
+ int npos = 0; /* elements of pos used */
+ int posalen = 0; /* allocated size of pos */
+
+ while (1)
+ {
+ if (statecode == WAITWORD)
+ {
+ if (*(state->prsbuf) == '\0')
+ return false;
+ else if (!state->is_web && t_iseq(state->prsbuf, '\''))
+ statecode = WAITENDCMPLX;
+ else if (!state->is_web && t_iseq(state->prsbuf, '\\'))
+ {
+ statecode = WAITNEXTCHAR;
+ oldstate = WAITENDWORD;
+ }
+ else if ((state->oprisdelim && ISOPERATOR(state->prsbuf)) ||
+ (state->is_web && t_iseq(state->prsbuf, '"')))
+ PRSSYNTAXERROR;
+ else if (!t_isspace(state->prsbuf))
+ {
+ COPYCHAR(curpos, state->prsbuf);
+ curpos += pg_mblen(state->prsbuf);
+ statecode = WAITENDWORD;
+ }
+ }
+ else if (statecode == WAITNEXTCHAR)
+ {
+ if (*(state->prsbuf) == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("there is no escaped character: \"%s\"",
+ state->bufstart)));
+ else
+ {
+ RESIZEPRSBUF;
+ COPYCHAR(curpos, state->prsbuf);
+ curpos += pg_mblen(state->prsbuf);
+ Assert(oldstate != 0);
+ statecode = oldstate;
+ }
+ }
+ else if (statecode == WAITENDWORD)
+ {
+ if (!state->is_web && t_iseq(state->prsbuf, '\\'))
+ {
+ statecode = WAITNEXTCHAR;
+ oldstate = WAITENDWORD;
+ }
+ else if (t_isspace(state->prsbuf) || *(state->prsbuf) == '\0' ||
+ (state->oprisdelim && ISOPERATOR(state->prsbuf)) ||
+ (state->is_web && t_iseq(state->prsbuf, '"')))
+ {
+ RESIZEPRSBUF;
+ if (curpos == state->word)
+ PRSSYNTAXERROR;
+ *(curpos) = '\0';
+ RETURN_TOKEN;
+ }
+ else if (t_iseq(state->prsbuf, ':'))
+ {
+ if (curpos == state->word)
+ PRSSYNTAXERROR;
+ *(curpos) = '\0';
+ if (state->oprisdelim)
+ RETURN_TOKEN;
+ else
+ statecode = INPOSINFO;
+ }
+ else
+ {
+ RESIZEPRSBUF;
+ COPYCHAR(curpos, state->prsbuf);
+ curpos += pg_mblen(state->prsbuf);
+ }
+ }
+ else if (statecode == WAITENDCMPLX)
+ {
+ if (!state->is_web && t_iseq(state->prsbuf, '\''))
+ {
+ statecode = WAITCHARCMPLX;
+ }
+ else if (!state->is_web && t_iseq(state->prsbuf, '\\'))
+ {
+ statecode = WAITNEXTCHAR;
+ oldstate = WAITENDCMPLX;
+ }
+ else if (*(state->prsbuf) == '\0')
+ PRSSYNTAXERROR;
+ else
+ {
+ RESIZEPRSBUF;
+ COPYCHAR(curpos, state->prsbuf);
+ curpos += pg_mblen(state->prsbuf);
+ }
+ }
+ else if (statecode == WAITCHARCMPLX)
+ {
+ if (!state->is_web && t_iseq(state->prsbuf, '\''))
+ {
+ RESIZEPRSBUF;
+ COPYCHAR(curpos, state->prsbuf);
+ curpos += pg_mblen(state->prsbuf);
+ statecode = WAITENDCMPLX;
+ }
+ else
+ {
+ RESIZEPRSBUF;
+ *(curpos) = '\0';
+ if (curpos == state->word)
+ PRSSYNTAXERROR;
+ if (state->oprisdelim)
+ {
+ /* state->prsbuf+=pg_mblen(state->prsbuf); */
+ RETURN_TOKEN;
+ }
+ else
+ statecode = WAITPOSINFO;
+ continue; /* recheck current character */
+ }
+ }
+ else if (statecode == WAITPOSINFO)
+ {
+ if (t_iseq(state->prsbuf, ':'))
+ statecode = INPOSINFO;
+ else
+ RETURN_TOKEN;
+ }
+ else if (statecode == INPOSINFO)
+ {
+ if (t_isdigit(state->prsbuf))
+ {
+ if (posalen == 0)
+ {
+ posalen = 4;
+ pos = (WordEntryPos *) palloc(sizeof(WordEntryPos) * posalen);
+ npos = 0;
+ }
+ else if (npos + 1 >= posalen)
+ {
+ posalen *= 2;
+ pos = (WordEntryPos *) repalloc(pos, sizeof(WordEntryPos) * posalen);
+ }
+ npos++;
+ WEP_SETPOS(pos[npos - 1], LIMITPOS(atoi(state->prsbuf)));
+ /* we cannot get here in tsquery, so no need for 2 errmsgs */
+ if (WEP_GETPOS(pos[npos - 1]) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("wrong position info in tsvector: \"%s\"",
+ state->bufstart)));
+ WEP_SETWEIGHT(pos[npos - 1], 0);
+ statecode = WAITPOSDELIM;
+ }
+ else
+ PRSSYNTAXERROR;
+ }
+ else if (statecode == WAITPOSDELIM)
+ {
+ if (t_iseq(state->prsbuf, ','))
+ statecode = INPOSINFO;
+ else if (t_iseq(state->prsbuf, 'a') || t_iseq(state->prsbuf, 'A') || t_iseq(state->prsbuf, '*'))
+ {
+ if (WEP_GETWEIGHT(pos[npos - 1]))
+ PRSSYNTAXERROR;
+ WEP_SETWEIGHT(pos[npos - 1], 3);
+ }
+ else if (t_iseq(state->prsbuf, 'b') || t_iseq(state->prsbuf, 'B'))
+ {
+ if (WEP_GETWEIGHT(pos[npos - 1]))
+ PRSSYNTAXERROR;
+ WEP_SETWEIGHT(pos[npos - 1], 2);
+ }
+ else if (t_iseq(state->prsbuf, 'c') || t_iseq(state->prsbuf, 'C'))
+ {
+ if (WEP_GETWEIGHT(pos[npos - 1]))
+ PRSSYNTAXERROR;
+ WEP_SETWEIGHT(pos[npos - 1], 1);
+ }
+ else if (t_iseq(state->prsbuf, 'd') || t_iseq(state->prsbuf, 'D'))
+ {
+ if (WEP_GETWEIGHT(pos[npos - 1]))
+ PRSSYNTAXERROR;
+ WEP_SETWEIGHT(pos[npos - 1], 0);
+ }
+ else if (t_isspace(state->prsbuf) ||
+ *(state->prsbuf) == '\0')
+ RETURN_TOKEN;
+ else if (!t_isdigit(state->prsbuf))
+ PRSSYNTAXERROR;
+ }
+ else /* internal error */
+ elog(ERROR, "unrecognized state in gettoken_tsvector: %d",
+ statecode);
+
+ /* get next char */
+ state->prsbuf += pg_mblen(state->prsbuf);
+ }
+}
diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c
new file mode 100644
index 0000000..7cec937
--- /dev/null
+++ b/src/backend/utils/adt/uuid.c
@@ -0,0 +1,423 @@
+/*-------------------------------------------------------------------------
+ *
+ * uuid.c
+ * Functions for the built-in type "uuid".
+ *
+ * Copyright (c) 2007-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/uuid.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "common/hashfn.h"
+#include "lib/hyperloglog.h"
+#include "libpq/pqformat.h"
+#include "port/pg_bswap.h"
+#include "utils/builtins.h"
+#include "utils/guc.h"
+#include "utils/sortsupport.h"
+#include "utils/uuid.h"
+
+/* sortsupport for uuid */
+typedef struct
+{
+ int64 input_count; /* number of non-null values seen */
+ bool estimating; /* true if estimating cardinality */
+
+ hyperLogLogState abbr_card; /* cardinality estimator */
+} uuid_sortsupport_state;
+
+static void string_to_uuid(const char *source, pg_uuid_t *uuid);
+static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2);
+static int uuid_fast_cmp(Datum x, Datum y, SortSupport ssup);
+static bool uuid_abbrev_abort(int memtupcount, SortSupport ssup);
+static Datum uuid_abbrev_convert(Datum original, SortSupport ssup);
+
+Datum
+uuid_in(PG_FUNCTION_ARGS)
+{
+ char *uuid_str = PG_GETARG_CSTRING(0);
+ pg_uuid_t *uuid;
+
+ uuid = (pg_uuid_t *) palloc(sizeof(*uuid));
+ string_to_uuid(uuid_str, uuid);
+ PG_RETURN_UUID_P(uuid);
+}
+
+Datum
+uuid_out(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
+ static const char hex_chars[] = "0123456789abcdef";
+ StringInfoData buf;
+ int i;
+
+ initStringInfo(&buf);
+ for (i = 0; i < UUID_LEN; i++)
+ {
+ int hi;
+ int lo;
+
+ /*
+ * We print uuid values as a string of 8, 4, 4, 4, and then 12
+ * hexadecimal characters, with each group is separated by a hyphen
+ * ("-"). Therefore, add the hyphens at the appropriate places here.
+ */
+ if (i == 4 || i == 6 || i == 8 || i == 10)
+ appendStringInfoChar(&buf, '-');
+
+ hi = uuid->data[i] >> 4;
+ lo = uuid->data[i] & 0x0F;
+
+ appendStringInfoChar(&buf, hex_chars[hi]);
+ appendStringInfoChar(&buf, hex_chars[lo]);
+ }
+
+ PG_RETURN_CSTRING(buf.data);
+}
+
+/*
+ * We allow UUIDs as a series of 32 hexadecimal digits with an optional dash
+ * after each group of 4 hexadecimal digits, and optionally surrounded by {}.
+ * (The canonical format 8x-4x-4x-4x-12x, where "nx" means n hexadecimal
+ * digits, is the only one used for output.)
+ */
+static void
+string_to_uuid(const char *source, pg_uuid_t *uuid)
+{
+ const char *src = source;
+ bool braces = false;
+ int i;
+
+ if (src[0] == '{')
+ {
+ src++;
+ braces = true;
+ }
+
+ for (i = 0; i < UUID_LEN; i++)
+ {
+ char str_buf[3];
+
+ if (src[0] == '\0' || src[1] == '\0')
+ goto syntax_error;
+ memcpy(str_buf, src, 2);
+ if (!isxdigit((unsigned char) str_buf[0]) ||
+ !isxdigit((unsigned char) str_buf[1]))
+ goto syntax_error;
+
+ str_buf[2] = '\0';
+ uuid->data[i] = (unsigned char) strtoul(str_buf, NULL, 16);
+ src += 2;
+ if (src[0] == '-' && (i % 2) == 1 && i < UUID_LEN - 1)
+ src++;
+ }
+
+ if (braces)
+ {
+ if (*src != '}')
+ goto syntax_error;
+ src++;
+ }
+
+ if (*src != '\0')
+ goto syntax_error;
+
+ return;
+
+syntax_error:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "uuid", source)));
+}
+
+Datum
+uuid_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buffer = (StringInfo) PG_GETARG_POINTER(0);
+ pg_uuid_t *uuid;
+
+ uuid = (pg_uuid_t *) palloc(UUID_LEN);
+ memcpy(uuid->data, pq_getmsgbytes(buffer, UUID_LEN), UUID_LEN);
+ PG_RETURN_POINTER(uuid);
+}
+
+Datum
+uuid_send(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
+ StringInfoData buffer;
+
+ pq_begintypsend(&buffer);
+ pq_sendbytes(&buffer, (char *) uuid->data, UUID_LEN);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buffer));
+}
+
+/* internal uuid compare function */
+static int
+uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
+{
+ return memcmp(arg1->data, arg2->data, UUID_LEN);
+}
+
+Datum
+uuid_lt(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) < 0);
+}
+
+Datum
+uuid_le(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) <= 0);
+}
+
+Datum
+uuid_eq(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) == 0);
+}
+
+Datum
+uuid_ge(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) >= 0);
+}
+
+Datum
+uuid_gt(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) > 0);
+}
+
+Datum
+uuid_ne(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) != 0);
+}
+
+/* handler for btree index operator */
+Datum
+uuid_cmp(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
+ pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
+
+ PG_RETURN_INT32(uuid_internal_cmp(arg1, arg2));
+}
+
+/*
+ * Sort support strategy routine
+ */
+Datum
+uuid_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+
+ ssup->comparator = uuid_fast_cmp;
+ ssup->ssup_extra = NULL;
+
+ if (ssup->abbreviate)
+ {
+ uuid_sortsupport_state *uss;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ uss = palloc(sizeof(uuid_sortsupport_state));
+ uss->input_count = 0;
+ uss->estimating = true;
+ initHyperLogLog(&uss->abbr_card, 10);
+
+ ssup->ssup_extra = uss;
+
+ ssup->comparator = ssup_datum_unsigned_cmp;
+ ssup->abbrev_converter = uuid_abbrev_convert;
+ ssup->abbrev_abort = uuid_abbrev_abort;
+ ssup->abbrev_full_comparator = uuid_fast_cmp;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * SortSupport comparison func
+ */
+static int
+uuid_fast_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ pg_uuid_t *arg1 = DatumGetUUIDP(x);
+ pg_uuid_t *arg2 = DatumGetUUIDP(y);
+
+ return uuid_internal_cmp(arg1, arg2);
+}
+
+/*
+ * Callback for estimating effectiveness of abbreviated key optimization.
+ *
+ * We pay no attention to the cardinality of the non-abbreviated data, because
+ * there is no equality fast-path within authoritative uuid comparator.
+ */
+static bool
+uuid_abbrev_abort(int memtupcount, SortSupport ssup)
+{
+ uuid_sortsupport_state *uss = ssup->ssup_extra;
+ double abbr_card;
+
+ if (memtupcount < 10000 || uss->input_count < 10000 || !uss->estimating)
+ return false;
+
+ abbr_card = estimateHyperLogLog(&uss->abbr_card);
+
+ /*
+ * If we have >100k distinct values, then even if we were sorting many
+ * billion rows we'd likely still break even, and the penalty of undoing
+ * that many rows of abbrevs would probably not be worth it. Stop even
+ * counting at that point.
+ */
+ if (abbr_card > 100000.0)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "uuid_abbrev: estimation ends at cardinality %f"
+ " after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count, memtupcount);
+#endif
+ uss->estimating = false;
+ return false;
+ }
+
+ /*
+ * Target minimum cardinality is 1 per ~2k of non-null inputs. 0.5 row
+ * fudge factor allows us to abort earlier on genuinely pathological data
+ * where we've had exactly one abbreviated value in the first 2k
+ * (non-null) rows.
+ */
+ if (abbr_card < uss->input_count / 2000.0 + 0.5)
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "uuid_abbrev: aborting abbreviation at cardinality %f"
+ " below threshold %f after " INT64_FORMAT " values (%d rows)",
+ abbr_card, uss->input_count / 2000.0 + 0.5, uss->input_count,
+ memtupcount);
+#endif
+ return true;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "uuid_abbrev: cardinality %f after " INT64_FORMAT
+ " values (%d rows)", abbr_card, uss->input_count, memtupcount);
+#endif
+
+ return false;
+}
+
+/*
+ * Conversion routine for sortsupport. Converts original uuid representation
+ * to abbreviated key representation. Our encoding strategy is simple -- pack
+ * the first `sizeof(Datum)` bytes of uuid data into a Datum (on little-endian
+ * machines, the bytes are stored in reverse order), and treat it as an
+ * unsigned integer.
+ */
+static Datum
+uuid_abbrev_convert(Datum original, SortSupport ssup)
+{
+ uuid_sortsupport_state *uss = ssup->ssup_extra;
+ pg_uuid_t *authoritative = DatumGetUUIDP(original);
+ Datum res;
+
+ memcpy(&res, authoritative->data, sizeof(Datum));
+ uss->input_count += 1;
+
+ if (uss->estimating)
+ {
+ uint32 tmp;
+
+#if SIZEOF_DATUM == 8
+ tmp = (uint32) res ^ (uint32) ((uint64) res >> 32);
+#else /* SIZEOF_DATUM != 8 */
+ tmp = (uint32) res;
+#endif
+
+ addHyperLogLog(&uss->abbr_card, DatumGetUInt32(hash_uint32(tmp)));
+ }
+
+ /*
+ * Byteswap on little-endian machines.
+ *
+ * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer
+ * 3-way comparator) works correctly on all platforms. If we didn't do
+ * this, the comparator would have to call memcmp() with a pair of
+ * pointers to the first byte of each abbreviated key, which is slower.
+ */
+ res = DatumBigEndianToNative(res);
+
+ return res;
+}
+
+/* hash index support */
+Datum
+uuid_hash(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *key = PG_GETARG_UUID_P(0);
+
+ return hash_any(key->data, UUID_LEN);
+}
+
+Datum
+uuid_hash_extended(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *key = PG_GETARG_UUID_P(0);
+
+ return hash_any_extended(key->data, UUID_LEN, PG_GETARG_INT64(1));
+}
+
+Datum
+gen_random_uuid(PG_FUNCTION_ARGS)
+{
+ pg_uuid_t *uuid = palloc(UUID_LEN);
+
+ if (!pg_strong_random(uuid, UUID_LEN))
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("could not generate random values")));
+
+ /*
+ * Set magic numbers for a "version 4" (pseudorandom) UUID, see
+ * http://tools.ietf.org/html/rfc4122#section-4.4
+ */
+ uuid->data[6] = (uuid->data[6] & 0x0f) | 0x40; /* time_hi_and_version */
+ uuid->data[8] = (uuid->data[8] & 0x3f) | 0x80; /* clock_seq_hi_and_reserved */
+
+ PG_RETURN_UUID_P(uuid);
+}
diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c
new file mode 100644
index 0000000..73e41e0
--- /dev/null
+++ b/src/backend/utils/adt/varbit.c
@@ -0,0 +1,1894 @@
+/*-------------------------------------------------------------------------
+ *
+ * varbit.c
+ * Functions for the SQL datatypes BIT() and BIT VARYING().
+ *
+ * The data structure contains the following elements:
+ * header -- length of the whole data structure (incl header)
+ * in bytes (as with all varying length datatypes)
+ * data section -- private data section for the bits data structures
+ * bitlength -- length of the bit string in bits
+ * bitdata -- bit string, most significant byte first
+ *
+ * The length of the bitdata vector should always be exactly as many
+ * bytes as are needed for the given bitlength. If the bitlength is
+ * not a multiple of 8, the extra low-order padding bits of the last
+ * byte must be zeroes.
+ *
+ * attypmod is defined as the length of the bit string in bits, or for
+ * varying bits the maximum length.
+ *
+ * Code originally contributed by Adriaan Joubert.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/varbit.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "common/int.h"
+#include "libpq/pqformat.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "port/pg_bitutils.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/varbit.h"
+
+#define HEXDIG(z) ((z)<10 ? ((z)+'0') : ((z)-10+'A'))
+
+/* Mask off any bits that should be zero in the last byte of a bitstring */
+#define VARBIT_PAD(vb) \
+ do { \
+ int32 pad_ = VARBITPAD(vb); \
+ Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
+ if (pad_ > 0) \
+ *(VARBITS(vb) + VARBITBYTES(vb) - 1) &= BITMASK << pad_; \
+ } while (0)
+
+/*
+ * Many functions work byte-by-byte, so they have a pointer handy to the
+ * last-plus-one byte, which saves a cycle or two.
+ */
+#define VARBIT_PAD_LAST(vb, ptr) \
+ do { \
+ int32 pad_ = VARBITPAD(vb); \
+ Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
+ if (pad_ > 0) \
+ *((ptr) - 1) &= BITMASK << pad_; \
+ } while (0)
+
+/* Assert proper padding of a bitstring */
+#ifdef USE_ASSERT_CHECKING
+#define VARBIT_CORRECTLY_PADDED(vb) \
+ do { \
+ int32 pad_ = VARBITPAD(vb); \
+ Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
+ Assert(pad_ == 0 || \
+ (*(VARBITS(vb) + VARBITBYTES(vb) - 1) & ~(BITMASK << pad_)) == 0); \
+ } while (0)
+#else
+#define VARBIT_CORRECTLY_PADDED(vb) ((void) 0)
+#endif
+
+static VarBit *bit_catenate(VarBit *arg1, VarBit *arg2);
+static VarBit *bitsubstring(VarBit *arg, int32 s, int32 l,
+ bool length_not_specified);
+static VarBit *bit_overlay(VarBit *t1, VarBit *t2, int sp, int sl);
+
+
+/*
+ * common code for bittypmodin and varbittypmodin
+ */
+static int32
+anybit_typmodin(ArrayType *ta, const char *typename)
+{
+ int32 typmod;
+ int32 *tl;
+ int n;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ /*
+ * we're not too tense about good error message here because grammar
+ * shouldn't allow wrong number of modifiers for BIT
+ */
+ if (n != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid type modifier")));
+
+ if (*tl < 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("length for type %s must be at least 1",
+ typename)));
+ if (*tl > (MaxAttrSize * BITS_PER_BYTE))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("length for type %s cannot exceed %d",
+ typename, MaxAttrSize * BITS_PER_BYTE)));
+
+ typmod = *tl;
+
+ return typmod;
+}
+
+/*
+ * common code for bittypmodout and varbittypmodout
+ */
+static char *
+anybit_typmodout(int32 typmod)
+{
+ char *res = (char *) palloc(64);
+
+ if (typmod >= 0)
+ snprintf(res, 64, "(%d)", typmod);
+ else
+ *res = '\0';
+
+ return res;
+}
+
+
+/*
+ * bit_in -
+ * converts a char string to the internal representation of a bitstring.
+ * The length is determined by the number of bits required plus
+ * VARHDRSZ bytes or from atttypmod.
+ */
+Datum
+bit_in(PG_FUNCTION_ARGS)
+{
+ char *input_string = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarBit *result; /* The resulting bit string */
+ char *sp; /* pointer into the character string */
+ bits8 *r; /* pointer into the result */
+ int len, /* Length of the whole data structure */
+ bitlen, /* Number of bits in the bit string */
+ slen; /* Length of the input string */
+ bool bit_not_hex; /* false = hex string true = bit string */
+ int bc;
+ bits8 x = 0;
+
+ /* Check that the first character is a b or an x */
+ if (input_string[0] == 'b' || input_string[0] == 'B')
+ {
+ bit_not_hex = true;
+ sp = input_string + 1;
+ }
+ else if (input_string[0] == 'x' || input_string[0] == 'X')
+ {
+ bit_not_hex = false;
+ sp = input_string + 1;
+ }
+ else
+ {
+ /*
+ * Otherwise it's binary. This allows things like cast('1001' as bit)
+ * to work transparently.
+ */
+ bit_not_hex = true;
+ sp = input_string;
+ }
+
+ /*
+ * Determine bitlength from input string. MaxAllocSize ensures a regular
+ * input is small enough, but we must check hex input.
+ */
+ slen = strlen(sp);
+ if (bit_not_hex)
+ bitlen = slen;
+ else
+ {
+ if (slen > VARBITMAXLEN / 4)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("bit string length exceeds the maximum allowed (%d)",
+ VARBITMAXLEN)));
+ bitlen = slen * 4;
+ }
+
+ /*
+ * Sometimes atttypmod is not supplied. If it is supplied we need to make
+ * sure that the bitstring fits.
+ */
+ if (atttypmod <= 0)
+ atttypmod = bitlen;
+ else if (bitlen != atttypmod)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("bit string length %d does not match type bit(%d)",
+ bitlen, atttypmod)));
+
+ len = VARBITTOTALLEN(atttypmod);
+ /* set to 0 so that *r is always initialised and string is zero-padded */
+ result = (VarBit *) palloc0(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = atttypmod;
+
+ r = VARBITS(result);
+ if (bit_not_hex)
+ {
+ /* Parse the bit representation of the string */
+ /* We know it fits, as bitlen was compared to atttypmod */
+ x = HIGHBIT;
+ for (; *sp; sp++)
+ {
+ if (*sp == '1')
+ *r |= x;
+ else if (*sp != '0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("\"%.*s\" is not a valid binary digit",
+ pg_mblen(sp), sp)));
+
+ x >>= 1;
+ if (x == 0)
+ {
+ x = HIGHBIT;
+ r++;
+ }
+ }
+ }
+ else
+ {
+ /* Parse the hex representation of the string */
+ for (bc = 0; *sp; sp++)
+ {
+ if (*sp >= '0' && *sp <= '9')
+ x = (bits8) (*sp - '0');
+ else if (*sp >= 'A' && *sp <= 'F')
+ x = (bits8) (*sp - 'A') + 10;
+ else if (*sp >= 'a' && *sp <= 'f')
+ x = (bits8) (*sp - 'a') + 10;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("\"%.*s\" is not a valid hexadecimal digit",
+ pg_mblen(sp), sp)));
+
+ if (bc)
+ {
+ *r++ |= x;
+ bc = 0;
+ }
+ else
+ {
+ *r = x << 4;
+ bc = 1;
+ }
+ }
+ }
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+
+Datum
+bit_out(PG_FUNCTION_ARGS)
+{
+#if 1
+ /* same as varbit output */
+ return varbit_out(fcinfo);
+#else
+
+ /*
+ * This is how one would print a hex string, in case someone wants to
+ * write a formatting function.
+ */
+ VarBit *s = PG_GETARG_VARBIT_P(0);
+ char *result,
+ *r;
+ bits8 *sp;
+ int i,
+ len,
+ bitlen;
+
+ /* Assertion to help catch any bit functions that don't pad correctly */
+ VARBIT_CORRECTLY_PADDED(s);
+
+ bitlen = VARBITLEN(s);
+ len = (bitlen + 3) / 4;
+ result = (char *) palloc(len + 2);
+ sp = VARBITS(s);
+ r = result;
+ *r++ = 'X';
+ /* we cheat by knowing that we store full bytes zero padded */
+ for (i = 0; i < len; i += 2, sp++)
+ {
+ *r++ = HEXDIG((*sp) >> 4);
+ *r++ = HEXDIG((*sp) & 0xF);
+ }
+
+ /*
+ * Go back one step if we printed a hex number that was not part of the
+ * bitstring anymore
+ */
+ if (i > len)
+ r--;
+ *r = '\0';
+
+ PG_RETURN_CSTRING(result);
+#endif
+}
+
+/*
+ * bit_recv - converts external binary format to bit
+ */
+Datum
+bit_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarBit *result;
+ int len,
+ bitlen;
+
+ bitlen = pq_getmsgint(buf, sizeof(int32));
+ if (bitlen < 0 || bitlen > VARBITMAXLEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid length in external bit string")));
+
+ /*
+ * Sometimes atttypmod is not supplied. If it is supplied we need to make
+ * sure that the bitstring fits.
+ */
+ if (atttypmod > 0 && bitlen != atttypmod)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("bit string length %d does not match type bit(%d)",
+ bitlen, atttypmod)));
+
+ len = VARBITTOTALLEN(bitlen);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen;
+
+ pq_copymsgbytes(buf, (char *) VARBITS(result), VARBITBYTES(result));
+
+ /* Make sure last byte is correctly zero-padded */
+ VARBIT_PAD(result);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bit_send - converts bit to binary format
+ */
+Datum
+bit_send(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as varbit_send, so share code */
+ return varbit_send(fcinfo);
+}
+
+/*
+ * bit()
+ * Converts a bit() type to a specific internal length.
+ * len is the bitlength specified in the column definition.
+ *
+ * If doing implicit cast, raise error when source data is wrong length.
+ * If doing explicit cast, silently truncate or zero-pad to specified length.
+ */
+Datum
+bit(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ int32 len = PG_GETARG_INT32(1);
+ bool isExplicit = PG_GETARG_BOOL(2);
+ VarBit *result;
+ int rlen;
+
+ /* No work if typmod is invalid or supplied data matches it already */
+ if (len <= 0 || len > VARBITMAXLEN || len == VARBITLEN(arg))
+ PG_RETURN_VARBIT_P(arg);
+
+ if (!isExplicit)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("bit string length %d does not match type bit(%d)",
+ VARBITLEN(arg), len)));
+
+ rlen = VARBITTOTALLEN(len);
+ /* set to 0 so that string is zero-padded */
+ result = (VarBit *) palloc0(rlen);
+ SET_VARSIZE(result, rlen);
+ VARBITLEN(result) = len;
+
+ memcpy(VARBITS(result), VARBITS(arg),
+ Min(VARBITBYTES(result), VARBITBYTES(arg)));
+
+ /*
+ * Make sure last byte is zero-padded if needed. This is useless but safe
+ * if source data was shorter than target length (we assume the last byte
+ * of the source data was itself correctly zero-padded).
+ */
+ VARBIT_PAD(result);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+Datum
+bittypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anybit_typmodin(ta, "bit"));
+}
+
+Datum
+bittypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anybit_typmodout(typmod));
+}
+
+
+/*
+ * varbit_in -
+ * converts a string to the internal representation of a bitstring.
+ * This is the same as bit_in except that atttypmod is taken as
+ * the maximum length, not the exact length to force the bitstring to.
+ */
+Datum
+varbit_in(PG_FUNCTION_ARGS)
+{
+ char *input_string = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarBit *result; /* The resulting bit string */
+ char *sp; /* pointer into the character string */
+ bits8 *r; /* pointer into the result */
+ int len, /* Length of the whole data structure */
+ bitlen, /* Number of bits in the bit string */
+ slen; /* Length of the input string */
+ bool bit_not_hex; /* false = hex string true = bit string */
+ int bc;
+ bits8 x = 0;
+
+ /* Check that the first character is a b or an x */
+ if (input_string[0] == 'b' || input_string[0] == 'B')
+ {
+ bit_not_hex = true;
+ sp = input_string + 1;
+ }
+ else if (input_string[0] == 'x' || input_string[0] == 'X')
+ {
+ bit_not_hex = false;
+ sp = input_string + 1;
+ }
+ else
+ {
+ bit_not_hex = true;
+ sp = input_string;
+ }
+
+ /*
+ * Determine bitlength from input string. MaxAllocSize ensures a regular
+ * input is small enough, but we must check hex input.
+ */
+ slen = strlen(sp);
+ if (bit_not_hex)
+ bitlen = slen;
+ else
+ {
+ if (slen > VARBITMAXLEN / 4)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("bit string length exceeds the maximum allowed (%d)",
+ VARBITMAXLEN)));
+ bitlen = slen * 4;
+ }
+
+ /*
+ * Sometimes atttypmod is not supplied. If it is supplied we need to make
+ * sure that the bitstring fits.
+ */
+ if (atttypmod <= 0)
+ atttypmod = bitlen;
+ else if (bitlen > atttypmod)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("bit string too long for type bit varying(%d)",
+ atttypmod)));
+
+ len = VARBITTOTALLEN(bitlen);
+ /* set to 0 so that *r is always initialised and string is zero-padded */
+ result = (VarBit *) palloc0(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = Min(bitlen, atttypmod);
+
+ r = VARBITS(result);
+ if (bit_not_hex)
+ {
+ /* Parse the bit representation of the string */
+ /* We know it fits, as bitlen was compared to atttypmod */
+ x = HIGHBIT;
+ for (; *sp; sp++)
+ {
+ if (*sp == '1')
+ *r |= x;
+ else if (*sp != '0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("\"%.*s\" is not a valid binary digit",
+ pg_mblen(sp), sp)));
+
+ x >>= 1;
+ if (x == 0)
+ {
+ x = HIGHBIT;
+ r++;
+ }
+ }
+ }
+ else
+ {
+ /* Parse the hex representation of the string */
+ for (bc = 0; *sp; sp++)
+ {
+ if (*sp >= '0' && *sp <= '9')
+ x = (bits8) (*sp - '0');
+ else if (*sp >= 'A' && *sp <= 'F')
+ x = (bits8) (*sp - 'A') + 10;
+ else if (*sp >= 'a' && *sp <= 'f')
+ x = (bits8) (*sp - 'a') + 10;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("\"%.*s\" is not a valid hexadecimal digit",
+ pg_mblen(sp), sp)));
+
+ if (bc)
+ {
+ *r++ |= x;
+ bc = 0;
+ }
+ else
+ {
+ *r = x << 4;
+ bc = 1;
+ }
+ }
+ }
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * varbit_out -
+ * Prints the string as bits to preserve length accurately
+ *
+ * XXX varbit_recv() and hex input to varbit_in() can load a value that this
+ * cannot emit. Consider using hex output for such values.
+ */
+Datum
+varbit_out(PG_FUNCTION_ARGS)
+{
+ VarBit *s = PG_GETARG_VARBIT_P(0);
+ char *result,
+ *r;
+ bits8 *sp;
+ bits8 x;
+ int i,
+ k,
+ len;
+
+ /* Assertion to help catch any bit functions that don't pad correctly */
+ VARBIT_CORRECTLY_PADDED(s);
+
+ len = VARBITLEN(s);
+ result = (char *) palloc(len + 1);
+ sp = VARBITS(s);
+ r = result;
+ for (i = 0; i <= len - BITS_PER_BYTE; i += BITS_PER_BYTE, sp++)
+ {
+ /* print full bytes */
+ x = *sp;
+ for (k = 0; k < BITS_PER_BYTE; k++)
+ {
+ *r++ = IS_HIGHBIT_SET(x) ? '1' : '0';
+ x <<= 1;
+ }
+ }
+ if (i < len)
+ {
+ /* print the last partial byte */
+ x = *sp;
+ for (k = i; k < len; k++)
+ {
+ *r++ = IS_HIGHBIT_SET(x) ? '1' : '0';
+ x <<= 1;
+ }
+ }
+ *r = '\0';
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * varbit_recv - converts external binary format to varbit
+ *
+ * External format is the bitlen as an int32, then the byte array.
+ */
+Datum
+varbit_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarBit *result;
+ int len,
+ bitlen;
+
+ bitlen = pq_getmsgint(buf, sizeof(int32));
+ if (bitlen < 0 || bitlen > VARBITMAXLEN)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid length in external bit string")));
+
+ /*
+ * Sometimes atttypmod is not supplied. If it is supplied we need to make
+ * sure that the bitstring fits.
+ */
+ if (atttypmod > 0 && bitlen > atttypmod)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("bit string too long for type bit varying(%d)",
+ atttypmod)));
+
+ len = VARBITTOTALLEN(bitlen);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen;
+
+ pq_copymsgbytes(buf, (char *) VARBITS(result), VARBITBYTES(result));
+
+ /* Make sure last byte is correctly zero-padded */
+ VARBIT_PAD(result);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * varbit_send - converts varbit to binary format
+ */
+Datum
+varbit_send(PG_FUNCTION_ARGS)
+{
+ VarBit *s = PG_GETARG_VARBIT_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, VARBITLEN(s));
+ pq_sendbytes(&buf, (char *) VARBITS(s), VARBITBYTES(s));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * varbit_support()
+ *
+ * Planner support function for the varbit() length coercion function.
+ *
+ * Currently, the only interesting thing we can do is flatten calls that set
+ * the new maximum length >= the previous maximum length. We can ignore the
+ * isExplicit argument, since that only affects truncation cases.
+ */
+Datum
+varbit_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+ FuncExpr *expr = req->fcall;
+ Node *typmod;
+
+ Assert(list_length(expr->args) >= 2);
+
+ typmod = (Node *) lsecond(expr->args);
+
+ if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
+ {
+ Node *source = (Node *) linitial(expr->args);
+ int32 new_typmod = DatumGetInt32(((Const *) typmod)->constvalue);
+ int32 old_max = exprTypmod(source);
+ int32 new_max = new_typmod;
+
+ /* Note: varbit() treats typmod 0 as invalid, so we do too */
+ if (new_max <= 0 || (old_max > 0 && old_max <= new_max))
+ ret = relabel_to_typmod(source, new_typmod);
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/*
+ * varbit()
+ * Converts a varbit() type to a specific internal length.
+ * len is the maximum bitlength specified in the column definition.
+ *
+ * If doing implicit cast, raise error when source data is too long.
+ * If doing explicit cast, silently truncate to max length.
+ */
+Datum
+varbit(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ int32 len = PG_GETARG_INT32(1);
+ bool isExplicit = PG_GETARG_BOOL(2);
+ VarBit *result;
+ int rlen;
+
+ /* No work if typmod is invalid or supplied data matches it already */
+ if (len <= 0 || len >= VARBITLEN(arg))
+ PG_RETURN_VARBIT_P(arg);
+
+ if (!isExplicit)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("bit string too long for type bit varying(%d)",
+ len)));
+
+ rlen = VARBITTOTALLEN(len);
+ result = (VarBit *) palloc(rlen);
+ SET_VARSIZE(result, rlen);
+ VARBITLEN(result) = len;
+
+ memcpy(VARBITS(result), VARBITS(arg), VARBITBYTES(result));
+
+ /* Make sure last byte is correctly zero-padded */
+ VARBIT_PAD(result);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+Datum
+varbittypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anybit_typmodin(ta, "varbit"));
+}
+
+Datum
+varbittypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anybit_typmodout(typmod));
+}
+
+
+/*
+ * Comparison operators
+ *
+ * We only need one set of comparison operators for bitstrings, as the lengths
+ * are stored in the same way for zero-padded and varying bit strings.
+ *
+ * Note that the standard is not unambiguous about the comparison between
+ * zero-padded bit strings and varying bitstrings. If the same value is written
+ * into a zero padded bitstring as into a varying bitstring, but the zero
+ * padded bitstring has greater length, it will be bigger.
+ *
+ * Zeros from the beginning of a bitstring cannot simply be ignored, as they
+ * may be part of a bit string and may be significant.
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ */
+
+/*
+ * bit_cmp
+ *
+ * Compares two bitstrings and returns <0, 0, >0 depending on whether the first
+ * string is smaller, equal, or bigger than the second. All bits are considered
+ * and additional zero bits may make one string smaller/larger than the other,
+ * even if their zero-padded values would be the same.
+ */
+static int32
+bit_cmp(VarBit *arg1, VarBit *arg2)
+{
+ int bitlen1,
+ bytelen1,
+ bitlen2,
+ bytelen2;
+ int32 cmp;
+
+ bytelen1 = VARBITBYTES(arg1);
+ bytelen2 = VARBITBYTES(arg2);
+
+ cmp = memcmp(VARBITS(arg1), VARBITS(arg2), Min(bytelen1, bytelen2));
+ if (cmp == 0)
+ {
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+ if (bitlen1 != bitlen2)
+ cmp = (bitlen1 < bitlen2) ? -1 : 1;
+ }
+ return cmp;
+}
+
+Datum
+biteq(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+ int bitlen1,
+ bitlen2;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+
+ /* fast path for different-length inputs */
+ if (bitlen1 != bitlen2)
+ result = false;
+ else
+ result = (bit_cmp(arg1, arg2) == 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitne(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+ int bitlen1,
+ bitlen2;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+
+ /* fast path for different-length inputs */
+ if (bitlen1 != bitlen2)
+ result = true;
+ else
+ result = (bit_cmp(arg1, arg2) != 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitlt(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+
+ result = (bit_cmp(arg1, arg2) < 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitle(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+
+ result = (bit_cmp(arg1, arg2) <= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitgt(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+
+ result = (bit_cmp(arg1, arg2) > 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitge(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ bool result;
+
+ result = (bit_cmp(arg1, arg2) >= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bitcmp(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ int32 result;
+
+ result = bit_cmp(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * bitcat
+ * Concatenation of bit strings
+ */
+Datum
+bitcat(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+
+ PG_RETURN_VARBIT_P(bit_catenate(arg1, arg2));
+}
+
+static VarBit *
+bit_catenate(VarBit *arg1, VarBit *arg2)
+{
+ VarBit *result;
+ int bitlen1,
+ bitlen2,
+ bytelen,
+ bit1pad,
+ bit2shift;
+ bits8 *pr,
+ *pa;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+
+ if (bitlen1 > VARBITMAXLEN - bitlen2)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("bit string length exceeds the maximum allowed (%d)",
+ VARBITMAXLEN)));
+ bytelen = VARBITTOTALLEN(bitlen1 + bitlen2);
+
+ result = (VarBit *) palloc(bytelen);
+ SET_VARSIZE(result, bytelen);
+ VARBITLEN(result) = bitlen1 + bitlen2;
+
+ /* Copy the first bitstring in */
+ memcpy(VARBITS(result), VARBITS(arg1), VARBITBYTES(arg1));
+
+ /* Copy the second bit string */
+ bit1pad = VARBITPAD(arg1);
+ if (bit1pad == 0)
+ {
+ memcpy(VARBITS(result) + VARBITBYTES(arg1), VARBITS(arg2),
+ VARBITBYTES(arg2));
+ }
+ else if (bitlen2 > 0)
+ {
+ /* We need to shift all the bits to fit */
+ bit2shift = BITS_PER_BYTE - bit1pad;
+ pr = VARBITS(result) + VARBITBYTES(arg1) - 1;
+ for (pa = VARBITS(arg2); pa < VARBITEND(arg2); pa++)
+ {
+ *pr |= ((*pa >> bit2shift) & BITMASK);
+ pr++;
+ if (pr < VARBITEND(result))
+ *pr = (*pa << bit1pad) & BITMASK;
+ }
+ }
+
+ /* The pad bits should be already zero at this point */
+
+ return result;
+}
+
+/*
+ * bitsubstr
+ * retrieve a substring from the bit string.
+ * Note, s is 1-based.
+ * SQL draft 6.10 9)
+ */
+Datum
+bitsubstr(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_VARBIT_P(bitsubstring(PG_GETARG_VARBIT_P(0),
+ PG_GETARG_INT32(1),
+ PG_GETARG_INT32(2),
+ false));
+}
+
+Datum
+bitsubstr_no_len(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_VARBIT_P(bitsubstring(PG_GETARG_VARBIT_P(0),
+ PG_GETARG_INT32(1),
+ -1, true));
+}
+
+static VarBit *
+bitsubstring(VarBit *arg, int32 s, int32 l, bool length_not_specified)
+{
+ VarBit *result;
+ int bitlen,
+ rbitlen,
+ len,
+ ishift,
+ i;
+ int32 e,
+ s1,
+ e1;
+ bits8 *r,
+ *ps;
+
+ bitlen = VARBITLEN(arg);
+ s1 = Max(s, 1);
+ /* If we do not have an upper bound, use end of string */
+ if (length_not_specified)
+ {
+ e1 = bitlen + 1;
+ }
+ else if (l < 0)
+ {
+ /* SQL99 says to throw an error for E < S, i.e., negative length */
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ e1 = -1; /* silence stupider compilers */
+ }
+ else if (pg_add_s32_overflow(s, l, &e))
+ {
+ /*
+ * L could be large enough for S + L to overflow, in which case the
+ * substring must run to end of string.
+ */
+ e1 = bitlen + 1;
+ }
+ else
+ {
+ e1 = Min(e, bitlen + 1);
+ }
+ if (s1 > bitlen || e1 <= s1)
+ {
+ /* Need to return a zero-length bitstring */
+ len = VARBITTOTALLEN(0);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = 0;
+ }
+ else
+ {
+ /*
+ * OK, we've got a true substring starting at position s1-1 and ending
+ * at position e1-1
+ */
+ rbitlen = e1 - s1;
+ len = VARBITTOTALLEN(rbitlen);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = rbitlen;
+ len -= VARHDRSZ + VARBITHDRSZ;
+ /* Are we copying from a byte boundary? */
+ if ((s1 - 1) % BITS_PER_BYTE == 0)
+ {
+ /* Yep, we are copying bytes */
+ memcpy(VARBITS(result), VARBITS(arg) + (s1 - 1) / BITS_PER_BYTE,
+ len);
+ }
+ else
+ {
+ /* Figure out how much we need to shift the sequence by */
+ ishift = (s1 - 1) % BITS_PER_BYTE;
+ r = VARBITS(result);
+ ps = VARBITS(arg) + (s1 - 1) / BITS_PER_BYTE;
+ for (i = 0; i < len; i++)
+ {
+ *r = (*ps << ishift) & BITMASK;
+ if ((++ps) < VARBITEND(arg))
+ *r |= *ps >> (BITS_PER_BYTE - ishift);
+ r++;
+ }
+ }
+
+ /* Make sure last byte is correctly zero-padded */
+ VARBIT_PAD(result);
+ }
+
+ return result;
+}
+
+/*
+ * bitoverlay
+ * Replace specified substring of first string with second
+ *
+ * The SQL standard defines OVERLAY() in terms of substring and concatenation.
+ * This code is a direct implementation of what the standard says.
+ */
+Datum
+bitoverlay(PG_FUNCTION_ARGS)
+{
+ VarBit *t1 = PG_GETARG_VARBIT_P(0);
+ VarBit *t2 = PG_GETARG_VARBIT_P(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl = PG_GETARG_INT32(3); /* substring length */
+
+ PG_RETURN_VARBIT_P(bit_overlay(t1, t2, sp, sl));
+}
+
+Datum
+bitoverlay_no_len(PG_FUNCTION_ARGS)
+{
+ VarBit *t1 = PG_GETARG_VARBIT_P(0);
+ VarBit *t2 = PG_GETARG_VARBIT_P(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl;
+
+ sl = VARBITLEN(t2); /* defaults to length(t2) */
+ PG_RETURN_VARBIT_P(bit_overlay(t1, t2, sp, sl));
+}
+
+static VarBit *
+bit_overlay(VarBit *t1, VarBit *t2, int sp, int sl)
+{
+ VarBit *result;
+ VarBit *s1;
+ VarBit *s2;
+ int sp_pl_sl;
+
+ /*
+ * Check for possible integer-overflow cases. For negative sp, throw a
+ * "substring length" error because that's what should be expected
+ * according to the spec's definition of OVERLAY().
+ */
+ if (sp <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ if (pg_add_s32_overflow(sp, sl, &sp_pl_sl))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ s1 = bitsubstring(t1, 1, sp - 1, false);
+ s2 = bitsubstring(t1, sp_pl_sl, -1, true);
+ result = bit_catenate(s1, t2);
+ result = bit_catenate(result, s2);
+
+ return result;
+}
+
+/*
+ * bit_count
+ *
+ * Returns the number of bits set in a bit string.
+ */
+Datum
+bit_bit_count(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+
+ PG_RETURN_INT64(pg_popcount((char *) VARBITS(arg), VARBITBYTES(arg)));
+}
+
+/*
+ * bitlength, bitoctetlength
+ * Return the length of a bit string
+ */
+Datum
+bitlength(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+
+ PG_RETURN_INT32(VARBITLEN(arg));
+}
+
+Datum
+bitoctetlength(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+
+ PG_RETURN_INT32(VARBITBYTES(arg));
+}
+
+/*
+ * bit_and
+ * perform a logical AND on two bit strings.
+ */
+Datum
+bit_and(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ VarBit *result;
+ int len,
+ bitlen1,
+ bitlen2,
+ i;
+ bits8 *p1,
+ *p2,
+ *r;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+ if (bitlen1 != bitlen2)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("cannot AND bit strings of different sizes")));
+
+ len = VARSIZE(arg1);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen1;
+
+ p1 = VARBITS(arg1);
+ p2 = VARBITS(arg2);
+ r = VARBITS(result);
+ for (i = 0; i < VARBITBYTES(arg1); i++)
+ *r++ = *p1++ & *p2++;
+
+ /* Padding is not needed as & of 0 pads is 0 */
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bit_or
+ * perform a logical OR on two bit strings.
+ */
+Datum
+bit_or(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ VarBit *result;
+ int len,
+ bitlen1,
+ bitlen2,
+ i;
+ bits8 *p1,
+ *p2,
+ *r;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+ if (bitlen1 != bitlen2)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("cannot OR bit strings of different sizes")));
+ len = VARSIZE(arg1);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen1;
+
+ p1 = VARBITS(arg1);
+ p2 = VARBITS(arg2);
+ r = VARBITS(result);
+ for (i = 0; i < VARBITBYTES(arg1); i++)
+ *r++ = *p1++ | *p2++;
+
+ /* Padding is not needed as | of 0 pads is 0 */
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bitxor
+ * perform a logical XOR on two bit strings.
+ */
+Datum
+bitxor(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ VarBit *arg2 = PG_GETARG_VARBIT_P(1);
+ VarBit *result;
+ int len,
+ bitlen1,
+ bitlen2,
+ i;
+ bits8 *p1,
+ *p2,
+ *r;
+
+ bitlen1 = VARBITLEN(arg1);
+ bitlen2 = VARBITLEN(arg2);
+ if (bitlen1 != bitlen2)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_LENGTH_MISMATCH),
+ errmsg("cannot XOR bit strings of different sizes")));
+
+ len = VARSIZE(arg1);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen1;
+
+ p1 = VARBITS(arg1);
+ p2 = VARBITS(arg2);
+ r = VARBITS(result);
+ for (i = 0; i < VARBITBYTES(arg1); i++)
+ *r++ = *p1++ ^ *p2++;
+
+ /* Padding is not needed as ^ of 0 pads is 0 */
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bitnot
+ * perform a logical NOT on a bit string.
+ */
+Datum
+bitnot(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ VarBit *result;
+ bits8 *p,
+ *r;
+
+ result = (VarBit *) palloc(VARSIZE(arg));
+ SET_VARSIZE(result, VARSIZE(arg));
+ VARBITLEN(result) = VARBITLEN(arg);
+
+ p = VARBITS(arg);
+ r = VARBITS(result);
+ for (; p < VARBITEND(arg); p++)
+ *r++ = ~*p;
+
+ /* Must zero-pad the result, because extra bits are surely 1's here */
+ VARBIT_PAD_LAST(result, r);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bitshiftleft
+ * do a left shift (i.e. towards the beginning of the string)
+ */
+Datum
+bitshiftleft(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ int32 shft = PG_GETARG_INT32(1);
+ VarBit *result;
+ int byte_shift,
+ ishift,
+ len;
+ bits8 *p,
+ *r;
+
+ /* Negative shift is a shift to the right */
+ if (shft < 0)
+ {
+ /* Prevent integer overflow in negation */
+ if (shft < -VARBITMAXLEN)
+ shft = -VARBITMAXLEN;
+ PG_RETURN_DATUM(DirectFunctionCall2(bitshiftright,
+ VarBitPGetDatum(arg),
+ Int32GetDatum(-shft)));
+ }
+
+ result = (VarBit *) palloc(VARSIZE(arg));
+ SET_VARSIZE(result, VARSIZE(arg));
+ VARBITLEN(result) = VARBITLEN(arg);
+ r = VARBITS(result);
+
+ /* If we shifted all the bits out, return an all-zero string */
+ if (shft >= VARBITLEN(arg))
+ {
+ MemSet(r, 0, VARBITBYTES(arg));
+ PG_RETURN_VARBIT_P(result);
+ }
+
+ byte_shift = shft / BITS_PER_BYTE;
+ ishift = shft % BITS_PER_BYTE;
+ p = VARBITS(arg) + byte_shift;
+
+ if (ishift == 0)
+ {
+ /* Special case: we can do a memcpy */
+ len = VARBITBYTES(arg) - byte_shift;
+ memcpy(r, p, len);
+ MemSet(r + len, 0, byte_shift);
+ }
+ else
+ {
+ for (; p < VARBITEND(arg); r++)
+ {
+ *r = *p << ishift;
+ if ((++p) < VARBITEND(arg))
+ *r |= *p >> (BITS_PER_BYTE - ishift);
+ }
+ for (; r < VARBITEND(result); r++)
+ *r = 0;
+ }
+
+ /* The pad bits should be already zero at this point */
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bitshiftright
+ * do a right shift (i.e. towards the end of the string)
+ */
+Datum
+bitshiftright(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ int32 shft = PG_GETARG_INT32(1);
+ VarBit *result;
+ int byte_shift,
+ ishift,
+ len;
+ bits8 *p,
+ *r;
+
+ /* Negative shift is a shift to the left */
+ if (shft < 0)
+ {
+ /* Prevent integer overflow in negation */
+ if (shft < -VARBITMAXLEN)
+ shft = -VARBITMAXLEN;
+ PG_RETURN_DATUM(DirectFunctionCall2(bitshiftleft,
+ VarBitPGetDatum(arg),
+ Int32GetDatum(-shft)));
+ }
+
+ result = (VarBit *) palloc(VARSIZE(arg));
+ SET_VARSIZE(result, VARSIZE(arg));
+ VARBITLEN(result) = VARBITLEN(arg);
+ r = VARBITS(result);
+
+ /* If we shifted all the bits out, return an all-zero string */
+ if (shft >= VARBITLEN(arg))
+ {
+ MemSet(r, 0, VARBITBYTES(arg));
+ PG_RETURN_VARBIT_P(result);
+ }
+
+ byte_shift = shft / BITS_PER_BYTE;
+ ishift = shft % BITS_PER_BYTE;
+ p = VARBITS(arg);
+
+ /* Set the first part of the result to 0 */
+ MemSet(r, 0, byte_shift);
+ r += byte_shift;
+
+ if (ishift == 0)
+ {
+ /* Special case: we can do a memcpy */
+ len = VARBITBYTES(arg) - byte_shift;
+ memcpy(r, p, len);
+ r += len;
+ }
+ else
+ {
+ if (r < VARBITEND(result))
+ *r = 0; /* initialize first byte */
+ for (; r < VARBITEND(result); p++)
+ {
+ *r |= *p >> ishift;
+ if ((++r) < VARBITEND(result))
+ *r = (*p << (BITS_PER_BYTE - ishift)) & BITMASK;
+ }
+ }
+
+ /* We may have shifted 1's into the pad bits, so fix that */
+ VARBIT_PAD_LAST(result, r);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * This is not defined in any standard. We retain the natural ordering of
+ * bits here, as it just seems more intuitive.
+ */
+Datum
+bitfromint4(PG_FUNCTION_ARGS)
+{
+ int32 a = PG_GETARG_INT32(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ VarBit *result;
+ bits8 *r;
+ int rlen;
+ int destbitsleft,
+ srcbitsleft;
+
+ if (typmod <= 0 || typmod > VARBITMAXLEN)
+ typmod = 1; /* default bit length */
+
+ rlen = VARBITTOTALLEN(typmod);
+ result = (VarBit *) palloc(rlen);
+ SET_VARSIZE(result, rlen);
+ VARBITLEN(result) = typmod;
+
+ r = VARBITS(result);
+ destbitsleft = typmod;
+ srcbitsleft = 32;
+ /* drop any input bits that don't fit */
+ srcbitsleft = Min(srcbitsleft, destbitsleft);
+ /* sign-fill any excess bytes in output */
+ while (destbitsleft >= srcbitsleft + 8)
+ {
+ *r++ = (bits8) ((a < 0) ? BITMASK : 0);
+ destbitsleft -= 8;
+ }
+ /* store first fractional byte */
+ if (destbitsleft > srcbitsleft)
+ {
+ unsigned int val = (unsigned int) (a >> (destbitsleft - 8));
+
+ /* Force sign-fill in case the compiler implements >> as zero-fill */
+ if (a < 0)
+ val |= ((unsigned int) -1) << (srcbitsleft + 8 - destbitsleft);
+ *r++ = (bits8) (val & BITMASK);
+ destbitsleft -= 8;
+ }
+ /* Now srcbitsleft and destbitsleft are the same, need not track both */
+ /* store whole bytes */
+ while (destbitsleft >= 8)
+ {
+ *r++ = (bits8) ((a >> (destbitsleft - 8)) & BITMASK);
+ destbitsleft -= 8;
+ }
+ /* store last fractional byte */
+ if (destbitsleft > 0)
+ *r = (bits8) ((a << (8 - destbitsleft)) & BITMASK);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+Datum
+bittoint4(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ uint32 result;
+ bits8 *r;
+
+ /* Check that the bit string is not too long */
+ if (VARBITLEN(arg) > sizeof(result) * BITS_PER_BYTE)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ result = 0;
+ for (r = VARBITS(arg); r < VARBITEND(arg); r++)
+ {
+ result <<= BITS_PER_BYTE;
+ result |= *r;
+ }
+ /* Now shift the result to take account of the padding at the end */
+ result >>= VARBITPAD(arg);
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+bitfromint8(PG_FUNCTION_ARGS)
+{
+ int64 a = PG_GETARG_INT64(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ VarBit *result;
+ bits8 *r;
+ int rlen;
+ int destbitsleft,
+ srcbitsleft;
+
+ if (typmod <= 0 || typmod > VARBITMAXLEN)
+ typmod = 1; /* default bit length */
+
+ rlen = VARBITTOTALLEN(typmod);
+ result = (VarBit *) palloc(rlen);
+ SET_VARSIZE(result, rlen);
+ VARBITLEN(result) = typmod;
+
+ r = VARBITS(result);
+ destbitsleft = typmod;
+ srcbitsleft = 64;
+ /* drop any input bits that don't fit */
+ srcbitsleft = Min(srcbitsleft, destbitsleft);
+ /* sign-fill any excess bytes in output */
+ while (destbitsleft >= srcbitsleft + 8)
+ {
+ *r++ = (bits8) ((a < 0) ? BITMASK : 0);
+ destbitsleft -= 8;
+ }
+ /* store first fractional byte */
+ if (destbitsleft > srcbitsleft)
+ {
+ unsigned int val = (unsigned int) (a >> (destbitsleft - 8));
+
+ /* Force sign-fill in case the compiler implements >> as zero-fill */
+ if (a < 0)
+ val |= ((unsigned int) -1) << (srcbitsleft + 8 - destbitsleft);
+ *r++ = (bits8) (val & BITMASK);
+ destbitsleft -= 8;
+ }
+ /* Now srcbitsleft and destbitsleft are the same, need not track both */
+ /* store whole bytes */
+ while (destbitsleft >= 8)
+ {
+ *r++ = (bits8) ((a >> (destbitsleft - 8)) & BITMASK);
+ destbitsleft -= 8;
+ }
+ /* store last fractional byte */
+ if (destbitsleft > 0)
+ *r = (bits8) ((a << (8 - destbitsleft)) & BITMASK);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+Datum
+bittoint8(PG_FUNCTION_ARGS)
+{
+ VarBit *arg = PG_GETARG_VARBIT_P(0);
+ uint64 result;
+ bits8 *r;
+
+ /* Check that the bit string is not too long */
+ if (VARBITLEN(arg) > sizeof(result) * BITS_PER_BYTE)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("bigint out of range")));
+
+ result = 0;
+ for (r = VARBITS(arg); r < VARBITEND(arg); r++)
+ {
+ result <<= BITS_PER_BYTE;
+ result |= *r;
+ }
+ /* Now shift the result to take account of the padding at the end */
+ result >>= VARBITPAD(arg);
+
+ PG_RETURN_INT64(result);
+}
+
+
+/*
+ * Determines the position of S2 in the bitstring S1 (1-based string).
+ * If S2 does not appear in S1 this function returns 0.
+ * If S2 is of length 0 this function returns 1.
+ * Compatible in usage with POSITION() functions for other data types.
+ */
+Datum
+bitposition(PG_FUNCTION_ARGS)
+{
+ VarBit *str = PG_GETARG_VARBIT_P(0);
+ VarBit *substr = PG_GETARG_VARBIT_P(1);
+ int substr_length,
+ str_length,
+ i,
+ is;
+ bits8 *s, /* pointer into substring */
+ *p; /* pointer into str */
+ bits8 cmp, /* shifted substring byte to compare */
+ mask1, /* mask for substring byte shifted right */
+ mask2, /* mask for substring byte shifted left */
+ end_mask, /* pad mask for last substring byte */
+ str_mask; /* pad mask for last string byte */
+ bool is_match;
+
+ /* Get the substring length */
+ substr_length = VARBITLEN(substr);
+ str_length = VARBITLEN(str);
+
+ /* String has zero length or substring longer than string, return 0 */
+ if ((str_length == 0) || (substr_length > str_length))
+ PG_RETURN_INT32(0);
+
+ /* zero-length substring means return 1 */
+ if (substr_length == 0)
+ PG_RETURN_INT32(1);
+
+ /* Initialise the padding masks */
+ end_mask = BITMASK << VARBITPAD(substr);
+ str_mask = BITMASK << VARBITPAD(str);
+ for (i = 0; i < VARBITBYTES(str) - VARBITBYTES(substr) + 1; i++)
+ {
+ for (is = 0; is < BITS_PER_BYTE; is++)
+ {
+ is_match = true;
+ p = VARBITS(str) + i;
+ mask1 = BITMASK >> is;
+ mask2 = ~mask1;
+ for (s = VARBITS(substr);
+ is_match && s < VARBITEND(substr); s++)
+ {
+ cmp = *s >> is;
+ if (s == VARBITEND(substr) - 1)
+ {
+ mask1 &= end_mask >> is;
+ if (p == VARBITEND(str) - 1)
+ {
+ /* Check that there is enough of str left */
+ if (mask1 & ~str_mask)
+ {
+ is_match = false;
+ break;
+ }
+ mask1 &= str_mask;
+ }
+ }
+ is_match = ((cmp ^ *p) & mask1) == 0;
+ if (!is_match)
+ break;
+ /* Move on to the next byte */
+ p++;
+ if (p == VARBITEND(str))
+ {
+ mask2 = end_mask << (BITS_PER_BYTE - is);
+ is_match = mask2 == 0;
+#if 0
+ elog(DEBUG4, "S. %d %d em=%2x sm=%2x r=%d",
+ i, is, end_mask, mask2, is_match);
+#endif
+ break;
+ }
+ cmp = *s << (BITS_PER_BYTE - is);
+ if (s == VARBITEND(substr) - 1)
+ {
+ mask2 &= end_mask << (BITS_PER_BYTE - is);
+ if (p == VARBITEND(str) - 1)
+ {
+ if (mask2 & ~str_mask)
+ {
+ is_match = false;
+ break;
+ }
+ mask2 &= str_mask;
+ }
+ }
+ is_match = ((cmp ^ *p) & mask2) == 0;
+ }
+ /* Have we found a match? */
+ if (is_match)
+ PG_RETURN_INT32(i * BITS_PER_BYTE + is + 1);
+ }
+ }
+ PG_RETURN_INT32(0);
+}
+
+
+/*
+ * bitsetbit
+ *
+ * Given an instance of type 'bit' creates a new one with
+ * the Nth bit set to the given value.
+ *
+ * The bit location is specified left-to-right in a zero-based fashion
+ * consistent with the other get_bit and set_bit functions, but
+ * inconsistent with the standard substring, position, overlay functions
+ */
+Datum
+bitsetbit(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ int32 n = PG_GETARG_INT32(1);
+ int32 newBit = PG_GETARG_INT32(2);
+ VarBit *result;
+ int len,
+ bitlen;
+ bits8 *r,
+ *p;
+ int byteNo,
+ bitNo;
+
+ bitlen = VARBITLEN(arg1);
+ if (n < 0 || n >= bitlen)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("bit index %d out of valid range (0..%d)",
+ n, bitlen - 1)));
+
+ /*
+ * sanity check!
+ */
+ if (newBit != 0 && newBit != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("new bit must be 0 or 1")));
+
+ len = VARSIZE(arg1);
+ result = (VarBit *) palloc(len);
+ SET_VARSIZE(result, len);
+ VARBITLEN(result) = bitlen;
+
+ p = VARBITS(arg1);
+ r = VARBITS(result);
+
+ memcpy(r, p, VARBITBYTES(arg1));
+
+ byteNo = n / BITS_PER_BYTE;
+ bitNo = BITS_PER_BYTE - 1 - (n % BITS_PER_BYTE);
+
+ /*
+ * Update the byte.
+ */
+ if (newBit == 0)
+ r[byteNo] &= (~(1 << bitNo));
+ else
+ r[byteNo] |= (1 << bitNo);
+
+ PG_RETURN_VARBIT_P(result);
+}
+
+/*
+ * bitgetbit
+ *
+ * returns the value of the Nth bit of a bit array (0 or 1).
+ *
+ * The bit location is specified left-to-right in a zero-based fashion
+ * consistent with the other get_bit and set_bit functions, but
+ * inconsistent with the standard substring, position, overlay functions
+ */
+Datum
+bitgetbit(PG_FUNCTION_ARGS)
+{
+ VarBit *arg1 = PG_GETARG_VARBIT_P(0);
+ int32 n = PG_GETARG_INT32(1);
+ int bitlen;
+ bits8 *p;
+ int byteNo,
+ bitNo;
+
+ bitlen = VARBITLEN(arg1);
+ if (n < 0 || n >= bitlen)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("bit index %d out of valid range (0..%d)",
+ n, bitlen - 1)));
+
+ p = VARBITS(arg1);
+
+ byteNo = n / BITS_PER_BYTE;
+ bitNo = BITS_PER_BYTE - 1 - (n % BITS_PER_BYTE);
+
+ if (p[byteNo] & (1 << bitNo))
+ PG_RETURN_INT32(1);
+ else
+ PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
new file mode 100644
index 0000000..63a2073
--- /dev/null
+++ b/src/backend/utils/adt/varchar.c
@@ -0,0 +1,1236 @@
+/*-------------------------------------------------------------------------
+ *
+ * varchar.c
+ * Functions for the built-in types char(n) and varchar(n).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/varchar.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/detoast.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "libpq/pqformat.h"
+#include "mb/pg_wchar.h"
+#include "nodes/nodeFuncs.h"
+#include "nodes/supportnodes.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/pg_locale.h"
+#include "utils/varlena.h"
+
+/* common code for bpchartypmodin and varchartypmodin */
+static int32
+anychar_typmodin(ArrayType *ta, const char *typename)
+{
+ int32 typmod;
+ int32 *tl;
+ int n;
+
+ tl = ArrayGetIntegerTypmods(ta, &n);
+
+ /*
+ * we're not too tense about good error message here because grammar
+ * shouldn't allow wrong number of modifiers for CHAR
+ */
+ if (n != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid type modifier")));
+
+ if (*tl < 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("length for type %s must be at least 1", typename)));
+ if (*tl > MaxAttrSize)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("length for type %s cannot exceed %d",
+ typename, MaxAttrSize)));
+
+ /*
+ * For largely historical reasons, the typmod is VARHDRSZ plus the number
+ * of characters; there is enough client-side code that knows about that
+ * that we'd better not change it.
+ */
+ typmod = VARHDRSZ + *tl;
+
+ return typmod;
+}
+
+/* common code for bpchartypmodout and varchartypmodout */
+static char *
+anychar_typmodout(int32 typmod)
+{
+ char *res = (char *) palloc(64);
+
+ if (typmod > VARHDRSZ)
+ snprintf(res, 64, "(%d)", (int) (typmod - VARHDRSZ));
+ else
+ *res = '\0';
+
+ return res;
+}
+
+
+/*
+ * CHAR() and VARCHAR() types are part of the SQL standard. CHAR()
+ * is for blank-padded string whose length is specified in CREATE TABLE.
+ * VARCHAR is for storing string whose length is at most the length specified
+ * at CREATE TABLE time.
+ *
+ * It's hard to implement these types because we cannot figure out
+ * the length of the type from the type itself. I changed (hopefully all) the
+ * fmgr calls that invoke input functions of a data type to supply the
+ * length also. (eg. in INSERTs, we have the tupleDescriptor which contains
+ * the length of the attributes and hence the exact length of the char() or
+ * varchar(). We pass this to bpcharin() or varcharin().) In the case where
+ * we cannot determine the length, we pass in -1 instead and the input
+ * converter does not enforce any length check.
+ *
+ * We actually implement this as a varlena so that we don't have to pass in
+ * the length for the comparison functions. (The difference between these
+ * types and "text" is that we truncate and possibly blank-pad the string
+ * at insertion time.)
+ *
+ * - ay 6/95
+ */
+
+
+/*****************************************************************************
+ * bpchar - char() *
+ *****************************************************************************/
+
+/*
+ * bpchar_input -- common guts of bpcharin and bpcharrecv
+ *
+ * s is the input text of length len (may not be null-terminated)
+ * atttypmod is the typmod value to apply
+ *
+ * Note that atttypmod is measured in characters, which
+ * is not necessarily the same as the number of bytes.
+ *
+ * If the input string is too long, raise an error, unless the extra
+ * characters are spaces, in which case they're truncated. (per SQL)
+ */
+static BpChar *
+bpchar_input(const char *s, size_t len, int32 atttypmod)
+{
+ BpChar *result;
+ char *r;
+ size_t maxlen;
+
+ /* If typmod is -1 (or invalid), use the actual string length */
+ if (atttypmod < (int32) VARHDRSZ)
+ maxlen = len;
+ else
+ {
+ size_t charlen; /* number of CHARACTERS in the input */
+
+ maxlen = atttypmod - VARHDRSZ;
+ charlen = pg_mbstrlen_with_len(s, len);
+ if (charlen > maxlen)
+ {
+ /* Verify that extra characters are spaces, and clip them off */
+ size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
+ size_t j;
+
+ /*
+ * at this point, len is the actual BYTE length of the input
+ * string, maxlen is the max number of CHARACTERS allowed for this
+ * bpchar type, mbmaxlen is the length in BYTES of those chars.
+ */
+ for (j = mbmaxlen; j < len; j++)
+ {
+ if (s[j] != ' ')
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character(%d)",
+ (int) maxlen)));
+ }
+
+ /*
+ * Now we set maxlen to the necessary byte length, not the number
+ * of CHARACTERS!
+ */
+ maxlen = len = mbmaxlen;
+ }
+ else
+ {
+ /*
+ * Now we set maxlen to the necessary byte length, not the number
+ * of CHARACTERS!
+ */
+ maxlen = len + (maxlen - charlen);
+ }
+ }
+
+ result = (BpChar *) palloc(maxlen + VARHDRSZ);
+ SET_VARSIZE(result, maxlen + VARHDRSZ);
+ r = VARDATA(result);
+ memcpy(r, s, len);
+
+ /* blank pad the string if necessary */
+ if (maxlen > len)
+ memset(r + len, ' ', maxlen - len);
+
+ return result;
+}
+
+/*
+ * Convert a C string to CHARACTER internal representation. atttypmod
+ * is the declared length of the type plus VARHDRSZ.
+ */
+Datum
+bpcharin(PG_FUNCTION_ARGS)
+{
+ char *s = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ BpChar *result;
+
+ result = bpchar_input(s, strlen(s), atttypmod);
+ PG_RETURN_BPCHAR_P(result);
+}
+
+
+/*
+ * Convert a CHARACTER value to a C string.
+ *
+ * Uses the text conversion functions, which is only appropriate if BpChar
+ * and text are equivalent types.
+ */
+Datum
+bpcharout(PG_FUNCTION_ARGS)
+{
+ Datum txt = PG_GETARG_DATUM(0);
+
+ PG_RETURN_CSTRING(TextDatumGetCString(txt));
+}
+
+/*
+ * bpcharrecv - converts external binary format to bpchar
+ */
+Datum
+bpcharrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ BpChar *result;
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ result = bpchar_input(str, nbytes, atttypmod);
+ pfree(str);
+ PG_RETURN_BPCHAR_P(result);
+}
+
+/*
+ * bpcharsend - converts bpchar to binary format
+ */
+Datum
+bpcharsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as textsend, so share code */
+ return textsend(fcinfo);
+}
+
+
+/*
+ * Converts a CHARACTER type to the specified size.
+ *
+ * maxlen is the typmod, ie, declared length plus VARHDRSZ bytes.
+ * isExplicit is true if this is for an explicit cast to char(N).
+ *
+ * Truncation rules: for an explicit cast, silently truncate to the given
+ * length; for an implicit cast, raise error unless extra characters are
+ * all spaces. (This is sort-of per SQL: the spec would actually have us
+ * raise a "completion condition" for the explicit cast case, but Postgres
+ * hasn't got such a concept.)
+ */
+Datum
+bpchar(PG_FUNCTION_ARGS)
+{
+ BpChar *source = PG_GETARG_BPCHAR_PP(0);
+ int32 maxlen = PG_GETARG_INT32(1);
+ bool isExplicit = PG_GETARG_BOOL(2);
+ BpChar *result;
+ int32 len;
+ char *r;
+ char *s;
+ int i;
+ int charlen; /* number of characters in the input string +
+ * VARHDRSZ */
+
+ /* No work if typmod is invalid */
+ if (maxlen < (int32) VARHDRSZ)
+ PG_RETURN_BPCHAR_P(source);
+
+ maxlen -= VARHDRSZ;
+
+ len = VARSIZE_ANY_EXHDR(source);
+ s = VARDATA_ANY(source);
+
+ charlen = pg_mbstrlen_with_len(s, len);
+
+ /* No work if supplied data matches typmod already */
+ if (charlen == maxlen)
+ PG_RETURN_BPCHAR_P(source);
+
+ if (charlen > maxlen)
+ {
+ /* Verify that extra characters are spaces, and clip them off */
+ size_t maxmblen;
+
+ maxmblen = pg_mbcharcliplen(s, len, maxlen);
+
+ if (!isExplicit)
+ {
+ for (i = maxmblen; i < len; i++)
+ if (s[i] != ' ')
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character(%d)",
+ maxlen)));
+ }
+
+ len = maxmblen;
+
+ /*
+ * At this point, maxlen is the necessary byte length, not the number
+ * of CHARACTERS!
+ */
+ maxlen = len;
+ }
+ else
+ {
+ /*
+ * At this point, maxlen is the necessary byte length, not the number
+ * of CHARACTERS!
+ */
+ maxlen = len + (maxlen - charlen);
+ }
+
+ Assert(maxlen >= len);
+
+ result = palloc(maxlen + VARHDRSZ);
+ SET_VARSIZE(result, maxlen + VARHDRSZ);
+ r = VARDATA(result);
+
+ memcpy(r, s, len);
+
+ /* blank pad the string if necessary */
+ if (maxlen > len)
+ memset(r + len, ' ', maxlen - len);
+
+ PG_RETURN_BPCHAR_P(result);
+}
+
+
+/* char_bpchar()
+ * Convert char to bpchar(1).
+ */
+Datum
+char_bpchar(PG_FUNCTION_ARGS)
+{
+ char c = PG_GETARG_CHAR(0);
+ BpChar *result;
+
+ result = (BpChar *) palloc(VARHDRSZ + 1);
+
+ SET_VARSIZE(result, VARHDRSZ + 1);
+ *(VARDATA(result)) = c;
+
+ PG_RETURN_BPCHAR_P(result);
+}
+
+
+/* bpchar_name()
+ * Converts a bpchar() type to a NameData type.
+ */
+Datum
+bpchar_name(PG_FUNCTION_ARGS)
+{
+ BpChar *s = PG_GETARG_BPCHAR_PP(0);
+ char *s_data;
+ Name result;
+ int len;
+
+ len = VARSIZE_ANY_EXHDR(s);
+ s_data = VARDATA_ANY(s);
+
+ /* Truncate oversize input */
+ if (len >= NAMEDATALEN)
+ len = pg_mbcliplen(s_data, len, NAMEDATALEN - 1);
+
+ /* Remove trailing blanks */
+ while (len > 0)
+ {
+ if (s_data[len - 1] != ' ')
+ break;
+ len--;
+ }
+
+ /* We use palloc0 here to ensure result is zero-padded */
+ result = (Name) palloc0(NAMEDATALEN);
+ memcpy(NameStr(*result), s_data, len);
+
+ PG_RETURN_NAME(result);
+}
+
+/* name_bpchar()
+ * Converts a NameData type to a bpchar type.
+ *
+ * Uses the text conversion functions, which is only appropriate if BpChar
+ * and text are equivalent types.
+ */
+Datum
+name_bpchar(PG_FUNCTION_ARGS)
+{
+ Name s = PG_GETARG_NAME(0);
+ BpChar *result;
+
+ result = (BpChar *) cstring_to_text(NameStr(*s));
+ PG_RETURN_BPCHAR_P(result);
+}
+
+Datum
+bpchartypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anychar_typmodin(ta, "char"));
+}
+
+Datum
+bpchartypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anychar_typmodout(typmod));
+}
+
+
+/*****************************************************************************
+ * varchar - varchar(n)
+ *
+ * Note: varchar piggybacks on type text for most operations, and so has no
+ * C-coded functions except for I/O and typmod checking.
+ *****************************************************************************/
+
+/*
+ * varchar_input -- common guts of varcharin and varcharrecv
+ *
+ * s is the input text of length len (may not be null-terminated)
+ * atttypmod is the typmod value to apply
+ *
+ * Note that atttypmod is measured in characters, which
+ * is not necessarily the same as the number of bytes.
+ *
+ * If the input string is too long, raise an error, unless the extra
+ * characters are spaces, in which case they're truncated. (per SQL)
+ *
+ * Uses the C string to text conversion function, which is only appropriate
+ * if VarChar and text are equivalent types.
+ */
+static VarChar *
+varchar_input(const char *s, size_t len, int32 atttypmod)
+{
+ VarChar *result;
+ size_t maxlen;
+
+ maxlen = atttypmod - VARHDRSZ;
+
+ if (atttypmod >= (int32) VARHDRSZ && len > maxlen)
+ {
+ /* Verify that extra characters are spaces, and clip them off */
+ size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
+ size_t j;
+
+ for (j = mbmaxlen; j < len; j++)
+ {
+ if (s[j] != ' ')
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character varying(%d)",
+ (int) maxlen)));
+ }
+
+ len = mbmaxlen;
+ }
+
+ result = (VarChar *) cstring_to_text_with_len(s, len);
+ return result;
+}
+
+/*
+ * Convert a C string to VARCHAR internal representation. atttypmod
+ * is the declared length of the type plus VARHDRSZ.
+ */
+Datum
+varcharin(PG_FUNCTION_ARGS)
+{
+ char *s = PG_GETARG_CSTRING(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarChar *result;
+
+ result = varchar_input(s, strlen(s), atttypmod);
+ PG_RETURN_VARCHAR_P(result);
+}
+
+
+/*
+ * Convert a VARCHAR value to a C string.
+ *
+ * Uses the text to C string conversion function, which is only appropriate
+ * if VarChar and text are equivalent types.
+ */
+Datum
+varcharout(PG_FUNCTION_ARGS)
+{
+ Datum txt = PG_GETARG_DATUM(0);
+
+ PG_RETURN_CSTRING(TextDatumGetCString(txt));
+}
+
+/*
+ * varcharrecv - converts external binary format to varchar
+ */
+Datum
+varcharrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+#ifdef NOT_USED
+ Oid typelem = PG_GETARG_OID(1);
+#endif
+ int32 atttypmod = PG_GETARG_INT32(2);
+ VarChar *result;
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ result = varchar_input(str, nbytes, atttypmod);
+ pfree(str);
+ PG_RETURN_VARCHAR_P(result);
+}
+
+/*
+ * varcharsend - converts varchar to binary format
+ */
+Datum
+varcharsend(PG_FUNCTION_ARGS)
+{
+ /* Exactly the same as textsend, so share code */
+ return textsend(fcinfo);
+}
+
+
+/*
+ * varchar_support()
+ *
+ * Planner support function for the varchar() length coercion function.
+ *
+ * Currently, the only interesting thing we can do is flatten calls that set
+ * the new maximum length >= the previous maximum length. We can ignore the
+ * isExplicit argument, since that only affects truncation cases.
+ */
+Datum
+varchar_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+ Node *ret = NULL;
+
+ if (IsA(rawreq, SupportRequestSimplify))
+ {
+ SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;
+ FuncExpr *expr = req->fcall;
+ Node *typmod;
+
+ Assert(list_length(expr->args) >= 2);
+
+ typmod = (Node *) lsecond(expr->args);
+
+ if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
+ {
+ Node *source = (Node *) linitial(expr->args);
+ int32 old_typmod = exprTypmod(source);
+ int32 new_typmod = DatumGetInt32(((Const *) typmod)->constvalue);
+ int32 old_max = old_typmod - VARHDRSZ;
+ int32 new_max = new_typmod - VARHDRSZ;
+
+ if (new_typmod < 0 || (old_typmod >= 0 && old_max <= new_max))
+ ret = relabel_to_typmod(source, new_typmod);
+ }
+ }
+
+ PG_RETURN_POINTER(ret);
+}
+
+/*
+ * Converts a VARCHAR type to the specified size.
+ *
+ * maxlen is the typmod, ie, declared length plus VARHDRSZ bytes.
+ * isExplicit is true if this is for an explicit cast to varchar(N).
+ *
+ * Truncation rules: for an explicit cast, silently truncate to the given
+ * length; for an implicit cast, raise error unless extra characters are
+ * all spaces. (This is sort-of per SQL: the spec would actually have us
+ * raise a "completion condition" for the explicit cast case, but Postgres
+ * hasn't got such a concept.)
+ */
+Datum
+varchar(PG_FUNCTION_ARGS)
+{
+ VarChar *source = PG_GETARG_VARCHAR_PP(0);
+ int32 typmod = PG_GETARG_INT32(1);
+ bool isExplicit = PG_GETARG_BOOL(2);
+ int32 len,
+ maxlen;
+ size_t maxmblen;
+ int i;
+ char *s_data;
+
+ len = VARSIZE_ANY_EXHDR(source);
+ s_data = VARDATA_ANY(source);
+ maxlen = typmod - VARHDRSZ;
+
+ /* No work if typmod is invalid or supplied data fits it already */
+ if (maxlen < 0 || len <= maxlen)
+ PG_RETURN_VARCHAR_P(source);
+
+ /* only reach here if string is too long... */
+
+ /* truncate multibyte string preserving multibyte boundary */
+ maxmblen = pg_mbcharcliplen(s_data, len, maxlen);
+
+ if (!isExplicit)
+ {
+ for (i = maxmblen; i < len; i++)
+ if (s_data[i] != ' ')
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character varying(%d)",
+ maxlen)));
+ }
+
+ PG_RETURN_VARCHAR_P((VarChar *) cstring_to_text_with_len(s_data,
+ maxmblen));
+}
+
+Datum
+varchartypmodin(PG_FUNCTION_ARGS)
+{
+ ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
+
+ PG_RETURN_INT32(anychar_typmodin(ta, "varchar"));
+}
+
+Datum
+varchartypmodout(PG_FUNCTION_ARGS)
+{
+ int32 typmod = PG_GETARG_INT32(0);
+
+ PG_RETURN_CSTRING(anychar_typmodout(typmod));
+}
+
+
+/*****************************************************************************
+ * Exported functions
+ *****************************************************************************/
+
+/* "True" length (not counting trailing blanks) of a BpChar */
+static inline int
+bcTruelen(BpChar *arg)
+{
+ return bpchartruelen(VARDATA_ANY(arg), VARSIZE_ANY_EXHDR(arg));
+}
+
+int
+bpchartruelen(char *s, int len)
+{
+ int i;
+
+ /*
+ * Note that we rely on the assumption that ' ' is a singleton unit on
+ * every supported multibyte server encoding.
+ */
+ for (i = len - 1; i >= 0; i--)
+ {
+ if (s[i] != ' ')
+ break;
+ }
+ return i + 1;
+}
+
+Datum
+bpcharlen(PG_FUNCTION_ARGS)
+{
+ BpChar *arg = PG_GETARG_BPCHAR_PP(0);
+ int len;
+
+ /* get number of bytes, ignoring trailing spaces */
+ len = bcTruelen(arg);
+
+ /* in multibyte encoding, convert to number of characters */
+ if (pg_database_encoding_max_length() != 1)
+ len = pg_mbstrlen_with_len(VARDATA_ANY(arg), len);
+
+ PG_RETURN_INT32(len);
+}
+
+Datum
+bpcharoctetlen(PG_FUNCTION_ARGS)
+{
+ Datum arg = PG_GETARG_DATUM(0);
+
+ /* We need not detoast the input at all */
+ PG_RETURN_INT32(toast_raw_datum_size(arg) - VARHDRSZ);
+}
+
+
+/*****************************************************************************
+ * Comparison Functions used for bpchar
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ *****************************************************************************/
+
+static void
+check_collation_set(Oid collid)
+{
+ if (!OidIsValid(collid))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for string comparison"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+}
+
+Datum
+bpchareq(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ bool result;
+ Oid collid = PG_GET_COLLATION();
+ bool locale_is_c = false;
+ pg_locale_t mylocale = 0;
+
+ check_collation_set(collid);
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ if (lc_collate_is_c(collid))
+ locale_is_c = true;
+ else
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (locale_is_c || !mylocale || mylocale->deterministic)
+ {
+ /*
+ * Since we only care about equality or not-equality, we can avoid all
+ * the expense of strcoll() here, and just do bitwise comparison.
+ */
+ if (len1 != len2)
+ result = false;
+ else
+ result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0);
+ }
+ else
+ {
+ result = (varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ collid) == 0);
+ }
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bpcharne(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ bool result;
+ Oid collid = PG_GET_COLLATION();
+ bool locale_is_c = false;
+ pg_locale_t mylocale = 0;
+
+ check_collation_set(collid);
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ if (lc_collate_is_c(collid))
+ locale_is_c = true;
+ else
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (locale_is_c || !mylocale || mylocale->deterministic)
+ {
+ /*
+ * Since we only care about equality or not-equality, we can avoid all
+ * the expense of strcoll() here, and just do bitwise comparison.
+ */
+ if (len1 != len2)
+ result = true;
+ else
+ result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0);
+ }
+ else
+ {
+ result = (varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ collid) != 0);
+ }
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bpcharlt(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp < 0);
+}
+
+Datum
+bpcharle(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp <= 0);
+}
+
+Datum
+bpchargt(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp > 0);
+}
+
+Datum
+bpcharge(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp >= 0);
+}
+
+Datum
+bpcharcmp(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(cmp);
+}
+
+Datum
+bpchar_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ Oid collid = ssup->ssup_collation;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport */
+ varstr_sortsupport(ssup, BPCHAROID, collid);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
+
+Datum
+bpchar_larger(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_RETURN_BPCHAR_P((cmp >= 0) ? arg1 : arg2);
+}
+
+Datum
+bpchar_smaller(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ cmp = varstr_cmp(VARDATA_ANY(arg1), len1, VARDATA_ANY(arg2), len2,
+ PG_GET_COLLATION());
+
+ PG_RETURN_BPCHAR_P((cmp <= 0) ? arg1 : arg2);
+}
+
+
+/*
+ * bpchar needs a specialized hash function because we want to ignore
+ * trailing blanks in comparisons.
+ */
+Datum
+hashbpchar(PG_FUNCTION_ARGS)
+{
+ BpChar *key = PG_GETARG_BPCHAR_PP(0);
+ Oid collid = PG_GET_COLLATION();
+ char *keydata;
+ int keylen;
+ pg_locale_t mylocale = 0;
+ Datum result;
+
+ if (!collid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for string hashing"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+
+ keydata = VARDATA_ANY(key);
+ keylen = bcTruelen(key);
+
+ if (!lc_collate_is_c(collid))
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (!mylocale || mylocale->deterministic)
+ {
+ result = hash_any((unsigned char *) keydata, keylen);
+ }
+ else
+ {
+#ifdef USE_ICU
+ if (mylocale->provider == COLLPROVIDER_ICU)
+ {
+ int32_t ulen = -1;
+ UChar *uchar = NULL;
+ Size bsize;
+ uint8_t *buf;
+
+ ulen = icu_to_uchar(&uchar, keydata, keylen);
+
+ bsize = ucol_getSortKey(mylocale->info.icu.ucol,
+ uchar, ulen, NULL, 0);
+ buf = palloc(bsize);
+ ucol_getSortKey(mylocale->info.icu.ucol,
+ uchar, ulen, buf, bsize);
+ pfree(uchar);
+
+ result = hash_any(buf, bsize);
+
+ pfree(buf);
+ }
+ else
+#endif
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", mylocale->provider);
+ }
+
+ /* Avoid leaking memory for toasted inputs */
+ PG_FREE_IF_COPY(key, 0);
+
+ return result;
+}
+
+Datum
+hashbpcharextended(PG_FUNCTION_ARGS)
+{
+ BpChar *key = PG_GETARG_BPCHAR_PP(0);
+ Oid collid = PG_GET_COLLATION();
+ char *keydata;
+ int keylen;
+ pg_locale_t mylocale = 0;
+ Datum result;
+
+ if (!collid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for string hashing"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+
+ keydata = VARDATA_ANY(key);
+ keylen = bcTruelen(key);
+
+ if (!lc_collate_is_c(collid))
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (!mylocale || mylocale->deterministic)
+ {
+ result = hash_any_extended((unsigned char *) keydata, keylen,
+ PG_GETARG_INT64(1));
+ }
+ else
+ {
+#ifdef USE_ICU
+ if (mylocale->provider == COLLPROVIDER_ICU)
+ {
+ int32_t ulen = -1;
+ UChar *uchar = NULL;
+ Size bsize;
+ uint8_t *buf;
+
+ ulen = icu_to_uchar(&uchar, VARDATA_ANY(key), VARSIZE_ANY_EXHDR(key));
+
+ bsize = ucol_getSortKey(mylocale->info.icu.ucol,
+ uchar, ulen, NULL, 0);
+ buf = palloc(bsize);
+ ucol_getSortKey(mylocale->info.icu.ucol,
+ uchar, ulen, buf, bsize);
+ pfree(uchar);
+
+ result = hash_any_extended(buf, bsize, PG_GETARG_INT64(1));
+
+ pfree(buf);
+ }
+ else
+#endif
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", mylocale->provider);
+ }
+
+ PG_FREE_IF_COPY(key, 0);
+
+ return result;
+}
+
+/*
+ * The following operators support character-by-character comparison
+ * of bpchar datums, to allow building indexes suitable for LIKE clauses.
+ * Note that the regular bpchareq/bpcharne comparison operators, and
+ * regular support functions 1 and 2 with "C" collation are assumed to be
+ * compatible with these!
+ */
+
+static int
+internal_bpchar_pattern_compare(BpChar *arg1, BpChar *arg2)
+{
+ int result;
+ int len1,
+ len2;
+
+ len1 = bcTruelen(arg1);
+ len2 = bcTruelen(arg2);
+
+ result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+ if (result != 0)
+ return result;
+ else if (len1 < len2)
+ return -1;
+ else if (len1 > len2)
+ return 1;
+ else
+ return 0;
+}
+
+
+Datum
+bpchar_pattern_lt(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int result;
+
+ result = internal_bpchar_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result < 0);
+}
+
+
+Datum
+bpchar_pattern_le(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int result;
+
+ result = internal_bpchar_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result <= 0);
+}
+
+
+Datum
+bpchar_pattern_ge(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int result;
+
+ result = internal_bpchar_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result >= 0);
+}
+
+
+Datum
+bpchar_pattern_gt(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int result;
+
+ result = internal_bpchar_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result > 0);
+}
+
+
+Datum
+btbpchar_pattern_cmp(PG_FUNCTION_ARGS)
+{
+ BpChar *arg1 = PG_GETARG_BPCHAR_PP(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_PP(1);
+ int result;
+
+ result = internal_bpchar_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+
+Datum
+btbpchar_pattern_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport, forcing "C" collation */
+ varstr_sortsupport(ssup, BPCHAROID, C_COLLATION_OID);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
new file mode 100644
index 0000000..3732b79
--- /dev/null
+++ b/src/backend/utils/adt/varlena.c
@@ -0,0 +1,6556 @@
+/*-------------------------------------------------------------------------
+ *
+ * varlena.c
+ * Functions for the variable-length built-in types.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/varlena.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "access/detoast.h"
+#include "access/toast_compression.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "common/int.h"
+#include "common/unicode_norm.h"
+#include "funcapi.h"
+#include "lib/hyperloglog.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "nodes/execnodes.h"
+#include "parser/scansup.h"
+#include "port/pg_bswap.h"
+#include "regex/regex.h"
+#include "utils/builtins.h"
+#include "utils/bytea.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/pg_locale.h"
+#include "utils/sortsupport.h"
+#include "utils/varlena.h"
+
+
+/* GUC variable */
+int bytea_output = BYTEA_OUTPUT_HEX;
+
+typedef struct varlena unknown;
+typedef struct varlena VarString;
+
+/*
+ * State for text_position_* functions.
+ */
+typedef struct
+{
+ bool is_multibyte_char_in_char; /* need to check char boundaries? */
+
+ char *str1; /* haystack string */
+ char *str2; /* needle string */
+ int len1; /* string lengths in bytes */
+ int len2;
+
+ /* Skip table for Boyer-Moore-Horspool search algorithm: */
+ int skiptablemask; /* mask for ANDing with skiptable subscripts */
+ int skiptable[256]; /* skip distance for given mismatched char */
+
+ char *last_match; /* pointer to last match in 'str1' */
+
+ /*
+ * Sometimes we need to convert the byte position of a match to a
+ * character position. These store the last position that was converted,
+ * so that on the next call, we can continue from that point, rather than
+ * count characters from the very beginning.
+ */
+ char *refpoint; /* pointer within original haystack string */
+ int refpos; /* 0-based character offset of the same point */
+} TextPositionState;
+
+typedef struct
+{
+ char *buf1; /* 1st string, or abbreviation original string
+ * buf */
+ char *buf2; /* 2nd string, or abbreviation strxfrm() buf */
+ int buflen1; /* Allocated length of buf1 */
+ int buflen2; /* Allocated length of buf2 */
+ int last_len1; /* Length of last buf1 string/strxfrm() input */
+ int last_len2; /* Length of last buf2 string/strxfrm() blob */
+ int last_returned; /* Last comparison result (cache) */
+ bool cache_blob; /* Does buf2 contain strxfrm() blob, etc? */
+ bool collate_c;
+ Oid typid; /* Actual datatype (text/bpchar/bytea/name) */
+ hyperLogLogState abbr_card; /* Abbreviated key cardinality state */
+ hyperLogLogState full_card; /* Full key cardinality state */
+ double prop_card; /* Required cardinality proportion */
+ pg_locale_t locale;
+} VarStringSortSupport;
+
+/*
+ * Output data for split_text(): we output either to an array or a table.
+ * tupstore and tupdesc must be set up in advance to output to a table.
+ */
+typedef struct
+{
+ ArrayBuildState *astate;
+ Tuplestorestate *tupstore;
+ TupleDesc tupdesc;
+} SplitTextOutputData;
+
+/*
+ * This should be large enough that most strings will fit, but small enough
+ * that we feel comfortable putting it on the stack
+ */
+#define TEXTBUFLEN 1024
+
+#define DatumGetUnknownP(X) ((unknown *) PG_DETOAST_DATUM(X))
+#define DatumGetUnknownPCopy(X) ((unknown *) PG_DETOAST_DATUM_COPY(X))
+#define PG_GETARG_UNKNOWN_P(n) DatumGetUnknownP(PG_GETARG_DATUM(n))
+#define PG_GETARG_UNKNOWN_P_COPY(n) DatumGetUnknownPCopy(PG_GETARG_DATUM(n))
+#define PG_RETURN_UNKNOWN_P(x) PG_RETURN_POINTER(x)
+
+#define DatumGetVarStringP(X) ((VarString *) PG_DETOAST_DATUM(X))
+#define DatumGetVarStringPP(X) ((VarString *) PG_DETOAST_DATUM_PACKED(X))
+
+static int varstrfastcmp_c(Datum x, Datum y, SortSupport ssup);
+static int bpcharfastcmp_c(Datum x, Datum y, SortSupport ssup);
+static int namefastcmp_c(Datum x, Datum y, SortSupport ssup);
+static int varlenafastcmp_locale(Datum x, Datum y, SortSupport ssup);
+static int namefastcmp_locale(Datum x, Datum y, SortSupport ssup);
+static int varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup);
+static Datum varstr_abbrev_convert(Datum original, SortSupport ssup);
+static bool varstr_abbrev_abort(int memtupcount, SortSupport ssup);
+static int32 text_length(Datum str);
+static text *text_catenate(text *t1, text *t2);
+static text *text_substring(Datum str,
+ int32 start,
+ int32 length,
+ bool length_not_specified);
+static text *text_overlay(text *t1, text *t2, int sp, int sl);
+static int text_position(text *t1, text *t2, Oid collid);
+static void text_position_setup(text *t1, text *t2, Oid collid, TextPositionState *state);
+static bool text_position_next(TextPositionState *state);
+static char *text_position_next_internal(char *start_ptr, TextPositionState *state);
+static char *text_position_get_match_ptr(TextPositionState *state);
+static int text_position_get_match_pos(TextPositionState *state);
+static void text_position_cleanup(TextPositionState *state);
+static void check_collation_set(Oid collid);
+static int text_cmp(text *arg1, text *arg2, Oid collid);
+static bytea *bytea_catenate(bytea *t1, bytea *t2);
+static bytea *bytea_substring(Datum str,
+ int S,
+ int L,
+ bool length_not_specified);
+static bytea *bytea_overlay(bytea *t1, bytea *t2, int sp, int sl);
+static void appendStringInfoText(StringInfo str, const text *t);
+static bool split_text(FunctionCallInfo fcinfo, SplitTextOutputData *tstate);
+static void split_text_accum_result(SplitTextOutputData *tstate,
+ text *field_value,
+ text *null_string,
+ Oid collation);
+static text *array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v,
+ const char *fldsep, const char *null_string);
+static StringInfo makeStringAggState(FunctionCallInfo fcinfo);
+static bool text_format_parse_digits(const char **ptr, const char *end_ptr,
+ int *value);
+static const char *text_format_parse_format(const char *start_ptr,
+ const char *end_ptr,
+ int *argpos, int *widthpos,
+ int *flags, int *width);
+static void text_format_string_conversion(StringInfo buf, char conversion,
+ FmgrInfo *typOutputInfo,
+ Datum value, bool isNull,
+ int flags, int width);
+static void text_format_append_string(StringInfo buf, const char *str,
+ int flags, int width);
+
+
+/*****************************************************************************
+ * CONVERSION ROUTINES EXPORTED FOR USE BY C CODE *
+ *****************************************************************************/
+
+/*
+ * cstring_to_text
+ *
+ * Create a text value from a null-terminated C string.
+ *
+ * The new text value is freshly palloc'd with a full-size VARHDR.
+ */
+text *
+cstring_to_text(const char *s)
+{
+ return cstring_to_text_with_len(s, strlen(s));
+}
+
+/*
+ * cstring_to_text_with_len
+ *
+ * Same as cstring_to_text except the caller specifies the string length;
+ * the string need not be null_terminated.
+ */
+text *
+cstring_to_text_with_len(const char *s, int len)
+{
+ text *result = (text *) palloc(len + VARHDRSZ);
+
+ SET_VARSIZE(result, len + VARHDRSZ);
+ memcpy(VARDATA(result), s, len);
+
+ return result;
+}
+
+/*
+ * text_to_cstring
+ *
+ * Create a palloc'd, null-terminated C string from a text value.
+ *
+ * We support being passed a compressed or toasted text value.
+ * This is a bit bogus since such values shouldn't really be referred to as
+ * "text *", but it seems useful for robustness. If we didn't handle that
+ * case here, we'd need another routine that did, anyway.
+ */
+char *
+text_to_cstring(const text *t)
+{
+ /* must cast away the const, unfortunately */
+ text *tunpacked = pg_detoast_datum_packed(unconstify(text *, t));
+ int len = VARSIZE_ANY_EXHDR(tunpacked);
+ char *result;
+
+ result = (char *) palloc(len + 1);
+ memcpy(result, VARDATA_ANY(tunpacked), len);
+ result[len] = '\0';
+
+ if (tunpacked != t)
+ pfree(tunpacked);
+
+ return result;
+}
+
+/*
+ * text_to_cstring_buffer
+ *
+ * Copy a text value into a caller-supplied buffer of size dst_len.
+ *
+ * The text string is truncated if necessary to fit. The result is
+ * guaranteed null-terminated (unless dst_len == 0).
+ *
+ * We support being passed a compressed or toasted text value.
+ * This is a bit bogus since such values shouldn't really be referred to as
+ * "text *", but it seems useful for robustness. If we didn't handle that
+ * case here, we'd need another routine that did, anyway.
+ */
+void
+text_to_cstring_buffer(const text *src, char *dst, size_t dst_len)
+{
+ /* must cast away the const, unfortunately */
+ text *srcunpacked = pg_detoast_datum_packed(unconstify(text *, src));
+ size_t src_len = VARSIZE_ANY_EXHDR(srcunpacked);
+
+ if (dst_len > 0)
+ {
+ dst_len--;
+ if (dst_len >= src_len)
+ dst_len = src_len;
+ else /* ensure truncation is encoding-safe */
+ dst_len = pg_mbcliplen(VARDATA_ANY(srcunpacked), src_len, dst_len);
+ memcpy(dst, VARDATA_ANY(srcunpacked), dst_len);
+ dst[dst_len] = '\0';
+ }
+
+ if (srcunpacked != src)
+ pfree(srcunpacked);
+}
+
+
+/*****************************************************************************
+ * USER I/O ROUTINES *
+ *****************************************************************************/
+
+
+#define VAL(CH) ((CH) - '0')
+#define DIG(VAL) ((VAL) + '0')
+
+/*
+ * byteain - converts from printable representation of byte array
+ *
+ * Non-printable characters must be passed as '\nnn' (octal) and are
+ * converted to internal form. '\' must be passed as '\\'.
+ * ereport(ERROR, ...) if bad form.
+ *
+ * BUGS:
+ * The input is scanned twice.
+ * The error checking of input is minimal.
+ */
+Datum
+byteain(PG_FUNCTION_ARGS)
+{
+ char *inputText = PG_GETARG_CSTRING(0);
+ char *tp;
+ char *rp;
+ int bc;
+ bytea *result;
+
+ /* Recognize hex input */
+ if (inputText[0] == '\\' && inputText[1] == 'x')
+ {
+ size_t len = strlen(inputText);
+
+ bc = (len - 2) / 2 + VARHDRSZ; /* maximum possible length */
+ result = palloc(bc);
+ bc = hex_decode(inputText + 2, len - 2, VARDATA(result));
+ SET_VARSIZE(result, bc + VARHDRSZ); /* actual length */
+
+ PG_RETURN_BYTEA_P(result);
+ }
+
+ /* Else, it's the traditional escaped style */
+ for (bc = 0, tp = inputText; *tp != '\0'; bc++)
+ {
+ if (tp[0] != '\\')
+ tp++;
+ else if ((tp[0] == '\\') &&
+ (tp[1] >= '0' && tp[1] <= '3') &&
+ (tp[2] >= '0' && tp[2] <= '7') &&
+ (tp[3] >= '0' && tp[3] <= '7'))
+ tp += 4;
+ else if ((tp[0] == '\\') &&
+ (tp[1] == '\\'))
+ tp += 2;
+ else
+ {
+ /*
+ * one backslash, not followed by another or ### valid octal
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "bytea")));
+ }
+ }
+
+ bc += VARHDRSZ;
+
+ result = (bytea *) palloc(bc);
+ SET_VARSIZE(result, bc);
+
+ tp = inputText;
+ rp = VARDATA(result);
+ while (*tp != '\0')
+ {
+ if (tp[0] != '\\')
+ *rp++ = *tp++;
+ else if ((tp[0] == '\\') &&
+ (tp[1] >= '0' && tp[1] <= '3') &&
+ (tp[2] >= '0' && tp[2] <= '7') &&
+ (tp[3] >= '0' && tp[3] <= '7'))
+ {
+ bc = VAL(tp[1]);
+ bc <<= 3;
+ bc += VAL(tp[2]);
+ bc <<= 3;
+ *rp++ = bc + VAL(tp[3]);
+
+ tp += 4;
+ }
+ else if ((tp[0] == '\\') &&
+ (tp[1] == '\\'))
+ {
+ *rp++ = '\\';
+ tp += 2;
+ }
+ else
+ {
+ /*
+ * We should never get here. The first pass should not allow it.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s", "bytea")));
+ }
+ }
+
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * byteaout - converts to printable representation of byte array
+ *
+ * In the traditional escaped format, non-printable characters are
+ * printed as '\nnn' (octal) and '\' as '\\'.
+ */
+Datum
+byteaout(PG_FUNCTION_ARGS)
+{
+ bytea *vlena = PG_GETARG_BYTEA_PP(0);
+ char *result;
+ char *rp;
+
+ if (bytea_output == BYTEA_OUTPUT_HEX)
+ {
+ /* Print hex format */
+ rp = result = palloc(VARSIZE_ANY_EXHDR(vlena) * 2 + 2 + 1);
+ *rp++ = '\\';
+ *rp++ = 'x';
+ rp += hex_encode(VARDATA_ANY(vlena), VARSIZE_ANY_EXHDR(vlena), rp);
+ }
+ else if (bytea_output == BYTEA_OUTPUT_ESCAPE)
+ {
+ /* Print traditional escaped format */
+ char *vp;
+ uint64 len;
+ int i;
+
+ len = 1; /* empty string has 1 char */
+ vp = VARDATA_ANY(vlena);
+ for (i = VARSIZE_ANY_EXHDR(vlena); i != 0; i--, vp++)
+ {
+ if (*vp == '\\')
+ len += 2;
+ else if ((unsigned char) *vp < 0x20 || (unsigned char) *vp > 0x7e)
+ len += 4;
+ else
+ len++;
+ }
+
+ /*
+ * In principle len can't overflow uint32 if the input fit in 1GB, but
+ * for safety let's check rather than relying on palloc's internal
+ * check.
+ */
+ if (len > MaxAllocSize)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg_internal("result of bytea output conversion is too large")));
+ rp = result = (char *) palloc(len);
+
+ vp = VARDATA_ANY(vlena);
+ for (i = VARSIZE_ANY_EXHDR(vlena); i != 0; i--, vp++)
+ {
+ if (*vp == '\\')
+ {
+ *rp++ = '\\';
+ *rp++ = '\\';
+ }
+ else if ((unsigned char) *vp < 0x20 || (unsigned char) *vp > 0x7e)
+ {
+ int val; /* holds unprintable chars */
+
+ val = *vp;
+ rp[0] = '\\';
+ rp[3] = DIG(val & 07);
+ val >>= 3;
+ rp[2] = DIG(val & 07);
+ val >>= 3;
+ rp[1] = DIG(val & 03);
+ rp += 4;
+ }
+ else
+ *rp++ = *vp;
+ }
+ }
+ else
+ {
+ elog(ERROR, "unrecognized bytea_output setting: %d",
+ bytea_output);
+ rp = result = NULL; /* keep compiler quiet */
+ }
+ *rp = '\0';
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * bytearecv - converts external binary format to bytea
+ */
+Datum
+bytearecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ bytea *result;
+ int nbytes;
+
+ nbytes = buf->len - buf->cursor;
+ result = (bytea *) palloc(nbytes + VARHDRSZ);
+ SET_VARSIZE(result, nbytes + VARHDRSZ);
+ pq_copymsgbytes(buf, VARDATA(result), nbytes);
+ PG_RETURN_BYTEA_P(result);
+}
+
+/*
+ * byteasend - converts bytea to binary format
+ *
+ * This is a special case: just copy the input...
+ */
+Datum
+byteasend(PG_FUNCTION_ARGS)
+{
+ bytea *vlena = PG_GETARG_BYTEA_P_COPY(0);
+
+ PG_RETURN_BYTEA_P(vlena);
+}
+
+Datum
+bytea_string_agg_transfn(PG_FUNCTION_ARGS)
+{
+ StringInfo state;
+
+ state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
+
+ /* Append the value unless null. */
+ if (!PG_ARGISNULL(1))
+ {
+ bytea *value = PG_GETARG_BYTEA_PP(1);
+
+ /* On the first time through, we ignore the delimiter. */
+ if (state == NULL)
+ state = makeStringAggState(fcinfo);
+ else if (!PG_ARGISNULL(2))
+ {
+ bytea *delim = PG_GETARG_BYTEA_PP(2);
+
+ appendBinaryStringInfo(state, VARDATA_ANY(delim), VARSIZE_ANY_EXHDR(delim));
+ }
+
+ appendBinaryStringInfo(state, VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value));
+ }
+
+ /*
+ * The transition type for string_agg() is declared to be "internal",
+ * which is a pass-by-value type the same size as a pointer.
+ */
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+bytea_string_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ StringInfo state;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
+
+ if (state != NULL)
+ {
+ bytea *result;
+
+ result = (bytea *) palloc(state->len + VARHDRSZ);
+ SET_VARSIZE(result, state->len + VARHDRSZ);
+ memcpy(VARDATA(result), state->data, state->len);
+ PG_RETURN_BYTEA_P(result);
+ }
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * textin - converts "..." to internal representation
+ */
+Datum
+textin(PG_FUNCTION_ARGS)
+{
+ char *inputText = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_TEXT_P(cstring_to_text(inputText));
+}
+
+/*
+ * textout - converts internal representation to "..."
+ */
+Datum
+textout(PG_FUNCTION_ARGS)
+{
+ Datum txt = PG_GETARG_DATUM(0);
+
+ PG_RETURN_CSTRING(TextDatumGetCString(txt));
+}
+
+/*
+ * textrecv - converts external binary format to text
+ */
+Datum
+textrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ text *result;
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+
+ result = cstring_to_text_with_len(str, nbytes);
+ pfree(str);
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * textsend - converts text to binary format
+ */
+Datum
+textsend(PG_FUNCTION_ARGS)
+{
+ text *t = PG_GETARG_TEXT_PP(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, VARDATA_ANY(t), VARSIZE_ANY_EXHDR(t));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * unknownin - converts "..." to internal representation
+ */
+Datum
+unknownin(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ /* representation is same as cstring */
+ PG_RETURN_CSTRING(pstrdup(str));
+}
+
+/*
+ * unknownout - converts internal representation to "..."
+ */
+Datum
+unknownout(PG_FUNCTION_ARGS)
+{
+ /* representation is same as cstring */
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_CSTRING(pstrdup(str));
+}
+
+/*
+ * unknownrecv - converts external binary format to unknown
+ */
+Datum
+unknownrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ char *str;
+ int nbytes;
+
+ str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
+ /* representation is same as cstring */
+ PG_RETURN_CSTRING(str);
+}
+
+/*
+ * unknownsend - converts unknown to binary format
+ */
+Datum
+unknownsend(PG_FUNCTION_ARGS)
+{
+ /* representation is same as cstring */
+ char *str = PG_GETARG_CSTRING(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, str, strlen(str));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/* ========== PUBLIC ROUTINES ========== */
+
+/*
+ * textlen -
+ * returns the logical length of a text*
+ * (which is less than the VARSIZE of the text*)
+ */
+Datum
+textlen(PG_FUNCTION_ARGS)
+{
+ Datum str = PG_GETARG_DATUM(0);
+
+ /* try to avoid decompressing argument */
+ PG_RETURN_INT32(text_length(str));
+}
+
+/*
+ * text_length -
+ * Does the real work for textlen()
+ *
+ * This is broken out so it can be called directly by other string processing
+ * functions. Note that the argument is passed as a Datum, to indicate that
+ * it may still be in compressed form. We can avoid decompressing it at all
+ * in some cases.
+ */
+static int32
+text_length(Datum str)
+{
+ /* fastpath when max encoding length is one */
+ if (pg_database_encoding_max_length() == 1)
+ PG_RETURN_INT32(toast_raw_datum_size(str) - VARHDRSZ);
+ else
+ {
+ text *t = DatumGetTextPP(str);
+
+ PG_RETURN_INT32(pg_mbstrlen_with_len(VARDATA_ANY(t),
+ VARSIZE_ANY_EXHDR(t)));
+ }
+}
+
+/*
+ * textoctetlen -
+ * returns the physical length of a text*
+ * (which is less than the VARSIZE of the text*)
+ */
+Datum
+textoctetlen(PG_FUNCTION_ARGS)
+{
+ Datum str = PG_GETARG_DATUM(0);
+
+ /* We need not detoast the input at all */
+ PG_RETURN_INT32(toast_raw_datum_size(str) - VARHDRSZ);
+}
+
+/*
+ * textcat -
+ * takes two text* and returns a text* that is the concatenation of
+ * the two.
+ *
+ * Rewritten by Sapa, sapa@hq.icb.chel.su. 8-Jul-96.
+ * Updated by Thomas, Thomas.Lockhart@jpl.nasa.gov 1997-07-10.
+ * Allocate space for output in all cases.
+ * XXX - thomas 1997-07-10
+ */
+Datum
+textcat(PG_FUNCTION_ARGS)
+{
+ text *t1 = PG_GETARG_TEXT_PP(0);
+ text *t2 = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_TEXT_P(text_catenate(t1, t2));
+}
+
+/*
+ * text_catenate
+ * Guts of textcat(), broken out so it can be used by other functions
+ *
+ * Arguments can be in short-header form, but not compressed or out-of-line
+ */
+static text *
+text_catenate(text *t1, text *t2)
+{
+ text *result;
+ int len1,
+ len2,
+ len;
+ char *ptr;
+
+ len1 = VARSIZE_ANY_EXHDR(t1);
+ len2 = VARSIZE_ANY_EXHDR(t2);
+
+ /* paranoia ... probably should throw error instead? */
+ if (len1 < 0)
+ len1 = 0;
+ if (len2 < 0)
+ len2 = 0;
+
+ len = len1 + len2 + VARHDRSZ;
+ result = (text *) palloc(len);
+
+ /* Set size of result string... */
+ SET_VARSIZE(result, len);
+
+ /* Fill data field of result string... */
+ ptr = VARDATA(result);
+ if (len1 > 0)
+ memcpy(ptr, VARDATA_ANY(t1), len1);
+ if (len2 > 0)
+ memcpy(ptr + len1, VARDATA_ANY(t2), len2);
+
+ return result;
+}
+
+/*
+ * charlen_to_bytelen()
+ * Compute the number of bytes occupied by n characters starting at *p
+ *
+ * It is caller's responsibility that there actually are n characters;
+ * the string need not be null-terminated.
+ */
+static int
+charlen_to_bytelen(const char *p, int n)
+{
+ if (pg_database_encoding_max_length() == 1)
+ {
+ /* Optimization for single-byte encodings */
+ return n;
+ }
+ else
+ {
+ const char *s;
+
+ for (s = p; n > 0; n--)
+ s += pg_mblen(s);
+
+ return s - p;
+ }
+}
+
+/*
+ * text_substr()
+ * Return a substring starting at the specified position.
+ * - thomas 1997-12-31
+ *
+ * Input:
+ * - string
+ * - starting position (is one-based)
+ * - string length
+ *
+ * If the starting position is zero or less, then return from the start of the string
+ * adjusting the length to be consistent with the "negative start" per SQL.
+ * If the length is less than zero, return the remaining string.
+ *
+ * Added multibyte support.
+ * - Tatsuo Ishii 1998-4-21
+ * Changed behavior if starting position is less than one to conform to SQL behavior.
+ * Formerly returned the entire string; now returns a portion.
+ * - Thomas Lockhart 1998-12-10
+ * Now uses faster TOAST-slicing interface
+ * - John Gray 2002-02-22
+ * Remove "#ifdef MULTIBYTE" and test for encoding_max_length instead. Change
+ * behaviors conflicting with SQL to meet SQL (if E = S + L < S throw
+ * error; if E < 1, return '', not entire string). Fixed MB related bug when
+ * S > LC and < LC + 4 sometimes garbage characters are returned.
+ * - Joe Conway 2002-08-10
+ */
+Datum
+text_substr(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TEXT_P(text_substring(PG_GETARG_DATUM(0),
+ PG_GETARG_INT32(1),
+ PG_GETARG_INT32(2),
+ false));
+}
+
+/*
+ * text_substr_no_len -
+ * Wrapper to avoid opr_sanity failure due to
+ * one function accepting a different number of args.
+ */
+Datum
+text_substr_no_len(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TEXT_P(text_substring(PG_GETARG_DATUM(0),
+ PG_GETARG_INT32(1),
+ -1, true));
+}
+
+/*
+ * text_substring -
+ * Does the real work for text_substr() and text_substr_no_len()
+ *
+ * This is broken out so it can be called directly by other string processing
+ * functions. Note that the argument is passed as a Datum, to indicate that
+ * it may still be in compressed/toasted form. We can avoid detoasting all
+ * of it in some cases.
+ *
+ * The result is always a freshly palloc'd datum.
+ */
+static text *
+text_substring(Datum str, int32 start, int32 length, bool length_not_specified)
+{
+ int32 eml = pg_database_encoding_max_length();
+ int32 S = start; /* start position */
+ int32 S1; /* adjusted start position */
+ int32 L1; /* adjusted substring length */
+ int32 E; /* end position */
+
+ /*
+ * SQL99 says S can be zero or negative, but we still must fetch from the
+ * start of the string.
+ */
+ S1 = Max(S, 1);
+
+ /* life is easy if the encoding max length is 1 */
+ if (eml == 1)
+ {
+ if (length_not_specified) /* special case - get length to end of
+ * string */
+ L1 = -1;
+ else if (length < 0)
+ {
+ /* SQL99 says to throw an error for E < S, i.e., negative length */
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ L1 = -1; /* silence stupider compilers */
+ }
+ else if (pg_add_s32_overflow(S, length, &E))
+ {
+ /*
+ * L could be large enough for S + L to overflow, in which case
+ * the substring must run to end of string.
+ */
+ L1 = -1;
+ }
+ else
+ {
+ /*
+ * A zero or negative value for the end position can happen if the
+ * start was negative or one. SQL99 says to return a zero-length
+ * string.
+ */
+ if (E < 1)
+ return cstring_to_text("");
+
+ L1 = E - S1;
+ }
+
+ /*
+ * If the start position is past the end of the string, SQL99 says to
+ * return a zero-length string -- DatumGetTextPSlice() will do that
+ * for us. We need only convert S1 to zero-based starting position.
+ */
+ return DatumGetTextPSlice(str, S1 - 1, L1);
+ }
+ else if (eml > 1)
+ {
+ /*
+ * When encoding max length is > 1, we can't get LC without
+ * detoasting, so we'll grab a conservatively large slice now and go
+ * back later to do the right thing
+ */
+ int32 slice_start;
+ int32 slice_size;
+ int32 slice_strlen;
+ text *slice;
+ int32 E1;
+ int32 i;
+ char *p;
+ char *s;
+ text *ret;
+
+ /*
+ * We need to start at position zero because there is no way to know
+ * in advance which byte offset corresponds to the supplied start
+ * position.
+ */
+ slice_start = 0;
+
+ if (length_not_specified) /* special case - get length to end of
+ * string */
+ slice_size = L1 = -1;
+ else if (length < 0)
+ {
+ /* SQL99 says to throw an error for E < S, i.e., negative length */
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ slice_size = L1 = -1; /* silence stupider compilers */
+ }
+ else if (pg_add_s32_overflow(S, length, &E))
+ {
+ /*
+ * L could be large enough for S + L to overflow, in which case
+ * the substring must run to end of string.
+ */
+ slice_size = L1 = -1;
+ }
+ else
+ {
+ /*
+ * A zero or negative value for the end position can happen if the
+ * start was negative or one. SQL99 says to return a zero-length
+ * string.
+ */
+ if (E < 1)
+ return cstring_to_text("");
+
+ /*
+ * if E is past the end of the string, the tuple toaster will
+ * truncate the length for us
+ */
+ L1 = E - S1;
+
+ /*
+ * Total slice size in bytes can't be any longer than the start
+ * position plus substring length times the encoding max length.
+ * If that overflows, we can just use -1.
+ */
+ if (pg_mul_s32_overflow(E, eml, &slice_size))
+ slice_size = -1;
+ }
+
+ /*
+ * If we're working with an untoasted source, no need to do an extra
+ * copying step.
+ */
+ if (VARATT_IS_COMPRESSED(DatumGetPointer(str)) ||
+ VARATT_IS_EXTERNAL(DatumGetPointer(str)))
+ slice = DatumGetTextPSlice(str, slice_start, slice_size);
+ else
+ slice = (text *) DatumGetPointer(str);
+
+ /* see if we got back an empty string */
+ if (VARSIZE_ANY_EXHDR(slice) == 0)
+ {
+ if (slice != (text *) DatumGetPointer(str))
+ pfree(slice);
+ return cstring_to_text("");
+ }
+
+ /* Now we can get the actual length of the slice in MB characters */
+ slice_strlen = pg_mbstrlen_with_len(VARDATA_ANY(slice),
+ VARSIZE_ANY_EXHDR(slice));
+
+ /*
+ * Check that the start position wasn't > slice_strlen. If so, SQL99
+ * says to return a zero-length string.
+ */
+ if (S1 > slice_strlen)
+ {
+ if (slice != (text *) DatumGetPointer(str))
+ pfree(slice);
+ return cstring_to_text("");
+ }
+
+ /*
+ * Adjust L1 and E1 now that we know the slice string length. Again
+ * remember that S1 is one based, and slice_start is zero based.
+ */
+ if (L1 > -1)
+ E1 = Min(S1 + L1, slice_start + 1 + slice_strlen);
+ else
+ E1 = slice_start + 1 + slice_strlen;
+
+ /*
+ * Find the start position in the slice; remember S1 is not zero based
+ */
+ p = VARDATA_ANY(slice);
+ for (i = 0; i < S1 - 1; i++)
+ p += pg_mblen(p);
+
+ /* hang onto a pointer to our start position */
+ s = p;
+
+ /*
+ * Count the actual bytes used by the substring of the requested
+ * length.
+ */
+ for (i = S1; i < E1; i++)
+ p += pg_mblen(p);
+
+ ret = (text *) palloc(VARHDRSZ + (p - s));
+ SET_VARSIZE(ret, VARHDRSZ + (p - s));
+ memcpy(VARDATA(ret), s, (p - s));
+
+ if (slice != (text *) DatumGetPointer(str))
+ pfree(slice);
+
+ return ret;
+ }
+ else
+ elog(ERROR, "invalid backend encoding: encoding max length < 1");
+
+ /* not reached: suppress compiler warning */
+ return NULL;
+}
+
+/*
+ * textoverlay
+ * Replace specified substring of first string with second
+ *
+ * The SQL standard defines OVERLAY() in terms of substring and concatenation.
+ * This code is a direct implementation of what the standard says.
+ */
+Datum
+textoverlay(PG_FUNCTION_ARGS)
+{
+ text *t1 = PG_GETARG_TEXT_PP(0);
+ text *t2 = PG_GETARG_TEXT_PP(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl = PG_GETARG_INT32(3); /* substring length */
+
+ PG_RETURN_TEXT_P(text_overlay(t1, t2, sp, sl));
+}
+
+Datum
+textoverlay_no_len(PG_FUNCTION_ARGS)
+{
+ text *t1 = PG_GETARG_TEXT_PP(0);
+ text *t2 = PG_GETARG_TEXT_PP(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl;
+
+ sl = text_length(PointerGetDatum(t2)); /* defaults to length(t2) */
+ PG_RETURN_TEXT_P(text_overlay(t1, t2, sp, sl));
+}
+
+static text *
+text_overlay(text *t1, text *t2, int sp, int sl)
+{
+ text *result;
+ text *s1;
+ text *s2;
+ int sp_pl_sl;
+
+ /*
+ * Check for possible integer-overflow cases. For negative sp, throw a
+ * "substring length" error because that's what should be expected
+ * according to the spec's definition of OVERLAY().
+ */
+ if (sp <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ if (pg_add_s32_overflow(sp, sl, &sp_pl_sl))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ s1 = text_substring(PointerGetDatum(t1), 1, sp - 1, false);
+ s2 = text_substring(PointerGetDatum(t1), sp_pl_sl, -1, true);
+ result = text_catenate(s1, t2);
+ result = text_catenate(result, s2);
+
+ return result;
+}
+
+/*
+ * textpos -
+ * Return the position of the specified substring.
+ * Implements the SQL POSITION() function.
+ * Ref: A Guide To The SQL Standard, Date & Darwen, 1997
+ * - thomas 1997-07-27
+ */
+Datum
+textpos(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ text *search_str = PG_GETARG_TEXT_PP(1);
+
+ PG_RETURN_INT32((int32) text_position(str, search_str, PG_GET_COLLATION()));
+}
+
+/*
+ * text_position -
+ * Does the real work for textpos()
+ *
+ * Inputs:
+ * t1 - string to be searched
+ * t2 - pattern to match within t1
+ * Result:
+ * Character index of the first matched char, starting from 1,
+ * or 0 if no match.
+ *
+ * This is broken out so it can be called directly by other string processing
+ * functions.
+ */
+static int
+text_position(text *t1, text *t2, Oid collid)
+{
+ TextPositionState state;
+ int result;
+
+ /* Empty needle always matches at position 1 */
+ if (VARSIZE_ANY_EXHDR(t2) < 1)
+ return 1;
+
+ /* Otherwise, can't match if haystack is shorter than needle */
+ if (VARSIZE_ANY_EXHDR(t1) < VARSIZE_ANY_EXHDR(t2))
+ return 0;
+
+ text_position_setup(t1, t2, collid, &state);
+ if (!text_position_next(&state))
+ result = 0;
+ else
+ result = text_position_get_match_pos(&state);
+ text_position_cleanup(&state);
+ return result;
+}
+
+
+/*
+ * text_position_setup, text_position_next, text_position_cleanup -
+ * Component steps of text_position()
+ *
+ * These are broken out so that a string can be efficiently searched for
+ * multiple occurrences of the same pattern. text_position_next may be
+ * called multiple times, and it advances to the next match on each call.
+ * text_position_get_match_ptr() and text_position_get_match_pos() return
+ * a pointer or 1-based character position of the last match, respectively.
+ *
+ * The "state" variable is normally just a local variable in the caller.
+ *
+ * NOTE: text_position_next skips over the matched portion. For example,
+ * searching for "xx" in "xxx" returns only one match, not two.
+ */
+
+static void
+text_position_setup(text *t1, text *t2, Oid collid, TextPositionState *state)
+{
+ int len1 = VARSIZE_ANY_EXHDR(t1);
+ int len2 = VARSIZE_ANY_EXHDR(t2);
+ pg_locale_t mylocale = 0;
+
+ check_collation_set(collid);
+
+ if (!lc_collate_is_c(collid))
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (mylocale && !mylocale->deterministic)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("nondeterministic collations are not supported for substring searches")));
+
+ Assert(len1 > 0);
+ Assert(len2 > 0);
+
+ /*
+ * Even with a multi-byte encoding, we perform the search using the raw
+ * byte sequence, ignoring multibyte issues. For UTF-8, that works fine,
+ * because in UTF-8 the byte sequence of one character cannot contain
+ * another character. For other multi-byte encodings, we do the search
+ * initially as a simple byte search, ignoring multibyte issues, but
+ * verify afterwards that the match we found is at a character boundary,
+ * and continue the search if it was a false match.
+ */
+ if (pg_database_encoding_max_length() == 1)
+ state->is_multibyte_char_in_char = false;
+ else if (GetDatabaseEncoding() == PG_UTF8)
+ state->is_multibyte_char_in_char = false;
+ else
+ state->is_multibyte_char_in_char = true;
+
+ state->str1 = VARDATA_ANY(t1);
+ state->str2 = VARDATA_ANY(t2);
+ state->len1 = len1;
+ state->len2 = len2;
+ state->last_match = NULL;
+ state->refpoint = state->str1;
+ state->refpos = 0;
+
+ /*
+ * Prepare the skip table for Boyer-Moore-Horspool searching. In these
+ * notes we use the terminology that the "haystack" is the string to be
+ * searched (t1) and the "needle" is the pattern being sought (t2).
+ *
+ * If the needle is empty or bigger than the haystack then there is no
+ * point in wasting cycles initializing the table. We also choose not to
+ * use B-M-H for needles of length 1, since the skip table can't possibly
+ * save anything in that case.
+ */
+ if (len1 >= len2 && len2 > 1)
+ {
+ int searchlength = len1 - len2;
+ int skiptablemask;
+ int last;
+ int i;
+ const char *str2 = state->str2;
+
+ /*
+ * First we must determine how much of the skip table to use. The
+ * declaration of TextPositionState allows up to 256 elements, but for
+ * short search problems we don't really want to have to initialize so
+ * many elements --- it would take too long in comparison to the
+ * actual search time. So we choose a useful skip table size based on
+ * the haystack length minus the needle length. The closer the needle
+ * length is to the haystack length the less useful skipping becomes.
+ *
+ * Note: since we use bit-masking to select table elements, the skip
+ * table size MUST be a power of 2, and so the mask must be 2^N-1.
+ */
+ if (searchlength < 16)
+ skiptablemask = 3;
+ else if (searchlength < 64)
+ skiptablemask = 7;
+ else if (searchlength < 128)
+ skiptablemask = 15;
+ else if (searchlength < 512)
+ skiptablemask = 31;
+ else if (searchlength < 2048)
+ skiptablemask = 63;
+ else if (searchlength < 4096)
+ skiptablemask = 127;
+ else
+ skiptablemask = 255;
+ state->skiptablemask = skiptablemask;
+
+ /*
+ * Initialize the skip table. We set all elements to the needle
+ * length, since this is the correct skip distance for any character
+ * not found in the needle.
+ */
+ for (i = 0; i <= skiptablemask; i++)
+ state->skiptable[i] = len2;
+
+ /*
+ * Now examine the needle. For each character except the last one,
+ * set the corresponding table element to the appropriate skip
+ * distance. Note that when two characters share the same skip table
+ * entry, the one later in the needle must determine the skip
+ * distance.
+ */
+ last = len2 - 1;
+
+ for (i = 0; i < last; i++)
+ state->skiptable[(unsigned char) str2[i] & skiptablemask] = last - i;
+ }
+}
+
+/*
+ * Advance to the next match, starting from the end of the previous match
+ * (or the beginning of the string, on first call). Returns true if a match
+ * is found.
+ *
+ * Note that this refuses to match an empty-string needle. Most callers
+ * will have handled that case specially and we'll never see it here.
+ */
+static bool
+text_position_next(TextPositionState *state)
+{
+ int needle_len = state->len2;
+ char *start_ptr;
+ char *matchptr;
+
+ if (needle_len <= 0)
+ return false; /* result for empty pattern */
+
+ /* Start from the point right after the previous match. */
+ if (state->last_match)
+ start_ptr = state->last_match + needle_len;
+ else
+ start_ptr = state->str1;
+
+retry:
+ matchptr = text_position_next_internal(start_ptr, state);
+
+ if (!matchptr)
+ return false;
+
+ /*
+ * Found a match for the byte sequence. If this is a multibyte encoding,
+ * where one character's byte sequence can appear inside a longer
+ * multi-byte character, we need to verify that the match was at a
+ * character boundary, not in the middle of a multi-byte character.
+ */
+ if (state->is_multibyte_char_in_char)
+ {
+ /* Walk one character at a time, until we reach the match. */
+
+ /* the search should never move backwards. */
+ Assert(state->refpoint <= matchptr);
+
+ while (state->refpoint < matchptr)
+ {
+ /* step to next character. */
+ state->refpoint += pg_mblen(state->refpoint);
+ state->refpos++;
+
+ /*
+ * If we stepped over the match's start position, then it was a
+ * false positive, where the byte sequence appeared in the middle
+ * of a multi-byte character. Skip it, and continue the search at
+ * the next character boundary.
+ */
+ if (state->refpoint > matchptr)
+ {
+ start_ptr = state->refpoint;
+ goto retry;
+ }
+ }
+ }
+
+ state->last_match = matchptr;
+ return true;
+}
+
+/*
+ * Subroutine of text_position_next(). This searches for the raw byte
+ * sequence, ignoring any multi-byte encoding issues. Returns the first
+ * match starting at 'start_ptr', or NULL if no match is found.
+ */
+static char *
+text_position_next_internal(char *start_ptr, TextPositionState *state)
+{
+ int haystack_len = state->len1;
+ int needle_len = state->len2;
+ int skiptablemask = state->skiptablemask;
+ const char *haystack = state->str1;
+ const char *needle = state->str2;
+ const char *haystack_end = &haystack[haystack_len];
+ const char *hptr;
+
+ Assert(start_ptr >= haystack && start_ptr <= haystack_end);
+
+ if (needle_len == 1)
+ {
+ /* No point in using B-M-H for a one-character needle */
+ char nchar = *needle;
+
+ hptr = start_ptr;
+ while (hptr < haystack_end)
+ {
+ if (*hptr == nchar)
+ return (char *) hptr;
+ hptr++;
+ }
+ }
+ else
+ {
+ const char *needle_last = &needle[needle_len - 1];
+
+ /* Start at startpos plus the length of the needle */
+ hptr = start_ptr + needle_len - 1;
+ while (hptr < haystack_end)
+ {
+ /* Match the needle scanning *backward* */
+ const char *nptr;
+ const char *p;
+
+ nptr = needle_last;
+ p = hptr;
+ while (*nptr == *p)
+ {
+ /* Matched it all? If so, return 1-based position */
+ if (nptr == needle)
+ return (char *) p;
+ nptr--, p--;
+ }
+
+ /*
+ * No match, so use the haystack char at hptr to decide how far to
+ * advance. If the needle had any occurrence of that character
+ * (or more precisely, one sharing the same skiptable entry)
+ * before its last character, then we advance far enough to align
+ * the last such needle character with that haystack position.
+ * Otherwise we can advance by the whole needle length.
+ */
+ hptr += state->skiptable[(unsigned char) *hptr & skiptablemask];
+ }
+ }
+
+ return 0; /* not found */
+}
+
+/*
+ * Return a pointer to the current match.
+ *
+ * The returned pointer points into the original haystack string.
+ */
+static char *
+text_position_get_match_ptr(TextPositionState *state)
+{
+ return state->last_match;
+}
+
+/*
+ * Return the offset of the current match.
+ *
+ * The offset is in characters, 1-based.
+ */
+static int
+text_position_get_match_pos(TextPositionState *state)
+{
+ /* Convert the byte position to char position. */
+ state->refpos += pg_mbstrlen_with_len(state->refpoint,
+ state->last_match - state->refpoint);
+ state->refpoint = state->last_match;
+ return state->refpos + 1;
+}
+
+/*
+ * Reset search state to the initial state installed by text_position_setup.
+ *
+ * The next call to text_position_next will search from the beginning
+ * of the string.
+ */
+static void
+text_position_reset(TextPositionState *state)
+{
+ state->last_match = NULL;
+ state->refpoint = state->str1;
+ state->refpos = 0;
+}
+
+static void
+text_position_cleanup(TextPositionState *state)
+{
+ /* no cleanup needed */
+}
+
+
+static void
+check_collation_set(Oid collid)
+{
+ if (!OidIsValid(collid))
+ {
+ /*
+ * This typically means that the parser could not resolve a conflict
+ * of implicit collations, so report it that way.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_INDETERMINATE_COLLATION),
+ errmsg("could not determine which collation to use for string comparison"),
+ errhint("Use the COLLATE clause to set the collation explicitly.")));
+ }
+}
+
+/* varstr_cmp()
+ * Comparison function for text strings with given lengths.
+ * Includes locale support, but must copy strings to temporary memory
+ * to allow null-termination for inputs to strcoll().
+ * Returns an integer less than, equal to, or greater than zero, indicating
+ * whether arg1 is less than, equal to, or greater than arg2.
+ *
+ * Note: many functions that depend on this are marked leakproof; therefore,
+ * avoid reporting the actual contents of the input when throwing errors.
+ * All errors herein should be things that can't happen except on corrupt
+ * data, anyway; otherwise we will have trouble with indexing strings that
+ * would cause them.
+ */
+int
+varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)
+{
+ int result;
+
+ check_collation_set(collid);
+
+ /*
+ * Unfortunately, there is no strncoll(), so in the non-C locale case we
+ * have to do some memory copying. This turns out to be significantly
+ * slower, so we optimize the case where LC_COLLATE is C. We also try to
+ * optimize relatively-short strings by avoiding palloc/pfree overhead.
+ */
+ if (lc_collate_is_c(collid))
+ {
+ result = memcmp(arg1, arg2, Min(len1, len2));
+ if ((result == 0) && (len1 != len2))
+ result = (len1 < len2) ? -1 : 1;
+ }
+ else
+ {
+ char a1buf[TEXTBUFLEN];
+ char a2buf[TEXTBUFLEN];
+ char *a1p,
+ *a2p;
+ pg_locale_t mylocale;
+
+ mylocale = pg_newlocale_from_collation(collid);
+
+ /*
+ * memcmp() can't tell us which of two unequal strings sorts first,
+ * but it's a cheap way to tell if they're equal. Testing shows that
+ * memcmp() followed by strcoll() is only trivially slower than
+ * strcoll() by itself, so we don't lose much if this doesn't work out
+ * very often, and if it does - for example, because there are many
+ * equal strings in the input - then we win big by avoiding expensive
+ * collation-aware comparisons.
+ */
+ if (len1 == len2 && memcmp(arg1, arg2, len1) == 0)
+ return 0;
+
+#ifdef WIN32
+ /* Win32 does not have UTF-8, so we need to map to UTF-16 */
+ if (GetDatabaseEncoding() == PG_UTF8
+ && (!mylocale || mylocale->provider == COLLPROVIDER_LIBC))
+ {
+ int a1len;
+ int a2len;
+ int r;
+
+ if (len1 >= TEXTBUFLEN / 2)
+ {
+ a1len = len1 * 2 + 2;
+ a1p = palloc(a1len);
+ }
+ else
+ {
+ a1len = TEXTBUFLEN;
+ a1p = a1buf;
+ }
+ if (len2 >= TEXTBUFLEN / 2)
+ {
+ a2len = len2 * 2 + 2;
+ a2p = palloc(a2len);
+ }
+ else
+ {
+ a2len = TEXTBUFLEN;
+ a2p = a2buf;
+ }
+
+ /* stupid Microsloth API does not work for zero-length input */
+ if (len1 == 0)
+ r = 0;
+ else
+ {
+ r = MultiByteToWideChar(CP_UTF8, 0, arg1, len1,
+ (LPWSTR) a1p, a1len / 2);
+ if (!r)
+ ereport(ERROR,
+ (errmsg("could not convert string to UTF-16: error code %lu",
+ GetLastError())));
+ }
+ ((LPWSTR) a1p)[r] = 0;
+
+ if (len2 == 0)
+ r = 0;
+ else
+ {
+ r = MultiByteToWideChar(CP_UTF8, 0, arg2, len2,
+ (LPWSTR) a2p, a2len / 2);
+ if (!r)
+ ereport(ERROR,
+ (errmsg("could not convert string to UTF-16: error code %lu",
+ GetLastError())));
+ }
+ ((LPWSTR) a2p)[r] = 0;
+
+ errno = 0;
+#ifdef HAVE_LOCALE_T
+ if (mylocale)
+ result = wcscoll_l((LPWSTR) a1p, (LPWSTR) a2p, mylocale->info.lt);
+ else
+#endif
+ result = wcscoll((LPWSTR) a1p, (LPWSTR) a2p);
+ if (result == 2147483647) /* _NLSCMPERROR; missing from mingw
+ * headers */
+ ereport(ERROR,
+ (errmsg("could not compare Unicode strings: %m")));
+
+ /* Break tie if necessary. */
+ if (result == 0 &&
+ (!mylocale || mylocale->deterministic))
+ {
+ result = memcmp(arg1, arg2, Min(len1, len2));
+ if ((result == 0) && (len1 != len2))
+ result = (len1 < len2) ? -1 : 1;
+ }
+
+ if (a1p != a1buf)
+ pfree(a1p);
+ if (a2p != a2buf)
+ pfree(a2p);
+
+ return result;
+ }
+#endif /* WIN32 */
+
+ if (len1 >= TEXTBUFLEN)
+ a1p = (char *) palloc(len1 + 1);
+ else
+ a1p = a1buf;
+ if (len2 >= TEXTBUFLEN)
+ a2p = (char *) palloc(len2 + 1);
+ else
+ a2p = a2buf;
+
+ memcpy(a1p, arg1, len1);
+ a1p[len1] = '\0';
+ memcpy(a2p, arg2, len2);
+ a2p[len2] = '\0';
+
+ if (mylocale)
+ {
+ if (mylocale->provider == COLLPROVIDER_ICU)
+ {
+#ifdef USE_ICU
+#ifdef HAVE_UCOL_STRCOLLUTF8
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+ result = ucol_strcollUTF8(mylocale->info.icu.ucol,
+ arg1, len1,
+ arg2, len2,
+ &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("collation failed: %s", u_errorName(status))));
+ }
+ else
+#endif
+ {
+ int32_t ulen1,
+ ulen2;
+ UChar *uchar1,
+ *uchar2;
+
+ ulen1 = icu_to_uchar(&uchar1, arg1, len1);
+ ulen2 = icu_to_uchar(&uchar2, arg2, len2);
+
+ result = ucol_strcoll(mylocale->info.icu.ucol,
+ uchar1, ulen1,
+ uchar2, ulen2);
+
+ pfree(uchar1);
+ pfree(uchar2);
+ }
+#else /* not USE_ICU */
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", mylocale->provider);
+#endif /* not USE_ICU */
+ }
+ else
+ {
+#ifdef HAVE_LOCALE_T
+ result = strcoll_l(a1p, a2p, mylocale->info.lt);
+#else
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", mylocale->provider);
+#endif
+ }
+ }
+ else
+ result = strcoll(a1p, a2p);
+
+ /* Break tie if necessary. */
+ if (result == 0 &&
+ (!mylocale || mylocale->deterministic))
+ result = strcmp(a1p, a2p);
+
+ if (a1p != a1buf)
+ pfree(a1p);
+ if (a2p != a2buf)
+ pfree(a2p);
+ }
+
+ return result;
+}
+
+/* text_cmp()
+ * Internal comparison function for text strings.
+ * Returns -1, 0 or 1
+ */
+static int
+text_cmp(text *arg1, text *arg2, Oid collid)
+{
+ char *a1p,
+ *a2p;
+ int len1,
+ len2;
+
+ a1p = VARDATA_ANY(arg1);
+ a2p = VARDATA_ANY(arg2);
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ return varstr_cmp(a1p, len1, a2p, len2, collid);
+}
+
+/*
+ * Comparison functions for text strings.
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ */
+
+Datum
+texteq(PG_FUNCTION_ARGS)
+{
+ Oid collid = PG_GET_COLLATION();
+ bool locale_is_c = false;
+ pg_locale_t mylocale = 0;
+ bool result;
+
+ check_collation_set(collid);
+
+ if (lc_collate_is_c(collid))
+ locale_is_c = true;
+ else
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (locale_is_c || !mylocale || mylocale->deterministic)
+ {
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ Size len1,
+ len2;
+
+ /*
+ * Since we only care about equality or not-equality, we can avoid all
+ * the expense of strcoll() here, and just do bitwise comparison. In
+ * fact, we don't even have to do a bitwise comparison if we can show
+ * the lengths of the strings are unequal; which might save us from
+ * having to detoast one or both values.
+ */
+ len1 = toast_raw_datum_size(arg1);
+ len2 = toast_raw_datum_size(arg2);
+ if (len1 != len2)
+ result = false;
+ else
+ {
+ text *targ1 = DatumGetTextPP(arg1);
+ text *targ2 = DatumGetTextPP(arg2);
+
+ result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
+ len1 - VARHDRSZ) == 0);
+
+ PG_FREE_IF_COPY(targ1, 0);
+ PG_FREE_IF_COPY(targ2, 1);
+ }
+ }
+ else
+ {
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+
+ result = (text_cmp(arg1, arg2, collid) == 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+textne(PG_FUNCTION_ARGS)
+{
+ Oid collid = PG_GET_COLLATION();
+ bool locale_is_c = false;
+ pg_locale_t mylocale = 0;
+ bool result;
+
+ check_collation_set(collid);
+
+ if (lc_collate_is_c(collid))
+ locale_is_c = true;
+ else
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (locale_is_c || !mylocale || mylocale->deterministic)
+ {
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ Size len1,
+ len2;
+
+ /* See comment in texteq() */
+ len1 = toast_raw_datum_size(arg1);
+ len2 = toast_raw_datum_size(arg2);
+ if (len1 != len2)
+ result = true;
+ else
+ {
+ text *targ1 = DatumGetTextPP(arg1);
+ text *targ2 = DatumGetTextPP(arg2);
+
+ result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
+ len1 - VARHDRSZ) != 0);
+
+ PG_FREE_IF_COPY(targ1, 0);
+ PG_FREE_IF_COPY(targ2, 1);
+ }
+ }
+ else
+ {
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+
+ result = (text_cmp(arg1, arg2, collid) != 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+text_lt(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+text_le(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) <= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+text_gt(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+text_ge(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) >= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+text_starts_with(PG_FUNCTION_ARGS)
+{
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ Oid collid = PG_GET_COLLATION();
+ pg_locale_t mylocale = 0;
+ bool result;
+ Size len1,
+ len2;
+
+ check_collation_set(collid);
+
+ if (!lc_collate_is_c(collid))
+ mylocale = pg_newlocale_from_collation(collid);
+
+ if (mylocale && !mylocale->deterministic)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("nondeterministic collations are not supported for substring searches")));
+
+ len1 = toast_raw_datum_size(arg1);
+ len2 = toast_raw_datum_size(arg2);
+ if (len2 > len1)
+ result = false;
+ else
+ {
+ text *targ1 = text_substring(arg1, 1, len2, false);
+ text *targ2 = DatumGetTextPP(arg2);
+
+ result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
+ VARSIZE_ANY_EXHDR(targ2)) == 0);
+
+ PG_FREE_IF_COPY(targ1, 0);
+ PG_FREE_IF_COPY(targ2, 1);
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bttextcmp(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int32 result;
+
+ result = text_cmp(arg1, arg2, PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+bttextsortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ Oid collid = ssup->ssup_collation;
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport */
+ varstr_sortsupport(ssup, TEXTOID, collid);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * Generic sortsupport interface for character type's operator classes.
+ * Includes locale support, and support for BpChar semantics (i.e. removing
+ * trailing spaces before comparison).
+ *
+ * Relies on the assumption that text, VarChar, BpChar, and bytea all have the
+ * same representation. Callers that always use the C collation (e.g.
+ * non-collatable type callers like bytea) may have NUL bytes in their strings;
+ * this will not work with any other collation, though.
+ */
+void
+varstr_sortsupport(SortSupport ssup, Oid typid, Oid collid)
+{
+ bool abbreviate = ssup->abbreviate;
+ bool collate_c = false;
+ VarStringSortSupport *sss;
+ pg_locale_t locale = 0;
+
+ check_collation_set(collid);
+
+ /*
+ * If possible, set ssup->comparator to a function which can be used to
+ * directly compare two datums. If we can do this, we'll avoid the
+ * overhead of a trip through the fmgr layer for every comparison, which
+ * can be substantial.
+ *
+ * Most typically, we'll set the comparator to varlenafastcmp_locale,
+ * which uses strcoll() to perform comparisons. We use that for the
+ * BpChar case too, but type NAME uses namefastcmp_locale. However, if
+ * LC_COLLATE = C, we can make things quite a bit faster with
+ * varstrfastcmp_c, bpcharfastcmp_c, or namefastcmp_c, all of which use
+ * memcmp() rather than strcoll().
+ */
+ if (lc_collate_is_c(collid))
+ {
+ if (typid == BPCHAROID)
+ ssup->comparator = bpcharfastcmp_c;
+ else if (typid == NAMEOID)
+ {
+ ssup->comparator = namefastcmp_c;
+ /* Not supporting abbreviation with type NAME, for now */
+ abbreviate = false;
+ }
+ else
+ ssup->comparator = varstrfastcmp_c;
+
+ collate_c = true;
+ }
+ else
+ {
+ /*
+ * We need a collation-sensitive comparison. To make things faster,
+ * we'll figure out the collation based on the locale id and cache the
+ * result.
+ */
+ locale = pg_newlocale_from_collation(collid);
+
+ /*
+ * There is a further exception on Windows. When the database
+ * encoding is UTF-8 and we are not using the C collation, complex
+ * hacks are required. We don't currently have a comparator that
+ * handles that case, so we fall back on the slow method of having the
+ * sort code invoke bttextcmp() (in the case of text) via the fmgr
+ * trampoline. ICU locales work just the same on Windows, however.
+ */
+#ifdef WIN32
+ if (GetDatabaseEncoding() == PG_UTF8 &&
+ !(locale && locale->provider == COLLPROVIDER_ICU))
+ return;
+#endif
+
+ /*
+ * We use varlenafastcmp_locale except for type NAME.
+ */
+ if (typid == NAMEOID)
+ {
+ ssup->comparator = namefastcmp_locale;
+ /* Not supporting abbreviation with type NAME, for now */
+ abbreviate = false;
+ }
+ else
+ ssup->comparator = varlenafastcmp_locale;
+ }
+
+ /*
+ * Unfortunately, it seems that abbreviation for non-C collations is
+ * broken on many common platforms; testing of multiple versions of glibc
+ * reveals that, for many locales, strcoll() and strxfrm() do not return
+ * consistent results, which is fatal to this optimization. While no
+ * other libc other than Cygwin has so far been shown to have a problem,
+ * we take the conservative course of action for right now and disable
+ * this categorically. (Users who are certain this isn't a problem on
+ * their system can define TRUST_STRXFRM.)
+ *
+ * Even apart from the risk of broken locales, it's possible that there
+ * are platforms where the use of abbreviated keys should be disabled at
+ * compile time. Having only 4 byte datums could make worst-case
+ * performance drastically more likely, for example. Moreover, macOS's
+ * strxfrm() implementation is known to not effectively concentrate a
+ * significant amount of entropy from the original string in earlier
+ * transformed blobs. It's possible that other supported platforms are
+ * similarly encumbered. So, if we ever get past disabling this
+ * categorically, we may still want or need to disable it for particular
+ * platforms.
+ */
+#ifndef TRUST_STRXFRM
+ if (!collate_c && !(locale && locale->provider == COLLPROVIDER_ICU))
+ abbreviate = false;
+#endif
+
+ /*
+ * If we're using abbreviated keys, or if we're using a locale-aware
+ * comparison, we need to initialize a VarStringSortSupport object. Both
+ * cases will make use of the temporary buffers we initialize here for
+ * scratch space (and to detect requirement for BpChar semantics from
+ * caller), and the abbreviation case requires additional state.
+ */
+ if (abbreviate || !collate_c)
+ {
+ sss = palloc(sizeof(VarStringSortSupport));
+ sss->buf1 = palloc(TEXTBUFLEN);
+ sss->buflen1 = TEXTBUFLEN;
+ sss->buf2 = palloc(TEXTBUFLEN);
+ sss->buflen2 = TEXTBUFLEN;
+ /* Start with invalid values */
+ sss->last_len1 = -1;
+ sss->last_len2 = -1;
+ /* Initialize */
+ sss->last_returned = 0;
+ sss->locale = locale;
+
+ /*
+ * To avoid somehow confusing a strxfrm() blob and an original string,
+ * constantly keep track of the variety of data that buf1 and buf2
+ * currently contain.
+ *
+ * Comparisons may be interleaved with conversion calls. Frequently,
+ * conversions and comparisons are batched into two distinct phases,
+ * but the correctness of caching cannot hinge upon this. For
+ * comparison caching, buffer state is only trusted if cache_blob is
+ * found set to false, whereas strxfrm() caching only trusts the state
+ * when cache_blob is found set to true.
+ *
+ * Arbitrarily initialize cache_blob to true.
+ */
+ sss->cache_blob = true;
+ sss->collate_c = collate_c;
+ sss->typid = typid;
+ ssup->ssup_extra = sss;
+
+ /*
+ * If possible, plan to use the abbreviated keys optimization. The
+ * core code may switch back to authoritative comparator should
+ * abbreviation be aborted.
+ */
+ if (abbreviate)
+ {
+ sss->prop_card = 0.20;
+ initHyperLogLog(&sss->abbr_card, 10);
+ initHyperLogLog(&sss->full_card, 10);
+ ssup->abbrev_full_comparator = ssup->comparator;
+ ssup->comparator = ssup_datum_unsigned_cmp;
+ ssup->abbrev_converter = varstr_abbrev_convert;
+ ssup->abbrev_abort = varstr_abbrev_abort;
+ }
+ }
+}
+
+/*
+ * sortsupport comparison func (for C locale case)
+ */
+static int
+varstrfastcmp_c(Datum x, Datum y, SortSupport ssup)
+{
+ VarString *arg1 = DatumGetVarStringPP(x);
+ VarString *arg2 = DatumGetVarStringPP(y);
+ char *a1p,
+ *a2p;
+ int len1,
+ len2,
+ result;
+
+ a1p = VARDATA_ANY(arg1);
+ a2p = VARDATA_ANY(arg2);
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ result = memcmp(a1p, a2p, Min(len1, len2));
+ if ((result == 0) && (len1 != len2))
+ result = (len1 < len2) ? -1 : 1;
+
+ /* We can't afford to leak memory here. */
+ if (PointerGetDatum(arg1) != x)
+ pfree(arg1);
+ if (PointerGetDatum(arg2) != y)
+ pfree(arg2);
+
+ return result;
+}
+
+/*
+ * sortsupport comparison func (for BpChar C locale case)
+ *
+ * BpChar outsources its sortsupport to this module. Specialization for the
+ * varstr_sortsupport BpChar case, modeled on
+ * internal_bpchar_pattern_compare().
+ */
+static int
+bpcharfastcmp_c(Datum x, Datum y, SortSupport ssup)
+{
+ BpChar *arg1 = DatumGetBpCharPP(x);
+ BpChar *arg2 = DatumGetBpCharPP(y);
+ char *a1p,
+ *a2p;
+ int len1,
+ len2,
+ result;
+
+ a1p = VARDATA_ANY(arg1);
+ a2p = VARDATA_ANY(arg2);
+
+ len1 = bpchartruelen(a1p, VARSIZE_ANY_EXHDR(arg1));
+ len2 = bpchartruelen(a2p, VARSIZE_ANY_EXHDR(arg2));
+
+ result = memcmp(a1p, a2p, Min(len1, len2));
+ if ((result == 0) && (len1 != len2))
+ result = (len1 < len2) ? -1 : 1;
+
+ /* We can't afford to leak memory here. */
+ if (PointerGetDatum(arg1) != x)
+ pfree(arg1);
+ if (PointerGetDatum(arg2) != y)
+ pfree(arg2);
+
+ return result;
+}
+
+/*
+ * sortsupport comparison func (for NAME C locale case)
+ */
+static int
+namefastcmp_c(Datum x, Datum y, SortSupport ssup)
+{
+ Name arg1 = DatumGetName(x);
+ Name arg2 = DatumGetName(y);
+
+ return strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN);
+}
+
+/*
+ * sortsupport comparison func (for locale case with all varlena types)
+ */
+static int
+varlenafastcmp_locale(Datum x, Datum y, SortSupport ssup)
+{
+ VarString *arg1 = DatumGetVarStringPP(x);
+ VarString *arg2 = DatumGetVarStringPP(y);
+ char *a1p,
+ *a2p;
+ int len1,
+ len2,
+ result;
+
+ a1p = VARDATA_ANY(arg1);
+ a2p = VARDATA_ANY(arg2);
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ result = varstrfastcmp_locale(a1p, len1, a2p, len2, ssup);
+
+ /* We can't afford to leak memory here. */
+ if (PointerGetDatum(arg1) != x)
+ pfree(arg1);
+ if (PointerGetDatum(arg2) != y)
+ pfree(arg2);
+
+ return result;
+}
+
+/*
+ * sortsupport comparison func (for locale case with NAME type)
+ */
+static int
+namefastcmp_locale(Datum x, Datum y, SortSupport ssup)
+{
+ Name arg1 = DatumGetName(x);
+ Name arg2 = DatumGetName(y);
+
+ return varstrfastcmp_locale(NameStr(*arg1), strlen(NameStr(*arg1)),
+ NameStr(*arg2), strlen(NameStr(*arg2)),
+ ssup);
+}
+
+/*
+ * sortsupport comparison func for locale cases
+ */
+static int
+varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup)
+{
+ VarStringSortSupport *sss = (VarStringSortSupport *) ssup->ssup_extra;
+ int result;
+ bool arg1_match;
+
+ /* Fast pre-check for equality, as discussed in varstr_cmp() */
+ if (len1 == len2 && memcmp(a1p, a2p, len1) == 0)
+ {
+ /*
+ * No change in buf1 or buf2 contents, so avoid changing last_len1 or
+ * last_len2. Existing contents of buffers might still be used by
+ * next call.
+ *
+ * It's fine to allow the comparison of BpChar padding bytes here,
+ * even though that implies that the memcmp() will usually be
+ * performed for BpChar callers (though multibyte characters could
+ * still prevent that from occurring). The memcmp() is still very
+ * cheap, and BpChar's funny semantics have us remove trailing spaces
+ * (not limited to padding), so we need make no distinction between
+ * padding space characters and "real" space characters.
+ */
+ return 0;
+ }
+
+ if (sss->typid == BPCHAROID)
+ {
+ /* Get true number of bytes, ignoring trailing spaces */
+ len1 = bpchartruelen(a1p, len1);
+ len2 = bpchartruelen(a2p, len2);
+ }
+
+ if (len1 >= sss->buflen1)
+ {
+ sss->buflen1 = Max(len1 + 1, Min(sss->buflen1 * 2, MaxAllocSize));
+ sss->buf1 = repalloc(sss->buf1, sss->buflen1);
+ }
+ if (len2 >= sss->buflen2)
+ {
+ sss->buflen2 = Max(len2 + 1, Min(sss->buflen2 * 2, MaxAllocSize));
+ sss->buf2 = repalloc(sss->buf2, sss->buflen2);
+ }
+
+ /*
+ * We're likely to be asked to compare the same strings repeatedly, and
+ * memcmp() is so much cheaper than strcoll() that it pays to try to cache
+ * comparisons, even though in general there is no reason to think that
+ * that will work out (every string datum may be unique). Caching does
+ * not slow things down measurably when it doesn't work out, and can speed
+ * things up by rather a lot when it does. In part, this is because the
+ * memcmp() compares data from cachelines that are needed in L1 cache even
+ * when the last comparison's result cannot be reused.
+ */
+ arg1_match = true;
+ if (len1 != sss->last_len1 || memcmp(sss->buf1, a1p, len1) != 0)
+ {
+ arg1_match = false;
+ memcpy(sss->buf1, a1p, len1);
+ sss->buf1[len1] = '\0';
+ sss->last_len1 = len1;
+ }
+
+ /*
+ * If we're comparing the same two strings as last time, we can return the
+ * same answer without calling strcoll() again. This is more likely than
+ * it seems (at least with moderate to low cardinality sets), because
+ * quicksort compares the same pivot against many values.
+ */
+ if (len2 != sss->last_len2 || memcmp(sss->buf2, a2p, len2) != 0)
+ {
+ memcpy(sss->buf2, a2p, len2);
+ sss->buf2[len2] = '\0';
+ sss->last_len2 = len2;
+ }
+ else if (arg1_match && !sss->cache_blob)
+ {
+ /* Use result cached following last actual strcoll() call */
+ return sss->last_returned;
+ }
+
+ if (sss->locale)
+ {
+ if (sss->locale->provider == COLLPROVIDER_ICU)
+ {
+#ifdef USE_ICU
+#ifdef HAVE_UCOL_STRCOLLUTF8
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ UErrorCode status;
+
+ status = U_ZERO_ERROR;
+ result = ucol_strcollUTF8(sss->locale->info.icu.ucol,
+ a1p, len1,
+ a2p, len2,
+ &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("collation failed: %s", u_errorName(status))));
+ }
+ else
+#endif
+ {
+ int32_t ulen1,
+ ulen2;
+ UChar *uchar1,
+ *uchar2;
+
+ ulen1 = icu_to_uchar(&uchar1, a1p, len1);
+ ulen2 = icu_to_uchar(&uchar2, a2p, len2);
+
+ result = ucol_strcoll(sss->locale->info.icu.ucol,
+ uchar1, ulen1,
+ uchar2, ulen2);
+
+ pfree(uchar1);
+ pfree(uchar2);
+ }
+#else /* not USE_ICU */
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", sss->locale->provider);
+#endif /* not USE_ICU */
+ }
+ else
+ {
+#ifdef HAVE_LOCALE_T
+ result = strcoll_l(sss->buf1, sss->buf2, sss->locale->info.lt);
+#else
+ /* shouldn't happen */
+ elog(ERROR, "unsupported collprovider: %c", sss->locale->provider);
+#endif
+ }
+ }
+ else
+ result = strcoll(sss->buf1, sss->buf2);
+
+ /* Break tie if necessary. */
+ if (result == 0 &&
+ (!sss->locale || sss->locale->deterministic))
+ result = strcmp(sss->buf1, sss->buf2);
+
+ /* Cache result, perhaps saving an expensive strcoll() call next time */
+ sss->cache_blob = false;
+ sss->last_returned = result;
+ return result;
+}
+
+/*
+ * Conversion routine for sortsupport. Converts original to abbreviated key
+ * representation. Our encoding strategy is simple -- pack the first 8 bytes
+ * of a strxfrm() blob into a Datum (on little-endian machines, the 8 bytes are
+ * stored in reverse order), and treat it as an unsigned integer. When the "C"
+ * locale is used, or in case of bytea, just memcpy() from original instead.
+ */
+static Datum
+varstr_abbrev_convert(Datum original, SortSupport ssup)
+{
+ VarStringSortSupport *sss = (VarStringSortSupport *) ssup->ssup_extra;
+ VarString *authoritative = DatumGetVarStringPP(original);
+ char *authoritative_data = VARDATA_ANY(authoritative);
+
+ /* working state */
+ Datum res;
+ char *pres;
+ int len;
+ uint32 hash;
+
+ pres = (char *) &res;
+ /* memset(), so any non-overwritten bytes are NUL */
+ memset(pres, 0, sizeof(Datum));
+ len = VARSIZE_ANY_EXHDR(authoritative);
+
+ /* Get number of bytes, ignoring trailing spaces */
+ if (sss->typid == BPCHAROID)
+ len = bpchartruelen(authoritative_data, len);
+
+ /*
+ * If we're using the C collation, use memcpy(), rather than strxfrm(), to
+ * abbreviate keys. The full comparator for the C locale is always
+ * memcmp(). It would be incorrect to allow bytea callers (callers that
+ * always force the C collation -- bytea isn't a collatable type, but this
+ * approach is convenient) to use strxfrm(). This is because bytea
+ * strings may contain NUL bytes. Besides, this should be faster, too.
+ *
+ * More generally, it's okay that bytea callers can have NUL bytes in
+ * strings because abbreviated cmp need not make a distinction between
+ * terminating NUL bytes, and NUL bytes representing actual NULs in the
+ * authoritative representation. Hopefully a comparison at or past one
+ * abbreviated key's terminating NUL byte will resolve the comparison
+ * without consulting the authoritative representation; specifically, some
+ * later non-NUL byte in the longer string can resolve the comparison
+ * against a subsequent terminating NUL in the shorter string. There will
+ * usually be what is effectively a "length-wise" resolution there and
+ * then.
+ *
+ * If that doesn't work out -- if all bytes in the longer string
+ * positioned at or past the offset of the smaller string's (first)
+ * terminating NUL are actually representative of NUL bytes in the
+ * authoritative binary string (perhaps with some *terminating* NUL bytes
+ * towards the end of the longer string iff it happens to still be small)
+ * -- then an authoritative tie-breaker will happen, and do the right
+ * thing: explicitly consider string length.
+ */
+ if (sss->collate_c)
+ memcpy(pres, authoritative_data, Min(len, sizeof(Datum)));
+ else
+ {
+ Size bsize;
+#ifdef USE_ICU
+ int32_t ulen = -1;
+ UChar *uchar = NULL;
+#endif
+
+ /*
+ * We're not using the C collation, so fall back on strxfrm or ICU
+ * analogs.
+ */
+
+ /* By convention, we use buffer 1 to store and NUL-terminate */
+ if (len >= sss->buflen1)
+ {
+ sss->buflen1 = Max(len + 1, Min(sss->buflen1 * 2, MaxAllocSize));
+ sss->buf1 = repalloc(sss->buf1, sss->buflen1);
+ }
+
+ /* Might be able to reuse strxfrm() blob from last call */
+ if (sss->last_len1 == len && sss->cache_blob &&
+ memcmp(sss->buf1, authoritative_data, len) == 0)
+ {
+ memcpy(pres, sss->buf2, Min(sizeof(Datum), sss->last_len2));
+ /* No change affecting cardinality, so no hashing required */
+ goto done;
+ }
+
+ memcpy(sss->buf1, authoritative_data, len);
+
+ /*
+ * Just like strcoll(), strxfrm() expects a NUL-terminated string. Not
+ * necessary for ICU, but doesn't hurt.
+ */
+ sss->buf1[len] = '\0';
+ sss->last_len1 = len;
+
+#ifdef USE_ICU
+ /* When using ICU and not UTF8, convert string to UChar. */
+ if (sss->locale && sss->locale->provider == COLLPROVIDER_ICU &&
+ GetDatabaseEncoding() != PG_UTF8)
+ ulen = icu_to_uchar(&uchar, sss->buf1, len);
+#endif
+
+ /*
+ * Loop: Call strxfrm() or ucol_getSortKey(), possibly enlarge buffer,
+ * and try again. Both of these functions have the result buffer
+ * content undefined if the result did not fit, so we need to retry
+ * until everything fits, even though we only need the first few bytes
+ * in the end. When using ucol_nextSortKeyPart(), however, we only
+ * ask for as many bytes as we actually need.
+ */
+ for (;;)
+ {
+#ifdef USE_ICU
+ if (sss->locale && sss->locale->provider == COLLPROVIDER_ICU)
+ {
+ /*
+ * When using UTF8, use the iteration interface so we only
+ * need to produce as many bytes as we actually need.
+ */
+ if (GetDatabaseEncoding() == PG_UTF8)
+ {
+ UCharIterator iter;
+ uint32_t state[2];
+ UErrorCode status;
+
+ uiter_setUTF8(&iter, sss->buf1, len);
+ state[0] = state[1] = 0; /* won't need that again */
+ status = U_ZERO_ERROR;
+ bsize = ucol_nextSortKeyPart(sss->locale->info.icu.ucol,
+ &iter,
+ state,
+ (uint8_t *) sss->buf2,
+ Min(sizeof(Datum), sss->buflen2),
+ &status);
+ if (U_FAILURE(status))
+ ereport(ERROR,
+ (errmsg("sort key generation failed: %s",
+ u_errorName(status))));
+ }
+ else
+ bsize = ucol_getSortKey(sss->locale->info.icu.ucol,
+ uchar, ulen,
+ (uint8_t *) sss->buf2, sss->buflen2);
+ }
+ else
+#endif
+#ifdef HAVE_LOCALE_T
+ if (sss->locale && sss->locale->provider == COLLPROVIDER_LIBC)
+ bsize = strxfrm_l(sss->buf2, sss->buf1,
+ sss->buflen2, sss->locale->info.lt);
+ else
+#endif
+ bsize = strxfrm(sss->buf2, sss->buf1, sss->buflen2);
+
+ sss->last_len2 = bsize;
+ if (bsize < sss->buflen2)
+ break;
+
+ /*
+ * Grow buffer and retry.
+ */
+ sss->buflen2 = Max(bsize + 1,
+ Min(sss->buflen2 * 2, MaxAllocSize));
+ sss->buf2 = repalloc(sss->buf2, sss->buflen2);
+ }
+
+ /*
+ * Every Datum byte is always compared. This is safe because the
+ * strxfrm() blob is itself NUL terminated, leaving no danger of
+ * misinterpreting any NUL bytes not intended to be interpreted as
+ * logically representing termination.
+ *
+ * (Actually, even if there were NUL bytes in the blob it would be
+ * okay. See remarks on bytea case above.)
+ */
+ memcpy(pres, sss->buf2, Min(sizeof(Datum), bsize));
+
+#ifdef USE_ICU
+ if (uchar)
+ pfree(uchar);
+#endif
+ }
+
+ /*
+ * Maintain approximate cardinality of both abbreviated keys and original,
+ * authoritative keys using HyperLogLog. Used as cheap insurance against
+ * the worst case, where we do many string transformations for no saving
+ * in full strcoll()-based comparisons. These statistics are used by
+ * varstr_abbrev_abort().
+ *
+ * First, Hash key proper, or a significant fraction of it. Mix in length
+ * in order to compensate for cases where differences are past
+ * PG_CACHE_LINE_SIZE bytes, so as to limit the overhead of hashing.
+ */
+ hash = DatumGetUInt32(hash_any((unsigned char *) authoritative_data,
+ Min(len, PG_CACHE_LINE_SIZE)));
+
+ if (len > PG_CACHE_LINE_SIZE)
+ hash ^= DatumGetUInt32(hash_uint32((uint32) len));
+
+ addHyperLogLog(&sss->full_card, hash);
+
+ /* Hash abbreviated key */
+#if SIZEOF_DATUM == 8
+ {
+ uint32 lohalf,
+ hihalf;
+
+ lohalf = (uint32) res;
+ hihalf = (uint32) (res >> 32);
+ hash = DatumGetUInt32(hash_uint32(lohalf ^ hihalf));
+ }
+#else /* SIZEOF_DATUM != 8 */
+ hash = DatumGetUInt32(hash_uint32((uint32) res));
+#endif
+
+ addHyperLogLog(&sss->abbr_card, hash);
+
+ /* Cache result, perhaps saving an expensive strxfrm() call next time */
+ sss->cache_blob = true;
+done:
+
+ /*
+ * Byteswap on little-endian machines.
+ *
+ * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer
+ * 3-way comparator) works correctly on all platforms. If we didn't do
+ * this, the comparator would have to call memcmp() with a pair of
+ * pointers to the first byte of each abbreviated key, which is slower.
+ */
+ res = DatumBigEndianToNative(res);
+
+ /* Don't leak memory here */
+ if (PointerGetDatum(authoritative) != original)
+ pfree(authoritative);
+
+ return res;
+}
+
+/*
+ * Callback for estimating effectiveness of abbreviated key optimization, using
+ * heuristic rules. Returns value indicating if the abbreviation optimization
+ * should be aborted, based on its projected effectiveness.
+ */
+static bool
+varstr_abbrev_abort(int memtupcount, SortSupport ssup)
+{
+ VarStringSortSupport *sss = (VarStringSortSupport *) ssup->ssup_extra;
+ double abbrev_distinct,
+ key_distinct;
+
+ Assert(ssup->abbreviate);
+
+ /* Have a little patience */
+ if (memtupcount < 100)
+ return false;
+
+ abbrev_distinct = estimateHyperLogLog(&sss->abbr_card);
+ key_distinct = estimateHyperLogLog(&sss->full_card);
+
+ /*
+ * Clamp cardinality estimates to at least one distinct value. While
+ * NULLs are generally disregarded, if only NULL values were seen so far,
+ * that might misrepresent costs if we failed to clamp.
+ */
+ if (abbrev_distinct <= 1.0)
+ abbrev_distinct = 1.0;
+
+ if (key_distinct <= 1.0)
+ key_distinct = 1.0;
+
+ /*
+ * In the worst case all abbreviated keys are identical, while at the same
+ * time there are differences within full key strings not captured in
+ * abbreviations.
+ */
+#ifdef TRACE_SORT
+ if (trace_sort)
+ {
+ double norm_abbrev_card = abbrev_distinct / (double) memtupcount;
+
+ elog(LOG, "varstr_abbrev: abbrev_distinct after %d: %f "
+ "(key_distinct: %f, norm_abbrev_card: %f, prop_card: %f)",
+ memtupcount, abbrev_distinct, key_distinct, norm_abbrev_card,
+ sss->prop_card);
+ }
+#endif
+
+ /*
+ * If the number of distinct abbreviated keys approximately matches the
+ * number of distinct authoritative original keys, that's reason enough to
+ * proceed. We can win even with a very low cardinality set if most
+ * tie-breakers only memcmp(). This is by far the most important
+ * consideration.
+ *
+ * While comparisons that are resolved at the abbreviated key level are
+ * considerably cheaper than tie-breakers resolved with memcmp(), both of
+ * those two outcomes are so much cheaper than a full strcoll() once
+ * sorting is underway that it doesn't seem worth it to weigh abbreviated
+ * cardinality against the overall size of the set in order to more
+ * accurately model costs. Assume that an abbreviated comparison, and an
+ * abbreviated comparison with a cheap memcmp()-based authoritative
+ * resolution are equivalent.
+ */
+ if (abbrev_distinct > key_distinct * sss->prop_card)
+ {
+ /*
+ * When we have exceeded 10,000 tuples, decay required cardinality
+ * aggressively for next call.
+ *
+ * This is useful because the number of comparisons required on
+ * average increases at a linearithmic rate, and at roughly 10,000
+ * tuples that factor will start to dominate over the linear costs of
+ * string transformation (this is a conservative estimate). The decay
+ * rate is chosen to be a little less aggressive than halving -- which
+ * (since we're called at points at which memtupcount has doubled)
+ * would never see the cost model actually abort past the first call
+ * following a decay. This decay rate is mostly a precaution against
+ * a sudden, violent swing in how well abbreviated cardinality tracks
+ * full key cardinality. The decay also serves to prevent a marginal
+ * case from being aborted too late, when too much has already been
+ * invested in string transformation.
+ *
+ * It's possible for sets of several million distinct strings with
+ * mere tens of thousands of distinct abbreviated keys to still
+ * benefit very significantly. This will generally occur provided
+ * each abbreviated key is a proxy for a roughly uniform number of the
+ * set's full keys. If it isn't so, we hope to catch that early and
+ * abort. If it isn't caught early, by the time the problem is
+ * apparent it's probably not worth aborting.
+ */
+ if (memtupcount > 10000)
+ sss->prop_card *= 0.65;
+
+ return false;
+ }
+
+ /*
+ * Abort abbreviation strategy.
+ *
+ * The worst case, where all abbreviated keys are identical while all
+ * original strings differ will typically only see a regression of about
+ * 10% in execution time for small to medium sized lists of strings.
+ * Whereas on modern CPUs where cache stalls are the dominant cost, we can
+ * often expect very large improvements, particularly with sets of strings
+ * of moderately high to high abbreviated cardinality. There is little to
+ * lose but much to gain, which our strategy reflects.
+ */
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "varstr_abbrev: aborted abbreviation at %d "
+ "(abbrev_distinct: %f, key_distinct: %f, prop_card: %f)",
+ memtupcount, abbrev_distinct, key_distinct, sss->prop_card);
+#endif
+
+ return true;
+}
+
+/*
+ * Generic equalimage support function for character type's operator classes.
+ * Disables the use of deduplication with nondeterministic collations.
+ */
+Datum
+btvarstrequalimage(PG_FUNCTION_ARGS)
+{
+ /* Oid opcintype = PG_GETARG_OID(0); */
+ Oid collid = PG_GET_COLLATION();
+
+ check_collation_set(collid);
+
+ if (lc_collate_is_c(collid) ||
+ collid == DEFAULT_COLLATION_OID ||
+ get_collation_isdeterministic(collid))
+ PG_RETURN_BOOL(true);
+ else
+ PG_RETURN_BOOL(false);
+}
+
+Datum
+text_larger(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0) ? arg1 : arg2);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+Datum
+text_smaller(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0) ? arg1 : arg2);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+
+/*
+ * Cross-type comparison functions for types text and name.
+ */
+
+Datum
+nameeqtext(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ size_t len1 = strlen(NameStr(*arg1));
+ size_t len2 = VARSIZE_ANY_EXHDR(arg2);
+ Oid collid = PG_GET_COLLATION();
+ bool result;
+
+ check_collation_set(collid);
+
+ if (collid == C_COLLATION_OID)
+ result = (len1 == len2 &&
+ memcmp(NameStr(*arg1), VARDATA_ANY(arg2), len1) == 0);
+ else
+ result = (varstr_cmp(NameStr(*arg1), len1,
+ VARDATA_ANY(arg2), len2,
+ collid) == 0);
+
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+texteqname(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ Name arg2 = PG_GETARG_NAME(1);
+ size_t len1 = VARSIZE_ANY_EXHDR(arg1);
+ size_t len2 = strlen(NameStr(*arg2));
+ Oid collid = PG_GET_COLLATION();
+ bool result;
+
+ check_collation_set(collid);
+
+ if (collid == C_COLLATION_OID)
+ result = (len1 == len2 &&
+ memcmp(VARDATA_ANY(arg1), NameStr(*arg2), len1) == 0);
+ else
+ result = (varstr_cmp(VARDATA_ANY(arg1), len1,
+ NameStr(*arg2), len2,
+ collid) == 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+namenetext(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ size_t len1 = strlen(NameStr(*arg1));
+ size_t len2 = VARSIZE_ANY_EXHDR(arg2);
+ Oid collid = PG_GET_COLLATION();
+ bool result;
+
+ check_collation_set(collid);
+
+ if (collid == C_COLLATION_OID)
+ result = !(len1 == len2 &&
+ memcmp(NameStr(*arg1), VARDATA_ANY(arg2), len1) == 0);
+ else
+ result = !(varstr_cmp(NameStr(*arg1), len1,
+ VARDATA_ANY(arg2), len2,
+ collid) == 0);
+
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+textnename(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ Name arg2 = PG_GETARG_NAME(1);
+ size_t len1 = VARSIZE_ANY_EXHDR(arg1);
+ size_t len2 = strlen(NameStr(*arg2));
+ Oid collid = PG_GET_COLLATION();
+ bool result;
+
+ check_collation_set(collid);
+
+ if (collid == C_COLLATION_OID)
+ result = !(len1 == len2 &&
+ memcmp(VARDATA_ANY(arg1), NameStr(*arg2), len1) == 0);
+ else
+ result = !(varstr_cmp(VARDATA_ANY(arg1), len1,
+ NameStr(*arg2), len2,
+ collid) == 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+btnametextcmp(PG_FUNCTION_ARGS)
+{
+ Name arg1 = PG_GETARG_NAME(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int32 result;
+
+ result = varstr_cmp(NameStr(*arg1), strlen(NameStr(*arg1)),
+ VARDATA_ANY(arg2), VARSIZE_ANY_EXHDR(arg2),
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+Datum
+bttextnamecmp(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ Name arg2 = PG_GETARG_NAME(1);
+ int32 result;
+
+ result = varstr_cmp(VARDATA_ANY(arg1), VARSIZE_ANY_EXHDR(arg1),
+ NameStr(*arg2), strlen(NameStr(*arg2)),
+ PG_GET_COLLATION());
+
+ PG_FREE_IF_COPY(arg1, 0);
+
+ PG_RETURN_INT32(result);
+}
+
+#define CmpCall(cmpfunc) \
+ DatumGetInt32(DirectFunctionCall2Coll(cmpfunc, \
+ PG_GET_COLLATION(), \
+ PG_GETARG_DATUM(0), \
+ PG_GETARG_DATUM(1)))
+
+Datum
+namelttext(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(btnametextcmp) < 0);
+}
+
+Datum
+nameletext(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(btnametextcmp) <= 0);
+}
+
+Datum
+namegttext(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(btnametextcmp) > 0);
+}
+
+Datum
+namegetext(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(btnametextcmp) >= 0);
+}
+
+Datum
+textltname(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(bttextnamecmp) < 0);
+}
+
+Datum
+textlename(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(bttextnamecmp) <= 0);
+}
+
+Datum
+textgtname(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(bttextnamecmp) > 0);
+}
+
+Datum
+textgename(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BOOL(CmpCall(bttextnamecmp) >= 0);
+}
+
+#undef CmpCall
+
+
+/*
+ * The following operators support character-by-character comparison
+ * of text datums, to allow building indexes suitable for LIKE clauses.
+ * Note that the regular texteq/textne comparison operators, and regular
+ * support functions 1 and 2 with "C" collation are assumed to be
+ * compatible with these!
+ */
+
+static int
+internal_text_pattern_compare(text *arg1, text *arg2)
+{
+ int result;
+ int len1,
+ len2;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+ if (result != 0)
+ return result;
+ else if (len1 < len2)
+ return -1;
+ else if (len1 > len2)
+ return 1;
+ else
+ return 0;
+}
+
+
+Datum
+text_pattern_lt(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int result;
+
+ result = internal_text_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result < 0);
+}
+
+
+Datum
+text_pattern_le(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int result;
+
+ result = internal_text_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result <= 0);
+}
+
+
+Datum
+text_pattern_ge(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int result;
+
+ result = internal_text_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result >= 0);
+}
+
+
+Datum
+text_pattern_gt(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int result;
+
+ result = internal_text_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result > 0);
+}
+
+
+Datum
+bttext_pattern_cmp(PG_FUNCTION_ARGS)
+{
+ text *arg1 = PG_GETARG_TEXT_PP(0);
+ text *arg2 = PG_GETARG_TEXT_PP(1);
+ int result;
+
+ result = internal_text_pattern_compare(arg1, arg2);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(result);
+}
+
+
+Datum
+bttext_pattern_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport, forcing "C" collation */
+ varstr_sortsupport(ssup, TEXTOID, C_COLLATION_OID);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
+
+
+/*-------------------------------------------------------------
+ * byteaoctetlen
+ *
+ * get the number of bytes contained in an instance of type 'bytea'
+ *-------------------------------------------------------------
+ */
+Datum
+byteaoctetlen(PG_FUNCTION_ARGS)
+{
+ Datum str = PG_GETARG_DATUM(0);
+
+ /* We need not detoast the input at all */
+ PG_RETURN_INT32(toast_raw_datum_size(str) - VARHDRSZ);
+}
+
+/*
+ * byteacat -
+ * takes two bytea* and returns a bytea* that is the concatenation of
+ * the two.
+ *
+ * Cloned from textcat and modified as required.
+ */
+Datum
+byteacat(PG_FUNCTION_ARGS)
+{
+ bytea *t1 = PG_GETARG_BYTEA_PP(0);
+ bytea *t2 = PG_GETARG_BYTEA_PP(1);
+
+ PG_RETURN_BYTEA_P(bytea_catenate(t1, t2));
+}
+
+/*
+ * bytea_catenate
+ * Guts of byteacat(), broken out so it can be used by other functions
+ *
+ * Arguments can be in short-header form, but not compressed or out-of-line
+ */
+static bytea *
+bytea_catenate(bytea *t1, bytea *t2)
+{
+ bytea *result;
+ int len1,
+ len2,
+ len;
+ char *ptr;
+
+ len1 = VARSIZE_ANY_EXHDR(t1);
+ len2 = VARSIZE_ANY_EXHDR(t2);
+
+ /* paranoia ... probably should throw error instead? */
+ if (len1 < 0)
+ len1 = 0;
+ if (len2 < 0)
+ len2 = 0;
+
+ len = len1 + len2 + VARHDRSZ;
+ result = (bytea *) palloc(len);
+
+ /* Set size of result string... */
+ SET_VARSIZE(result, len);
+
+ /* Fill data field of result string... */
+ ptr = VARDATA(result);
+ if (len1 > 0)
+ memcpy(ptr, VARDATA_ANY(t1), len1);
+ if (len2 > 0)
+ memcpy(ptr + len1, VARDATA_ANY(t2), len2);
+
+ return result;
+}
+
+#define PG_STR_GET_BYTEA(str_) \
+ DatumGetByteaPP(DirectFunctionCall1(byteain, CStringGetDatum(str_)))
+
+/*
+ * bytea_substr()
+ * Return a substring starting at the specified position.
+ * Cloned from text_substr and modified as required.
+ *
+ * Input:
+ * - string
+ * - starting position (is one-based)
+ * - string length (optional)
+ *
+ * If the starting position is zero or less, then return from the start of the string
+ * adjusting the length to be consistent with the "negative start" per SQL.
+ * If the length is less than zero, an ERROR is thrown. If no third argument
+ * (length) is provided, the length to the end of the string is assumed.
+ */
+Datum
+bytea_substr(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BYTEA_P(bytea_substring(PG_GETARG_DATUM(0),
+ PG_GETARG_INT32(1),
+ PG_GETARG_INT32(2),
+ false));
+}
+
+/*
+ * bytea_substr_no_len -
+ * Wrapper to avoid opr_sanity failure due to
+ * one function accepting a different number of args.
+ */
+Datum
+bytea_substr_no_len(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_BYTEA_P(bytea_substring(PG_GETARG_DATUM(0),
+ PG_GETARG_INT32(1),
+ -1,
+ true));
+}
+
+static bytea *
+bytea_substring(Datum str,
+ int S,
+ int L,
+ bool length_not_specified)
+{
+ int32 S1; /* adjusted start position */
+ int32 L1; /* adjusted substring length */
+ int32 E; /* end position */
+
+ /*
+ * The logic here should generally match text_substring().
+ */
+ S1 = Max(S, 1);
+
+ if (length_not_specified)
+ {
+ /*
+ * Not passed a length - DatumGetByteaPSlice() grabs everything to the
+ * end of the string if we pass it a negative value for length.
+ */
+ L1 = -1;
+ }
+ else if (L < 0)
+ {
+ /* SQL99 says to throw an error for E < S, i.e., negative length */
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ L1 = -1; /* silence stupider compilers */
+ }
+ else if (pg_add_s32_overflow(S, L, &E))
+ {
+ /*
+ * L could be large enough for S + L to overflow, in which case the
+ * substring must run to end of string.
+ */
+ L1 = -1;
+ }
+ else
+ {
+ /*
+ * A zero or negative value for the end position can happen if the
+ * start was negative or one. SQL99 says to return a zero-length
+ * string.
+ */
+ if (E < 1)
+ return PG_STR_GET_BYTEA("");
+
+ L1 = E - S1;
+ }
+
+ /*
+ * If the start position is past the end of the string, SQL99 says to
+ * return a zero-length string -- DatumGetByteaPSlice() will do that for
+ * us. We need only convert S1 to zero-based starting position.
+ */
+ return DatumGetByteaPSlice(str, S1 - 1, L1);
+}
+
+/*
+ * byteaoverlay
+ * Replace specified substring of first string with second
+ *
+ * The SQL standard defines OVERLAY() in terms of substring and concatenation.
+ * This code is a direct implementation of what the standard says.
+ */
+Datum
+byteaoverlay(PG_FUNCTION_ARGS)
+{
+ bytea *t1 = PG_GETARG_BYTEA_PP(0);
+ bytea *t2 = PG_GETARG_BYTEA_PP(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl = PG_GETARG_INT32(3); /* substring length */
+
+ PG_RETURN_BYTEA_P(bytea_overlay(t1, t2, sp, sl));
+}
+
+Datum
+byteaoverlay_no_len(PG_FUNCTION_ARGS)
+{
+ bytea *t1 = PG_GETARG_BYTEA_PP(0);
+ bytea *t2 = PG_GETARG_BYTEA_PP(1);
+ int sp = PG_GETARG_INT32(2); /* substring start position */
+ int sl;
+
+ sl = VARSIZE_ANY_EXHDR(t2); /* defaults to length(t2) */
+ PG_RETURN_BYTEA_P(bytea_overlay(t1, t2, sp, sl));
+}
+
+static bytea *
+bytea_overlay(bytea *t1, bytea *t2, int sp, int sl)
+{
+ bytea *result;
+ bytea *s1;
+ bytea *s2;
+ int sp_pl_sl;
+
+ /*
+ * Check for possible integer-overflow cases. For negative sp, throw a
+ * "substring length" error because that's what should be expected
+ * according to the spec's definition of OVERLAY().
+ */
+ if (sp <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SUBSTRING_ERROR),
+ errmsg("negative substring length not allowed")));
+ if (pg_add_s32_overflow(sp, sl, &sp_pl_sl))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
+
+ s1 = bytea_substring(PointerGetDatum(t1), 1, sp - 1, false);
+ s2 = bytea_substring(PointerGetDatum(t1), sp_pl_sl, -1, true);
+ result = bytea_catenate(s1, t2);
+ result = bytea_catenate(result, s2);
+
+ return result;
+}
+
+/*
+ * bit_count
+ */
+Datum
+bytea_bit_count(PG_FUNCTION_ARGS)
+{
+ bytea *t1 = PG_GETARG_BYTEA_PP(0);
+
+ PG_RETURN_INT64(pg_popcount(VARDATA_ANY(t1), VARSIZE_ANY_EXHDR(t1)));
+}
+
+/*
+ * byteapos -
+ * Return the position of the specified substring.
+ * Implements the SQL POSITION() function.
+ * Cloned from textpos and modified as required.
+ */
+Datum
+byteapos(PG_FUNCTION_ARGS)
+{
+ bytea *t1 = PG_GETARG_BYTEA_PP(0);
+ bytea *t2 = PG_GETARG_BYTEA_PP(1);
+ int pos;
+ int px,
+ p;
+ int len1,
+ len2;
+ char *p1,
+ *p2;
+
+ len1 = VARSIZE_ANY_EXHDR(t1);
+ len2 = VARSIZE_ANY_EXHDR(t2);
+
+ if (len2 <= 0)
+ PG_RETURN_INT32(1); /* result for empty pattern */
+
+ p1 = VARDATA_ANY(t1);
+ p2 = VARDATA_ANY(t2);
+
+ pos = 0;
+ px = (len1 - len2);
+ for (p = 0; p <= px; p++)
+ {
+ if ((*p2 == *p1) && (memcmp(p1, p2, len2) == 0))
+ {
+ pos = p + 1;
+ break;
+ };
+ p1++;
+ };
+
+ PG_RETURN_INT32(pos);
+}
+
+/*-------------------------------------------------------------
+ * byteaGetByte
+ *
+ * this routine treats "bytea" as an array of bytes.
+ * It returns the Nth byte (a number between 0 and 255).
+ *-------------------------------------------------------------
+ */
+Datum
+byteaGetByte(PG_FUNCTION_ARGS)
+{
+ bytea *v = PG_GETARG_BYTEA_PP(0);
+ int32 n = PG_GETARG_INT32(1);
+ int len;
+ int byte;
+
+ len = VARSIZE_ANY_EXHDR(v);
+
+ if (n < 0 || n >= len)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("index %d out of valid range, 0..%d",
+ n, len - 1)));
+
+ byte = ((unsigned char *) VARDATA_ANY(v))[n];
+
+ PG_RETURN_INT32(byte);
+}
+
+/*-------------------------------------------------------------
+ * byteaGetBit
+ *
+ * This routine treats a "bytea" type like an array of bits.
+ * It returns the value of the Nth bit (0 or 1).
+ *
+ *-------------------------------------------------------------
+ */
+Datum
+byteaGetBit(PG_FUNCTION_ARGS)
+{
+ bytea *v = PG_GETARG_BYTEA_PP(0);
+ int64 n = PG_GETARG_INT64(1);
+ int byteNo,
+ bitNo;
+ int len;
+ int byte;
+
+ len = VARSIZE_ANY_EXHDR(v);
+
+ if (n < 0 || n >= (int64) len * 8)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("index %lld out of valid range, 0..%lld",
+ (long long) n, (long long) len * 8 - 1)));
+
+ /* n/8 is now known < len, so safe to cast to int */
+ byteNo = (int) (n / 8);
+ bitNo = (int) (n % 8);
+
+ byte = ((unsigned char *) VARDATA_ANY(v))[byteNo];
+
+ if (byte & (1 << bitNo))
+ PG_RETURN_INT32(1);
+ else
+ PG_RETURN_INT32(0);
+}
+
+/*-------------------------------------------------------------
+ * byteaSetByte
+ *
+ * Given an instance of type 'bytea' creates a new one with
+ * the Nth byte set to the given value.
+ *
+ *-------------------------------------------------------------
+ */
+Datum
+byteaSetByte(PG_FUNCTION_ARGS)
+{
+ bytea *res = PG_GETARG_BYTEA_P_COPY(0);
+ int32 n = PG_GETARG_INT32(1);
+ int32 newByte = PG_GETARG_INT32(2);
+ int len;
+
+ len = VARSIZE(res) - VARHDRSZ;
+
+ if (n < 0 || n >= len)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("index %d out of valid range, 0..%d",
+ n, len - 1)));
+
+ /*
+ * Now set the byte.
+ */
+ ((unsigned char *) VARDATA(res))[n] = newByte;
+
+ PG_RETURN_BYTEA_P(res);
+}
+
+/*-------------------------------------------------------------
+ * byteaSetBit
+ *
+ * Given an instance of type 'bytea' creates a new one with
+ * the Nth bit set to the given value.
+ *
+ *-------------------------------------------------------------
+ */
+Datum
+byteaSetBit(PG_FUNCTION_ARGS)
+{
+ bytea *res = PG_GETARG_BYTEA_P_COPY(0);
+ int64 n = PG_GETARG_INT64(1);
+ int32 newBit = PG_GETARG_INT32(2);
+ int len;
+ int oldByte,
+ newByte;
+ int byteNo,
+ bitNo;
+
+ len = VARSIZE(res) - VARHDRSZ;
+
+ if (n < 0 || n >= (int64) len * 8)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("index %lld out of valid range, 0..%lld",
+ (long long) n, (long long) len * 8 - 1)));
+
+ /* n/8 is now known < len, so safe to cast to int */
+ byteNo = (int) (n / 8);
+ bitNo = (int) (n % 8);
+
+ /*
+ * sanity check!
+ */
+ if (newBit != 0 && newBit != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("new bit must be 0 or 1")));
+
+ /*
+ * Update the byte.
+ */
+ oldByte = ((unsigned char *) VARDATA(res))[byteNo];
+
+ if (newBit == 0)
+ newByte = oldByte & (~(1 << bitNo));
+ else
+ newByte = oldByte | (1 << bitNo);
+
+ ((unsigned char *) VARDATA(res))[byteNo] = newByte;
+
+ PG_RETURN_BYTEA_P(res);
+}
+
+
+/* text_name()
+ * Converts a text type to a Name type.
+ */
+Datum
+text_name(PG_FUNCTION_ARGS)
+{
+ text *s = PG_GETARG_TEXT_PP(0);
+ Name result;
+ int len;
+
+ len = VARSIZE_ANY_EXHDR(s);
+
+ /* Truncate oversize input */
+ if (len >= NAMEDATALEN)
+ len = pg_mbcliplen(VARDATA_ANY(s), len, NAMEDATALEN - 1);
+
+ /* We use palloc0 here to ensure result is zero-padded */
+ result = (Name) palloc0(NAMEDATALEN);
+ memcpy(NameStr(*result), VARDATA_ANY(s), len);
+
+ PG_RETURN_NAME(result);
+}
+
+/* name_text()
+ * Converts a Name type to a text type.
+ */
+Datum
+name_text(PG_FUNCTION_ARGS)
+{
+ Name s = PG_GETARG_NAME(0);
+
+ PG_RETURN_TEXT_P(cstring_to_text(NameStr(*s)));
+}
+
+
+/*
+ * textToQualifiedNameList - convert a text object to list of names
+ *
+ * This implements the input parsing needed by nextval() and other
+ * functions that take a text parameter representing a qualified name.
+ * We split the name at dots, downcase if not double-quoted, and
+ * truncate names if they're too long.
+ */
+List *
+textToQualifiedNameList(text *textval)
+{
+ char *rawname;
+ List *result = NIL;
+ List *namelist;
+ ListCell *l;
+
+ /* Convert to C string (handles possible detoasting). */
+ /* Note we rely on being able to modify rawname below. */
+ rawname = text_to_cstring(textval);
+
+ if (!SplitIdentifierString(rawname, '.', &namelist))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ if (namelist == NIL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid name syntax")));
+
+ foreach(l, namelist)
+ {
+ char *curname = (char *) lfirst(l);
+
+ result = lappend(result, makeString(pstrdup(curname)));
+ }
+
+ pfree(rawname);
+ list_free(namelist);
+
+ return result;
+}
+
+/*
+ * SplitIdentifierString --- parse a string containing identifiers
+ *
+ * This is the guts of textToQualifiedNameList, and is exported for use in
+ * other situations such as parsing GUC variables. In the GUC case, it's
+ * important to avoid memory leaks, so the API is designed to minimize the
+ * amount of stuff that needs to be allocated and freed.
+ *
+ * Inputs:
+ * rawstring: the input string; must be overwritable! On return, it's
+ * been modified to contain the separated identifiers.
+ * separator: the separator punctuation expected between identifiers
+ * (typically '.' or ','). Whitespace may also appear around
+ * identifiers.
+ * Outputs:
+ * namelist: filled with a palloc'd list of pointers to identifiers within
+ * rawstring. Caller should list_free() this even on error return.
+ *
+ * Returns true if okay, false if there is a syntax error in the string.
+ *
+ * Note that an empty string is considered okay here, though not in
+ * textToQualifiedNameList.
+ */
+bool
+SplitIdentifierString(char *rawstring, char separator,
+ List **namelist)
+{
+ char *nextp = rawstring;
+ bool done = false;
+
+ *namelist = NIL;
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace */
+
+ if (*nextp == '\0')
+ return true; /* allow empty string */
+
+ /* At the top of the loop, we are at start of a new identifier. */
+ do
+ {
+ char *curname;
+ char *endp;
+
+ if (*nextp == '"')
+ {
+ /* Quoted name --- collapse quote-quote pairs, no downcasing */
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ return false; /* mismatched quotes */
+ if (endp[1] != '"')
+ break; /* found end of quoted name */
+ /* Collapse adjacent quotes into one quote, and look again */
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ /* endp now points at the terminating quote */
+ nextp = endp + 1;
+ }
+ else
+ {
+ /* Unquoted name --- extends to separator or whitespace */
+ char *downname;
+ int len;
+
+ curname = nextp;
+ while (*nextp && *nextp != separator &&
+ !scanner_isspace(*nextp))
+ nextp++;
+ endp = nextp;
+ if (curname == nextp)
+ return false; /* empty unquoted name not allowed */
+
+ /*
+ * Downcase the identifier, using same code as main lexer does.
+ *
+ * XXX because we want to overwrite the input in-place, we cannot
+ * support a downcasing transformation that increases the string
+ * length. This is not a problem given the current implementation
+ * of downcase_truncate_identifier, but we'll probably have to do
+ * something about this someday.
+ */
+ len = endp - curname;
+ downname = downcase_truncate_identifier(curname, len, false);
+ Assert(strlen(downname) <= len);
+ strncpy(curname, downname, len); /* strncpy is required here */
+ pfree(downname);
+ }
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip trailing whitespace */
+
+ if (*nextp == separator)
+ {
+ nextp++;
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace for next */
+ /* we expect another name, so done remains false */
+ }
+ else if (*nextp == '\0')
+ done = true;
+ else
+ return false; /* invalid syntax */
+
+ /* Now safe to overwrite separator with a null */
+ *endp = '\0';
+
+ /* Truncate name if it's overlength */
+ truncate_identifier(curname, strlen(curname), false);
+
+ /*
+ * Finished isolating current name --- add it to list
+ */
+ *namelist = lappend(*namelist, curname);
+
+ /* Loop back if we didn't reach end of string */
+ } while (!done);
+
+ return true;
+}
+
+
+/*
+ * SplitDirectoriesString --- parse a string containing file/directory names
+ *
+ * This works fine on file names too; the function name is historical.
+ *
+ * This is similar to SplitIdentifierString, except that the parsing
+ * rules are meant to handle pathnames instead of identifiers: there is
+ * no downcasing, embedded spaces are allowed, the max length is MAXPGPATH-1,
+ * and we apply canonicalize_path() to each extracted string. Because of the
+ * last, the returned strings are separately palloc'd rather than being
+ * pointers into rawstring --- but we still scribble on rawstring.
+ *
+ * Inputs:
+ * rawstring: the input string; must be modifiable!
+ * separator: the separator punctuation expected between directories
+ * (typically ',' or ';'). Whitespace may also appear around
+ * directories.
+ * Outputs:
+ * namelist: filled with a palloc'd list of directory names.
+ * Caller should list_free_deep() this even on error return.
+ *
+ * Returns true if okay, false if there is a syntax error in the string.
+ *
+ * Note that an empty string is considered okay here.
+ */
+bool
+SplitDirectoriesString(char *rawstring, char separator,
+ List **namelist)
+{
+ char *nextp = rawstring;
+ bool done = false;
+
+ *namelist = NIL;
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace */
+
+ if (*nextp == '\0')
+ return true; /* allow empty string */
+
+ /* At the top of the loop, we are at start of a new directory. */
+ do
+ {
+ char *curname;
+ char *endp;
+
+ if (*nextp == '"')
+ {
+ /* Quoted name --- collapse quote-quote pairs */
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ return false; /* mismatched quotes */
+ if (endp[1] != '"')
+ break; /* found end of quoted name */
+ /* Collapse adjacent quotes into one quote, and look again */
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ /* endp now points at the terminating quote */
+ nextp = endp + 1;
+ }
+ else
+ {
+ /* Unquoted name --- extends to separator or end of string */
+ curname = endp = nextp;
+ while (*nextp && *nextp != separator)
+ {
+ /* trailing whitespace should not be included in name */
+ if (!scanner_isspace(*nextp))
+ endp = nextp + 1;
+ nextp++;
+ }
+ if (curname == endp)
+ return false; /* empty unquoted name not allowed */
+ }
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip trailing whitespace */
+
+ if (*nextp == separator)
+ {
+ nextp++;
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace for next */
+ /* we expect another name, so done remains false */
+ }
+ else if (*nextp == '\0')
+ done = true;
+ else
+ return false; /* invalid syntax */
+
+ /* Now safe to overwrite separator with a null */
+ *endp = '\0';
+
+ /* Truncate path if it's overlength */
+ if (strlen(curname) >= MAXPGPATH)
+ curname[MAXPGPATH - 1] = '\0';
+
+ /*
+ * Finished isolating current name --- add it to list
+ */
+ curname = pstrdup(curname);
+ canonicalize_path(curname);
+ *namelist = lappend(*namelist, curname);
+
+ /* Loop back if we didn't reach end of string */
+ } while (!done);
+
+ return true;
+}
+
+
+/*
+ * SplitGUCList --- parse a string containing identifiers or file names
+ *
+ * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without
+ * presuming whether the elements will be taken as identifiers or file names.
+ * We assume the input has already been through flatten_set_variable_args(),
+ * so that we need never downcase (if appropriate, that was done already).
+ * Nor do we ever truncate, since we don't know the correct max length.
+ * We disallow embedded whitespace for simplicity (it shouldn't matter,
+ * because any embedded whitespace should have led to double-quoting).
+ * Otherwise the API is identical to SplitIdentifierString.
+ *
+ * XXX it's annoying to have so many copies of this string-splitting logic.
+ * However, it's not clear that having one function with a bunch of option
+ * flags would be much better.
+ *
+ * XXX there is a version of this function in src/bin/pg_dump/dumputils.c.
+ * Be sure to update that if you have to change this.
+ *
+ * Inputs:
+ * rawstring: the input string; must be overwritable! On return, it's
+ * been modified to contain the separated identifiers.
+ * separator: the separator punctuation expected between identifiers
+ * (typically '.' or ','). Whitespace may also appear around
+ * identifiers.
+ * Outputs:
+ * namelist: filled with a palloc'd list of pointers to identifiers within
+ * rawstring. Caller should list_free() this even on error return.
+ *
+ * Returns true if okay, false if there is a syntax error in the string.
+ */
+bool
+SplitGUCList(char *rawstring, char separator,
+ List **namelist)
+{
+ char *nextp = rawstring;
+ bool done = false;
+
+ *namelist = NIL;
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace */
+
+ if (*nextp == '\0')
+ return true; /* allow empty string */
+
+ /* At the top of the loop, we are at start of a new identifier. */
+ do
+ {
+ char *curname;
+ char *endp;
+
+ if (*nextp == '"')
+ {
+ /* Quoted name --- collapse quote-quote pairs */
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ return false; /* mismatched quotes */
+ if (endp[1] != '"')
+ break; /* found end of quoted name */
+ /* Collapse adjacent quotes into one quote, and look again */
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ /* endp now points at the terminating quote */
+ nextp = endp + 1;
+ }
+ else
+ {
+ /* Unquoted name --- extends to separator or whitespace */
+ curname = nextp;
+ while (*nextp && *nextp != separator &&
+ !scanner_isspace(*nextp))
+ nextp++;
+ endp = nextp;
+ if (curname == nextp)
+ return false; /* empty unquoted name not allowed */
+ }
+
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip trailing whitespace */
+
+ if (*nextp == separator)
+ {
+ nextp++;
+ while (scanner_isspace(*nextp))
+ nextp++; /* skip leading whitespace for next */
+ /* we expect another name, so done remains false */
+ }
+ else if (*nextp == '\0')
+ done = true;
+ else
+ return false; /* invalid syntax */
+
+ /* Now safe to overwrite separator with a null */
+ *endp = '\0';
+
+ /*
+ * Finished isolating current name --- add it to list
+ */
+ *namelist = lappend(*namelist, curname);
+
+ /* Loop back if we didn't reach end of string */
+ } while (!done);
+
+ return true;
+}
+
+
+/*****************************************************************************
+ * Comparison Functions used for bytea
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ *****************************************************************************/
+
+Datum
+byteaeq(PG_FUNCTION_ARGS)
+{
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ bool result;
+ Size len1,
+ len2;
+
+ /*
+ * We can use a fast path for unequal lengths, which might save us from
+ * having to detoast one or both values.
+ */
+ len1 = toast_raw_datum_size(arg1);
+ len2 = toast_raw_datum_size(arg2);
+ if (len1 != len2)
+ result = false;
+ else
+ {
+ bytea *barg1 = DatumGetByteaPP(arg1);
+ bytea *barg2 = DatumGetByteaPP(arg2);
+
+ result = (memcmp(VARDATA_ANY(barg1), VARDATA_ANY(barg2),
+ len1 - VARHDRSZ) == 0);
+
+ PG_FREE_IF_COPY(barg1, 0);
+ PG_FREE_IF_COPY(barg2, 1);
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+byteane(PG_FUNCTION_ARGS)
+{
+ Datum arg1 = PG_GETARG_DATUM(0);
+ Datum arg2 = PG_GETARG_DATUM(1);
+ bool result;
+ Size len1,
+ len2;
+
+ /*
+ * We can use a fast path for unequal lengths, which might save us from
+ * having to detoast one or both values.
+ */
+ len1 = toast_raw_datum_size(arg1);
+ len2 = toast_raw_datum_size(arg2);
+ if (len1 != len2)
+ result = true;
+ else
+ {
+ bytea *barg1 = DatumGetByteaPP(arg1);
+ bytea *barg2 = DatumGetByteaPP(arg2);
+
+ result = (memcmp(VARDATA_ANY(barg1), VARDATA_ANY(barg2),
+ len1 - VARHDRSZ) != 0);
+
+ PG_FREE_IF_COPY(barg1, 0);
+ PG_FREE_IF_COPY(barg2, 1);
+ }
+
+ PG_RETURN_BOOL(result);
+}
+
+Datum
+bytealt(PG_FUNCTION_ARGS)
+{
+ bytea *arg1 = PG_GETARG_BYTEA_PP(0);
+ bytea *arg2 = PG_GETARG_BYTEA_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL((cmp < 0) || ((cmp == 0) && (len1 < len2)));
+}
+
+Datum
+byteale(PG_FUNCTION_ARGS)
+{
+ bytea *arg1 = PG_GETARG_BYTEA_PP(0);
+ bytea *arg2 = PG_GETARG_BYTEA_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL((cmp < 0) || ((cmp == 0) && (len1 <= len2)));
+}
+
+Datum
+byteagt(PG_FUNCTION_ARGS)
+{
+ bytea *arg1 = PG_GETARG_BYTEA_PP(0);
+ bytea *arg2 = PG_GETARG_BYTEA_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL((cmp > 0) || ((cmp == 0) && (len1 > len2)));
+}
+
+Datum
+byteage(PG_FUNCTION_ARGS)
+{
+ bytea *arg1 = PG_GETARG_BYTEA_PP(0);
+ bytea *arg2 = PG_GETARG_BYTEA_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL((cmp > 0) || ((cmp == 0) && (len1 >= len2)));
+}
+
+Datum
+byteacmp(PG_FUNCTION_ARGS)
+{
+ bytea *arg1 = PG_GETARG_BYTEA_PP(0);
+ bytea *arg2 = PG_GETARG_BYTEA_PP(1);
+ int len1,
+ len2;
+ int cmp;
+
+ len1 = VARSIZE_ANY_EXHDR(arg1);
+ len2 = VARSIZE_ANY_EXHDR(arg2);
+
+ cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
+ if ((cmp == 0) && (len1 != len2))
+ cmp = (len1 < len2) ? -1 : 1;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(cmp);
+}
+
+Datum
+bytea_sortsupport(PG_FUNCTION_ARGS)
+{
+ SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
+
+ /* Use generic string SortSupport, forcing "C" collation */
+ varstr_sortsupport(ssup, BYTEAOID, C_COLLATION_OID);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ PG_RETURN_VOID();
+}
+
+/*
+ * appendStringInfoText
+ *
+ * Append a text to str.
+ * Like appendStringInfoString(str, text_to_cstring(t)) but faster.
+ */
+static void
+appendStringInfoText(StringInfo str, const text *t)
+{
+ appendBinaryStringInfo(str, VARDATA_ANY(t), VARSIZE_ANY_EXHDR(t));
+}
+
+/*
+ * replace_text
+ * replace all occurrences of 'old_sub_str' in 'orig_str'
+ * with 'new_sub_str' to form 'new_str'
+ *
+ * returns 'orig_str' if 'old_sub_str' == '' or 'orig_str' == ''
+ * otherwise returns 'new_str'
+ */
+Datum
+replace_text(PG_FUNCTION_ARGS)
+{
+ text *src_text = PG_GETARG_TEXT_PP(0);
+ text *from_sub_text = PG_GETARG_TEXT_PP(1);
+ text *to_sub_text = PG_GETARG_TEXT_PP(2);
+ int src_text_len;
+ int from_sub_text_len;
+ TextPositionState state;
+ text *ret_text;
+ int chunk_len;
+ char *curr_ptr;
+ char *start_ptr;
+ StringInfoData str;
+ bool found;
+
+ src_text_len = VARSIZE_ANY_EXHDR(src_text);
+ from_sub_text_len = VARSIZE_ANY_EXHDR(from_sub_text);
+
+ /* Return unmodified source string if empty source or pattern */
+ if (src_text_len < 1 || from_sub_text_len < 1)
+ {
+ PG_RETURN_TEXT_P(src_text);
+ }
+
+ text_position_setup(src_text, from_sub_text, PG_GET_COLLATION(), &state);
+
+ found = text_position_next(&state);
+
+ /* When the from_sub_text is not found, there is nothing to do. */
+ if (!found)
+ {
+ text_position_cleanup(&state);
+ PG_RETURN_TEXT_P(src_text);
+ }
+ curr_ptr = text_position_get_match_ptr(&state);
+ start_ptr = VARDATA_ANY(src_text);
+
+ initStringInfo(&str);
+
+ do
+ {
+ CHECK_FOR_INTERRUPTS();
+
+ /* copy the data skipped over by last text_position_next() */
+ chunk_len = curr_ptr - start_ptr;
+ appendBinaryStringInfo(&str, start_ptr, chunk_len);
+
+ appendStringInfoText(&str, to_sub_text);
+
+ start_ptr = curr_ptr + from_sub_text_len;
+
+ found = text_position_next(&state);
+ if (found)
+ curr_ptr = text_position_get_match_ptr(&state);
+ }
+ while (found);
+
+ /* copy trailing data */
+ chunk_len = ((char *) src_text + VARSIZE_ANY(src_text)) - start_ptr;
+ appendBinaryStringInfo(&str, start_ptr, chunk_len);
+
+ text_position_cleanup(&state);
+
+ ret_text = cstring_to_text_with_len(str.data, str.len);
+ pfree(str.data);
+
+ PG_RETURN_TEXT_P(ret_text);
+}
+
+/*
+ * check_replace_text_has_escape
+ *
+ * Returns 0 if text contains no backslashes that need processing.
+ * Returns 1 if text contains backslashes, but not regexp submatch specifiers.
+ * Returns 2 if text contains regexp submatch specifiers (\1 .. \9).
+ */
+static int
+check_replace_text_has_escape(const text *replace_text)
+{
+ int result = 0;
+ const char *p = VARDATA_ANY(replace_text);
+ const char *p_end = p + VARSIZE_ANY_EXHDR(replace_text);
+
+ while (p < p_end)
+ {
+ /* Find next escape char, if any. */
+ p = memchr(p, '\\', p_end - p);
+ if (p == NULL)
+ break;
+ p++;
+ /* Note: a backslash at the end doesn't require extra processing. */
+ if (p < p_end)
+ {
+ if (*p >= '1' && *p <= '9')
+ return 2; /* Found a submatch specifier, so done */
+ result = 1; /* Found some other sequence, keep looking */
+ p++;
+ }
+ }
+ return result;
+}
+
+/*
+ * appendStringInfoRegexpSubstr
+ *
+ * Append replace_text to str, substituting regexp back references for
+ * \n escapes. start_ptr is the start of the match in the source string,
+ * at logical character position data_pos.
+ */
+static void
+appendStringInfoRegexpSubstr(StringInfo str, text *replace_text,
+ regmatch_t *pmatch,
+ char *start_ptr, int data_pos)
+{
+ const char *p = VARDATA_ANY(replace_text);
+ const char *p_end = p + VARSIZE_ANY_EXHDR(replace_text);
+
+ while (p < p_end)
+ {
+ const char *chunk_start = p;
+ int so;
+ int eo;
+
+ /* Find next escape char, if any. */
+ p = memchr(p, '\\', p_end - p);
+ if (p == NULL)
+ p = p_end;
+
+ /* Copy the text we just scanned over, if any. */
+ if (p > chunk_start)
+ appendBinaryStringInfo(str, chunk_start, p - chunk_start);
+
+ /* Done if at end of string, else advance over escape char. */
+ if (p >= p_end)
+ break;
+ p++;
+
+ if (p >= p_end)
+ {
+ /* Escape at very end of input. Treat same as unexpected char */
+ appendStringInfoChar(str, '\\');
+ break;
+ }
+
+ if (*p >= '1' && *p <= '9')
+ {
+ /* Use the back reference of regexp. */
+ int idx = *p - '0';
+
+ so = pmatch[idx].rm_so;
+ eo = pmatch[idx].rm_eo;
+ p++;
+ }
+ else if (*p == '&')
+ {
+ /* Use the entire matched string. */
+ so = pmatch[0].rm_so;
+ eo = pmatch[0].rm_eo;
+ p++;
+ }
+ else if (*p == '\\')
+ {
+ /* \\ means transfer one \ to output. */
+ appendStringInfoChar(str, '\\');
+ p++;
+ continue;
+ }
+ else
+ {
+ /*
+ * If escape char is not followed by any expected char, just treat
+ * it as ordinary data to copy. (XXX would it be better to throw
+ * an error?)
+ */
+ appendStringInfoChar(str, '\\');
+ continue;
+ }
+
+ if (so >= 0 && eo >= 0)
+ {
+ /*
+ * Copy the text that is back reference of regexp. Note so and eo
+ * are counted in characters not bytes.
+ */
+ char *chunk_start;
+ int chunk_len;
+
+ Assert(so >= data_pos);
+ chunk_start = start_ptr;
+ chunk_start += charlen_to_bytelen(chunk_start, so - data_pos);
+ chunk_len = charlen_to_bytelen(chunk_start, eo - so);
+ appendBinaryStringInfo(str, chunk_start, chunk_len);
+ }
+ }
+}
+
+/*
+ * replace_text_regexp
+ *
+ * replace substring(s) in src_text that match pattern with replace_text.
+ * The replace_text can contain backslash markers to substitute
+ * (parts of) the matched text.
+ *
+ * cflags: regexp compile flags.
+ * collation: collation to use.
+ * search_start: the character (not byte) offset in src_text at which to
+ * begin searching.
+ * n: if 0, replace all matches; if > 0, replace only the N'th match.
+ */
+text *
+replace_text_regexp(text *src_text, text *pattern_text,
+ text *replace_text,
+ int cflags, Oid collation,
+ int search_start, int n)
+{
+ text *ret_text;
+ regex_t *re;
+ int src_text_len = VARSIZE_ANY_EXHDR(src_text);
+ int nmatches = 0;
+ StringInfoData buf;
+ regmatch_t pmatch[10]; /* main match, plus \1 to \9 */
+ int nmatch = lengthof(pmatch);
+ pg_wchar *data;
+ size_t data_len;
+ int data_pos;
+ char *start_ptr;
+ int escape_status;
+
+ initStringInfo(&buf);
+
+ /* Convert data string to wide characters. */
+ data = (pg_wchar *) palloc((src_text_len + 1) * sizeof(pg_wchar));
+ data_len = pg_mb2wchar_with_len(VARDATA_ANY(src_text), data, src_text_len);
+
+ /* Check whether replace_text has escapes, especially regexp submatches. */
+ escape_status = check_replace_text_has_escape(replace_text);
+
+ /* If no regexp submatches, we can use REG_NOSUB. */
+ if (escape_status < 2)
+ {
+ cflags |= REG_NOSUB;
+ /* Also tell pg_regexec we only want the whole-match location. */
+ nmatch = 1;
+ }
+
+ /* Prepare the regexp. */
+ re = RE_compile_and_cache(pattern_text, cflags, collation);
+
+ /* start_ptr points to the data_pos'th character of src_text */
+ start_ptr = (char *) VARDATA_ANY(src_text);
+ data_pos = 0;
+
+ while (search_start <= data_len)
+ {
+ int regexec_result;
+
+ CHECK_FOR_INTERRUPTS();
+
+ regexec_result = pg_regexec(re,
+ data,
+ data_len,
+ search_start,
+ NULL, /* no details */
+ nmatch,
+ pmatch,
+ 0);
+
+ if (regexec_result == REG_NOMATCH)
+ break;
+
+ if (regexec_result != REG_OKAY)
+ {
+ char errMsg[100];
+
+ CHECK_FOR_INTERRUPTS();
+ pg_regerror(regexec_result, re, errMsg, sizeof(errMsg));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+ errmsg("regular expression failed: %s", errMsg)));
+ }
+
+ /*
+ * Count matches, and decide whether to replace this match.
+ */
+ nmatches++;
+ if (n > 0 && nmatches != n)
+ {
+ /*
+ * No, so advance search_start, but not start_ptr/data_pos. (Thus,
+ * we treat the matched text as if it weren't matched, and copy it
+ * to the output later.)
+ */
+ search_start = pmatch[0].rm_eo;
+ if (pmatch[0].rm_so == pmatch[0].rm_eo)
+ search_start++;
+ continue;
+ }
+
+ /*
+ * Copy the text to the left of the match position. Note we are given
+ * character not byte indexes.
+ */
+ if (pmatch[0].rm_so - data_pos > 0)
+ {
+ int chunk_len;
+
+ chunk_len = charlen_to_bytelen(start_ptr,
+ pmatch[0].rm_so - data_pos);
+ appendBinaryStringInfo(&buf, start_ptr, chunk_len);
+
+ /*
+ * Advance start_ptr over that text, to avoid multiple rescans of
+ * it if the replace_text contains multiple back-references.
+ */
+ start_ptr += chunk_len;
+ data_pos = pmatch[0].rm_so;
+ }
+
+ /*
+ * Copy the replace_text, processing escapes if any are present.
+ */
+ if (escape_status > 0)
+ appendStringInfoRegexpSubstr(&buf, replace_text, pmatch,
+ start_ptr, data_pos);
+ else
+ appendStringInfoText(&buf, replace_text);
+
+ /* Advance start_ptr and data_pos over the matched text. */
+ start_ptr += charlen_to_bytelen(start_ptr,
+ pmatch[0].rm_eo - data_pos);
+ data_pos = pmatch[0].rm_eo;
+
+ /*
+ * If we only want to replace one occurrence, we're done.
+ */
+ if (n > 0)
+ break;
+
+ /*
+ * Advance search position. Normally we start the next search at the
+ * end of the previous match; but if the match was of zero length, we
+ * have to advance by one character, or we'd just find the same match
+ * again.
+ */
+ search_start = data_pos;
+ if (pmatch[0].rm_so == pmatch[0].rm_eo)
+ search_start++;
+ }
+
+ /*
+ * Copy the text to the right of the last match.
+ */
+ if (data_pos < data_len)
+ {
+ int chunk_len;
+
+ chunk_len = ((char *) src_text + VARSIZE_ANY(src_text)) - start_ptr;
+ appendBinaryStringInfo(&buf, start_ptr, chunk_len);
+ }
+
+ ret_text = cstring_to_text_with_len(buf.data, buf.len);
+ pfree(buf.data);
+ pfree(data);
+
+ return ret_text;
+}
+
+/*
+ * split_part
+ * parse input string based on provided field separator
+ * return N'th item (1 based, negative counts from end)
+ */
+Datum
+split_part(PG_FUNCTION_ARGS)
+{
+ text *inputstring = PG_GETARG_TEXT_PP(0);
+ text *fldsep = PG_GETARG_TEXT_PP(1);
+ int fldnum = PG_GETARG_INT32(2);
+ int inputstring_len;
+ int fldsep_len;
+ TextPositionState state;
+ char *start_ptr;
+ char *end_ptr;
+ text *result_text;
+ bool found;
+
+ /* field number is 1 based */
+ if (fldnum == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("field position must not be zero")));
+
+ inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
+ fldsep_len = VARSIZE_ANY_EXHDR(fldsep);
+
+ /* return empty string for empty input string */
+ if (inputstring_len < 1)
+ PG_RETURN_TEXT_P(cstring_to_text(""));
+
+ /* handle empty field separator */
+ if (fldsep_len < 1)
+ {
+ /* if first or last field, return input string, else empty string */
+ if (fldnum == 1 || fldnum == -1)
+ PG_RETURN_TEXT_P(inputstring);
+ else
+ PG_RETURN_TEXT_P(cstring_to_text(""));
+ }
+
+ /* find the first field separator */
+ text_position_setup(inputstring, fldsep, PG_GET_COLLATION(), &state);
+
+ found = text_position_next(&state);
+
+ /* special case if fldsep not found at all */
+ if (!found)
+ {
+ text_position_cleanup(&state);
+ /* if first or last field, return input string, else empty string */
+ if (fldnum == 1 || fldnum == -1)
+ PG_RETURN_TEXT_P(inputstring);
+ else
+ PG_RETURN_TEXT_P(cstring_to_text(""));
+ }
+
+ /*
+ * take care of a negative field number (i.e. count from the right) by
+ * converting to a positive field number; we need total number of fields
+ */
+ if (fldnum < 0)
+ {
+ /* we found a fldsep, so there are at least two fields */
+ int numfields = 2;
+
+ while (text_position_next(&state))
+ numfields++;
+
+ /* special case of last field does not require an extra pass */
+ if (fldnum == -1)
+ {
+ start_ptr = text_position_get_match_ptr(&state) + fldsep_len;
+ end_ptr = VARDATA_ANY(inputstring) + inputstring_len;
+ text_position_cleanup(&state);
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(start_ptr,
+ end_ptr - start_ptr));
+ }
+
+ /* else, convert fldnum to positive notation */
+ fldnum += numfields + 1;
+
+ /* if nonexistent field, return empty string */
+ if (fldnum <= 0)
+ {
+ text_position_cleanup(&state);
+ PG_RETURN_TEXT_P(cstring_to_text(""));
+ }
+
+ /* reset to pointing at first match, but now with positive fldnum */
+ text_position_reset(&state);
+ found = text_position_next(&state);
+ Assert(found);
+ }
+
+ /* identify bounds of first field */
+ start_ptr = VARDATA_ANY(inputstring);
+ end_ptr = text_position_get_match_ptr(&state);
+
+ while (found && --fldnum > 0)
+ {
+ /* identify bounds of next field */
+ start_ptr = end_ptr + fldsep_len;
+ found = text_position_next(&state);
+ if (found)
+ end_ptr = text_position_get_match_ptr(&state);
+ }
+
+ text_position_cleanup(&state);
+
+ if (fldnum > 0)
+ {
+ /* N'th field separator not found */
+ /* if last field requested, return it, else empty string */
+ if (fldnum == 1)
+ {
+ int last_len = start_ptr - VARDATA_ANY(inputstring);
+
+ result_text = cstring_to_text_with_len(start_ptr,
+ inputstring_len - last_len);
+ }
+ else
+ result_text = cstring_to_text("");
+ }
+ else
+ {
+ /* non-last field requested */
+ result_text = cstring_to_text_with_len(start_ptr, end_ptr - start_ptr);
+ }
+
+ PG_RETURN_TEXT_P(result_text);
+}
+
+/*
+ * Convenience function to return true when two text params are equal.
+ */
+static bool
+text_isequal(text *txt1, text *txt2, Oid collid)
+{
+ return DatumGetBool(DirectFunctionCall2Coll(texteq,
+ collid,
+ PointerGetDatum(txt1),
+ PointerGetDatum(txt2)));
+}
+
+/*
+ * text_to_array
+ * parse input string and return text array of elements,
+ * based on provided field separator
+ */
+Datum
+text_to_array(PG_FUNCTION_ARGS)
+{
+ SplitTextOutputData tstate;
+
+ /* For array output, tstate should start as all zeroes */
+ memset(&tstate, 0, sizeof(tstate));
+
+ if (!split_text(fcinfo, &tstate))
+ PG_RETURN_NULL();
+
+ if (tstate.astate == NULL)
+ PG_RETURN_ARRAYTYPE_P(construct_empty_array(TEXTOID));
+
+ PG_RETURN_ARRAYTYPE_P(makeArrayResult(tstate.astate,
+ CurrentMemoryContext));
+}
+
+/*
+ * text_to_array_null
+ * parse input string and return text array of elements,
+ * based on provided field separator and null string
+ *
+ * This is a separate entry point only to prevent the regression tests from
+ * complaining about different argument sets for the same internal function.
+ */
+Datum
+text_to_array_null(PG_FUNCTION_ARGS)
+{
+ return text_to_array(fcinfo);
+}
+
+/*
+ * text_to_table
+ * parse input string and return table of elements,
+ * based on provided field separator
+ */
+Datum
+text_to_table(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ SplitTextOutputData tstate;
+
+ tstate.astate = NULL;
+ InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC);
+ tstate.tupstore = rsi->setResult;
+ tstate.tupdesc = rsi->setDesc;
+
+ (void) split_text(fcinfo, &tstate);
+
+ return (Datum) 0;
+}
+
+/*
+ * text_to_table_null
+ * parse input string and return table of elements,
+ * based on provided field separator and null string
+ *
+ * This is a separate entry point only to prevent the regression tests from
+ * complaining about different argument sets for the same internal function.
+ */
+Datum
+text_to_table_null(PG_FUNCTION_ARGS)
+{
+ return text_to_table(fcinfo);
+}
+
+/*
+ * Common code for text_to_array, text_to_array_null, text_to_table
+ * and text_to_table_null functions.
+ *
+ * These are not strict so we have to test for null inputs explicitly.
+ * Returns false if result is to be null, else returns true.
+ *
+ * Note that if the result is valid but empty (zero elements), we return
+ * without changing *tstate --- caller must handle that case, too.
+ */
+static bool
+split_text(FunctionCallInfo fcinfo, SplitTextOutputData *tstate)
+{
+ text *inputstring;
+ text *fldsep;
+ text *null_string;
+ Oid collation = PG_GET_COLLATION();
+ int inputstring_len;
+ int fldsep_len;
+ char *start_ptr;
+ text *result_text;
+
+ /* when input string is NULL, then result is NULL too */
+ if (PG_ARGISNULL(0))
+ return false;
+
+ inputstring = PG_GETARG_TEXT_PP(0);
+
+ /* fldsep can be NULL */
+ if (!PG_ARGISNULL(1))
+ fldsep = PG_GETARG_TEXT_PP(1);
+ else
+ fldsep = NULL;
+
+ /* null_string can be NULL or omitted */
+ if (PG_NARGS() > 2 && !PG_ARGISNULL(2))
+ null_string = PG_GETARG_TEXT_PP(2);
+ else
+ null_string = NULL;
+
+ if (fldsep != NULL)
+ {
+ /*
+ * Normal case with non-null fldsep. Use the text_position machinery
+ * to search for occurrences of fldsep.
+ */
+ TextPositionState state;
+
+ inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
+ fldsep_len = VARSIZE_ANY_EXHDR(fldsep);
+
+ /* return empty set for empty input string */
+ if (inputstring_len < 1)
+ return true;
+
+ /* empty field separator: return input string as a one-element set */
+ if (fldsep_len < 1)
+ {
+ split_text_accum_result(tstate, inputstring,
+ null_string, collation);
+ return true;
+ }
+
+ text_position_setup(inputstring, fldsep, collation, &state);
+
+ start_ptr = VARDATA_ANY(inputstring);
+
+ for (;;)
+ {
+ bool found;
+ char *end_ptr;
+ int chunk_len;
+
+ CHECK_FOR_INTERRUPTS();
+
+ found = text_position_next(&state);
+ if (!found)
+ {
+ /* fetch last field */
+ chunk_len = ((char *) inputstring + VARSIZE_ANY(inputstring)) - start_ptr;
+ end_ptr = NULL; /* not used, but some compilers complain */
+ }
+ else
+ {
+ /* fetch non-last field */
+ end_ptr = text_position_get_match_ptr(&state);
+ chunk_len = end_ptr - start_ptr;
+ }
+
+ /* build a temp text datum to pass to split_text_accum_result */
+ result_text = cstring_to_text_with_len(start_ptr, chunk_len);
+
+ /* stash away this field */
+ split_text_accum_result(tstate, result_text,
+ null_string, collation);
+
+ pfree(result_text);
+
+ if (!found)
+ break;
+
+ start_ptr = end_ptr + fldsep_len;
+ }
+
+ text_position_cleanup(&state);
+ }
+ else
+ {
+ /*
+ * When fldsep is NULL, each character in the input string becomes a
+ * separate element in the result set. The separator is effectively
+ * the space between characters.
+ */
+ inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
+
+ start_ptr = VARDATA_ANY(inputstring);
+
+ while (inputstring_len > 0)
+ {
+ int chunk_len = pg_mblen(start_ptr);
+
+ CHECK_FOR_INTERRUPTS();
+
+ /* build a temp text datum to pass to split_text_accum_result */
+ result_text = cstring_to_text_with_len(start_ptr, chunk_len);
+
+ /* stash away this field */
+ split_text_accum_result(tstate, result_text,
+ null_string, collation);
+
+ pfree(result_text);
+
+ start_ptr += chunk_len;
+ inputstring_len -= chunk_len;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Add text item to result set (table or array).
+ *
+ * This is also responsible for checking to see if the item matches
+ * the null_string, in which case we should emit NULL instead.
+ */
+static void
+split_text_accum_result(SplitTextOutputData *tstate,
+ text *field_value,
+ text *null_string,
+ Oid collation)
+{
+ bool is_null = false;
+
+ if (null_string && text_isequal(field_value, null_string, collation))
+ is_null = true;
+
+ if (tstate->tupstore)
+ {
+ Datum values[1];
+ bool nulls[1];
+
+ values[0] = PointerGetDatum(field_value);
+ nulls[0] = is_null;
+
+ tuplestore_putvalues(tstate->tupstore,
+ tstate->tupdesc,
+ values,
+ nulls);
+ }
+ else
+ {
+ tstate->astate = accumArrayResult(tstate->astate,
+ PointerGetDatum(field_value),
+ is_null,
+ TEXTOID,
+ CurrentMemoryContext);
+ }
+}
+
+/*
+ * array_to_text
+ * concatenate Cstring representation of input array elements
+ * using provided field separator
+ */
+Datum
+array_to_text(PG_FUNCTION_ARGS)
+{
+ ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
+ char *fldsep = text_to_cstring(PG_GETARG_TEXT_PP(1));
+
+ PG_RETURN_TEXT_P(array_to_text_internal(fcinfo, v, fldsep, NULL));
+}
+
+/*
+ * array_to_text_null
+ * concatenate Cstring representation of input array elements
+ * using provided field separator and null string
+ *
+ * This version is not strict so we have to test for null inputs explicitly.
+ */
+Datum
+array_to_text_null(PG_FUNCTION_ARGS)
+{
+ ArrayType *v;
+ char *fldsep;
+ char *null_string;
+
+ /* returns NULL when first or second parameter is NULL */
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+
+ v = PG_GETARG_ARRAYTYPE_P(0);
+ fldsep = text_to_cstring(PG_GETARG_TEXT_PP(1));
+
+ /* NULL null string is passed through as a null pointer */
+ if (!PG_ARGISNULL(2))
+ null_string = text_to_cstring(PG_GETARG_TEXT_PP(2));
+ else
+ null_string = NULL;
+
+ PG_RETURN_TEXT_P(array_to_text_internal(fcinfo, v, fldsep, null_string));
+}
+
+/*
+ * common code for array_to_text and array_to_text_null functions
+ */
+static text *
+array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v,
+ const char *fldsep, const char *null_string)
+{
+ text *result;
+ int nitems,
+ *dims,
+ ndims;
+ Oid element_type;
+ int typlen;
+ bool typbyval;
+ char typalign;
+ StringInfoData buf;
+ bool printed = false;
+ char *p;
+ bits8 *bitmap;
+ int bitmask;
+ int i;
+ ArrayMetaState *my_extra;
+
+ ndims = ARR_NDIM(v);
+ dims = ARR_DIMS(v);
+ nitems = ArrayGetNItems(ndims, dims);
+
+ /* if there are no elements, return an empty string */
+ if (nitems == 0)
+ return cstring_to_text_with_len("", 0);
+
+ element_type = ARR_ELEMTYPE(v);
+ initStringInfo(&buf);
+
+ /*
+ * We arrange to look up info about element type, including its output
+ * conversion proc, only once per series of calls, assuming the element
+ * type doesn't change underneath us.
+ */
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ if (my_extra == NULL)
+ {
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(ArrayMetaState));
+ my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
+ my_extra->element_type = ~element_type;
+ }
+
+ if (my_extra->element_type != element_type)
+ {
+ /*
+ * Get info about element type, including its output conversion proc
+ */
+ get_type_io_data(element_type, IOFunc_output,
+ &my_extra->typlen, &my_extra->typbyval,
+ &my_extra->typalign, &my_extra->typdelim,
+ &my_extra->typioparam, &my_extra->typiofunc);
+ fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
+ fcinfo->flinfo->fn_mcxt);
+ my_extra->element_type = element_type;
+ }
+ typlen = my_extra->typlen;
+ typbyval = my_extra->typbyval;
+ typalign = my_extra->typalign;
+
+ p = ARR_DATA_PTR(v);
+ bitmap = ARR_NULLBITMAP(v);
+ bitmask = 1;
+
+ for (i = 0; i < nitems; i++)
+ {
+ Datum itemvalue;
+ char *value;
+
+ /* Get source element, checking for NULL */
+ if (bitmap && (*bitmap & bitmask) == 0)
+ {
+ /* if null_string is NULL, we just ignore null elements */
+ if (null_string != NULL)
+ {
+ if (printed)
+ appendStringInfo(&buf, "%s%s", fldsep, null_string);
+ else
+ appendStringInfoString(&buf, null_string);
+ printed = true;
+ }
+ }
+ else
+ {
+ itemvalue = fetch_att(p, typbyval, typlen);
+
+ value = OutputFunctionCall(&my_extra->proc, itemvalue);
+
+ if (printed)
+ appendStringInfo(&buf, "%s%s", fldsep, value);
+ else
+ appendStringInfoString(&buf, value);
+ printed = true;
+
+ p = att_addlength_pointer(p, typlen, p);
+ p = (char *) att_align_nominal(p, typalign);
+ }
+
+ /* advance bitmap pointer if any */
+ if (bitmap)
+ {
+ bitmask <<= 1;
+ if (bitmask == 0x100)
+ {
+ bitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+
+ result = cstring_to_text_with_len(buf.data, buf.len);
+ pfree(buf.data);
+
+ return result;
+}
+
+#define HEXBASE 16
+/*
+ * Convert an int32 to a string containing a base 16 (hex) representation of
+ * the number.
+ */
+Datum
+to_hex32(PG_FUNCTION_ARGS)
+{
+ uint32 value = (uint32) PG_GETARG_INT32(0);
+ char *ptr;
+ const char *digits = "0123456789abcdef";
+ char buf[32]; /* bigger than needed, but reasonable */
+
+ ptr = buf + sizeof(buf) - 1;
+ *ptr = '\0';
+
+ do
+ {
+ *--ptr = digits[value % HEXBASE];
+ value /= HEXBASE;
+ } while (ptr > buf && value);
+
+ PG_RETURN_TEXT_P(cstring_to_text(ptr));
+}
+
+/*
+ * Convert an int64 to a string containing a base 16 (hex) representation of
+ * the number.
+ */
+Datum
+to_hex64(PG_FUNCTION_ARGS)
+{
+ uint64 value = (uint64) PG_GETARG_INT64(0);
+ char *ptr;
+ const char *digits = "0123456789abcdef";
+ char buf[32]; /* bigger than needed, but reasonable */
+
+ ptr = buf + sizeof(buf) - 1;
+ *ptr = '\0';
+
+ do
+ {
+ *--ptr = digits[value % HEXBASE];
+ value /= HEXBASE;
+ } while (ptr > buf && value);
+
+ PG_RETURN_TEXT_P(cstring_to_text(ptr));
+}
+
+/*
+ * Return the size of a datum, possibly compressed
+ *
+ * Works on any data type
+ */
+Datum
+pg_column_size(PG_FUNCTION_ARGS)
+{
+ Datum value = PG_GETARG_DATUM(0);
+ int32 result;
+ int typlen;
+
+ /* On first call, get the input type's typlen, and save at *fn_extra */
+ if (fcinfo->flinfo->fn_extra == NULL)
+ {
+ /* Lookup the datatype of the supplied argument */
+ Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+
+ typlen = get_typlen(argtypeid);
+ if (typlen == 0) /* should not happen */
+ elog(ERROR, "cache lookup failed for type %u", argtypeid);
+
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(int));
+ *((int *) fcinfo->flinfo->fn_extra) = typlen;
+ }
+ else
+ typlen = *((int *) fcinfo->flinfo->fn_extra);
+
+ if (typlen == -1)
+ {
+ /* varlena type, possibly toasted */
+ result = toast_datum_size(value);
+ }
+ else if (typlen == -2)
+ {
+ /* cstring */
+ result = strlen(DatumGetCString(value)) + 1;
+ }
+ else
+ {
+ /* ordinary fixed-width type */
+ result = typlen;
+ }
+
+ PG_RETURN_INT32(result);
+}
+
+/*
+ * Return the compression method stored in the compressed attribute. Return
+ * NULL for non varlena type or uncompressed data.
+ */
+Datum
+pg_column_compression(PG_FUNCTION_ARGS)
+{
+ int typlen;
+ char *result;
+ ToastCompressionId cmid;
+
+ /* On first call, get the input type's typlen, and save at *fn_extra */
+ if (fcinfo->flinfo->fn_extra == NULL)
+ {
+ /* Lookup the datatype of the supplied argument */
+ Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
+
+ typlen = get_typlen(argtypeid);
+ if (typlen == 0) /* should not happen */
+ elog(ERROR, "cache lookup failed for type %u", argtypeid);
+
+ fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ sizeof(int));
+ *((int *) fcinfo->flinfo->fn_extra) = typlen;
+ }
+ else
+ typlen = *((int *) fcinfo->flinfo->fn_extra);
+
+ if (typlen != -1)
+ PG_RETURN_NULL();
+
+ /* get the compression method id stored in the compressed varlena */
+ cmid = toast_get_compression_id((struct varlena *)
+ DatumGetPointer(PG_GETARG_DATUM(0)));
+ if (cmid == TOAST_INVALID_COMPRESSION_ID)
+ PG_RETURN_NULL();
+
+ /* convert compression method id to compression method name */
+ switch (cmid)
+ {
+ case TOAST_PGLZ_COMPRESSION_ID:
+ result = "pglz";
+ break;
+ case TOAST_LZ4_COMPRESSION_ID:
+ result = "lz4";
+ break;
+ default:
+ elog(ERROR, "invalid compression method id %d", cmid);
+ }
+
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
+
+/*
+ * string_agg - Concatenates values and returns string.
+ *
+ * Syntax: string_agg(value text, delimiter text) RETURNS text
+ *
+ * Note: Any NULL values are ignored. The first-call delimiter isn't
+ * actually used at all, and on subsequent calls the delimiter precedes
+ * the associated value.
+ */
+
+/* subroutine to initialize state */
+static StringInfo
+makeStringAggState(FunctionCallInfo fcinfo)
+{
+ StringInfo state;
+ MemoryContext aggcontext;
+ MemoryContext oldcontext;
+
+ if (!AggCheckCallContext(fcinfo, &aggcontext))
+ {
+ /* cannot be called directly because of internal-type argument */
+ elog(ERROR, "string_agg_transfn called in non-aggregate context");
+ }
+
+ /*
+ * Create state in aggregate context. It'll stay there across subsequent
+ * calls.
+ */
+ oldcontext = MemoryContextSwitchTo(aggcontext);
+ state = makeStringInfo();
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Datum
+string_agg_transfn(PG_FUNCTION_ARGS)
+{
+ StringInfo state;
+
+ state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
+
+ /* Append the value unless null. */
+ if (!PG_ARGISNULL(1))
+ {
+ /* On the first time through, we ignore the delimiter. */
+ if (state == NULL)
+ state = makeStringAggState(fcinfo);
+ else if (!PG_ARGISNULL(2))
+ appendStringInfoText(state, PG_GETARG_TEXT_PP(2)); /* delimiter */
+
+ appendStringInfoText(state, PG_GETARG_TEXT_PP(1)); /* value */
+ }
+
+ /*
+ * The transition type for string_agg() is declared to be "internal",
+ * which is a pass-by-value type the same size as a pointer.
+ */
+ PG_RETURN_POINTER(state);
+}
+
+Datum
+string_agg_finalfn(PG_FUNCTION_ARGS)
+{
+ StringInfo state;
+
+ /* cannot be called directly because of internal-type argument */
+ Assert(AggCheckCallContext(fcinfo, NULL));
+
+ state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
+
+ if (state != NULL)
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(state->data, state->len));
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * Prepare cache with fmgr info for the output functions of the datatypes of
+ * the arguments of a concat-like function, beginning with argument "argidx".
+ * (Arguments before that will have corresponding slots in the resulting
+ * FmgrInfo array, but we don't fill those slots.)
+ */
+static FmgrInfo *
+build_concat_foutcache(FunctionCallInfo fcinfo, int argidx)
+{
+ FmgrInfo *foutcache;
+ int i;
+
+ /* We keep the info in fn_mcxt so it survives across calls */
+ foutcache = (FmgrInfo *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
+ PG_NARGS() * sizeof(FmgrInfo));
+
+ for (i = argidx; i < PG_NARGS(); i++)
+ {
+ Oid valtype;
+ Oid typOutput;
+ bool typIsVarlena;
+
+ valtype = get_fn_expr_argtype(fcinfo->flinfo, i);
+ if (!OidIsValid(valtype))
+ elog(ERROR, "could not determine data type of concat() input");
+
+ getTypeOutputInfo(valtype, &typOutput, &typIsVarlena);
+ fmgr_info_cxt(typOutput, &foutcache[i], fcinfo->flinfo->fn_mcxt);
+ }
+
+ fcinfo->flinfo->fn_extra = foutcache;
+
+ return foutcache;
+}
+
+/*
+ * Implementation of both concat() and concat_ws().
+ *
+ * sepstr is the separator string to place between values.
+ * argidx identifies the first argument to concatenate (counting from zero);
+ * note that this must be constant across any one series of calls.
+ *
+ * Returns NULL if result should be NULL, else text value.
+ */
+static text *
+concat_internal(const char *sepstr, int argidx,
+ FunctionCallInfo fcinfo)
+{
+ text *result;
+ StringInfoData str;
+ FmgrInfo *foutcache;
+ bool first_arg = true;
+ int i;
+
+ /*
+ * concat(VARIADIC some-array) is essentially equivalent to
+ * array_to_text(), ie concat the array elements with the given separator.
+ * So we just pass the case off to that code.
+ */
+ if (get_fn_expr_variadic(fcinfo->flinfo))
+ {
+ ArrayType *arr;
+
+ /* Should have just the one argument */
+ Assert(argidx == PG_NARGS() - 1);
+
+ /* concat(VARIADIC NULL) is defined as NULL */
+ if (PG_ARGISNULL(argidx))
+ return NULL;
+
+ /*
+ * Non-null argument had better be an array. We assume that any call
+ * context that could let get_fn_expr_variadic return true will have
+ * checked that a VARIADIC-labeled parameter actually is an array. So
+ * it should be okay to just Assert that it's an array rather than
+ * doing a full-fledged error check.
+ */
+ Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, argidx))));
+
+ /* OK, safe to fetch the array value */
+ arr = PG_GETARG_ARRAYTYPE_P(argidx);
+
+ /*
+ * And serialize the array. We tell array_to_text to ignore null
+ * elements, which matches the behavior of the loop below.
+ */
+ return array_to_text_internal(fcinfo, arr, sepstr, NULL);
+ }
+
+ /* Normal case without explicit VARIADIC marker */
+ initStringInfo(&str);
+
+ /* Get output function info, building it if first time through */
+ foutcache = (FmgrInfo *) fcinfo->flinfo->fn_extra;
+ if (foutcache == NULL)
+ foutcache = build_concat_foutcache(fcinfo, argidx);
+
+ for (i = argidx; i < PG_NARGS(); i++)
+ {
+ if (!PG_ARGISNULL(i))
+ {
+ Datum value = PG_GETARG_DATUM(i);
+
+ /* add separator if appropriate */
+ if (first_arg)
+ first_arg = false;
+ else
+ appendStringInfoString(&str, sepstr);
+
+ /* call the appropriate type output function, append the result */
+ appendStringInfoString(&str,
+ OutputFunctionCall(&foutcache[i], value));
+ }
+ }
+
+ result = cstring_to_text_with_len(str.data, str.len);
+ pfree(str.data);
+
+ return result;
+}
+
+/*
+ * Concatenate all arguments. NULL arguments are ignored.
+ */
+Datum
+text_concat(PG_FUNCTION_ARGS)
+{
+ text *result;
+
+ result = concat_internal("", 0, fcinfo);
+ if (result == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * Concatenate all but first argument value with separators. The first
+ * parameter is used as the separator. NULL arguments are ignored.
+ */
+Datum
+text_concat_ws(PG_FUNCTION_ARGS)
+{
+ char *sep;
+ text *result;
+
+ /* return NULL when separator is NULL */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ sep = text_to_cstring(PG_GETARG_TEXT_PP(0));
+
+ result = concat_internal(sep, 1, fcinfo);
+ if (result == NULL)
+ PG_RETURN_NULL();
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * Return first n characters in the string. When n is negative,
+ * return all but last |n| characters.
+ */
+Datum
+text_left(PG_FUNCTION_ARGS)
+{
+ int n = PG_GETARG_INT32(1);
+
+ if (n < 0)
+ {
+ text *str = PG_GETARG_TEXT_PP(0);
+ const char *p = VARDATA_ANY(str);
+ int len = VARSIZE_ANY_EXHDR(str);
+ int rlen;
+
+ n = pg_mbstrlen_with_len(p, len) + n;
+ rlen = pg_mbcharcliplen(p, len, n);
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(p, rlen));
+ }
+ else
+ PG_RETURN_TEXT_P(text_substring(PG_GETARG_DATUM(0), 1, n, false));
+}
+
+/*
+ * Return last n characters in the string. When n is negative,
+ * return all but first |n| characters.
+ */
+Datum
+text_right(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ const char *p = VARDATA_ANY(str);
+ int len = VARSIZE_ANY_EXHDR(str);
+ int n = PG_GETARG_INT32(1);
+ int off;
+
+ if (n < 0)
+ n = -n;
+ else
+ n = pg_mbstrlen_with_len(p, len) - n;
+ off = pg_mbcharcliplen(p, len, n);
+
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(p + off, len - off));
+}
+
+/*
+ * Return reversed string
+ */
+Datum
+text_reverse(PG_FUNCTION_ARGS)
+{
+ text *str = PG_GETARG_TEXT_PP(0);
+ const char *p = VARDATA_ANY(str);
+ int len = VARSIZE_ANY_EXHDR(str);
+ const char *endp = p + len;
+ text *result;
+ char *dst;
+
+ result = palloc(len + VARHDRSZ);
+ dst = (char *) VARDATA(result) + len;
+ SET_VARSIZE(result, len + VARHDRSZ);
+
+ if (pg_database_encoding_max_length() > 1)
+ {
+ /* multibyte version */
+ while (p < endp)
+ {
+ int sz;
+
+ sz = pg_mblen(p);
+ dst -= sz;
+ memcpy(dst, p, sz);
+ p += sz;
+ }
+ }
+ else
+ {
+ /* single byte version */
+ while (p < endp)
+ *(--dst) = *p++;
+ }
+
+ PG_RETURN_TEXT_P(result);
+}
+
+
+/*
+ * Support macros for text_format()
+ */
+#define TEXT_FORMAT_FLAG_MINUS 0x0001 /* is minus flag present? */
+
+#define ADVANCE_PARSE_POINTER(ptr,end_ptr) \
+ do { \
+ if (++(ptr) >= (end_ptr)) \
+ ereport(ERROR, \
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE), \
+ errmsg("unterminated format() type specifier"), \
+ errhint("For a single \"%%\" use \"%%%%\"."))); \
+ } while (0)
+
+/*
+ * Returns a formatted string
+ */
+Datum
+text_format(PG_FUNCTION_ARGS)
+{
+ text *fmt;
+ StringInfoData str;
+ const char *cp;
+ const char *start_ptr;
+ const char *end_ptr;
+ text *result;
+ int arg;
+ bool funcvariadic;
+ int nargs;
+ Datum *elements = NULL;
+ bool *nulls = NULL;
+ Oid element_type = InvalidOid;
+ Oid prev_type = InvalidOid;
+ Oid prev_width_type = InvalidOid;
+ FmgrInfo typoutputfinfo;
+ FmgrInfo typoutputinfo_width;
+
+ /* When format string is null, immediately return null */
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+
+ /* If argument is marked VARIADIC, expand array into elements */
+ if (get_fn_expr_variadic(fcinfo->flinfo))
+ {
+ ArrayType *arr;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ int nitems;
+
+ /* Should have just the one argument */
+ Assert(PG_NARGS() == 2);
+
+ /* If argument is NULL, we treat it as zero-length array */
+ if (PG_ARGISNULL(1))
+ nitems = 0;
+ else
+ {
+ /*
+ * Non-null argument had better be an array. We assume that any
+ * call context that could let get_fn_expr_variadic return true
+ * will have checked that a VARIADIC-labeled parameter actually is
+ * an array. So it should be okay to just Assert that it's an
+ * array rather than doing a full-fledged error check.
+ */
+ Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, 1))));
+
+ /* OK, safe to fetch the array value */
+ arr = PG_GETARG_ARRAYTYPE_P(1);
+
+ /* Get info about array element type */
+ element_type = ARR_ELEMTYPE(arr);
+ get_typlenbyvalalign(element_type,
+ &elmlen, &elmbyval, &elmalign);
+
+ /* Extract all array elements */
+ deconstruct_array(arr, element_type, elmlen, elmbyval, elmalign,
+ &elements, &nulls, &nitems);
+ }
+
+ nargs = nitems + 1;
+ funcvariadic = true;
+ }
+ else
+ {
+ /* Non-variadic case, we'll process the arguments individually */
+ nargs = PG_NARGS();
+ funcvariadic = false;
+ }
+
+ /* Setup for main loop. */
+ fmt = PG_GETARG_TEXT_PP(0);
+ start_ptr = VARDATA_ANY(fmt);
+ end_ptr = start_ptr + VARSIZE_ANY_EXHDR(fmt);
+ initStringInfo(&str);
+ arg = 1; /* next argument position to print */
+
+ /* Scan format string, looking for conversion specifiers. */
+ for (cp = start_ptr; cp < end_ptr; cp++)
+ {
+ int argpos;
+ int widthpos;
+ int flags;
+ int width;
+ Datum value;
+ bool isNull;
+ Oid typid;
+
+ /*
+ * If it's not the start of a conversion specifier, just copy it to
+ * the output buffer.
+ */
+ if (*cp != '%')
+ {
+ appendStringInfoCharMacro(&str, *cp);
+ continue;
+ }
+
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+
+ /* Easy case: %% outputs a single % */
+ if (*cp == '%')
+ {
+ appendStringInfoCharMacro(&str, *cp);
+ continue;
+ }
+
+ /* Parse the optional portions of the format specifier */
+ cp = text_format_parse_format(cp, end_ptr,
+ &argpos, &widthpos,
+ &flags, &width);
+
+ /*
+ * Next we should see the main conversion specifier. Whether or not
+ * an argument position was present, it's known that at least one
+ * character remains in the string at this point. Experience suggests
+ * that it's worth checking that that character is one of the expected
+ * ones before we try to fetch arguments, so as to produce the least
+ * confusing response to a mis-formatted specifier.
+ */
+ if (strchr("sIL", *cp) == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized format() type specifier \"%.*s\"",
+ pg_mblen(cp), cp),
+ errhint("For a single \"%%\" use \"%%%%\".")));
+
+ /* If indirect width was specified, get its value */
+ if (widthpos >= 0)
+ {
+ /* Collect the specified or next argument position */
+ if (widthpos > 0)
+ arg = widthpos;
+ if (arg >= nargs)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("too few arguments for format()")));
+
+ /* Get the value and type of the selected argument */
+ if (!funcvariadic)
+ {
+ value = PG_GETARG_DATUM(arg);
+ isNull = PG_ARGISNULL(arg);
+ typid = get_fn_expr_argtype(fcinfo->flinfo, arg);
+ }
+ else
+ {
+ value = elements[arg - 1];
+ isNull = nulls[arg - 1];
+ typid = element_type;
+ }
+ if (!OidIsValid(typid))
+ elog(ERROR, "could not determine data type of format() input");
+
+ arg++;
+
+ /* We can treat NULL width the same as zero */
+ if (isNull)
+ width = 0;
+ else if (typid == INT4OID)
+ width = DatumGetInt32(value);
+ else if (typid == INT2OID)
+ width = DatumGetInt16(value);
+ else
+ {
+ /* For less-usual datatypes, convert to text then to int */
+ char *str;
+
+ if (typid != prev_width_type)
+ {
+ Oid typoutputfunc;
+ bool typIsVarlena;
+
+ getTypeOutputInfo(typid, &typoutputfunc, &typIsVarlena);
+ fmgr_info(typoutputfunc, &typoutputinfo_width);
+ prev_width_type = typid;
+ }
+
+ str = OutputFunctionCall(&typoutputinfo_width, value);
+
+ /* pg_strtoint32 will complain about bad data or overflow */
+ width = pg_strtoint32(str);
+
+ pfree(str);
+ }
+ }
+
+ /* Collect the specified or next argument position */
+ if (argpos > 0)
+ arg = argpos;
+ if (arg >= nargs)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("too few arguments for format()")));
+
+ /* Get the value and type of the selected argument */
+ if (!funcvariadic)
+ {
+ value = PG_GETARG_DATUM(arg);
+ isNull = PG_ARGISNULL(arg);
+ typid = get_fn_expr_argtype(fcinfo->flinfo, arg);
+ }
+ else
+ {
+ value = elements[arg - 1];
+ isNull = nulls[arg - 1];
+ typid = element_type;
+ }
+ if (!OidIsValid(typid))
+ elog(ERROR, "could not determine data type of format() input");
+
+ arg++;
+
+ /*
+ * Get the appropriate typOutput function, reusing previous one if
+ * same type as previous argument. That's particularly useful in the
+ * variadic-array case, but often saves work even for ordinary calls.
+ */
+ if (typid != prev_type)
+ {
+ Oid typoutputfunc;
+ bool typIsVarlena;
+
+ getTypeOutputInfo(typid, &typoutputfunc, &typIsVarlena);
+ fmgr_info(typoutputfunc, &typoutputfinfo);
+ prev_type = typid;
+ }
+
+ /*
+ * And now we can format the value.
+ */
+ switch (*cp)
+ {
+ case 's':
+ case 'I':
+ case 'L':
+ text_format_string_conversion(&str, *cp, &typoutputfinfo,
+ value, isNull,
+ flags, width);
+ break;
+ default:
+ /* should not get here, because of previous check */
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized format() type specifier \"%.*s\"",
+ pg_mblen(cp), cp),
+ errhint("For a single \"%%\" use \"%%%%\".")));
+ break;
+ }
+ }
+
+ /* Don't need deconstruct_array results anymore. */
+ if (elements != NULL)
+ pfree(elements);
+ if (nulls != NULL)
+ pfree(nulls);
+
+ /* Generate results. */
+ result = cstring_to_text_with_len(str.data, str.len);
+ pfree(str.data);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * Parse contiguous digits as a decimal number.
+ *
+ * Returns true if some digits could be parsed.
+ * The value is returned into *value, and *ptr is advanced to the next
+ * character to be parsed.
+ *
+ * Note parsing invariant: at least one character is known available before
+ * string end (end_ptr) at entry, and this is still true at exit.
+ */
+static bool
+text_format_parse_digits(const char **ptr, const char *end_ptr, int *value)
+{
+ bool found = false;
+ const char *cp = *ptr;
+ int val = 0;
+
+ while (*cp >= '0' && *cp <= '9')
+ {
+ int8 digit = (*cp - '0');
+
+ if (unlikely(pg_mul_s32_overflow(val, 10, &val)) ||
+ unlikely(pg_add_s32_overflow(val, digit, &val)))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("number is out of range")));
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+ found = true;
+ }
+
+ *ptr = cp;
+ *value = val;
+
+ return found;
+}
+
+/*
+ * Parse a format specifier (generally following the SUS printf spec).
+ *
+ * We have already advanced over the initial '%', and we are looking for
+ * [argpos][flags][width]type (but the type character is not consumed here).
+ *
+ * Inputs are start_ptr (the position after '%') and end_ptr (string end + 1).
+ * Output parameters:
+ * argpos: argument position for value to be printed. -1 means unspecified.
+ * widthpos: argument position for width. Zero means the argument position
+ * was unspecified (ie, take the next arg) and -1 means no width
+ * argument (width was omitted or specified as a constant).
+ * flags: bitmask of flags.
+ * width: directly-specified width value. Zero means the width was omitted
+ * (note it's not necessary to distinguish this case from an explicit
+ * zero width value).
+ *
+ * The function result is the next character position to be parsed, ie, the
+ * location where the type character is/should be.
+ *
+ * Note parsing invariant: at least one character is known available before
+ * string end (end_ptr) at entry, and this is still true at exit.
+ */
+static const char *
+text_format_parse_format(const char *start_ptr, const char *end_ptr,
+ int *argpos, int *widthpos,
+ int *flags, int *width)
+{
+ const char *cp = start_ptr;
+ int n;
+
+ /* set defaults for output parameters */
+ *argpos = -1;
+ *widthpos = -1;
+ *flags = 0;
+ *width = 0;
+
+ /* try to identify first number */
+ if (text_format_parse_digits(&cp, end_ptr, &n))
+ {
+ if (*cp != '$')
+ {
+ /* Must be just a width and a type, so we're done */
+ *width = n;
+ return cp;
+ }
+ /* The number was argument position */
+ *argpos = n;
+ /* Explicit 0 for argument index is immediately refused */
+ if (n == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("format specifies argument 0, but arguments are numbered from 1")));
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+ }
+
+ /* Handle flags (only minus is supported now) */
+ while (*cp == '-')
+ {
+ *flags |= TEXT_FORMAT_FLAG_MINUS;
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+ }
+
+ if (*cp == '*')
+ {
+ /* Handle indirect width */
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+ if (text_format_parse_digits(&cp, end_ptr, &n))
+ {
+ /* number in this position must be closed by $ */
+ if (*cp != '$')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("width argument position must be ended by \"$\"")));
+ /* The number was width argument position */
+ *widthpos = n;
+ /* Explicit 0 for argument index is immediately refused */
+ if (n == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("format specifies argument 0, but arguments are numbered from 1")));
+ ADVANCE_PARSE_POINTER(cp, end_ptr);
+ }
+ else
+ *widthpos = 0; /* width's argument position is unspecified */
+ }
+ else
+ {
+ /* Check for direct width specification */
+ if (text_format_parse_digits(&cp, end_ptr, &n))
+ *width = n;
+ }
+
+ /* cp should now be pointing at type character */
+ return cp;
+}
+
+/*
+ * Format a %s, %I, or %L conversion
+ */
+static void
+text_format_string_conversion(StringInfo buf, char conversion,
+ FmgrInfo *typOutputInfo,
+ Datum value, bool isNull,
+ int flags, int width)
+{
+ char *str;
+
+ /* Handle NULL arguments before trying to stringify the value. */
+ if (isNull)
+ {
+ if (conversion == 's')
+ text_format_append_string(buf, "", flags, width);
+ else if (conversion == 'L')
+ text_format_append_string(buf, "NULL", flags, width);
+ else if (conversion == 'I')
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("null values cannot be formatted as an SQL identifier")));
+ return;
+ }
+
+ /* Stringify. */
+ str = OutputFunctionCall(typOutputInfo, value);
+
+ /* Escape. */
+ if (conversion == 'I')
+ {
+ /* quote_identifier may or may not allocate a new string. */
+ text_format_append_string(buf, quote_identifier(str), flags, width);
+ }
+ else if (conversion == 'L')
+ {
+ char *qstr = quote_literal_cstr(str);
+
+ text_format_append_string(buf, qstr, flags, width);
+ /* quote_literal_cstr() always allocates a new string */
+ pfree(qstr);
+ }
+ else
+ text_format_append_string(buf, str, flags, width);
+
+ /* Cleanup. */
+ pfree(str);
+}
+
+/*
+ * Append str to buf, padding as directed by flags/width
+ */
+static void
+text_format_append_string(StringInfo buf, const char *str,
+ int flags, int width)
+{
+ bool align_to_left = false;
+ int len;
+
+ /* fast path for typical easy case */
+ if (width == 0)
+ {
+ appendStringInfoString(buf, str);
+ return;
+ }
+
+ if (width < 0)
+ {
+ /* Negative width: implicit '-' flag, then take absolute value */
+ align_to_left = true;
+ /* -INT_MIN is undefined */
+ if (width <= INT_MIN)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("number is out of range")));
+ width = -width;
+ }
+ else if (flags & TEXT_FORMAT_FLAG_MINUS)
+ align_to_left = true;
+
+ len = pg_mbstrlen(str);
+ if (align_to_left)
+ {
+ /* left justify */
+ appendStringInfoString(buf, str);
+ if (len < width)
+ appendStringInfoSpaces(buf, width - len);
+ }
+ else
+ {
+ /* right justify */
+ if (len < width)
+ appendStringInfoSpaces(buf, width - len);
+ appendStringInfoString(buf, str);
+ }
+}
+
+/*
+ * text_format_nv - nonvariadic wrapper for text_format function.
+ *
+ * note: this wrapper is necessary to pass the sanity check in opr_sanity,
+ * which checks that all built-in functions that share the implementing C
+ * function take the same number of arguments.
+ */
+Datum
+text_format_nv(PG_FUNCTION_ARGS)
+{
+ return text_format(fcinfo);
+}
+
+/*
+ * Helper function for Levenshtein distance functions. Faster than memcmp(),
+ * for this use case.
+ */
+static inline bool
+rest_of_char_same(const char *s1, const char *s2, int len)
+{
+ while (len > 0)
+ {
+ len--;
+ if (s1[len] != s2[len])
+ return false;
+ }
+ return true;
+}
+
+/* Expand each Levenshtein distance variant */
+#include "levenshtein.c"
+#define LEVENSHTEIN_LESS_EQUAL
+#include "levenshtein.c"
+
+
+/*
+ * Unicode support
+ */
+
+static UnicodeNormalizationForm
+unicode_norm_form_from_string(const char *formstr)
+{
+ UnicodeNormalizationForm form = -1;
+
+ /*
+ * Might as well check this while we're here.
+ */
+ if (GetDatabaseEncoding() != PG_UTF8)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("Unicode normalization can only be performed if server encoding is UTF8")));
+
+ if (pg_strcasecmp(formstr, "NFC") == 0)
+ form = UNICODE_NFC;
+ else if (pg_strcasecmp(formstr, "NFD") == 0)
+ form = UNICODE_NFD;
+ else if (pg_strcasecmp(formstr, "NFKC") == 0)
+ form = UNICODE_NFKC;
+ else if (pg_strcasecmp(formstr, "NFKD") == 0)
+ form = UNICODE_NFKD;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid normalization form: %s", formstr)));
+
+ return form;
+}
+
+Datum
+unicode_normalize_func(PG_FUNCTION_ARGS)
+{
+ text *input = PG_GETARG_TEXT_PP(0);
+ char *formstr = text_to_cstring(PG_GETARG_TEXT_PP(1));
+ UnicodeNormalizationForm form;
+ int size;
+ pg_wchar *input_chars;
+ pg_wchar *output_chars;
+ unsigned char *p;
+ text *result;
+ int i;
+
+ form = unicode_norm_form_from_string(formstr);
+
+ /* convert to pg_wchar */
+ size = pg_mbstrlen_with_len(VARDATA_ANY(input), VARSIZE_ANY_EXHDR(input));
+ input_chars = palloc((size + 1) * sizeof(pg_wchar));
+ p = (unsigned char *) VARDATA_ANY(input);
+ for (i = 0; i < size; i++)
+ {
+ input_chars[i] = utf8_to_unicode(p);
+ p += pg_utf_mblen(p);
+ }
+ input_chars[i] = (pg_wchar) '\0';
+ Assert((char *) p == VARDATA_ANY(input) + VARSIZE_ANY_EXHDR(input));
+
+ /* action */
+ output_chars = unicode_normalize(form, input_chars);
+
+ /* convert back to UTF-8 string */
+ size = 0;
+ for (pg_wchar *wp = output_chars; *wp; wp++)
+ {
+ unsigned char buf[4];
+
+ unicode_to_utf8(*wp, buf);
+ size += pg_utf_mblen(buf);
+ }
+
+ result = palloc(size + VARHDRSZ);
+ SET_VARSIZE(result, size + VARHDRSZ);
+
+ p = (unsigned char *) VARDATA_ANY(result);
+ for (pg_wchar *wp = output_chars; *wp; wp++)
+ {
+ unicode_to_utf8(*wp, p);
+ p += pg_utf_mblen(p);
+ }
+ Assert((char *) p == (char *) result + size + VARHDRSZ);
+
+ PG_RETURN_TEXT_P(result);
+}
+
+/*
+ * Check whether the string is in the specified Unicode normalization form.
+ *
+ * This is done by converting the string to the specified normal form and then
+ * comparing that to the original string. To speed that up, we also apply the
+ * "quick check" algorithm specified in UAX #15, which can give a yes or no
+ * answer for many strings by just scanning the string once.
+ *
+ * This function should generally be optimized for the case where the string
+ * is in fact normalized. In that case, we'll end up looking at the entire
+ * string, so it's probably not worth doing any incremental conversion etc.
+ */
+Datum
+unicode_is_normalized(PG_FUNCTION_ARGS)
+{
+ text *input = PG_GETARG_TEXT_PP(0);
+ char *formstr = text_to_cstring(PG_GETARG_TEXT_PP(1));
+ UnicodeNormalizationForm form;
+ int size;
+ pg_wchar *input_chars;
+ pg_wchar *output_chars;
+ unsigned char *p;
+ int i;
+ UnicodeNormalizationQC quickcheck;
+ int output_size;
+ bool result;
+
+ form = unicode_norm_form_from_string(formstr);
+
+ /* convert to pg_wchar */
+ size = pg_mbstrlen_with_len(VARDATA_ANY(input), VARSIZE_ANY_EXHDR(input));
+ input_chars = palloc((size + 1) * sizeof(pg_wchar));
+ p = (unsigned char *) VARDATA_ANY(input);
+ for (i = 0; i < size; i++)
+ {
+ input_chars[i] = utf8_to_unicode(p);
+ p += pg_utf_mblen(p);
+ }
+ input_chars[i] = (pg_wchar) '\0';
+ Assert((char *) p == VARDATA_ANY(input) + VARSIZE_ANY_EXHDR(input));
+
+ /* quick check (see UAX #15) */
+ quickcheck = unicode_is_normalized_quickcheck(form, input_chars);
+ if (quickcheck == UNICODE_NORM_QC_YES)
+ PG_RETURN_BOOL(true);
+ else if (quickcheck == UNICODE_NORM_QC_NO)
+ PG_RETURN_BOOL(false);
+
+ /* normalize and compare with original */
+ output_chars = unicode_normalize(form, input_chars);
+
+ output_size = 0;
+ for (pg_wchar *wp = output_chars; *wp; wp++)
+ output_size++;
+
+ result = (size == output_size) &&
+ (memcmp(input_chars, output_chars, size * sizeof(pg_wchar)) == 0);
+
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * Check if first n chars are hexadecimal digits
+ */
+static bool
+isxdigits_n(const char *instr, size_t n)
+{
+ for (size_t i = 0; i < n; i++)
+ if (!isxdigit((unsigned char) instr[i]))
+ return false;
+
+ return true;
+}
+
+static unsigned int
+hexval(unsigned char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 0xA;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 0xA;
+ elog(ERROR, "invalid hexadecimal digit");
+ return 0; /* not reached */
+}
+
+/*
+ * Translate string with hexadecimal digits to number
+ */
+static unsigned int
+hexval_n(const char *instr, size_t n)
+{
+ unsigned int result = 0;
+
+ for (size_t i = 0; i < n; i++)
+ result += hexval(instr[i]) << (4 * (n - i - 1));
+
+ return result;
+}
+
+/*
+ * Replaces Unicode escape sequences by Unicode characters
+ */
+Datum
+unistr(PG_FUNCTION_ARGS)
+{
+ text *input_text = PG_GETARG_TEXT_PP(0);
+ char *instr;
+ int len;
+ StringInfoData str;
+ text *result;
+ pg_wchar pair_first = 0;
+ char cbuf[MAX_UNICODE_EQUIVALENT_STRING + 1];
+
+ instr = VARDATA_ANY(input_text);
+ len = VARSIZE_ANY_EXHDR(input_text);
+
+ initStringInfo(&str);
+
+ while (len > 0)
+ {
+ if (instr[0] == '\\')
+ {
+ if (len >= 2 &&
+ instr[1] == '\\')
+ {
+ if (pair_first)
+ goto invalid_pair;
+ appendStringInfoChar(&str, '\\');
+ instr += 2;
+ len -= 2;
+ }
+ else if ((len >= 5 && isxdigits_n(instr + 1, 4)) ||
+ (len >= 6 && instr[1] == 'u' && isxdigits_n(instr + 2, 4)))
+ {
+ pg_wchar unicode;
+ int offset = instr[1] == 'u' ? 2 : 1;
+
+ unicode = hexval_n(instr + offset, 4);
+
+ if (!is_valid_unicode_codepoint(unicode))
+ ereport(ERROR,
+ errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid Unicode code point: %04X", unicode));
+
+ if (pair_first)
+ {
+ if (is_utf16_surrogate_second(unicode))
+ {
+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);
+ pair_first = 0;
+ }
+ else
+ goto invalid_pair;
+ }
+ else if (is_utf16_surrogate_second(unicode))
+ goto invalid_pair;
+
+ if (is_utf16_surrogate_first(unicode))
+ pair_first = unicode;
+ else
+ {
+ pg_unicode_to_server(unicode, (unsigned char *) cbuf);
+ appendStringInfoString(&str, cbuf);
+ }
+
+ instr += 4 + offset;
+ len -= 4 + offset;
+ }
+ else if (len >= 8 && instr[1] == '+' && isxdigits_n(instr + 2, 6))
+ {
+ pg_wchar unicode;
+
+ unicode = hexval_n(instr + 2, 6);
+
+ if (!is_valid_unicode_codepoint(unicode))
+ ereport(ERROR,
+ errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid Unicode code point: %04X", unicode));
+
+ if (pair_first)
+ {
+ if (is_utf16_surrogate_second(unicode))
+ {
+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);
+ pair_first = 0;
+ }
+ else
+ goto invalid_pair;
+ }
+ else if (is_utf16_surrogate_second(unicode))
+ goto invalid_pair;
+
+ if (is_utf16_surrogate_first(unicode))
+ pair_first = unicode;
+ else
+ {
+ pg_unicode_to_server(unicode, (unsigned char *) cbuf);
+ appendStringInfoString(&str, cbuf);
+ }
+
+ instr += 8;
+ len -= 8;
+ }
+ else if (len >= 10 && instr[1] == 'U' && isxdigits_n(instr + 2, 8))
+ {
+ pg_wchar unicode;
+
+ unicode = hexval_n(instr + 2, 8);
+
+ if (!is_valid_unicode_codepoint(unicode))
+ ereport(ERROR,
+ errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid Unicode code point: %04X", unicode));
+
+ if (pair_first)
+ {
+ if (is_utf16_surrogate_second(unicode))
+ {
+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);
+ pair_first = 0;
+ }
+ else
+ goto invalid_pair;
+ }
+ else if (is_utf16_surrogate_second(unicode))
+ goto invalid_pair;
+
+ if (is_utf16_surrogate_first(unicode))
+ pair_first = unicode;
+ else
+ {
+ pg_unicode_to_server(unicode, (unsigned char *) cbuf);
+ appendStringInfoString(&str, cbuf);
+ }
+
+ instr += 10;
+ len -= 10;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid Unicode escape"),
+ errhint("Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX.")));
+ }
+ else
+ {
+ if (pair_first)
+ goto invalid_pair;
+
+ appendStringInfoChar(&str, *instr++);
+ len--;
+ }
+ }
+
+ /* unfinished surrogate pair? */
+ if (pair_first)
+ goto invalid_pair;
+
+ result = cstring_to_text_with_len(str.data, str.len);
+ pfree(str.data);
+
+ PG_RETURN_TEXT_P(result);
+
+invalid_pair:
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid Unicode surrogate pair")));
+ PG_RETURN_NULL(); /* keep compiler quiet */
+}
diff --git a/src/backend/utils/adt/version.c b/src/backend/utils/adt/version.c
new file mode 100644
index 0000000..044ffc9
--- /dev/null
+++ b/src/backend/utils/adt/version.c
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * version.c
+ * Returns the PostgreSQL version string
+ *
+ * Copyright (c) 1998-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ *
+ * src/backend/utils/adt/version.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/builtins.h"
+
+
+Datum
+pgsql_version(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_TEXT_P(cstring_to_text(PG_VERSION_STR));
+}
diff --git a/src/backend/utils/adt/windowfuncs.c b/src/backend/utils/adt/windowfuncs.c
new file mode 100644
index 0000000..596564f
--- /dev/null
+++ b/src/backend/utils/adt/windowfuncs.c
@@ -0,0 +1,537 @@
+/*-------------------------------------------------------------------------
+ *
+ * windowfuncs.c
+ * Standard window functions defined in SQL spec.
+ *
+ * Portions Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/windowfuncs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "nodes/supportnodes.h"
+#include "utils/builtins.h"
+#include "windowapi.h"
+
+/*
+ * ranking process information
+ */
+typedef struct rank_context
+{
+ int64 rank; /* current rank */
+} rank_context;
+
+/*
+ * ntile process information
+ */
+typedef struct
+{
+ int32 ntile; /* current result */
+ int64 rows_per_bucket; /* row number of current bucket */
+ int64 boundary; /* how many rows should be in the bucket */
+ int64 remainder; /* (total rows) % (bucket num) */
+} ntile_context;
+
+static bool rank_up(WindowObject winobj);
+static Datum leadlag_common(FunctionCallInfo fcinfo,
+ bool forward, bool withoffset, bool withdefault);
+
+
+/*
+ * utility routine for *_rank functions.
+ */
+static bool
+rank_up(WindowObject winobj)
+{
+ bool up = false; /* should rank increase? */
+ int64 curpos = WinGetCurrentPosition(winobj);
+ rank_context *context;
+
+ context = (rank_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(rank_context));
+
+ if (context->rank == 0)
+ {
+ /* first call: rank of first row is always 1 */
+ Assert(curpos == 0);
+ context->rank = 1;
+ }
+ else
+ {
+ Assert(curpos > 0);
+ /* do current and prior tuples match by ORDER BY clause? */
+ if (!WinRowsArePeers(winobj, curpos - 1, curpos))
+ up = true;
+ }
+
+ /* We can advance the mark, but only *after* access to prior row */
+ WinSetMarkPosition(winobj, curpos);
+
+ return up;
+}
+
+
+/*
+ * row_number
+ * just increment up from 1 until current partition finishes.
+ */
+Datum
+window_row_number(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ int64 curpos = WinGetCurrentPosition(winobj);
+
+ WinSetMarkPosition(winobj, curpos);
+ PG_RETURN_INT64(curpos + 1);
+}
+
+/*
+ * window_row_number_support
+ * prosupport function for window_row_number()
+ */
+Datum
+window_row_number_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ if (IsA(rawreq, SupportRequestWFuncMonotonic))
+ {
+ SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq;
+
+ /* row_number() is monotonically increasing */
+ req->monotonic = MONOTONICFUNC_INCREASING;
+ PG_RETURN_POINTER(req);
+ }
+
+ PG_RETURN_POINTER(NULL);
+}
+
+/*
+ * rank
+ * Rank changes when key columns change.
+ * The new rank number is the current row number.
+ */
+Datum
+window_rank(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ rank_context *context;
+ bool up;
+
+ up = rank_up(winobj);
+ context = (rank_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(rank_context));
+ if (up)
+ context->rank = WinGetCurrentPosition(winobj) + 1;
+
+ PG_RETURN_INT64(context->rank);
+}
+
+/*
+ * window_rank_support
+ * prosupport function for window_rank()
+ */
+Datum
+window_rank_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ if (IsA(rawreq, SupportRequestWFuncMonotonic))
+ {
+ SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq;
+
+ /* rank() is monotonically increasing */
+ req->monotonic = MONOTONICFUNC_INCREASING;
+ PG_RETURN_POINTER(req);
+ }
+
+ PG_RETURN_POINTER(NULL);
+}
+
+/*
+ * dense_rank
+ * Rank increases by 1 when key columns change.
+ */
+Datum
+window_dense_rank(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ rank_context *context;
+ bool up;
+
+ up = rank_up(winobj);
+ context = (rank_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(rank_context));
+ if (up)
+ context->rank++;
+
+ PG_RETURN_INT64(context->rank);
+}
+
+/*
+ * window_dense_rank_support
+ * prosupport function for window_dense_rank()
+ */
+Datum
+window_dense_rank_support(PG_FUNCTION_ARGS)
+{
+ Node *rawreq = (Node *) PG_GETARG_POINTER(0);
+
+ if (IsA(rawreq, SupportRequestWFuncMonotonic))
+ {
+ SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq;
+
+ /* dense_rank() is monotonically increasing */
+ req->monotonic = MONOTONICFUNC_INCREASING;
+ PG_RETURN_POINTER(req);
+ }
+
+ PG_RETURN_POINTER(NULL);
+}
+
+/*
+ * percent_rank
+ * return fraction between 0 and 1 inclusive,
+ * which is described as (RK - 1) / (NR - 1), where RK is the current row's
+ * rank and NR is the total number of rows, per spec.
+ */
+Datum
+window_percent_rank(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ rank_context *context;
+ bool up;
+ int64 totalrows = WinGetPartitionRowCount(winobj);
+
+ Assert(totalrows > 0);
+
+ up = rank_up(winobj);
+ context = (rank_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(rank_context));
+ if (up)
+ context->rank = WinGetCurrentPosition(winobj) + 1;
+
+ /* return zero if there's only one row, per spec */
+ if (totalrows <= 1)
+ PG_RETURN_FLOAT8(0.0);
+
+ PG_RETURN_FLOAT8((float8) (context->rank - 1) / (float8) (totalrows - 1));
+}
+
+/*
+ * cume_dist
+ * return fraction between 0 and 1 inclusive,
+ * which is described as NP / NR, where NP is the number of rows preceding or
+ * peers to the current row, and NR is the total number of rows, per spec.
+ */
+Datum
+window_cume_dist(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ rank_context *context;
+ bool up;
+ int64 totalrows = WinGetPartitionRowCount(winobj);
+
+ Assert(totalrows > 0);
+
+ up = rank_up(winobj);
+ context = (rank_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(rank_context));
+ if (up || context->rank == 1)
+ {
+ /*
+ * The current row is not peer to prior row or is just the first, so
+ * count up the number of rows that are peer to the current.
+ */
+ int64 row;
+
+ context->rank = WinGetCurrentPosition(winobj) + 1;
+
+ /*
+ * start from current + 1
+ */
+ for (row = context->rank; row < totalrows; row++)
+ {
+ if (!WinRowsArePeers(winobj, row - 1, row))
+ break;
+ context->rank++;
+ }
+ }
+
+ PG_RETURN_FLOAT8((float8) context->rank / (float8) totalrows);
+}
+
+/*
+ * ntile
+ * compute an exact numeric value with scale 0 (zero),
+ * ranging from 1 (one) to n, per spec.
+ */
+Datum
+window_ntile(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ ntile_context *context;
+
+ context = (ntile_context *)
+ WinGetPartitionLocalMemory(winobj, sizeof(ntile_context));
+
+ if (context->ntile == 0)
+ {
+ /* first call */
+ int64 total;
+ int32 nbuckets;
+ bool isnull;
+
+ total = WinGetPartitionRowCount(winobj);
+ nbuckets = DatumGetInt32(WinGetFuncArgCurrent(winobj, 0, &isnull));
+
+ /*
+ * per spec: If NT is the null value, then the result is the null
+ * value.
+ */
+ if (isnull)
+ PG_RETURN_NULL();
+
+ /*
+ * per spec: If NT is less than or equal to 0 (zero), then an
+ * exception condition is raised.
+ */
+ if (nbuckets <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_NTILE),
+ errmsg("argument of ntile must be greater than zero")));
+
+ context->ntile = 1;
+ context->rows_per_bucket = 0;
+ context->boundary = total / nbuckets;
+ if (context->boundary <= 0)
+ context->boundary = 1;
+ else
+ {
+ /*
+ * If the total number is not divisible, add 1 row to leading
+ * buckets.
+ */
+ context->remainder = total % nbuckets;
+ if (context->remainder != 0)
+ context->boundary++;
+ }
+ }
+
+ context->rows_per_bucket++;
+ if (context->boundary < context->rows_per_bucket)
+ {
+ /* ntile up */
+ if (context->remainder != 0 && context->ntile == context->remainder)
+ {
+ context->remainder = 0;
+ context->boundary -= 1;
+ }
+ context->ntile += 1;
+ context->rows_per_bucket = 1;
+ }
+
+ PG_RETURN_INT32(context->ntile);
+}
+
+/*
+ * leadlag_common
+ * common operation of lead() and lag()
+ * For lead() forward is true, whereas for lag() it is false.
+ * withoffset indicates we have an offset second argument.
+ * withdefault indicates we have a default third argument.
+ */
+static Datum
+leadlag_common(FunctionCallInfo fcinfo,
+ bool forward, bool withoffset, bool withdefault)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ int32 offset;
+ bool const_offset;
+ Datum result;
+ bool isnull;
+ bool isout;
+
+ if (withoffset)
+ {
+ offset = DatumGetInt32(WinGetFuncArgCurrent(winobj, 1, &isnull));
+ if (isnull)
+ PG_RETURN_NULL();
+ const_offset = get_fn_expr_arg_stable(fcinfo->flinfo, 1);
+ }
+ else
+ {
+ offset = 1;
+ const_offset = true;
+ }
+
+ result = WinGetFuncArgInPartition(winobj, 0,
+ (forward ? offset : -offset),
+ WINDOW_SEEK_CURRENT,
+ const_offset,
+ &isnull, &isout);
+
+ if (isout)
+ {
+ /*
+ * target row is out of the partition; supply default value if
+ * provided. otherwise it'll stay NULL
+ */
+ if (withdefault)
+ result = WinGetFuncArgCurrent(winobj, 2, &isnull);
+ }
+
+ if (isnull)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * lag
+ * returns the value of VE evaluated on a row that is 1
+ * row before the current row within a partition,
+ * per spec.
+ */
+Datum
+window_lag(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, false, false, false);
+}
+
+/*
+ * lag_with_offset
+ * returns the value of VE evaluated on a row that is OFFSET
+ * rows before the current row within a partition,
+ * per spec.
+ */
+Datum
+window_lag_with_offset(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, false, true, false);
+}
+
+/*
+ * lag_with_offset_and_default
+ * same as lag_with_offset but accepts default value
+ * as its third argument.
+ */
+Datum
+window_lag_with_offset_and_default(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, false, true, true);
+}
+
+/*
+ * lead
+ * returns the value of VE evaluated on a row that is 1
+ * row after the current row within a partition,
+ * per spec.
+ */
+Datum
+window_lead(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, true, false, false);
+}
+
+/*
+ * lead_with_offset
+ * returns the value of VE evaluated on a row that is OFFSET
+ * number of rows after the current row within a partition,
+ * per spec.
+ */
+Datum
+window_lead_with_offset(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, true, true, false);
+}
+
+/*
+ * lead_with_offset_and_default
+ * same as lead_with_offset but accepts default value
+ * as its third argument.
+ */
+Datum
+window_lead_with_offset_and_default(PG_FUNCTION_ARGS)
+{
+ return leadlag_common(fcinfo, true, true, true);
+}
+
+/*
+ * first_value
+ * return the value of VE evaluated on the first row of the
+ * window frame, per spec.
+ */
+Datum
+window_first_value(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ Datum result;
+ bool isnull;
+
+ result = WinGetFuncArgInFrame(winobj, 0,
+ 0, WINDOW_SEEK_HEAD, true,
+ &isnull, NULL);
+ if (isnull)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * last_value
+ * return the value of VE evaluated on the last row of the
+ * window frame, per spec.
+ */
+Datum
+window_last_value(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ Datum result;
+ bool isnull;
+
+ result = WinGetFuncArgInFrame(winobj, 0,
+ 0, WINDOW_SEEK_TAIL, true,
+ &isnull, NULL);
+ if (isnull)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * nth_value
+ * return the value of VE evaluated on the n-th row from the first
+ * row of the window frame, per spec.
+ */
+Datum
+window_nth_value(PG_FUNCTION_ARGS)
+{
+ WindowObject winobj = PG_WINDOW_OBJECT();
+ bool const_offset;
+ Datum result;
+ bool isnull;
+ int32 nth;
+
+ nth = DatumGetInt32(WinGetFuncArgCurrent(winobj, 1, &isnull));
+ if (isnull)
+ PG_RETURN_NULL();
+ const_offset = get_fn_expr_arg_stable(fcinfo->flinfo, 1);
+
+ if (nth <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE),
+ errmsg("argument of nth_value must be greater than zero")));
+
+ result = WinGetFuncArgInFrame(winobj, 0,
+ nth - 1, WINDOW_SEEK_HEAD, const_offset,
+ &isnull, NULL);
+ if (isnull)
+ PG_RETURN_NULL();
+
+ PG_RETURN_DATUM(result);
+}
diff --git a/src/backend/utils/adt/xid.c b/src/backend/utils/adt/xid.c
new file mode 100644
index 0000000..e4b4952
--- /dev/null
+++ b/src/backend/utils/adt/xid.c
@@ -0,0 +1,373 @@
+/*-------------------------------------------------------------------------
+ *
+ * xid.c
+ * POSTGRES transaction identifier and command identifier datatypes.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/xid.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/multixact.h"
+#include "access/transam.h"
+#include "access/xact.h"
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+#include "utils/xid8.h"
+
+#define PG_GETARG_COMMANDID(n) DatumGetCommandId(PG_GETARG_DATUM(n))
+#define PG_RETURN_COMMANDID(x) return CommandIdGetDatum(x)
+
+
+Datum
+xidin(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_TRANSACTIONID((TransactionId) strtoul(str, NULL, 0));
+}
+
+Datum
+xidout(PG_FUNCTION_ARGS)
+{
+ TransactionId transactionId = PG_GETARG_TRANSACTIONID(0);
+ char *result = (char *) palloc(16);
+
+ snprintf(result, 16, "%lu", (unsigned long) transactionId);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * xidrecv - converts external binary format to xid
+ */
+Datum
+xidrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_TRANSACTIONID((TransactionId) pq_getmsgint(buf, sizeof(TransactionId)));
+}
+
+/*
+ * xidsend - converts xid to binary format
+ */
+Datum
+xidsend(PG_FUNCTION_ARGS)
+{
+ TransactionId arg1 = PG_GETARG_TRANSACTIONID(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * xideq - are two xids equal?
+ */
+Datum
+xideq(PG_FUNCTION_ARGS)
+{
+ TransactionId xid1 = PG_GETARG_TRANSACTIONID(0);
+ TransactionId xid2 = PG_GETARG_TRANSACTIONID(1);
+
+ PG_RETURN_BOOL(TransactionIdEquals(xid1, xid2));
+}
+
+/*
+ * xidneq - are two xids different?
+ */
+Datum
+xidneq(PG_FUNCTION_ARGS)
+{
+ TransactionId xid1 = PG_GETARG_TRANSACTIONID(0);
+ TransactionId xid2 = PG_GETARG_TRANSACTIONID(1);
+
+ PG_RETURN_BOOL(!TransactionIdEquals(xid1, xid2));
+}
+
+/*
+ * xid_age - compute age of an XID (relative to latest stable xid)
+ */
+Datum
+xid_age(PG_FUNCTION_ARGS)
+{
+ TransactionId xid = PG_GETARG_TRANSACTIONID(0);
+ TransactionId now = GetStableLatestTransactionId();
+
+ /* Permanent XIDs are always infinitely old */
+ if (!TransactionIdIsNormal(xid))
+ PG_RETURN_INT32(INT_MAX);
+
+ PG_RETURN_INT32((int32) (now - xid));
+}
+
+/*
+ * mxid_age - compute age of a multi XID (relative to latest stable mxid)
+ */
+Datum
+mxid_age(PG_FUNCTION_ARGS)
+{
+ TransactionId xid = PG_GETARG_TRANSACTIONID(0);
+ MultiXactId now = ReadNextMultiXactId();
+
+ if (!MultiXactIdIsValid(xid))
+ PG_RETURN_INT32(INT_MAX);
+
+ PG_RETURN_INT32((int32) (now - xid));
+}
+
+/*
+ * xidComparator
+ * qsort comparison function for XIDs
+ *
+ * We can't use wraparound comparison for XIDs because that does not respect
+ * the triangle inequality! Any old sort order will do.
+ */
+int
+xidComparator(const void *arg1, const void *arg2)
+{
+ TransactionId xid1 = *(const TransactionId *) arg1;
+ TransactionId xid2 = *(const TransactionId *) arg2;
+
+ if (xid1 > xid2)
+ return 1;
+ if (xid1 < xid2)
+ return -1;
+ return 0;
+}
+
+/*
+ * xidLogicalComparator
+ * qsort comparison function for XIDs
+ *
+ * This is used to compare only XIDs from the same epoch (e.g. for backends
+ * running at the same time). So there must be only normal XIDs, so there's
+ * no issue with triangle inequality.
+ */
+int
+xidLogicalComparator(const void *arg1, const void *arg2)
+{
+ TransactionId xid1 = *(const TransactionId *) arg1;
+ TransactionId xid2 = *(const TransactionId *) arg2;
+
+ Assert(TransactionIdIsNormal(xid1));
+ Assert(TransactionIdIsNormal(xid2));
+
+ if (TransactionIdPrecedes(xid1, xid2))
+ return -1;
+
+ if (TransactionIdPrecedes(xid2, xid1))
+ return 1;
+
+ return 0;
+}
+
+Datum
+xid8toxid(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid = PG_GETARG_FULLTRANSACTIONID(0);
+
+ PG_RETURN_TRANSACTIONID(XidFromFullTransactionId(fxid));
+}
+
+Datum
+xid8in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_FULLTRANSACTIONID(FullTransactionIdFromU64(strtou64(str, NULL, 0)));
+}
+
+Datum
+xid8out(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid = PG_GETARG_FULLTRANSACTIONID(0);
+ char *result = (char *) palloc(21);
+
+ snprintf(result, 21, UINT64_FORMAT, U64FromFullTransactionId(fxid));
+ PG_RETURN_CSTRING(result);
+}
+
+Datum
+xid8recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ uint64 value;
+
+ value = (uint64) pq_getmsgint64(buf);
+ PG_RETURN_FULLTRANSACTIONID(FullTransactionIdFromU64(value));
+}
+
+Datum
+xid8send(PG_FUNCTION_ARGS)
+{
+ FullTransactionId arg1 = PG_GETARG_FULLTRANSACTIONID(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint64(&buf, (uint64) U64FromFullTransactionId(arg1));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+xid8eq(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(FullTransactionIdEquals(fxid1, fxid2));
+}
+
+Datum
+xid8ne(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(!FullTransactionIdEquals(fxid1, fxid2));
+}
+
+Datum
+xid8lt(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(FullTransactionIdPrecedes(fxid1, fxid2));
+}
+
+Datum
+xid8gt(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(FullTransactionIdFollows(fxid1, fxid2));
+}
+
+Datum
+xid8le(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(FullTransactionIdPrecedesOrEquals(fxid1, fxid2));
+}
+
+Datum
+xid8ge(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ PG_RETURN_BOOL(FullTransactionIdFollowsOrEquals(fxid1, fxid2));
+}
+
+Datum
+xid8cmp(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ if (FullTransactionIdFollows(fxid1, fxid2))
+ PG_RETURN_INT32(1);
+ else if (FullTransactionIdEquals(fxid1, fxid2))
+ PG_RETURN_INT32(0);
+ else
+ PG_RETURN_INT32(-1);
+}
+
+Datum
+xid8_larger(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ if (FullTransactionIdFollows(fxid1, fxid2))
+ PG_RETURN_FULLTRANSACTIONID(fxid1);
+ else
+ PG_RETURN_FULLTRANSACTIONID(fxid2);
+}
+
+Datum
+xid8_smaller(PG_FUNCTION_ARGS)
+{
+ FullTransactionId fxid1 = PG_GETARG_FULLTRANSACTIONID(0);
+ FullTransactionId fxid2 = PG_GETARG_FULLTRANSACTIONID(1);
+
+ if (FullTransactionIdPrecedes(fxid1, fxid2))
+ PG_RETURN_FULLTRANSACTIONID(fxid1);
+ else
+ PG_RETURN_FULLTRANSACTIONID(fxid2);
+}
+
+/*****************************************************************************
+ * COMMAND IDENTIFIER ROUTINES *
+ *****************************************************************************/
+
+/*
+ * cidin - converts CommandId to internal representation.
+ */
+Datum
+cidin(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+
+ PG_RETURN_COMMANDID((CommandId) strtoul(str, NULL, 0));
+}
+
+/*
+ * cidout - converts a cid to external representation.
+ */
+Datum
+cidout(PG_FUNCTION_ARGS)
+{
+ CommandId c = PG_GETARG_COMMANDID(0);
+ char *result = (char *) palloc(16);
+
+ snprintf(result, 16, "%lu", (unsigned long) c);
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * cidrecv - converts external binary format to cid
+ */
+Datum
+cidrecv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+
+ PG_RETURN_COMMANDID((CommandId) pq_getmsgint(buf, sizeof(CommandId)));
+}
+
+/*
+ * cidsend - converts cid to binary format
+ */
+Datum
+cidsend(PG_FUNCTION_ARGS)
+{
+ CommandId arg1 = PG_GETARG_COMMANDID(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, arg1);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+Datum
+cideq(PG_FUNCTION_ARGS)
+{
+ CommandId arg1 = PG_GETARG_COMMANDID(0);
+ CommandId arg2 = PG_GETARG_COMMANDID(1);
+
+ PG_RETURN_BOOL(arg1 == arg2);
+}
diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c
new file mode 100644
index 0000000..d8e40b3
--- /dev/null
+++ b/src/backend/utils/adt/xid8funcs.c
@@ -0,0 +1,708 @@
+/*-------------------------------------------------------------------------
+ * xid8funcs.c
+ *
+ * Export internal transaction IDs to user level.
+ *
+ * Note that only top-level transaction IDs are exposed to user sessions.
+ * This is important because xid8s frequently persist beyond the global
+ * xmin horizon, or may even be shipped to other machines, so we cannot
+ * rely on being able to correlate subtransaction IDs with their parents
+ * via functions such as SubTransGetTopmostTransaction().
+ *
+ * These functions are used to support the txid_XXX functions and the newer
+ * pg_current_xact, pg_current_snapshot and related fmgr functions, since the
+ * only difference between them is whether they expose xid8 or int8 values to
+ * users. The txid_XXX variants should eventually be dropped.
+ *
+ *
+ * Copyright (c) 2003-2022, PostgreSQL Global Development Group
+ * Author: Jan Wieck, Afilias USA INC.
+ * 64-bit txids: Marko Kreen, Skype Technologies
+ *
+ * src/backend/utils/adt/xid8funcs.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/clog.h"
+#include "access/transam.h"
+#include "access/xact.h"
+#include "access/xlog.h"
+#include "funcapi.h"
+#include "lib/qunique.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "postmaster/postmaster.h"
+#include "storage/lwlock.h"
+#include "storage/procarray.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/snapmgr.h"
+#include "utils/xid8.h"
+
+
+/*
+ * If defined, use bsearch() function for searching for xid8s in snapshots
+ * that have more than the specified number of values.
+ */
+#define USE_BSEARCH_IF_NXIP_GREATER 30
+
+
+/*
+ * Snapshot containing FullTransactionIds.
+ */
+typedef struct
+{
+ /*
+ * 4-byte length hdr, should not be touched directly.
+ *
+ * Explicit embedding is ok as we want always correct alignment anyway.
+ */
+ int32 __varsz;
+
+ uint32 nxip; /* number of fxids in xip array */
+ FullTransactionId xmin;
+ FullTransactionId xmax;
+ /* in-progress fxids, xmin <= xip[i] < xmax: */
+ FullTransactionId xip[FLEXIBLE_ARRAY_MEMBER];
+} pg_snapshot;
+
+#define PG_SNAPSHOT_SIZE(nxip) \
+ (offsetof(pg_snapshot, xip) + sizeof(FullTransactionId) * (nxip))
+#define PG_SNAPSHOT_MAX_NXIP \
+ ((MaxAllocSize - offsetof(pg_snapshot, xip)) / sizeof(FullTransactionId))
+
+/*
+ * Helper to get a TransactionId from a 64-bit xid with wraparound detection.
+ *
+ * It is an ERROR if the xid is in the future. Otherwise, returns true if
+ * the transaction is still new enough that we can determine whether it
+ * committed and false otherwise. If *extracted_xid is not NULL, it is set
+ * to the low 32 bits of the transaction ID (i.e. the actual XID, without the
+ * epoch).
+ *
+ * The caller must hold XactTruncationLock since it's dealing with arbitrary
+ * XIDs, and must continue to hold it until it's done with any clog lookups
+ * relating to those XIDs.
+ */
+static bool
+TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid)
+{
+ uint32 xid_epoch = EpochFromFullTransactionId(fxid);
+ TransactionId xid = XidFromFullTransactionId(fxid);
+ uint32 now_epoch;
+ TransactionId now_epoch_next_xid;
+ FullTransactionId now_fullxid;
+
+ now_fullxid = ReadNextFullTransactionId();
+ now_epoch_next_xid = XidFromFullTransactionId(now_fullxid);
+ now_epoch = EpochFromFullTransactionId(now_fullxid);
+
+ if (extracted_xid != NULL)
+ *extracted_xid = xid;
+
+ if (!TransactionIdIsValid(xid))
+ return false;
+
+ /* For non-normal transaction IDs, we can ignore the epoch. */
+ if (!TransactionIdIsNormal(xid))
+ return true;
+
+ /* If the transaction ID is in the future, throw an error. */
+ if (!FullTransactionIdPrecedes(fxid, now_fullxid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("transaction ID %llu is in the future",
+ (unsigned long long) U64FromFullTransactionId(fxid))));
+
+ /*
+ * ShmemVariableCache->oldestClogXid is protected by XactTruncationLock,
+ * but we don't acquire that lock here. Instead, we require the caller to
+ * acquire it, because the caller is presumably going to look up the
+ * returned XID. If we took and released the lock within this function, a
+ * CLOG truncation could occur before the caller finished with the XID.
+ */
+ Assert(LWLockHeldByMe(XactTruncationLock));
+
+ /*
+ * If the transaction ID has wrapped around, it's definitely too old to
+ * determine the commit status. Otherwise, we can compare it to
+ * ShmemVariableCache->oldestClogXid to determine whether the relevant
+ * CLOG entry is guaranteed to still exist.
+ */
+ if (xid_epoch + 1 < now_epoch
+ || (xid_epoch + 1 == now_epoch && xid < now_epoch_next_xid)
+ || TransactionIdPrecedes(xid, ShmemVariableCache->oldestClogXid))
+ return false;
+
+ return true;
+}
+
+/*
+ * Convert a TransactionId obtained from a snapshot held by the caller to a
+ * FullTransactionId. Use next_fxid as a reference FullTransactionId, so that
+ * we can compute the high order bits. It must have been obtained by the
+ * caller with ReadNextFullTransactionId() after the snapshot was created.
+ */
+static FullTransactionId
+widen_snapshot_xid(TransactionId xid, FullTransactionId next_fxid)
+{
+ TransactionId next_xid = XidFromFullTransactionId(next_fxid);
+ uint32 epoch = EpochFromFullTransactionId(next_fxid);
+
+ /* Special transaction ID. */
+ if (!TransactionIdIsNormal(xid))
+ return FullTransactionIdFromEpochAndXid(0, xid);
+
+ /*
+ * The 64 bit result must be <= next_fxid, since next_fxid hadn't been
+ * issued yet when the snapshot was created. Every TransactionId in the
+ * snapshot must therefore be from the same epoch as next_fxid, or the
+ * epoch before. We know this because next_fxid is never allow to get
+ * more than one epoch ahead of the TransactionIds in any snapshot.
+ */
+ if (xid > next_xid)
+ epoch--;
+
+ return FullTransactionIdFromEpochAndXid(epoch, xid);
+}
+
+/*
+ * txid comparator for qsort/bsearch
+ */
+static int
+cmp_fxid(const void *aa, const void *bb)
+{
+ FullTransactionId a = *(const FullTransactionId *) aa;
+ FullTransactionId b = *(const FullTransactionId *) bb;
+
+ if (FullTransactionIdPrecedes(a, b))
+ return -1;
+ if (FullTransactionIdPrecedes(b, a))
+ return 1;
+ return 0;
+}
+
+/*
+ * Sort a snapshot's txids, so we can use bsearch() later. Also remove
+ * any duplicates.
+ *
+ * For consistency of on-disk representation, we always sort even if bsearch
+ * will not be used.
+ */
+static void
+sort_snapshot(pg_snapshot *snap)
+{
+ if (snap->nxip > 1)
+ {
+ qsort(snap->xip, snap->nxip, sizeof(FullTransactionId), cmp_fxid);
+ snap->nxip = qunique(snap->xip, snap->nxip, sizeof(FullTransactionId),
+ cmp_fxid);
+ }
+}
+
+/*
+ * check fxid visibility.
+ */
+static bool
+is_visible_fxid(FullTransactionId value, const pg_snapshot *snap)
+{
+ if (FullTransactionIdPrecedes(value, snap->xmin))
+ return true;
+ else if (!FullTransactionIdPrecedes(value, snap->xmax))
+ return false;
+#ifdef USE_BSEARCH_IF_NXIP_GREATER
+ else if (snap->nxip > USE_BSEARCH_IF_NXIP_GREATER)
+ {
+ void *res;
+
+ res = bsearch(&value, snap->xip, snap->nxip, sizeof(FullTransactionId),
+ cmp_fxid);
+ /* if found, transaction is still in progress */
+ return (res) ? false : true;
+ }
+#endif
+ else
+ {
+ uint32 i;
+
+ for (i = 0; i < snap->nxip; i++)
+ {
+ if (FullTransactionIdEquals(value, snap->xip[i]))
+ return false;
+ }
+ return true;
+ }
+}
+
+/*
+ * helper functions to use StringInfo for pg_snapshot creation.
+ */
+
+static StringInfo
+buf_init(FullTransactionId xmin, FullTransactionId xmax)
+{
+ pg_snapshot snap;
+ StringInfo buf;
+
+ snap.xmin = xmin;
+ snap.xmax = xmax;
+ snap.nxip = 0;
+
+ buf = makeStringInfo();
+ appendBinaryStringInfo(buf, (char *) &snap, PG_SNAPSHOT_SIZE(0));
+ return buf;
+}
+
+static void
+buf_add_txid(StringInfo buf, FullTransactionId fxid)
+{
+ pg_snapshot *snap = (pg_snapshot *) buf->data;
+
+ /* do this before possible realloc */
+ snap->nxip++;
+
+ appendBinaryStringInfo(buf, (char *) &fxid, sizeof(fxid));
+}
+
+static pg_snapshot *
+buf_finalize(StringInfo buf)
+{
+ pg_snapshot *snap = (pg_snapshot *) buf->data;
+
+ SET_VARSIZE(snap, buf->len);
+
+ /* buf is not needed anymore */
+ buf->data = NULL;
+ pfree(buf);
+
+ return snap;
+}
+
+/*
+ * parse snapshot from cstring
+ */
+static pg_snapshot *
+parse_snapshot(const char *str)
+{
+ FullTransactionId xmin;
+ FullTransactionId xmax;
+ FullTransactionId last_val = InvalidFullTransactionId;
+ FullTransactionId val;
+ const char *str_start = str;
+ char *endp;
+ StringInfo buf;
+
+ xmin = FullTransactionIdFromU64(strtou64(str, &endp, 10));
+ if (*endp != ':')
+ goto bad_format;
+ str = endp + 1;
+
+ xmax = FullTransactionIdFromU64(strtou64(str, &endp, 10));
+ if (*endp != ':')
+ goto bad_format;
+ str = endp + 1;
+
+ /* it should look sane */
+ if (!FullTransactionIdIsValid(xmin) ||
+ !FullTransactionIdIsValid(xmax) ||
+ FullTransactionIdPrecedes(xmax, xmin))
+ goto bad_format;
+
+ /* allocate buffer */
+ buf = buf_init(xmin, xmax);
+
+ /* loop over values */
+ while (*str != '\0')
+ {
+ /* read next value */
+ val = FullTransactionIdFromU64(strtou64(str, &endp, 10));
+ str = endp;
+
+ /* require the input to be in order */
+ if (FullTransactionIdPrecedes(val, xmin) ||
+ FullTransactionIdFollowsOrEquals(val, xmax) ||
+ FullTransactionIdPrecedes(val, last_val))
+ goto bad_format;
+
+ /* skip duplicates */
+ if (!FullTransactionIdEquals(val, last_val))
+ buf_add_txid(buf, val);
+ last_val = val;
+
+ if (*str == ',')
+ str++;
+ else if (*str != '\0')
+ goto bad_format;
+ }
+
+ return buf_finalize(buf);
+
+bad_format:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type %s: \"%s\"",
+ "pg_snapshot", str_start)));
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * pg_current_xact_id() returns xid8
+ *
+ * Return the current toplevel full transaction ID.
+ * If the current transaction does not have one, one is assigned.
+ */
+Datum
+pg_current_xact_id(PG_FUNCTION_ARGS)
+{
+ /*
+ * Must prevent during recovery because if an xid is not assigned we try
+ * to assign one, which would fail. Programs already rely on this function
+ * to always return a valid current xid, so we should not change this to
+ * return NULL or similar invalid xid.
+ */
+ PreventCommandDuringRecovery("pg_current_xact_id()");
+
+ PG_RETURN_FULLTRANSACTIONID(GetTopFullTransactionId());
+}
+
+/*
+ * Same as pg_current_xact_id() but doesn't assign a new xid if there
+ * isn't one yet.
+ */
+Datum
+pg_current_xact_id_if_assigned(PG_FUNCTION_ARGS)
+{
+ FullTransactionId topfxid = GetTopFullTransactionIdIfAny();
+
+ if (!FullTransactionIdIsValid(topfxid))
+ PG_RETURN_NULL();
+
+ PG_RETURN_FULLTRANSACTIONID(topfxid);
+}
+
+/*
+ * pg_current_snapshot() returns pg_snapshot
+ *
+ * Return current snapshot
+ *
+ * Note that only top-transaction XIDs are included in the snapshot.
+ */
+Datum
+pg_current_snapshot(PG_FUNCTION_ARGS)
+{
+ pg_snapshot *snap;
+ uint32 nxip,
+ i;
+ Snapshot cur;
+ FullTransactionId next_fxid = ReadNextFullTransactionId();
+
+ cur = GetActiveSnapshot();
+ if (cur == NULL)
+ elog(ERROR, "no active snapshot set");
+
+ /*
+ * Compile-time limits on the procarray (MAX_BACKENDS processes plus
+ * MAX_BACKENDS prepared transactions) guarantee nxip won't be too large.
+ */
+ StaticAssertStmt(MAX_BACKENDS * 2 <= PG_SNAPSHOT_MAX_NXIP,
+ "possible overflow in pg_current_snapshot()");
+
+ /* allocate */
+ nxip = cur->xcnt;
+ snap = palloc(PG_SNAPSHOT_SIZE(nxip));
+
+ /* fill */
+ snap->xmin = widen_snapshot_xid(cur->xmin, next_fxid);
+ snap->xmax = widen_snapshot_xid(cur->xmax, next_fxid);
+ snap->nxip = nxip;
+ for (i = 0; i < nxip; i++)
+ snap->xip[i] = widen_snapshot_xid(cur->xip[i], next_fxid);
+
+ /*
+ * We want them guaranteed to be in ascending order. This also removes
+ * any duplicate xids. Normally, an XID can only be assigned to one
+ * backend, but when preparing a transaction for two-phase commit, there
+ * is a transient state when both the original backend and the dummy
+ * PGPROC entry reserved for the prepared transaction hold the same XID.
+ */
+ sort_snapshot(snap);
+
+ /* set size after sorting, because it may have removed duplicate xips */
+ SET_VARSIZE(snap, PG_SNAPSHOT_SIZE(snap->nxip));
+
+ PG_RETURN_POINTER(snap);
+}
+
+/*
+ * pg_snapshot_in(cstring) returns pg_snapshot
+ *
+ * input function for type pg_snapshot
+ */
+Datum
+pg_snapshot_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ pg_snapshot *snap;
+
+ snap = parse_snapshot(str);
+
+ PG_RETURN_POINTER(snap);
+}
+
+/*
+ * pg_snapshot_out(pg_snapshot) returns cstring
+ *
+ * output function for type pg_snapshot
+ */
+Datum
+pg_snapshot_out(PG_FUNCTION_ARGS)
+{
+ pg_snapshot *snap = (pg_snapshot *) PG_GETARG_VARLENA_P(0);
+ StringInfoData str;
+ uint32 i;
+
+ initStringInfo(&str);
+
+ appendStringInfo(&str, UINT64_FORMAT ":",
+ U64FromFullTransactionId(snap->xmin));
+ appendStringInfo(&str, UINT64_FORMAT ":",
+ U64FromFullTransactionId(snap->xmax));
+
+ for (i = 0; i < snap->nxip; i++)
+ {
+ if (i > 0)
+ appendStringInfoChar(&str, ',');
+ appendStringInfo(&str, UINT64_FORMAT,
+ U64FromFullTransactionId(snap->xip[i]));
+ }
+
+ PG_RETURN_CSTRING(str.data);
+}
+
+/*
+ * pg_snapshot_recv(internal) returns pg_snapshot
+ *
+ * binary input function for type pg_snapshot
+ *
+ * format: int4 nxip, int8 xmin, int8 xmax, int8 xip
+ */
+Datum
+pg_snapshot_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ pg_snapshot *snap;
+ FullTransactionId last = InvalidFullTransactionId;
+ int nxip;
+ int i;
+ FullTransactionId xmin;
+ FullTransactionId xmax;
+
+ /* load and validate nxip */
+ nxip = pq_getmsgint(buf, 4);
+ if (nxip < 0 || nxip > PG_SNAPSHOT_MAX_NXIP)
+ goto bad_format;
+
+ xmin = FullTransactionIdFromU64((uint64) pq_getmsgint64(buf));
+ xmax = FullTransactionIdFromU64((uint64) pq_getmsgint64(buf));
+ if (!FullTransactionIdIsValid(xmin) ||
+ !FullTransactionIdIsValid(xmax) ||
+ FullTransactionIdPrecedes(xmax, xmin))
+ goto bad_format;
+
+ snap = palloc(PG_SNAPSHOT_SIZE(nxip));
+ snap->xmin = xmin;
+ snap->xmax = xmax;
+
+ for (i = 0; i < nxip; i++)
+ {
+ FullTransactionId cur =
+ FullTransactionIdFromU64((uint64) pq_getmsgint64(buf));
+
+ if (FullTransactionIdPrecedes(cur, last) ||
+ FullTransactionIdPrecedes(cur, xmin) ||
+ FullTransactionIdPrecedes(xmax, cur))
+ goto bad_format;
+
+ /* skip duplicate xips */
+ if (FullTransactionIdEquals(cur, last))
+ {
+ i--;
+ nxip--;
+ continue;
+ }
+
+ snap->xip[i] = cur;
+ last = cur;
+ }
+ snap->nxip = nxip;
+ SET_VARSIZE(snap, PG_SNAPSHOT_SIZE(nxip));
+ PG_RETURN_POINTER(snap);
+
+bad_format:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
+ errmsg("invalid external pg_snapshot data")));
+ PG_RETURN_POINTER(NULL); /* keep compiler quiet */
+}
+
+/*
+ * pg_snapshot_send(pg_snapshot) returns bytea
+ *
+ * binary output function for type pg_snapshot
+ *
+ * format: int4 nxip, u64 xmin, u64 xmax, u64 xip...
+ */
+Datum
+pg_snapshot_send(PG_FUNCTION_ARGS)
+{
+ pg_snapshot *snap = (pg_snapshot *) PG_GETARG_VARLENA_P(0);
+ StringInfoData buf;
+ uint32 i;
+
+ pq_begintypsend(&buf);
+ pq_sendint32(&buf, snap->nxip);
+ pq_sendint64(&buf, (int64) U64FromFullTransactionId(snap->xmin));
+ pq_sendint64(&buf, (int64) U64FromFullTransactionId(snap->xmax));
+ for (i = 0; i < snap->nxip; i++)
+ pq_sendint64(&buf, (int64) U64FromFullTransactionId(snap->xip[i]));
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+/*
+ * pg_visible_in_snapshot(xid8, pg_snapshot) returns bool
+ *
+ * is txid visible in snapshot ?
+ */
+Datum
+pg_visible_in_snapshot(PG_FUNCTION_ARGS)
+{
+ FullTransactionId value = PG_GETARG_FULLTRANSACTIONID(0);
+ pg_snapshot *snap = (pg_snapshot *) PG_GETARG_VARLENA_P(1);
+
+ PG_RETURN_BOOL(is_visible_fxid(value, snap));
+}
+
+/*
+ * pg_snapshot_xmin(pg_snapshot) returns xid8
+ *
+ * return snapshot's xmin
+ */
+Datum
+pg_snapshot_xmin(PG_FUNCTION_ARGS)
+{
+ pg_snapshot *snap = (pg_snapshot *) PG_GETARG_VARLENA_P(0);
+
+ PG_RETURN_FULLTRANSACTIONID(snap->xmin);
+}
+
+/*
+ * pg_snapshot_xmax(pg_snapshot) returns xid8
+ *
+ * return snapshot's xmax
+ */
+Datum
+pg_snapshot_xmax(PG_FUNCTION_ARGS)
+{
+ pg_snapshot *snap = (pg_snapshot *) PG_GETARG_VARLENA_P(0);
+
+ PG_RETURN_FULLTRANSACTIONID(snap->xmax);
+}
+
+/*
+ * pg_snapshot_xip(pg_snapshot) returns setof xid8
+ *
+ * return in-progress xid8s in snapshot.
+ */
+Datum
+pg_snapshot_xip(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *fctx;
+ pg_snapshot *snap;
+ FullTransactionId value;
+
+ /* on first call initialize fctx and get copy of snapshot */
+ if (SRF_IS_FIRSTCALL())
+ {
+ pg_snapshot *arg = (pg_snapshot *) PG_GETARG_VARLENA_P(0);
+
+ fctx = SRF_FIRSTCALL_INIT();
+
+ /* make a copy of user snapshot */
+ snap = MemoryContextAlloc(fctx->multi_call_memory_ctx, VARSIZE(arg));
+ memcpy(snap, arg, VARSIZE(arg));
+
+ fctx->user_fctx = snap;
+ }
+
+ /* return values one-by-one */
+ fctx = SRF_PERCALL_SETUP();
+ snap = fctx->user_fctx;
+ if (fctx->call_cntr < snap->nxip)
+ {
+ value = snap->xip[fctx->call_cntr];
+ SRF_RETURN_NEXT(fctx, FullTransactionIdGetDatum(value));
+ }
+ else
+ {
+ SRF_RETURN_DONE(fctx);
+ }
+}
+
+/*
+ * Report the status of a recent transaction ID, or null for wrapped,
+ * truncated away or otherwise too old XIDs.
+ *
+ * The passed epoch-qualified xid is treated as a normal xid, not a
+ * multixact id.
+ *
+ * If it points to a committed subxact the result is the subxact status even
+ * though the parent xact may still be in progress or may have aborted.
+ */
+Datum
+pg_xact_status(PG_FUNCTION_ARGS)
+{
+ const char *status;
+ FullTransactionId fxid = PG_GETARG_FULLTRANSACTIONID(0);
+ TransactionId xid;
+
+ /*
+ * We must protect against concurrent truncation of clog entries to avoid
+ * an I/O error on SLRU lookup.
+ */
+ LWLockAcquire(XactTruncationLock, LW_SHARED);
+ if (TransactionIdInRecentPast(fxid, &xid))
+ {
+ Assert(TransactionIdIsValid(xid));
+
+ /*
+ * Like when doing visiblity checks on a row, check whether the
+ * transaction is still in progress before looking into the CLOG.
+ * Otherwise we would incorrectly return "committed" for a transaction
+ * that is committing and has already updated the CLOG, but hasn't
+ * removed its XID from the proc array yet. (See comment on that race
+ * condition at the top of heapam_visibility.c)
+ */
+ if (TransactionIdIsInProgress(xid))
+ status = "in progress";
+ else if (TransactionIdDidCommit(xid))
+ status = "committed";
+ else
+ {
+ /* it must have aborted or crashed */
+ status = "aborted";
+ }
+ }
+ else
+ {
+ status = NULL;
+ }
+ LWLockRelease(XactTruncationLock);
+
+ if (status == NULL)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TEXT_P(cstring_to_text(status));
+}
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
new file mode 100644
index 0000000..6411f56
--- /dev/null
+++ b/src/backend/utils/adt/xml.c
@@ -0,0 +1,4769 @@
+/*-------------------------------------------------------------------------
+ *
+ * xml.c
+ * XML data type support.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/utils/adt/xml.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Generally, XML type support is only available when libxml use was
+ * configured during the build. But even if that is not done, the
+ * type and all the functions are available, but most of them will
+ * fail. For one thing, this avoids having to manage variant catalog
+ * installations. But it also has nice effects such as that you can
+ * dump a database containing XML type data even if the server is not
+ * linked with libxml. Thus, make sure xml_out() works even if nothing
+ * else does.
+ */
+
+/*
+ * Notes on memory management:
+ *
+ * Sometimes libxml allocates global structures in the hope that it can reuse
+ * them later on. This makes it impractical to change the xmlMemSetup
+ * functions on-the-fly; that is likely to lead to trying to pfree() chunks
+ * allocated with malloc() or vice versa. Since libxml might be used by
+ * loadable modules, eg libperl, our only safe choices are to change the
+ * functions at postmaster/backend launch or not at all. Since we'd rather
+ * not activate libxml in sessions that might never use it, the latter choice
+ * is the preferred one. However, for debugging purposes it can be awfully
+ * handy to constrain libxml's allocations to be done in a specific palloc
+ * context, where they're easy to track. Therefore there is code here that
+ * can be enabled in debug builds to redirect libxml's allocations into a
+ * special context LibxmlContext. It's not recommended to turn this on in
+ * a production build because of the possibility of bad interactions with
+ * external modules.
+ */
+/* #define USE_LIBXMLCONTEXT */
+
+#include "postgres.h"
+
+#ifdef USE_LIBXML
+#include <libxml/chvalid.h>
+#include <libxml/parser.h>
+#include <libxml/parserInternals.h>
+#include <libxml/tree.h>
+#include <libxml/uri.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xmlversion.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+
+/*
+ * We used to check for xmlStructuredErrorContext via a configure test; but
+ * that doesn't work on Windows, so instead use this grottier method of
+ * testing the library version number.
+ */
+#if LIBXML_VERSION >= 20704
+#define HAVE_XMLSTRUCTUREDERRORCONTEXT 1
+#endif
+#endif /* USE_LIBXML */
+
+#include "access/htup_details.h"
+#include "access/table.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_type.h"
+#include "commands/dbcommands.h"
+#include "executor/spi.h"
+#include "executor/tablefunc.h"
+#include "fmgr.h"
+#include "lib/stringinfo.h"
+#include "libpq/pqformat.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "nodes/execnodes.h"
+#include "nodes/nodeFuncs.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/datetime.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/syscache.h"
+#include "utils/xml.h"
+
+
+/* GUC variables */
+int xmlbinary;
+int xmloption;
+
+#ifdef USE_LIBXML
+
+/* random number to identify PgXmlErrorContext */
+#define ERRCXT_MAGIC 68275028
+
+struct PgXmlErrorContext
+{
+ int magic;
+ /* strictness argument passed to pg_xml_init */
+ PgXmlStrictness strictness;
+ /* current error status and accumulated message, if any */
+ bool err_occurred;
+ StringInfoData err_buf;
+ /* previous libxml error handling state (saved by pg_xml_init) */
+ xmlStructuredErrorFunc saved_errfunc;
+ void *saved_errcxt;
+ /* previous libxml entity handler (saved by pg_xml_init) */
+ xmlExternalEntityLoader saved_entityfunc;
+};
+
+static xmlParserInputPtr xmlPgEntityLoader(const char *URL, const char *ID,
+ xmlParserCtxtPtr ctxt);
+static void xml_errorHandler(void *data, xmlErrorPtr error);
+static void xml_ereport_by_code(int level, int sqlcode,
+ const char *msg, int errcode);
+static void chopStringInfoNewlines(StringInfo str);
+static void appendStringInfoLineSeparator(StringInfo str);
+
+#ifdef USE_LIBXMLCONTEXT
+
+static MemoryContext LibxmlContext = NULL;
+
+static void xml_memory_init(void);
+static void *xml_palloc(size_t size);
+static void *xml_repalloc(void *ptr, size_t size);
+static void xml_pfree(void *ptr);
+static char *xml_pstrdup(const char *string);
+#endif /* USE_LIBXMLCONTEXT */
+
+static xmlChar *xml_text2xmlChar(text *in);
+static int parse_xml_decl(const xmlChar *str, size_t *lenp,
+ xmlChar **version, xmlChar **encoding, int *standalone);
+static bool print_xml_decl(StringInfo buf, const xmlChar *version,
+ pg_enc encoding, int standalone);
+static bool xml_doctype_in_content(const xmlChar *str);
+static xmlDocPtr xml_parse(text *data, XmlOptionType xmloption_arg,
+ bool preserve_whitespace, int encoding);
+static text *xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContext *xmlerrcxt);
+static int xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj,
+ ArrayBuildState *astate,
+ PgXmlErrorContext *xmlerrcxt);
+static xmlChar *pg_xmlCharStrndup(const char *str, size_t len);
+#endif /* USE_LIBXML */
+
+static void xmldata_root_element_start(StringInfo result, const char *eltname,
+ const char *xmlschema, const char *targetns,
+ bool top_level);
+static void xmldata_root_element_end(StringInfo result, const char *eltname);
+static StringInfo query_to_xml_internal(const char *query, char *tablename,
+ const char *xmlschema, bool nulls, bool tableforest,
+ const char *targetns, bool top_level);
+static const char *map_sql_table_to_xmlschema(TupleDesc tupdesc, Oid relid,
+ bool nulls, bool tableforest, const char *targetns);
+static const char *map_sql_schema_to_xmlschema_types(Oid nspid,
+ List *relid_list, bool nulls,
+ bool tableforest, const char *targetns);
+static const char *map_sql_catalog_to_xmlschema_types(List *nspid_list,
+ bool nulls, bool tableforest,
+ const char *targetns);
+static const char *map_sql_type_to_xml_name(Oid typeoid, int typmod);
+static const char *map_sql_typecoll_to_xmlschema_types(List *tupdesc_list);
+static const char *map_sql_type_to_xmlschema_type(Oid typeoid, int typmod);
+static void SPI_sql_row_to_xmlelement(uint64 rownum, StringInfo result,
+ char *tablename, bool nulls, bool tableforest,
+ const char *targetns, bool top_level);
+
+/* XMLTABLE support */
+#ifdef USE_LIBXML
+/* random number to identify XmlTableContext */
+#define XMLTABLE_CONTEXT_MAGIC 46922182
+typedef struct XmlTableBuilderData
+{
+ int magic;
+ int natts;
+ long int row_count;
+ PgXmlErrorContext *xmlerrcxt;
+ xmlParserCtxtPtr ctxt;
+ xmlDocPtr doc;
+ xmlXPathContextPtr xpathcxt;
+ xmlXPathCompExprPtr xpathcomp;
+ xmlXPathObjectPtr xpathobj;
+ xmlXPathCompExprPtr *xpathscomp;
+} XmlTableBuilderData;
+#endif
+
+static void XmlTableInitOpaque(struct TableFuncScanState *state, int natts);
+static void XmlTableSetDocument(struct TableFuncScanState *state, Datum value);
+static void XmlTableSetNamespace(struct TableFuncScanState *state, const char *name,
+ const char *uri);
+static void XmlTableSetRowFilter(struct TableFuncScanState *state, const char *path);
+static void XmlTableSetColumnFilter(struct TableFuncScanState *state,
+ const char *path, int colnum);
+static bool XmlTableFetchRow(struct TableFuncScanState *state);
+static Datum XmlTableGetValue(struct TableFuncScanState *state, int colnum,
+ Oid typid, int32 typmod, bool *isnull);
+static void XmlTableDestroyOpaque(struct TableFuncScanState *state);
+
+const TableFuncRoutine XmlTableRoutine =
+{
+ XmlTableInitOpaque,
+ XmlTableSetDocument,
+ XmlTableSetNamespace,
+ XmlTableSetRowFilter,
+ XmlTableSetColumnFilter,
+ XmlTableFetchRow,
+ XmlTableGetValue,
+ XmlTableDestroyOpaque
+};
+
+#define NO_XML_SUPPORT() \
+ ereport(ERROR, \
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
+ errmsg("unsupported XML feature"), \
+ errdetail("This functionality requires the server to be built with libxml support.")))
+
+
+/* from SQL/XML:2008 section 4.9 */
+#define NAMESPACE_XSD "http://www.w3.org/2001/XMLSchema"
+#define NAMESPACE_XSI "http://www.w3.org/2001/XMLSchema-instance"
+#define NAMESPACE_SQLXML "http://standards.iso.org/iso/9075/2003/sqlxml"
+
+
+#ifdef USE_LIBXML
+
+static int
+xmlChar_to_encoding(const xmlChar *encoding_name)
+{
+ int encoding = pg_char_to_encoding((const char *) encoding_name);
+
+ if (encoding < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid encoding name \"%s\"",
+ (const char *) encoding_name)));
+ return encoding;
+}
+#endif
+
+
+/*
+ * xml_in uses a plain C string to VARDATA conversion, so for the time being
+ * we use the conversion function for the text datatype.
+ *
+ * This is only acceptable so long as xmltype and text use the same
+ * representation.
+ */
+Datum
+xml_in(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ char *s = PG_GETARG_CSTRING(0);
+ xmltype *vardata;
+ xmlDocPtr doc;
+
+ vardata = (xmltype *) cstring_to_text(s);
+
+ /*
+ * Parse the data to check if it is well-formed XML data. Assume that
+ * ERROR occurred if parsing failed.
+ */
+ doc = xml_parse(vardata, xmloption, true, GetDatabaseEncoding());
+ xmlFreeDoc(doc);
+
+ PG_RETURN_XML_P(vardata);
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+
+#define PG_XML_DEFAULT_VERSION "1.0"
+
+
+/*
+ * xml_out_internal uses a plain VARDATA to C string conversion, so for the
+ * time being we use the conversion function for the text datatype.
+ *
+ * This is only acceptable so long as xmltype and text use the same
+ * representation.
+ */
+static char *
+xml_out_internal(xmltype *x, pg_enc target_encoding)
+{
+ char *str = text_to_cstring((text *) x);
+
+#ifdef USE_LIBXML
+ size_t len = strlen(str);
+ xmlChar *version;
+ int standalone;
+ int res_code;
+
+ if ((res_code = parse_xml_decl((xmlChar *) str,
+ &len, &version, NULL, &standalone)) == 0)
+ {
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+
+ if (!print_xml_decl(&buf, version, target_encoding, standalone))
+ {
+ /*
+ * If we are not going to produce an XML declaration, eat a single
+ * newline in the original string to prevent empty first lines in
+ * the output.
+ */
+ if (*(str + len) == '\n')
+ len += 1;
+ }
+ appendStringInfoString(&buf, str + len);
+
+ pfree(str);
+
+ return buf.data;
+ }
+
+ xml_ereport_by_code(WARNING, ERRCODE_INTERNAL_ERROR,
+ "could not parse XML declaration in stored value",
+ res_code);
+#endif
+ return str;
+}
+
+
+Datum
+xml_out(PG_FUNCTION_ARGS)
+{
+ xmltype *x = PG_GETARG_XML_P(0);
+
+ /*
+ * xml_out removes the encoding property in all cases. This is because we
+ * cannot control from here whether the datum will be converted to a
+ * different client encoding, so we'd do more harm than good by including
+ * it.
+ */
+ PG_RETURN_CSTRING(xml_out_internal(x, 0));
+}
+
+
+Datum
+xml_recv(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ xmltype *result;
+ char *str;
+ char *newstr;
+ int nbytes;
+ xmlDocPtr doc;
+ xmlChar *encodingStr = NULL;
+ int encoding;
+
+ /*
+ * Read the data in raw format. We don't know yet what the encoding is, as
+ * that information is embedded in the xml declaration; so we have to
+ * parse that before converting to server encoding.
+ */
+ nbytes = buf->len - buf->cursor;
+ str = (char *) pq_getmsgbytes(buf, nbytes);
+
+ /*
+ * We need a null-terminated string to pass to parse_xml_decl(). Rather
+ * than make a separate copy, make the temporary result one byte bigger
+ * than it needs to be.
+ */
+ result = palloc(nbytes + 1 + VARHDRSZ);
+ SET_VARSIZE(result, nbytes + VARHDRSZ);
+ memcpy(VARDATA(result), str, nbytes);
+ str = VARDATA(result);
+ str[nbytes] = '\0';
+
+ parse_xml_decl((const xmlChar *) str, NULL, NULL, &encodingStr, NULL);
+
+ /*
+ * If encoding wasn't explicitly specified in the XML header, treat it as
+ * UTF-8, as that's the default in XML. This is different from xml_in(),
+ * where the input has to go through the normal client to server encoding
+ * conversion.
+ */
+ encoding = encodingStr ? xmlChar_to_encoding(encodingStr) : PG_UTF8;
+
+ /*
+ * Parse the data to check if it is well-formed XML data. Assume that
+ * xml_parse will throw ERROR if not.
+ */
+ doc = xml_parse(result, xmloption, true, encoding);
+ xmlFreeDoc(doc);
+
+ /* Now that we know what we're dealing with, convert to server encoding */
+ newstr = pg_any_to_server(str, nbytes, encoding);
+
+ if (newstr != str)
+ {
+ pfree(result);
+ result = (xmltype *) cstring_to_text(newstr);
+ pfree(newstr);
+ }
+
+ PG_RETURN_XML_P(result);
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+
+Datum
+xml_send(PG_FUNCTION_ARGS)
+{
+ xmltype *x = PG_GETARG_XML_P(0);
+ char *outval;
+ StringInfoData buf;
+
+ /*
+ * xml_out_internal doesn't convert the encoding, it just prints the right
+ * declaration. pq_sendtext will do the conversion.
+ */
+ outval = xml_out_internal(x, pg_get_client_encoding());
+
+ pq_begintypsend(&buf);
+ pq_sendtext(&buf, outval, strlen(outval));
+ pfree(outval);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+#ifdef USE_LIBXML
+static void
+appendStringInfoText(StringInfo str, const text *t)
+{
+ appendBinaryStringInfo(str, VARDATA_ANY(t), VARSIZE_ANY_EXHDR(t));
+}
+#endif
+
+
+static xmltype *
+stringinfo_to_xmltype(StringInfo buf)
+{
+ return (xmltype *) cstring_to_text_with_len(buf->data, buf->len);
+}
+
+
+static xmltype *
+cstring_to_xmltype(const char *string)
+{
+ return (xmltype *) cstring_to_text(string);
+}
+
+
+#ifdef USE_LIBXML
+static xmltype *
+xmlBuffer_to_xmltype(xmlBufferPtr buf)
+{
+ return (xmltype *) cstring_to_text_with_len((const char *) xmlBufferContent(buf),
+ xmlBufferLength(buf));
+}
+#endif
+
+
+Datum
+xmlcomment(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *arg = PG_GETARG_TEXT_PP(0);
+ char *argdata = VARDATA_ANY(arg);
+ int len = VARSIZE_ANY_EXHDR(arg);
+ StringInfoData buf;
+ int i;
+
+ /* check for "--" in string or "-" at the end */
+ for (i = 1; i < len; i++)
+ {
+ if (argdata[i] == '-' && argdata[i - 1] == '-')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_XML_COMMENT),
+ errmsg("invalid XML comment")));
+ }
+ if (len > 0 && argdata[len - 1] == '-')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_XML_COMMENT),
+ errmsg("invalid XML comment")));
+
+ initStringInfo(&buf);
+ appendStringInfoString(&buf, "<!--");
+ appendStringInfoText(&buf, arg);
+ appendStringInfoString(&buf, "-->");
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(&buf));
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+
+
+/*
+ * TODO: xmlconcat needs to merge the notations and unparsed entities
+ * of the argument values. Not very important in practice, though.
+ */
+xmltype *
+xmlconcat(List *args)
+{
+#ifdef USE_LIBXML
+ int global_standalone = 1;
+ xmlChar *global_version = NULL;
+ bool global_version_no_value = false;
+ StringInfoData buf;
+ ListCell *v;
+
+ initStringInfo(&buf);
+ foreach(v, args)
+ {
+ xmltype *x = DatumGetXmlP(PointerGetDatum(lfirst(v)));
+ size_t len;
+ xmlChar *version;
+ int standalone;
+ char *str;
+
+ len = VARSIZE(x) - VARHDRSZ;
+ str = text_to_cstring((text *) x);
+
+ parse_xml_decl((xmlChar *) str, &len, &version, NULL, &standalone);
+
+ if (standalone == 0 && global_standalone == 1)
+ global_standalone = 0;
+ if (standalone < 0)
+ global_standalone = -1;
+
+ if (!version)
+ global_version_no_value = true;
+ else if (!global_version)
+ global_version = version;
+ else if (xmlStrcmp(version, global_version) != 0)
+ global_version_no_value = true;
+
+ appendStringInfoString(&buf, str + len);
+ pfree(str);
+ }
+
+ if (!global_version_no_value || global_standalone >= 0)
+ {
+ StringInfoData buf2;
+
+ initStringInfo(&buf2);
+
+ print_xml_decl(&buf2,
+ (!global_version_no_value) ? global_version : NULL,
+ 0,
+ global_standalone);
+
+ appendBinaryStringInfo(&buf2, buf.data, buf.len);
+ buf = buf2;
+ }
+
+ return stringinfo_to_xmltype(&buf);
+#else
+ NO_XML_SUPPORT();
+ return NULL;
+#endif
+}
+
+
+/*
+ * XMLAGG support
+ */
+Datum
+xmlconcat2(PG_FUNCTION_ARGS)
+{
+ if (PG_ARGISNULL(0))
+ {
+ if (PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_XML_P(PG_GETARG_XML_P(1));
+ }
+ else if (PG_ARGISNULL(1))
+ PG_RETURN_XML_P(PG_GETARG_XML_P(0));
+ else
+ PG_RETURN_XML_P(xmlconcat(list_make2(PG_GETARG_XML_P(0),
+ PG_GETARG_XML_P(1))));
+}
+
+
+Datum
+texttoxml(PG_FUNCTION_ARGS)
+{
+ text *data = PG_GETARG_TEXT_PP(0);
+
+ PG_RETURN_XML_P(xmlparse(data, xmloption, true));
+}
+
+
+Datum
+xmltotext(PG_FUNCTION_ARGS)
+{
+ xmltype *data = PG_GETARG_XML_P(0);
+
+ /* It's actually binary compatible. */
+ PG_RETURN_TEXT_P((text *) data);
+}
+
+
+text *
+xmltotext_with_xmloption(xmltype *data, XmlOptionType xmloption_arg)
+{
+ if (xmloption_arg == XMLOPTION_DOCUMENT && !xml_is_document(data))
+ ereport(ERROR,
+ (errcode(ERRCODE_NOT_AN_XML_DOCUMENT),
+ errmsg("not an XML document")));
+
+ /* It's actually binary compatible, save for the above check. */
+ return (text *) data;
+}
+
+
+xmltype *
+xmlelement(XmlExpr *xexpr,
+ Datum *named_argvalue, bool *named_argnull,
+ Datum *argvalue, bool *argnull)
+{
+#ifdef USE_LIBXML
+ xmltype *result;
+ List *named_arg_strings;
+ List *arg_strings;
+ int i;
+ ListCell *arg;
+ ListCell *narg;
+ PgXmlErrorContext *xmlerrcxt;
+ volatile xmlBufferPtr buf = NULL;
+ volatile xmlTextWriterPtr writer = NULL;
+
+ /*
+ * All arguments are already evaluated, and their values are passed in the
+ * named_argvalue/named_argnull or argvalue/argnull arrays. This avoids
+ * issues if one of the arguments involves a call to some other function
+ * or subsystem that wants to use libxml on its own terms. We examine the
+ * original XmlExpr to identify the numbers and types of the arguments.
+ */
+ named_arg_strings = NIL;
+ i = 0;
+ foreach(arg, xexpr->named_args)
+ {
+ Expr *e = (Expr *) lfirst(arg);
+ char *str;
+
+ if (named_argnull[i])
+ str = NULL;
+ else
+ str = map_sql_value_to_xml_value(named_argvalue[i],
+ exprType((Node *) e),
+ false);
+ named_arg_strings = lappend(named_arg_strings, str);
+ i++;
+ }
+
+ arg_strings = NIL;
+ i = 0;
+ foreach(arg, xexpr->args)
+ {
+ Expr *e = (Expr *) lfirst(arg);
+ char *str;
+
+ /* here we can just forget NULL elements immediately */
+ if (!argnull[i])
+ {
+ str = map_sql_value_to_xml_value(argvalue[i],
+ exprType((Node *) e),
+ true);
+ arg_strings = lappend(arg_strings, str);
+ }
+ i++;
+ }
+
+ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL);
+
+ PG_TRY();
+ {
+ buf = xmlBufferCreate();
+ if (buf == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate xmlBuffer");
+ writer = xmlNewTextWriterMemory(buf, 0);
+ if (writer == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate xmlTextWriter");
+
+ xmlTextWriterStartElement(writer, (xmlChar *) xexpr->name);
+
+ forboth(arg, named_arg_strings, narg, xexpr->arg_names)
+ {
+ char *str = (char *) lfirst(arg);
+ char *argname = strVal(lfirst(narg));
+
+ if (str)
+ xmlTextWriterWriteAttribute(writer,
+ (xmlChar *) argname,
+ (xmlChar *) str);
+ }
+
+ foreach(arg, arg_strings)
+ {
+ char *str = (char *) lfirst(arg);
+
+ xmlTextWriterWriteRaw(writer, (xmlChar *) str);
+ }
+
+ xmlTextWriterEndElement(writer);
+
+ /* we MUST do this now to flush data out to the buffer ... */
+ xmlFreeTextWriter(writer);
+ writer = NULL;
+
+ result = xmlBuffer_to_xmltype(buf);
+ }
+ PG_CATCH();
+ {
+ if (writer)
+ xmlFreeTextWriter(writer);
+ if (buf)
+ xmlBufferFree(buf);
+
+ pg_xml_done(xmlerrcxt, true);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xmlBufferFree(buf);
+
+ pg_xml_done(xmlerrcxt, false);
+
+ return result;
+#else
+ NO_XML_SUPPORT();
+ return NULL;
+#endif
+}
+
+
+xmltype *
+xmlparse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace)
+{
+#ifdef USE_LIBXML
+ xmlDocPtr doc;
+
+ doc = xml_parse(data, xmloption_arg, preserve_whitespace,
+ GetDatabaseEncoding());
+ xmlFreeDoc(doc);
+
+ return (xmltype *) data;
+#else
+ NO_XML_SUPPORT();
+ return NULL;
+#endif
+}
+
+
+xmltype *
+xmlpi(const char *target, text *arg, bool arg_is_null, bool *result_is_null)
+{
+#ifdef USE_LIBXML
+ xmltype *result;
+ StringInfoData buf;
+
+ if (pg_strcasecmp(target, "xml") == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR), /* really */
+ errmsg("invalid XML processing instruction"),
+ errdetail("XML processing instruction target name cannot be \"%s\".", target)));
+
+ /*
+ * Following the SQL standard, the null check comes after the syntax check
+ * above.
+ */
+ *result_is_null = arg_is_null;
+ if (*result_is_null)
+ return NULL;
+
+ initStringInfo(&buf);
+
+ appendStringInfo(&buf, "<?%s", target);
+
+ if (arg != NULL)
+ {
+ char *string;
+
+ string = text_to_cstring(arg);
+ if (strstr(string, "?>") != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION),
+ errmsg("invalid XML processing instruction"),
+ errdetail("XML processing instruction cannot contain \"?>\".")));
+
+ appendStringInfoChar(&buf, ' ');
+ appendStringInfoString(&buf, string + strspn(string, " "));
+ pfree(string);
+ }
+ appendStringInfoString(&buf, "?>");
+
+ result = stringinfo_to_xmltype(&buf);
+ pfree(buf.data);
+ return result;
+#else
+ NO_XML_SUPPORT();
+ return NULL;
+#endif
+}
+
+
+xmltype *
+xmlroot(xmltype *data, text *version, int standalone)
+{
+#ifdef USE_LIBXML
+ char *str;
+ size_t len;
+ xmlChar *orig_version;
+ int orig_standalone;
+ StringInfoData buf;
+
+ len = VARSIZE(data) - VARHDRSZ;
+ str = text_to_cstring((text *) data);
+
+ parse_xml_decl((xmlChar *) str, &len, &orig_version, NULL, &orig_standalone);
+
+ if (version)
+ orig_version = xml_text2xmlChar(version);
+ else
+ orig_version = NULL;
+
+ switch (standalone)
+ {
+ case XML_STANDALONE_YES:
+ orig_standalone = 1;
+ break;
+ case XML_STANDALONE_NO:
+ orig_standalone = 0;
+ break;
+ case XML_STANDALONE_NO_VALUE:
+ orig_standalone = -1;
+ break;
+ case XML_STANDALONE_OMITTED:
+ /* leave original value */
+ break;
+ }
+
+ initStringInfo(&buf);
+ print_xml_decl(&buf, orig_version, 0, orig_standalone);
+ appendStringInfoString(&buf, str + len);
+
+ return stringinfo_to_xmltype(&buf);
+#else
+ NO_XML_SUPPORT();
+ return NULL;
+#endif
+}
+
+
+/*
+ * Validate document (given as string) against DTD (given as external link)
+ *
+ * This has been removed because it is a security hole: unprivileged users
+ * should not be able to use Postgres to fetch arbitrary external files,
+ * which unfortunately is exactly what libxml is willing to do with the DTD
+ * parameter.
+ */
+Datum
+xmlvalidate(PG_FUNCTION_ARGS)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("xmlvalidate is not implemented")));
+ return 0;
+}
+
+
+bool
+xml_is_document(xmltype *arg)
+{
+#ifdef USE_LIBXML
+ bool result;
+ volatile xmlDocPtr doc = NULL;
+ MemoryContext ccxt = CurrentMemoryContext;
+
+ /* We want to catch ereport(INVALID_XML_DOCUMENT) and return false */
+ PG_TRY();
+ {
+ doc = xml_parse((text *) arg, XMLOPTION_DOCUMENT, true,
+ GetDatabaseEncoding());
+ result = true;
+ }
+ PG_CATCH();
+ {
+ ErrorData *errdata;
+ MemoryContext ecxt;
+
+ ecxt = MemoryContextSwitchTo(ccxt);
+ errdata = CopyErrorData();
+ if (errdata->sqlerrcode == ERRCODE_INVALID_XML_DOCUMENT)
+ {
+ FlushErrorState();
+ result = false;
+ }
+ else
+ {
+ MemoryContextSwitchTo(ecxt);
+ PG_RE_THROW();
+ }
+ }
+ PG_END_TRY();
+
+ if (doc)
+ xmlFreeDoc(doc);
+
+ return result;
+#else /* not USE_LIBXML */
+ NO_XML_SUPPORT();
+ return false;
+#endif /* not USE_LIBXML */
+}
+
+
+#ifdef USE_LIBXML
+
+/*
+ * pg_xml_init_library --- set up for use of libxml
+ *
+ * This should be called by each function that is about to use libxml
+ * facilities but doesn't require error handling. It initializes libxml
+ * and verifies compatibility with the loaded libxml version. These are
+ * once-per-session activities.
+ *
+ * TODO: xmlChar is utf8-char, make proper tuning (initdb with enc!=utf8 and
+ * check)
+ */
+void
+pg_xml_init_library(void)
+{
+ static bool first_time = true;
+
+ if (first_time)
+ {
+ /* Stuff we need do only once per session */
+
+ /*
+ * Currently, we have no pure UTF-8 support for internals -- check if
+ * we can work.
+ */
+ if (sizeof(char) != sizeof(xmlChar))
+ ereport(ERROR,
+ (errmsg("could not initialize XML library"),
+ errdetail("libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu.",
+ sizeof(char), sizeof(xmlChar))));
+
+#ifdef USE_LIBXMLCONTEXT
+ /* Set up libxml's memory allocation our way */
+ xml_memory_init();
+#endif
+
+ /* Check library compatibility */
+ LIBXML_TEST_VERSION;
+
+ first_time = false;
+ }
+}
+
+/*
+ * pg_xml_init --- set up for use of libxml and register an error handler
+ *
+ * This should be called by each function that is about to use libxml
+ * facilities and requires error handling. It initializes libxml with
+ * pg_xml_init_library() and establishes our libxml error handler.
+ *
+ * strictness determines which errors are reported and which are ignored.
+ *
+ * Calls to this function MUST be followed by a PG_TRY block that guarantees
+ * that pg_xml_done() is called during either normal or error exit.
+ *
+ * This is exported for use by contrib/xml2, as well as other code that might
+ * wish to share use of this module's libxml error handler.
+ */
+PgXmlErrorContext *
+pg_xml_init(PgXmlStrictness strictness)
+{
+ PgXmlErrorContext *errcxt;
+ void *new_errcxt;
+
+ /* Do one-time setup if needed */
+ pg_xml_init_library();
+
+ /* Create error handling context structure */
+ errcxt = (PgXmlErrorContext *) palloc(sizeof(PgXmlErrorContext));
+ errcxt->magic = ERRCXT_MAGIC;
+ errcxt->strictness = strictness;
+ errcxt->err_occurred = false;
+ initStringInfo(&errcxt->err_buf);
+
+ /*
+ * Save original error handler and install ours. libxml originally didn't
+ * distinguish between the contexts for generic and for structured error
+ * handlers. If we're using an old libxml version, we must thus save the
+ * generic error context, even though we're using a structured error
+ * handler.
+ */
+ errcxt->saved_errfunc = xmlStructuredError;
+
+#ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
+ errcxt->saved_errcxt = xmlStructuredErrorContext;
+#else
+ errcxt->saved_errcxt = xmlGenericErrorContext;
+#endif
+
+ xmlSetStructuredErrorFunc((void *) errcxt, xml_errorHandler);
+
+ /*
+ * Verify that xmlSetStructuredErrorFunc set the context variable we
+ * expected it to. If not, the error context pointer we just saved is not
+ * the correct thing to restore, and since that leaves us without a way to
+ * restore the context in pg_xml_done, we must fail.
+ *
+ * The only known situation in which this test fails is if we compile with
+ * headers from a libxml2 that doesn't track the structured error context
+ * separately (< 2.7.4), but at runtime use a version that does, or vice
+ * versa. The libxml2 authors did not treat that change as constituting
+ * an ABI break, so the LIBXML_TEST_VERSION test in pg_xml_init_library
+ * fails to protect us from this.
+ */
+
+#ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
+ new_errcxt = xmlStructuredErrorContext;
+#else
+ new_errcxt = xmlGenericErrorContext;
+#endif
+
+ if (new_errcxt != (void *) errcxt)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("could not set up XML error handler"),
+ errhint("This probably indicates that the version of libxml2"
+ " being used is not compatible with the libxml2"
+ " header files that PostgreSQL was built with.")));
+
+ /*
+ * Also, install an entity loader to prevent unwanted fetches of external
+ * files and URLs.
+ */
+ errcxt->saved_entityfunc = xmlGetExternalEntityLoader();
+ xmlSetExternalEntityLoader(xmlPgEntityLoader);
+
+ return errcxt;
+}
+
+
+/*
+ * pg_xml_done --- restore previous libxml error handling
+ *
+ * Resets libxml's global error-handling state to what it was before
+ * pg_xml_init() was called.
+ *
+ * This routine verifies that all pending errors have been dealt with
+ * (in assert-enabled builds, anyway).
+ */
+void
+pg_xml_done(PgXmlErrorContext *errcxt, bool isError)
+{
+ void *cur_errcxt;
+
+ /* An assert seems like enough protection here */
+ Assert(errcxt->magic == ERRCXT_MAGIC);
+
+ /*
+ * In a normal exit, there should be no un-handled libxml errors. But we
+ * shouldn't try to enforce this during error recovery, since the longjmp
+ * could have been thrown before xml_ereport had a chance to run.
+ */
+ Assert(!errcxt->err_occurred || isError);
+
+ /*
+ * Check that libxml's global state is correct, warn if not. This is a
+ * real test and not an Assert because it has a higher probability of
+ * happening.
+ */
+#ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
+ cur_errcxt = xmlStructuredErrorContext;
+#else
+ cur_errcxt = xmlGenericErrorContext;
+#endif
+
+ if (cur_errcxt != (void *) errcxt)
+ elog(WARNING, "libxml error handling state is out of sync with xml.c");
+
+ /* Restore the saved handlers */
+ xmlSetStructuredErrorFunc(errcxt->saved_errcxt, errcxt->saved_errfunc);
+ xmlSetExternalEntityLoader(errcxt->saved_entityfunc);
+
+ /*
+ * Mark the struct as invalid, just in case somebody somehow manages to
+ * call xml_errorHandler or xml_ereport with it.
+ */
+ errcxt->magic = 0;
+
+ /* Release memory */
+ pfree(errcxt->err_buf.data);
+ pfree(errcxt);
+}
+
+
+/*
+ * pg_xml_error_occurred() --- test the error flag
+ */
+bool
+pg_xml_error_occurred(PgXmlErrorContext *errcxt)
+{
+ return errcxt->err_occurred;
+}
+
+
+/*
+ * SQL/XML allows storing "XML documents" or "XML content". "XML
+ * documents" are specified by the XML specification and are parsed
+ * easily by libxml. "XML content" is specified by SQL/XML as the
+ * production "XMLDecl? content". But libxml can only parse the
+ * "content" part, so we have to parse the XML declaration ourselves
+ * to complete this.
+ */
+
+#define CHECK_XML_SPACE(p) \
+ do { \
+ if (!xmlIsBlank_ch(*(p))) \
+ return XML_ERR_SPACE_REQUIRED; \
+ } while (0)
+
+#define SKIP_XML_SPACE(p) \
+ while (xmlIsBlank_ch(*(p))) (p)++
+
+/* Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender */
+/* Beware of multiple evaluations of argument! */
+#define PG_XMLISNAMECHAR(c) \
+ (xmlIsBaseChar_ch(c) || xmlIsIdeographicQ(c) \
+ || xmlIsDigit_ch(c) \
+ || c == '.' || c == '-' || c == '_' || c == ':' \
+ || xmlIsCombiningQ(c) \
+ || xmlIsExtender_ch(c))
+
+/* pnstrdup, but deal with xmlChar not char; len is measured in xmlChars */
+static xmlChar *
+xml_pnstrdup(const xmlChar *str, size_t len)
+{
+ xmlChar *result;
+
+ result = (xmlChar *) palloc((len + 1) * sizeof(xmlChar));
+ memcpy(result, str, len * sizeof(xmlChar));
+ result[len] = 0;
+ return result;
+}
+
+/* Ditto, except input is char* */
+static xmlChar *
+pg_xmlCharStrndup(const char *str, size_t len)
+{
+ xmlChar *result;
+
+ result = (xmlChar *) palloc((len + 1) * sizeof(xmlChar));
+ memcpy(result, str, len);
+ result[len] = '\0';
+
+ return result;
+}
+
+/*
+ * Copy xmlChar string to PostgreSQL-owned memory, freeing the input.
+ *
+ * The input xmlChar is freed regardless of success of the copy.
+ */
+static char *
+xml_pstrdup_and_free(xmlChar *str)
+{
+ char *result;
+
+ if (str)
+ {
+ PG_TRY();
+ {
+ result = pstrdup((char *) str);
+ }
+ PG_FINALLY();
+ {
+ xmlFree(str);
+ }
+ PG_END_TRY();
+ }
+ else
+ result = NULL;
+
+ return result;
+}
+
+/*
+ * str is the null-terminated input string. Remaining arguments are
+ * output arguments; each can be NULL if value is not wanted.
+ * version and encoding are returned as locally-palloc'd strings.
+ * Result is 0 if OK, an error code if not.
+ */
+static int
+parse_xml_decl(const xmlChar *str, size_t *lenp,
+ xmlChar **version, xmlChar **encoding, int *standalone)
+{
+ const xmlChar *p;
+ const xmlChar *save_p;
+ size_t len;
+ int utf8char;
+ int utf8len;
+
+ /*
+ * Only initialize libxml. We don't need error handling here, but we do
+ * need to make sure libxml is initialized before calling any of its
+ * functions. Note that this is safe (and a no-op) if caller has already
+ * done pg_xml_init().
+ */
+ pg_xml_init_library();
+
+ /* Initialize output arguments to "not present" */
+ if (version)
+ *version = NULL;
+ if (encoding)
+ *encoding = NULL;
+ if (standalone)
+ *standalone = -1;
+
+ p = str;
+
+ if (xmlStrncmp(p, (xmlChar *) "<?xml", 5) != 0)
+ goto finished;
+
+ /*
+ * If next char is a name char, it's a PI like <?xml-stylesheet ...?>
+ * rather than an XMLDecl, so we have done what we came to do and found no
+ * XMLDecl.
+ *
+ * We need an input length value for xmlGetUTF8Char, but there's no need
+ * to count the whole document size, so use strnlen not strlen.
+ */
+ utf8len = strnlen((const char *) (p + 5), MAX_MULTIBYTE_CHAR_LEN);
+ utf8char = xmlGetUTF8Char(p + 5, &utf8len);
+ if (PG_XMLISNAMECHAR(utf8char))
+ goto finished;
+
+ p += 5;
+
+ /* version */
+ CHECK_XML_SPACE(p);
+ SKIP_XML_SPACE(p);
+ if (xmlStrncmp(p, (xmlChar *) "version", 7) != 0)
+ return XML_ERR_VERSION_MISSING;
+ p += 7;
+ SKIP_XML_SPACE(p);
+ if (*p != '=')
+ return XML_ERR_VERSION_MISSING;
+ p += 1;
+ SKIP_XML_SPACE(p);
+
+ if (*p == '\'' || *p == '"')
+ {
+ const xmlChar *q;
+
+ q = xmlStrchr(p + 1, *p);
+ if (!q)
+ return XML_ERR_VERSION_MISSING;
+
+ if (version)
+ *version = xml_pnstrdup(p + 1, q - p - 1);
+ p = q + 1;
+ }
+ else
+ return XML_ERR_VERSION_MISSING;
+
+ /* encoding */
+ save_p = p;
+ SKIP_XML_SPACE(p);
+ if (xmlStrncmp(p, (xmlChar *) "encoding", 8) == 0)
+ {
+ CHECK_XML_SPACE(save_p);
+ p += 8;
+ SKIP_XML_SPACE(p);
+ if (*p != '=')
+ return XML_ERR_MISSING_ENCODING;
+ p += 1;
+ SKIP_XML_SPACE(p);
+
+ if (*p == '\'' || *p == '"')
+ {
+ const xmlChar *q;
+
+ q = xmlStrchr(p + 1, *p);
+ if (!q)
+ return XML_ERR_MISSING_ENCODING;
+
+ if (encoding)
+ *encoding = xml_pnstrdup(p + 1, q - p - 1);
+ p = q + 1;
+ }
+ else
+ return XML_ERR_MISSING_ENCODING;
+ }
+ else
+ {
+ p = save_p;
+ }
+
+ /* standalone */
+ save_p = p;
+ SKIP_XML_SPACE(p);
+ if (xmlStrncmp(p, (xmlChar *) "standalone", 10) == 0)
+ {
+ CHECK_XML_SPACE(save_p);
+ p += 10;
+ SKIP_XML_SPACE(p);
+ if (*p != '=')
+ return XML_ERR_STANDALONE_VALUE;
+ p += 1;
+ SKIP_XML_SPACE(p);
+ if (xmlStrncmp(p, (xmlChar *) "'yes'", 5) == 0 ||
+ xmlStrncmp(p, (xmlChar *) "\"yes\"", 5) == 0)
+ {
+ if (standalone)
+ *standalone = 1;
+ p += 5;
+ }
+ else if (xmlStrncmp(p, (xmlChar *) "'no'", 4) == 0 ||
+ xmlStrncmp(p, (xmlChar *) "\"no\"", 4) == 0)
+ {
+ if (standalone)
+ *standalone = 0;
+ p += 4;
+ }
+ else
+ return XML_ERR_STANDALONE_VALUE;
+ }
+ else
+ {
+ p = save_p;
+ }
+
+ SKIP_XML_SPACE(p);
+ if (xmlStrncmp(p, (xmlChar *) "?>", 2) != 0)
+ return XML_ERR_XMLDECL_NOT_FINISHED;
+ p += 2;
+
+finished:
+ len = p - str;
+
+ for (p = str; p < str + len; p++)
+ if (*p > 127)
+ return XML_ERR_INVALID_CHAR;
+
+ if (lenp)
+ *lenp = len;
+
+ return XML_ERR_OK;
+}
+
+
+/*
+ * Write an XML declaration. On output, we adjust the XML declaration
+ * as follows. (These rules are the moral equivalent of the clause
+ * "Serialization of an XML value" in the SQL standard.)
+ *
+ * We try to avoid generating an XML declaration if possible. This is
+ * so that you don't get trivial things like xml '<foo/>' resulting in
+ * '<?xml version="1.0"?><foo/>', which would surely be annoying. We
+ * must provide a declaration if the standalone property is specified
+ * or if we include an encoding declaration. If we have a
+ * declaration, we must specify a version (XML requires this).
+ * Otherwise we only make a declaration if the version is not "1.0",
+ * which is the default version specified in SQL:2003.
+ */
+static bool
+print_xml_decl(StringInfo buf, const xmlChar *version,
+ pg_enc encoding, int standalone)
+{
+ if ((version && strcmp((const char *) version, PG_XML_DEFAULT_VERSION) != 0)
+ || (encoding && encoding != PG_UTF8)
+ || standalone != -1)
+ {
+ appendStringInfoString(buf, "<?xml");
+
+ if (version)
+ appendStringInfo(buf, " version=\"%s\"", version);
+ else
+ appendStringInfo(buf, " version=\"%s\"", PG_XML_DEFAULT_VERSION);
+
+ if (encoding && encoding != PG_UTF8)
+ {
+ /*
+ * XXX might be useful to convert this to IANA names (ISO-8859-1
+ * instead of LATIN1 etc.); needs field experience
+ */
+ appendStringInfo(buf, " encoding=\"%s\"",
+ pg_encoding_to_char(encoding));
+ }
+
+ if (standalone == 1)
+ appendStringInfoString(buf, " standalone=\"yes\"");
+ else if (standalone == 0)
+ appendStringInfoString(buf, " standalone=\"no\"");
+ appendStringInfoString(buf, "?>");
+
+ return true;
+ }
+ else
+ return false;
+}
+
+/*
+ * Test whether an input that is to be parsed as CONTENT contains a DTD.
+ *
+ * The SQL/XML:2003 definition of CONTENT ("XMLDecl? content") is not
+ * satisfied by a document with a DTD, which is a bit of a wart, as it means
+ * the CONTENT type is not a proper superset of DOCUMENT. SQL/XML:2006 and
+ * later fix that, by redefining content with reference to the "more
+ * permissive" Document Node of the XQuery/XPath Data Model, such that any
+ * DOCUMENT value is indeed also a CONTENT value. That definition is more
+ * useful, as CONTENT becomes usable for parsing input of unknown form (think
+ * pg_restore).
+ *
+ * As used below in parse_xml when parsing for CONTENT, libxml does not give
+ * us the 2006+ behavior, but only the 2003; it will choke if the input has
+ * a DTD. But we can provide the 2006+ definition of CONTENT easily enough,
+ * by detecting this case first and simply doing the parse as DOCUMENT.
+ *
+ * A DTD can be found arbitrarily far in, but that would be a contrived case;
+ * it will ordinarily start within a few dozen characters. The only things
+ * that can precede it are an XMLDecl (here, the caller will have called
+ * parse_xml_decl already), whitespace, comments, and processing instructions.
+ * This function need only return true if it sees a valid sequence of such
+ * things leading to <!DOCTYPE. It can simply return false in any other
+ * cases, including malformed input; that will mean the input gets parsed as
+ * CONTENT as originally planned, with libxml reporting any errors.
+ *
+ * This is only to be called from xml_parse, when pg_xml_init has already
+ * been called. The input is already in UTF8 encoding.
+ */
+static bool
+xml_doctype_in_content(const xmlChar *str)
+{
+ const xmlChar *p = str;
+
+ for (;;)
+ {
+ const xmlChar *e;
+
+ SKIP_XML_SPACE(p);
+ if (*p != '<')
+ return false;
+ p++;
+
+ if (*p == '!')
+ {
+ p++;
+
+ /* if we see <!DOCTYPE, we can return true */
+ if (xmlStrncmp(p, (xmlChar *) "DOCTYPE", 7) == 0)
+ return true;
+
+ /* otherwise, if it's not a comment, fail */
+ if (xmlStrncmp(p, (xmlChar *) "--", 2) != 0)
+ return false;
+ /* find end of comment: find -- and a > must follow */
+ p = xmlStrstr(p + 2, (xmlChar *) "--");
+ if (!p || p[2] != '>')
+ return false;
+ /* advance over comment, and keep scanning */
+ p += 3;
+ continue;
+ }
+
+ /* otherwise, if it's not a PI <?target something?>, fail */
+ if (*p != '?')
+ return false;
+ p++;
+
+ /* find end of PI (the string ?> is forbidden within a PI) */
+ e = xmlStrstr(p, (xmlChar *) "?>");
+ if (!e)
+ return false;
+
+ /* advance over PI, keep scanning */
+ p = e + 2;
+ }
+}
+
+
+/*
+ * Convert a C string to XML internal representation
+ *
+ * Note: it is caller's responsibility to xmlFreeDoc() the result,
+ * else a permanent memory leak will ensue!
+ *
+ * TODO maybe libxml2's xmlreader is better? (do not construct DOM,
+ * yet do not use SAX - see xmlreader.c)
+ */
+static xmlDocPtr
+xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace,
+ int encoding)
+{
+ int32 len;
+ xmlChar *string;
+ xmlChar *utf8string;
+ PgXmlErrorContext *xmlerrcxt;
+ volatile xmlParserCtxtPtr ctxt = NULL;
+ volatile xmlDocPtr doc = NULL;
+
+ len = VARSIZE_ANY_EXHDR(data); /* will be useful later */
+ string = xml_text2xmlChar(data);
+
+ utf8string = pg_do_encoding_conversion(string,
+ len,
+ encoding,
+ PG_UTF8);
+
+ /* Start up libxml and its parser */
+ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_WELLFORMED);
+
+ /* Use a TRY block to ensure we clean up correctly */
+ PG_TRY();
+ {
+ bool parse_as_document = false;
+ int res_code;
+ size_t count = 0;
+ xmlChar *version = NULL;
+ int standalone = 0;
+
+ xmlInitParser();
+
+ ctxt = xmlNewParserCtxt();
+ if (ctxt == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate parser context");
+
+ /* Decide whether to parse as document or content */
+ if (xmloption_arg == XMLOPTION_DOCUMENT)
+ parse_as_document = true;
+ else
+ {
+ /* Parse and skip over the XML declaration, if any */
+ res_code = parse_xml_decl(utf8string,
+ &count, &version, NULL, &standalone);
+ if (res_code != 0)
+ xml_ereport_by_code(ERROR, ERRCODE_INVALID_XML_CONTENT,
+ "invalid XML content: invalid XML declaration",
+ res_code);
+
+ /* Is there a DOCTYPE element? */
+ if (xml_doctype_in_content(utf8string + count))
+ parse_as_document = true;
+ }
+
+ if (parse_as_document)
+ {
+ /*
+ * Note, that here we try to apply DTD defaults
+ * (XML_PARSE_DTDATTR) according to SQL/XML:2008 GR 10.16.7.d:
+ * 'Default values defined by internal DTD are applied'. As for
+ * external DTDs, we try to support them too, (see SQL/XML:2008 GR
+ * 10.16.7.e)
+ */
+ doc = xmlCtxtReadDoc(ctxt, utf8string,
+ NULL,
+ "UTF-8",
+ XML_PARSE_NOENT | XML_PARSE_DTDATTR
+ | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS));
+ if (doc == NULL || xmlerrcxt->err_occurred)
+ {
+ /* Use original option to decide which error code to throw */
+ if (xmloption_arg == XMLOPTION_DOCUMENT)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
+ "invalid XML document");
+ else
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_CONTENT,
+ "invalid XML content");
+ }
+ }
+ else
+ {
+ doc = xmlNewDoc(version);
+ Assert(doc->encoding == NULL);
+ doc->encoding = xmlStrdup((const xmlChar *) "UTF-8");
+ doc->standalone = standalone;
+
+ /* allow empty content */
+ if (*(utf8string + count))
+ {
+ res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
+ utf8string + count, NULL);
+ if (res_code != 0 || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_CONTENT,
+ "invalid XML content");
+ }
+ }
+ }
+ PG_CATCH();
+ {
+ if (doc != NULL)
+ xmlFreeDoc(doc);
+ if (ctxt != NULL)
+ xmlFreeParserCtxt(ctxt);
+
+ pg_xml_done(xmlerrcxt, true);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xmlFreeParserCtxt(ctxt);
+
+ pg_xml_done(xmlerrcxt, false);
+
+ return doc;
+}
+
+
+/*
+ * xmlChar<->text conversions
+ */
+static xmlChar *
+xml_text2xmlChar(text *in)
+{
+ return (xmlChar *) text_to_cstring(in);
+}
+
+
+#ifdef USE_LIBXMLCONTEXT
+
+/*
+ * Manage the special context used for all libxml allocations (but only
+ * in special debug builds; see notes at top of file)
+ */
+static void
+xml_memory_init(void)
+{
+ /* Create memory context if not there already */
+ if (LibxmlContext == NULL)
+ LibxmlContext = AllocSetContextCreate(TopMemoryContext,
+ "Libxml context",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /* Re-establish the callbacks even if already set */
+ xmlMemSetup(xml_pfree, xml_palloc, xml_repalloc, xml_pstrdup);
+}
+
+/*
+ * Wrappers for memory management functions
+ */
+static void *
+xml_palloc(size_t size)
+{
+ return MemoryContextAlloc(LibxmlContext, size);
+}
+
+
+static void *
+xml_repalloc(void *ptr, size_t size)
+{
+ return repalloc(ptr, size);
+}
+
+
+static void
+xml_pfree(void *ptr)
+{
+ /* At least some parts of libxml assume xmlFree(NULL) is allowed */
+ if (ptr)
+ pfree(ptr);
+}
+
+
+static char *
+xml_pstrdup(const char *string)
+{
+ return MemoryContextStrdup(LibxmlContext, string);
+}
+#endif /* USE_LIBXMLCONTEXT */
+
+
+/*
+ * xmlPgEntityLoader --- entity loader callback function
+ *
+ * Silently prevent any external entity URL from being loaded. We don't want
+ * to throw an error, so instead make the entity appear to expand to an empty
+ * string.
+ *
+ * We would prefer to allow loading entities that exist in the system's
+ * global XML catalog; but the available libxml2 APIs make that a complex
+ * and fragile task. For now, just shut down all external access.
+ */
+static xmlParserInputPtr
+xmlPgEntityLoader(const char *URL, const char *ID,
+ xmlParserCtxtPtr ctxt)
+{
+ return xmlNewStringInputStream(ctxt, (const xmlChar *) "");
+}
+
+
+/*
+ * xml_ereport --- report an XML-related error
+ *
+ * The "msg" is the SQL-level message; some can be adopted from the SQL/XML
+ * standard. This function adds libxml's native error message, if any, as
+ * detail.
+ *
+ * This is exported for modules that want to share the core libxml error
+ * handler. Note that pg_xml_init() *must* have been called previously.
+ */
+void
+xml_ereport(PgXmlErrorContext *errcxt, int level, int sqlcode, const char *msg)
+{
+ char *detail;
+
+ /* Defend against someone passing us a bogus context struct */
+ if (errcxt->magic != ERRCXT_MAGIC)
+ elog(ERROR, "xml_ereport called with invalid PgXmlErrorContext");
+
+ /* Flag that the current libxml error has been reported */
+ errcxt->err_occurred = false;
+
+ /* Include detail only if we have some text from libxml */
+ if (errcxt->err_buf.len > 0)
+ detail = errcxt->err_buf.data;
+ else
+ detail = NULL;
+
+ ereport(level,
+ (errcode(sqlcode),
+ errmsg_internal("%s", msg),
+ detail ? errdetail_internal("%s", detail) : 0));
+}
+
+
+/*
+ * Error handler for libxml errors and warnings
+ */
+static void
+xml_errorHandler(void *data, xmlErrorPtr error)
+{
+ PgXmlErrorContext *xmlerrcxt = (PgXmlErrorContext *) data;
+ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) error->ctxt;
+ xmlParserInputPtr input = (ctxt != NULL) ? ctxt->input : NULL;
+ xmlNodePtr node = error->node;
+ const xmlChar *name = (node != NULL &&
+ node->type == XML_ELEMENT_NODE) ? node->name : NULL;
+ int domain = error->domain;
+ int level = error->level;
+ StringInfo errorBuf;
+
+ /*
+ * Defend against someone passing us a bogus context struct.
+ *
+ * We force a backend exit if this check fails because longjmp'ing out of
+ * libxml would likely render it unsafe to use further.
+ */
+ if (xmlerrcxt->magic != ERRCXT_MAGIC)
+ elog(FATAL, "xml_errorHandler called with invalid PgXmlErrorContext");
+
+ /*----------
+ * Older libxml versions report some errors differently.
+ * First, some errors were previously reported as coming from the parser
+ * domain but are now reported as coming from the namespace domain.
+ * Second, some warnings were upgraded to errors.
+ * We attempt to compensate for that here.
+ *----------
+ */
+ switch (error->code)
+ {
+ case XML_WAR_NS_URI:
+ level = XML_ERR_ERROR;
+ domain = XML_FROM_NAMESPACE;
+ break;
+
+ case XML_ERR_NS_DECL_ERROR:
+ case XML_WAR_NS_URI_RELATIVE:
+ case XML_WAR_NS_COLUMN:
+ case XML_NS_ERR_XML_NAMESPACE:
+ case XML_NS_ERR_UNDEFINED_NAMESPACE:
+ case XML_NS_ERR_QNAME:
+ case XML_NS_ERR_ATTRIBUTE_REDEFINED:
+ case XML_NS_ERR_EMPTY:
+ domain = XML_FROM_NAMESPACE;
+ break;
+ }
+
+ /* Decide whether to act on the error or not */
+ switch (domain)
+ {
+ case XML_FROM_PARSER:
+ case XML_FROM_NONE:
+ case XML_FROM_MEMORY:
+ case XML_FROM_IO:
+
+ /*
+ * Suppress warnings about undeclared entities. We need to do
+ * this to avoid problems due to not loading DTD definitions.
+ */
+ if (error->code == XML_WAR_UNDECLARED_ENTITY)
+ return;
+
+ /* Otherwise, accept error regardless of the parsing purpose */
+ break;
+
+ default:
+ /* Ignore error if only doing well-formedness check */
+ if (xmlerrcxt->strictness == PG_XML_STRICTNESS_WELLFORMED)
+ return;
+ break;
+ }
+
+ /* Prepare error message in errorBuf */
+ errorBuf = makeStringInfo();
+
+ if (error->line > 0)
+ appendStringInfo(errorBuf, "line %d: ", error->line);
+ if (name != NULL)
+ appendStringInfo(errorBuf, "element %s: ", name);
+ if (error->message != NULL)
+ appendStringInfoString(errorBuf, error->message);
+ else
+ appendStringInfoString(errorBuf, "(no message provided)");
+
+ /*
+ * Append context information to errorBuf.
+ *
+ * xmlParserPrintFileContext() uses libxml's "generic" error handler to
+ * write the context. Since we don't want to duplicate libxml
+ * functionality here, we set up a generic error handler temporarily.
+ *
+ * We use appendStringInfo() directly as libxml's generic error handler.
+ * This should work because it has essentially the same signature as
+ * libxml expects, namely (void *ptr, const char *msg, ...).
+ */
+ if (input != NULL)
+ {
+ xmlGenericErrorFunc errFuncSaved = xmlGenericError;
+ void *errCtxSaved = xmlGenericErrorContext;
+
+ xmlSetGenericErrorFunc((void *) errorBuf,
+ (xmlGenericErrorFunc) appendStringInfo);
+
+ /* Add context information to errorBuf */
+ appendStringInfoLineSeparator(errorBuf);
+
+ xmlParserPrintFileContext(input);
+
+ /* Restore generic error func */
+ xmlSetGenericErrorFunc(errCtxSaved, errFuncSaved);
+ }
+
+ /* Get rid of any trailing newlines in errorBuf */
+ chopStringInfoNewlines(errorBuf);
+
+ /*
+ * Legacy error handling mode. err_occurred is never set, we just add the
+ * message to err_buf. This mode exists because the xml2 contrib module
+ * uses our error-handling infrastructure, but we don't want to change its
+ * behaviour since it's deprecated anyway. This is also why we don't
+ * distinguish between notices, warnings and errors here --- the old-style
+ * generic error handler wouldn't have done that either.
+ */
+ if (xmlerrcxt->strictness == PG_XML_STRICTNESS_LEGACY)
+ {
+ appendStringInfoLineSeparator(&xmlerrcxt->err_buf);
+ appendBinaryStringInfo(&xmlerrcxt->err_buf, errorBuf->data,
+ errorBuf->len);
+
+ pfree(errorBuf->data);
+ pfree(errorBuf);
+ return;
+ }
+
+ /*
+ * We don't want to ereport() here because that'd probably leave libxml in
+ * an inconsistent state. Instead, we remember the error and ereport()
+ * from xml_ereport().
+ *
+ * Warnings and notices can be reported immediately since they won't cause
+ * a longjmp() out of libxml.
+ */
+ if (level >= XML_ERR_ERROR)
+ {
+ appendStringInfoLineSeparator(&xmlerrcxt->err_buf);
+ appendBinaryStringInfo(&xmlerrcxt->err_buf, errorBuf->data,
+ errorBuf->len);
+
+ xmlerrcxt->err_occurred = true;
+ }
+ else if (level >= XML_ERR_WARNING)
+ {
+ ereport(WARNING,
+ (errmsg_internal("%s", errorBuf->data)));
+ }
+ else
+ {
+ ereport(NOTICE,
+ (errmsg_internal("%s", errorBuf->data)));
+ }
+
+ pfree(errorBuf->data);
+ pfree(errorBuf);
+}
+
+
+/*
+ * Wrapper for "ereport" function for XML-related errors. The "msg"
+ * is the SQL-level message; some can be adopted from the SQL/XML
+ * standard. This function uses "code" to create a textual detail
+ * message. At the moment, we only need to cover those codes that we
+ * may raise in this file.
+ */
+static void
+xml_ereport_by_code(int level, int sqlcode,
+ const char *msg, int code)
+{
+ const char *det;
+
+ switch (code)
+ {
+ case XML_ERR_INVALID_CHAR:
+ det = gettext_noop("Invalid character value.");
+ break;
+ case XML_ERR_SPACE_REQUIRED:
+ det = gettext_noop("Space required.");
+ break;
+ case XML_ERR_STANDALONE_VALUE:
+ det = gettext_noop("standalone accepts only 'yes' or 'no'.");
+ break;
+ case XML_ERR_VERSION_MISSING:
+ det = gettext_noop("Malformed declaration: missing version.");
+ break;
+ case XML_ERR_MISSING_ENCODING:
+ det = gettext_noop("Missing encoding in text declaration.");
+ break;
+ case XML_ERR_XMLDECL_NOT_FINISHED:
+ det = gettext_noop("Parsing XML declaration: '?>' expected.");
+ break;
+ default:
+ det = gettext_noop("Unrecognized libxml error code: %d.");
+ break;
+ }
+
+ ereport(level,
+ (errcode(sqlcode),
+ errmsg_internal("%s", msg),
+ errdetail(det, code)));
+}
+
+
+/*
+ * Remove all trailing newlines from a StringInfo string
+ */
+static void
+chopStringInfoNewlines(StringInfo str)
+{
+ while (str->len > 0 && str->data[str->len - 1] == '\n')
+ str->data[--str->len] = '\0';
+}
+
+
+/*
+ * Append a newline after removing any existing trailing newlines
+ */
+static void
+appendStringInfoLineSeparator(StringInfo str)
+{
+ chopStringInfoNewlines(str);
+ if (str->len > 0)
+ appendStringInfoChar(str, '\n');
+}
+
+
+/*
+ * Convert one char in the current server encoding to a Unicode codepoint.
+ */
+static pg_wchar
+sqlchar_to_unicode(const char *s)
+{
+ char *utf8string;
+ pg_wchar ret[2]; /* need space for trailing zero */
+
+ /* note we're not assuming s is null-terminated */
+ utf8string = pg_server_to_any(s, pg_mblen(s), PG_UTF8);
+
+ pg_encoding_mb2wchar_with_len(PG_UTF8, utf8string, ret,
+ pg_encoding_mblen(PG_UTF8, utf8string));
+
+ if (utf8string != s)
+ pfree(utf8string);
+
+ return ret[0];
+}
+
+
+static bool
+is_valid_xml_namefirst(pg_wchar c)
+{
+ /* (Letter | '_' | ':') */
+ return (xmlIsBaseCharQ(c) || xmlIsIdeographicQ(c)
+ || c == '_' || c == ':');
+}
+
+
+static bool
+is_valid_xml_namechar(pg_wchar c)
+{
+ /* Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender */
+ return (xmlIsBaseCharQ(c) || xmlIsIdeographicQ(c)
+ || xmlIsDigitQ(c)
+ || c == '.' || c == '-' || c == '_' || c == ':'
+ || xmlIsCombiningQ(c)
+ || xmlIsExtenderQ(c));
+}
+#endif /* USE_LIBXML */
+
+
+/*
+ * Map SQL identifier to XML name; see SQL/XML:2008 section 9.1.
+ */
+char *
+map_sql_identifier_to_xml_name(const char *ident, bool fully_escaped,
+ bool escape_period)
+{
+#ifdef USE_LIBXML
+ StringInfoData buf;
+ const char *p;
+
+ /*
+ * SQL/XML doesn't make use of this case anywhere, so it's probably a
+ * mistake.
+ */
+ Assert(fully_escaped || !escape_period);
+
+ initStringInfo(&buf);
+
+ for (p = ident; *p; p += pg_mblen(p))
+ {
+ if (*p == ':' && (p == ident || fully_escaped))
+ appendStringInfoString(&buf, "_x003A_");
+ else if (*p == '_' && *(p + 1) == 'x')
+ appendStringInfoString(&buf, "_x005F_");
+ else if (fully_escaped && p == ident &&
+ pg_strncasecmp(p, "xml", 3) == 0)
+ {
+ if (*p == 'x')
+ appendStringInfoString(&buf, "_x0078_");
+ else
+ appendStringInfoString(&buf, "_x0058_");
+ }
+ else if (escape_period && *p == '.')
+ appendStringInfoString(&buf, "_x002E_");
+ else
+ {
+ pg_wchar u = sqlchar_to_unicode(p);
+
+ if ((p == ident)
+ ? !is_valid_xml_namefirst(u)
+ : !is_valid_xml_namechar(u))
+ appendStringInfo(&buf, "_x%04X_", (unsigned int) u);
+ else
+ appendBinaryStringInfo(&buf, p, pg_mblen(p));
+ }
+ }
+
+ return buf.data;
+#else /* not USE_LIBXML */
+ NO_XML_SUPPORT();
+ return NULL;
+#endif /* not USE_LIBXML */
+}
+
+
+/*
+ * Map XML name to SQL identifier; see SQL/XML:2008 section 9.3.
+ */
+char *
+map_xml_name_to_sql_identifier(const char *name)
+{
+ StringInfoData buf;
+ const char *p;
+
+ initStringInfo(&buf);
+
+ for (p = name; *p; p += pg_mblen(p))
+ {
+ if (*p == '_' && *(p + 1) == 'x'
+ && isxdigit((unsigned char) *(p + 2))
+ && isxdigit((unsigned char) *(p + 3))
+ && isxdigit((unsigned char) *(p + 4))
+ && isxdigit((unsigned char) *(p + 5))
+ && *(p + 6) == '_')
+ {
+ char cbuf[MAX_UNICODE_EQUIVALENT_STRING + 1];
+ unsigned int u;
+
+ sscanf(p + 2, "%X", &u);
+ pg_unicode_to_server(u, (unsigned char *) cbuf);
+ appendStringInfoString(&buf, cbuf);
+ p += 6;
+ }
+ else
+ appendBinaryStringInfo(&buf, p, pg_mblen(p));
+ }
+
+ return buf.data;
+}
+
+/*
+ * Map SQL value to XML value; see SQL/XML:2008 section 9.8.
+ *
+ * When xml_escape_strings is true, then certain characters in string
+ * values are replaced by entity references (&lt; etc.), as specified
+ * in SQL/XML:2008 section 9.8 GR 9) a) iii). This is normally what is
+ * wanted. The false case is mainly useful when the resulting value
+ * is used with xmlTextWriterWriteAttribute() to write out an
+ * attribute, because that function does the escaping itself.
+ */
+char *
+map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings)
+{
+ if (type_is_array_domain(type))
+ {
+ ArrayType *array;
+ Oid elmtype;
+ int16 elmlen;
+ bool elmbyval;
+ char elmalign;
+ int num_elems;
+ Datum *elem_values;
+ bool *elem_nulls;
+ StringInfoData buf;
+ int i;
+
+ array = DatumGetArrayTypeP(value);
+ elmtype = ARR_ELEMTYPE(array);
+ get_typlenbyvalalign(elmtype, &elmlen, &elmbyval, &elmalign);
+
+ deconstruct_array(array, elmtype,
+ elmlen, elmbyval, elmalign,
+ &elem_values, &elem_nulls,
+ &num_elems);
+
+ initStringInfo(&buf);
+
+ for (i = 0; i < num_elems; i++)
+ {
+ if (elem_nulls[i])
+ continue;
+ appendStringInfoString(&buf, "<element>");
+ appendStringInfoString(&buf,
+ map_sql_value_to_xml_value(elem_values[i],
+ elmtype, true));
+ appendStringInfoString(&buf, "</element>");
+ }
+
+ pfree(elem_values);
+ pfree(elem_nulls);
+
+ return buf.data;
+ }
+ else
+ {
+ Oid typeOut;
+ bool isvarlena;
+ char *str;
+
+ /*
+ * Flatten domains; the special-case treatments below should apply to,
+ * eg, domains over boolean not just boolean.
+ */
+ type = getBaseType(type);
+
+ /*
+ * Special XSD formatting for some data types
+ */
+ switch (type)
+ {
+ case BOOLOID:
+ if (DatumGetBool(value))
+ return "true";
+ else
+ return "false";
+
+ case DATEOID:
+ {
+ DateADT date;
+ struct pg_tm tm;
+ char buf[MAXDATELEN + 1];
+
+ date = DatumGetDateADT(value);
+ /* XSD doesn't support infinite values */
+ if (DATE_NOT_FINITE(date))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("date out of range"),
+ errdetail("XML does not support infinite date values.")));
+ j2date(date + POSTGRES_EPOCH_JDATE,
+ &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday));
+ EncodeDateOnly(&tm, USE_XSD_DATES, buf);
+
+ return pstrdup(buf);
+ }
+
+ case TIMESTAMPOID:
+ {
+ Timestamp timestamp;
+ struct pg_tm tm;
+ fsec_t fsec;
+ char buf[MAXDATELEN + 1];
+
+ timestamp = DatumGetTimestamp(value);
+
+ /* XSD doesn't support infinite values */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range"),
+ errdetail("XML does not support infinite timestamp values.")));
+ else if (timestamp2tm(timestamp, NULL, &tm, &fsec, NULL, NULL) == 0)
+ EncodeDateTime(&tm, fsec, false, 0, NULL, USE_XSD_DATES, buf);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ return pstrdup(buf);
+ }
+
+ case TIMESTAMPTZOID:
+ {
+ TimestampTz timestamp;
+ struct pg_tm tm;
+ int tz;
+ fsec_t fsec;
+ const char *tzn = NULL;
+ char buf[MAXDATELEN + 1];
+
+ timestamp = DatumGetTimestamp(value);
+
+ /* XSD doesn't support infinite values */
+ if (TIMESTAMP_NOT_FINITE(timestamp))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range"),
+ errdetail("XML does not support infinite timestamp values.")));
+ else if (timestamp2tm(timestamp, &tz, &tm, &fsec, &tzn, NULL) == 0)
+ EncodeDateTime(&tm, fsec, true, tz, tzn, USE_XSD_DATES, buf);
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
+
+ return pstrdup(buf);
+ }
+
+#ifdef USE_LIBXML
+ case BYTEAOID:
+ {
+ bytea *bstr = DatumGetByteaPP(value);
+ PgXmlErrorContext *xmlerrcxt;
+ volatile xmlBufferPtr buf = NULL;
+ volatile xmlTextWriterPtr writer = NULL;
+ char *result;
+
+ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL);
+
+ PG_TRY();
+ {
+ buf = xmlBufferCreate();
+ if (buf == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate xmlBuffer");
+ writer = xmlNewTextWriterMemory(buf, 0);
+ if (writer == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate xmlTextWriter");
+
+ if (xmlbinary == XMLBINARY_BASE64)
+ xmlTextWriterWriteBase64(writer, VARDATA_ANY(bstr),
+ 0, VARSIZE_ANY_EXHDR(bstr));
+ else
+ xmlTextWriterWriteBinHex(writer, VARDATA_ANY(bstr),
+ 0, VARSIZE_ANY_EXHDR(bstr));
+
+ /* we MUST do this now to flush data out to the buffer */
+ xmlFreeTextWriter(writer);
+ writer = NULL;
+
+ result = pstrdup((const char *) xmlBufferContent(buf));
+ }
+ PG_CATCH();
+ {
+ if (writer)
+ xmlFreeTextWriter(writer);
+ if (buf)
+ xmlBufferFree(buf);
+
+ pg_xml_done(xmlerrcxt, true);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xmlBufferFree(buf);
+
+ pg_xml_done(xmlerrcxt, false);
+
+ return result;
+ }
+#endif /* USE_LIBXML */
+
+ }
+
+ /*
+ * otherwise, just use the type's native text representation
+ */
+ getTypeOutputInfo(type, &typeOut, &isvarlena);
+ str = OidOutputFunctionCall(typeOut, value);
+
+ /* ... exactly as-is for XML, and when escaping is not wanted */
+ if (type == XMLOID || !xml_escape_strings)
+ return str;
+
+ /* otherwise, translate special characters as needed */
+ return escape_xml(str);
+ }
+}
+
+
+/*
+ * Escape characters in text that have special meanings in XML.
+ *
+ * Returns a palloc'd string.
+ *
+ * NB: this is intentionally not dependent on libxml.
+ */
+char *
+escape_xml(const char *str)
+{
+ StringInfoData buf;
+ const char *p;
+
+ initStringInfo(&buf);
+ for (p = str; *p; p++)
+ {
+ switch (*p)
+ {
+ case '&':
+ appendStringInfoString(&buf, "&amp;");
+ break;
+ case '<':
+ appendStringInfoString(&buf, "&lt;");
+ break;
+ case '>':
+ appendStringInfoString(&buf, "&gt;");
+ break;
+ case '\r':
+ appendStringInfoString(&buf, "&#x0d;");
+ break;
+ default:
+ appendStringInfoCharMacro(&buf, *p);
+ break;
+ }
+ }
+ return buf.data;
+}
+
+
+static char *
+_SPI_strdup(const char *s)
+{
+ size_t len = strlen(s) + 1;
+ char *ret = SPI_palloc(len);
+
+ memcpy(ret, s, len);
+ return ret;
+}
+
+
+/*
+ * SQL to XML mapping functions
+ *
+ * What follows below was at one point intentionally organized so that
+ * you can read along in the SQL/XML standard. The functions are
+ * mostly split up the way the clauses lay out in the standards
+ * document, and the identifiers are also aligned with the standard
+ * text. Unfortunately, SQL/XML:2006 reordered the clauses
+ * differently than SQL/XML:2003, so the order below doesn't make much
+ * sense anymore.
+ *
+ * There are many things going on there:
+ *
+ * There are two kinds of mappings: Mapping SQL data (table contents)
+ * to XML documents, and mapping SQL structure (the "schema") to XML
+ * Schema. And there are functions that do both at the same time.
+ *
+ * Then you can map a database, a schema, or a table, each in both
+ * ways. This breaks down recursively: Mapping a database invokes
+ * mapping schemas, which invokes mapping tables, which invokes
+ * mapping rows, which invokes mapping columns, although you can't
+ * call the last two from the outside. Because of this, there are a
+ * number of xyz_internal() functions which are to be called both from
+ * the function manager wrapper and from some upper layer in a
+ * recursive call.
+ *
+ * See the documentation about what the common function arguments
+ * nulls, tableforest, and targetns mean.
+ *
+ * Some style guidelines for XML output: Use double quotes for quoting
+ * XML attributes. Indent XML elements by two spaces, but remember
+ * that a lot of code is called recursively at different levels, so
+ * it's better not to indent rather than create output that indents
+ * and outdents weirdly. Add newlines to make the output look nice.
+ */
+
+
+/*
+ * Visibility of objects for XML mappings; see SQL/XML:2008 section
+ * 4.10.8.
+ */
+
+/*
+ * Given a query, which must return type oid as first column, produce
+ * a list of Oids with the query results.
+ */
+static List *
+query_to_oid_list(const char *query)
+{
+ uint64 i;
+ List *list = NIL;
+ int spi_result;
+
+ spi_result = SPI_execute(query, true, 0);
+ if (spi_result != SPI_OK_SELECT)
+ elog(ERROR, "SPI_execute returned %s for %s",
+ SPI_result_code_string(spi_result), query);
+
+ for (i = 0; i < SPI_processed; i++)
+ {
+ Datum oid;
+ bool isnull;
+
+ oid = SPI_getbinval(SPI_tuptable->vals[i],
+ SPI_tuptable->tupdesc,
+ 1,
+ &isnull);
+ if (!isnull)
+ list = lappend_oid(list, DatumGetObjectId(oid));
+ }
+
+ return list;
+}
+
+
+static List *
+schema_get_xml_visible_tables(Oid nspid)
+{
+ StringInfoData query;
+
+ initStringInfo(&query);
+ appendStringInfo(&query, "SELECT oid FROM pg_catalog.pg_class"
+ " WHERE relnamespace = %u AND relkind IN ("
+ CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ")"
+ " AND pg_catalog.has_table_privilege (oid, 'SELECT')"
+ " ORDER BY relname;", nspid);
+
+ return query_to_oid_list(query.data);
+}
+
+
+/*
+ * Including the system schemas is probably not useful for a database
+ * mapping.
+ */
+#define XML_VISIBLE_SCHEMAS_EXCLUDE "(nspname ~ '^pg_' OR nspname = 'information_schema')"
+
+#define XML_VISIBLE_SCHEMAS "SELECT oid FROM pg_catalog.pg_namespace WHERE pg_catalog.has_schema_privilege (oid, 'USAGE') AND NOT " XML_VISIBLE_SCHEMAS_EXCLUDE
+
+
+static List *
+database_get_xml_visible_schemas(void)
+{
+ return query_to_oid_list(XML_VISIBLE_SCHEMAS " ORDER BY nspname;");
+}
+
+
+static List *
+database_get_xml_visible_tables(void)
+{
+ /* At the moment there is no order required here. */
+ return query_to_oid_list("SELECT oid FROM pg_catalog.pg_class"
+ " WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ")"
+ " AND pg_catalog.has_table_privilege(pg_class.oid, 'SELECT')"
+ " AND relnamespace IN (" XML_VISIBLE_SCHEMAS ");");
+}
+
+
+/*
+ * Map SQL table to XML and/or XML Schema document; see SQL/XML:2008
+ * section 9.11.
+ */
+
+static StringInfo
+table_to_xml_internal(Oid relid,
+ const char *xmlschema, bool nulls, bool tableforest,
+ const char *targetns, bool top_level)
+{
+ StringInfoData query;
+
+ initStringInfo(&query);
+ appendStringInfo(&query, "SELECT * FROM %s",
+ DatumGetCString(DirectFunctionCall1(regclassout,
+ ObjectIdGetDatum(relid))));
+ return query_to_xml_internal(query.data, get_rel_name(relid),
+ xmlschema, nulls, tableforest,
+ targetns, top_level);
+}
+
+
+Datum
+table_to_xml(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(table_to_xml_internal(relid, NULL,
+ nulls, tableforest,
+ targetns, true)));
+}
+
+
+Datum
+query_to_xml(PG_FUNCTION_ARGS)
+{
+ char *query = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(query_to_xml_internal(query, NULL,
+ NULL, nulls, tableforest,
+ targetns, true)));
+}
+
+
+Datum
+cursor_to_xml(PG_FUNCTION_ARGS)
+{
+ char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ int32 count = PG_GETARG_INT32(1);
+ bool nulls = PG_GETARG_BOOL(2);
+ bool tableforest = PG_GETARG_BOOL(3);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(4));
+
+ StringInfoData result;
+ Portal portal;
+ uint64 i;
+
+ initStringInfo(&result);
+
+ if (!tableforest)
+ {
+ xmldata_root_element_start(&result, "table", NULL, targetns, true);
+ appendStringInfoChar(&result, '\n');
+ }
+
+ SPI_connect();
+ portal = SPI_cursor_find(name);
+ if (portal == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_CURSOR),
+ errmsg("cursor \"%s\" does not exist", name)));
+
+ SPI_cursor_fetch(portal, true, count);
+ for (i = 0; i < SPI_processed; i++)
+ SPI_sql_row_to_xmlelement(i, &result, NULL, nulls,
+ tableforest, targetns, true);
+
+ SPI_finish();
+
+ if (!tableforest)
+ xmldata_root_element_end(&result, "table");
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(&result));
+}
+
+
+/*
+ * Write the start tag of the root element of a data mapping.
+ *
+ * top_level means that this is the very top level of the eventual
+ * output. For example, when the user calls table_to_xml, then a call
+ * with a table name to this function is the top level. When the user
+ * calls database_to_xml, then a call with a schema name to this
+ * function is not the top level. If top_level is false, then the XML
+ * namespace declarations are omitted, because they supposedly already
+ * appeared earlier in the output. Repeating them is not wrong, but
+ * it looks ugly.
+ */
+static void
+xmldata_root_element_start(StringInfo result, const char *eltname,
+ const char *xmlschema, const char *targetns,
+ bool top_level)
+{
+ /* This isn't really wrong but currently makes no sense. */
+ Assert(top_level || !xmlschema);
+
+ appendStringInfo(result, "<%s", eltname);
+ if (top_level)
+ {
+ appendStringInfoString(result, " xmlns:xsi=\"" NAMESPACE_XSI "\"");
+ if (strlen(targetns) > 0)
+ appendStringInfo(result, " xmlns=\"%s\"", targetns);
+ }
+ if (xmlschema)
+ {
+ /* FIXME: better targets */
+ if (strlen(targetns) > 0)
+ appendStringInfo(result, " xsi:schemaLocation=\"%s #\"", targetns);
+ else
+ appendStringInfoString(result, " xsi:noNamespaceSchemaLocation=\"#\"");
+ }
+ appendStringInfoString(result, ">\n");
+}
+
+
+static void
+xmldata_root_element_end(StringInfo result, const char *eltname)
+{
+ appendStringInfo(result, "</%s>\n", eltname);
+}
+
+
+static StringInfo
+query_to_xml_internal(const char *query, char *tablename,
+ const char *xmlschema, bool nulls, bool tableforest,
+ const char *targetns, bool top_level)
+{
+ StringInfo result;
+ char *xmltn;
+ uint64 i;
+
+ if (tablename)
+ xmltn = map_sql_identifier_to_xml_name(tablename, true, false);
+ else
+ xmltn = "table";
+
+ result = makeStringInfo();
+
+ SPI_connect();
+ if (SPI_execute(query, true, 0) != SPI_OK_SELECT)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid query")));
+
+ if (!tableforest)
+ {
+ xmldata_root_element_start(result, xmltn, xmlschema,
+ targetns, top_level);
+ appendStringInfoChar(result, '\n');
+ }
+
+ if (xmlschema)
+ appendStringInfo(result, "%s\n\n", xmlschema);
+
+ for (i = 0; i < SPI_processed; i++)
+ SPI_sql_row_to_xmlelement(i, result, tablename, nulls,
+ tableforest, targetns, top_level);
+
+ if (!tableforest)
+ xmldata_root_element_end(result, xmltn);
+
+ SPI_finish();
+
+ return result;
+}
+
+
+Datum
+table_to_xmlschema(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ const char *result;
+ Relation rel;
+
+ rel = table_open(relid, AccessShareLock);
+ result = map_sql_table_to_xmlschema(rel->rd_att, relid, nulls,
+ tableforest, targetns);
+ table_close(rel, NoLock);
+
+ PG_RETURN_XML_P(cstring_to_xmltype(result));
+}
+
+
+Datum
+query_to_xmlschema(PG_FUNCTION_ARGS)
+{
+ char *query = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ const char *result;
+ SPIPlanPtr plan;
+ Portal portal;
+
+ SPI_connect();
+
+ if ((plan = SPI_prepare(query, 0, NULL)) == NULL)
+ elog(ERROR, "SPI_prepare(\"%s\") failed", query);
+
+ if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
+ elog(ERROR, "SPI_cursor_open(\"%s\") failed", query);
+
+ result = _SPI_strdup(map_sql_table_to_xmlschema(portal->tupDesc,
+ InvalidOid, nulls,
+ tableforest, targetns));
+ SPI_cursor_close(portal);
+ SPI_finish();
+
+ PG_RETURN_XML_P(cstring_to_xmltype(result));
+}
+
+
+Datum
+cursor_to_xmlschema(PG_FUNCTION_ARGS)
+{
+ char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ const char *xmlschema;
+ Portal portal;
+
+ SPI_connect();
+ portal = SPI_cursor_find(name);
+ if (portal == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_CURSOR),
+ errmsg("cursor \"%s\" does not exist", name)));
+ if (portal->tupDesc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_CURSOR_STATE),
+ errmsg("portal \"%s\" does not return tuples", name)));
+
+ xmlschema = _SPI_strdup(map_sql_table_to_xmlschema(portal->tupDesc,
+ InvalidOid, nulls,
+ tableforest, targetns));
+ SPI_finish();
+
+ PG_RETURN_XML_P(cstring_to_xmltype(xmlschema));
+}
+
+
+Datum
+table_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ Relation rel;
+ const char *xmlschema;
+
+ rel = table_open(relid, AccessShareLock);
+ xmlschema = map_sql_table_to_xmlschema(rel->rd_att, relid, nulls,
+ tableforest, targetns);
+ table_close(rel, NoLock);
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(table_to_xml_internal(relid,
+ xmlschema, nulls, tableforest,
+ targetns, true)));
+}
+
+
+Datum
+query_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
+{
+ char *query = text_to_cstring(PG_GETARG_TEXT_PP(0));
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+
+ const char *xmlschema;
+ SPIPlanPtr plan;
+ Portal portal;
+
+ SPI_connect();
+
+ if ((plan = SPI_prepare(query, 0, NULL)) == NULL)
+ elog(ERROR, "SPI_prepare(\"%s\") failed", query);
+
+ if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
+ elog(ERROR, "SPI_cursor_open(\"%s\") failed", query);
+
+ xmlschema = _SPI_strdup(map_sql_table_to_xmlschema(portal->tupDesc,
+ InvalidOid, nulls, tableforest, targetns));
+ SPI_cursor_close(portal);
+ SPI_finish();
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(query_to_xml_internal(query, NULL,
+ xmlschema, nulls, tableforest,
+ targetns, true)));
+}
+
+
+/*
+ * Map SQL schema to XML and/or XML Schema document; see SQL/XML:2008
+ * sections 9.13, 9.14.
+ */
+
+static StringInfo
+schema_to_xml_internal(Oid nspid, const char *xmlschema, bool nulls,
+ bool tableforest, const char *targetns, bool top_level)
+{
+ StringInfo result;
+ char *xmlsn;
+ List *relid_list;
+ ListCell *cell;
+
+ xmlsn = map_sql_identifier_to_xml_name(get_namespace_name(nspid),
+ true, false);
+ result = makeStringInfo();
+
+ xmldata_root_element_start(result, xmlsn, xmlschema, targetns, top_level);
+ appendStringInfoChar(result, '\n');
+
+ if (xmlschema)
+ appendStringInfo(result, "%s\n\n", xmlschema);
+
+ SPI_connect();
+
+ relid_list = schema_get_xml_visible_tables(nspid);
+
+ foreach(cell, relid_list)
+ {
+ Oid relid = lfirst_oid(cell);
+ StringInfo subres;
+
+ subres = table_to_xml_internal(relid, NULL, nulls, tableforest,
+ targetns, false);
+
+ appendBinaryStringInfo(result, subres->data, subres->len);
+ appendStringInfoChar(result, '\n');
+ }
+
+ SPI_finish();
+
+ xmldata_root_element_end(result, xmlsn);
+
+ return result;
+}
+
+
+Datum
+schema_to_xml(PG_FUNCTION_ARGS)
+{
+ Name name = PG_GETARG_NAME(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+
+ char *schemaname;
+ Oid nspid;
+
+ schemaname = NameStr(*name);
+ nspid = LookupExplicitNamespace(schemaname, false);
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(schema_to_xml_internal(nspid, NULL,
+ nulls, tableforest, targetns, true)));
+}
+
+
+/*
+ * Write the start element of the root element of an XML Schema mapping.
+ */
+static void
+xsd_schema_element_start(StringInfo result, const char *targetns)
+{
+ appendStringInfoString(result,
+ "<xsd:schema\n"
+ " xmlns:xsd=\"" NAMESPACE_XSD "\"");
+ if (strlen(targetns) > 0)
+ appendStringInfo(result,
+ "\n"
+ " targetNamespace=\"%s\"\n"
+ " elementFormDefault=\"qualified\"",
+ targetns);
+ appendStringInfoString(result,
+ ">\n\n");
+}
+
+
+static void
+xsd_schema_element_end(StringInfo result)
+{
+ appendStringInfoString(result, "</xsd:schema>");
+}
+
+
+static StringInfo
+schema_to_xmlschema_internal(const char *schemaname, bool nulls,
+ bool tableforest, const char *targetns)
+{
+ Oid nspid;
+ List *relid_list;
+ List *tupdesc_list;
+ ListCell *cell;
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ nspid = LookupExplicitNamespace(schemaname, false);
+
+ xsd_schema_element_start(result, targetns);
+
+ SPI_connect();
+
+ relid_list = schema_get_xml_visible_tables(nspid);
+
+ tupdesc_list = NIL;
+ foreach(cell, relid_list)
+ {
+ Relation rel;
+
+ rel = table_open(lfirst_oid(cell), AccessShareLock);
+ tupdesc_list = lappend(tupdesc_list, CreateTupleDescCopy(rel->rd_att));
+ table_close(rel, NoLock);
+ }
+
+ appendStringInfoString(result,
+ map_sql_typecoll_to_xmlschema_types(tupdesc_list));
+
+ appendStringInfoString(result,
+ map_sql_schema_to_xmlschema_types(nspid, relid_list,
+ nulls, tableforest, targetns));
+
+ xsd_schema_element_end(result);
+
+ SPI_finish();
+
+ return result;
+}
+
+
+Datum
+schema_to_xmlschema(PG_FUNCTION_ARGS)
+{
+ Name name = PG_GETARG_NAME(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(schema_to_xmlschema_internal(NameStr(*name),
+ nulls, tableforest, targetns)));
+}
+
+
+Datum
+schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
+{
+ Name name = PG_GETARG_NAME(0);
+ bool nulls = PG_GETARG_BOOL(1);
+ bool tableforest = PG_GETARG_BOOL(2);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ char *schemaname;
+ Oid nspid;
+ StringInfo xmlschema;
+
+ schemaname = NameStr(*name);
+ nspid = LookupExplicitNamespace(schemaname, false);
+
+ xmlschema = schema_to_xmlschema_internal(schemaname, nulls,
+ tableforest, targetns);
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(schema_to_xml_internal(nspid,
+ xmlschema->data, nulls,
+ tableforest, targetns, true)));
+}
+
+
+/*
+ * Map SQL database to XML and/or XML Schema document; see SQL/XML:2008
+ * sections 9.16, 9.17.
+ */
+
+static StringInfo
+database_to_xml_internal(const char *xmlschema, bool nulls,
+ bool tableforest, const char *targetns)
+{
+ StringInfo result;
+ List *nspid_list;
+ ListCell *cell;
+ char *xmlcn;
+
+ xmlcn = map_sql_identifier_to_xml_name(get_database_name(MyDatabaseId),
+ true, false);
+ result = makeStringInfo();
+
+ xmldata_root_element_start(result, xmlcn, xmlschema, targetns, true);
+ appendStringInfoChar(result, '\n');
+
+ if (xmlschema)
+ appendStringInfo(result, "%s\n\n", xmlschema);
+
+ SPI_connect();
+
+ nspid_list = database_get_xml_visible_schemas();
+
+ foreach(cell, nspid_list)
+ {
+ Oid nspid = lfirst_oid(cell);
+ StringInfo subres;
+
+ subres = schema_to_xml_internal(nspid, NULL, nulls,
+ tableforest, targetns, false);
+
+ appendBinaryStringInfo(result, subres->data, subres->len);
+ appendStringInfoChar(result, '\n');
+ }
+
+ SPI_finish();
+
+ xmldata_root_element_end(result, xmlcn);
+
+ return result;
+}
+
+
+Datum
+database_to_xml(PG_FUNCTION_ARGS)
+{
+ bool nulls = PG_GETARG_BOOL(0);
+ bool tableforest = PG_GETARG_BOOL(1);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2));
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(database_to_xml_internal(NULL, nulls,
+ tableforest, targetns)));
+}
+
+
+static StringInfo
+database_to_xmlschema_internal(bool nulls, bool tableforest,
+ const char *targetns)
+{
+ List *relid_list;
+ List *nspid_list;
+ List *tupdesc_list;
+ ListCell *cell;
+ StringInfo result;
+
+ result = makeStringInfo();
+
+ xsd_schema_element_start(result, targetns);
+
+ SPI_connect();
+
+ relid_list = database_get_xml_visible_tables();
+ nspid_list = database_get_xml_visible_schemas();
+
+ tupdesc_list = NIL;
+ foreach(cell, relid_list)
+ {
+ Relation rel;
+
+ rel = table_open(lfirst_oid(cell), AccessShareLock);
+ tupdesc_list = lappend(tupdesc_list, CreateTupleDescCopy(rel->rd_att));
+ table_close(rel, NoLock);
+ }
+
+ appendStringInfoString(result,
+ map_sql_typecoll_to_xmlschema_types(tupdesc_list));
+
+ appendStringInfoString(result,
+ map_sql_catalog_to_xmlschema_types(nspid_list, nulls, tableforest, targetns));
+
+ xsd_schema_element_end(result);
+
+ SPI_finish();
+
+ return result;
+}
+
+
+Datum
+database_to_xmlschema(PG_FUNCTION_ARGS)
+{
+ bool nulls = PG_GETARG_BOOL(0);
+ bool tableforest = PG_GETARG_BOOL(1);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2));
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(database_to_xmlschema_internal(nulls,
+ tableforest, targetns)));
+}
+
+
+Datum
+database_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
+{
+ bool nulls = PG_GETARG_BOOL(0);
+ bool tableforest = PG_GETARG_BOOL(1);
+ const char *targetns = text_to_cstring(PG_GETARG_TEXT_PP(2));
+ StringInfo xmlschema;
+
+ xmlschema = database_to_xmlschema_internal(nulls, tableforest, targetns);
+
+ PG_RETURN_XML_P(stringinfo_to_xmltype(database_to_xml_internal(xmlschema->data,
+ nulls, tableforest, targetns)));
+}
+
+
+/*
+ * Map a multi-part SQL name to an XML name; see SQL/XML:2008 section
+ * 9.2.
+ */
+static char *
+map_multipart_sql_identifier_to_xml_name(const char *a, const char *b, const char *c, const char *d)
+{
+ StringInfoData result;
+
+ initStringInfo(&result);
+
+ if (a)
+ appendStringInfoString(&result,
+ map_sql_identifier_to_xml_name(a, true, true));
+ if (b)
+ appendStringInfo(&result, ".%s",
+ map_sql_identifier_to_xml_name(b, true, true));
+ if (c)
+ appendStringInfo(&result, ".%s",
+ map_sql_identifier_to_xml_name(c, true, true));
+ if (d)
+ appendStringInfo(&result, ".%s",
+ map_sql_identifier_to_xml_name(d, true, true));
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL table to an XML Schema document; see SQL/XML:2008
+ * section 9.11.
+ *
+ * Map an SQL table to XML Schema data types; see SQL/XML:2008 section
+ * 9.9.
+ */
+static const char *
+map_sql_table_to_xmlschema(TupleDesc tupdesc, Oid relid, bool nulls,
+ bool tableforest, const char *targetns)
+{
+ int i;
+ char *xmltn;
+ char *tabletypename;
+ char *rowtypename;
+ StringInfoData result;
+
+ initStringInfo(&result);
+
+ if (OidIsValid(relid))
+ {
+ HeapTuple tuple;
+ Form_pg_class reltuple;
+
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ reltuple = (Form_pg_class) GETSTRUCT(tuple);
+
+ xmltn = map_sql_identifier_to_xml_name(NameStr(reltuple->relname),
+ true, false);
+
+ tabletypename = map_multipart_sql_identifier_to_xml_name("TableType",
+ get_database_name(MyDatabaseId),
+ get_namespace_name(reltuple->relnamespace),
+ NameStr(reltuple->relname));
+
+ rowtypename = map_multipart_sql_identifier_to_xml_name("RowType",
+ get_database_name(MyDatabaseId),
+ get_namespace_name(reltuple->relnamespace),
+ NameStr(reltuple->relname));
+
+ ReleaseSysCache(tuple);
+ }
+ else
+ {
+ if (tableforest)
+ xmltn = "row";
+ else
+ xmltn = "table";
+
+ tabletypename = "TableType";
+ rowtypename = "RowType";
+ }
+
+ xsd_schema_element_start(&result, targetns);
+
+ appendStringInfoString(&result,
+ map_sql_typecoll_to_xmlschema_types(list_make1(tupdesc)));
+
+ appendStringInfo(&result,
+ "<xsd:complexType name=\"%s\">\n"
+ " <xsd:sequence>\n",
+ rowtypename);
+
+ for (i = 0; i < tupdesc->natts; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+ appendStringInfo(&result,
+ " <xsd:element name=\"%s\" type=\"%s\"%s></xsd:element>\n",
+ map_sql_identifier_to_xml_name(NameStr(att->attname),
+ true, false),
+ map_sql_type_to_xml_name(att->atttypid, -1),
+ nulls ? " nillable=\"true\"" : " minOccurs=\"0\"");
+ }
+
+ appendStringInfoString(&result,
+ " </xsd:sequence>\n"
+ "</xsd:complexType>\n\n");
+
+ if (!tableforest)
+ {
+ appendStringInfo(&result,
+ "<xsd:complexType name=\"%s\">\n"
+ " <xsd:sequence>\n"
+ " <xsd:element name=\"row\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
+ " </xsd:sequence>\n"
+ "</xsd:complexType>\n\n",
+ tabletypename, rowtypename);
+
+ appendStringInfo(&result,
+ "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
+ xmltn, tabletypename);
+ }
+ else
+ appendStringInfo(&result,
+ "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
+ xmltn, rowtypename);
+
+ xsd_schema_element_end(&result);
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL schema to XML Schema data types; see SQL/XML:2008
+ * section 9.12.
+ */
+static const char *
+map_sql_schema_to_xmlschema_types(Oid nspid, List *relid_list, bool nulls,
+ bool tableforest, const char *targetns)
+{
+ char *dbname;
+ char *nspname;
+ char *xmlsn;
+ char *schematypename;
+ StringInfoData result;
+ ListCell *cell;
+
+ dbname = get_database_name(MyDatabaseId);
+ nspname = get_namespace_name(nspid);
+
+ initStringInfo(&result);
+
+ xmlsn = map_sql_identifier_to_xml_name(nspname, true, false);
+
+ schematypename = map_multipart_sql_identifier_to_xml_name("SchemaType",
+ dbname,
+ nspname,
+ NULL);
+
+ appendStringInfo(&result,
+ "<xsd:complexType name=\"%s\">\n", schematypename);
+ if (!tableforest)
+ appendStringInfoString(&result,
+ " <xsd:all>\n");
+ else
+ appendStringInfoString(&result,
+ " <xsd:sequence>\n");
+
+ foreach(cell, relid_list)
+ {
+ Oid relid = lfirst_oid(cell);
+ char *relname = get_rel_name(relid);
+ char *xmltn = map_sql_identifier_to_xml_name(relname, true, false);
+ char *tabletypename = map_multipart_sql_identifier_to_xml_name(tableforest ? "RowType" : "TableType",
+ dbname,
+ nspname,
+ relname);
+
+ if (!tableforest)
+ appendStringInfo(&result,
+ " <xsd:element name=\"%s\" type=\"%s\"/>\n",
+ xmltn, tabletypename);
+ else
+ appendStringInfo(&result,
+ " <xsd:element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n",
+ xmltn, tabletypename);
+ }
+
+ if (!tableforest)
+ appendStringInfoString(&result,
+ " </xsd:all>\n");
+ else
+ appendStringInfoString(&result,
+ " </xsd:sequence>\n");
+ appendStringInfoString(&result,
+ "</xsd:complexType>\n\n");
+
+ appendStringInfo(&result,
+ "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
+ xmlsn, schematypename);
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL catalog to XML Schema data types; see SQL/XML:2008
+ * section 9.15.
+ */
+static const char *
+map_sql_catalog_to_xmlschema_types(List *nspid_list, bool nulls,
+ bool tableforest, const char *targetns)
+{
+ char *dbname;
+ char *xmlcn;
+ char *catalogtypename;
+ StringInfoData result;
+ ListCell *cell;
+
+ dbname = get_database_name(MyDatabaseId);
+
+ initStringInfo(&result);
+
+ xmlcn = map_sql_identifier_to_xml_name(dbname, true, false);
+
+ catalogtypename = map_multipart_sql_identifier_to_xml_name("CatalogType",
+ dbname,
+ NULL,
+ NULL);
+
+ appendStringInfo(&result,
+ "<xsd:complexType name=\"%s\">\n", catalogtypename);
+ appendStringInfoString(&result,
+ " <xsd:all>\n");
+
+ foreach(cell, nspid_list)
+ {
+ Oid nspid = lfirst_oid(cell);
+ char *nspname = get_namespace_name(nspid);
+ char *xmlsn = map_sql_identifier_to_xml_name(nspname, true, false);
+ char *schematypename = map_multipart_sql_identifier_to_xml_name("SchemaType",
+ dbname,
+ nspname,
+ NULL);
+
+ appendStringInfo(&result,
+ " <xsd:element name=\"%s\" type=\"%s\"/>\n",
+ xmlsn, schematypename);
+ }
+
+ appendStringInfoString(&result,
+ " </xsd:all>\n");
+ appendStringInfoString(&result,
+ "</xsd:complexType>\n\n");
+
+ appendStringInfo(&result,
+ "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
+ xmlcn, catalogtypename);
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL data type to an XML name; see SQL/XML:2008 section 9.4.
+ */
+static const char *
+map_sql_type_to_xml_name(Oid typeoid, int typmod)
+{
+ StringInfoData result;
+
+ initStringInfo(&result);
+
+ switch (typeoid)
+ {
+ case BPCHAROID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "CHAR");
+ else
+ appendStringInfo(&result, "CHAR_%d", typmod - VARHDRSZ);
+ break;
+ case VARCHAROID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "VARCHAR");
+ else
+ appendStringInfo(&result, "VARCHAR_%d", typmod - VARHDRSZ);
+ break;
+ case NUMERICOID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "NUMERIC");
+ else
+ appendStringInfo(&result, "NUMERIC_%d_%d",
+ ((typmod - VARHDRSZ) >> 16) & 0xffff,
+ (typmod - VARHDRSZ) & 0xffff);
+ break;
+ case INT4OID:
+ appendStringInfoString(&result, "INTEGER");
+ break;
+ case INT2OID:
+ appendStringInfoString(&result, "SMALLINT");
+ break;
+ case INT8OID:
+ appendStringInfoString(&result, "BIGINT");
+ break;
+ case FLOAT4OID:
+ appendStringInfoString(&result, "REAL");
+ break;
+ case FLOAT8OID:
+ appendStringInfoString(&result, "DOUBLE");
+ break;
+ case BOOLOID:
+ appendStringInfoString(&result, "BOOLEAN");
+ break;
+ case TIMEOID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "TIME");
+ else
+ appendStringInfo(&result, "TIME_%d", typmod);
+ break;
+ case TIMETZOID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "TIME_WTZ");
+ else
+ appendStringInfo(&result, "TIME_WTZ_%d", typmod);
+ break;
+ case TIMESTAMPOID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "TIMESTAMP");
+ else
+ appendStringInfo(&result, "TIMESTAMP_%d", typmod);
+ break;
+ case TIMESTAMPTZOID:
+ if (typmod == -1)
+ appendStringInfoString(&result, "TIMESTAMP_WTZ");
+ else
+ appendStringInfo(&result, "TIMESTAMP_WTZ_%d", typmod);
+ break;
+ case DATEOID:
+ appendStringInfoString(&result, "DATE");
+ break;
+ case XMLOID:
+ appendStringInfoString(&result, "XML");
+ break;
+ default:
+ {
+ HeapTuple tuple;
+ Form_pg_type typtuple;
+
+ tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typeoid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for type %u", typeoid);
+ typtuple = (Form_pg_type) GETSTRUCT(tuple);
+
+ appendStringInfoString(&result,
+ map_multipart_sql_identifier_to_xml_name((typtuple->typtype == TYPTYPE_DOMAIN) ? "Domain" : "UDT",
+ get_database_name(MyDatabaseId),
+ get_namespace_name(typtuple->typnamespace),
+ NameStr(typtuple->typname)));
+
+ ReleaseSysCache(tuple);
+ }
+ }
+
+ return result.data;
+}
+
+
+/*
+ * Map a collection of SQL data types to XML Schema data types; see
+ * SQL/XML:2008 section 9.7.
+ */
+static const char *
+map_sql_typecoll_to_xmlschema_types(List *tupdesc_list)
+{
+ List *uniquetypes = NIL;
+ int i;
+ StringInfoData result;
+ ListCell *cell0;
+
+ /* extract all column types used in the set of TupleDescs */
+ foreach(cell0, tupdesc_list)
+ {
+ TupleDesc tupdesc = (TupleDesc) lfirst(cell0);
+
+ for (i = 0; i < tupdesc->natts; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
+ continue;
+ uniquetypes = list_append_unique_oid(uniquetypes, att->atttypid);
+ }
+ }
+
+ /* add base types of domains */
+ foreach(cell0, uniquetypes)
+ {
+ Oid typid = lfirst_oid(cell0);
+ Oid basetypid = getBaseType(typid);
+
+ if (basetypid != typid)
+ uniquetypes = list_append_unique_oid(uniquetypes, basetypid);
+ }
+
+ /* Convert to textual form */
+ initStringInfo(&result);
+
+ foreach(cell0, uniquetypes)
+ {
+ appendStringInfo(&result, "%s\n",
+ map_sql_type_to_xmlschema_type(lfirst_oid(cell0),
+ -1));
+ }
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL data type to a named XML Schema data type; see
+ * SQL/XML:2008 sections 9.5 and 9.6.
+ *
+ * (The distinction between 9.5 and 9.6 is basically that 9.6 adds
+ * a name attribute, which this function does. The name-less version
+ * 9.5 doesn't appear to be required anywhere.)
+ */
+static const char *
+map_sql_type_to_xmlschema_type(Oid typeoid, int typmod)
+{
+ StringInfoData result;
+ const char *typename = map_sql_type_to_xml_name(typeoid, typmod);
+
+ initStringInfo(&result);
+
+ if (typeoid == XMLOID)
+ {
+ appendStringInfoString(&result,
+ "<xsd:complexType mixed=\"true\">\n"
+ " <xsd:sequence>\n"
+ " <xsd:any name=\"element\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"skip\"/>\n"
+ " </xsd:sequence>\n"
+ "</xsd:complexType>\n");
+ }
+ else
+ {
+ appendStringInfo(&result,
+ "<xsd:simpleType name=\"%s\">\n", typename);
+
+ switch (typeoid)
+ {
+ case BPCHAROID:
+ case VARCHAROID:
+ case TEXTOID:
+ appendStringInfoString(&result,
+ " <xsd:restriction base=\"xsd:string\">\n");
+ if (typmod != -1)
+ appendStringInfo(&result,
+ " <xsd:maxLength value=\"%d\"/>\n",
+ typmod - VARHDRSZ);
+ appendStringInfoString(&result, " </xsd:restriction>\n");
+ break;
+
+ case BYTEAOID:
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:%s\">\n"
+ " </xsd:restriction>\n",
+ xmlbinary == XMLBINARY_BASE64 ? "base64Binary" : "hexBinary");
+ break;
+
+ case NUMERICOID:
+ if (typmod != -1)
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:decimal\">\n"
+ " <xsd:totalDigits value=\"%d\"/>\n"
+ " <xsd:fractionDigits value=\"%d\"/>\n"
+ " </xsd:restriction>\n",
+ ((typmod - VARHDRSZ) >> 16) & 0xffff,
+ (typmod - VARHDRSZ) & 0xffff);
+ break;
+
+ case INT2OID:
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:short\">\n"
+ " <xsd:maxInclusive value=\"%d\"/>\n"
+ " <xsd:minInclusive value=\"%d\"/>\n"
+ " </xsd:restriction>\n",
+ SHRT_MAX, SHRT_MIN);
+ break;
+
+ case INT4OID:
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:int\">\n"
+ " <xsd:maxInclusive value=\"%d\"/>\n"
+ " <xsd:minInclusive value=\"%d\"/>\n"
+ " </xsd:restriction>\n",
+ INT_MAX, INT_MIN);
+ break;
+
+ case INT8OID:
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:long\">\n"
+ " <xsd:maxInclusive value=\"" INT64_FORMAT "\"/>\n"
+ " <xsd:minInclusive value=\"" INT64_FORMAT "\"/>\n"
+ " </xsd:restriction>\n",
+ PG_INT64_MAX,
+ PG_INT64_MIN);
+ break;
+
+ case FLOAT4OID:
+ appendStringInfoString(&result,
+ " <xsd:restriction base=\"xsd:float\"></xsd:restriction>\n");
+ break;
+
+ case FLOAT8OID:
+ appendStringInfoString(&result,
+ " <xsd:restriction base=\"xsd:double\"></xsd:restriction>\n");
+ break;
+
+ case BOOLOID:
+ appendStringInfoString(&result,
+ " <xsd:restriction base=\"xsd:boolean\"></xsd:restriction>\n");
+ break;
+
+ case TIMEOID:
+ case TIMETZOID:
+ {
+ const char *tz = (typeoid == TIMETZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
+
+ if (typmod == -1)
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:time\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}(.\\p{Nd}+)?%s\"/>\n"
+ " </xsd:restriction>\n", tz);
+ else if (typmod == 0)
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:time\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}%s\"/>\n"
+ " </xsd:restriction>\n", tz);
+ else
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:time\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}.\\p{Nd}{%d}%s\"/>\n"
+ " </xsd:restriction>\n", typmod - VARHDRSZ, tz);
+ break;
+ }
+
+ case TIMESTAMPOID:
+ case TIMESTAMPTZOID:
+ {
+ const char *tz = (typeoid == TIMESTAMPTZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
+
+ if (typmod == -1)
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:dateTime\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}(.\\p{Nd}+)?%s\"/>\n"
+ " </xsd:restriction>\n", tz);
+ else if (typmod == 0)
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:dateTime\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}%s\"/>\n"
+ " </xsd:restriction>\n", tz);
+ else
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"xsd:dateTime\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}.\\p{Nd}{%d}%s\"/>\n"
+ " </xsd:restriction>\n", typmod - VARHDRSZ, tz);
+ break;
+ }
+
+ case DATEOID:
+ appendStringInfoString(&result,
+ " <xsd:restriction base=\"xsd:date\">\n"
+ " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}\"/>\n"
+ " </xsd:restriction>\n");
+ break;
+
+ default:
+ if (get_typtype(typeoid) == TYPTYPE_DOMAIN)
+ {
+ Oid base_typeoid;
+ int32 base_typmod = -1;
+
+ base_typeoid = getBaseTypeAndTypmod(typeoid, &base_typmod);
+
+ appendStringInfo(&result,
+ " <xsd:restriction base=\"%s\"/>\n",
+ map_sql_type_to_xml_name(base_typeoid, base_typmod));
+ }
+ break;
+ }
+ appendStringInfoString(&result, "</xsd:simpleType>\n");
+ }
+
+ return result.data;
+}
+
+
+/*
+ * Map an SQL row to an XML element, taking the row from the active
+ * SPI cursor. See also SQL/XML:2008 section 9.10.
+ */
+static void
+SPI_sql_row_to_xmlelement(uint64 rownum, StringInfo result, char *tablename,
+ bool nulls, bool tableforest,
+ const char *targetns, bool top_level)
+{
+ int i;
+ char *xmltn;
+
+ if (tablename)
+ xmltn = map_sql_identifier_to_xml_name(tablename, true, false);
+ else
+ {
+ if (tableforest)
+ xmltn = "row";
+ else
+ xmltn = "table";
+ }
+
+ if (tableforest)
+ xmldata_root_element_start(result, xmltn, NULL, targetns, top_level);
+ else
+ appendStringInfoString(result, "<row>\n");
+
+ for (i = 1; i <= SPI_tuptable->tupdesc->natts; i++)
+ {
+ char *colname;
+ Datum colval;
+ bool isnull;
+
+ colname = map_sql_identifier_to_xml_name(SPI_fname(SPI_tuptable->tupdesc, i),
+ true, false);
+ colval = SPI_getbinval(SPI_tuptable->vals[rownum],
+ SPI_tuptable->tupdesc,
+ i,
+ &isnull);
+ if (isnull)
+ {
+ if (nulls)
+ appendStringInfo(result, " <%s xsi:nil=\"true\"/>\n", colname);
+ }
+ else
+ appendStringInfo(result, " <%s>%s</%s>\n",
+ colname,
+ map_sql_value_to_xml_value(colval,
+ SPI_gettypeid(SPI_tuptable->tupdesc, i), true),
+ colname);
+ }
+
+ if (tableforest)
+ {
+ xmldata_root_element_end(result, xmltn);
+ appendStringInfoChar(result, '\n');
+ }
+ else
+ appendStringInfoString(result, "</row>\n\n");
+}
+
+
+/*
+ * XPath related functions
+ */
+
+#ifdef USE_LIBXML
+
+/*
+ * Convert XML node to text.
+ *
+ * For attribute and text nodes, return the escaped text. For anything else,
+ * dump the whole subtree.
+ */
+static text *
+xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContext *xmlerrcxt)
+{
+ xmltype *result = NULL;
+
+ if (cur->type != XML_ATTRIBUTE_NODE && cur->type != XML_TEXT_NODE)
+ {
+ void (*volatile nodefree) (xmlNodePtr) = NULL;
+ volatile xmlBufferPtr buf = NULL;
+ volatile xmlNodePtr cur_copy = NULL;
+
+ PG_TRY();
+ {
+ int bytes;
+
+ buf = xmlBufferCreate();
+ if (buf == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate xmlBuffer");
+
+ /*
+ * Produce a dump of the node that we can serialize. xmlNodeDump
+ * does that, but the result of that function won't contain
+ * namespace definitions from ancestor nodes, so we first do a
+ * xmlCopyNode() which duplicates the node along with its required
+ * namespace definitions.
+ *
+ * Some old libxml2 versions such as 2.7.6 produce partially
+ * broken XML_DOCUMENT_NODE nodes (unset content field) when
+ * copying them. xmlNodeDump of such a node works fine, but
+ * xmlFreeNode crashes; set us up to call xmlFreeDoc instead.
+ */
+ cur_copy = xmlCopyNode(cur, 1);
+ if (cur_copy == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not copy node");
+ nodefree = (cur_copy->type == XML_DOCUMENT_NODE) ?
+ (void (*) (xmlNodePtr)) xmlFreeDoc : xmlFreeNode;
+
+ bytes = xmlNodeDump(buf, NULL, cur_copy, 0, 0);
+ if (bytes == -1 || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not dump node");
+
+ result = xmlBuffer_to_xmltype(buf);
+ }
+ PG_FINALLY();
+ {
+ if (nodefree)
+ nodefree(cur_copy);
+ if (buf)
+ xmlBufferFree(buf);
+ }
+ PG_END_TRY();
+ }
+ else
+ {
+ xmlChar *str;
+
+ str = xmlXPathCastNodeToString(cur);
+ PG_TRY();
+ {
+ /* Here we rely on XML having the same representation as TEXT */
+ char *escaped = escape_xml((char *) str);
+
+ result = (xmltype *) cstring_to_text(escaped);
+ pfree(escaped);
+ }
+ PG_FINALLY();
+ {
+ xmlFree(str);
+ }
+ PG_END_TRY();
+ }
+
+ return result;
+}
+
+/*
+ * Convert an XML XPath object (the result of evaluating an XPath expression)
+ * to an array of xml values, which are appended to astate. The function
+ * result value is the number of elements in the array.
+ *
+ * If "astate" is NULL then we don't generate the array value, but we still
+ * return the number of elements it would have had.
+ *
+ * Nodesets are converted to an array containing the nodes' textual
+ * representations. Primitive values (float, double, string) are converted
+ * to a single-element array containing the value's string representation.
+ */
+static int
+xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj,
+ ArrayBuildState *astate,
+ PgXmlErrorContext *xmlerrcxt)
+{
+ int result = 0;
+ Datum datum;
+ Oid datumtype;
+ char *result_str;
+
+ switch (xpathobj->type)
+ {
+ case XPATH_NODESET:
+ if (xpathobj->nodesetval != NULL)
+ {
+ result = xpathobj->nodesetval->nodeNr;
+ if (astate != NULL)
+ {
+ int i;
+
+ for (i = 0; i < result; i++)
+ {
+ datum = PointerGetDatum(xml_xmlnodetoxmltype(xpathobj->nodesetval->nodeTab[i],
+ xmlerrcxt));
+ (void) accumArrayResult(astate, datum, false,
+ XMLOID, CurrentMemoryContext);
+ }
+ }
+ }
+ return result;
+
+ case XPATH_BOOLEAN:
+ if (astate == NULL)
+ return 1;
+ datum = BoolGetDatum(xpathobj->boolval);
+ datumtype = BOOLOID;
+ break;
+
+ case XPATH_NUMBER:
+ if (astate == NULL)
+ return 1;
+ datum = Float8GetDatum(xpathobj->floatval);
+ datumtype = FLOAT8OID;
+ break;
+
+ case XPATH_STRING:
+ if (astate == NULL)
+ return 1;
+ datum = CStringGetDatum((char *) xpathobj->stringval);
+ datumtype = CSTRINGOID;
+ break;
+
+ default:
+ elog(ERROR, "xpath expression result type %d is unsupported",
+ xpathobj->type);
+ return 0; /* keep compiler quiet */
+ }
+
+ /* Common code for scalar-value cases */
+ result_str = map_sql_value_to_xml_value(datum, datumtype, true);
+ datum = PointerGetDatum(cstring_to_xmltype(result_str));
+ (void) accumArrayResult(astate, datum, false,
+ XMLOID, CurrentMemoryContext);
+ return 1;
+}
+
+
+/*
+ * Common code for xpath() and xmlexists()
+ *
+ * Evaluate XPath expression and return number of nodes in res_nitems
+ * and array of XML values in astate. Either of those pointers can be
+ * NULL if the corresponding result isn't wanted.
+ *
+ * It is up to the user to ensure that the XML passed is in fact
+ * an XML document - XPath doesn't work easily on fragments without
+ * a context node being known.
+ */
+static void
+xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces,
+ int *res_nitems, ArrayBuildState *astate)
+{
+ PgXmlErrorContext *xmlerrcxt;
+ volatile xmlParserCtxtPtr ctxt = NULL;
+ volatile xmlDocPtr doc = NULL;
+ volatile xmlXPathContextPtr xpathctx = NULL;
+ volatile xmlXPathCompExprPtr xpathcomp = NULL;
+ volatile xmlXPathObjectPtr xpathobj = NULL;
+ char *datastr;
+ int32 len;
+ int32 xpath_len;
+ xmlChar *string;
+ xmlChar *xpath_expr;
+ size_t xmldecl_len = 0;
+ int i;
+ int ndim;
+ Datum *ns_names_uris;
+ bool *ns_names_uris_nulls;
+ int ns_count;
+
+ /*
+ * Namespace mappings are passed as text[]. If an empty array is passed
+ * (ndim = 0, "0-dimensional"), then there are no namespace mappings.
+ * Else, a 2-dimensional array with length of the second axis being equal
+ * to 2 should be passed, i.e., every subarray contains 2 elements, the
+ * first element defining the name, the second one the URI. Example:
+ * ARRAY[ARRAY['myns', 'http://example.com'], ARRAY['myns2',
+ * 'http://example2.com']].
+ */
+ ndim = namespaces ? ARR_NDIM(namespaces) : 0;
+ if (ndim != 0)
+ {
+ int *dims;
+
+ dims = ARR_DIMS(namespaces);
+
+ if (ndim != 2 || dims[1] != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid array for XML namespace mapping"),
+ errdetail("The array must be two-dimensional with length of the second axis equal to 2.")));
+
+ Assert(ARR_ELEMTYPE(namespaces) == TEXTOID);
+
+ deconstruct_array(namespaces, TEXTOID, -1, false, TYPALIGN_INT,
+ &ns_names_uris, &ns_names_uris_nulls,
+ &ns_count);
+
+ Assert((ns_count % 2) == 0); /* checked above */
+ ns_count /= 2; /* count pairs only */
+ }
+ else
+ {
+ ns_names_uris = NULL;
+ ns_names_uris_nulls = NULL;
+ ns_count = 0;
+ }
+
+ datastr = VARDATA(data);
+ len = VARSIZE(data) - VARHDRSZ;
+ xpath_len = VARSIZE_ANY_EXHDR(xpath_expr_text);
+ if (xpath_len == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("empty XPath expression")));
+
+ string = pg_xmlCharStrndup(datastr, len);
+ xpath_expr = pg_xmlCharStrndup(VARDATA_ANY(xpath_expr_text), xpath_len);
+
+ /*
+ * In a UTF8 database, skip any xml declaration, which might assert
+ * another encoding. Ignore parse_xml_decl() failure, letting
+ * xmlCtxtReadMemory() report parse errors. Documentation disclaims
+ * xpath() support for non-ASCII data in non-UTF8 databases, so leave
+ * those scenarios bug-compatible with historical behavior.
+ */
+ if (GetDatabaseEncoding() == PG_UTF8)
+ parse_xml_decl(string, &xmldecl_len, NULL, NULL, NULL);
+
+ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL);
+
+ PG_TRY();
+ {
+ xmlInitParser();
+
+ /*
+ * redundant XML parsing (two parsings for the same value during one
+ * command execution are possible)
+ */
+ ctxt = xmlNewParserCtxt();
+ if (ctxt == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate parser context");
+ doc = xmlCtxtReadMemory(ctxt, (char *) string + xmldecl_len,
+ len - xmldecl_len, NULL, NULL, 0);
+ if (doc == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
+ "could not parse XML document");
+ xpathctx = xmlXPathNewContext(doc);
+ if (xpathctx == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate XPath context");
+ xpathctx->node = (xmlNodePtr) doc;
+
+ /* register namespaces, if any */
+ if (ns_count > 0)
+ {
+ for (i = 0; i < ns_count; i++)
+ {
+ char *ns_name;
+ char *ns_uri;
+
+ if (ns_names_uris_nulls[i * 2] ||
+ ns_names_uris_nulls[i * 2 + 1])
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("neither namespace name nor URI may be null")));
+ ns_name = TextDatumGetCString(ns_names_uris[i * 2]);
+ ns_uri = TextDatumGetCString(ns_names_uris[i * 2 + 1]);
+ if (xmlXPathRegisterNs(xpathctx,
+ (xmlChar *) ns_name,
+ (xmlChar *) ns_uri) != 0)
+ ereport(ERROR, /* is this an internal error??? */
+ (errmsg("could not register XML namespace with name \"%s\" and URI \"%s\"",
+ ns_name, ns_uri)));
+ }
+ }
+
+ xpathcomp = xmlXPathCompile(xpath_expr);
+ if (xpathcomp == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+ "invalid XPath expression");
+
+ /*
+ * Version 2.6.27 introduces a function named
+ * xmlXPathCompiledEvalToBoolean, which would be enough for xmlexists,
+ * but we can derive the existence by whether any nodes are returned,
+ * thereby preventing a library version upgrade and keeping the code
+ * the same.
+ */
+ xpathobj = xmlXPathCompiledEval(xpathcomp, xpathctx);
+ if (xpathobj == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+ "could not create XPath object");
+
+ /*
+ * Extract the results as requested.
+ */
+ if (res_nitems != NULL)
+ *res_nitems = xml_xpathobjtoxmlarray(xpathobj, astate, xmlerrcxt);
+ else
+ (void) xml_xpathobjtoxmlarray(xpathobj, astate, xmlerrcxt);
+ }
+ PG_CATCH();
+ {
+ if (xpathobj)
+ xmlXPathFreeObject(xpathobj);
+ if (xpathcomp)
+ xmlXPathFreeCompExpr(xpathcomp);
+ if (xpathctx)
+ xmlXPathFreeContext(xpathctx);
+ if (doc)
+ xmlFreeDoc(doc);
+ if (ctxt)
+ xmlFreeParserCtxt(ctxt);
+
+ pg_xml_done(xmlerrcxt, true);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xmlXPathFreeObject(xpathobj);
+ xmlXPathFreeCompExpr(xpathcomp);
+ xmlXPathFreeContext(xpathctx);
+ xmlFreeDoc(doc);
+ xmlFreeParserCtxt(ctxt);
+
+ pg_xml_done(xmlerrcxt, false);
+}
+#endif /* USE_LIBXML */
+
+/*
+ * Evaluate XPath expression and return array of XML values.
+ *
+ * As we have no support of XQuery sequences yet, this function seems
+ * to be the most useful one (array of XML functions plays a role of
+ * some kind of substitution for XQuery sequences).
+ */
+Datum
+xpath(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *xpath_expr_text = PG_GETARG_TEXT_PP(0);
+ xmltype *data = PG_GETARG_XML_P(1);
+ ArrayType *namespaces = PG_GETARG_ARRAYTYPE_P(2);
+ ArrayBuildState *astate;
+
+ astate = initArrayResult(XMLOID, CurrentMemoryContext, true);
+ xpath_internal(xpath_expr_text, data, namespaces,
+ NULL, astate);
+ PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext));
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+/*
+ * Determines if the node specified by the supplied XPath exists
+ * in a given XML document, returning a boolean.
+ */
+Datum
+xmlexists(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *xpath_expr_text = PG_GETARG_TEXT_PP(0);
+ xmltype *data = PG_GETARG_XML_P(1);
+ int res_nitems;
+
+ xpath_internal(xpath_expr_text, data, NULL,
+ &res_nitems, NULL);
+
+ PG_RETURN_BOOL(res_nitems > 0);
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+/*
+ * Determines if the node specified by the supplied XPath exists
+ * in a given XML document, returning a boolean. Differs from
+ * xmlexists as it supports namespaces and is not defined in SQL/XML.
+ */
+Datum
+xpath_exists(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *xpath_expr_text = PG_GETARG_TEXT_PP(0);
+ xmltype *data = PG_GETARG_XML_P(1);
+ ArrayType *namespaces = PG_GETARG_ARRAYTYPE_P(2);
+ int res_nitems;
+
+ xpath_internal(xpath_expr_text, data, namespaces,
+ &res_nitems, NULL);
+
+ PG_RETURN_BOOL(res_nitems > 0);
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif
+}
+
+/*
+ * Functions for checking well-formed-ness
+ */
+
+#ifdef USE_LIBXML
+static bool
+wellformed_xml(text *data, XmlOptionType xmloption_arg)
+{
+ bool result;
+ volatile xmlDocPtr doc = NULL;
+
+ /* We want to catch any exceptions and return false */
+ PG_TRY();
+ {
+ doc = xml_parse(data, xmloption_arg, true, GetDatabaseEncoding());
+ result = true;
+ }
+ PG_CATCH();
+ {
+ FlushErrorState();
+ result = false;
+ }
+ PG_END_TRY();
+
+ if (doc)
+ xmlFreeDoc(doc);
+
+ return result;
+}
+#endif
+
+Datum
+xml_is_well_formed(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *data = PG_GETARG_TEXT_PP(0);
+
+ PG_RETURN_BOOL(wellformed_xml(data, xmloption));
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif /* not USE_LIBXML */
+}
+
+Datum
+xml_is_well_formed_document(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *data = PG_GETARG_TEXT_PP(0);
+
+ PG_RETURN_BOOL(wellformed_xml(data, XMLOPTION_DOCUMENT));
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif /* not USE_LIBXML */
+}
+
+Datum
+xml_is_well_formed_content(PG_FUNCTION_ARGS)
+{
+#ifdef USE_LIBXML
+ text *data = PG_GETARG_TEXT_PP(0);
+
+ PG_RETURN_BOOL(wellformed_xml(data, XMLOPTION_CONTENT));
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * support functions for XMLTABLE
+ *
+ */
+#ifdef USE_LIBXML
+
+/*
+ * Returns private data from executor state. Ensure validity by check with
+ * MAGIC number.
+ */
+static inline XmlTableBuilderData *
+GetXmlTableBuilderPrivateData(TableFuncScanState *state, const char *fname)
+{
+ XmlTableBuilderData *result;
+
+ if (!IsA(state, TableFuncScanState))
+ elog(ERROR, "%s called with invalid TableFuncScanState", fname);
+ result = (XmlTableBuilderData *) state->opaque;
+ if (result->magic != XMLTABLE_CONTEXT_MAGIC)
+ elog(ERROR, "%s called with invalid TableFuncScanState", fname);
+
+ return result;
+}
+#endif
+
+/*
+ * XmlTableInitOpaque
+ * Fill in TableFuncScanState->opaque for XmlTable processor; initialize
+ * the XML parser.
+ *
+ * Note: Because we call pg_xml_init() here and pg_xml_done() in
+ * XmlTableDestroyOpaque, it is critical for robustness that no other
+ * executor nodes run until this node is processed to completion. Caller
+ * must execute this to completion (probably filling a tuplestore to exhaust
+ * this node in a single pass) instead of using row-per-call mode.
+ */
+static void
+XmlTableInitOpaque(TableFuncScanState *state, int natts)
+{
+#ifdef USE_LIBXML
+ volatile xmlParserCtxtPtr ctxt = NULL;
+ XmlTableBuilderData *xtCxt;
+ PgXmlErrorContext *xmlerrcxt;
+
+ xtCxt = palloc0(sizeof(XmlTableBuilderData));
+ xtCxt->magic = XMLTABLE_CONTEXT_MAGIC;
+ xtCxt->natts = natts;
+ xtCxt->xpathscomp = palloc0(sizeof(xmlXPathCompExprPtr) * natts);
+
+ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL);
+
+ PG_TRY();
+ {
+ xmlInitParser();
+
+ ctxt = xmlNewParserCtxt();
+ if (ctxt == NULL || xmlerrcxt->err_occurred)
+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate parser context");
+ }
+ PG_CATCH();
+ {
+ if (ctxt != NULL)
+ xmlFreeParserCtxt(ctxt);
+
+ pg_xml_done(xmlerrcxt, true);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xtCxt->xmlerrcxt = xmlerrcxt;
+ xtCxt->ctxt = ctxt;
+
+ state->opaque = xtCxt;
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableSetDocument
+ * Install the input document
+ */
+static void
+XmlTableSetDocument(TableFuncScanState *state, Datum value)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+ xmltype *xmlval = DatumGetXmlP(value);
+ char *str;
+ xmlChar *xstr;
+ int length;
+ volatile xmlDocPtr doc = NULL;
+ volatile xmlXPathContextPtr xpathcxt = NULL;
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableSetDocument");
+
+ /*
+ * Use out function for casting to string (remove encoding property). See
+ * comment in xml_out.
+ */
+ str = xml_out_internal(xmlval, 0);
+
+ length = strlen(str);
+ xstr = pg_xmlCharStrndup(str, length);
+
+ PG_TRY();
+ {
+ doc = xmlCtxtReadMemory(xtCxt->ctxt, (char *) xstr, length, NULL, NULL, 0);
+ if (doc == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
+ "could not parse XML document");
+ xpathcxt = xmlXPathNewContext(doc);
+ if (xpathcxt == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
+ "could not allocate XPath context");
+ xpathcxt->node = (xmlNodePtr) doc;
+ }
+ PG_CATCH();
+ {
+ if (xpathcxt != NULL)
+ xmlXPathFreeContext(xpathcxt);
+ if (doc != NULL)
+ xmlFreeDoc(doc);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ xtCxt->doc = doc;
+ xtCxt->xpathcxt = xpathcxt;
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableSetNamespace
+ * Add a namespace declaration
+ */
+static void
+XmlTableSetNamespace(TableFuncScanState *state, const char *name, const char *uri)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+
+ if (name == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("DEFAULT namespace is not supported")));
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableSetNamespace");
+
+ if (xmlXPathRegisterNs(xtCxt->xpathcxt,
+ pg_xmlCharStrndup(name, strlen(name)),
+ pg_xmlCharStrndup(uri, strlen(uri))))
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_DATA_EXCEPTION,
+ "could not set XML namespace");
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableSetRowFilter
+ * Install the row-filter Xpath expression.
+ */
+static void
+XmlTableSetRowFilter(TableFuncScanState *state, const char *path)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+ xmlChar *xstr;
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableSetRowFilter");
+
+ if (*path == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("row path filter must not be empty string")));
+
+ xstr = pg_xmlCharStrndup(path, strlen(path));
+
+ xtCxt->xpathcomp = xmlXPathCompile(xstr);
+ if (xtCxt->xpathcomp == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_SYNTAX_ERROR,
+ "invalid XPath expression");
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableSetColumnFilter
+ * Install the column-filter Xpath expression, for the given column.
+ */
+static void
+XmlTableSetColumnFilter(TableFuncScanState *state, const char *path, int colnum)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+ xmlChar *xstr;
+
+ AssertArg(PointerIsValid(path));
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableSetColumnFilter");
+
+ if (*path == '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("column path filter must not be empty string")));
+
+ xstr = pg_xmlCharStrndup(path, strlen(path));
+
+ xtCxt->xpathscomp[colnum] = xmlXPathCompile(xstr);
+ if (xtCxt->xpathscomp[colnum] == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_DATA_EXCEPTION,
+ "invalid XPath expression");
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableFetchRow
+ * Prepare the next "current" tuple for upcoming GetValue calls.
+ * Returns false if the row-filter expression returned no more rows.
+ */
+static bool
+XmlTableFetchRow(TableFuncScanState *state)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableFetchRow");
+
+ /* Propagate our own error context to libxml2 */
+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);
+
+ if (xtCxt->xpathobj == NULL)
+ {
+ xtCxt->xpathobj = xmlXPathCompiledEval(xtCxt->xpathcomp, xtCxt->xpathcxt);
+ if (xtCxt->xpathobj == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+ "could not create XPath object");
+
+ xtCxt->row_count = 0;
+ }
+
+ if (xtCxt->xpathobj->type == XPATH_NODESET)
+ {
+ if (xtCxt->xpathobj->nodesetval != NULL)
+ {
+ if (xtCxt->row_count++ < xtCxt->xpathobj->nodesetval->nodeNr)
+ return true;
+ }
+ }
+
+ return false;
+#else
+ NO_XML_SUPPORT();
+ return false;
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableGetValue
+ * Return the value for column number 'colnum' for the current row. If
+ * column -1 is requested, return representation of the whole row.
+ *
+ * This leaks memory, so be sure to reset often the context in which it's
+ * called.
+ */
+static Datum
+XmlTableGetValue(TableFuncScanState *state, int colnum,
+ Oid typid, int32 typmod, bool *isnull)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+ Datum result = (Datum) 0;
+ xmlNodePtr cur;
+ char *cstr = NULL;
+ volatile xmlXPathObjectPtr xpathobj = NULL;
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableGetValue");
+
+ Assert(xtCxt->xpathobj &&
+ xtCxt->xpathobj->type == XPATH_NODESET &&
+ xtCxt->xpathobj->nodesetval != NULL);
+
+ /* Propagate our own error context to libxml2 */
+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);
+
+ *isnull = false;
+
+ cur = xtCxt->xpathobj->nodesetval->nodeTab[xtCxt->row_count - 1];
+
+ Assert(xtCxt->xpathscomp[colnum] != NULL);
+
+ PG_TRY();
+ {
+ /* Set current node as entry point for XPath evaluation */
+ xtCxt->xpathcxt->node = cur;
+
+ /* Evaluate column path */
+ xpathobj = xmlXPathCompiledEval(xtCxt->xpathscomp[colnum], xtCxt->xpathcxt);
+ if (xpathobj == NULL || xtCxt->xmlerrcxt->err_occurred)
+ xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+ "could not create XPath object");
+
+ /*
+ * There are four possible cases, depending on the number of nodes
+ * returned by the XPath expression and the type of the target column:
+ * a) XPath returns no nodes. b) The target type is XML (return all
+ * as XML). For non-XML return types: c) One node (return content).
+ * d) Multiple nodes (error).
+ */
+ if (xpathobj->type == XPATH_NODESET)
+ {
+ int count = 0;
+
+ if (xpathobj->nodesetval != NULL)
+ count = xpathobj->nodesetval->nodeNr;
+
+ if (xpathobj->nodesetval == NULL || count == 0)
+ {
+ *isnull = true;
+ }
+ else
+ {
+ if (typid == XMLOID)
+ {
+ text *textstr;
+ StringInfoData str;
+
+ /* Concatenate serialized values */
+ initStringInfo(&str);
+ for (int i = 0; i < count; i++)
+ {
+ textstr =
+ xml_xmlnodetoxmltype(xpathobj->nodesetval->nodeTab[i],
+ xtCxt->xmlerrcxt);
+
+ appendStringInfoText(&str, textstr);
+ }
+ cstr = str.data;
+ }
+ else
+ {
+ xmlChar *str;
+
+ if (count > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_CARDINALITY_VIOLATION),
+ errmsg("more than one value returned by column XPath expression")));
+
+ str = xmlXPathCastNodeSetToString(xpathobj->nodesetval);
+ cstr = str ? xml_pstrdup_and_free(str) : "";
+ }
+ }
+ }
+ else if (xpathobj->type == XPATH_STRING)
+ {
+ /* Content should be escaped when target will be XML */
+ if (typid == XMLOID)
+ cstr = escape_xml((char *) xpathobj->stringval);
+ else
+ cstr = (char *) xpathobj->stringval;
+ }
+ else if (xpathobj->type == XPATH_BOOLEAN)
+ {
+ char typcategory;
+ bool typispreferred;
+ xmlChar *str;
+
+ /* Allow implicit casting from boolean to numbers */
+ get_type_category_preferred(typid, &typcategory, &typispreferred);
+
+ if (typcategory != TYPCATEGORY_NUMERIC)
+ str = xmlXPathCastBooleanToString(xpathobj->boolval);
+ else
+ str = xmlXPathCastNumberToString(xmlXPathCastBooleanToNumber(xpathobj->boolval));
+
+ cstr = xml_pstrdup_and_free(str);
+ }
+ else if (xpathobj->type == XPATH_NUMBER)
+ {
+ xmlChar *str;
+
+ str = xmlXPathCastNumberToString(xpathobj->floatval);
+ cstr = xml_pstrdup_and_free(str);
+ }
+ else
+ elog(ERROR, "unexpected XPath object type %u", xpathobj->type);
+
+ /*
+ * By here, either cstr contains the result value, or the isnull flag
+ * has been set.
+ */
+ Assert(cstr || *isnull);
+
+ if (!*isnull)
+ result = InputFunctionCall(&state->in_functions[colnum],
+ cstr,
+ state->typioparams[colnum],
+ typmod);
+ }
+ PG_FINALLY();
+ {
+ if (xpathobj != NULL)
+ xmlXPathFreeObject(xpathobj);
+ }
+ PG_END_TRY();
+
+ return result;
+#else
+ NO_XML_SUPPORT();
+ return 0;
+#endif /* not USE_LIBXML */
+}
+
+/*
+ * XmlTableDestroyOpaque
+ * Release all libxml2 resources
+ */
+static void
+XmlTableDestroyOpaque(TableFuncScanState *state)
+{
+#ifdef USE_LIBXML
+ XmlTableBuilderData *xtCxt;
+
+ xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableDestroyOpaque");
+
+ /* Propagate our own error context to libxml2 */
+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);
+
+ if (xtCxt->xpathscomp != NULL)
+ {
+ int i;
+
+ for (i = 0; i < xtCxt->natts; i++)
+ if (xtCxt->xpathscomp[i] != NULL)
+ xmlXPathFreeCompExpr(xtCxt->xpathscomp[i]);
+ }
+
+ if (xtCxt->xpathobj != NULL)
+ xmlXPathFreeObject(xtCxt->xpathobj);
+ if (xtCxt->xpathcomp != NULL)
+ xmlXPathFreeCompExpr(xtCxt->xpathcomp);
+ if (xtCxt->xpathcxt != NULL)
+ xmlXPathFreeContext(xtCxt->xpathcxt);
+ if (xtCxt->doc != NULL)
+ xmlFreeDoc(xtCxt->doc);
+ if (xtCxt->ctxt != NULL)
+ xmlFreeParserCtxt(xtCxt->ctxt);
+
+ pg_xml_done(xtCxt->xmlerrcxt, true);
+
+ /* not valid anymore */
+ xtCxt->magic = 0;
+ state->opaque = NULL;
+
+#else
+ NO_XML_SUPPORT();
+#endif /* not USE_LIBXML */
+}
diff --git a/src/backend/utils/cache/Makefile b/src/backend/utils/cache/Makefile
new file mode 100644
index 0000000..38e46d2
--- /dev/null
+++ b/src/backend/utils/cache/Makefile
@@ -0,0 +1,31 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/cache
+#
+# IDENTIFICATION
+# src/backend/utils/cache/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/cache
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ attoptcache.o \
+ catcache.o \
+ evtcache.o \
+ inval.o \
+ lsyscache.o \
+ partcache.o \
+ plancache.o \
+ relcache.o \
+ relfilenodemap.o \
+ relmapper.o \
+ spccache.o \
+ syscache.o \
+ ts_cache.o \
+ typcache.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/cache/attoptcache.c b/src/backend/utils/cache/attoptcache.c
new file mode 100644
index 0000000..9e252a0
--- /dev/null
+++ b/src/backend/utils/cache/attoptcache.c
@@ -0,0 +1,177 @@
+/*-------------------------------------------------------------------------
+ *
+ * attoptcache.c
+ * Attribute options cache management.
+ *
+ * Attribute options are cached separately from the fixed-size portion of
+ * pg_attribute entries, which are handled by the relcache.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/attoptcache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/reloptions.h"
+#include "utils/attoptcache.h"
+#include "utils/catcache.h"
+#include "utils/hsearch.h"
+#include "utils/inval.h"
+#include "utils/syscache.h"
+
+
+/* Hash table for information about each attribute's options */
+static HTAB *AttoptCacheHash = NULL;
+
+/* attrelid and attnum form the lookup key, and must appear first */
+typedef struct
+{
+ Oid attrelid;
+ int attnum;
+} AttoptCacheKey;
+
+typedef struct
+{
+ AttoptCacheKey key; /* lookup key - must be first */
+ AttributeOpts *opts; /* options, or NULL if none */
+} AttoptCacheEntry;
+
+
+/*
+ * InvalidateAttoptCacheCallback
+ * Flush all cache entries when pg_attribute is updated.
+ *
+ * When pg_attribute is updated, we must flush the cache entry at least
+ * for that attribute. Currently, we just flush them all. Since attribute
+ * options are not currently used in performance-critical paths (such as
+ * query execution), this seems OK.
+ */
+static void
+InvalidateAttoptCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ HASH_SEQ_STATUS status;
+ AttoptCacheEntry *attopt;
+
+ hash_seq_init(&status, AttoptCacheHash);
+ while ((attopt = (AttoptCacheEntry *) hash_seq_search(&status)) != NULL)
+ {
+ if (attopt->opts)
+ pfree(attopt->opts);
+ if (hash_search(AttoptCacheHash,
+ (void *) &attopt->key,
+ HASH_REMOVE,
+ NULL) == NULL)
+ elog(ERROR, "hash table corrupted");
+ }
+}
+
+/*
+ * InitializeAttoptCache
+ * Initialize the attribute options cache.
+ */
+static void
+InitializeAttoptCache(void)
+{
+ HASHCTL ctl;
+
+ /* Initialize the hash table. */
+ ctl.keysize = sizeof(AttoptCacheKey);
+ ctl.entrysize = sizeof(AttoptCacheEntry);
+ AttoptCacheHash =
+ hash_create("Attopt cache", 256, &ctl,
+ HASH_ELEM | HASH_BLOBS);
+
+ /* Make sure we've initialized CacheMemoryContext. */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ /* Watch for invalidation events. */
+ CacheRegisterSyscacheCallback(ATTNUM,
+ InvalidateAttoptCacheCallback,
+ (Datum) 0);
+}
+
+/*
+ * get_attribute_options
+ * Fetch attribute options for a specified table OID.
+ */
+AttributeOpts *
+get_attribute_options(Oid attrelid, int attnum)
+{
+ AttoptCacheKey key;
+ AttoptCacheEntry *attopt;
+ AttributeOpts *result;
+ HeapTuple tp;
+
+ /* Find existing cache entry, if any. */
+ if (!AttoptCacheHash)
+ InitializeAttoptCache();
+ memset(&key, 0, sizeof(key)); /* make sure any padding bits are unset */
+ key.attrelid = attrelid;
+ key.attnum = attnum;
+ attopt =
+ (AttoptCacheEntry *) hash_search(AttoptCacheHash,
+ (void *) &key,
+ HASH_FIND,
+ NULL);
+
+ /* Not found in Attopt cache. Construct new cache entry. */
+ if (!attopt)
+ {
+ AttributeOpts *opts;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(attrelid),
+ Int16GetDatum(attnum));
+
+ /*
+ * If we don't find a valid HeapTuple, it must mean someone has
+ * managed to request attribute details for a non-existent attribute.
+ * We treat that case as if no options were specified.
+ */
+ if (!HeapTupleIsValid(tp))
+ opts = NULL;
+ else
+ {
+ Datum datum;
+ bool isNull;
+
+ datum = SysCacheGetAttr(ATTNUM,
+ tp,
+ Anum_pg_attribute_attoptions,
+ &isNull);
+ if (isNull)
+ opts = NULL;
+ else
+ {
+ bytea *bytea_opts = attribute_reloptions(datum, false);
+
+ opts = MemoryContextAlloc(CacheMemoryContext,
+ VARSIZE(bytea_opts));
+ memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
+ }
+ ReleaseSysCache(tp);
+ }
+
+ /*
+ * It's important to create the actual cache entry only after reading
+ * pg_attribute, since the read could cause a cache flush.
+ */
+ attopt = (AttoptCacheEntry *) hash_search(AttoptCacheHash,
+ (void *) &key,
+ HASH_ENTER,
+ NULL);
+ attopt->opts = opts;
+ }
+
+ /* Return results in caller's memory context. */
+ if (attopt->opts == NULL)
+ return NULL;
+ result = palloc(VARSIZE(attopt->opts));
+ memcpy(result, attopt->opts, VARSIZE(attopt->opts));
+ return result;
+}
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
new file mode 100644
index 0000000..38e943f
--- /dev/null
+++ b/src/backend/utils/cache/catcache.c
@@ -0,0 +1,2087 @@
+/*-------------------------------------------------------------------------
+ *
+ * catcache.c
+ * System catalog cache for tuples matching a key.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/catcache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/genam.h"
+#include "access/heaptoast.h"
+#include "access/relscan.h"
+#include "access/sysattr.h"
+#include "access/table.h"
+#include "access/valid.h"
+#include "access/xact.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_type.h"
+#include "common/hashfn.h"
+#include "miscadmin.h"
+#include "port/pg_bitutils.h"
+#ifdef CATCACHE_STATS
+#include "storage/ipc.h" /* for on_proc_exit */
+#endif
+#include "storage/lmgr.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/inval.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/resowner_private.h"
+#include "utils/syscache.h"
+
+
+ /* #define CACHEDEBUG */ /* turns DEBUG elogs on */
+
+/*
+ * Given a hash value and the size of the hash table, find the bucket
+ * in which the hash value belongs. Since the hash table must contain
+ * a power-of-2 number of elements, this is a simple bitmask.
+ */
+#define HASH_INDEX(h, sz) ((Index) ((h) & ((sz) - 1)))
+
+
+/*
+ * variables, macros and other stuff
+ */
+
+#ifdef CACHEDEBUG
+#define CACHE_elog(...) elog(__VA_ARGS__)
+#else
+#define CACHE_elog(...)
+#endif
+
+/* Cache management header --- pointer is NULL until created */
+static CatCacheHeader *CacheHdr = NULL;
+
+static inline HeapTuple SearchCatCacheInternal(CatCache *cache,
+ int nkeys,
+ Datum v1, Datum v2,
+ Datum v3, Datum v4);
+
+static pg_noinline HeapTuple SearchCatCacheMiss(CatCache *cache,
+ int nkeys,
+ uint32 hashValue,
+ Index hashIndex,
+ Datum v1, Datum v2,
+ Datum v3, Datum v4);
+
+static uint32 CatalogCacheComputeHashValue(CatCache *cache, int nkeys,
+ Datum v1, Datum v2, Datum v3, Datum v4);
+static uint32 CatalogCacheComputeTupleHashValue(CatCache *cache, int nkeys,
+ HeapTuple tuple);
+static inline bool CatalogCacheCompareTuple(const CatCache *cache, int nkeys,
+ const Datum *cachekeys,
+ const Datum *searchkeys);
+
+#ifdef CATCACHE_STATS
+static void CatCachePrintStats(int code, Datum arg);
+#endif
+static void CatCacheRemoveCTup(CatCache *cache, CatCTup *ct);
+static void CatCacheRemoveCList(CatCache *cache, CatCList *cl);
+static void CatalogCacheInitializeCache(CatCache *cache);
+static CatCTup *CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp,
+ Datum *arguments,
+ uint32 hashValue, Index hashIndex,
+ bool negative);
+
+static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos,
+ Datum *keys);
+static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos,
+ Datum *srckeys, Datum *dstkeys);
+
+
+/*
+ * internal support functions
+ */
+
+/*
+ * Hash and equality functions for system types that are used as cache key
+ * fields. In some cases, we just call the regular SQL-callable functions for
+ * the appropriate data type, but that tends to be a little slow, and the
+ * speed of these functions is performance-critical. Therefore, for data
+ * types that frequently occur as catcache keys, we hard-code the logic here.
+ * Avoiding the overhead of DirectFunctionCallN(...) is a substantial win, and
+ * in certain cases (like int4) we can adopt a faster hash algorithm as well.
+ */
+
+static bool
+chareqfast(Datum a, Datum b)
+{
+ return DatumGetChar(a) == DatumGetChar(b);
+}
+
+static uint32
+charhashfast(Datum datum)
+{
+ return murmurhash32((int32) DatumGetChar(datum));
+}
+
+static bool
+nameeqfast(Datum a, Datum b)
+{
+ char *ca = NameStr(*DatumGetName(a));
+ char *cb = NameStr(*DatumGetName(b));
+
+ return strncmp(ca, cb, NAMEDATALEN) == 0;
+}
+
+static uint32
+namehashfast(Datum datum)
+{
+ char *key = NameStr(*DatumGetName(datum));
+
+ return hash_any((unsigned char *) key, strlen(key));
+}
+
+static bool
+int2eqfast(Datum a, Datum b)
+{
+ return DatumGetInt16(a) == DatumGetInt16(b);
+}
+
+static uint32
+int2hashfast(Datum datum)
+{
+ return murmurhash32((int32) DatumGetInt16(datum));
+}
+
+static bool
+int4eqfast(Datum a, Datum b)
+{
+ return DatumGetInt32(a) == DatumGetInt32(b);
+}
+
+static uint32
+int4hashfast(Datum datum)
+{
+ return murmurhash32((int32) DatumGetInt32(datum));
+}
+
+static bool
+texteqfast(Datum a, Datum b)
+{
+ /*
+ * The use of DEFAULT_COLLATION_OID is fairly arbitrary here. We just
+ * want to take the fast "deterministic" path in texteq().
+ */
+ return DatumGetBool(DirectFunctionCall2Coll(texteq, DEFAULT_COLLATION_OID, a, b));
+}
+
+static uint32
+texthashfast(Datum datum)
+{
+ /* analogously here as in texteqfast() */
+ return DatumGetInt32(DirectFunctionCall1Coll(hashtext, DEFAULT_COLLATION_OID, datum));
+}
+
+static bool
+oidvectoreqfast(Datum a, Datum b)
+{
+ return DatumGetBool(DirectFunctionCall2(oidvectoreq, a, b));
+}
+
+static uint32
+oidvectorhashfast(Datum datum)
+{
+ return DatumGetInt32(DirectFunctionCall1(hashoidvector, datum));
+}
+
+/* Lookup support functions for a type. */
+static void
+GetCCHashEqFuncs(Oid keytype, CCHashFN *hashfunc, RegProcedure *eqfunc, CCFastEqualFN *fasteqfunc)
+{
+ switch (keytype)
+ {
+ case BOOLOID:
+ *hashfunc = charhashfast;
+ *fasteqfunc = chareqfast;
+ *eqfunc = F_BOOLEQ;
+ break;
+ case CHAROID:
+ *hashfunc = charhashfast;
+ *fasteqfunc = chareqfast;
+ *eqfunc = F_CHAREQ;
+ break;
+ case NAMEOID:
+ *hashfunc = namehashfast;
+ *fasteqfunc = nameeqfast;
+ *eqfunc = F_NAMEEQ;
+ break;
+ case INT2OID:
+ *hashfunc = int2hashfast;
+ *fasteqfunc = int2eqfast;
+ *eqfunc = F_INT2EQ;
+ break;
+ case INT4OID:
+ *hashfunc = int4hashfast;
+ *fasteqfunc = int4eqfast;
+ *eqfunc = F_INT4EQ;
+ break;
+ case TEXTOID:
+ *hashfunc = texthashfast;
+ *fasteqfunc = texteqfast;
+ *eqfunc = F_TEXTEQ;
+ break;
+ case OIDOID:
+ case REGPROCOID:
+ case REGPROCEDUREOID:
+ case REGOPEROID:
+ case REGOPERATOROID:
+ case REGCLASSOID:
+ case REGTYPEOID:
+ case REGCOLLATIONOID:
+ case REGCONFIGOID:
+ case REGDICTIONARYOID:
+ case REGROLEOID:
+ case REGNAMESPACEOID:
+ *hashfunc = int4hashfast;
+ *fasteqfunc = int4eqfast;
+ *eqfunc = F_OIDEQ;
+ break;
+ case OIDVECTOROID:
+ *hashfunc = oidvectorhashfast;
+ *fasteqfunc = oidvectoreqfast;
+ *eqfunc = F_OIDVECTOREQ;
+ break;
+ default:
+ elog(FATAL, "type %u not supported as catcache key", keytype);
+ *hashfunc = NULL; /* keep compiler quiet */
+
+ *eqfunc = InvalidOid;
+ break;
+ }
+}
+
+/*
+ * CatalogCacheComputeHashValue
+ *
+ * Compute the hash value associated with a given set of lookup keys
+ */
+static uint32
+CatalogCacheComputeHashValue(CatCache *cache, int nkeys,
+ Datum v1, Datum v2, Datum v3, Datum v4)
+{
+ uint32 hashValue = 0;
+ uint32 oneHash;
+ CCHashFN *cc_hashfunc = cache->cc_hashfunc;
+
+ CACHE_elog(DEBUG2, "CatalogCacheComputeHashValue %s %d %p",
+ cache->cc_relname, nkeys, cache);
+
+ switch (nkeys)
+ {
+ case 4:
+ oneHash = (cc_hashfunc[3]) (v4);
+ hashValue ^= pg_rotate_left32(oneHash, 24);
+ /* FALLTHROUGH */
+ case 3:
+ oneHash = (cc_hashfunc[2]) (v3);
+ hashValue ^= pg_rotate_left32(oneHash, 16);
+ /* FALLTHROUGH */
+ case 2:
+ oneHash = (cc_hashfunc[1]) (v2);
+ hashValue ^= pg_rotate_left32(oneHash, 8);
+ /* FALLTHROUGH */
+ case 1:
+ oneHash = (cc_hashfunc[0]) (v1);
+ hashValue ^= oneHash;
+ break;
+ default:
+ elog(FATAL, "wrong number of hash keys: %d", nkeys);
+ break;
+ }
+
+ return hashValue;
+}
+
+/*
+ * CatalogCacheComputeTupleHashValue
+ *
+ * Compute the hash value associated with a given tuple to be cached
+ */
+static uint32
+CatalogCacheComputeTupleHashValue(CatCache *cache, int nkeys, HeapTuple tuple)
+{
+ Datum v1 = 0,
+ v2 = 0,
+ v3 = 0,
+ v4 = 0;
+ bool isNull = false;
+ int *cc_keyno = cache->cc_keyno;
+ TupleDesc cc_tupdesc = cache->cc_tupdesc;
+
+ /* Now extract key fields from tuple, insert into scankey */
+ switch (nkeys)
+ {
+ case 4:
+ v4 = fastgetattr(tuple,
+ cc_keyno[3],
+ cc_tupdesc,
+ &isNull);
+ Assert(!isNull);
+ /* FALLTHROUGH */
+ case 3:
+ v3 = fastgetattr(tuple,
+ cc_keyno[2],
+ cc_tupdesc,
+ &isNull);
+ Assert(!isNull);
+ /* FALLTHROUGH */
+ case 2:
+ v2 = fastgetattr(tuple,
+ cc_keyno[1],
+ cc_tupdesc,
+ &isNull);
+ Assert(!isNull);
+ /* FALLTHROUGH */
+ case 1:
+ v1 = fastgetattr(tuple,
+ cc_keyno[0],
+ cc_tupdesc,
+ &isNull);
+ Assert(!isNull);
+ break;
+ default:
+ elog(FATAL, "wrong number of hash keys: %d", nkeys);
+ break;
+ }
+
+ return CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+}
+
+/*
+ * CatalogCacheCompareTuple
+ *
+ * Compare a tuple to the passed arguments.
+ */
+static inline bool
+CatalogCacheCompareTuple(const CatCache *cache, int nkeys,
+ const Datum *cachekeys,
+ const Datum *searchkeys)
+{
+ const CCFastEqualFN *cc_fastequal = cache->cc_fastequal;
+ int i;
+
+ for (i = 0; i < nkeys; i++)
+ {
+ if (!(cc_fastequal[i]) (cachekeys[i], searchkeys[i]))
+ return false;
+ }
+ return true;
+}
+
+
+#ifdef CATCACHE_STATS
+
+static void
+CatCachePrintStats(int code, Datum arg)
+{
+ slist_iter iter;
+ long cc_searches = 0;
+ long cc_hits = 0;
+ long cc_neg_hits = 0;
+ long cc_newloads = 0;
+ long cc_invals = 0;
+ long cc_lsearches = 0;
+ long cc_lhits = 0;
+
+ slist_foreach(iter, &CacheHdr->ch_caches)
+ {
+ CatCache *cache = slist_container(CatCache, cc_next, iter.cur);
+
+ if (cache->cc_ntup == 0 && cache->cc_searches == 0)
+ continue; /* don't print unused caches */
+ elog(DEBUG2, "catcache %s/%u: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %ld lsrch, %ld lhits",
+ cache->cc_relname,
+ cache->cc_indexoid,
+ cache->cc_ntup,
+ cache->cc_searches,
+ cache->cc_hits,
+ cache->cc_neg_hits,
+ cache->cc_hits + cache->cc_neg_hits,
+ cache->cc_newloads,
+ cache->cc_searches - cache->cc_hits - cache->cc_neg_hits - cache->cc_newloads,
+ cache->cc_searches - cache->cc_hits - cache->cc_neg_hits,
+ cache->cc_invals,
+ cache->cc_lsearches,
+ cache->cc_lhits);
+ cc_searches += cache->cc_searches;
+ cc_hits += cache->cc_hits;
+ cc_neg_hits += cache->cc_neg_hits;
+ cc_newloads += cache->cc_newloads;
+ cc_invals += cache->cc_invals;
+ cc_lsearches += cache->cc_lsearches;
+ cc_lhits += cache->cc_lhits;
+ }
+ elog(DEBUG2, "catcache totals: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %ld lsrch, %ld lhits",
+ CacheHdr->ch_ntup,
+ cc_searches,
+ cc_hits,
+ cc_neg_hits,
+ cc_hits + cc_neg_hits,
+ cc_newloads,
+ cc_searches - cc_hits - cc_neg_hits - cc_newloads,
+ cc_searches - cc_hits - cc_neg_hits,
+ cc_invals,
+ cc_lsearches,
+ cc_lhits);
+}
+#endif /* CATCACHE_STATS */
+
+
+/*
+ * CatCacheRemoveCTup
+ *
+ * Unlink and delete the given cache entry
+ *
+ * NB: if it is a member of a CatCList, the CatCList is deleted too.
+ * Both the cache entry and the list had better have zero refcount.
+ */
+static void
+CatCacheRemoveCTup(CatCache *cache, CatCTup *ct)
+{
+ Assert(ct->refcount == 0);
+ Assert(ct->my_cache == cache);
+
+ if (ct->c_list)
+ {
+ /*
+ * The cleanest way to handle this is to call CatCacheRemoveCList,
+ * which will recurse back to me, and the recursive call will do the
+ * work. Set the "dead" flag to make sure it does recurse.
+ */
+ ct->dead = true;
+ CatCacheRemoveCList(cache, ct->c_list);
+ return; /* nothing left to do */
+ }
+
+ /* delink from linked list */
+ dlist_delete(&ct->cache_elem);
+
+ /*
+ * Free keys when we're dealing with a negative entry, normal entries just
+ * point into tuple, allocated together with the CatCTup.
+ */
+ if (ct->negative)
+ CatCacheFreeKeys(cache->cc_tupdesc, cache->cc_nkeys,
+ cache->cc_keyno, ct->keys);
+
+ pfree(ct);
+
+ --cache->cc_ntup;
+ --CacheHdr->ch_ntup;
+}
+
+/*
+ * CatCacheRemoveCList
+ *
+ * Unlink and delete the given cache list entry
+ *
+ * NB: any dead member entries that become unreferenced are deleted too.
+ */
+static void
+CatCacheRemoveCList(CatCache *cache, CatCList *cl)
+{
+ int i;
+
+ Assert(cl->refcount == 0);
+ Assert(cl->my_cache == cache);
+
+ /* delink from member tuples */
+ for (i = cl->n_members; --i >= 0;)
+ {
+ CatCTup *ct = cl->members[i];
+
+ Assert(ct->c_list == cl);
+ ct->c_list = NULL;
+ /* if the member is dead and now has no references, remove it */
+ if (
+#ifndef CATCACHE_FORCE_RELEASE
+ ct->dead &&
+#endif
+ ct->refcount == 0)
+ CatCacheRemoveCTup(cache, ct);
+ }
+
+ /* delink from linked list */
+ dlist_delete(&cl->cache_elem);
+
+ /* free associated column data */
+ CatCacheFreeKeys(cache->cc_tupdesc, cl->nkeys,
+ cache->cc_keyno, cl->keys);
+
+ pfree(cl);
+}
+
+
+/*
+ * CatCacheInvalidate
+ *
+ * Invalidate entries in the specified cache, given a hash value.
+ *
+ * We delete cache entries that match the hash value, whether positive
+ * or negative. We don't care whether the invalidation is the result
+ * of a tuple insertion or a deletion.
+ *
+ * We used to try to match positive cache entries by TID, but that is
+ * unsafe after a VACUUM FULL on a system catalog: an inval event could
+ * be queued before VACUUM FULL, and then processed afterwards, when the
+ * target tuple that has to be invalidated has a different TID than it
+ * did when the event was created. So now we just compare hash values and
+ * accept the small risk of unnecessary invalidations due to false matches.
+ *
+ * This routine is only quasi-public: it should only be used by inval.c.
+ */
+void
+CatCacheInvalidate(CatCache *cache, uint32 hashValue)
+{
+ Index hashIndex;
+ dlist_mutable_iter iter;
+
+ CACHE_elog(DEBUG2, "CatCacheInvalidate: called");
+
+ /*
+ * We don't bother to check whether the cache has finished initialization
+ * yet; if not, there will be no entries in it so no problem.
+ */
+
+ /*
+ * Invalidate *all* CatCLists in this cache; it's too hard to tell which
+ * searches might still be correct, so just zap 'em all.
+ */
+ dlist_foreach_modify(iter, &cache->cc_lists)
+ {
+ CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur);
+
+ if (cl->refcount > 0)
+ cl->dead = true;
+ else
+ CatCacheRemoveCList(cache, cl);
+ }
+
+ /*
+ * inspect the proper hash bucket for tuple matches
+ */
+ hashIndex = HASH_INDEX(hashValue, cache->cc_nbuckets);
+ dlist_foreach_modify(iter, &cache->cc_bucket[hashIndex])
+ {
+ CatCTup *ct = dlist_container(CatCTup, cache_elem, iter.cur);
+
+ if (hashValue == ct->hash_value)
+ {
+ if (ct->refcount > 0 ||
+ (ct->c_list && ct->c_list->refcount > 0))
+ {
+ ct->dead = true;
+ /* list, if any, was marked dead above */
+ Assert(ct->c_list == NULL || ct->c_list->dead);
+ }
+ else
+ CatCacheRemoveCTup(cache, ct);
+ CACHE_elog(DEBUG2, "CatCacheInvalidate: invalidated");
+#ifdef CATCACHE_STATS
+ cache->cc_invals++;
+#endif
+ /* could be multiple matches, so keep looking! */
+ }
+ }
+}
+
+/* ----------------------------------------------------------------
+ * public functions
+ * ----------------------------------------------------------------
+ */
+
+
+/*
+ * Standard routine for creating cache context if it doesn't exist yet
+ *
+ * There are a lot of places (probably far more than necessary) that check
+ * whether CacheMemoryContext exists yet and want to create it if not.
+ * We centralize knowledge of exactly how to create it here.
+ */
+void
+CreateCacheMemoryContext(void)
+{
+ /*
+ * Purely for paranoia, check that context doesn't exist; caller probably
+ * did so already.
+ */
+ if (!CacheMemoryContext)
+ CacheMemoryContext = AllocSetContextCreate(TopMemoryContext,
+ "CacheMemoryContext",
+ ALLOCSET_DEFAULT_SIZES);
+}
+
+
+/*
+ * ResetCatalogCache
+ *
+ * Reset one catalog cache to empty.
+ *
+ * This is not very efficient if the target cache is nearly empty.
+ * However, it shouldn't need to be efficient; we don't invoke it often.
+ */
+static void
+ResetCatalogCache(CatCache *cache)
+{
+ dlist_mutable_iter iter;
+ int i;
+
+ /* Remove each list in this cache, or at least mark it dead */
+ dlist_foreach_modify(iter, &cache->cc_lists)
+ {
+ CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur);
+
+ if (cl->refcount > 0)
+ cl->dead = true;
+ else
+ CatCacheRemoveCList(cache, cl);
+ }
+
+ /* Remove each tuple in this cache, or at least mark it dead */
+ for (i = 0; i < cache->cc_nbuckets; i++)
+ {
+ dlist_head *bucket = &cache->cc_bucket[i];
+
+ dlist_foreach_modify(iter, bucket)
+ {
+ CatCTup *ct = dlist_container(CatCTup, cache_elem, iter.cur);
+
+ if (ct->refcount > 0 ||
+ (ct->c_list && ct->c_list->refcount > 0))
+ {
+ ct->dead = true;
+ /* list, if any, was marked dead above */
+ Assert(ct->c_list == NULL || ct->c_list->dead);
+ }
+ else
+ CatCacheRemoveCTup(cache, ct);
+#ifdef CATCACHE_STATS
+ cache->cc_invals++;
+#endif
+ }
+ }
+}
+
+/*
+ * ResetCatalogCaches
+ *
+ * Reset all caches when a shared cache inval event forces it
+ */
+void
+ResetCatalogCaches(void)
+{
+ slist_iter iter;
+
+ CACHE_elog(DEBUG2, "ResetCatalogCaches called");
+
+ slist_foreach(iter, &CacheHdr->ch_caches)
+ {
+ CatCache *cache = slist_container(CatCache, cc_next, iter.cur);
+
+ ResetCatalogCache(cache);
+ }
+
+ CACHE_elog(DEBUG2, "end of ResetCatalogCaches call");
+}
+
+/*
+ * CatalogCacheFlushCatalog
+ *
+ * Flush all catcache entries that came from the specified system catalog.
+ * This is needed after VACUUM FULL/CLUSTER on the catalog, since the
+ * tuples very likely now have different TIDs than before. (At one point
+ * we also tried to force re-execution of CatalogCacheInitializeCache for
+ * the cache(s) on that catalog. This is a bad idea since it leads to all
+ * kinds of trouble if a cache flush occurs while loading cache entries.
+ * We now avoid the need to do it by copying cc_tupdesc out of the relcache,
+ * rather than relying on the relcache to keep a tupdesc for us. Of course
+ * this assumes the tupdesc of a cachable system table will not change...)
+ */
+void
+CatalogCacheFlushCatalog(Oid catId)
+{
+ slist_iter iter;
+
+ CACHE_elog(DEBUG2, "CatalogCacheFlushCatalog called for %u", catId);
+
+ slist_foreach(iter, &CacheHdr->ch_caches)
+ {
+ CatCache *cache = slist_container(CatCache, cc_next, iter.cur);
+
+ /* Does this cache store tuples of the target catalog? */
+ if (cache->cc_reloid == catId)
+ {
+ /* Yes, so flush all its contents */
+ ResetCatalogCache(cache);
+
+ /* Tell inval.c to call syscache callbacks for this cache */
+ CallSyscacheCallbacks(cache->id, 0);
+ }
+ }
+
+ CACHE_elog(DEBUG2, "end of CatalogCacheFlushCatalog call");
+}
+
+/*
+ * InitCatCache
+ *
+ * This allocates and initializes a cache for a system catalog relation.
+ * Actually, the cache is only partially initialized to avoid opening the
+ * relation. The relation will be opened and the rest of the cache
+ * structure initialized on the first access.
+ */
+#ifdef CACHEDEBUG
+#define InitCatCache_DEBUG2 \
+do { \
+ elog(DEBUG2, "InitCatCache: rel=%u ind=%u id=%d nkeys=%d size=%d", \
+ cp->cc_reloid, cp->cc_indexoid, cp->id, \
+ cp->cc_nkeys, cp->cc_nbuckets); \
+} while(0)
+#else
+#define InitCatCache_DEBUG2
+#endif
+
+CatCache *
+InitCatCache(int id,
+ Oid reloid,
+ Oid indexoid,
+ int nkeys,
+ const int *key,
+ int nbuckets)
+{
+ CatCache *cp;
+ MemoryContext oldcxt;
+ size_t sz;
+ int i;
+
+ /*
+ * nbuckets is the initial number of hash buckets to use in this catcache.
+ * It will be enlarged later if it becomes too full.
+ *
+ * nbuckets must be a power of two. We check this via Assert rather than
+ * a full runtime check because the values will be coming from constant
+ * tables.
+ *
+ * If you're confused by the power-of-two check, see comments in
+ * bitmapset.c for an explanation.
+ */
+ Assert(nbuckets > 0 && (nbuckets & -nbuckets) == nbuckets);
+
+ /*
+ * first switch to the cache context so our allocations do not vanish at
+ * the end of a transaction
+ */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * if first time through, initialize the cache group header
+ */
+ if (CacheHdr == NULL)
+ {
+ CacheHdr = (CatCacheHeader *) palloc(sizeof(CatCacheHeader));
+ slist_init(&CacheHdr->ch_caches);
+ CacheHdr->ch_ntup = 0;
+#ifdef CATCACHE_STATS
+ /* set up to dump stats at backend exit */
+ on_proc_exit(CatCachePrintStats, 0);
+#endif
+ }
+
+ /*
+ * Allocate a new cache structure, aligning to a cacheline boundary
+ *
+ * Note: we rely on zeroing to initialize all the dlist headers correctly
+ */
+ sz = sizeof(CatCache) + PG_CACHE_LINE_SIZE;
+ cp = (CatCache *) CACHELINEALIGN(palloc0(sz));
+ cp->cc_bucket = palloc0(nbuckets * sizeof(dlist_head));
+
+ /*
+ * initialize the cache's relation information for the relation
+ * corresponding to this cache, and initialize some of the new cache's
+ * other internal fields. But don't open the relation yet.
+ */
+ cp->id = id;
+ cp->cc_relname = "(not known yet)";
+ cp->cc_reloid = reloid;
+ cp->cc_indexoid = indexoid;
+ cp->cc_relisshared = false; /* temporary */
+ cp->cc_tupdesc = (TupleDesc) NULL;
+ cp->cc_ntup = 0;
+ cp->cc_nbuckets = nbuckets;
+ cp->cc_nkeys = nkeys;
+ for (i = 0; i < nkeys; ++i)
+ cp->cc_keyno[i] = key[i];
+
+ /*
+ * new cache is initialized as far as we can go for now. print some
+ * debugging information, if appropriate.
+ */
+ InitCatCache_DEBUG2;
+
+ /*
+ * add completed cache to top of group header's list
+ */
+ slist_push_head(&CacheHdr->ch_caches, &cp->cc_next);
+
+ /*
+ * back to the old context before we return...
+ */
+ MemoryContextSwitchTo(oldcxt);
+
+ return cp;
+}
+
+/*
+ * Enlarge a catcache, doubling the number of buckets.
+ */
+static void
+RehashCatCache(CatCache *cp)
+{
+ dlist_head *newbucket;
+ int newnbuckets;
+ int i;
+
+ elog(DEBUG1, "rehashing catalog cache id %d for %s; %d tups, %d buckets",
+ cp->id, cp->cc_relname, cp->cc_ntup, cp->cc_nbuckets);
+
+ /* Allocate a new, larger, hash table. */
+ newnbuckets = cp->cc_nbuckets * 2;
+ newbucket = (dlist_head *) MemoryContextAllocZero(CacheMemoryContext, newnbuckets * sizeof(dlist_head));
+
+ /* Move all entries from old hash table to new. */
+ for (i = 0; i < cp->cc_nbuckets; i++)
+ {
+ dlist_mutable_iter iter;
+
+ dlist_foreach_modify(iter, &cp->cc_bucket[i])
+ {
+ CatCTup *ct = dlist_container(CatCTup, cache_elem, iter.cur);
+ int hashIndex = HASH_INDEX(ct->hash_value, newnbuckets);
+
+ dlist_delete(iter.cur);
+ dlist_push_head(&newbucket[hashIndex], &ct->cache_elem);
+ }
+ }
+
+ /* Switch to the new array. */
+ pfree(cp->cc_bucket);
+ cp->cc_nbuckets = newnbuckets;
+ cp->cc_bucket = newbucket;
+}
+
+/*
+ * CatalogCacheInitializeCache
+ *
+ * This function does final initialization of a catcache: obtain the tuple
+ * descriptor and set up the hash and equality function links. We assume
+ * that the relcache entry can be opened at this point!
+ */
+#ifdef CACHEDEBUG
+#define CatalogCacheInitializeCache_DEBUG1 \
+ elog(DEBUG2, "CatalogCacheInitializeCache: cache @%p rel=%u", cache, \
+ cache->cc_reloid)
+
+#define CatalogCacheInitializeCache_DEBUG2 \
+do { \
+ if (cache->cc_keyno[i] > 0) { \
+ elog(DEBUG2, "CatalogCacheInitializeCache: load %d/%d w/%d, %u", \
+ i+1, cache->cc_nkeys, cache->cc_keyno[i], \
+ TupleDescAttr(tupdesc, cache->cc_keyno[i] - 1)->atttypid); \
+ } else { \
+ elog(DEBUG2, "CatalogCacheInitializeCache: load %d/%d w/%d", \
+ i+1, cache->cc_nkeys, cache->cc_keyno[i]); \
+ } \
+} while(0)
+#else
+#define CatalogCacheInitializeCache_DEBUG1
+#define CatalogCacheInitializeCache_DEBUG2
+#endif
+
+static void
+CatalogCacheInitializeCache(CatCache *cache)
+{
+ Relation relation;
+ MemoryContext oldcxt;
+ TupleDesc tupdesc;
+ int i;
+
+ CatalogCacheInitializeCache_DEBUG1;
+
+ relation = table_open(cache->cc_reloid, AccessShareLock);
+
+ /*
+ * switch to the cache context so our allocations do not vanish at the end
+ * of a transaction
+ */
+ Assert(CacheMemoryContext != NULL);
+
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * copy the relcache's tuple descriptor to permanent cache storage
+ */
+ tupdesc = CreateTupleDescCopyConstr(RelationGetDescr(relation));
+
+ /*
+ * save the relation's name and relisshared flag, too (cc_relname is used
+ * only for debugging purposes)
+ */
+ cache->cc_relname = pstrdup(RelationGetRelationName(relation));
+ cache->cc_relisshared = RelationGetForm(relation)->relisshared;
+
+ /*
+ * return to the caller's memory context and close the rel
+ */
+ MemoryContextSwitchTo(oldcxt);
+
+ table_close(relation, AccessShareLock);
+
+ CACHE_elog(DEBUG2, "CatalogCacheInitializeCache: %s, %d keys",
+ cache->cc_relname, cache->cc_nkeys);
+
+ /*
+ * initialize cache's key information
+ */
+ for (i = 0; i < cache->cc_nkeys; ++i)
+ {
+ Oid keytype;
+ RegProcedure eqfunc;
+
+ CatalogCacheInitializeCache_DEBUG2;
+
+ if (cache->cc_keyno[i] > 0)
+ {
+ Form_pg_attribute attr = TupleDescAttr(tupdesc,
+ cache->cc_keyno[i] - 1);
+
+ keytype = attr->atttypid;
+ /* cache key columns should always be NOT NULL */
+ Assert(attr->attnotnull);
+ }
+ else
+ {
+ if (cache->cc_keyno[i] < 0)
+ elog(FATAL, "sys attributes are not supported in caches");
+ keytype = OIDOID;
+ }
+
+ GetCCHashEqFuncs(keytype,
+ &cache->cc_hashfunc[i],
+ &eqfunc,
+ &cache->cc_fastequal[i]);
+
+ /*
+ * Do equality-function lookup (we assume this won't need a catalog
+ * lookup for any supported type)
+ */
+ fmgr_info_cxt(eqfunc,
+ &cache->cc_skey[i].sk_func,
+ CacheMemoryContext);
+
+ /* Initialize sk_attno suitably for HeapKeyTest() and heap scans */
+ cache->cc_skey[i].sk_attno = cache->cc_keyno[i];
+
+ /* Fill in sk_strategy as well --- always standard equality */
+ cache->cc_skey[i].sk_strategy = BTEqualStrategyNumber;
+ cache->cc_skey[i].sk_subtype = InvalidOid;
+ /* If a catcache key requires a collation, it must be C collation */
+ cache->cc_skey[i].sk_collation = C_COLLATION_OID;
+
+ CACHE_elog(DEBUG2, "CatalogCacheInitializeCache %s %d %p",
+ cache->cc_relname, i, cache);
+ }
+
+ /*
+ * mark this cache fully initialized
+ */
+ cache->cc_tupdesc = tupdesc;
+}
+
+/*
+ * InitCatCachePhase2 -- external interface for CatalogCacheInitializeCache
+ *
+ * One reason to call this routine is to ensure that the relcache has
+ * created entries for all the catalogs and indexes referenced by catcaches.
+ * Therefore, provide an option to open the index as well as fixing the
+ * cache itself. An exception is the indexes on pg_am, which we don't use
+ * (cf. IndexScanOK).
+ */
+void
+InitCatCachePhase2(CatCache *cache, bool touch_index)
+{
+ if (cache->cc_tupdesc == NULL)
+ CatalogCacheInitializeCache(cache);
+
+ if (touch_index &&
+ cache->id != AMOID &&
+ cache->id != AMNAME)
+ {
+ Relation idesc;
+
+ /*
+ * We must lock the underlying catalog before opening the index to
+ * avoid deadlock, since index_open could possibly result in reading
+ * this same catalog, and if anyone else is exclusive-locking this
+ * catalog and index they'll be doing it in that order.
+ */
+ LockRelationOid(cache->cc_reloid, AccessShareLock);
+ idesc = index_open(cache->cc_indexoid, AccessShareLock);
+
+ /*
+ * While we've got the index open, let's check that it's unique (and
+ * not just deferrable-unique, thank you very much). This is just to
+ * catch thinkos in definitions of new catcaches, so we don't worry
+ * about the pg_am indexes not getting tested.
+ */
+ Assert(idesc->rd_index->indisunique &&
+ idesc->rd_index->indimmediate);
+
+ index_close(idesc, AccessShareLock);
+ UnlockRelationOid(cache->cc_reloid, AccessShareLock);
+ }
+}
+
+
+/*
+ * IndexScanOK
+ *
+ * This function checks for tuples that will be fetched by
+ * IndexSupportInitialize() during relcache initialization for
+ * certain system indexes that support critical syscaches.
+ * We can't use an indexscan to fetch these, else we'll get into
+ * infinite recursion. A plain heap scan will work, however.
+ * Once we have completed relcache initialization (signaled by
+ * criticalRelcachesBuilt), we don't have to worry anymore.
+ *
+ * Similarly, during backend startup we have to be able to use the
+ * pg_authid, pg_auth_members and pg_database syscaches for
+ * authentication even if we don't yet have relcache entries for those
+ * catalogs' indexes.
+ */
+static bool
+IndexScanOK(CatCache *cache, ScanKey cur_skey)
+{
+ switch (cache->id)
+ {
+ case INDEXRELID:
+
+ /*
+ * Rather than tracking exactly which indexes have to be loaded
+ * before we can use indexscans (which changes from time to time),
+ * just force all pg_index searches to be heap scans until we've
+ * built the critical relcaches.
+ */
+ if (!criticalRelcachesBuilt)
+ return false;
+ break;
+
+ case AMOID:
+ case AMNAME:
+
+ /*
+ * Always do heap scans in pg_am, because it's so small there's
+ * not much point in an indexscan anyway. We *must* do this when
+ * initially building critical relcache entries, but we might as
+ * well just always do it.
+ */
+ return false;
+
+ case AUTHNAME:
+ case AUTHOID:
+ case AUTHMEMMEMROLE:
+ case DATABASEOID:
+
+ /*
+ * Protect authentication lookups occurring before relcache has
+ * collected entries for shared indexes.
+ */
+ if (!criticalSharedRelcachesBuilt)
+ return false;
+ break;
+
+ default:
+ break;
+ }
+
+ /* Normal case, allow index scan */
+ return true;
+}
+
+/*
+ * SearchCatCache
+ *
+ * This call searches a system cache for a tuple, opening the relation
+ * if necessary (on the first access to a particular cache).
+ *
+ * The result is NULL if not found, or a pointer to a HeapTuple in
+ * the cache. The caller must not modify the tuple, and must call
+ * ReleaseCatCache() when done with it.
+ *
+ * The search key values should be expressed as Datums of the key columns'
+ * datatype(s). (Pass zeroes for any unused parameters.) As a special
+ * exception, the passed-in key for a NAME column can be just a C string;
+ * the caller need not go to the trouble of converting it to a fully
+ * null-padded NAME.
+ */
+HeapTuple
+SearchCatCache(CatCache *cache,
+ Datum v1,
+ Datum v2,
+ Datum v3,
+ Datum v4)
+{
+ return SearchCatCacheInternal(cache, cache->cc_nkeys, v1, v2, v3, v4);
+}
+
+
+/*
+ * SearchCatCacheN() are SearchCatCache() versions for a specific number of
+ * arguments. The compiler can inline the body and unroll loops, making them a
+ * bit faster than SearchCatCache().
+ */
+
+HeapTuple
+SearchCatCache1(CatCache *cache,
+ Datum v1)
+{
+ return SearchCatCacheInternal(cache, 1, v1, 0, 0, 0);
+}
+
+
+HeapTuple
+SearchCatCache2(CatCache *cache,
+ Datum v1, Datum v2)
+{
+ return SearchCatCacheInternal(cache, 2, v1, v2, 0, 0);
+}
+
+
+HeapTuple
+SearchCatCache3(CatCache *cache,
+ Datum v1, Datum v2, Datum v3)
+{
+ return SearchCatCacheInternal(cache, 3, v1, v2, v3, 0);
+}
+
+
+HeapTuple
+SearchCatCache4(CatCache *cache,
+ Datum v1, Datum v2, Datum v3, Datum v4)
+{
+ return SearchCatCacheInternal(cache, 4, v1, v2, v3, v4);
+}
+
+/*
+ * Work-horse for SearchCatCache/SearchCatCacheN.
+ */
+static inline HeapTuple
+SearchCatCacheInternal(CatCache *cache,
+ int nkeys,
+ Datum v1,
+ Datum v2,
+ Datum v3,
+ Datum v4)
+{
+ Datum arguments[CATCACHE_MAXKEYS];
+ uint32 hashValue;
+ Index hashIndex;
+ dlist_iter iter;
+ dlist_head *bucket;
+ CatCTup *ct;
+
+ /* Make sure we're in an xact, even if this ends up being a cache hit */
+ Assert(IsTransactionState());
+
+ Assert(cache->cc_nkeys == nkeys);
+
+ /*
+ * one-time startup overhead for each cache
+ */
+ if (unlikely(cache->cc_tupdesc == NULL))
+ CatalogCacheInitializeCache(cache);
+
+#ifdef CATCACHE_STATS
+ cache->cc_searches++;
+#endif
+
+ /* Initialize local parameter array */
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+
+ /*
+ * find the hash bucket in which to look for the tuple
+ */
+ hashValue = CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+ hashIndex = HASH_INDEX(hashValue, cache->cc_nbuckets);
+
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ *
+ * Note: it's okay to use dlist_foreach here, even though we modify the
+ * dlist within the loop, because we don't continue the loop afterwards.
+ */
+ bucket = &cache->cc_bucket[hashIndex];
+ dlist_foreach(iter, bucket)
+ {
+ ct = dlist_container(CatCTup, cache_elem, iter.cur);
+
+ if (ct->dead)
+ continue; /* ignore dead entries */
+
+ if (ct->hash_value != hashValue)
+ continue; /* quickly skip entry if wrong hash val */
+
+ if (!CatalogCacheCompareTuple(cache, nkeys, ct->keys, arguments))
+ continue;
+
+ /*
+ * We found a match in the cache. Move it to the front of the list
+ * for its hashbucket, in order to speed subsequent searches. (The
+ * most frequently accessed elements in any hashbucket will tend to be
+ * near the front of the hashbucket's list.)
+ */
+ dlist_move_head(bucket, &ct->cache_elem);
+
+ /*
+ * If it's a positive entry, bump its refcount and return it. If it's
+ * negative, we can report failure to the caller.
+ */
+ if (!ct->negative)
+ {
+ ResourceOwnerEnlargeCatCacheRefs(CurrentResourceOwner);
+ ct->refcount++;
+ ResourceOwnerRememberCatCacheRef(CurrentResourceOwner, &ct->tuple);
+
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): found in bucket %d",
+ cache->cc_relname, hashIndex);
+
+#ifdef CATCACHE_STATS
+ cache->cc_hits++;
+#endif
+
+ return &ct->tuple;
+ }
+ else
+ {
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): found neg entry in bucket %d",
+ cache->cc_relname, hashIndex);
+
+#ifdef CATCACHE_STATS
+ cache->cc_neg_hits++;
+#endif
+
+ return NULL;
+ }
+ }
+
+ return SearchCatCacheMiss(cache, nkeys, hashValue, hashIndex, v1, v2, v3, v4);
+}
+
+/*
+ * Search the actual catalogs, rather than the cache.
+ *
+ * This is kept separate from SearchCatCacheInternal() to keep the fast-path
+ * as small as possible. To avoid that effort being undone by a helpful
+ * compiler, try to explicitly forbid inlining.
+ */
+static pg_noinline HeapTuple
+SearchCatCacheMiss(CatCache *cache,
+ int nkeys,
+ uint32 hashValue,
+ Index hashIndex,
+ Datum v1,
+ Datum v2,
+ Datum v3,
+ Datum v4)
+{
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ Relation relation;
+ SysScanDesc scandesc;
+ HeapTuple ntp;
+ CatCTup *ct;
+ Datum arguments[CATCACHE_MAXKEYS];
+
+ /* Initialize local parameter array */
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and fill
+ * out any per-call fields.
+ */
+ memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * nkeys);
+ cur_skey[0].sk_argument = v1;
+ cur_skey[1].sk_argument = v2;
+ cur_skey[2].sk_argument = v3;
+ cur_skey[3].sk_argument = v4;
+
+ /*
+ * Tuple was not found in cache, so we have to try to retrieve it directly
+ * from the relation. If found, we will add it to the cache; if not
+ * found, we will add a negative cache entry instead.
+ *
+ * NOTE: it is possible for recursive cache lookups to occur while reading
+ * the relation --- for example, due to shared-cache-inval messages being
+ * processed during table_open(). This is OK. It's even possible for one
+ * of those lookups to find and enter the very same tuple we are trying to
+ * fetch here. If that happens, we will enter a second copy of the tuple
+ * into the cache. The first copy will never be referenced again, and
+ * will eventually age out of the cache, so there's no functional problem.
+ * This case is rare enough that it's not worth expending extra cycles to
+ * detect.
+ */
+ relation = table_open(cache->cc_reloid, AccessShareLock);
+
+ scandesc = systable_beginscan(relation,
+ cache->cc_indexoid,
+ IndexScanOK(cache, cur_skey),
+ NULL,
+ nkeys,
+ cur_skey);
+
+ ct = NULL;
+
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc)))
+ {
+ ct = CatalogCacheCreateEntry(cache, ntp, arguments,
+ hashValue, hashIndex,
+ false);
+ /* immediately set the refcount to 1 */
+ ResourceOwnerEnlargeCatCacheRefs(CurrentResourceOwner);
+ ct->refcount++;
+ ResourceOwnerRememberCatCacheRef(CurrentResourceOwner, &ct->tuple);
+ break; /* assume only one match */
+ }
+
+ systable_endscan(scandesc);
+
+ table_close(relation, AccessShareLock);
+
+ /*
+ * If tuple was not found, we need to build a negative cache entry
+ * containing a fake tuple. The fake tuple has the correct key columns,
+ * but nulls everywhere else.
+ *
+ * In bootstrap mode, we don't build negative entries, because the cache
+ * invalidation mechanism isn't alive and can't clear them if the tuple
+ * gets created later. (Bootstrap doesn't do UPDATEs, so it doesn't need
+ * cache inval for that.)
+ */
+ if (ct == NULL)
+ {
+ if (IsBootstrapProcessingMode())
+ return NULL;
+
+ ct = CatalogCacheCreateEntry(cache, NULL, arguments,
+ hashValue, hashIndex,
+ true);
+
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): Contains %d/%d tuples",
+ cache->cc_relname, cache->cc_ntup, CacheHdr->ch_ntup);
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): put neg entry in bucket %d",
+ cache->cc_relname, hashIndex);
+
+ /*
+ * We are not returning the negative entry to the caller, so leave its
+ * refcount zero.
+ */
+
+ return NULL;
+ }
+
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): Contains %d/%d tuples",
+ cache->cc_relname, cache->cc_ntup, CacheHdr->ch_ntup);
+ CACHE_elog(DEBUG2, "SearchCatCache(%s): put in bucket %d",
+ cache->cc_relname, hashIndex);
+
+#ifdef CATCACHE_STATS
+ cache->cc_newloads++;
+#endif
+
+ return &ct->tuple;
+}
+
+/*
+ * ReleaseCatCache
+ *
+ * Decrement the reference count of a catcache entry (releasing the
+ * hold grabbed by a successful SearchCatCache).
+ *
+ * NOTE: if compiled with -DCATCACHE_FORCE_RELEASE then catcache entries
+ * will be freed as soon as their refcount goes to zero. In combination
+ * with aset.c's CLOBBER_FREED_MEMORY option, this provides a good test
+ * to catch references to already-released catcache entries.
+ */
+void
+ReleaseCatCache(HeapTuple tuple)
+{
+ CatCTup *ct = (CatCTup *) (((char *) tuple) -
+ offsetof(CatCTup, tuple));
+
+ /* Safety checks to ensure we were handed a cache entry */
+ Assert(ct->ct_magic == CT_MAGIC);
+ Assert(ct->refcount > 0);
+
+ ct->refcount--;
+ ResourceOwnerForgetCatCacheRef(CurrentResourceOwner, &ct->tuple);
+
+ if (
+#ifndef CATCACHE_FORCE_RELEASE
+ ct->dead &&
+#endif
+ ct->refcount == 0 &&
+ (ct->c_list == NULL || ct->c_list->refcount == 0))
+ CatCacheRemoveCTup(ct->my_cache, ct);
+}
+
+
+/*
+ * GetCatCacheHashValue
+ *
+ * Compute the hash value for a given set of search keys.
+ *
+ * The reason for exposing this as part of the API is that the hash value is
+ * exposed in cache invalidation operations, so there are places outside the
+ * catcache code that need to be able to compute the hash values.
+ */
+uint32
+GetCatCacheHashValue(CatCache *cache,
+ Datum v1,
+ Datum v2,
+ Datum v3,
+ Datum v4)
+{
+ /*
+ * one-time startup overhead for each cache
+ */
+ if (cache->cc_tupdesc == NULL)
+ CatalogCacheInitializeCache(cache);
+
+ /*
+ * calculate the hash value
+ */
+ return CatalogCacheComputeHashValue(cache, cache->cc_nkeys, v1, v2, v3, v4);
+}
+
+
+/*
+ * SearchCatCacheList
+ *
+ * Generate a list of all tuples matching a partial key (that is,
+ * a key specifying just the first K of the cache's N key columns).
+ *
+ * It doesn't make any sense to specify all of the cache's key columns
+ * here: since the key is unique, there could be at most one match, so
+ * you ought to use SearchCatCache() instead. Hence this function takes
+ * one fewer Datum argument than SearchCatCache() does.
+ *
+ * The caller must not modify the list object or the pointed-to tuples,
+ * and must call ReleaseCatCacheList() when done with the list.
+ */
+CatCList *
+SearchCatCacheList(CatCache *cache,
+ int nkeys,
+ Datum v1,
+ Datum v2,
+ Datum v3)
+{
+ Datum v4 = 0; /* dummy last-column value */
+ Datum arguments[CATCACHE_MAXKEYS];
+ uint32 lHashValue;
+ dlist_iter iter;
+ CatCList *cl;
+ CatCTup *ct;
+ List *volatile ctlist;
+ ListCell *ctlist_item;
+ int nmembers;
+ bool ordered;
+ HeapTuple ntp;
+ MemoryContext oldcxt;
+ int i;
+
+ /*
+ * one-time startup overhead for each cache
+ */
+ if (cache->cc_tupdesc == NULL)
+ CatalogCacheInitializeCache(cache);
+
+ Assert(nkeys > 0 && nkeys < cache->cc_nkeys);
+
+#ifdef CATCACHE_STATS
+ cache->cc_lsearches++;
+#endif
+
+ /* Initialize local parameter array */
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+
+ /*
+ * compute a hash value of the given keys for faster search. We don't
+ * presently divide the CatCList items into buckets, but this still lets
+ * us skip non-matching items quickly most of the time.
+ */
+ lHashValue = CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+
+ /*
+ * scan the items until we find a match or exhaust our list
+ *
+ * Note: it's okay to use dlist_foreach here, even though we modify the
+ * dlist within the loop, because we don't continue the loop afterwards.
+ */
+ dlist_foreach(iter, &cache->cc_lists)
+ {
+ cl = dlist_container(CatCList, cache_elem, iter.cur);
+
+ if (cl->dead)
+ continue; /* ignore dead entries */
+
+ if (cl->hash_value != lHashValue)
+ continue; /* quickly skip entry if wrong hash val */
+
+ /*
+ * see if the cached list matches our key.
+ */
+ if (cl->nkeys != nkeys)
+ continue;
+
+ if (!CatalogCacheCompareTuple(cache, nkeys, cl->keys, arguments))
+ continue;
+
+ /*
+ * We found a matching list. Move the list to the front of the
+ * cache's list-of-lists, to speed subsequent searches. (We do not
+ * move the members to the fronts of their hashbucket lists, however,
+ * since there's no point in that unless they are searched for
+ * individually.)
+ */
+ dlist_move_head(&cache->cc_lists, &cl->cache_elem);
+
+ /* Bump the list's refcount and return it */
+ ResourceOwnerEnlargeCatCacheListRefs(CurrentResourceOwner);
+ cl->refcount++;
+ ResourceOwnerRememberCatCacheListRef(CurrentResourceOwner, cl);
+
+ CACHE_elog(DEBUG2, "SearchCatCacheList(%s): found list",
+ cache->cc_relname);
+
+#ifdef CATCACHE_STATS
+ cache->cc_lhits++;
+#endif
+
+ return cl;
+ }
+
+ /*
+ * List was not found in cache, so we have to build it by reading the
+ * relation. For each matching tuple found in the relation, use an
+ * existing cache entry if possible, else build a new one.
+ *
+ * We have to bump the member refcounts temporarily to ensure they won't
+ * get dropped from the cache while loading other members. We use a PG_TRY
+ * block to ensure we can undo those refcounts if we get an error before
+ * we finish constructing the CatCList.
+ */
+ ResourceOwnerEnlargeCatCacheListRefs(CurrentResourceOwner);
+
+ ctlist = NIL;
+
+ PG_TRY();
+ {
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ Relation relation;
+ SysScanDesc scandesc;
+
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and
+ * fill out any per-call fields.
+ */
+ memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * cache->cc_nkeys);
+ cur_skey[0].sk_argument = v1;
+ cur_skey[1].sk_argument = v2;
+ cur_skey[2].sk_argument = v3;
+ cur_skey[3].sk_argument = v4;
+
+ relation = table_open(cache->cc_reloid, AccessShareLock);
+
+ scandesc = systable_beginscan(relation,
+ cache->cc_indexoid,
+ IndexScanOK(cache, cur_skey),
+ NULL,
+ nkeys,
+ cur_skey);
+
+ /* The list will be ordered iff we are doing an index scan */
+ ordered = (scandesc->irel != NULL);
+
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc)))
+ {
+ uint32 hashValue;
+ Index hashIndex;
+ bool found = false;
+ dlist_head *bucket;
+
+ /*
+ * See if there's an entry for this tuple already.
+ */
+ ct = NULL;
+ hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, ntp);
+ hashIndex = HASH_INDEX(hashValue, cache->cc_nbuckets);
+
+ bucket = &cache->cc_bucket[hashIndex];
+ dlist_foreach(iter, bucket)
+ {
+ ct = dlist_container(CatCTup, cache_elem, iter.cur);
+
+ if (ct->dead || ct->negative)
+ continue; /* ignore dead and negative entries */
+
+ if (ct->hash_value != hashValue)
+ continue; /* quickly skip entry if wrong hash val */
+
+ if (!ItemPointerEquals(&(ct->tuple.t_self), &(ntp->t_self)))
+ continue; /* not same tuple */
+
+ /*
+ * Found a match, but can't use it if it belongs to another
+ * list already
+ */
+ if (ct->c_list)
+ continue;
+
+ found = true;
+ break; /* A-OK */
+ }
+
+ if (!found)
+ {
+ /* We didn't find a usable entry, so make a new one */
+ ct = CatalogCacheCreateEntry(cache, ntp, arguments,
+ hashValue, hashIndex,
+ false);
+ }
+
+ /* Careful here: add entry to ctlist, then bump its refcount */
+ /* This way leaves state correct if lappend runs out of memory */
+ ctlist = lappend(ctlist, ct);
+ ct->refcount++;
+ }
+
+ systable_endscan(scandesc);
+
+ table_close(relation, AccessShareLock);
+
+ /* Now we can build the CatCList entry. */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ nmembers = list_length(ctlist);
+ cl = (CatCList *)
+ palloc(offsetof(CatCList, members) + nmembers * sizeof(CatCTup *));
+
+ /* Extract key values */
+ CatCacheCopyKeys(cache->cc_tupdesc, nkeys, cache->cc_keyno,
+ arguments, cl->keys);
+ MemoryContextSwitchTo(oldcxt);
+
+ /*
+ * We are now past the last thing that could trigger an elog before we
+ * have finished building the CatCList and remembering it in the
+ * resource owner. So it's OK to fall out of the PG_TRY, and indeed
+ * we'd better do so before we start marking the members as belonging
+ * to the list.
+ */
+ }
+ PG_CATCH();
+ {
+ foreach(ctlist_item, ctlist)
+ {
+ ct = (CatCTup *) lfirst(ctlist_item);
+ Assert(ct->c_list == NULL);
+ Assert(ct->refcount > 0);
+ ct->refcount--;
+ if (
+#ifndef CATCACHE_FORCE_RELEASE
+ ct->dead &&
+#endif
+ ct->refcount == 0 &&
+ (ct->c_list == NULL || ct->c_list->refcount == 0))
+ CatCacheRemoveCTup(cache, ct);
+ }
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ cl->cl_magic = CL_MAGIC;
+ cl->my_cache = cache;
+ cl->refcount = 0; /* for the moment */
+ cl->dead = false;
+ cl->ordered = ordered;
+ cl->nkeys = nkeys;
+ cl->hash_value = lHashValue;
+ cl->n_members = nmembers;
+
+ i = 0;
+ foreach(ctlist_item, ctlist)
+ {
+ cl->members[i++] = ct = (CatCTup *) lfirst(ctlist_item);
+ Assert(ct->c_list == NULL);
+ ct->c_list = cl;
+ /* release the temporary refcount on the member */
+ Assert(ct->refcount > 0);
+ ct->refcount--;
+ /* mark list dead if any members already dead */
+ if (ct->dead)
+ cl->dead = true;
+ }
+ Assert(i == nmembers);
+
+ dlist_push_head(&cache->cc_lists, &cl->cache_elem);
+
+ /* Finally, bump the list's refcount and return it */
+ cl->refcount++;
+ ResourceOwnerRememberCatCacheListRef(CurrentResourceOwner, cl);
+
+ CACHE_elog(DEBUG2, "SearchCatCacheList(%s): made list of %d members",
+ cache->cc_relname, nmembers);
+
+ return cl;
+}
+
+/*
+ * ReleaseCatCacheList
+ *
+ * Decrement the reference count of a catcache list.
+ */
+void
+ReleaseCatCacheList(CatCList *list)
+{
+ /* Safety checks to ensure we were handed a cache entry */
+ Assert(list->cl_magic == CL_MAGIC);
+ Assert(list->refcount > 0);
+ list->refcount--;
+ ResourceOwnerForgetCatCacheListRef(CurrentResourceOwner, list);
+
+ if (
+#ifndef CATCACHE_FORCE_RELEASE
+ list->dead &&
+#endif
+ list->refcount == 0)
+ CatCacheRemoveCList(list->my_cache, list);
+}
+
+
+/*
+ * CatalogCacheCreateEntry
+ * Create a new CatCTup entry, copying the given HeapTuple and other
+ * supplied data into it. The new entry initially has refcount 0.
+ */
+static CatCTup *
+CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments,
+ uint32 hashValue, Index hashIndex,
+ bool negative)
+{
+ CatCTup *ct;
+ HeapTuple dtp;
+ MemoryContext oldcxt;
+
+ /* negative entries have no tuple associated */
+ if (ntp)
+ {
+ int i;
+
+ Assert(!negative);
+
+ /*
+ * If there are any out-of-line toasted fields in the tuple, expand
+ * them in-line. This saves cycles during later use of the catcache
+ * entry, and also protects us against the possibility of the toast
+ * tuples being freed before we attempt to fetch them, in case of
+ * something using a slightly stale catcache entry.
+ */
+ if (HeapTupleHasExternal(ntp))
+ dtp = toast_flatten_tuple(ntp, cache->cc_tupdesc);
+ else
+ dtp = ntp;
+
+ /* Allocate memory for CatCTup and the cached tuple in one go */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ ct = (CatCTup *) palloc(sizeof(CatCTup) +
+ MAXIMUM_ALIGNOF + dtp->t_len);
+ ct->tuple.t_len = dtp->t_len;
+ ct->tuple.t_self = dtp->t_self;
+ ct->tuple.t_tableOid = dtp->t_tableOid;
+ ct->tuple.t_data = (HeapTupleHeader)
+ MAXALIGN(((char *) ct) + sizeof(CatCTup));
+ /* copy tuple contents */
+ memcpy((char *) ct->tuple.t_data,
+ (const char *) dtp->t_data,
+ dtp->t_len);
+ MemoryContextSwitchTo(oldcxt);
+
+ if (dtp != ntp)
+ heap_freetuple(dtp);
+
+ /* extract keys - they'll point into the tuple if not by-value */
+ for (i = 0; i < cache->cc_nkeys; i++)
+ {
+ Datum atp;
+ bool isnull;
+
+ atp = heap_getattr(&ct->tuple,
+ cache->cc_keyno[i],
+ cache->cc_tupdesc,
+ &isnull);
+ Assert(!isnull);
+ ct->keys[i] = atp;
+ }
+ }
+ else
+ {
+ Assert(negative);
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ ct = (CatCTup *) palloc(sizeof(CatCTup));
+
+ /*
+ * Store keys - they'll point into separately allocated memory if not
+ * by-value.
+ */
+ CatCacheCopyKeys(cache->cc_tupdesc, cache->cc_nkeys, cache->cc_keyno,
+ arguments, ct->keys);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /*
+ * Finish initializing the CatCTup header, and add it to the cache's
+ * linked list and counts.
+ */
+ ct->ct_magic = CT_MAGIC;
+ ct->my_cache = cache;
+ ct->c_list = NULL;
+ ct->refcount = 0; /* for the moment */
+ ct->dead = false;
+ ct->negative = negative;
+ ct->hash_value = hashValue;
+
+ dlist_push_head(&cache->cc_bucket[hashIndex], &ct->cache_elem);
+
+ cache->cc_ntup++;
+ CacheHdr->ch_ntup++;
+
+ /*
+ * If the hash table has become too full, enlarge the buckets array. Quite
+ * arbitrarily, we enlarge when fill factor > 2.
+ */
+ if (cache->cc_ntup > cache->cc_nbuckets * 2)
+ RehashCatCache(cache);
+
+ return ct;
+}
+
+/*
+ * Helper routine that frees keys stored in the keys array.
+ */
+static void
+CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos, Datum *keys)
+{
+ int i;
+
+ for (i = 0; i < nkeys; i++)
+ {
+ int attnum = attnos[i];
+ Form_pg_attribute att;
+
+ /* system attribute are not supported in caches */
+ Assert(attnum > 0);
+
+ att = TupleDescAttr(tupdesc, attnum - 1);
+
+ if (!att->attbyval)
+ pfree(DatumGetPointer(keys[i]));
+ }
+}
+
+/*
+ * Helper routine that copies the keys in the srckeys array into the dstkeys
+ * one, guaranteeing that the datums are fully allocated in the current memory
+ * context.
+ */
+static void
+CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos,
+ Datum *srckeys, Datum *dstkeys)
+{
+ int i;
+
+ /*
+ * XXX: memory and lookup performance could possibly be improved by
+ * storing all keys in one allocation.
+ */
+
+ for (i = 0; i < nkeys; i++)
+ {
+ int attnum = attnos[i];
+ Form_pg_attribute att = TupleDescAttr(tupdesc, attnum - 1);
+ Datum src = srckeys[i];
+ NameData srcname;
+
+ /*
+ * Must be careful in case the caller passed a C string where a NAME
+ * is wanted: convert the given argument to a correctly padded NAME.
+ * Otherwise the memcpy() done by datumCopy() could fall off the end
+ * of memory.
+ */
+ if (att->atttypid == NAMEOID)
+ {
+ namestrcpy(&srcname, DatumGetCString(src));
+ src = NameGetDatum(&srcname);
+ }
+
+ dstkeys[i] = datumCopy(src,
+ att->attbyval,
+ att->attlen);
+ }
+}
+
+/*
+ * PrepareToInvalidateCacheTuple()
+ *
+ * This is part of a rather subtle chain of events, so pay attention:
+ *
+ * When a tuple is inserted or deleted, it cannot be flushed from the
+ * catcaches immediately, for reasons explained at the top of cache/inval.c.
+ * Instead we have to add entry(s) for the tuple to a list of pending tuple
+ * invalidations that will be done at the end of the command or transaction.
+ *
+ * The lists of tuples that need to be flushed are kept by inval.c. This
+ * routine is a helper routine for inval.c. Given a tuple belonging to
+ * the specified relation, find all catcaches it could be in, compute the
+ * correct hash value for each such catcache, and call the specified
+ * function to record the cache id and hash value in inval.c's lists.
+ * SysCacheInvalidate will be called later, if appropriate,
+ * using the recorded information.
+ *
+ * For an insert or delete, tuple is the target tuple and newtuple is NULL.
+ * For an update, we are called just once, with tuple being the old tuple
+ * version and newtuple the new version. We should make two list entries
+ * if the tuple's hash value changed, but only one if it didn't.
+ *
+ * Note that it is irrelevant whether the given tuple is actually loaded
+ * into the catcache at the moment. Even if it's not there now, it might
+ * be by the end of the command, or there might be a matching negative entry
+ * to flush --- or other backends' caches might have such entries --- so
+ * we have to make list entries to flush it later.
+ *
+ * Also note that it's not an error if there are no catcaches for the
+ * specified relation. inval.c doesn't know exactly which rels have
+ * catcaches --- it will call this routine for any tuple that's in a
+ * system relation.
+ */
+void
+PrepareToInvalidateCacheTuple(Relation relation,
+ HeapTuple tuple,
+ HeapTuple newtuple,
+ void (*function) (int, uint32, Oid))
+{
+ slist_iter iter;
+ Oid reloid;
+
+ CACHE_elog(DEBUG2, "PrepareToInvalidateCacheTuple: called");
+
+ /*
+ * sanity checks
+ */
+ Assert(RelationIsValid(relation));
+ Assert(HeapTupleIsValid(tuple));
+ Assert(PointerIsValid(function));
+ Assert(CacheHdr != NULL);
+
+ reloid = RelationGetRelid(relation);
+
+ /* ----------------
+ * for each cache
+ * if the cache contains tuples from the specified relation
+ * compute the tuple's hash value(s) in this cache,
+ * and call the passed function to register the information.
+ * ----------------
+ */
+
+ slist_foreach(iter, &CacheHdr->ch_caches)
+ {
+ CatCache *ccp = slist_container(CatCache, cc_next, iter.cur);
+ uint32 hashvalue;
+ Oid dbid;
+
+ if (ccp->cc_reloid != reloid)
+ continue;
+
+ /* Just in case cache hasn't finished initialization yet... */
+ if (ccp->cc_tupdesc == NULL)
+ CatalogCacheInitializeCache(ccp);
+
+ hashvalue = CatalogCacheComputeTupleHashValue(ccp, ccp->cc_nkeys, tuple);
+ dbid = ccp->cc_relisshared ? (Oid) 0 : MyDatabaseId;
+
+ (*function) (ccp->id, hashvalue, dbid);
+
+ if (newtuple)
+ {
+ uint32 newhashvalue;
+
+ newhashvalue = CatalogCacheComputeTupleHashValue(ccp, ccp->cc_nkeys, newtuple);
+
+ if (newhashvalue != hashvalue)
+ (*function) (ccp->id, newhashvalue, dbid);
+ }
+ }
+}
+
+
+/*
+ * Subroutines for warning about reference leaks. These are exported so
+ * that resowner.c can call them.
+ */
+void
+PrintCatCacheLeakWarning(HeapTuple tuple)
+{
+ CatCTup *ct = (CatCTup *) (((char *) tuple) -
+ offsetof(CatCTup, tuple));
+
+ /* Safety check to ensure we were handed a cache entry */
+ Assert(ct->ct_magic == CT_MAGIC);
+
+ elog(WARNING, "cache reference leak: cache %s (%d), tuple %u/%u has count %d",
+ ct->my_cache->cc_relname, ct->my_cache->id,
+ ItemPointerGetBlockNumber(&(tuple->t_self)),
+ ItemPointerGetOffsetNumber(&(tuple->t_self)),
+ ct->refcount);
+}
+
+void
+PrintCatCacheListLeakWarning(CatCList *list)
+{
+ elog(WARNING, "cache reference leak: cache %s (%d), list %p has count %d",
+ list->my_cache->cc_relname, list->my_cache->id,
+ list, list->refcount);
+}
diff --git a/src/backend/utils/cache/evtcache.c b/src/backend/utils/cache/evtcache.c
new file mode 100644
index 0000000..3a9c9f0
--- /dev/null
+++ b/src/backend/utils/cache/evtcache.c
@@ -0,0 +1,270 @@
+/*-------------------------------------------------------------------------
+ *
+ * evtcache.c
+ * Special-purpose cache for event trigger data.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/evtcache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/genam.h"
+#include "access/htup_details.h"
+#include "access/relation.h"
+#include "catalog/pg_event_trigger.h"
+#include "catalog/pg_type.h"
+#include "commands/trigger.h"
+#include "tcop/cmdtag.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/evtcache.h"
+#include "utils/hsearch.h"
+#include "utils/inval.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+typedef enum
+{
+ ETCS_NEEDS_REBUILD,
+ ETCS_REBUILD_STARTED,
+ ETCS_VALID
+} EventTriggerCacheStateType;
+
+typedef struct
+{
+ EventTriggerEvent event;
+ List *triggerlist;
+} EventTriggerCacheEntry;
+
+static HTAB *EventTriggerCache;
+static MemoryContext EventTriggerCacheContext;
+static EventTriggerCacheStateType EventTriggerCacheState = ETCS_NEEDS_REBUILD;
+
+static void BuildEventTriggerCache(void);
+static void InvalidateEventCacheCallback(Datum arg,
+ int cacheid, uint32 hashvalue);
+static Bitmapset *DecodeTextArrayToBitmapset(Datum array);
+
+/*
+ * Search the event cache by trigger event.
+ *
+ * Note that the caller had better copy any data it wants to keep around
+ * across any operation that might touch a system catalog into some other
+ * memory context, since a cache reset could blow the return value away.
+ */
+List *
+EventCacheLookup(EventTriggerEvent event)
+{
+ EventTriggerCacheEntry *entry;
+
+ if (EventTriggerCacheState != ETCS_VALID)
+ BuildEventTriggerCache();
+ entry = hash_search(EventTriggerCache, &event, HASH_FIND, NULL);
+ return entry != NULL ? entry->triggerlist : NIL;
+}
+
+/*
+ * Rebuild the event trigger cache.
+ */
+static void
+BuildEventTriggerCache(void)
+{
+ HASHCTL ctl;
+ HTAB *cache;
+ MemoryContext oldcontext;
+ Relation rel;
+ Relation irel;
+ SysScanDesc scan;
+
+ if (EventTriggerCacheContext != NULL)
+ {
+ /*
+ * Free up any memory already allocated in EventTriggerCacheContext.
+ * This can happen either because a previous rebuild failed, or
+ * because an invalidation happened before the rebuild was complete.
+ */
+ MemoryContextResetAndDeleteChildren(EventTriggerCacheContext);
+ }
+ else
+ {
+ /*
+ * This is our first time attempting to build the cache, so we need to
+ * set up the memory context and register a syscache callback to
+ * capture future invalidation events.
+ */
+ if (CacheMemoryContext == NULL)
+ CreateCacheMemoryContext();
+ EventTriggerCacheContext =
+ AllocSetContextCreate(CacheMemoryContext,
+ "EventTriggerCache",
+ ALLOCSET_DEFAULT_SIZES);
+ CacheRegisterSyscacheCallback(EVENTTRIGGEROID,
+ InvalidateEventCacheCallback,
+ (Datum) 0);
+ }
+
+ /* Switch to correct memory context. */
+ oldcontext = MemoryContextSwitchTo(EventTriggerCacheContext);
+
+ /* Prevent the memory context from being nuked while we're rebuilding. */
+ EventTriggerCacheState = ETCS_REBUILD_STARTED;
+
+ /* Create new hash table. */
+ ctl.keysize = sizeof(EventTriggerEvent);
+ ctl.entrysize = sizeof(EventTriggerCacheEntry);
+ ctl.hcxt = EventTriggerCacheContext;
+ cache = hash_create("Event Trigger Cache", 32, &ctl,
+ HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
+
+ /*
+ * Prepare to scan pg_event_trigger in name order.
+ */
+ rel = relation_open(EventTriggerRelationId, AccessShareLock);
+ irel = index_open(EventTriggerNameIndexId, AccessShareLock);
+ scan = systable_beginscan_ordered(rel, irel, NULL, 0, NULL);
+
+ /*
+ * Build a cache item for each pg_event_trigger tuple, and append each one
+ * to the appropriate cache entry.
+ */
+ for (;;)
+ {
+ HeapTuple tup;
+ Form_pg_event_trigger form;
+ char *evtevent;
+ EventTriggerEvent event;
+ EventTriggerCacheItem *item;
+ Datum evttags;
+ bool evttags_isnull;
+ EventTriggerCacheEntry *entry;
+ bool found;
+
+ /* Get next tuple. */
+ tup = systable_getnext_ordered(scan, ForwardScanDirection);
+ if (!HeapTupleIsValid(tup))
+ break;
+
+ /* Skip trigger if disabled. */
+ form = (Form_pg_event_trigger) GETSTRUCT(tup);
+ if (form->evtenabled == TRIGGER_DISABLED)
+ continue;
+
+ /* Decode event name. */
+ evtevent = NameStr(form->evtevent);
+ if (strcmp(evtevent, "ddl_command_start") == 0)
+ event = EVT_DDLCommandStart;
+ else if (strcmp(evtevent, "ddl_command_end") == 0)
+ event = EVT_DDLCommandEnd;
+ else if (strcmp(evtevent, "sql_drop") == 0)
+ event = EVT_SQLDrop;
+ else if (strcmp(evtevent, "table_rewrite") == 0)
+ event = EVT_TableRewrite;
+ else
+ continue;
+
+ /* Allocate new cache item. */
+ item = palloc0(sizeof(EventTriggerCacheItem));
+ item->fnoid = form->evtfoid;
+ item->enabled = form->evtenabled;
+
+ /* Decode and sort tags array. */
+ evttags = heap_getattr(tup, Anum_pg_event_trigger_evttags,
+ RelationGetDescr(rel), &evttags_isnull);
+ if (!evttags_isnull)
+ item->tagset = DecodeTextArrayToBitmapset(evttags);
+
+ /* Add to cache entry. */
+ entry = hash_search(cache, &event, HASH_ENTER, &found);
+ if (found)
+ entry->triggerlist = lappend(entry->triggerlist, item);
+ else
+ entry->triggerlist = list_make1(item);
+ }
+
+ /* Done with pg_event_trigger scan. */
+ systable_endscan_ordered(scan);
+ index_close(irel, AccessShareLock);
+ relation_close(rel, AccessShareLock);
+
+ /* Restore previous memory context. */
+ MemoryContextSwitchTo(oldcontext);
+
+ /* Install new cache. */
+ EventTriggerCache = cache;
+
+ /*
+ * If the cache has been invalidated since we entered this routine, we
+ * still use and return the cache we just finished constructing, to avoid
+ * infinite loops, but we leave the cache marked stale so that we'll
+ * rebuild it again on next access. Otherwise, we mark the cache valid.
+ */
+ if (EventTriggerCacheState == ETCS_REBUILD_STARTED)
+ EventTriggerCacheState = ETCS_VALID;
+}
+
+/*
+ * Decode text[] to a Bitmapset of CommandTags.
+ *
+ * We could avoid a bit of overhead here if we were willing to duplicate some
+ * of the logic from deconstruct_array, but it doesn't seem worth the code
+ * complexity.
+ */
+static Bitmapset *
+DecodeTextArrayToBitmapset(Datum array)
+{
+ ArrayType *arr = DatumGetArrayTypeP(array);
+ Datum *elems;
+ Bitmapset *bms;
+ int i;
+ int nelems;
+
+ if (ARR_NDIM(arr) != 1 || ARR_HASNULL(arr) || ARR_ELEMTYPE(arr) != TEXTOID)
+ elog(ERROR, "expected 1-D text array");
+ deconstruct_array(arr, TEXTOID, -1, false, TYPALIGN_INT,
+ &elems, NULL, &nelems);
+
+ for (bms = NULL, i = 0; i < nelems; ++i)
+ {
+ char *str = TextDatumGetCString(elems[i]);
+
+ bms = bms_add_member(bms, GetCommandTagEnum(str));
+ pfree(str);
+ }
+
+ pfree(elems);
+
+ return bms;
+}
+
+/*
+ * Flush all cache entries when pg_event_trigger is updated.
+ *
+ * This should be rare enough that we don't need to be very granular about
+ * it, so we just blow away everything, which also avoids the possibility of
+ * memory leaks.
+ */
+static void
+InvalidateEventCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ /*
+ * If the cache isn't valid, then there might be a rebuild in progress, so
+ * we can't immediately blow it away. But it's advantageous to do this
+ * when possible, so as to immediately free memory.
+ */
+ if (EventTriggerCacheState == ETCS_VALID)
+ {
+ MemoryContextResetAndDeleteChildren(EventTriggerCacheContext);
+ EventTriggerCache = NULL;
+ }
+
+ /* Mark cache for rebuild. */
+ EventTriggerCacheState = ETCS_NEEDS_REBUILD;
+}
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c
new file mode 100644
index 0000000..af000d4
--- /dev/null
+++ b/src/backend/utils/cache/inval.c
@@ -0,0 +1,1637 @@
+/*-------------------------------------------------------------------------
+ *
+ * inval.c
+ * POSTGRES cache invalidation dispatcher code.
+ *
+ * This is subtle stuff, so pay attention:
+ *
+ * When a tuple is updated or deleted, our standard visibility rules
+ * consider that it is *still valid* so long as we are in the same command,
+ * ie, until the next CommandCounterIncrement() or transaction commit.
+ * (See access/heap/heapam_visibility.c, and note that system catalogs are
+ * generally scanned under the most current snapshot available, rather than
+ * the transaction snapshot.) At the command boundary, the old tuple stops
+ * being valid and the new version, if any, becomes valid. Therefore,
+ * we cannot simply flush a tuple from the system caches during heap_update()
+ * or heap_delete(). The tuple is still good at that point; what's more,
+ * even if we did flush it, it might be reloaded into the caches by a later
+ * request in the same command. So the correct behavior is to keep a list
+ * of outdated (updated/deleted) tuples and then do the required cache
+ * flushes at the next command boundary. We must also keep track of
+ * inserted tuples so that we can flush "negative" cache entries that match
+ * the new tuples; again, that mustn't happen until end of command.
+ *
+ * Once we have finished the command, we still need to remember inserted
+ * tuples (including new versions of updated tuples), so that we can flush
+ * them from the caches if we abort the transaction. Similarly, we'd better
+ * be able to flush "negative" cache entries that may have been loaded in
+ * place of deleted tuples, so we still need the deleted ones too.
+ *
+ * If we successfully complete the transaction, we have to broadcast all
+ * these invalidation events to other backends (via the SI message queue)
+ * so that they can flush obsolete entries from their caches. Note we have
+ * to record the transaction commit before sending SI messages, otherwise
+ * the other backends won't see our updated tuples as good.
+ *
+ * When a subtransaction aborts, we can process and discard any events
+ * it has queued. When a subtransaction commits, we just add its events
+ * to the pending lists of the parent transaction.
+ *
+ * In short, we need to remember until xact end every insert or delete
+ * of a tuple that might be in the system caches. Updates are treated as
+ * two events, delete + insert, for simplicity. (If the update doesn't
+ * change the tuple hash value, catcache.c optimizes this into one event.)
+ *
+ * We do not need to register EVERY tuple operation in this way, just those
+ * on tuples in relations that have associated catcaches. We do, however,
+ * have to register every operation on every tuple that *could* be in a
+ * catcache, whether or not it currently is in our cache. Also, if the
+ * tuple is in a relation that has multiple catcaches, we need to register
+ * an invalidation message for each such catcache. catcache.c's
+ * PrepareToInvalidateCacheTuple() routine provides the knowledge of which
+ * catcaches may need invalidation for a given tuple.
+ *
+ * Also, whenever we see an operation on a pg_class, pg_attribute, or
+ * pg_index tuple, we register a relcache flush operation for the relation
+ * described by that tuple (as specified in CacheInvalidateHeapTuple()).
+ * Likewise for pg_constraint tuples for foreign keys on relations.
+ *
+ * We keep the relcache flush requests in lists separate from the catcache
+ * tuple flush requests. This allows us to issue all the pending catcache
+ * flushes before we issue relcache flushes, which saves us from loading
+ * a catcache tuple during relcache load only to flush it again right away.
+ * Also, we avoid queuing multiple relcache flush requests for the same
+ * relation, since a relcache flush is relatively expensive to do.
+ * (XXX is it worth testing likewise for duplicate catcache flush entries?
+ * Probably not.)
+ *
+ * Many subsystems own higher-level caches that depend on relcache and/or
+ * catcache, and they register callbacks here to invalidate their caches.
+ * While building a higher-level cache entry, a backend may receive a
+ * callback for the being-built entry or one of its dependencies. This
+ * implies the new higher-level entry would be born stale, and it might
+ * remain stale for the life of the backend. Many caches do not prevent
+ * that. They rely on DDL for can't-miss catalog changes taking
+ * AccessExclusiveLock on suitable objects. (For a change made with less
+ * locking, backends might never read the change.) The relation cache,
+ * however, needs to reflect changes from CREATE INDEX CONCURRENTLY no later
+ * than the beginning of the next transaction. Hence, when a relevant
+ * invalidation callback arrives during a build, relcache.c reattempts that
+ * build. Caches with similar needs could do likewise.
+ *
+ * If a relcache flush is issued for a system relation that we preload
+ * from the relcache init file, we must also delete the init file so that
+ * it will be rebuilt during the next backend restart. The actual work of
+ * manipulating the init file is in relcache.c, but we keep track of the
+ * need for it here.
+ *
+ * Currently, inval messages are sent without regard for the possibility
+ * that the object described by the catalog tuple might be a session-local
+ * object such as a temporary table. This is because (1) this code has
+ * no practical way to tell the difference, and (2) it is not certain that
+ * other backends don't have catalog cache or even relcache entries for
+ * such tables, anyway; there is nothing that prevents that. It might be
+ * worth trying to avoid sending such inval traffic in the future, if those
+ * problems can be overcome cheaply.
+ *
+ * When wal_level=logical, write invalidations into WAL at each command end to
+ * support the decoding of the in-progress transactions. See
+ * CommandEndInvalidationMessages.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/inval.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/htup_details.h"
+#include "access/xact.h"
+#include "access/xloginsert.h"
+#include "catalog/catalog.h"
+#include "catalog/pg_constraint.h"
+#include "miscadmin.h"
+#include "storage/sinval.h"
+#include "storage/smgr.h"
+#include "utils/catcache.h"
+#include "utils/guc.h"
+#include "utils/inval.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/relmapper.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+
+/*
+ * Pending requests are stored as ready-to-send SharedInvalidationMessages.
+ * We keep the messages themselves in arrays in TopTransactionContext
+ * (there are separate arrays for catcache and relcache messages). Control
+ * information is kept in a chain of TransInvalidationInfo structs, also
+ * allocated in TopTransactionContext. (We could keep a subtransaction's
+ * TransInvalidationInfo in its CurTransactionContext; but that's more
+ * wasteful not less so, since in very many scenarios it'd be the only
+ * allocation in the subtransaction's CurTransactionContext.)
+ *
+ * We can store the message arrays densely, and yet avoid moving data around
+ * within an array, because within any one subtransaction we need only
+ * distinguish between messages emitted by prior commands and those emitted
+ * by the current command. Once a command completes and we've done local
+ * processing on its messages, we can fold those into the prior-commands
+ * messages just by changing array indexes in the TransInvalidationInfo
+ * struct. Similarly, we need distinguish messages of prior subtransactions
+ * from those of the current subtransaction only until the subtransaction
+ * completes, after which we adjust the array indexes in the parent's
+ * TransInvalidationInfo to include the subtransaction's messages.
+ *
+ * The ordering of the individual messages within a command's or
+ * subtransaction's output is not considered significant, although this
+ * implementation happens to preserve the order in which they were queued.
+ * (Previous versions of this code did not preserve it.)
+ *
+ * For notational convenience, control information is kept in two-element
+ * arrays, the first for catcache messages and the second for relcache
+ * messages.
+ */
+#define CatCacheMsgs 0
+#define RelCacheMsgs 1
+
+/* Pointers to main arrays in TopTransactionContext */
+typedef struct InvalMessageArray
+{
+ SharedInvalidationMessage *msgs; /* palloc'd array (can be expanded) */
+ int maxmsgs; /* current allocated size of array */
+} InvalMessageArray;
+
+static InvalMessageArray InvalMessageArrays[2];
+
+/* Control information for one logical group of messages */
+typedef struct InvalidationMsgsGroup
+{
+ int firstmsg[2]; /* first index in relevant array */
+ int nextmsg[2]; /* last+1 index */
+} InvalidationMsgsGroup;
+
+/* Macros to help preserve InvalidationMsgsGroup abstraction */
+#define SetSubGroupToFollow(targetgroup, priorgroup, subgroup) \
+ do { \
+ (targetgroup)->firstmsg[subgroup] = \
+ (targetgroup)->nextmsg[subgroup] = \
+ (priorgroup)->nextmsg[subgroup]; \
+ } while (0)
+
+#define SetGroupToFollow(targetgroup, priorgroup) \
+ do { \
+ SetSubGroupToFollow(targetgroup, priorgroup, CatCacheMsgs); \
+ SetSubGroupToFollow(targetgroup, priorgroup, RelCacheMsgs); \
+ } while (0)
+
+#define NumMessagesInSubGroup(group, subgroup) \
+ ((group)->nextmsg[subgroup] - (group)->firstmsg[subgroup])
+
+#define NumMessagesInGroup(group) \
+ (NumMessagesInSubGroup(group, CatCacheMsgs) + \
+ NumMessagesInSubGroup(group, RelCacheMsgs))
+
+
+/*----------------
+ * Invalidation messages are divided into two groups:
+ * 1) events so far in current command, not yet reflected to caches.
+ * 2) events in previous commands of current transaction; these have
+ * been reflected to local caches, and must be either broadcast to
+ * other backends or rolled back from local cache when we commit
+ * or abort the transaction.
+ * Actually, we need such groups for each level of nested transaction,
+ * so that we can discard events from an aborted subtransaction. When
+ * a subtransaction commits, we append its events to the parent's groups.
+ *
+ * The relcache-file-invalidated flag can just be a simple boolean,
+ * since we only act on it at transaction commit; we don't care which
+ * command of the transaction set it.
+ *----------------
+ */
+
+typedef struct TransInvalidationInfo
+{
+ /* Back link to parent transaction's info */
+ struct TransInvalidationInfo *parent;
+
+ /* Subtransaction nesting depth */
+ int my_level;
+
+ /* Events emitted by current command */
+ InvalidationMsgsGroup CurrentCmdInvalidMsgs;
+
+ /* Events emitted by previous commands of this (sub)transaction */
+ InvalidationMsgsGroup PriorCmdInvalidMsgs;
+
+ /* init file must be invalidated? */
+ bool RelcacheInitFileInval;
+} TransInvalidationInfo;
+
+static TransInvalidationInfo *transInvalInfo = NULL;
+
+/* GUC storage */
+int debug_discard_caches = 0;
+
+/*
+ * Dynamically-registered callback functions. Current implementation
+ * assumes there won't be enough of these to justify a dynamically resizable
+ * array; it'd be easy to improve that if needed.
+ *
+ * To avoid searching in CallSyscacheCallbacks, all callbacks for a given
+ * syscache are linked into a list pointed to by syscache_callback_links[id].
+ * The link values are syscache_callback_list[] index plus 1, or 0 for none.
+ */
+
+#define MAX_SYSCACHE_CALLBACKS 64
+#define MAX_RELCACHE_CALLBACKS 10
+
+static struct SYSCACHECALLBACK
+{
+ int16 id; /* cache number */
+ int16 link; /* next callback index+1 for same cache */
+ SyscacheCallbackFunction function;
+ Datum arg;
+} syscache_callback_list[MAX_SYSCACHE_CALLBACKS];
+
+static int16 syscache_callback_links[SysCacheSize];
+
+static int syscache_callback_count = 0;
+
+static struct RELCACHECALLBACK
+{
+ RelcacheCallbackFunction function;
+ Datum arg;
+} relcache_callback_list[MAX_RELCACHE_CALLBACKS];
+
+static int relcache_callback_count = 0;
+
+/* ----------------------------------------------------------------
+ * Invalidation subgroup support functions
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * AddInvalidationMessage
+ * Add an invalidation message to a (sub)group.
+ *
+ * The group must be the last active one, since we assume we can add to the
+ * end of the relevant InvalMessageArray.
+ *
+ * subgroup must be CatCacheMsgs or RelCacheMsgs.
+ */
+static void
+AddInvalidationMessage(InvalidationMsgsGroup *group, int subgroup,
+ const SharedInvalidationMessage *msg)
+{
+ InvalMessageArray *ima = &InvalMessageArrays[subgroup];
+ int nextindex = group->nextmsg[subgroup];
+
+ if (nextindex >= ima->maxmsgs)
+ {
+ if (ima->msgs == NULL)
+ {
+ /* Create new storage array in TopTransactionContext */
+ int reqsize = 32; /* arbitrary */
+
+ ima->msgs = (SharedInvalidationMessage *)
+ MemoryContextAlloc(TopTransactionContext,
+ reqsize * sizeof(SharedInvalidationMessage));
+ ima->maxmsgs = reqsize;
+ Assert(nextindex == 0);
+ }
+ else
+ {
+ /* Enlarge storage array */
+ int reqsize = 2 * ima->maxmsgs;
+
+ ima->msgs = (SharedInvalidationMessage *)
+ repalloc(ima->msgs,
+ reqsize * sizeof(SharedInvalidationMessage));
+ ima->maxmsgs = reqsize;
+ }
+ }
+ /* Okay, add message to current group */
+ ima->msgs[nextindex] = *msg;
+ group->nextmsg[subgroup]++;
+}
+
+/*
+ * Append one subgroup of invalidation messages to another, resetting
+ * the source subgroup to empty.
+ */
+static void
+AppendInvalidationMessageSubGroup(InvalidationMsgsGroup *dest,
+ InvalidationMsgsGroup *src,
+ int subgroup)
+{
+ /* Messages must be adjacent in main array */
+ Assert(dest->nextmsg[subgroup] == src->firstmsg[subgroup]);
+
+ /* ... which makes this easy: */
+ dest->nextmsg[subgroup] = src->nextmsg[subgroup];
+
+ /*
+ * This is handy for some callers and irrelevant for others. But we do it
+ * always, reasoning that it's bad to leave different groups pointing at
+ * the same fragment of the message array.
+ */
+ SetSubGroupToFollow(src, dest, subgroup);
+}
+
+/*
+ * Process a subgroup of invalidation messages.
+ *
+ * This is a macro that executes the given code fragment for each message in
+ * a message subgroup. The fragment should refer to the message as *msg.
+ */
+#define ProcessMessageSubGroup(group, subgroup, codeFragment) \
+ do { \
+ int _msgindex = (group)->firstmsg[subgroup]; \
+ int _endmsg = (group)->nextmsg[subgroup]; \
+ for (; _msgindex < _endmsg; _msgindex++) \
+ { \
+ SharedInvalidationMessage *msg = \
+ &InvalMessageArrays[subgroup].msgs[_msgindex]; \
+ codeFragment; \
+ } \
+ } while (0)
+
+/*
+ * Process a subgroup of invalidation messages as an array.
+ *
+ * As above, but the code fragment can handle an array of messages.
+ * The fragment should refer to the messages as msgs[], with n entries.
+ */
+#define ProcessMessageSubGroupMulti(group, subgroup, codeFragment) \
+ do { \
+ int n = NumMessagesInSubGroup(group, subgroup); \
+ if (n > 0) { \
+ SharedInvalidationMessage *msgs = \
+ &InvalMessageArrays[subgroup].msgs[(group)->firstmsg[subgroup]]; \
+ codeFragment; \
+ } \
+ } while (0)
+
+
+/* ----------------------------------------------------------------
+ * Invalidation group support functions
+ *
+ * These routines understand about the division of a logical invalidation
+ * group into separate physical arrays for catcache and relcache entries.
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * Add a catcache inval entry
+ */
+static void
+AddCatcacheInvalidationMessage(InvalidationMsgsGroup *group,
+ int id, uint32 hashValue, Oid dbId)
+{
+ SharedInvalidationMessage msg;
+
+ Assert(id < CHAR_MAX);
+ msg.cc.id = (int8) id;
+ msg.cc.dbId = dbId;
+ msg.cc.hashValue = hashValue;
+
+ /*
+ * Define padding bytes in SharedInvalidationMessage structs to be
+ * defined. Otherwise the sinvaladt.c ringbuffer, which is accessed by
+ * multiple processes, will cause spurious valgrind warnings about
+ * undefined memory being used. That's because valgrind remembers the
+ * undefined bytes from the last local process's store, not realizing that
+ * another process has written since, filling the previously uninitialized
+ * bytes
+ */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ AddInvalidationMessage(group, CatCacheMsgs, &msg);
+}
+
+/*
+ * Add a whole-catalog inval entry
+ */
+static void
+AddCatalogInvalidationMessage(InvalidationMsgsGroup *group,
+ Oid dbId, Oid catId)
+{
+ SharedInvalidationMessage msg;
+
+ msg.cat.id = SHAREDINVALCATALOG_ID;
+ msg.cat.dbId = dbId;
+ msg.cat.catId = catId;
+ /* check AddCatcacheInvalidationMessage() for an explanation */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ AddInvalidationMessage(group, CatCacheMsgs, &msg);
+}
+
+/*
+ * Add a relcache inval entry
+ */
+static void
+AddRelcacheInvalidationMessage(InvalidationMsgsGroup *group,
+ Oid dbId, Oid relId)
+{
+ SharedInvalidationMessage msg;
+
+ /*
+ * Don't add a duplicate item. We assume dbId need not be checked because
+ * it will never change. InvalidOid for relId means all relations so we
+ * don't need to add individual ones when it is present.
+ */
+ ProcessMessageSubGroup(group, RelCacheMsgs,
+ if (msg->rc.id == SHAREDINVALRELCACHE_ID &&
+ (msg->rc.relId == relId ||
+ msg->rc.relId == InvalidOid))
+ return);
+
+ /* OK, add the item */
+ msg.rc.id = SHAREDINVALRELCACHE_ID;
+ msg.rc.dbId = dbId;
+ msg.rc.relId = relId;
+ /* check AddCatcacheInvalidationMessage() for an explanation */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ AddInvalidationMessage(group, RelCacheMsgs, &msg);
+}
+
+/*
+ * Add a snapshot inval entry
+ *
+ * We put these into the relcache subgroup for simplicity.
+ */
+static void
+AddSnapshotInvalidationMessage(InvalidationMsgsGroup *group,
+ Oid dbId, Oid relId)
+{
+ SharedInvalidationMessage msg;
+
+ /* Don't add a duplicate item */
+ /* We assume dbId need not be checked because it will never change */
+ ProcessMessageSubGroup(group, RelCacheMsgs,
+ if (msg->sn.id == SHAREDINVALSNAPSHOT_ID &&
+ msg->sn.relId == relId)
+ return);
+
+ /* OK, add the item */
+ msg.sn.id = SHAREDINVALSNAPSHOT_ID;
+ msg.sn.dbId = dbId;
+ msg.sn.relId = relId;
+ /* check AddCatcacheInvalidationMessage() for an explanation */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ AddInvalidationMessage(group, RelCacheMsgs, &msg);
+}
+
+/*
+ * Append one group of invalidation messages to another, resetting
+ * the source group to empty.
+ */
+static void
+AppendInvalidationMessages(InvalidationMsgsGroup *dest,
+ InvalidationMsgsGroup *src)
+{
+ AppendInvalidationMessageSubGroup(dest, src, CatCacheMsgs);
+ AppendInvalidationMessageSubGroup(dest, src, RelCacheMsgs);
+}
+
+/*
+ * Execute the given function for all the messages in an invalidation group.
+ * The group is not altered.
+ *
+ * catcache entries are processed first, for reasons mentioned above.
+ */
+static void
+ProcessInvalidationMessages(InvalidationMsgsGroup *group,
+ void (*func) (SharedInvalidationMessage *msg))
+{
+ ProcessMessageSubGroup(group, CatCacheMsgs, func(msg));
+ ProcessMessageSubGroup(group, RelCacheMsgs, func(msg));
+}
+
+/*
+ * As above, but the function is able to process an array of messages
+ * rather than just one at a time.
+ */
+static void
+ProcessInvalidationMessagesMulti(InvalidationMsgsGroup *group,
+ void (*func) (const SharedInvalidationMessage *msgs, int n))
+{
+ ProcessMessageSubGroupMulti(group, CatCacheMsgs, func(msgs, n));
+ ProcessMessageSubGroupMulti(group, RelCacheMsgs, func(msgs, n));
+}
+
+/* ----------------------------------------------------------------
+ * private support functions
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * RegisterCatcacheInvalidation
+ *
+ * Register an invalidation event for a catcache tuple entry.
+ */
+static void
+RegisterCatcacheInvalidation(int cacheId,
+ uint32 hashValue,
+ Oid dbId)
+{
+ AddCatcacheInvalidationMessage(&transInvalInfo->CurrentCmdInvalidMsgs,
+ cacheId, hashValue, dbId);
+}
+
+/*
+ * RegisterCatalogInvalidation
+ *
+ * Register an invalidation event for all catcache entries from a catalog.
+ */
+static void
+RegisterCatalogInvalidation(Oid dbId, Oid catId)
+{
+ AddCatalogInvalidationMessage(&transInvalInfo->CurrentCmdInvalidMsgs,
+ dbId, catId);
+}
+
+/*
+ * RegisterRelcacheInvalidation
+ *
+ * As above, but register a relcache invalidation event.
+ */
+static void
+RegisterRelcacheInvalidation(Oid dbId, Oid relId)
+{
+ AddRelcacheInvalidationMessage(&transInvalInfo->CurrentCmdInvalidMsgs,
+ dbId, relId);
+
+ /*
+ * Most of the time, relcache invalidation is associated with system
+ * catalog updates, but there are a few cases where it isn't. Quick hack
+ * to ensure that the next CommandCounterIncrement() will think that we
+ * need to do CommandEndInvalidationMessages().
+ */
+ (void) GetCurrentCommandId(true);
+
+ /*
+ * If the relation being invalidated is one of those cached in a relcache
+ * init file, mark that we need to zap that file at commit. For simplicity
+ * invalidations for a specific database always invalidate the shared file
+ * as well. Also zap when we are invalidating whole relcache.
+ */
+ if (relId == InvalidOid || RelationIdIsInInitFile(relId))
+ transInvalInfo->RelcacheInitFileInval = true;
+}
+
+/*
+ * RegisterSnapshotInvalidation
+ *
+ * Register an invalidation event for MVCC scans against a given catalog.
+ * Only needed for catalogs that don't have catcaches.
+ */
+static void
+RegisterSnapshotInvalidation(Oid dbId, Oid relId)
+{
+ AddSnapshotInvalidationMessage(&transInvalInfo->CurrentCmdInvalidMsgs,
+ dbId, relId);
+}
+
+/*
+ * LocalExecuteInvalidationMessage
+ *
+ * Process a single invalidation message (which could be of any type).
+ * Only the local caches are flushed; this does not transmit the message
+ * to other backends.
+ */
+void
+LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg)
+{
+ if (msg->id >= 0)
+ {
+ if (msg->cc.dbId == MyDatabaseId || msg->cc.dbId == InvalidOid)
+ {
+ InvalidateCatalogSnapshot();
+
+ SysCacheInvalidate(msg->cc.id, msg->cc.hashValue);
+
+ CallSyscacheCallbacks(msg->cc.id, msg->cc.hashValue);
+ }
+ }
+ else if (msg->id == SHAREDINVALCATALOG_ID)
+ {
+ if (msg->cat.dbId == MyDatabaseId || msg->cat.dbId == InvalidOid)
+ {
+ InvalidateCatalogSnapshot();
+
+ CatalogCacheFlushCatalog(msg->cat.catId);
+
+ /* CatalogCacheFlushCatalog calls CallSyscacheCallbacks as needed */
+ }
+ }
+ else if (msg->id == SHAREDINVALRELCACHE_ID)
+ {
+ if (msg->rc.dbId == MyDatabaseId || msg->rc.dbId == InvalidOid)
+ {
+ int i;
+
+ if (msg->rc.relId == InvalidOid)
+ RelationCacheInvalidate(false);
+ else
+ RelationCacheInvalidateEntry(msg->rc.relId);
+
+ for (i = 0; i < relcache_callback_count; i++)
+ {
+ struct RELCACHECALLBACK *ccitem = relcache_callback_list + i;
+
+ ccitem->function(ccitem->arg, msg->rc.relId);
+ }
+ }
+ }
+ else if (msg->id == SHAREDINVALSMGR_ID)
+ {
+ /*
+ * We could have smgr entries for relations of other databases, so no
+ * short-circuit test is possible here.
+ */
+ RelFileNodeBackend rnode;
+
+ rnode.node = msg->sm.rnode;
+ rnode.backend = (msg->sm.backend_hi << 16) | (int) msg->sm.backend_lo;
+ smgrclosenode(rnode);
+ }
+ else if (msg->id == SHAREDINVALRELMAP_ID)
+ {
+ /* We only care about our own database and shared catalogs */
+ if (msg->rm.dbId == InvalidOid)
+ RelationMapInvalidate(true);
+ else if (msg->rm.dbId == MyDatabaseId)
+ RelationMapInvalidate(false);
+ }
+ else if (msg->id == SHAREDINVALSNAPSHOT_ID)
+ {
+ /* We only care about our own database and shared catalogs */
+ if (msg->sn.dbId == InvalidOid)
+ InvalidateCatalogSnapshot();
+ else if (msg->sn.dbId == MyDatabaseId)
+ InvalidateCatalogSnapshot();
+ }
+ else
+ elog(FATAL, "unrecognized SI message ID: %d", msg->id);
+}
+
+/*
+ * InvalidateSystemCaches
+ *
+ * This blows away all tuples in the system catalog caches and
+ * all the cached relation descriptors and smgr cache entries.
+ * Relation descriptors that have positive refcounts are then rebuilt.
+ *
+ * We call this when we see a shared-inval-queue overflow signal,
+ * since that tells us we've lost some shared-inval messages and hence
+ * don't know what needs to be invalidated.
+ */
+void
+InvalidateSystemCaches(void)
+{
+ InvalidateSystemCachesExtended(false);
+}
+
+void
+InvalidateSystemCachesExtended(bool debug_discard)
+{
+ int i;
+
+ InvalidateCatalogSnapshot();
+ ResetCatalogCaches();
+ RelationCacheInvalidate(debug_discard); /* gets smgr and relmap too */
+
+ for (i = 0; i < syscache_callback_count; i++)
+ {
+ struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i;
+
+ ccitem->function(ccitem->arg, ccitem->id, 0);
+ }
+
+ for (i = 0; i < relcache_callback_count; i++)
+ {
+ struct RELCACHECALLBACK *ccitem = relcache_callback_list + i;
+
+ ccitem->function(ccitem->arg, InvalidOid);
+ }
+}
+
+
+/* ----------------------------------------------------------------
+ * public functions
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * AcceptInvalidationMessages
+ * Read and process invalidation messages from the shared invalidation
+ * message queue.
+ *
+ * Note:
+ * This should be called as the first step in processing a transaction.
+ */
+void
+AcceptInvalidationMessages(void)
+{
+ ReceiveSharedInvalidMessages(LocalExecuteInvalidationMessage,
+ InvalidateSystemCaches);
+
+ /*----------
+ * Test code to force cache flushes anytime a flush could happen.
+ *
+ * This helps detect intermittent faults caused by code that reads a cache
+ * entry and then performs an action that could invalidate the entry, but
+ * rarely actually does so. This can spot issues that would otherwise
+ * only arise with badly timed concurrent DDL, for example.
+ *
+ * The default debug_discard_caches = 0 does no forced cache flushes.
+ *
+ * If used with CLOBBER_FREED_MEMORY,
+ * debug_discard_caches = 1 (formerly known as CLOBBER_CACHE_ALWAYS)
+ * provides a fairly thorough test that the system contains no cache-flush
+ * hazards. However, it also makes the system unbelievably slow --- the
+ * regression tests take about 100 times longer than normal.
+ *
+ * If you're a glutton for punishment, try
+ * debug_discard_caches = 3 (formerly known as CLOBBER_CACHE_RECURSIVELY).
+ * This slows things by at least a factor of 10000, so I wouldn't suggest
+ * trying to run the entire regression tests that way. It's useful to try
+ * a few simple tests, to make sure that cache reload isn't subject to
+ * internal cache-flush hazards, but after you've done a few thousand
+ * recursive reloads it's unlikely you'll learn more.
+ *----------
+ */
+#ifdef DISCARD_CACHES_ENABLED
+ {
+ static int recursion_depth = 0;
+
+ if (recursion_depth < debug_discard_caches)
+ {
+ recursion_depth++;
+ InvalidateSystemCachesExtended(true);
+ recursion_depth--;
+ }
+ }
+#endif
+}
+
+/*
+ * PrepareInvalidationState
+ * Initialize inval data for the current (sub)transaction.
+ */
+static void
+PrepareInvalidationState(void)
+{
+ TransInvalidationInfo *myInfo;
+
+ if (transInvalInfo != NULL &&
+ transInvalInfo->my_level == GetCurrentTransactionNestLevel())
+ return;
+
+ myInfo = (TransInvalidationInfo *)
+ MemoryContextAllocZero(TopTransactionContext,
+ sizeof(TransInvalidationInfo));
+ myInfo->parent = transInvalInfo;
+ myInfo->my_level = GetCurrentTransactionNestLevel();
+
+ /* Now, do we have a previous stack entry? */
+ if (transInvalInfo != NULL)
+ {
+ /* Yes; this one should be for a deeper nesting level. */
+ Assert(myInfo->my_level > transInvalInfo->my_level);
+
+ /*
+ * The parent (sub)transaction must not have any current (i.e.,
+ * not-yet-locally-processed) messages. If it did, we'd have a
+ * semantic problem: the new subtransaction presumably ought not be
+ * able to see those events yet, but since the CommandCounter is
+ * linear, that can't work once the subtransaction advances the
+ * counter. This is a convenient place to check for that, as well as
+ * being important to keep management of the message arrays simple.
+ */
+ if (NumMessagesInGroup(&transInvalInfo->CurrentCmdInvalidMsgs) != 0)
+ elog(ERROR, "cannot start a subtransaction when there are unprocessed inval messages");
+
+ /*
+ * MemoryContextAllocZero set firstmsg = nextmsg = 0 in each group,
+ * which is fine for the first (sub)transaction, but otherwise we need
+ * to update them to follow whatever is already in the arrays.
+ */
+ SetGroupToFollow(&myInfo->PriorCmdInvalidMsgs,
+ &transInvalInfo->CurrentCmdInvalidMsgs);
+ SetGroupToFollow(&myInfo->CurrentCmdInvalidMsgs,
+ &myInfo->PriorCmdInvalidMsgs);
+ }
+ else
+ {
+ /*
+ * Here, we need only clear any array pointers left over from a prior
+ * transaction.
+ */
+ InvalMessageArrays[CatCacheMsgs].msgs = NULL;
+ InvalMessageArrays[CatCacheMsgs].maxmsgs = 0;
+ InvalMessageArrays[RelCacheMsgs].msgs = NULL;
+ InvalMessageArrays[RelCacheMsgs].maxmsgs = 0;
+ }
+
+ transInvalInfo = myInfo;
+}
+
+/*
+ * PostPrepare_Inval
+ * Clean up after successful PREPARE.
+ *
+ * Here, we want to act as though the transaction aborted, so that we will
+ * undo any syscache changes it made, thereby bringing us into sync with the
+ * outside world, which doesn't believe the transaction committed yet.
+ *
+ * If the prepared transaction is later aborted, there is nothing more to
+ * do; if it commits, we will receive the consequent inval messages just
+ * like everyone else.
+ */
+void
+PostPrepare_Inval(void)
+{
+ AtEOXact_Inval(false);
+}
+
+/*
+ * xactGetCommittedInvalidationMessages() is called by
+ * RecordTransactionCommit() to collect invalidation messages to add to the
+ * commit record. This applies only to commit message types, never to
+ * abort records. Must always run before AtEOXact_Inval(), since that
+ * removes the data we need to see.
+ *
+ * Remember that this runs before we have officially committed, so we
+ * must not do anything here to change what might occur *if* we should
+ * fail between here and the actual commit.
+ *
+ * see also xact_redo_commit() and xact_desc_commit()
+ */
+int
+xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs,
+ bool *RelcacheInitFileInval)
+{
+ SharedInvalidationMessage *msgarray;
+ int nummsgs;
+ int nmsgs;
+
+ /* Quick exit if we haven't done anything with invalidation messages. */
+ if (transInvalInfo == NULL)
+ {
+ *RelcacheInitFileInval = false;
+ *msgs = NULL;
+ return 0;
+ }
+
+ /* Must be at top of stack */
+ Assert(transInvalInfo->my_level == 1 && transInvalInfo->parent == NULL);
+
+ /*
+ * Relcache init file invalidation requires processing both before and
+ * after we send the SI messages. However, we need not do anything unless
+ * we committed.
+ */
+ *RelcacheInitFileInval = transInvalInfo->RelcacheInitFileInval;
+
+ /*
+ * Collect all the pending messages into a single contiguous array of
+ * invalidation messages, to simplify what needs to happen while building
+ * the commit WAL message. Maintain the order that they would be
+ * processed in by AtEOXact_Inval(), to ensure emulated behaviour in redo
+ * is as similar as possible to original. We want the same bugs, if any,
+ * not new ones.
+ */
+ nummsgs = NumMessagesInGroup(&transInvalInfo->PriorCmdInvalidMsgs) +
+ NumMessagesInGroup(&transInvalInfo->CurrentCmdInvalidMsgs);
+
+ *msgs = msgarray = (SharedInvalidationMessage *)
+ MemoryContextAlloc(CurTransactionContext,
+ nummsgs * sizeof(SharedInvalidationMessage));
+
+ nmsgs = 0;
+ ProcessMessageSubGroupMulti(&transInvalInfo->PriorCmdInvalidMsgs,
+ CatCacheMsgs,
+ (memcpy(msgarray + nmsgs,
+ msgs,
+ n * sizeof(SharedInvalidationMessage)),
+ nmsgs += n));
+ ProcessMessageSubGroupMulti(&transInvalInfo->CurrentCmdInvalidMsgs,
+ CatCacheMsgs,
+ (memcpy(msgarray + nmsgs,
+ msgs,
+ n * sizeof(SharedInvalidationMessage)),
+ nmsgs += n));
+ ProcessMessageSubGroupMulti(&transInvalInfo->PriorCmdInvalidMsgs,
+ RelCacheMsgs,
+ (memcpy(msgarray + nmsgs,
+ msgs,
+ n * sizeof(SharedInvalidationMessage)),
+ nmsgs += n));
+ ProcessMessageSubGroupMulti(&transInvalInfo->CurrentCmdInvalidMsgs,
+ RelCacheMsgs,
+ (memcpy(msgarray + nmsgs,
+ msgs,
+ n * sizeof(SharedInvalidationMessage)),
+ nmsgs += n));
+ Assert(nmsgs == nummsgs);
+
+ return nmsgs;
+}
+
+/*
+ * ProcessCommittedInvalidationMessages is executed by xact_redo_commit() or
+ * standby_redo() to process invalidation messages. Currently that happens
+ * only at end-of-xact.
+ *
+ * Relcache init file invalidation requires processing both
+ * before and after we send the SI messages. See AtEOXact_Inval()
+ */
+void
+ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs,
+ int nmsgs, bool RelcacheInitFileInval,
+ Oid dbid, Oid tsid)
+{
+ if (nmsgs <= 0)
+ return;
+
+ elog(trace_recovery(DEBUG4), "replaying commit with %d messages%s", nmsgs,
+ (RelcacheInitFileInval ? " and relcache file invalidation" : ""));
+
+ if (RelcacheInitFileInval)
+ {
+ elog(trace_recovery(DEBUG4), "removing relcache init files for database %u",
+ dbid);
+
+ /*
+ * RelationCacheInitFilePreInvalidate, when the invalidation message
+ * is for a specific database, requires DatabasePath to be set, but we
+ * should not use SetDatabasePath during recovery, since it is
+ * intended to be used only once by normal backends. Hence, a quick
+ * hack: set DatabasePath directly then unset after use.
+ */
+ if (OidIsValid(dbid))
+ DatabasePath = GetDatabasePath(dbid, tsid);
+
+ RelationCacheInitFilePreInvalidate();
+
+ if (OidIsValid(dbid))
+ {
+ pfree(DatabasePath);
+ DatabasePath = NULL;
+ }
+ }
+
+ SendSharedInvalidMessages(msgs, nmsgs);
+
+ if (RelcacheInitFileInval)
+ RelationCacheInitFilePostInvalidate();
+}
+
+/*
+ * AtEOXact_Inval
+ * Process queued-up invalidation messages at end of main transaction.
+ *
+ * If isCommit, we must send out the messages in our PriorCmdInvalidMsgs list
+ * to the shared invalidation message queue. Note that these will be read
+ * not only by other backends, but also by our own backend at the next
+ * transaction start (via AcceptInvalidationMessages). This means that
+ * we can skip immediate local processing of anything that's still in
+ * CurrentCmdInvalidMsgs, and just send that list out too.
+ *
+ * If not isCommit, we are aborting, and must locally process the messages
+ * in PriorCmdInvalidMsgs. No messages need be sent to other backends,
+ * since they'll not have seen our changed tuples anyway. We can forget
+ * about CurrentCmdInvalidMsgs too, since those changes haven't touched
+ * the caches yet.
+ *
+ * In any case, reset our state to empty. We need not physically
+ * free memory here, since TopTransactionContext is about to be emptied
+ * anyway.
+ *
+ * Note:
+ * This should be called as the last step in processing a transaction.
+ */
+void
+AtEOXact_Inval(bool isCommit)
+{
+ /* Quick exit if no messages */
+ if (transInvalInfo == NULL)
+ return;
+
+ /* Must be at top of stack */
+ Assert(transInvalInfo->my_level == 1 && transInvalInfo->parent == NULL);
+
+ if (isCommit)
+ {
+ /*
+ * Relcache init file invalidation requires processing both before and
+ * after we send the SI messages. However, we need not do anything
+ * unless we committed.
+ */
+ if (transInvalInfo->RelcacheInitFileInval)
+ RelationCacheInitFilePreInvalidate();
+
+ AppendInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
+ &transInvalInfo->CurrentCmdInvalidMsgs);
+
+ ProcessInvalidationMessagesMulti(&transInvalInfo->PriorCmdInvalidMsgs,
+ SendSharedInvalidMessages);
+
+ if (transInvalInfo->RelcacheInitFileInval)
+ RelationCacheInitFilePostInvalidate();
+ }
+ else
+ {
+ ProcessInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
+ LocalExecuteInvalidationMessage);
+ }
+
+ /* Need not free anything explicitly */
+ transInvalInfo = NULL;
+}
+
+/*
+ * AtEOSubXact_Inval
+ * Process queued-up invalidation messages at end of subtransaction.
+ *
+ * If isCommit, process CurrentCmdInvalidMsgs if any (there probably aren't),
+ * and then attach both CurrentCmdInvalidMsgs and PriorCmdInvalidMsgs to the
+ * parent's PriorCmdInvalidMsgs list.
+ *
+ * If not isCommit, we are aborting, and must locally process the messages
+ * in PriorCmdInvalidMsgs. No messages need be sent to other backends.
+ * We can forget about CurrentCmdInvalidMsgs too, since those changes haven't
+ * touched the caches yet.
+ *
+ * In any case, pop the transaction stack. We need not physically free memory
+ * here, since CurTransactionContext is about to be emptied anyway
+ * (if aborting). Beware of the possibility of aborting the same nesting
+ * level twice, though.
+ */
+void
+AtEOSubXact_Inval(bool isCommit)
+{
+ int my_level;
+ TransInvalidationInfo *myInfo = transInvalInfo;
+
+ /* Quick exit if no messages. */
+ if (myInfo == NULL)
+ return;
+
+ /* Also bail out quickly if messages are not for this level. */
+ my_level = GetCurrentTransactionNestLevel();
+ if (myInfo->my_level != my_level)
+ {
+ Assert(myInfo->my_level < my_level);
+ return;
+ }
+
+ if (isCommit)
+ {
+ /* If CurrentCmdInvalidMsgs still has anything, fix it */
+ CommandEndInvalidationMessages();
+
+ /*
+ * We create invalidation stack entries lazily, so the parent might
+ * not have one. Instead of creating one, moving all the data over,
+ * and then freeing our own, we can just adjust the level of our own
+ * entry.
+ */
+ if (myInfo->parent == NULL || myInfo->parent->my_level < my_level - 1)
+ {
+ myInfo->my_level--;
+ return;
+ }
+
+ /*
+ * Pass up my inval messages to parent. Notice that we stick them in
+ * PriorCmdInvalidMsgs, not CurrentCmdInvalidMsgs, since they've
+ * already been locally processed. (This would trigger the Assert in
+ * AppendInvalidationMessageSubGroup if the parent's
+ * CurrentCmdInvalidMsgs isn't empty; but we already checked that in
+ * PrepareInvalidationState.)
+ */
+ AppendInvalidationMessages(&myInfo->parent->PriorCmdInvalidMsgs,
+ &myInfo->PriorCmdInvalidMsgs);
+
+ /* Must readjust parent's CurrentCmdInvalidMsgs indexes now */
+ SetGroupToFollow(&myInfo->parent->CurrentCmdInvalidMsgs,
+ &myInfo->parent->PriorCmdInvalidMsgs);
+
+ /* Pending relcache inval becomes parent's problem too */
+ if (myInfo->RelcacheInitFileInval)
+ myInfo->parent->RelcacheInitFileInval = true;
+
+ /* Pop the transaction state stack */
+ transInvalInfo = myInfo->parent;
+
+ /* Need not free anything else explicitly */
+ pfree(myInfo);
+ }
+ else
+ {
+ ProcessInvalidationMessages(&myInfo->PriorCmdInvalidMsgs,
+ LocalExecuteInvalidationMessage);
+
+ /* Pop the transaction state stack */
+ transInvalInfo = myInfo->parent;
+
+ /* Need not free anything else explicitly */
+ pfree(myInfo);
+ }
+}
+
+/*
+ * CommandEndInvalidationMessages
+ * Process queued-up invalidation messages at end of one command
+ * in a transaction.
+ *
+ * Here, we send no messages to the shared queue, since we don't know yet if
+ * we will commit. We do need to locally process the CurrentCmdInvalidMsgs
+ * list, so as to flush our caches of any entries we have outdated in the
+ * current command. We then move the current-cmd list over to become part
+ * of the prior-cmds list.
+ *
+ * Note:
+ * This should be called during CommandCounterIncrement(),
+ * after we have advanced the command ID.
+ */
+void
+CommandEndInvalidationMessages(void)
+{
+ /*
+ * You might think this shouldn't be called outside any transaction, but
+ * bootstrap does it, and also ABORT issued when not in a transaction. So
+ * just quietly return if no state to work on.
+ */
+ if (transInvalInfo == NULL)
+ return;
+
+ ProcessInvalidationMessages(&transInvalInfo->CurrentCmdInvalidMsgs,
+ LocalExecuteInvalidationMessage);
+
+ /* WAL Log per-command invalidation messages for wal_level=logical */
+ if (XLogLogicalInfoActive())
+ LogLogicalInvalidations();
+
+ AppendInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
+ &transInvalInfo->CurrentCmdInvalidMsgs);
+}
+
+
+/*
+ * CacheInvalidateHeapTuple
+ * Register the given tuple for invalidation at end of command
+ * (ie, current command is creating or outdating this tuple).
+ * Also, detect whether a relcache invalidation is implied.
+ *
+ * For an insert or delete, tuple is the target tuple and newtuple is NULL.
+ * For an update, we are called just once, with tuple being the old tuple
+ * version and newtuple the new version. This allows avoidance of duplicate
+ * effort during an update.
+ */
+void
+CacheInvalidateHeapTuple(Relation relation,
+ HeapTuple tuple,
+ HeapTuple newtuple)
+{
+ Oid tupleRelId;
+ Oid databaseId;
+ Oid relationId;
+
+ /* Do nothing during bootstrap */
+ if (IsBootstrapProcessingMode())
+ return;
+
+ /*
+ * We only need to worry about invalidation for tuples that are in system
+ * catalogs; user-relation tuples are never in catcaches and can't affect
+ * the relcache either.
+ */
+ if (!IsCatalogRelation(relation))
+ return;
+
+ /*
+ * IsCatalogRelation() will return true for TOAST tables of system
+ * catalogs, but we don't care about those, either.
+ */
+ if (IsToastRelation(relation))
+ return;
+
+ /*
+ * If we're not prepared to queue invalidation messages for this
+ * subtransaction level, get ready now.
+ */
+ PrepareInvalidationState();
+
+ /*
+ * First let the catcache do its thing
+ */
+ tupleRelId = RelationGetRelid(relation);
+ if (RelationInvalidatesSnapshotsOnly(tupleRelId))
+ {
+ databaseId = IsSharedRelation(tupleRelId) ? InvalidOid : MyDatabaseId;
+ RegisterSnapshotInvalidation(databaseId, tupleRelId);
+ }
+ else
+ PrepareToInvalidateCacheTuple(relation, tuple, newtuple,
+ RegisterCatcacheInvalidation);
+
+ /*
+ * Now, is this tuple one of the primary definers of a relcache entry? See
+ * comments in file header for deeper explanation.
+ *
+ * Note we ignore newtuple here; we assume an update cannot move a tuple
+ * from being part of one relcache entry to being part of another.
+ */
+ if (tupleRelId == RelationRelationId)
+ {
+ Form_pg_class classtup = (Form_pg_class) GETSTRUCT(tuple);
+
+ relationId = classtup->oid;
+ if (classtup->relisshared)
+ databaseId = InvalidOid;
+ else
+ databaseId = MyDatabaseId;
+ }
+ else if (tupleRelId == AttributeRelationId)
+ {
+ Form_pg_attribute atttup = (Form_pg_attribute) GETSTRUCT(tuple);
+
+ relationId = atttup->attrelid;
+
+ /*
+ * KLUGE ALERT: we always send the relcache event with MyDatabaseId,
+ * even if the rel in question is shared (which we can't easily tell).
+ * This essentially means that only backends in this same database
+ * will react to the relcache flush request. This is in fact
+ * appropriate, since only those backends could see our pg_attribute
+ * change anyway. It looks a bit ugly though. (In practice, shared
+ * relations can't have schema changes after bootstrap, so we should
+ * never come here for a shared rel anyway.)
+ */
+ databaseId = MyDatabaseId;
+ }
+ else if (tupleRelId == IndexRelationId)
+ {
+ Form_pg_index indextup = (Form_pg_index) GETSTRUCT(tuple);
+
+ /*
+ * When a pg_index row is updated, we should send out a relcache inval
+ * for the index relation. As above, we don't know the shared status
+ * of the index, but in practice it doesn't matter since indexes of
+ * shared catalogs can't have such updates.
+ */
+ relationId = indextup->indexrelid;
+ databaseId = MyDatabaseId;
+ }
+ else if (tupleRelId == ConstraintRelationId)
+ {
+ Form_pg_constraint constrtup = (Form_pg_constraint) GETSTRUCT(tuple);
+
+ /*
+ * Foreign keys are part of relcache entries, too, so send out an
+ * inval for the table that the FK applies to.
+ */
+ if (constrtup->contype == CONSTRAINT_FOREIGN &&
+ OidIsValid(constrtup->conrelid))
+ {
+ relationId = constrtup->conrelid;
+ databaseId = MyDatabaseId;
+ }
+ else
+ return;
+ }
+ else
+ return;
+
+ /*
+ * Yes. We need to register a relcache invalidation event.
+ */
+ RegisterRelcacheInvalidation(databaseId, relationId);
+}
+
+/*
+ * CacheInvalidateCatalog
+ * Register invalidation of the whole content of a system catalog.
+ *
+ * This is normally used in VACUUM FULL/CLUSTER, where we haven't so much
+ * changed any tuples as moved them around. Some uses of catcache entries
+ * expect their TIDs to be correct, so we have to blow away the entries.
+ *
+ * Note: we expect caller to verify that the rel actually is a system
+ * catalog. If it isn't, no great harm is done, just a wasted sinval message.
+ */
+void
+CacheInvalidateCatalog(Oid catalogId)
+{
+ Oid databaseId;
+
+ PrepareInvalidationState();
+
+ if (IsSharedRelation(catalogId))
+ databaseId = InvalidOid;
+ else
+ databaseId = MyDatabaseId;
+
+ RegisterCatalogInvalidation(databaseId, catalogId);
+}
+
+/*
+ * CacheInvalidateRelcache
+ * Register invalidation of the specified relation's relcache entry
+ * at end of command.
+ *
+ * This is used in places that need to force relcache rebuild but aren't
+ * changing any of the tuples recognized as contributors to the relcache
+ * entry by CacheInvalidateHeapTuple. (An example is dropping an index.)
+ */
+void
+CacheInvalidateRelcache(Relation relation)
+{
+ Oid databaseId;
+ Oid relationId;
+
+ PrepareInvalidationState();
+
+ relationId = RelationGetRelid(relation);
+ if (relation->rd_rel->relisshared)
+ databaseId = InvalidOid;
+ else
+ databaseId = MyDatabaseId;
+
+ RegisterRelcacheInvalidation(databaseId, relationId);
+}
+
+/*
+ * CacheInvalidateRelcacheAll
+ * Register invalidation of the whole relcache at the end of command.
+ *
+ * This is used by alter publication as changes in publications may affect
+ * large number of tables.
+ */
+void
+CacheInvalidateRelcacheAll(void)
+{
+ PrepareInvalidationState();
+
+ RegisterRelcacheInvalidation(InvalidOid, InvalidOid);
+}
+
+/*
+ * CacheInvalidateRelcacheByTuple
+ * As above, but relation is identified by passing its pg_class tuple.
+ */
+void
+CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
+{
+ Form_pg_class classtup = (Form_pg_class) GETSTRUCT(classTuple);
+ Oid databaseId;
+ Oid relationId;
+
+ PrepareInvalidationState();
+
+ relationId = classtup->oid;
+ if (classtup->relisshared)
+ databaseId = InvalidOid;
+ else
+ databaseId = MyDatabaseId;
+ RegisterRelcacheInvalidation(databaseId, relationId);
+}
+
+/*
+ * CacheInvalidateRelcacheByRelid
+ * As above, but relation is identified by passing its OID.
+ * This is the least efficient of the three options; use one of
+ * the above routines if you have a Relation or pg_class tuple.
+ */
+void
+CacheInvalidateRelcacheByRelid(Oid relid)
+{
+ HeapTuple tup;
+
+ PrepareInvalidationState();
+
+ tup = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ CacheInvalidateRelcacheByTuple(tup);
+ ReleaseSysCache(tup);
+}
+
+
+/*
+ * CacheInvalidateSmgr
+ * Register invalidation of smgr references to a physical relation.
+ *
+ * Sending this type of invalidation msg forces other backends to close open
+ * smgr entries for the rel. This should be done to flush dangling open-file
+ * references when the physical rel is being dropped or truncated. Because
+ * these are nontransactional (i.e., not-rollback-able) operations, we just
+ * send the inval message immediately without any queuing.
+ *
+ * Note: in most cases there will have been a relcache flush issued against
+ * the rel at the logical level. We need a separate smgr-level flush because
+ * it is possible for backends to have open smgr entries for rels they don't
+ * have a relcache entry for, e.g. because the only thing they ever did with
+ * the rel is write out dirty shared buffers.
+ *
+ * Note: because these messages are nontransactional, they won't be captured
+ * in commit/abort WAL entries. Instead, calls to CacheInvalidateSmgr()
+ * should happen in low-level smgr.c routines, which are executed while
+ * replaying WAL as well as when creating it.
+ *
+ * Note: In order to avoid bloating SharedInvalidationMessage, we store only
+ * three bytes of the backend ID using what would otherwise be padding space.
+ * Thus, the maximum possible backend ID is 2^23-1.
+ */
+void
+CacheInvalidateSmgr(RelFileNodeBackend rnode)
+{
+ SharedInvalidationMessage msg;
+
+ msg.sm.id = SHAREDINVALSMGR_ID;
+ msg.sm.backend_hi = rnode.backend >> 16;
+ msg.sm.backend_lo = rnode.backend & 0xffff;
+ msg.sm.rnode = rnode.node;
+ /* check AddCatcacheInvalidationMessage() for an explanation */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ SendSharedInvalidMessages(&msg, 1);
+}
+
+/*
+ * CacheInvalidateRelmap
+ * Register invalidation of the relation mapping for a database,
+ * or for the shared catalogs if databaseId is zero.
+ *
+ * Sending this type of invalidation msg forces other backends to re-read
+ * the indicated relation mapping file. It is also necessary to send a
+ * relcache inval for the specific relations whose mapping has been altered,
+ * else the relcache won't get updated with the new filenode data.
+ *
+ * Note: because these messages are nontransactional, they won't be captured
+ * in commit/abort WAL entries. Instead, calls to CacheInvalidateRelmap()
+ * should happen in low-level relmapper.c routines, which are executed while
+ * replaying WAL as well as when creating it.
+ */
+void
+CacheInvalidateRelmap(Oid databaseId)
+{
+ SharedInvalidationMessage msg;
+
+ msg.rm.id = SHAREDINVALRELMAP_ID;
+ msg.rm.dbId = databaseId;
+ /* check AddCatcacheInvalidationMessage() for an explanation */
+ VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
+
+ SendSharedInvalidMessages(&msg, 1);
+}
+
+
+/*
+ * CacheRegisterSyscacheCallback
+ * Register the specified function to be called for all future
+ * invalidation events in the specified cache. The cache ID and the
+ * hash value of the tuple being invalidated will be passed to the
+ * function.
+ *
+ * NOTE: Hash value zero will be passed if a cache reset request is received.
+ * In this case the called routines should flush all cached state.
+ * Yes, there's a possibility of a false match to zero, but it doesn't seem
+ * worth troubling over, especially since most of the current callees just
+ * flush all cached state anyway.
+ */
+void
+CacheRegisterSyscacheCallback(int cacheid,
+ SyscacheCallbackFunction func,
+ Datum arg)
+{
+ if (cacheid < 0 || cacheid >= SysCacheSize)
+ elog(FATAL, "invalid cache ID: %d", cacheid);
+ if (syscache_callback_count >= MAX_SYSCACHE_CALLBACKS)
+ elog(FATAL, "out of syscache_callback_list slots");
+
+ if (syscache_callback_links[cacheid] == 0)
+ {
+ /* first callback for this cache */
+ syscache_callback_links[cacheid] = syscache_callback_count + 1;
+ }
+ else
+ {
+ /* add to end of chain, so that older callbacks are called first */
+ int i = syscache_callback_links[cacheid] - 1;
+
+ while (syscache_callback_list[i].link > 0)
+ i = syscache_callback_list[i].link - 1;
+ syscache_callback_list[i].link = syscache_callback_count + 1;
+ }
+
+ syscache_callback_list[syscache_callback_count].id = cacheid;
+ syscache_callback_list[syscache_callback_count].link = 0;
+ syscache_callback_list[syscache_callback_count].function = func;
+ syscache_callback_list[syscache_callback_count].arg = arg;
+
+ ++syscache_callback_count;
+}
+
+/*
+ * CacheRegisterRelcacheCallback
+ * Register the specified function to be called for all future
+ * relcache invalidation events. The OID of the relation being
+ * invalidated will be passed to the function.
+ *
+ * NOTE: InvalidOid will be passed if a cache reset request is received.
+ * In this case the called routines should flush all cached state.
+ */
+void
+CacheRegisterRelcacheCallback(RelcacheCallbackFunction func,
+ Datum arg)
+{
+ if (relcache_callback_count >= MAX_RELCACHE_CALLBACKS)
+ elog(FATAL, "out of relcache_callback_list slots");
+
+ relcache_callback_list[relcache_callback_count].function = func;
+ relcache_callback_list[relcache_callback_count].arg = arg;
+
+ ++relcache_callback_count;
+}
+
+/*
+ * CallSyscacheCallbacks
+ *
+ * This is exported so that CatalogCacheFlushCatalog can call it, saving
+ * this module from knowing which catcache IDs correspond to which catalogs.
+ */
+void
+CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
+{
+ int i;
+
+ if (cacheid < 0 || cacheid >= SysCacheSize)
+ elog(ERROR, "invalid cache ID: %d", cacheid);
+
+ i = syscache_callback_links[cacheid] - 1;
+ while (i >= 0)
+ {
+ struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i;
+
+ Assert(ccitem->id == cacheid);
+ ccitem->function(ccitem->arg, cacheid, hashvalue);
+ i = ccitem->link - 1;
+ }
+}
+
+/*
+ * LogLogicalInvalidations
+ *
+ * Emit WAL for invalidations caused by the current command.
+ *
+ * This is currently only used for logging invalidations at the command end
+ * or at commit time if any invalidations are pending.
+ */
+void
+LogLogicalInvalidations(void)
+{
+ xl_xact_invals xlrec;
+ InvalidationMsgsGroup *group;
+ int nmsgs;
+
+ /* Quick exit if we haven't done anything with invalidation messages. */
+ if (transInvalInfo == NULL)
+ return;
+
+ group = &transInvalInfo->CurrentCmdInvalidMsgs;
+ nmsgs = NumMessagesInGroup(group);
+
+ if (nmsgs > 0)
+ {
+ /* prepare record */
+ memset(&xlrec, 0, MinSizeOfXactInvals);
+ xlrec.nmsgs = nmsgs;
+
+ /* perform insertion */
+ XLogBeginInsert();
+ XLogRegisterData((char *) (&xlrec), MinSizeOfXactInvals);
+ ProcessMessageSubGroupMulti(group, CatCacheMsgs,
+ XLogRegisterData((char *) msgs,
+ n * sizeof(SharedInvalidationMessage)));
+ ProcessMessageSubGroupMulti(group, RelCacheMsgs,
+ XLogRegisterData((char *) msgs,
+ n * sizeof(SharedInvalidationMessage)));
+ XLogInsert(RM_XACT_ID, XLOG_XACT_INVALIDATIONS);
+ }
+}
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
new file mode 100644
index 0000000..1b7e11b
--- /dev/null
+++ b/src/backend/utils/cache/lsyscache.c
@@ -0,0 +1,3580 @@
+/*-------------------------------------------------------------------------
+ *
+ * lsyscache.c
+ * Convenience routines for common queries in the system catalog cache.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/lsyscache.c
+ *
+ * NOTES
+ * Eventually, the index information should go through here, too.
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/hash.h"
+#include "access/htup_details.h"
+#include "access/nbtree.h"
+#include "bootstrap/bootstrap.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_amop.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_cast.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_namespace.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_range.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_transform.h"
+#include "catalog/pg_type.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
+#include "utils/rel.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+/* Hook for plugins to get control in get_attavgwidth() */
+get_attavgwidth_hook_type get_attavgwidth_hook = NULL;
+
+
+/* ---------- AMOP CACHES ---------- */
+
+/*
+ * op_in_opfamily
+ *
+ * Return t iff operator 'opno' is in operator family 'opfamily'.
+ *
+ * This function only considers search operators, not ordering operators.
+ */
+bool
+op_in_opfamily(Oid opno, Oid opfamily)
+{
+ return SearchSysCacheExists3(AMOPOPID,
+ ObjectIdGetDatum(opno),
+ CharGetDatum(AMOP_SEARCH),
+ ObjectIdGetDatum(opfamily));
+}
+
+/*
+ * get_op_opfamily_strategy
+ *
+ * Get the operator's strategy number within the specified opfamily,
+ * or 0 if it's not a member of the opfamily.
+ *
+ * This function only considers search operators, not ordering operators.
+ */
+int
+get_op_opfamily_strategy(Oid opno, Oid opfamily)
+{
+ HeapTuple tp;
+ Form_pg_amop amop_tup;
+ int result;
+
+ tp = SearchSysCache3(AMOPOPID,
+ ObjectIdGetDatum(opno),
+ CharGetDatum(AMOP_SEARCH),
+ ObjectIdGetDatum(opfamily));
+ if (!HeapTupleIsValid(tp))
+ return 0;
+ amop_tup = (Form_pg_amop) GETSTRUCT(tp);
+ result = amop_tup->amopstrategy;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_op_opfamily_sortfamily
+ *
+ * If the operator is an ordering operator within the specified opfamily,
+ * return its amopsortfamily OID; else return InvalidOid.
+ */
+Oid
+get_op_opfamily_sortfamily(Oid opno, Oid opfamily)
+{
+ HeapTuple tp;
+ Form_pg_amop amop_tup;
+ Oid result;
+
+ tp = SearchSysCache3(AMOPOPID,
+ ObjectIdGetDatum(opno),
+ CharGetDatum(AMOP_ORDER),
+ ObjectIdGetDatum(opfamily));
+ if (!HeapTupleIsValid(tp))
+ return InvalidOid;
+ amop_tup = (Form_pg_amop) GETSTRUCT(tp);
+ result = amop_tup->amopsortfamily;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_op_opfamily_properties
+ *
+ * Get the operator's strategy number and declared input data types
+ * within the specified opfamily.
+ *
+ * Caller should already have verified that opno is a member of opfamily,
+ * therefore we raise an error if the tuple is not found.
+ */
+void
+get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op,
+ int *strategy,
+ Oid *lefttype,
+ Oid *righttype)
+{
+ HeapTuple tp;
+ Form_pg_amop amop_tup;
+
+ tp = SearchSysCache3(AMOPOPID,
+ ObjectIdGetDatum(opno),
+ CharGetDatum(ordering_op ? AMOP_ORDER : AMOP_SEARCH),
+ ObjectIdGetDatum(opfamily));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "operator %u is not a member of opfamily %u",
+ opno, opfamily);
+ amop_tup = (Form_pg_amop) GETSTRUCT(tp);
+ *strategy = amop_tup->amopstrategy;
+ *lefttype = amop_tup->amoplefttype;
+ *righttype = amop_tup->amoprighttype;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * get_opfamily_member
+ * Get the OID of the operator that implements the specified strategy
+ * with the specified datatypes for the specified opfamily.
+ *
+ * Returns InvalidOid if there is no pg_amop entry for the given keys.
+ */
+Oid
+get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype,
+ int16 strategy)
+{
+ HeapTuple tp;
+ Form_pg_amop amop_tup;
+ Oid result;
+
+ tp = SearchSysCache4(AMOPSTRATEGY,
+ ObjectIdGetDatum(opfamily),
+ ObjectIdGetDatum(lefttype),
+ ObjectIdGetDatum(righttype),
+ Int16GetDatum(strategy));
+ if (!HeapTupleIsValid(tp))
+ return InvalidOid;
+ amop_tup = (Form_pg_amop) GETSTRUCT(tp);
+ result = amop_tup->amopopr;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_ordering_op_properties
+ * Given the OID of an ordering operator (a btree "<" or ">" operator),
+ * determine its opfamily, its declared input datatype, and its
+ * strategy number (BTLessStrategyNumber or BTGreaterStrategyNumber).
+ *
+ * Returns true if successful, false if no matching pg_amop entry exists.
+ * (This indicates that the operator is not a valid ordering operator.)
+ *
+ * Note: the operator could be registered in multiple families, for example
+ * if someone were to build a "reverse sort" opfamily. This would result in
+ * uncertainty as to whether "ORDER BY USING op" would default to NULLS FIRST
+ * or NULLS LAST, as well as inefficient planning due to failure to match up
+ * pathkeys that should be the same. So we want a determinate result here.
+ * Because of the way the syscache search works, we'll use the interpretation
+ * associated with the opfamily with smallest OID, which is probably
+ * determinate enough. Since there is no longer any particularly good reason
+ * to build reverse-sort opfamilies, it doesn't seem worth expending any
+ * additional effort on ensuring consistency.
+ */
+bool
+get_ordering_op_properties(Oid opno,
+ Oid *opfamily, Oid *opcintype, int16 *strategy)
+{
+ bool result = false;
+ CatCList *catlist;
+ int i;
+
+ /* ensure outputs are initialized on failure */
+ *opfamily = InvalidOid;
+ *opcintype = InvalidOid;
+ *strategy = 0;
+
+ /*
+ * Search pg_amop to see if the target operator is registered as the "<"
+ * or ">" operator of any btree opfamily.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple tuple = &catlist->members[i]->tuple;
+ Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple);
+
+ /* must be btree */
+ if (aform->amopmethod != BTREE_AM_OID)
+ continue;
+
+ if (aform->amopstrategy == BTLessStrategyNumber ||
+ aform->amopstrategy == BTGreaterStrategyNumber)
+ {
+ /* Found it ... should have consistent input types */
+ if (aform->amoplefttype == aform->amoprighttype)
+ {
+ /* Found a suitable opfamily, return info */
+ *opfamily = aform->amopfamily;
+ *opcintype = aform->amoplefttype;
+ *strategy = aform->amopstrategy;
+ result = true;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * get_equality_op_for_ordering_op
+ * Get the OID of the datatype-specific btree equality operator
+ * associated with an ordering operator (a "<" or ">" operator).
+ *
+ * If "reverse" isn't NULL, also set *reverse to false if the operator is "<",
+ * true if it's ">"
+ *
+ * Returns InvalidOid if no matching equality operator can be found.
+ * (This indicates that the operator is not a valid ordering operator.)
+ */
+Oid
+get_equality_op_for_ordering_op(Oid opno, bool *reverse)
+{
+ Oid result = InvalidOid;
+ Oid opfamily;
+ Oid opcintype;
+ int16 strategy;
+
+ /* Find the operator in pg_amop */
+ if (get_ordering_op_properties(opno,
+ &opfamily, &opcintype, &strategy))
+ {
+ /* Found a suitable opfamily, get matching equality operator */
+ result = get_opfamily_member(opfamily,
+ opcintype,
+ opcintype,
+ BTEqualStrategyNumber);
+ if (reverse)
+ *reverse = (strategy == BTGreaterStrategyNumber);
+ }
+
+ return result;
+}
+
+/*
+ * get_ordering_op_for_equality_op
+ * Get the OID of a datatype-specific btree ordering operator
+ * associated with an equality operator. (If there are multiple
+ * possibilities, assume any one will do.)
+ *
+ * This function is used when we have to sort data before unique-ifying,
+ * and don't much care which sorting op is used as long as it's compatible
+ * with the intended equality operator. Since we need a sorting operator,
+ * it should be single-data-type even if the given operator is cross-type.
+ * The caller specifies whether to find an op for the LHS or RHS data type.
+ *
+ * Returns InvalidOid if no matching ordering operator can be found.
+ */
+Oid
+get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type)
+{
+ Oid result = InvalidOid;
+ CatCList *catlist;
+ int i;
+
+ /*
+ * Search pg_amop to see if the target operator is registered as the "="
+ * operator of any btree opfamily.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple tuple = &catlist->members[i]->tuple;
+ Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple);
+
+ /* must be btree */
+ if (aform->amopmethod != BTREE_AM_OID)
+ continue;
+
+ if (aform->amopstrategy == BTEqualStrategyNumber)
+ {
+ /* Found a suitable opfamily, get matching ordering operator */
+ Oid typid;
+
+ typid = use_lhs_type ? aform->amoplefttype : aform->amoprighttype;
+ result = get_opfamily_member(aform->amopfamily,
+ typid, typid,
+ BTLessStrategyNumber);
+ if (OidIsValid(result))
+ break;
+ /* failure probably shouldn't happen, but keep looking if so */
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * get_mergejoin_opfamilies
+ * Given a putatively mergejoinable operator, return a list of the OIDs
+ * of the btree opfamilies in which it represents equality.
+ *
+ * It is possible (though at present unusual) for an operator to be equality
+ * in more than one opfamily, hence the result is a list. This also lets us
+ * return NIL if the operator is not found in any opfamilies.
+ *
+ * The planner currently uses simple equal() tests to compare the lists
+ * returned by this function, which makes the list order relevant, though
+ * strictly speaking it should not be. Because of the way syscache list
+ * searches are handled, in normal operation the result will be sorted by OID
+ * so everything works fine. If running with system index usage disabled,
+ * the result ordering is unspecified and hence the planner might fail to
+ * recognize optimization opportunities ... but that's hardly a scenario in
+ * which performance is good anyway, so there's no point in expending code
+ * or cycles here to guarantee the ordering in that case.
+ */
+List *
+get_mergejoin_opfamilies(Oid opno)
+{
+ List *result = NIL;
+ CatCList *catlist;
+ int i;
+
+ /*
+ * Search pg_amop to see if the target operator is registered as the "="
+ * operator of any btree opfamily.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple tuple = &catlist->members[i]->tuple;
+ Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple);
+
+ /* must be btree equality */
+ if (aform->amopmethod == BTREE_AM_OID &&
+ aform->amopstrategy == BTEqualStrategyNumber)
+ result = lappend_oid(result, aform->amopfamily);
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * get_compatible_hash_operators
+ * Get the OID(s) of hash equality operator(s) compatible with the given
+ * operator, but operating on its LHS and/or RHS datatype.
+ *
+ * An operator for the LHS type is sought and returned into *lhs_opno if
+ * lhs_opno isn't NULL. Similarly, an operator for the RHS type is sought
+ * and returned into *rhs_opno if rhs_opno isn't NULL.
+ *
+ * If the given operator is not cross-type, the results should be the same
+ * operator, but in cross-type situations they will be different.
+ *
+ * Returns true if able to find the requested operator(s), false if not.
+ * (This indicates that the operator should not have been marked oprcanhash.)
+ */
+bool
+get_compatible_hash_operators(Oid opno,
+ Oid *lhs_opno, Oid *rhs_opno)
+{
+ bool result = false;
+ CatCList *catlist;
+ int i;
+
+ /* Ensure output args are initialized on failure */
+ if (lhs_opno)
+ *lhs_opno = InvalidOid;
+ if (rhs_opno)
+ *rhs_opno = InvalidOid;
+
+ /*
+ * Search pg_amop to see if the target operator is registered as the "="
+ * operator of any hash opfamily. If the operator is registered in
+ * multiple opfamilies, assume we can use any one.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple tuple = &catlist->members[i]->tuple;
+ Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple);
+
+ if (aform->amopmethod == HASH_AM_OID &&
+ aform->amopstrategy == HTEqualStrategyNumber)
+ {
+ /* No extra lookup needed if given operator is single-type */
+ if (aform->amoplefttype == aform->amoprighttype)
+ {
+ if (lhs_opno)
+ *lhs_opno = opno;
+ if (rhs_opno)
+ *rhs_opno = opno;
+ result = true;
+ break;
+ }
+
+ /*
+ * Get the matching single-type operator(s). Failure probably
+ * shouldn't happen --- it implies a bogus opfamily --- but
+ * continue looking if so.
+ */
+ if (lhs_opno)
+ {
+ *lhs_opno = get_opfamily_member(aform->amopfamily,
+ aform->amoplefttype,
+ aform->amoplefttype,
+ HTEqualStrategyNumber);
+ if (!OidIsValid(*lhs_opno))
+ continue;
+ /* Matching LHS found, done if caller doesn't want RHS */
+ if (!rhs_opno)
+ {
+ result = true;
+ break;
+ }
+ }
+ if (rhs_opno)
+ {
+ *rhs_opno = get_opfamily_member(aform->amopfamily,
+ aform->amoprighttype,
+ aform->amoprighttype,
+ HTEqualStrategyNumber);
+ if (!OidIsValid(*rhs_opno))
+ {
+ /* Forget any LHS operator from this opfamily */
+ if (lhs_opno)
+ *lhs_opno = InvalidOid;
+ continue;
+ }
+ /* Matching RHS found, so done */
+ result = true;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * get_op_hash_functions
+ * Get the OID(s) of the standard hash support function(s) compatible with
+ * the given operator, operating on its LHS and/or RHS datatype as required.
+ *
+ * A function for the LHS type is sought and returned into *lhs_procno if
+ * lhs_procno isn't NULL. Similarly, a function for the RHS type is sought
+ * and returned into *rhs_procno if rhs_procno isn't NULL.
+ *
+ * If the given operator is not cross-type, the results should be the same
+ * function, but in cross-type situations they will be different.
+ *
+ * Returns true if able to find the requested function(s), false if not.
+ * (This indicates that the operator should not have been marked oprcanhash.)
+ */
+bool
+get_op_hash_functions(Oid opno,
+ RegProcedure *lhs_procno, RegProcedure *rhs_procno)
+{
+ bool result = false;
+ CatCList *catlist;
+ int i;
+
+ /* Ensure output args are initialized on failure */
+ if (lhs_procno)
+ *lhs_procno = InvalidOid;
+ if (rhs_procno)
+ *rhs_procno = InvalidOid;
+
+ /*
+ * Search pg_amop to see if the target operator is registered as the "="
+ * operator of any hash opfamily. If the operator is registered in
+ * multiple opfamilies, assume we can use any one.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple tuple = &catlist->members[i]->tuple;
+ Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple);
+
+ if (aform->amopmethod == HASH_AM_OID &&
+ aform->amopstrategy == HTEqualStrategyNumber)
+ {
+ /*
+ * Get the matching support function(s). Failure probably
+ * shouldn't happen --- it implies a bogus opfamily --- but
+ * continue looking if so.
+ */
+ if (lhs_procno)
+ {
+ *lhs_procno = get_opfamily_proc(aform->amopfamily,
+ aform->amoplefttype,
+ aform->amoplefttype,
+ HASHSTANDARD_PROC);
+ if (!OidIsValid(*lhs_procno))
+ continue;
+ /* Matching LHS found, done if caller doesn't want RHS */
+ if (!rhs_procno)
+ {
+ result = true;
+ break;
+ }
+ /* Only one lookup needed if given operator is single-type */
+ if (aform->amoplefttype == aform->amoprighttype)
+ {
+ *rhs_procno = *lhs_procno;
+ result = true;
+ break;
+ }
+ }
+ if (rhs_procno)
+ {
+ *rhs_procno = get_opfamily_proc(aform->amopfamily,
+ aform->amoprighttype,
+ aform->amoprighttype,
+ HASHSTANDARD_PROC);
+ if (!OidIsValid(*rhs_procno))
+ {
+ /* Forget any LHS function from this opfamily */
+ if (lhs_procno)
+ *lhs_procno = InvalidOid;
+ continue;
+ }
+ /* Matching RHS found, so done */
+ result = true;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * get_op_btree_interpretation
+ * Given an operator's OID, find out which btree opfamilies it belongs to,
+ * and what properties it has within each one. The results are returned
+ * as a palloc'd list of OpBtreeInterpretation structs.
+ *
+ * In addition to the normal btree operators, we consider a <> operator to be
+ * a "member" of an opfamily if its negator is an equality operator of the
+ * opfamily. ROWCOMPARE_NE is returned as the strategy number for this case.
+ */
+List *
+get_op_btree_interpretation(Oid opno)
+{
+ List *result = NIL;
+ OpBtreeInterpretation *thisresult;
+ CatCList *catlist;
+ int i;
+
+ /*
+ * Find all the pg_amop entries containing the operator.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple op_tuple = &catlist->members[i]->tuple;
+ Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
+ StrategyNumber op_strategy;
+
+ /* must be btree */
+ if (op_form->amopmethod != BTREE_AM_OID)
+ continue;
+
+ /* Get the operator's btree strategy number */
+ op_strategy = (StrategyNumber) op_form->amopstrategy;
+ Assert(op_strategy >= 1 && op_strategy <= 5);
+
+ thisresult = (OpBtreeInterpretation *)
+ palloc(sizeof(OpBtreeInterpretation));
+ thisresult->opfamily_id = op_form->amopfamily;
+ thisresult->strategy = op_strategy;
+ thisresult->oplefttype = op_form->amoplefttype;
+ thisresult->oprighttype = op_form->amoprighttype;
+ result = lappend(result, thisresult);
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ /*
+ * If we didn't find any btree opfamily containing the operator, perhaps
+ * it is a <> operator. See if it has a negator that is in an opfamily.
+ */
+ if (result == NIL)
+ {
+ Oid op_negator = get_negator(opno);
+
+ if (OidIsValid(op_negator))
+ {
+ catlist = SearchSysCacheList1(AMOPOPID,
+ ObjectIdGetDatum(op_negator));
+
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple op_tuple = &catlist->members[i]->tuple;
+ Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
+ StrategyNumber op_strategy;
+
+ /* must be btree */
+ if (op_form->amopmethod != BTREE_AM_OID)
+ continue;
+
+ /* Get the operator's btree strategy number */
+ op_strategy = (StrategyNumber) op_form->amopstrategy;
+ Assert(op_strategy >= 1 && op_strategy <= 5);
+
+ /* Only consider negators that are = */
+ if (op_strategy != BTEqualStrategyNumber)
+ continue;
+
+ /* OK, report it with "strategy" ROWCOMPARE_NE */
+ thisresult = (OpBtreeInterpretation *)
+ palloc(sizeof(OpBtreeInterpretation));
+ thisresult->opfamily_id = op_form->amopfamily;
+ thisresult->strategy = ROWCOMPARE_NE;
+ thisresult->oplefttype = op_form->amoplefttype;
+ thisresult->oprighttype = op_form->amoprighttype;
+ result = lappend(result, thisresult);
+ }
+
+ ReleaseSysCacheList(catlist);
+ }
+ }
+
+ return result;
+}
+
+/*
+ * equality_ops_are_compatible
+ * Return true if the two given equality operators have compatible
+ * semantics.
+ *
+ * This is trivially true if they are the same operator. Otherwise,
+ * we look to see if they can be found in the same btree or hash opfamily.
+ * Either finding allows us to assume that they have compatible notions
+ * of equality. (The reason we need to do these pushups is that one might
+ * be a cross-type operator; for instance int24eq vs int4eq.)
+ */
+bool
+equality_ops_are_compatible(Oid opno1, Oid opno2)
+{
+ bool result;
+ CatCList *catlist;
+ int i;
+
+ /* Easy if they're the same operator */
+ if (opno1 == opno2)
+ return true;
+
+ /*
+ * We search through all the pg_amop entries for opno1.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno1));
+
+ result = false;
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple op_tuple = &catlist->members[i]->tuple;
+ Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
+
+ /* must be btree or hash */
+ if (op_form->amopmethod == BTREE_AM_OID ||
+ op_form->amopmethod == HASH_AM_OID)
+ {
+ if (op_in_opfamily(opno2, op_form->amopfamily))
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+/*
+ * comparison_ops_are_compatible
+ * Return true if the two given comparison operators have compatible
+ * semantics.
+ *
+ * This is trivially true if they are the same operator. Otherwise,
+ * we look to see if they can be found in the same btree opfamily.
+ * For example, '<' and '>=' ops match if they belong to the same family.
+ *
+ * (This is identical to equality_ops_are_compatible(), except that we
+ * don't bother to examine hash opclasses.)
+ */
+bool
+comparison_ops_are_compatible(Oid opno1, Oid opno2)
+{
+ bool result;
+ CatCList *catlist;
+ int i;
+
+ /* Easy if they're the same operator */
+ if (opno1 == opno2)
+ return true;
+
+ /*
+ * We search through all the pg_amop entries for opno1.
+ */
+ catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno1));
+
+ result = false;
+ for (i = 0; i < catlist->n_members; i++)
+ {
+ HeapTuple op_tuple = &catlist->members[i]->tuple;
+ Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
+
+ if (op_form->amopmethod == BTREE_AM_OID)
+ {
+ if (op_in_opfamily(opno2, op_form->amopfamily))
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCacheList(catlist);
+
+ return result;
+}
+
+
+/* ---------- AMPROC CACHES ---------- */
+
+/*
+ * get_opfamily_proc
+ * Get the OID of the specified support function
+ * for the specified opfamily and datatypes.
+ *
+ * Returns InvalidOid if there is no pg_amproc entry for the given keys.
+ */
+Oid
+get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
+{
+ HeapTuple tp;
+ Form_pg_amproc amproc_tup;
+ RegProcedure result;
+
+ tp = SearchSysCache4(AMPROCNUM,
+ ObjectIdGetDatum(opfamily),
+ ObjectIdGetDatum(lefttype),
+ ObjectIdGetDatum(righttype),
+ Int16GetDatum(procnum));
+ if (!HeapTupleIsValid(tp))
+ return InvalidOid;
+ amproc_tup = (Form_pg_amproc) GETSTRUCT(tp);
+ result = amproc_tup->amproc;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+
+/* ---------- ATTRIBUTE CACHES ---------- */
+
+/*
+ * get_attname
+ * Given the relation id and the attribute number, return the "attname"
+ * field from the attribute relation as a palloc'ed string.
+ *
+ * If no such attribute exists and missing_ok is true, NULL is returned;
+ * otherwise a not-intended-for-user-consumption error is thrown.
+ */
+char *
+get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid), Int16GetDatum(attnum));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(att_tup->attname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+
+ if (!missing_ok)
+ elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+ attnum, relid);
+ return NULL;
+}
+
+/*
+ * get_attnum
+ *
+ * Given the relation id and the attribute name,
+ * return the "attnum" field from the attribute relation.
+ *
+ * Returns InvalidAttrNumber if the attr doesn't exist (or is dropped).
+ */
+AttrNumber
+get_attnum(Oid relid, const char *attname)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCacheAttName(relid, attname);
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+ AttrNumber result;
+
+ result = att_tup->attnum;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidAttrNumber;
+}
+
+/*
+ * get_attstattarget
+ *
+ * Given the relation id and the attribute number,
+ * return the "attstattarget" field from the attribute relation.
+ *
+ * Errors if not found.
+ */
+int
+get_attstattarget(Oid relid, AttrNumber attnum)
+{
+ HeapTuple tp;
+ Form_pg_attribute att_tup;
+ int result;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+ attnum, relid);
+ att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+ result = att_tup->attstattarget;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_attgenerated
+ *
+ * Given the relation id and the attribute number,
+ * return the "attgenerated" field from the attribute relation.
+ *
+ * Errors if not found.
+ *
+ * Since not generated is represented by '\0', this can also be used as a
+ * Boolean test.
+ */
+char
+get_attgenerated(Oid relid, AttrNumber attnum)
+{
+ HeapTuple tp;
+ Form_pg_attribute att_tup;
+ char result;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+ attnum, relid);
+ att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+ result = att_tup->attgenerated;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_atttype
+ *
+ * Given the relation OID and the attribute number with the relation,
+ * return the attribute type OID.
+ */
+Oid
+get_atttype(Oid relid, AttrNumber attnum)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+ Oid result;
+
+ result = att_tup->atttypid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_atttypetypmodcoll
+ *
+ * A three-fer: given the relation id and the attribute number,
+ * fetch atttypid, atttypmod, and attcollation in a single cache lookup.
+ *
+ * Unlike the otherwise-similar get_atttype, this routine
+ * raises an error if it can't obtain the information.
+ */
+void
+get_atttypetypmodcoll(Oid relid, AttrNumber attnum,
+ Oid *typid, int32 *typmod, Oid *collid)
+{
+ HeapTuple tp;
+ Form_pg_attribute att_tup;
+
+ tp = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+ attnum, relid);
+ att_tup = (Form_pg_attribute) GETSTRUCT(tp);
+
+ *typid = att_tup->atttypid;
+ *typmod = att_tup->atttypmod;
+ *collid = att_tup->attcollation;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * get_attoptions
+ *
+ * Given the relation id and the attribute number,
+ * return the attribute options text[] datum, if any.
+ */
+Datum
+get_attoptions(Oid relid, int16 attnum)
+{
+ HeapTuple tuple;
+ Datum attopts;
+ Datum result;
+ bool isnull;
+
+ tuple = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for attribute %d of relation %u",
+ attnum, relid);
+
+ attopts = SysCacheGetAttr(ATTNAME, tuple, Anum_pg_attribute_attoptions,
+ &isnull);
+
+ if (isnull)
+ result = (Datum) 0;
+ else
+ result = datumCopy(attopts, false, -1); /* text[] */
+
+ ReleaseSysCache(tuple);
+
+ return result;
+}
+
+/* ---------- PG_CAST CACHE ---------- */
+
+/*
+ * get_cast_oid - given two type OIDs, look up a cast OID
+ *
+ * If missing_ok is false, throw an error if the cast is not found. If
+ * true, just return InvalidOid.
+ */
+Oid
+get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok)
+{
+ Oid oid;
+
+ oid = GetSysCacheOid2(CASTSOURCETARGET, Anum_pg_cast_oid,
+ ObjectIdGetDatum(sourcetypeid),
+ ObjectIdGetDatum(targettypeid));
+ if (!OidIsValid(oid) && !missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("cast from type %s to type %s does not exist",
+ format_type_be(sourcetypeid),
+ format_type_be(targettypeid))));
+ return oid;
+}
+
+/* ---------- COLLATION CACHE ---------- */
+
+/*
+ * get_collation_name
+ * Returns the name of a given pg_collation entry.
+ *
+ * Returns a palloc'd copy of the string, or NULL if no such collation.
+ *
+ * NOTE: since collation name is not unique, be wary of code that uses this
+ * for anything except preparing error messages.
+ */
+char *
+get_collation_name(Oid colloid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(colloid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_collation colltup = (Form_pg_collation) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(colltup->collname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+bool
+get_collation_isdeterministic(Oid colloid)
+{
+ HeapTuple tp;
+ Form_pg_collation colltup;
+ bool result;
+
+ tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(colloid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for collation %u", colloid);
+ colltup = (Form_pg_collation) GETSTRUCT(tp);
+ result = colltup->collisdeterministic;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/* ---------- CONSTRAINT CACHE ---------- */
+
+/*
+ * get_constraint_name
+ * Returns the name of a given pg_constraint entry.
+ *
+ * Returns a palloc'd copy of the string, or NULL if no such constraint.
+ *
+ * NOTE: since constraint name is not unique, be wary of code that uses this
+ * for anything except preparing error messages.
+ */
+char *
+get_constraint_name(Oid conoid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(contup->conname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * get_constraint_index
+ * Given the OID of a unique, primary-key, or exclusion constraint,
+ * return the OID of the underlying index.
+ *
+ * Returns InvalidOid if the constraint could not be found or is of
+ * the wrong type.
+ *
+ * The intent of this function is to return the index "owned" by the
+ * specified constraint. Therefore we must check contype, since some
+ * pg_constraint entries (e.g. for foreign-key constraints) store the
+ * OID of an index that is referenced but not owned by the constraint.
+ */
+Oid
+get_constraint_index(Oid conoid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp);
+ Oid result;
+
+ if (contup->contype == CONSTRAINT_UNIQUE ||
+ contup->contype == CONSTRAINT_PRIMARY ||
+ contup->contype == CONSTRAINT_EXCLUSION)
+ result = contup->conindid;
+ else
+ result = InvalidOid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/* ---------- LANGUAGE CACHE ---------- */
+
+char *
+get_language_name(Oid langoid, bool missing_ok)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(LANGOID, ObjectIdGetDatum(langoid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_language lantup = (Form_pg_language) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(lantup->lanname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+
+ if (!missing_ok)
+ elog(ERROR, "cache lookup failed for language %u",
+ langoid);
+ return NULL;
+}
+
+/* ---------- OPCLASS CACHE ---------- */
+
+/*
+ * get_opclass_family
+ *
+ * Returns the OID of the operator family the opclass belongs to.
+ */
+Oid
+get_opclass_family(Oid opclass)
+{
+ HeapTuple tp;
+ Form_pg_opclass cla_tup;
+ Oid result;
+
+ tp = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclass));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for opclass %u", opclass);
+ cla_tup = (Form_pg_opclass) GETSTRUCT(tp);
+
+ result = cla_tup->opcfamily;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_opclass_input_type
+ *
+ * Returns the OID of the datatype the opclass indexes.
+ */
+Oid
+get_opclass_input_type(Oid opclass)
+{
+ HeapTuple tp;
+ Form_pg_opclass cla_tup;
+ Oid result;
+
+ tp = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclass));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for opclass %u", opclass);
+ cla_tup = (Form_pg_opclass) GETSTRUCT(tp);
+
+ result = cla_tup->opcintype;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_opclass_opfamily_and_input_type
+ *
+ * Returns the OID of the operator family the opclass belongs to,
+ * the OID of the datatype the opclass indexes
+ */
+bool
+get_opclass_opfamily_and_input_type(Oid opclass, Oid *opfamily, Oid *opcintype)
+{
+ HeapTuple tp;
+ Form_pg_opclass cla_tup;
+
+ tp = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclass));
+ if (!HeapTupleIsValid(tp))
+ return false;
+
+ cla_tup = (Form_pg_opclass) GETSTRUCT(tp);
+
+ *opfamily = cla_tup->opcfamily;
+ *opcintype = cla_tup->opcintype;
+
+ ReleaseSysCache(tp);
+
+ return true;
+}
+
+/* ---------- OPERATOR CACHE ---------- */
+
+/*
+ * get_opcode
+ *
+ * Returns the regproc id of the routine used to implement an
+ * operator given the operator oid.
+ */
+RegProcedure
+get_opcode(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ RegProcedure result;
+
+ result = optup->oprcode;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return (RegProcedure) InvalidOid;
+}
+
+/*
+ * get_opname
+ * returns the name of the operator with the given opno
+ *
+ * Note: returns a palloc'd copy of the string, or NULL if no such operator.
+ */
+char *
+get_opname(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(optup->oprname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * get_op_rettype
+ * Given operator oid, return the operator's result type.
+ */
+Oid
+get_op_rettype(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ Oid result;
+
+ result = optup->oprresult;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * op_input_types
+ *
+ * Returns the left and right input datatypes for an operator
+ * (InvalidOid if not relevant).
+ */
+void
+op_input_types(Oid opno, Oid *lefttype, Oid *righttype)
+{
+ HeapTuple tp;
+ Form_pg_operator optup;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (!HeapTupleIsValid(tp)) /* shouldn't happen */
+ elog(ERROR, "cache lookup failed for operator %u", opno);
+ optup = (Form_pg_operator) GETSTRUCT(tp);
+ *lefttype = optup->oprleft;
+ *righttype = optup->oprright;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * op_mergejoinable
+ *
+ * Returns true if the operator is potentially mergejoinable. (The planner
+ * will fail to find any mergejoin plans unless there are suitable btree
+ * opfamily entries for this operator and associated sortops. The pg_operator
+ * flag is just a hint to tell the planner whether to bother looking.)
+ *
+ * In some cases (currently only array_eq and record_eq), mergejoinability
+ * depends on the specific input data type the operator is invoked for, so
+ * that must be passed as well. We currently assume that only one input's type
+ * is needed to check this --- by convention, pass the left input's data type.
+ */
+bool
+op_mergejoinable(Oid opno, Oid inputtype)
+{
+ bool result = false;
+ HeapTuple tp;
+ TypeCacheEntry *typentry;
+
+ /*
+ * For array_eq or record_eq, we can sort if the element or field types
+ * are all sortable. We could implement all the checks for that here, but
+ * the typcache already does that and caches the results too, so let's
+ * rely on the typcache.
+ */
+ if (opno == ARRAY_EQ_OP)
+ {
+ typentry = lookup_type_cache(inputtype, TYPECACHE_CMP_PROC);
+ if (typentry->cmp_proc == F_BTARRAYCMP)
+ result = true;
+ }
+ else if (opno == RECORD_EQ_OP)
+ {
+ typentry = lookup_type_cache(inputtype, TYPECACHE_CMP_PROC);
+ if (typentry->cmp_proc == F_BTRECORDCMP)
+ result = true;
+ }
+ else
+ {
+ /* For all other operators, rely on pg_operator.oprcanmerge */
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+
+ result = optup->oprcanmerge;
+ ReleaseSysCache(tp);
+ }
+ }
+ return result;
+}
+
+/*
+ * op_hashjoinable
+ *
+ * Returns true if the operator is hashjoinable. (There must be a suitable
+ * hash opfamily entry for this operator if it is so marked.)
+ *
+ * In some cases (currently only array_eq), hashjoinability depends on the
+ * specific input data type the operator is invoked for, so that must be
+ * passed as well. We currently assume that only one input's type is needed
+ * to check this --- by convention, pass the left input's data type.
+ */
+bool
+op_hashjoinable(Oid opno, Oid inputtype)
+{
+ bool result = false;
+ HeapTuple tp;
+ TypeCacheEntry *typentry;
+
+ /* As in op_mergejoinable, let the typcache handle the hard cases */
+ if (opno == ARRAY_EQ_OP)
+ {
+ typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC);
+ if (typentry->hash_proc == F_HASH_ARRAY)
+ result = true;
+ }
+ else if (opno == RECORD_EQ_OP)
+ {
+ typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC);
+ if (typentry->hash_proc == F_HASH_RECORD)
+ result = true;
+ }
+ else
+ {
+ /* For all other operators, rely on pg_operator.oprcanhash */
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+
+ result = optup->oprcanhash;
+ ReleaseSysCache(tp);
+ }
+ }
+ return result;
+}
+
+/*
+ * op_strict
+ *
+ * Get the proisstrict flag for the operator's underlying function.
+ */
+bool
+op_strict(Oid opno)
+{
+ RegProcedure funcid = get_opcode(opno);
+
+ if (funcid == (RegProcedure) InvalidOid)
+ elog(ERROR, "operator %u does not exist", opno);
+
+ return func_strict((Oid) funcid);
+}
+
+/*
+ * op_volatile
+ *
+ * Get the provolatile flag for the operator's underlying function.
+ */
+char
+op_volatile(Oid opno)
+{
+ RegProcedure funcid = get_opcode(opno);
+
+ if (funcid == (RegProcedure) InvalidOid)
+ elog(ERROR, "operator %u does not exist", opno);
+
+ return func_volatile((Oid) funcid);
+}
+
+/*
+ * get_commutator
+ *
+ * Returns the corresponding commutator of an operator.
+ */
+Oid
+get_commutator(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ Oid result;
+
+ result = optup->oprcom;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_negator
+ *
+ * Returns the corresponding negator of an operator.
+ */
+Oid
+get_negator(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ Oid result;
+
+ result = optup->oprnegate;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_oprrest
+ *
+ * Returns procedure id for computing selectivity of an operator.
+ */
+RegProcedure
+get_oprrest(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ RegProcedure result;
+
+ result = optup->oprrest;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return (RegProcedure) InvalidOid;
+}
+
+/*
+ * get_oprjoin
+ *
+ * Returns procedure id for computing selectivity of a join.
+ */
+RegProcedure
+get_oprjoin(Oid opno)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(OPEROID, ObjectIdGetDatum(opno));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
+ RegProcedure result;
+
+ result = optup->oprjoin;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return (RegProcedure) InvalidOid;
+}
+
+/* ---------- FUNCTION CACHE ---------- */
+
+/*
+ * get_func_name
+ * returns the name of the function with the given funcid
+ *
+ * Note: returns a palloc'd copy of the string, or NULL if no such function.
+ */
+char *
+get_func_name(Oid funcid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_proc functup = (Form_pg_proc) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(functup->proname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * get_func_namespace
+ *
+ * Returns the pg_namespace OID associated with a given function.
+ */
+Oid
+get_func_namespace(Oid funcid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_proc functup = (Form_pg_proc) GETSTRUCT(tp);
+ Oid result;
+
+ result = functup->pronamespace;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_func_rettype
+ * Given procedure id, return the function's result type.
+ */
+Oid
+get_func_rettype(Oid funcid)
+{
+ HeapTuple tp;
+ Oid result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->prorettype;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_nargs
+ * Given procedure id, return the number of arguments.
+ */
+int
+get_func_nargs(Oid funcid)
+{
+ HeapTuple tp;
+ int result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->pronargs;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_signature
+ * Given procedure id, return the function's argument and result types.
+ * (The return value is the result type.)
+ *
+ * The arguments are returned as a palloc'd array.
+ */
+Oid
+get_func_signature(Oid funcid, Oid **argtypes, int *nargs)
+{
+ HeapTuple tp;
+ Form_pg_proc procstruct;
+ Oid result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ procstruct = (Form_pg_proc) GETSTRUCT(tp);
+
+ result = procstruct->prorettype;
+ *nargs = (int) procstruct->pronargs;
+ Assert(*nargs == procstruct->proargtypes.dim1);
+ *argtypes = (Oid *) palloc(*nargs * sizeof(Oid));
+ memcpy(*argtypes, procstruct->proargtypes.values, *nargs * sizeof(Oid));
+
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_variadictype
+ * Given procedure id, return the function's provariadic field.
+ */
+Oid
+get_func_variadictype(Oid funcid)
+{
+ HeapTuple tp;
+ Oid result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->provariadic;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_retset
+ * Given procedure id, return the function's proretset flag.
+ */
+bool
+get_func_retset(Oid funcid)
+{
+ HeapTuple tp;
+ bool result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->proretset;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * func_strict
+ * Given procedure id, return the function's proisstrict flag.
+ */
+bool
+func_strict(Oid funcid)
+{
+ HeapTuple tp;
+ bool result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->proisstrict;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * func_volatile
+ * Given procedure id, return the function's provolatile flag.
+ */
+char
+func_volatile(Oid funcid)
+{
+ HeapTuple tp;
+ char result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->provolatile;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * func_parallel
+ * Given procedure id, return the function's proparallel flag.
+ */
+char
+func_parallel(Oid funcid)
+{
+ HeapTuple tp;
+ char result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->proparallel;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_prokind
+ * Given procedure id, return the routine kind.
+ */
+char
+get_func_prokind(Oid funcid)
+{
+ HeapTuple tp;
+ char result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->prokind;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_leakproof
+ * Given procedure id, return the function's leakproof field.
+ */
+bool
+get_func_leakproof(Oid funcid)
+{
+ HeapTuple tp;
+ bool result;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+
+ result = ((Form_pg_proc) GETSTRUCT(tp))->proleakproof;
+ ReleaseSysCache(tp);
+ return result;
+}
+
+/*
+ * get_func_support
+ *
+ * Returns the support function OID associated with a given function,
+ * or InvalidOid if there is none.
+ */
+RegProcedure
+get_func_support(Oid funcid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_proc functup = (Form_pg_proc) GETSTRUCT(tp);
+ RegProcedure result;
+
+ result = functup->prosupport;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return (RegProcedure) InvalidOid;
+}
+
+/* ---------- RELATION CACHE ---------- */
+
+/*
+ * get_relname_relid
+ * Given name and namespace of a relation, look up the OID.
+ *
+ * Returns InvalidOid if there is no such relation.
+ */
+Oid
+get_relname_relid(const char *relname, Oid relnamespace)
+{
+ return GetSysCacheOid2(RELNAMENSP, Anum_pg_class_oid,
+ PointerGetDatum(relname),
+ ObjectIdGetDatum(relnamespace));
+}
+
+#ifdef NOT_USED
+/*
+ * get_relnatts
+ *
+ * Returns the number of attributes for a given relation.
+ */
+int
+get_relnatts(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ int result;
+
+ result = reltup->relnatts;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidAttrNumber;
+}
+#endif
+
+/*
+ * get_rel_name
+ * Returns the name of a given relation.
+ *
+ * Returns a palloc'd copy of the string, or NULL if no such relation.
+ *
+ * NOTE: since relation name is not unique, be wary of code that uses this
+ * for anything except preparing error messages.
+ */
+char *
+get_rel_name(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(reltup->relname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * get_rel_namespace
+ *
+ * Returns the pg_namespace OID associated with a given relation.
+ */
+Oid
+get_rel_namespace(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ Oid result;
+
+ result = reltup->relnamespace;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_rel_type_id
+ *
+ * Returns the pg_type OID associated with a given relation.
+ *
+ * Note: not all pg_class entries have associated pg_type OIDs; so be
+ * careful to check for InvalidOid result.
+ */
+Oid
+get_rel_type_id(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ Oid result;
+
+ result = reltup->reltype;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_rel_relkind
+ *
+ * Returns the relkind associated with a given relation.
+ */
+char
+get_rel_relkind(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ char result;
+
+ result = reltup->relkind;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return '\0';
+}
+
+/*
+ * get_rel_relispartition
+ *
+ * Returns the relispartition flag associated with a given relation.
+ */
+bool
+get_rel_relispartition(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ bool result;
+
+ result = reltup->relispartition;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return false;
+}
+
+/*
+ * get_rel_tablespace
+ *
+ * Returns the pg_tablespace OID associated with a given relation.
+ *
+ * Note: InvalidOid might mean either that we couldn't find the relation,
+ * or that it is in the database's default tablespace.
+ */
+Oid
+get_rel_tablespace(Oid relid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
+ Oid result;
+
+ result = reltup->reltablespace;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_rel_persistence
+ *
+ * Returns the relpersistence associated with a given relation.
+ */
+char
+get_rel_persistence(Oid relid)
+{
+ HeapTuple tp;
+ Form_pg_class reltup;
+ char result;
+
+ tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for relation %u", relid);
+ reltup = (Form_pg_class) GETSTRUCT(tp);
+ result = reltup->relpersistence;
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+
+/* ---------- TRANSFORM CACHE ---------- */
+
+Oid
+get_transform_fromsql(Oid typid, Oid langid, List *trftypes)
+{
+ HeapTuple tup;
+
+ if (!list_member_oid(trftypes, typid))
+ return InvalidOid;
+
+ tup = SearchSysCache2(TRFTYPELANG, typid, langid);
+ if (HeapTupleIsValid(tup))
+ {
+ Oid funcid;
+
+ funcid = ((Form_pg_transform) GETSTRUCT(tup))->trffromsql;
+ ReleaseSysCache(tup);
+ return funcid;
+ }
+ else
+ return InvalidOid;
+}
+
+Oid
+get_transform_tosql(Oid typid, Oid langid, List *trftypes)
+{
+ HeapTuple tup;
+
+ if (!list_member_oid(trftypes, typid))
+ return InvalidOid;
+
+ tup = SearchSysCache2(TRFTYPELANG, typid, langid);
+ if (HeapTupleIsValid(tup))
+ {
+ Oid funcid;
+
+ funcid = ((Form_pg_transform) GETSTRUCT(tup))->trftosql;
+ ReleaseSysCache(tup);
+ return funcid;
+ }
+ else
+ return InvalidOid;
+}
+
+
+/* ---------- TYPE CACHE ---------- */
+
+/*
+ * get_typisdefined
+ *
+ * Given the type OID, determine whether the type is defined
+ * (if not, it's only a shell).
+ */
+bool
+get_typisdefined(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ bool result;
+
+ result = typtup->typisdefined;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return false;
+}
+
+/*
+ * get_typlen
+ *
+ * Given the type OID, return the length of the type.
+ */
+int16
+get_typlen(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ int16 result;
+
+ result = typtup->typlen;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return 0;
+}
+
+/*
+ * get_typbyval
+ *
+ * Given the type OID, determine whether the type is returned by value or
+ * not. Returns true if by value, false if by reference.
+ */
+bool
+get_typbyval(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ bool result;
+
+ result = typtup->typbyval;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return false;
+}
+
+/*
+ * get_typlenbyval
+ *
+ * A two-fer: given the type OID, return both typlen and typbyval.
+ *
+ * Since both pieces of info are needed to know how to copy a Datum,
+ * many places need both. Might as well get them with one cache lookup
+ * instead of two. Also, this routine raises an error instead of
+ * returning a bogus value when given a bad type OID.
+ */
+void
+get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
+{
+ HeapTuple tp;
+ Form_pg_type typtup;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ *typlen = typtup->typlen;
+ *typbyval = typtup->typbyval;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * get_typlenbyvalalign
+ *
+ * A three-fer: given the type OID, return typlen, typbyval, typalign.
+ */
+void
+get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval,
+ char *typalign)
+{
+ HeapTuple tp;
+ Form_pg_type typtup;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ *typlen = typtup->typlen;
+ *typbyval = typtup->typbyval;
+ *typalign = typtup->typalign;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * getTypeIOParam
+ * Given a pg_type row, select the type OID to pass to I/O functions
+ *
+ * Formerly, all I/O functions were passed pg_type.typelem as their second
+ * parameter, but we now have a more complex rule about what to pass.
+ * This knowledge is intended to be centralized here --- direct references
+ * to typelem elsewhere in the code are wrong, if they are associated with
+ * I/O calls and not with actual subscripting operations! (But see
+ * bootstrap.c's boot_get_type_io_data() if you need to change this.)
+ *
+ * As of PostgreSQL 8.1, output functions receive only the value itself
+ * and not any auxiliary parameters, so the name of this routine is now
+ * a bit of a misnomer ... it should be getTypeInputParam.
+ */
+Oid
+getTypeIOParam(HeapTuple typeTuple)
+{
+ Form_pg_type typeStruct = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ /*
+ * Array types get their typelem as parameter; everybody else gets their
+ * own type OID as parameter.
+ */
+ if (OidIsValid(typeStruct->typelem))
+ return typeStruct->typelem;
+ else
+ return typeStruct->oid;
+}
+
+/*
+ * get_type_io_data
+ *
+ * A six-fer: given the type OID, return typlen, typbyval, typalign,
+ * typdelim, typioparam, and IO function OID. The IO function
+ * returned is controlled by IOFuncSelector
+ */
+void
+get_type_io_data(Oid typid,
+ IOFuncSelector which_func,
+ int16 *typlen,
+ bool *typbyval,
+ char *typalign,
+ char *typdelim,
+ Oid *typioparam,
+ Oid *func)
+{
+ HeapTuple typeTuple;
+ Form_pg_type typeStruct;
+
+ /*
+ * In bootstrap mode, pass it off to bootstrap.c. This hack allows us to
+ * use array_in and array_out during bootstrap.
+ */
+ if (IsBootstrapProcessingMode())
+ {
+ Oid typinput;
+ Oid typoutput;
+
+ boot_get_type_io_data(typid,
+ typlen,
+ typbyval,
+ typalign,
+ typdelim,
+ typioparam,
+ &typinput,
+ &typoutput);
+ switch (which_func)
+ {
+ case IOFunc_input:
+ *func = typinput;
+ break;
+ case IOFunc_output:
+ *func = typoutput;
+ break;
+ default:
+ elog(ERROR, "binary I/O not supported during bootstrap");
+ break;
+ }
+ return;
+ }
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typeStruct = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ *typlen = typeStruct->typlen;
+ *typbyval = typeStruct->typbyval;
+ *typalign = typeStruct->typalign;
+ *typdelim = typeStruct->typdelim;
+ *typioparam = getTypeIOParam(typeTuple);
+ switch (which_func)
+ {
+ case IOFunc_input:
+ *func = typeStruct->typinput;
+ break;
+ case IOFunc_output:
+ *func = typeStruct->typoutput;
+ break;
+ case IOFunc_receive:
+ *func = typeStruct->typreceive;
+ break;
+ case IOFunc_send:
+ *func = typeStruct->typsend;
+ break;
+ }
+ ReleaseSysCache(typeTuple);
+}
+
+#ifdef NOT_USED
+char
+get_typalign(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ char result;
+
+ result = typtup->typalign;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return TYPALIGN_INT;
+}
+#endif
+
+char
+get_typstorage(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ char result;
+
+ result = typtup->typstorage;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return TYPSTORAGE_PLAIN;
+}
+
+/*
+ * get_typdefault
+ * Given a type OID, return the type's default value, if any.
+ *
+ * The result is a palloc'd expression node tree, or NULL if there
+ * is no defined default for the datatype.
+ *
+ * NB: caller should be prepared to coerce result to correct datatype;
+ * the returned expression tree might produce something of the wrong type.
+ */
+Node *
+get_typdefault(Oid typid)
+{
+ HeapTuple typeTuple;
+ Form_pg_type type;
+ Datum datum;
+ bool isNull;
+ Node *expr;
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ type = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ /*
+ * typdefault and typdefaultbin are potentially null, so don't try to
+ * access 'em as struct fields. Must do it the hard way with
+ * SysCacheGetAttr.
+ */
+ datum = SysCacheGetAttr(TYPEOID,
+ typeTuple,
+ Anum_pg_type_typdefaultbin,
+ &isNull);
+
+ if (!isNull)
+ {
+ /* We have an expression default */
+ expr = stringToNode(TextDatumGetCString(datum));
+ }
+ else
+ {
+ /* Perhaps we have a plain literal default */
+ datum = SysCacheGetAttr(TYPEOID,
+ typeTuple,
+ Anum_pg_type_typdefault,
+ &isNull);
+
+ if (!isNull)
+ {
+ char *strDefaultVal;
+
+ /* Convert text datum to C string */
+ strDefaultVal = TextDatumGetCString(datum);
+ /* Convert C string to a value of the given type */
+ datum = OidInputFunctionCall(type->typinput, strDefaultVal,
+ getTypeIOParam(typeTuple), -1);
+ /* Build a Const node containing the value */
+ expr = (Node *) makeConst(typid,
+ -1,
+ type->typcollation,
+ type->typlen,
+ datum,
+ false,
+ type->typbyval);
+ pfree(strDefaultVal);
+ }
+ else
+ {
+ /* No default */
+ expr = NULL;
+ }
+ }
+
+ ReleaseSysCache(typeTuple);
+
+ return expr;
+}
+
+/*
+ * getBaseType
+ * If the given type is a domain, return its base type;
+ * otherwise return the type's own OID.
+ */
+Oid
+getBaseType(Oid typid)
+{
+ int32 typmod = -1;
+
+ return getBaseTypeAndTypmod(typid, &typmod);
+}
+
+/*
+ * getBaseTypeAndTypmod
+ * If the given type is a domain, return its base type and typmod;
+ * otherwise return the type's own OID, and leave *typmod unchanged.
+ *
+ * Note that the "applied typmod" should be -1 for every domain level
+ * above the bottommost; therefore, if the passed-in typid is indeed
+ * a domain, *typmod should be -1.
+ */
+Oid
+getBaseTypeAndTypmod(Oid typid, int32 *typmod)
+{
+ /*
+ * We loop to find the bottom base type in a stack of domains.
+ */
+ for (;;)
+ {
+ HeapTuple tup;
+ Form_pg_type typTup;
+
+ tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typTup = (Form_pg_type) GETSTRUCT(tup);
+ if (typTup->typtype != TYPTYPE_DOMAIN)
+ {
+ /* Not a domain, so done */
+ ReleaseSysCache(tup);
+ break;
+ }
+
+ Assert(*typmod == -1);
+ typid = typTup->typbasetype;
+ *typmod = typTup->typtypmod;
+
+ ReleaseSysCache(tup);
+ }
+
+ return typid;
+}
+
+/*
+ * get_typavgwidth
+ *
+ * Given a type OID and a typmod value (pass -1 if typmod is unknown),
+ * estimate the average width of values of the type. This is used by
+ * the planner, which doesn't require absolutely correct results;
+ * it's OK (and expected) to guess if we don't know for sure.
+ */
+int32
+get_typavgwidth(Oid typid, int32 typmod)
+{
+ int typlen = get_typlen(typid);
+ int32 maxwidth;
+
+ /*
+ * Easy if it's a fixed-width type
+ */
+ if (typlen > 0)
+ return typlen;
+
+ /*
+ * type_maximum_size knows the encoding of typmod for some datatypes;
+ * don't duplicate that knowledge here.
+ */
+ maxwidth = type_maximum_size(typid, typmod);
+ if (maxwidth > 0)
+ {
+ /*
+ * For BPCHAR, the max width is also the only width. Otherwise we
+ * need to guess about the typical data width given the max. A sliding
+ * scale for percentage of max width seems reasonable.
+ */
+ if (typid == BPCHAROID)
+ return maxwidth;
+ if (maxwidth <= 32)
+ return maxwidth; /* assume full width */
+ if (maxwidth < 1000)
+ return 32 + (maxwidth - 32) / 2; /* assume 50% */
+
+ /*
+ * Beyond 1000, assume we're looking at something like
+ * "varchar(10000)" where the limit isn't actually reached often, and
+ * use a fixed estimate.
+ */
+ return 32 + (1000 - 32) / 2;
+ }
+
+ /*
+ * Oops, we have no idea ... wild guess time.
+ */
+ return 32;
+}
+
+/*
+ * get_typtype
+ *
+ * Given the type OID, find if it is a basic type, a complex type, etc.
+ * It returns the null char if the cache lookup fails...
+ */
+char
+get_typtype(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ char result;
+
+ result = typtup->typtype;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return '\0';
+}
+
+/*
+ * type_is_rowtype
+ *
+ * Convenience function to determine whether a type OID represents
+ * a "rowtype" type --- either RECORD or a named composite type
+ * (including a domain over a named composite type).
+ */
+bool
+type_is_rowtype(Oid typid)
+{
+ if (typid == RECORDOID)
+ return true; /* easy case */
+ switch (get_typtype(typid))
+ {
+ case TYPTYPE_COMPOSITE:
+ return true;
+ case TYPTYPE_DOMAIN:
+ if (get_typtype(getBaseType(typid)) == TYPTYPE_COMPOSITE)
+ return true;
+ break;
+ default:
+ break;
+ }
+ return false;
+}
+
+/*
+ * type_is_enum
+ * Returns true if the given type is an enum type.
+ */
+bool
+type_is_enum(Oid typid)
+{
+ return (get_typtype(typid) == TYPTYPE_ENUM);
+}
+
+/*
+ * type_is_range
+ * Returns true if the given type is a range type.
+ */
+bool
+type_is_range(Oid typid)
+{
+ return (get_typtype(typid) == TYPTYPE_RANGE);
+}
+
+/*
+ * type_is_multirange
+ * Returns true if the given type is a multirange type.
+ */
+bool
+type_is_multirange(Oid typid)
+{
+ return (get_typtype(typid) == TYPTYPE_MULTIRANGE);
+}
+
+/*
+ * get_type_category_preferred
+ *
+ * Given the type OID, fetch its category and preferred-type status.
+ * Throws error on failure.
+ */
+void
+get_type_category_preferred(Oid typid, char *typcategory, bool *typispreferred)
+{
+ HeapTuple tp;
+ Form_pg_type typtup;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for type %u", typid);
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ *typcategory = typtup->typcategory;
+ *typispreferred = typtup->typispreferred;
+ ReleaseSysCache(tp);
+}
+
+/*
+ * get_typ_typrelid
+ *
+ * Given the type OID, get the typrelid (InvalidOid if not a complex
+ * type).
+ */
+Oid
+get_typ_typrelid(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ Oid result;
+
+ result = typtup->typrelid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_element_type
+ *
+ * Given the type OID, get the typelem (InvalidOid if not an array type).
+ *
+ * NB: this only succeeds for "true" arrays having array_subscript_handler
+ * as typsubscript. For other types, InvalidOid is returned independently
+ * of whether they have typelem or typsubscript set.
+ */
+Oid
+get_element_type(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ Oid result;
+
+ if (IsTrueArrayType(typtup))
+ result = typtup->typelem;
+ else
+ result = InvalidOid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_array_type
+ *
+ * Given the type OID, get the corresponding "true" array type.
+ * Returns InvalidOid if no array type can be found.
+ */
+Oid
+get_array_type(Oid typid)
+{
+ HeapTuple tp;
+ Oid result = InvalidOid;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ result = ((Form_pg_type) GETSTRUCT(tp))->typarray;
+ ReleaseSysCache(tp);
+ }
+ return result;
+}
+
+/*
+ * get_promoted_array_type
+ *
+ * The "promoted" type is what you'd get from an ARRAY(SELECT ...)
+ * construct, that is, either the corresponding "true" array type
+ * if the input is a scalar type that has such an array type,
+ * or the same type if the input is already a "true" array type.
+ * Returns InvalidOid if neither rule is satisfied.
+ */
+Oid
+get_promoted_array_type(Oid typid)
+{
+ Oid array_type = get_array_type(typid);
+
+ if (OidIsValid(array_type))
+ return array_type;
+ if (OidIsValid(get_element_type(typid)))
+ return typid;
+ return InvalidOid;
+}
+
+/*
+ * get_base_element_type
+ * Given the type OID, get the typelem, looking "through" any domain
+ * to its underlying array type.
+ *
+ * This is equivalent to get_element_type(getBaseType(typid)), but avoids
+ * an extra cache lookup. Note that it fails to provide any information
+ * about the typmod of the array.
+ */
+Oid
+get_base_element_type(Oid typid)
+{
+ /*
+ * We loop to find the bottom base type in a stack of domains.
+ */
+ for (;;)
+ {
+ HeapTuple tup;
+ Form_pg_type typTup;
+
+ tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (!HeapTupleIsValid(tup))
+ break;
+ typTup = (Form_pg_type) GETSTRUCT(tup);
+ if (typTup->typtype != TYPTYPE_DOMAIN)
+ {
+ /* Not a domain, so stop descending */
+ Oid result;
+
+ /* This test must match get_element_type */
+ if (IsTrueArrayType(typTup))
+ result = typTup->typelem;
+ else
+ result = InvalidOid;
+ ReleaseSysCache(tup);
+ return result;
+ }
+
+ typid = typTup->typbasetype;
+ ReleaseSysCache(tup);
+ }
+
+ /* Like get_element_type, silently return InvalidOid for bogus input */
+ return InvalidOid;
+}
+
+/*
+ * getTypeInputInfo
+ *
+ * Get info needed for converting values of a type to internal form
+ */
+void
+getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
+{
+ HeapTuple typeTuple;
+ Form_pg_type pt;
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", type);
+ pt = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ if (!pt->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type %s is only a shell",
+ format_type_be(type))));
+ if (!OidIsValid(pt->typinput))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no input function available for type %s",
+ format_type_be(type))));
+
+ *typInput = pt->typinput;
+ *typIOParam = getTypeIOParam(typeTuple);
+
+ ReleaseSysCache(typeTuple);
+}
+
+/*
+ * getTypeOutputInfo
+ *
+ * Get info needed for printing values of a type
+ */
+void
+getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
+{
+ HeapTuple typeTuple;
+ Form_pg_type pt;
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", type);
+ pt = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ if (!pt->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type %s is only a shell",
+ format_type_be(type))));
+ if (!OidIsValid(pt->typoutput))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no output function available for type %s",
+ format_type_be(type))));
+
+ *typOutput = pt->typoutput;
+ *typIsVarlena = (!pt->typbyval) && (pt->typlen == -1);
+
+ ReleaseSysCache(typeTuple);
+}
+
+/*
+ * getTypeBinaryInputInfo
+ *
+ * Get info needed for binary input of values of a type
+ */
+void
+getTypeBinaryInputInfo(Oid type, Oid *typReceive, Oid *typIOParam)
+{
+ HeapTuple typeTuple;
+ Form_pg_type pt;
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", type);
+ pt = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ if (!pt->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type %s is only a shell",
+ format_type_be(type))));
+ if (!OidIsValid(pt->typreceive))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary input function available for type %s",
+ format_type_be(type))));
+
+ *typReceive = pt->typreceive;
+ *typIOParam = getTypeIOParam(typeTuple);
+
+ ReleaseSysCache(typeTuple);
+}
+
+/*
+ * getTypeBinaryOutputInfo
+ *
+ * Get info needed for binary output of values of a type
+ */
+void
+getTypeBinaryOutputInfo(Oid type, Oid *typSend, bool *typIsVarlena)
+{
+ HeapTuple typeTuple;
+ Form_pg_type pt;
+
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", type);
+ pt = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ if (!pt->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type %s is only a shell",
+ format_type_be(type))));
+ if (!OidIsValid(pt->typsend))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("no binary output function available for type %s",
+ format_type_be(type))));
+
+ *typSend = pt->typsend;
+ *typIsVarlena = (!pt->typbyval) && (pt->typlen == -1);
+
+ ReleaseSysCache(typeTuple);
+}
+
+/*
+ * get_typmodin
+ *
+ * Given the type OID, return the type's typmodin procedure, if any.
+ */
+Oid
+get_typmodin(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ Oid result;
+
+ result = typtup->typmodin;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+#ifdef NOT_USED
+/*
+ * get_typmodout
+ *
+ * Given the type OID, return the type's typmodout procedure, if any.
+ */
+Oid
+get_typmodout(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ Oid result;
+
+ result = typtup->typmodout;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+#endif /* NOT_USED */
+
+/*
+ * get_typcollation
+ *
+ * Given the type OID, return the type's typcollation attribute.
+ */
+Oid
+get_typcollation(Oid typid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
+ Oid result;
+
+ result = typtup->typcollation;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+
+/*
+ * type_is_collatable
+ *
+ * Return whether the type cares about collations
+ */
+bool
+type_is_collatable(Oid typid)
+{
+ return OidIsValid(get_typcollation(typid));
+}
+
+
+/*
+ * get_typsubscript
+ *
+ * Given the type OID, return the type's subscripting handler's OID,
+ * if it has one.
+ *
+ * If typelemp isn't NULL, we also store the type's typelem value there.
+ * This saves some callers an extra catalog lookup.
+ */
+RegProcedure
+get_typsubscript(Oid typid, Oid *typelemp)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_type typform = (Form_pg_type) GETSTRUCT(tp);
+ RegProcedure handler = typform->typsubscript;
+
+ if (typelemp)
+ *typelemp = typform->typelem;
+ ReleaseSysCache(tp);
+ return handler;
+ }
+ else
+ {
+ if (typelemp)
+ *typelemp = InvalidOid;
+ return InvalidOid;
+ }
+}
+
+/*
+ * getSubscriptingRoutines
+ *
+ * Given the type OID, fetch the type's subscripting methods struct.
+ * Return NULL if type is not subscriptable.
+ *
+ * If typelemp isn't NULL, we also store the type's typelem value there.
+ * This saves some callers an extra catalog lookup.
+ */
+const struct SubscriptRoutines *
+getSubscriptingRoutines(Oid typid, Oid *typelemp)
+{
+ RegProcedure typsubscript = get_typsubscript(typid, typelemp);
+
+ if (!OidIsValid(typsubscript))
+ return NULL;
+
+ return (const struct SubscriptRoutines *)
+ DatumGetPointer(OidFunctionCall0(typsubscript));
+}
+
+
+/* ---------- STATISTICS CACHE ---------- */
+
+/*
+ * get_attavgwidth
+ *
+ * Given the table and attribute number of a column, get the average
+ * width of entries in the column. Return zero if no data available.
+ *
+ * Currently this is only consulted for individual tables, not for inheritance
+ * trees, so we don't need an "inh" parameter.
+ *
+ * Calling a hook at this point looks somewhat strange, but is required
+ * because the optimizer calls this function without any other way for
+ * plug-ins to control the result.
+ */
+int32
+get_attavgwidth(Oid relid, AttrNumber attnum)
+{
+ HeapTuple tp;
+ int32 stawidth;
+
+ if (get_attavgwidth_hook)
+ {
+ stawidth = (*get_attavgwidth_hook) (relid, attnum);
+ if (stawidth > 0)
+ return stawidth;
+ }
+ tp = SearchSysCache3(STATRELATTINH,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum),
+ BoolGetDatum(false));
+ if (HeapTupleIsValid(tp))
+ {
+ stawidth = ((Form_pg_statistic) GETSTRUCT(tp))->stawidth;
+ ReleaseSysCache(tp);
+ if (stawidth > 0)
+ return stawidth;
+ }
+ return 0;
+}
+
+/*
+ * get_attstatsslot
+ *
+ * Extract the contents of a "slot" of a pg_statistic tuple.
+ * Returns true if requested slot type was found, else false.
+ *
+ * Unlike other routines in this file, this takes a pointer to an
+ * already-looked-up tuple in the pg_statistic cache. We do this since
+ * most callers will want to extract more than one value from the cache
+ * entry, and we don't want to repeat the cache lookup unnecessarily.
+ * Also, this API allows this routine to be used with statistics tuples
+ * that have been provided by a stats hook and didn't really come from
+ * pg_statistic.
+ *
+ * sslot: pointer to output area (typically, a local variable in the caller).
+ * statstuple: pg_statistic tuple to be examined.
+ * reqkind: STAKIND code for desired statistics slot kind.
+ * reqop: STAOP value wanted, or InvalidOid if don't care.
+ * flags: bitmask of ATTSTATSSLOT_VALUES and/or ATTSTATSSLOT_NUMBERS.
+ *
+ * If a matching slot is found, true is returned, and *sslot is filled thus:
+ * staop: receives the actual STAOP value.
+ * stacoll: receives the actual STACOLL value.
+ * valuetype: receives actual datatype of the elements of stavalues.
+ * values: receives pointer to an array of the slot's stavalues.
+ * nvalues: receives number of stavalues.
+ * numbers: receives pointer to an array of the slot's stanumbers (as float4).
+ * nnumbers: receives number of stanumbers.
+ *
+ * valuetype/values/nvalues are InvalidOid/NULL/0 if ATTSTATSSLOT_VALUES
+ * wasn't specified. Likewise, numbers/nnumbers are NULL/0 if
+ * ATTSTATSSLOT_NUMBERS wasn't specified.
+ *
+ * If no matching slot is found, false is returned, and *sslot is zeroed.
+ *
+ * Note that the current API doesn't allow for searching for a slot with
+ * a particular collation. If we ever actually support recording more than
+ * one collation, we'll have to extend the API, but for now simple is good.
+ *
+ * The data referred to by the fields of sslot is locally palloc'd and
+ * is independent of the original pg_statistic tuple. When the caller
+ * is done with it, call free_attstatsslot to release the palloc'd data.
+ *
+ * If it's desirable to call free_attstatsslot when get_attstatsslot might
+ * not have been called, memset'ing sslot to zeroes will allow that.
+ */
+bool
+get_attstatsslot(AttStatsSlot *sslot, HeapTuple statstuple,
+ int reqkind, Oid reqop, int flags)
+{
+ Form_pg_statistic stats = (Form_pg_statistic) GETSTRUCT(statstuple);
+ int i;
+ Datum val;
+ bool isnull;
+ ArrayType *statarray;
+ Oid arrayelemtype;
+ int narrayelem;
+ HeapTuple typeTuple;
+ Form_pg_type typeForm;
+
+ /* initialize *sslot properly */
+ memset(sslot, 0, sizeof(AttStatsSlot));
+
+ for (i = 0; i < STATISTIC_NUM_SLOTS; i++)
+ {
+ if ((&stats->stakind1)[i] == reqkind &&
+ (reqop == InvalidOid || (&stats->staop1)[i] == reqop))
+ break;
+ }
+ if (i >= STATISTIC_NUM_SLOTS)
+ return false; /* not there */
+
+ sslot->staop = (&stats->staop1)[i];
+ sslot->stacoll = (&stats->stacoll1)[i];
+
+ if (flags & ATTSTATSSLOT_VALUES)
+ {
+ val = SysCacheGetAttr(STATRELATTINH, statstuple,
+ Anum_pg_statistic_stavalues1 + i,
+ &isnull);
+ if (isnull)
+ elog(ERROR, "stavalues is null");
+
+ /*
+ * Detoast the array if needed, and in any case make a copy that's
+ * under control of this AttStatsSlot.
+ */
+ statarray = DatumGetArrayTypePCopy(val);
+
+ /*
+ * Extract the actual array element type, and pass it back in case the
+ * caller needs it.
+ */
+ sslot->valuetype = arrayelemtype = ARR_ELEMTYPE(statarray);
+
+ /* Need info about element type */
+ typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(arrayelemtype));
+ if (!HeapTupleIsValid(typeTuple))
+ elog(ERROR, "cache lookup failed for type %u", arrayelemtype);
+ typeForm = (Form_pg_type) GETSTRUCT(typeTuple);
+
+ /* Deconstruct array into Datum elements; NULLs not expected */
+ deconstruct_array(statarray,
+ arrayelemtype,
+ typeForm->typlen,
+ typeForm->typbyval,
+ typeForm->typalign,
+ &sslot->values, NULL, &sslot->nvalues);
+
+ /*
+ * If the element type is pass-by-reference, we now have a bunch of
+ * Datums that are pointers into the statarray, so we need to keep
+ * that until free_attstatsslot. Otherwise, all the useful info is in
+ * sslot->values[], so we can free the array object immediately.
+ */
+ if (!typeForm->typbyval)
+ sslot->values_arr = statarray;
+ else
+ pfree(statarray);
+
+ ReleaseSysCache(typeTuple);
+ }
+
+ if (flags & ATTSTATSSLOT_NUMBERS)
+ {
+ val = SysCacheGetAttr(STATRELATTINH, statstuple,
+ Anum_pg_statistic_stanumbers1 + i,
+ &isnull);
+ if (isnull)
+ elog(ERROR, "stanumbers is null");
+
+ /*
+ * Detoast the array if needed, and in any case make a copy that's
+ * under control of this AttStatsSlot.
+ */
+ statarray = DatumGetArrayTypePCopy(val);
+
+ /*
+ * We expect the array to be a 1-D float4 array; verify that. We don't
+ * need to use deconstruct_array() since the array data is just going
+ * to look like a C array of float4 values.
+ */
+ narrayelem = ARR_DIMS(statarray)[0];
+ if (ARR_NDIM(statarray) != 1 || narrayelem <= 0 ||
+ ARR_HASNULL(statarray) ||
+ ARR_ELEMTYPE(statarray) != FLOAT4OID)
+ elog(ERROR, "stanumbers is not a 1-D float4 array");
+
+ /* Give caller a pointer directly into the statarray */
+ sslot->numbers = (float4 *) ARR_DATA_PTR(statarray);
+ sslot->nnumbers = narrayelem;
+
+ /* We'll free the statarray in free_attstatsslot */
+ sslot->numbers_arr = statarray;
+ }
+
+ return true;
+}
+
+/*
+ * free_attstatsslot
+ * Free data allocated by get_attstatsslot
+ */
+void
+free_attstatsslot(AttStatsSlot *sslot)
+{
+ /* The values[] array was separately palloc'd by deconstruct_array */
+ if (sslot->values)
+ pfree(sslot->values);
+ /* The numbers[] array points into numbers_arr, do not pfree it */
+ /* Free the detoasted array objects, if any */
+ if (sslot->values_arr)
+ pfree(sslot->values_arr);
+ if (sslot->numbers_arr)
+ pfree(sslot->numbers_arr);
+}
+
+/* ---------- PG_NAMESPACE CACHE ---------- */
+
+/*
+ * get_namespace_name
+ * Returns the name of a given namespace
+ *
+ * Returns a palloc'd copy of the string, or NULL if no such namespace.
+ */
+char *
+get_namespace_name(Oid nspid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(NAMESPACEOID, ObjectIdGetDatum(nspid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_namespace nsptup = (Form_pg_namespace) GETSTRUCT(tp);
+ char *result;
+
+ result = pstrdup(NameStr(nsptup->nspname));
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return NULL;
+}
+
+/*
+ * get_namespace_name_or_temp
+ * As above, but if it is this backend's temporary namespace, return
+ * "pg_temp" instead.
+ */
+char *
+get_namespace_name_or_temp(Oid nspid)
+{
+ if (isTempNamespace(nspid))
+ return pstrdup("pg_temp");
+ else
+ return get_namespace_name(nspid);
+}
+
+/* ---------- PG_RANGE CACHES ---------- */
+
+/*
+ * get_range_subtype
+ * Returns the subtype of a given range type
+ *
+ * Returns InvalidOid if the type is not a range type.
+ */
+Oid
+get_range_subtype(Oid rangeOid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RANGETYPE, ObjectIdGetDatum(rangeOid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_range rngtup = (Form_pg_range) GETSTRUCT(tp);
+ Oid result;
+
+ result = rngtup->rngsubtype;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_range_collation
+ * Returns the collation of a given range type
+ *
+ * Returns InvalidOid if the type is not a range type,
+ * or if its subtype is not collatable.
+ */
+Oid
+get_range_collation(Oid rangeOid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RANGETYPE, ObjectIdGetDatum(rangeOid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_range rngtup = (Form_pg_range) GETSTRUCT(tp);
+ Oid result;
+
+ result = rngtup->rngcollation;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_range_multirange
+ * Returns the multirange type of a given range type
+ *
+ * Returns InvalidOid if the type is not a range type.
+ */
+Oid
+get_range_multirange(Oid rangeOid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RANGETYPE, ObjectIdGetDatum(rangeOid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_range rngtup = (Form_pg_range) GETSTRUCT(tp);
+ Oid result;
+
+ result = rngtup->rngmultitypid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/*
+ * get_multirange_range
+ * Returns the range type of a given multirange
+ *
+ * Returns InvalidOid if the type is not a multirange.
+ */
+Oid
+get_multirange_range(Oid multirangeOid)
+{
+ HeapTuple tp;
+
+ tp = SearchSysCache1(RANGEMULTIRANGE, ObjectIdGetDatum(multirangeOid));
+ if (HeapTupleIsValid(tp))
+ {
+ Form_pg_range rngtup = (Form_pg_range) GETSTRUCT(tp);
+ Oid result;
+
+ result = rngtup->rngtypid;
+ ReleaseSysCache(tp);
+ return result;
+ }
+ else
+ return InvalidOid;
+}
+
+/* ---------- PG_INDEX CACHE ---------- */
+
+/*
+ * get_index_column_opclass
+ *
+ * Given the index OID and column number,
+ * return opclass of the index column
+ * or InvalidOid if the index was not found
+ * or column is non-key one.
+ */
+Oid
+get_index_column_opclass(Oid index_oid, int attno)
+{
+ HeapTuple tuple;
+ Form_pg_index rd_index;
+ Datum datum;
+ bool isnull;
+ oidvector *indclass;
+ Oid opclass;
+
+ /* First we need to know the column's opclass. */
+
+ tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ return InvalidOid;
+
+ rd_index = (Form_pg_index) GETSTRUCT(tuple);
+
+ /* caller is supposed to guarantee this */
+ Assert(attno > 0 && attno <= rd_index->indnatts);
+
+ /* Non-key attributes don't have an opclass */
+ if (attno > rd_index->indnkeyatts)
+ {
+ ReleaseSysCache(tuple);
+ return InvalidOid;
+ }
+
+ datum = SysCacheGetAttr(INDEXRELID, tuple,
+ Anum_pg_index_indclass, &isnull);
+ Assert(!isnull);
+
+ indclass = ((oidvector *) DatumGetPointer(datum));
+
+ Assert(attno <= indclass->dim1);
+ opclass = indclass->values[attno - 1];
+
+ ReleaseSysCache(tuple);
+
+ return opclass;
+}
+
+/*
+ * get_index_isreplident
+ *
+ * Given the index OID, return pg_index.indisreplident.
+ */
+bool
+get_index_isreplident(Oid index_oid)
+{
+ HeapTuple tuple;
+ Form_pg_index rd_index;
+ bool result;
+
+ tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ return false;
+
+ rd_index = (Form_pg_index) GETSTRUCT(tuple);
+ result = rd_index->indisreplident;
+ ReleaseSysCache(tuple);
+
+ return result;
+}
+
+/*
+ * get_index_isvalid
+ *
+ * Given the index OID, return pg_index.indisvalid.
+ */
+bool
+get_index_isvalid(Oid index_oid)
+{
+ bool isvalid;
+ HeapTuple tuple;
+ Form_pg_index rd_index;
+
+ tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for index %u", index_oid);
+
+ rd_index = (Form_pg_index) GETSTRUCT(tuple);
+ isvalid = rd_index->indisvalid;
+ ReleaseSysCache(tuple);
+
+ return isvalid;
+}
+
+/*
+ * get_index_isclustered
+ *
+ * Given the index OID, return pg_index.indisclustered.
+ */
+bool
+get_index_isclustered(Oid index_oid)
+{
+ bool isclustered;
+ HeapTuple tuple;
+ Form_pg_index rd_index;
+
+ tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for index %u", index_oid);
+
+ rd_index = (Form_pg_index) GETSTRUCT(tuple);
+ isclustered = rd_index->indisclustered;
+ ReleaseSysCache(tuple);
+
+ return isclustered;
+}
diff --git a/src/backend/utils/cache/partcache.c b/src/backend/utils/cache/partcache.c
new file mode 100644
index 0000000..afa99c5
--- /dev/null
+++ b/src/backend/utils/cache/partcache.c
@@ -0,0 +1,430 @@
+/*-------------------------------------------------------------------------
+ *
+ * partcache.c
+ * Support routines for manipulating partition information cached in
+ * relcache
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/partcache.c
+ *
+ *-------------------------------------------------------------------------
+*/
+#include "postgres.h"
+
+#include "access/hash.h"
+#include "access/htup_details.h"
+#include "access/nbtree.h"
+#include "access/relation.h"
+#include "catalog/partition.h"
+#include "catalog/pg_inherits.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_partitioned_table.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/optimizer.h"
+#include "partitioning/partbounds.h"
+#include "rewrite/rewriteHandler.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/partcache.h"
+#include "utils/rel.h"
+#include "utils/syscache.h"
+
+
+static void RelationBuildPartitionKey(Relation relation);
+static List *generate_partition_qual(Relation rel);
+
+/*
+ * RelationGetPartitionKey -- get partition key, if relation is partitioned
+ *
+ * Note: partition keys are not allowed to change after the partitioned rel
+ * is created. RelationClearRelation knows this and preserves rd_partkey
+ * across relcache rebuilds, as long as the relation is open. Therefore,
+ * even though we hand back a direct pointer into the relcache entry, it's
+ * safe for callers to continue to use that pointer as long as they hold
+ * the relation open.
+ */
+PartitionKey
+RelationGetPartitionKey(Relation rel)
+{
+ if (rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
+ return NULL;
+
+ if (unlikely(rel->rd_partkey == NULL))
+ RelationBuildPartitionKey(rel);
+
+ return rel->rd_partkey;
+}
+
+/*
+ * RelationBuildPartitionKey
+ * Build partition key data of relation, and attach to relcache
+ *
+ * Partitioning key data is a complex structure; to avoid complicated logic to
+ * free individual elements whenever the relcache entry is flushed, we give it
+ * its own memory context, a child of CacheMemoryContext, which can easily be
+ * deleted on its own. To avoid leaking memory in that context in case of an
+ * error partway through this function, the context is initially created as a
+ * child of CurTransactionContext and only re-parented to CacheMemoryContext
+ * at the end, when no further errors are possible. Also, we don't make this
+ * context the current context except in very brief code sections, out of fear
+ * that some of our callees allocate memory on their own which would be leaked
+ * permanently.
+ */
+static void
+RelationBuildPartitionKey(Relation relation)
+{
+ Form_pg_partitioned_table form;
+ HeapTuple tuple;
+ bool isnull;
+ int i;
+ PartitionKey key;
+ AttrNumber *attrs;
+ oidvector *opclass;
+ oidvector *collation;
+ ListCell *partexprs_item;
+ Datum datum;
+ MemoryContext partkeycxt,
+ oldcxt;
+ int16 procnum;
+
+ tuple = SearchSysCache1(PARTRELID,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for partition key of relation %u",
+ RelationGetRelid(relation));
+
+ partkeycxt = AllocSetContextCreate(CurTransactionContext,
+ "partition key",
+ ALLOCSET_SMALL_SIZES);
+ MemoryContextCopyAndSetIdentifier(partkeycxt,
+ RelationGetRelationName(relation));
+
+ key = (PartitionKey) MemoryContextAllocZero(partkeycxt,
+ sizeof(PartitionKeyData));
+
+ /* Fixed-length attributes */
+ form = (Form_pg_partitioned_table) GETSTRUCT(tuple);
+ key->strategy = form->partstrat;
+ key->partnatts = form->partnatts;
+
+ /*
+ * We can rely on the first variable-length attribute being mapped to the
+ * relevant field of the catalog's C struct, because all previous
+ * attributes are non-nullable and fixed-length.
+ */
+ attrs = form->partattrs.values;
+
+ /* But use the hard way to retrieve further variable-length attributes */
+ /* Operator class */
+ datum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partclass, &isnull);
+ Assert(!isnull);
+ opclass = (oidvector *) DatumGetPointer(datum);
+
+ /* Collation */
+ datum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partcollation, &isnull);
+ Assert(!isnull);
+ collation = (oidvector *) DatumGetPointer(datum);
+
+ /* Expressions */
+ datum = SysCacheGetAttr(PARTRELID, tuple,
+ Anum_pg_partitioned_table_partexprs, &isnull);
+ if (!isnull)
+ {
+ char *exprString;
+ Node *expr;
+
+ exprString = TextDatumGetCString(datum);
+ expr = stringToNode(exprString);
+ pfree(exprString);
+
+ /*
+ * Run the expressions through const-simplification since the planner
+ * will be comparing them to similarly-processed qual clause operands,
+ * and may fail to detect valid matches without this step; fix
+ * opfuncids while at it. We don't need to bother with
+ * canonicalize_qual() though, because partition expressions should be
+ * in canonical form already (ie, no need for OR-merging or constant
+ * elimination).
+ */
+ expr = eval_const_expressions(NULL, expr);
+ fix_opfuncids(expr);
+
+ oldcxt = MemoryContextSwitchTo(partkeycxt);
+ key->partexprs = (List *) copyObject(expr);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /* Allocate assorted arrays in the partkeycxt, which we'll fill below */
+ oldcxt = MemoryContextSwitchTo(partkeycxt);
+ key->partattrs = (AttrNumber *) palloc0(key->partnatts * sizeof(AttrNumber));
+ key->partopfamily = (Oid *) palloc0(key->partnatts * sizeof(Oid));
+ key->partopcintype = (Oid *) palloc0(key->partnatts * sizeof(Oid));
+ key->partsupfunc = (FmgrInfo *) palloc0(key->partnatts * sizeof(FmgrInfo));
+
+ key->partcollation = (Oid *) palloc0(key->partnatts * sizeof(Oid));
+ key->parttypid = (Oid *) palloc0(key->partnatts * sizeof(Oid));
+ key->parttypmod = (int32 *) palloc0(key->partnatts * sizeof(int32));
+ key->parttyplen = (int16 *) palloc0(key->partnatts * sizeof(int16));
+ key->parttypbyval = (bool *) palloc0(key->partnatts * sizeof(bool));
+ key->parttypalign = (char *) palloc0(key->partnatts * sizeof(char));
+ key->parttypcoll = (Oid *) palloc0(key->partnatts * sizeof(Oid));
+ MemoryContextSwitchTo(oldcxt);
+
+ /* determine support function number to search for */
+ procnum = (key->strategy == PARTITION_STRATEGY_HASH) ?
+ HASHEXTENDED_PROC : BTORDER_PROC;
+
+ /* Copy partattrs and fill other per-attribute info */
+ memcpy(key->partattrs, attrs, key->partnatts * sizeof(int16));
+ partexprs_item = list_head(key->partexprs);
+ for (i = 0; i < key->partnatts; i++)
+ {
+ AttrNumber attno = key->partattrs[i];
+ HeapTuple opclasstup;
+ Form_pg_opclass opclassform;
+ Oid funcid;
+
+ /* Collect opfamily information */
+ opclasstup = SearchSysCache1(CLAOID,
+ ObjectIdGetDatum(opclass->values[i]));
+ if (!HeapTupleIsValid(opclasstup))
+ elog(ERROR, "cache lookup failed for opclass %u", opclass->values[i]);
+
+ opclassform = (Form_pg_opclass) GETSTRUCT(opclasstup);
+ key->partopfamily[i] = opclassform->opcfamily;
+ key->partopcintype[i] = opclassform->opcintype;
+
+ /* Get a support function for the specified opfamily and datatypes */
+ funcid = get_opfamily_proc(opclassform->opcfamily,
+ opclassform->opcintype,
+ opclassform->opcintype,
+ procnum);
+ if (!OidIsValid(funcid))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+ errmsg("operator class \"%s\" of access method %s is missing support function %d for type %s",
+ NameStr(opclassform->opcname),
+ (key->strategy == PARTITION_STRATEGY_HASH) ?
+ "hash" : "btree",
+ procnum,
+ format_type_be(opclassform->opcintype))));
+
+ fmgr_info_cxt(funcid, &key->partsupfunc[i], partkeycxt);
+
+ /* Collation */
+ key->partcollation[i] = collation->values[i];
+
+ /* Collect type information */
+ if (attno != 0)
+ {
+ Form_pg_attribute att = TupleDescAttr(relation->rd_att, attno - 1);
+
+ key->parttypid[i] = att->atttypid;
+ key->parttypmod[i] = att->atttypmod;
+ key->parttypcoll[i] = att->attcollation;
+ }
+ else
+ {
+ if (partexprs_item == NULL)
+ elog(ERROR, "wrong number of partition key expressions");
+
+ key->parttypid[i] = exprType(lfirst(partexprs_item));
+ key->parttypmod[i] = exprTypmod(lfirst(partexprs_item));
+ key->parttypcoll[i] = exprCollation(lfirst(partexprs_item));
+
+ partexprs_item = lnext(key->partexprs, partexprs_item);
+ }
+ get_typlenbyvalalign(key->parttypid[i],
+ &key->parttyplen[i],
+ &key->parttypbyval[i],
+ &key->parttypalign[i]);
+
+ ReleaseSysCache(opclasstup);
+ }
+
+ ReleaseSysCache(tuple);
+
+ /* Assert that we're not leaking any old data during assignments below */
+ Assert(relation->rd_partkeycxt == NULL);
+ Assert(relation->rd_partkey == NULL);
+
+ /*
+ * Success --- reparent our context and make the relcache point to the
+ * newly constructed key
+ */
+ MemoryContextSetParent(partkeycxt, CacheMemoryContext);
+ relation->rd_partkeycxt = partkeycxt;
+ relation->rd_partkey = key;
+}
+
+/*
+ * RelationGetPartitionQual
+ *
+ * Returns a list of partition quals
+ */
+List *
+RelationGetPartitionQual(Relation rel)
+{
+ /* Quick exit */
+ if (!rel->rd_rel->relispartition)
+ return NIL;
+
+ return generate_partition_qual(rel);
+}
+
+/*
+ * get_partition_qual_relid
+ *
+ * Returns an expression tree describing the passed-in relation's partition
+ * constraint.
+ *
+ * If the relation is not found, or is not a partition, or there is no
+ * partition constraint, return NULL. We must guard against the first two
+ * cases because this supports a SQL function that could be passed any OID.
+ * The last case can happen even if relispartition is true, when a default
+ * partition is the only partition.
+ */
+Expr *
+get_partition_qual_relid(Oid relid)
+{
+ Expr *result = NULL;
+
+ /* Do the work only if this relation exists and is a partition. */
+ if (get_rel_relispartition(relid))
+ {
+ Relation rel = relation_open(relid, AccessShareLock);
+ List *and_args;
+
+ and_args = generate_partition_qual(rel);
+
+ /* Convert implicit-AND list format to boolean expression */
+ if (and_args == NIL)
+ result = NULL;
+ else if (list_length(and_args) > 1)
+ result = makeBoolExpr(AND_EXPR, and_args, -1);
+ else
+ result = linitial(and_args);
+
+ /* Keep the lock, to allow safe deparsing against the rel by caller. */
+ relation_close(rel, NoLock);
+ }
+
+ return result;
+}
+
+/*
+ * generate_partition_qual
+ *
+ * Generate partition predicate from rel's partition bound expression. The
+ * function returns a NIL list if there is no predicate.
+ *
+ * We cache a copy of the result in the relcache entry, after constructing
+ * it using the caller's context. This approach avoids leaking any data
+ * into long-lived cache contexts, especially if we fail partway through.
+ */
+static List *
+generate_partition_qual(Relation rel)
+{
+ HeapTuple tuple;
+ MemoryContext oldcxt;
+ Datum boundDatum;
+ bool isnull;
+ List *my_qual = NIL,
+ *result = NIL;
+ Oid parentrelid;
+ Relation parent;
+
+ /* Guard against stack overflow due to overly deep partition tree */
+ check_stack_depth();
+
+ /* If we already cached the result, just return a copy */
+ if (rel->rd_partcheckvalid)
+ return copyObject(rel->rd_partcheck);
+
+ /*
+ * Grab at least an AccessShareLock on the parent table. Must do this
+ * even if the partition has been partially detached, because transactions
+ * concurrent with the detach might still be trying to use a partition
+ * descriptor that includes it.
+ */
+ parentrelid = get_partition_parent(RelationGetRelid(rel), true);
+ parent = relation_open(parentrelid, AccessShareLock);
+
+ /* Get pg_class.relpartbound */
+ tuple = SearchSysCache1(RELOID, RelationGetRelid(rel));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for relation %u",
+ RelationGetRelid(rel));
+
+ boundDatum = SysCacheGetAttr(RELOID, tuple,
+ Anum_pg_class_relpartbound,
+ &isnull);
+ if (!isnull)
+ {
+ PartitionBoundSpec *bound;
+
+ bound = castNode(PartitionBoundSpec,
+ stringToNode(TextDatumGetCString(boundDatum)));
+
+ my_qual = get_qual_from_partbound(parent, bound);
+ }
+
+ ReleaseSysCache(tuple);
+
+ /* Add the parent's quals to the list (if any) */
+ if (parent->rd_rel->relispartition)
+ result = list_concat(generate_partition_qual(parent), my_qual);
+ else
+ result = my_qual;
+
+ /*
+ * Change Vars to have partition's attnos instead of the parent's. We do
+ * this after we concatenate the parent's quals, because we want every Var
+ * in it to bear this relation's attnos. It's safe to assume varno = 1
+ * here.
+ */
+ result = map_partition_varattnos(result, 1, rel, parent);
+
+ /* Assert that we're not leaking any old data during assignments below */
+ Assert(rel->rd_partcheckcxt == NULL);
+ Assert(rel->rd_partcheck == NIL);
+
+ /*
+ * Save a copy in the relcache. The order of these operations is fairly
+ * critical to avoid memory leaks and ensure that we don't leave a corrupt
+ * relcache entry if we fail partway through copyObject.
+ *
+ * If, as is definitely possible, the partcheck list is NIL, then we do
+ * not need to make a context to hold it.
+ */
+ if (result != NIL)
+ {
+ rel->rd_partcheckcxt = AllocSetContextCreate(CacheMemoryContext,
+ "partition constraint",
+ ALLOCSET_SMALL_SIZES);
+ MemoryContextCopyAndSetIdentifier(rel->rd_partcheckcxt,
+ RelationGetRelationName(rel));
+ oldcxt = MemoryContextSwitchTo(rel->rd_partcheckcxt);
+ rel->rd_partcheck = copyObject(result);
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else
+ rel->rd_partcheck = NIL;
+ rel->rd_partcheckvalid = true;
+
+ /* Keep the parent locked until commit */
+ relation_close(parent, NoLock);
+
+ /* Return the working copy to the caller */
+ return result;
+}
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c
new file mode 100644
index 0000000..6b9b36f
--- /dev/null
+++ b/src/backend/utils/cache/plancache.c
@@ -0,0 +1,2196 @@
+/*-------------------------------------------------------------------------
+ *
+ * plancache.c
+ * Plan cache management.
+ *
+ * The plan cache manager has two principal responsibilities: deciding when
+ * to use a generic plan versus a custom (parameter-value-specific) plan,
+ * and tracking whether cached plans need to be invalidated because of schema
+ * changes in the objects they depend on.
+ *
+ * The logic for choosing generic or custom plans is in choose_custom_plan,
+ * which see for comments.
+ *
+ * Cache invalidation is driven off sinval events. Any CachedPlanSource
+ * that matches the event is marked invalid, as is its generic CachedPlan
+ * if it has one. When (and if) the next demand for a cached plan occurs,
+ * parse analysis and rewrite is repeated to build a new valid query tree,
+ * and then planning is performed as normal. We also force re-analysis and
+ * re-planning if the active search_path is different from the previous time
+ * or, if RLS is involved, if the user changes or the RLS environment changes.
+ *
+ * Note that if the sinval was a result of user DDL actions, parse analysis
+ * could throw an error, for example if a column referenced by the query is
+ * no longer present. Another possibility is for the query's output tupdesc
+ * to change (for instance "SELECT *" might expand differently than before).
+ * The creator of a cached plan can specify whether it is allowable for the
+ * query to change output tupdesc on replan --- if so, it's up to the
+ * caller to notice changes and cope with them.
+ *
+ * Currently, we track exactly the dependencies of plans on relations,
+ * user-defined functions, and domains. On relcache invalidation events or
+ * pg_proc or pg_type syscache invalidation events, we invalidate just those
+ * plans that depend on the particular object being modified. (Note: this
+ * scheme assumes that any table modification that requires replanning will
+ * generate a relcache inval event.) We also watch for inval events on
+ * certain other system catalogs, such as pg_namespace; but for them, our
+ * response is just to invalidate all plans. We expect updates on those
+ * catalogs to be infrequent enough that more-detailed tracking is not worth
+ * the effort.
+ *
+ * In addition to full-fledged query plans, we provide a facility for
+ * detecting invalidations of simple scalar expressions. This is fairly
+ * bare-bones; it's the caller's responsibility to build a new expression
+ * if the old one gets invalidated.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/plancache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/transam.h"
+#include "catalog/namespace.h"
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/optimizer.h"
+#include "parser/analyze.h"
+#include "parser/parsetree.h"
+#include "storage/lmgr.h"
+#include "tcop/pquery.h"
+#include "tcop/utility.h"
+#include "utils/inval.h"
+#include "utils/memutils.h"
+#include "utils/resowner_private.h"
+#include "utils/rls.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+
+/*
+ * We must skip "overhead" operations that involve database access when the
+ * cached plan's subject statement is a transaction control command or one
+ * that requires a snapshot not to be set yet (such as SET or LOCK). More
+ * generally, statements that do not require parse analysis/rewrite/plan
+ * activity never need to be revalidated, so we can treat them all like that.
+ * For the convenience of postgres.c, treat empty statements that way too.
+ */
+#define StmtPlanRequiresRevalidation(plansource) \
+ ((plansource)->raw_parse_tree != NULL && \
+ stmt_requires_parse_analysis((plansource)->raw_parse_tree))
+
+/*
+ * This is the head of the backend's list of "saved" CachedPlanSources (i.e.,
+ * those that are in long-lived storage and are examined for sinval events).
+ * We use a dlist instead of separate List cells so that we can guarantee
+ * to save a CachedPlanSource without error.
+ */
+static dlist_head saved_plan_list = DLIST_STATIC_INIT(saved_plan_list);
+
+/*
+ * This is the head of the backend's list of CachedExpressions.
+ */
+static dlist_head cached_expression_list = DLIST_STATIC_INIT(cached_expression_list);
+
+static void ReleaseGenericPlan(CachedPlanSource *plansource);
+static List *RevalidateCachedQuery(CachedPlanSource *plansource,
+ QueryEnvironment *queryEnv);
+static bool CheckCachedPlan(CachedPlanSource *plansource);
+static CachedPlan *BuildCachedPlan(CachedPlanSource *plansource, List *qlist,
+ ParamListInfo boundParams, QueryEnvironment *queryEnv);
+static bool choose_custom_plan(CachedPlanSource *plansource,
+ ParamListInfo boundParams);
+static double cached_plan_cost(CachedPlan *plan, bool include_planner);
+static Query *QueryListGetPrimaryStmt(List *stmts);
+static void AcquireExecutorLocks(List *stmt_list, bool acquire);
+static void AcquirePlannerLocks(List *stmt_list, bool acquire);
+static void ScanQueryForLocks(Query *parsetree, bool acquire);
+static bool ScanQueryWalker(Node *node, bool *acquire);
+static TupleDesc PlanCacheComputeResultDesc(List *stmt_list);
+static void PlanCacheRelCallback(Datum arg, Oid relid);
+static void PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void PlanCacheSysCallback(Datum arg, int cacheid, uint32 hashvalue);
+
+/* GUC parameter */
+int plan_cache_mode;
+
+/*
+ * InitPlanCache: initialize module during InitPostgres.
+ *
+ * All we need to do is hook into inval.c's callback lists.
+ */
+void
+InitPlanCache(void)
+{
+ CacheRegisterRelcacheCallback(PlanCacheRelCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(PROCOID, PlanCacheObjectCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(TYPEOID, PlanCacheObjectCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(NAMESPACEOID, PlanCacheSysCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(OPEROID, PlanCacheSysCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(AMOPOPID, PlanCacheSysCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(FOREIGNSERVEROID, PlanCacheSysCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(FOREIGNDATAWRAPPEROID, PlanCacheSysCallback, (Datum) 0);
+}
+
+/*
+ * CreateCachedPlan: initially create a plan cache entry.
+ *
+ * Creation of a cached plan is divided into two steps, CreateCachedPlan and
+ * CompleteCachedPlan. CreateCachedPlan should be called after running the
+ * query through raw_parser, but before doing parse analysis and rewrite;
+ * CompleteCachedPlan is called after that. The reason for this arrangement
+ * is that it can save one round of copying of the raw parse tree, since
+ * the parser will normally scribble on the raw parse tree. Callers would
+ * otherwise need to make an extra copy of the parse tree to ensure they
+ * still had a clean copy to present at plan cache creation time.
+ *
+ * All arguments presented to CreateCachedPlan are copied into a memory
+ * context created as a child of the call-time CurrentMemoryContext, which
+ * should be a reasonably short-lived working context that will go away in
+ * event of an error. This ensures that the cached plan data structure will
+ * likewise disappear if an error occurs before we have fully constructed it.
+ * Once constructed, the cached plan can be made longer-lived, if needed,
+ * by calling SaveCachedPlan.
+ *
+ * raw_parse_tree: output of raw_parser(), or NULL if empty query
+ * query_string: original query text
+ * commandTag: command tag for query, or UNKNOWN if empty query
+ */
+CachedPlanSource *
+CreateCachedPlan(RawStmt *raw_parse_tree,
+ const char *query_string,
+ CommandTag commandTag)
+{
+ CachedPlanSource *plansource;
+ MemoryContext source_context;
+ MemoryContext oldcxt;
+
+ Assert(query_string != NULL); /* required as of 8.4 */
+
+ /*
+ * Make a dedicated memory context for the CachedPlanSource and its
+ * permanent subsidiary data. It's probably not going to be large, but
+ * just in case, allow it to grow large. Initially it's a child of the
+ * caller's context (which we assume to be transient), so that it will be
+ * cleaned up on error.
+ */
+ source_context = AllocSetContextCreate(CurrentMemoryContext,
+ "CachedPlanSource",
+ ALLOCSET_START_SMALL_SIZES);
+
+ /*
+ * Create and fill the CachedPlanSource struct within the new context.
+ * Most fields are just left empty for the moment.
+ */
+ oldcxt = MemoryContextSwitchTo(source_context);
+
+ plansource = (CachedPlanSource *) palloc0(sizeof(CachedPlanSource));
+ plansource->magic = CACHEDPLANSOURCE_MAGIC;
+ plansource->raw_parse_tree = copyObject(raw_parse_tree);
+ plansource->query_string = pstrdup(query_string);
+ MemoryContextSetIdentifier(source_context, plansource->query_string);
+ plansource->commandTag = commandTag;
+ plansource->param_types = NULL;
+ plansource->num_params = 0;
+ plansource->parserSetup = NULL;
+ plansource->parserSetupArg = NULL;
+ plansource->cursor_options = 0;
+ plansource->fixed_result = false;
+ plansource->resultDesc = NULL;
+ plansource->context = source_context;
+ plansource->query_list = NIL;
+ plansource->relationOids = NIL;
+ plansource->invalItems = NIL;
+ plansource->search_path = NULL;
+ plansource->query_context = NULL;
+ plansource->rewriteRoleId = InvalidOid;
+ plansource->rewriteRowSecurity = false;
+ plansource->dependsOnRLS = false;
+ plansource->gplan = NULL;
+ plansource->is_oneshot = false;
+ plansource->is_complete = false;
+ plansource->is_saved = false;
+ plansource->is_valid = false;
+ plansource->generation = 0;
+ plansource->generic_cost = -1;
+ plansource->total_custom_cost = 0;
+ plansource->num_generic_plans = 0;
+ plansource->num_custom_plans = 0;
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return plansource;
+}
+
+/*
+ * CreateOneShotCachedPlan: initially create a one-shot plan cache entry.
+ *
+ * This variant of CreateCachedPlan creates a plan cache entry that is meant
+ * to be used only once. No data copying occurs: all data structures remain
+ * in the caller's memory context (which typically should get cleared after
+ * completing execution). The CachedPlanSource struct itself is also created
+ * in that context.
+ *
+ * A one-shot plan cannot be saved or copied, since we make no effort to
+ * preserve the raw parse tree unmodified. There is also no support for
+ * invalidation, so plan use must be completed in the current transaction,
+ * and DDL that might invalidate the querytree_list must be avoided as well.
+ *
+ * raw_parse_tree: output of raw_parser(), or NULL if empty query
+ * query_string: original query text
+ * commandTag: command tag for query, or NULL if empty query
+ */
+CachedPlanSource *
+CreateOneShotCachedPlan(RawStmt *raw_parse_tree,
+ const char *query_string,
+ CommandTag commandTag)
+{
+ CachedPlanSource *plansource;
+
+ Assert(query_string != NULL); /* required as of 8.4 */
+
+ /*
+ * Create and fill the CachedPlanSource struct within the caller's memory
+ * context. Most fields are just left empty for the moment.
+ */
+ plansource = (CachedPlanSource *) palloc0(sizeof(CachedPlanSource));
+ plansource->magic = CACHEDPLANSOURCE_MAGIC;
+ plansource->raw_parse_tree = raw_parse_tree;
+ plansource->query_string = query_string;
+ plansource->commandTag = commandTag;
+ plansource->param_types = NULL;
+ plansource->num_params = 0;
+ plansource->parserSetup = NULL;
+ plansource->parserSetupArg = NULL;
+ plansource->cursor_options = 0;
+ plansource->fixed_result = false;
+ plansource->resultDesc = NULL;
+ plansource->context = CurrentMemoryContext;
+ plansource->query_list = NIL;
+ plansource->relationOids = NIL;
+ plansource->invalItems = NIL;
+ plansource->search_path = NULL;
+ plansource->query_context = NULL;
+ plansource->rewriteRoleId = InvalidOid;
+ plansource->rewriteRowSecurity = false;
+ plansource->dependsOnRLS = false;
+ plansource->gplan = NULL;
+ plansource->is_oneshot = true;
+ plansource->is_complete = false;
+ plansource->is_saved = false;
+ plansource->is_valid = false;
+ plansource->generation = 0;
+ plansource->generic_cost = -1;
+ plansource->total_custom_cost = 0;
+ plansource->num_generic_plans = 0;
+ plansource->num_custom_plans = 0;
+
+ return plansource;
+}
+
+/*
+ * CompleteCachedPlan: second step of creating a plan cache entry.
+ *
+ * Pass in the analyzed-and-rewritten form of the query, as well as the
+ * required subsidiary data about parameters and such. All passed values will
+ * be copied into the CachedPlanSource's memory, except as specified below.
+ * After this is called, GetCachedPlan can be called to obtain a plan, and
+ * optionally the CachedPlanSource can be saved using SaveCachedPlan.
+ *
+ * If querytree_context is not NULL, the querytree_list must be stored in that
+ * context (but the other parameters need not be). The querytree_list is not
+ * copied, rather the given context is kept as the initial query_context of
+ * the CachedPlanSource. (It should have been created as a child of the
+ * caller's working memory context, but it will now be reparented to belong
+ * to the CachedPlanSource.) The querytree_context is normally the context in
+ * which the caller did raw parsing and parse analysis. This approach saves
+ * one tree copying step compared to passing NULL, but leaves lots of extra
+ * cruft in the query_context, namely whatever extraneous stuff parse analysis
+ * created, as well as whatever went unused from the raw parse tree. Using
+ * this option is a space-for-time tradeoff that is appropriate if the
+ * CachedPlanSource is not expected to survive long.
+ *
+ * plancache.c cannot know how to copy the data referenced by parserSetupArg,
+ * and it would often be inappropriate to do so anyway. When using that
+ * option, it is caller's responsibility that the referenced data remains
+ * valid for as long as the CachedPlanSource exists.
+ *
+ * If the CachedPlanSource is a "oneshot" plan, then no querytree copying
+ * occurs at all, and querytree_context is ignored; it is caller's
+ * responsibility that the passed querytree_list is sufficiently long-lived.
+ *
+ * plansource: structure returned by CreateCachedPlan
+ * querytree_list: analyzed-and-rewritten form of query (list of Query nodes)
+ * querytree_context: memory context containing querytree_list,
+ * or NULL to copy querytree_list into a fresh context
+ * param_types: array of fixed parameter type OIDs, or NULL if none
+ * num_params: number of fixed parameters
+ * parserSetup: alternate method for handling query parameters
+ * parserSetupArg: data to pass to parserSetup
+ * cursor_options: options bitmask to pass to planner
+ * fixed_result: true to disallow future changes in query's result tupdesc
+ */
+void
+CompleteCachedPlan(CachedPlanSource *plansource,
+ List *querytree_list,
+ MemoryContext querytree_context,
+ Oid *param_types,
+ int num_params,
+ ParserSetupHook parserSetup,
+ void *parserSetupArg,
+ int cursor_options,
+ bool fixed_result)
+{
+ MemoryContext source_context = plansource->context;
+ MemoryContext oldcxt = CurrentMemoryContext;
+
+ /* Assert caller is doing things in a sane order */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(!plansource->is_complete);
+
+ /*
+ * If caller supplied a querytree_context, reparent it underneath the
+ * CachedPlanSource's context; otherwise, create a suitable context and
+ * copy the querytree_list into it. But no data copying should be done
+ * for one-shot plans; for those, assume the passed querytree_list is
+ * sufficiently long-lived.
+ */
+ if (plansource->is_oneshot)
+ {
+ querytree_context = CurrentMemoryContext;
+ }
+ else if (querytree_context != NULL)
+ {
+ MemoryContextSetParent(querytree_context, source_context);
+ MemoryContextSwitchTo(querytree_context);
+ }
+ else
+ {
+ /* Again, it's a good bet the querytree_context can be small */
+ querytree_context = AllocSetContextCreate(source_context,
+ "CachedPlanQuery",
+ ALLOCSET_START_SMALL_SIZES);
+ MemoryContextSwitchTo(querytree_context);
+ querytree_list = copyObject(querytree_list);
+ }
+
+ plansource->query_context = querytree_context;
+ plansource->query_list = querytree_list;
+
+ if (!plansource->is_oneshot && StmtPlanRequiresRevalidation(plansource))
+ {
+ /*
+ * Use the planner machinery to extract dependencies. Data is saved
+ * in query_context. (We assume that not a lot of extra cruft is
+ * created by this call.) We can skip this for one-shot plans, and
+ * plans not needing revalidation have no such dependencies anyway.
+ */
+ extract_query_dependencies((Node *) querytree_list,
+ &plansource->relationOids,
+ &plansource->invalItems,
+ &plansource->dependsOnRLS);
+
+ /* Update RLS info as well. */
+ plansource->rewriteRoleId = GetUserId();
+ plansource->rewriteRowSecurity = row_security;
+
+ /*
+ * Also save the current search_path in the query_context. (This
+ * should not generate much extra cruft either, since almost certainly
+ * the path is already valid.) Again, we don't really need this for
+ * one-shot plans; and we *must* skip this for transaction control
+ * commands, because this could result in catalog accesses.
+ */
+ plansource->search_path = GetOverrideSearchPath(querytree_context);
+ }
+
+ /*
+ * Save the final parameter types (or other parameter specification data)
+ * into the source_context, as well as our other parameters. Also save
+ * the result tuple descriptor.
+ */
+ MemoryContextSwitchTo(source_context);
+
+ if (num_params > 0)
+ {
+ plansource->param_types = (Oid *) palloc(num_params * sizeof(Oid));
+ memcpy(plansource->param_types, param_types, num_params * sizeof(Oid));
+ }
+ else
+ plansource->param_types = NULL;
+ plansource->num_params = num_params;
+ plansource->parserSetup = parserSetup;
+ plansource->parserSetupArg = parserSetupArg;
+ plansource->cursor_options = cursor_options;
+ plansource->fixed_result = fixed_result;
+ plansource->resultDesc = PlanCacheComputeResultDesc(querytree_list);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ plansource->is_complete = true;
+ plansource->is_valid = true;
+}
+
+/*
+ * SaveCachedPlan: save a cached plan permanently
+ *
+ * This function moves the cached plan underneath CacheMemoryContext (making
+ * it live for the life of the backend, unless explicitly dropped), and adds
+ * it to the list of cached plans that are checked for invalidation when an
+ * sinval event occurs.
+ *
+ * This is guaranteed not to throw error, except for the caller-error case
+ * of trying to save a one-shot plan. Callers typically depend on that
+ * since this is called just before or just after adding a pointer to the
+ * CachedPlanSource to some permanent data structure of their own. Up until
+ * this is done, a CachedPlanSource is just transient data that will go away
+ * automatically on transaction abort.
+ */
+void
+SaveCachedPlan(CachedPlanSource *plansource)
+{
+ /* Assert caller is doing things in a sane order */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plansource->is_complete);
+ Assert(!plansource->is_saved);
+
+ /* This seems worth a real test, though */
+ if (plansource->is_oneshot)
+ elog(ERROR, "cannot save one-shot cached plan");
+
+ /*
+ * In typical use, this function would be called before generating any
+ * plans from the CachedPlanSource. If there is a generic plan, moving it
+ * into CacheMemoryContext would be pretty risky since it's unclear
+ * whether the caller has taken suitable care with making references
+ * long-lived. Best thing to do seems to be to discard the plan.
+ */
+ ReleaseGenericPlan(plansource);
+
+ /*
+ * Reparent the source memory context under CacheMemoryContext so that it
+ * will live indefinitely. The query_context follows along since it's
+ * already a child of the other one.
+ */
+ MemoryContextSetParent(plansource->context, CacheMemoryContext);
+
+ /*
+ * Add the entry to the global list of cached plans.
+ */
+ dlist_push_tail(&saved_plan_list, &plansource->node);
+
+ plansource->is_saved = true;
+}
+
+/*
+ * DropCachedPlan: destroy a cached plan.
+ *
+ * Actually this only destroys the CachedPlanSource: any referenced CachedPlan
+ * is released, but not destroyed until its refcount goes to zero. That
+ * handles the situation where DropCachedPlan is called while the plan is
+ * still in use.
+ */
+void
+DropCachedPlan(CachedPlanSource *plansource)
+{
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /* If it's been saved, remove it from the list */
+ if (plansource->is_saved)
+ {
+ dlist_delete(&plansource->node);
+ plansource->is_saved = false;
+ }
+
+ /* Decrement generic CachedPlan's refcount and drop if no longer needed */
+ ReleaseGenericPlan(plansource);
+
+ /* Mark it no longer valid */
+ plansource->magic = 0;
+
+ /*
+ * Remove the CachedPlanSource and all subsidiary data (including the
+ * query_context if any). But if it's a one-shot we can't free anything.
+ */
+ if (!plansource->is_oneshot)
+ MemoryContextDelete(plansource->context);
+}
+
+/*
+ * ReleaseGenericPlan: release a CachedPlanSource's generic plan, if any.
+ */
+static void
+ReleaseGenericPlan(CachedPlanSource *plansource)
+{
+ /* Be paranoid about the possibility that ReleaseCachedPlan fails */
+ if (plansource->gplan)
+ {
+ CachedPlan *plan = plansource->gplan;
+
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ plansource->gplan = NULL;
+ ReleaseCachedPlan(plan, NULL);
+ }
+}
+
+/*
+ * RevalidateCachedQuery: ensure validity of analyzed-and-rewritten query tree.
+ *
+ * What we do here is re-acquire locks and redo parse analysis if necessary.
+ * On return, the query_list is valid and we have sufficient locks to begin
+ * planning.
+ *
+ * If any parse analysis activity is required, the caller's memory context is
+ * used for that work.
+ *
+ * The result value is the transient analyzed-and-rewritten query tree if we
+ * had to do re-analysis, and NIL otherwise. (This is returned just to save
+ * a tree copying step in a subsequent BuildCachedPlan call.)
+ */
+static List *
+RevalidateCachedQuery(CachedPlanSource *plansource,
+ QueryEnvironment *queryEnv)
+{
+ bool snapshot_set;
+ RawStmt *rawtree;
+ List *tlist; /* transient query-tree list */
+ List *qlist; /* permanent query-tree list */
+ TupleDesc resultDesc;
+ MemoryContext querytree_context;
+ MemoryContext oldcxt;
+
+ /*
+ * For one-shot plans, we do not support revalidation checking; it's
+ * assumed the query is parsed, planned, and executed in one transaction,
+ * so that no lock re-acquisition is necessary. Also, if the statement
+ * type can't require revalidation, we needn't do anything (and we mustn't
+ * risk catalog accesses when handling, eg, transaction control commands).
+ */
+ if (plansource->is_oneshot || !StmtPlanRequiresRevalidation(plansource))
+ {
+ Assert(plansource->is_valid);
+ return NIL;
+ }
+
+ /*
+ * If the query is currently valid, we should have a saved search_path ---
+ * check to see if that matches the current environment. If not, we want
+ * to force replan.
+ */
+ if (plansource->is_valid)
+ {
+ Assert(plansource->search_path != NULL);
+ if (!OverrideSearchPathMatchesCurrent(plansource->search_path))
+ {
+ /* Invalidate the querytree and generic plan */
+ plansource->is_valid = false;
+ if (plansource->gplan)
+ plansource->gplan->is_valid = false;
+ }
+ }
+
+ /*
+ * If the query rewrite phase had a possible RLS dependency, we must redo
+ * it if either the role or the row_security setting has changed.
+ */
+ if (plansource->is_valid && plansource->dependsOnRLS &&
+ (plansource->rewriteRoleId != GetUserId() ||
+ plansource->rewriteRowSecurity != row_security))
+ plansource->is_valid = false;
+
+ /*
+ * If the query is currently valid, acquire locks on the referenced
+ * objects; then check again. We need to do it this way to cover the race
+ * condition that an invalidation message arrives before we get the locks.
+ */
+ if (plansource->is_valid)
+ {
+ AcquirePlannerLocks(plansource->query_list, true);
+
+ /*
+ * By now, if any invalidation has happened, the inval callback
+ * functions will have marked the query invalid.
+ */
+ if (plansource->is_valid)
+ {
+ /* Successfully revalidated and locked the query. */
+ return NIL;
+ }
+
+ /* Oops, the race case happened. Release useless locks. */
+ AcquirePlannerLocks(plansource->query_list, false);
+ }
+
+ /*
+ * Discard the no-longer-useful query tree. (Note: we don't want to do
+ * this any earlier, else we'd not have been able to release locks
+ * correctly in the race condition case.)
+ */
+ plansource->is_valid = false;
+ plansource->query_list = NIL;
+ plansource->relationOids = NIL;
+ plansource->invalItems = NIL;
+ plansource->search_path = NULL;
+
+ /*
+ * Free the query_context. We don't really expect MemoryContextDelete to
+ * fail, but just in case, make sure the CachedPlanSource is left in a
+ * reasonably sane state. (The generic plan won't get unlinked yet, but
+ * that's acceptable.)
+ */
+ if (plansource->query_context)
+ {
+ MemoryContext qcxt = plansource->query_context;
+
+ plansource->query_context = NULL;
+ MemoryContextDelete(qcxt);
+ }
+
+ /* Drop the generic plan reference if any */
+ ReleaseGenericPlan(plansource);
+
+ /*
+ * Now re-do parse analysis and rewrite. This not incidentally acquires
+ * the locks we need to do planning safely.
+ */
+ Assert(plansource->is_complete);
+
+ /*
+ * If a snapshot is already set (the normal case), we can just use that
+ * for parsing/planning. But if it isn't, install one. Note: no point in
+ * checking whether parse analysis requires a snapshot; utility commands
+ * don't have invalidatable plans, so we'd not get here for such a
+ * command.
+ */
+ snapshot_set = false;
+ if (!ActiveSnapshotSet())
+ {
+ PushActiveSnapshot(GetTransactionSnapshot());
+ snapshot_set = true;
+ }
+
+ /*
+ * Run parse analysis and rule rewriting. The parser tends to scribble on
+ * its input, so we must copy the raw parse tree to prevent corruption of
+ * the cache.
+ */
+ rawtree = copyObject(plansource->raw_parse_tree);
+ if (rawtree == NULL)
+ tlist = NIL;
+ else if (plansource->parserSetup != NULL)
+ tlist = pg_analyze_and_rewrite_withcb(rawtree,
+ plansource->query_string,
+ plansource->parserSetup,
+ plansource->parserSetupArg,
+ queryEnv);
+ else
+ tlist = pg_analyze_and_rewrite_fixedparams(rawtree,
+ plansource->query_string,
+ plansource->param_types,
+ plansource->num_params,
+ queryEnv);
+
+ /* Release snapshot if we got one */
+ if (snapshot_set)
+ PopActiveSnapshot();
+
+ /*
+ * Check or update the result tupdesc. XXX should we use a weaker
+ * condition than equalTupleDescs() here?
+ *
+ * We assume the parameter types didn't change from the first time, so no
+ * need to update that.
+ */
+ resultDesc = PlanCacheComputeResultDesc(tlist);
+ if (resultDesc == NULL && plansource->resultDesc == NULL)
+ {
+ /* OK, doesn't return tuples */
+ }
+ else if (resultDesc == NULL || plansource->resultDesc == NULL ||
+ !equalTupleDescs(resultDesc, plansource->resultDesc))
+ {
+ /* can we give a better error message? */
+ if (plansource->fixed_result)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cached plan must not change result type")));
+ oldcxt = MemoryContextSwitchTo(plansource->context);
+ if (resultDesc)
+ resultDesc = CreateTupleDescCopy(resultDesc);
+ if (plansource->resultDesc)
+ FreeTupleDesc(plansource->resultDesc);
+ plansource->resultDesc = resultDesc;
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /*
+ * Allocate new query_context and copy the completed querytree into it.
+ * It's transient until we complete the copying and dependency extraction.
+ */
+ querytree_context = AllocSetContextCreate(CurrentMemoryContext,
+ "CachedPlanQuery",
+ ALLOCSET_START_SMALL_SIZES);
+ oldcxt = MemoryContextSwitchTo(querytree_context);
+
+ qlist = copyObject(tlist);
+
+ /*
+ * Use the planner machinery to extract dependencies. Data is saved in
+ * query_context. (We assume that not a lot of extra cruft is created by
+ * this call.)
+ */
+ extract_query_dependencies((Node *) qlist,
+ &plansource->relationOids,
+ &plansource->invalItems,
+ &plansource->dependsOnRLS);
+
+ /* Update RLS info as well. */
+ plansource->rewriteRoleId = GetUserId();
+ plansource->rewriteRowSecurity = row_security;
+
+ /*
+ * Also save the current search_path in the query_context. (This should
+ * not generate much extra cruft either, since almost certainly the path
+ * is already valid.)
+ */
+ plansource->search_path = GetOverrideSearchPath(querytree_context);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Now reparent the finished query_context and save the links */
+ MemoryContextSetParent(querytree_context, plansource->context);
+
+ plansource->query_context = querytree_context;
+ plansource->query_list = qlist;
+
+ /*
+ * Note: we do not reset generic_cost or total_custom_cost, although we
+ * could choose to do so. If the DDL or statistics change that prompted
+ * the invalidation meant a significant change in the cost estimates, it
+ * would be better to reset those variables and start fresh; but often it
+ * doesn't, and we're better retaining our hard-won knowledge about the
+ * relative costs.
+ */
+
+ plansource->is_valid = true;
+
+ /* Return transient copy of querytrees for possible use in planning */
+ return tlist;
+}
+
+/*
+ * CheckCachedPlan: see if the CachedPlanSource's generic plan is valid.
+ *
+ * Caller must have already called RevalidateCachedQuery to verify that the
+ * querytree is up to date.
+ *
+ * On a "true" return, we have acquired the locks needed to run the plan.
+ * (We must do this for the "true" result to be race-condition-free.)
+ */
+static bool
+CheckCachedPlan(CachedPlanSource *plansource)
+{
+ CachedPlan *plan = plansource->gplan;
+
+ /* Assert that caller checked the querytree */
+ Assert(plansource->is_valid);
+
+ /* If there's no generic plan, just say "false" */
+ if (!plan)
+ return false;
+
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ /* Generic plans are never one-shot */
+ Assert(!plan->is_oneshot);
+
+ /*
+ * If plan isn't valid for current role, we can't use it.
+ */
+ if (plan->is_valid && plan->dependsOnRole &&
+ plan->planRoleId != GetUserId())
+ plan->is_valid = false;
+
+ /*
+ * If it appears valid, acquire locks and recheck; this is much the same
+ * logic as in RevalidateCachedQuery, but for a plan.
+ */
+ if (plan->is_valid)
+ {
+ /*
+ * Plan must have positive refcount because it is referenced by
+ * plansource; so no need to fear it disappears under us here.
+ */
+ Assert(plan->refcount > 0);
+
+ AcquireExecutorLocks(plan->stmt_list, true);
+
+ /*
+ * If plan was transient, check to see if TransactionXmin has
+ * advanced, and if so invalidate it.
+ */
+ if (plan->is_valid &&
+ TransactionIdIsValid(plan->saved_xmin) &&
+ !TransactionIdEquals(plan->saved_xmin, TransactionXmin))
+ plan->is_valid = false;
+
+ /*
+ * By now, if any invalidation has happened, the inval callback
+ * functions will have marked the plan invalid.
+ */
+ if (plan->is_valid)
+ {
+ /* Successfully revalidated and locked the query. */
+ return true;
+ }
+
+ /* Oops, the race case happened. Release useless locks. */
+ AcquireExecutorLocks(plan->stmt_list, false);
+ }
+
+ /*
+ * Plan has been invalidated, so unlink it from the parent and release it.
+ */
+ ReleaseGenericPlan(plansource);
+
+ return false;
+}
+
+/*
+ * BuildCachedPlan: construct a new CachedPlan from a CachedPlanSource.
+ *
+ * qlist should be the result value from a previous RevalidateCachedQuery,
+ * or it can be set to NIL if we need to re-copy the plansource's query_list.
+ *
+ * To build a generic, parameter-value-independent plan, pass NULL for
+ * boundParams. To build a custom plan, pass the actual parameter values via
+ * boundParams. For best effect, the PARAM_FLAG_CONST flag should be set on
+ * each parameter value; otherwise the planner will treat the value as a
+ * hint rather than a hard constant.
+ *
+ * Planning work is done in the caller's memory context. The finished plan
+ * is in a child memory context, which typically should get reparented
+ * (unless this is a one-shot plan, in which case we don't copy the plan).
+ */
+static CachedPlan *
+BuildCachedPlan(CachedPlanSource *plansource, List *qlist,
+ ParamListInfo boundParams, QueryEnvironment *queryEnv)
+{
+ CachedPlan *plan;
+ List *plist;
+ bool snapshot_set;
+ bool is_transient;
+ MemoryContext plan_context;
+ MemoryContext oldcxt = CurrentMemoryContext;
+ ListCell *lc;
+
+ /*
+ * Normally the querytree should be valid already, but if it's not,
+ * rebuild it.
+ *
+ * NOTE: GetCachedPlan should have called RevalidateCachedQuery first, so
+ * we ought to be holding sufficient locks to prevent any invalidation.
+ * However, if we're building a custom plan after having built and
+ * rejected a generic plan, it's possible to reach here with is_valid
+ * false due to an invalidation while making the generic plan. In theory
+ * the invalidation must be a false positive, perhaps a consequence of an
+ * sinval reset event or the debug_discard_caches code. But for safety,
+ * let's treat it as real and redo the RevalidateCachedQuery call.
+ */
+ if (!plansource->is_valid)
+ qlist = RevalidateCachedQuery(plansource, queryEnv);
+
+ /*
+ * If we don't already have a copy of the querytree list that can be
+ * scribbled on by the planner, make one. For a one-shot plan, we assume
+ * it's okay to scribble on the original query_list.
+ */
+ if (qlist == NIL)
+ {
+ if (!plansource->is_oneshot)
+ qlist = copyObject(plansource->query_list);
+ else
+ qlist = plansource->query_list;
+ }
+
+ /*
+ * If a snapshot is already set (the normal case), we can just use that
+ * for planning. But if it isn't, and we need one, install one.
+ */
+ snapshot_set = false;
+ if (!ActiveSnapshotSet() &&
+ plansource->raw_parse_tree &&
+ analyze_requires_snapshot(plansource->raw_parse_tree))
+ {
+ PushActiveSnapshot(GetTransactionSnapshot());
+ snapshot_set = true;
+ }
+
+ /*
+ * Generate the plan.
+ */
+ plist = pg_plan_queries(qlist, plansource->query_string,
+ plansource->cursor_options, boundParams);
+
+ /* Release snapshot if we got one */
+ if (snapshot_set)
+ PopActiveSnapshot();
+
+ /*
+ * Normally we make a dedicated memory context for the CachedPlan and its
+ * subsidiary data. (It's probably not going to be large, but just in
+ * case, allow it to grow large. It's transient for the moment.) But for
+ * a one-shot plan, we just leave it in the caller's memory context.
+ */
+ if (!plansource->is_oneshot)
+ {
+ plan_context = AllocSetContextCreate(CurrentMemoryContext,
+ "CachedPlan",
+ ALLOCSET_START_SMALL_SIZES);
+ MemoryContextCopyAndSetIdentifier(plan_context, plansource->query_string);
+
+ /*
+ * Copy plan into the new context.
+ */
+ MemoryContextSwitchTo(plan_context);
+
+ plist = copyObject(plist);
+ }
+ else
+ plan_context = CurrentMemoryContext;
+
+ /*
+ * Create and fill the CachedPlan struct within the new context.
+ */
+ plan = (CachedPlan *) palloc(sizeof(CachedPlan));
+ plan->magic = CACHEDPLAN_MAGIC;
+ plan->stmt_list = plist;
+
+ /*
+ * CachedPlan is dependent on role either if RLS affected the rewrite
+ * phase or if a role dependency was injected during planning. And it's
+ * transient if any plan is marked so.
+ */
+ plan->planRoleId = GetUserId();
+ plan->dependsOnRole = plansource->dependsOnRLS;
+ is_transient = false;
+ foreach(lc, plist)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ continue; /* Ignore utility statements */
+
+ if (plannedstmt->transientPlan)
+ is_transient = true;
+ if (plannedstmt->dependsOnRole)
+ plan->dependsOnRole = true;
+ }
+ if (is_transient)
+ {
+ Assert(TransactionIdIsNormal(TransactionXmin));
+ plan->saved_xmin = TransactionXmin;
+ }
+ else
+ plan->saved_xmin = InvalidTransactionId;
+ plan->refcount = 0;
+ plan->context = plan_context;
+ plan->is_oneshot = plansource->is_oneshot;
+ plan->is_saved = false;
+ plan->is_valid = true;
+
+ /* assign generation number to new plan */
+ plan->generation = ++(plansource->generation);
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return plan;
+}
+
+/*
+ * choose_custom_plan: choose whether to use custom or generic plan
+ *
+ * This defines the policy followed by GetCachedPlan.
+ */
+static bool
+choose_custom_plan(CachedPlanSource *plansource, ParamListInfo boundParams)
+{
+ double avg_custom_cost;
+
+ /* One-shot plans will always be considered custom */
+ if (plansource->is_oneshot)
+ return true;
+
+ /* Otherwise, never any point in a custom plan if there's no parameters */
+ if (boundParams == NULL)
+ return false;
+ /* ... nor when planning would be a no-op */
+ if (!StmtPlanRequiresRevalidation(plansource))
+ return false;
+
+ /* Let settings force the decision */
+ if (plan_cache_mode == PLAN_CACHE_MODE_FORCE_GENERIC_PLAN)
+ return false;
+ if (plan_cache_mode == PLAN_CACHE_MODE_FORCE_CUSTOM_PLAN)
+ return true;
+
+ /* See if caller wants to force the decision */
+ if (plansource->cursor_options & CURSOR_OPT_GENERIC_PLAN)
+ return false;
+ if (plansource->cursor_options & CURSOR_OPT_CUSTOM_PLAN)
+ return true;
+
+ /* Generate custom plans until we have done at least 5 (arbitrary) */
+ if (plansource->num_custom_plans < 5)
+ return true;
+
+ avg_custom_cost = plansource->total_custom_cost / plansource->num_custom_plans;
+
+ /*
+ * Prefer generic plan if it's less expensive than the average custom
+ * plan. (Because we include a charge for cost of planning in the
+ * custom-plan costs, this means the generic plan only has to be less
+ * expensive than the execution cost plus replan cost of the custom
+ * plans.)
+ *
+ * Note that if generic_cost is -1 (indicating we've not yet determined
+ * the generic plan cost), we'll always prefer generic at this point.
+ */
+ if (plansource->generic_cost < avg_custom_cost)
+ return false;
+
+ return true;
+}
+
+/*
+ * cached_plan_cost: calculate estimated cost of a plan
+ *
+ * If include_planner is true, also include the estimated cost of constructing
+ * the plan. (We must factor that into the cost of using a custom plan, but
+ * we don't count it for a generic plan.)
+ */
+static double
+cached_plan_cost(CachedPlan *plan, bool include_planner)
+{
+ double result = 0;
+ ListCell *lc;
+
+ foreach(lc, plan->stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ continue; /* Ignore utility statements */
+
+ result += plannedstmt->planTree->total_cost;
+
+ if (include_planner)
+ {
+ /*
+ * Currently we use a very crude estimate of planning effort based
+ * on the number of relations in the finished plan's rangetable.
+ * Join planning effort actually scales much worse than linearly
+ * in the number of relations --- but only until the join collapse
+ * limits kick in. Also, while inheritance child relations surely
+ * add to planning effort, they don't make the join situation
+ * worse. So the actual shape of the planning cost curve versus
+ * number of relations isn't all that obvious. It will take
+ * considerable work to arrive at a less crude estimate, and for
+ * now it's not clear that's worth doing.
+ *
+ * The other big difficulty here is that we don't have any very
+ * good model of how planning cost compares to execution costs.
+ * The current multiplier of 1000 * cpu_operator_cost is probably
+ * on the low side, but we'll try this for awhile before making a
+ * more aggressive correction.
+ *
+ * If we ever do write a more complicated estimator, it should
+ * probably live in src/backend/optimizer/ not here.
+ */
+ int nrelations = list_length(plannedstmt->rtable);
+
+ result += 1000.0 * cpu_operator_cost * (nrelations + 1);
+ }
+ }
+
+ return result;
+}
+
+/*
+ * GetCachedPlan: get a cached plan from a CachedPlanSource.
+ *
+ * This function hides the logic that decides whether to use a generic
+ * plan or a custom plan for the given parameters: the caller does not know
+ * which it will get.
+ *
+ * On return, the plan is valid and we have sufficient locks to begin
+ * execution.
+ *
+ * On return, the refcount of the plan has been incremented; a later
+ * ReleaseCachedPlan() call is expected. If "owner" is not NULL then
+ * the refcount has been reported to that ResourceOwner (note that this
+ * is only supported for "saved" CachedPlanSources).
+ *
+ * Note: if any replanning activity is required, the caller's memory context
+ * is used for that work.
+ */
+CachedPlan *
+GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams,
+ ResourceOwner owner, QueryEnvironment *queryEnv)
+{
+ CachedPlan *plan = NULL;
+ List *qlist;
+ bool customplan;
+
+ /* Assert caller is doing things in a sane order */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plansource->is_complete);
+ /* This seems worth a real test, though */
+ if (owner && !plansource->is_saved)
+ elog(ERROR, "cannot apply ResourceOwner to non-saved cached plan");
+
+ /* Make sure the querytree list is valid and we have parse-time locks */
+ qlist = RevalidateCachedQuery(plansource, queryEnv);
+
+ /* Decide whether to use a custom plan */
+ customplan = choose_custom_plan(plansource, boundParams);
+
+ if (!customplan)
+ {
+ if (CheckCachedPlan(plansource))
+ {
+ /* We want a generic plan, and we already have a valid one */
+ plan = plansource->gplan;
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ }
+ else
+ {
+ /* Build a new generic plan */
+ plan = BuildCachedPlan(plansource, qlist, NULL, queryEnv);
+ /* Just make real sure plansource->gplan is clear */
+ ReleaseGenericPlan(plansource);
+ /* Link the new generic plan into the plansource */
+ plansource->gplan = plan;
+ plan->refcount++;
+ /* Immediately reparent into appropriate context */
+ if (plansource->is_saved)
+ {
+ /* saved plans all live under CacheMemoryContext */
+ MemoryContextSetParent(plan->context, CacheMemoryContext);
+ plan->is_saved = true;
+ }
+ else
+ {
+ /* otherwise, it should be a sibling of the plansource */
+ MemoryContextSetParent(plan->context,
+ MemoryContextGetParent(plansource->context));
+ }
+ /* Update generic_cost whenever we make a new generic plan */
+ plansource->generic_cost = cached_plan_cost(plan, false);
+
+ /*
+ * If, based on the now-known value of generic_cost, we'd not have
+ * chosen to use a generic plan, then forget it and make a custom
+ * plan. This is a bit of a wart but is necessary to avoid a
+ * glitch in behavior when the custom plans are consistently big
+ * winners; at some point we'll experiment with a generic plan and
+ * find it's a loser, but we don't want to actually execute that
+ * plan.
+ */
+ customplan = choose_custom_plan(plansource, boundParams);
+
+ /*
+ * If we choose to plan again, we need to re-copy the query_list,
+ * since the planner probably scribbled on it. We can force
+ * BuildCachedPlan to do that by passing NIL.
+ */
+ qlist = NIL;
+ }
+ }
+
+ if (customplan)
+ {
+ /* Build a custom plan */
+ plan = BuildCachedPlan(plansource, qlist, boundParams, queryEnv);
+ /* Accumulate total costs of custom plans */
+ plansource->total_custom_cost += cached_plan_cost(plan, true);
+
+ plansource->num_custom_plans++;
+ }
+ else
+ {
+ plansource->num_generic_plans++;
+ }
+
+ Assert(plan != NULL);
+
+ /* Flag the plan as in use by caller */
+ if (owner)
+ ResourceOwnerEnlargePlanCacheRefs(owner);
+ plan->refcount++;
+ if (owner)
+ ResourceOwnerRememberPlanCacheRef(owner, plan);
+
+ /*
+ * Saved plans should be under CacheMemoryContext so they will not go away
+ * until their reference count goes to zero. In the generic-plan cases we
+ * already took care of that, but for a custom plan, do it as soon as we
+ * have created a reference-counted link.
+ */
+ if (customplan && plansource->is_saved)
+ {
+ MemoryContextSetParent(plan->context, CacheMemoryContext);
+ plan->is_saved = true;
+ }
+
+ return plan;
+}
+
+/*
+ * ReleaseCachedPlan: release active use of a cached plan.
+ *
+ * This decrements the reference count, and frees the plan if the count
+ * has thereby gone to zero. If "owner" is not NULL, it is assumed that
+ * the reference count is managed by that ResourceOwner.
+ *
+ * Note: owner == NULL is used for releasing references that are in
+ * persistent data structures, such as the parent CachedPlanSource or a
+ * Portal. Transient references should be protected by a resource owner.
+ */
+void
+ReleaseCachedPlan(CachedPlan *plan, ResourceOwner owner)
+{
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ if (owner)
+ {
+ Assert(plan->is_saved);
+ ResourceOwnerForgetPlanCacheRef(owner, plan);
+ }
+ Assert(plan->refcount > 0);
+ plan->refcount--;
+ if (plan->refcount == 0)
+ {
+ /* Mark it no longer valid */
+ plan->magic = 0;
+
+ /* One-shot plans do not own their context, so we can't free them */
+ if (!plan->is_oneshot)
+ MemoryContextDelete(plan->context);
+ }
+}
+
+/*
+ * CachedPlanAllowsSimpleValidityCheck: can we use CachedPlanIsSimplyValid?
+ *
+ * This function, together with CachedPlanIsSimplyValid, provides a fast path
+ * for revalidating "simple" generic plans. The core requirement to be simple
+ * is that the plan must not require taking any locks, which translates to
+ * not touching any tables; this happens to match up well with an important
+ * use-case in PL/pgSQL. This function tests whether that's true, along
+ * with checking some other corner cases that we'd rather not bother with
+ * handling in the fast path. (Note that it's still possible for such a plan
+ * to be invalidated, for example due to a change in a function that was
+ * inlined into the plan.)
+ *
+ * If the plan is simply valid, and "owner" is not NULL, record a refcount on
+ * the plan in that resowner before returning. It is caller's responsibility
+ * to be sure that a refcount is held on any plan that's being actively used.
+ *
+ * This must only be called on known-valid generic plans (eg, ones just
+ * returned by GetCachedPlan). If it returns true, the caller may re-use
+ * the cached plan as long as CachedPlanIsSimplyValid returns true; that
+ * check is much cheaper than the full revalidation done by GetCachedPlan.
+ * Nonetheless, no required checks are omitted.
+ */
+bool
+CachedPlanAllowsSimpleValidityCheck(CachedPlanSource *plansource,
+ CachedPlan *plan, ResourceOwner owner)
+{
+ ListCell *lc;
+
+ /*
+ * Sanity-check that the caller gave us a validated generic plan. Notice
+ * that we *don't* assert plansource->is_valid as you might expect; that's
+ * because it's possible that that's already false when GetCachedPlan
+ * returns, e.g. because ResetPlanCache happened partway through. We
+ * should accept the plan as long as plan->is_valid is true, and expect to
+ * replan after the next CachedPlanIsSimplyValid call.
+ */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ Assert(plan->is_valid);
+ Assert(plan == plansource->gplan);
+ Assert(plansource->search_path != NULL);
+ Assert(OverrideSearchPathMatchesCurrent(plansource->search_path));
+
+ /* We don't support oneshot plans here. */
+ if (plansource->is_oneshot)
+ return false;
+ Assert(!plan->is_oneshot);
+
+ /*
+ * If the plan is dependent on RLS considerations, or it's transient,
+ * reject. These things probably can't ever happen for table-free
+ * queries, but for safety's sake let's check.
+ */
+ if (plansource->dependsOnRLS)
+ return false;
+ if (plan->dependsOnRole)
+ return false;
+ if (TransactionIdIsValid(plan->saved_xmin))
+ return false;
+
+ /*
+ * Reject if AcquirePlannerLocks would have anything to do. This is
+ * simplistic, but there's no need to inquire any more carefully; indeed,
+ * for current callers it shouldn't even be possible to hit any of these
+ * checks.
+ */
+ foreach(lc, plansource->query_list)
+ {
+ Query *query = lfirst_node(Query, lc);
+
+ if (query->commandType == CMD_UTILITY)
+ return false;
+ if (query->rtable || query->cteList || query->hasSubLinks)
+ return false;
+ }
+
+ /*
+ * Reject if AcquireExecutorLocks would have anything to do. This is
+ * probably unnecessary given the previous check, but let's be safe.
+ */
+ foreach(lc, plan->stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+ ListCell *lc2;
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ return false;
+
+ /*
+ * We have to grovel through the rtable because it's likely to contain
+ * an RTE_RESULT relation, rather than being totally empty.
+ */
+ foreach(lc2, plannedstmt->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc2);
+
+ if (rte->rtekind == RTE_RELATION)
+ return false;
+ }
+ }
+
+ /*
+ * Okay, it's simple. Note that what we've primarily established here is
+ * that no locks need be taken before checking the plan's is_valid flag.
+ */
+
+ /* Bump refcount if requested. */
+ if (owner)
+ {
+ ResourceOwnerEnlargePlanCacheRefs(owner);
+ plan->refcount++;
+ ResourceOwnerRememberPlanCacheRef(owner, plan);
+ }
+
+ return true;
+}
+
+/*
+ * CachedPlanIsSimplyValid: quick check for plan still being valid
+ *
+ * This function must not be used unless CachedPlanAllowsSimpleValidityCheck
+ * previously said it was OK.
+ *
+ * If the plan is valid, and "owner" is not NULL, record a refcount on
+ * the plan in that resowner before returning. It is caller's responsibility
+ * to be sure that a refcount is held on any plan that's being actively used.
+ *
+ * The code here is unconditionally safe as long as the only use of this
+ * CachedPlanSource is in connection with the particular CachedPlan pointer
+ * that's passed in. If the plansource were being used for other purposes,
+ * it's possible that its generic plan could be invalidated and regenerated
+ * while the current caller wasn't looking, and then there could be a chance
+ * collision of address between this caller's now-stale plan pointer and the
+ * actual address of the new generic plan. For current uses, that scenario
+ * can't happen; but with a plansource shared across multiple uses, it'd be
+ * advisable to also save plan->generation and verify that that still matches.
+ */
+bool
+CachedPlanIsSimplyValid(CachedPlanSource *plansource, CachedPlan *plan,
+ ResourceOwner owner)
+{
+ /*
+ * Careful here: since the caller doesn't necessarily hold a refcount on
+ * the plan to start with, it's possible that "plan" is a dangling
+ * pointer. Don't dereference it until we've verified that it still
+ * matches the plansource's gplan (which is either valid or NULL).
+ */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /*
+ * Has cache invalidation fired on this plan? We can check this right
+ * away since there are no locks that we'd need to acquire first. Note
+ * that here we *do* check plansource->is_valid, so as to force plan
+ * rebuild if that's become false.
+ */
+ if (!plansource->is_valid ||
+ plan == NULL || plan != plansource->gplan ||
+ !plan->is_valid)
+ return false;
+
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+
+ /* Is the search_path still the same as when we made it? */
+ Assert(plansource->search_path != NULL);
+ if (!OverrideSearchPathMatchesCurrent(plansource->search_path))
+ return false;
+
+ /* It's still good. Bump refcount if requested. */
+ if (owner)
+ {
+ ResourceOwnerEnlargePlanCacheRefs(owner);
+ plan->refcount++;
+ ResourceOwnerRememberPlanCacheRef(owner, plan);
+ }
+
+ return true;
+}
+
+/*
+ * CachedPlanSetParentContext: move a CachedPlanSource to a new memory context
+ *
+ * This can only be applied to unsaved plans; once saved, a plan always
+ * lives underneath CacheMemoryContext.
+ */
+void
+CachedPlanSetParentContext(CachedPlanSource *plansource,
+ MemoryContext newcontext)
+{
+ /* Assert caller is doing things in a sane order */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plansource->is_complete);
+
+ /* These seem worth real tests, though */
+ if (plansource->is_saved)
+ elog(ERROR, "cannot move a saved cached plan to another context");
+ if (plansource->is_oneshot)
+ elog(ERROR, "cannot move a one-shot cached plan to another context");
+
+ /* OK, let the caller keep the plan where he wishes */
+ MemoryContextSetParent(plansource->context, newcontext);
+
+ /*
+ * The query_context needs no special handling, since it's a child of
+ * plansource->context. But if there's a generic plan, it should be
+ * maintained as a sibling of plansource->context.
+ */
+ if (plansource->gplan)
+ {
+ Assert(plansource->gplan->magic == CACHEDPLAN_MAGIC);
+ MemoryContextSetParent(plansource->gplan->context, newcontext);
+ }
+}
+
+/*
+ * CopyCachedPlan: make a copy of a CachedPlanSource
+ *
+ * This is a convenience routine that does the equivalent of
+ * CreateCachedPlan + CompleteCachedPlan, using the data stored in the
+ * input CachedPlanSource. The result is therefore "unsaved" (regardless
+ * of the state of the source), and we don't copy any generic plan either.
+ * The result will be currently valid, or not, the same as the source.
+ */
+CachedPlanSource *
+CopyCachedPlan(CachedPlanSource *plansource)
+{
+ CachedPlanSource *newsource;
+ MemoryContext source_context;
+ MemoryContext querytree_context;
+ MemoryContext oldcxt;
+
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plansource->is_complete);
+
+ /*
+ * One-shot plans can't be copied, because we haven't taken care that
+ * parsing/planning didn't scribble on the raw parse tree or querytrees.
+ */
+ if (plansource->is_oneshot)
+ elog(ERROR, "cannot copy a one-shot cached plan");
+
+ source_context = AllocSetContextCreate(CurrentMemoryContext,
+ "CachedPlanSource",
+ ALLOCSET_START_SMALL_SIZES);
+
+ oldcxt = MemoryContextSwitchTo(source_context);
+
+ newsource = (CachedPlanSource *) palloc0(sizeof(CachedPlanSource));
+ newsource->magic = CACHEDPLANSOURCE_MAGIC;
+ newsource->raw_parse_tree = copyObject(plansource->raw_parse_tree);
+ newsource->query_string = pstrdup(plansource->query_string);
+ MemoryContextSetIdentifier(source_context, newsource->query_string);
+ newsource->commandTag = plansource->commandTag;
+ if (plansource->num_params > 0)
+ {
+ newsource->param_types = (Oid *)
+ palloc(plansource->num_params * sizeof(Oid));
+ memcpy(newsource->param_types, plansource->param_types,
+ plansource->num_params * sizeof(Oid));
+ }
+ else
+ newsource->param_types = NULL;
+ newsource->num_params = plansource->num_params;
+ newsource->parserSetup = plansource->parserSetup;
+ newsource->parserSetupArg = plansource->parserSetupArg;
+ newsource->cursor_options = plansource->cursor_options;
+ newsource->fixed_result = plansource->fixed_result;
+ if (plansource->resultDesc)
+ newsource->resultDesc = CreateTupleDescCopy(plansource->resultDesc);
+ else
+ newsource->resultDesc = NULL;
+ newsource->context = source_context;
+
+ querytree_context = AllocSetContextCreate(source_context,
+ "CachedPlanQuery",
+ ALLOCSET_START_SMALL_SIZES);
+ MemoryContextSwitchTo(querytree_context);
+ newsource->query_list = copyObject(plansource->query_list);
+ newsource->relationOids = copyObject(plansource->relationOids);
+ newsource->invalItems = copyObject(plansource->invalItems);
+ if (plansource->search_path)
+ newsource->search_path = CopyOverrideSearchPath(plansource->search_path);
+ newsource->query_context = querytree_context;
+ newsource->rewriteRoleId = plansource->rewriteRoleId;
+ newsource->rewriteRowSecurity = plansource->rewriteRowSecurity;
+ newsource->dependsOnRLS = plansource->dependsOnRLS;
+
+ newsource->gplan = NULL;
+
+ newsource->is_oneshot = false;
+ newsource->is_complete = true;
+ newsource->is_saved = false;
+ newsource->is_valid = plansource->is_valid;
+ newsource->generation = plansource->generation;
+
+ /* We may as well copy any acquired cost knowledge */
+ newsource->generic_cost = plansource->generic_cost;
+ newsource->total_custom_cost = plansource->total_custom_cost;
+ newsource->num_generic_plans = plansource->num_generic_plans;
+ newsource->num_custom_plans = plansource->num_custom_plans;
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return newsource;
+}
+
+/*
+ * CachedPlanIsValid: test whether the rewritten querytree within a
+ * CachedPlanSource is currently valid (that is, not marked as being in need
+ * of revalidation).
+ *
+ * This result is only trustworthy (ie, free from race conditions) if
+ * the caller has acquired locks on all the relations used in the plan.
+ */
+bool
+CachedPlanIsValid(CachedPlanSource *plansource)
+{
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ return plansource->is_valid;
+}
+
+/*
+ * CachedPlanGetTargetList: return tlist, if any, describing plan's output
+ *
+ * The result is guaranteed up-to-date. However, it is local storage
+ * within the cached plan, and may disappear next time the plan is updated.
+ */
+List *
+CachedPlanGetTargetList(CachedPlanSource *plansource,
+ QueryEnvironment *queryEnv)
+{
+ Query *pstmt;
+
+ /* Assert caller is doing things in a sane order */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plansource->is_complete);
+
+ /*
+ * No work needed if statement doesn't return tuples (we assume this
+ * feature cannot be changed by an invalidation)
+ */
+ if (plansource->resultDesc == NULL)
+ return NIL;
+
+ /* Make sure the querytree list is valid and we have parse-time locks */
+ RevalidateCachedQuery(plansource, queryEnv);
+
+ /* Get the primary statement and find out what it returns */
+ pstmt = QueryListGetPrimaryStmt(plansource->query_list);
+
+ return FetchStatementTargetList((Node *) pstmt);
+}
+
+/*
+ * GetCachedExpression: construct a CachedExpression for an expression.
+ *
+ * This performs the same transformations on the expression as
+ * expression_planner(), ie, convert an expression as emitted by parse
+ * analysis to be ready to pass to the executor.
+ *
+ * The result is stashed in a private, long-lived memory context.
+ * (Note that this might leak a good deal of memory in the caller's
+ * context before that.) The passed-in expr tree is not modified.
+ */
+CachedExpression *
+GetCachedExpression(Node *expr)
+{
+ CachedExpression *cexpr;
+ List *relationOids;
+ List *invalItems;
+ MemoryContext cexpr_context;
+ MemoryContext oldcxt;
+
+ /*
+ * Pass the expression through the planner, and collect dependencies.
+ * Everything built here is leaked in the caller's context; that's
+ * intentional to minimize the size of the permanent data structure.
+ */
+ expr = (Node *) expression_planner_with_deps((Expr *) expr,
+ &relationOids,
+ &invalItems);
+
+ /*
+ * Make a private memory context, and copy what we need into that. To
+ * avoid leaking a long-lived context if we fail while copying data, we
+ * initially make the context under the caller's context.
+ */
+ cexpr_context = AllocSetContextCreate(CurrentMemoryContext,
+ "CachedExpression",
+ ALLOCSET_SMALL_SIZES);
+
+ oldcxt = MemoryContextSwitchTo(cexpr_context);
+
+ cexpr = (CachedExpression *) palloc(sizeof(CachedExpression));
+ cexpr->magic = CACHEDEXPR_MAGIC;
+ cexpr->expr = copyObject(expr);
+ cexpr->is_valid = true;
+ cexpr->relationOids = copyObject(relationOids);
+ cexpr->invalItems = copyObject(invalItems);
+ cexpr->context = cexpr_context;
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /*
+ * Reparent the expr's memory context under CacheMemoryContext so that it
+ * will live indefinitely.
+ */
+ MemoryContextSetParent(cexpr_context, CacheMemoryContext);
+
+ /*
+ * Add the entry to the global list of cached expressions.
+ */
+ dlist_push_tail(&cached_expression_list, &cexpr->node);
+
+ return cexpr;
+}
+
+/*
+ * FreeCachedExpression
+ * Delete a CachedExpression.
+ */
+void
+FreeCachedExpression(CachedExpression *cexpr)
+{
+ /* Sanity check */
+ Assert(cexpr->magic == CACHEDEXPR_MAGIC);
+ /* Unlink from global list */
+ dlist_delete(&cexpr->node);
+ /* Free all storage associated with CachedExpression */
+ MemoryContextDelete(cexpr->context);
+}
+
+/*
+ * QueryListGetPrimaryStmt
+ * Get the "primary" stmt within a list, ie, the one marked canSetTag.
+ *
+ * Returns NULL if no such stmt. If multiple queries within the list are
+ * marked canSetTag, returns the first one. Neither of these cases should
+ * occur in present usages of this function.
+ */
+static Query *
+QueryListGetPrimaryStmt(List *stmts)
+{
+ ListCell *lc;
+
+ foreach(lc, stmts)
+ {
+ Query *stmt = lfirst_node(Query, lc);
+
+ if (stmt->canSetTag)
+ return stmt;
+ }
+ return NULL;
+}
+
+/*
+ * AcquireExecutorLocks: acquire locks needed for execution of a cached plan;
+ * or release them if acquire is false.
+ */
+static void
+AcquireExecutorLocks(List *stmt_list, bool acquire)
+{
+ ListCell *lc1;
+
+ foreach(lc1, stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc1);
+ ListCell *lc2;
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ {
+ /*
+ * Ignore utility statements, except those (such as EXPLAIN) that
+ * contain a parsed-but-not-planned query. Note: it's okay to use
+ * ScanQueryForLocks, even though the query hasn't been through
+ * rule rewriting, because rewriting doesn't change the query
+ * representation.
+ */
+ Query *query = UtilityContainsQuery(plannedstmt->utilityStmt);
+
+ if (query)
+ ScanQueryForLocks(query, acquire);
+ continue;
+ }
+
+ foreach(lc2, plannedstmt->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc2);
+
+ if (rte->rtekind != RTE_RELATION)
+ continue;
+
+ /*
+ * Acquire the appropriate type of lock on each relation OID. Note
+ * that we don't actually try to open the rel, and hence will not
+ * fail if it's been dropped entirely --- we'll just transiently
+ * acquire a non-conflicting lock.
+ */
+ if (acquire)
+ LockRelationOid(rte->relid, rte->rellockmode);
+ else
+ UnlockRelationOid(rte->relid, rte->rellockmode);
+ }
+ }
+}
+
+/*
+ * AcquirePlannerLocks: acquire locks needed for planning of a querytree list;
+ * or release them if acquire is false.
+ *
+ * Note that we don't actually try to open the relations, and hence will not
+ * fail if one has been dropped entirely --- we'll just transiently acquire
+ * a non-conflicting lock.
+ */
+static void
+AcquirePlannerLocks(List *stmt_list, bool acquire)
+{
+ ListCell *lc;
+
+ foreach(lc, stmt_list)
+ {
+ Query *query = lfirst_node(Query, lc);
+
+ if (query->commandType == CMD_UTILITY)
+ {
+ /* Ignore utility statements, unless they contain a Query */
+ query = UtilityContainsQuery(query->utilityStmt);
+ if (query)
+ ScanQueryForLocks(query, acquire);
+ continue;
+ }
+
+ ScanQueryForLocks(query, acquire);
+ }
+}
+
+/*
+ * ScanQueryForLocks: recursively scan one Query for AcquirePlannerLocks.
+ */
+static void
+ScanQueryForLocks(Query *parsetree, bool acquire)
+{
+ ListCell *lc;
+
+ /* Shouldn't get called on utility commands */
+ Assert(parsetree->commandType != CMD_UTILITY);
+
+ /*
+ * First, process RTEs of the current query level.
+ */
+ foreach(lc, parsetree->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc);
+
+ switch (rte->rtekind)
+ {
+ case RTE_RELATION:
+ /* Acquire or release the appropriate type of lock */
+ if (acquire)
+ LockRelationOid(rte->relid, rte->rellockmode);
+ else
+ UnlockRelationOid(rte->relid, rte->rellockmode);
+ break;
+
+ case RTE_SUBQUERY:
+ /* Recurse into subquery-in-FROM */
+ ScanQueryForLocks(rte->subquery, acquire);
+ break;
+
+ default:
+ /* ignore other types of RTEs */
+ break;
+ }
+ }
+
+ /* Recurse into subquery-in-WITH */
+ foreach(lc, parsetree->cteList)
+ {
+ CommonTableExpr *cte = lfirst_node(CommonTableExpr, lc);
+
+ ScanQueryForLocks(castNode(Query, cte->ctequery), acquire);
+ }
+
+ /*
+ * Recurse into sublink subqueries, too. But we already did the ones in
+ * the rtable and cteList.
+ */
+ if (parsetree->hasSubLinks)
+ {
+ query_tree_walker(parsetree, ScanQueryWalker,
+ (void *) &acquire,
+ QTW_IGNORE_RC_SUBQUERIES);
+ }
+}
+
+/*
+ * Walker to find sublink subqueries for ScanQueryForLocks
+ */
+static bool
+ScanQueryWalker(Node *node, bool *acquire)
+{
+ if (node == NULL)
+ return false;
+ if (IsA(node, SubLink))
+ {
+ SubLink *sub = (SubLink *) node;
+
+ /* Do what we came for */
+ ScanQueryForLocks(castNode(Query, sub->subselect), *acquire);
+ /* Fall through to process lefthand args of SubLink */
+ }
+
+ /*
+ * Do NOT recurse into Query nodes, because ScanQueryForLocks already
+ * processed subselects of subselects for us.
+ */
+ return expression_tree_walker(node, ScanQueryWalker,
+ (void *) acquire);
+}
+
+/*
+ * PlanCacheComputeResultDesc: given a list of analyzed-and-rewritten Queries,
+ * determine the result tupledesc it will produce. Returns NULL if the
+ * execution will not return tuples.
+ *
+ * Note: the result is created or copied into current memory context.
+ */
+static TupleDesc
+PlanCacheComputeResultDesc(List *stmt_list)
+{
+ Query *query;
+
+ switch (ChoosePortalStrategy(stmt_list))
+ {
+ case PORTAL_ONE_SELECT:
+ case PORTAL_ONE_MOD_WITH:
+ query = linitial_node(Query, stmt_list);
+ return ExecCleanTypeFromTL(query->targetList);
+
+ case PORTAL_ONE_RETURNING:
+ query = QueryListGetPrimaryStmt(stmt_list);
+ Assert(query->returningList);
+ return ExecCleanTypeFromTL(query->returningList);
+
+ case PORTAL_UTIL_SELECT:
+ query = linitial_node(Query, stmt_list);
+ Assert(query->utilityStmt);
+ return UtilityTupleDescriptor(query->utilityStmt);
+
+ case PORTAL_MULTI_QUERY:
+ /* will not return tuples */
+ break;
+ }
+ return NULL;
+}
+
+/*
+ * PlanCacheRelCallback
+ * Relcache inval callback function
+ *
+ * Invalidate all plans mentioning the given rel, or all plans mentioning
+ * any rel at all if relid == InvalidOid.
+ */
+static void
+PlanCacheRelCallback(Datum arg, Oid relid)
+{
+ dlist_iter iter;
+
+ dlist_foreach(iter, &saved_plan_list)
+ {
+ CachedPlanSource *plansource = dlist_container(CachedPlanSource,
+ node, iter.cur);
+
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /* No work if it's already invalidated */
+ if (!plansource->is_valid)
+ continue;
+
+ /* Never invalidate if parse/plan would be a no-op anyway */
+ if (!StmtPlanRequiresRevalidation(plansource))
+ continue;
+
+ /*
+ * Check the dependency list for the rewritten querytree.
+ */
+ if ((relid == InvalidOid) ? plansource->relationOids != NIL :
+ list_member_oid(plansource->relationOids, relid))
+ {
+ /* Invalidate the querytree and generic plan */
+ plansource->is_valid = false;
+ if (plansource->gplan)
+ plansource->gplan->is_valid = false;
+ }
+
+ /*
+ * The generic plan, if any, could have more dependencies than the
+ * querytree does, so we have to check it too.
+ */
+ if (plansource->gplan && plansource->gplan->is_valid)
+ {
+ ListCell *lc;
+
+ foreach(lc, plansource->gplan->stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ continue; /* Ignore utility statements */
+ if ((relid == InvalidOid) ? plannedstmt->relationOids != NIL :
+ list_member_oid(plannedstmt->relationOids, relid))
+ {
+ /* Invalidate the generic plan only */
+ plansource->gplan->is_valid = false;
+ break; /* out of stmt_list scan */
+ }
+ }
+ }
+ }
+
+ /* Likewise check cached expressions */
+ dlist_foreach(iter, &cached_expression_list)
+ {
+ CachedExpression *cexpr = dlist_container(CachedExpression,
+ node, iter.cur);
+
+ Assert(cexpr->magic == CACHEDEXPR_MAGIC);
+
+ /* No work if it's already invalidated */
+ if (!cexpr->is_valid)
+ continue;
+
+ if ((relid == InvalidOid) ? cexpr->relationOids != NIL :
+ list_member_oid(cexpr->relationOids, relid))
+ {
+ cexpr->is_valid = false;
+ }
+ }
+}
+
+/*
+ * PlanCacheObjectCallback
+ * Syscache inval callback function for PROCOID and TYPEOID caches
+ *
+ * Invalidate all plans mentioning the object with the specified hash value,
+ * or all plans mentioning any member of this cache if hashvalue == 0.
+ */
+static void
+PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ dlist_iter iter;
+
+ dlist_foreach(iter, &saved_plan_list)
+ {
+ CachedPlanSource *plansource = dlist_container(CachedPlanSource,
+ node, iter.cur);
+ ListCell *lc;
+
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /* No work if it's already invalidated */
+ if (!plansource->is_valid)
+ continue;
+
+ /* Never invalidate if parse/plan would be a no-op anyway */
+ if (!StmtPlanRequiresRevalidation(plansource))
+ continue;
+
+ /*
+ * Check the dependency list for the rewritten querytree.
+ */
+ foreach(lc, plansource->invalItems)
+ {
+ PlanInvalItem *item = (PlanInvalItem *) lfirst(lc);
+
+ if (item->cacheId != cacheid)
+ continue;
+ if (hashvalue == 0 ||
+ item->hashValue == hashvalue)
+ {
+ /* Invalidate the querytree and generic plan */
+ plansource->is_valid = false;
+ if (plansource->gplan)
+ plansource->gplan->is_valid = false;
+ break;
+ }
+ }
+
+ /*
+ * The generic plan, if any, could have more dependencies than the
+ * querytree does, so we have to check it too.
+ */
+ if (plansource->gplan && plansource->gplan->is_valid)
+ {
+ foreach(lc, plansource->gplan->stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+ ListCell *lc3;
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ continue; /* Ignore utility statements */
+ foreach(lc3, plannedstmt->invalItems)
+ {
+ PlanInvalItem *item = (PlanInvalItem *) lfirst(lc3);
+
+ if (item->cacheId != cacheid)
+ continue;
+ if (hashvalue == 0 ||
+ item->hashValue == hashvalue)
+ {
+ /* Invalidate the generic plan only */
+ plansource->gplan->is_valid = false;
+ break; /* out of invalItems scan */
+ }
+ }
+ if (!plansource->gplan->is_valid)
+ break; /* out of stmt_list scan */
+ }
+ }
+ }
+
+ /* Likewise check cached expressions */
+ dlist_foreach(iter, &cached_expression_list)
+ {
+ CachedExpression *cexpr = dlist_container(CachedExpression,
+ node, iter.cur);
+ ListCell *lc;
+
+ Assert(cexpr->magic == CACHEDEXPR_MAGIC);
+
+ /* No work if it's already invalidated */
+ if (!cexpr->is_valid)
+ continue;
+
+ foreach(lc, cexpr->invalItems)
+ {
+ PlanInvalItem *item = (PlanInvalItem *) lfirst(lc);
+
+ if (item->cacheId != cacheid)
+ continue;
+ if (hashvalue == 0 ||
+ item->hashValue == hashvalue)
+ {
+ cexpr->is_valid = false;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * PlanCacheSysCallback
+ * Syscache inval callback function for other caches
+ *
+ * Just invalidate everything...
+ */
+static void
+PlanCacheSysCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ ResetPlanCache();
+}
+
+/*
+ * ResetPlanCache: invalidate all cached plans.
+ */
+void
+ResetPlanCache(void)
+{
+ dlist_iter iter;
+
+ dlist_foreach(iter, &saved_plan_list)
+ {
+ CachedPlanSource *plansource = dlist_container(CachedPlanSource,
+ node, iter.cur);
+
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /* No work if it's already invalidated */
+ if (!plansource->is_valid)
+ continue;
+
+ /*
+ * We *must not* mark transaction control statements as invalid,
+ * particularly not ROLLBACK, because they may need to be executed in
+ * aborted transactions when we can't revalidate them (cf bug #5269).
+ * In general there's no point in invalidating statements for which a
+ * new parse analysis/rewrite/plan cycle would certainly give the same
+ * results.
+ */
+ if (!StmtPlanRequiresRevalidation(plansource))
+ continue;
+
+ plansource->is_valid = false;
+ if (plansource->gplan)
+ plansource->gplan->is_valid = false;
+ }
+
+ /* Likewise invalidate cached expressions */
+ dlist_foreach(iter, &cached_expression_list)
+ {
+ CachedExpression *cexpr = dlist_container(CachedExpression,
+ node, iter.cur);
+
+ Assert(cexpr->magic == CACHEDEXPR_MAGIC);
+
+ cexpr->is_valid = false;
+ }
+}
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
new file mode 100644
index 0000000..0ce4400
--- /dev/null
+++ b/src/backend/utils/cache/relcache.c
@@ -0,0 +1,6800 @@
+/*-------------------------------------------------------------------------
+ *
+ * relcache.c
+ * POSTGRES relation descriptor cache code
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/relcache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+/*
+ * INTERFACE ROUTINES
+ * RelationCacheInitialize - initialize relcache (to empty)
+ * RelationCacheInitializePhase2 - initialize shared-catalog entries
+ * RelationCacheInitializePhase3 - finish initializing relcache
+ * RelationIdGetRelation - get a reldesc by relation id
+ * RelationClose - close an open relation
+ *
+ * NOTES
+ * The following code contains many undocumented hacks. Please be
+ * careful....
+ */
+#include "postgres.h"
+
+#include <sys/file.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "access/htup_details.h"
+#include "access/multixact.h"
+#include "access/nbtree.h"
+#include "access/parallel.h"
+#include "access/reloptions.h"
+#include "access/sysattr.h"
+#include "access/table.h"
+#include "access/tableam.h"
+#include "access/tupdesc_details.h"
+#include "access/xact.h"
+#include "access/xlog.h"
+#include "catalog/binary_upgrade.h"
+#include "catalog/catalog.h"
+#include "catalog/indexing.h"
+#include "catalog/namespace.h"
+#include "catalog/partition.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_attrdef.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_namespace.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_publication.h"
+#include "catalog/pg_rewrite.h"
+#include "catalog/pg_shseclabel.h"
+#include "catalog/pg_statistic_ext.h"
+#include "catalog/pg_subscription.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/pg_trigger.h"
+#include "catalog/pg_type.h"
+#include "catalog/schemapg.h"
+#include "catalog/storage.h"
+#include "commands/policy.h"
+#include "commands/publicationcmds.h"
+#include "commands/trigger.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/optimizer.h"
+#include "pgstat.h"
+#include "rewrite/rewriteDefine.h"
+#include "rewrite/rowsecurity.h"
+#include "storage/lmgr.h"
+#include "storage/smgr.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/relmapper.h"
+#include "utils/resowner_private.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+#define RELCACHE_INIT_FILEMAGIC 0x573266 /* version ID value */
+
+/*
+ * Whether to bother checking if relation cache memory needs to be freed
+ * eagerly. See also RelationBuildDesc() and pg_config_manual.h.
+ */
+#if defined(RECOVER_RELATION_BUILD_MEMORY) && (RECOVER_RELATION_BUILD_MEMORY != 0)
+#define MAYBE_RECOVER_RELATION_BUILD_MEMORY 1
+#else
+#define RECOVER_RELATION_BUILD_MEMORY 0
+#ifdef DISCARD_CACHES_ENABLED
+#define MAYBE_RECOVER_RELATION_BUILD_MEMORY 1
+#endif
+#endif
+
+/*
+ * hardcoded tuple descriptors, contents generated by genbki.pl
+ */
+static const FormData_pg_attribute Desc_pg_class[Natts_pg_class] = {Schema_pg_class};
+static const FormData_pg_attribute Desc_pg_attribute[Natts_pg_attribute] = {Schema_pg_attribute};
+static const FormData_pg_attribute Desc_pg_proc[Natts_pg_proc] = {Schema_pg_proc};
+static const FormData_pg_attribute Desc_pg_type[Natts_pg_type] = {Schema_pg_type};
+static const FormData_pg_attribute Desc_pg_database[Natts_pg_database] = {Schema_pg_database};
+static const FormData_pg_attribute Desc_pg_authid[Natts_pg_authid] = {Schema_pg_authid};
+static const FormData_pg_attribute Desc_pg_auth_members[Natts_pg_auth_members] = {Schema_pg_auth_members};
+static const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index};
+static const FormData_pg_attribute Desc_pg_shseclabel[Natts_pg_shseclabel] = {Schema_pg_shseclabel};
+static const FormData_pg_attribute Desc_pg_subscription[Natts_pg_subscription] = {Schema_pg_subscription};
+
+/*
+ * Hash tables that index the relation cache
+ *
+ * We used to index the cache by both name and OID, but now there
+ * is only an index by OID.
+ */
+typedef struct relidcacheent
+{
+ Oid reloid;
+ Relation reldesc;
+} RelIdCacheEnt;
+
+static HTAB *RelationIdCache;
+
+/*
+ * This flag is false until we have prepared the critical relcache entries
+ * that are needed to do indexscans on the tables read by relcache building.
+ */
+bool criticalRelcachesBuilt = false;
+
+/*
+ * This flag is false until we have prepared the critical relcache entries
+ * for shared catalogs (which are the tables needed for login).
+ */
+bool criticalSharedRelcachesBuilt = false;
+
+/*
+ * This counter counts relcache inval events received since backend startup
+ * (but only for rels that are actually in cache). Presently, we use it only
+ * to detect whether data about to be written by write_relcache_init_file()
+ * might already be obsolete.
+ */
+static long relcacheInvalsReceived = 0L;
+
+/*
+ * in_progress_list is a stack of ongoing RelationBuildDesc() calls. CREATE
+ * INDEX CONCURRENTLY makes catalog changes under ShareUpdateExclusiveLock.
+ * It critically relies on each backend absorbing those changes no later than
+ * next transaction start. Hence, RelationBuildDesc() loops until it finishes
+ * without accepting a relevant invalidation. (Most invalidation consumers
+ * don't do this.)
+ */
+typedef struct inprogressent
+{
+ Oid reloid; /* OID of relation being built */
+ bool invalidated; /* whether an invalidation arrived for it */
+} InProgressEnt;
+
+static InProgressEnt *in_progress_list;
+static int in_progress_list_len;
+static int in_progress_list_maxlen;
+
+/*
+ * eoxact_list[] stores the OIDs of relations that (might) need AtEOXact
+ * cleanup work. This list intentionally has limited size; if it overflows,
+ * we fall back to scanning the whole hashtable. There is no value in a very
+ * large list because (1) at some point, a hash_seq_search scan is faster than
+ * retail lookups, and (2) the value of this is to reduce EOXact work for
+ * short transactions, which can't have dirtied all that many tables anyway.
+ * EOXactListAdd() does not bother to prevent duplicate list entries, so the
+ * cleanup processing must be idempotent.
+ */
+#define MAX_EOXACT_LIST 32
+static Oid eoxact_list[MAX_EOXACT_LIST];
+static int eoxact_list_len = 0;
+static bool eoxact_list_overflowed = false;
+
+#define EOXactListAdd(rel) \
+ do { \
+ if (eoxact_list_len < MAX_EOXACT_LIST) \
+ eoxact_list[eoxact_list_len++] = (rel)->rd_id; \
+ else \
+ eoxact_list_overflowed = true; \
+ } while (0)
+
+/*
+ * EOXactTupleDescArray stores TupleDescs that (might) need AtEOXact
+ * cleanup work. The array expands as needed; there is no hashtable because
+ * we don't need to access individual items except at EOXact.
+ */
+static TupleDesc *EOXactTupleDescArray;
+static int NextEOXactTupleDescNum = 0;
+static int EOXactTupleDescArrayLen = 0;
+
+/*
+ * macros to manipulate the lookup hashtable
+ */
+#define RelationCacheInsert(RELATION, replace_allowed) \
+do { \
+ RelIdCacheEnt *hentry; bool found; \
+ hentry = (RelIdCacheEnt *) hash_search(RelationIdCache, \
+ (void *) &((RELATION)->rd_id), \
+ HASH_ENTER, &found); \
+ if (found) \
+ { \
+ /* see comments in RelationBuildDesc and RelationBuildLocalRelation */ \
+ Relation _old_rel = hentry->reldesc; \
+ Assert(replace_allowed); \
+ hentry->reldesc = (RELATION); \
+ if (RelationHasReferenceCountZero(_old_rel)) \
+ RelationDestroyRelation(_old_rel, false); \
+ else if (!IsBootstrapProcessingMode()) \
+ elog(WARNING, "leaking still-referenced relcache entry for \"%s\"", \
+ RelationGetRelationName(_old_rel)); \
+ } \
+ else \
+ hentry->reldesc = (RELATION); \
+} while(0)
+
+#define RelationIdCacheLookup(ID, RELATION) \
+do { \
+ RelIdCacheEnt *hentry; \
+ hentry = (RelIdCacheEnt *) hash_search(RelationIdCache, \
+ (void *) &(ID), \
+ HASH_FIND, NULL); \
+ if (hentry) \
+ RELATION = hentry->reldesc; \
+ else \
+ RELATION = NULL; \
+} while(0)
+
+#define RelationCacheDelete(RELATION) \
+do { \
+ RelIdCacheEnt *hentry; \
+ hentry = (RelIdCacheEnt *) hash_search(RelationIdCache, \
+ (void *) &((RELATION)->rd_id), \
+ HASH_REMOVE, NULL); \
+ if (hentry == NULL) \
+ elog(WARNING, "failed to delete relcache entry for OID %u", \
+ (RELATION)->rd_id); \
+} while(0)
+
+
+/*
+ * Special cache for opclass-related information
+ *
+ * Note: only default support procs get cached, ie, those with
+ * lefttype = righttype = opcintype.
+ */
+typedef struct opclasscacheent
+{
+ Oid opclassoid; /* lookup key: OID of opclass */
+ bool valid; /* set true after successful fill-in */
+ StrategyNumber numSupport; /* max # of support procs (from pg_am) */
+ Oid opcfamily; /* OID of opclass's family */
+ Oid opcintype; /* OID of opclass's declared input type */
+ RegProcedure *supportProcs; /* OIDs of support procedures */
+} OpClassCacheEnt;
+
+static HTAB *OpClassCache = NULL;
+
+
+/* non-export function prototypes */
+
+static void RelationDestroyRelation(Relation relation, bool remember_tupdesc);
+static void RelationClearRelation(Relation relation, bool rebuild);
+
+static void RelationReloadIndexInfo(Relation relation);
+static void RelationReloadNailed(Relation relation);
+static void RelationFlushRelation(Relation relation);
+static void RememberToFreeTupleDescAtEOX(TupleDesc td);
+#ifdef USE_ASSERT_CHECKING
+static void AssertPendingSyncConsistency(Relation relation);
+#endif
+static void AtEOXact_cleanup(Relation relation, bool isCommit);
+static void AtEOSubXact_cleanup(Relation relation, bool isCommit,
+ SubTransactionId mySubid, SubTransactionId parentSubid);
+static bool load_relcache_init_file(bool shared);
+static void write_relcache_init_file(bool shared);
+static void write_item(const void *data, Size len, FILE *fp);
+
+static void formrdesc(const char *relationName, Oid relationReltype,
+ bool isshared, int natts, const FormData_pg_attribute *attrs);
+
+static HeapTuple ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic);
+static Relation AllocateRelationDesc(Form_pg_class relp);
+static void RelationParseRelOptions(Relation relation, HeapTuple tuple);
+static void RelationBuildTupleDesc(Relation relation);
+static Relation RelationBuildDesc(Oid targetRelId, bool insertIt);
+static void RelationInitPhysicalAddr(Relation relation);
+static void load_critical_index(Oid indexoid, Oid heapoid);
+static TupleDesc GetPgClassDescriptor(void);
+static TupleDesc GetPgIndexDescriptor(void);
+static void AttrDefaultFetch(Relation relation, int ndef);
+static int AttrDefaultCmp(const void *a, const void *b);
+static void CheckConstraintFetch(Relation relation);
+static int CheckConstraintCmp(const void *a, const void *b);
+static void InitIndexAmRoutine(Relation relation);
+static void IndexSupportInitialize(oidvector *indclass,
+ RegProcedure *indexSupport,
+ Oid *opFamily,
+ Oid *opcInType,
+ StrategyNumber maxSupportNumber,
+ AttrNumber maxAttributeNumber);
+static OpClassCacheEnt *LookupOpclassInfo(Oid operatorClassOid,
+ StrategyNumber numSupport);
+static void RelationCacheInitFileRemoveInDir(const char *tblspcpath);
+static void unlink_initfile(const char *initfilename, int elevel);
+
+
+/*
+ * ScanPgRelation
+ *
+ * This is used by RelationBuildDesc to find a pg_class
+ * tuple matching targetRelId. The caller must hold at least
+ * AccessShareLock on the target relid to prevent concurrent-update
+ * scenarios; it isn't guaranteed that all scans used to build the
+ * relcache entry will use the same snapshot. If, for example,
+ * an attribute were to be added after scanning pg_class and before
+ * scanning pg_attribute, relnatts wouldn't match.
+ *
+ * NB: the returned tuple has been copied into palloc'd storage
+ * and must eventually be freed with heap_freetuple.
+ */
+static HeapTuple
+ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic)
+{
+ HeapTuple pg_class_tuple;
+ Relation pg_class_desc;
+ SysScanDesc pg_class_scan;
+ ScanKeyData key[1];
+ Snapshot snapshot = NULL;
+
+ /*
+ * If something goes wrong during backend startup, we might find ourselves
+ * trying to read pg_class before we've selected a database. That ain't
+ * gonna work, so bail out with a useful error message. If this happens,
+ * it probably means a relcache entry that needs to be nailed isn't.
+ */
+ if (!OidIsValid(MyDatabaseId))
+ elog(FATAL, "cannot read pg_class without having selected a database");
+
+ /*
+ * form a scan key
+ */
+ ScanKeyInit(&key[0],
+ Anum_pg_class_oid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(targetRelId));
+
+ /*
+ * Open pg_class and fetch a tuple. Force heap scan if we haven't yet
+ * built the critical relcache entries (this includes initdb and startup
+ * without a pg_internal.init file). The caller can also force a heap
+ * scan by setting indexOK == false.
+ */
+ pg_class_desc = table_open(RelationRelationId, AccessShareLock);
+
+ /*
+ * The caller might need a tuple that's newer than the one the historic
+ * snapshot; currently the only case requiring to do so is looking up the
+ * relfilenode of non mapped system relations during decoding. That
+ * snapshot can't change in the midst of a relcache build, so there's no
+ * need to register the snapshot.
+ */
+ if (force_non_historic)
+ snapshot = GetNonHistoricCatalogSnapshot(RelationRelationId);
+
+ pg_class_scan = systable_beginscan(pg_class_desc, ClassOidIndexId,
+ indexOK && criticalRelcachesBuilt,
+ snapshot,
+ 1, key);
+
+ pg_class_tuple = systable_getnext(pg_class_scan);
+
+ /*
+ * Must copy tuple before releasing buffer.
+ */
+ if (HeapTupleIsValid(pg_class_tuple))
+ pg_class_tuple = heap_copytuple(pg_class_tuple);
+
+ /* all done */
+ systable_endscan(pg_class_scan);
+ table_close(pg_class_desc, AccessShareLock);
+
+ return pg_class_tuple;
+}
+
+/*
+ * AllocateRelationDesc
+ *
+ * This is used to allocate memory for a new relation descriptor
+ * and initialize the rd_rel field from the given pg_class tuple.
+ */
+static Relation
+AllocateRelationDesc(Form_pg_class relp)
+{
+ Relation relation;
+ MemoryContext oldcxt;
+ Form_pg_class relationForm;
+
+ /* Relcache entries must live in CacheMemoryContext */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * allocate and zero space for new relation descriptor
+ */
+ relation = (Relation) palloc0(sizeof(RelationData));
+
+ /* make sure relation is marked as having no open file yet */
+ relation->rd_smgr = NULL;
+
+ /*
+ * Copy the relation tuple form
+ *
+ * We only allocate space for the fixed fields, ie, CLASS_TUPLE_SIZE. The
+ * variable-length fields (relacl, reloptions) are NOT stored in the
+ * relcache --- there'd be little point in it, since we don't copy the
+ * tuple's nulls bitmap and hence wouldn't know if the values are valid.
+ * Bottom line is that relacl *cannot* be retrieved from the relcache. Get
+ * it from the syscache if you need it. The same goes for the original
+ * form of reloptions (however, we do store the parsed form of reloptions
+ * in rd_options).
+ */
+ relationForm = (Form_pg_class) palloc(CLASS_TUPLE_SIZE);
+
+ memcpy(relationForm, relp, CLASS_TUPLE_SIZE);
+
+ /* initialize relation tuple form */
+ relation->rd_rel = relationForm;
+
+ /* and allocate attribute tuple form storage */
+ relation->rd_att = CreateTemplateTupleDesc(relationForm->relnatts);
+ /* which we mark as a reference-counted tupdesc */
+ relation->rd_att->tdrefcount = 1;
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return relation;
+}
+
+/*
+ * RelationParseRelOptions
+ * Convert pg_class.reloptions into pre-parsed rd_options
+ *
+ * tuple is the real pg_class tuple (not rd_rel!) for relation
+ *
+ * Note: rd_rel and (if an index) rd_indam must be valid already
+ */
+static void
+RelationParseRelOptions(Relation relation, HeapTuple tuple)
+{
+ bytea *options;
+ amoptions_function amoptsfn;
+
+ relation->rd_options = NULL;
+
+ /*
+ * Look up any AM-specific parse function; fall out if relkind should not
+ * have options.
+ */
+ switch (relation->rd_rel->relkind)
+ {
+ case RELKIND_RELATION:
+ case RELKIND_TOASTVALUE:
+ case RELKIND_VIEW:
+ case RELKIND_MATVIEW:
+ case RELKIND_PARTITIONED_TABLE:
+ amoptsfn = NULL;
+ break;
+ case RELKIND_INDEX:
+ case RELKIND_PARTITIONED_INDEX:
+ amoptsfn = relation->rd_indam->amoptions;
+ break;
+ default:
+ return;
+ }
+
+ /*
+ * Fetch reloptions from tuple; have to use a hardwired descriptor because
+ * we might not have any other for pg_class yet (consider executing this
+ * code for pg_class itself)
+ */
+ options = extractRelOptions(tuple, GetPgClassDescriptor(), amoptsfn);
+
+ /*
+ * Copy parsed data into CacheMemoryContext. To guard against the
+ * possibility of leaks in the reloptions code, we want to do the actual
+ * parsing in the caller's memory context and copy the results into
+ * CacheMemoryContext after the fact.
+ */
+ if (options)
+ {
+ relation->rd_options = MemoryContextAlloc(CacheMemoryContext,
+ VARSIZE(options));
+ memcpy(relation->rd_options, options, VARSIZE(options));
+ pfree(options);
+ }
+}
+
+/*
+ * RelationBuildTupleDesc
+ *
+ * Form the relation's tuple descriptor from information in
+ * the pg_attribute, pg_attrdef & pg_constraint system catalogs.
+ */
+static void
+RelationBuildTupleDesc(Relation relation)
+{
+ HeapTuple pg_attribute_tuple;
+ Relation pg_attribute_desc;
+ SysScanDesc pg_attribute_scan;
+ ScanKeyData skey[2];
+ int need;
+ TupleConstr *constr;
+ AttrMissing *attrmiss = NULL;
+ int ndef = 0;
+
+ /* fill rd_att's type ID fields (compare heap.c's AddNewRelationTuple) */
+ relation->rd_att->tdtypeid =
+ relation->rd_rel->reltype ? relation->rd_rel->reltype : RECORDOID;
+ relation->rd_att->tdtypmod = -1; /* just to be sure */
+
+ constr = (TupleConstr *) MemoryContextAllocZero(CacheMemoryContext,
+ sizeof(TupleConstr));
+ constr->has_not_null = false;
+ constr->has_generated_stored = false;
+
+ /*
+ * Form a scan key that selects only user attributes (attnum > 0).
+ * (Eliminating system attribute rows at the index level is lots faster
+ * than fetching them.)
+ */
+ ScanKeyInit(&skey[0],
+ Anum_pg_attribute_attrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+ ScanKeyInit(&skey[1],
+ Anum_pg_attribute_attnum,
+ BTGreaterStrategyNumber, F_INT2GT,
+ Int16GetDatum(0));
+
+ /*
+ * Open pg_attribute and begin a scan. Force heap scan if we haven't yet
+ * built the critical relcache entries (this includes initdb and startup
+ * without a pg_internal.init file).
+ */
+ pg_attribute_desc = table_open(AttributeRelationId, AccessShareLock);
+ pg_attribute_scan = systable_beginscan(pg_attribute_desc,
+ AttributeRelidNumIndexId,
+ criticalRelcachesBuilt,
+ NULL,
+ 2, skey);
+
+ /*
+ * add attribute data to relation->rd_att
+ */
+ need = RelationGetNumberOfAttributes(relation);
+
+ while (HeapTupleIsValid(pg_attribute_tuple = systable_getnext(pg_attribute_scan)))
+ {
+ Form_pg_attribute attp;
+ int attnum;
+
+ attp = (Form_pg_attribute) GETSTRUCT(pg_attribute_tuple);
+
+ attnum = attp->attnum;
+ if (attnum <= 0 || attnum > RelationGetNumberOfAttributes(relation))
+ elog(ERROR, "invalid attribute number %d for relation \"%s\"",
+ attp->attnum, RelationGetRelationName(relation));
+
+ memcpy(TupleDescAttr(relation->rd_att, attnum - 1),
+ attp,
+ ATTRIBUTE_FIXED_PART_SIZE);
+
+ /* Update constraint/default info */
+ if (attp->attnotnull)
+ constr->has_not_null = true;
+ if (attp->attgenerated == ATTRIBUTE_GENERATED_STORED)
+ constr->has_generated_stored = true;
+ if (attp->atthasdef)
+ ndef++;
+
+ /* If the column has a "missing" value, put it in the attrmiss array */
+ if (attp->atthasmissing)
+ {
+ Datum missingval;
+ bool missingNull;
+
+ /* Do we have a missing value? */
+ missingval = heap_getattr(pg_attribute_tuple,
+ Anum_pg_attribute_attmissingval,
+ pg_attribute_desc->rd_att,
+ &missingNull);
+ if (!missingNull)
+ {
+ /* Yes, fetch from the array */
+ MemoryContext oldcxt;
+ bool is_null;
+ int one = 1;
+ Datum missval;
+
+ if (attrmiss == NULL)
+ attrmiss = (AttrMissing *)
+ MemoryContextAllocZero(CacheMemoryContext,
+ relation->rd_rel->relnatts *
+ sizeof(AttrMissing));
+
+ missval = array_get_element(missingval,
+ 1,
+ &one,
+ -1,
+ attp->attlen,
+ attp->attbyval,
+ attp->attalign,
+ &is_null);
+ Assert(!is_null);
+ if (attp->attbyval)
+ {
+ /* for copy by val just copy the datum direct */
+ attrmiss[attnum - 1].am_value = missval;
+ }
+ else
+ {
+ /* otherwise copy in the correct context */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ attrmiss[attnum - 1].am_value = datumCopy(missval,
+ attp->attbyval,
+ attp->attlen);
+ MemoryContextSwitchTo(oldcxt);
+ }
+ attrmiss[attnum - 1].am_present = true;
+ }
+ }
+ need--;
+ if (need == 0)
+ break;
+ }
+
+ /*
+ * end the scan and close the attribute relation
+ */
+ systable_endscan(pg_attribute_scan);
+ table_close(pg_attribute_desc, AccessShareLock);
+
+ if (need != 0)
+ elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
+ need, RelationGetRelid(relation));
+
+ /*
+ * The attcacheoff values we read from pg_attribute should all be -1
+ * ("unknown"). Verify this if assert checking is on. They will be
+ * computed when and if needed during tuple access.
+ */
+#ifdef USE_ASSERT_CHECKING
+ {
+ int i;
+
+ for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
+ Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
+ }
+#endif
+
+ /*
+ * However, we can easily set the attcacheoff value for the first
+ * attribute: it must be zero. This eliminates the need for special cases
+ * for attnum=1 that used to exist in fastgetattr() and index_getattr().
+ */
+ if (RelationGetNumberOfAttributes(relation) > 0)
+ TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+
+ /*
+ * Set up constraint/default info
+ */
+ if (constr->has_not_null ||
+ constr->has_generated_stored ||
+ ndef > 0 ||
+ attrmiss ||
+ relation->rd_rel->relchecks > 0)
+ {
+ relation->rd_att->constr = constr;
+
+ if (ndef > 0) /* DEFAULTs */
+ AttrDefaultFetch(relation, ndef);
+ else
+ constr->num_defval = 0;
+
+ constr->missing = attrmiss;
+
+ if (relation->rd_rel->relchecks > 0) /* CHECKs */
+ CheckConstraintFetch(relation);
+ else
+ constr->num_check = 0;
+ }
+ else
+ {
+ pfree(constr);
+ relation->rd_att->constr = NULL;
+ }
+}
+
+/*
+ * RelationBuildRuleLock
+ *
+ * Form the relation's rewrite rules from information in
+ * the pg_rewrite system catalog.
+ *
+ * Note: The rule parsetrees are potentially very complex node structures.
+ * To allow these trees to be freed when the relcache entry is flushed,
+ * we make a private memory context to hold the RuleLock information for
+ * each relcache entry that has associated rules. The context is used
+ * just for rule info, not for any other subsidiary data of the relcache
+ * entry, because that keeps the update logic in RelationClearRelation()
+ * manageable. The other subsidiary data structures are simple enough
+ * to be easy to free explicitly, anyway.
+ *
+ * Note: The relation's reloptions must have been extracted first.
+ */
+static void
+RelationBuildRuleLock(Relation relation)
+{
+ MemoryContext rulescxt;
+ MemoryContext oldcxt;
+ HeapTuple rewrite_tuple;
+ Relation rewrite_desc;
+ TupleDesc rewrite_tupdesc;
+ SysScanDesc rewrite_scan;
+ ScanKeyData key;
+ RuleLock *rulelock;
+ int numlocks;
+ RewriteRule **rules;
+ int maxlocks;
+
+ /*
+ * Make the private context. Assume it'll not contain much data.
+ */
+ rulescxt = AllocSetContextCreate(CacheMemoryContext,
+ "relation rules",
+ ALLOCSET_SMALL_SIZES);
+ relation->rd_rulescxt = rulescxt;
+ MemoryContextCopyAndSetIdentifier(rulescxt,
+ RelationGetRelationName(relation));
+
+ /*
+ * allocate an array to hold the rewrite rules (the array is extended if
+ * necessary)
+ */
+ maxlocks = 4;
+ rules = (RewriteRule **)
+ MemoryContextAlloc(rulescxt, sizeof(RewriteRule *) * maxlocks);
+ numlocks = 0;
+
+ /*
+ * form a scan key
+ */
+ ScanKeyInit(&key,
+ Anum_pg_rewrite_ev_class,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ /*
+ * open pg_rewrite and begin a scan
+ *
+ * Note: since we scan the rules using RewriteRelRulenameIndexId, we will
+ * be reading the rules in name order, except possibly during
+ * emergency-recovery operations (ie, IgnoreSystemIndexes). This in turn
+ * ensures that rules will be fired in name order.
+ */
+ rewrite_desc = table_open(RewriteRelationId, AccessShareLock);
+ rewrite_tupdesc = RelationGetDescr(rewrite_desc);
+ rewrite_scan = systable_beginscan(rewrite_desc,
+ RewriteRelRulenameIndexId,
+ true, NULL,
+ 1, &key);
+
+ while (HeapTupleIsValid(rewrite_tuple = systable_getnext(rewrite_scan)))
+ {
+ Form_pg_rewrite rewrite_form = (Form_pg_rewrite) GETSTRUCT(rewrite_tuple);
+ bool isnull;
+ Datum rule_datum;
+ char *rule_str;
+ RewriteRule *rule;
+ Oid check_as_user;
+
+ rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
+ sizeof(RewriteRule));
+
+ rule->ruleId = rewrite_form->oid;
+
+ rule->event = rewrite_form->ev_type - '0';
+ rule->enabled = rewrite_form->ev_enabled;
+ rule->isInstead = rewrite_form->is_instead;
+
+ /*
+ * Must use heap_getattr to fetch ev_action and ev_qual. Also, the
+ * rule strings are often large enough to be toasted. To avoid
+ * leaking memory in the caller's context, do the detoasting here so
+ * we can free the detoasted version.
+ */
+ rule_datum = heap_getattr(rewrite_tuple,
+ Anum_pg_rewrite_ev_action,
+ rewrite_tupdesc,
+ &isnull);
+ Assert(!isnull);
+ rule_str = TextDatumGetCString(rule_datum);
+ oldcxt = MemoryContextSwitchTo(rulescxt);
+ rule->actions = (List *) stringToNode(rule_str);
+ MemoryContextSwitchTo(oldcxt);
+ pfree(rule_str);
+
+ rule_datum = heap_getattr(rewrite_tuple,
+ Anum_pg_rewrite_ev_qual,
+ rewrite_tupdesc,
+ &isnull);
+ Assert(!isnull);
+ rule_str = TextDatumGetCString(rule_datum);
+ oldcxt = MemoryContextSwitchTo(rulescxt);
+ rule->qual = (Node *) stringToNode(rule_str);
+ MemoryContextSwitchTo(oldcxt);
+ pfree(rule_str);
+
+ /*
+ * If this is a SELECT rule defining a view, and the view has
+ * "security_invoker" set, we must perform all permissions checks on
+ * relations referred to by the rule as the invoking user.
+ *
+ * In all other cases (including non-SELECT rules on security invoker
+ * views), perform the permissions checks as the relation owner.
+ */
+ if (rule->event == CMD_SELECT &&
+ relation->rd_rel->relkind == RELKIND_VIEW &&
+ RelationHasSecurityInvoker(relation))
+ check_as_user = InvalidOid;
+ else
+ check_as_user = relation->rd_rel->relowner;
+
+ /*
+ * Scan through the rule's actions and set the checkAsUser field on
+ * all rtable entries. We have to look at the qual as well, in case it
+ * contains sublinks.
+ *
+ * The reason for doing this when the rule is loaded, rather than when
+ * it is stored, is that otherwise ALTER TABLE OWNER would have to
+ * grovel through stored rules to update checkAsUser fields. Scanning
+ * the rule tree during load is relatively cheap (compared to
+ * constructing it in the first place), so we do it here.
+ */
+ setRuleCheckAsUser((Node *) rule->actions, check_as_user);
+ setRuleCheckAsUser(rule->qual, check_as_user);
+
+ if (numlocks >= maxlocks)
+ {
+ maxlocks *= 2;
+ rules = (RewriteRule **)
+ repalloc(rules, sizeof(RewriteRule *) * maxlocks);
+ }
+ rules[numlocks++] = rule;
+ }
+
+ /*
+ * end the scan and close the attribute relation
+ */
+ systable_endscan(rewrite_scan);
+ table_close(rewrite_desc, AccessShareLock);
+
+ /*
+ * there might not be any rules (if relhasrules is out-of-date)
+ */
+ if (numlocks == 0)
+ {
+ relation->rd_rules = NULL;
+ relation->rd_rulescxt = NULL;
+ MemoryContextDelete(rulescxt);
+ return;
+ }
+
+ /*
+ * form a RuleLock and insert into relation
+ */
+ rulelock = (RuleLock *) MemoryContextAlloc(rulescxt, sizeof(RuleLock));
+ rulelock->numLocks = numlocks;
+ rulelock->rules = rules;
+
+ relation->rd_rules = rulelock;
+}
+
+/*
+ * equalRuleLocks
+ *
+ * Determine whether two RuleLocks are equivalent
+ *
+ * Probably this should be in the rules code someplace...
+ */
+static bool
+equalRuleLocks(RuleLock *rlock1, RuleLock *rlock2)
+{
+ int i;
+
+ /*
+ * As of 7.3 we assume the rule ordering is repeatable, because
+ * RelationBuildRuleLock should read 'em in a consistent order. So just
+ * compare corresponding slots.
+ */
+ if (rlock1 != NULL)
+ {
+ if (rlock2 == NULL)
+ return false;
+ if (rlock1->numLocks != rlock2->numLocks)
+ return false;
+ for (i = 0; i < rlock1->numLocks; i++)
+ {
+ RewriteRule *rule1 = rlock1->rules[i];
+ RewriteRule *rule2 = rlock2->rules[i];
+
+ if (rule1->ruleId != rule2->ruleId)
+ return false;
+ if (rule1->event != rule2->event)
+ return false;
+ if (rule1->enabled != rule2->enabled)
+ return false;
+ if (rule1->isInstead != rule2->isInstead)
+ return false;
+ if (!equal(rule1->qual, rule2->qual))
+ return false;
+ if (!equal(rule1->actions, rule2->actions))
+ return false;
+ }
+ }
+ else if (rlock2 != NULL)
+ return false;
+ return true;
+}
+
+/*
+ * equalPolicy
+ *
+ * Determine whether two policies are equivalent
+ */
+static bool
+equalPolicy(RowSecurityPolicy *policy1, RowSecurityPolicy *policy2)
+{
+ int i;
+ Oid *r1,
+ *r2;
+
+ if (policy1 != NULL)
+ {
+ if (policy2 == NULL)
+ return false;
+
+ if (policy1->polcmd != policy2->polcmd)
+ return false;
+ if (policy1->hassublinks != policy2->hassublinks)
+ return false;
+ if (strcmp(policy1->policy_name, policy2->policy_name) != 0)
+ return false;
+ if (ARR_DIMS(policy1->roles)[0] != ARR_DIMS(policy2->roles)[0])
+ return false;
+
+ r1 = (Oid *) ARR_DATA_PTR(policy1->roles);
+ r2 = (Oid *) ARR_DATA_PTR(policy2->roles);
+
+ for (i = 0; i < ARR_DIMS(policy1->roles)[0]; i++)
+ {
+ if (r1[i] != r2[i])
+ return false;
+ }
+
+ if (!equal(policy1->qual, policy2->qual))
+ return false;
+ if (!equal(policy1->with_check_qual, policy2->with_check_qual))
+ return false;
+ }
+ else if (policy2 != NULL)
+ return false;
+
+ return true;
+}
+
+/*
+ * equalRSDesc
+ *
+ * Determine whether two RowSecurityDesc's are equivalent
+ */
+static bool
+equalRSDesc(RowSecurityDesc *rsdesc1, RowSecurityDesc *rsdesc2)
+{
+ ListCell *lc,
+ *rc;
+
+ if (rsdesc1 == NULL && rsdesc2 == NULL)
+ return true;
+
+ if ((rsdesc1 != NULL && rsdesc2 == NULL) ||
+ (rsdesc1 == NULL && rsdesc2 != NULL))
+ return false;
+
+ if (list_length(rsdesc1->policies) != list_length(rsdesc2->policies))
+ return false;
+
+ /* RelationBuildRowSecurity should build policies in order */
+ forboth(lc, rsdesc1->policies, rc, rsdesc2->policies)
+ {
+ RowSecurityPolicy *l = (RowSecurityPolicy *) lfirst(lc);
+ RowSecurityPolicy *r = (RowSecurityPolicy *) lfirst(rc);
+
+ if (!equalPolicy(l, r))
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * RelationBuildDesc
+ *
+ * Build a relation descriptor. The caller must hold at least
+ * AccessShareLock on the target relid.
+ *
+ * The new descriptor is inserted into the hash table if insertIt is true.
+ *
+ * Returns NULL if no pg_class row could be found for the given relid
+ * (suggesting we are trying to access a just-deleted relation).
+ * Any other error is reported via elog.
+ */
+static Relation
+RelationBuildDesc(Oid targetRelId, bool insertIt)
+{
+ int in_progress_offset;
+ Relation relation;
+ Oid relid;
+ HeapTuple pg_class_tuple;
+ Form_pg_class relp;
+
+ /*
+ * This function and its subroutines can allocate a good deal of transient
+ * data in CurrentMemoryContext. Traditionally we've just leaked that
+ * data, reasoning that the caller's context is at worst of transaction
+ * scope, and relcache loads shouldn't happen so often that it's essential
+ * to recover transient data before end of statement/transaction. However
+ * that's definitely not true when debug_discard_caches is active, and
+ * perhaps it's not true in other cases.
+ *
+ * When debug_discard_caches is active or when forced to by
+ * RECOVER_RELATION_BUILD_MEMORY=1, arrange to allocate the junk in a
+ * temporary context that we'll free before returning. Make it a child of
+ * caller's context so that it will get cleaned up appropriately if we
+ * error out partway through.
+ */
+#ifdef MAYBE_RECOVER_RELATION_BUILD_MEMORY
+ MemoryContext tmpcxt = NULL;
+ MemoryContext oldcxt = NULL;
+
+ if (RECOVER_RELATION_BUILD_MEMORY || debug_discard_caches > 0)
+ {
+ tmpcxt = AllocSetContextCreate(CurrentMemoryContext,
+ "RelationBuildDesc workspace",
+ ALLOCSET_DEFAULT_SIZES);
+ oldcxt = MemoryContextSwitchTo(tmpcxt);
+ }
+#endif
+
+ /* Register to catch invalidation messages */
+ if (in_progress_list_len >= in_progress_list_maxlen)
+ {
+ int allocsize;
+
+ allocsize = in_progress_list_maxlen * 2;
+ in_progress_list = repalloc(in_progress_list,
+ allocsize * sizeof(*in_progress_list));
+ in_progress_list_maxlen = allocsize;
+ }
+ in_progress_offset = in_progress_list_len++;
+ in_progress_list[in_progress_offset].reloid = targetRelId;
+retry:
+ in_progress_list[in_progress_offset].invalidated = false;
+
+ /*
+ * find the tuple in pg_class corresponding to the given relation id
+ */
+ pg_class_tuple = ScanPgRelation(targetRelId, true, false);
+
+ /*
+ * if no such tuple exists, return NULL
+ */
+ if (!HeapTupleIsValid(pg_class_tuple))
+ {
+#ifdef MAYBE_RECOVER_RELATION_BUILD_MEMORY
+ if (tmpcxt)
+ {
+ /* Return to caller's context, and blow away the temporary context */
+ MemoryContextSwitchTo(oldcxt);
+ MemoryContextDelete(tmpcxt);
+ }
+#endif
+ Assert(in_progress_offset + 1 == in_progress_list_len);
+ in_progress_list_len--;
+ return NULL;
+ }
+
+ /*
+ * get information from the pg_class_tuple
+ */
+ relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
+ relid = relp->oid;
+ Assert(relid == targetRelId);
+
+ /*
+ * allocate storage for the relation descriptor, and copy pg_class_tuple
+ * to relation->rd_rel.
+ */
+ relation = AllocateRelationDesc(relp);
+
+ /*
+ * initialize the relation's relation id (relation->rd_id)
+ */
+ RelationGetRelid(relation) = relid;
+
+ /*
+ * Normal relations are not nailed into the cache. Since we don't flush
+ * new relations, it won't be new. It could be temp though.
+ */
+ relation->rd_refcnt = 0;
+ relation->rd_isnailed = false;
+ relation->rd_createSubid = InvalidSubTransactionId;
+ relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_droppedSubid = InvalidSubTransactionId;
+ switch (relation->rd_rel->relpersistence)
+ {
+ case RELPERSISTENCE_UNLOGGED:
+ case RELPERSISTENCE_PERMANENT:
+ relation->rd_backend = InvalidBackendId;
+ relation->rd_islocaltemp = false;
+ break;
+ case RELPERSISTENCE_TEMP:
+ if (isTempOrTempToastNamespace(relation->rd_rel->relnamespace))
+ {
+ relation->rd_backend = BackendIdForTempRelations();
+ relation->rd_islocaltemp = true;
+ }
+ else
+ {
+ /*
+ * If it's a temp table, but not one of ours, we have to use
+ * the slow, grotty method to figure out the owning backend.
+ *
+ * Note: it's possible that rd_backend gets set to MyBackendId
+ * here, in case we are looking at a pg_class entry left over
+ * from a crashed backend that coincidentally had the same
+ * BackendId we're using. We should *not* consider such a
+ * table to be "ours"; this is why we need the separate
+ * rd_islocaltemp flag. The pg_class entry will get flushed
+ * if/when we clean out the corresponding temp table namespace
+ * in preparation for using it.
+ */
+ relation->rd_backend =
+ GetTempNamespaceBackendId(relation->rd_rel->relnamespace);
+ Assert(relation->rd_backend != InvalidBackendId);
+ relation->rd_islocaltemp = false;
+ }
+ break;
+ default:
+ elog(ERROR, "invalid relpersistence: %c",
+ relation->rd_rel->relpersistence);
+ break;
+ }
+
+ /*
+ * initialize the tuple descriptor (relation->rd_att).
+ */
+ RelationBuildTupleDesc(relation);
+
+ /* foreign key data is not loaded till asked for */
+ relation->rd_fkeylist = NIL;
+ relation->rd_fkeyvalid = false;
+
+ /* partitioning data is not loaded till asked for */
+ relation->rd_partkey = NULL;
+ relation->rd_partkeycxt = NULL;
+ relation->rd_partdesc = NULL;
+ relation->rd_partdesc_nodetached = NULL;
+ relation->rd_partdesc_nodetached_xmin = InvalidTransactionId;
+ relation->rd_pdcxt = NULL;
+ relation->rd_pddcxt = NULL;
+ relation->rd_partcheck = NIL;
+ relation->rd_partcheckvalid = false;
+ relation->rd_partcheckcxt = NULL;
+
+ /*
+ * initialize access method information
+ */
+ if (relation->rd_rel->relkind == RELKIND_INDEX ||
+ relation->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
+ RelationInitIndexAccessInfo(relation);
+ else if (RELKIND_HAS_TABLE_AM(relation->rd_rel->relkind) ||
+ relation->rd_rel->relkind == RELKIND_SEQUENCE)
+ RelationInitTableAccessMethod(relation);
+ else
+ Assert(relation->rd_rel->relam == InvalidOid);
+
+ /* extract reloptions if any */
+ RelationParseRelOptions(relation, pg_class_tuple);
+
+ /*
+ * Fetch rules and triggers that affect this relation.
+ *
+ * Note that RelationBuildRuleLock() relies on this being done after
+ * extracting the relation's reloptions.
+ */
+ if (relation->rd_rel->relhasrules)
+ RelationBuildRuleLock(relation);
+ else
+ {
+ relation->rd_rules = NULL;
+ relation->rd_rulescxt = NULL;
+ }
+
+ if (relation->rd_rel->relhastriggers)
+ RelationBuildTriggers(relation);
+ else
+ relation->trigdesc = NULL;
+
+ if (relation->rd_rel->relrowsecurity)
+ RelationBuildRowSecurity(relation);
+ else
+ relation->rd_rsdesc = NULL;
+
+ /*
+ * initialize the relation lock manager information
+ */
+ RelationInitLockInfo(relation); /* see lmgr.c */
+
+ /*
+ * initialize physical addressing information for the relation
+ */
+ RelationInitPhysicalAddr(relation);
+
+ /* make sure relation is marked as having no open file yet */
+ relation->rd_smgr = NULL;
+
+ /*
+ * now we can free the memory allocated for pg_class_tuple
+ */
+ heap_freetuple(pg_class_tuple);
+
+ /*
+ * If an invalidation arrived mid-build, start over. Between here and the
+ * end of this function, don't add code that does or reasonably could read
+ * system catalogs. That range must be free from invalidation processing
+ * for the !insertIt case. For the insertIt case, RelationCacheInsert()
+ * will enroll this relation in ordinary relcache invalidation processing,
+ */
+ if (in_progress_list[in_progress_offset].invalidated)
+ {
+ RelationDestroyRelation(relation, false);
+ goto retry;
+ }
+ Assert(in_progress_offset + 1 == in_progress_list_len);
+ in_progress_list_len--;
+
+ /*
+ * Insert newly created relation into relcache hash table, if requested.
+ *
+ * There is one scenario in which we might find a hashtable entry already
+ * present, even though our caller failed to find it: if the relation is a
+ * system catalog or index that's used during relcache load, we might have
+ * recursively created the same relcache entry during the preceding steps.
+ * So allow RelationCacheInsert to delete any already-present relcache
+ * entry for the same OID. The already-present entry should have refcount
+ * zero (else somebody forgot to close it); in the event that it doesn't,
+ * we'll elog a WARNING and leak the already-present entry.
+ */
+ if (insertIt)
+ RelationCacheInsert(relation, true);
+
+ /* It's fully valid */
+ relation->rd_isvalid = true;
+
+#ifdef MAYBE_RECOVER_RELATION_BUILD_MEMORY
+ if (tmpcxt)
+ {
+ /* Return to caller's context, and blow away the temporary context */
+ MemoryContextSwitchTo(oldcxt);
+ MemoryContextDelete(tmpcxt);
+ }
+#endif
+
+ return relation;
+}
+
+/*
+ * Initialize the physical addressing info (RelFileNode) for a relcache entry
+ *
+ * Note: at the physical level, relations in the pg_global tablespace must
+ * be treated as shared, even if relisshared isn't set. Hence we do not
+ * look at relisshared here.
+ */
+static void
+RelationInitPhysicalAddr(Relation relation)
+{
+ Oid oldnode = relation->rd_node.relNode;
+
+ /* these relations kinds never have storage */
+ if (!RELKIND_HAS_STORAGE(relation->rd_rel->relkind))
+ return;
+
+ if (relation->rd_rel->reltablespace)
+ relation->rd_node.spcNode = relation->rd_rel->reltablespace;
+ else
+ relation->rd_node.spcNode = MyDatabaseTableSpace;
+ if (relation->rd_node.spcNode == GLOBALTABLESPACE_OID)
+ relation->rd_node.dbNode = InvalidOid;
+ else
+ relation->rd_node.dbNode = MyDatabaseId;
+
+ if (relation->rd_rel->relfilenode)
+ {
+ /*
+ * Even if we are using a decoding snapshot that doesn't represent the
+ * current state of the catalog we need to make sure the filenode
+ * points to the current file since the older file will be gone (or
+ * truncated). The new file will still contain older rows so lookups
+ * in them will work correctly. This wouldn't work correctly if
+ * rewrites were allowed to change the schema in an incompatible way,
+ * but those are prevented both on catalog tables and on user tables
+ * declared as additional catalog tables.
+ */
+ if (HistoricSnapshotActive()
+ && RelationIsAccessibleInLogicalDecoding(relation)
+ && IsTransactionState())
+ {
+ HeapTuple phys_tuple;
+ Form_pg_class physrel;
+
+ phys_tuple = ScanPgRelation(RelationGetRelid(relation),
+ RelationGetRelid(relation) != ClassOidIndexId,
+ true);
+ if (!HeapTupleIsValid(phys_tuple))
+ elog(ERROR, "could not find pg_class entry for %u",
+ RelationGetRelid(relation));
+ physrel = (Form_pg_class) GETSTRUCT(phys_tuple);
+
+ relation->rd_rel->reltablespace = physrel->reltablespace;
+ relation->rd_rel->relfilenode = physrel->relfilenode;
+ heap_freetuple(phys_tuple);
+ }
+
+ relation->rd_node.relNode = relation->rd_rel->relfilenode;
+ }
+ else
+ {
+ /* Consult the relation mapper */
+ relation->rd_node.relNode =
+ RelationMapOidToFilenode(relation->rd_id,
+ relation->rd_rel->relisshared);
+ if (!OidIsValid(relation->rd_node.relNode))
+ elog(ERROR, "could not find relation mapping for relation \"%s\", OID %u",
+ RelationGetRelationName(relation), relation->rd_id);
+ }
+
+ /*
+ * For RelationNeedsWAL() to answer correctly on parallel workers, restore
+ * rd_firstRelfilenodeSubid. No subtransactions start or end while in
+ * parallel mode, so the specific SubTransactionId does not matter.
+ */
+ if (IsParallelWorker() && oldnode != relation->rd_node.relNode)
+ {
+ if (RelFileNodeSkippingWAL(relation->rd_node))
+ relation->rd_firstRelfilenodeSubid = TopSubTransactionId;
+ else
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ }
+}
+
+/*
+ * Fill in the IndexAmRoutine for an index relation.
+ *
+ * relation's rd_amhandler and rd_indexcxt must be valid already.
+ */
+static void
+InitIndexAmRoutine(Relation relation)
+{
+ IndexAmRoutine *cached,
+ *tmp;
+
+ /*
+ * Call the amhandler in current, short-lived memory context, just in case
+ * it leaks anything (it probably won't, but let's be paranoid).
+ */
+ tmp = GetIndexAmRoutine(relation->rd_amhandler);
+
+ /* OK, now transfer the data into relation's rd_indexcxt. */
+ cached = (IndexAmRoutine *) MemoryContextAlloc(relation->rd_indexcxt,
+ sizeof(IndexAmRoutine));
+ memcpy(cached, tmp, sizeof(IndexAmRoutine));
+ relation->rd_indam = cached;
+
+ pfree(tmp);
+}
+
+/*
+ * Initialize index-access-method support data for an index relation
+ */
+void
+RelationInitIndexAccessInfo(Relation relation)
+{
+ HeapTuple tuple;
+ Form_pg_am aform;
+ Datum indcollDatum;
+ Datum indclassDatum;
+ Datum indoptionDatum;
+ bool isnull;
+ oidvector *indcoll;
+ oidvector *indclass;
+ int2vector *indoption;
+ MemoryContext indexcxt;
+ MemoryContext oldcontext;
+ int indnatts;
+ int indnkeyatts;
+ uint16 amsupport;
+
+ /*
+ * Make a copy of the pg_index entry for the index. Since pg_index
+ * contains variable-length and possibly-null fields, we have to do this
+ * honestly rather than just treating it as a Form_pg_index struct.
+ */
+ tuple = SearchSysCache1(INDEXRELID,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for index %u",
+ RelationGetRelid(relation));
+ oldcontext = MemoryContextSwitchTo(CacheMemoryContext);
+ relation->rd_indextuple = heap_copytuple(tuple);
+ relation->rd_index = (Form_pg_index) GETSTRUCT(relation->rd_indextuple);
+ MemoryContextSwitchTo(oldcontext);
+ ReleaseSysCache(tuple);
+
+ /*
+ * Look up the index's access method, save the OID of its handler function
+ */
+ Assert(relation->rd_rel->relam != InvalidOid);
+ tuple = SearchSysCache1(AMOID, ObjectIdGetDatum(relation->rd_rel->relam));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for access method %u",
+ relation->rd_rel->relam);
+ aform = (Form_pg_am) GETSTRUCT(tuple);
+ relation->rd_amhandler = aform->amhandler;
+ ReleaseSysCache(tuple);
+
+ indnatts = RelationGetNumberOfAttributes(relation);
+ if (indnatts != IndexRelationGetNumberOfAttributes(relation))
+ elog(ERROR, "relnatts disagrees with indnatts for index %u",
+ RelationGetRelid(relation));
+ indnkeyatts = IndexRelationGetNumberOfKeyAttributes(relation);
+
+ /*
+ * Make the private context to hold index access info. The reason we need
+ * a context, and not just a couple of pallocs, is so that we won't leak
+ * any subsidiary info attached to fmgr lookup records.
+ */
+ indexcxt = AllocSetContextCreate(CacheMemoryContext,
+ "index info",
+ ALLOCSET_SMALL_SIZES);
+ relation->rd_indexcxt = indexcxt;
+ MemoryContextCopyAndSetIdentifier(indexcxt,
+ RelationGetRelationName(relation));
+
+ /*
+ * Now we can fetch the index AM's API struct
+ */
+ InitIndexAmRoutine(relation);
+
+ /*
+ * Allocate arrays to hold data. Opclasses are not used for included
+ * columns, so allocate them for indnkeyatts only.
+ */
+ relation->rd_opfamily = (Oid *)
+ MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(Oid));
+ relation->rd_opcintype = (Oid *)
+ MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(Oid));
+
+ amsupport = relation->rd_indam->amsupport;
+ if (amsupport > 0)
+ {
+ int nsupport = indnatts * amsupport;
+
+ relation->rd_support = (RegProcedure *)
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure));
+ relation->rd_supportinfo = (FmgrInfo *)
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+ }
+ else
+ {
+ relation->rd_support = NULL;
+ relation->rd_supportinfo = NULL;
+ }
+
+ relation->rd_indcollation = (Oid *)
+ MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(Oid));
+
+ relation->rd_indoption = (int16 *)
+ MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(int16));
+
+ /*
+ * indcollation cannot be referenced directly through the C struct,
+ * because it comes after the variable-width indkey field. Must extract
+ * the datum the hard way...
+ */
+ indcollDatum = fastgetattr(relation->rd_indextuple,
+ Anum_pg_index_indcollation,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ indcoll = (oidvector *) DatumGetPointer(indcollDatum);
+ memcpy(relation->rd_indcollation, indcoll->values, indnkeyatts * sizeof(Oid));
+
+ /*
+ * indclass cannot be referenced directly through the C struct, because it
+ * comes after the variable-width indkey field. Must extract the datum
+ * the hard way...
+ */
+ indclassDatum = fastgetattr(relation->rd_indextuple,
+ Anum_pg_index_indclass,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ indclass = (oidvector *) DatumGetPointer(indclassDatum);
+
+ /*
+ * Fill the support procedure OID array, as well as the info about
+ * opfamilies and opclass input types. (aminfo and supportinfo are left
+ * as zeroes, and are filled on-the-fly when used)
+ */
+ IndexSupportInitialize(indclass, relation->rd_support,
+ relation->rd_opfamily, relation->rd_opcintype,
+ amsupport, indnkeyatts);
+
+ /*
+ * Similarly extract indoption and copy it to the cache entry
+ */
+ indoptionDatum = fastgetattr(relation->rd_indextuple,
+ Anum_pg_index_indoption,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ indoption = (int2vector *) DatumGetPointer(indoptionDatum);
+ memcpy(relation->rd_indoption, indoption->values, indnkeyatts * sizeof(int16));
+
+ (void) RelationGetIndexAttOptions(relation, false);
+
+ /*
+ * expressions, predicate, exclusion caches will be filled later
+ */
+ relation->rd_indexprs = NIL;
+ relation->rd_indpred = NIL;
+ relation->rd_exclops = NULL;
+ relation->rd_exclprocs = NULL;
+ relation->rd_exclstrats = NULL;
+ relation->rd_amcache = NULL;
+}
+
+/*
+ * IndexSupportInitialize
+ * Initializes an index's cached opclass information,
+ * given the index's pg_index.indclass entry.
+ *
+ * Data is returned into *indexSupport, *opFamily, and *opcInType,
+ * which are arrays allocated by the caller.
+ *
+ * The caller also passes maxSupportNumber and maxAttributeNumber, since these
+ * indicate the size of the arrays it has allocated --- but in practice these
+ * numbers must always match those obtainable from the system catalog entries
+ * for the index and access method.
+ */
+static void
+IndexSupportInitialize(oidvector *indclass,
+ RegProcedure *indexSupport,
+ Oid *opFamily,
+ Oid *opcInType,
+ StrategyNumber maxSupportNumber,
+ AttrNumber maxAttributeNumber)
+{
+ int attIndex;
+
+ for (attIndex = 0; attIndex < maxAttributeNumber; attIndex++)
+ {
+ OpClassCacheEnt *opcentry;
+
+ if (!OidIsValid(indclass->values[attIndex]))
+ elog(ERROR, "bogus pg_index tuple");
+
+ /* look up the info for this opclass, using a cache */
+ opcentry = LookupOpclassInfo(indclass->values[attIndex],
+ maxSupportNumber);
+
+ /* copy cached data into relcache entry */
+ opFamily[attIndex] = opcentry->opcfamily;
+ opcInType[attIndex] = opcentry->opcintype;
+ if (maxSupportNumber > 0)
+ memcpy(&indexSupport[attIndex * maxSupportNumber],
+ opcentry->supportProcs,
+ maxSupportNumber * sizeof(RegProcedure));
+ }
+}
+
+/*
+ * LookupOpclassInfo
+ *
+ * This routine maintains a per-opclass cache of the information needed
+ * by IndexSupportInitialize(). This is more efficient than relying on
+ * the catalog cache, because we can load all the info about a particular
+ * opclass in a single indexscan of pg_amproc.
+ *
+ * The information from pg_am about expected range of support function
+ * numbers is passed in, rather than being looked up, mainly because the
+ * caller will have it already.
+ *
+ * Note there is no provision for flushing the cache. This is OK at the
+ * moment because there is no way to ALTER any interesting properties of an
+ * existing opclass --- all you can do is drop it, which will result in
+ * a useless but harmless dead entry in the cache. To support altering
+ * opclass membership (not the same as opfamily membership!), we'd need to
+ * be able to flush this cache as well as the contents of relcache entries
+ * for indexes.
+ */
+static OpClassCacheEnt *
+LookupOpclassInfo(Oid operatorClassOid,
+ StrategyNumber numSupport)
+{
+ OpClassCacheEnt *opcentry;
+ bool found;
+ Relation rel;
+ SysScanDesc scan;
+ ScanKeyData skey[3];
+ HeapTuple htup;
+ bool indexOK;
+
+ if (OpClassCache == NULL)
+ {
+ /* First time through: initialize the opclass cache */
+ HASHCTL ctl;
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(OpClassCacheEnt);
+ OpClassCache = hash_create("Operator class cache", 64,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+ }
+
+ opcentry = (OpClassCacheEnt *) hash_search(OpClassCache,
+ (void *) &operatorClassOid,
+ HASH_ENTER, &found);
+
+ if (!found)
+ {
+ /* Initialize new entry */
+ opcentry->valid = false; /* until known OK */
+ opcentry->numSupport = numSupport;
+ opcentry->supportProcs = NULL; /* filled below */
+ }
+ else
+ {
+ Assert(numSupport == opcentry->numSupport);
+ }
+
+ /*
+ * When aggressively testing cache-flush hazards, we disable the operator
+ * class cache and force reloading of the info on each call. This models
+ * no real-world behavior, since the cache entries are never invalidated
+ * otherwise. However it can be helpful for detecting bugs in the cache
+ * loading logic itself, such as reliance on a non-nailed index. Given
+ * the limited use-case and the fact that this adds a great deal of
+ * expense, we enable it only for high values of debug_discard_caches.
+ */
+#ifdef DISCARD_CACHES_ENABLED
+ if (debug_discard_caches > 2)
+ opcentry->valid = false;
+#endif
+
+ if (opcentry->valid)
+ return opcentry;
+
+ /*
+ * Need to fill in new entry. First allocate space, unless we already did
+ * so in some previous attempt.
+ */
+ if (opcentry->supportProcs == NULL && numSupport > 0)
+ opcentry->supportProcs = (RegProcedure *)
+ MemoryContextAllocZero(CacheMemoryContext,
+ numSupport * sizeof(RegProcedure));
+
+ /*
+ * To avoid infinite recursion during startup, force heap scans if we're
+ * looking up info for the opclasses used by the indexes we would like to
+ * reference here.
+ */
+ indexOK = criticalRelcachesBuilt ||
+ (operatorClassOid != OID_BTREE_OPS_OID &&
+ operatorClassOid != INT2_BTREE_OPS_OID);
+
+ /*
+ * We have to fetch the pg_opclass row to determine its opfamily and
+ * opcintype, which are needed to look up related operators and functions.
+ * It'd be convenient to use the syscache here, but that probably doesn't
+ * work while bootstrapping.
+ */
+ ScanKeyInit(&skey[0],
+ Anum_pg_opclass_oid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(operatorClassOid));
+ rel = table_open(OperatorClassRelationId, AccessShareLock);
+ scan = systable_beginscan(rel, OpclassOidIndexId, indexOK,
+ NULL, 1, skey);
+
+ if (HeapTupleIsValid(htup = systable_getnext(scan)))
+ {
+ Form_pg_opclass opclassform = (Form_pg_opclass) GETSTRUCT(htup);
+
+ opcentry->opcfamily = opclassform->opcfamily;
+ opcentry->opcintype = opclassform->opcintype;
+ }
+ else
+ elog(ERROR, "could not find tuple for opclass %u", operatorClassOid);
+
+ systable_endscan(scan);
+ table_close(rel, AccessShareLock);
+
+ /*
+ * Scan pg_amproc to obtain support procs for the opclass. We only fetch
+ * the default ones (those with lefttype = righttype = opcintype).
+ */
+ if (numSupport > 0)
+ {
+ ScanKeyInit(&skey[0],
+ Anum_pg_amproc_amprocfamily,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(opcentry->opcfamily));
+ ScanKeyInit(&skey[1],
+ Anum_pg_amproc_amproclefttype,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(opcentry->opcintype));
+ ScanKeyInit(&skey[2],
+ Anum_pg_amproc_amprocrighttype,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(opcentry->opcintype));
+ rel = table_open(AccessMethodProcedureRelationId, AccessShareLock);
+ scan = systable_beginscan(rel, AccessMethodProcedureIndexId, indexOK,
+ NULL, 3, skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(scan)))
+ {
+ Form_pg_amproc amprocform = (Form_pg_amproc) GETSTRUCT(htup);
+
+ if (amprocform->amprocnum <= 0 ||
+ (StrategyNumber) amprocform->amprocnum > numSupport)
+ elog(ERROR, "invalid amproc number %d for opclass %u",
+ amprocform->amprocnum, operatorClassOid);
+
+ opcentry->supportProcs[amprocform->amprocnum - 1] =
+ amprocform->amproc;
+ }
+
+ systable_endscan(scan);
+ table_close(rel, AccessShareLock);
+ }
+
+ opcentry->valid = true;
+ return opcentry;
+}
+
+/*
+ * Fill in the TableAmRoutine for a relation
+ *
+ * relation's rd_amhandler must be valid already.
+ */
+static void
+InitTableAmRoutine(Relation relation)
+{
+ relation->rd_tableam = GetTableAmRoutine(relation->rd_amhandler);
+}
+
+/*
+ * Initialize table access method support for a table like relation
+ */
+void
+RelationInitTableAccessMethod(Relation relation)
+{
+ HeapTuple tuple;
+ Form_pg_am aform;
+
+ if (relation->rd_rel->relkind == RELKIND_SEQUENCE)
+ {
+ /*
+ * Sequences are currently accessed like heap tables, but it doesn't
+ * seem prudent to show that in the catalog. So just overwrite it
+ * here.
+ */
+ Assert(relation->rd_rel->relam == InvalidOid);
+ relation->rd_amhandler = F_HEAP_TABLEAM_HANDLER;
+ }
+ else if (IsCatalogRelation(relation))
+ {
+ /*
+ * Avoid doing a syscache lookup for catalog tables.
+ */
+ Assert(relation->rd_rel->relam == HEAP_TABLE_AM_OID);
+ relation->rd_amhandler = F_HEAP_TABLEAM_HANDLER;
+ }
+ else
+ {
+ /*
+ * Look up the table access method, save the OID of its handler
+ * function.
+ */
+ Assert(relation->rd_rel->relam != InvalidOid);
+ tuple = SearchSysCache1(AMOID,
+ ObjectIdGetDatum(relation->rd_rel->relam));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for access method %u",
+ relation->rd_rel->relam);
+ aform = (Form_pg_am) GETSTRUCT(tuple);
+ relation->rd_amhandler = aform->amhandler;
+ ReleaseSysCache(tuple);
+ }
+
+ /*
+ * Now we can fetch the table AM's API struct
+ */
+ InitTableAmRoutine(relation);
+}
+
+/*
+ * formrdesc
+ *
+ * This is a special cut-down version of RelationBuildDesc(),
+ * used while initializing the relcache.
+ * The relation descriptor is built just from the supplied parameters,
+ * without actually looking at any system table entries. We cheat
+ * quite a lot since we only need to work for a few basic system
+ * catalogs.
+ *
+ * The catalogs this is used for can't have constraints (except attnotnull),
+ * default values, rules, or triggers, since we don't cope with any of that.
+ * (Well, actually, this only matters for properties that need to be valid
+ * during bootstrap or before RelationCacheInitializePhase3 runs, and none of
+ * these properties matter then...)
+ *
+ * NOTE: we assume we are already switched into CacheMemoryContext.
+ */
+static void
+formrdesc(const char *relationName, Oid relationReltype,
+ bool isshared,
+ int natts, const FormData_pg_attribute *attrs)
+{
+ Relation relation;
+ int i;
+ bool has_not_null;
+
+ /*
+ * allocate new relation desc, clear all fields of reldesc
+ */
+ relation = (Relation) palloc0(sizeof(RelationData));
+
+ /* make sure relation is marked as having no open file yet */
+ relation->rd_smgr = NULL;
+
+ /*
+ * initialize reference count: 1 because it is nailed in cache
+ */
+ relation->rd_refcnt = 1;
+
+ /*
+ * all entries built with this routine are nailed-in-cache; none are for
+ * new or temp relations.
+ */
+ relation->rd_isnailed = true;
+ relation->rd_createSubid = InvalidSubTransactionId;
+ relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_droppedSubid = InvalidSubTransactionId;
+ relation->rd_backend = InvalidBackendId;
+ relation->rd_islocaltemp = false;
+
+ /*
+ * initialize relation tuple form
+ *
+ * The data we insert here is pretty incomplete/bogus, but it'll serve to
+ * get us launched. RelationCacheInitializePhase3() will read the real
+ * data from pg_class and replace what we've done here. Note in
+ * particular that relowner is left as zero; this cues
+ * RelationCacheInitializePhase3 that the real data isn't there yet.
+ */
+ relation->rd_rel = (Form_pg_class) palloc0(CLASS_TUPLE_SIZE);
+
+ namestrcpy(&relation->rd_rel->relname, relationName);
+ relation->rd_rel->relnamespace = PG_CATALOG_NAMESPACE;
+ relation->rd_rel->reltype = relationReltype;
+
+ /*
+ * It's important to distinguish between shared and non-shared relations,
+ * even at bootstrap time, to make sure we know where they are stored.
+ */
+ relation->rd_rel->relisshared = isshared;
+ if (isshared)
+ relation->rd_rel->reltablespace = GLOBALTABLESPACE_OID;
+
+ /* formrdesc is used only for permanent relations */
+ relation->rd_rel->relpersistence = RELPERSISTENCE_PERMANENT;
+
+ /* ... and they're always populated, too */
+ relation->rd_rel->relispopulated = true;
+
+ relation->rd_rel->relreplident = REPLICA_IDENTITY_NOTHING;
+ relation->rd_rel->relpages = 0;
+ relation->rd_rel->reltuples = -1;
+ relation->rd_rel->relallvisible = 0;
+ relation->rd_rel->relkind = RELKIND_RELATION;
+ relation->rd_rel->relnatts = (int16) natts;
+ relation->rd_rel->relam = HEAP_TABLE_AM_OID;
+
+ /*
+ * initialize attribute tuple form
+ *
+ * Unlike the case with the relation tuple, this data had better be right
+ * because it will never be replaced. The data comes from
+ * src/include/catalog/ headers via genbki.pl.
+ */
+ relation->rd_att = CreateTemplateTupleDesc(natts);
+ relation->rd_att->tdrefcount = 1; /* mark as refcounted */
+
+ relation->rd_att->tdtypeid = relationReltype;
+ relation->rd_att->tdtypmod = -1; /* just to be sure */
+
+ /*
+ * initialize tuple desc info
+ */
+ has_not_null = false;
+ for (i = 0; i < natts; i++)
+ {
+ memcpy(TupleDescAttr(relation->rd_att, i),
+ &attrs[i],
+ ATTRIBUTE_FIXED_PART_SIZE);
+ has_not_null |= attrs[i].attnotnull;
+ /* make sure attcacheoff is valid */
+ TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
+ }
+
+ /* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
+ TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
+
+ /* mark not-null status */
+ if (has_not_null)
+ {
+ TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr));
+
+ constr->has_not_null = true;
+ relation->rd_att->constr = constr;
+ }
+
+ /*
+ * initialize relation id from info in att array (my, this is ugly)
+ */
+ RelationGetRelid(relation) = TupleDescAttr(relation->rd_att, 0)->attrelid;
+
+ /*
+ * All relations made with formrdesc are mapped. This is necessarily so
+ * because there is no other way to know what filenode they currently
+ * have. In bootstrap mode, add them to the initial relation mapper data,
+ * specifying that the initial filenode is the same as the OID.
+ */
+ relation->rd_rel->relfilenode = InvalidOid;
+ if (IsBootstrapProcessingMode())
+ RelationMapUpdateMap(RelationGetRelid(relation),
+ RelationGetRelid(relation),
+ isshared, true);
+
+ /*
+ * initialize the relation lock manager information
+ */
+ RelationInitLockInfo(relation); /* see lmgr.c */
+
+ /*
+ * initialize physical addressing information for the relation
+ */
+ RelationInitPhysicalAddr(relation);
+
+ /*
+ * initialize the table am handler
+ */
+ relation->rd_rel->relam = HEAP_TABLE_AM_OID;
+ relation->rd_tableam = GetHeapamTableAmRoutine();
+
+ /*
+ * initialize the rel-has-index flag, using hardwired knowledge
+ */
+ if (IsBootstrapProcessingMode())
+ {
+ /* In bootstrap mode, we have no indexes */
+ relation->rd_rel->relhasindex = false;
+ }
+ else
+ {
+ /* Otherwise, all the rels formrdesc is used for have indexes */
+ relation->rd_rel->relhasindex = true;
+ }
+
+ /*
+ * add new reldesc to relcache
+ */
+ RelationCacheInsert(relation, false);
+
+ /* It's fully valid */
+ relation->rd_isvalid = true;
+}
+
+
+/* ----------------------------------------------------------------
+ * Relation Descriptor Lookup Interface
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * RelationIdGetRelation
+ *
+ * Lookup a reldesc by OID; make one if not already in cache.
+ *
+ * Returns NULL if no pg_class row could be found for the given relid
+ * (suggesting we are trying to access a just-deleted relation).
+ * Any other error is reported via elog.
+ *
+ * NB: caller should already have at least AccessShareLock on the
+ * relation ID, else there are nasty race conditions.
+ *
+ * NB: relation ref count is incremented, or set to 1 if new entry.
+ * Caller should eventually decrement count. (Usually,
+ * that happens by calling RelationClose().)
+ */
+Relation
+RelationIdGetRelation(Oid relationId)
+{
+ Relation rd;
+
+ /* Make sure we're in an xact, even if this ends up being a cache hit */
+ Assert(IsTransactionState());
+
+ /*
+ * first try to find reldesc in the cache
+ */
+ RelationIdCacheLookup(relationId, rd);
+
+ if (RelationIsValid(rd))
+ {
+ /* return NULL for dropped relations */
+ if (rd->rd_droppedSubid != InvalidSubTransactionId)
+ {
+ Assert(!rd->rd_isvalid);
+ return NULL;
+ }
+
+ RelationIncrementReferenceCount(rd);
+ /* revalidate cache entry if necessary */
+ if (!rd->rd_isvalid)
+ {
+ /*
+ * Indexes only have a limited number of possible schema changes,
+ * and we don't want to use the full-blown procedure because it's
+ * a headache for indexes that reload itself depends on.
+ */
+ if (rd->rd_rel->relkind == RELKIND_INDEX ||
+ rd->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
+ RelationReloadIndexInfo(rd);
+ else
+ RelationClearRelation(rd, true);
+
+ /*
+ * Normally entries need to be valid here, but before the relcache
+ * has been initialized, not enough infrastructure exists to
+ * perform pg_class lookups. The structure of such entries doesn't
+ * change, but we still want to update the rd_rel entry. So
+ * rd_isvalid = false is left in place for a later lookup.
+ */
+ Assert(rd->rd_isvalid ||
+ (rd->rd_isnailed && !criticalRelcachesBuilt));
+ }
+ return rd;
+ }
+
+ /*
+ * no reldesc in the cache, so have RelationBuildDesc() build one and add
+ * it.
+ */
+ rd = RelationBuildDesc(relationId, true);
+ if (RelationIsValid(rd))
+ RelationIncrementReferenceCount(rd);
+ return rd;
+}
+
+/* ----------------------------------------------------------------
+ * cache invalidation support routines
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * RelationIncrementReferenceCount
+ * Increments relation reference count.
+ *
+ * Note: bootstrap mode has its own weird ideas about relation refcount
+ * behavior; we ought to fix it someday, but for now, just disable
+ * reference count ownership tracking in bootstrap mode.
+ */
+void
+RelationIncrementReferenceCount(Relation rel)
+{
+ ResourceOwnerEnlargeRelationRefs(CurrentResourceOwner);
+ rel->rd_refcnt += 1;
+ if (!IsBootstrapProcessingMode())
+ ResourceOwnerRememberRelationRef(CurrentResourceOwner, rel);
+}
+
+/*
+ * RelationDecrementReferenceCount
+ * Decrements relation reference count.
+ */
+void
+RelationDecrementReferenceCount(Relation rel)
+{
+ Assert(rel->rd_refcnt > 0);
+ rel->rd_refcnt -= 1;
+ if (!IsBootstrapProcessingMode())
+ ResourceOwnerForgetRelationRef(CurrentResourceOwner, rel);
+}
+
+/*
+ * RelationClose - close an open relation
+ *
+ * Actually, we just decrement the refcount.
+ *
+ * NOTE: if compiled with -DRELCACHE_FORCE_RELEASE then relcache entries
+ * will be freed as soon as their refcount goes to zero. In combination
+ * with aset.c's CLOBBER_FREED_MEMORY option, this provides a good test
+ * to catch references to already-released relcache entries. It slows
+ * things down quite a bit, however.
+ */
+void
+RelationClose(Relation relation)
+{
+ /* Note: no locking manipulations needed */
+ RelationDecrementReferenceCount(relation);
+
+ /*
+ * If the relation is no longer open in this session, we can clean up any
+ * stale partition descriptors it has. This is unlikely, so check to see
+ * if there are child contexts before expending a call to mcxt.c.
+ */
+ if (RelationHasReferenceCountZero(relation))
+ {
+ if (relation->rd_pdcxt != NULL &&
+ relation->rd_pdcxt->firstchild != NULL)
+ MemoryContextDeleteChildren(relation->rd_pdcxt);
+
+ if (relation->rd_pddcxt != NULL &&
+ relation->rd_pddcxt->firstchild != NULL)
+ MemoryContextDeleteChildren(relation->rd_pddcxt);
+ }
+
+#ifdef RELCACHE_FORCE_RELEASE
+ if (RelationHasReferenceCountZero(relation) &&
+ relation->rd_createSubid == InvalidSubTransactionId &&
+ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId)
+ RelationClearRelation(relation, false);
+#endif
+}
+
+/*
+ * RelationReloadIndexInfo - reload minimal information for an open index
+ *
+ * This function is used only for indexes. A relcache inval on an index
+ * can mean that its pg_class or pg_index row changed. There are only
+ * very limited changes that are allowed to an existing index's schema,
+ * so we can update the relcache entry without a complete rebuild; which
+ * is fortunate because we can't rebuild an index entry that is "nailed"
+ * and/or in active use. We support full replacement of the pg_class row,
+ * as well as updates of a few simple fields of the pg_index row.
+ *
+ * We can't necessarily reread the catalog rows right away; we might be
+ * in a failed transaction when we receive the SI notification. If so,
+ * RelationClearRelation just marks the entry as invalid by setting
+ * rd_isvalid to false. This routine is called to fix the entry when it
+ * is next needed.
+ *
+ * We assume that at the time we are called, we have at least AccessShareLock
+ * on the target index. (Note: in the calls from RelationClearRelation,
+ * this is legitimate because we know the rel has positive refcount.)
+ *
+ * If the target index is an index on pg_class or pg_index, we'd better have
+ * previously gotten at least AccessShareLock on its underlying catalog,
+ * else we are at risk of deadlock against someone trying to exclusive-lock
+ * the heap and index in that order. This is ensured in current usage by
+ * only applying this to indexes being opened or having positive refcount.
+ */
+static void
+RelationReloadIndexInfo(Relation relation)
+{
+ bool indexOK;
+ HeapTuple pg_class_tuple;
+ Form_pg_class relp;
+
+ /* Should be called only for invalidated, live indexes */
+ Assert((relation->rd_rel->relkind == RELKIND_INDEX ||
+ relation->rd_rel->relkind == RELKIND_PARTITIONED_INDEX) &&
+ !relation->rd_isvalid &&
+ relation->rd_droppedSubid == InvalidSubTransactionId);
+
+ /* Ensure it's closed at smgr level */
+ RelationCloseSmgr(relation);
+
+ /* Must free any AM cached data upon relcache flush */
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
+ relation->rd_amcache = NULL;
+
+ /*
+ * If it's a shared index, we might be called before backend startup has
+ * finished selecting a database, in which case we have no way to read
+ * pg_class yet. However, a shared index can never have any significant
+ * schema updates, so it's okay to ignore the invalidation signal. Just
+ * mark it valid and return without doing anything more.
+ */
+ if (relation->rd_rel->relisshared && !criticalRelcachesBuilt)
+ {
+ relation->rd_isvalid = true;
+ return;
+ }
+
+ /*
+ * Read the pg_class row
+ *
+ * Don't try to use an indexscan of pg_class_oid_index to reload the info
+ * for pg_class_oid_index ...
+ */
+ indexOK = (RelationGetRelid(relation) != ClassOidIndexId);
+ pg_class_tuple = ScanPgRelation(RelationGetRelid(relation), indexOK, false);
+ if (!HeapTupleIsValid(pg_class_tuple))
+ elog(ERROR, "could not find pg_class tuple for index %u",
+ RelationGetRelid(relation));
+ relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
+ memcpy(relation->rd_rel, relp, CLASS_TUPLE_SIZE);
+ /* Reload reloptions in case they changed */
+ if (relation->rd_options)
+ pfree(relation->rd_options);
+ RelationParseRelOptions(relation, pg_class_tuple);
+ /* done with pg_class tuple */
+ heap_freetuple(pg_class_tuple);
+ /* We must recalculate physical address in case it changed */
+ RelationInitPhysicalAddr(relation);
+
+ /*
+ * For a non-system index, there are fields of the pg_index row that are
+ * allowed to change, so re-read that row and update the relcache entry.
+ * Most of the info derived from pg_index (such as support function lookup
+ * info) cannot change, and indeed the whole point of this routine is to
+ * update the relcache entry without clobbering that data; so wholesale
+ * replacement is not appropriate.
+ */
+ if (!IsSystemRelation(relation))
+ {
+ HeapTuple tuple;
+ Form_pg_index index;
+
+ tuple = SearchSysCache1(INDEXRELID,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for index %u",
+ RelationGetRelid(relation));
+ index = (Form_pg_index) GETSTRUCT(tuple);
+
+ /*
+ * Basically, let's just copy all the bool fields. There are one or
+ * two of these that can't actually change in the current code, but
+ * it's not worth it to track exactly which ones they are. None of
+ * the array fields are allowed to change, though.
+ */
+ relation->rd_index->indisunique = index->indisunique;
+ relation->rd_index->indnullsnotdistinct = index->indnullsnotdistinct;
+ relation->rd_index->indisprimary = index->indisprimary;
+ relation->rd_index->indisexclusion = index->indisexclusion;
+ relation->rd_index->indimmediate = index->indimmediate;
+ relation->rd_index->indisclustered = index->indisclustered;
+ relation->rd_index->indisvalid = index->indisvalid;
+ relation->rd_index->indcheckxmin = index->indcheckxmin;
+ relation->rd_index->indisready = index->indisready;
+ relation->rd_index->indislive = index->indislive;
+ relation->rd_index->indisreplident = index->indisreplident;
+
+ /* Copy xmin too, as that is needed to make sense of indcheckxmin */
+ HeapTupleHeaderSetXmin(relation->rd_indextuple->t_data,
+ HeapTupleHeaderGetXmin(tuple->t_data));
+
+ ReleaseSysCache(tuple);
+ }
+
+ /* Okay, now it's valid again */
+ relation->rd_isvalid = true;
+}
+
+/*
+ * RelationReloadNailed - reload minimal information for nailed relations.
+ *
+ * The structure of a nailed relation can never change (which is good, because
+ * we rely on knowing their structure to be able to read catalog content). But
+ * some parts, e.g. pg_class.relfrozenxid, are still important to have
+ * accurate content for. Therefore those need to be reloaded after the arrival
+ * of invalidations.
+ */
+static void
+RelationReloadNailed(Relation relation)
+{
+ Assert(relation->rd_isnailed);
+
+ /*
+ * Redo RelationInitPhysicalAddr in case it is a mapped relation whose
+ * mapping changed.
+ */
+ RelationInitPhysicalAddr(relation);
+
+ /* flag as needing to be revalidated */
+ relation->rd_isvalid = false;
+
+ /*
+ * Can only reread catalog contents if in a transaction. If the relation
+ * is currently open (not counting the nailed refcount), do so
+ * immediately. Otherwise we've already marked the entry as possibly
+ * invalid, and it'll be fixed when next opened.
+ */
+ if (!IsTransactionState() || relation->rd_refcnt <= 1)
+ return;
+
+ if (relation->rd_rel->relkind == RELKIND_INDEX)
+ {
+ /*
+ * If it's a nailed-but-not-mapped index, then we need to re-read the
+ * pg_class row to see if its relfilenode changed.
+ */
+ RelationReloadIndexInfo(relation);
+ }
+ else
+ {
+ /*
+ * Reload a non-index entry. We can't easily do so if relcaches
+ * aren't yet built, but that's fine because at that stage the
+ * attributes that need to be current (like relfrozenxid) aren't yet
+ * accessed. To ensure the entry will later be revalidated, we leave
+ * it in invalid state, but allow use (cf. RelationIdGetRelation()).
+ */
+ if (criticalRelcachesBuilt)
+ {
+ HeapTuple pg_class_tuple;
+ Form_pg_class relp;
+
+ /*
+ * NB: Mark the entry as valid before starting to scan, to avoid
+ * self-recursion when re-building pg_class.
+ */
+ relation->rd_isvalid = true;
+
+ pg_class_tuple = ScanPgRelation(RelationGetRelid(relation),
+ true, false);
+ relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
+ memcpy(relation->rd_rel, relp, CLASS_TUPLE_SIZE);
+ heap_freetuple(pg_class_tuple);
+
+ /*
+ * Again mark as valid, to protect against concurrently arriving
+ * invalidations.
+ */
+ relation->rd_isvalid = true;
+ }
+ }
+}
+
+/*
+ * RelationDestroyRelation
+ *
+ * Physically delete a relation cache entry and all subsidiary data.
+ * Caller must already have unhooked the entry from the hash table.
+ */
+static void
+RelationDestroyRelation(Relation relation, bool remember_tupdesc)
+{
+ Assert(RelationHasReferenceCountZero(relation));
+
+ /*
+ * Make sure smgr and lower levels close the relation's files, if they
+ * weren't closed already. (This was probably done by caller, but let's
+ * just be real sure.)
+ */
+ RelationCloseSmgr(relation);
+
+ /* break mutual link with stats entry */
+ pgstat_unlink_relation(relation);
+
+ /*
+ * Free all the subsidiary data structures of the relcache entry, then the
+ * entry itself.
+ */
+ if (relation->rd_rel)
+ pfree(relation->rd_rel);
+ /* can't use DecrTupleDescRefCount here */
+ Assert(relation->rd_att->tdrefcount > 0);
+ if (--relation->rd_att->tdrefcount == 0)
+ {
+ /*
+ * If we Rebuilt a relcache entry during a transaction then its
+ * possible we did that because the TupDesc changed as the result of
+ * an ALTER TABLE that ran at less than AccessExclusiveLock. It's
+ * possible someone copied that TupDesc, in which case the copy would
+ * point to free'd memory. So if we rebuild an entry we keep the
+ * TupDesc around until end of transaction, to be safe.
+ */
+ if (remember_tupdesc)
+ RememberToFreeTupleDescAtEOX(relation->rd_att);
+ else
+ FreeTupleDesc(relation->rd_att);
+ }
+ FreeTriggerDesc(relation->trigdesc);
+ list_free_deep(relation->rd_fkeylist);
+ list_free(relation->rd_indexlist);
+ list_free(relation->rd_statlist);
+ bms_free(relation->rd_indexattr);
+ bms_free(relation->rd_keyattr);
+ bms_free(relation->rd_pkattr);
+ bms_free(relation->rd_idattr);
+ if (relation->rd_pubdesc)
+ pfree(relation->rd_pubdesc);
+ if (relation->rd_options)
+ pfree(relation->rd_options);
+ if (relation->rd_indextuple)
+ pfree(relation->rd_indextuple);
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
+ if (relation->rd_fdwroutine)
+ pfree(relation->rd_fdwroutine);
+ if (relation->rd_indexcxt)
+ MemoryContextDelete(relation->rd_indexcxt);
+ if (relation->rd_rulescxt)
+ MemoryContextDelete(relation->rd_rulescxt);
+ if (relation->rd_rsdesc)
+ MemoryContextDelete(relation->rd_rsdesc->rscxt);
+ if (relation->rd_partkeycxt)
+ MemoryContextDelete(relation->rd_partkeycxt);
+ if (relation->rd_pdcxt)
+ MemoryContextDelete(relation->rd_pdcxt);
+ if (relation->rd_pddcxt)
+ MemoryContextDelete(relation->rd_pddcxt);
+ if (relation->rd_partcheckcxt)
+ MemoryContextDelete(relation->rd_partcheckcxt);
+ pfree(relation);
+}
+
+/*
+ * RelationClearRelation
+ *
+ * Physically blow away a relation cache entry, or reset it and rebuild
+ * it from scratch (that is, from catalog entries). The latter path is
+ * used when we are notified of a change to an open relation (one with
+ * refcount > 0).
+ *
+ * NB: when rebuilding, we'd better hold some lock on the relation,
+ * else the catalog data we need to read could be changing under us.
+ * Also, a rel to be rebuilt had better have refcnt > 0. This is because
+ * a sinval reset could happen while we're accessing the catalogs, and
+ * the rel would get blown away underneath us by RelationCacheInvalidate
+ * if it has zero refcnt.
+ *
+ * The "rebuild" parameter is redundant in current usage because it has
+ * to match the relation's refcnt status, but we keep it as a crosscheck
+ * that we're doing what the caller expects.
+ */
+static void
+RelationClearRelation(Relation relation, bool rebuild)
+{
+ /*
+ * As per notes above, a rel to be rebuilt MUST have refcnt > 0; while of
+ * course it would be an equally bad idea to blow away one with nonzero
+ * refcnt, since that would leave someone somewhere with a dangling
+ * pointer. All callers are expected to have verified that this holds.
+ */
+ Assert(rebuild ?
+ !RelationHasReferenceCountZero(relation) :
+ RelationHasReferenceCountZero(relation));
+
+ /*
+ * Make sure smgr and lower levels close the relation's files, if they
+ * weren't closed already. If the relation is not getting deleted, the
+ * next smgr access should reopen the files automatically. This ensures
+ * that the low-level file access state is updated after, say, a vacuum
+ * truncation.
+ */
+ RelationCloseSmgr(relation);
+
+ /* Free AM cached data, if any */
+ if (relation->rd_amcache)
+ pfree(relation->rd_amcache);
+ relation->rd_amcache = NULL;
+
+ /*
+ * Treat nailed-in system relations separately, they always need to be
+ * accessible, so we can't blow them away.
+ */
+ if (relation->rd_isnailed)
+ {
+ RelationReloadNailed(relation);
+ return;
+ }
+
+ /* Mark it invalid until we've finished rebuild */
+ relation->rd_isvalid = false;
+
+ /* See RelationForgetRelation(). */
+ if (relation->rd_droppedSubid != InvalidSubTransactionId)
+ return;
+
+ /*
+ * Even non-system indexes should not be blown away if they are open and
+ * have valid index support information. This avoids problems with active
+ * use of the index support information. As with nailed indexes, we
+ * re-read the pg_class row to handle possible physical relocation of the
+ * index, and we check for pg_index updates too.
+ */
+ if ((relation->rd_rel->relkind == RELKIND_INDEX ||
+ relation->rd_rel->relkind == RELKIND_PARTITIONED_INDEX) &&
+ relation->rd_refcnt > 0 &&
+ relation->rd_indexcxt != NULL)
+ {
+ if (IsTransactionState())
+ RelationReloadIndexInfo(relation);
+ return;
+ }
+
+ /*
+ * If we're really done with the relcache entry, blow it away. But if
+ * someone is still using it, reconstruct the whole deal without moving
+ * the physical RelationData record (so that the someone's pointer is
+ * still valid).
+ */
+ if (!rebuild)
+ {
+ /* Remove it from the hash table */
+ RelationCacheDelete(relation);
+
+ /* And release storage */
+ RelationDestroyRelation(relation, false);
+ }
+ else if (!IsTransactionState())
+ {
+ /*
+ * If we're not inside a valid transaction, we can't do any catalog
+ * access so it's not possible to rebuild yet. Just exit, leaving
+ * rd_isvalid = false so that the rebuild will occur when the entry is
+ * next opened.
+ *
+ * Note: it's possible that we come here during subtransaction abort,
+ * and the reason for wanting to rebuild is that the rel is open in
+ * the outer transaction. In that case it might seem unsafe to not
+ * rebuild immediately, since whatever code has the rel already open
+ * will keep on using the relcache entry as-is. However, in such a
+ * case the outer transaction should be holding a lock that's
+ * sufficient to prevent any significant change in the rel's schema,
+ * so the existing entry contents should be good enough for its
+ * purposes; at worst we might be behind on statistics updates or the
+ * like. (See also CheckTableNotInUse() and its callers.) These same
+ * remarks also apply to the cases above where we exit without having
+ * done RelationReloadIndexInfo() yet.
+ */
+ return;
+ }
+ else
+ {
+ /*
+ * Our strategy for rebuilding an open relcache entry is to build a
+ * new entry from scratch, swap its contents with the old entry, and
+ * finally delete the new entry (along with any infrastructure swapped
+ * over from the old entry). This is to avoid trouble in case an
+ * error causes us to lose control partway through. The old entry
+ * will still be marked !rd_isvalid, so we'll try to rebuild it again
+ * on next access. Meanwhile it's not any less valid than it was
+ * before, so any code that might expect to continue accessing it
+ * isn't hurt by the rebuild failure. (Consider for example a
+ * subtransaction that ALTERs a table and then gets canceled partway
+ * through the cache entry rebuild. The outer transaction should
+ * still see the not-modified cache entry as valid.) The worst
+ * consequence of an error is leaking the necessarily-unreferenced new
+ * entry, and this shouldn't happen often enough for that to be a big
+ * problem.
+ *
+ * When rebuilding an open relcache entry, we must preserve ref count,
+ * rd_*Subid, and rd_toastoid state. Also attempt to preserve the
+ * pg_class entry (rd_rel), tupledesc, rewrite-rule, partition key,
+ * and partition descriptor substructures in place, because various
+ * places assume that these structures won't move while they are
+ * working with an open relcache entry. (Note: the refcount
+ * mechanism for tupledescs might someday allow us to remove this hack
+ * for the tupledesc.)
+ *
+ * Note that this process does not touch CurrentResourceOwner; which
+ * is good because whatever ref counts the entry may have do not
+ * necessarily belong to that resource owner.
+ */
+ Relation newrel;
+ Oid save_relid = RelationGetRelid(relation);
+ bool keep_tupdesc;
+ bool keep_rules;
+ bool keep_policies;
+ bool keep_partkey;
+ bool keep_pgstats;
+
+ /* Build temporary entry, but don't link it into hashtable */
+ newrel = RelationBuildDesc(save_relid, false);
+
+ /*
+ * Between here and the end of the swap, don't add code that does or
+ * reasonably could read system catalogs. That range must be free
+ * from invalidation processing. See RelationBuildDesc() manipulation
+ * of in_progress_list.
+ */
+
+ if (newrel == NULL)
+ {
+ /*
+ * We can validly get here, if we're using a historic snapshot in
+ * which a relation, accessed from outside logical decoding, is
+ * still invisible. In that case it's fine to just mark the
+ * relation as invalid and return - it'll fully get reloaded by
+ * the cache reset at the end of logical decoding (or at the next
+ * access). During normal processing we don't want to ignore this
+ * case as it shouldn't happen there, as explained below.
+ */
+ if (HistoricSnapshotActive())
+ return;
+
+ /*
+ * This shouldn't happen as dropping a relation is intended to be
+ * impossible if still referenced (cf. CheckTableNotInUse()). But
+ * if we get here anyway, we can't just delete the relcache entry,
+ * as it possibly could get accessed later (as e.g. the error
+ * might get trapped and handled via a subtransaction rollback).
+ */
+ elog(ERROR, "relation %u deleted while still in use", save_relid);
+ }
+
+ keep_tupdesc = equalTupleDescs(relation->rd_att, newrel->rd_att);
+ keep_rules = equalRuleLocks(relation->rd_rules, newrel->rd_rules);
+ keep_policies = equalRSDesc(relation->rd_rsdesc, newrel->rd_rsdesc);
+ /* partkey is immutable once set up, so we can always keep it */
+ keep_partkey = (relation->rd_partkey != NULL);
+
+ /*
+ * Keep stats pointers, except when the relkind changes (e.g. when
+ * converting tables into views). Different kinds of relations might
+ * have different types of stats.
+ *
+ * If we don't want to keep the stats, unlink the stats and relcache
+ * entry (and do so before entering the "critical section"
+ * below). This is important because otherwise
+ * PgStat_TableStatus->relation would get out of sync with
+ * relation->pgstat_info.
+ */
+ keep_pgstats = relation->rd_rel->relkind == newrel->rd_rel->relkind;
+ if (!keep_pgstats)
+ pgstat_unlink_relation(relation);
+
+ /*
+ * Perform swapping of the relcache entry contents. Within this
+ * process the old entry is momentarily invalid, so there *must* be no
+ * possibility of CHECK_FOR_INTERRUPTS within this sequence. Do it in
+ * all-in-line code for safety.
+ *
+ * Since the vast majority of fields should be swapped, our method is
+ * to swap the whole structures and then re-swap those few fields we
+ * didn't want swapped.
+ */
+#define SWAPFIELD(fldtype, fldname) \
+ do { \
+ fldtype _tmp = newrel->fldname; \
+ newrel->fldname = relation->fldname; \
+ relation->fldname = _tmp; \
+ } while (0)
+
+ /* swap all Relation struct fields */
+ {
+ RelationData tmpstruct;
+
+ memcpy(&tmpstruct, newrel, sizeof(RelationData));
+ memcpy(newrel, relation, sizeof(RelationData));
+ memcpy(relation, &tmpstruct, sizeof(RelationData));
+ }
+
+ /* rd_smgr must not be swapped, due to back-links from smgr level */
+ SWAPFIELD(SMgrRelation, rd_smgr);
+ /* rd_refcnt must be preserved */
+ SWAPFIELD(int, rd_refcnt);
+ /* isnailed shouldn't change */
+ Assert(newrel->rd_isnailed == relation->rd_isnailed);
+ /* creation sub-XIDs must be preserved */
+ SWAPFIELD(SubTransactionId, rd_createSubid);
+ SWAPFIELD(SubTransactionId, rd_newRelfilenodeSubid);
+ SWAPFIELD(SubTransactionId, rd_firstRelfilenodeSubid);
+ SWAPFIELD(SubTransactionId, rd_droppedSubid);
+ /* un-swap rd_rel pointers, swap contents instead */
+ SWAPFIELD(Form_pg_class, rd_rel);
+ /* ... but actually, we don't have to update newrel->rd_rel */
+ memcpy(relation->rd_rel, newrel->rd_rel, CLASS_TUPLE_SIZE);
+ /* preserve old tupledesc, rules, policies if no logical change */
+ if (keep_tupdesc)
+ SWAPFIELD(TupleDesc, rd_att);
+ if (keep_rules)
+ {
+ SWAPFIELD(RuleLock *, rd_rules);
+ SWAPFIELD(MemoryContext, rd_rulescxt);
+ }
+ if (keep_policies)
+ SWAPFIELD(RowSecurityDesc *, rd_rsdesc);
+ /* toast OID override must be preserved */
+ SWAPFIELD(Oid, rd_toastoid);
+
+ /* pgstat_info / enabled must be preserved */
+ if (keep_pgstats)
+ {
+ SWAPFIELD(struct PgStat_TableStatus *, pgstat_info);
+ SWAPFIELD(bool, pgstat_enabled);
+ }
+
+ /* preserve old partition key if we have one */
+ if (keep_partkey)
+ {
+ SWAPFIELD(PartitionKey, rd_partkey);
+ SWAPFIELD(MemoryContext, rd_partkeycxt);
+ }
+ if (newrel->rd_pdcxt != NULL || newrel->rd_pddcxt != NULL)
+ {
+ /*
+ * We are rebuilding a partitioned relation with a non-zero
+ * reference count, so we must keep the old partition descriptor
+ * around, in case there's a PartitionDirectory with a pointer to
+ * it. This means we can't free the old rd_pdcxt yet. (This is
+ * necessary because RelationGetPartitionDesc hands out direct
+ * pointers to the relcache's data structure, unlike our usual
+ * practice which is to hand out copies. We'd have the same
+ * problem with rd_partkey, except that we always preserve that
+ * once created.)
+ *
+ * To ensure that it's not leaked completely, re-attach it to the
+ * new reldesc, or make it a child of the new reldesc's rd_pdcxt
+ * in the unlikely event that there is one already. (Compare hack
+ * in RelationBuildPartitionDesc.) RelationClose will clean up
+ * any such contexts once the reference count reaches zero.
+ *
+ * In the case where the reference count is zero, this code is not
+ * reached, which should be OK because in that case there should
+ * be no PartitionDirectory with a pointer to the old entry.
+ *
+ * Note that newrel and relation have already been swapped, so the
+ * "old" partition descriptor is actually the one hanging off of
+ * newrel.
+ */
+ relation->rd_partdesc = NULL; /* ensure rd_partdesc is invalid */
+ relation->rd_partdesc_nodetached = NULL;
+ relation->rd_partdesc_nodetached_xmin = InvalidTransactionId;
+ if (relation->rd_pdcxt != NULL) /* probably never happens */
+ MemoryContextSetParent(newrel->rd_pdcxt, relation->rd_pdcxt);
+ else
+ relation->rd_pdcxt = newrel->rd_pdcxt;
+ if (relation->rd_pddcxt != NULL)
+ MemoryContextSetParent(newrel->rd_pddcxt, relation->rd_pddcxt);
+ else
+ relation->rd_pddcxt = newrel->rd_pddcxt;
+ /* drop newrel's pointers so we don't destroy it below */
+ newrel->rd_partdesc = NULL;
+ newrel->rd_partdesc_nodetached = NULL;
+ newrel->rd_partdesc_nodetached_xmin = InvalidTransactionId;
+ newrel->rd_pdcxt = NULL;
+ newrel->rd_pddcxt = NULL;
+ }
+
+#undef SWAPFIELD
+
+ /* And now we can throw away the temporary entry */
+ RelationDestroyRelation(newrel, !keep_tupdesc);
+ }
+}
+
+/*
+ * RelationFlushRelation
+ *
+ * Rebuild the relation if it is open (refcount > 0), else blow it away.
+ * This is used when we receive a cache invalidation event for the rel.
+ */
+static void
+RelationFlushRelation(Relation relation)
+{
+ if (relation->rd_createSubid != InvalidSubTransactionId ||
+ relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId)
+ {
+ /*
+ * New relcache entries are always rebuilt, not flushed; else we'd
+ * forget the "new" status of the relation. Ditto for the
+ * new-relfilenode status.
+ *
+ * The rel could have zero refcnt here, so temporarily increment the
+ * refcnt to ensure it's safe to rebuild it. We can assume that the
+ * current transaction has some lock on the rel already.
+ */
+ RelationIncrementReferenceCount(relation);
+ RelationClearRelation(relation, true);
+ RelationDecrementReferenceCount(relation);
+ }
+ else
+ {
+ /*
+ * Pre-existing rels can be dropped from the relcache if not open.
+ */
+ bool rebuild = !RelationHasReferenceCountZero(relation);
+
+ RelationClearRelation(relation, rebuild);
+ }
+}
+
+/*
+ * RelationForgetRelation - caller reports that it dropped the relation
+ */
+void
+RelationForgetRelation(Oid rid)
+{
+ Relation relation;
+
+ RelationIdCacheLookup(rid, relation);
+
+ if (!PointerIsValid(relation))
+ return; /* not in cache, nothing to do */
+
+ if (!RelationHasReferenceCountZero(relation))
+ elog(ERROR, "relation %u is still open", rid);
+
+ Assert(relation->rd_droppedSubid == InvalidSubTransactionId);
+ if (relation->rd_createSubid != InvalidSubTransactionId ||
+ relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId)
+ {
+ /*
+ * In the event of subtransaction rollback, we must not forget
+ * rd_*Subid. Mark the entry "dropped" so RelationClearRelation()
+ * invalidates it in lieu of destroying it. (If we're in a top
+ * transaction, we could opt to destroy the entry.)
+ */
+ relation->rd_droppedSubid = GetCurrentSubTransactionId();
+ }
+
+ RelationClearRelation(relation, false);
+}
+
+/*
+ * RelationCacheInvalidateEntry
+ *
+ * This routine is invoked for SI cache flush messages.
+ *
+ * Any relcache entry matching the relid must be flushed. (Note: caller has
+ * already determined that the relid belongs to our database or is a shared
+ * relation.)
+ *
+ * We used to skip local relations, on the grounds that they could
+ * not be targets of cross-backend SI update messages; but it seems
+ * safer to process them, so that our *own* SI update messages will
+ * have the same effects during CommandCounterIncrement for both
+ * local and nonlocal relations.
+ */
+void
+RelationCacheInvalidateEntry(Oid relationId)
+{
+ Relation relation;
+
+ RelationIdCacheLookup(relationId, relation);
+
+ if (PointerIsValid(relation))
+ {
+ relcacheInvalsReceived++;
+ RelationFlushRelation(relation);
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < in_progress_list_len; i++)
+ if (in_progress_list[i].reloid == relationId)
+ in_progress_list[i].invalidated = true;
+ }
+}
+
+/*
+ * RelationCacheInvalidate
+ * Blow away cached relation descriptors that have zero reference counts,
+ * and rebuild those with positive reference counts. Also reset the smgr
+ * relation cache and re-read relation mapping data.
+ *
+ * Apart from debug_discard_caches, this is currently used only to recover
+ * from SI message buffer overflow, so we do not touch relations having
+ * new-in-transaction relfilenodes; they cannot be targets of cross-backend
+ * SI updates (and our own updates now go through a separate linked list
+ * that isn't limited by the SI message buffer size).
+ *
+ * We do this in two phases: the first pass deletes deletable items, and
+ * the second one rebuilds the rebuildable items. This is essential for
+ * safety, because hash_seq_search only copes with concurrent deletion of
+ * the element it is currently visiting. If a second SI overflow were to
+ * occur while we are walking the table, resulting in recursive entry to
+ * this routine, we could crash because the inner invocation blows away
+ * the entry next to be visited by the outer scan. But this way is OK,
+ * because (a) during the first pass we won't process any more SI messages,
+ * so hash_seq_search will complete safely; (b) during the second pass we
+ * only hold onto pointers to nondeletable entries.
+ *
+ * The two-phase approach also makes it easy to update relfilenodes for
+ * mapped relations before we do anything else, and to ensure that the
+ * second pass processes nailed-in-cache items before other nondeletable
+ * items. This should ensure that system catalogs are up to date before
+ * we attempt to use them to reload information about other open relations.
+ *
+ * After those two phases of work having immediate effects, we normally
+ * signal any RelationBuildDesc() on the stack to start over. However, we
+ * don't do this if called as part of debug_discard_caches. Otherwise,
+ * RelationBuildDesc() would become an infinite loop.
+ */
+void
+RelationCacheInvalidate(bool debug_discard)
+{
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt *idhentry;
+ Relation relation;
+ List *rebuildFirstList = NIL;
+ List *rebuildList = NIL;
+ ListCell *l;
+ int i;
+
+ /*
+ * Reload relation mapping data before starting to reconstruct cache.
+ */
+ RelationMapInvalidateAll();
+
+ /* Phase 1 */
+ hash_seq_init(&status, RelationIdCache);
+
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ {
+ relation = idhentry->reldesc;
+
+ /* Must close all smgr references to avoid leaving dangling ptrs */
+ RelationCloseSmgr(relation);
+
+ /*
+ * Ignore new relations; no other backend will manipulate them before
+ * we commit. Likewise, before replacing a relation's relfilenode, we
+ * shall have acquired AccessExclusiveLock and drained any applicable
+ * pending invalidations.
+ */
+ if (relation->rd_createSubid != InvalidSubTransactionId ||
+ relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId)
+ continue;
+
+ relcacheInvalsReceived++;
+
+ if (RelationHasReferenceCountZero(relation))
+ {
+ /* Delete this entry immediately */
+ Assert(!relation->rd_isnailed);
+ RelationClearRelation(relation, false);
+ }
+ else
+ {
+ /*
+ * If it's a mapped relation, immediately update its rd_node in
+ * case its relfilenode changed. We must do this during phase 1
+ * in case the relation is consulted during rebuild of other
+ * relcache entries in phase 2. It's safe since consulting the
+ * map doesn't involve any access to relcache entries.
+ */
+ if (RelationIsMapped(relation))
+ RelationInitPhysicalAddr(relation);
+
+ /*
+ * Add this entry to list of stuff to rebuild in second pass.
+ * pg_class goes to the front of rebuildFirstList while
+ * pg_class_oid_index goes to the back of rebuildFirstList, so
+ * they are done first and second respectively. Other nailed
+ * relations go to the front of rebuildList, so they'll be done
+ * next in no particular order; and everything else goes to the
+ * back of rebuildList.
+ */
+ if (RelationGetRelid(relation) == RelationRelationId)
+ rebuildFirstList = lcons(relation, rebuildFirstList);
+ else if (RelationGetRelid(relation) == ClassOidIndexId)
+ rebuildFirstList = lappend(rebuildFirstList, relation);
+ else if (relation->rd_isnailed)
+ rebuildList = lcons(relation, rebuildList);
+ else
+ rebuildList = lappend(rebuildList, relation);
+ }
+ }
+
+ /*
+ * Now zap any remaining smgr cache entries. This must happen before we
+ * start to rebuild entries, since that may involve catalog fetches which
+ * will re-open catalog files.
+ */
+ smgrcloseall();
+
+ /* Phase 2: rebuild the items found to need rebuild in phase 1 */
+ foreach(l, rebuildFirstList)
+ {
+ relation = (Relation) lfirst(l);
+ RelationClearRelation(relation, true);
+ }
+ list_free(rebuildFirstList);
+ foreach(l, rebuildList)
+ {
+ relation = (Relation) lfirst(l);
+ RelationClearRelation(relation, true);
+ }
+ list_free(rebuildList);
+
+ if (!debug_discard)
+ /* Any RelationBuildDesc() on the stack must start over. */
+ for (i = 0; i < in_progress_list_len; i++)
+ in_progress_list[i].invalidated = true;
+}
+
+/*
+ * RelationCloseSmgrByOid - close a relcache entry's smgr link
+ *
+ * Needed in some cases where we are changing a relation's physical mapping.
+ * The link will be automatically reopened on next use.
+ */
+void
+RelationCloseSmgrByOid(Oid relationId)
+{
+ Relation relation;
+
+ RelationIdCacheLookup(relationId, relation);
+
+ if (!PointerIsValid(relation))
+ return; /* not in cache, nothing to do */
+
+ RelationCloseSmgr(relation);
+}
+
+static void
+RememberToFreeTupleDescAtEOX(TupleDesc td)
+{
+ if (EOXactTupleDescArray == NULL)
+ {
+ MemoryContext oldcxt;
+
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ EOXactTupleDescArray = (TupleDesc *) palloc(16 * sizeof(TupleDesc));
+ EOXactTupleDescArrayLen = 16;
+ NextEOXactTupleDescNum = 0;
+ MemoryContextSwitchTo(oldcxt);
+ }
+ else if (NextEOXactTupleDescNum >= EOXactTupleDescArrayLen)
+ {
+ int32 newlen = EOXactTupleDescArrayLen * 2;
+
+ Assert(EOXactTupleDescArrayLen > 0);
+
+ EOXactTupleDescArray = (TupleDesc *) repalloc(EOXactTupleDescArray,
+ newlen * sizeof(TupleDesc));
+ EOXactTupleDescArrayLen = newlen;
+ }
+
+ EOXactTupleDescArray[NextEOXactTupleDescNum++] = td;
+}
+
+#ifdef USE_ASSERT_CHECKING
+static void
+AssertPendingSyncConsistency(Relation relation)
+{
+ bool relcache_verdict =
+ RelationIsPermanent(relation) &&
+ ((relation->rd_createSubid != InvalidSubTransactionId &&
+ RELKIND_HAS_STORAGE(relation->rd_rel->relkind)) ||
+ relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId);
+
+ Assert(relcache_verdict == RelFileNodeSkippingWAL(relation->rd_node));
+
+ if (relation->rd_droppedSubid != InvalidSubTransactionId)
+ Assert(!relation->rd_isvalid &&
+ (relation->rd_createSubid != InvalidSubTransactionId ||
+ relation->rd_firstRelfilenodeSubid != InvalidSubTransactionId));
+}
+
+/*
+ * AssertPendingSyncs_RelationCache
+ *
+ * Assert that relcache.c and storage.c agree on whether to skip WAL.
+ */
+void
+AssertPendingSyncs_RelationCache(void)
+{
+ HASH_SEQ_STATUS status;
+ LOCALLOCK *locallock;
+ Relation *rels;
+ int maxrels;
+ int nrels;
+ RelIdCacheEnt *idhentry;
+ int i;
+
+ /*
+ * Open every relation that this transaction has locked. If, for some
+ * relation, storage.c is skipping WAL and relcache.c is not skipping WAL,
+ * a CommandCounterIncrement() typically yields a local invalidation
+ * message that destroys the relcache entry. By recreating such entries
+ * here, we detect the problem.
+ */
+ PushActiveSnapshot(GetTransactionSnapshot());
+ maxrels = 1;
+ rels = palloc(maxrels * sizeof(*rels));
+ nrels = 0;
+ hash_seq_init(&status, GetLockMethodLocalHash());
+ while ((locallock = (LOCALLOCK *) hash_seq_search(&status)) != NULL)
+ {
+ Oid relid;
+ Relation r;
+
+ if (locallock->nLocks <= 0)
+ continue;
+ if ((LockTagType) locallock->tag.lock.locktag_type !=
+ LOCKTAG_RELATION)
+ continue;
+ relid = ObjectIdGetDatum(locallock->tag.lock.locktag_field2);
+ r = RelationIdGetRelation(relid);
+ if (!RelationIsValid(r))
+ continue;
+ if (nrels >= maxrels)
+ {
+ maxrels *= 2;
+ rels = repalloc(rels, maxrels * sizeof(*rels));
+ }
+ rels[nrels++] = r;
+ }
+
+ hash_seq_init(&status, RelationIdCache);
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ AssertPendingSyncConsistency(idhentry->reldesc);
+
+ for (i = 0; i < nrels; i++)
+ RelationClose(rels[i]);
+ PopActiveSnapshot();
+}
+#endif
+
+/*
+ * AtEOXact_RelationCache
+ *
+ * Clean up the relcache at main-transaction commit or abort.
+ *
+ * Note: this must be called *before* processing invalidation messages.
+ * In the case of abort, we don't want to try to rebuild any invalidated
+ * cache entries (since we can't safely do database accesses). Therefore
+ * we must reset refcnts before handling pending invalidations.
+ *
+ * As of PostgreSQL 8.1, relcache refcnts should get released by the
+ * ResourceOwner mechanism. This routine just does a debugging
+ * cross-check that no pins remain. However, we also need to do special
+ * cleanup when the current transaction created any relations or made use
+ * of forced index lists.
+ */
+void
+AtEOXact_RelationCache(bool isCommit)
+{
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt *idhentry;
+ int i;
+
+ /*
+ * Forget in_progress_list. This is relevant when we're aborting due to
+ * an error during RelationBuildDesc().
+ */
+ Assert(in_progress_list_len == 0 || !isCommit);
+ in_progress_list_len = 0;
+
+ /*
+ * Unless the eoxact_list[] overflowed, we only need to examine the rels
+ * listed in it. Otherwise fall back on a hash_seq_search scan.
+ *
+ * For simplicity, eoxact_list[] entries are not deleted till end of
+ * top-level transaction, even though we could remove them at
+ * subtransaction end in some cases, or remove relations from the list if
+ * they are cleared for other reasons. Therefore we should expect the
+ * case that list entries are not found in the hashtable; if not, there's
+ * nothing to do for them.
+ */
+ if (eoxact_list_overflowed)
+ {
+ hash_seq_init(&status, RelationIdCache);
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ {
+ AtEOXact_cleanup(idhentry->reldesc, isCommit);
+ }
+ }
+ else
+ {
+ for (i = 0; i < eoxact_list_len; i++)
+ {
+ idhentry = (RelIdCacheEnt *) hash_search(RelationIdCache,
+ (void *) &eoxact_list[i],
+ HASH_FIND,
+ NULL);
+ if (idhentry != NULL)
+ AtEOXact_cleanup(idhentry->reldesc, isCommit);
+ }
+ }
+
+ if (EOXactTupleDescArrayLen > 0)
+ {
+ Assert(EOXactTupleDescArray != NULL);
+ for (i = 0; i < NextEOXactTupleDescNum; i++)
+ FreeTupleDesc(EOXactTupleDescArray[i]);
+ pfree(EOXactTupleDescArray);
+ EOXactTupleDescArray = NULL;
+ }
+
+ /* Now we're out of the transaction and can clear the lists */
+ eoxact_list_len = 0;
+ eoxact_list_overflowed = false;
+ NextEOXactTupleDescNum = 0;
+ EOXactTupleDescArrayLen = 0;
+}
+
+/*
+ * AtEOXact_cleanup
+ *
+ * Clean up a single rel at main-transaction commit or abort
+ *
+ * NB: this processing must be idempotent, because EOXactListAdd() doesn't
+ * bother to prevent duplicate entries in eoxact_list[].
+ */
+static void
+AtEOXact_cleanup(Relation relation, bool isCommit)
+{
+ bool clear_relcache = false;
+
+ /*
+ * The relcache entry's ref count should be back to its normal
+ * not-in-a-transaction state: 0 unless it's nailed in cache.
+ *
+ * In bootstrap mode, this is NOT true, so don't check it --- the
+ * bootstrap code expects relations to stay open across start/commit
+ * transaction calls. (That seems bogus, but it's not worth fixing.)
+ *
+ * Note: ideally this check would be applied to every relcache entry, not
+ * just those that have eoxact work to do. But it's not worth forcing a
+ * scan of the whole relcache just for this. (Moreover, doing so would
+ * mean that assert-enabled testing never tests the hash_search code path
+ * above, which seems a bad idea.)
+ */
+#ifdef USE_ASSERT_CHECKING
+ if (!IsBootstrapProcessingMode())
+ {
+ int expected_refcnt;
+
+ expected_refcnt = relation->rd_isnailed ? 1 : 0;
+ Assert(relation->rd_refcnt == expected_refcnt);
+ }
+#endif
+
+ /*
+ * Is the relation live after this transaction ends?
+ *
+ * During commit, clear the relcache entry if it is preserved after
+ * relation drop, in order not to orphan the entry. During rollback,
+ * clear the relcache entry if the relation is created in the current
+ * transaction since it isn't interesting any longer once we are out of
+ * the transaction.
+ */
+ clear_relcache =
+ (isCommit ?
+ relation->rd_droppedSubid != InvalidSubTransactionId :
+ relation->rd_createSubid != InvalidSubTransactionId);
+
+ /*
+ * Since we are now out of the transaction, reset the subids to zero. That
+ * also lets RelationClearRelation() drop the relcache entry.
+ */
+ relation->rd_createSubid = InvalidSubTransactionId;
+ relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_droppedSubid = InvalidSubTransactionId;
+
+ if (clear_relcache)
+ {
+ if (RelationHasReferenceCountZero(relation))
+ {
+ RelationClearRelation(relation, false);
+ return;
+ }
+ else
+ {
+ /*
+ * Hmm, somewhere there's a (leaked?) reference to the relation.
+ * We daren't remove the entry for fear of dereferencing a
+ * dangling pointer later. Bleat, and mark it as not belonging to
+ * the current transaction. Hopefully it'll get cleaned up
+ * eventually. This must be just a WARNING to avoid
+ * error-during-error-recovery loops.
+ */
+ elog(WARNING, "cannot remove relcache entry for \"%s\" because it has nonzero refcount",
+ RelationGetRelationName(relation));
+ }
+ }
+}
+
+/*
+ * AtEOSubXact_RelationCache
+ *
+ * Clean up the relcache at sub-transaction commit or abort.
+ *
+ * Note: this must be called *before* processing invalidation messages.
+ */
+void
+AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid,
+ SubTransactionId parentSubid)
+{
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt *idhentry;
+ int i;
+
+ /*
+ * Forget in_progress_list. This is relevant when we're aborting due to
+ * an error during RelationBuildDesc(). We don't commit subtransactions
+ * during RelationBuildDesc().
+ */
+ Assert(in_progress_list_len == 0 || !isCommit);
+ in_progress_list_len = 0;
+
+ /*
+ * Unless the eoxact_list[] overflowed, we only need to examine the rels
+ * listed in it. Otherwise fall back on a hash_seq_search scan. Same
+ * logic as in AtEOXact_RelationCache.
+ */
+ if (eoxact_list_overflowed)
+ {
+ hash_seq_init(&status, RelationIdCache);
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ {
+ AtEOSubXact_cleanup(idhentry->reldesc, isCommit,
+ mySubid, parentSubid);
+ }
+ }
+ else
+ {
+ for (i = 0; i < eoxact_list_len; i++)
+ {
+ idhentry = (RelIdCacheEnt *) hash_search(RelationIdCache,
+ (void *) &eoxact_list[i],
+ HASH_FIND,
+ NULL);
+ if (idhentry != NULL)
+ AtEOSubXact_cleanup(idhentry->reldesc, isCommit,
+ mySubid, parentSubid);
+ }
+ }
+
+ /* Don't reset the list; we still need more cleanup later */
+}
+
+/*
+ * AtEOSubXact_cleanup
+ *
+ * Clean up a single rel at subtransaction commit or abort
+ *
+ * NB: this processing must be idempotent, because EOXactListAdd() doesn't
+ * bother to prevent duplicate entries in eoxact_list[].
+ */
+static void
+AtEOSubXact_cleanup(Relation relation, bool isCommit,
+ SubTransactionId mySubid, SubTransactionId parentSubid)
+{
+ /*
+ * Is it a relation created in the current subtransaction?
+ *
+ * During subcommit, mark it as belonging to the parent, instead, as long
+ * as it has not been dropped. Otherwise simply delete the relcache entry.
+ * --- it isn't interesting any longer.
+ */
+ if (relation->rd_createSubid == mySubid)
+ {
+ /*
+ * Valid rd_droppedSubid means the corresponding relation is dropped
+ * but the relcache entry is preserved for at-commit pending sync. We
+ * need to drop it explicitly here not to make the entry orphan.
+ */
+ Assert(relation->rd_droppedSubid == mySubid ||
+ relation->rd_droppedSubid == InvalidSubTransactionId);
+ if (isCommit && relation->rd_droppedSubid == InvalidSubTransactionId)
+ relation->rd_createSubid = parentSubid;
+ else if (RelationHasReferenceCountZero(relation))
+ {
+ /* allow the entry to be removed */
+ relation->rd_createSubid = InvalidSubTransactionId;
+ relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ relation->rd_droppedSubid = InvalidSubTransactionId;
+ RelationClearRelation(relation, false);
+ return;
+ }
+ else
+ {
+ /*
+ * Hmm, somewhere there's a (leaked?) reference to the relation.
+ * We daren't remove the entry for fear of dereferencing a
+ * dangling pointer later. Bleat, and transfer it to the parent
+ * subtransaction so we can try again later. This must be just a
+ * WARNING to avoid error-during-error-recovery loops.
+ */
+ relation->rd_createSubid = parentSubid;
+ elog(WARNING, "cannot remove relcache entry for \"%s\" because it has nonzero refcount",
+ RelationGetRelationName(relation));
+ }
+ }
+
+ /*
+ * Likewise, update or drop any new-relfilenode-in-subtransaction record
+ * or drop record.
+ */
+ if (relation->rd_newRelfilenodeSubid == mySubid)
+ {
+ if (isCommit)
+ relation->rd_newRelfilenodeSubid = parentSubid;
+ else
+ relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ }
+
+ if (relation->rd_firstRelfilenodeSubid == mySubid)
+ {
+ if (isCommit)
+ relation->rd_firstRelfilenodeSubid = parentSubid;
+ else
+ relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ }
+
+ if (relation->rd_droppedSubid == mySubid)
+ {
+ if (isCommit)
+ relation->rd_droppedSubid = parentSubid;
+ else
+ relation->rd_droppedSubid = InvalidSubTransactionId;
+ }
+}
+
+
+/*
+ * RelationBuildLocalRelation
+ * Build a relcache entry for an about-to-be-created relation,
+ * and enter it into the relcache.
+ */
+Relation
+RelationBuildLocalRelation(const char *relname,
+ Oid relnamespace,
+ TupleDesc tupDesc,
+ Oid relid,
+ Oid accessmtd,
+ Oid relfilenode,
+ Oid reltablespace,
+ bool shared_relation,
+ bool mapped_relation,
+ char relpersistence,
+ char relkind)
+{
+ Relation rel;
+ MemoryContext oldcxt;
+ int natts = tupDesc->natts;
+ int i;
+ bool has_not_null;
+ bool nailit;
+
+ AssertArg(natts >= 0);
+
+ /*
+ * check for creation of a rel that must be nailed in cache.
+ *
+ * XXX this list had better match the relations specially handled in
+ * RelationCacheInitializePhase2/3.
+ */
+ switch (relid)
+ {
+ case DatabaseRelationId:
+ case AuthIdRelationId:
+ case AuthMemRelationId:
+ case RelationRelationId:
+ case AttributeRelationId:
+ case ProcedureRelationId:
+ case TypeRelationId:
+ nailit = true;
+ break;
+ default:
+ nailit = false;
+ break;
+ }
+
+ /*
+ * check that hardwired list of shared rels matches what's in the
+ * bootstrap .bki file. If you get a failure here during initdb, you
+ * probably need to fix IsSharedRelation() to match whatever you've done
+ * to the set of shared relations.
+ */
+ if (shared_relation != IsSharedRelation(relid))
+ elog(ERROR, "shared_relation flag for \"%s\" does not match IsSharedRelation(%u)",
+ relname, relid);
+
+ /* Shared relations had better be mapped, too */
+ Assert(mapped_relation || !shared_relation);
+
+ /*
+ * switch to the cache context to create the relcache entry.
+ */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * allocate a new relation descriptor and fill in basic state fields.
+ */
+ rel = (Relation) palloc0(sizeof(RelationData));
+
+ /* make sure relation is marked as having no open file yet */
+ rel->rd_smgr = NULL;
+
+ /* mark it nailed if appropriate */
+ rel->rd_isnailed = nailit;
+
+ rel->rd_refcnt = nailit ? 1 : 0;
+
+ /* it's being created in this transaction */
+ rel->rd_createSubid = GetCurrentSubTransactionId();
+ rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ rel->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ rel->rd_droppedSubid = InvalidSubTransactionId;
+
+ /*
+ * create a new tuple descriptor from the one passed in. We do this
+ * partly to copy it into the cache context, and partly because the new
+ * relation can't have any defaults or constraints yet; they have to be
+ * added in later steps, because they require additions to multiple system
+ * catalogs. We can copy attnotnull constraints here, however.
+ */
+ rel->rd_att = CreateTupleDescCopy(tupDesc);
+ rel->rd_att->tdrefcount = 1; /* mark as refcounted */
+ has_not_null = false;
+ for (i = 0; i < natts; i++)
+ {
+ Form_pg_attribute satt = TupleDescAttr(tupDesc, i);
+ Form_pg_attribute datt = TupleDescAttr(rel->rd_att, i);
+
+ datt->attidentity = satt->attidentity;
+ datt->attgenerated = satt->attgenerated;
+ datt->attnotnull = satt->attnotnull;
+ has_not_null |= satt->attnotnull;
+ }
+
+ if (has_not_null)
+ {
+ TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr));
+
+ constr->has_not_null = true;
+ rel->rd_att->constr = constr;
+ }
+
+ /*
+ * initialize relation tuple form (caller may add/override data later)
+ */
+ rel->rd_rel = (Form_pg_class) palloc0(CLASS_TUPLE_SIZE);
+
+ namestrcpy(&rel->rd_rel->relname, relname);
+ rel->rd_rel->relnamespace = relnamespace;
+
+ rel->rd_rel->relkind = relkind;
+ rel->rd_rel->relnatts = natts;
+ rel->rd_rel->reltype = InvalidOid;
+ /* needed when bootstrapping: */
+ rel->rd_rel->relowner = BOOTSTRAP_SUPERUSERID;
+
+ /* set up persistence and relcache fields dependent on it */
+ rel->rd_rel->relpersistence = relpersistence;
+ switch (relpersistence)
+ {
+ case RELPERSISTENCE_UNLOGGED:
+ case RELPERSISTENCE_PERMANENT:
+ rel->rd_backend = InvalidBackendId;
+ rel->rd_islocaltemp = false;
+ break;
+ case RELPERSISTENCE_TEMP:
+ Assert(isTempOrTempToastNamespace(relnamespace));
+ rel->rd_backend = BackendIdForTempRelations();
+ rel->rd_islocaltemp = true;
+ break;
+ default:
+ elog(ERROR, "invalid relpersistence: %c", relpersistence);
+ break;
+ }
+
+ /* if it's a materialized view, it's not populated initially */
+ if (relkind == RELKIND_MATVIEW)
+ rel->rd_rel->relispopulated = false;
+ else
+ rel->rd_rel->relispopulated = true;
+
+ /* set replica identity -- system catalogs and non-tables don't have one */
+ if (!IsCatalogNamespace(relnamespace) &&
+ (relkind == RELKIND_RELATION ||
+ relkind == RELKIND_MATVIEW ||
+ relkind == RELKIND_PARTITIONED_TABLE))
+ rel->rd_rel->relreplident = REPLICA_IDENTITY_DEFAULT;
+ else
+ rel->rd_rel->relreplident = REPLICA_IDENTITY_NOTHING;
+
+ /*
+ * Insert relation physical and logical identifiers (OIDs) into the right
+ * places. For a mapped relation, we set relfilenode to zero and rely on
+ * RelationInitPhysicalAddr to consult the map.
+ */
+ rel->rd_rel->relisshared = shared_relation;
+
+ RelationGetRelid(rel) = relid;
+
+ for (i = 0; i < natts; i++)
+ TupleDescAttr(rel->rd_att, i)->attrelid = relid;
+
+ rel->rd_rel->reltablespace = reltablespace;
+
+ if (mapped_relation)
+ {
+ rel->rd_rel->relfilenode = InvalidOid;
+ /* Add it to the active mapping information */
+ RelationMapUpdateMap(relid, relfilenode, shared_relation, true);
+ }
+ else
+ rel->rd_rel->relfilenode = relfilenode;
+
+ RelationInitLockInfo(rel); /* see lmgr.c */
+
+ RelationInitPhysicalAddr(rel);
+
+ rel->rd_rel->relam = accessmtd;
+
+ /*
+ * RelationInitTableAccessMethod will do syscache lookups, so we mustn't
+ * run it in CacheMemoryContext. Fortunately, the remaining steps don't
+ * require a long-lived current context.
+ */
+ MemoryContextSwitchTo(oldcxt);
+
+ if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_SEQUENCE)
+ RelationInitTableAccessMethod(rel);
+
+ /*
+ * Okay to insert into the relcache hash table.
+ *
+ * Ordinarily, there should certainly not be an existing hash entry for
+ * the same OID; but during bootstrap, when we create a "real" relcache
+ * entry for one of the bootstrap relations, we'll be overwriting the
+ * phony one created with formrdesc. So allow that to happen for nailed
+ * rels.
+ */
+ RelationCacheInsert(rel, nailit);
+
+ /*
+ * Flag relation as needing eoxact cleanup (to clear rd_createSubid). We
+ * can't do this before storing relid in it.
+ */
+ EOXactListAdd(rel);
+
+ /* It's fully valid */
+ rel->rd_isvalid = true;
+
+ /*
+ * Caller expects us to pin the returned entry.
+ */
+ RelationIncrementReferenceCount(rel);
+
+ return rel;
+}
+
+
+/*
+ * RelationSetNewRelfilenode
+ *
+ * Assign a new relfilenode (physical file name), and possibly a new
+ * persistence setting, to the relation.
+ *
+ * This allows a full rewrite of the relation to be done with transactional
+ * safety (since the filenode assignment can be rolled back). Note however
+ * that there is no simple way to access the relation's old data for the
+ * remainder of the current transaction. This limits the usefulness to cases
+ * such as TRUNCATE or rebuilding an index from scratch.
+ *
+ * Caller must already hold exclusive lock on the relation.
+ */
+void
+RelationSetNewRelfilenode(Relation relation, char persistence)
+{
+ Oid newrelfilenode;
+ Relation pg_class;
+ HeapTuple tuple;
+ Form_pg_class classform;
+ MultiXactId minmulti = InvalidMultiXactId;
+ TransactionId freezeXid = InvalidTransactionId;
+ RelFileNode newrnode;
+
+ if (!IsBinaryUpgrade)
+ {
+ /* Allocate a new relfilenode */
+ newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace,
+ NULL, persistence);
+ }
+ else if (relation->rd_rel->relkind == RELKIND_INDEX)
+ {
+ if (!OidIsValid(binary_upgrade_next_index_pg_class_relfilenode))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("index relfilenode value not set when in binary upgrade mode")));
+
+ newrelfilenode = binary_upgrade_next_index_pg_class_relfilenode;
+ binary_upgrade_next_index_pg_class_relfilenode = InvalidOid;
+ }
+ else if (relation->rd_rel->relkind == RELKIND_RELATION)
+ {
+ if (!OidIsValid(binary_upgrade_next_heap_pg_class_relfilenode))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("heap relfilenode value not set when in binary upgrade mode")));
+
+ newrelfilenode = binary_upgrade_next_heap_pg_class_relfilenode;
+ binary_upgrade_next_heap_pg_class_relfilenode = InvalidOid;
+ }
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unexpected request for new relfilenode in binary upgrade mode")));
+
+ /*
+ * Get a writable copy of the pg_class tuple for the given relation.
+ */
+ pg_class = table_open(RelationRelationId, RowExclusiveLock);
+
+ tuple = SearchSysCacheCopy1(RELOID,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "could not find tuple for relation %u",
+ RelationGetRelid(relation));
+ classform = (Form_pg_class) GETSTRUCT(tuple);
+
+ /*
+ * Schedule unlinking of the old storage at transaction commit, except
+ * when performing a binary upgrade, when we must do it immediately.
+ */
+ if (IsBinaryUpgrade)
+ {
+ SMgrRelation srel;
+
+ /*
+ * During a binary upgrade, we use this code path to ensure that
+ * pg_largeobject and its index have the same relfilenode values as in
+ * the old cluster. This is necessary because pg_upgrade treats
+ * pg_largeobject like a user table, not a system table. It is however
+ * possible that a table or index may need to end up with the same
+ * relfilenode in the new cluster as what it had in the old cluster.
+ * Hence, we can't wait until commit time to remove the old storage.
+ *
+ * In general, this function needs to have transactional semantics,
+ * and removing the old storage before commit time surely isn't.
+ * However, it doesn't really matter, because if a binary upgrade
+ * fails at this stage, the new cluster will need to be recreated
+ * anyway.
+ */
+ srel = smgropen(relation->rd_node, relation->rd_backend);
+ smgrdounlinkall(&srel, 1, false);
+ smgrclose(srel);
+ }
+ else
+ {
+ /* Not a binary upgrade, so just schedule it to happen later. */
+ RelationDropStorage(relation);
+ }
+
+ /*
+ * Create storage for the main fork of the new relfilenode. If it's a
+ * table-like object, call into the table AM to do so, which'll also
+ * create the table's init fork if needed.
+ *
+ * NOTE: If relevant for the AM, any conflict in relfilenode value will be
+ * caught here, if GetNewRelFileNode messes up for any reason.
+ */
+ newrnode = relation->rd_node;
+ newrnode.relNode = newrelfilenode;
+
+ if (RELKIND_HAS_TABLE_AM(relation->rd_rel->relkind))
+ {
+ table_relation_set_new_filenode(relation, &newrnode,
+ persistence,
+ &freezeXid, &minmulti);
+ }
+ else if (RELKIND_HAS_STORAGE(relation->rd_rel->relkind))
+ {
+ /* handle these directly, at least for now */
+ SMgrRelation srel;
+
+ srel = RelationCreateStorage(newrnode, persistence, true);
+ smgrclose(srel);
+ }
+ else
+ {
+ /* we shouldn't be called for anything else */
+ elog(ERROR, "relation \"%s\" does not have storage",
+ RelationGetRelationName(relation));
+ }
+
+ /*
+ * If we're dealing with a mapped index, pg_class.relfilenode doesn't
+ * change; instead we have to send the update to the relation mapper.
+ *
+ * For mapped indexes, we don't actually change the pg_class entry at all;
+ * this is essential when reindexing pg_class itself. That leaves us with
+ * possibly-inaccurate values of relpages etc, but those will be fixed up
+ * later.
+ */
+ if (RelationIsMapped(relation))
+ {
+ /* This case is only supported for indexes */
+ Assert(relation->rd_rel->relkind == RELKIND_INDEX);
+
+ /* Since we're not updating pg_class, these had better not change */
+ Assert(classform->relfrozenxid == freezeXid);
+ Assert(classform->relminmxid == minmulti);
+ Assert(classform->relpersistence == persistence);
+
+ /*
+ * In some code paths it's possible that the tuple update we'd
+ * otherwise do here is the only thing that would assign an XID for
+ * the current transaction. However, we must have an XID to delete
+ * files, so make sure one is assigned.
+ */
+ (void) GetCurrentTransactionId();
+
+ /* Do the deed */
+ RelationMapUpdateMap(RelationGetRelid(relation),
+ newrelfilenode,
+ relation->rd_rel->relisshared,
+ false);
+
+ /* Since we're not updating pg_class, must trigger inval manually */
+ CacheInvalidateRelcache(relation);
+ }
+ else
+ {
+ /* Normal case, update the pg_class entry */
+ classform->relfilenode = newrelfilenode;
+
+ /* relpages etc. never change for sequences */
+ if (relation->rd_rel->relkind != RELKIND_SEQUENCE)
+ {
+ classform->relpages = 0; /* it's empty until further notice */
+ classform->reltuples = -1;
+ classform->relallvisible = 0;
+ }
+ classform->relfrozenxid = freezeXid;
+ classform->relminmxid = minmulti;
+ classform->relpersistence = persistence;
+
+ CatalogTupleUpdate(pg_class, &tuple->t_self, tuple);
+ }
+
+ heap_freetuple(tuple);
+
+ table_close(pg_class, RowExclusiveLock);
+
+ /*
+ * Make the pg_class row change or relation map change visible. This will
+ * cause the relcache entry to get updated, too.
+ */
+ CommandCounterIncrement();
+
+ RelationAssumeNewRelfilenode(relation);
+}
+
+/*
+ * RelationAssumeNewRelfilenode
+ *
+ * Code that modifies pg_class.reltablespace or pg_class.relfilenode must call
+ * this. The call shall precede any code that might insert WAL records whose
+ * replay would modify bytes in the new RelFileNode, and the call shall follow
+ * any WAL modifying bytes in the prior RelFileNode. See struct RelationData.
+ * Ideally, call this as near as possible to the CommandCounterIncrement()
+ * that makes the pg_class change visible (before it or after it); that
+ * minimizes the chance of future development adding a forbidden WAL insertion
+ * between RelationAssumeNewRelfilenode() and CommandCounterIncrement().
+ */
+void
+RelationAssumeNewRelfilenode(Relation relation)
+{
+ relation->rd_newRelfilenodeSubid = GetCurrentSubTransactionId();
+ if (relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId)
+ relation->rd_firstRelfilenodeSubid = relation->rd_newRelfilenodeSubid;
+
+ /* Flag relation as needing eoxact cleanup (to clear these fields) */
+ EOXactListAdd(relation);
+}
+
+
+/*
+ * RelationCacheInitialize
+ *
+ * This initializes the relation descriptor cache. At the time
+ * that this is invoked, we can't do database access yet (mainly
+ * because the transaction subsystem is not up); all we are doing
+ * is making an empty cache hashtable. This must be done before
+ * starting the initialization transaction, because otherwise
+ * AtEOXact_RelationCache would crash if that transaction aborts
+ * before we can get the relcache set up.
+ */
+
+#define INITRELCACHESIZE 400
+
+void
+RelationCacheInitialize(void)
+{
+ HASHCTL ctl;
+ int allocsize;
+
+ /*
+ * make sure cache memory context exists
+ */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ /*
+ * create hashtable that indexes the relcache
+ */
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(RelIdCacheEnt);
+ RelationIdCache = hash_create("Relcache by OID", INITRELCACHESIZE,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+
+ /*
+ * reserve enough in_progress_list slots for many cases
+ */
+ allocsize = 4;
+ in_progress_list =
+ MemoryContextAlloc(CacheMemoryContext,
+ allocsize * sizeof(*in_progress_list));
+ in_progress_list_maxlen = allocsize;
+
+ /*
+ * relation mapper needs to be initialized too
+ */
+ RelationMapInitialize();
+}
+
+/*
+ * RelationCacheInitializePhase2
+ *
+ * This is called to prepare for access to shared catalogs during startup.
+ * We must at least set up nailed reldescs for pg_database, pg_authid,
+ * pg_auth_members, and pg_shseclabel. Ideally we'd like to have reldescs
+ * for their indexes, too. We attempt to load this information from the
+ * shared relcache init file. If that's missing or broken, just make
+ * phony entries for the catalogs themselves.
+ * RelationCacheInitializePhase3 will clean up as needed.
+ */
+void
+RelationCacheInitializePhase2(void)
+{
+ MemoryContext oldcxt;
+
+ /*
+ * relation mapper needs initialized too
+ */
+ RelationMapInitializePhase2();
+
+ /*
+ * In bootstrap mode, the shared catalogs aren't there yet anyway, so do
+ * nothing.
+ */
+ if (IsBootstrapProcessingMode())
+ return;
+
+ /*
+ * switch to cache memory context
+ */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * Try to load the shared relcache cache file. If unsuccessful, bootstrap
+ * the cache with pre-made descriptors for the critical shared catalogs.
+ */
+ if (!load_relcache_init_file(true))
+ {
+ formrdesc("pg_database", DatabaseRelation_Rowtype_Id, true,
+ Natts_pg_database, Desc_pg_database);
+ formrdesc("pg_authid", AuthIdRelation_Rowtype_Id, true,
+ Natts_pg_authid, Desc_pg_authid);
+ formrdesc("pg_auth_members", AuthMemRelation_Rowtype_Id, true,
+ Natts_pg_auth_members, Desc_pg_auth_members);
+ formrdesc("pg_shseclabel", SharedSecLabelRelation_Rowtype_Id, true,
+ Natts_pg_shseclabel, Desc_pg_shseclabel);
+ formrdesc("pg_subscription", SubscriptionRelation_Rowtype_Id, true,
+ Natts_pg_subscription, Desc_pg_subscription);
+
+#define NUM_CRITICAL_SHARED_RELS 5 /* fix if you change list above */
+ }
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * RelationCacheInitializePhase3
+ *
+ * This is called as soon as the catcache and transaction system
+ * are functional and we have determined MyDatabaseId. At this point
+ * we can actually read data from the database's system catalogs.
+ * We first try to read pre-computed relcache entries from the local
+ * relcache init file. If that's missing or broken, make phony entries
+ * for the minimum set of nailed-in-cache relations. Then (unless
+ * bootstrapping) make sure we have entries for the critical system
+ * indexes. Once we've done all this, we have enough infrastructure to
+ * open any system catalog or use any catcache. The last step is to
+ * rewrite the cache files if needed.
+ */
+void
+RelationCacheInitializePhase3(void)
+{
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt *idhentry;
+ MemoryContext oldcxt;
+ bool needNewCacheFile = !criticalSharedRelcachesBuilt;
+
+ /*
+ * relation mapper needs initialized too
+ */
+ RelationMapInitializePhase3();
+
+ /*
+ * switch to cache memory context
+ */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /*
+ * Try to load the local relcache cache file. If unsuccessful, bootstrap
+ * the cache with pre-made descriptors for the critical "nailed-in" system
+ * catalogs.
+ */
+ if (IsBootstrapProcessingMode() ||
+ !load_relcache_init_file(false))
+ {
+ needNewCacheFile = true;
+
+ formrdesc("pg_class", RelationRelation_Rowtype_Id, false,
+ Natts_pg_class, Desc_pg_class);
+ formrdesc("pg_attribute", AttributeRelation_Rowtype_Id, false,
+ Natts_pg_attribute, Desc_pg_attribute);
+ formrdesc("pg_proc", ProcedureRelation_Rowtype_Id, false,
+ Natts_pg_proc, Desc_pg_proc);
+ formrdesc("pg_type", TypeRelation_Rowtype_Id, false,
+ Natts_pg_type, Desc_pg_type);
+
+#define NUM_CRITICAL_LOCAL_RELS 4 /* fix if you change list above */
+ }
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* In bootstrap mode, the faked-up formrdesc info is all we'll have */
+ if (IsBootstrapProcessingMode())
+ return;
+
+ /*
+ * If we didn't get the critical system indexes loaded into relcache, do
+ * so now. These are critical because the catcache and/or opclass cache
+ * depend on them for fetches done during relcache load. Thus, we have an
+ * infinite-recursion problem. We can break the recursion by doing
+ * heapscans instead of indexscans at certain key spots. To avoid hobbling
+ * performance, we only want to do that until we have the critical indexes
+ * loaded into relcache. Thus, the flag criticalRelcachesBuilt is used to
+ * decide whether to do heapscan or indexscan at the key spots, and we set
+ * it true after we've loaded the critical indexes.
+ *
+ * The critical indexes are marked as "nailed in cache", partly to make it
+ * easy for load_relcache_init_file to count them, but mainly because we
+ * cannot flush and rebuild them once we've set criticalRelcachesBuilt to
+ * true. (NOTE: perhaps it would be possible to reload them by
+ * temporarily setting criticalRelcachesBuilt to false again. For now,
+ * though, we just nail 'em in.)
+ *
+ * RewriteRelRulenameIndexId and TriggerRelidNameIndexId are not critical
+ * in the same way as the others, because the critical catalogs don't
+ * (currently) have any rules or triggers, and so these indexes can be
+ * rebuilt without inducing recursion. However they are used during
+ * relcache load when a rel does have rules or triggers, so we choose to
+ * nail them for performance reasons.
+ */
+ if (!criticalRelcachesBuilt)
+ {
+ load_critical_index(ClassOidIndexId,
+ RelationRelationId);
+ load_critical_index(AttributeRelidNumIndexId,
+ AttributeRelationId);
+ load_critical_index(IndexRelidIndexId,
+ IndexRelationId);
+ load_critical_index(OpclassOidIndexId,
+ OperatorClassRelationId);
+ load_critical_index(AccessMethodProcedureIndexId,
+ AccessMethodProcedureRelationId);
+ load_critical_index(RewriteRelRulenameIndexId,
+ RewriteRelationId);
+ load_critical_index(TriggerRelidNameIndexId,
+ TriggerRelationId);
+
+#define NUM_CRITICAL_LOCAL_INDEXES 7 /* fix if you change list above */
+
+ criticalRelcachesBuilt = true;
+ }
+
+ /*
+ * Process critical shared indexes too.
+ *
+ * DatabaseNameIndexId isn't critical for relcache loading, but rather for
+ * initial lookup of MyDatabaseId, without which we'll never find any
+ * non-shared catalogs at all. Autovacuum calls InitPostgres with a
+ * database OID, so it instead depends on DatabaseOidIndexId. We also
+ * need to nail up some indexes on pg_authid and pg_auth_members for use
+ * during client authentication. SharedSecLabelObjectIndexId isn't
+ * critical for the core system, but authentication hooks might be
+ * interested in it.
+ */
+ if (!criticalSharedRelcachesBuilt)
+ {
+ load_critical_index(DatabaseNameIndexId,
+ DatabaseRelationId);
+ load_critical_index(DatabaseOidIndexId,
+ DatabaseRelationId);
+ load_critical_index(AuthIdRolnameIndexId,
+ AuthIdRelationId);
+ load_critical_index(AuthIdOidIndexId,
+ AuthIdRelationId);
+ load_critical_index(AuthMemMemRoleIndexId,
+ AuthMemRelationId);
+ load_critical_index(SharedSecLabelObjectIndexId,
+ SharedSecLabelRelationId);
+
+#define NUM_CRITICAL_SHARED_INDEXES 6 /* fix if you change list above */
+
+ criticalSharedRelcachesBuilt = true;
+ }
+
+ /*
+ * Now, scan all the relcache entries and update anything that might be
+ * wrong in the results from formrdesc or the relcache cache file. If we
+ * faked up relcache entries using formrdesc, then read the real pg_class
+ * rows and replace the fake entries with them. Also, if any of the
+ * relcache entries have rules, triggers, or security policies, load that
+ * info the hard way since it isn't recorded in the cache file.
+ *
+ * Whenever we access the catalogs to read data, there is a possibility of
+ * a shared-inval cache flush causing relcache entries to be removed.
+ * Since hash_seq_search only guarantees to still work after the *current*
+ * entry is removed, it's unsafe to continue the hashtable scan afterward.
+ * We handle this by restarting the scan from scratch after each access.
+ * This is theoretically O(N^2), but the number of entries that actually
+ * need to be fixed is small enough that it doesn't matter.
+ */
+ hash_seq_init(&status, RelationIdCache);
+
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Relation relation = idhentry->reldesc;
+ bool restart = false;
+
+ /*
+ * Make sure *this* entry doesn't get flushed while we work with it.
+ */
+ RelationIncrementReferenceCount(relation);
+
+ /*
+ * If it's a faked-up entry, read the real pg_class tuple.
+ */
+ if (relation->rd_rel->relowner == InvalidOid)
+ {
+ HeapTuple htup;
+ Form_pg_class relp;
+
+ htup = SearchSysCache1(RELOID,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+ if (!HeapTupleIsValid(htup))
+ elog(FATAL, "cache lookup failed for relation %u",
+ RelationGetRelid(relation));
+ relp = (Form_pg_class) GETSTRUCT(htup);
+
+ /*
+ * Copy tuple to relation->rd_rel. (See notes in
+ * AllocateRelationDesc())
+ */
+ memcpy((char *) relation->rd_rel, (char *) relp, CLASS_TUPLE_SIZE);
+
+ /* Update rd_options while we have the tuple */
+ if (relation->rd_options)
+ pfree(relation->rd_options);
+ RelationParseRelOptions(relation, htup);
+
+ /*
+ * Check the values in rd_att were set up correctly. (We cannot
+ * just copy them over now: formrdesc must have set up the rd_att
+ * data correctly to start with, because it may already have been
+ * copied into one or more catcache entries.)
+ */
+ Assert(relation->rd_att->tdtypeid == relp->reltype);
+ Assert(relation->rd_att->tdtypmod == -1);
+
+ ReleaseSysCache(htup);
+
+ /* relowner had better be OK now, else we'll loop forever */
+ if (relation->rd_rel->relowner == InvalidOid)
+ elog(ERROR, "invalid relowner in pg_class entry for \"%s\"",
+ RelationGetRelationName(relation));
+
+ restart = true;
+ }
+
+ /*
+ * Fix data that isn't saved in relcache cache file.
+ *
+ * relhasrules or relhastriggers could possibly be wrong or out of
+ * date. If we don't actually find any rules or triggers, clear the
+ * local copy of the flag so that we don't get into an infinite loop
+ * here. We don't make any attempt to fix the pg_class entry, though.
+ */
+ if (relation->rd_rel->relhasrules && relation->rd_rules == NULL)
+ {
+ RelationBuildRuleLock(relation);
+ if (relation->rd_rules == NULL)
+ relation->rd_rel->relhasrules = false;
+ restart = true;
+ }
+ if (relation->rd_rel->relhastriggers && relation->trigdesc == NULL)
+ {
+ RelationBuildTriggers(relation);
+ if (relation->trigdesc == NULL)
+ relation->rd_rel->relhastriggers = false;
+ restart = true;
+ }
+
+ /*
+ * Re-load the row security policies if the relation has them, since
+ * they are not preserved in the cache. Note that we can never NOT
+ * have a policy while relrowsecurity is true,
+ * RelationBuildRowSecurity will create a single default-deny policy
+ * if there is no policy defined in pg_policy.
+ */
+ if (relation->rd_rel->relrowsecurity && relation->rd_rsdesc == NULL)
+ {
+ RelationBuildRowSecurity(relation);
+
+ Assert(relation->rd_rsdesc != NULL);
+ restart = true;
+ }
+
+ /* Reload tableam data if needed */
+ if (relation->rd_tableam == NULL &&
+ (RELKIND_HAS_TABLE_AM(relation->rd_rel->relkind) || relation->rd_rel->relkind == RELKIND_SEQUENCE))
+ {
+ RelationInitTableAccessMethod(relation);
+ Assert(relation->rd_tableam != NULL);
+
+ restart = true;
+ }
+
+ /* Release hold on the relation */
+ RelationDecrementReferenceCount(relation);
+
+ /* Now, restart the hashtable scan if needed */
+ if (restart)
+ {
+ hash_seq_term(&status);
+ hash_seq_init(&status, RelationIdCache);
+ }
+ }
+
+ /*
+ * Lastly, write out new relcache cache files if needed. We don't bother
+ * to distinguish cases where only one of the two needs an update.
+ */
+ if (needNewCacheFile)
+ {
+ /*
+ * Force all the catcaches to finish initializing and thereby open the
+ * catalogs and indexes they use. This will preload the relcache with
+ * entries for all the most important system catalogs and indexes, so
+ * that the init files will be most useful for future backends.
+ */
+ InitCatalogCachePhase2();
+
+ /* now write the files */
+ write_relcache_init_file(true);
+ write_relcache_init_file(false);
+ }
+}
+
+/*
+ * Load one critical system index into the relcache
+ *
+ * indexoid is the OID of the target index, heapoid is the OID of the catalog
+ * it belongs to.
+ */
+static void
+load_critical_index(Oid indexoid, Oid heapoid)
+{
+ Relation ird;
+
+ /*
+ * We must lock the underlying catalog before locking the index to avoid
+ * deadlock, since RelationBuildDesc might well need to read the catalog,
+ * and if anyone else is exclusive-locking this catalog and index they'll
+ * be doing it in that order.
+ */
+ LockRelationOid(heapoid, AccessShareLock);
+ LockRelationOid(indexoid, AccessShareLock);
+ ird = RelationBuildDesc(indexoid, true);
+ if (ird == NULL)
+ elog(PANIC, "could not open critical system index %u", indexoid);
+ ird->rd_isnailed = true;
+ ird->rd_refcnt = 1;
+ UnlockRelationOid(indexoid, AccessShareLock);
+ UnlockRelationOid(heapoid, AccessShareLock);
+
+ (void) RelationGetIndexAttOptions(ird, false);
+}
+
+/*
+ * GetPgClassDescriptor -- get a predefined tuple descriptor for pg_class
+ * GetPgIndexDescriptor -- get a predefined tuple descriptor for pg_index
+ *
+ * We need this kluge because we have to be able to access non-fixed-width
+ * fields of pg_class and pg_index before we have the standard catalog caches
+ * available. We use predefined data that's set up in just the same way as
+ * the bootstrapped reldescs used by formrdesc(). The resulting tupdesc is
+ * not 100% kosher: it does not have the correct rowtype OID in tdtypeid, nor
+ * does it have a TupleConstr field. But it's good enough for the purpose of
+ * extracting fields.
+ */
+static TupleDesc
+BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
+{
+ TupleDesc result;
+ MemoryContext oldcxt;
+ int i;
+
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ result = CreateTemplateTupleDesc(natts);
+ result->tdtypeid = RECORDOID; /* not right, but we don't care */
+ result->tdtypmod = -1;
+
+ for (i = 0; i < natts; i++)
+ {
+ memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ /* make sure attcacheoff is valid */
+ TupleDescAttr(result, i)->attcacheoff = -1;
+ }
+
+ /* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
+ TupleDescAttr(result, 0)->attcacheoff = 0;
+
+ /* Note: we don't bother to set up a TupleConstr entry */
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return result;
+}
+
+static TupleDesc
+GetPgClassDescriptor(void)
+{
+ static TupleDesc pgclassdesc = NULL;
+
+ /* Already done? */
+ if (pgclassdesc == NULL)
+ pgclassdesc = BuildHardcodedDescriptor(Natts_pg_class,
+ Desc_pg_class);
+
+ return pgclassdesc;
+}
+
+static TupleDesc
+GetPgIndexDescriptor(void)
+{
+ static TupleDesc pgindexdesc = NULL;
+
+ /* Already done? */
+ if (pgindexdesc == NULL)
+ pgindexdesc = BuildHardcodedDescriptor(Natts_pg_index,
+ Desc_pg_index);
+
+ return pgindexdesc;
+}
+
+/*
+ * Load any default attribute value definitions for the relation.
+ *
+ * ndef is the number of attributes that were marked atthasdef.
+ *
+ * Note: we don't make it a hard error to be missing some pg_attrdef records.
+ * We can limp along as long as nothing needs to use the default value. Code
+ * that fails to find an expected AttrDefault record should throw an error.
+ */
+static void
+AttrDefaultFetch(Relation relation, int ndef)
+{
+ AttrDefault *attrdef;
+ Relation adrel;
+ SysScanDesc adscan;
+ ScanKeyData skey;
+ HeapTuple htup;
+ int found = 0;
+
+ /* Allocate array with room for as many entries as expected */
+ attrdef = (AttrDefault *)
+ MemoryContextAllocZero(CacheMemoryContext,
+ ndef * sizeof(AttrDefault));
+
+ /* Search pg_attrdef for relevant entries */
+ ScanKeyInit(&skey,
+ Anum_pg_attrdef_adrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ adrel = table_open(AttrDefaultRelationId, AccessShareLock);
+ adscan = systable_beginscan(adrel, AttrDefaultIndexId, true,
+ NULL, 1, &skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(adscan)))
+ {
+ Form_pg_attrdef adform = (Form_pg_attrdef) GETSTRUCT(htup);
+ Datum val;
+ bool isnull;
+
+ /* protect limited size of array */
+ if (found >= ndef)
+ {
+ elog(WARNING, "unexpected pg_attrdef record found for attribute %d of relation \"%s\"",
+ adform->adnum, RelationGetRelationName(relation));
+ break;
+ }
+
+ val = fastgetattr(htup,
+ Anum_pg_attrdef_adbin,
+ adrel->rd_att, &isnull);
+ if (isnull)
+ elog(WARNING, "null adbin for attribute %d of relation \"%s\"",
+ adform->adnum, RelationGetRelationName(relation));
+ else
+ {
+ /* detoast and convert to cstring in caller's context */
+ char *s = TextDatumGetCString(val);
+
+ attrdef[found].adnum = adform->adnum;
+ attrdef[found].adbin = MemoryContextStrdup(CacheMemoryContext, s);
+ pfree(s);
+ found++;
+ }
+ }
+
+ systable_endscan(adscan);
+ table_close(adrel, AccessShareLock);
+
+ if (found != ndef)
+ elog(WARNING, "%d pg_attrdef record(s) missing for relation \"%s\"",
+ ndef - found, RelationGetRelationName(relation));
+
+ /*
+ * Sort the AttrDefault entries by adnum, for the convenience of
+ * equalTupleDescs(). (Usually, they already will be in order, but this
+ * might not be so if systable_getnext isn't using an index.)
+ */
+ if (found > 1)
+ qsort(attrdef, found, sizeof(AttrDefault), AttrDefaultCmp);
+
+ /* Install array only after it's fully valid */
+ relation->rd_att->constr->defval = attrdef;
+ relation->rd_att->constr->num_defval = found;
+}
+
+/*
+ * qsort comparator to sort AttrDefault entries by adnum
+ */
+static int
+AttrDefaultCmp(const void *a, const void *b)
+{
+ const AttrDefault *ada = (const AttrDefault *) a;
+ const AttrDefault *adb = (const AttrDefault *) b;
+
+ return ada->adnum - adb->adnum;
+}
+
+/*
+ * Load any check constraints for the relation.
+ *
+ * As with defaults, if we don't find the expected number of them, just warn
+ * here. The executor should throw an error if an INSERT/UPDATE is attempted.
+ */
+static void
+CheckConstraintFetch(Relation relation)
+{
+ ConstrCheck *check;
+ int ncheck = relation->rd_rel->relchecks;
+ Relation conrel;
+ SysScanDesc conscan;
+ ScanKeyData skey[1];
+ HeapTuple htup;
+ int found = 0;
+
+ /* Allocate array with room for as many entries as expected */
+ check = (ConstrCheck *)
+ MemoryContextAllocZero(CacheMemoryContext,
+ ncheck * sizeof(ConstrCheck));
+
+ /* Search pg_constraint for relevant entries */
+ ScanKeyInit(&skey[0],
+ Anum_pg_constraint_conrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ conrel = table_open(ConstraintRelationId, AccessShareLock);
+ conscan = systable_beginscan(conrel, ConstraintRelidTypidNameIndexId, true,
+ NULL, 1, skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(conscan)))
+ {
+ Form_pg_constraint conform = (Form_pg_constraint) GETSTRUCT(htup);
+ Datum val;
+ bool isnull;
+
+ /* We want check constraints only */
+ if (conform->contype != CONSTRAINT_CHECK)
+ continue;
+
+ /* protect limited size of array */
+ if (found >= ncheck)
+ {
+ elog(WARNING, "unexpected pg_constraint record found for relation \"%s\"",
+ RelationGetRelationName(relation));
+ break;
+ }
+
+ check[found].ccvalid = conform->convalidated;
+ check[found].ccnoinherit = conform->connoinherit;
+ check[found].ccname = MemoryContextStrdup(CacheMemoryContext,
+ NameStr(conform->conname));
+
+ /* Grab and test conbin is actually set */
+ val = fastgetattr(htup,
+ Anum_pg_constraint_conbin,
+ conrel->rd_att, &isnull);
+ if (isnull)
+ elog(WARNING, "null conbin for relation \"%s\"",
+ RelationGetRelationName(relation));
+ else
+ {
+ /* detoast and convert to cstring in caller's context */
+ char *s = TextDatumGetCString(val);
+
+ check[found].ccbin = MemoryContextStrdup(CacheMemoryContext, s);
+ pfree(s);
+ found++;
+ }
+ }
+
+ systable_endscan(conscan);
+ table_close(conrel, AccessShareLock);
+
+ if (found != ncheck)
+ elog(WARNING, "%d pg_constraint record(s) missing for relation \"%s\"",
+ ncheck - found, RelationGetRelationName(relation));
+
+ /*
+ * Sort the records by name. This ensures that CHECKs are applied in a
+ * deterministic order, and it also makes equalTupleDescs() faster.
+ */
+ if (found > 1)
+ qsort(check, found, sizeof(ConstrCheck), CheckConstraintCmp);
+
+ /* Install array only after it's fully valid */
+ relation->rd_att->constr->check = check;
+ relation->rd_att->constr->num_check = found;
+}
+
+/*
+ * qsort comparator to sort ConstrCheck entries by name
+ */
+static int
+CheckConstraintCmp(const void *a, const void *b)
+{
+ const ConstrCheck *ca = (const ConstrCheck *) a;
+ const ConstrCheck *cb = (const ConstrCheck *) b;
+
+ return strcmp(ca->ccname, cb->ccname);
+}
+
+/*
+ * RelationGetFKeyList -- get a list of foreign key info for the relation
+ *
+ * Returns a list of ForeignKeyCacheInfo structs, one per FK constraining
+ * the given relation. This data is a direct copy of relevant fields from
+ * pg_constraint. The list items are in no particular order.
+ *
+ * CAUTION: the returned list is part of the relcache's data, and could
+ * vanish in a relcache entry reset. Callers must inspect or copy it
+ * before doing anything that might trigger a cache flush, such as
+ * system catalog accesses. copyObject() can be used if desired.
+ * (We define it this way because current callers want to filter and
+ * modify the list entries anyway, so copying would be a waste of time.)
+ */
+List *
+RelationGetFKeyList(Relation relation)
+{
+ List *result;
+ Relation conrel;
+ SysScanDesc conscan;
+ ScanKeyData skey;
+ HeapTuple htup;
+ List *oldlist;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the list. */
+ if (relation->rd_fkeyvalid)
+ return relation->rd_fkeylist;
+
+ /* Fast path: non-partitioned tables without triggers can't have FKs */
+ if (!relation->rd_rel->relhastriggers &&
+ relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
+ return NIL;
+
+ /*
+ * We build the list we intend to return (in the caller's context) while
+ * doing the scan. After successfully completing the scan, we copy that
+ * list into the relcache entry. This avoids cache-context memory leakage
+ * if we get some sort of error partway through.
+ */
+ result = NIL;
+
+ /* Prepare to scan pg_constraint for entries having conrelid = this rel. */
+ ScanKeyInit(&skey,
+ Anum_pg_constraint_conrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ conrel = table_open(ConstraintRelationId, AccessShareLock);
+ conscan = systable_beginscan(conrel, ConstraintRelidTypidNameIndexId, true,
+ NULL, 1, &skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(conscan)))
+ {
+ Form_pg_constraint constraint = (Form_pg_constraint) GETSTRUCT(htup);
+ ForeignKeyCacheInfo *info;
+
+ /* consider only foreign keys */
+ if (constraint->contype != CONSTRAINT_FOREIGN)
+ continue;
+
+ info = makeNode(ForeignKeyCacheInfo);
+ info->conoid = constraint->oid;
+ info->conrelid = constraint->conrelid;
+ info->confrelid = constraint->confrelid;
+
+ DeconstructFkConstraintRow(htup, &info->nkeys,
+ info->conkey,
+ info->confkey,
+ info->conpfeqop,
+ NULL, NULL, NULL, NULL);
+
+ /* Add FK's node to the result list */
+ result = lappend(result, info);
+ }
+
+ systable_endscan(conscan);
+ table_close(conrel, AccessShareLock);
+
+ /* Now save a copy of the completed list in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ oldlist = relation->rd_fkeylist;
+ relation->rd_fkeylist = copyObject(result);
+ relation->rd_fkeyvalid = true;
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Don't leak the old list, if there is one */
+ list_free_deep(oldlist);
+
+ return result;
+}
+
+/*
+ * RelationGetIndexList -- get a list of OIDs of indexes on this relation
+ *
+ * The index list is created only if someone requests it. We scan pg_index
+ * to find relevant indexes, and add the list to the relcache entry so that
+ * we won't have to compute it again. Note that shared cache inval of a
+ * relcache entry will delete the old list and set rd_indexvalid to false,
+ * so that we must recompute the index list on next request. This handles
+ * creation or deletion of an index.
+ *
+ * Indexes that are marked not indislive are omitted from the returned list.
+ * Such indexes are expected to be dropped momentarily, and should not be
+ * touched at all by any caller of this function.
+ *
+ * The returned list is guaranteed to be sorted in order by OID. This is
+ * needed by the executor, since for index types that we obtain exclusive
+ * locks on when updating the index, all backends must lock the indexes in
+ * the same order or we will get deadlocks (see ExecOpenIndices()). Any
+ * consistent ordering would do, but ordering by OID is easy.
+ *
+ * Since shared cache inval causes the relcache's copy of the list to go away,
+ * we return a copy of the list palloc'd in the caller's context. The caller
+ * may list_free() the returned list after scanning it. This is necessary
+ * since the caller will typically be doing syscache lookups on the relevant
+ * indexes, and syscache lookup could cause SI messages to be processed!
+ *
+ * In exactly the same way, we update rd_pkindex, which is the OID of the
+ * relation's primary key index if any, else InvalidOid; and rd_replidindex,
+ * which is the pg_class OID of an index to be used as the relation's
+ * replication identity index, or InvalidOid if there is no such index.
+ */
+List *
+RelationGetIndexList(Relation relation)
+{
+ Relation indrel;
+ SysScanDesc indscan;
+ ScanKeyData skey;
+ HeapTuple htup;
+ List *result;
+ List *oldlist;
+ char replident = relation->rd_rel->relreplident;
+ Oid pkeyIndex = InvalidOid;
+ Oid candidateIndex = InvalidOid;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the list. */
+ if (relation->rd_indexvalid)
+ return list_copy(relation->rd_indexlist);
+
+ /*
+ * We build the list we intend to return (in the caller's context) while
+ * doing the scan. After successfully completing the scan, we copy that
+ * list into the relcache entry. This avoids cache-context memory leakage
+ * if we get some sort of error partway through.
+ */
+ result = NIL;
+
+ /* Prepare to scan pg_index for entries having indrelid = this rel. */
+ ScanKeyInit(&skey,
+ Anum_pg_index_indrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ indrel = table_open(IndexRelationId, AccessShareLock);
+ indscan = systable_beginscan(indrel, IndexIndrelidIndexId, true,
+ NULL, 1, &skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(indscan)))
+ {
+ Form_pg_index index = (Form_pg_index) GETSTRUCT(htup);
+
+ /*
+ * Ignore any indexes that are currently being dropped. This will
+ * prevent them from being searched, inserted into, or considered in
+ * HOT-safety decisions. It's unsafe to touch such an index at all
+ * since its catalog entries could disappear at any instant.
+ */
+ if (!index->indislive)
+ continue;
+
+ /* add index's OID to result list */
+ result = lappend_oid(result, index->indexrelid);
+
+ /*
+ * Invalid, non-unique, non-immediate or predicate indexes aren't
+ * interesting for either oid indexes or replication identity indexes,
+ * so don't check them.
+ */
+ if (!index->indisvalid || !index->indisunique ||
+ !index->indimmediate ||
+ !heap_attisnull(htup, Anum_pg_index_indpred, NULL))
+ continue;
+
+ /* remember primary key index if any */
+ if (index->indisprimary)
+ pkeyIndex = index->indexrelid;
+
+ /* remember explicitly chosen replica index */
+ if (index->indisreplident)
+ candidateIndex = index->indexrelid;
+ }
+
+ systable_endscan(indscan);
+
+ table_close(indrel, AccessShareLock);
+
+ /* Sort the result list into OID order, per API spec. */
+ list_sort(result, list_oid_cmp);
+
+ /* Now save a copy of the completed list in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ oldlist = relation->rd_indexlist;
+ relation->rd_indexlist = list_copy(result);
+ relation->rd_pkindex = pkeyIndex;
+ if (replident == REPLICA_IDENTITY_DEFAULT && OidIsValid(pkeyIndex))
+ relation->rd_replidindex = pkeyIndex;
+ else if (replident == REPLICA_IDENTITY_INDEX && OidIsValid(candidateIndex))
+ relation->rd_replidindex = candidateIndex;
+ else
+ relation->rd_replidindex = InvalidOid;
+ relation->rd_indexvalid = true;
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Don't leak the old list, if there is one */
+ list_free(oldlist);
+
+ return result;
+}
+
+/*
+ * RelationGetStatExtList
+ * get a list of OIDs of statistics objects on this relation
+ *
+ * The statistics list is created only if someone requests it, in a way
+ * similar to RelationGetIndexList(). We scan pg_statistic_ext to find
+ * relevant statistics, and add the list to the relcache entry so that we
+ * won't have to compute it again. Note that shared cache inval of a
+ * relcache entry will delete the old list and set rd_statvalid to 0,
+ * so that we must recompute the statistics list on next request. This
+ * handles creation or deletion of a statistics object.
+ *
+ * The returned list is guaranteed to be sorted in order by OID, although
+ * this is not currently needed.
+ *
+ * Since shared cache inval causes the relcache's copy of the list to go away,
+ * we return a copy of the list palloc'd in the caller's context. The caller
+ * may list_free() the returned list after scanning it. This is necessary
+ * since the caller will typically be doing syscache lookups on the relevant
+ * statistics, and syscache lookup could cause SI messages to be processed!
+ */
+List *
+RelationGetStatExtList(Relation relation)
+{
+ Relation indrel;
+ SysScanDesc indscan;
+ ScanKeyData skey;
+ HeapTuple htup;
+ List *result;
+ List *oldlist;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the list. */
+ if (relation->rd_statvalid != 0)
+ return list_copy(relation->rd_statlist);
+
+ /*
+ * We build the list we intend to return (in the caller's context) while
+ * doing the scan. After successfully completing the scan, we copy that
+ * list into the relcache entry. This avoids cache-context memory leakage
+ * if we get some sort of error partway through.
+ */
+ result = NIL;
+
+ /*
+ * Prepare to scan pg_statistic_ext for entries having stxrelid = this
+ * rel.
+ */
+ ScanKeyInit(&skey,
+ Anum_pg_statistic_ext_stxrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(RelationGetRelid(relation)));
+
+ indrel = table_open(StatisticExtRelationId, AccessShareLock);
+ indscan = systable_beginscan(indrel, StatisticExtRelidIndexId, true,
+ NULL, 1, &skey);
+
+ while (HeapTupleIsValid(htup = systable_getnext(indscan)))
+ {
+ Oid oid = ((Form_pg_statistic_ext) GETSTRUCT(htup))->oid;
+
+ result = lappend_oid(result, oid);
+ }
+
+ systable_endscan(indscan);
+
+ table_close(indrel, AccessShareLock);
+
+ /* Sort the result list into OID order, per API spec. */
+ list_sort(result, list_oid_cmp);
+
+ /* Now save a copy of the completed list in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ oldlist = relation->rd_statlist;
+ relation->rd_statlist = list_copy(result);
+
+ relation->rd_statvalid = true;
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Don't leak the old list, if there is one */
+ list_free(oldlist);
+
+ return result;
+}
+
+/*
+ * RelationGetPrimaryKeyIndex -- get OID of the relation's primary key index
+ *
+ * Returns InvalidOid if there is no such index.
+ */
+Oid
+RelationGetPrimaryKeyIndex(Relation relation)
+{
+ List *ilist;
+
+ if (!relation->rd_indexvalid)
+ {
+ /* RelationGetIndexList does the heavy lifting. */
+ ilist = RelationGetIndexList(relation);
+ list_free(ilist);
+ Assert(relation->rd_indexvalid);
+ }
+
+ return relation->rd_pkindex;
+}
+
+/*
+ * RelationGetReplicaIndex -- get OID of the relation's replica identity index
+ *
+ * Returns InvalidOid if there is no such index.
+ */
+Oid
+RelationGetReplicaIndex(Relation relation)
+{
+ List *ilist;
+
+ if (!relation->rd_indexvalid)
+ {
+ /* RelationGetIndexList does the heavy lifting. */
+ ilist = RelationGetIndexList(relation);
+ list_free(ilist);
+ Assert(relation->rd_indexvalid);
+ }
+
+ return relation->rd_replidindex;
+}
+
+/*
+ * RelationGetIndexExpressions -- get the index expressions for an index
+ *
+ * We cache the result of transforming pg_index.indexprs into a node tree.
+ * If the rel is not an index or has no expressional columns, we return NIL.
+ * Otherwise, the returned tree is copied into the caller's memory context.
+ * (We don't want to return a pointer to the relcache copy, since it could
+ * disappear due to relcache invalidation.)
+ */
+List *
+RelationGetIndexExpressions(Relation relation)
+{
+ List *result;
+ Datum exprsDatum;
+ bool isnull;
+ char *exprsString;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the result. */
+ if (relation->rd_indexprs)
+ return copyObject(relation->rd_indexprs);
+
+ /* Quick exit if there is nothing to do. */
+ if (relation->rd_indextuple == NULL ||
+ heap_attisnull(relation->rd_indextuple, Anum_pg_index_indexprs, NULL))
+ return NIL;
+
+ /*
+ * We build the tree we intend to return in the caller's context. After
+ * successfully completing the work, we copy it into the relcache entry.
+ * This avoids problems if we get some sort of error partway through.
+ */
+ exprsDatum = heap_getattr(relation->rd_indextuple,
+ Anum_pg_index_indexprs,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ exprsString = TextDatumGetCString(exprsDatum);
+ result = (List *) stringToNode(exprsString);
+ pfree(exprsString);
+
+ /*
+ * Run the expressions through eval_const_expressions. This is not just an
+ * optimization, but is necessary, because the planner will be comparing
+ * them to similarly-processed qual clauses, and may fail to detect valid
+ * matches without this. We must not use canonicalize_qual, however,
+ * since these aren't qual expressions.
+ */
+ result = (List *) eval_const_expressions(NULL, (Node *) result);
+
+ /* May as well fix opfuncids too */
+ fix_opfuncids((Node *) result);
+
+ /* Now save a copy of the completed tree in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(relation->rd_indexcxt);
+ relation->rd_indexprs = copyObject(result);
+ MemoryContextSwitchTo(oldcxt);
+
+ return result;
+}
+
+/*
+ * RelationGetDummyIndexExpressions -- get dummy expressions for an index
+ *
+ * Return a list of dummy expressions (just Const nodes) with the same
+ * types/typmods/collations as the index's real expressions. This is
+ * useful in situations where we don't want to run any user-defined code.
+ */
+List *
+RelationGetDummyIndexExpressions(Relation relation)
+{
+ List *result;
+ Datum exprsDatum;
+ bool isnull;
+ char *exprsString;
+ List *rawExprs;
+ ListCell *lc;
+
+ /* Quick exit if there is nothing to do. */
+ if (relation->rd_indextuple == NULL ||
+ heap_attisnull(relation->rd_indextuple, Anum_pg_index_indexprs, NULL))
+ return NIL;
+
+ /* Extract raw node tree(s) from index tuple. */
+ exprsDatum = heap_getattr(relation->rd_indextuple,
+ Anum_pg_index_indexprs,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ exprsString = TextDatumGetCString(exprsDatum);
+ rawExprs = (List *) stringToNode(exprsString);
+ pfree(exprsString);
+
+ /* Construct null Consts; the typlen and typbyval are arbitrary. */
+ result = NIL;
+ foreach(lc, rawExprs)
+ {
+ Node *rawExpr = (Node *) lfirst(lc);
+
+ result = lappend(result,
+ makeConst(exprType(rawExpr),
+ exprTypmod(rawExpr),
+ exprCollation(rawExpr),
+ 1,
+ (Datum) 0,
+ true,
+ true));
+ }
+
+ return result;
+}
+
+/*
+ * RelationGetIndexPredicate -- get the index predicate for an index
+ *
+ * We cache the result of transforming pg_index.indpred into an implicit-AND
+ * node tree (suitable for use in planning).
+ * If the rel is not an index or has no predicate, we return NIL.
+ * Otherwise, the returned tree is copied into the caller's memory context.
+ * (We don't want to return a pointer to the relcache copy, since it could
+ * disappear due to relcache invalidation.)
+ */
+List *
+RelationGetIndexPredicate(Relation relation)
+{
+ List *result;
+ Datum predDatum;
+ bool isnull;
+ char *predString;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the result. */
+ if (relation->rd_indpred)
+ return copyObject(relation->rd_indpred);
+
+ /* Quick exit if there is nothing to do. */
+ if (relation->rd_indextuple == NULL ||
+ heap_attisnull(relation->rd_indextuple, Anum_pg_index_indpred, NULL))
+ return NIL;
+
+ /*
+ * We build the tree we intend to return in the caller's context. After
+ * successfully completing the work, we copy it into the relcache entry.
+ * This avoids problems if we get some sort of error partway through.
+ */
+ predDatum = heap_getattr(relation->rd_indextuple,
+ Anum_pg_index_indpred,
+ GetPgIndexDescriptor(),
+ &isnull);
+ Assert(!isnull);
+ predString = TextDatumGetCString(predDatum);
+ result = (List *) stringToNode(predString);
+ pfree(predString);
+
+ /*
+ * Run the expression through const-simplification and canonicalization.
+ * This is not just an optimization, but is necessary, because the planner
+ * will be comparing it to similarly-processed qual clauses, and may fail
+ * to detect valid matches without this. This must match the processing
+ * done to qual clauses in preprocess_expression()! (We can skip the
+ * stuff involving subqueries, however, since we don't allow any in index
+ * predicates.)
+ */
+ result = (List *) eval_const_expressions(NULL, (Node *) result);
+
+ result = (List *) canonicalize_qual((Expr *) result, false);
+
+ /* Also convert to implicit-AND format */
+ result = make_ands_implicit((Expr *) result);
+
+ /* May as well fix opfuncids too */
+ fix_opfuncids((Node *) result);
+
+ /* Now save a copy of the completed tree in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(relation->rd_indexcxt);
+ relation->rd_indpred = copyObject(result);
+ MemoryContextSwitchTo(oldcxt);
+
+ return result;
+}
+
+/*
+ * RelationGetIndexAttrBitmap -- get a bitmap of index attribute numbers
+ *
+ * The result has a bit set for each attribute used anywhere in the index
+ * definitions of all the indexes on this relation. (This includes not only
+ * simple index keys, but attributes used in expressions and partial-index
+ * predicates.)
+ *
+ * Depending on attrKind, a bitmap covering the attnums for all index columns,
+ * for all potential foreign key columns, or for all columns in the configured
+ * replica identity index is returned.
+ *
+ * Attribute numbers are offset by FirstLowInvalidHeapAttributeNumber so that
+ * we can include system attributes (e.g., OID) in the bitmap representation.
+ *
+ * Caller had better hold at least RowExclusiveLock on the target relation
+ * to ensure it is safe (deadlock-free) for us to take locks on the relation's
+ * indexes. Note that since the introduction of CREATE INDEX CONCURRENTLY,
+ * that lock level doesn't guarantee a stable set of indexes, so we have to
+ * be prepared to retry here in case of a change in the set of indexes.
+ *
+ * The returned result is palloc'd in the caller's memory context and should
+ * be bms_free'd when not needed anymore.
+ */
+Bitmapset *
+RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
+{
+ Bitmapset *indexattrs; /* indexed columns */
+ Bitmapset *uindexattrs; /* columns in unique indexes */
+ Bitmapset *pkindexattrs; /* columns in the primary index */
+ Bitmapset *idindexattrs; /* columns in the replica identity */
+ List *indexoidlist;
+ List *newindexoidlist;
+ Oid relpkindex;
+ Oid relreplindex;
+ ListCell *l;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the result. */
+ if (relation->rd_indexattr != NULL)
+ {
+ switch (attrKind)
+ {
+ case INDEX_ATTR_BITMAP_ALL:
+ return bms_copy(relation->rd_indexattr);
+ case INDEX_ATTR_BITMAP_KEY:
+ return bms_copy(relation->rd_keyattr);
+ case INDEX_ATTR_BITMAP_PRIMARY_KEY:
+ return bms_copy(relation->rd_pkattr);
+ case INDEX_ATTR_BITMAP_IDENTITY_KEY:
+ return bms_copy(relation->rd_idattr);
+ default:
+ elog(ERROR, "unknown attrKind %u", attrKind);
+ }
+ }
+
+ /* Fast path if definitely no indexes */
+ if (!RelationGetForm(relation)->relhasindex)
+ return NULL;
+
+ /*
+ * Get cached list of index OIDs. If we have to start over, we do so here.
+ */
+restart:
+ indexoidlist = RelationGetIndexList(relation);
+
+ /* Fall out if no indexes (but relhasindex was set) */
+ if (indexoidlist == NIL)
+ return NULL;
+
+ /*
+ * Copy the rd_pkindex and rd_replidindex values computed by
+ * RelationGetIndexList before proceeding. This is needed because a
+ * relcache flush could occur inside index_open below, resetting the
+ * fields managed by RelationGetIndexList. We need to do the work with
+ * stable values of these fields.
+ */
+ relpkindex = relation->rd_pkindex;
+ relreplindex = relation->rd_replidindex;
+
+ /*
+ * For each index, add referenced attributes to indexattrs.
+ *
+ * Note: we consider all indexes returned by RelationGetIndexList, even if
+ * they are not indisready or indisvalid. This is important because an
+ * index for which CREATE INDEX CONCURRENTLY has just started must be
+ * included in HOT-safety decisions (see README.HOT). If a DROP INDEX
+ * CONCURRENTLY is far enough along that we should ignore the index, it
+ * won't be returned at all by RelationGetIndexList.
+ */
+ indexattrs = NULL;
+ uindexattrs = NULL;
+ pkindexattrs = NULL;
+ idindexattrs = NULL;
+ foreach(l, indexoidlist)
+ {
+ Oid indexOid = lfirst_oid(l);
+ Relation indexDesc;
+ Datum datum;
+ bool isnull;
+ Node *indexExpressions;
+ Node *indexPredicate;
+ int i;
+ bool isKey; /* candidate key */
+ bool isPK; /* primary key */
+ bool isIDKey; /* replica identity index */
+
+ indexDesc = index_open(indexOid, AccessShareLock);
+
+ /*
+ * Extract index expressions and index predicate. Note: Don't use
+ * RelationGetIndexExpressions()/RelationGetIndexPredicate(), because
+ * those might run constant expressions evaluation, which needs a
+ * snapshot, which we might not have here. (Also, it's probably more
+ * sound to collect the bitmaps before any transformations that might
+ * eliminate columns, but the practical impact of this is limited.)
+ */
+
+ datum = heap_getattr(indexDesc->rd_indextuple, Anum_pg_index_indexprs,
+ GetPgIndexDescriptor(), &isnull);
+ if (!isnull)
+ indexExpressions = stringToNode(TextDatumGetCString(datum));
+ else
+ indexExpressions = NULL;
+
+ datum = heap_getattr(indexDesc->rd_indextuple, Anum_pg_index_indpred,
+ GetPgIndexDescriptor(), &isnull);
+ if (!isnull)
+ indexPredicate = stringToNode(TextDatumGetCString(datum));
+ else
+ indexPredicate = NULL;
+
+ /* Can this index be referenced by a foreign key? */
+ isKey = indexDesc->rd_index->indisunique &&
+ indexExpressions == NULL &&
+ indexPredicate == NULL;
+
+ /* Is this a primary key? */
+ isPK = (indexOid == relpkindex);
+
+ /* Is this index the configured (or default) replica identity? */
+ isIDKey = (indexOid == relreplindex);
+
+ /* Collect simple attribute references */
+ for (i = 0; i < indexDesc->rd_index->indnatts; i++)
+ {
+ int attrnum = indexDesc->rd_index->indkey.values[i];
+
+ /*
+ * Since we have covering indexes with non-key columns, we must
+ * handle them accurately here. non-key columns must be added into
+ * indexattrs, since they are in index, and HOT-update shouldn't
+ * miss them. Obviously, non-key columns couldn't be referenced by
+ * foreign key or identity key. Hence we do not include them into
+ * uindexattrs, pkindexattrs and idindexattrs bitmaps.
+ */
+ if (attrnum != 0)
+ {
+ indexattrs = bms_add_member(indexattrs,
+ attrnum - FirstLowInvalidHeapAttributeNumber);
+
+ if (isKey && i < indexDesc->rd_index->indnkeyatts)
+ uindexattrs = bms_add_member(uindexattrs,
+ attrnum - FirstLowInvalidHeapAttributeNumber);
+
+ if (isPK && i < indexDesc->rd_index->indnkeyatts)
+ pkindexattrs = bms_add_member(pkindexattrs,
+ attrnum - FirstLowInvalidHeapAttributeNumber);
+
+ if (isIDKey && i < indexDesc->rd_index->indnkeyatts)
+ idindexattrs = bms_add_member(idindexattrs,
+ attrnum - FirstLowInvalidHeapAttributeNumber);
+ }
+ }
+
+ /* Collect all attributes used in expressions, too */
+ pull_varattnos(indexExpressions, 1, &indexattrs);
+
+ /* Collect all attributes in the index predicate, too */
+ pull_varattnos(indexPredicate, 1, &indexattrs);
+
+ index_close(indexDesc, AccessShareLock);
+ }
+
+ /*
+ * During one of the index_opens in the above loop, we might have received
+ * a relcache flush event on this relcache entry, which might have been
+ * signaling a change in the rel's index list. If so, we'd better start
+ * over to ensure we deliver up-to-date attribute bitmaps.
+ */
+ newindexoidlist = RelationGetIndexList(relation);
+ if (equal(indexoidlist, newindexoidlist) &&
+ relpkindex == relation->rd_pkindex &&
+ relreplindex == relation->rd_replidindex)
+ {
+ /* Still the same index set, so proceed */
+ list_free(newindexoidlist);
+ list_free(indexoidlist);
+ }
+ else
+ {
+ /* Gotta do it over ... might as well not leak memory */
+ list_free(newindexoidlist);
+ list_free(indexoidlist);
+ bms_free(uindexattrs);
+ bms_free(pkindexattrs);
+ bms_free(idindexattrs);
+ bms_free(indexattrs);
+
+ goto restart;
+ }
+
+ /* Don't leak the old values of these bitmaps, if any */
+ bms_free(relation->rd_indexattr);
+ relation->rd_indexattr = NULL;
+ bms_free(relation->rd_keyattr);
+ relation->rd_keyattr = NULL;
+ bms_free(relation->rd_pkattr);
+ relation->rd_pkattr = NULL;
+ bms_free(relation->rd_idattr);
+ relation->rd_idattr = NULL;
+
+ /*
+ * Now save copies of the bitmaps in the relcache entry. We intentionally
+ * set rd_indexattr last, because that's the one that signals validity of
+ * the values; if we run out of memory before making that copy, we won't
+ * leave the relcache entry looking like the other ones are valid but
+ * empty.
+ */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ relation->rd_keyattr = bms_copy(uindexattrs);
+ relation->rd_pkattr = bms_copy(pkindexattrs);
+ relation->rd_idattr = bms_copy(idindexattrs);
+ relation->rd_indexattr = bms_copy(indexattrs);
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We return our original working copy for caller to play with */
+ switch (attrKind)
+ {
+ case INDEX_ATTR_BITMAP_ALL:
+ return indexattrs;
+ case INDEX_ATTR_BITMAP_KEY:
+ return uindexattrs;
+ case INDEX_ATTR_BITMAP_PRIMARY_KEY:
+ return pkindexattrs;
+ case INDEX_ATTR_BITMAP_IDENTITY_KEY:
+ return idindexattrs;
+ default:
+ elog(ERROR, "unknown attrKind %u", attrKind);
+ return NULL;
+ }
+}
+
+/*
+ * RelationGetIdentityKeyBitmap -- get a bitmap of replica identity attribute
+ * numbers
+ *
+ * A bitmap of index attribute numbers for the configured replica identity
+ * index is returned.
+ *
+ * See also comments of RelationGetIndexAttrBitmap().
+ *
+ * This is a special purpose function used during logical replication. Here,
+ * unlike RelationGetIndexAttrBitmap(), we don't acquire a lock on the required
+ * index as we build the cache entry using a historic snapshot and all the
+ * later changes are absorbed while decoding WAL. Due to this reason, we don't
+ * need to retry here in case of a change in the set of indexes.
+ */
+Bitmapset *
+RelationGetIdentityKeyBitmap(Relation relation)
+{
+ Bitmapset *idindexattrs = NULL; /* columns in the replica identity */
+ Relation indexDesc;
+ int i;
+ Oid replidindex;
+ MemoryContext oldcxt;
+
+ /* Quick exit if we already computed the result */
+ if (relation->rd_idattr != NULL)
+ return bms_copy(relation->rd_idattr);
+
+ /* Fast path if definitely no indexes */
+ if (!RelationGetForm(relation)->relhasindex)
+ return NULL;
+
+ /* Historic snapshot must be set. */
+ Assert(HistoricSnapshotActive());
+
+ replidindex = RelationGetReplicaIndex(relation);
+
+ /* Fall out if there is no replica identity index */
+ if (!OidIsValid(replidindex))
+ return NULL;
+
+ /* Look up the description for the replica identity index */
+ indexDesc = RelationIdGetRelation(replidindex);
+
+ if (!RelationIsValid(indexDesc))
+ elog(ERROR, "could not open relation with OID %u",
+ relation->rd_replidindex);
+
+ /* Add referenced attributes to idindexattrs */
+ for (i = 0; i < indexDesc->rd_index->indnatts; i++)
+ {
+ int attrnum = indexDesc->rd_index->indkey.values[i];
+
+ /*
+ * We don't include non-key columns into idindexattrs bitmaps. See
+ * RelationGetIndexAttrBitmap.
+ */
+ if (attrnum != 0)
+ {
+ if (i < indexDesc->rd_index->indnkeyatts)
+ idindexattrs = bms_add_member(idindexattrs,
+ attrnum - FirstLowInvalidHeapAttributeNumber);
+ }
+ }
+
+ RelationClose(indexDesc);
+
+ /* Don't leak the old values of these bitmaps, if any */
+ bms_free(relation->rd_idattr);
+ relation->rd_idattr = NULL;
+
+ /* Now save copy of the bitmap in the relcache entry */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ relation->rd_idattr = bms_copy(idindexattrs);
+ MemoryContextSwitchTo(oldcxt);
+
+ /* We return our original working copy for caller to play with */
+ return idindexattrs;
+}
+
+/*
+ * RelationGetExclusionInfo -- get info about index's exclusion constraint
+ *
+ * This should be called only for an index that is known to have an
+ * associated exclusion constraint. It returns arrays (palloc'd in caller's
+ * context) of the exclusion operator OIDs, their underlying functions'
+ * OIDs, and their strategy numbers in the index's opclasses. We cache
+ * all this information since it requires a fair amount of work to get.
+ */
+void
+RelationGetExclusionInfo(Relation indexRelation,
+ Oid **operators,
+ Oid **procs,
+ uint16 **strategies)
+{
+ int indnkeyatts;
+ Oid *ops;
+ Oid *funcs;
+ uint16 *strats;
+ Relation conrel;
+ SysScanDesc conscan;
+ ScanKeyData skey[1];
+ HeapTuple htup;
+ bool found;
+ MemoryContext oldcxt;
+ int i;
+
+ indnkeyatts = IndexRelationGetNumberOfKeyAttributes(indexRelation);
+
+ /* Allocate result space in caller context */
+ *operators = ops = (Oid *) palloc(sizeof(Oid) * indnkeyatts);
+ *procs = funcs = (Oid *) palloc(sizeof(Oid) * indnkeyatts);
+ *strategies = strats = (uint16 *) palloc(sizeof(uint16) * indnkeyatts);
+
+ /* Quick exit if we have the data cached already */
+ if (indexRelation->rd_exclstrats != NULL)
+ {
+ memcpy(ops, indexRelation->rd_exclops, sizeof(Oid) * indnkeyatts);
+ memcpy(funcs, indexRelation->rd_exclprocs, sizeof(Oid) * indnkeyatts);
+ memcpy(strats, indexRelation->rd_exclstrats, sizeof(uint16) * indnkeyatts);
+ return;
+ }
+
+ /*
+ * Search pg_constraint for the constraint associated with the index. To
+ * make this not too painfully slow, we use the index on conrelid; that
+ * will hold the parent relation's OID not the index's own OID.
+ *
+ * Note: if we wanted to rely on the constraint name matching the index's
+ * name, we could just do a direct lookup using pg_constraint's unique
+ * index. For the moment it doesn't seem worth requiring that.
+ */
+ ScanKeyInit(&skey[0],
+ Anum_pg_constraint_conrelid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(indexRelation->rd_index->indrelid));
+
+ conrel = table_open(ConstraintRelationId, AccessShareLock);
+ conscan = systable_beginscan(conrel, ConstraintRelidTypidNameIndexId, true,
+ NULL, 1, skey);
+ found = false;
+
+ while (HeapTupleIsValid(htup = systable_getnext(conscan)))
+ {
+ Form_pg_constraint conform = (Form_pg_constraint) GETSTRUCT(htup);
+ Datum val;
+ bool isnull;
+ ArrayType *arr;
+ int nelem;
+
+ /* We want the exclusion constraint owning the index */
+ if (conform->contype != CONSTRAINT_EXCLUSION ||
+ conform->conindid != RelationGetRelid(indexRelation))
+ continue;
+
+ /* There should be only one */
+ if (found)
+ elog(ERROR, "unexpected exclusion constraint record found for rel %s",
+ RelationGetRelationName(indexRelation));
+ found = true;
+
+ /* Extract the operator OIDS from conexclop */
+ val = fastgetattr(htup,
+ Anum_pg_constraint_conexclop,
+ conrel->rd_att, &isnull);
+ if (isnull)
+ elog(ERROR, "null conexclop for rel %s",
+ RelationGetRelationName(indexRelation));
+
+ arr = DatumGetArrayTypeP(val); /* ensure not toasted */
+ nelem = ARR_DIMS(arr)[0];
+ if (ARR_NDIM(arr) != 1 ||
+ nelem != indnkeyatts ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != OIDOID)
+ elog(ERROR, "conexclop is not a 1-D Oid array");
+
+ memcpy(ops, ARR_DATA_PTR(arr), sizeof(Oid) * indnkeyatts);
+ }
+
+ systable_endscan(conscan);
+ table_close(conrel, AccessShareLock);
+
+ if (!found)
+ elog(ERROR, "exclusion constraint record missing for rel %s",
+ RelationGetRelationName(indexRelation));
+
+ /* We need the func OIDs and strategy numbers too */
+ for (i = 0; i < indnkeyatts; i++)
+ {
+ funcs[i] = get_opcode(ops[i]);
+ strats[i] = get_op_opfamily_strategy(ops[i],
+ indexRelation->rd_opfamily[i]);
+ /* shouldn't fail, since it was checked at index creation */
+ if (strats[i] == InvalidStrategy)
+ elog(ERROR, "could not find strategy for operator %u in family %u",
+ ops[i], indexRelation->rd_opfamily[i]);
+ }
+
+ /* Save a copy of the results in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(indexRelation->rd_indexcxt);
+ indexRelation->rd_exclops = (Oid *) palloc(sizeof(Oid) * indnkeyatts);
+ indexRelation->rd_exclprocs = (Oid *) palloc(sizeof(Oid) * indnkeyatts);
+ indexRelation->rd_exclstrats = (uint16 *) palloc(sizeof(uint16) * indnkeyatts);
+ memcpy(indexRelation->rd_exclops, ops, sizeof(Oid) * indnkeyatts);
+ memcpy(indexRelation->rd_exclprocs, funcs, sizeof(Oid) * indnkeyatts);
+ memcpy(indexRelation->rd_exclstrats, strats, sizeof(uint16) * indnkeyatts);
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * Get the publication information for the given relation.
+ *
+ * Traverse all the publications which the relation is in to get the
+ * publication actions and validate the row filter expressions for such
+ * publications if any. We consider the row filter expression as invalid if it
+ * references any column which is not part of REPLICA IDENTITY.
+ *
+ * To avoid fetching the publication information repeatedly, we cache the
+ * publication actions and row filter validation information.
+ */
+void
+RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc)
+{
+ List *puboids;
+ ListCell *lc;
+ MemoryContext oldcxt;
+ Oid schemaid;
+ List *ancestors = NIL;
+ Oid relid = RelationGetRelid(relation);
+
+ /*
+ * If not publishable, it publishes no actions. (pgoutput_change() will
+ * ignore it.)
+ */
+ if (!is_publishable_relation(relation))
+ {
+ memset(pubdesc, 0, sizeof(PublicationDesc));
+ pubdesc->rf_valid_for_update = true;
+ pubdesc->rf_valid_for_delete = true;
+ pubdesc->cols_valid_for_update = true;
+ pubdesc->cols_valid_for_delete = true;
+ return;
+ }
+
+ if (relation->rd_pubdesc)
+ {
+ memcpy(pubdesc, relation->rd_pubdesc, sizeof(PublicationDesc));
+ return;
+ }
+
+ memset(pubdesc, 0, sizeof(PublicationDesc));
+ pubdesc->rf_valid_for_update = true;
+ pubdesc->rf_valid_for_delete = true;
+ pubdesc->cols_valid_for_update = true;
+ pubdesc->cols_valid_for_delete = true;
+
+ /* Fetch the publication membership info. */
+ puboids = GetRelationPublications(relid);
+ schemaid = RelationGetNamespace(relation);
+ puboids = list_concat_unique_oid(puboids, GetSchemaPublications(schemaid));
+
+ if (relation->rd_rel->relispartition)
+ {
+ /* Add publications that the ancestors are in too. */
+ ancestors = get_partition_ancestors(relid);
+
+ foreach(lc, ancestors)
+ {
+ Oid ancestor = lfirst_oid(lc);
+
+ puboids = list_concat_unique_oid(puboids,
+ GetRelationPublications(ancestor));
+ schemaid = get_rel_namespace(ancestor);
+ puboids = list_concat_unique_oid(puboids,
+ GetSchemaPublications(schemaid));
+ }
+ }
+ puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
+
+ foreach(lc, puboids)
+ {
+ Oid pubid = lfirst_oid(lc);
+ HeapTuple tup;
+ Form_pg_publication pubform;
+
+ tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid));
+
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for publication %u", pubid);
+
+ pubform = (Form_pg_publication) GETSTRUCT(tup);
+
+ pubdesc->pubactions.pubinsert |= pubform->pubinsert;
+ pubdesc->pubactions.pubupdate |= pubform->pubupdate;
+ pubdesc->pubactions.pubdelete |= pubform->pubdelete;
+ pubdesc->pubactions.pubtruncate |= pubform->pubtruncate;
+
+ /*
+ * Check if all columns referenced in the filter expression are part
+ * of the REPLICA IDENTITY index or not.
+ *
+ * If the publication is FOR ALL TABLES then it means the table has no
+ * row filters and we can skip the validation.
+ */
+ if (!pubform->puballtables &&
+ (pubform->pubupdate || pubform->pubdelete) &&
+ pub_rf_contains_invalid_column(pubid, relation, ancestors,
+ pubform->pubviaroot))
+ {
+ if (pubform->pubupdate)
+ pubdesc->rf_valid_for_update = false;
+ if (pubform->pubdelete)
+ pubdesc->rf_valid_for_delete = false;
+ }
+
+ /*
+ * Check if all columns are part of the REPLICA IDENTITY index or not.
+ *
+ * If the publication is FOR ALL TABLES then it means the table has no
+ * column list and we can skip the validation.
+ */
+ if (!pubform->puballtables &&
+ (pubform->pubupdate || pubform->pubdelete) &&
+ pub_collist_contains_invalid_column(pubid, relation, ancestors,
+ pubform->pubviaroot))
+ {
+ if (pubform->pubupdate)
+ pubdesc->cols_valid_for_update = false;
+ if (pubform->pubdelete)
+ pubdesc->cols_valid_for_delete = false;
+ }
+
+ ReleaseSysCache(tup);
+
+ /*
+ * If we know everything is replicated and the row filter is invalid
+ * for update and delete, there is no point to check for other
+ * publications.
+ */
+ if (pubdesc->pubactions.pubinsert && pubdesc->pubactions.pubupdate &&
+ pubdesc->pubactions.pubdelete && pubdesc->pubactions.pubtruncate &&
+ !pubdesc->rf_valid_for_update && !pubdesc->rf_valid_for_delete)
+ break;
+
+ /*
+ * If we know everything is replicated and the column list is invalid
+ * for update and delete, there is no point to check for other
+ * publications.
+ */
+ if (pubdesc->pubactions.pubinsert && pubdesc->pubactions.pubupdate &&
+ pubdesc->pubactions.pubdelete && pubdesc->pubactions.pubtruncate &&
+ !pubdesc->cols_valid_for_update && !pubdesc->cols_valid_for_delete)
+ break;
+ }
+
+ if (relation->rd_pubdesc)
+ {
+ pfree(relation->rd_pubdesc);
+ relation->rd_pubdesc = NULL;
+ }
+
+ /* Now save copy of the descriptor in the relcache entry. */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ relation->rd_pubdesc = palloc(sizeof(PublicationDesc));
+ memcpy(relation->rd_pubdesc, pubdesc, sizeof(PublicationDesc));
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * RelationGetIndexRawAttOptions -- get AM/opclass-specific options for the index
+ */
+Datum *
+RelationGetIndexRawAttOptions(Relation indexrel)
+{
+ Oid indexrelid = RelationGetRelid(indexrel);
+ int16 natts = RelationGetNumberOfAttributes(indexrel);
+ Datum *options = NULL;
+ int16 attnum;
+
+ for (attnum = 1; attnum <= natts; attnum++)
+ {
+ if (indexrel->rd_indam->amoptsprocnum == 0)
+ continue;
+
+ if (!OidIsValid(index_getprocid(indexrel, attnum,
+ indexrel->rd_indam->amoptsprocnum)))
+ continue;
+
+ if (!options)
+ options = palloc0(sizeof(Datum) * natts);
+
+ options[attnum - 1] = get_attoptions(indexrelid, attnum);
+ }
+
+ return options;
+}
+
+static bytea **
+CopyIndexAttOptions(bytea **srcopts, int natts)
+{
+ bytea **opts = palloc(sizeof(*opts) * natts);
+
+ for (int i = 0; i < natts; i++)
+ {
+ bytea *opt = srcopts[i];
+
+ opts[i] = !opt ? NULL : (bytea *)
+ DatumGetPointer(datumCopy(PointerGetDatum(opt), false, -1));
+ }
+
+ return opts;
+}
+
+/*
+ * RelationGetIndexAttOptions
+ * get AM/opclass-specific options for an index parsed into a binary form
+ */
+bytea **
+RelationGetIndexAttOptions(Relation relation, bool copy)
+{
+ MemoryContext oldcxt;
+ bytea **opts = relation->rd_opcoptions;
+ Oid relid = RelationGetRelid(relation);
+ int natts = RelationGetNumberOfAttributes(relation); /* XXX
+ * IndexRelationGetNumberOfKeyAttributes */
+ int i;
+
+ /* Try to copy cached options. */
+ if (opts)
+ return copy ? CopyIndexAttOptions(opts, natts) : opts;
+
+ /* Get and parse opclass options. */
+ opts = palloc0(sizeof(*opts) * natts);
+
+ for (i = 0; i < natts; i++)
+ {
+ if (criticalRelcachesBuilt && relid != AttributeRelidNumIndexId)
+ {
+ Datum attoptions = get_attoptions(relid, i + 1);
+
+ opts[i] = index_opclass_options(relation, i + 1, attoptions, false);
+
+ if (attoptions != (Datum) 0)
+ pfree(DatumGetPointer(attoptions));
+ }
+ }
+
+ /* Copy parsed options to the cache. */
+ oldcxt = MemoryContextSwitchTo(relation->rd_indexcxt);
+ relation->rd_opcoptions = CopyIndexAttOptions(opts, natts);
+ MemoryContextSwitchTo(oldcxt);
+
+ if (copy)
+ return opts;
+
+ for (i = 0; i < natts; i++)
+ {
+ if (opts[i])
+ pfree(opts[i]);
+ }
+
+ pfree(opts);
+
+ return relation->rd_opcoptions;
+}
+
+/*
+ * Routines to support ereport() reports of relation-related errors
+ *
+ * These could have been put into elog.c, but it seems like a module layering
+ * violation to have elog.c calling relcache or syscache stuff --- and we
+ * definitely don't want elog.h including rel.h. So we put them here.
+ */
+
+/*
+ * errtable --- stores schema_name and table_name of a table
+ * within the current errordata.
+ */
+int
+errtable(Relation rel)
+{
+ err_generic_string(PG_DIAG_SCHEMA_NAME,
+ get_namespace_name(RelationGetNamespace(rel)));
+ err_generic_string(PG_DIAG_TABLE_NAME, RelationGetRelationName(rel));
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errtablecol --- stores schema_name, table_name and column_name
+ * of a table column within the current errordata.
+ *
+ * The column is specified by attribute number --- for most callers, this is
+ * easier and less error-prone than getting the column name for themselves.
+ */
+int
+errtablecol(Relation rel, int attnum)
+{
+ TupleDesc reldesc = RelationGetDescr(rel);
+ const char *colname;
+
+ /* Use reldesc if it's a user attribute, else consult the catalogs */
+ if (attnum > 0 && attnum <= reldesc->natts)
+ colname = NameStr(TupleDescAttr(reldesc, attnum - 1)->attname);
+ else
+ colname = get_attname(RelationGetRelid(rel), attnum, false);
+
+ return errtablecolname(rel, colname);
+}
+
+/*
+ * errtablecolname --- stores schema_name, table_name and column_name
+ * of a table column within the current errordata, where the column name is
+ * given directly rather than extracted from the relation's catalog data.
+ *
+ * Don't use this directly unless errtablecol() is inconvenient for some
+ * reason. This might possibly be needed during intermediate states in ALTER
+ * TABLE, for instance.
+ */
+int
+errtablecolname(Relation rel, const char *colname)
+{
+ errtable(rel);
+ err_generic_string(PG_DIAG_COLUMN_NAME, colname);
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errtableconstraint --- stores schema_name, table_name and constraint_name
+ * of a table-related constraint within the current errordata.
+ */
+int
+errtableconstraint(Relation rel, const char *conname)
+{
+ errtable(rel);
+ err_generic_string(PG_DIAG_CONSTRAINT_NAME, conname);
+
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * load_relcache_init_file, write_relcache_init_file
+ *
+ * In late 1992, we started regularly having databases with more than
+ * a thousand classes in them. With this number of classes, it became
+ * critical to do indexed lookups on the system catalogs.
+ *
+ * Bootstrapping these lookups is very hard. We want to be able to
+ * use an index on pg_attribute, for example, but in order to do so,
+ * we must have read pg_attribute for the attributes in the index,
+ * which implies that we need to use the index.
+ *
+ * In order to get around the problem, we do the following:
+ *
+ * + When the database system is initialized (at initdb time), we
+ * don't use indexes. We do sequential scans.
+ *
+ * + When the backend is started up in normal mode, we load an image
+ * of the appropriate relation descriptors, in internal format,
+ * from an initialization file in the data/base/... directory.
+ *
+ * + If the initialization file isn't there, then we create the
+ * relation descriptors using sequential scans and write 'em to
+ * the initialization file for use by subsequent backends.
+ *
+ * As of Postgres 9.0, there is one local initialization file in each
+ * database, plus one shared initialization file for shared catalogs.
+ *
+ * We could dispense with the initialization files and just build the
+ * critical reldescs the hard way on every backend startup, but that
+ * slows down backend startup noticeably.
+ *
+ * We can in fact go further, and save more relcache entries than
+ * just the ones that are absolutely critical; this allows us to speed
+ * up backend startup by not having to build such entries the hard way.
+ * Presently, all the catalog and index entries that are referred to
+ * by catcaches are stored in the initialization files.
+ *
+ * The same mechanism that detects when catcache and relcache entries
+ * need to be invalidated (due to catalog updates) also arranges to
+ * unlink the initialization files when the contents may be out of date.
+ * The files will then be rebuilt during the next backend startup.
+ */
+
+/*
+ * load_relcache_init_file -- attempt to load cache from the shared
+ * or local cache init file
+ *
+ * If successful, return true and set criticalRelcachesBuilt or
+ * criticalSharedRelcachesBuilt to true.
+ * If not successful, return false.
+ *
+ * NOTE: we assume we are already switched into CacheMemoryContext.
+ */
+static bool
+load_relcache_init_file(bool shared)
+{
+ FILE *fp;
+ char initfilename[MAXPGPATH];
+ Relation *rels;
+ int relno,
+ num_rels,
+ max_rels,
+ nailed_rels,
+ nailed_indexes,
+ magic;
+ int i;
+
+ if (shared)
+ snprintf(initfilename, sizeof(initfilename), "global/%s",
+ RELCACHE_INIT_FILENAME);
+ else
+ snprintf(initfilename, sizeof(initfilename), "%s/%s",
+ DatabasePath, RELCACHE_INIT_FILENAME);
+
+ fp = AllocateFile(initfilename, PG_BINARY_R);
+ if (fp == NULL)
+ return false;
+
+ /*
+ * Read the index relcache entries from the file. Note we will not enter
+ * any of them into the cache if the read fails partway through; this
+ * helps to guard against broken init files.
+ */
+ max_rels = 100;
+ rels = (Relation *) palloc(max_rels * sizeof(Relation));
+ num_rels = 0;
+ nailed_rels = nailed_indexes = 0;
+
+ /* check for correct magic number (compatible version) */
+ if (fread(&magic, 1, sizeof(magic), fp) != sizeof(magic))
+ goto read_failed;
+ if (magic != RELCACHE_INIT_FILEMAGIC)
+ goto read_failed;
+
+ for (relno = 0;; relno++)
+ {
+ Size len;
+ size_t nread;
+ Relation rel;
+ Form_pg_class relform;
+ bool has_not_null;
+
+ /* first read the relation descriptor length */
+ nread = fread(&len, 1, sizeof(len), fp);
+ if (nread != sizeof(len))
+ {
+ if (nread == 0)
+ break; /* end of file */
+ goto read_failed;
+ }
+
+ /* safety check for incompatible relcache layout */
+ if (len != sizeof(RelationData))
+ goto read_failed;
+
+ /* allocate another relcache header */
+ if (num_rels >= max_rels)
+ {
+ max_rels *= 2;
+ rels = (Relation *) repalloc(rels, max_rels * sizeof(Relation));
+ }
+
+ rel = rels[num_rels++] = (Relation) palloc(len);
+
+ /* then, read the Relation structure */
+ if (fread(rel, 1, len, fp) != len)
+ goto read_failed;
+
+ /* next read the relation tuple form */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ relform = (Form_pg_class) palloc(len);
+ if (fread(relform, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_rel = relform;
+
+ /* initialize attribute tuple forms */
+ rel->rd_att = CreateTemplateTupleDesc(relform->relnatts);
+ rel->rd_att->tdrefcount = 1; /* mark as refcounted */
+
+ rel->rd_att->tdtypeid = relform->reltype ? relform->reltype : RECORDOID;
+ rel->rd_att->tdtypmod = -1; /* just to be sure */
+
+ /* next read all the attribute tuple form data entries */
+ has_not_null = false;
+ for (i = 0; i < relform->relnatts; i++)
+ {
+ Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i);
+
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+ if (len != ATTRIBUTE_FIXED_PART_SIZE)
+ goto read_failed;
+ if (fread(attr, 1, len, fp) != len)
+ goto read_failed;
+
+ has_not_null |= attr->attnotnull;
+ }
+
+ /* next read the access method specific field */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+ if (len > 0)
+ {
+ rel->rd_options = palloc(len);
+ if (fread(rel->rd_options, 1, len, fp) != len)
+ goto read_failed;
+ if (len != VARSIZE(rel->rd_options))
+ goto read_failed; /* sanity check */
+ }
+ else
+ {
+ rel->rd_options = NULL;
+ }
+
+ /* mark not-null status */
+ if (has_not_null)
+ {
+ TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr));
+
+ constr->has_not_null = true;
+ rel->rd_att->constr = constr;
+ }
+
+ /*
+ * If it's an index, there's more to do. Note we explicitly ignore
+ * partitioned indexes here.
+ */
+ if (rel->rd_rel->relkind == RELKIND_INDEX)
+ {
+ MemoryContext indexcxt;
+ Oid *opfamily;
+ Oid *opcintype;
+ RegProcedure *support;
+ int nsupport;
+ int16 *indoption;
+ Oid *indcollation;
+
+ /* Count nailed indexes to ensure we have 'em all */
+ if (rel->rd_isnailed)
+ nailed_indexes++;
+
+ /* next, read the pg_index tuple */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ rel->rd_indextuple = (HeapTuple) palloc(len);
+ if (fread(rel->rd_indextuple, 1, len, fp) != len)
+ goto read_failed;
+
+ /* Fix up internal pointers in the tuple -- see heap_copytuple */
+ rel->rd_indextuple->t_data = (HeapTupleHeader) ((char *) rel->rd_indextuple + HEAPTUPLESIZE);
+ rel->rd_index = (Form_pg_index) GETSTRUCT(rel->rd_indextuple);
+
+ /*
+ * prepare index info context --- parameters should match
+ * RelationInitIndexAccessInfo
+ */
+ indexcxt = AllocSetContextCreate(CacheMemoryContext,
+ "index info",
+ ALLOCSET_SMALL_SIZES);
+ rel->rd_indexcxt = indexcxt;
+ MemoryContextCopyAndSetIdentifier(indexcxt,
+ RelationGetRelationName(rel));
+
+ /*
+ * Now we can fetch the index AM's API struct. (We can't store
+ * that in the init file, since it contains function pointers that
+ * might vary across server executions. Fortunately, it should be
+ * safe to call the amhandler even while bootstrapping indexes.)
+ */
+ InitIndexAmRoutine(rel);
+
+ /* next, read the vector of opfamily OIDs */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ opfamily = (Oid *) MemoryContextAlloc(indexcxt, len);
+ if (fread(opfamily, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_opfamily = opfamily;
+
+ /* next, read the vector of opcintype OIDs */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ opcintype = (Oid *) MemoryContextAlloc(indexcxt, len);
+ if (fread(opcintype, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_opcintype = opcintype;
+
+ /* next, read the vector of support procedure OIDs */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+ support = (RegProcedure *) MemoryContextAlloc(indexcxt, len);
+ if (fread(support, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_support = support;
+
+ /* next, read the vector of collation OIDs */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ indcollation = (Oid *) MemoryContextAlloc(indexcxt, len);
+ if (fread(indcollation, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_indcollation = indcollation;
+
+ /* finally, read the vector of indoption values */
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ indoption = (int16 *) MemoryContextAlloc(indexcxt, len);
+ if (fread(indoption, 1, len, fp) != len)
+ goto read_failed;
+
+ rel->rd_indoption = indoption;
+
+ /* finally, read the vector of opcoptions values */
+ rel->rd_opcoptions = (bytea **)
+ MemoryContextAllocZero(indexcxt, sizeof(*rel->rd_opcoptions) * relform->relnatts);
+
+ for (i = 0; i < relform->relnatts; i++)
+ {
+ if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
+ goto read_failed;
+
+ if (len > 0)
+ {
+ rel->rd_opcoptions[i] = (bytea *) MemoryContextAlloc(indexcxt, len);
+ if (fread(rel->rd_opcoptions[i], 1, len, fp) != len)
+ goto read_failed;
+ }
+ }
+
+ /* set up zeroed fmgr-info vector */
+ nsupport = relform->relnatts * rel->rd_indam->amsupport;
+ rel->rd_supportinfo = (FmgrInfo *)
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+ }
+ else
+ {
+ /* Count nailed rels to ensure we have 'em all */
+ if (rel->rd_isnailed)
+ nailed_rels++;
+
+ /* Load table AM data */
+ if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind) || rel->rd_rel->relkind == RELKIND_SEQUENCE)
+ RelationInitTableAccessMethod(rel);
+
+ Assert(rel->rd_index == NULL);
+ Assert(rel->rd_indextuple == NULL);
+ Assert(rel->rd_indexcxt == NULL);
+ Assert(rel->rd_indam == NULL);
+ Assert(rel->rd_opfamily == NULL);
+ Assert(rel->rd_opcintype == NULL);
+ Assert(rel->rd_support == NULL);
+ Assert(rel->rd_supportinfo == NULL);
+ Assert(rel->rd_indoption == NULL);
+ Assert(rel->rd_indcollation == NULL);
+ Assert(rel->rd_opcoptions == NULL);
+ }
+
+ /*
+ * Rules and triggers are not saved (mainly because the internal
+ * format is complex and subject to change). They must be rebuilt if
+ * needed by RelationCacheInitializePhase3. This is not expected to
+ * be a big performance hit since few system catalogs have such. Ditto
+ * for RLS policy data, partition info, index expressions, predicates,
+ * exclusion info, and FDW info.
+ */
+ rel->rd_rules = NULL;
+ rel->rd_rulescxt = NULL;
+ rel->trigdesc = NULL;
+ rel->rd_rsdesc = NULL;
+ rel->rd_partkey = NULL;
+ rel->rd_partkeycxt = NULL;
+ rel->rd_partdesc = NULL;
+ rel->rd_partdesc_nodetached = NULL;
+ rel->rd_partdesc_nodetached_xmin = InvalidTransactionId;
+ rel->rd_pdcxt = NULL;
+ rel->rd_pddcxt = NULL;
+ rel->rd_partcheck = NIL;
+ rel->rd_partcheckvalid = false;
+ rel->rd_partcheckcxt = NULL;
+ rel->rd_indexprs = NIL;
+ rel->rd_indpred = NIL;
+ rel->rd_exclops = NULL;
+ rel->rd_exclprocs = NULL;
+ rel->rd_exclstrats = NULL;
+ rel->rd_fdwroutine = NULL;
+
+ /*
+ * Reset transient-state fields in the relcache entry
+ */
+ rel->rd_smgr = NULL;
+ if (rel->rd_isnailed)
+ rel->rd_refcnt = 1;
+ else
+ rel->rd_refcnt = 0;
+ rel->rd_indexvalid = false;
+ rel->rd_indexlist = NIL;
+ rel->rd_pkindex = InvalidOid;
+ rel->rd_replidindex = InvalidOid;
+ rel->rd_indexattr = NULL;
+ rel->rd_keyattr = NULL;
+ rel->rd_pkattr = NULL;
+ rel->rd_idattr = NULL;
+ rel->rd_pubdesc = NULL;
+ rel->rd_statvalid = false;
+ rel->rd_statlist = NIL;
+ rel->rd_fkeyvalid = false;
+ rel->rd_fkeylist = NIL;
+ rel->rd_createSubid = InvalidSubTransactionId;
+ rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ rel->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+ rel->rd_droppedSubid = InvalidSubTransactionId;
+ rel->rd_amcache = NULL;
+ MemSet(&rel->pgstat_info, 0, sizeof(rel->pgstat_info));
+
+ /*
+ * Recompute lock and physical addressing info. This is needed in
+ * case the pg_internal.init file was copied from some other database
+ * by CREATE DATABASE.
+ */
+ RelationInitLockInfo(rel);
+ RelationInitPhysicalAddr(rel);
+ }
+
+ /*
+ * We reached the end of the init file without apparent problem. Did we
+ * get the right number of nailed items? This is a useful crosscheck in
+ * case the set of critical rels or indexes changes. However, that should
+ * not happen in a normally-running system, so let's bleat if it does.
+ *
+ * For the shared init file, we're called before client authentication is
+ * done, which means that elog(WARNING) will go only to the postmaster
+ * log, where it's easily missed. To ensure that developers notice bad
+ * values of NUM_CRITICAL_SHARED_RELS/NUM_CRITICAL_SHARED_INDEXES, we put
+ * an Assert(false) there.
+ */
+ if (shared)
+ {
+ if (nailed_rels != NUM_CRITICAL_SHARED_RELS ||
+ nailed_indexes != NUM_CRITICAL_SHARED_INDEXES)
+ {
+ elog(WARNING, "found %d nailed shared rels and %d nailed shared indexes in init file, but expected %d and %d respectively",
+ nailed_rels, nailed_indexes,
+ NUM_CRITICAL_SHARED_RELS, NUM_CRITICAL_SHARED_INDEXES);
+ /* Make sure we get developers' attention about this */
+ Assert(false);
+ /* In production builds, recover by bootstrapping the relcache */
+ goto read_failed;
+ }
+ }
+ else
+ {
+ if (nailed_rels != NUM_CRITICAL_LOCAL_RELS ||
+ nailed_indexes != NUM_CRITICAL_LOCAL_INDEXES)
+ {
+ elog(WARNING, "found %d nailed rels and %d nailed indexes in init file, but expected %d and %d respectively",
+ nailed_rels, nailed_indexes,
+ NUM_CRITICAL_LOCAL_RELS, NUM_CRITICAL_LOCAL_INDEXES);
+ /* We don't need an Assert() in this case */
+ goto read_failed;
+ }
+ }
+
+ /*
+ * OK, all appears well.
+ *
+ * Now insert all the new relcache entries into the cache.
+ */
+ for (relno = 0; relno < num_rels; relno++)
+ {
+ RelationCacheInsert(rels[relno], false);
+ }
+
+ pfree(rels);
+ FreeFile(fp);
+
+ if (shared)
+ criticalSharedRelcachesBuilt = true;
+ else
+ criticalRelcachesBuilt = true;
+ return true;
+
+ /*
+ * init file is broken, so do it the hard way. We don't bother trying to
+ * free the clutter we just allocated; it's not in the relcache so it
+ * won't hurt.
+ */
+read_failed:
+ pfree(rels);
+ FreeFile(fp);
+
+ return false;
+}
+
+/*
+ * Write out a new initialization file with the current contents
+ * of the relcache (either shared rels or local rels, as indicated).
+ */
+static void
+write_relcache_init_file(bool shared)
+{
+ FILE *fp;
+ char tempfilename[MAXPGPATH];
+ char finalfilename[MAXPGPATH];
+ int magic;
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt *idhentry;
+ int i;
+
+ /*
+ * If we have already received any relcache inval events, there's no
+ * chance of succeeding so we may as well skip the whole thing.
+ */
+ if (relcacheInvalsReceived != 0L)
+ return;
+
+ /*
+ * We must write a temporary file and rename it into place. Otherwise,
+ * another backend starting at about the same time might crash trying to
+ * read the partially-complete file.
+ */
+ if (shared)
+ {
+ snprintf(tempfilename, sizeof(tempfilename), "global/%s.%d",
+ RELCACHE_INIT_FILENAME, MyProcPid);
+ snprintf(finalfilename, sizeof(finalfilename), "global/%s",
+ RELCACHE_INIT_FILENAME);
+ }
+ else
+ {
+ snprintf(tempfilename, sizeof(tempfilename), "%s/%s.%d",
+ DatabasePath, RELCACHE_INIT_FILENAME, MyProcPid);
+ snprintf(finalfilename, sizeof(finalfilename), "%s/%s",
+ DatabasePath, RELCACHE_INIT_FILENAME);
+ }
+
+ unlink(tempfilename); /* in case it exists w/wrong permissions */
+
+ fp = AllocateFile(tempfilename, PG_BINARY_W);
+ if (fp == NULL)
+ {
+ /*
+ * We used to consider this a fatal error, but we might as well
+ * continue with backend startup ...
+ */
+ ereport(WARNING,
+ (errcode_for_file_access(),
+ errmsg("could not create relation-cache initialization file \"%s\": %m",
+ tempfilename),
+ errdetail("Continuing anyway, but there's something wrong.")));
+ return;
+ }
+
+ /*
+ * Write a magic number to serve as a file version identifier. We can
+ * change the magic number whenever the relcache layout changes.
+ */
+ magic = RELCACHE_INIT_FILEMAGIC;
+ if (fwrite(&magic, 1, sizeof(magic), fp) != sizeof(magic))
+ elog(FATAL, "could not write init file");
+
+ /*
+ * Write all the appropriate reldescs (in no particular order).
+ */
+ hash_seq_init(&status, RelationIdCache);
+
+ while ((idhentry = (RelIdCacheEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Relation rel = idhentry->reldesc;
+ Form_pg_class relform = rel->rd_rel;
+
+ /* ignore if not correct group */
+ if (relform->relisshared != shared)
+ continue;
+
+ /*
+ * Ignore if not supposed to be in init file. We can allow any shared
+ * relation that's been loaded so far to be in the shared init file,
+ * but unshared relations must be ones that should be in the local
+ * file per RelationIdIsInInitFile. (Note: if you want to change the
+ * criterion for rels to be kept in the init file, see also inval.c.
+ * The reason for filtering here is to be sure that we don't put
+ * anything into the local init file for which a relcache inval would
+ * not cause invalidation of that init file.)
+ */
+ if (!shared && !RelationIdIsInInitFile(RelationGetRelid(rel)))
+ {
+ /* Nailed rels had better get stored. */
+ Assert(!rel->rd_isnailed);
+ continue;
+ }
+
+ /* first write the relcache entry proper */
+ write_item(rel, sizeof(RelationData), fp);
+
+ /* next write the relation tuple form */
+ write_item(relform, CLASS_TUPLE_SIZE, fp);
+
+ /* next, do all the attribute tuple form data entries */
+ for (i = 0; i < relform->relnatts; i++)
+ {
+ write_item(TupleDescAttr(rel->rd_att, i),
+ ATTRIBUTE_FIXED_PART_SIZE, fp);
+ }
+
+ /* next, do the access method specific field */
+ write_item(rel->rd_options,
+ (rel->rd_options ? VARSIZE(rel->rd_options) : 0),
+ fp);
+
+ /*
+ * If it's an index, there's more to do. Note we explicitly ignore
+ * partitioned indexes here.
+ */
+ if (rel->rd_rel->relkind == RELKIND_INDEX)
+ {
+ /* write the pg_index tuple */
+ /* we assume this was created by heap_copytuple! */
+ write_item(rel->rd_indextuple,
+ HEAPTUPLESIZE + rel->rd_indextuple->t_len,
+ fp);
+
+ /* next, write the vector of opfamily OIDs */
+ write_item(rel->rd_opfamily,
+ relform->relnatts * sizeof(Oid),
+ fp);
+
+ /* next, write the vector of opcintype OIDs */
+ write_item(rel->rd_opcintype,
+ relform->relnatts * sizeof(Oid),
+ fp);
+
+ /* next, write the vector of support procedure OIDs */
+ write_item(rel->rd_support,
+ relform->relnatts * (rel->rd_indam->amsupport * sizeof(RegProcedure)),
+ fp);
+
+ /* next, write the vector of collation OIDs */
+ write_item(rel->rd_indcollation,
+ relform->relnatts * sizeof(Oid),
+ fp);
+
+ /* finally, write the vector of indoption values */
+ write_item(rel->rd_indoption,
+ relform->relnatts * sizeof(int16),
+ fp);
+
+ Assert(rel->rd_opcoptions);
+
+ /* finally, write the vector of opcoptions values */
+ for (i = 0; i < relform->relnatts; i++)
+ {
+ bytea *opt = rel->rd_opcoptions[i];
+
+ write_item(opt, opt ? VARSIZE(opt) : 0, fp);
+ }
+ }
+ }
+
+ if (FreeFile(fp))
+ elog(FATAL, "could not write init file");
+
+ /*
+ * Now we have to check whether the data we've so painstakingly
+ * accumulated is already obsolete due to someone else's just-committed
+ * catalog changes. If so, we just delete the temp file and leave it to
+ * the next backend to try again. (Our own relcache entries will be
+ * updated by SI message processing, but we can't be sure whether what we
+ * wrote out was up-to-date.)
+ *
+ * This mustn't run concurrently with the code that unlinks an init file
+ * and sends SI messages, so grab a serialization lock for the duration.
+ */
+ LWLockAcquire(RelCacheInitLock, LW_EXCLUSIVE);
+
+ /* Make sure we have seen all incoming SI messages */
+ AcceptInvalidationMessages();
+
+ /*
+ * If we have received any SI relcache invals since backend start, assume
+ * we may have written out-of-date data.
+ */
+ if (relcacheInvalsReceived == 0L)
+ {
+ /*
+ * OK, rename the temp file to its final name, deleting any
+ * previously-existing init file.
+ *
+ * Note: a failure here is possible under Cygwin, if some other
+ * backend is holding open an unlinked-but-not-yet-gone init file. So
+ * treat this as a noncritical failure; just remove the useless temp
+ * file on failure.
+ */
+ if (rename(tempfilename, finalfilename) < 0)
+ unlink(tempfilename);
+ }
+ else
+ {
+ /* Delete the already-obsolete temp file */
+ unlink(tempfilename);
+ }
+
+ LWLockRelease(RelCacheInitLock);
+}
+
+/* write a chunk of data preceded by its length */
+static void
+write_item(const void *data, Size len, FILE *fp)
+{
+ if (fwrite(&len, 1, sizeof(len), fp) != sizeof(len))
+ elog(FATAL, "could not write init file");
+ if (len > 0 && fwrite(data, 1, len, fp) != len)
+ elog(FATAL, "could not write init file");
+}
+
+/*
+ * Determine whether a given relation (identified by OID) is one of the ones
+ * we should store in a relcache init file.
+ *
+ * We must cache all nailed rels, and for efficiency we should cache every rel
+ * that supports a syscache. The former set is almost but not quite a subset
+ * of the latter. The special cases are relations where
+ * RelationCacheInitializePhase2/3 chooses to nail for efficiency reasons, but
+ * which do not support any syscache.
+ */
+bool
+RelationIdIsInInitFile(Oid relationId)
+{
+ if (relationId == SharedSecLabelRelationId ||
+ relationId == TriggerRelidNameIndexId ||
+ relationId == DatabaseNameIndexId ||
+ relationId == SharedSecLabelObjectIndexId)
+ {
+ /*
+ * If this Assert fails, we don't need the applicable special case
+ * anymore.
+ */
+ Assert(!RelationSupportsSysCache(relationId));
+ return true;
+ }
+ return RelationSupportsSysCache(relationId);
+}
+
+/*
+ * Invalidate (remove) the init file during commit of a transaction that
+ * changed one or more of the relation cache entries that are kept in the
+ * local init file.
+ *
+ * To be safe against concurrent inspection or rewriting of the init file,
+ * we must take RelCacheInitLock, then remove the old init file, then send
+ * the SI messages that include relcache inval for such relations, and then
+ * release RelCacheInitLock. This serializes the whole affair against
+ * write_relcache_init_file, so that we can be sure that any other process
+ * that's concurrently trying to create a new init file won't move an
+ * already-stale version into place after we unlink. Also, because we unlink
+ * before sending the SI messages, a backend that's currently starting cannot
+ * read the now-obsolete init file and then miss the SI messages that will
+ * force it to update its relcache entries. (This works because the backend
+ * startup sequence gets into the sinval array before trying to load the init
+ * file.)
+ *
+ * We take the lock and do the unlink in RelationCacheInitFilePreInvalidate,
+ * then release the lock in RelationCacheInitFilePostInvalidate. Caller must
+ * send any pending SI messages between those calls.
+ */
+void
+RelationCacheInitFilePreInvalidate(void)
+{
+ char localinitfname[MAXPGPATH];
+ char sharedinitfname[MAXPGPATH];
+
+ if (DatabasePath)
+ snprintf(localinitfname, sizeof(localinitfname), "%s/%s",
+ DatabasePath, RELCACHE_INIT_FILENAME);
+ snprintf(sharedinitfname, sizeof(sharedinitfname), "global/%s",
+ RELCACHE_INIT_FILENAME);
+
+ LWLockAcquire(RelCacheInitLock, LW_EXCLUSIVE);
+
+ /*
+ * The files might not be there if no backend has been started since the
+ * last removal. But complain about failures other than ENOENT with
+ * ERROR. Fortunately, it's not too late to abort the transaction if we
+ * can't get rid of the would-be-obsolete init file.
+ */
+ if (DatabasePath)
+ unlink_initfile(localinitfname, ERROR);
+ unlink_initfile(sharedinitfname, ERROR);
+}
+
+void
+RelationCacheInitFilePostInvalidate(void)
+{
+ LWLockRelease(RelCacheInitLock);
+}
+
+/*
+ * Remove the init files during postmaster startup.
+ *
+ * We used to keep the init files across restarts, but that is unsafe in PITR
+ * scenarios, and even in simple crash-recovery cases there are windows for
+ * the init files to become out-of-sync with the database. So now we just
+ * remove them during startup and expect the first backend launch to rebuild
+ * them. Of course, this has to happen in each database of the cluster.
+ */
+void
+RelationCacheInitFileRemove(void)
+{
+ const char *tblspcdir = "pg_tblspc";
+ DIR *dir;
+ struct dirent *de;
+ char path[MAXPGPATH + 10 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
+
+ snprintf(path, sizeof(path), "global/%s",
+ RELCACHE_INIT_FILENAME);
+ unlink_initfile(path, LOG);
+
+ /* Scan everything in the default tablespace */
+ RelationCacheInitFileRemoveInDir("base");
+
+ /* Scan the tablespace link directory to find non-default tablespaces */
+ dir = AllocateDir(tblspcdir);
+
+ while ((de = ReadDirExtended(dir, tblspcdir, LOG)) != NULL)
+ {
+ if (strspn(de->d_name, "0123456789") == strlen(de->d_name))
+ {
+ /* Scan the tablespace dir for per-database dirs */
+ snprintf(path, sizeof(path), "%s/%s/%s",
+ tblspcdir, de->d_name, TABLESPACE_VERSION_DIRECTORY);
+ RelationCacheInitFileRemoveInDir(path);
+ }
+ }
+
+ FreeDir(dir);
+}
+
+/* Process one per-tablespace directory for RelationCacheInitFileRemove */
+static void
+RelationCacheInitFileRemoveInDir(const char *tblspcpath)
+{
+ DIR *dir;
+ struct dirent *de;
+ char initfilename[MAXPGPATH * 2];
+
+ /* Scan the tablespace directory to find per-database directories */
+ dir = AllocateDir(tblspcpath);
+
+ while ((de = ReadDirExtended(dir, tblspcpath, LOG)) != NULL)
+ {
+ if (strspn(de->d_name, "0123456789") == strlen(de->d_name))
+ {
+ /* Try to remove the init file in each database */
+ snprintf(initfilename, sizeof(initfilename), "%s/%s/%s",
+ tblspcpath, de->d_name, RELCACHE_INIT_FILENAME);
+ unlink_initfile(initfilename, LOG);
+ }
+ }
+
+ FreeDir(dir);
+}
+
+static void
+unlink_initfile(const char *initfilename, int elevel)
+{
+ if (unlink(initfilename) < 0)
+ {
+ /* It might not be there, but log any error other than ENOENT */
+ if (errno != ENOENT)
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not remove cache file \"%s\": %m",
+ initfilename)));
+ }
+}
diff --git a/src/backend/utils/cache/relfilenodemap.c b/src/backend/utils/cache/relfilenodemap.c
new file mode 100644
index 0000000..70c323c
--- /dev/null
+++ b/src/backend/utils/cache/relfilenodemap.c
@@ -0,0 +1,244 @@
+/*-------------------------------------------------------------------------
+ *
+ * relfilenodemap.c
+ * relfilenode to oid mapping cache.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/relfilenodemap.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/genam.h"
+#include "access/htup_details.h"
+#include "access/table.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_tablespace.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/fmgroids.h"
+#include "utils/hsearch.h"
+#include "utils/inval.h"
+#include "utils/rel.h"
+#include "utils/relfilenodemap.h"
+#include "utils/relmapper.h"
+
+/* Hash table for information about each relfilenode <-> oid pair */
+static HTAB *RelfilenodeMapHash = NULL;
+
+/* built first time through in InitializeRelfilenodeMap */
+static ScanKeyData relfilenode_skey[2];
+
+typedef struct
+{
+ Oid reltablespace;
+ Oid relfilenode;
+} RelfilenodeMapKey;
+
+typedef struct
+{
+ RelfilenodeMapKey key; /* lookup key - must be first */
+ Oid relid; /* pg_class.oid */
+} RelfilenodeMapEntry;
+
+/*
+ * RelfilenodeMapInvalidateCallback
+ * Flush mapping entries when pg_class is updated in a relevant fashion.
+ */
+static void
+RelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
+{
+ HASH_SEQ_STATUS status;
+ RelfilenodeMapEntry *entry;
+
+ /* callback only gets registered after creating the hash */
+ Assert(RelfilenodeMapHash != NULL);
+
+ hash_seq_init(&status, RelfilenodeMapHash);
+ while ((entry = (RelfilenodeMapEntry *) hash_seq_search(&status)) != NULL)
+ {
+ /*
+ * If relid is InvalidOid, signaling a complete reset, we must remove
+ * all entries, otherwise just remove the specific relation's entry.
+ * Always remove negative cache entries.
+ */
+ if (relid == InvalidOid || /* complete reset */
+ entry->relid == InvalidOid || /* negative cache entry */
+ entry->relid == relid) /* individual flushed relation */
+ {
+ if (hash_search(RelfilenodeMapHash,
+ (void *) &entry->key,
+ HASH_REMOVE,
+ NULL) == NULL)
+ elog(ERROR, "hash table corrupted");
+ }
+ }
+}
+
+/*
+ * InitializeRelfilenodeMap
+ * Initialize cache, either on first use or after a reset.
+ */
+static void
+InitializeRelfilenodeMap(void)
+{
+ HASHCTL ctl;
+ int i;
+
+ /* Make sure we've initialized CacheMemoryContext. */
+ if (CacheMemoryContext == NULL)
+ CreateCacheMemoryContext();
+
+ /* build skey */
+ MemSet(&relfilenode_skey, 0, sizeof(relfilenode_skey));
+
+ for (i = 0; i < 2; i++)
+ {
+ fmgr_info_cxt(F_OIDEQ,
+ &relfilenode_skey[i].sk_func,
+ CacheMemoryContext);
+ relfilenode_skey[i].sk_strategy = BTEqualStrategyNumber;
+ relfilenode_skey[i].sk_subtype = InvalidOid;
+ relfilenode_skey[i].sk_collation = InvalidOid;
+ }
+
+ relfilenode_skey[0].sk_attno = Anum_pg_class_reltablespace;
+ relfilenode_skey[1].sk_attno = Anum_pg_class_relfilenode;
+
+ /*
+ * Only create the RelfilenodeMapHash now, so we don't end up partially
+ * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
+ * error.
+ */
+ ctl.keysize = sizeof(RelfilenodeMapKey);
+ ctl.entrysize = sizeof(RelfilenodeMapEntry);
+ ctl.hcxt = CacheMemoryContext;
+
+ RelfilenodeMapHash =
+ hash_create("RelfilenodeMap cache", 64, &ctl,
+ HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
+
+ /* Watch for invalidation events. */
+ CacheRegisterRelcacheCallback(RelfilenodeMapInvalidateCallback,
+ (Datum) 0);
+}
+
+/*
+ * Map a relation's (tablespace, filenode) to a relation's oid and cache the
+ * result.
+ *
+ * Returns InvalidOid if no relation matching the criteria could be found.
+ */
+Oid
+RelidByRelfilenode(Oid reltablespace, Oid relfilenode)
+{
+ RelfilenodeMapKey key;
+ RelfilenodeMapEntry *entry;
+ bool found;
+ SysScanDesc scandesc;
+ Relation relation;
+ HeapTuple ntp;
+ ScanKeyData skey[2];
+ Oid relid;
+
+ if (RelfilenodeMapHash == NULL)
+ InitializeRelfilenodeMap();
+
+ /* pg_class will show 0 when the value is actually MyDatabaseTableSpace */
+ if (reltablespace == MyDatabaseTableSpace)
+ reltablespace = 0;
+
+ MemSet(&key, 0, sizeof(key));
+ key.reltablespace = reltablespace;
+ key.relfilenode = relfilenode;
+
+ /*
+ * Check cache and return entry if one is found. Even if no target
+ * relation can be found later on we store the negative match and return a
+ * InvalidOid from cache. That's not really necessary for performance
+ * since querying invalid values isn't supposed to be a frequent thing,
+ * but it's basically free.
+ */
+ entry = hash_search(RelfilenodeMapHash, (void *) &key, HASH_FIND, &found);
+
+ if (found)
+ return entry->relid;
+
+ /* ok, no previous cache entry, do it the hard way */
+
+ /* initialize empty/negative cache entry before doing the actual lookups */
+ relid = InvalidOid;
+
+ if (reltablespace == GLOBALTABLESPACE_OID)
+ {
+ /*
+ * Ok, shared table, check relmapper.
+ */
+ relid = RelationMapFilenodeToOid(relfilenode, true);
+ }
+ else
+ {
+ /*
+ * Not a shared table, could either be a plain relation or a
+ * non-shared, nailed one, like e.g. pg_class.
+ */
+
+ /* check for plain relations by looking in pg_class */
+ relation = table_open(RelationRelationId, AccessShareLock);
+
+ /* copy scankey to local copy, it will be modified during the scan */
+ memcpy(skey, relfilenode_skey, sizeof(skey));
+
+ /* set scan arguments */
+ skey[0].sk_argument = ObjectIdGetDatum(reltablespace);
+ skey[1].sk_argument = ObjectIdGetDatum(relfilenode);
+
+ scandesc = systable_beginscan(relation,
+ ClassTblspcRelfilenodeIndexId,
+ true,
+ NULL,
+ 2,
+ skey);
+
+ found = false;
+
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc)))
+ {
+ Form_pg_class classform = (Form_pg_class) GETSTRUCT(ntp);
+
+ if (found)
+ elog(ERROR,
+ "unexpected duplicate for tablespace %u, relfilenode %u",
+ reltablespace, relfilenode);
+ found = true;
+
+ Assert(classform->reltablespace == reltablespace);
+ Assert(classform->relfilenode == relfilenode);
+ relid = classform->oid;
+ }
+
+ systable_endscan(scandesc);
+ table_close(relation, AccessShareLock);
+
+ /* check for tables that are mapped but not shared */
+ if (!found)
+ relid = RelationMapFilenodeToOid(relfilenode, false);
+ }
+
+ /*
+ * Only enter entry into cache now, our opening of pg_class could have
+ * caused cache invalidations to be executed which would have deleted a
+ * new entry if we had entered it above.
+ */
+ entry = hash_search(RelfilenodeMapHash, (void *) &key, HASH_ENTER, &found);
+ if (found)
+ elog(ERROR, "corrupted hashtable");
+ entry->relid = relid;
+
+ return relid;
+}
diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c
new file mode 100644
index 0000000..2a330cf
--- /dev/null
+++ b/src/backend/utils/cache/relmapper.c
@@ -0,0 +1,1108 @@
+/*-------------------------------------------------------------------------
+ *
+ * relmapper.c
+ * Catalog-to-filenode mapping
+ *
+ * For most tables, the physical file underlying the table is specified by
+ * pg_class.relfilenode. However, that obviously won't work for pg_class
+ * itself, nor for the other "nailed" catalogs for which we have to be able
+ * to set up working Relation entries without access to pg_class. It also
+ * does not work for shared catalogs, since there is no practical way to
+ * update other databases' pg_class entries when relocating a shared catalog.
+ * Therefore, for these special catalogs (henceforth referred to as "mapped
+ * catalogs") we rely on a separately maintained file that shows the mapping
+ * from catalog OIDs to filenode numbers. Each database has a map file for
+ * its local mapped catalogs, and there is a separate map file for shared
+ * catalogs. Mapped catalogs have zero in their pg_class.relfilenode entries.
+ *
+ * Relocation of a normal table is committed (ie, the new physical file becomes
+ * authoritative) when the pg_class row update commits. For mapped catalogs,
+ * the act of updating the map file is effectively commit of the relocation.
+ * We postpone the file update till just before commit of the transaction
+ * doing the rewrite, but there is necessarily a window between. Therefore
+ * mapped catalogs can only be relocated by operations such as VACUUM FULL
+ * and CLUSTER, which make no transactionally-significant changes: it must be
+ * safe for the new file to replace the old, even if the transaction itself
+ * aborts. An important factor here is that the indexes and toast table of
+ * a mapped catalog must also be mapped, so that the rewrites/relocations of
+ * all these files commit in a single map file update rather than being tied
+ * to transaction commit.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/relmapper.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xact.h"
+#include "access/xlog.h"
+#include "access/xloginsert.h"
+#include "catalog/catalog.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/storage.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "storage/fd.h"
+#include "storage/lwlock.h"
+#include "utils/inval.h"
+#include "utils/relmapper.h"
+
+
+/*
+ * The map file is critical data: we have no automatic method for recovering
+ * from loss or corruption of it. We use a CRC so that we can detect
+ * corruption. To minimize the risk of failed updates, the map file should
+ * be kept to no more than one standard-size disk sector (ie 512 bytes),
+ * and we use overwrite-in-place rather than playing renaming games.
+ * The struct layout below is designed to occupy exactly 512 bytes, which
+ * might make filesystem updates a bit more efficient.
+ *
+ * Entries in the mappings[] array are in no particular order. We could
+ * speed searching by insisting on OID order, but it really shouldn't be
+ * worth the trouble given the intended size of the mapping sets.
+ */
+#define RELMAPPER_FILENAME "pg_filenode.map"
+
+#define RELMAPPER_FILEMAGIC 0x592717 /* version ID value */
+
+#define MAX_MAPPINGS 62 /* 62 * 8 + 16 = 512 */
+
+typedef struct RelMapping
+{
+ Oid mapoid; /* OID of a catalog */
+ Oid mapfilenode; /* its filenode number */
+} RelMapping;
+
+typedef struct RelMapFile
+{
+ int32 magic; /* always RELMAPPER_FILEMAGIC */
+ int32 num_mappings; /* number of valid RelMapping entries */
+ RelMapping mappings[MAX_MAPPINGS];
+ pg_crc32c crc; /* CRC of all above */
+ int32 pad; /* to make the struct size be 512 exactly */
+} RelMapFile;
+
+/*
+ * State for serializing local and shared relmappings for parallel workers
+ * (active states only). See notes on active_* and pending_* updates state.
+ */
+typedef struct SerializedActiveRelMaps
+{
+ RelMapFile active_shared_updates;
+ RelMapFile active_local_updates;
+} SerializedActiveRelMaps;
+
+/*
+ * The currently known contents of the shared map file and our database's
+ * local map file are stored here. These can be reloaded from disk
+ * immediately whenever we receive an update sinval message.
+ */
+static RelMapFile shared_map;
+static RelMapFile local_map;
+
+/*
+ * We use the same RelMapFile data structure to track uncommitted local
+ * changes in the mappings (but note the magic and crc fields are not made
+ * valid in these variables). Currently, map updates are not allowed within
+ * subtransactions, so one set of transaction-level changes is sufficient.
+ *
+ * The active_xxx variables contain updates that are valid in our transaction
+ * and should be honored by RelationMapOidToFilenode. The pending_xxx
+ * variables contain updates we have been told about that aren't active yet;
+ * they will become active at the next CommandCounterIncrement. This setup
+ * lets map updates act similarly to updates of pg_class rows, ie, they
+ * become visible only at the next CommandCounterIncrement boundary.
+ *
+ * Active shared and active local updates are serialized by the parallel
+ * infrastructure, and deserialized within parallel workers.
+ */
+static RelMapFile active_shared_updates;
+static RelMapFile active_local_updates;
+static RelMapFile pending_shared_updates;
+static RelMapFile pending_local_updates;
+
+
+/* non-export function prototypes */
+static void apply_map_update(RelMapFile *map, Oid relationId, Oid fileNode,
+ bool add_okay);
+static void merge_map_updates(RelMapFile *map, const RelMapFile *updates,
+ bool add_okay);
+static void load_relmap_file(bool shared, bool lock_held);
+static void read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held,
+ int elevel);
+static void write_relmap_file(RelMapFile *newmap, bool write_wal,
+ bool send_sinval, bool preserve_files,
+ Oid dbid, Oid tsid, const char *dbpath);
+static void perform_relmap_update(bool shared, const RelMapFile *updates);
+
+
+/*
+ * RelationMapOidToFilenode
+ *
+ * The raison d' etre ... given a relation OID, look up its filenode.
+ *
+ * Although shared and local relation OIDs should never overlap, the caller
+ * always knows which we need --- so pass that information to avoid useless
+ * searching.
+ *
+ * Returns InvalidOid if the OID is not known (which should never happen,
+ * but the caller is in a better position to report a meaningful error).
+ */
+Oid
+RelationMapOidToFilenode(Oid relationId, bool shared)
+{
+ const RelMapFile *map;
+ int32 i;
+
+ /* If there are active updates, believe those over the main maps */
+ if (shared)
+ {
+ map = &active_shared_updates;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ return map->mappings[i].mapfilenode;
+ }
+ map = &shared_map;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ return map->mappings[i].mapfilenode;
+ }
+ }
+ else
+ {
+ map = &active_local_updates;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ return map->mappings[i].mapfilenode;
+ }
+ map = &local_map;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ return map->mappings[i].mapfilenode;
+ }
+ }
+
+ return InvalidOid;
+}
+
+/*
+ * RelationMapFilenodeToOid
+ *
+ * Do the reverse of the normal direction of mapping done in
+ * RelationMapOidToFilenode.
+ *
+ * This is not supposed to be used during normal running but rather for
+ * information purposes when looking at the filesystem or xlog.
+ *
+ * Returns InvalidOid if the OID is not known; this can easily happen if the
+ * relfilenode doesn't pertain to a mapped relation.
+ */
+Oid
+RelationMapFilenodeToOid(Oid filenode, bool shared)
+{
+ const RelMapFile *map;
+ int32 i;
+
+ /* If there are active updates, believe those over the main maps */
+ if (shared)
+ {
+ map = &active_shared_updates;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (filenode == map->mappings[i].mapfilenode)
+ return map->mappings[i].mapoid;
+ }
+ map = &shared_map;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (filenode == map->mappings[i].mapfilenode)
+ return map->mappings[i].mapoid;
+ }
+ }
+ else
+ {
+ map = &active_local_updates;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (filenode == map->mappings[i].mapfilenode)
+ return map->mappings[i].mapoid;
+ }
+ map = &local_map;
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (filenode == map->mappings[i].mapfilenode)
+ return map->mappings[i].mapoid;
+ }
+ }
+
+ return InvalidOid;
+}
+
+/*
+ * RelationMapOidToFilenodeForDatabase
+ *
+ * Like RelationMapOidToFilenode, but reads the mapping from the indicated
+ * path instead of using the one for the current database.
+ */
+Oid
+RelationMapOidToFilenodeForDatabase(char *dbpath, Oid relationId)
+{
+ RelMapFile map;
+ int i;
+
+ /* Read the relmap file from the source database. */
+ read_relmap_file(&map, dbpath, false, ERROR);
+
+ /* Iterate over the relmap entries to find the input relation OID. */
+ for (i = 0; i < map.num_mappings; i++)
+ {
+ if (relationId == map.mappings[i].mapoid)
+ return map.mappings[i].mapfilenode;
+ }
+
+ return InvalidOid;
+}
+
+/*
+ * RelationMapCopy
+ *
+ * Copy relmapfile from source db path to the destination db path and WAL log
+ * the operation. This is intended for use in creating a new relmap file
+ * for a database that doesn't have one yet, not for replacing an existing
+ * relmap file.
+ */
+void
+RelationMapCopy(Oid dbid, Oid tsid, char *srcdbpath, char *dstdbpath)
+{
+ RelMapFile map;
+
+ /*
+ * Read the relmap file from the source database.
+ */
+ read_relmap_file(&map, srcdbpath, false, ERROR);
+
+ /*
+ * Write the same data into the destination database's relmap file.
+ *
+ * No sinval is needed because no one can be connected to the destination
+ * database yet. For the same reason, there is no need to acquire
+ * RelationMappingLock.
+ *
+ * There's no point in trying to preserve files here. The new database
+ * isn't usable yet anyway, and won't ever be if we can't install a relmap
+ * file.
+ */
+ write_relmap_file(&map, true, false, false, dbid, tsid, dstdbpath);
+}
+
+/*
+ * RelationMapUpdateMap
+ *
+ * Install a new relfilenode mapping for the specified relation.
+ *
+ * If immediate is true (or we're bootstrapping), the mapping is activated
+ * immediately. Otherwise it is made pending until CommandCounterIncrement.
+ */
+void
+RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared,
+ bool immediate)
+{
+ RelMapFile *map;
+
+ if (IsBootstrapProcessingMode())
+ {
+ /*
+ * In bootstrap mode, the mapping gets installed in permanent map.
+ */
+ if (shared)
+ map = &shared_map;
+ else
+ map = &local_map;
+ }
+ else
+ {
+ /*
+ * We don't currently support map changes within subtransactions, or
+ * when in parallel mode. This could be done with more bookkeeping
+ * infrastructure, but it doesn't presently seem worth it.
+ */
+ if (GetCurrentTransactionNestLevel() > 1)
+ elog(ERROR, "cannot change relation mapping within subtransaction");
+
+ if (IsInParallelMode())
+ elog(ERROR, "cannot change relation mapping in parallel mode");
+
+ if (immediate)
+ {
+ /* Make it active, but only locally */
+ if (shared)
+ map = &active_shared_updates;
+ else
+ map = &active_local_updates;
+ }
+ else
+ {
+ /* Make it pending */
+ if (shared)
+ map = &pending_shared_updates;
+ else
+ map = &pending_local_updates;
+ }
+ }
+ apply_map_update(map, relationId, fileNode, true);
+}
+
+/*
+ * apply_map_update
+ *
+ * Insert a new mapping into the given map variable, replacing any existing
+ * mapping for the same relation.
+ *
+ * In some cases the caller knows there must be an existing mapping; pass
+ * add_okay = false to draw an error if not.
+ */
+static void
+apply_map_update(RelMapFile *map, Oid relationId, Oid fileNode, bool add_okay)
+{
+ int32 i;
+
+ /* Replace any existing mapping */
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ {
+ map->mappings[i].mapfilenode = fileNode;
+ return;
+ }
+ }
+
+ /* Nope, need to add a new mapping */
+ if (!add_okay)
+ elog(ERROR, "attempt to apply a mapping to unmapped relation %u",
+ relationId);
+ if (map->num_mappings >= MAX_MAPPINGS)
+ elog(ERROR, "ran out of space in relation map");
+ map->mappings[map->num_mappings].mapoid = relationId;
+ map->mappings[map->num_mappings].mapfilenode = fileNode;
+ map->num_mappings++;
+}
+
+/*
+ * merge_map_updates
+ *
+ * Merge all the updates in the given pending-update map into the target map.
+ * This is just a bulk form of apply_map_update.
+ */
+static void
+merge_map_updates(RelMapFile *map, const RelMapFile *updates, bool add_okay)
+{
+ int32 i;
+
+ for (i = 0; i < updates->num_mappings; i++)
+ {
+ apply_map_update(map,
+ updates->mappings[i].mapoid,
+ updates->mappings[i].mapfilenode,
+ add_okay);
+ }
+}
+
+/*
+ * RelationMapRemoveMapping
+ *
+ * Remove a relation's entry in the map. This is only allowed for "active"
+ * (but not committed) local mappings. We need it so we can back out the
+ * entry for the transient target file when doing VACUUM FULL/CLUSTER on
+ * a mapped relation.
+ */
+void
+RelationMapRemoveMapping(Oid relationId)
+{
+ RelMapFile *map = &active_local_updates;
+ int32 i;
+
+ for (i = 0; i < map->num_mappings; i++)
+ {
+ if (relationId == map->mappings[i].mapoid)
+ {
+ /* Found it, collapse it out */
+ map->mappings[i] = map->mappings[map->num_mappings - 1];
+ map->num_mappings--;
+ return;
+ }
+ }
+ elog(ERROR, "could not find temporary mapping for relation %u",
+ relationId);
+}
+
+/*
+ * RelationMapInvalidate
+ *
+ * This routine is invoked for SI cache flush messages. We must re-read
+ * the indicated map file. However, we might receive a SI message in a
+ * process that hasn't yet, and might never, load the mapping files;
+ * for example the autovacuum launcher, which *must not* try to read
+ * a local map since it is attached to no particular database.
+ * So, re-read only if the map is valid now.
+ */
+void
+RelationMapInvalidate(bool shared)
+{
+ if (shared)
+ {
+ if (shared_map.magic == RELMAPPER_FILEMAGIC)
+ load_relmap_file(true, false);
+ }
+ else
+ {
+ if (local_map.magic == RELMAPPER_FILEMAGIC)
+ load_relmap_file(false, false);
+ }
+}
+
+/*
+ * RelationMapInvalidateAll
+ *
+ * Reload all map files. This is used to recover from SI message buffer
+ * overflow: we can't be sure if we missed an inval message.
+ * Again, reload only currently-valid maps.
+ */
+void
+RelationMapInvalidateAll(void)
+{
+ if (shared_map.magic == RELMAPPER_FILEMAGIC)
+ load_relmap_file(true, false);
+ if (local_map.magic == RELMAPPER_FILEMAGIC)
+ load_relmap_file(false, false);
+}
+
+/*
+ * AtCCI_RelationMap
+ *
+ * Activate any "pending" relation map updates at CommandCounterIncrement time.
+ */
+void
+AtCCI_RelationMap(void)
+{
+ if (pending_shared_updates.num_mappings != 0)
+ {
+ merge_map_updates(&active_shared_updates,
+ &pending_shared_updates,
+ true);
+ pending_shared_updates.num_mappings = 0;
+ }
+ if (pending_local_updates.num_mappings != 0)
+ {
+ merge_map_updates(&active_local_updates,
+ &pending_local_updates,
+ true);
+ pending_local_updates.num_mappings = 0;
+ }
+}
+
+/*
+ * AtEOXact_RelationMap
+ *
+ * Handle relation mapping at main-transaction commit or abort.
+ *
+ * During commit, this must be called as late as possible before the actual
+ * transaction commit, so as to minimize the window where the transaction
+ * could still roll back after committing map changes. Although nothing
+ * critically bad happens in such a case, we still would prefer that it
+ * not happen, since we'd possibly be losing useful updates to the relations'
+ * pg_class row(s).
+ *
+ * During abort, we just have to throw away any pending map changes.
+ * Normal post-abort cleanup will take care of fixing relcache entries.
+ * Parallel worker commit/abort is handled by resetting active mappings
+ * that may have been received from the leader process. (There should be
+ * no pending updates in parallel workers.)
+ */
+void
+AtEOXact_RelationMap(bool isCommit, bool isParallelWorker)
+{
+ if (isCommit && !isParallelWorker)
+ {
+ /*
+ * We should not get here with any "pending" updates. (We could
+ * logically choose to treat such as committed, but in the current
+ * code this should never happen.)
+ */
+ Assert(pending_shared_updates.num_mappings == 0);
+ Assert(pending_local_updates.num_mappings == 0);
+
+ /*
+ * Write any active updates to the actual map files, then reset them.
+ */
+ if (active_shared_updates.num_mappings != 0)
+ {
+ perform_relmap_update(true, &active_shared_updates);
+ active_shared_updates.num_mappings = 0;
+ }
+ if (active_local_updates.num_mappings != 0)
+ {
+ perform_relmap_update(false, &active_local_updates);
+ active_local_updates.num_mappings = 0;
+ }
+ }
+ else
+ {
+ /* Abort or parallel worker --- drop all local and pending updates */
+ Assert(!isParallelWorker || pending_shared_updates.num_mappings == 0);
+ Assert(!isParallelWorker || pending_local_updates.num_mappings == 0);
+
+ active_shared_updates.num_mappings = 0;
+ active_local_updates.num_mappings = 0;
+ pending_shared_updates.num_mappings = 0;
+ pending_local_updates.num_mappings = 0;
+ }
+}
+
+/*
+ * AtPrepare_RelationMap
+ *
+ * Handle relation mapping at PREPARE.
+ *
+ * Currently, we don't support preparing any transaction that changes the map.
+ */
+void
+AtPrepare_RelationMap(void)
+{
+ if (active_shared_updates.num_mappings != 0 ||
+ active_local_updates.num_mappings != 0 ||
+ pending_shared_updates.num_mappings != 0 ||
+ pending_local_updates.num_mappings != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot PREPARE a transaction that modified relation mapping")));
+}
+
+/*
+ * CheckPointRelationMap
+ *
+ * This is called during a checkpoint. It must ensure that any relation map
+ * updates that were WAL-logged before the start of the checkpoint are
+ * securely flushed to disk and will not need to be replayed later. This
+ * seems unlikely to be a performance-critical issue, so we use a simple
+ * method: we just take and release the RelationMappingLock. This ensures
+ * that any already-logged map update is complete, because write_relmap_file
+ * will fsync the map file before the lock is released.
+ */
+void
+CheckPointRelationMap(void)
+{
+ LWLockAcquire(RelationMappingLock, LW_SHARED);
+ LWLockRelease(RelationMappingLock);
+}
+
+/*
+ * RelationMapFinishBootstrap
+ *
+ * Write out the initial relation mapping files at the completion of
+ * bootstrap. All the mapped files should have been made known to us
+ * via RelationMapUpdateMap calls.
+ */
+void
+RelationMapFinishBootstrap(void)
+{
+ Assert(IsBootstrapProcessingMode());
+
+ /* Shouldn't be anything "pending" ... */
+ Assert(active_shared_updates.num_mappings == 0);
+ Assert(active_local_updates.num_mappings == 0);
+ Assert(pending_shared_updates.num_mappings == 0);
+ Assert(pending_local_updates.num_mappings == 0);
+
+ /* Write the files; no WAL or sinval needed */
+ write_relmap_file(&shared_map, false, false, false,
+ InvalidOid, GLOBALTABLESPACE_OID, "global");
+ write_relmap_file(&local_map, false, false, false,
+ MyDatabaseId, MyDatabaseTableSpace, DatabasePath);
+}
+
+/*
+ * RelationMapInitialize
+ *
+ * This initializes the mapper module at process startup. We can't access the
+ * database yet, so just make sure the maps are empty.
+ */
+void
+RelationMapInitialize(void)
+{
+ /* The static variables should initialize to zeroes, but let's be sure */
+ shared_map.magic = 0; /* mark it not loaded */
+ local_map.magic = 0;
+ shared_map.num_mappings = 0;
+ local_map.num_mappings = 0;
+ active_shared_updates.num_mappings = 0;
+ active_local_updates.num_mappings = 0;
+ pending_shared_updates.num_mappings = 0;
+ pending_local_updates.num_mappings = 0;
+}
+
+/*
+ * RelationMapInitializePhase2
+ *
+ * This is called to prepare for access to pg_database during startup.
+ * We should be able to read the shared map file now.
+ */
+void
+RelationMapInitializePhase2(void)
+{
+ /*
+ * In bootstrap mode, the map file isn't there yet, so do nothing.
+ */
+ if (IsBootstrapProcessingMode())
+ return;
+
+ /*
+ * Load the shared map file, die on error.
+ */
+ load_relmap_file(true, false);
+}
+
+/*
+ * RelationMapInitializePhase3
+ *
+ * This is called as soon as we have determined MyDatabaseId and set up
+ * DatabasePath. At this point we should be able to read the local map file.
+ */
+void
+RelationMapInitializePhase3(void)
+{
+ /*
+ * In bootstrap mode, the map file isn't there yet, so do nothing.
+ */
+ if (IsBootstrapProcessingMode())
+ return;
+
+ /*
+ * Load the local map file, die on error.
+ */
+ load_relmap_file(false, false);
+}
+
+/*
+ * EstimateRelationMapSpace
+ *
+ * Estimate space needed to pass active shared and local relmaps to parallel
+ * workers.
+ */
+Size
+EstimateRelationMapSpace(void)
+{
+ return sizeof(SerializedActiveRelMaps);
+}
+
+/*
+ * SerializeRelationMap
+ *
+ * Serialize active shared and local relmap state for parallel workers.
+ */
+void
+SerializeRelationMap(Size maxSize, char *startAddress)
+{
+ SerializedActiveRelMaps *relmaps;
+
+ Assert(maxSize >= EstimateRelationMapSpace());
+
+ relmaps = (SerializedActiveRelMaps *) startAddress;
+ relmaps->active_shared_updates = active_shared_updates;
+ relmaps->active_local_updates = active_local_updates;
+}
+
+/*
+ * RestoreRelationMap
+ *
+ * Restore active shared and local relmap state within a parallel worker.
+ */
+void
+RestoreRelationMap(char *startAddress)
+{
+ SerializedActiveRelMaps *relmaps;
+
+ if (active_shared_updates.num_mappings != 0 ||
+ active_local_updates.num_mappings != 0 ||
+ pending_shared_updates.num_mappings != 0 ||
+ pending_local_updates.num_mappings != 0)
+ elog(ERROR, "parallel worker has existing mappings");
+
+ relmaps = (SerializedActiveRelMaps *) startAddress;
+ active_shared_updates = relmaps->active_shared_updates;
+ active_local_updates = relmaps->active_local_updates;
+}
+
+/*
+ * load_relmap_file -- load the shared or local map file
+ *
+ * Because these files are essential for access to core system catalogs,
+ * failure to load either of them is a fatal error.
+ *
+ * Note that the local case requires DatabasePath to be set up.
+ */
+static void
+load_relmap_file(bool shared, bool lock_held)
+{
+ if (shared)
+ read_relmap_file(&shared_map, "global", lock_held, FATAL);
+ else
+ read_relmap_file(&local_map, DatabasePath, lock_held, FATAL);
+}
+
+/*
+ * read_relmap_file -- load data from any relation mapper file
+ *
+ * dbpath must be the relevant database path, or "global" for shared relations.
+ *
+ * RelationMappingLock will be acquired released unless lock_held = true.
+ *
+ * Errors will be reported at the indicated elevel, which should be at least
+ * ERROR.
+ */
+static void
+read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held, int elevel)
+{
+ char mapfilename[MAXPGPATH];
+ pg_crc32c crc;
+ int fd;
+ int r;
+
+ Assert(elevel >= ERROR);
+
+ /* Open the target file. */
+ snprintf(mapfilename, sizeof(mapfilename), "%s/%s", dbpath,
+ RELMAPPER_FILENAME);
+ fd = OpenTransientFile(mapfilename, O_RDONLY | PG_BINARY);
+ if (fd < 0)
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ mapfilename)));
+
+ /*
+ * Grab the lock to prevent the file from being updated while we read it,
+ * unless the caller is already holding the lock. If the file is updated
+ * shortly after we look, the sinval signaling mechanism will make us
+ * re-read it before we are able to access any relation that's affected by
+ * the change.
+ */
+ if (!lock_held)
+ LWLockAcquire(RelationMappingLock, LW_SHARED);
+
+ /* Now read the data. */
+ pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_READ);
+ r = read(fd, map, sizeof(RelMapFile));
+ if (r != sizeof(RelMapFile))
+ {
+ if (r < 0)
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not read file \"%s\": %m", mapfilename)));
+ else
+ ereport(elevel,
+ (errcode(ERRCODE_DATA_CORRUPTED),
+ errmsg("could not read file \"%s\": read %d of %zu",
+ mapfilename, r, sizeof(RelMapFile))));
+ }
+ pgstat_report_wait_end();
+
+ if (!lock_held)
+ LWLockRelease(RelationMappingLock);
+
+ if (CloseTransientFile(fd) != 0)
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not close file \"%s\": %m",
+ mapfilename)));
+
+ /* check for correct magic number, etc */
+ if (map->magic != RELMAPPER_FILEMAGIC ||
+ map->num_mappings < 0 ||
+ map->num_mappings > MAX_MAPPINGS)
+ ereport(elevel,
+ (errmsg("relation mapping file \"%s\" contains invalid data",
+ mapfilename)));
+
+ /* verify the CRC */
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc, (char *) map, offsetof(RelMapFile, crc));
+ FIN_CRC32C(crc);
+
+ if (!EQ_CRC32C(crc, map->crc))
+ ereport(elevel,
+ (errmsg("relation mapping file \"%s\" contains incorrect checksum",
+ mapfilename)));
+}
+
+/*
+ * Write out a new shared or local map file with the given contents.
+ *
+ * The magic number and CRC are automatically updated in *newmap. On
+ * success, we copy the data to the appropriate permanent static variable.
+ *
+ * If write_wal is true then an appropriate WAL message is emitted.
+ * (It will be false for bootstrap and WAL replay cases.)
+ *
+ * If send_sinval is true then a SI invalidation message is sent.
+ * (This should be true except in bootstrap case.)
+ *
+ * If preserve_files is true then the storage manager is warned not to
+ * delete the files listed in the map.
+ *
+ * Because this may be called during WAL replay when MyDatabaseId,
+ * DatabasePath, etc aren't valid, we require the caller to pass in suitable
+ * values. Pass dbpath as "global" for the shared map.
+ *
+ * The caller is also responsible for being sure no concurrent map update
+ * could be happening.
+ */
+static void
+write_relmap_file(RelMapFile *newmap, bool write_wal, bool send_sinval,
+ bool preserve_files, Oid dbid, Oid tsid, const char *dbpath)
+{
+ int fd;
+ char mapfilename[MAXPGPATH];
+
+ /*
+ * Fill in the overhead fields and update CRC.
+ */
+ newmap->magic = RELMAPPER_FILEMAGIC;
+ if (newmap->num_mappings < 0 || newmap->num_mappings > MAX_MAPPINGS)
+ elog(ERROR, "attempt to write bogus relation mapping");
+
+ INIT_CRC32C(newmap->crc);
+ COMP_CRC32C(newmap->crc, (char *) newmap, offsetof(RelMapFile, crc));
+ FIN_CRC32C(newmap->crc);
+
+ /*
+ * Open the target file. We prefer to do this before entering the
+ * critical section, so that an open() failure need not force PANIC.
+ */
+ snprintf(mapfilename, sizeof(mapfilename), "%s/%s",
+ dbpath, RELMAPPER_FILENAME);
+ fd = OpenTransientFile(mapfilename, O_WRONLY | O_CREAT | PG_BINARY);
+ if (fd < 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ mapfilename)));
+
+ if (write_wal)
+ {
+ xl_relmap_update xlrec;
+ XLogRecPtr lsn;
+
+ /* now errors are fatal ... */
+ START_CRIT_SECTION();
+
+ xlrec.dbid = dbid;
+ xlrec.tsid = tsid;
+ xlrec.nbytes = sizeof(RelMapFile);
+
+ XLogBeginInsert();
+ XLogRegisterData((char *) (&xlrec), MinSizeOfRelmapUpdate);
+ XLogRegisterData((char *) newmap, sizeof(RelMapFile));
+
+ lsn = XLogInsert(RM_RELMAP_ID, XLOG_RELMAP_UPDATE);
+
+ /* As always, WAL must hit the disk before the data update does */
+ XLogFlush(lsn);
+ }
+
+ errno = 0;
+ pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_WRITE);
+ if (write(fd, newmap, sizeof(RelMapFile)) != sizeof(RelMapFile))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write file \"%s\": %m",
+ mapfilename)));
+ }
+ pgstat_report_wait_end();
+
+ /*
+ * We choose to fsync the data to disk before considering the task done.
+ * It would be possible to relax this if it turns out to be a performance
+ * issue, but it would complicate checkpointing --- see notes for
+ * CheckPointRelationMap.
+ */
+ pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_SYNC);
+ if (pg_fsync(fd) != 0)
+ ereport(data_sync_elevel(ERROR),
+ (errcode_for_file_access(),
+ errmsg("could not fsync file \"%s\": %m",
+ mapfilename)));
+ pgstat_report_wait_end();
+
+ if (CloseTransientFile(fd) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not close file \"%s\": %m",
+ mapfilename)));
+
+ /*
+ * Now that the file is safely on disk, send sinval message to let other
+ * backends know to re-read it. We must do this inside the critical
+ * section: if for some reason we fail to send the message, we have to
+ * force a database-wide PANIC. Otherwise other backends might continue
+ * execution with stale mapping information, which would be catastrophic
+ * as soon as others began to use the now-committed data.
+ */
+ if (send_sinval)
+ CacheInvalidateRelmap(dbid);
+
+ /*
+ * Make sure that the files listed in the map are not deleted if the outer
+ * transaction aborts. This had better be within the critical section
+ * too: it's not likely to fail, but if it did, we'd arrive at transaction
+ * abort with the files still vulnerable. PANICing will leave things in a
+ * good state on-disk.
+ *
+ * Note: we're cheating a little bit here by assuming that mapped files
+ * are either in pg_global or the database's default tablespace.
+ */
+ if (preserve_files)
+ {
+ int32 i;
+
+ for (i = 0; i < newmap->num_mappings; i++)
+ {
+ RelFileNode rnode;
+
+ rnode.spcNode = tsid;
+ rnode.dbNode = dbid;
+ rnode.relNode = newmap->mappings[i].mapfilenode;
+ RelationPreserveStorage(rnode, false);
+ }
+ }
+
+ /* Critical section done */
+ if (write_wal)
+ END_CRIT_SECTION();
+}
+
+/*
+ * Merge the specified updates into the appropriate "real" map,
+ * and write out the changes. This function must be used for committing
+ * updates during normal multiuser operation.
+ */
+static void
+perform_relmap_update(bool shared, const RelMapFile *updates)
+{
+ RelMapFile newmap;
+
+ /*
+ * Anyone updating a relation's mapping info should take exclusive lock on
+ * that rel and hold it until commit. This ensures that there will not be
+ * concurrent updates on the same mapping value; but there could easily be
+ * concurrent updates on different values in the same file. We cover that
+ * by acquiring the RelationMappingLock, re-reading the target file to
+ * ensure it's up to date, applying the updates, and writing the data
+ * before releasing RelationMappingLock.
+ *
+ * There is only one RelationMappingLock. In principle we could try to
+ * have one per mapping file, but it seems unlikely to be worth the
+ * trouble.
+ */
+ LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE);
+
+ /* Be certain we see any other updates just made */
+ load_relmap_file(shared, true);
+
+ /* Prepare updated data in a local variable */
+ if (shared)
+ memcpy(&newmap, &shared_map, sizeof(RelMapFile));
+ else
+ memcpy(&newmap, &local_map, sizeof(RelMapFile));
+
+ /*
+ * Apply the updates to newmap. No new mappings should appear, unless
+ * somebody is adding indexes to system catalogs.
+ */
+ merge_map_updates(&newmap, updates, allowSystemTableMods);
+
+ /* Write out the updated map and do other necessary tasks */
+ write_relmap_file(&newmap, true, true, true,
+ (shared ? InvalidOid : MyDatabaseId),
+ (shared ? GLOBALTABLESPACE_OID : MyDatabaseTableSpace),
+ (shared ? "global" : DatabasePath));
+
+ /*
+ * We successfully wrote the updated file, so it's now safe to rely on the
+ * new values in this process, too.
+ */
+ if (shared)
+ memcpy(&shared_map, &newmap, sizeof(RelMapFile));
+ else
+ memcpy(&local_map, &newmap, sizeof(RelMapFile));
+
+ /* Now we can release the lock */
+ LWLockRelease(RelationMappingLock);
+}
+
+/*
+ * RELMAP resource manager's routines
+ */
+void
+relmap_redo(XLogReaderState *record)
+{
+ uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+
+ /* Backup blocks are not used in relmap records */
+ Assert(!XLogRecHasAnyBlockRefs(record));
+
+ if (info == XLOG_RELMAP_UPDATE)
+ {
+ xl_relmap_update *xlrec = (xl_relmap_update *) XLogRecGetData(record);
+ RelMapFile newmap;
+ char *dbpath;
+
+ if (xlrec->nbytes != sizeof(RelMapFile))
+ elog(PANIC, "relmap_redo: wrong size %u in relmap update record",
+ xlrec->nbytes);
+ memcpy(&newmap, xlrec->data, sizeof(newmap));
+
+ /* We need to construct the pathname for this database */
+ dbpath = GetDatabasePath(xlrec->dbid, xlrec->tsid);
+
+ /*
+ * Write out the new map and send sinval, but of course don't write a
+ * new WAL entry. There's no surrounding transaction to tell to
+ * preserve files, either.
+ *
+ * There shouldn't be anyone else updating relmaps during WAL replay,
+ * but grab the lock to interlock against load_relmap_file().
+ *
+ * Note that we use the same WAL record for updating the relmap of an
+ * existing database as we do for creating a new database. In the
+ * latter case, taking the relmap log and sending sinval messages is
+ * unnecessary, but harmless. If we wanted to avoid it, we could add a
+ * flag to the WAL record to indicate which operation is being
+ * performed.
+ */
+ LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE);
+ write_relmap_file(&newmap, false, true, false,
+ xlrec->dbid, xlrec->tsid, dbpath);
+ LWLockRelease(RelationMappingLock);
+
+ pfree(dbpath);
+ }
+ else
+ elog(PANIC, "relmap_redo: unknown op code %u", info);
+}
diff --git a/src/backend/utils/cache/spccache.c b/src/backend/utils/cache/spccache.c
new file mode 100644
index 0000000..5609246
--- /dev/null
+++ b/src/backend/utils/cache/spccache.c
@@ -0,0 +1,236 @@
+/*-------------------------------------------------------------------------
+ *
+ * spccache.c
+ * Tablespace cache management.
+ *
+ * We cache the parsed version of spcoptions for each tablespace to avoid
+ * needing to reparse on every lookup. Right now, there doesn't appear to
+ * be a measurable performance gain from doing this, but that might change
+ * in the future as we add more options.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/spccache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/reloptions.h"
+#include "catalog/pg_tablespace.h"
+#include "commands/tablespace.h"
+#include "miscadmin.h"
+#include "optimizer/optimizer.h"
+#include "storage/bufmgr.h"
+#include "utils/catcache.h"
+#include "utils/hsearch.h"
+#include "utils/inval.h"
+#include "utils/spccache.h"
+#include "utils/syscache.h"
+
+
+/* Hash table for information about each tablespace */
+static HTAB *TableSpaceCacheHash = NULL;
+
+typedef struct
+{
+ Oid oid; /* lookup key - must be first */
+ TableSpaceOpts *opts; /* options, or NULL if none */
+} TableSpaceCacheEntry;
+
+
+/*
+ * InvalidateTableSpaceCacheCallback
+ * Flush all cache entries when pg_tablespace is updated.
+ *
+ * When pg_tablespace is updated, we must flush the cache entry at least
+ * for that tablespace. Currently, we just flush them all. This is quick
+ * and easy and doesn't cost much, since there shouldn't be terribly many
+ * tablespaces, nor do we expect them to be frequently modified.
+ */
+static void
+InvalidateTableSpaceCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ HASH_SEQ_STATUS status;
+ TableSpaceCacheEntry *spc;
+
+ hash_seq_init(&status, TableSpaceCacheHash);
+ while ((spc = (TableSpaceCacheEntry *) hash_seq_search(&status)) != NULL)
+ {
+ if (spc->opts)
+ pfree(spc->opts);
+ if (hash_search(TableSpaceCacheHash,
+ (void *) &spc->oid,
+ HASH_REMOVE,
+ NULL) == NULL)
+ elog(ERROR, "hash table corrupted");
+ }
+}
+
+/*
+ * InitializeTableSpaceCache
+ * Initialize the tablespace cache.
+ */
+static void
+InitializeTableSpaceCache(void)
+{
+ HASHCTL ctl;
+
+ /* Initialize the hash table. */
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(TableSpaceCacheEntry);
+ TableSpaceCacheHash =
+ hash_create("TableSpace cache", 16, &ctl,
+ HASH_ELEM | HASH_BLOBS);
+
+ /* Make sure we've initialized CacheMemoryContext. */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+
+ /* Watch for invalidation events. */
+ CacheRegisterSyscacheCallback(TABLESPACEOID,
+ InvalidateTableSpaceCacheCallback,
+ (Datum) 0);
+}
+
+/*
+ * get_tablespace
+ * Fetch TableSpaceCacheEntry structure for a specified table OID.
+ *
+ * Pointers returned by this function should not be stored, since a cache
+ * flush will invalidate them.
+ */
+static TableSpaceCacheEntry *
+get_tablespace(Oid spcid)
+{
+ TableSpaceCacheEntry *spc;
+ HeapTuple tp;
+ TableSpaceOpts *opts;
+
+ /*
+ * Since spcid is always from a pg_class tuple, InvalidOid implies the
+ * default.
+ */
+ if (spcid == InvalidOid)
+ spcid = MyDatabaseTableSpace;
+
+ /* Find existing cache entry, if any. */
+ if (!TableSpaceCacheHash)
+ InitializeTableSpaceCache();
+ spc = (TableSpaceCacheEntry *) hash_search(TableSpaceCacheHash,
+ (void *) &spcid,
+ HASH_FIND,
+ NULL);
+ if (spc)
+ return spc;
+
+ /*
+ * Not found in TableSpace cache. Check catcache. If we don't find a
+ * valid HeapTuple, it must mean someone has managed to request tablespace
+ * details for a non-existent tablespace. We'll just treat that case as
+ * if no options were specified.
+ */
+ tp = SearchSysCache1(TABLESPACEOID, ObjectIdGetDatum(spcid));
+ if (!HeapTupleIsValid(tp))
+ opts = NULL;
+ else
+ {
+ Datum datum;
+ bool isNull;
+
+ datum = SysCacheGetAttr(TABLESPACEOID,
+ tp,
+ Anum_pg_tablespace_spcoptions,
+ &isNull);
+ if (isNull)
+ opts = NULL;
+ else
+ {
+ bytea *bytea_opts = tablespace_reloptions(datum, false);
+
+ opts = MemoryContextAlloc(CacheMemoryContext, VARSIZE(bytea_opts));
+ memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
+ }
+ ReleaseSysCache(tp);
+ }
+
+ /*
+ * Now create the cache entry. It's important to do this only after
+ * reading the pg_tablespace entry, since doing so could cause a cache
+ * flush.
+ */
+ spc = (TableSpaceCacheEntry *) hash_search(TableSpaceCacheHash,
+ (void *) &spcid,
+ HASH_ENTER,
+ NULL);
+ spc->opts = opts;
+ return spc;
+}
+
+/*
+ * get_tablespace_page_costs
+ * Return random and/or sequential page costs for a given tablespace.
+ *
+ * This value is not locked by the transaction, so this value may
+ * be changed while a SELECT that has used these values for planning
+ * is still executing.
+ */
+void
+get_tablespace_page_costs(Oid spcid,
+ double *spc_random_page_cost,
+ double *spc_seq_page_cost)
+{
+ TableSpaceCacheEntry *spc = get_tablespace(spcid);
+
+ Assert(spc != NULL);
+
+ if (spc_random_page_cost)
+ {
+ if (!spc->opts || spc->opts->random_page_cost < 0)
+ *spc_random_page_cost = random_page_cost;
+ else
+ *spc_random_page_cost = spc->opts->random_page_cost;
+ }
+
+ if (spc_seq_page_cost)
+ {
+ if (!spc->opts || spc->opts->seq_page_cost < 0)
+ *spc_seq_page_cost = seq_page_cost;
+ else
+ *spc_seq_page_cost = spc->opts->seq_page_cost;
+ }
+}
+
+/*
+ * get_tablespace_io_concurrency
+ *
+ * This value is not locked by the transaction, so this value may
+ * be changed while a SELECT that has used these values for planning
+ * is still executing.
+ */
+int
+get_tablespace_io_concurrency(Oid spcid)
+{
+ TableSpaceCacheEntry *spc = get_tablespace(spcid);
+
+ if (!spc->opts || spc->opts->effective_io_concurrency < 0)
+ return effective_io_concurrency;
+ else
+ return spc->opts->effective_io_concurrency;
+}
+
+/*
+ * get_tablespace_maintenance_io_concurrency
+ */
+int
+get_tablespace_maintenance_io_concurrency(Oid spcid)
+{
+ TableSpaceCacheEntry *spc = get_tablespace(spcid);
+
+ if (!spc->opts || spc->opts->maintenance_io_concurrency < 0)
+ return maintenance_io_concurrency;
+ else
+ return spc->opts->maintenance_io_concurrency;
+}
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
new file mode 100644
index 0000000..1912b12
--- /dev/null
+++ b/src/backend/utils/cache/syscache.c
@@ -0,0 +1,1611 @@
+/*-------------------------------------------------------------------------
+ *
+ * syscache.c
+ * System cache management routines
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/syscache.c
+ *
+ * NOTES
+ * These routines allow the parser/planner/executor to perform
+ * rapid lookups on the contents of the system catalogs.
+ *
+ * see utils/syscache.h for a list of the cache IDs
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/sysattr.h"
+#include "catalog/pg_aggregate.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_amop.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_cast.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_conversion.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_db_role_setting.h"
+#include "catalog/pg_default_acl.h"
+#include "catalog/pg_depend.h"
+#include "catalog/pg_description.h"
+#include "catalog/pg_enum.h"
+#include "catalog/pg_event_trigger.h"
+#include "catalog/pg_foreign_data_wrapper.h"
+#include "catalog/pg_foreign_server.h"
+#include "catalog/pg_foreign_table.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_namespace.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_opfamily.h"
+#include "catalog/pg_parameter_acl.h"
+#include "catalog/pg_partitioned_table.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_publication.h"
+#include "catalog/pg_publication_namespace.h"
+#include "catalog/pg_publication_rel.h"
+#include "catalog/pg_range.h"
+#include "catalog/pg_replication_origin.h"
+#include "catalog/pg_rewrite.h"
+#include "catalog/pg_seclabel.h"
+#include "catalog/pg_sequence.h"
+#include "catalog/pg_shdepend.h"
+#include "catalog/pg_shdescription.h"
+#include "catalog/pg_shseclabel.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_statistic_ext.h"
+#include "catalog/pg_statistic_ext_data.h"
+#include "catalog/pg_subscription.h"
+#include "catalog/pg_subscription_rel.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/pg_transform.h"
+#include "catalog/pg_ts_config.h"
+#include "catalog/pg_ts_config_map.h"
+#include "catalog/pg_ts_dict.h"
+#include "catalog/pg_ts_parser.h"
+#include "catalog/pg_ts_template.h"
+#include "catalog/pg_type.h"
+#include "catalog/pg_user_mapping.h"
+#include "lib/qunique.h"
+#include "utils/catcache.h"
+#include "utils/rel.h"
+#include "utils/syscache.h"
+
+/*---------------------------------------------------------------------------
+
+ Adding system caches:
+
+ Add your new cache to the list in include/utils/syscache.h.
+ Keep the list sorted alphabetically.
+
+ Add your entry to the cacheinfo[] array below. All cache lists are
+ alphabetical, so add it in the proper place. Specify the relation OID,
+ index OID, number of keys, key attribute numbers, and initial number of
+ hash buckets.
+
+ The number of hash buckets must be a power of 2. It's reasonable to
+ set this to the number of entries that might be in the particular cache
+ in a medium-size database.
+
+ There must be a unique index underlying each syscache (ie, an index
+ whose key is the same as that of the cache). If there is not one
+ already, add the definition for it to include/catalog/pg_*.h using
+ DECLARE_UNIQUE_INDEX.
+ (Adding an index requires a catversion.h update, while simply
+ adding/deleting caches only requires a recompile.)
+
+ Finally, any place your relation gets heap_insert() or
+ heap_update() calls, use CatalogTupleInsert() or CatalogTupleUpdate()
+ instead, which also update indexes. The heap_* calls do not do that.
+
+*---------------------------------------------------------------------------
+*/
+
+/*
+ * struct cachedesc: information defining a single syscache
+ */
+struct cachedesc
+{
+ Oid reloid; /* OID of the relation being cached */
+ Oid indoid; /* OID of index relation for this cache */
+ int nkeys; /* # of keys needed for cache lookup */
+ int key[4]; /* attribute numbers of key attrs */
+ int nbuckets; /* number of hash buckets for this cache */
+};
+
+static const struct cachedesc cacheinfo[] = {
+ {AggregateRelationId, /* AGGFNOID */
+ AggregateFnoidIndexId,
+ 1,
+ {
+ Anum_pg_aggregate_aggfnoid,
+ 0,
+ 0,
+ 0
+ },
+ 16
+ },
+ {AccessMethodRelationId, /* AMNAME */
+ AmNameIndexId,
+ 1,
+ {
+ Anum_pg_am_amname,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {AccessMethodRelationId, /* AMOID */
+ AmOidIndexId,
+ 1,
+ {
+ Anum_pg_am_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {AccessMethodOperatorRelationId, /* AMOPOPID */
+ AccessMethodOperatorIndexId,
+ 3,
+ {
+ Anum_pg_amop_amopopr,
+ Anum_pg_amop_amoppurpose,
+ Anum_pg_amop_amopfamily,
+ 0
+ },
+ 64
+ },
+ {AccessMethodOperatorRelationId, /* AMOPSTRATEGY */
+ AccessMethodStrategyIndexId,
+ 4,
+ {
+ Anum_pg_amop_amopfamily,
+ Anum_pg_amop_amoplefttype,
+ Anum_pg_amop_amoprighttype,
+ Anum_pg_amop_amopstrategy
+ },
+ 64
+ },
+ {AccessMethodProcedureRelationId, /* AMPROCNUM */
+ AccessMethodProcedureIndexId,
+ 4,
+ {
+ Anum_pg_amproc_amprocfamily,
+ Anum_pg_amproc_amproclefttype,
+ Anum_pg_amproc_amprocrighttype,
+ Anum_pg_amproc_amprocnum
+ },
+ 16
+ },
+ {AttributeRelationId, /* ATTNAME */
+ AttributeRelidNameIndexId,
+ 2,
+ {
+ Anum_pg_attribute_attrelid,
+ Anum_pg_attribute_attname,
+ 0,
+ 0
+ },
+ 32
+ },
+ {AttributeRelationId, /* ATTNUM */
+ AttributeRelidNumIndexId,
+ 2,
+ {
+ Anum_pg_attribute_attrelid,
+ Anum_pg_attribute_attnum,
+ 0,
+ 0
+ },
+ 128
+ },
+ {AuthMemRelationId, /* AUTHMEMMEMROLE */
+ AuthMemMemRoleIndexId,
+ 2,
+ {
+ Anum_pg_auth_members_member,
+ Anum_pg_auth_members_roleid,
+ 0,
+ 0
+ },
+ 8
+ },
+ {AuthMemRelationId, /* AUTHMEMROLEMEM */
+ AuthMemRoleMemIndexId,
+ 2,
+ {
+ Anum_pg_auth_members_roleid,
+ Anum_pg_auth_members_member,
+ 0,
+ 0
+ },
+ 8
+ },
+ {AuthIdRelationId, /* AUTHNAME */
+ AuthIdRolnameIndexId,
+ 1,
+ {
+ Anum_pg_authid_rolname,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {AuthIdRelationId, /* AUTHOID */
+ AuthIdOidIndexId,
+ 1,
+ {
+ Anum_pg_authid_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {
+ CastRelationId, /* CASTSOURCETARGET */
+ CastSourceTargetIndexId,
+ 2,
+ {
+ Anum_pg_cast_castsource,
+ Anum_pg_cast_casttarget,
+ 0,
+ 0
+ },
+ 256
+ },
+ {OperatorClassRelationId, /* CLAAMNAMENSP */
+ OpclassAmNameNspIndexId,
+ 3,
+ {
+ Anum_pg_opclass_opcmethod,
+ Anum_pg_opclass_opcname,
+ Anum_pg_opclass_opcnamespace,
+ 0
+ },
+ 8
+ },
+ {OperatorClassRelationId, /* CLAOID */
+ OpclassOidIndexId,
+ 1,
+ {
+ Anum_pg_opclass_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {CollationRelationId, /* COLLNAMEENCNSP */
+ CollationNameEncNspIndexId,
+ 3,
+ {
+ Anum_pg_collation_collname,
+ Anum_pg_collation_collencoding,
+ Anum_pg_collation_collnamespace,
+ 0
+ },
+ 8
+ },
+ {CollationRelationId, /* COLLOID */
+ CollationOidIndexId,
+ 1,
+ {
+ Anum_pg_collation_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {ConversionRelationId, /* CONDEFAULT */
+ ConversionDefaultIndexId,
+ 4,
+ {
+ Anum_pg_conversion_connamespace,
+ Anum_pg_conversion_conforencoding,
+ Anum_pg_conversion_contoencoding,
+ Anum_pg_conversion_oid
+ },
+ 8
+ },
+ {ConversionRelationId, /* CONNAMENSP */
+ ConversionNameNspIndexId,
+ 2,
+ {
+ Anum_pg_conversion_conname,
+ Anum_pg_conversion_connamespace,
+ 0,
+ 0
+ },
+ 8
+ },
+ {ConstraintRelationId, /* CONSTROID */
+ ConstraintOidIndexId,
+ 1,
+ {
+ Anum_pg_constraint_oid,
+ 0,
+ 0,
+ 0
+ },
+ 16
+ },
+ {ConversionRelationId, /* CONVOID */
+ ConversionOidIndexId,
+ 1,
+ {
+ Anum_pg_conversion_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {DatabaseRelationId, /* DATABASEOID */
+ DatabaseOidIndexId,
+ 1,
+ {
+ Anum_pg_database_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {DefaultAclRelationId, /* DEFACLROLENSPOBJ */
+ DefaultAclRoleNspObjIndexId,
+ 3,
+ {
+ Anum_pg_default_acl_defaclrole,
+ Anum_pg_default_acl_defaclnamespace,
+ Anum_pg_default_acl_defaclobjtype,
+ 0
+ },
+ 8
+ },
+ {EnumRelationId, /* ENUMOID */
+ EnumOidIndexId,
+ 1,
+ {
+ Anum_pg_enum_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {EnumRelationId, /* ENUMTYPOIDNAME */
+ EnumTypIdLabelIndexId,
+ 2,
+ {
+ Anum_pg_enum_enumtypid,
+ Anum_pg_enum_enumlabel,
+ 0,
+ 0
+ },
+ 8
+ },
+ {EventTriggerRelationId, /* EVENTTRIGGERNAME */
+ EventTriggerNameIndexId,
+ 1,
+ {
+ Anum_pg_event_trigger_evtname,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {EventTriggerRelationId, /* EVENTTRIGGEROID */
+ EventTriggerOidIndexId,
+ 1,
+ {
+ Anum_pg_event_trigger_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {ForeignDataWrapperRelationId, /* FOREIGNDATAWRAPPERNAME */
+ ForeignDataWrapperNameIndexId,
+ 1,
+ {
+ Anum_pg_foreign_data_wrapper_fdwname,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {ForeignDataWrapperRelationId, /* FOREIGNDATAWRAPPEROID */
+ ForeignDataWrapperOidIndexId,
+ 1,
+ {
+ Anum_pg_foreign_data_wrapper_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {ForeignServerRelationId, /* FOREIGNSERVERNAME */
+ ForeignServerNameIndexId,
+ 1,
+ {
+ Anum_pg_foreign_server_srvname,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {ForeignServerRelationId, /* FOREIGNSERVEROID */
+ ForeignServerOidIndexId,
+ 1,
+ {
+ Anum_pg_foreign_server_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {ForeignTableRelationId, /* FOREIGNTABLEREL */
+ ForeignTableRelidIndexId,
+ 1,
+ {
+ Anum_pg_foreign_table_ftrelid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {IndexRelationId, /* INDEXRELID */
+ IndexRelidIndexId,
+ 1,
+ {
+ Anum_pg_index_indexrelid,
+ 0,
+ 0,
+ 0
+ },
+ 64
+ },
+ {LanguageRelationId, /* LANGNAME */
+ LanguageNameIndexId,
+ 1,
+ {
+ Anum_pg_language_lanname,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {LanguageRelationId, /* LANGOID */
+ LanguageOidIndexId,
+ 1,
+ {
+ Anum_pg_language_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {NamespaceRelationId, /* NAMESPACENAME */
+ NamespaceNameIndexId,
+ 1,
+ {
+ Anum_pg_namespace_nspname,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {NamespaceRelationId, /* NAMESPACEOID */
+ NamespaceOidIndexId,
+ 1,
+ {
+ Anum_pg_namespace_oid,
+ 0,
+ 0,
+ 0
+ },
+ 16
+ },
+ {OperatorRelationId, /* OPERNAMENSP */
+ OperatorNameNspIndexId,
+ 4,
+ {
+ Anum_pg_operator_oprname,
+ Anum_pg_operator_oprleft,
+ Anum_pg_operator_oprright,
+ Anum_pg_operator_oprnamespace
+ },
+ 256
+ },
+ {OperatorRelationId, /* OPEROID */
+ OperatorOidIndexId,
+ 1,
+ {
+ Anum_pg_operator_oid,
+ 0,
+ 0,
+ 0
+ },
+ 32
+ },
+ {OperatorFamilyRelationId, /* OPFAMILYAMNAMENSP */
+ OpfamilyAmNameNspIndexId,
+ 3,
+ {
+ Anum_pg_opfamily_opfmethod,
+ Anum_pg_opfamily_opfname,
+ Anum_pg_opfamily_opfnamespace,
+ 0
+ },
+ 8
+ },
+ {OperatorFamilyRelationId, /* OPFAMILYOID */
+ OpfamilyOidIndexId,
+ 1,
+ {
+ Anum_pg_opfamily_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {ParameterAclRelationId, /* PARAMETERACLNAME */
+ ParameterAclParnameIndexId,
+ 1,
+ {
+ Anum_pg_parameter_acl_parname,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {ParameterAclRelationId, /* PARAMETERACLOID */
+ ParameterAclOidIndexId,
+ 1,
+ {
+ Anum_pg_parameter_acl_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {PartitionedRelationId, /* PARTRELID */
+ PartitionedRelidIndexId,
+ 1,
+ {
+ Anum_pg_partitioned_table_partrelid,
+ 0,
+ 0,
+ 0
+ },
+ 32
+ },
+ {ProcedureRelationId, /* PROCNAMEARGSNSP */
+ ProcedureNameArgsNspIndexId,
+ 3,
+ {
+ Anum_pg_proc_proname,
+ Anum_pg_proc_proargtypes,
+ Anum_pg_proc_pronamespace,
+ 0
+ },
+ 128
+ },
+ {ProcedureRelationId, /* PROCOID */
+ ProcedureOidIndexId,
+ 1,
+ {
+ Anum_pg_proc_oid,
+ 0,
+ 0,
+ 0
+ },
+ 128
+ },
+ {PublicationRelationId, /* PUBLICATIONNAME */
+ PublicationNameIndexId,
+ 1,
+ {
+ Anum_pg_publication_pubname,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {PublicationNamespaceRelationId, /* PUBLICATIONNAMESPACE */
+ PublicationNamespaceObjectIndexId,
+ 1,
+ {
+ Anum_pg_publication_namespace_oid,
+ 0,
+ 0,
+ 0
+ },
+ 64
+ },
+ {PublicationNamespaceRelationId, /* PUBLICATIONNAMESPACEMAP */
+ PublicationNamespacePnnspidPnpubidIndexId,
+ 2,
+ {
+ Anum_pg_publication_namespace_pnnspid,
+ Anum_pg_publication_namespace_pnpubid,
+ 0,
+ 0
+ },
+ 64
+ },
+ {PublicationRelationId, /* PUBLICATIONOID */
+ PublicationObjectIndexId,
+ 1,
+ {
+ Anum_pg_publication_oid,
+ 0,
+ 0,
+ 0
+ },
+ 8
+ },
+ {PublicationRelRelationId, /* PUBLICATIONREL */
+ PublicationRelObjectIndexId,
+ 1,
+ {
+ Anum_pg_publication_rel_oid,
+ 0,
+ 0,
+ 0
+ },
+ 64
+ },
+ {PublicationRelRelationId, /* PUBLICATIONRELMAP */
+ PublicationRelPrrelidPrpubidIndexId,
+ 2,
+ {
+ Anum_pg_publication_rel_prrelid,
+ Anum_pg_publication_rel_prpubid,
+ 0,
+ 0
+ },
+ 64
+ },
+ {RangeRelationId, /* RANGEMULTIRANGE */
+ RangeMultirangeTypidIndexId,
+ 1,
+ {
+ Anum_pg_range_rngmultitypid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+
+ {RangeRelationId, /* RANGETYPE */
+ RangeTypidIndexId,
+ 1,
+ {
+ Anum_pg_range_rngtypid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {RelationRelationId, /* RELNAMENSP */
+ ClassNameNspIndexId,
+ 2,
+ {
+ Anum_pg_class_relname,
+ Anum_pg_class_relnamespace,
+ 0,
+ 0
+ },
+ 128
+ },
+ {RelationRelationId, /* RELOID */
+ ClassOidIndexId,
+ 1,
+ {
+ Anum_pg_class_oid,
+ 0,
+ 0,
+ 0
+ },
+ 128
+ },
+ {ReplicationOriginRelationId, /* REPLORIGIDENT */
+ ReplicationOriginIdentIndex,
+ 1,
+ {
+ Anum_pg_replication_origin_roident,
+ 0,
+ 0,
+ 0
+ },
+ 16
+ },
+ {ReplicationOriginRelationId, /* REPLORIGNAME */
+ ReplicationOriginNameIndex,
+ 1,
+ {
+ Anum_pg_replication_origin_roname,
+ 0,
+ 0,
+ 0
+ },
+ 16
+ },
+ {RewriteRelationId, /* RULERELNAME */
+ RewriteRelRulenameIndexId,
+ 2,
+ {
+ Anum_pg_rewrite_ev_class,
+ Anum_pg_rewrite_rulename,
+ 0,
+ 0
+ },
+ 8
+ },
+ {SequenceRelationId, /* SEQRELID */
+ SequenceRelidIndexId,
+ 1,
+ {
+ Anum_pg_sequence_seqrelid,
+ 0,
+ 0,
+ 0
+ },
+ 32
+ },
+ {StatisticExtDataRelationId, /* STATEXTDATASTXOID */
+ StatisticExtDataStxoidInhIndexId,
+ 2,
+ {
+ Anum_pg_statistic_ext_data_stxoid,
+ Anum_pg_statistic_ext_data_stxdinherit,
+ 0,
+ 0
+ },
+ 4
+ },
+ {StatisticExtRelationId, /* STATEXTNAMENSP */
+ StatisticExtNameIndexId,
+ 2,
+ {
+ Anum_pg_statistic_ext_stxname,
+ Anum_pg_statistic_ext_stxnamespace,
+ 0,
+ 0
+ },
+ 4
+ },
+ {StatisticExtRelationId, /* STATEXTOID */
+ StatisticExtOidIndexId,
+ 1,
+ {
+ Anum_pg_statistic_ext_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {StatisticRelationId, /* STATRELATTINH */
+ StatisticRelidAttnumInhIndexId,
+ 3,
+ {
+ Anum_pg_statistic_starelid,
+ Anum_pg_statistic_staattnum,
+ Anum_pg_statistic_stainherit,
+ 0
+ },
+ 128
+ },
+ {SubscriptionRelationId, /* SUBSCRIPTIONNAME */
+ SubscriptionNameIndexId,
+ 2,
+ {
+ Anum_pg_subscription_subdbid,
+ Anum_pg_subscription_subname,
+ 0,
+ 0
+ },
+ 4
+ },
+ {SubscriptionRelationId, /* SUBSCRIPTIONOID */
+ SubscriptionObjectIndexId,
+ 1,
+ {
+ Anum_pg_subscription_oid,
+ 0,
+ 0,
+ 0
+ },
+ 4
+ },
+ {SubscriptionRelRelationId, /* SUBSCRIPTIONRELMAP */
+ SubscriptionRelSrrelidSrsubidIndexId,
+ 2,
+ {
+ Anum_pg_subscription_rel_srrelid,
+ Anum_pg_subscription_rel_srsubid,
+ 0,
+ 0
+ },
+ 64
+ },
+ {TableSpaceRelationId, /* TABLESPACEOID */
+ TablespaceOidIndexId,
+ 1,
+ {
+ Anum_pg_tablespace_oid,
+ 0,
+ 0,
+ 0,
+ },
+ 4
+ },
+ {TransformRelationId, /* TRFOID */
+ TransformOidIndexId,
+ 1,
+ {
+ Anum_pg_transform_oid,
+ 0,
+ 0,
+ 0,
+ },
+ 16
+ },
+ {TransformRelationId, /* TRFTYPELANG */
+ TransformTypeLangIndexId,
+ 2,
+ {
+ Anum_pg_transform_trftype,
+ Anum_pg_transform_trflang,
+ 0,
+ 0,
+ },
+ 16
+ },
+ {TSConfigMapRelationId, /* TSCONFIGMAP */
+ TSConfigMapIndexId,
+ 3,
+ {
+ Anum_pg_ts_config_map_mapcfg,
+ Anum_pg_ts_config_map_maptokentype,
+ Anum_pg_ts_config_map_mapseqno,
+ 0
+ },
+ 2
+ },
+ {TSConfigRelationId, /* TSCONFIGNAMENSP */
+ TSConfigNameNspIndexId,
+ 2,
+ {
+ Anum_pg_ts_config_cfgname,
+ Anum_pg_ts_config_cfgnamespace,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSConfigRelationId, /* TSCONFIGOID */
+ TSConfigOidIndexId,
+ 1,
+ {
+ Anum_pg_ts_config_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSDictionaryRelationId, /* TSDICTNAMENSP */
+ TSDictionaryNameNspIndexId,
+ 2,
+ {
+ Anum_pg_ts_dict_dictname,
+ Anum_pg_ts_dict_dictnamespace,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSDictionaryRelationId, /* TSDICTOID */
+ TSDictionaryOidIndexId,
+ 1,
+ {
+ Anum_pg_ts_dict_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSParserRelationId, /* TSPARSERNAMENSP */
+ TSParserNameNspIndexId,
+ 2,
+ {
+ Anum_pg_ts_parser_prsname,
+ Anum_pg_ts_parser_prsnamespace,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSParserRelationId, /* TSPARSEROID */
+ TSParserOidIndexId,
+ 1,
+ {
+ Anum_pg_ts_parser_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSTemplateRelationId, /* TSTEMPLATENAMENSP */
+ TSTemplateNameNspIndexId,
+ 2,
+ {
+ Anum_pg_ts_template_tmplname,
+ Anum_pg_ts_template_tmplnamespace,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TSTemplateRelationId, /* TSTEMPLATEOID */
+ TSTemplateOidIndexId,
+ 1,
+ {
+ Anum_pg_ts_template_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {TypeRelationId, /* TYPENAMENSP */
+ TypeNameNspIndexId,
+ 2,
+ {
+ Anum_pg_type_typname,
+ Anum_pg_type_typnamespace,
+ 0,
+ 0
+ },
+ 64
+ },
+ {TypeRelationId, /* TYPEOID */
+ TypeOidIndexId,
+ 1,
+ {
+ Anum_pg_type_oid,
+ 0,
+ 0,
+ 0
+ },
+ 64
+ },
+ {UserMappingRelationId, /* USERMAPPINGOID */
+ UserMappingOidIndexId,
+ 1,
+ {
+ Anum_pg_user_mapping_oid,
+ 0,
+ 0,
+ 0
+ },
+ 2
+ },
+ {UserMappingRelationId, /* USERMAPPINGUSERSERVER */
+ UserMappingUserServerIndexId,
+ 2,
+ {
+ Anum_pg_user_mapping_umuser,
+ Anum_pg_user_mapping_umserver,
+ 0,
+ 0
+ },
+ 2
+ }
+};
+
+static CatCache *SysCache[SysCacheSize];
+
+static bool CacheInitialized = false;
+
+/* Sorted array of OIDs of tables that have caches on them */
+static Oid SysCacheRelationOid[SysCacheSize];
+static int SysCacheRelationOidSize;
+
+/* Sorted array of OIDs of tables and indexes used by caches */
+static Oid SysCacheSupportingRelOid[SysCacheSize * 2];
+static int SysCacheSupportingRelOidSize;
+
+static int oid_compare(const void *a, const void *b);
+
+
+/*
+ * InitCatalogCache - initialize the caches
+ *
+ * Note that no database access is done here; we only allocate memory
+ * and initialize the cache structure. Interrogation of the database
+ * to complete initialization of a cache happens upon first use
+ * of that cache.
+ */
+void
+InitCatalogCache(void)
+{
+ int cacheId;
+
+ StaticAssertStmt(SysCacheSize == (int) lengthof(cacheinfo),
+ "SysCacheSize does not match syscache.c's array");
+
+ Assert(!CacheInitialized);
+
+ SysCacheRelationOidSize = SysCacheSupportingRelOidSize = 0;
+
+ for (cacheId = 0; cacheId < SysCacheSize; cacheId++)
+ {
+ SysCache[cacheId] = InitCatCache(cacheId,
+ cacheinfo[cacheId].reloid,
+ cacheinfo[cacheId].indoid,
+ cacheinfo[cacheId].nkeys,
+ cacheinfo[cacheId].key,
+ cacheinfo[cacheId].nbuckets);
+ if (!PointerIsValid(SysCache[cacheId]))
+ elog(ERROR, "could not initialize cache %u (%d)",
+ cacheinfo[cacheId].reloid, cacheId);
+ /* Accumulate data for OID lists, too */
+ SysCacheRelationOid[SysCacheRelationOidSize++] =
+ cacheinfo[cacheId].reloid;
+ SysCacheSupportingRelOid[SysCacheSupportingRelOidSize++] =
+ cacheinfo[cacheId].reloid;
+ SysCacheSupportingRelOid[SysCacheSupportingRelOidSize++] =
+ cacheinfo[cacheId].indoid;
+ /* see comments for RelationInvalidatesSnapshotsOnly */
+ Assert(!RelationInvalidatesSnapshotsOnly(cacheinfo[cacheId].reloid));
+ }
+
+ Assert(SysCacheRelationOidSize <= lengthof(SysCacheRelationOid));
+ Assert(SysCacheSupportingRelOidSize <= lengthof(SysCacheSupportingRelOid));
+
+ /* Sort and de-dup OID arrays, so we can use binary search. */
+ pg_qsort(SysCacheRelationOid, SysCacheRelationOidSize,
+ sizeof(Oid), oid_compare);
+ SysCacheRelationOidSize =
+ qunique(SysCacheRelationOid, SysCacheRelationOidSize, sizeof(Oid),
+ oid_compare);
+
+ pg_qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize,
+ sizeof(Oid), oid_compare);
+ SysCacheSupportingRelOidSize =
+ qunique(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize,
+ sizeof(Oid), oid_compare);
+
+ CacheInitialized = true;
+}
+
+/*
+ * InitCatalogCachePhase2 - finish initializing the caches
+ *
+ * Finish initializing all the caches, including necessary database
+ * access.
+ *
+ * This is *not* essential; normally we allow syscaches to be initialized
+ * on first use. However, it is useful as a mechanism to preload the
+ * relcache with entries for the most-commonly-used system catalogs.
+ * Therefore, we invoke this routine when we need to write a new relcache
+ * init file.
+ */
+void
+InitCatalogCachePhase2(void)
+{
+ int cacheId;
+
+ Assert(CacheInitialized);
+
+ for (cacheId = 0; cacheId < SysCacheSize; cacheId++)
+ InitCatCachePhase2(SysCache[cacheId], true);
+}
+
+
+/*
+ * SearchSysCache
+ *
+ * A layer on top of SearchCatCache that does the initialization and
+ * key-setting for you.
+ *
+ * Returns the cache copy of the tuple if one is found, NULL if not.
+ * The tuple is the 'cache' copy and must NOT be modified!
+ *
+ * When the caller is done using the tuple, call ReleaseSysCache()
+ * to release the reference count grabbed by SearchSysCache(). If this
+ * is not done, the tuple will remain locked in cache until end of
+ * transaction, which is tolerable but not desirable.
+ *
+ * CAUTION: The tuple that is returned must NOT be freed by the caller!
+ */
+HeapTuple
+SearchSysCache(int cacheId,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
+{
+ Assert(cacheId >= 0 && cacheId < SysCacheSize &&
+ PointerIsValid(SysCache[cacheId]));
+
+ return SearchCatCache(SysCache[cacheId], key1, key2, key3, key4);
+}
+
+HeapTuple
+SearchSysCache1(int cacheId,
+ Datum key1)
+{
+ Assert(cacheId >= 0 && cacheId < SysCacheSize &&
+ PointerIsValid(SysCache[cacheId]));
+ Assert(SysCache[cacheId]->cc_nkeys == 1);
+
+ return SearchCatCache1(SysCache[cacheId], key1);
+}
+
+HeapTuple
+SearchSysCache2(int cacheId,
+ Datum key1, Datum key2)
+{
+ Assert(cacheId >= 0 && cacheId < SysCacheSize &&
+ PointerIsValid(SysCache[cacheId]));
+ Assert(SysCache[cacheId]->cc_nkeys == 2);
+
+ return SearchCatCache2(SysCache[cacheId], key1, key2);
+}
+
+HeapTuple
+SearchSysCache3(int cacheId,
+ Datum key1, Datum key2, Datum key3)
+{
+ Assert(cacheId >= 0 && cacheId < SysCacheSize &&
+ PointerIsValid(SysCache[cacheId]));
+ Assert(SysCache[cacheId]->cc_nkeys == 3);
+
+ return SearchCatCache3(SysCache[cacheId], key1, key2, key3);
+}
+
+HeapTuple
+SearchSysCache4(int cacheId,
+ Datum key1, Datum key2, Datum key3, Datum key4)
+{
+ Assert(cacheId >= 0 && cacheId < SysCacheSize &&
+ PointerIsValid(SysCache[cacheId]));
+ Assert(SysCache[cacheId]->cc_nkeys == 4);
+
+ return SearchCatCache4(SysCache[cacheId], key1, key2, key3, key4);
+}
+
+/*
+ * ReleaseSysCache
+ * Release previously grabbed reference count on a tuple
+ */
+void
+ReleaseSysCache(HeapTuple tuple)
+{
+ ReleaseCatCache(tuple);
+}
+
+/*
+ * SearchSysCacheCopy
+ *
+ * A convenience routine that does SearchSysCache and (if successful)
+ * returns a modifiable copy of the syscache entry. The original
+ * syscache entry is released before returning. The caller should
+ * heap_freetuple() the result when done with it.
+ */
+HeapTuple
+SearchSysCacheCopy(int cacheId,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
+{
+ HeapTuple tuple,
+ newtuple;
+
+ tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+ if (!HeapTupleIsValid(tuple))
+ return tuple;
+ newtuple = heap_copytuple(tuple);
+ ReleaseSysCache(tuple);
+ return newtuple;
+}
+
+/*
+ * SearchSysCacheExists
+ *
+ * A convenience routine that just probes to see if a tuple can be found.
+ * No lock is retained on the syscache entry.
+ */
+bool
+SearchSysCacheExists(int cacheId,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
+{
+ HeapTuple tuple;
+
+ tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+ if (!HeapTupleIsValid(tuple))
+ return false;
+ ReleaseSysCache(tuple);
+ return true;
+}
+
+/*
+ * GetSysCacheOid
+ *
+ * A convenience routine that does SearchSysCache and returns the OID in the
+ * oidcol column of the found tuple, or InvalidOid if no tuple could be found.
+ * No lock is retained on the syscache entry.
+ */
+Oid
+GetSysCacheOid(int cacheId,
+ AttrNumber oidcol,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
+{
+ HeapTuple tuple;
+ bool isNull;
+ Oid result;
+
+ tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+ if (!HeapTupleIsValid(tuple))
+ return InvalidOid;
+ result = heap_getattr(tuple, oidcol,
+ SysCache[cacheId]->cc_tupdesc,
+ &isNull);
+ Assert(!isNull); /* columns used as oids should never be NULL */
+ ReleaseSysCache(tuple);
+ return result;
+}
+
+
+/*
+ * SearchSysCacheAttName
+ *
+ * This routine is equivalent to SearchSysCache on the ATTNAME cache,
+ * except that it will return NULL if the found attribute is marked
+ * attisdropped. This is convenient for callers that want to act as
+ * though dropped attributes don't exist.
+ */
+HeapTuple
+SearchSysCacheAttName(Oid relid, const char *attname)
+{
+ HeapTuple tuple;
+
+ tuple = SearchSysCache2(ATTNAME,
+ ObjectIdGetDatum(relid),
+ CStringGetDatum(attname));
+ if (!HeapTupleIsValid(tuple))
+ return NULL;
+ if (((Form_pg_attribute) GETSTRUCT(tuple))->attisdropped)
+ {
+ ReleaseSysCache(tuple);
+ return NULL;
+ }
+ return tuple;
+}
+
+/*
+ * SearchSysCacheCopyAttName
+ *
+ * As above, an attisdropped-aware version of SearchSysCacheCopy.
+ */
+HeapTuple
+SearchSysCacheCopyAttName(Oid relid, const char *attname)
+{
+ HeapTuple tuple,
+ newtuple;
+
+ tuple = SearchSysCacheAttName(relid, attname);
+ if (!HeapTupleIsValid(tuple))
+ return tuple;
+ newtuple = heap_copytuple(tuple);
+ ReleaseSysCache(tuple);
+ return newtuple;
+}
+
+/*
+ * SearchSysCacheExistsAttName
+ *
+ * As above, an attisdropped-aware version of SearchSysCacheExists.
+ */
+bool
+SearchSysCacheExistsAttName(Oid relid, const char *attname)
+{
+ HeapTuple tuple;
+
+ tuple = SearchSysCacheAttName(relid, attname);
+ if (!HeapTupleIsValid(tuple))
+ return false;
+ ReleaseSysCache(tuple);
+ return true;
+}
+
+
+/*
+ * SearchSysCacheAttNum
+ *
+ * This routine is equivalent to SearchSysCache on the ATTNUM cache,
+ * except that it will return NULL if the found attribute is marked
+ * attisdropped. This is convenient for callers that want to act as
+ * though dropped attributes don't exist.
+ */
+HeapTuple
+SearchSysCacheAttNum(Oid relid, int16 attnum)
+{
+ HeapTuple tuple;
+
+ tuple = SearchSysCache2(ATTNUM,
+ ObjectIdGetDatum(relid),
+ Int16GetDatum(attnum));
+ if (!HeapTupleIsValid(tuple))
+ return NULL;
+ if (((Form_pg_attribute) GETSTRUCT(tuple))->attisdropped)
+ {
+ ReleaseSysCache(tuple);
+ return NULL;
+ }
+ return tuple;
+}
+
+/*
+ * SearchSysCacheCopyAttNum
+ *
+ * As above, an attisdropped-aware version of SearchSysCacheCopy.
+ */
+HeapTuple
+SearchSysCacheCopyAttNum(Oid relid, int16 attnum)
+{
+ HeapTuple tuple,
+ newtuple;
+
+ tuple = SearchSysCacheAttNum(relid, attnum);
+ if (!HeapTupleIsValid(tuple))
+ return NULL;
+ newtuple = heap_copytuple(tuple);
+ ReleaseSysCache(tuple);
+ return newtuple;
+}
+
+
+/*
+ * SysCacheGetAttr
+ *
+ * Given a tuple previously fetched by SearchSysCache(),
+ * extract a specific attribute.
+ *
+ * This is equivalent to using heap_getattr() on a tuple fetched
+ * from a non-cached relation. Usually, this is only used for attributes
+ * that could be NULL or variable length; the fixed-size attributes in
+ * a system table are accessed just by mapping the tuple onto the C struct
+ * declarations from include/catalog/.
+ *
+ * As with heap_getattr(), if the attribute is of a pass-by-reference type
+ * then a pointer into the tuple data area is returned --- the caller must
+ * not modify or pfree the datum!
+ *
+ * Note: it is legal to use SysCacheGetAttr() with a cacheId referencing
+ * a different cache for the same catalog the tuple was fetched from.
+ */
+Datum
+SysCacheGetAttr(int cacheId, HeapTuple tup,
+ AttrNumber attributeNumber,
+ bool *isNull)
+{
+ /*
+ * We just need to get the TupleDesc out of the cache entry, and then we
+ * can apply heap_getattr(). Normally the cache control data is already
+ * valid (because the caller recently fetched the tuple via this same
+ * cache), but there are cases where we have to initialize the cache here.
+ */
+ if (cacheId < 0 || cacheId >= SysCacheSize ||
+ !PointerIsValid(SysCache[cacheId]))
+ elog(ERROR, "invalid cache ID: %d", cacheId);
+ if (!PointerIsValid(SysCache[cacheId]->cc_tupdesc))
+ {
+ InitCatCachePhase2(SysCache[cacheId], false);
+ Assert(PointerIsValid(SysCache[cacheId]->cc_tupdesc));
+ }
+
+ return heap_getattr(tup, attributeNumber,
+ SysCache[cacheId]->cc_tupdesc,
+ isNull);
+}
+
+/*
+ * GetSysCacheHashValue
+ *
+ * Get the hash value that would be used for a tuple in the specified cache
+ * with the given search keys.
+ *
+ * The reason for exposing this as part of the API is that the hash value is
+ * exposed in cache invalidation operations, so there are places outside the
+ * catcache code that need to be able to compute the hash values.
+ */
+uint32
+GetSysCacheHashValue(int cacheId,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
+{
+ if (cacheId < 0 || cacheId >= SysCacheSize ||
+ !PointerIsValid(SysCache[cacheId]))
+ elog(ERROR, "invalid cache ID: %d", cacheId);
+
+ return GetCatCacheHashValue(SysCache[cacheId], key1, key2, key3, key4);
+}
+
+/*
+ * List-search interface
+ */
+struct catclist *
+SearchSysCacheList(int cacheId, int nkeys,
+ Datum key1, Datum key2, Datum key3)
+{
+ if (cacheId < 0 || cacheId >= SysCacheSize ||
+ !PointerIsValid(SysCache[cacheId]))
+ elog(ERROR, "invalid cache ID: %d", cacheId);
+
+ return SearchCatCacheList(SysCache[cacheId], nkeys,
+ key1, key2, key3);
+}
+
+/*
+ * SysCacheInvalidate
+ *
+ * Invalidate entries in the specified cache, given a hash value.
+ * See CatCacheInvalidate() for more info.
+ *
+ * This routine is only quasi-public: it should only be used by inval.c.
+ */
+void
+SysCacheInvalidate(int cacheId, uint32 hashValue)
+{
+ if (cacheId < 0 || cacheId >= SysCacheSize)
+ elog(ERROR, "invalid cache ID: %d", cacheId);
+
+ /* if this cache isn't initialized yet, no need to do anything */
+ if (!PointerIsValid(SysCache[cacheId]))
+ return;
+
+ CatCacheInvalidate(SysCache[cacheId], hashValue);
+}
+
+/*
+ * Certain relations that do not have system caches send snapshot invalidation
+ * messages in lieu of catcache messages. This is for the benefit of
+ * GetCatalogSnapshot(), which can then reuse its existing MVCC snapshot
+ * for scanning one of those catalogs, rather than taking a new one, if no
+ * invalidation has been received.
+ *
+ * Relations that have syscaches need not (and must not) be listed here. The
+ * catcache invalidation messages will also flush the snapshot. If you add a
+ * syscache for one of these relations, remove it from this list.
+ */
+bool
+RelationInvalidatesSnapshotsOnly(Oid relid)
+{
+ switch (relid)
+ {
+ case DbRoleSettingRelationId:
+ case DependRelationId:
+ case SharedDependRelationId:
+ case DescriptionRelationId:
+ case SharedDescriptionRelationId:
+ case SecLabelRelationId:
+ case SharedSecLabelRelationId:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+/*
+ * Test whether a relation has a system cache.
+ */
+bool
+RelationHasSysCache(Oid relid)
+{
+ int low = 0,
+ high = SysCacheRelationOidSize - 1;
+
+ while (low <= high)
+ {
+ int middle = low + (high - low) / 2;
+
+ if (SysCacheRelationOid[middle] == relid)
+ return true;
+ if (SysCacheRelationOid[middle] < relid)
+ low = middle + 1;
+ else
+ high = middle - 1;
+ }
+
+ return false;
+}
+
+/*
+ * Test whether a relation supports a system cache, ie it is either a
+ * cached table or the index used for a cache.
+ */
+bool
+RelationSupportsSysCache(Oid relid)
+{
+ int low = 0,
+ high = SysCacheSupportingRelOidSize - 1;
+
+ while (low <= high)
+ {
+ int middle = low + (high - low) / 2;
+
+ if (SysCacheSupportingRelOid[middle] == relid)
+ return true;
+ if (SysCacheSupportingRelOid[middle] < relid)
+ low = middle + 1;
+ else
+ high = middle - 1;
+ }
+
+ return false;
+}
+
+
+/*
+ * OID comparator for pg_qsort
+ */
+static int
+oid_compare(const void *a, const void *b)
+{
+ Oid oa = *((const Oid *) a);
+ Oid ob = *((const Oid *) b);
+
+ if (oa == ob)
+ return 0;
+ return (oa > ob) ? 1 : -1;
+}
diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c
new file mode 100644
index 0000000..24808df
--- /dev/null
+++ b/src/backend/utils/cache/ts_cache.c
@@ -0,0 +1,652 @@
+/*-------------------------------------------------------------------------
+ *
+ * ts_cache.c
+ * Tsearch related object caches.
+ *
+ * Tsearch performance is very sensitive to performance of parsers,
+ * dictionaries and mapping, so lookups should be cached as much
+ * as possible.
+ *
+ * Once a backend has created a cache entry for a particular TS object OID,
+ * the cache entry will exist for the life of the backend; hence it is
+ * safe to hold onto a pointer to the cache entry while doing things that
+ * might result in recognizing a cache invalidation. Beware however that
+ * subsidiary information might be deleted and reallocated somewhere else
+ * if a cache inval and reval happens! This does not look like it will be
+ * a big problem as long as parser and dictionary methods do not attempt
+ * any database access.
+ *
+ *
+ * Copyright (c) 2006-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/ts_cache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/genam.h"
+#include "access/htup_details.h"
+#include "access/table.h"
+#include "access/xact.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_ts_config.h"
+#include "catalog/pg_ts_config_map.h"
+#include "catalog/pg_ts_dict.h"
+#include "catalog/pg_ts_parser.h"
+#include "catalog/pg_ts_template.h"
+#include "commands/defrem.h"
+#include "miscadmin.h"
+#include "tsearch/ts_cache.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/fmgroids.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/regproc.h"
+#include "utils/syscache.h"
+
+
+/*
+ * MAXTOKENTYPE/MAXDICTSPERTT are arbitrary limits on the workspace size
+ * used in lookup_ts_config_cache(). We could avoid hardwiring a limit
+ * by making the workspace dynamically enlargeable, but it seems unlikely
+ * to be worth the trouble.
+ */
+#define MAXTOKENTYPE 256
+#define MAXDICTSPERTT 100
+
+
+static HTAB *TSParserCacheHash = NULL;
+static TSParserCacheEntry *lastUsedParser = NULL;
+
+static HTAB *TSDictionaryCacheHash = NULL;
+static TSDictionaryCacheEntry *lastUsedDictionary = NULL;
+
+static HTAB *TSConfigCacheHash = NULL;
+static TSConfigCacheEntry *lastUsedConfig = NULL;
+
+/*
+ * GUC default_text_search_config, and a cache of the current config's OID
+ */
+char *TSCurrentConfig = NULL;
+
+static Oid TSCurrentConfigCache = InvalidOid;
+
+
+/*
+ * We use this syscache callback to detect when a visible change to a TS
+ * catalog entry has been made, by either our own backend or another one.
+ *
+ * In principle we could just flush the specific cache entry that changed,
+ * but given that TS configuration changes are probably infrequent, it
+ * doesn't seem worth the trouble to determine that; we just flush all the
+ * entries of the related hash table.
+ *
+ * We can use the same function for all TS caches by passing the hash
+ * table address as the "arg".
+ */
+static void
+InvalidateTSCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
+{
+ HTAB *hash = (HTAB *) DatumGetPointer(arg);
+ HASH_SEQ_STATUS status;
+ TSAnyCacheEntry *entry;
+
+ hash_seq_init(&status, hash);
+ while ((entry = (TSAnyCacheEntry *) hash_seq_search(&status)) != NULL)
+ entry->isvalid = false;
+
+ /* Also invalidate the current-config cache if it's pg_ts_config */
+ if (hash == TSConfigCacheHash)
+ TSCurrentConfigCache = InvalidOid;
+}
+
+/*
+ * Fetch parser cache entry
+ */
+TSParserCacheEntry *
+lookup_ts_parser_cache(Oid prsId)
+{
+ TSParserCacheEntry *entry;
+
+ if (TSParserCacheHash == NULL)
+ {
+ /* First time through: initialize the hash table */
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(TSParserCacheEntry);
+ TSParserCacheHash = hash_create("Tsearch parser cache", 4,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+ /* Flush cache on pg_ts_parser changes */
+ CacheRegisterSyscacheCallback(TSPARSEROID, InvalidateTSCacheCallBack,
+ PointerGetDatum(TSParserCacheHash));
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+ }
+
+ /* Check single-entry cache */
+ if (lastUsedParser && lastUsedParser->prsId == prsId &&
+ lastUsedParser->isvalid)
+ return lastUsedParser;
+
+ /* Try to look up an existing entry */
+ entry = (TSParserCacheEntry *) hash_search(TSParserCacheHash,
+ (void *) &prsId,
+ HASH_FIND, NULL);
+ if (entry == NULL || !entry->isvalid)
+ {
+ /*
+ * If we didn't find one, we want to make one. But first look up the
+ * object to be sure the OID is real.
+ */
+ HeapTuple tp;
+ Form_pg_ts_parser prs;
+
+ tp = SearchSysCache1(TSPARSEROID, ObjectIdGetDatum(prsId));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for text search parser %u",
+ prsId);
+ prs = (Form_pg_ts_parser) GETSTRUCT(tp);
+
+ /*
+ * Sanity checks
+ */
+ if (!OidIsValid(prs->prsstart))
+ elog(ERROR, "text search parser %u has no prsstart method", prsId);
+ if (!OidIsValid(prs->prstoken))
+ elog(ERROR, "text search parser %u has no prstoken method", prsId);
+ if (!OidIsValid(prs->prsend))
+ elog(ERROR, "text search parser %u has no prsend method", prsId);
+
+ if (entry == NULL)
+ {
+ bool found;
+
+ /* Now make the cache entry */
+ entry = (TSParserCacheEntry *)
+ hash_search(TSParserCacheHash,
+ (void *) &prsId,
+ HASH_ENTER, &found);
+ Assert(!found); /* it wasn't there a moment ago */
+ }
+
+ MemSet(entry, 0, sizeof(TSParserCacheEntry));
+ entry->prsId = prsId;
+ entry->startOid = prs->prsstart;
+ entry->tokenOid = prs->prstoken;
+ entry->endOid = prs->prsend;
+ entry->headlineOid = prs->prsheadline;
+ entry->lextypeOid = prs->prslextype;
+
+ ReleaseSysCache(tp);
+
+ fmgr_info_cxt(entry->startOid, &entry->prsstart, CacheMemoryContext);
+ fmgr_info_cxt(entry->tokenOid, &entry->prstoken, CacheMemoryContext);
+ fmgr_info_cxt(entry->endOid, &entry->prsend, CacheMemoryContext);
+ if (OidIsValid(entry->headlineOid))
+ fmgr_info_cxt(entry->headlineOid, &entry->prsheadline,
+ CacheMemoryContext);
+
+ entry->isvalid = true;
+ }
+
+ lastUsedParser = entry;
+
+ return entry;
+}
+
+/*
+ * Fetch dictionary cache entry
+ */
+TSDictionaryCacheEntry *
+lookup_ts_dictionary_cache(Oid dictId)
+{
+ TSDictionaryCacheEntry *entry;
+
+ if (TSDictionaryCacheHash == NULL)
+ {
+ /* First time through: initialize the hash table */
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(TSDictionaryCacheEntry);
+ TSDictionaryCacheHash = hash_create("Tsearch dictionary cache", 8,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+ /* Flush cache on pg_ts_dict and pg_ts_template changes */
+ CacheRegisterSyscacheCallback(TSDICTOID, InvalidateTSCacheCallBack,
+ PointerGetDatum(TSDictionaryCacheHash));
+ CacheRegisterSyscacheCallback(TSTEMPLATEOID, InvalidateTSCacheCallBack,
+ PointerGetDatum(TSDictionaryCacheHash));
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+ }
+
+ /* Check single-entry cache */
+ if (lastUsedDictionary && lastUsedDictionary->dictId == dictId &&
+ lastUsedDictionary->isvalid)
+ return lastUsedDictionary;
+
+ /* Try to look up an existing entry */
+ entry = (TSDictionaryCacheEntry *) hash_search(TSDictionaryCacheHash,
+ (void *) &dictId,
+ HASH_FIND, NULL);
+ if (entry == NULL || !entry->isvalid)
+ {
+ /*
+ * If we didn't find one, we want to make one. But first look up the
+ * object to be sure the OID is real.
+ */
+ HeapTuple tpdict,
+ tptmpl;
+ Form_pg_ts_dict dict;
+ Form_pg_ts_template template;
+ MemoryContext saveCtx;
+
+ tpdict = SearchSysCache1(TSDICTOID, ObjectIdGetDatum(dictId));
+ if (!HeapTupleIsValid(tpdict))
+ elog(ERROR, "cache lookup failed for text search dictionary %u",
+ dictId);
+ dict = (Form_pg_ts_dict) GETSTRUCT(tpdict);
+
+ /*
+ * Sanity checks
+ */
+ if (!OidIsValid(dict->dicttemplate))
+ elog(ERROR, "text search dictionary %u has no template", dictId);
+
+ /*
+ * Retrieve dictionary's template
+ */
+ tptmpl = SearchSysCache1(TSTEMPLATEOID,
+ ObjectIdGetDatum(dict->dicttemplate));
+ if (!HeapTupleIsValid(tptmpl))
+ elog(ERROR, "cache lookup failed for text search template %u",
+ dict->dicttemplate);
+ template = (Form_pg_ts_template) GETSTRUCT(tptmpl);
+
+ /*
+ * Sanity checks
+ */
+ if (!OidIsValid(template->tmpllexize))
+ elog(ERROR, "text search template %u has no lexize method",
+ template->tmpllexize);
+
+ if (entry == NULL)
+ {
+ bool found;
+
+ /* Now make the cache entry */
+ entry = (TSDictionaryCacheEntry *)
+ hash_search(TSDictionaryCacheHash,
+ (void *) &dictId,
+ HASH_ENTER, &found);
+ Assert(!found); /* it wasn't there a moment ago */
+
+ /* Create private memory context the first time through */
+ saveCtx = AllocSetContextCreate(CacheMemoryContext,
+ "TS dictionary",
+ ALLOCSET_SMALL_SIZES);
+ MemoryContextCopyAndSetIdentifier(saveCtx, NameStr(dict->dictname));
+ }
+ else
+ {
+ /* Clear the existing entry's private context */
+ saveCtx = entry->dictCtx;
+ /* Don't let context's ident pointer dangle while we reset it */
+ MemoryContextSetIdentifier(saveCtx, NULL);
+ MemoryContextReset(saveCtx);
+ MemoryContextCopyAndSetIdentifier(saveCtx, NameStr(dict->dictname));
+ }
+
+ MemSet(entry, 0, sizeof(TSDictionaryCacheEntry));
+ entry->dictId = dictId;
+ entry->dictCtx = saveCtx;
+
+ entry->lexizeOid = template->tmpllexize;
+
+ if (OidIsValid(template->tmplinit))
+ {
+ List *dictoptions;
+ Datum opt;
+ bool isnull;
+ MemoryContext oldcontext;
+
+ /*
+ * Init method runs in dictionary's private memory context, and we
+ * make sure the options are stored there too
+ */
+ oldcontext = MemoryContextSwitchTo(entry->dictCtx);
+
+ opt = SysCacheGetAttr(TSDICTOID, tpdict,
+ Anum_pg_ts_dict_dictinitoption,
+ &isnull);
+ if (isnull)
+ dictoptions = NIL;
+ else
+ dictoptions = deserialize_deflist(opt);
+
+ entry->dictData =
+ DatumGetPointer(OidFunctionCall1(template->tmplinit,
+ PointerGetDatum(dictoptions)));
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ ReleaseSysCache(tptmpl);
+ ReleaseSysCache(tpdict);
+
+ fmgr_info_cxt(entry->lexizeOid, &entry->lexize, entry->dictCtx);
+
+ entry->isvalid = true;
+ }
+
+ lastUsedDictionary = entry;
+
+ return entry;
+}
+
+/*
+ * Initialize config cache and prepare callbacks. This is split out of
+ * lookup_ts_config_cache because we need to activate the callback before
+ * caching TSCurrentConfigCache, too.
+ */
+static void
+init_ts_config_cache(void)
+{
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(TSConfigCacheEntry);
+ TSConfigCacheHash = hash_create("Tsearch configuration cache", 16,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+ /* Flush cache on pg_ts_config and pg_ts_config_map changes */
+ CacheRegisterSyscacheCallback(TSCONFIGOID, InvalidateTSCacheCallBack,
+ PointerGetDatum(TSConfigCacheHash));
+ CacheRegisterSyscacheCallback(TSCONFIGMAP, InvalidateTSCacheCallBack,
+ PointerGetDatum(TSConfigCacheHash));
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+}
+
+/*
+ * Fetch configuration cache entry
+ */
+TSConfigCacheEntry *
+lookup_ts_config_cache(Oid cfgId)
+{
+ TSConfigCacheEntry *entry;
+
+ if (TSConfigCacheHash == NULL)
+ {
+ /* First time through: initialize the hash table */
+ init_ts_config_cache();
+ }
+
+ /* Check single-entry cache */
+ if (lastUsedConfig && lastUsedConfig->cfgId == cfgId &&
+ lastUsedConfig->isvalid)
+ return lastUsedConfig;
+
+ /* Try to look up an existing entry */
+ entry = (TSConfigCacheEntry *) hash_search(TSConfigCacheHash,
+ (void *) &cfgId,
+ HASH_FIND, NULL);
+ if (entry == NULL || !entry->isvalid)
+ {
+ /*
+ * If we didn't find one, we want to make one. But first look up the
+ * object to be sure the OID is real.
+ */
+ HeapTuple tp;
+ Form_pg_ts_config cfg;
+ Relation maprel;
+ Relation mapidx;
+ ScanKeyData mapskey;
+ SysScanDesc mapscan;
+ HeapTuple maptup;
+ ListDictionary maplists[MAXTOKENTYPE + 1];
+ Oid mapdicts[MAXDICTSPERTT];
+ int maxtokentype;
+ int ndicts;
+ int i;
+
+ tp = SearchSysCache1(TSCONFIGOID, ObjectIdGetDatum(cfgId));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for text search configuration %u",
+ cfgId);
+ cfg = (Form_pg_ts_config) GETSTRUCT(tp);
+
+ /*
+ * Sanity checks
+ */
+ if (!OidIsValid(cfg->cfgparser))
+ elog(ERROR, "text search configuration %u has no parser", cfgId);
+
+ if (entry == NULL)
+ {
+ bool found;
+
+ /* Now make the cache entry */
+ entry = (TSConfigCacheEntry *)
+ hash_search(TSConfigCacheHash,
+ (void *) &cfgId,
+ HASH_ENTER, &found);
+ Assert(!found); /* it wasn't there a moment ago */
+ }
+ else
+ {
+ /* Cleanup old contents */
+ if (entry->map)
+ {
+ for (i = 0; i < entry->lenmap; i++)
+ if (entry->map[i].dictIds)
+ pfree(entry->map[i].dictIds);
+ pfree(entry->map);
+ }
+ }
+
+ MemSet(entry, 0, sizeof(TSConfigCacheEntry));
+ entry->cfgId = cfgId;
+ entry->prsId = cfg->cfgparser;
+
+ ReleaseSysCache(tp);
+
+ /*
+ * Scan pg_ts_config_map to gather dictionary list for each token type
+ *
+ * Because the index is on (mapcfg, maptokentype, mapseqno), we will
+ * see the entries in maptokentype order, and in mapseqno order for
+ * each token type, even though we didn't explicitly ask for that.
+ */
+ MemSet(maplists, 0, sizeof(maplists));
+ maxtokentype = 0;
+ ndicts = 0;
+
+ ScanKeyInit(&mapskey,
+ Anum_pg_ts_config_map_mapcfg,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(cfgId));
+
+ maprel = table_open(TSConfigMapRelationId, AccessShareLock);
+ mapidx = index_open(TSConfigMapIndexId, AccessShareLock);
+ mapscan = systable_beginscan_ordered(maprel, mapidx,
+ NULL, 1, &mapskey);
+
+ while ((maptup = systable_getnext_ordered(mapscan, ForwardScanDirection)) != NULL)
+ {
+ Form_pg_ts_config_map cfgmap = (Form_pg_ts_config_map) GETSTRUCT(maptup);
+ int toktype = cfgmap->maptokentype;
+
+ if (toktype <= 0 || toktype > MAXTOKENTYPE)
+ elog(ERROR, "maptokentype value %d is out of range", toktype);
+ if (toktype < maxtokentype)
+ elog(ERROR, "maptokentype entries are out of order");
+ if (toktype > maxtokentype)
+ {
+ /* starting a new token type, but first save the prior data */
+ if (ndicts > 0)
+ {
+ maplists[maxtokentype].len = ndicts;
+ maplists[maxtokentype].dictIds = (Oid *)
+ MemoryContextAlloc(CacheMemoryContext,
+ sizeof(Oid) * ndicts);
+ memcpy(maplists[maxtokentype].dictIds, mapdicts,
+ sizeof(Oid) * ndicts);
+ }
+ maxtokentype = toktype;
+ mapdicts[0] = cfgmap->mapdict;
+ ndicts = 1;
+ }
+ else
+ {
+ /* continuing data for current token type */
+ if (ndicts >= MAXDICTSPERTT)
+ elog(ERROR, "too many pg_ts_config_map entries for one token type");
+ mapdicts[ndicts++] = cfgmap->mapdict;
+ }
+ }
+
+ systable_endscan_ordered(mapscan);
+ index_close(mapidx, AccessShareLock);
+ table_close(maprel, AccessShareLock);
+
+ if (ndicts > 0)
+ {
+ /* save the last token type's dictionaries */
+ maplists[maxtokentype].len = ndicts;
+ maplists[maxtokentype].dictIds = (Oid *)
+ MemoryContextAlloc(CacheMemoryContext,
+ sizeof(Oid) * ndicts);
+ memcpy(maplists[maxtokentype].dictIds, mapdicts,
+ sizeof(Oid) * ndicts);
+ /* and save the overall map */
+ entry->lenmap = maxtokentype + 1;
+ entry->map = (ListDictionary *)
+ MemoryContextAlloc(CacheMemoryContext,
+ sizeof(ListDictionary) * entry->lenmap);
+ memcpy(entry->map, maplists,
+ sizeof(ListDictionary) * entry->lenmap);
+ }
+
+ entry->isvalid = true;
+ }
+
+ lastUsedConfig = entry;
+
+ return entry;
+}
+
+
+/*---------------------------------------------------
+ * GUC variable "default_text_search_config"
+ *---------------------------------------------------
+ */
+
+Oid
+getTSCurrentConfig(bool emitError)
+{
+ /* if we have a cached value, return it */
+ if (OidIsValid(TSCurrentConfigCache))
+ return TSCurrentConfigCache;
+
+ /* fail if GUC hasn't been set up yet */
+ if (TSCurrentConfig == NULL || *TSCurrentConfig == '\0')
+ {
+ if (emitError)
+ elog(ERROR, "text search configuration isn't set");
+ else
+ return InvalidOid;
+ }
+
+ if (TSConfigCacheHash == NULL)
+ {
+ /* First time through: initialize the tsconfig inval callback */
+ init_ts_config_cache();
+ }
+
+ /* Look up the config */
+ TSCurrentConfigCache =
+ get_ts_config_oid(stringToQualifiedNameList(TSCurrentConfig),
+ !emitError);
+
+ return TSCurrentConfigCache;
+}
+
+/* GUC check_hook for default_text_search_config */
+bool
+check_TSCurrentConfig(char **newval, void **extra, GucSource source)
+{
+ /*
+ * If we aren't inside a transaction, or connected to a database, we
+ * cannot do the catalog accesses necessary to verify the config name.
+ * Must accept it on faith.
+ */
+ if (IsTransactionState() && MyDatabaseId != InvalidOid)
+ {
+ Oid cfgId;
+ HeapTuple tuple;
+ Form_pg_ts_config cfg;
+ char *buf;
+
+ cfgId = get_ts_config_oid(stringToQualifiedNameList(*newval), true);
+
+ /*
+ * When source == PGC_S_TEST, don't throw a hard error for a
+ * nonexistent configuration, only a NOTICE. See comments in guc.h.
+ */
+ if (!OidIsValid(cfgId))
+ {
+ if (source == PGC_S_TEST)
+ {
+ ereport(NOTICE,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("text search configuration \"%s\" does not exist", *newval)));
+ return true;
+ }
+ else
+ return false;
+ }
+
+ /*
+ * Modify the actually stored value to be fully qualified, to ensure
+ * later changes of search_path don't affect it.
+ */
+ tuple = SearchSysCache1(TSCONFIGOID, ObjectIdGetDatum(cfgId));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for text search configuration %u",
+ cfgId);
+ cfg = (Form_pg_ts_config) GETSTRUCT(tuple);
+
+ buf = quote_qualified_identifier(get_namespace_name(cfg->cfgnamespace),
+ NameStr(cfg->cfgname));
+
+ ReleaseSysCache(tuple);
+
+ /* GUC wants it malloc'd not palloc'd */
+ free(*newval);
+ *newval = strdup(buf);
+ pfree(buf);
+ if (!*newval)
+ return false;
+ }
+
+ return true;
+}
+
+/* GUC assign_hook for default_text_search_config */
+void
+assign_TSCurrentConfig(const char *newval, void *extra)
+{
+ /* Just reset the cache to force a lookup on first use */
+ TSCurrentConfigCache = InvalidOid;
+}
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
new file mode 100644
index 0000000..62cd300
--- /dev/null
+++ b/src/backend/utils/cache/typcache.c
@@ -0,0 +1,2884 @@
+/*-------------------------------------------------------------------------
+ *
+ * typcache.c
+ * POSTGRES type cache code
+ *
+ * The type cache exists to speed lookup of certain information about data
+ * types that is not directly available from a type's pg_type row. For
+ * example, we use a type's default btree opclass, or the default hash
+ * opclass if no btree opclass exists, to determine which operators should
+ * be used for grouping and sorting the type (GROUP BY, ORDER BY ASC/DESC).
+ *
+ * Several seemingly-odd choices have been made to support use of the type
+ * cache by generic array and record handling routines, such as array_eq(),
+ * record_cmp(), and hash_array(). Because those routines are used as index
+ * support operations, they cannot leak memory. To allow them to execute
+ * efficiently, all information that they would like to re-use across calls
+ * is kept in the type cache.
+ *
+ * Once created, a type cache entry lives as long as the backend does, so
+ * there is no need for a call to release a cache entry. If the type is
+ * dropped, the cache entry simply becomes wasted storage. This is not
+ * expected to happen often, and assuming that typcache entries are good
+ * permanently allows caching pointers to them in long-lived places.
+ *
+ * We have some provisions for updating cache entries if the stored data
+ * becomes obsolete. Core data extracted from the pg_type row is updated
+ * when we detect updates to pg_type. Information dependent on opclasses is
+ * cleared if we detect updates to pg_opclass. We also support clearing the
+ * tuple descriptor and operator/function parts of a rowtype's cache entry,
+ * since those may need to change as a consequence of ALTER TABLE. Domain
+ * constraint changes are also tracked properly.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/cache/typcache.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/hash.h"
+#include "access/htup_details.h"
+#include "access/nbtree.h"
+#include "access/parallel.h"
+#include "access/relation.h"
+#include "access/session.h"
+#include "access/table.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_enum.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_range.h"
+#include "catalog/pg_type.h"
+#include "commands/defrem.h"
+#include "executor/executor.h"
+#include "lib/dshash.h"
+#include "optimizer/optimizer.h"
+#include "port/pg_bitutils.h"
+#include "storage/lwlock.h"
+#include "utils/builtins.h"
+#include "utils/catcache.h"
+#include "utils/fmgroids.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+#include "utils/typcache.h"
+
+
+/* The main type cache hashtable searched by lookup_type_cache */
+static HTAB *TypeCacheHash = NULL;
+
+/* List of type cache entries for domain types */
+static TypeCacheEntry *firstDomainTypeEntry = NULL;
+
+/* Private flag bits in the TypeCacheEntry.flags field */
+#define TCFLAGS_HAVE_PG_TYPE_DATA 0x000001
+#define TCFLAGS_CHECKED_BTREE_OPCLASS 0x000002
+#define TCFLAGS_CHECKED_HASH_OPCLASS 0x000004
+#define TCFLAGS_CHECKED_EQ_OPR 0x000008
+#define TCFLAGS_CHECKED_LT_OPR 0x000010
+#define TCFLAGS_CHECKED_GT_OPR 0x000020
+#define TCFLAGS_CHECKED_CMP_PROC 0x000040
+#define TCFLAGS_CHECKED_HASH_PROC 0x000080
+#define TCFLAGS_CHECKED_HASH_EXTENDED_PROC 0x000100
+#define TCFLAGS_CHECKED_ELEM_PROPERTIES 0x000200
+#define TCFLAGS_HAVE_ELEM_EQUALITY 0x000400
+#define TCFLAGS_HAVE_ELEM_COMPARE 0x000800
+#define TCFLAGS_HAVE_ELEM_HASHING 0x001000
+#define TCFLAGS_HAVE_ELEM_EXTENDED_HASHING 0x002000
+#define TCFLAGS_CHECKED_FIELD_PROPERTIES 0x004000
+#define TCFLAGS_HAVE_FIELD_EQUALITY 0x008000
+#define TCFLAGS_HAVE_FIELD_COMPARE 0x010000
+#define TCFLAGS_HAVE_FIELD_HASHING 0x020000
+#define TCFLAGS_HAVE_FIELD_EXTENDED_HASHING 0x040000
+#define TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS 0x080000
+#define TCFLAGS_DOMAIN_BASE_IS_COMPOSITE 0x100000
+
+/* The flags associated with equality/comparison/hashing are all but these: */
+#define TCFLAGS_OPERATOR_FLAGS \
+ (~(TCFLAGS_HAVE_PG_TYPE_DATA | \
+ TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS | \
+ TCFLAGS_DOMAIN_BASE_IS_COMPOSITE))
+
+/*
+ * Data stored about a domain type's constraints. Note that we do not create
+ * this struct for the common case of a constraint-less domain; we just set
+ * domainData to NULL to indicate that.
+ *
+ * Within a DomainConstraintCache, we store expression plan trees, but the
+ * check_exprstate fields of the DomainConstraintState nodes are just NULL.
+ * When needed, expression evaluation nodes are built by flat-copying the
+ * DomainConstraintState nodes and applying ExecInitExpr to check_expr.
+ * Such a node tree is not part of the DomainConstraintCache, but is
+ * considered to belong to a DomainConstraintRef.
+ */
+struct DomainConstraintCache
+{
+ List *constraints; /* list of DomainConstraintState nodes */
+ MemoryContext dccContext; /* memory context holding all associated data */
+ long dccRefCount; /* number of references to this struct */
+};
+
+/* Private information to support comparisons of enum values */
+typedef struct
+{
+ Oid enum_oid; /* OID of one enum value */
+ float4 sort_order; /* its sort position */
+} EnumItem;
+
+typedef struct TypeCacheEnumData
+{
+ Oid bitmap_base; /* OID corresponding to bit 0 of bitmapset */
+ Bitmapset *sorted_values; /* Set of OIDs known to be in order */
+ int num_values; /* total number of values in enum */
+ EnumItem enum_values[FLEXIBLE_ARRAY_MEMBER];
+} TypeCacheEnumData;
+
+/*
+ * We use a separate table for storing the definitions of non-anonymous
+ * record types. Once defined, a record type will be remembered for the
+ * life of the backend. Subsequent uses of the "same" record type (where
+ * sameness means equalTupleDescs) will refer to the existing table entry.
+ *
+ * Stored record types are remembered in a linear array of TupleDescs,
+ * which can be indexed quickly with the assigned typmod. There is also
+ * a hash table to speed searches for matching TupleDescs.
+ */
+
+typedef struct RecordCacheEntry
+{
+ TupleDesc tupdesc;
+} RecordCacheEntry;
+
+/*
+ * To deal with non-anonymous record types that are exchanged by backends
+ * involved in a parallel query, we also need a shared version of the above.
+ */
+struct SharedRecordTypmodRegistry
+{
+ /* A hash table for finding a matching TupleDesc. */
+ dshash_table_handle record_table_handle;
+ /* A hash table for finding a TupleDesc by typmod. */
+ dshash_table_handle typmod_table_handle;
+ /* A source of new record typmod numbers. */
+ pg_atomic_uint32 next_typmod;
+};
+
+/*
+ * When using shared tuple descriptors as hash table keys we need a way to be
+ * able to search for an equal shared TupleDesc using a backend-local
+ * TupleDesc. So we use this type which can hold either, and hash and compare
+ * functions that know how to handle both.
+ */
+typedef struct SharedRecordTableKey
+{
+ union
+ {
+ TupleDesc local_tupdesc;
+ dsa_pointer shared_tupdesc;
+ } u;
+ bool shared;
+} SharedRecordTableKey;
+
+/*
+ * The shared version of RecordCacheEntry. This lets us look up a typmod
+ * using a TupleDesc which may be in local or shared memory.
+ */
+typedef struct SharedRecordTableEntry
+{
+ SharedRecordTableKey key;
+} SharedRecordTableEntry;
+
+/*
+ * An entry in SharedRecordTypmodRegistry's typmod table. This lets us look
+ * up a TupleDesc in shared memory using a typmod.
+ */
+typedef struct SharedTypmodTableEntry
+{
+ uint32 typmod;
+ dsa_pointer shared_tupdesc;
+} SharedTypmodTableEntry;
+
+/*
+ * A comparator function for SharedRecordTableKey.
+ */
+static int
+shared_record_table_compare(const void *a, const void *b, size_t size,
+ void *arg)
+{
+ dsa_area *area = (dsa_area *) arg;
+ SharedRecordTableKey *k1 = (SharedRecordTableKey *) a;
+ SharedRecordTableKey *k2 = (SharedRecordTableKey *) b;
+ TupleDesc t1;
+ TupleDesc t2;
+
+ if (k1->shared)
+ t1 = (TupleDesc) dsa_get_address(area, k1->u.shared_tupdesc);
+ else
+ t1 = k1->u.local_tupdesc;
+
+ if (k2->shared)
+ t2 = (TupleDesc) dsa_get_address(area, k2->u.shared_tupdesc);
+ else
+ t2 = k2->u.local_tupdesc;
+
+ return equalTupleDescs(t1, t2) ? 0 : 1;
+}
+
+/*
+ * A hash function for SharedRecordTableKey.
+ */
+static uint32
+shared_record_table_hash(const void *a, size_t size, void *arg)
+{
+ dsa_area *area = (dsa_area *) arg;
+ SharedRecordTableKey *k = (SharedRecordTableKey *) a;
+ TupleDesc t;
+
+ if (k->shared)
+ t = (TupleDesc) dsa_get_address(area, k->u.shared_tupdesc);
+ else
+ t = k->u.local_tupdesc;
+
+ return hashTupleDesc(t);
+}
+
+/* Parameters for SharedRecordTypmodRegistry's TupleDesc table. */
+static const dshash_parameters srtr_record_table_params = {
+ sizeof(SharedRecordTableKey), /* unused */
+ sizeof(SharedRecordTableEntry),
+ shared_record_table_compare,
+ shared_record_table_hash,
+ LWTRANCHE_PER_SESSION_RECORD_TYPE
+};
+
+/* Parameters for SharedRecordTypmodRegistry's typmod hash table. */
+static const dshash_parameters srtr_typmod_table_params = {
+ sizeof(uint32),
+ sizeof(SharedTypmodTableEntry),
+ dshash_memcmp,
+ dshash_memhash,
+ LWTRANCHE_PER_SESSION_RECORD_TYPMOD
+};
+
+/* hashtable for recognizing registered record types */
+static HTAB *RecordCacheHash = NULL;
+
+typedef struct RecordCacheArrayEntry
+{
+ uint64 id;
+ TupleDesc tupdesc;
+} RecordCacheArrayEntry;
+
+/* array of info about registered record types, indexed by assigned typmod */
+static RecordCacheArrayEntry *RecordCacheArray = NULL;
+static int32 RecordCacheArrayLen = 0; /* allocated length of above array */
+static int32 NextRecordTypmod = 0; /* number of entries used */
+
+/*
+ * Process-wide counter for generating unique tupledesc identifiers.
+ * Zero and one (INVALID_TUPLEDESC_IDENTIFIER) aren't allowed to be chosen
+ * as identifiers, so we start the counter at INVALID_TUPLEDESC_IDENTIFIER.
+ */
+static uint64 tupledesc_id_counter = INVALID_TUPLEDESC_IDENTIFIER;
+
+static void load_typcache_tupdesc(TypeCacheEntry *typentry);
+static void load_rangetype_info(TypeCacheEntry *typentry);
+static void load_multirangetype_info(TypeCacheEntry *typentry);
+static void load_domaintype_info(TypeCacheEntry *typentry);
+static int dcs_cmp(const void *a, const void *b);
+static void decr_dcc_refcount(DomainConstraintCache *dcc);
+static void dccref_deletion_callback(void *arg);
+static List *prep_domain_constraints(List *constraints, MemoryContext execctx);
+static bool array_element_has_equality(TypeCacheEntry *typentry);
+static bool array_element_has_compare(TypeCacheEntry *typentry);
+static bool array_element_has_hashing(TypeCacheEntry *typentry);
+static bool array_element_has_extended_hashing(TypeCacheEntry *typentry);
+static void cache_array_element_properties(TypeCacheEntry *typentry);
+static bool record_fields_have_equality(TypeCacheEntry *typentry);
+static bool record_fields_have_compare(TypeCacheEntry *typentry);
+static bool record_fields_have_hashing(TypeCacheEntry *typentry);
+static bool record_fields_have_extended_hashing(TypeCacheEntry *typentry);
+static void cache_record_field_properties(TypeCacheEntry *typentry);
+static bool range_element_has_hashing(TypeCacheEntry *typentry);
+static bool range_element_has_extended_hashing(TypeCacheEntry *typentry);
+static void cache_range_element_properties(TypeCacheEntry *typentry);
+static bool multirange_element_has_hashing(TypeCacheEntry *typentry);
+static bool multirange_element_has_extended_hashing(TypeCacheEntry *typentry);
+static void cache_multirange_element_properties(TypeCacheEntry *typentry);
+static void TypeCacheRelCallback(Datum arg, Oid relid);
+static void TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void TypeCacheConstrCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void load_enum_cache_data(TypeCacheEntry *tcache);
+static EnumItem *find_enumitem(TypeCacheEnumData *enumdata, Oid arg);
+static int enum_oid_cmp(const void *left, const void *right);
+static void shared_record_typmod_registry_detach(dsm_segment *segment,
+ Datum datum);
+static TupleDesc find_or_make_matching_shared_tupledesc(TupleDesc tupdesc);
+static dsa_pointer share_tupledesc(dsa_area *area, TupleDesc tupdesc,
+ uint32 typmod);
+
+
+/*
+ * lookup_type_cache
+ *
+ * Fetch the type cache entry for the specified datatype, and make sure that
+ * all the fields requested by bits in 'flags' are valid.
+ *
+ * The result is never NULL --- we will ereport() if the passed type OID is
+ * invalid. Note however that we may fail to find one or more of the
+ * values requested by 'flags'; the caller needs to check whether the fields
+ * are InvalidOid or not.
+ */
+TypeCacheEntry *
+lookup_type_cache(Oid type_id, int flags)
+{
+ TypeCacheEntry *typentry;
+ bool found;
+
+ if (TypeCacheHash == NULL)
+ {
+ /* First time through: initialize the hash table */
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(Oid);
+ ctl.entrysize = sizeof(TypeCacheEntry);
+ TypeCacheHash = hash_create("Type information cache", 64,
+ &ctl, HASH_ELEM | HASH_BLOBS);
+
+ /* Also set up callbacks for SI invalidations */
+ CacheRegisterRelcacheCallback(TypeCacheRelCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(TYPEOID, TypeCacheTypCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(CLAOID, TypeCacheOpcCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(CONSTROID, TypeCacheConstrCallback, (Datum) 0);
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+ }
+
+ /* Try to look up an existing entry */
+ typentry = (TypeCacheEntry *) hash_search(TypeCacheHash,
+ (void *) &type_id,
+ HASH_FIND, NULL);
+ if (typentry == NULL)
+ {
+ /*
+ * If we didn't find one, we want to make one. But first look up the
+ * pg_type row, just to make sure we don't make a cache entry for an
+ * invalid type OID. If the type OID is not valid, present a
+ * user-facing error, since some code paths such as domain_in() allow
+ * this function to be reached with a user-supplied OID.
+ */
+ HeapTuple tp;
+ Form_pg_type typtup;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_id));
+ if (!HeapTupleIsValid(tp))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type with OID %u does not exist", type_id)));
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ if (!typtup->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type \"%s\" is only a shell",
+ NameStr(typtup->typname))));
+
+ /* Now make the typcache entry */
+ typentry = (TypeCacheEntry *) hash_search(TypeCacheHash,
+ (void *) &type_id,
+ HASH_ENTER, &found);
+ Assert(!found); /* it wasn't there a moment ago */
+
+ MemSet(typentry, 0, sizeof(TypeCacheEntry));
+
+ /* These fields can never change, by definition */
+ typentry->type_id = type_id;
+ typentry->type_id_hash = GetSysCacheHashValue1(TYPEOID,
+ ObjectIdGetDatum(type_id));
+
+ /* Keep this part in sync with the code below */
+ typentry->typlen = typtup->typlen;
+ typentry->typbyval = typtup->typbyval;
+ typentry->typalign = typtup->typalign;
+ typentry->typstorage = typtup->typstorage;
+ typentry->typtype = typtup->typtype;
+ typentry->typrelid = typtup->typrelid;
+ typentry->typsubscript = typtup->typsubscript;
+ typentry->typelem = typtup->typelem;
+ typentry->typcollation = typtup->typcollation;
+ typentry->flags |= TCFLAGS_HAVE_PG_TYPE_DATA;
+
+ /* If it's a domain, immediately thread it into the domain cache list */
+ if (typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ typentry->nextDomain = firstDomainTypeEntry;
+ firstDomainTypeEntry = typentry;
+ }
+
+ ReleaseSysCache(tp);
+ }
+ else if (!(typentry->flags & TCFLAGS_HAVE_PG_TYPE_DATA))
+ {
+ /*
+ * We have an entry, but its pg_type row got changed, so reload the
+ * data obtained directly from pg_type.
+ */
+ HeapTuple tp;
+ Form_pg_type typtup;
+
+ tp = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_id));
+ if (!HeapTupleIsValid(tp))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type with OID %u does not exist", type_id)));
+ typtup = (Form_pg_type) GETSTRUCT(tp);
+ if (!typtup->typisdefined)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("type \"%s\" is only a shell",
+ NameStr(typtup->typname))));
+
+ /*
+ * Keep this part in sync with the code above. Many of these fields
+ * shouldn't ever change, particularly typtype, but copy 'em anyway.
+ */
+ typentry->typlen = typtup->typlen;
+ typentry->typbyval = typtup->typbyval;
+ typentry->typalign = typtup->typalign;
+ typentry->typstorage = typtup->typstorage;
+ typentry->typtype = typtup->typtype;
+ typentry->typrelid = typtup->typrelid;
+ typentry->typsubscript = typtup->typsubscript;
+ typentry->typelem = typtup->typelem;
+ typentry->typcollation = typtup->typcollation;
+ typentry->flags |= TCFLAGS_HAVE_PG_TYPE_DATA;
+
+ ReleaseSysCache(tp);
+ }
+
+ /*
+ * Look up opclasses if we haven't already and any dependent info is
+ * requested.
+ */
+ if ((flags & (TYPECACHE_EQ_OPR | TYPECACHE_LT_OPR | TYPECACHE_GT_OPR |
+ TYPECACHE_CMP_PROC |
+ TYPECACHE_EQ_OPR_FINFO | TYPECACHE_CMP_PROC_FINFO |
+ TYPECACHE_BTREE_OPFAMILY)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_BTREE_OPCLASS))
+ {
+ Oid opclass;
+
+ opclass = GetDefaultOpClass(type_id, BTREE_AM_OID);
+ if (OidIsValid(opclass))
+ {
+ typentry->btree_opf = get_opclass_family(opclass);
+ typentry->btree_opintype = get_opclass_input_type(opclass);
+ }
+ else
+ {
+ typentry->btree_opf = typentry->btree_opintype = InvalidOid;
+ }
+
+ /*
+ * Reset information derived from btree opclass. Note in particular
+ * that we'll redetermine the eq_opr even if we previously found one;
+ * this matters in case a btree opclass has been added to a type that
+ * previously had only a hash opclass.
+ */
+ typentry->flags &= ~(TCFLAGS_CHECKED_EQ_OPR |
+ TCFLAGS_CHECKED_LT_OPR |
+ TCFLAGS_CHECKED_GT_OPR |
+ TCFLAGS_CHECKED_CMP_PROC);
+ typentry->flags |= TCFLAGS_CHECKED_BTREE_OPCLASS;
+ }
+
+ /*
+ * If we need to look up equality operator, and there's no btree opclass,
+ * force lookup of hash opclass.
+ */
+ if ((flags & (TYPECACHE_EQ_OPR | TYPECACHE_EQ_OPR_FINFO)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_EQ_OPR) &&
+ typentry->btree_opf == InvalidOid)
+ flags |= TYPECACHE_HASH_OPFAMILY;
+
+ if ((flags & (TYPECACHE_HASH_PROC | TYPECACHE_HASH_PROC_FINFO |
+ TYPECACHE_HASH_EXTENDED_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO |
+ TYPECACHE_HASH_OPFAMILY)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_HASH_OPCLASS))
+ {
+ Oid opclass;
+
+ opclass = GetDefaultOpClass(type_id, HASH_AM_OID);
+ if (OidIsValid(opclass))
+ {
+ typentry->hash_opf = get_opclass_family(opclass);
+ typentry->hash_opintype = get_opclass_input_type(opclass);
+ }
+ else
+ {
+ typentry->hash_opf = typentry->hash_opintype = InvalidOid;
+ }
+
+ /*
+ * Reset information derived from hash opclass. We do *not* reset the
+ * eq_opr; if we already found one from the btree opclass, that
+ * decision is still good.
+ */
+ typentry->flags &= ~(TCFLAGS_CHECKED_HASH_PROC |
+ TCFLAGS_CHECKED_HASH_EXTENDED_PROC);
+ typentry->flags |= TCFLAGS_CHECKED_HASH_OPCLASS;
+ }
+
+ /*
+ * Look for requested operators and functions, if we haven't already.
+ */
+ if ((flags & (TYPECACHE_EQ_OPR | TYPECACHE_EQ_OPR_FINFO)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_EQ_OPR))
+ {
+ Oid eq_opr = InvalidOid;
+
+ if (typentry->btree_opf != InvalidOid)
+ eq_opr = get_opfamily_member(typentry->btree_opf,
+ typentry->btree_opintype,
+ typentry->btree_opintype,
+ BTEqualStrategyNumber);
+ if (eq_opr == InvalidOid &&
+ typentry->hash_opf != InvalidOid)
+ eq_opr = get_opfamily_member(typentry->hash_opf,
+ typentry->hash_opintype,
+ typentry->hash_opintype,
+ HTEqualStrategyNumber);
+
+ /*
+ * If the proposed equality operator is array_eq or record_eq, check
+ * to see if the element type or column types support equality. If
+ * not, array_eq or record_eq would fail at runtime, so we don't want
+ * to report that the type has equality. (We can omit similar
+ * checking for ranges and multiranges because ranges can't be created
+ * in the first place unless their subtypes support equality.)
+ */
+ if (eq_opr == ARRAY_EQ_OP &&
+ !array_element_has_equality(typentry))
+ eq_opr = InvalidOid;
+ else if (eq_opr == RECORD_EQ_OP &&
+ !record_fields_have_equality(typentry))
+ eq_opr = InvalidOid;
+
+ /* Force update of eq_opr_finfo only if we're changing state */
+ if (typentry->eq_opr != eq_opr)
+ typentry->eq_opr_finfo.fn_oid = InvalidOid;
+
+ typentry->eq_opr = eq_opr;
+
+ /*
+ * Reset info about hash functions whenever we pick up new info about
+ * equality operator. This is so we can ensure that the hash
+ * functions match the operator.
+ */
+ typentry->flags &= ~(TCFLAGS_CHECKED_HASH_PROC |
+ TCFLAGS_CHECKED_HASH_EXTENDED_PROC);
+ typentry->flags |= TCFLAGS_CHECKED_EQ_OPR;
+ }
+ if ((flags & TYPECACHE_LT_OPR) &&
+ !(typentry->flags & TCFLAGS_CHECKED_LT_OPR))
+ {
+ Oid lt_opr = InvalidOid;
+
+ if (typentry->btree_opf != InvalidOid)
+ lt_opr = get_opfamily_member(typentry->btree_opf,
+ typentry->btree_opintype,
+ typentry->btree_opintype,
+ BTLessStrategyNumber);
+
+ /*
+ * As above, make sure array_cmp or record_cmp will succeed; but again
+ * we need no special check for ranges or multiranges.
+ */
+ if (lt_opr == ARRAY_LT_OP &&
+ !array_element_has_compare(typentry))
+ lt_opr = InvalidOid;
+ else if (lt_opr == RECORD_LT_OP &&
+ !record_fields_have_compare(typentry))
+ lt_opr = InvalidOid;
+
+ typentry->lt_opr = lt_opr;
+ typentry->flags |= TCFLAGS_CHECKED_LT_OPR;
+ }
+ if ((flags & TYPECACHE_GT_OPR) &&
+ !(typentry->flags & TCFLAGS_CHECKED_GT_OPR))
+ {
+ Oid gt_opr = InvalidOid;
+
+ if (typentry->btree_opf != InvalidOid)
+ gt_opr = get_opfamily_member(typentry->btree_opf,
+ typentry->btree_opintype,
+ typentry->btree_opintype,
+ BTGreaterStrategyNumber);
+
+ /*
+ * As above, make sure array_cmp or record_cmp will succeed; but again
+ * we need no special check for ranges or multiranges.
+ */
+ if (gt_opr == ARRAY_GT_OP &&
+ !array_element_has_compare(typentry))
+ gt_opr = InvalidOid;
+ else if (gt_opr == RECORD_GT_OP &&
+ !record_fields_have_compare(typentry))
+ gt_opr = InvalidOid;
+
+ typentry->gt_opr = gt_opr;
+ typentry->flags |= TCFLAGS_CHECKED_GT_OPR;
+ }
+ if ((flags & (TYPECACHE_CMP_PROC | TYPECACHE_CMP_PROC_FINFO)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_CMP_PROC))
+ {
+ Oid cmp_proc = InvalidOid;
+
+ if (typentry->btree_opf != InvalidOid)
+ cmp_proc = get_opfamily_proc(typentry->btree_opf,
+ typentry->btree_opintype,
+ typentry->btree_opintype,
+ BTORDER_PROC);
+
+ /*
+ * As above, make sure array_cmp or record_cmp will succeed; but again
+ * we need no special check for ranges or multiranges.
+ */
+ if (cmp_proc == F_BTARRAYCMP &&
+ !array_element_has_compare(typentry))
+ cmp_proc = InvalidOid;
+ else if (cmp_proc == F_BTRECORDCMP &&
+ !record_fields_have_compare(typentry))
+ cmp_proc = InvalidOid;
+
+ /* Force update of cmp_proc_finfo only if we're changing state */
+ if (typentry->cmp_proc != cmp_proc)
+ typentry->cmp_proc_finfo.fn_oid = InvalidOid;
+
+ typentry->cmp_proc = cmp_proc;
+ typentry->flags |= TCFLAGS_CHECKED_CMP_PROC;
+ }
+ if ((flags & (TYPECACHE_HASH_PROC | TYPECACHE_HASH_PROC_FINFO)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_HASH_PROC))
+ {
+ Oid hash_proc = InvalidOid;
+
+ /*
+ * We insist that the eq_opr, if one has been determined, match the
+ * hash opclass; else report there is no hash function.
+ */
+ if (typentry->hash_opf != InvalidOid &&
+ (!OidIsValid(typentry->eq_opr) ||
+ typentry->eq_opr == get_opfamily_member(typentry->hash_opf,
+ typentry->hash_opintype,
+ typentry->hash_opintype,
+ HTEqualStrategyNumber)))
+ hash_proc = get_opfamily_proc(typentry->hash_opf,
+ typentry->hash_opintype,
+ typentry->hash_opintype,
+ HASHSTANDARD_PROC);
+
+ /*
+ * As above, make sure hash_array, hash_record, or hash_range will
+ * succeed.
+ */
+ if (hash_proc == F_HASH_ARRAY &&
+ !array_element_has_hashing(typentry))
+ hash_proc = InvalidOid;
+ else if (hash_proc == F_HASH_RECORD &&
+ !record_fields_have_hashing(typentry))
+ hash_proc = InvalidOid;
+ else if (hash_proc == F_HASH_RANGE &&
+ !range_element_has_hashing(typentry))
+ hash_proc = InvalidOid;
+
+ /*
+ * Likewise for hash_multirange.
+ */
+ if (hash_proc == F_HASH_MULTIRANGE &&
+ !multirange_element_has_hashing(typentry))
+ hash_proc = InvalidOid;
+
+ /* Force update of hash_proc_finfo only if we're changing state */
+ if (typentry->hash_proc != hash_proc)
+ typentry->hash_proc_finfo.fn_oid = InvalidOid;
+
+ typentry->hash_proc = hash_proc;
+ typentry->flags |= TCFLAGS_CHECKED_HASH_PROC;
+ }
+ if ((flags & (TYPECACHE_HASH_EXTENDED_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC_FINFO)) &&
+ !(typentry->flags & TCFLAGS_CHECKED_HASH_EXTENDED_PROC))
+ {
+ Oid hash_extended_proc = InvalidOid;
+
+ /*
+ * We insist that the eq_opr, if one has been determined, match the
+ * hash opclass; else report there is no hash function.
+ */
+ if (typentry->hash_opf != InvalidOid &&
+ (!OidIsValid(typentry->eq_opr) ||
+ typentry->eq_opr == get_opfamily_member(typentry->hash_opf,
+ typentry->hash_opintype,
+ typentry->hash_opintype,
+ HTEqualStrategyNumber)))
+ hash_extended_proc = get_opfamily_proc(typentry->hash_opf,
+ typentry->hash_opintype,
+ typentry->hash_opintype,
+ HASHEXTENDED_PROC);
+
+ /*
+ * As above, make sure hash_array_extended, hash_record_extended, or
+ * hash_range_extended will succeed.
+ */
+ if (hash_extended_proc == F_HASH_ARRAY_EXTENDED &&
+ !array_element_has_extended_hashing(typentry))
+ hash_extended_proc = InvalidOid;
+ else if (hash_extended_proc == F_HASH_RECORD_EXTENDED &&
+ !record_fields_have_extended_hashing(typentry))
+ hash_extended_proc = InvalidOid;
+ else if (hash_extended_proc == F_HASH_RANGE_EXTENDED &&
+ !range_element_has_extended_hashing(typentry))
+ hash_extended_proc = InvalidOid;
+
+ /*
+ * Likewise for hash_multirange_extended.
+ */
+ if (hash_extended_proc == F_HASH_MULTIRANGE_EXTENDED &&
+ !multirange_element_has_extended_hashing(typentry))
+ hash_extended_proc = InvalidOid;
+
+ /* Force update of proc finfo only if we're changing state */
+ if (typentry->hash_extended_proc != hash_extended_proc)
+ typentry->hash_extended_proc_finfo.fn_oid = InvalidOid;
+
+ typentry->hash_extended_proc = hash_extended_proc;
+ typentry->flags |= TCFLAGS_CHECKED_HASH_EXTENDED_PROC;
+ }
+
+ /*
+ * Set up fmgr lookup info as requested
+ *
+ * Note: we tell fmgr the finfo structures live in CacheMemoryContext,
+ * which is not quite right (they're really in the hash table's private
+ * memory context) but this will do for our purposes.
+ *
+ * Note: the code above avoids invalidating the finfo structs unless the
+ * referenced operator/function OID actually changes. This is to prevent
+ * unnecessary leakage of any subsidiary data attached to an finfo, since
+ * that would cause session-lifespan memory leaks.
+ */
+ if ((flags & TYPECACHE_EQ_OPR_FINFO) &&
+ typentry->eq_opr_finfo.fn_oid == InvalidOid &&
+ typentry->eq_opr != InvalidOid)
+ {
+ Oid eq_opr_func;
+
+ eq_opr_func = get_opcode(typentry->eq_opr);
+ if (eq_opr_func != InvalidOid)
+ fmgr_info_cxt(eq_opr_func, &typentry->eq_opr_finfo,
+ CacheMemoryContext);
+ }
+ if ((flags & TYPECACHE_CMP_PROC_FINFO) &&
+ typentry->cmp_proc_finfo.fn_oid == InvalidOid &&
+ typentry->cmp_proc != InvalidOid)
+ {
+ fmgr_info_cxt(typentry->cmp_proc, &typentry->cmp_proc_finfo,
+ CacheMemoryContext);
+ }
+ if ((flags & TYPECACHE_HASH_PROC_FINFO) &&
+ typentry->hash_proc_finfo.fn_oid == InvalidOid &&
+ typentry->hash_proc != InvalidOid)
+ {
+ fmgr_info_cxt(typentry->hash_proc, &typentry->hash_proc_finfo,
+ CacheMemoryContext);
+ }
+ if ((flags & TYPECACHE_HASH_EXTENDED_PROC_FINFO) &&
+ typentry->hash_extended_proc_finfo.fn_oid == InvalidOid &&
+ typentry->hash_extended_proc != InvalidOid)
+ {
+ fmgr_info_cxt(typentry->hash_extended_proc,
+ &typentry->hash_extended_proc_finfo,
+ CacheMemoryContext);
+ }
+
+ /*
+ * If it's a composite type (row type), get tupdesc if requested
+ */
+ if ((flags & TYPECACHE_TUPDESC) &&
+ typentry->tupDesc == NULL &&
+ typentry->typtype == TYPTYPE_COMPOSITE)
+ {
+ load_typcache_tupdesc(typentry);
+ }
+
+ /*
+ * If requested, get information about a range type
+ *
+ * This includes making sure that the basic info about the range element
+ * type is up-to-date.
+ */
+ if ((flags & TYPECACHE_RANGE_INFO) &&
+ typentry->typtype == TYPTYPE_RANGE)
+ {
+ if (typentry->rngelemtype == NULL)
+ load_rangetype_info(typentry);
+ else if (!(typentry->rngelemtype->flags & TCFLAGS_HAVE_PG_TYPE_DATA))
+ (void) lookup_type_cache(typentry->rngelemtype->type_id, 0);
+ }
+
+ /*
+ * If requested, get information about a multirange type
+ */
+ if ((flags & TYPECACHE_MULTIRANGE_INFO) &&
+ typentry->rngtype == NULL &&
+ typentry->typtype == TYPTYPE_MULTIRANGE)
+ {
+ load_multirangetype_info(typentry);
+ }
+
+ /*
+ * If requested, get information about a domain type
+ */
+ if ((flags & TYPECACHE_DOMAIN_BASE_INFO) &&
+ typentry->domainBaseType == InvalidOid &&
+ typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ typentry->domainBaseTypmod = -1;
+ typentry->domainBaseType =
+ getBaseTypeAndTypmod(type_id, &typentry->domainBaseTypmod);
+ }
+ if ((flags & TYPECACHE_DOMAIN_CONSTR_INFO) &&
+ (typentry->flags & TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS) == 0 &&
+ typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ load_domaintype_info(typentry);
+ }
+
+ return typentry;
+}
+
+/*
+ * load_typcache_tupdesc --- helper routine to set up composite type's tupDesc
+ */
+static void
+load_typcache_tupdesc(TypeCacheEntry *typentry)
+{
+ Relation rel;
+
+ if (!OidIsValid(typentry->typrelid)) /* should not happen */
+ elog(ERROR, "invalid typrelid for composite type %u",
+ typentry->type_id);
+ rel = relation_open(typentry->typrelid, AccessShareLock);
+ Assert(rel->rd_rel->reltype == typentry->type_id);
+
+ /*
+ * Link to the tupdesc and increment its refcount (we assert it's a
+ * refcounted descriptor). We don't use IncrTupleDescRefCount() for this,
+ * because the reference mustn't be entered in the current resource owner;
+ * it can outlive the current query.
+ */
+ typentry->tupDesc = RelationGetDescr(rel);
+
+ Assert(typentry->tupDesc->tdrefcount > 0);
+ typentry->tupDesc->tdrefcount++;
+
+ /*
+ * In future, we could take some pains to not change tupDesc_identifier if
+ * the tupdesc didn't really change; but for now it's not worth it.
+ */
+ typentry->tupDesc_identifier = ++tupledesc_id_counter;
+
+ relation_close(rel, AccessShareLock);
+}
+
+/*
+ * load_rangetype_info --- helper routine to set up range type information
+ */
+static void
+load_rangetype_info(TypeCacheEntry *typentry)
+{
+ Form_pg_range pg_range;
+ HeapTuple tup;
+ Oid subtypeOid;
+ Oid opclassOid;
+ Oid canonicalOid;
+ Oid subdiffOid;
+ Oid opfamilyOid;
+ Oid opcintype;
+ Oid cmpFnOid;
+
+ /* get information from pg_range */
+ tup = SearchSysCache1(RANGETYPE, ObjectIdGetDatum(typentry->type_id));
+ /* should not fail, since we already checked typtype ... */
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for range type %u",
+ typentry->type_id);
+ pg_range = (Form_pg_range) GETSTRUCT(tup);
+
+ subtypeOid = pg_range->rngsubtype;
+ typentry->rng_collation = pg_range->rngcollation;
+ opclassOid = pg_range->rngsubopc;
+ canonicalOid = pg_range->rngcanonical;
+ subdiffOid = pg_range->rngsubdiff;
+
+ ReleaseSysCache(tup);
+
+ /* get opclass properties and look up the comparison function */
+ opfamilyOid = get_opclass_family(opclassOid);
+ opcintype = get_opclass_input_type(opclassOid);
+
+ cmpFnOid = get_opfamily_proc(opfamilyOid, opcintype, opcintype,
+ BTORDER_PROC);
+ if (!RegProcedureIsValid(cmpFnOid))
+ elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
+ BTORDER_PROC, opcintype, opcintype, opfamilyOid);
+
+ /* set up cached fmgrinfo structs */
+ fmgr_info_cxt(cmpFnOid, &typentry->rng_cmp_proc_finfo,
+ CacheMemoryContext);
+ if (OidIsValid(canonicalOid))
+ fmgr_info_cxt(canonicalOid, &typentry->rng_canonical_finfo,
+ CacheMemoryContext);
+ if (OidIsValid(subdiffOid))
+ fmgr_info_cxt(subdiffOid, &typentry->rng_subdiff_finfo,
+ CacheMemoryContext);
+
+ /* Lastly, set up link to the element type --- this marks data valid */
+ typentry->rngelemtype = lookup_type_cache(subtypeOid, 0);
+}
+
+/*
+ * load_multirangetype_info --- helper routine to set up multirange type
+ * information
+ */
+static void
+load_multirangetype_info(TypeCacheEntry *typentry)
+{
+ Oid rangetypeOid;
+
+ rangetypeOid = get_multirange_range(typentry->type_id);
+ if (!OidIsValid(rangetypeOid))
+ elog(ERROR, "cache lookup failed for multirange type %u",
+ typentry->type_id);
+
+ typentry->rngtype = lookup_type_cache(rangetypeOid, TYPECACHE_RANGE_INFO);
+}
+
+/*
+ * load_domaintype_info --- helper routine to set up domain constraint info
+ *
+ * Note: we assume we're called in a relatively short-lived context, so it's
+ * okay to leak data into the current context while scanning pg_constraint.
+ * We build the new DomainConstraintCache data in a context underneath
+ * CurrentMemoryContext, and reparent it under CacheMemoryContext when
+ * complete.
+ */
+static void
+load_domaintype_info(TypeCacheEntry *typentry)
+{
+ Oid typeOid = typentry->type_id;
+ DomainConstraintCache *dcc;
+ bool notNull = false;
+ DomainConstraintState **ccons;
+ int cconslen;
+ Relation conRel;
+ MemoryContext oldcxt;
+
+ /*
+ * If we're here, any existing constraint info is stale, so release it.
+ * For safety, be sure to null the link before trying to delete the data.
+ */
+ if (typentry->domainData)
+ {
+ dcc = typentry->domainData;
+ typentry->domainData = NULL;
+ decr_dcc_refcount(dcc);
+ }
+
+ /*
+ * We try to optimize the common case of no domain constraints, so don't
+ * create the dcc object and context until we find a constraint. Likewise
+ * for the temp sorting array.
+ */
+ dcc = NULL;
+ ccons = NULL;
+ cconslen = 0;
+
+ /*
+ * Scan pg_constraint for relevant constraints. We want to find
+ * constraints for not just this domain, but any ancestor domains, so the
+ * outer loop crawls up the domain stack.
+ */
+ conRel = table_open(ConstraintRelationId, AccessShareLock);
+
+ for (;;)
+ {
+ HeapTuple tup;
+ HeapTuple conTup;
+ Form_pg_type typTup;
+ int nccons = 0;
+ ScanKeyData key[1];
+ SysScanDesc scan;
+
+ tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typeOid));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for type %u", typeOid);
+ typTup = (Form_pg_type) GETSTRUCT(tup);
+
+ if (typTup->typtype != TYPTYPE_DOMAIN)
+ {
+ /* Not a domain, so done */
+ ReleaseSysCache(tup);
+ break;
+ }
+
+ /* Test for NOT NULL Constraint */
+ if (typTup->typnotnull)
+ notNull = true;
+
+ /* Look for CHECK Constraints on this domain */
+ ScanKeyInit(&key[0],
+ Anum_pg_constraint_contypid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(typeOid));
+
+ scan = systable_beginscan(conRel, ConstraintTypidIndexId, true,
+ NULL, 1, key);
+
+ while (HeapTupleIsValid(conTup = systable_getnext(scan)))
+ {
+ Form_pg_constraint c = (Form_pg_constraint) GETSTRUCT(conTup);
+ Datum val;
+ bool isNull;
+ char *constring;
+ Expr *check_expr;
+ DomainConstraintState *r;
+
+ /* Ignore non-CHECK constraints (presently, shouldn't be any) */
+ if (c->contype != CONSTRAINT_CHECK)
+ continue;
+
+ /* Not expecting conbin to be NULL, but we'll test for it anyway */
+ val = fastgetattr(conTup, Anum_pg_constraint_conbin,
+ conRel->rd_att, &isNull);
+ if (isNull)
+ elog(ERROR, "domain \"%s\" constraint \"%s\" has NULL conbin",
+ NameStr(typTup->typname), NameStr(c->conname));
+
+ /* Convert conbin to C string in caller context */
+ constring = TextDatumGetCString(val);
+
+ /* Create the DomainConstraintCache object and context if needed */
+ if (dcc == NULL)
+ {
+ MemoryContext cxt;
+
+ cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "Domain constraints",
+ ALLOCSET_SMALL_SIZES);
+ dcc = (DomainConstraintCache *)
+ MemoryContextAlloc(cxt, sizeof(DomainConstraintCache));
+ dcc->constraints = NIL;
+ dcc->dccContext = cxt;
+ dcc->dccRefCount = 0;
+ }
+
+ /* Create node trees in DomainConstraintCache's context */
+ oldcxt = MemoryContextSwitchTo(dcc->dccContext);
+
+ check_expr = (Expr *) stringToNode(constring);
+
+ /*
+ * Plan the expression, since ExecInitExpr will expect that.
+ *
+ * Note: caching the result of expression_planner() is not very
+ * good practice. Ideally we'd use a CachedExpression here so
+ * that we would react promptly to, eg, changes in inlined
+ * functions. However, because we don't support mutable domain
+ * CHECK constraints, it's not really clear that it's worth the
+ * extra overhead to do that.
+ */
+ check_expr = expression_planner(check_expr);
+
+ r = makeNode(DomainConstraintState);
+ r->constrainttype = DOM_CONSTRAINT_CHECK;
+ r->name = pstrdup(NameStr(c->conname));
+ r->check_expr = check_expr;
+ r->check_exprstate = NULL;
+
+ MemoryContextSwitchTo(oldcxt);
+
+ /* Accumulate constraints in an array, for sorting below */
+ if (ccons == NULL)
+ {
+ cconslen = 8;
+ ccons = (DomainConstraintState **)
+ palloc(cconslen * sizeof(DomainConstraintState *));
+ }
+ else if (nccons >= cconslen)
+ {
+ cconslen *= 2;
+ ccons = (DomainConstraintState **)
+ repalloc(ccons, cconslen * sizeof(DomainConstraintState *));
+ }
+ ccons[nccons++] = r;
+ }
+
+ systable_endscan(scan);
+
+ if (nccons > 0)
+ {
+ /*
+ * Sort the items for this domain, so that CHECKs are applied in a
+ * deterministic order.
+ */
+ if (nccons > 1)
+ qsort(ccons, nccons, sizeof(DomainConstraintState *), dcs_cmp);
+
+ /*
+ * Now attach them to the overall list. Use lcons() here because
+ * constraints of parent domains should be applied earlier.
+ */
+ oldcxt = MemoryContextSwitchTo(dcc->dccContext);
+ while (nccons > 0)
+ dcc->constraints = lcons(ccons[--nccons], dcc->constraints);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /* loop to next domain in stack */
+ typeOid = typTup->typbasetype;
+ ReleaseSysCache(tup);
+ }
+
+ table_close(conRel, AccessShareLock);
+
+ /*
+ * Only need to add one NOT NULL check regardless of how many domains in
+ * the stack request it.
+ */
+ if (notNull)
+ {
+ DomainConstraintState *r;
+
+ /* Create the DomainConstraintCache object and context if needed */
+ if (dcc == NULL)
+ {
+ MemoryContext cxt;
+
+ cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "Domain constraints",
+ ALLOCSET_SMALL_SIZES);
+ dcc = (DomainConstraintCache *)
+ MemoryContextAlloc(cxt, sizeof(DomainConstraintCache));
+ dcc->constraints = NIL;
+ dcc->dccContext = cxt;
+ dcc->dccRefCount = 0;
+ }
+
+ /* Create node trees in DomainConstraintCache's context */
+ oldcxt = MemoryContextSwitchTo(dcc->dccContext);
+
+ r = makeNode(DomainConstraintState);
+
+ r->constrainttype = DOM_CONSTRAINT_NOTNULL;
+ r->name = pstrdup("NOT NULL");
+ r->check_expr = NULL;
+ r->check_exprstate = NULL;
+
+ /* lcons to apply the nullness check FIRST */
+ dcc->constraints = lcons(r, dcc->constraints);
+
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ /*
+ * If we made a constraint object, move it into CacheMemoryContext and
+ * attach it to the typcache entry.
+ */
+ if (dcc)
+ {
+ MemoryContextSetParent(dcc->dccContext, CacheMemoryContext);
+ typentry->domainData = dcc;
+ dcc->dccRefCount++; /* count the typcache's reference */
+ }
+
+ /* Either way, the typcache entry's domain data is now valid. */
+ typentry->flags |= TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS;
+}
+
+/*
+ * qsort comparator to sort DomainConstraintState pointers by name
+ */
+static int
+dcs_cmp(const void *a, const void *b)
+{
+ const DomainConstraintState *const *ca = (const DomainConstraintState *const *) a;
+ const DomainConstraintState *const *cb = (const DomainConstraintState *const *) b;
+
+ return strcmp((*ca)->name, (*cb)->name);
+}
+
+/*
+ * decr_dcc_refcount --- decrement a DomainConstraintCache's refcount,
+ * and free it if no references remain
+ */
+static void
+decr_dcc_refcount(DomainConstraintCache *dcc)
+{
+ Assert(dcc->dccRefCount > 0);
+ if (--(dcc->dccRefCount) <= 0)
+ MemoryContextDelete(dcc->dccContext);
+}
+
+/*
+ * Context reset/delete callback for a DomainConstraintRef
+ */
+static void
+dccref_deletion_callback(void *arg)
+{
+ DomainConstraintRef *ref = (DomainConstraintRef *) arg;
+ DomainConstraintCache *dcc = ref->dcc;
+
+ /* Paranoia --- be sure link is nulled before trying to release */
+ if (dcc)
+ {
+ ref->constraints = NIL;
+ ref->dcc = NULL;
+ decr_dcc_refcount(dcc);
+ }
+}
+
+/*
+ * prep_domain_constraints --- prepare domain constraints for execution
+ *
+ * The expression trees stored in the DomainConstraintCache's list are
+ * converted to executable expression state trees stored in execctx.
+ */
+static List *
+prep_domain_constraints(List *constraints, MemoryContext execctx)
+{
+ List *result = NIL;
+ MemoryContext oldcxt;
+ ListCell *lc;
+
+ oldcxt = MemoryContextSwitchTo(execctx);
+
+ foreach(lc, constraints)
+ {
+ DomainConstraintState *r = (DomainConstraintState *) lfirst(lc);
+ DomainConstraintState *newr;
+
+ newr = makeNode(DomainConstraintState);
+ newr->constrainttype = r->constrainttype;
+ newr->name = r->name;
+ newr->check_expr = r->check_expr;
+ newr->check_exprstate = ExecInitExpr(r->check_expr, NULL);
+
+ result = lappend(result, newr);
+ }
+
+ MemoryContextSwitchTo(oldcxt);
+
+ return result;
+}
+
+/*
+ * InitDomainConstraintRef --- initialize a DomainConstraintRef struct
+ *
+ * Caller must tell us the MemoryContext in which the DomainConstraintRef
+ * lives. The ref will be cleaned up when that context is reset/deleted.
+ *
+ * Caller must also tell us whether it wants check_exprstate fields to be
+ * computed in the DomainConstraintState nodes attached to this ref.
+ * If it doesn't, we need not make a copy of the DomainConstraintState list.
+ */
+void
+InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref,
+ MemoryContext refctx, bool need_exprstate)
+{
+ /* Look up the typcache entry --- we assume it survives indefinitely */
+ ref->tcache = lookup_type_cache(type_id, TYPECACHE_DOMAIN_CONSTR_INFO);
+ ref->need_exprstate = need_exprstate;
+ /* For safety, establish the callback before acquiring a refcount */
+ ref->refctx = refctx;
+ ref->dcc = NULL;
+ ref->callback.func = dccref_deletion_callback;
+ ref->callback.arg = (void *) ref;
+ MemoryContextRegisterResetCallback(refctx, &ref->callback);
+ /* Acquire refcount if there are constraints, and set up exported list */
+ if (ref->tcache->domainData)
+ {
+ ref->dcc = ref->tcache->domainData;
+ ref->dcc->dccRefCount++;
+ if (ref->need_exprstate)
+ ref->constraints = prep_domain_constraints(ref->dcc->constraints,
+ ref->refctx);
+ else
+ ref->constraints = ref->dcc->constraints;
+ }
+ else
+ ref->constraints = NIL;
+}
+
+/*
+ * UpdateDomainConstraintRef --- recheck validity of domain constraint info
+ *
+ * If the domain's constraint set changed, ref->constraints is updated to
+ * point at a new list of cached constraints.
+ *
+ * In the normal case where nothing happened to the domain, this is cheap
+ * enough that it's reasonable (and expected) to check before *each* use
+ * of the constraint info.
+ */
+void
+UpdateDomainConstraintRef(DomainConstraintRef *ref)
+{
+ TypeCacheEntry *typentry = ref->tcache;
+
+ /* Make sure typcache entry's data is up to date */
+ if ((typentry->flags & TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS) == 0 &&
+ typentry->typtype == TYPTYPE_DOMAIN)
+ load_domaintype_info(typentry);
+
+ /* Transfer to ref object if there's new info, adjusting refcounts */
+ if (ref->dcc != typentry->domainData)
+ {
+ /* Paranoia --- be sure link is nulled before trying to release */
+ DomainConstraintCache *dcc = ref->dcc;
+
+ if (dcc)
+ {
+ /*
+ * Note: we just leak the previous list of executable domain
+ * constraints. Alternatively, we could keep those in a child
+ * context of ref->refctx and free that context at this point.
+ * However, in practice this code path will be taken so seldom
+ * that the extra bookkeeping for a child context doesn't seem
+ * worthwhile; we'll just allow a leak for the lifespan of refctx.
+ */
+ ref->constraints = NIL;
+ ref->dcc = NULL;
+ decr_dcc_refcount(dcc);
+ }
+ dcc = typentry->domainData;
+ if (dcc)
+ {
+ ref->dcc = dcc;
+ dcc->dccRefCount++;
+ if (ref->need_exprstate)
+ ref->constraints = prep_domain_constraints(dcc->constraints,
+ ref->refctx);
+ else
+ ref->constraints = dcc->constraints;
+ }
+ }
+}
+
+/*
+ * DomainHasConstraints --- utility routine to check if a domain has constraints
+ *
+ * This is defined to return false, not fail, if type is not a domain.
+ */
+bool
+DomainHasConstraints(Oid type_id)
+{
+ TypeCacheEntry *typentry;
+
+ /*
+ * Note: a side effect is to cause the typcache's domain data to become
+ * valid. This is fine since we'll likely need it soon if there is any.
+ */
+ typentry = lookup_type_cache(type_id, TYPECACHE_DOMAIN_CONSTR_INFO);
+
+ return (typentry->domainData != NULL);
+}
+
+
+/*
+ * array_element_has_equality and friends are helper routines to check
+ * whether we should believe that array_eq and related functions will work
+ * on the given array type or composite type.
+ *
+ * The logic above may call these repeatedly on the same type entry, so we
+ * make use of the typentry->flags field to cache the results once known.
+ * Also, we assume that we'll probably want all these facts about the type
+ * if we want any, so we cache them all using only one lookup of the
+ * component datatype(s).
+ */
+
+static bool
+array_element_has_equality(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_array_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_EQUALITY) != 0;
+}
+
+static bool
+array_element_has_compare(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_array_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_COMPARE) != 0;
+}
+
+static bool
+array_element_has_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_array_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_HASHING) != 0;
+}
+
+static bool
+array_element_has_extended_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_array_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_EXTENDED_HASHING) != 0;
+}
+
+static void
+cache_array_element_properties(TypeCacheEntry *typentry)
+{
+ Oid elem_type = get_base_element_type(typentry->type_id);
+
+ if (OidIsValid(elem_type))
+ {
+ TypeCacheEntry *elementry;
+
+ elementry = lookup_type_cache(elem_type,
+ TYPECACHE_EQ_OPR |
+ TYPECACHE_CMP_PROC |
+ TYPECACHE_HASH_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC);
+ if (OidIsValid(elementry->eq_opr))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_EQUALITY;
+ if (OidIsValid(elementry->cmp_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_COMPARE;
+ if (OidIsValid(elementry->hash_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_HASHING;
+ if (OidIsValid(elementry->hash_extended_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_EXTENDED_HASHING;
+ }
+ typentry->flags |= TCFLAGS_CHECKED_ELEM_PROPERTIES;
+}
+
+/*
+ * Likewise, some helper functions for composite types.
+ */
+
+static bool
+record_fields_have_equality(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_FIELD_PROPERTIES))
+ cache_record_field_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_FIELD_EQUALITY) != 0;
+}
+
+static bool
+record_fields_have_compare(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_FIELD_PROPERTIES))
+ cache_record_field_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_FIELD_COMPARE) != 0;
+}
+
+static bool
+record_fields_have_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_FIELD_PROPERTIES))
+ cache_record_field_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_FIELD_HASHING) != 0;
+}
+
+static bool
+record_fields_have_extended_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_FIELD_PROPERTIES))
+ cache_record_field_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_FIELD_EXTENDED_HASHING) != 0;
+}
+
+static void
+cache_record_field_properties(TypeCacheEntry *typentry)
+{
+ /*
+ * For type RECORD, we can't really tell what will work, since we don't
+ * have access here to the specific anonymous type. Just assume that
+ * equality and comparison will (we may get a failure at runtime). We
+ * could also claim that hashing works, but then if code that has the
+ * option between a comparison-based (sort-based) and a hash-based plan
+ * chooses hashing, stuff could fail that would otherwise work if it chose
+ * a comparison-based plan. In practice more types support comparison
+ * than hashing.
+ */
+ if (typentry->type_id == RECORDOID)
+ {
+ typentry->flags |= (TCFLAGS_HAVE_FIELD_EQUALITY |
+ TCFLAGS_HAVE_FIELD_COMPARE);
+ }
+ else if (typentry->typtype == TYPTYPE_COMPOSITE)
+ {
+ TupleDesc tupdesc;
+ int newflags;
+ int i;
+
+ /* Fetch composite type's tupdesc if we don't have it already */
+ if (typentry->tupDesc == NULL)
+ load_typcache_tupdesc(typentry);
+ tupdesc = typentry->tupDesc;
+
+ /* Must bump the refcount while we do additional catalog lookups */
+ IncrTupleDescRefCount(tupdesc);
+
+ /* Have each property if all non-dropped fields have the property */
+ newflags = (TCFLAGS_HAVE_FIELD_EQUALITY |
+ TCFLAGS_HAVE_FIELD_COMPARE |
+ TCFLAGS_HAVE_FIELD_HASHING |
+ TCFLAGS_HAVE_FIELD_EXTENDED_HASHING);
+ for (i = 0; i < tupdesc->natts; i++)
+ {
+ TypeCacheEntry *fieldentry;
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (attr->attisdropped)
+ continue;
+
+ fieldentry = lookup_type_cache(attr->atttypid,
+ TYPECACHE_EQ_OPR |
+ TYPECACHE_CMP_PROC |
+ TYPECACHE_HASH_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC);
+ if (!OidIsValid(fieldentry->eq_opr))
+ newflags &= ~TCFLAGS_HAVE_FIELD_EQUALITY;
+ if (!OidIsValid(fieldentry->cmp_proc))
+ newflags &= ~TCFLAGS_HAVE_FIELD_COMPARE;
+ if (!OidIsValid(fieldentry->hash_proc))
+ newflags &= ~TCFLAGS_HAVE_FIELD_HASHING;
+ if (!OidIsValid(fieldentry->hash_extended_proc))
+ newflags &= ~TCFLAGS_HAVE_FIELD_EXTENDED_HASHING;
+
+ /* We can drop out of the loop once we disprove all bits */
+ if (newflags == 0)
+ break;
+ }
+ typentry->flags |= newflags;
+
+ DecrTupleDescRefCount(tupdesc);
+ }
+ else if (typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ /* If it's domain over composite, copy base type's properties */
+ TypeCacheEntry *baseentry;
+
+ /* load up basetype info if we didn't already */
+ if (typentry->domainBaseType == InvalidOid)
+ {
+ typentry->domainBaseTypmod = -1;
+ typentry->domainBaseType =
+ getBaseTypeAndTypmod(typentry->type_id,
+ &typentry->domainBaseTypmod);
+ }
+ baseentry = lookup_type_cache(typentry->domainBaseType,
+ TYPECACHE_EQ_OPR |
+ TYPECACHE_CMP_PROC |
+ TYPECACHE_HASH_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC);
+ if (baseentry->typtype == TYPTYPE_COMPOSITE)
+ {
+ typentry->flags |= TCFLAGS_DOMAIN_BASE_IS_COMPOSITE;
+ typentry->flags |= baseentry->flags & (TCFLAGS_HAVE_FIELD_EQUALITY |
+ TCFLAGS_HAVE_FIELD_COMPARE |
+ TCFLAGS_HAVE_FIELD_HASHING |
+ TCFLAGS_HAVE_FIELD_EXTENDED_HASHING);
+ }
+ }
+ typentry->flags |= TCFLAGS_CHECKED_FIELD_PROPERTIES;
+}
+
+/*
+ * Likewise, some helper functions for range and multirange types.
+ *
+ * We can borrow the flag bits for array element properties to use for range
+ * element properties, since those flag bits otherwise have no use in a
+ * range or multirange type's typcache entry.
+ */
+
+static bool
+range_element_has_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_range_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_HASHING) != 0;
+}
+
+static bool
+range_element_has_extended_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_range_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_EXTENDED_HASHING) != 0;
+}
+
+static void
+cache_range_element_properties(TypeCacheEntry *typentry)
+{
+ /* load up subtype link if we didn't already */
+ if (typentry->rngelemtype == NULL &&
+ typentry->typtype == TYPTYPE_RANGE)
+ load_rangetype_info(typentry);
+
+ if (typentry->rngelemtype != NULL)
+ {
+ TypeCacheEntry *elementry;
+
+ /* might need to calculate subtype's hash function properties */
+ elementry = lookup_type_cache(typentry->rngelemtype->type_id,
+ TYPECACHE_HASH_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC);
+ if (OidIsValid(elementry->hash_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_HASHING;
+ if (OidIsValid(elementry->hash_extended_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_EXTENDED_HASHING;
+ }
+ typentry->flags |= TCFLAGS_CHECKED_ELEM_PROPERTIES;
+}
+
+static bool
+multirange_element_has_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_multirange_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_HASHING) != 0;
+}
+
+static bool
+multirange_element_has_extended_hashing(TypeCacheEntry *typentry)
+{
+ if (!(typentry->flags & TCFLAGS_CHECKED_ELEM_PROPERTIES))
+ cache_multirange_element_properties(typentry);
+ return (typentry->flags & TCFLAGS_HAVE_ELEM_EXTENDED_HASHING) != 0;
+}
+
+static void
+cache_multirange_element_properties(TypeCacheEntry *typentry)
+{
+ /* load up range link if we didn't already */
+ if (typentry->rngtype == NULL &&
+ typentry->typtype == TYPTYPE_MULTIRANGE)
+ load_multirangetype_info(typentry);
+
+ if (typentry->rngtype != NULL && typentry->rngtype->rngelemtype != NULL)
+ {
+ TypeCacheEntry *elementry;
+
+ /* might need to calculate subtype's hash function properties */
+ elementry = lookup_type_cache(typentry->rngtype->rngelemtype->type_id,
+ TYPECACHE_HASH_PROC |
+ TYPECACHE_HASH_EXTENDED_PROC);
+ if (OidIsValid(elementry->hash_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_HASHING;
+ if (OidIsValid(elementry->hash_extended_proc))
+ typentry->flags |= TCFLAGS_HAVE_ELEM_EXTENDED_HASHING;
+ }
+ typentry->flags |= TCFLAGS_CHECKED_ELEM_PROPERTIES;
+}
+
+/*
+ * Make sure that RecordCacheArray and RecordIdentifierArray are large enough
+ * to store 'typmod'.
+ */
+static void
+ensure_record_cache_typmod_slot_exists(int32 typmod)
+{
+ if (RecordCacheArray == NULL)
+ {
+ RecordCacheArray = (RecordCacheArrayEntry *)
+ MemoryContextAllocZero(CacheMemoryContext, 64 * sizeof(RecordCacheArrayEntry));
+ RecordCacheArrayLen = 64;
+ }
+
+ if (typmod >= RecordCacheArrayLen)
+ {
+ int32 newlen = pg_nextpower2_32(typmod + 1);
+
+ RecordCacheArray = (RecordCacheArrayEntry *)
+ repalloc(RecordCacheArray,
+ newlen * sizeof(RecordCacheArrayEntry));
+ memset(RecordCacheArray + RecordCacheArrayLen, 0,
+ (newlen - RecordCacheArrayLen) * sizeof(RecordCacheArrayEntry));
+ RecordCacheArrayLen = newlen;
+ }
+}
+
+/*
+ * lookup_rowtype_tupdesc_internal --- internal routine to lookup a rowtype
+ *
+ * Same API as lookup_rowtype_tupdesc_noerror, but the returned tupdesc
+ * hasn't had its refcount bumped.
+ */
+static TupleDesc
+lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
+{
+ if (type_id != RECORDOID)
+ {
+ /*
+ * It's a named composite type, so use the regular typcache.
+ */
+ TypeCacheEntry *typentry;
+
+ typentry = lookup_type_cache(type_id, TYPECACHE_TUPDESC);
+ if (typentry->tupDesc == NULL && !noError)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(type_id))));
+ return typentry->tupDesc;
+ }
+ else
+ {
+ /*
+ * It's a transient record type, so look in our record-type table.
+ */
+ if (typmod >= 0)
+ {
+ /* It is already in our local cache? */
+ if (typmod < RecordCacheArrayLen &&
+ RecordCacheArray[typmod].tupdesc != NULL)
+ return RecordCacheArray[typmod].tupdesc;
+
+ /* Are we attached to a shared record typmod registry? */
+ if (CurrentSession->shared_typmod_registry != NULL)
+ {
+ SharedTypmodTableEntry *entry;
+
+ /* Try to find it in the shared typmod index. */
+ entry = dshash_find(CurrentSession->shared_typmod_table,
+ &typmod, false);
+ if (entry != NULL)
+ {
+ TupleDesc tupdesc;
+
+ tupdesc = (TupleDesc)
+ dsa_get_address(CurrentSession->area,
+ entry->shared_tupdesc);
+ Assert(typmod == tupdesc->tdtypmod);
+
+ /* We may need to extend the local RecordCacheArray. */
+ ensure_record_cache_typmod_slot_exists(typmod);
+
+ /*
+ * Our local array can now point directly to the TupleDesc
+ * in shared memory, which is non-reference-counted.
+ */
+ RecordCacheArray[typmod].tupdesc = tupdesc;
+ Assert(tupdesc->tdrefcount == -1);
+
+ /*
+ * We don't share tupdesc identifiers across processes, so
+ * assign one locally.
+ */
+ RecordCacheArray[typmod].id = ++tupledesc_id_counter;
+
+ dshash_release_lock(CurrentSession->shared_typmod_table,
+ entry);
+
+ return RecordCacheArray[typmod].tupdesc;
+ }
+ }
+ }
+
+ if (!noError)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("record type has not been registered")));
+ return NULL;
+ }
+}
+
+/*
+ * lookup_rowtype_tupdesc
+ *
+ * Given a typeid/typmod that should describe a known composite type,
+ * return the tuple descriptor for the type. Will ereport on failure.
+ * (Use ereport because this is reachable with user-specified OIDs,
+ * for example from record_in().)
+ *
+ * Note: on success, we increment the refcount of the returned TupleDesc,
+ * and log the reference in CurrentResourceOwner. Caller must call
+ * ReleaseTupleDesc when done using the tupdesc. (There are some
+ * cases in which the returned tupdesc is not refcounted, in which
+ * case PinTupleDesc/ReleaseTupleDesc are no-ops; but in these cases
+ * the tupdesc is guaranteed to live till process exit.)
+ */
+TupleDesc
+lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
+{
+ TupleDesc tupDesc;
+
+ tupDesc = lookup_rowtype_tupdesc_internal(type_id, typmod, false);
+ PinTupleDesc(tupDesc);
+ return tupDesc;
+}
+
+/*
+ * lookup_rowtype_tupdesc_noerror
+ *
+ * As above, but if the type is not a known composite type and noError
+ * is true, returns NULL instead of ereport'ing. (Note that if a bogus
+ * type_id is passed, you'll get an ereport anyway.)
+ */
+TupleDesc
+lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod, bool noError)
+{
+ TupleDesc tupDesc;
+
+ tupDesc = lookup_rowtype_tupdesc_internal(type_id, typmod, noError);
+ if (tupDesc != NULL)
+ PinTupleDesc(tupDesc);
+ return tupDesc;
+}
+
+/*
+ * lookup_rowtype_tupdesc_copy
+ *
+ * Like lookup_rowtype_tupdesc(), but the returned TupleDesc has been
+ * copied into the CurrentMemoryContext and is not reference-counted.
+ */
+TupleDesc
+lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod)
+{
+ TupleDesc tmp;
+
+ tmp = lookup_rowtype_tupdesc_internal(type_id, typmod, false);
+ return CreateTupleDescCopyConstr(tmp);
+}
+
+/*
+ * lookup_rowtype_tupdesc_domain
+ *
+ * Same as lookup_rowtype_tupdesc_noerror(), except that the type can also be
+ * a domain over a named composite type; so this is effectively equivalent to
+ * lookup_rowtype_tupdesc_noerror(getBaseType(type_id), typmod, noError)
+ * except for being a tad faster.
+ *
+ * Note: the reason we don't fold the look-through-domain behavior into plain
+ * lookup_rowtype_tupdesc() is that we want callers to know they might be
+ * dealing with a domain. Otherwise they might construct a tuple that should
+ * be of the domain type, but not apply domain constraints.
+ */
+TupleDesc
+lookup_rowtype_tupdesc_domain(Oid type_id, int32 typmod, bool noError)
+{
+ TupleDesc tupDesc;
+
+ if (type_id != RECORDOID)
+ {
+ /*
+ * Check for domain or named composite type. We might as well load
+ * whichever data is needed.
+ */
+ TypeCacheEntry *typentry;
+
+ typentry = lookup_type_cache(type_id,
+ TYPECACHE_TUPDESC |
+ TYPECACHE_DOMAIN_BASE_INFO);
+ if (typentry->typtype == TYPTYPE_DOMAIN)
+ return lookup_rowtype_tupdesc_noerror(typentry->domainBaseType,
+ typentry->domainBaseTypmod,
+ noError);
+ if (typentry->tupDesc == NULL && !noError)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(type_id))));
+ tupDesc = typentry->tupDesc;
+ }
+ else
+ tupDesc = lookup_rowtype_tupdesc_internal(type_id, typmod, noError);
+ if (tupDesc != NULL)
+ PinTupleDesc(tupDesc);
+ return tupDesc;
+}
+
+/*
+ * Hash function for the hash table of RecordCacheEntry.
+ */
+static uint32
+record_type_typmod_hash(const void *data, size_t size)
+{
+ RecordCacheEntry *entry = (RecordCacheEntry *) data;
+
+ return hashTupleDesc(entry->tupdesc);
+}
+
+/*
+ * Match function for the hash table of RecordCacheEntry.
+ */
+static int
+record_type_typmod_compare(const void *a, const void *b, size_t size)
+{
+ RecordCacheEntry *left = (RecordCacheEntry *) a;
+ RecordCacheEntry *right = (RecordCacheEntry *) b;
+
+ return equalTupleDescs(left->tupdesc, right->tupdesc) ? 0 : 1;
+}
+
+/*
+ * assign_record_type_typmod
+ *
+ * Given a tuple descriptor for a RECORD type, find or create a cache entry
+ * for the type, and set the tupdesc's tdtypmod field to a value that will
+ * identify this cache entry to lookup_rowtype_tupdesc.
+ */
+void
+assign_record_type_typmod(TupleDesc tupDesc)
+{
+ RecordCacheEntry *recentry;
+ TupleDesc entDesc;
+ bool found;
+ MemoryContext oldcxt;
+
+ Assert(tupDesc->tdtypeid == RECORDOID);
+
+ if (RecordCacheHash == NULL)
+ {
+ /* First time through: initialize the hash table */
+ HASHCTL ctl;
+
+ ctl.keysize = sizeof(TupleDesc); /* just the pointer */
+ ctl.entrysize = sizeof(RecordCacheEntry);
+ ctl.hash = record_type_typmod_hash;
+ ctl.match = record_type_typmod_compare;
+ RecordCacheHash = hash_create("Record information cache", 64,
+ &ctl,
+ HASH_ELEM | HASH_FUNCTION | HASH_COMPARE);
+
+ /* Also make sure CacheMemoryContext exists */
+ if (!CacheMemoryContext)
+ CreateCacheMemoryContext();
+ }
+
+ /*
+ * Find a hashtable entry for this tuple descriptor. We don't use
+ * HASH_ENTER yet, because if it's missing, we need to make sure that all
+ * the allocations succeed before we create the new entry.
+ */
+ recentry = (RecordCacheEntry *) hash_search(RecordCacheHash,
+ (void *) &tupDesc,
+ HASH_FIND, &found);
+ if (found && recentry->tupdesc != NULL)
+ {
+ tupDesc->tdtypmod = recentry->tupdesc->tdtypmod;
+ return;
+ }
+
+ /* Not present, so need to manufacture an entry */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+
+ /* Look in the SharedRecordTypmodRegistry, if attached */
+ entDesc = find_or_make_matching_shared_tupledesc(tupDesc);
+ if (entDesc == NULL)
+ {
+ /*
+ * Make sure we have room before we CreateTupleDescCopy() or advance
+ * NextRecordTypmod.
+ */
+ ensure_record_cache_typmod_slot_exists(NextRecordTypmod);
+
+ /* Reference-counted local cache only. */
+ entDesc = CreateTupleDescCopy(tupDesc);
+ entDesc->tdrefcount = 1;
+ entDesc->tdtypmod = NextRecordTypmod++;
+ }
+ else
+ {
+ ensure_record_cache_typmod_slot_exists(entDesc->tdtypmod);
+ }
+
+ RecordCacheArray[entDesc->tdtypmod].tupdesc = entDesc;
+
+ /* Assign a unique tupdesc identifier, too. */
+ RecordCacheArray[entDesc->tdtypmod].id = ++tupledesc_id_counter;
+
+ /* Fully initialized; create the hash table entry */
+ recentry = (RecordCacheEntry *) hash_search(RecordCacheHash,
+ (void *) &tupDesc,
+ HASH_ENTER, NULL);
+ recentry->tupdesc = entDesc;
+
+ /* Update the caller's tuple descriptor. */
+ tupDesc->tdtypmod = entDesc->tdtypmod;
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * assign_record_type_identifier
+ *
+ * Get an identifier, which will be unique over the lifespan of this backend
+ * process, for the current tuple descriptor of the specified composite type.
+ * For named composite types, the value is guaranteed to change if the type's
+ * definition does. For registered RECORD types, the value will not change
+ * once assigned, since the registered type won't either. If an anonymous
+ * RECORD type is specified, we return a new identifier on each call.
+ */
+uint64
+assign_record_type_identifier(Oid type_id, int32 typmod)
+{
+ if (type_id != RECORDOID)
+ {
+ /*
+ * It's a named composite type, so use the regular typcache.
+ */
+ TypeCacheEntry *typentry;
+
+ typentry = lookup_type_cache(type_id, TYPECACHE_TUPDESC);
+ if (typentry->tupDesc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(type_id))));
+ Assert(typentry->tupDesc_identifier != 0);
+ return typentry->tupDesc_identifier;
+ }
+ else
+ {
+ /*
+ * It's a transient record type, so look in our record-type table.
+ */
+ if (typmod >= 0 && typmod < RecordCacheArrayLen &&
+ RecordCacheArray[typmod].tupdesc != NULL)
+ {
+ Assert(RecordCacheArray[typmod].id != 0);
+ return RecordCacheArray[typmod].id;
+ }
+
+ /* For anonymous or unrecognized record type, generate a new ID */
+ return ++tupledesc_id_counter;
+ }
+}
+
+/*
+ * Return the amount of shmem required to hold a SharedRecordTypmodRegistry.
+ * This exists only to avoid exposing private innards of
+ * SharedRecordTypmodRegistry in a header.
+ */
+size_t
+SharedRecordTypmodRegistryEstimate(void)
+{
+ return sizeof(SharedRecordTypmodRegistry);
+}
+
+/*
+ * Initialize 'registry' in a pre-existing shared memory region, which must be
+ * maximally aligned and have space for SharedRecordTypmodRegistryEstimate()
+ * bytes.
+ *
+ * 'area' will be used to allocate shared memory space as required for the
+ * typemod registration. The current process, expected to be a leader process
+ * in a parallel query, will be attached automatically and its current record
+ * types will be loaded into *registry. While attached, all calls to
+ * assign_record_type_typmod will use the shared registry. Worker backends
+ * will need to attach explicitly.
+ *
+ * Note that this function takes 'area' and 'segment' as arguments rather than
+ * accessing them via CurrentSession, because they aren't installed there
+ * until after this function runs.
+ */
+void
+SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
+ dsm_segment *segment,
+ dsa_area *area)
+{
+ MemoryContext old_context;
+ dshash_table *record_table;
+ dshash_table *typmod_table;
+ int32 typmod;
+
+ Assert(!IsParallelWorker());
+
+ /* We can't already be attached to a shared registry. */
+ Assert(CurrentSession->shared_typmod_registry == NULL);
+ Assert(CurrentSession->shared_record_table == NULL);
+ Assert(CurrentSession->shared_typmod_table == NULL);
+
+ old_context = MemoryContextSwitchTo(TopMemoryContext);
+
+ /* Create the hash table of tuple descriptors indexed by themselves. */
+ record_table = dshash_create(area, &srtr_record_table_params, area);
+
+ /* Create the hash table of tuple descriptors indexed by typmod. */
+ typmod_table = dshash_create(area, &srtr_typmod_table_params, NULL);
+
+ MemoryContextSwitchTo(old_context);
+
+ /* Initialize the SharedRecordTypmodRegistry. */
+ registry->record_table_handle = dshash_get_hash_table_handle(record_table);
+ registry->typmod_table_handle = dshash_get_hash_table_handle(typmod_table);
+ pg_atomic_init_u32(&registry->next_typmod, NextRecordTypmod);
+
+ /*
+ * Copy all entries from this backend's private registry into the shared
+ * registry.
+ */
+ for (typmod = 0; typmod < NextRecordTypmod; ++typmod)
+ {
+ SharedTypmodTableEntry *typmod_table_entry;
+ SharedRecordTableEntry *record_table_entry;
+ SharedRecordTableKey record_table_key;
+ dsa_pointer shared_dp;
+ TupleDesc tupdesc;
+ bool found;
+
+ tupdesc = RecordCacheArray[typmod].tupdesc;
+ if (tupdesc == NULL)
+ continue;
+
+ /* Copy the TupleDesc into shared memory. */
+ shared_dp = share_tupledesc(area, tupdesc, typmod);
+
+ /* Insert into the typmod table. */
+ typmod_table_entry = dshash_find_or_insert(typmod_table,
+ &tupdesc->tdtypmod,
+ &found);
+ if (found)
+ elog(ERROR, "cannot create duplicate shared record typmod");
+ typmod_table_entry->typmod = tupdesc->tdtypmod;
+ typmod_table_entry->shared_tupdesc = shared_dp;
+ dshash_release_lock(typmod_table, typmod_table_entry);
+
+ /* Insert into the record table. */
+ record_table_key.shared = false;
+ record_table_key.u.local_tupdesc = tupdesc;
+ record_table_entry = dshash_find_or_insert(record_table,
+ &record_table_key,
+ &found);
+ if (!found)
+ {
+ record_table_entry->key.shared = true;
+ record_table_entry->key.u.shared_tupdesc = shared_dp;
+ }
+ dshash_release_lock(record_table, record_table_entry);
+ }
+
+ /*
+ * Set up the global state that will tell assign_record_type_typmod and
+ * lookup_rowtype_tupdesc_internal about the shared registry.
+ */
+ CurrentSession->shared_record_table = record_table;
+ CurrentSession->shared_typmod_table = typmod_table;
+ CurrentSession->shared_typmod_registry = registry;
+
+ /*
+ * We install a detach hook in the leader, but only to handle cleanup on
+ * failure during GetSessionDsmHandle(). Once GetSessionDsmHandle() pins
+ * the memory, the leader process will use a shared registry until it
+ * exits.
+ */
+ on_dsm_detach(segment, shared_record_typmod_registry_detach, (Datum) 0);
+}
+
+/*
+ * Attach to 'registry', which must have been initialized already by another
+ * backend. Future calls to assign_record_type_typmod and
+ * lookup_rowtype_tupdesc_internal will use the shared registry until the
+ * current session is detached.
+ */
+void
+SharedRecordTypmodRegistryAttach(SharedRecordTypmodRegistry *registry)
+{
+ MemoryContext old_context;
+ dshash_table *record_table;
+ dshash_table *typmod_table;
+
+ Assert(IsParallelWorker());
+
+ /* We can't already be attached to a shared registry. */
+ Assert(CurrentSession != NULL);
+ Assert(CurrentSession->segment != NULL);
+ Assert(CurrentSession->area != NULL);
+ Assert(CurrentSession->shared_typmod_registry == NULL);
+ Assert(CurrentSession->shared_record_table == NULL);
+ Assert(CurrentSession->shared_typmod_table == NULL);
+
+ /*
+ * We can't already have typmods in our local cache, because they'd clash
+ * with those imported by SharedRecordTypmodRegistryInit. This should be
+ * a freshly started parallel worker. If we ever support worker
+ * recycling, a worker would need to zap its local cache in between
+ * servicing different queries, in order to be able to call this and
+ * synchronize typmods with a new leader; but that's problematic because
+ * we can't be very sure that record-typmod-related state hasn't escaped
+ * to anywhere else in the process.
+ */
+ Assert(NextRecordTypmod == 0);
+
+ old_context = MemoryContextSwitchTo(TopMemoryContext);
+
+ /* Attach to the two hash tables. */
+ record_table = dshash_attach(CurrentSession->area,
+ &srtr_record_table_params,
+ registry->record_table_handle,
+ CurrentSession->area);
+ typmod_table = dshash_attach(CurrentSession->area,
+ &srtr_typmod_table_params,
+ registry->typmod_table_handle,
+ NULL);
+
+ MemoryContextSwitchTo(old_context);
+
+ /*
+ * Set up detach hook to run at worker exit. Currently this is the same
+ * as the leader's detach hook, but in future they might need to be
+ * different.
+ */
+ on_dsm_detach(CurrentSession->segment,
+ shared_record_typmod_registry_detach,
+ PointerGetDatum(registry));
+
+ /*
+ * Set up the session state that will tell assign_record_type_typmod and
+ * lookup_rowtype_tupdesc_internal about the shared registry.
+ */
+ CurrentSession->shared_typmod_registry = registry;
+ CurrentSession->shared_record_table = record_table;
+ CurrentSession->shared_typmod_table = typmod_table;
+}
+
+/*
+ * TypeCacheRelCallback
+ * Relcache inval callback function
+ *
+ * Delete the cached tuple descriptor (if any) for the given rel's composite
+ * type, or for all composite types if relid == InvalidOid. Also reset
+ * whatever info we have cached about the composite type's comparability.
+ *
+ * This is called when a relcache invalidation event occurs for the given
+ * relid. We must scan the whole typcache hash since we don't know the
+ * type OID corresponding to the relid. We could do a direct search if this
+ * were a syscache-flush callback on pg_type, but then we would need all
+ * ALTER-TABLE-like commands that could modify a rowtype to issue syscache
+ * invals against the rel's pg_type OID. The extra SI signaling could very
+ * well cost more than we'd save, since in most usages there are not very
+ * many entries in a backend's typcache. The risk of bugs-of-omission seems
+ * high, too.
+ *
+ * Another possibility, with only localized impact, is to maintain a second
+ * hashtable that indexes composite-type typcache entries by their typrelid.
+ * But it's still not clear it's worth the trouble.
+ */
+static void
+TypeCacheRelCallback(Datum arg, Oid relid)
+{
+ HASH_SEQ_STATUS status;
+ TypeCacheEntry *typentry;
+
+ /* TypeCacheHash must exist, else this callback wouldn't be registered */
+ hash_seq_init(&status, TypeCacheHash);
+ while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
+ {
+ if (typentry->typtype == TYPTYPE_COMPOSITE)
+ {
+ /* Skip if no match, unless we're zapping all composite types */
+ if (relid != typentry->typrelid && relid != InvalidOid)
+ continue;
+
+ /* Delete tupdesc if we have it */
+ if (typentry->tupDesc != NULL)
+ {
+ /*
+ * Release our refcount, and free the tupdesc if none remain.
+ * (Can't use DecrTupleDescRefCount because this reference is
+ * not logged in current resource owner.)
+ */
+ Assert(typentry->tupDesc->tdrefcount > 0);
+ if (--typentry->tupDesc->tdrefcount == 0)
+ FreeTupleDesc(typentry->tupDesc);
+ typentry->tupDesc = NULL;
+
+ /*
+ * Also clear tupDesc_identifier, so that anything watching
+ * that will realize that the tupdesc has possibly changed.
+ * (Alternatively, we could specify that to detect possible
+ * tupdesc change, one must check for tupDesc != NULL as well
+ * as tupDesc_identifier being the same as what was previously
+ * seen. That seems error-prone.)
+ */
+ typentry->tupDesc_identifier = 0;
+ }
+
+ /* Reset equality/comparison/hashing validity information */
+ typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
+ }
+ else if (typentry->typtype == TYPTYPE_DOMAIN)
+ {
+ /*
+ * If it's domain over composite, reset flags. (We don't bother
+ * trying to determine whether the specific base type needs a
+ * reset.) Note that if we haven't determined whether the base
+ * type is composite, we don't need to reset anything.
+ */
+ if (typentry->flags & TCFLAGS_DOMAIN_BASE_IS_COMPOSITE)
+ typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
+ }
+ }
+}
+
+/*
+ * TypeCacheTypCallback
+ * Syscache inval callback function
+ *
+ * This is called when a syscache invalidation event occurs for any
+ * pg_type row. If we have information cached about that type, mark
+ * it as needing to be reloaded.
+ */
+static void
+TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ HASH_SEQ_STATUS status;
+ TypeCacheEntry *typentry;
+
+ /* TypeCacheHash must exist, else this callback wouldn't be registered */
+ hash_seq_init(&status, TypeCacheHash);
+ while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
+ {
+ /* Is this the targeted type row (or it's a total cache flush)? */
+ if (hashvalue == 0 || typentry->type_id_hash == hashvalue)
+ {
+ /*
+ * Mark the data obtained directly from pg_type as invalid. Also,
+ * if it's a domain, typnotnull might've changed, so we'll need to
+ * recalculate its constraints.
+ */
+ typentry->flags &= ~(TCFLAGS_HAVE_PG_TYPE_DATA |
+ TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS);
+ }
+ }
+}
+
+/*
+ * TypeCacheOpcCallback
+ * Syscache inval callback function
+ *
+ * This is called when a syscache invalidation event occurs for any pg_opclass
+ * row. In principle we could probably just invalidate data dependent on the
+ * particular opclass, but since updates on pg_opclass are rare in production
+ * it doesn't seem worth a lot of complication: we just mark all cached data
+ * invalid.
+ *
+ * Note that we don't bother watching for updates on pg_amop or pg_amproc.
+ * This should be safe because ALTER OPERATOR FAMILY ADD/DROP OPERATOR/FUNCTION
+ * is not allowed to be used to add/drop the primary operators and functions
+ * of an opclass, only cross-type members of a family; and the latter sorts
+ * of members are not going to get cached here.
+ */
+static void
+TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ HASH_SEQ_STATUS status;
+ TypeCacheEntry *typentry;
+
+ /* TypeCacheHash must exist, else this callback wouldn't be registered */
+ hash_seq_init(&status, TypeCacheHash);
+ while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
+ {
+ /* Reset equality/comparison/hashing validity information */
+ typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
+ }
+}
+
+/*
+ * TypeCacheConstrCallback
+ * Syscache inval callback function
+ *
+ * This is called when a syscache invalidation event occurs for any
+ * pg_constraint row. We flush information about domain constraints
+ * when this happens.
+ *
+ * It's slightly annoying that we can't tell whether the inval event was for
+ * a domain constraint record or not; there's usually more update traffic
+ * for table constraints than domain constraints, so we'll do a lot of
+ * useless flushes. Still, this is better than the old no-caching-at-all
+ * approach to domain constraints.
+ */
+static void
+TypeCacheConstrCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ TypeCacheEntry *typentry;
+
+ /*
+ * Because this is called very frequently, and typically very few of the
+ * typcache entries are for domains, we don't use hash_seq_search here.
+ * Instead we thread all the domain-type entries together so that we can
+ * visit them cheaply.
+ */
+ for (typentry = firstDomainTypeEntry;
+ typentry != NULL;
+ typentry = typentry->nextDomain)
+ {
+ /* Reset domain constraint validity information */
+ typentry->flags &= ~TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS;
+ }
+}
+
+
+/*
+ * Check if given OID is part of the subset that's sortable by comparisons
+ */
+static inline bool
+enum_known_sorted(TypeCacheEnumData *enumdata, Oid arg)
+{
+ Oid offset;
+
+ if (arg < enumdata->bitmap_base)
+ return false;
+ offset = arg - enumdata->bitmap_base;
+ if (offset > (Oid) INT_MAX)
+ return false;
+ return bms_is_member((int) offset, enumdata->sorted_values);
+}
+
+
+/*
+ * compare_values_of_enum
+ * Compare two members of an enum type.
+ * Return <0, 0, or >0 according as arg1 <, =, or > arg2.
+ *
+ * Note: currently, the enumData cache is refreshed only if we are asked
+ * to compare an enum value that is not already in the cache. This is okay
+ * because there is no support for re-ordering existing values, so comparisons
+ * of previously cached values will return the right answer even if other
+ * values have been added since we last loaded the cache.
+ *
+ * Note: the enum logic has a special-case rule about even-numbered versus
+ * odd-numbered OIDs, but we take no account of that rule here; this
+ * routine shouldn't even get called when that rule applies.
+ */
+int
+compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2)
+{
+ TypeCacheEnumData *enumdata;
+ EnumItem *item1;
+ EnumItem *item2;
+
+ /*
+ * Equal OIDs are certainly equal --- this case was probably handled by
+ * our caller, but we may as well check.
+ */
+ if (arg1 == arg2)
+ return 0;
+
+ /* Load up the cache if first time through */
+ if (tcache->enumData == NULL)
+ load_enum_cache_data(tcache);
+ enumdata = tcache->enumData;
+
+ /*
+ * If both OIDs are known-sorted, we can just compare them directly.
+ */
+ if (enum_known_sorted(enumdata, arg1) &&
+ enum_known_sorted(enumdata, arg2))
+ {
+ if (arg1 < arg2)
+ return -1;
+ else
+ return 1;
+ }
+
+ /*
+ * Slow path: we have to identify their actual sort-order positions.
+ */
+ item1 = find_enumitem(enumdata, arg1);
+ item2 = find_enumitem(enumdata, arg2);
+
+ if (item1 == NULL || item2 == NULL)
+ {
+ /*
+ * We couldn't find one or both values. That means the enum has
+ * changed under us, so re-initialize the cache and try again. We
+ * don't bother retrying the known-sorted case in this path.
+ */
+ load_enum_cache_data(tcache);
+ enumdata = tcache->enumData;
+
+ item1 = find_enumitem(enumdata, arg1);
+ item2 = find_enumitem(enumdata, arg2);
+
+ /*
+ * If we still can't find the values, complain: we must have corrupt
+ * data.
+ */
+ if (item1 == NULL)
+ elog(ERROR, "enum value %u not found in cache for enum %s",
+ arg1, format_type_be(tcache->type_id));
+ if (item2 == NULL)
+ elog(ERROR, "enum value %u not found in cache for enum %s",
+ arg2, format_type_be(tcache->type_id));
+ }
+
+ if (item1->sort_order < item2->sort_order)
+ return -1;
+ else if (item1->sort_order > item2->sort_order)
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * Load (or re-load) the enumData member of the typcache entry.
+ */
+static void
+load_enum_cache_data(TypeCacheEntry *tcache)
+{
+ TypeCacheEnumData *enumdata;
+ Relation enum_rel;
+ SysScanDesc enum_scan;
+ HeapTuple enum_tuple;
+ ScanKeyData skey;
+ EnumItem *items;
+ int numitems;
+ int maxitems;
+ Oid bitmap_base;
+ Bitmapset *bitmap;
+ MemoryContext oldcxt;
+ int bm_size,
+ start_pos;
+
+ /* Check that this is actually an enum */
+ if (tcache->typtype != TYPTYPE_ENUM)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("%s is not an enum",
+ format_type_be(tcache->type_id))));
+
+ /*
+ * Read all the information for members of the enum type. We collect the
+ * info in working memory in the caller's context, and then transfer it to
+ * permanent memory in CacheMemoryContext. This minimizes the risk of
+ * leaking memory from CacheMemoryContext in the event of an error partway
+ * through.
+ */
+ maxitems = 64;
+ items = (EnumItem *) palloc(sizeof(EnumItem) * maxitems);
+ numitems = 0;
+
+ /* Scan pg_enum for the members of the target enum type. */
+ ScanKeyInit(&skey,
+ Anum_pg_enum_enumtypid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(tcache->type_id));
+
+ enum_rel = table_open(EnumRelationId, AccessShareLock);
+ enum_scan = systable_beginscan(enum_rel,
+ EnumTypIdLabelIndexId,
+ true, NULL,
+ 1, &skey);
+
+ while (HeapTupleIsValid(enum_tuple = systable_getnext(enum_scan)))
+ {
+ Form_pg_enum en = (Form_pg_enum) GETSTRUCT(enum_tuple);
+
+ if (numitems >= maxitems)
+ {
+ maxitems *= 2;
+ items = (EnumItem *) repalloc(items, sizeof(EnumItem) * maxitems);
+ }
+ items[numitems].enum_oid = en->oid;
+ items[numitems].sort_order = en->enumsortorder;
+ numitems++;
+ }
+
+ systable_endscan(enum_scan);
+ table_close(enum_rel, AccessShareLock);
+
+ /* Sort the items into OID order */
+ qsort(items, numitems, sizeof(EnumItem), enum_oid_cmp);
+
+ /*
+ * Here, we create a bitmap listing a subset of the enum's OIDs that are
+ * known to be in order and can thus be compared with just OID comparison.
+ *
+ * The point of this is that the enum's initial OIDs were certainly in
+ * order, so there is some subset that can be compared via OID comparison;
+ * and we'd rather not do binary searches unnecessarily.
+ *
+ * This is somewhat heuristic, and might identify a subset of OIDs that
+ * isn't exactly what the type started with. That's okay as long as the
+ * subset is correctly sorted.
+ */
+ bitmap_base = InvalidOid;
+ bitmap = NULL;
+ bm_size = 1; /* only save sets of at least 2 OIDs */
+
+ for (start_pos = 0; start_pos < numitems - 1; start_pos++)
+ {
+ /*
+ * Identify longest sorted subsequence starting at start_pos
+ */
+ Bitmapset *this_bitmap = bms_make_singleton(0);
+ int this_bm_size = 1;
+ Oid start_oid = items[start_pos].enum_oid;
+ float4 prev_order = items[start_pos].sort_order;
+ int i;
+
+ for (i = start_pos + 1; i < numitems; i++)
+ {
+ Oid offset;
+
+ offset = items[i].enum_oid - start_oid;
+ /* quit if bitmap would be too large; cutoff is arbitrary */
+ if (offset >= 8192)
+ break;
+ /* include the item if it's in-order */
+ if (items[i].sort_order > prev_order)
+ {
+ prev_order = items[i].sort_order;
+ this_bitmap = bms_add_member(this_bitmap, (int) offset);
+ this_bm_size++;
+ }
+ }
+
+ /* Remember it if larger than previous best */
+ if (this_bm_size > bm_size)
+ {
+ bms_free(bitmap);
+ bitmap_base = start_oid;
+ bitmap = this_bitmap;
+ bm_size = this_bm_size;
+ }
+ else
+ bms_free(this_bitmap);
+
+ /*
+ * Done if it's not possible to find a longer sequence in the rest of
+ * the list. In typical cases this will happen on the first
+ * iteration, which is why we create the bitmaps on the fly instead of
+ * doing a second pass over the list.
+ */
+ if (bm_size >= (numitems - start_pos - 1))
+ break;
+ }
+
+ /* OK, copy the data into CacheMemoryContext */
+ oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
+ enumdata = (TypeCacheEnumData *)
+ palloc(offsetof(TypeCacheEnumData, enum_values) +
+ numitems * sizeof(EnumItem));
+ enumdata->bitmap_base = bitmap_base;
+ enumdata->sorted_values = bms_copy(bitmap);
+ enumdata->num_values = numitems;
+ memcpy(enumdata->enum_values, items, numitems * sizeof(EnumItem));
+ MemoryContextSwitchTo(oldcxt);
+
+ pfree(items);
+ bms_free(bitmap);
+
+ /* And link the finished cache struct into the typcache */
+ if (tcache->enumData != NULL)
+ pfree(tcache->enumData);
+ tcache->enumData = enumdata;
+}
+
+/*
+ * Locate the EnumItem with the given OID, if present
+ */
+static EnumItem *
+find_enumitem(TypeCacheEnumData *enumdata, Oid arg)
+{
+ EnumItem srch;
+
+ /* On some versions of Solaris, bsearch of zero items dumps core */
+ if (enumdata->num_values <= 0)
+ return NULL;
+
+ srch.enum_oid = arg;
+ return bsearch(&srch, enumdata->enum_values, enumdata->num_values,
+ sizeof(EnumItem), enum_oid_cmp);
+}
+
+/*
+ * qsort comparison function for OID-ordered EnumItems
+ */
+static int
+enum_oid_cmp(const void *left, const void *right)
+{
+ const EnumItem *l = (const EnumItem *) left;
+ const EnumItem *r = (const EnumItem *) right;
+
+ if (l->enum_oid < r->enum_oid)
+ return -1;
+ else if (l->enum_oid > r->enum_oid)
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * Copy 'tupdesc' into newly allocated shared memory in 'area', set its typmod
+ * to the given value and return a dsa_pointer.
+ */
+static dsa_pointer
+share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
+{
+ dsa_pointer shared_dp;
+ TupleDesc shared;
+
+ shared_dp = dsa_allocate(area, TupleDescSize(tupdesc));
+ shared = (TupleDesc) dsa_get_address(area, shared_dp);
+ TupleDescCopy(shared, tupdesc);
+ shared->tdtypmod = typmod;
+
+ return shared_dp;
+}
+
+/*
+ * If we are attached to a SharedRecordTypmodRegistry, use it to find or
+ * create a shared TupleDesc that matches 'tupdesc'. Otherwise return NULL.
+ * Tuple descriptors returned by this function are not reference counted, and
+ * will exist at least as long as the current backend remained attached to the
+ * current session.
+ */
+static TupleDesc
+find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
+{
+ TupleDesc result;
+ SharedRecordTableKey key;
+ SharedRecordTableEntry *record_table_entry;
+ SharedTypmodTableEntry *typmod_table_entry;
+ dsa_pointer shared_dp;
+ bool found;
+ uint32 typmod;
+
+ /* If not even attached, nothing to do. */
+ if (CurrentSession->shared_typmod_registry == NULL)
+ return NULL;
+
+ /* Try to find a matching tuple descriptor in the record table. */
+ key.shared = false;
+ key.u.local_tupdesc = tupdesc;
+ record_table_entry = (SharedRecordTableEntry *)
+ dshash_find(CurrentSession->shared_record_table, &key, false);
+ if (record_table_entry)
+ {
+ Assert(record_table_entry->key.shared);
+ dshash_release_lock(CurrentSession->shared_record_table,
+ record_table_entry);
+ result = (TupleDesc)
+ dsa_get_address(CurrentSession->area,
+ record_table_entry->key.u.shared_tupdesc);
+ Assert(result->tdrefcount == -1);
+
+ return result;
+ }
+
+ /* Allocate a new typmod number. This will be wasted if we error out. */
+ typmod = (int)
+ pg_atomic_fetch_add_u32(&CurrentSession->shared_typmod_registry->next_typmod,
+ 1);
+
+ /* Copy the TupleDesc into shared memory. */
+ shared_dp = share_tupledesc(CurrentSession->area, tupdesc, typmod);
+
+ /*
+ * Create an entry in the typmod table so that others will understand this
+ * typmod number.
+ */
+ PG_TRY();
+ {
+ typmod_table_entry = (SharedTypmodTableEntry *)
+ dshash_find_or_insert(CurrentSession->shared_typmod_table,
+ &typmod, &found);
+ if (found)
+ elog(ERROR, "cannot create duplicate shared record typmod");
+ }
+ PG_CATCH();
+ {
+ dsa_free(CurrentSession->area, shared_dp);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+ typmod_table_entry->typmod = typmod;
+ typmod_table_entry->shared_tupdesc = shared_dp;
+ dshash_release_lock(CurrentSession->shared_typmod_table,
+ typmod_table_entry);
+
+ /*
+ * Finally create an entry in the record table so others with matching
+ * tuple descriptors can reuse the typmod.
+ */
+ record_table_entry = (SharedRecordTableEntry *)
+ dshash_find_or_insert(CurrentSession->shared_record_table, &key,
+ &found);
+ if (found)
+ {
+ /*
+ * Someone concurrently inserted a matching tuple descriptor since the
+ * first time we checked. Use that one instead.
+ */
+ dshash_release_lock(CurrentSession->shared_record_table,
+ record_table_entry);
+
+ /* Might as well free up the space used by the one we created. */
+ found = dshash_delete_key(CurrentSession->shared_typmod_table,
+ &typmod);
+ Assert(found);
+ dsa_free(CurrentSession->area, shared_dp);
+
+ /* Return the one we found. */
+ Assert(record_table_entry->key.shared);
+ result = (TupleDesc)
+ dsa_get_address(CurrentSession->area,
+ record_table_entry->key.u.shared_tupdesc);
+ Assert(result->tdrefcount == -1);
+
+ return result;
+ }
+
+ /* Store it and return it. */
+ record_table_entry->key.shared = true;
+ record_table_entry->key.u.shared_tupdesc = shared_dp;
+ dshash_release_lock(CurrentSession->shared_record_table,
+ record_table_entry);
+ result = (TupleDesc)
+ dsa_get_address(CurrentSession->area, shared_dp);
+ Assert(result->tdrefcount == -1);
+
+ return result;
+}
+
+/*
+ * On-DSM-detach hook to forget about the current shared record typmod
+ * infrastructure. This is currently used by both leader and workers.
+ */
+static void
+shared_record_typmod_registry_detach(dsm_segment *segment, Datum datum)
+{
+ /* Be cautious here: maybe we didn't finish initializing. */
+ if (CurrentSession->shared_record_table != NULL)
+ {
+ dshash_detach(CurrentSession->shared_record_table);
+ CurrentSession->shared_record_table = NULL;
+ }
+ if (CurrentSession->shared_typmod_table != NULL)
+ {
+ dshash_detach(CurrentSession->shared_typmod_table);
+ CurrentSession->shared_typmod_table = NULL;
+ }
+ CurrentSession->shared_typmod_registry = NULL;
+}
diff --git a/src/backend/utils/errcodes.h b/src/backend/utils/errcodes.h
new file mode 100644
index 0000000..a2f604c
--- /dev/null
+++ b/src/backend/utils/errcodes.h
@@ -0,0 +1,354 @@
+/* autogenerated from src/backend/utils/errcodes.txt, do not edit */
+/* there is deliberately not an #ifndef ERRCODES_H here */
+
+/* Class 00 - Successful Completion */
+#define ERRCODE_SUCCESSFUL_COMPLETION MAKE_SQLSTATE('0','0','0','0','0')
+
+/* Class 01 - Warning */
+#define ERRCODE_WARNING MAKE_SQLSTATE('0','1','0','0','0')
+#define ERRCODE_WARNING_DYNAMIC_RESULT_SETS_RETURNED MAKE_SQLSTATE('0','1','0','0','C')
+#define ERRCODE_WARNING_IMPLICIT_ZERO_BIT_PADDING MAKE_SQLSTATE('0','1','0','0','8')
+#define ERRCODE_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION MAKE_SQLSTATE('0','1','0','0','3')
+#define ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED MAKE_SQLSTATE('0','1','0','0','7')
+#define ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED MAKE_SQLSTATE('0','1','0','0','6')
+#define ERRCODE_WARNING_STRING_DATA_RIGHT_TRUNCATION MAKE_SQLSTATE('0','1','0','0','4')
+#define ERRCODE_WARNING_DEPRECATED_FEATURE MAKE_SQLSTATE('0','1','P','0','1')
+
+/* Class 02 - No Data (this is also a warning class per the SQL standard) */
+#define ERRCODE_NO_DATA MAKE_SQLSTATE('0','2','0','0','0')
+#define ERRCODE_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED MAKE_SQLSTATE('0','2','0','0','1')
+
+/* Class 03 - SQL Statement Not Yet Complete */
+#define ERRCODE_SQL_STATEMENT_NOT_YET_COMPLETE MAKE_SQLSTATE('0','3','0','0','0')
+
+/* Class 08 - Connection Exception */
+#define ERRCODE_CONNECTION_EXCEPTION MAKE_SQLSTATE('0','8','0','0','0')
+#define ERRCODE_CONNECTION_DOES_NOT_EXIST MAKE_SQLSTATE('0','8','0','0','3')
+#define ERRCODE_CONNECTION_FAILURE MAKE_SQLSTATE('0','8','0','0','6')
+#define ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION MAKE_SQLSTATE('0','8','0','0','1')
+#define ERRCODE_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION MAKE_SQLSTATE('0','8','0','0','4')
+#define ERRCODE_TRANSACTION_RESOLUTION_UNKNOWN MAKE_SQLSTATE('0','8','0','0','7')
+#define ERRCODE_PROTOCOL_VIOLATION MAKE_SQLSTATE('0','8','P','0','1')
+
+/* Class 09 - Triggered Action Exception */
+#define ERRCODE_TRIGGERED_ACTION_EXCEPTION MAKE_SQLSTATE('0','9','0','0','0')
+
+/* Class 0A - Feature Not Supported */
+#define ERRCODE_FEATURE_NOT_SUPPORTED MAKE_SQLSTATE('0','A','0','0','0')
+
+/* Class 0B - Invalid Transaction Initiation */
+#define ERRCODE_INVALID_TRANSACTION_INITIATION MAKE_SQLSTATE('0','B','0','0','0')
+
+/* Class 0F - Locator Exception */
+#define ERRCODE_LOCATOR_EXCEPTION MAKE_SQLSTATE('0','F','0','0','0')
+#define ERRCODE_L_E_INVALID_SPECIFICATION MAKE_SQLSTATE('0','F','0','0','1')
+
+/* Class 0L - Invalid Grantor */
+#define ERRCODE_INVALID_GRANTOR MAKE_SQLSTATE('0','L','0','0','0')
+#define ERRCODE_INVALID_GRANT_OPERATION MAKE_SQLSTATE('0','L','P','0','1')
+
+/* Class 0P - Invalid Role Specification */
+#define ERRCODE_INVALID_ROLE_SPECIFICATION MAKE_SQLSTATE('0','P','0','0','0')
+
+/* Class 0Z - Diagnostics Exception */
+#define ERRCODE_DIAGNOSTICS_EXCEPTION MAKE_SQLSTATE('0','Z','0','0','0')
+#define ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER MAKE_SQLSTATE('0','Z','0','0','2')
+
+/* Class 20 - Case Not Found */
+#define ERRCODE_CASE_NOT_FOUND MAKE_SQLSTATE('2','0','0','0','0')
+
+/* Class 21 - Cardinality Violation */
+#define ERRCODE_CARDINALITY_VIOLATION MAKE_SQLSTATE('2','1','0','0','0')
+
+/* Class 22 - Data Exception */
+#define ERRCODE_DATA_EXCEPTION MAKE_SQLSTATE('2','2','0','0','0')
+#define ERRCODE_ARRAY_ELEMENT_ERROR MAKE_SQLSTATE('2','2','0','2','E')
+#define ERRCODE_ARRAY_SUBSCRIPT_ERROR MAKE_SQLSTATE('2','2','0','2','E')
+#define ERRCODE_CHARACTER_NOT_IN_REPERTOIRE MAKE_SQLSTATE('2','2','0','2','1')
+#define ERRCODE_DATETIME_FIELD_OVERFLOW MAKE_SQLSTATE('2','2','0','0','8')
+#define ERRCODE_DATETIME_VALUE_OUT_OF_RANGE MAKE_SQLSTATE('2','2','0','0','8')
+#define ERRCODE_DIVISION_BY_ZERO MAKE_SQLSTATE('2','2','0','1','2')
+#define ERRCODE_ERROR_IN_ASSIGNMENT MAKE_SQLSTATE('2','2','0','0','5')
+#define ERRCODE_ESCAPE_CHARACTER_CONFLICT MAKE_SQLSTATE('2','2','0','0','B')
+#define ERRCODE_INDICATOR_OVERFLOW MAKE_SQLSTATE('2','2','0','2','2')
+#define ERRCODE_INTERVAL_FIELD_OVERFLOW MAKE_SQLSTATE('2','2','0','1','5')
+#define ERRCODE_INVALID_ARGUMENT_FOR_LOG MAKE_SQLSTATE('2','2','0','1','E')
+#define ERRCODE_INVALID_ARGUMENT_FOR_NTILE MAKE_SQLSTATE('2','2','0','1','4')
+#define ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE MAKE_SQLSTATE('2','2','0','1','6')
+#define ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION MAKE_SQLSTATE('2','2','0','1','F')
+#define ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION MAKE_SQLSTATE('2','2','0','1','G')
+#define ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST MAKE_SQLSTATE('2','2','0','1','8')
+#define ERRCODE_INVALID_DATETIME_FORMAT MAKE_SQLSTATE('2','2','0','0','7')
+#define ERRCODE_INVALID_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','0','1','9')
+#define ERRCODE_INVALID_ESCAPE_OCTET MAKE_SQLSTATE('2','2','0','0','D')
+#define ERRCODE_INVALID_ESCAPE_SEQUENCE MAKE_SQLSTATE('2','2','0','2','5')
+#define ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','P','0','6')
+#define ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE MAKE_SQLSTATE('2','2','0','1','0')
+#define ERRCODE_INVALID_PARAMETER_VALUE MAKE_SQLSTATE('2','2','0','2','3')
+#define ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE MAKE_SQLSTATE('2','2','0','1','3')
+#define ERRCODE_INVALID_REGULAR_EXPRESSION MAKE_SQLSTATE('2','2','0','1','B')
+#define ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE MAKE_SQLSTATE('2','2','0','1','W')
+#define ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE MAKE_SQLSTATE('2','2','0','1','X')
+#define ERRCODE_INVALID_TABLESAMPLE_ARGUMENT MAKE_SQLSTATE('2','2','0','2','H')
+#define ERRCODE_INVALID_TABLESAMPLE_REPEAT MAKE_SQLSTATE('2','2','0','2','G')
+#define ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE MAKE_SQLSTATE('2','2','0','0','9')
+#define ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','0','0','C')
+#define ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH MAKE_SQLSTATE('2','2','0','0','G')
+#define ERRCODE_NULL_VALUE_NOT_ALLOWED MAKE_SQLSTATE('2','2','0','0','4')
+#define ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER MAKE_SQLSTATE('2','2','0','0','2')
+#define ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE MAKE_SQLSTATE('2','2','0','0','3')
+#define ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED MAKE_SQLSTATE('2','2','0','0','H')
+#define ERRCODE_STRING_DATA_LENGTH_MISMATCH MAKE_SQLSTATE('2','2','0','2','6')
+#define ERRCODE_STRING_DATA_RIGHT_TRUNCATION MAKE_SQLSTATE('2','2','0','0','1')
+#define ERRCODE_SUBSTRING_ERROR MAKE_SQLSTATE('2','2','0','1','1')
+#define ERRCODE_TRIM_ERROR MAKE_SQLSTATE('2','2','0','2','7')
+#define ERRCODE_UNTERMINATED_C_STRING MAKE_SQLSTATE('2','2','0','2','4')
+#define ERRCODE_ZERO_LENGTH_CHARACTER_STRING MAKE_SQLSTATE('2','2','0','0','F')
+#define ERRCODE_FLOATING_POINT_EXCEPTION MAKE_SQLSTATE('2','2','P','0','1')
+#define ERRCODE_INVALID_TEXT_REPRESENTATION MAKE_SQLSTATE('2','2','P','0','2')
+#define ERRCODE_INVALID_BINARY_REPRESENTATION MAKE_SQLSTATE('2','2','P','0','3')
+#define ERRCODE_BAD_COPY_FILE_FORMAT MAKE_SQLSTATE('2','2','P','0','4')
+#define ERRCODE_UNTRANSLATABLE_CHARACTER MAKE_SQLSTATE('2','2','P','0','5')
+#define ERRCODE_NOT_AN_XML_DOCUMENT MAKE_SQLSTATE('2','2','0','0','L')
+#define ERRCODE_INVALID_XML_DOCUMENT MAKE_SQLSTATE('2','2','0','0','M')
+#define ERRCODE_INVALID_XML_CONTENT MAKE_SQLSTATE('2','2','0','0','N')
+#define ERRCODE_INVALID_XML_COMMENT MAKE_SQLSTATE('2','2','0','0','S')
+#define ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION MAKE_SQLSTATE('2','2','0','0','T')
+#define ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE MAKE_SQLSTATE('2','2','0','3','0')
+#define ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION MAKE_SQLSTATE('2','2','0','3','1')
+#define ERRCODE_INVALID_JSON_TEXT MAKE_SQLSTATE('2','2','0','3','2')
+#define ERRCODE_INVALID_SQL_JSON_SUBSCRIPT MAKE_SQLSTATE('2','2','0','3','3')
+#define ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM MAKE_SQLSTATE('2','2','0','3','4')
+#define ERRCODE_NO_SQL_JSON_ITEM MAKE_SQLSTATE('2','2','0','3','5')
+#define ERRCODE_NON_NUMERIC_SQL_JSON_ITEM MAKE_SQLSTATE('2','2','0','3','6')
+#define ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT MAKE_SQLSTATE('2','2','0','3','7')
+#define ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED MAKE_SQLSTATE('2','2','0','3','8')
+#define ERRCODE_SQL_JSON_ARRAY_NOT_FOUND MAKE_SQLSTATE('2','2','0','3','9')
+#define ERRCODE_SQL_JSON_MEMBER_NOT_FOUND MAKE_SQLSTATE('2','2','0','3','A')
+#define ERRCODE_SQL_JSON_NUMBER_NOT_FOUND MAKE_SQLSTATE('2','2','0','3','B')
+#define ERRCODE_SQL_JSON_OBJECT_NOT_FOUND MAKE_SQLSTATE('2','2','0','3','C')
+#define ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS MAKE_SQLSTATE('2','2','0','3','D')
+#define ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS MAKE_SQLSTATE('2','2','0','3','E')
+#define ERRCODE_SQL_JSON_SCALAR_REQUIRED MAKE_SQLSTATE('2','2','0','3','F')
+#define ERRCODE_SQL_JSON_ITEM_CANNOT_BE_CAST_TO_TARGET_TYPE MAKE_SQLSTATE('2','2','0','3','G')
+
+/* Class 23 - Integrity Constraint Violation */
+#define ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION MAKE_SQLSTATE('2','3','0','0','0')
+#define ERRCODE_RESTRICT_VIOLATION MAKE_SQLSTATE('2','3','0','0','1')
+#define ERRCODE_NOT_NULL_VIOLATION MAKE_SQLSTATE('2','3','5','0','2')
+#define ERRCODE_FOREIGN_KEY_VIOLATION MAKE_SQLSTATE('2','3','5','0','3')
+#define ERRCODE_UNIQUE_VIOLATION MAKE_SQLSTATE('2','3','5','0','5')
+#define ERRCODE_CHECK_VIOLATION MAKE_SQLSTATE('2','3','5','1','4')
+#define ERRCODE_EXCLUSION_VIOLATION MAKE_SQLSTATE('2','3','P','0','1')
+
+/* Class 24 - Invalid Cursor State */
+#define ERRCODE_INVALID_CURSOR_STATE MAKE_SQLSTATE('2','4','0','0','0')
+
+/* Class 25 - Invalid Transaction State */
+#define ERRCODE_INVALID_TRANSACTION_STATE MAKE_SQLSTATE('2','5','0','0','0')
+#define ERRCODE_ACTIVE_SQL_TRANSACTION MAKE_SQLSTATE('2','5','0','0','1')
+#define ERRCODE_BRANCH_TRANSACTION_ALREADY_ACTIVE MAKE_SQLSTATE('2','5','0','0','2')
+#define ERRCODE_HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL MAKE_SQLSTATE('2','5','0','0','8')
+#define ERRCODE_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','3')
+#define ERRCODE_INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','4')
+#define ERRCODE_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','5')
+#define ERRCODE_READ_ONLY_SQL_TRANSACTION MAKE_SQLSTATE('2','5','0','0','6')
+#define ERRCODE_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED MAKE_SQLSTATE('2','5','0','0','7')
+#define ERRCODE_NO_ACTIVE_SQL_TRANSACTION MAKE_SQLSTATE('2','5','P','0','1')
+#define ERRCODE_IN_FAILED_SQL_TRANSACTION MAKE_SQLSTATE('2','5','P','0','2')
+#define ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT MAKE_SQLSTATE('2','5','P','0','3')
+
+/* Class 26 - Invalid SQL Statement Name */
+#define ERRCODE_INVALID_SQL_STATEMENT_NAME MAKE_SQLSTATE('2','6','0','0','0')
+
+/* Class 27 - Triggered Data Change Violation */
+#define ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION MAKE_SQLSTATE('2','7','0','0','0')
+
+/* Class 28 - Invalid Authorization Specification */
+#define ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION MAKE_SQLSTATE('2','8','0','0','0')
+#define ERRCODE_INVALID_PASSWORD MAKE_SQLSTATE('2','8','P','0','1')
+
+/* Class 2B - Dependent Privilege Descriptors Still Exist */
+#define ERRCODE_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST MAKE_SQLSTATE('2','B','0','0','0')
+#define ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST MAKE_SQLSTATE('2','B','P','0','1')
+
+/* Class 2D - Invalid Transaction Termination */
+#define ERRCODE_INVALID_TRANSACTION_TERMINATION MAKE_SQLSTATE('2','D','0','0','0')
+
+/* Class 2F - SQL Routine Exception */
+#define ERRCODE_SQL_ROUTINE_EXCEPTION MAKE_SQLSTATE('2','F','0','0','0')
+#define ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT MAKE_SQLSTATE('2','F','0','0','5')
+#define ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('2','F','0','0','2')
+#define ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED MAKE_SQLSTATE('2','F','0','0','3')
+#define ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('2','F','0','0','4')
+
+/* Class 34 - Invalid Cursor Name */
+#define ERRCODE_INVALID_CURSOR_NAME MAKE_SQLSTATE('3','4','0','0','0')
+
+/* Class 38 - External Routine Exception */
+#define ERRCODE_EXTERNAL_ROUTINE_EXCEPTION MAKE_SQLSTATE('3','8','0','0','0')
+#define ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','1')
+#define ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','2')
+#define ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED MAKE_SQLSTATE('3','8','0','0','3')
+#define ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','4')
+
+/* Class 39 - External Routine Invocation Exception */
+#define ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION MAKE_SQLSTATE('3','9','0','0','0')
+#define ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED MAKE_SQLSTATE('3','9','0','0','1')
+#define ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED MAKE_SQLSTATE('3','9','0','0','4')
+#define ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','1')
+#define ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','2')
+#define ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','3')
+
+/* Class 3B - Savepoint Exception */
+#define ERRCODE_SAVEPOINT_EXCEPTION MAKE_SQLSTATE('3','B','0','0','0')
+#define ERRCODE_S_E_INVALID_SPECIFICATION MAKE_SQLSTATE('3','B','0','0','1')
+
+/* Class 3D - Invalid Catalog Name */
+#define ERRCODE_INVALID_CATALOG_NAME MAKE_SQLSTATE('3','D','0','0','0')
+
+/* Class 3F - Invalid Schema Name */
+#define ERRCODE_INVALID_SCHEMA_NAME MAKE_SQLSTATE('3','F','0','0','0')
+
+/* Class 40 - Transaction Rollback */
+#define ERRCODE_TRANSACTION_ROLLBACK MAKE_SQLSTATE('4','0','0','0','0')
+#define ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION MAKE_SQLSTATE('4','0','0','0','2')
+#define ERRCODE_T_R_SERIALIZATION_FAILURE MAKE_SQLSTATE('4','0','0','0','1')
+#define ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN MAKE_SQLSTATE('4','0','0','0','3')
+#define ERRCODE_T_R_DEADLOCK_DETECTED MAKE_SQLSTATE('4','0','P','0','1')
+
+/* Class 42 - Syntax Error or Access Rule Violation */
+#define ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION MAKE_SQLSTATE('4','2','0','0','0')
+#define ERRCODE_SYNTAX_ERROR MAKE_SQLSTATE('4','2','6','0','1')
+#define ERRCODE_INSUFFICIENT_PRIVILEGE MAKE_SQLSTATE('4','2','5','0','1')
+#define ERRCODE_CANNOT_COERCE MAKE_SQLSTATE('4','2','8','4','6')
+#define ERRCODE_GROUPING_ERROR MAKE_SQLSTATE('4','2','8','0','3')
+#define ERRCODE_WINDOWING_ERROR MAKE_SQLSTATE('4','2','P','2','0')
+#define ERRCODE_INVALID_RECURSION MAKE_SQLSTATE('4','2','P','1','9')
+#define ERRCODE_INVALID_FOREIGN_KEY MAKE_SQLSTATE('4','2','8','3','0')
+#define ERRCODE_INVALID_NAME MAKE_SQLSTATE('4','2','6','0','2')
+#define ERRCODE_NAME_TOO_LONG MAKE_SQLSTATE('4','2','6','2','2')
+#define ERRCODE_RESERVED_NAME MAKE_SQLSTATE('4','2','9','3','9')
+#define ERRCODE_DATATYPE_MISMATCH MAKE_SQLSTATE('4','2','8','0','4')
+#define ERRCODE_INDETERMINATE_DATATYPE MAKE_SQLSTATE('4','2','P','1','8')
+#define ERRCODE_COLLATION_MISMATCH MAKE_SQLSTATE('4','2','P','2','1')
+#define ERRCODE_INDETERMINATE_COLLATION MAKE_SQLSTATE('4','2','P','2','2')
+#define ERRCODE_WRONG_OBJECT_TYPE MAKE_SQLSTATE('4','2','8','0','9')
+#define ERRCODE_GENERATED_ALWAYS MAKE_SQLSTATE('4','2','8','C','9')
+#define ERRCODE_UNDEFINED_COLUMN MAKE_SQLSTATE('4','2','7','0','3')
+#define ERRCODE_UNDEFINED_CURSOR MAKE_SQLSTATE('3','4','0','0','0')
+#define ERRCODE_UNDEFINED_DATABASE MAKE_SQLSTATE('3','D','0','0','0')
+#define ERRCODE_UNDEFINED_FUNCTION MAKE_SQLSTATE('4','2','8','8','3')
+#define ERRCODE_UNDEFINED_PSTATEMENT MAKE_SQLSTATE('2','6','0','0','0')
+#define ERRCODE_UNDEFINED_SCHEMA MAKE_SQLSTATE('3','F','0','0','0')
+#define ERRCODE_UNDEFINED_TABLE MAKE_SQLSTATE('4','2','P','0','1')
+#define ERRCODE_UNDEFINED_PARAMETER MAKE_SQLSTATE('4','2','P','0','2')
+#define ERRCODE_UNDEFINED_OBJECT MAKE_SQLSTATE('4','2','7','0','4')
+#define ERRCODE_DUPLICATE_COLUMN MAKE_SQLSTATE('4','2','7','0','1')
+#define ERRCODE_DUPLICATE_CURSOR MAKE_SQLSTATE('4','2','P','0','3')
+#define ERRCODE_DUPLICATE_DATABASE MAKE_SQLSTATE('4','2','P','0','4')
+#define ERRCODE_DUPLICATE_FUNCTION MAKE_SQLSTATE('4','2','7','2','3')
+#define ERRCODE_DUPLICATE_PSTATEMENT MAKE_SQLSTATE('4','2','P','0','5')
+#define ERRCODE_DUPLICATE_SCHEMA MAKE_SQLSTATE('4','2','P','0','6')
+#define ERRCODE_DUPLICATE_TABLE MAKE_SQLSTATE('4','2','P','0','7')
+#define ERRCODE_DUPLICATE_ALIAS MAKE_SQLSTATE('4','2','7','1','2')
+#define ERRCODE_DUPLICATE_OBJECT MAKE_SQLSTATE('4','2','7','1','0')
+#define ERRCODE_AMBIGUOUS_COLUMN MAKE_SQLSTATE('4','2','7','0','2')
+#define ERRCODE_AMBIGUOUS_FUNCTION MAKE_SQLSTATE('4','2','7','2','5')
+#define ERRCODE_AMBIGUOUS_PARAMETER MAKE_SQLSTATE('4','2','P','0','8')
+#define ERRCODE_AMBIGUOUS_ALIAS MAKE_SQLSTATE('4','2','P','0','9')
+#define ERRCODE_INVALID_COLUMN_REFERENCE MAKE_SQLSTATE('4','2','P','1','0')
+#define ERRCODE_INVALID_COLUMN_DEFINITION MAKE_SQLSTATE('4','2','6','1','1')
+#define ERRCODE_INVALID_CURSOR_DEFINITION MAKE_SQLSTATE('4','2','P','1','1')
+#define ERRCODE_INVALID_DATABASE_DEFINITION MAKE_SQLSTATE('4','2','P','1','2')
+#define ERRCODE_INVALID_FUNCTION_DEFINITION MAKE_SQLSTATE('4','2','P','1','3')
+#define ERRCODE_INVALID_PSTATEMENT_DEFINITION MAKE_SQLSTATE('4','2','P','1','4')
+#define ERRCODE_INVALID_SCHEMA_DEFINITION MAKE_SQLSTATE('4','2','P','1','5')
+#define ERRCODE_INVALID_TABLE_DEFINITION MAKE_SQLSTATE('4','2','P','1','6')
+#define ERRCODE_INVALID_OBJECT_DEFINITION MAKE_SQLSTATE('4','2','P','1','7')
+
+/* Class 44 - WITH CHECK OPTION Violation */
+#define ERRCODE_WITH_CHECK_OPTION_VIOLATION MAKE_SQLSTATE('4','4','0','0','0')
+
+/* Class 53 - Insufficient Resources */
+#define ERRCODE_INSUFFICIENT_RESOURCES MAKE_SQLSTATE('5','3','0','0','0')
+#define ERRCODE_DISK_FULL MAKE_SQLSTATE('5','3','1','0','0')
+#define ERRCODE_OUT_OF_MEMORY MAKE_SQLSTATE('5','3','2','0','0')
+#define ERRCODE_TOO_MANY_CONNECTIONS MAKE_SQLSTATE('5','3','3','0','0')
+#define ERRCODE_CONFIGURATION_LIMIT_EXCEEDED MAKE_SQLSTATE('5','3','4','0','0')
+
+/* Class 54 - Program Limit Exceeded */
+#define ERRCODE_PROGRAM_LIMIT_EXCEEDED MAKE_SQLSTATE('5','4','0','0','0')
+#define ERRCODE_STATEMENT_TOO_COMPLEX MAKE_SQLSTATE('5','4','0','0','1')
+#define ERRCODE_TOO_MANY_COLUMNS MAKE_SQLSTATE('5','4','0','1','1')
+#define ERRCODE_TOO_MANY_ARGUMENTS MAKE_SQLSTATE('5','4','0','2','3')
+
+/* Class 55 - Object Not In Prerequisite State */
+#define ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE MAKE_SQLSTATE('5','5','0','0','0')
+#define ERRCODE_OBJECT_IN_USE MAKE_SQLSTATE('5','5','0','0','6')
+#define ERRCODE_CANT_CHANGE_RUNTIME_PARAM MAKE_SQLSTATE('5','5','P','0','2')
+#define ERRCODE_LOCK_NOT_AVAILABLE MAKE_SQLSTATE('5','5','P','0','3')
+#define ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE MAKE_SQLSTATE('5','5','P','0','4')
+
+/* Class 57 - Operator Intervention */
+#define ERRCODE_OPERATOR_INTERVENTION MAKE_SQLSTATE('5','7','0','0','0')
+#define ERRCODE_QUERY_CANCELED MAKE_SQLSTATE('5','7','0','1','4')
+#define ERRCODE_ADMIN_SHUTDOWN MAKE_SQLSTATE('5','7','P','0','1')
+#define ERRCODE_CRASH_SHUTDOWN MAKE_SQLSTATE('5','7','P','0','2')
+#define ERRCODE_CANNOT_CONNECT_NOW MAKE_SQLSTATE('5','7','P','0','3')
+#define ERRCODE_DATABASE_DROPPED MAKE_SQLSTATE('5','7','P','0','4')
+#define ERRCODE_IDLE_SESSION_TIMEOUT MAKE_SQLSTATE('5','7','P','0','5')
+
+/* Class 58 - System Error (errors external to PostgreSQL itself) */
+#define ERRCODE_SYSTEM_ERROR MAKE_SQLSTATE('5','8','0','0','0')
+#define ERRCODE_IO_ERROR MAKE_SQLSTATE('5','8','0','3','0')
+#define ERRCODE_UNDEFINED_FILE MAKE_SQLSTATE('5','8','P','0','1')
+#define ERRCODE_DUPLICATE_FILE MAKE_SQLSTATE('5','8','P','0','2')
+
+/* Class 72 - Snapshot Failure */
+#define ERRCODE_SNAPSHOT_TOO_OLD MAKE_SQLSTATE('7','2','0','0','0')
+
+/* Class F0 - Configuration File Error */
+#define ERRCODE_CONFIG_FILE_ERROR MAKE_SQLSTATE('F','0','0','0','0')
+#define ERRCODE_LOCK_FILE_EXISTS MAKE_SQLSTATE('F','0','0','0','1')
+
+/* Class HV - Foreign Data Wrapper Error (SQL/MED) */
+#define ERRCODE_FDW_ERROR MAKE_SQLSTATE('H','V','0','0','0')
+#define ERRCODE_FDW_COLUMN_NAME_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','5')
+#define ERRCODE_FDW_DYNAMIC_PARAMETER_VALUE_NEEDED MAKE_SQLSTATE('H','V','0','0','2')
+#define ERRCODE_FDW_FUNCTION_SEQUENCE_ERROR MAKE_SQLSTATE('H','V','0','1','0')
+#define ERRCODE_FDW_INCONSISTENT_DESCRIPTOR_INFORMATION MAKE_SQLSTATE('H','V','0','2','1')
+#define ERRCODE_FDW_INVALID_ATTRIBUTE_VALUE MAKE_SQLSTATE('H','V','0','2','4')
+#define ERRCODE_FDW_INVALID_COLUMN_NAME MAKE_SQLSTATE('H','V','0','0','7')
+#define ERRCODE_FDW_INVALID_COLUMN_NUMBER MAKE_SQLSTATE('H','V','0','0','8')
+#define ERRCODE_FDW_INVALID_DATA_TYPE MAKE_SQLSTATE('H','V','0','0','4')
+#define ERRCODE_FDW_INVALID_DATA_TYPE_DESCRIPTORS MAKE_SQLSTATE('H','V','0','0','6')
+#define ERRCODE_FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER MAKE_SQLSTATE('H','V','0','9','1')
+#define ERRCODE_FDW_INVALID_HANDLE MAKE_SQLSTATE('H','V','0','0','B')
+#define ERRCODE_FDW_INVALID_OPTION_INDEX MAKE_SQLSTATE('H','V','0','0','C')
+#define ERRCODE_FDW_INVALID_OPTION_NAME MAKE_SQLSTATE('H','V','0','0','D')
+#define ERRCODE_FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH MAKE_SQLSTATE('H','V','0','9','0')
+#define ERRCODE_FDW_INVALID_STRING_FORMAT MAKE_SQLSTATE('H','V','0','0','A')
+#define ERRCODE_FDW_INVALID_USE_OF_NULL_POINTER MAKE_SQLSTATE('H','V','0','0','9')
+#define ERRCODE_FDW_TOO_MANY_HANDLES MAKE_SQLSTATE('H','V','0','1','4')
+#define ERRCODE_FDW_OUT_OF_MEMORY MAKE_SQLSTATE('H','V','0','0','1')
+#define ERRCODE_FDW_NO_SCHEMAS MAKE_SQLSTATE('H','V','0','0','P')
+#define ERRCODE_FDW_OPTION_NAME_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','J')
+#define ERRCODE_FDW_REPLY_HANDLE MAKE_SQLSTATE('H','V','0','0','K')
+#define ERRCODE_FDW_SCHEMA_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','Q')
+#define ERRCODE_FDW_TABLE_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','R')
+#define ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION MAKE_SQLSTATE('H','V','0','0','L')
+#define ERRCODE_FDW_UNABLE_TO_CREATE_REPLY MAKE_SQLSTATE('H','V','0','0','M')
+#define ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION MAKE_SQLSTATE('H','V','0','0','N')
+
+/* Class P0 - PL/pgSQL Error */
+#define ERRCODE_PLPGSQL_ERROR MAKE_SQLSTATE('P','0','0','0','0')
+#define ERRCODE_RAISE_EXCEPTION MAKE_SQLSTATE('P','0','0','0','1')
+#define ERRCODE_NO_DATA_FOUND MAKE_SQLSTATE('P','0','0','0','2')
+#define ERRCODE_TOO_MANY_ROWS MAKE_SQLSTATE('P','0','0','0','3')
+#define ERRCODE_ASSERT_FAILURE MAKE_SQLSTATE('P','0','0','0','4')
+
+/* Class XX - Internal Error */
+#define ERRCODE_INTERNAL_ERROR MAKE_SQLSTATE('X','X','0','0','0')
+#define ERRCODE_DATA_CORRUPTED MAKE_SQLSTATE('X','X','0','0','1')
+#define ERRCODE_INDEX_CORRUPTED MAKE_SQLSTATE('X','X','0','0','2')
diff --git a/src/backend/utils/errcodes.txt b/src/backend/utils/errcodes.txt
new file mode 100644
index 0000000..62418a0
--- /dev/null
+++ b/src/backend/utils/errcodes.txt
@@ -0,0 +1,497 @@
+#
+# errcodes.txt
+# PostgreSQL error codes
+#
+# Copyright (c) 2003-2022, PostgreSQL Global Development Group
+#
+# This list serves as the basis for generating source files containing error
+# codes. It is kept in a common format to make sure all these source files have
+# the same contents.
+# The files generated from this one are:
+#
+# src/include/utils/errcodes.h
+# macros defining errcode constants to be used in the rest of the source
+#
+# src/pl/plpgsql/src/plerrcodes.h
+# a list of PL/pgSQL condition names and their SQLSTATE codes
+#
+# src/pl/tcl/pltclerrcodes.h
+# the same, for PL/Tcl
+#
+# doc/src/sgml/errcodes-table.sgml
+# a SGML table of error codes for inclusion in the documentation
+#
+# The format of this file is one error code per line, with the following
+# whitespace-separated fields:
+#
+# sqlstate E/W/S errcode_macro_name spec_name
+#
+# where sqlstate is a five-character string following the SQLSTATE conventions,
+# the second field indicates if the code means an error, a warning or success,
+# errcode_macro_name is the C macro name starting with ERRCODE that will be put
+# in errcodes.h, and spec_name is a lowercase, underscore-separated name that
+# will be used as the PL/pgSQL condition name and will also be included in the
+# SGML list. The last field is optional, if not present the PL/pgSQL condition
+# and the SGML entry will not be generated.
+#
+# Empty lines and lines starting with a hash are comments.
+#
+# There are also special lines in the format of:
+#
+# Section: section description
+#
+# that is, lines starting with the string "Section:". They are used to delimit
+# error classes as defined in the SQL spec, and are necessary for SGML output.
+#
+#
+# SQLSTATE codes for errors.
+#
+# The SQL99 code set is rather impoverished, especially in the area of
+# syntactical and semantic errors. We have borrowed codes from IBM's DB2
+# and invented our own codes to develop a useful code set.
+#
+# When adding a new code, make sure it is placed in the most appropriate
+# class (the first two characters of the code value identify the class).
+# The listing is organized by class to make this prominent.
+#
+# Each class should have a generic '000' subclass. However,
+# the generic '000' subclass code should be used for an error only
+# when there is not a more-specific subclass code defined.
+#
+# The SQL spec requires that all the elements of a SQLSTATE code be
+# either digits or upper-case ASCII characters.
+#
+# Classes that begin with 0-4 or A-H are defined by the
+# standard. Within such a class, subclass values defined by the
+# standard must begin with 0-4 or A-H. To define a new error code,
+# ensure that it is either in an "implementation-defined class" (it
+# begins with 5-9 or I-Z), or its subclass falls outside the range of
+# error codes that could be present in future versions of the
+# standard (i.e. the subclass value begins with 5-9 or I-Z).
+#
+# The convention is that new error codes defined by PostgreSQL in a
+# class defined by the standard have a subclass value that begins
+# with 'P'. In addition, error codes defined by PostgreSQL clients
+# (such as ecpg) have a class value that begins with 'Y'.
+
+Section: Class 00 - Successful Completion
+
+00000 S ERRCODE_SUCCESSFUL_COMPLETION successful_completion
+
+Section: Class 01 - Warning
+
+# do not use this class for failure conditions
+01000 W ERRCODE_WARNING warning
+0100C W ERRCODE_WARNING_DYNAMIC_RESULT_SETS_RETURNED dynamic_result_sets_returned
+01008 W ERRCODE_WARNING_IMPLICIT_ZERO_BIT_PADDING implicit_zero_bit_padding
+01003 W ERRCODE_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION null_value_eliminated_in_set_function
+01007 W ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED privilege_not_granted
+01006 W ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED privilege_not_revoked
+01004 W ERRCODE_WARNING_STRING_DATA_RIGHT_TRUNCATION string_data_right_truncation
+01P01 W ERRCODE_WARNING_DEPRECATED_FEATURE deprecated_feature
+
+Section: Class 02 - No Data (this is also a warning class per the SQL standard)
+
+# do not use this class for failure conditions
+02000 W ERRCODE_NO_DATA no_data
+02001 W ERRCODE_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED no_additional_dynamic_result_sets_returned
+
+Section: Class 03 - SQL Statement Not Yet Complete
+
+03000 E ERRCODE_SQL_STATEMENT_NOT_YET_COMPLETE sql_statement_not_yet_complete
+
+Section: Class 08 - Connection Exception
+
+08000 E ERRCODE_CONNECTION_EXCEPTION connection_exception
+08003 E ERRCODE_CONNECTION_DOES_NOT_EXIST connection_does_not_exist
+08006 E ERRCODE_CONNECTION_FAILURE connection_failure
+08001 E ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION sqlclient_unable_to_establish_sqlconnection
+08004 E ERRCODE_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION sqlserver_rejected_establishment_of_sqlconnection
+08007 E ERRCODE_TRANSACTION_RESOLUTION_UNKNOWN transaction_resolution_unknown
+08P01 E ERRCODE_PROTOCOL_VIOLATION protocol_violation
+
+Section: Class 09 - Triggered Action Exception
+
+09000 E ERRCODE_TRIGGERED_ACTION_EXCEPTION triggered_action_exception
+
+Section: Class 0A - Feature Not Supported
+
+0A000 E ERRCODE_FEATURE_NOT_SUPPORTED feature_not_supported
+
+Section: Class 0B - Invalid Transaction Initiation
+
+0B000 E ERRCODE_INVALID_TRANSACTION_INITIATION invalid_transaction_initiation
+
+Section: Class 0F - Locator Exception
+
+0F000 E ERRCODE_LOCATOR_EXCEPTION locator_exception
+0F001 E ERRCODE_L_E_INVALID_SPECIFICATION invalid_locator_specification
+
+Section: Class 0L - Invalid Grantor
+
+0L000 E ERRCODE_INVALID_GRANTOR invalid_grantor
+0LP01 E ERRCODE_INVALID_GRANT_OPERATION invalid_grant_operation
+
+Section: Class 0P - Invalid Role Specification
+
+0P000 E ERRCODE_INVALID_ROLE_SPECIFICATION invalid_role_specification
+
+Section: Class 0Z - Diagnostics Exception
+
+0Z000 E ERRCODE_DIAGNOSTICS_EXCEPTION diagnostics_exception
+0Z002 E ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER stacked_diagnostics_accessed_without_active_handler
+
+Section: Class 20 - Case Not Found
+
+20000 E ERRCODE_CASE_NOT_FOUND case_not_found
+
+Section: Class 21 - Cardinality Violation
+
+# this means something returned the wrong number of rows
+21000 E ERRCODE_CARDINALITY_VIOLATION cardinality_violation
+
+Section: Class 22 - Data Exception
+
+22000 E ERRCODE_DATA_EXCEPTION data_exception
+2202E E ERRCODE_ARRAY_ELEMENT_ERROR
+# SQL99's actual definition of "array element error" is subscript error
+2202E E ERRCODE_ARRAY_SUBSCRIPT_ERROR array_subscript_error
+22021 E ERRCODE_CHARACTER_NOT_IN_REPERTOIRE character_not_in_repertoire
+22008 E ERRCODE_DATETIME_FIELD_OVERFLOW datetime_field_overflow
+22008 E ERRCODE_DATETIME_VALUE_OUT_OF_RANGE
+22012 E ERRCODE_DIVISION_BY_ZERO division_by_zero
+22005 E ERRCODE_ERROR_IN_ASSIGNMENT error_in_assignment
+2200B E ERRCODE_ESCAPE_CHARACTER_CONFLICT escape_character_conflict
+22022 E ERRCODE_INDICATOR_OVERFLOW indicator_overflow
+22015 E ERRCODE_INTERVAL_FIELD_OVERFLOW interval_field_overflow
+2201E E ERRCODE_INVALID_ARGUMENT_FOR_LOG invalid_argument_for_logarithm
+22014 E ERRCODE_INVALID_ARGUMENT_FOR_NTILE invalid_argument_for_ntile_function
+22016 E ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE invalid_argument_for_nth_value_function
+2201F E ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION invalid_argument_for_power_function
+2201G E ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION invalid_argument_for_width_bucket_function
+22018 E ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST invalid_character_value_for_cast
+22007 E ERRCODE_INVALID_DATETIME_FORMAT invalid_datetime_format
+22019 E ERRCODE_INVALID_ESCAPE_CHARACTER invalid_escape_character
+2200D E ERRCODE_INVALID_ESCAPE_OCTET invalid_escape_octet
+22025 E ERRCODE_INVALID_ESCAPE_SEQUENCE invalid_escape_sequence
+22P06 E ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER nonstandard_use_of_escape_character
+22010 E ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE invalid_indicator_parameter_value
+22023 E ERRCODE_INVALID_PARAMETER_VALUE invalid_parameter_value
+22013 E ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE invalid_preceding_or_following_size
+2201B E ERRCODE_INVALID_REGULAR_EXPRESSION invalid_regular_expression
+2201W E ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE invalid_row_count_in_limit_clause
+2201X E ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE invalid_row_count_in_result_offset_clause
+2202H E ERRCODE_INVALID_TABLESAMPLE_ARGUMENT invalid_tablesample_argument
+2202G E ERRCODE_INVALID_TABLESAMPLE_REPEAT invalid_tablesample_repeat
+22009 E ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE invalid_time_zone_displacement_value
+2200C E ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER invalid_use_of_escape_character
+2200G E ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH most_specific_type_mismatch
+22004 E ERRCODE_NULL_VALUE_NOT_ALLOWED null_value_not_allowed
+22002 E ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER null_value_no_indicator_parameter
+22003 E ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE numeric_value_out_of_range
+2200H E ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED sequence_generator_limit_exceeded
+22026 E ERRCODE_STRING_DATA_LENGTH_MISMATCH string_data_length_mismatch
+22001 E ERRCODE_STRING_DATA_RIGHT_TRUNCATION string_data_right_truncation
+22011 E ERRCODE_SUBSTRING_ERROR substring_error
+22027 E ERRCODE_TRIM_ERROR trim_error
+22024 E ERRCODE_UNTERMINATED_C_STRING unterminated_c_string
+2200F E ERRCODE_ZERO_LENGTH_CHARACTER_STRING zero_length_character_string
+22P01 E ERRCODE_FLOATING_POINT_EXCEPTION floating_point_exception
+22P02 E ERRCODE_INVALID_TEXT_REPRESENTATION invalid_text_representation
+22P03 E ERRCODE_INVALID_BINARY_REPRESENTATION invalid_binary_representation
+22P04 E ERRCODE_BAD_COPY_FILE_FORMAT bad_copy_file_format
+22P05 E ERRCODE_UNTRANSLATABLE_CHARACTER untranslatable_character
+2200L E ERRCODE_NOT_AN_XML_DOCUMENT not_an_xml_document
+2200M E ERRCODE_INVALID_XML_DOCUMENT invalid_xml_document
+2200N E ERRCODE_INVALID_XML_CONTENT invalid_xml_content
+2200S E ERRCODE_INVALID_XML_COMMENT invalid_xml_comment
+2200T E ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION invalid_xml_processing_instruction
+22030 E ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE duplicate_json_object_key_value
+22031 E ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION invalid_argument_for_sql_json_datetime_function
+22032 E ERRCODE_INVALID_JSON_TEXT invalid_json_text
+22033 E ERRCODE_INVALID_SQL_JSON_SUBSCRIPT invalid_sql_json_subscript
+22034 E ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM more_than_one_sql_json_item
+22035 E ERRCODE_NO_SQL_JSON_ITEM no_sql_json_item
+22036 E ERRCODE_NON_NUMERIC_SQL_JSON_ITEM non_numeric_sql_json_item
+22037 E ERRCODE_NON_UNIQUE_KEYS_IN_A_JSON_OBJECT non_unique_keys_in_a_json_object
+22038 E ERRCODE_SINGLETON_SQL_JSON_ITEM_REQUIRED singleton_sql_json_item_required
+22039 E ERRCODE_SQL_JSON_ARRAY_NOT_FOUND sql_json_array_not_found
+2203A E ERRCODE_SQL_JSON_MEMBER_NOT_FOUND sql_json_member_not_found
+2203B E ERRCODE_SQL_JSON_NUMBER_NOT_FOUND sql_json_number_not_found
+2203C E ERRCODE_SQL_JSON_OBJECT_NOT_FOUND sql_json_object_not_found
+2203D E ERRCODE_TOO_MANY_JSON_ARRAY_ELEMENTS too_many_json_array_elements
+2203E E ERRCODE_TOO_MANY_JSON_OBJECT_MEMBERS too_many_json_object_members
+2203F E ERRCODE_SQL_JSON_SCALAR_REQUIRED sql_json_scalar_required
+2203G E ERRCODE_SQL_JSON_ITEM_CANNOT_BE_CAST_TO_TARGET_TYPE sql_json_item_cannot_be_cast_to_target_type
+
+Section: Class 23 - Integrity Constraint Violation
+
+23000 E ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION integrity_constraint_violation
+23001 E ERRCODE_RESTRICT_VIOLATION restrict_violation
+23502 E ERRCODE_NOT_NULL_VIOLATION not_null_violation
+23503 E ERRCODE_FOREIGN_KEY_VIOLATION foreign_key_violation
+23505 E ERRCODE_UNIQUE_VIOLATION unique_violation
+23514 E ERRCODE_CHECK_VIOLATION check_violation
+23P01 E ERRCODE_EXCLUSION_VIOLATION exclusion_violation
+
+Section: Class 24 - Invalid Cursor State
+
+24000 E ERRCODE_INVALID_CURSOR_STATE invalid_cursor_state
+
+Section: Class 25 - Invalid Transaction State
+
+25000 E ERRCODE_INVALID_TRANSACTION_STATE invalid_transaction_state
+25001 E ERRCODE_ACTIVE_SQL_TRANSACTION active_sql_transaction
+25002 E ERRCODE_BRANCH_TRANSACTION_ALREADY_ACTIVE branch_transaction_already_active
+25008 E ERRCODE_HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL held_cursor_requires_same_isolation_level
+25003 E ERRCODE_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION inappropriate_access_mode_for_branch_transaction
+25004 E ERRCODE_INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION inappropriate_isolation_level_for_branch_transaction
+25005 E ERRCODE_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION no_active_sql_transaction_for_branch_transaction
+25006 E ERRCODE_READ_ONLY_SQL_TRANSACTION read_only_sql_transaction
+25007 E ERRCODE_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED schema_and_data_statement_mixing_not_supported
+25P01 E ERRCODE_NO_ACTIVE_SQL_TRANSACTION no_active_sql_transaction
+25P02 E ERRCODE_IN_FAILED_SQL_TRANSACTION in_failed_sql_transaction
+25P03 E ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT idle_in_transaction_session_timeout
+
+Section: Class 26 - Invalid SQL Statement Name
+
+# (we take this to mean prepared statements
+26000 E ERRCODE_INVALID_SQL_STATEMENT_NAME invalid_sql_statement_name
+
+Section: Class 27 - Triggered Data Change Violation
+
+27000 E ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION triggered_data_change_violation
+
+Section: Class 28 - Invalid Authorization Specification
+
+28000 E ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION invalid_authorization_specification
+28P01 E ERRCODE_INVALID_PASSWORD invalid_password
+
+Section: Class 2B - Dependent Privilege Descriptors Still Exist
+
+2B000 E ERRCODE_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST dependent_privilege_descriptors_still_exist
+2BP01 E ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST dependent_objects_still_exist
+
+Section: Class 2D - Invalid Transaction Termination
+
+2D000 E ERRCODE_INVALID_TRANSACTION_TERMINATION invalid_transaction_termination
+
+Section: Class 2F - SQL Routine Exception
+
+2F000 E ERRCODE_SQL_ROUTINE_EXCEPTION sql_routine_exception
+2F005 E ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT function_executed_no_return_statement
+2F002 E ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED modifying_sql_data_not_permitted
+2F003 E ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED prohibited_sql_statement_attempted
+2F004 E ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED reading_sql_data_not_permitted
+
+Section: Class 34 - Invalid Cursor Name
+
+34000 E ERRCODE_INVALID_CURSOR_NAME invalid_cursor_name
+
+Section: Class 38 - External Routine Exception
+
+38000 E ERRCODE_EXTERNAL_ROUTINE_EXCEPTION external_routine_exception
+38001 E ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED containing_sql_not_permitted
+38002 E ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED modifying_sql_data_not_permitted
+38003 E ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED prohibited_sql_statement_attempted
+38004 E ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED reading_sql_data_not_permitted
+
+Section: Class 39 - External Routine Invocation Exception
+
+39000 E ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION external_routine_invocation_exception
+39001 E ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED invalid_sqlstate_returned
+39004 E ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED null_value_not_allowed
+39P01 E ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED trigger_protocol_violated
+39P02 E ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED srf_protocol_violated
+39P03 E ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED event_trigger_protocol_violated
+
+Section: Class 3B - Savepoint Exception
+
+3B000 E ERRCODE_SAVEPOINT_EXCEPTION savepoint_exception
+3B001 E ERRCODE_S_E_INVALID_SPECIFICATION invalid_savepoint_specification
+
+Section: Class 3D - Invalid Catalog Name
+
+3D000 E ERRCODE_INVALID_CATALOG_NAME invalid_catalog_name
+
+Section: Class 3F - Invalid Schema Name
+
+3F000 E ERRCODE_INVALID_SCHEMA_NAME invalid_schema_name
+
+Section: Class 40 - Transaction Rollback
+
+40000 E ERRCODE_TRANSACTION_ROLLBACK transaction_rollback
+40002 E ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION transaction_integrity_constraint_violation
+40001 E ERRCODE_T_R_SERIALIZATION_FAILURE serialization_failure
+40003 E ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN statement_completion_unknown
+40P01 E ERRCODE_T_R_DEADLOCK_DETECTED deadlock_detected
+
+Section: Class 42 - Syntax Error or Access Rule Violation
+
+42000 E ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION syntax_error_or_access_rule_violation
+# never use the above; use one of these two if no specific code exists:
+42601 E ERRCODE_SYNTAX_ERROR syntax_error
+42501 E ERRCODE_INSUFFICIENT_PRIVILEGE insufficient_privilege
+42846 E ERRCODE_CANNOT_COERCE cannot_coerce
+42803 E ERRCODE_GROUPING_ERROR grouping_error
+42P20 E ERRCODE_WINDOWING_ERROR windowing_error
+42P19 E ERRCODE_INVALID_RECURSION invalid_recursion
+42830 E ERRCODE_INVALID_FOREIGN_KEY invalid_foreign_key
+42602 E ERRCODE_INVALID_NAME invalid_name
+42622 E ERRCODE_NAME_TOO_LONG name_too_long
+42939 E ERRCODE_RESERVED_NAME reserved_name
+42804 E ERRCODE_DATATYPE_MISMATCH datatype_mismatch
+42P18 E ERRCODE_INDETERMINATE_DATATYPE indeterminate_datatype
+42P21 E ERRCODE_COLLATION_MISMATCH collation_mismatch
+42P22 E ERRCODE_INDETERMINATE_COLLATION indeterminate_collation
+42809 E ERRCODE_WRONG_OBJECT_TYPE wrong_object_type
+428C9 E ERRCODE_GENERATED_ALWAYS generated_always
+
+# Note: for ERRCODE purposes, we divide namable objects into these categories:
+# databases, schemas, prepared statements, cursors, tables, columns,
+# functions (including operators), and all else (lumped as "objects").
+# (The first four categories are mandated by the existence of separate
+# SQLSTATE classes for them in the spec; in this file, however, we group
+# the ERRCODE names with all the rest under class 42.) Parameters are
+# sort-of-named objects and get their own ERRCODE.
+#
+# The same breakdown is used for "duplicate" and "ambiguous" complaints,
+# as well as complaints associated with incorrect declarations.
+
+42703 E ERRCODE_UNDEFINED_COLUMN undefined_column
+34000 E ERRCODE_UNDEFINED_CURSOR
+3D000 E ERRCODE_UNDEFINED_DATABASE
+42883 E ERRCODE_UNDEFINED_FUNCTION undefined_function
+26000 E ERRCODE_UNDEFINED_PSTATEMENT
+3F000 E ERRCODE_UNDEFINED_SCHEMA
+42P01 E ERRCODE_UNDEFINED_TABLE undefined_table
+42P02 E ERRCODE_UNDEFINED_PARAMETER undefined_parameter
+42704 E ERRCODE_UNDEFINED_OBJECT undefined_object
+42701 E ERRCODE_DUPLICATE_COLUMN duplicate_column
+42P03 E ERRCODE_DUPLICATE_CURSOR duplicate_cursor
+42P04 E ERRCODE_DUPLICATE_DATABASE duplicate_database
+42723 E ERRCODE_DUPLICATE_FUNCTION duplicate_function
+42P05 E ERRCODE_DUPLICATE_PSTATEMENT duplicate_prepared_statement
+42P06 E ERRCODE_DUPLICATE_SCHEMA duplicate_schema
+42P07 E ERRCODE_DUPLICATE_TABLE duplicate_table
+42712 E ERRCODE_DUPLICATE_ALIAS duplicate_alias
+42710 E ERRCODE_DUPLICATE_OBJECT duplicate_object
+42702 E ERRCODE_AMBIGUOUS_COLUMN ambiguous_column
+42725 E ERRCODE_AMBIGUOUS_FUNCTION ambiguous_function
+42P08 E ERRCODE_AMBIGUOUS_PARAMETER ambiguous_parameter
+42P09 E ERRCODE_AMBIGUOUS_ALIAS ambiguous_alias
+42P10 E ERRCODE_INVALID_COLUMN_REFERENCE invalid_column_reference
+42611 E ERRCODE_INVALID_COLUMN_DEFINITION invalid_column_definition
+42P11 E ERRCODE_INVALID_CURSOR_DEFINITION invalid_cursor_definition
+42P12 E ERRCODE_INVALID_DATABASE_DEFINITION invalid_database_definition
+42P13 E ERRCODE_INVALID_FUNCTION_DEFINITION invalid_function_definition
+42P14 E ERRCODE_INVALID_PSTATEMENT_DEFINITION invalid_prepared_statement_definition
+42P15 E ERRCODE_INVALID_SCHEMA_DEFINITION invalid_schema_definition
+42P16 E ERRCODE_INVALID_TABLE_DEFINITION invalid_table_definition
+42P17 E ERRCODE_INVALID_OBJECT_DEFINITION invalid_object_definition
+
+Section: Class 44 - WITH CHECK OPTION Violation
+
+44000 E ERRCODE_WITH_CHECK_OPTION_VIOLATION with_check_option_violation
+
+Section: Class 53 - Insufficient Resources
+
+# (PostgreSQL-specific error class)
+53000 E ERRCODE_INSUFFICIENT_RESOURCES insufficient_resources
+53100 E ERRCODE_DISK_FULL disk_full
+53200 E ERRCODE_OUT_OF_MEMORY out_of_memory
+53300 E ERRCODE_TOO_MANY_CONNECTIONS too_many_connections
+53400 E ERRCODE_CONFIGURATION_LIMIT_EXCEEDED configuration_limit_exceeded
+
+Section: Class 54 - Program Limit Exceeded
+
+# this is for wired-in limits, not resource exhaustion problems (class borrowed from DB2)
+54000 E ERRCODE_PROGRAM_LIMIT_EXCEEDED program_limit_exceeded
+54001 E ERRCODE_STATEMENT_TOO_COMPLEX statement_too_complex
+54011 E ERRCODE_TOO_MANY_COLUMNS too_many_columns
+54023 E ERRCODE_TOO_MANY_ARGUMENTS too_many_arguments
+
+Section: Class 55 - Object Not In Prerequisite State
+
+# (class borrowed from DB2)
+55000 E ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE object_not_in_prerequisite_state
+55006 E ERRCODE_OBJECT_IN_USE object_in_use
+55P02 E ERRCODE_CANT_CHANGE_RUNTIME_PARAM cant_change_runtime_param
+55P03 E ERRCODE_LOCK_NOT_AVAILABLE lock_not_available
+55P04 E ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE unsafe_new_enum_value_usage
+
+Section: Class 57 - Operator Intervention
+
+# (class borrowed from DB2)
+57000 E ERRCODE_OPERATOR_INTERVENTION operator_intervention
+57014 E ERRCODE_QUERY_CANCELED query_canceled
+57P01 E ERRCODE_ADMIN_SHUTDOWN admin_shutdown
+57P02 E ERRCODE_CRASH_SHUTDOWN crash_shutdown
+57P03 E ERRCODE_CANNOT_CONNECT_NOW cannot_connect_now
+57P04 E ERRCODE_DATABASE_DROPPED database_dropped
+57P05 E ERRCODE_IDLE_SESSION_TIMEOUT idle_session_timeout
+
+Section: Class 58 - System Error (errors external to PostgreSQL itself)
+
+# (class borrowed from DB2)
+58000 E ERRCODE_SYSTEM_ERROR system_error
+58030 E ERRCODE_IO_ERROR io_error
+58P01 E ERRCODE_UNDEFINED_FILE undefined_file
+58P02 E ERRCODE_DUPLICATE_FILE duplicate_file
+
+Section: Class 72 - Snapshot Failure
+# (class borrowed from Oracle)
+72000 E ERRCODE_SNAPSHOT_TOO_OLD snapshot_too_old
+
+Section: Class F0 - Configuration File Error
+
+# (PostgreSQL-specific error class)
+F0000 E ERRCODE_CONFIG_FILE_ERROR config_file_error
+F0001 E ERRCODE_LOCK_FILE_EXISTS lock_file_exists
+
+Section: Class HV - Foreign Data Wrapper Error (SQL/MED)
+
+# (SQL/MED-specific error class)
+HV000 E ERRCODE_FDW_ERROR fdw_error
+HV005 E ERRCODE_FDW_COLUMN_NAME_NOT_FOUND fdw_column_name_not_found
+HV002 E ERRCODE_FDW_DYNAMIC_PARAMETER_VALUE_NEEDED fdw_dynamic_parameter_value_needed
+HV010 E ERRCODE_FDW_FUNCTION_SEQUENCE_ERROR fdw_function_sequence_error
+HV021 E ERRCODE_FDW_INCONSISTENT_DESCRIPTOR_INFORMATION fdw_inconsistent_descriptor_information
+HV024 E ERRCODE_FDW_INVALID_ATTRIBUTE_VALUE fdw_invalid_attribute_value
+HV007 E ERRCODE_FDW_INVALID_COLUMN_NAME fdw_invalid_column_name
+HV008 E ERRCODE_FDW_INVALID_COLUMN_NUMBER fdw_invalid_column_number
+HV004 E ERRCODE_FDW_INVALID_DATA_TYPE fdw_invalid_data_type
+HV006 E ERRCODE_FDW_INVALID_DATA_TYPE_DESCRIPTORS fdw_invalid_data_type_descriptors
+HV091 E ERRCODE_FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER fdw_invalid_descriptor_field_identifier
+HV00B E ERRCODE_FDW_INVALID_HANDLE fdw_invalid_handle
+HV00C E ERRCODE_FDW_INVALID_OPTION_INDEX fdw_invalid_option_index
+HV00D E ERRCODE_FDW_INVALID_OPTION_NAME fdw_invalid_option_name
+HV090 E ERRCODE_FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH fdw_invalid_string_length_or_buffer_length
+HV00A E ERRCODE_FDW_INVALID_STRING_FORMAT fdw_invalid_string_format
+HV009 E ERRCODE_FDW_INVALID_USE_OF_NULL_POINTER fdw_invalid_use_of_null_pointer
+HV014 E ERRCODE_FDW_TOO_MANY_HANDLES fdw_too_many_handles
+HV001 E ERRCODE_FDW_OUT_OF_MEMORY fdw_out_of_memory
+HV00P E ERRCODE_FDW_NO_SCHEMAS fdw_no_schemas
+HV00J E ERRCODE_FDW_OPTION_NAME_NOT_FOUND fdw_option_name_not_found
+HV00K E ERRCODE_FDW_REPLY_HANDLE fdw_reply_handle
+HV00Q E ERRCODE_FDW_SCHEMA_NOT_FOUND fdw_schema_not_found
+HV00R E ERRCODE_FDW_TABLE_NOT_FOUND fdw_table_not_found
+HV00L E ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION fdw_unable_to_create_execution
+HV00M E ERRCODE_FDW_UNABLE_TO_CREATE_REPLY fdw_unable_to_create_reply
+HV00N E ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION fdw_unable_to_establish_connection
+
+Section: Class P0 - PL/pgSQL Error
+
+# (PostgreSQL-specific error class)
+P0000 E ERRCODE_PLPGSQL_ERROR plpgsql_error
+P0001 E ERRCODE_RAISE_EXCEPTION raise_exception
+P0002 E ERRCODE_NO_DATA_FOUND no_data_found
+P0003 E ERRCODE_TOO_MANY_ROWS too_many_rows
+P0004 E ERRCODE_ASSERT_FAILURE assert_failure
+
+Section: Class XX - Internal Error
+
+# this is for "can't-happen" conditions and software bugs (PostgreSQL-specific error class)
+XX000 E ERRCODE_INTERNAL_ERROR internal_error
+XX001 E ERRCODE_DATA_CORRUPTED data_corrupted
+XX002 E ERRCODE_INDEX_CORRUPTED index_corrupted
diff --git a/src/backend/utils/error/Makefile b/src/backend/utils/error/Makefile
new file mode 100644
index 0000000..65ba61f
--- /dev/null
+++ b/src/backend/utils/error/Makefile
@@ -0,0 +1,21 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/error
+#
+# IDENTIFICATION
+# src/backend/utils/error/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/error
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ assert.o \
+ csvlog.o \
+ elog.o \
+ jsonlog.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/error/assert.c b/src/backend/utils/error/assert.c
new file mode 100644
index 0000000..2da512a
--- /dev/null
+++ b/src/backend/utils/error/assert.c
@@ -0,0 +1,70 @@
+/*-------------------------------------------------------------------------
+ *
+ * assert.c
+ * Assert support code.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/error/assert.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <unistd.h>
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+/*
+ * ExceptionalCondition - Handles the failure of an Assert()
+ *
+ * We intentionally do not go through elog() here, on the grounds of
+ * wanting to minimize the amount of infrastructure that has to be
+ * working to report an assertion failure.
+ */
+void
+ExceptionalCondition(const char *conditionName,
+ const char *errorType,
+ const char *fileName,
+ int lineNumber)
+{
+ /* Report the failure on stderr (or local equivalent) */
+ if (!PointerIsValid(conditionName)
+ || !PointerIsValid(fileName)
+ || !PointerIsValid(errorType))
+ write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
+ (int) getpid());
+ else
+ write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n",
+ errorType, conditionName,
+ fileName, lineNumber, (int) getpid());
+
+ /* Usually this shouldn't be needed, but make sure the msg went out */
+ fflush(stderr);
+
+ /* If we have support for it, dump a simple backtrace */
+#ifdef HAVE_BACKTRACE_SYMBOLS
+ {
+ void *buf[100];
+ int nframes;
+
+ nframes = backtrace(buf, lengthof(buf));
+ backtrace_symbols_fd(buf, nframes, fileno(stderr));
+ }
+#endif
+
+ /*
+ * If configured to do so, sleep indefinitely to allow user to attach a
+ * debugger. It would be nice to use pg_usleep() here, but that can sleep
+ * at most 2G usec or ~33 minutes, which seems too short.
+ */
+#ifdef SLEEP_ON_ASSERT
+ sleep(1000000);
+#endif
+
+ abort();
+}
diff --git a/src/backend/utils/error/csvlog.c b/src/backend/utils/error/csvlog.c
new file mode 100644
index 0000000..5c49bc4
--- /dev/null
+++ b/src/backend/utils/error/csvlog.c
@@ -0,0 +1,264 @@
+/*-------------------------------------------------------------------------
+ *
+ * csvlog.c
+ * CSV logging
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/error/csvlog.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "libpq/libpq.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "postmaster/bgworker.h"
+#include "postmaster/syslogger.h"
+#include "storage/lock.h"
+#include "storage/proc.h"
+#include "tcop/tcopprot.h"
+#include "utils/backend_status.h"
+#include "utils/elog.h"
+#include "utils/guc.h"
+#include "utils/ps_status.h"
+
+
+/*
+ * append a CSV'd version of a string to a StringInfo
+ * We use the PostgreSQL defaults for CSV, i.e. quote = escape = '"'
+ * If it's NULL, append nothing.
+ */
+static inline void
+appendCSVLiteral(StringInfo buf, const char *data)
+{
+ const char *p = data;
+ char c;
+
+ /* avoid confusing an empty string with NULL */
+ if (p == NULL)
+ return;
+
+ appendStringInfoCharMacro(buf, '"');
+ while ((c = *p++) != '\0')
+ {
+ if (c == '"')
+ appendStringInfoCharMacro(buf, '"');
+ appendStringInfoCharMacro(buf, c);
+ }
+ appendStringInfoCharMacro(buf, '"');
+}
+
+/*
+ * write_csvlog -- Generate and write CSV log entry
+ *
+ * Constructs the error message, depending on the Errordata it gets, in a CSV
+ * format which is described in doc/src/sgml/config.sgml.
+ */
+void
+write_csvlog(ErrorData *edata)
+{
+ StringInfoData buf;
+ bool print_stmt = false;
+
+ /* static counter for line numbers */
+ static long log_line_number = 0;
+
+ /* has counter been reset in current process? */
+ static int log_my_pid = 0;
+
+ /*
+ * This is one of the few places where we'd rather not inherit a static
+ * variable's value from the postmaster. But since we will, reset it when
+ * MyProcPid changes.
+ */
+ if (log_my_pid != MyProcPid)
+ {
+ log_line_number = 0;
+ log_my_pid = MyProcPid;
+ reset_formatted_start_time();
+ }
+ log_line_number++;
+
+ initStringInfo(&buf);
+
+ /* timestamp with milliseconds */
+ appendStringInfoString(&buf, get_formatted_log_time());
+ appendStringInfoChar(&buf, ',');
+
+ /* username */
+ if (MyProcPort)
+ appendCSVLiteral(&buf, MyProcPort->user_name);
+ appendStringInfoChar(&buf, ',');
+
+ /* database name */
+ if (MyProcPort)
+ appendCSVLiteral(&buf, MyProcPort->database_name);
+ appendStringInfoChar(&buf, ',');
+
+ /* Process id */
+ if (MyProcPid != 0)
+ appendStringInfo(&buf, "%d", MyProcPid);
+ appendStringInfoChar(&buf, ',');
+
+ /* Remote host and port */
+ if (MyProcPort && MyProcPort->remote_host)
+ {
+ appendStringInfoChar(&buf, '"');
+ appendStringInfoString(&buf, MyProcPort->remote_host);
+ if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0')
+ {
+ appendStringInfoChar(&buf, ':');
+ appendStringInfoString(&buf, MyProcPort->remote_port);
+ }
+ appendStringInfoChar(&buf, '"');
+ }
+ appendStringInfoChar(&buf, ',');
+
+ /* session id */
+ appendStringInfo(&buf, "%lx.%x", (long) MyStartTime, MyProcPid);
+ appendStringInfoChar(&buf, ',');
+
+ /* Line number */
+ appendStringInfo(&buf, "%ld", log_line_number);
+ appendStringInfoChar(&buf, ',');
+
+ /* PS display */
+ if (MyProcPort)
+ {
+ StringInfoData msgbuf;
+ const char *psdisp;
+ int displen;
+
+ initStringInfo(&msgbuf);
+
+ psdisp = get_ps_display(&displen);
+ appendBinaryStringInfo(&msgbuf, psdisp, displen);
+ appendCSVLiteral(&buf, msgbuf.data);
+
+ pfree(msgbuf.data);
+ }
+ appendStringInfoChar(&buf, ',');
+
+ /* session start timestamp */
+ appendStringInfoString(&buf, get_formatted_start_time());
+ appendStringInfoChar(&buf, ',');
+
+ /* Virtual transaction id */
+ /* keep VXID format in sync with lockfuncs.c */
+ if (MyProc != NULL && MyProc->backendId != InvalidBackendId)
+ appendStringInfo(&buf, "%d/%u", MyProc->backendId, MyProc->lxid);
+ appendStringInfoChar(&buf, ',');
+
+ /* Transaction id */
+ appendStringInfo(&buf, "%u", GetTopTransactionIdIfAny());
+ appendStringInfoChar(&buf, ',');
+
+ /* Error severity */
+ appendStringInfoString(&buf, _(error_severity(edata->elevel)));
+ appendStringInfoChar(&buf, ',');
+
+ /* SQL state code */
+ appendStringInfoString(&buf, unpack_sql_state(edata->sqlerrcode));
+ appendStringInfoChar(&buf, ',');
+
+ /* errmessage */
+ appendCSVLiteral(&buf, edata->message);
+ appendStringInfoChar(&buf, ',');
+
+ /* errdetail or errdetail_log */
+ if (edata->detail_log)
+ appendCSVLiteral(&buf, edata->detail_log);
+ else
+ appendCSVLiteral(&buf, edata->detail);
+ appendStringInfoChar(&buf, ',');
+
+ /* errhint */
+ appendCSVLiteral(&buf, edata->hint);
+ appendStringInfoChar(&buf, ',');
+
+ /* internal query */
+ appendCSVLiteral(&buf, edata->internalquery);
+ appendStringInfoChar(&buf, ',');
+
+ /* if printed internal query, print internal pos too */
+ if (edata->internalpos > 0 && edata->internalquery != NULL)
+ appendStringInfo(&buf, "%d", edata->internalpos);
+ appendStringInfoChar(&buf, ',');
+
+ /* errcontext */
+ if (!edata->hide_ctx)
+ appendCSVLiteral(&buf, edata->context);
+ appendStringInfoChar(&buf, ',');
+
+ /* user query --- only reported if not disabled by the caller */
+ print_stmt = check_log_of_query(edata);
+ if (print_stmt)
+ appendCSVLiteral(&buf, debug_query_string);
+ appendStringInfoChar(&buf, ',');
+ if (print_stmt && edata->cursorpos > 0)
+ appendStringInfo(&buf, "%d", edata->cursorpos);
+ appendStringInfoChar(&buf, ',');
+
+ /* file error location */
+ if (Log_error_verbosity >= PGERROR_VERBOSE)
+ {
+ StringInfoData msgbuf;
+
+ initStringInfo(&msgbuf);
+
+ if (edata->funcname && edata->filename)
+ appendStringInfo(&msgbuf, "%s, %s:%d",
+ edata->funcname, edata->filename,
+ edata->lineno);
+ else if (edata->filename)
+ appendStringInfo(&msgbuf, "%s:%d",
+ edata->filename, edata->lineno);
+ appendCSVLiteral(&buf, msgbuf.data);
+ pfree(msgbuf.data);
+ }
+ appendStringInfoChar(&buf, ',');
+
+ /* application name */
+ if (application_name)
+ appendCSVLiteral(&buf, application_name);
+
+ appendStringInfoChar(&buf, ',');
+
+ /* backend type */
+ appendCSVLiteral(&buf, get_backend_type_for_log());
+ appendStringInfoChar(&buf, ',');
+
+ /* leader PID */
+ if (MyProc)
+ {
+ PGPROC *leader = MyProc->lockGroupLeader;
+
+ /*
+ * Show the leader only for active parallel workers. This leaves out
+ * the leader of a parallel group.
+ */
+ if (leader && leader->pid != MyProcPid)
+ appendStringInfo(&buf, "%d", leader->pid);
+ }
+ appendStringInfoChar(&buf, ',');
+
+ /* query id */
+ appendStringInfo(&buf, "%lld", (long long) pgstat_get_my_query_id());
+
+ appendStringInfoChar(&buf, '\n');
+
+ /* If in the syslogger process, try to write messages direct to file */
+ if (MyBackendType == B_LOGGER)
+ write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_CSVLOG);
+ else
+ write_pipe_chunks(buf.data, buf.len, LOG_DESTINATION_CSVLOG);
+
+ pfree(buf.data);
+}
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
new file mode 100644
index 0000000..6fa4f2c
--- /dev/null
+++ b/src/backend/utils/error/elog.c
@@ -0,0 +1,3458 @@
+/*-------------------------------------------------------------------------
+ *
+ * elog.c
+ * error logging and reporting
+ *
+ * Because of the extremely high rate at which log messages can be generated,
+ * we need to be mindful of the performance cost of obtaining any information
+ * that may be logged. Also, it's important to keep in mind that this code may
+ * get called from within an aborted transaction, in which case operations
+ * such as syscache lookups are unsafe.
+ *
+ * Some notes about recursion and errors during error processing:
+ *
+ * We need to be robust about recursive-error scenarios --- for example,
+ * if we run out of memory, it's important to be able to report that fact.
+ * There are a number of considerations that go into this.
+ *
+ * First, distinguish between re-entrant use and actual recursion. It
+ * is possible for an error or warning message to be emitted while the
+ * parameters for an error message are being computed. In this case
+ * errstart has been called for the outer message, and some field values
+ * may have already been saved, but we are not actually recursing. We handle
+ * this by providing a (small) stack of ErrorData records. The inner message
+ * can be computed and sent without disturbing the state of the outer message.
+ * (If the inner message is actually an error, this isn't very interesting
+ * because control won't come back to the outer message generator ... but
+ * if the inner message is only debug or log data, this is critical.)
+ *
+ * Second, actual recursion will occur if an error is reported by one of
+ * the elog.c routines or something they call. By far the most probable
+ * scenario of this sort is "out of memory"; and it's also the nastiest
+ * to handle because we'd likely also run out of memory while trying to
+ * report this error! Our escape hatch for this case is to reset the
+ * ErrorContext to empty before trying to process the inner error. Since
+ * ErrorContext is guaranteed to have at least 8K of space in it (see mcxt.c),
+ * we should be able to process an "out of memory" message successfully.
+ * Since we lose the prior error state due to the reset, we won't be able
+ * to return to processing the original error, but we wouldn't have anyway.
+ * (NOTE: the escape hatch is not used for recursive situations where the
+ * inner message is of less than ERROR severity; in that case we just
+ * try to process it and return normally. Usually this will work, but if
+ * it ends up in infinite recursion, we will PANIC due to error stack
+ * overflow.)
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/error/elog.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include <signal.h>
+#include <ctype.h>
+#ifdef HAVE_SYSLOG
+#include <syslog.h>
+#endif
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+#include "access/transam.h"
+#include "access/xact.h"
+#include "libpq/libpq.h"
+#include "libpq/pqformat.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "postmaster/bgworker.h"
+#include "postmaster/postmaster.h"
+#include "postmaster/syslogger.h"
+#include "storage/ipc.h"
+#include "storage/proc.h"
+#include "tcop/tcopprot.h"
+#include "utils/guc.h"
+#include "utils/memutils.h"
+#include "utils/ps_status.h"
+
+
+/* In this module, access gettext() via err_gettext() */
+#undef _
+#define _(x) err_gettext(x)
+
+
+/* Global variables */
+ErrorContextCallback *error_context_stack = NULL;
+
+sigjmp_buf *PG_exception_stack = NULL;
+
+extern bool redirection_done;
+
+/*
+ * Hook for intercepting messages before they are sent to the server log.
+ * Note that the hook will not get called for messages that are suppressed
+ * by log_min_messages. Also note that logging hooks implemented in preload
+ * libraries will miss any log messages that are generated before the
+ * library is loaded.
+ */
+emit_log_hook_type emit_log_hook = NULL;
+
+/* GUC parameters */
+int Log_error_verbosity = PGERROR_VERBOSE;
+char *Log_line_prefix = NULL; /* format for extra log line info */
+int Log_destination = LOG_DESTINATION_STDERR;
+char *Log_destination_string = NULL;
+bool syslog_sequence_numbers = true;
+bool syslog_split_messages = true;
+
+#ifdef HAVE_SYSLOG
+
+/*
+ * Max string length to send to syslog(). Note that this doesn't count the
+ * sequence-number prefix we add, and of course it doesn't count the prefix
+ * added by syslog itself. Solaris and sysklogd truncate the final message
+ * at 1024 bytes, so this value leaves 124 bytes for those prefixes. (Most
+ * other syslog implementations seem to have limits of 2KB or so.)
+ */
+#ifndef PG_SYSLOG_LIMIT
+#define PG_SYSLOG_LIMIT 900
+#endif
+
+static bool openlog_done = false;
+static char *syslog_ident = NULL;
+static int syslog_facility = LOG_LOCAL0;
+
+static void write_syslog(int level, const char *line);
+#endif
+
+#ifdef WIN32
+extern char *event_source;
+
+static void write_eventlog(int level, const char *line, int len);
+#endif
+
+/* We provide a small stack of ErrorData records for re-entrant cases */
+#define ERRORDATA_STACK_SIZE 5
+
+static ErrorData errordata[ERRORDATA_STACK_SIZE];
+
+static int errordata_stack_depth = -1; /* index of topmost active frame */
+
+static int recursion_depth = 0; /* to detect actual recursion */
+
+/*
+ * Saved timeval and buffers for formatted timestamps that might be used by
+ * both log_line_prefix and csv logs.
+ */
+static struct timeval saved_timeval;
+static bool saved_timeval_set = false;
+
+#define FORMATTED_TS_LEN 128
+static char formatted_start_time[FORMATTED_TS_LEN];
+static char formatted_log_time[FORMATTED_TS_LEN];
+
+
+/* Macro for checking errordata_stack_depth is reasonable */
+#define CHECK_STACK_DEPTH() \
+ do { \
+ if (errordata_stack_depth < 0) \
+ { \
+ errordata_stack_depth = -1; \
+ ereport(ERROR, (errmsg_internal("errstart was not called"))); \
+ } \
+ } while (0)
+
+
+static const char *err_gettext(const char *str) pg_attribute_format_arg(1);
+static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
+static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
+static void write_console(const char *line, int len);
+static const char *process_log_prefix_padding(const char *p, int *padding);
+static void log_line_prefix(StringInfo buf, ErrorData *edata);
+static void send_message_to_server_log(ErrorData *edata);
+static void send_message_to_frontend(ErrorData *edata);
+static void append_with_tabs(StringInfo buf, const char *str);
+
+
+/*
+ * is_log_level_output -- is elevel logically >= log_min_level?
+ *
+ * We use this for tests that should consider LOG to sort out-of-order,
+ * between ERROR and FATAL. Generally this is the right thing for testing
+ * whether a message should go to the postmaster log, whereas a simple >=
+ * test is correct for testing whether the message should go to the client.
+ */
+static inline bool
+is_log_level_output(int elevel, int log_min_level)
+{
+ if (elevel == LOG || elevel == LOG_SERVER_ONLY)
+ {
+ if (log_min_level == LOG || log_min_level <= ERROR)
+ return true;
+ }
+ else if (elevel == WARNING_CLIENT_ONLY)
+ {
+ /* never sent to log, regardless of log_min_level */
+ return false;
+ }
+ else if (log_min_level == LOG)
+ {
+ /* elevel != LOG */
+ if (elevel >= FATAL)
+ return true;
+ }
+ /* Neither is LOG */
+ else if (elevel >= log_min_level)
+ return true;
+
+ return false;
+}
+
+/*
+ * Policy-setting subroutines. These are fairly simple, but it seems wise
+ * to have the code in just one place.
+ */
+
+/*
+ * should_output_to_server --- should message of given elevel go to the log?
+ */
+static inline bool
+should_output_to_server(int elevel)
+{
+ return is_log_level_output(elevel, log_min_messages);
+}
+
+/*
+ * should_output_to_client --- should message of given elevel go to the client?
+ */
+static inline bool
+should_output_to_client(int elevel)
+{
+ if (whereToSendOutput == DestRemote && elevel != LOG_SERVER_ONLY)
+ {
+ /*
+ * client_min_messages is honored only after we complete the
+ * authentication handshake. This is required both for security
+ * reasons and because many clients can't handle NOTICE messages
+ * during authentication.
+ */
+ if (ClientAuthInProgress)
+ return (elevel >= ERROR);
+ else
+ return (elevel >= client_min_messages || elevel == INFO);
+ }
+ return false;
+}
+
+
+/*
+ * message_level_is_interesting --- would ereport/elog do anything?
+ *
+ * Returns true if ereport/elog with this elevel will not be a no-op.
+ * This is useful to short-circuit any expensive preparatory work that
+ * might be needed for a logging message. There is no point in
+ * prepending this to a bare ereport/elog call, however.
+ */
+bool
+message_level_is_interesting(int elevel)
+{
+ /*
+ * Keep this in sync with the decision-making in errstart().
+ */
+ if (elevel >= ERROR ||
+ should_output_to_server(elevel) ||
+ should_output_to_client(elevel))
+ return true;
+ return false;
+}
+
+
+/*
+ * in_error_recursion_trouble --- are we at risk of infinite error recursion?
+ *
+ * This function exists to provide common control of various fallback steps
+ * that we take if we think we are facing infinite error recursion. See the
+ * callers for details.
+ */
+bool
+in_error_recursion_trouble(void)
+{
+ /* Pull the plug if recurse more than once */
+ return (recursion_depth > 2);
+}
+
+/*
+ * One of those fallback steps is to stop trying to localize the error
+ * message, since there's a significant probability that that's exactly
+ * what's causing the recursion.
+ */
+static inline const char *
+err_gettext(const char *str)
+{
+#ifdef ENABLE_NLS
+ if (in_error_recursion_trouble())
+ return str;
+ else
+ return gettext(str);
+#else
+ return str;
+#endif
+}
+
+/*
+ * errstart_cold
+ * A simple wrapper around errstart, but hinted to be "cold". Supporting
+ * compilers are more likely to move code for branches containing this
+ * function into an area away from the calling function's code. This can
+ * result in more commonly executed code being more compact and fitting
+ * on fewer cache lines.
+ */
+pg_attribute_cold bool
+errstart_cold(int elevel, const char *domain)
+{
+ return errstart(elevel, domain);
+}
+
+/*
+ * errstart --- begin an error-reporting cycle
+ *
+ * Create and initialize error stack entry. Subsequently, errmsg() and
+ * perhaps other routines will be called to further populate the stack entry.
+ * Finally, errfinish() will be called to actually process the error report.
+ *
+ * Returns true in normal case. Returns false to short-circuit the error
+ * report (if it's a warning or lower and not to be reported anywhere).
+ */
+bool
+errstart(int elevel, const char *domain)
+{
+ ErrorData *edata;
+ bool output_to_server;
+ bool output_to_client = false;
+ int i;
+
+ /*
+ * Check some cases in which we want to promote an error into a more
+ * severe error. None of this logic applies for non-error messages.
+ */
+ if (elevel >= ERROR)
+ {
+ /*
+ * If we are inside a critical section, all errors become PANIC
+ * errors. See miscadmin.h.
+ */
+ if (CritSectionCount > 0)
+ elevel = PANIC;
+
+ /*
+ * Check reasons for treating ERROR as FATAL:
+ *
+ * 1. we have no handler to pass the error to (implies we are in the
+ * postmaster or in backend startup).
+ *
+ * 2. ExitOnAnyError mode switch is set (initdb uses this).
+ *
+ * 3. the error occurred after proc_exit has begun to run. (It's
+ * proc_exit's responsibility to see that this doesn't turn into
+ * infinite recursion!)
+ */
+ if (elevel == ERROR)
+ {
+ if (PG_exception_stack == NULL ||
+ ExitOnAnyError ||
+ proc_exit_inprogress)
+ elevel = FATAL;
+ }
+
+ /*
+ * If the error level is ERROR or more, errfinish is not going to
+ * return to caller; therefore, if there is any stacked error already
+ * in progress it will be lost. This is more or less okay, except we
+ * do not want to have a FATAL or PANIC error downgraded because the
+ * reporting process was interrupted by a lower-grade error. So check
+ * the stack and make sure we panic if panic is warranted.
+ */
+ for (i = 0; i <= errordata_stack_depth; i++)
+ elevel = Max(elevel, errordata[i].elevel);
+ }
+
+ /*
+ * Now decide whether we need to process this report at all; if it's
+ * warning or less and not enabled for logging, just return false without
+ * starting up any error logging machinery.
+ */
+ output_to_server = should_output_to_server(elevel);
+ output_to_client = should_output_to_client(elevel);
+ if (elevel < ERROR && !output_to_server && !output_to_client)
+ return false;
+
+ /*
+ * We need to do some actual work. Make sure that memory context
+ * initialization has finished, else we can't do anything useful.
+ */
+ if (ErrorContext == NULL)
+ {
+ /* Oops, hard crash time; very little we can do safely here */
+ write_stderr("error occurred before error message processing is available\n");
+ exit(2);
+ }
+
+ /*
+ * Okay, crank up a stack entry to store the info in.
+ */
+
+ if (recursion_depth++ > 0 && elevel >= ERROR)
+ {
+ /*
+ * Oops, error during error processing. Clear ErrorContext as
+ * discussed at top of file. We will not return to the original
+ * error's reporter or handler, so we don't need it.
+ */
+ MemoryContextReset(ErrorContext);
+
+ /*
+ * Infinite error recursion might be due to something broken in a
+ * context traceback routine. Abandon them too. We also abandon
+ * attempting to print the error statement (which, if long, could
+ * itself be the source of the recursive failure).
+ */
+ if (in_error_recursion_trouble())
+ {
+ error_context_stack = NULL;
+ debug_query_string = NULL;
+ }
+ }
+ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)
+ {
+ /*
+ * Wups, stack not big enough. We treat this as a PANIC condition
+ * because it suggests an infinite loop of errors during error
+ * recovery.
+ */
+ errordata_stack_depth = -1; /* make room on stack */
+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
+ }
+
+ /* Initialize data for this error frame */
+ edata = &errordata[errordata_stack_depth];
+ MemSet(edata, 0, sizeof(ErrorData));
+ edata->elevel = elevel;
+ edata->output_to_server = output_to_server;
+ edata->output_to_client = output_to_client;
+ /* the default text domain is the backend's */
+ edata->domain = domain ? domain : PG_TEXTDOMAIN("postgres");
+ /* initialize context_domain the same way (see set_errcontext_domain()) */
+ edata->context_domain = edata->domain;
+ /* Select default errcode based on elevel */
+ if (elevel >= ERROR)
+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
+ else if (elevel >= WARNING)
+ edata->sqlerrcode = ERRCODE_WARNING;
+ else
+ edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
+ /* errno is saved here so that error parameter eval can't change it */
+ edata->saved_errno = errno;
+
+ /*
+ * Any allocations for this error state level should go into ErrorContext
+ */
+ edata->assoc_context = ErrorContext;
+
+ recursion_depth--;
+ return true;
+}
+
+/*
+ * Checks whether the given funcname matches backtrace_functions; see
+ * check_backtrace_functions.
+ */
+static bool
+matches_backtrace_functions(const char *funcname)
+{
+ char *p;
+
+ if (!backtrace_symbol_list || funcname == NULL || funcname[0] == '\0')
+ return false;
+
+ p = backtrace_symbol_list;
+ for (;;)
+ {
+ if (*p == '\0') /* end of backtrace_symbol_list */
+ break;
+
+ if (strcmp(funcname, p) == 0)
+ return true;
+ p += strlen(p) + 1;
+ }
+
+ return false;
+}
+
+/*
+ * errfinish --- end an error-reporting cycle
+ *
+ * Produce the appropriate error report(s) and pop the error stack.
+ *
+ * If elevel, as passed to errstart(), is ERROR or worse, control does not
+ * return to the caller. See elog.h for the error level definitions.
+ */
+void
+errfinish(const char *filename, int lineno, const char *funcname)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ int elevel;
+ MemoryContext oldcontext;
+ ErrorContextCallback *econtext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+
+ /* Save the last few bits of error state into the stack entry */
+ if (filename)
+ {
+ const char *slash;
+
+ /* keep only base name, useful especially for vpath builds */
+ slash = strrchr(filename, '/');
+ if (slash)
+ filename = slash + 1;
+ /* Some Windows compilers use backslashes in __FILE__ strings */
+ slash = strrchr(filename, '\\');
+ if (slash)
+ filename = slash + 1;
+ }
+
+ edata->filename = filename;
+ edata->lineno = lineno;
+ edata->funcname = funcname;
+
+ elevel = edata->elevel;
+
+ /*
+ * Do processing in ErrorContext, which we hope has enough reserved space
+ * to report an error.
+ */
+ oldcontext = MemoryContextSwitchTo(ErrorContext);
+
+ if (!edata->backtrace &&
+ edata->funcname &&
+ backtrace_functions &&
+ matches_backtrace_functions(edata->funcname))
+ set_backtrace(edata, 2);
+
+ /*
+ * Call any context callback functions. Errors occurring in callback
+ * functions will be treated as recursive errors --- this ensures we will
+ * avoid infinite recursion (see errstart).
+ */
+ for (econtext = error_context_stack;
+ econtext != NULL;
+ econtext = econtext->previous)
+ econtext->callback(econtext->arg);
+
+ /*
+ * If ERROR (not more nor less) we pass it off to the current handler.
+ * Printing it and popping the stack is the responsibility of the handler.
+ */
+ if (elevel == ERROR)
+ {
+ /*
+ * We do some minimal cleanup before longjmp'ing so that handlers can
+ * execute in a reasonably sane state.
+ *
+ * Reset InterruptHoldoffCount in case we ereport'd from inside an
+ * interrupt holdoff section. (We assume here that no handler will
+ * itself be inside a holdoff section. If necessary, such a handler
+ * could save and restore InterruptHoldoffCount for itself, but this
+ * should make life easier for most.)
+ */
+ InterruptHoldoffCount = 0;
+ QueryCancelHoldoffCount = 0;
+
+ CritSectionCount = 0; /* should be unnecessary, but... */
+
+ /*
+ * Note that we leave CurrentMemoryContext set to ErrorContext. The
+ * handler should reset it to something else soon.
+ */
+
+ recursion_depth--;
+ PG_RE_THROW();
+ }
+
+ /* Emit the message to the right places */
+ EmitErrorReport();
+
+ /* Now free up subsidiary data attached to stack entry, and release it */
+ if (edata->message)
+ pfree(edata->message);
+ if (edata->detail)
+ pfree(edata->detail);
+ if (edata->detail_log)
+ pfree(edata->detail_log);
+ if (edata->hint)
+ pfree(edata->hint);
+ if (edata->context)
+ pfree(edata->context);
+ if (edata->backtrace)
+ pfree(edata->backtrace);
+ if (edata->schema_name)
+ pfree(edata->schema_name);
+ if (edata->table_name)
+ pfree(edata->table_name);
+ if (edata->column_name)
+ pfree(edata->column_name);
+ if (edata->datatype_name)
+ pfree(edata->datatype_name);
+ if (edata->constraint_name)
+ pfree(edata->constraint_name);
+ if (edata->internalquery)
+ pfree(edata->internalquery);
+
+ errordata_stack_depth--;
+
+ /* Exit error-handling context */
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+
+ /*
+ * Perform error recovery action as specified by elevel.
+ */
+ if (elevel == FATAL)
+ {
+ /*
+ * For a FATAL error, we let proc_exit clean up and exit.
+ *
+ * If we just reported a startup failure, the client will disconnect
+ * on receiving it, so don't send any more to the client.
+ */
+ if (PG_exception_stack == NULL && whereToSendOutput == DestRemote)
+ whereToSendOutput = DestNone;
+
+ /*
+ * fflush here is just to improve the odds that we get to see the
+ * error message, in case things are so hosed that proc_exit crashes.
+ * Any other code you might be tempted to add here should probably be
+ * in an on_proc_exit or on_shmem_exit callback instead.
+ */
+ fflush(stdout);
+ fflush(stderr);
+
+ /*
+ * Let the cumulative stats system know. Only mark the session as
+ * terminated by fatal error if there is no other known cause.
+ */
+ if (pgStatSessionEndCause == DISCONNECT_NORMAL)
+ pgStatSessionEndCause = DISCONNECT_FATAL;
+
+ /*
+ * Do normal process-exit cleanup, then return exit code 1 to indicate
+ * FATAL termination. The postmaster may or may not consider this
+ * worthy of panic, depending on which subprocess returns it.
+ */
+ proc_exit(1);
+ }
+
+ if (elevel >= PANIC)
+ {
+ /*
+ * Serious crash time. Postmaster will observe SIGABRT process exit
+ * status and kill the other backends too.
+ *
+ * XXX: what if we are *in* the postmaster? abort() won't kill our
+ * children...
+ */
+ fflush(stdout);
+ fflush(stderr);
+ abort();
+ }
+
+ /*
+ * Check for cancel/die interrupt first --- this is so that the user can
+ * stop a query emitting tons of notice or warning messages, even if it's
+ * in a loop that otherwise fails to check for interrupts.
+ */
+ CHECK_FOR_INTERRUPTS();
+}
+
+
+/*
+ * errcode --- add SQLSTATE error code to the current error
+ *
+ * The code is expected to be represented as per MAKE_SQLSTATE().
+ */
+int
+errcode(int sqlerrcode)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ edata->sqlerrcode = sqlerrcode;
+
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errcode_for_file_access --- add SQLSTATE error code to the current error
+ *
+ * The SQLSTATE code is chosen based on the saved errno value. We assume
+ * that the failing operation was some type of disk file access.
+ *
+ * NOTE: the primary error message string should generally include %m
+ * when this is used.
+ */
+int
+errcode_for_file_access(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ switch (edata->saved_errno)
+ {
+ /* Permission-denied failures */
+ case EPERM: /* Not super-user */
+ case EACCES: /* Permission denied */
+#ifdef EROFS
+ case EROFS: /* Read only file system */
+#endif
+ edata->sqlerrcode = ERRCODE_INSUFFICIENT_PRIVILEGE;
+ break;
+
+ /* File not found */
+ case ENOENT: /* No such file or directory */
+ edata->sqlerrcode = ERRCODE_UNDEFINED_FILE;
+ break;
+
+ /* Duplicate file */
+ case EEXIST: /* File exists */
+ edata->sqlerrcode = ERRCODE_DUPLICATE_FILE;
+ break;
+
+ /* Wrong object type or state */
+ case ENOTDIR: /* Not a directory */
+ case EISDIR: /* Is a directory */
+#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
+ case ENOTEMPTY: /* Directory not empty */
+#endif
+ edata->sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE;
+ break;
+
+ /* Insufficient resources */
+ case ENOSPC: /* No space left on device */
+ edata->sqlerrcode = ERRCODE_DISK_FULL;
+ break;
+
+ case ENFILE: /* File table overflow */
+ case EMFILE: /* Too many open files */
+ edata->sqlerrcode = ERRCODE_INSUFFICIENT_RESOURCES;
+ break;
+
+ /* Hardware failure */
+ case EIO: /* I/O error */
+ edata->sqlerrcode = ERRCODE_IO_ERROR;
+ break;
+
+ /* All else is classified as internal errors */
+ default:
+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
+ break;
+ }
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errcode_for_socket_access --- add SQLSTATE error code to the current error
+ *
+ * The SQLSTATE code is chosen based on the saved errno value. We assume
+ * that the failing operation was some type of socket access.
+ *
+ * NOTE: the primary error message string should generally include %m
+ * when this is used.
+ */
+int
+errcode_for_socket_access(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ switch (edata->saved_errno)
+ {
+ /* Loss of connection */
+ case ALL_CONNECTION_FAILURE_ERRNOS:
+ edata->sqlerrcode = ERRCODE_CONNECTION_FAILURE;
+ break;
+
+ /* All else is classified as internal errors */
+ default:
+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
+ break;
+ }
+
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * This macro handles expansion of a format string and associated parameters;
+ * it's common code for errmsg(), errdetail(), etc. Must be called inside
+ * a routine that is declared like "const char *fmt, ..." and has an edata
+ * pointer set up. The message is assigned to edata->targetfield, or
+ * appended to it if appendval is true. The message is subject to translation
+ * if translateit is true.
+ *
+ * Note: we pstrdup the buffer rather than just transferring its storage
+ * to the edata field because the buffer might be considerably larger than
+ * really necessary.
+ */
+#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit) \
+ { \
+ StringInfoData buf; \
+ /* Internationalize the error format string */ \
+ if ((translateit) && !in_error_recursion_trouble()) \
+ fmt = dgettext((domain), fmt); \
+ initStringInfo(&buf); \
+ if ((appendval) && edata->targetfield) { \
+ appendStringInfoString(&buf, edata->targetfield); \
+ appendStringInfoChar(&buf, '\n'); \
+ } \
+ /* Generate actual output --- have to use appendStringInfoVA */ \
+ for (;;) \
+ { \
+ va_list args; \
+ int needed; \
+ errno = edata->saved_errno; \
+ va_start(args, fmt); \
+ needed = appendStringInfoVA(&buf, fmt, args); \
+ va_end(args); \
+ if (needed == 0) \
+ break; \
+ enlargeStringInfo(&buf, needed); \
+ } \
+ /* Save the completed message into the stack item */ \
+ if (edata->targetfield) \
+ pfree(edata->targetfield); \
+ edata->targetfield = pstrdup(buf.data); \
+ pfree(buf.data); \
+ }
+
+/*
+ * Same as above, except for pluralized error messages. The calling routine
+ * must be declared like "const char *fmt_singular, const char *fmt_plural,
+ * unsigned long n, ...". Translation is assumed always wanted.
+ */
+#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval) \
+ { \
+ const char *fmt; \
+ StringInfoData buf; \
+ /* Internationalize the error format string */ \
+ if (!in_error_recursion_trouble()) \
+ fmt = dngettext((domain), fmt_singular, fmt_plural, n); \
+ else \
+ fmt = (n == 1 ? fmt_singular : fmt_plural); \
+ initStringInfo(&buf); \
+ if ((appendval) && edata->targetfield) { \
+ appendStringInfoString(&buf, edata->targetfield); \
+ appendStringInfoChar(&buf, '\n'); \
+ } \
+ /* Generate actual output --- have to use appendStringInfoVA */ \
+ for (;;) \
+ { \
+ va_list args; \
+ int needed; \
+ errno = edata->saved_errno; \
+ va_start(args, n); \
+ needed = appendStringInfoVA(&buf, fmt, args); \
+ va_end(args); \
+ if (needed == 0) \
+ break; \
+ enlargeStringInfo(&buf, needed); \
+ } \
+ /* Save the completed message into the stack item */ \
+ if (edata->targetfield) \
+ pfree(edata->targetfield); \
+ edata->targetfield = pstrdup(buf.data); \
+ pfree(buf.data); \
+ }
+
+
+/*
+ * errmsg --- add a primary error message text to the current error
+ *
+ * In addition to the usual %-escapes recognized by printf, "%m" in
+ * fmt is replaced by the error message for the caller's value of errno.
+ *
+ * Note: no newline is needed at the end of the fmt string, since
+ * ereport will provide one for the output methods that need it.
+ */
+int
+errmsg(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ edata->message_id = fmt;
+ EVALUATE_MESSAGE(edata->domain, message, false, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+/*
+ * Add a backtrace to the containing ereport() call. This is intended to be
+ * added temporarily during debugging.
+ */
+int
+errbacktrace(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ set_backtrace(edata, 1);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+
+ return 0;
+}
+
+/*
+ * Compute backtrace data and add it to the supplied ErrorData. num_skip
+ * specifies how many inner frames to skip. Use this to avoid showing the
+ * internal backtrace support functions in the backtrace. This requires that
+ * this and related functions are not inlined.
+ */
+static void
+set_backtrace(ErrorData *edata, int num_skip)
+{
+ StringInfoData errtrace;
+
+ initStringInfo(&errtrace);
+
+#ifdef HAVE_BACKTRACE_SYMBOLS
+ {
+ void *buf[100];
+ int nframes;
+ char **strfrms;
+
+ nframes = backtrace(buf, lengthof(buf));
+ strfrms = backtrace_symbols(buf, nframes);
+ if (strfrms == NULL)
+ return;
+
+ for (int i = num_skip; i < nframes; i++)
+ appendStringInfo(&errtrace, "\n%s", strfrms[i]);
+ free(strfrms);
+ }
+#else
+ appendStringInfoString(&errtrace,
+ "backtrace generation is not supported by this installation");
+#endif
+
+ edata->backtrace = errtrace.data;
+}
+
+/*
+ * errmsg_internal --- add a primary error message text to the current error
+ *
+ * This is exactly like errmsg() except that strings passed to errmsg_internal
+ * are not translated, and are customarily left out of the
+ * internationalization message dictionary. This should be used for "can't
+ * happen" cases that are probably not worth spending translation effort on.
+ * We also use this for certain cases where we *must* not try to translate
+ * the message because the translation would fail and result in infinite
+ * error recursion.
+ */
+int
+errmsg_internal(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ edata->message_id = fmt;
+ EVALUATE_MESSAGE(edata->domain, message, false, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errmsg_plural --- add a primary error message text to the current error,
+ * with support for pluralization of the message text
+ */
+int
+errmsg_plural(const char *fmt_singular, const char *fmt_plural,
+ unsigned long n,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ edata->message_id = fmt_singular;
+ EVALUATE_MESSAGE_PLURAL(edata->domain, message, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errdetail --- add a detail error message text to the current error
+ */
+int
+errdetail(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE(edata->domain, detail, false, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errdetail_internal --- add a detail error message text to the current error
+ *
+ * This is exactly like errdetail() except that strings passed to
+ * errdetail_internal are not translated, and are customarily left out of the
+ * internationalization message dictionary. This should be used for detail
+ * messages that seem not worth translating for one reason or another
+ * (typically, that they don't seem to be useful to average users).
+ */
+int
+errdetail_internal(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE(edata->domain, detail, false, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errdetail_log --- add a detail_log error message text to the current error
+ */
+int
+errdetail_log(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE(edata->domain, detail_log, false, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errdetail_log_plural --- add a detail_log error message text to the current error
+ * with support for pluralization of the message text
+ */
+int
+errdetail_log_plural(const char *fmt_singular, const char *fmt_plural,
+ unsigned long n,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE_PLURAL(edata->domain, detail_log, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errdetail_plural --- add a detail error message text to the current error,
+ * with support for pluralization of the message text
+ */
+int
+errdetail_plural(const char *fmt_singular, const char *fmt_plural,
+ unsigned long n,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE_PLURAL(edata->domain, detail, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errhint --- add a hint error message text to the current error
+ */
+int
+errhint(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE(edata->domain, hint, false, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errhint_plural --- add a hint error message text to the current error,
+ * with support for pluralization of the message text
+ */
+int
+errhint_plural(const char *fmt_singular, const char *fmt_plural,
+ unsigned long n,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE_PLURAL(edata->domain, hint, false);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errcontext_msg --- add a context error message text to the current error
+ *
+ * Unlike other cases, multiple calls are allowed to build up a stack of
+ * context information. We assume earlier calls represent more-closely-nested
+ * states.
+ */
+int
+errcontext_msg(const char *fmt,...)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ EVALUATE_MESSAGE(edata->context_domain, context, true, true);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+ return 0; /* return value does not matter */
+}
+
+/*
+ * set_errcontext_domain --- set message domain to be used by errcontext()
+ *
+ * errcontext_msg() can be called from a different module than the original
+ * ereport(), so we cannot use the message domain passed in errstart() to
+ * translate it. Instead, each errcontext_msg() call should be preceded by
+ * a set_errcontext_domain() call to specify the domain. This is usually
+ * done transparently by the errcontext() macro.
+ */
+int
+set_errcontext_domain(const char *domain)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ /* the default text domain is the backend's */
+ edata->context_domain = domain ? domain : PG_TEXTDOMAIN("postgres");
+
+ return 0; /* return value does not matter */
+}
+
+
+/*
+ * errhidestmt --- optionally suppress STATEMENT: field of log entry
+ *
+ * This should be called if the message text already includes the statement.
+ */
+int
+errhidestmt(bool hide_stmt)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ edata->hide_stmt = hide_stmt;
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errhidecontext --- optionally suppress CONTEXT: field of log entry
+ *
+ * This should only be used for verbose debugging messages where the repeated
+ * inclusion of context would bloat the log volume too much.
+ */
+int
+errhidecontext(bool hide_ctx)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ edata->hide_ctx = hide_ctx;
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * errposition --- add cursor position to the current error
+ */
+int
+errposition(int cursorpos)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ edata->cursorpos = cursorpos;
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * internalerrposition --- add internal cursor position to the current error
+ */
+int
+internalerrposition(int cursorpos)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ edata->internalpos = cursorpos;
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * internalerrquery --- add internal query text to the current error
+ *
+ * Can also pass NULL to drop the internal query text entry. This case
+ * is intended for use in error callback subroutines that are editorializing
+ * on the layout of the error report.
+ */
+int
+internalerrquery(const char *query)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ if (edata->internalquery)
+ {
+ pfree(edata->internalquery);
+ edata->internalquery = NULL;
+ }
+
+ if (query)
+ edata->internalquery = MemoryContextStrdup(edata->assoc_context, query);
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * err_generic_string -- used to set individual ErrorData string fields
+ * identified by PG_DIAG_xxx codes.
+ *
+ * This intentionally only supports fields that don't use localized strings,
+ * so that there are no translation considerations.
+ *
+ * Most potential callers should not use this directly, but instead prefer
+ * higher-level abstractions, such as errtablecol() (see relcache.c).
+ */
+int
+err_generic_string(int field, const char *str)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ switch (field)
+ {
+ case PG_DIAG_SCHEMA_NAME:
+ set_errdata_field(edata->assoc_context, &edata->schema_name, str);
+ break;
+ case PG_DIAG_TABLE_NAME:
+ set_errdata_field(edata->assoc_context, &edata->table_name, str);
+ break;
+ case PG_DIAG_COLUMN_NAME:
+ set_errdata_field(edata->assoc_context, &edata->column_name, str);
+ break;
+ case PG_DIAG_DATATYPE_NAME:
+ set_errdata_field(edata->assoc_context, &edata->datatype_name, str);
+ break;
+ case PG_DIAG_CONSTRAINT_NAME:
+ set_errdata_field(edata->assoc_context, &edata->constraint_name, str);
+ break;
+ default:
+ elog(ERROR, "unsupported ErrorData field id: %d", field);
+ break;
+ }
+
+ return 0; /* return value does not matter */
+}
+
+/*
+ * set_errdata_field --- set an ErrorData string field
+ */
+static void
+set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str)
+{
+ Assert(*ptr == NULL);
+ *ptr = MemoryContextStrdup(cxt, str);
+}
+
+/*
+ * geterrcode --- return the currently set SQLSTATE error code
+ *
+ * This is only intended for use in error callback subroutines, since there
+ * is no other place outside elog.c where the concept is meaningful.
+ */
+int
+geterrcode(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ return edata->sqlerrcode;
+}
+
+/*
+ * geterrposition --- return the currently set error position (0 if none)
+ *
+ * This is only intended for use in error callback subroutines, since there
+ * is no other place outside elog.c where the concept is meaningful.
+ */
+int
+geterrposition(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ return edata->cursorpos;
+}
+
+/*
+ * getinternalerrposition --- same for internal error position
+ *
+ * This is only intended for use in error callback subroutines, since there
+ * is no other place outside elog.c where the concept is meaningful.
+ */
+int
+getinternalerrposition(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ /* we don't bother incrementing recursion_depth */
+ CHECK_STACK_DEPTH();
+
+ return edata->internalpos;
+}
+
+
+/*
+ * Functions to allow construction of error message strings separately from
+ * the ereport() call itself.
+ *
+ * The expected calling convention is
+ *
+ * pre_format_elog_string(errno, domain), var = format_elog_string(format,...)
+ *
+ * which can be hidden behind a macro such as GUC_check_errdetail(). We
+ * assume that any functions called in the arguments of format_elog_string()
+ * cannot result in re-entrant use of these functions --- otherwise the wrong
+ * text domain might be used, or the wrong errno substituted for %m. This is
+ * okay for the current usage with GUC check hooks, but might need further
+ * effort someday.
+ *
+ * The result of format_elog_string() is stored in ErrorContext, and will
+ * therefore survive until FlushErrorState() is called.
+ */
+static int save_format_errnumber;
+static const char *save_format_domain;
+
+void
+pre_format_elog_string(int errnumber, const char *domain)
+{
+ /* Save errno before evaluation of argument functions can change it */
+ save_format_errnumber = errnumber;
+ /* Save caller's text domain */
+ save_format_domain = domain;
+}
+
+char *
+format_elog_string(const char *fmt,...)
+{
+ ErrorData errdata;
+ ErrorData *edata;
+ MemoryContext oldcontext;
+
+ /* Initialize a mostly-dummy error frame */
+ edata = &errdata;
+ MemSet(edata, 0, sizeof(ErrorData));
+ /* the default text domain is the backend's */
+ edata->domain = save_format_domain ? save_format_domain : PG_TEXTDOMAIN("postgres");
+ /* set the errno to be used to interpret %m */
+ edata->saved_errno = save_format_errnumber;
+
+ oldcontext = MemoryContextSwitchTo(ErrorContext);
+
+ edata->message_id = fmt;
+ EVALUATE_MESSAGE(edata->domain, message, false, true);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return edata->message;
+}
+
+
+/*
+ * Actual output of the top-of-stack error message
+ *
+ * In the ereport(ERROR) case this is called from PostgresMain (or not at all,
+ * if the error is caught by somebody). For all other severity levels this
+ * is called by errfinish.
+ */
+void
+EmitErrorReport(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ MemoryContext oldcontext;
+
+ recursion_depth++;
+ CHECK_STACK_DEPTH();
+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);
+
+ /*
+ * Call hook before sending message to log. The hook function is allowed
+ * to turn off edata->output_to_server, so we must recheck that afterward.
+ * Making any other change in the content of edata is not considered
+ * supported.
+ *
+ * Note: the reason why the hook can only turn off output_to_server, and
+ * not turn it on, is that it'd be unreliable: we will never get here at
+ * all if errstart() deems the message uninteresting. A hook that could
+ * make decisions in that direction would have to hook into errstart(),
+ * where it would have much less information available. emit_log_hook is
+ * intended for custom log filtering and custom log message transmission
+ * mechanisms.
+ *
+ * The log hook has access to both the translated and original English
+ * error message text, which is passed through to allow it to be used as a
+ * message identifier. Note that the original text is not available for
+ * detail, detail_log, hint and context text elements.
+ */
+ if (edata->output_to_server && emit_log_hook)
+ (*emit_log_hook) (edata);
+
+ /* Send to server log, if enabled */
+ if (edata->output_to_server)
+ send_message_to_server_log(edata);
+
+ /* Send to client, if enabled */
+ if (edata->output_to_client)
+ send_message_to_frontend(edata);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+}
+
+/*
+ * CopyErrorData --- obtain a copy of the topmost error stack entry
+ *
+ * This is only for use in error handler code. The data is copied into the
+ * current memory context, so callers should always switch away from
+ * ErrorContext first; otherwise it will be lost when FlushErrorState is done.
+ */
+ErrorData *
+CopyErrorData(void)
+{
+ ErrorData *edata = &errordata[errordata_stack_depth];
+ ErrorData *newedata;
+
+ /*
+ * we don't increment recursion_depth because out-of-memory here does not
+ * indicate a problem within the error subsystem.
+ */
+ CHECK_STACK_DEPTH();
+
+ Assert(CurrentMemoryContext != ErrorContext);
+
+ /* Copy the struct itself */
+ newedata = (ErrorData *) palloc(sizeof(ErrorData));
+ memcpy(newedata, edata, sizeof(ErrorData));
+
+ /* Make copies of separately-allocated fields */
+ if (newedata->message)
+ newedata->message = pstrdup(newedata->message);
+ if (newedata->detail)
+ newedata->detail = pstrdup(newedata->detail);
+ if (newedata->detail_log)
+ newedata->detail_log = pstrdup(newedata->detail_log);
+ if (newedata->hint)
+ newedata->hint = pstrdup(newedata->hint);
+ if (newedata->context)
+ newedata->context = pstrdup(newedata->context);
+ if (newedata->backtrace)
+ newedata->backtrace = pstrdup(newedata->backtrace);
+ if (newedata->schema_name)
+ newedata->schema_name = pstrdup(newedata->schema_name);
+ if (newedata->table_name)
+ newedata->table_name = pstrdup(newedata->table_name);
+ if (newedata->column_name)
+ newedata->column_name = pstrdup(newedata->column_name);
+ if (newedata->datatype_name)
+ newedata->datatype_name = pstrdup(newedata->datatype_name);
+ if (newedata->constraint_name)
+ newedata->constraint_name = pstrdup(newedata->constraint_name);
+ if (newedata->internalquery)
+ newedata->internalquery = pstrdup(newedata->internalquery);
+
+ /* Use the calling context for string allocation */
+ newedata->assoc_context = CurrentMemoryContext;
+
+ return newedata;
+}
+
+/*
+ * FreeErrorData --- free the structure returned by CopyErrorData.
+ *
+ * Error handlers should use this in preference to assuming they know all
+ * the separately-allocated fields.
+ */
+void
+FreeErrorData(ErrorData *edata)
+{
+ if (edata->message)
+ pfree(edata->message);
+ if (edata->detail)
+ pfree(edata->detail);
+ if (edata->detail_log)
+ pfree(edata->detail_log);
+ if (edata->hint)
+ pfree(edata->hint);
+ if (edata->context)
+ pfree(edata->context);
+ if (edata->backtrace)
+ pfree(edata->backtrace);
+ if (edata->schema_name)
+ pfree(edata->schema_name);
+ if (edata->table_name)
+ pfree(edata->table_name);
+ if (edata->column_name)
+ pfree(edata->column_name);
+ if (edata->datatype_name)
+ pfree(edata->datatype_name);
+ if (edata->constraint_name)
+ pfree(edata->constraint_name);
+ if (edata->internalquery)
+ pfree(edata->internalquery);
+ pfree(edata);
+}
+
+/*
+ * FlushErrorState --- flush the error state after error recovery
+ *
+ * This should be called by an error handler after it's done processing
+ * the error; or as soon as it's done CopyErrorData, if it intends to
+ * do stuff that is likely to provoke another error. You are not "out" of
+ * the error subsystem until you have done this.
+ */
+void
+FlushErrorState(void)
+{
+ /*
+ * Reset stack to empty. The only case where it would be more than one
+ * deep is if we serviced an error that interrupted construction of
+ * another message. We assume control escaped out of that message
+ * construction and won't ever go back.
+ */
+ errordata_stack_depth = -1;
+ recursion_depth = 0;
+ /* Delete all data in ErrorContext */
+ MemoryContextResetAndDeleteChildren(ErrorContext);
+}
+
+/*
+ * ThrowErrorData --- report an error described by an ErrorData structure
+ *
+ * This is somewhat like ReThrowError, but it allows elevels besides ERROR,
+ * and the boolean flags such as output_to_server are computed via the
+ * default rules rather than being copied from the given ErrorData.
+ * This is primarily used to re-report errors originally reported by
+ * background worker processes and then propagated (with or without
+ * modification) to the backend responsible for them.
+ */
+void
+ThrowErrorData(ErrorData *edata)
+{
+ ErrorData *newedata;
+ MemoryContext oldcontext;
+
+ if (!errstart(edata->elevel, edata->domain))
+ return; /* error is not to be reported at all */
+
+ newedata = &errordata[errordata_stack_depth];
+ recursion_depth++;
+ oldcontext = MemoryContextSwitchTo(newedata->assoc_context);
+
+ /* Copy the supplied fields to the error stack entry. */
+ if (edata->sqlerrcode != 0)
+ newedata->sqlerrcode = edata->sqlerrcode;
+ if (edata->message)
+ newedata->message = pstrdup(edata->message);
+ if (edata->detail)
+ newedata->detail = pstrdup(edata->detail);
+ if (edata->detail_log)
+ newedata->detail_log = pstrdup(edata->detail_log);
+ if (edata->hint)
+ newedata->hint = pstrdup(edata->hint);
+ if (edata->context)
+ newedata->context = pstrdup(edata->context);
+ if (edata->backtrace)
+ newedata->backtrace = pstrdup(edata->backtrace);
+ /* assume message_id is not available */
+ if (edata->schema_name)
+ newedata->schema_name = pstrdup(edata->schema_name);
+ if (edata->table_name)
+ newedata->table_name = pstrdup(edata->table_name);
+ if (edata->column_name)
+ newedata->column_name = pstrdup(edata->column_name);
+ if (edata->datatype_name)
+ newedata->datatype_name = pstrdup(edata->datatype_name);
+ if (edata->constraint_name)
+ newedata->constraint_name = pstrdup(edata->constraint_name);
+ newedata->cursorpos = edata->cursorpos;
+ newedata->internalpos = edata->internalpos;
+ if (edata->internalquery)
+ newedata->internalquery = pstrdup(edata->internalquery);
+
+ MemoryContextSwitchTo(oldcontext);
+ recursion_depth--;
+
+ /* Process the error. */
+ errfinish(edata->filename, edata->lineno, edata->funcname);
+}
+
+/*
+ * ReThrowError --- re-throw a previously copied error
+ *
+ * A handler can do CopyErrorData/FlushErrorState to get out of the error
+ * subsystem, then do some processing, and finally ReThrowError to re-throw
+ * the original error. This is slower than just PG_RE_THROW() but should
+ * be used if the "some processing" is likely to incur another error.
+ */
+void
+ReThrowError(ErrorData *edata)
+{
+ ErrorData *newedata;
+
+ Assert(edata->elevel == ERROR);
+
+ /* Push the data back into the error context */
+ recursion_depth++;
+ MemoryContextSwitchTo(ErrorContext);
+
+ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)
+ {
+ /*
+ * Wups, stack not big enough. We treat this as a PANIC condition
+ * because it suggests an infinite loop of errors during error
+ * recovery.
+ */
+ errordata_stack_depth = -1; /* make room on stack */
+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
+ }
+
+ newedata = &errordata[errordata_stack_depth];
+ memcpy(newedata, edata, sizeof(ErrorData));
+
+ /* Make copies of separately-allocated fields */
+ if (newedata->message)
+ newedata->message = pstrdup(newedata->message);
+ if (newedata->detail)
+ newedata->detail = pstrdup(newedata->detail);
+ if (newedata->detail_log)
+ newedata->detail_log = pstrdup(newedata->detail_log);
+ if (newedata->hint)
+ newedata->hint = pstrdup(newedata->hint);
+ if (newedata->context)
+ newedata->context = pstrdup(newedata->context);
+ if (newedata->backtrace)
+ newedata->backtrace = pstrdup(newedata->backtrace);
+ if (newedata->schema_name)
+ newedata->schema_name = pstrdup(newedata->schema_name);
+ if (newedata->table_name)
+ newedata->table_name = pstrdup(newedata->table_name);
+ if (newedata->column_name)
+ newedata->column_name = pstrdup(newedata->column_name);
+ if (newedata->datatype_name)
+ newedata->datatype_name = pstrdup(newedata->datatype_name);
+ if (newedata->constraint_name)
+ newedata->constraint_name = pstrdup(newedata->constraint_name);
+ if (newedata->internalquery)
+ newedata->internalquery = pstrdup(newedata->internalquery);
+
+ /* Reset the assoc_context to be ErrorContext */
+ newedata->assoc_context = ErrorContext;
+
+ recursion_depth--;
+ PG_RE_THROW();
+}
+
+/*
+ * pg_re_throw --- out-of-line implementation of PG_RE_THROW() macro
+ */
+void
+pg_re_throw(void)
+{
+ /* If possible, throw the error to the next outer setjmp handler */
+ if (PG_exception_stack != NULL)
+ siglongjmp(*PG_exception_stack, 1);
+ else
+ {
+ /*
+ * If we get here, elog(ERROR) was thrown inside a PG_TRY block, which
+ * we have now exited only to discover that there is no outer setjmp
+ * handler to pass the error to. Had the error been thrown outside
+ * the block to begin with, we'd have promoted the error to FATAL, so
+ * the correct behavior is to make it FATAL now; that is, emit it and
+ * then call proc_exit.
+ */
+ ErrorData *edata = &errordata[errordata_stack_depth];
+
+ Assert(errordata_stack_depth >= 0);
+ Assert(edata->elevel == ERROR);
+ edata->elevel = FATAL;
+
+ /*
+ * At least in principle, the increase in severity could have changed
+ * where-to-output decisions, so recalculate.
+ */
+ edata->output_to_server = should_output_to_server(FATAL);
+ edata->output_to_client = should_output_to_client(FATAL);
+
+ /*
+ * We can use errfinish() for the rest, but we don't want it to call
+ * any error context routines a second time. Since we know we are
+ * about to exit, it should be OK to just clear the context stack.
+ */
+ error_context_stack = NULL;
+
+ errfinish(edata->filename, edata->lineno, edata->funcname);
+ }
+
+ /* Doesn't return ... */
+ ExceptionalCondition("pg_re_throw tried to return", "FailedAssertion",
+ __FILE__, __LINE__);
+}
+
+
+/*
+ * GetErrorContextStack - Return the context stack, for display/diags
+ *
+ * Returns a pstrdup'd string in the caller's context which includes the PG
+ * error call stack. It is the caller's responsibility to ensure this string
+ * is pfree'd (or its context cleaned up) when done.
+ *
+ * This information is collected by traversing the error contexts and calling
+ * each context's callback function, each of which is expected to call
+ * errcontext() to return a string which can be presented to the user.
+ */
+char *
+GetErrorContextStack(void)
+{
+ ErrorData *edata;
+ ErrorContextCallback *econtext;
+
+ /*
+ * Okay, crank up a stack entry to store the info in.
+ */
+ recursion_depth++;
+
+ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)
+ {
+ /*
+ * Wups, stack not big enough. We treat this as a PANIC condition
+ * because it suggests an infinite loop of errors during error
+ * recovery.
+ */
+ errordata_stack_depth = -1; /* make room on stack */
+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
+ }
+
+ /*
+ * Things look good so far, so initialize our error frame
+ */
+ edata = &errordata[errordata_stack_depth];
+ MemSet(edata, 0, sizeof(ErrorData));
+
+ /*
+ * Set up assoc_context to be the caller's context, so any allocations
+ * done (which will include edata->context) will use their context.
+ */
+ edata->assoc_context = CurrentMemoryContext;
+
+ /*
+ * Call any context callback functions to collect the context information
+ * into edata->context.
+ *
+ * Errors occurring in callback functions should go through the regular
+ * error handling code which should handle any recursive errors, though we
+ * double-check above, just in case.
+ */
+ for (econtext = error_context_stack;
+ econtext != NULL;
+ econtext = econtext->previous)
+ econtext->callback(econtext->arg);
+
+ /*
+ * Clean ourselves off the stack, any allocations done should have been
+ * using edata->assoc_context, which we set up earlier to be the caller's
+ * context, so we're free to just remove our entry off the stack and
+ * decrement recursion depth and exit.
+ */
+ errordata_stack_depth--;
+ recursion_depth--;
+
+ /*
+ * Return a pointer to the string the caller asked for, which should have
+ * been allocated in their context.
+ */
+ return edata->context;
+}
+
+
+/*
+ * Initialization of error output file
+ */
+void
+DebugFileOpen(void)
+{
+ int fd,
+ istty;
+
+ if (OutputFileName[0])
+ {
+ /*
+ * A debug-output file name was given.
+ *
+ * Make sure we can write the file, and find out if it's a tty.
+ */
+ if ((fd = open(OutputFileName, O_CREAT | O_APPEND | O_WRONLY,
+ 0666)) < 0)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m", OutputFileName)));
+ istty = isatty(fd);
+ close(fd);
+
+ /*
+ * Redirect our stderr to the debug output file.
+ */
+ if (!freopen(OutputFileName, "a", stderr))
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not reopen file \"%s\" as stderr: %m",
+ OutputFileName)));
+
+ /*
+ * If the file is a tty and we're running under the postmaster, try to
+ * send stdout there as well (if it isn't a tty then stderr will block
+ * out stdout, so we may as well let stdout go wherever it was going
+ * before).
+ */
+ if (istty && IsUnderPostmaster)
+ if (!freopen(OutputFileName, "a", stdout))
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not reopen file \"%s\" as stdout: %m",
+ OutputFileName)));
+ }
+}
+
+
+#ifdef HAVE_SYSLOG
+
+/*
+ * Set or update the parameters for syslog logging
+ */
+void
+set_syslog_parameters(const char *ident, int facility)
+{
+ /*
+ * guc.c is likely to call us repeatedly with same parameters, so don't
+ * thrash the syslog connection unnecessarily. Also, we do not re-open
+ * the connection until needed, since this routine will get called whether
+ * or not Log_destination actually mentions syslog.
+ *
+ * Note that we make our own copy of the ident string rather than relying
+ * on guc.c's. This may be overly paranoid, but it ensures that we cannot
+ * accidentally free a string that syslog is still using.
+ */
+ if (syslog_ident == NULL || strcmp(syslog_ident, ident) != 0 ||
+ syslog_facility != facility)
+ {
+ if (openlog_done)
+ {
+ closelog();
+ openlog_done = false;
+ }
+ if (syslog_ident)
+ free(syslog_ident);
+ syslog_ident = strdup(ident);
+ /* if the strdup fails, we will cope in write_syslog() */
+ syslog_facility = facility;
+ }
+}
+
+
+/*
+ * Write a message line to syslog
+ */
+static void
+write_syslog(int level, const char *line)
+{
+ static unsigned long seq = 0;
+
+ int len;
+ const char *nlpos;
+
+ /* Open syslog connection if not done yet */
+ if (!openlog_done)
+ {
+ openlog(syslog_ident ? syslog_ident : "postgres",
+ LOG_PID | LOG_NDELAY | LOG_NOWAIT,
+ syslog_facility);
+ openlog_done = true;
+ }
+
+ /*
+ * We add a sequence number to each log message to suppress "same"
+ * messages.
+ */
+ seq++;
+
+ /*
+ * Our problem here is that many syslog implementations don't handle long
+ * messages in an acceptable manner. While this function doesn't help that
+ * fact, it does work around by splitting up messages into smaller pieces.
+ *
+ * We divide into multiple syslog() calls if message is too long or if the
+ * message contains embedded newline(s).
+ */
+ len = strlen(line);
+ nlpos = strchr(line, '\n');
+ if (syslog_split_messages && (len > PG_SYSLOG_LIMIT || nlpos != NULL))
+ {
+ int chunk_nr = 0;
+
+ while (len > 0)
+ {
+ char buf[PG_SYSLOG_LIMIT + 1];
+ int buflen;
+ int i;
+
+ /* if we start at a newline, move ahead one char */
+ if (line[0] == '\n')
+ {
+ line++;
+ len--;
+ /* we need to recompute the next newline's position, too */
+ nlpos = strchr(line, '\n');
+ continue;
+ }
+
+ /* copy one line, or as much as will fit, to buf */
+ if (nlpos != NULL)
+ buflen = nlpos - line;
+ else
+ buflen = len;
+ buflen = Min(buflen, PG_SYSLOG_LIMIT);
+ memcpy(buf, line, buflen);
+ buf[buflen] = '\0';
+
+ /* trim to multibyte letter boundary */
+ buflen = pg_mbcliplen(buf, buflen, buflen);
+ if (buflen <= 0)
+ return;
+ buf[buflen] = '\0';
+
+ /* already word boundary? */
+ if (line[buflen] != '\0' &&
+ !isspace((unsigned char) line[buflen]))
+ {
+ /* try to divide at word boundary */
+ i = buflen - 1;
+ while (i > 0 && !isspace((unsigned char) buf[i]))
+ i--;
+
+ if (i > 0) /* else couldn't divide word boundary */
+ {
+ buflen = i;
+ buf[i] = '\0';
+ }
+ }
+
+ chunk_nr++;
+
+ if (syslog_sequence_numbers)
+ syslog(level, "[%lu-%d] %s", seq, chunk_nr, buf);
+ else
+ syslog(level, "[%d] %s", chunk_nr, buf);
+
+ line += buflen;
+ len -= buflen;
+ }
+ }
+ else
+ {
+ /* message short enough */
+ if (syslog_sequence_numbers)
+ syslog(level, "[%lu] %s", seq, line);
+ else
+ syslog(level, "%s", line);
+ }
+}
+#endif /* HAVE_SYSLOG */
+
+#ifdef WIN32
+/*
+ * Get the PostgreSQL equivalent of the Windows ANSI code page. "ANSI" system
+ * interfaces (e.g. CreateFileA()) expect string arguments in this encoding.
+ * Every process in a given system will find the same value at all times.
+ */
+static int
+GetACPEncoding(void)
+{
+ static int encoding = -2;
+
+ if (encoding == -2)
+ encoding = pg_codepage_to_encoding(GetACP());
+
+ return encoding;
+}
+
+/*
+ * Write a message line to the windows event log
+ */
+static void
+write_eventlog(int level, const char *line, int len)
+{
+ WCHAR *utf16;
+ int eventlevel = EVENTLOG_ERROR_TYPE;
+ static HANDLE evtHandle = INVALID_HANDLE_VALUE;
+
+ if (evtHandle == INVALID_HANDLE_VALUE)
+ {
+ evtHandle = RegisterEventSource(NULL,
+ event_source ? event_source : DEFAULT_EVENT_SOURCE);
+ if (evtHandle == NULL)
+ {
+ evtHandle = INVALID_HANDLE_VALUE;
+ return;
+ }
+ }
+
+ switch (level)
+ {
+ case DEBUG5:
+ case DEBUG4:
+ case DEBUG3:
+ case DEBUG2:
+ case DEBUG1:
+ case LOG:
+ case LOG_SERVER_ONLY:
+ case INFO:
+ case NOTICE:
+ eventlevel = EVENTLOG_INFORMATION_TYPE;
+ break;
+ case WARNING:
+ case WARNING_CLIENT_ONLY:
+ eventlevel = EVENTLOG_WARNING_TYPE;
+ break;
+ case ERROR:
+ case FATAL:
+ case PANIC:
+ default:
+ eventlevel = EVENTLOG_ERROR_TYPE;
+ break;
+ }
+
+ /*
+ * If message character encoding matches the encoding expected by
+ * ReportEventA(), call it to avoid the hazards of conversion. Otherwise,
+ * try to convert the message to UTF16 and write it with ReportEventW().
+ * Fall back on ReportEventA() if conversion failed.
+ *
+ * Since we palloc the structure required for conversion, also fall
+ * through to writing unconverted if we have not yet set up
+ * CurrentMemoryContext.
+ *
+ * Also verify that we are not on our way into error recursion trouble due
+ * to error messages thrown deep inside pgwin32_message_to_UTF16().
+ */
+ if (!in_error_recursion_trouble() &&
+ CurrentMemoryContext != NULL &&
+ GetMessageEncoding() != GetACPEncoding())
+ {
+ utf16 = pgwin32_message_to_UTF16(line, len, NULL);
+ if (utf16)
+ {
+ ReportEventW(evtHandle,
+ eventlevel,
+ 0,
+ 0, /* All events are Id 0 */
+ NULL,
+ 1,
+ 0,
+ (LPCWSTR *) &utf16,
+ NULL);
+ /* XXX Try ReportEventA() when ReportEventW() fails? */
+
+ pfree(utf16);
+ return;
+ }
+ }
+ ReportEventA(evtHandle,
+ eventlevel,
+ 0,
+ 0, /* All events are Id 0 */
+ NULL,
+ 1,
+ 0,
+ &line,
+ NULL);
+}
+#endif /* WIN32 */
+
+static void
+write_console(const char *line, int len)
+{
+ int rc;
+
+#ifdef WIN32
+
+ /*
+ * Try to convert the message to UTF16 and write it with WriteConsoleW().
+ * Fall back on write() if anything fails.
+ *
+ * In contrast to write_eventlog(), don't skip straight to write() based
+ * on the applicable encodings. Unlike WriteConsoleW(), write() depends
+ * on the suitability of the console output code page. Since we put
+ * stderr into binary mode in SubPostmasterMain(), write() skips the
+ * necessary translation anyway.
+ *
+ * WriteConsoleW() will fail if stderr is redirected, so just fall through
+ * to writing unconverted to the logfile in this case.
+ *
+ * Since we palloc the structure required for conversion, also fall
+ * through to writing unconverted if we have not yet set up
+ * CurrentMemoryContext.
+ */
+ if (!in_error_recursion_trouble() &&
+ !redirection_done &&
+ CurrentMemoryContext != NULL)
+ {
+ WCHAR *utf16;
+ int utf16len;
+
+ utf16 = pgwin32_message_to_UTF16(line, len, &utf16len);
+ if (utf16 != NULL)
+ {
+ HANDLE stdHandle;
+ DWORD written;
+
+ stdHandle = GetStdHandle(STD_ERROR_HANDLE);
+ if (WriteConsoleW(stdHandle, utf16, utf16len, &written, NULL))
+ {
+ pfree(utf16);
+ return;
+ }
+
+ /*
+ * In case WriteConsoleW() failed, fall back to writing the
+ * message unconverted.
+ */
+ pfree(utf16);
+ }
+ }
+#else
+
+ /*
+ * Conversion on non-win32 platforms is not implemented yet. It requires
+ * non-throw version of pg_do_encoding_conversion(), that converts
+ * unconvertible characters to '?' without errors.
+ *
+ * XXX: We have a no-throw version now. It doesn't convert to '?' though.
+ */
+#endif
+
+ /*
+ * We ignore any error from write() here. We have no useful way to report
+ * it ... certainly whining on stderr isn't likely to be productive.
+ */
+ rc = write(fileno(stderr), line, len);
+ (void) rc;
+}
+
+/*
+ * get_formatted_log_time -- compute and get the log timestamp.
+ *
+ * The timestamp is computed if not set yet, so as it is kept consistent
+ * among all the log destinations that require it to be consistent. Note
+ * that the computed timestamp is returned in a static buffer, not
+ * palloc()'d.
+ */
+char *
+get_formatted_log_time(void)
+{
+ pg_time_t stamp_time;
+ char msbuf[13];
+
+ /* leave if already computed */
+ if (formatted_log_time[0] != '\0')
+ return formatted_log_time;
+
+ if (!saved_timeval_set)
+ {
+ gettimeofday(&saved_timeval, NULL);
+ saved_timeval_set = true;
+ }
+
+ stamp_time = (pg_time_t) saved_timeval.tv_sec;
+
+ /*
+ * Note: we expect that guc.c will ensure that log_timezone is set up (at
+ * least with a minimal GMT value) before Log_line_prefix can become
+ * nonempty or CSV mode can be selected.
+ */
+ pg_strftime(formatted_log_time, FORMATTED_TS_LEN,
+ /* leave room for milliseconds... */
+ "%Y-%m-%d %H:%M:%S %Z",
+ pg_localtime(&stamp_time, log_timezone));
+
+ /* 'paste' milliseconds into place... */
+ sprintf(msbuf, ".%03d", (int) (saved_timeval.tv_usec / 1000));
+ memcpy(formatted_log_time + 19, msbuf, 4);
+
+ return formatted_log_time;
+}
+
+/*
+ * reset_formatted_start_time -- reset the start timestamp
+ */
+void
+reset_formatted_start_time(void)
+{
+ formatted_start_time[0] = '\0';
+}
+
+/*
+ * get_formatted_start_time -- compute and get the start timestamp.
+ *
+ * The timestamp is computed if not set yet. Note that the computed
+ * timestamp is returned in a static buffer, not palloc()'d.
+ */
+char *
+get_formatted_start_time(void)
+{
+ pg_time_t stamp_time = (pg_time_t) MyStartTime;
+
+ /* leave if already computed */
+ if (formatted_start_time[0] != '\0')
+ return formatted_start_time;
+
+ /*
+ * Note: we expect that guc.c will ensure that log_timezone is set up (at
+ * least with a minimal GMT value) before Log_line_prefix can become
+ * nonempty or CSV mode can be selected.
+ */
+ pg_strftime(formatted_start_time, FORMATTED_TS_LEN,
+ "%Y-%m-%d %H:%M:%S %Z",
+ pg_localtime(&stamp_time, log_timezone));
+
+ return formatted_start_time;
+}
+
+/*
+ * check_log_of_query -- check if a query can be logged
+ */
+bool
+check_log_of_query(ErrorData *edata)
+{
+ /* log required? */
+ if (!is_log_level_output(edata->elevel, log_min_error_statement))
+ return false;
+
+ /* query log wanted? */
+ if (edata->hide_stmt)
+ return false;
+
+ /* query string available? */
+ if (debug_query_string == NULL)
+ return false;
+
+ return true;
+}
+
+/*
+ * get_backend_type_for_log -- backend type for log entries
+ *
+ * Returns a pointer to a static buffer, not palloc()'d.
+ */
+const char *
+get_backend_type_for_log(void)
+{
+ const char *backend_type_str;
+
+ if (MyProcPid == PostmasterPid)
+ backend_type_str = "postmaster";
+ else if (MyBackendType == B_BG_WORKER)
+ backend_type_str = MyBgworkerEntry->bgw_type;
+ else
+ backend_type_str = GetBackendTypeDesc(MyBackendType);
+
+ return backend_type_str;
+}
+
+/*
+ * process_log_prefix_padding --- helper function for processing the format
+ * string in log_line_prefix
+ *
+ * Note: This function returns NULL if it finds something which
+ * it deems invalid in the format string.
+ */
+static const char *
+process_log_prefix_padding(const char *p, int *ppadding)
+{
+ int paddingsign = 1;
+ int padding = 0;
+
+ if (*p == '-')
+ {
+ p++;
+
+ if (*p == '\0') /* Did the buf end in %- ? */
+ return NULL;
+ paddingsign = -1;
+ }
+
+ /* generate an int version of the numerical string */
+ while (*p >= '0' && *p <= '9')
+ padding = padding * 10 + (*p++ - '0');
+
+ /* format is invalid if it ends with the padding number */
+ if (*p == '\0')
+ return NULL;
+
+ padding *= paddingsign;
+ *ppadding = padding;
+ return p;
+}
+
+/*
+ * Format tag info for log lines; append to the provided buffer.
+ */
+static void
+log_line_prefix(StringInfo buf, ErrorData *edata)
+{
+ /* static counter for line numbers */
+ static long log_line_number = 0;
+
+ /* has counter been reset in current process? */
+ static int log_my_pid = 0;
+ int padding;
+ const char *p;
+
+ /*
+ * This is one of the few places where we'd rather not inherit a static
+ * variable's value from the postmaster. But since we will, reset it when
+ * MyProcPid changes. MyStartTime also changes when MyProcPid does, so
+ * reset the formatted start timestamp too.
+ */
+ if (log_my_pid != MyProcPid)
+ {
+ log_line_number = 0;
+ log_my_pid = MyProcPid;
+ reset_formatted_start_time();
+ }
+ log_line_number++;
+
+ if (Log_line_prefix == NULL)
+ return; /* in case guc hasn't run yet */
+
+ for (p = Log_line_prefix; *p != '\0'; p++)
+ {
+ if (*p != '%')
+ {
+ /* literal char, just copy */
+ appendStringInfoChar(buf, *p);
+ continue;
+ }
+
+ /* must be a '%', so skip to the next char */
+ p++;
+ if (*p == '\0')
+ break; /* format error - ignore it */
+ else if (*p == '%')
+ {
+ /* string contains %% */
+ appendStringInfoChar(buf, '%');
+ continue;
+ }
+
+
+ /*
+ * Process any formatting which may exist after the '%'. Note that
+ * process_log_prefix_padding moves p past the padding number if it
+ * exists.
+ *
+ * Note: Since only '-', '0' to '9' are valid formatting characters we
+ * can do a quick check here to pre-check for formatting. If the char
+ * is not formatting then we can skip a useless function call.
+ *
+ * Further note: At least on some platforms, passing %*s rather than
+ * %s to appendStringInfo() is substantially slower, so many of the
+ * cases below avoid doing that unless non-zero padding is in fact
+ * specified.
+ */
+ if (*p > '9')
+ padding = 0;
+ else if ((p = process_log_prefix_padding(p, &padding)) == NULL)
+ break;
+
+ /* process the option */
+ switch (*p)
+ {
+ case 'a':
+ if (MyProcPort)
+ {
+ const char *appname = application_name;
+
+ if (appname == NULL || *appname == '\0')
+ appname = _("[unknown]");
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, appname);
+ else
+ appendStringInfoString(buf, appname);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+
+ break;
+ case 'b':
+ {
+ const char *backend_type_str = get_backend_type_for_log();
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, backend_type_str);
+ else
+ appendStringInfoString(buf, backend_type_str);
+ break;
+ }
+ case 'u':
+ if (MyProcPort)
+ {
+ const char *username = MyProcPort->user_name;
+
+ if (username == NULL || *username == '\0')
+ username = _("[unknown]");
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, username);
+ else
+ appendStringInfoString(buf, username);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'd':
+ if (MyProcPort)
+ {
+ const char *dbname = MyProcPort->database_name;
+
+ if (dbname == NULL || *dbname == '\0')
+ dbname = _("[unknown]");
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, dbname);
+ else
+ appendStringInfoString(buf, dbname);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'c':
+ if (padding != 0)
+ {
+ char strfbuf[128];
+
+ snprintf(strfbuf, sizeof(strfbuf) - 1, "%lx.%x",
+ (long) (MyStartTime), MyProcPid);
+ appendStringInfo(buf, "%*s", padding, strfbuf);
+ }
+ else
+ appendStringInfo(buf, "%lx.%x", (long) (MyStartTime), MyProcPid);
+ break;
+ case 'p':
+ if (padding != 0)
+ appendStringInfo(buf, "%*d", padding, MyProcPid);
+ else
+ appendStringInfo(buf, "%d", MyProcPid);
+ break;
+
+ case 'P':
+ if (MyProc)
+ {
+ PGPROC *leader = MyProc->lockGroupLeader;
+
+ /*
+ * Show the leader only for active parallel workers. This
+ * leaves out the leader of a parallel group.
+ */
+ if (leader == NULL || leader->pid == MyProcPid)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ else if (padding != 0)
+ appendStringInfo(buf, "%*d", padding, leader->pid);
+ else
+ appendStringInfo(buf, "%d", leader->pid);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+
+ case 'l':
+ if (padding != 0)
+ appendStringInfo(buf, "%*ld", padding, log_line_number);
+ else
+ appendStringInfo(buf, "%ld", log_line_number);
+ break;
+ case 'm':
+ /* force a log timestamp reset */
+ formatted_log_time[0] = '\0';
+ (void) get_formatted_log_time();
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, formatted_log_time);
+ else
+ appendStringInfoString(buf, formatted_log_time);
+ break;
+ case 't':
+ {
+ pg_time_t stamp_time = (pg_time_t) time(NULL);
+ char strfbuf[128];
+
+ pg_strftime(strfbuf, sizeof(strfbuf),
+ "%Y-%m-%d %H:%M:%S %Z",
+ pg_localtime(&stamp_time, log_timezone));
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, strfbuf);
+ else
+ appendStringInfoString(buf, strfbuf);
+ }
+ break;
+ case 'n':
+ {
+ char strfbuf[128];
+
+ if (!saved_timeval_set)
+ {
+ gettimeofday(&saved_timeval, NULL);
+ saved_timeval_set = true;
+ }
+
+ snprintf(strfbuf, sizeof(strfbuf), "%ld.%03d",
+ (long) saved_timeval.tv_sec,
+ (int) (saved_timeval.tv_usec / 1000));
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, strfbuf);
+ else
+ appendStringInfoString(buf, strfbuf);
+ }
+ break;
+ case 's':
+ {
+ char *start_time = get_formatted_start_time();
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, start_time);
+ else
+ appendStringInfoString(buf, start_time);
+ }
+ break;
+ case 'i':
+ if (MyProcPort)
+ {
+ const char *psdisp;
+ int displen;
+
+ psdisp = get_ps_display(&displen);
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, psdisp);
+ else
+ appendBinaryStringInfo(buf, psdisp, displen);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'r':
+ if (MyProcPort && MyProcPort->remote_host)
+ {
+ if (padding != 0)
+ {
+ if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0')
+ {
+ /*
+ * This option is slightly special as the port
+ * number may be appended onto the end. Here we
+ * need to build 1 string which contains the
+ * remote_host and optionally the remote_port (if
+ * set) so we can properly align the string.
+ */
+
+ char *hostport;
+
+ hostport = psprintf("%s(%s)", MyProcPort->remote_host, MyProcPort->remote_port);
+ appendStringInfo(buf, "%*s", padding, hostport);
+ pfree(hostport);
+ }
+ else
+ appendStringInfo(buf, "%*s", padding, MyProcPort->remote_host);
+ }
+ else
+ {
+ /* padding is 0, so we don't need a temp buffer */
+ appendStringInfoString(buf, MyProcPort->remote_host);
+ if (MyProcPort->remote_port &&
+ MyProcPort->remote_port[0] != '\0')
+ appendStringInfo(buf, "(%s)",
+ MyProcPort->remote_port);
+ }
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'h':
+ if (MyProcPort && MyProcPort->remote_host)
+ {
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, MyProcPort->remote_host);
+ else
+ appendStringInfoString(buf, MyProcPort->remote_host);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'q':
+ /* in postmaster and friends, stop if %q is seen */
+ /* in a backend, just ignore */
+ if (MyProcPort == NULL)
+ return;
+ break;
+ case 'v':
+ /* keep VXID format in sync with lockfuncs.c */
+ if (MyProc != NULL && MyProc->backendId != InvalidBackendId)
+ {
+ if (padding != 0)
+ {
+ char strfbuf[128];
+
+ snprintf(strfbuf, sizeof(strfbuf) - 1, "%d/%u",
+ MyProc->backendId, MyProc->lxid);
+ appendStringInfo(buf, "%*s", padding, strfbuf);
+ }
+ else
+ appendStringInfo(buf, "%d/%u", MyProc->backendId, MyProc->lxid);
+ }
+ else if (padding != 0)
+ appendStringInfoSpaces(buf,
+ padding > 0 ? padding : -padding);
+ break;
+ case 'x':
+ if (padding != 0)
+ appendStringInfo(buf, "%*u", padding, GetTopTransactionIdIfAny());
+ else
+ appendStringInfo(buf, "%u", GetTopTransactionIdIfAny());
+ break;
+ case 'e':
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, unpack_sql_state(edata->sqlerrcode));
+ else
+ appendStringInfoString(buf, unpack_sql_state(edata->sqlerrcode));
+ break;
+ case 'Q':
+ if (padding != 0)
+ appendStringInfo(buf, "%*lld", padding,
+ (long long) pgstat_get_my_query_id());
+ else
+ appendStringInfo(buf, "%lld",
+ (long long) pgstat_get_my_query_id());
+ break;
+ default:
+ /* format error - ignore it */
+ break;
+ }
+ }
+}
+
+/*
+ * Unpack MAKE_SQLSTATE code. Note that this returns a pointer to a
+ * static buffer.
+ */
+char *
+unpack_sql_state(int sql_state)
+{
+ static char buf[12];
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ buf[i] = PGUNSIXBIT(sql_state);
+ sql_state >>= 6;
+ }
+
+ buf[i] = '\0';
+ return buf;
+}
+
+
+/*
+ * Write error report to server's log
+ */
+static void
+send_message_to_server_log(ErrorData *edata)
+{
+ StringInfoData buf;
+ bool fallback_to_stderr = false;
+
+ initStringInfo(&buf);
+
+ saved_timeval_set = false;
+ formatted_log_time[0] = '\0';
+
+ log_line_prefix(&buf, edata);
+ appendStringInfo(&buf, "%s: ", _(error_severity(edata->elevel)));
+
+ if (Log_error_verbosity >= PGERROR_VERBOSE)
+ appendStringInfo(&buf, "%s: ", unpack_sql_state(edata->sqlerrcode));
+
+ if (edata->message)
+ append_with_tabs(&buf, edata->message);
+ else
+ append_with_tabs(&buf, _("missing error text"));
+
+ if (edata->cursorpos > 0)
+ appendStringInfo(&buf, _(" at character %d"),
+ edata->cursorpos);
+ else if (edata->internalpos > 0)
+ appendStringInfo(&buf, _(" at character %d"),
+ edata->internalpos);
+
+ appendStringInfoChar(&buf, '\n');
+
+ if (Log_error_verbosity >= PGERROR_DEFAULT)
+ {
+ if (edata->detail_log)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("DETAIL: "));
+ append_with_tabs(&buf, edata->detail_log);
+ appendStringInfoChar(&buf, '\n');
+ }
+ else if (edata->detail)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("DETAIL: "));
+ append_with_tabs(&buf, edata->detail);
+ appendStringInfoChar(&buf, '\n');
+ }
+ if (edata->hint)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("HINT: "));
+ append_with_tabs(&buf, edata->hint);
+ appendStringInfoChar(&buf, '\n');
+ }
+ if (edata->internalquery)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("QUERY: "));
+ append_with_tabs(&buf, edata->internalquery);
+ appendStringInfoChar(&buf, '\n');
+ }
+ if (edata->context && !edata->hide_ctx)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("CONTEXT: "));
+ append_with_tabs(&buf, edata->context);
+ appendStringInfoChar(&buf, '\n');
+ }
+ if (Log_error_verbosity >= PGERROR_VERBOSE)
+ {
+ /* assume no newlines in funcname or filename... */
+ if (edata->funcname && edata->filename)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfo(&buf, _("LOCATION: %s, %s:%d\n"),
+ edata->funcname, edata->filename,
+ edata->lineno);
+ }
+ else if (edata->filename)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfo(&buf, _("LOCATION: %s:%d\n"),
+ edata->filename, edata->lineno);
+ }
+ }
+ if (edata->backtrace)
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("BACKTRACE: "));
+ append_with_tabs(&buf, edata->backtrace);
+ appendStringInfoChar(&buf, '\n');
+ }
+ }
+
+ /*
+ * If the user wants the query that generated this error logged, do it.
+ */
+ if (check_log_of_query(edata))
+ {
+ log_line_prefix(&buf, edata);
+ appendStringInfoString(&buf, _("STATEMENT: "));
+ append_with_tabs(&buf, debug_query_string);
+ appendStringInfoChar(&buf, '\n');
+ }
+
+#ifdef HAVE_SYSLOG
+ /* Write to syslog, if enabled */
+ if (Log_destination & LOG_DESTINATION_SYSLOG)
+ {
+ int syslog_level;
+
+ switch (edata->elevel)
+ {
+ case DEBUG5:
+ case DEBUG4:
+ case DEBUG3:
+ case DEBUG2:
+ case DEBUG1:
+ syslog_level = LOG_DEBUG;
+ break;
+ case LOG:
+ case LOG_SERVER_ONLY:
+ case INFO:
+ syslog_level = LOG_INFO;
+ break;
+ case NOTICE:
+ case WARNING:
+ case WARNING_CLIENT_ONLY:
+ syslog_level = LOG_NOTICE;
+ break;
+ case ERROR:
+ syslog_level = LOG_WARNING;
+ break;
+ case FATAL:
+ syslog_level = LOG_ERR;
+ break;
+ case PANIC:
+ default:
+ syslog_level = LOG_CRIT;
+ break;
+ }
+
+ write_syslog(syslog_level, buf.data);
+ }
+#endif /* HAVE_SYSLOG */
+
+#ifdef WIN32
+ /* Write to eventlog, if enabled */
+ if (Log_destination & LOG_DESTINATION_EVENTLOG)
+ {
+ write_eventlog(edata->elevel, buf.data, buf.len);
+ }
+#endif /* WIN32 */
+
+ /* Write to csvlog, if enabled */
+ if (Log_destination & LOG_DESTINATION_CSVLOG)
+ {
+ /*
+ * Send CSV data if it's safe to do so (syslogger doesn't need the
+ * pipe). If this is not possible, fallback to an entry written to
+ * stderr.
+ */
+ if (redirection_done || MyBackendType == B_LOGGER)
+ write_csvlog(edata);
+ else
+ fallback_to_stderr = true;
+ }
+
+ /* Write to JSON log, if enabled */
+ if (Log_destination & LOG_DESTINATION_JSONLOG)
+ {
+ /*
+ * Send JSON data if it's safe to do so (syslogger doesn't need the
+ * pipe). If this is not possible, fallback to an entry written to
+ * stderr.
+ */
+ if (redirection_done || MyBackendType == B_LOGGER)
+ {
+ write_jsonlog(edata);
+ }
+ else
+ fallback_to_stderr = true;
+ }
+
+ /*
+ * Write to stderr, if enabled or if required because of a previous
+ * limitation.
+ */
+ if ((Log_destination & LOG_DESTINATION_STDERR) ||
+ whereToSendOutput == DestDebug ||
+ fallback_to_stderr)
+ {
+ /*
+ * Use the chunking protocol if we know the syslogger should be
+ * catching stderr output, and we are not ourselves the syslogger.
+ * Otherwise, just do a vanilla write to stderr.
+ */
+ if (redirection_done && MyBackendType != B_LOGGER)
+ write_pipe_chunks(buf.data, buf.len, LOG_DESTINATION_STDERR);
+#ifdef WIN32
+
+ /*
+ * In a win32 service environment, there is no usable stderr. Capture
+ * anything going there and write it to the eventlog instead.
+ *
+ * If stderr redirection is active, it was OK to write to stderr above
+ * because that's really a pipe to the syslogger process.
+ */
+ else if (pgwin32_is_service())
+ write_eventlog(edata->elevel, buf.data, buf.len);
+#endif
+ else
+ write_console(buf.data, buf.len);
+ }
+
+ /* If in the syslogger process, try to write messages direct to file */
+ if (MyBackendType == B_LOGGER)
+ write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_STDERR);
+
+ /* No more need of the message formatted for stderr */
+ pfree(buf.data);
+}
+
+/*
+ * Send data to the syslogger using the chunked protocol
+ *
+ * Note: when there are multiple backends writing into the syslogger pipe,
+ * it's critical that each write go into the pipe indivisibly, and not
+ * get interleaved with data from other processes. Fortunately, the POSIX
+ * spec requires that writes to pipes be atomic so long as they are not
+ * more than PIPE_BUF bytes long. So we divide long messages into chunks
+ * that are no more than that length, and send one chunk per write() call.
+ * The collector process knows how to reassemble the chunks.
+ *
+ * Because of the atomic write requirement, there are only two possible
+ * results from write() here: -1 for failure, or the requested number of
+ * bytes. There is not really anything we can do about a failure; retry would
+ * probably be an infinite loop, and we can't even report the error usefully.
+ * (There is noplace else we could send it!) So we might as well just ignore
+ * the result from write(). However, on some platforms you get a compiler
+ * warning from ignoring write()'s result, so do a little dance with casting
+ * rc to void to shut up the compiler.
+ */
+void
+write_pipe_chunks(char *data, int len, int dest)
+{
+ PipeProtoChunk p;
+ int fd = fileno(stderr);
+ int rc;
+
+ Assert(len > 0);
+
+ p.proto.nuls[0] = p.proto.nuls[1] = '\0';
+ p.proto.pid = MyProcPid;
+ p.proto.flags = 0;
+ if (dest == LOG_DESTINATION_STDERR)
+ p.proto.flags |= PIPE_PROTO_DEST_STDERR;
+ else if (dest == LOG_DESTINATION_CSVLOG)
+ p.proto.flags |= PIPE_PROTO_DEST_CSVLOG;
+ else if (dest == LOG_DESTINATION_JSONLOG)
+ p.proto.flags |= PIPE_PROTO_DEST_JSONLOG;
+
+ /* write all but the last chunk */
+ while (len > PIPE_MAX_PAYLOAD)
+ {
+ /* no need to set PIPE_PROTO_IS_LAST yet */
+ p.proto.len = PIPE_MAX_PAYLOAD;
+ memcpy(p.proto.data, data, PIPE_MAX_PAYLOAD);
+ rc = write(fd, &p, PIPE_HEADER_SIZE + PIPE_MAX_PAYLOAD);
+ (void) rc;
+ data += PIPE_MAX_PAYLOAD;
+ len -= PIPE_MAX_PAYLOAD;
+ }
+
+ /* write the last chunk */
+ p.proto.flags |= PIPE_PROTO_IS_LAST;
+ p.proto.len = len;
+ memcpy(p.proto.data, data, len);
+ rc = write(fd, &p, PIPE_HEADER_SIZE + len);
+ (void) rc;
+}
+
+
+/*
+ * Append a text string to the error report being built for the client.
+ *
+ * This is ordinarily identical to pq_sendstring(), but if we are in
+ * error recursion trouble we skip encoding conversion, because of the
+ * possibility that the problem is a failure in the encoding conversion
+ * subsystem itself. Code elsewhere should ensure that the passed-in
+ * strings will be plain 7-bit ASCII, and thus not in need of conversion,
+ * in such cases. (In particular, we disable localization of error messages
+ * to help ensure that's true.)
+ */
+static void
+err_sendstring(StringInfo buf, const char *str)
+{
+ if (in_error_recursion_trouble())
+ pq_send_ascii_string(buf, str);
+ else
+ pq_sendstring(buf, str);
+}
+
+/*
+ * Write error report to client
+ */
+static void
+send_message_to_frontend(ErrorData *edata)
+{
+ StringInfoData msgbuf;
+
+ /*
+ * We no longer support pre-3.0 FE/BE protocol, except here. If a client
+ * tries to connect using an older protocol version, it's nice to send the
+ * "protocol version not supported" error in a format the client
+ * understands. If protocol hasn't been set yet, early in backend
+ * startup, assume modern protocol.
+ */
+ if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3 || FrontendProtocol == 0)
+ {
+ /* New style with separate fields */
+ const char *sev;
+ char tbuf[12];
+
+ /* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
+ pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? 'N' : 'E');
+
+ sev = error_severity(edata->elevel);
+ pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY);
+ err_sendstring(&msgbuf, _(sev));
+ pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY_NONLOCALIZED);
+ err_sendstring(&msgbuf, sev);
+
+ pq_sendbyte(&msgbuf, PG_DIAG_SQLSTATE);
+ err_sendstring(&msgbuf, unpack_sql_state(edata->sqlerrcode));
+
+ /* M field is required per protocol, so always send something */
+ pq_sendbyte(&msgbuf, PG_DIAG_MESSAGE_PRIMARY);
+ if (edata->message)
+ err_sendstring(&msgbuf, edata->message);
+ else
+ err_sendstring(&msgbuf, _("missing error text"));
+
+ if (edata->detail)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_MESSAGE_DETAIL);
+ err_sendstring(&msgbuf, edata->detail);
+ }
+
+ /* detail_log is intentionally not used here */
+
+ if (edata->hint)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_MESSAGE_HINT);
+ err_sendstring(&msgbuf, edata->hint);
+ }
+
+ if (edata->context)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_CONTEXT);
+ err_sendstring(&msgbuf, edata->context);
+ }
+
+ if (edata->schema_name)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_SCHEMA_NAME);
+ err_sendstring(&msgbuf, edata->schema_name);
+ }
+
+ if (edata->table_name)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_TABLE_NAME);
+ err_sendstring(&msgbuf, edata->table_name);
+ }
+
+ if (edata->column_name)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_COLUMN_NAME);
+ err_sendstring(&msgbuf, edata->column_name);
+ }
+
+ if (edata->datatype_name)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_DATATYPE_NAME);
+ err_sendstring(&msgbuf, edata->datatype_name);
+ }
+
+ if (edata->constraint_name)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_CONSTRAINT_NAME);
+ err_sendstring(&msgbuf, edata->constraint_name);
+ }
+
+ if (edata->cursorpos > 0)
+ {
+ snprintf(tbuf, sizeof(tbuf), "%d", edata->cursorpos);
+ pq_sendbyte(&msgbuf, PG_DIAG_STATEMENT_POSITION);
+ err_sendstring(&msgbuf, tbuf);
+ }
+
+ if (edata->internalpos > 0)
+ {
+ snprintf(tbuf, sizeof(tbuf), "%d", edata->internalpos);
+ pq_sendbyte(&msgbuf, PG_DIAG_INTERNAL_POSITION);
+ err_sendstring(&msgbuf, tbuf);
+ }
+
+ if (edata->internalquery)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_INTERNAL_QUERY);
+ err_sendstring(&msgbuf, edata->internalquery);
+ }
+
+ if (edata->filename)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_SOURCE_FILE);
+ err_sendstring(&msgbuf, edata->filename);
+ }
+
+ if (edata->lineno > 0)
+ {
+ snprintf(tbuf, sizeof(tbuf), "%d", edata->lineno);
+ pq_sendbyte(&msgbuf, PG_DIAG_SOURCE_LINE);
+ err_sendstring(&msgbuf, tbuf);
+ }
+
+ if (edata->funcname)
+ {
+ pq_sendbyte(&msgbuf, PG_DIAG_SOURCE_FUNCTION);
+ err_sendstring(&msgbuf, edata->funcname);
+ }
+
+ pq_sendbyte(&msgbuf, '\0'); /* terminator */
+
+ pq_endmessage(&msgbuf);
+ }
+ else
+ {
+ /* Old style --- gin up a backwards-compatible message */
+ StringInfoData buf;
+
+ initStringInfo(&buf);
+
+ appendStringInfo(&buf, "%s: ", _(error_severity(edata->elevel)));
+
+ if (edata->message)
+ appendStringInfoString(&buf, edata->message);
+ else
+ appendStringInfoString(&buf, _("missing error text"));
+
+ appendStringInfoChar(&buf, '\n');
+
+ /* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
+ pq_putmessage_v2((edata->elevel < ERROR) ? 'N' : 'E', buf.data, buf.len + 1);
+
+ pfree(buf.data);
+ }
+
+ /*
+ * This flush is normally not necessary, since postgres.c will flush out
+ * waiting data when control returns to the main loop. But it seems best
+ * to leave it here, so that the client has some clue what happened if the
+ * backend dies before getting back to the main loop ... error/notice
+ * messages should not be a performance-critical path anyway, so an extra
+ * flush won't hurt much ...
+ */
+ pq_flush();
+}
+
+
+/*
+ * Support routines for formatting error messages.
+ */
+
+
+/*
+ * error_severity --- get string representing elevel
+ *
+ * The string is not localized here, but we mark the strings for translation
+ * so that callers can invoke _() on the result.
+ */
+const char *
+error_severity(int elevel)
+{
+ const char *prefix;
+
+ switch (elevel)
+ {
+ case DEBUG1:
+ case DEBUG2:
+ case DEBUG3:
+ case DEBUG4:
+ case DEBUG5:
+ prefix = gettext_noop("DEBUG");
+ break;
+ case LOG:
+ case LOG_SERVER_ONLY:
+ prefix = gettext_noop("LOG");
+ break;
+ case INFO:
+ prefix = gettext_noop("INFO");
+ break;
+ case NOTICE:
+ prefix = gettext_noop("NOTICE");
+ break;
+ case WARNING:
+ case WARNING_CLIENT_ONLY:
+ prefix = gettext_noop("WARNING");
+ break;
+ case ERROR:
+ prefix = gettext_noop("ERROR");
+ break;
+ case FATAL:
+ prefix = gettext_noop("FATAL");
+ break;
+ case PANIC:
+ prefix = gettext_noop("PANIC");
+ break;
+ default:
+ prefix = "???";
+ break;
+ }
+
+ return prefix;
+}
+
+
+/*
+ * append_with_tabs
+ *
+ * Append the string to the StringInfo buffer, inserting a tab after any
+ * newline.
+ */
+static void
+append_with_tabs(StringInfo buf, const char *str)
+{
+ char ch;
+
+ while ((ch = *str++) != '\0')
+ {
+ appendStringInfoCharMacro(buf, ch);
+ if (ch == '\n')
+ appendStringInfoCharMacro(buf, '\t');
+ }
+}
+
+
+/*
+ * Write errors to stderr (or by equal means when stderr is
+ * not available). Used before ereport/elog can be used
+ * safely (memory context, GUC load etc)
+ */
+void
+write_stderr(const char *fmt,...)
+{
+ va_list ap;
+
+#ifdef WIN32
+ char errbuf[2048]; /* Arbitrary size? */
+#endif
+
+ fmt = _(fmt);
+
+ va_start(ap, fmt);
+#ifndef WIN32
+ /* On Unix, we just fprintf to stderr */
+ vfprintf(stderr, fmt, ap);
+ fflush(stderr);
+#else
+ vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
+
+ /*
+ * On Win32, we print to stderr if running on a console, or write to
+ * eventlog if running as a service
+ */
+ if (pgwin32_is_service()) /* Running as a service */
+ {
+ write_eventlog(ERROR, errbuf, strlen(errbuf));
+ }
+ else
+ {
+ /* Not running as service, write to stderr */
+ write_console(errbuf, strlen(errbuf));
+ fflush(stderr);
+ }
+#endif
+ va_end(ap);
+}
+
+
+/*
+ * Write a message to STDERR using only async-signal-safe functions. This can
+ * be used to safely emit a message from a signal handler.
+ *
+ * TODO: It is likely possible to safely do a limited amount of string
+ * interpolation (e.g., %s and %d), but that is not presently supported.
+ */
+void
+write_stderr_signal_safe(const char *str)
+{
+ int nwritten = 0;
+ int ntotal = strlen(str);
+
+ while (nwritten < ntotal)
+ {
+ int rc;
+
+ rc = write(STDERR_FILENO, str + nwritten, ntotal - nwritten);
+
+ /* Just give up on error. There isn't much else we can do. */
+ if (rc == -1)
+ return;
+
+ nwritten += rc;
+ }
+}
+
+
+/*
+ * Adjust the level of a recovery-related message per trace_recovery_messages.
+ *
+ * The argument is the default log level of the message, eg, DEBUG2. (This
+ * should only be applied to DEBUGn log messages, otherwise it's a no-op.)
+ * If the level is >= trace_recovery_messages, we return LOG, causing the
+ * message to be logged unconditionally (for most settings of
+ * log_min_messages). Otherwise, we return the argument unchanged.
+ * The message will then be shown based on the setting of log_min_messages.
+ *
+ * Intention is to keep this for at least the whole of the 9.0 production
+ * release, so we can more easily diagnose production problems in the field.
+ * It should go away eventually, though, because it's an ugly and
+ * hard-to-explain kluge.
+ */
+int
+trace_recovery(int trace_level)
+{
+ if (trace_level < LOG &&
+ trace_level >= trace_recovery_messages)
+ return LOG;
+
+ return trace_level;
+}
diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c
new file mode 100644
index 0000000..27ad768
--- /dev/null
+++ b/src/backend/utils/error/jsonlog.c
@@ -0,0 +1,303 @@
+/*-------------------------------------------------------------------------
+ *
+ * jsonlog.c
+ * JSON logging
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/error/jsonlog.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "libpq/libpq.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "postmaster/bgworker.h"
+#include "postmaster/syslogger.h"
+#include "storage/lock.h"
+#include "storage/proc.h"
+#include "tcop/tcopprot.h"
+#include "utils/backend_status.h"
+#include "utils/elog.h"
+#include "utils/guc.h"
+#include "utils/json.h"
+#include "utils/ps_status.h"
+
+static void appendJSONKeyValueFmt(StringInfo buf, const char *key,
+ bool escape_key,
+ const char *fmt,...) pg_attribute_printf(4, 5);
+
+/*
+ * appendJSONKeyValue
+ *
+ * Append to a StringInfo a comma followed by a JSON key and a value.
+ * The key is always escaped. The value can be escaped optionally, that
+ * is dependent on the data type of the key.
+ */
+static void
+appendJSONKeyValue(StringInfo buf, const char *key, const char *value,
+ bool escape_value)
+{
+ Assert(key != NULL);
+
+ if (value == NULL)
+ return;
+
+ appendStringInfoChar(buf, ',');
+ escape_json(buf, key);
+ appendStringInfoChar(buf, ':');
+
+ if (escape_value)
+ escape_json(buf, value);
+ else
+ appendStringInfoString(buf, value);
+}
+
+
+/*
+ * appendJSONKeyValueFmt
+ *
+ * Evaluate the fmt string and then invoke appendJSONKeyValue() as the
+ * value of the JSON property. Both the key and value will be escaped by
+ * appendJSONKeyValue().
+ */
+static void
+appendJSONKeyValueFmt(StringInfo buf, const char *key,
+ bool escape_key, const char *fmt,...)
+{
+ int save_errno = errno;
+ size_t len = 128; /* initial assumption about buffer size */
+ char *value;
+
+ for (;;)
+ {
+ va_list args;
+ size_t newlen;
+
+ /* Allocate result buffer */
+ value = (char *) palloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ newlen = pvsnprintf(value, len, fmt, args);
+ va_end(args);
+
+ if (newlen < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ pfree(value);
+ len = newlen;
+ }
+
+ appendJSONKeyValue(buf, key, value, escape_key);
+
+ /* Clean up */
+ pfree(value);
+}
+
+/*
+ * Write logs in json format.
+ */
+void
+write_jsonlog(ErrorData *edata)
+{
+ StringInfoData buf;
+ char *start_time;
+ char *log_time;
+
+ /* static counter for line numbers */
+ static long log_line_number = 0;
+
+ /* Has the counter been reset in the current process? */
+ static int log_my_pid = 0;
+
+ /*
+ * This is one of the few places where we'd rather not inherit a static
+ * variable's value from the postmaster. But since we will, reset it when
+ * MyProcPid changes.
+ */
+ if (log_my_pid != MyProcPid)
+ {
+ log_line_number = 0;
+ log_my_pid = MyProcPid;
+ reset_formatted_start_time();
+ }
+ log_line_number++;
+
+ initStringInfo(&buf);
+
+ /* Initialize string */
+ appendStringInfoChar(&buf, '{');
+
+ /* timestamp with milliseconds */
+ log_time = get_formatted_log_time();
+
+ /*
+ * First property does not use appendJSONKeyValue as it does not have
+ * comma prefix.
+ */
+ escape_json(&buf, "timestamp");
+ appendStringInfoChar(&buf, ':');
+ escape_json(&buf, log_time);
+
+ /* username */
+ if (MyProcPort)
+ appendJSONKeyValue(&buf, "user", MyProcPort->user_name, true);
+
+ /* database name */
+ if (MyProcPort)
+ appendJSONKeyValue(&buf, "dbname", MyProcPort->database_name, true);
+
+ /* Process ID */
+ if (MyProcPid != 0)
+ appendJSONKeyValueFmt(&buf, "pid", false, "%d", MyProcPid);
+
+ /* Remote host and port */
+ if (MyProcPort && MyProcPort->remote_host)
+ {
+ appendJSONKeyValue(&buf, "remote_host", MyProcPort->remote_host, true);
+ if (MyProcPort->remote_port && MyProcPort->remote_port[0] != '\0')
+ appendJSONKeyValue(&buf, "remote_port", MyProcPort->remote_port, false);
+ }
+
+ /* Session id */
+ appendJSONKeyValueFmt(&buf, "session_id", true, "%lx.%x",
+ (long) MyStartTime, MyProcPid);
+
+ /* Line number */
+ appendJSONKeyValueFmt(&buf, "line_num", false, "%ld", log_line_number);
+
+ /* PS display */
+ if (MyProcPort)
+ {
+ StringInfoData msgbuf;
+ const char *psdisp;
+ int displen;
+
+ initStringInfo(&msgbuf);
+ psdisp = get_ps_display(&displen);
+ appendBinaryStringInfo(&msgbuf, psdisp, displen);
+ appendJSONKeyValue(&buf, "ps", msgbuf.data, true);
+
+ pfree(msgbuf.data);
+ }
+
+ /* session start timestamp */
+ start_time = get_formatted_start_time();
+ appendJSONKeyValue(&buf, "session_start", start_time, true);
+
+ /* Virtual transaction id */
+ /* keep VXID format in sync with lockfuncs.c */
+ if (MyProc != NULL && MyProc->backendId != InvalidBackendId)
+ appendJSONKeyValueFmt(&buf, "vxid", true, "%d/%u", MyProc->backendId,
+ MyProc->lxid);
+
+ /* Transaction id */
+ appendJSONKeyValueFmt(&buf, "txid", false, "%u",
+ GetTopTransactionIdIfAny());
+
+ /* Error severity */
+ if (edata->elevel)
+ appendJSONKeyValue(&buf, "error_severity",
+ (char *) error_severity(edata->elevel), true);
+
+ /* SQL state code */
+ if (edata->sqlerrcode)
+ appendJSONKeyValue(&buf, "state_code",
+ unpack_sql_state(edata->sqlerrcode), true);
+
+ /* errmessage */
+ appendJSONKeyValue(&buf, "message", edata->message, true);
+
+ /* errdetail or error_detail log */
+ if (edata->detail_log)
+ appendJSONKeyValue(&buf, "detail", edata->detail_log, true);
+ else
+ appendJSONKeyValue(&buf, "detail", edata->detail, true);
+
+ /* errhint */
+ if (edata->hint)
+ appendJSONKeyValue(&buf, "hint", edata->hint, true);
+
+ /* internal query */
+ if (edata->internalquery)
+ appendJSONKeyValue(&buf, "internal_query", edata->internalquery,
+ true);
+
+ /* if printed internal query, print internal pos too */
+ if (edata->internalpos > 0 && edata->internalquery != NULL)
+ appendJSONKeyValueFmt(&buf, "internal_position", false, "%d",
+ edata->internalpos);
+
+ /* errcontext */
+ if (edata->context && !edata->hide_ctx)
+ appendJSONKeyValue(&buf, "context", edata->context, true);
+
+ /* user query --- only reported if not disabled by the caller */
+ if (check_log_of_query(edata))
+ {
+ appendJSONKeyValue(&buf, "statement", debug_query_string, true);
+ if (edata->cursorpos > 0)
+ appendJSONKeyValueFmt(&buf, "cursor_position", false, "%d",
+ edata->cursorpos);
+ }
+
+ /* file error location */
+ if (Log_error_verbosity >= PGERROR_VERBOSE)
+ {
+ if (edata->funcname)
+ appendJSONKeyValue(&buf, "func_name", edata->funcname, true);
+ if (edata->filename)
+ {
+ appendJSONKeyValue(&buf, "file_name", edata->filename, true);
+ appendJSONKeyValueFmt(&buf, "file_line_num", false, "%d",
+ edata->lineno);
+ }
+ }
+
+ /* Application name */
+ if (application_name && application_name[0] != '\0')
+ appendJSONKeyValue(&buf, "application_name", application_name, true);
+
+ /* backend type */
+ appendJSONKeyValue(&buf, "backend_type", get_backend_type_for_log(), true);
+
+ /* leader PID */
+ if (MyProc)
+ {
+ PGPROC *leader = MyProc->lockGroupLeader;
+
+ /*
+ * Show the leader only for active parallel workers. This leaves out
+ * the leader of a parallel group.
+ */
+ if (leader && leader->pid != MyProcPid)
+ appendJSONKeyValueFmt(&buf, "leader_pid", false, "%d",
+ leader->pid);
+ }
+
+ /* query id */
+ appendJSONKeyValueFmt(&buf, "query_id", false, "%lld",
+ (long long) pgstat_get_my_query_id());
+
+ /* Finish string */
+ appendStringInfoChar(&buf, '}');
+ appendStringInfoChar(&buf, '\n');
+
+ /* If in the syslogger process, try to write messages direct to file */
+ if (MyBackendType == B_LOGGER)
+ write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_JSONLOG);
+ else
+ write_pipe_chunks(buf.data, buf.len, LOG_DESTINATION_JSONLOG);
+
+ pfree(buf.data);
+}
diff --git a/src/backend/utils/fmgr-stamp b/src/backend/utils/fmgr-stamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/backend/utils/fmgr-stamp
diff --git a/src/backend/utils/fmgr/Makefile b/src/backend/utils/fmgr/Makefile
new file mode 100644
index 0000000..ceffb80
--- /dev/null
+++ b/src/backend/utils/fmgr/Makefile
@@ -0,0 +1,20 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/fmgr
+#
+# IDENTIFICATION
+# src/backend/utils/fmgr/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/fmgr
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ dfmgr.o \
+ fmgr.o \
+ funcapi.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/fmgr/README b/src/backend/utils/fmgr/README
new file mode 100644
index 0000000..4b2a5df
--- /dev/null
+++ b/src/backend/utils/fmgr/README
@@ -0,0 +1,335 @@
+src/backend/utils/fmgr/README
+
+Function Manager
+================
+
+[This file originally explained the transition from the V0 to the V1
+interface. Now it just explains some internals and rationale for the V1
+interface, while the V0 interface has been removed.]
+
+The V1 Function-Manager Interface
+---------------------------------
+
+The core of the design is data structures for representing the result of a
+function lookup and for representing the parameters passed to a specific
+function invocation. (We want to keep function lookup separate from
+function call, since many parts of the system apply the same function over
+and over; the lookup overhead should be paid once per query, not once per
+tuple.)
+
+
+When a function is looked up in pg_proc, the result is represented as
+
+typedef struct
+{
+ PGFunction fn_addr; /* pointer to function or handler to be called */
+ Oid fn_oid; /* OID of function (NOT of handler, if any) */
+ short fn_nargs; /* number of input args (0..FUNC_MAX_ARGS) */
+ bool fn_strict; /* function is "strict" (NULL in => NULL out) */
+ bool fn_retset; /* function returns a set (over multiple calls) */
+ unsigned char fn_stats; /* collect stats if track_functions > this */
+ void *fn_extra; /* extra space for use by handler */
+ MemoryContext fn_mcxt; /* memory context to store fn_extra in */
+ Node *fn_expr; /* expression parse tree for call, or NULL */
+} FmgrInfo;
+
+For an ordinary built-in function, fn_addr is just the address of the C
+routine that implements the function. Otherwise it is the address of a
+handler for the class of functions that includes the target function.
+The handler can use the function OID and perhaps also the fn_extra slot
+to find the specific code to execute. (fn_oid = InvalidOid can be used
+to denote a not-yet-initialized FmgrInfo struct. fn_extra will always
+be NULL when an FmgrInfo is first filled by the function lookup code, but
+a function handler could set it to avoid making repeated lookups of its
+own when the same FmgrInfo is used repeatedly during a query.) fn_nargs
+is the number of arguments expected by the function, fn_strict is its
+strictness flag, and fn_retset shows whether it returns a set; all of
+these values come from the function's pg_proc entry. fn_stats is also
+set up to control whether or not to track runtime statistics for calling
+this function.
+
+If the function is being called as part of a SQL expression, fn_expr will
+point to the expression parse tree for the function call; this can be used
+to extract parse-time knowledge about the actual arguments. Note that this
+field really is information about the arguments rather than information
+about the function, but it's proven to be more convenient to keep it in
+FmgrInfo than in FunctionCallInfoBaseData where it might more logically go.
+
+
+During a call of a function, the following data structure is created
+and passed to the function:
+
+typedef struct
+{
+ FmgrInfo *flinfo; /* ptr to lookup info used for this call */
+ Node *context; /* pass info about context of call */
+ Node *resultinfo; /* pass or return extra info about result */
+ Oid fncollation; /* collation for function to use */
+ bool isnull; /* function must set true if result is NULL */
+ short nargs; /* # arguments actually passed */
+ NullableDatum args[]; /* Arguments passed to function */
+} FunctionCallInfoBaseData;
+typedef FunctionCallInfoBaseData* FunctionCallInfo;
+
+flinfo points to the lookup info used to make the call. Ordinary functions
+will probably ignore this field, but function class handlers will need it
+to find out the OID of the specific function being called.
+
+context is NULL for an "ordinary" function call, but may point to additional
+info when the function is called in certain contexts. (For example, the
+trigger manager will pass information about the current trigger event here.)
+If context is used, it should point to some subtype of Node; the particular
+kind of context is indicated by the node type field. (A callee should
+always check the node type before assuming it knows what kind of context is
+being passed.) fmgr itself puts no other restrictions on the use of this
+field.
+
+resultinfo is NULL when calling any function from which a simple Datum
+result is expected. It may point to some subtype of Node if the function
+returns more than a Datum. (For example, resultinfo is used when calling a
+function that returns a set, as discussed below.) Like the context field,
+resultinfo is a hook for expansion; fmgr itself doesn't constrain the use
+of the field.
+
+fncollation is the input collation derived by the parser, or InvalidOid
+when there are no inputs of collatable types or they don't share a common
+collation. This is effectively a hidden additional argument, which
+collation-sensitive functions can use to determine their behavior.
+
+nargs and args[] hold the arguments being passed to the function.
+Notice that all the arguments passed to a function (as well as its result
+value) will now uniformly be of type Datum. As discussed below, callers
+and callees should apply the standard Datum-to-and-from-whatever macros
+to convert to the actual argument types of a particular function. The
+value in args[i].value is unspecified when args[i].isnull is true.
+
+It is generally the responsibility of the caller to ensure that the
+number of arguments passed matches what the callee is expecting; except
+for callees that take a variable number of arguments, the callee will
+typically ignore the nargs field and just grab values from args[].
+
+The isnull field will be initialized to "false" before the call. On
+return from the function, isnull is the null flag for the function result:
+if it is true the function's result is NULL, regardless of the actual
+function return value. Note that simple "strict" functions can ignore
+both isnull and args[i].isnull, since they won't even get called when there
+are any TRUE values in args[].isnull.
+
+FunctionCallInfo replaces FmgrValues plus a bunch of ad-hoc parameter
+conventions, global variables (fmgr_pl_finfo and CurrentTriggerData at
+least), and other uglinesses.
+
+
+Callees, whether they be individual functions or function handlers,
+shall always have this signature:
+
+Datum function (FunctionCallInfo fcinfo);
+
+which is represented by the typedef
+
+typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);
+
+The function is responsible for setting fcinfo->isnull appropriately
+as well as returning a result represented as a Datum. Note that since
+all callees will now have exactly the same signature, and will be called
+through a function pointer declared with exactly that signature, we
+should have no portability or optimization problems.
+
+
+Function Coding Conventions
+---------------------------
+
+Here are the proposed macros and coding conventions:
+
+The definition of an fmgr-callable function will always look like
+
+Datum
+function_name(PG_FUNCTION_ARGS)
+{
+ ...
+}
+
+"PG_FUNCTION_ARGS" just expands to "FunctionCallInfo fcinfo". The main
+reason for using this macro is to make it easy for scripts to spot function
+definitions. However, if we ever decide to change the calling convention
+again, it might come in handy to have this macro in place.
+
+A nonstrict function is responsible for checking whether each individual
+argument is null or not, which it can do with PG_ARGISNULL(n) (which is
+just "fcinfo->args[n].isnull"). It should avoid trying to fetch the value
+of any argument that is null.
+
+Both strict and nonstrict functions can return NULL, if needed, with
+ PG_RETURN_NULL();
+which expands to
+ { fcinfo->isnull = true; return (Datum) 0; }
+
+Argument values are ordinarily fetched using code like
+ int32 name = PG_GETARG_INT32(number);
+
+For float4, float8, and int8, the PG_GETARG macros will hide whether the
+types are pass-by-value or pass-by-reference. For example, if float8 is
+pass-by-reference then PG_GETARG_FLOAT8 expands to
+ (* (float8 *) DatumGetPointer(fcinfo->args[number].value))
+and would typically be called like this:
+ float8 arg = PG_GETARG_FLOAT8(0);
+For what are now historical reasons, the float-related typedefs and macros
+express the type width in bytes (4 or 8), whereas we prefer to label the
+widths of integer types in bits.
+
+Non-null values are returned with a PG_RETURN_XXX macro of the appropriate
+type. For example, PG_RETURN_INT32 expands to
+ return Int32GetDatum(x)
+PG_RETURN_FLOAT4, PG_RETURN_FLOAT8, and PG_RETURN_INT64 hide whether their
+data types are pass-by-value or pass-by-reference, by doing a palloc if
+needed.
+
+fmgr.h will provide PG_GETARG and PG_RETURN macros for all the basic data
+types. Modules or header files that define specialized SQL datatypes
+(eg, timestamp) should define appropriate macros for those types, so that
+functions manipulating the types can be coded in the standard style.
+
+For non-primitive data types (particularly variable-length types) it won't
+be very practical to hide the pass-by-reference nature of the data type,
+so the PG_GETARG and PG_RETURN macros for those types won't do much more
+than DatumGetPointer/PointerGetDatum plus the appropriate typecast (but see
+TOAST discussion, below). Functions returning such types will need to
+palloc() their result space explicitly. I recommend naming the GETARG and
+RETURN macros for such types to end in "_P", as a reminder that they
+produce or take a pointer. For example, PG_GETARG_TEXT_P yields "text *".
+
+When a function needs to access fcinfo->flinfo or one of the other auxiliary
+fields of FunctionCallInfo, it should just do it. I doubt that providing
+syntactic-sugar macros for these cases is useful.
+
+
+Support for TOAST-Able Data Types
+---------------------------------
+
+For TOAST-able data types, the PG_GETARG macro will deliver a de-TOASTed
+data value. There might be a few cases where the still-toasted value is
+wanted, but the vast majority of cases want the de-toasted result, so
+that will be the default. To get the argument value without causing
+de-toasting, use PG_GETARG_RAW_VARLENA_P(n).
+
+Some functions require a modifiable copy of their input values. In these
+cases, it's silly to do an extra copy step if we copied the data anyway
+to de-TOAST it. Therefore, each toastable datatype has an additional
+fetch macro, for example PG_GETARG_TEXT_P_COPY(n), which delivers a
+guaranteed-fresh copy, combining this with the detoasting step if possible.
+
+There is also a PG_FREE_IF_COPY(ptr,n) macro, which pfree's the given
+pointer if and only if it is different from the original value of the n'th
+argument. This can be used to free the de-toasted value of the n'th
+argument, if it was actually de-toasted. Currently, doing this is not
+necessary for the majority of functions because the core backend code
+releases temporary space periodically, so that memory leaked in function
+execution isn't a big problem. However, as of 7.1 memory leaks in
+functions that are called by index searches will not be cleaned up until
+end of transaction. Therefore, functions that are listed in pg_amop or
+pg_amproc should be careful not to leak detoasted copies, and so these
+functions do need to use PG_FREE_IF_COPY() for toastable inputs.
+
+A function should never try to re-TOAST its result value; it should just
+deliver an untoasted result that's been palloc'd in the current memory
+context. When and if the value is actually stored into a tuple, the
+tuple toaster will decide whether toasting is needed.
+
+
+Functions Accepting or Returning Sets
+-------------------------------------
+
+If a function is marked in pg_proc as returning a set, then it is called
+with fcinfo->resultinfo pointing to a node of type ReturnSetInfo. A
+function that desires to return a set should raise an error "called in
+context that does not accept a set result" if resultinfo is NULL or does
+not point to a ReturnSetInfo node.
+
+There are currently two modes in which a function can return a set result:
+value-per-call, or materialize. In value-per-call mode, the function returns
+one value each time it is called, and finally reports "done" when it has no
+more values to return. In materialize mode, the function's output set is
+instantiated in a Tuplestore object; all the values are returned in one call.
+Additional modes might be added in future.
+
+ReturnSetInfo contains a field "allowedModes" which is set (by the caller)
+to a bitmask that's the OR of the modes the caller can support. The actual
+mode used by the function is returned in another field "returnMode". For
+backwards-compatibility reasons, returnMode is initialized to value-per-call
+and need only be changed if the function wants to use a different mode.
+The function should ereport() if it cannot use any of the modes the caller is
+willing to support.
+
+Value-per-call mode works like this: ReturnSetInfo contains a field
+"isDone", which should be set to one of these values:
+
+ ExprSingleResult /* expression does not return a set */
+ ExprMultipleResult /* this result is an element of a set */
+ ExprEndResult /* there are no more elements in the set */
+
+(the caller will initialize it to ExprSingleResult). If the function simply
+returns a Datum without touching ReturnSetInfo, then the call is over and a
+single-item set has been returned. To return a set, the function must set
+isDone to ExprMultipleResult for each set element. After all elements have
+been returned, the next call should set isDone to ExprEndResult and return a
+null result. (Note it is possible to return an empty set by doing this on
+the first call.)
+
+Value-per-call functions MUST NOT assume that they will be run to completion;
+the executor might simply stop calling them, for example because of a LIMIT.
+Therefore, it's unsafe to attempt to perform any resource cleanup in the
+final call. It's usually not necessary to clean up memory, anyway. If it's
+necessary to clean up other types of resources, such as file descriptors,
+one can register a shutdown callback function in the ExprContext pointed to
+by the ReturnSetInfo node. (But note that file descriptors are a limited
+resource, so it's generally unwise to hold those open across calls; SRFs
+that need file access are better written to do it in a single call using
+Materialize mode.)
+
+Materialize mode works like this: the function creates a Tuplestore holding
+the (possibly empty) result set, and returns it. There are no multiple calls.
+The function must also return a TupleDesc that indicates the tuple structure.
+The Tuplestore and TupleDesc should be created in the context
+econtext->ecxt_per_query_memory (note this will *not* be the context the
+function is called in). The function stores pointers to the Tuplestore and
+TupleDesc into ReturnSetInfo, sets returnMode to indicate materialize mode,
+and returns null. isDone is not used and should be left at ExprSingleResult.
+
+The Tuplestore must be created with randomAccess = true if
+SFRM_Materialize_Random is set in allowedModes, but it can (and preferably
+should) be created with randomAccess = false if not. Callers that can support
+both ValuePerCall and Materialize mode will set SFRM_Materialize_Preferred,
+or not, depending on which mode they prefer.
+
+If available, the expected tuple descriptor is passed in ReturnSetInfo;
+in other contexts the expectedDesc field will be NULL. The function need
+not pay attention to expectedDesc, but it may be useful in special cases.
+
+InitMaterializedSRF() is a helper function able to setup the function's
+ReturnSetInfo for a single call, filling in the Tuplestore and the
+TupleDesc with the proper configuration for Materialize mode.
+
+There is no support for functions accepting sets; instead, the function will
+be called multiple times, once for each element of the input set.
+
+
+Notes About Function Handlers
+-----------------------------
+
+Handlers for classes of functions should find life much easier and
+cleaner in this design. The OID of the called function is directly
+reachable from the passed parameters; we don't need the global variable
+fmgr_pl_finfo anymore. Also, by modifying fcinfo->flinfo->fn_extra,
+the handler can cache lookup info to avoid repeat lookups when the same
+function is invoked many times. (fn_extra can only be used as a hint,
+since callers are not required to re-use an FmgrInfo struct.
+But in performance-critical paths they normally will do so.)
+
+If the handler wants to allocate memory to hold fn_extra data, it should
+NOT do so in CurrentMemoryContext, since the current context may well be
+much shorter-lived than the context where the FmgrInfo is. Instead,
+allocate the memory in context flinfo->fn_mcxt, or in a long-lived cache
+context. fn_mcxt normally points at the context that was
+CurrentMemoryContext at the time the FmgrInfo structure was created;
+in any case it is required to be a context at least as long-lived as the
+FmgrInfo itself.
diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c
new file mode 100644
index 0000000..7f9ea97
--- /dev/null
+++ b/src/backend/utils/fmgr/dfmgr.c
@@ -0,0 +1,700 @@
+/*-------------------------------------------------------------------------
+ *
+ * dfmgr.c
+ * Dynamic function manager code.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/fmgr/dfmgr.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/stat.h>
+
+#ifdef HAVE_DLOPEN
+#include <dlfcn.h>
+
+/*
+ * On macOS, <dlfcn.h> insists on including <stdbool.h>. If we're not
+ * using stdbool, undef bool to undo the damage.
+ */
+#ifndef PG_USE_STDBOOL
+#ifdef bool
+#undef bool
+#endif
+#endif
+#endif /* HAVE_DLOPEN */
+
+#include "fmgr.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "storage/shmem.h"
+#include "utils/hsearch.h"
+
+
+/* signature for PostgreSQL-specific library init function */
+typedef void (*PG_init_t) (void);
+
+/* hashtable entry for rendezvous variables */
+typedef struct
+{
+ char varName[NAMEDATALEN]; /* hash key (must be first) */
+ void *varValue;
+} rendezvousHashEntry;
+
+/*
+ * List of dynamically loaded files (kept in malloc'd memory).
+ */
+
+typedef struct df_files
+{
+ struct df_files *next; /* List link */
+ dev_t device; /* Device file is on */
+#ifndef WIN32 /* ensures we never again depend on this under
+ * win32 */
+ ino_t inode; /* Inode number of file */
+#endif
+ void *handle; /* a handle for pg_dl* functions */
+ char filename[FLEXIBLE_ARRAY_MEMBER]; /* Full pathname of file */
+} DynamicFileList;
+
+static DynamicFileList *file_list = NULL;
+static DynamicFileList *file_tail = NULL;
+
+/* stat() call under Win32 returns an st_ino field, but it has no meaning */
+#ifndef WIN32
+#define SAME_INODE(A,B) ((A).st_ino == (B).inode && (A).st_dev == (B).device)
+#else
+#define SAME_INODE(A,B) false
+#endif
+
+char *Dynamic_library_path;
+
+static void *internal_load_library(const char *libname);
+static void incompatible_module_error(const char *libname,
+ const Pg_magic_struct *module_magic_data) pg_attribute_noreturn();
+static bool file_exists(const char *name);
+static char *expand_dynamic_library_name(const char *name);
+static void check_restricted_library_name(const char *name);
+static char *substitute_libpath_macro(const char *name);
+static char *find_in_dynamic_libpath(const char *basename);
+
+/* Magic structure that module needs to match to be accepted */
+static const Pg_magic_struct magic_data = PG_MODULE_MAGIC_DATA;
+
+
+/*
+ * Load the specified dynamic-link library file, and look for a function
+ * named funcname in it.
+ *
+ * If the function is not found, we raise an error if signalNotFound is true,
+ * else return NULL. Note that errors in loading the library
+ * will provoke ereport() regardless of signalNotFound.
+ *
+ * If filehandle is not NULL, then *filehandle will be set to a handle
+ * identifying the library file. The filehandle can be used with
+ * lookup_external_function to lookup additional functions in the same file
+ * at less cost than repeating load_external_function.
+ */
+void *
+load_external_function(const char *filename, const char *funcname,
+ bool signalNotFound, void **filehandle)
+{
+ char *fullname;
+ void *lib_handle;
+ void *retval;
+
+ /* Expand the possibly-abbreviated filename to an exact path name */
+ fullname = expand_dynamic_library_name(filename);
+
+ /* Load the shared library, unless we already did */
+ lib_handle = internal_load_library(fullname);
+
+ /* Return handle if caller wants it */
+ if (filehandle)
+ *filehandle = lib_handle;
+
+ /* Look up the function within the library. */
+ retval = dlsym(lib_handle, funcname);
+
+ if (retval == NULL && signalNotFound)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not find function \"%s\" in file \"%s\"",
+ funcname, fullname)));
+
+ pfree(fullname);
+ return retval;
+}
+
+/*
+ * This function loads a shlib file without looking up any particular
+ * function in it. If the same shlib has previously been loaded,
+ * unload and reload it.
+ *
+ * When 'restricted' is true, only libraries in the presumed-secure
+ * directory $libdir/plugins may be referenced.
+ */
+void
+load_file(const char *filename, bool restricted)
+{
+ char *fullname;
+
+ /* Apply security restriction if requested */
+ if (restricted)
+ check_restricted_library_name(filename);
+
+ /* Expand the possibly-abbreviated filename to an exact path name */
+ fullname = expand_dynamic_library_name(filename);
+
+ /* Load the shared library */
+ (void) internal_load_library(fullname);
+
+ pfree(fullname);
+}
+
+/*
+ * Lookup a function whose library file is already loaded.
+ * Return NULL if not found.
+ */
+void *
+lookup_external_function(void *filehandle, const char *funcname)
+{
+ return dlsym(filehandle, funcname);
+}
+
+
+/*
+ * Load the specified dynamic-link library file, unless it already is
+ * loaded. Return the pg_dl* handle for the file.
+ *
+ * Note: libname is expected to be an exact name for the library file.
+ *
+ * NB: There is presently no way to unload a dynamically loaded file. We might
+ * add one someday if we can convince ourselves we have safe protocols for un-
+ * hooking from hook function pointers, releasing custom GUC variables, and
+ * perhaps other things that are definitely unsafe currently.
+ */
+static void *
+internal_load_library(const char *libname)
+{
+ DynamicFileList *file_scanner;
+ PGModuleMagicFunction magic_func;
+ char *load_error;
+ struct stat stat_buf;
+ PG_init_t PG_init;
+
+ /*
+ * Scan the list of loaded FILES to see if the file has been loaded.
+ */
+ for (file_scanner = file_list;
+ file_scanner != NULL &&
+ strcmp(libname, file_scanner->filename) != 0;
+ file_scanner = file_scanner->next)
+ ;
+
+ if (file_scanner == NULL)
+ {
+ /*
+ * Check for same files - different paths (ie, symlink or link)
+ */
+ if (stat(libname, &stat_buf) == -1)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not access file \"%s\": %m",
+ libname)));
+
+ for (file_scanner = file_list;
+ file_scanner != NULL &&
+ !SAME_INODE(stat_buf, *file_scanner);
+ file_scanner = file_scanner->next)
+ ;
+ }
+
+ if (file_scanner == NULL)
+ {
+ /*
+ * File not loaded yet.
+ */
+ file_scanner = (DynamicFileList *)
+ malloc(offsetof(DynamicFileList, filename) + strlen(libname) + 1);
+ if (file_scanner == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+
+ MemSet(file_scanner, 0, offsetof(DynamicFileList, filename));
+ strcpy(file_scanner->filename, libname);
+ file_scanner->device = stat_buf.st_dev;
+#ifndef WIN32
+ file_scanner->inode = stat_buf.st_ino;
+#endif
+ file_scanner->next = NULL;
+
+ file_scanner->handle = dlopen(file_scanner->filename, RTLD_NOW | RTLD_GLOBAL);
+ if (file_scanner->handle == NULL)
+ {
+ load_error = dlerror();
+ free((char *) file_scanner);
+ /* errcode_for_file_access might not be appropriate here? */
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not load library \"%s\": %s",
+ libname, load_error)));
+ }
+
+ /* Check the magic function to determine compatibility */
+ magic_func = (PGModuleMagicFunction)
+ dlsym(file_scanner->handle, PG_MAGIC_FUNCTION_NAME_STRING);
+ if (magic_func)
+ {
+ const Pg_magic_struct *magic_data_ptr = (*magic_func) ();
+
+ if (magic_data_ptr->len != magic_data.len ||
+ memcmp(magic_data_ptr, &magic_data, magic_data.len) != 0)
+ {
+ /* copy data block before unlinking library */
+ Pg_magic_struct module_magic_data = *magic_data_ptr;
+
+ /* try to close library */
+ dlclose(file_scanner->handle);
+ free((char *) file_scanner);
+
+ /* issue suitable complaint */
+ incompatible_module_error(libname, &module_magic_data);
+ }
+ }
+ else
+ {
+ /* try to close library */
+ dlclose(file_scanner->handle);
+ free((char *) file_scanner);
+ /* complain */
+ ereport(ERROR,
+ (errmsg("incompatible library \"%s\": missing magic block",
+ libname),
+ errhint("Extension libraries are required to use the PG_MODULE_MAGIC macro.")));
+ }
+
+ /*
+ * If the library has a _PG_init() function, call it.
+ */
+ PG_init = (PG_init_t) dlsym(file_scanner->handle, "_PG_init");
+ if (PG_init)
+ (*PG_init) ();
+
+ /* OK to link it into list */
+ if (file_list == NULL)
+ file_list = file_scanner;
+ else
+ file_tail->next = file_scanner;
+ file_tail = file_scanner;
+ }
+
+ return file_scanner->handle;
+}
+
+/*
+ * Report a suitable error for an incompatible magic block.
+ */
+static void
+incompatible_module_error(const char *libname,
+ const Pg_magic_struct *module_magic_data)
+{
+ StringInfoData details;
+
+ /*
+ * If the version doesn't match, just report that, because the rest of the
+ * block might not even have the fields we expect.
+ */
+ if (magic_data.version != module_magic_data->version)
+ {
+ char library_version[32];
+
+ if (module_magic_data->version >= 1000)
+ snprintf(library_version, sizeof(library_version), "%d",
+ module_magic_data->version / 100);
+ else
+ snprintf(library_version, sizeof(library_version), "%d.%d",
+ module_magic_data->version / 100,
+ module_magic_data->version % 100);
+ ereport(ERROR,
+ (errmsg("incompatible library \"%s\": version mismatch",
+ libname),
+ errdetail("Server is version %d, library is version %s.",
+ magic_data.version / 100, library_version)));
+ }
+
+ /*
+ * Similarly, if the ABI extra field doesn't match, error out. Other
+ * fields below might also mismatch, but that isn't useful information if
+ * you're using the wrong product altogether.
+ */
+ if (strcmp(module_magic_data->abi_extra, magic_data.abi_extra) != 0)
+ {
+ ereport(ERROR,
+ (errmsg("incompatible library \"%s\": ABI mismatch",
+ libname),
+ errdetail("Server has ABI \"%s\", library has \"%s\".",
+ magic_data.abi_extra,
+ module_magic_data->abi_extra)));
+ }
+
+ /*
+ * Otherwise, spell out which fields don't agree.
+ *
+ * XXX this code has to be adjusted any time the set of fields in a magic
+ * block change!
+ */
+ initStringInfo(&details);
+
+ if (module_magic_data->funcmaxargs != magic_data.funcmaxargs)
+ {
+ if (details.len)
+ appendStringInfoChar(&details, '\n');
+ appendStringInfo(&details,
+ _("Server has FUNC_MAX_ARGS = %d, library has %d."),
+ magic_data.funcmaxargs,
+ module_magic_data->funcmaxargs);
+ }
+ if (module_magic_data->indexmaxkeys != magic_data.indexmaxkeys)
+ {
+ if (details.len)
+ appendStringInfoChar(&details, '\n');
+ appendStringInfo(&details,
+ _("Server has INDEX_MAX_KEYS = %d, library has %d."),
+ magic_data.indexmaxkeys,
+ module_magic_data->indexmaxkeys);
+ }
+ if (module_magic_data->namedatalen != magic_data.namedatalen)
+ {
+ if (details.len)
+ appendStringInfoChar(&details, '\n');
+ appendStringInfo(&details,
+ _("Server has NAMEDATALEN = %d, library has %d."),
+ magic_data.namedatalen,
+ module_magic_data->namedatalen);
+ }
+ if (module_magic_data->float8byval != magic_data.float8byval)
+ {
+ if (details.len)
+ appendStringInfoChar(&details, '\n');
+ appendStringInfo(&details,
+ _("Server has FLOAT8PASSBYVAL = %s, library has %s."),
+ magic_data.float8byval ? "true" : "false",
+ module_magic_data->float8byval ? "true" : "false");
+ }
+
+ if (details.len == 0)
+ appendStringInfoString(&details,
+ _("Magic block has unexpected length or padding difference."));
+
+ ereport(ERROR,
+ (errmsg("incompatible library \"%s\": magic block mismatch",
+ libname),
+ errdetail_internal("%s", details.data)));
+}
+
+static bool
+file_exists(const char *name)
+{
+ struct stat st;
+
+ AssertArg(name != NULL);
+
+ if (stat(name, &st) == 0)
+ return !S_ISDIR(st.st_mode);
+ else if (!(errno == ENOENT || errno == ENOTDIR || errno == EACCES))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not access file \"%s\": %m", name)));
+
+ return false;
+}
+
+
+/*
+ * If name contains a slash, check if the file exists, if so return
+ * the name. Else (no slash) try to expand using search path (see
+ * find_in_dynamic_libpath below); if that works, return the fully
+ * expanded file name. If the previous failed, append DLSUFFIX and
+ * try again. If all fails, just return the original name.
+ *
+ * The result will always be freshly palloc'd.
+ */
+static char *
+expand_dynamic_library_name(const char *name)
+{
+ bool have_slash;
+ char *new;
+ char *full;
+
+ AssertArg(name);
+
+ have_slash = (first_dir_separator(name) != NULL);
+
+ if (!have_slash)
+ {
+ full = find_in_dynamic_libpath(name);
+ if (full)
+ return full;
+ }
+ else
+ {
+ full = substitute_libpath_macro(name);
+ if (file_exists(full))
+ return full;
+ pfree(full);
+ }
+
+ new = psprintf("%s%s", name, DLSUFFIX);
+
+ if (!have_slash)
+ {
+ full = find_in_dynamic_libpath(new);
+ pfree(new);
+ if (full)
+ return full;
+ }
+ else
+ {
+ full = substitute_libpath_macro(new);
+ pfree(new);
+ if (file_exists(full))
+ return full;
+ pfree(full);
+ }
+
+ /*
+ * If we can't find the file, just return the string as-is. The ensuing
+ * load attempt will fail and report a suitable message.
+ */
+ return pstrdup(name);
+}
+
+/*
+ * Check a restricted library name. It must begin with "$libdir/plugins/"
+ * and there must not be any directory separators after that (this is
+ * sufficient to prevent ".." style attacks).
+ */
+static void
+check_restricted_library_name(const char *name)
+{
+ if (strncmp(name, "$libdir/plugins/", 16) != 0 ||
+ first_dir_separator(name + 16) != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("access to library \"%s\" is not allowed",
+ name)));
+}
+
+/*
+ * Substitute for any macros appearing in the given string.
+ * Result is always freshly palloc'd.
+ */
+static char *
+substitute_libpath_macro(const char *name)
+{
+ const char *sep_ptr;
+
+ AssertArg(name != NULL);
+
+ /* Currently, we only recognize $libdir at the start of the string */
+ if (name[0] != '$')
+ return pstrdup(name);
+
+ if ((sep_ptr = first_dir_separator(name)) == NULL)
+ sep_ptr = name + strlen(name);
+
+ if (strlen("$libdir") != sep_ptr - name ||
+ strncmp(name, "$libdir", strlen("$libdir")) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid macro name in dynamic library path: %s",
+ name)));
+
+ return psprintf("%s%s", pkglib_path, sep_ptr);
+}
+
+
+/*
+ * Search for a file called 'basename' in the colon-separated search
+ * path Dynamic_library_path. If the file is found, the full file name
+ * is returned in freshly palloc'd memory. If the file is not found,
+ * return NULL.
+ */
+static char *
+find_in_dynamic_libpath(const char *basename)
+{
+ const char *p;
+ size_t baselen;
+
+ AssertArg(basename != NULL);
+ AssertArg(first_dir_separator(basename) == NULL);
+ AssertState(Dynamic_library_path != NULL);
+
+ p = Dynamic_library_path;
+ if (strlen(p) == 0)
+ return NULL;
+
+ baselen = strlen(basename);
+
+ for (;;)
+ {
+ size_t len;
+ char *piece;
+ char *mangled;
+ char *full;
+
+ piece = first_path_var_separator(p);
+ if (piece == p)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("zero-length component in parameter \"dynamic_library_path\"")));
+
+ if (piece == NULL)
+ len = strlen(p);
+ else
+ len = piece - p;
+
+ piece = palloc(len + 1);
+ strlcpy(piece, p, len + 1);
+
+ mangled = substitute_libpath_macro(piece);
+ pfree(piece);
+
+ canonicalize_path(mangled);
+
+ /* only absolute paths */
+ if (!is_absolute_path(mangled))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("component in parameter \"dynamic_library_path\" is not an absolute path")));
+
+ full = palloc(strlen(mangled) + 1 + baselen + 1);
+ sprintf(full, "%s/%s", mangled, basename);
+ pfree(mangled);
+
+ elog(DEBUG3, "find_in_dynamic_libpath: trying \"%s\"", full);
+
+ if (file_exists(full))
+ return full;
+
+ pfree(full);
+
+ if (p[len] == '\0')
+ break;
+ else
+ p += len + 1;
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Find (or create) a rendezvous variable that one dynamically
+ * loaded library can use to meet up with another.
+ *
+ * On the first call of this function for a particular varName,
+ * a "rendezvous variable" is created with the given name.
+ * The value of the variable is a void pointer (initially set to NULL).
+ * Subsequent calls with the same varName just return the address of
+ * the existing variable. Once created, a rendezvous variable lasts
+ * for the life of the process.
+ *
+ * Dynamically loaded libraries can use rendezvous variables
+ * to find each other and share information: they just need to agree
+ * on the variable name and the data it will point to.
+ */
+void **
+find_rendezvous_variable(const char *varName)
+{
+ static HTAB *rendezvousHash = NULL;
+
+ rendezvousHashEntry *hentry;
+ bool found;
+
+ /* Create a hashtable if we haven't already done so in this process */
+ if (rendezvousHash == NULL)
+ {
+ HASHCTL ctl;
+
+ ctl.keysize = NAMEDATALEN;
+ ctl.entrysize = sizeof(rendezvousHashEntry);
+ rendezvousHash = hash_create("Rendezvous variable hash",
+ 16,
+ &ctl,
+ HASH_ELEM | HASH_STRINGS);
+ }
+
+ /* Find or create the hashtable entry for this varName */
+ hentry = (rendezvousHashEntry *) hash_search(rendezvousHash,
+ varName,
+ HASH_ENTER,
+ &found);
+
+ /* Initialize to NULL if first time */
+ if (!found)
+ hentry->varValue = NULL;
+
+ return &hentry->varValue;
+}
+
+/*
+ * Estimate the amount of space needed to serialize the list of libraries
+ * we have loaded.
+ */
+Size
+EstimateLibraryStateSpace(void)
+{
+ DynamicFileList *file_scanner;
+ Size size = 1;
+
+ for (file_scanner = file_list;
+ file_scanner != NULL;
+ file_scanner = file_scanner->next)
+ size = add_size(size, strlen(file_scanner->filename) + 1);
+
+ return size;
+}
+
+/*
+ * Serialize the list of libraries we have loaded to a chunk of memory.
+ */
+void
+SerializeLibraryState(Size maxsize, char *start_address)
+{
+ DynamicFileList *file_scanner;
+
+ for (file_scanner = file_list;
+ file_scanner != NULL;
+ file_scanner = file_scanner->next)
+ {
+ Size len;
+
+ len = strlcpy(start_address, file_scanner->filename, maxsize) + 1;
+ Assert(len < maxsize);
+ maxsize -= len;
+ start_address += len;
+ }
+ start_address[0] = '\0';
+}
+
+/*
+ * Load every library the serializing backend had loaded.
+ */
+void
+RestoreLibraryState(char *start_address)
+{
+ while (*start_address != '\0')
+ {
+ internal_load_library(start_address);
+ start_address += strlen(start_address) + 1;
+ }
+}
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
new file mode 100644
index 0000000..a9dd068
--- /dev/null
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -0,0 +1,2076 @@
+/*-------------------------------------------------------------------------
+ *
+ * fmgr.c
+ * The Postgres function manager.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/fmgr/fmgr.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/detoast.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
+#include "executor/functions.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "pgstat.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/fmgrtab.h"
+#include "utils/guc.h"
+#include "utils/lsyscache.h"
+#include "utils/syscache.h"
+
+/*
+ * Hooks for function calls
+ */
+PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook = NULL;
+PGDLLIMPORT fmgr_hook_type fmgr_hook = NULL;
+
+/*
+ * Hashtable for fast lookup of external C functions
+ */
+typedef struct
+{
+ /* fn_oid is the hash key and so must be first! */
+ Oid fn_oid; /* OID of an external C function */
+ TransactionId fn_xmin; /* for checking up-to-dateness */
+ ItemPointerData fn_tid;
+ PGFunction user_fn; /* the function's address */
+ const Pg_finfo_record *inforec; /* address of its info record */
+} CFuncHashTabEntry;
+
+static HTAB *CFuncHash = NULL;
+
+
+static void fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,
+ bool ignore_security);
+static void fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple);
+static void fmgr_info_other_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple);
+static CFuncHashTabEntry *lookup_C_func(HeapTuple procedureTuple);
+static void record_C_func(HeapTuple procedureTuple,
+ PGFunction user_fn, const Pg_finfo_record *inforec);
+
+/* extern so it's callable via JIT */
+extern Datum fmgr_security_definer(PG_FUNCTION_ARGS);
+
+
+/*
+ * Lookup routines for builtin-function table. We can search by either Oid
+ * or name, but search by Oid is much faster.
+ */
+
+static const FmgrBuiltin *
+fmgr_isbuiltin(Oid id)
+{
+ uint16 index;
+
+ /* fast lookup only possible if original oid still assigned */
+ if (id > fmgr_last_builtin_oid)
+ return NULL;
+
+ /*
+ * Lookup function data. If there's a miss in that range it's likely a
+ * nonexistent function, returning NULL here will trigger an ERROR later.
+ */
+ index = fmgr_builtin_oid_index[id];
+ if (index == InvalidOidBuiltinMapping)
+ return NULL;
+
+ return &fmgr_builtins[index];
+}
+
+/*
+ * Lookup a builtin by name. Note there can be more than one entry in
+ * the array with the same name, but they should all point to the same
+ * routine.
+ */
+static const FmgrBuiltin *
+fmgr_lookupByName(const char *name)
+{
+ int i;
+
+ for (i = 0; i < fmgr_nbuiltins; i++)
+ {
+ if (strcmp(name, fmgr_builtins[i].funcName) == 0)
+ return fmgr_builtins + i;
+ }
+ return NULL;
+}
+
+/*
+ * This routine fills a FmgrInfo struct, given the OID
+ * of the function to be called.
+ *
+ * The caller's CurrentMemoryContext is used as the fn_mcxt of the info
+ * struct; this means that any subsidiary data attached to the info struct
+ * (either by fmgr_info itself, or later on by a function call handler)
+ * will be allocated in that context. The caller must ensure that this
+ * context is at least as long-lived as the info struct itself. This is
+ * not a problem in typical cases where the info struct is on the stack or
+ * in freshly-palloc'd space. However, if one intends to store an info
+ * struct in a long-lived table, it's better to use fmgr_info_cxt.
+ */
+void
+fmgr_info(Oid functionId, FmgrInfo *finfo)
+{
+ fmgr_info_cxt_security(functionId, finfo, CurrentMemoryContext, false);
+}
+
+/*
+ * Fill a FmgrInfo struct, specifying a memory context in which its
+ * subsidiary data should go.
+ */
+void
+fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
+{
+ fmgr_info_cxt_security(functionId, finfo, mcxt, false);
+}
+
+/*
+ * This one does the actual work. ignore_security is ordinarily false
+ * but is set to true when we need to avoid recursion.
+ */
+static void
+fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,
+ bool ignore_security)
+{
+ const FmgrBuiltin *fbp;
+ HeapTuple procedureTuple;
+ Form_pg_proc procedureStruct;
+ Datum prosrcdatum;
+ bool isnull;
+ char *prosrc;
+
+ /*
+ * fn_oid *must* be filled in last. Some code assumes that if fn_oid is
+ * valid, the whole struct is valid. Some FmgrInfo struct's do survive
+ * elogs.
+ */
+ finfo->fn_oid = InvalidOid;
+ finfo->fn_extra = NULL;
+ finfo->fn_mcxt = mcxt;
+ finfo->fn_expr = NULL; /* caller may set this later */
+
+ if ((fbp = fmgr_isbuiltin(functionId)) != NULL)
+ {
+ /*
+ * Fast path for builtin functions: don't bother consulting pg_proc
+ */
+ finfo->fn_nargs = fbp->nargs;
+ finfo->fn_strict = fbp->strict;
+ finfo->fn_retset = fbp->retset;
+ finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
+ finfo->fn_addr = fbp->func;
+ finfo->fn_oid = functionId;
+ return;
+ }
+
+ /* Otherwise we need the pg_proc entry */
+ procedureTuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(functionId));
+ if (!HeapTupleIsValid(procedureTuple))
+ elog(ERROR, "cache lookup failed for function %u", functionId);
+ procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);
+
+ finfo->fn_nargs = procedureStruct->pronargs;
+ finfo->fn_strict = procedureStruct->proisstrict;
+ finfo->fn_retset = procedureStruct->proretset;
+
+ /*
+ * If it has prosecdef set, non-null proconfig, or if a plugin wants to
+ * hook function entry/exit, use fmgr_security_definer call handler ---
+ * unless we are being called again by fmgr_security_definer or
+ * fmgr_info_other_lang.
+ *
+ * When using fmgr_security_definer, function stats tracking is always
+ * disabled at the outer level, and instead we set the flag properly in
+ * fmgr_security_definer's private flinfo and implement the tracking
+ * inside fmgr_security_definer. This loses the ability to charge the
+ * overhead of fmgr_security_definer to the function, but gains the
+ * ability to set the track_functions GUC as a local GUC parameter of an
+ * interesting function and have the right things happen.
+ */
+ if (!ignore_security &&
+ (procedureStruct->prosecdef ||
+ !heap_attisnull(procedureTuple, Anum_pg_proc_proconfig, NULL) ||
+ FmgrHookIsNeeded(functionId)))
+ {
+ finfo->fn_addr = fmgr_security_definer;
+ finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
+ finfo->fn_oid = functionId;
+ ReleaseSysCache(procedureTuple);
+ return;
+ }
+
+ switch (procedureStruct->prolang)
+ {
+ case INTERNALlanguageId:
+
+ /*
+ * For an ordinary builtin function, we should never get here
+ * because the fmgr_isbuiltin() search above will have succeeded.
+ * However, if the user has done a CREATE FUNCTION to create an
+ * alias for a builtin function, we can end up here. In that case
+ * we have to look up the function by name. The name of the
+ * internal function is stored in prosrc (it doesn't have to be
+ * the same as the name of the alias!)
+ */
+ prosrcdatum = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_prosrc, &isnull);
+ if (isnull)
+ elog(ERROR, "null prosrc");
+ prosrc = TextDatumGetCString(prosrcdatum);
+ fbp = fmgr_lookupByName(prosrc);
+ if (fbp == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("internal function \"%s\" is not in internal lookup table",
+ prosrc)));
+ pfree(prosrc);
+ /* Should we check that nargs, strict, retset match the table? */
+ finfo->fn_addr = fbp->func;
+ /* note this policy is also assumed in fast path above */
+ finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
+ break;
+
+ case ClanguageId:
+ fmgr_info_C_lang(functionId, finfo, procedureTuple);
+ finfo->fn_stats = TRACK_FUNC_PL; /* ie, track if ALL */
+ break;
+
+ case SQLlanguageId:
+ finfo->fn_addr = fmgr_sql;
+ finfo->fn_stats = TRACK_FUNC_PL; /* ie, track if ALL */
+ break;
+
+ default:
+ fmgr_info_other_lang(functionId, finfo, procedureTuple);
+ finfo->fn_stats = TRACK_FUNC_OFF; /* ie, track if not OFF */
+ break;
+ }
+
+ finfo->fn_oid = functionId;
+ ReleaseSysCache(procedureTuple);
+}
+
+/*
+ * Return module and C function name providing implementation of functionId.
+ *
+ * If *mod == NULL and *fn == NULL, no C symbol is known to implement
+ * function.
+ *
+ * If *mod == NULL and *fn != NULL, the function is implemented by a symbol in
+ * the main binary.
+ *
+ * If *mod != NULL and *fn != NULL the function is implemented in an extension
+ * shared object.
+ *
+ * The returned module and function names are pstrdup'ed into the current
+ * memory context.
+ */
+void
+fmgr_symbol(Oid functionId, char **mod, char **fn)
+{
+ HeapTuple procedureTuple;
+ Form_pg_proc procedureStruct;
+ bool isnull;
+ Datum prosrcattr;
+ Datum probinattr;
+
+ procedureTuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(functionId));
+ if (!HeapTupleIsValid(procedureTuple))
+ elog(ERROR, "cache lookup failed for function %u", functionId);
+ procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);
+
+ if (procedureStruct->prosecdef ||
+ !heap_attisnull(procedureTuple, Anum_pg_proc_proconfig, NULL) ||
+ FmgrHookIsNeeded(functionId))
+ {
+ *mod = NULL; /* core binary */
+ *fn = pstrdup("fmgr_security_definer");
+ ReleaseSysCache(procedureTuple);
+ return;
+ }
+
+ /* see fmgr_info_cxt_security for the individual cases */
+ switch (procedureStruct->prolang)
+ {
+ case INTERNALlanguageId:
+ prosrcattr = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_prosrc, &isnull);
+ if (isnull)
+ elog(ERROR, "null prosrc");
+
+ *mod = NULL; /* core binary */
+ *fn = TextDatumGetCString(prosrcattr);
+ break;
+
+ case ClanguageId:
+ prosrcattr = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_prosrc, &isnull);
+ if (isnull)
+ elog(ERROR, "null prosrc for C function %u", functionId);
+
+ probinattr = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_probin, &isnull);
+ if (isnull)
+ elog(ERROR, "null probin for C function %u", functionId);
+
+ /*
+ * No need to check symbol presence / API version here, already
+ * checked in fmgr_info_cxt_security.
+ */
+ *mod = TextDatumGetCString(probinattr);
+ *fn = TextDatumGetCString(prosrcattr);
+ break;
+
+ case SQLlanguageId:
+ *mod = NULL; /* core binary */
+ *fn = pstrdup("fmgr_sql");
+ break;
+
+ default:
+ *mod = NULL;
+ *fn = NULL; /* unknown, pass pointer */
+ break;
+ }
+
+ ReleaseSysCache(procedureTuple);
+}
+
+
+/*
+ * Special fmgr_info processing for C-language functions. Note that
+ * finfo->fn_oid is not valid yet.
+ */
+static void
+fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
+{
+ CFuncHashTabEntry *hashentry;
+ PGFunction user_fn;
+ const Pg_finfo_record *inforec;
+ bool isnull;
+
+ /*
+ * See if we have the function address cached already
+ */
+ hashentry = lookup_C_func(procedureTuple);
+ if (hashentry)
+ {
+ user_fn = hashentry->user_fn;
+ inforec = hashentry->inforec;
+ }
+ else
+ {
+ Datum prosrcattr,
+ probinattr;
+ char *prosrcstring,
+ *probinstring;
+ void *libraryhandle;
+
+ /*
+ * Get prosrc and probin strings (link symbol and library filename).
+ * While in general these columns might be null, that's not allowed
+ * for C-language functions.
+ */
+ prosrcattr = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_prosrc, &isnull);
+ if (isnull)
+ elog(ERROR, "null prosrc for C function %u", functionId);
+ prosrcstring = TextDatumGetCString(prosrcattr);
+
+ probinattr = SysCacheGetAttr(PROCOID, procedureTuple,
+ Anum_pg_proc_probin, &isnull);
+ if (isnull)
+ elog(ERROR, "null probin for C function %u", functionId);
+ probinstring = TextDatumGetCString(probinattr);
+
+ /* Look up the function itself */
+ user_fn = load_external_function(probinstring, prosrcstring, true,
+ &libraryhandle);
+
+ /* Get the function information record (real or default) */
+ inforec = fetch_finfo_record(libraryhandle, prosrcstring);
+
+ /* Cache the addresses for later calls */
+ record_C_func(procedureTuple, user_fn, inforec);
+
+ pfree(prosrcstring);
+ pfree(probinstring);
+ }
+
+ switch (inforec->api_version)
+ {
+ case 1:
+ /* New style: call directly */
+ finfo->fn_addr = user_fn;
+ break;
+ default:
+ /* Shouldn't get here if fetch_finfo_record did its job */
+ elog(ERROR, "unrecognized function API version: %d",
+ inforec->api_version);
+ break;
+ }
+}
+
+/*
+ * Special fmgr_info processing for other-language functions. Note
+ * that finfo->fn_oid is not valid yet.
+ */
+static void
+fmgr_info_other_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
+{
+ Form_pg_proc procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);
+ Oid language = procedureStruct->prolang;
+ HeapTuple languageTuple;
+ Form_pg_language languageStruct;
+ FmgrInfo plfinfo;
+
+ languageTuple = SearchSysCache1(LANGOID, ObjectIdGetDatum(language));
+ if (!HeapTupleIsValid(languageTuple))
+ elog(ERROR, "cache lookup failed for language %u", language);
+ languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
+
+ /*
+ * Look up the language's call handler function, ignoring any attributes
+ * that would normally cause insertion of fmgr_security_definer. We need
+ * to get back a bare pointer to the actual C-language function.
+ */
+ fmgr_info_cxt_security(languageStruct->lanplcallfoid, &plfinfo,
+ CurrentMemoryContext, true);
+ finfo->fn_addr = plfinfo.fn_addr;
+
+ ReleaseSysCache(languageTuple);
+}
+
+/*
+ * Fetch and validate the information record for the given external function.
+ * The function is specified by a handle for the containing library
+ * (obtained from load_external_function) as well as the function name.
+ *
+ * If no info function exists for the given name an error is raised.
+ *
+ * This function is broken out of fmgr_info_C_lang so that fmgr_c_validator
+ * can validate the information record for a function not yet entered into
+ * pg_proc.
+ */
+const Pg_finfo_record *
+fetch_finfo_record(void *filehandle, const char *funcname)
+{
+ char *infofuncname;
+ PGFInfoFunction infofunc;
+ const Pg_finfo_record *inforec;
+
+ infofuncname = psprintf("pg_finfo_%s", funcname);
+
+ /* Try to look up the info function */
+ infofunc = (PGFInfoFunction) lookup_external_function(filehandle,
+ infofuncname);
+ if (infofunc == NULL)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not find function information for function \"%s\"",
+ funcname),
+ errhint("SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname).")));
+ return NULL; /* silence compiler */
+ }
+
+ /* Found, so call it */
+ inforec = (*infofunc) ();
+
+ /* Validate result as best we can */
+ if (inforec == NULL)
+ elog(ERROR, "null result from info function \"%s\"", infofuncname);
+ switch (inforec->api_version)
+ {
+ case 1:
+ /* OK, no additional fields to validate */
+ break;
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized API version %d reported by info function \"%s\"",
+ inforec->api_version, infofuncname)));
+ break;
+ }
+
+ pfree(infofuncname);
+ return inforec;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Routines for caching lookup information for external C functions.
+ *
+ * The routines in dfmgr.c are relatively slow, so we try to avoid running
+ * them more than once per external function per session. We use a hash table
+ * with the function OID as the lookup key.
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * lookup_C_func: try to find a C function in the hash table
+ *
+ * If an entry exists and is up to date, return it; else return NULL
+ */
+static CFuncHashTabEntry *
+lookup_C_func(HeapTuple procedureTuple)
+{
+ Oid fn_oid = ((Form_pg_proc) GETSTRUCT(procedureTuple))->oid;
+ CFuncHashTabEntry *entry;
+
+ if (CFuncHash == NULL)
+ return NULL; /* no table yet */
+ entry = (CFuncHashTabEntry *)
+ hash_search(CFuncHash,
+ &fn_oid,
+ HASH_FIND,
+ NULL);
+ if (entry == NULL)
+ return NULL; /* no such entry */
+ if (entry->fn_xmin == HeapTupleHeaderGetRawXmin(procedureTuple->t_data) &&
+ ItemPointerEquals(&entry->fn_tid, &procedureTuple->t_self))
+ return entry; /* OK */
+ return NULL; /* entry is out of date */
+}
+
+/*
+ * record_C_func: enter (or update) info about a C function in the hash table
+ */
+static void
+record_C_func(HeapTuple procedureTuple,
+ PGFunction user_fn, const Pg_finfo_record *inforec)
+{
+ Oid fn_oid = ((Form_pg_proc) GETSTRUCT(procedureTuple))->oid;
+ CFuncHashTabEntry *entry;
+ bool found;
+
+ /* Create the hash table if it doesn't exist yet */
+ if (CFuncHash == NULL)
+ {
+ HASHCTL hash_ctl;
+
+ hash_ctl.keysize = sizeof(Oid);
+ hash_ctl.entrysize = sizeof(CFuncHashTabEntry);
+ CFuncHash = hash_create("CFuncHash",
+ 100,
+ &hash_ctl,
+ HASH_ELEM | HASH_BLOBS);
+ }
+
+ entry = (CFuncHashTabEntry *)
+ hash_search(CFuncHash,
+ &fn_oid,
+ HASH_ENTER,
+ &found);
+ /* OID is already filled in */
+ entry->fn_xmin = HeapTupleHeaderGetRawXmin(procedureTuple->t_data);
+ entry->fn_tid = procedureTuple->t_self;
+ entry->user_fn = user_fn;
+ entry->inforec = inforec;
+}
+
+
+/*
+ * Copy an FmgrInfo struct
+ *
+ * This is inherently somewhat bogus since we can't reliably duplicate
+ * language-dependent subsidiary info. We cheat by zeroing fn_extra,
+ * instead, meaning that subsidiary info will have to be recomputed.
+ */
+void
+fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo,
+ MemoryContext destcxt)
+{
+ memcpy(dstinfo, srcinfo, sizeof(FmgrInfo));
+ dstinfo->fn_mcxt = destcxt;
+ dstinfo->fn_extra = NULL;
+}
+
+
+/*
+ * Specialized lookup routine for fmgr_internal_validator: given the alleged
+ * name of an internal function, return the OID of the function.
+ * If the name is not recognized, return InvalidOid.
+ */
+Oid
+fmgr_internal_function(const char *proname)
+{
+ const FmgrBuiltin *fbp = fmgr_lookupByName(proname);
+
+ if (fbp == NULL)
+ return InvalidOid;
+ return fbp->foid;
+}
+
+
+/*
+ * Support for security-definer and proconfig-using functions. We support
+ * both of these features using the same call handler, because they are
+ * often used together and it would be inefficient (as well as notationally
+ * messy) to have two levels of call handler involved.
+ */
+struct fmgr_security_definer_cache
+{
+ FmgrInfo flinfo; /* lookup info for target function */
+ Oid userid; /* userid to set, or InvalidOid */
+ ArrayType *proconfig; /* GUC values to set, or NULL */
+ Datum arg; /* passthrough argument for plugin modules */
+};
+
+/*
+ * Function handler for security-definer/proconfig/plugin-hooked functions.
+ * We extract the OID of the actual function and do a fmgr lookup again.
+ * Then we fetch the pg_proc row and copy the owner ID and proconfig fields.
+ * (All this info is cached for the duration of the current query.)
+ * To execute a call, we temporarily replace the flinfo with the cached
+ * and looked-up one, while keeping the outer fcinfo (which contains all
+ * the actual arguments, etc.) intact. This is not re-entrant, but then
+ * the fcinfo itself can't be used reentrantly anyway.
+ */
+extern Datum
+fmgr_security_definer(PG_FUNCTION_ARGS)
+{
+ Datum result;
+ struct fmgr_security_definer_cache *volatile fcache;
+ FmgrInfo *save_flinfo;
+ Oid save_userid;
+ int save_sec_context;
+ volatile int save_nestlevel;
+ PgStat_FunctionCallUsage fcusage;
+
+ if (!fcinfo->flinfo->fn_extra)
+ {
+ HeapTuple tuple;
+ Form_pg_proc procedureStruct;
+ Datum datum;
+ bool isnull;
+ MemoryContext oldcxt;
+
+ fcache = MemoryContextAllocZero(fcinfo->flinfo->fn_mcxt,
+ sizeof(*fcache));
+
+ fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,
+ fcinfo->flinfo->fn_mcxt, true);
+ fcache->flinfo.fn_expr = fcinfo->flinfo->fn_expr;
+
+ tuple = SearchSysCache1(PROCOID,
+ ObjectIdGetDatum(fcinfo->flinfo->fn_oid));
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for function %u",
+ fcinfo->flinfo->fn_oid);
+ procedureStruct = (Form_pg_proc) GETSTRUCT(tuple);
+
+ if (procedureStruct->prosecdef)
+ fcache->userid = procedureStruct->proowner;
+
+ datum = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_proconfig,
+ &isnull);
+ if (!isnull)
+ {
+ oldcxt = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
+ fcache->proconfig = DatumGetArrayTypePCopy(datum);
+ MemoryContextSwitchTo(oldcxt);
+ }
+
+ ReleaseSysCache(tuple);
+
+ fcinfo->flinfo->fn_extra = fcache;
+ }
+ else
+ fcache = fcinfo->flinfo->fn_extra;
+
+ /* GetUserIdAndSecContext is cheap enough that no harm in a wasted call */
+ GetUserIdAndSecContext(&save_userid, &save_sec_context);
+ if (fcache->proconfig) /* Need a new GUC nesting level */
+ save_nestlevel = NewGUCNestLevel();
+ else
+ save_nestlevel = 0; /* keep compiler quiet */
+
+ if (OidIsValid(fcache->userid))
+ SetUserIdAndSecContext(fcache->userid,
+ save_sec_context | SECURITY_LOCAL_USERID_CHANGE);
+
+ if (fcache->proconfig)
+ {
+ ProcessGUCArray(fcache->proconfig,
+ (superuser() ? PGC_SUSET : PGC_USERSET),
+ PGC_S_SESSION,
+ GUC_ACTION_SAVE);
+ }
+
+ /* function manager hook */
+ if (fmgr_hook)
+ (*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);
+
+ /*
+ * We don't need to restore GUC or userid settings on error, because the
+ * ensuing xact or subxact abort will do that. The PG_TRY block is only
+ * needed to clean up the flinfo link.
+ */
+ save_flinfo = fcinfo->flinfo;
+
+ PG_TRY();
+ {
+ fcinfo->flinfo = &fcache->flinfo;
+
+ /* See notes in fmgr_info_cxt_security */
+ pgstat_init_function_usage(fcinfo, &fcusage);
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /*
+ * We could be calling either a regular or a set-returning function,
+ * so we have to test to see what finalize flag to use.
+ */
+ pgstat_end_function_usage(&fcusage,
+ (fcinfo->resultinfo == NULL ||
+ !IsA(fcinfo->resultinfo, ReturnSetInfo) ||
+ ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));
+ }
+ PG_CATCH();
+ {
+ fcinfo->flinfo = save_flinfo;
+ if (fmgr_hook)
+ (*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ fcinfo->flinfo = save_flinfo;
+
+ if (fcache->proconfig)
+ AtEOXact_GUC(true, save_nestlevel);
+ if (OidIsValid(fcache->userid))
+ SetUserIdAndSecContext(save_userid, save_sec_context);
+ if (fmgr_hook)
+ (*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);
+
+ return result;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Support routines for callers of fmgr-compatible functions
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * These are for invocation of a specifically named function with a
+ * directly-computed parameter list. Note that neither arguments nor result
+ * are allowed to be NULL. Also, the function cannot be one that needs to
+ * look at FmgrInfo, since there won't be any.
+ */
+Datum
+DirectFunctionCall1Coll(PGFunction func, Oid collation, Datum arg1)
+{
+ LOCAL_FCINFO(fcinfo, 1);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 1, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall2Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2)
+{
+ LOCAL_FCINFO(fcinfo, 2);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 2, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall3Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3)
+{
+ LOCAL_FCINFO(fcinfo, 3);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 3, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall4Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4)
+{
+ LOCAL_FCINFO(fcinfo, 4);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 4, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall5Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5)
+{
+ LOCAL_FCINFO(fcinfo, 5);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 5, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall6Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6)
+{
+ LOCAL_FCINFO(fcinfo, 6);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 6, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall7Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7)
+{
+ LOCAL_FCINFO(fcinfo, 7);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 7, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall8Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8)
+{
+ LOCAL_FCINFO(fcinfo, 8);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 8, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+ fcinfo->args[7].value = arg8;
+ fcinfo->args[7].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+DirectFunctionCall9Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8,
+ Datum arg9)
+{
+ LOCAL_FCINFO(fcinfo, 9);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, NULL, 9, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+ fcinfo->args[7].value = arg8;
+ fcinfo->args[7].isnull = false;
+ fcinfo->args[8].value = arg9;
+ fcinfo->args[8].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+/*
+ * These functions work like the DirectFunctionCall functions except that
+ * they use the flinfo parameter to initialise the fcinfo for the call.
+ * It's recommended that the callee only use the fn_extra and fn_mcxt
+ * fields, as other fields will typically describe the calling function
+ * not the callee. Conversely, the calling function should not have
+ * used fn_extra, unless its use is known to be compatible with the callee's.
+ */
+
+Datum
+CallerFInfoFunctionCall1(PGFunction func, FmgrInfo *flinfo, Oid collation, Datum arg1)
+{
+ LOCAL_FCINFO(fcinfo, 1);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 1, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+Datum
+CallerFInfoFunctionCall2(PGFunction func, FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
+{
+ LOCAL_FCINFO(fcinfo, 2);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 2, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+
+ result = (*func) (fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %p returned NULL", (void *) func);
+
+ return result;
+}
+
+/*
+ * These are for invocation of a previously-looked-up function with a
+ * directly-computed parameter list. Note that neither arguments nor result
+ * are allowed to be NULL.
+ */
+Datum
+FunctionCall0Coll(FmgrInfo *flinfo, Oid collation)
+{
+ LOCAL_FCINFO(fcinfo, 0);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 0, collation, NULL, NULL);
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
+{
+ LOCAL_FCINFO(fcinfo, 1);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 1, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
+{
+ LOCAL_FCINFO(fcinfo, 2);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 2, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3)
+{
+ LOCAL_FCINFO(fcinfo, 3);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 3, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall4Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4)
+{
+ LOCAL_FCINFO(fcinfo, 4);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 4, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall5Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5)
+{
+ LOCAL_FCINFO(fcinfo, 5);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 5, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall6Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6)
+{
+ LOCAL_FCINFO(fcinfo, 6);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 6, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall7Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7)
+{
+ LOCAL_FCINFO(fcinfo, 7);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 7, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall8Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8)
+{
+ LOCAL_FCINFO(fcinfo, 8);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 8, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+ fcinfo->args[7].value = arg8;
+ fcinfo->args[7].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+Datum
+FunctionCall9Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8,
+ Datum arg9)
+{
+ LOCAL_FCINFO(fcinfo, 9);
+ Datum result;
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 9, collation, NULL, NULL);
+
+ fcinfo->args[0].value = arg1;
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = arg2;
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = arg3;
+ fcinfo->args[2].isnull = false;
+ fcinfo->args[3].value = arg4;
+ fcinfo->args[3].isnull = false;
+ fcinfo->args[4].value = arg5;
+ fcinfo->args[4].isnull = false;
+ fcinfo->args[5].value = arg6;
+ fcinfo->args[5].isnull = false;
+ fcinfo->args[6].value = arg7;
+ fcinfo->args[6].isnull = false;
+ fcinfo->args[7].value = arg8;
+ fcinfo->args[7].isnull = false;
+ fcinfo->args[8].value = arg9;
+ fcinfo->args[8].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (fcinfo->isnull)
+ elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
+
+ return result;
+}
+
+
+/*
+ * These are for invocation of a function identified by OID with a
+ * directly-computed parameter list. Note that neither arguments nor result
+ * are allowed to be NULL. These are essentially fmgr_info() followed
+ * by FunctionCallN(). If the same function is to be invoked repeatedly,
+ * do the fmgr_info() once and then use FunctionCallN().
+ */
+Datum
+OidFunctionCall0Coll(Oid functionId, Oid collation)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall0Coll(&flinfo, collation);
+}
+
+Datum
+OidFunctionCall1Coll(Oid functionId, Oid collation, Datum arg1)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall1Coll(&flinfo, collation, arg1);
+}
+
+Datum
+OidFunctionCall2Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall2Coll(&flinfo, collation, arg1, arg2);
+}
+
+Datum
+OidFunctionCall3Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall3Coll(&flinfo, collation, arg1, arg2, arg3);
+}
+
+Datum
+OidFunctionCall4Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall4Coll(&flinfo, collation, arg1, arg2, arg3, arg4);
+}
+
+Datum
+OidFunctionCall5Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall5Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5);
+}
+
+Datum
+OidFunctionCall6Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall6Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
+ arg6);
+}
+
+Datum
+OidFunctionCall7Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall7Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7);
+}
+
+Datum
+OidFunctionCall8Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall8Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8);
+}
+
+Datum
+OidFunctionCall9Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2,
+ Datum arg3, Datum arg4, Datum arg5,
+ Datum arg6, Datum arg7, Datum arg8,
+ Datum arg9)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+
+ return FunctionCall9Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9);
+}
+
+
+/*
+ * Special cases for convenient invocation of datatype I/O functions.
+ */
+
+/*
+ * Call a previously-looked-up datatype input function.
+ *
+ * "str" may be NULL to indicate we are reading a NULL. In this case
+ * the caller should assume the result is NULL, but we'll call the input
+ * function anyway if it's not strict. So this is almost but not quite
+ * the same as FunctionCall3.
+ */
+Datum
+InputFunctionCall(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod)
+{
+ LOCAL_FCINFO(fcinfo, 3);
+ Datum result;
+
+ if (str == NULL && flinfo->fn_strict)
+ return (Datum) 0; /* just return null result */
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 3, InvalidOid, NULL, NULL);
+
+ fcinfo->args[0].value = CStringGetDatum(str);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = Int32GetDatum(typmod);
+ fcinfo->args[2].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Should get null result if and only if str is NULL */
+ if (str == NULL)
+ {
+ if (!fcinfo->isnull)
+ elog(ERROR, "input function %u returned non-NULL",
+ flinfo->fn_oid);
+ }
+ else
+ {
+ if (fcinfo->isnull)
+ elog(ERROR, "input function %u returned NULL",
+ flinfo->fn_oid);
+ }
+
+ return result;
+}
+
+/*
+ * Call a previously-looked-up datatype output function.
+ *
+ * Do not call this on NULL datums.
+ *
+ * This is currently little more than window dressing for FunctionCall1.
+ */
+char *
+OutputFunctionCall(FmgrInfo *flinfo, Datum val)
+{
+ return DatumGetCString(FunctionCall1(flinfo, val));
+}
+
+/*
+ * Call a previously-looked-up datatype binary-input function.
+ *
+ * "buf" may be NULL to indicate we are reading a NULL. In this case
+ * the caller should assume the result is NULL, but we'll call the receive
+ * function anyway if it's not strict. So this is almost but not quite
+ * the same as FunctionCall3.
+ */
+Datum
+ReceiveFunctionCall(FmgrInfo *flinfo, StringInfo buf,
+ Oid typioparam, int32 typmod)
+{
+ LOCAL_FCINFO(fcinfo, 3);
+ Datum result;
+
+ if (buf == NULL && flinfo->fn_strict)
+ return (Datum) 0; /* just return null result */
+
+ InitFunctionCallInfoData(*fcinfo, flinfo, 3, InvalidOid, NULL, NULL);
+
+ fcinfo->args[0].value = PointerGetDatum(buf);
+ fcinfo->args[0].isnull = false;
+ fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
+ fcinfo->args[1].isnull = false;
+ fcinfo->args[2].value = Int32GetDatum(typmod);
+ fcinfo->args[2].isnull = false;
+
+ result = FunctionCallInvoke(fcinfo);
+
+ /* Should get null result if and only if buf is NULL */
+ if (buf == NULL)
+ {
+ if (!fcinfo->isnull)
+ elog(ERROR, "receive function %u returned non-NULL",
+ flinfo->fn_oid);
+ }
+ else
+ {
+ if (fcinfo->isnull)
+ elog(ERROR, "receive function %u returned NULL",
+ flinfo->fn_oid);
+ }
+
+ return result;
+}
+
+/*
+ * Call a previously-looked-up datatype binary-output function.
+ *
+ * Do not call this on NULL datums.
+ *
+ * This is little more than window dressing for FunctionCall1, but it does
+ * guarantee a non-toasted result, which strictly speaking the underlying
+ * function doesn't.
+ */
+bytea *
+SendFunctionCall(FmgrInfo *flinfo, Datum val)
+{
+ return DatumGetByteaP(FunctionCall1(flinfo, val));
+}
+
+/*
+ * As above, for I/O functions identified by OID. These are only to be used
+ * in seldom-executed code paths. They are not only slow but leak memory.
+ */
+Datum
+OidInputFunctionCall(Oid functionId, char *str, Oid typioparam, int32 typmod)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+ return InputFunctionCall(&flinfo, str, typioparam, typmod);
+}
+
+char *
+OidOutputFunctionCall(Oid functionId, Datum val)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+ return OutputFunctionCall(&flinfo, val);
+}
+
+Datum
+OidReceiveFunctionCall(Oid functionId, StringInfo buf,
+ Oid typioparam, int32 typmod)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+ return ReceiveFunctionCall(&flinfo, buf, typioparam, typmod);
+}
+
+bytea *
+OidSendFunctionCall(Oid functionId, Datum val)
+{
+ FmgrInfo flinfo;
+
+ fmgr_info(functionId, &flinfo);
+ return SendFunctionCall(&flinfo, val);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Support routines for standard maybe-pass-by-reference datatypes
+ *
+ * int8 and float8 can be passed by value if Datum is wide enough.
+ * (For backwards-compatibility reasons, we allow pass-by-ref to be chosen
+ * at compile time even if pass-by-val is possible.)
+ *
+ * Note: there is only one switch controlling the pass-by-value option for
+ * both int8 and float8; this is to avoid making things unduly complicated
+ * for the timestamp types, which might have either representation.
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef USE_FLOAT8_BYVAL /* controls int8 too */
+
+Datum
+Int64GetDatum(int64 X)
+{
+ int64 *retval = (int64 *) palloc(sizeof(int64));
+
+ *retval = X;
+ return PointerGetDatum(retval);
+}
+
+Datum
+Float8GetDatum(float8 X)
+{
+ float8 *retval = (float8 *) palloc(sizeof(float8));
+
+ *retval = X;
+ return PointerGetDatum(retval);
+}
+#endif /* USE_FLOAT8_BYVAL */
+
+
+/*-------------------------------------------------------------------------
+ * Support routines for toastable datatypes
+ *-------------------------------------------------------------------------
+ */
+
+struct varlena *
+pg_detoast_datum(struct varlena *datum)
+{
+ if (VARATT_IS_EXTENDED(datum))
+ return detoast_attr(datum);
+ else
+ return datum;
+}
+
+struct varlena *
+pg_detoast_datum_copy(struct varlena *datum)
+{
+ if (VARATT_IS_EXTENDED(datum))
+ return detoast_attr(datum);
+ else
+ {
+ /* Make a modifiable copy of the varlena object */
+ Size len = VARSIZE(datum);
+ struct varlena *result = (struct varlena *) palloc(len);
+
+ memcpy(result, datum, len);
+ return result;
+ }
+}
+
+struct varlena *
+pg_detoast_datum_slice(struct varlena *datum, int32 first, int32 count)
+{
+ /* Only get the specified portion from the toast rel */
+ return detoast_attr_slice(datum, first, count);
+}
+
+struct varlena *
+pg_detoast_datum_packed(struct varlena *datum)
+{
+ if (VARATT_IS_COMPRESSED(datum) || VARATT_IS_EXTERNAL(datum))
+ return detoast_attr(datum);
+ else
+ return datum;
+}
+
+/*-------------------------------------------------------------------------
+ * Support routines for extracting info from fn_expr parse tree
+ *
+ * These are needed by polymorphic functions, which accept multiple possible
+ * input types and need help from the parser to know what they've got.
+ * Also, some functions might be interested in whether a parameter is constant.
+ * Functions taking VARIADIC ANY also need to know about the VARIADIC keyword.
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Get the actual type OID of the function return type
+ *
+ * Returns InvalidOid if information is not available
+ */
+Oid
+get_fn_expr_rettype(FmgrInfo *flinfo)
+{
+ Node *expr;
+
+ /*
+ * can't return anything useful if we have no FmgrInfo or if its fn_expr
+ * node has not been initialized
+ */
+ if (!flinfo || !flinfo->fn_expr)
+ return InvalidOid;
+
+ expr = flinfo->fn_expr;
+
+ return exprType(expr);
+}
+
+/*
+ * Get the actual type OID of a specific function argument (counting from 0)
+ *
+ * Returns InvalidOid if information is not available
+ */
+Oid
+get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
+{
+ /*
+ * can't return anything useful if we have no FmgrInfo or if its fn_expr
+ * node has not been initialized
+ */
+ if (!flinfo || !flinfo->fn_expr)
+ return InvalidOid;
+
+ return get_call_expr_argtype(flinfo->fn_expr, argnum);
+}
+
+/*
+ * Get the actual type OID of a specific function argument (counting from 0),
+ * but working from the calling expression tree instead of FmgrInfo
+ *
+ * Returns InvalidOid if information is not available
+ */
+Oid
+get_call_expr_argtype(Node *expr, int argnum)
+{
+ List *args;
+ Oid argtype;
+
+ if (expr == NULL)
+ return InvalidOid;
+
+ if (IsA(expr, FuncExpr))
+ args = ((FuncExpr *) expr)->args;
+ else if (IsA(expr, OpExpr))
+ args = ((OpExpr *) expr)->args;
+ else if (IsA(expr, DistinctExpr))
+ args = ((DistinctExpr *) expr)->args;
+ else if (IsA(expr, ScalarArrayOpExpr))
+ args = ((ScalarArrayOpExpr *) expr)->args;
+ else if (IsA(expr, NullIfExpr))
+ args = ((NullIfExpr *) expr)->args;
+ else if (IsA(expr, WindowFunc))
+ args = ((WindowFunc *) expr)->args;
+ else
+ return InvalidOid;
+
+ if (argnum < 0 || argnum >= list_length(args))
+ return InvalidOid;
+
+ argtype = exprType((Node *) list_nth(args, argnum));
+
+ /*
+ * special hack for ScalarArrayOpExpr: what the underlying function will
+ * actually get passed is the element type of the array.
+ */
+ if (IsA(expr, ScalarArrayOpExpr) &&
+ argnum == 1)
+ argtype = get_base_element_type(argtype);
+
+ return argtype;
+}
+
+/*
+ * Find out whether a specific function argument is constant for the
+ * duration of a query
+ *
+ * Returns false if information is not available
+ */
+bool
+get_fn_expr_arg_stable(FmgrInfo *flinfo, int argnum)
+{
+ /*
+ * can't return anything useful if we have no FmgrInfo or if its fn_expr
+ * node has not been initialized
+ */
+ if (!flinfo || !flinfo->fn_expr)
+ return false;
+
+ return get_call_expr_arg_stable(flinfo->fn_expr, argnum);
+}
+
+/*
+ * Find out whether a specific function argument is constant for the
+ * duration of a query, but working from the calling expression tree
+ *
+ * Returns false if information is not available
+ */
+bool
+get_call_expr_arg_stable(Node *expr, int argnum)
+{
+ List *args;
+ Node *arg;
+
+ if (expr == NULL)
+ return false;
+
+ if (IsA(expr, FuncExpr))
+ args = ((FuncExpr *) expr)->args;
+ else if (IsA(expr, OpExpr))
+ args = ((OpExpr *) expr)->args;
+ else if (IsA(expr, DistinctExpr))
+ args = ((DistinctExpr *) expr)->args;
+ else if (IsA(expr, ScalarArrayOpExpr))
+ args = ((ScalarArrayOpExpr *) expr)->args;
+ else if (IsA(expr, NullIfExpr))
+ args = ((NullIfExpr *) expr)->args;
+ else if (IsA(expr, WindowFunc))
+ args = ((WindowFunc *) expr)->args;
+ else
+ return false;
+
+ if (argnum < 0 || argnum >= list_length(args))
+ return false;
+
+ arg = (Node *) list_nth(args, argnum);
+
+ /*
+ * Either a true Const or an external Param will have a value that doesn't
+ * change during the execution of the query. In future we might want to
+ * consider other cases too, e.g. now().
+ */
+ if (IsA(arg, Const))
+ return true;
+ if (IsA(arg, Param) &&
+ ((Param *) arg)->paramkind == PARAM_EXTERN)
+ return true;
+
+ return false;
+}
+
+/*
+ * Get the VARIADIC flag from the function invocation
+ *
+ * Returns false (the default assumption) if information is not available
+ *
+ * Note this is generally only of interest to VARIADIC ANY functions
+ */
+bool
+get_fn_expr_variadic(FmgrInfo *flinfo)
+{
+ Node *expr;
+
+ /*
+ * can't return anything useful if we have no FmgrInfo or if its fn_expr
+ * node has not been initialized
+ */
+ if (!flinfo || !flinfo->fn_expr)
+ return false;
+
+ expr = flinfo->fn_expr;
+
+ if (IsA(expr, FuncExpr))
+ return ((FuncExpr *) expr)->funcvariadic;
+ else
+ return false;
+}
+
+/*
+ * Set options to FmgrInfo of opclass support function.
+ *
+ * Opclass support functions are called outside of expressions. Thanks to that
+ * we can use fn_expr to store opclass options as bytea constant.
+ */
+void
+set_fn_opclass_options(FmgrInfo *flinfo, bytea *options)
+{
+ flinfo->fn_expr = (Node *) makeConst(BYTEAOID, -1, InvalidOid, -1,
+ PointerGetDatum(options),
+ options == NULL, false);
+}
+
+/*
+ * Check if options are defined for opclass support function.
+ */
+bool
+has_fn_opclass_options(FmgrInfo *flinfo)
+{
+ if (flinfo && flinfo->fn_expr && IsA(flinfo->fn_expr, Const))
+ {
+ Const *expr = (Const *) flinfo->fn_expr;
+
+ if (expr->consttype == BYTEAOID)
+ return !expr->constisnull;
+ }
+ return false;
+}
+
+/*
+ * Get options for opclass support function.
+ */
+bytea *
+get_fn_opclass_options(FmgrInfo *flinfo)
+{
+ if (flinfo && flinfo->fn_expr && IsA(flinfo->fn_expr, Const))
+ {
+ Const *expr = (Const *) flinfo->fn_expr;
+
+ if (expr->consttype == BYTEAOID)
+ return expr->constisnull ? NULL : DatumGetByteaP(expr->constvalue);
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("operator class options info is absent in function call context")));
+
+ return NULL;
+}
+
+/*-------------------------------------------------------------------------
+ * Support routines for procedural language implementations
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Verify that a validator is actually associated with the language of a
+ * particular function and that the user has access to both the language and
+ * the function. All validators should call this before doing anything
+ * substantial. Doing so ensures a user cannot achieve anything with explicit
+ * calls to validators that he could not achieve with CREATE FUNCTION or by
+ * simply calling an existing function.
+ *
+ * When this function returns false, callers should skip all validation work
+ * and call PG_RETURN_VOID(). This never happens at present; it is reserved
+ * for future expansion.
+ *
+ * In particular, checking that the validator corresponds to the function's
+ * language allows untrusted language validators to assume they process only
+ * superuser-chosen source code. (Untrusted language call handlers, by
+ * definition, do assume that.) A user lacking the USAGE language privilege
+ * would be unable to reach the validator through CREATE FUNCTION, so we check
+ * that to block explicit calls as well. Checking the EXECUTE privilege on
+ * the function is often superfluous, because most users can clone the
+ * function to get an executable copy. It is meaningful against users with no
+ * database TEMP right and no permanent schema CREATE right, thereby unable to
+ * create any function. Also, if the function tracks persistent state by
+ * function OID or name, validating the original function might permit more
+ * mischief than creating and validating a clone thereof.
+ */
+bool
+CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid)
+{
+ HeapTuple procTup;
+ HeapTuple langTup;
+ Form_pg_proc procStruct;
+ Form_pg_language langStruct;
+ AclResult aclresult;
+
+ /*
+ * Get the function's pg_proc entry. Throw a user-facing error for bad
+ * OID, because validators can be called with user-specified OIDs.
+ */
+ procTup = SearchSysCache1(PROCOID, ObjectIdGetDatum(functionOid));
+ if (!HeapTupleIsValid(procTup))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("function with OID %u does not exist", functionOid)));
+ procStruct = (Form_pg_proc) GETSTRUCT(procTup);
+
+ /*
+ * Fetch pg_language entry to know if this is the correct validation
+ * function for that pg_proc entry.
+ */
+ langTup = SearchSysCache1(LANGOID, ObjectIdGetDatum(procStruct->prolang));
+ if (!HeapTupleIsValid(langTup))
+ elog(ERROR, "cache lookup failed for language %u", procStruct->prolang);
+ langStruct = (Form_pg_language) GETSTRUCT(langTup);
+
+ if (langStruct->lanvalidator != validatorOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("language validation function %u called for language %u instead of %u",
+ validatorOid, procStruct->prolang,
+ langStruct->lanvalidator)));
+
+ /* first validate that we have permissions to use the language */
+ aclresult = pg_language_aclcheck(procStruct->prolang, GetUserId(),
+ ACL_USAGE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, OBJECT_LANGUAGE,
+ NameStr(langStruct->lanname));
+
+ /*
+ * Check whether we are allowed to execute the function itself. If we can
+ * execute it, there should be no possible side-effect of
+ * compiling/validation that execution can't have.
+ */
+ aclresult = pg_proc_aclcheck(functionOid, GetUserId(), ACL_EXECUTE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, OBJECT_FUNCTION, NameStr(procStruct->proname));
+
+ ReleaseSysCache(procTup);
+ ReleaseSysCache(langTup);
+
+ return true;
+}
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
new file mode 100644
index 0000000..31f6662
--- /dev/null
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -0,0 +1,2115 @@
+/*-------------------------------------------------------------------------
+ *
+ * funcapi.c
+ * Utility and convenience functions for fmgr functions that return
+ * sets and/or composite types, or deal with VARIADIC inputs.
+ *
+ * Copyright (c) 2002-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/fmgr/funcapi.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/relation.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "nodes/nodeFuncs.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/regproc.h"
+#include "utils/rel.h"
+#include "utils/syscache.h"
+#include "utils/tuplestore.h"
+#include "utils/typcache.h"
+
+
+typedef struct polymorphic_actuals
+{
+ Oid anyelement_type; /* anyelement mapping, if known */
+ Oid anyarray_type; /* anyarray mapping, if known */
+ Oid anyrange_type; /* anyrange mapping, if known */
+ Oid anymultirange_type; /* anymultirange mapping, if known */
+} polymorphic_actuals;
+
+static void shutdown_MultiFuncCall(Datum arg);
+static TypeFuncClass internal_get_result_type(Oid funcid,
+ Node *call_expr,
+ ReturnSetInfo *rsinfo,
+ Oid *resultTypeId,
+ TupleDesc *resultTupleDesc);
+static void resolve_anyelement_from_others(polymorphic_actuals *actuals);
+static void resolve_anyarray_from_others(polymorphic_actuals *actuals);
+static void resolve_anyrange_from_others(polymorphic_actuals *actuals);
+static void resolve_anymultirange_from_others(polymorphic_actuals *actuals);
+static bool resolve_polymorphic_tupdesc(TupleDesc tupdesc,
+ oidvector *declared_args,
+ Node *call_expr);
+static TypeFuncClass get_type_func_class(Oid typid, Oid *base_typeid);
+
+
+/*
+ * Compatibility function for v15.
+ */
+void
+SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags)
+{
+ InitMaterializedSRF(fcinfo, flags);
+}
+
+/*
+ * InitMaterializedSRF
+ *
+ * Helper function to build the state of a set-returning function used
+ * in the context of a single call with materialize mode. This code
+ * includes sanity checks on ReturnSetInfo, creates the Tuplestore and
+ * the TupleDesc used with the function and stores them into the
+ * function's ReturnSetInfo.
+ *
+ * "flags" can be set to MAT_SRF_USE_EXPECTED_DESC, to use the tuple
+ * descriptor coming from expectedDesc, which is the tuple descriptor
+ * expected by the caller. MAT_SRF_BLESS can be set to complete the
+ * information associated to the tuple descriptor, which is necessary
+ * in some cases where the tuple descriptor comes from a transient
+ * RECORD datatype.
+ */
+void
+InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
+{
+ bool random_access;
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ Tuplestorestate *tupstore;
+ MemoryContext old_context,
+ per_query_ctx;
+ TupleDesc stored_tupdesc;
+
+ /* check to see if caller supports returning a tuplestore */
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ if (!(rsinfo->allowedModes & SFRM_Materialize) ||
+ ((flags & MAT_SRF_USE_EXPECTED_DESC) != 0 && rsinfo->expectedDesc == NULL))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+
+ /*
+ * Store the tuplestore and the tuple descriptor in ReturnSetInfo. This
+ * must be done in the per-query memory context.
+ */
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ old_context = MemoryContextSwitchTo(per_query_ctx);
+
+ /* build a tuple descriptor for our result type */
+ if ((flags & MAT_SRF_USE_EXPECTED_DESC) != 0)
+ stored_tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc);
+ else
+ {
+ if (get_call_result_type(fcinfo, NULL, &stored_tupdesc) != TYPEFUNC_COMPOSITE)
+ elog(ERROR, "return type must be a row type");
+ }
+
+ /* If requested, bless the tuple descriptor */
+ if ((flags & MAT_SRF_BLESS) != 0)
+ BlessTupleDesc(stored_tupdesc);
+
+ random_access = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0;
+
+ tupstore = tuplestore_begin_heap(random_access, false, work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = stored_tupdesc;
+ MemoryContextSwitchTo(old_context);
+}
+
+
+/*
+ * init_MultiFuncCall
+ * Create an empty FuncCallContext data structure
+ * and do some other basic Multi-function call setup
+ * and error checking
+ */
+FuncCallContext *
+init_MultiFuncCall(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *retval;
+
+ /*
+ * Bail if we're called in the wrong context
+ */
+ if (fcinfo->resultinfo == NULL || !IsA(fcinfo->resultinfo, ReturnSetInfo))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+
+ if (fcinfo->flinfo->fn_extra == NULL)
+ {
+ /*
+ * First call
+ */
+ ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+ MemoryContext multi_call_ctx;
+
+ /*
+ * Create a suitably long-lived context to hold cross-call data
+ */
+ multi_call_ctx = AllocSetContextCreate(fcinfo->flinfo->fn_mcxt,
+ "SRF multi-call context",
+ ALLOCSET_SMALL_SIZES);
+
+ /*
+ * Allocate suitably long-lived space and zero it
+ */
+ retval = (FuncCallContext *)
+ MemoryContextAllocZero(multi_call_ctx,
+ sizeof(FuncCallContext));
+
+ /*
+ * initialize the elements
+ */
+ retval->call_cntr = 0;
+ retval->max_calls = 0;
+ retval->user_fctx = NULL;
+ retval->attinmeta = NULL;
+ retval->tuple_desc = NULL;
+ retval->multi_call_memory_ctx = multi_call_ctx;
+
+ /*
+ * save the pointer for cross-call use
+ */
+ fcinfo->flinfo->fn_extra = retval;
+
+ /*
+ * Ensure we will get shut down cleanly if the exprcontext is not run
+ * to completion.
+ */
+ RegisterExprContextCallback(rsi->econtext,
+ shutdown_MultiFuncCall,
+ PointerGetDatum(fcinfo->flinfo));
+ }
+ else
+ {
+ /* second and subsequent calls */
+ elog(ERROR, "init_MultiFuncCall cannot be called more than once");
+
+ /* never reached, but keep compiler happy */
+ retval = NULL;
+ }
+
+ return retval;
+}
+
+/*
+ * per_MultiFuncCall
+ *
+ * Do Multi-function per-call setup
+ */
+FuncCallContext *
+per_MultiFuncCall(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *retval = (FuncCallContext *) fcinfo->flinfo->fn_extra;
+
+ return retval;
+}
+
+/*
+ * end_MultiFuncCall
+ * Clean up after init_MultiFuncCall
+ */
+void
+end_MultiFuncCall(PG_FUNCTION_ARGS, FuncCallContext *funcctx)
+{
+ ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ /* Deregister the shutdown callback */
+ UnregisterExprContextCallback(rsi->econtext,
+ shutdown_MultiFuncCall,
+ PointerGetDatum(fcinfo->flinfo));
+
+ /* But use it to do the real work */
+ shutdown_MultiFuncCall(PointerGetDatum(fcinfo->flinfo));
+}
+
+/*
+ * shutdown_MultiFuncCall
+ * Shutdown function to clean up after init_MultiFuncCall
+ */
+static void
+shutdown_MultiFuncCall(Datum arg)
+{
+ FmgrInfo *flinfo = (FmgrInfo *) DatumGetPointer(arg);
+ FuncCallContext *funcctx = (FuncCallContext *) flinfo->fn_extra;
+
+ /* unbind from flinfo */
+ flinfo->fn_extra = NULL;
+
+ /*
+ * Delete context that holds all multi-call data, including the
+ * FuncCallContext itself
+ */
+ MemoryContextDelete(funcctx->multi_call_memory_ctx);
+}
+
+
+/*
+ * get_call_result_type
+ * Given a function's call info record, determine the kind of datatype
+ * it is supposed to return. If resultTypeId isn't NULL, *resultTypeId
+ * receives the actual datatype OID (this is mainly useful for scalar
+ * result types). If resultTupleDesc isn't NULL, *resultTupleDesc
+ * receives a pointer to a TupleDesc when the result is of a composite
+ * type, or NULL when it's a scalar result.
+ *
+ * One hard case that this handles is resolution of actual rowtypes for
+ * functions returning RECORD (from either the function's OUT parameter
+ * list, or a ReturnSetInfo context node). TYPEFUNC_RECORD is returned
+ * only when we couldn't resolve the actual rowtype for lack of information.
+ *
+ * The other hard case that this handles is resolution of polymorphism.
+ * We will never return polymorphic pseudotypes (ANYELEMENT etc), either
+ * as a scalar result type or as a component of a rowtype.
+ *
+ * This function is relatively expensive --- in a function returning set,
+ * try to call it only the first time through.
+ */
+TypeFuncClass
+get_call_result_type(FunctionCallInfo fcinfo,
+ Oid *resultTypeId,
+ TupleDesc *resultTupleDesc)
+{
+ return internal_get_result_type(fcinfo->flinfo->fn_oid,
+ fcinfo->flinfo->fn_expr,
+ (ReturnSetInfo *) fcinfo->resultinfo,
+ resultTypeId,
+ resultTupleDesc);
+}
+
+/*
+ * get_expr_result_type
+ * As above, but work from a calling expression node tree
+ */
+TypeFuncClass
+get_expr_result_type(Node *expr,
+ Oid *resultTypeId,
+ TupleDesc *resultTupleDesc)
+{
+ TypeFuncClass result;
+
+ if (expr && IsA(expr, FuncExpr))
+ result = internal_get_result_type(((FuncExpr *) expr)->funcid,
+ expr,
+ NULL,
+ resultTypeId,
+ resultTupleDesc);
+ else if (expr && IsA(expr, OpExpr))
+ result = internal_get_result_type(get_opcode(((OpExpr *) expr)->opno),
+ expr,
+ NULL,
+ resultTypeId,
+ resultTupleDesc);
+ else if (expr && IsA(expr, RowExpr) &&
+ ((RowExpr *) expr)->row_typeid == RECORDOID)
+ {
+ /* We can resolve the record type by generating the tupdesc directly */
+ RowExpr *rexpr = (RowExpr *) expr;
+ TupleDesc tupdesc;
+ AttrNumber i = 1;
+ ListCell *lcc,
+ *lcn;
+
+ tupdesc = CreateTemplateTupleDesc(list_length(rexpr->args));
+ Assert(list_length(rexpr->args) == list_length(rexpr->colnames));
+ forboth(lcc, rexpr->args, lcn, rexpr->colnames)
+ {
+ Node *col = (Node *) lfirst(lcc);
+ char *colname = strVal(lfirst(lcn));
+
+ TupleDescInitEntry(tupdesc, i,
+ colname,
+ exprType(col),
+ exprTypmod(col),
+ 0);
+ TupleDescInitEntryCollation(tupdesc, i,
+ exprCollation(col));
+ i++;
+ }
+ if (resultTypeId)
+ *resultTypeId = rexpr->row_typeid;
+ if (resultTupleDesc)
+ *resultTupleDesc = BlessTupleDesc(tupdesc);
+ return TYPEFUNC_COMPOSITE;
+ }
+ else if (expr && IsA(expr, Const) &&
+ ((Const *) expr)->consttype == RECORDOID &&
+ !((Const *) expr)->constisnull)
+ {
+ /*
+ * When EXPLAIN'ing some queries with SEARCH/CYCLE clauses, we may
+ * need to resolve field names of a RECORD-type Const. The datum
+ * should contain a typmod that will tell us that.
+ */
+ HeapTupleHeader rec;
+ Oid tupType;
+ int32 tupTypmod;
+
+ rec = DatumGetHeapTupleHeader(((Const *) expr)->constvalue);
+ tupType = HeapTupleHeaderGetTypeId(rec);
+ tupTypmod = HeapTupleHeaderGetTypMod(rec);
+ if (resultTypeId)
+ *resultTypeId = tupType;
+ if (tupType != RECORDOID || tupTypmod >= 0)
+ {
+ /* Should be able to look it up */
+ if (resultTupleDesc)
+ *resultTupleDesc = lookup_rowtype_tupdesc_copy(tupType,
+ tupTypmod);
+ return TYPEFUNC_COMPOSITE;
+ }
+ else
+ {
+ /* This shouldn't really happen ... */
+ if (resultTupleDesc)
+ *resultTupleDesc = NULL;
+ return TYPEFUNC_RECORD;
+ }
+ }
+ else
+ {
+ /* handle as a generic expression; no chance to resolve RECORD */
+ Oid typid = exprType(expr);
+ Oid base_typid;
+
+ if (resultTypeId)
+ *resultTypeId = typid;
+ if (resultTupleDesc)
+ *resultTupleDesc = NULL;
+ result = get_type_func_class(typid, &base_typid);
+ if ((result == TYPEFUNC_COMPOSITE ||
+ result == TYPEFUNC_COMPOSITE_DOMAIN) &&
+ resultTupleDesc)
+ *resultTupleDesc = lookup_rowtype_tupdesc_copy(base_typid, -1);
+ }
+
+ return result;
+}
+
+/*
+ * get_func_result_type
+ * As above, but work from a function's OID only
+ *
+ * This will not be able to resolve pure-RECORD results nor polymorphism.
+ */
+TypeFuncClass
+get_func_result_type(Oid functionId,
+ Oid *resultTypeId,
+ TupleDesc *resultTupleDesc)
+{
+ return internal_get_result_type(functionId,
+ NULL,
+ NULL,
+ resultTypeId,
+ resultTupleDesc);
+}
+
+/*
+ * internal_get_result_type -- workhorse code implementing all the above
+ *
+ * funcid must always be supplied. call_expr and rsinfo can be NULL if not
+ * available. We will return TYPEFUNC_RECORD, and store NULL into
+ * *resultTupleDesc, if we cannot deduce the complete result rowtype from
+ * the available information.
+ */
+static TypeFuncClass
+internal_get_result_type(Oid funcid,
+ Node *call_expr,
+ ReturnSetInfo *rsinfo,
+ Oid *resultTypeId,
+ TupleDesc *resultTupleDesc)
+{
+ TypeFuncClass result;
+ HeapTuple tp;
+ Form_pg_proc procform;
+ Oid rettype;
+ Oid base_rettype;
+ TupleDesc tupdesc;
+
+ /* First fetch the function's pg_proc row to inspect its rettype */
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for function %u", funcid);
+ procform = (Form_pg_proc) GETSTRUCT(tp);
+
+ rettype = procform->prorettype;
+
+ /* Check for OUT parameters defining a RECORD result */
+ tupdesc = build_function_result_tupdesc_t(tp);
+ if (tupdesc)
+ {
+ /*
+ * It has OUT parameters, so it's basically like a regular composite
+ * type, except we have to be able to resolve any polymorphic OUT
+ * parameters.
+ */
+ if (resultTypeId)
+ *resultTypeId = rettype;
+
+ if (resolve_polymorphic_tupdesc(tupdesc,
+ &procform->proargtypes,
+ call_expr))
+ {
+ if (tupdesc->tdtypeid == RECORDOID &&
+ tupdesc->tdtypmod < 0)
+ assign_record_type_typmod(tupdesc);
+ if (resultTupleDesc)
+ *resultTupleDesc = tupdesc;
+ result = TYPEFUNC_COMPOSITE;
+ }
+ else
+ {
+ if (resultTupleDesc)
+ *resultTupleDesc = NULL;
+ result = TYPEFUNC_RECORD;
+ }
+
+ ReleaseSysCache(tp);
+
+ return result;
+ }
+
+ /*
+ * If scalar polymorphic result, try to resolve it.
+ */
+ if (IsPolymorphicType(rettype))
+ {
+ Oid newrettype = exprType(call_expr);
+
+ if (newrettype == InvalidOid) /* this probably should not happen */
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("could not determine actual result type for function \"%s\" declared to return type %s",
+ NameStr(procform->proname),
+ format_type_be(rettype))));
+ rettype = newrettype;
+ }
+
+ if (resultTypeId)
+ *resultTypeId = rettype;
+ if (resultTupleDesc)
+ *resultTupleDesc = NULL; /* default result */
+
+ /* Classify the result type */
+ result = get_type_func_class(rettype, &base_rettype);
+ switch (result)
+ {
+ case TYPEFUNC_COMPOSITE:
+ case TYPEFUNC_COMPOSITE_DOMAIN:
+ if (resultTupleDesc)
+ *resultTupleDesc = lookup_rowtype_tupdesc_copy(base_rettype, -1);
+ /* Named composite types can't have any polymorphic columns */
+ break;
+ case TYPEFUNC_SCALAR:
+ break;
+ case TYPEFUNC_RECORD:
+ /* We must get the tupledesc from call context */
+ if (rsinfo && IsA(rsinfo, ReturnSetInfo) &&
+ rsinfo->expectedDesc != NULL)
+ {
+ result = TYPEFUNC_COMPOSITE;
+ if (resultTupleDesc)
+ *resultTupleDesc = rsinfo->expectedDesc;
+ /* Assume no polymorphic columns here, either */
+ }
+ break;
+ default:
+ break;
+ }
+
+ ReleaseSysCache(tp);
+
+ return result;
+}
+
+/*
+ * get_expr_result_tupdesc
+ * Get a tupdesc describing the result of a composite-valued expression
+ *
+ * If expression is not composite or rowtype can't be determined, returns NULL
+ * if noError is true, else throws error.
+ *
+ * This is a simpler version of get_expr_result_type() for use when the caller
+ * is only interested in determinate rowtype results.
+ */
+TupleDesc
+get_expr_result_tupdesc(Node *expr, bool noError)
+{
+ TupleDesc tupleDesc;
+ TypeFuncClass functypclass;
+
+ functypclass = get_expr_result_type(expr, NULL, &tupleDesc);
+
+ if (functypclass == TYPEFUNC_COMPOSITE ||
+ functypclass == TYPEFUNC_COMPOSITE_DOMAIN)
+ return tupleDesc;
+
+ if (!noError)
+ {
+ Oid exprTypeId = exprType(expr);
+
+ if (exprTypeId != RECORDOID)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("type %s is not composite",
+ format_type_be(exprTypeId))));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("record type has not been registered")));
+ }
+
+ return NULL;
+}
+
+/*
+ * Resolve actual type of ANYELEMENT from other polymorphic inputs
+ *
+ * Note: the error cases here and in the sibling functions below are not
+ * really user-facing; they could only occur if the function signature is
+ * incorrect or the parser failed to enforce consistency of the actual
+ * argument types. Hence, we don't sweat too much over the error messages.
+ */
+static void
+resolve_anyelement_from_others(polymorphic_actuals *actuals)
+{
+ if (OidIsValid(actuals->anyarray_type))
+ {
+ /* Use the element type corresponding to actual type */
+ Oid array_base_type = getBaseType(actuals->anyarray_type);
+ Oid array_typelem = get_element_type(array_base_type);
+
+ if (!OidIsValid(array_typelem))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("argument declared %s is not an array but type %s",
+ "anyarray",
+ format_type_be(array_base_type))));
+ actuals->anyelement_type = array_typelem;
+ }
+ else if (OidIsValid(actuals->anyrange_type))
+ {
+ /* Use the element type corresponding to actual type */
+ Oid range_base_type = getBaseType(actuals->anyrange_type);
+ Oid range_typelem = get_range_subtype(range_base_type);
+
+ if (!OidIsValid(range_typelem))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("argument declared %s is not a range type but type %s",
+ "anyrange",
+ format_type_be(range_base_type))));
+ actuals->anyelement_type = range_typelem;
+ }
+ else if (OidIsValid(actuals->anymultirange_type))
+ {
+ /* Use the element type based on the multirange type */
+ Oid multirange_base_type;
+ Oid multirange_typelem;
+ Oid range_base_type;
+ Oid range_typelem;
+
+ multirange_base_type = getBaseType(actuals->anymultirange_type);
+ multirange_typelem = get_multirange_range(multirange_base_type);
+ if (!OidIsValid(multirange_typelem))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("argument declared %s is not a multirange type but type %s",
+ "anymultirange",
+ format_type_be(multirange_base_type))));
+
+ range_base_type = getBaseType(multirange_typelem);
+ range_typelem = get_range_subtype(range_base_type);
+
+ if (!OidIsValid(range_typelem))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("argument declared %s does not contain a range type but type %s",
+ "anymultirange",
+ format_type_be(range_base_type))));
+ actuals->anyelement_type = range_typelem;
+ }
+ else
+ elog(ERROR, "could not determine polymorphic type");
+}
+
+/*
+ * Resolve actual type of ANYARRAY from other polymorphic inputs
+ */
+static void
+resolve_anyarray_from_others(polymorphic_actuals *actuals)
+{
+ /* If we don't know ANYELEMENT, resolve that first */
+ if (!OidIsValid(actuals->anyelement_type))
+ resolve_anyelement_from_others(actuals);
+
+ if (OidIsValid(actuals->anyelement_type))
+ {
+ /* Use the array type corresponding to actual type */
+ Oid array_typeid = get_array_type(actuals->anyelement_type);
+
+ if (!OidIsValid(array_typeid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("could not find array type for data type %s",
+ format_type_be(actuals->anyelement_type))));
+ actuals->anyarray_type = array_typeid;
+ }
+ else
+ elog(ERROR, "could not determine polymorphic type");
+}
+
+/*
+ * Resolve actual type of ANYRANGE from other polymorphic inputs
+ */
+static void
+resolve_anyrange_from_others(polymorphic_actuals *actuals)
+{
+ /*
+ * We can't deduce a range type from other polymorphic array or base
+ * types, because there may be multiple range types with the same subtype,
+ * but we can deduce it from a polymorphic multirange type.
+ */
+ if (OidIsValid(actuals->anymultirange_type))
+ {
+ /* Use the element type based on the multirange type */
+ Oid multirange_base_type = getBaseType(actuals->anymultirange_type);
+ Oid multirange_typelem = get_multirange_range(multirange_base_type);
+
+ if (!OidIsValid(multirange_typelem))
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("argument declared %s is not a multirange type but type %s",
+ "anymultirange",
+ format_type_be(multirange_base_type))));
+ actuals->anyrange_type = multirange_typelem;
+ }
+ else
+ elog(ERROR, "could not determine polymorphic type");
+}
+
+/*
+ * Resolve actual type of ANYMULTIRANGE from other polymorphic inputs
+ */
+static void
+resolve_anymultirange_from_others(polymorphic_actuals *actuals)
+{
+ /*
+ * We can't deduce a multirange type from polymorphic array or base types,
+ * because there may be multiple range types with the same subtype, but we
+ * can deduce it from a polymorphic range type.
+ */
+ if (OidIsValid(actuals->anyrange_type))
+ {
+ Oid range_base_type = getBaseType(actuals->anyrange_type);
+ Oid multirange_typeid = get_range_multirange(range_base_type);
+
+ if (!OidIsValid(multirange_typeid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("could not find multirange type for data type %s",
+ format_type_be(actuals->anyrange_type))));
+ actuals->anymultirange_type = multirange_typeid;
+ }
+ else
+ elog(ERROR, "could not determine polymorphic type");
+}
+
+/*
+ * Given the result tuple descriptor for a function with OUT parameters,
+ * replace any polymorphic column types (ANYELEMENT etc) in the tupdesc
+ * with concrete data types deduced from the input arguments.
+ * declared_args is an oidvector of the function's declared input arg types
+ * (showing which are polymorphic), and call_expr is the call expression.
+ *
+ * Returns true if able to deduce all types, false if necessary information
+ * is not provided (call_expr is NULL or arg types aren't identifiable).
+ */
+static bool
+resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
+ Node *call_expr)
+{
+ int natts = tupdesc->natts;
+ int nargs = declared_args->dim1;
+ bool have_polymorphic_result = false;
+ bool have_anyelement_result = false;
+ bool have_anyarray_result = false;
+ bool have_anyrange_result = false;
+ bool have_anymultirange_result = false;
+ bool have_anycompatible_result = false;
+ bool have_anycompatible_array_result = false;
+ bool have_anycompatible_range_result = false;
+ bool have_anycompatible_multirange_result = false;
+ polymorphic_actuals poly_actuals;
+ polymorphic_actuals anyc_actuals;
+ Oid anycollation = InvalidOid;
+ Oid anycompatcollation = InvalidOid;
+ int i;
+
+ /* See if there are any polymorphic outputs; quick out if not */
+ for (i = 0; i < natts; i++)
+ {
+ switch (TupleDescAttr(tupdesc, i)->atttypid)
+ {
+ case ANYELEMENTOID:
+ case ANYNONARRAYOID:
+ case ANYENUMOID:
+ have_polymorphic_result = true;
+ have_anyelement_result = true;
+ break;
+ case ANYARRAYOID:
+ have_polymorphic_result = true;
+ have_anyarray_result = true;
+ break;
+ case ANYRANGEOID:
+ have_polymorphic_result = true;
+ have_anyrange_result = true;
+ break;
+ case ANYMULTIRANGEOID:
+ have_polymorphic_result = true;
+ have_anymultirange_result = true;
+ break;
+ case ANYCOMPATIBLEOID:
+ case ANYCOMPATIBLENONARRAYOID:
+ have_polymorphic_result = true;
+ have_anycompatible_result = true;
+ break;
+ case ANYCOMPATIBLEARRAYOID:
+ have_polymorphic_result = true;
+ have_anycompatible_array_result = true;
+ break;
+ case ANYCOMPATIBLERANGEOID:
+ have_polymorphic_result = true;
+ have_anycompatible_range_result = true;
+ break;
+ case ANYCOMPATIBLEMULTIRANGEOID:
+ have_polymorphic_result = true;
+ have_anycompatible_multirange_result = true;
+ break;
+ default:
+ break;
+ }
+ }
+ if (!have_polymorphic_result)
+ return true;
+
+ /*
+ * Otherwise, extract actual datatype(s) from input arguments. (We assume
+ * the parser already validated consistency of the arguments. Also, for
+ * the ANYCOMPATIBLE pseudotype family, we expect that all matching
+ * arguments were coerced to the selected common supertype, so that it
+ * doesn't matter which one's exposed type we look at.)
+ */
+ if (!call_expr)
+ return false; /* no hope */
+
+ memset(&poly_actuals, 0, sizeof(poly_actuals));
+ memset(&anyc_actuals, 0, sizeof(anyc_actuals));
+
+ for (i = 0; i < nargs; i++)
+ {
+ switch (declared_args->values[i])
+ {
+ case ANYELEMENTOID:
+ case ANYNONARRAYOID:
+ case ANYENUMOID:
+ if (!OidIsValid(poly_actuals.anyelement_type))
+ {
+ poly_actuals.anyelement_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(poly_actuals.anyelement_type))
+ return false;
+ }
+ break;
+ case ANYARRAYOID:
+ if (!OidIsValid(poly_actuals.anyarray_type))
+ {
+ poly_actuals.anyarray_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(poly_actuals.anyarray_type))
+ return false;
+ }
+ break;
+ case ANYRANGEOID:
+ if (!OidIsValid(poly_actuals.anyrange_type))
+ {
+ poly_actuals.anyrange_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(poly_actuals.anyrange_type))
+ return false;
+ }
+ break;
+ case ANYMULTIRANGEOID:
+ if (!OidIsValid(poly_actuals.anymultirange_type))
+ {
+ poly_actuals.anymultirange_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(poly_actuals.anymultirange_type))
+ return false;
+ }
+ break;
+ case ANYCOMPATIBLEOID:
+ case ANYCOMPATIBLENONARRAYOID:
+ if (!OidIsValid(anyc_actuals.anyelement_type))
+ {
+ anyc_actuals.anyelement_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(anyc_actuals.anyelement_type))
+ return false;
+ }
+ break;
+ case ANYCOMPATIBLEARRAYOID:
+ if (!OidIsValid(anyc_actuals.anyarray_type))
+ {
+ anyc_actuals.anyarray_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(anyc_actuals.anyarray_type))
+ return false;
+ }
+ break;
+ case ANYCOMPATIBLERANGEOID:
+ if (!OidIsValid(anyc_actuals.anyrange_type))
+ {
+ anyc_actuals.anyrange_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(anyc_actuals.anyrange_type))
+ return false;
+ }
+ break;
+ case ANYCOMPATIBLEMULTIRANGEOID:
+ if (!OidIsValid(anyc_actuals.anymultirange_type))
+ {
+ anyc_actuals.anymultirange_type =
+ get_call_expr_argtype(call_expr, i);
+ if (!OidIsValid(anyc_actuals.anymultirange_type))
+ return false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* If needed, deduce one polymorphic type from others */
+ if (have_anyelement_result && !OidIsValid(poly_actuals.anyelement_type))
+ resolve_anyelement_from_others(&poly_actuals);
+
+ if (have_anyarray_result && !OidIsValid(poly_actuals.anyarray_type))
+ resolve_anyarray_from_others(&poly_actuals);
+
+ if (have_anyrange_result && !OidIsValid(poly_actuals.anyrange_type))
+ resolve_anyrange_from_others(&poly_actuals);
+
+ if (have_anymultirange_result && !OidIsValid(poly_actuals.anymultirange_type))
+ resolve_anymultirange_from_others(&poly_actuals);
+
+ if (have_anycompatible_result && !OidIsValid(anyc_actuals.anyelement_type))
+ resolve_anyelement_from_others(&anyc_actuals);
+
+ if (have_anycompatible_array_result && !OidIsValid(anyc_actuals.anyarray_type))
+ resolve_anyarray_from_others(&anyc_actuals);
+
+ if (have_anycompatible_range_result && !OidIsValid(anyc_actuals.anyrange_type))
+ resolve_anyrange_from_others(&anyc_actuals);
+
+ if (have_anycompatible_multirange_result && !OidIsValid(anyc_actuals.anymultirange_type))
+ resolve_anymultirange_from_others(&anyc_actuals);
+
+ /*
+ * Identify the collation to use for polymorphic OUT parameters. (It'll
+ * necessarily be the same for both anyelement and anyarray, likewise for
+ * anycompatible and anycompatiblearray.) Note that range types are not
+ * collatable, so any possible internal collation of a range type is not
+ * considered here.
+ */
+ if (OidIsValid(poly_actuals.anyelement_type))
+ anycollation = get_typcollation(poly_actuals.anyelement_type);
+ else if (OidIsValid(poly_actuals.anyarray_type))
+ anycollation = get_typcollation(poly_actuals.anyarray_type);
+
+ if (OidIsValid(anyc_actuals.anyelement_type))
+ anycompatcollation = get_typcollation(anyc_actuals.anyelement_type);
+ else if (OidIsValid(anyc_actuals.anyarray_type))
+ anycompatcollation = get_typcollation(anyc_actuals.anyarray_type);
+
+ if (OidIsValid(anycollation) || OidIsValid(anycompatcollation))
+ {
+ /*
+ * The types are collatable, so consider whether to use a nondefault
+ * collation. We do so if we can identify the input collation used
+ * for the function.
+ */
+ Oid inputcollation = exprInputCollation(call_expr);
+
+ if (OidIsValid(inputcollation))
+ {
+ if (OidIsValid(anycollation))
+ anycollation = inputcollation;
+ if (OidIsValid(anycompatcollation))
+ anycompatcollation = inputcollation;
+ }
+ }
+
+ /* And finally replace the tuple column types as needed */
+ for (i = 0; i < natts; i++)
+ {
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ switch (att->atttypid)
+ {
+ case ANYELEMENTOID:
+ case ANYNONARRAYOID:
+ case ANYENUMOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ poly_actuals.anyelement_type,
+ -1,
+ 0);
+ TupleDescInitEntryCollation(tupdesc, i + 1, anycollation);
+ break;
+ case ANYARRAYOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ poly_actuals.anyarray_type,
+ -1,
+ 0);
+ TupleDescInitEntryCollation(tupdesc, i + 1, anycollation);
+ break;
+ case ANYRANGEOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ poly_actuals.anyrange_type,
+ -1,
+ 0);
+ /* no collation should be attached to a range type */
+ break;
+ case ANYMULTIRANGEOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ poly_actuals.anymultirange_type,
+ -1,
+ 0);
+ /* no collation should be attached to a multirange type */
+ break;
+ case ANYCOMPATIBLEOID:
+ case ANYCOMPATIBLENONARRAYOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ anyc_actuals.anyelement_type,
+ -1,
+ 0);
+ TupleDescInitEntryCollation(tupdesc, i + 1, anycompatcollation);
+ break;
+ case ANYCOMPATIBLEARRAYOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ anyc_actuals.anyarray_type,
+ -1,
+ 0);
+ TupleDescInitEntryCollation(tupdesc, i + 1, anycompatcollation);
+ break;
+ case ANYCOMPATIBLERANGEOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ anyc_actuals.anyrange_type,
+ -1,
+ 0);
+ /* no collation should be attached to a range type */
+ break;
+ case ANYCOMPATIBLEMULTIRANGEOID:
+ TupleDescInitEntry(tupdesc, i + 1,
+ NameStr(att->attname),
+ anyc_actuals.anymultirange_type,
+ -1,
+ 0);
+ /* no collation should be attached to a multirange type */
+ break;
+ default:
+ break;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Given the declared argument types and modes for a function, replace any
+ * polymorphic types (ANYELEMENT etc) in argtypes[] with concrete data types
+ * deduced from the input arguments found in call_expr.
+ *
+ * Returns true if able to deduce all types, false if necessary information
+ * is not provided (call_expr is NULL or arg types aren't identifiable).
+ *
+ * This is the same logic as resolve_polymorphic_tupdesc, but with a different
+ * argument representation, and slightly different output responsibilities.
+ *
+ * argmodes may be NULL, in which case all arguments are assumed to be IN mode.
+ */
+bool
+resolve_polymorphic_argtypes(int numargs, Oid *argtypes, char *argmodes,
+ Node *call_expr)
+{
+ bool have_polymorphic_result = false;
+ bool have_anyelement_result = false;
+ bool have_anyarray_result = false;
+ bool have_anyrange_result = false;
+ bool have_anymultirange_result = false;
+ bool have_anycompatible_result = false;
+ bool have_anycompatible_array_result = false;
+ bool have_anycompatible_range_result = false;
+ bool have_anycompatible_multirange_result = false;
+ polymorphic_actuals poly_actuals;
+ polymorphic_actuals anyc_actuals;
+ int inargno;
+ int i;
+
+ /*
+ * First pass: resolve polymorphic inputs, check for outputs. As in
+ * resolve_polymorphic_tupdesc, we rely on the parser to have enforced
+ * type consistency and coerced ANYCOMPATIBLE args to a common supertype.
+ */
+ memset(&poly_actuals, 0, sizeof(poly_actuals));
+ memset(&anyc_actuals, 0, sizeof(anyc_actuals));
+ inargno = 0;
+ for (i = 0; i < numargs; i++)
+ {
+ char argmode = argmodes ? argmodes[i] : PROARGMODE_IN;
+
+ switch (argtypes[i])
+ {
+ case ANYELEMENTOID:
+ case ANYNONARRAYOID:
+ case ANYENUMOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anyelement_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(poly_actuals.anyelement_type))
+ {
+ poly_actuals.anyelement_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(poly_actuals.anyelement_type))
+ return false;
+ }
+ argtypes[i] = poly_actuals.anyelement_type;
+ }
+ break;
+ case ANYARRAYOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anyarray_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(poly_actuals.anyarray_type))
+ {
+ poly_actuals.anyarray_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(poly_actuals.anyarray_type))
+ return false;
+ }
+ argtypes[i] = poly_actuals.anyarray_type;
+ }
+ break;
+ case ANYRANGEOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anyrange_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(poly_actuals.anyrange_type))
+ {
+ poly_actuals.anyrange_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(poly_actuals.anyrange_type))
+ return false;
+ }
+ argtypes[i] = poly_actuals.anyrange_type;
+ }
+ break;
+ case ANYMULTIRANGEOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anymultirange_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(poly_actuals.anymultirange_type))
+ {
+ poly_actuals.anymultirange_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(poly_actuals.anymultirange_type))
+ return false;
+ }
+ argtypes[i] = poly_actuals.anymultirange_type;
+ }
+ break;
+ case ANYCOMPATIBLEOID:
+ case ANYCOMPATIBLENONARRAYOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anycompatible_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(anyc_actuals.anyelement_type))
+ {
+ anyc_actuals.anyelement_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(anyc_actuals.anyelement_type))
+ return false;
+ }
+ argtypes[i] = anyc_actuals.anyelement_type;
+ }
+ break;
+ case ANYCOMPATIBLEARRAYOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anycompatible_array_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(anyc_actuals.anyarray_type))
+ {
+ anyc_actuals.anyarray_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(anyc_actuals.anyarray_type))
+ return false;
+ }
+ argtypes[i] = anyc_actuals.anyarray_type;
+ }
+ break;
+ case ANYCOMPATIBLERANGEOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anycompatible_range_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(anyc_actuals.anyrange_type))
+ {
+ anyc_actuals.anyrange_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(anyc_actuals.anyrange_type))
+ return false;
+ }
+ argtypes[i] = anyc_actuals.anyrange_type;
+ }
+ break;
+ case ANYCOMPATIBLEMULTIRANGEOID:
+ if (argmode == PROARGMODE_OUT || argmode == PROARGMODE_TABLE)
+ {
+ have_polymorphic_result = true;
+ have_anycompatible_multirange_result = true;
+ }
+ else
+ {
+ if (!OidIsValid(anyc_actuals.anymultirange_type))
+ {
+ anyc_actuals.anymultirange_type =
+ get_call_expr_argtype(call_expr, inargno);
+ if (!OidIsValid(anyc_actuals.anymultirange_type))
+ return false;
+ }
+ argtypes[i] = anyc_actuals.anymultirange_type;
+ }
+ break;
+ default:
+ break;
+ }
+ if (argmode != PROARGMODE_OUT && argmode != PROARGMODE_TABLE)
+ inargno++;
+ }
+
+ /* Done? */
+ if (!have_polymorphic_result)
+ return true;
+
+ /* If needed, deduce one polymorphic type from others */
+ if (have_anyelement_result && !OidIsValid(poly_actuals.anyelement_type))
+ resolve_anyelement_from_others(&poly_actuals);
+
+ if (have_anyarray_result && !OidIsValid(poly_actuals.anyarray_type))
+ resolve_anyarray_from_others(&poly_actuals);
+
+ if (have_anyrange_result && !OidIsValid(poly_actuals.anyrange_type))
+ resolve_anyrange_from_others(&poly_actuals);
+
+ if (have_anymultirange_result && !OidIsValid(poly_actuals.anymultirange_type))
+ resolve_anymultirange_from_others(&poly_actuals);
+
+ if (have_anycompatible_result && !OidIsValid(anyc_actuals.anyelement_type))
+ resolve_anyelement_from_others(&anyc_actuals);
+
+ if (have_anycompatible_array_result && !OidIsValid(anyc_actuals.anyarray_type))
+ resolve_anyarray_from_others(&anyc_actuals);
+
+ if (have_anycompatible_range_result && !OidIsValid(anyc_actuals.anyrange_type))
+ resolve_anyrange_from_others(&anyc_actuals);
+
+ if (have_anycompatible_multirange_result && !OidIsValid(anyc_actuals.anymultirange_type))
+ resolve_anymultirange_from_others(&anyc_actuals);
+
+ /* And finally replace the output column types as needed */
+ for (i = 0; i < numargs; i++)
+ {
+ switch (argtypes[i])
+ {
+ case ANYELEMENTOID:
+ case ANYNONARRAYOID:
+ case ANYENUMOID:
+ argtypes[i] = poly_actuals.anyelement_type;
+ break;
+ case ANYARRAYOID:
+ argtypes[i] = poly_actuals.anyarray_type;
+ break;
+ case ANYRANGEOID:
+ argtypes[i] = poly_actuals.anyrange_type;
+ break;
+ case ANYMULTIRANGEOID:
+ argtypes[i] = poly_actuals.anymultirange_type;
+ break;
+ case ANYCOMPATIBLEOID:
+ case ANYCOMPATIBLENONARRAYOID:
+ argtypes[i] = anyc_actuals.anyelement_type;
+ break;
+ case ANYCOMPATIBLEARRAYOID:
+ argtypes[i] = anyc_actuals.anyarray_type;
+ break;
+ case ANYCOMPATIBLERANGEOID:
+ argtypes[i] = anyc_actuals.anyrange_type;
+ break;
+ case ANYCOMPATIBLEMULTIRANGEOID:
+ argtypes[i] = anyc_actuals.anymultirange_type;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * get_type_func_class
+ * Given the type OID, obtain its TYPEFUNC classification.
+ * Also, if it's a domain, return the base type OID.
+ *
+ * This is intended to centralize a bunch of formerly ad-hoc code for
+ * classifying types. The categories used here are useful for deciding
+ * how to handle functions returning the datatype.
+ */
+static TypeFuncClass
+get_type_func_class(Oid typid, Oid *base_typeid)
+{
+ *base_typeid = typid;
+
+ switch (get_typtype(typid))
+ {
+ case TYPTYPE_COMPOSITE:
+ return TYPEFUNC_COMPOSITE;
+ case TYPTYPE_BASE:
+ case TYPTYPE_ENUM:
+ case TYPTYPE_RANGE:
+ case TYPTYPE_MULTIRANGE:
+ return TYPEFUNC_SCALAR;
+ case TYPTYPE_DOMAIN:
+ *base_typeid = typid = getBaseType(typid);
+ if (get_typtype(typid) == TYPTYPE_COMPOSITE)
+ return TYPEFUNC_COMPOSITE_DOMAIN;
+ else /* domain base type can't be a pseudotype */
+ return TYPEFUNC_SCALAR;
+ case TYPTYPE_PSEUDO:
+ if (typid == RECORDOID)
+ return TYPEFUNC_RECORD;
+
+ /*
+ * We treat VOID and CSTRING as legitimate scalar datatypes,
+ * mostly for the convenience of the JDBC driver (which wants to
+ * be able to do "SELECT * FROM foo()" for all legitimately
+ * user-callable functions).
+ */
+ if (typid == VOIDOID || typid == CSTRINGOID)
+ return TYPEFUNC_SCALAR;
+ return TYPEFUNC_OTHER;
+ }
+ /* shouldn't get here, probably */
+ return TYPEFUNC_OTHER;
+}
+
+
+/*
+ * get_func_arg_info
+ *
+ * Fetch info about the argument types, names, and IN/OUT modes from the
+ * pg_proc tuple. Return value is the total number of arguments.
+ * Other results are palloc'd. *p_argtypes is always filled in, but
+ * *p_argnames and *p_argmodes will be set NULL in the default cases
+ * (no names, and all IN arguments, respectively).
+ *
+ * Note that this function simply fetches what is in the pg_proc tuple;
+ * it doesn't do any interpretation of polymorphic types.
+ */
+int
+get_func_arg_info(HeapTuple procTup,
+ Oid **p_argtypes, char ***p_argnames, char **p_argmodes)
+{
+ Form_pg_proc procStruct = (Form_pg_proc) GETSTRUCT(procTup);
+ Datum proallargtypes;
+ Datum proargmodes;
+ Datum proargnames;
+ bool isNull;
+ ArrayType *arr;
+ int numargs;
+ Datum *elems;
+ int nelems;
+ int i;
+
+ /* First discover the total number of parameters and get their types */
+ proallargtypes = SysCacheGetAttr(PROCOID, procTup,
+ Anum_pg_proc_proallargtypes,
+ &isNull);
+ if (!isNull)
+ {
+ /*
+ * We expect the arrays to be 1-D arrays of the right types; verify
+ * that. For the OID and char arrays, we don't need to use
+ * deconstruct_array() since the array data is just going to look like
+ * a C array of values.
+ */
+ arr = DatumGetArrayTypeP(proallargtypes); /* ensure not toasted */
+ numargs = ARR_DIMS(arr)[0];
+ if (ARR_NDIM(arr) != 1 ||
+ numargs < 0 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != OIDOID)
+ elog(ERROR, "proallargtypes is not a 1-D Oid array or it contains nulls");
+ Assert(numargs >= procStruct->pronargs);
+ *p_argtypes = (Oid *) palloc(numargs * sizeof(Oid));
+ memcpy(*p_argtypes, ARR_DATA_PTR(arr),
+ numargs * sizeof(Oid));
+ }
+ else
+ {
+ /* If no proallargtypes, use proargtypes */
+ numargs = procStruct->proargtypes.dim1;
+ Assert(numargs == procStruct->pronargs);
+ *p_argtypes = (Oid *) palloc(numargs * sizeof(Oid));
+ memcpy(*p_argtypes, procStruct->proargtypes.values,
+ numargs * sizeof(Oid));
+ }
+
+ /* Get argument names, if available */
+ proargnames = SysCacheGetAttr(PROCOID, procTup,
+ Anum_pg_proc_proargnames,
+ &isNull);
+ if (isNull)
+ *p_argnames = NULL;
+ else
+ {
+ deconstruct_array(DatumGetArrayTypeP(proargnames),
+ TEXTOID, -1, false, TYPALIGN_INT,
+ &elems, NULL, &nelems);
+ if (nelems != numargs) /* should not happen */
+ elog(ERROR, "proargnames must have the same number of elements as the function has arguments");
+ *p_argnames = (char **) palloc(sizeof(char *) * numargs);
+ for (i = 0; i < numargs; i++)
+ (*p_argnames)[i] = TextDatumGetCString(elems[i]);
+ }
+
+ /* Get argument modes, if available */
+ proargmodes = SysCacheGetAttr(PROCOID, procTup,
+ Anum_pg_proc_proargmodes,
+ &isNull);
+ if (isNull)
+ *p_argmodes = NULL;
+ else
+ {
+ arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_DIMS(arr)[0] != numargs ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != CHAROID)
+ elog(ERROR, "proargmodes is not a 1-D char array of length %d or it contains nulls",
+ numargs);
+ *p_argmodes = (char *) palloc(numargs * sizeof(char));
+ memcpy(*p_argmodes, ARR_DATA_PTR(arr),
+ numargs * sizeof(char));
+ }
+
+ return numargs;
+}
+
+/*
+ * get_func_trftypes
+ *
+ * Returns the number of transformed types used by the function.
+ * If there are any, a palloc'd array of the type OIDs is returned
+ * into *p_trftypes.
+ */
+int
+get_func_trftypes(HeapTuple procTup,
+ Oid **p_trftypes)
+{
+ Datum protrftypes;
+ ArrayType *arr;
+ int nelems;
+ bool isNull;
+
+ protrftypes = SysCacheGetAttr(PROCOID, procTup,
+ Anum_pg_proc_protrftypes,
+ &isNull);
+ if (!isNull)
+ {
+ /*
+ * We expect the arrays to be 1-D arrays of the right types; verify
+ * that. For the OID and char arrays, we don't need to use
+ * deconstruct_array() since the array data is just going to look like
+ * a C array of values.
+ */
+ arr = DatumGetArrayTypeP(protrftypes); /* ensure not toasted */
+ nelems = ARR_DIMS(arr)[0];
+ if (ARR_NDIM(arr) != 1 ||
+ nelems < 0 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != OIDOID)
+ elog(ERROR, "protrftypes is not a 1-D Oid array or it contains nulls");
+ *p_trftypes = (Oid *) palloc(nelems * sizeof(Oid));
+ memcpy(*p_trftypes, ARR_DATA_PTR(arr),
+ nelems * sizeof(Oid));
+
+ return nelems;
+ }
+ else
+ return 0;
+}
+
+/*
+ * get_func_input_arg_names
+ *
+ * Extract the names of input arguments only, given a function's
+ * proargnames and proargmodes entries in Datum form.
+ *
+ * Returns the number of input arguments, which is the length of the
+ * palloc'd array returned to *arg_names. Entries for unnamed args
+ * are set to NULL. You don't get anything if proargnames is NULL.
+ */
+int
+get_func_input_arg_names(Datum proargnames, Datum proargmodes,
+ char ***arg_names)
+{
+ ArrayType *arr;
+ int numargs;
+ Datum *argnames;
+ char *argmodes;
+ char **inargnames;
+ int numinargs;
+ int i;
+
+ /* Do nothing if null proargnames */
+ if (proargnames == PointerGetDatum(NULL))
+ {
+ *arg_names = NULL;
+ return 0;
+ }
+
+ /*
+ * We expect the arrays to be 1-D arrays of the right types; verify that.
+ * For proargmodes, we don't need to use deconstruct_array() since the
+ * array data is just going to look like a C array of values.
+ */
+ arr = DatumGetArrayTypeP(proargnames); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != TEXTOID)
+ elog(ERROR, "proargnames is not a 1-D text array or it contains nulls");
+ deconstruct_array(arr, TEXTOID, -1, false, TYPALIGN_INT,
+ &argnames, NULL, &numargs);
+ if (proargmodes != PointerGetDatum(NULL))
+ {
+ arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_DIMS(arr)[0] != numargs ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != CHAROID)
+ elog(ERROR, "proargmodes is not a 1-D char array of length %d or it contains nulls",
+ numargs);
+ argmodes = (char *) ARR_DATA_PTR(arr);
+ }
+ else
+ argmodes = NULL;
+
+ /* zero elements probably shouldn't happen, but handle it gracefully */
+ if (numargs <= 0)
+ {
+ *arg_names = NULL;
+ return 0;
+ }
+
+ /* extract input-argument names */
+ inargnames = (char **) palloc(numargs * sizeof(char *));
+ numinargs = 0;
+ for (i = 0; i < numargs; i++)
+ {
+ if (argmodes == NULL ||
+ argmodes[i] == PROARGMODE_IN ||
+ argmodes[i] == PROARGMODE_INOUT ||
+ argmodes[i] == PROARGMODE_VARIADIC)
+ {
+ char *pname = TextDatumGetCString(argnames[i]);
+
+ if (pname[0] != '\0')
+ inargnames[numinargs] = pname;
+ else
+ inargnames[numinargs] = NULL;
+ numinargs++;
+ }
+ }
+
+ *arg_names = inargnames;
+ return numinargs;
+}
+
+
+/*
+ * get_func_result_name
+ *
+ * If the function has exactly one output parameter, and that parameter
+ * is named, return the name (as a palloc'd string). Else return NULL.
+ *
+ * This is used to determine the default output column name for functions
+ * returning scalar types.
+ */
+char *
+get_func_result_name(Oid functionId)
+{
+ char *result;
+ HeapTuple procTuple;
+ Datum proargmodes;
+ Datum proargnames;
+ bool isnull;
+ ArrayType *arr;
+ int numargs;
+ char *argmodes;
+ Datum *argnames;
+ int numoutargs;
+ int nargnames;
+ int i;
+
+ /* First fetch the function's pg_proc row */
+ procTuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(functionId));
+ if (!HeapTupleIsValid(procTuple))
+ elog(ERROR, "cache lookup failed for function %u", functionId);
+
+ /* If there are no named OUT parameters, return NULL */
+ if (heap_attisnull(procTuple, Anum_pg_proc_proargmodes, NULL) ||
+ heap_attisnull(procTuple, Anum_pg_proc_proargnames, NULL))
+ result = NULL;
+ else
+ {
+ /* Get the data out of the tuple */
+ proargmodes = SysCacheGetAttr(PROCOID, procTuple,
+ Anum_pg_proc_proargmodes,
+ &isnull);
+ Assert(!isnull);
+ proargnames = SysCacheGetAttr(PROCOID, procTuple,
+ Anum_pg_proc_proargnames,
+ &isnull);
+ Assert(!isnull);
+
+ /*
+ * We expect the arrays to be 1-D arrays of the right types; verify
+ * that. For the char array, we don't need to use deconstruct_array()
+ * since the array data is just going to look like a C array of
+ * values.
+ */
+ arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
+ numargs = ARR_DIMS(arr)[0];
+ if (ARR_NDIM(arr) != 1 ||
+ numargs < 0 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != CHAROID)
+ elog(ERROR, "proargmodes is not a 1-D char array or it contains nulls");
+ argmodes = (char *) ARR_DATA_PTR(arr);
+ arr = DatumGetArrayTypeP(proargnames); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_DIMS(arr)[0] != numargs ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != TEXTOID)
+ elog(ERROR, "proargnames is not a 1-D text array of length %d or it contains nulls",
+ numargs);
+ deconstruct_array(arr, TEXTOID, -1, false, TYPALIGN_INT,
+ &argnames, NULL, &nargnames);
+ Assert(nargnames == numargs);
+
+ /* scan for output argument(s) */
+ result = NULL;
+ numoutargs = 0;
+ for (i = 0; i < numargs; i++)
+ {
+ if (argmodes[i] == PROARGMODE_IN ||
+ argmodes[i] == PROARGMODE_VARIADIC)
+ continue;
+ Assert(argmodes[i] == PROARGMODE_OUT ||
+ argmodes[i] == PROARGMODE_INOUT ||
+ argmodes[i] == PROARGMODE_TABLE);
+ if (++numoutargs > 1)
+ {
+ /* multiple out args, so forget it */
+ result = NULL;
+ break;
+ }
+ result = TextDatumGetCString(argnames[i]);
+ if (result == NULL || result[0] == '\0')
+ {
+ /* Parameter is not named, so forget it */
+ result = NULL;
+ break;
+ }
+ }
+ }
+
+ ReleaseSysCache(procTuple);
+
+ return result;
+}
+
+
+/*
+ * build_function_result_tupdesc_t
+ *
+ * Given a pg_proc row for a function, return a tuple descriptor for the
+ * result rowtype, or NULL if the function does not have OUT parameters.
+ *
+ * Note that this does not handle resolution of polymorphic types;
+ * that is deliberate.
+ */
+TupleDesc
+build_function_result_tupdesc_t(HeapTuple procTuple)
+{
+ Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(procTuple);
+ Datum proallargtypes;
+ Datum proargmodes;
+ Datum proargnames;
+ bool isnull;
+
+ /* Return NULL if the function isn't declared to return RECORD */
+ if (procform->prorettype != RECORDOID)
+ return NULL;
+
+ /* If there are no OUT parameters, return NULL */
+ if (heap_attisnull(procTuple, Anum_pg_proc_proallargtypes, NULL) ||
+ heap_attisnull(procTuple, Anum_pg_proc_proargmodes, NULL))
+ return NULL;
+
+ /* Get the data out of the tuple */
+ proallargtypes = SysCacheGetAttr(PROCOID, procTuple,
+ Anum_pg_proc_proallargtypes,
+ &isnull);
+ Assert(!isnull);
+ proargmodes = SysCacheGetAttr(PROCOID, procTuple,
+ Anum_pg_proc_proargmodes,
+ &isnull);
+ Assert(!isnull);
+ proargnames = SysCacheGetAttr(PROCOID, procTuple,
+ Anum_pg_proc_proargnames,
+ &isnull);
+ if (isnull)
+ proargnames = PointerGetDatum(NULL); /* just to be sure */
+
+ return build_function_result_tupdesc_d(procform->prokind,
+ proallargtypes,
+ proargmodes,
+ proargnames);
+}
+
+/*
+ * build_function_result_tupdesc_d
+ *
+ * Build a RECORD function's tupledesc from the pg_proc proallargtypes,
+ * proargmodes, and proargnames arrays. This is split out for the
+ * convenience of ProcedureCreate, which needs to be able to compute the
+ * tupledesc before actually creating the function.
+ *
+ * For functions (but not for procedures), returns NULL if there are not at
+ * least two OUT or INOUT arguments.
+ */
+TupleDesc
+build_function_result_tupdesc_d(char prokind,
+ Datum proallargtypes,
+ Datum proargmodes,
+ Datum proargnames)
+{
+ TupleDesc desc;
+ ArrayType *arr;
+ int numargs;
+ Oid *argtypes;
+ char *argmodes;
+ Datum *argnames = NULL;
+ Oid *outargtypes;
+ char **outargnames;
+ int numoutargs;
+ int nargnames;
+ int i;
+
+ /* Can't have output args if columns are null */
+ if (proallargtypes == PointerGetDatum(NULL) ||
+ proargmodes == PointerGetDatum(NULL))
+ return NULL;
+
+ /*
+ * We expect the arrays to be 1-D arrays of the right types; verify that.
+ * For the OID and char arrays, we don't need to use deconstruct_array()
+ * since the array data is just going to look like a C array of values.
+ */
+ arr = DatumGetArrayTypeP(proallargtypes); /* ensure not toasted */
+ numargs = ARR_DIMS(arr)[0];
+ if (ARR_NDIM(arr) != 1 ||
+ numargs < 0 ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != OIDOID)
+ elog(ERROR, "proallargtypes is not a 1-D Oid array or it contains nulls");
+ argtypes = (Oid *) ARR_DATA_PTR(arr);
+ arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_DIMS(arr)[0] != numargs ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != CHAROID)
+ elog(ERROR, "proargmodes is not a 1-D char array of length %d or it contains nulls",
+ numargs);
+ argmodes = (char *) ARR_DATA_PTR(arr);
+ if (proargnames != PointerGetDatum(NULL))
+ {
+ arr = DatumGetArrayTypeP(proargnames); /* ensure not toasted */
+ if (ARR_NDIM(arr) != 1 ||
+ ARR_DIMS(arr)[0] != numargs ||
+ ARR_HASNULL(arr) ||
+ ARR_ELEMTYPE(arr) != TEXTOID)
+ elog(ERROR, "proargnames is not a 1-D text array of length %d or it contains nulls",
+ numargs);
+ deconstruct_array(arr, TEXTOID, -1, false, TYPALIGN_INT,
+ &argnames, NULL, &nargnames);
+ Assert(nargnames == numargs);
+ }
+
+ /* zero elements probably shouldn't happen, but handle it gracefully */
+ if (numargs <= 0)
+ return NULL;
+
+ /* extract output-argument types and names */
+ outargtypes = (Oid *) palloc(numargs * sizeof(Oid));
+ outargnames = (char **) palloc(numargs * sizeof(char *));
+ numoutargs = 0;
+ for (i = 0; i < numargs; i++)
+ {
+ char *pname;
+
+ if (argmodes[i] == PROARGMODE_IN ||
+ argmodes[i] == PROARGMODE_VARIADIC)
+ continue;
+ Assert(argmodes[i] == PROARGMODE_OUT ||
+ argmodes[i] == PROARGMODE_INOUT ||
+ argmodes[i] == PROARGMODE_TABLE);
+ outargtypes[numoutargs] = argtypes[i];
+ if (argnames)
+ pname = TextDatumGetCString(argnames[i]);
+ else
+ pname = NULL;
+ if (pname == NULL || pname[0] == '\0')
+ {
+ /* Parameter is not named, so gin up a column name */
+ pname = psprintf("column%d", numoutargs + 1);
+ }
+ outargnames[numoutargs] = pname;
+ numoutargs++;
+ }
+
+ /*
+ * If there is no output argument, or only one, the function does not
+ * return tuples.
+ */
+ if (numoutargs < 2 && prokind != PROKIND_PROCEDURE)
+ return NULL;
+
+ desc = CreateTemplateTupleDesc(numoutargs);
+ for (i = 0; i < numoutargs; i++)
+ {
+ TupleDescInitEntry(desc, i + 1,
+ outargnames[i],
+ outargtypes[i],
+ -1,
+ 0);
+ }
+
+ return desc;
+}
+
+
+/*
+ * RelationNameGetTupleDesc
+ *
+ * Given a (possibly qualified) relation name, build a TupleDesc.
+ *
+ * Note: while this works as advertised, it's seldom the best way to
+ * build a tupdesc for a function's result type. It's kept around
+ * only for backwards compatibility with existing user-written code.
+ */
+TupleDesc
+RelationNameGetTupleDesc(const char *relname)
+{
+ RangeVar *relvar;
+ Relation rel;
+ TupleDesc tupdesc;
+ List *relname_list;
+
+ /* Open relation and copy the tuple description */
+ relname_list = stringToQualifiedNameList(relname);
+ relvar = makeRangeVarFromNameList(relname_list);
+ rel = relation_openrv(relvar, AccessShareLock);
+ tupdesc = CreateTupleDescCopy(RelationGetDescr(rel));
+ relation_close(rel, AccessShareLock);
+
+ return tupdesc;
+}
+
+/*
+ * TypeGetTupleDesc
+ *
+ * Given a type Oid, build a TupleDesc. (In most cases you should be
+ * using get_call_result_type or one of its siblings instead of this
+ * routine, so that you can handle OUT parameters, RECORD result type,
+ * and polymorphic results.)
+ *
+ * If the type is composite, *and* a colaliases List is provided, *and*
+ * the List is of natts length, use the aliases instead of the relation
+ * attnames. (NB: this usage is deprecated since it may result in
+ * creation of unnecessary transient record types.)
+ *
+ * If the type is a base type, a single item alias List is required.
+ */
+TupleDesc
+TypeGetTupleDesc(Oid typeoid, List *colaliases)
+{
+ Oid base_typeoid;
+ TypeFuncClass functypclass = get_type_func_class(typeoid, &base_typeoid);
+ TupleDesc tupdesc = NULL;
+
+ /*
+ * Build a suitable tupledesc representing the output rows. We
+ * intentionally do not support TYPEFUNC_COMPOSITE_DOMAIN here, as it's
+ * unlikely that legacy callers of this obsolete function would be
+ * prepared to apply domain constraints.
+ */
+ if (functypclass == TYPEFUNC_COMPOSITE)
+ {
+ /* Composite data type, e.g. a table's row type */
+ tupdesc = lookup_rowtype_tupdesc_copy(base_typeoid, -1);
+
+ if (colaliases != NIL)
+ {
+ int natts = tupdesc->natts;
+ int varattno;
+
+ /* does the list length match the number of attributes? */
+ if (list_length(colaliases) != natts)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("number of aliases does not match number of columns")));
+
+ /* OK, use the aliases instead */
+ for (varattno = 0; varattno < natts; varattno++)
+ {
+ char *label = strVal(list_nth(colaliases, varattno));
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, varattno);
+
+ if (label != NULL)
+ namestrcpy(&(attr->attname), label);
+ }
+
+ /* The tuple type is now an anonymous record type */
+ tupdesc->tdtypeid = RECORDOID;
+ tupdesc->tdtypmod = -1;
+ }
+ }
+ else if (functypclass == TYPEFUNC_SCALAR)
+ {
+ /* Base data type, i.e. scalar */
+ char *attname;
+
+ /* the alias list is required for base types */
+ if (colaliases == NIL)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("no column alias was provided")));
+
+ /* the alias list length must be 1 */
+ if (list_length(colaliases) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("number of aliases does not match number of columns")));
+
+ /* OK, get the column alias */
+ attname = strVal(linitial(colaliases));
+
+ tupdesc = CreateTemplateTupleDesc(1);
+ TupleDescInitEntry(tupdesc,
+ (AttrNumber) 1,
+ attname,
+ typeoid,
+ -1,
+ 0);
+ }
+ else if (functypclass == TYPEFUNC_RECORD)
+ {
+ /* XXX can't support this because typmod wasn't passed in ... */
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("could not determine row description for function returning record")));
+ }
+ else
+ {
+ /* crummy error message, but parser should have caught this */
+ elog(ERROR, "function in FROM has unsupported return type");
+ }
+
+ return tupdesc;
+}
+
+/*
+ * extract_variadic_args
+ *
+ * Extract a set of argument values, types and NULL markers for a given
+ * input function which makes use of a VARIADIC input whose argument list
+ * depends on the caller context. When doing a VARIADIC call, the caller
+ * has provided one argument made of an array of values, so deconstruct the
+ * array data before using it for the next processing. If no VARIADIC call
+ * is used, just fill in the status data based on all the arguments given
+ * by the caller.
+ *
+ * This function returns the number of arguments generated, or -1 in the
+ * case of "VARIADIC NULL".
+ */
+int
+extract_variadic_args(FunctionCallInfo fcinfo, int variadic_start,
+ bool convert_unknown, Datum **args, Oid **types,
+ bool **nulls)
+{
+ bool variadic = get_fn_expr_variadic(fcinfo->flinfo);
+ Datum *args_res;
+ bool *nulls_res;
+ Oid *types_res;
+ int nargs,
+ i;
+
+ *args = NULL;
+ *types = NULL;
+ *nulls = NULL;
+
+ if (variadic)
+ {
+ ArrayType *array_in;
+ Oid element_type;
+ bool typbyval;
+ char typalign;
+ int16 typlen;
+
+ Assert(PG_NARGS() == variadic_start + 1);
+
+ if (PG_ARGISNULL(variadic_start))
+ return -1;
+
+ array_in = PG_GETARG_ARRAYTYPE_P(variadic_start);
+ element_type = ARR_ELEMTYPE(array_in);
+
+ get_typlenbyvalalign(element_type,
+ &typlen, &typbyval, &typalign);
+ deconstruct_array(array_in, element_type, typlen, typbyval,
+ typalign, &args_res, &nulls_res,
+ &nargs);
+
+ /* All the elements of the array have the same type */
+ types_res = (Oid *) palloc0(nargs * sizeof(Oid));
+ for (i = 0; i < nargs; i++)
+ types_res[i] = element_type;
+ }
+ else
+ {
+ nargs = PG_NARGS() - variadic_start;
+ Assert(nargs > 0);
+ nulls_res = (bool *) palloc0(nargs * sizeof(bool));
+ args_res = (Datum *) palloc0(nargs * sizeof(Datum));
+ types_res = (Oid *) palloc0(nargs * sizeof(Oid));
+
+ for (i = 0; i < nargs; i++)
+ {
+ nulls_res[i] = PG_ARGISNULL(i + variadic_start);
+ types_res[i] = get_fn_expr_argtype(fcinfo->flinfo,
+ i + variadic_start);
+
+ /*
+ * Turn a constant (more or less literal) value that's of unknown
+ * type into text if required. Unknowns come in as a cstring
+ * pointer. Note: for functions declared as taking type "any", the
+ * parser will not do any type conversion on unknown-type literals
+ * (that is, undecorated strings or NULLs).
+ */
+ if (convert_unknown &&
+ types_res[i] == UNKNOWNOID &&
+ get_fn_expr_arg_stable(fcinfo->flinfo, i + variadic_start))
+ {
+ types_res[i] = TEXTOID;
+
+ if (PG_ARGISNULL(i + variadic_start))
+ args_res[i] = (Datum) 0;
+ else
+ args_res[i] =
+ CStringGetTextDatum(PG_GETARG_POINTER(i + variadic_start));
+ }
+ else
+ {
+ /* no conversion needed, just take the datum as given */
+ args_res[i] = PG_GETARG_DATUM(i + variadic_start);
+ }
+
+ if (!OidIsValid(types_res[i]) ||
+ (convert_unknown && types_res[i] == UNKNOWNOID))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not determine data type for argument %d",
+ i + 1)));
+ }
+ }
+
+ /* Fill in results */
+ *args = args_res;
+ *nulls = nulls_res;
+ *types = types_res;
+
+ return nargs;
+}
diff --git a/src/backend/utils/fmgroids.h b/src/backend/utils/fmgroids.h
new file mode 100644
index 0000000..4cbc374
--- /dev/null
+++ b/src/backend/utils/fmgroids.h
@@ -0,0 +1,3261 @@
+/*-------------------------------------------------------------------------
+ *
+ * fmgroids.h
+ * Macros that define the OIDs of built-in functions.
+ *
+ * These macros can be used to avoid a catalog lookup when a specific
+ * fmgr-callable function needs to be referenced.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FMGROIDS_H
+#define FMGROIDS_H
+
+/*
+ * Constant macros for the OIDs of entries in pg_proc.
+ *
+ * F_XXX macros are named after the proname field; if that is not unique,
+ * we append the proargtypes field, replacing spaces with underscores.
+ * For example, we have F_OIDEQ because that proname is unique, but
+ * F_POW_FLOAT8_FLOAT8 (among others) because that proname is not.
+ */
+#define F_HEAP_TABLEAM_HANDLER 3
+#define F_BYTEAOUT 31
+#define F_CHAROUT 33
+#define F_NAMEIN 34
+#define F_NAMEOUT 35
+#define F_INT2IN 38
+#define F_INT2OUT 39
+#define F_INT2VECTORIN 40
+#define F_INT2VECTOROUT 41
+#define F_INT4IN 42
+#define F_INT4OUT 43
+#define F_REGPROCIN 44
+#define F_REGPROCOUT 45
+#define F_TEXTIN 46
+#define F_TEXTOUT 47
+#define F_TIDIN 48
+#define F_TIDOUT 49
+#define F_XIDIN 50
+#define F_XIDOUT 51
+#define F_CIDIN 52
+#define F_CIDOUT 53
+#define F_OIDVECTORIN 54
+#define F_OIDVECTOROUT 55
+#define F_BOOLLT 56
+#define F_BOOLGT 57
+#define F_BOOLEQ 60
+#define F_CHAREQ 61
+#define F_NAMEEQ 62
+#define F_INT2EQ 63
+#define F_INT2LT 64
+#define F_INT4EQ 65
+#define F_INT4LT 66
+#define F_TEXTEQ 67
+#define F_XIDEQ 68
+#define F_CIDEQ 69
+#define F_CHARNE 70
+#define F_CHARLE 72
+#define F_CHARGT 73
+#define F_CHARGE 74
+#define F_INT4_CHAR 77
+#define F_CHAR_INT4 78
+#define F_NAMEREGEXEQ 79
+#define F_BOOLNE 84
+#define F_PG_DDL_COMMAND_IN 86
+#define F_PG_DDL_COMMAND_OUT 87
+#define F_PG_DDL_COMMAND_RECV 88
+#define F_VERSION 89
+#define F_PG_DDL_COMMAND_SEND 90
+#define F_EQSEL 101
+#define F_NEQSEL 102
+#define F_SCALARLTSEL 103
+#define F_SCALARGTSEL 104
+#define F_EQJOINSEL 105
+#define F_NEQJOINSEL 106
+#define F_SCALARLTJOINSEL 107
+#define F_SCALARGTJOINSEL 108
+#define F_UNKNOWNIN 109
+#define F_UNKNOWNOUT 110
+#define F_BOX_ABOVE_EQ 115
+#define F_BOX_BELOW_EQ 116
+#define F_POINT_IN 117
+#define F_POINT_OUT 118
+#define F_LSEG_IN 119
+#define F_LSEG_OUT 120
+#define F_PATH_IN 121
+#define F_PATH_OUT 122
+#define F_BOX_IN 123
+#define F_BOX_OUT 124
+#define F_BOX_OVERLAP 125
+#define F_BOX_GE 126
+#define F_BOX_GT 127
+#define F_BOX_EQ 128
+#define F_BOX_LT 129
+#define F_BOX_LE 130
+#define F_POINT_ABOVE 131
+#define F_POINT_LEFT 132
+#define F_POINT_RIGHT 133
+#define F_POINT_BELOW 134
+#define F_POINT_EQ 135
+#define F_ON_PB 136
+#define F_ON_PPATH 137
+#define F_BOX_CENTER 138
+#define F_AREASEL 139
+#define F_AREAJOINSEL 140
+#define F_INT4MUL 141
+#define F_INT4NE 144
+#define F_INT2NE 145
+#define F_INT2GT 146
+#define F_INT4GT 147
+#define F_INT2LE 148
+#define F_INT4LE 149
+#define F_INT4GE 150
+#define F_INT2GE 151
+#define F_INT2MUL 152
+#define F_INT2DIV 153
+#define F_INT4DIV 154
+#define F_INT2MOD 155
+#define F_INT4MOD 156
+#define F_TEXTNE 157
+#define F_INT24EQ 158
+#define F_INT42EQ 159
+#define F_INT24LT 160
+#define F_INT42LT 161
+#define F_INT24GT 162
+#define F_INT42GT 163
+#define F_INT24NE 164
+#define F_INT42NE 165
+#define F_INT24LE 166
+#define F_INT42LE 167
+#define F_INT24GE 168
+#define F_INT42GE 169
+#define F_INT24MUL 170
+#define F_INT42MUL 171
+#define F_INT24DIV 172
+#define F_INT42DIV 173
+#define F_INT2PL 176
+#define F_INT4PL 177
+#define F_INT24PL 178
+#define F_INT42PL 179
+#define F_INT2MI 180
+#define F_INT4MI 181
+#define F_INT24MI 182
+#define F_INT42MI 183
+#define F_OIDEQ 184
+#define F_OIDNE 185
+#define F_BOX_SAME 186
+#define F_BOX_CONTAIN 187
+#define F_BOX_LEFT 188
+#define F_BOX_OVERLEFT 189
+#define F_BOX_OVERRIGHT 190
+#define F_BOX_RIGHT 191
+#define F_BOX_CONTAINED 192
+#define F_BOX_CONTAIN_PT 193
+#define F_PG_NODE_TREE_IN 195
+#define F_PG_NODE_TREE_OUT 196
+#define F_PG_NODE_TREE_RECV 197
+#define F_PG_NODE_TREE_SEND 198
+#define F_FLOAT4IN 200
+#define F_FLOAT4OUT 201
+#define F_FLOAT4MUL 202
+#define F_FLOAT4DIV 203
+#define F_FLOAT4PL 204
+#define F_FLOAT4MI 205
+#define F_FLOAT4UM 206
+#define F_FLOAT4ABS 207
+#define F_FLOAT4_ACCUM 208
+#define F_FLOAT4LARGER 209
+#define F_FLOAT4SMALLER 211
+#define F_INT4UM 212
+#define F_INT2UM 213
+#define F_FLOAT8IN 214
+#define F_FLOAT8OUT 215
+#define F_FLOAT8MUL 216
+#define F_FLOAT8DIV 217
+#define F_FLOAT8PL 218
+#define F_FLOAT8MI 219
+#define F_FLOAT8UM 220
+#define F_FLOAT8ABS 221
+#define F_FLOAT8_ACCUM 222
+#define F_FLOAT8LARGER 223
+#define F_FLOAT8SMALLER 224
+#define F_LSEG_CENTER 225
+#define F_POLY_CENTER 227
+#define F_DROUND 228
+#define F_DTRUNC 229
+#define F_DSQRT 230
+#define F_DCBRT 231
+#define F_DPOW 232
+#define F_DEXP 233
+#define F_DLOG1 234
+#define F_FLOAT8_INT2 235
+#define F_FLOAT4_INT2 236
+#define F_INT2_FLOAT8 237
+#define F_INT2_FLOAT4 238
+#define F_LINE_DISTANCE 239
+#define F_NAMEEQTEXT 240
+#define F_NAMELTTEXT 241
+#define F_NAMELETEXT 242
+#define F_NAMEGETEXT 243
+#define F_NAMEGTTEXT 244
+#define F_NAMENETEXT 245
+#define F_BTNAMETEXTCMP 246
+#define F_TEXTEQNAME 247
+#define F_TEXTLTNAME 248
+#define F_TEXTLENAME 249
+#define F_TEXTGENAME 250
+#define F_TEXTGTNAME 251
+#define F_TEXTNENAME 252
+#define F_BTTEXTNAMECMP 253
+#define F_NAMECONCATOID 266
+#define F_TABLE_AM_HANDLER_IN 267
+#define F_TABLE_AM_HANDLER_OUT 268
+#define F_TIMEOFDAY 274
+#define F_PG_NEXTOID 275
+#define F_FLOAT8_COMBINE 276
+#define F_INTER_SL 277
+#define F_INTER_LB 278
+#define F_FLOAT48MUL 279
+#define F_FLOAT48DIV 280
+#define F_FLOAT48PL 281
+#define F_FLOAT48MI 282
+#define F_FLOAT84MUL 283
+#define F_FLOAT84DIV 284
+#define F_FLOAT84PL 285
+#define F_FLOAT84MI 286
+#define F_FLOAT4EQ 287
+#define F_FLOAT4NE 288
+#define F_FLOAT4LT 289
+#define F_FLOAT4LE 290
+#define F_FLOAT4GT 291
+#define F_FLOAT4GE 292
+#define F_FLOAT8EQ 293
+#define F_FLOAT8NE 294
+#define F_FLOAT8LT 295
+#define F_FLOAT8LE 296
+#define F_FLOAT8GT 297
+#define F_FLOAT8GE 298
+#define F_FLOAT48EQ 299
+#define F_FLOAT48NE 300
+#define F_FLOAT48LT 301
+#define F_FLOAT48LE 302
+#define F_FLOAT48GT 303
+#define F_FLOAT48GE 304
+#define F_FLOAT84EQ 305
+#define F_FLOAT84NE 306
+#define F_FLOAT84LT 307
+#define F_FLOAT84LE 308
+#define F_FLOAT84GT 309
+#define F_FLOAT84GE 310
+#define F_FLOAT8_FLOAT4 311
+#define F_FLOAT4_FLOAT8 312
+#define F_INT4_INT2 313
+#define F_INT2_INT4 314
+#define F_PG_JIT_AVAILABLE 315
+#define F_FLOAT8_INT4 316
+#define F_INT4_FLOAT8 317
+#define F_FLOAT4_INT4 318
+#define F_INT4_FLOAT4 319
+#define F_WIDTH_BUCKET_FLOAT8_FLOAT8_FLOAT8_INT4 320
+#define F_JSON_IN 321
+#define F_JSON_OUT 322
+#define F_JSON_RECV 323
+#define F_JSON_SEND 324
+#define F_INDEX_AM_HANDLER_IN 326
+#define F_INDEX_AM_HANDLER_OUT 327
+#define F_HASHMACADDR8 328
+#define F_HASH_ACLITEM 329
+#define F_BTHANDLER 330
+#define F_HASHHANDLER 331
+#define F_GISTHANDLER 332
+#define F_GINHANDLER 333
+#define F_SPGHANDLER 334
+#define F_BRINHANDLER 335
+#define F_SCALARLESEL 336
+#define F_SCALARGESEL 337
+#define F_AMVALIDATE 338
+#define F_POLY_SAME 339
+#define F_POLY_CONTAIN 340
+#define F_POLY_LEFT 341
+#define F_POLY_OVERLEFT 342
+#define F_POLY_OVERRIGHT 343
+#define F_POLY_RIGHT 344
+#define F_POLY_CONTAINED 345
+#define F_POLY_OVERLAP 346
+#define F_POLY_IN 347
+#define F_POLY_OUT 348
+#define F_BTINT2CMP 350
+#define F_BTINT4CMP 351
+#define F_BTFLOAT4CMP 354
+#define F_BTFLOAT8CMP 355
+#define F_BTOIDCMP 356
+#define F_DIST_BP 357
+#define F_BTCHARCMP 358
+#define F_BTNAMECMP 359
+#define F_BTTEXTCMP 360
+#define F_LSEG_DISTANCE 361
+#define F_LSEG_INTERPT 362
+#define F_DIST_PS 363
+#define F_DIST_PB 364
+#define F_DIST_SB 365
+#define F_CLOSE_PS 366
+#define F_CLOSE_PB 367
+#define F_CLOSE_SB 368
+#define F_ON_PS 369
+#define F_PATH_DISTANCE 370
+#define F_DIST_PPATH 371
+#define F_ON_SB 372
+#define F_INTER_SB 373
+#define F_STRING_TO_ARRAY_TEXT_TEXT_TEXT 376
+#define F_CASH_CMP 377
+#define F_ARRAY_APPEND 378
+#define F_ARRAY_PREPEND 379
+#define F_DIST_SP 380
+#define F_DIST_BS 381
+#define F_BTARRAYCMP 382
+#define F_ARRAY_CAT 383
+#define F_ARRAY_TO_STRING_ANYARRAY_TEXT_TEXT 384
+#define F_SCALARLEJOINSEL 386
+#define F_ARRAY_NE 390
+#define F_ARRAY_LT 391
+#define F_ARRAY_GT 392
+#define F_ARRAY_LE 393
+#define F_STRING_TO_ARRAY_TEXT_TEXT 394
+#define F_ARRAY_TO_STRING_ANYARRAY_TEXT 395
+#define F_ARRAY_GE 396
+#define F_SCALARGEJOINSEL 398
+#define F_HASHMACADDR 399
+#define F_HASHTEXT 400
+#define F_TEXT_BPCHAR 401
+#define F_BTOIDVECTORCMP 404
+#define F_TEXT_NAME 406
+#define F_NAME_TEXT 407
+#define F_BPCHAR_NAME 408
+#define F_NAME_BPCHAR 409
+#define F_DIST_PATHP 421
+#define F_HASHINET 422
+#define F_HASHINT4EXTENDED 425
+#define F_HASH_NUMERIC 432
+#define F_MACADDR_IN 436
+#define F_MACADDR_OUT 437
+#define F_NUM_NULLS 438
+#define F_NUM_NONNULLS 440
+#define F_HASHINT2EXTENDED 441
+#define F_HASHINT8EXTENDED 442
+#define F_HASHFLOAT4EXTENDED 443
+#define F_HASHFLOAT8EXTENDED 444
+#define F_HASHOIDEXTENDED 445
+#define F_HASHCHAREXTENDED 446
+#define F_HASHNAMEEXTENDED 447
+#define F_HASHTEXTEXTENDED 448
+#define F_HASHINT2 449
+#define F_HASHINT4 450
+#define F_HASHFLOAT4 451
+#define F_HASHFLOAT8 452
+#define F_HASHOID 453
+#define F_HASHCHAR 454
+#define F_HASHNAME 455
+#define F_HASHVARLENA 456
+#define F_HASHOIDVECTOR 457
+#define F_TEXT_LARGER 458
+#define F_TEXT_SMALLER 459
+#define F_INT8IN 460
+#define F_INT8OUT 461
+#define F_INT8UM 462
+#define F_INT8PL 463
+#define F_INT8MI 464
+#define F_INT8MUL 465
+#define F_INT8DIV 466
+#define F_INT8EQ 467
+#define F_INT8NE 468
+#define F_INT8LT 469
+#define F_INT8GT 470
+#define F_INT8LE 471
+#define F_INT8GE 472
+#define F_INT84EQ 474
+#define F_INT84NE 475
+#define F_INT84LT 476
+#define F_INT84GT 477
+#define F_INT84LE 478
+#define F_INT84GE 479
+#define F_INT4_INT8 480
+#define F_INT8_INT4 481
+#define F_FLOAT8_INT8 482
+#define F_INT8_FLOAT8 483
+#define F_ARRAY_LARGER 515
+#define F_ARRAY_SMALLER 516
+#define F_ABBREV_INET 598
+#define F_ABBREV_CIDR 599
+#define F_SET_MASKLEN_INET_INT4 605
+#define F_OIDVECTORNE 619
+#define F_HASH_ARRAY 626
+#define F_SET_MASKLEN_CIDR_INT4 635
+#define F_PG_INDEXAM_HAS_PROPERTY 636
+#define F_PG_INDEX_HAS_PROPERTY 637
+#define F_PG_INDEX_COLUMN_HAS_PROPERTY 638
+#define F_FLOAT4_INT8 652
+#define F_INT8_FLOAT4 653
+#define F_NAMELT 655
+#define F_NAMELE 656
+#define F_NAMEGT 657
+#define F_NAMEGE 658
+#define F_NAMENE 659
+#define F_BPCHAR_BPCHAR_INT4_BOOL 668
+#define F_VARCHAR_VARCHAR_INT4_BOOL 669
+#define F_PG_INDEXAM_PROGRESS_PHASENAME 676
+#define F_OIDVECTORLT 677
+#define F_OIDVECTORLE 678
+#define F_OIDVECTOREQ 679
+#define F_OIDVECTORGE 680
+#define F_OIDVECTORGT 681
+#define F_NETWORK 683
+#define F_NETMASK 696
+#define F_MASKLEN 697
+#define F_BROADCAST 698
+#define F_HOST 699
+#define F_DIST_LP 702
+#define F_DIST_LS 704
+#define F_GETPGUSERNAME 710
+#define F_FAMILY 711
+#define F_INT2_INT8 714
+#define F_LO_CREATE 715
+#define F_OIDLT 716
+#define F_OIDLE 717
+#define F_OCTET_LENGTH_BYTEA 720
+#define F_GET_BYTE 721
+#define F_SET_BYTE 722
+#define F_GET_BIT_BYTEA_INT8 723
+#define F_SET_BIT_BYTEA_INT8_INT4 724
+#define F_DIST_PL 725
+#define F_DIST_SL 727
+#define F_DIST_CPOLY 728
+#define F_POLY_DISTANCE 729
+#define F_TEXT_INET 730
+#define F_TEXT_LT 740
+#define F_TEXT_LE 741
+#define F_TEXT_GT 742
+#define F_TEXT_GE 743
+#define F_ARRAY_EQ 744
+#define F_CURRENT_USER 745
+#define F_SESSION_USER 746
+#define F_ARRAY_DIMS 747
+#define F_ARRAY_NDIMS 748
+#define F_OVERLAY_BYTEA_BYTEA_INT4_INT4 749
+#define F_ARRAY_IN 750
+#define F_ARRAY_OUT 751
+#define F_OVERLAY_BYTEA_BYTEA_INT4 752
+#define F_TRUNC_MACADDR 753
+#define F_INT8_INT2 754
+#define F_LO_IMPORT_TEXT 764
+#define F_LO_EXPORT 765
+#define F_INT4INC 766
+#define F_LO_IMPORT_TEXT_OID 767
+#define F_INT4LARGER 768
+#define F_INT4SMALLER 769
+#define F_INT2LARGER 770
+#define F_INT2SMALLER 771
+#define F_HASHVARLENAEXTENDED 772
+#define F_HASHOIDVECTOREXTENDED 776
+#define F_HASH_ACLITEM_EXTENDED 777
+#define F_HASHMACADDREXTENDED 778
+#define F_HASHINETEXTENDED 779
+#define F_HASH_NUMERIC_EXTENDED 780
+#define F_HASHMACADDR8EXTENDED 781
+#define F_HASH_ARRAY_EXTENDED 782
+#define F_DIST_POLYC 785
+#define F_PG_CLIENT_ENCODING 810
+#define F_CURRENT_QUERY 817
+#define F_MACADDR_EQ 830
+#define F_MACADDR_LT 831
+#define F_MACADDR_LE 832
+#define F_MACADDR_GT 833
+#define F_MACADDR_GE 834
+#define F_MACADDR_NE 835
+#define F_MACADDR_CMP 836
+#define F_INT82PL 837
+#define F_INT82MI 838
+#define F_INT82MUL 839
+#define F_INT82DIV 840
+#define F_INT28PL 841
+#define F_BTINT8CMP 842
+#define F_CASH_MUL_FLT4 846
+#define F_CASH_DIV_FLT4 847
+#define F_FLT4_MUL_CASH 848
+#define F_POSITION_TEXT_TEXT 849
+#define F_TEXTLIKE 850
+#define F_TEXTNLIKE 851
+#define F_INT48EQ 852
+#define F_INT48NE 853
+#define F_INT48LT 854
+#define F_INT48GT 855
+#define F_INT48LE 856
+#define F_INT48GE 857
+#define F_NAMELIKE 858
+#define F_NAMENLIKE 859
+#define F_BPCHAR_CHAR 860
+#define F_CURRENT_DATABASE 861
+#define F_INT4_MUL_CASH 862
+#define F_INT2_MUL_CASH 863
+#define F_CASH_MUL_INT4 864
+#define F_CASH_DIV_INT4 865
+#define F_CASH_MUL_INT2 866
+#define F_CASH_DIV_INT2 867
+#define F_STRPOS 868
+#define F_LOWER_TEXT 870
+#define F_UPPER_TEXT 871
+#define F_INITCAP 872
+#define F_LPAD_TEXT_INT4_TEXT 873
+#define F_RPAD_TEXT_INT4_TEXT 874
+#define F_LTRIM_TEXT_TEXT 875
+#define F_RTRIM_TEXT_TEXT 876
+#define F_SUBSTR_TEXT_INT4_INT4 877
+#define F_TRANSLATE 878
+#define F_LPAD_TEXT_INT4 879
+#define F_RPAD_TEXT_INT4 880
+#define F_LTRIM_TEXT 881
+#define F_RTRIM_TEXT 882
+#define F_SUBSTR_TEXT_INT4 883
+#define F_BTRIM_TEXT_TEXT 884
+#define F_BTRIM_TEXT 885
+#define F_CASH_IN 886
+#define F_CASH_OUT 887
+#define F_CASH_EQ 888
+#define F_CASH_NE 889
+#define F_CASH_LT 890
+#define F_CASH_LE 891
+#define F_CASH_GT 892
+#define F_CASH_GE 893
+#define F_CASH_PL 894
+#define F_CASH_MI 895
+#define F_CASH_MUL_FLT8 896
+#define F_CASH_DIV_FLT8 897
+#define F_CASHLARGER 898
+#define F_CASHSMALLER 899
+#define F_INET_IN 910
+#define F_INET_OUT 911
+#define F_FLT8_MUL_CASH 919
+#define F_NETWORK_EQ 920
+#define F_NETWORK_LT 921
+#define F_NETWORK_LE 922
+#define F_NETWORK_GT 923
+#define F_NETWORK_GE 924
+#define F_NETWORK_NE 925
+#define F_NETWORK_CMP 926
+#define F_NETWORK_SUB 927
+#define F_NETWORK_SUBEQ 928
+#define F_NETWORK_SUP 929
+#define F_NETWORK_SUPEQ 930
+#define F_CASH_WORDS 935
+#define F_SUBSTRING_TEXT_INT4_INT4 936
+#define F_SUBSTRING_TEXT_INT4 937
+#define F_GENERATE_SERIES_TIMESTAMP_TIMESTAMP_INTERVAL 938
+#define F_GENERATE_SERIES_TIMESTAMPTZ_TIMESTAMPTZ_INTERVAL 939
+#define F_MOD_INT2_INT2 940
+#define F_MOD_INT4_INT4 941
+#define F_INT28MI 942
+#define F_INT28MUL 943
+#define F_CHAR_TEXT 944
+#define F_INT8MOD 945
+#define F_TEXT_CHAR 946
+#define F_MOD_INT8_INT8 947
+#define F_INT28DIV 948
+#define F_HASHINT8 949
+#define F_LO_OPEN 952
+#define F_LO_CLOSE 953
+#define F_LOREAD 954
+#define F_LOWRITE 955
+#define F_LO_LSEEK 956
+#define F_LO_CREAT 957
+#define F_LO_TELL 958
+#define F_ON_PL 959
+#define F_ON_SL 960
+#define F_CLOSE_PL 961
+#define F_LO_UNLINK 964
+#define F_HASHBPCHAREXTENDED 972
+#define F_PATH_INTER 973
+#define F_AREA_BOX 975
+#define F_WIDTH 976
+#define F_HEIGHT 977
+#define F_BOX_DISTANCE 978
+#define F_AREA_PATH 979
+#define F_BOX_INTERSECT 980
+#define F_DIAGONAL 981
+#define F_PATH_N_LT 982
+#define F_PATH_N_GT 983
+#define F_PATH_N_EQ 984
+#define F_PATH_N_LE 985
+#define F_PATH_N_GE 986
+#define F_PATH_LENGTH 987
+#define F_POINT_NE 988
+#define F_POINT_VERT 989
+#define F_POINT_HORIZ 990
+#define F_POINT_DISTANCE 991
+#define F_SLOPE 992
+#define F_LSEG_POINT_POINT 993
+#define F_LSEG_INTERSECT 994
+#define F_LSEG_PARALLEL 995
+#define F_LSEG_PERP 996
+#define F_LSEG_VERTICAL 997
+#define F_LSEG_HORIZONTAL 998
+#define F_LSEG_EQ 999
+#define F_LO_TRUNCATE 1004
+#define F_TEXTLIKE_SUPPORT 1023
+#define F_TEXTICREGEXEQ_SUPPORT 1024
+#define F_TEXTICLIKE_SUPPORT 1025
+#define F_TIMEZONE_INTERVAL_TIMESTAMPTZ 1026
+#define F_GIST_POINT_COMPRESS 1030
+#define F_ACLITEMIN 1031
+#define F_ACLITEMOUT 1032
+#define F_ACLINSERT 1035
+#define F_ACLREMOVE 1036
+#define F_ACLCONTAINS 1037
+#define F_GETDATABASEENCODING 1039
+#define F_BPCHARIN 1044
+#define F_BPCHAROUT 1045
+#define F_VARCHARIN 1046
+#define F_VARCHAROUT 1047
+#define F_BPCHAREQ 1048
+#define F_BPCHARLT 1049
+#define F_BPCHARLE 1050
+#define F_BPCHARGT 1051
+#define F_BPCHARGE 1052
+#define F_BPCHARNE 1053
+#define F_ACLITEMEQ 1062
+#define F_BPCHAR_LARGER 1063
+#define F_BPCHAR_SMALLER 1064
+#define F_PG_PREPARED_XACT 1065
+#define F_GENERATE_SERIES_INT4_INT4_INT4 1066
+#define F_GENERATE_SERIES_INT4_INT4 1067
+#define F_GENERATE_SERIES_INT8_INT8_INT8 1068
+#define F_GENERATE_SERIES_INT8_INT8 1069
+#define F_BPCHARCMP 1078
+#define F_REGCLASS 1079
+#define F_HASHBPCHAR 1080
+#define F_FORMAT_TYPE 1081
+#define F_DATE_IN 1084
+#define F_DATE_OUT 1085
+#define F_DATE_EQ 1086
+#define F_DATE_LT 1087
+#define F_DATE_LE 1088
+#define F_DATE_GT 1089
+#define F_DATE_GE 1090
+#define F_DATE_NE 1091
+#define F_DATE_CMP 1092
+#define F_TIME_LT 1102
+#define F_TIME_LE 1103
+#define F_TIME_GT 1104
+#define F_TIME_GE 1105
+#define F_TIME_NE 1106
+#define F_TIME_CMP 1107
+#define F_PG_STAT_GET_WAL 1136
+#define F_PG_GET_WAL_REPLAY_PAUSE_STATE 1137
+#define F_DATE_LARGER 1138
+#define F_DATE_SMALLER 1139
+#define F_DATE_MI 1140
+#define F_DATE_PLI 1141
+#define F_DATE_MII 1142
+#define F_TIME_IN 1143
+#define F_TIME_OUT 1144
+#define F_TIME_EQ 1145
+#define F_CIRCLE_ADD_PT 1146
+#define F_CIRCLE_SUB_PT 1147
+#define F_CIRCLE_MUL_PT 1148
+#define F_CIRCLE_DIV_PT 1149
+#define F_TIMESTAMPTZ_IN 1150
+#define F_TIMESTAMPTZ_OUT 1151
+#define F_TIMESTAMPTZ_EQ 1152
+#define F_TIMESTAMPTZ_NE 1153
+#define F_TIMESTAMPTZ_LT 1154
+#define F_TIMESTAMPTZ_LE 1155
+#define F_TIMESTAMPTZ_GE 1156
+#define F_TIMESTAMPTZ_GT 1157
+#define F_TO_TIMESTAMP_FLOAT8 1158
+#define F_TIMEZONE_TEXT_TIMESTAMPTZ 1159
+#define F_INTERVAL_IN 1160
+#define F_INTERVAL_OUT 1161
+#define F_INTERVAL_EQ 1162
+#define F_INTERVAL_NE 1163
+#define F_INTERVAL_LT 1164
+#define F_INTERVAL_LE 1165
+#define F_INTERVAL_GE 1166
+#define F_INTERVAL_GT 1167
+#define F_INTERVAL_UM 1168
+#define F_INTERVAL_PL 1169
+#define F_INTERVAL_MI 1170
+#define F_DATE_PART_TEXT_TIMESTAMPTZ 1171
+#define F_DATE_PART_TEXT_INTERVAL 1172
+#define F_NETWORK_SUBSET_SUPPORT 1173
+#define F_TIMESTAMPTZ_DATE 1174
+#define F_JUSTIFY_HOURS 1175
+#define F_TIMESTAMPTZ_DATE_TIME 1176
+#define F_JSONB_PATH_EXISTS_TZ 1177
+#define F_DATE_TIMESTAMPTZ 1178
+#define F_JSONB_PATH_QUERY_TZ 1179
+#define F_JSONB_PATH_QUERY_ARRAY_TZ 1180
+#define F_AGE_XID 1181
+#define F_TIMESTAMPTZ_MI 1188
+#define F_TIMESTAMPTZ_PL_INTERVAL 1189
+#define F_TIMESTAMPTZ_MI_INTERVAL 1190
+#define F_GENERATE_SUBSCRIPTS_ANYARRAY_INT4_BOOL 1191
+#define F_GENERATE_SUBSCRIPTS_ANYARRAY_INT4 1192
+#define F_ARRAY_FILL_ANYELEMENT__INT4 1193
+#define F_LOG10_FLOAT8 1194
+#define F_TIMESTAMPTZ_SMALLER 1195
+#define F_TIMESTAMPTZ_LARGER 1196
+#define F_INTERVAL_SMALLER 1197
+#define F_INTERVAL_LARGER 1198
+#define F_AGE_TIMESTAMPTZ_TIMESTAMPTZ 1199
+#define F_INTERVAL_INTERVAL_INT4 1200
+#define F_OBJ_DESCRIPTION_OID_NAME 1215
+#define F_COL_DESCRIPTION 1216
+#define F_DATE_TRUNC_TEXT_TIMESTAMPTZ 1217
+#define F_DATE_TRUNC_TEXT_INTERVAL 1218
+#define F_INT8INC 1219
+#define F_INT8ABS 1230
+#define F_INT8LARGER 1236
+#define F_INT8SMALLER 1237
+#define F_TEXTICREGEXEQ 1238
+#define F_TEXTICREGEXNE 1239
+#define F_NAMEICREGEXEQ 1240
+#define F_NAMEICREGEXNE 1241
+#define F_BOOLIN 1242
+#define F_BOOLOUT 1243
+#define F_BYTEAIN 1244
+#define F_CHARIN 1245
+#define F_CHARLT 1246
+#define F_UNIQUE_KEY_RECHECK 1250
+#define F_INT4ABS 1251
+#define F_NAMEREGEXNE 1252
+#define F_INT2ABS 1253
+#define F_TEXTREGEXEQ 1254
+#define F_TEXTREGEXNE 1256
+#define F_TEXTLEN 1257
+#define F_TEXTCAT 1258
+#define F_PG_CHAR_TO_ENCODING 1264
+#define F_TIDNE 1265
+#define F_CIDR_IN 1267
+#define F_PARSE_IDENT 1268
+#define F_PG_COLUMN_SIZE 1269
+#define F_OVERLAPS_TIMETZ_TIMETZ_TIMETZ_TIMETZ 1271
+#define F_DATETIME_PL 1272
+#define F_DATE_PART_TEXT_TIMETZ 1273
+#define F_INT84PL 1274
+#define F_INT84MI 1275
+#define F_INT84MUL 1276
+#define F_INT84DIV 1277
+#define F_INT48PL 1278
+#define F_INT48MI 1279
+#define F_INT48MUL 1280
+#define F_INT48DIV 1281
+#define F_QUOTE_IDENT 1282
+#define F_QUOTE_LITERAL_TEXT 1283
+#define F_DATE_TRUNC_TEXT_TIMESTAMPTZ_TEXT 1284
+#define F_QUOTE_LITERAL_ANYELEMENT 1285
+#define F_ARRAY_FILL_ANYELEMENT__INT4__INT4 1286
+#define F_OID 1287
+#define F_INT8_OID 1288
+#define F_QUOTE_NULLABLE_TEXT 1289
+#define F_QUOTE_NULLABLE_ANYELEMENT 1290
+#define F_SUPPRESS_REDUNDANT_UPDATES_TRIGGER 1291
+#define F_TIDEQ 1292
+#define F_UNNEST_ANYMULTIRANGE 1293
+#define F_CURRTID2 1294
+#define F_JUSTIFY_DAYS 1295
+#define F_TIMEDATE_PL 1296
+#define F_DATETIMETZ_PL 1297
+#define F_TIMETZDATE_PL 1298
+#define F_NOW 1299
+#define F_POSITIONSEL 1300
+#define F_POSITIONJOINSEL 1301
+#define F_CONTSEL 1302
+#define F_CONTJOINSEL 1303
+#define F_OVERLAPS_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ 1304
+#define F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_INTERVAL 1305
+#define F_OVERLAPS_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ_INTERVAL 1306
+#define F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_TIMESTAMPTZ 1307
+#define F_OVERLAPS_TIME_TIME_TIME_TIME 1308
+#define F_OVERLAPS_TIME_INTERVAL_TIME_INTERVAL 1309
+#define F_OVERLAPS_TIME_TIME_TIME_INTERVAL 1310
+#define F_OVERLAPS_TIME_INTERVAL_TIME_TIME 1311
+#define F_TIMESTAMP_IN 1312
+#define F_TIMESTAMP_OUT 1313
+#define F_TIMESTAMPTZ_CMP 1314
+#define F_INTERVAL_CMP 1315
+#define F_TIME_TIMESTAMP 1316
+#define F_LENGTH_TEXT 1317
+#define F_LENGTH_BPCHAR 1318
+#define F_XIDEQINT4 1319
+#define F_INTERVAL_DIV 1326
+#define F_DLOG10 1339
+#define F_LOG_FLOAT8 1340
+#define F_LN_FLOAT8 1341
+#define F_ROUND_FLOAT8 1342
+#define F_TRUNC_FLOAT8 1343
+#define F_SQRT_FLOAT8 1344
+#define F_CBRT 1345
+#define F_POW_FLOAT8_FLOAT8 1346
+#define F_EXP_FLOAT8 1347
+#define F_OBJ_DESCRIPTION_OID 1348
+#define F_OIDVECTORTYPES 1349
+#define F_TIMETZ_IN 1350
+#define F_TIMETZ_OUT 1351
+#define F_TIMETZ_EQ 1352
+#define F_TIMETZ_NE 1353
+#define F_TIMETZ_LT 1354
+#define F_TIMETZ_LE 1355
+#define F_TIMETZ_GE 1356
+#define F_TIMETZ_GT 1357
+#define F_TIMETZ_CMP 1358
+#define F_TIMESTAMPTZ_DATE_TIMETZ 1359
+#define F_HOSTMASK 1362
+#define F_TEXTREGEXEQ_SUPPORT 1364
+#define F_MAKEACLITEM 1365
+#define F_CHARACTER_LENGTH_BPCHAR 1367
+#define F_POWER_FLOAT8_FLOAT8 1368
+#define F_CHARACTER_LENGTH_TEXT 1369
+#define F_INTERVAL_TIME 1370
+#define F_PG_LOCK_STATUS 1371
+#define F_CHAR_LENGTH_BPCHAR 1372
+#define F_ISFINITE_DATE 1373
+#define F_OCTET_LENGTH_TEXT 1374
+#define F_OCTET_LENGTH_BPCHAR 1375
+#define F_FACTORIAL 1376
+#define F_TIME_LARGER 1377
+#define F_TIME_SMALLER 1378
+#define F_TIMETZ_LARGER 1379
+#define F_TIMETZ_SMALLER 1380
+#define F_CHAR_LENGTH_TEXT 1381
+#define F_DATE_PART_TEXT_DATE 1384
+#define F_DATE_PART_TEXT_TIME 1385
+#define F_AGE_TIMESTAMPTZ 1386
+#define F_PG_GET_CONSTRAINTDEF_OID 1387
+#define F_TIMETZ_TIMESTAMPTZ 1388
+#define F_ISFINITE_TIMESTAMPTZ 1389
+#define F_ISFINITE_INTERVAL 1390
+#define F_PG_STAT_GET_BACKEND_START 1391
+#define F_PG_STAT_GET_BACKEND_CLIENT_ADDR 1392
+#define F_PG_STAT_GET_BACKEND_CLIENT_PORT 1393
+#define F_ABS_FLOAT4 1394
+#define F_ABS_FLOAT8 1395
+#define F_ABS_INT8 1396
+#define F_ABS_INT4 1397
+#define F_ABS_INT2 1398
+#define F_NAME_VARCHAR 1400
+#define F_VARCHAR_NAME 1401
+#define F_CURRENT_SCHEMA 1402
+#define F_CURRENT_SCHEMAS 1403
+#define F_OVERLAY_TEXT_TEXT_INT4_INT4 1404
+#define F_OVERLAY_TEXT_TEXT_INT4 1405
+#define F_ISVERTICAL_POINT_POINT 1406
+#define F_ISHORIZONTAL_POINT_POINT 1407
+#define F_ISPARALLEL_LSEG_LSEG 1408
+#define F_ISPERP_LSEG_LSEG 1409
+#define F_ISVERTICAL_LSEG 1410
+#define F_ISHORIZONTAL_LSEG 1411
+#define F_ISPARALLEL_LINE_LINE 1412
+#define F_ISPERP_LINE_LINE 1413
+#define F_ISVERTICAL_LINE 1414
+#define F_ISHORIZONTAL_LINE 1415
+#define F_POINT_CIRCLE 1416
+#define F_TIME_INTERVAL 1419
+#define F_BOX_POINT_POINT 1421
+#define F_BOX_ADD 1422
+#define F_BOX_SUB 1423
+#define F_BOX_MUL 1424
+#define F_BOX_DIV 1425
+#define F_PATH_CONTAIN_PT 1426
+#define F_CIDR_OUT 1427
+#define F_POLY_CONTAIN_PT 1428
+#define F_PT_CONTAINED_POLY 1429
+#define F_ISCLOSED 1430
+#define F_ISOPEN 1431
+#define F_PATH_NPOINTS 1432
+#define F_PCLOSE 1433
+#define F_POPEN 1434
+#define F_PATH_ADD 1435
+#define F_PATH_ADD_PT 1436
+#define F_PATH_SUB_PT 1437
+#define F_PATH_MUL_PT 1438
+#define F_PATH_DIV_PT 1439
+#define F_POINT_FLOAT8_FLOAT8 1440
+#define F_POINT_ADD 1441
+#define F_POINT_SUB 1442
+#define F_POINT_MUL 1443
+#define F_POINT_DIV 1444
+#define F_POLY_NPOINTS 1445
+#define F_BOX_POLYGON 1446
+#define F_PATH 1447
+#define F_POLYGON_BOX 1448
+#define F_POLYGON_PATH 1449
+#define F_CIRCLE_IN 1450
+#define F_CIRCLE_OUT 1451
+#define F_CIRCLE_SAME 1452
+#define F_CIRCLE_CONTAIN 1453
+#define F_CIRCLE_LEFT 1454
+#define F_CIRCLE_OVERLEFT 1455
+#define F_CIRCLE_OVERRIGHT 1456
+#define F_CIRCLE_RIGHT 1457
+#define F_CIRCLE_CONTAINED 1458
+#define F_CIRCLE_OVERLAP 1459
+#define F_CIRCLE_BELOW 1460
+#define F_CIRCLE_ABOVE 1461
+#define F_CIRCLE_EQ 1462
+#define F_CIRCLE_NE 1463
+#define F_CIRCLE_LT 1464
+#define F_CIRCLE_GT 1465
+#define F_CIRCLE_LE 1466
+#define F_CIRCLE_GE 1467
+#define F_AREA_CIRCLE 1468
+#define F_DIAMETER 1469
+#define F_RADIUS 1470
+#define F_CIRCLE_DISTANCE 1471
+#define F_CIRCLE_CENTER 1472
+#define F_CIRCLE_POINT_FLOAT8 1473
+#define F_CIRCLE_POLYGON 1474
+#define F_POLYGON_INT4_CIRCLE 1475
+#define F_DIST_PC 1476
+#define F_CIRCLE_CONTAIN_PT 1477
+#define F_PT_CONTAINED_CIRCLE 1478
+#define F_CIRCLE_BOX 1479
+#define F_BOX_CIRCLE 1480
+#define F_LOG10_NUMERIC 1481
+#define F_LSEG_NE 1482
+#define F_LSEG_LT 1483
+#define F_LSEG_LE 1484
+#define F_LSEG_GT 1485
+#define F_LSEG_GE 1486
+#define F_LSEG_LENGTH 1487
+#define F_CLOSE_LS 1488
+#define F_CLOSE_LSEG 1489
+#define F_LINE_IN 1490
+#define F_LINE_OUT 1491
+#define F_LINE_EQ 1492
+#define F_LINE 1493
+#define F_LINE_INTERPT 1494
+#define F_LINE_INTERSECT 1495
+#define F_LINE_PARALLEL 1496
+#define F_LINE_PERP 1497
+#define F_LINE_VERTICAL 1498
+#define F_LINE_HORIZONTAL 1499
+#define F_LENGTH_LSEG 1530
+#define F_LENGTH_PATH 1531
+#define F_POINT_LSEG 1532
+#define F_POINT_BOX 1534
+#define F_POINT_POLYGON 1540
+#define F_LSEG_BOX 1541
+#define F_CENTER_BOX 1542
+#define F_CENTER_CIRCLE 1543
+#define F_POLYGON_CIRCLE 1544
+#define F_NPOINTS_PATH 1545
+#define F_NPOINTS_POLYGON 1556
+#define F_BIT_IN 1564
+#define F_BIT_OUT 1565
+#define F_LIKE_TEXT_TEXT 1569
+#define F_NOTLIKE_TEXT_TEXT 1570
+#define F_LIKE_NAME_TEXT 1571
+#define F_NOTLIKE_NAME_TEXT 1572
+#define F_PG_GET_RULEDEF_OID 1573
+#define F_NEXTVAL 1574
+#define F_CURRVAL 1575
+#define F_SETVAL_REGCLASS_INT8 1576
+#define F_VARBIT_IN 1579
+#define F_VARBIT_OUT 1580
+#define F_BITEQ 1581
+#define F_BITNE 1582
+#define F_BITGE 1592
+#define F_BITGT 1593
+#define F_BITLE 1594
+#define F_BITLT 1595
+#define F_BITCMP 1596
+#define F_PG_ENCODING_TO_CHAR 1597
+#define F_RANDOM 1598
+#define F_SETSEED 1599
+#define F_ASIN 1600
+#define F_ACOS 1601
+#define F_ATAN 1602
+#define F_ATAN2 1603
+#define F_SIN 1604
+#define F_COS 1605
+#define F_TAN 1606
+#define F_COT 1607
+#define F_DEGREES 1608
+#define F_RADIANS 1609
+#define F_PI 1610
+#define F_INTERVAL_MUL 1618
+#define F_PG_TYPEOF 1619
+#define F_ASCII 1620
+#define F_CHR 1621
+#define F_REPEAT 1622
+#define F_SIMILAR_ESCAPE 1623
+#define F_MUL_D_INTERVAL 1624
+#define F_BPCHARLIKE 1631
+#define F_BPCHARNLIKE 1632
+#define F_TEXTICLIKE 1633
+#define F_TEXTICNLIKE 1634
+#define F_NAMEICLIKE 1635
+#define F_NAMEICNLIKE 1636
+#define F_LIKE_ESCAPE_TEXT_TEXT 1637
+#define F_OIDGT 1638
+#define F_OIDGE 1639
+#define F_PG_GET_VIEWDEF_TEXT 1640
+#define F_PG_GET_VIEWDEF_OID 1641
+#define F_PG_GET_USERBYID 1642
+#define F_PG_GET_INDEXDEF_OID 1643
+#define F_RI_FKEY_CHECK_INS 1644
+#define F_RI_FKEY_CHECK_UPD 1645
+#define F_RI_FKEY_CASCADE_DEL 1646
+#define F_RI_FKEY_CASCADE_UPD 1647
+#define F_RI_FKEY_RESTRICT_DEL 1648
+#define F_RI_FKEY_RESTRICT_UPD 1649
+#define F_RI_FKEY_SETNULL_DEL 1650
+#define F_RI_FKEY_SETNULL_UPD 1651
+#define F_RI_FKEY_SETDEFAULT_DEL 1652
+#define F_RI_FKEY_SETDEFAULT_UPD 1653
+#define F_RI_FKEY_NOACTION_DEL 1654
+#define F_RI_FKEY_NOACTION_UPD 1655
+#define F_BPCHARICREGEXEQ 1656
+#define F_BPCHARICREGEXNE 1657
+#define F_BPCHARREGEXEQ 1658
+#define F_BPCHARREGEXNE 1659
+#define F_BPCHARICLIKE 1660
+#define F_BPCHARICNLIKE 1661
+#define F_PG_GET_TRIGGERDEF_OID 1662
+#define F_PG_GET_SERIAL_SEQUENCE 1665
+#define F_VARBITEQ 1666
+#define F_VARBITNE 1667
+#define F_VARBITGE 1668
+#define F_VARBITGT 1669
+#define F_VARBITLE 1670
+#define F_VARBITLT 1671
+#define F_VARBITCMP 1672
+#define F_BITAND 1673
+#define F_BITOR 1674
+#define F_BITXOR 1675
+#define F_BITNOT 1676
+#define F_BITSHIFTLEFT 1677
+#define F_BITSHIFTRIGHT 1678
+#define F_BITCAT 1679
+#define F_SUBSTRING_BIT_INT4_INT4 1680
+#define F_LENGTH_BIT 1681
+#define F_OCTET_LENGTH_BIT 1682
+#define F_BIT_INT4_INT4 1683
+#define F_INT4_BIT 1684
+#define F_BIT_BIT_INT4_BOOL 1685
+#define F_PG_GET_KEYWORDS 1686
+#define F_VARBIT 1687
+#define F_TIME_HASH 1688
+#define F_ACLEXPLODE 1689
+#define F_TIME_MI_TIME 1690
+#define F_BOOLLE 1691
+#define F_BOOLGE 1692
+#define F_BTBOOLCMP 1693
+#define F_TIMETZ_HASH 1696
+#define F_INTERVAL_HASH 1697
+#define F_POSITION_BIT_BIT 1698
+#define F_SUBSTRING_BIT_INT4 1699
+#define F_NUMERIC_IN 1701
+#define F_NUMERIC_OUT 1702
+#define F_NUMERIC_NUMERIC_INT4 1703
+#define F_NUMERIC_ABS 1704
+#define F_ABS_NUMERIC 1705
+#define F_SIGN_NUMERIC 1706
+#define F_ROUND_NUMERIC_INT4 1707
+#define F_ROUND_NUMERIC 1708
+#define F_TRUNC_NUMERIC_INT4 1709
+#define F_TRUNC_NUMERIC 1710
+#define F_CEIL_NUMERIC 1711
+#define F_FLOOR_NUMERIC 1712
+#define F_LENGTH_BYTEA_NAME 1713
+#define F_CONVERT_FROM 1714
+#define F_CIDR 1715
+#define F_PG_GET_EXPR_PG_NODE_TREE_OID 1716
+#define F_CONVERT_TO 1717
+#define F_NUMERIC_EQ 1718
+#define F_NUMERIC_NE 1719
+#define F_NUMERIC_GT 1720
+#define F_NUMERIC_GE 1721
+#define F_NUMERIC_LT 1722
+#define F_NUMERIC_LE 1723
+#define F_NUMERIC_ADD 1724
+#define F_NUMERIC_SUB 1725
+#define F_NUMERIC_MUL 1726
+#define F_NUMERIC_DIV 1727
+#define F_MOD_NUMERIC_NUMERIC 1728
+#define F_NUMERIC_MOD 1729
+#define F_SQRT_NUMERIC 1730
+#define F_NUMERIC_SQRT 1731
+#define F_EXP_NUMERIC 1732
+#define F_NUMERIC_EXP 1733
+#define F_LN_NUMERIC 1734
+#define F_NUMERIC_LN 1735
+#define F_LOG_NUMERIC_NUMERIC 1736
+#define F_NUMERIC_LOG 1737
+#define F_POW_NUMERIC_NUMERIC 1738
+#define F_NUMERIC_POWER 1739
+#define F_NUMERIC_INT4 1740
+#define F_LOG_NUMERIC 1741
+#define F_NUMERIC_FLOAT4 1742
+#define F_NUMERIC_FLOAT8 1743
+#define F_INT4_NUMERIC 1744
+#define F_FLOAT4_NUMERIC 1745
+#define F_FLOAT8_NUMERIC 1746
+#define F_TIME_PL_INTERVAL 1747
+#define F_TIME_MI_INTERVAL 1748
+#define F_TIMETZ_PL_INTERVAL 1749
+#define F_TIMETZ_MI_INTERVAL 1750
+#define F_NUMERIC_INC 1764
+#define F_SETVAL_REGCLASS_INT8_BOOL 1765
+#define F_NUMERIC_SMALLER 1766
+#define F_NUMERIC_LARGER 1767
+#define F_TO_CHAR_INTERVAL_TEXT 1768
+#define F_NUMERIC_CMP 1769
+#define F_TO_CHAR_TIMESTAMPTZ_TEXT 1770
+#define F_NUMERIC_UMINUS 1771
+#define F_TO_CHAR_NUMERIC_TEXT 1772
+#define F_TO_CHAR_INT4_TEXT 1773
+#define F_TO_CHAR_INT8_TEXT 1774
+#define F_TO_CHAR_FLOAT4_TEXT 1775
+#define F_TO_CHAR_FLOAT8_TEXT 1776
+#define F_TO_NUMBER 1777
+#define F_TO_TIMESTAMP_TEXT_TEXT 1778
+#define F_INT8_NUMERIC 1779
+#define F_TO_DATE 1780
+#define F_NUMERIC_INT8 1781
+#define F_NUMERIC_INT2 1782
+#define F_INT2_NUMERIC 1783
+#define F_OIDIN 1798
+#define F_OIDOUT 1799
+#define F_BIT_LENGTH_BYTEA 1810
+#define F_BIT_LENGTH_TEXT 1811
+#define F_BIT_LENGTH_BIT 1812
+#define F_CONVERT 1813
+#define F_ICLIKESEL 1814
+#define F_ICNLIKESEL 1815
+#define F_ICLIKEJOINSEL 1816
+#define F_ICNLIKEJOINSEL 1817
+#define F_REGEXEQSEL 1818
+#define F_LIKESEL 1819
+#define F_ICREGEXEQSEL 1820
+#define F_REGEXNESEL 1821
+#define F_NLIKESEL 1822
+#define F_ICREGEXNESEL 1823
+#define F_REGEXEQJOINSEL 1824
+#define F_LIKEJOINSEL 1825
+#define F_ICREGEXEQJOINSEL 1826
+#define F_REGEXNEJOINSEL 1827
+#define F_NLIKEJOINSEL 1828
+#define F_ICREGEXNEJOINSEL 1829
+#define F_FLOAT8_AVG 1830
+#define F_FLOAT8_VAR_SAMP 1831
+#define F_FLOAT8_STDDEV_SAMP 1832
+#define F_NUMERIC_ACCUM 1833
+#define F_INT2_ACCUM 1834
+#define F_INT4_ACCUM 1835
+#define F_INT8_ACCUM 1836
+#define F_NUMERIC_AVG 1837
+#define F_NUMERIC_VAR_SAMP 1838
+#define F_NUMERIC_STDDEV_SAMP 1839
+#define F_INT2_SUM 1840
+#define F_INT4_SUM 1841
+#define F_INT8_SUM 1842
+#define F_INTERVAL_ACCUM 1843
+#define F_INTERVAL_AVG 1844
+#define F_TO_ASCII_TEXT 1845
+#define F_TO_ASCII_TEXT_INT4 1846
+#define F_TO_ASCII_TEXT_NAME 1847
+#define F_INTERVAL_PL_TIME 1848
+#define F_INT28EQ 1850
+#define F_INT28NE 1851
+#define F_INT28LT 1852
+#define F_INT28GT 1853
+#define F_INT28LE 1854
+#define F_INT28GE 1855
+#define F_INT82EQ 1856
+#define F_INT82NE 1857
+#define F_INT82LT 1858
+#define F_INT82GT 1859
+#define F_INT82LE 1860
+#define F_INT82GE 1861
+#define F_INT2AND 1892
+#define F_INT2OR 1893
+#define F_INT2XOR 1894
+#define F_INT2NOT 1895
+#define F_INT2SHL 1896
+#define F_INT2SHR 1897
+#define F_INT4AND 1898
+#define F_INT4OR 1899
+#define F_INT4XOR 1900
+#define F_INT4NOT 1901
+#define F_INT4SHL 1902
+#define F_INT4SHR 1903
+#define F_INT8AND 1904
+#define F_INT8OR 1905
+#define F_INT8XOR 1906
+#define F_INT8NOT 1907
+#define F_INT8SHL 1908
+#define F_INT8SHR 1909
+#define F_INT8UP 1910
+#define F_INT2UP 1911
+#define F_INT4UP 1912
+#define F_FLOAT4UP 1913
+#define F_FLOAT8UP 1914
+#define F_NUMERIC_UPLUS 1915
+#define F_HAS_TABLE_PRIVILEGE_NAME_TEXT_TEXT 1922
+#define F_HAS_TABLE_PRIVILEGE_NAME_OID_TEXT 1923
+#define F_HAS_TABLE_PRIVILEGE_OID_TEXT_TEXT 1924
+#define F_HAS_TABLE_PRIVILEGE_OID_OID_TEXT 1925
+#define F_HAS_TABLE_PRIVILEGE_TEXT_TEXT 1926
+#define F_HAS_TABLE_PRIVILEGE_OID_TEXT 1927
+#define F_PG_STAT_GET_NUMSCANS 1928
+#define F_PG_STAT_GET_TUPLES_RETURNED 1929
+#define F_PG_STAT_GET_TUPLES_FETCHED 1930
+#define F_PG_STAT_GET_TUPLES_INSERTED 1931
+#define F_PG_STAT_GET_TUPLES_UPDATED 1932
+#define F_PG_STAT_GET_TUPLES_DELETED 1933
+#define F_PG_STAT_GET_BLOCKS_FETCHED 1934
+#define F_PG_STAT_GET_BLOCKS_HIT 1935
+#define F_PG_STAT_GET_BACKEND_IDSET 1936
+#define F_PG_STAT_GET_BACKEND_PID 1937
+#define F_PG_STAT_GET_BACKEND_DBID 1938
+#define F_PG_STAT_GET_BACKEND_USERID 1939
+#define F_PG_STAT_GET_BACKEND_ACTIVITY 1940
+#define F_PG_STAT_GET_DB_NUMBACKENDS 1941
+#define F_PG_STAT_GET_DB_XACT_COMMIT 1942
+#define F_PG_STAT_GET_DB_XACT_ROLLBACK 1943
+#define F_PG_STAT_GET_DB_BLOCKS_FETCHED 1944
+#define F_PG_STAT_GET_DB_BLOCKS_HIT 1945
+#define F_ENCODE 1946
+#define F_DECODE 1947
+#define F_BYTEAEQ 1948
+#define F_BYTEALT 1949
+#define F_BYTEALE 1950
+#define F_BYTEAGT 1951
+#define F_BYTEAGE 1952
+#define F_BYTEANE 1953
+#define F_BYTEACMP 1954
+#define F_TIMESTAMP_TIMESTAMP_INT4 1961
+#define F_INT2_AVG_ACCUM 1962
+#define F_INT4_AVG_ACCUM 1963
+#define F_INT8_AVG 1964
+#define F_OIDLARGER 1965
+#define F_OIDSMALLER 1966
+#define F_TIMESTAMPTZ_TIMESTAMPTZ_INT4 1967
+#define F_TIME_TIME_INT4 1968
+#define F_TIMETZ_TIMETZ_INT4 1969
+#define F_PG_STAT_GET_TUPLES_HOT_UPDATED 1972
+#define F_DIV 1973
+#define F_NUMERIC_DIV_TRUNC 1980
+#define F_SIMILAR_TO_ESCAPE_TEXT_TEXT 1986
+#define F_SIMILAR_TO_ESCAPE_TEXT 1987
+#define F_SHOBJ_DESCRIPTION 1993
+#define F_TEXTANYCAT 2003
+#define F_ANYTEXTCAT 2004
+#define F_BYTEALIKE 2005
+#define F_BYTEANLIKE 2006
+#define F_LIKE_BYTEA_BYTEA 2007
+#define F_NOTLIKE_BYTEA_BYTEA 2008
+#define F_LIKE_ESCAPE_BYTEA_BYTEA 2009
+#define F_LENGTH_BYTEA 2010
+#define F_BYTEACAT 2011
+#define F_SUBSTRING_BYTEA_INT4_INT4 2012
+#define F_SUBSTRING_BYTEA_INT4 2013
+#define F_POSITION_BYTEA_BYTEA 2014
+#define F_BTRIM_BYTEA_BYTEA 2015
+#define F_TIME_TIMESTAMPTZ 2019
+#define F_DATE_TRUNC_TEXT_TIMESTAMP 2020
+#define F_DATE_PART_TEXT_TIMESTAMP 2021
+#define F_PG_STAT_GET_ACTIVITY 2022
+#define F_JSONB_PATH_QUERY_FIRST_TZ 2023
+#define F_TIMESTAMP_DATE 2024
+#define F_TIMESTAMP_DATE_TIME 2025
+#define F_PG_BACKEND_PID 2026
+#define F_TIMESTAMP_TIMESTAMPTZ 2027
+#define F_TIMESTAMPTZ_TIMESTAMP 2028
+#define F_DATE_TIMESTAMP 2029
+#define F_JSONB_PATH_MATCH_TZ 2030
+#define F_TIMESTAMP_MI 2031
+#define F_TIMESTAMP_PL_INTERVAL 2032
+#define F_TIMESTAMP_MI_INTERVAL 2033
+#define F_PG_CONF_LOAD_TIME 2034
+#define F_TIMESTAMP_SMALLER 2035
+#define F_TIMESTAMP_LARGER 2036
+#define F_TIMEZONE_TEXT_TIMETZ 2037
+#define F_TIMEZONE_INTERVAL_TIMETZ 2038
+#define F_TIMESTAMP_HASH 2039
+#define F_OVERLAPS_TIMESTAMP_TIMESTAMP_TIMESTAMP_TIMESTAMP 2041
+#define F_OVERLAPS_TIMESTAMP_INTERVAL_TIMESTAMP_INTERVAL 2042
+#define F_OVERLAPS_TIMESTAMP_TIMESTAMP_TIMESTAMP_INTERVAL 2043
+#define F_OVERLAPS_TIMESTAMP_INTERVAL_TIMESTAMP_TIMESTAMP 2044
+#define F_TIMESTAMP_CMP 2045
+#define F_TIME_TIMETZ 2046
+#define F_TIMETZ_TIME 2047
+#define F_ISFINITE_TIMESTAMP 2048
+#define F_TO_CHAR_TIMESTAMP_TEXT 2049
+#define F_MAX_ANYARRAY 2050
+#define F_MIN_ANYARRAY 2051
+#define F_TIMESTAMP_EQ 2052
+#define F_TIMESTAMP_NE 2053
+#define F_TIMESTAMP_LT 2054
+#define F_TIMESTAMP_LE 2055
+#define F_TIMESTAMP_GE 2056
+#define F_TIMESTAMP_GT 2057
+#define F_AGE_TIMESTAMP_TIMESTAMP 2058
+#define F_AGE_TIMESTAMP 2059
+#define F_TIMEZONE_TEXT_TIMESTAMP 2069
+#define F_TIMEZONE_INTERVAL_TIMESTAMP 2070
+#define F_DATE_PL_INTERVAL 2071
+#define F_DATE_MI_INTERVAL 2072
+#define F_SUBSTRING_TEXT_TEXT 2073
+#define F_SUBSTRING_TEXT_TEXT_TEXT 2074
+#define F_BIT_INT8_INT4 2075
+#define F_INT8_BIT 2076
+#define F_CURRENT_SETTING_TEXT 2077
+#define F_SET_CONFIG 2078
+#define F_PG_TABLE_IS_VISIBLE 2079
+#define F_PG_TYPE_IS_VISIBLE 2080
+#define F_PG_FUNCTION_IS_VISIBLE 2081
+#define F_PG_OPERATOR_IS_VISIBLE 2082
+#define F_PG_OPCLASS_IS_VISIBLE 2083
+#define F_PG_SHOW_ALL_SETTINGS 2084
+#define F_SUBSTR_BYTEA_INT4_INT4 2085
+#define F_SUBSTR_BYTEA_INT4 2086
+#define F_REPLACE 2087
+#define F_SPLIT_PART 2088
+#define F_TO_HEX_INT4 2089
+#define F_TO_HEX_INT8 2090
+#define F_ARRAY_LOWER 2091
+#define F_ARRAY_UPPER 2092
+#define F_PG_CONVERSION_IS_VISIBLE 2093
+#define F_PG_STAT_GET_BACKEND_ACTIVITY_START 2094
+#define F_PG_TERMINATE_BACKEND 2096
+#define F_PG_GET_FUNCTIONDEF 2098
+#define F_AVG_INT8 2100
+#define F_AVG_INT4 2101
+#define F_AVG_INT2 2102
+#define F_AVG_NUMERIC 2103
+#define F_AVG_FLOAT4 2104
+#define F_AVG_FLOAT8 2105
+#define F_AVG_INTERVAL 2106
+#define F_SUM_INT8 2107
+#define F_SUM_INT4 2108
+#define F_SUM_INT2 2109
+#define F_SUM_FLOAT4 2110
+#define F_SUM_FLOAT8 2111
+#define F_SUM_MONEY 2112
+#define F_SUM_INTERVAL 2113
+#define F_SUM_NUMERIC 2114
+#define F_MAX_INT8 2115
+#define F_MAX_INT4 2116
+#define F_MAX_INT2 2117
+#define F_MAX_OID 2118
+#define F_MAX_FLOAT4 2119
+#define F_MAX_FLOAT8 2120
+#define F_PG_COLUMN_COMPRESSION 2121
+#define F_MAX_DATE 2122
+#define F_MAX_TIME 2123
+#define F_MAX_TIMETZ 2124
+#define F_MAX_MONEY 2125
+#define F_MAX_TIMESTAMP 2126
+#define F_MAX_TIMESTAMPTZ 2127
+#define F_MAX_INTERVAL 2128
+#define F_MAX_TEXT 2129
+#define F_MAX_NUMERIC 2130
+#define F_MIN_INT8 2131
+#define F_MIN_INT4 2132
+#define F_MIN_INT2 2133
+#define F_MIN_OID 2134
+#define F_MIN_FLOAT4 2135
+#define F_MIN_FLOAT8 2136
+#define F_PG_STAT_FORCE_NEXT_FLUSH 2137
+#define F_MIN_DATE 2138
+#define F_MIN_TIME 2139
+#define F_MIN_TIMETZ 2140
+#define F_MIN_MONEY 2141
+#define F_MIN_TIMESTAMP 2142
+#define F_MIN_TIMESTAMPTZ 2143
+#define F_MIN_INTERVAL 2144
+#define F_MIN_TEXT 2145
+#define F_MIN_NUMERIC 2146
+#define F_COUNT_ANY 2147
+#define F_VARIANCE_INT8 2148
+#define F_VARIANCE_INT4 2149
+#define F_VARIANCE_INT2 2150
+#define F_VARIANCE_FLOAT4 2151
+#define F_VARIANCE_FLOAT8 2152
+#define F_VARIANCE_NUMERIC 2153
+#define F_STDDEV_INT8 2154
+#define F_STDDEV_INT4 2155
+#define F_STDDEV_INT2 2156
+#define F_STDDEV_FLOAT4 2157
+#define F_STDDEV_FLOAT8 2158
+#define F_STDDEV_NUMERIC 2159
+#define F_TEXT_PATTERN_LT 2160
+#define F_TEXT_PATTERN_LE 2161
+#define F_PG_GET_FUNCTION_ARGUMENTS 2162
+#define F_TEXT_PATTERN_GE 2163
+#define F_TEXT_PATTERN_GT 2164
+#define F_PG_GET_FUNCTION_RESULT 2165
+#define F_BTTEXT_PATTERN_CMP 2166
+#define F_CEILING_NUMERIC 2167
+#define F_PG_DATABASE_SIZE_NAME 2168
+#define F_POWER_NUMERIC_NUMERIC 2169
+#define F_WIDTH_BUCKET_NUMERIC_NUMERIC_NUMERIC_INT4 2170
+#define F_PG_CANCEL_BACKEND 2171
+#define F_PG_BACKUP_START 2172
+#define F_BPCHAR_PATTERN_LT 2174
+#define F_BPCHAR_PATTERN_LE 2175
+#define F_ARRAY_LENGTH 2176
+#define F_BPCHAR_PATTERN_GE 2177
+#define F_BPCHAR_PATTERN_GT 2178
+#define F_GIST_POINT_CONSISTENT 2179
+#define F_BTBPCHAR_PATTERN_CMP 2180
+#define F_HAS_SEQUENCE_PRIVILEGE_NAME_TEXT_TEXT 2181
+#define F_HAS_SEQUENCE_PRIVILEGE_NAME_OID_TEXT 2182
+#define F_HAS_SEQUENCE_PRIVILEGE_OID_TEXT_TEXT 2183
+#define F_HAS_SEQUENCE_PRIVILEGE_OID_OID_TEXT 2184
+#define F_HAS_SEQUENCE_PRIVILEGE_TEXT_TEXT 2185
+#define F_HAS_SEQUENCE_PRIVILEGE_OID_TEXT 2186
+#define F_BTINT48CMP 2188
+#define F_BTINT84CMP 2189
+#define F_BTINT24CMP 2190
+#define F_BTINT42CMP 2191
+#define F_BTINT28CMP 2192
+#define F_BTINT82CMP 2193
+#define F_BTFLOAT48CMP 2194
+#define F_BTFLOAT84CMP 2195
+#define F_INET_CLIENT_ADDR 2196
+#define F_INET_CLIENT_PORT 2197
+#define F_INET_SERVER_ADDR 2198
+#define F_INET_SERVER_PORT 2199
+#define F_REGPROCEDUREIN 2212
+#define F_REGPROCEDUREOUT 2213
+#define F_REGOPERIN 2214
+#define F_REGOPEROUT 2215
+#define F_REGOPERATORIN 2216
+#define F_REGOPERATOROUT 2217
+#define F_REGCLASSIN 2218
+#define F_REGCLASSOUT 2219
+#define F_REGTYPEIN 2220
+#define F_REGTYPEOUT 2221
+#define F_PG_STAT_CLEAR_SNAPSHOT 2230
+#define F_PG_GET_FUNCTION_IDENTITY_ARGUMENTS 2232
+#define F_HASHTID 2233
+#define F_HASHTIDEXTENDED 2234
+#define F_BIT_AND_INT2 2236
+#define F_BIT_OR_INT2 2237
+#define F_BIT_AND_INT4 2238
+#define F_BIT_OR_INT4 2239
+#define F_BIT_AND_INT8 2240
+#define F_BIT_OR_INT8 2241
+#define F_BIT_AND_BIT 2242
+#define F_BIT_OR_BIT 2243
+#define F_MAX_BPCHAR 2244
+#define F_MIN_BPCHAR 2245
+#define F_FMGR_INTERNAL_VALIDATOR 2246
+#define F_FMGR_C_VALIDATOR 2247
+#define F_FMGR_SQL_VALIDATOR 2248
+#define F_HAS_DATABASE_PRIVILEGE_NAME_TEXT_TEXT 2250
+#define F_HAS_DATABASE_PRIVILEGE_NAME_OID_TEXT 2251
+#define F_HAS_DATABASE_PRIVILEGE_OID_TEXT_TEXT 2252
+#define F_HAS_DATABASE_PRIVILEGE_OID_OID_TEXT 2253
+#define F_HAS_DATABASE_PRIVILEGE_TEXT_TEXT 2254
+#define F_HAS_DATABASE_PRIVILEGE_OID_TEXT 2255
+#define F_HAS_FUNCTION_PRIVILEGE_NAME_TEXT_TEXT 2256
+#define F_HAS_FUNCTION_PRIVILEGE_NAME_OID_TEXT 2257
+#define F_HAS_FUNCTION_PRIVILEGE_OID_TEXT_TEXT 2258
+#define F_HAS_FUNCTION_PRIVILEGE_OID_OID_TEXT 2259
+#define F_HAS_FUNCTION_PRIVILEGE_TEXT_TEXT 2260
+#define F_HAS_FUNCTION_PRIVILEGE_OID_TEXT 2261
+#define F_HAS_LANGUAGE_PRIVILEGE_NAME_TEXT_TEXT 2262
+#define F_HAS_LANGUAGE_PRIVILEGE_NAME_OID_TEXT 2263
+#define F_HAS_LANGUAGE_PRIVILEGE_OID_TEXT_TEXT 2264
+#define F_HAS_LANGUAGE_PRIVILEGE_OID_OID_TEXT 2265
+#define F_HAS_LANGUAGE_PRIVILEGE_TEXT_TEXT 2266
+#define F_HAS_LANGUAGE_PRIVILEGE_OID_TEXT 2267
+#define F_HAS_SCHEMA_PRIVILEGE_NAME_TEXT_TEXT 2268
+#define F_HAS_SCHEMA_PRIVILEGE_NAME_OID_TEXT 2269
+#define F_HAS_SCHEMA_PRIVILEGE_OID_TEXT_TEXT 2270
+#define F_HAS_SCHEMA_PRIVILEGE_OID_OID_TEXT 2271
+#define F_HAS_SCHEMA_PRIVILEGE_TEXT_TEXT 2272
+#define F_HAS_SCHEMA_PRIVILEGE_OID_TEXT 2273
+#define F_PG_STAT_RESET 2274
+#define F_PG_GET_BACKEND_MEMORY_CONTEXTS 2282
+#define F_REGEXP_REPLACE_TEXT_TEXT_TEXT 2284
+#define F_REGEXP_REPLACE_TEXT_TEXT_TEXT_TEXT 2285
+#define F_PG_TOTAL_RELATION_SIZE 2286
+#define F_PG_SIZE_PRETTY_INT8 2288
+#define F_PG_OPTIONS_TO_TABLE 2289
+#define F_RECORD_IN 2290
+#define F_RECORD_OUT 2291
+#define F_CSTRING_IN 2292
+#define F_CSTRING_OUT 2293
+#define F_ANY_IN 2294
+#define F_ANY_OUT 2295
+#define F_ANYARRAY_IN 2296
+#define F_ANYARRAY_OUT 2297
+#define F_VOID_IN 2298
+#define F_VOID_OUT 2299
+#define F_TRIGGER_IN 2300
+#define F_TRIGGER_OUT 2301
+#define F_LANGUAGE_HANDLER_IN 2302
+#define F_LANGUAGE_HANDLER_OUT 2303
+#define F_INTERNAL_IN 2304
+#define F_INTERNAL_OUT 2305
+#define F_PG_STAT_GET_SLRU 2306
+#define F_PG_STAT_RESET_SLRU 2307
+#define F_CEIL_FLOAT8 2308
+#define F_FLOOR_FLOAT8 2309
+#define F_SIGN_FLOAT8 2310
+#define F_MD5_TEXT 2311
+#define F_ANYELEMENT_IN 2312
+#define F_ANYELEMENT_OUT 2313
+#define F_POSTGRESQL_FDW_VALIDATOR 2316
+#define F_PG_ENCODING_MAX_LENGTH 2319
+#define F_CEILING_FLOAT8 2320
+#define F_MD5_BYTEA 2321
+#define F_PG_TABLESPACE_SIZE_OID 2322
+#define F_PG_TABLESPACE_SIZE_NAME 2323
+#define F_PG_DATABASE_SIZE_OID 2324
+#define F_PG_RELATION_SIZE_REGCLASS 2325
+#define F_UNNEST_ANYARRAY 2331
+#define F_PG_RELATION_SIZE_REGCLASS_TEXT 2332
+#define F_ARRAY_AGG_TRANSFN 2333
+#define F_ARRAY_AGG_FINALFN 2334
+#define F_ARRAY_AGG_ANYNONARRAY 2335
+#define F_DATE_LT_TIMESTAMP 2338
+#define F_DATE_LE_TIMESTAMP 2339
+#define F_DATE_EQ_TIMESTAMP 2340
+#define F_DATE_GT_TIMESTAMP 2341
+#define F_DATE_GE_TIMESTAMP 2342
+#define F_DATE_NE_TIMESTAMP 2343
+#define F_DATE_CMP_TIMESTAMP 2344
+#define F_DATE_LT_TIMESTAMPTZ 2351
+#define F_DATE_LE_TIMESTAMPTZ 2352
+#define F_DATE_EQ_TIMESTAMPTZ 2353
+#define F_DATE_GT_TIMESTAMPTZ 2354
+#define F_DATE_GE_TIMESTAMPTZ 2355
+#define F_DATE_NE_TIMESTAMPTZ 2356
+#define F_DATE_CMP_TIMESTAMPTZ 2357
+#define F_TIMESTAMP_LT_DATE 2364
+#define F_TIMESTAMP_LE_DATE 2365
+#define F_TIMESTAMP_EQ_DATE 2366
+#define F_TIMESTAMP_GT_DATE 2367
+#define F_TIMESTAMP_GE_DATE 2368
+#define F_TIMESTAMP_NE_DATE 2369
+#define F_TIMESTAMP_CMP_DATE 2370
+#define F_TIMESTAMPTZ_LT_DATE 2377
+#define F_TIMESTAMPTZ_LE_DATE 2378
+#define F_TIMESTAMPTZ_EQ_DATE 2379
+#define F_TIMESTAMPTZ_GT_DATE 2380
+#define F_TIMESTAMPTZ_GE_DATE 2381
+#define F_TIMESTAMPTZ_NE_DATE 2382
+#define F_TIMESTAMPTZ_CMP_DATE 2383
+#define F_HAS_TABLESPACE_PRIVILEGE_NAME_TEXT_TEXT 2390
+#define F_HAS_TABLESPACE_PRIVILEGE_NAME_OID_TEXT 2391
+#define F_HAS_TABLESPACE_PRIVILEGE_OID_TEXT_TEXT 2392
+#define F_HAS_TABLESPACE_PRIVILEGE_OID_OID_TEXT 2393
+#define F_HAS_TABLESPACE_PRIVILEGE_TEXT_TEXT 2394
+#define F_HAS_TABLESPACE_PRIVILEGE_OID_TEXT 2395
+#define F_SHELL_IN 2398
+#define F_SHELL_OUT 2399
+#define F_ARRAY_RECV 2400
+#define F_ARRAY_SEND 2401
+#define F_RECORD_RECV 2402
+#define F_RECORD_SEND 2403
+#define F_INT2RECV 2404
+#define F_INT2SEND 2405
+#define F_INT4RECV 2406
+#define F_INT4SEND 2407
+#define F_INT8RECV 2408
+#define F_INT8SEND 2409
+#define F_INT2VECTORRECV 2410
+#define F_INT2VECTORSEND 2411
+#define F_BYTEARECV 2412
+#define F_BYTEASEND 2413
+#define F_TEXTRECV 2414
+#define F_TEXTSEND 2415
+#define F_UNKNOWNRECV 2416
+#define F_UNKNOWNSEND 2417
+#define F_OIDRECV 2418
+#define F_OIDSEND 2419
+#define F_OIDVECTORRECV 2420
+#define F_OIDVECTORSEND 2421
+#define F_NAMERECV 2422
+#define F_NAMESEND 2423
+#define F_FLOAT4RECV 2424
+#define F_FLOAT4SEND 2425
+#define F_FLOAT8RECV 2426
+#define F_FLOAT8SEND 2427
+#define F_POINT_RECV 2428
+#define F_POINT_SEND 2429
+#define F_BPCHARRECV 2430
+#define F_BPCHARSEND 2431
+#define F_VARCHARRECV 2432
+#define F_VARCHARSEND 2433
+#define F_CHARRECV 2434
+#define F_CHARSEND 2435
+#define F_BOOLRECV 2436
+#define F_BOOLSEND 2437
+#define F_TIDRECV 2438
+#define F_TIDSEND 2439
+#define F_XIDRECV 2440
+#define F_XIDSEND 2441
+#define F_CIDRECV 2442
+#define F_CIDSEND 2443
+#define F_REGPROCRECV 2444
+#define F_REGPROCSEND 2445
+#define F_REGPROCEDURERECV 2446
+#define F_REGPROCEDURESEND 2447
+#define F_REGOPERRECV 2448
+#define F_REGOPERSEND 2449
+#define F_REGOPERATORRECV 2450
+#define F_REGOPERATORSEND 2451
+#define F_REGCLASSRECV 2452
+#define F_REGCLASSSEND 2453
+#define F_REGTYPERECV 2454
+#define F_REGTYPESEND 2455
+#define F_BIT_RECV 2456
+#define F_BIT_SEND 2457
+#define F_VARBIT_RECV 2458
+#define F_VARBIT_SEND 2459
+#define F_NUMERIC_RECV 2460
+#define F_NUMERIC_SEND 2461
+#define F_SINH 2462
+#define F_COSH 2463
+#define F_TANH 2464
+#define F_ASINH 2465
+#define F_ACOSH 2466
+#define F_ATANH 2467
+#define F_DATE_RECV 2468
+#define F_DATE_SEND 2469
+#define F_TIME_RECV 2470
+#define F_TIME_SEND 2471
+#define F_TIMETZ_RECV 2472
+#define F_TIMETZ_SEND 2473
+#define F_TIMESTAMP_RECV 2474
+#define F_TIMESTAMP_SEND 2475
+#define F_TIMESTAMPTZ_RECV 2476
+#define F_TIMESTAMPTZ_SEND 2477
+#define F_INTERVAL_RECV 2478
+#define F_INTERVAL_SEND 2479
+#define F_LSEG_RECV 2480
+#define F_LSEG_SEND 2481
+#define F_PATH_RECV 2482
+#define F_PATH_SEND 2483
+#define F_BOX_RECV 2484
+#define F_BOX_SEND 2485
+#define F_POLY_RECV 2486
+#define F_POLY_SEND 2487
+#define F_LINE_RECV 2488
+#define F_LINE_SEND 2489
+#define F_CIRCLE_RECV 2490
+#define F_CIRCLE_SEND 2491
+#define F_CASH_RECV 2492
+#define F_CASH_SEND 2493
+#define F_MACADDR_RECV 2494
+#define F_MACADDR_SEND 2495
+#define F_INET_RECV 2496
+#define F_INET_SEND 2497
+#define F_CIDR_RECV 2498
+#define F_CIDR_SEND 2499
+#define F_CSTRING_RECV 2500
+#define F_CSTRING_SEND 2501
+#define F_ANYARRAY_RECV 2502
+#define F_ANYARRAY_SEND 2503
+#define F_PG_GET_RULEDEF_OID_BOOL 2504
+#define F_PG_GET_VIEWDEF_TEXT_BOOL 2505
+#define F_PG_GET_VIEWDEF_OID_BOOL 2506
+#define F_PG_GET_INDEXDEF_OID_INT4_BOOL 2507
+#define F_PG_GET_CONSTRAINTDEF_OID_BOOL 2508
+#define F_PG_GET_EXPR_PG_NODE_TREE_OID_BOOL 2509
+#define F_PG_PREPARED_STATEMENT 2510
+#define F_PG_CURSOR 2511
+#define F_FLOAT8_VAR_POP 2512
+#define F_FLOAT8_STDDEV_POP 2513
+#define F_NUMERIC_VAR_POP 2514
+#define F_BOOLAND_STATEFUNC 2515
+#define F_BOOLOR_STATEFUNC 2516
+#define F_BOOL_AND 2517
+#define F_BOOL_OR 2518
+#define F_EVERY 2519
+#define F_TIMESTAMP_LT_TIMESTAMPTZ 2520
+#define F_TIMESTAMP_LE_TIMESTAMPTZ 2521
+#define F_TIMESTAMP_EQ_TIMESTAMPTZ 2522
+#define F_TIMESTAMP_GT_TIMESTAMPTZ 2523
+#define F_TIMESTAMP_GE_TIMESTAMPTZ 2524
+#define F_TIMESTAMP_NE_TIMESTAMPTZ 2525
+#define F_TIMESTAMP_CMP_TIMESTAMPTZ 2526
+#define F_TIMESTAMPTZ_LT_TIMESTAMP 2527
+#define F_TIMESTAMPTZ_LE_TIMESTAMP 2528
+#define F_TIMESTAMPTZ_EQ_TIMESTAMP 2529
+#define F_TIMESTAMPTZ_GT_TIMESTAMP 2530
+#define F_TIMESTAMPTZ_GE_TIMESTAMP 2531
+#define F_TIMESTAMPTZ_NE_TIMESTAMP 2532
+#define F_TIMESTAMPTZ_CMP_TIMESTAMP 2533
+#define F_INTERVAL_PL_DATE 2546
+#define F_INTERVAL_PL_TIMETZ 2547
+#define F_INTERVAL_PL_TIMESTAMP 2548
+#define F_INTERVAL_PL_TIMESTAMPTZ 2549
+#define F_INTEGER_PL_DATE 2550
+#define F_PG_TABLESPACE_DATABASES 2556
+#define F_BOOL_INT4 2557
+#define F_INT4_BOOL 2558
+#define F_LASTVAL 2559
+#define F_PG_POSTMASTER_START_TIME 2560
+#define F_PG_BLOCKING_PIDS 2561
+#define F_BOX_BELOW 2562
+#define F_BOX_OVERBELOW 2563
+#define F_BOX_OVERABOVE 2564
+#define F_BOX_ABOVE 2565
+#define F_POLY_BELOW 2566
+#define F_POLY_OVERBELOW 2567
+#define F_POLY_OVERABOVE 2568
+#define F_POLY_ABOVE 2569
+#define F_GIST_BOX_CONSISTENT 2578
+#define F_FLOAT8_JSONB 2580
+#define F_GIST_BOX_PENALTY 2581
+#define F_GIST_BOX_PICKSPLIT 2582
+#define F_GIST_BOX_UNION 2583
+#define F_GIST_BOX_SAME 2584
+#define F_GIST_POLY_CONSISTENT 2585
+#define F_GIST_POLY_COMPRESS 2586
+#define F_CIRCLE_OVERBELOW 2587
+#define F_CIRCLE_OVERABOVE 2588
+#define F_GIST_CIRCLE_CONSISTENT 2591
+#define F_GIST_CIRCLE_COMPRESS 2592
+#define F_NUMERIC_STDDEV_POP 2596
+#define F_DOMAIN_IN 2597
+#define F_DOMAIN_RECV 2598
+#define F_PG_TIMEZONE_ABBREVS 2599
+#define F_XMLEXISTS 2614
+#define F_PG_RELOAD_CONF 2621
+#define F_PG_ROTATE_LOGFILE 2622
+#define F_PG_STAT_FILE_TEXT 2623
+#define F_PG_READ_FILE_TEXT_INT8_INT8 2624
+#define F_PG_LS_DIR_TEXT 2625
+#define F_PG_SLEEP 2626
+#define F_INETNOT 2627
+#define F_INETAND 2628
+#define F_INETOR 2629
+#define F_INETPL 2630
+#define F_INT8PL_INET 2631
+#define F_INETMI_INT8 2632
+#define F_INETMI 2633
+#define F_VAR_SAMP_INT8 2641
+#define F_VAR_SAMP_INT4 2642
+#define F_VAR_SAMP_INT2 2643
+#define F_VAR_SAMP_FLOAT4 2644
+#define F_VAR_SAMP_FLOAT8 2645
+#define F_VAR_SAMP_NUMERIC 2646
+#define F_TRANSACTION_TIMESTAMP 2647
+#define F_STATEMENT_TIMESTAMP 2648
+#define F_CLOCK_TIMESTAMP 2649
+#define F_GIN_CMP_PREFIX 2700
+#define F_PG_HAS_ROLE_NAME_NAME_TEXT 2705
+#define F_PG_HAS_ROLE_NAME_OID_TEXT 2706
+#define F_PG_HAS_ROLE_OID_NAME_TEXT 2707
+#define F_PG_HAS_ROLE_OID_OID_TEXT 2708
+#define F_PG_HAS_ROLE_NAME_TEXT 2709
+#define F_PG_HAS_ROLE_OID_TEXT 2710
+#define F_JUSTIFY_INTERVAL 2711
+#define F_STDDEV_SAMP_INT8 2712
+#define F_STDDEV_SAMP_INT4 2713
+#define F_STDDEV_SAMP_INT2 2714
+#define F_STDDEV_SAMP_FLOAT4 2715
+#define F_STDDEV_SAMP_FLOAT8 2716
+#define F_STDDEV_SAMP_NUMERIC 2717
+#define F_VAR_POP_INT8 2718
+#define F_VAR_POP_INT4 2719
+#define F_VAR_POP_INT2 2720
+#define F_VAR_POP_FLOAT4 2721
+#define F_VAR_POP_FLOAT8 2722
+#define F_VAR_POP_NUMERIC 2723
+#define F_STDDEV_POP_INT8 2724
+#define F_STDDEV_POP_INT4 2725
+#define F_STDDEV_POP_INT2 2726
+#define F_STDDEV_POP_FLOAT4 2727
+#define F_STDDEV_POP_FLOAT8 2728
+#define F_STDDEV_POP_NUMERIC 2729
+#define F_PG_GET_TRIGGERDEF_OID_BOOL 2730
+#define F_ASIND 2731
+#define F_ACOSD 2732
+#define F_ATAND 2733
+#define F_ATAN2D 2734
+#define F_SIND 2735
+#define F_COSD 2736
+#define F_TAND 2737
+#define F_COTD 2738
+#define F_PG_BACKUP_STOP 2739
+#define F_NUMERIC_AVG_SERIALIZE 2740
+#define F_NUMERIC_AVG_DESERIALIZE 2741
+#define F_GINARRAYEXTRACT_ANYARRAY_INTERNAL_INTERNAL 2743
+#define F_GINARRAYCONSISTENT 2744
+#define F_INT8_AVG_ACCUM 2746
+#define F_ARRAYOVERLAP 2747
+#define F_ARRAYCONTAINS 2748
+#define F_ARRAYCONTAINED 2749
+#define F_PG_STAT_GET_DB_TUPLES_RETURNED 2758
+#define F_PG_STAT_GET_DB_TUPLES_FETCHED 2759
+#define F_PG_STAT_GET_DB_TUPLES_INSERTED 2760
+#define F_PG_STAT_GET_DB_TUPLES_UPDATED 2761
+#define F_PG_STAT_GET_DB_TUPLES_DELETED 2762
+#define F_REGEXP_MATCHES_TEXT_TEXT 2763
+#define F_REGEXP_MATCHES_TEXT_TEXT_TEXT 2764
+#define F_REGEXP_SPLIT_TO_TABLE_TEXT_TEXT 2765
+#define F_REGEXP_SPLIT_TO_TABLE_TEXT_TEXT_TEXT 2766
+#define F_REGEXP_SPLIT_TO_ARRAY_TEXT_TEXT 2767
+#define F_REGEXP_SPLIT_TO_ARRAY_TEXT_TEXT_TEXT 2768
+#define F_PG_STAT_GET_BGWRITER_TIMED_CHECKPOINTS 2769
+#define F_PG_STAT_GET_BGWRITER_REQUESTED_CHECKPOINTS 2770
+#define F_PG_STAT_GET_BGWRITER_BUF_WRITTEN_CHECKPOINTS 2771
+#define F_PG_STAT_GET_BGWRITER_BUF_WRITTEN_CLEAN 2772
+#define F_PG_STAT_GET_BGWRITER_MAXWRITTEN_CLEAN 2773
+#define F_GINQUERYARRAYEXTRACT 2774
+#define F_PG_STAT_GET_BUF_WRITTEN_BACKEND 2775
+#define F_ANYNONARRAY_IN 2777
+#define F_ANYNONARRAY_OUT 2778
+#define F_PG_STAT_GET_LAST_VACUUM_TIME 2781
+#define F_PG_STAT_GET_LAST_AUTOVACUUM_TIME 2782
+#define F_PG_STAT_GET_LAST_ANALYZE_TIME 2783
+#define F_PG_STAT_GET_LAST_AUTOANALYZE_TIME 2784
+#define F_INT8_AVG_COMBINE 2785
+#define F_INT8_AVG_SERIALIZE 2786
+#define F_INT8_AVG_DESERIALIZE 2787
+#define F_PG_STAT_GET_BACKEND_WAIT_EVENT_TYPE 2788
+#define F_TIDGT 2790
+#define F_TIDLT 2791
+#define F_TIDGE 2792
+#define F_TIDLE 2793
+#define F_BTTIDCMP 2794
+#define F_TIDLARGER 2795
+#define F_TIDSMALLER 2796
+#define F_MAX_TID 2797
+#define F_MIN_TID 2798
+#define F_COUNT_ 2803
+#define F_INT8INC_ANY 2804
+#define F_INT8INC_FLOAT8_FLOAT8 2805
+#define F_FLOAT8_REGR_ACCUM 2806
+#define F_FLOAT8_REGR_SXX 2807
+#define F_FLOAT8_REGR_SYY 2808
+#define F_FLOAT8_REGR_SXY 2809
+#define F_FLOAT8_REGR_AVGX 2810
+#define F_FLOAT8_REGR_AVGY 2811
+#define F_FLOAT8_REGR_R2 2812
+#define F_FLOAT8_REGR_SLOPE 2813
+#define F_FLOAT8_REGR_INTERCEPT 2814
+#define F_FLOAT8_COVAR_POP 2815
+#define F_FLOAT8_COVAR_SAMP 2816
+#define F_FLOAT8_CORR 2817
+#define F_REGR_COUNT 2818
+#define F_REGR_SXX 2819
+#define F_REGR_SYY 2820
+#define F_REGR_SXY 2821
+#define F_REGR_AVGX 2822
+#define F_REGR_AVGY 2823
+#define F_REGR_R2 2824
+#define F_REGR_SLOPE 2825
+#define F_REGR_INTERCEPT 2826
+#define F_COVAR_POP 2827
+#define F_COVAR_SAMP 2828
+#define F_CORR 2829
+#define F_PG_STAT_GET_DB_BLK_READ_TIME 2844
+#define F_PG_STAT_GET_DB_BLK_WRITE_TIME 2845
+#define F_PG_SWITCH_WAL 2848
+#define F_PG_CURRENT_WAL_LSN 2849
+#define F_PG_WALFILE_NAME_OFFSET 2850
+#define F_PG_WALFILE_NAME 2851
+#define F_PG_CURRENT_WAL_INSERT_LSN 2852
+#define F_PG_STAT_GET_BACKEND_WAIT_EVENT 2853
+#define F_PG_MY_TEMP_SCHEMA 2854
+#define F_PG_IS_OTHER_TEMP_SCHEMA 2855
+#define F_PG_TIMEZONE_NAMES 2856
+#define F_PG_STAT_GET_BACKEND_XACT_START 2857
+#define F_NUMERIC_AVG_ACCUM 2858
+#define F_PG_STAT_GET_BUF_ALLOC 2859
+#define F_PG_STAT_GET_LIVE_TUPLES 2878
+#define F_PG_STAT_GET_DEAD_TUPLES 2879
+#define F_PG_ADVISORY_LOCK_INT8 2880
+#define F_PG_ADVISORY_LOCK_SHARED_INT8 2881
+#define F_PG_TRY_ADVISORY_LOCK_INT8 2882
+#define F_PG_TRY_ADVISORY_LOCK_SHARED_INT8 2883
+#define F_PG_ADVISORY_UNLOCK_INT8 2884
+#define F_PG_ADVISORY_UNLOCK_SHARED_INT8 2885
+#define F_PG_ADVISORY_LOCK_INT4_INT4 2886
+#define F_PG_ADVISORY_LOCK_SHARED_INT4_INT4 2887
+#define F_PG_TRY_ADVISORY_LOCK_INT4_INT4 2888
+#define F_PG_TRY_ADVISORY_LOCK_SHARED_INT4_INT4 2889
+#define F_PG_ADVISORY_UNLOCK_INT4_INT4 2890
+#define F_PG_ADVISORY_UNLOCK_SHARED_INT4_INT4 2891
+#define F_PG_ADVISORY_UNLOCK_ALL 2892
+#define F_XML_IN 2893
+#define F_XML_OUT 2894
+#define F_XMLCOMMENT 2895
+#define F_XML 2896
+#define F_XMLVALIDATE 2897
+#define F_XML_RECV 2898
+#define F_XML_SEND 2899
+#define F_XMLCONCAT2 2900
+#define F_XMLAGG 2901
+#define F_VARBITTYPMODIN 2902
+#define F_INTERVALTYPMODIN 2903
+#define F_INTERVALTYPMODOUT 2904
+#define F_TIMESTAMPTYPMODIN 2905
+#define F_TIMESTAMPTYPMODOUT 2906
+#define F_TIMESTAMPTZTYPMODIN 2907
+#define F_TIMESTAMPTZTYPMODOUT 2908
+#define F_TIMETYPMODIN 2909
+#define F_TIMETYPMODOUT 2910
+#define F_TIMETZTYPMODIN 2911
+#define F_TIMETZTYPMODOUT 2912
+#define F_BPCHARTYPMODIN 2913
+#define F_BPCHARTYPMODOUT 2914
+#define F_VARCHARTYPMODIN 2915
+#define F_VARCHARTYPMODOUT 2916
+#define F_NUMERICTYPMODIN 2917
+#define F_NUMERICTYPMODOUT 2918
+#define F_BITTYPMODIN 2919
+#define F_BITTYPMODOUT 2920
+#define F_VARBITTYPMODOUT 2921
+#define F_TEXT_XML 2922
+#define F_TABLE_TO_XML 2923
+#define F_QUERY_TO_XML 2924
+#define F_CURSOR_TO_XML 2925
+#define F_TABLE_TO_XMLSCHEMA 2926
+#define F_QUERY_TO_XMLSCHEMA 2927
+#define F_CURSOR_TO_XMLSCHEMA 2928
+#define F_TABLE_TO_XML_AND_XMLSCHEMA 2929
+#define F_QUERY_TO_XML_AND_XMLSCHEMA 2930
+#define F_XPATH_TEXT_XML__TEXT 2931
+#define F_XPATH_TEXT_XML 2932
+#define F_SCHEMA_TO_XML 2933
+#define F_SCHEMA_TO_XMLSCHEMA 2934
+#define F_SCHEMA_TO_XML_AND_XMLSCHEMA 2935
+#define F_DATABASE_TO_XML 2936
+#define F_DATABASE_TO_XMLSCHEMA 2937
+#define F_DATABASE_TO_XML_AND_XMLSCHEMA 2938
+#define F_TXID_SNAPSHOT_IN 2939
+#define F_TXID_SNAPSHOT_OUT 2940
+#define F_TXID_SNAPSHOT_RECV 2941
+#define F_TXID_SNAPSHOT_SEND 2942
+#define F_TXID_CURRENT 2943
+#define F_TXID_CURRENT_SNAPSHOT 2944
+#define F_TXID_SNAPSHOT_XMIN 2945
+#define F_TXID_SNAPSHOT_XMAX 2946
+#define F_TXID_SNAPSHOT_XIP 2947
+#define F_TXID_VISIBLE_IN_SNAPSHOT 2948
+#define F_UUID_IN 2952
+#define F_UUID_OUT 2953
+#define F_UUID_LT 2954
+#define F_UUID_LE 2955
+#define F_UUID_EQ 2956
+#define F_UUID_GE 2957
+#define F_UUID_GT 2958
+#define F_UUID_NE 2959
+#define F_UUID_CMP 2960
+#define F_UUID_RECV 2961
+#define F_UUID_SEND 2962
+#define F_UUID_HASH 2963
+#define F_TEXT_BOOL 2971
+#define F_PG_STAT_GET_FUNCTION_CALLS 2978
+#define F_PG_STAT_GET_FUNCTION_TOTAL_TIME 2979
+#define F_PG_STAT_GET_FUNCTION_SELF_TIME 2980
+#define F_RECORD_EQ 2981
+#define F_RECORD_NE 2982
+#define F_RECORD_LT 2983
+#define F_RECORD_GT 2984
+#define F_RECORD_LE 2985
+#define F_RECORD_GE 2986
+#define F_BTRECORDCMP 2987
+#define F_PG_TABLE_SIZE 2997
+#define F_PG_INDEXES_SIZE 2998
+#define F_PG_RELATION_FILENODE 2999
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_NAME_TEXT_TEXT 3000
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_NAME_OID_TEXT 3001
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_OID_TEXT_TEXT 3002
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_OID_OID_TEXT 3003
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_TEXT_TEXT 3004
+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_OID_TEXT 3005
+#define F_HAS_SERVER_PRIVILEGE_NAME_TEXT_TEXT 3006
+#define F_HAS_SERVER_PRIVILEGE_NAME_OID_TEXT 3007
+#define F_HAS_SERVER_PRIVILEGE_OID_TEXT_TEXT 3008
+#define F_HAS_SERVER_PRIVILEGE_OID_OID_TEXT 3009
+#define F_HAS_SERVER_PRIVILEGE_TEXT_TEXT 3010
+#define F_HAS_SERVER_PRIVILEGE_OID_TEXT 3011
+#define F_HAS_COLUMN_PRIVILEGE_NAME_TEXT_TEXT_TEXT 3012
+#define F_HAS_COLUMN_PRIVILEGE_NAME_TEXT_INT2_TEXT 3013
+#define F_HAS_COLUMN_PRIVILEGE_NAME_OID_TEXT_TEXT 3014
+#define F_HAS_COLUMN_PRIVILEGE_NAME_OID_INT2_TEXT 3015
+#define F_HAS_COLUMN_PRIVILEGE_OID_TEXT_TEXT_TEXT 3016
+#define F_HAS_COLUMN_PRIVILEGE_OID_TEXT_INT2_TEXT 3017
+#define F_HAS_COLUMN_PRIVILEGE_OID_OID_TEXT_TEXT 3018
+#define F_HAS_COLUMN_PRIVILEGE_OID_OID_INT2_TEXT 3019
+#define F_HAS_COLUMN_PRIVILEGE_TEXT_TEXT_TEXT 3020
+#define F_HAS_COLUMN_PRIVILEGE_TEXT_INT2_TEXT 3021
+#define F_HAS_COLUMN_PRIVILEGE_OID_TEXT_TEXT 3022
+#define F_HAS_COLUMN_PRIVILEGE_OID_INT2_TEXT 3023
+#define F_HAS_ANY_COLUMN_PRIVILEGE_NAME_TEXT_TEXT 3024
+#define F_HAS_ANY_COLUMN_PRIVILEGE_NAME_OID_TEXT 3025
+#define F_HAS_ANY_COLUMN_PRIVILEGE_OID_TEXT_TEXT 3026
+#define F_HAS_ANY_COLUMN_PRIVILEGE_OID_OID_TEXT 3027
+#define F_HAS_ANY_COLUMN_PRIVILEGE_TEXT_TEXT 3028
+#define F_HAS_ANY_COLUMN_PRIVILEGE_OID_TEXT 3029
+#define F_OVERLAY_BIT_BIT_INT4_INT4 3030
+#define F_OVERLAY_BIT_BIT_INT4 3031
+#define F_GET_BIT_BIT_INT4 3032
+#define F_SET_BIT_BIT_INT4_INT4 3033
+#define F_PG_RELATION_FILEPATH 3034
+#define F_PG_LISTENING_CHANNELS 3035
+#define F_PG_NOTIFY 3036
+#define F_PG_STAT_GET_XACT_NUMSCANS 3037
+#define F_PG_STAT_GET_XACT_TUPLES_RETURNED 3038
+#define F_PG_STAT_GET_XACT_TUPLES_FETCHED 3039
+#define F_PG_STAT_GET_XACT_TUPLES_INSERTED 3040
+#define F_PG_STAT_GET_XACT_TUPLES_UPDATED 3041
+#define F_PG_STAT_GET_XACT_TUPLES_DELETED 3042
+#define F_PG_STAT_GET_XACT_TUPLES_HOT_UPDATED 3043
+#define F_PG_STAT_GET_XACT_BLOCKS_FETCHED 3044
+#define F_PG_STAT_GET_XACT_BLOCKS_HIT 3045
+#define F_PG_STAT_GET_XACT_FUNCTION_CALLS 3046
+#define F_PG_STAT_GET_XACT_FUNCTION_TOTAL_TIME 3047
+#define F_PG_STAT_GET_XACT_FUNCTION_SELF_TIME 3048
+#define F_XPATH_EXISTS_TEXT_XML__TEXT 3049
+#define F_XPATH_EXISTS_TEXT_XML 3050
+#define F_XML_IS_WELL_FORMED 3051
+#define F_XML_IS_WELL_FORMED_DOCUMENT 3052
+#define F_XML_IS_WELL_FORMED_CONTENT 3053
+#define F_PG_STAT_GET_VACUUM_COUNT 3054
+#define F_PG_STAT_GET_AUTOVACUUM_COUNT 3055
+#define F_PG_STAT_GET_ANALYZE_COUNT 3056
+#define F_PG_STAT_GET_AUTOANALYZE_COUNT 3057
+#define F_CONCAT 3058
+#define F_CONCAT_WS 3059
+#define F_LEFT 3060
+#define F_RIGHT 3061
+#define F_REVERSE 3062
+#define F_PG_STAT_GET_BUF_FSYNC_BACKEND 3063
+#define F_GIST_POINT_DISTANCE 3064
+#define F_PG_STAT_GET_DB_CONFLICT_TABLESPACE 3065
+#define F_PG_STAT_GET_DB_CONFLICT_LOCK 3066
+#define F_PG_STAT_GET_DB_CONFLICT_SNAPSHOT 3067
+#define F_PG_STAT_GET_DB_CONFLICT_BUFFERPIN 3068
+#define F_PG_STAT_GET_DB_CONFLICT_STARTUP_DEADLOCK 3069
+#define F_PG_STAT_GET_DB_CONFLICT_ALL 3070
+#define F_PG_WAL_REPLAY_PAUSE 3071
+#define F_PG_WAL_REPLAY_RESUME 3072
+#define F_PG_IS_WAL_REPLAY_PAUSED 3073
+#define F_PG_STAT_GET_DB_STAT_RESET_TIME 3074
+#define F_PG_STAT_GET_BGWRITER_STAT_RESET_TIME 3075
+#define F_GINARRAYEXTRACT_ANYARRAY_INTERNAL 3076
+#define F_GIN_EXTRACT_TSVECTOR_TSVECTOR_INTERNAL 3077
+#define F_PG_SEQUENCE_PARAMETERS 3078
+#define F_PG_AVAILABLE_EXTENSIONS 3082
+#define F_PG_AVAILABLE_EXTENSION_VERSIONS 3083
+#define F_PG_EXTENSION_UPDATE_PATHS 3084
+#define F_PG_EXTENSION_CONFIG_DUMP 3086
+#define F_GIN_EXTRACT_TSQUERY_TSQUERY_INTERNAL_INT2_INTERNAL_INTERNAL 3087
+#define F_GIN_TSQUERY_CONSISTENT_INTERNAL_INT2_TSQUERY_INT4_INTERNAL_INTERNAL 3088
+#define F_PG_ADVISORY_XACT_LOCK_INT8 3089
+#define F_PG_ADVISORY_XACT_LOCK_SHARED_INT8 3090
+#define F_PG_TRY_ADVISORY_XACT_LOCK_INT8 3091
+#define F_PG_TRY_ADVISORY_XACT_LOCK_SHARED_INT8 3092
+#define F_PG_ADVISORY_XACT_LOCK_INT4_INT4 3093
+#define F_PG_ADVISORY_XACT_LOCK_SHARED_INT4_INT4 3094
+#define F_PG_TRY_ADVISORY_XACT_LOCK_INT4_INT4 3095
+#define F_PG_TRY_ADVISORY_XACT_LOCK_SHARED_INT4_INT4 3096
+#define F_VARCHAR_SUPPORT 3097
+#define F_PG_CREATE_RESTORE_POINT 3098
+#define F_PG_STAT_GET_WAL_SENDERS 3099
+#define F_ROW_NUMBER 3100
+#define F_RANK_ 3101
+#define F_DENSE_RANK_ 3102
+#define F_PERCENT_RANK_ 3103
+#define F_CUME_DIST_ 3104
+#define F_NTILE 3105
+#define F_LAG_ANYELEMENT 3106
+#define F_LAG_ANYELEMENT_INT4 3107
+#define F_LAG_ANYCOMPATIBLE_INT4_ANYCOMPATIBLE 3108
+#define F_LEAD_ANYELEMENT 3109
+#define F_LEAD_ANYELEMENT_INT4 3110
+#define F_LEAD_ANYCOMPATIBLE_INT4_ANYCOMPATIBLE 3111
+#define F_FIRST_VALUE 3112
+#define F_LAST_VALUE 3113
+#define F_NTH_VALUE 3114
+#define F_FDW_HANDLER_IN 3116
+#define F_FDW_HANDLER_OUT 3117
+#define F_VOID_RECV 3120
+#define F_VOID_SEND 3121
+#define F_BTINT2SORTSUPPORT 3129
+#define F_BTINT4SORTSUPPORT 3130
+#define F_BTINT8SORTSUPPORT 3131
+#define F_BTFLOAT4SORTSUPPORT 3132
+#define F_BTFLOAT8SORTSUPPORT 3133
+#define F_BTOIDSORTSUPPORT 3134
+#define F_BTNAMESORTSUPPORT 3135
+#define F_DATE_SORTSUPPORT 3136
+#define F_TIMESTAMP_SORTSUPPORT 3137
+#define F_HAS_TYPE_PRIVILEGE_NAME_TEXT_TEXT 3138
+#define F_HAS_TYPE_PRIVILEGE_NAME_OID_TEXT 3139
+#define F_HAS_TYPE_PRIVILEGE_OID_TEXT_TEXT 3140
+#define F_HAS_TYPE_PRIVILEGE_OID_OID_TEXT 3141
+#define F_HAS_TYPE_PRIVILEGE_TEXT_TEXT 3142
+#define F_HAS_TYPE_PRIVILEGE_OID_TEXT 3143
+#define F_MACADDR_NOT 3144
+#define F_MACADDR_AND 3145
+#define F_MACADDR_OR 3146
+#define F_PG_STAT_GET_DB_TEMP_FILES 3150
+#define F_PG_STAT_GET_DB_TEMP_BYTES 3151
+#define F_PG_STAT_GET_DB_DEADLOCKS 3152
+#define F_ARRAY_TO_JSON_ANYARRAY 3153
+#define F_ARRAY_TO_JSON_ANYARRAY_BOOL 3154
+#define F_ROW_TO_JSON_RECORD 3155
+#define F_ROW_TO_JSON_RECORD_BOOL 3156
+#define F_NUMERIC_SUPPORT 3157
+#define F_VARBIT_SUPPORT 3158
+#define F_PG_GET_VIEWDEF_OID_INT4 3159
+#define F_PG_STAT_GET_CHECKPOINT_WRITE_TIME 3160
+#define F_PG_STAT_GET_CHECKPOINT_SYNC_TIME 3161
+#define F_PG_COLLATION_FOR 3162
+#define F_PG_TRIGGER_DEPTH 3163
+#define F_PG_WAL_LSN_DIFF 3165
+#define F_PG_SIZE_PRETTY_NUMERIC 3166
+#define F_ARRAY_REMOVE 3167
+#define F_ARRAY_REPLACE 3168
+#define F_RANGESEL 3169
+#define F_LO_LSEEK64 3170
+#define F_LO_TELL64 3171
+#define F_LO_TRUNCATE64 3172
+#define F_JSON_AGG_TRANSFN 3173
+#define F_JSON_AGG_FINALFN 3174
+#define F_JSON_AGG 3175
+#define F_TO_JSON 3176
+#define F_PG_STAT_GET_MOD_SINCE_ANALYZE 3177
+#define F_NUMERIC_SUM 3178
+#define F_CARDINALITY 3179
+#define F_JSON_OBJECT_AGG_TRANSFN 3180
+#define F_RECORD_IMAGE_EQ 3181
+#define F_RECORD_IMAGE_NE 3182
+#define F_RECORD_IMAGE_LT 3183
+#define F_RECORD_IMAGE_GT 3184
+#define F_RECORD_IMAGE_LE 3185
+#define F_RECORD_IMAGE_GE 3186
+#define F_BTRECORDIMAGECMP 3187
+#define F_PG_STAT_GET_ARCHIVER 3195
+#define F_JSON_OBJECT_AGG_FINALFN 3196
+#define F_JSON_OBJECT_AGG 3197
+#define F_JSON_BUILD_ARRAY_ANY 3198
+#define F_JSON_BUILD_ARRAY_ 3199
+#define F_JSON_BUILD_OBJECT_ANY 3200
+#define F_JSON_BUILD_OBJECT_ 3201
+#define F_JSON_OBJECT__TEXT 3202
+#define F_JSON_OBJECT__TEXT__TEXT 3203
+#define F_JSON_TO_RECORD 3204
+#define F_JSON_TO_RECORDSET 3205
+#define F_JSONB_ARRAY_LENGTH 3207
+#define F_JSONB_EACH 3208
+#define F_JSONB_POPULATE_RECORD 3209
+#define F_JSONB_TYPEOF 3210
+#define F_JSONB_OBJECT_FIELD_TEXT 3214
+#define F_JSONB_ARRAY_ELEMENT 3215
+#define F_JSONB_ARRAY_ELEMENT_TEXT 3216
+#define F_JSONB_EXTRACT_PATH 3217
+#define F_WIDTH_BUCKET_ANYCOMPATIBLE_ANYCOMPATIBLEARRAY 3218
+#define F_JSONB_ARRAY_ELEMENTS 3219
+#define F_PG_LSN_IN 3229
+#define F_PG_LSN_OUT 3230
+#define F_PG_LSN_LT 3231
+#define F_PG_LSN_LE 3232
+#define F_PG_LSN_EQ 3233
+#define F_PG_LSN_GE 3234
+#define F_PG_LSN_GT 3235
+#define F_PG_LSN_NE 3236
+#define F_PG_LSN_MI 3237
+#define F_PG_LSN_RECV 3238
+#define F_PG_LSN_SEND 3239
+#define F_PG_LSN_CMP 3251
+#define F_PG_LSN_HASH 3252
+#define F_BTTEXTSORTSUPPORT 3255
+#define F_GENERATE_SERIES_NUMERIC_NUMERIC_NUMERIC 3259
+#define F_GENERATE_SERIES_NUMERIC_NUMERIC 3260
+#define F_JSON_STRIP_NULLS 3261
+#define F_JSONB_STRIP_NULLS 3262
+#define F_JSONB_OBJECT__TEXT 3263
+#define F_JSONB_OBJECT__TEXT__TEXT 3264
+#define F_JSONB_AGG_TRANSFN 3265
+#define F_JSONB_AGG_FINALFN 3266
+#define F_JSONB_AGG 3267
+#define F_JSONB_OBJECT_AGG_TRANSFN 3268
+#define F_JSONB_OBJECT_AGG_FINALFN 3269
+#define F_JSONB_OBJECT_AGG 3270
+#define F_JSONB_BUILD_ARRAY_ANY 3271
+#define F_JSONB_BUILD_ARRAY_ 3272
+#define F_JSONB_BUILD_OBJECT_ANY 3273
+#define F_JSONB_BUILD_OBJECT_ 3274
+#define F_DIST_PPOLY 3275
+#define F_ARRAY_POSITION_ANYCOMPATIBLEARRAY_ANYCOMPATIBLE 3277
+#define F_ARRAY_POSITION_ANYCOMPATIBLEARRAY_ANYCOMPATIBLE_INT4 3278
+#define F_ARRAY_POSITIONS 3279
+#define F_GIST_CIRCLE_DISTANCE 3280
+#define F_SCALE 3281
+#define F_GIST_POINT_FETCH 3282
+#define F_NUMERIC_SORTSUPPORT 3283
+#define F_GIST_POLY_DISTANCE 3288
+#define F_DIST_CPOINT 3290
+#define F_DIST_POLYP 3292
+#define F_PG_READ_FILE_TEXT_INT8_INT8_BOOL 3293
+#define F_CURRENT_SETTING_TEXT_BOOL 3294
+#define F_PG_READ_BINARY_FILE_TEXT_INT8_INT8_BOOL 3295
+#define F_PG_NOTIFICATION_QUEUE_USAGE 3296
+#define F_PG_LS_DIR_TEXT_BOOL_BOOL 3297
+#define F_ROW_SECURITY_ACTIVE_OID 3298
+#define F_ROW_SECURITY_ACTIVE_TEXT 3299
+#define F_UUID_SORTSUPPORT 3300
+#define F_JSONB_CONCAT 3301
+#define F_JSONB_DELETE_JSONB_TEXT 3302
+#define F_JSONB_DELETE_JSONB_INT4 3303
+#define F_JSONB_DELETE_PATH 3304
+#define F_JSONB_SET 3305
+#define F_JSONB_PRETTY 3306
+#define F_PG_STAT_FILE_TEXT_BOOL 3307
+#define F_XIDNEQ 3308
+#define F_XIDNEQINT4 3309
+#define F_TSM_HANDLER_IN 3311
+#define F_TSM_HANDLER_OUT 3312
+#define F_BERNOULLI 3313
+#define F_SYSTEM 3314
+#define F_PG_STAT_GET_WAL_RECEIVER 3317
+#define F_PG_STAT_GET_PROGRESS_INFO 3318
+#define F_TS_FILTER 3319
+#define F_SETWEIGHT_TSVECTOR_CHAR__TEXT 3320
+#define F_TS_DELETE_TSVECTOR_TEXT 3321
+#define F_UNNEST_TSVECTOR 3322
+#define F_TS_DELETE_TSVECTOR__TEXT 3323
+#define F_INT4_AVG_COMBINE 3324
+#define F_INTERVAL_COMBINE 3325
+#define F_TSVECTOR_TO_ARRAY 3326
+#define F_ARRAY_TO_TSVECTOR 3327
+#define F_BPCHAR_SORTSUPPORT 3328
+#define F_PG_SHOW_ALL_FILE_SETTINGS 3329
+#define F_PG_CURRENT_WAL_FLUSH_LSN 3330
+#define F_BYTEA_SORTSUPPORT 3331
+#define F_BTTEXT_PATTERN_SORTSUPPORT 3332
+#define F_BTBPCHAR_PATTERN_SORTSUPPORT 3333
+#define F_PG_SIZE_BYTES 3334
+#define F_NUMERIC_SERIALIZE 3335
+#define F_NUMERIC_DESERIALIZE 3336
+#define F_NUMERIC_AVG_COMBINE 3337
+#define F_NUMERIC_POLY_COMBINE 3338
+#define F_NUMERIC_POLY_SERIALIZE 3339
+#define F_NUMERIC_POLY_DESERIALIZE 3340
+#define F_NUMERIC_COMBINE 3341
+#define F_FLOAT8_REGR_COMBINE 3342
+#define F_JSONB_DELETE_JSONB__TEXT 3343
+#define F_CASH_MUL_INT8 3344
+#define F_CASH_DIV_INT8 3345
+#define F_TXID_CURRENT_IF_ASSIGNED 3348
+#define F_PG_GET_PARTKEYDEF 3352
+#define F_PG_LS_LOGDIR 3353
+#define F_PG_LS_WALDIR 3354
+#define F_PG_NDISTINCT_IN 3355
+#define F_PG_NDISTINCT_OUT 3356
+#define F_PG_NDISTINCT_RECV 3357
+#define F_PG_NDISTINCT_SEND 3358
+#define F_MACADDR_SORTSUPPORT 3359
+#define F_TXID_STATUS 3360
+#define F_PG_SAFE_SNAPSHOT_BLOCKING_PIDS 3376
+#define F_PG_ISOLATION_TEST_SESSION_IS_BLOCKED 3378
+#define F_PG_IDENTIFY_OBJECT_AS_ADDRESS 3382
+#define F_BRIN_MINMAX_OPCINFO 3383
+#define F_BRIN_MINMAX_ADD_VALUE 3384
+#define F_BRIN_MINMAX_CONSISTENT 3385
+#define F_BRIN_MINMAX_UNION 3386
+#define F_INT8_AVG_ACCUM_INV 3387
+#define F_NUMERIC_POLY_SUM 3388
+#define F_NUMERIC_POLY_AVG 3389
+#define F_NUMERIC_POLY_VAR_POP 3390
+#define F_NUMERIC_POLY_VAR_SAMP 3391
+#define F_NUMERIC_POLY_STDDEV_POP 3392
+#define F_NUMERIC_POLY_STDDEV_SAMP 3393
+#define F_REGEXP_MATCH_TEXT_TEXT 3396
+#define F_REGEXP_MATCH_TEXT_TEXT_TEXT 3397
+#define F_INT8_MUL_CASH 3399
+#define F_PG_CONFIG 3400
+#define F_PG_HBA_FILE_RULES 3401
+#define F_PG_STATISTICS_OBJ_IS_VISIBLE 3403
+#define F_PG_DEPENDENCIES_IN 3404
+#define F_PG_DEPENDENCIES_OUT 3405
+#define F_PG_DEPENDENCIES_RECV 3406
+#define F_PG_DEPENDENCIES_SEND 3407
+#define F_PG_GET_PARTITION_CONSTRAINTDEF 3408
+#define F_TIME_HASH_EXTENDED 3409
+#define F_TIMETZ_HASH_EXTENDED 3410
+#define F_TIMESTAMP_HASH_EXTENDED 3411
+#define F_UUID_HASH_EXTENDED 3412
+#define F_PG_LSN_HASH_EXTENDED 3413
+#define F_HASHENUMEXTENDED 3414
+#define F_PG_GET_STATISTICSOBJDEF 3415
+#define F_JSONB_HASH_EXTENDED 3416
+#define F_HASH_RANGE_EXTENDED 3417
+#define F_INTERVAL_HASH_EXTENDED 3418
+#define F_SHA224 3419
+#define F_SHA256 3420
+#define F_SHA384 3421
+#define F_SHA512 3422
+#define F_PG_PARTITION_TREE 3423
+#define F_PG_PARTITION_ROOT 3424
+#define F_PG_PARTITION_ANCESTORS 3425
+#define F_PG_STAT_GET_DB_CHECKSUM_FAILURES 3426
+#define F_PG_MCV_LIST_ITEMS 3427
+#define F_PG_STAT_GET_DB_CHECKSUM_LAST_FAILURE 3428
+#define F_GEN_RANDOM_UUID 3432
+#define F_GTSVECTOR_OPTIONS 3434
+#define F_GIST_POINT_SORTSUPPORT 3435
+#define F_PG_PROMOTE 3436
+#define F_PREFIXSEL 3437
+#define F_PREFIXJOINSEL 3438
+#define F_PG_CONTROL_SYSTEM 3441
+#define F_PG_CONTROL_CHECKPOINT 3442
+#define F_PG_CONTROL_RECOVERY 3443
+#define F_PG_CONTROL_INIT 3444
+#define F_PG_IMPORT_SYSTEM_COLLATIONS 3445
+#define F_MACADDR8_RECV 3446
+#define F_MACADDR8_SEND 3447
+#define F_PG_COLLATION_ACTUAL_VERSION 3448
+#define F_NUMERIC_JSONB 3449
+#define F_INT2_JSONB 3450
+#define F_INT4_JSONB 3451
+#define F_INT8_JSONB 3452
+#define F_FLOAT4_JSONB 3453
+#define F_PG_FILENODE_RELATION 3454
+#define F_LO_FROM_BYTEA 3457
+#define F_LO_GET_OID 3458
+#define F_LO_GET_OID_INT8_INT4 3459
+#define F_LO_PUT 3460
+#define F_MAKE_TIMESTAMP 3461
+#define F_MAKE_TIMESTAMPTZ_INT4_INT4_INT4_INT4_INT4_FLOAT8 3462
+#define F_MAKE_TIMESTAMPTZ_INT4_INT4_INT4_INT4_INT4_FLOAT8_TEXT 3463
+#define F_MAKE_INTERVAL 3464
+#define F_JSONB_ARRAY_ELEMENTS_TEXT 3465
+#define F_SPG_RANGE_QUAD_CONFIG 3469
+#define F_SPG_RANGE_QUAD_CHOOSE 3470
+#define F_SPG_RANGE_QUAD_PICKSPLIT 3471
+#define F_SPG_RANGE_QUAD_INNER_CONSISTENT 3472
+#define F_SPG_RANGE_QUAD_LEAF_CONSISTENT 3473
+#define F_JSONB_POPULATE_RECORDSET 3475
+#define F_TO_REGOPERATOR 3476
+#define F_JSONB_OBJECT_FIELD 3478
+#define F_TO_REGPROCEDURE 3479
+#define F_GIN_COMPARE_JSONB 3480
+#define F_GIN_EXTRACT_JSONB 3482
+#define F_GIN_EXTRACT_JSONB_QUERY 3483
+#define F_GIN_CONSISTENT_JSONB 3484
+#define F_GIN_EXTRACT_JSONB_PATH 3485
+#define F_GIN_EXTRACT_JSONB_QUERY_PATH 3486
+#define F_GIN_CONSISTENT_JSONB_PATH 3487
+#define F_GIN_TRICONSISTENT_JSONB 3488
+#define F_GIN_TRICONSISTENT_JSONB_PATH 3489
+#define F_JSONB_TO_RECORD 3490
+#define F_JSONB_TO_RECORDSET 3491
+#define F_TO_REGOPER 3492
+#define F_TO_REGTYPE 3493
+#define F_TO_REGPROC 3494
+#define F_TO_REGCLASS 3495
+#define F_BOOL_ACCUM 3496
+#define F_BOOL_ACCUM_INV 3497
+#define F_BOOL_ALLTRUE 3498
+#define F_BOOL_ANYTRUE 3499
+#define F_ANYENUM_IN 3504
+#define F_ANYENUM_OUT 3505
+#define F_ENUM_IN 3506
+#define F_ENUM_OUT 3507
+#define F_ENUM_EQ 3508
+#define F_ENUM_NE 3509
+#define F_ENUM_LT 3510
+#define F_ENUM_GT 3511
+#define F_ENUM_LE 3512
+#define F_ENUM_GE 3513
+#define F_ENUM_CMP 3514
+#define F_HASHENUM 3515
+#define F_ENUM_SMALLER 3524
+#define F_ENUM_LARGER 3525
+#define F_MAX_ANYENUM 3526
+#define F_MIN_ANYENUM 3527
+#define F_ENUM_FIRST 3528
+#define F_ENUM_LAST 3529
+#define F_ENUM_RANGE_ANYENUM_ANYENUM 3530
+#define F_ENUM_RANGE_ANYENUM 3531
+#define F_ENUM_RECV 3532
+#define F_ENUM_SEND 3533
+#define F_STRING_AGG_TRANSFN 3535
+#define F_STRING_AGG_FINALFN 3536
+#define F_PG_DESCRIBE_OBJECT 3537
+#define F_STRING_AGG_TEXT_TEXT 3538
+#define F_FORMAT_TEXT_ANY 3539
+#define F_FORMAT_TEXT 3540
+#define F_BYTEA_STRING_AGG_TRANSFN 3543
+#define F_BYTEA_STRING_AGG_FINALFN 3544
+#define F_STRING_AGG_BYTEA_BYTEA 3545
+#define F_INT8DEC 3546
+#define F_INT8DEC_ANY 3547
+#define F_NUMERIC_ACCUM_INV 3548
+#define F_INTERVAL_ACCUM_INV 3549
+#define F_NETWORK_OVERLAP 3551
+#define F_INET_GIST_CONSISTENT 3553
+#define F_INET_GIST_UNION 3554
+#define F_INET_GIST_COMPRESS 3555
+#define F_BOOL_JSONB 3556
+#define F_INET_GIST_PENALTY 3557
+#define F_INET_GIST_PICKSPLIT 3558
+#define F_INET_GIST_SAME 3559
+#define F_NETWORKSEL 3560
+#define F_NETWORKJOINSEL 3561
+#define F_NETWORK_LARGER 3562
+#define F_NETWORK_SMALLER 3563
+#define F_MAX_INET 3564
+#define F_MIN_INET 3565
+#define F_PG_EVENT_TRIGGER_DROPPED_OBJECTS 3566
+#define F_INT2_ACCUM_INV 3567
+#define F_INT4_ACCUM_INV 3568
+#define F_INT8_ACCUM_INV 3569
+#define F_INT2_AVG_ACCUM_INV 3570
+#define F_INT4_AVG_ACCUM_INV 3571
+#define F_INT2INT4_SUM 3572
+#define F_INET_GIST_FETCH 3573
+#define F_PG_LOGICAL_EMIT_MESSAGE_BOOL_TEXT_TEXT 3577
+#define F_PG_LOGICAL_EMIT_MESSAGE_BOOL_TEXT_BYTEA 3578
+#define F_JSONB_INSERT 3579
+#define F_PG_XACT_COMMIT_TIMESTAMP 3581
+#define F_BINARY_UPGRADE_SET_NEXT_PG_TYPE_OID 3582
+#define F_PG_LAST_COMMITTED_XACT 3583
+#define F_BINARY_UPGRADE_SET_NEXT_ARRAY_PG_TYPE_OID 3584
+#define F_BINARY_UPGRADE_SET_NEXT_HEAP_PG_CLASS_OID 3586
+#define F_BINARY_UPGRADE_SET_NEXT_INDEX_PG_CLASS_OID 3587
+#define F_BINARY_UPGRADE_SET_NEXT_TOAST_PG_CLASS_OID 3588
+#define F_BINARY_UPGRADE_SET_NEXT_PG_ENUM_OID 3589
+#define F_BINARY_UPGRADE_SET_NEXT_PG_AUTHID_OID 3590
+#define F_BINARY_UPGRADE_CREATE_EMPTY_EXTENSION 3591
+#define F_EVENT_TRIGGER_IN 3594
+#define F_EVENT_TRIGGER_OUT 3595
+#define F_TSVECTORIN 3610
+#define F_TSVECTOROUT 3611
+#define F_TSQUERYIN 3612
+#define F_TSQUERYOUT 3613
+#define F_TSVECTOR_LT 3616
+#define F_TSVECTOR_LE 3617
+#define F_TSVECTOR_EQ 3618
+#define F_TSVECTOR_NE 3619
+#define F_TSVECTOR_GE 3620
+#define F_TSVECTOR_GT 3621
+#define F_TSVECTOR_CMP 3622
+#define F_STRIP 3623
+#define F_SETWEIGHT_TSVECTOR_CHAR 3624
+#define F_TSVECTOR_CONCAT 3625
+#define F_TS_MATCH_VQ 3634
+#define F_TS_MATCH_QV 3635
+#define F_TSVECTORSEND 3638
+#define F_TSVECTORRECV 3639
+#define F_TSQUERYSEND 3640
+#define F_TSQUERYRECV 3641
+#define F_GTSVECTORIN 3646
+#define F_GTSVECTOROUT 3647
+#define F_GTSVECTOR_COMPRESS 3648
+#define F_GTSVECTOR_DECOMPRESS 3649
+#define F_GTSVECTOR_PICKSPLIT 3650
+#define F_GTSVECTOR_UNION 3651
+#define F_GTSVECTOR_SAME 3652
+#define F_GTSVECTOR_PENALTY 3653
+#define F_GTSVECTOR_CONSISTENT_INTERNAL_TSVECTOR_INT2_OID_INTERNAL 3654
+#define F_GIN_EXTRACT_TSVECTOR_TSVECTOR_INTERNAL_INTERNAL 3656
+#define F_GIN_EXTRACT_TSQUERY_TSVECTOR_INTERNAL_INT2_INTERNAL_INTERNAL_INTERNAL_INTERNAL 3657
+#define F_GIN_TSQUERY_CONSISTENT_INTERNAL_INT2_TSVECTOR_INT4_INTERNAL_INTERNAL_INTERNAL_INTERNAL 3658
+#define F_TSQUERY_LT 3662
+#define F_TSQUERY_LE 3663
+#define F_TSQUERY_EQ 3664
+#define F_TSQUERY_NE 3665
+#define F_TSQUERY_GE 3666
+#define F_TSQUERY_GT 3667
+#define F_TSQUERY_CMP 3668
+#define F_TSQUERY_AND 3669
+#define F_TSQUERY_OR 3670
+#define F_TSQUERY_NOT 3671
+#define F_NUMNODE 3672
+#define F_QUERYTREE 3673
+#define F_TS_REWRITE_TSQUERY_TSQUERY_TSQUERY 3684
+#define F_TS_REWRITE_TSQUERY_TEXT 3685
+#define F_TSMATCHSEL 3686
+#define F_TSMATCHJOINSEL 3687
+#define F_TS_TYPANALYZE 3688
+#define F_TS_STAT_TEXT 3689
+#define F_TS_STAT_TEXT_TEXT 3690
+#define F_TSQ_MCONTAINS 3691
+#define F_TSQ_MCONTAINED 3692
+#define F_GTSQUERY_COMPRESS 3695
+#define F_STARTS_WITH 3696
+#define F_GTSQUERY_PICKSPLIT 3697
+#define F_GTSQUERY_UNION 3698
+#define F_GTSQUERY_SAME 3699
+#define F_GTSQUERY_PENALTY 3700
+#define F_GTSQUERY_CONSISTENT_INTERNAL_TSQUERY_INT2_OID_INTERNAL 3701
+#define F_TS_RANK__FLOAT4_TSVECTOR_TSQUERY_INT4 3703
+#define F_TS_RANK__FLOAT4_TSVECTOR_TSQUERY 3704
+#define F_TS_RANK_TSVECTOR_TSQUERY_INT4 3705
+#define F_TS_RANK_TSVECTOR_TSQUERY 3706
+#define F_TS_RANK_CD__FLOAT4_TSVECTOR_TSQUERY_INT4 3707
+#define F_TS_RANK_CD__FLOAT4_TSVECTOR_TSQUERY 3708
+#define F_TS_RANK_CD_TSVECTOR_TSQUERY_INT4 3709
+#define F_TS_RANK_CD_TSVECTOR_TSQUERY 3710
+#define F_LENGTH_TSVECTOR 3711
+#define F_TS_TOKEN_TYPE_OID 3713
+#define F_TS_TOKEN_TYPE_TEXT 3714
+#define F_TS_PARSE_OID_TEXT 3715
+#define F_TS_PARSE_TEXT_TEXT 3716
+#define F_PRSD_START 3717
+#define F_PRSD_NEXTTOKEN 3718
+#define F_PRSD_END 3719
+#define F_PRSD_HEADLINE 3720
+#define F_PRSD_LEXTYPE 3721
+#define F_TS_LEXIZE 3723
+#define F_GIN_CMP_TSLEXEME 3724
+#define F_DSIMPLE_INIT 3725
+#define F_DSIMPLE_LEXIZE 3726
+#define F_DSYNONYM_INIT 3728
+#define F_DSYNONYM_LEXIZE 3729
+#define F_DISPELL_INIT 3731
+#define F_DISPELL_LEXIZE 3732
+#define F_REGCONFIGIN 3736
+#define F_REGCONFIGOUT 3737
+#define F_REGCONFIGRECV 3738
+#define F_REGCONFIGSEND 3739
+#define F_THESAURUS_INIT 3740
+#define F_THESAURUS_LEXIZE 3741
+#define F_TS_HEADLINE_REGCONFIG_TEXT_TSQUERY_TEXT 3743
+#define F_TS_HEADLINE_REGCONFIG_TEXT_TSQUERY 3744
+#define F_TO_TSVECTOR_REGCONFIG_TEXT 3745
+#define F_TO_TSQUERY_REGCONFIG_TEXT 3746
+#define F_PLAINTO_TSQUERY_REGCONFIG_TEXT 3747
+#define F_TO_TSVECTOR_TEXT 3749
+#define F_TO_TSQUERY_TEXT 3750
+#define F_PLAINTO_TSQUERY_TEXT 3751
+#define F_TSVECTOR_UPDATE_TRIGGER 3752
+#define F_TSVECTOR_UPDATE_TRIGGER_COLUMN 3753
+#define F_TS_HEADLINE_TEXT_TSQUERY_TEXT 3754
+#define F_TS_HEADLINE_TEXT_TSQUERY 3755
+#define F_PG_TS_PARSER_IS_VISIBLE 3756
+#define F_PG_TS_DICT_IS_VISIBLE 3757
+#define F_PG_TS_CONFIG_IS_VISIBLE 3758
+#define F_GET_CURRENT_TS_CONFIG 3759
+#define F_TS_MATCH_TT 3760
+#define F_TS_MATCH_TQ 3761
+#define F_PG_TS_TEMPLATE_IS_VISIBLE 3768
+#define F_REGDICTIONARYIN 3771
+#define F_REGDICTIONARYOUT 3772
+#define F_REGDICTIONARYRECV 3773
+#define F_REGDICTIONARYSEND 3774
+#define F_PG_STAT_RESET_SHARED 3775
+#define F_PG_STAT_RESET_SINGLE_TABLE_COUNTERS 3776
+#define F_PG_STAT_RESET_SINGLE_FUNCTION_COUNTERS 3777
+#define F_PG_TABLESPACE_LOCATION 3778
+#define F_PG_CREATE_PHYSICAL_REPLICATION_SLOT 3779
+#define F_PG_DROP_REPLICATION_SLOT 3780
+#define F_PG_GET_REPLICATION_SLOTS 3781
+#define F_PG_LOGICAL_SLOT_GET_CHANGES 3782
+#define F_PG_LOGICAL_SLOT_GET_BINARY_CHANGES 3783
+#define F_PG_LOGICAL_SLOT_PEEK_CHANGES 3784
+#define F_PG_LOGICAL_SLOT_PEEK_BINARY_CHANGES 3785
+#define F_PG_CREATE_LOGICAL_REPLICATION_SLOT 3786
+#define F_TO_JSONB 3787
+#define F_PG_STAT_GET_SNAPSHOT_TIMESTAMP 3788
+#define F_GIN_CLEAN_PENDING_LIST 3789
+#define F_GTSVECTOR_CONSISTENT_INTERNAL_GTSVECTOR_INT4_OID_INTERNAL 3790
+#define F_GIN_EXTRACT_TSQUERY_TSQUERY_INTERNAL_INT2_INTERNAL_INTERNAL_INTERNAL_INTERNAL 3791
+#define F_GIN_TSQUERY_CONSISTENT_INTERNAL_INT2_TSQUERY_INT4_INTERNAL_INTERNAL_INTERNAL_INTERNAL 3792
+#define F_GTSQUERY_CONSISTENT_INTERNAL_INTERNAL_INT4_OID_INTERNAL 3793
+#define F_INET_SPG_CONFIG 3795
+#define F_INET_SPG_CHOOSE 3796
+#define F_INET_SPG_PICKSPLIT 3797
+#define F_INET_SPG_INNER_CONSISTENT 3798
+#define F_INET_SPG_LEAF_CONSISTENT 3799
+#define F_PG_CURRENT_LOGFILE_ 3800
+#define F_PG_CURRENT_LOGFILE_TEXT 3801
+#define F_JSONB_SEND 3803
+#define F_JSONB_OUT 3804
+#define F_JSONB_RECV 3805
+#define F_JSONB_IN 3806
+#define F_PG_GET_FUNCTION_ARG_DEFAULT 3808
+#define F_PG_EXPORT_SNAPSHOT 3809
+#define F_PG_IS_IN_RECOVERY 3810
+#define F_MONEY_INT4 3811
+#define F_MONEY_INT8 3812
+#define F_PG_COLLATION_IS_VISIBLE 3815
+#define F_ARRAY_TYPANALYZE 3816
+#define F_ARRAYCONTSEL 3817
+#define F_ARRAYCONTJOINSEL 3818
+#define F_PG_GET_MULTIXACT_MEMBERS 3819
+#define F_PG_LAST_WAL_RECEIVE_LSN 3820
+#define F_PG_LAST_WAL_REPLAY_LSN 3821
+#define F_CASH_DIV_CASH 3822
+#define F_NUMERIC_MONEY 3823
+#define F_MONEY_NUMERIC 3824
+#define F_PG_READ_FILE_TEXT 3826
+#define F_PG_READ_BINARY_FILE_TEXT_INT8_INT8 3827
+#define F_PG_READ_BINARY_FILE_TEXT 3828
+#define F_PG_OPFAMILY_IS_VISIBLE 3829
+#define F_PG_LAST_XACT_REPLAY_TIMESTAMP 3830
+#define F_ANYRANGE_IN 3832
+#define F_ANYRANGE_OUT 3833
+#define F_RANGE_IN 3834
+#define F_RANGE_OUT 3835
+#define F_RANGE_RECV 3836
+#define F_RANGE_SEND 3837
+#define F_PG_IDENTIFY_OBJECT 3839
+#define F_INT4RANGE_INT4_INT4 3840
+#define F_INT4RANGE_INT4_INT4_TEXT 3841
+#define F_PG_RELATION_IS_UPDATABLE 3842
+#define F_PG_COLUMN_IS_UPDATABLE 3843
+#define F_NUMRANGE_NUMERIC_NUMERIC 3844
+#define F_NUMRANGE_NUMERIC_NUMERIC_TEXT 3845
+#define F_MAKE_DATE 3846
+#define F_MAKE_TIME 3847
+#define F_LOWER_ANYRANGE 3848
+#define F_UPPER_ANYRANGE 3849
+#define F_ISEMPTY_ANYRANGE 3850
+#define F_LOWER_INC_ANYRANGE 3851
+#define F_UPPER_INC_ANYRANGE 3852
+#define F_LOWER_INF_ANYRANGE 3853
+#define F_UPPER_INF_ANYRANGE 3854
+#define F_RANGE_EQ 3855
+#define F_RANGE_NE 3856
+#define F_RANGE_OVERLAPS 3857
+#define F_RANGE_CONTAINS_ELEM 3858
+#define F_RANGE_CONTAINS 3859
+#define F_ELEM_CONTAINED_BY_RANGE 3860
+#define F_RANGE_CONTAINED_BY 3861
+#define F_RANGE_ADJACENT 3862
+#define F_RANGE_BEFORE 3863
+#define F_RANGE_AFTER 3864
+#define F_RANGE_OVERLEFT 3865
+#define F_RANGE_OVERRIGHT 3866
+#define F_RANGE_UNION 3867
+#define F_RANGE_INTERSECT 3868
+#define F_RANGE_MINUS 3869
+#define F_RANGE_CMP 3870
+#define F_RANGE_LT 3871
+#define F_RANGE_LE 3872
+#define F_RANGE_GE 3873
+#define F_RANGE_GT 3874
+#define F_RANGE_GIST_CONSISTENT 3875
+#define F_RANGE_GIST_UNION 3876
+#define F_PG_REPLICATION_SLOT_ADVANCE 3878
+#define F_RANGE_GIST_PENALTY 3879
+#define F_RANGE_GIST_PICKSPLIT 3880
+#define F_RANGE_GIST_SAME 3881
+#define F_HASH_RANGE 3902
+#define F_INT4RANGE_CANONICAL 3914
+#define F_DATERANGE_CANONICAL 3915
+#define F_RANGE_TYPANALYZE 3916
+#define F_TIMESTAMP_SUPPORT 3917
+#define F_INTERVAL_SUPPORT 3918
+#define F_GINARRAYTRICONSISTENT 3920
+#define F_GIN_TSQUERY_TRICONSISTENT 3921
+#define F_INT4RANGE_SUBDIFF 3922
+#define F_INT8RANGE_SUBDIFF 3923
+#define F_NUMRANGE_SUBDIFF 3924
+#define F_DATERANGE_SUBDIFF 3925
+#define F_INT8RANGE_CANONICAL 3928
+#define F_TSRANGE_SUBDIFF 3929
+#define F_TSTZRANGE_SUBDIFF 3930
+#define F_JSONB_OBJECT_KEYS 3931
+#define F_JSONB_EACH_TEXT 3932
+#define F_TSRANGE_TIMESTAMP_TIMESTAMP 3933
+#define F_TSRANGE_TIMESTAMP_TIMESTAMP_TEXT 3934
+#define F_PG_SLEEP_FOR 3935
+#define F_PG_SLEEP_UNTIL 3936
+#define F_TSTZRANGE_TIMESTAMPTZ_TIMESTAMPTZ 3937
+#define F_TSTZRANGE_TIMESTAMPTZ_TIMESTAMPTZ_TEXT 3938
+#define F_MXID_AGE 3939
+#define F_JSONB_EXTRACT_PATH_TEXT 3940
+#define F_DATERANGE_DATE_DATE 3941
+#define F_DATERANGE_DATE_DATE_TEXT 3942
+#define F_ACLDEFAULT 3943
+#define F_TIME_SUPPORT 3944
+#define F_INT8RANGE_INT8_INT8 3945
+#define F_INT8RANGE_INT8_INT8_TEXT 3946
+#define F_JSON_OBJECT_FIELD 3947
+#define F_JSON_OBJECT_FIELD_TEXT 3948
+#define F_JSON_ARRAY_ELEMENT 3949
+#define F_JSON_ARRAY_ELEMENT_TEXT 3950
+#define F_JSON_EXTRACT_PATH 3951
+#define F_BRIN_SUMMARIZE_NEW_VALUES 3952
+#define F_JSON_EXTRACT_PATH_TEXT 3953
+#define F_PG_GET_OBJECT_ADDRESS 3954
+#define F_JSON_ARRAY_ELEMENTS 3955
+#define F_JSON_ARRAY_LENGTH 3956
+#define F_JSON_OBJECT_KEYS 3957
+#define F_JSON_EACH 3958
+#define F_JSON_EACH_TEXT 3959
+#define F_JSON_POPULATE_RECORD 3960
+#define F_JSON_POPULATE_RECORDSET 3961
+#define F_JSON_TYPEOF 3968
+#define F_JSON_ARRAY_ELEMENTS_TEXT 3969
+#define F_ORDERED_SET_TRANSITION 3970
+#define F_ORDERED_SET_TRANSITION_MULTI 3971
+#define F_PERCENTILE_DISC_FLOAT8_ANYELEMENT 3972
+#define F_PERCENTILE_DISC_FINAL 3973
+#define F_PERCENTILE_CONT_FLOAT8_FLOAT8 3974
+#define F_PERCENTILE_CONT_FLOAT8_FINAL 3975
+#define F_PERCENTILE_CONT_FLOAT8_INTERVAL 3976
+#define F_PERCENTILE_CONT_INTERVAL_FINAL 3977
+#define F_PERCENTILE_DISC__FLOAT8_ANYELEMENT 3978
+#define F_PERCENTILE_DISC_MULTI_FINAL 3979
+#define F_PERCENTILE_CONT__FLOAT8_FLOAT8 3980
+#define F_PERCENTILE_CONT_FLOAT8_MULTI_FINAL 3981
+#define F_PERCENTILE_CONT__FLOAT8_INTERVAL 3982
+#define F_PERCENTILE_CONT_INTERVAL_MULTI_FINAL 3983
+#define F_MODE 3984
+#define F_MODE_FINAL 3985
+#define F_RANK_ANY 3986
+#define F_RANK_FINAL 3987
+#define F_PERCENT_RANK_ANY 3988
+#define F_PERCENT_RANK_FINAL 3989
+#define F_CUME_DIST_ANY 3990
+#define F_CUME_DIST_FINAL 3991
+#define F_DENSE_RANK_ANY 3992
+#define F_DENSE_RANK_FINAL 3993
+#define F_GENERATE_SERIES_INT4_SUPPORT 3994
+#define F_GENERATE_SERIES_INT8_SUPPORT 3995
+#define F_ARRAY_UNNEST_SUPPORT 3996
+#define F_GIST_BOX_DISTANCE 3998
+#define F_BRIN_SUMMARIZE_RANGE 3999
+#define F_JSONPATH_IN 4001
+#define F_JSONPATH_RECV 4002
+#define F_JSONPATH_OUT 4003
+#define F_JSONPATH_SEND 4004
+#define F_JSONB_PATH_EXISTS 4005
+#define F_JSONB_PATH_QUERY 4006
+#define F_JSONB_PATH_QUERY_ARRAY 4007
+#define F_JSONB_PATH_QUERY_FIRST 4008
+#define F_JSONB_PATH_MATCH 4009
+#define F_JSONB_PATH_EXISTS_OPR 4010
+#define F_JSONB_PATH_MATCH_OPR 4011
+#define F_BRIN_DESUMMARIZE_RANGE 4014
+#define F_SPG_QUAD_CONFIG 4018
+#define F_SPG_QUAD_CHOOSE 4019
+#define F_SPG_QUAD_PICKSPLIT 4020
+#define F_SPG_QUAD_INNER_CONSISTENT 4021
+#define F_SPG_QUAD_LEAF_CONSISTENT 4022
+#define F_SPG_KD_CONFIG 4023
+#define F_SPG_KD_CHOOSE 4024
+#define F_SPG_KD_PICKSPLIT 4025
+#define F_SPG_KD_INNER_CONSISTENT 4026
+#define F_SPG_TEXT_CONFIG 4027
+#define F_SPG_TEXT_CHOOSE 4028
+#define F_SPG_TEXT_PICKSPLIT 4029
+#define F_SPG_TEXT_INNER_CONSISTENT 4030
+#define F_SPG_TEXT_LEAF_CONSISTENT 4031
+#define F_PG_SEQUENCE_LAST_VALUE 4032
+#define F_JSONB_NE 4038
+#define F_JSONB_LT 4039
+#define F_JSONB_GT 4040
+#define F_JSONB_LE 4041
+#define F_JSONB_GE 4042
+#define F_JSONB_EQ 4043
+#define F_JSONB_CMP 4044
+#define F_JSONB_HASH 4045
+#define F_JSONB_CONTAINS 4046
+#define F_JSONB_EXISTS 4047
+#define F_JSONB_EXISTS_ANY 4048
+#define F_JSONB_EXISTS_ALL 4049
+#define F_JSONB_CONTAINED 4050
+#define F_ARRAY_AGG_ARRAY_TRANSFN 4051
+#define F_ARRAY_AGG_ARRAY_FINALFN 4052
+#define F_ARRAY_AGG_ANYARRAY 4053
+#define F_RANGE_MERGE_ANYRANGE_ANYRANGE 4057
+#define F_INET_MERGE 4063
+#define F_BOUND_BOX 4067
+#define F_INET_SAME_FAMILY 4071
+#define F_BINARY_UPGRADE_SET_RECORD_INIT_PRIVS 4083
+#define F_REGNAMESPACEIN 4084
+#define F_REGNAMESPACEOUT 4085
+#define F_TO_REGNAMESPACE 4086
+#define F_REGNAMESPACERECV 4087
+#define F_REGNAMESPACESEND 4088
+#define F_BOX_POINT 4091
+#define F_REGROLEOUT 4092
+#define F_TO_REGROLE 4093
+#define F_REGROLERECV 4094
+#define F_REGROLESEND 4095
+#define F_REGROLEIN 4098
+#define F_PG_ROTATE_LOGFILE_OLD 4099
+#define F_PG_READ_FILE_OLD 4100
+#define F_BINARY_UPGRADE_SET_MISSING_VALUE 4101
+#define F_BRIN_INCLUSION_OPCINFO 4105
+#define F_BRIN_INCLUSION_ADD_VALUE 4106
+#define F_BRIN_INCLUSION_CONSISTENT 4107
+#define F_BRIN_INCLUSION_UNION 4108
+#define F_MACADDR8_IN 4110
+#define F_MACADDR8_OUT 4111
+#define F_TRUNC_MACADDR8 4112
+#define F_MACADDR8_EQ 4113
+#define F_MACADDR8_LT 4114
+#define F_MACADDR8_LE 4115
+#define F_MACADDR8_GT 4116
+#define F_MACADDR8_GE 4117
+#define F_MACADDR8_NE 4118
+#define F_MACADDR8_CMP 4119
+#define F_MACADDR8_NOT 4120
+#define F_MACADDR8_AND 4121
+#define F_MACADDR8_OR 4122
+#define F_MACADDR8 4123
+#define F_MACADDR 4124
+#define F_MACADDR8_SET7BIT 4125
+#define F_IN_RANGE_INT8_INT8_INT8_BOOL_BOOL 4126
+#define F_IN_RANGE_INT4_INT4_INT8_BOOL_BOOL 4127
+#define F_IN_RANGE_INT4_INT4_INT4_BOOL_BOOL 4128
+#define F_IN_RANGE_INT4_INT4_INT2_BOOL_BOOL 4129
+#define F_IN_RANGE_INT2_INT2_INT8_BOOL_BOOL 4130
+#define F_IN_RANGE_INT2_INT2_INT4_BOOL_BOOL 4131
+#define F_IN_RANGE_INT2_INT2_INT2_BOOL_BOOL 4132
+#define F_IN_RANGE_DATE_DATE_INTERVAL_BOOL_BOOL 4133
+#define F_IN_RANGE_TIMESTAMP_TIMESTAMP_INTERVAL_BOOL_BOOL 4134
+#define F_IN_RANGE_TIMESTAMPTZ_TIMESTAMPTZ_INTERVAL_BOOL_BOOL 4135
+#define F_IN_RANGE_INTERVAL_INTERVAL_INTERVAL_BOOL_BOOL 4136
+#define F_IN_RANGE_TIME_TIME_INTERVAL_BOOL_BOOL 4137
+#define F_IN_RANGE_TIMETZ_TIMETZ_INTERVAL_BOOL_BOOL 4138
+#define F_IN_RANGE_FLOAT8_FLOAT8_FLOAT8_BOOL_BOOL 4139
+#define F_IN_RANGE_FLOAT4_FLOAT4_FLOAT8_BOOL_BOOL 4140
+#define F_IN_RANGE_NUMERIC_NUMERIC_NUMERIC_BOOL_BOOL 4141
+#define F_PG_LSN_LARGER 4187
+#define F_PG_LSN_SMALLER 4188
+#define F_MAX_PG_LSN 4189
+#define F_MIN_PG_LSN 4190
+#define F_REGCOLLATIONIN 4193
+#define F_REGCOLLATIONOUT 4194
+#define F_TO_REGCOLLATION 4195
+#define F_REGCOLLATIONRECV 4196
+#define F_REGCOLLATIONSEND 4197
+#define F_TS_HEADLINE_REGCONFIG_JSONB_TSQUERY_TEXT 4201
+#define F_TS_HEADLINE_REGCONFIG_JSONB_TSQUERY 4202
+#define F_TS_HEADLINE_JSONB_TSQUERY_TEXT 4203
+#define F_TS_HEADLINE_JSONB_TSQUERY 4204
+#define F_TS_HEADLINE_REGCONFIG_JSON_TSQUERY_TEXT 4205
+#define F_TS_HEADLINE_REGCONFIG_JSON_TSQUERY 4206
+#define F_TS_HEADLINE_JSON_TSQUERY_TEXT 4207
+#define F_TS_HEADLINE_JSON_TSQUERY 4208
+#define F_TO_TSVECTOR_JSONB 4209
+#define F_TO_TSVECTOR_JSON 4210
+#define F_TO_TSVECTOR_REGCONFIG_JSONB 4211
+#define F_TO_TSVECTOR_REGCONFIG_JSON 4212
+#define F_JSONB_TO_TSVECTOR_JSONB_JSONB 4213
+#define F_JSONB_TO_TSVECTOR_REGCONFIG_JSONB_JSONB 4214
+#define F_JSON_TO_TSVECTOR_JSON_JSONB 4215
+#define F_JSON_TO_TSVECTOR_REGCONFIG_JSON_JSONB 4216
+#define F_PG_COPY_PHYSICAL_REPLICATION_SLOT_NAME_NAME_BOOL 4220
+#define F_PG_COPY_PHYSICAL_REPLICATION_SLOT_NAME_NAME 4221
+#define F_PG_COPY_LOGICAL_REPLICATION_SLOT_NAME_NAME_BOOL_NAME 4222
+#define F_PG_COPY_LOGICAL_REPLICATION_SLOT_NAME_NAME_BOOL 4223
+#define F_PG_COPY_LOGICAL_REPLICATION_SLOT_NAME_NAME 4224
+#define F_ANYCOMPATIBLEMULTIRANGE_IN 4226
+#define F_ANYCOMPATIBLEMULTIRANGE_OUT 4227
+#define F_RANGE_MERGE_ANYMULTIRANGE 4228
+#define F_ANYMULTIRANGE_IN 4229
+#define F_ANYMULTIRANGE_OUT 4230
+#define F_MULTIRANGE_IN 4231
+#define F_MULTIRANGE_OUT 4232
+#define F_MULTIRANGE_RECV 4233
+#define F_MULTIRANGE_SEND 4234
+#define F_LOWER_ANYMULTIRANGE 4235
+#define F_UPPER_ANYMULTIRANGE 4236
+#define F_ISEMPTY_ANYMULTIRANGE 4237
+#define F_LOWER_INC_ANYMULTIRANGE 4238
+#define F_UPPER_INC_ANYMULTIRANGE 4239
+#define F_LOWER_INF_ANYMULTIRANGE 4240
+#define F_UPPER_INF_ANYMULTIRANGE 4241
+#define F_MULTIRANGE_TYPANALYZE 4242
+#define F_MULTIRANGESEL 4243
+#define F_MULTIRANGE_EQ 4244
+#define F_MULTIRANGE_NE 4245
+#define F_RANGE_OVERLAPS_MULTIRANGE 4246
+#define F_MULTIRANGE_OVERLAPS_RANGE 4247
+#define F_MULTIRANGE_OVERLAPS_MULTIRANGE 4248
+#define F_MULTIRANGE_CONTAINS_ELEM 4249
+#define F_MULTIRANGE_CONTAINS_RANGE 4250
+#define F_MULTIRANGE_CONTAINS_MULTIRANGE 4251
+#define F_ELEM_CONTAINED_BY_MULTIRANGE 4252
+#define F_RANGE_CONTAINED_BY_MULTIRANGE 4253
+#define F_MULTIRANGE_CONTAINED_BY_MULTIRANGE 4254
+#define F_RANGE_ADJACENT_MULTIRANGE 4255
+#define F_MULTIRANGE_ADJACENT_MULTIRANGE 4256
+#define F_MULTIRANGE_ADJACENT_RANGE 4257
+#define F_RANGE_BEFORE_MULTIRANGE 4258
+#define F_MULTIRANGE_BEFORE_RANGE 4259
+#define F_MULTIRANGE_BEFORE_MULTIRANGE 4260
+#define F_RANGE_AFTER_MULTIRANGE 4261
+#define F_MULTIRANGE_AFTER_RANGE 4262
+#define F_MULTIRANGE_AFTER_MULTIRANGE 4263
+#define F_RANGE_OVERLEFT_MULTIRANGE 4264
+#define F_MULTIRANGE_OVERLEFT_RANGE 4265
+#define F_MULTIRANGE_OVERLEFT_MULTIRANGE 4266
+#define F_RANGE_OVERRIGHT_MULTIRANGE 4267
+#define F_MULTIRANGE_OVERRIGHT_RANGE 4268
+#define F_MULTIRANGE_OVERRIGHT_MULTIRANGE 4269
+#define F_MULTIRANGE_UNION 4270
+#define F_MULTIRANGE_MINUS 4271
+#define F_MULTIRANGE_INTERSECT 4272
+#define F_MULTIRANGE_CMP 4273
+#define F_MULTIRANGE_LT 4274
+#define F_MULTIRANGE_LE 4275
+#define F_MULTIRANGE_GE 4276
+#define F_MULTIRANGE_GT 4277
+#define F_HASH_MULTIRANGE 4278
+#define F_HASH_MULTIRANGE_EXTENDED 4279
+#define F_INT4MULTIRANGE_ 4280
+#define F_INT4MULTIRANGE_INT4RANGE 4281
+#define F_INT4MULTIRANGE__INT4RANGE 4282
+#define F_NUMMULTIRANGE_ 4283
+#define F_NUMMULTIRANGE_NUMRANGE 4284
+#define F_NUMMULTIRANGE__NUMRANGE 4285
+#define F_TSMULTIRANGE_ 4286
+#define F_TSMULTIRANGE_TSRANGE 4287
+#define F_TSMULTIRANGE__TSRANGE 4288
+#define F_TSTZMULTIRANGE_ 4289
+#define F_TSTZMULTIRANGE_TSTZRANGE 4290
+#define F_TSTZMULTIRANGE__TSTZRANGE 4291
+#define F_DATEMULTIRANGE_ 4292
+#define F_DATEMULTIRANGE_DATERANGE 4293
+#define F_DATEMULTIRANGE__DATERANGE 4294
+#define F_INT8MULTIRANGE_ 4295
+#define F_INT8MULTIRANGE_INT8RANGE 4296
+#define F_INT8MULTIRANGE__INT8RANGE 4297
+#define F_MULTIRANGE 4298
+#define F_RANGE_AGG_TRANSFN 4299
+#define F_RANGE_AGG_FINALFN 4300
+#define F_RANGE_AGG_ANYRANGE 4301
+#define F_KOI8R_TO_MIC 4302
+#define F_MIC_TO_KOI8R 4303
+#define F_ISO_TO_MIC 4304
+#define F_MIC_TO_ISO 4305
+#define F_WIN1251_TO_MIC 4306
+#define F_MIC_TO_WIN1251 4307
+#define F_WIN866_TO_MIC 4308
+#define F_MIC_TO_WIN866 4309
+#define F_KOI8R_TO_WIN1251 4310
+#define F_WIN1251_TO_KOI8R 4311
+#define F_KOI8R_TO_WIN866 4312
+#define F_WIN866_TO_KOI8R 4313
+#define F_WIN866_TO_WIN1251 4314
+#define F_WIN1251_TO_WIN866 4315
+#define F_ISO_TO_KOI8R 4316
+#define F_KOI8R_TO_ISO 4317
+#define F_ISO_TO_WIN1251 4318
+#define F_WIN1251_TO_ISO 4319
+#define F_ISO_TO_WIN866 4320
+#define F_WIN866_TO_ISO 4321
+#define F_EUC_CN_TO_MIC 4322
+#define F_MIC_TO_EUC_CN 4323
+#define F_EUC_JP_TO_SJIS 4324
+#define F_SJIS_TO_EUC_JP 4325
+#define F_EUC_JP_TO_MIC 4326
+#define F_SJIS_TO_MIC 4327
+#define F_MIC_TO_EUC_JP 4328
+#define F_MIC_TO_SJIS 4329
+#define F_EUC_KR_TO_MIC 4330
+#define F_MIC_TO_EUC_KR 4331
+#define F_EUC_TW_TO_BIG5 4332
+#define F_BIG5_TO_EUC_TW 4333
+#define F_EUC_TW_TO_MIC 4334
+#define F_BIG5_TO_MIC 4335
+#define F_MIC_TO_EUC_TW 4336
+#define F_MIC_TO_BIG5 4337
+#define F_LATIN2_TO_MIC 4338
+#define F_MIC_TO_LATIN2 4339
+#define F_WIN1250_TO_MIC 4340
+#define F_MIC_TO_WIN1250 4341
+#define F_LATIN2_TO_WIN1250 4342
+#define F_WIN1250_TO_LATIN2 4343
+#define F_LATIN1_TO_MIC 4344
+#define F_MIC_TO_LATIN1 4345
+#define F_LATIN3_TO_MIC 4346
+#define F_MIC_TO_LATIN3 4347
+#define F_LATIN4_TO_MIC 4348
+#define F_MIC_TO_LATIN4 4349
+#define F_NORMALIZE 4350
+#define F_IS_NORMALIZED 4351
+#define F_BIG5_TO_UTF8 4352
+#define F_UTF8_TO_BIG5 4353
+#define F_UTF8_TO_KOI8R 4354
+#define F_KOI8R_TO_UTF8 4355
+#define F_UTF8_TO_KOI8U 4356
+#define F_KOI8U_TO_UTF8 4357
+#define F_UTF8_TO_WIN 4358
+#define F_WIN_TO_UTF8 4359
+#define F_EUC_CN_TO_UTF8 4360
+#define F_UTF8_TO_EUC_CN 4361
+#define F_EUC_JP_TO_UTF8 4362
+#define F_UTF8_TO_EUC_JP 4363
+#define F_EUC_KR_TO_UTF8 4364
+#define F_UTF8_TO_EUC_KR 4365
+#define F_EUC_TW_TO_UTF8 4366
+#define F_UTF8_TO_EUC_TW 4367
+#define F_GB18030_TO_UTF8 4368
+#define F_UTF8_TO_GB18030 4369
+#define F_GBK_TO_UTF8 4370
+#define F_UTF8_TO_GBK 4371
+#define F_UTF8_TO_ISO8859 4372
+#define F_ISO8859_TO_UTF8 4373
+#define F_ISO8859_1_TO_UTF8 4374
+#define F_UTF8_TO_ISO8859_1 4375
+#define F_JOHAB_TO_UTF8 4376
+#define F_UTF8_TO_JOHAB 4377
+#define F_SJIS_TO_UTF8 4378
+#define F_UTF8_TO_SJIS 4379
+#define F_UHC_TO_UTF8 4380
+#define F_UTF8_TO_UHC 4381
+#define F_EUC_JIS_2004_TO_UTF8 4382
+#define F_UTF8_TO_EUC_JIS_2004 4383
+#define F_SHIFT_JIS_2004_TO_UTF8 4384
+#define F_UTF8_TO_SHIFT_JIS_2004 4385
+#define F_EUC_JIS_2004_TO_SHIFT_JIS_2004 4386
+#define F_SHIFT_JIS_2004_TO_EUC_JIS_2004 4387
+#define F_MULTIRANGE_INTERSECT_AGG_TRANSFN 4388
+#define F_RANGE_INTERSECT_AGG_ANYMULTIRANGE 4389
+#define F_BINARY_UPGRADE_SET_NEXT_MULTIRANGE_PG_TYPE_OID 4390
+#define F_BINARY_UPGRADE_SET_NEXT_MULTIRANGE_ARRAY_PG_TYPE_OID 4391
+#define F_RANGE_INTERSECT_AGG_TRANSFN 4401
+#define F_RANGE_INTERSECT_AGG_ANYRANGE 4450
+#define F_RANGE_CONTAINS_MULTIRANGE 4541
+#define F_MULTIRANGE_CONTAINED_BY_RANGE 4542
+#define F_PG_LOG_BACKEND_MEMORY_CONTEXTS 4543
+#define F_BINARY_UPGRADE_SET_NEXT_HEAP_RELFILENODE 4545
+#define F_BINARY_UPGRADE_SET_NEXT_INDEX_RELFILENODE 4546
+#define F_BINARY_UPGRADE_SET_NEXT_TOAST_RELFILENODE 4547
+#define F_BINARY_UPGRADE_SET_NEXT_PG_TABLESPACE_OID 4548
+#define F_PG_EVENT_TRIGGER_TABLE_REWRITE_OID 4566
+#define F_PG_EVENT_TRIGGER_TABLE_REWRITE_REASON 4567
+#define F_PG_EVENT_TRIGGER_DDL_COMMANDS 4568
+#define F_BRIN_BLOOM_OPCINFO 4591
+#define F_BRIN_BLOOM_ADD_VALUE 4592
+#define F_BRIN_BLOOM_CONSISTENT 4593
+#define F_BRIN_BLOOM_UNION 4594
+#define F_BRIN_BLOOM_OPTIONS 4595
+#define F_BRIN_BLOOM_SUMMARY_IN 4596
+#define F_BRIN_BLOOM_SUMMARY_OUT 4597
+#define F_BRIN_BLOOM_SUMMARY_RECV 4598
+#define F_BRIN_BLOOM_SUMMARY_SEND 4599
+#define F_BRIN_MINMAX_MULTI_OPCINFO 4616
+#define F_BRIN_MINMAX_MULTI_ADD_VALUE 4617
+#define F_BRIN_MINMAX_MULTI_CONSISTENT 4618
+#define F_BRIN_MINMAX_MULTI_UNION 4619
+#define F_BRIN_MINMAX_MULTI_OPTIONS 4620
+#define F_BRIN_MINMAX_MULTI_DISTANCE_INT2 4621
+#define F_BRIN_MINMAX_MULTI_DISTANCE_INT4 4622
+#define F_BRIN_MINMAX_MULTI_DISTANCE_INT8 4623
+#define F_BRIN_MINMAX_MULTI_DISTANCE_FLOAT4 4624
+#define F_BRIN_MINMAX_MULTI_DISTANCE_FLOAT8 4625
+#define F_BRIN_MINMAX_MULTI_DISTANCE_NUMERIC 4626
+#define F_BRIN_MINMAX_MULTI_DISTANCE_TID 4627
+#define F_BRIN_MINMAX_MULTI_DISTANCE_UUID 4628
+#define F_BRIN_MINMAX_MULTI_DISTANCE_DATE 4629
+#define F_BRIN_MINMAX_MULTI_DISTANCE_TIME 4630
+#define F_BRIN_MINMAX_MULTI_DISTANCE_INTERVAL 4631
+#define F_BRIN_MINMAX_MULTI_DISTANCE_TIMETZ 4632
+#define F_BRIN_MINMAX_MULTI_DISTANCE_PG_LSN 4633
+#define F_BRIN_MINMAX_MULTI_DISTANCE_MACADDR 4634
+#define F_BRIN_MINMAX_MULTI_DISTANCE_MACADDR8 4635
+#define F_BRIN_MINMAX_MULTI_DISTANCE_INET 4636
+#define F_BRIN_MINMAX_MULTI_DISTANCE_TIMESTAMP 4637
+#define F_BRIN_MINMAX_MULTI_SUMMARY_IN 4638
+#define F_BRIN_MINMAX_MULTI_SUMMARY_OUT 4639
+#define F_BRIN_MINMAX_MULTI_SUMMARY_RECV 4640
+#define F_BRIN_MINMAX_MULTI_SUMMARY_SEND 4641
+#define F_PHRASETO_TSQUERY_TEXT 5001
+#define F_TSQUERY_PHRASE_TSQUERY_TSQUERY 5003
+#define F_TSQUERY_PHRASE_TSQUERY_TSQUERY_INT4 5004
+#define F_PHRASETO_TSQUERY_REGCONFIG_TEXT 5006
+#define F_WEBSEARCH_TO_TSQUERY_REGCONFIG_TEXT 5007
+#define F_WEBSEARCH_TO_TSQUERY_TEXT 5009
+#define F_SPG_BBOX_QUAD_CONFIG 5010
+#define F_SPG_POLY_QUAD_COMPRESS 5011
+#define F_SPG_BOX_QUAD_CONFIG 5012
+#define F_SPG_BOX_QUAD_CHOOSE 5013
+#define F_SPG_BOX_QUAD_PICKSPLIT 5014
+#define F_SPG_BOX_QUAD_INNER_CONSISTENT 5015
+#define F_SPG_BOX_QUAD_LEAF_CONSISTENT 5016
+#define F_PG_MCV_LIST_IN 5018
+#define F_PG_MCV_LIST_OUT 5019
+#define F_PG_MCV_LIST_RECV 5020
+#define F_PG_MCV_LIST_SEND 5021
+#define F_PG_LSN_PLI 5022
+#define F_NUMERIC_PL_PG_LSN 5023
+#define F_PG_LSN_MII 5024
+#define F_SATISFIES_HASH_PARTITION 5028
+#define F_PG_LS_TMPDIR_ 5029
+#define F_PG_LS_TMPDIR_OID 5030
+#define F_PG_LS_ARCHIVE_STATUSDIR 5031
+#define F_NETWORK_SORTSUPPORT 5033
+#define F_XID8LT 5034
+#define F_XID8GT 5035
+#define F_XID8LE 5036
+#define F_XID8GE 5037
+#define F_MATCHINGSEL 5040
+#define F_MATCHINGJOINSEL 5041
+#define F_MIN_SCALE 5042
+#define F_TRIM_SCALE 5043
+#define F_GCD_INT4_INT4 5044
+#define F_GCD_INT8_INT8 5045
+#define F_LCM_INT4_INT4 5046
+#define F_LCM_INT8_INT8 5047
+#define F_GCD_NUMERIC_NUMERIC 5048
+#define F_LCM_NUMERIC_NUMERIC 5049
+#define F_BTVARSTREQUALIMAGE 5050
+#define F_BTEQUALIMAGE 5051
+#define F_PG_GET_SHMEM_ALLOCATIONS 5052
+#define F_PG_STAT_GET_INS_SINCE_VACUUM 5053
+#define F_JSONB_SET_LAX 5054
+#define F_PG_SNAPSHOT_IN 5055
+#define F_PG_SNAPSHOT_OUT 5056
+#define F_PG_SNAPSHOT_RECV 5057
+#define F_PG_SNAPSHOT_SEND 5058
+#define F_PG_CURRENT_XACT_ID 5059
+#define F_PG_CURRENT_XACT_ID_IF_ASSIGNED 5060
+#define F_PG_CURRENT_SNAPSHOT 5061
+#define F_PG_SNAPSHOT_XMIN 5062
+#define F_PG_SNAPSHOT_XMAX 5063
+#define F_PG_SNAPSHOT_XIP 5064
+#define F_PG_VISIBLE_IN_SNAPSHOT 5065
+#define F_PG_XACT_STATUS 5066
+#define F_XID8IN 5070
+#define F_XID 5071
+#define F_XID8OUT 5081
+#define F_XID8RECV 5082
+#define F_XID8SEND 5083
+#define F_XID8EQ 5084
+#define F_XID8NE 5085
+#define F_ANYCOMPATIBLE_IN 5086
+#define F_ANYCOMPATIBLE_OUT 5087
+#define F_ANYCOMPATIBLEARRAY_IN 5088
+#define F_ANYCOMPATIBLEARRAY_OUT 5089
+#define F_ANYCOMPATIBLEARRAY_RECV 5090
+#define F_ANYCOMPATIBLEARRAY_SEND 5091
+#define F_ANYCOMPATIBLENONARRAY_IN 5092
+#define F_ANYCOMPATIBLENONARRAY_OUT 5093
+#define F_ANYCOMPATIBLERANGE_IN 5094
+#define F_ANYCOMPATIBLERANGE_OUT 5095
+#define F_XID8CMP 5096
+#define F_XID8_LARGER 5097
+#define F_XID8_SMALLER 5098
+#define F_MAX_XID8 5099
+#define F_MIN_XID8 5100
+#define F_PG_REPLICATION_ORIGIN_CREATE 6003
+#define F_PG_REPLICATION_ORIGIN_DROP 6004
+#define F_PG_REPLICATION_ORIGIN_OID 6005
+#define F_PG_REPLICATION_ORIGIN_SESSION_SETUP 6006
+#define F_PG_REPLICATION_ORIGIN_SESSION_RESET 6007
+#define F_PG_REPLICATION_ORIGIN_SESSION_IS_SETUP 6008
+#define F_PG_REPLICATION_ORIGIN_SESSION_PROGRESS 6009
+#define F_PG_REPLICATION_ORIGIN_XACT_SETUP 6010
+#define F_PG_REPLICATION_ORIGIN_XACT_RESET 6011
+#define F_PG_REPLICATION_ORIGIN_ADVANCE 6012
+#define F_PG_REPLICATION_ORIGIN_PROGRESS 6013
+#define F_PG_SHOW_REPLICATION_ORIGIN_STATUS 6014
+#define F_JSONB_SUBSCRIPT_HANDLER 6098
+#define F_PG_LSN 6103
+#define F_PG_STAT_GET_SUBSCRIPTION 6118
+#define F_PG_GET_PUBLICATION_TABLES 6119
+#define F_PG_GET_REPLICA_IDENTITY_INDEX 6120
+#define F_PG_RELATION_IS_PUBLISHABLE 6121
+#define F_MULTIRANGE_GIST_CONSISTENT 6154
+#define F_MULTIRANGE_GIST_COMPRESS 6156
+#define F_PG_GET_CATALOG_FOREIGN_KEYS 6159
+#define F_STRING_TO_TABLE_TEXT_TEXT 6160
+#define F_STRING_TO_TABLE_TEXT_TEXT_TEXT 6161
+#define F_BIT_COUNT_BIT 6162
+#define F_BIT_COUNT_BYTEA 6163
+#define F_BIT_XOR_INT2 6164
+#define F_BIT_XOR_INT4 6165
+#define F_BIT_XOR_INT8 6166
+#define F_BIT_XOR_BIT 6167
+#define F_PG_XACT_COMMIT_TIMESTAMP_ORIGIN 6168
+#define F_PG_STAT_GET_REPLICATION_SLOT 6169
+#define F_PG_STAT_RESET_REPLICATION_SLOT 6170
+#define F_TRIM_ARRAY 6172
+#define F_PG_GET_STATISTICSOBJDEF_EXPRESSIONS 6173
+#define F_PG_GET_STATISTICSOBJDEF_COLUMNS 6174
+#define F_DATE_BIN_INTERVAL_TIMESTAMP_TIMESTAMP 6177
+#define F_DATE_BIN_INTERVAL_TIMESTAMPTZ_TIMESTAMPTZ 6178
+#define F_ARRAY_SUBSCRIPT_HANDLER 6179
+#define F_RAW_ARRAY_SUBSCRIPT_HANDLER 6180
+#define F_TS_DEBUG_REGCONFIG_TEXT 6183
+#define F_TS_DEBUG_TEXT 6184
+#define F_PG_STAT_GET_DB_SESSION_TIME 6185
+#define F_PG_STAT_GET_DB_ACTIVE_TIME 6186
+#define F_PG_STAT_GET_DB_IDLE_IN_TRANSACTION_TIME 6187
+#define F_PG_STAT_GET_DB_SESSIONS 6188
+#define F_PG_STAT_GET_DB_SESSIONS_ABANDONED 6189
+#define F_PG_STAT_GET_DB_SESSIONS_FATAL 6190
+#define F_PG_STAT_GET_DB_SESSIONS_KILLED 6191
+#define F_HASH_RECORD 6192
+#define F_HASH_RECORD_EXTENDED 6193
+#define F_LTRIM_BYTEA_BYTEA 6195
+#define F_RTRIM_BYTEA_BYTEA 6196
+#define F_PG_GET_FUNCTION_SQLBODY 6197
+#define F_UNISTR 6198
+#define F_EXTRACT_TEXT_DATE 6199
+#define F_EXTRACT_TEXT_TIME 6200
+#define F_EXTRACT_TEXT_TIMETZ 6201
+#define F_EXTRACT_TEXT_TIMESTAMP 6202
+#define F_EXTRACT_TEXT_TIMESTAMPTZ 6203
+#define F_EXTRACT_TEXT_INTERVAL 6204
+#define F_HAS_PARAMETER_PRIVILEGE_NAME_TEXT_TEXT 6205
+#define F_HAS_PARAMETER_PRIVILEGE_OID_TEXT_TEXT 6206
+#define F_HAS_PARAMETER_PRIVILEGE_TEXT_TEXT 6207
+#define F_PG_GET_WAL_RESOURCE_MANAGERS 6224
+#define F_MULTIRANGE_AGG_TRANSFN 6225
+#define F_MULTIRANGE_AGG_FINALFN 6226
+#define F_RANGE_AGG_ANYMULTIRANGE 6227
+#define F_PG_STAT_HAVE_STATS 6230
+#define F_PG_STAT_GET_SUBSCRIPTION_STATS 6231
+#define F_PG_STAT_RESET_SUBSCRIPTION_STATS 6232
+#define F_WINDOW_ROW_NUMBER_SUPPORT 6233
+#define F_WINDOW_RANK_SUPPORT 6234
+#define F_WINDOW_DENSE_RANK_SUPPORT 6235
+#define F_INT8INC_SUPPORT 6236
+#define F_PG_SETTINGS_GET_FLAGS 6240
+#define F_PG_STOP_MAKING_PINNED_OBJECTS 6241
+#define F_TEXT_STARTS_WITH_SUPPORT 6242
+#define F_PG_STAT_GET_RECOVERY_PREFETCH 6248
+#define F_PG_DATABASE_COLLATION_ACTUAL_VERSION 6249
+#define F_PG_IDENT_FILE_MAPPINGS 6250
+#define F_REGEXP_REPLACE_TEXT_TEXT_TEXT_INT4_INT4_TEXT 6251
+#define F_REGEXP_REPLACE_TEXT_TEXT_TEXT_INT4_INT4 6252
+#define F_REGEXP_REPLACE_TEXT_TEXT_TEXT_INT4 6253
+#define F_REGEXP_COUNT_TEXT_TEXT 6254
+#define F_REGEXP_COUNT_TEXT_TEXT_INT4 6255
+#define F_REGEXP_COUNT_TEXT_TEXT_INT4_TEXT 6256
+#define F_REGEXP_INSTR_TEXT_TEXT 6257
+#define F_REGEXP_INSTR_TEXT_TEXT_INT4 6258
+#define F_REGEXP_INSTR_TEXT_TEXT_INT4_INT4 6259
+#define F_REGEXP_INSTR_TEXT_TEXT_INT4_INT4_INT4 6260
+#define F_REGEXP_INSTR_TEXT_TEXT_INT4_INT4_INT4_TEXT 6261
+#define F_REGEXP_INSTR_TEXT_TEXT_INT4_INT4_INT4_TEXT_INT4 6262
+#define F_REGEXP_LIKE_TEXT_TEXT 6263
+#define F_REGEXP_LIKE_TEXT_TEXT_TEXT 6264
+#define F_REGEXP_SUBSTR_TEXT_TEXT 6265
+#define F_REGEXP_SUBSTR_TEXT_TEXT_INT4 6266
+#define F_REGEXP_SUBSTR_TEXT_TEXT_INT4_INT4 6267
+#define F_REGEXP_SUBSTR_TEXT_TEXT_INT4_INT4_TEXT 6268
+#define F_REGEXP_SUBSTR_TEXT_TEXT_INT4_INT4_TEXT_INT4 6269
+#define F_PG_LS_LOGICALSNAPDIR 6270
+#define F_PG_LS_LOGICALMAPDIR 6271
+#define F_PG_LS_REPLSLOTDIR 6272
+
+#endif /* FMGROIDS_H */
diff --git a/src/backend/utils/fmgrprotos.h b/src/backend/utils/fmgrprotos.h
new file mode 100644
index 0000000..151e8dd
--- /dev/null
+++ b/src/backend/utils/fmgrprotos.h
@@ -0,0 +1,2829 @@
+/*-------------------------------------------------------------------------
+ *
+ * fmgrprotos.h
+ * Prototypes for built-in functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef FMGRPROTOS_H
+#define FMGRPROTOS_H
+
+#include "fmgr.h"
+
+extern Datum heap_tableam_handler(PG_FUNCTION_ARGS);
+extern Datum byteaout(PG_FUNCTION_ARGS);
+extern Datum charout(PG_FUNCTION_ARGS);
+extern Datum namein(PG_FUNCTION_ARGS);
+extern Datum nameout(PG_FUNCTION_ARGS);
+extern Datum int2in(PG_FUNCTION_ARGS);
+extern Datum int2out(PG_FUNCTION_ARGS);
+extern Datum int2vectorin(PG_FUNCTION_ARGS);
+extern Datum int2vectorout(PG_FUNCTION_ARGS);
+extern Datum int4in(PG_FUNCTION_ARGS);
+extern Datum int4out(PG_FUNCTION_ARGS);
+extern Datum regprocin(PG_FUNCTION_ARGS);
+extern Datum regprocout(PG_FUNCTION_ARGS);
+extern Datum textin(PG_FUNCTION_ARGS);
+extern Datum textout(PG_FUNCTION_ARGS);
+extern Datum tidin(PG_FUNCTION_ARGS);
+extern Datum tidout(PG_FUNCTION_ARGS);
+extern Datum xidin(PG_FUNCTION_ARGS);
+extern Datum xidout(PG_FUNCTION_ARGS);
+extern Datum cidin(PG_FUNCTION_ARGS);
+extern Datum cidout(PG_FUNCTION_ARGS);
+extern Datum oidvectorin(PG_FUNCTION_ARGS);
+extern Datum oidvectorout(PG_FUNCTION_ARGS);
+extern Datum boollt(PG_FUNCTION_ARGS);
+extern Datum boolgt(PG_FUNCTION_ARGS);
+extern Datum booleq(PG_FUNCTION_ARGS);
+extern Datum chareq(PG_FUNCTION_ARGS);
+extern Datum nameeq(PG_FUNCTION_ARGS);
+extern Datum int2eq(PG_FUNCTION_ARGS);
+extern Datum int2lt(PG_FUNCTION_ARGS);
+extern Datum int4eq(PG_FUNCTION_ARGS);
+extern Datum int4lt(PG_FUNCTION_ARGS);
+extern Datum texteq(PG_FUNCTION_ARGS);
+extern Datum xideq(PG_FUNCTION_ARGS);
+extern Datum cideq(PG_FUNCTION_ARGS);
+extern Datum charne(PG_FUNCTION_ARGS);
+extern Datum charle(PG_FUNCTION_ARGS);
+extern Datum chargt(PG_FUNCTION_ARGS);
+extern Datum charge(PG_FUNCTION_ARGS);
+extern Datum chartoi4(PG_FUNCTION_ARGS);
+extern Datum i4tochar(PG_FUNCTION_ARGS);
+extern Datum nameregexeq(PG_FUNCTION_ARGS);
+extern Datum boolne(PG_FUNCTION_ARGS);
+extern Datum pg_ddl_command_in(PG_FUNCTION_ARGS);
+extern Datum pg_ddl_command_out(PG_FUNCTION_ARGS);
+extern Datum pg_ddl_command_recv(PG_FUNCTION_ARGS);
+extern Datum pgsql_version(PG_FUNCTION_ARGS);
+extern Datum pg_ddl_command_send(PG_FUNCTION_ARGS);
+extern Datum eqsel(PG_FUNCTION_ARGS);
+extern Datum neqsel(PG_FUNCTION_ARGS);
+extern Datum scalarltsel(PG_FUNCTION_ARGS);
+extern Datum scalargtsel(PG_FUNCTION_ARGS);
+extern Datum eqjoinsel(PG_FUNCTION_ARGS);
+extern Datum neqjoinsel(PG_FUNCTION_ARGS);
+extern Datum scalarltjoinsel(PG_FUNCTION_ARGS);
+extern Datum scalargtjoinsel(PG_FUNCTION_ARGS);
+extern Datum unknownin(PG_FUNCTION_ARGS);
+extern Datum unknownout(PG_FUNCTION_ARGS);
+extern Datum box_above_eq(PG_FUNCTION_ARGS);
+extern Datum box_below_eq(PG_FUNCTION_ARGS);
+extern Datum point_in(PG_FUNCTION_ARGS);
+extern Datum point_out(PG_FUNCTION_ARGS);
+extern Datum lseg_in(PG_FUNCTION_ARGS);
+extern Datum lseg_out(PG_FUNCTION_ARGS);
+extern Datum path_in(PG_FUNCTION_ARGS);
+extern Datum path_out(PG_FUNCTION_ARGS);
+extern Datum box_in(PG_FUNCTION_ARGS);
+extern Datum box_out(PG_FUNCTION_ARGS);
+extern Datum box_overlap(PG_FUNCTION_ARGS);
+extern Datum box_ge(PG_FUNCTION_ARGS);
+extern Datum box_gt(PG_FUNCTION_ARGS);
+extern Datum box_eq(PG_FUNCTION_ARGS);
+extern Datum box_lt(PG_FUNCTION_ARGS);
+extern Datum box_le(PG_FUNCTION_ARGS);
+extern Datum point_above(PG_FUNCTION_ARGS);
+extern Datum point_left(PG_FUNCTION_ARGS);
+extern Datum point_right(PG_FUNCTION_ARGS);
+extern Datum point_below(PG_FUNCTION_ARGS);
+extern Datum point_eq(PG_FUNCTION_ARGS);
+extern Datum on_pb(PG_FUNCTION_ARGS);
+extern Datum on_ppath(PG_FUNCTION_ARGS);
+extern Datum box_center(PG_FUNCTION_ARGS);
+extern Datum areasel(PG_FUNCTION_ARGS);
+extern Datum areajoinsel(PG_FUNCTION_ARGS);
+extern Datum int4mul(PG_FUNCTION_ARGS);
+extern Datum int4ne(PG_FUNCTION_ARGS);
+extern Datum int2ne(PG_FUNCTION_ARGS);
+extern Datum int2gt(PG_FUNCTION_ARGS);
+extern Datum int4gt(PG_FUNCTION_ARGS);
+extern Datum int2le(PG_FUNCTION_ARGS);
+extern Datum int4le(PG_FUNCTION_ARGS);
+extern Datum int4ge(PG_FUNCTION_ARGS);
+extern Datum int2ge(PG_FUNCTION_ARGS);
+extern Datum int2mul(PG_FUNCTION_ARGS);
+extern Datum int2div(PG_FUNCTION_ARGS);
+extern Datum int4div(PG_FUNCTION_ARGS);
+extern Datum int2mod(PG_FUNCTION_ARGS);
+extern Datum int4mod(PG_FUNCTION_ARGS);
+extern Datum textne(PG_FUNCTION_ARGS);
+extern Datum int24eq(PG_FUNCTION_ARGS);
+extern Datum int42eq(PG_FUNCTION_ARGS);
+extern Datum int24lt(PG_FUNCTION_ARGS);
+extern Datum int42lt(PG_FUNCTION_ARGS);
+extern Datum int24gt(PG_FUNCTION_ARGS);
+extern Datum int42gt(PG_FUNCTION_ARGS);
+extern Datum int24ne(PG_FUNCTION_ARGS);
+extern Datum int42ne(PG_FUNCTION_ARGS);
+extern Datum int24le(PG_FUNCTION_ARGS);
+extern Datum int42le(PG_FUNCTION_ARGS);
+extern Datum int24ge(PG_FUNCTION_ARGS);
+extern Datum int42ge(PG_FUNCTION_ARGS);
+extern Datum int24mul(PG_FUNCTION_ARGS);
+extern Datum int42mul(PG_FUNCTION_ARGS);
+extern Datum int24div(PG_FUNCTION_ARGS);
+extern Datum int42div(PG_FUNCTION_ARGS);
+extern Datum int2pl(PG_FUNCTION_ARGS);
+extern Datum int4pl(PG_FUNCTION_ARGS);
+extern Datum int24pl(PG_FUNCTION_ARGS);
+extern Datum int42pl(PG_FUNCTION_ARGS);
+extern Datum int2mi(PG_FUNCTION_ARGS);
+extern Datum int4mi(PG_FUNCTION_ARGS);
+extern Datum int24mi(PG_FUNCTION_ARGS);
+extern Datum int42mi(PG_FUNCTION_ARGS);
+extern Datum oideq(PG_FUNCTION_ARGS);
+extern Datum oidne(PG_FUNCTION_ARGS);
+extern Datum box_same(PG_FUNCTION_ARGS);
+extern Datum box_contain(PG_FUNCTION_ARGS);
+extern Datum box_left(PG_FUNCTION_ARGS);
+extern Datum box_overleft(PG_FUNCTION_ARGS);
+extern Datum box_overright(PG_FUNCTION_ARGS);
+extern Datum box_right(PG_FUNCTION_ARGS);
+extern Datum box_contained(PG_FUNCTION_ARGS);
+extern Datum box_contain_pt(PG_FUNCTION_ARGS);
+extern Datum pg_node_tree_in(PG_FUNCTION_ARGS);
+extern Datum pg_node_tree_out(PG_FUNCTION_ARGS);
+extern Datum pg_node_tree_recv(PG_FUNCTION_ARGS);
+extern Datum pg_node_tree_send(PG_FUNCTION_ARGS);
+extern Datum float4in(PG_FUNCTION_ARGS);
+extern Datum float4out(PG_FUNCTION_ARGS);
+extern Datum float4mul(PG_FUNCTION_ARGS);
+extern Datum float4div(PG_FUNCTION_ARGS);
+extern Datum float4pl(PG_FUNCTION_ARGS);
+extern Datum float4mi(PG_FUNCTION_ARGS);
+extern Datum float4um(PG_FUNCTION_ARGS);
+extern Datum float4abs(PG_FUNCTION_ARGS);
+extern Datum float4_accum(PG_FUNCTION_ARGS);
+extern Datum float4larger(PG_FUNCTION_ARGS);
+extern Datum float4smaller(PG_FUNCTION_ARGS);
+extern Datum int4um(PG_FUNCTION_ARGS);
+extern Datum int2um(PG_FUNCTION_ARGS);
+extern Datum float8in(PG_FUNCTION_ARGS);
+extern Datum float8out(PG_FUNCTION_ARGS);
+extern Datum float8mul(PG_FUNCTION_ARGS);
+extern Datum float8div(PG_FUNCTION_ARGS);
+extern Datum float8pl(PG_FUNCTION_ARGS);
+extern Datum float8mi(PG_FUNCTION_ARGS);
+extern Datum float8um(PG_FUNCTION_ARGS);
+extern Datum float8abs(PG_FUNCTION_ARGS);
+extern Datum float8_accum(PG_FUNCTION_ARGS);
+extern Datum float8larger(PG_FUNCTION_ARGS);
+extern Datum float8smaller(PG_FUNCTION_ARGS);
+extern Datum lseg_center(PG_FUNCTION_ARGS);
+extern Datum poly_center(PG_FUNCTION_ARGS);
+extern Datum dround(PG_FUNCTION_ARGS);
+extern Datum dtrunc(PG_FUNCTION_ARGS);
+extern Datum dsqrt(PG_FUNCTION_ARGS);
+extern Datum dcbrt(PG_FUNCTION_ARGS);
+extern Datum dpow(PG_FUNCTION_ARGS);
+extern Datum dexp(PG_FUNCTION_ARGS);
+extern Datum dlog1(PG_FUNCTION_ARGS);
+extern Datum i2tod(PG_FUNCTION_ARGS);
+extern Datum i2tof(PG_FUNCTION_ARGS);
+extern Datum dtoi2(PG_FUNCTION_ARGS);
+extern Datum ftoi2(PG_FUNCTION_ARGS);
+extern Datum line_distance(PG_FUNCTION_ARGS);
+extern Datum nameeqtext(PG_FUNCTION_ARGS);
+extern Datum namelttext(PG_FUNCTION_ARGS);
+extern Datum nameletext(PG_FUNCTION_ARGS);
+extern Datum namegetext(PG_FUNCTION_ARGS);
+extern Datum namegttext(PG_FUNCTION_ARGS);
+extern Datum namenetext(PG_FUNCTION_ARGS);
+extern Datum btnametextcmp(PG_FUNCTION_ARGS);
+extern Datum texteqname(PG_FUNCTION_ARGS);
+extern Datum textltname(PG_FUNCTION_ARGS);
+extern Datum textlename(PG_FUNCTION_ARGS);
+extern Datum textgename(PG_FUNCTION_ARGS);
+extern Datum textgtname(PG_FUNCTION_ARGS);
+extern Datum textnename(PG_FUNCTION_ARGS);
+extern Datum bttextnamecmp(PG_FUNCTION_ARGS);
+extern Datum nameconcatoid(PG_FUNCTION_ARGS);
+extern Datum table_am_handler_in(PG_FUNCTION_ARGS);
+extern Datum table_am_handler_out(PG_FUNCTION_ARGS);
+extern Datum timeofday(PG_FUNCTION_ARGS);
+extern Datum pg_nextoid(PG_FUNCTION_ARGS);
+extern Datum float8_combine(PG_FUNCTION_ARGS);
+extern Datum inter_sl(PG_FUNCTION_ARGS);
+extern Datum inter_lb(PG_FUNCTION_ARGS);
+extern Datum float48mul(PG_FUNCTION_ARGS);
+extern Datum float48div(PG_FUNCTION_ARGS);
+extern Datum float48pl(PG_FUNCTION_ARGS);
+extern Datum float48mi(PG_FUNCTION_ARGS);
+extern Datum float84mul(PG_FUNCTION_ARGS);
+extern Datum float84div(PG_FUNCTION_ARGS);
+extern Datum float84pl(PG_FUNCTION_ARGS);
+extern Datum float84mi(PG_FUNCTION_ARGS);
+extern Datum float4eq(PG_FUNCTION_ARGS);
+extern Datum float4ne(PG_FUNCTION_ARGS);
+extern Datum float4lt(PG_FUNCTION_ARGS);
+extern Datum float4le(PG_FUNCTION_ARGS);
+extern Datum float4gt(PG_FUNCTION_ARGS);
+extern Datum float4ge(PG_FUNCTION_ARGS);
+extern Datum float8eq(PG_FUNCTION_ARGS);
+extern Datum float8ne(PG_FUNCTION_ARGS);
+extern Datum float8lt(PG_FUNCTION_ARGS);
+extern Datum float8le(PG_FUNCTION_ARGS);
+extern Datum float8gt(PG_FUNCTION_ARGS);
+extern Datum float8ge(PG_FUNCTION_ARGS);
+extern Datum float48eq(PG_FUNCTION_ARGS);
+extern Datum float48ne(PG_FUNCTION_ARGS);
+extern Datum float48lt(PG_FUNCTION_ARGS);
+extern Datum float48le(PG_FUNCTION_ARGS);
+extern Datum float48gt(PG_FUNCTION_ARGS);
+extern Datum float48ge(PG_FUNCTION_ARGS);
+extern Datum float84eq(PG_FUNCTION_ARGS);
+extern Datum float84ne(PG_FUNCTION_ARGS);
+extern Datum float84lt(PG_FUNCTION_ARGS);
+extern Datum float84le(PG_FUNCTION_ARGS);
+extern Datum float84gt(PG_FUNCTION_ARGS);
+extern Datum float84ge(PG_FUNCTION_ARGS);
+extern Datum ftod(PG_FUNCTION_ARGS);
+extern Datum dtof(PG_FUNCTION_ARGS);
+extern Datum i2toi4(PG_FUNCTION_ARGS);
+extern Datum i4toi2(PG_FUNCTION_ARGS);
+extern Datum pg_jit_available(PG_FUNCTION_ARGS);
+extern Datum i4tod(PG_FUNCTION_ARGS);
+extern Datum dtoi4(PG_FUNCTION_ARGS);
+extern Datum i4tof(PG_FUNCTION_ARGS);
+extern Datum ftoi4(PG_FUNCTION_ARGS);
+extern Datum width_bucket_float8(PG_FUNCTION_ARGS);
+extern Datum json_in(PG_FUNCTION_ARGS);
+extern Datum json_out(PG_FUNCTION_ARGS);
+extern Datum json_recv(PG_FUNCTION_ARGS);
+extern Datum json_send(PG_FUNCTION_ARGS);
+extern Datum index_am_handler_in(PG_FUNCTION_ARGS);
+extern Datum index_am_handler_out(PG_FUNCTION_ARGS);
+extern Datum hashmacaddr8(PG_FUNCTION_ARGS);
+extern Datum hash_aclitem(PG_FUNCTION_ARGS);
+extern Datum bthandler(PG_FUNCTION_ARGS);
+extern Datum hashhandler(PG_FUNCTION_ARGS);
+extern Datum gisthandler(PG_FUNCTION_ARGS);
+extern Datum ginhandler(PG_FUNCTION_ARGS);
+extern Datum spghandler(PG_FUNCTION_ARGS);
+extern Datum brinhandler(PG_FUNCTION_ARGS);
+extern Datum scalarlesel(PG_FUNCTION_ARGS);
+extern Datum scalargesel(PG_FUNCTION_ARGS);
+extern Datum amvalidate(PG_FUNCTION_ARGS);
+extern Datum poly_same(PG_FUNCTION_ARGS);
+extern Datum poly_contain(PG_FUNCTION_ARGS);
+extern Datum poly_left(PG_FUNCTION_ARGS);
+extern Datum poly_overleft(PG_FUNCTION_ARGS);
+extern Datum poly_overright(PG_FUNCTION_ARGS);
+extern Datum poly_right(PG_FUNCTION_ARGS);
+extern Datum poly_contained(PG_FUNCTION_ARGS);
+extern Datum poly_overlap(PG_FUNCTION_ARGS);
+extern Datum poly_in(PG_FUNCTION_ARGS);
+extern Datum poly_out(PG_FUNCTION_ARGS);
+extern Datum btint2cmp(PG_FUNCTION_ARGS);
+extern Datum btint4cmp(PG_FUNCTION_ARGS);
+extern Datum btfloat4cmp(PG_FUNCTION_ARGS);
+extern Datum btfloat8cmp(PG_FUNCTION_ARGS);
+extern Datum btoidcmp(PG_FUNCTION_ARGS);
+extern Datum dist_bp(PG_FUNCTION_ARGS);
+extern Datum btcharcmp(PG_FUNCTION_ARGS);
+extern Datum btnamecmp(PG_FUNCTION_ARGS);
+extern Datum bttextcmp(PG_FUNCTION_ARGS);
+extern Datum lseg_distance(PG_FUNCTION_ARGS);
+extern Datum lseg_interpt(PG_FUNCTION_ARGS);
+extern Datum dist_ps(PG_FUNCTION_ARGS);
+extern Datum dist_pb(PG_FUNCTION_ARGS);
+extern Datum dist_sb(PG_FUNCTION_ARGS);
+extern Datum close_ps(PG_FUNCTION_ARGS);
+extern Datum close_pb(PG_FUNCTION_ARGS);
+extern Datum close_sb(PG_FUNCTION_ARGS);
+extern Datum on_ps(PG_FUNCTION_ARGS);
+extern Datum path_distance(PG_FUNCTION_ARGS);
+extern Datum dist_ppath(PG_FUNCTION_ARGS);
+extern Datum on_sb(PG_FUNCTION_ARGS);
+extern Datum inter_sb(PG_FUNCTION_ARGS);
+extern Datum text_to_array_null(PG_FUNCTION_ARGS);
+extern Datum cash_cmp(PG_FUNCTION_ARGS);
+extern Datum array_append(PG_FUNCTION_ARGS);
+extern Datum array_prepend(PG_FUNCTION_ARGS);
+extern Datum dist_sp(PG_FUNCTION_ARGS);
+extern Datum dist_bs(PG_FUNCTION_ARGS);
+extern Datum btarraycmp(PG_FUNCTION_ARGS);
+extern Datum array_cat(PG_FUNCTION_ARGS);
+extern Datum array_to_text_null(PG_FUNCTION_ARGS);
+extern Datum scalarlejoinsel(PG_FUNCTION_ARGS);
+extern Datum array_ne(PG_FUNCTION_ARGS);
+extern Datum array_lt(PG_FUNCTION_ARGS);
+extern Datum array_gt(PG_FUNCTION_ARGS);
+extern Datum array_le(PG_FUNCTION_ARGS);
+extern Datum text_to_array(PG_FUNCTION_ARGS);
+extern Datum array_to_text(PG_FUNCTION_ARGS);
+extern Datum array_ge(PG_FUNCTION_ARGS);
+extern Datum scalargejoinsel(PG_FUNCTION_ARGS);
+extern Datum hashmacaddr(PG_FUNCTION_ARGS);
+extern Datum hashtext(PG_FUNCTION_ARGS);
+extern Datum rtrim1(PG_FUNCTION_ARGS);
+extern Datum btoidvectorcmp(PG_FUNCTION_ARGS);
+extern Datum name_text(PG_FUNCTION_ARGS);
+extern Datum text_name(PG_FUNCTION_ARGS);
+extern Datum name_bpchar(PG_FUNCTION_ARGS);
+extern Datum bpchar_name(PG_FUNCTION_ARGS);
+extern Datum dist_pathp(PG_FUNCTION_ARGS);
+extern Datum hashinet(PG_FUNCTION_ARGS);
+extern Datum hashint4extended(PG_FUNCTION_ARGS);
+extern Datum hash_numeric(PG_FUNCTION_ARGS);
+extern Datum macaddr_in(PG_FUNCTION_ARGS);
+extern Datum macaddr_out(PG_FUNCTION_ARGS);
+extern Datum pg_num_nulls(PG_FUNCTION_ARGS);
+extern Datum pg_num_nonnulls(PG_FUNCTION_ARGS);
+extern Datum hashint2extended(PG_FUNCTION_ARGS);
+extern Datum hashint8extended(PG_FUNCTION_ARGS);
+extern Datum hashfloat4extended(PG_FUNCTION_ARGS);
+extern Datum hashfloat8extended(PG_FUNCTION_ARGS);
+extern Datum hashoidextended(PG_FUNCTION_ARGS);
+extern Datum hashcharextended(PG_FUNCTION_ARGS);
+extern Datum hashnameextended(PG_FUNCTION_ARGS);
+extern Datum hashtextextended(PG_FUNCTION_ARGS);
+extern Datum hashint2(PG_FUNCTION_ARGS);
+extern Datum hashint4(PG_FUNCTION_ARGS);
+extern Datum hashfloat4(PG_FUNCTION_ARGS);
+extern Datum hashfloat8(PG_FUNCTION_ARGS);
+extern Datum hashoid(PG_FUNCTION_ARGS);
+extern Datum hashchar(PG_FUNCTION_ARGS);
+extern Datum hashname(PG_FUNCTION_ARGS);
+extern Datum hashvarlena(PG_FUNCTION_ARGS);
+extern Datum hashoidvector(PG_FUNCTION_ARGS);
+extern Datum text_larger(PG_FUNCTION_ARGS);
+extern Datum text_smaller(PG_FUNCTION_ARGS);
+extern Datum int8in(PG_FUNCTION_ARGS);
+extern Datum int8out(PG_FUNCTION_ARGS);
+extern Datum int8um(PG_FUNCTION_ARGS);
+extern Datum int8pl(PG_FUNCTION_ARGS);
+extern Datum int8mi(PG_FUNCTION_ARGS);
+extern Datum int8mul(PG_FUNCTION_ARGS);
+extern Datum int8div(PG_FUNCTION_ARGS);
+extern Datum int8eq(PG_FUNCTION_ARGS);
+extern Datum int8ne(PG_FUNCTION_ARGS);
+extern Datum int8lt(PG_FUNCTION_ARGS);
+extern Datum int8gt(PG_FUNCTION_ARGS);
+extern Datum int8le(PG_FUNCTION_ARGS);
+extern Datum int8ge(PG_FUNCTION_ARGS);
+extern Datum int84eq(PG_FUNCTION_ARGS);
+extern Datum int84ne(PG_FUNCTION_ARGS);
+extern Datum int84lt(PG_FUNCTION_ARGS);
+extern Datum int84gt(PG_FUNCTION_ARGS);
+extern Datum int84le(PG_FUNCTION_ARGS);
+extern Datum int84ge(PG_FUNCTION_ARGS);
+extern Datum int84(PG_FUNCTION_ARGS);
+extern Datum int48(PG_FUNCTION_ARGS);
+extern Datum i8tod(PG_FUNCTION_ARGS);
+extern Datum dtoi8(PG_FUNCTION_ARGS);
+extern Datum array_larger(PG_FUNCTION_ARGS);
+extern Datum array_smaller(PG_FUNCTION_ARGS);
+extern Datum inet_abbrev(PG_FUNCTION_ARGS);
+extern Datum cidr_abbrev(PG_FUNCTION_ARGS);
+extern Datum inet_set_masklen(PG_FUNCTION_ARGS);
+extern Datum oidvectorne(PG_FUNCTION_ARGS);
+extern Datum hash_array(PG_FUNCTION_ARGS);
+extern Datum cidr_set_masklen(PG_FUNCTION_ARGS);
+extern Datum pg_indexam_has_property(PG_FUNCTION_ARGS);
+extern Datum pg_index_has_property(PG_FUNCTION_ARGS);
+extern Datum pg_index_column_has_property(PG_FUNCTION_ARGS);
+extern Datum i8tof(PG_FUNCTION_ARGS);
+extern Datum ftoi8(PG_FUNCTION_ARGS);
+extern Datum namelt(PG_FUNCTION_ARGS);
+extern Datum namele(PG_FUNCTION_ARGS);
+extern Datum namegt(PG_FUNCTION_ARGS);
+extern Datum namege(PG_FUNCTION_ARGS);
+extern Datum namene(PG_FUNCTION_ARGS);
+extern Datum bpchar(PG_FUNCTION_ARGS);
+extern Datum varchar(PG_FUNCTION_ARGS);
+extern Datum pg_indexam_progress_phasename(PG_FUNCTION_ARGS);
+extern Datum oidvectorlt(PG_FUNCTION_ARGS);
+extern Datum oidvectorle(PG_FUNCTION_ARGS);
+extern Datum oidvectoreq(PG_FUNCTION_ARGS);
+extern Datum oidvectorge(PG_FUNCTION_ARGS);
+extern Datum oidvectorgt(PG_FUNCTION_ARGS);
+extern Datum network_network(PG_FUNCTION_ARGS);
+extern Datum network_netmask(PG_FUNCTION_ARGS);
+extern Datum network_masklen(PG_FUNCTION_ARGS);
+extern Datum network_broadcast(PG_FUNCTION_ARGS);
+extern Datum network_host(PG_FUNCTION_ARGS);
+extern Datum dist_lp(PG_FUNCTION_ARGS);
+extern Datum dist_ls(PG_FUNCTION_ARGS);
+extern Datum current_user(PG_FUNCTION_ARGS);
+extern Datum network_family(PG_FUNCTION_ARGS);
+extern Datum int82(PG_FUNCTION_ARGS);
+extern Datum be_lo_create(PG_FUNCTION_ARGS);
+extern Datum oidlt(PG_FUNCTION_ARGS);
+extern Datum oidle(PG_FUNCTION_ARGS);
+extern Datum byteaoctetlen(PG_FUNCTION_ARGS);
+extern Datum byteaGetByte(PG_FUNCTION_ARGS);
+extern Datum byteaSetByte(PG_FUNCTION_ARGS);
+extern Datum byteaGetBit(PG_FUNCTION_ARGS);
+extern Datum byteaSetBit(PG_FUNCTION_ARGS);
+extern Datum dist_pl(PG_FUNCTION_ARGS);
+extern Datum dist_sl(PG_FUNCTION_ARGS);
+extern Datum dist_cpoly(PG_FUNCTION_ARGS);
+extern Datum poly_distance(PG_FUNCTION_ARGS);
+extern Datum network_show(PG_FUNCTION_ARGS);
+extern Datum text_lt(PG_FUNCTION_ARGS);
+extern Datum text_le(PG_FUNCTION_ARGS);
+extern Datum text_gt(PG_FUNCTION_ARGS);
+extern Datum text_ge(PG_FUNCTION_ARGS);
+extern Datum array_eq(PG_FUNCTION_ARGS);
+extern Datum session_user(PG_FUNCTION_ARGS);
+extern Datum array_dims(PG_FUNCTION_ARGS);
+extern Datum array_ndims(PG_FUNCTION_ARGS);
+extern Datum byteaoverlay(PG_FUNCTION_ARGS);
+extern Datum array_in(PG_FUNCTION_ARGS);
+extern Datum array_out(PG_FUNCTION_ARGS);
+extern Datum byteaoverlay_no_len(PG_FUNCTION_ARGS);
+extern Datum macaddr_trunc(PG_FUNCTION_ARGS);
+extern Datum int28(PG_FUNCTION_ARGS);
+extern Datum be_lo_import(PG_FUNCTION_ARGS);
+extern Datum be_lo_export(PG_FUNCTION_ARGS);
+extern Datum int4inc(PG_FUNCTION_ARGS);
+extern Datum be_lo_import_with_oid(PG_FUNCTION_ARGS);
+extern Datum int4larger(PG_FUNCTION_ARGS);
+extern Datum int4smaller(PG_FUNCTION_ARGS);
+extern Datum int2larger(PG_FUNCTION_ARGS);
+extern Datum int2smaller(PG_FUNCTION_ARGS);
+extern Datum hashvarlenaextended(PG_FUNCTION_ARGS);
+extern Datum hashoidvectorextended(PG_FUNCTION_ARGS);
+extern Datum hash_aclitem_extended(PG_FUNCTION_ARGS);
+extern Datum hashmacaddrextended(PG_FUNCTION_ARGS);
+extern Datum hashinetextended(PG_FUNCTION_ARGS);
+extern Datum hash_numeric_extended(PG_FUNCTION_ARGS);
+extern Datum hashmacaddr8extended(PG_FUNCTION_ARGS);
+extern Datum hash_array_extended(PG_FUNCTION_ARGS);
+extern Datum dist_polyc(PG_FUNCTION_ARGS);
+extern Datum pg_client_encoding(PG_FUNCTION_ARGS);
+extern Datum current_query(PG_FUNCTION_ARGS);
+extern Datum macaddr_eq(PG_FUNCTION_ARGS);
+extern Datum macaddr_lt(PG_FUNCTION_ARGS);
+extern Datum macaddr_le(PG_FUNCTION_ARGS);
+extern Datum macaddr_gt(PG_FUNCTION_ARGS);
+extern Datum macaddr_ge(PG_FUNCTION_ARGS);
+extern Datum macaddr_ne(PG_FUNCTION_ARGS);
+extern Datum macaddr_cmp(PG_FUNCTION_ARGS);
+extern Datum int82pl(PG_FUNCTION_ARGS);
+extern Datum int82mi(PG_FUNCTION_ARGS);
+extern Datum int82mul(PG_FUNCTION_ARGS);
+extern Datum int82div(PG_FUNCTION_ARGS);
+extern Datum int28pl(PG_FUNCTION_ARGS);
+extern Datum btint8cmp(PG_FUNCTION_ARGS);
+extern Datum cash_mul_flt4(PG_FUNCTION_ARGS);
+extern Datum cash_div_flt4(PG_FUNCTION_ARGS);
+extern Datum flt4_mul_cash(PG_FUNCTION_ARGS);
+extern Datum textpos(PG_FUNCTION_ARGS);
+extern Datum textlike(PG_FUNCTION_ARGS);
+extern Datum textnlike(PG_FUNCTION_ARGS);
+extern Datum int48eq(PG_FUNCTION_ARGS);
+extern Datum int48ne(PG_FUNCTION_ARGS);
+extern Datum int48lt(PG_FUNCTION_ARGS);
+extern Datum int48gt(PG_FUNCTION_ARGS);
+extern Datum int48le(PG_FUNCTION_ARGS);
+extern Datum int48ge(PG_FUNCTION_ARGS);
+extern Datum namelike(PG_FUNCTION_ARGS);
+extern Datum namenlike(PG_FUNCTION_ARGS);
+extern Datum char_bpchar(PG_FUNCTION_ARGS);
+extern Datum current_database(PG_FUNCTION_ARGS);
+extern Datum int4_mul_cash(PG_FUNCTION_ARGS);
+extern Datum int2_mul_cash(PG_FUNCTION_ARGS);
+extern Datum cash_mul_int4(PG_FUNCTION_ARGS);
+extern Datum cash_div_int4(PG_FUNCTION_ARGS);
+extern Datum cash_mul_int2(PG_FUNCTION_ARGS);
+extern Datum cash_div_int2(PG_FUNCTION_ARGS);
+extern Datum lower(PG_FUNCTION_ARGS);
+extern Datum upper(PG_FUNCTION_ARGS);
+extern Datum initcap(PG_FUNCTION_ARGS);
+extern Datum lpad(PG_FUNCTION_ARGS);
+extern Datum rpad(PG_FUNCTION_ARGS);
+extern Datum ltrim(PG_FUNCTION_ARGS);
+extern Datum rtrim(PG_FUNCTION_ARGS);
+extern Datum text_substr(PG_FUNCTION_ARGS);
+extern Datum translate(PG_FUNCTION_ARGS);
+extern Datum ltrim1(PG_FUNCTION_ARGS);
+extern Datum text_substr_no_len(PG_FUNCTION_ARGS);
+extern Datum btrim(PG_FUNCTION_ARGS);
+extern Datum btrim1(PG_FUNCTION_ARGS);
+extern Datum cash_in(PG_FUNCTION_ARGS);
+extern Datum cash_out(PG_FUNCTION_ARGS);
+extern Datum cash_eq(PG_FUNCTION_ARGS);
+extern Datum cash_ne(PG_FUNCTION_ARGS);
+extern Datum cash_lt(PG_FUNCTION_ARGS);
+extern Datum cash_le(PG_FUNCTION_ARGS);
+extern Datum cash_gt(PG_FUNCTION_ARGS);
+extern Datum cash_ge(PG_FUNCTION_ARGS);
+extern Datum cash_pl(PG_FUNCTION_ARGS);
+extern Datum cash_mi(PG_FUNCTION_ARGS);
+extern Datum cash_mul_flt8(PG_FUNCTION_ARGS);
+extern Datum cash_div_flt8(PG_FUNCTION_ARGS);
+extern Datum cashlarger(PG_FUNCTION_ARGS);
+extern Datum cashsmaller(PG_FUNCTION_ARGS);
+extern Datum inet_in(PG_FUNCTION_ARGS);
+extern Datum inet_out(PG_FUNCTION_ARGS);
+extern Datum flt8_mul_cash(PG_FUNCTION_ARGS);
+extern Datum network_eq(PG_FUNCTION_ARGS);
+extern Datum network_lt(PG_FUNCTION_ARGS);
+extern Datum network_le(PG_FUNCTION_ARGS);
+extern Datum network_gt(PG_FUNCTION_ARGS);
+extern Datum network_ge(PG_FUNCTION_ARGS);
+extern Datum network_ne(PG_FUNCTION_ARGS);
+extern Datum network_cmp(PG_FUNCTION_ARGS);
+extern Datum network_sub(PG_FUNCTION_ARGS);
+extern Datum network_subeq(PG_FUNCTION_ARGS);
+extern Datum network_sup(PG_FUNCTION_ARGS);
+extern Datum network_supeq(PG_FUNCTION_ARGS);
+extern Datum cash_words(PG_FUNCTION_ARGS);
+extern Datum generate_series_timestamp(PG_FUNCTION_ARGS);
+extern Datum generate_series_timestamptz(PG_FUNCTION_ARGS);
+extern Datum int28mi(PG_FUNCTION_ARGS);
+extern Datum int28mul(PG_FUNCTION_ARGS);
+extern Datum text_char(PG_FUNCTION_ARGS);
+extern Datum int8mod(PG_FUNCTION_ARGS);
+extern Datum char_text(PG_FUNCTION_ARGS);
+extern Datum int28div(PG_FUNCTION_ARGS);
+extern Datum hashint8(PG_FUNCTION_ARGS);
+extern Datum be_lo_open(PG_FUNCTION_ARGS);
+extern Datum be_lo_close(PG_FUNCTION_ARGS);
+extern Datum be_loread(PG_FUNCTION_ARGS);
+extern Datum be_lowrite(PG_FUNCTION_ARGS);
+extern Datum be_lo_lseek(PG_FUNCTION_ARGS);
+extern Datum be_lo_creat(PG_FUNCTION_ARGS);
+extern Datum be_lo_tell(PG_FUNCTION_ARGS);
+extern Datum on_pl(PG_FUNCTION_ARGS);
+extern Datum on_sl(PG_FUNCTION_ARGS);
+extern Datum close_pl(PG_FUNCTION_ARGS);
+extern Datum be_lo_unlink(PG_FUNCTION_ARGS);
+extern Datum hashbpcharextended(PG_FUNCTION_ARGS);
+extern Datum path_inter(PG_FUNCTION_ARGS);
+extern Datum box_area(PG_FUNCTION_ARGS);
+extern Datum box_width(PG_FUNCTION_ARGS);
+extern Datum box_height(PG_FUNCTION_ARGS);
+extern Datum box_distance(PG_FUNCTION_ARGS);
+extern Datum path_area(PG_FUNCTION_ARGS);
+extern Datum box_intersect(PG_FUNCTION_ARGS);
+extern Datum box_diagonal(PG_FUNCTION_ARGS);
+extern Datum path_n_lt(PG_FUNCTION_ARGS);
+extern Datum path_n_gt(PG_FUNCTION_ARGS);
+extern Datum path_n_eq(PG_FUNCTION_ARGS);
+extern Datum path_n_le(PG_FUNCTION_ARGS);
+extern Datum path_n_ge(PG_FUNCTION_ARGS);
+extern Datum path_length(PG_FUNCTION_ARGS);
+extern Datum point_ne(PG_FUNCTION_ARGS);
+extern Datum point_vert(PG_FUNCTION_ARGS);
+extern Datum point_horiz(PG_FUNCTION_ARGS);
+extern Datum point_distance(PG_FUNCTION_ARGS);
+extern Datum point_slope(PG_FUNCTION_ARGS);
+extern Datum lseg_construct(PG_FUNCTION_ARGS);
+extern Datum lseg_intersect(PG_FUNCTION_ARGS);
+extern Datum lseg_parallel(PG_FUNCTION_ARGS);
+extern Datum lseg_perp(PG_FUNCTION_ARGS);
+extern Datum lseg_vertical(PG_FUNCTION_ARGS);
+extern Datum lseg_horizontal(PG_FUNCTION_ARGS);
+extern Datum lseg_eq(PG_FUNCTION_ARGS);
+extern Datum be_lo_truncate(PG_FUNCTION_ARGS);
+extern Datum textlike_support(PG_FUNCTION_ARGS);
+extern Datum texticregexeq_support(PG_FUNCTION_ARGS);
+extern Datum texticlike_support(PG_FUNCTION_ARGS);
+extern Datum timestamptz_izone(PG_FUNCTION_ARGS);
+extern Datum gist_point_compress(PG_FUNCTION_ARGS);
+extern Datum aclitemin(PG_FUNCTION_ARGS);
+extern Datum aclitemout(PG_FUNCTION_ARGS);
+extern Datum aclinsert(PG_FUNCTION_ARGS);
+extern Datum aclremove(PG_FUNCTION_ARGS);
+extern Datum aclcontains(PG_FUNCTION_ARGS);
+extern Datum getdatabaseencoding(PG_FUNCTION_ARGS);
+extern Datum bpcharin(PG_FUNCTION_ARGS);
+extern Datum bpcharout(PG_FUNCTION_ARGS);
+extern Datum varcharin(PG_FUNCTION_ARGS);
+extern Datum varcharout(PG_FUNCTION_ARGS);
+extern Datum bpchareq(PG_FUNCTION_ARGS);
+extern Datum bpcharlt(PG_FUNCTION_ARGS);
+extern Datum bpcharle(PG_FUNCTION_ARGS);
+extern Datum bpchargt(PG_FUNCTION_ARGS);
+extern Datum bpcharge(PG_FUNCTION_ARGS);
+extern Datum bpcharne(PG_FUNCTION_ARGS);
+extern Datum aclitem_eq(PG_FUNCTION_ARGS);
+extern Datum bpchar_larger(PG_FUNCTION_ARGS);
+extern Datum bpchar_smaller(PG_FUNCTION_ARGS);
+extern Datum pg_prepared_xact(PG_FUNCTION_ARGS);
+extern Datum generate_series_step_int4(PG_FUNCTION_ARGS);
+extern Datum generate_series_int4(PG_FUNCTION_ARGS);
+extern Datum generate_series_step_int8(PG_FUNCTION_ARGS);
+extern Datum generate_series_int8(PG_FUNCTION_ARGS);
+extern Datum bpcharcmp(PG_FUNCTION_ARGS);
+extern Datum text_regclass(PG_FUNCTION_ARGS);
+extern Datum hashbpchar(PG_FUNCTION_ARGS);
+extern Datum format_type(PG_FUNCTION_ARGS);
+extern Datum date_in(PG_FUNCTION_ARGS);
+extern Datum date_out(PG_FUNCTION_ARGS);
+extern Datum date_eq(PG_FUNCTION_ARGS);
+extern Datum date_lt(PG_FUNCTION_ARGS);
+extern Datum date_le(PG_FUNCTION_ARGS);
+extern Datum date_gt(PG_FUNCTION_ARGS);
+extern Datum date_ge(PG_FUNCTION_ARGS);
+extern Datum date_ne(PG_FUNCTION_ARGS);
+extern Datum date_cmp(PG_FUNCTION_ARGS);
+extern Datum time_lt(PG_FUNCTION_ARGS);
+extern Datum time_le(PG_FUNCTION_ARGS);
+extern Datum time_gt(PG_FUNCTION_ARGS);
+extern Datum time_ge(PG_FUNCTION_ARGS);
+extern Datum time_ne(PG_FUNCTION_ARGS);
+extern Datum time_cmp(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_wal(PG_FUNCTION_ARGS);
+extern Datum pg_get_wal_replay_pause_state(PG_FUNCTION_ARGS);
+extern Datum date_larger(PG_FUNCTION_ARGS);
+extern Datum date_smaller(PG_FUNCTION_ARGS);
+extern Datum date_mi(PG_FUNCTION_ARGS);
+extern Datum date_pli(PG_FUNCTION_ARGS);
+extern Datum date_mii(PG_FUNCTION_ARGS);
+extern Datum time_in(PG_FUNCTION_ARGS);
+extern Datum time_out(PG_FUNCTION_ARGS);
+extern Datum time_eq(PG_FUNCTION_ARGS);
+extern Datum circle_add_pt(PG_FUNCTION_ARGS);
+extern Datum circle_sub_pt(PG_FUNCTION_ARGS);
+extern Datum circle_mul_pt(PG_FUNCTION_ARGS);
+extern Datum circle_div_pt(PG_FUNCTION_ARGS);
+extern Datum timestamptz_in(PG_FUNCTION_ARGS);
+extern Datum timestamptz_out(PG_FUNCTION_ARGS);
+extern Datum timestamp_eq(PG_FUNCTION_ARGS);
+extern Datum timestamp_ne(PG_FUNCTION_ARGS);
+extern Datum timestamp_lt(PG_FUNCTION_ARGS);
+extern Datum timestamp_le(PG_FUNCTION_ARGS);
+extern Datum timestamp_ge(PG_FUNCTION_ARGS);
+extern Datum timestamp_gt(PG_FUNCTION_ARGS);
+extern Datum float8_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamptz_zone(PG_FUNCTION_ARGS);
+extern Datum interval_in(PG_FUNCTION_ARGS);
+extern Datum interval_out(PG_FUNCTION_ARGS);
+extern Datum interval_eq(PG_FUNCTION_ARGS);
+extern Datum interval_ne(PG_FUNCTION_ARGS);
+extern Datum interval_lt(PG_FUNCTION_ARGS);
+extern Datum interval_le(PG_FUNCTION_ARGS);
+extern Datum interval_ge(PG_FUNCTION_ARGS);
+extern Datum interval_gt(PG_FUNCTION_ARGS);
+extern Datum interval_um(PG_FUNCTION_ARGS);
+extern Datum interval_pl(PG_FUNCTION_ARGS);
+extern Datum interval_mi(PG_FUNCTION_ARGS);
+extern Datum timestamptz_part(PG_FUNCTION_ARGS);
+extern Datum interval_part(PG_FUNCTION_ARGS);
+extern Datum network_subset_support(PG_FUNCTION_ARGS);
+extern Datum date_timestamptz(PG_FUNCTION_ARGS);
+extern Datum interval_justify_hours(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_exists_tz(PG_FUNCTION_ARGS);
+extern Datum timestamptz_date(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query_tz(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query_array_tz(PG_FUNCTION_ARGS);
+extern Datum xid_age(PG_FUNCTION_ARGS);
+extern Datum timestamp_mi(PG_FUNCTION_ARGS);
+extern Datum timestamptz_pl_interval(PG_FUNCTION_ARGS);
+extern Datum timestamptz_mi_interval(PG_FUNCTION_ARGS);
+extern Datum generate_subscripts(PG_FUNCTION_ARGS);
+extern Datum generate_subscripts_nodir(PG_FUNCTION_ARGS);
+extern Datum array_fill(PG_FUNCTION_ARGS);
+extern Datum dlog10(PG_FUNCTION_ARGS);
+extern Datum timestamp_smaller(PG_FUNCTION_ARGS);
+extern Datum timestamp_larger(PG_FUNCTION_ARGS);
+extern Datum interval_smaller(PG_FUNCTION_ARGS);
+extern Datum interval_larger(PG_FUNCTION_ARGS);
+extern Datum timestamptz_age(PG_FUNCTION_ARGS);
+extern Datum interval_scale(PG_FUNCTION_ARGS);
+extern Datum timestamptz_trunc(PG_FUNCTION_ARGS);
+extern Datum interval_trunc(PG_FUNCTION_ARGS);
+extern Datum int8inc(PG_FUNCTION_ARGS);
+extern Datum int8abs(PG_FUNCTION_ARGS);
+extern Datum int8larger(PG_FUNCTION_ARGS);
+extern Datum int8smaller(PG_FUNCTION_ARGS);
+extern Datum texticregexeq(PG_FUNCTION_ARGS);
+extern Datum texticregexne(PG_FUNCTION_ARGS);
+extern Datum nameicregexeq(PG_FUNCTION_ARGS);
+extern Datum nameicregexne(PG_FUNCTION_ARGS);
+extern Datum boolin(PG_FUNCTION_ARGS);
+extern Datum boolout(PG_FUNCTION_ARGS);
+extern Datum byteain(PG_FUNCTION_ARGS);
+extern Datum charin(PG_FUNCTION_ARGS);
+extern Datum charlt(PG_FUNCTION_ARGS);
+extern Datum unique_key_recheck(PG_FUNCTION_ARGS);
+extern Datum int4abs(PG_FUNCTION_ARGS);
+extern Datum nameregexne(PG_FUNCTION_ARGS);
+extern Datum int2abs(PG_FUNCTION_ARGS);
+extern Datum textregexeq(PG_FUNCTION_ARGS);
+extern Datum textregexne(PG_FUNCTION_ARGS);
+extern Datum textlen(PG_FUNCTION_ARGS);
+extern Datum textcat(PG_FUNCTION_ARGS);
+extern Datum PG_char_to_encoding(PG_FUNCTION_ARGS);
+extern Datum tidne(PG_FUNCTION_ARGS);
+extern Datum cidr_in(PG_FUNCTION_ARGS);
+extern Datum parse_ident(PG_FUNCTION_ARGS);
+extern Datum pg_column_size(PG_FUNCTION_ARGS);
+extern Datum overlaps_timetz(PG_FUNCTION_ARGS);
+extern Datum datetime_timestamp(PG_FUNCTION_ARGS);
+extern Datum timetz_part(PG_FUNCTION_ARGS);
+extern Datum int84pl(PG_FUNCTION_ARGS);
+extern Datum int84mi(PG_FUNCTION_ARGS);
+extern Datum int84mul(PG_FUNCTION_ARGS);
+extern Datum int84div(PG_FUNCTION_ARGS);
+extern Datum int48pl(PG_FUNCTION_ARGS);
+extern Datum int48mi(PG_FUNCTION_ARGS);
+extern Datum int48mul(PG_FUNCTION_ARGS);
+extern Datum int48div(PG_FUNCTION_ARGS);
+extern Datum quote_ident(PG_FUNCTION_ARGS);
+extern Datum quote_literal(PG_FUNCTION_ARGS);
+extern Datum timestamptz_trunc_zone(PG_FUNCTION_ARGS);
+extern Datum array_fill_with_lower_bounds(PG_FUNCTION_ARGS);
+extern Datum i8tooid(PG_FUNCTION_ARGS);
+extern Datum oidtoi8(PG_FUNCTION_ARGS);
+extern Datum quote_nullable(PG_FUNCTION_ARGS);
+extern Datum suppress_redundant_updates_trigger(PG_FUNCTION_ARGS);
+extern Datum tideq(PG_FUNCTION_ARGS);
+extern Datum multirange_unnest(PG_FUNCTION_ARGS);
+extern Datum currtid_byrelname(PG_FUNCTION_ARGS);
+extern Datum interval_justify_days(PG_FUNCTION_ARGS);
+extern Datum datetimetz_timestamptz(PG_FUNCTION_ARGS);
+extern Datum now(PG_FUNCTION_ARGS);
+extern Datum positionsel(PG_FUNCTION_ARGS);
+extern Datum positionjoinsel(PG_FUNCTION_ARGS);
+extern Datum contsel(PG_FUNCTION_ARGS);
+extern Datum contjoinsel(PG_FUNCTION_ARGS);
+extern Datum overlaps_timestamp(PG_FUNCTION_ARGS);
+extern Datum overlaps_time(PG_FUNCTION_ARGS);
+extern Datum timestamp_in(PG_FUNCTION_ARGS);
+extern Datum timestamp_out(PG_FUNCTION_ARGS);
+extern Datum timestamp_cmp(PG_FUNCTION_ARGS);
+extern Datum interval_cmp(PG_FUNCTION_ARGS);
+extern Datum timestamp_time(PG_FUNCTION_ARGS);
+extern Datum bpcharlen(PG_FUNCTION_ARGS);
+extern Datum interval_div(PG_FUNCTION_ARGS);
+extern Datum oidvectortypes(PG_FUNCTION_ARGS);
+extern Datum timetz_in(PG_FUNCTION_ARGS);
+extern Datum timetz_out(PG_FUNCTION_ARGS);
+extern Datum timetz_eq(PG_FUNCTION_ARGS);
+extern Datum timetz_ne(PG_FUNCTION_ARGS);
+extern Datum timetz_lt(PG_FUNCTION_ARGS);
+extern Datum timetz_le(PG_FUNCTION_ARGS);
+extern Datum timetz_ge(PG_FUNCTION_ARGS);
+extern Datum timetz_gt(PG_FUNCTION_ARGS);
+extern Datum timetz_cmp(PG_FUNCTION_ARGS);
+extern Datum network_hostmask(PG_FUNCTION_ARGS);
+extern Datum textregexeq_support(PG_FUNCTION_ARGS);
+extern Datum makeaclitem(PG_FUNCTION_ARGS);
+extern Datum time_interval(PG_FUNCTION_ARGS);
+extern Datum pg_lock_status(PG_FUNCTION_ARGS);
+extern Datum date_finite(PG_FUNCTION_ARGS);
+extern Datum textoctetlen(PG_FUNCTION_ARGS);
+extern Datum bpcharoctetlen(PG_FUNCTION_ARGS);
+extern Datum numeric_fac(PG_FUNCTION_ARGS);
+extern Datum time_larger(PG_FUNCTION_ARGS);
+extern Datum time_smaller(PG_FUNCTION_ARGS);
+extern Datum timetz_larger(PG_FUNCTION_ARGS);
+extern Datum timetz_smaller(PG_FUNCTION_ARGS);
+extern Datum time_part(PG_FUNCTION_ARGS);
+extern Datum pg_get_constraintdef(PG_FUNCTION_ARGS);
+extern Datum timestamptz_timetz(PG_FUNCTION_ARGS);
+extern Datum timestamp_finite(PG_FUNCTION_ARGS);
+extern Datum interval_finite(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS);
+extern Datum current_schema(PG_FUNCTION_ARGS);
+extern Datum current_schemas(PG_FUNCTION_ARGS);
+extern Datum textoverlay(PG_FUNCTION_ARGS);
+extern Datum textoverlay_no_len(PG_FUNCTION_ARGS);
+extern Datum line_parallel(PG_FUNCTION_ARGS);
+extern Datum line_perp(PG_FUNCTION_ARGS);
+extern Datum line_vertical(PG_FUNCTION_ARGS);
+extern Datum line_horizontal(PG_FUNCTION_ARGS);
+extern Datum circle_center(PG_FUNCTION_ARGS);
+extern Datum interval_time(PG_FUNCTION_ARGS);
+extern Datum points_box(PG_FUNCTION_ARGS);
+extern Datum box_add(PG_FUNCTION_ARGS);
+extern Datum box_sub(PG_FUNCTION_ARGS);
+extern Datum box_mul(PG_FUNCTION_ARGS);
+extern Datum box_div(PG_FUNCTION_ARGS);
+extern Datum cidr_out(PG_FUNCTION_ARGS);
+extern Datum poly_contain_pt(PG_FUNCTION_ARGS);
+extern Datum pt_contained_poly(PG_FUNCTION_ARGS);
+extern Datum path_isclosed(PG_FUNCTION_ARGS);
+extern Datum path_isopen(PG_FUNCTION_ARGS);
+extern Datum path_npoints(PG_FUNCTION_ARGS);
+extern Datum path_close(PG_FUNCTION_ARGS);
+extern Datum path_open(PG_FUNCTION_ARGS);
+extern Datum path_add(PG_FUNCTION_ARGS);
+extern Datum path_add_pt(PG_FUNCTION_ARGS);
+extern Datum path_sub_pt(PG_FUNCTION_ARGS);
+extern Datum path_mul_pt(PG_FUNCTION_ARGS);
+extern Datum path_div_pt(PG_FUNCTION_ARGS);
+extern Datum construct_point(PG_FUNCTION_ARGS);
+extern Datum point_add(PG_FUNCTION_ARGS);
+extern Datum point_sub(PG_FUNCTION_ARGS);
+extern Datum point_mul(PG_FUNCTION_ARGS);
+extern Datum point_div(PG_FUNCTION_ARGS);
+extern Datum poly_npoints(PG_FUNCTION_ARGS);
+extern Datum poly_box(PG_FUNCTION_ARGS);
+extern Datum poly_path(PG_FUNCTION_ARGS);
+extern Datum box_poly(PG_FUNCTION_ARGS);
+extern Datum path_poly(PG_FUNCTION_ARGS);
+extern Datum circle_in(PG_FUNCTION_ARGS);
+extern Datum circle_out(PG_FUNCTION_ARGS);
+extern Datum circle_same(PG_FUNCTION_ARGS);
+extern Datum circle_contain(PG_FUNCTION_ARGS);
+extern Datum circle_left(PG_FUNCTION_ARGS);
+extern Datum circle_overleft(PG_FUNCTION_ARGS);
+extern Datum circle_overright(PG_FUNCTION_ARGS);
+extern Datum circle_right(PG_FUNCTION_ARGS);
+extern Datum circle_contained(PG_FUNCTION_ARGS);
+extern Datum circle_overlap(PG_FUNCTION_ARGS);
+extern Datum circle_below(PG_FUNCTION_ARGS);
+extern Datum circle_above(PG_FUNCTION_ARGS);
+extern Datum circle_eq(PG_FUNCTION_ARGS);
+extern Datum circle_ne(PG_FUNCTION_ARGS);
+extern Datum circle_lt(PG_FUNCTION_ARGS);
+extern Datum circle_gt(PG_FUNCTION_ARGS);
+extern Datum circle_le(PG_FUNCTION_ARGS);
+extern Datum circle_ge(PG_FUNCTION_ARGS);
+extern Datum circle_area(PG_FUNCTION_ARGS);
+extern Datum circle_diameter(PG_FUNCTION_ARGS);
+extern Datum circle_radius(PG_FUNCTION_ARGS);
+extern Datum circle_distance(PG_FUNCTION_ARGS);
+extern Datum cr_circle(PG_FUNCTION_ARGS);
+extern Datum poly_circle(PG_FUNCTION_ARGS);
+extern Datum circle_poly(PG_FUNCTION_ARGS);
+extern Datum dist_pc(PG_FUNCTION_ARGS);
+extern Datum circle_contain_pt(PG_FUNCTION_ARGS);
+extern Datum pt_contained_circle(PG_FUNCTION_ARGS);
+extern Datum box_circle(PG_FUNCTION_ARGS);
+extern Datum circle_box(PG_FUNCTION_ARGS);
+extern Datum lseg_ne(PG_FUNCTION_ARGS);
+extern Datum lseg_lt(PG_FUNCTION_ARGS);
+extern Datum lseg_le(PG_FUNCTION_ARGS);
+extern Datum lseg_gt(PG_FUNCTION_ARGS);
+extern Datum lseg_ge(PG_FUNCTION_ARGS);
+extern Datum lseg_length(PG_FUNCTION_ARGS);
+extern Datum close_ls(PG_FUNCTION_ARGS);
+extern Datum close_lseg(PG_FUNCTION_ARGS);
+extern Datum line_in(PG_FUNCTION_ARGS);
+extern Datum line_out(PG_FUNCTION_ARGS);
+extern Datum line_eq(PG_FUNCTION_ARGS);
+extern Datum line_construct_pp(PG_FUNCTION_ARGS);
+extern Datum line_interpt(PG_FUNCTION_ARGS);
+extern Datum line_intersect(PG_FUNCTION_ARGS);
+extern Datum bit_in(PG_FUNCTION_ARGS);
+extern Datum bit_out(PG_FUNCTION_ARGS);
+extern Datum pg_get_ruledef(PG_FUNCTION_ARGS);
+extern Datum nextval_oid(PG_FUNCTION_ARGS);
+extern Datum currval_oid(PG_FUNCTION_ARGS);
+extern Datum setval_oid(PG_FUNCTION_ARGS);
+extern Datum varbit_in(PG_FUNCTION_ARGS);
+extern Datum varbit_out(PG_FUNCTION_ARGS);
+extern Datum biteq(PG_FUNCTION_ARGS);
+extern Datum bitne(PG_FUNCTION_ARGS);
+extern Datum bitge(PG_FUNCTION_ARGS);
+extern Datum bitgt(PG_FUNCTION_ARGS);
+extern Datum bitle(PG_FUNCTION_ARGS);
+extern Datum bitlt(PG_FUNCTION_ARGS);
+extern Datum bitcmp(PG_FUNCTION_ARGS);
+extern Datum PG_encoding_to_char(PG_FUNCTION_ARGS);
+extern Datum drandom(PG_FUNCTION_ARGS);
+extern Datum setseed(PG_FUNCTION_ARGS);
+extern Datum dasin(PG_FUNCTION_ARGS);
+extern Datum dacos(PG_FUNCTION_ARGS);
+extern Datum datan(PG_FUNCTION_ARGS);
+extern Datum datan2(PG_FUNCTION_ARGS);
+extern Datum dsin(PG_FUNCTION_ARGS);
+extern Datum dcos(PG_FUNCTION_ARGS);
+extern Datum dtan(PG_FUNCTION_ARGS);
+extern Datum dcot(PG_FUNCTION_ARGS);
+extern Datum degrees(PG_FUNCTION_ARGS);
+extern Datum radians(PG_FUNCTION_ARGS);
+extern Datum dpi(PG_FUNCTION_ARGS);
+extern Datum interval_mul(PG_FUNCTION_ARGS);
+extern Datum pg_typeof(PG_FUNCTION_ARGS);
+extern Datum ascii(PG_FUNCTION_ARGS);
+extern Datum chr(PG_FUNCTION_ARGS);
+extern Datum repeat(PG_FUNCTION_ARGS);
+extern Datum similar_escape(PG_FUNCTION_ARGS);
+extern Datum mul_d_interval(PG_FUNCTION_ARGS);
+extern Datum texticlike(PG_FUNCTION_ARGS);
+extern Datum texticnlike(PG_FUNCTION_ARGS);
+extern Datum nameiclike(PG_FUNCTION_ARGS);
+extern Datum nameicnlike(PG_FUNCTION_ARGS);
+extern Datum like_escape(PG_FUNCTION_ARGS);
+extern Datum oidgt(PG_FUNCTION_ARGS);
+extern Datum oidge(PG_FUNCTION_ARGS);
+extern Datum pg_get_viewdef_name(PG_FUNCTION_ARGS);
+extern Datum pg_get_viewdef(PG_FUNCTION_ARGS);
+extern Datum pg_get_userbyid(PG_FUNCTION_ARGS);
+extern Datum pg_get_indexdef(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_check_ins(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_check_upd(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_cascade_del(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_cascade_upd(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_restrict_del(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_restrict_upd(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_setnull_del(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_setnull_upd(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_setdefault_del(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_setdefault_upd(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_noaction_del(PG_FUNCTION_ARGS);
+extern Datum RI_FKey_noaction_upd(PG_FUNCTION_ARGS);
+extern Datum pg_get_triggerdef(PG_FUNCTION_ARGS);
+extern Datum pg_get_serial_sequence(PG_FUNCTION_ARGS);
+extern Datum bit_and(PG_FUNCTION_ARGS);
+extern Datum bit_or(PG_FUNCTION_ARGS);
+extern Datum bitxor(PG_FUNCTION_ARGS);
+extern Datum bitnot(PG_FUNCTION_ARGS);
+extern Datum bitshiftleft(PG_FUNCTION_ARGS);
+extern Datum bitshiftright(PG_FUNCTION_ARGS);
+extern Datum bitcat(PG_FUNCTION_ARGS);
+extern Datum bitsubstr(PG_FUNCTION_ARGS);
+extern Datum bitlength(PG_FUNCTION_ARGS);
+extern Datum bitoctetlength(PG_FUNCTION_ARGS);
+extern Datum bitfromint4(PG_FUNCTION_ARGS);
+extern Datum bittoint4(PG_FUNCTION_ARGS);
+extern Datum bit(PG_FUNCTION_ARGS);
+extern Datum pg_get_keywords(PG_FUNCTION_ARGS);
+extern Datum varbit(PG_FUNCTION_ARGS);
+extern Datum time_hash(PG_FUNCTION_ARGS);
+extern Datum aclexplode(PG_FUNCTION_ARGS);
+extern Datum time_mi_time(PG_FUNCTION_ARGS);
+extern Datum boolle(PG_FUNCTION_ARGS);
+extern Datum boolge(PG_FUNCTION_ARGS);
+extern Datum btboolcmp(PG_FUNCTION_ARGS);
+extern Datum timetz_hash(PG_FUNCTION_ARGS);
+extern Datum interval_hash(PG_FUNCTION_ARGS);
+extern Datum bitposition(PG_FUNCTION_ARGS);
+extern Datum bitsubstr_no_len(PG_FUNCTION_ARGS);
+extern Datum numeric_in(PG_FUNCTION_ARGS);
+extern Datum numeric_out(PG_FUNCTION_ARGS);
+extern Datum numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_abs(PG_FUNCTION_ARGS);
+extern Datum numeric_sign(PG_FUNCTION_ARGS);
+extern Datum numeric_round(PG_FUNCTION_ARGS);
+extern Datum numeric_trunc(PG_FUNCTION_ARGS);
+extern Datum numeric_ceil(PG_FUNCTION_ARGS);
+extern Datum numeric_floor(PG_FUNCTION_ARGS);
+extern Datum length_in_encoding(PG_FUNCTION_ARGS);
+extern Datum pg_convert_from(PG_FUNCTION_ARGS);
+extern Datum inet_to_cidr(PG_FUNCTION_ARGS);
+extern Datum pg_get_expr(PG_FUNCTION_ARGS);
+extern Datum pg_convert_to(PG_FUNCTION_ARGS);
+extern Datum numeric_eq(PG_FUNCTION_ARGS);
+extern Datum numeric_ne(PG_FUNCTION_ARGS);
+extern Datum numeric_gt(PG_FUNCTION_ARGS);
+extern Datum numeric_ge(PG_FUNCTION_ARGS);
+extern Datum numeric_lt(PG_FUNCTION_ARGS);
+extern Datum numeric_le(PG_FUNCTION_ARGS);
+extern Datum numeric_add(PG_FUNCTION_ARGS);
+extern Datum numeric_sub(PG_FUNCTION_ARGS);
+extern Datum numeric_mul(PG_FUNCTION_ARGS);
+extern Datum numeric_div(PG_FUNCTION_ARGS);
+extern Datum numeric_mod(PG_FUNCTION_ARGS);
+extern Datum numeric_sqrt(PG_FUNCTION_ARGS);
+extern Datum numeric_exp(PG_FUNCTION_ARGS);
+extern Datum numeric_ln(PG_FUNCTION_ARGS);
+extern Datum numeric_log(PG_FUNCTION_ARGS);
+extern Datum numeric_power(PG_FUNCTION_ARGS);
+extern Datum int4_numeric(PG_FUNCTION_ARGS);
+extern Datum float4_numeric(PG_FUNCTION_ARGS);
+extern Datum float8_numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_int4(PG_FUNCTION_ARGS);
+extern Datum numeric_float4(PG_FUNCTION_ARGS);
+extern Datum numeric_float8(PG_FUNCTION_ARGS);
+extern Datum time_pl_interval(PG_FUNCTION_ARGS);
+extern Datum time_mi_interval(PG_FUNCTION_ARGS);
+extern Datum timetz_pl_interval(PG_FUNCTION_ARGS);
+extern Datum timetz_mi_interval(PG_FUNCTION_ARGS);
+extern Datum numeric_inc(PG_FUNCTION_ARGS);
+extern Datum setval3_oid(PG_FUNCTION_ARGS);
+extern Datum numeric_smaller(PG_FUNCTION_ARGS);
+extern Datum numeric_larger(PG_FUNCTION_ARGS);
+extern Datum interval_to_char(PG_FUNCTION_ARGS);
+extern Datum numeric_cmp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_to_char(PG_FUNCTION_ARGS);
+extern Datum numeric_uminus(PG_FUNCTION_ARGS);
+extern Datum numeric_to_char(PG_FUNCTION_ARGS);
+extern Datum int4_to_char(PG_FUNCTION_ARGS);
+extern Datum int8_to_char(PG_FUNCTION_ARGS);
+extern Datum float4_to_char(PG_FUNCTION_ARGS);
+extern Datum float8_to_char(PG_FUNCTION_ARGS);
+extern Datum numeric_to_number(PG_FUNCTION_ARGS);
+extern Datum to_timestamp(PG_FUNCTION_ARGS);
+extern Datum numeric_int8(PG_FUNCTION_ARGS);
+extern Datum to_date(PG_FUNCTION_ARGS);
+extern Datum int8_numeric(PG_FUNCTION_ARGS);
+extern Datum int2_numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_int2(PG_FUNCTION_ARGS);
+extern Datum oidin(PG_FUNCTION_ARGS);
+extern Datum oidout(PG_FUNCTION_ARGS);
+extern Datum pg_convert(PG_FUNCTION_ARGS);
+extern Datum iclikesel(PG_FUNCTION_ARGS);
+extern Datum icnlikesel(PG_FUNCTION_ARGS);
+extern Datum iclikejoinsel(PG_FUNCTION_ARGS);
+extern Datum icnlikejoinsel(PG_FUNCTION_ARGS);
+extern Datum regexeqsel(PG_FUNCTION_ARGS);
+extern Datum likesel(PG_FUNCTION_ARGS);
+extern Datum icregexeqsel(PG_FUNCTION_ARGS);
+extern Datum regexnesel(PG_FUNCTION_ARGS);
+extern Datum nlikesel(PG_FUNCTION_ARGS);
+extern Datum icregexnesel(PG_FUNCTION_ARGS);
+extern Datum regexeqjoinsel(PG_FUNCTION_ARGS);
+extern Datum likejoinsel(PG_FUNCTION_ARGS);
+extern Datum icregexeqjoinsel(PG_FUNCTION_ARGS);
+extern Datum regexnejoinsel(PG_FUNCTION_ARGS);
+extern Datum nlikejoinsel(PG_FUNCTION_ARGS);
+extern Datum icregexnejoinsel(PG_FUNCTION_ARGS);
+extern Datum float8_avg(PG_FUNCTION_ARGS);
+extern Datum float8_var_samp(PG_FUNCTION_ARGS);
+extern Datum float8_stddev_samp(PG_FUNCTION_ARGS);
+extern Datum numeric_accum(PG_FUNCTION_ARGS);
+extern Datum int2_accum(PG_FUNCTION_ARGS);
+extern Datum int4_accum(PG_FUNCTION_ARGS);
+extern Datum int8_accum(PG_FUNCTION_ARGS);
+extern Datum numeric_avg(PG_FUNCTION_ARGS);
+extern Datum numeric_var_samp(PG_FUNCTION_ARGS);
+extern Datum numeric_stddev_samp(PG_FUNCTION_ARGS);
+extern Datum int2_sum(PG_FUNCTION_ARGS);
+extern Datum int4_sum(PG_FUNCTION_ARGS);
+extern Datum int8_sum(PG_FUNCTION_ARGS);
+extern Datum interval_accum(PG_FUNCTION_ARGS);
+extern Datum interval_avg(PG_FUNCTION_ARGS);
+extern Datum to_ascii_default(PG_FUNCTION_ARGS);
+extern Datum to_ascii_enc(PG_FUNCTION_ARGS);
+extern Datum to_ascii_encname(PG_FUNCTION_ARGS);
+extern Datum int28eq(PG_FUNCTION_ARGS);
+extern Datum int28ne(PG_FUNCTION_ARGS);
+extern Datum int28lt(PG_FUNCTION_ARGS);
+extern Datum int28gt(PG_FUNCTION_ARGS);
+extern Datum int28le(PG_FUNCTION_ARGS);
+extern Datum int28ge(PG_FUNCTION_ARGS);
+extern Datum int82eq(PG_FUNCTION_ARGS);
+extern Datum int82ne(PG_FUNCTION_ARGS);
+extern Datum int82lt(PG_FUNCTION_ARGS);
+extern Datum int82gt(PG_FUNCTION_ARGS);
+extern Datum int82le(PG_FUNCTION_ARGS);
+extern Datum int82ge(PG_FUNCTION_ARGS);
+extern Datum int2and(PG_FUNCTION_ARGS);
+extern Datum int2or(PG_FUNCTION_ARGS);
+extern Datum int2xor(PG_FUNCTION_ARGS);
+extern Datum int2not(PG_FUNCTION_ARGS);
+extern Datum int2shl(PG_FUNCTION_ARGS);
+extern Datum int2shr(PG_FUNCTION_ARGS);
+extern Datum int4and(PG_FUNCTION_ARGS);
+extern Datum int4or(PG_FUNCTION_ARGS);
+extern Datum int4xor(PG_FUNCTION_ARGS);
+extern Datum int4not(PG_FUNCTION_ARGS);
+extern Datum int4shl(PG_FUNCTION_ARGS);
+extern Datum int4shr(PG_FUNCTION_ARGS);
+extern Datum int8and(PG_FUNCTION_ARGS);
+extern Datum int8or(PG_FUNCTION_ARGS);
+extern Datum int8xor(PG_FUNCTION_ARGS);
+extern Datum int8not(PG_FUNCTION_ARGS);
+extern Datum int8shl(PG_FUNCTION_ARGS);
+extern Datum int8shr(PG_FUNCTION_ARGS);
+extern Datum int8up(PG_FUNCTION_ARGS);
+extern Datum int2up(PG_FUNCTION_ARGS);
+extern Datum int4up(PG_FUNCTION_ARGS);
+extern Datum float4up(PG_FUNCTION_ARGS);
+extern Datum float8up(PG_FUNCTION_ARGS);
+extern Datum numeric_uplus(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_table_privilege_id(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_returned(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
+extern Datum binary_encode(PG_FUNCTION_ARGS);
+extern Datum binary_decode(PG_FUNCTION_ARGS);
+extern Datum byteaeq(PG_FUNCTION_ARGS);
+extern Datum bytealt(PG_FUNCTION_ARGS);
+extern Datum byteale(PG_FUNCTION_ARGS);
+extern Datum byteagt(PG_FUNCTION_ARGS);
+extern Datum byteage(PG_FUNCTION_ARGS);
+extern Datum byteane(PG_FUNCTION_ARGS);
+extern Datum byteacmp(PG_FUNCTION_ARGS);
+extern Datum timestamp_scale(PG_FUNCTION_ARGS);
+extern Datum int2_avg_accum(PG_FUNCTION_ARGS);
+extern Datum int4_avg_accum(PG_FUNCTION_ARGS);
+extern Datum int8_avg(PG_FUNCTION_ARGS);
+extern Datum oidlarger(PG_FUNCTION_ARGS);
+extern Datum oidsmaller(PG_FUNCTION_ARGS);
+extern Datum timestamptz_scale(PG_FUNCTION_ARGS);
+extern Datum time_scale(PG_FUNCTION_ARGS);
+extern Datum timetz_scale(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS);
+extern Datum numeric_div_trunc(PG_FUNCTION_ARGS);
+extern Datum similar_to_escape_2(PG_FUNCTION_ARGS);
+extern Datum similar_to_escape_1(PG_FUNCTION_ARGS);
+extern Datum bytealike(PG_FUNCTION_ARGS);
+extern Datum byteanlike(PG_FUNCTION_ARGS);
+extern Datum like_escape_bytea(PG_FUNCTION_ARGS);
+extern Datum byteacat(PG_FUNCTION_ARGS);
+extern Datum bytea_substr(PG_FUNCTION_ARGS);
+extern Datum bytea_substr_no_len(PG_FUNCTION_ARGS);
+extern Datum byteapos(PG_FUNCTION_ARGS);
+extern Datum byteatrim(PG_FUNCTION_ARGS);
+extern Datum timestamptz_time(PG_FUNCTION_ARGS);
+extern Datum timestamp_trunc(PG_FUNCTION_ARGS);
+extern Datum timestamp_part(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_activity(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query_first_tz(PG_FUNCTION_ARGS);
+extern Datum date_timestamp(PG_FUNCTION_ARGS);
+extern Datum pg_backend_pid(PG_FUNCTION_ARGS);
+extern Datum timestamptz_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamp_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_date(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_match_tz(PG_FUNCTION_ARGS);
+extern Datum timestamp_pl_interval(PG_FUNCTION_ARGS);
+extern Datum timestamp_mi_interval(PG_FUNCTION_ARGS);
+extern Datum pg_conf_load_time(PG_FUNCTION_ARGS);
+extern Datum timetz_zone(PG_FUNCTION_ARGS);
+extern Datum timetz_izone(PG_FUNCTION_ARGS);
+extern Datum timestamp_hash(PG_FUNCTION_ARGS);
+extern Datum timetz_time(PG_FUNCTION_ARGS);
+extern Datum time_timetz(PG_FUNCTION_ARGS);
+extern Datum timestamp_to_char(PG_FUNCTION_ARGS);
+extern Datum timestamp_age(PG_FUNCTION_ARGS);
+extern Datum timestamp_zone(PG_FUNCTION_ARGS);
+extern Datum timestamp_izone(PG_FUNCTION_ARGS);
+extern Datum date_pl_interval(PG_FUNCTION_ARGS);
+extern Datum date_mi_interval(PG_FUNCTION_ARGS);
+extern Datum textregexsubstr(PG_FUNCTION_ARGS);
+extern Datum bitfromint8(PG_FUNCTION_ARGS);
+extern Datum bittoint8(PG_FUNCTION_ARGS);
+extern Datum show_config_by_name(PG_FUNCTION_ARGS);
+extern Datum set_config_by_name(PG_FUNCTION_ARGS);
+extern Datum pg_table_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_type_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_function_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_operator_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_opclass_is_visible(PG_FUNCTION_ARGS);
+extern Datum show_all_settings(PG_FUNCTION_ARGS);
+extern Datum replace_text(PG_FUNCTION_ARGS);
+extern Datum split_part(PG_FUNCTION_ARGS);
+extern Datum to_hex32(PG_FUNCTION_ARGS);
+extern Datum to_hex64(PG_FUNCTION_ARGS);
+extern Datum array_lower(PG_FUNCTION_ARGS);
+extern Datum array_upper(PG_FUNCTION_ARGS);
+extern Datum pg_conversion_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);
+extern Datum pg_terminate_backend(PG_FUNCTION_ARGS);
+extern Datum pg_get_functiondef(PG_FUNCTION_ARGS);
+extern Datum pg_column_compression(PG_FUNCTION_ARGS);
+extern Datum pg_stat_force_next_flush(PG_FUNCTION_ARGS);
+extern Datum text_pattern_lt(PG_FUNCTION_ARGS);
+extern Datum text_pattern_le(PG_FUNCTION_ARGS);
+extern Datum pg_get_function_arguments(PG_FUNCTION_ARGS);
+extern Datum text_pattern_ge(PG_FUNCTION_ARGS);
+extern Datum text_pattern_gt(PG_FUNCTION_ARGS);
+extern Datum pg_get_function_result(PG_FUNCTION_ARGS);
+extern Datum bttext_pattern_cmp(PG_FUNCTION_ARGS);
+extern Datum pg_database_size_name(PG_FUNCTION_ARGS);
+extern Datum width_bucket_numeric(PG_FUNCTION_ARGS);
+extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);
+extern Datum pg_backup_start(PG_FUNCTION_ARGS);
+extern Datum bpchar_pattern_lt(PG_FUNCTION_ARGS);
+extern Datum bpchar_pattern_le(PG_FUNCTION_ARGS);
+extern Datum array_length(PG_FUNCTION_ARGS);
+extern Datum bpchar_pattern_ge(PG_FUNCTION_ARGS);
+extern Datum bpchar_pattern_gt(PG_FUNCTION_ARGS);
+extern Datum gist_point_consistent(PG_FUNCTION_ARGS);
+extern Datum btbpchar_pattern_cmp(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_sequence_privilege_id(PG_FUNCTION_ARGS);
+extern Datum btint48cmp(PG_FUNCTION_ARGS);
+extern Datum btint84cmp(PG_FUNCTION_ARGS);
+extern Datum btint24cmp(PG_FUNCTION_ARGS);
+extern Datum btint42cmp(PG_FUNCTION_ARGS);
+extern Datum btint28cmp(PG_FUNCTION_ARGS);
+extern Datum btint82cmp(PG_FUNCTION_ARGS);
+extern Datum btfloat48cmp(PG_FUNCTION_ARGS);
+extern Datum btfloat84cmp(PG_FUNCTION_ARGS);
+extern Datum inet_client_addr(PG_FUNCTION_ARGS);
+extern Datum inet_client_port(PG_FUNCTION_ARGS);
+extern Datum inet_server_addr(PG_FUNCTION_ARGS);
+extern Datum inet_server_port(PG_FUNCTION_ARGS);
+extern Datum regprocedurein(PG_FUNCTION_ARGS);
+extern Datum regprocedureout(PG_FUNCTION_ARGS);
+extern Datum regoperin(PG_FUNCTION_ARGS);
+extern Datum regoperout(PG_FUNCTION_ARGS);
+extern Datum regoperatorin(PG_FUNCTION_ARGS);
+extern Datum regoperatorout(PG_FUNCTION_ARGS);
+extern Datum regclassin(PG_FUNCTION_ARGS);
+extern Datum regclassout(PG_FUNCTION_ARGS);
+extern Datum regtypein(PG_FUNCTION_ARGS);
+extern Datum regtypeout(PG_FUNCTION_ARGS);
+extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);
+extern Datum pg_get_function_identity_arguments(PG_FUNCTION_ARGS);
+extern Datum hashtid(PG_FUNCTION_ARGS);
+extern Datum hashtidextended(PG_FUNCTION_ARGS);
+extern Datum fmgr_internal_validator(PG_FUNCTION_ARGS);
+extern Datum fmgr_c_validator(PG_FUNCTION_ARGS);
+extern Datum fmgr_sql_validator(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_database_privilege_id(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_function_privilege_id(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_language_privilege_id(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_schema_privilege_id(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset(PG_FUNCTION_ARGS);
+extern Datum pg_get_backend_memory_contexts(PG_FUNCTION_ARGS);
+extern Datum textregexreplace_noopt(PG_FUNCTION_ARGS);
+extern Datum textregexreplace(PG_FUNCTION_ARGS);
+extern Datum pg_total_relation_size(PG_FUNCTION_ARGS);
+extern Datum pg_size_pretty(PG_FUNCTION_ARGS);
+extern Datum pg_options_to_table(PG_FUNCTION_ARGS);
+extern Datum record_in(PG_FUNCTION_ARGS);
+extern Datum record_out(PG_FUNCTION_ARGS);
+extern Datum cstring_in(PG_FUNCTION_ARGS);
+extern Datum cstring_out(PG_FUNCTION_ARGS);
+extern Datum any_in(PG_FUNCTION_ARGS);
+extern Datum any_out(PG_FUNCTION_ARGS);
+extern Datum anyarray_in(PG_FUNCTION_ARGS);
+extern Datum anyarray_out(PG_FUNCTION_ARGS);
+extern Datum void_in(PG_FUNCTION_ARGS);
+extern Datum void_out(PG_FUNCTION_ARGS);
+extern Datum trigger_in(PG_FUNCTION_ARGS);
+extern Datum trigger_out(PG_FUNCTION_ARGS);
+extern Datum language_handler_in(PG_FUNCTION_ARGS);
+extern Datum language_handler_out(PG_FUNCTION_ARGS);
+extern Datum internal_in(PG_FUNCTION_ARGS);
+extern Datum internal_out(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_slru(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_slru(PG_FUNCTION_ARGS);
+extern Datum dceil(PG_FUNCTION_ARGS);
+extern Datum dfloor(PG_FUNCTION_ARGS);
+extern Datum dsign(PG_FUNCTION_ARGS);
+extern Datum md5_text(PG_FUNCTION_ARGS);
+extern Datum anyelement_in(PG_FUNCTION_ARGS);
+extern Datum anyelement_out(PG_FUNCTION_ARGS);
+extern Datum postgresql_fdw_validator(PG_FUNCTION_ARGS);
+extern Datum pg_encoding_max_length_sql(PG_FUNCTION_ARGS);
+extern Datum md5_bytea(PG_FUNCTION_ARGS);
+extern Datum pg_tablespace_size_oid(PG_FUNCTION_ARGS);
+extern Datum pg_tablespace_size_name(PG_FUNCTION_ARGS);
+extern Datum pg_database_size_oid(PG_FUNCTION_ARGS);
+extern Datum array_unnest(PG_FUNCTION_ARGS);
+extern Datum pg_relation_size(PG_FUNCTION_ARGS);
+extern Datum array_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum array_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum date_lt_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_le_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_eq_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_gt_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_ge_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_ne_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_cmp_timestamp(PG_FUNCTION_ARGS);
+extern Datum date_lt_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_le_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_eq_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_gt_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_ge_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_ne_timestamptz(PG_FUNCTION_ARGS);
+extern Datum date_cmp_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_lt_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_le_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_eq_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_gt_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_ge_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_ne_date(PG_FUNCTION_ARGS);
+extern Datum timestamp_cmp_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_lt_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_le_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_eq_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_gt_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_ge_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_ne_date(PG_FUNCTION_ARGS);
+extern Datum timestamptz_cmp_date(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_tablespace_privilege_id(PG_FUNCTION_ARGS);
+extern Datum shell_in(PG_FUNCTION_ARGS);
+extern Datum shell_out(PG_FUNCTION_ARGS);
+extern Datum array_recv(PG_FUNCTION_ARGS);
+extern Datum array_send(PG_FUNCTION_ARGS);
+extern Datum record_recv(PG_FUNCTION_ARGS);
+extern Datum record_send(PG_FUNCTION_ARGS);
+extern Datum int2recv(PG_FUNCTION_ARGS);
+extern Datum int2send(PG_FUNCTION_ARGS);
+extern Datum int4recv(PG_FUNCTION_ARGS);
+extern Datum int4send(PG_FUNCTION_ARGS);
+extern Datum int8recv(PG_FUNCTION_ARGS);
+extern Datum int8send(PG_FUNCTION_ARGS);
+extern Datum int2vectorrecv(PG_FUNCTION_ARGS);
+extern Datum int2vectorsend(PG_FUNCTION_ARGS);
+extern Datum bytearecv(PG_FUNCTION_ARGS);
+extern Datum byteasend(PG_FUNCTION_ARGS);
+extern Datum textrecv(PG_FUNCTION_ARGS);
+extern Datum textsend(PG_FUNCTION_ARGS);
+extern Datum unknownrecv(PG_FUNCTION_ARGS);
+extern Datum unknownsend(PG_FUNCTION_ARGS);
+extern Datum oidrecv(PG_FUNCTION_ARGS);
+extern Datum oidsend(PG_FUNCTION_ARGS);
+extern Datum oidvectorrecv(PG_FUNCTION_ARGS);
+extern Datum oidvectorsend(PG_FUNCTION_ARGS);
+extern Datum namerecv(PG_FUNCTION_ARGS);
+extern Datum namesend(PG_FUNCTION_ARGS);
+extern Datum float4recv(PG_FUNCTION_ARGS);
+extern Datum float4send(PG_FUNCTION_ARGS);
+extern Datum float8recv(PG_FUNCTION_ARGS);
+extern Datum float8send(PG_FUNCTION_ARGS);
+extern Datum point_recv(PG_FUNCTION_ARGS);
+extern Datum point_send(PG_FUNCTION_ARGS);
+extern Datum bpcharrecv(PG_FUNCTION_ARGS);
+extern Datum bpcharsend(PG_FUNCTION_ARGS);
+extern Datum varcharrecv(PG_FUNCTION_ARGS);
+extern Datum varcharsend(PG_FUNCTION_ARGS);
+extern Datum charrecv(PG_FUNCTION_ARGS);
+extern Datum charsend(PG_FUNCTION_ARGS);
+extern Datum boolrecv(PG_FUNCTION_ARGS);
+extern Datum boolsend(PG_FUNCTION_ARGS);
+extern Datum tidrecv(PG_FUNCTION_ARGS);
+extern Datum tidsend(PG_FUNCTION_ARGS);
+extern Datum xidrecv(PG_FUNCTION_ARGS);
+extern Datum xidsend(PG_FUNCTION_ARGS);
+extern Datum cidrecv(PG_FUNCTION_ARGS);
+extern Datum cidsend(PG_FUNCTION_ARGS);
+extern Datum regprocrecv(PG_FUNCTION_ARGS);
+extern Datum regprocsend(PG_FUNCTION_ARGS);
+extern Datum regprocedurerecv(PG_FUNCTION_ARGS);
+extern Datum regproceduresend(PG_FUNCTION_ARGS);
+extern Datum regoperrecv(PG_FUNCTION_ARGS);
+extern Datum regopersend(PG_FUNCTION_ARGS);
+extern Datum regoperatorrecv(PG_FUNCTION_ARGS);
+extern Datum regoperatorsend(PG_FUNCTION_ARGS);
+extern Datum regclassrecv(PG_FUNCTION_ARGS);
+extern Datum regclasssend(PG_FUNCTION_ARGS);
+extern Datum regtyperecv(PG_FUNCTION_ARGS);
+extern Datum regtypesend(PG_FUNCTION_ARGS);
+extern Datum bit_recv(PG_FUNCTION_ARGS);
+extern Datum bit_send(PG_FUNCTION_ARGS);
+extern Datum varbit_recv(PG_FUNCTION_ARGS);
+extern Datum varbit_send(PG_FUNCTION_ARGS);
+extern Datum numeric_recv(PG_FUNCTION_ARGS);
+extern Datum numeric_send(PG_FUNCTION_ARGS);
+extern Datum dsinh(PG_FUNCTION_ARGS);
+extern Datum dcosh(PG_FUNCTION_ARGS);
+extern Datum dtanh(PG_FUNCTION_ARGS);
+extern Datum dasinh(PG_FUNCTION_ARGS);
+extern Datum dacosh(PG_FUNCTION_ARGS);
+extern Datum datanh(PG_FUNCTION_ARGS);
+extern Datum date_recv(PG_FUNCTION_ARGS);
+extern Datum date_send(PG_FUNCTION_ARGS);
+extern Datum time_recv(PG_FUNCTION_ARGS);
+extern Datum time_send(PG_FUNCTION_ARGS);
+extern Datum timetz_recv(PG_FUNCTION_ARGS);
+extern Datum timetz_send(PG_FUNCTION_ARGS);
+extern Datum timestamp_recv(PG_FUNCTION_ARGS);
+extern Datum timestamp_send(PG_FUNCTION_ARGS);
+extern Datum timestamptz_recv(PG_FUNCTION_ARGS);
+extern Datum timestamptz_send(PG_FUNCTION_ARGS);
+extern Datum interval_recv(PG_FUNCTION_ARGS);
+extern Datum interval_send(PG_FUNCTION_ARGS);
+extern Datum lseg_recv(PG_FUNCTION_ARGS);
+extern Datum lseg_send(PG_FUNCTION_ARGS);
+extern Datum path_recv(PG_FUNCTION_ARGS);
+extern Datum path_send(PG_FUNCTION_ARGS);
+extern Datum box_recv(PG_FUNCTION_ARGS);
+extern Datum box_send(PG_FUNCTION_ARGS);
+extern Datum poly_recv(PG_FUNCTION_ARGS);
+extern Datum poly_send(PG_FUNCTION_ARGS);
+extern Datum line_recv(PG_FUNCTION_ARGS);
+extern Datum line_send(PG_FUNCTION_ARGS);
+extern Datum circle_recv(PG_FUNCTION_ARGS);
+extern Datum circle_send(PG_FUNCTION_ARGS);
+extern Datum cash_recv(PG_FUNCTION_ARGS);
+extern Datum cash_send(PG_FUNCTION_ARGS);
+extern Datum macaddr_recv(PG_FUNCTION_ARGS);
+extern Datum macaddr_send(PG_FUNCTION_ARGS);
+extern Datum inet_recv(PG_FUNCTION_ARGS);
+extern Datum inet_send(PG_FUNCTION_ARGS);
+extern Datum cidr_recv(PG_FUNCTION_ARGS);
+extern Datum cidr_send(PG_FUNCTION_ARGS);
+extern Datum cstring_recv(PG_FUNCTION_ARGS);
+extern Datum cstring_send(PG_FUNCTION_ARGS);
+extern Datum anyarray_recv(PG_FUNCTION_ARGS);
+extern Datum anyarray_send(PG_FUNCTION_ARGS);
+extern Datum pg_get_ruledef_ext(PG_FUNCTION_ARGS);
+extern Datum pg_get_viewdef_name_ext(PG_FUNCTION_ARGS);
+extern Datum pg_get_viewdef_ext(PG_FUNCTION_ARGS);
+extern Datum pg_get_indexdef_ext(PG_FUNCTION_ARGS);
+extern Datum pg_get_constraintdef_ext(PG_FUNCTION_ARGS);
+extern Datum pg_get_expr_ext(PG_FUNCTION_ARGS);
+extern Datum pg_prepared_statement(PG_FUNCTION_ARGS);
+extern Datum pg_cursor(PG_FUNCTION_ARGS);
+extern Datum float8_var_pop(PG_FUNCTION_ARGS);
+extern Datum float8_stddev_pop(PG_FUNCTION_ARGS);
+extern Datum numeric_var_pop(PG_FUNCTION_ARGS);
+extern Datum booland_statefunc(PG_FUNCTION_ARGS);
+extern Datum boolor_statefunc(PG_FUNCTION_ARGS);
+extern Datum timestamp_lt_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_le_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_eq_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_gt_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_ge_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_ne_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamp_cmp_timestamptz(PG_FUNCTION_ARGS);
+extern Datum timestamptz_lt_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_le_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_eq_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_gt_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_ge_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_ne_timestamp(PG_FUNCTION_ARGS);
+extern Datum timestamptz_cmp_timestamp(PG_FUNCTION_ARGS);
+extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);
+extern Datum int4_bool(PG_FUNCTION_ARGS);
+extern Datum bool_int4(PG_FUNCTION_ARGS);
+extern Datum lastval(PG_FUNCTION_ARGS);
+extern Datum pg_postmaster_start_time(PG_FUNCTION_ARGS);
+extern Datum pg_blocking_pids(PG_FUNCTION_ARGS);
+extern Datum box_below(PG_FUNCTION_ARGS);
+extern Datum box_overbelow(PG_FUNCTION_ARGS);
+extern Datum box_overabove(PG_FUNCTION_ARGS);
+extern Datum box_above(PG_FUNCTION_ARGS);
+extern Datum poly_below(PG_FUNCTION_ARGS);
+extern Datum poly_overbelow(PG_FUNCTION_ARGS);
+extern Datum poly_overabove(PG_FUNCTION_ARGS);
+extern Datum poly_above(PG_FUNCTION_ARGS);
+extern Datum gist_box_consistent(PG_FUNCTION_ARGS);
+extern Datum jsonb_float8(PG_FUNCTION_ARGS);
+extern Datum gist_box_penalty(PG_FUNCTION_ARGS);
+extern Datum gist_box_picksplit(PG_FUNCTION_ARGS);
+extern Datum gist_box_union(PG_FUNCTION_ARGS);
+extern Datum gist_box_same(PG_FUNCTION_ARGS);
+extern Datum gist_poly_consistent(PG_FUNCTION_ARGS);
+extern Datum gist_poly_compress(PG_FUNCTION_ARGS);
+extern Datum circle_overbelow(PG_FUNCTION_ARGS);
+extern Datum circle_overabove(PG_FUNCTION_ARGS);
+extern Datum gist_circle_consistent(PG_FUNCTION_ARGS);
+extern Datum gist_circle_compress(PG_FUNCTION_ARGS);
+extern Datum numeric_stddev_pop(PG_FUNCTION_ARGS);
+extern Datum domain_in(PG_FUNCTION_ARGS);
+extern Datum domain_recv(PG_FUNCTION_ARGS);
+extern Datum pg_timezone_abbrevs(PG_FUNCTION_ARGS);
+extern Datum xmlexists(PG_FUNCTION_ARGS);
+extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
+extern Datum pg_rotate_logfile_v2(PG_FUNCTION_ARGS);
+extern Datum pg_stat_file_1arg(PG_FUNCTION_ARGS);
+extern Datum pg_read_file_off_len(PG_FUNCTION_ARGS);
+extern Datum pg_ls_dir_1arg(PG_FUNCTION_ARGS);
+extern Datum pg_sleep(PG_FUNCTION_ARGS);
+extern Datum inetnot(PG_FUNCTION_ARGS);
+extern Datum inetand(PG_FUNCTION_ARGS);
+extern Datum inetor(PG_FUNCTION_ARGS);
+extern Datum inetpl(PG_FUNCTION_ARGS);
+extern Datum inetmi_int8(PG_FUNCTION_ARGS);
+extern Datum inetmi(PG_FUNCTION_ARGS);
+extern Datum statement_timestamp(PG_FUNCTION_ARGS);
+extern Datum clock_timestamp(PG_FUNCTION_ARGS);
+extern Datum gin_cmp_prefix(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_name_name(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_name_id(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_id_name(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_id_id(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_name(PG_FUNCTION_ARGS);
+extern Datum pg_has_role_id(PG_FUNCTION_ARGS);
+extern Datum interval_justify_interval(PG_FUNCTION_ARGS);
+extern Datum pg_get_triggerdef_ext(PG_FUNCTION_ARGS);
+extern Datum dasind(PG_FUNCTION_ARGS);
+extern Datum dacosd(PG_FUNCTION_ARGS);
+extern Datum datand(PG_FUNCTION_ARGS);
+extern Datum datan2d(PG_FUNCTION_ARGS);
+extern Datum dsind(PG_FUNCTION_ARGS);
+extern Datum dcosd(PG_FUNCTION_ARGS);
+extern Datum dtand(PG_FUNCTION_ARGS);
+extern Datum dcotd(PG_FUNCTION_ARGS);
+extern Datum pg_backup_stop(PG_FUNCTION_ARGS);
+extern Datum numeric_avg_serialize(PG_FUNCTION_ARGS);
+extern Datum numeric_avg_deserialize(PG_FUNCTION_ARGS);
+extern Datum ginarrayextract(PG_FUNCTION_ARGS);
+extern Datum ginarrayconsistent(PG_FUNCTION_ARGS);
+extern Datum int8_avg_accum(PG_FUNCTION_ARGS);
+extern Datum arrayoverlap(PG_FUNCTION_ARGS);
+extern Datum arraycontains(PG_FUNCTION_ARGS);
+extern Datum arraycontained(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS);
+extern Datum regexp_matches_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_matches(PG_FUNCTION_ARGS);
+extern Datum regexp_split_to_table_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_split_to_table(PG_FUNCTION_ARGS);
+extern Datum regexp_split_to_array_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_split_to_array(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS);
+extern Datum ginqueryarrayextract(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);
+extern Datum anynonarray_in(PG_FUNCTION_ARGS);
+extern Datum anynonarray_out(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
+extern Datum int8_avg_combine(PG_FUNCTION_ARGS);
+extern Datum int8_avg_serialize(PG_FUNCTION_ARGS);
+extern Datum int8_avg_deserialize(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_wait_event_type(PG_FUNCTION_ARGS);
+extern Datum tidgt(PG_FUNCTION_ARGS);
+extern Datum tidlt(PG_FUNCTION_ARGS);
+extern Datum tidge(PG_FUNCTION_ARGS);
+extern Datum tidle(PG_FUNCTION_ARGS);
+extern Datum bttidcmp(PG_FUNCTION_ARGS);
+extern Datum tidlarger(PG_FUNCTION_ARGS);
+extern Datum tidsmaller(PG_FUNCTION_ARGS);
+extern Datum int8inc_any(PG_FUNCTION_ARGS);
+extern Datum int8inc_float8_float8(PG_FUNCTION_ARGS);
+extern Datum float8_regr_accum(PG_FUNCTION_ARGS);
+extern Datum float8_regr_sxx(PG_FUNCTION_ARGS);
+extern Datum float8_regr_syy(PG_FUNCTION_ARGS);
+extern Datum float8_regr_sxy(PG_FUNCTION_ARGS);
+extern Datum float8_regr_avgx(PG_FUNCTION_ARGS);
+extern Datum float8_regr_avgy(PG_FUNCTION_ARGS);
+extern Datum float8_regr_r2(PG_FUNCTION_ARGS);
+extern Datum float8_regr_slope(PG_FUNCTION_ARGS);
+extern Datum float8_regr_intercept(PG_FUNCTION_ARGS);
+extern Datum float8_covar_pop(PG_FUNCTION_ARGS);
+extern Datum float8_covar_samp(PG_FUNCTION_ARGS);
+extern Datum float8_corr(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_blk_read_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_blk_write_time(PG_FUNCTION_ARGS);
+extern Datum pg_switch_wal(PG_FUNCTION_ARGS);
+extern Datum pg_current_wal_lsn(PG_FUNCTION_ARGS);
+extern Datum pg_walfile_name_offset(PG_FUNCTION_ARGS);
+extern Datum pg_walfile_name(PG_FUNCTION_ARGS);
+extern Datum pg_current_wal_insert_lsn(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_wait_event(PG_FUNCTION_ARGS);
+extern Datum pg_my_temp_schema(PG_FUNCTION_ARGS);
+extern Datum pg_is_other_temp_schema(PG_FUNCTION_ARGS);
+extern Datum pg_timezone_names(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS);
+extern Datum numeric_avg_accum(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_lock_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_lock_shared_int8(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_lock_int8(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_lock_shared_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_unlock_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_unlock_shared_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_lock_int4(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_lock_shared_int4(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_lock_int4(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_lock_shared_int4(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_unlock_int4(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_unlock_shared_int4(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_unlock_all(PG_FUNCTION_ARGS);
+extern Datum xml_in(PG_FUNCTION_ARGS);
+extern Datum xml_out(PG_FUNCTION_ARGS);
+extern Datum xmlcomment(PG_FUNCTION_ARGS);
+extern Datum texttoxml(PG_FUNCTION_ARGS);
+extern Datum xmlvalidate(PG_FUNCTION_ARGS);
+extern Datum xml_recv(PG_FUNCTION_ARGS);
+extern Datum xml_send(PG_FUNCTION_ARGS);
+extern Datum xmlconcat2(PG_FUNCTION_ARGS);
+extern Datum varbittypmodin(PG_FUNCTION_ARGS);
+extern Datum intervaltypmodin(PG_FUNCTION_ARGS);
+extern Datum intervaltypmodout(PG_FUNCTION_ARGS);
+extern Datum timestamptypmodin(PG_FUNCTION_ARGS);
+extern Datum timestamptypmodout(PG_FUNCTION_ARGS);
+extern Datum timestamptztypmodin(PG_FUNCTION_ARGS);
+extern Datum timestamptztypmodout(PG_FUNCTION_ARGS);
+extern Datum timetypmodin(PG_FUNCTION_ARGS);
+extern Datum timetypmodout(PG_FUNCTION_ARGS);
+extern Datum timetztypmodin(PG_FUNCTION_ARGS);
+extern Datum timetztypmodout(PG_FUNCTION_ARGS);
+extern Datum bpchartypmodin(PG_FUNCTION_ARGS);
+extern Datum bpchartypmodout(PG_FUNCTION_ARGS);
+extern Datum varchartypmodin(PG_FUNCTION_ARGS);
+extern Datum varchartypmodout(PG_FUNCTION_ARGS);
+extern Datum numerictypmodin(PG_FUNCTION_ARGS);
+extern Datum numerictypmodout(PG_FUNCTION_ARGS);
+extern Datum bittypmodin(PG_FUNCTION_ARGS);
+extern Datum bittypmodout(PG_FUNCTION_ARGS);
+extern Datum varbittypmodout(PG_FUNCTION_ARGS);
+extern Datum xmltotext(PG_FUNCTION_ARGS);
+extern Datum table_to_xml(PG_FUNCTION_ARGS);
+extern Datum query_to_xml(PG_FUNCTION_ARGS);
+extern Datum cursor_to_xml(PG_FUNCTION_ARGS);
+extern Datum table_to_xmlschema(PG_FUNCTION_ARGS);
+extern Datum query_to_xmlschema(PG_FUNCTION_ARGS);
+extern Datum cursor_to_xmlschema(PG_FUNCTION_ARGS);
+extern Datum table_to_xml_and_xmlschema(PG_FUNCTION_ARGS);
+extern Datum query_to_xml_and_xmlschema(PG_FUNCTION_ARGS);
+extern Datum xpath(PG_FUNCTION_ARGS);
+extern Datum schema_to_xml(PG_FUNCTION_ARGS);
+extern Datum schema_to_xmlschema(PG_FUNCTION_ARGS);
+extern Datum schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS);
+extern Datum database_to_xml(PG_FUNCTION_ARGS);
+extern Datum database_to_xmlschema(PG_FUNCTION_ARGS);
+extern Datum database_to_xml_and_xmlschema(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_in(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_out(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_recv(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_send(PG_FUNCTION_ARGS);
+extern Datum pg_current_xact_id(PG_FUNCTION_ARGS);
+extern Datum pg_current_snapshot(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_xmin(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_xmax(PG_FUNCTION_ARGS);
+extern Datum pg_snapshot_xip(PG_FUNCTION_ARGS);
+extern Datum pg_visible_in_snapshot(PG_FUNCTION_ARGS);
+extern Datum uuid_in(PG_FUNCTION_ARGS);
+extern Datum uuid_out(PG_FUNCTION_ARGS);
+extern Datum uuid_lt(PG_FUNCTION_ARGS);
+extern Datum uuid_le(PG_FUNCTION_ARGS);
+extern Datum uuid_eq(PG_FUNCTION_ARGS);
+extern Datum uuid_ge(PG_FUNCTION_ARGS);
+extern Datum uuid_gt(PG_FUNCTION_ARGS);
+extern Datum uuid_ne(PG_FUNCTION_ARGS);
+extern Datum uuid_cmp(PG_FUNCTION_ARGS);
+extern Datum uuid_recv(PG_FUNCTION_ARGS);
+extern Datum uuid_send(PG_FUNCTION_ARGS);
+extern Datum uuid_hash(PG_FUNCTION_ARGS);
+extern Datum booltext(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_function_total_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_function_self_time(PG_FUNCTION_ARGS);
+extern Datum record_eq(PG_FUNCTION_ARGS);
+extern Datum record_ne(PG_FUNCTION_ARGS);
+extern Datum record_lt(PG_FUNCTION_ARGS);
+extern Datum record_gt(PG_FUNCTION_ARGS);
+extern Datum record_le(PG_FUNCTION_ARGS);
+extern Datum record_ge(PG_FUNCTION_ARGS);
+extern Datum btrecordcmp(PG_FUNCTION_ARGS);
+extern Datum pg_table_size(PG_FUNCTION_ARGS);
+extern Datum pg_indexes_size(PG_FUNCTION_ARGS);
+extern Datum pg_relation_filenode(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_foreign_data_wrapper_privilege_id(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_server_privilege_id(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_name_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_id_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_name_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_name_attnum(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_id_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_id_attnum(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_name_attnum(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_column_privilege_id_attnum(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_any_column_privilege_id(PG_FUNCTION_ARGS);
+extern Datum bitoverlay(PG_FUNCTION_ARGS);
+extern Datum bitoverlay_no_len(PG_FUNCTION_ARGS);
+extern Datum bitgetbit(PG_FUNCTION_ARGS);
+extern Datum bitsetbit(PG_FUNCTION_ARGS);
+extern Datum pg_relation_filepath(PG_FUNCTION_ARGS);
+extern Datum pg_listening_channels(PG_FUNCTION_ARGS);
+extern Datum pg_notify(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_numscans(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_returned(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_tuples_hot_updated(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_blocks_fetched(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_blocks_hit(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS);
+extern Datum xpath_exists(PG_FUNCTION_ARGS);
+extern Datum xml_is_well_formed(PG_FUNCTION_ARGS);
+extern Datum xml_is_well_formed_document(PG_FUNCTION_ARGS);
+extern Datum xml_is_well_formed_content(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_vacuum_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_analyze_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS);
+extern Datum text_concat(PG_FUNCTION_ARGS);
+extern Datum text_concat_ws(PG_FUNCTION_ARGS);
+extern Datum text_left(PG_FUNCTION_ARGS);
+extern Datum text_right(PG_FUNCTION_ARGS);
+extern Datum text_reverse(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS);
+extern Datum gist_point_distance(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_tablespace(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_lock(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_snapshot(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_bufferpin(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_startup_deadlock(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_conflict_all(PG_FUNCTION_ARGS);
+extern Datum pg_wal_replay_pause(PG_FUNCTION_ARGS);
+extern Datum pg_wal_replay_resume(PG_FUNCTION_ARGS);
+extern Datum pg_is_wal_replay_paused(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_stat_reset_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS);
+extern Datum ginarrayextract_2args(PG_FUNCTION_ARGS);
+extern Datum gin_extract_tsvector_2args(PG_FUNCTION_ARGS);
+extern Datum pg_sequence_parameters(PG_FUNCTION_ARGS);
+extern Datum pg_available_extensions(PG_FUNCTION_ARGS);
+extern Datum pg_available_extension_versions(PG_FUNCTION_ARGS);
+extern Datum pg_extension_update_paths(PG_FUNCTION_ARGS);
+extern Datum pg_extension_config_dump(PG_FUNCTION_ARGS);
+extern Datum gin_extract_tsquery_5args(PG_FUNCTION_ARGS);
+extern Datum gin_tsquery_consistent_6args(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_xact_lock_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_xact_lock_int8(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_xact_lock_int4(PG_FUNCTION_ARGS);
+extern Datum pg_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_xact_lock_int4(PG_FUNCTION_ARGS);
+extern Datum pg_try_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS);
+extern Datum varchar_support(PG_FUNCTION_ARGS);
+extern Datum pg_create_restore_point(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_wal_senders(PG_FUNCTION_ARGS);
+extern Datum window_row_number(PG_FUNCTION_ARGS);
+extern Datum window_rank(PG_FUNCTION_ARGS);
+extern Datum window_dense_rank(PG_FUNCTION_ARGS);
+extern Datum window_percent_rank(PG_FUNCTION_ARGS);
+extern Datum window_cume_dist(PG_FUNCTION_ARGS);
+extern Datum window_ntile(PG_FUNCTION_ARGS);
+extern Datum window_lag(PG_FUNCTION_ARGS);
+extern Datum window_lag_with_offset(PG_FUNCTION_ARGS);
+extern Datum window_lag_with_offset_and_default(PG_FUNCTION_ARGS);
+extern Datum window_lead(PG_FUNCTION_ARGS);
+extern Datum window_lead_with_offset(PG_FUNCTION_ARGS);
+extern Datum window_lead_with_offset_and_default(PG_FUNCTION_ARGS);
+extern Datum window_first_value(PG_FUNCTION_ARGS);
+extern Datum window_last_value(PG_FUNCTION_ARGS);
+extern Datum window_nth_value(PG_FUNCTION_ARGS);
+extern Datum fdw_handler_in(PG_FUNCTION_ARGS);
+extern Datum fdw_handler_out(PG_FUNCTION_ARGS);
+extern Datum void_recv(PG_FUNCTION_ARGS);
+extern Datum void_send(PG_FUNCTION_ARGS);
+extern Datum btint2sortsupport(PG_FUNCTION_ARGS);
+extern Datum btint4sortsupport(PG_FUNCTION_ARGS);
+extern Datum btint8sortsupport(PG_FUNCTION_ARGS);
+extern Datum btfloat4sortsupport(PG_FUNCTION_ARGS);
+extern Datum btfloat8sortsupport(PG_FUNCTION_ARGS);
+extern Datum btoidsortsupport(PG_FUNCTION_ARGS);
+extern Datum btnamesortsupport(PG_FUNCTION_ARGS);
+extern Datum date_sortsupport(PG_FUNCTION_ARGS);
+extern Datum timestamp_sortsupport(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_name_id(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_id_id(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_name(PG_FUNCTION_ARGS);
+extern Datum has_type_privilege_id(PG_FUNCTION_ARGS);
+extern Datum macaddr_not(PG_FUNCTION_ARGS);
+extern Datum macaddr_and(PG_FUNCTION_ARGS);
+extern Datum macaddr_or(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_temp_files(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_temp_bytes(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_deadlocks(PG_FUNCTION_ARGS);
+extern Datum array_to_json(PG_FUNCTION_ARGS);
+extern Datum array_to_json_pretty(PG_FUNCTION_ARGS);
+extern Datum row_to_json(PG_FUNCTION_ARGS);
+extern Datum row_to_json_pretty(PG_FUNCTION_ARGS);
+extern Datum numeric_support(PG_FUNCTION_ARGS);
+extern Datum varbit_support(PG_FUNCTION_ARGS);
+extern Datum pg_get_viewdef_wrap(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS);
+extern Datum pg_collation_for(PG_FUNCTION_ARGS);
+extern Datum pg_trigger_depth(PG_FUNCTION_ARGS);
+extern Datum pg_wal_lsn_diff(PG_FUNCTION_ARGS);
+extern Datum pg_size_pretty_numeric(PG_FUNCTION_ARGS);
+extern Datum array_remove(PG_FUNCTION_ARGS);
+extern Datum array_replace(PG_FUNCTION_ARGS);
+extern Datum rangesel(PG_FUNCTION_ARGS);
+extern Datum be_lo_lseek64(PG_FUNCTION_ARGS);
+extern Datum be_lo_tell64(PG_FUNCTION_ARGS);
+extern Datum be_lo_truncate64(PG_FUNCTION_ARGS);
+extern Datum json_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum json_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum to_json(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS);
+extern Datum numeric_sum(PG_FUNCTION_ARGS);
+extern Datum array_cardinality(PG_FUNCTION_ARGS);
+extern Datum json_object_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum record_image_eq(PG_FUNCTION_ARGS);
+extern Datum record_image_ne(PG_FUNCTION_ARGS);
+extern Datum record_image_lt(PG_FUNCTION_ARGS);
+extern Datum record_image_gt(PG_FUNCTION_ARGS);
+extern Datum record_image_le(PG_FUNCTION_ARGS);
+extern Datum record_image_ge(PG_FUNCTION_ARGS);
+extern Datum btrecordimagecmp(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_archiver(PG_FUNCTION_ARGS);
+extern Datum json_object_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum json_build_array(PG_FUNCTION_ARGS);
+extern Datum json_build_array_noargs(PG_FUNCTION_ARGS);
+extern Datum json_build_object(PG_FUNCTION_ARGS);
+extern Datum json_build_object_noargs(PG_FUNCTION_ARGS);
+extern Datum json_object(PG_FUNCTION_ARGS);
+extern Datum json_object_two_arg(PG_FUNCTION_ARGS);
+extern Datum json_to_record(PG_FUNCTION_ARGS);
+extern Datum json_to_recordset(PG_FUNCTION_ARGS);
+extern Datum jsonb_array_length(PG_FUNCTION_ARGS);
+extern Datum jsonb_each(PG_FUNCTION_ARGS);
+extern Datum jsonb_populate_record(PG_FUNCTION_ARGS);
+extern Datum jsonb_typeof(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_field_text(PG_FUNCTION_ARGS);
+extern Datum jsonb_array_element(PG_FUNCTION_ARGS);
+extern Datum jsonb_array_element_text(PG_FUNCTION_ARGS);
+extern Datum jsonb_extract_path(PG_FUNCTION_ARGS);
+extern Datum width_bucket_array(PG_FUNCTION_ARGS);
+extern Datum jsonb_array_elements(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_in(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_out(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_lt(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_le(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_eq(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_ge(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_gt(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_ne(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_mi(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_recv(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_send(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_cmp(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_hash(PG_FUNCTION_ARGS);
+extern Datum bttextsortsupport(PG_FUNCTION_ARGS);
+extern Datum generate_series_step_numeric(PG_FUNCTION_ARGS);
+extern Datum generate_series_numeric(PG_FUNCTION_ARGS);
+extern Datum json_strip_nulls(PG_FUNCTION_ARGS);
+extern Datum jsonb_strip_nulls(PG_FUNCTION_ARGS);
+extern Datum jsonb_object(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_two_arg(PG_FUNCTION_ARGS);
+extern Datum jsonb_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum jsonb_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum jsonb_build_array(PG_FUNCTION_ARGS);
+extern Datum jsonb_build_array_noargs(PG_FUNCTION_ARGS);
+extern Datum jsonb_build_object(PG_FUNCTION_ARGS);
+extern Datum jsonb_build_object_noargs(PG_FUNCTION_ARGS);
+extern Datum dist_ppoly(PG_FUNCTION_ARGS);
+extern Datum array_position(PG_FUNCTION_ARGS);
+extern Datum array_position_start(PG_FUNCTION_ARGS);
+extern Datum array_positions(PG_FUNCTION_ARGS);
+extern Datum gist_circle_distance(PG_FUNCTION_ARGS);
+extern Datum numeric_scale(PG_FUNCTION_ARGS);
+extern Datum gist_point_fetch(PG_FUNCTION_ARGS);
+extern Datum numeric_sortsupport(PG_FUNCTION_ARGS);
+extern Datum gist_poly_distance(PG_FUNCTION_ARGS);
+extern Datum dist_cpoint(PG_FUNCTION_ARGS);
+extern Datum dist_polyp(PG_FUNCTION_ARGS);
+extern Datum pg_read_file_v2(PG_FUNCTION_ARGS);
+extern Datum show_config_by_name_missing_ok(PG_FUNCTION_ARGS);
+extern Datum pg_read_binary_file(PG_FUNCTION_ARGS);
+extern Datum pg_notification_queue_usage(PG_FUNCTION_ARGS);
+extern Datum pg_ls_dir(PG_FUNCTION_ARGS);
+extern Datum row_security_active(PG_FUNCTION_ARGS);
+extern Datum row_security_active_name(PG_FUNCTION_ARGS);
+extern Datum uuid_sortsupport(PG_FUNCTION_ARGS);
+extern Datum jsonb_concat(PG_FUNCTION_ARGS);
+extern Datum jsonb_delete(PG_FUNCTION_ARGS);
+extern Datum jsonb_delete_idx(PG_FUNCTION_ARGS);
+extern Datum jsonb_delete_path(PG_FUNCTION_ARGS);
+extern Datum jsonb_set(PG_FUNCTION_ARGS);
+extern Datum jsonb_pretty(PG_FUNCTION_ARGS);
+extern Datum pg_stat_file(PG_FUNCTION_ARGS);
+extern Datum xidneq(PG_FUNCTION_ARGS);
+extern Datum tsm_handler_in(PG_FUNCTION_ARGS);
+extern Datum tsm_handler_out(PG_FUNCTION_ARGS);
+extern Datum tsm_bernoulli_handler(PG_FUNCTION_ARGS);
+extern Datum tsm_system_handler(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_wal_receiver(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_progress_info(PG_FUNCTION_ARGS);
+extern Datum tsvector_filter(PG_FUNCTION_ARGS);
+extern Datum tsvector_setweight_by_filter(PG_FUNCTION_ARGS);
+extern Datum tsvector_delete_str(PG_FUNCTION_ARGS);
+extern Datum tsvector_unnest(PG_FUNCTION_ARGS);
+extern Datum tsvector_delete_arr(PG_FUNCTION_ARGS);
+extern Datum int4_avg_combine(PG_FUNCTION_ARGS);
+extern Datum interval_combine(PG_FUNCTION_ARGS);
+extern Datum tsvector_to_array(PG_FUNCTION_ARGS);
+extern Datum array_to_tsvector(PG_FUNCTION_ARGS);
+extern Datum bpchar_sortsupport(PG_FUNCTION_ARGS);
+extern Datum show_all_file_settings(PG_FUNCTION_ARGS);
+extern Datum pg_current_wal_flush_lsn(PG_FUNCTION_ARGS);
+extern Datum bytea_sortsupport(PG_FUNCTION_ARGS);
+extern Datum bttext_pattern_sortsupport(PG_FUNCTION_ARGS);
+extern Datum btbpchar_pattern_sortsupport(PG_FUNCTION_ARGS);
+extern Datum pg_size_bytes(PG_FUNCTION_ARGS);
+extern Datum numeric_serialize(PG_FUNCTION_ARGS);
+extern Datum numeric_deserialize(PG_FUNCTION_ARGS);
+extern Datum numeric_avg_combine(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_combine(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_serialize(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_deserialize(PG_FUNCTION_ARGS);
+extern Datum numeric_combine(PG_FUNCTION_ARGS);
+extern Datum float8_regr_combine(PG_FUNCTION_ARGS);
+extern Datum jsonb_delete_array(PG_FUNCTION_ARGS);
+extern Datum cash_mul_int8(PG_FUNCTION_ARGS);
+extern Datum cash_div_int8(PG_FUNCTION_ARGS);
+extern Datum pg_current_xact_id_if_assigned(PG_FUNCTION_ARGS);
+extern Datum pg_get_partkeydef(PG_FUNCTION_ARGS);
+extern Datum pg_ls_logdir(PG_FUNCTION_ARGS);
+extern Datum pg_ls_waldir(PG_FUNCTION_ARGS);
+extern Datum pg_ndistinct_in(PG_FUNCTION_ARGS);
+extern Datum pg_ndistinct_out(PG_FUNCTION_ARGS);
+extern Datum pg_ndistinct_recv(PG_FUNCTION_ARGS);
+extern Datum pg_ndistinct_send(PG_FUNCTION_ARGS);
+extern Datum macaddr_sortsupport(PG_FUNCTION_ARGS);
+extern Datum pg_xact_status(PG_FUNCTION_ARGS);
+extern Datum pg_safe_snapshot_blocking_pids(PG_FUNCTION_ARGS);
+extern Datum pg_isolation_test_session_is_blocked(PG_FUNCTION_ARGS);
+extern Datum pg_identify_object_as_address(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_opcinfo(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_add_value(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_consistent(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_union(PG_FUNCTION_ARGS);
+extern Datum int8_avg_accum_inv(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_sum(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_avg(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_var_pop(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_var_samp(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_stddev_pop(PG_FUNCTION_ARGS);
+extern Datum numeric_poly_stddev_samp(PG_FUNCTION_ARGS);
+extern Datum regexp_match_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_match(PG_FUNCTION_ARGS);
+extern Datum int8_mul_cash(PG_FUNCTION_ARGS);
+extern Datum pg_config(PG_FUNCTION_ARGS);
+extern Datum pg_hba_file_rules(PG_FUNCTION_ARGS);
+extern Datum pg_statistics_obj_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_dependencies_in(PG_FUNCTION_ARGS);
+extern Datum pg_dependencies_out(PG_FUNCTION_ARGS);
+extern Datum pg_dependencies_recv(PG_FUNCTION_ARGS);
+extern Datum pg_dependencies_send(PG_FUNCTION_ARGS);
+extern Datum pg_get_partition_constraintdef(PG_FUNCTION_ARGS);
+extern Datum time_hash_extended(PG_FUNCTION_ARGS);
+extern Datum timetz_hash_extended(PG_FUNCTION_ARGS);
+extern Datum timestamp_hash_extended(PG_FUNCTION_ARGS);
+extern Datum uuid_hash_extended(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_hash_extended(PG_FUNCTION_ARGS);
+extern Datum hashenumextended(PG_FUNCTION_ARGS);
+extern Datum pg_get_statisticsobjdef(PG_FUNCTION_ARGS);
+extern Datum jsonb_hash_extended(PG_FUNCTION_ARGS);
+extern Datum hash_range_extended(PG_FUNCTION_ARGS);
+extern Datum interval_hash_extended(PG_FUNCTION_ARGS);
+extern Datum sha224_bytea(PG_FUNCTION_ARGS);
+extern Datum sha256_bytea(PG_FUNCTION_ARGS);
+extern Datum sha384_bytea(PG_FUNCTION_ARGS);
+extern Datum sha512_bytea(PG_FUNCTION_ARGS);
+extern Datum pg_partition_tree(PG_FUNCTION_ARGS);
+extern Datum pg_partition_root(PG_FUNCTION_ARGS);
+extern Datum pg_partition_ancestors(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_checksum_failures(PG_FUNCTION_ARGS);
+extern Datum pg_stats_ext_mcvlist_items(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_checksum_last_failure(PG_FUNCTION_ARGS);
+extern Datum gen_random_uuid(PG_FUNCTION_ARGS);
+extern Datum gtsvector_options(PG_FUNCTION_ARGS);
+extern Datum gist_point_sortsupport(PG_FUNCTION_ARGS);
+extern Datum pg_promote(PG_FUNCTION_ARGS);
+extern Datum prefixsel(PG_FUNCTION_ARGS);
+extern Datum prefixjoinsel(PG_FUNCTION_ARGS);
+extern Datum pg_control_system(PG_FUNCTION_ARGS);
+extern Datum pg_control_checkpoint(PG_FUNCTION_ARGS);
+extern Datum pg_control_recovery(PG_FUNCTION_ARGS);
+extern Datum pg_control_init(PG_FUNCTION_ARGS);
+extern Datum pg_import_system_collations(PG_FUNCTION_ARGS);
+extern Datum macaddr8_recv(PG_FUNCTION_ARGS);
+extern Datum macaddr8_send(PG_FUNCTION_ARGS);
+extern Datum pg_collation_actual_version(PG_FUNCTION_ARGS);
+extern Datum jsonb_numeric(PG_FUNCTION_ARGS);
+extern Datum jsonb_int2(PG_FUNCTION_ARGS);
+extern Datum jsonb_int4(PG_FUNCTION_ARGS);
+extern Datum jsonb_int8(PG_FUNCTION_ARGS);
+extern Datum jsonb_float4(PG_FUNCTION_ARGS);
+extern Datum pg_filenode_relation(PG_FUNCTION_ARGS);
+extern Datum be_lo_from_bytea(PG_FUNCTION_ARGS);
+extern Datum be_lo_get(PG_FUNCTION_ARGS);
+extern Datum be_lo_get_fragment(PG_FUNCTION_ARGS);
+extern Datum be_lo_put(PG_FUNCTION_ARGS);
+extern Datum make_timestamp(PG_FUNCTION_ARGS);
+extern Datum make_timestamptz(PG_FUNCTION_ARGS);
+extern Datum make_timestamptz_at_timezone(PG_FUNCTION_ARGS);
+extern Datum make_interval(PG_FUNCTION_ARGS);
+extern Datum jsonb_array_elements_text(PG_FUNCTION_ARGS);
+extern Datum spg_range_quad_config(PG_FUNCTION_ARGS);
+extern Datum spg_range_quad_choose(PG_FUNCTION_ARGS);
+extern Datum spg_range_quad_picksplit(PG_FUNCTION_ARGS);
+extern Datum spg_range_quad_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_range_quad_leaf_consistent(PG_FUNCTION_ARGS);
+extern Datum jsonb_populate_recordset(PG_FUNCTION_ARGS);
+extern Datum to_regoperator(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_field(PG_FUNCTION_ARGS);
+extern Datum to_regprocedure(PG_FUNCTION_ARGS);
+extern Datum gin_compare_jsonb(PG_FUNCTION_ARGS);
+extern Datum gin_extract_jsonb(PG_FUNCTION_ARGS);
+extern Datum gin_extract_jsonb_query(PG_FUNCTION_ARGS);
+extern Datum gin_consistent_jsonb(PG_FUNCTION_ARGS);
+extern Datum gin_extract_jsonb_path(PG_FUNCTION_ARGS);
+extern Datum gin_extract_jsonb_query_path(PG_FUNCTION_ARGS);
+extern Datum gin_consistent_jsonb_path(PG_FUNCTION_ARGS);
+extern Datum gin_triconsistent_jsonb(PG_FUNCTION_ARGS);
+extern Datum gin_triconsistent_jsonb_path(PG_FUNCTION_ARGS);
+extern Datum jsonb_to_record(PG_FUNCTION_ARGS);
+extern Datum jsonb_to_recordset(PG_FUNCTION_ARGS);
+extern Datum to_regoper(PG_FUNCTION_ARGS);
+extern Datum to_regtype(PG_FUNCTION_ARGS);
+extern Datum to_regproc(PG_FUNCTION_ARGS);
+extern Datum to_regclass(PG_FUNCTION_ARGS);
+extern Datum bool_accum(PG_FUNCTION_ARGS);
+extern Datum bool_accum_inv(PG_FUNCTION_ARGS);
+extern Datum bool_alltrue(PG_FUNCTION_ARGS);
+extern Datum bool_anytrue(PG_FUNCTION_ARGS);
+extern Datum anyenum_in(PG_FUNCTION_ARGS);
+extern Datum anyenum_out(PG_FUNCTION_ARGS);
+extern Datum enum_in(PG_FUNCTION_ARGS);
+extern Datum enum_out(PG_FUNCTION_ARGS);
+extern Datum enum_eq(PG_FUNCTION_ARGS);
+extern Datum enum_ne(PG_FUNCTION_ARGS);
+extern Datum enum_lt(PG_FUNCTION_ARGS);
+extern Datum enum_gt(PG_FUNCTION_ARGS);
+extern Datum enum_le(PG_FUNCTION_ARGS);
+extern Datum enum_ge(PG_FUNCTION_ARGS);
+extern Datum enum_cmp(PG_FUNCTION_ARGS);
+extern Datum hashenum(PG_FUNCTION_ARGS);
+extern Datum enum_smaller(PG_FUNCTION_ARGS);
+extern Datum enum_larger(PG_FUNCTION_ARGS);
+extern Datum enum_first(PG_FUNCTION_ARGS);
+extern Datum enum_last(PG_FUNCTION_ARGS);
+extern Datum enum_range_bounds(PG_FUNCTION_ARGS);
+extern Datum enum_range_all(PG_FUNCTION_ARGS);
+extern Datum enum_recv(PG_FUNCTION_ARGS);
+extern Datum enum_send(PG_FUNCTION_ARGS);
+extern Datum string_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum string_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum pg_describe_object(PG_FUNCTION_ARGS);
+extern Datum text_format(PG_FUNCTION_ARGS);
+extern Datum text_format_nv(PG_FUNCTION_ARGS);
+extern Datum bytea_string_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum bytea_string_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum int8dec(PG_FUNCTION_ARGS);
+extern Datum int8dec_any(PG_FUNCTION_ARGS);
+extern Datum numeric_accum_inv(PG_FUNCTION_ARGS);
+extern Datum interval_accum_inv(PG_FUNCTION_ARGS);
+extern Datum network_overlap(PG_FUNCTION_ARGS);
+extern Datum inet_gist_consistent(PG_FUNCTION_ARGS);
+extern Datum inet_gist_union(PG_FUNCTION_ARGS);
+extern Datum inet_gist_compress(PG_FUNCTION_ARGS);
+extern Datum jsonb_bool(PG_FUNCTION_ARGS);
+extern Datum inet_gist_penalty(PG_FUNCTION_ARGS);
+extern Datum inet_gist_picksplit(PG_FUNCTION_ARGS);
+extern Datum inet_gist_same(PG_FUNCTION_ARGS);
+extern Datum networksel(PG_FUNCTION_ARGS);
+extern Datum networkjoinsel(PG_FUNCTION_ARGS);
+extern Datum network_larger(PG_FUNCTION_ARGS);
+extern Datum network_smaller(PG_FUNCTION_ARGS);
+extern Datum pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS);
+extern Datum int2_accum_inv(PG_FUNCTION_ARGS);
+extern Datum int4_accum_inv(PG_FUNCTION_ARGS);
+extern Datum int8_accum_inv(PG_FUNCTION_ARGS);
+extern Datum int2_avg_accum_inv(PG_FUNCTION_ARGS);
+extern Datum int4_avg_accum_inv(PG_FUNCTION_ARGS);
+extern Datum int2int4_sum(PG_FUNCTION_ARGS);
+extern Datum inet_gist_fetch(PG_FUNCTION_ARGS);
+extern Datum pg_logical_emit_message_text(PG_FUNCTION_ARGS);
+extern Datum pg_logical_emit_message_bytea(PG_FUNCTION_ARGS);
+extern Datum jsonb_insert(PG_FUNCTION_ARGS);
+extern Datum pg_xact_commit_timestamp(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_pg_type_oid(PG_FUNCTION_ARGS);
+extern Datum pg_last_committed_xact(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_array_pg_type_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_heap_pg_class_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_index_pg_class_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_toast_pg_class_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_pg_enum_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS);
+extern Datum event_trigger_in(PG_FUNCTION_ARGS);
+extern Datum event_trigger_out(PG_FUNCTION_ARGS);
+extern Datum tsvectorin(PG_FUNCTION_ARGS);
+extern Datum tsvectorout(PG_FUNCTION_ARGS);
+extern Datum tsqueryin(PG_FUNCTION_ARGS);
+extern Datum tsqueryout(PG_FUNCTION_ARGS);
+extern Datum tsvector_lt(PG_FUNCTION_ARGS);
+extern Datum tsvector_le(PG_FUNCTION_ARGS);
+extern Datum tsvector_eq(PG_FUNCTION_ARGS);
+extern Datum tsvector_ne(PG_FUNCTION_ARGS);
+extern Datum tsvector_ge(PG_FUNCTION_ARGS);
+extern Datum tsvector_gt(PG_FUNCTION_ARGS);
+extern Datum tsvector_cmp(PG_FUNCTION_ARGS);
+extern Datum tsvector_strip(PG_FUNCTION_ARGS);
+extern Datum tsvector_setweight(PG_FUNCTION_ARGS);
+extern Datum tsvector_concat(PG_FUNCTION_ARGS);
+extern Datum ts_match_vq(PG_FUNCTION_ARGS);
+extern Datum ts_match_qv(PG_FUNCTION_ARGS);
+extern Datum tsvectorsend(PG_FUNCTION_ARGS);
+extern Datum tsvectorrecv(PG_FUNCTION_ARGS);
+extern Datum tsquerysend(PG_FUNCTION_ARGS);
+extern Datum tsqueryrecv(PG_FUNCTION_ARGS);
+extern Datum gtsvectorin(PG_FUNCTION_ARGS);
+extern Datum gtsvectorout(PG_FUNCTION_ARGS);
+extern Datum gtsvector_compress(PG_FUNCTION_ARGS);
+extern Datum gtsvector_decompress(PG_FUNCTION_ARGS);
+extern Datum gtsvector_picksplit(PG_FUNCTION_ARGS);
+extern Datum gtsvector_union(PG_FUNCTION_ARGS);
+extern Datum gtsvector_same(PG_FUNCTION_ARGS);
+extern Datum gtsvector_penalty(PG_FUNCTION_ARGS);
+extern Datum gtsvector_consistent(PG_FUNCTION_ARGS);
+extern Datum gin_extract_tsvector(PG_FUNCTION_ARGS);
+extern Datum gin_extract_tsquery(PG_FUNCTION_ARGS);
+extern Datum gin_tsquery_consistent(PG_FUNCTION_ARGS);
+extern Datum tsquery_lt(PG_FUNCTION_ARGS);
+extern Datum tsquery_le(PG_FUNCTION_ARGS);
+extern Datum tsquery_eq(PG_FUNCTION_ARGS);
+extern Datum tsquery_ne(PG_FUNCTION_ARGS);
+extern Datum tsquery_ge(PG_FUNCTION_ARGS);
+extern Datum tsquery_gt(PG_FUNCTION_ARGS);
+extern Datum tsquery_cmp(PG_FUNCTION_ARGS);
+extern Datum tsquery_and(PG_FUNCTION_ARGS);
+extern Datum tsquery_or(PG_FUNCTION_ARGS);
+extern Datum tsquery_not(PG_FUNCTION_ARGS);
+extern Datum tsquery_numnode(PG_FUNCTION_ARGS);
+extern Datum tsquerytree(PG_FUNCTION_ARGS);
+extern Datum tsquery_rewrite(PG_FUNCTION_ARGS);
+extern Datum tsquery_rewrite_query(PG_FUNCTION_ARGS);
+extern Datum tsmatchsel(PG_FUNCTION_ARGS);
+extern Datum tsmatchjoinsel(PG_FUNCTION_ARGS);
+extern Datum ts_typanalyze(PG_FUNCTION_ARGS);
+extern Datum ts_stat1(PG_FUNCTION_ARGS);
+extern Datum ts_stat2(PG_FUNCTION_ARGS);
+extern Datum tsq_mcontains(PG_FUNCTION_ARGS);
+extern Datum tsq_mcontained(PG_FUNCTION_ARGS);
+extern Datum gtsquery_compress(PG_FUNCTION_ARGS);
+extern Datum text_starts_with(PG_FUNCTION_ARGS);
+extern Datum gtsquery_picksplit(PG_FUNCTION_ARGS);
+extern Datum gtsquery_union(PG_FUNCTION_ARGS);
+extern Datum gtsquery_same(PG_FUNCTION_ARGS);
+extern Datum gtsquery_penalty(PG_FUNCTION_ARGS);
+extern Datum gtsquery_consistent(PG_FUNCTION_ARGS);
+extern Datum ts_rank_wttf(PG_FUNCTION_ARGS);
+extern Datum ts_rank_wtt(PG_FUNCTION_ARGS);
+extern Datum ts_rank_ttf(PG_FUNCTION_ARGS);
+extern Datum ts_rank_tt(PG_FUNCTION_ARGS);
+extern Datum ts_rankcd_wttf(PG_FUNCTION_ARGS);
+extern Datum ts_rankcd_wtt(PG_FUNCTION_ARGS);
+extern Datum ts_rankcd_ttf(PG_FUNCTION_ARGS);
+extern Datum ts_rankcd_tt(PG_FUNCTION_ARGS);
+extern Datum tsvector_length(PG_FUNCTION_ARGS);
+extern Datum ts_token_type_byid(PG_FUNCTION_ARGS);
+extern Datum ts_token_type_byname(PG_FUNCTION_ARGS);
+extern Datum ts_parse_byid(PG_FUNCTION_ARGS);
+extern Datum ts_parse_byname(PG_FUNCTION_ARGS);
+extern Datum prsd_start(PG_FUNCTION_ARGS);
+extern Datum prsd_nexttoken(PG_FUNCTION_ARGS);
+extern Datum prsd_end(PG_FUNCTION_ARGS);
+extern Datum prsd_headline(PG_FUNCTION_ARGS);
+extern Datum prsd_lextype(PG_FUNCTION_ARGS);
+extern Datum ts_lexize(PG_FUNCTION_ARGS);
+extern Datum gin_cmp_tslexeme(PG_FUNCTION_ARGS);
+extern Datum dsimple_init(PG_FUNCTION_ARGS);
+extern Datum dsimple_lexize(PG_FUNCTION_ARGS);
+extern Datum dsynonym_init(PG_FUNCTION_ARGS);
+extern Datum dsynonym_lexize(PG_FUNCTION_ARGS);
+extern Datum dispell_init(PG_FUNCTION_ARGS);
+extern Datum dispell_lexize(PG_FUNCTION_ARGS);
+extern Datum regconfigin(PG_FUNCTION_ARGS);
+extern Datum regconfigout(PG_FUNCTION_ARGS);
+extern Datum regconfigrecv(PG_FUNCTION_ARGS);
+extern Datum regconfigsend(PG_FUNCTION_ARGS);
+extern Datum thesaurus_init(PG_FUNCTION_ARGS);
+extern Datum thesaurus_lexize(PG_FUNCTION_ARGS);
+extern Datum ts_headline_byid_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline_byid(PG_FUNCTION_ARGS);
+extern Datum to_tsvector_byid(PG_FUNCTION_ARGS);
+extern Datum to_tsquery_byid(PG_FUNCTION_ARGS);
+extern Datum plainto_tsquery_byid(PG_FUNCTION_ARGS);
+extern Datum to_tsvector(PG_FUNCTION_ARGS);
+extern Datum to_tsquery(PG_FUNCTION_ARGS);
+extern Datum plainto_tsquery(PG_FUNCTION_ARGS);
+extern Datum tsvector_update_trigger_byid(PG_FUNCTION_ARGS);
+extern Datum tsvector_update_trigger_bycolumn(PG_FUNCTION_ARGS);
+extern Datum ts_headline_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline(PG_FUNCTION_ARGS);
+extern Datum pg_ts_parser_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_ts_dict_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_ts_config_is_visible(PG_FUNCTION_ARGS);
+extern Datum get_current_ts_config(PG_FUNCTION_ARGS);
+extern Datum ts_match_tt(PG_FUNCTION_ARGS);
+extern Datum ts_match_tq(PG_FUNCTION_ARGS);
+extern Datum pg_ts_template_is_visible(PG_FUNCTION_ARGS);
+extern Datum regdictionaryin(PG_FUNCTION_ARGS);
+extern Datum regdictionaryout(PG_FUNCTION_ARGS);
+extern Datum regdictionaryrecv(PG_FUNCTION_ARGS);
+extern Datum regdictionarysend(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_single_function_counters(PG_FUNCTION_ARGS);
+extern Datum pg_tablespace_location(PG_FUNCTION_ARGS);
+extern Datum pg_create_physical_replication_slot(PG_FUNCTION_ARGS);
+extern Datum pg_drop_replication_slot(PG_FUNCTION_ARGS);
+extern Datum pg_get_replication_slots(PG_FUNCTION_ARGS);
+extern Datum pg_logical_slot_get_changes(PG_FUNCTION_ARGS);
+extern Datum pg_logical_slot_get_binary_changes(PG_FUNCTION_ARGS);
+extern Datum pg_logical_slot_peek_changes(PG_FUNCTION_ARGS);
+extern Datum pg_logical_slot_peek_binary_changes(PG_FUNCTION_ARGS);
+extern Datum pg_create_logical_replication_slot(PG_FUNCTION_ARGS);
+extern Datum to_jsonb(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS);
+extern Datum gin_clean_pending_list(PG_FUNCTION_ARGS);
+extern Datum gtsvector_consistent_oldsig(PG_FUNCTION_ARGS);
+extern Datum gin_extract_tsquery_oldsig(PG_FUNCTION_ARGS);
+extern Datum gin_tsquery_consistent_oldsig(PG_FUNCTION_ARGS);
+extern Datum gtsquery_consistent_oldsig(PG_FUNCTION_ARGS);
+extern Datum inet_spg_config(PG_FUNCTION_ARGS);
+extern Datum inet_spg_choose(PG_FUNCTION_ARGS);
+extern Datum inet_spg_picksplit(PG_FUNCTION_ARGS);
+extern Datum inet_spg_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum inet_spg_leaf_consistent(PG_FUNCTION_ARGS);
+extern Datum pg_current_logfile(PG_FUNCTION_ARGS);
+extern Datum pg_current_logfile_1arg(PG_FUNCTION_ARGS);
+extern Datum jsonb_send(PG_FUNCTION_ARGS);
+extern Datum jsonb_out(PG_FUNCTION_ARGS);
+extern Datum jsonb_recv(PG_FUNCTION_ARGS);
+extern Datum jsonb_in(PG_FUNCTION_ARGS);
+extern Datum pg_get_function_arg_default(PG_FUNCTION_ARGS);
+extern Datum pg_export_snapshot(PG_FUNCTION_ARGS);
+extern Datum pg_is_in_recovery(PG_FUNCTION_ARGS);
+extern Datum int4_cash(PG_FUNCTION_ARGS);
+extern Datum int8_cash(PG_FUNCTION_ARGS);
+extern Datum pg_collation_is_visible(PG_FUNCTION_ARGS);
+extern Datum array_typanalyze(PG_FUNCTION_ARGS);
+extern Datum arraycontsel(PG_FUNCTION_ARGS);
+extern Datum arraycontjoinsel(PG_FUNCTION_ARGS);
+extern Datum pg_get_multixact_members(PG_FUNCTION_ARGS);
+extern Datum pg_last_wal_receive_lsn(PG_FUNCTION_ARGS);
+extern Datum pg_last_wal_replay_lsn(PG_FUNCTION_ARGS);
+extern Datum cash_div_cash(PG_FUNCTION_ARGS);
+extern Datum cash_numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_cash(PG_FUNCTION_ARGS);
+extern Datum pg_read_file_all(PG_FUNCTION_ARGS);
+extern Datum pg_read_binary_file_off_len(PG_FUNCTION_ARGS);
+extern Datum pg_read_binary_file_all(PG_FUNCTION_ARGS);
+extern Datum pg_opfamily_is_visible(PG_FUNCTION_ARGS);
+extern Datum pg_last_xact_replay_timestamp(PG_FUNCTION_ARGS);
+extern Datum anyrange_in(PG_FUNCTION_ARGS);
+extern Datum anyrange_out(PG_FUNCTION_ARGS);
+extern Datum range_in(PG_FUNCTION_ARGS);
+extern Datum range_out(PG_FUNCTION_ARGS);
+extern Datum range_recv(PG_FUNCTION_ARGS);
+extern Datum range_send(PG_FUNCTION_ARGS);
+extern Datum pg_identify_object(PG_FUNCTION_ARGS);
+extern Datum range_constructor2(PG_FUNCTION_ARGS);
+extern Datum range_constructor3(PG_FUNCTION_ARGS);
+extern Datum pg_relation_is_updatable(PG_FUNCTION_ARGS);
+extern Datum pg_column_is_updatable(PG_FUNCTION_ARGS);
+extern Datum make_date(PG_FUNCTION_ARGS);
+extern Datum make_time(PG_FUNCTION_ARGS);
+extern Datum range_lower(PG_FUNCTION_ARGS);
+extern Datum range_upper(PG_FUNCTION_ARGS);
+extern Datum range_empty(PG_FUNCTION_ARGS);
+extern Datum range_lower_inc(PG_FUNCTION_ARGS);
+extern Datum range_upper_inc(PG_FUNCTION_ARGS);
+extern Datum range_lower_inf(PG_FUNCTION_ARGS);
+extern Datum range_upper_inf(PG_FUNCTION_ARGS);
+extern Datum range_eq(PG_FUNCTION_ARGS);
+extern Datum range_ne(PG_FUNCTION_ARGS);
+extern Datum range_overlaps(PG_FUNCTION_ARGS);
+extern Datum range_contains_elem(PG_FUNCTION_ARGS);
+extern Datum range_contains(PG_FUNCTION_ARGS);
+extern Datum elem_contained_by_range(PG_FUNCTION_ARGS);
+extern Datum range_contained_by(PG_FUNCTION_ARGS);
+extern Datum range_adjacent(PG_FUNCTION_ARGS);
+extern Datum range_before(PG_FUNCTION_ARGS);
+extern Datum range_after(PG_FUNCTION_ARGS);
+extern Datum range_overleft(PG_FUNCTION_ARGS);
+extern Datum range_overright(PG_FUNCTION_ARGS);
+extern Datum range_union(PG_FUNCTION_ARGS);
+extern Datum range_intersect(PG_FUNCTION_ARGS);
+extern Datum range_minus(PG_FUNCTION_ARGS);
+extern Datum range_cmp(PG_FUNCTION_ARGS);
+extern Datum range_lt(PG_FUNCTION_ARGS);
+extern Datum range_le(PG_FUNCTION_ARGS);
+extern Datum range_ge(PG_FUNCTION_ARGS);
+extern Datum range_gt(PG_FUNCTION_ARGS);
+extern Datum range_gist_consistent(PG_FUNCTION_ARGS);
+extern Datum range_gist_union(PG_FUNCTION_ARGS);
+extern Datum pg_replication_slot_advance(PG_FUNCTION_ARGS);
+extern Datum range_gist_penalty(PG_FUNCTION_ARGS);
+extern Datum range_gist_picksplit(PG_FUNCTION_ARGS);
+extern Datum range_gist_same(PG_FUNCTION_ARGS);
+extern Datum hash_range(PG_FUNCTION_ARGS);
+extern Datum int4range_canonical(PG_FUNCTION_ARGS);
+extern Datum daterange_canonical(PG_FUNCTION_ARGS);
+extern Datum range_typanalyze(PG_FUNCTION_ARGS);
+extern Datum timestamp_support(PG_FUNCTION_ARGS);
+extern Datum interval_support(PG_FUNCTION_ARGS);
+extern Datum ginarraytriconsistent(PG_FUNCTION_ARGS);
+extern Datum gin_tsquery_triconsistent(PG_FUNCTION_ARGS);
+extern Datum int4range_subdiff(PG_FUNCTION_ARGS);
+extern Datum int8range_subdiff(PG_FUNCTION_ARGS);
+extern Datum numrange_subdiff(PG_FUNCTION_ARGS);
+extern Datum daterange_subdiff(PG_FUNCTION_ARGS);
+extern Datum int8range_canonical(PG_FUNCTION_ARGS);
+extern Datum tsrange_subdiff(PG_FUNCTION_ARGS);
+extern Datum tstzrange_subdiff(PG_FUNCTION_ARGS);
+extern Datum jsonb_object_keys(PG_FUNCTION_ARGS);
+extern Datum jsonb_each_text(PG_FUNCTION_ARGS);
+extern Datum mxid_age(PG_FUNCTION_ARGS);
+extern Datum jsonb_extract_path_text(PG_FUNCTION_ARGS);
+extern Datum acldefault_sql(PG_FUNCTION_ARGS);
+extern Datum time_support(PG_FUNCTION_ARGS);
+extern Datum json_object_field(PG_FUNCTION_ARGS);
+extern Datum json_object_field_text(PG_FUNCTION_ARGS);
+extern Datum json_array_element(PG_FUNCTION_ARGS);
+extern Datum json_array_element_text(PG_FUNCTION_ARGS);
+extern Datum json_extract_path(PG_FUNCTION_ARGS);
+extern Datum brin_summarize_new_values(PG_FUNCTION_ARGS);
+extern Datum json_extract_path_text(PG_FUNCTION_ARGS);
+extern Datum pg_get_object_address(PG_FUNCTION_ARGS);
+extern Datum json_array_elements(PG_FUNCTION_ARGS);
+extern Datum json_array_length(PG_FUNCTION_ARGS);
+extern Datum json_object_keys(PG_FUNCTION_ARGS);
+extern Datum json_each(PG_FUNCTION_ARGS);
+extern Datum json_each_text(PG_FUNCTION_ARGS);
+extern Datum json_populate_record(PG_FUNCTION_ARGS);
+extern Datum json_populate_recordset(PG_FUNCTION_ARGS);
+extern Datum json_typeof(PG_FUNCTION_ARGS);
+extern Datum json_array_elements_text(PG_FUNCTION_ARGS);
+extern Datum ordered_set_transition(PG_FUNCTION_ARGS);
+extern Datum ordered_set_transition_multi(PG_FUNCTION_ARGS);
+extern Datum percentile_disc_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_float8_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_interval_final(PG_FUNCTION_ARGS);
+extern Datum percentile_disc_multi_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_float8_multi_final(PG_FUNCTION_ARGS);
+extern Datum percentile_cont_interval_multi_final(PG_FUNCTION_ARGS);
+extern Datum mode_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_rank_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_percent_rank_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_cume_dist_final(PG_FUNCTION_ARGS);
+extern Datum hypothetical_dense_rank_final(PG_FUNCTION_ARGS);
+extern Datum generate_series_int4_support(PG_FUNCTION_ARGS);
+extern Datum generate_series_int8_support(PG_FUNCTION_ARGS);
+extern Datum array_unnest_support(PG_FUNCTION_ARGS);
+extern Datum gist_box_distance(PG_FUNCTION_ARGS);
+extern Datum brin_summarize_range(PG_FUNCTION_ARGS);
+extern Datum jsonpath_in(PG_FUNCTION_ARGS);
+extern Datum jsonpath_recv(PG_FUNCTION_ARGS);
+extern Datum jsonpath_out(PG_FUNCTION_ARGS);
+extern Datum jsonpath_send(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_exists(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query_array(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_query_first(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_match(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_exists_opr(PG_FUNCTION_ARGS);
+extern Datum jsonb_path_match_opr(PG_FUNCTION_ARGS);
+extern Datum brin_desummarize_range(PG_FUNCTION_ARGS);
+extern Datum spg_quad_config(PG_FUNCTION_ARGS);
+extern Datum spg_quad_choose(PG_FUNCTION_ARGS);
+extern Datum spg_quad_picksplit(PG_FUNCTION_ARGS);
+extern Datum spg_quad_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_quad_leaf_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_kd_config(PG_FUNCTION_ARGS);
+extern Datum spg_kd_choose(PG_FUNCTION_ARGS);
+extern Datum spg_kd_picksplit(PG_FUNCTION_ARGS);
+extern Datum spg_kd_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_text_config(PG_FUNCTION_ARGS);
+extern Datum spg_text_choose(PG_FUNCTION_ARGS);
+extern Datum spg_text_picksplit(PG_FUNCTION_ARGS);
+extern Datum spg_text_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_text_leaf_consistent(PG_FUNCTION_ARGS);
+extern Datum pg_sequence_last_value(PG_FUNCTION_ARGS);
+extern Datum jsonb_ne(PG_FUNCTION_ARGS);
+extern Datum jsonb_lt(PG_FUNCTION_ARGS);
+extern Datum jsonb_gt(PG_FUNCTION_ARGS);
+extern Datum jsonb_le(PG_FUNCTION_ARGS);
+extern Datum jsonb_ge(PG_FUNCTION_ARGS);
+extern Datum jsonb_eq(PG_FUNCTION_ARGS);
+extern Datum jsonb_cmp(PG_FUNCTION_ARGS);
+extern Datum jsonb_hash(PG_FUNCTION_ARGS);
+extern Datum jsonb_contains(PG_FUNCTION_ARGS);
+extern Datum jsonb_exists(PG_FUNCTION_ARGS);
+extern Datum jsonb_exists_any(PG_FUNCTION_ARGS);
+extern Datum jsonb_exists_all(PG_FUNCTION_ARGS);
+extern Datum jsonb_contained(PG_FUNCTION_ARGS);
+extern Datum array_agg_array_transfn(PG_FUNCTION_ARGS);
+extern Datum array_agg_array_finalfn(PG_FUNCTION_ARGS);
+extern Datum range_merge(PG_FUNCTION_ARGS);
+extern Datum inet_merge(PG_FUNCTION_ARGS);
+extern Datum boxes_bound_box(PG_FUNCTION_ARGS);
+extern Datum inet_same_family(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_record_init_privs(PG_FUNCTION_ARGS);
+extern Datum regnamespacein(PG_FUNCTION_ARGS);
+extern Datum regnamespaceout(PG_FUNCTION_ARGS);
+extern Datum to_regnamespace(PG_FUNCTION_ARGS);
+extern Datum regnamespacerecv(PG_FUNCTION_ARGS);
+extern Datum regnamespacesend(PG_FUNCTION_ARGS);
+extern Datum point_box(PG_FUNCTION_ARGS);
+extern Datum regroleout(PG_FUNCTION_ARGS);
+extern Datum to_regrole(PG_FUNCTION_ARGS);
+extern Datum regrolerecv(PG_FUNCTION_ARGS);
+extern Datum regrolesend(PG_FUNCTION_ARGS);
+extern Datum regrolein(PG_FUNCTION_ARGS);
+extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);
+extern Datum pg_read_file(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_missing_value(PG_FUNCTION_ARGS);
+extern Datum brin_inclusion_opcinfo(PG_FUNCTION_ARGS);
+extern Datum brin_inclusion_add_value(PG_FUNCTION_ARGS);
+extern Datum brin_inclusion_consistent(PG_FUNCTION_ARGS);
+extern Datum brin_inclusion_union(PG_FUNCTION_ARGS);
+extern Datum macaddr8_in(PG_FUNCTION_ARGS);
+extern Datum macaddr8_out(PG_FUNCTION_ARGS);
+extern Datum macaddr8_trunc(PG_FUNCTION_ARGS);
+extern Datum macaddr8_eq(PG_FUNCTION_ARGS);
+extern Datum macaddr8_lt(PG_FUNCTION_ARGS);
+extern Datum macaddr8_le(PG_FUNCTION_ARGS);
+extern Datum macaddr8_gt(PG_FUNCTION_ARGS);
+extern Datum macaddr8_ge(PG_FUNCTION_ARGS);
+extern Datum macaddr8_ne(PG_FUNCTION_ARGS);
+extern Datum macaddr8_cmp(PG_FUNCTION_ARGS);
+extern Datum macaddr8_not(PG_FUNCTION_ARGS);
+extern Datum macaddr8_and(PG_FUNCTION_ARGS);
+extern Datum macaddr8_or(PG_FUNCTION_ARGS);
+extern Datum macaddrtomacaddr8(PG_FUNCTION_ARGS);
+extern Datum macaddr8tomacaddr(PG_FUNCTION_ARGS);
+extern Datum macaddr8_set7bit(PG_FUNCTION_ARGS);
+extern Datum in_range_int8_int8(PG_FUNCTION_ARGS);
+extern Datum in_range_int4_int8(PG_FUNCTION_ARGS);
+extern Datum in_range_int4_int4(PG_FUNCTION_ARGS);
+extern Datum in_range_int4_int2(PG_FUNCTION_ARGS);
+extern Datum in_range_int2_int8(PG_FUNCTION_ARGS);
+extern Datum in_range_int2_int4(PG_FUNCTION_ARGS);
+extern Datum in_range_int2_int2(PG_FUNCTION_ARGS);
+extern Datum in_range_date_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_timestamp_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_timestamptz_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_interval_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_time_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_timetz_interval(PG_FUNCTION_ARGS);
+extern Datum in_range_float8_float8(PG_FUNCTION_ARGS);
+extern Datum in_range_float4_float8(PG_FUNCTION_ARGS);
+extern Datum in_range_numeric_numeric(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_larger(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_smaller(PG_FUNCTION_ARGS);
+extern Datum regcollationin(PG_FUNCTION_ARGS);
+extern Datum regcollationout(PG_FUNCTION_ARGS);
+extern Datum to_regcollation(PG_FUNCTION_ARGS);
+extern Datum regcollationrecv(PG_FUNCTION_ARGS);
+extern Datum regcollationsend(PG_FUNCTION_ARGS);
+extern Datum ts_headline_jsonb_byid_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline_jsonb_byid(PG_FUNCTION_ARGS);
+extern Datum ts_headline_jsonb_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline_jsonb(PG_FUNCTION_ARGS);
+extern Datum ts_headline_json_byid_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline_json_byid(PG_FUNCTION_ARGS);
+extern Datum ts_headline_json_opt(PG_FUNCTION_ARGS);
+extern Datum ts_headline_json(PG_FUNCTION_ARGS);
+extern Datum jsonb_string_to_tsvector(PG_FUNCTION_ARGS);
+extern Datum json_string_to_tsvector(PG_FUNCTION_ARGS);
+extern Datum jsonb_string_to_tsvector_byid(PG_FUNCTION_ARGS);
+extern Datum json_string_to_tsvector_byid(PG_FUNCTION_ARGS);
+extern Datum jsonb_to_tsvector(PG_FUNCTION_ARGS);
+extern Datum jsonb_to_tsvector_byid(PG_FUNCTION_ARGS);
+extern Datum json_to_tsvector(PG_FUNCTION_ARGS);
+extern Datum json_to_tsvector_byid(PG_FUNCTION_ARGS);
+extern Datum pg_copy_physical_replication_slot_a(PG_FUNCTION_ARGS);
+extern Datum pg_copy_physical_replication_slot_b(PG_FUNCTION_ARGS);
+extern Datum pg_copy_logical_replication_slot_a(PG_FUNCTION_ARGS);
+extern Datum pg_copy_logical_replication_slot_b(PG_FUNCTION_ARGS);
+extern Datum pg_copy_logical_replication_slot_c(PG_FUNCTION_ARGS);
+extern Datum anycompatiblemultirange_in(PG_FUNCTION_ARGS);
+extern Datum anycompatiblemultirange_out(PG_FUNCTION_ARGS);
+extern Datum range_merge_from_multirange(PG_FUNCTION_ARGS);
+extern Datum anymultirange_in(PG_FUNCTION_ARGS);
+extern Datum anymultirange_out(PG_FUNCTION_ARGS);
+extern Datum multirange_in(PG_FUNCTION_ARGS);
+extern Datum multirange_out(PG_FUNCTION_ARGS);
+extern Datum multirange_recv(PG_FUNCTION_ARGS);
+extern Datum multirange_send(PG_FUNCTION_ARGS);
+extern Datum multirange_lower(PG_FUNCTION_ARGS);
+extern Datum multirange_upper(PG_FUNCTION_ARGS);
+extern Datum multirange_empty(PG_FUNCTION_ARGS);
+extern Datum multirange_lower_inc(PG_FUNCTION_ARGS);
+extern Datum multirange_upper_inc(PG_FUNCTION_ARGS);
+extern Datum multirange_lower_inf(PG_FUNCTION_ARGS);
+extern Datum multirange_upper_inf(PG_FUNCTION_ARGS);
+extern Datum multirange_typanalyze(PG_FUNCTION_ARGS);
+extern Datum multirangesel(PG_FUNCTION_ARGS);
+extern Datum multirange_eq(PG_FUNCTION_ARGS);
+extern Datum multirange_ne(PG_FUNCTION_ARGS);
+extern Datum range_overlaps_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_overlaps_range(PG_FUNCTION_ARGS);
+extern Datum multirange_overlaps_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_contains_elem(PG_FUNCTION_ARGS);
+extern Datum multirange_contains_range(PG_FUNCTION_ARGS);
+extern Datum multirange_contains_multirange(PG_FUNCTION_ARGS);
+extern Datum elem_contained_by_multirange(PG_FUNCTION_ARGS);
+extern Datum range_contained_by_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_contained_by_multirange(PG_FUNCTION_ARGS);
+extern Datum range_adjacent_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_adjacent_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_adjacent_range(PG_FUNCTION_ARGS);
+extern Datum range_before_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_before_range(PG_FUNCTION_ARGS);
+extern Datum multirange_before_multirange(PG_FUNCTION_ARGS);
+extern Datum range_after_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_after_range(PG_FUNCTION_ARGS);
+extern Datum multirange_after_multirange(PG_FUNCTION_ARGS);
+extern Datum range_overleft_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_overleft_range(PG_FUNCTION_ARGS);
+extern Datum multirange_overleft_multirange(PG_FUNCTION_ARGS);
+extern Datum range_overright_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_overright_range(PG_FUNCTION_ARGS);
+extern Datum multirange_overright_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_union(PG_FUNCTION_ARGS);
+extern Datum multirange_minus(PG_FUNCTION_ARGS);
+extern Datum multirange_intersect(PG_FUNCTION_ARGS);
+extern Datum multirange_cmp(PG_FUNCTION_ARGS);
+extern Datum multirange_lt(PG_FUNCTION_ARGS);
+extern Datum multirange_le(PG_FUNCTION_ARGS);
+extern Datum multirange_ge(PG_FUNCTION_ARGS);
+extern Datum multirange_gt(PG_FUNCTION_ARGS);
+extern Datum hash_multirange(PG_FUNCTION_ARGS);
+extern Datum hash_multirange_extended(PG_FUNCTION_ARGS);
+extern Datum multirange_constructor0(PG_FUNCTION_ARGS);
+extern Datum multirange_constructor1(PG_FUNCTION_ARGS);
+extern Datum multirange_constructor2(PG_FUNCTION_ARGS);
+extern Datum range_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum range_agg_finalfn(PG_FUNCTION_ARGS);
+extern Datum unicode_normalize_func(PG_FUNCTION_ARGS);
+extern Datum unicode_is_normalized(PG_FUNCTION_ARGS);
+extern Datum multirange_intersect_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_multirange_pg_type_oid(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_multirange_array_pg_type_oid(PG_FUNCTION_ARGS);
+extern Datum range_intersect_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum range_contains_multirange(PG_FUNCTION_ARGS);
+extern Datum multirange_contained_by_range(PG_FUNCTION_ARGS);
+extern Datum pg_log_backend_memory_contexts(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_heap_relfilenode(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_index_relfilenode(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_toast_relfilenode(PG_FUNCTION_ARGS);
+extern Datum binary_upgrade_set_next_pg_tablespace_oid(PG_FUNCTION_ARGS);
+extern Datum pg_event_trigger_table_rewrite_oid(PG_FUNCTION_ARGS);
+extern Datum pg_event_trigger_table_rewrite_reason(PG_FUNCTION_ARGS);
+extern Datum pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_opcinfo(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_add_value(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_consistent(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_union(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_options(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_summary_in(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_summary_out(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_summary_recv(PG_FUNCTION_ARGS);
+extern Datum brin_bloom_summary_send(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_opcinfo(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_add_value(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_consistent(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_union(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_options(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_int2(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_int4(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_int8(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_float4(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_float8(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_numeric(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_tid(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_uuid(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_date(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_time(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_interval(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_timetz(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_pg_lsn(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_macaddr(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_macaddr8(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_inet(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_distance_timestamp(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_summary_in(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_summary_out(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_summary_recv(PG_FUNCTION_ARGS);
+extern Datum brin_minmax_multi_summary_send(PG_FUNCTION_ARGS);
+extern Datum phraseto_tsquery(PG_FUNCTION_ARGS);
+extern Datum tsquery_phrase(PG_FUNCTION_ARGS);
+extern Datum tsquery_phrase_distance(PG_FUNCTION_ARGS);
+extern Datum phraseto_tsquery_byid(PG_FUNCTION_ARGS);
+extern Datum websearch_to_tsquery_byid(PG_FUNCTION_ARGS);
+extern Datum websearch_to_tsquery(PG_FUNCTION_ARGS);
+extern Datum spg_bbox_quad_config(PG_FUNCTION_ARGS);
+extern Datum spg_poly_quad_compress(PG_FUNCTION_ARGS);
+extern Datum spg_box_quad_config(PG_FUNCTION_ARGS);
+extern Datum spg_box_quad_choose(PG_FUNCTION_ARGS);
+extern Datum spg_box_quad_picksplit(PG_FUNCTION_ARGS);
+extern Datum spg_box_quad_inner_consistent(PG_FUNCTION_ARGS);
+extern Datum spg_box_quad_leaf_consistent(PG_FUNCTION_ARGS);
+extern Datum pg_mcv_list_in(PG_FUNCTION_ARGS);
+extern Datum pg_mcv_list_out(PG_FUNCTION_ARGS);
+extern Datum pg_mcv_list_recv(PG_FUNCTION_ARGS);
+extern Datum pg_mcv_list_send(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_pli(PG_FUNCTION_ARGS);
+extern Datum pg_lsn_mii(PG_FUNCTION_ARGS);
+extern Datum satisfies_hash_partition(PG_FUNCTION_ARGS);
+extern Datum pg_ls_tmpdir_noargs(PG_FUNCTION_ARGS);
+extern Datum pg_ls_tmpdir_1arg(PG_FUNCTION_ARGS);
+extern Datum pg_ls_archive_statusdir(PG_FUNCTION_ARGS);
+extern Datum network_sortsupport(PG_FUNCTION_ARGS);
+extern Datum xid8lt(PG_FUNCTION_ARGS);
+extern Datum xid8gt(PG_FUNCTION_ARGS);
+extern Datum xid8le(PG_FUNCTION_ARGS);
+extern Datum xid8ge(PG_FUNCTION_ARGS);
+extern Datum matchingsel(PG_FUNCTION_ARGS);
+extern Datum matchingjoinsel(PG_FUNCTION_ARGS);
+extern Datum numeric_min_scale(PG_FUNCTION_ARGS);
+extern Datum numeric_trim_scale(PG_FUNCTION_ARGS);
+extern Datum int4gcd(PG_FUNCTION_ARGS);
+extern Datum int8gcd(PG_FUNCTION_ARGS);
+extern Datum int4lcm(PG_FUNCTION_ARGS);
+extern Datum int8lcm(PG_FUNCTION_ARGS);
+extern Datum numeric_gcd(PG_FUNCTION_ARGS);
+extern Datum numeric_lcm(PG_FUNCTION_ARGS);
+extern Datum btvarstrequalimage(PG_FUNCTION_ARGS);
+extern Datum btequalimage(PG_FUNCTION_ARGS);
+extern Datum pg_get_shmem_allocations(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_ins_since_vacuum(PG_FUNCTION_ARGS);
+extern Datum jsonb_set_lax(PG_FUNCTION_ARGS);
+extern Datum xid8in(PG_FUNCTION_ARGS);
+extern Datum xid8toxid(PG_FUNCTION_ARGS);
+extern Datum xid8out(PG_FUNCTION_ARGS);
+extern Datum xid8recv(PG_FUNCTION_ARGS);
+extern Datum xid8send(PG_FUNCTION_ARGS);
+extern Datum xid8eq(PG_FUNCTION_ARGS);
+extern Datum xid8ne(PG_FUNCTION_ARGS);
+extern Datum anycompatible_in(PG_FUNCTION_ARGS);
+extern Datum anycompatible_out(PG_FUNCTION_ARGS);
+extern Datum anycompatiblearray_in(PG_FUNCTION_ARGS);
+extern Datum anycompatiblearray_out(PG_FUNCTION_ARGS);
+extern Datum anycompatiblearray_recv(PG_FUNCTION_ARGS);
+extern Datum anycompatiblearray_send(PG_FUNCTION_ARGS);
+extern Datum anycompatiblenonarray_in(PG_FUNCTION_ARGS);
+extern Datum anycompatiblenonarray_out(PG_FUNCTION_ARGS);
+extern Datum anycompatiblerange_in(PG_FUNCTION_ARGS);
+extern Datum anycompatiblerange_out(PG_FUNCTION_ARGS);
+extern Datum xid8cmp(PG_FUNCTION_ARGS);
+extern Datum xid8_larger(PG_FUNCTION_ARGS);
+extern Datum xid8_smaller(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_create(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_drop(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_oid(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_session_setup(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_session_reset(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_session_is_setup(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_session_progress(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_xact_setup(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_xact_reset(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_advance(PG_FUNCTION_ARGS);
+extern Datum pg_replication_origin_progress(PG_FUNCTION_ARGS);
+extern Datum pg_show_replication_origin_status(PG_FUNCTION_ARGS);
+extern Datum jsonb_subscript_handler(PG_FUNCTION_ARGS);
+extern Datum numeric_pg_lsn(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_subscription(PG_FUNCTION_ARGS);
+extern Datum pg_get_publication_tables(PG_FUNCTION_ARGS);
+extern Datum pg_get_replica_identity_index(PG_FUNCTION_ARGS);
+extern Datum pg_relation_is_publishable(PG_FUNCTION_ARGS);
+extern Datum multirange_gist_consistent(PG_FUNCTION_ARGS);
+extern Datum multirange_gist_compress(PG_FUNCTION_ARGS);
+extern Datum pg_get_catalog_foreign_keys(PG_FUNCTION_ARGS);
+extern Datum text_to_table(PG_FUNCTION_ARGS);
+extern Datum text_to_table_null(PG_FUNCTION_ARGS);
+extern Datum bit_bit_count(PG_FUNCTION_ARGS);
+extern Datum bytea_bit_count(PG_FUNCTION_ARGS);
+extern Datum pg_xact_commit_timestamp_origin(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_replication_slot(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_replication_slot(PG_FUNCTION_ARGS);
+extern Datum trim_array(PG_FUNCTION_ARGS);
+extern Datum pg_get_statisticsobjdef_expressions(PG_FUNCTION_ARGS);
+extern Datum pg_get_statisticsobjdef_columns(PG_FUNCTION_ARGS);
+extern Datum timestamp_bin(PG_FUNCTION_ARGS);
+extern Datum timestamptz_bin(PG_FUNCTION_ARGS);
+extern Datum array_subscript_handler(PG_FUNCTION_ARGS);
+extern Datum raw_array_subscript_handler(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_session_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_active_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_idle_in_transaction_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_sessions(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_sessions_abandoned(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_sessions_fatal(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_db_sessions_killed(PG_FUNCTION_ARGS);
+extern Datum hash_record(PG_FUNCTION_ARGS);
+extern Datum hash_record_extended(PG_FUNCTION_ARGS);
+extern Datum bytealtrim(PG_FUNCTION_ARGS);
+extern Datum byteartrim(PG_FUNCTION_ARGS);
+extern Datum pg_get_function_sqlbody(PG_FUNCTION_ARGS);
+extern Datum unistr(PG_FUNCTION_ARGS);
+extern Datum extract_date(PG_FUNCTION_ARGS);
+extern Datum extract_time(PG_FUNCTION_ARGS);
+extern Datum extract_timetz(PG_FUNCTION_ARGS);
+extern Datum extract_timestamp(PG_FUNCTION_ARGS);
+extern Datum extract_timestamptz(PG_FUNCTION_ARGS);
+extern Datum extract_interval(PG_FUNCTION_ARGS);
+extern Datum has_parameter_privilege_name_name(PG_FUNCTION_ARGS);
+extern Datum has_parameter_privilege_id_name(PG_FUNCTION_ARGS);
+extern Datum has_parameter_privilege_name(PG_FUNCTION_ARGS);
+extern Datum pg_get_wal_resource_managers(PG_FUNCTION_ARGS);
+extern Datum multirange_agg_transfn(PG_FUNCTION_ARGS);
+extern Datum pg_stat_have_stats(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_subscription_stats(PG_FUNCTION_ARGS);
+extern Datum pg_stat_reset_subscription_stats(PG_FUNCTION_ARGS);
+extern Datum window_row_number_support(PG_FUNCTION_ARGS);
+extern Datum window_rank_support(PG_FUNCTION_ARGS);
+extern Datum window_dense_rank_support(PG_FUNCTION_ARGS);
+extern Datum int8inc_support(PG_FUNCTION_ARGS);
+extern Datum pg_settings_get_flags(PG_FUNCTION_ARGS);
+extern Datum pg_stop_making_pinned_objects(PG_FUNCTION_ARGS);
+extern Datum text_starts_with_support(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_recovery_prefetch(PG_FUNCTION_ARGS);
+extern Datum pg_database_collation_actual_version(PG_FUNCTION_ARGS);
+extern Datum pg_ident_file_mappings(PG_FUNCTION_ARGS);
+extern Datum textregexreplace_extended(PG_FUNCTION_ARGS);
+extern Datum textregexreplace_extended_no_flags(PG_FUNCTION_ARGS);
+extern Datum textregexreplace_extended_no_n(PG_FUNCTION_ARGS);
+extern Datum regexp_count_no_start(PG_FUNCTION_ARGS);
+extern Datum regexp_count_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_count(PG_FUNCTION_ARGS);
+extern Datum regexp_instr_no_start(PG_FUNCTION_ARGS);
+extern Datum regexp_instr_no_n(PG_FUNCTION_ARGS);
+extern Datum regexp_instr_no_endoption(PG_FUNCTION_ARGS);
+extern Datum regexp_instr_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_instr_no_subexpr(PG_FUNCTION_ARGS);
+extern Datum regexp_instr(PG_FUNCTION_ARGS);
+extern Datum regexp_like_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_like(PG_FUNCTION_ARGS);
+extern Datum regexp_substr_no_start(PG_FUNCTION_ARGS);
+extern Datum regexp_substr_no_n(PG_FUNCTION_ARGS);
+extern Datum regexp_substr_no_flags(PG_FUNCTION_ARGS);
+extern Datum regexp_substr_no_subexpr(PG_FUNCTION_ARGS);
+extern Datum regexp_substr(PG_FUNCTION_ARGS);
+extern Datum pg_ls_logicalsnapdir(PG_FUNCTION_ARGS);
+extern Datum pg_ls_logicalmapdir(PG_FUNCTION_ARGS);
+extern Datum pg_ls_replslotdir(PG_FUNCTION_ARGS);
+
+#endif /* FMGRPROTOS_H */
diff --git a/src/backend/utils/fmgrtab.c b/src/backend/utils/fmgrtab.c
new file mode 100644
index 0000000..dc56c13
--- /dev/null
+++ b/src/backend/utils/fmgrtab.c
@@ -0,0 +1,9254 @@
+/*-------------------------------------------------------------------------
+ *
+ * fmgrtab.c
+ * The function manager's table of internal functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *
+ * ******************************
+ * *** DO NOT EDIT THIS FILE! ***
+ * ******************************
+ *
+ * It has been GENERATED by src/backend/utils/Gen_fmgrtab.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/transam.h"
+#include "utils/fmgrtab.h"
+#include "utils/fmgrprotos.h"
+
+
+const FmgrBuiltin fmgr_builtins[] = {
+ { 3, 1, true, false, "heap_tableam_handler", heap_tableam_handler },
+ { 31, 1, true, false, "byteaout", byteaout },
+ { 33, 1, true, false, "charout", charout },
+ { 34, 1, true, false, "namein", namein },
+ { 35, 1, true, false, "nameout", nameout },
+ { 38, 1, true, false, "int2in", int2in },
+ { 39, 1, true, false, "int2out", int2out },
+ { 40, 1, true, false, "int2vectorin", int2vectorin },
+ { 41, 1, true, false, "int2vectorout", int2vectorout },
+ { 42, 1, true, false, "int4in", int4in },
+ { 43, 1, true, false, "int4out", int4out },
+ { 44, 1, true, false, "regprocin", regprocin },
+ { 45, 1, true, false, "regprocout", regprocout },
+ { 46, 1, true, false, "textin", textin },
+ { 47, 1, true, false, "textout", textout },
+ { 48, 1, true, false, "tidin", tidin },
+ { 49, 1, true, false, "tidout", tidout },
+ { 50, 1, true, false, "xidin", xidin },
+ { 51, 1, true, false, "xidout", xidout },
+ { 52, 1, true, false, "cidin", cidin },
+ { 53, 1, true, false, "cidout", cidout },
+ { 54, 1, true, false, "oidvectorin", oidvectorin },
+ { 55, 1, true, false, "oidvectorout", oidvectorout },
+ { 56, 2, true, false, "boollt", boollt },
+ { 57, 2, true, false, "boolgt", boolgt },
+ { 60, 2, true, false, "booleq", booleq },
+ { 61, 2, true, false, "chareq", chareq },
+ { 62, 2, true, false, "nameeq", nameeq },
+ { 63, 2, true, false, "int2eq", int2eq },
+ { 64, 2, true, false, "int2lt", int2lt },
+ { 65, 2, true, false, "int4eq", int4eq },
+ { 66, 2, true, false, "int4lt", int4lt },
+ { 67, 2, true, false, "texteq", texteq },
+ { 68, 2, true, false, "xideq", xideq },
+ { 69, 2, true, false, "cideq", cideq },
+ { 70, 2, true, false, "charne", charne },
+ { 72, 2, true, false, "charle", charle },
+ { 73, 2, true, false, "chargt", chargt },
+ { 74, 2, true, false, "charge", charge },
+ { 77, 1, true, false, "chartoi4", chartoi4 },
+ { 78, 1, true, false, "i4tochar", i4tochar },
+ { 79, 2, true, false, "nameregexeq", nameregexeq },
+ { 84, 2, true, false, "boolne", boolne },
+ { 86, 1, true, false, "pg_ddl_command_in", pg_ddl_command_in },
+ { 87, 1, true, false, "pg_ddl_command_out", pg_ddl_command_out },
+ { 88, 1, true, false, "pg_ddl_command_recv", pg_ddl_command_recv },
+ { 89, 0, true, false, "pgsql_version", pgsql_version },
+ { 90, 1, true, false, "pg_ddl_command_send", pg_ddl_command_send },
+ { 101, 4, true, false, "eqsel", eqsel },
+ { 102, 4, true, false, "neqsel", neqsel },
+ { 103, 4, true, false, "scalarltsel", scalarltsel },
+ { 104, 4, true, false, "scalargtsel", scalargtsel },
+ { 105, 5, true, false, "eqjoinsel", eqjoinsel },
+ { 106, 5, true, false, "neqjoinsel", neqjoinsel },
+ { 107, 5, true, false, "scalarltjoinsel", scalarltjoinsel },
+ { 108, 5, true, false, "scalargtjoinsel", scalargtjoinsel },
+ { 109, 1, true, false, "unknownin", unknownin },
+ { 110, 1, true, false, "unknownout", unknownout },
+ { 115, 2, true, false, "box_above_eq", box_above_eq },
+ { 116, 2, true, false, "box_below_eq", box_below_eq },
+ { 117, 1, true, false, "point_in", point_in },
+ { 118, 1, true, false, "point_out", point_out },
+ { 119, 1, true, false, "lseg_in", lseg_in },
+ { 120, 1, true, false, "lseg_out", lseg_out },
+ { 121, 1, true, false, "path_in", path_in },
+ { 122, 1, true, false, "path_out", path_out },
+ { 123, 1, true, false, "box_in", box_in },
+ { 124, 1, true, false, "box_out", box_out },
+ { 125, 2, true, false, "box_overlap", box_overlap },
+ { 126, 2, true, false, "box_ge", box_ge },
+ { 127, 2, true, false, "box_gt", box_gt },
+ { 128, 2, true, false, "box_eq", box_eq },
+ { 129, 2, true, false, "box_lt", box_lt },
+ { 130, 2, true, false, "box_le", box_le },
+ { 131, 2, true, false, "point_above", point_above },
+ { 132, 2, true, false, "point_left", point_left },
+ { 133, 2, true, false, "point_right", point_right },
+ { 134, 2, true, false, "point_below", point_below },
+ { 135, 2, true, false, "point_eq", point_eq },
+ { 136, 2, true, false, "on_pb", on_pb },
+ { 137, 2, true, false, "on_ppath", on_ppath },
+ { 138, 1, true, false, "box_center", box_center },
+ { 139, 4, true, false, "areasel", areasel },
+ { 140, 5, true, false, "areajoinsel", areajoinsel },
+ { 141, 2, true, false, "int4mul", int4mul },
+ { 144, 2, true, false, "int4ne", int4ne },
+ { 145, 2, true, false, "int2ne", int2ne },
+ { 146, 2, true, false, "int2gt", int2gt },
+ { 147, 2, true, false, "int4gt", int4gt },
+ { 148, 2, true, false, "int2le", int2le },
+ { 149, 2, true, false, "int4le", int4le },
+ { 150, 2, true, false, "int4ge", int4ge },
+ { 151, 2, true, false, "int2ge", int2ge },
+ { 152, 2, true, false, "int2mul", int2mul },
+ { 153, 2, true, false, "int2div", int2div },
+ { 154, 2, true, false, "int4div", int4div },
+ { 155, 2, true, false, "int2mod", int2mod },
+ { 156, 2, true, false, "int4mod", int4mod },
+ { 157, 2, true, false, "textne", textne },
+ { 158, 2, true, false, "int24eq", int24eq },
+ { 159, 2, true, false, "int42eq", int42eq },
+ { 160, 2, true, false, "int24lt", int24lt },
+ { 161, 2, true, false, "int42lt", int42lt },
+ { 162, 2, true, false, "int24gt", int24gt },
+ { 163, 2, true, false, "int42gt", int42gt },
+ { 164, 2, true, false, "int24ne", int24ne },
+ { 165, 2, true, false, "int42ne", int42ne },
+ { 166, 2, true, false, "int24le", int24le },
+ { 167, 2, true, false, "int42le", int42le },
+ { 168, 2, true, false, "int24ge", int24ge },
+ { 169, 2, true, false, "int42ge", int42ge },
+ { 170, 2, true, false, "int24mul", int24mul },
+ { 171, 2, true, false, "int42mul", int42mul },
+ { 172, 2, true, false, "int24div", int24div },
+ { 173, 2, true, false, "int42div", int42div },
+ { 176, 2, true, false, "int2pl", int2pl },
+ { 177, 2, true, false, "int4pl", int4pl },
+ { 178, 2, true, false, "int24pl", int24pl },
+ { 179, 2, true, false, "int42pl", int42pl },
+ { 180, 2, true, false, "int2mi", int2mi },
+ { 181, 2, true, false, "int4mi", int4mi },
+ { 182, 2, true, false, "int24mi", int24mi },
+ { 183, 2, true, false, "int42mi", int42mi },
+ { 184, 2, true, false, "oideq", oideq },
+ { 185, 2, true, false, "oidne", oidne },
+ { 186, 2, true, false, "box_same", box_same },
+ { 187, 2, true, false, "box_contain", box_contain },
+ { 188, 2, true, false, "box_left", box_left },
+ { 189, 2, true, false, "box_overleft", box_overleft },
+ { 190, 2, true, false, "box_overright", box_overright },
+ { 191, 2, true, false, "box_right", box_right },
+ { 192, 2, true, false, "box_contained", box_contained },
+ { 193, 2, true, false, "box_contain_pt", box_contain_pt },
+ { 195, 1, true, false, "pg_node_tree_in", pg_node_tree_in },
+ { 196, 1, true, false, "pg_node_tree_out", pg_node_tree_out },
+ { 197, 1, true, false, "pg_node_tree_recv", pg_node_tree_recv },
+ { 198, 1, true, false, "pg_node_tree_send", pg_node_tree_send },
+ { 200, 1, true, false, "float4in", float4in },
+ { 201, 1, true, false, "float4out", float4out },
+ { 202, 2, true, false, "float4mul", float4mul },
+ { 203, 2, true, false, "float4div", float4div },
+ { 204, 2, true, false, "float4pl", float4pl },
+ { 205, 2, true, false, "float4mi", float4mi },
+ { 206, 1, true, false, "float4um", float4um },
+ { 207, 1, true, false, "float4abs", float4abs },
+ { 208, 2, true, false, "float4_accum", float4_accum },
+ { 209, 2, true, false, "float4larger", float4larger },
+ { 211, 2, true, false, "float4smaller", float4smaller },
+ { 212, 1, true, false, "int4um", int4um },
+ { 213, 1, true, false, "int2um", int2um },
+ { 214, 1, true, false, "float8in", float8in },
+ { 215, 1, true, false, "float8out", float8out },
+ { 216, 2, true, false, "float8mul", float8mul },
+ { 217, 2, true, false, "float8div", float8div },
+ { 218, 2, true, false, "float8pl", float8pl },
+ { 219, 2, true, false, "float8mi", float8mi },
+ { 220, 1, true, false, "float8um", float8um },
+ { 221, 1, true, false, "float8abs", float8abs },
+ { 222, 2, true, false, "float8_accum", float8_accum },
+ { 223, 2, true, false, "float8larger", float8larger },
+ { 224, 2, true, false, "float8smaller", float8smaller },
+ { 225, 1, true, false, "lseg_center", lseg_center },
+ { 227, 1, true, false, "poly_center", poly_center },
+ { 228, 1, true, false, "dround", dround },
+ { 229, 1, true, false, "dtrunc", dtrunc },
+ { 230, 1, true, false, "dsqrt", dsqrt },
+ { 231, 1, true, false, "dcbrt", dcbrt },
+ { 232, 2, true, false, "dpow", dpow },
+ { 233, 1, true, false, "dexp", dexp },
+ { 234, 1, true, false, "dlog1", dlog1 },
+ { 235, 1, true, false, "i2tod", i2tod },
+ { 236, 1, true, false, "i2tof", i2tof },
+ { 237, 1, true, false, "dtoi2", dtoi2 },
+ { 238, 1, true, false, "ftoi2", ftoi2 },
+ { 239, 2, true, false, "line_distance", line_distance },
+ { 240, 2, true, false, "nameeqtext", nameeqtext },
+ { 241, 2, true, false, "namelttext", namelttext },
+ { 242, 2, true, false, "nameletext", nameletext },
+ { 243, 2, true, false, "namegetext", namegetext },
+ { 244, 2, true, false, "namegttext", namegttext },
+ { 245, 2, true, false, "namenetext", namenetext },
+ { 246, 2, true, false, "btnametextcmp", btnametextcmp },
+ { 247, 2, true, false, "texteqname", texteqname },
+ { 248, 2, true, false, "textltname", textltname },
+ { 249, 2, true, false, "textlename", textlename },
+ { 250, 2, true, false, "textgename", textgename },
+ { 251, 2, true, false, "textgtname", textgtname },
+ { 252, 2, true, false, "textnename", textnename },
+ { 253, 2, true, false, "bttextnamecmp", bttextnamecmp },
+ { 266, 2, true, false, "nameconcatoid", nameconcatoid },
+ { 267, 1, false, false, "table_am_handler_in", table_am_handler_in },
+ { 268, 1, true, false, "table_am_handler_out", table_am_handler_out },
+ { 274, 0, true, false, "timeofday", timeofday },
+ { 275, 3, true, false, "pg_nextoid", pg_nextoid },
+ { 276, 2, true, false, "float8_combine", float8_combine },
+ { 277, 2, true, false, "inter_sl", inter_sl },
+ { 278, 2, true, false, "inter_lb", inter_lb },
+ { 279, 2, true, false, "float48mul", float48mul },
+ { 280, 2, true, false, "float48div", float48div },
+ { 281, 2, true, false, "float48pl", float48pl },
+ { 282, 2, true, false, "float48mi", float48mi },
+ { 283, 2, true, false, "float84mul", float84mul },
+ { 284, 2, true, false, "float84div", float84div },
+ { 285, 2, true, false, "float84pl", float84pl },
+ { 286, 2, true, false, "float84mi", float84mi },
+ { 287, 2, true, false, "float4eq", float4eq },
+ { 288, 2, true, false, "float4ne", float4ne },
+ { 289, 2, true, false, "float4lt", float4lt },
+ { 290, 2, true, false, "float4le", float4le },
+ { 291, 2, true, false, "float4gt", float4gt },
+ { 292, 2, true, false, "float4ge", float4ge },
+ { 293, 2, true, false, "float8eq", float8eq },
+ { 294, 2, true, false, "float8ne", float8ne },
+ { 295, 2, true, false, "float8lt", float8lt },
+ { 296, 2, true, false, "float8le", float8le },
+ { 297, 2, true, false, "float8gt", float8gt },
+ { 298, 2, true, false, "float8ge", float8ge },
+ { 299, 2, true, false, "float48eq", float48eq },
+ { 300, 2, true, false, "float48ne", float48ne },
+ { 301, 2, true, false, "float48lt", float48lt },
+ { 302, 2, true, false, "float48le", float48le },
+ { 303, 2, true, false, "float48gt", float48gt },
+ { 304, 2, true, false, "float48ge", float48ge },
+ { 305, 2, true, false, "float84eq", float84eq },
+ { 306, 2, true, false, "float84ne", float84ne },
+ { 307, 2, true, false, "float84lt", float84lt },
+ { 308, 2, true, false, "float84le", float84le },
+ { 309, 2, true, false, "float84gt", float84gt },
+ { 310, 2, true, false, "float84ge", float84ge },
+ { 311, 1, true, false, "ftod", ftod },
+ { 312, 1, true, false, "dtof", dtof },
+ { 313, 1, true, false, "i2toi4", i2toi4 },
+ { 314, 1, true, false, "i4toi2", i4toi2 },
+ { 315, 0, true, false, "pg_jit_available", pg_jit_available },
+ { 316, 1, true, false, "i4tod", i4tod },
+ { 317, 1, true, false, "dtoi4", dtoi4 },
+ { 318, 1, true, false, "i4tof", i4tof },
+ { 319, 1, true, false, "ftoi4", ftoi4 },
+ { 320, 4, true, false, "width_bucket_float8", width_bucket_float8 },
+ { 321, 1, true, false, "json_in", json_in },
+ { 322, 1, true, false, "json_out", json_out },
+ { 323, 1, true, false, "json_recv", json_recv },
+ { 324, 1, true, false, "json_send", json_send },
+ { 326, 1, false, false, "index_am_handler_in", index_am_handler_in },
+ { 327, 1, true, false, "index_am_handler_out", index_am_handler_out },
+ { 328, 1, true, false, "hashmacaddr8", hashmacaddr8 },
+ { 329, 1, true, false, "hash_aclitem", hash_aclitem },
+ { 330, 1, true, false, "bthandler", bthandler },
+ { 331, 1, true, false, "hashhandler", hashhandler },
+ { 332, 1, true, false, "gisthandler", gisthandler },
+ { 333, 1, true, false, "ginhandler", ginhandler },
+ { 334, 1, true, false, "spghandler", spghandler },
+ { 335, 1, true, false, "brinhandler", brinhandler },
+ { 336, 4, true, false, "scalarlesel", scalarlesel },
+ { 337, 4, true, false, "scalargesel", scalargesel },
+ { 338, 1, true, false, "amvalidate", amvalidate },
+ { 339, 2, true, false, "poly_same", poly_same },
+ { 340, 2, true, false, "poly_contain", poly_contain },
+ { 341, 2, true, false, "poly_left", poly_left },
+ { 342, 2, true, false, "poly_overleft", poly_overleft },
+ { 343, 2, true, false, "poly_overright", poly_overright },
+ { 344, 2, true, false, "poly_right", poly_right },
+ { 345, 2, true, false, "poly_contained", poly_contained },
+ { 346, 2, true, false, "poly_overlap", poly_overlap },
+ { 347, 1, true, false, "poly_in", poly_in },
+ { 348, 1, true, false, "poly_out", poly_out },
+ { 350, 2, true, false, "btint2cmp", btint2cmp },
+ { 351, 2, true, false, "btint4cmp", btint4cmp },
+ { 354, 2, true, false, "btfloat4cmp", btfloat4cmp },
+ { 355, 2, true, false, "btfloat8cmp", btfloat8cmp },
+ { 356, 2, true, false, "btoidcmp", btoidcmp },
+ { 357, 2, true, false, "dist_bp", dist_bp },
+ { 358, 2, true, false, "btcharcmp", btcharcmp },
+ { 359, 2, true, false, "btnamecmp", btnamecmp },
+ { 360, 2, true, false, "bttextcmp", bttextcmp },
+ { 361, 2, true, false, "lseg_distance", lseg_distance },
+ { 362, 2, true, false, "lseg_interpt", lseg_interpt },
+ { 363, 2, true, false, "dist_ps", dist_ps },
+ { 364, 2, true, false, "dist_pb", dist_pb },
+ { 365, 2, true, false, "dist_sb", dist_sb },
+ { 366, 2, true, false, "close_ps", close_ps },
+ { 367, 2, true, false, "close_pb", close_pb },
+ { 368, 2, true, false, "close_sb", close_sb },
+ { 369, 2, true, false, "on_ps", on_ps },
+ { 370, 2, true, false, "path_distance", path_distance },
+ { 371, 2, true, false, "dist_ppath", dist_ppath },
+ { 372, 2, true, false, "on_sb", on_sb },
+ { 373, 2, true, false, "inter_sb", inter_sb },
+ { 376, 3, false, false, "text_to_array_null", text_to_array_null },
+ { 377, 2, true, false, "cash_cmp", cash_cmp },
+ { 378, 2, false, false, "array_append", array_append },
+ { 379, 2, false, false, "array_prepend", array_prepend },
+ { 380, 2, true, false, "dist_sp", dist_sp },
+ { 381, 2, true, false, "dist_bs", dist_bs },
+ { 382, 2, true, false, "btarraycmp", btarraycmp },
+ { 383, 2, false, false, "array_cat", array_cat },
+ { 384, 3, false, false, "array_to_text_null", array_to_text_null },
+ { 386, 5, true, false, "scalarlejoinsel", scalarlejoinsel },
+ { 390, 2, true, false, "array_ne", array_ne },
+ { 391, 2, true, false, "array_lt", array_lt },
+ { 392, 2, true, false, "array_gt", array_gt },
+ { 393, 2, true, false, "array_le", array_le },
+ { 394, 2, false, false, "text_to_array", text_to_array },
+ { 395, 2, true, false, "array_to_text", array_to_text },
+ { 396, 2, true, false, "array_ge", array_ge },
+ { 398, 5, true, false, "scalargejoinsel", scalargejoinsel },
+ { 399, 1, true, false, "hashmacaddr", hashmacaddr },
+ { 400, 1, true, false, "hashtext", hashtext },
+ { 401, 1, true, false, "rtrim1", rtrim1 },
+ { 404, 2, true, false, "btoidvectorcmp", btoidvectorcmp },
+ { 406, 1, true, false, "name_text", name_text },
+ { 407, 1, true, false, "text_name", text_name },
+ { 408, 1, true, false, "name_bpchar", name_bpchar },
+ { 409, 1, true, false, "bpchar_name", bpchar_name },
+ { 421, 2, true, false, "dist_pathp", dist_pathp },
+ { 422, 1, true, false, "hashinet", hashinet },
+ { 425, 2, true, false, "hashint4extended", hashint4extended },
+ { 432, 1, true, false, "hash_numeric", hash_numeric },
+ { 436, 1, true, false, "macaddr_in", macaddr_in },
+ { 437, 1, true, false, "macaddr_out", macaddr_out },
+ { 438, 1, false, false, "pg_num_nulls", pg_num_nulls },
+ { 440, 1, false, false, "pg_num_nonnulls", pg_num_nonnulls },
+ { 441, 2, true, false, "hashint2extended", hashint2extended },
+ { 442, 2, true, false, "hashint8extended", hashint8extended },
+ { 443, 2, true, false, "hashfloat4extended", hashfloat4extended },
+ { 444, 2, true, false, "hashfloat8extended", hashfloat8extended },
+ { 445, 2, true, false, "hashoidextended", hashoidextended },
+ { 446, 2, true, false, "hashcharextended", hashcharextended },
+ { 447, 2, true, false, "hashnameextended", hashnameextended },
+ { 448, 2, true, false, "hashtextextended", hashtextextended },
+ { 449, 1, true, false, "hashint2", hashint2 },
+ { 450, 1, true, false, "hashint4", hashint4 },
+ { 451, 1, true, false, "hashfloat4", hashfloat4 },
+ { 452, 1, true, false, "hashfloat8", hashfloat8 },
+ { 453, 1, true, false, "hashoid", hashoid },
+ { 454, 1, true, false, "hashchar", hashchar },
+ { 455, 1, true, false, "hashname", hashname },
+ { 456, 1, true, false, "hashvarlena", hashvarlena },
+ { 457, 1, true, false, "hashoidvector", hashoidvector },
+ { 458, 2, true, false, "text_larger", text_larger },
+ { 459, 2, true, false, "text_smaller", text_smaller },
+ { 460, 1, true, false, "int8in", int8in },
+ { 461, 1, true, false, "int8out", int8out },
+ { 462, 1, true, false, "int8um", int8um },
+ { 463, 2, true, false, "int8pl", int8pl },
+ { 464, 2, true, false, "int8mi", int8mi },
+ { 465, 2, true, false, "int8mul", int8mul },
+ { 466, 2, true, false, "int8div", int8div },
+ { 467, 2, true, false, "int8eq", int8eq },
+ { 468, 2, true, false, "int8ne", int8ne },
+ { 469, 2, true, false, "int8lt", int8lt },
+ { 470, 2, true, false, "int8gt", int8gt },
+ { 471, 2, true, false, "int8le", int8le },
+ { 472, 2, true, false, "int8ge", int8ge },
+ { 474, 2, true, false, "int84eq", int84eq },
+ { 475, 2, true, false, "int84ne", int84ne },
+ { 476, 2, true, false, "int84lt", int84lt },
+ { 477, 2, true, false, "int84gt", int84gt },
+ { 478, 2, true, false, "int84le", int84le },
+ { 479, 2, true, false, "int84ge", int84ge },
+ { 480, 1, true, false, "int84", int84 },
+ { 481, 1, true, false, "int48", int48 },
+ { 482, 1, true, false, "i8tod", i8tod },
+ { 483, 1, true, false, "dtoi8", dtoi8 },
+ { 515, 2, true, false, "array_larger", array_larger },
+ { 516, 2, true, false, "array_smaller", array_smaller },
+ { 598, 1, true, false, "inet_abbrev", inet_abbrev },
+ { 599, 1, true, false, "cidr_abbrev", cidr_abbrev },
+ { 605, 2, true, false, "inet_set_masklen", inet_set_masklen },
+ { 619, 2, true, false, "oidvectorne", oidvectorne },
+ { 626, 1, true, false, "hash_array", hash_array },
+ { 635, 2, true, false, "cidr_set_masklen", cidr_set_masklen },
+ { 636, 2, true, false, "pg_indexam_has_property", pg_indexam_has_property },
+ { 637, 2, true, false, "pg_index_has_property", pg_index_has_property },
+ { 638, 3, true, false, "pg_index_column_has_property", pg_index_column_has_property },
+ { 652, 1, true, false, "i8tof", i8tof },
+ { 653, 1, true, false, "ftoi8", ftoi8 },
+ { 655, 2, true, false, "namelt", namelt },
+ { 656, 2, true, false, "namele", namele },
+ { 657, 2, true, false, "namegt", namegt },
+ { 658, 2, true, false, "namege", namege },
+ { 659, 2, true, false, "namene", namene },
+ { 668, 3, true, false, "bpchar", bpchar },
+ { 669, 3, true, false, "varchar", varchar },
+ { 676, 2, true, false, "pg_indexam_progress_phasename", pg_indexam_progress_phasename },
+ { 677, 2, true, false, "oidvectorlt", oidvectorlt },
+ { 678, 2, true, false, "oidvectorle", oidvectorle },
+ { 679, 2, true, false, "oidvectoreq", oidvectoreq },
+ { 680, 2, true, false, "oidvectorge", oidvectorge },
+ { 681, 2, true, false, "oidvectorgt", oidvectorgt },
+ { 683, 1, true, false, "network_network", network_network },
+ { 696, 1, true, false, "network_netmask", network_netmask },
+ { 697, 1, true, false, "network_masklen", network_masklen },
+ { 698, 1, true, false, "network_broadcast", network_broadcast },
+ { 699, 1, true, false, "network_host", network_host },
+ { 702, 2, true, false, "dist_lp", dist_lp },
+ { 704, 2, true, false, "dist_ls", dist_ls },
+ { 710, 0, true, false, "current_user", current_user },
+ { 711, 1, true, false, "network_family", network_family },
+ { 714, 1, true, false, "int82", int82 },
+ { 715, 1, true, false, "be_lo_create", be_lo_create },
+ { 716, 2, true, false, "oidlt", oidlt },
+ { 717, 2, true, false, "oidle", oidle },
+ { 720, 1, true, false, "byteaoctetlen", byteaoctetlen },
+ { 721, 2, true, false, "byteaGetByte", byteaGetByte },
+ { 722, 3, true, false, "byteaSetByte", byteaSetByte },
+ { 723, 2, true, false, "byteaGetBit", byteaGetBit },
+ { 724, 3, true, false, "byteaSetBit", byteaSetBit },
+ { 725, 2, true, false, "dist_pl", dist_pl },
+ { 727, 2, true, false, "dist_sl", dist_sl },
+ { 728, 2, true, false, "dist_cpoly", dist_cpoly },
+ { 729, 2, true, false, "poly_distance", poly_distance },
+ { 730, 1, true, false, "network_show", network_show },
+ { 740, 2, true, false, "text_lt", text_lt },
+ { 741, 2, true, false, "text_le", text_le },
+ { 742, 2, true, false, "text_gt", text_gt },
+ { 743, 2, true, false, "text_ge", text_ge },
+ { 744, 2, true, false, "array_eq", array_eq },
+ { 745, 0, true, false, "current_user", current_user },
+ { 746, 0, true, false, "session_user", session_user },
+ { 747, 1, true, false, "array_dims", array_dims },
+ { 748, 1, true, false, "array_ndims", array_ndims },
+ { 749, 4, true, false, "byteaoverlay", byteaoverlay },
+ { 750, 3, true, false, "array_in", array_in },
+ { 751, 1, true, false, "array_out", array_out },
+ { 752, 3, true, false, "byteaoverlay_no_len", byteaoverlay_no_len },
+ { 753, 1, true, false, "macaddr_trunc", macaddr_trunc },
+ { 754, 1, true, false, "int28", int28 },
+ { 764, 1, true, false, "be_lo_import", be_lo_import },
+ { 765, 2, true, false, "be_lo_export", be_lo_export },
+ { 766, 1, true, false, "int4inc", int4inc },
+ { 767, 2, true, false, "be_lo_import_with_oid", be_lo_import_with_oid },
+ { 768, 2, true, false, "int4larger", int4larger },
+ { 769, 2, true, false, "int4smaller", int4smaller },
+ { 770, 2, true, false, "int2larger", int2larger },
+ { 771, 2, true, false, "int2smaller", int2smaller },
+ { 772, 2, true, false, "hashvarlenaextended", hashvarlenaextended },
+ { 776, 2, true, false, "hashoidvectorextended", hashoidvectorextended },
+ { 777, 2, true, false, "hash_aclitem_extended", hash_aclitem_extended },
+ { 778, 2, true, false, "hashmacaddrextended", hashmacaddrextended },
+ { 779, 2, true, false, "hashinetextended", hashinetextended },
+ { 780, 2, true, false, "hash_numeric_extended", hash_numeric_extended },
+ { 781, 2, true, false, "hashmacaddr8extended", hashmacaddr8extended },
+ { 782, 2, true, false, "hash_array_extended", hash_array_extended },
+ { 785, 2, true, false, "dist_polyc", dist_polyc },
+ { 810, 0, true, false, "pg_client_encoding", pg_client_encoding },
+ { 817, 0, false, false, "current_query", current_query },
+ { 830, 2, true, false, "macaddr_eq", macaddr_eq },
+ { 831, 2, true, false, "macaddr_lt", macaddr_lt },
+ { 832, 2, true, false, "macaddr_le", macaddr_le },
+ { 833, 2, true, false, "macaddr_gt", macaddr_gt },
+ { 834, 2, true, false, "macaddr_ge", macaddr_ge },
+ { 835, 2, true, false, "macaddr_ne", macaddr_ne },
+ { 836, 2, true, false, "macaddr_cmp", macaddr_cmp },
+ { 837, 2, true, false, "int82pl", int82pl },
+ { 838, 2, true, false, "int82mi", int82mi },
+ { 839, 2, true, false, "int82mul", int82mul },
+ { 840, 2, true, false, "int82div", int82div },
+ { 841, 2, true, false, "int28pl", int28pl },
+ { 842, 2, true, false, "btint8cmp", btint8cmp },
+ { 846, 2, true, false, "cash_mul_flt4", cash_mul_flt4 },
+ { 847, 2, true, false, "cash_div_flt4", cash_div_flt4 },
+ { 848, 2, true, false, "flt4_mul_cash", flt4_mul_cash },
+ { 849, 2, true, false, "textpos", textpos },
+ { 850, 2, true, false, "textlike", textlike },
+ { 851, 2, true, false, "textnlike", textnlike },
+ { 852, 2, true, false, "int48eq", int48eq },
+ { 853, 2, true, false, "int48ne", int48ne },
+ { 854, 2, true, false, "int48lt", int48lt },
+ { 855, 2, true, false, "int48gt", int48gt },
+ { 856, 2, true, false, "int48le", int48le },
+ { 857, 2, true, false, "int48ge", int48ge },
+ { 858, 2, true, false, "namelike", namelike },
+ { 859, 2, true, false, "namenlike", namenlike },
+ { 860, 1, true, false, "char_bpchar", char_bpchar },
+ { 861, 0, true, false, "current_database", current_database },
+ { 862, 2, true, false, "int4_mul_cash", int4_mul_cash },
+ { 863, 2, true, false, "int2_mul_cash", int2_mul_cash },
+ { 864, 2, true, false, "cash_mul_int4", cash_mul_int4 },
+ { 865, 2, true, false, "cash_div_int4", cash_div_int4 },
+ { 866, 2, true, false, "cash_mul_int2", cash_mul_int2 },
+ { 867, 2, true, false, "cash_div_int2", cash_div_int2 },
+ { 868, 2, true, false, "textpos", textpos },
+ { 870, 1, true, false, "lower", lower },
+ { 871, 1, true, false, "upper", upper },
+ { 872, 1, true, false, "initcap", initcap },
+ { 873, 3, true, false, "lpad", lpad },
+ { 874, 3, true, false, "rpad", rpad },
+ { 875, 2, true, false, "ltrim", ltrim },
+ { 876, 2, true, false, "rtrim", rtrim },
+ { 877, 3, true, false, "text_substr", text_substr },
+ { 878, 3, true, false, "translate", translate },
+ { 881, 1, true, false, "ltrim1", ltrim1 },
+ { 882, 1, true, false, "rtrim1", rtrim1 },
+ { 883, 2, true, false, "text_substr_no_len", text_substr_no_len },
+ { 884, 2, true, false, "btrim", btrim },
+ { 885, 1, true, false, "btrim1", btrim1 },
+ { 886, 1, true, false, "cash_in", cash_in },
+ { 887, 1, true, false, "cash_out", cash_out },
+ { 888, 2, true, false, "cash_eq", cash_eq },
+ { 889, 2, true, false, "cash_ne", cash_ne },
+ { 890, 2, true, false, "cash_lt", cash_lt },
+ { 891, 2, true, false, "cash_le", cash_le },
+ { 892, 2, true, false, "cash_gt", cash_gt },
+ { 893, 2, true, false, "cash_ge", cash_ge },
+ { 894, 2, true, false, "cash_pl", cash_pl },
+ { 895, 2, true, false, "cash_mi", cash_mi },
+ { 896, 2, true, false, "cash_mul_flt8", cash_mul_flt8 },
+ { 897, 2, true, false, "cash_div_flt8", cash_div_flt8 },
+ { 898, 2, true, false, "cashlarger", cashlarger },
+ { 899, 2, true, false, "cashsmaller", cashsmaller },
+ { 910, 1, true, false, "inet_in", inet_in },
+ { 911, 1, true, false, "inet_out", inet_out },
+ { 919, 2, true, false, "flt8_mul_cash", flt8_mul_cash },
+ { 920, 2, true, false, "network_eq", network_eq },
+ { 921, 2, true, false, "network_lt", network_lt },
+ { 922, 2, true, false, "network_le", network_le },
+ { 923, 2, true, false, "network_gt", network_gt },
+ { 924, 2, true, false, "network_ge", network_ge },
+ { 925, 2, true, false, "network_ne", network_ne },
+ { 926, 2, true, false, "network_cmp", network_cmp },
+ { 927, 2, true, false, "network_sub", network_sub },
+ { 928, 2, true, false, "network_subeq", network_subeq },
+ { 929, 2, true, false, "network_sup", network_sup },
+ { 930, 2, true, false, "network_supeq", network_supeq },
+ { 935, 1, true, false, "cash_words", cash_words },
+ { 936, 3, true, false, "text_substr", text_substr },
+ { 937, 2, true, false, "text_substr_no_len", text_substr_no_len },
+ { 938, 3, true, true, "generate_series_timestamp", generate_series_timestamp },
+ { 939, 3, true, true, "generate_series_timestamptz", generate_series_timestamptz },
+ { 940, 2, true, false, "int2mod", int2mod },
+ { 941, 2, true, false, "int4mod", int4mod },
+ { 942, 2, true, false, "int28mi", int28mi },
+ { 943, 2, true, false, "int28mul", int28mul },
+ { 944, 1, true, false, "text_char", text_char },
+ { 945, 2, true, false, "int8mod", int8mod },
+ { 946, 1, true, false, "char_text", char_text },
+ { 947, 2, true, false, "int8mod", int8mod },
+ { 948, 2, true, false, "int28div", int28div },
+ { 949, 1, true, false, "hashint8", hashint8 },
+ { 952, 2, true, false, "be_lo_open", be_lo_open },
+ { 953, 1, true, false, "be_lo_close", be_lo_close },
+ { 954, 2, true, false, "be_loread", be_loread },
+ { 955, 2, true, false, "be_lowrite", be_lowrite },
+ { 956, 3, true, false, "be_lo_lseek", be_lo_lseek },
+ { 957, 1, true, false, "be_lo_creat", be_lo_creat },
+ { 958, 1, true, false, "be_lo_tell", be_lo_tell },
+ { 959, 2, true, false, "on_pl", on_pl },
+ { 960, 2, true, false, "on_sl", on_sl },
+ { 961, 2, true, false, "close_pl", close_pl },
+ { 964, 1, true, false, "be_lo_unlink", be_lo_unlink },
+ { 972, 2, true, false, "hashbpcharextended", hashbpcharextended },
+ { 973, 2, true, false, "path_inter", path_inter },
+ { 975, 1, true, false, "box_area", box_area },
+ { 976, 1, true, false, "box_width", box_width },
+ { 977, 1, true, false, "box_height", box_height },
+ { 978, 2, true, false, "box_distance", box_distance },
+ { 979, 1, true, false, "path_area", path_area },
+ { 980, 2, true, false, "box_intersect", box_intersect },
+ { 981, 1, true, false, "box_diagonal", box_diagonal },
+ { 982, 2, true, false, "path_n_lt", path_n_lt },
+ { 983, 2, true, false, "path_n_gt", path_n_gt },
+ { 984, 2, true, false, "path_n_eq", path_n_eq },
+ { 985, 2, true, false, "path_n_le", path_n_le },
+ { 986, 2, true, false, "path_n_ge", path_n_ge },
+ { 987, 1, true, false, "path_length", path_length },
+ { 988, 2, true, false, "point_ne", point_ne },
+ { 989, 2, true, false, "point_vert", point_vert },
+ { 990, 2, true, false, "point_horiz", point_horiz },
+ { 991, 2, true, false, "point_distance", point_distance },
+ { 992, 2, true, false, "point_slope", point_slope },
+ { 993, 2, true, false, "lseg_construct", lseg_construct },
+ { 994, 2, true, false, "lseg_intersect", lseg_intersect },
+ { 995, 2, true, false, "lseg_parallel", lseg_parallel },
+ { 996, 2, true, false, "lseg_perp", lseg_perp },
+ { 997, 1, true, false, "lseg_vertical", lseg_vertical },
+ { 998, 1, true, false, "lseg_horizontal", lseg_horizontal },
+ { 999, 2, true, false, "lseg_eq", lseg_eq },
+ { 1004, 2, true, false, "be_lo_truncate", be_lo_truncate },
+ { 1023, 1, true, false, "textlike_support", textlike_support },
+ { 1024, 1, true, false, "texticregexeq_support", texticregexeq_support },
+ { 1025, 1, true, false, "texticlike_support", texticlike_support },
+ { 1026, 2, true, false, "timestamptz_izone", timestamptz_izone },
+ { 1030, 1, true, false, "gist_point_compress", gist_point_compress },
+ { 1031, 1, true, false, "aclitemin", aclitemin },
+ { 1032, 1, true, false, "aclitemout", aclitemout },
+ { 1035, 2, true, false, "aclinsert", aclinsert },
+ { 1036, 2, true, false, "aclremove", aclremove },
+ { 1037, 2, true, false, "aclcontains", aclcontains },
+ { 1039, 0, true, false, "getdatabaseencoding", getdatabaseencoding },
+ { 1044, 3, true, false, "bpcharin", bpcharin },
+ { 1045, 1, true, false, "bpcharout", bpcharout },
+ { 1046, 3, true, false, "varcharin", varcharin },
+ { 1047, 1, true, false, "varcharout", varcharout },
+ { 1048, 2, true, false, "bpchareq", bpchareq },
+ { 1049, 2, true, false, "bpcharlt", bpcharlt },
+ { 1050, 2, true, false, "bpcharle", bpcharle },
+ { 1051, 2, true, false, "bpchargt", bpchargt },
+ { 1052, 2, true, false, "bpcharge", bpcharge },
+ { 1053, 2, true, false, "bpcharne", bpcharne },
+ { 1062, 2, true, false, "aclitem_eq", aclitem_eq },
+ { 1063, 2, true, false, "bpchar_larger", bpchar_larger },
+ { 1064, 2, true, false, "bpchar_smaller", bpchar_smaller },
+ { 1065, 0, true, true, "pg_prepared_xact", pg_prepared_xact },
+ { 1066, 3, true, true, "generate_series_step_int4", generate_series_step_int4 },
+ { 1067, 2, true, true, "generate_series_int4", generate_series_int4 },
+ { 1068, 3, true, true, "generate_series_step_int8", generate_series_step_int8 },
+ { 1069, 2, true, true, "generate_series_int8", generate_series_int8 },
+ { 1078, 2, true, false, "bpcharcmp", bpcharcmp },
+ { 1079, 1, true, false, "text_regclass", text_regclass },
+ { 1080, 1, true, false, "hashbpchar", hashbpchar },
+ { 1081, 2, false, false, "format_type", format_type },
+ { 1084, 1, true, false, "date_in", date_in },
+ { 1085, 1, true, false, "date_out", date_out },
+ { 1086, 2, true, false, "date_eq", date_eq },
+ { 1087, 2, true, false, "date_lt", date_lt },
+ { 1088, 2, true, false, "date_le", date_le },
+ { 1089, 2, true, false, "date_gt", date_gt },
+ { 1090, 2, true, false, "date_ge", date_ge },
+ { 1091, 2, true, false, "date_ne", date_ne },
+ { 1092, 2, true, false, "date_cmp", date_cmp },
+ { 1102, 2, true, false, "time_lt", time_lt },
+ { 1103, 2, true, false, "time_le", time_le },
+ { 1104, 2, true, false, "time_gt", time_gt },
+ { 1105, 2, true, false, "time_ge", time_ge },
+ { 1106, 2, true, false, "time_ne", time_ne },
+ { 1107, 2, true, false, "time_cmp", time_cmp },
+ { 1136, 0, false, false, "pg_stat_get_wal", pg_stat_get_wal },
+ { 1137, 0, true, false, "pg_get_wal_replay_pause_state", pg_get_wal_replay_pause_state },
+ { 1138, 2, true, false, "date_larger", date_larger },
+ { 1139, 2, true, false, "date_smaller", date_smaller },
+ { 1140, 2, true, false, "date_mi", date_mi },
+ { 1141, 2, true, false, "date_pli", date_pli },
+ { 1142, 2, true, false, "date_mii", date_mii },
+ { 1143, 3, true, false, "time_in", time_in },
+ { 1144, 1, true, false, "time_out", time_out },
+ { 1145, 2, true, false, "time_eq", time_eq },
+ { 1146, 2, true, false, "circle_add_pt", circle_add_pt },
+ { 1147, 2, true, false, "circle_sub_pt", circle_sub_pt },
+ { 1148, 2, true, false, "circle_mul_pt", circle_mul_pt },
+ { 1149, 2, true, false, "circle_div_pt", circle_div_pt },
+ { 1150, 3, true, false, "timestamptz_in", timestamptz_in },
+ { 1151, 1, true, false, "timestamptz_out", timestamptz_out },
+ { 1152, 2, true, false, "timestamp_eq", timestamp_eq },
+ { 1153, 2, true, false, "timestamp_ne", timestamp_ne },
+ { 1154, 2, true, false, "timestamp_lt", timestamp_lt },
+ { 1155, 2, true, false, "timestamp_le", timestamp_le },
+ { 1156, 2, true, false, "timestamp_ge", timestamp_ge },
+ { 1157, 2, true, false, "timestamp_gt", timestamp_gt },
+ { 1158, 1, true, false, "float8_timestamptz", float8_timestamptz },
+ { 1159, 2, true, false, "timestamptz_zone", timestamptz_zone },
+ { 1160, 3, true, false, "interval_in", interval_in },
+ { 1161, 1, true, false, "interval_out", interval_out },
+ { 1162, 2, true, false, "interval_eq", interval_eq },
+ { 1163, 2, true, false, "interval_ne", interval_ne },
+ { 1164, 2, true, false, "interval_lt", interval_lt },
+ { 1165, 2, true, false, "interval_le", interval_le },
+ { 1166, 2, true, false, "interval_ge", interval_ge },
+ { 1167, 2, true, false, "interval_gt", interval_gt },
+ { 1168, 1, true, false, "interval_um", interval_um },
+ { 1169, 2, true, false, "interval_pl", interval_pl },
+ { 1170, 2, true, false, "interval_mi", interval_mi },
+ { 1171, 2, true, false, "timestamptz_part", timestamptz_part },
+ { 1172, 2, true, false, "interval_part", interval_part },
+ { 1173, 1, true, false, "network_subset_support", network_subset_support },
+ { 1174, 1, true, false, "date_timestamptz", date_timestamptz },
+ { 1175, 1, true, false, "interval_justify_hours", interval_justify_hours },
+ { 1177, 4, true, false, "jsonb_path_exists_tz", jsonb_path_exists_tz },
+ { 1178, 1, true, false, "timestamptz_date", timestamptz_date },
+ { 1179, 4, true, true, "jsonb_path_query_tz", jsonb_path_query_tz },
+ { 1180, 4, true, false, "jsonb_path_query_array_tz", jsonb_path_query_array_tz },
+ { 1181, 1, true, false, "xid_age", xid_age },
+ { 1188, 2, true, false, "timestamp_mi", timestamp_mi },
+ { 1189, 2, true, false, "timestamptz_pl_interval", timestamptz_pl_interval },
+ { 1190, 2, true, false, "timestamptz_mi_interval", timestamptz_mi_interval },
+ { 1191, 3, true, true, "generate_subscripts", generate_subscripts },
+ { 1192, 2, true, true, "generate_subscripts_nodir", generate_subscripts_nodir },
+ { 1193, 2, false, false, "array_fill", array_fill },
+ { 1194, 1, true, false, "dlog10", dlog10 },
+ { 1195, 2, true, false, "timestamp_smaller", timestamp_smaller },
+ { 1196, 2, true, false, "timestamp_larger", timestamp_larger },
+ { 1197, 2, true, false, "interval_smaller", interval_smaller },
+ { 1198, 2, true, false, "interval_larger", interval_larger },
+ { 1199, 2, true, false, "timestamptz_age", timestamptz_age },
+ { 1200, 2, true, false, "interval_scale", interval_scale },
+ { 1217, 2, true, false, "timestamptz_trunc", timestamptz_trunc },
+ { 1218, 2, true, false, "interval_trunc", interval_trunc },
+ { 1219, 1, true, false, "int8inc", int8inc },
+ { 1230, 1, true, false, "int8abs", int8abs },
+ { 1236, 2, true, false, "int8larger", int8larger },
+ { 1237, 2, true, false, "int8smaller", int8smaller },
+ { 1238, 2, true, false, "texticregexeq", texticregexeq },
+ { 1239, 2, true, false, "texticregexne", texticregexne },
+ { 1240, 2, true, false, "nameicregexeq", nameicregexeq },
+ { 1241, 2, true, false, "nameicregexne", nameicregexne },
+ { 1242, 1, true, false, "boolin", boolin },
+ { 1243, 1, true, false, "boolout", boolout },
+ { 1244, 1, true, false, "byteain", byteain },
+ { 1245, 1, true, false, "charin", charin },
+ { 1246, 2, true, false, "charlt", charlt },
+ { 1250, 0, true, false, "unique_key_recheck", unique_key_recheck },
+ { 1251, 1, true, false, "int4abs", int4abs },
+ { 1252, 2, true, false, "nameregexne", nameregexne },
+ { 1253, 1, true, false, "int2abs", int2abs },
+ { 1254, 2, true, false, "textregexeq", textregexeq },
+ { 1256, 2, true, false, "textregexne", textregexne },
+ { 1257, 1, true, false, "textlen", textlen },
+ { 1258, 2, true, false, "textcat", textcat },
+ { 1264, 1, true, false, "PG_char_to_encoding", PG_char_to_encoding },
+ { 1265, 2, true, false, "tidne", tidne },
+ { 1267, 1, true, false, "cidr_in", cidr_in },
+ { 1268, 2, true, false, "parse_ident", parse_ident },
+ { 1269, 1, true, false, "pg_column_size", pg_column_size },
+ { 1271, 4, false, false, "overlaps_timetz", overlaps_timetz },
+ { 1272, 2, true, false, "datetime_timestamp", datetime_timestamp },
+ { 1273, 2, true, false, "timetz_part", timetz_part },
+ { 1274, 2, true, false, "int84pl", int84pl },
+ { 1275, 2, true, false, "int84mi", int84mi },
+ { 1276, 2, true, false, "int84mul", int84mul },
+ { 1277, 2, true, false, "int84div", int84div },
+ { 1278, 2, true, false, "int48pl", int48pl },
+ { 1279, 2, true, false, "int48mi", int48mi },
+ { 1280, 2, true, false, "int48mul", int48mul },
+ { 1281, 2, true, false, "int48div", int48div },
+ { 1282, 1, true, false, "quote_ident", quote_ident },
+ { 1283, 1, true, false, "quote_literal", quote_literal },
+ { 1284, 3, true, false, "timestamptz_trunc_zone", timestamptz_trunc_zone },
+ { 1286, 3, false, false, "array_fill_with_lower_bounds", array_fill_with_lower_bounds },
+ { 1287, 1, true, false, "i8tooid", i8tooid },
+ { 1288, 1, true, false, "oidtoi8", oidtoi8 },
+ { 1289, 1, false, false, "quote_nullable", quote_nullable },
+ { 1291, 0, true, false, "suppress_redundant_updates_trigger", suppress_redundant_updates_trigger },
+ { 1292, 2, true, false, "tideq", tideq },
+ { 1293, 1, true, true, "multirange_unnest", multirange_unnest },
+ { 1294, 2, true, false, "currtid_byrelname", currtid_byrelname },
+ { 1295, 1, true, false, "interval_justify_days", interval_justify_days },
+ { 1297, 2, true, false, "datetimetz_timestamptz", datetimetz_timestamptz },
+ { 1299, 0, true, false, "now", now },
+ { 1300, 4, true, false, "positionsel", positionsel },
+ { 1301, 5, true, false, "positionjoinsel", positionjoinsel },
+ { 1302, 4, true, false, "contsel", contsel },
+ { 1303, 5, true, false, "contjoinsel", contjoinsel },
+ { 1304, 4, false, false, "overlaps_timestamp", overlaps_timestamp },
+ { 1308, 4, false, false, "overlaps_time", overlaps_time },
+ { 1312, 3, true, false, "timestamp_in", timestamp_in },
+ { 1313, 1, true, false, "timestamp_out", timestamp_out },
+ { 1314, 2, true, false, "timestamp_cmp", timestamp_cmp },
+ { 1315, 2, true, false, "interval_cmp", interval_cmp },
+ { 1316, 1, true, false, "timestamp_time", timestamp_time },
+ { 1317, 1, true, false, "textlen", textlen },
+ { 1318, 1, true, false, "bpcharlen", bpcharlen },
+ { 1319, 2, true, false, "xideq", xideq },
+ { 1326, 2, true, false, "interval_div", interval_div },
+ { 1339, 1, true, false, "dlog10", dlog10 },
+ { 1340, 1, true, false, "dlog10", dlog10 },
+ { 1341, 1, true, false, "dlog1", dlog1 },
+ { 1342, 1, true, false, "dround", dround },
+ { 1343, 1, true, false, "dtrunc", dtrunc },
+ { 1344, 1, true, false, "dsqrt", dsqrt },
+ { 1345, 1, true, false, "dcbrt", dcbrt },
+ { 1346, 2, true, false, "dpow", dpow },
+ { 1347, 1, true, false, "dexp", dexp },
+ { 1349, 1, true, false, "oidvectortypes", oidvectortypes },
+ { 1350, 3, true, false, "timetz_in", timetz_in },
+ { 1351, 1, true, false, "timetz_out", timetz_out },
+ { 1352, 2, true, false, "timetz_eq", timetz_eq },
+ { 1353, 2, true, false, "timetz_ne", timetz_ne },
+ { 1354, 2, true, false, "timetz_lt", timetz_lt },
+ { 1355, 2, true, false, "timetz_le", timetz_le },
+ { 1356, 2, true, false, "timetz_ge", timetz_ge },
+ { 1357, 2, true, false, "timetz_gt", timetz_gt },
+ { 1358, 2, true, false, "timetz_cmp", timetz_cmp },
+ { 1359, 2, true, false, "datetimetz_timestamptz", datetimetz_timestamptz },
+ { 1362, 1, true, false, "network_hostmask", network_hostmask },
+ { 1364, 1, true, false, "textregexeq_support", textregexeq_support },
+ { 1365, 4, true, false, "makeaclitem", makeaclitem },
+ { 1367, 1, true, false, "bpcharlen", bpcharlen },
+ { 1368, 2, true, false, "dpow", dpow },
+ { 1369, 1, true, false, "textlen", textlen },
+ { 1370, 1, true, false, "time_interval", time_interval },
+ { 1371, 0, true, true, "pg_lock_status", pg_lock_status },
+ { 1372, 1, true, false, "bpcharlen", bpcharlen },
+ { 1373, 1, true, false, "date_finite", date_finite },
+ { 1374, 1, true, false, "textoctetlen", textoctetlen },
+ { 1375, 1, true, false, "bpcharoctetlen", bpcharoctetlen },
+ { 1376, 1, true, false, "numeric_fac", numeric_fac },
+ { 1377, 2, true, false, "time_larger", time_larger },
+ { 1378, 2, true, false, "time_smaller", time_smaller },
+ { 1379, 2, true, false, "timetz_larger", timetz_larger },
+ { 1380, 2, true, false, "timetz_smaller", timetz_smaller },
+ { 1381, 1, true, false, "textlen", textlen },
+ { 1385, 2, true, false, "time_part", time_part },
+ { 1387, 1, true, false, "pg_get_constraintdef", pg_get_constraintdef },
+ { 1388, 1, true, false, "timestamptz_timetz", timestamptz_timetz },
+ { 1389, 1, true, false, "timestamp_finite", timestamp_finite },
+ { 1390, 1, true, false, "interval_finite", interval_finite },
+ { 1391, 1, true, false, "pg_stat_get_backend_start", pg_stat_get_backend_start },
+ { 1392, 1, true, false, "pg_stat_get_backend_client_addr", pg_stat_get_backend_client_addr },
+ { 1393, 1, true, false, "pg_stat_get_backend_client_port", pg_stat_get_backend_client_port },
+ { 1394, 1, true, false, "float4abs", float4abs },
+ { 1395, 1, true, false, "float8abs", float8abs },
+ { 1396, 1, true, false, "int8abs", int8abs },
+ { 1397, 1, true, false, "int4abs", int4abs },
+ { 1398, 1, true, false, "int2abs", int2abs },
+ { 1400, 1, true, false, "text_name", text_name },
+ { 1401, 1, true, false, "name_text", name_text },
+ { 1402, 0, true, false, "current_schema", current_schema },
+ { 1403, 1, true, false, "current_schemas", current_schemas },
+ { 1404, 4, true, false, "textoverlay", textoverlay },
+ { 1405, 3, true, false, "textoverlay_no_len", textoverlay_no_len },
+ { 1406, 2, true, false, "point_vert", point_vert },
+ { 1407, 2, true, false, "point_horiz", point_horiz },
+ { 1408, 2, true, false, "lseg_parallel", lseg_parallel },
+ { 1409, 2, true, false, "lseg_perp", lseg_perp },
+ { 1410, 1, true, false, "lseg_vertical", lseg_vertical },
+ { 1411, 1, true, false, "lseg_horizontal", lseg_horizontal },
+ { 1412, 2, true, false, "line_parallel", line_parallel },
+ { 1413, 2, true, false, "line_perp", line_perp },
+ { 1414, 1, true, false, "line_vertical", line_vertical },
+ { 1415, 1, true, false, "line_horizontal", line_horizontal },
+ { 1416, 1, true, false, "circle_center", circle_center },
+ { 1419, 1, true, false, "interval_time", interval_time },
+ { 1421, 2, true, false, "points_box", points_box },
+ { 1422, 2, true, false, "box_add", box_add },
+ { 1423, 2, true, false, "box_sub", box_sub },
+ { 1424, 2, true, false, "box_mul", box_mul },
+ { 1425, 2, true, false, "box_div", box_div },
+ { 1427, 1, true, false, "cidr_out", cidr_out },
+ { 1428, 2, true, false, "poly_contain_pt", poly_contain_pt },
+ { 1429, 2, true, false, "pt_contained_poly", pt_contained_poly },
+ { 1430, 1, true, false, "path_isclosed", path_isclosed },
+ { 1431, 1, true, false, "path_isopen", path_isopen },
+ { 1432, 1, true, false, "path_npoints", path_npoints },
+ { 1433, 1, true, false, "path_close", path_close },
+ { 1434, 1, true, false, "path_open", path_open },
+ { 1435, 2, true, false, "path_add", path_add },
+ { 1436, 2, true, false, "path_add_pt", path_add_pt },
+ { 1437, 2, true, false, "path_sub_pt", path_sub_pt },
+ { 1438, 2, true, false, "path_mul_pt", path_mul_pt },
+ { 1439, 2, true, false, "path_div_pt", path_div_pt },
+ { 1440, 2, true, false, "construct_point", construct_point },
+ { 1441, 2, true, false, "point_add", point_add },
+ { 1442, 2, true, false, "point_sub", point_sub },
+ { 1443, 2, true, false, "point_mul", point_mul },
+ { 1444, 2, true, false, "point_div", point_div },
+ { 1445, 1, true, false, "poly_npoints", poly_npoints },
+ { 1446, 1, true, false, "poly_box", poly_box },
+ { 1447, 1, true, false, "poly_path", poly_path },
+ { 1448, 1, true, false, "box_poly", box_poly },
+ { 1449, 1, true, false, "path_poly", path_poly },
+ { 1450, 1, true, false, "circle_in", circle_in },
+ { 1451, 1, true, false, "circle_out", circle_out },
+ { 1452, 2, true, false, "circle_same", circle_same },
+ { 1453, 2, true, false, "circle_contain", circle_contain },
+ { 1454, 2, true, false, "circle_left", circle_left },
+ { 1455, 2, true, false, "circle_overleft", circle_overleft },
+ { 1456, 2, true, false, "circle_overright", circle_overright },
+ { 1457, 2, true, false, "circle_right", circle_right },
+ { 1458, 2, true, false, "circle_contained", circle_contained },
+ { 1459, 2, true, false, "circle_overlap", circle_overlap },
+ { 1460, 2, true, false, "circle_below", circle_below },
+ { 1461, 2, true, false, "circle_above", circle_above },
+ { 1462, 2, true, false, "circle_eq", circle_eq },
+ { 1463, 2, true, false, "circle_ne", circle_ne },
+ { 1464, 2, true, false, "circle_lt", circle_lt },
+ { 1465, 2, true, false, "circle_gt", circle_gt },
+ { 1466, 2, true, false, "circle_le", circle_le },
+ { 1467, 2, true, false, "circle_ge", circle_ge },
+ { 1468, 1, true, false, "circle_area", circle_area },
+ { 1469, 1, true, false, "circle_diameter", circle_diameter },
+ { 1470, 1, true, false, "circle_radius", circle_radius },
+ { 1471, 2, true, false, "circle_distance", circle_distance },
+ { 1472, 1, true, false, "circle_center", circle_center },
+ { 1473, 2, true, false, "cr_circle", cr_circle },
+ { 1474, 1, true, false, "poly_circle", poly_circle },
+ { 1475, 2, true, false, "circle_poly", circle_poly },
+ { 1476, 2, true, false, "dist_pc", dist_pc },
+ { 1477, 2, true, false, "circle_contain_pt", circle_contain_pt },
+ { 1478, 2, true, false, "pt_contained_circle", pt_contained_circle },
+ { 1479, 1, true, false, "box_circle", box_circle },
+ { 1480, 1, true, false, "circle_box", circle_box },
+ { 1482, 2, true, false, "lseg_ne", lseg_ne },
+ { 1483, 2, true, false, "lseg_lt", lseg_lt },
+ { 1484, 2, true, false, "lseg_le", lseg_le },
+ { 1485, 2, true, false, "lseg_gt", lseg_gt },
+ { 1486, 2, true, false, "lseg_ge", lseg_ge },
+ { 1487, 1, true, false, "lseg_length", lseg_length },
+ { 1488, 2, true, false, "close_ls", close_ls },
+ { 1489, 2, true, false, "close_lseg", close_lseg },
+ { 1490, 1, true, false, "line_in", line_in },
+ { 1491, 1, true, false, "line_out", line_out },
+ { 1492, 2, true, false, "line_eq", line_eq },
+ { 1493, 2, true, false, "line_construct_pp", line_construct_pp },
+ { 1494, 2, true, false, "line_interpt", line_interpt },
+ { 1495, 2, true, false, "line_intersect", line_intersect },
+ { 1496, 2, true, false, "line_parallel", line_parallel },
+ { 1497, 2, true, false, "line_perp", line_perp },
+ { 1498, 1, true, false, "line_vertical", line_vertical },
+ { 1499, 1, true, false, "line_horizontal", line_horizontal },
+ { 1530, 1, true, false, "lseg_length", lseg_length },
+ { 1531, 1, true, false, "path_length", path_length },
+ { 1532, 1, true, false, "lseg_center", lseg_center },
+ { 1534, 1, true, false, "box_center", box_center },
+ { 1540, 1, true, false, "poly_center", poly_center },
+ { 1541, 1, true, false, "box_diagonal", box_diagonal },
+ { 1542, 1, true, false, "box_center", box_center },
+ { 1543, 1, true, false, "circle_center", circle_center },
+ { 1545, 1, true, false, "path_npoints", path_npoints },
+ { 1556, 1, true, false, "poly_npoints", poly_npoints },
+ { 1564, 3, true, false, "bit_in", bit_in },
+ { 1565, 1, true, false, "bit_out", bit_out },
+ { 1569, 2, true, false, "textlike", textlike },
+ { 1570, 2, true, false, "textnlike", textnlike },
+ { 1571, 2, true, false, "namelike", namelike },
+ { 1572, 2, true, false, "namenlike", namenlike },
+ { 1573, 1, true, false, "pg_get_ruledef", pg_get_ruledef },
+ { 1574, 1, true, false, "nextval_oid", nextval_oid },
+ { 1575, 1, true, false, "currval_oid", currval_oid },
+ { 1576, 2, true, false, "setval_oid", setval_oid },
+ { 1579, 3, true, false, "varbit_in", varbit_in },
+ { 1580, 1, true, false, "varbit_out", varbit_out },
+ { 1581, 2, true, false, "biteq", biteq },
+ { 1582, 2, true, false, "bitne", bitne },
+ { 1592, 2, true, false, "bitge", bitge },
+ { 1593, 2, true, false, "bitgt", bitgt },
+ { 1594, 2, true, false, "bitle", bitle },
+ { 1595, 2, true, false, "bitlt", bitlt },
+ { 1596, 2, true, false, "bitcmp", bitcmp },
+ { 1597, 1, true, false, "PG_encoding_to_char", PG_encoding_to_char },
+ { 1598, 0, true, false, "drandom", drandom },
+ { 1599, 1, true, false, "setseed", setseed },
+ { 1600, 1, true, false, "dasin", dasin },
+ { 1601, 1, true, false, "dacos", dacos },
+ { 1602, 1, true, false, "datan", datan },
+ { 1603, 2, true, false, "datan2", datan2 },
+ { 1604, 1, true, false, "dsin", dsin },
+ { 1605, 1, true, false, "dcos", dcos },
+ { 1606, 1, true, false, "dtan", dtan },
+ { 1607, 1, true, false, "dcot", dcot },
+ { 1608, 1, true, false, "degrees", degrees },
+ { 1609, 1, true, false, "radians", radians },
+ { 1610, 0, true, false, "dpi", dpi },
+ { 1618, 2, true, false, "interval_mul", interval_mul },
+ { 1619, 1, false, false, "pg_typeof", pg_typeof },
+ { 1620, 1, true, false, "ascii", ascii },
+ { 1621, 1, true, false, "chr", chr },
+ { 1622, 2, true, false, "repeat", repeat },
+ { 1623, 2, false, false, "similar_escape", similar_escape },
+ { 1624, 2, true, false, "mul_d_interval", mul_d_interval },
+ { 1631, 2, true, false, "textlike", textlike },
+ { 1632, 2, true, false, "textnlike", textnlike },
+ { 1633, 2, true, false, "texticlike", texticlike },
+ { 1634, 2, true, false, "texticnlike", texticnlike },
+ { 1635, 2, true, false, "nameiclike", nameiclike },
+ { 1636, 2, true, false, "nameicnlike", nameicnlike },
+ { 1637, 2, true, false, "like_escape", like_escape },
+ { 1638, 2, true, false, "oidgt", oidgt },
+ { 1639, 2, true, false, "oidge", oidge },
+ { 1640, 1, true, false, "pg_get_viewdef_name", pg_get_viewdef_name },
+ { 1641, 1, true, false, "pg_get_viewdef", pg_get_viewdef },
+ { 1642, 1, true, false, "pg_get_userbyid", pg_get_userbyid },
+ { 1643, 1, true, false, "pg_get_indexdef", pg_get_indexdef },
+ { 1644, 0, true, false, "RI_FKey_check_ins", RI_FKey_check_ins },
+ { 1645, 0, true, false, "RI_FKey_check_upd", RI_FKey_check_upd },
+ { 1646, 0, true, false, "RI_FKey_cascade_del", RI_FKey_cascade_del },
+ { 1647, 0, true, false, "RI_FKey_cascade_upd", RI_FKey_cascade_upd },
+ { 1648, 0, true, false, "RI_FKey_restrict_del", RI_FKey_restrict_del },
+ { 1649, 0, true, false, "RI_FKey_restrict_upd", RI_FKey_restrict_upd },
+ { 1650, 0, true, false, "RI_FKey_setnull_del", RI_FKey_setnull_del },
+ { 1651, 0, true, false, "RI_FKey_setnull_upd", RI_FKey_setnull_upd },
+ { 1652, 0, true, false, "RI_FKey_setdefault_del", RI_FKey_setdefault_del },
+ { 1653, 0, true, false, "RI_FKey_setdefault_upd", RI_FKey_setdefault_upd },
+ { 1654, 0, true, false, "RI_FKey_noaction_del", RI_FKey_noaction_del },
+ { 1655, 0, true, false, "RI_FKey_noaction_upd", RI_FKey_noaction_upd },
+ { 1656, 2, true, false, "texticregexeq", texticregexeq },
+ { 1657, 2, true, false, "texticregexne", texticregexne },
+ { 1658, 2, true, false, "textregexeq", textregexeq },
+ { 1659, 2, true, false, "textregexne", textregexne },
+ { 1660, 2, true, false, "texticlike", texticlike },
+ { 1661, 2, true, false, "texticnlike", texticnlike },
+ { 1662, 1, true, false, "pg_get_triggerdef", pg_get_triggerdef },
+ { 1665, 2, true, false, "pg_get_serial_sequence", pg_get_serial_sequence },
+ { 1666, 2, true, false, "biteq", biteq },
+ { 1667, 2, true, false, "bitne", bitne },
+ { 1668, 2, true, false, "bitge", bitge },
+ { 1669, 2, true, false, "bitgt", bitgt },
+ { 1670, 2, true, false, "bitle", bitle },
+ { 1671, 2, true, false, "bitlt", bitlt },
+ { 1672, 2, true, false, "bitcmp", bitcmp },
+ { 1673, 2, true, false, "bit_and", bit_and },
+ { 1674, 2, true, false, "bit_or", bit_or },
+ { 1675, 2, true, false, "bitxor", bitxor },
+ { 1676, 1, true, false, "bitnot", bitnot },
+ { 1677, 2, true, false, "bitshiftleft", bitshiftleft },
+ { 1678, 2, true, false, "bitshiftright", bitshiftright },
+ { 1679, 2, true, false, "bitcat", bitcat },
+ { 1680, 3, true, false, "bitsubstr", bitsubstr },
+ { 1681, 1, true, false, "bitlength", bitlength },
+ { 1682, 1, true, false, "bitoctetlength", bitoctetlength },
+ { 1683, 2, true, false, "bitfromint4", bitfromint4 },
+ { 1684, 1, true, false, "bittoint4", bittoint4 },
+ { 1685, 3, true, false, "bit", bit },
+ { 1686, 0, true, true, "pg_get_keywords", pg_get_keywords },
+ { 1687, 3, true, false, "varbit", varbit },
+ { 1688, 1, true, false, "time_hash", time_hash },
+ { 1689, 1, true, true, "aclexplode", aclexplode },
+ { 1690, 2, true, false, "time_mi_time", time_mi_time },
+ { 1691, 2, true, false, "boolle", boolle },
+ { 1692, 2, true, false, "boolge", boolge },
+ { 1693, 2, true, false, "btboolcmp", btboolcmp },
+ { 1696, 1, true, false, "timetz_hash", timetz_hash },
+ { 1697, 1, true, false, "interval_hash", interval_hash },
+ { 1698, 2, true, false, "bitposition", bitposition },
+ { 1699, 2, true, false, "bitsubstr_no_len", bitsubstr_no_len },
+ { 1701, 3, true, false, "numeric_in", numeric_in },
+ { 1702, 1, true, false, "numeric_out", numeric_out },
+ { 1703, 2, true, false, "numeric", numeric },
+ { 1704, 1, true, false, "numeric_abs", numeric_abs },
+ { 1705, 1, true, false, "numeric_abs", numeric_abs },
+ { 1706, 1, true, false, "numeric_sign", numeric_sign },
+ { 1707, 2, true, false, "numeric_round", numeric_round },
+ { 1709, 2, true, false, "numeric_trunc", numeric_trunc },
+ { 1711, 1, true, false, "numeric_ceil", numeric_ceil },
+ { 1712, 1, true, false, "numeric_floor", numeric_floor },
+ { 1713, 2, true, false, "length_in_encoding", length_in_encoding },
+ { 1714, 2, true, false, "pg_convert_from", pg_convert_from },
+ { 1715, 1, true, false, "inet_to_cidr", inet_to_cidr },
+ { 1716, 2, true, false, "pg_get_expr", pg_get_expr },
+ { 1717, 2, true, false, "pg_convert_to", pg_convert_to },
+ { 1718, 2, true, false, "numeric_eq", numeric_eq },
+ { 1719, 2, true, false, "numeric_ne", numeric_ne },
+ { 1720, 2, true, false, "numeric_gt", numeric_gt },
+ { 1721, 2, true, false, "numeric_ge", numeric_ge },
+ { 1722, 2, true, false, "numeric_lt", numeric_lt },
+ { 1723, 2, true, false, "numeric_le", numeric_le },
+ { 1724, 2, true, false, "numeric_add", numeric_add },
+ { 1725, 2, true, false, "numeric_sub", numeric_sub },
+ { 1726, 2, true, false, "numeric_mul", numeric_mul },
+ { 1727, 2, true, false, "numeric_div", numeric_div },
+ { 1728, 2, true, false, "numeric_mod", numeric_mod },
+ { 1729, 2, true, false, "numeric_mod", numeric_mod },
+ { 1730, 1, true, false, "numeric_sqrt", numeric_sqrt },
+ { 1731, 1, true, false, "numeric_sqrt", numeric_sqrt },
+ { 1732, 1, true, false, "numeric_exp", numeric_exp },
+ { 1733, 1, true, false, "numeric_exp", numeric_exp },
+ { 1734, 1, true, false, "numeric_ln", numeric_ln },
+ { 1735, 1, true, false, "numeric_ln", numeric_ln },
+ { 1736, 2, true, false, "numeric_log", numeric_log },
+ { 1737, 2, true, false, "numeric_log", numeric_log },
+ { 1738, 2, true, false, "numeric_power", numeric_power },
+ { 1739, 2, true, false, "numeric_power", numeric_power },
+ { 1740, 1, true, false, "int4_numeric", int4_numeric },
+ { 1742, 1, true, false, "float4_numeric", float4_numeric },
+ { 1743, 1, true, false, "float8_numeric", float8_numeric },
+ { 1744, 1, true, false, "numeric_int4", numeric_int4 },
+ { 1745, 1, true, false, "numeric_float4", numeric_float4 },
+ { 1746, 1, true, false, "numeric_float8", numeric_float8 },
+ { 1747, 2, true, false, "time_pl_interval", time_pl_interval },
+ { 1748, 2, true, false, "time_mi_interval", time_mi_interval },
+ { 1749, 2, true, false, "timetz_pl_interval", timetz_pl_interval },
+ { 1750, 2, true, false, "timetz_mi_interval", timetz_mi_interval },
+ { 1764, 1, true, false, "numeric_inc", numeric_inc },
+ { 1765, 3, true, false, "setval3_oid", setval3_oid },
+ { 1766, 2, true, false, "numeric_smaller", numeric_smaller },
+ { 1767, 2, true, false, "numeric_larger", numeric_larger },
+ { 1768, 2, true, false, "interval_to_char", interval_to_char },
+ { 1769, 2, true, false, "numeric_cmp", numeric_cmp },
+ { 1770, 2, true, false, "timestamptz_to_char", timestamptz_to_char },
+ { 1771, 1, true, false, "numeric_uminus", numeric_uminus },
+ { 1772, 2, true, false, "numeric_to_char", numeric_to_char },
+ { 1773, 2, true, false, "int4_to_char", int4_to_char },
+ { 1774, 2, true, false, "int8_to_char", int8_to_char },
+ { 1775, 2, true, false, "float4_to_char", float4_to_char },
+ { 1776, 2, true, false, "float8_to_char", float8_to_char },
+ { 1777, 2, true, false, "numeric_to_number", numeric_to_number },
+ { 1778, 2, true, false, "to_timestamp", to_timestamp },
+ { 1779, 1, true, false, "numeric_int8", numeric_int8 },
+ { 1780, 2, true, false, "to_date", to_date },
+ { 1781, 1, true, false, "int8_numeric", int8_numeric },
+ { 1782, 1, true, false, "int2_numeric", int2_numeric },
+ { 1783, 1, true, false, "numeric_int2", numeric_int2 },
+ { 1798, 1, true, false, "oidin", oidin },
+ { 1799, 1, true, false, "oidout", oidout },
+ { 1813, 3, true, false, "pg_convert", pg_convert },
+ { 1814, 4, true, false, "iclikesel", iclikesel },
+ { 1815, 4, true, false, "icnlikesel", icnlikesel },
+ { 1816, 5, true, false, "iclikejoinsel", iclikejoinsel },
+ { 1817, 5, true, false, "icnlikejoinsel", icnlikejoinsel },
+ { 1818, 4, true, false, "regexeqsel", regexeqsel },
+ { 1819, 4, true, false, "likesel", likesel },
+ { 1820, 4, true, false, "icregexeqsel", icregexeqsel },
+ { 1821, 4, true, false, "regexnesel", regexnesel },
+ { 1822, 4, true, false, "nlikesel", nlikesel },
+ { 1823, 4, true, false, "icregexnesel", icregexnesel },
+ { 1824, 5, true, false, "regexeqjoinsel", regexeqjoinsel },
+ { 1825, 5, true, false, "likejoinsel", likejoinsel },
+ { 1826, 5, true, false, "icregexeqjoinsel", icregexeqjoinsel },
+ { 1827, 5, true, false, "regexnejoinsel", regexnejoinsel },
+ { 1828, 5, true, false, "nlikejoinsel", nlikejoinsel },
+ { 1829, 5, true, false, "icregexnejoinsel", icregexnejoinsel },
+ { 1830, 1, true, false, "float8_avg", float8_avg },
+ { 1831, 1, true, false, "float8_var_samp", float8_var_samp },
+ { 1832, 1, true, false, "float8_stddev_samp", float8_stddev_samp },
+ { 1833, 2, false, false, "numeric_accum", numeric_accum },
+ { 1834, 2, false, false, "int2_accum", int2_accum },
+ { 1835, 2, false, false, "int4_accum", int4_accum },
+ { 1836, 2, false, false, "int8_accum", int8_accum },
+ { 1837, 1, false, false, "numeric_avg", numeric_avg },
+ { 1838, 1, false, false, "numeric_var_samp", numeric_var_samp },
+ { 1839, 1, false, false, "numeric_stddev_samp", numeric_stddev_samp },
+ { 1840, 2, false, false, "int2_sum", int2_sum },
+ { 1841, 2, false, false, "int4_sum", int4_sum },
+ { 1842, 2, false, false, "int8_sum", int8_sum },
+ { 1843, 2, true, false, "interval_accum", interval_accum },
+ { 1844, 1, true, false, "interval_avg", interval_avg },
+ { 1845, 1, true, false, "to_ascii_default", to_ascii_default },
+ { 1846, 2, true, false, "to_ascii_enc", to_ascii_enc },
+ { 1847, 2, true, false, "to_ascii_encname", to_ascii_encname },
+ { 1850, 2, true, false, "int28eq", int28eq },
+ { 1851, 2, true, false, "int28ne", int28ne },
+ { 1852, 2, true, false, "int28lt", int28lt },
+ { 1853, 2, true, false, "int28gt", int28gt },
+ { 1854, 2, true, false, "int28le", int28le },
+ { 1855, 2, true, false, "int28ge", int28ge },
+ { 1856, 2, true, false, "int82eq", int82eq },
+ { 1857, 2, true, false, "int82ne", int82ne },
+ { 1858, 2, true, false, "int82lt", int82lt },
+ { 1859, 2, true, false, "int82gt", int82gt },
+ { 1860, 2, true, false, "int82le", int82le },
+ { 1861, 2, true, false, "int82ge", int82ge },
+ { 1892, 2, true, false, "int2and", int2and },
+ { 1893, 2, true, false, "int2or", int2or },
+ { 1894, 2, true, false, "int2xor", int2xor },
+ { 1895, 1, true, false, "int2not", int2not },
+ { 1896, 2, true, false, "int2shl", int2shl },
+ { 1897, 2, true, false, "int2shr", int2shr },
+ { 1898, 2, true, false, "int4and", int4and },
+ { 1899, 2, true, false, "int4or", int4or },
+ { 1900, 2, true, false, "int4xor", int4xor },
+ { 1901, 1, true, false, "int4not", int4not },
+ { 1902, 2, true, false, "int4shl", int4shl },
+ { 1903, 2, true, false, "int4shr", int4shr },
+ { 1904, 2, true, false, "int8and", int8and },
+ { 1905, 2, true, false, "int8or", int8or },
+ { 1906, 2, true, false, "int8xor", int8xor },
+ { 1907, 1, true, false, "int8not", int8not },
+ { 1908, 2, true, false, "int8shl", int8shl },
+ { 1909, 2, true, false, "int8shr", int8shr },
+ { 1910, 1, true, false, "int8up", int8up },
+ { 1911, 1, true, false, "int2up", int2up },
+ { 1912, 1, true, false, "int4up", int4up },
+ { 1913, 1, true, false, "float4up", float4up },
+ { 1914, 1, true, false, "float8up", float8up },
+ { 1915, 1, true, false, "numeric_uplus", numeric_uplus },
+ { 1922, 3, true, false, "has_table_privilege_name_name", has_table_privilege_name_name },
+ { 1923, 3, true, false, "has_table_privilege_name_id", has_table_privilege_name_id },
+ { 1924, 3, true, false, "has_table_privilege_id_name", has_table_privilege_id_name },
+ { 1925, 3, true, false, "has_table_privilege_id_id", has_table_privilege_id_id },
+ { 1926, 2, true, false, "has_table_privilege_name", has_table_privilege_name },
+ { 1927, 2, true, false, "has_table_privilege_id", has_table_privilege_id },
+ { 1928, 1, true, false, "pg_stat_get_numscans", pg_stat_get_numscans },
+ { 1929, 1, true, false, "pg_stat_get_tuples_returned", pg_stat_get_tuples_returned },
+ { 1930, 1, true, false, "pg_stat_get_tuples_fetched", pg_stat_get_tuples_fetched },
+ { 1931, 1, true, false, "pg_stat_get_tuples_inserted", pg_stat_get_tuples_inserted },
+ { 1932, 1, true, false, "pg_stat_get_tuples_updated", pg_stat_get_tuples_updated },
+ { 1933, 1, true, false, "pg_stat_get_tuples_deleted", pg_stat_get_tuples_deleted },
+ { 1934, 1, true, false, "pg_stat_get_blocks_fetched", pg_stat_get_blocks_fetched },
+ { 1935, 1, true, false, "pg_stat_get_blocks_hit", pg_stat_get_blocks_hit },
+ { 1936, 0, true, true, "pg_stat_get_backend_idset", pg_stat_get_backend_idset },
+ { 1937, 1, true, false, "pg_stat_get_backend_pid", pg_stat_get_backend_pid },
+ { 1938, 1, true, false, "pg_stat_get_backend_dbid", pg_stat_get_backend_dbid },
+ { 1939, 1, true, false, "pg_stat_get_backend_userid", pg_stat_get_backend_userid },
+ { 1940, 1, true, false, "pg_stat_get_backend_activity", pg_stat_get_backend_activity },
+ { 1941, 1, true, false, "pg_stat_get_db_numbackends", pg_stat_get_db_numbackends },
+ { 1942, 1, true, false, "pg_stat_get_db_xact_commit", pg_stat_get_db_xact_commit },
+ { 1943, 1, true, false, "pg_stat_get_db_xact_rollback", pg_stat_get_db_xact_rollback },
+ { 1944, 1, true, false, "pg_stat_get_db_blocks_fetched", pg_stat_get_db_blocks_fetched },
+ { 1945, 1, true, false, "pg_stat_get_db_blocks_hit", pg_stat_get_db_blocks_hit },
+ { 1946, 2, true, false, "binary_encode", binary_encode },
+ { 1947, 2, true, false, "binary_decode", binary_decode },
+ { 1948, 2, true, false, "byteaeq", byteaeq },
+ { 1949, 2, true, false, "bytealt", bytealt },
+ { 1950, 2, true, false, "byteale", byteale },
+ { 1951, 2, true, false, "byteagt", byteagt },
+ { 1952, 2, true, false, "byteage", byteage },
+ { 1953, 2, true, false, "byteane", byteane },
+ { 1954, 2, true, false, "byteacmp", byteacmp },
+ { 1961, 2, true, false, "timestamp_scale", timestamp_scale },
+ { 1962, 2, true, false, "int2_avg_accum", int2_avg_accum },
+ { 1963, 2, true, false, "int4_avg_accum", int4_avg_accum },
+ { 1964, 1, true, false, "int8_avg", int8_avg },
+ { 1965, 2, true, false, "oidlarger", oidlarger },
+ { 1966, 2, true, false, "oidsmaller", oidsmaller },
+ { 1967, 2, true, false, "timestamptz_scale", timestamptz_scale },
+ { 1968, 2, true, false, "time_scale", time_scale },
+ { 1969, 2, true, false, "timetz_scale", timetz_scale },
+ { 1972, 1, true, false, "pg_stat_get_tuples_hot_updated", pg_stat_get_tuples_hot_updated },
+ { 1973, 2, true, false, "numeric_div_trunc", numeric_div_trunc },
+ { 1980, 2, true, false, "numeric_div_trunc", numeric_div_trunc },
+ { 1986, 2, true, false, "similar_to_escape_2", similar_to_escape_2 },
+ { 1987, 1, true, false, "similar_to_escape_1", similar_to_escape_1 },
+ { 2005, 2, true, false, "bytealike", bytealike },
+ { 2006, 2, true, false, "byteanlike", byteanlike },
+ { 2007, 2, true, false, "bytealike", bytealike },
+ { 2008, 2, true, false, "byteanlike", byteanlike },
+ { 2009, 2, true, false, "like_escape_bytea", like_escape_bytea },
+ { 2010, 1, true, false, "byteaoctetlen", byteaoctetlen },
+ { 2011, 2, true, false, "byteacat", byteacat },
+ { 2012, 3, true, false, "bytea_substr", bytea_substr },
+ { 2013, 2, true, false, "bytea_substr_no_len", bytea_substr_no_len },
+ { 2014, 2, true, false, "byteapos", byteapos },
+ { 2015, 2, true, false, "byteatrim", byteatrim },
+ { 2019, 1, true, false, "timestamptz_time", timestamptz_time },
+ { 2020, 2, true, false, "timestamp_trunc", timestamp_trunc },
+ { 2021, 2, true, false, "timestamp_part", timestamp_part },
+ { 2022, 1, false, true, "pg_stat_get_activity", pg_stat_get_activity },
+ { 2023, 4, true, false, "jsonb_path_query_first_tz", jsonb_path_query_first_tz },
+ { 2024, 1, true, false, "date_timestamp", date_timestamp },
+ { 2025, 2, true, false, "datetime_timestamp", datetime_timestamp },
+ { 2026, 0, true, false, "pg_backend_pid", pg_backend_pid },
+ { 2027, 1, true, false, "timestamptz_timestamp", timestamptz_timestamp },
+ { 2028, 1, true, false, "timestamp_timestamptz", timestamp_timestamptz },
+ { 2029, 1, true, false, "timestamp_date", timestamp_date },
+ { 2030, 4, true, false, "jsonb_path_match_tz", jsonb_path_match_tz },
+ { 2031, 2, true, false, "timestamp_mi", timestamp_mi },
+ { 2032, 2, true, false, "timestamp_pl_interval", timestamp_pl_interval },
+ { 2033, 2, true, false, "timestamp_mi_interval", timestamp_mi_interval },
+ { 2034, 0, true, false, "pg_conf_load_time", pg_conf_load_time },
+ { 2035, 2, true, false, "timestamp_smaller", timestamp_smaller },
+ { 2036, 2, true, false, "timestamp_larger", timestamp_larger },
+ { 2037, 2, true, false, "timetz_zone", timetz_zone },
+ { 2038, 2, true, false, "timetz_izone", timetz_izone },
+ { 2039, 1, true, false, "timestamp_hash", timestamp_hash },
+ { 2041, 4, false, false, "overlaps_timestamp", overlaps_timestamp },
+ { 2045, 2, true, false, "timestamp_cmp", timestamp_cmp },
+ { 2046, 1, true, false, "timetz_time", timetz_time },
+ { 2047, 1, true, false, "time_timetz", time_timetz },
+ { 2048, 1, true, false, "timestamp_finite", timestamp_finite },
+ { 2049, 2, true, false, "timestamp_to_char", timestamp_to_char },
+ { 2052, 2, true, false, "timestamp_eq", timestamp_eq },
+ { 2053, 2, true, false, "timestamp_ne", timestamp_ne },
+ { 2054, 2, true, false, "timestamp_lt", timestamp_lt },
+ { 2055, 2, true, false, "timestamp_le", timestamp_le },
+ { 2056, 2, true, false, "timestamp_ge", timestamp_ge },
+ { 2057, 2, true, false, "timestamp_gt", timestamp_gt },
+ { 2058, 2, true, false, "timestamp_age", timestamp_age },
+ { 2069, 2, true, false, "timestamp_zone", timestamp_zone },
+ { 2070, 2, true, false, "timestamp_izone", timestamp_izone },
+ { 2071, 2, true, false, "date_pl_interval", date_pl_interval },
+ { 2072, 2, true, false, "date_mi_interval", date_mi_interval },
+ { 2073, 2, true, false, "textregexsubstr", textregexsubstr },
+ { 2075, 2, true, false, "bitfromint8", bitfromint8 },
+ { 2076, 1, true, false, "bittoint8", bittoint8 },
+ { 2077, 1, true, false, "show_config_by_name", show_config_by_name },
+ { 2078, 3, false, false, "set_config_by_name", set_config_by_name },
+ { 2079, 1, true, false, "pg_table_is_visible", pg_table_is_visible },
+ { 2080, 1, true, false, "pg_type_is_visible", pg_type_is_visible },
+ { 2081, 1, true, false, "pg_function_is_visible", pg_function_is_visible },
+ { 2082, 1, true, false, "pg_operator_is_visible", pg_operator_is_visible },
+ { 2083, 1, true, false, "pg_opclass_is_visible", pg_opclass_is_visible },
+ { 2084, 0, true, true, "show_all_settings", show_all_settings },
+ { 2085, 3, true, false, "bytea_substr", bytea_substr },
+ { 2086, 2, true, false, "bytea_substr_no_len", bytea_substr_no_len },
+ { 2087, 3, true, false, "replace_text", replace_text },
+ { 2088, 3, true, false, "split_part", split_part },
+ { 2089, 1, true, false, "to_hex32", to_hex32 },
+ { 2090, 1, true, false, "to_hex64", to_hex64 },
+ { 2091, 2, true, false, "array_lower", array_lower },
+ { 2092, 2, true, false, "array_upper", array_upper },
+ { 2093, 1, true, false, "pg_conversion_is_visible", pg_conversion_is_visible },
+ { 2094, 1, true, false, "pg_stat_get_backend_activity_start", pg_stat_get_backend_activity_start },
+ { 2096, 2, true, false, "pg_terminate_backend", pg_terminate_backend },
+ { 2098, 1, true, false, "pg_get_functiondef", pg_get_functiondef },
+ { 2121, 1, true, false, "pg_column_compression", pg_column_compression },
+ { 2137, 0, false, false, "pg_stat_force_next_flush", pg_stat_force_next_flush },
+ { 2160, 2, true, false, "text_pattern_lt", text_pattern_lt },
+ { 2161, 2, true, false, "text_pattern_le", text_pattern_le },
+ { 2162, 1, true, false, "pg_get_function_arguments", pg_get_function_arguments },
+ { 2163, 2, true, false, "text_pattern_ge", text_pattern_ge },
+ { 2164, 2, true, false, "text_pattern_gt", text_pattern_gt },
+ { 2165, 1, true, false, "pg_get_function_result", pg_get_function_result },
+ { 2166, 2, true, false, "bttext_pattern_cmp", bttext_pattern_cmp },
+ { 2167, 1, true, false, "numeric_ceil", numeric_ceil },
+ { 2168, 1, true, false, "pg_database_size_name", pg_database_size_name },
+ { 2169, 2, true, false, "numeric_power", numeric_power },
+ { 2170, 4, true, false, "width_bucket_numeric", width_bucket_numeric },
+ { 2171, 1, true, false, "pg_cancel_backend", pg_cancel_backend },
+ { 2172, 2, true, false, "pg_backup_start", pg_backup_start },
+ { 2174, 2, true, false, "bpchar_pattern_lt", bpchar_pattern_lt },
+ { 2175, 2, true, false, "bpchar_pattern_le", bpchar_pattern_le },
+ { 2176, 2, true, false, "array_length", array_length },
+ { 2177, 2, true, false, "bpchar_pattern_ge", bpchar_pattern_ge },
+ { 2178, 2, true, false, "bpchar_pattern_gt", bpchar_pattern_gt },
+ { 2179, 5, true, false, "gist_point_consistent", gist_point_consistent },
+ { 2180, 2, true, false, "btbpchar_pattern_cmp", btbpchar_pattern_cmp },
+ { 2181, 3, true, false, "has_sequence_privilege_name_name", has_sequence_privilege_name_name },
+ { 2182, 3, true, false, "has_sequence_privilege_name_id", has_sequence_privilege_name_id },
+ { 2183, 3, true, false, "has_sequence_privilege_id_name", has_sequence_privilege_id_name },
+ { 2184, 3, true, false, "has_sequence_privilege_id_id", has_sequence_privilege_id_id },
+ { 2185, 2, true, false, "has_sequence_privilege_name", has_sequence_privilege_name },
+ { 2186, 2, true, false, "has_sequence_privilege_id", has_sequence_privilege_id },
+ { 2188, 2, true, false, "btint48cmp", btint48cmp },
+ { 2189, 2, true, false, "btint84cmp", btint84cmp },
+ { 2190, 2, true, false, "btint24cmp", btint24cmp },
+ { 2191, 2, true, false, "btint42cmp", btint42cmp },
+ { 2192, 2, true, false, "btint28cmp", btint28cmp },
+ { 2193, 2, true, false, "btint82cmp", btint82cmp },
+ { 2194, 2, true, false, "btfloat48cmp", btfloat48cmp },
+ { 2195, 2, true, false, "btfloat84cmp", btfloat84cmp },
+ { 2196, 0, false, false, "inet_client_addr", inet_client_addr },
+ { 2197, 0, false, false, "inet_client_port", inet_client_port },
+ { 2198, 0, false, false, "inet_server_addr", inet_server_addr },
+ { 2199, 0, false, false, "inet_server_port", inet_server_port },
+ { 2212, 1, true, false, "regprocedurein", regprocedurein },
+ { 2213, 1, true, false, "regprocedureout", regprocedureout },
+ { 2214, 1, true, false, "regoperin", regoperin },
+ { 2215, 1, true, false, "regoperout", regoperout },
+ { 2216, 1, true, false, "regoperatorin", regoperatorin },
+ { 2217, 1, true, false, "regoperatorout", regoperatorout },
+ { 2218, 1, true, false, "regclassin", regclassin },
+ { 2219, 1, true, false, "regclassout", regclassout },
+ { 2220, 1, true, false, "regtypein", regtypein },
+ { 2221, 1, true, false, "regtypeout", regtypeout },
+ { 2230, 0, false, false, "pg_stat_clear_snapshot", pg_stat_clear_snapshot },
+ { 2232, 1, true, false, "pg_get_function_identity_arguments", pg_get_function_identity_arguments },
+ { 2233, 1, true, false, "hashtid", hashtid },
+ { 2234, 2, true, false, "hashtidextended", hashtidextended },
+ { 2246, 1, true, false, "fmgr_internal_validator", fmgr_internal_validator },
+ { 2247, 1, true, false, "fmgr_c_validator", fmgr_c_validator },
+ { 2248, 1, true, false, "fmgr_sql_validator", fmgr_sql_validator },
+ { 2250, 3, true, false, "has_database_privilege_name_name", has_database_privilege_name_name },
+ { 2251, 3, true, false, "has_database_privilege_name_id", has_database_privilege_name_id },
+ { 2252, 3, true, false, "has_database_privilege_id_name", has_database_privilege_id_name },
+ { 2253, 3, true, false, "has_database_privilege_id_id", has_database_privilege_id_id },
+ { 2254, 2, true, false, "has_database_privilege_name", has_database_privilege_name },
+ { 2255, 2, true, false, "has_database_privilege_id", has_database_privilege_id },
+ { 2256, 3, true, false, "has_function_privilege_name_name", has_function_privilege_name_name },
+ { 2257, 3, true, false, "has_function_privilege_name_id", has_function_privilege_name_id },
+ { 2258, 3, true, false, "has_function_privilege_id_name", has_function_privilege_id_name },
+ { 2259, 3, true, false, "has_function_privilege_id_id", has_function_privilege_id_id },
+ { 2260, 2, true, false, "has_function_privilege_name", has_function_privilege_name },
+ { 2261, 2, true, false, "has_function_privilege_id", has_function_privilege_id },
+ { 2262, 3, true, false, "has_language_privilege_name_name", has_language_privilege_name_name },
+ { 2263, 3, true, false, "has_language_privilege_name_id", has_language_privilege_name_id },
+ { 2264, 3, true, false, "has_language_privilege_id_name", has_language_privilege_id_name },
+ { 2265, 3, true, false, "has_language_privilege_id_id", has_language_privilege_id_id },
+ { 2266, 2, true, false, "has_language_privilege_name", has_language_privilege_name },
+ { 2267, 2, true, false, "has_language_privilege_id", has_language_privilege_id },
+ { 2268, 3, true, false, "has_schema_privilege_name_name", has_schema_privilege_name_name },
+ { 2269, 3, true, false, "has_schema_privilege_name_id", has_schema_privilege_name_id },
+ { 2270, 3, true, false, "has_schema_privilege_id_name", has_schema_privilege_id_name },
+ { 2271, 3, true, false, "has_schema_privilege_id_id", has_schema_privilege_id_id },
+ { 2272, 2, true, false, "has_schema_privilege_name", has_schema_privilege_name },
+ { 2273, 2, true, false, "has_schema_privilege_id", has_schema_privilege_id },
+ { 2274, 0, false, false, "pg_stat_reset", pg_stat_reset },
+ { 2282, 0, true, true, "pg_get_backend_memory_contexts", pg_get_backend_memory_contexts },
+ { 2284, 3, true, false, "textregexreplace_noopt", textregexreplace_noopt },
+ { 2285, 4, true, false, "textregexreplace", textregexreplace },
+ { 2286, 1, true, false, "pg_total_relation_size", pg_total_relation_size },
+ { 2288, 1, true, false, "pg_size_pretty", pg_size_pretty },
+ { 2289, 1, true, true, "pg_options_to_table", pg_options_to_table },
+ { 2290, 3, true, false, "record_in", record_in },
+ { 2291, 1, true, false, "record_out", record_out },
+ { 2292, 1, true, false, "cstring_in", cstring_in },
+ { 2293, 1, true, false, "cstring_out", cstring_out },
+ { 2294, 1, true, false, "any_in", any_in },
+ { 2295, 1, true, false, "any_out", any_out },
+ { 2296, 1, true, false, "anyarray_in", anyarray_in },
+ { 2297, 1, true, false, "anyarray_out", anyarray_out },
+ { 2298, 1, true, false, "void_in", void_in },
+ { 2299, 1, true, false, "void_out", void_out },
+ { 2300, 1, false, false, "trigger_in", trigger_in },
+ { 2301, 1, true, false, "trigger_out", trigger_out },
+ { 2302, 1, false, false, "language_handler_in", language_handler_in },
+ { 2303, 1, true, false, "language_handler_out", language_handler_out },
+ { 2304, 1, false, false, "internal_in", internal_in },
+ { 2305, 1, true, false, "internal_out", internal_out },
+ { 2306, 0, false, true, "pg_stat_get_slru", pg_stat_get_slru },
+ { 2307, 1, false, false, "pg_stat_reset_slru", pg_stat_reset_slru },
+ { 2308, 1, true, false, "dceil", dceil },
+ { 2309, 1, true, false, "dfloor", dfloor },
+ { 2310, 1, true, false, "dsign", dsign },
+ { 2311, 1, true, false, "md5_text", md5_text },
+ { 2312, 1, true, false, "anyelement_in", anyelement_in },
+ { 2313, 1, true, false, "anyelement_out", anyelement_out },
+ { 2316, 2, true, false, "postgresql_fdw_validator", postgresql_fdw_validator },
+ { 2319, 1, true, false, "pg_encoding_max_length_sql", pg_encoding_max_length_sql },
+ { 2320, 1, true, false, "dceil", dceil },
+ { 2321, 1, true, false, "md5_bytea", md5_bytea },
+ { 2322, 1, true, false, "pg_tablespace_size_oid", pg_tablespace_size_oid },
+ { 2323, 1, true, false, "pg_tablespace_size_name", pg_tablespace_size_name },
+ { 2324, 1, true, false, "pg_database_size_oid", pg_database_size_oid },
+ { 2331, 1, true, true, "array_unnest", array_unnest },
+ { 2332, 2, true, false, "pg_relation_size", pg_relation_size },
+ { 2333, 2, false, false, "array_agg_transfn", array_agg_transfn },
+ { 2334, 2, false, false, "array_agg_finalfn", array_agg_finalfn },
+ { 2338, 2, true, false, "date_lt_timestamp", date_lt_timestamp },
+ { 2339, 2, true, false, "date_le_timestamp", date_le_timestamp },
+ { 2340, 2, true, false, "date_eq_timestamp", date_eq_timestamp },
+ { 2341, 2, true, false, "date_gt_timestamp", date_gt_timestamp },
+ { 2342, 2, true, false, "date_ge_timestamp", date_ge_timestamp },
+ { 2343, 2, true, false, "date_ne_timestamp", date_ne_timestamp },
+ { 2344, 2, true, false, "date_cmp_timestamp", date_cmp_timestamp },
+ { 2351, 2, true, false, "date_lt_timestamptz", date_lt_timestamptz },
+ { 2352, 2, true, false, "date_le_timestamptz", date_le_timestamptz },
+ { 2353, 2, true, false, "date_eq_timestamptz", date_eq_timestamptz },
+ { 2354, 2, true, false, "date_gt_timestamptz", date_gt_timestamptz },
+ { 2355, 2, true, false, "date_ge_timestamptz", date_ge_timestamptz },
+ { 2356, 2, true, false, "date_ne_timestamptz", date_ne_timestamptz },
+ { 2357, 2, true, false, "date_cmp_timestamptz", date_cmp_timestamptz },
+ { 2364, 2, true, false, "timestamp_lt_date", timestamp_lt_date },
+ { 2365, 2, true, false, "timestamp_le_date", timestamp_le_date },
+ { 2366, 2, true, false, "timestamp_eq_date", timestamp_eq_date },
+ { 2367, 2, true, false, "timestamp_gt_date", timestamp_gt_date },
+ { 2368, 2, true, false, "timestamp_ge_date", timestamp_ge_date },
+ { 2369, 2, true, false, "timestamp_ne_date", timestamp_ne_date },
+ { 2370, 2, true, false, "timestamp_cmp_date", timestamp_cmp_date },
+ { 2377, 2, true, false, "timestamptz_lt_date", timestamptz_lt_date },
+ { 2378, 2, true, false, "timestamptz_le_date", timestamptz_le_date },
+ { 2379, 2, true, false, "timestamptz_eq_date", timestamptz_eq_date },
+ { 2380, 2, true, false, "timestamptz_gt_date", timestamptz_gt_date },
+ { 2381, 2, true, false, "timestamptz_ge_date", timestamptz_ge_date },
+ { 2382, 2, true, false, "timestamptz_ne_date", timestamptz_ne_date },
+ { 2383, 2, true, false, "timestamptz_cmp_date", timestamptz_cmp_date },
+ { 2390, 3, true, false, "has_tablespace_privilege_name_name", has_tablespace_privilege_name_name },
+ { 2391, 3, true, false, "has_tablespace_privilege_name_id", has_tablespace_privilege_name_id },
+ { 2392, 3, true, false, "has_tablespace_privilege_id_name", has_tablespace_privilege_id_name },
+ { 2393, 3, true, false, "has_tablespace_privilege_id_id", has_tablespace_privilege_id_id },
+ { 2394, 2, true, false, "has_tablespace_privilege_name", has_tablespace_privilege_name },
+ { 2395, 2, true, false, "has_tablespace_privilege_id", has_tablespace_privilege_id },
+ { 2398, 1, false, false, "shell_in", shell_in },
+ { 2399, 1, true, false, "shell_out", shell_out },
+ { 2400, 3, true, false, "array_recv", array_recv },
+ { 2401, 1, true, false, "array_send", array_send },
+ { 2402, 3, true, false, "record_recv", record_recv },
+ { 2403, 1, true, false, "record_send", record_send },
+ { 2404, 1, true, false, "int2recv", int2recv },
+ { 2405, 1, true, false, "int2send", int2send },
+ { 2406, 1, true, false, "int4recv", int4recv },
+ { 2407, 1, true, false, "int4send", int4send },
+ { 2408, 1, true, false, "int8recv", int8recv },
+ { 2409, 1, true, false, "int8send", int8send },
+ { 2410, 1, true, false, "int2vectorrecv", int2vectorrecv },
+ { 2411, 1, true, false, "int2vectorsend", int2vectorsend },
+ { 2412, 1, true, false, "bytearecv", bytearecv },
+ { 2413, 1, true, false, "byteasend", byteasend },
+ { 2414, 1, true, false, "textrecv", textrecv },
+ { 2415, 1, true, false, "textsend", textsend },
+ { 2416, 1, true, false, "unknownrecv", unknownrecv },
+ { 2417, 1, true, false, "unknownsend", unknownsend },
+ { 2418, 1, true, false, "oidrecv", oidrecv },
+ { 2419, 1, true, false, "oidsend", oidsend },
+ { 2420, 1, true, false, "oidvectorrecv", oidvectorrecv },
+ { 2421, 1, true, false, "oidvectorsend", oidvectorsend },
+ { 2422, 1, true, false, "namerecv", namerecv },
+ { 2423, 1, true, false, "namesend", namesend },
+ { 2424, 1, true, false, "float4recv", float4recv },
+ { 2425, 1, true, false, "float4send", float4send },
+ { 2426, 1, true, false, "float8recv", float8recv },
+ { 2427, 1, true, false, "float8send", float8send },
+ { 2428, 1, true, false, "point_recv", point_recv },
+ { 2429, 1, true, false, "point_send", point_send },
+ { 2430, 3, true, false, "bpcharrecv", bpcharrecv },
+ { 2431, 1, true, false, "bpcharsend", bpcharsend },
+ { 2432, 3, true, false, "varcharrecv", varcharrecv },
+ { 2433, 1, true, false, "varcharsend", varcharsend },
+ { 2434, 1, true, false, "charrecv", charrecv },
+ { 2435, 1, true, false, "charsend", charsend },
+ { 2436, 1, true, false, "boolrecv", boolrecv },
+ { 2437, 1, true, false, "boolsend", boolsend },
+ { 2438, 1, true, false, "tidrecv", tidrecv },
+ { 2439, 1, true, false, "tidsend", tidsend },
+ { 2440, 1, true, false, "xidrecv", xidrecv },
+ { 2441, 1, true, false, "xidsend", xidsend },
+ { 2442, 1, true, false, "cidrecv", cidrecv },
+ { 2443, 1, true, false, "cidsend", cidsend },
+ { 2444, 1, true, false, "regprocrecv", regprocrecv },
+ { 2445, 1, true, false, "regprocsend", regprocsend },
+ { 2446, 1, true, false, "regprocedurerecv", regprocedurerecv },
+ { 2447, 1, true, false, "regproceduresend", regproceduresend },
+ { 2448, 1, true, false, "regoperrecv", regoperrecv },
+ { 2449, 1, true, false, "regopersend", regopersend },
+ { 2450, 1, true, false, "regoperatorrecv", regoperatorrecv },
+ { 2451, 1, true, false, "regoperatorsend", regoperatorsend },
+ { 2452, 1, true, false, "regclassrecv", regclassrecv },
+ { 2453, 1, true, false, "regclasssend", regclasssend },
+ { 2454, 1, true, false, "regtyperecv", regtyperecv },
+ { 2455, 1, true, false, "regtypesend", regtypesend },
+ { 2456, 3, true, false, "bit_recv", bit_recv },
+ { 2457, 1, true, false, "bit_send", bit_send },
+ { 2458, 3, true, false, "varbit_recv", varbit_recv },
+ { 2459, 1, true, false, "varbit_send", varbit_send },
+ { 2460, 3, true, false, "numeric_recv", numeric_recv },
+ { 2461, 1, true, false, "numeric_send", numeric_send },
+ { 2462, 1, true, false, "dsinh", dsinh },
+ { 2463, 1, true, false, "dcosh", dcosh },
+ { 2464, 1, true, false, "dtanh", dtanh },
+ { 2465, 1, true, false, "dasinh", dasinh },
+ { 2466, 1, true, false, "dacosh", dacosh },
+ { 2467, 1, true, false, "datanh", datanh },
+ { 2468, 1, true, false, "date_recv", date_recv },
+ { 2469, 1, true, false, "date_send", date_send },
+ { 2470, 3, true, false, "time_recv", time_recv },
+ { 2471, 1, true, false, "time_send", time_send },
+ { 2472, 3, true, false, "timetz_recv", timetz_recv },
+ { 2473, 1, true, false, "timetz_send", timetz_send },
+ { 2474, 3, true, false, "timestamp_recv", timestamp_recv },
+ { 2475, 1, true, false, "timestamp_send", timestamp_send },
+ { 2476, 3, true, false, "timestamptz_recv", timestamptz_recv },
+ { 2477, 1, true, false, "timestamptz_send", timestamptz_send },
+ { 2478, 3, true, false, "interval_recv", interval_recv },
+ { 2479, 1, true, false, "interval_send", interval_send },
+ { 2480, 1, true, false, "lseg_recv", lseg_recv },
+ { 2481, 1, true, false, "lseg_send", lseg_send },
+ { 2482, 1, true, false, "path_recv", path_recv },
+ { 2483, 1, true, false, "path_send", path_send },
+ { 2484, 1, true, false, "box_recv", box_recv },
+ { 2485, 1, true, false, "box_send", box_send },
+ { 2486, 1, true, false, "poly_recv", poly_recv },
+ { 2487, 1, true, false, "poly_send", poly_send },
+ { 2488, 1, true, false, "line_recv", line_recv },
+ { 2489, 1, true, false, "line_send", line_send },
+ { 2490, 1, true, false, "circle_recv", circle_recv },
+ { 2491, 1, true, false, "circle_send", circle_send },
+ { 2492, 1, true, false, "cash_recv", cash_recv },
+ { 2493, 1, true, false, "cash_send", cash_send },
+ { 2494, 1, true, false, "macaddr_recv", macaddr_recv },
+ { 2495, 1, true, false, "macaddr_send", macaddr_send },
+ { 2496, 1, true, false, "inet_recv", inet_recv },
+ { 2497, 1, true, false, "inet_send", inet_send },
+ { 2498, 1, true, false, "cidr_recv", cidr_recv },
+ { 2499, 1, true, false, "cidr_send", cidr_send },
+ { 2500, 1, true, false, "cstring_recv", cstring_recv },
+ { 2501, 1, true, false, "cstring_send", cstring_send },
+ { 2502, 1, true, false, "anyarray_recv", anyarray_recv },
+ { 2503, 1, true, false, "anyarray_send", anyarray_send },
+ { 2504, 2, true, false, "pg_get_ruledef_ext", pg_get_ruledef_ext },
+ { 2505, 2, true, false, "pg_get_viewdef_name_ext", pg_get_viewdef_name_ext },
+ { 2506, 2, true, false, "pg_get_viewdef_ext", pg_get_viewdef_ext },
+ { 2507, 3, true, false, "pg_get_indexdef_ext", pg_get_indexdef_ext },
+ { 2508, 2, true, false, "pg_get_constraintdef_ext", pg_get_constraintdef_ext },
+ { 2509, 3, true, false, "pg_get_expr_ext", pg_get_expr_ext },
+ { 2510, 0, true, true, "pg_prepared_statement", pg_prepared_statement },
+ { 2511, 0, true, true, "pg_cursor", pg_cursor },
+ { 2512, 1, true, false, "float8_var_pop", float8_var_pop },
+ { 2513, 1, true, false, "float8_stddev_pop", float8_stddev_pop },
+ { 2514, 1, false, false, "numeric_var_pop", numeric_var_pop },
+ { 2515, 2, true, false, "booland_statefunc", booland_statefunc },
+ { 2516, 2, true, false, "boolor_statefunc", boolor_statefunc },
+ { 2520, 2, true, false, "timestamp_lt_timestamptz", timestamp_lt_timestamptz },
+ { 2521, 2, true, false, "timestamp_le_timestamptz", timestamp_le_timestamptz },
+ { 2522, 2, true, false, "timestamp_eq_timestamptz", timestamp_eq_timestamptz },
+ { 2523, 2, true, false, "timestamp_gt_timestamptz", timestamp_gt_timestamptz },
+ { 2524, 2, true, false, "timestamp_ge_timestamptz", timestamp_ge_timestamptz },
+ { 2525, 2, true, false, "timestamp_ne_timestamptz", timestamp_ne_timestamptz },
+ { 2526, 2, true, false, "timestamp_cmp_timestamptz", timestamp_cmp_timestamptz },
+ { 2527, 2, true, false, "timestamptz_lt_timestamp", timestamptz_lt_timestamp },
+ { 2528, 2, true, false, "timestamptz_le_timestamp", timestamptz_le_timestamp },
+ { 2529, 2, true, false, "timestamptz_eq_timestamp", timestamptz_eq_timestamp },
+ { 2530, 2, true, false, "timestamptz_gt_timestamp", timestamptz_gt_timestamp },
+ { 2531, 2, true, false, "timestamptz_ge_timestamp", timestamptz_ge_timestamp },
+ { 2532, 2, true, false, "timestamptz_ne_timestamp", timestamptz_ne_timestamp },
+ { 2533, 2, true, false, "timestamptz_cmp_timestamp", timestamptz_cmp_timestamp },
+ { 2556, 1, true, true, "pg_tablespace_databases", pg_tablespace_databases },
+ { 2557, 1, true, false, "int4_bool", int4_bool },
+ { 2558, 1, true, false, "bool_int4", bool_int4 },
+ { 2559, 0, true, false, "lastval", lastval },
+ { 2560, 0, true, false, "pg_postmaster_start_time", pg_postmaster_start_time },
+ { 2561, 1, true, false, "pg_blocking_pids", pg_blocking_pids },
+ { 2562, 2, true, false, "box_below", box_below },
+ { 2563, 2, true, false, "box_overbelow", box_overbelow },
+ { 2564, 2, true, false, "box_overabove", box_overabove },
+ { 2565, 2, true, false, "box_above", box_above },
+ { 2566, 2, true, false, "poly_below", poly_below },
+ { 2567, 2, true, false, "poly_overbelow", poly_overbelow },
+ { 2568, 2, true, false, "poly_overabove", poly_overabove },
+ { 2569, 2, true, false, "poly_above", poly_above },
+ { 2578, 5, true, false, "gist_box_consistent", gist_box_consistent },
+ { 2580, 1, true, false, "jsonb_float8", jsonb_float8 },
+ { 2581, 3, true, false, "gist_box_penalty", gist_box_penalty },
+ { 2582, 2, true, false, "gist_box_picksplit", gist_box_picksplit },
+ { 2583, 2, true, false, "gist_box_union", gist_box_union },
+ { 2584, 3, true, false, "gist_box_same", gist_box_same },
+ { 2585, 5, true, false, "gist_poly_consistent", gist_poly_consistent },
+ { 2586, 1, true, false, "gist_poly_compress", gist_poly_compress },
+ { 2587, 2, true, false, "circle_overbelow", circle_overbelow },
+ { 2588, 2, true, false, "circle_overabove", circle_overabove },
+ { 2591, 5, true, false, "gist_circle_consistent", gist_circle_consistent },
+ { 2592, 1, true, false, "gist_circle_compress", gist_circle_compress },
+ { 2596, 1, false, false, "numeric_stddev_pop", numeric_stddev_pop },
+ { 2597, 3, false, false, "domain_in", domain_in },
+ { 2598, 3, false, false, "domain_recv", domain_recv },
+ { 2599, 0, true, true, "pg_timezone_abbrevs", pg_timezone_abbrevs },
+ { 2614, 2, true, false, "xmlexists", xmlexists },
+ { 2621, 0, true, false, "pg_reload_conf", pg_reload_conf },
+ { 2622, 0, true, false, "pg_rotate_logfile_v2", pg_rotate_logfile_v2 },
+ { 2623, 1, true, false, "pg_stat_file_1arg", pg_stat_file_1arg },
+ { 2624, 3, true, false, "pg_read_file_off_len", pg_read_file_off_len },
+ { 2625, 1, true, true, "pg_ls_dir_1arg", pg_ls_dir_1arg },
+ { 2626, 1, true, false, "pg_sleep", pg_sleep },
+ { 2627, 1, true, false, "inetnot", inetnot },
+ { 2628, 2, true, false, "inetand", inetand },
+ { 2629, 2, true, false, "inetor", inetor },
+ { 2630, 2, true, false, "inetpl", inetpl },
+ { 2632, 2, true, false, "inetmi_int8", inetmi_int8 },
+ { 2633, 2, true, false, "inetmi", inetmi },
+ { 2647, 0, true, false, "now", now },
+ { 2648, 0, true, false, "statement_timestamp", statement_timestamp },
+ { 2649, 0, true, false, "clock_timestamp", clock_timestamp },
+ { 2700, 4, true, false, "gin_cmp_prefix", gin_cmp_prefix },
+ { 2705, 3, true, false, "pg_has_role_name_name", pg_has_role_name_name },
+ { 2706, 3, true, false, "pg_has_role_name_id", pg_has_role_name_id },
+ { 2707, 3, true, false, "pg_has_role_id_name", pg_has_role_id_name },
+ { 2708, 3, true, false, "pg_has_role_id_id", pg_has_role_id_id },
+ { 2709, 2, true, false, "pg_has_role_name", pg_has_role_name },
+ { 2710, 2, true, false, "pg_has_role_id", pg_has_role_id },
+ { 2711, 1, true, false, "interval_justify_interval", interval_justify_interval },
+ { 2730, 2, true, false, "pg_get_triggerdef_ext", pg_get_triggerdef_ext },
+ { 2731, 1, true, false, "dasind", dasind },
+ { 2732, 1, true, false, "dacosd", dacosd },
+ { 2733, 1, true, false, "datand", datand },
+ { 2734, 2, true, false, "datan2d", datan2d },
+ { 2735, 1, true, false, "dsind", dsind },
+ { 2736, 1, true, false, "dcosd", dcosd },
+ { 2737, 1, true, false, "dtand", dtand },
+ { 2738, 1, true, false, "dcotd", dcotd },
+ { 2739, 1, true, false, "pg_backup_stop", pg_backup_stop },
+ { 2740, 1, true, false, "numeric_avg_serialize", numeric_avg_serialize },
+ { 2741, 2, true, false, "numeric_avg_deserialize", numeric_avg_deserialize },
+ { 2743, 3, true, false, "ginarrayextract", ginarrayextract },
+ { 2744, 8, true, false, "ginarrayconsistent", ginarrayconsistent },
+ { 2746, 2, false, false, "int8_avg_accum", int8_avg_accum },
+ { 2747, 2, true, false, "arrayoverlap", arrayoverlap },
+ { 2748, 2, true, false, "arraycontains", arraycontains },
+ { 2749, 2, true, false, "arraycontained", arraycontained },
+ { 2758, 1, true, false, "pg_stat_get_db_tuples_returned", pg_stat_get_db_tuples_returned },
+ { 2759, 1, true, false, "pg_stat_get_db_tuples_fetched", pg_stat_get_db_tuples_fetched },
+ { 2760, 1, true, false, "pg_stat_get_db_tuples_inserted", pg_stat_get_db_tuples_inserted },
+ { 2761, 1, true, false, "pg_stat_get_db_tuples_updated", pg_stat_get_db_tuples_updated },
+ { 2762, 1, true, false, "pg_stat_get_db_tuples_deleted", pg_stat_get_db_tuples_deleted },
+ { 2763, 2, true, true, "regexp_matches_no_flags", regexp_matches_no_flags },
+ { 2764, 3, true, true, "regexp_matches", regexp_matches },
+ { 2765, 2, true, true, "regexp_split_to_table_no_flags", regexp_split_to_table_no_flags },
+ { 2766, 3, true, true, "regexp_split_to_table", regexp_split_to_table },
+ { 2767, 2, true, false, "regexp_split_to_array_no_flags", regexp_split_to_array_no_flags },
+ { 2768, 3, true, false, "regexp_split_to_array", regexp_split_to_array },
+ { 2769, 0, true, false, "pg_stat_get_bgwriter_timed_checkpoints", pg_stat_get_bgwriter_timed_checkpoints },
+ { 2770, 0, true, false, "pg_stat_get_bgwriter_requested_checkpoints", pg_stat_get_bgwriter_requested_checkpoints },
+ { 2771, 0, true, false, "pg_stat_get_bgwriter_buf_written_checkpoints", pg_stat_get_bgwriter_buf_written_checkpoints },
+ { 2772, 0, true, false, "pg_stat_get_bgwriter_buf_written_clean", pg_stat_get_bgwriter_buf_written_clean },
+ { 2773, 0, true, false, "pg_stat_get_bgwriter_maxwritten_clean", pg_stat_get_bgwriter_maxwritten_clean },
+ { 2774, 7, true, false, "ginqueryarrayextract", ginqueryarrayextract },
+ { 2775, 0, true, false, "pg_stat_get_buf_written_backend", pg_stat_get_buf_written_backend },
+ { 2777, 1, true, false, "anynonarray_in", anynonarray_in },
+ { 2778, 1, true, false, "anynonarray_out", anynonarray_out },
+ { 2781, 1, true, false, "pg_stat_get_last_vacuum_time", pg_stat_get_last_vacuum_time },
+ { 2782, 1, true, false, "pg_stat_get_last_autovacuum_time", pg_stat_get_last_autovacuum_time },
+ { 2783, 1, true, false, "pg_stat_get_last_analyze_time", pg_stat_get_last_analyze_time },
+ { 2784, 1, true, false, "pg_stat_get_last_autoanalyze_time", pg_stat_get_last_autoanalyze_time },
+ { 2785, 2, false, false, "int8_avg_combine", int8_avg_combine },
+ { 2786, 1, true, false, "int8_avg_serialize", int8_avg_serialize },
+ { 2787, 2, true, false, "int8_avg_deserialize", int8_avg_deserialize },
+ { 2788, 1, true, false, "pg_stat_get_backend_wait_event_type", pg_stat_get_backend_wait_event_type },
+ { 2790, 2, true, false, "tidgt", tidgt },
+ { 2791, 2, true, false, "tidlt", tidlt },
+ { 2792, 2, true, false, "tidge", tidge },
+ { 2793, 2, true, false, "tidle", tidle },
+ { 2794, 2, true, false, "bttidcmp", bttidcmp },
+ { 2795, 2, true, false, "tidlarger", tidlarger },
+ { 2796, 2, true, false, "tidsmaller", tidsmaller },
+ { 2804, 2, true, false, "int8inc_any", int8inc_any },
+ { 2805, 3, true, false, "int8inc_float8_float8", int8inc_float8_float8 },
+ { 2806, 3, true, false, "float8_regr_accum", float8_regr_accum },
+ { 2807, 1, true, false, "float8_regr_sxx", float8_regr_sxx },
+ { 2808, 1, true, false, "float8_regr_syy", float8_regr_syy },
+ { 2809, 1, true, false, "float8_regr_sxy", float8_regr_sxy },
+ { 2810, 1, true, false, "float8_regr_avgx", float8_regr_avgx },
+ { 2811, 1, true, false, "float8_regr_avgy", float8_regr_avgy },
+ { 2812, 1, true, false, "float8_regr_r2", float8_regr_r2 },
+ { 2813, 1, true, false, "float8_regr_slope", float8_regr_slope },
+ { 2814, 1, true, false, "float8_regr_intercept", float8_regr_intercept },
+ { 2815, 1, true, false, "float8_covar_pop", float8_covar_pop },
+ { 2816, 1, true, false, "float8_covar_samp", float8_covar_samp },
+ { 2817, 1, true, false, "float8_corr", float8_corr },
+ { 2844, 1, true, false, "pg_stat_get_db_blk_read_time", pg_stat_get_db_blk_read_time },
+ { 2845, 1, true, false, "pg_stat_get_db_blk_write_time", pg_stat_get_db_blk_write_time },
+ { 2848, 0, true, false, "pg_switch_wal", pg_switch_wal },
+ { 2849, 0, true, false, "pg_current_wal_lsn", pg_current_wal_lsn },
+ { 2850, 1, true, false, "pg_walfile_name_offset", pg_walfile_name_offset },
+ { 2851, 1, true, false, "pg_walfile_name", pg_walfile_name },
+ { 2852, 0, true, false, "pg_current_wal_insert_lsn", pg_current_wal_insert_lsn },
+ { 2853, 1, true, false, "pg_stat_get_backend_wait_event", pg_stat_get_backend_wait_event },
+ { 2854, 0, true, false, "pg_my_temp_schema", pg_my_temp_schema },
+ { 2855, 1, true, false, "pg_is_other_temp_schema", pg_is_other_temp_schema },
+ { 2856, 0, true, true, "pg_timezone_names", pg_timezone_names },
+ { 2857, 1, true, false, "pg_stat_get_backend_xact_start", pg_stat_get_backend_xact_start },
+ { 2858, 2, false, false, "numeric_avg_accum", numeric_avg_accum },
+ { 2859, 0, true, false, "pg_stat_get_buf_alloc", pg_stat_get_buf_alloc },
+ { 2878, 1, true, false, "pg_stat_get_live_tuples", pg_stat_get_live_tuples },
+ { 2879, 1, true, false, "pg_stat_get_dead_tuples", pg_stat_get_dead_tuples },
+ { 2880, 1, true, false, "pg_advisory_lock_int8", pg_advisory_lock_int8 },
+ { 2881, 1, true, false, "pg_advisory_lock_shared_int8", pg_advisory_lock_shared_int8 },
+ { 2882, 1, true, false, "pg_try_advisory_lock_int8", pg_try_advisory_lock_int8 },
+ { 2883, 1, true, false, "pg_try_advisory_lock_shared_int8", pg_try_advisory_lock_shared_int8 },
+ { 2884, 1, true, false, "pg_advisory_unlock_int8", pg_advisory_unlock_int8 },
+ { 2885, 1, true, false, "pg_advisory_unlock_shared_int8", pg_advisory_unlock_shared_int8 },
+ { 2886, 2, true, false, "pg_advisory_lock_int4", pg_advisory_lock_int4 },
+ { 2887, 2, true, false, "pg_advisory_lock_shared_int4", pg_advisory_lock_shared_int4 },
+ { 2888, 2, true, false, "pg_try_advisory_lock_int4", pg_try_advisory_lock_int4 },
+ { 2889, 2, true, false, "pg_try_advisory_lock_shared_int4", pg_try_advisory_lock_shared_int4 },
+ { 2890, 2, true, false, "pg_advisory_unlock_int4", pg_advisory_unlock_int4 },
+ { 2891, 2, true, false, "pg_advisory_unlock_shared_int4", pg_advisory_unlock_shared_int4 },
+ { 2892, 0, true, false, "pg_advisory_unlock_all", pg_advisory_unlock_all },
+ { 2893, 1, true, false, "xml_in", xml_in },
+ { 2894, 1, true, false, "xml_out", xml_out },
+ { 2895, 1, true, false, "xmlcomment", xmlcomment },
+ { 2896, 1, true, false, "texttoxml", texttoxml },
+ { 2897, 2, true, false, "xmlvalidate", xmlvalidate },
+ { 2898, 1, true, false, "xml_recv", xml_recv },
+ { 2899, 1, true, false, "xml_send", xml_send },
+ { 2900, 2, false, false, "xmlconcat2", xmlconcat2 },
+ { 2902, 1, true, false, "varbittypmodin", varbittypmodin },
+ { 2903, 1, true, false, "intervaltypmodin", intervaltypmodin },
+ { 2904, 1, true, false, "intervaltypmodout", intervaltypmodout },
+ { 2905, 1, true, false, "timestamptypmodin", timestamptypmodin },
+ { 2906, 1, true, false, "timestamptypmodout", timestamptypmodout },
+ { 2907, 1, true, false, "timestamptztypmodin", timestamptztypmodin },
+ { 2908, 1, true, false, "timestamptztypmodout", timestamptztypmodout },
+ { 2909, 1, true, false, "timetypmodin", timetypmodin },
+ { 2910, 1, true, false, "timetypmodout", timetypmodout },
+ { 2911, 1, true, false, "timetztypmodin", timetztypmodin },
+ { 2912, 1, true, false, "timetztypmodout", timetztypmodout },
+ { 2913, 1, true, false, "bpchartypmodin", bpchartypmodin },
+ { 2914, 1, true, false, "bpchartypmodout", bpchartypmodout },
+ { 2915, 1, true, false, "varchartypmodin", varchartypmodin },
+ { 2916, 1, true, false, "varchartypmodout", varchartypmodout },
+ { 2917, 1, true, false, "numerictypmodin", numerictypmodin },
+ { 2918, 1, true, false, "numerictypmodout", numerictypmodout },
+ { 2919, 1, true, false, "bittypmodin", bittypmodin },
+ { 2920, 1, true, false, "bittypmodout", bittypmodout },
+ { 2921, 1, true, false, "varbittypmodout", varbittypmodout },
+ { 2922, 1, true, false, "xmltotext", xmltotext },
+ { 2923, 4, true, false, "table_to_xml", table_to_xml },
+ { 2924, 4, true, false, "query_to_xml", query_to_xml },
+ { 2925, 5, true, false, "cursor_to_xml", cursor_to_xml },
+ { 2926, 4, true, false, "table_to_xmlschema", table_to_xmlschema },
+ { 2927, 4, true, false, "query_to_xmlschema", query_to_xmlschema },
+ { 2928, 4, true, false, "cursor_to_xmlschema", cursor_to_xmlschema },
+ { 2929, 4, true, false, "table_to_xml_and_xmlschema", table_to_xml_and_xmlschema },
+ { 2930, 4, true, false, "query_to_xml_and_xmlschema", query_to_xml_and_xmlschema },
+ { 2931, 3, true, false, "xpath", xpath },
+ { 2933, 4, true, false, "schema_to_xml", schema_to_xml },
+ { 2934, 4, true, false, "schema_to_xmlschema", schema_to_xmlschema },
+ { 2935, 4, true, false, "schema_to_xml_and_xmlschema", schema_to_xml_and_xmlschema },
+ { 2936, 3, true, false, "database_to_xml", database_to_xml },
+ { 2937, 3, true, false, "database_to_xmlschema", database_to_xmlschema },
+ { 2938, 3, true, false, "database_to_xml_and_xmlschema", database_to_xml_and_xmlschema },
+ { 2939, 1, true, false, "pg_snapshot_in", pg_snapshot_in },
+ { 2940, 1, true, false, "pg_snapshot_out", pg_snapshot_out },
+ { 2941, 1, true, false, "pg_snapshot_recv", pg_snapshot_recv },
+ { 2942, 1, true, false, "pg_snapshot_send", pg_snapshot_send },
+ { 2943, 0, true, false, "pg_current_xact_id", pg_current_xact_id },
+ { 2944, 0, true, false, "pg_current_snapshot", pg_current_snapshot },
+ { 2945, 1, true, false, "pg_snapshot_xmin", pg_snapshot_xmin },
+ { 2946, 1, true, false, "pg_snapshot_xmax", pg_snapshot_xmax },
+ { 2947, 1, true, true, "pg_snapshot_xip", pg_snapshot_xip },
+ { 2948, 2, true, false, "pg_visible_in_snapshot", pg_visible_in_snapshot },
+ { 2952, 1, true, false, "uuid_in", uuid_in },
+ { 2953, 1, true, false, "uuid_out", uuid_out },
+ { 2954, 2, true, false, "uuid_lt", uuid_lt },
+ { 2955, 2, true, false, "uuid_le", uuid_le },
+ { 2956, 2, true, false, "uuid_eq", uuid_eq },
+ { 2957, 2, true, false, "uuid_ge", uuid_ge },
+ { 2958, 2, true, false, "uuid_gt", uuid_gt },
+ { 2959, 2, true, false, "uuid_ne", uuid_ne },
+ { 2960, 2, true, false, "uuid_cmp", uuid_cmp },
+ { 2961, 1, true, false, "uuid_recv", uuid_recv },
+ { 2962, 1, true, false, "uuid_send", uuid_send },
+ { 2963, 1, true, false, "uuid_hash", uuid_hash },
+ { 2971, 1, true, false, "booltext", booltext },
+ { 2978, 1, true, false, "pg_stat_get_function_calls", pg_stat_get_function_calls },
+ { 2979, 1, true, false, "pg_stat_get_function_total_time", pg_stat_get_function_total_time },
+ { 2980, 1, true, false, "pg_stat_get_function_self_time", pg_stat_get_function_self_time },
+ { 2981, 2, true, false, "record_eq", record_eq },
+ { 2982, 2, true, false, "record_ne", record_ne },
+ { 2983, 2, true, false, "record_lt", record_lt },
+ { 2984, 2, true, false, "record_gt", record_gt },
+ { 2985, 2, true, false, "record_le", record_le },
+ { 2986, 2, true, false, "record_ge", record_ge },
+ { 2987, 2, true, false, "btrecordcmp", btrecordcmp },
+ { 2997, 1, true, false, "pg_table_size", pg_table_size },
+ { 2998, 1, true, false, "pg_indexes_size", pg_indexes_size },
+ { 2999, 1, true, false, "pg_relation_filenode", pg_relation_filenode },
+ { 3000, 3, true, false, "has_foreign_data_wrapper_privilege_name_name", has_foreign_data_wrapper_privilege_name_name },
+ { 3001, 3, true, false, "has_foreign_data_wrapper_privilege_name_id", has_foreign_data_wrapper_privilege_name_id },
+ { 3002, 3, true, false, "has_foreign_data_wrapper_privilege_id_name", has_foreign_data_wrapper_privilege_id_name },
+ { 3003, 3, true, false, "has_foreign_data_wrapper_privilege_id_id", has_foreign_data_wrapper_privilege_id_id },
+ { 3004, 2, true, false, "has_foreign_data_wrapper_privilege_name", has_foreign_data_wrapper_privilege_name },
+ { 3005, 2, true, false, "has_foreign_data_wrapper_privilege_id", has_foreign_data_wrapper_privilege_id },
+ { 3006, 3, true, false, "has_server_privilege_name_name", has_server_privilege_name_name },
+ { 3007, 3, true, false, "has_server_privilege_name_id", has_server_privilege_name_id },
+ { 3008, 3, true, false, "has_server_privilege_id_name", has_server_privilege_id_name },
+ { 3009, 3, true, false, "has_server_privilege_id_id", has_server_privilege_id_id },
+ { 3010, 2, true, false, "has_server_privilege_name", has_server_privilege_name },
+ { 3011, 2, true, false, "has_server_privilege_id", has_server_privilege_id },
+ { 3012, 4, true, false, "has_column_privilege_name_name_name", has_column_privilege_name_name_name },
+ { 3013, 4, true, false, "has_column_privilege_name_name_attnum", has_column_privilege_name_name_attnum },
+ { 3014, 4, true, false, "has_column_privilege_name_id_name", has_column_privilege_name_id_name },
+ { 3015, 4, true, false, "has_column_privilege_name_id_attnum", has_column_privilege_name_id_attnum },
+ { 3016, 4, true, false, "has_column_privilege_id_name_name", has_column_privilege_id_name_name },
+ { 3017, 4, true, false, "has_column_privilege_id_name_attnum", has_column_privilege_id_name_attnum },
+ { 3018, 4, true, false, "has_column_privilege_id_id_name", has_column_privilege_id_id_name },
+ { 3019, 4, true, false, "has_column_privilege_id_id_attnum", has_column_privilege_id_id_attnum },
+ { 3020, 3, true, false, "has_column_privilege_name_name", has_column_privilege_name_name },
+ { 3021, 3, true, false, "has_column_privilege_name_attnum", has_column_privilege_name_attnum },
+ { 3022, 3, true, false, "has_column_privilege_id_name", has_column_privilege_id_name },
+ { 3023, 3, true, false, "has_column_privilege_id_attnum", has_column_privilege_id_attnum },
+ { 3024, 3, true, false, "has_any_column_privilege_name_name", has_any_column_privilege_name_name },
+ { 3025, 3, true, false, "has_any_column_privilege_name_id", has_any_column_privilege_name_id },
+ { 3026, 3, true, false, "has_any_column_privilege_id_name", has_any_column_privilege_id_name },
+ { 3027, 3, true, false, "has_any_column_privilege_id_id", has_any_column_privilege_id_id },
+ { 3028, 2, true, false, "has_any_column_privilege_name", has_any_column_privilege_name },
+ { 3029, 2, true, false, "has_any_column_privilege_id", has_any_column_privilege_id },
+ { 3030, 4, true, false, "bitoverlay", bitoverlay },
+ { 3031, 3, true, false, "bitoverlay_no_len", bitoverlay_no_len },
+ { 3032, 2, true, false, "bitgetbit", bitgetbit },
+ { 3033, 3, true, false, "bitsetbit", bitsetbit },
+ { 3034, 1, true, false, "pg_relation_filepath", pg_relation_filepath },
+ { 3035, 0, true, true, "pg_listening_channels", pg_listening_channels },
+ { 3036, 2, false, false, "pg_notify", pg_notify },
+ { 3037, 1, true, false, "pg_stat_get_xact_numscans", pg_stat_get_xact_numscans },
+ { 3038, 1, true, false, "pg_stat_get_xact_tuples_returned", pg_stat_get_xact_tuples_returned },
+ { 3039, 1, true, false, "pg_stat_get_xact_tuples_fetched", pg_stat_get_xact_tuples_fetched },
+ { 3040, 1, true, false, "pg_stat_get_xact_tuples_inserted", pg_stat_get_xact_tuples_inserted },
+ { 3041, 1, true, false, "pg_stat_get_xact_tuples_updated", pg_stat_get_xact_tuples_updated },
+ { 3042, 1, true, false, "pg_stat_get_xact_tuples_deleted", pg_stat_get_xact_tuples_deleted },
+ { 3043, 1, true, false, "pg_stat_get_xact_tuples_hot_updated", pg_stat_get_xact_tuples_hot_updated },
+ { 3044, 1, true, false, "pg_stat_get_xact_blocks_fetched", pg_stat_get_xact_blocks_fetched },
+ { 3045, 1, true, false, "pg_stat_get_xact_blocks_hit", pg_stat_get_xact_blocks_hit },
+ { 3046, 1, true, false, "pg_stat_get_xact_function_calls", pg_stat_get_xact_function_calls },
+ { 3047, 1, true, false, "pg_stat_get_xact_function_total_time", pg_stat_get_xact_function_total_time },
+ { 3048, 1, true, false, "pg_stat_get_xact_function_self_time", pg_stat_get_xact_function_self_time },
+ { 3049, 3, true, false, "xpath_exists", xpath_exists },
+ { 3051, 1, true, false, "xml_is_well_formed", xml_is_well_formed },
+ { 3052, 1, true, false, "xml_is_well_formed_document", xml_is_well_formed_document },
+ { 3053, 1, true, false, "xml_is_well_formed_content", xml_is_well_formed_content },
+ { 3054, 1, true, false, "pg_stat_get_vacuum_count", pg_stat_get_vacuum_count },
+ { 3055, 1, true, false, "pg_stat_get_autovacuum_count", pg_stat_get_autovacuum_count },
+ { 3056, 1, true, false, "pg_stat_get_analyze_count", pg_stat_get_analyze_count },
+ { 3057, 1, true, false, "pg_stat_get_autoanalyze_count", pg_stat_get_autoanalyze_count },
+ { 3058, 1, false, false, "text_concat", text_concat },
+ { 3059, 2, false, false, "text_concat_ws", text_concat_ws },
+ { 3060, 2, true, false, "text_left", text_left },
+ { 3061, 2, true, false, "text_right", text_right },
+ { 3062, 1, true, false, "text_reverse", text_reverse },
+ { 3063, 0, true, false, "pg_stat_get_buf_fsync_backend", pg_stat_get_buf_fsync_backend },
+ { 3064, 5, true, false, "gist_point_distance", gist_point_distance },
+ { 3065, 1, true, false, "pg_stat_get_db_conflict_tablespace", pg_stat_get_db_conflict_tablespace },
+ { 3066, 1, true, false, "pg_stat_get_db_conflict_lock", pg_stat_get_db_conflict_lock },
+ { 3067, 1, true, false, "pg_stat_get_db_conflict_snapshot", pg_stat_get_db_conflict_snapshot },
+ { 3068, 1, true, false, "pg_stat_get_db_conflict_bufferpin", pg_stat_get_db_conflict_bufferpin },
+ { 3069, 1, true, false, "pg_stat_get_db_conflict_startup_deadlock", pg_stat_get_db_conflict_startup_deadlock },
+ { 3070, 1, true, false, "pg_stat_get_db_conflict_all", pg_stat_get_db_conflict_all },
+ { 3071, 0, true, false, "pg_wal_replay_pause", pg_wal_replay_pause },
+ { 3072, 0, true, false, "pg_wal_replay_resume", pg_wal_replay_resume },
+ { 3073, 0, true, false, "pg_is_wal_replay_paused", pg_is_wal_replay_paused },
+ { 3074, 1, true, false, "pg_stat_get_db_stat_reset_time", pg_stat_get_db_stat_reset_time },
+ { 3075, 0, true, false, "pg_stat_get_bgwriter_stat_reset_time", pg_stat_get_bgwriter_stat_reset_time },
+ { 3076, 2, true, false, "ginarrayextract_2args", ginarrayextract_2args },
+ { 3077, 2, true, false, "gin_extract_tsvector_2args", gin_extract_tsvector_2args },
+ { 3078, 1, true, false, "pg_sequence_parameters", pg_sequence_parameters },
+ { 3082, 0, true, true, "pg_available_extensions", pg_available_extensions },
+ { 3083, 0, true, true, "pg_available_extension_versions", pg_available_extension_versions },
+ { 3084, 1, true, true, "pg_extension_update_paths", pg_extension_update_paths },
+ { 3086, 2, true, false, "pg_extension_config_dump", pg_extension_config_dump },
+ { 3087, 5, true, false, "gin_extract_tsquery_5args", gin_extract_tsquery_5args },
+ { 3088, 6, true, false, "gin_tsquery_consistent_6args", gin_tsquery_consistent_6args },
+ { 3089, 1, true, false, "pg_advisory_xact_lock_int8", pg_advisory_xact_lock_int8 },
+ { 3090, 1, true, false, "pg_advisory_xact_lock_shared_int8", pg_advisory_xact_lock_shared_int8 },
+ { 3091, 1, true, false, "pg_try_advisory_xact_lock_int8", pg_try_advisory_xact_lock_int8 },
+ { 3092, 1, true, false, "pg_try_advisory_xact_lock_shared_int8", pg_try_advisory_xact_lock_shared_int8 },
+ { 3093, 2, true, false, "pg_advisory_xact_lock_int4", pg_advisory_xact_lock_int4 },
+ { 3094, 2, true, false, "pg_advisory_xact_lock_shared_int4", pg_advisory_xact_lock_shared_int4 },
+ { 3095, 2, true, false, "pg_try_advisory_xact_lock_int4", pg_try_advisory_xact_lock_int4 },
+ { 3096, 2, true, false, "pg_try_advisory_xact_lock_shared_int4", pg_try_advisory_xact_lock_shared_int4 },
+ { 3097, 1, true, false, "varchar_support", varchar_support },
+ { 3098, 1, true, false, "pg_create_restore_point", pg_create_restore_point },
+ { 3099, 0, false, true, "pg_stat_get_wal_senders", pg_stat_get_wal_senders },
+ { 3100, 0, false, false, "window_row_number", window_row_number },
+ { 3101, 0, false, false, "window_rank", window_rank },
+ { 3102, 0, false, false, "window_dense_rank", window_dense_rank },
+ { 3103, 0, false, false, "window_percent_rank", window_percent_rank },
+ { 3104, 0, false, false, "window_cume_dist", window_cume_dist },
+ { 3105, 1, true, false, "window_ntile", window_ntile },
+ { 3106, 1, true, false, "window_lag", window_lag },
+ { 3107, 2, true, false, "window_lag_with_offset", window_lag_with_offset },
+ { 3108, 3, true, false, "window_lag_with_offset_and_default", window_lag_with_offset_and_default },
+ { 3109, 1, true, false, "window_lead", window_lead },
+ { 3110, 2, true, false, "window_lead_with_offset", window_lead_with_offset },
+ { 3111, 3, true, false, "window_lead_with_offset_and_default", window_lead_with_offset_and_default },
+ { 3112, 1, true, false, "window_first_value", window_first_value },
+ { 3113, 1, true, false, "window_last_value", window_last_value },
+ { 3114, 2, true, false, "window_nth_value", window_nth_value },
+ { 3116, 1, false, false, "fdw_handler_in", fdw_handler_in },
+ { 3117, 1, true, false, "fdw_handler_out", fdw_handler_out },
+ { 3120, 1, true, false, "void_recv", void_recv },
+ { 3121, 1, true, false, "void_send", void_send },
+ { 3129, 1, true, false, "btint2sortsupport", btint2sortsupport },
+ { 3130, 1, true, false, "btint4sortsupport", btint4sortsupport },
+ { 3131, 1, true, false, "btint8sortsupport", btint8sortsupport },
+ { 3132, 1, true, false, "btfloat4sortsupport", btfloat4sortsupport },
+ { 3133, 1, true, false, "btfloat8sortsupport", btfloat8sortsupport },
+ { 3134, 1, true, false, "btoidsortsupport", btoidsortsupport },
+ { 3135, 1, true, false, "btnamesortsupport", btnamesortsupport },
+ { 3136, 1, true, false, "date_sortsupport", date_sortsupport },
+ { 3137, 1, true, false, "timestamp_sortsupport", timestamp_sortsupport },
+ { 3138, 3, true, false, "has_type_privilege_name_name", has_type_privilege_name_name },
+ { 3139, 3, true, false, "has_type_privilege_name_id", has_type_privilege_name_id },
+ { 3140, 3, true, false, "has_type_privilege_id_name", has_type_privilege_id_name },
+ { 3141, 3, true, false, "has_type_privilege_id_id", has_type_privilege_id_id },
+ { 3142, 2, true, false, "has_type_privilege_name", has_type_privilege_name },
+ { 3143, 2, true, false, "has_type_privilege_id", has_type_privilege_id },
+ { 3144, 1, true, false, "macaddr_not", macaddr_not },
+ { 3145, 2, true, false, "macaddr_and", macaddr_and },
+ { 3146, 2, true, false, "macaddr_or", macaddr_or },
+ { 3150, 1, true, false, "pg_stat_get_db_temp_files", pg_stat_get_db_temp_files },
+ { 3151, 1, true, false, "pg_stat_get_db_temp_bytes", pg_stat_get_db_temp_bytes },
+ { 3152, 1, true, false, "pg_stat_get_db_deadlocks", pg_stat_get_db_deadlocks },
+ { 3153, 1, true, false, "array_to_json", array_to_json },
+ { 3154, 2, true, false, "array_to_json_pretty", array_to_json_pretty },
+ { 3155, 1, true, false, "row_to_json", row_to_json },
+ { 3156, 2, true, false, "row_to_json_pretty", row_to_json_pretty },
+ { 3157, 1, true, false, "numeric_support", numeric_support },
+ { 3158, 1, true, false, "varbit_support", varbit_support },
+ { 3159, 2, true, false, "pg_get_viewdef_wrap", pg_get_viewdef_wrap },
+ { 3160, 0, true, false, "pg_stat_get_checkpoint_write_time", pg_stat_get_checkpoint_write_time },
+ { 3161, 0, true, false, "pg_stat_get_checkpoint_sync_time", pg_stat_get_checkpoint_sync_time },
+ { 3162, 1, false, false, "pg_collation_for", pg_collation_for },
+ { 3163, 0, true, false, "pg_trigger_depth", pg_trigger_depth },
+ { 3165, 2, true, false, "pg_wal_lsn_diff", pg_wal_lsn_diff },
+ { 3166, 1, true, false, "pg_size_pretty_numeric", pg_size_pretty_numeric },
+ { 3167, 2, false, false, "array_remove", array_remove },
+ { 3168, 3, false, false, "array_replace", array_replace },
+ { 3169, 4, true, false, "rangesel", rangesel },
+ { 3170, 3, true, false, "be_lo_lseek64", be_lo_lseek64 },
+ { 3171, 1, true, false, "be_lo_tell64", be_lo_tell64 },
+ { 3172, 2, true, false, "be_lo_truncate64", be_lo_truncate64 },
+ { 3173, 2, false, false, "json_agg_transfn", json_agg_transfn },
+ { 3174, 1, false, false, "json_agg_finalfn", json_agg_finalfn },
+ { 3176, 1, true, false, "to_json", to_json },
+ { 3177, 1, true, false, "pg_stat_get_mod_since_analyze", pg_stat_get_mod_since_analyze },
+ { 3178, 1, false, false, "numeric_sum", numeric_sum },
+ { 3179, 1, true, false, "array_cardinality", array_cardinality },
+ { 3180, 3, false, false, "json_object_agg_transfn", json_object_agg_transfn },
+ { 3181, 2, true, false, "record_image_eq", record_image_eq },
+ { 3182, 2, true, false, "record_image_ne", record_image_ne },
+ { 3183, 2, true, false, "record_image_lt", record_image_lt },
+ { 3184, 2, true, false, "record_image_gt", record_image_gt },
+ { 3185, 2, true, false, "record_image_le", record_image_le },
+ { 3186, 2, true, false, "record_image_ge", record_image_ge },
+ { 3187, 2, true, false, "btrecordimagecmp", btrecordimagecmp },
+ { 3195, 0, false, false, "pg_stat_get_archiver", pg_stat_get_archiver },
+ { 3196, 1, false, false, "json_object_agg_finalfn", json_object_agg_finalfn },
+ { 3198, 1, false, false, "json_build_array", json_build_array },
+ { 3199, 0, false, false, "json_build_array_noargs", json_build_array_noargs },
+ { 3200, 1, false, false, "json_build_object", json_build_object },
+ { 3201, 0, false, false, "json_build_object_noargs", json_build_object_noargs },
+ { 3202, 1, true, false, "json_object", json_object },
+ { 3203, 2, true, false, "json_object_two_arg", json_object_two_arg },
+ { 3204, 1, true, false, "json_to_record", json_to_record },
+ { 3205, 1, false, true, "json_to_recordset", json_to_recordset },
+ { 3207, 1, true, false, "jsonb_array_length", jsonb_array_length },
+ { 3208, 1, true, true, "jsonb_each", jsonb_each },
+ { 3209, 2, false, false, "jsonb_populate_record", jsonb_populate_record },
+ { 3210, 1, true, false, "jsonb_typeof", jsonb_typeof },
+ { 3214, 2, true, false, "jsonb_object_field_text", jsonb_object_field_text },
+ { 3215, 2, true, false, "jsonb_array_element", jsonb_array_element },
+ { 3216, 2, true, false, "jsonb_array_element_text", jsonb_array_element_text },
+ { 3217, 2, true, false, "jsonb_extract_path", jsonb_extract_path },
+ { 3218, 2, true, false, "width_bucket_array", width_bucket_array },
+ { 3219, 1, true, true, "jsonb_array_elements", jsonb_array_elements },
+ { 3229, 1, true, false, "pg_lsn_in", pg_lsn_in },
+ { 3230, 1, true, false, "pg_lsn_out", pg_lsn_out },
+ { 3231, 2, true, false, "pg_lsn_lt", pg_lsn_lt },
+ { 3232, 2, true, false, "pg_lsn_le", pg_lsn_le },
+ { 3233, 2, true, false, "pg_lsn_eq", pg_lsn_eq },
+ { 3234, 2, true, false, "pg_lsn_ge", pg_lsn_ge },
+ { 3235, 2, true, false, "pg_lsn_gt", pg_lsn_gt },
+ { 3236, 2, true, false, "pg_lsn_ne", pg_lsn_ne },
+ { 3237, 2, true, false, "pg_lsn_mi", pg_lsn_mi },
+ { 3238, 1, true, false, "pg_lsn_recv", pg_lsn_recv },
+ { 3239, 1, true, false, "pg_lsn_send", pg_lsn_send },
+ { 3251, 2, true, false, "pg_lsn_cmp", pg_lsn_cmp },
+ { 3252, 1, true, false, "pg_lsn_hash", pg_lsn_hash },
+ { 3255, 1, true, false, "bttextsortsupport", bttextsortsupport },
+ { 3259, 3, true, true, "generate_series_step_numeric", generate_series_step_numeric },
+ { 3260, 2, true, true, "generate_series_numeric", generate_series_numeric },
+ { 3261, 1, true, false, "json_strip_nulls", json_strip_nulls },
+ { 3262, 1, true, false, "jsonb_strip_nulls", jsonb_strip_nulls },
+ { 3263, 1, true, false, "jsonb_object", jsonb_object },
+ { 3264, 2, true, false, "jsonb_object_two_arg", jsonb_object_two_arg },
+ { 3265, 2, false, false, "jsonb_agg_transfn", jsonb_agg_transfn },
+ { 3266, 1, false, false, "jsonb_agg_finalfn", jsonb_agg_finalfn },
+ { 3268, 3, false, false, "jsonb_object_agg_transfn", jsonb_object_agg_transfn },
+ { 3269, 1, false, false, "jsonb_object_agg_finalfn", jsonb_object_agg_finalfn },
+ { 3271, 1, false, false, "jsonb_build_array", jsonb_build_array },
+ { 3272, 0, false, false, "jsonb_build_array_noargs", jsonb_build_array_noargs },
+ { 3273, 1, false, false, "jsonb_build_object", jsonb_build_object },
+ { 3274, 0, false, false, "jsonb_build_object_noargs", jsonb_build_object_noargs },
+ { 3275, 2, true, false, "dist_ppoly", dist_ppoly },
+ { 3277, 2, false, false, "array_position", array_position },
+ { 3278, 3, false, false, "array_position_start", array_position_start },
+ { 3279, 2, false, false, "array_positions", array_positions },
+ { 3280, 5, true, false, "gist_circle_distance", gist_circle_distance },
+ { 3281, 1, true, false, "numeric_scale", numeric_scale },
+ { 3282, 1, true, false, "gist_point_fetch", gist_point_fetch },
+ { 3283, 1, true, false, "numeric_sortsupport", numeric_sortsupport },
+ { 3288, 5, true, false, "gist_poly_distance", gist_poly_distance },
+ { 3290, 2, true, false, "dist_cpoint", dist_cpoint },
+ { 3292, 2, true, false, "dist_polyp", dist_polyp },
+ { 3293, 4, true, false, "pg_read_file_v2", pg_read_file_v2 },
+ { 3294, 2, true, false, "show_config_by_name_missing_ok", show_config_by_name_missing_ok },
+ { 3295, 4, true, false, "pg_read_binary_file", pg_read_binary_file },
+ { 3296, 0, true, false, "pg_notification_queue_usage", pg_notification_queue_usage },
+ { 3297, 3, true, true, "pg_ls_dir", pg_ls_dir },
+ { 3298, 1, true, false, "row_security_active", row_security_active },
+ { 3299, 1, true, false, "row_security_active_name", row_security_active_name },
+ { 3300, 1, true, false, "uuid_sortsupport", uuid_sortsupport },
+ { 3301, 2, true, false, "jsonb_concat", jsonb_concat },
+ { 3302, 2, true, false, "jsonb_delete", jsonb_delete },
+ { 3303, 2, true, false, "jsonb_delete_idx", jsonb_delete_idx },
+ { 3304, 2, true, false, "jsonb_delete_path", jsonb_delete_path },
+ { 3305, 4, true, false, "jsonb_set", jsonb_set },
+ { 3306, 1, true, false, "jsonb_pretty", jsonb_pretty },
+ { 3307, 2, true, false, "pg_stat_file", pg_stat_file },
+ { 3308, 2, true, false, "xidneq", xidneq },
+ { 3309, 2, true, false, "xidneq", xidneq },
+ { 3311, 1, false, false, "tsm_handler_in", tsm_handler_in },
+ { 3312, 1, true, false, "tsm_handler_out", tsm_handler_out },
+ { 3313, 1, true, false, "tsm_bernoulli_handler", tsm_bernoulli_handler },
+ { 3314, 1, true, false, "tsm_system_handler", tsm_system_handler },
+ { 3317, 0, false, false, "pg_stat_get_wal_receiver", pg_stat_get_wal_receiver },
+ { 3318, 1, true, true, "pg_stat_get_progress_info", pg_stat_get_progress_info },
+ { 3319, 2, true, false, "tsvector_filter", tsvector_filter },
+ { 3320, 3, true, false, "tsvector_setweight_by_filter", tsvector_setweight_by_filter },
+ { 3321, 2, true, false, "tsvector_delete_str", tsvector_delete_str },
+ { 3322, 1, true, true, "tsvector_unnest", tsvector_unnest },
+ { 3323, 2, true, false, "tsvector_delete_arr", tsvector_delete_arr },
+ { 3324, 2, true, false, "int4_avg_combine", int4_avg_combine },
+ { 3325, 2, true, false, "interval_combine", interval_combine },
+ { 3326, 1, true, false, "tsvector_to_array", tsvector_to_array },
+ { 3327, 1, true, false, "array_to_tsvector", array_to_tsvector },
+ { 3328, 1, true, false, "bpchar_sortsupport", bpchar_sortsupport },
+ { 3329, 0, true, true, "show_all_file_settings", show_all_file_settings },
+ { 3330, 0, true, false, "pg_current_wal_flush_lsn", pg_current_wal_flush_lsn },
+ { 3331, 1, true, false, "bytea_sortsupport", bytea_sortsupport },
+ { 3332, 1, true, false, "bttext_pattern_sortsupport", bttext_pattern_sortsupport },
+ { 3333, 1, true, false, "btbpchar_pattern_sortsupport", btbpchar_pattern_sortsupport },
+ { 3334, 1, true, false, "pg_size_bytes", pg_size_bytes },
+ { 3335, 1, true, false, "numeric_serialize", numeric_serialize },
+ { 3336, 2, true, false, "numeric_deserialize", numeric_deserialize },
+ { 3337, 2, false, false, "numeric_avg_combine", numeric_avg_combine },
+ { 3338, 2, false, false, "numeric_poly_combine", numeric_poly_combine },
+ { 3339, 1, true, false, "numeric_poly_serialize", numeric_poly_serialize },
+ { 3340, 2, true, false, "numeric_poly_deserialize", numeric_poly_deserialize },
+ { 3341, 2, false, false, "numeric_combine", numeric_combine },
+ { 3342, 2, true, false, "float8_regr_combine", float8_regr_combine },
+ { 3343, 2, true, false, "jsonb_delete_array", jsonb_delete_array },
+ { 3344, 2, true, false, "cash_mul_int8", cash_mul_int8 },
+ { 3345, 2, true, false, "cash_div_int8", cash_div_int8 },
+ { 3348, 0, true, false, "pg_current_xact_id_if_assigned", pg_current_xact_id_if_assigned },
+ { 3352, 1, true, false, "pg_get_partkeydef", pg_get_partkeydef },
+ { 3353, 0, true, true, "pg_ls_logdir", pg_ls_logdir },
+ { 3354, 0, true, true, "pg_ls_waldir", pg_ls_waldir },
+ { 3355, 1, true, false, "pg_ndistinct_in", pg_ndistinct_in },
+ { 3356, 1, true, false, "pg_ndistinct_out", pg_ndistinct_out },
+ { 3357, 1, true, false, "pg_ndistinct_recv", pg_ndistinct_recv },
+ { 3358, 1, true, false, "pg_ndistinct_send", pg_ndistinct_send },
+ { 3359, 1, true, false, "macaddr_sortsupport", macaddr_sortsupport },
+ { 3360, 1, true, false, "pg_xact_status", pg_xact_status },
+ { 3376, 1, true, false, "pg_safe_snapshot_blocking_pids", pg_safe_snapshot_blocking_pids },
+ { 3378, 2, true, false, "pg_isolation_test_session_is_blocked", pg_isolation_test_session_is_blocked },
+ { 3382, 3, true, false, "pg_identify_object_as_address", pg_identify_object_as_address },
+ { 3383, 1, true, false, "brin_minmax_opcinfo", brin_minmax_opcinfo },
+ { 3384, 4, true, false, "brin_minmax_add_value", brin_minmax_add_value },
+ { 3385, 3, true, false, "brin_minmax_consistent", brin_minmax_consistent },
+ { 3386, 3, true, false, "brin_minmax_union", brin_minmax_union },
+ { 3387, 2, false, false, "int8_avg_accum_inv", int8_avg_accum_inv },
+ { 3388, 1, false, false, "numeric_poly_sum", numeric_poly_sum },
+ { 3389, 1, false, false, "numeric_poly_avg", numeric_poly_avg },
+ { 3390, 1, false, false, "numeric_poly_var_pop", numeric_poly_var_pop },
+ { 3391, 1, false, false, "numeric_poly_var_samp", numeric_poly_var_samp },
+ { 3392, 1, false, false, "numeric_poly_stddev_pop", numeric_poly_stddev_pop },
+ { 3393, 1, false, false, "numeric_poly_stddev_samp", numeric_poly_stddev_samp },
+ { 3396, 2, true, false, "regexp_match_no_flags", regexp_match_no_flags },
+ { 3397, 3, true, false, "regexp_match", regexp_match },
+ { 3399, 2, true, false, "int8_mul_cash", int8_mul_cash },
+ { 3400, 0, true, true, "pg_config", pg_config },
+ { 3401, 0, true, true, "pg_hba_file_rules", pg_hba_file_rules },
+ { 3403, 1, true, false, "pg_statistics_obj_is_visible", pg_statistics_obj_is_visible },
+ { 3404, 1, true, false, "pg_dependencies_in", pg_dependencies_in },
+ { 3405, 1, true, false, "pg_dependencies_out", pg_dependencies_out },
+ { 3406, 1, true, false, "pg_dependencies_recv", pg_dependencies_recv },
+ { 3407, 1, true, false, "pg_dependencies_send", pg_dependencies_send },
+ { 3408, 1, true, false, "pg_get_partition_constraintdef", pg_get_partition_constraintdef },
+ { 3409, 2, true, false, "time_hash_extended", time_hash_extended },
+ { 3410, 2, true, false, "timetz_hash_extended", timetz_hash_extended },
+ { 3411, 2, true, false, "timestamp_hash_extended", timestamp_hash_extended },
+ { 3412, 2, true, false, "uuid_hash_extended", uuid_hash_extended },
+ { 3413, 2, true, false, "pg_lsn_hash_extended", pg_lsn_hash_extended },
+ { 3414, 2, true, false, "hashenumextended", hashenumextended },
+ { 3415, 1, true, false, "pg_get_statisticsobjdef", pg_get_statisticsobjdef },
+ { 3416, 2, true, false, "jsonb_hash_extended", jsonb_hash_extended },
+ { 3417, 2, true, false, "hash_range_extended", hash_range_extended },
+ { 3418, 2, true, false, "interval_hash_extended", interval_hash_extended },
+ { 3419, 1, true, false, "sha224_bytea", sha224_bytea },
+ { 3420, 1, true, false, "sha256_bytea", sha256_bytea },
+ { 3421, 1, true, false, "sha384_bytea", sha384_bytea },
+ { 3422, 1, true, false, "sha512_bytea", sha512_bytea },
+ { 3423, 1, true, true, "pg_partition_tree", pg_partition_tree },
+ { 3424, 1, true, false, "pg_partition_root", pg_partition_root },
+ { 3425, 1, true, true, "pg_partition_ancestors", pg_partition_ancestors },
+ { 3426, 1, true, false, "pg_stat_get_db_checksum_failures", pg_stat_get_db_checksum_failures },
+ { 3427, 1, true, true, "pg_stats_ext_mcvlist_items", pg_stats_ext_mcvlist_items },
+ { 3428, 1, true, false, "pg_stat_get_db_checksum_last_failure", pg_stat_get_db_checksum_last_failure },
+ { 3432, 0, true, false, "gen_random_uuid", gen_random_uuid },
+ { 3434, 1, false, false, "gtsvector_options", gtsvector_options },
+ { 3435, 1, true, false, "gist_point_sortsupport", gist_point_sortsupport },
+ { 3436, 2, true, false, "pg_promote", pg_promote },
+ { 3437, 4, true, false, "prefixsel", prefixsel },
+ { 3438, 5, true, false, "prefixjoinsel", prefixjoinsel },
+ { 3441, 0, true, false, "pg_control_system", pg_control_system },
+ { 3442, 0, true, false, "pg_control_checkpoint", pg_control_checkpoint },
+ { 3443, 0, true, false, "pg_control_recovery", pg_control_recovery },
+ { 3444, 0, true, false, "pg_control_init", pg_control_init },
+ { 3445, 1, true, false, "pg_import_system_collations", pg_import_system_collations },
+ { 3446, 1, true, false, "macaddr8_recv", macaddr8_recv },
+ { 3447, 1, true, false, "macaddr8_send", macaddr8_send },
+ { 3448, 1, true, false, "pg_collation_actual_version", pg_collation_actual_version },
+ { 3449, 1, true, false, "jsonb_numeric", jsonb_numeric },
+ { 3450, 1, true, false, "jsonb_int2", jsonb_int2 },
+ { 3451, 1, true, false, "jsonb_int4", jsonb_int4 },
+ { 3452, 1, true, false, "jsonb_int8", jsonb_int8 },
+ { 3453, 1, true, false, "jsonb_float4", jsonb_float4 },
+ { 3454, 2, true, false, "pg_filenode_relation", pg_filenode_relation },
+ { 3457, 2, true, false, "be_lo_from_bytea", be_lo_from_bytea },
+ { 3458, 1, true, false, "be_lo_get", be_lo_get },
+ { 3459, 3, true, false, "be_lo_get_fragment", be_lo_get_fragment },
+ { 3460, 3, true, false, "be_lo_put", be_lo_put },
+ { 3461, 6, true, false, "make_timestamp", make_timestamp },
+ { 3462, 6, true, false, "make_timestamptz", make_timestamptz },
+ { 3463, 7, true, false, "make_timestamptz_at_timezone", make_timestamptz_at_timezone },
+ { 3464, 7, true, false, "make_interval", make_interval },
+ { 3465, 1, true, true, "jsonb_array_elements_text", jsonb_array_elements_text },
+ { 3469, 2, true, false, "spg_range_quad_config", spg_range_quad_config },
+ { 3470, 2, true, false, "spg_range_quad_choose", spg_range_quad_choose },
+ { 3471, 2, true, false, "spg_range_quad_picksplit", spg_range_quad_picksplit },
+ { 3472, 2, true, false, "spg_range_quad_inner_consistent", spg_range_quad_inner_consistent },
+ { 3473, 2, true, false, "spg_range_quad_leaf_consistent", spg_range_quad_leaf_consistent },
+ { 3475, 2, false, true, "jsonb_populate_recordset", jsonb_populate_recordset },
+ { 3476, 1, true, false, "to_regoperator", to_regoperator },
+ { 3478, 2, true, false, "jsonb_object_field", jsonb_object_field },
+ { 3479, 1, true, false, "to_regprocedure", to_regprocedure },
+ { 3480, 2, true, false, "gin_compare_jsonb", gin_compare_jsonb },
+ { 3482, 3, true, false, "gin_extract_jsonb", gin_extract_jsonb },
+ { 3483, 7, true, false, "gin_extract_jsonb_query", gin_extract_jsonb_query },
+ { 3484, 8, true, false, "gin_consistent_jsonb", gin_consistent_jsonb },
+ { 3485, 3, true, false, "gin_extract_jsonb_path", gin_extract_jsonb_path },
+ { 3486, 7, true, false, "gin_extract_jsonb_query_path", gin_extract_jsonb_query_path },
+ { 3487, 8, true, false, "gin_consistent_jsonb_path", gin_consistent_jsonb_path },
+ { 3488, 7, true, false, "gin_triconsistent_jsonb", gin_triconsistent_jsonb },
+ { 3489, 7, true, false, "gin_triconsistent_jsonb_path", gin_triconsistent_jsonb_path },
+ { 3490, 1, true, false, "jsonb_to_record", jsonb_to_record },
+ { 3491, 1, false, true, "jsonb_to_recordset", jsonb_to_recordset },
+ { 3492, 1, true, false, "to_regoper", to_regoper },
+ { 3493, 1, true, false, "to_regtype", to_regtype },
+ { 3494, 1, true, false, "to_regproc", to_regproc },
+ { 3495, 1, true, false, "to_regclass", to_regclass },
+ { 3496, 2, false, false, "bool_accum", bool_accum },
+ { 3497, 2, false, false, "bool_accum_inv", bool_accum_inv },
+ { 3498, 1, true, false, "bool_alltrue", bool_alltrue },
+ { 3499, 1, true, false, "bool_anytrue", bool_anytrue },
+ { 3504, 1, true, false, "anyenum_in", anyenum_in },
+ { 3505, 1, true, false, "anyenum_out", anyenum_out },
+ { 3506, 2, true, false, "enum_in", enum_in },
+ { 3507, 1, true, false, "enum_out", enum_out },
+ { 3508, 2, true, false, "enum_eq", enum_eq },
+ { 3509, 2, true, false, "enum_ne", enum_ne },
+ { 3510, 2, true, false, "enum_lt", enum_lt },
+ { 3511, 2, true, false, "enum_gt", enum_gt },
+ { 3512, 2, true, false, "enum_le", enum_le },
+ { 3513, 2, true, false, "enum_ge", enum_ge },
+ { 3514, 2, true, false, "enum_cmp", enum_cmp },
+ { 3515, 1, true, false, "hashenum", hashenum },
+ { 3524, 2, true, false, "enum_smaller", enum_smaller },
+ { 3525, 2, true, false, "enum_larger", enum_larger },
+ { 3528, 1, false, false, "enum_first", enum_first },
+ { 3529, 1, false, false, "enum_last", enum_last },
+ { 3530, 2, false, false, "enum_range_bounds", enum_range_bounds },
+ { 3531, 1, false, false, "enum_range_all", enum_range_all },
+ { 3532, 2, true, false, "enum_recv", enum_recv },
+ { 3533, 1, true, false, "enum_send", enum_send },
+ { 3535, 3, false, false, "string_agg_transfn", string_agg_transfn },
+ { 3536, 1, false, false, "string_agg_finalfn", string_agg_finalfn },
+ { 3537, 3, true, false, "pg_describe_object", pg_describe_object },
+ { 3539, 2, false, false, "text_format", text_format },
+ { 3540, 1, false, false, "text_format_nv", text_format_nv },
+ { 3543, 3, false, false, "bytea_string_agg_transfn", bytea_string_agg_transfn },
+ { 3544, 1, false, false, "bytea_string_agg_finalfn", bytea_string_agg_finalfn },
+ { 3546, 1, true, false, "int8dec", int8dec },
+ { 3547, 2, true, false, "int8dec_any", int8dec_any },
+ { 3548, 2, false, false, "numeric_accum_inv", numeric_accum_inv },
+ { 3549, 2, true, false, "interval_accum_inv", interval_accum_inv },
+ { 3551, 2, true, false, "network_overlap", network_overlap },
+ { 3553, 5, true, false, "inet_gist_consistent", inet_gist_consistent },
+ { 3554, 2, true, false, "inet_gist_union", inet_gist_union },
+ { 3555, 1, true, false, "inet_gist_compress", inet_gist_compress },
+ { 3556, 1, true, false, "jsonb_bool", jsonb_bool },
+ { 3557, 3, true, false, "inet_gist_penalty", inet_gist_penalty },
+ { 3558, 2, true, false, "inet_gist_picksplit", inet_gist_picksplit },
+ { 3559, 3, true, false, "inet_gist_same", inet_gist_same },
+ { 3560, 4, true, false, "networksel", networksel },
+ { 3561, 5, true, false, "networkjoinsel", networkjoinsel },
+ { 3562, 2, true, false, "network_larger", network_larger },
+ { 3563, 2, true, false, "network_smaller", network_smaller },
+ { 3566, 0, true, true, "pg_event_trigger_dropped_objects", pg_event_trigger_dropped_objects },
+ { 3567, 2, false, false, "int2_accum_inv", int2_accum_inv },
+ { 3568, 2, false, false, "int4_accum_inv", int4_accum_inv },
+ { 3569, 2, false, false, "int8_accum_inv", int8_accum_inv },
+ { 3570, 2, true, false, "int2_avg_accum_inv", int2_avg_accum_inv },
+ { 3571, 2, true, false, "int4_avg_accum_inv", int4_avg_accum_inv },
+ { 3572, 1, true, false, "int2int4_sum", int2int4_sum },
+ { 3573, 1, true, false, "inet_gist_fetch", inet_gist_fetch },
+ { 3577, 3, true, false, "pg_logical_emit_message_text", pg_logical_emit_message_text },
+ { 3578, 3, true, false, "pg_logical_emit_message_bytea", pg_logical_emit_message_bytea },
+ { 3579, 4, true, false, "jsonb_insert", jsonb_insert },
+ { 3581, 1, true, false, "pg_xact_commit_timestamp", pg_xact_commit_timestamp },
+ { 3582, 1, true, false, "binary_upgrade_set_next_pg_type_oid", binary_upgrade_set_next_pg_type_oid },
+ { 3583, 0, true, false, "pg_last_committed_xact", pg_last_committed_xact },
+ { 3584, 1, true, false, "binary_upgrade_set_next_array_pg_type_oid", binary_upgrade_set_next_array_pg_type_oid },
+ { 3586, 1, true, false, "binary_upgrade_set_next_heap_pg_class_oid", binary_upgrade_set_next_heap_pg_class_oid },
+ { 3587, 1, true, false, "binary_upgrade_set_next_index_pg_class_oid", binary_upgrade_set_next_index_pg_class_oid },
+ { 3588, 1, true, false, "binary_upgrade_set_next_toast_pg_class_oid", binary_upgrade_set_next_toast_pg_class_oid },
+ { 3589, 1, true, false, "binary_upgrade_set_next_pg_enum_oid", binary_upgrade_set_next_pg_enum_oid },
+ { 3590, 1, true, false, "binary_upgrade_set_next_pg_authid_oid", binary_upgrade_set_next_pg_authid_oid },
+ { 3591, 7, false, false, "binary_upgrade_create_empty_extension", binary_upgrade_create_empty_extension },
+ { 3594, 1, false, false, "event_trigger_in", event_trigger_in },
+ { 3595, 1, true, false, "event_trigger_out", event_trigger_out },
+ { 3610, 1, true, false, "tsvectorin", tsvectorin },
+ { 3611, 1, true, false, "tsvectorout", tsvectorout },
+ { 3612, 1, true, false, "tsqueryin", tsqueryin },
+ { 3613, 1, true, false, "tsqueryout", tsqueryout },
+ { 3616, 2, true, false, "tsvector_lt", tsvector_lt },
+ { 3617, 2, true, false, "tsvector_le", tsvector_le },
+ { 3618, 2, true, false, "tsvector_eq", tsvector_eq },
+ { 3619, 2, true, false, "tsvector_ne", tsvector_ne },
+ { 3620, 2, true, false, "tsvector_ge", tsvector_ge },
+ { 3621, 2, true, false, "tsvector_gt", tsvector_gt },
+ { 3622, 2, true, false, "tsvector_cmp", tsvector_cmp },
+ { 3623, 1, true, false, "tsvector_strip", tsvector_strip },
+ { 3624, 2, true, false, "tsvector_setweight", tsvector_setweight },
+ { 3625, 2, true, false, "tsvector_concat", tsvector_concat },
+ { 3634, 2, true, false, "ts_match_vq", ts_match_vq },
+ { 3635, 2, true, false, "ts_match_qv", ts_match_qv },
+ { 3638, 1, true, false, "tsvectorsend", tsvectorsend },
+ { 3639, 1, true, false, "tsvectorrecv", tsvectorrecv },
+ { 3640, 1, true, false, "tsquerysend", tsquerysend },
+ { 3641, 1, true, false, "tsqueryrecv", tsqueryrecv },
+ { 3646, 1, true, false, "gtsvectorin", gtsvectorin },
+ { 3647, 1, true, false, "gtsvectorout", gtsvectorout },
+ { 3648, 1, true, false, "gtsvector_compress", gtsvector_compress },
+ { 3649, 1, true, false, "gtsvector_decompress", gtsvector_decompress },
+ { 3650, 2, true, false, "gtsvector_picksplit", gtsvector_picksplit },
+ { 3651, 2, true, false, "gtsvector_union", gtsvector_union },
+ { 3652, 3, true, false, "gtsvector_same", gtsvector_same },
+ { 3653, 3, true, false, "gtsvector_penalty", gtsvector_penalty },
+ { 3654, 5, true, false, "gtsvector_consistent", gtsvector_consistent },
+ { 3656, 3, true, false, "gin_extract_tsvector", gin_extract_tsvector },
+ { 3657, 7, true, false, "gin_extract_tsquery", gin_extract_tsquery },
+ { 3658, 8, true, false, "gin_tsquery_consistent", gin_tsquery_consistent },
+ { 3662, 2, true, false, "tsquery_lt", tsquery_lt },
+ { 3663, 2, true, false, "tsquery_le", tsquery_le },
+ { 3664, 2, true, false, "tsquery_eq", tsquery_eq },
+ { 3665, 2, true, false, "tsquery_ne", tsquery_ne },
+ { 3666, 2, true, false, "tsquery_ge", tsquery_ge },
+ { 3667, 2, true, false, "tsquery_gt", tsquery_gt },
+ { 3668, 2, true, false, "tsquery_cmp", tsquery_cmp },
+ { 3669, 2, true, false, "tsquery_and", tsquery_and },
+ { 3670, 2, true, false, "tsquery_or", tsquery_or },
+ { 3671, 1, true, false, "tsquery_not", tsquery_not },
+ { 3672, 1, true, false, "tsquery_numnode", tsquery_numnode },
+ { 3673, 1, true, false, "tsquerytree", tsquerytree },
+ { 3684, 3, true, false, "tsquery_rewrite", tsquery_rewrite },
+ { 3685, 2, true, false, "tsquery_rewrite_query", tsquery_rewrite_query },
+ { 3686, 4, true, false, "tsmatchsel", tsmatchsel },
+ { 3687, 5, true, false, "tsmatchjoinsel", tsmatchjoinsel },
+ { 3688, 1, true, false, "ts_typanalyze", ts_typanalyze },
+ { 3689, 1, true, true, "ts_stat1", ts_stat1 },
+ { 3690, 2, true, true, "ts_stat2", ts_stat2 },
+ { 3691, 2, true, false, "tsq_mcontains", tsq_mcontains },
+ { 3692, 2, true, false, "tsq_mcontained", tsq_mcontained },
+ { 3695, 1, true, false, "gtsquery_compress", gtsquery_compress },
+ { 3696, 2, true, false, "text_starts_with", text_starts_with },
+ { 3697, 2, true, false, "gtsquery_picksplit", gtsquery_picksplit },
+ { 3698, 2, true, false, "gtsquery_union", gtsquery_union },
+ { 3699, 3, true, false, "gtsquery_same", gtsquery_same },
+ { 3700, 3, true, false, "gtsquery_penalty", gtsquery_penalty },
+ { 3701, 5, true, false, "gtsquery_consistent", gtsquery_consistent },
+ { 3703, 4, true, false, "ts_rank_wttf", ts_rank_wttf },
+ { 3704, 3, true, false, "ts_rank_wtt", ts_rank_wtt },
+ { 3705, 3, true, false, "ts_rank_ttf", ts_rank_ttf },
+ { 3706, 2, true, false, "ts_rank_tt", ts_rank_tt },
+ { 3707, 4, true, false, "ts_rankcd_wttf", ts_rankcd_wttf },
+ { 3708, 3, true, false, "ts_rankcd_wtt", ts_rankcd_wtt },
+ { 3709, 3, true, false, "ts_rankcd_ttf", ts_rankcd_ttf },
+ { 3710, 2, true, false, "ts_rankcd_tt", ts_rankcd_tt },
+ { 3711, 1, true, false, "tsvector_length", tsvector_length },
+ { 3713, 1, true, true, "ts_token_type_byid", ts_token_type_byid },
+ { 3714, 1, true, true, "ts_token_type_byname", ts_token_type_byname },
+ { 3715, 2, true, true, "ts_parse_byid", ts_parse_byid },
+ { 3716, 2, true, true, "ts_parse_byname", ts_parse_byname },
+ { 3717, 2, true, false, "prsd_start", prsd_start },
+ { 3718, 3, true, false, "prsd_nexttoken", prsd_nexttoken },
+ { 3719, 1, true, false, "prsd_end", prsd_end },
+ { 3720, 3, true, false, "prsd_headline", prsd_headline },
+ { 3721, 1, true, false, "prsd_lextype", prsd_lextype },
+ { 3723, 2, true, false, "ts_lexize", ts_lexize },
+ { 3724, 2, true, false, "gin_cmp_tslexeme", gin_cmp_tslexeme },
+ { 3725, 1, true, false, "dsimple_init", dsimple_init },
+ { 3726, 4, true, false, "dsimple_lexize", dsimple_lexize },
+ { 3728, 1, true, false, "dsynonym_init", dsynonym_init },
+ { 3729, 4, true, false, "dsynonym_lexize", dsynonym_lexize },
+ { 3731, 1, true, false, "dispell_init", dispell_init },
+ { 3732, 4, true, false, "dispell_lexize", dispell_lexize },
+ { 3736, 1, true, false, "regconfigin", regconfigin },
+ { 3737, 1, true, false, "regconfigout", regconfigout },
+ { 3738, 1, true, false, "regconfigrecv", regconfigrecv },
+ { 3739, 1, true, false, "regconfigsend", regconfigsend },
+ { 3740, 1, true, false, "thesaurus_init", thesaurus_init },
+ { 3741, 4, true, false, "thesaurus_lexize", thesaurus_lexize },
+ { 3743, 4, true, false, "ts_headline_byid_opt", ts_headline_byid_opt },
+ { 3744, 3, true, false, "ts_headline_byid", ts_headline_byid },
+ { 3745, 2, true, false, "to_tsvector_byid", to_tsvector_byid },
+ { 3746, 2, true, false, "to_tsquery_byid", to_tsquery_byid },
+ { 3747, 2, true, false, "plainto_tsquery_byid", plainto_tsquery_byid },
+ { 3749, 1, true, false, "to_tsvector", to_tsvector },
+ { 3750, 1, true, false, "to_tsquery", to_tsquery },
+ { 3751, 1, true, false, "plainto_tsquery", plainto_tsquery },
+ { 3752, 0, false, false, "tsvector_update_trigger_byid", tsvector_update_trigger_byid },
+ { 3753, 0, false, false, "tsvector_update_trigger_bycolumn", tsvector_update_trigger_bycolumn },
+ { 3754, 3, true, false, "ts_headline_opt", ts_headline_opt },
+ { 3755, 2, true, false, "ts_headline", ts_headline },
+ { 3756, 1, true, false, "pg_ts_parser_is_visible", pg_ts_parser_is_visible },
+ { 3757, 1, true, false, "pg_ts_dict_is_visible", pg_ts_dict_is_visible },
+ { 3758, 1, true, false, "pg_ts_config_is_visible", pg_ts_config_is_visible },
+ { 3759, 0, true, false, "get_current_ts_config", get_current_ts_config },
+ { 3760, 2, true, false, "ts_match_tt", ts_match_tt },
+ { 3761, 2, true, false, "ts_match_tq", ts_match_tq },
+ { 3768, 1, true, false, "pg_ts_template_is_visible", pg_ts_template_is_visible },
+ { 3771, 1, true, false, "regdictionaryin", regdictionaryin },
+ { 3772, 1, true, false, "regdictionaryout", regdictionaryout },
+ { 3773, 1, true, false, "regdictionaryrecv", regdictionaryrecv },
+ { 3774, 1, true, false, "regdictionarysend", regdictionarysend },
+ { 3775, 1, true, false, "pg_stat_reset_shared", pg_stat_reset_shared },
+ { 3776, 1, true, false, "pg_stat_reset_single_table_counters", pg_stat_reset_single_table_counters },
+ { 3777, 1, true, false, "pg_stat_reset_single_function_counters", pg_stat_reset_single_function_counters },
+ { 3778, 1, true, false, "pg_tablespace_location", pg_tablespace_location },
+ { 3779, 3, true, false, "pg_create_physical_replication_slot", pg_create_physical_replication_slot },
+ { 3780, 1, true, false, "pg_drop_replication_slot", pg_drop_replication_slot },
+ { 3781, 0, false, true, "pg_get_replication_slots", pg_get_replication_slots },
+ { 3782, 4, false, true, "pg_logical_slot_get_changes", pg_logical_slot_get_changes },
+ { 3783, 4, false, true, "pg_logical_slot_get_binary_changes", pg_logical_slot_get_binary_changes },
+ { 3784, 4, false, true, "pg_logical_slot_peek_changes", pg_logical_slot_peek_changes },
+ { 3785, 4, false, true, "pg_logical_slot_peek_binary_changes", pg_logical_slot_peek_binary_changes },
+ { 3786, 4, true, false, "pg_create_logical_replication_slot", pg_create_logical_replication_slot },
+ { 3787, 1, true, false, "to_jsonb", to_jsonb },
+ { 3788, 0, true, false, "pg_stat_get_snapshot_timestamp", pg_stat_get_snapshot_timestamp },
+ { 3789, 1, true, false, "gin_clean_pending_list", gin_clean_pending_list },
+ { 3790, 5, true, false, "gtsvector_consistent_oldsig", gtsvector_consistent_oldsig },
+ { 3791, 7, true, false, "gin_extract_tsquery_oldsig", gin_extract_tsquery_oldsig },
+ { 3792, 8, true, false, "gin_tsquery_consistent_oldsig", gin_tsquery_consistent_oldsig },
+ { 3793, 5, true, false, "gtsquery_consistent_oldsig", gtsquery_consistent_oldsig },
+ { 3795, 2, true, false, "inet_spg_config", inet_spg_config },
+ { 3796, 2, true, false, "inet_spg_choose", inet_spg_choose },
+ { 3797, 2, true, false, "inet_spg_picksplit", inet_spg_picksplit },
+ { 3798, 2, true, false, "inet_spg_inner_consistent", inet_spg_inner_consistent },
+ { 3799, 2, true, false, "inet_spg_leaf_consistent", inet_spg_leaf_consistent },
+ { 3800, 0, false, false, "pg_current_logfile", pg_current_logfile },
+ { 3801, 1, false, false, "pg_current_logfile_1arg", pg_current_logfile_1arg },
+ { 3803, 1, true, false, "jsonb_send", jsonb_send },
+ { 3804, 1, true, false, "jsonb_out", jsonb_out },
+ { 3805, 1, true, false, "jsonb_recv", jsonb_recv },
+ { 3806, 1, true, false, "jsonb_in", jsonb_in },
+ { 3808, 2, true, false, "pg_get_function_arg_default", pg_get_function_arg_default },
+ { 3809, 0, true, false, "pg_export_snapshot", pg_export_snapshot },
+ { 3810, 0, true, false, "pg_is_in_recovery", pg_is_in_recovery },
+ { 3811, 1, true, false, "int4_cash", int4_cash },
+ { 3812, 1, true, false, "int8_cash", int8_cash },
+ { 3815, 1, true, false, "pg_collation_is_visible", pg_collation_is_visible },
+ { 3816, 1, true, false, "array_typanalyze", array_typanalyze },
+ { 3817, 4, true, false, "arraycontsel", arraycontsel },
+ { 3818, 5, true, false, "arraycontjoinsel", arraycontjoinsel },
+ { 3819, 1, true, true, "pg_get_multixact_members", pg_get_multixact_members },
+ { 3820, 0, true, false, "pg_last_wal_receive_lsn", pg_last_wal_receive_lsn },
+ { 3821, 0, true, false, "pg_last_wal_replay_lsn", pg_last_wal_replay_lsn },
+ { 3822, 2, true, false, "cash_div_cash", cash_div_cash },
+ { 3823, 1, true, false, "cash_numeric", cash_numeric },
+ { 3824, 1, true, false, "numeric_cash", numeric_cash },
+ { 3826, 1, true, false, "pg_read_file_all", pg_read_file_all },
+ { 3827, 3, true, false, "pg_read_binary_file_off_len", pg_read_binary_file_off_len },
+ { 3828, 1, true, false, "pg_read_binary_file_all", pg_read_binary_file_all },
+ { 3829, 1, true, false, "pg_opfamily_is_visible", pg_opfamily_is_visible },
+ { 3830, 0, true, false, "pg_last_xact_replay_timestamp", pg_last_xact_replay_timestamp },
+ { 3832, 3, true, false, "anyrange_in", anyrange_in },
+ { 3833, 1, true, false, "anyrange_out", anyrange_out },
+ { 3834, 3, true, false, "range_in", range_in },
+ { 3835, 1, true, false, "range_out", range_out },
+ { 3836, 3, true, false, "range_recv", range_recv },
+ { 3837, 1, true, false, "range_send", range_send },
+ { 3839, 3, true, false, "pg_identify_object", pg_identify_object },
+ { 3840, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3841, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3842, 2, true, false, "pg_relation_is_updatable", pg_relation_is_updatable },
+ { 3843, 3, true, false, "pg_column_is_updatable", pg_column_is_updatable },
+ { 3844, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3845, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3846, 3, true, false, "make_date", make_date },
+ { 3847, 3, true, false, "make_time", make_time },
+ { 3848, 1, true, false, "range_lower", range_lower },
+ { 3849, 1, true, false, "range_upper", range_upper },
+ { 3850, 1, true, false, "range_empty", range_empty },
+ { 3851, 1, true, false, "range_lower_inc", range_lower_inc },
+ { 3852, 1, true, false, "range_upper_inc", range_upper_inc },
+ { 3853, 1, true, false, "range_lower_inf", range_lower_inf },
+ { 3854, 1, true, false, "range_upper_inf", range_upper_inf },
+ { 3855, 2, true, false, "range_eq", range_eq },
+ { 3856, 2, true, false, "range_ne", range_ne },
+ { 3857, 2, true, false, "range_overlaps", range_overlaps },
+ { 3858, 2, true, false, "range_contains_elem", range_contains_elem },
+ { 3859, 2, true, false, "range_contains", range_contains },
+ { 3860, 2, true, false, "elem_contained_by_range", elem_contained_by_range },
+ { 3861, 2, true, false, "range_contained_by", range_contained_by },
+ { 3862, 2, true, false, "range_adjacent", range_adjacent },
+ { 3863, 2, true, false, "range_before", range_before },
+ { 3864, 2, true, false, "range_after", range_after },
+ { 3865, 2, true, false, "range_overleft", range_overleft },
+ { 3866, 2, true, false, "range_overright", range_overright },
+ { 3867, 2, true, false, "range_union", range_union },
+ { 3868, 2, true, false, "range_intersect", range_intersect },
+ { 3869, 2, true, false, "range_minus", range_minus },
+ { 3870, 2, true, false, "range_cmp", range_cmp },
+ { 3871, 2, true, false, "range_lt", range_lt },
+ { 3872, 2, true, false, "range_le", range_le },
+ { 3873, 2, true, false, "range_ge", range_ge },
+ { 3874, 2, true, false, "range_gt", range_gt },
+ { 3875, 5, true, false, "range_gist_consistent", range_gist_consistent },
+ { 3876, 2, true, false, "range_gist_union", range_gist_union },
+ { 3878, 2, true, false, "pg_replication_slot_advance", pg_replication_slot_advance },
+ { 3879, 3, true, false, "range_gist_penalty", range_gist_penalty },
+ { 3880, 2, true, false, "range_gist_picksplit", range_gist_picksplit },
+ { 3881, 3, true, false, "range_gist_same", range_gist_same },
+ { 3902, 1, true, false, "hash_range", hash_range },
+ { 3914, 1, true, false, "int4range_canonical", int4range_canonical },
+ { 3915, 1, true, false, "daterange_canonical", daterange_canonical },
+ { 3916, 1, true, false, "range_typanalyze", range_typanalyze },
+ { 3917, 1, true, false, "timestamp_support", timestamp_support },
+ { 3918, 1, true, false, "interval_support", interval_support },
+ { 3920, 7, true, false, "ginarraytriconsistent", ginarraytriconsistent },
+ { 3921, 7, true, false, "gin_tsquery_triconsistent", gin_tsquery_triconsistent },
+ { 3922, 2, true, false, "int4range_subdiff", int4range_subdiff },
+ { 3923, 2, true, false, "int8range_subdiff", int8range_subdiff },
+ { 3924, 2, true, false, "numrange_subdiff", numrange_subdiff },
+ { 3925, 2, true, false, "daterange_subdiff", daterange_subdiff },
+ { 3928, 1, true, false, "int8range_canonical", int8range_canonical },
+ { 3929, 2, true, false, "tsrange_subdiff", tsrange_subdiff },
+ { 3930, 2, true, false, "tstzrange_subdiff", tstzrange_subdiff },
+ { 3931, 1, true, true, "jsonb_object_keys", jsonb_object_keys },
+ { 3932, 1, true, true, "jsonb_each_text", jsonb_each_text },
+ { 3933, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3934, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3937, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3938, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3939, 1, true, false, "mxid_age", mxid_age },
+ { 3940, 2, true, false, "jsonb_extract_path_text", jsonb_extract_path_text },
+ { 3941, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3942, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3943, 2, true, false, "acldefault_sql", acldefault_sql },
+ { 3944, 1, true, false, "time_support", time_support },
+ { 3945, 2, false, false, "range_constructor2", range_constructor2 },
+ { 3946, 3, false, false, "range_constructor3", range_constructor3 },
+ { 3947, 2, true, false, "json_object_field", json_object_field },
+ { 3948, 2, true, false, "json_object_field_text", json_object_field_text },
+ { 3949, 2, true, false, "json_array_element", json_array_element },
+ { 3950, 2, true, false, "json_array_element_text", json_array_element_text },
+ { 3951, 2, true, false, "json_extract_path", json_extract_path },
+ { 3952, 1, true, false, "brin_summarize_new_values", brin_summarize_new_values },
+ { 3953, 2, true, false, "json_extract_path_text", json_extract_path_text },
+ { 3954, 3, true, false, "pg_get_object_address", pg_get_object_address },
+ { 3955, 1, true, true, "json_array_elements", json_array_elements },
+ { 3956, 1, true, false, "json_array_length", json_array_length },
+ { 3957, 1, true, true, "json_object_keys", json_object_keys },
+ { 3958, 1, true, true, "json_each", json_each },
+ { 3959, 1, true, true, "json_each_text", json_each_text },
+ { 3960, 3, false, false, "json_populate_record", json_populate_record },
+ { 3961, 3, false, true, "json_populate_recordset", json_populate_recordset },
+ { 3968, 1, true, false, "json_typeof", json_typeof },
+ { 3969, 1, true, true, "json_array_elements_text", json_array_elements_text },
+ { 3970, 2, false, false, "ordered_set_transition", ordered_set_transition },
+ { 3971, 2, false, false, "ordered_set_transition_multi", ordered_set_transition_multi },
+ { 3973, 3, false, false, "percentile_disc_final", percentile_disc_final },
+ { 3975, 2, false, false, "percentile_cont_float8_final", percentile_cont_float8_final },
+ { 3977, 2, false, false, "percentile_cont_interval_final", percentile_cont_interval_final },
+ { 3979, 3, false, false, "percentile_disc_multi_final", percentile_disc_multi_final },
+ { 3981, 2, false, false, "percentile_cont_float8_multi_final", percentile_cont_float8_multi_final },
+ { 3983, 2, false, false, "percentile_cont_interval_multi_final", percentile_cont_interval_multi_final },
+ { 3985, 2, false, false, "mode_final", mode_final },
+ { 3987, 2, false, false, "hypothetical_rank_final", hypothetical_rank_final },
+ { 3989, 2, false, false, "hypothetical_percent_rank_final", hypothetical_percent_rank_final },
+ { 3991, 2, false, false, "hypothetical_cume_dist_final", hypothetical_cume_dist_final },
+ { 3993, 2, false, false, "hypothetical_dense_rank_final", hypothetical_dense_rank_final },
+ { 3994, 1, true, false, "generate_series_int4_support", generate_series_int4_support },
+ { 3995, 1, true, false, "generate_series_int8_support", generate_series_int8_support },
+ { 3996, 1, true, false, "array_unnest_support", array_unnest_support },
+ { 3998, 5, true, false, "gist_box_distance", gist_box_distance },
+ { 3999, 2, true, false, "brin_summarize_range", brin_summarize_range },
+ { 4001, 1, true, false, "jsonpath_in", jsonpath_in },
+ { 4002, 1, true, false, "jsonpath_recv", jsonpath_recv },
+ { 4003, 1, true, false, "jsonpath_out", jsonpath_out },
+ { 4004, 1, true, false, "jsonpath_send", jsonpath_send },
+ { 4005, 4, true, false, "jsonb_path_exists", jsonb_path_exists },
+ { 4006, 4, true, true, "jsonb_path_query", jsonb_path_query },
+ { 4007, 4, true, false, "jsonb_path_query_array", jsonb_path_query_array },
+ { 4008, 4, true, false, "jsonb_path_query_first", jsonb_path_query_first },
+ { 4009, 4, true, false, "jsonb_path_match", jsonb_path_match },
+ { 4010, 2, true, false, "jsonb_path_exists_opr", jsonb_path_exists_opr },
+ { 4011, 2, true, false, "jsonb_path_match_opr", jsonb_path_match_opr },
+ { 4014, 2, true, false, "brin_desummarize_range", brin_desummarize_range },
+ { 4018, 2, true, false, "spg_quad_config", spg_quad_config },
+ { 4019, 2, true, false, "spg_quad_choose", spg_quad_choose },
+ { 4020, 2, true, false, "spg_quad_picksplit", spg_quad_picksplit },
+ { 4021, 2, true, false, "spg_quad_inner_consistent", spg_quad_inner_consistent },
+ { 4022, 2, true, false, "spg_quad_leaf_consistent", spg_quad_leaf_consistent },
+ { 4023, 2, true, false, "spg_kd_config", spg_kd_config },
+ { 4024, 2, true, false, "spg_kd_choose", spg_kd_choose },
+ { 4025, 2, true, false, "spg_kd_picksplit", spg_kd_picksplit },
+ { 4026, 2, true, false, "spg_kd_inner_consistent", spg_kd_inner_consistent },
+ { 4027, 2, true, false, "spg_text_config", spg_text_config },
+ { 4028, 2, true, false, "spg_text_choose", spg_text_choose },
+ { 4029, 2, true, false, "spg_text_picksplit", spg_text_picksplit },
+ { 4030, 2, true, false, "spg_text_inner_consistent", spg_text_inner_consistent },
+ { 4031, 2, true, false, "spg_text_leaf_consistent", spg_text_leaf_consistent },
+ { 4032, 1, true, false, "pg_sequence_last_value", pg_sequence_last_value },
+ { 4038, 2, true, false, "jsonb_ne", jsonb_ne },
+ { 4039, 2, true, false, "jsonb_lt", jsonb_lt },
+ { 4040, 2, true, false, "jsonb_gt", jsonb_gt },
+ { 4041, 2, true, false, "jsonb_le", jsonb_le },
+ { 4042, 2, true, false, "jsonb_ge", jsonb_ge },
+ { 4043, 2, true, false, "jsonb_eq", jsonb_eq },
+ { 4044, 2, true, false, "jsonb_cmp", jsonb_cmp },
+ { 4045, 1, true, false, "jsonb_hash", jsonb_hash },
+ { 4046, 2, true, false, "jsonb_contains", jsonb_contains },
+ { 4047, 2, true, false, "jsonb_exists", jsonb_exists },
+ { 4048, 2, true, false, "jsonb_exists_any", jsonb_exists_any },
+ { 4049, 2, true, false, "jsonb_exists_all", jsonb_exists_all },
+ { 4050, 2, true, false, "jsonb_contained", jsonb_contained },
+ { 4051, 2, false, false, "array_agg_array_transfn", array_agg_array_transfn },
+ { 4052, 2, false, false, "array_agg_array_finalfn", array_agg_array_finalfn },
+ { 4057, 2, true, false, "range_merge", range_merge },
+ { 4063, 2, true, false, "inet_merge", inet_merge },
+ { 4067, 2, true, false, "boxes_bound_box", boxes_bound_box },
+ { 4071, 2, true, false, "inet_same_family", inet_same_family },
+ { 4083, 1, true, false, "binary_upgrade_set_record_init_privs", binary_upgrade_set_record_init_privs },
+ { 4084, 1, true, false, "regnamespacein", regnamespacein },
+ { 4085, 1, true, false, "regnamespaceout", regnamespaceout },
+ { 4086, 1, true, false, "to_regnamespace", to_regnamespace },
+ { 4087, 1, true, false, "regnamespacerecv", regnamespacerecv },
+ { 4088, 1, true, false, "regnamespacesend", regnamespacesend },
+ { 4091, 1, true, false, "point_box", point_box },
+ { 4092, 1, true, false, "regroleout", regroleout },
+ { 4093, 1, true, false, "to_regrole", to_regrole },
+ { 4094, 1, true, false, "regrolerecv", regrolerecv },
+ { 4095, 1, true, false, "regrolesend", regrolesend },
+ { 4098, 1, true, false, "regrolein", regrolein },
+ { 4099, 0, true, false, "pg_rotate_logfile", pg_rotate_logfile },
+ { 4100, 3, true, false, "pg_read_file", pg_read_file },
+ { 4101, 3, true, false, "binary_upgrade_set_missing_value", binary_upgrade_set_missing_value },
+ { 4105, 1, true, false, "brin_inclusion_opcinfo", brin_inclusion_opcinfo },
+ { 4106, 4, true, false, "brin_inclusion_add_value", brin_inclusion_add_value },
+ { 4107, 3, true, false, "brin_inclusion_consistent", brin_inclusion_consistent },
+ { 4108, 3, true, false, "brin_inclusion_union", brin_inclusion_union },
+ { 4110, 1, true, false, "macaddr8_in", macaddr8_in },
+ { 4111, 1, true, false, "macaddr8_out", macaddr8_out },
+ { 4112, 1, true, false, "macaddr8_trunc", macaddr8_trunc },
+ { 4113, 2, true, false, "macaddr8_eq", macaddr8_eq },
+ { 4114, 2, true, false, "macaddr8_lt", macaddr8_lt },
+ { 4115, 2, true, false, "macaddr8_le", macaddr8_le },
+ { 4116, 2, true, false, "macaddr8_gt", macaddr8_gt },
+ { 4117, 2, true, false, "macaddr8_ge", macaddr8_ge },
+ { 4118, 2, true, false, "macaddr8_ne", macaddr8_ne },
+ { 4119, 2, true, false, "macaddr8_cmp", macaddr8_cmp },
+ { 4120, 1, true, false, "macaddr8_not", macaddr8_not },
+ { 4121, 2, true, false, "macaddr8_and", macaddr8_and },
+ { 4122, 2, true, false, "macaddr8_or", macaddr8_or },
+ { 4123, 1, true, false, "macaddrtomacaddr8", macaddrtomacaddr8 },
+ { 4124, 1, true, false, "macaddr8tomacaddr", macaddr8tomacaddr },
+ { 4125, 1, true, false, "macaddr8_set7bit", macaddr8_set7bit },
+ { 4126, 5, true, false, "in_range_int8_int8", in_range_int8_int8 },
+ { 4127, 5, true, false, "in_range_int4_int8", in_range_int4_int8 },
+ { 4128, 5, true, false, "in_range_int4_int4", in_range_int4_int4 },
+ { 4129, 5, true, false, "in_range_int4_int2", in_range_int4_int2 },
+ { 4130, 5, true, false, "in_range_int2_int8", in_range_int2_int8 },
+ { 4131, 5, true, false, "in_range_int2_int4", in_range_int2_int4 },
+ { 4132, 5, true, false, "in_range_int2_int2", in_range_int2_int2 },
+ { 4133, 5, true, false, "in_range_date_interval", in_range_date_interval },
+ { 4134, 5, true, false, "in_range_timestamp_interval", in_range_timestamp_interval },
+ { 4135, 5, true, false, "in_range_timestamptz_interval", in_range_timestamptz_interval },
+ { 4136, 5, true, false, "in_range_interval_interval", in_range_interval_interval },
+ { 4137, 5, true, false, "in_range_time_interval", in_range_time_interval },
+ { 4138, 5, true, false, "in_range_timetz_interval", in_range_timetz_interval },
+ { 4139, 5, true, false, "in_range_float8_float8", in_range_float8_float8 },
+ { 4140, 5, true, false, "in_range_float4_float8", in_range_float4_float8 },
+ { 4141, 5, true, false, "in_range_numeric_numeric", in_range_numeric_numeric },
+ { 4187, 2, true, false, "pg_lsn_larger", pg_lsn_larger },
+ { 4188, 2, true, false, "pg_lsn_smaller", pg_lsn_smaller },
+ { 4193, 1, true, false, "regcollationin", regcollationin },
+ { 4194, 1, true, false, "regcollationout", regcollationout },
+ { 4195, 1, true, false, "to_regcollation", to_regcollation },
+ { 4196, 1, true, false, "regcollationrecv", regcollationrecv },
+ { 4197, 1, true, false, "regcollationsend", regcollationsend },
+ { 4201, 4, true, false, "ts_headline_jsonb_byid_opt", ts_headline_jsonb_byid_opt },
+ { 4202, 3, true, false, "ts_headline_jsonb_byid", ts_headline_jsonb_byid },
+ { 4203, 3, true, false, "ts_headline_jsonb_opt", ts_headline_jsonb_opt },
+ { 4204, 2, true, false, "ts_headline_jsonb", ts_headline_jsonb },
+ { 4205, 4, true, false, "ts_headline_json_byid_opt", ts_headline_json_byid_opt },
+ { 4206, 3, true, false, "ts_headline_json_byid", ts_headline_json_byid },
+ { 4207, 3, true, false, "ts_headline_json_opt", ts_headline_json_opt },
+ { 4208, 2, true, false, "ts_headline_json", ts_headline_json },
+ { 4209, 1, true, false, "jsonb_string_to_tsvector", jsonb_string_to_tsvector },
+ { 4210, 1, true, false, "json_string_to_tsvector", json_string_to_tsvector },
+ { 4211, 2, true, false, "jsonb_string_to_tsvector_byid", jsonb_string_to_tsvector_byid },
+ { 4212, 2, true, false, "json_string_to_tsvector_byid", json_string_to_tsvector_byid },
+ { 4213, 2, true, false, "jsonb_to_tsvector", jsonb_to_tsvector },
+ { 4214, 3, true, false, "jsonb_to_tsvector_byid", jsonb_to_tsvector_byid },
+ { 4215, 2, true, false, "json_to_tsvector", json_to_tsvector },
+ { 4216, 3, true, false, "json_to_tsvector_byid", json_to_tsvector_byid },
+ { 4220, 3, true, false, "pg_copy_physical_replication_slot_a", pg_copy_physical_replication_slot_a },
+ { 4221, 2, true, false, "pg_copy_physical_replication_slot_b", pg_copy_physical_replication_slot_b },
+ { 4222, 4, true, false, "pg_copy_logical_replication_slot_a", pg_copy_logical_replication_slot_a },
+ { 4223, 3, true, false, "pg_copy_logical_replication_slot_b", pg_copy_logical_replication_slot_b },
+ { 4224, 2, true, false, "pg_copy_logical_replication_slot_c", pg_copy_logical_replication_slot_c },
+ { 4226, 3, true, false, "anycompatiblemultirange_in", anycompatiblemultirange_in },
+ { 4227, 1, true, false, "anycompatiblemultirange_out", anycompatiblemultirange_out },
+ { 4228, 1, true, false, "range_merge_from_multirange", range_merge_from_multirange },
+ { 4229, 3, true, false, "anymultirange_in", anymultirange_in },
+ { 4230, 1, true, false, "anymultirange_out", anymultirange_out },
+ { 4231, 3, true, false, "multirange_in", multirange_in },
+ { 4232, 1, true, false, "multirange_out", multirange_out },
+ { 4233, 3, true, false, "multirange_recv", multirange_recv },
+ { 4234, 1, true, false, "multirange_send", multirange_send },
+ { 4235, 1, true, false, "multirange_lower", multirange_lower },
+ { 4236, 1, true, false, "multirange_upper", multirange_upper },
+ { 4237, 1, true, false, "multirange_empty", multirange_empty },
+ { 4238, 1, true, false, "multirange_lower_inc", multirange_lower_inc },
+ { 4239, 1, true, false, "multirange_upper_inc", multirange_upper_inc },
+ { 4240, 1, true, false, "multirange_lower_inf", multirange_lower_inf },
+ { 4241, 1, true, false, "multirange_upper_inf", multirange_upper_inf },
+ { 4242, 1, true, false, "multirange_typanalyze", multirange_typanalyze },
+ { 4243, 4, true, false, "multirangesel", multirangesel },
+ { 4244, 2, true, false, "multirange_eq", multirange_eq },
+ { 4245, 2, true, false, "multirange_ne", multirange_ne },
+ { 4246, 2, true, false, "range_overlaps_multirange", range_overlaps_multirange },
+ { 4247, 2, true, false, "multirange_overlaps_range", multirange_overlaps_range },
+ { 4248, 2, true, false, "multirange_overlaps_multirange", multirange_overlaps_multirange },
+ { 4249, 2, true, false, "multirange_contains_elem", multirange_contains_elem },
+ { 4250, 2, true, false, "multirange_contains_range", multirange_contains_range },
+ { 4251, 2, true, false, "multirange_contains_multirange", multirange_contains_multirange },
+ { 4252, 2, true, false, "elem_contained_by_multirange", elem_contained_by_multirange },
+ { 4253, 2, true, false, "range_contained_by_multirange", range_contained_by_multirange },
+ { 4254, 2, true, false, "multirange_contained_by_multirange", multirange_contained_by_multirange },
+ { 4255, 2, true, false, "range_adjacent_multirange", range_adjacent_multirange },
+ { 4256, 2, true, false, "multirange_adjacent_multirange", multirange_adjacent_multirange },
+ { 4257, 2, true, false, "multirange_adjacent_range", multirange_adjacent_range },
+ { 4258, 2, true, false, "range_before_multirange", range_before_multirange },
+ { 4259, 2, true, false, "multirange_before_range", multirange_before_range },
+ { 4260, 2, true, false, "multirange_before_multirange", multirange_before_multirange },
+ { 4261, 2, true, false, "range_after_multirange", range_after_multirange },
+ { 4262, 2, true, false, "multirange_after_range", multirange_after_range },
+ { 4263, 2, true, false, "multirange_after_multirange", multirange_after_multirange },
+ { 4264, 2, true, false, "range_overleft_multirange", range_overleft_multirange },
+ { 4265, 2, true, false, "multirange_overleft_range", multirange_overleft_range },
+ { 4266, 2, true, false, "multirange_overleft_multirange", multirange_overleft_multirange },
+ { 4267, 2, true, false, "range_overright_multirange", range_overright_multirange },
+ { 4268, 2, true, false, "multirange_overright_range", multirange_overright_range },
+ { 4269, 2, true, false, "multirange_overright_multirange", multirange_overright_multirange },
+ { 4270, 2, true, false, "multirange_union", multirange_union },
+ { 4271, 2, true, false, "multirange_minus", multirange_minus },
+ { 4272, 2, true, false, "multirange_intersect", multirange_intersect },
+ { 4273, 2, true, false, "multirange_cmp", multirange_cmp },
+ { 4274, 2, true, false, "multirange_lt", multirange_lt },
+ { 4275, 2, true, false, "multirange_le", multirange_le },
+ { 4276, 2, true, false, "multirange_ge", multirange_ge },
+ { 4277, 2, true, false, "multirange_gt", multirange_gt },
+ { 4278, 1, true, false, "hash_multirange", hash_multirange },
+ { 4279, 2, true, false, "hash_multirange_extended", hash_multirange_extended },
+ { 4280, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4281, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4282, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4283, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4284, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4285, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4286, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4287, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4288, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4289, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4290, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4291, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4292, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4293, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4294, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4295, 0, true, false, "multirange_constructor0", multirange_constructor0 },
+ { 4296, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4297, 1, true, false, "multirange_constructor2", multirange_constructor2 },
+ { 4298, 1, true, false, "multirange_constructor1", multirange_constructor1 },
+ { 4299, 2, false, false, "range_agg_transfn", range_agg_transfn },
+ { 4300, 2, false, false, "range_agg_finalfn", range_agg_finalfn },
+ { 4350, 2, true, false, "unicode_normalize_func", unicode_normalize_func },
+ { 4351, 2, true, false, "unicode_is_normalized", unicode_is_normalized },
+ { 4388, 2, true, false, "multirange_intersect_agg_transfn", multirange_intersect_agg_transfn },
+ { 4390, 1, true, false, "binary_upgrade_set_next_multirange_pg_type_oid", binary_upgrade_set_next_multirange_pg_type_oid },
+ { 4391, 1, true, false, "binary_upgrade_set_next_multirange_array_pg_type_oid", binary_upgrade_set_next_multirange_array_pg_type_oid },
+ { 4401, 2, true, false, "range_intersect_agg_transfn", range_intersect_agg_transfn },
+ { 4541, 2, true, false, "range_contains_multirange", range_contains_multirange },
+ { 4542, 2, true, false, "multirange_contained_by_range", multirange_contained_by_range },
+ { 4543, 1, true, false, "pg_log_backend_memory_contexts", pg_log_backend_memory_contexts },
+ { 4545, 1, true, false, "binary_upgrade_set_next_heap_relfilenode", binary_upgrade_set_next_heap_relfilenode },
+ { 4546, 1, true, false, "binary_upgrade_set_next_index_relfilenode", binary_upgrade_set_next_index_relfilenode },
+ { 4547, 1, true, false, "binary_upgrade_set_next_toast_relfilenode", binary_upgrade_set_next_toast_relfilenode },
+ { 4548, 1, true, false, "binary_upgrade_set_next_pg_tablespace_oid", binary_upgrade_set_next_pg_tablespace_oid },
+ { 4566, 0, true, false, "pg_event_trigger_table_rewrite_oid", pg_event_trigger_table_rewrite_oid },
+ { 4567, 0, true, false, "pg_event_trigger_table_rewrite_reason", pg_event_trigger_table_rewrite_reason },
+ { 4568, 0, true, true, "pg_event_trigger_ddl_commands", pg_event_trigger_ddl_commands },
+ { 4591, 1, true, false, "brin_bloom_opcinfo", brin_bloom_opcinfo },
+ { 4592, 4, true, false, "brin_bloom_add_value", brin_bloom_add_value },
+ { 4593, 4, true, false, "brin_bloom_consistent", brin_bloom_consistent },
+ { 4594, 3, true, false, "brin_bloom_union", brin_bloom_union },
+ { 4595, 1, false, false, "brin_bloom_options", brin_bloom_options },
+ { 4596, 1, true, false, "brin_bloom_summary_in", brin_bloom_summary_in },
+ { 4597, 1, true, false, "brin_bloom_summary_out", brin_bloom_summary_out },
+ { 4598, 1, true, false, "brin_bloom_summary_recv", brin_bloom_summary_recv },
+ { 4599, 1, true, false, "brin_bloom_summary_send", brin_bloom_summary_send },
+ { 4616, 1, true, false, "brin_minmax_multi_opcinfo", brin_minmax_multi_opcinfo },
+ { 4617, 4, true, false, "brin_minmax_multi_add_value", brin_minmax_multi_add_value },
+ { 4618, 4, true, false, "brin_minmax_multi_consistent", brin_minmax_multi_consistent },
+ { 4619, 3, true, false, "brin_minmax_multi_union", brin_minmax_multi_union },
+ { 4620, 1, false, false, "brin_minmax_multi_options", brin_minmax_multi_options },
+ { 4621, 2, true, false, "brin_minmax_multi_distance_int2", brin_minmax_multi_distance_int2 },
+ { 4622, 2, true, false, "brin_minmax_multi_distance_int4", brin_minmax_multi_distance_int4 },
+ { 4623, 2, true, false, "brin_minmax_multi_distance_int8", brin_minmax_multi_distance_int8 },
+ { 4624, 2, true, false, "brin_minmax_multi_distance_float4", brin_minmax_multi_distance_float4 },
+ { 4625, 2, true, false, "brin_minmax_multi_distance_float8", brin_minmax_multi_distance_float8 },
+ { 4626, 2, true, false, "brin_minmax_multi_distance_numeric", brin_minmax_multi_distance_numeric },
+ { 4627, 2, true, false, "brin_minmax_multi_distance_tid", brin_minmax_multi_distance_tid },
+ { 4628, 2, true, false, "brin_minmax_multi_distance_uuid", brin_minmax_multi_distance_uuid },
+ { 4629, 2, true, false, "brin_minmax_multi_distance_date", brin_minmax_multi_distance_date },
+ { 4630, 2, true, false, "brin_minmax_multi_distance_time", brin_minmax_multi_distance_time },
+ { 4631, 2, true, false, "brin_minmax_multi_distance_interval", brin_minmax_multi_distance_interval },
+ { 4632, 2, true, false, "brin_minmax_multi_distance_timetz", brin_minmax_multi_distance_timetz },
+ { 4633, 2, true, false, "brin_minmax_multi_distance_pg_lsn", brin_minmax_multi_distance_pg_lsn },
+ { 4634, 2, true, false, "brin_minmax_multi_distance_macaddr", brin_minmax_multi_distance_macaddr },
+ { 4635, 2, true, false, "brin_minmax_multi_distance_macaddr8", brin_minmax_multi_distance_macaddr8 },
+ { 4636, 2, true, false, "brin_minmax_multi_distance_inet", brin_minmax_multi_distance_inet },
+ { 4637, 2, true, false, "brin_minmax_multi_distance_timestamp", brin_minmax_multi_distance_timestamp },
+ { 4638, 1, true, false, "brin_minmax_multi_summary_in", brin_minmax_multi_summary_in },
+ { 4639, 1, true, false, "brin_minmax_multi_summary_out", brin_minmax_multi_summary_out },
+ { 4640, 1, true, false, "brin_minmax_multi_summary_recv", brin_minmax_multi_summary_recv },
+ { 4641, 1, true, false, "brin_minmax_multi_summary_send", brin_minmax_multi_summary_send },
+ { 5001, 1, true, false, "phraseto_tsquery", phraseto_tsquery },
+ { 5003, 2, true, false, "tsquery_phrase", tsquery_phrase },
+ { 5004, 3, true, false, "tsquery_phrase_distance", tsquery_phrase_distance },
+ { 5006, 2, true, false, "phraseto_tsquery_byid", phraseto_tsquery_byid },
+ { 5007, 2, true, false, "websearch_to_tsquery_byid", websearch_to_tsquery_byid },
+ { 5009, 1, true, false, "websearch_to_tsquery", websearch_to_tsquery },
+ { 5010, 2, true, false, "spg_bbox_quad_config", spg_bbox_quad_config },
+ { 5011, 1, true, false, "spg_poly_quad_compress", spg_poly_quad_compress },
+ { 5012, 2, true, false, "spg_box_quad_config", spg_box_quad_config },
+ { 5013, 2, true, false, "spg_box_quad_choose", spg_box_quad_choose },
+ { 5014, 2, true, false, "spg_box_quad_picksplit", spg_box_quad_picksplit },
+ { 5015, 2, true, false, "spg_box_quad_inner_consistent", spg_box_quad_inner_consistent },
+ { 5016, 2, true, false, "spg_box_quad_leaf_consistent", spg_box_quad_leaf_consistent },
+ { 5018, 1, true, false, "pg_mcv_list_in", pg_mcv_list_in },
+ { 5019, 1, true, false, "pg_mcv_list_out", pg_mcv_list_out },
+ { 5020, 1, true, false, "pg_mcv_list_recv", pg_mcv_list_recv },
+ { 5021, 1, true, false, "pg_mcv_list_send", pg_mcv_list_send },
+ { 5022, 2, true, false, "pg_lsn_pli", pg_lsn_pli },
+ { 5024, 2, true, false, "pg_lsn_mii", pg_lsn_mii },
+ { 5028, 4, false, false, "satisfies_hash_partition", satisfies_hash_partition },
+ { 5029, 0, true, true, "pg_ls_tmpdir_noargs", pg_ls_tmpdir_noargs },
+ { 5030, 1, true, true, "pg_ls_tmpdir_1arg", pg_ls_tmpdir_1arg },
+ { 5031, 0, true, true, "pg_ls_archive_statusdir", pg_ls_archive_statusdir },
+ { 5033, 1, true, false, "network_sortsupport", network_sortsupport },
+ { 5034, 2, true, false, "xid8lt", xid8lt },
+ { 5035, 2, true, false, "xid8gt", xid8gt },
+ { 5036, 2, true, false, "xid8le", xid8le },
+ { 5037, 2, true, false, "xid8ge", xid8ge },
+ { 5040, 4, true, false, "matchingsel", matchingsel },
+ { 5041, 5, true, false, "matchingjoinsel", matchingjoinsel },
+ { 5042, 1, true, false, "numeric_min_scale", numeric_min_scale },
+ { 5043, 1, true, false, "numeric_trim_scale", numeric_trim_scale },
+ { 5044, 2, true, false, "int4gcd", int4gcd },
+ { 5045, 2, true, false, "int8gcd", int8gcd },
+ { 5046, 2, true, false, "int4lcm", int4lcm },
+ { 5047, 2, true, false, "int8lcm", int8lcm },
+ { 5048, 2, true, false, "numeric_gcd", numeric_gcd },
+ { 5049, 2, true, false, "numeric_lcm", numeric_lcm },
+ { 5050, 1, true, false, "btvarstrequalimage", btvarstrequalimage },
+ { 5051, 1, true, false, "btequalimage", btequalimage },
+ { 5052, 0, true, true, "pg_get_shmem_allocations", pg_get_shmem_allocations },
+ { 5053, 1, true, false, "pg_stat_get_ins_since_vacuum", pg_stat_get_ins_since_vacuum },
+ { 5054, 5, false, false, "jsonb_set_lax", jsonb_set_lax },
+ { 5055, 1, true, false, "pg_snapshot_in", pg_snapshot_in },
+ { 5056, 1, true, false, "pg_snapshot_out", pg_snapshot_out },
+ { 5057, 1, true, false, "pg_snapshot_recv", pg_snapshot_recv },
+ { 5058, 1, true, false, "pg_snapshot_send", pg_snapshot_send },
+ { 5059, 0, true, false, "pg_current_xact_id", pg_current_xact_id },
+ { 5060, 0, true, false, "pg_current_xact_id_if_assigned", pg_current_xact_id_if_assigned },
+ { 5061, 0, true, false, "pg_current_snapshot", pg_current_snapshot },
+ { 5062, 1, true, false, "pg_snapshot_xmin", pg_snapshot_xmin },
+ { 5063, 1, true, false, "pg_snapshot_xmax", pg_snapshot_xmax },
+ { 5064, 1, true, true, "pg_snapshot_xip", pg_snapshot_xip },
+ { 5065, 2, true, false, "pg_visible_in_snapshot", pg_visible_in_snapshot },
+ { 5066, 1, true, false, "pg_xact_status", pg_xact_status },
+ { 5070, 1, true, false, "xid8in", xid8in },
+ { 5071, 1, true, false, "xid8toxid", xid8toxid },
+ { 5081, 1, true, false, "xid8out", xid8out },
+ { 5082, 1, true, false, "xid8recv", xid8recv },
+ { 5083, 1, true, false, "xid8send", xid8send },
+ { 5084, 2, true, false, "xid8eq", xid8eq },
+ { 5085, 2, true, false, "xid8ne", xid8ne },
+ { 5086, 1, true, false, "anycompatible_in", anycompatible_in },
+ { 5087, 1, true, false, "anycompatible_out", anycompatible_out },
+ { 5088, 1, true, false, "anycompatiblearray_in", anycompatiblearray_in },
+ { 5089, 1, true, false, "anycompatiblearray_out", anycompatiblearray_out },
+ { 5090, 1, true, false, "anycompatiblearray_recv", anycompatiblearray_recv },
+ { 5091, 1, true, false, "anycompatiblearray_send", anycompatiblearray_send },
+ { 5092, 1, true, false, "anycompatiblenonarray_in", anycompatiblenonarray_in },
+ { 5093, 1, true, false, "anycompatiblenonarray_out", anycompatiblenonarray_out },
+ { 5094, 3, true, false, "anycompatiblerange_in", anycompatiblerange_in },
+ { 5095, 1, true, false, "anycompatiblerange_out", anycompatiblerange_out },
+ { 5096, 2, true, false, "xid8cmp", xid8cmp },
+ { 5097, 2, true, false, "xid8_larger", xid8_larger },
+ { 5098, 2, true, false, "xid8_smaller", xid8_smaller },
+ { 6003, 1, true, false, "pg_replication_origin_create", pg_replication_origin_create },
+ { 6004, 1, true, false, "pg_replication_origin_drop", pg_replication_origin_drop },
+ { 6005, 1, true, false, "pg_replication_origin_oid", pg_replication_origin_oid },
+ { 6006, 1, true, false, "pg_replication_origin_session_setup", pg_replication_origin_session_setup },
+ { 6007, 0, true, false, "pg_replication_origin_session_reset", pg_replication_origin_session_reset },
+ { 6008, 0, true, false, "pg_replication_origin_session_is_setup", pg_replication_origin_session_is_setup },
+ { 6009, 1, true, false, "pg_replication_origin_session_progress", pg_replication_origin_session_progress },
+ { 6010, 2, true, false, "pg_replication_origin_xact_setup", pg_replication_origin_xact_setup },
+ { 6011, 0, true, false, "pg_replication_origin_xact_reset", pg_replication_origin_xact_reset },
+ { 6012, 2, true, false, "pg_replication_origin_advance", pg_replication_origin_advance },
+ { 6013, 2, true, false, "pg_replication_origin_progress", pg_replication_origin_progress },
+ { 6014, 0, false, true, "pg_show_replication_origin_status", pg_show_replication_origin_status },
+ { 6098, 1, true, false, "jsonb_subscript_handler", jsonb_subscript_handler },
+ { 6103, 1, true, false, "numeric_pg_lsn", numeric_pg_lsn },
+ { 6118, 1, false, true, "pg_stat_get_subscription", pg_stat_get_subscription },
+ { 6119, 1, true, true, "pg_get_publication_tables", pg_get_publication_tables },
+ { 6120, 1, true, false, "pg_get_replica_identity_index", pg_get_replica_identity_index },
+ { 6121, 1, true, false, "pg_relation_is_publishable", pg_relation_is_publishable },
+ { 6154, 5, true, false, "multirange_gist_consistent", multirange_gist_consistent },
+ { 6156, 1, true, false, "multirange_gist_compress", multirange_gist_compress },
+ { 6159, 0, true, true, "pg_get_catalog_foreign_keys", pg_get_catalog_foreign_keys },
+ { 6160, 2, false, true, "text_to_table", text_to_table },
+ { 6161, 3, false, true, "text_to_table_null", text_to_table_null },
+ { 6162, 1, true, false, "bit_bit_count", bit_bit_count },
+ { 6163, 1, true, false, "bytea_bit_count", bytea_bit_count },
+ { 6168, 1, true, false, "pg_xact_commit_timestamp_origin", pg_xact_commit_timestamp_origin },
+ { 6169, 1, true, false, "pg_stat_get_replication_slot", pg_stat_get_replication_slot },
+ { 6170, 1, false, false, "pg_stat_reset_replication_slot", pg_stat_reset_replication_slot },
+ { 6172, 2, true, false, "trim_array", trim_array },
+ { 6173, 1, true, false, "pg_get_statisticsobjdef_expressions", pg_get_statisticsobjdef_expressions },
+ { 6174, 1, true, false, "pg_get_statisticsobjdef_columns", pg_get_statisticsobjdef_columns },
+ { 6177, 3, true, false, "timestamp_bin", timestamp_bin },
+ { 6178, 3, true, false, "timestamptz_bin", timestamptz_bin },
+ { 6179, 1, true, false, "array_subscript_handler", array_subscript_handler },
+ { 6180, 1, true, false, "raw_array_subscript_handler", raw_array_subscript_handler },
+ { 6185, 1, true, false, "pg_stat_get_db_session_time", pg_stat_get_db_session_time },
+ { 6186, 1, true, false, "pg_stat_get_db_active_time", pg_stat_get_db_active_time },
+ { 6187, 1, true, false, "pg_stat_get_db_idle_in_transaction_time", pg_stat_get_db_idle_in_transaction_time },
+ { 6188, 1, true, false, "pg_stat_get_db_sessions", pg_stat_get_db_sessions },
+ { 6189, 1, true, false, "pg_stat_get_db_sessions_abandoned", pg_stat_get_db_sessions_abandoned },
+ { 6190, 1, true, false, "pg_stat_get_db_sessions_fatal", pg_stat_get_db_sessions_fatal },
+ { 6191, 1, true, false, "pg_stat_get_db_sessions_killed", pg_stat_get_db_sessions_killed },
+ { 6192, 1, true, false, "hash_record", hash_record },
+ { 6193, 2, true, false, "hash_record_extended", hash_record_extended },
+ { 6195, 2, true, false, "bytealtrim", bytealtrim },
+ { 6196, 2, true, false, "byteartrim", byteartrim },
+ { 6197, 1, true, false, "pg_get_function_sqlbody", pg_get_function_sqlbody },
+ { 6198, 1, true, false, "unistr", unistr },
+ { 6199, 2, true, false, "extract_date", extract_date },
+ { 6200, 2, true, false, "extract_time", extract_time },
+ { 6201, 2, true, false, "extract_timetz", extract_timetz },
+ { 6202, 2, true, false, "extract_timestamp", extract_timestamp },
+ { 6203, 2, true, false, "extract_timestamptz", extract_timestamptz },
+ { 6204, 2, true, false, "extract_interval", extract_interval },
+ { 6205, 3, true, false, "has_parameter_privilege_name_name", has_parameter_privilege_name_name },
+ { 6206, 3, true, false, "has_parameter_privilege_id_name", has_parameter_privilege_id_name },
+ { 6207, 2, true, false, "has_parameter_privilege_name", has_parameter_privilege_name },
+ { 6224, 0, true, true, "pg_get_wal_resource_managers", pg_get_wal_resource_managers },
+ { 6225, 2, false, false, "multirange_agg_transfn", multirange_agg_transfn },
+ { 6226, 2, false, false, "range_agg_finalfn", range_agg_finalfn },
+ { 6230, 3, true, false, "pg_stat_have_stats", pg_stat_have_stats },
+ { 6231, 1, true, false, "pg_stat_get_subscription_stats", pg_stat_get_subscription_stats },
+ { 6232, 1, false, false, "pg_stat_reset_subscription_stats", pg_stat_reset_subscription_stats },
+ { 6233, 1, true, false, "window_row_number_support", window_row_number_support },
+ { 6234, 1, true, false, "window_rank_support", window_rank_support },
+ { 6235, 1, true, false, "window_dense_rank_support", window_dense_rank_support },
+ { 6236, 1, true, false, "int8inc_support", int8inc_support },
+ { 6240, 1, true, false, "pg_settings_get_flags", pg_settings_get_flags },
+ { 6241, 0, true, false, "pg_stop_making_pinned_objects", pg_stop_making_pinned_objects },
+ { 6242, 1, true, false, "text_starts_with_support", text_starts_with_support },
+ { 6248, 0, true, true, "pg_stat_get_recovery_prefetch", pg_stat_get_recovery_prefetch },
+ { 6249, 1, true, false, "pg_database_collation_actual_version", pg_database_collation_actual_version },
+ { 6250, 0, true, true, "pg_ident_file_mappings", pg_ident_file_mappings },
+ { 6251, 6, true, false, "textregexreplace_extended", textregexreplace_extended },
+ { 6252, 5, true, false, "textregexreplace_extended_no_flags", textregexreplace_extended_no_flags },
+ { 6253, 4, true, false, "textregexreplace_extended_no_n", textregexreplace_extended_no_n },
+ { 6254, 2, true, false, "regexp_count_no_start", regexp_count_no_start },
+ { 6255, 3, true, false, "regexp_count_no_flags", regexp_count_no_flags },
+ { 6256, 4, true, false, "regexp_count", regexp_count },
+ { 6257, 2, true, false, "regexp_instr_no_start", regexp_instr_no_start },
+ { 6258, 3, true, false, "regexp_instr_no_n", regexp_instr_no_n },
+ { 6259, 4, true, false, "regexp_instr_no_endoption", regexp_instr_no_endoption },
+ { 6260, 5, true, false, "regexp_instr_no_flags", regexp_instr_no_flags },
+ { 6261, 6, true, false, "regexp_instr_no_subexpr", regexp_instr_no_subexpr },
+ { 6262, 7, true, false, "regexp_instr", regexp_instr },
+ { 6263, 2, true, false, "regexp_like_no_flags", regexp_like_no_flags },
+ { 6264, 3, true, false, "regexp_like", regexp_like },
+ { 6265, 2, true, false, "regexp_substr_no_start", regexp_substr_no_start },
+ { 6266, 3, true, false, "regexp_substr_no_n", regexp_substr_no_n },
+ { 6267, 4, true, false, "regexp_substr_no_flags", regexp_substr_no_flags },
+ { 6268, 5, true, false, "regexp_substr_no_subexpr", regexp_substr_no_subexpr },
+ { 6269, 6, true, false, "regexp_substr", regexp_substr },
+ { 6270, 0, true, true, "pg_ls_logicalsnapdir", pg_ls_logicalsnapdir },
+ { 6271, 0, true, true, "pg_ls_logicalmapdir", pg_ls_logicalmapdir },
+ { 6272, 1, true, true, "pg_ls_replslotdir", pg_ls_replslotdir }
+};
+
+const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin));
+
+const Oid fmgr_last_builtin_oid = 6272;
+
+const uint16 fmgr_builtin_oid_index[6273] = {
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 0,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1,
+ InvalidOidBuiltinMapping,
+ 2,
+ 3,
+ 4,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ InvalidOidBuiltinMapping,
+ 36,
+ 37,
+ 38,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 39,
+ 40,
+ 41,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 42,
+ InvalidOidBuiltinMapping,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ InvalidOidBuiltinMapping,
+ 133,
+ 134,
+ 135,
+ 136,
+ InvalidOidBuiltinMapping,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ InvalidOidBuiltinMapping,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ InvalidOidBuiltinMapping,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 189,
+ 190,
+ 191,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ InvalidOidBuiltinMapping,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 263,
+ 264,
+ 265,
+ InvalidOidBuiltinMapping,
+ 266,
+ 267,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 268,
+ 269,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 283,
+ 284,
+ 285,
+ 286,
+ 287,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 288,
+ 289,
+ 290,
+ 291,
+ 292,
+ 293,
+ 294,
+ 295,
+ 296,
+ InvalidOidBuiltinMapping,
+ 297,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 298,
+ 299,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ InvalidOidBuiltinMapping,
+ 305,
+ 306,
+ 307,
+ 308,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 309,
+ InvalidOidBuiltinMapping,
+ 310,
+ 311,
+ 312,
+ 313,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 314,
+ 315,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 316,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 317,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 318,
+ 319,
+ 320,
+ InvalidOidBuiltinMapping,
+ 321,
+ 322,
+ 323,
+ 324,
+ 325,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 338,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 345,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 353,
+ InvalidOidBuiltinMapping,
+ 354,
+ 355,
+ 356,
+ 357,
+ 358,
+ 359,
+ 360,
+ 361,
+ 362,
+ 363,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 364,
+ 365,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 366,
+ 367,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 368,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 369,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 370,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 371,
+ 372,
+ 373,
+ 374,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 375,
+ 376,
+ InvalidOidBuiltinMapping,
+ 377,
+ 378,
+ 379,
+ 380,
+ 381,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 382,
+ 383,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 384,
+ 385,
+ 386,
+ 387,
+ 388,
+ 389,
+ InvalidOidBuiltinMapping,
+ 390,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 391,
+ 392,
+ 393,
+ 394,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 395,
+ InvalidOidBuiltinMapping,
+ 396,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 397,
+ 398,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 399,
+ 400,
+ 401,
+ 402,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 403,
+ 404,
+ 405,
+ 406,
+ 407,
+ 408,
+ InvalidOidBuiltinMapping,
+ 409,
+ 410,
+ 411,
+ 412,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 413,
+ 414,
+ 415,
+ 416,
+ 417,
+ 418,
+ 419,
+ 420,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 426,
+ 427,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 428,
+ 429,
+ 430,
+ 431,
+ 432,
+ 433,
+ 434,
+ 435,
+ 436,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 437,
+ 438,
+ 439,
+ 440,
+ 441,
+ 442,
+ 443,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 444,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 445,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 446,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 447,
+ 448,
+ 449,
+ 450,
+ 451,
+ 452,
+ 453,
+ 454,
+ 455,
+ 456,
+ 457,
+ 458,
+ 459,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 466,
+ 467,
+ 468,
+ 469,
+ 470,
+ 471,
+ 472,
+ 473,
+ 474,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 481,
+ 482,
+ InvalidOidBuiltinMapping,
+ 483,
+ 484,
+ 485,
+ 486,
+ 487,
+ 488,
+ 489,
+ 490,
+ 491,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 492,
+ 493,
+ 494,
+ 495,
+ 496,
+ 497,
+ 498,
+ 499,
+ 500,
+ 501,
+ 502,
+ 503,
+ 504,
+ 505,
+ 506,
+ 507,
+ 508,
+ 509,
+ 510,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 511,
+ 512,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 513,
+ 514,
+ 515,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 522,
+ 523,
+ 524,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 532,
+ 533,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 540,
+ 541,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 549,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 550,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 551,
+ 552,
+ InvalidOidBuiltinMapping,
+ 553,
+ 554,
+ 555,
+ 556,
+ 557,
+ 558,
+ 559,
+ 560,
+ 561,
+ 562,
+ 563,
+ 564,
+ 565,
+ 566,
+ 567,
+ 568,
+ 569,
+ 570,
+ 571,
+ 572,
+ 573,
+ 574,
+ 575,
+ 576,
+ 577,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 578,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 579,
+ 580,
+ 581,
+ 582,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 583,
+ 584,
+ 585,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 586,
+ 587,
+ 588,
+ InvalidOidBuiltinMapping,
+ 589,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 590,
+ 591,
+ 592,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 598,
+ 599,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 600,
+ 601,
+ 602,
+ 603,
+ 604,
+ 605,
+ 606,
+ 607,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 608,
+ 609,
+ 610,
+ 611,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 612,
+ 613,
+ 614,
+ 615,
+ 616,
+ 617,
+ 618,
+ 619,
+ 620,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 621,
+ 622,
+ 623,
+ 624,
+ 625,
+ 626,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 632,
+ 633,
+ 634,
+ 635,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 646,
+ 647,
+ 648,
+ 649,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 658,
+ 659,
+ 660,
+ 661,
+ 662,
+ 663,
+ 664,
+ 665,
+ 666,
+ InvalidOidBuiltinMapping,
+ 667,
+ 668,
+ 669,
+ 670,
+ 671,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 672,
+ 673,
+ 674,
+ 675,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680,
+ 681,
+ 682,
+ 683,
+ 684,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 685,
+ 686,
+ 687,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 688,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 689,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 695,
+ 696,
+ 697,
+ 698,
+ 699,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 700,
+ 701,
+ 702,
+ 703,
+ 704,
+ InvalidOidBuiltinMapping,
+ 705,
+ 706,
+ 707,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 708,
+ 709,
+ InvalidOidBuiltinMapping,
+ 710,
+ 711,
+ 712,
+ InvalidOidBuiltinMapping,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 719,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ InvalidOidBuiltinMapping,
+ 727,
+ 728,
+ 729,
+ 730,
+ InvalidOidBuiltinMapping,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ InvalidOidBuiltinMapping,
+ 736,
+ InvalidOidBuiltinMapping,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 743,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 752,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 753,
+ 754,
+ 755,
+ 756,
+ 757,
+ 758,
+ 759,
+ 760,
+ 761,
+ InvalidOidBuiltinMapping,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 768,
+ 769,
+ 770,
+ 771,
+ 772,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 773,
+ InvalidOidBuiltinMapping,
+ 774,
+ 775,
+ InvalidOidBuiltinMapping,
+ 776,
+ 777,
+ 778,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 790,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 791,
+ InvalidOidBuiltinMapping,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 799,
+ 800,
+ 801,
+ 802,
+ 803,
+ InvalidOidBuiltinMapping,
+ 804,
+ 805,
+ 806,
+ 807,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 814,
+ 815,
+ 816,
+ 817,
+ 818,
+ 819,
+ 820,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 821,
+ InvalidOidBuiltinMapping,
+ 822,
+ 823,
+ 824,
+ 825,
+ 826,
+ InvalidOidBuiltinMapping,
+ 827,
+ 828,
+ 829,
+ 830,
+ 831,
+ 832,
+ 833,
+ 834,
+ 835,
+ 836,
+ 837,
+ 838,
+ 839,
+ 840,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 848,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 866,
+ 867,
+ 868,
+ 869,
+ 870,
+ 871,
+ 872,
+ 873,
+ 874,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ InvalidOidBuiltinMapping,
+ 881,
+ 882,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 897,
+ 898,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 899,
+ 900,
+ 901,
+ InvalidOidBuiltinMapping,
+ 902,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 903,
+ 904,
+ 905,
+ 906,
+ InvalidOidBuiltinMapping,
+ 907,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 908,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 909,
+ 910,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 911,
+ 912,
+ 913,
+ 914,
+ 915,
+ 916,
+ 917,
+ 918,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 919,
+ 920,
+ 921,
+ 922,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 923,
+ 924,
+ 925,
+ 926,
+ 927,
+ 928,
+ 929,
+ 930,
+ 931,
+ 932,
+ 933,
+ 934,
+ 935,
+ 936,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 942,
+ 943,
+ 944,
+ 945,
+ 946,
+ 947,
+ 948,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 949,
+ 950,
+ 951,
+ 952,
+ 953,
+ 954,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 960,
+ 961,
+ 962,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 968,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 979,
+ 980,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 992,
+ 993,
+ 994,
+ 995,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000,
+ 1001,
+ 1002,
+ 1003,
+ 1004,
+ 1005,
+ 1006,
+ 1007,
+ 1008,
+ 1009,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1010,
+ 1011,
+ 1012,
+ 1013,
+ InvalidOidBuiltinMapping,
+ 1014,
+ 1015,
+ 1016,
+ 1017,
+ 1018,
+ 1019,
+ 1020,
+ InvalidOidBuiltinMapping,
+ 1021,
+ InvalidOidBuiltinMapping,
+ 1022,
+ 1023,
+ 1024,
+ 1025,
+ 1026,
+ 1027,
+ 1028,
+ 1029,
+ 1030,
+ 1031,
+ 1032,
+ 1033,
+ 1034,
+ 1035,
+ 1036,
+ 1037,
+ 1038,
+ 1039,
+ 1040,
+ 1041,
+ 1042,
+ 1043,
+ 1044,
+ 1045,
+ 1046,
+ 1047,
+ 1048,
+ 1049,
+ 1050,
+ 1051,
+ InvalidOidBuiltinMapping,
+ 1052,
+ 1053,
+ 1054,
+ 1055,
+ 1056,
+ 1057,
+ 1058,
+ 1059,
+ 1060,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1061,
+ 1062,
+ 1063,
+ 1064,
+ 1065,
+ 1066,
+ 1067,
+ 1068,
+ 1069,
+ 1070,
+ 1071,
+ 1072,
+ 1073,
+ 1074,
+ 1075,
+ 1076,
+ 1077,
+ 1078,
+ 1079,
+ 1080,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1081,
+ 1082,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1083,
+ 1084,
+ 1085,
+ 1086,
+ 1087,
+ 1088,
+ 1089,
+ 1090,
+ 1091,
+ 1092,
+ 1093,
+ 1094,
+ 1095,
+ 1096,
+ 1097,
+ 1098,
+ 1099,
+ 1100,
+ 1101,
+ 1102,
+ 1103,
+ 1104,
+ 1105,
+ 1106,
+ 1107,
+ 1108,
+ 1109,
+ 1110,
+ 1111,
+ 1112,
+ 1113,
+ 1114,
+ 1115,
+ 1116,
+ 1117,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1118,
+ 1119,
+ 1120,
+ 1121,
+ 1122,
+ 1123,
+ 1124,
+ 1125,
+ 1126,
+ 1127,
+ 1128,
+ 1129,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1130,
+ 1131,
+ 1132,
+ 1133,
+ 1134,
+ 1135,
+ 1136,
+ 1137,
+ 1138,
+ 1139,
+ 1140,
+ 1141,
+ 1142,
+ 1143,
+ 1144,
+ 1145,
+ 1146,
+ 1147,
+ 1148,
+ 1149,
+ 1150,
+ 1151,
+ 1152,
+ 1153,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1154,
+ 1155,
+ 1156,
+ 1157,
+ 1158,
+ 1159,
+ 1160,
+ 1161,
+ 1162,
+ 1163,
+ 1164,
+ 1165,
+ 1166,
+ 1167,
+ 1168,
+ 1169,
+ 1170,
+ 1171,
+ 1172,
+ 1173,
+ 1174,
+ 1175,
+ 1176,
+ 1177,
+ 1178,
+ 1179,
+ 1180,
+ 1181,
+ 1182,
+ 1183,
+ 1184,
+ 1185,
+ 1186,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1187,
+ 1188,
+ 1189,
+ 1190,
+ 1191,
+ 1192,
+ 1193,
+ 1194,
+ 1195,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1196,
+ 1197,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1198,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1199,
+ 1200,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1201,
+ 1202,
+ 1203,
+ 1204,
+ 1205,
+ 1206,
+ 1207,
+ 1208,
+ 1209,
+ 1210,
+ 1211,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1212,
+ 1213,
+ 1214,
+ 1215,
+ 1216,
+ 1217,
+ 1218,
+ 1219,
+ 1220,
+ 1221,
+ 1222,
+ 1223,
+ 1224,
+ 1225,
+ 1226,
+ 1227,
+ 1228,
+ 1229,
+ 1230,
+ 1231,
+ 1232,
+ InvalidOidBuiltinMapping,
+ 1233,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1234,
+ 1235,
+ 1236,
+ 1237,
+ 1238,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1239,
+ 1240,
+ 1241,
+ 1242,
+ 1243,
+ 1244,
+ 1245,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1246,
+ 1247,
+ 1248,
+ 1249,
+ 1250,
+ InvalidOidBuiltinMapping,
+ 1251,
+ 1252,
+ 1253,
+ 1254,
+ 1255,
+ 1256,
+ 1257,
+ 1258,
+ 1259,
+ 1260,
+ 1261,
+ 1262,
+ 1263,
+ 1264,
+ 1265,
+ 1266,
+ 1267,
+ 1268,
+ 1269,
+ 1270,
+ InvalidOidBuiltinMapping,
+ 1271,
+ InvalidOidBuiltinMapping,
+ 1272,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1273,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1274,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1275,
+ 1276,
+ 1277,
+ 1278,
+ 1279,
+ 1280,
+ 1281,
+ 1282,
+ 1283,
+ 1284,
+ 1285,
+ 1286,
+ 1287,
+ InvalidOidBuiltinMapping,
+ 1288,
+ 1289,
+ 1290,
+ 1291,
+ 1292,
+ 1293,
+ 1294,
+ 1295,
+ 1296,
+ 1297,
+ 1298,
+ 1299,
+ 1300,
+ InvalidOidBuiltinMapping,
+ 1301,
+ 1302,
+ 1303,
+ 1304,
+ 1305,
+ 1306,
+ 1307,
+ 1308,
+ 1309,
+ 1310,
+ 1311,
+ 1312,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1313,
+ 1314,
+ 1315,
+ 1316,
+ 1317,
+ 1318,
+ 1319,
+ 1320,
+ 1321,
+ 1322,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1323,
+ InvalidOidBuiltinMapping,
+ 1324,
+ 1325,
+ 1326,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1327,
+ 1328,
+ 1329,
+ InvalidOidBuiltinMapping,
+ 1330,
+ 1331,
+ 1332,
+ 1333,
+ 1334,
+ 1335,
+ 1336,
+ 1337,
+ 1338,
+ 1339,
+ 1340,
+ 1341,
+ 1342,
+ 1343,
+ 1344,
+ 1345,
+ 1346,
+ 1347,
+ 1348,
+ 1349,
+ 1350,
+ 1351,
+ 1352,
+ 1353,
+ 1354,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1355,
+ InvalidOidBuiltinMapping,
+ 1356,
+ 1357,
+ 1358,
+ InvalidOidBuiltinMapping,
+ 1359,
+ 1360,
+ 1361,
+ 1362,
+ 1363,
+ 1364,
+ 1365,
+ 1366,
+ 1367,
+ 1368,
+ 1369,
+ 1370,
+ 1371,
+ 1372,
+ 1373,
+ 1374,
+ 1375,
+ 1376,
+ 1377,
+ 1378,
+ 1379,
+ 1380,
+ 1381,
+ 1382,
+ 1383,
+ 1384,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1385,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1386,
+ 1387,
+ 1388,
+ 1389,
+ 1390,
+ 1391,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1392,
+ 1393,
+ 1394,
+ 1395,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1396,
+ 1397,
+ 1398,
+ 1399,
+ 1400,
+ 1401,
+ 1402,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1403,
+ 1404,
+ 1405,
+ 1406,
+ 1407,
+ 1408,
+ 1409,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1410,
+ 1411,
+ 1412,
+ 1413,
+ 1414,
+ 1415,
+ 1416,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1417,
+ 1418,
+ 1419,
+ 1420,
+ 1421,
+ 1422,
+ 1423,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1424,
+ 1425,
+ 1426,
+ 1427,
+ 1428,
+ 1429,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1430,
+ 1431,
+ 1432,
+ 1433,
+ 1434,
+ 1435,
+ 1436,
+ 1437,
+ 1438,
+ 1439,
+ 1440,
+ 1441,
+ 1442,
+ 1443,
+ 1444,
+ 1445,
+ 1446,
+ 1447,
+ 1448,
+ 1449,
+ 1450,
+ 1451,
+ 1452,
+ 1453,
+ 1454,
+ 1455,
+ 1456,
+ 1457,
+ 1458,
+ 1459,
+ 1460,
+ 1461,
+ 1462,
+ 1463,
+ 1464,
+ 1465,
+ 1466,
+ 1467,
+ 1468,
+ 1469,
+ 1470,
+ 1471,
+ 1472,
+ 1473,
+ 1474,
+ 1475,
+ 1476,
+ 1477,
+ 1478,
+ 1479,
+ 1480,
+ 1481,
+ 1482,
+ 1483,
+ 1484,
+ 1485,
+ 1486,
+ 1487,
+ 1488,
+ 1489,
+ 1490,
+ 1491,
+ 1492,
+ 1493,
+ 1494,
+ 1495,
+ 1496,
+ 1497,
+ 1498,
+ 1499,
+ 1500,
+ 1501,
+ 1502,
+ 1503,
+ 1504,
+ 1505,
+ 1506,
+ 1507,
+ 1508,
+ 1509,
+ 1510,
+ 1511,
+ 1512,
+ 1513,
+ 1514,
+ 1515,
+ 1516,
+ 1517,
+ 1518,
+ 1519,
+ 1520,
+ 1521,
+ 1522,
+ 1523,
+ 1524,
+ 1525,
+ 1526,
+ 1527,
+ 1528,
+ 1529,
+ 1530,
+ 1531,
+ 1532,
+ 1533,
+ 1534,
+ 1535,
+ 1536,
+ 1537,
+ 1538,
+ 1539,
+ 1540,
+ 1541,
+ 1542,
+ 1543,
+ 1544,
+ 1545,
+ 1546,
+ 1547,
+ 1548,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1549,
+ 1550,
+ 1551,
+ 1552,
+ 1553,
+ 1554,
+ 1555,
+ 1556,
+ 1557,
+ 1558,
+ 1559,
+ 1560,
+ 1561,
+ 1562,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1563,
+ 1564,
+ 1565,
+ 1566,
+ 1567,
+ 1568,
+ 1569,
+ 1570,
+ 1571,
+ 1572,
+ 1573,
+ 1574,
+ 1575,
+ 1576,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1577,
+ InvalidOidBuiltinMapping,
+ 1578,
+ 1579,
+ 1580,
+ 1581,
+ 1582,
+ 1583,
+ 1584,
+ 1585,
+ 1586,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1587,
+ 1588,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1589,
+ 1590,
+ 1591,
+ 1592,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1593,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1594,
+ 1595,
+ 1596,
+ 1597,
+ 1598,
+ 1599,
+ 1600,
+ 1601,
+ 1602,
+ 1603,
+ InvalidOidBuiltinMapping,
+ 1604,
+ 1605,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1606,
+ 1607,
+ 1608,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1609,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1610,
+ 1611,
+ 1612,
+ 1613,
+ 1614,
+ 1615,
+ 1616,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1617,
+ 1618,
+ 1619,
+ 1620,
+ 1621,
+ 1622,
+ 1623,
+ 1624,
+ 1625,
+ 1626,
+ 1627,
+ 1628,
+ InvalidOidBuiltinMapping,
+ 1629,
+ 1630,
+ InvalidOidBuiltinMapping,
+ 1631,
+ 1632,
+ 1633,
+ 1634,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1635,
+ 1636,
+ 1637,
+ 1638,
+ 1639,
+ 1640,
+ 1641,
+ 1642,
+ 1643,
+ 1644,
+ 1645,
+ 1646,
+ 1647,
+ 1648,
+ 1649,
+ 1650,
+ 1651,
+ 1652,
+ InvalidOidBuiltinMapping,
+ 1653,
+ 1654,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1655,
+ 1656,
+ 1657,
+ 1658,
+ 1659,
+ 1660,
+ 1661,
+ 1662,
+ InvalidOidBuiltinMapping,
+ 1663,
+ 1664,
+ 1665,
+ 1666,
+ 1667,
+ 1668,
+ 1669,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1670,
+ 1671,
+ 1672,
+ 1673,
+ 1674,
+ 1675,
+ 1676,
+ 1677,
+ 1678,
+ 1679,
+ 1680,
+ 1681,
+ 1682,
+ 1683,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1684,
+ 1685,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1686,
+ 1687,
+ 1688,
+ 1689,
+ 1690,
+ 1691,
+ 1692,
+ 1693,
+ 1694,
+ 1695,
+ 1696,
+ 1697,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1698,
+ 1699,
+ 1700,
+ 1701,
+ 1702,
+ 1703,
+ 1704,
+ 1705,
+ 1706,
+ 1707,
+ 1708,
+ 1709,
+ 1710,
+ 1711,
+ 1712,
+ 1713,
+ 1714,
+ 1715,
+ 1716,
+ 1717,
+ 1718,
+ 1719,
+ 1720,
+ InvalidOidBuiltinMapping,
+ 1721,
+ 1722,
+ 1723,
+ 1724,
+ 1725,
+ 1726,
+ 1727,
+ 1728,
+ 1729,
+ 1730,
+ 1731,
+ 1732,
+ 1733,
+ 1734,
+ 1735,
+ 1736,
+ 1737,
+ 1738,
+ 1739,
+ 1740,
+ 1741,
+ 1742,
+ 1743,
+ 1744,
+ 1745,
+ 1746,
+ 1747,
+ 1748,
+ 1749,
+ 1750,
+ InvalidOidBuiltinMapping,
+ 1751,
+ 1752,
+ 1753,
+ 1754,
+ 1755,
+ 1756,
+ 1757,
+ 1758,
+ 1759,
+ 1760,
+ 1761,
+ 1762,
+ 1763,
+ 1764,
+ 1765,
+ 1766,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1767,
+ 1768,
+ 1769,
+ 1770,
+ 1771,
+ 1772,
+ 1773,
+ 1774,
+ 1775,
+ 1776,
+ 1777,
+ 1778,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1779,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1780,
+ 1781,
+ 1782,
+ 1783,
+ 1784,
+ 1785,
+ 1786,
+ 1787,
+ 1788,
+ 1789,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1790,
+ 1791,
+ 1792,
+ 1793,
+ 1794,
+ 1795,
+ 1796,
+ 1797,
+ 1798,
+ 1799,
+ 1800,
+ 1801,
+ 1802,
+ 1803,
+ 1804,
+ 1805,
+ 1806,
+ 1807,
+ 1808,
+ 1809,
+ 1810,
+ 1811,
+ 1812,
+ 1813,
+ 1814,
+ 1815,
+ 1816,
+ 1817,
+ 1818,
+ 1819,
+ 1820,
+ 1821,
+ 1822,
+ 1823,
+ 1824,
+ 1825,
+ 1826,
+ 1827,
+ 1828,
+ 1829,
+ 1830,
+ 1831,
+ 1832,
+ 1833,
+ 1834,
+ 1835,
+ 1836,
+ 1837,
+ 1838,
+ 1839,
+ 1840,
+ 1841,
+ 1842,
+ InvalidOidBuiltinMapping,
+ 1843,
+ 1844,
+ 1845,
+ 1846,
+ 1847,
+ 1848,
+ 1849,
+ 1850,
+ 1851,
+ 1852,
+ 1853,
+ 1854,
+ 1855,
+ 1856,
+ 1857,
+ 1858,
+ 1859,
+ 1860,
+ 1861,
+ 1862,
+ 1863,
+ 1864,
+ 1865,
+ 1866,
+ 1867,
+ 1868,
+ 1869,
+ 1870,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1871,
+ 1872,
+ 1873,
+ InvalidOidBuiltinMapping,
+ 1874,
+ 1875,
+ 1876,
+ 1877,
+ 1878,
+ 1879,
+ 1880,
+ 1881,
+ 1882,
+ 1883,
+ 1884,
+ 1885,
+ 1886,
+ 1887,
+ 1888,
+ 1889,
+ 1890,
+ 1891,
+ 1892,
+ 1893,
+ 1894,
+ 1895,
+ 1896,
+ 1897,
+ 1898,
+ 1899,
+ 1900,
+ 1901,
+ 1902,
+ InvalidOidBuiltinMapping,
+ 1903,
+ 1904,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1905,
+ 1906,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1907,
+ 1908,
+ 1909,
+ 1910,
+ 1911,
+ 1912,
+ 1913,
+ 1914,
+ 1915,
+ 1916,
+ 1917,
+ 1918,
+ 1919,
+ 1920,
+ 1921,
+ 1922,
+ 1923,
+ 1924,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1925,
+ 1926,
+ 1927,
+ 1928,
+ 1929,
+ 1930,
+ 1931,
+ 1932,
+ 1933,
+ 1934,
+ 1935,
+ 1936,
+ 1937,
+ 1938,
+ InvalidOidBuiltinMapping,
+ 1939,
+ 1940,
+ 1941,
+ 1942,
+ 1943,
+ 1944,
+ 1945,
+ 1946,
+ 1947,
+ 1948,
+ InvalidOidBuiltinMapping,
+ 1949,
+ 1950,
+ 1951,
+ 1952,
+ 1953,
+ 1954,
+ 1955,
+ 1956,
+ 1957,
+ 1958,
+ 1959,
+ 1960,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1961,
+ 1962,
+ InvalidOidBuiltinMapping,
+ 1963,
+ 1964,
+ 1965,
+ 1966,
+ 1967,
+ 1968,
+ 1969,
+ 1970,
+ InvalidOidBuiltinMapping,
+ 1971,
+ 1972,
+ 1973,
+ 1974,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1975,
+ 1976,
+ 1977,
+ 1978,
+ 1979,
+ 1980,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1981,
+ 1982,
+ 1983,
+ 1984,
+ 1985,
+ 1986,
+ 1987,
+ 1988,
+ 1989,
+ 1990,
+ 1991,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1992,
+ 1993,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1994,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 1995,
+ 1996,
+ 1997,
+ 1998,
+ 1999,
+ 2000,
+ 2001,
+ 2002,
+ InvalidOidBuiltinMapping,
+ 2003,
+ 2004,
+ InvalidOidBuiltinMapping,
+ 2005,
+ 2006,
+ 2007,
+ 2008,
+ 2009,
+ InvalidOidBuiltinMapping,
+ 2010,
+ 2011,
+ 2012,
+ 2013,
+ 2014,
+ 2015,
+ 2016,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2017,
+ InvalidOidBuiltinMapping,
+ 2018,
+ InvalidOidBuiltinMapping,
+ 2019,
+ 2020,
+ 2021,
+ 2022,
+ 2023,
+ 2024,
+ 2025,
+ 2026,
+ 2027,
+ 2028,
+ 2029,
+ 2030,
+ 2031,
+ 2032,
+ 2033,
+ 2034,
+ 2035,
+ 2036,
+ InvalidOidBuiltinMapping,
+ 2037,
+ 2038,
+ 2039,
+ 2040,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2041,
+ 2042,
+ 2043,
+ 2044,
+ 2045,
+ 2046,
+ 2047,
+ 2048,
+ 2049,
+ 2050,
+ 2051,
+ 2052,
+ 2053,
+ 2054,
+ 2055,
+ 2056,
+ 2057,
+ 2058,
+ 2059,
+ 2060,
+ 2061,
+ 2062,
+ 2063,
+ 2064,
+ 2065,
+ 2066,
+ 2067,
+ 2068,
+ 2069,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2070,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2071,
+ 2072,
+ 2073,
+ 2074,
+ 2075,
+ 2076,
+ 2077,
+ 2078,
+ 2079,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2080,
+ InvalidOidBuiltinMapping,
+ 2081,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2082,
+ 2083,
+ 2084,
+ 2085,
+ 2086,
+ 2087,
+ 2088,
+ 2089,
+ 2090,
+ 2091,
+ 2092,
+ 2093,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2094,
+ 2095,
+ InvalidOidBuiltinMapping,
+ 2096,
+ 2097,
+ 2098,
+ InvalidOidBuiltinMapping,
+ 2099,
+ 2100,
+ 2101,
+ 2102,
+ 2103,
+ 2104,
+ 2105,
+ 2106,
+ 2107,
+ 2108,
+ 2109,
+ 2110,
+ 2111,
+ 2112,
+ 2113,
+ 2114,
+ 2115,
+ 2116,
+ 2117,
+ 2118,
+ 2119,
+ 2120,
+ 2121,
+ 2122,
+ 2123,
+ 2124,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2125,
+ InvalidOidBuiltinMapping,
+ 2126,
+ 2127,
+ 2128,
+ 2129,
+ 2130,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2131,
+ 2132,
+ 2133,
+ 2134,
+ 2135,
+ 2136,
+ 2137,
+ 2138,
+ 2139,
+ 2140,
+ 2141,
+ 2142,
+ 2143,
+ 2144,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2145,
+ 2146,
+ 2147,
+ 2148,
+ 2149,
+ 2150,
+ 2151,
+ 2152,
+ 2153,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2154,
+ 2155,
+ 2156,
+ 2157,
+ 2158,
+ InvalidOidBuiltinMapping,
+ 2159,
+ 2160,
+ InvalidOidBuiltinMapping,
+ 2161,
+ 2162,
+ 2163,
+ InvalidOidBuiltinMapping,
+ 2164,
+ 2165,
+ 2166,
+ 2167,
+ 2168,
+ 2169,
+ 2170,
+ 2171,
+ 2172,
+ 2173,
+ 2174,
+ 2175,
+ 2176,
+ 2177,
+ 2178,
+ 2179,
+ 2180,
+ 2181,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2182,
+ 2183,
+ 2184,
+ 2185,
+ 2186,
+ 2187,
+ 2188,
+ 2189,
+ 2190,
+ 2191,
+ 2192,
+ 2193,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2194,
+ 2195,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2196,
+ 2197,
+ 2198,
+ 2199,
+ 2200,
+ 2201,
+ InvalidOidBuiltinMapping,
+ 2202,
+ 2203,
+ 2204,
+ InvalidOidBuiltinMapping,
+ 2205,
+ 2206,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2207,
+ 2208,
+ InvalidOidBuiltinMapping,
+ 2209,
+ 2210,
+ 2211,
+ 2212,
+ InvalidOidBuiltinMapping,
+ 2213,
+ InvalidOidBuiltinMapping,
+ 2214,
+ 2215,
+ 2216,
+ 2217,
+ 2218,
+ 2219,
+ 2220,
+ 2221,
+ 2222,
+ 2223,
+ 2224,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2225,
+ 2226,
+ 2227,
+ 2228,
+ 2229,
+ 2230,
+ 2231,
+ 2232,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2233,
+ 2234,
+ 2235,
+ InvalidOidBuiltinMapping,
+ 2236,
+ 2237,
+ 2238,
+ 2239,
+ InvalidOidBuiltinMapping,
+ 2240,
+ 2241,
+ 2242,
+ 2243,
+ 2244,
+ 2245,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2246,
+ 2247,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2248,
+ 2249,
+ 2250,
+ 2251,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2252,
+ 2253,
+ 2254,
+ 2255,
+ 2256,
+ 2257,
+ 2258,
+ 2259,
+ 2260,
+ 2261,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2262,
+ 2263,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2264,
+ 2265,
+ 2266,
+ 2267,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2268,
+ 2269,
+ 2270,
+ 2271,
+ 2272,
+ 2273,
+ 2274,
+ 2275,
+ 2276,
+ InvalidOidBuiltinMapping,
+ 2277,
+ 2278,
+ 2279,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2280,
+ 2281,
+ 2282,
+ 2283,
+ 2284,
+ 2285,
+ 2286,
+ 2287,
+ 2288,
+ 2289,
+ 2290,
+ 2291,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2292,
+ 2293,
+ 2294,
+ 2295,
+ 2296,
+ 2297,
+ 2298,
+ 2299,
+ 2300,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2301,
+ 2302,
+ 2303,
+ 2304,
+ 2305,
+ 2306,
+ 2307,
+ InvalidOidBuiltinMapping,
+ 2308,
+ 2309,
+ 2310,
+ 2311,
+ 2312,
+ 2313,
+ 2314,
+ 2315,
+ 2316,
+ InvalidOidBuiltinMapping,
+ 2317,
+ 2318,
+ 2319,
+ 2320,
+ 2321,
+ 2322,
+ 2323,
+ 2324,
+ 2325,
+ InvalidOidBuiltinMapping,
+ 2326,
+ 2327,
+ 2328,
+ 2329,
+ InvalidOidBuiltinMapping,
+ 2330,
+ 2331,
+ InvalidOidBuiltinMapping,
+ 2332,
+ 2333,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2334,
+ 2335,
+ 2336,
+ 2337,
+ 2338,
+ 2339,
+ InvalidOidBuiltinMapping,
+ 2340,
+ 2341,
+ 2342,
+ 2343,
+ 2344,
+ InvalidOidBuiltinMapping,
+ 2345,
+ 2346,
+ 2347,
+ 2348,
+ 2349,
+ 2350,
+ 2351,
+ 2352,
+ 2353,
+ 2354,
+ 2355,
+ 2356,
+ 2357,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2358,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2359,
+ 2360,
+ 2361,
+ 2362,
+ 2363,
+ 2364,
+ 2365,
+ 2366,
+ 2367,
+ 2368,
+ 2369,
+ 2370,
+ 2371,
+ 2372,
+ 2373,
+ 2374,
+ 2375,
+ 2376,
+ 2377,
+ 2378,
+ 2379,
+ 2380,
+ 2381,
+ InvalidOidBuiltinMapping,
+ 2382,
+ 2383,
+ 2384,
+ 2385,
+ 2386,
+ 2387,
+ 2388,
+ InvalidOidBuiltinMapping,
+ 2389,
+ 2390,
+ 2391,
+ 2392,
+ InvalidOidBuiltinMapping,
+ 2393,
+ 2394,
+ 2395,
+ 2396,
+ 2397,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2398,
+ 2399,
+ 2400,
+ 2401,
+ 2402,
+ 2403,
+ 2404,
+ 2405,
+ 2406,
+ 2407,
+ InvalidOidBuiltinMapping,
+ 2408,
+ 2409,
+ 2410,
+ 2411,
+ 2412,
+ InvalidOidBuiltinMapping,
+ 2413,
+ 2414,
+ 2415,
+ 2416,
+ 2417,
+ 2418,
+ InvalidOidBuiltinMapping,
+ 2419,
+ 2420,
+ 2421,
+ 2422,
+ 2423,
+ 2424,
+ 2425,
+ 2426,
+ 2427,
+ 2428,
+ 2429,
+ 2430,
+ 2431,
+ 2432,
+ 2433,
+ 2434,
+ 2435,
+ 2436,
+ 2437,
+ 2438,
+ 2439,
+ 2440,
+ 2441,
+ 2442,
+ 2443,
+ 2444,
+ 2445,
+ 2446,
+ 2447,
+ 2448,
+ 2449,
+ 2450,
+ 2451,
+ 2452,
+ 2453,
+ 2454,
+ 2455,
+ 2456,
+ InvalidOidBuiltinMapping,
+ 2457,
+ 2458,
+ 2459,
+ 2460,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2461,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2462,
+ 2463,
+ 2464,
+ 2465,
+ 2466,
+ InvalidOidBuiltinMapping,
+ 2467,
+ 2468,
+ 2469,
+ 2470,
+ 2471,
+ 2472,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2473,
+ 2474,
+ 2475,
+ 2476,
+ 2477,
+ 2478,
+ 2479,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2480,
+ 2481,
+ 2482,
+ 2483,
+ 2484,
+ 2485,
+ 2486,
+ 2487,
+ 2488,
+ 2489,
+ 2490,
+ 2491,
+ 2492,
+ 2493,
+ 2494,
+ 2495,
+ 2496,
+ 2497,
+ 2498,
+ 2499,
+ 2500,
+ 2501,
+ 2502,
+ 2503,
+ 2504,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2505,
+ 2506,
+ 2507,
+ 2508,
+ InvalidOidBuiltinMapping,
+ 2509,
+ InvalidOidBuiltinMapping,
+ 2510,
+ InvalidOidBuiltinMapping,
+ 2511,
+ InvalidOidBuiltinMapping,
+ 2512,
+ InvalidOidBuiltinMapping,
+ 2513,
+ InvalidOidBuiltinMapping,
+ 2514,
+ InvalidOidBuiltinMapping,
+ 2515,
+ InvalidOidBuiltinMapping,
+ 2516,
+ InvalidOidBuiltinMapping,
+ 2517,
+ InvalidOidBuiltinMapping,
+ 2518,
+ InvalidOidBuiltinMapping,
+ 2519,
+ 2520,
+ 2521,
+ 2522,
+ InvalidOidBuiltinMapping,
+ 2523,
+ 2524,
+ InvalidOidBuiltinMapping,
+ 2525,
+ 2526,
+ 2527,
+ 2528,
+ 2529,
+ 2530,
+ 2531,
+ 2532,
+ 2533,
+ 2534,
+ 2535,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2536,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2537,
+ 2538,
+ 2539,
+ 2540,
+ 2541,
+ 2542,
+ 2543,
+ 2544,
+ 2545,
+ 2546,
+ 2547,
+ 2548,
+ 2549,
+ 2550,
+ 2551,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2552,
+ 2553,
+ 2554,
+ 2555,
+ 2556,
+ 2557,
+ 2558,
+ 2559,
+ 2560,
+ 2561,
+ 2562,
+ 2563,
+ 2564,
+ 2565,
+ 2566,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2567,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2568,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2569,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2570,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2571,
+ 2572,
+ 2573,
+ 2574,
+ 2575,
+ 2576,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2577,
+ 2578,
+ 2579,
+ 2580,
+ 2581,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2582,
+ 2583,
+ 2584,
+ 2585,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2586,
+ 2587,
+ 2588,
+ 2589,
+ InvalidOidBuiltinMapping,
+ 2590,
+ 2591,
+ 2592,
+ 2593,
+ 2594,
+ 2595,
+ 2596,
+ 2597,
+ 2598,
+ 2599,
+ 2600,
+ 2601,
+ 2602,
+ 2603,
+ 2604,
+ 2605,
+ 2606,
+ 2607,
+ 2608,
+ 2609,
+ 2610,
+ 2611,
+ 2612,
+ 2613,
+ 2614,
+ 2615,
+ 2616,
+ 2617,
+ 2618,
+ 2619,
+ 2620,
+ 2621,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2622,
+ 2623,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2624,
+ 2625,
+ 2626,
+ 2627,
+ 2628,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2629,
+ 2630,
+ 2631,
+ 2632,
+ 2633,
+ 2634,
+ 2635,
+ 2636,
+ 2637,
+ 2638,
+ 2639,
+ 2640,
+ 2641,
+ 2642,
+ 2643,
+ 2644,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2645,
+ 2646,
+ 2647,
+ 2648,
+ 2649,
+ InvalidOidBuiltinMapping,
+ 2650,
+ 2651,
+ 2652,
+ 2653,
+ 2654,
+ 2655,
+ 2656,
+ 2657,
+ 2658,
+ 2659,
+ 2660,
+ 2661,
+ 2662,
+ 2663,
+ 2664,
+ 2665,
+ 2666,
+ 2667,
+ 2668,
+ 2669,
+ 2670,
+ 2671,
+ 2672,
+ 2673,
+ 2674,
+ 2675,
+ 2676,
+ 2677,
+ 2678,
+ 2679,
+ 2680,
+ 2681,
+ 2682,
+ 2683,
+ 2684,
+ 2685,
+ 2686,
+ 2687,
+ 2688,
+ 2689,
+ 2690,
+ 2691,
+ 2692,
+ 2693,
+ 2694,
+ 2695,
+ 2696,
+ 2697,
+ 2698,
+ 2699,
+ 2700,
+ 2701,
+ 2702,
+ 2703,
+ 2704,
+ 2705,
+ 2706,
+ 2707,
+ 2708,
+ 2709,
+ 2710,
+ 2711,
+ 2712,
+ 2713,
+ 2714,
+ 2715,
+ 2716,
+ 2717,
+ 2718,
+ 2719,
+ 2720,
+ 2721,
+ 2722,
+ 2723,
+ 2724,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2725,
+ 2726,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2727,
+ InvalidOidBuiltinMapping,
+ 2728,
+ 2729,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2730,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2731,
+ 2732,
+ 2733,
+ InvalidOidBuiltinMapping,
+ 2734,
+ 2735,
+ 2736,
+ 2737,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2738,
+ 2739,
+ 2740,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2741,
+ 2742,
+ 2743,
+ 2744,
+ 2745,
+ 2746,
+ 2747,
+ 2748,
+ 2749,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2750,
+ 2751,
+ 2752,
+ 2753,
+ 2754,
+ 2755,
+ 2756,
+ 2757,
+ 2758,
+ 2759,
+ 2760,
+ 2761,
+ 2762,
+ 2763,
+ 2764,
+ 2765,
+ 2766,
+ 2767,
+ 2768,
+ 2769,
+ 2770,
+ 2771,
+ 2772,
+ 2773,
+ 2774,
+ 2775,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2776,
+ InvalidOidBuiltinMapping,
+ 2777,
+ 2778,
+ InvalidOidBuiltinMapping,
+ 2779,
+ 2780,
+ InvalidOidBuiltinMapping,
+ 2781,
+ 2782,
+ 2783,
+ 2784,
+ 2785,
+ 2786,
+ 2787,
+ 2788,
+ InvalidOidBuiltinMapping,
+ 2789,
+ 2790,
+ 2791,
+ 2792,
+ 2793,
+ InvalidOidBuiltinMapping,
+ 2794,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2795,
+ 2796,
+ 2797,
+ 2798,
+ InvalidOidBuiltinMapping,
+ 2799,
+ 2800,
+ 2801,
+ 2802,
+ 2803,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2804,
+ 2805,
+ 2806,
+ 2807,
+ 2808,
+ 2809,
+ 2810,
+ 2811,
+ 2812,
+ 2813,
+ 2814,
+ 2815,
+ 2816,
+ 2817,
+ 2818,
+ 2819,
+ 2820,
+ 2821,
+ 2822,
+ 2823,
+ 2824,
+ 2825,
+ 2826,
+ 2827,
+ 2828,
+ 2829,
+ 2830,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2831,
+ 2832,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2833,
+ 2834,
+ 2835,
+ 2836,
+ 2837,
+ 2838,
+ 2839,
+ 2840,
+ 2841,
+ 2842,
+ 2843,
+ 2844,
+ 2845,
+ 2846,
+ 2847,
+ 2848,
+ 2849,
+ 2850,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2851,
+ 2852,
+ 2853,
+ 2854,
+ 2855,
+ 2856,
+ 2857,
+ 2858,
+ 2859,
+ 2860,
+ 2861,
+ 2862,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2863,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2864,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2865,
+ 2866,
+ 2867,
+ 2868,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2869,
+ InvalidOidBuiltinMapping,
+ 2870,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2871,
+ 2872,
+ 2873,
+ 2874,
+ 2875,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2876,
+ 2877,
+ 2878,
+ InvalidOidBuiltinMapping,
+ 2879,
+ 2880,
+ 2881,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2882,
+ 2883,
+ 2884,
+ 2885,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2886,
+ 2887,
+ 2888,
+ 2889,
+ 2890,
+ 2891,
+ 2892,
+ 2893,
+ 2894,
+ InvalidOidBuiltinMapping,
+ 2895,
+ 2896,
+ 2897,
+ 2898,
+ 2899,
+ 2900,
+ 2901,
+ 2902,
+ 2903,
+ 2904,
+ 2905,
+ 2906,
+ 2907,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2908,
+ 2909,
+ 2910,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2911,
+ 2912,
+ 2913,
+ 2914,
+ 2915,
+ 2916,
+ 2917,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2918,
+ 2919,
+ 2920,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ InvalidOidBuiltinMapping,
+ 2921,
+ 2922,
+ 2923,
+ 2924,
+ 2925,
+ 2926,
+ 2927,
+ 2928,
+ 2929,
+ 2930,
+ 2931,
+ 2932,
+ 2933,
+ 2934,
+ 2935,
+ 2936,
+ 2937,
+ 2938,
+ 2939,
+ 2940,
+ 2941,
+ 2942,
+ 2943,
+ 2944,
+ 2945
+};
diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl
new file mode 100644
index 0000000..5727ff7
--- /dev/null
+++ b/src/backend/utils/generate-errcodes.pl
@@ -0,0 +1,46 @@
+#!/usr/bin/perl
+#
+# Generate the errcodes.h header from errcodes.txt
+# Copyright (c) 2000-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+print
+ "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n";
+print "/* there is deliberately not an #ifndef ERRCODES_H here */\n";
+
+open my $errcodes, '<', $ARGV[0] or die;
+
+while (<$errcodes>)
+{
+ chomp;
+
+ # Skip comments
+ next if /^#/;
+ next if /^\s*$/;
+
+ # Emit a comment for each section header
+ if (/^Section:(.*)/)
+ {
+ my $header = $1;
+ $header =~ s/^\s+//;
+ print "\n/* $header */\n";
+ next;
+ }
+
+ die "unable to parse errcodes.txt"
+ unless /^([^\s]{5})\s+[EWS]\s+([^\s]+)/;
+
+ (my $sqlstate, my $errcode_macro) = ($1, $2);
+
+ # Split the sqlstate letters
+ $sqlstate = join ",", split "", $sqlstate;
+
+ # And quote them
+ $sqlstate =~ s/([^,])/'$1'/g;
+
+ print "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n";
+}
+
+close $errcodes;
diff --git a/src/backend/utils/hash/Makefile b/src/backend/utils/hash/Makefile
new file mode 100644
index 0000000..d4c1210
--- /dev/null
+++ b/src/backend/utils/hash/Makefile
@@ -0,0 +1,19 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/hash
+#
+# IDENTIFICATION
+# src/backend/utils/hash/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/hash
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ dynahash.o \
+ pg_crc.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c
new file mode 100644
index 0000000..3babde8
--- /dev/null
+++ b/src/backend/utils/hash/dynahash.c
@@ -0,0 +1,1930 @@
+/*-------------------------------------------------------------------------
+ *
+ * dynahash.c
+ * dynamic chained hash tables
+ *
+ * dynahash.c supports both local-to-a-backend hash tables and hash tables in
+ * shared memory. For shared hash tables, it is the caller's responsibility
+ * to provide appropriate access interlocking. The simplest convention is
+ * that a single LWLock protects the whole hash table. Searches (HASH_FIND or
+ * hash_seq_search) need only shared lock, but any update requires exclusive
+ * lock. For heavily-used shared tables, the single-lock approach creates a
+ * concurrency bottleneck, so we also support "partitioned" locking wherein
+ * there are multiple LWLocks guarding distinct subsets of the table. To use
+ * a hash table in partitioned mode, the HASH_PARTITION flag must be given
+ * to hash_create. This prevents any attempt to split buckets on-the-fly.
+ * Therefore, each hash bucket chain operates independently, and no fields
+ * of the hash header change after init except nentries and freeList.
+ * (A partitioned table uses multiple copies of those fields, guarded by
+ * spinlocks, for additional concurrency.)
+ * This lets any subset of the hash buckets be treated as a separately
+ * lockable partition. We expect callers to use the low-order bits of a
+ * lookup key's hash value as a partition number --- this will work because
+ * of the way calc_bucket() maps hash values to bucket numbers.
+ *
+ * For hash tables in shared memory, the memory allocator function should
+ * match malloc's semantics of returning NULL on failure. For hash tables
+ * in local memory, we typically use palloc() which will throw error on
+ * failure. The code in this file has to cope with both cases.
+ *
+ * dynahash.c provides support for these types of lookup keys:
+ *
+ * 1. Null-terminated C strings (truncated if necessary to fit in keysize),
+ * compared as though by strcmp(). This is selected by specifying the
+ * HASH_STRINGS flag to hash_create.
+ *
+ * 2. Arbitrary binary data of size keysize, compared as though by memcmp().
+ * (Caller must ensure there are no undefined padding bits in the keys!)
+ * This is selected by specifying the HASH_BLOBS flag to hash_create.
+ *
+ * 3. More complex key behavior can be selected by specifying user-supplied
+ * hashing, comparison, and/or key-copying functions. At least a hashing
+ * function must be supplied; comparison defaults to memcmp() and key copying
+ * to memcpy() when a user-defined hashing function is selected.
+ *
+ * Compared to simplehash, dynahash has the following benefits:
+ *
+ * - It supports partitioning, which is useful for shared memory access using
+ * locks.
+ * - Shared memory hashes are allocated in a fixed size area at startup and
+ * are discoverable by name from other processes.
+ * - Because entries don't need to be moved in the case of hash conflicts,
+ * dynahash has better performance for large entries.
+ * - Guarantees stable pointers to entries.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/hash/dynahash.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Original comments:
+ *
+ * Dynamic hashing, after CACM April 1988 pp 446-457, by Per-Ake Larson.
+ * Coded into C, with minor code improvements, and with hsearch(3) interface,
+ * by ejp@ausmelb.oz, Jul 26, 1988: 13:16;
+ * also, hcreate/hdestroy routines added to simulate hsearch(3).
+ *
+ * These routines simulate hsearch(3) and family, with the important
+ * difference that the hash table is dynamic - can grow indefinitely
+ * beyond its original size (as supplied to hcreate()).
+ *
+ * Performance appears to be comparable to that of hsearch(3).
+ * The 'source-code' options referred to in hsearch(3)'s 'man' page
+ * are not implemented; otherwise functionality is identical.
+ *
+ * Compilation controls:
+ * HASH_DEBUG controls some informative traces, mainly for debugging.
+ * HASH_STATISTICS causes HashAccesses and HashCollisions to be maintained;
+ * when combined with HASH_DEBUG, these are displayed by hdestroy().
+ *
+ * Problems & fixes to ejp@ausmelb.oz. WARNING: relies on pre-processor
+ * concatenation property, in probably unnecessary code 'optimization'.
+ *
+ * Modified margo@postgres.berkeley.edu February 1990
+ * added multiple table interface
+ * Modified by sullivan@postgres.berkeley.edu April 1990
+ * changed ctl structure for shared memory
+ */
+
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/xact.h"
+#include "common/hashfn.h"
+#include "port/pg_bitutils.h"
+#include "storage/shmem.h"
+#include "storage/spin.h"
+#include "utils/dynahash.h"
+#include "utils/memutils.h"
+
+
+/*
+ * Constants
+ *
+ * A hash table has a top-level "directory", each of whose entries points
+ * to a "segment" of ssize bucket headers. The maximum number of hash
+ * buckets is thus dsize * ssize (but dsize may be expansible). Of course,
+ * the number of records in the table can be larger, but we don't want a
+ * whole lot of records per bucket or performance goes down.
+ *
+ * In a hash table allocated in shared memory, the directory cannot be
+ * expanded because it must stay at a fixed address. The directory size
+ * should be selected using hash_select_dirsize (and you'd better have
+ * a good idea of the maximum number of entries!). For non-shared hash
+ * tables, the initial directory size can be left at the default.
+ */
+#define DEF_SEGSIZE 256
+#define DEF_SEGSIZE_SHIFT 8 /* must be log2(DEF_SEGSIZE) */
+#define DEF_DIRSIZE 256
+
+/* Number of freelists to be used for a partitioned hash table. */
+#define NUM_FREELISTS 32
+
+/* A hash bucket is a linked list of HASHELEMENTs */
+typedef HASHELEMENT *HASHBUCKET;
+
+/* A hash segment is an array of bucket headers */
+typedef HASHBUCKET *HASHSEGMENT;
+
+/*
+ * Per-freelist data.
+ *
+ * In a partitioned hash table, each freelist is associated with a specific
+ * set of hashcodes, as determined by the FREELIST_IDX() macro below.
+ * nentries tracks the number of live hashtable entries having those hashcodes
+ * (NOT the number of entries in the freelist, as you might expect).
+ *
+ * The coverage of a freelist might be more or less than one partition, so it
+ * needs its own lock rather than relying on caller locking. Relying on that
+ * wouldn't work even if the coverage was the same, because of the occasional
+ * need to "borrow" entries from another freelist; see get_hash_entry().
+ *
+ * Using an array of FreeListData instead of separate arrays of mutexes,
+ * nentries and freeLists helps to reduce sharing of cache lines between
+ * different mutexes.
+ */
+typedef struct
+{
+ slock_t mutex; /* spinlock for this freelist */
+ long nentries; /* number of entries in associated buckets */
+ HASHELEMENT *freeList; /* chain of free elements */
+} FreeListData;
+
+/*
+ * Header structure for a hash table --- contains all changeable info
+ *
+ * In a shared-memory hash table, the HASHHDR is in shared memory, while
+ * each backend has a local HTAB struct. For a non-shared table, there isn't
+ * any functional difference between HASHHDR and HTAB, but we separate them
+ * anyway to share code between shared and non-shared tables.
+ */
+struct HASHHDR
+{
+ /*
+ * The freelist can become a point of contention in high-concurrency hash
+ * tables, so we use an array of freelists, each with its own mutex and
+ * nentries count, instead of just a single one. Although the freelists
+ * normally operate independently, we will scavenge entries from freelists
+ * other than a hashcode's default freelist when necessary.
+ *
+ * If the hash table is not partitioned, only freeList[0] is used and its
+ * spinlock is not used at all; callers' locking is assumed sufficient.
+ */
+ FreeListData freeList[NUM_FREELISTS];
+
+ /* These fields can change, but not in a partitioned table */
+ /* Also, dsize can't change in a shared table, even if unpartitioned */
+ long dsize; /* directory size */
+ long nsegs; /* number of allocated segments (<= dsize) */
+ uint32 max_bucket; /* ID of maximum bucket in use */
+ uint32 high_mask; /* mask to modulo into entire table */
+ uint32 low_mask; /* mask to modulo into lower half of table */
+
+ /* These fields are fixed at hashtable creation */
+ Size keysize; /* hash key length in bytes */
+ Size entrysize; /* total user element size in bytes */
+ long num_partitions; /* # partitions (must be power of 2), or 0 */
+ long max_dsize; /* 'dsize' limit if directory is fixed size */
+ long ssize; /* segment size --- must be power of 2 */
+ int sshift; /* segment shift = log2(ssize) */
+ int nelem_alloc; /* number of entries to allocate at once */
+
+#ifdef HASH_STATISTICS
+
+ /*
+ * Count statistics here. NB: stats code doesn't bother with mutex, so
+ * counts could be corrupted a bit in a partitioned table.
+ */
+ long accesses;
+ long collisions;
+#endif
+};
+
+#define IS_PARTITIONED(hctl) ((hctl)->num_partitions != 0)
+
+#define FREELIST_IDX(hctl, hashcode) \
+ (IS_PARTITIONED(hctl) ? (hashcode) % NUM_FREELISTS : 0)
+
+/*
+ * Top control structure for a hashtable --- in a shared table, each backend
+ * has its own copy (OK since no fields change at runtime)
+ */
+struct HTAB
+{
+ HASHHDR *hctl; /* => shared control information */
+ HASHSEGMENT *dir; /* directory of segment starts */
+ HashValueFunc hash; /* hash function */
+ HashCompareFunc match; /* key comparison function */
+ HashCopyFunc keycopy; /* key copying function */
+ HashAllocFunc alloc; /* memory allocator */
+ MemoryContext hcxt; /* memory context if default allocator used */
+ char *tabname; /* table name (for error messages) */
+ bool isshared; /* true if table is in shared memory */
+ bool isfixed; /* if true, don't enlarge */
+
+ /* freezing a shared table isn't allowed, so we can keep state here */
+ bool frozen; /* true = no more inserts allowed */
+
+ /* We keep local copies of these fixed values to reduce contention */
+ Size keysize; /* hash key length in bytes */
+ long ssize; /* segment size --- must be power of 2 */
+ int sshift; /* segment shift = log2(ssize) */
+};
+
+/*
+ * Key (also entry) part of a HASHELEMENT
+ */
+#define ELEMENTKEY(helem) (((char *)(helem)) + MAXALIGN(sizeof(HASHELEMENT)))
+
+/*
+ * Obtain element pointer given pointer to key
+ */
+#define ELEMENT_FROM_KEY(key) \
+ ((HASHELEMENT *) (((char *) (key)) - MAXALIGN(sizeof(HASHELEMENT))))
+
+/*
+ * Fast MOD arithmetic, assuming that y is a power of 2 !
+ */
+#define MOD(x,y) ((x) & ((y)-1))
+
+#ifdef HASH_STATISTICS
+static long hash_accesses,
+ hash_collisions,
+ hash_expansions;
+#endif
+
+/*
+ * Private function prototypes
+ */
+static void *DynaHashAlloc(Size size);
+static HASHSEGMENT seg_alloc(HTAB *hashp);
+static bool element_alloc(HTAB *hashp, int nelem, int freelist_idx);
+static bool dir_realloc(HTAB *hashp);
+static bool expand_table(HTAB *hashp);
+static HASHBUCKET get_hash_entry(HTAB *hashp, int freelist_idx);
+static void hdefault(HTAB *hashp);
+static int choose_nelem_alloc(Size entrysize);
+static bool init_htab(HTAB *hashp, long nelem);
+static void hash_corrupted(HTAB *hashp);
+static long next_pow2_long(long num);
+static int next_pow2_int(long num);
+static void register_seq_scan(HTAB *hashp);
+static void deregister_seq_scan(HTAB *hashp);
+static bool has_seq_scans(HTAB *hashp);
+
+
+/*
+ * memory allocation support
+ */
+static MemoryContext CurrentDynaHashCxt = NULL;
+
+static void *
+DynaHashAlloc(Size size)
+{
+ Assert(MemoryContextIsValid(CurrentDynaHashCxt));
+ return MemoryContextAlloc(CurrentDynaHashCxt, size);
+}
+
+
+/*
+ * HashCompareFunc for string keys
+ *
+ * Because we copy keys with strlcpy(), they will be truncated at keysize-1
+ * bytes, so we can only compare that many ... hence strncmp is almost but
+ * not quite the right thing.
+ */
+static int
+string_compare(const char *key1, const char *key2, Size keysize)
+{
+ return strncmp(key1, key2, keysize - 1);
+}
+
+
+/************************** CREATE ROUTINES **********************/
+
+/*
+ * hash_create -- create a new dynamic hash table
+ *
+ * tabname: a name for the table (for debugging purposes)
+ * nelem: maximum number of elements expected
+ * *info: additional table parameters, as indicated by flags
+ * flags: bitmask indicating which parameters to take from *info
+ *
+ * The flags value *must* include HASH_ELEM. (Formerly, this was nominally
+ * optional, but the default keysize and entrysize values were useless.)
+ * The flags value must also include exactly one of HASH_STRINGS, HASH_BLOBS,
+ * or HASH_FUNCTION, to define the key hashing semantics (C strings,
+ * binary blobs, or custom, respectively). Callers specifying a custom
+ * hash function will likely also want to use HASH_COMPARE, and perhaps
+ * also HASH_KEYCOPY, to control key comparison and copying.
+ * Another often-used flag is HASH_CONTEXT, to allocate the hash table
+ * under info->hcxt rather than under TopMemoryContext; the default
+ * behavior is only suitable for session-lifespan hash tables.
+ * Other flags bits are special-purpose and seldom used, except for those
+ * associated with shared-memory hash tables, for which see ShmemInitHash().
+ *
+ * Fields in *info are read only when the associated flags bit is set.
+ * It is not necessary to initialize other fields of *info.
+ * Neither tabname nor *info need persist after the hash_create() call.
+ *
+ * Note: It is deprecated for callers of hash_create() to explicitly specify
+ * string_hash, tag_hash, uint32_hash, or oid_hash. Just set HASH_STRINGS or
+ * HASH_BLOBS. Use HASH_FUNCTION only when you want something other than
+ * one of these.
+ *
+ * Note: for a shared-memory hashtable, nelem needs to be a pretty good
+ * estimate, since we can't expand the table on the fly. But an unshared
+ * hashtable can be expanded on-the-fly, so it's better for nelem to be
+ * on the small side and let the table grow if it's exceeded. An overly
+ * large nelem will penalize hash_seq_search speed without buying much.
+ */
+HTAB *
+hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
+{
+ HTAB *hashp;
+ HASHHDR *hctl;
+
+ /*
+ * Hash tables now allocate space for key and data, but you have to say
+ * how much space to allocate.
+ */
+ Assert(flags & HASH_ELEM);
+ Assert(info->keysize > 0);
+ Assert(info->entrysize >= info->keysize);
+
+ /*
+ * For shared hash tables, we have a local hash header (HTAB struct) that
+ * we allocate in TopMemoryContext; all else is in shared memory.
+ *
+ * For non-shared hash tables, everything including the hash header is in
+ * a memory context created specially for the hash table --- this makes
+ * hash_destroy very simple. The memory context is made a child of either
+ * a context specified by the caller, or TopMemoryContext if nothing is
+ * specified.
+ */
+ if (flags & HASH_SHARED_MEM)
+ {
+ /* Set up to allocate the hash header */
+ CurrentDynaHashCxt = TopMemoryContext;
+ }
+ else
+ {
+ /* Create the hash table's private memory context */
+ if (flags & HASH_CONTEXT)
+ CurrentDynaHashCxt = info->hcxt;
+ else
+ CurrentDynaHashCxt = TopMemoryContext;
+ CurrentDynaHashCxt = AllocSetContextCreate(CurrentDynaHashCxt,
+ "dynahash",
+ ALLOCSET_DEFAULT_SIZES);
+ }
+
+ /* Initialize the hash header, plus a copy of the table name */
+ hashp = (HTAB *) DynaHashAlloc(sizeof(HTAB) + strlen(tabname) + 1);
+ MemSet(hashp, 0, sizeof(HTAB));
+
+ hashp->tabname = (char *) (hashp + 1);
+ strcpy(hashp->tabname, tabname);
+
+ /* If we have a private context, label it with hashtable's name */
+ if (!(flags & HASH_SHARED_MEM))
+ MemoryContextSetIdentifier(CurrentDynaHashCxt, hashp->tabname);
+
+ /*
+ * Select the appropriate hash function (see comments at head of file).
+ */
+ if (flags & HASH_FUNCTION)
+ {
+ Assert(!(flags & (HASH_BLOBS | HASH_STRINGS)));
+ hashp->hash = info->hash;
+ }
+ else if (flags & HASH_BLOBS)
+ {
+ Assert(!(flags & HASH_STRINGS));
+ /* We can optimize hashing for common key sizes */
+ if (info->keysize == sizeof(uint32))
+ hashp->hash = uint32_hash;
+ else
+ hashp->hash = tag_hash;
+ }
+ else
+ {
+ /*
+ * string_hash used to be considered the default hash method, and in a
+ * non-assert build it effectively still is. But we now consider it
+ * an assertion error to not say HASH_STRINGS explicitly. To help
+ * catch mistaken usage of HASH_STRINGS, we also insist on a
+ * reasonably long string length: if the keysize is only 4 or 8 bytes,
+ * it's almost certainly an integer or pointer not a string.
+ */
+ Assert(flags & HASH_STRINGS);
+ Assert(info->keysize > 8);
+
+ hashp->hash = string_hash;
+ }
+
+ /*
+ * If you don't specify a match function, it defaults to string_compare if
+ * you used string_hash, and to memcmp otherwise.
+ *
+ * Note: explicitly specifying string_hash is deprecated, because this
+ * might not work for callers in loadable modules on some platforms due to
+ * referencing a trampoline instead of the string_hash function proper.
+ * Specify HASH_STRINGS instead.
+ */
+ if (flags & HASH_COMPARE)
+ hashp->match = info->match;
+ else if (hashp->hash == string_hash)
+ hashp->match = (HashCompareFunc) string_compare;
+ else
+ hashp->match = memcmp;
+
+ /*
+ * Similarly, the key-copying function defaults to strlcpy or memcpy.
+ */
+ if (flags & HASH_KEYCOPY)
+ hashp->keycopy = info->keycopy;
+ else if (hashp->hash == string_hash)
+ {
+ /*
+ * The signature of keycopy is meant for memcpy(), which returns
+ * void*, but strlcpy() returns size_t. Since we never use the return
+ * value of keycopy, and size_t is pretty much always the same size as
+ * void *, this should be safe. The extra cast in the middle is to
+ * avoid warnings from -Wcast-function-type.
+ */
+ hashp->keycopy = (HashCopyFunc) (pg_funcptr_t) strlcpy;
+ }
+ else
+ hashp->keycopy = memcpy;
+
+ /* And select the entry allocation function, too. */
+ if (flags & HASH_ALLOC)
+ hashp->alloc = info->alloc;
+ else
+ hashp->alloc = DynaHashAlloc;
+
+ if (flags & HASH_SHARED_MEM)
+ {
+ /*
+ * ctl structure and directory are preallocated for shared memory
+ * tables. Note that HASH_DIRSIZE and HASH_ALLOC had better be set as
+ * well.
+ */
+ hashp->hctl = info->hctl;
+ hashp->dir = (HASHSEGMENT *) (((char *) info->hctl) + sizeof(HASHHDR));
+ hashp->hcxt = NULL;
+ hashp->isshared = true;
+
+ /* hash table already exists, we're just attaching to it */
+ if (flags & HASH_ATTACH)
+ {
+ /* make local copies of some heavily-used values */
+ hctl = hashp->hctl;
+ hashp->keysize = hctl->keysize;
+ hashp->ssize = hctl->ssize;
+ hashp->sshift = hctl->sshift;
+
+ return hashp;
+ }
+ }
+ else
+ {
+ /* setup hash table defaults */
+ hashp->hctl = NULL;
+ hashp->dir = NULL;
+ hashp->hcxt = CurrentDynaHashCxt;
+ hashp->isshared = false;
+ }
+
+ if (!hashp->hctl)
+ {
+ hashp->hctl = (HASHHDR *) hashp->alloc(sizeof(HASHHDR));
+ if (!hashp->hctl)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ }
+
+ hashp->frozen = false;
+
+ hdefault(hashp);
+
+ hctl = hashp->hctl;
+
+ if (flags & HASH_PARTITION)
+ {
+ /* Doesn't make sense to partition a local hash table */
+ Assert(flags & HASH_SHARED_MEM);
+
+ /*
+ * The number of partitions had better be a power of 2. Also, it must
+ * be less than INT_MAX (see init_htab()), so call the int version of
+ * next_pow2.
+ */
+ Assert(info->num_partitions == next_pow2_int(info->num_partitions));
+
+ hctl->num_partitions = info->num_partitions;
+ }
+
+ if (flags & HASH_SEGMENT)
+ {
+ hctl->ssize = info->ssize;
+ hctl->sshift = my_log2(info->ssize);
+ /* ssize had better be a power of 2 */
+ Assert(hctl->ssize == (1L << hctl->sshift));
+ }
+
+ /*
+ * SHM hash tables have fixed directory size passed by the caller.
+ */
+ if (flags & HASH_DIRSIZE)
+ {
+ hctl->max_dsize = info->max_dsize;
+ hctl->dsize = info->dsize;
+ }
+
+ /* remember the entry sizes, too */
+ hctl->keysize = info->keysize;
+ hctl->entrysize = info->entrysize;
+
+ /* make local copies of heavily-used constant fields */
+ hashp->keysize = hctl->keysize;
+ hashp->ssize = hctl->ssize;
+ hashp->sshift = hctl->sshift;
+
+ /* Build the hash directory structure */
+ if (!init_htab(hashp, nelem))
+ elog(ERROR, "failed to initialize hash table \"%s\"", hashp->tabname);
+
+ /*
+ * For a shared hash table, preallocate the requested number of elements.
+ * This reduces problems with run-time out-of-shared-memory conditions.
+ *
+ * For a non-shared hash table, preallocate the requested number of
+ * elements if it's less than our chosen nelem_alloc. This avoids wasting
+ * space if the caller correctly estimates a small table size.
+ */
+ if ((flags & HASH_SHARED_MEM) ||
+ nelem < hctl->nelem_alloc)
+ {
+ int i,
+ freelist_partitions,
+ nelem_alloc,
+ nelem_alloc_first;
+
+ /*
+ * If hash table is partitioned, give each freelist an equal share of
+ * the initial allocation. Otherwise only freeList[0] is used.
+ */
+ if (IS_PARTITIONED(hashp->hctl))
+ freelist_partitions = NUM_FREELISTS;
+ else
+ freelist_partitions = 1;
+
+ nelem_alloc = nelem / freelist_partitions;
+ if (nelem_alloc <= 0)
+ nelem_alloc = 1;
+
+ /*
+ * Make sure we'll allocate all the requested elements; freeList[0]
+ * gets the excess if the request isn't divisible by NUM_FREELISTS.
+ */
+ if (nelem_alloc * freelist_partitions < nelem)
+ nelem_alloc_first =
+ nelem - nelem_alloc * (freelist_partitions - 1);
+ else
+ nelem_alloc_first = nelem_alloc;
+
+ for (i = 0; i < freelist_partitions; i++)
+ {
+ int temp = (i == 0) ? nelem_alloc_first : nelem_alloc;
+
+ if (!element_alloc(hashp, temp, i))
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ }
+ }
+
+ if (flags & HASH_FIXED_SIZE)
+ hashp->isfixed = true;
+ return hashp;
+}
+
+/*
+ * Set default HASHHDR parameters.
+ */
+static void
+hdefault(HTAB *hashp)
+{
+ HASHHDR *hctl = hashp->hctl;
+
+ MemSet(hctl, 0, sizeof(HASHHDR));
+
+ hctl->dsize = DEF_DIRSIZE;
+ hctl->nsegs = 0;
+
+ hctl->num_partitions = 0; /* not partitioned */
+
+ /* table has no fixed maximum size */
+ hctl->max_dsize = NO_MAX_DSIZE;
+
+ hctl->ssize = DEF_SEGSIZE;
+ hctl->sshift = DEF_SEGSIZE_SHIFT;
+
+#ifdef HASH_STATISTICS
+ hctl->accesses = hctl->collisions = 0;
+#endif
+}
+
+/*
+ * Given the user-specified entry size, choose nelem_alloc, ie, how many
+ * elements to add to the hash table when we need more.
+ */
+static int
+choose_nelem_alloc(Size entrysize)
+{
+ int nelem_alloc;
+ Size elementSize;
+ Size allocSize;
+
+ /* Each element has a HASHELEMENT header plus user data. */
+ /* NB: this had better match element_alloc() */
+ elementSize = MAXALIGN(sizeof(HASHELEMENT)) + MAXALIGN(entrysize);
+
+ /*
+ * The idea here is to choose nelem_alloc at least 32, but round up so
+ * that the allocation request will be a power of 2 or just less. This
+ * makes little difference for hash tables in shared memory, but for hash
+ * tables managed by palloc, the allocation request will be rounded up to
+ * a power of 2 anyway. If we fail to take this into account, we'll waste
+ * as much as half the allocated space.
+ */
+ allocSize = 32 * 4; /* assume elementSize at least 8 */
+ do
+ {
+ allocSize <<= 1;
+ nelem_alloc = allocSize / elementSize;
+ } while (nelem_alloc < 32);
+
+ return nelem_alloc;
+}
+
+/*
+ * Compute derived fields of hctl and build the initial directory/segment
+ * arrays
+ */
+static bool
+init_htab(HTAB *hashp, long nelem)
+{
+ HASHHDR *hctl = hashp->hctl;
+ HASHSEGMENT *segp;
+ int nbuckets;
+ int nsegs;
+ int i;
+
+ /*
+ * initialize mutexes if it's a partitioned table
+ */
+ if (IS_PARTITIONED(hctl))
+ for (i = 0; i < NUM_FREELISTS; i++)
+ SpinLockInit(&(hctl->freeList[i].mutex));
+
+ /*
+ * Allocate space for the next greater power of two number of buckets,
+ * assuming a desired maximum load factor of 1.
+ */
+ nbuckets = next_pow2_int(nelem);
+
+ /*
+ * In a partitioned table, nbuckets must be at least equal to
+ * num_partitions; were it less, keys with apparently different partition
+ * numbers would map to the same bucket, breaking partition independence.
+ * (Normally nbuckets will be much bigger; this is just a safety check.)
+ */
+ while (nbuckets < hctl->num_partitions)
+ nbuckets <<= 1;
+
+ hctl->max_bucket = hctl->low_mask = nbuckets - 1;
+ hctl->high_mask = (nbuckets << 1) - 1;
+
+ /*
+ * Figure number of directory segments needed, round up to a power of 2
+ */
+ nsegs = (nbuckets - 1) / hctl->ssize + 1;
+ nsegs = next_pow2_int(nsegs);
+
+ /*
+ * Make sure directory is big enough. If pre-allocated directory is too
+ * small, choke (caller screwed up).
+ */
+ if (nsegs > hctl->dsize)
+ {
+ if (!(hashp->dir))
+ hctl->dsize = nsegs;
+ else
+ return false;
+ }
+
+ /* Allocate a directory */
+ if (!(hashp->dir))
+ {
+ CurrentDynaHashCxt = hashp->hcxt;
+ hashp->dir = (HASHSEGMENT *)
+ hashp->alloc(hctl->dsize * sizeof(HASHSEGMENT));
+ if (!hashp->dir)
+ return false;
+ }
+
+ /* Allocate initial segments */
+ for (segp = hashp->dir; hctl->nsegs < nsegs; hctl->nsegs++, segp++)
+ {
+ *segp = seg_alloc(hashp);
+ if (*segp == NULL)
+ return false;
+ }
+
+ /* Choose number of entries to allocate at a time */
+ hctl->nelem_alloc = choose_nelem_alloc(hctl->entrysize);
+
+#ifdef HASH_DEBUG
+ fprintf(stderr, "init_htab:\n%s%p\n%s%ld\n%s%ld\n%s%d\n%s%ld\n%s%u\n%s%x\n%s%x\n%s%ld\n",
+ "TABLE POINTER ", hashp,
+ "DIRECTORY SIZE ", hctl->dsize,
+ "SEGMENT SIZE ", hctl->ssize,
+ "SEGMENT SHIFT ", hctl->sshift,
+ "MAX BUCKET ", hctl->max_bucket,
+ "HIGH MASK ", hctl->high_mask,
+ "LOW MASK ", hctl->low_mask,
+ "NSEGS ", hctl->nsegs);
+#endif
+ return true;
+}
+
+/*
+ * Estimate the space needed for a hashtable containing the given number
+ * of entries of given size.
+ * NOTE: this is used to estimate the footprint of hashtables in shared
+ * memory; therefore it does not count HTAB which is in local memory.
+ * NB: assumes that all hash structure parameters have default values!
+ */
+Size
+hash_estimate_size(long num_entries, Size entrysize)
+{
+ Size size;
+ long nBuckets,
+ nSegments,
+ nDirEntries,
+ nElementAllocs,
+ elementSize,
+ elementAllocCnt;
+
+ /* estimate number of buckets wanted */
+ nBuckets = next_pow2_long(num_entries);
+ /* # of segments needed for nBuckets */
+ nSegments = next_pow2_long((nBuckets - 1) / DEF_SEGSIZE + 1);
+ /* directory entries */
+ nDirEntries = DEF_DIRSIZE;
+ while (nDirEntries < nSegments)
+ nDirEntries <<= 1; /* dir_alloc doubles dsize at each call */
+
+ /* fixed control info */
+ size = MAXALIGN(sizeof(HASHHDR)); /* but not HTAB, per above */
+ /* directory */
+ size = add_size(size, mul_size(nDirEntries, sizeof(HASHSEGMENT)));
+ /* segments */
+ size = add_size(size, mul_size(nSegments,
+ MAXALIGN(DEF_SEGSIZE * sizeof(HASHBUCKET))));
+ /* elements --- allocated in groups of choose_nelem_alloc() entries */
+ elementAllocCnt = choose_nelem_alloc(entrysize);
+ nElementAllocs = (num_entries - 1) / elementAllocCnt + 1;
+ elementSize = MAXALIGN(sizeof(HASHELEMENT)) + MAXALIGN(entrysize);
+ size = add_size(size,
+ mul_size(nElementAllocs,
+ mul_size(elementAllocCnt, elementSize)));
+
+ return size;
+}
+
+/*
+ * Select an appropriate directory size for a hashtable with the given
+ * maximum number of entries.
+ * This is only needed for hashtables in shared memory, whose directories
+ * cannot be expanded dynamically.
+ * NB: assumes that all hash structure parameters have default values!
+ *
+ * XXX this had better agree with the behavior of init_htab()...
+ */
+long
+hash_select_dirsize(long num_entries)
+{
+ long nBuckets,
+ nSegments,
+ nDirEntries;
+
+ /* estimate number of buckets wanted */
+ nBuckets = next_pow2_long(num_entries);
+ /* # of segments needed for nBuckets */
+ nSegments = next_pow2_long((nBuckets - 1) / DEF_SEGSIZE + 1);
+ /* directory entries */
+ nDirEntries = DEF_DIRSIZE;
+ while (nDirEntries < nSegments)
+ nDirEntries <<= 1; /* dir_alloc doubles dsize at each call */
+
+ return nDirEntries;
+}
+
+/*
+ * Compute the required initial memory allocation for a shared-memory
+ * hashtable with the given parameters. We need space for the HASHHDR
+ * and for the (non expansible) directory.
+ */
+Size
+hash_get_shared_size(HASHCTL *info, int flags)
+{
+ Assert(flags & HASH_DIRSIZE);
+ Assert(info->dsize == info->max_dsize);
+ return sizeof(HASHHDR) + info->dsize * sizeof(HASHSEGMENT);
+}
+
+
+/********************** DESTROY ROUTINES ************************/
+
+void
+hash_destroy(HTAB *hashp)
+{
+ if (hashp != NULL)
+ {
+ /* allocation method must be one we know how to free, too */
+ Assert(hashp->alloc == DynaHashAlloc);
+ /* so this hashtable must have its own context */
+ Assert(hashp->hcxt != NULL);
+
+ hash_stats("destroy", hashp);
+
+ /*
+ * Free everything by destroying the hash table's memory context.
+ */
+ MemoryContextDelete(hashp->hcxt);
+ }
+}
+
+void
+hash_stats(const char *where, HTAB *hashp)
+{
+#ifdef HASH_STATISTICS
+ fprintf(stderr, "%s: this HTAB -- accesses %ld collisions %ld\n",
+ where, hashp->hctl->accesses, hashp->hctl->collisions);
+
+ fprintf(stderr, "hash_stats: entries %ld keysize %ld maxp %u segmentcount %ld\n",
+ hash_get_num_entries(hashp), (long) hashp->hctl->keysize,
+ hashp->hctl->max_bucket, hashp->hctl->nsegs);
+ fprintf(stderr, "%s: total accesses %ld total collisions %ld\n",
+ where, hash_accesses, hash_collisions);
+ fprintf(stderr, "hash_stats: total expansions %ld\n",
+ hash_expansions);
+#endif
+}
+
+/*******************************SEARCH ROUTINES *****************************/
+
+
+/*
+ * get_hash_value -- exported routine to calculate a key's hash value
+ *
+ * We export this because for partitioned tables, callers need to compute
+ * the partition number (from the low-order bits of the hash value) before
+ * searching.
+ */
+uint32
+get_hash_value(HTAB *hashp, const void *keyPtr)
+{
+ return hashp->hash(keyPtr, hashp->keysize);
+}
+
+/* Convert a hash value to a bucket number */
+static inline uint32
+calc_bucket(HASHHDR *hctl, uint32 hash_val)
+{
+ uint32 bucket;
+
+ bucket = hash_val & hctl->high_mask;
+ if (bucket > hctl->max_bucket)
+ bucket = bucket & hctl->low_mask;
+
+ return bucket;
+}
+
+/*
+ * hash_search -- look up key in table and perform action
+ * hash_search_with_hash_value -- same, with key's hash value already computed
+ *
+ * action is one of:
+ * HASH_FIND: look up key in table
+ * HASH_ENTER: look up key in table, creating entry if not present
+ * HASH_ENTER_NULL: same, but return NULL if out of memory
+ * HASH_REMOVE: look up key in table, remove entry if present
+ *
+ * Return value is a pointer to the element found/entered/removed if any,
+ * or NULL if no match was found. (NB: in the case of the REMOVE action,
+ * the result is a dangling pointer that shouldn't be dereferenced!)
+ *
+ * HASH_ENTER will normally ereport a generic "out of memory" error if
+ * it is unable to create a new entry. The HASH_ENTER_NULL operation is
+ * the same except it will return NULL if out of memory. Note that
+ * HASH_ENTER_NULL cannot be used with the default palloc-based allocator,
+ * since palloc internally ereports on out-of-memory.
+ *
+ * If foundPtr isn't NULL, then *foundPtr is set true if we found an
+ * existing entry in the table, false otherwise. This is needed in the
+ * HASH_ENTER case, but is redundant with the return value otherwise.
+ *
+ * For hash_search_with_hash_value, the hashvalue parameter must have been
+ * calculated with get_hash_value().
+ */
+void *
+hash_search(HTAB *hashp,
+ const void *keyPtr,
+ HASHACTION action,
+ bool *foundPtr)
+{
+ return hash_search_with_hash_value(hashp,
+ keyPtr,
+ hashp->hash(keyPtr, hashp->keysize),
+ action,
+ foundPtr);
+}
+
+void *
+hash_search_with_hash_value(HTAB *hashp,
+ const void *keyPtr,
+ uint32 hashvalue,
+ HASHACTION action,
+ bool *foundPtr)
+{
+ HASHHDR *hctl = hashp->hctl;
+ int freelist_idx = FREELIST_IDX(hctl, hashvalue);
+ Size keysize;
+ uint32 bucket;
+ long segment_num;
+ long segment_ndx;
+ HASHSEGMENT segp;
+ HASHBUCKET currBucket;
+ HASHBUCKET *prevBucketPtr;
+ HashCompareFunc match;
+
+#ifdef HASH_STATISTICS
+ hash_accesses++;
+ hctl->accesses++;
+#endif
+
+ /*
+ * If inserting, check if it is time to split a bucket.
+ *
+ * NOTE: failure to expand table is not a fatal error, it just means we
+ * have to run at higher fill factor than we wanted. However, if we're
+ * using the palloc allocator then it will throw error anyway on
+ * out-of-memory, so we must do this before modifying the table.
+ */
+ if (action == HASH_ENTER || action == HASH_ENTER_NULL)
+ {
+ /*
+ * Can't split if running in partitioned mode, nor if frozen, nor if
+ * table is the subject of any active hash_seq_search scans.
+ */
+ if (hctl->freeList[0].nentries > (long) hctl->max_bucket &&
+ !IS_PARTITIONED(hctl) && !hashp->frozen &&
+ !has_seq_scans(hashp))
+ (void) expand_table(hashp);
+ }
+
+ /*
+ * Do the initial lookup
+ */
+ bucket = calc_bucket(hctl, hashvalue);
+
+ segment_num = bucket >> hashp->sshift;
+ segment_ndx = MOD(bucket, hashp->ssize);
+
+ segp = hashp->dir[segment_num];
+
+ if (segp == NULL)
+ hash_corrupted(hashp);
+
+ prevBucketPtr = &segp[segment_ndx];
+ currBucket = *prevBucketPtr;
+
+ /*
+ * Follow collision chain looking for matching key
+ */
+ match = hashp->match; /* save one fetch in inner loop */
+ keysize = hashp->keysize; /* ditto */
+
+ while (currBucket != NULL)
+ {
+ if (currBucket->hashvalue == hashvalue &&
+ match(ELEMENTKEY(currBucket), keyPtr, keysize) == 0)
+ break;
+ prevBucketPtr = &(currBucket->link);
+ currBucket = *prevBucketPtr;
+#ifdef HASH_STATISTICS
+ hash_collisions++;
+ hctl->collisions++;
+#endif
+ }
+
+ if (foundPtr)
+ *foundPtr = (bool) (currBucket != NULL);
+
+ /*
+ * OK, now what?
+ */
+ switch (action)
+ {
+ case HASH_FIND:
+ if (currBucket != NULL)
+ return (void *) ELEMENTKEY(currBucket);
+ return NULL;
+
+ case HASH_REMOVE:
+ if (currBucket != NULL)
+ {
+ /* if partitioned, must lock to touch nentries and freeList */
+ if (IS_PARTITIONED(hctl))
+ SpinLockAcquire(&(hctl->freeList[freelist_idx].mutex));
+
+ /* delete the record from the appropriate nentries counter. */
+ Assert(hctl->freeList[freelist_idx].nentries > 0);
+ hctl->freeList[freelist_idx].nentries--;
+
+ /* remove record from hash bucket's chain. */
+ *prevBucketPtr = currBucket->link;
+
+ /* add the record to the appropriate freelist. */
+ currBucket->link = hctl->freeList[freelist_idx].freeList;
+ hctl->freeList[freelist_idx].freeList = currBucket;
+
+ if (IS_PARTITIONED(hctl))
+ SpinLockRelease(&hctl->freeList[freelist_idx].mutex);
+
+ /*
+ * better hope the caller is synchronizing access to this
+ * element, because someone else is going to reuse it the next
+ * time something is added to the table
+ */
+ return (void *) ELEMENTKEY(currBucket);
+ }
+ return NULL;
+
+ case HASH_ENTER_NULL:
+ /* ENTER_NULL does not work with palloc-based allocator */
+ Assert(hashp->alloc != DynaHashAlloc);
+ /* FALL THRU */
+
+ case HASH_ENTER:
+ /* Return existing element if found, else create one */
+ if (currBucket != NULL)
+ return (void *) ELEMENTKEY(currBucket);
+
+ /* disallow inserts if frozen */
+ if (hashp->frozen)
+ elog(ERROR, "cannot insert into frozen hashtable \"%s\"",
+ hashp->tabname);
+
+ currBucket = get_hash_entry(hashp, freelist_idx);
+ if (currBucket == NULL)
+ {
+ /* out of memory */
+ if (action == HASH_ENTER_NULL)
+ return NULL;
+ /* report a generic message */
+ if (hashp->isshared)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of shared memory")));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ }
+
+ /* link into hashbucket chain */
+ *prevBucketPtr = currBucket;
+ currBucket->link = NULL;
+
+ /* copy key into record */
+ currBucket->hashvalue = hashvalue;
+ hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, keysize);
+
+ /*
+ * Caller is expected to fill the data field on return. DO NOT
+ * insert any code that could possibly throw error here, as doing
+ * so would leave the table entry incomplete and hence corrupt the
+ * caller's data structure.
+ */
+
+ return (void *) ELEMENTKEY(currBucket);
+ }
+
+ elog(ERROR, "unrecognized hash action code: %d", (int) action);
+
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * hash_update_hash_key -- change the hash key of an existing table entry
+ *
+ * This is equivalent to removing the entry, making a new entry, and copying
+ * over its data, except that the entry never goes to the table's freelist.
+ * Therefore this cannot suffer an out-of-memory failure, even if there are
+ * other processes operating in other partitions of the hashtable.
+ *
+ * Returns true if successful, false if the requested new hash key is already
+ * present. Throws error if the specified entry pointer isn't actually a
+ * table member.
+ *
+ * NB: currently, there is no special case for old and new hash keys being
+ * identical, which means we'll report false for that situation. This is
+ * preferable for existing uses.
+ *
+ * NB: for a partitioned hashtable, caller must hold lock on both relevant
+ * partitions, if the new hash key would belong to a different partition.
+ */
+bool
+hash_update_hash_key(HTAB *hashp,
+ void *existingEntry,
+ const void *newKeyPtr)
+{
+ HASHELEMENT *existingElement = ELEMENT_FROM_KEY(existingEntry);
+ HASHHDR *hctl = hashp->hctl;
+ uint32 newhashvalue;
+ Size keysize;
+ uint32 bucket;
+ uint32 newbucket;
+ long segment_num;
+ long segment_ndx;
+ HASHSEGMENT segp;
+ HASHBUCKET currBucket;
+ HASHBUCKET *prevBucketPtr;
+ HASHBUCKET *oldPrevPtr;
+ HashCompareFunc match;
+
+#ifdef HASH_STATISTICS
+ hash_accesses++;
+ hctl->accesses++;
+#endif
+
+ /* disallow updates if frozen */
+ if (hashp->frozen)
+ elog(ERROR, "cannot update in frozen hashtable \"%s\"",
+ hashp->tabname);
+
+ /*
+ * Lookup the existing element using its saved hash value. We need to do
+ * this to be able to unlink it from its hash chain, but as a side benefit
+ * we can verify the validity of the passed existingEntry pointer.
+ */
+ bucket = calc_bucket(hctl, existingElement->hashvalue);
+
+ segment_num = bucket >> hashp->sshift;
+ segment_ndx = MOD(bucket, hashp->ssize);
+
+ segp = hashp->dir[segment_num];
+
+ if (segp == NULL)
+ hash_corrupted(hashp);
+
+ prevBucketPtr = &segp[segment_ndx];
+ currBucket = *prevBucketPtr;
+
+ while (currBucket != NULL)
+ {
+ if (currBucket == existingElement)
+ break;
+ prevBucketPtr = &(currBucket->link);
+ currBucket = *prevBucketPtr;
+ }
+
+ if (currBucket == NULL)
+ elog(ERROR, "hash_update_hash_key argument is not in hashtable \"%s\"",
+ hashp->tabname);
+
+ oldPrevPtr = prevBucketPtr;
+
+ /*
+ * Now perform the equivalent of a HASH_ENTER operation to locate the hash
+ * chain we want to put the entry into.
+ */
+ newhashvalue = hashp->hash(newKeyPtr, hashp->keysize);
+
+ newbucket = calc_bucket(hctl, newhashvalue);
+
+ segment_num = newbucket >> hashp->sshift;
+ segment_ndx = MOD(newbucket, hashp->ssize);
+
+ segp = hashp->dir[segment_num];
+
+ if (segp == NULL)
+ hash_corrupted(hashp);
+
+ prevBucketPtr = &segp[segment_ndx];
+ currBucket = *prevBucketPtr;
+
+ /*
+ * Follow collision chain looking for matching key
+ */
+ match = hashp->match; /* save one fetch in inner loop */
+ keysize = hashp->keysize; /* ditto */
+
+ while (currBucket != NULL)
+ {
+ if (currBucket->hashvalue == newhashvalue &&
+ match(ELEMENTKEY(currBucket), newKeyPtr, keysize) == 0)
+ break;
+ prevBucketPtr = &(currBucket->link);
+ currBucket = *prevBucketPtr;
+#ifdef HASH_STATISTICS
+ hash_collisions++;
+ hctl->collisions++;
+#endif
+ }
+
+ if (currBucket != NULL)
+ return false; /* collision with an existing entry */
+
+ currBucket = existingElement;
+
+ /*
+ * If old and new hash values belong to the same bucket, we need not
+ * change any chain links, and indeed should not since this simplistic
+ * update will corrupt the list if currBucket is the last element. (We
+ * cannot fall out earlier, however, since we need to scan the bucket to
+ * check for duplicate keys.)
+ */
+ if (bucket != newbucket)
+ {
+ /* OK to remove record from old hash bucket's chain. */
+ *oldPrevPtr = currBucket->link;
+
+ /* link into new hashbucket chain */
+ *prevBucketPtr = currBucket;
+ currBucket->link = NULL;
+ }
+
+ /* copy new key into record */
+ currBucket->hashvalue = newhashvalue;
+ hashp->keycopy(ELEMENTKEY(currBucket), newKeyPtr, keysize);
+
+ /* rest of record is untouched */
+
+ return true;
+}
+
+/*
+ * Allocate a new hashtable entry if possible; return NULL if out of memory.
+ * (Or, if the underlying space allocator throws error for out-of-memory,
+ * we won't return at all.)
+ */
+static HASHBUCKET
+get_hash_entry(HTAB *hashp, int freelist_idx)
+{
+ HASHHDR *hctl = hashp->hctl;
+ HASHBUCKET newElement;
+
+ for (;;)
+ {
+ /* if partitioned, must lock to touch nentries and freeList */
+ if (IS_PARTITIONED(hctl))
+ SpinLockAcquire(&hctl->freeList[freelist_idx].mutex);
+
+ /* try to get an entry from the freelist */
+ newElement = hctl->freeList[freelist_idx].freeList;
+
+ if (newElement != NULL)
+ break;
+
+ if (IS_PARTITIONED(hctl))
+ SpinLockRelease(&hctl->freeList[freelist_idx].mutex);
+
+ /*
+ * No free elements in this freelist. In a partitioned table, there
+ * might be entries in other freelists, but to reduce contention we
+ * prefer to first try to get another chunk of buckets from the main
+ * shmem allocator. If that fails, though, we *MUST* root through all
+ * the other freelists before giving up. There are multiple callers
+ * that assume that they can allocate every element in the initially
+ * requested table size, or that deleting an element guarantees they
+ * can insert a new element, even if shared memory is entirely full.
+ * Failing because the needed element is in a different freelist is
+ * not acceptable.
+ */
+ if (!element_alloc(hashp, hctl->nelem_alloc, freelist_idx))
+ {
+ int borrow_from_idx;
+
+ if (!IS_PARTITIONED(hctl))
+ return NULL; /* out of memory */
+
+ /* try to borrow element from another freelist */
+ borrow_from_idx = freelist_idx;
+ for (;;)
+ {
+ borrow_from_idx = (borrow_from_idx + 1) % NUM_FREELISTS;
+ if (borrow_from_idx == freelist_idx)
+ break; /* examined all freelists, fail */
+
+ SpinLockAcquire(&(hctl->freeList[borrow_from_idx].mutex));
+ newElement = hctl->freeList[borrow_from_idx].freeList;
+
+ if (newElement != NULL)
+ {
+ hctl->freeList[borrow_from_idx].freeList = newElement->link;
+ SpinLockRelease(&(hctl->freeList[borrow_from_idx].mutex));
+
+ /* careful: count the new element in its proper freelist */
+ SpinLockAcquire(&hctl->freeList[freelist_idx].mutex);
+ hctl->freeList[freelist_idx].nentries++;
+ SpinLockRelease(&hctl->freeList[freelist_idx].mutex);
+
+ return newElement;
+ }
+
+ SpinLockRelease(&(hctl->freeList[borrow_from_idx].mutex));
+ }
+
+ /* no elements available to borrow either, so out of memory */
+ return NULL;
+ }
+ }
+
+ /* remove entry from freelist, bump nentries */
+ hctl->freeList[freelist_idx].freeList = newElement->link;
+ hctl->freeList[freelist_idx].nentries++;
+
+ if (IS_PARTITIONED(hctl))
+ SpinLockRelease(&hctl->freeList[freelist_idx].mutex);
+
+ return newElement;
+}
+
+/*
+ * hash_get_num_entries -- get the number of entries in a hashtable
+ */
+long
+hash_get_num_entries(HTAB *hashp)
+{
+ int i;
+ long sum = hashp->hctl->freeList[0].nentries;
+
+ /*
+ * We currently don't bother with acquiring the mutexes; it's only
+ * sensible to call this function if you've got lock on all partitions of
+ * the table.
+ */
+ if (IS_PARTITIONED(hashp->hctl))
+ {
+ for (i = 1; i < NUM_FREELISTS; i++)
+ sum += hashp->hctl->freeList[i].nentries;
+ }
+
+ return sum;
+}
+
+/*
+ * hash_seq_init/_search/_term
+ * Sequentially search through hash table and return
+ * all the elements one by one, return NULL when no more.
+ *
+ * hash_seq_term should be called if and only if the scan is abandoned before
+ * completion; if hash_seq_search returns NULL then it has already done the
+ * end-of-scan cleanup.
+ *
+ * NOTE: caller may delete the returned element before continuing the scan.
+ * However, deleting any other element while the scan is in progress is
+ * UNDEFINED (it might be the one that curIndex is pointing at!). Also,
+ * if elements are added to the table while the scan is in progress, it is
+ * unspecified whether they will be visited by the scan or not.
+ *
+ * NOTE: it is possible to use hash_seq_init/hash_seq_search without any
+ * worry about hash_seq_term cleanup, if the hashtable is first locked against
+ * further insertions by calling hash_freeze.
+ *
+ * NOTE: to use this with a partitioned hashtable, caller had better hold
+ * at least shared lock on all partitions of the table throughout the scan!
+ * We can cope with insertions or deletions by our own backend, but *not*
+ * with concurrent insertions or deletions by another.
+ */
+void
+hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
+{
+ status->hashp = hashp;
+ status->curBucket = 0;
+ status->curEntry = NULL;
+ if (!hashp->frozen)
+ register_seq_scan(hashp);
+}
+
+void *
+hash_seq_search(HASH_SEQ_STATUS *status)
+{
+ HTAB *hashp;
+ HASHHDR *hctl;
+ uint32 max_bucket;
+ long ssize;
+ long segment_num;
+ long segment_ndx;
+ HASHSEGMENT segp;
+ uint32 curBucket;
+ HASHELEMENT *curElem;
+
+ if ((curElem = status->curEntry) != NULL)
+ {
+ /* Continuing scan of curBucket... */
+ status->curEntry = curElem->link;
+ if (status->curEntry == NULL) /* end of this bucket */
+ ++status->curBucket;
+ return (void *) ELEMENTKEY(curElem);
+ }
+
+ /*
+ * Search for next nonempty bucket starting at curBucket.
+ */
+ curBucket = status->curBucket;
+ hashp = status->hashp;
+ hctl = hashp->hctl;
+ ssize = hashp->ssize;
+ max_bucket = hctl->max_bucket;
+
+ if (curBucket > max_bucket)
+ {
+ hash_seq_term(status);
+ return NULL; /* search is done */
+ }
+
+ /*
+ * first find the right segment in the table directory.
+ */
+ segment_num = curBucket >> hashp->sshift;
+ segment_ndx = MOD(curBucket, ssize);
+
+ segp = hashp->dir[segment_num];
+
+ /*
+ * Pick up the first item in this bucket's chain. If chain is not empty
+ * we can begin searching it. Otherwise we have to advance to find the
+ * next nonempty bucket. We try to optimize that case since searching a
+ * near-empty hashtable has to iterate this loop a lot.
+ */
+ while ((curElem = segp[segment_ndx]) == NULL)
+ {
+ /* empty bucket, advance to next */
+ if (++curBucket > max_bucket)
+ {
+ status->curBucket = curBucket;
+ hash_seq_term(status);
+ return NULL; /* search is done */
+ }
+ if (++segment_ndx >= ssize)
+ {
+ segment_num++;
+ segment_ndx = 0;
+ segp = hashp->dir[segment_num];
+ }
+ }
+
+ /* Begin scan of curBucket... */
+ status->curEntry = curElem->link;
+ if (status->curEntry == NULL) /* end of this bucket */
+ ++curBucket;
+ status->curBucket = curBucket;
+ return (void *) ELEMENTKEY(curElem);
+}
+
+void
+hash_seq_term(HASH_SEQ_STATUS *status)
+{
+ if (!status->hashp->frozen)
+ deregister_seq_scan(status->hashp);
+}
+
+/*
+ * hash_freeze
+ * Freeze a hashtable against future insertions (deletions are
+ * still allowed)
+ *
+ * The reason for doing this is that by preventing any more bucket splits,
+ * we no longer need to worry about registering hash_seq_search scans,
+ * and thus caller need not be careful about ensuring hash_seq_term gets
+ * called at the right times.
+ *
+ * Multiple calls to hash_freeze() are allowed, but you can't freeze a table
+ * with active scans (since hash_seq_term would then do the wrong thing).
+ */
+void
+hash_freeze(HTAB *hashp)
+{
+ if (hashp->isshared)
+ elog(ERROR, "cannot freeze shared hashtable \"%s\"", hashp->tabname);
+ if (!hashp->frozen && has_seq_scans(hashp))
+ elog(ERROR, "cannot freeze hashtable \"%s\" because it has active scans",
+ hashp->tabname);
+ hashp->frozen = true;
+}
+
+
+/********************************* UTILITIES ************************/
+
+/*
+ * Expand the table by adding one more hash bucket.
+ */
+static bool
+expand_table(HTAB *hashp)
+{
+ HASHHDR *hctl = hashp->hctl;
+ HASHSEGMENT old_seg,
+ new_seg;
+ long old_bucket,
+ new_bucket;
+ long new_segnum,
+ new_segndx;
+ long old_segnum,
+ old_segndx;
+ HASHBUCKET *oldlink,
+ *newlink;
+ HASHBUCKET currElement,
+ nextElement;
+
+ Assert(!IS_PARTITIONED(hctl));
+
+#ifdef HASH_STATISTICS
+ hash_expansions++;
+#endif
+
+ new_bucket = hctl->max_bucket + 1;
+ new_segnum = new_bucket >> hashp->sshift;
+ new_segndx = MOD(new_bucket, hashp->ssize);
+
+ if (new_segnum >= hctl->nsegs)
+ {
+ /* Allocate new segment if necessary -- could fail if dir full */
+ if (new_segnum >= hctl->dsize)
+ if (!dir_realloc(hashp))
+ return false;
+ if (!(hashp->dir[new_segnum] = seg_alloc(hashp)))
+ return false;
+ hctl->nsegs++;
+ }
+
+ /* OK, we created a new bucket */
+ hctl->max_bucket++;
+
+ /*
+ * *Before* changing masks, find old bucket corresponding to same hash
+ * values; values in that bucket may need to be relocated to new bucket.
+ * Note that new_bucket is certainly larger than low_mask at this point,
+ * so we can skip the first step of the regular hash mask calc.
+ */
+ old_bucket = (new_bucket & hctl->low_mask);
+
+ /*
+ * If we crossed a power of 2, readjust masks.
+ */
+ if ((uint32) new_bucket > hctl->high_mask)
+ {
+ hctl->low_mask = hctl->high_mask;
+ hctl->high_mask = (uint32) new_bucket | hctl->low_mask;
+ }
+
+ /*
+ * Relocate records to the new bucket. NOTE: because of the way the hash
+ * masking is done in calc_bucket, only one old bucket can need to be
+ * split at this point. With a different way of reducing the hash value,
+ * that might not be true!
+ */
+ old_segnum = old_bucket >> hashp->sshift;
+ old_segndx = MOD(old_bucket, hashp->ssize);
+
+ old_seg = hashp->dir[old_segnum];
+ new_seg = hashp->dir[new_segnum];
+
+ oldlink = &old_seg[old_segndx];
+ newlink = &new_seg[new_segndx];
+
+ for (currElement = *oldlink;
+ currElement != NULL;
+ currElement = nextElement)
+ {
+ nextElement = currElement->link;
+ if ((long) calc_bucket(hctl, currElement->hashvalue) == old_bucket)
+ {
+ *oldlink = currElement;
+ oldlink = &currElement->link;
+ }
+ else
+ {
+ *newlink = currElement;
+ newlink = &currElement->link;
+ }
+ }
+ /* don't forget to terminate the rebuilt hash chains... */
+ *oldlink = NULL;
+ *newlink = NULL;
+
+ return true;
+}
+
+
+static bool
+dir_realloc(HTAB *hashp)
+{
+ HASHSEGMENT *p;
+ HASHSEGMENT *old_p;
+ long new_dsize;
+ long old_dirsize;
+ long new_dirsize;
+
+ if (hashp->hctl->max_dsize != NO_MAX_DSIZE)
+ return false;
+
+ /* Reallocate directory */
+ new_dsize = hashp->hctl->dsize << 1;
+ old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT);
+ new_dirsize = new_dsize * sizeof(HASHSEGMENT);
+
+ old_p = hashp->dir;
+ CurrentDynaHashCxt = hashp->hcxt;
+ p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize);
+
+ if (p != NULL)
+ {
+ memcpy(p, old_p, old_dirsize);
+ MemSet(((char *) p) + old_dirsize, 0, new_dirsize - old_dirsize);
+ hashp->dir = p;
+ hashp->hctl->dsize = new_dsize;
+
+ /* XXX assume the allocator is palloc, so we know how to free */
+ Assert(hashp->alloc == DynaHashAlloc);
+ pfree(old_p);
+
+ return true;
+ }
+
+ return false;
+}
+
+
+static HASHSEGMENT
+seg_alloc(HTAB *hashp)
+{
+ HASHSEGMENT segp;
+
+ CurrentDynaHashCxt = hashp->hcxt;
+ segp = (HASHSEGMENT) hashp->alloc(sizeof(HASHBUCKET) * hashp->ssize);
+
+ if (!segp)
+ return NULL;
+
+ MemSet(segp, 0, sizeof(HASHBUCKET) * hashp->ssize);
+
+ return segp;
+}
+
+/*
+ * allocate some new elements and link them into the indicated free list
+ */
+static bool
+element_alloc(HTAB *hashp, int nelem, int freelist_idx)
+{
+ HASHHDR *hctl = hashp->hctl;
+ Size elementSize;
+ HASHELEMENT *firstElement;
+ HASHELEMENT *tmpElement;
+ HASHELEMENT *prevElement;
+ int i;
+
+ if (hashp->isfixed)
+ return false;
+
+ /* Each element has a HASHELEMENT header plus user data. */
+ elementSize = MAXALIGN(sizeof(HASHELEMENT)) + MAXALIGN(hctl->entrysize);
+
+ CurrentDynaHashCxt = hashp->hcxt;
+ firstElement = (HASHELEMENT *) hashp->alloc(nelem * elementSize);
+
+ if (!firstElement)
+ return false;
+
+ /* prepare to link all the new entries into the freelist */
+ prevElement = NULL;
+ tmpElement = firstElement;
+ for (i = 0; i < nelem; i++)
+ {
+ tmpElement->link = prevElement;
+ prevElement = tmpElement;
+ tmpElement = (HASHELEMENT *) (((char *) tmpElement) + elementSize);
+ }
+
+ /* if partitioned, must lock to touch freeList */
+ if (IS_PARTITIONED(hctl))
+ SpinLockAcquire(&hctl->freeList[freelist_idx].mutex);
+
+ /* freelist could be nonempty if two backends did this concurrently */
+ firstElement->link = hctl->freeList[freelist_idx].freeList;
+ hctl->freeList[freelist_idx].freeList = prevElement;
+
+ if (IS_PARTITIONED(hctl))
+ SpinLockRelease(&hctl->freeList[freelist_idx].mutex);
+
+ return true;
+}
+
+/* complain when we have detected a corrupted hashtable */
+static void
+hash_corrupted(HTAB *hashp)
+{
+ /*
+ * If the corruption is in a shared hashtable, we'd better force a
+ * systemwide restart. Otherwise, just shut down this one backend.
+ */
+ if (hashp->isshared)
+ elog(PANIC, "hash table \"%s\" corrupted", hashp->tabname);
+ else
+ elog(FATAL, "hash table \"%s\" corrupted", hashp->tabname);
+}
+
+/* calculate ceil(log base 2) of num */
+int
+my_log2(long num)
+{
+ /*
+ * guard against too-large input, which would be invalid for
+ * pg_ceil_log2_*()
+ */
+ if (num > LONG_MAX / 2)
+ num = LONG_MAX / 2;
+
+#if SIZEOF_LONG < 8
+ return pg_ceil_log2_32(num);
+#else
+ return pg_ceil_log2_64(num);
+#endif
+}
+
+/* calculate first power of 2 >= num, bounded to what will fit in a long */
+static long
+next_pow2_long(long num)
+{
+ /* my_log2's internal range check is sufficient */
+ return 1L << my_log2(num);
+}
+
+/* calculate first power of 2 >= num, bounded to what will fit in an int */
+static int
+next_pow2_int(long num)
+{
+ if (num > INT_MAX / 2)
+ num = INT_MAX / 2;
+ return 1 << my_log2(num);
+}
+
+
+/************************* SEQ SCAN TRACKING ************************/
+
+/*
+ * We track active hash_seq_search scans here. The need for this mechanism
+ * comes from the fact that a scan will get confused if a bucket split occurs
+ * while it's in progress: it might visit entries twice, or even miss some
+ * entirely (if it's partway through the same bucket that splits). Hence
+ * we want to inhibit bucket splits if there are any active scans on the
+ * table being inserted into. This is a fairly rare case in current usage,
+ * so just postponing the split until the next insertion seems sufficient.
+ *
+ * Given present usages of the function, only a few scans are likely to be
+ * open concurrently; so a finite-size stack of open scans seems sufficient,
+ * and we don't worry that linear search is too slow. Note that we do
+ * allow multiple scans of the same hashtable to be open concurrently.
+ *
+ * This mechanism can support concurrent scan and insertion in a shared
+ * hashtable if it's the same backend doing both. It would fail otherwise,
+ * but locking reasons seem to preclude any such scenario anyway, so we don't
+ * worry.
+ *
+ * This arrangement is reasonably robust if a transient hashtable is deleted
+ * without notifying us. The absolute worst case is we might inhibit splits
+ * in another table created later at exactly the same address. We will give
+ * a warning at transaction end for reference leaks, so any bugs leading to
+ * lack of notification should be easy to catch.
+ */
+
+#define MAX_SEQ_SCANS 100
+
+static HTAB *seq_scan_tables[MAX_SEQ_SCANS]; /* tables being scanned */
+static int seq_scan_level[MAX_SEQ_SCANS]; /* subtransaction nest level */
+static int num_seq_scans = 0;
+
+
+/* Register a table as having an active hash_seq_search scan */
+static void
+register_seq_scan(HTAB *hashp)
+{
+ if (num_seq_scans >= MAX_SEQ_SCANS)
+ elog(ERROR, "too many active hash_seq_search scans, cannot start one on \"%s\"",
+ hashp->tabname);
+ seq_scan_tables[num_seq_scans] = hashp;
+ seq_scan_level[num_seq_scans] = GetCurrentTransactionNestLevel();
+ num_seq_scans++;
+}
+
+/* Deregister an active scan */
+static void
+deregister_seq_scan(HTAB *hashp)
+{
+ int i;
+
+ /* Search backward since it's most likely at the stack top */
+ for (i = num_seq_scans - 1; i >= 0; i--)
+ {
+ if (seq_scan_tables[i] == hashp)
+ {
+ seq_scan_tables[i] = seq_scan_tables[num_seq_scans - 1];
+ seq_scan_level[i] = seq_scan_level[num_seq_scans - 1];
+ num_seq_scans--;
+ return;
+ }
+ }
+ elog(ERROR, "no hash_seq_search scan for hash table \"%s\"",
+ hashp->tabname);
+}
+
+/* Check if a table has any active scan */
+static bool
+has_seq_scans(HTAB *hashp)
+{
+ int i;
+
+ for (i = 0; i < num_seq_scans; i++)
+ {
+ if (seq_scan_tables[i] == hashp)
+ return true;
+ }
+ return false;
+}
+
+/* Clean up any open scans at end of transaction */
+void
+AtEOXact_HashTables(bool isCommit)
+{
+ /*
+ * During abort cleanup, open scans are expected; just silently clean 'em
+ * out. An open scan at commit means someone forgot a hash_seq_term()
+ * call, so complain.
+ *
+ * Note: it's tempting to try to print the tabname here, but refrain for
+ * fear of touching deallocated memory. This isn't a user-facing message
+ * anyway, so it needn't be pretty.
+ */
+ if (isCommit)
+ {
+ int i;
+
+ for (i = 0; i < num_seq_scans; i++)
+ {
+ elog(WARNING, "leaked hash_seq_search scan for hash table %p",
+ seq_scan_tables[i]);
+ }
+ }
+ num_seq_scans = 0;
+}
+
+/* Clean up any open scans at end of subtransaction */
+void
+AtEOSubXact_HashTables(bool isCommit, int nestDepth)
+{
+ int i;
+
+ /*
+ * Search backward to make cleanup easy. Note we must check all entries,
+ * not only those at the end of the array, because deletion technique
+ * doesn't keep them in order.
+ */
+ for (i = num_seq_scans - 1; i >= 0; i--)
+ {
+ if (seq_scan_level[i] >= nestDepth)
+ {
+ if (isCommit)
+ elog(WARNING, "leaked hash_seq_search scan for hash table %p",
+ seq_scan_tables[i]);
+ seq_scan_tables[i] = seq_scan_tables[num_seq_scans - 1];
+ seq_scan_level[i] = seq_scan_level[num_seq_scans - 1];
+ num_seq_scans--;
+ }
+ }
+}
diff --git a/src/backend/utils/hash/pg_crc.c b/src/backend/utils/hash/pg_crc.c
new file mode 100644
index 0000000..ed7a7c3
--- /dev/null
+++ b/src/backend/utils/hash/pg_crc.c
@@ -0,0 +1,97 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_crc.c
+ * PostgreSQL CRC support
+ *
+ * See Ross Williams' excellent introduction
+ * A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS, available from
+ * http://ross.net/crc/download/crc_v3.txt or several other net sites.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/hash/pg_crc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "c.h"
+
+#include "utils/pg_crc.h"
+
+/*
+ * Lookup table for calculating CRC-32 using Sarwate's algorithm.
+ *
+ * This table is based on the polynomial
+ * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+ * (This is the same polynomial used in Ethernet checksums, for instance.)
+ * Using Williams' terms, this is the "normal", not "reflected" version.
+ */
+const uint32 pg_crc32_table[256] = {
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
+ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
+ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
+ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
+ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
+ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
+ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
+ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
+ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
+ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
+ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
+ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
+ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
+ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
+ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
+ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
+ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
+ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
+ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
+ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
+ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
+ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
+ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
+ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
+ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
+ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
+ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
+ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
+ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
+ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
+ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
+ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
+ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
+ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
+ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
+ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
+ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
+ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
+ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
+ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
+ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
+ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
+ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+};
diff --git a/src/backend/utils/init/Makefile b/src/backend/utils/init/Makefile
new file mode 100644
index 0000000..3625693
--- /dev/null
+++ b/src/backend/utils/init/Makefile
@@ -0,0 +1,20 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/init
+#
+# IDENTIFICATION
+# src/backend/utils/init/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/init
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ globals.o \
+ miscinit.o \
+ postinit.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
new file mode 100644
index 0000000..1a5d29a
--- /dev/null
+++ b/src/backend/utils/init/globals.c
@@ -0,0 +1,153 @@
+/*-------------------------------------------------------------------------
+ *
+ * globals.c
+ * global variable declarations
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/init/globals.c
+ *
+ * NOTES
+ * Globals used all over the place should be declared here and not
+ * in other modules.
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "common/file_perm.h"
+#include "libpq/libpq-be.h"
+#include "libpq/pqcomm.h"
+#include "miscadmin.h"
+#include "storage/backendid.h"
+
+
+ProtocolVersion FrontendProtocol;
+
+volatile sig_atomic_t InterruptPending = false;
+volatile sig_atomic_t QueryCancelPending = false;
+volatile sig_atomic_t ProcDiePending = false;
+volatile sig_atomic_t CheckClientConnectionPending = false;
+volatile sig_atomic_t ClientConnectionLost = false;
+volatile sig_atomic_t IdleInTransactionSessionTimeoutPending = false;
+volatile sig_atomic_t IdleSessionTimeoutPending = false;
+volatile sig_atomic_t ProcSignalBarrierPending = false;
+volatile sig_atomic_t LogMemoryContextPending = false;
+volatile sig_atomic_t IdleStatsUpdateTimeoutPending = false;
+volatile uint32 InterruptHoldoffCount = 0;
+volatile uint32 QueryCancelHoldoffCount = 0;
+volatile uint32 CritSectionCount = 0;
+
+int MyProcPid;
+pg_time_t MyStartTime;
+TimestampTz MyStartTimestamp;
+struct Port *MyProcPort;
+int32 MyCancelKey;
+int MyPMChildSlot;
+
+/*
+ * MyLatch points to the latch that should be used for signal handling by the
+ * current process. It will either point to a process local latch if the
+ * current process does not have a PGPROC entry in that moment, or to
+ * PGPROC->procLatch if it has. Thus it can always be used in signal handlers,
+ * without checking for its existence.
+ */
+struct Latch *MyLatch;
+
+/*
+ * DataDir is the absolute path to the top level of the PGDATA directory tree.
+ * Except during early startup, this is also the server's working directory;
+ * most code therefore can simply use relative paths and not reference DataDir
+ * explicitly.
+ */
+char *DataDir = NULL;
+
+/*
+ * Mode of the data directory. The default is 0700 but it may be changed in
+ * checkDataDir() to 0750 if the data directory actually has that mode.
+ */
+int data_directory_mode = PG_DIR_MODE_OWNER;
+
+char OutputFileName[MAXPGPATH]; /* debugging output file */
+
+char my_exec_path[MAXPGPATH]; /* full path to my executable */
+char pkglib_path[MAXPGPATH]; /* full path to lib directory */
+
+#ifdef EXEC_BACKEND
+char postgres_exec_path[MAXPGPATH]; /* full path to backend */
+
+/* note: currently this is not valid in backend processes */
+#endif
+
+BackendId MyBackendId = InvalidBackendId;
+
+BackendId ParallelLeaderBackendId = InvalidBackendId;
+
+Oid MyDatabaseId = InvalidOid;
+
+Oid MyDatabaseTableSpace = InvalidOid;
+
+/*
+ * DatabasePath is the path (relative to DataDir) of my database's
+ * primary directory, ie, its directory in the default tablespace.
+ */
+char *DatabasePath = NULL;
+
+pid_t PostmasterPid = 0;
+
+/*
+ * IsPostmasterEnvironment is true in a postmaster process and any postmaster
+ * child process; it is false in a standalone process (bootstrap or
+ * standalone backend). IsUnderPostmaster is true in postmaster child
+ * processes. Note that "child process" includes all children, not only
+ * regular backends. These should be set correctly as early as possible
+ * in the execution of a process, so that error handling will do the right
+ * things if an error should occur during process initialization.
+ *
+ * These are initialized for the bootstrap/standalone case.
+ */
+bool IsPostmasterEnvironment = false;
+bool IsUnderPostmaster = false;
+bool IsBinaryUpgrade = false;
+bool IsBackgroundWorker = false;
+
+bool ExitOnAnyError = false;
+
+int DateStyle = USE_ISO_DATES;
+int DateOrder = DATEORDER_MDY;
+int IntervalStyle = INTSTYLE_POSTGRES;
+
+bool enableFsync = true;
+bool allowSystemTableMods = false;
+int work_mem = 4096;
+double hash_mem_multiplier = 2.0;
+int maintenance_work_mem = 65536;
+int max_parallel_maintenance_workers = 2;
+
+/*
+ * Primary determinants of sizes of shared-memory structures.
+ *
+ * MaxBackends is computed by PostmasterMain after modules have had a chance to
+ * register background workers.
+ */
+int NBuffers = 1000;
+int MaxConnections = 90;
+int max_worker_processes = 8;
+int max_parallel_workers = 8;
+int MaxBackends = 0;
+
+int VacuumCostPageHit = 1; /* GUC parameters for vacuum */
+int VacuumCostPageMiss = 2;
+int VacuumCostPageDirty = 20;
+int VacuumCostLimit = 200;
+double VacuumCostDelay = 0;
+
+int64 VacuumPageHit = 0;
+int64 VacuumPageMiss = 0;
+int64 VacuumPageDirty = 0;
+
+int VacuumCostBalance = 0; /* working state for vacuum */
+bool VacuumCostActive = false;
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
new file mode 100644
index 0000000..79373f2
--- /dev/null
+++ b/src/backend/utils/init/miscinit.c
@@ -0,0 +1,1740 @@
+/*-------------------------------------------------------------------------
+ *
+ * miscinit.c
+ * miscellaneous initialization support stuff
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/init/miscinit.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/param.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <grp.h>
+#include <pwd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <utime.h>
+
+#include "access/htup_details.h"
+#include "catalog/pg_authid.h"
+#include "common/file_perm.h"
+#include "libpq/libpq.h"
+#include "libpq/pqsignal.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "postmaster/autovacuum.h"
+#include "postmaster/interrupt.h"
+#include "postmaster/pgarch.h"
+#include "postmaster/postmaster.h"
+#include "storage/fd.h"
+#include "storage/ipc.h"
+#include "storage/latch.h"
+#include "storage/pg_shmem.h"
+#include "storage/pmsignal.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "utils/builtins.h"
+#include "utils/guc.h"
+#include "utils/inval.h"
+#include "utils/memutils.h"
+#include "utils/pidfile.h"
+#include "utils/syscache.h"
+#include "utils/varlena.h"
+
+
+#define DIRECTORY_LOCK_FILE "postmaster.pid"
+
+ProcessingMode Mode = InitProcessing;
+
+BackendType MyBackendType;
+
+/* List of lock files to be removed at proc exit */
+static List *lock_files = NIL;
+
+static Latch LocalLatchData;
+
+/* ----------------------------------------------------------------
+ * ignoring system indexes support stuff
+ *
+ * NOTE: "ignoring system indexes" means we do not use the system indexes
+ * for lookups (either in hardwired catalog accesses or in planner-generated
+ * plans). We do, however, still update the indexes when a catalog
+ * modification is made.
+ * ----------------------------------------------------------------
+ */
+
+bool IgnoreSystemIndexes = false;
+
+
+/* ----------------------------------------------------------------
+ * common process startup code
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * Initialize the basic environment for a postmaster child
+ *
+ * Should be called as early as possible after the child's startup. However,
+ * on EXEC_BACKEND builds it does need to be after read_backend_variables().
+ */
+void
+InitPostmasterChild(void)
+{
+ IsUnderPostmaster = true; /* we are a postmaster subprocess now */
+
+ /*
+ * Start our win32 signal implementation. This has to be done after we
+ * read the backend variables, because we need to pick up the signal pipe
+ * from the parent process.
+ */
+#ifdef WIN32
+ pgwin32_signal_initialize();
+#endif
+
+ /*
+ * Set reference point for stack-depth checking. This might seem
+ * redundant in !EXEC_BACKEND builds; but it's not because the postmaster
+ * launches its children from signal handlers, so we might be running on
+ * an alternative stack.
+ */
+ (void) set_stack_base();
+
+ InitProcessGlobals();
+
+ /*
+ * make sure stderr is in binary mode before anything can possibly be
+ * written to it, in case it's actually the syslogger pipe, so the pipe
+ * chunking protocol isn't disturbed. Non-logpipe data gets translated on
+ * redirection (e.g. via pg_ctl -l) anyway.
+ */
+#ifdef WIN32
+ _setmode(fileno(stderr), _O_BINARY);
+#endif
+
+ /* We don't want the postmaster's proc_exit() handlers */
+ on_exit_reset();
+
+ /* In EXEC_BACKEND case we will not have inherited BlockSig etc values */
+#ifdef EXEC_BACKEND
+ pqinitmask();
+#endif
+
+ /* Initialize process-local latch support */
+ InitializeLatchSupport();
+ MyLatch = &LocalLatchData;
+ InitLatch(MyLatch);
+ InitializeLatchWaitSet();
+
+ /*
+ * If possible, make this process a group leader, so that the postmaster
+ * can signal any child processes too. Not all processes will have
+ * children, but for consistency we make all postmaster child processes do
+ * this.
+ */
+#ifdef HAVE_SETSID
+ if (setsid() < 0)
+ elog(FATAL, "setsid() failed: %m");
+#endif
+
+ /*
+ * Every postmaster child process is expected to respond promptly to
+ * SIGQUIT at all times. Therefore we centrally remove SIGQUIT from
+ * BlockSig and install a suitable signal handler. (Client-facing
+ * processes may choose to replace this default choice of handler with
+ * quickdie().) All other blockable signals remain blocked for now.
+ */
+ pqsignal(SIGQUIT, SignalHandlerForCrashExit);
+
+ sigdelset(&BlockSig, SIGQUIT);
+ PG_SETMASK(&BlockSig);
+
+ /* Request a signal if the postmaster dies, if possible. */
+ PostmasterDeathSignalInit();
+}
+
+/*
+ * Initialize the basic environment for a standalone process.
+ *
+ * argv0 has to be suitable to find the program's executable.
+ */
+void
+InitStandaloneProcess(const char *argv0)
+{
+ Assert(!IsPostmasterEnvironment);
+
+ /*
+ * Start our win32 signal implementation
+ */
+#ifdef WIN32
+ pgwin32_signal_initialize();
+#endif
+
+ InitProcessGlobals();
+
+ /* Initialize process-local latch support */
+ InitializeLatchSupport();
+ MyLatch = &LocalLatchData;
+ InitLatch(MyLatch);
+ InitializeLatchWaitSet();
+
+ /*
+ * For consistency with InitPostmasterChild, initialize signal mask here.
+ * But we don't unblock SIGQUIT or provide a default handler for it.
+ */
+ pqinitmask();
+ PG_SETMASK(&BlockSig);
+
+ /* Compute paths, no postmaster to inherit from */
+ if (my_exec_path[0] == '\0')
+ {
+ if (find_my_exec(argv0, my_exec_path) < 0)
+ elog(FATAL, "%s: could not locate my own executable path",
+ argv0);
+ }
+
+ if (pkglib_path[0] == '\0')
+ get_pkglib_path(my_exec_path, pkglib_path);
+}
+
+void
+SwitchToSharedLatch(void)
+{
+ Assert(MyLatch == &LocalLatchData);
+ Assert(MyProc != NULL);
+
+ MyLatch = &MyProc->procLatch;
+
+ if (FeBeWaitSet)
+ ModifyWaitEvent(FeBeWaitSet, FeBeWaitSetLatchPos, WL_LATCH_SET,
+ MyLatch);
+
+ /*
+ * Set the shared latch as the local one might have been set. This
+ * shouldn't normally be necessary as code is supposed to check the
+ * condition before waiting for the latch, but a bit care can't hurt.
+ */
+ SetLatch(MyLatch);
+}
+
+void
+SwitchBackToLocalLatch(void)
+{
+ Assert(MyLatch != &LocalLatchData);
+ Assert(MyProc != NULL && MyLatch == &MyProc->procLatch);
+
+ MyLatch = &LocalLatchData;
+
+ if (FeBeWaitSet)
+ ModifyWaitEvent(FeBeWaitSet, FeBeWaitSetLatchPos, WL_LATCH_SET,
+ MyLatch);
+
+ SetLatch(MyLatch);
+}
+
+const char *
+GetBackendTypeDesc(BackendType backendType)
+{
+ const char *backendDesc = "unknown process type";
+
+ switch (backendType)
+ {
+ case B_INVALID:
+ backendDesc = "not initialized";
+ break;
+ case B_AUTOVAC_LAUNCHER:
+ backendDesc = "autovacuum launcher";
+ break;
+ case B_AUTOVAC_WORKER:
+ backendDesc = "autovacuum worker";
+ break;
+ case B_BACKEND:
+ backendDesc = "client backend";
+ break;
+ case B_BG_WORKER:
+ backendDesc = "background worker";
+ break;
+ case B_BG_WRITER:
+ backendDesc = "background writer";
+ break;
+ case B_CHECKPOINTER:
+ backendDesc = "checkpointer";
+ break;
+ case B_STARTUP:
+ backendDesc = "startup";
+ break;
+ case B_WAL_RECEIVER:
+ backendDesc = "walreceiver";
+ break;
+ case B_WAL_SENDER:
+ backendDesc = "walsender";
+ break;
+ case B_WAL_WRITER:
+ backendDesc = "walwriter";
+ break;
+ case B_ARCHIVER:
+ backendDesc = "archiver";
+ break;
+ case B_LOGGER:
+ backendDesc = "logger";
+ break;
+ }
+
+ return backendDesc;
+}
+
+/* ----------------------------------------------------------------
+ * database path / name support stuff
+ * ----------------------------------------------------------------
+ */
+
+void
+SetDatabasePath(const char *path)
+{
+ /* This should happen only once per process */
+ Assert(!DatabasePath);
+ DatabasePath = MemoryContextStrdup(TopMemoryContext, path);
+}
+
+/*
+ * Validate the proposed data directory.
+ *
+ * Also initialize file and directory create modes and mode mask.
+ */
+void
+checkDataDir(void)
+{
+ struct stat stat_buf;
+
+ Assert(DataDir);
+
+ if (stat(DataDir, &stat_buf) != 0)
+ {
+ if (errno == ENOENT)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("data directory \"%s\" does not exist",
+ DataDir)));
+ else
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not read permissions of directory \"%s\": %m",
+ DataDir)));
+ }
+
+ /* eventual chdir would fail anyway, but let's test ... */
+ if (!S_ISDIR(stat_buf.st_mode))
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("specified data directory \"%s\" is not a directory",
+ DataDir)));
+
+ /*
+ * Check that the directory belongs to my userid; if not, reject.
+ *
+ * This check is an essential part of the interlock that prevents two
+ * postmasters from starting in the same directory (see CreateLockFile()).
+ * Do not remove or weaken it.
+ *
+ * XXX can we safely enable this check on Windows?
+ */
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ if (stat_buf.st_uid != geteuid())
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("data directory \"%s\" has wrong ownership",
+ DataDir),
+ errhint("The server must be started by the user that owns the data directory.")));
+#endif
+
+ /*
+ * Check if the directory has correct permissions. If not, reject.
+ *
+ * Only two possible modes are allowed, 0700 and 0750. The latter mode
+ * indicates that group read/execute should be allowed on all newly
+ * created files and directories.
+ *
+ * XXX temporarily suppress check when on Windows, because there may not
+ * be proper support for Unix-y file permissions. Need to think of a
+ * reasonable check to apply on Windows.
+ */
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ if (stat_buf.st_mode & PG_MODE_MASK_GROUP)
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("data directory \"%s\" has invalid permissions",
+ DataDir),
+ errdetail("Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).")));
+#endif
+
+ /*
+ * Reset creation modes and mask based on the mode of the data directory.
+ *
+ * The mask was set earlier in startup to disallow group permissions on
+ * newly created files and directories. However, if group read/execute
+ * are present on the data directory then modify the create modes and mask
+ * to allow group read/execute on newly created files and directories and
+ * set the data_directory_mode GUC.
+ *
+ * Suppress when on Windows, because there may not be proper support for
+ * Unix-y file permissions.
+ */
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ SetDataDirectoryCreatePerm(stat_buf.st_mode);
+
+ umask(pg_mode_mask);
+ data_directory_mode = pg_dir_create_mode;
+#endif
+
+ /* Check for PG_VERSION */
+ ValidatePgVersion(DataDir);
+}
+
+/*
+ * Set data directory, but make sure it's an absolute path. Use this,
+ * never set DataDir directly.
+ */
+void
+SetDataDir(const char *dir)
+{
+ char *new;
+
+ AssertArg(dir);
+
+ /* If presented path is relative, convert to absolute */
+ new = make_absolute_path(dir);
+
+ if (DataDir)
+ free(DataDir);
+ DataDir = new;
+}
+
+/*
+ * Change working directory to DataDir. Most of the postmaster and backend
+ * code assumes that we are in DataDir so it can use relative paths to access
+ * stuff in and under the data directory. For convenience during path
+ * setup, however, we don't force the chdir to occur during SetDataDir.
+ */
+void
+ChangeToDataDir(void)
+{
+ AssertState(DataDir);
+
+ if (chdir(DataDir) < 0)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not change directory to \"%s\": %m",
+ DataDir)));
+}
+
+
+/* ----------------------------------------------------------------
+ * User ID state
+ *
+ * We have to track several different values associated with the concept
+ * of "user ID".
+ *
+ * AuthenticatedUserId is determined at connection start and never changes.
+ *
+ * SessionUserId is initially the same as AuthenticatedUserId, but can be
+ * changed by SET SESSION AUTHORIZATION (if AuthenticatedUserIsSuperuser).
+ * This is the ID reported by the SESSION_USER SQL function.
+ *
+ * OuterUserId is the current user ID in effect at the "outer level" (outside
+ * any transaction or function). This is initially the same as SessionUserId,
+ * but can be changed by SET ROLE to any role that SessionUserId is a
+ * member of. (XXX rename to something like CurrentRoleId?)
+ *
+ * CurrentUserId is the current effective user ID; this is the one to use
+ * for all normal permissions-checking purposes. At outer level this will
+ * be the same as OuterUserId, but it changes during calls to SECURITY
+ * DEFINER functions, as well as locally in some specialized commands.
+ *
+ * SecurityRestrictionContext holds flags indicating reason(s) for changing
+ * CurrentUserId. In some cases we need to lock down operations that are
+ * not directly controlled by privilege settings, and this provides a
+ * convenient way to do it.
+ * ----------------------------------------------------------------
+ */
+static Oid AuthenticatedUserId = InvalidOid;
+static Oid SessionUserId = InvalidOid;
+static Oid OuterUserId = InvalidOid;
+static Oid CurrentUserId = InvalidOid;
+
+/* We also have to remember the superuser state of some of these levels */
+static bool AuthenticatedUserIsSuperuser = false;
+static bool SessionUserIsSuperuser = false;
+
+static int SecurityRestrictionContext = 0;
+
+/* We also remember if a SET ROLE is currently active */
+static bool SetRoleIsActive = false;
+
+/*
+ * GetUserId - get the current effective user ID.
+ *
+ * Note: there's no SetUserId() anymore; use SetUserIdAndSecContext().
+ */
+Oid
+GetUserId(void)
+{
+ AssertState(OidIsValid(CurrentUserId));
+ return CurrentUserId;
+}
+
+
+/*
+ * GetOuterUserId/SetOuterUserId - get/set the outer-level user ID.
+ */
+Oid
+GetOuterUserId(void)
+{
+ AssertState(OidIsValid(OuterUserId));
+ return OuterUserId;
+}
+
+
+static void
+SetOuterUserId(Oid userid)
+{
+ AssertState(SecurityRestrictionContext == 0);
+ AssertArg(OidIsValid(userid));
+ OuterUserId = userid;
+
+ /* We force the effective user ID to match, too */
+ CurrentUserId = userid;
+}
+
+
+/*
+ * GetSessionUserId/SetSessionUserId - get/set the session user ID.
+ */
+Oid
+GetSessionUserId(void)
+{
+ AssertState(OidIsValid(SessionUserId));
+ return SessionUserId;
+}
+
+
+static void
+SetSessionUserId(Oid userid, bool is_superuser)
+{
+ AssertState(SecurityRestrictionContext == 0);
+ AssertArg(OidIsValid(userid));
+ SessionUserId = userid;
+ SessionUserIsSuperuser = is_superuser;
+ SetRoleIsActive = false;
+
+ /* We force the effective user IDs to match, too */
+ OuterUserId = userid;
+ CurrentUserId = userid;
+}
+
+/*
+ * GetAuthenticatedUserId - get the authenticated user ID
+ */
+Oid
+GetAuthenticatedUserId(void)
+{
+ AssertState(OidIsValid(AuthenticatedUserId));
+ return AuthenticatedUserId;
+}
+
+
+/*
+ * GetUserIdAndSecContext/SetUserIdAndSecContext - get/set the current user ID
+ * and the SecurityRestrictionContext flags.
+ *
+ * Currently there are three valid bits in SecurityRestrictionContext:
+ *
+ * SECURITY_LOCAL_USERID_CHANGE indicates that we are inside an operation
+ * that is temporarily changing CurrentUserId via these functions. This is
+ * needed to indicate that the actual value of CurrentUserId is not in sync
+ * with guc.c's internal state, so SET ROLE has to be disallowed.
+ *
+ * SECURITY_RESTRICTED_OPERATION indicates that we are inside an operation
+ * that does not wish to trust called user-defined functions at all. The
+ * policy is to use this before operations, e.g. autovacuum and REINDEX, that
+ * enumerate relations of a database or schema and run functions associated
+ * with each found relation. The relation owner is the new user ID. Set this
+ * as soon as possible after locking the relation. Restore the old user ID as
+ * late as possible before closing the relation; restoring it shortly after
+ * close is also tolerable. If a command has both relation-enumerating and
+ * non-enumerating modes, e.g. ANALYZE, both modes set this bit. This bit
+ * prevents not only SET ROLE, but various other changes of session state that
+ * normally is unprotected but might possibly be used to subvert the calling
+ * session later. An example is replacing an existing prepared statement with
+ * new code, which will then be executed with the outer session's permissions
+ * when the prepared statement is next used. These restrictions are fairly
+ * draconian, but the functions called in relation-enumerating operations are
+ * really supposed to be side-effect-free anyway.
+ *
+ * SECURITY_NOFORCE_RLS indicates that we are inside an operation which should
+ * ignore the FORCE ROW LEVEL SECURITY per-table indication. This is used to
+ * ensure that FORCE RLS does not mistakenly break referential integrity
+ * checks. Note that this is intentionally only checked when running as the
+ * owner of the table (which should always be the case for referential
+ * integrity checks).
+ *
+ * Unlike GetUserId, GetUserIdAndSecContext does *not* Assert that the current
+ * value of CurrentUserId is valid; nor does SetUserIdAndSecContext require
+ * the new value to be valid. In fact, these routines had better not
+ * ever throw any kind of error. This is because they are used by
+ * StartTransaction and AbortTransaction to save/restore the settings,
+ * and during the first transaction within a backend, the value to be saved
+ * and perhaps restored is indeed invalid. We have to be able to get
+ * through AbortTransaction without asserting in case InitPostgres fails.
+ */
+void
+GetUserIdAndSecContext(Oid *userid, int *sec_context)
+{
+ *userid = CurrentUserId;
+ *sec_context = SecurityRestrictionContext;
+}
+
+void
+SetUserIdAndSecContext(Oid userid, int sec_context)
+{
+ CurrentUserId = userid;
+ SecurityRestrictionContext = sec_context;
+}
+
+
+/*
+ * InLocalUserIdChange - are we inside a local change of CurrentUserId?
+ */
+bool
+InLocalUserIdChange(void)
+{
+ return (SecurityRestrictionContext & SECURITY_LOCAL_USERID_CHANGE) != 0;
+}
+
+/*
+ * InSecurityRestrictedOperation - are we inside a security-restricted command?
+ */
+bool
+InSecurityRestrictedOperation(void)
+{
+ return (SecurityRestrictionContext & SECURITY_RESTRICTED_OPERATION) != 0;
+}
+
+/*
+ * InNoForceRLSOperation - are we ignoring FORCE ROW LEVEL SECURITY ?
+ */
+bool
+InNoForceRLSOperation(void)
+{
+ return (SecurityRestrictionContext & SECURITY_NOFORCE_RLS) != 0;
+}
+
+
+/*
+ * These are obsolete versions of Get/SetUserIdAndSecContext that are
+ * only provided for bug-compatibility with some rather dubious code in
+ * pljava. We allow the userid to be set, but only when not inside a
+ * security restriction context.
+ */
+void
+GetUserIdAndContext(Oid *userid, bool *sec_def_context)
+{
+ *userid = CurrentUserId;
+ *sec_def_context = InLocalUserIdChange();
+}
+
+void
+SetUserIdAndContext(Oid userid, bool sec_def_context)
+{
+ /* We throw the same error SET ROLE would. */
+ if (InSecurityRestrictedOperation())
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("cannot set parameter \"%s\" within security-restricted operation",
+ "role")));
+ CurrentUserId = userid;
+ if (sec_def_context)
+ SecurityRestrictionContext |= SECURITY_LOCAL_USERID_CHANGE;
+ else
+ SecurityRestrictionContext &= ~SECURITY_LOCAL_USERID_CHANGE;
+}
+
+
+/*
+ * Check whether specified role has explicit REPLICATION privilege
+ */
+bool
+has_rolreplication(Oid roleid)
+{
+ bool result = false;
+ HeapTuple utup;
+
+ utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (HeapTupleIsValid(utup))
+ {
+ result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
+ ReleaseSysCache(utup);
+ }
+ return result;
+}
+
+/*
+ * Initialize user identity during normal backend startup
+ */
+void
+InitializeSessionUserId(const char *rolename, Oid roleid)
+{
+ HeapTuple roleTup;
+ Form_pg_authid rform;
+ char *rname;
+
+ /*
+ * Don't do scans if we're bootstrapping, none of the system catalogs
+ * exist yet, and they should be owned by postgres anyway.
+ */
+ AssertState(!IsBootstrapProcessingMode());
+
+ /* call only once */
+ AssertState(!OidIsValid(AuthenticatedUserId));
+
+ /*
+ * Make sure syscache entries are flushed for recent catalog changes. This
+ * allows us to find roles that were created on-the-fly during
+ * authentication.
+ */
+ AcceptInvalidationMessages();
+
+ if (rolename != NULL)
+ {
+ roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
+ if (!HeapTupleIsValid(roleTup))
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
+ errmsg("role \"%s\" does not exist", rolename)));
+ }
+ else
+ {
+ roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (!HeapTupleIsValid(roleTup))
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
+ errmsg("role with OID %u does not exist", roleid)));
+ }
+
+ rform = (Form_pg_authid) GETSTRUCT(roleTup);
+ roleid = rform->oid;
+ rname = NameStr(rform->rolname);
+
+ AuthenticatedUserId = roleid;
+ AuthenticatedUserIsSuperuser = rform->rolsuper;
+
+ /* This sets OuterUserId/CurrentUserId too */
+ SetSessionUserId(roleid, AuthenticatedUserIsSuperuser);
+
+ /* Also mark our PGPROC entry with the authenticated user id */
+ /* (We assume this is an atomic store so no lock is needed) */
+ MyProc->roleId = roleid;
+
+ /*
+ * These next checks are not enforced when in standalone mode, so that
+ * there is a way to recover from sillinesses like "UPDATE pg_authid SET
+ * rolcanlogin = false;".
+ */
+ if (IsUnderPostmaster)
+ {
+ /*
+ * Is role allowed to login at all?
+ */
+ if (!rform->rolcanlogin)
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
+ errmsg("role \"%s\" is not permitted to log in",
+ rname)));
+
+ /*
+ * Check connection limit for this role.
+ *
+ * There is a race condition here --- we create our PGPROC before
+ * checking for other PGPROCs. If two backends did this at about the
+ * same time, they might both think they were over the limit, while
+ * ideally one should succeed and one fail. Getting that to work
+ * exactly seems more trouble than it is worth, however; instead we
+ * just document that the connection limit is approximate.
+ */
+ if (rform->rolconnlimit >= 0 &&
+ !AuthenticatedUserIsSuperuser &&
+ CountUserBackends(roleid) > rform->rolconnlimit)
+ ereport(FATAL,
+ (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
+ errmsg("too many connections for role \"%s\"",
+ rname)));
+ }
+
+ /* Record username and superuser status as GUC settings too */
+ SetConfigOption("session_authorization", rname,
+ PGC_BACKEND, PGC_S_OVERRIDE);
+ SetConfigOption("is_superuser",
+ AuthenticatedUserIsSuperuser ? "on" : "off",
+ PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+
+ ReleaseSysCache(roleTup);
+}
+
+
+/*
+ * Initialize user identity during special backend startup
+ */
+void
+InitializeSessionUserIdStandalone(void)
+{
+ /*
+ * This function should only be called in single-user mode, in autovacuum
+ * workers, and in background workers.
+ */
+ AssertState(!IsUnderPostmaster || IsAutoVacuumWorkerProcess() || IsBackgroundWorker);
+
+ /* call only once */
+ AssertState(!OidIsValid(AuthenticatedUserId));
+
+ AuthenticatedUserId = BOOTSTRAP_SUPERUSERID;
+ AuthenticatedUserIsSuperuser = true;
+
+ SetSessionUserId(BOOTSTRAP_SUPERUSERID, true);
+
+ /*
+ * XXX This should set SetConfigOption("session_authorization"), too.
+ * Since we don't, C code will get NULL, and current_setting() will get an
+ * empty string.
+ */
+ SetConfigOption("is_superuser", "on",
+ PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+}
+
+
+/*
+ * Change session auth ID while running
+ *
+ * Only a superuser may set auth ID to something other than himself. Note
+ * that in case of multiple SETs in a single session, the original userid's
+ * superuserness is what matters. But we set the GUC variable is_superuser
+ * to indicate whether the *current* session userid is a superuser.
+ *
+ * Note: this is not an especially clean place to do the permission check.
+ * It's OK because the check does not require catalog access and can't
+ * fail during an end-of-transaction GUC reversion, but we may someday
+ * have to push it up into assign_session_authorization.
+ */
+void
+SetSessionAuthorization(Oid userid, bool is_superuser)
+{
+ /* Must have authenticated already, else can't make permission check */
+ AssertState(OidIsValid(AuthenticatedUserId));
+
+ if (userid != AuthenticatedUserId &&
+ !AuthenticatedUserIsSuperuser)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to set session authorization")));
+
+ SetSessionUserId(userid, is_superuser);
+
+ SetConfigOption("is_superuser",
+ is_superuser ? "on" : "off",
+ PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+}
+
+/*
+ * Report current role id
+ * This follows the semantics of SET ROLE, ie return the outer-level ID
+ * not the current effective ID, and return InvalidOid when the setting
+ * is logically SET ROLE NONE.
+ */
+Oid
+GetCurrentRoleId(void)
+{
+ if (SetRoleIsActive)
+ return OuterUserId;
+ else
+ return InvalidOid;
+}
+
+/*
+ * Change Role ID while running (SET ROLE)
+ *
+ * If roleid is InvalidOid, we are doing SET ROLE NONE: revert to the
+ * session user authorization. In this case the is_superuser argument
+ * is ignored.
+ *
+ * When roleid is not InvalidOid, the caller must have checked whether
+ * the session user has permission to become that role. (We cannot check
+ * here because this routine must be able to execute in a failed transaction
+ * to restore a prior value of the ROLE GUC variable.)
+ */
+void
+SetCurrentRoleId(Oid roleid, bool is_superuser)
+{
+ /*
+ * Get correct info if it's SET ROLE NONE
+ *
+ * If SessionUserId hasn't been set yet, just do nothing --- the eventual
+ * SetSessionUserId call will fix everything. This is needed since we
+ * will get called during GUC initialization.
+ */
+ if (!OidIsValid(roleid))
+ {
+ if (!OidIsValid(SessionUserId))
+ return;
+
+ roleid = SessionUserId;
+ is_superuser = SessionUserIsSuperuser;
+
+ SetRoleIsActive = false;
+ }
+ else
+ SetRoleIsActive = true;
+
+ SetOuterUserId(roleid);
+
+ SetConfigOption("is_superuser",
+ is_superuser ? "on" : "off",
+ PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+}
+
+
+/*
+ * Get user name from user oid, returns NULL for nonexistent roleid if noerr
+ * is true.
+ */
+char *
+GetUserNameFromId(Oid roleid, bool noerr)
+{
+ HeapTuple tuple;
+ char *result;
+
+ tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (!HeapTupleIsValid(tuple))
+ {
+ if (!noerr)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("invalid role OID: %u", roleid)));
+ result = NULL;
+ }
+ else
+ {
+ result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
+ ReleaseSysCache(tuple);
+ }
+ return result;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Interlock-file support
+ *
+ * These routines are used to create both a data-directory lockfile
+ * ($DATADIR/postmaster.pid) and Unix-socket-file lockfiles ($SOCKFILE.lock).
+ * Both kinds of files contain the same info initially, although we can add
+ * more information to a data-directory lockfile after it's created, using
+ * AddToDataDirLockFile(). See pidfile.h for documentation of the contents
+ * of these lockfiles.
+ *
+ * On successful lockfile creation, a proc_exit callback to remove the
+ * lockfile is automatically created.
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * proc_exit callback to remove lockfiles.
+ */
+static void
+UnlinkLockFiles(int status, Datum arg)
+{
+ ListCell *l;
+
+ foreach(l, lock_files)
+ {
+ char *curfile = (char *) lfirst(l);
+
+ unlink(curfile);
+ /* Should we complain if the unlink fails? */
+ }
+ /* Since we're about to exit, no need to reclaim storage */
+ lock_files = NIL;
+
+ /*
+ * Lock file removal should always be the last externally visible action
+ * of a postmaster or standalone backend, while we won't come here at all
+ * when exiting postmaster child processes. Therefore, this is a good
+ * place to log completion of shutdown. We could alternatively teach
+ * proc_exit() to do it, but that seems uglier. In a standalone backend,
+ * use NOTICE elevel to be less chatty.
+ */
+ ereport(IsPostmasterEnvironment ? LOG : NOTICE,
+ (errmsg("database system is shut down")));
+}
+
+/*
+ * Create a lockfile.
+ *
+ * filename is the path name of the lockfile to create.
+ * amPostmaster is used to determine how to encode the output PID.
+ * socketDir is the Unix socket directory path to include (possibly empty).
+ * isDDLock and refName are used to determine what error message to produce.
+ */
+static void
+CreateLockFile(const char *filename, bool amPostmaster,
+ const char *socketDir,
+ bool isDDLock, const char *refName)
+{
+ int fd;
+ char buffer[MAXPGPATH * 2 + 256];
+ int ntries;
+ int len;
+ int encoded_pid;
+ pid_t other_pid;
+ pid_t my_pid,
+ my_p_pid,
+ my_gp_pid;
+ const char *envvar;
+
+ /*
+ * If the PID in the lockfile is our own PID or our parent's or
+ * grandparent's PID, then the file must be stale (probably left over from
+ * a previous system boot cycle). We need to check this because of the
+ * likelihood that a reboot will assign exactly the same PID as we had in
+ * the previous reboot, or one that's only one or two counts larger and
+ * hence the lockfile's PID now refers to an ancestor shell process. We
+ * allow pg_ctl to pass down its parent shell PID (our grandparent PID)
+ * via the environment variable PG_GRANDPARENT_PID; this is so that
+ * launching the postmaster via pg_ctl can be just as reliable as
+ * launching it directly. There is no provision for detecting
+ * further-removed ancestor processes, but if the init script is written
+ * carefully then all but the immediate parent shell will be root-owned
+ * processes and so the kill test will fail with EPERM. Note that we
+ * cannot get a false negative this way, because an existing postmaster
+ * would surely never launch a competing postmaster or pg_ctl process
+ * directly.
+ */
+ my_pid = getpid();
+
+#ifndef WIN32
+ my_p_pid = getppid();
+#else
+
+ /*
+ * Windows hasn't got getppid(), but doesn't need it since it's not using
+ * real kill() either...
+ */
+ my_p_pid = 0;
+#endif
+
+ envvar = getenv("PG_GRANDPARENT_PID");
+ if (envvar)
+ my_gp_pid = atoi(envvar);
+ else
+ my_gp_pid = 0;
+
+ /*
+ * We need a loop here because of race conditions. But don't loop forever
+ * (for example, a non-writable $PGDATA directory might cause a failure
+ * that won't go away). 100 tries seems like plenty.
+ */
+ for (ntries = 0;; ntries++)
+ {
+ /*
+ * Try to create the lock file --- O_EXCL makes this atomic.
+ *
+ * Think not to make the file protection weaker than 0600/0640. See
+ * comments below.
+ */
+ fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
+ if (fd >= 0)
+ break; /* Success; exit the retry loop */
+
+ /*
+ * Couldn't create the pid file. Probably it already exists.
+ */
+ if ((errno != EEXIST && errno != EACCES) || ntries > 100)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not create lock file \"%s\": %m",
+ filename)));
+
+ /*
+ * Read the file to get the old owner's PID. Note race condition
+ * here: file might have been deleted since we tried to create it.
+ */
+ fd = open(filename, O_RDONLY, pg_file_create_mode);
+ if (fd < 0)
+ {
+ if (errno == ENOENT)
+ continue; /* race condition; try again */
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not open lock file \"%s\": %m",
+ filename)));
+ }
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_READ);
+ if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not read lock file \"%s\": %m",
+ filename)));
+ pgstat_report_wait_end();
+ close(fd);
+
+ if (len == 0)
+ {
+ ereport(FATAL,
+ (errcode(ERRCODE_LOCK_FILE_EXISTS),
+ errmsg("lock file \"%s\" is empty", filename),
+ errhint("Either another server is starting, or the lock file is the remnant of a previous server startup crash.")));
+ }
+
+ buffer[len] = '\0';
+ encoded_pid = atoi(buffer);
+
+ /* if pid < 0, the pid is for postgres, not postmaster */
+ other_pid = (pid_t) (encoded_pid < 0 ? -encoded_pid : encoded_pid);
+
+ if (other_pid <= 0)
+ elog(FATAL, "bogus data in lock file \"%s\": \"%s\"",
+ filename, buffer);
+
+ /*
+ * Check to see if the other process still exists
+ *
+ * Per discussion above, my_pid, my_p_pid, and my_gp_pid can be
+ * ignored as false matches.
+ *
+ * Normally kill() will fail with ESRCH if the given PID doesn't
+ * exist.
+ *
+ * We can treat the EPERM-error case as okay because that error
+ * implies that the existing process has a different userid than we
+ * do, which means it cannot be a competing postmaster. A postmaster
+ * cannot successfully attach to a data directory owned by a userid
+ * other than its own, as enforced in checkDataDir(). Also, since we
+ * create the lockfiles mode 0600/0640, we'd have failed above if the
+ * lockfile belonged to another userid --- which means that whatever
+ * process kill() is reporting about isn't the one that made the
+ * lockfile. (NOTE: this last consideration is the only one that
+ * keeps us from blowing away a Unix socket file belonging to an
+ * instance of Postgres being run by someone else, at least on
+ * machines where /tmp hasn't got a stickybit.)
+ */
+ if (other_pid != my_pid && other_pid != my_p_pid &&
+ other_pid != my_gp_pid)
+ {
+ if (kill(other_pid, 0) == 0 ||
+ (errno != ESRCH && errno != EPERM))
+ {
+ /* lockfile belongs to a live process */
+ ereport(FATAL,
+ (errcode(ERRCODE_LOCK_FILE_EXISTS),
+ errmsg("lock file \"%s\" already exists",
+ filename),
+ isDDLock ?
+ (encoded_pid < 0 ?
+ errhint("Is another postgres (PID %d) running in data directory \"%s\"?",
+ (int) other_pid, refName) :
+ errhint("Is another postmaster (PID %d) running in data directory \"%s\"?",
+ (int) other_pid, refName)) :
+ (encoded_pid < 0 ?
+ errhint("Is another postgres (PID %d) using socket file \"%s\"?",
+ (int) other_pid, refName) :
+ errhint("Is another postmaster (PID %d) using socket file \"%s\"?",
+ (int) other_pid, refName))));
+ }
+ }
+
+ /*
+ * No, the creating process did not exist. However, it could be that
+ * the postmaster crashed (or more likely was kill -9'd by a clueless
+ * admin) but has left orphan backends behind. Check for this by
+ * looking to see if there is an associated shmem segment that is
+ * still in use.
+ *
+ * Note: because postmaster.pid is written in multiple steps, we might
+ * not find the shmem ID values in it; we can't treat that as an
+ * error.
+ */
+ if (isDDLock)
+ {
+ char *ptr = buffer;
+ unsigned long id1,
+ id2;
+ int lineno;
+
+ for (lineno = 1; lineno < LOCK_FILE_LINE_SHMEM_KEY; lineno++)
+ {
+ if ((ptr = strchr(ptr, '\n')) == NULL)
+ break;
+ ptr++;
+ }
+
+ if (ptr != NULL &&
+ sscanf(ptr, "%lu %lu", &id1, &id2) == 2)
+ {
+ if (PGSharedMemoryIsInUse(id1, id2))
+ ereport(FATAL,
+ (errcode(ERRCODE_LOCK_FILE_EXISTS),
+ errmsg("pre-existing shared memory block (key %lu, ID %lu) is still in use",
+ id1, id2),
+ errhint("Terminate any old server processes associated with data directory \"%s\".",
+ refName)));
+ }
+ }
+
+ /*
+ * Looks like nobody's home. Unlink the file and try again to create
+ * it. Need a loop because of possible race condition against other
+ * would-be creators.
+ */
+ if (unlink(filename) < 0)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not remove old lock file \"%s\": %m",
+ filename),
+ errhint("The file seems accidentally left over, but "
+ "it could not be removed. Please remove the file "
+ "by hand and try again.")));
+ }
+
+ /*
+ * Successfully created the file, now fill it. See comment in pidfile.h
+ * about the contents. Note that we write the same first five lines into
+ * both datadir and socket lockfiles; although more stuff may get added to
+ * the datadir lockfile later.
+ */
+ snprintf(buffer, sizeof(buffer), "%d\n%s\n%ld\n%d\n%s\n",
+ amPostmaster ? (int) my_pid : -((int) my_pid),
+ DataDir,
+ (long) MyStartTime,
+ PostPortNumber,
+ socketDir);
+
+ /*
+ * In a standalone backend, the next line (LOCK_FILE_LINE_LISTEN_ADDR)
+ * will never receive data, so fill it in as empty now.
+ */
+ if (isDDLock && !amPostmaster)
+ strlcat(buffer, "\n", sizeof(buffer));
+
+ errno = 0;
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_WRITE);
+ if (write(fd, buffer, strlen(buffer)) != strlen(buffer))
+ {
+ int save_errno = errno;
+
+ close(fd);
+ unlink(filename);
+ /* if write didn't set errno, assume problem is no disk space */
+ errno = save_errno ? save_errno : ENOSPC;
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not write lock file \"%s\": %m", filename)));
+ }
+ pgstat_report_wait_end();
+
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_SYNC);
+ if (pg_fsync(fd) != 0)
+ {
+ int save_errno = errno;
+
+ close(fd);
+ unlink(filename);
+ errno = save_errno;
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not write lock file \"%s\": %m", filename)));
+ }
+ pgstat_report_wait_end();
+ if (close(fd) != 0)
+ {
+ int save_errno = errno;
+
+ unlink(filename);
+ errno = save_errno;
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not write lock file \"%s\": %m", filename)));
+ }
+
+ /*
+ * Arrange to unlink the lock file(s) at proc_exit. If this is the first
+ * one, set up the on_proc_exit function to do it; then add this lock file
+ * to the list of files to unlink.
+ */
+ if (lock_files == NIL)
+ on_proc_exit(UnlinkLockFiles, 0);
+
+ /*
+ * Use lcons so that the lock files are unlinked in reverse order of
+ * creation; this is critical!
+ */
+ lock_files = lcons(pstrdup(filename), lock_files);
+}
+
+/*
+ * Create the data directory lockfile.
+ *
+ * When this is called, we must have already switched the working
+ * directory to DataDir, so we can just use a relative path. This
+ * helps ensure that we are locking the directory we should be.
+ *
+ * Note that the socket directory path line is initially written as empty.
+ * postmaster.c will rewrite it upon creating the first Unix socket.
+ */
+void
+CreateDataDirLockFile(bool amPostmaster)
+{
+ CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
+}
+
+/*
+ * Create a lockfile for the specified Unix socket file.
+ */
+void
+CreateSocketLockFile(const char *socketfile, bool amPostmaster,
+ const char *socketDir)
+{
+ char lockfile[MAXPGPATH];
+
+ snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
+ CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
+}
+
+/*
+ * TouchSocketLockFiles -- mark socket lock files as recently accessed
+ *
+ * This routine should be called every so often to ensure that the socket
+ * lock files have a recent mod or access date. That saves them
+ * from being removed by overenthusiastic /tmp-directory-cleaner daemons.
+ * (Another reason we should never have put the socket file in /tmp...)
+ */
+void
+TouchSocketLockFiles(void)
+{
+ ListCell *l;
+
+ foreach(l, lock_files)
+ {
+ char *socketLockFile = (char *) lfirst(l);
+
+ /* No need to touch the data directory lock file, we trust */
+ if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
+ continue;
+
+ /* we just ignore any error here */
+ (void) utime(socketLockFile, NULL);
+ }
+}
+
+
+/*
+ * Add (or replace) a line in the data directory lock file.
+ * The given string should not include a trailing newline.
+ *
+ * Note: because we don't truncate the file, if we were to rewrite a line
+ * with less data than it had before, there would be garbage after the last
+ * line. While we could fix that by adding a truncate call, that would make
+ * the file update non-atomic, which we'd rather avoid. Therefore, callers
+ * should endeavor never to shorten a line once it's been written.
+ */
+void
+AddToDataDirLockFile(int target_line, const char *str)
+{
+ int fd;
+ int len;
+ int lineno;
+ char *srcptr;
+ char *destptr;
+ char srcbuffer[BLCKSZ];
+ char destbuffer[BLCKSZ];
+
+ fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
+ if (fd < 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ return;
+ }
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ);
+ len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
+ pgstat_report_wait_end();
+ if (len < 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not read from file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ close(fd);
+ return;
+ }
+ srcbuffer[len] = '\0';
+
+ /*
+ * Advance over lines we are not supposed to rewrite, then copy them to
+ * destbuffer.
+ */
+ srcptr = srcbuffer;
+ for (lineno = 1; lineno < target_line; lineno++)
+ {
+ char *eol = strchr(srcptr, '\n');
+
+ if (eol == NULL)
+ break; /* not enough lines in file yet */
+ srcptr = eol + 1;
+ }
+ memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
+ destptr = destbuffer + (srcptr - srcbuffer);
+
+ /*
+ * Fill in any missing lines before the target line, in case lines are
+ * added to the file out of order.
+ */
+ for (; lineno < target_line; lineno++)
+ {
+ if (destptr < destbuffer + sizeof(destbuffer))
+ *destptr++ = '\n';
+ }
+
+ /*
+ * Write or rewrite the target line.
+ */
+ snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
+ destptr += strlen(destptr);
+
+ /*
+ * If there are more lines in the old file, append them to destbuffer.
+ */
+ if ((srcptr = strchr(srcptr, '\n')) != NULL)
+ {
+ srcptr++;
+ snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
+ srcptr);
+ }
+
+ /*
+ * And rewrite the data. Since we write in a single kernel call, this
+ * update should appear atomic to onlookers.
+ */
+ len = strlen(destbuffer);
+ errno = 0;
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
+ if (pg_pwrite(fd, destbuffer, len, 0) != len)
+ {
+ pgstat_report_wait_end();
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ close(fd);
+ return;
+ }
+ pgstat_report_wait_end();
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC);
+ if (pg_fsync(fd) != 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ }
+ pgstat_report_wait_end();
+ if (close(fd) != 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ }
+}
+
+
+/*
+ * Recheck that the data directory lock file still exists with expected
+ * content. Return true if the lock file appears OK, false if it isn't.
+ *
+ * We call this periodically in the postmaster. The idea is that if the
+ * lock file has been removed or replaced by another postmaster, we should
+ * do a panic database shutdown. Therefore, we should return true if there
+ * is any doubt: we do not want to cause a panic shutdown unnecessarily.
+ * Transient failures like EINTR or ENFILE should not cause us to fail.
+ * (If there really is something wrong, we'll detect it on a future recheck.)
+ */
+bool
+RecheckDataDirLockFile(void)
+{
+ int fd;
+ int len;
+ long file_pid;
+ char buffer[BLCKSZ];
+
+ fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
+ if (fd < 0)
+ {
+ /*
+ * There are many foreseeable false-positive error conditions. For
+ * safety, fail only on enumerated clearly-something-is-wrong
+ * conditions.
+ */
+ switch (errno)
+ {
+ case ENOENT:
+ case ENOTDIR:
+ /* disaster */
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ return false;
+ default:
+ /* non-fatal, at least for now */
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m; continuing anyway",
+ DIRECTORY_LOCK_FILE)));
+ return true;
+ }
+ }
+ pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ);
+ len = read(fd, buffer, sizeof(buffer) - 1);
+ pgstat_report_wait_end();
+ if (len < 0)
+ {
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not read from file \"%s\": %m",
+ DIRECTORY_LOCK_FILE)));
+ close(fd);
+ return true; /* treat read failure as nonfatal */
+ }
+ buffer[len] = '\0';
+ close(fd);
+ file_pid = atol(buffer);
+ if (file_pid == getpid())
+ return true; /* all is well */
+
+ /* Trouble: someone's overwritten the lock file */
+ ereport(LOG,
+ (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
+ DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
+ return false;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Version checking support
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Determine whether the PG_VERSION file in directory `path' indicates
+ * a data version compatible with the version of this program.
+ *
+ * If compatible, return. Otherwise, ereport(FATAL).
+ */
+void
+ValidatePgVersion(const char *path)
+{
+ char full_path[MAXPGPATH];
+ FILE *file;
+ int ret;
+ long file_major;
+ long my_major;
+ char *endptr;
+ char file_version_string[64];
+ const char *my_version_string = PG_VERSION;
+
+ my_major = strtol(my_version_string, &endptr, 10);
+
+ snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
+
+ file = AllocateFile(full_path, "r");
+ if (!file)
+ {
+ if (errno == ENOENT)
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("\"%s\" is not a valid data directory",
+ path),
+ errdetail("File \"%s\" is missing.", full_path)));
+ else
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m", full_path)));
+ }
+
+ file_version_string[0] = '\0';
+ ret = fscanf(file, "%63s", file_version_string);
+ file_major = strtol(file_version_string, &endptr, 10);
+
+ if (ret != 1 || endptr == file_version_string)
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("\"%s\" is not a valid data directory",
+ path),
+ errdetail("File \"%s\" does not contain valid data.",
+ full_path),
+ errhint("You might need to initdb.")));
+
+ FreeFile(file);
+
+ if (my_major != file_major)
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("database files are incompatible with server"),
+ errdetail("The data directory was initialized by PostgreSQL version %s, "
+ "which is not compatible with this version %s.",
+ file_version_string, my_version_string)));
+}
+
+/*-------------------------------------------------------------------------
+ * Library preload support
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * GUC variables: lists of library names to be preloaded at postmaster
+ * start and at backend start
+ */
+char *session_preload_libraries_string = NULL;
+char *shared_preload_libraries_string = NULL;
+char *local_preload_libraries_string = NULL;
+
+/* Flag telling that we are loading shared_preload_libraries */
+bool process_shared_preload_libraries_in_progress = false;
+bool process_shared_preload_libraries_done = false;
+
+shmem_request_hook_type shmem_request_hook = NULL;
+bool process_shmem_requests_in_progress = false;
+
+/*
+ * load the shared libraries listed in 'libraries'
+ *
+ * 'gucname': name of GUC variable, for error reports
+ * 'restricted': if true, force libraries to be in $libdir/plugins/
+ */
+static void
+load_libraries(const char *libraries, const char *gucname, bool restricted)
+{
+ char *rawstring;
+ List *elemlist;
+ ListCell *l;
+
+ if (libraries == NULL || libraries[0] == '\0')
+ return; /* nothing to do */
+
+ /* Need a modifiable copy of string */
+ rawstring = pstrdup(libraries);
+
+ /* Parse string into list of filename paths */
+ if (!SplitDirectoriesString(rawstring, ',', &elemlist))
+ {
+ /* syntax error in list */
+ list_free_deep(elemlist);
+ pfree(rawstring);
+ ereport(LOG,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid list syntax in parameter \"%s\"",
+ gucname)));
+ return;
+ }
+
+ foreach(l, elemlist)
+ {
+ /* Note that filename was already canonicalized */
+ char *filename = (char *) lfirst(l);
+ char *expanded = NULL;
+
+ /* If restricting, insert $libdir/plugins if not mentioned already */
+ if (restricted && first_dir_separator(filename) == NULL)
+ {
+ expanded = psprintf("$libdir/plugins/%s", filename);
+ filename = expanded;
+ }
+ load_file(filename, restricted);
+ ereport(DEBUG1,
+ (errmsg_internal("loaded library \"%s\"", filename)));
+ if (expanded)
+ pfree(expanded);
+ }
+
+ list_free_deep(elemlist);
+ pfree(rawstring);
+}
+
+/*
+ * process any libraries that should be preloaded at postmaster start
+ */
+void
+process_shared_preload_libraries(void)
+{
+ process_shared_preload_libraries_in_progress = true;
+ load_libraries(shared_preload_libraries_string,
+ "shared_preload_libraries",
+ false);
+ process_shared_preload_libraries_in_progress = false;
+ process_shared_preload_libraries_done = true;
+}
+
+/*
+ * process any libraries that should be preloaded at backend start
+ */
+void
+process_session_preload_libraries(void)
+{
+ load_libraries(session_preload_libraries_string,
+ "session_preload_libraries",
+ false);
+ load_libraries(local_preload_libraries_string,
+ "local_preload_libraries",
+ true);
+}
+
+/*
+ * process any shared memory requests from preloaded libraries
+ */
+void
+process_shmem_requests(void)
+{
+ process_shmem_requests_in_progress = true;
+ if (shmem_request_hook)
+ shmem_request_hook();
+ process_shmem_requests_in_progress = false;
+}
+
+void
+pg_bindtextdomain(const char *domain)
+{
+#ifdef ENABLE_NLS
+ if (my_exec_path[0] != '\0')
+ {
+ char locale_path[MAXPGPATH];
+
+ get_locale_path(my_exec_path, locale_path);
+ bindtextdomain(domain, locale_path);
+ pg_bind_textdomain_codeset(domain);
+ }
+#endif
+}
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index 0000000..8ab282e
--- /dev/null
+++ b/src/backend/utils/init/postinit.c
@@ -0,0 +1,1371 @@
+/*-------------------------------------------------------------------------
+ *
+ * postinit.c
+ * postgres initialization utilities
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/init/postinit.c
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "access/genam.h"
+#include "access/heapam.h"
+#include "access/htup_details.h"
+#include "access/session.h"
+#include "access/sysattr.h"
+#include "access/tableam.h"
+#include "access/xact.h"
+#include "access/xlog.h"
+#include "access/xloginsert.h"
+#include "catalog/catalog.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_db_role_setting.h"
+#include "catalog/pg_tablespace.h"
+#include "libpq/auth.h"
+#include "libpq/libpq-be.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "postmaster/autovacuum.h"
+#include "postmaster/postmaster.h"
+#include "replication/slot.h"
+#include "replication/walsender.h"
+#include "storage/bufmgr.h"
+#include "storage/fd.h"
+#include "storage/ipc.h"
+#include "storage/lmgr.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "storage/procsignal.h"
+#include "storage/sinvaladt.h"
+#include "storage/smgr.h"
+#include "storage/sync.h"
+#include "tcop/tcopprot.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/guc.h"
+#include "utils/memutils.h"
+#include "utils/pg_locale.h"
+#include "utils/portal.h"
+#include "utils/ps_status.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+#include "utils/timeout.h"
+
+static HeapTuple GetDatabaseTuple(const char *dbname);
+static HeapTuple GetDatabaseTupleByOid(Oid dboid);
+static void PerformAuthentication(Port *port);
+static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections);
+static void ShutdownPostgres(int code, Datum arg);
+static void StatementTimeoutHandler(void);
+static void LockTimeoutHandler(void);
+static void IdleInTransactionSessionTimeoutHandler(void);
+static void IdleSessionTimeoutHandler(void);
+static void IdleStatsUpdateTimeoutHandler(void);
+static void ClientCheckTimeoutHandler(void);
+static bool ThereIsAtLeastOneRole(void);
+static void process_startup_options(Port *port, bool am_superuser);
+static void process_settings(Oid databaseid, Oid roleid);
+
+
+/*** InitPostgres support ***/
+
+
+/*
+ * GetDatabaseTuple -- fetch the pg_database row for a database
+ *
+ * This is used during backend startup when we don't yet have any access to
+ * system catalogs in general. In the worst case, we can seqscan pg_database
+ * using nothing but the hard-wired descriptor that relcache.c creates for
+ * pg_database. In more typical cases, relcache.c was able to load
+ * descriptors for both pg_database and its indexes from the shared relcache
+ * cache file, and so we can do an indexscan. criticalSharedRelcachesBuilt
+ * tells whether we got the cached descriptors.
+ */
+static HeapTuple
+GetDatabaseTuple(const char *dbname)
+{
+ HeapTuple tuple;
+ Relation relation;
+ SysScanDesc scan;
+ ScanKeyData key[1];
+
+ /*
+ * form a scan key
+ */
+ ScanKeyInit(&key[0],
+ Anum_pg_database_datname,
+ BTEqualStrategyNumber, F_NAMEEQ,
+ CStringGetDatum(dbname));
+
+ /*
+ * Open pg_database and fetch a tuple. Force heap scan if we haven't yet
+ * built the critical shared relcache entries (i.e., we're starting up
+ * without a shared relcache cache file).
+ */
+ relation = table_open(DatabaseRelationId, AccessShareLock);
+ scan = systable_beginscan(relation, DatabaseNameIndexId,
+ criticalSharedRelcachesBuilt,
+ NULL,
+ 1, key);
+
+ tuple = systable_getnext(scan);
+
+ /* Must copy tuple before releasing buffer */
+ if (HeapTupleIsValid(tuple))
+ tuple = heap_copytuple(tuple);
+
+ /* all done */
+ systable_endscan(scan);
+ table_close(relation, AccessShareLock);
+
+ return tuple;
+}
+
+/*
+ * GetDatabaseTupleByOid -- as above, but search by database OID
+ */
+static HeapTuple
+GetDatabaseTupleByOid(Oid dboid)
+{
+ HeapTuple tuple;
+ Relation relation;
+ SysScanDesc scan;
+ ScanKeyData key[1];
+
+ /*
+ * form a scan key
+ */
+ ScanKeyInit(&key[0],
+ Anum_pg_database_oid,
+ BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(dboid));
+
+ /*
+ * Open pg_database and fetch a tuple. Force heap scan if we haven't yet
+ * built the critical shared relcache entries (i.e., we're starting up
+ * without a shared relcache cache file).
+ */
+ relation = table_open(DatabaseRelationId, AccessShareLock);
+ scan = systable_beginscan(relation, DatabaseOidIndexId,
+ criticalSharedRelcachesBuilt,
+ NULL,
+ 1, key);
+
+ tuple = systable_getnext(scan);
+
+ /* Must copy tuple before releasing buffer */
+ if (HeapTupleIsValid(tuple))
+ tuple = heap_copytuple(tuple);
+
+ /* all done */
+ systable_endscan(scan);
+ table_close(relation, AccessShareLock);
+
+ return tuple;
+}
+
+
+/*
+ * PerformAuthentication -- authenticate a remote client
+ *
+ * returns: nothing. Will not return at all if there's any failure.
+ */
+static void
+PerformAuthentication(Port *port)
+{
+ /* This should be set already, but let's make sure */
+ ClientAuthInProgress = true; /* limit visibility of log messages */
+
+ /*
+ * In EXEC_BACKEND case, we didn't inherit the contents of pg_hba.conf
+ * etcetera from the postmaster, and have to load them ourselves.
+ *
+ * FIXME: [fork/exec] Ugh. Is there a way around this overhead?
+ */
+#ifdef EXEC_BACKEND
+
+ /*
+ * load_hba() and load_ident() want to work within the PostmasterContext,
+ * so create that if it doesn't exist (which it won't). We'll delete it
+ * again later, in PostgresMain.
+ */
+ if (PostmasterContext == NULL)
+ PostmasterContext = AllocSetContextCreate(TopMemoryContext,
+ "Postmaster",
+ ALLOCSET_DEFAULT_SIZES);
+
+ if (!load_hba())
+ {
+ /*
+ * It makes no sense to continue if we fail to load the HBA file,
+ * since there is no way to connect to the database in this case.
+ */
+ ereport(FATAL,
+ (errmsg("could not load pg_hba.conf")));
+ }
+
+ if (!load_ident())
+ {
+ /*
+ * It is ok to continue if we fail to load the IDENT file, although it
+ * means that you cannot log in using any of the authentication
+ * methods that need a user name mapping. load_ident() already logged
+ * the details of error to the log.
+ */
+ }
+#endif
+
+ /*
+ * Set up a timeout in case a buggy or malicious client fails to respond
+ * during authentication. Since we're inside a transaction and might do
+ * database access, we have to use the statement_timeout infrastructure.
+ */
+ enable_timeout_after(STATEMENT_TIMEOUT, AuthenticationTimeout * 1000);
+
+ /*
+ * Now perform authentication exchange.
+ */
+ set_ps_display("authentication");
+ ClientAuthentication(port); /* might not return, if failure */
+
+ /*
+ * Done with authentication. Disable the timeout, and log if needed.
+ */
+ disable_timeout(STATEMENT_TIMEOUT, false);
+
+ if (Log_connections)
+ {
+ StringInfoData logmsg;
+
+ initStringInfo(&logmsg);
+ if (am_walsender)
+ appendStringInfo(&logmsg, _("replication connection authorized: user=%s"),
+ port->user_name);
+ else
+ appendStringInfo(&logmsg, _("connection authorized: user=%s"),
+ port->user_name);
+ if (!am_walsender)
+ appendStringInfo(&logmsg, _(" database=%s"), port->database_name);
+
+ if (port->application_name != NULL)
+ appendStringInfo(&logmsg, _(" application_name=%s"),
+ port->application_name);
+
+#ifdef USE_SSL
+ if (port->ssl_in_use)
+ appendStringInfo(&logmsg, _(" SSL enabled (protocol=%s, cipher=%s, bits=%d)"),
+ be_tls_get_version(port),
+ be_tls_get_cipher(port),
+ be_tls_get_cipher_bits(port));
+#endif
+#ifdef ENABLE_GSS
+ if (port->gss)
+ {
+ const char *princ = be_gssapi_get_princ(port);
+
+ if (princ)
+ appendStringInfo(&logmsg,
+ _(" GSS (authenticated=%s, encrypted=%s, principal=%s)"),
+ be_gssapi_get_auth(port) ? _("yes") : _("no"),
+ be_gssapi_get_enc(port) ? _("yes") : _("no"),
+ princ);
+ else
+ appendStringInfo(&logmsg,
+ _(" GSS (authenticated=%s, encrypted=%s)"),
+ be_gssapi_get_auth(port) ? _("yes") : _("no"),
+ be_gssapi_get_enc(port) ? _("yes") : _("no"));
+ }
+#endif
+
+ ereport(LOG, errmsg_internal("%s", logmsg.data));
+ pfree(logmsg.data);
+ }
+
+ set_ps_display("startup");
+
+ ClientAuthInProgress = false; /* client_min_messages is active now */
+}
+
+
+/*
+ * CheckMyDatabase -- fetch information from the pg_database entry for our DB
+ */
+static void
+CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections)
+{
+ HeapTuple tup;
+ Form_pg_database dbform;
+ Datum datum;
+ bool isnull;
+ char *collate;
+ char *ctype;
+ char *iculocale;
+
+ /* Fetch our pg_database row normally, via syscache */
+ tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for database %u", MyDatabaseId);
+ dbform = (Form_pg_database) GETSTRUCT(tup);
+
+ /* This recheck is strictly paranoia */
+ if (strcmp(name, NameStr(dbform->datname)) != 0)
+ ereport(FATAL,
+ (errcode(ERRCODE_UNDEFINED_DATABASE),
+ errmsg("database \"%s\" has disappeared from pg_database",
+ name),
+ errdetail("Database OID %u now seems to belong to \"%s\".",
+ MyDatabaseId, NameStr(dbform->datname))));
+
+ /*
+ * Check permissions to connect to the database.
+ *
+ * These checks are not enforced when in standalone mode, so that there is
+ * a way to recover from disabling all access to all databases, for
+ * example "UPDATE pg_database SET datallowconn = false;".
+ *
+ * We do not enforce them for autovacuum worker processes either.
+ */
+ if (IsUnderPostmaster && !IsAutoVacuumWorkerProcess())
+ {
+ /*
+ * Check that the database is currently allowing connections.
+ */
+ if (!dbform->datallowconn && !override_allow_connections)
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("database \"%s\" is not currently accepting connections",
+ name)));
+
+ /*
+ * Check privilege to connect to the database. (The am_superuser test
+ * is redundant, but since we have the flag, might as well check it
+ * and save a few cycles.)
+ */
+ if (!am_superuser &&
+ pg_database_aclcheck(MyDatabaseId, GetUserId(),
+ ACL_CONNECT) != ACLCHECK_OK)
+ ereport(FATAL,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied for database \"%s\"", name),
+ errdetail("User does not have CONNECT privilege.")));
+
+ /*
+ * Check connection limit for this database.
+ *
+ * There is a race condition here --- we create our PGPROC before
+ * checking for other PGPROCs. If two backends did this at about the
+ * same time, they might both think they were over the limit, while
+ * ideally one should succeed and one fail. Getting that to work
+ * exactly seems more trouble than it is worth, however; instead we
+ * just document that the connection limit is approximate.
+ */
+ if (dbform->datconnlimit >= 0 &&
+ !am_superuser &&
+ CountDBConnections(MyDatabaseId) > dbform->datconnlimit)
+ ereport(FATAL,
+ (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
+ errmsg("too many connections for database \"%s\"",
+ name)));
+ }
+
+ /*
+ * OK, we're golden. Next to-do item is to save the encoding info out of
+ * the pg_database tuple.
+ */
+ SetDatabaseEncoding(dbform->encoding);
+ /* Record it as a GUC internal option, too */
+ SetConfigOption("server_encoding", GetDatabaseEncodingName(),
+ PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+ /* If we have no other source of client_encoding, use server encoding */
+ SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+ PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+
+ /* assign locale variables */
+ datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_datcollate, &isnull);
+ Assert(!isnull);
+ collate = TextDatumGetCString(datum);
+ datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_datctype, &isnull);
+ Assert(!isnull);
+ ctype = TextDatumGetCString(datum);
+
+ if (pg_perm_setlocale(LC_COLLATE, collate) == NULL)
+ ereport(FATAL,
+ (errmsg("database locale is incompatible with operating system"),
+ errdetail("The database was initialized with LC_COLLATE \"%s\", "
+ " which is not recognized by setlocale().", collate),
+ errhint("Recreate the database with another locale or install the missing locale.")));
+
+ if (pg_perm_setlocale(LC_CTYPE, ctype) == NULL)
+ ereport(FATAL,
+ (errmsg("database locale is incompatible with operating system"),
+ errdetail("The database was initialized with LC_CTYPE \"%s\", "
+ " which is not recognized by setlocale().", ctype),
+ errhint("Recreate the database with another locale or install the missing locale.")));
+
+ if (strcmp(ctype, "C") == 0 ||
+ strcmp(ctype, "POSIX") == 0)
+ database_ctype_is_c = true;
+
+ if (dbform->datlocprovider == COLLPROVIDER_ICU)
+ {
+ datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_daticulocale, &isnull);
+ Assert(!isnull);
+ iculocale = TextDatumGetCString(datum);
+ make_icu_collator(iculocale, &default_locale);
+ }
+ else
+ iculocale = NULL;
+
+ default_locale.provider = dbform->datlocprovider;
+
+ /*
+ * Default locale is currently always deterministic. Nondeterministic
+ * locales currently don't support pattern matching, which would break a
+ * lot of things if applied globally.
+ */
+ default_locale.deterministic = true;
+
+ /*
+ * Check collation version. See similar code in
+ * pg_newlocale_from_collation(). Note that here we warn instead of error
+ * in any case, so that we don't prevent connecting.
+ */
+ datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_datcollversion,
+ &isnull);
+ if (!isnull)
+ {
+ char *actual_versionstr;
+ char *collversionstr;
+
+ collversionstr = TextDatumGetCString(datum);
+
+ actual_versionstr = get_collation_actual_version(dbform->datlocprovider, dbform->datlocprovider == COLLPROVIDER_ICU ? iculocale : collate);
+ if (!actual_versionstr)
+ /* should not happen */
+ elog(WARNING,
+ "database \"%s\" has no actual collation version, but a version was recorded",
+ name);
+ else if (strcmp(actual_versionstr, collversionstr) != 0)
+ ereport(WARNING,
+ (errmsg("database \"%s\" has a collation version mismatch",
+ name),
+ errdetail("The database was created using collation version %s, "
+ "but the operating system provides version %s.",
+ collversionstr, actual_versionstr),
+ errhint("Rebuild all objects in this database that use the default collation and run "
+ "ALTER DATABASE %s REFRESH COLLATION VERSION, "
+ "or build PostgreSQL with the right library version.",
+ quote_identifier(name))));
+ }
+
+ /* Make the locale settings visible as GUC variables, too */
+ SetConfigOption("lc_collate", collate, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+ SetConfigOption("lc_ctype", ctype, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
+
+ check_strxfrm_bug();
+
+ ReleaseSysCache(tup);
+}
+
+
+/*
+ * pg_split_opts -- split a string of options and append it to an argv array
+ *
+ * The caller is responsible for ensuring the argv array is large enough. The
+ * maximum possible number of arguments added by this routine is
+ * (strlen(optstr) + 1) / 2.
+ *
+ * Because some option values can contain spaces we allow escaping using
+ * backslashes, with \\ representing a literal backslash.
+ */
+void
+pg_split_opts(char **argv, int *argcp, const char *optstr)
+{
+ StringInfoData s;
+
+ initStringInfo(&s);
+
+ while (*optstr)
+ {
+ bool last_was_escape = false;
+
+ resetStringInfo(&s);
+
+ /* skip over leading space */
+ while (isspace((unsigned char) *optstr))
+ optstr++;
+
+ if (*optstr == '\0')
+ break;
+
+ /*
+ * Parse a single option, stopping at the first space, unless it's
+ * escaped.
+ */
+ while (*optstr)
+ {
+ if (isspace((unsigned char) *optstr) && !last_was_escape)
+ break;
+
+ if (!last_was_escape && *optstr == '\\')
+ last_was_escape = true;
+ else
+ {
+ last_was_escape = false;
+ appendStringInfoChar(&s, *optstr);
+ }
+
+ optstr++;
+ }
+
+ /* now store the option in the next argv[] position */
+ argv[(*argcp)++] = pstrdup(s.data);
+ }
+
+ pfree(s.data);
+}
+
+/*
+ * Initialize MaxBackends value from config options.
+ *
+ * This must be called after modules have had the chance to alter GUCs in
+ * shared_preload_libraries and before shared memory size is determined.
+ *
+ * Note that in EXEC_BACKEND environment, the value is passed down from
+ * postmaster to subprocesses via BackendParameters in SubPostmasterMain; only
+ * postmaster itself and processes not under postmaster control should call
+ * this.
+ */
+void
+InitializeMaxBackends(void)
+{
+ Assert(MaxBackends == 0);
+
+ /* the extra unit accounts for the autovacuum launcher */
+ MaxBackends = MaxConnections + autovacuum_max_workers + 1 +
+ max_worker_processes + max_wal_senders;
+
+ /* internal error because the values were all checked previously */
+ if (MaxBackends > MAX_BACKENDS)
+ elog(ERROR, "too many backends configured");
+}
+
+/*
+ * Early initialization of a backend (either standalone or under postmaster).
+ * This happens even before InitPostgres.
+ *
+ * This is separate from InitPostgres because it is also called by auxiliary
+ * processes, such as the background writer process, which may not call
+ * InitPostgres at all.
+ */
+void
+BaseInit(void)
+{
+ Assert(MyProc != NULL);
+
+ /*
+ * Initialize our input/output/debugging file descriptors.
+ */
+ DebugFileOpen();
+
+ /*
+ * Initialize file access. Done early so other subsystems can access
+ * files.
+ */
+ InitFileAccess();
+
+ /*
+ * Initialize statistics reporting. This needs to happen early to ensure
+ * that pgstat's shutdown callback runs after the shutdown callbacks of
+ * all subsystems that can produce stats (like e.g. transaction commits
+ * can).
+ */
+ pgstat_initialize();
+
+ /* Do local initialization of storage and buffer managers */
+ InitSync();
+ smgrinit();
+ InitBufferPoolAccess();
+
+ /*
+ * Initialize temporary file access after pgstat, so that the temporary
+ * file shutdown hook can report temporary file statistics.
+ */
+ InitTemporaryFileAccess();
+
+ /*
+ * Initialize local buffers for WAL record construction, in case we ever
+ * try to insert XLOG.
+ */
+ InitXLogInsert();
+
+ /*
+ * Initialize replication slots after pgstat. The exit hook might need to
+ * drop ephemeral slots, which in turn triggers stats reporting.
+ */
+ ReplicationSlotInitialize();
+}
+
+
+/* --------------------------------
+ * InitPostgres
+ * Initialize POSTGRES.
+ *
+ * Parameters:
+ * in_dbname, dboid: specify database to connect to, as described below
+ * username, useroid: specify role to connect as, as described below
+ * load_session_libraries: TRUE to honor [session|local]_preload_libraries
+ * override_allow_connections: TRUE to connect despite !datallowconn
+ * out_dbname: optional output parameter, see below; pass NULL if not used
+ *
+ * The database can be specified by name, using the in_dbname parameter, or by
+ * OID, using the dboid parameter. Specify NULL or InvalidOid respectively
+ * for the unused parameter. If dboid is provided, the actual database
+ * name can be returned to the caller in out_dbname. If out_dbname isn't
+ * NULL, it must point to a buffer of size NAMEDATALEN.
+ *
+ * Similarly, the role can be passed by name, using the username parameter,
+ * or by OID using the useroid parameter.
+ *
+ * In bootstrap mode the database and username parameters are NULL/InvalidOid.
+ * The autovacuum launcher process doesn't specify these parameters either,
+ * because it only goes far enough to be able to read pg_database; it doesn't
+ * connect to any particular database. An autovacuum worker specifies a
+ * database but not a username; conversely, a physical walsender specifies
+ * username but not database.
+ *
+ * By convention, load_session_libraries should be passed as true in
+ * "interactive" sessions (including standalone backends), but false in
+ * background processes such as autovacuum. Note in particular that it
+ * shouldn't be true in parallel worker processes; those have another
+ * mechanism for replicating their leader's set of loaded libraries.
+ *
+ * We expect that InitProcess() was already called, so we already have a
+ * PGPROC struct ... but it's not completely filled in yet.
+ *
+ * Note:
+ * Be very careful with the order of calls in the InitPostgres function.
+ * --------------------------------
+ */
+void
+InitPostgres(const char *in_dbname, Oid dboid,
+ const char *username, Oid useroid,
+ bool load_session_libraries,
+ bool override_allow_connections,
+ char *out_dbname)
+{
+ bool bootstrap = IsBootstrapProcessingMode();
+ bool am_superuser;
+ char *fullpath;
+ char dbname[NAMEDATALEN];
+
+ elog(DEBUG3, "InitPostgres");
+
+ /*
+ * Add my PGPROC struct to the ProcArray.
+ *
+ * Once I have done this, I am visible to other backends!
+ */
+ InitProcessPhase2();
+
+ /*
+ * Initialize my entry in the shared-invalidation manager's array of
+ * per-backend data.
+ *
+ * Sets up MyBackendId, a unique backend identifier.
+ */
+ MyBackendId = InvalidBackendId;
+
+ SharedInvalBackendInit(false);
+
+ if (MyBackendId > MaxBackends || MyBackendId <= 0)
+ elog(FATAL, "bad backend ID: %d", MyBackendId);
+
+ /* Now that we have a BackendId, we can participate in ProcSignal */
+ ProcSignalInit(MyBackendId);
+
+ /*
+ * Also set up timeout handlers needed for backend operation. We need
+ * these in every case except bootstrap.
+ */
+ if (!bootstrap)
+ {
+ RegisterTimeout(DEADLOCK_TIMEOUT, CheckDeadLockAlert);
+ RegisterTimeout(STATEMENT_TIMEOUT, StatementTimeoutHandler);
+ RegisterTimeout(LOCK_TIMEOUT, LockTimeoutHandler);
+ RegisterTimeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
+ IdleInTransactionSessionTimeoutHandler);
+ RegisterTimeout(IDLE_SESSION_TIMEOUT, IdleSessionTimeoutHandler);
+ RegisterTimeout(CLIENT_CONNECTION_CHECK_TIMEOUT, ClientCheckTimeoutHandler);
+ RegisterTimeout(IDLE_STATS_UPDATE_TIMEOUT,
+ IdleStatsUpdateTimeoutHandler);
+ }
+
+ /*
+ * If this is either a bootstrap process or a standalone backend, start up
+ * the XLOG machinery, and register to have it closed down at exit. In
+ * other cases, the startup process is responsible for starting up the
+ * XLOG machinery, and the checkpointer for closing it down.
+ */
+ if (!IsUnderPostmaster)
+ {
+ /*
+ * We don't yet have an aux-process resource owner, but StartupXLOG
+ * and ShutdownXLOG will need one. Hence, create said resource owner
+ * (and register a callback to clean it up after ShutdownXLOG runs).
+ */
+ CreateAuxProcessResourceOwner();
+
+ StartupXLOG();
+ /* Release (and warn about) any buffer pins leaked in StartupXLOG */
+ ReleaseAuxProcessResources(true);
+ /* Reset CurrentResourceOwner to nothing for the moment */
+ CurrentResourceOwner = NULL;
+
+ /*
+ * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM
+ * segments etc to work (which in turn is required for pgstats).
+ */
+ before_shmem_exit(pgstat_before_server_shutdown, 0);
+ before_shmem_exit(ShutdownXLOG, 0);
+ }
+
+ /*
+ * Initialize the relation cache and the system catalog caches. Note that
+ * no catalog access happens here; we only set up the hashtable structure.
+ * We must do this before starting a transaction because transaction abort
+ * would try to touch these hashtables.
+ */
+ RelationCacheInitialize();
+ InitCatalogCache();
+ InitPlanCache();
+
+ /* Initialize portal manager */
+ EnablePortalManager();
+
+ /* Initialize status reporting */
+ pgstat_beinit();
+
+ /*
+ * Load relcache entries for the shared system catalogs. This must create
+ * at least entries for pg_database and catalogs used for authentication.
+ */
+ RelationCacheInitializePhase2();
+
+ /*
+ * Set up process-exit callback to do pre-shutdown cleanup. This is the
+ * one of the first before_shmem_exit callbacks we register; thus, this
+ * will be one the last things we do before low-level modules like the
+ * buffer manager begin to close down. We need to have this in place
+ * before we begin our first transaction --- if we fail during the
+ * initialization transaction, as is entirely possible, we need the
+ * AbortTransaction call to clean up.
+ */
+ before_shmem_exit(ShutdownPostgres, 0);
+
+ /* The autovacuum launcher is done here */
+ if (IsAutoVacuumLauncherProcess())
+ {
+ /* report this backend in the PgBackendStatus array */
+ pgstat_bestart();
+
+ return;
+ }
+
+ /*
+ * Start a new transaction here before first access to db, and get a
+ * snapshot. We don't have a use for the snapshot itself, but we're
+ * interested in the secondary effect that it sets RecentGlobalXmin. (This
+ * is critical for anything that reads heap pages, because HOT may decide
+ * to prune them even if the process doesn't attempt to modify any
+ * tuples.)
+ *
+ * FIXME: This comment is inaccurate / the code buggy. A snapshot that is
+ * not pushed/active does not reliably prevent HOT pruning (->xmin could
+ * e.g. be cleared when cache invalidations are processed).
+ */
+ if (!bootstrap)
+ {
+ /* statement_timestamp must be set for timeouts to work correctly */
+ SetCurrentStatementStartTimestamp();
+ StartTransactionCommand();
+
+ /*
+ * transaction_isolation will have been set to the default by the
+ * above. If the default is "serializable", and we are in hot
+ * standby, we will fail if we don't change it to something lower.
+ * Fortunately, "read committed" is plenty good enough.
+ */
+ XactIsoLevel = XACT_READ_COMMITTED;
+
+ (void) GetTransactionSnapshot();
+ }
+
+ /*
+ * Perform client authentication if necessary, then figure out our
+ * postgres user ID, and see if we are a superuser.
+ *
+ * In standalone mode and in autovacuum worker processes, we use a fixed
+ * ID, otherwise we figure it out from the authenticated user name.
+ */
+ if (bootstrap || IsAutoVacuumWorkerProcess())
+ {
+ InitializeSessionUserIdStandalone();
+ am_superuser = true;
+ }
+ else if (!IsUnderPostmaster)
+ {
+ InitializeSessionUserIdStandalone();
+ am_superuser = true;
+ if (!ThereIsAtLeastOneRole())
+ ereport(WARNING,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("no roles are defined in this database system"),
+ errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
+ username != NULL ? username : "postgres")));
+ }
+ else if (IsBackgroundWorker)
+ {
+ if (username == NULL && !OidIsValid(useroid))
+ {
+ InitializeSessionUserIdStandalone();
+ am_superuser = true;
+ }
+ else
+ {
+ InitializeSessionUserId(username, useroid);
+ am_superuser = superuser();
+ }
+ }
+ else
+ {
+ /* normal multiuser case */
+ Assert(MyProcPort != NULL);
+ PerformAuthentication(MyProcPort);
+ InitializeSessionUserId(username, useroid);
+ am_superuser = superuser();
+ }
+
+ /*
+ * Binary upgrades only allowed super-user connections
+ */
+ if (IsBinaryUpgrade && !am_superuser)
+ {
+ ereport(FATAL,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser to connect in binary upgrade mode")));
+ }
+
+ /*
+ * The last few connection slots are reserved for superusers. Replication
+ * connections are drawn from slots reserved with max_wal_senders and not
+ * limited by max_connections or superuser_reserved_connections.
+ */
+ if (!am_superuser && !am_walsender &&
+ ReservedBackends > 0 &&
+ !HaveNFreeProcs(ReservedBackends))
+ ereport(FATAL,
+ (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
+ errmsg("remaining connection slots are reserved for non-replication superuser connections")));
+
+ /* Check replication permissions needed for walsender processes. */
+ if (am_walsender)
+ {
+ Assert(!bootstrap);
+
+ if (!superuser() && !has_rolreplication(GetUserId()))
+ ereport(FATAL,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser or replication role to start walsender")));
+ }
+
+ /*
+ * If this is a plain walsender only supporting physical replication, we
+ * don't want to connect to any particular database. Just finish the
+ * backend startup by processing any options from the startup packet, and
+ * we're done.
+ */
+ if (am_walsender && !am_db_walsender)
+ {
+ /* process any options passed in the startup packet */
+ if (MyProcPort != NULL)
+ process_startup_options(MyProcPort, am_superuser);
+
+ /* Apply PostAuthDelay as soon as we've read all options */
+ if (PostAuthDelay > 0)
+ pg_usleep(PostAuthDelay * 1000000L);
+
+ /* initialize client encoding */
+ InitializeClientEncoding();
+
+ /* report this backend in the PgBackendStatus array */
+ pgstat_bestart();
+
+ /* close the transaction we started above */
+ CommitTransactionCommand();
+
+ return;
+ }
+
+ /*
+ * Set up the global variables holding database id and default tablespace.
+ * But note we won't actually try to touch the database just yet.
+ *
+ * We take a shortcut in the bootstrap case, otherwise we have to look up
+ * the db's entry in pg_database.
+ */
+ if (bootstrap)
+ {
+ dboid = Template1DbOid;
+ MyDatabaseTableSpace = DEFAULTTABLESPACE_OID;
+ }
+ else if (in_dbname != NULL)
+ {
+ HeapTuple tuple;
+ Form_pg_database dbform;
+
+ tuple = GetDatabaseTuple(in_dbname);
+ if (!HeapTupleIsValid(tuple))
+ ereport(FATAL,
+ (errcode(ERRCODE_UNDEFINED_DATABASE),
+ errmsg("database \"%s\" does not exist", in_dbname)));
+ dbform = (Form_pg_database) GETSTRUCT(tuple);
+ dboid = dbform->oid;
+ }
+ else if (!OidIsValid(dboid))
+ {
+ /*
+ * If this is a background worker not bound to any particular
+ * database, we're done now. Everything that follows only makes sense
+ * if we are bound to a specific database. We do need to close the
+ * transaction we started before returning.
+ */
+ if (!bootstrap)
+ {
+ pgstat_bestart();
+ CommitTransactionCommand();
+ }
+ return;
+ }
+
+ /*
+ * Now, take a writer's lock on the database we are trying to connect to.
+ * If there is a concurrently running DROP DATABASE on that database, this
+ * will block us until it finishes (and has committed its update of
+ * pg_database).
+ *
+ * Note that the lock is not held long, only until the end of this startup
+ * transaction. This is OK since we will advertise our use of the
+ * database in the ProcArray before dropping the lock (in fact, that's the
+ * next thing to do). Anyone trying a DROP DATABASE after this point will
+ * see us in the array once they have the lock. Ordering is important for
+ * this because we don't want to advertise ourselves as being in this
+ * database until we have the lock; otherwise we create what amounts to a
+ * deadlock with CountOtherDBBackends().
+ *
+ * Note: use of RowExclusiveLock here is reasonable because we envision
+ * our session as being a concurrent writer of the database. If we had a
+ * way of declaring a session as being guaranteed-read-only, we could use
+ * AccessShareLock for such sessions and thereby not conflict against
+ * CREATE DATABASE.
+ */
+ if (!bootstrap)
+ LockSharedObject(DatabaseRelationId, dboid, 0, RowExclusiveLock);
+
+ /*
+ * Recheck pg_database to make sure the target database hasn't gone away.
+ * If there was a concurrent DROP DATABASE, this ensures we will die
+ * cleanly without creating a mess.
+ */
+ if (!bootstrap)
+ {
+ HeapTuple tuple;
+ Form_pg_database datform;
+
+ tuple = GetDatabaseTupleByOid(dboid);
+ if (HeapTupleIsValid(tuple))
+ datform = (Form_pg_database) GETSTRUCT(tuple);
+
+ if (!HeapTupleIsValid(tuple) ||
+ (in_dbname && namestrcmp(&datform->datname, in_dbname)))
+ {
+ if (in_dbname)
+ ereport(FATAL,
+ (errcode(ERRCODE_UNDEFINED_DATABASE),
+ errmsg("database \"%s\" does not exist", in_dbname),
+ errdetail("It seems to have just been dropped or renamed.")));
+ else
+ ereport(FATAL,
+ (errcode(ERRCODE_UNDEFINED_DATABASE),
+ errmsg("database %u does not exist", dboid)));
+ }
+
+ strlcpy(dbname, NameStr(datform->datname), sizeof(dbname));
+
+ if (database_is_invalid_form(datform))
+ {
+ ereport(FATAL,
+ errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("cannot connect to invalid database \"%s\"", dbname),
+ errhint("Use DROP DATABASE to drop invalid databases."));
+ }
+
+ MyDatabaseTableSpace = datform->dattablespace;
+ /* pass the database name back to the caller */
+ if (out_dbname)
+ strcpy(out_dbname, dbname);
+ }
+
+ /*
+ * Now that we rechecked, we are certain to be connected to a database and
+ * thus can set MyDatabaseId.
+ *
+ * It is important that MyDatabaseId only be set once we are sure that the
+ * target database can no longer be concurrently dropped or renamed. For
+ * example, without this guarantee, pgstat_update_dbstats() could create
+ * entries for databases that were just dropped in the pgstat shutdown
+ * callback, which could confuse other code paths like the autovacuum
+ * scheduler.
+ */
+ MyDatabaseId = dboid;
+
+ /*
+ * Now we can mark our PGPROC entry with the database ID.
+ *
+ * We assume this is an atomic store so no lock is needed; though actually
+ * things would work fine even if it weren't atomic. Anyone searching the
+ * ProcArray for this database's ID should hold the database lock, so they
+ * would not be executing concurrently with this store. A process looking
+ * for another database's ID could in theory see a chance match if it read
+ * a partially-updated databaseId value; but as long as all such searches
+ * wait and retry, as in CountOtherDBBackends(), they will certainly see
+ * the correct value on their next try.
+ */
+ MyProc->databaseId = MyDatabaseId;
+
+ /*
+ * We established a catalog snapshot while reading pg_authid and/or
+ * pg_database; but until we have set up MyDatabaseId, we won't react to
+ * incoming sinval messages for unshared catalogs, so we won't realize it
+ * if the snapshot has been invalidated. Assume it's no good anymore.
+ */
+ InvalidateCatalogSnapshot();
+
+ /*
+ * Now we should be able to access the database directory safely. Verify
+ * it's there and looks reasonable.
+ */
+ fullpath = GetDatabasePath(MyDatabaseId, MyDatabaseTableSpace);
+
+ if (!bootstrap)
+ {
+ if (access(fullpath, F_OK) == -1)
+ {
+ if (errno == ENOENT)
+ ereport(FATAL,
+ (errcode(ERRCODE_UNDEFINED_DATABASE),
+ errmsg("database \"%s\" does not exist",
+ dbname),
+ errdetail("The database subdirectory \"%s\" is missing.",
+ fullpath)));
+ else
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not access directory \"%s\": %m",
+ fullpath)));
+ }
+
+ ValidatePgVersion(fullpath);
+ }
+
+ SetDatabasePath(fullpath);
+ pfree(fullpath);
+
+ /*
+ * It's now possible to do real access to the system catalogs.
+ *
+ * Load relcache entries for the system catalogs. This must create at
+ * least the minimum set of "nailed-in" cache entries.
+ */
+ RelationCacheInitializePhase3();
+
+ /* set up ACL framework (so CheckMyDatabase can check permissions) */
+ initialize_acl();
+
+ /*
+ * Re-read the pg_database row for our database, check permissions and set
+ * up database-specific GUC settings. We can't do this until all the
+ * database-access infrastructure is up. (Also, it wants to know if the
+ * user is a superuser, so the above stuff has to happen first.)
+ */
+ if (!bootstrap)
+ CheckMyDatabase(dbname, am_superuser, override_allow_connections);
+
+ /*
+ * Now process any command-line switches and any additional GUC variable
+ * settings passed in the startup packet. We couldn't do this before
+ * because we didn't know if client is a superuser.
+ */
+ if (MyProcPort != NULL)
+ process_startup_options(MyProcPort, am_superuser);
+
+ /* Process pg_db_role_setting options */
+ process_settings(MyDatabaseId, GetSessionUserId());
+
+ /* Apply PostAuthDelay as soon as we've read all options */
+ if (PostAuthDelay > 0)
+ pg_usleep(PostAuthDelay * 1000000L);
+
+ /*
+ * Initialize various default states that can't be set up until we've
+ * selected the active user and gotten the right GUC settings.
+ */
+
+ /* set default namespace search path */
+ InitializeSearchPath();
+
+ /* initialize client encoding */
+ InitializeClientEncoding();
+
+ /* Initialize this backend's session state. */
+ InitializeSession();
+
+ /*
+ * If this is an interactive session, load any libraries that should be
+ * preloaded at backend start. Since those are determined by GUCs, this
+ * can't happen until GUC settings are complete, but we want it to happen
+ * during the initial transaction in case anything that requires database
+ * access needs to be done.
+ */
+ if (load_session_libraries)
+ process_session_preload_libraries();
+
+ /* report this backend in the PgBackendStatus array */
+ if (!bootstrap)
+ pgstat_bestart();
+
+ /* close the transaction we started above */
+ if (!bootstrap)
+ CommitTransactionCommand();
+}
+
+/*
+ * Process any command-line switches and any additional GUC variable
+ * settings passed in the startup packet.
+ */
+static void
+process_startup_options(Port *port, bool am_superuser)
+{
+ GucContext gucctx;
+ ListCell *gucopts;
+
+ gucctx = am_superuser ? PGC_SU_BACKEND : PGC_BACKEND;
+
+ /*
+ * First process any command-line switches that were included in the
+ * startup packet, if we are in a regular backend.
+ */
+ if (port->cmdline_options != NULL)
+ {
+ /*
+ * The maximum possible number of commandline arguments that could
+ * come from port->cmdline_options is (strlen + 1) / 2; see
+ * pg_split_opts().
+ */
+ char **av;
+ int maxac;
+ int ac;
+
+ maxac = 2 + (strlen(port->cmdline_options) + 1) / 2;
+
+ av = (char **) palloc(maxac * sizeof(char *));
+ ac = 0;
+
+ av[ac++] = "postgres";
+
+ pg_split_opts(av, &ac, port->cmdline_options);
+
+ av[ac] = NULL;
+
+ Assert(ac < maxac);
+
+ (void) process_postgres_switches(ac, av, gucctx, NULL);
+ }
+
+ /*
+ * Process any additional GUC variable settings passed in startup packet.
+ * These are handled exactly like command-line variables.
+ */
+ gucopts = list_head(port->guc_options);
+ while (gucopts)
+ {
+ char *name;
+ char *value;
+
+ name = lfirst(gucopts);
+ gucopts = lnext(port->guc_options, gucopts);
+
+ value = lfirst(gucopts);
+ gucopts = lnext(port->guc_options, gucopts);
+
+ SetConfigOption(name, value, gucctx, PGC_S_CLIENT);
+ }
+}
+
+/*
+ * Load GUC settings from pg_db_role_setting.
+ *
+ * We try specific settings for the database/role combination, as well as
+ * general for this database and for this user.
+ */
+static void
+process_settings(Oid databaseid, Oid roleid)
+{
+ Relation relsetting;
+ Snapshot snapshot;
+
+ if (!IsUnderPostmaster)
+ return;
+
+ relsetting = table_open(DbRoleSettingRelationId, AccessShareLock);
+
+ /* read all the settings under the same snapshot for efficiency */
+ snapshot = RegisterSnapshot(GetCatalogSnapshot(DbRoleSettingRelationId));
+
+ /* Later settings are ignored if set earlier. */
+ ApplySetting(snapshot, databaseid, roleid, relsetting, PGC_S_DATABASE_USER);
+ ApplySetting(snapshot, InvalidOid, roleid, relsetting, PGC_S_USER);
+ ApplySetting(snapshot, databaseid, InvalidOid, relsetting, PGC_S_DATABASE);
+ ApplySetting(snapshot, InvalidOid, InvalidOid, relsetting, PGC_S_GLOBAL);
+
+ UnregisterSnapshot(snapshot);
+ table_close(relsetting, AccessShareLock);
+}
+
+/*
+ * Backend-shutdown callback. Do cleanup that we want to be sure happens
+ * before all the supporting modules begin to nail their doors shut via
+ * their own callbacks.
+ *
+ * User-level cleanup, such as temp-relation removal and UNLISTEN, happens
+ * via separate callbacks that execute before this one. We don't combine the
+ * callbacks because we still want this one to happen if the user-level
+ * cleanup fails.
+ */
+static void
+ShutdownPostgres(int code, Datum arg)
+{
+ /* Make sure we've killed any active transaction */
+ AbortOutOfAnyTransaction();
+
+ /*
+ * User locks are not released by transaction end, so be sure to release
+ * them explicitly.
+ */
+ LockReleaseAll(USER_LOCKMETHOD, true);
+}
+
+
+/*
+ * STATEMENT_TIMEOUT handler: trigger a query-cancel interrupt.
+ */
+static void
+StatementTimeoutHandler(void)
+{
+ int sig = SIGINT;
+
+ /*
+ * During authentication the timeout is used to deal with
+ * authentication_timeout - we want to quit in response to such timeouts.
+ */
+ if (ClientAuthInProgress)
+ sig = SIGTERM;
+
+#ifdef HAVE_SETSID
+ /* try to signal whole process group */
+ kill(-MyProcPid, sig);
+#endif
+ kill(MyProcPid, sig);
+}
+
+/*
+ * LOCK_TIMEOUT handler: trigger a query-cancel interrupt.
+ */
+static void
+LockTimeoutHandler(void)
+{
+#ifdef HAVE_SETSID
+ /* try to signal whole process group */
+ kill(-MyProcPid, SIGINT);
+#endif
+ kill(MyProcPid, SIGINT);
+}
+
+static void
+IdleInTransactionSessionTimeoutHandler(void)
+{
+ IdleInTransactionSessionTimeoutPending = true;
+ InterruptPending = true;
+ SetLatch(MyLatch);
+}
+
+static void
+IdleSessionTimeoutHandler(void)
+{
+ IdleSessionTimeoutPending = true;
+ InterruptPending = true;
+ SetLatch(MyLatch);
+}
+
+static void
+IdleStatsUpdateTimeoutHandler(void)
+{
+ IdleStatsUpdateTimeoutPending = true;
+ InterruptPending = true;
+ SetLatch(MyLatch);
+}
+
+static void
+ClientCheckTimeoutHandler(void)
+{
+ CheckClientConnectionPending = true;
+ InterruptPending = true;
+ SetLatch(MyLatch);
+}
+
+/*
+ * Returns true if at least one role is defined in this database cluster.
+ */
+static bool
+ThereIsAtLeastOneRole(void)
+{
+ Relation pg_authid_rel;
+ TableScanDesc scan;
+ bool result;
+
+ pg_authid_rel = table_open(AuthIdRelationId, AccessShareLock);
+
+ scan = table_beginscan_catalog(pg_authid_rel, 0, NULL);
+ result = (heap_getnext(scan, ForwardScanDirection) != NULL);
+
+ table_endscan(scan);
+ table_close(pg_authid_rel, AccessShareLock);
+
+ return result;
+}
diff --git a/src/backend/utils/mb/Makefile b/src/backend/utils/mb/Makefile
new file mode 100644
index 0000000..b19a125
--- /dev/null
+++ b/src/backend/utils/mb/Makefile
@@ -0,0 +1,25 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/mb
+#
+# IDENTIFICATION
+# src/backend/utils/mb/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/mb
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ conv.o \
+ mbutils.o \
+ stringinfo_mb.o \
+ wstrcmp.o \
+ wstrncmp.o
+
+include $(top_srcdir)/src/backend/common.mk
+
+clean distclean maintainer-clean:
+ $(MAKE) -C conversion_procs $@
diff --git a/src/backend/utils/mb/README b/src/backend/utils/mb/README
new file mode 100644
index 0000000..ef36626
--- /dev/null
+++ b/src/backend/utils/mb/README
@@ -0,0 +1,23 @@
+src/backend/utils/mb/README
+
+Encodings
+=========
+
+conv.c: static functions and a public table for code conversion
+mbutils.c: public functions for the backend only.
+stringinfo_mb.c: public backend-only multibyte-aware stringinfo functions
+wstrcmp.c: strcmp for mb
+wstrncmp.c: strncmp for mb
+win866.c: a tool to generate KOI8 <--> CP866 conversion table
+iso.c: a tool to generate KOI8 <--> ISO8859-5 conversion table
+win1251.c: a tool to generate KOI8 <--> CP1251 conversion table
+
+See also in src/common/:
+
+encnames.c: public functions for encoding names
+wchar.c: mostly static functions and a public table for mb string and
+ multibyte conversion
+
+Introduction
+------------
+ http://www.cprogramming.com/tutorial/unicode.html
diff --git a/src/backend/utils/mb/Unicode/Makefile b/src/backend/utils/mb/Unicode/Makefile
new file mode 100644
index 0000000..f67b1cf
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/Makefile
@@ -0,0 +1,102 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/backend/utils/mb/Unicode
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/mb/Unicode
+top_builddir = ../../../../..
+include $(top_builddir)/src/Makefile.global
+
+
+# Define a rule to create the map files from downloaded text input
+# files using a script. Arguments:
+#
+# 1: encoding name used in output files (lower case)
+# 2: script name
+# 3: input text files
+# 4: argument to pass to script (optional)
+#
+# We also collect all the input and output files in variables to
+# define the build and clean rules below.
+#
+# Note that while each script call produces two output files, to be
+# parallel-make safe we need to split this into two rules. (See for
+# example gram.y for more explanation.)
+#
+define map_rule
+MAPS += $(1)_to_utf8.map utf8_to_$(1).map
+ALL_TEXTS += $(3)
+
+$(1)_to_utf8.map: $(2) $(3)
+ $(PERL) -I $$(srcdir) $$< $(4)
+
+utf8_to_$(1).map: $(1)_to_utf8.map
+ @touch $$@
+endef
+
+$(foreach n,2 3 4 5 6 7 8 9 10 13 14 15 16,$(eval $(call map_rule,iso8859_$(n),UCS_to_most.pl,8859-$(n).TXT,ISO8859_$(n))))
+
+$(foreach n,866 874 1250 1251 1252 1253 1254 1255 1256 1257 1258,$(eval $(call map_rule,win$(n),UCS_to_most.pl,CP$(n).TXT,WIN$(n))))
+
+$(eval $(call map_rule,koi8r,UCS_to_most.pl,KOI8-R.TXT,KOI8R))
+$(eval $(call map_rule,koi8u,UCS_to_most.pl,KOI8-U.TXT,KOI8U))
+$(eval $(call map_rule,gbk,UCS_to_most.pl,CP936.TXT,GBK))
+
+$(eval $(call map_rule,johab,UCS_to_JOHAB.pl,JOHAB.TXT))
+$(eval $(call map_rule,uhc,UCS_to_UHC.pl,windows-949-2000.xml))
+$(eval $(call map_rule,euc_jp,UCS_to_EUC_JP.pl,CP932.TXT JIS0212.TXT))
+$(eval $(call map_rule,euc_cn,UCS_to_EUC_CN.pl,gb-18030-2000.xml))
+$(eval $(call map_rule,euc_kr,UCS_to_EUC_KR.pl,KSX1001.TXT))
+$(eval $(call map_rule,euc_tw,UCS_to_EUC_TW.pl,CNS11643.TXT))
+$(eval $(call map_rule,sjis,UCS_to_SJIS.pl,CP932.TXT))
+$(eval $(call map_rule,gb18030,UCS_to_GB18030.pl,gb-18030-2000.xml))
+$(eval $(call map_rule,big5,UCS_to_BIG5.pl,CP950.TXT BIG5.TXT CP950.TXT))
+$(eval $(call map_rule,euc_jis_2004,UCS_to_EUC_JIS_2004.pl,euc-jis-2004-std.txt))
+$(eval $(call map_rule,shift_jis_2004,UCS_to_SHIFT_JIS_2004.pl,sjis-0213-2004-std.txt))
+
+# remove duplicates
+TEXTS = $(sort $(ALL_TEXTS))
+
+all: $(MAPS)
+
+distclean: clean
+ rm -f $(TEXTS)
+
+maintainer-clean: distclean
+ rm -f $(MAPS)
+
+
+BIG5.TXT CNS11643.TXT:
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/$(@F)
+
+euc-jis-2004-std.txt sjis-0213-2004-std.txt:
+ $(DOWNLOAD) http://x0213.org/codetable/$(@F)
+
+gb-18030-2000.xml windows-949-2000.xml:
+ $(DOWNLOAD) https://raw.githubusercontent.com/unicode-org/icu-data/master/charset/data/xml/$(@F)
+
+GB2312.TXT:
+ $(DOWNLOAD) 'http://trac.greenstone.org/browser/trunk/gsdl/unicode/MAPPINGS/EASTASIA/GB/GB2312.TXT?rev=1842&format=txt'
+
+JIS0212.TXT:
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/$(@F)
+
+JOHAB.TXT KSX1001.TXT:
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/$(@F)
+
+KOI8-R.TXT KOI8-U.TXT:
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/$(@F)
+
+$(filter 8859-%.TXT,$(TEXTS)):
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/ISO8859/$(@F)
+
+$(filter CP9%.TXT CP12%.TXT,$(TEXTS)):
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/$(@F)
+
+$(filter CP8%.TXT,$(TEXTS)):
+ $(DOWNLOAD) https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/$(@F)
diff --git a/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl b/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl
new file mode 100755
index 0000000..e1c801a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl
@@ -0,0 +1,79 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_BIG5.pl
+#
+# Generate UTF-8 <--> BIG5 conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain the map files from the organization's download site.
+# https://www.unicode.org/Public/MAPPINGS/
+#
+# Our "big5" comes from BIG5.TXT, with the addition of the characters
+# in the range 0xf9d6-0xf9dc from CP950.TXT.
+#
+# BIG5.TXT format:
+# BIG5 code in hex
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+#
+# CP950.TXT format:
+# CP950 code in hex
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_BIG5.pl';
+
+# Load BIG5.TXT
+my $all = &read_source("BIG5.TXT");
+
+# Load CP950.TXT
+my $cp950txt = &read_source("CP950.TXT");
+
+foreach my $i (@$cp950txt)
+{
+ my $code = $i->{code};
+ my $ucs = $i->{ucs};
+
+ # Pick only the ETEN extended characters in the range 0xf9d6 - 0xf9dc
+ # from CP950.TXT
+ if ( $code >= 0x80
+ && $ucs >= 0x0080
+ && $code >= 0xf9d6
+ && $code <= 0xf9dc)
+ {
+ push @$all,
+ {
+ code => $code,
+ ucs => $ucs,
+ comment => $i->{comment},
+ direction => BOTH,
+ f => $i->{f},
+ l => $i->{l}
+ };
+ }
+}
+
+foreach my $i (@$all)
+{
+ my $code = $i->{code};
+ my $ucs = $i->{ucs};
+
+ # BIG5.TXT maps several BIG5 characters to U+FFFD. The UTF-8 to BIG5 mapping can
+ # contain only one of them. XXX: Doesn't really make sense to include any of them,
+ # but for historical reasons, we map the first one of them.
+ if ($i->{ucs} == 0xFFFD && $i->{code} != 0xA15A)
+ {
+ $i->{direction} = TO_UNICODE;
+ }
+}
+
+# Output
+print_conversion_tables($this_script, "BIG5", $all);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl
new file mode 100755
index 0000000..ea97e07
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl
@@ -0,0 +1,85 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2007-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_GB18030.pl
+#
+# Generate UTF-8 <--> GB18030 code conversion tables from
+# "gb-18030-2000.xml", obtained from
+# http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/
+#
+# The lines we care about in the source file look like
+# <a u="009A" b="81 30 83 36"/>
+# where the "u" field is the Unicode code point in hex,
+# and the "b" field is the hex byte sequence for GB18030
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl';
+
+# Read the input
+
+my $in_file = "gb-18030-2000.xml";
+
+open(my $in, '<', $in_file) || die("cannot open $in_file");
+
+my @mapping;
+
+while (<$in>)
+{
+ next if (!m/<a u="([0-9A-F]+)" b="([0-9A-F ]+)"/);
+ my ($u, $c) = ($1, $2);
+ $c =~ s/ //g;
+ my $ucs = hex($u);
+ my $code = hex($c);
+
+ # The GB-18030 character set, which we use as the source, contains
+ # a lot of extra characters on top of the GB2312 character set that
+ # EUC_CN encodes. Filter out those extra characters.
+ next if (($code & 0xFF) < 0xA1);
+ next
+ if (
+ !( $code >= 0xA100 && $code <= 0xA9FF
+ || $code >= 0xB000 && $code <= 0xF7FF));
+
+ next if ($code >= 0xA2A1 && $code <= 0xA2B0);
+ next if ($code >= 0xA2E3 && $code <= 0xA2E4);
+ next if ($code >= 0xA2EF && $code <= 0xA2F0);
+ next if ($code >= 0xA2FD && $code <= 0xA2FE);
+ next if ($code >= 0xA4F4 && $code <= 0xA4FE);
+ next if ($code >= 0xA5F7 && $code <= 0xA5FE);
+ next if ($code >= 0xA6B9 && $code <= 0xA6C0);
+ next if ($code >= 0xA6D9 && $code <= 0xA6FE);
+ next if ($code >= 0xA7C2 && $code <= 0xA7D0);
+ next if ($code >= 0xA7F2 && $code <= 0xA7FE);
+ next if ($code >= 0xA8BB && $code <= 0xA8C4);
+ next if ($code >= 0xA8EA && $code <= 0xA8FE);
+ next if ($code >= 0xA9A1 && $code <= 0xA9A3);
+ next if ($code >= 0xA9F0 && $code <= 0xA9FE);
+ next if ($code >= 0xD7FA && $code <= 0xD7FE);
+
+ # A couple of characters are mapped differently from GB-2312 or GB-18030
+ if ($code == 0xA1A4)
+ {
+ $ucs = 0x30FB;
+ }
+ if ($code == 0xA1AA)
+ {
+ $ucs = 0x2015;
+ }
+
+ push @mapping,
+ {
+ ucs => $ucs,
+ code => $code,
+ direction => BOTH,
+ f => $in_file,
+ l => $.
+ };
+}
+close($in);
+
+print_conversion_tables($this_script, "EUC_CN", \@mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl
new file mode 100755
index 0000000..0b2488d
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl
@@ -0,0 +1,72 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2007-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl
+#
+# Generate UTF-8 <--> EUC_JIS_2004 code conversion tables from
+# "euc-jis-2004-std.txt" (http://x0213.org)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl';
+
+# first generate UTF-8 --> EUC_JIS_2004 table
+
+my $in_file = "euc-jis-2004-std.txt";
+
+open(my $in, '<', $in_file) || die("cannot open $in_file");
+
+my @all;
+
+while (my $line = <$in>)
+{
+ if ($line =~ /^0x(\w+)\s*U\+(\w+)\+(\w+)\s*#\s*(\S.*)?\s*$/)
+ {
+
+ # combined characters
+ my ($c, $u1, $u2) = ($1, $2, $3);
+ # The "\t \t" below is just to avoid insubstantial diffs.
+ my $rest = "U+" . $u1 . "+" . $u2 . "\t \t" . $4;
+ my $code = hex($c);
+ my $ucs1 = hex($u1);
+ my $ucs2 = hex($u2);
+
+ push @all,
+ {
+ direction => BOTH,
+ ucs => $ucs1,
+ ucs_second => $ucs2,
+ code => $code,
+ comment => $rest,
+ f => $in_file,
+ l => $.
+ };
+ }
+ elsif ($line =~ /^0x(\w+)\s*U\+(\w+)\s*#\s*(\S.*)?\s*$/)
+ {
+
+ # non-combined characters
+ my ($c, $u, $rest) = ($1, $2, "U+" . $2 . $3);
+ my $ucs = hex($u);
+ my $code = hex($c);
+
+ next if ($code < 0x80 && $ucs < 0x80);
+
+ push @all,
+ {
+ direction => BOTH,
+ ucs => $ucs,
+ code => $code,
+ comment => $rest,
+ f => $in_file,
+ l => $.
+ };
+ }
+}
+close($in);
+
+print_conversion_tables($this_script, "EUC_JIS_2004", \@all);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl
new file mode 100755
index 0000000..c973769
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl
@@ -0,0 +1,678 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl
+#
+# Generate UTF-8 <--> EUC_JP code conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain CP932.TXT and JIS0212.TXT from the
+# organization's ftp site.
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl';
+
+# Load JIS0212.TXT
+my $jis0212 = &read_source("JIS0212.TXT");
+
+my @mapping;
+
+foreach my $i (@$jis0212)
+{
+
+ # We have a different mapping for this in the EUC_JP to UTF-8 direction.
+ if ($i->{code} == 0x2243)
+ {
+ $i->{direction} = FROM_UNICODE;
+ }
+
+ if ($i->{code} == 0x2271)
+ {
+ $i->{direction} = TO_UNICODE;
+ }
+
+ if ($i->{ucs} >= 0x080)
+ {
+ $i->{code} = $i->{code} | 0x8f8080;
+ }
+ else
+ {
+ next;
+ }
+
+ push @mapping, $i;
+}
+
+# Load CP932.TXT.
+my $ct932 = &read_source("CP932.TXT");
+
+foreach my $i (@$ct932)
+{
+ my $sjis = $i->{code};
+
+ # We have a different mapping for this in the EUC_JP to UTF-8 direction.
+ if ( $sjis == 0xeefa
+ || $sjis == 0xeefb
+ || $sjis == 0xeefc)
+ {
+ next;
+ }
+
+ if ($sjis >= 0xa1)
+ {
+ my $jis = &sjis2jis($sjis);
+
+ $i->{code} = $jis | (
+ $jis < 0x100
+ ? 0x8e00
+ : ($sjis >= 0xeffd ? 0x8f8080 : 0x8080));
+
+ # Remember the SJIS code for later.
+ $i->{sjis} = $sjis;
+
+ push @mapping, $i;
+ }
+}
+
+# extract only SJIS characters
+foreach my $i (grep defined $_->{sjis}, @mapping)
+{
+ my $sjis = $i->{sjis};
+
+ # These SJIS characters are excluded completely.
+ if ( $sjis >= 0xed00 && $sjis <= 0xeef9
+ || $sjis >= 0xfa54 && $sjis <= 0xfa56
+ || $sjis >= 0xfa58 && $sjis <= 0xfc4b)
+ {
+ $i->{direction} = NONE;
+ next;
+ }
+
+ # These SJIS characters are only in the UTF-8 to EUC_JP table
+ if ($sjis == 0xeefa || $sjis == 0xeefb || $sjis == 0xeefc)
+ {
+ $i->{direction} = FROM_UNICODE;
+ next;
+ }
+
+ if ( $sjis == 0x8790
+ || $sjis == 0x8791
+ || $sjis == 0x8792
+ || $sjis == 0x8795
+ || $sjis == 0x8796
+ || $sjis == 0x8797
+ || $sjis == 0x879a
+ || $sjis == 0x879b
+ || $sjis == 0x879c
+ || ($sjis >= 0xfa4a && $sjis <= 0xfa53))
+ {
+ $i->{direction} = TO_UNICODE;
+ next;
+ }
+}
+
+push @mapping, (
+ {
+ direction => BOTH,
+ ucs => 0x4efc,
+ code => 0x8ff4af,
+ comment => '# CJK(4EFC)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x50f4,
+ code => 0x8ff4b0,
+ comment => '# CJK(50F4)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x51EC,
+ code => 0x8ff4b1,
+ comment => '# CJK(51EC)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5307,
+ code => 0x8ff4b2,
+ comment => '# CJK(5307)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5324,
+ code => 0x8ff4b3,
+ comment => '# CJK(5324)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x548A,
+ code => 0x8ff4b5,
+ comment => '# CJK(548A)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5759,
+ code => 0x8ff4b6,
+ comment => '# CJK(5759)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x589E,
+ code => 0x8ff4b9,
+ comment => '# CJK(589E)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5BEC,
+ code => 0x8ff4ba,
+ comment => '# CJK(5BEC)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5CF5,
+ code => 0x8ff4bb,
+ comment => '# CJK(5CF5)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5D53,
+ code => 0x8ff4bc,
+ comment => '# CJK(5D53)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x5FB7,
+ code => 0x8ff4be,
+ comment => '# CJK(5FB7)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6085,
+ code => 0x8ff4bf,
+ comment => '# CJK(6085)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6120,
+ code => 0x8ff4c0,
+ comment => '# CJK(6120)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x654E,
+ code => 0x8ff4c1,
+ comment => '# CJK(654E)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x663B,
+ code => 0x8ff4c2,
+ comment => '# CJK(663B)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6665,
+ code => 0x8ff4c3,
+ comment => '# CJK(6665)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6801,
+ code => 0x8ff4c6,
+ comment => '# CJK(6801)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6A6B,
+ code => 0x8ff4c9,
+ comment => '# CJK(6A6B)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6AE2,
+ code => 0x8ff4ca,
+ comment => '# CJK(6AE2)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6DF2,
+ code => 0x8ff4cc,
+ comment => '# CJK(6DF2)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x6DF8,
+ code => 0x8ff4cb,
+ comment => '# CJK(6DF8)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7028,
+ code => 0x8ff4cd,
+ comment => '# CJK(7028)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x70BB,
+ code => 0x8ff4ae,
+ comment => '# CJK(70BB)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7501,
+ code => 0x8ff4d0,
+ comment => '# CJK(7501)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7682,
+ code => 0x8ff4d1,
+ comment => '# CJK(7682)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x769E,
+ code => 0x8ff4d2,
+ comment => '# CJK(769E)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7930,
+ code => 0x8ff4d4,
+ comment => '# CJK(7930)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7AE7,
+ code => 0x8ff4d9,
+ comment => '# CJK(7AE7)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7DA0,
+ code => 0x8ff4dc,
+ comment => '# CJK(7DA0)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x7DD6,
+ code => 0x8ff4dd,
+ comment => '# CJK(7DD6)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x8362,
+ code => 0x8ff4df,
+ comment => '# CJK(8362)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x85B0,
+ code => 0x8ff4e1,
+ comment => '# CJK(85B0)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x8807,
+ code => 0x8ff4e4,
+ comment => '# CJK(8807)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x8B7F,
+ code => 0x8ff4e6,
+ comment => '# CJK(8B7F)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x8CF4,
+ code => 0x8ff4e7,
+ comment => '# CJK(8CF4)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x8D76,
+ code => 0x8ff4e8,
+ comment => '# CJK(8D76)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x90DE,
+ code => 0x8ff4ec,
+ comment => '# CJK(90DE)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9115,
+ code => 0x8ff4ee,
+ comment => '# CJK(9115)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9592,
+ code => 0x8ff4f1,
+ comment => '# CJK(9592)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x973B,
+ code => 0x8ff4f4,
+ comment => '# CJK(973B)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x974D,
+ code => 0x8ff4f5,
+ comment => '# CJK(974D)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9751,
+ code => 0x8ff4f6,
+ comment => '# CJK(9751)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x999E,
+ code => 0x8ff4fa,
+ comment => '# CJK(999E)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9AD9,
+ code => 0x8ff4fb,
+ comment => '# CJK(9AD9)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9B72,
+ code => 0x8ff4fc,
+ comment => '# CJK(9B72)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0x9ED1,
+ code => 0x8ff4fe,
+ comment => '# CJK(9ED1)'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xF929,
+ code => 0x8ff4c5,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-F929'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xF9DC,
+ code => 0x8ff4f2,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-F9DC'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA0E,
+ code => 0x8ff4b4,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA0E'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA0F,
+ code => 0x8ff4b7,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA0F'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA10,
+ code => 0x8ff4b8,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA10'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA11,
+ code => 0x8ff4bd,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA11'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA12,
+ code => 0x8ff4c4,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA12'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA13,
+ code => 0x8ff4c7,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA13'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA14,
+ code => 0x8ff4c8,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA14'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA15,
+ code => 0x8ff4ce,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA15'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA16,
+ code => 0x8ff4cf,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA16'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA17,
+ code => 0x8ff4d3,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA17'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA18,
+ code => 0x8ff4d5,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA18'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA19,
+ code => 0x8ff4d6,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA19'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1A,
+ code => 0x8ff4d7,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1A'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1B,
+ code => 0x8ff4d8,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1B'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1C,
+ code => 0x8ff4da,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1C'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1D,
+ code => 0x8ff4db,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1D'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1E,
+ code => 0x8ff4de,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1E'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA1F,
+ code => 0x8ff4e0,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA1F'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA20,
+ code => 0x8ff4e2,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA20'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA21,
+ code => 0x8ff4e3,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA21'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA22,
+ code => 0x8ff4e5,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA22'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA23,
+ code => 0x8ff4e9,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA23'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA24,
+ code => 0x8ff4ea,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA24'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA25,
+ code => 0x8ff4eb,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA25'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA26,
+ code => 0x8ff4ed,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA26'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA27,
+ code => 0x8ff4ef,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA27'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA28,
+ code => 0x8ff4f0,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA28'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA29,
+ code => 0x8ff4f3,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA29'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA2A,
+ code => 0x8ff4f7,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA2A'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA2B,
+ code => 0x8ff4f8,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA2B'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA2C,
+ code => 0x8ff4f9,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA2C'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFA2D,
+ code => 0x8ff4fd,
+ comment => '# CJK COMPATIBILITY IDEOGRAPH-FA2D'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFF07,
+ code => 0x8ff4a9,
+ comment => '# FULLWIDTH APOSTROPHE'
+ },
+ {
+ direction => BOTH,
+ ucs => 0xFFE4,
+ code => 0x8fa2c3,
+ comment => '# FULLWIDTH BROKEN BAR'
+ },
+
+ # additional conversions for EUC_JP -> UTF-8 conversion
+ {
+ direction => TO_UNICODE,
+ ucs => 0x2116,
+ code => 0x8ff4ac,
+ comment => '# NUMERO SIGN'
+ },
+ {
+ direction => TO_UNICODE,
+ ucs => 0x2121,
+ code => 0x8ff4ad,
+ comment => '# TELEPHONE SIGN'
+ },
+ {
+ direction => TO_UNICODE,
+ ucs => 0x3231,
+ code => 0x8ff4ab,
+ comment => '# PARENTHESIZED IDEOGRAPH STOCK'
+ });
+
+print_conversion_tables($this_script, "EUC_JP", \@mapping);
+
+
+#######################################################################
+# sjis2jis ; SJIS => JIS conversion
+sub sjis2jis
+{
+ my ($sjis) = @_;
+
+ return $sjis if ($sjis <= 0x100);
+
+ my $hi = $sjis >> 8;
+ my $lo = $sjis & 0xff;
+
+ if ($lo >= 0x80) { $lo--; }
+ $lo -= 0x40;
+ if ($hi >= 0xe0) { $hi -= 0x40; }
+ $hi -= 0x81;
+ my $pos = $lo + $hi * 0xbc;
+
+ if ($pos >= 114 * 0x5e && $pos <= 115 * 0x5e + 0x1b)
+ {
+
+ # This region (115-ku) is out of range of JIS code but for
+ # convenient to generate code in EUC CODESET 3, move this to
+ # seemingly duplicate region (83-84-ku).
+ $pos = $pos - ((31 * 0x5e) + 12);
+
+ # after 85-ku 82-ten needs to be moved 2 codepoints
+ $pos = $pos - 2 if ($pos >= 84 * 0x5c + 82);
+ }
+
+ my $hi2 = $pos / 0x5e;
+ my $lo2 = ($pos % 0x5e);
+
+ my $ret = $lo2 + 0x21 + (($hi2 + 0x21) << 8);
+
+ return $ret;
+}
diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl
new file mode 100755
index 0000000..405b353
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl
@@ -0,0 +1,62 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl
+#
+# Generate UTF-8 <--> EUC_KR code conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain OLD5601.TXT from
+# the organization's ftp site.
+#
+# OLD5601.TXT format:
+# KSC5601 code in hex
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl';
+
+# Load the source file.
+
+my $mapping = &read_source("KSX1001.TXT");
+
+foreach my $i (@$mapping)
+{
+ $i->{code} = $i->{code} | 0x8080;
+}
+
+# Some extra characters that are not in KSX1001.TXT
+push @$mapping,
+ ( {
+ direction => BOTH,
+ ucs => 0x20AC,
+ code => 0xa2e6,
+ comment => '# EURO SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => BOTH,
+ ucs => 0x00AE,
+ code => 0xa2e7,
+ comment => '# REGISTERED SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => BOTH,
+ ucs => 0x327E,
+ code => 0xa2e8,
+ comment => '# CIRCLED HANGUL IEUNG U',
+ f => $this_script,
+ l => __LINE__
+ });
+
+print_conversion_tables($this_script, "EUC_KR", $mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl
new file mode 100755
index 0000000..e3b329b
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl
@@ -0,0 +1,71 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl
+#
+# Generate UTF-8 <--> EUC_TW code conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain CNS11643.TXT from
+# the organization's ftp site.
+#
+# CNS11643.TXT format:
+# CNS11643 code in hex (3 bytes)
+# (I guess the first byte means the plane No.)
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl';
+
+my $mapping = &read_source("CNS11643.TXT");
+
+my @extras;
+
+foreach my $i (@$mapping)
+{
+ my $ucs = $i->{ucs};
+ my $code = $i->{code};
+ my $origcode = $i->{code};
+
+ my $plane = ($code & 0x1f0000) >> 16;
+ if ($plane > 16)
+ {
+ printf STDERR "Warning: invalid plane No.$plane. ignored\n";
+ next;
+ }
+
+ if ($plane == 1)
+ {
+ $code = ($code & 0xffff) | 0x8080;
+ }
+ else
+ {
+ $code = (0x8ea00000 + ($plane << 16)) | (($code & 0xffff) | 0x8080);
+ }
+ $i->{code} = $code;
+
+ # Some codes are mapped twice in the EUC_TW to UTF-8 table.
+ if ($origcode >= 0x12121 && $origcode <= 0x20000)
+ {
+ push @extras,
+ {
+ ucs => $i->{ucs},
+ code => ($i->{code} + 0x8ea10000),
+ rest => $i->{rest},
+ direction => TO_UNICODE,
+ f => $i->{f},
+ l => $i->{l}
+ };
+ }
+}
+
+push @$mapping, @extras;
+
+print_conversion_tables($this_script, "EUC_TW", $mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl b/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl
new file mode 100755
index 0000000..a40c47c
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl
@@ -0,0 +1,52 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2007-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_GB18030.pl
+#
+# Generate UTF-8 <--> GB18030 code conversion tables from
+# "gb-18030-2000.xml", obtained from
+# http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/
+#
+# The lines we care about in the source file look like
+# <a u="009A" b="81 30 83 36"/>
+# where the "u" field is the Unicode code point in hex,
+# and the "b" field is the hex byte sequence for GB18030
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_GB18030.pl';
+
+# Read the input
+
+my $in_file = "gb-18030-2000.xml";
+
+open(my $in, '<', $in_file) || die("cannot open $in_file");
+
+my @mapping;
+
+while (<$in>)
+{
+ next if (!m/<a u="([0-9A-F]+)" b="([0-9A-F ]+)"/);
+ my ($u, $c) = ($1, $2);
+ $c =~ s/ //g;
+ my $ucs = hex($u);
+ my $code = hex($c);
+ if ($code >= 0x80 && $ucs >= 0x0080)
+ {
+ push @mapping,
+ {
+ ucs => $ucs,
+ code => $code,
+ direction => BOTH,
+ f => $in_file,
+ l => $.
+ };
+ }
+}
+close($in);
+
+print_conversion_tables($this_script, "GB18030", \@mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl b/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl
new file mode 100755
index 0000000..a24136a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl
@@ -0,0 +1,56 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl
+#
+# Generate UTF-8 <--> JOHAB conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain the map files from the organization's download site.
+# https://www.unicode.org/Public/MAPPINGS/
+# We assume the file include three tab-separated columns:
+# JOHAB code in hex
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl';
+
+# Load the source file.
+
+my $mapping = &read_source("JOHAB.TXT");
+
+# Some extra characters that are not in JOHAB.TXT
+push @$mapping,
+ ( {
+ direction => BOTH,
+ ucs => 0x20AC,
+ code => 0xd9e6,
+ comment => '# EURO SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => BOTH,
+ ucs => 0x00AE,
+ code => 0xd9e7,
+ comment => '# REGISTERED SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => BOTH,
+ ucs => 0x327E,
+ code => 0xd9e8,
+ comment => '# CIRCLED HANGUL IEUNG U',
+ f => $this_script,
+ l => __LINE__
+ });
+
+print_conversion_tables($this_script, "JOHAB", $mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl b/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl
new file mode 100755
index 0000000..96fc507
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl
@@ -0,0 +1,88 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2007-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl
+#
+# Generate UTF-8 <--> SHIFT_JIS_2004 code conversion tables from
+# "sjis-0213-2004-std.txt" (http://x0213.org)
+
+use strict;
+use warnings;
+
+use convutils;
+
+# first generate UTF-8 --> SHIFT_JIS_2004 table
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl';
+
+my $in_file = "sjis-0213-2004-std.txt";
+
+open(my $in, '<', $in_file) || die("cannot open $in_file");
+
+my @mapping;
+
+while (my $line = <$in>)
+{
+ if ($line =~ /^0x(\w+)\s*U\+(\w+)\+(\w+)\s*#\s*(\S.*)?\s*$/)
+ {
+
+ # combined characters
+ my ($c, $u1, $u2) = ($1, $2, $3);
+ # The "\t \t" below is just to avoid insubstantial diffs.
+ my $rest = "U+" . $u1 . "+" . $u2 . "\t \t" . $4;
+ my $code = hex($c);
+ my $ucs1 = hex($u1);
+ my $ucs2 = hex($u2);
+
+ push @mapping,
+ {
+ code => $code,
+ ucs => $ucs1,
+ ucs_second => $ucs2,
+ comment => $rest,
+ direction => BOTH,
+ f => $in_file,
+ l => $.
+ };
+ }
+ elsif ($line =~ /^0x(\w+)\s*U\+(\w+)\s*#\s*(\S.*)?\s*$/)
+ {
+
+ # non-combined characters
+ my ($c, $u, $rest) = ($1, $2, "U+" . $2 . $3);
+ my $ucs = hex($u);
+ my $code = hex($c);
+ my $direction;
+
+ if ($code < 0x80 && $ucs < 0x80)
+ {
+ next;
+ }
+ elsif ($code < 0x80)
+ {
+ $direction = FROM_UNICODE;
+ }
+ elsif ($ucs < 0x80)
+ {
+ $direction = TO_UNICODE;
+ }
+ else
+ {
+ $direction = BOTH;
+ }
+
+ push @mapping,
+ {
+ code => $code,
+ ucs => $ucs,
+ comment => $rest,
+ direction => $direction,
+ f => $in_file,
+ l => $.
+ };
+ }
+}
+close($in);
+
+print_conversion_tables($this_script, "SHIFT_JIS_2004", \@mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl b/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl
new file mode 100755
index 0000000..f3c4df8
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl
@@ -0,0 +1,106 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_SJIS.pl
+#
+# Generate UTF-8 <=> SJIS code conversion radix tree Generate UTF-8
+# <=> SJIS code conversion radix tree Unfortunately it is prohibited
+# by the organization to distribute the map files. So if you try to
+# use this script, you have to obtain CP932.TXT from the organization's
+# ftp site.
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_SJIS.pl';
+
+my $mapping = read_source("CP932.TXT");
+
+# Drop these SJIS codes from the source for UTF8=>SJIS conversion
+my @reject_sjis = (
+ 0xed40 .. 0xeefc, 0x8754 .. 0x875d, 0x878a, 0x8782,
+ 0x8784, 0xfa5b, 0xfa54, 0x8790 .. 0x8792,
+ 0x8795 .. 0x8797, 0x879a .. 0x879c);
+
+foreach my $i (@$mapping)
+{
+ my $code = $i->{code};
+ my $ucs = $i->{ucs};
+
+ if (grep { $code == $_ } @reject_sjis)
+ {
+ $i->{direction} = TO_UNICODE;
+ }
+}
+
+# Add these UTF8->SJIS pairs to the table.
+push @$mapping,
+ ( {
+ direction => FROM_UNICODE,
+ ucs => 0x00a2,
+ code => 0x8191,
+ comment => '# CENT SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x00a3,
+ code => 0x8192,
+ comment => '# POUND SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x00a5,
+ code => 0x5c,
+ comment => '# YEN SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x00ac,
+ code => 0x81ca,
+ comment => '# NOT SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x2016,
+ code => 0x8161,
+ comment => '# DOUBLE VERTICAL LINE',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x203e,
+ code => 0x7e,
+ comment => '# OVERLINE',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x2212,
+ code => 0x817c,
+ comment => '# MINUS SIGN',
+ f => $this_script,
+ l => __LINE__
+ },
+ {
+ direction => FROM_UNICODE,
+ ucs => 0x301c,
+ code => 0x8160,
+ comment => '# WAVE DASH',
+ f => $this_script,
+ l => __LINE__
+ });
+
+print_conversion_tables($this_script, "SJIS", $mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_UHC.pl b/src/backend/utils/mb/Unicode/UCS_to_UHC.pl
new file mode 100755
index 0000000..43be22f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_UHC.pl
@@ -0,0 +1,66 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2007-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_GB18030.pl
+#
+# Generate UTF-8 <--> UHC code conversion tables from
+# "windows-949-2000.xml", obtained from
+# http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/
+#
+# The lines we care about in the source file look like
+# <a u="009A" b="81 30 83 36"/>
+# where the "u" field is the Unicode code point in hex,
+# and the "b" field is the hex byte sequence for UHC
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_UHC.pl';
+
+# Read the input
+
+my $in_file = "windows-949-2000.xml";
+
+open(my $in, '<', $in_file) || die("cannot open $in_file");
+
+my @mapping;
+
+while (<$in>)
+{
+ next if (!m/<a u="([0-9A-F]+)" b="([0-9A-F ]+)"/);
+ my ($u, $c) = ($1, $2);
+ $c =~ s/ //g;
+ my $ucs = hex($u);
+ my $code = hex($c);
+
+ next if ($code == 0x0080 || $code == 0x00FF);
+
+ if ($code >= 0x80 && $ucs >= 0x0080)
+ {
+ push @mapping,
+ {
+ ucs => $ucs,
+ code => $code,
+ direction => BOTH,
+ f => $in_file,
+ l => $.
+ };
+ }
+}
+close($in);
+
+# One extra character that's not in the source file.
+push @mapping,
+ {
+ direction => BOTH,
+ code => 0xa2e8,
+ ucs => 0x327e,
+ comment => 'CIRCLED HANGUL IEUNG U',
+ f => $this_script,
+ l => __LINE__
+ };
+
+print_conversion_tables($this_script, "UHC", \@mapping);
diff --git a/src/backend/utils/mb/Unicode/UCS_to_most.pl b/src/backend/utils/mb/Unicode/UCS_to_most.pl
new file mode 100755
index 0000000..0d8ce25
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/UCS_to_most.pl
@@ -0,0 +1,63 @@
+#! /usr/bin/perl
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/UCS_to_most.pl
+#
+# Generate UTF-8 <--> character code conversion tables from
+# map files provided by Unicode organization.
+# Unfortunately it is prohibited by the organization
+# to distribute the map files. So if you try to use this script,
+# you have to obtain the map files from the organization's download site.
+# https://www.unicode.org/Public/MAPPINGS/
+# We assume the file include three tab-separated columns:
+# source character set code in hex
+# UCS-2 code in hex
+# # and Unicode name (not used in this script)
+
+use strict;
+use warnings;
+
+use convutils;
+
+my $this_script = 'src/backend/utils/mb/Unicode/UCS_to_most.pl';
+
+my %filename = (
+ 'WIN866' => 'CP866.TXT',
+ 'WIN874' => 'CP874.TXT',
+ 'WIN1250' => 'CP1250.TXT',
+ 'WIN1251' => 'CP1251.TXT',
+ 'WIN1252' => 'CP1252.TXT',
+ 'WIN1253' => 'CP1253.TXT',
+ 'WIN1254' => 'CP1254.TXT',
+ 'WIN1255' => 'CP1255.TXT',
+ 'WIN1256' => 'CP1256.TXT',
+ 'WIN1257' => 'CP1257.TXT',
+ 'WIN1258' => 'CP1258.TXT',
+ 'ISO8859_2' => '8859-2.TXT',
+ 'ISO8859_3' => '8859-3.TXT',
+ 'ISO8859_4' => '8859-4.TXT',
+ 'ISO8859_5' => '8859-5.TXT',
+ 'ISO8859_6' => '8859-6.TXT',
+ 'ISO8859_7' => '8859-7.TXT',
+ 'ISO8859_8' => '8859-8.TXT',
+ 'ISO8859_9' => '8859-9.TXT',
+ 'ISO8859_10' => '8859-10.TXT',
+ 'ISO8859_13' => '8859-13.TXT',
+ 'ISO8859_14' => '8859-14.TXT',
+ 'ISO8859_15' => '8859-15.TXT',
+ 'ISO8859_16' => '8859-16.TXT',
+ 'KOI8R' => 'KOI8-R.TXT',
+ 'KOI8U' => 'KOI8-U.TXT',
+ 'GBK' => 'CP936.TXT');
+
+# make maps for all encodings if not specified
+my @charsets = (scalar(@ARGV) > 0) ? @ARGV : sort keys(%filename);
+
+# the sort is just so that the output is easier to eyeball
+foreach my $charset (sort @charsets)
+{
+ my $mapping = &read_source($filename{$charset});
+
+ print_conversion_tables($this_script, $charset, $mapping);
+}
diff --git a/src/backend/utils/mb/Unicode/big5_to_utf8.map b/src/backend/utils/mb/Unicode/big5_to_utf8.map
new file mode 100644
index 0000000..b8332fb
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/big5_to_utf8.map
@@ -0,0 +1,4606 @@
+/* src/backend/utils/mb/Unicode/big5_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_BIG5.pl */
+
+static const uint32 big5_to_unicode_tree_table[17088];
+
+static const pg_mb_radix_tree big5_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ big5_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x00bf, /* offset of table for 2-byte inputs */
+ 0xa1, /* b2_1_lower */
+ 0xf9, /* b2_1_upper */
+ 0x40, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 big5_to_unicode_tree_table[17088] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x000bf ***/
+
+ /* a1 */ 0x000118, 0x0001d7, 0x000296, 0x000355,
+ /* a5 */ 0x000414, 0x0004d3, 0x000592, 0x000651,
+ /* a9 */ 0x000710, 0x0007cf, 0x00088e, 0x00094d,
+ /* ad */ 0x000a0c, 0x000acb, 0x000b8a, 0x000c49,
+ /* b1 */ 0x000d08, 0x000dc7, 0x000e86, 0x000f45,
+ /* b5 */ 0x001004, 0x0010c3, 0x001182, 0x001241,
+ /* b9 */ 0x001300, 0x0013bf, 0x00147e, 0x00153d,
+ /* bd */ 0x0015fc, 0x0016bb, 0x00177a, 0x001839,
+ /* c1 */ 0x0018f8, 0x0019b7, 0x001a76, 0x001b35,
+ /* c5 */ 0x001bf4, 0x001cb3, 0x001d72, 0x000000,
+ /* c9 */ 0x001e31, 0x001ef0, 0x001faf, 0x00206e,
+ /* cd */ 0x00212d, 0x0021ec, 0x0022ab, 0x00236a,
+ /* d1 */ 0x002429, 0x0024e8, 0x0025a7, 0x002666,
+ /* d5 */ 0x002725, 0x0027e4, 0x0028a3, 0x002962,
+ /* d9 */ 0x002a21, 0x002ae0, 0x002b9f, 0x002c5e,
+ /* dd */ 0x002d1d, 0x002ddc, 0x002e9b, 0x002f5a,
+ /* e1 */ 0x003019, 0x0030d8, 0x003197, 0x003256,
+ /* e5 */ 0x003315, 0x0033d4, 0x003493, 0x003552,
+ /* e9 */ 0x003611, 0x0036d0, 0x00378f, 0x00384e,
+ /* ed */ 0x00390d, 0x0039cc, 0x003a8b, 0x003b4a,
+ /* f1 */ 0x003c09, 0x003cc8, 0x003d87, 0x003e46,
+ /* f5 */ 0x003f05, 0x003fc4, 0x004083, 0x004142,
+ /* f9 */ 0x004201,
+
+ /*** Two byte table, leaf: a1xx - offset 0x00118 ***/
+
+ /* 40 */ 0xe38080, 0xefbc8c, 0xe38081, 0xe38082,
+ /* 44 */ 0xefbc8e, 0xe280a2, 0xefbc9b, 0xefbc9a,
+ /* 48 */ 0xefbc9f, 0xefbc81, 0xefb8b0, 0xe280a6,
+ /* 4c */ 0xe280a5, 0xefb990, 0xefbda4, 0xefb992,
+ /* 50 */ 0x00c2b7, 0xefb994, 0xefb995, 0xefb996,
+ /* 54 */ 0xefb997, 0xefbd9c, 0xe28093, 0xefb8b1,
+ /* 58 */ 0xe28094, 0xefb8b3, 0xefbfbd, 0xefb8b4,
+ /* 5c */ 0xefb98f, 0xefbc88, 0xefbc89, 0xefb8b5,
+ /* 60 */ 0xefb8b6, 0xefbd9b, 0xefbd9d, 0xefb8b7,
+ /* 64 */ 0xefb8b8, 0xe38094, 0xe38095, 0xefb8b9,
+ /* 68 */ 0xefb8ba, 0xe38090, 0xe38091, 0xefb8bb,
+ /* 6c */ 0xefb8bc, 0xe3808a, 0xe3808b, 0xefb8bd,
+ /* 70 */ 0xefb8be, 0xe38088, 0xe38089, 0xefb8bf,
+ /* 74 */ 0xefb980, 0xe3808c, 0xe3808d, 0xefb981,
+ /* 78 */ 0xefb982, 0xe3808e, 0xe3808f, 0xefb983,
+ /* 7c */ 0xefb984, 0xefb999, 0xefb99a, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xefb99b, 0xefb99c, 0xefb99d,
+ /* a4 */ 0xefb99e, 0xe28098, 0xe28099, 0xe2809c,
+ /* a8 */ 0xe2809d, 0xe3809d, 0xe3809e, 0xe280b5,
+ /* ac */ 0xe280b2, 0xefbc83, 0xefbc86, 0xefbc8a,
+ /* b0 */ 0xe280bb, 0x00c2a7, 0xe38083, 0xe2978b,
+ /* b4 */ 0xe2978f, 0xe296b3, 0xe296b2, 0xe2978e,
+ /* b8 */ 0xe29886, 0xe29885, 0xe29787, 0xe29786,
+ /* bc */ 0xe296a1, 0xe296a0, 0xe296bd, 0xe296bc,
+ /* c0 */ 0xe38aa3, 0xe28485, 0xe280be, 0xefbfbd,
+ /* c4 */ 0xefbcbf, 0xefbfbd, 0xefb989, 0xefb98a,
+ /* c8 */ 0xefb98d, 0xefb98e, 0xefb98b, 0xefb98c,
+ /* cc */ 0xefb99f, 0xefb9a0, 0xefb9a1, 0xefbc8b,
+ /* d0 */ 0xefbc8d, 0x00c397, 0x00c3b7, 0x00c2b1,
+ /* d4 */ 0xe2889a, 0xefbc9c, 0xefbc9e, 0xefbc9d,
+ /* d8 */ 0xe289a6, 0xe289a7, 0xe289a0, 0xe2889e,
+ /* dc */ 0xe28992, 0xe289a1, 0xefb9a2, 0xefb9a3,
+ /* e0 */ 0xefb9a4, 0xefb9a5, 0xefb9a6, 0xe288bc,
+ /* e4 */ 0xe288a9, 0xe288aa, 0xe28aa5, 0xe288a0,
+ /* e8 */ 0xe2889f, 0xe28abf, 0xe38f92, 0xe38f91,
+ /* ec */ 0xe288ab, 0xe288ae, 0xe288b5, 0xe288b4,
+ /* f0 */ 0xe29980, 0xe29982, 0xe29981, 0xe29889,
+ /* f4 */ 0xe28691, 0xe28693, 0xe28690, 0xe28692,
+ /* f8 */ 0xe28696, 0xe28697, 0xe28699, 0xe28698,
+ /* fc */ 0xe288a5, 0xe288a3, 0xefbfbd,
+
+ /*** Two byte table, leaf: a2xx - offset 0x001d7 ***/
+
+ /* 40 */ 0xefbfbd, 0xefbc8f, 0xefbcbc, 0xefbc84,
+ /* 44 */ 0x00c2a5, 0xe38092, 0x00c2a2, 0x00c2a3,
+ /* 48 */ 0xefbc85, 0xefbca0, 0xe28483, 0xe28489,
+ /* 4c */ 0xefb9a9, 0xefb9aa, 0xefb9ab, 0xe38f95,
+ /* 50 */ 0xe38e9c, 0xe38e9d, 0xe38e9e, 0xe38f8e,
+ /* 54 */ 0xe38ea1, 0xe38e8e, 0xe38e8f, 0xe38f84,
+ /* 58 */ 0x00c2b0, 0xe58599, 0xe5859b, 0xe5859e,
+ /* 5c */ 0xe5859d, 0xe585a1, 0xe585a3, 0xe597a7,
+ /* 60 */ 0xe793a9, 0xe7b38e, 0xe29681, 0xe29682,
+ /* 64 */ 0xe29683, 0xe29684, 0xe29685, 0xe29686,
+ /* 68 */ 0xe29687, 0xe29688, 0xe2968f, 0xe2968e,
+ /* 6c */ 0xe2968d, 0xe2968c, 0xe2968b, 0xe2968a,
+ /* 70 */ 0xe29689, 0xe294bc, 0xe294b4, 0xe294ac,
+ /* 74 */ 0xe294a4, 0xe2949c, 0xe29694, 0xe29480,
+ /* 78 */ 0xe29482, 0xe29695, 0xe2948c, 0xe29490,
+ /* 7c */ 0xe29494, 0xe29498, 0xe295ad, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe295ae, 0xe295b0, 0xe295af,
+ /* a4 */ 0xe29590, 0xe2959e, 0xe295aa, 0xe295a1,
+ /* a8 */ 0xe297a2, 0xe297a3, 0xe297a5, 0xe297a4,
+ /* ac */ 0xe295b1, 0xe295b2, 0xe295b3, 0xefbc90,
+ /* b0 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* b4 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* b8 */ 0xefbc99, 0xe285a0, 0xe285a1, 0xe285a2,
+ /* bc */ 0xe285a3, 0xe285a4, 0xe285a5, 0xe285a6,
+ /* c0 */ 0xe285a7, 0xe285a8, 0xe285a9, 0xe380a1,
+ /* c4 */ 0xe380a2, 0xe380a3, 0xe380a4, 0xe380a5,
+ /* c8 */ 0xe380a6, 0xe380a7, 0xe380a8, 0xe380a9,
+ /* cc */ 0xefbfbd, 0xe58d84, 0xefbfbd, 0xefbca1,
+ /* d0 */ 0xefbca2, 0xefbca3, 0xefbca4, 0xefbca5,
+ /* d4 */ 0xefbca6, 0xefbca7, 0xefbca8, 0xefbca9,
+ /* d8 */ 0xefbcaa, 0xefbcab, 0xefbcac, 0xefbcad,
+ /* dc */ 0xefbcae, 0xefbcaf, 0xefbcb0, 0xefbcb1,
+ /* e0 */ 0xefbcb2, 0xefbcb3, 0xefbcb4, 0xefbcb5,
+ /* e4 */ 0xefbcb6, 0xefbcb7, 0xefbcb8, 0xefbcb9,
+ /* e8 */ 0xefbcba, 0xefbd81, 0xefbd82, 0xefbd83,
+ /* ec */ 0xefbd84, 0xefbd85, 0xefbd86, 0xefbd87,
+ /* f0 */ 0xefbd88, 0xefbd89, 0xefbd8a, 0xefbd8b,
+ /* f4 */ 0xefbd8c, 0xefbd8d, 0xefbd8e, 0xefbd8f,
+ /* f8 */ 0xefbd90, 0xefbd91, 0xefbd92, 0xefbd93,
+ /* fc */ 0xefbd94, 0xefbd95, 0xefbd96,
+
+ /*** Two byte table, leaf: a3xx - offset 0x00296 ***/
+
+ /* 40 */ 0xefbd97, 0xefbd98, 0xefbd99, 0xefbd9a,
+ /* 44 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* 48 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* 4c */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* 50 */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* 54 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* 58 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* 5c */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* 60 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* 64 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* 68 */ 0x00cebd, 0x00cebe, 0x00cebf, 0x00cf80,
+ /* 6c */ 0x00cf81, 0x00cf83, 0x00cf84, 0x00cf85,
+ /* 70 */ 0x00cf86, 0x00cf87, 0x00cf88, 0x00cf89,
+ /* 74 */ 0xe38485, 0xe38486, 0xe38487, 0xe38488,
+ /* 78 */ 0xe38489, 0xe3848a, 0xe3848b, 0xe3848c,
+ /* 7c */ 0xe3848d, 0xe3848e, 0xe3848f, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe38490, 0xe38491, 0xe38492,
+ /* a4 */ 0xe38493, 0xe38494, 0xe38495, 0xe38496,
+ /* a8 */ 0xe38497, 0xe38498, 0xe38499, 0xe3849a,
+ /* ac */ 0xe3849b, 0xe3849c, 0xe3849d, 0xe3849e,
+ /* b0 */ 0xe3849f, 0xe384a0, 0xe384a1, 0xe384a2,
+ /* b4 */ 0xe384a3, 0xe384a4, 0xe384a5, 0xe384a6,
+ /* b8 */ 0xe384a7, 0xe384a8, 0xe384a9, 0x00cb99,
+ /* bc */ 0x00cb89, 0x00cb8a, 0x00cb87, 0x00cb8b,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a4xx - offset 0x00355 ***/
+
+ /* 40 */ 0xe4b880, 0xe4b999, 0xe4b881, 0xe4b883,
+ /* 44 */ 0xe4b983, 0xe4b99d, 0xe4ba86, 0xe4ba8c,
+ /* 48 */ 0xe4baba, 0xe584bf, 0xe585a5, 0xe585ab,
+ /* 4c */ 0xe587a0, 0xe58880, 0xe58881, 0xe58a9b,
+ /* 50 */ 0xe58c95, 0xe58d81, 0xe58d9c, 0xe58f88,
+ /* 54 */ 0xe4b889, 0xe4b88b, 0xe4b888, 0xe4b88a,
+ /* 58 */ 0xe4b8ab, 0xe4b8b8, 0xe587a1, 0xe4b985,
+ /* 5c */ 0xe4b988, 0xe4b99f, 0xe4b99e, 0xe4ba8e,
+ /* 60 */ 0xe4baa1, 0xe58580, 0xe58883, 0xe58bba,
+ /* 64 */ 0xe58d83, 0xe58f89, 0xe58fa3, 0xe59c9f,
+ /* 68 */ 0xe5a3ab, 0xe5a495, 0xe5a4a7, 0xe5a5b3,
+ /* 6c */ 0xe5ad90, 0xe5ad91, 0xe5ad93, 0xe5afb8,
+ /* 70 */ 0xe5b08f, 0xe5b0a2, 0xe5b0b8, 0xe5b1b1,
+ /* 74 */ 0xe5b79d, 0xe5b7a5, 0xe5b7b1, 0xe5b7b2,
+ /* 78 */ 0xe5b7b3, 0xe5b7be, 0xe5b9b2, 0xe5bbbe,
+ /* 7c */ 0xe5bc8b, 0xe5bc93, 0xe6898d, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe4b891, 0xe4b890, 0xe4b88d,
+ /* a4 */ 0xe4b8ad, 0xe4b8b0, 0xe4b8b9, 0xe4b98b,
+ /* a8 */ 0xe5b0b9, 0xe4ba88, 0xe4ba91, 0xe4ba95,
+ /* ac */ 0xe4ba92, 0xe4ba94, 0xe4baa2, 0xe4bb81,
+ /* b0 */ 0xe4bb80, 0xe4bb83, 0xe4bb86, 0xe4bb87,
+ /* b4 */ 0xe4bb8d, 0xe4bb8a, 0xe4bb8b, 0xe4bb84,
+ /* b8 */ 0xe58583, 0xe58581, 0xe585a7, 0xe585ad,
+ /* bc */ 0xe585ae, 0xe585ac, 0xe58697, 0xe587b6,
+ /* c0 */ 0xe58886, 0xe58887, 0xe58888, 0xe58bbb,
+ /* c4 */ 0xe58bbe, 0xe58bbf, 0xe58c96, 0xe58cb9,
+ /* c8 */ 0xe58d88, 0xe58d87, 0xe58d85, 0xe58d9e,
+ /* cc */ 0xe58e84, 0xe58f8b, 0xe58f8a, 0xe58f8d,
+ /* d0 */ 0xe5a3ac, 0xe5a4a9, 0xe5a4ab, 0xe5a4aa,
+ /* d4 */ 0xe5a4ad, 0xe5ad94, 0xe5b091, 0xe5b0a4,
+ /* d8 */ 0xe5b0ba, 0xe5b1af, 0xe5b7b4, 0xe5b9bb,
+ /* dc */ 0xe5bbbf, 0xe5bc94, 0xe5bc95, 0xe5bf83,
+ /* e0 */ 0xe68888, 0xe688b6, 0xe6898b, 0xe6898e,
+ /* e4 */ 0xe694af, 0xe69687, 0xe69697, 0xe696a4,
+ /* e8 */ 0xe696b9, 0xe697a5, 0xe69bb0, 0xe69c88,
+ /* ec */ 0xe69ca8, 0xe6aca0, 0xe6ada2, 0xe6adb9,
+ /* f0 */ 0xe6af8b, 0xe6af94, 0xe6af9b, 0xe6b08f,
+ /* f4 */ 0xe6b0b4, 0xe781ab, 0xe788aa, 0xe788b6,
+ /* f8 */ 0xe788bb, 0xe78987, 0xe78999, 0xe7899b,
+ /* fc */ 0xe78aac, 0xe78e8b, 0xe4b899,
+
+ /*** Two byte table, leaf: a5xx - offset 0x00414 ***/
+
+ /* 40 */ 0xe4b896, 0xe4b895, 0xe4b894, 0xe4b898,
+ /* 44 */ 0xe4b8bb, 0xe4b98d, 0xe4b98f, 0xe4b98e,
+ /* 48 */ 0xe4bba5, 0xe4bb98, 0xe4bb94, 0xe4bb95,
+ /* 4c */ 0xe4bb96, 0xe4bb97, 0xe4bba3, 0xe4bba4,
+ /* 50 */ 0xe4bb99, 0xe4bb9e, 0xe58585, 0xe58584,
+ /* 54 */ 0xe58689, 0xe5868a, 0xe586ac, 0xe587b9,
+ /* 58 */ 0xe587ba, 0xe587b8, 0xe5888a, 0xe58aa0,
+ /* 5c */ 0xe58a9f, 0xe58c85, 0xe58c86, 0xe58c97,
+ /* 60 */ 0xe58c9d, 0xe4bb9f, 0xe58d8a, 0xe58d89,
+ /* 64 */ 0xe58da1, 0xe58da0, 0xe58daf, 0xe58dae,
+ /* 68 */ 0xe58ebb, 0xe58faf, 0xe58fa4, 0xe58fb3,
+ /* 6c */ 0xe58fac, 0xe58fae, 0xe58fa9, 0xe58fa8,
+ /* 70 */ 0xe58fbc, 0xe58fb8, 0xe58fb5, 0xe58fab,
+ /* 74 */ 0xe58fa6, 0xe58faa, 0xe58fb2, 0xe58fb1,
+ /* 78 */ 0xe58fb0, 0xe58fa5, 0xe58fad, 0xe58fbb,
+ /* 7c */ 0xe59b9b, 0xe59b9a, 0xe5a496, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5a4ae, 0xe5a4b1, 0xe5a5b4,
+ /* a4 */ 0xe5a5b6, 0xe5ad95, 0xe5ae83, 0xe5b0bc,
+ /* a8 */ 0xe5b7a8, 0xe5b7a7, 0xe5b7a6, 0xe5b882,
+ /* ac */ 0xe5b883, 0xe5b9b3, 0xe5b9bc, 0xe5bc81,
+ /* b0 */ 0xe5bc98, 0xe5bc97, 0xe5bf85, 0xe6888a,
+ /* b4 */ 0xe68993, 0xe68994, 0xe68992, 0xe68991,
+ /* b8 */ 0xe696a5, 0xe697a6, 0xe69cae, 0xe69cac,
+ /* bc */ 0xe69caa, 0xe69cab, 0xe69cad, 0xe6ada3,
+ /* c0 */ 0xe6af8d, 0xe6b091, 0xe6b090, 0xe6b0b8,
+ /* c4 */ 0xe6b181, 0xe6b180, 0xe6b0be, 0xe78aaf,
+ /* c8 */ 0xe78e84, 0xe78e89, 0xe7939c, 0xe793a6,
+ /* cc */ 0xe79498, 0xe7949f, 0xe794a8, 0xe794a9,
+ /* d0 */ 0xe794b0, 0xe794b1, 0xe794b2, 0xe794b3,
+ /* d4 */ 0xe7968b, 0xe799bd, 0xe79aae, 0xe79abf,
+ /* d8 */ 0xe79bae, 0xe79f9b, 0xe79fa2, 0xe79fb3,
+ /* dc */ 0xe7a4ba, 0xe7a6be, 0xe7a9b4, 0xe7ab8b,
+ /* e0 */ 0xe4b89e, 0xe4b89f, 0xe4b992, 0xe4b993,
+ /* e4 */ 0xe4b9a9, 0xe4ba99, 0xe4baa4, 0xe4baa6,
+ /* e8 */ 0xe4baa5, 0xe4bbbf, 0xe4bc89, 0xe4bc99,
+ /* ec */ 0xe4bc8a, 0xe4bc95, 0xe4bc8d, 0xe4bc90,
+ /* f0 */ 0xe4bc91, 0xe4bc8f, 0xe4bbb2, 0xe4bbb6,
+ /* f4 */ 0xe4bbbb, 0xe4bbb0, 0xe4bbb3, 0xe4bbbd,
+ /* f8 */ 0xe4bc81, 0xe4bc8b, 0xe58589, 0xe58587,
+ /* fc */ 0xe58586, 0xe58588, 0xe585a8,
+
+ /*** Two byte table, leaf: a6xx - offset 0x004d3 ***/
+
+ /* 40 */ 0xe585b1, 0xe5868d, 0xe586b0, 0xe58897,
+ /* 44 */ 0xe58891, 0xe58892, 0xe5888e, 0xe58896,
+ /* 48 */ 0xe58aa3, 0xe58c88, 0xe58ca1, 0xe58ca0,
+ /* 4c */ 0xe58db0, 0xe58db1, 0xe59089, 0xe5908f,
+ /* 50 */ 0xe5908c, 0xe5908a, 0xe59090, 0xe59081,
+ /* 54 */ 0xe5908b, 0xe59084, 0xe59091, 0xe5908d,
+ /* 58 */ 0xe59088, 0xe59083, 0xe5908e, 0xe59086,
+ /* 5c */ 0xe59092, 0xe59ba0, 0xe59b9e, 0xe59b9d,
+ /* 60 */ 0xe59cb3, 0xe59cb0, 0xe59ca8, 0xe59cad,
+ /* 64 */ 0xe59cac, 0xe59caf, 0xe59ca9, 0xe5a499,
+ /* 68 */ 0xe5a49a, 0xe5a4b7, 0xe5a4b8, 0xe5a684,
+ /* 6c */ 0xe5a5b8, 0xe5a683, 0xe5a5bd, 0xe5a5b9,
+ /* 70 */ 0xe5a682, 0xe5a681, 0xe5ad97, 0xe5ad98,
+ /* 74 */ 0xe5ae87, 0xe5ae88, 0xe5ae85, 0xe5ae89,
+ /* 78 */ 0xe5afba, 0xe5b096, 0xe5b1b9, 0xe5b79e,
+ /* 7c */ 0xe5b886, 0xe5b9b6, 0xe5b9b4, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5bc8f, 0xe5bc9b, 0xe5bf99,
+ /* a4 */ 0xe5bf96, 0xe6888e, 0xe6888c, 0xe6888d,
+ /* a8 */ 0xe68890, 0xe689a3, 0xe6899b, 0xe68998,
+ /* ac */ 0xe694b6, 0xe697a9, 0xe697a8, 0xe697ac,
+ /* b0 */ 0xe697ad, 0xe69bb2, 0xe69bb3, 0xe69c89,
+ /* b4 */ 0xe69cbd, 0xe69cb4, 0xe69cb1, 0xe69cb5,
+ /* b8 */ 0xe6aca1, 0xe6ada4, 0xe6adbb, 0xe6b096,
+ /* bc */ 0xe6b19d, 0xe6b197, 0xe6b199, 0xe6b19f,
+ /* c0 */ 0xe6b1a0, 0xe6b190, 0xe6b195, 0xe6b1a1,
+ /* c4 */ 0xe6b19b, 0xe6b18d, 0xe6b18e, 0xe781b0,
+ /* c8 */ 0xe7899f, 0xe7899d, 0xe799be, 0xe7abb9,
+ /* cc */ 0xe7b1b3, 0xe7b3b8, 0xe7bcb6, 0xe7be8a,
+ /* d0 */ 0xe7bebd, 0xe88081, 0xe88083, 0xe8808c,
+ /* d4 */ 0xe88092, 0xe880b3, 0xe881bf, 0xe88289,
+ /* d8 */ 0xe8828b, 0xe8828c, 0xe887a3, 0xe887aa,
+ /* dc */ 0xe887b3, 0xe887bc, 0xe8888c, 0xe8889b,
+ /* e0 */ 0xe8889f, 0xe889ae, 0xe889b2, 0xe889be,
+ /* e4 */ 0xe899ab, 0xe8a180, 0xe8a18c, 0xe8a1a3,
+ /* e8 */ 0xe8a5bf, 0xe998a1, 0xe4b8b2, 0xe4baa8,
+ /* ec */ 0xe4bd8d, 0xe4bd8f, 0xe4bd87, 0xe4bd97,
+ /* f0 */ 0xe4bd9e, 0xe4bcb4, 0xe4bd9b, 0xe4bd95,
+ /* f4 */ 0xe4bcb0, 0xe4bd90, 0xe4bd91, 0xe4bcbd,
+ /* f8 */ 0xe4bcba, 0xe4bcb8, 0xe4bd83, 0xe4bd94,
+ /* fc */ 0xe4bcbc, 0xe4bd86, 0xe4bda3,
+
+ /*** Two byte table, leaf: a7xx - offset 0x00592 ***/
+
+ /* 40 */ 0xe4bd9c, 0xe4bda0, 0xe4bcaf, 0xe4bd8e,
+ /* 44 */ 0xe4bcb6, 0xe4bd99, 0xe4bd9d, 0xe4bd88,
+ /* 48 */ 0xe4bd9a, 0xe5858c, 0xe5858b, 0xe5858d,
+ /* 4c */ 0xe585b5, 0xe586b6, 0xe586b7, 0xe588a5,
+ /* 50 */ 0xe588a4, 0xe588a9, 0xe588aa, 0xe588a8,
+ /* 54 */ 0xe58aab, 0xe58aa9, 0xe58aaa, 0xe58aac,
+ /* 58 */ 0xe58ca3, 0xe58db3, 0xe58db5, 0xe5909d,
+ /* 5c */ 0xe590ad, 0xe5909e, 0xe590be, 0xe590a6,
+ /* 60 */ 0xe5918e, 0xe590a7, 0xe59186, 0xe59183,
+ /* 64 */ 0xe590b3, 0xe59188, 0xe59182, 0xe5909b,
+ /* 68 */ 0xe590a9, 0xe5918a, 0xe590b9, 0xe590bb,
+ /* 6c */ 0xe590b8, 0xe590ae, 0xe590b5, 0xe590b6,
+ /* 70 */ 0xe590a0, 0xe590bc, 0xe59180, 0xe590b1,
+ /* 74 */ 0xe590ab, 0xe5909f, 0xe590ac, 0xe59baa,
+ /* 78 */ 0xe59bb0, 0xe59ba4, 0xe59bab, 0xe59d8a,
+ /* 7c */ 0xe59d91, 0xe59d80, 0xe59d8d, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe59d87, 0xe59d8e, 0xe59cbe,
+ /* a4 */ 0xe59d90, 0xe59d8f, 0xe59cbb, 0xe5a3af,
+ /* a8 */ 0xe5a4be, 0xe5a69d, 0xe5a692, 0xe5a6a8,
+ /* ac */ 0xe5a69e, 0xe5a6a3, 0xe5a699, 0xe5a696,
+ /* b0 */ 0xe5a68d, 0xe5a6a4, 0xe5a693, 0xe5a68a,
+ /* b4 */ 0xe5a6a5, 0xe5ad9d, 0xe5ad9c, 0xe5ad9a,
+ /* b8 */ 0xe5ad9b, 0xe5ae8c, 0xe5ae8b, 0xe5ae8f,
+ /* bc */ 0xe5b0ac, 0xe5b180, 0xe5b181, 0xe5b0bf,
+ /* c0 */ 0xe5b0be, 0xe5b290, 0xe5b291, 0xe5b294,
+ /* c4 */ 0xe5b28c, 0xe5b7ab, 0xe5b88c, 0xe5ba8f,
+ /* c8 */ 0xe5ba87, 0xe5ba8a, 0xe5bbb7, 0xe5bc84,
+ /* cc */ 0xe5bc9f, 0xe5bda4, 0xe5bda2, 0xe5bdb7,
+ /* d0 */ 0xe5bdb9, 0xe5bf98, 0xe5bf8c, 0xe5bf97,
+ /* d4 */ 0xe5bf8d, 0xe5bfb1, 0xe5bfab, 0xe5bfb8,
+ /* d8 */ 0xe5bfaa, 0xe68892, 0xe68891, 0xe68a84,
+ /* dc */ 0xe68a97, 0xe68a96, 0xe68a80, 0xe689b6,
+ /* e0 */ 0xe68a89, 0xe689ad, 0xe68a8a, 0xe689bc,
+ /* e4 */ 0xe689be, 0xe689b9, 0xe689b3, 0xe68a92,
+ /* e8 */ 0xe689af, 0xe68a98, 0xe689ae, 0xe68a95,
+ /* ec */ 0xe68a93, 0xe68a91, 0xe68a86, 0xe694b9,
+ /* f0 */ 0xe694bb, 0xe694b8, 0xe697b1, 0xe69bb4,
+ /* f4 */ 0xe69d9f, 0xe69d8e, 0xe69d8f, 0xe69d90,
+ /* f8 */ 0xe69d91, 0xe69d9c, 0xe69d96, 0xe69d9e,
+ /* fc */ 0xe69d89, 0xe69d86, 0xe69da0,
+
+ /*** Two byte table, leaf: a8xx - offset 0x00651 ***/
+
+ /* 40 */ 0xe69d93, 0xe69d97, 0xe6ada5, 0xe6af8f,
+ /* 44 */ 0xe6b182, 0xe6b19e, 0xe6b299, 0xe6b281,
+ /* 48 */ 0xe6b288, 0xe6b289, 0xe6b285, 0xe6b29b,
+ /* 4c */ 0xe6b1aa, 0xe6b1ba, 0xe6b290, 0xe6b1b0,
+ /* 50 */ 0xe6b28c, 0xe6b1a8, 0xe6b296, 0xe6b292,
+ /* 54 */ 0xe6b1bd, 0xe6b283, 0xe6b1b2, 0xe6b1be,
+ /* 58 */ 0xe6b1b4, 0xe6b286, 0xe6b1b6, 0xe6b28d,
+ /* 5c */ 0xe6b294, 0xe6b298, 0xe6b282, 0xe781b6,
+ /* 60 */ 0xe781bc, 0xe781bd, 0xe781b8, 0xe789a2,
+ /* 64 */ 0xe789a1, 0xe789a0, 0xe78b84, 0xe78b82,
+ /* 68 */ 0xe78e96, 0xe794ac, 0xe794ab, 0xe794b7,
+ /* 6c */ 0xe794b8, 0xe79a82, 0xe79baf, 0xe79fa3,
+ /* 70 */ 0xe7a781, 0xe7a780, 0xe7a6bf, 0xe7a9b6,
+ /* 74 */ 0xe7b3bb, 0xe7bd95, 0xe88296, 0xe88293,
+ /* 78 */ 0xe8829d, 0xe88298, 0xe8829b, 0xe8829a,
+ /* 7c */ 0xe882b2, 0xe889af, 0xe88a92, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88a8b, 0xe88a8d, 0xe8a68b,
+ /* a4 */ 0xe8a792, 0xe8a880, 0xe8b0b7, 0xe8b186,
+ /* a8 */ 0xe8b195, 0xe8b29d, 0xe8b5a4, 0xe8b5b0,
+ /* ac */ 0xe8b6b3, 0xe8baab, 0xe8bb8a, 0xe8be9b,
+ /* b0 */ 0xe8beb0, 0xe8bf82, 0xe8bf86, 0xe8bf85,
+ /* b4 */ 0xe8bf84, 0xe5b7a1, 0xe98291, 0xe982a2,
+ /* b8 */ 0xe982aa, 0xe982a6, 0xe982a3, 0xe98589,
+ /* bc */ 0xe98786, 0xe9878c, 0xe998b2, 0xe998ae,
+ /* c0 */ 0xe998b1, 0xe998aa, 0xe998ac, 0xe4b8a6,
+ /* c4 */ 0xe4b996, 0xe4b9b3, 0xe4ba8b, 0xe4ba9b,
+ /* c8 */ 0xe4ba9e, 0xe4baab, 0xe4baac, 0xe4bdaf,
+ /* cc */ 0xe4be9d, 0xe4be8d, 0xe4bdb3, 0xe4bdbf,
+ /* d0 */ 0xe4bdac, 0xe4be9b, 0xe4be8b, 0xe4be86,
+ /* d4 */ 0xe4be83, 0xe4bdb0, 0xe4bdb5, 0xe4be88,
+ /* d8 */ 0xe4bda9, 0xe4bdbb, 0xe4be96, 0xe4bdbe,
+ /* dc */ 0xe4be8f, 0xe4be91, 0xe4bdba, 0xe58594,
+ /* e0 */ 0xe58592, 0xe58595, 0xe585a9, 0xe585b7,
+ /* e4 */ 0xe585b6, 0xe585b8, 0xe586bd, 0xe587bd,
+ /* e8 */ 0xe588bb, 0xe588b8, 0xe588b7, 0xe588ba,
+ /* ec */ 0xe588b0, 0xe588ae, 0xe588b6, 0xe58981,
+ /* f0 */ 0xe58abe, 0xe58abb, 0xe58d92, 0xe58d94,
+ /* f4 */ 0xe58d93, 0xe58d91, 0xe58da6, 0xe58db7,
+ /* f8 */ 0xe58db8, 0xe58db9, 0xe58f96, 0xe58f94,
+ /* fc */ 0xe58f97, 0xe591b3, 0xe591b5,
+
+ /*** Two byte table, leaf: a9xx - offset 0x00710 ***/
+
+ /* 40 */ 0xe59296, 0xe591b8, 0xe59295, 0xe59280,
+ /* 44 */ 0xe591bb, 0xe591b7, 0xe59284, 0xe59292,
+ /* 48 */ 0xe59286, 0xe591bc, 0xe59290, 0xe591b1,
+ /* 4c */ 0xe591b6, 0xe5928c, 0xe5929a, 0xe591a2,
+ /* 50 */ 0xe591a8, 0xe5928b, 0xe591bd, 0xe5928e,
+ /* 54 */ 0xe59bba, 0xe59e83, 0xe59db7, 0xe59daa,
+ /* 58 */ 0xe59da9, 0xe59da1, 0xe59da6, 0xe59da4,
+ /* 5c */ 0xe59dbc, 0xe5a49c, 0xe5a589, 0xe5a587,
+ /* 60 */ 0xe5a588, 0xe5a584, 0xe5a594, 0xe5a6be,
+ /* 64 */ 0xe5a6bb, 0xe5a794, 0xe5a6b9, 0xe5a6ae,
+ /* 68 */ 0xe5a791, 0xe5a786, 0xe5a790, 0xe5a78d,
+ /* 6c */ 0xe5a78b, 0xe5a793, 0xe5a78a, 0xe5a6af,
+ /* 70 */ 0xe5a6b3, 0xe5a792, 0xe5a785, 0xe5ad9f,
+ /* 74 */ 0xe5ada4, 0xe5ada3, 0xe5ae97, 0xe5ae9a,
+ /* 78 */ 0xe5ae98, 0xe5ae9c, 0xe5ae99, 0xe5ae9b,
+ /* 7c */ 0xe5b09a, 0xe5b188, 0xe5b185, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5b186, 0xe5b2b7, 0xe5b2a1,
+ /* a4 */ 0xe5b2b8, 0xe5b2a9, 0xe5b2ab, 0xe5b2b1,
+ /* a8 */ 0xe5b2b3, 0xe5b898, 0xe5b89a, 0xe5b896,
+ /* ac */ 0xe5b895, 0xe5b89b, 0xe5b891, 0xe5b9b8,
+ /* b0 */ 0xe5ba9a, 0xe5ba97, 0xe5ba9c, 0xe5ba95,
+ /* b4 */ 0xe5ba96, 0xe5bbb6, 0xe5bca6, 0xe5bca7,
+ /* b8 */ 0xe5bca9, 0xe5be80, 0xe5be81, 0xe5bdbf,
+ /* bc */ 0xe5bdbc, 0xe5bf9d, 0xe5bfa0, 0xe5bfbd,
+ /* c0 */ 0xe5bfb5, 0xe5bfbf, 0xe6808f, 0xe68094,
+ /* c4 */ 0xe680af, 0xe680b5, 0xe68096, 0xe680aa,
+ /* c8 */ 0xe68095, 0xe680a1, 0xe680a7, 0xe680a9,
+ /* cc */ 0xe680ab, 0xe6809b, 0xe68896, 0xe68895,
+ /* d0 */ 0xe688bf, 0xe688be, 0xe68980, 0xe689bf,
+ /* d4 */ 0xe68b89, 0xe68b8c, 0xe68b84, 0xe68abf,
+ /* d8 */ 0xe68b82, 0xe68ab9, 0xe68b92, 0xe68b9b,
+ /* dc */ 0xe68aab, 0xe68b93, 0xe68b94, 0xe68b8b,
+ /* e0 */ 0xe68b88, 0xe68aa8, 0xe68abd, 0xe68abc,
+ /* e4 */ 0xe68b90, 0xe68b99, 0xe68b87, 0xe68b8d,
+ /* e8 */ 0xe68ab5, 0xe68b9a, 0xe68ab1, 0xe68b98,
+ /* ec */ 0xe68b96, 0xe68b97, 0xe68b86, 0xe68aac,
+ /* f0 */ 0xe68b8e, 0xe694be, 0xe696a7, 0xe696bc,
+ /* f4 */ 0xe697ba, 0xe69894, 0xe69893, 0xe6988c,
+ /* f8 */ 0xe69886, 0xe69882, 0xe6988e, 0xe69880,
+ /* fc */ 0xe6988f, 0xe69895, 0xe6988a,
+
+ /*** Two byte table, leaf: aaxx - offset 0x007cf ***/
+
+ /* 40 */ 0xe69887, 0xe69c8d, 0xe69c8b, 0xe69dad,
+ /* 44 */ 0xe69e8b, 0xe69e95, 0xe69db1, 0xe69e9c,
+ /* 48 */ 0xe69db3, 0xe69db7, 0xe69e87, 0xe69e9d,
+ /* 4c */ 0xe69e97, 0xe69daf, 0xe69db0, 0xe69dbf,
+ /* 50 */ 0xe69e89, 0xe69dbe, 0xe69e90, 0xe69db5,
+ /* 54 */ 0xe69e9a, 0xe69e93, 0xe69dbc, 0xe69daa,
+ /* 58 */ 0xe69db2, 0xe6aca3, 0xe6ada6, 0xe6ada7,
+ /* 5c */ 0xe6adbf, 0xe6b093, 0xe6b09b, 0xe6b3a3,
+ /* 60 */ 0xe6b3a8, 0xe6b3b3, 0xe6b2b1, 0xe6b38c,
+ /* 64 */ 0xe6b3a5, 0xe6b2b3, 0xe6b2bd, 0xe6b2be,
+ /* 68 */ 0xe6b2bc, 0xe6b3a2, 0xe6b2ab, 0xe6b395,
+ /* 6c */ 0xe6b393, 0xe6b2b8, 0xe6b384, 0xe6b2b9,
+ /* 70 */ 0xe6b381, 0xe6b2ae, 0xe6b397, 0xe6b385,
+ /* 74 */ 0xe6b3b1, 0xe6b2bf, 0xe6b2bb, 0xe6b3a1,
+ /* 78 */ 0xe6b39b, 0xe6b38a, 0xe6b2ac, 0xe6b3af,
+ /* 7c */ 0xe6b39c, 0xe6b396, 0xe6b3a0, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe78295, 0xe7828e, 0xe78292,
+ /* a4 */ 0xe7828a, 0xe78299, 0xe788ac, 0xe788ad,
+ /* a8 */ 0xe788b8, 0xe78988, 0xe789a7, 0xe789a9,
+ /* ac */ 0xe78b80, 0xe78b8e, 0xe78b99, 0xe78b97,
+ /* b0 */ 0xe78b90, 0xe78ea9, 0xe78ea8, 0xe78e9f,
+ /* b4 */ 0xe78eab, 0xe78ea5, 0xe794bd, 0xe7969d,
+ /* b8 */ 0xe79699, 0xe7969a, 0xe79a84, 0xe79b82,
+ /* bc */ 0xe79bb2, 0xe79bb4, 0xe79fa5, 0xe79fbd,
+ /* c0 */ 0xe7a4be, 0xe7a580, 0xe7a581, 0xe7a789,
+ /* c4 */ 0xe7a788, 0xe7a9ba, 0xe7a9b9, 0xe7abba,
+ /* c8 */ 0xe7b3be, 0xe7bd94, 0xe7be8c, 0xe7be8b,
+ /* cc */ 0xe88085, 0xe882ba, 0xe882a5, 0xe882a2,
+ /* d0 */ 0xe882b1, 0xe882a1, 0xe882ab, 0xe882a9,
+ /* d4 */ 0xe882b4, 0xe882aa, 0xe882af, 0xe887a5,
+ /* d8 */ 0xe887be, 0xe8888d, 0xe88ab3, 0xe88a9d,
+ /* dc */ 0xe88a99, 0xe88aad, 0xe88abd, 0xe88a9f,
+ /* e0 */ 0xe88ab9, 0xe88ab1, 0xe88aac, 0xe88aa5,
+ /* e4 */ 0xe88aaf, 0xe88ab8, 0xe88aa3, 0xe88ab0,
+ /* e8 */ 0xe88abe, 0xe88ab7, 0xe8998e, 0xe899b1,
+ /* ec */ 0xe5889d, 0xe8a1a8, 0xe8bb8b, 0xe8bf8e,
+ /* f0 */ 0xe8bf94, 0xe8bf91, 0xe982b5, 0xe982b8,
+ /* f4 */ 0xe982b1, 0xe982b6, 0xe98787, 0xe98791,
+ /* f8 */ 0xe995b7, 0xe99680, 0xe9989c, 0xe99980,
+ /* fc */ 0xe998bf, 0xe998bb, 0xe99984,
+
+ /*** Two byte table, leaf: abxx - offset 0x0088e ***/
+
+ /* 40 */ 0xe99982, 0xe99ab9, 0xe99ba8, 0xe99d92,
+ /* 44 */ 0xe99d9e, 0xe4ba9f, 0xe4baad, 0xe4baae,
+ /* 48 */ 0xe4bfa1, 0xe4beb5, 0xe4beaf, 0xe4bebf,
+ /* 4c */ 0xe4bfa0, 0xe4bf91, 0xe4bf8f, 0xe4bf9d,
+ /* 50 */ 0xe4bf83, 0xe4beb6, 0xe4bf98, 0xe4bf9f,
+ /* 54 */ 0xe4bf8a, 0xe4bf97, 0xe4beae, 0xe4bf90,
+ /* 58 */ 0xe4bf84, 0xe4bf82, 0xe4bf9a, 0xe4bf8e,
+ /* 5c */ 0xe4bf9e, 0xe4beb7, 0xe58597, 0xe58692,
+ /* 60 */ 0xe58691, 0xe586a0, 0xe5898e, 0xe58983,
+ /* 64 */ 0xe5898a, 0xe5898d, 0xe5898c, 0xe5898b,
+ /* 68 */ 0xe58987, 0xe58b87, 0xe58b89, 0xe58b83,
+ /* 6c */ 0xe58b81, 0xe58c8d, 0xe58d97, 0xe58dbb,
+ /* 70 */ 0xe58e9a, 0xe58f9b, 0xe592ac, 0xe59380,
+ /* 74 */ 0xe592a8, 0xe5938e, 0xe59389, 0xe592b8,
+ /* 78 */ 0xe592a6, 0xe592b3, 0xe59387, 0xe59382,
+ /* 7c */ 0xe592bd, 0xe592aa, 0xe59381, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe59384, 0xe59388, 0xe592af,
+ /* a4 */ 0xe592ab, 0xe592b1, 0xe592bb, 0xe592a9,
+ /* a8 */ 0xe592a7, 0xe592bf, 0xe59bbf, 0xe59e82,
+ /* ac */ 0xe59e8b, 0xe59ea0, 0xe59ea3, 0xe59ea2,
+ /* b0 */ 0xe59f8e, 0xe59eae, 0xe59e93, 0xe5a595,
+ /* b4 */ 0xe5a591, 0xe5a58f, 0xe5a58e, 0xe5a590,
+ /* b8 */ 0xe5a79c, 0xe5a798, 0xe5a7bf, 0xe5a7a3,
+ /* bc */ 0xe5a7a8, 0xe5a883, 0xe5a7a5, 0xe5a7aa,
+ /* c0 */ 0xe5a79a, 0xe5a7a6, 0xe5a881, 0xe5a7bb,
+ /* c4 */ 0xe5ada9, 0xe5aea3, 0xe5aea6, 0xe5aea4,
+ /* c8 */ 0xe5aea2, 0xe5aea5, 0xe5b081, 0xe5b18e,
+ /* cc */ 0xe5b18f, 0xe5b18d, 0xe5b18b, 0xe5b399,
+ /* d0 */ 0xe5b392, 0xe5b7b7, 0xe5b89d, 0xe5b8a5,
+ /* d4 */ 0xe5b89f, 0xe5b9bd, 0xe5baa0, 0xe5baa6,
+ /* d8 */ 0xe5bbba, 0xe5bc88, 0xe5bcad, 0xe5bda5,
+ /* dc */ 0xe5be88, 0xe5be85, 0xe5be8a, 0xe5be8b,
+ /* e0 */ 0xe5be87, 0xe5be8c, 0xe5be89, 0xe68092,
+ /* e4 */ 0xe6809d, 0xe680a0, 0xe680a5, 0xe6808e,
+ /* e8 */ 0xe680a8, 0xe6818d, 0xe681b0, 0xe681a8,
+ /* ec */ 0xe681a2, 0xe68186, 0xe68183, 0xe681ac,
+ /* f0 */ 0xe681ab, 0xe681aa, 0xe681a4, 0xe68981,
+ /* f4 */ 0xe68b9c, 0xe68c96, 0xe68c89, 0xe68bbc,
+ /* f8 */ 0xe68bad, 0xe68c81, 0xe68bae, 0xe68bbd,
+ /* fc */ 0xe68c87, 0xe68bb1, 0xe68bb7,
+
+ /*** Two byte table, leaf: acxx - offset 0x0094d ***/
+
+ /* 40 */ 0xe68baf, 0xe68bac, 0xe68bbe, 0xe68bb4,
+ /* 44 */ 0xe68c91, 0xe68c82, 0xe694bf, 0xe69585,
+ /* 48 */ 0xe696ab, 0xe696bd, 0xe697a2, 0xe698a5,
+ /* 4c */ 0xe698ad, 0xe698a0, 0xe698a7, 0xe698af,
+ /* 50 */ 0xe6989f, 0xe698a8, 0xe698b1, 0xe698a4,
+ /* 54 */ 0xe69bb7, 0xe69fbf, 0xe69f93, 0xe69fb1,
+ /* 58 */ 0xe69f94, 0xe69f90, 0xe69fac, 0xe69eb6,
+ /* 5c */ 0xe69eaf, 0xe69fb5, 0xe69fa9, 0xe69faf,
+ /* 60 */ 0xe69f84, 0xe69f91, 0xe69eb4, 0xe69f9a,
+ /* 64 */ 0xe69fa5, 0xe69eb8, 0xe69f8f, 0xe69f9e,
+ /* 68 */ 0xe69fb3, 0xe69eb0, 0xe69f99, 0xe69fa2,
+ /* 6c */ 0xe69f9d, 0xe69f92, 0xe6adaa, 0xe6ae83,
+ /* 70 */ 0xe6ae86, 0xe6aeb5, 0xe6af92, 0xe6af97,
+ /* 74 */ 0xe6b09f, 0xe6b389, 0xe6b48b, 0xe6b4b2,
+ /* 78 */ 0xe6b4aa, 0xe6b581, 0xe6b4a5, 0xe6b48c,
+ /* 7c */ 0xe6b4b1, 0xe6b49e, 0xe6b497, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6b4bb, 0xe6b4bd, 0xe6b4be,
+ /* a4 */ 0xe6b4b6, 0xe6b49b, 0xe6b3b5, 0xe6b4b9,
+ /* a8 */ 0xe6b4a7, 0xe6b4b8, 0xe6b4a9, 0xe6b4ae,
+ /* ac */ 0xe6b4b5, 0xe6b48e, 0xe6b4ab, 0xe782ab,
+ /* b0 */ 0xe782ba, 0xe782b3, 0xe782ac, 0xe782af,
+ /* b4 */ 0xe782ad, 0xe782b8, 0xe782ae, 0xe782a4,
+ /* b8 */ 0xe788b0, 0xe789b2, 0xe789af, 0xe789b4,
+ /* bc */ 0xe78ba9, 0xe78ba0, 0xe78ba1, 0xe78eb7,
+ /* c0 */ 0xe78f8a, 0xe78ebb, 0xe78eb2, 0xe78f8d,
+ /* c4 */ 0xe78f80, 0xe78eb3, 0xe7949a, 0xe794ad,
+ /* c8 */ 0xe7958f, 0xe7958c, 0xe7958e, 0xe7958b,
+ /* cc */ 0xe796ab, 0xe796a4, 0xe796a5, 0xe796a2,
+ /* d0 */ 0xe796a3, 0xe799b8, 0xe79a86, 0xe79a87,
+ /* d4 */ 0xe79a88, 0xe79b88, 0xe79b86, 0xe79b83,
+ /* d8 */ 0xe79b85, 0xe79c81, 0xe79bb9, 0xe79bb8,
+ /* dc */ 0xe79c89, 0xe79c8b, 0xe79bbe, 0xe79bbc,
+ /* e0 */ 0xe79c87, 0xe79f9c, 0xe7a082, 0xe7a094,
+ /* e4 */ 0xe7a08c, 0xe7a08d, 0xe7a586, 0xe7a589,
+ /* e8 */ 0xe7a588, 0xe7a587, 0xe7a6b9, 0xe7a6ba,
+ /* ec */ 0xe7a791, 0xe7a792, 0xe7a78b, 0xe7a9bf,
+ /* f0 */ 0xe7aa81, 0xe7abbf, 0xe7abbd, 0xe7b1bd,
+ /* f4 */ 0xe7b482, 0xe7b485, 0xe7b480, 0xe7b489,
+ /* f8 */ 0xe7b487, 0xe7b484, 0xe7b486, 0xe7bcb8,
+ /* fc */ 0xe7be8e, 0xe7bebf, 0xe88084,
+
+ /*** Two byte table, leaf: adxx - offset 0x00a0c ***/
+
+ /* 40 */ 0xe88090, 0xe8808d, 0xe88091, 0xe880b6,
+ /* 44 */ 0xe88396, 0xe883a5, 0xe8839a, 0xe88383,
+ /* 48 */ 0xe88384, 0xe8838c, 0xe883a1, 0xe8839b,
+ /* 4c */ 0xe8838e, 0xe8839e, 0xe883a4, 0xe8839d,
+ /* 50 */ 0xe887b4, 0xe888a2, 0xe88ba7, 0xe88c83,
+ /* 54 */ 0xe88c85, 0xe88ba3, 0xe88b9b, 0xe88ba6,
+ /* 58 */ 0xe88c84, 0xe88ba5, 0xe88c82, 0xe88c89,
+ /* 5c */ 0xe88b92, 0xe88b97, 0xe88bb1, 0xe88c81,
+ /* 60 */ 0xe88b9c, 0xe88b94, 0xe88b91, 0xe88b9e,
+ /* 64 */ 0xe88b93, 0xe88b9f, 0xe88baf, 0xe88c86,
+ /* 68 */ 0xe89990, 0xe899b9, 0xe899bb, 0xe899ba,
+ /* 6c */ 0xe8a18d, 0xe8a1ab, 0xe8a681, 0xe8a794,
+ /* 70 */ 0xe8a888, 0xe8a882, 0xe8a883, 0xe8b29e,
+ /* 74 */ 0xe8b2a0, 0xe8b5b4, 0xe8b5b3, 0xe8b6b4,
+ /* 78 */ 0xe8bb8d, 0xe8bb8c, 0xe8bfb0, 0xe8bfa6,
+ /* 7c */ 0xe8bfa2, 0xe8bfaa, 0xe8bfa5, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe8bfad, 0xe8bfab, 0xe8bfa4,
+ /* a4 */ 0xe8bfa8, 0xe9838a, 0xe9838e, 0xe98381,
+ /* a8 */ 0xe98383, 0xe9858b, 0xe9858a, 0xe9878d,
+ /* ac */ 0xe99682, 0xe99990, 0xe9998b, 0xe9998c,
+ /* b0 */ 0xe9998d, 0xe99da2, 0xe99da9, 0xe99f8b,
+ /* b4 */ 0xe99fad, 0xe99fb3, 0xe9a081, 0xe9a2a8,
+ /* b8 */ 0xe9a39b, 0xe9a39f, 0xe9a696, 0xe9a699,
+ /* bc */ 0xe4b998, 0xe4bab3, 0xe5808c, 0xe5808d,
+ /* c0 */ 0xe580a3, 0xe4bfaf, 0xe580a6, 0xe580a5,
+ /* c4 */ 0xe4bfb8, 0xe580a9, 0xe58096, 0xe58086,
+ /* c8 */ 0xe580bc, 0xe5809f, 0xe5809a, 0xe58092,
+ /* cc */ 0xe58091, 0xe4bfba, 0xe58080, 0xe58094,
+ /* d0 */ 0xe580a8, 0xe4bfb1, 0xe580a1, 0xe5808b,
+ /* d4 */ 0xe58099, 0xe58098, 0xe4bfb3, 0xe4bfae,
+ /* d8 */ 0xe580ad, 0xe580aa, 0xe4bfbe, 0xe580ab,
+ /* dc */ 0xe58089, 0xe585bc, 0xe586a4, 0xe586a5,
+ /* e0 */ 0xe586a2, 0xe5878d, 0xe5878c, 0xe58786,
+ /* e4 */ 0xe5878b, 0xe58996, 0xe5899c, 0xe58994,
+ /* e8 */ 0xe5899b, 0xe5899d, 0xe58caa, 0xe58dbf,
+ /* ec */ 0xe58e9f, 0xe58e9d, 0xe58f9f, 0xe593a8,
+ /* f0 */ 0xe59490, 0xe59481, 0xe594b7, 0xe593bc,
+ /* f4 */ 0xe593a5, 0xe593b2, 0xe59486, 0xe593ba,
+ /* f8 */ 0xe59494, 0xe593a9, 0xe593ad, 0xe593a1,
+ /* fc */ 0xe59489, 0xe593ae, 0xe593aa,
+
+ /*** Two byte table, leaf: aexx - offset 0x00acb ***/
+
+ /* 40 */ 0xe593a6, 0xe594a7, 0xe59487, 0xe593bd,
+ /* 44 */ 0xe5948f, 0xe59c83, 0xe59c84, 0xe59f82,
+ /* 48 */ 0xe59f94, 0xe59f8b, 0xe59f83, 0xe5a089,
+ /* 4c */ 0xe5a48f, 0xe5a597, 0xe5a598, 0xe5a59a,
+ /* 50 */ 0xe5a891, 0xe5a898, 0xe5a89c, 0xe5a89f,
+ /* 54 */ 0xe5a89b, 0xe5a893, 0xe5a7ac, 0xe5a8a0,
+ /* 58 */ 0xe5a8a3, 0xe5a8a9, 0xe5a8a5, 0xe5a88c,
+ /* 5c */ 0xe5a889, 0xe5adab, 0xe5b198, 0xe5aeb0,
+ /* 60 */ 0xe5aeb3, 0xe5aeb6, 0xe5aeb4, 0xe5aeae,
+ /* 64 */ 0xe5aeb5, 0xe5aeb9, 0xe5aeb8, 0xe5b084,
+ /* 68 */ 0xe5b191, 0xe5b195, 0xe5b190, 0xe5b3ad,
+ /* 6c */ 0xe5b3bd, 0xe5b3bb, 0xe5b3aa, 0xe5b3a8,
+ /* 70 */ 0xe5b3b0, 0xe5b3b6, 0xe5b481, 0xe5b3b4,
+ /* 74 */ 0xe5b7ae, 0xe5b8ad, 0xe5b8ab, 0xe5baab,
+ /* 78 */ 0xe5baad, 0xe5baa7, 0xe5bcb1, 0xe5be92,
+ /* 7c */ 0xe5be91, 0xe5be90, 0xe68199, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe681a3, 0xe681a5, 0xe68190,
+ /* a4 */ 0xe68195, 0xe681ad, 0xe681a9, 0xe681af,
+ /* a8 */ 0xe68284, 0xe6829f, 0xe6829a, 0xe6828d,
+ /* ac */ 0xe68294, 0xe6828c, 0xe68285, 0xe68296,
+ /* b0 */ 0xe68987, 0xe68bb3, 0xe68c88, 0xe68bbf,
+ /* b4 */ 0xe68d8e, 0xe68cbe, 0xe68caf, 0xe68d95,
+ /* b8 */ 0xe68d82, 0xe68d86, 0xe68d8f, 0xe68d89,
+ /* bc */ 0xe68cba, 0xe68d90, 0xe68cbd, 0xe68caa,
+ /* c0 */ 0xe68cab, 0xe68ca8, 0xe68d8d, 0xe68d8c,
+ /* c4 */ 0xe69588, 0xe69589, 0xe69699, 0xe69781,
+ /* c8 */ 0xe69785, 0xe69982, 0xe69989, 0xe6998f,
+ /* cc */ 0xe69983, 0xe69992, 0xe6998c, 0xe69985,
+ /* d0 */ 0xe69981, 0xe69bb8, 0xe69c94, 0xe69c95,
+ /* d4 */ 0xe69c97, 0xe6a0a1, 0xe6a0b8, 0xe6a188,
+ /* d8 */ 0xe6a186, 0xe6a193, 0xe6a0b9, 0xe6a182,
+ /* dc */ 0xe6a194, 0xe6a0a9, 0xe6a2b3, 0xe6a097,
+ /* e0 */ 0xe6a18c, 0xe6a191, 0xe6a0bd, 0xe69fb4,
+ /* e4 */ 0xe6a190, 0xe6a180, 0xe6a0bc, 0xe6a183,
+ /* e8 */ 0xe6a0aa, 0xe6a185, 0xe6a093, 0xe6a098,
+ /* ec */ 0xe6a181, 0xe6ae8a, 0xe6ae89, 0xe6aeb7,
+ /* f0 */ 0xe6b0a3, 0xe6b0a7, 0xe6b0a8, 0xe6b0a6,
+ /* f4 */ 0xe6b0a4, 0xe6b3b0, 0xe6b5aa, 0xe6b695,
+ /* f8 */ 0xe6b688, 0xe6b687, 0xe6b5a6, 0xe6b5b8,
+ /* fc */ 0xe6b5b7, 0xe6b599, 0xe6b693,
+
+ /*** Two byte table, leaf: afxx - offset 0x00b8a ***/
+
+ /* 40 */ 0xe6b5ac, 0xe6b689, 0xe6b5ae, 0xe6b59a,
+ /* 44 */ 0xe6b5b4, 0xe6b5a9, 0xe6b68c, 0xe6b68a,
+ /* 48 */ 0xe6b5b9, 0xe6b685, 0xe6b5a5, 0xe6b694,
+ /* 4c */ 0xe7838a, 0xe78398, 0xe783a4, 0xe78399,
+ /* 50 */ 0xe78388, 0xe7838f, 0xe788b9, 0xe789b9,
+ /* 54 */ 0xe78bbc, 0xe78bb9, 0xe78bbd, 0xe78bb8,
+ /* 58 */ 0xe78bb7, 0xe78e86, 0xe78fad, 0xe79089,
+ /* 5c */ 0xe78fae, 0xe78fa0, 0xe78faa, 0xe78f9e,
+ /* 60 */ 0xe79594, 0xe7959d, 0xe7959c, 0xe7959a,
+ /* 64 */ 0xe79599, 0xe796be, 0xe79785, 0xe79787,
+ /* 68 */ 0xe796b2, 0xe796b3, 0xe796bd, 0xe796bc,
+ /* 6c */ 0xe796b9, 0xe79782, 0xe796b8, 0xe79a8b,
+ /* 70 */ 0xe79ab0, 0xe79b8a, 0xe79b8d, 0xe79b8e,
+ /* 74 */ 0xe79ca9, 0xe79c9f, 0xe79ca0, 0xe79ca8,
+ /* 78 */ 0xe79fa9, 0xe7a0b0, 0xe7a0a7, 0xe7a0b8,
+ /* 7c */ 0xe7a09d, 0xe7a0b4, 0xe7a0b7, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7a0a5, 0xe7a0ad, 0xe7a0a0,
+ /* a4 */ 0xe7a09f, 0xe7a0b2, 0xe7a595, 0xe7a590,
+ /* a8 */ 0xe7a5a0, 0xe7a59f, 0xe7a596, 0xe7a59e,
+ /* ac */ 0xe7a59d, 0xe7a597, 0xe7a59a, 0xe7a7a4,
+ /* b0 */ 0xe7a7a3, 0xe7a7a7, 0xe7a79f, 0xe7a7a6,
+ /* b4 */ 0xe7a7a9, 0xe7a798, 0xe7aa84, 0xe7aa88,
+ /* b8 */ 0xe7ab99, 0xe7ac86, 0xe7ac91, 0xe7b289,
+ /* bc */ 0xe7b4a1, 0xe7b497, 0xe7b48b, 0xe7b48a,
+ /* c0 */ 0xe7b4a0, 0xe7b4a2, 0xe7b494, 0xe7b490,
+ /* c4 */ 0xe7b495, 0xe7b49a, 0xe7b49c, 0xe7b48d,
+ /* c8 */ 0xe7b499, 0xe7b49b, 0xe7bcba, 0xe7bd9f,
+ /* cc */ 0xe7be94, 0xe7bf85, 0xe7bf81, 0xe88086,
+ /* d0 */ 0xe88098, 0xe88095, 0xe88099, 0xe88097,
+ /* d4 */ 0xe880bd, 0xe880bf, 0xe883b1, 0xe88482,
+ /* d8 */ 0xe883b0, 0xe88485, 0xe883ad, 0xe883b4,
+ /* dc */ 0xe88486, 0xe883b8, 0xe883b3, 0xe88488,
+ /* e0 */ 0xe883bd, 0xe8848a, 0xe883bc, 0xe883af,
+ /* e4 */ 0xe887ad, 0xe887ac, 0xe88880, 0xe88890,
+ /* e8 */ 0xe888aa, 0xe888ab, 0xe888a8, 0xe888ac,
+ /* ec */ 0xe88abb, 0xe88cab, 0xe88d92, 0xe88d94,
+ /* f0 */ 0xe88d8a, 0xe88cb8, 0xe88d90, 0xe88d89,
+ /* f4 */ 0xe88cb5, 0xe88cb4, 0xe88d8f, 0xe88cb2,
+ /* f8 */ 0xe88cb9, 0xe88cb6, 0xe88c97, 0xe88d80,
+ /* fc */ 0xe88cb1, 0xe88ca8, 0xe88d83,
+
+ /*** Two byte table, leaf: b0xx - offset 0x00c49 ***/
+
+ /* 40 */ 0xe89994, 0xe89a8a, 0xe89aaa, 0xe89a93,
+ /* 44 */ 0xe89aa4, 0xe89aa9, 0xe89a8c, 0xe89aa3,
+ /* 48 */ 0xe89a9c, 0xe8a1b0, 0xe8a1b7, 0xe8a281,
+ /* 4c */ 0xe8a282, 0xe8a1bd, 0xe8a1b9, 0xe8a898,
+ /* 50 */ 0xe8a890, 0xe8a88e, 0xe8a88c, 0xe8a895,
+ /* 54 */ 0xe8a88a, 0xe8a897, 0xe8a893, 0xe8a896,
+ /* 58 */ 0xe8a88f, 0xe8a891, 0xe8b188, 0xe8b1ba,
+ /* 5c */ 0xe8b1b9, 0xe8b2a1, 0xe8b2a2, 0xe8b5b7,
+ /* 60 */ 0xe8baac, 0xe8bb92, 0xe8bb94, 0xe8bb8f,
+ /* 64 */ 0xe8beb1, 0xe98081, 0xe98086, 0xe8bfb7,
+ /* 68 */ 0xe98080, 0xe8bfba, 0xe8bfb4, 0xe98083,
+ /* 6c */ 0xe8bfbd, 0xe98085, 0xe8bfb8, 0xe98295,
+ /* 70 */ 0xe983a1, 0xe9839d, 0xe983a2, 0xe98592,
+ /* 74 */ 0xe9858d, 0xe9858c, 0xe98798, 0xe9879d,
+ /* 78 */ 0xe98797, 0xe9879c, 0xe98799, 0xe99683,
+ /* 7c */ 0xe999a2, 0xe999a3, 0xe999a1, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9999b, 0xe9999d, 0xe999a4,
+ /* a4 */ 0xe99998, 0xe9999e, 0xe99abb, 0xe9a3a2,
+ /* a8 */ 0xe9a6ac, 0xe9aaa8, 0xe9ab98, 0xe9aca5,
+ /* ac */ 0xe9acb2, 0xe9acbc, 0xe4b9be, 0xe581ba,
+ /* b0 */ 0xe581bd, 0xe5819c, 0xe58187, 0xe58183,
+ /* b4 */ 0xe5818c, 0xe5819a, 0xe58189, 0xe581a5,
+ /* b8 */ 0xe581b6, 0xe5818e, 0xe58195, 0xe581b5,
+ /* bc */ 0xe581b4, 0xe581b7, 0xe5818f, 0xe5808f,
+ /* c0 */ 0xe581af, 0xe581ad, 0xe5859c, 0xe58695,
+ /* c4 */ 0xe587b0, 0xe589aa, 0xe589af, 0xe58b92,
+ /* c8 */ 0xe58b99, 0xe58b98, 0xe58b95, 0xe58c90,
+ /* cc */ 0xe58c8f, 0xe58c99, 0xe58cbf, 0xe58d80,
+ /* d0 */ 0xe58cbe, 0xe58f83, 0xe69bbc, 0xe59586,
+ /* d4 */ 0xe595aa, 0xe595a6, 0xe59584, 0xe5959e,
+ /* d8 */ 0xe595a1, 0xe59583, 0xe5958a, 0xe594b1,
+ /* dc */ 0xe59596, 0xe5958f, 0xe59595, 0xe594af,
+ /* e0 */ 0xe595a4, 0xe594b8, 0xe594ae, 0xe5959c,
+ /* e4 */ 0xe594ac, 0xe595a3, 0xe594b3, 0xe59581,
+ /* e8 */ 0xe59597, 0xe59c88, 0xe59c8b, 0xe59c89,
+ /* ec */ 0xe59f9f, 0xe5a085, 0xe5a08a, 0xe5a086,
+ /* f0 */ 0xe59fa0, 0xe59fa4, 0xe59fba, 0xe5a082,
+ /* f4 */ 0xe5a0b5, 0xe59fb7, 0xe59fb9, 0xe5a4a0,
+ /* f8 */ 0xe5a5a2, 0xe5a8b6, 0xe5a981, 0xe5a989,
+ /* fc */ 0xe5a9a6, 0xe5a9aa, 0xe5a980,
+
+ /*** Two byte table, leaf: b1xx - offset 0x00d08 ***/
+
+ /* 40 */ 0xe5a8bc, 0xe5a9a2, 0xe5a99a, 0xe5a986,
+ /* 44 */ 0xe5a98a, 0xe5adb0, 0xe5af87, 0xe5af85,
+ /* 48 */ 0xe5af84, 0xe5af82, 0xe5aebf, 0xe5af86,
+ /* 4c */ 0xe5b089, 0xe5b088, 0xe5b087, 0xe5b1a0,
+ /* 50 */ 0xe5b19c, 0xe5b19d, 0xe5b487, 0xe5b486,
+ /* 54 */ 0xe5b48e, 0xe5b49b, 0xe5b496, 0xe5b4a2,
+ /* 58 */ 0xe5b491, 0xe5b4a9, 0xe5b494, 0xe5b499,
+ /* 5c */ 0xe5b4a4, 0xe5b4a7, 0xe5b497, 0xe5b7a2,
+ /* 60 */ 0xe5b8b8, 0xe5b8b6, 0xe5b8b3, 0xe5b8b7,
+ /* 64 */ 0xe5bab7, 0xe5bab8, 0xe5bab6, 0xe5bab5,
+ /* 68 */ 0xe5babe, 0xe5bcb5, 0xe5bcb7, 0xe5bd97,
+ /* 6c */ 0xe5bdac, 0xe5bda9, 0xe5bdab, 0xe5be97,
+ /* 70 */ 0xe5be99, 0xe5be9e, 0xe5be98, 0xe5bea1,
+ /* 74 */ 0xe5bea0, 0xe5be9c, 0xe681bf, 0xe682a3,
+ /* 78 */ 0xe68289, 0xe682a0, 0xe682a8, 0xe6838b,
+ /* 7c */ 0xe682b4, 0xe683a6, 0xe682bd, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe68385, 0xe682bb, 0xe682b5,
+ /* a4 */ 0xe6839c, 0xe682bc, 0xe68398, 0xe68395,
+ /* a8 */ 0xe68386, 0xe6839f, 0xe682b8, 0xe6839a,
+ /* ac */ 0xe68387, 0xe6889a, 0xe6889b, 0xe68988,
+ /* b0 */ 0xe68ea0, 0xe68ea7, 0xe68db2, 0xe68e96,
+ /* b4 */ 0xe68ea2, 0xe68ea5, 0xe68db7, 0xe68da7,
+ /* b8 */ 0xe68e98, 0xe68eaa, 0xe68db1, 0xe68ea9,
+ /* bc */ 0xe68e89, 0xe68e83, 0xe68e9b, 0xe68dab,
+ /* c0 */ 0xe68ea8, 0xe68e84, 0xe68e88, 0xe68e99,
+ /* c4 */ 0xe68ea1, 0xe68eac, 0xe68e92, 0xe68e8f,
+ /* c8 */ 0xe68e80, 0xe68dbb, 0xe68da9, 0xe68da8,
+ /* cc */ 0xe68dba, 0xe6959d, 0xe69596, 0xe69591,
+ /* d0 */ 0xe69599, 0xe69597, 0xe5959f, 0xe6958f,
+ /* d4 */ 0xe69598, 0xe69595, 0xe69594, 0xe6969c,
+ /* d8 */ 0xe6969b, 0xe696ac, 0xe6978f, 0xe6978b,
+ /* dc */ 0xe6978c, 0xe6978e, 0xe6999d, 0xe6999a,
+ /* e0 */ 0xe699a4, 0xe699a8, 0xe699a6, 0xe6999e,
+ /* e4 */ 0xe69bb9, 0xe58b97, 0xe69c9b, 0xe6a281,
+ /* e8 */ 0xe6a2af, 0xe6a2a2, 0xe6a293, 0xe6a2b5,
+ /* ec */ 0xe6a1bf, 0xe6a1b6, 0xe6a2b1, 0xe6a2a7,
+ /* f0 */ 0xe6a297, 0xe6a2b0, 0xe6a283, 0xe6a384,
+ /* f4 */ 0xe6a2ad, 0xe6a286, 0xe6a285, 0xe6a294,
+ /* f8 */ 0xe6a29d, 0xe6a2a8, 0xe6a29f, 0xe6a2a1,
+ /* fc */ 0xe6a282, 0xe6acb2, 0xe6aeba,
+
+ /*** Two byte table, leaf: b2xx - offset 0x00dc7 ***/
+
+ /* 40 */ 0xe6afab, 0xe6afac, 0xe6b0ab, 0xe6b68e,
+ /* 44 */ 0xe6b6bc, 0xe6b7b3, 0xe6b799, 0xe6b6b2,
+ /* 48 */ 0xe6b7a1, 0xe6b78c, 0xe6b7a4, 0xe6b7bb,
+ /* 4c */ 0xe6b7ba, 0xe6b885, 0xe6b787, 0xe6b78b,
+ /* 50 */ 0xe6b6af, 0xe6b791, 0xe6b6ae, 0xe6b79e,
+ /* 54 */ 0xe6b7b9, 0xe6b6b8, 0xe6b7b7, 0xe6b7b5,
+ /* 58 */ 0xe6b785, 0xe6b792, 0xe6b89a, 0xe6b6b5,
+ /* 5c */ 0xe6b79a, 0xe6b7ab, 0xe6b798, 0xe6b7aa,
+ /* 60 */ 0xe6b7b1, 0xe6b7ae, 0xe6b7a8, 0xe6b786,
+ /* 64 */ 0xe6b784, 0xe6b6aa, 0xe6b7ac, 0xe6b6bf,
+ /* 68 */ 0xe6b7a6, 0xe783b9, 0xe78489, 0xe7848a,
+ /* 6c */ 0xe783bd, 0xe783af, 0xe788bd, 0xe789bd,
+ /* 70 */ 0xe78a81, 0xe78c9c, 0xe78c9b, 0xe78c96,
+ /* 74 */ 0xe78c93, 0xe78c99, 0xe78e87, 0xe79085,
+ /* 78 */ 0xe7908a, 0xe79083, 0xe79086, 0xe78fbe,
+ /* 7c */ 0xe7908d, 0xe793a0, 0xe793b6, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe793b7, 0xe7949c, 0xe794a2,
+ /* a4 */ 0xe795a5, 0xe795a6, 0xe795a2, 0xe795b0,
+ /* a8 */ 0xe7968f, 0xe79794, 0xe79795, 0xe796b5,
+ /* ac */ 0xe7978a, 0xe7978d, 0xe79a8e, 0xe79b94,
+ /* b0 */ 0xe79b92, 0xe79b9b, 0xe79cb7, 0xe79cbe,
+ /* b4 */ 0xe79cbc, 0xe79cb6, 0xe79cb8, 0xe79cba,
+ /* b8 */ 0xe7a1ab, 0xe7a183, 0xe7a18e, 0xe7a5a5,
+ /* bc */ 0xe7a5a8, 0xe7a5ad, 0xe7a7bb, 0xe7aa92,
+ /* c0 */ 0xe7aa95, 0xe7aca0, 0xe7aca8, 0xe7ac9b,
+ /* c4 */ 0xe7acac, 0xe7aca6, 0xe7ac99, 0xe7ac9e,
+ /* c8 */ 0xe7acae, 0xe7b292, 0xe7b297, 0xe7b295,
+ /* cc */ 0xe7b586, 0xe7b583, 0xe7b5b1, 0xe7b4ae,
+ /* d0 */ 0xe7b4b9, 0xe7b4bc, 0xe7b580, 0xe7b4b0,
+ /* d4 */ 0xe7b4b3, 0xe7b584, 0xe7b4af, 0xe7b582,
+ /* d8 */ 0xe7b4b2, 0xe7b4b1, 0xe7bcbd, 0xe7be9e,
+ /* dc */ 0xe7be9a, 0xe7bf8c, 0xe7bf8e, 0xe7bf92,
+ /* e0 */ 0xe8809c, 0xe8818a, 0xe88186, 0xe884af,
+ /* e4 */ 0xe88496, 0xe884a3, 0xe884ab, 0xe884a9,
+ /* e8 */ 0xe884b0, 0xe884a4, 0xe88882, 0xe888b5,
+ /* ec */ 0xe888b7, 0xe888b6, 0xe888b9, 0xe88e8e,
+ /* f0 */ 0xe88e9e, 0xe88e98, 0xe88db8, 0xe88ea2,
+ /* f4 */ 0xe88e96, 0xe88ebd, 0xe88eab, 0xe88e92,
+ /* f8 */ 0xe88e8a, 0xe88e93, 0xe88e89, 0xe88ea0,
+ /* fc */ 0xe88db7, 0xe88dbb, 0xe88dbc,
+
+ /*** Two byte table, leaf: b3xx - offset 0x00e86 ***/
+
+ /* 40 */ 0xe88e86, 0xe88ea7, 0xe89995, 0xe5bdaa,
+ /* 44 */ 0xe89b87, 0xe89b80, 0xe89ab6, 0xe89b84,
+ /* 48 */ 0xe89ab5, 0xe89b86, 0xe89b8b, 0xe89ab1,
+ /* 4c */ 0xe89aaf, 0xe89b89, 0xe8a193, 0xe8a29e,
+ /* 50 */ 0xe8a288, 0xe8a2ab, 0xe8a292, 0xe8a296,
+ /* 54 */ 0xe8a28d, 0xe8a28b, 0xe8a693, 0xe8a68f,
+ /* 58 */ 0xe8a8aa, 0xe8a89d, 0xe8a8a3, 0xe8a8a5,
+ /* 5c */ 0xe8a8b1, 0xe8a8ad, 0xe8a89f, 0xe8a89b,
+ /* 60 */ 0xe8a8a2, 0xe8b189, 0xe8b19a, 0xe8b2a9,
+ /* 64 */ 0xe8b2ac, 0xe8b2ab, 0xe8b2a8, 0xe8b2aa,
+ /* 68 */ 0xe8b2a7, 0xe8b5a7, 0xe8b5a6, 0xe8b6be,
+ /* 6c */ 0xe8b6ba, 0xe8bb9b, 0xe8bb9f, 0xe98099,
+ /* 70 */ 0xe9808d, 0xe9809a, 0xe98097, 0xe980a3,
+ /* 74 */ 0xe9809f, 0xe9809d, 0xe98090, 0xe98095,
+ /* 78 */ 0xe9809e, 0xe980a0, 0xe9808f, 0xe980a2,
+ /* 7c */ 0xe98096, 0xe9809b, 0xe98094, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe983a8, 0xe983ad, 0xe983bd,
+ /* a4 */ 0xe98597, 0xe9878e, 0xe987b5, 0xe987a6,
+ /* a8 */ 0xe987a3, 0xe987a7, 0xe987ad, 0xe987a9,
+ /* ac */ 0xe99689, 0xe999aa, 0xe999b5, 0xe999b3,
+ /* b0 */ 0xe999b8, 0xe999b0, 0xe999b4, 0xe999b6,
+ /* b4 */ 0xe999b7, 0xe999ac, 0xe99b80, 0xe99baa,
+ /* b8 */ 0xe99ba9, 0xe7aba0, 0xe7ab9f, 0xe9a082,
+ /* bc */ 0xe9a083, 0xe9ad9a, 0xe9b3a5, 0xe9b9b5,
+ /* c0 */ 0xe9b9bf, 0xe9baa5, 0xe9babb, 0xe582a2,
+ /* c4 */ 0xe5828d, 0xe58285, 0xe58299, 0xe58291,
+ /* c8 */ 0xe58280, 0xe58296, 0xe58298, 0xe5829a,
+ /* cc */ 0xe69c80, 0xe587b1, 0xe589b2, 0xe589b4,
+ /* d0 */ 0xe589b5, 0xe589a9, 0xe58b9e, 0xe58b9d,
+ /* d4 */ 0xe58b9b, 0xe58d9a, 0xe58ea5, 0xe595bb,
+ /* d8 */ 0xe59680, 0xe596a7, 0xe595bc, 0xe5968a,
+ /* dc */ 0xe5969d, 0xe59698, 0xe59682, 0xe5969c,
+ /* e0 */ 0xe596aa, 0xe59694, 0xe59687, 0xe5968b,
+ /* e4 */ 0xe59683, 0xe596b3, 0xe596ae, 0xe5969f,
+ /* e8 */ 0xe594be, 0xe596b2, 0xe5969a, 0xe596bb,
+ /* ec */ 0xe596ac, 0xe596b1, 0xe595be, 0xe59689,
+ /* f0 */ 0xe596ab, 0xe59699, 0xe59c8d, 0xe5a0af,
+ /* f4 */ 0xe5a0aa, 0xe5a0b4, 0xe5a0a4, 0xe5a0b0,
+ /* f8 */ 0xe5a0b1, 0xe5a0a1, 0xe5a09d, 0xe5a0a0,
+ /* fc */ 0xe5a3b9, 0xe5a3ba, 0xe5a5a0,
+
+ /*** Two byte table, leaf: b4xx - offset 0x00f45 ***/
+
+ /* 40 */ 0xe5a9b7, 0xe5aa9a, 0xe5a9bf, 0xe5aa92,
+ /* 44 */ 0xe5aa9b, 0xe5aaa7, 0xe5adb3, 0xe5adb1,
+ /* 48 */ 0xe5af92, 0xe5af8c, 0xe5af93, 0xe5af90,
+ /* 4c */ 0xe5b08a, 0xe5b08b, 0xe5b0b1, 0xe5b58c,
+ /* 50 */ 0xe5b590, 0xe5b4b4, 0xe5b587, 0xe5b7bd,
+ /* 54 */ 0xe5b985, 0xe5b8bd, 0xe5b980, 0xe5b983,
+ /* 58 */ 0xe5b9be, 0xe5bb8a, 0xe5bb81, 0xe5bb82,
+ /* 5c */ 0xe5bb84, 0xe5bcbc, 0xe5bdad, 0xe5bea9,
+ /* 60 */ 0xe5beaa, 0xe5bea8, 0xe68391, 0xe683a1,
+ /* 64 */ 0xe682b2, 0xe682b6, 0xe683a0, 0xe6849c,
+ /* 68 */ 0xe684a3, 0xe683ba, 0xe68495, 0xe683b0,
+ /* 6c */ 0xe683bb, 0xe683b4, 0xe685a8, 0xe683b1,
+ /* 70 */ 0xe6848e, 0xe683b6, 0xe68489, 0xe68480,
+ /* 74 */ 0xe68492, 0xe6889f, 0xe68989, 0xe68ea3,
+ /* 78 */ 0xe68e8c, 0xe68f8f, 0xe68f80, 0xe68fa9,
+ /* 7c */ 0xe68f89, 0xe68f86, 0xe68f8d, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe68f92, 0xe68fa3, 0xe68f90,
+ /* a4 */ 0xe68fa1, 0xe68f96, 0xe68fad, 0xe68fae,
+ /* a8 */ 0xe68db6, 0xe68fb4, 0xe68faa, 0xe68f9b,
+ /* ac */ 0xe69192, 0xe68f9a, 0xe68fb9, 0xe6959e,
+ /* b0 */ 0xe695a6, 0xe695a2, 0xe695a3, 0xe69691,
+ /* b4 */ 0xe69690, 0xe696af, 0xe699ae, 0xe699b0,
+ /* b8 */ 0xe699b4, 0xe699b6, 0xe699af, 0xe69a91,
+ /* bc */ 0xe699ba, 0xe699be, 0xe699b7, 0xe69bbe,
+ /* c0 */ 0xe69bbf, 0xe69c9f, 0xe69c9d, 0xe6a3ba,
+ /* c4 */ 0xe6a395, 0xe6a3a0, 0xe6a398, 0xe6a397,
+ /* c8 */ 0xe6a485, 0xe6a39f, 0xe6a3b5, 0xe6a3ae,
+ /* cc */ 0xe6a3a7, 0xe6a3b9, 0xe6a392, 0xe6a3b2,
+ /* d0 */ 0xe6a3a3, 0xe6a38b, 0xe6a38d, 0xe6a48d,
+ /* d4 */ 0xe6a492, 0xe6a48e, 0xe6a389, 0xe6a39a,
+ /* d8 */ 0xe6a5ae, 0xe6a3bb, 0xe6acbe, 0xe6acba,
+ /* dc */ 0xe6acbd, 0xe6ae98, 0xe6ae96, 0xe6aebc,
+ /* e0 */ 0xe6afaf, 0xe6b0ae, 0xe6b0af, 0xe6b0ac,
+ /* e4 */ 0xe6b8af, 0xe6b8b8, 0xe6b994, 0xe6b8a1,
+ /* e8 */ 0xe6b8b2, 0xe6b9a7, 0xe6b98a, 0xe6b8a0,
+ /* ec */ 0xe6b8a5, 0xe6b8a3, 0xe6b89b, 0xe6b99b,
+ /* f0 */ 0xe6b998, 0xe6b8a4, 0xe6b996, 0xe6b9ae,
+ /* f4 */ 0xe6b8ad, 0xe6b8a6, 0xe6b9af, 0xe6b8b4,
+ /* f8 */ 0xe6b98d, 0xe6b8ba, 0xe6b8ac, 0xe6b983,
+ /* fc */ 0xe6b89d, 0xe6b8be, 0xe6bb8b,
+
+ /*** Two byte table, leaf: b5xx - offset 0x01004 ***/
+
+ /* 40 */ 0xe6ba89, 0xe6b899, 0xe6b98e, 0xe6b9a3,
+ /* 44 */ 0xe6b984, 0xe6b9b2, 0xe6b9a9, 0xe6b99f,
+ /* 48 */ 0xe78499, 0xe7849a, 0xe784a6, 0xe784b0,
+ /* 4c */ 0xe784a1, 0xe784b6, 0xe785ae, 0xe7849c,
+ /* 50 */ 0xe7898c, 0xe78a84, 0xe78a80, 0xe78cb6,
+ /* 54 */ 0xe78ca5, 0xe78cb4, 0xe78ca9, 0xe790ba,
+ /* 58 */ 0xe790aa, 0xe790b3, 0xe790a2, 0xe790a5,
+ /* 5c */ 0xe790b5, 0xe790b6, 0xe790b4, 0xe790af,
+ /* 60 */ 0xe7909b, 0xe790a6, 0xe790a8, 0xe794a5,
+ /* 64 */ 0xe794a6, 0xe795ab, 0xe795aa, 0xe797a2,
+ /* 68 */ 0xe7979b, 0xe797a3, 0xe79799, 0xe79798,
+ /* 6c */ 0xe7979e, 0xe797a0, 0xe799bb, 0xe799bc,
+ /* 70 */ 0xe79a96, 0xe79a93, 0xe79ab4, 0xe79b9c,
+ /* 74 */ 0xe79d8f, 0xe79fad, 0xe7a19d, 0xe7a1ac,
+ /* 78 */ 0xe7a1af, 0xe7a88d, 0xe7a888, 0xe7a88b,
+ /* 7c */ 0xe7a885, 0xe7a880, 0xe7aa98, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7aa97, 0xe7aa96, 0xe7aba5,
+ /* a4 */ 0xe7aba3, 0xe7ad89, 0xe7ad96, 0xe7ad86,
+ /* a8 */ 0xe7ad90, 0xe7ad92, 0xe7ad94, 0xe7ad8d,
+ /* ac */ 0xe7ad8b, 0xe7ad8f, 0xe7ad91, 0xe7b29f,
+ /* b0 */ 0xe7b2a5, 0xe7b59e, 0xe7b590, 0xe7b5a8,
+ /* b4 */ 0xe7b595, 0xe7b4ab, 0xe7b5ae, 0xe7b5b2,
+ /* b8 */ 0xe7b5a1, 0xe7b5a6, 0xe7b5a2, 0xe7b5b0,
+ /* bc */ 0xe7b5b3, 0xe59684, 0xe7bf94, 0xe7bf95,
+ /* c0 */ 0xe8808b, 0xe88192, 0xe88285, 0xe88595,
+ /* c4 */ 0xe88594, 0xe8858b, 0xe88591, 0xe8858e,
+ /* c8 */ 0xe884b9, 0xe88586, 0xe884be, 0xe8858c,
+ /* cc */ 0xe88593, 0xe885b4, 0xe88892, 0xe8889c,
+ /* d0 */ 0xe88fa9, 0xe89083, 0xe88fb8, 0xe8908d,
+ /* d4 */ 0xe88fa0, 0xe88f85, 0xe8908b, 0xe88f81,
+ /* d8 */ 0xe88faf, 0xe88fb1, 0xe88fb4, 0xe89197,
+ /* dc */ 0xe8908a, 0xe88fb0, 0xe8908c, 0xe88f8c,
+ /* e0 */ 0xe88fbd, 0xe88fb2, 0xe88f8a, 0xe890b8,
+ /* e4 */ 0xe8908e, 0xe89084, 0xe88f9c, 0xe89087,
+ /* e8 */ 0xe88f94, 0xe88f9f, 0xe8999b, 0xe89b9f,
+ /* ec */ 0xe89b99, 0xe89bad, 0xe89b94, 0xe89b9b,
+ /* f0 */ 0xe89ba4, 0xe89b90, 0xe89b9e, 0xe8a197,
+ /* f4 */ 0xe8a381, 0xe8a382, 0xe8a2b1, 0xe8a683,
+ /* f8 */ 0xe8a696, 0xe8a8bb, 0xe8a9a0, 0xe8a995,
+ /* fc */ 0xe8a99e, 0xe8a8bc, 0xe8a981,
+
+ /*** Two byte table, leaf: b6xx - offset 0x010c3 ***/
+
+ /* 40 */ 0xe8a994, 0xe8a99b, 0xe8a990, 0xe8a986,
+ /* 44 */ 0xe8a8b4, 0xe8a8ba, 0xe8a8b6, 0xe8a996,
+ /* 48 */ 0xe8b1a1, 0xe8b282, 0xe8b2af, 0xe8b2bc,
+ /* 4c */ 0xe8b2b3, 0xe8b2bd, 0xe8b381, 0xe8b2bb,
+ /* 50 */ 0xe8b380, 0xe8b2b4, 0xe8b2b7, 0xe8b2b6,
+ /* 54 */ 0xe8b2bf, 0xe8b2b8, 0xe8b68a, 0xe8b685,
+ /* 58 */ 0xe8b681, 0xe8b78e, 0xe8b79d, 0xe8b78b,
+ /* 5c */ 0xe8b79a, 0xe8b791, 0xe8b78c, 0xe8b79b,
+ /* 60 */ 0xe8b786, 0xe8bbbb, 0xe8bbb8, 0xe8bbbc,
+ /* 64 */ 0xe8be9c, 0xe980ae, 0xe980b5, 0xe980b1,
+ /* 68 */ 0xe980b8, 0xe980b2, 0xe980b6, 0xe98482,
+ /* 6c */ 0xe983b5, 0xe98489, 0xe983be, 0xe985a3,
+ /* 70 */ 0xe985a5, 0xe9878f, 0xe98894, 0xe98895,
+ /* 74 */ 0xe988a3, 0xe98889, 0xe9889e, 0xe9888d,
+ /* 78 */ 0xe98890, 0xe98887, 0xe98891, 0xe99694,
+ /* 7c */ 0xe9968f, 0xe9968b, 0xe99691, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe99693, 0xe99692, 0xe9968e,
+ /* a4 */ 0xe99a8a, 0xe99a8e, 0xe99a8b, 0xe999bd,
+ /* a8 */ 0xe99a85, 0xe99a86, 0xe99a8d, 0xe999b2,
+ /* ac */ 0xe99a84, 0xe99b81, 0xe99b85, 0xe99b84,
+ /* b0 */ 0xe99b86, 0xe99b87, 0xe99baf, 0xe99bb2,
+ /* b4 */ 0xe99f8c, 0xe9a085, 0xe9a086, 0xe9a088,
+ /* b8 */ 0xe9a3a7, 0xe9a3aa, 0xe9a3af, 0xe9a3a9,
+ /* bc */ 0xe9a3b2, 0xe9a3ad, 0xe9a6ae, 0xe9a6ad,
+ /* c0 */ 0xe9bb83, 0xe9bb8d, 0xe9bb91, 0xe4ba82,
+ /* c4 */ 0xe582ad, 0xe582b5, 0xe582b2, 0xe582b3,
+ /* c8 */ 0xe58385, 0xe582be, 0xe582ac, 0xe582b7,
+ /* cc */ 0xe582bb, 0xe582af, 0xe58387, 0xe589bf,
+ /* d0 */ 0xe589b7, 0xe589bd, 0xe58b9f, 0xe58ba6,
+ /* d4 */ 0xe58ba4, 0xe58ba2, 0xe58ba3, 0xe58caf,
+ /* d8 */ 0xe5979f, 0xe597a8, 0xe59793, 0xe597a6,
+ /* dc */ 0xe5978e, 0xe5979c, 0xe59787, 0xe59791,
+ /* e0 */ 0xe597a3, 0xe597a4, 0xe597af, 0xe5979a,
+ /* e4 */ 0xe597a1, 0xe59785, 0xe59786, 0xe597a5,
+ /* e8 */ 0xe59789, 0xe59c92, 0xe59c93, 0xe5a19e,
+ /* ec */ 0xe5a191, 0xe5a198, 0xe5a197, 0xe5a19a,
+ /* f0 */ 0xe5a194, 0xe5a1ab, 0xe5a18c, 0xe5a1ad,
+ /* f4 */ 0xe5a18a, 0xe5a1a2, 0xe5a192, 0xe5a18b,
+ /* f8 */ 0xe5a5a7, 0xe5ab81, 0xe5ab89, 0xe5ab8c,
+ /* fc */ 0xe5aabe, 0xe5aabd, 0xe5aabc,
+
+ /*** Two byte table, leaf: b7xx - offset 0x01182 ***/
+
+ /* 40 */ 0xe5aab3, 0xe5ab82, 0xe5aab2, 0xe5b5a9,
+ /* 44 */ 0xe5b5af, 0xe5b98c, 0xe5b9b9, 0xe5bb89,
+ /* 48 */ 0xe5bb88, 0xe5bc92, 0xe5bd99, 0xe5beac,
+ /* 4c */ 0xe5beae, 0xe6849a, 0xe6848f, 0xe68588,
+ /* 50 */ 0xe6849f, 0xe683b3, 0xe6849b, 0xe683b9,
+ /* 54 */ 0xe68481, 0xe68488, 0xe6858e, 0xe6858c,
+ /* 58 */ 0xe68584, 0xe6858d, 0xe684be, 0xe684b4,
+ /* 5c */ 0xe684a7, 0xe6848d, 0xe68486, 0xe684b7,
+ /* 60 */ 0xe688a1, 0xe688a2, 0xe69093, 0xe690be,
+ /* 64 */ 0xe6909e, 0xe690aa, 0xe690ad, 0xe690bd,
+ /* 68 */ 0xe690ac, 0xe6908f, 0xe6909c, 0xe69094,
+ /* 6c */ 0xe6908d, 0xe690b6, 0xe69096, 0xe69097,
+ /* 70 */ 0xe69086, 0xe695ac, 0xe6969f, 0xe696b0,
+ /* 74 */ 0xe69a97, 0xe69a89, 0xe69a87, 0xe69a88,
+ /* 78 */ 0xe69a96, 0xe69a84, 0xe69a98, 0xe69a8d,
+ /* 7c */ 0xe69c83, 0xe6a694, 0xe6a5ad, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6a59a, 0xe6a5b7, 0xe6a5a0,
+ /* a4 */ 0xe6a594, 0xe6a5b5, 0xe6a4b0, 0xe6a682,
+ /* a8 */ 0xe6a58a, 0xe6a5a8, 0xe6a5ab, 0xe6a59e,
+ /* ac */ 0xe6a593, 0xe6a5b9, 0xe6a686, 0xe6a59d,
+ /* b0 */ 0xe6a5a3, 0xe6a59b, 0xe6ad87, 0xe6adb2,
+ /* b4 */ 0xe6af80, 0xe6aebf, 0xe6af93, 0xe6afbd,
+ /* b8 */ 0xe6baa2, 0xe6baaf, 0xe6bb93, 0xe6bab6,
+ /* bc */ 0xe6bb82, 0xe6ba90, 0xe6ba9d, 0xe6bb87,
+ /* c0 */ 0xe6bb85, 0xe6baa5, 0xe6ba98, 0xe6babc,
+ /* c4 */ 0xe6baba, 0xe6baab, 0xe6bb91, 0xe6ba96,
+ /* c8 */ 0xe6ba9c, 0xe6bb84, 0xe6bb94, 0xe6baaa,
+ /* cc */ 0xe6baa7, 0xe6bab4, 0xe7858e, 0xe78599,
+ /* d0 */ 0xe785a9, 0xe785a4, 0xe78589, 0xe785a7,
+ /* d4 */ 0xe7859c, 0xe785ac, 0xe785a6, 0xe7858c,
+ /* d8 */ 0xe785a5, 0xe7859e, 0xe78586, 0xe785a8,
+ /* dc */ 0xe78596, 0xe788ba, 0xe78992, 0xe78cb7,
+ /* e0 */ 0xe78d85, 0xe78cbf, 0xe78cbe, 0xe791af,
+ /* e4 */ 0xe7919a, 0xe79195, 0xe7919f, 0xe7919e,
+ /* e8 */ 0xe79181, 0xe790bf, 0xe79199, 0xe7919b,
+ /* ec */ 0xe7919c, 0xe795b6, 0xe795b8, 0xe79880,
+ /* f0 */ 0xe797b0, 0xe79881, 0xe797b2, 0xe797b1,
+ /* f4 */ 0xe797ba, 0xe797bf, 0xe797b4, 0xe797b3,
+ /* f8 */ 0xe79b9e, 0xe79b9f, 0xe79d9b, 0xe79dab,
+ /* fc */ 0xe79da6, 0xe79d9e, 0xe79da3,
+
+ /*** Two byte table, leaf: b8xx - offset 0x01241 ***/
+
+ /* 40 */ 0xe79db9, 0xe79daa, 0xe79dac, 0xe79d9c,
+ /* 44 */ 0xe79da5, 0xe79da8, 0xe79da2, 0xe79fae,
+ /* 48 */ 0xe7a28e, 0xe7a2b0, 0xe7a297, 0xe7a298,
+ /* 4c */ 0xe7a28c, 0xe7a289, 0xe7a1bc, 0xe7a291,
+ /* 50 */ 0xe7a293, 0xe7a1bf, 0xe7a5ba, 0xe7a5bf,
+ /* 54 */ 0xe7a681, 0xe890ac, 0xe7a6bd, 0xe7a89c,
+ /* 58 */ 0xe7a89a, 0xe7a8a0, 0xe7a894, 0xe7a89f,
+ /* 5c */ 0xe7a89e, 0xe7aa9f, 0xe7aaa0, 0xe7adb7,
+ /* 60 */ 0xe7af80, 0xe7ada0, 0xe7adae, 0xe7ada7,
+ /* 64 */ 0xe7b2b1, 0xe7b2b3, 0xe7b2b5, 0xe7b693,
+ /* 68 */ 0xe7b5b9, 0xe7b691, 0xe7b681, 0xe7b68f,
+ /* 6c */ 0xe7b59b, 0xe7bdae, 0xe7bda9, 0xe7bdaa,
+ /* 70 */ 0xe7bdb2, 0xe7bea9, 0xe7bea8, 0xe7bea4,
+ /* 74 */ 0xe88196, 0xe88198, 0xe88286, 0xe88284,
+ /* 78 */ 0xe885b1, 0xe885b0, 0xe885b8, 0xe885a5,
+ /* 7c */ 0xe885ae, 0xe885b3, 0xe885ab, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe885b9, 0xe885ba, 0xe885a6,
+ /* a4 */ 0xe88885, 0xe88987, 0xe89282, 0xe891b7,
+ /* a8 */ 0xe890bd, 0xe890b1, 0xe891b5, 0xe891a6,
+ /* ac */ 0xe891ab, 0xe89189, 0xe891ac, 0xe8919b,
+ /* b0 */ 0xe890bc, 0xe890b5, 0xe891a1, 0xe891a3,
+ /* b4 */ 0xe891a9, 0xe891ad, 0xe89186, 0xe8999e,
+ /* b8 */ 0xe8999c, 0xe8999f, 0xe89bb9, 0xe89c93,
+ /* bc */ 0xe89c88, 0xe89c87, 0xe89c80, 0xe89bbe,
+ /* c0 */ 0xe89bbb, 0xe89c82, 0xe89c83, 0xe89c86,
+ /* c4 */ 0xe89c8a, 0xe8a199, 0xe8a39f, 0xe8a394,
+ /* c8 */ 0xe8a399, 0xe8a39c, 0xe8a398, 0xe8a39d,
+ /* cc */ 0xe8a3a1, 0xe8a38a, 0xe8a395, 0xe8a392,
+ /* d0 */ 0xe8a69c, 0xe8a7a3, 0xe8a9ab, 0xe8a9b2,
+ /* d4 */ 0xe8a9b3, 0xe8a9a6, 0xe8a9a9, 0xe8a9b0,
+ /* d8 */ 0xe8aa87, 0xe8a9bc, 0xe8a9a3, 0xe8aaa0,
+ /* dc */ 0xe8a9b1, 0xe8aa85, 0xe8a9ad, 0xe8a9a2,
+ /* e0 */ 0xe8a9ae, 0xe8a9ac, 0xe8a9b9, 0xe8a9bb,
+ /* e4 */ 0xe8a8be, 0xe8a9a8, 0xe8b1a2, 0xe8b28a,
+ /* e8 */ 0xe8b289, 0xe8b38a, 0xe8b387, 0xe8b388,
+ /* ec */ 0xe8b384, 0xe8b2b2, 0xe8b383, 0xe8b382,
+ /* f0 */ 0xe8b385, 0xe8b7a1, 0xe8b79f, 0xe8b7a8,
+ /* f4 */ 0xe8b7af, 0xe8b7b3, 0xe8b7ba, 0xe8b7aa,
+ /* f8 */ 0xe8b7a4, 0xe8b7a6, 0xe8bab2, 0xe8bc83,
+ /* fc */ 0xe8bc89, 0xe8bbbe, 0xe8bc8a,
+
+ /*** Two byte table, leaf: b9xx - offset 0x01300 ***/
+
+ /* 40 */ 0xe8be9f, 0xe8beb2, 0xe9818b, 0xe9818a,
+ /* 44 */ 0xe98193, 0xe98182, 0xe98194, 0xe980bc,
+ /* 48 */ 0xe98195, 0xe98190, 0xe98187, 0xe9818f,
+ /* 4c */ 0xe9818e, 0xe9818d, 0xe98191, 0xe980be,
+ /* 50 */ 0xe98181, 0xe98492, 0xe98497, 0xe985ac,
+ /* 54 */ 0xe985aa, 0xe985a9, 0xe98789, 0xe988b7,
+ /* 58 */ 0xe98997, 0xe988b8, 0xe988bd, 0xe98980,
+ /* 5c */ 0xe988be, 0xe9899b, 0xe9898b, 0xe989a4,
+ /* 60 */ 0xe98991, 0xe988b4, 0xe98989, 0xe9898d,
+ /* 64 */ 0xe98985, 0xe988b9, 0xe988bf, 0xe9899a,
+ /* 68 */ 0xe99698, 0xe99a98, 0xe99a94, 0xe99a95,
+ /* 6c */ 0xe99b8d, 0xe99b8b, 0xe99b89, 0xe99b8a,
+ /* 70 */ 0xe99bb7, 0xe99bbb, 0xe99bb9, 0xe99bb6,
+ /* 74 */ 0xe99d96, 0xe99db4, 0xe99db6, 0xe9a090,
+ /* 78 */ 0xe9a091, 0xe9a093, 0xe9a08a, 0xe9a092,
+ /* 7c */ 0xe9a08c, 0xe9a3bc, 0xe9a3b4, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9a3bd, 0xe9a3be, 0xe9a6b3,
+ /* a4 */ 0xe9a6b1, 0xe9a6b4, 0xe9aba1, 0xe9b3a9,
+ /* a8 */ 0xe9ba82, 0xe9bc8e, 0xe9bc93, 0xe9bca0,
+ /* ac */ 0xe583a7, 0xe583ae, 0xe583a5, 0xe58396,
+ /* b0 */ 0xe583ad, 0xe5839a, 0xe58395, 0xe5838f,
+ /* b4 */ 0xe58391, 0xe583b1, 0xe5838e, 0xe583a9,
+ /* b8 */ 0xe585a2, 0xe587b3, 0xe58a83, 0xe58a82,
+ /* bc */ 0xe58cb1, 0xe58ead, 0xe597be, 0xe59880,
+ /* c0 */ 0xe5989b, 0xe59897, 0xe597bd, 0xe59894,
+ /* c4 */ 0xe59886, 0xe59889, 0xe5988d, 0xe5988e,
+ /* c8 */ 0xe597b7, 0xe59896, 0xe5989f, 0xe59888,
+ /* cc */ 0xe59890, 0xe597b6, 0xe59c98, 0xe59c96,
+ /* d0 */ 0xe5a1b5, 0xe5a1be, 0xe5a283, 0xe5a293,
+ /* d4 */ 0xe5a28a, 0xe5a1b9, 0xe5a285, 0xe5a1bd,
+ /* d8 */ 0xe5a3bd, 0xe5a4a5, 0xe5a4a2, 0xe5a4a4,
+ /* dc */ 0xe5a5aa, 0xe5a5a9, 0xe5aba1, 0xe5aba6,
+ /* e0 */ 0xe5aba9, 0xe5ab97, 0xe5ab96, 0xe5ab98,
+ /* e4 */ 0xe5aba3, 0xe5adb5, 0xe5af9e, 0xe5afa7,
+ /* e8 */ 0xe5afa1, 0xe5afa5, 0xe5afa6, 0xe5afa8,
+ /* ec */ 0xe5afa2, 0xe5afa4, 0xe5af9f, 0xe5b08d,
+ /* f0 */ 0xe5b1a2, 0xe5b684, 0xe5b687, 0xe5b99b,
+ /* f4 */ 0xe5b9a3, 0xe5b995, 0xe5b997, 0xe5b994,
+ /* f8 */ 0xe5bb93, 0xe5bb96, 0xe5bc8a, 0xe5bd86,
+ /* fc */ 0xe5bdb0, 0xe5beb9, 0xe68587,
+
+ /*** Two byte table, leaf: baxx - offset 0x013bf ***/
+
+ /* 40 */ 0xe684bf, 0xe6858b, 0xe685b7, 0xe685a2,
+ /* 44 */ 0xe685a3, 0xe6859f, 0xe6859a, 0xe68598,
+ /* 48 */ 0xe685b5, 0xe688aa, 0xe69287, 0xe69198,
+ /* 4c */ 0xe69194, 0xe692a4, 0xe691b8, 0xe6919f,
+ /* 50 */ 0xe691ba, 0xe69191, 0xe691a7, 0xe690b4,
+ /* 54 */ 0xe691ad, 0xe691bb, 0xe695b2, 0xe696a1,
+ /* 58 */ 0xe69797, 0xe69796, 0xe69aa2, 0xe69aa8,
+ /* 5c */ 0xe69a9d, 0xe6a69c, 0xe6a6a8, 0xe6a695,
+ /* 60 */ 0xe6a781, 0xe6a6ae, 0xe6a793, 0xe6a78b,
+ /* 64 */ 0xe6a69b, 0xe6a6b7, 0xe6a6bb, 0xe6a6ab,
+ /* 68 */ 0xe6a6b4, 0xe6a790, 0xe6a78d, 0xe6a6ad,
+ /* 6c */ 0xe6a78c, 0xe6a6a6, 0xe6a783, 0xe6a6a3,
+ /* 70 */ 0xe6ad89, 0xe6ad8c, 0xe6b0b3, 0xe6bcb3,
+ /* 74 */ 0xe6bc94, 0xe6bbbe, 0xe6bc93, 0xe6bbb4,
+ /* 78 */ 0xe6bca9, 0xe6bcbe, 0xe6bca0, 0xe6bcac,
+ /* 7c */ 0xe6bc8f, 0xe6bc82, 0xe6bca2, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6bbbf, 0xe6bbaf, 0xe6bc86,
+ /* a4 */ 0xe6bcb1, 0xe6bcb8, 0xe6bcb2, 0xe6bca3,
+ /* a8 */ 0xe6bc95, 0xe6bcab, 0xe6bcaf, 0xe6be88,
+ /* ac */ 0xe6bcaa, 0xe6bbac, 0xe6bc81, 0xe6bbb2,
+ /* b0 */ 0xe6bb8c, 0xe6bbb7, 0xe78694, 0xe78699,
+ /* b4 */ 0xe785bd, 0xe7868a, 0xe78684, 0xe78692,
+ /* b8 */ 0xe788be, 0xe78a92, 0xe78a96, 0xe78d84,
+ /* bc */ 0xe78d90, 0xe791a4, 0xe791a3, 0xe791aa,
+ /* c0 */ 0xe791b0, 0xe791ad, 0xe79484, 0xe79691,
+ /* c4 */ 0xe798a7, 0xe7988d, 0xe7988b, 0xe79889,
+ /* c8 */ 0xe79893, 0xe79ba1, 0xe79ba3, 0xe79e84,
+ /* cc */ 0xe79dbd, 0xe79dbf, 0xe79da1, 0xe7a381,
+ /* d0 */ 0xe7a29f, 0xe7a2a7, 0xe7a2b3, 0xe7a2a9,
+ /* d4 */ 0xe7a2a3, 0xe7a68e, 0xe7a68f, 0xe7a68d,
+ /* d8 */ 0xe7a8ae, 0xe7a8b1, 0xe7aaaa, 0xe7aaa9,
+ /* dc */ 0xe7abad, 0xe7abaf, 0xe7aea1, 0xe7ae95,
+ /* e0 */ 0xe7ae8b, 0xe7adb5, 0xe7ae97, 0xe7ae9d,
+ /* e4 */ 0xe7ae94, 0xe7ae8f, 0xe7aeb8, 0xe7ae87,
+ /* e8 */ 0xe7ae84, 0xe7b2b9, 0xe7b2bd, 0xe7b2be,
+ /* ec */ 0xe7b6bb, 0xe7b6b0, 0xe7b69c, 0xe7b6bd,
+ /* f0 */ 0xe7b6be, 0xe7b6a0, 0xe7b78a, 0xe7b6b4,
+ /* f4 */ 0xe7b6b2, 0xe7b6b1, 0xe7b6ba, 0xe7b6a2,
+ /* f8 */ 0xe7b6bf, 0xe7b6b5, 0xe7b6b8, 0xe7b6ad,
+ /* fc */ 0xe7b792, 0xe7b787, 0xe7b6ac,
+
+ /*** Two byte table, leaf: bbxx - offset 0x0147e ***/
+
+ /* 40 */ 0xe7bdb0, 0xe7bfa0, 0xe7bfa1, 0xe7bf9f,
+ /* 44 */ 0xe8819e, 0xe8819a, 0xe88287, 0xe88590,
+ /* 48 */ 0xe88680, 0xe8868f, 0xe88688, 0xe8868a,
+ /* 4c */ 0xe885bf, 0xe88682, 0xe887a7, 0xe887ba,
+ /* 50 */ 0xe88887, 0xe88894, 0xe8889e, 0xe8898b,
+ /* 54 */ 0xe89389, 0xe892bf, 0xe89386, 0xe89384,
+ /* 58 */ 0xe89299, 0xe8929e, 0xe892b2, 0xe8929c,
+ /* 5c */ 0xe8938b, 0xe892b8, 0xe89380, 0xe89393,
+ /* 60 */ 0xe89290, 0xe892bc, 0xe89391, 0xe8938a,
+ /* 64 */ 0xe89cbf, 0xe89c9c, 0xe89cbb, 0xe89ca2,
+ /* 68 */ 0xe89ca5, 0xe89cb4, 0xe89c98, 0xe89d95,
+ /* 6c */ 0xe89cb7, 0xe89ca9, 0xe8a3b3, 0xe8a482,
+ /* 70 */ 0xe8a3b4, 0xe8a3b9, 0xe8a3b8, 0xe8a3bd,
+ /* 74 */ 0xe8a3a8, 0xe8a49a, 0xe8a3af, 0xe8aaa6,
+ /* 78 */ 0xe8aa8c, 0xe8aa9e, 0xe8aaa3, 0xe8aa8d,
+ /* 7c */ 0xe8aaa1, 0xe8aa93, 0xe8aaa4, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe8aaaa, 0xe8aaa5, 0xe8aaa8,
+ /* a4 */ 0xe8aa98, 0xe8aa91, 0xe8aa9a, 0xe8aaa7,
+ /* a8 */ 0xe8b1aa, 0xe8b28d, 0xe8b28c, 0xe8b393,
+ /* ac */ 0xe8b391, 0xe8b392, 0xe8b5ab, 0xe8b699,
+ /* b0 */ 0xe8b695, 0xe8b7bc, 0xe8bc94, 0xe8bc92,
+ /* b4 */ 0xe8bc95, 0xe8bc93, 0xe8bea3, 0xe981a0,
+ /* b8 */ 0xe98198, 0xe9819c, 0xe981a3, 0xe98199,
+ /* bc */ 0xe9819e, 0xe981a2, 0xe9819d, 0xe9819b,
+ /* c0 */ 0xe98499, 0xe98498, 0xe9849e, 0xe985b5,
+ /* c4 */ 0xe985b8, 0xe985b7, 0xe985b4, 0xe989b8,
+ /* c8 */ 0xe98a80, 0xe98a85, 0xe98a98, 0xe98a96,
+ /* cc */ 0xe989bb, 0xe98a93, 0xe98a9c, 0xe98aa8,
+ /* d0 */ 0xe989bc, 0xe98a91, 0xe996a1, 0xe996a8,
+ /* d4 */ 0xe996a9, 0xe996a3, 0xe996a5, 0xe996a4,
+ /* d8 */ 0xe99a99, 0xe99a9c, 0xe99a9b, 0xe99b8c,
+ /* dc */ 0xe99b92, 0xe99c80, 0xe99dbc, 0xe99e85,
+ /* e0 */ 0xe99fb6, 0xe9a097, 0xe9a098, 0xe9a2af,
+ /* e4 */ 0xe9a2b1, 0xe9a483, 0xe9a485, 0xe9a48c,
+ /* e8 */ 0xe9a489, 0xe9a781, 0xe9aaaf, 0xe9aab0,
+ /* ec */ 0xe9aba6, 0xe9ad81, 0xe9ad82, 0xe9b3b4,
+ /* f0 */ 0xe9b3b6, 0xe9b3b3, 0xe9babc, 0xe9bcbb,
+ /* f4 */ 0xe9bd8a, 0xe58484, 0xe58480, 0xe583bb,
+ /* f8 */ 0xe583b5, 0xe583b9, 0xe58482, 0xe58488,
+ /* fc */ 0xe58489, 0xe58485, 0xe5879c,
+
+ /*** Two byte table, leaf: bcxx - offset 0x0153d ***/
+
+ /* 40 */ 0xe58a87, 0xe58a88, 0xe58a89, 0xe58a8d,
+ /* 44 */ 0xe58a8a, 0xe58bb0, 0xe58eb2, 0xe598ae,
+ /* 48 */ 0xe598bb, 0xe598b9, 0xe598b2, 0xe598bf,
+ /* 4c */ 0xe598b4, 0xe598a9, 0xe59993, 0xe5998e,
+ /* 50 */ 0xe59997, 0xe599b4, 0xe598b6, 0xe598af,
+ /* 54 */ 0xe598b0, 0xe5a280, 0xe5a29f, 0xe5a29e,
+ /* 58 */ 0xe5a2b3, 0xe5a29c, 0xe5a2ae, 0xe5a2a9,
+ /* 5c */ 0xe5a2a6, 0xe5a5ad, 0xe5ac89, 0xe5abbb,
+ /* 60 */ 0xe5ac8b, 0xe5abb5, 0xe5ac8c, 0xe5ac88,
+ /* 64 */ 0xe5afae, 0xe5afac, 0xe5afa9, 0xe5afab,
+ /* 68 */ 0xe5b1a4, 0xe5b1a5, 0xe5b69d, 0xe5b694,
+ /* 6c */ 0xe5b9a2, 0xe5b99f, 0xe5b9a1, 0xe5bba2,
+ /* 70 */ 0xe5bb9a, 0xe5bb9f, 0xe5bb9d, 0xe5bba3,
+ /* 74 */ 0xe5bba0, 0xe5bd88, 0xe5bdb1, 0xe5beb7,
+ /* 78 */ 0xe5beb5, 0xe685b6, 0xe685a7, 0xe685ae,
+ /* 7c */ 0xe6859d, 0xe68595, 0xe68682, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe685bc, 0xe685b0, 0xe685ab,
+ /* a4 */ 0xe685be, 0xe686a7, 0xe68690, 0xe686ab,
+ /* a8 */ 0xe6868e, 0xe686ac, 0xe6869a, 0xe686a4,
+ /* ac */ 0xe68694, 0xe686ae, 0xe688ae, 0xe691a9,
+ /* b0 */ 0xe691af, 0xe691b9, 0xe6929e, 0xe692b2,
+ /* b4 */ 0xe69288, 0xe69290, 0xe692b0, 0xe692a5,
+ /* b8 */ 0xe69293, 0xe69295, 0xe692a9, 0xe69292,
+ /* bc */ 0xe692ae, 0xe692ad, 0xe692ab, 0xe6929a,
+ /* c0 */ 0xe692ac, 0xe69299, 0xe692a2, 0xe692b3,
+ /* c4 */ 0xe695b5, 0xe695b7, 0xe695b8, 0xe69aae,
+ /* c8 */ 0xe69aab, 0xe69ab4, 0xe69ab1, 0xe6a8a3,
+ /* cc */ 0xe6a89f, 0xe6a7a8, 0xe6a881, 0xe6a89e,
+ /* d0 */ 0xe6a899, 0xe6a7bd, 0xe6a8a1, 0xe6a893,
+ /* d4 */ 0xe6a88a, 0xe6a7b3, 0xe6a882, 0xe6a885,
+ /* d8 */ 0xe6a7ad, 0xe6a891, 0xe6ad90, 0xe6ad8e,
+ /* dc */ 0xe6aea4, 0xe6af85, 0xe6af86, 0xe6bcbf,
+ /* e0 */ 0xe6bdbc, 0xe6be84, 0xe6bd91, 0xe6bda6,
+ /* e4 */ 0xe6bd94, 0xe6be86, 0xe6bdad, 0xe6bd9b,
+ /* e8 */ 0xe6bdb8, 0xe6bdae, 0xe6be8e, 0xe6bdba,
+ /* ec */ 0xe6bdb0, 0xe6bda4, 0xe6be97, 0xe6bd98,
+ /* f0 */ 0xe6bb95, 0xe6bdaf, 0xe6bda0, 0xe6bd9f,
+ /* f4 */ 0xe7869f, 0xe786ac, 0xe786b1, 0xe786a8,
+ /* f8 */ 0xe78996, 0xe78a9b, 0xe78d8e, 0xe78d97,
+ /* fc */ 0xe791a9, 0xe7928b, 0xe79283,
+
+ /*** Two byte table, leaf: bdxx - offset 0x015fc ***/
+
+ /* 40 */ 0xe791be, 0xe79280, 0xe795bf, 0xe798a0,
+ /* 44 */ 0xe798a9, 0xe7989f, 0xe798a4, 0xe798a6,
+ /* 48 */ 0xe798a1, 0xe798a2, 0xe79a9a, 0xe79aba,
+ /* 4c */ 0xe79ba4, 0xe79e8e, 0xe79e87, 0xe79e8c,
+ /* 50 */ 0xe79e91, 0xe79e8b, 0xe7a38b, 0xe7a385,
+ /* 54 */ 0xe7a2ba, 0xe7a38a, 0xe7a2be, 0xe7a395,
+ /* 58 */ 0xe7a2bc, 0xe7a390, 0xe7a8bf, 0xe7a8bc,
+ /* 5c */ 0xe7a980, 0xe7a8bd, 0xe7a8b7, 0xe7a8bb,
+ /* 60 */ 0xe7aaaf, 0xe7aaae, 0xe7aead, 0xe7aeb1,
+ /* 64 */ 0xe7af84, 0xe7aeb4, 0xe7af86, 0xe7af87,
+ /* 68 */ 0xe7af81, 0xe7aea0, 0xe7af8c, 0xe7b38a,
+ /* 6c */ 0xe7b7a0, 0xe7b7b4, 0xe7b7af, 0xe7b7bb,
+ /* 70 */ 0xe7b798, 0xe7b7ac, 0xe7b79d, 0xe7b7a8,
+ /* 74 */ 0xe7b7a3, 0xe7b79a, 0xe7b79e, 0xe7b7a9,
+ /* 78 */ 0xe7b69e, 0xe7b799, 0xe7b7b2, 0xe7b7b9,
+ /* 7c */ 0xe7bdb5, 0xe7bdb7, 0xe7beaf, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7bfa9, 0xe880a6, 0xe8869b,
+ /* a4 */ 0xe8869c, 0xe8869d, 0xe886a0, 0xe8869a,
+ /* a8 */ 0xe88698, 0xe89497, 0xe894bd, 0xe8949a,
+ /* ac */ 0xe893ae, 0xe894ac, 0xe894ad, 0xe89493,
+ /* b0 */ 0xe89491, 0xe894a3, 0xe894a1, 0xe89494,
+ /* b4 */ 0xe893ac, 0xe894a5, 0xe893bf, 0xe89486,
+ /* b8 */ 0xe89e82, 0xe89db4, 0xe89db6, 0xe89da0,
+ /* bc */ 0xe89da6, 0xe89db8, 0xe89da8, 0xe89d99,
+ /* c0 */ 0xe89d97, 0xe89d8c, 0xe89d93, 0xe8a19b,
+ /* c4 */ 0xe8a19d, 0xe8a490, 0xe8a487, 0xe8a492,
+ /* c8 */ 0xe8a493, 0xe8a495, 0xe8a48a, 0xe8aabc,
+ /* cc */ 0xe8ab92, 0xe8ab87, 0xe8ab84, 0xe8aa95,
+ /* d0 */ 0xe8ab8b, 0xe8abb8, 0xe8aab2, 0xe8ab89,
+ /* d4 */ 0xe8ab82, 0xe8aabf, 0xe8aab0, 0xe8ab96,
+ /* d8 */ 0xe8ab8d, 0xe8aab6, 0xe8aab9, 0xe8ab9b,
+ /* dc */ 0xe8b18c, 0xe8b18e, 0xe8b1ac, 0xe8b3a0,
+ /* e0 */ 0xe8b39e, 0xe8b3a6, 0xe8b3a4, 0xe8b3ac,
+ /* e4 */ 0xe8b3ad, 0xe8b3a2, 0xe8b3a3, 0xe8b39c,
+ /* e8 */ 0xe8b3aa, 0xe8b3a1, 0xe8b5ad, 0xe8b69f,
+ /* ec */ 0xe8b6a3, 0xe8b8ab, 0xe8b890, 0xe8b89d,
+ /* f0 */ 0xe8b8a2, 0xe8b88f, 0xe8b8a9, 0xe8b89f,
+ /* f4 */ 0xe8b8a1, 0xe8b89e, 0xe8baba, 0xe8bc9d,
+ /* f8 */ 0xe8bc9b, 0xe8bc9f, 0xe8bca9, 0xe8bca6,
+ /* fc */ 0xe8bcaa, 0xe8bc9c, 0xe8bc9e,
+
+ /*** Two byte table, leaf: bexx - offset 0x016bb ***/
+
+ /* 40 */ 0xe8bca5, 0xe981a9, 0xe981ae, 0xe981a8,
+ /* 44 */ 0xe981ad, 0xe981b7, 0xe984b0, 0xe984ad,
+ /* 48 */ 0xe984a7, 0xe984b1, 0xe98687, 0xe98689,
+ /* 4c */ 0xe9868b, 0xe98683, 0xe98b85, 0xe98abb,
+ /* 50 */ 0xe98ab7, 0xe98baa, 0xe98aac, 0xe98ba4,
+ /* 54 */ 0xe98b81, 0xe98ab3, 0xe98abc, 0xe98b92,
+ /* 58 */ 0xe98b87, 0xe98bb0, 0xe98ab2, 0xe996ad,
+ /* 5c */ 0xe996b1, 0xe99c84, 0xe99c86, 0xe99c87,
+ /* 60 */ 0xe99c89, 0xe99da0, 0xe99e8d, 0xe99e8b,
+ /* 64 */ 0xe99e8f, 0xe9a0a1, 0xe9a0ab, 0xe9a09c,
+ /* 68 */ 0xe9a2b3, 0xe9a48a, 0xe9a493, 0xe9a492,
+ /* 6c */ 0xe9a498, 0xe9a79d, 0xe9a790, 0xe9a79f,
+ /* 70 */ 0xe9a79b, 0xe9a791, 0xe9a795, 0xe9a792,
+ /* 74 */ 0xe9a799, 0xe9aab7, 0xe9abae, 0xe9abaf,
+ /* 78 */ 0xe9aca7, 0xe9ad85, 0xe9ad84, 0xe9adb7,
+ /* 7c */ 0xe9adaf, 0xe9b486, 0xe9b489, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9b483, 0xe9baa9, 0xe9babe,
+ /* a4 */ 0xe9bb8e, 0xe5a2a8, 0xe9bd92, 0xe58492,
+ /* a8 */ 0xe58498, 0xe58494, 0xe58490, 0xe58495,
+ /* ac */ 0xe58680, 0xe586aa, 0xe5879d, 0xe58a91,
+ /* b0 */ 0xe58a93, 0xe58bb3, 0xe59999, 0xe599ab,
+ /* b4 */ 0xe599b9, 0xe599a9, 0xe599a4, 0xe599b8,
+ /* b8 */ 0xe599aa, 0xe599a8, 0xe599a5, 0xe599b1,
+ /* bc */ 0xe599af, 0xe599ac, 0xe599a2, 0xe599b6,
+ /* c0 */ 0xe5a381, 0xe5a2be, 0xe5a387, 0xe5a385,
+ /* c4 */ 0xe5a5ae, 0xe5ac9d, 0xe5acb4, 0xe5adb8,
+ /* c8 */ 0xe5afb0, 0xe5b08e, 0xe5bd8a, 0xe686b2,
+ /* cc */ 0xe68691, 0xe686a9, 0xe6868a, 0xe6878d,
+ /* d0 */ 0xe686b6, 0xe686be, 0xe6878a, 0xe68788,
+ /* d4 */ 0xe688b0, 0xe69385, 0xe69381, 0xe6938b,
+ /* d8 */ 0xe692bb, 0xe692bc, 0xe6939a, 0xe69384,
+ /* dc */ 0xe69387, 0xe69382, 0xe6938d, 0xe692bf,
+ /* e0 */ 0xe69392, 0xe69394, 0xe692be, 0xe695b4,
+ /* e4 */ 0xe69b86, 0xe69b89, 0xe69ab9, 0xe69b84,
+ /* e8 */ 0xe69b87, 0xe69ab8, 0xe6a8bd, 0xe6a8b8,
+ /* ec */ 0xe6a8ba, 0xe6a999, 0xe6a9ab, 0xe6a998,
+ /* f0 */ 0xe6a8b9, 0xe6a984, 0xe6a9a2, 0xe6a9a1,
+ /* f4 */ 0xe6a98b, 0xe6a987, 0xe6a8b5, 0xe6a99f,
+ /* f8 */ 0xe6a988, 0xe6ad99, 0xe6adb7, 0xe6b085,
+ /* fc */ 0xe6bf82, 0xe6beb1, 0xe6bea1,
+
+ /*** Two byte table, leaf: bfxx - offset 0x0177a ***/
+
+ /* 40 */ 0xe6bf83, 0xe6bea4, 0xe6bf81, 0xe6bea7,
+ /* 44 */ 0xe6beb3, 0xe6bf80, 0xe6beb9, 0xe6beb6,
+ /* 48 */ 0xe6bea6, 0xe6bea0, 0xe6beb4, 0xe786be,
+ /* 4c */ 0xe78789, 0xe78790, 0xe78792, 0xe78788,
+ /* 50 */ 0xe78795, 0xe786b9, 0xe7878e, 0xe78799,
+ /* 54 */ 0xe7879c, 0xe78783, 0xe78784, 0xe78da8,
+ /* 58 */ 0xe7929c, 0xe792a3, 0xe79298, 0xe7929f,
+ /* 5c */ 0xe7929e, 0xe793a2, 0xe7948c, 0xe7948d,
+ /* 60 */ 0xe798b4, 0xe798b8, 0xe798ba, 0xe79ba7,
+ /* 64 */ 0xe79ba5, 0xe79ea0, 0xe79e9e, 0xe79e9f,
+ /* 68 */ 0xe79ea5, 0xe7a3a8, 0xe7a39a, 0xe7a3ac,
+ /* 6c */ 0xe7a3a7, 0xe7a6a6, 0xe7a98d, 0xe7a98e,
+ /* 70 */ 0xe7a986, 0xe7a98c, 0xe7a98b, 0xe7aaba,
+ /* 74 */ 0xe7af99, 0xe7b091, 0xe7af89, 0xe7afa4,
+ /* 78 */ 0xe7af9b, 0xe7afa1, 0xe7afa9, 0xe7afa6,
+ /* 7c */ 0xe7b395, 0xe7b396, 0xe7b88a, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7b891, 0xe7b888, 0xe7b89b,
+ /* a4 */ 0xe7b8a3, 0xe7b89e, 0xe7b89d, 0xe7b889,
+ /* a8 */ 0xe7b890, 0xe7bdb9, 0xe7beb2, 0xe7bfb0,
+ /* ac */ 0xe7bfb1, 0xe7bfae, 0xe880a8, 0xe886b3,
+ /* b0 */ 0xe886a9, 0xe886a8, 0xe887bb, 0xe88888,
+ /* b4 */ 0xe88998, 0xe88999, 0xe8958a, 0xe89599,
+ /* b8 */ 0xe89588, 0xe895a8, 0xe895a9, 0xe89583,
+ /* bc */ 0xe89589, 0xe895ad, 0xe895aa, 0xe8959e,
+ /* c0 */ 0xe89e83, 0xe89e9f, 0xe89e9e, 0xe89ea2,
+ /* c4 */ 0xe89e8d, 0xe8a1a1, 0xe8a4aa, 0xe8a4b2,
+ /* c8 */ 0xe8a4a5, 0xe8a4ab, 0xe8a4a1, 0xe8a6aa,
+ /* cc */ 0xe8a6a6, 0xe8aba6, 0xe8abba, 0xe8abab,
+ /* d0 */ 0xe8abb1, 0xe8ac80, 0xe8ab9c, 0xe8aba7,
+ /* d4 */ 0xe8abae, 0xe8abbe, 0xe8ac81, 0xe8ac82,
+ /* d8 */ 0xe8abb7, 0xe8abad, 0xe8abb3, 0xe8abb6,
+ /* dc */ 0xe8abbc, 0xe8b1ab, 0xe8b1ad, 0xe8b293,
+ /* e0 */ 0xe8b3b4, 0xe8b984, 0xe8b8b1, 0xe8b8b4,
+ /* e4 */ 0xe8b982, 0xe8b8b9, 0xe8b8b5, 0xe8bcbb,
+ /* e8 */ 0xe8bcaf, 0xe8bcb8, 0xe8bcb3, 0xe8bea8,
+ /* ec */ 0xe8bea6, 0xe981b5, 0xe981b4, 0xe981b8,
+ /* f0 */ 0xe981b2, 0xe981bc, 0xe981ba, 0xe984b4,
+ /* f4 */ 0xe98692, 0xe98ca0, 0xe98cb6, 0xe98bb8,
+ /* f8 */ 0xe98cb3, 0xe98caf, 0xe98ca2, 0xe98bbc,
+ /* fc */ 0xe98cab, 0xe98c84, 0xe98c9a,
+
+ /*** Two byte table, leaf: c0xx - offset 0x01839 ***/
+
+ /* 40 */ 0xe98c90, 0xe98ca6, 0xe98ca1, 0xe98c95,
+ /* 44 */ 0xe98cae, 0xe98c99, 0xe996bb, 0xe99aa7,
+ /* 48 */ 0xe99aa8, 0xe99aaa, 0xe99b95, 0xe99c8e,
+ /* 4c */ 0xe99c91, 0xe99c96, 0xe99c8d, 0xe99c93,
+ /* 50 */ 0xe99c8f, 0xe99d9b, 0xe99d9c, 0xe99da6,
+ /* 54 */ 0xe99e98, 0xe9a0b0, 0xe9a0b8, 0xe9a0bb,
+ /* 58 */ 0xe9a0b7, 0xe9a0ad, 0xe9a0b9, 0xe9a0a4,
+ /* 5c */ 0xe9a490, 0xe9a4a8, 0xe9a49e, 0xe9a49b,
+ /* 60 */ 0xe9a4a1, 0xe9a49a, 0xe9a7ad, 0xe9a7a2,
+ /* 64 */ 0xe9a7b1, 0xe9aab8, 0xe9aabc, 0xe9abbb,
+ /* 68 */ 0xe9abad, 0xe9aca8, 0xe9ae91, 0xe9b495,
+ /* 6c */ 0xe9b4a3, 0xe9b4a6, 0xe9b4a8, 0xe9b492,
+ /* 70 */ 0xe9b49b, 0xe9bb98, 0xe9bb94, 0xe9be8d,
+ /* 74 */ 0xe9be9c, 0xe584aa, 0xe5849f, 0xe584a1,
+ /* 78 */ 0xe584b2, 0xe58bb5, 0xe59a8e, 0xe59a80,
+ /* 7c */ 0xe59a90, 0xe59a85, 0xe59a87, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe59a8f, 0xe5a395, 0xe5a393,
+ /* a4 */ 0xe5a391, 0xe5a38e, 0xe5acb0, 0xe5acaa,
+ /* a8 */ 0xe5aca4, 0xe5adba, 0xe5b0b7, 0xe5b1a8,
+ /* ac */ 0xe5b6bc, 0xe5b6ba, 0xe5b6bd, 0xe5b6b8,
+ /* b0 */ 0xe5b9ab, 0xe5bd8c, 0xe5bebd, 0xe68789,
+ /* b4 */ 0xe68782, 0xe68787, 0xe687a6, 0xe6878b,
+ /* b8 */ 0xe688b2, 0xe688b4, 0xe6938e, 0xe6938a,
+ /* bc */ 0xe69398, 0xe693a0, 0xe693b0, 0xe693a6,
+ /* c0 */ 0xe693ac, 0xe693b1, 0xe693a2, 0xe693ad,
+ /* c4 */ 0xe69682, 0xe69683, 0xe69b99, 0xe69b96,
+ /* c8 */ 0xe6aa80, 0xe6aa94, 0xe6aa84, 0xe6aaa2,
+ /* cc */ 0xe6aa9c, 0xe6ab9b, 0xe6aaa3, 0xe6a9be,
+ /* d0 */ 0xe6aa97, 0xe6aa90, 0xe6aaa0, 0xe6ad9c,
+ /* d4 */ 0xe6aeae, 0xe6af9a, 0xe6b088, 0xe6bf98,
+ /* d8 */ 0xe6bfb1, 0xe6bf9f, 0xe6bfa0, 0xe6bf9b,
+ /* dc */ 0xe6bfa4, 0xe6bfab, 0xe6bfaf, 0xe6be80,
+ /* e0 */ 0xe6bfac, 0xe6bfa1, 0xe6bfa9, 0xe6bf95,
+ /* e4 */ 0xe6bfae, 0xe6bfb0, 0xe787a7, 0xe7879f,
+ /* e8 */ 0xe787ae, 0xe787a6, 0xe787a5, 0xe787ad,
+ /* ec */ 0xe787ac, 0xe787b4, 0xe787a0, 0xe788b5,
+ /* f0 */ 0xe78986, 0xe78db0, 0xe78db2, 0xe792a9,
+ /* f4 */ 0xe792b0, 0xe792a6, 0xe792a8, 0xe79986,
+ /* f8 */ 0xe79982, 0xe7998c, 0xe79baa, 0xe79eb3,
+ /* fc */ 0xe79eaa, 0xe79eb0, 0xe79eac,
+
+ /*** Two byte table, leaf: c1xx - offset 0x018f8 ***/
+
+ /* 40 */ 0xe79ea7, 0xe79ead, 0xe79faf, 0xe7a3b7,
+ /* 44 */ 0xe7a3ba, 0xe7a3b4, 0xe7a3af, 0xe7a481,
+ /* 48 */ 0xe7a6a7, 0xe7a6aa, 0xe7a997, 0xe7aabf,
+ /* 4c */ 0xe7b087, 0xe7b08d, 0xe7afbe, 0xe7afb7,
+ /* 50 */ 0xe7b08c, 0xe7afa0, 0xe7b3a0, 0xe7b39c,
+ /* 54 */ 0xe7b39e, 0xe7b3a2, 0xe7b39f, 0xe7b399,
+ /* 58 */ 0xe7b39d, 0xe7b8ae, 0xe7b8be, 0xe7b986,
+ /* 5c */ 0xe7b8b7, 0xe7b8b2, 0xe7b983, 0xe7b8ab,
+ /* 60 */ 0xe7b8bd, 0xe7b8b1, 0xe7b985, 0xe7b981,
+ /* 64 */ 0xe7b8b4, 0xe7b8b9, 0xe7b988, 0xe7b8b5,
+ /* 68 */ 0xe7b8bf, 0xe7b8af, 0xe7bd84, 0xe7bfb3,
+ /* 6c */ 0xe7bfbc, 0xe881b1, 0xe881b2, 0xe881b0,
+ /* 70 */ 0xe881af, 0xe881b3, 0xe88786, 0xe88783,
+ /* 74 */ 0xe886ba, 0xe88782, 0xe88780, 0xe886bf,
+ /* 78 */ 0xe886bd, 0xe88789, 0xe886be, 0xe887a8,
+ /* 7c */ 0xe88889, 0xe889b1, 0xe896aa, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe89684, 0xe895be, 0xe8969c,
+ /* a4 */ 0xe89691, 0xe89694, 0xe896af, 0xe8969b,
+ /* a8 */ 0xe89687, 0xe896a8, 0xe8968a, 0xe899a7,
+ /* ac */ 0xe89f80, 0xe89f91, 0xe89eb3, 0xe89f92,
+ /* b0 */ 0xe89f86, 0xe89eab, 0xe89ebb, 0xe89eba,
+ /* b4 */ 0xe89f88, 0xe89f8b, 0xe8a4bb, 0xe8a4b6,
+ /* b8 */ 0xe8a584, 0xe8a4b8, 0xe8a4bd, 0xe8a6ac,
+ /* bc */ 0xe8ac8e, 0xe8ac97, 0xe8ac99, 0xe8ac9b,
+ /* c0 */ 0xe8ac8a, 0xe8aca0, 0xe8ac9d, 0xe8ac84,
+ /* c4 */ 0xe8ac90, 0xe8b181, 0xe8b0bf, 0xe8b1b3,
+ /* c8 */ 0xe8b3ba, 0xe8b3bd, 0xe8b3bc, 0xe8b3b8,
+ /* cc */ 0xe8b3bb, 0xe8b6a8, 0xe8b989, 0xe8b98b,
+ /* d0 */ 0xe8b988, 0xe8b98a, 0xe8bd84, 0xe8bcbe,
+ /* d4 */ 0xe8bd82, 0xe8bd85, 0xe8bcbf, 0xe981bf,
+ /* d8 */ 0xe981bd, 0xe98284, 0xe98281, 0xe98282,
+ /* dc */ 0xe98280, 0xe984b9, 0xe986a3, 0xe9869e,
+ /* e0 */ 0xe9869c, 0xe98d8d, 0xe98e82, 0xe98ca8,
+ /* e4 */ 0xe98db5, 0xe98d8a, 0xe98da5, 0xe98d8b,
+ /* e8 */ 0xe98c98, 0xe98dbe, 0xe98dac, 0xe98d9b,
+ /* ec */ 0xe98db0, 0xe98d9a, 0xe98d94, 0xe9978a,
+ /* f0 */ 0xe9978b, 0xe9978c, 0xe99788, 0xe99786,
+ /* f4 */ 0xe99ab1, 0xe99ab8, 0xe99b96, 0xe99c9c,
+ /* f8 */ 0xe99c9e, 0xe99ea0, 0xe99f93, 0xe9a186,
+ /* fc */ 0xe9a2b6, 0xe9a4b5, 0xe9a881,
+
+ /*** Two byte table, leaf: c2xx - offset 0x019b7 ***/
+
+ /* 40 */ 0xe9a7bf, 0xe9aeae, 0xe9aeab, 0xe9aeaa,
+ /* 44 */ 0xe9aead, 0xe9b4bb, 0xe9b4bf, 0xe9ba8b,
+ /* 48 */ 0xe9bb8f, 0xe9bb9e, 0xe9bb9c, 0xe9bb9d,
+ /* 4c */ 0xe9bb9b, 0xe9bcbe, 0xe9bd8b, 0xe58fa2,
+ /* 50 */ 0xe59a95, 0xe59aae, 0xe5a399, 0xe5a398,
+ /* 54 */ 0xe5acb8, 0xe5bd9d, 0xe687a3, 0xe688b3,
+ /* 58 */ 0xe693b4, 0xe693b2, 0xe693be, 0xe69486,
+ /* 5c */ 0xe693ba, 0xe693bb, 0xe693b7, 0xe696b7,
+ /* 60 */ 0xe69b9c, 0xe69ca6, 0xe6aab3, 0xe6aaac,
+ /* 64 */ 0xe6ab83, 0xe6aabb, 0xe6aab8, 0xe6ab82,
+ /* 68 */ 0xe6aaae, 0xe6aaaf, 0xe6ad9f, 0xe6adb8,
+ /* 6c */ 0xe6aeaf, 0xe78089, 0xe7808b, 0xe6bfbe,
+ /* 70 */ 0xe78086, 0xe6bfba, 0xe78091, 0xe7808f,
+ /* 74 */ 0xe787bb, 0xe787bc, 0xe787be, 0xe787b8,
+ /* 78 */ 0xe78db7, 0xe78db5, 0xe792a7, 0xe792bf,
+ /* 7c */ 0xe79495, 0xe79996, 0xe79998, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe79992, 0xe79ebd, 0xe79ebf,
+ /* a4 */ 0xe79ebb, 0xe79ebc, 0xe7a48e, 0xe7a6ae,
+ /* a8 */ 0xe7a9a1, 0xe7a9a2, 0xe7a9a0, 0xe7ab84,
+ /* ac */ 0xe7ab85, 0xe7b0ab, 0xe7b0a7, 0xe7b0aa,
+ /* b0 */ 0xe7b09e, 0xe7b0a3, 0xe7b0a1, 0xe7b3a7,
+ /* b4 */ 0xe7b994, 0xe7b995, 0xe7b99e, 0xe7b99a,
+ /* b8 */ 0xe7b9a1, 0xe7b992, 0xe7b999, 0xe7bd88,
+ /* bc */ 0xe7bfb9, 0xe7bfbb, 0xe881b7, 0xe881b6,
+ /* c0 */ 0xe8878d, 0xe8878f, 0xe8888a, 0xe8978f,
+ /* c4 */ 0xe896a9, 0xe8978d, 0xe89790, 0xe89789,
+ /* c8 */ 0xe896b0, 0xe896ba, 0xe896b9, 0xe896a6,
+ /* cc */ 0xe89faf, 0xe89fac, 0xe89fb2, 0xe89fa0,
+ /* d0 */ 0xe8a686, 0xe8a6b2, 0xe8a7b4, 0xe8aca8,
+ /* d4 */ 0xe8acb9, 0xe8acac, 0xe8acab, 0xe8b190,
+ /* d8 */ 0xe8b485, 0xe8b999, 0xe8b9a3, 0xe8b9a6,
+ /* dc */ 0xe8b9a4, 0xe8b99f, 0xe8b995, 0xe8bb80,
+ /* e0 */ 0xe8bd89, 0xe8bd8d, 0xe98287, 0xe98283,
+ /* e4 */ 0xe98288, 0xe986ab, 0xe986ac, 0xe98790,
+ /* e8 */ 0xe98e94, 0xe98e8a, 0xe98e96, 0xe98ea2,
+ /* ec */ 0xe98eb3, 0xe98eae, 0xe98eac, 0xe98eb0,
+ /* f0 */ 0xe98e98, 0xe98e9a, 0xe98e97, 0xe99794,
+ /* f4 */ 0xe99796, 0xe99790, 0xe99795, 0xe99ba2,
+ /* f8 */ 0xe99b9c, 0xe99b99, 0xe99b9b, 0xe99b9e,
+ /* fc */ 0xe99ca4, 0xe99ea3, 0xe99ea6,
+
+ /*** Two byte table, leaf: c3xx - offset 0x01a76 ***/
+
+ /* 40 */ 0xe99ead, 0xe99fb9, 0xe9a18d, 0xe9a18f,
+ /* 44 */ 0xe9a18c, 0xe9a18e, 0xe9a193, 0xe9a2ba,
+ /* 48 */ 0xe9a4be, 0xe9a4bf, 0xe9a4bd, 0xe9a4ae,
+ /* 4c */ 0xe9a6a5, 0xe9a88e, 0xe9ab81, 0xe9ac83,
+ /* 50 */ 0xe9ac86, 0xe9ad8f, 0xe9ad8e, 0xe9ad8d,
+ /* 54 */ 0xe9af8a, 0xe9af89, 0xe9afbd, 0xe9af88,
+ /* 58 */ 0xe9af80, 0xe9b591, 0xe9b59d, 0xe9b5a0,
+ /* 5c */ 0xe9bba0, 0xe9bc95, 0xe9bcac, 0xe584b3,
+ /* 60 */ 0xe59aa5, 0xe5a39e, 0xe5a39f, 0xe5a3a2,
+ /* 64 */ 0xe5afb5, 0xe9be90, 0xe5bbac, 0xe687b2,
+ /* 68 */ 0xe687b7, 0xe687b6, 0xe687b5, 0xe69480,
+ /* 6c */ 0xe6948f, 0xe69ba0, 0xe69b9d, 0xe6aba5,
+ /* 70 */ 0xe6ab9d, 0xe6ab9a, 0xe6ab93, 0xe7809b,
+ /* 74 */ 0xe7809f, 0xe780a8, 0xe7809a, 0xe7809d,
+ /* 78 */ 0xe78095, 0xe78098, 0xe78886, 0xe7888d,
+ /* 7c */ 0xe78998, 0xe78aa2, 0xe78db8, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe78dba, 0xe792bd, 0xe7938a,
+ /* a4 */ 0xe793a3, 0xe79687, 0xe79686, 0xe7999f,
+ /* a8 */ 0xe799a1, 0xe79f87, 0xe7a499, 0xe7a6b1,
+ /* ac */ 0xe7a9ab, 0xe7a9a9, 0xe7b0be, 0xe7b0bf,
+ /* b0 */ 0xe7b0b8, 0xe7b0bd, 0xe7b0b7, 0xe7b180,
+ /* b4 */ 0xe7b9ab, 0xe7b9ad, 0xe7b9b9, 0xe7b9a9,
+ /* b8 */ 0xe7b9aa, 0xe7be85, 0xe7b9b3, 0xe7beb6,
+ /* bc */ 0xe7beb9, 0xe7beb8, 0xe88798, 0xe897a9,
+ /* c0 */ 0xe8979d, 0xe897aa, 0xe89795, 0xe897a4,
+ /* c4 */ 0xe897a5, 0xe897b7, 0xe89fbb, 0xe8a085,
+ /* c8 */ 0xe8a08d, 0xe89fb9, 0xe89fbe, 0xe8a5a0,
+ /* cc */ 0xe8a59f, 0xe8a596, 0xe8a59e, 0xe8ad81,
+ /* d0 */ 0xe8ad9c, 0xe8ad98, 0xe8ad89, 0xe8ad9a,
+ /* d4 */ 0xe8ad8e, 0xe8ad8f, 0xe8ad86, 0xe8ad99,
+ /* d8 */ 0xe8b488, 0xe8b48a, 0xe8b9bc, 0xe8b9b2,
+ /* dc */ 0xe8ba87, 0xe8b9b6, 0xe8b9ac, 0xe8b9ba,
+ /* e0 */ 0xe8b9b4, 0xe8bd94, 0xe8bd8e, 0xe8bead,
+ /* e4 */ 0xe9828a, 0xe9828b, 0xe986b1, 0xe986ae,
+ /* e8 */ 0xe98fa1, 0xe98f91, 0xe98f9f, 0xe98f83,
+ /* ec */ 0xe98f88, 0xe98f9c, 0xe98f9d, 0xe98f96,
+ /* f0 */ 0xe98fa2, 0xe98f8d, 0xe98f98, 0xe98fa4,
+ /* f4 */ 0xe98f97, 0xe98fa8, 0xe9979c, 0xe99ab4,
+ /* f8 */ 0xe99ba3, 0xe99caa, 0xe99ca7, 0xe99da1,
+ /* fc */ 0xe99f9c, 0xe99fbb, 0xe9a19e,
+
+ /*** Two byte table, leaf: c4xx - offset 0x01b35 ***/
+
+ /* 40 */ 0xe9a198, 0xe9a19b, 0xe9a2bc, 0xe9a585,
+ /* 44 */ 0xe9a589, 0xe9a896, 0xe9a899, 0xe9ac8d,
+ /* 48 */ 0xe9afa8, 0xe9afa7, 0xe9af96, 0xe9af9b,
+ /* 4c */ 0xe9b689, 0xe9b5a1, 0xe9b5b2, 0xe9b5aa,
+ /* 50 */ 0xe9b5ac, 0xe9ba92, 0xe9ba97, 0xe9ba93,
+ /* 54 */ 0xe9bab4, 0xe58bb8, 0xe59aa8, 0xe59ab7,
+ /* 58 */ 0xe59ab6, 0xe59ab4, 0xe59abc, 0xe5a3a4,
+ /* 5c */ 0xe5ad80, 0xe5ad83, 0xe5adbd, 0xe5afb6,
+ /* 60 */ 0xe5b789, 0xe687b8, 0xe687ba, 0xe69498,
+ /* 64 */ 0xe69494, 0xe69499, 0xe69ba6, 0xe69ca7,
+ /* 68 */ 0xe6abac, 0xe780be, 0xe780b0, 0xe780b2,
+ /* 6c */ 0xe78890, 0xe78dbb, 0xe7938f, 0xe799a2,
+ /* 70 */ 0xe799a5, 0xe7a4a6, 0xe7a4aa, 0xe7a4ac,
+ /* 74 */ 0xe7a4ab, 0xe7ab87, 0xe7abb6, 0xe7b18c,
+ /* 78 */ 0xe7b183, 0xe7b18d, 0xe7b3af, 0xe7b3b0,
+ /* 7c */ 0xe8beae, 0xe7b9bd, 0xe7b9bc, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7ba82, 0xe7bd8c, 0xe88080,
+ /* a4 */ 0xe8879a, 0xe889a6, 0xe897bb, 0xe897b9,
+ /* a8 */ 0xe89891, 0xe897ba, 0xe89886, 0xe8988b,
+ /* ac */ 0xe89887, 0xe8988a, 0xe8a094, 0xe8a095,
+ /* b0 */ 0xe8a5a4, 0xe8a6ba, 0xe8a7b8, 0xe8adb0,
+ /* b4 */ 0xe8adac, 0xe8ada6, 0xe8adaf, 0xe8ad9f,
+ /* b8 */ 0xe8adab, 0xe8b48f, 0xe8b48d, 0xe8ba89,
+ /* bc */ 0xe8ba81, 0xe8ba85, 0xe8ba82, 0xe986b4,
+ /* c0 */ 0xe9878b, 0xe99098, 0xe99083, 0xe98fbd,
+ /* c4 */ 0xe997a1, 0xe99cb0, 0xe9a384, 0xe9a592,
+ /* c8 */ 0xe9a591, 0xe9a6a8, 0xe9a8ab, 0xe9a8b0,
+ /* cc */ 0xe9a8b7, 0xe9a8b5, 0xe9b093, 0xe9b08d,
+ /* d0 */ 0xe9b9b9, 0xe9bab5, 0xe9bba8, 0xe9bcaf,
+ /* d4 */ 0xe9bd9f, 0xe9bda3, 0xe9bda1, 0xe584b7,
+ /* d8 */ 0xe584b8, 0xe59b81, 0xe59b80, 0xe59b82,
+ /* dc */ 0xe5a494, 0xe5b1ac, 0xe5b78d, 0xe687bc,
+ /* e0 */ 0xe687be, 0xe6949d, 0xe6949c, 0xe69695,
+ /* e4 */ 0xe69ba9, 0xe6abbb, 0xe6ac84, 0xe6abba,
+ /* e8 */ 0xe6aeb2, 0xe7818c, 0xe7889b, 0xe78aa7,
+ /* ec */ 0xe79396, 0xe79394, 0xe799a9, 0xe79f93,
+ /* f0 */ 0xe7b190, 0xe7ba8f, 0xe7ba8c, 0xe7bebc,
+ /* f4 */ 0xe89897, 0xe898ad, 0xe8989a, 0xe8a0a3,
+ /* f8 */ 0xe8a0a2, 0xe8a0a1, 0xe8a09f, 0xe8a5aa,
+ /* fc */ 0xe8a5ac, 0xe8a6bd, 0xe8adb4,
+
+ /*** Two byte table, leaf: c5xx - offset 0x01bf4 ***/
+
+ /* 40 */ 0xe8adb7, 0xe8adbd, 0xe8b493, 0xe8ba8a,
+ /* 44 */ 0xe8ba8d, 0xe8ba8b, 0xe8bd9f, 0xe8beaf,
+ /* 48 */ 0xe986ba, 0xe990ae, 0xe990b3, 0xe990b5,
+ /* 4c */ 0xe990ba, 0xe990b8, 0xe990b2, 0xe990ab,
+ /* 50 */ 0xe997a2, 0xe99cb8, 0xe99cb9, 0xe99cb2,
+ /* 54 */ 0xe99fbf, 0xe9a1a7, 0xe9a1a5, 0xe9a597,
+ /* 58 */ 0xe9a985, 0xe9a983, 0xe9a980, 0xe9a8be,
+ /* 5c */ 0xe9ab8f, 0xe9ad94, 0xe9ad91, 0xe9b0ad,
+ /* 60 */ 0xe9b0a5, 0xe9b6af, 0xe9b6b4, 0xe9b782,
+ /* 64 */ 0xe9b6b8, 0xe9ba9d, 0xe9bbaf, 0xe9bc99,
+ /* 68 */ 0xe9bd9c, 0xe9bda6, 0xe9bda7, 0xe584bc,
+ /* 6c */ 0xe584bb, 0xe59b88, 0xe59b8a, 0xe59b89,
+ /* 70 */ 0xe5adbf, 0xe5b794, 0xe5b792, 0xe5bd8e,
+ /* 74 */ 0xe687bf, 0xe694a4, 0xe6ac8a, 0xe6ada1,
+ /* 78 */ 0xe78191, 0xe78198, 0xe78e80, 0xe793a4,
+ /* 7c */ 0xe7968a, 0xe799ae, 0xe799ac, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7a6b3, 0xe7b1a0, 0xe7b19f,
+ /* a4 */ 0xe881be, 0xe881bd, 0xe8879f, 0xe8a5b2,
+ /* a8 */ 0xe8a5af, 0xe8a7bc, 0xe8ae80, 0xe8b496,
+ /* ac */ 0xe8b497, 0xe8ba91, 0xe8ba93, 0xe8bda1,
+ /* b0 */ 0xe98588, 0xe99184, 0xe99191, 0xe99192,
+ /* b4 */ 0xe99cbd, 0xe99cbe, 0xe99f83, 0xe99f81,
+ /* b8 */ 0xe9a1ab, 0xe9a595, 0xe9a995, 0xe9a98d,
+ /* bc */ 0xe9ab92, 0xe9ac9a, 0xe9b189, 0xe9b0b1,
+ /* c0 */ 0xe9b0be, 0xe9b0bb, 0xe9b793, 0xe9b797,
+ /* c4 */ 0xe9bcb4, 0xe9bdac, 0xe9bdaa, 0xe9be94,
+ /* c8 */ 0xe59b8c, 0xe5b796, 0xe68880, 0xe694a3,
+ /* cc */ 0xe694ab, 0xe694aa, 0xe69bac, 0xe6ac90,
+ /* d0 */ 0xe7939a, 0xe7ab8a, 0xe7b1a4, 0xe7b1a3,
+ /* d4 */ 0xe7b1a5, 0xe7ba93, 0xe7ba96, 0xe7ba94,
+ /* d8 */ 0xe887a2, 0xe898b8, 0xe898bf, 0xe8a0b1,
+ /* dc */ 0xe8ae8a, 0xe98290, 0xe9828f, 0xe991a3,
+ /* e0 */ 0xe991a0, 0xe991a4, 0xe99da8, 0xe9a1af,
+ /* e4 */ 0xe9a59c, 0xe9a99a, 0xe9a99b, 0xe9a997,
+ /* e8 */ 0xe9ab93, 0xe9ab94, 0xe9ab91, 0xe9b194,
+ /* ec */ 0xe9b197, 0xe9b196, 0xe9b7a5, 0xe9ba9f,
+ /* f0 */ 0xe9bbb4, 0xe59b91, 0xe5a3a9, 0xe694ac,
+ /* f4 */ 0xe7819e, 0xe799b1, 0xe799b2, 0xe79f97,
+ /* f8 */ 0xe7bd90, 0xe7be88, 0xe8a0b6, 0xe8a0b9,
+ /* fc */ 0xe8a1a2, 0xe8ae93, 0xe8ae92,
+
+ /*** Two byte table, leaf: c6xx - offset 0x01cb3 ***/
+
+ /* 40 */ 0xe8ae96, 0xe889b7, 0xe8b49b, 0xe98780,
+ /* 44 */ 0xe991aa, 0xe99d82, 0xe99d88, 0xe99d84,
+ /* 48 */ 0xe99f86, 0xe9a1b0, 0xe9a99f, 0xe9aca2,
+ /* 4c */ 0xe9ad98, 0xe9b19f, 0xe9b7b9, 0xe9b7ba,
+ /* 50 */ 0xe9b9bc, 0xe9b9bd, 0xe9bc87, 0xe9bdb7,
+ /* 54 */ 0xe9bdb2, 0xe5bbb3, 0xe6ac96, 0xe781a3,
+ /* 58 */ 0xe7b1ac, 0xe7b1ae, 0xe8a0bb, 0xe8a780,
+ /* 5c */ 0xe8baa1, 0xe98781, 0xe991b2, 0xe991b0,
+ /* 60 */ 0xe9a1b1, 0xe9a59e, 0xe9ab96, 0xe9aca3,
+ /* 64 */ 0xe9bb8c, 0xe781a4, 0xe79f9a, 0xe8ae9a,
+ /* 68 */ 0xe991b7, 0xe99f89, 0xe9a9a2, 0xe9a9a5,
+ /* 6c */ 0xe7ba9c, 0xe8ae9c, 0xe8baaa, 0xe98785,
+ /* 70 */ 0xe991bd, 0xe991be, 0xe991bc, 0xe9b1b7,
+ /* 74 */ 0xe9b1b8, 0xe9bbb7, 0xe8b194, 0xe991bf,
+ /* 78 */ 0xe9b89a, 0xe788a8, 0xe9a9aa, 0xe9acb1,
+ /* 7c */ 0xe9b89b, 0xe9b89e, 0xe7b1b2, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe383be, 0xe3829d, 0xe3829e,
+ /* a4 */ 0xe38085, 0xe38181, 0xe38182, 0xe38183,
+ /* a8 */ 0xe38184, 0xe38185, 0xe38186, 0xe38187,
+ /* ac */ 0xe38188, 0xe38189, 0xe3818a, 0xe3818b,
+ /* b0 */ 0xe3818c, 0xe3818d, 0xe3818e, 0xe3818f,
+ /* b4 */ 0xe38190, 0xe38191, 0xe38192, 0xe38193,
+ /* b8 */ 0xe38194, 0xe38195, 0xe38196, 0xe38197,
+ /* bc */ 0xe38198, 0xe38199, 0xe3819a, 0xe3819b,
+ /* c0 */ 0xe3819c, 0xe3819d, 0xe3819e, 0xe3819f,
+ /* c4 */ 0xe381a0, 0xe381a1, 0xe381a2, 0xe381a3,
+ /* c8 */ 0xe381a4, 0xe381a5, 0xe381a6, 0xe381a7,
+ /* cc */ 0xe381a8, 0xe381a9, 0xe381aa, 0xe381ab,
+ /* d0 */ 0xe381ac, 0xe381ad, 0xe381ae, 0xe381af,
+ /* d4 */ 0xe381b0, 0xe381b1, 0xe381b2, 0xe381b3,
+ /* d8 */ 0xe381b4, 0xe381b5, 0xe381b6, 0xe381b7,
+ /* dc */ 0xe381b8, 0xe381b9, 0xe381ba, 0xe381bb,
+ /* e0 */ 0xe381bc, 0xe381bd, 0xe381be, 0xe381bf,
+ /* e4 */ 0xe38280, 0xe38281, 0xe38282, 0xe38283,
+ /* e8 */ 0xe38284, 0xe38285, 0xe38286, 0xe38287,
+ /* ec */ 0xe38288, 0xe38289, 0xe3828a, 0xe3828b,
+ /* f0 */ 0xe3828c, 0xe3828d, 0xe3828e, 0xe3828f,
+ /* f4 */ 0xe38290, 0xe38291, 0xe38292, 0xe38293,
+ /* f8 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* fc */ 0xe382a5, 0xe382a6, 0xe382a7,
+
+ /*** Two byte table, leaf: c7xx - offset 0x01d72 ***/
+
+ /* 40 */ 0xe382a8, 0xe382a9, 0xe382aa, 0xe382ab,
+ /* 44 */ 0xe382ac, 0xe382ad, 0xe382ae, 0xe382af,
+ /* 48 */ 0xe382b0, 0xe382b1, 0xe382b2, 0xe382b3,
+ /* 4c */ 0xe382b4, 0xe382b5, 0xe382b6, 0xe382b7,
+ /* 50 */ 0xe382b8, 0xe382b9, 0xe382ba, 0xe382bb,
+ /* 54 */ 0xe382bc, 0xe382bd, 0xe382be, 0xe382bf,
+ /* 58 */ 0xe38380, 0xe38381, 0xe38382, 0xe38383,
+ /* 5c */ 0xe38384, 0xe38385, 0xe38386, 0xe38387,
+ /* 60 */ 0xe38388, 0xe38389, 0xe3838a, 0xe3838b,
+ /* 64 */ 0xe3838c, 0xe3838d, 0xe3838e, 0xe3838f,
+ /* 68 */ 0xe38390, 0xe38391, 0xe38392, 0xe38393,
+ /* 6c */ 0xe38394, 0xe38395, 0xe38396, 0xe38397,
+ /* 70 */ 0xe38398, 0xe38399, 0xe3839a, 0xe3839b,
+ /* 74 */ 0xe3839c, 0xe3839d, 0xe3839e, 0xe3839f,
+ /* 78 */ 0xe383a0, 0xe383a1, 0xe383a2, 0xe383a3,
+ /* 7c */ 0xe383a4, 0xe383a5, 0xe383a6, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe383a7, 0xe383a8, 0xe383a9,
+ /* a4 */ 0xe383aa, 0xe383ab, 0xe383ac, 0xe383ad,
+ /* a8 */ 0xe383ae, 0xe383af, 0xe383b0, 0xe383b1,
+ /* ac */ 0xe383b2, 0xe383b3, 0xe383b4, 0xe383b5,
+ /* b0 */ 0xe383b6, 0x00d094, 0x00d095, 0x00d081,
+ /* b4 */ 0x00d096, 0x00d097, 0x00d098, 0x00d099,
+ /* b8 */ 0x00d09a, 0x00d09b, 0x00d09c, 0x00d0a3,
+ /* bc */ 0x00d0a4, 0x00d0a5, 0x00d0a6, 0x00d0a7,
+ /* c0 */ 0x00d0a8, 0x00d0a9, 0x00d0aa, 0x00d0ab,
+ /* c4 */ 0x00d0ac, 0x00d0ad, 0x00d0ae, 0x00d0af,
+ /* c8 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* cc */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d0 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* d4 */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* d8 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* dc */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e0 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* e4 */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* e8 */ 0x00d18f, 0xe291a0, 0xe291a1, 0xe291a2,
+ /* ec */ 0xe291a3, 0xe291a4, 0xe291a5, 0xe291a6,
+ /* f0 */ 0xe291a7, 0xe291a8, 0xe291a9, 0xe291b4,
+ /* f4 */ 0xe291b5, 0xe291b6, 0xe291b7, 0xe291b8,
+ /* f8 */ 0xe291b9, 0xe291ba, 0xe291bb, 0xe291bc,
+ /* fc */ 0xe291bd, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: c9xx - offset 0x01e31 ***/
+
+ /* 40 */ 0xe4b982, 0xe4b99c, 0xe587b5, 0xe58c9a,
+ /* 44 */ 0xe58e82, 0xe4b887, 0xe4b88c, 0xe4b987,
+ /* 48 */ 0xe4ba8d, 0xe59b97, 0xefa88c, 0xe5b1ae,
+ /* 4c */ 0xe5bdb3, 0xe4b88f, 0xe58687, 0xe4b88e,
+ /* 50 */ 0xe4b8ae, 0xe4ba93, 0xe4bb82, 0xe4bb89,
+ /* 54 */ 0xe4bb88, 0xe58698, 0xe58bbc, 0xe58dac,
+ /* 58 */ 0xe58eb9, 0xe59ca0, 0xe5a483, 0xe5a4ac,
+ /* 5c */ 0xe5b090, 0xe5b7bf, 0xe697a1, 0xe6aeb3,
+ /* 60 */ 0xe6af8c, 0xe6b094, 0xe788bf, 0xe4b8b1,
+ /* 64 */ 0xe4b8bc, 0xe4bba8, 0xe4bb9c, 0xe4bba9,
+ /* 68 */ 0xe4bba1, 0xe4bb9d, 0xe4bb9a, 0xe5888c,
+ /* 6c */ 0xe58c9c, 0xe58d8c, 0xe59ca2, 0xe59ca3,
+ /* 70 */ 0xe5a497, 0xe5a4af, 0xe5ae81, 0xe5ae84,
+ /* 74 */ 0xe5b092, 0xe5b0bb, 0xe5b1b4, 0xe5b1b3,
+ /* 78 */ 0xe5b884, 0xe5ba80, 0xe5ba82, 0xe5bf89,
+ /* 7c */ 0xe68889, 0xe68990, 0xe6b095, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6b0b6, 0xe6b183, 0xe6b0bf,
+ /* a4 */ 0xe6b0bb, 0xe78aae, 0xe78ab0, 0xe78e8a,
+ /* a8 */ 0xe7a6b8, 0xe8828a, 0xe9989e, 0xe4bc8e,
+ /* ac */ 0xe4bc98, 0xe4bcac, 0xe4bbb5, 0xe4bc94,
+ /* b0 */ 0xe4bbb1, 0xe4bc80, 0xe4bbb7, 0xe4bc88,
+ /* b4 */ 0xe4bc9d, 0xe4bc82, 0xe4bc85, 0xe4bca2,
+ /* b8 */ 0xe4bc93, 0xe4bc84, 0xe4bbb4, 0xe4bc92,
+ /* bc */ 0xe586b1, 0xe58893, 0xe58889, 0xe58890,
+ /* c0 */ 0xe58aa6, 0xe58ca2, 0xe58c9f, 0xe58d8d,
+ /* c4 */ 0xe58e8a, 0xe59087, 0xe59ba1, 0xe59b9f,
+ /* c8 */ 0xe59cae, 0xe59caa, 0xe59cb4, 0xe5a4bc,
+ /* cc */ 0xe5a680, 0xe5a5bc, 0xe5a685, 0xe5a5bb,
+ /* d0 */ 0xe5a5be, 0xe5a5b7, 0xe5a5bf, 0xe5ad96,
+ /* d4 */ 0xe5b095, 0xe5b0a5, 0xe5b1bc, 0xe5b1ba,
+ /* d8 */ 0xe5b1bb, 0xe5b1be, 0xe5b79f, 0xe5b9b5,
+ /* dc */ 0xe5ba84, 0xe5bc82, 0xe5bc9a, 0xe5bdb4,
+ /* e0 */ 0xe5bf95, 0xe5bf94, 0xe5bf8f, 0xe6899c,
+ /* e4 */ 0xe6899e, 0xe689a4, 0xe689a1, 0xe689a6,
+ /* e8 */ 0xe689a2, 0xe68999, 0xe689a0, 0xe6899a,
+ /* ec */ 0xe689a5, 0xe697af, 0xe697ae, 0xe69cbe,
+ /* f0 */ 0xe69cb9, 0xe69cb8, 0xe69cbb, 0xe69cba,
+ /* f4 */ 0xe69cbf, 0xe69cbc, 0xe69cb3, 0xe6b098,
+ /* f8 */ 0xe6b186, 0xe6b192, 0xe6b19c, 0xe6b18f,
+ /* fc */ 0xe6b18a, 0xe6b194, 0xe6b18b,
+
+ /*** Two byte table, leaf: caxx - offset 0x01ef0 ***/
+
+ /* 40 */ 0xe6b18c, 0xe781b1, 0xe7899e, 0xe78ab4,
+ /* 44 */ 0xe78ab5, 0xe78e8e, 0xe794aa, 0xe799bf,
+ /* 48 */ 0xe7a9b5, 0xe7bd91, 0xe889b8, 0xe889bc,
+ /* 4c */ 0xe88a80, 0xe889bd, 0xe889bf, 0xe8998d,
+ /* 50 */ 0xe8a5be, 0xe98299, 0xe98297, 0xe98298,
+ /* 54 */ 0xe9829b, 0xe98294, 0xe998a2, 0xe998a4,
+ /* 58 */ 0xe998a0, 0xe998a3, 0xe4bd96, 0xe4bcbb,
+ /* 5c */ 0xe4bda2, 0xe4bd89, 0xe4bd93, 0xe4bda4,
+ /* 60 */ 0xe4bcbe, 0xe4bda7, 0xe4bd92, 0xe4bd9f,
+ /* 64 */ 0xe4bd81, 0xe4bd98, 0xe4bcad, 0xe4bcb3,
+ /* 68 */ 0xe4bcbf, 0xe4bda1, 0xe5868f, 0xe586b9,
+ /* 6c */ 0xe5889c, 0xe5889e, 0xe588a1, 0xe58aad,
+ /* 70 */ 0xe58aae, 0xe58c89, 0xe58da3, 0xe58db2,
+ /* 74 */ 0xe58e8e, 0xe58e8f, 0xe590b0, 0xe590b7,
+ /* 78 */ 0xe590aa, 0xe59194, 0xe59185, 0xe59099,
+ /* 7c */ 0xe5909c, 0xe590a5, 0xe59098, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe590bd, 0xe5918f, 0xe59181,
+ /* a4 */ 0xe590a8, 0xe590a4, 0xe59187, 0xe59bae,
+ /* a8 */ 0xe59ba7, 0xe59ba5, 0xe59d81, 0xe59d85,
+ /* ac */ 0xe59d8c, 0xe59d89, 0xe59d8b, 0xe59d92,
+ /* b0 */ 0xe5a486, 0xe5a580, 0xe5a6a6, 0xe5a698,
+ /* b4 */ 0xe5a6a0, 0xe5a697, 0xe5a68e, 0xe5a6a2,
+ /* b8 */ 0xe5a690, 0xe5a68f, 0xe5a6a7, 0xe5a6a1,
+ /* bc */ 0xe5ae8e, 0xe5ae92, 0xe5b0a8, 0xe5b0aa,
+ /* c0 */ 0xe5b28d, 0xe5b28f, 0xe5b288, 0xe5b28b,
+ /* c4 */ 0xe5b289, 0xe5b292, 0xe5b28a, 0xe5b286,
+ /* c8 */ 0xe5b293, 0xe5b295, 0xe5b7a0, 0xe5b88a,
+ /* cc */ 0xe5b88e, 0xe5ba8b, 0xe5ba89, 0xe5ba8c,
+ /* d0 */ 0xe5ba88, 0xe5ba8d, 0xe5bc85, 0xe5bc9d,
+ /* d4 */ 0xe5bdb8, 0xe5bdb6, 0xe5bf92, 0xe5bf91,
+ /* d8 */ 0xe5bf90, 0xe5bfad, 0xe5bfa8, 0xe5bfae,
+ /* dc */ 0xe5bfb3, 0xe5bfa1, 0xe5bfa4, 0xe5bfa3,
+ /* e0 */ 0xe5bfba, 0xe5bfaf, 0xe5bfb7, 0xe5bfbb,
+ /* e4 */ 0xe68080, 0xe5bfb4, 0xe688ba, 0xe68a83,
+ /* e8 */ 0xe68a8c, 0xe68a8e, 0xe68a8f, 0xe68a94,
+ /* ec */ 0xe68a87, 0xe689b1, 0xe689bb, 0xe689ba,
+ /* f0 */ 0xe689b0, 0xe68a81, 0xe68a88, 0xe689b7,
+ /* f4 */ 0xe689bd, 0xe689b2, 0xe689b4, 0xe694b7,
+ /* f8 */ 0xe697b0, 0xe697b4, 0xe697b3, 0xe697b2,
+ /* fc */ 0xe697b5, 0xe69d85, 0xe69d87,
+
+ /*** Two byte table, leaf: cbxx - offset 0x01faf ***/
+
+ /* 40 */ 0xe69d99, 0xe69d95, 0xe69d8c, 0xe69d88,
+ /* 44 */ 0xe69d9d, 0xe69d8d, 0xe69d9a, 0xe69d8b,
+ /* 48 */ 0xe6af90, 0xe6b099, 0xe6b09a, 0xe6b1b8,
+ /* 4c */ 0xe6b1a7, 0xe6b1ab, 0xe6b284, 0xe6b28b,
+ /* 50 */ 0xe6b28f, 0xe6b1b1, 0xe6b1af, 0xe6b1a9,
+ /* 54 */ 0xe6b29a, 0xe6b1ad, 0xe6b287, 0xe6b295,
+ /* 58 */ 0xe6b29c, 0xe6b1a6, 0xe6b1b3, 0xe6b1a5,
+ /* 5c */ 0xe6b1bb, 0xe6b28e, 0xe781b4, 0xe781ba,
+ /* 60 */ 0xe789a3, 0xe78abf, 0xe78abd, 0xe78b83,
+ /* 64 */ 0xe78b86, 0xe78b81, 0xe78aba, 0xe78b85,
+ /* 68 */ 0xe78e95, 0xe78e97, 0xe78e93, 0xe78e94,
+ /* 6c */ 0xe78e92, 0xe794ba, 0xe794b9, 0xe79694,
+ /* 70 */ 0xe79695, 0xe79a81, 0xe7a4bd, 0xe880b4,
+ /* 74 */ 0xe88295, 0xe88299, 0xe88290, 0xe88292,
+ /* 78 */ 0xe8829c, 0xe88a90, 0xe88a8f, 0xe88a85,
+ /* 7c */ 0xe88a8e, 0xe88a91, 0xe88a93, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88a8a, 0xe88a83, 0xe88a84,
+ /* a4 */ 0xe8b1b8, 0xe8bf89, 0xe8bebf, 0xe9829f,
+ /* a8 */ 0xe982a1, 0xe982a5, 0xe9829e, 0xe982a7,
+ /* ac */ 0xe982a0, 0xe998b0, 0xe998a8, 0xe998af,
+ /* b0 */ 0xe998ad, 0xe4b8b3, 0xe4be98, 0xe4bdbc,
+ /* b4 */ 0xe4be85, 0xe4bdbd, 0xe4be80, 0xe4be87,
+ /* b8 */ 0xe4bdb6, 0xe4bdb4, 0xe4be89, 0xe4be84,
+ /* bc */ 0xe4bdb7, 0xe4bd8c, 0xe4be97, 0xe4bdaa,
+ /* c0 */ 0xe4be9a, 0xe4bdb9, 0xe4be81, 0xe4bdb8,
+ /* c4 */ 0xe4be90, 0xe4be9c, 0xe4be94, 0xe4be9e,
+ /* c8 */ 0xe4be92, 0xe4be82, 0xe4be95, 0xe4bdab,
+ /* cc */ 0xe4bdae, 0xe5869e, 0xe586bc, 0xe586be,
+ /* d0 */ 0xe588b5, 0xe588b2, 0xe588b3, 0xe58986,
+ /* d4 */ 0xe588b1, 0xe58abc, 0xe58c8a, 0xe58c8b,
+ /* d8 */ 0xe58cbc, 0xe58e92, 0xe58e94, 0xe59287,
+ /* dc */ 0xe591bf, 0xe59281, 0xe59291, 0xe59282,
+ /* e0 */ 0xe59288, 0xe591ab, 0xe591ba, 0xe591be,
+ /* e4 */ 0xe591a5, 0xe591ac, 0xe591b4, 0xe591a6,
+ /* e8 */ 0xe5928d, 0xe591af, 0xe591a1, 0xe591a0,
+ /* ec */ 0xe59298, 0xe591a3, 0xe591a7, 0xe591a4,
+ /* f0 */ 0xe59bb7, 0xe59bb9, 0xe59daf, 0xe59db2,
+ /* f4 */ 0xe59dad, 0xe59dab, 0xe59db1, 0xe59db0,
+ /* f8 */ 0xe59db6, 0xe59e80, 0xe59db5, 0xe59dbb,
+ /* fc */ 0xe59db3, 0xe59db4, 0xe59da2,
+
+ /*** Two byte table, leaf: ccxx - offset 0x0206e ***/
+
+ /* 40 */ 0xe59da8, 0xe59dbd, 0xe5a48c, 0xe5a585,
+ /* 44 */ 0xe5a6b5, 0xe5a6ba, 0xe5a78f, 0xe5a78e,
+ /* 48 */ 0xe5a6b2, 0xe5a78c, 0xe5a781, 0xe5a6b6,
+ /* 4c */ 0xe5a6bc, 0xe5a783, 0xe5a796, 0xe5a6b1,
+ /* 50 */ 0xe5a6bd, 0xe5a780, 0xe5a788, 0xe5a6b4,
+ /* 54 */ 0xe5a787, 0xe5ada2, 0xe5ada5, 0xe5ae93,
+ /* 58 */ 0xe5ae95, 0xe5b184, 0xe5b187, 0xe5b2ae,
+ /* 5c */ 0xe5b2a4, 0xe5b2a0, 0xe5b2b5, 0xe5b2af,
+ /* 60 */ 0xe5b2a8, 0xe5b2ac, 0xe5b29f, 0xe5b2a3,
+ /* 64 */ 0xe5b2ad, 0xe5b2a2, 0xe5b2aa, 0xe5b2a7,
+ /* 68 */ 0xe5b29d, 0xe5b2a5, 0xe5b2b6, 0xe5b2b0,
+ /* 6c */ 0xe5b2a6, 0xe5b897, 0xe5b894, 0xe5b899,
+ /* 70 */ 0xe5bca8, 0xe5bca2, 0xe5bca3, 0xe5bca4,
+ /* 74 */ 0xe5bd94, 0xe5be82, 0xe5bdbe, 0xe5bdbd,
+ /* 78 */ 0xe5bf9e, 0xe5bfa5, 0xe680ad, 0xe680a6,
+ /* 7c */ 0xe68099, 0xe680b2, 0xe6808b, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe680b4, 0xe6808a, 0xe68097,
+ /* a4 */ 0xe680b3, 0xe6809a, 0xe6809e, 0xe680ac,
+ /* a8 */ 0xe680a2, 0xe6808d, 0xe68090, 0xe680ae,
+ /* ac */ 0xe68093, 0xe68091, 0xe6808c, 0xe68089,
+ /* b0 */ 0xe6809c, 0xe68894, 0xe688bd, 0xe68aad,
+ /* b4 */ 0xe68ab4, 0xe68b91, 0xe68abe, 0xe68aaa,
+ /* b8 */ 0xe68ab6, 0xe68b8a, 0xe68aae, 0xe68ab3,
+ /* bc */ 0xe68aaf, 0xe68abb, 0xe68aa9, 0xe68ab0,
+ /* c0 */ 0xe68ab8, 0xe694bd, 0xe696a8, 0xe696bb,
+ /* c4 */ 0xe69889, 0xe697bc, 0xe69884, 0xe69892,
+ /* c8 */ 0xe69888, 0xe697bb, 0xe69883, 0xe6988b,
+ /* cc */ 0xe6988d, 0xe69885, 0xe697bd, 0xe69891,
+ /* d0 */ 0xe69890, 0xe69bb6, 0xe69c8a, 0xe69e85,
+ /* d4 */ 0xe69dac, 0xe69e8e, 0xe69e92, 0xe69db6,
+ /* d8 */ 0xe69dbb, 0xe69e98, 0xe69e86, 0xe69e84,
+ /* dc */ 0xe69db4, 0xe69e8d, 0xe69e8c, 0xe69dba,
+ /* e0 */ 0xe69e9f, 0xe69e91, 0xe69e99, 0xe69e83,
+ /* e4 */ 0xe69dbd, 0xe69e81, 0xe69db8, 0xe69db9,
+ /* e8 */ 0xe69e94, 0xe6aca5, 0xe6ae80, 0xe6adbe,
+ /* ec */ 0xe6af9e, 0xe6b09d, 0xe6b293, 0xe6b3ac,
+ /* f0 */ 0xe6b3ab, 0xe6b3ae, 0xe6b399, 0xe6b2b6,
+ /* f4 */ 0xe6b394, 0xe6b2ad, 0xe6b3a7, 0xe6b2b7,
+ /* f8 */ 0xe6b390, 0xe6b382, 0xe6b2ba, 0xe6b383,
+ /* fc */ 0xe6b386, 0xe6b3ad, 0xe6b3b2,
+
+ /*** Two byte table, leaf: cdxx - offset 0x0212d ***/
+
+ /* 40 */ 0xe6b392, 0xe6b39d, 0xe6b2b4, 0xe6b28a,
+ /* 44 */ 0xe6b29d, 0xe6b280, 0xe6b39e, 0xe6b380,
+ /* 48 */ 0xe6b4b0, 0xe6b38d, 0xe6b387, 0xe6b2b0,
+ /* 4c */ 0xe6b3b9, 0xe6b38f, 0xe6b3a9, 0xe6b391,
+ /* 50 */ 0xe78294, 0xe78298, 0xe78285, 0xe78293,
+ /* 54 */ 0xe78286, 0xe78284, 0xe78291, 0xe78296,
+ /* 58 */ 0xe78282, 0xe7829a, 0xe78283, 0xe789aa,
+ /* 5c */ 0xe78b96, 0xe78b8b, 0xe78b98, 0xe78b89,
+ /* 60 */ 0xe78b9c, 0xe78b92, 0xe78b94, 0xe78b9a,
+ /* 64 */ 0xe78b8c, 0xe78b91, 0xe78ea4, 0xe78ea1,
+ /* 68 */ 0xe78ead, 0xe78ea6, 0xe78ea2, 0xe78ea0,
+ /* 6c */ 0xe78eac, 0xe78e9d, 0xe7939d, 0xe793a8,
+ /* 70 */ 0xe794bf, 0xe79580, 0xe794be, 0xe7968c,
+ /* 74 */ 0xe79698, 0xe79aaf, 0xe79bb3, 0xe79bb1,
+ /* 78 */ 0xe79bb0, 0xe79bb5, 0xe79fb8, 0xe79fbc,
+ /* 7c */ 0xe79fb9, 0xe79fbb, 0xe79fba, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe79fb7, 0xe7a582, 0xe7a4bf,
+ /* a4 */ 0xe7a785, 0xe7a9b8, 0xe7a9bb, 0xe7abbb,
+ /* a8 */ 0xe7b1b5, 0xe7b3bd, 0xe880b5, 0xe8828f,
+ /* ac */ 0xe882ae, 0xe882a3, 0xe882b8, 0xe882b5,
+ /* b0 */ 0xe882ad, 0xe888a0, 0xe88aa0, 0xe88b80,
+ /* b4 */ 0xe88aab, 0xe88a9a, 0xe88a98, 0xe88a9b,
+ /* b8 */ 0xe88ab5, 0xe88aa7, 0xe88aae, 0xe88abc,
+ /* bc */ 0xe88a9e, 0xe88aba, 0xe88ab4, 0xe88aa8,
+ /* c0 */ 0xe88aa1, 0xe88aa9, 0xe88b82, 0xe88aa4,
+ /* c4 */ 0xe88b83, 0xe88ab6, 0xe88aa2, 0xe899b0,
+ /* c8 */ 0xe899af, 0xe899ad, 0xe899ae, 0xe8b196,
+ /* cc */ 0xe8bf92, 0xe8bf8b, 0xe8bf93, 0xe8bf8d,
+ /* d0 */ 0xe8bf96, 0xe8bf95, 0xe8bf97, 0xe982b2,
+ /* d4 */ 0xe982b4, 0xe982af, 0xe982b3, 0xe982b0,
+ /* d8 */ 0xe998b9, 0xe998bd, 0xe998bc, 0xe998ba,
+ /* dc */ 0xe99983, 0xe4bf8d, 0xe4bf85, 0xe4bf93,
+ /* e0 */ 0xe4beb2, 0xe4bf89, 0xe4bf8b, 0xe4bf81,
+ /* e4 */ 0xe4bf94, 0xe4bf9c, 0xe4bf99, 0xe4bebb,
+ /* e8 */ 0xe4beb3, 0xe4bf9b, 0xe4bf87, 0xe4bf96,
+ /* ec */ 0xe4beba, 0xe4bf80, 0xe4beb9, 0xe4bfac,
+ /* f0 */ 0xe58984, 0xe58989, 0xe58b80, 0xe58b82,
+ /* f4 */ 0xe58cbd, 0xe58dbc, 0xe58e97, 0xe58e96,
+ /* f8 */ 0xe58e99, 0xe58e98, 0xe592ba, 0xe592a1,
+ /* fc */ 0xe592ad, 0xe592a5, 0xe5938f,
+
+ /*** Two byte table, leaf: cexx - offset 0x021ec ***/
+
+ /* 40 */ 0xe59383, 0xe88c8d, 0xe592b7, 0xe592ae,
+ /* 44 */ 0xe59396, 0xe592b6, 0xe59385, 0xe59386,
+ /* 48 */ 0xe592a0, 0xe591b0, 0xe592bc, 0xe592a2,
+ /* 4c */ 0xe592be, 0xe591b2, 0xe5939e, 0xe592b0,
+ /* 50 */ 0xe59eb5, 0xe59e9e, 0xe59e9f, 0xe59ea4,
+ /* 54 */ 0xe59e8c, 0xe59e97, 0xe59e9d, 0xe59e9b,
+ /* 58 */ 0xe59e94, 0xe59e98, 0xe59e8f, 0xe59e99,
+ /* 5c */ 0xe59ea5, 0xe59e9a, 0xe59e95, 0xe5a3b4,
+ /* 60 */ 0xe5a48d, 0xe5a593, 0xe5a7a1, 0xe5a79e,
+ /* 64 */ 0xe5a7ae, 0xe5a880, 0xe5a7b1, 0xe5a79d,
+ /* 68 */ 0xe5a7ba, 0xe5a7bd, 0xe5a7bc, 0xe5a7b6,
+ /* 6c */ 0xe5a7a4, 0xe5a7b2, 0xe5a7b7, 0xe5a79b,
+ /* 70 */ 0xe5a7a9, 0xe5a7b3, 0xe5a7b5, 0xe5a7a0,
+ /* 74 */ 0xe5a7be, 0xe5a7b4, 0xe5a7ad, 0xe5aea8,
+ /* 78 */ 0xe5b18c, 0xe5b390, 0xe5b398, 0xe5b38c,
+ /* 7c */ 0xe5b397, 0xe5b38b, 0xe5b39b, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5b39e, 0xe5b39a, 0xe5b389,
+ /* a4 */ 0xe5b387, 0xe5b38a, 0xe5b396, 0xe5b393,
+ /* a8 */ 0xe5b394, 0xe5b38f, 0xe5b388, 0xe5b386,
+ /* ac */ 0xe5b38e, 0xe5b39f, 0xe5b3b8, 0xe5b7b9,
+ /* b0 */ 0xe5b8a1, 0xe5b8a2, 0xe5b8a3, 0xe5b8a0,
+ /* b4 */ 0xe5b8a4, 0xe5bab0, 0xe5baa4, 0xe5baa2,
+ /* b8 */ 0xe5ba9b, 0xe5baa3, 0xe5baa5, 0xe5bc87,
+ /* bc */ 0xe5bcae, 0xe5bd96, 0xe5be86, 0xe680b7,
+ /* c0 */ 0xe680b9, 0xe68194, 0xe681b2, 0xe6819e,
+ /* c4 */ 0xe68185, 0xe68193, 0xe68187, 0xe68189,
+ /* c8 */ 0xe6819b, 0xe6818c, 0xe68180, 0xe68182,
+ /* cc */ 0xe6819f, 0xe680a4, 0xe68184, 0xe68198,
+ /* d0 */ 0xe681a6, 0xe681ae, 0xe68982, 0xe68983,
+ /* d4 */ 0xe68b8f, 0xe68c8d, 0xe68c8b, 0xe68bb5,
+ /* d8 */ 0xe68c8e, 0xe68c83, 0xe68bab, 0xe68bb9,
+ /* dc */ 0xe68c8f, 0xe68c8c, 0xe68bb8, 0xe68bb6,
+ /* e0 */ 0xe68c80, 0xe68c93, 0xe68c94, 0xe68bba,
+ /* e4 */ 0xe68c95, 0xe68bbb, 0xe68bb0, 0xe69581,
+ /* e8 */ 0xe69583, 0xe696aa, 0xe696bf, 0xe698b6,
+ /* ec */ 0xe698a1, 0xe698b2, 0xe698b5, 0xe6989c,
+ /* f0 */ 0xe698a6, 0xe698a2, 0xe698b3, 0xe698ab,
+ /* f4 */ 0xe698ba, 0xe6989d, 0xe698b4, 0xe698b9,
+ /* f8 */ 0xe698ae, 0xe69c8f, 0xe69c90, 0xe69f81,
+ /* fc */ 0xe69fb2, 0xe69f88, 0xe69eba,
+
+ /*** Two byte table, leaf: cfxx - offset 0x022ab ***/
+
+ /* 40 */ 0xe69f9c, 0xe69ebb, 0xe69fb8, 0xe69f98,
+ /* 44 */ 0xe69f80, 0xe69eb7, 0xe69f85, 0xe69fab,
+ /* 48 */ 0xe69fa4, 0xe69f9f, 0xe69eb5, 0xe69f8d,
+ /* 4c */ 0xe69eb3, 0xe69fb7, 0xe69fb6, 0xe69fae,
+ /* 50 */ 0xe69fa3, 0xe69f82, 0xe69eb9, 0xe69f8e,
+ /* 54 */ 0xe69fa7, 0xe69fb0, 0xe69eb2, 0xe69fbc,
+ /* 58 */ 0xe69f86, 0xe69fad, 0xe69f8c, 0xe69eae,
+ /* 5c */ 0xe69fa6, 0xe69f9b, 0xe69fba, 0xe69f89,
+ /* 60 */ 0xe69f8a, 0xe69f83, 0xe69faa, 0xe69f8b,
+ /* 64 */ 0xe6aca8, 0xe6ae82, 0xe6ae84, 0xe6aeb6,
+ /* 68 */ 0xe6af96, 0xe6af98, 0xe6afa0, 0xe6b0a0,
+ /* 6c */ 0xe6b0a1, 0xe6b4a8, 0xe6b4b4, 0xe6b4ad,
+ /* 70 */ 0xe6b49f, 0xe6b4bc, 0xe6b4bf, 0xe6b492,
+ /* 74 */ 0xe6b48a, 0xe6b39a, 0xe6b4b3, 0xe6b484,
+ /* 78 */ 0xe6b499, 0xe6b4ba, 0xe6b49a, 0xe6b491,
+ /* 7c */ 0xe6b480, 0xe6b49d, 0xe6b582, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6b481, 0xe6b498, 0xe6b4b7,
+ /* a4 */ 0xe6b483, 0xe6b48f, 0xe6b580, 0xe6b487,
+ /* a8 */ 0xe6b4a0, 0xe6b4ac, 0xe6b488, 0xe6b4a2,
+ /* ac */ 0xe6b489, 0xe6b490, 0xe782b7, 0xe7829f,
+ /* b0 */ 0xe782be, 0xe782b1, 0xe782b0, 0xe782a1,
+ /* b4 */ 0xe782b4, 0xe782b5, 0xe782a9, 0xe78981,
+ /* b8 */ 0xe78989, 0xe7898a, 0xe789ac, 0xe789b0,
+ /* bc */ 0xe789b3, 0xe789ae, 0xe78b8a, 0xe78ba4,
+ /* c0 */ 0xe78ba8, 0xe78bab, 0xe78b9f, 0xe78baa,
+ /* c4 */ 0xe78ba6, 0xe78ba3, 0xe78e85, 0xe78f8c,
+ /* c8 */ 0xe78f82, 0xe78f88, 0xe78f85, 0xe78eb9,
+ /* cc */ 0xe78eb6, 0xe78eb5, 0xe78eb4, 0xe78fab,
+ /* d0 */ 0xe78ebf, 0xe78f87, 0xe78ebe, 0xe78f83,
+ /* d4 */ 0xe78f86, 0xe78eb8, 0xe78f8b, 0xe793ac,
+ /* d8 */ 0xe793ae, 0xe794ae, 0xe79587, 0xe79588,
+ /* dc */ 0xe796a7, 0xe796aa, 0xe799b9, 0xe79b84,
+ /* e0 */ 0xe79c88, 0xe79c83, 0xe79c84, 0xe79c85,
+ /* e4 */ 0xe79c8a, 0xe79bb7, 0xe79bbb, 0xe79bba,
+ /* e8 */ 0xe79fa7, 0xe79fa8, 0xe7a086, 0xe7a091,
+ /* ec */ 0xe7a092, 0xe7a085, 0xe7a090, 0xe7a08f,
+ /* f0 */ 0xe7a08e, 0xe7a089, 0xe7a083, 0xe7a093,
+ /* f4 */ 0xe7a58a, 0xe7a58c, 0xe7a58b, 0xe7a585,
+ /* f8 */ 0xe7a584, 0xe7a795, 0xe7a78d, 0xe7a78f,
+ /* fc */ 0xe7a796, 0xe7a78e, 0xe7aa80,
+
+ /*** Two byte table, leaf: d0xx - offset 0x0236a ***/
+
+ /* 40 */ 0xe7a9be, 0xe7ab91, 0xe7ac80, 0xe7ac81,
+ /* 44 */ 0xe7b1ba, 0xe7b1b8, 0xe7b1b9, 0xe7b1bf,
+ /* 48 */ 0xe7b280, 0xe7b281, 0xe7b483, 0xe7b488,
+ /* 4c */ 0xe7b481, 0xe7bd98, 0xe7be91, 0xe7be8d,
+ /* 50 */ 0xe7bebe, 0xe88087, 0xe8808e, 0xe8808f,
+ /* 54 */ 0xe88094, 0xe880b7, 0xe88398, 0xe88387,
+ /* 58 */ 0xe883a0, 0xe88391, 0xe88388, 0xe88382,
+ /* 5c */ 0xe88390, 0xe88385, 0xe883a3, 0xe88399,
+ /* 60 */ 0xe8839c, 0xe8838a, 0xe88395, 0xe88389,
+ /* 64 */ 0xe8838f, 0xe88397, 0xe883a6, 0xe8838d,
+ /* 68 */ 0xe887bf, 0xe888a1, 0xe88a94, 0xe88b99,
+ /* 6c */ 0xe88bbe, 0xe88bb9, 0xe88c87, 0xe88ba8,
+ /* 70 */ 0xe88c80, 0xe88b95, 0xe88cba, 0xe88bab,
+ /* 74 */ 0xe88b96, 0xe88bb4, 0xe88bac, 0xe88ba1,
+ /* 78 */ 0xe88bb2, 0xe88bb5, 0xe88c8c, 0xe88bbb,
+ /* 7c */ 0xe88bb6, 0xe88bb0, 0xe88baa, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88ba4, 0xe88ba0, 0xe88bba,
+ /* a4 */ 0xe88bb3, 0xe88bad, 0xe899b7, 0xe899b4,
+ /* a8 */ 0xe899bc, 0xe899b3, 0xe8a181, 0xe8a18e,
+ /* ac */ 0xe8a1a7, 0xe8a1aa, 0xe8a1a9, 0xe8a793,
+ /* b0 */ 0xe8a884, 0xe8a887, 0xe8b5b2, 0xe8bfa3,
+ /* b4 */ 0xe8bfa1, 0xe8bfae, 0xe8bfa0, 0xe983b1,
+ /* b8 */ 0xe982bd, 0xe982bf, 0xe98395, 0xe98385,
+ /* bc */ 0xe982be, 0xe98387, 0xe9838b, 0xe98388,
+ /* c0 */ 0xe98794, 0xe98793, 0xe99994, 0xe9998f,
+ /* c4 */ 0xe99991, 0xe99993, 0xe9998a, 0xe9998e,
+ /* c8 */ 0xe5809e, 0xe58085, 0xe58087, 0xe58093,
+ /* cc */ 0xe580a2, 0xe580b0, 0xe5809b, 0xe4bfb5,
+ /* d0 */ 0xe4bfb4, 0xe580b3, 0xe580b7, 0xe580ac,
+ /* d4 */ 0xe4bfb6, 0xe4bfb7, 0xe58097, 0xe5809c,
+ /* d8 */ 0xe580a0, 0xe580a7, 0xe580b5, 0xe580af,
+ /* dc */ 0xe580b1, 0xe5808e, 0xe5859a, 0xe58694,
+ /* e0 */ 0xe58693, 0xe5878a, 0xe58784, 0xe58785,
+ /* e4 */ 0xe58788, 0xe5878e, 0xe589a1, 0xe5899a,
+ /* e8 */ 0xe58992, 0xe5899e, 0xe5899f, 0xe58995,
+ /* ec */ 0xe589a2, 0xe58b8d, 0xe58c8e, 0xe58e9e,
+ /* f0 */ 0xe594a6, 0xe593a2, 0xe59497, 0xe59492,
+ /* f4 */ 0xe593a7, 0xe593b3, 0xe593a4, 0xe5949a,
+ /* f8 */ 0xe593bf, 0xe59484, 0xe59488, 0xe593ab,
+ /* fc */ 0xe59491, 0xe59485, 0xe593b1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x02429 ***/
+
+ /* 40 */ 0xe5948a, 0xe593bb, 0xe593b7, 0xe593b8,
+ /* 44 */ 0xe593a0, 0xe5948e, 0xe59483, 0xe5948b,
+ /* 48 */ 0xe59c81, 0xe59c82, 0xe59f8c, 0xe5a0b2,
+ /* 4c */ 0xe59f95, 0xe59f92, 0xe59eba, 0xe59f86,
+ /* 50 */ 0xe59ebd, 0xe59ebc, 0xe59eb8, 0xe59eb6,
+ /* 54 */ 0xe59ebf, 0xe59f87, 0xe59f90, 0xe59eb9,
+ /* 58 */ 0xe59f81, 0xe5a48e, 0xe5a58a, 0xe5a899,
+ /* 5c */ 0xe5a896, 0xe5a8ad, 0xe5a8ae, 0xe5a895,
+ /* 60 */ 0xe5a88f, 0xe5a897, 0xe5a88a, 0xe5a89e,
+ /* 64 */ 0xe5a8b3, 0xe5adac, 0xe5aea7, 0xe5aead,
+ /* 68 */ 0xe5aeac, 0xe5b083, 0xe5b196, 0xe5b194,
+ /* 6c */ 0xe5b3ac, 0xe5b3bf, 0xe5b3ae, 0xe5b3b1,
+ /* 70 */ 0xe5b3b7, 0xe5b480, 0xe5b3b9, 0xe5b8a9,
+ /* 74 */ 0xe5b8a8, 0xe5baa8, 0xe5baae, 0xe5baaa,
+ /* 78 */ 0xe5baac, 0xe5bcb3, 0xe5bcb0, 0xe5bda7,
+ /* 7c */ 0xe6819d, 0xe6819a, 0xe681a7, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe68181, 0xe682a2, 0xe68288,
+ /* a4 */ 0xe68280, 0xe68292, 0xe68281, 0xe6829d,
+ /* a8 */ 0xe68283, 0xe68295, 0xe6829b, 0xe68297,
+ /* ac */ 0xe68287, 0xe6829c, 0xe6828e, 0xe68899,
+ /* b0 */ 0xe68986, 0xe68bb2, 0xe68c90, 0xe68d96,
+ /* b4 */ 0xe68cac, 0xe68d84, 0xe68d85, 0xe68cb6,
+ /* b8 */ 0xe68d83, 0xe68fa4, 0xe68cb9, 0xe68d8b,
+ /* bc */ 0xe68d8a, 0xe68cbc, 0xe68ca9, 0xe68d81,
+ /* c0 */ 0xe68cb4, 0xe68d98, 0xe68d94, 0xe68d99,
+ /* c4 */ 0xe68cad, 0xe68d87, 0xe68cb3, 0xe68d9a,
+ /* c8 */ 0xe68d91, 0xe68cb8, 0xe68d97, 0xe68d80,
+ /* cc */ 0xe68d88, 0xe6958a, 0xe69586, 0xe69786,
+ /* d0 */ 0xe69783, 0xe69784, 0xe69782, 0xe6998a,
+ /* d4 */ 0xe6999f, 0xe69987, 0xe69991, 0xe69c92,
+ /* d8 */ 0xe69c93, 0xe6a09f, 0xe6a09a, 0xe6a189,
+ /* dc */ 0xe6a0b2, 0xe6a0b3, 0xe6a0bb, 0xe6a18b,
+ /* e0 */ 0xe6a18f, 0xe6a096, 0xe6a0b1, 0xe6a09c,
+ /* e4 */ 0xe6a0b5, 0xe6a0ab, 0xe6a0ad, 0xe6a0af,
+ /* e8 */ 0xe6a18e, 0xe6a184, 0xe6a0b4, 0xe6a09d,
+ /* ec */ 0xe6a092, 0xe6a094, 0xe6a0a6, 0xe6a0a8,
+ /* f0 */ 0xe6a0ae, 0xe6a18d, 0xe6a0ba, 0xe6a0a5,
+ /* f4 */ 0xe6a0a0, 0xe6acac, 0xe6acaf, 0xe6acad,
+ /* f8 */ 0xe6acb1, 0xe6acb4, 0xe6adad, 0xe88282,
+ /* fc */ 0xe6ae88, 0xe6afa6, 0xe6afa4,
+
+ /*** Two byte table, leaf: d2xx - offset 0x024e8 ***/
+
+ /* 40 */ 0xe6afa8, 0xe6afa3, 0xe6afa2, 0xe6afa7,
+ /* 44 */ 0xe6b0a5, 0xe6b5ba, 0xe6b5a3, 0xe6b5a4,
+ /* 48 */ 0xe6b5b6, 0xe6b48d, 0xe6b5a1, 0xe6b692,
+ /* 4c */ 0xe6b598, 0xe6b5a2, 0xe6b5ad, 0xe6b5af,
+ /* 50 */ 0xe6b691, 0xe6b68d, 0xe6b7af, 0xe6b5bf,
+ /* 54 */ 0xe6b686, 0xe6b59e, 0xe6b5a7, 0xe6b5a0,
+ /* 58 */ 0xe6b697, 0xe6b5b0, 0xe6b5bc, 0xe6b59f,
+ /* 5c */ 0xe6b682, 0xe6b698, 0xe6b4af, 0xe6b5a8,
+ /* 60 */ 0xe6b68b, 0xe6b5be, 0xe6b680, 0xe6b684,
+ /* 64 */ 0xe6b496, 0xe6b683, 0xe6b5bb, 0xe6b5bd,
+ /* 68 */ 0xe6b5b5, 0xe6b690, 0xe7839c, 0xe78393,
+ /* 6c */ 0xe78391, 0xe7839d, 0xe7838b, 0xe7bcb9,
+ /* 70 */ 0xe783a2, 0xe78397, 0xe78392, 0xe7839e,
+ /* 74 */ 0xe783a0, 0xe78394, 0xe7838d, 0xe78385,
+ /* 78 */ 0xe78386, 0xe78387, 0xe7839a, 0xe7838e,
+ /* 7c */ 0xe783a1, 0xe78982, 0xe789b8, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe789b7, 0xe789b6, 0xe78c80,
+ /* a4 */ 0xe78bba, 0xe78bb4, 0xe78bbe, 0xe78bb6,
+ /* a8 */ 0xe78bb3, 0xe78bbb, 0xe78c81, 0xe78f93,
+ /* ac */ 0xe78f99, 0xe78fa5, 0xe78f96, 0xe78ebc,
+ /* b0 */ 0xe78fa7, 0xe78fa3, 0xe78fa9, 0xe78f9c,
+ /* b4 */ 0xe78f92, 0xe78f9b, 0xe78f94, 0xe78f9d,
+ /* b8 */ 0xe78f9a, 0xe78f97, 0xe78f98, 0xe78fa8,
+ /* bc */ 0xe7939e, 0xe7939f, 0xe793b4, 0xe793b5,
+ /* c0 */ 0xe794a1, 0xe7959b, 0xe7959f, 0xe796b0,
+ /* c4 */ 0xe79781, 0xe796bb, 0xe79784, 0xe79780,
+ /* c8 */ 0xe796bf, 0xe796b6, 0xe796ba, 0xe79a8a,
+ /* cc */ 0xe79b89, 0xe79c9d, 0xe79c9b, 0xe79c90,
+ /* d0 */ 0xe79c93, 0xe79c92, 0xe79ca3, 0xe79c91,
+ /* d4 */ 0xe79c95, 0xe79c99, 0xe79c9a, 0xe79ca2,
+ /* d8 */ 0xe79ca7, 0xe7a0a3, 0xe7a0ac, 0xe7a0a2,
+ /* dc */ 0xe7a0b5, 0xe7a0af, 0xe7a0a8, 0xe7a0ae,
+ /* e0 */ 0xe7a0ab, 0xe7a0a1, 0xe7a0a9, 0xe7a0b3,
+ /* e4 */ 0xe7a0aa, 0xe7a0b1, 0xe7a594, 0xe7a59b,
+ /* e8 */ 0xe7a58f, 0xe7a59c, 0xe7a593, 0xe7a592,
+ /* ec */ 0xe7a591, 0xe7a7ab, 0xe7a7ac, 0xe7a7a0,
+ /* f0 */ 0xe7a7ae, 0xe7a7ad, 0xe7a7aa, 0xe7a79c,
+ /* f4 */ 0xe7a79e, 0xe7a79d, 0xe7aa86, 0xe7aa89,
+ /* f8 */ 0xe7aa85, 0xe7aa8b, 0xe7aa8c, 0xe7aa8a,
+ /* fc */ 0xe7aa87, 0xe7ab98, 0xe7ac90,
+
+ /*** Two byte table, leaf: d3xx - offset 0x025a7 ***/
+
+ /* 40 */ 0xe7ac84, 0xe7ac93, 0xe7ac85, 0xe7ac8f,
+ /* 44 */ 0xe7ac88, 0xe7ac8a, 0xe7ac8e, 0xe7ac89,
+ /* 48 */ 0xe7ac92, 0xe7b284, 0xe7b291, 0xe7b28a,
+ /* 4c */ 0xe7b28c, 0xe7b288, 0xe7b28d, 0xe7b285,
+ /* 50 */ 0xe7b49e, 0xe7b49d, 0xe7b491, 0xe7b48e,
+ /* 54 */ 0xe7b498, 0xe7b496, 0xe7b493, 0xe7b49f,
+ /* 58 */ 0xe7b492, 0xe7b48f, 0xe7b48c, 0xe7bd9c,
+ /* 5c */ 0xe7bda1, 0xe7bd9e, 0xe7bda0, 0xe7bd9d,
+ /* 60 */ 0xe7bd9b, 0xe7be96, 0xe7be92, 0xe7bf83,
+ /* 64 */ 0xe7bf82, 0xe7bf80, 0xe88096, 0xe880be,
+ /* 68 */ 0xe880b9, 0xe883ba, 0xe883b2, 0xe883b9,
+ /* 6c */ 0xe883b5, 0xe88481, 0xe883bb, 0xe88480,
+ /* 70 */ 0xe88881, 0xe888af, 0xe888a5, 0xe88cb3,
+ /* 74 */ 0xe88cad, 0xe88d84, 0xe88c99, 0xe88d91,
+ /* 78 */ 0xe88ca5, 0xe88d96, 0xe88cbf, 0xe88d81,
+ /* 7c */ 0xe88ca6, 0xe88c9c, 0xe88ca2, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88d82, 0xe88d8e, 0xe88c9b,
+ /* a4 */ 0xe88caa, 0xe88c88, 0xe88cbc, 0xe88d8d,
+ /* a8 */ 0xe88c96, 0xe88ca4, 0xe88ca0, 0xe88cb7,
+ /* ac */ 0xe88caf, 0xe88ca9, 0xe88d87, 0xe88d85,
+ /* b0 */ 0xe88d8c, 0xe88d93, 0xe88c9e, 0xe88cac,
+ /* b4 */ 0xe88d8b, 0xe88ca7, 0xe88d88, 0xe89993,
+ /* b8 */ 0xe89992, 0xe89aa2, 0xe89aa8, 0xe89a96,
+ /* bc */ 0xe89a8d, 0xe89a91, 0xe89a9e, 0xe89a87,
+ /* c0 */ 0xe89a97, 0xe89a86, 0xe89a8b, 0xe89a9a,
+ /* c4 */ 0xe89a85, 0xe89aa5, 0xe89a99, 0xe89aa1,
+ /* c8 */ 0xe89aa7, 0xe89a95, 0xe89a98, 0xe89a8e,
+ /* cc */ 0xe89a9d, 0xe89a90, 0xe89a94, 0xe8a183,
+ /* d0 */ 0xe8a184, 0xe8a1ad, 0xe8a1b5, 0xe8a1b6,
+ /* d4 */ 0xe8a1b2, 0xe8a280, 0xe8a1b1, 0xe8a1bf,
+ /* d8 */ 0xe8a1af, 0xe8a283, 0xe8a1be, 0xe8a1b4,
+ /* dc */ 0xe8a1bc, 0xe8a892, 0xe8b187, 0xe8b197,
+ /* e0 */ 0xe8b1bb, 0xe8b2a4, 0xe8b2a3, 0xe8b5b6,
+ /* e4 */ 0xe8b5b8, 0xe8b6b5, 0xe8b6b7, 0xe8b6b6,
+ /* e8 */ 0xe8bb91, 0xe8bb93, 0xe8bfbe, 0xe8bfb5,
+ /* ec */ 0xe98082, 0xe8bfbf, 0xe8bfbb, 0xe98084,
+ /* f0 */ 0xe8bfbc, 0xe8bfb6, 0xe98396, 0xe983a0,
+ /* f4 */ 0xe98399, 0xe9839a, 0xe983a3, 0xe9839f,
+ /* f8 */ 0xe983a5, 0xe98398, 0xe9839b, 0xe98397,
+ /* fc */ 0xe9839c, 0xe983a4, 0xe98590,
+
+ /*** Two byte table, leaf: d4xx - offset 0x02666 ***/
+
+ /* 40 */ 0xe9858e, 0xe9858f, 0xe98795, 0xe987a2,
+ /* 44 */ 0xe9879a, 0xe9999c, 0xe9999f, 0xe99abc,
+ /* 48 */ 0xe9a3a3, 0xe9ab9f, 0xe9acaf, 0xe4b9bf,
+ /* 4c */ 0xe581b0, 0xe581aa, 0xe581a1, 0xe5819e,
+ /* 50 */ 0xe581a0, 0xe58193, 0xe5818b, 0xe5819d,
+ /* 54 */ 0xe581b2, 0xe58188, 0xe5818d, 0xe58181,
+ /* 58 */ 0xe5819b, 0xe5818a, 0xe581a2, 0xe58095,
+ /* 5c */ 0xe58185, 0xe5819f, 0xe581a9, 0xe581ab,
+ /* 60 */ 0xe581a3, 0xe581a4, 0xe58186, 0xe58180,
+ /* 64 */ 0xe581ae, 0xe581b3, 0xe58197, 0xe58191,
+ /* 68 */ 0xe58790, 0xe589ab, 0xe589ad, 0xe589ac,
+ /* 6c */ 0xe589ae, 0xe58b96, 0xe58b93, 0xe58cad,
+ /* 70 */ 0xe58e9c, 0xe595b5, 0xe595b6, 0xe594bc,
+ /* 74 */ 0xe5958d, 0xe59590, 0xe594b4, 0xe594aa,
+ /* 78 */ 0xe59591, 0xe595a2, 0xe594b6, 0xe594b5,
+ /* 7c */ 0xe594b0, 0xe59592, 0xe59585, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5948c, 0xe594b2, 0xe595a5,
+ /* a4 */ 0xe5958e, 0xe594b9, 0xe59588, 0xe594ad,
+ /* a8 */ 0xe594bb, 0xe59580, 0xe5958b, 0xe59c8a,
+ /* ac */ 0xe59c87, 0xe59fbb, 0xe5a094, 0xe59fa2,
+ /* b0 */ 0xe59fb6, 0xe59f9c, 0xe59fb4, 0xe5a080,
+ /* b4 */ 0xe59fad, 0xe59fbd, 0xe5a088, 0xe59fb8,
+ /* b8 */ 0xe5a08b, 0xe59fb3, 0xe59f8f, 0xe5a087,
+ /* bc */ 0xe59fae, 0xe59fa3, 0xe59fb2, 0xe59fa5,
+ /* c0 */ 0xe59fac, 0xe59fa1, 0xe5a08e, 0xe59fbc,
+ /* c4 */ 0xe5a090, 0xe59fa7, 0xe5a081, 0xe5a08c,
+ /* c8 */ 0xe59fb1, 0xe59fa9, 0xe59fb0, 0xe5a08d,
+ /* cc */ 0xe5a084, 0xe5a59c, 0xe5a9a0, 0xe5a998,
+ /* d0 */ 0xe5a995, 0xe5a9a7, 0xe5a99e, 0xe5a8b8,
+ /* d4 */ 0xe5a8b5, 0xe5a9ad, 0xe5a990, 0xe5a99f,
+ /* d8 */ 0xe5a9a5, 0xe5a9ac, 0xe5a993, 0xe5a9a4,
+ /* dc */ 0xe5a997, 0xe5a983, 0xe5a99d, 0xe5a992,
+ /* e0 */ 0xe5a984, 0xe5a99b, 0xe5a988, 0xe5aa8e,
+ /* e4 */ 0xe5a8be, 0xe5a98d, 0xe5a8b9, 0xe5a98c,
+ /* e8 */ 0xe5a9b0, 0xe5a9a9, 0xe5a987, 0xe5a991,
+ /* ec */ 0xe5a996, 0xe5a982, 0xe5a99c, 0xe5adb2,
+ /* f0 */ 0xe5adae, 0xe5af81, 0xe5af80, 0xe5b199,
+ /* f4 */ 0xe5b49e, 0xe5b48b, 0xe5b49d, 0xe5b49a,
+ /* f8 */ 0xe5b4a0, 0xe5b48c, 0xe5b4a8, 0xe5b48d,
+ /* fc */ 0xe5b4a6, 0xe5b4a5, 0xe5b48f,
+
+ /*** Two byte table, leaf: d5xx - offset 0x02725 ***/
+
+ /* 40 */ 0xe5b4b0, 0xe5b492, 0xe5b4a3, 0xe5b49f,
+ /* 44 */ 0xe5b4ae, 0xe5b8be, 0xe5b8b4, 0xe5bab1,
+ /* 48 */ 0xe5bab4, 0xe5bab9, 0xe5bab2, 0xe5bab3,
+ /* 4c */ 0xe5bcb6, 0xe5bcb8, 0xe5be9b, 0xe5be96,
+ /* 50 */ 0xe5be9f, 0xe6828a, 0xe68290, 0xe68286,
+ /* 54 */ 0xe682be, 0xe682b0, 0xe682ba, 0xe68393,
+ /* 58 */ 0xe68394, 0xe6838f, 0xe683a4, 0xe68399,
+ /* 5c */ 0xe6839d, 0xe68388, 0xe682b1, 0xe6839b,
+ /* 60 */ 0xe682b7, 0xe6838a, 0xe682bf, 0xe68383,
+ /* 64 */ 0xe6838d, 0xe68380, 0xe68cb2, 0xe68da5,
+ /* 68 */ 0xe68e8a, 0xe68e82, 0xe68dbd, 0xe68ebd,
+ /* 6c */ 0xe68e9e, 0xe68ead, 0xe68e9d, 0xe68e97,
+ /* 70 */ 0xe68eab, 0xe68e8e, 0xe68daf, 0xe68e87,
+ /* 74 */ 0xe68e90, 0xe68dae, 0xe68eaf, 0xe68db5,
+ /* 78 */ 0xe68e9c, 0xe68dad, 0xe68eae, 0xe68dbc,
+ /* 7c */ 0xe68ea4, 0xe68cbb, 0xe68e9f, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe68db8, 0xe68e85, 0xe68e81,
+ /* a4 */ 0xe68e91, 0xe68e8d, 0xe68db0, 0xe69593,
+ /* a8 */ 0xe6978d, 0xe699a5, 0xe699a1, 0xe6999b,
+ /* ac */ 0xe69999, 0xe6999c, 0xe699a2, 0xe69c98,
+ /* b0 */ 0xe6a1b9, 0xe6a287, 0xe6a290, 0xe6a29c,
+ /* b4 */ 0xe6a1ad, 0xe6a1ae, 0xe6a2ae, 0xe6a2ab,
+ /* b8 */ 0xe6a596, 0xe6a1af, 0xe6a2a3, 0xe6a2ac,
+ /* bc */ 0xe6a2a9, 0xe6a1b5, 0xe6a1b4, 0xe6a2b2,
+ /* c0 */ 0xe6a28f, 0xe6a1b7, 0xe6a292, 0xe6a1bc,
+ /* c4 */ 0xe6a1ab, 0xe6a1b2, 0xe6a2aa, 0xe6a280,
+ /* c8 */ 0xe6a1b1, 0xe6a1be, 0xe6a29b, 0xe6a296,
+ /* cc */ 0xe6a28b, 0xe6a2a0, 0xe6a289, 0xe6a2a4,
+ /* d0 */ 0xe6a1b8, 0xe6a1bb, 0xe6a291, 0xe6a28c,
+ /* d4 */ 0xe6a28a, 0xe6a1bd, 0xe6acb6, 0xe6acb3,
+ /* d8 */ 0xe6acb7, 0xe6acb8, 0xe6ae91, 0xe6ae8f,
+ /* dc */ 0xe6ae8d, 0xe6ae8e, 0xe6ae8c, 0xe6b0aa,
+ /* e0 */ 0xe6b780, 0xe6b6ab, 0xe6b6b4, 0xe6b6b3,
+ /* e4 */ 0xe6b9b4, 0xe6b6ac, 0xe6b7a9, 0xe6b7a2,
+ /* e8 */ 0xe6b6b7, 0xe6b7b6, 0xe6b794, 0xe6b880,
+ /* ec */ 0xe6b788, 0xe6b7a0, 0xe6b79f, 0xe6b796,
+ /* f0 */ 0xe6b6be, 0xe6b7a5, 0xe6b79c, 0xe6b79d,
+ /* f4 */ 0xe6b79b, 0xe6b7b4, 0xe6b78a, 0xe6b6bd,
+ /* f8 */ 0xe6b7ad, 0xe6b7b0, 0xe6b6ba, 0xe6b795,
+ /* fc */ 0xe6b782, 0xe6b78f, 0xe6b789,
+
+ /*** Two byte table, leaf: d6xx - offset 0x027e4 ***/
+
+ /* 40 */ 0xe6b790, 0xe6b7b2, 0xe6b793, 0xe6b7bd,
+ /* 44 */ 0xe6b797, 0xe6b78d, 0xe6b7a3, 0xe6b6bb,
+ /* 48 */ 0xe783ba, 0xe7848d, 0xe783b7, 0xe78497,
+ /* 4c */ 0xe783b4, 0xe7848c, 0xe783b0, 0xe78484,
+ /* 50 */ 0xe783b3, 0xe78490, 0xe783bc, 0xe783bf,
+ /* 54 */ 0xe78486, 0xe78493, 0xe78480, 0xe783b8,
+ /* 58 */ 0xe783b6, 0xe7848b, 0xe78482, 0xe7848e,
+ /* 5c */ 0xe789be, 0xe789bb, 0xe789bc, 0xe789bf,
+ /* 60 */ 0xe78c9d, 0xe78c97, 0xe78c87, 0xe78c91,
+ /* 64 */ 0xe78c98, 0xe78c8a, 0xe78c88, 0xe78bbf,
+ /* 68 */ 0xe78c8f, 0xe78c9e, 0xe78e88, 0xe78fb6,
+ /* 6c */ 0xe78fb8, 0xe78fb5, 0xe79084, 0xe79081,
+ /* 70 */ 0xe78fbd, 0xe79087, 0xe79080, 0xe78fba,
+ /* 74 */ 0xe78fbc, 0xe78fbf, 0xe7908c, 0xe7908b,
+ /* 78 */ 0xe78fb4, 0xe79088, 0xe795a4, 0xe795a3,
+ /* 7c */ 0xe7978e, 0xe79792, 0xe7978f, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7978b, 0xe7978c, 0xe79791,
+ /* a4 */ 0xe79790, 0xe79a8f, 0xe79a89, 0xe79b93,
+ /* a8 */ 0xe79cb9, 0xe79caf, 0xe79cad, 0xe79cb1,
+ /* ac */ 0xe79cb2, 0xe79cb4, 0xe79cb3, 0xe79cbd,
+ /* b0 */ 0xe79ca5, 0xe79cbb, 0xe79cb5, 0xe7a188,
+ /* b4 */ 0xe7a192, 0xe7a189, 0xe7a18d, 0xe7a18a,
+ /* b8 */ 0xe7a18c, 0xe7a0a6, 0xe7a185, 0xe7a190,
+ /* bc */ 0xe7a5a4, 0xe7a5a7, 0xe7a5a9, 0xe7a5aa,
+ /* c0 */ 0xe7a5a3, 0xe7a5ab, 0xe7a5a1, 0xe7a6bb,
+ /* c4 */ 0xe7a7ba, 0xe7a7b8, 0xe7a7b6, 0xe7a7b7,
+ /* c8 */ 0xe7aa8f, 0xe7aa94, 0xe7aa90, 0xe7acb5,
+ /* cc */ 0xe7ad87, 0xe7acb4, 0xe7aca5, 0xe7acb0,
+ /* d0 */ 0xe7aca2, 0xe7aca4, 0xe7acb3, 0xe7ac98,
+ /* d4 */ 0xe7acaa, 0xe7ac9d, 0xe7acb1, 0xe7acab,
+ /* d8 */ 0xe7acad, 0xe7acaf, 0xe7acb2, 0xe7acb8,
+ /* dc */ 0xe7ac9a, 0xe7aca3, 0xe7b294, 0xe7b298,
+ /* e0 */ 0xe7b296, 0xe7b2a3, 0xe7b4b5, 0xe7b4bd,
+ /* e4 */ 0xe7b4b8, 0xe7b4b6, 0xe7b4ba, 0xe7b585,
+ /* e8 */ 0xe7b4ac, 0xe7b4a9, 0xe7b581, 0xe7b587,
+ /* ec */ 0xe7b4be, 0xe7b4bf, 0xe7b58a, 0xe7b4bb,
+ /* f0 */ 0xe7b4a8, 0xe7bda3, 0xe7be95, 0xe7be9c,
+ /* f4 */ 0xe7be9d, 0xe7be9b, 0xe7bf8a, 0xe7bf8b,
+ /* f8 */ 0xe7bf8d, 0xe7bf90, 0xe7bf91, 0xe7bf87,
+ /* fc */ 0xe7bf8f, 0xe7bf89, 0xe8809f,
+
+ /*** Two byte table, leaf: d7xx - offset 0x028a3 ***/
+
+ /* 40 */ 0xe8809e, 0xe8809b, 0xe88187, 0xe88183,
+ /* 44 */ 0xe88188, 0xe88498, 0xe884a5, 0xe88499,
+ /* 48 */ 0xe8849b, 0xe884ad, 0xe8849f, 0xe884ac,
+ /* 4c */ 0xe8849e, 0xe884a1, 0xe88495, 0xe884a7,
+ /* 50 */ 0xe8849d, 0xe884a2, 0xe88891, 0xe888b8,
+ /* 54 */ 0xe888b3, 0xe888ba, 0xe888b4, 0xe888b2,
+ /* 58 */ 0xe889b4, 0xe88e90, 0xe88ea3, 0xe88ea8,
+ /* 5c */ 0xe88e8d, 0xe88dba, 0xe88db3, 0xe88ea4,
+ /* 60 */ 0xe88db4, 0xe88e8f, 0xe88e81, 0xe88e95,
+ /* 64 */ 0xe88e99, 0xe88db5, 0xe88e94, 0xe88ea9,
+ /* 68 */ 0xe88dbd, 0xe88e83, 0xe88e8c, 0xe88e9d,
+ /* 6c */ 0xe88e9b, 0xe88eaa, 0xe88e8b, 0xe88dbe,
+ /* 70 */ 0xe88ea5, 0xe88eaf, 0xe88e88, 0xe88e97,
+ /* 74 */ 0xe88eb0, 0xe88dbf, 0xe88ea6, 0xe88e87,
+ /* 78 */ 0xe88eae, 0xe88db6, 0xe88e9a, 0xe89999,
+ /* 7c */ 0xe89996, 0xe89abf, 0xe89ab7, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe89b82, 0xe89b81, 0xe89b85,
+ /* a4 */ 0xe89aba, 0xe89ab0, 0xe89b88, 0xe89ab9,
+ /* a8 */ 0xe89ab3, 0xe89ab8, 0xe89b8c, 0xe89ab4,
+ /* ac */ 0xe89abb, 0xe89abc, 0xe89b83, 0xe89abd,
+ /* b0 */ 0xe89abe, 0xe8a192, 0xe8a289, 0xe8a295,
+ /* b4 */ 0xe8a2a8, 0xe8a2a2, 0xe8a2aa, 0xe8a29a,
+ /* b8 */ 0xe8a291, 0xe8a2a1, 0xe8a29f, 0xe8a298,
+ /* bc */ 0xe8a2a7, 0xe8a299, 0xe8a29b, 0xe8a297,
+ /* c0 */ 0xe8a2a4, 0xe8a2ac, 0xe8a28c, 0xe8a293,
+ /* c4 */ 0xe8a28e, 0xe8a682, 0xe8a796, 0xe8a799,
+ /* c8 */ 0xe8a795, 0xe8a8b0, 0xe8a8a7, 0xe8a8ac,
+ /* cc */ 0xe8a89e, 0xe8b0b9, 0xe8b0bb, 0xe8b19c,
+ /* d0 */ 0xe8b19d, 0xe8b1bd, 0xe8b2a5, 0xe8b5bd,
+ /* d4 */ 0xe8b5bb, 0xe8b5b9, 0xe8b6bc, 0xe8b782,
+ /* d8 */ 0xe8b6b9, 0xe8b6bf, 0xe8b781, 0xe8bb98,
+ /* dc */ 0xe8bb9e, 0xe8bb9d, 0xe8bb9c, 0xe8bb97,
+ /* e0 */ 0xe8bba0, 0xe8bba1, 0xe980a4, 0xe9808b,
+ /* e4 */ 0xe98091, 0xe9809c, 0xe9808c, 0xe980a1,
+ /* e8 */ 0xe983af, 0xe983aa, 0xe983b0, 0xe983b4,
+ /* ec */ 0xe983b2, 0xe983b3, 0xe98394, 0xe983ab,
+ /* f0 */ 0xe983ac, 0xe983a9, 0xe98596, 0xe98598,
+ /* f4 */ 0xe9859a, 0xe98593, 0xe98595, 0xe987ac,
+ /* f8 */ 0xe987b4, 0xe987b1, 0xe987b3, 0xe987b8,
+ /* fc */ 0xe987a4, 0xe987b9, 0xe987aa,
+
+ /*** Two byte table, leaf: d8xx - offset 0x02962 ***/
+
+ /* 40 */ 0xe987ab, 0xe987b7, 0xe987a8, 0xe987ae,
+ /* 44 */ 0xe995ba, 0xe99686, 0xe99688, 0xe999bc,
+ /* 48 */ 0xe999ad, 0xe999ab, 0xe999b1, 0xe999af,
+ /* 4c */ 0xe99abf, 0xe99daa, 0xe9a084, 0xe9a3a5,
+ /* 50 */ 0xe9a697, 0xe5829b, 0xe58295, 0xe58294,
+ /* 54 */ 0xe5829e, 0xe5828b, 0xe582a3, 0xe58283,
+ /* 58 */ 0xe5828c, 0xe5828e, 0xe5829d, 0xe581a8,
+ /* 5c */ 0xe5829c, 0xe58292, 0xe58282, 0xe58287,
+ /* 60 */ 0xe5859f, 0xe58794, 0xe58c92, 0xe58c91,
+ /* 64 */ 0xe58ea4, 0xe58ea7, 0xe59691, 0xe596a8,
+ /* 68 */ 0xe596a5, 0xe596ad, 0xe595b7, 0xe59985,
+ /* 6c */ 0xe596a2, 0xe59693, 0xe59688, 0xe5968f,
+ /* 70 */ 0xe596b5, 0xe59681, 0xe596a3, 0xe59692,
+ /* 74 */ 0xe596a4, 0xe595bd, 0xe5968c, 0xe596a6,
+ /* 78 */ 0xe595bf, 0xe59695, 0xe596a1, 0xe5968e,
+ /* 7c */ 0xe59c8c, 0xe5a0a9, 0xe5a0b7, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5a099, 0xe5a09e, 0xe5a0a7,
+ /* a4 */ 0xe5a0a3, 0xe5a0a8, 0xe59fb5, 0xe5a188,
+ /* a8 */ 0xe5a0a5, 0xe5a09c, 0xe5a09b, 0xe5a0b3,
+ /* ac */ 0xe5a0bf, 0xe5a0b6, 0xe5a0ae, 0xe5a0b9,
+ /* b0 */ 0xe5a0b8, 0xe5a0ad, 0xe5a0ac, 0xe5a0bb,
+ /* b4 */ 0xe5a5a1, 0xe5aaaf, 0xe5aa94, 0xe5aa9f,
+ /* b8 */ 0xe5a9ba, 0xe5aaa2, 0xe5aa9e, 0xe5a9b8,
+ /* bc */ 0xe5aaa6, 0xe5a9bc, 0xe5aaa5, 0xe5aaac,
+ /* c0 */ 0xe5aa95, 0xe5aaae, 0xe5a8b7, 0xe5aa84,
+ /* c4 */ 0xe5aa8a, 0xe5aa97, 0xe5aa83, 0xe5aa8b,
+ /* c8 */ 0xe5aaa9, 0xe5a9bb, 0xe5a9bd, 0xe5aa8c,
+ /* cc */ 0xe5aa9c, 0xe5aa8f, 0xe5aa93, 0xe5aa9d,
+ /* d0 */ 0xe5afaa, 0xe5af8d, 0xe5af8b, 0xe5af94,
+ /* d4 */ 0xe5af91, 0xe5af8a, 0xe5af8e, 0xe5b08c,
+ /* d8 */ 0xe5b0b0, 0xe5b4b7, 0xe5b583, 0xe5b5ab,
+ /* dc */ 0xe5b581, 0xe5b58b, 0xe5b4bf, 0xe5b4b5,
+ /* e0 */ 0xe5b591, 0xe5b58e, 0xe5b595, 0xe5b4b3,
+ /* e4 */ 0xe5b4ba, 0xe5b592, 0xe5b4bd, 0xe5b4b1,
+ /* e8 */ 0xe5b599, 0xe5b582, 0xe5b4b9, 0xe5b589,
+ /* ec */ 0xe5b4b8, 0xe5b4bc, 0xe5b4b2, 0xe5b4b6,
+ /* f0 */ 0xe5b580, 0xe5b585, 0xe5b984, 0xe5b981,
+ /* f4 */ 0xe5bd98, 0xe5bea6, 0xe5bea5, 0xe5beab,
+ /* f8 */ 0xe68389, 0xe682b9, 0xe6838c, 0xe683a2,
+ /* fc */ 0xe6838e, 0xe68384, 0xe68494,
+
+ /*** Two byte table, leaf: d9xx - offset 0x02a21 ***/
+
+ /* 40 */ 0xe683b2, 0xe6848a, 0xe68496, 0xe68485,
+ /* 44 */ 0xe683b5, 0xe68493, 0xe683b8, 0xe683bc,
+ /* 48 */ 0xe683be, 0xe68381, 0xe68483, 0xe68498,
+ /* 4c */ 0xe6849d, 0xe68490, 0xe683bf, 0xe68484,
+ /* 50 */ 0xe6848b, 0xe6898a, 0xe68e94, 0xe68eb1,
+ /* 54 */ 0xe68eb0, 0xe68f8e, 0xe68fa5, 0xe68fa8,
+ /* 58 */ 0xe68faf, 0xe68f83, 0xe6929d, 0xe68fb3,
+ /* 5c */ 0xe68f8a, 0xe68fa0, 0xe68fb6, 0xe68f95,
+ /* 60 */ 0xe68fb2, 0xe68fb5, 0xe691a1, 0xe68f9f,
+ /* 64 */ 0xe68ebe, 0xe68f9d, 0xe68f9c, 0xe68f84,
+ /* 68 */ 0xe68f98, 0xe68f93, 0xe68f82, 0xe68f87,
+ /* 6c */ 0xe68f8c, 0xe68f8b, 0xe68f88, 0xe68fb0,
+ /* 70 */ 0xe68f97, 0xe68f99, 0xe694b2, 0xe695a7,
+ /* 74 */ 0xe695aa, 0xe695a4, 0xe6959c, 0xe695a8,
+ /* 78 */ 0xe695a5, 0xe6968c, 0xe6969d, 0xe6969e,
+ /* 7c */ 0xe696ae, 0xe69790, 0xe69792, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe699bc, 0xe699ac, 0xe699bb,
+ /* a4 */ 0xe69a80, 0xe699b1, 0xe699b9, 0xe699aa,
+ /* a8 */ 0xe699b2, 0xe69c81, 0xe6a48c, 0xe6a393,
+ /* ac */ 0xe6a484, 0xe6a39c, 0xe6a4aa, 0xe6a3ac,
+ /* b0 */ 0xe6a3aa, 0xe6a3b1, 0xe6a48f, 0xe6a396,
+ /* b4 */ 0xe6a3b7, 0xe6a3ab, 0xe6a3a4, 0xe6a3b6,
+ /* b8 */ 0xe6a493, 0xe6a490, 0xe6a3b3, 0xe6a3a1,
+ /* bc */ 0xe6a487, 0xe6a38c, 0xe6a488, 0xe6a5b0,
+ /* c0 */ 0xe6a2b4, 0xe6a491, 0xe6a3af, 0xe6a386,
+ /* c4 */ 0xe6a494, 0xe6a3b8, 0xe6a390, 0xe6a3bd,
+ /* c8 */ 0xe6a3bc, 0xe6a3a8, 0xe6a48b, 0xe6a48a,
+ /* cc */ 0xe6a497, 0xe6a38e, 0xe6a388, 0xe6a39d,
+ /* d0 */ 0xe6a39e, 0xe6a3a6, 0xe6a3b4, 0xe6a391,
+ /* d4 */ 0xe6a486, 0xe6a394, 0xe6a3a9, 0xe6a495,
+ /* d8 */ 0xe6a4a5, 0xe6a387, 0xe6acb9, 0xe6acbb,
+ /* dc */ 0xe6acbf, 0xe6acbc, 0xe6ae94, 0xe6ae97,
+ /* e0 */ 0xe6ae99, 0xe6ae95, 0xe6aebd, 0xe6afb0,
+ /* e4 */ 0xe6afb2, 0xe6afb3, 0xe6b0b0, 0xe6b7bc,
+ /* e8 */ 0xe6b986, 0xe6b987, 0xe6b89f, 0xe6b989,
+ /* ec */ 0xe6ba88, 0xe6b8bc, 0xe6b8bd, 0xe6b985,
+ /* f0 */ 0xe6b9a2, 0xe6b8ab, 0xe6b8bf, 0xe6b981,
+ /* f4 */ 0xe6b99d, 0xe6b9b3, 0xe6b89c, 0xe6b8b3,
+ /* f8 */ 0xe6b98b, 0xe6b980, 0xe6b991, 0xe6b8bb,
+ /* fc */ 0xe6b883, 0xe6b8ae, 0xe6b99e,
+
+ /*** Two byte table, leaf: daxx - offset 0x02ae0 ***/
+
+ /* 40 */ 0xe6b9a8, 0xe6b99c, 0xe6b9a1, 0xe6b8b1,
+ /* 44 */ 0xe6b8a8, 0xe6b9a0, 0xe6b9b1, 0xe6b9ab,
+ /* 48 */ 0xe6b8b9, 0xe6b8a2, 0xe6b8b0, 0xe6b993,
+ /* 4c */ 0xe6b9a5, 0xe6b8a7, 0xe6b9b8, 0xe6b9a4,
+ /* 50 */ 0xe6b9b7, 0xe6b995, 0xe6b9b9, 0xe6b992,
+ /* 54 */ 0xe6b9a6, 0xe6b8b5, 0xe6b8b6, 0xe6b99a,
+ /* 58 */ 0xe784a0, 0xe7849e, 0xe784af, 0xe783bb,
+ /* 5c */ 0xe784ae, 0xe784b1, 0xe784a3, 0xe784a5,
+ /* 60 */ 0xe784a2, 0xe784b2, 0xe7849f, 0xe784a8,
+ /* 64 */ 0xe784ba, 0xe7849b, 0xe7898b, 0xe7899a,
+ /* 68 */ 0xe78a88, 0xe78a89, 0xe78a86, 0xe78a85,
+ /* 6c */ 0xe78a8b, 0xe78c92, 0xe78c8b, 0xe78cb0,
+ /* 70 */ 0xe78ca2, 0xe78cb1, 0xe78cb3, 0xe78ca7,
+ /* 74 */ 0xe78cb2, 0xe78cad, 0xe78ca6, 0xe78ca3,
+ /* 78 */ 0xe78cb5, 0xe78c8c, 0xe790ae, 0xe790ac,
+ /* 7c */ 0xe790b0, 0xe790ab, 0xe79096, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7909a, 0xe790a1, 0xe790ad,
+ /* a4 */ 0xe790b1, 0xe790a4, 0xe790a3, 0xe7909d,
+ /* a8 */ 0xe790a9, 0xe790a0, 0xe790b2, 0xe793bb,
+ /* ac */ 0xe794af, 0xe795af, 0xe795ac, 0xe797a7,
+ /* b0 */ 0xe7979a, 0xe797a1, 0xe797a6, 0xe7979d,
+ /* b4 */ 0xe7979f, 0xe797a4, 0xe79797, 0xe79a95,
+ /* b8 */ 0xe79a92, 0xe79b9a, 0xe79d86, 0xe79d87,
+ /* bc */ 0xe79d84, 0xe79d8d, 0xe79d85, 0xe79d8a,
+ /* c0 */ 0xe79d8e, 0xe79d8b, 0xe79d8c, 0xe79f9e,
+ /* c4 */ 0xe79fac, 0xe7a1a0, 0xe7a1a4, 0xe7a1a5,
+ /* c8 */ 0xe7a19c, 0xe7a1ad, 0xe7a1b1, 0xe7a1aa,
+ /* cc */ 0xe7a1ae, 0xe7a1b0, 0xe7a1a9, 0xe7a1a8,
+ /* d0 */ 0xe7a19e, 0xe7a1a2, 0xe7a5b4, 0xe7a5b3,
+ /* d4 */ 0xe7a5b2, 0xe7a5b0, 0xe7a882, 0xe7a88a,
+ /* d8 */ 0xe7a883, 0xe7a88c, 0xe7a884, 0xe7aa99,
+ /* dc */ 0xe7aba6, 0xe7aba4, 0xe7ad8a, 0xe7acbb,
+ /* e0 */ 0xe7ad84, 0xe7ad88, 0xe7ad8c, 0xe7ad8e,
+ /* e4 */ 0xe7ad80, 0xe7ad98, 0xe7ad85, 0xe7b2a2,
+ /* e8 */ 0xe7b29e, 0xe7b2a8, 0xe7b2a1, 0xe7b598,
+ /* ec */ 0xe7b5af, 0xe7b5a3, 0xe7b593, 0xe7b596,
+ /* f0 */ 0xe7b5a7, 0xe7b5aa, 0xe7b58f, 0xe7b5ad,
+ /* f4 */ 0xe7b59c, 0xe7b5ab, 0xe7b592, 0xe7b594,
+ /* f8 */ 0xe7b5a9, 0xe7b591, 0xe7b59f, 0xe7b58e,
+ /* fc */ 0xe7bcbe, 0xe7bcbf, 0xe7bda5,
+
+ /*** Two byte table, leaf: dbxx - offset 0x02b9f ***/
+
+ /* 40 */ 0xe7bda6, 0xe7bea2, 0xe7bea0, 0xe7bea1,
+ /* 44 */ 0xe7bf97, 0xe88191, 0xe8818f, 0xe88190,
+ /* 48 */ 0xe883be, 0xe88394, 0xe88583, 0xe8858a,
+ /* 4c */ 0xe88592, 0xe8858f, 0xe88587, 0xe884bd,
+ /* 50 */ 0xe8858d, 0xe884ba, 0xe887a6, 0xe887ae,
+ /* 54 */ 0xe887b7, 0xe887b8, 0xe887b9, 0xe88884,
+ /* 58 */ 0xe888bc, 0xe888bd, 0xe888bf, 0xe889b5,
+ /* 5c */ 0xe88cbb, 0xe88f8f, 0xe88fb9, 0xe890a3,
+ /* 60 */ 0xe88f80, 0xe88fa8, 0xe89092, 0xe88fa7,
+ /* 64 */ 0xe88fa4, 0xe88fbc, 0xe88fb6, 0xe89090,
+ /* 68 */ 0xe88f86, 0xe88f88, 0xe88fab, 0xe88fa3,
+ /* 6c */ 0xe88ebf, 0xe89081, 0xe88f9d, 0xe88fa5,
+ /* 70 */ 0xe88f98, 0xe88fbf, 0xe88fa1, 0xe88f8b,
+ /* 74 */ 0xe88f8e, 0xe88f96, 0xe88fb5, 0xe88f89,
+ /* 78 */ 0xe89089, 0xe8908f, 0xe88f9e, 0xe89091,
+ /* 7c */ 0xe89086, 0xe88f82, 0xe88fb3, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88f95, 0xe88fba, 0xe88f87,
+ /* a4 */ 0xe88f91, 0xe88faa, 0xe89093, 0xe88f83,
+ /* a8 */ 0xe88fac, 0xe88fae, 0xe88f84, 0xe88fbb,
+ /* ac */ 0xe88f97, 0xe88fa2, 0xe8909b, 0xe88f9b,
+ /* b0 */ 0xe88fbe, 0xe89b98, 0xe89ba2, 0xe89ba6,
+ /* b4 */ 0xe89b93, 0xe89ba3, 0xe89b9a, 0xe89baa,
+ /* b8 */ 0xe89b9d, 0xe89bab, 0xe89b9c, 0xe89bac,
+ /* bc */ 0xe89ba9, 0xe89b97, 0xe89ba8, 0xe89b91,
+ /* c0 */ 0xe8a188, 0xe8a196, 0xe8a195, 0xe8a2ba,
+ /* c4 */ 0xe8a397, 0xe8a2b9, 0xe8a2b8, 0xe8a380,
+ /* c8 */ 0xe8a2be, 0xe8a2b6, 0xe8a2bc, 0xe8a2b7,
+ /* cc */ 0xe8a2bd, 0xe8a2b2, 0xe8a481, 0xe8a389,
+ /* d0 */ 0xe8a695, 0xe8a698, 0xe8a697, 0xe8a79d,
+ /* d4 */ 0xe8a79a, 0xe8a79b, 0xe8a98e, 0xe8a98d,
+ /* d8 */ 0xe8a8b9, 0xe8a999, 0xe8a980, 0xe8a997,
+ /* dc */ 0xe8a998, 0xe8a984, 0xe8a985, 0xe8a992,
+ /* e0 */ 0xe8a988, 0xe8a991, 0xe8a98a, 0xe8a98c,
+ /* e4 */ 0xe8a98f, 0xe8b19f, 0xe8b281, 0xe8b280,
+ /* e8 */ 0xe8b2ba, 0xe8b2be, 0xe8b2b0, 0xe8b2b9,
+ /* ec */ 0xe8b2b5, 0xe8b684, 0xe8b680, 0xe8b689,
+ /* f0 */ 0xe8b798, 0xe8b793, 0xe8b78d, 0xe8b787,
+ /* f4 */ 0xe8b796, 0xe8b79c, 0xe8b78f, 0xe8b795,
+ /* f8 */ 0xe8b799, 0xe8b788, 0xe8b797, 0xe8b785,
+ /* fc */ 0xe8bbaf, 0xe8bbb7, 0xe8bbba,
+
+ /*** Two byte table, leaf: dcxx - offset 0x02c5e ***/
+
+ /* 40 */ 0xe8bbb9, 0xe8bba6, 0xe8bbae, 0xe8bba5,
+ /* 44 */ 0xe8bbb5, 0xe8bba7, 0xe8bba8, 0xe8bbb6,
+ /* 48 */ 0xe8bbab, 0xe8bbb1, 0xe8bbac, 0xe8bbb4,
+ /* 4c */ 0xe8bba9, 0xe980ad, 0xe980b4, 0xe980af,
+ /* 50 */ 0xe98486, 0xe984ac, 0xe98484, 0xe983bf,
+ /* 54 */ 0xe983bc, 0xe98488, 0xe983b9, 0xe983bb,
+ /* 58 */ 0xe98481, 0xe98480, 0xe98487, 0xe98485,
+ /* 5c */ 0xe98483, 0xe985a1, 0xe985a4, 0xe9859f,
+ /* 60 */ 0xe985a2, 0xe985a0, 0xe98881, 0xe9888a,
+ /* 64 */ 0xe988a5, 0xe98883, 0xe9889a, 0xe988a6,
+ /* 68 */ 0xe9888f, 0xe9888c, 0xe98880, 0xe98892,
+ /* 6c */ 0xe987bf, 0xe987bd, 0xe98886, 0xe98884,
+ /* 70 */ 0xe988a7, 0xe98882, 0xe9889c, 0xe988a4,
+ /* 74 */ 0xe98899, 0xe98897, 0xe98885, 0xe98896,
+ /* 78 */ 0xe995bb, 0xe9968d, 0xe9968c, 0xe99690,
+ /* 7c */ 0xe99a87, 0xe999be, 0xe99a88, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe99a89, 0xe99a83, 0xe99a80,
+ /* a4 */ 0xe99b82, 0xe99b88, 0xe99b83, 0xe99bb1,
+ /* a8 */ 0xe99bb0, 0xe99dac, 0xe99db0, 0xe99dae,
+ /* ac */ 0xe9a087, 0xe9a2a9, 0xe9a3ab, 0xe9b3a6,
+ /* b0 */ 0xe9bbb9, 0xe4ba83, 0xe4ba84, 0xe4bab6,
+ /* b4 */ 0xe582bd, 0xe582bf, 0xe58386, 0xe582ae,
+ /* b8 */ 0xe58384, 0xe5838a, 0xe582b4, 0xe58388,
+ /* bc */ 0xe58382, 0xe582b0, 0xe58381, 0xe582ba,
+ /* c0 */ 0xe582b1, 0xe5838b, 0xe58389, 0xe582b6,
+ /* c4 */ 0xe582b8, 0xe58797, 0xe589ba, 0xe589b8,
+ /* c8 */ 0xe589bb, 0xe589bc, 0xe59783, 0xe5979b,
+ /* cc */ 0xe5978c, 0xe59790, 0xe5978b, 0xe5978a,
+ /* d0 */ 0xe5979d, 0xe59780, 0xe59794, 0xe59784,
+ /* d4 */ 0xe597a9, 0xe596bf, 0xe59792, 0xe5968d,
+ /* d8 */ 0xe5978f, 0xe59795, 0xe597a2, 0xe59796,
+ /* dc */ 0xe59788, 0xe597b2, 0xe5978d, 0xe59799,
+ /* e0 */ 0xe59782, 0xe59c94, 0xe5a193, 0xe5a1a8,
+ /* e4 */ 0xe5a1a4, 0xe5a18f, 0xe5a18d, 0xe5a189,
+ /* e8 */ 0xe5a1af, 0xe5a195, 0xe5a18e, 0xe5a19d,
+ /* ec */ 0xe5a199, 0xe5a1a5, 0xe5a19b, 0xe5a0bd,
+ /* f0 */ 0xe5a1a3, 0xe5a1b1, 0xe5a3bc, 0xe5ab87,
+ /* f4 */ 0xe5ab84, 0xe5ab8b, 0xe5aaba, 0xe5aab8,
+ /* f8 */ 0xe5aab1, 0xe5aab5, 0xe5aab0, 0xe5aabf,
+ /* fc */ 0xe5ab88, 0xe5aabb, 0xe5ab86,
+
+ /*** Two byte table, leaf: ddxx - offset 0x02d1d ***/
+
+ /* 40 */ 0xe5aab7, 0xe5ab80, 0xe5ab8a, 0xe5aab4,
+ /* 44 */ 0xe5aab6, 0xe5ab8d, 0xe5aab9, 0xe5aa90,
+ /* 48 */ 0xe5af96, 0xe5af98, 0xe5af99, 0xe5b09f,
+ /* 4c */ 0xe5b0b3, 0xe5b5b1, 0xe5b5a3, 0xe5b58a,
+ /* 50 */ 0xe5b5a5, 0xe5b5b2, 0xe5b5ac, 0xe5b59e,
+ /* 54 */ 0xe5b5a8, 0xe5b5a7, 0xe5b5a2, 0xe5b7b0,
+ /* 58 */ 0xe5b98f, 0xe5b98e, 0xe5b98a, 0xe5b98d,
+ /* 5c */ 0xe5b98b, 0xe5bb85, 0xe5bb8c, 0xe5bb86,
+ /* 60 */ 0xe5bb8b, 0xe5bb87, 0xe5bd80, 0xe5beaf,
+ /* 64 */ 0xe5bead, 0xe683b7, 0xe68589, 0xe6858a,
+ /* 68 */ 0xe684ab, 0xe68585, 0xe684b6, 0xe684b2,
+ /* 6c */ 0xe684ae, 0xe68586, 0xe684af, 0xe6858f,
+ /* 70 */ 0xe684a9, 0xe68580, 0xe688a0, 0xe985a8,
+ /* 74 */ 0xe688a3, 0xe688a5, 0xe688a4, 0xe68f85,
+ /* 78 */ 0xe68fb1, 0xe68fab, 0xe69090, 0xe69092,
+ /* 7c */ 0xe69089, 0xe690a0, 0xe690a4, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe690b3, 0xe69183, 0xe6909f,
+ /* a4 */ 0xe69095, 0xe69098, 0xe690b9, 0xe690b7,
+ /* a8 */ 0xe690a2, 0xe690a3, 0xe6908c, 0xe690a6,
+ /* ac */ 0xe690b0, 0xe690a8, 0xe69181, 0xe690b5,
+ /* b0 */ 0xe690af, 0xe6908a, 0xe6909a, 0xe69180,
+ /* b4 */ 0xe690a5, 0xe690a7, 0xe6908b, 0xe68fa7,
+ /* b8 */ 0xe6909b, 0xe690ae, 0xe690a1, 0xe6908e,
+ /* bc */ 0xe695af, 0xe69692, 0xe69793, 0xe69a86,
+ /* c0 */ 0xe69a8c, 0xe69a95, 0xe69a90, 0xe69a8b,
+ /* c4 */ 0xe69a8a, 0xe69a99, 0xe69a94, 0xe699b8,
+ /* c8 */ 0xe69ca0, 0xe6a5a6, 0xe6a59f, 0xe6a4b8,
+ /* cc */ 0xe6a58e, 0xe6a5a2, 0xe6a5b1, 0xe6a4bf,
+ /* d0 */ 0xe6a585, 0xe6a5aa, 0xe6a4b9, 0xe6a582,
+ /* d4 */ 0xe6a597, 0xe6a599, 0xe6a5ba, 0xe6a588,
+ /* d8 */ 0xe6a589, 0xe6a4b5, 0xe6a5ac, 0xe6a4b3,
+ /* dc */ 0xe6a4bd, 0xe6a5a5, 0xe6a3b0, 0xe6a5b8,
+ /* e0 */ 0xe6a4b4, 0xe6a5a9, 0xe6a580, 0xe6a5af,
+ /* e4 */ 0xe6a584, 0xe6a5b6, 0xe6a598, 0xe6a581,
+ /* e8 */ 0xe6a5b4, 0xe6a58c, 0xe6a4bb, 0xe6a58b,
+ /* ec */ 0xe6a4b7, 0xe6a59c, 0xe6a58f, 0xe6a591,
+ /* f0 */ 0xe6a4b2, 0xe6a592, 0xe6a4af, 0xe6a5bb,
+ /* f4 */ 0xe6a4bc, 0xe6ad86, 0xe6ad85, 0xe6ad83,
+ /* f8 */ 0xe6ad82, 0xe6ad88, 0xe6ad81, 0xe6ae9b,
+ /* fc */ 0xefa88d, 0xe6afbb, 0xe6afbc,
+
+ /*** Two byte table, leaf: dexx - offset 0x02ddc ***/
+
+ /* 40 */ 0xe6afb9, 0xe6afb7, 0xe6afb8, 0xe6ba9b,
+ /* 44 */ 0xe6bb96, 0xe6bb88, 0xe6ba8f, 0xe6bb80,
+ /* 48 */ 0xe6ba9f, 0xe6ba93, 0xe6ba94, 0xe6baa0,
+ /* 4c */ 0xe6bab1, 0xe6bab9, 0xe6bb86, 0xe6bb92,
+ /* 50 */ 0xe6babd, 0xe6bb81, 0xe6ba9e, 0xe6bb89,
+ /* 54 */ 0xe6bab7, 0xe6bab0, 0xe6bb8d, 0xe6baa6,
+ /* 58 */ 0xe6bb8f, 0xe6bab2, 0xe6babe, 0xe6bb83,
+ /* 5c */ 0xe6bb9c, 0xe6bb98, 0xe6ba99, 0xe6ba92,
+ /* 60 */ 0xe6ba8e, 0xe6ba8d, 0xe6baa4, 0xe6baa1,
+ /* 64 */ 0xe6babf, 0xe6bab3, 0xe6bb90, 0xe6bb8a,
+ /* 68 */ 0xe6ba97, 0xe6baae, 0xe6baa3, 0xe78587,
+ /* 6c */ 0xe78594, 0xe78592, 0xe785a3, 0xe785a0,
+ /* 70 */ 0xe78581, 0xe7859d, 0xe785a2, 0xe785b2,
+ /* 74 */ 0xe785b8, 0xe785aa, 0xe785a1, 0xe78582,
+ /* 78 */ 0xe78598, 0xe78583, 0xe7858b, 0xe785b0,
+ /* 7c */ 0xe7859f, 0xe78590, 0xe78593, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe78584, 0xe7858d, 0xe7859a,
+ /* a4 */ 0xe7898f, 0xe78a8d, 0xe78a8c, 0xe78a91,
+ /* a8 */ 0xe78a90, 0xe78a8e, 0xe78cbc, 0xe78d82,
+ /* ac */ 0xe78cbb, 0xe78cba, 0xe78d80, 0xe78d8a,
+ /* b0 */ 0xe78d89, 0xe79184, 0xe7918a, 0xe7918b,
+ /* b4 */ 0xe79192, 0xe79191, 0xe79197, 0xe79180,
+ /* b8 */ 0xe7918f, 0xe79190, 0xe7918e, 0xe79182,
+ /* bc */ 0xe79186, 0xe7918d, 0xe79194, 0xe793a1,
+ /* c0 */ 0xe793bf, 0xe793be, 0xe793bd, 0xe7949d,
+ /* c4 */ 0xe795b9, 0xe795b7, 0xe6a683, 0xe797af,
+ /* c8 */ 0xe7988f, 0xe79883, 0xe797b7, 0xe797be,
+ /* cc */ 0xe797bc, 0xe797b9, 0xe797b8, 0xe79890,
+ /* d0 */ 0xe797bb, 0xe797b6, 0xe797ad, 0xe797b5,
+ /* d4 */ 0xe797bd, 0xe79a99, 0xe79ab5, 0xe79b9d,
+ /* d8 */ 0xe79d95, 0xe79d9f, 0xe79da0, 0xe79d92,
+ /* dc */ 0xe79d96, 0xe79d9a, 0xe79da9, 0xe79da7,
+ /* e0 */ 0xe79d94, 0xe79d99, 0xe79dad, 0xe79fa0,
+ /* e4 */ 0xe7a287, 0xe7a29a, 0xe7a294, 0xe7a28f,
+ /* e8 */ 0xe7a284, 0xe7a295, 0xe7a285, 0xe7a286,
+ /* ec */ 0xe7a2a1, 0xe7a283, 0xe7a1b9, 0xe7a299,
+ /* f0 */ 0xe7a280, 0xe7a296, 0xe7a1bb, 0xe7a5bc,
+ /* f4 */ 0xe7a682, 0xe7a5bd, 0xe7a5b9, 0xe7a891,
+ /* f8 */ 0xe7a898, 0xe7a899, 0xe7a892, 0xe7a897,
+ /* fc */ 0xe7a895, 0xe7a8a2, 0xe7a893,
+
+ /*** Two byte table, leaf: dfxx - offset 0x02e9b ***/
+
+ /* 40 */ 0xe7a89b, 0xe7a890, 0xe7aaa3, 0xe7aaa2,
+ /* 44 */ 0xe7aa9e, 0xe7abab, 0xe7ada6, 0xe7ada4,
+ /* 48 */ 0xe7adad, 0xe7adb4, 0xe7ada9, 0xe7adb2,
+ /* 4c */ 0xe7ada5, 0xe7adb3, 0xe7adb1, 0xe7adb0,
+ /* 50 */ 0xe7ada1, 0xe7adb8, 0xe7adb6, 0xe7ada3,
+ /* 54 */ 0xe7b2b2, 0xe7b2b4, 0xe7b2af, 0xe7b688,
+ /* 58 */ 0xe7b686, 0xe7b680, 0xe7b68d, 0xe7b5bf,
+ /* 5c */ 0xe7b685, 0xe7b5ba, 0xe7b68e, 0xe7b5bb,
+ /* 60 */ 0xe7b683, 0xe7b5bc, 0xe7b68c, 0xe7b694,
+ /* 64 */ 0xe7b684, 0xe7b5bd, 0xe7b692, 0xe7bdad,
+ /* 68 */ 0xe7bdab, 0xe7bda7, 0xe7bda8, 0xe7bdac,
+ /* 6c */ 0xe7bea6, 0xe7bea5, 0xe7bea7, 0xe7bf9b,
+ /* 70 */ 0xe7bf9c, 0xe880a1, 0xe885a4, 0xe885a0,
+ /* 74 */ 0xe885b7, 0xe8859c, 0xe885a9, 0xe8859b,
+ /* 78 */ 0xe885a2, 0xe885b2, 0xe69ca1, 0xe8859e,
+ /* 7c */ 0xe885b6, 0xe885a7, 0xe885af, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88584, 0xe885a1, 0xe8889d,
+ /* a4 */ 0xe88989, 0xe88984, 0xe88980, 0xe88982,
+ /* a8 */ 0xe88985, 0xe893b1, 0xe890bf, 0xe89196,
+ /* ac */ 0xe891b6, 0xe891b9, 0xe8928f, 0xe8928d,
+ /* b0 */ 0xe891a5, 0xe89191, 0xe89180, 0xe89286,
+ /* b4 */ 0xe891a7, 0xe890b0, 0xe8918d, 0xe891bd,
+ /* b8 */ 0xe8919a, 0xe89199, 0xe891b4, 0xe891b3,
+ /* bc */ 0xe8919d, 0xe89487, 0xe8919e, 0xe890b7,
+ /* c0 */ 0xe890ba, 0xe890b4, 0xe891ba, 0xe89183,
+ /* c4 */ 0xe891b8, 0xe890b2, 0xe89185, 0xe890a9,
+ /* c8 */ 0xe88f99, 0xe8918b, 0xe890af, 0xe89182,
+ /* cc */ 0xe890ad, 0xe8919f, 0xe891b0, 0xe890b9,
+ /* d0 */ 0xe8918e, 0xe8918c, 0xe89192, 0xe891af,
+ /* d4 */ 0xe89385, 0xe8928e, 0xe890bb, 0xe89187,
+ /* d8 */ 0xe890b6, 0xe890b3, 0xe891a8, 0xe891be,
+ /* dc */ 0xe89184, 0xe890ab, 0xe891a0, 0xe89194,
+ /* e0 */ 0xe891ae, 0xe89190, 0xe89c8b, 0xe89c84,
+ /* e4 */ 0xe89bb7, 0xe89c8c, 0xe89bba, 0xe89b96,
+ /* e8 */ 0xe89bb5, 0xe89d8d, 0xe89bb8, 0xe89c8e,
+ /* ec */ 0xe89c89, 0xe89c81, 0xe89bb6, 0xe89c8d,
+ /* f0 */ 0xe89c85, 0xe8a396, 0xe8a38b, 0xe8a38d,
+ /* f4 */ 0xe8a38e, 0xe8a39e, 0xe8a39b, 0xe8a39a,
+ /* f8 */ 0xe8a38c, 0xe8a390, 0xe8a685, 0xe8a69b,
+ /* fc */ 0xe8a79f, 0xe8a7a5, 0xe8a7a4,
+
+ /*** Two byte table, leaf: e0xx - offset 0x02f5a ***/
+
+ /* 40 */ 0xe8a7a1, 0xe8a7a0, 0xe8a7a2, 0xe8a79c,
+ /* 44 */ 0xe8a7a6, 0xe8a9b6, 0xe8aa86, 0xe8a9bf,
+ /* 48 */ 0xe8a9a1, 0xe8a8bf, 0xe8a9b7, 0xe8aa82,
+ /* 4c */ 0xe8aa84, 0xe8a9b5, 0xe8aa83, 0xe8aa81,
+ /* 50 */ 0xe8a9b4, 0xe8a9ba, 0xe8b0bc, 0xe8b18b,
+ /* 54 */ 0xe8b18a, 0xe8b1a5, 0xe8b1a4, 0xe8b1a6,
+ /* 58 */ 0xe8b286, 0xe8b284, 0xe8b285, 0xe8b38c,
+ /* 5c */ 0xe8b5a8, 0xe8b5a9, 0xe8b691, 0xe8b68c,
+ /* 60 */ 0xe8b68e, 0xe8b68f, 0xe8b68d, 0xe8b693,
+ /* 64 */ 0xe8b694, 0xe8b690, 0xe8b692, 0xe8b7b0,
+ /* 68 */ 0xe8b7a0, 0xe8b7ac, 0xe8b7b1, 0xe8b7ae,
+ /* 6c */ 0xe8b790, 0xe8b7a9, 0xe8b7a3, 0xe8b7a2,
+ /* 70 */ 0xe8b7a7, 0xe8b7b2, 0xe8b7ab, 0xe8b7b4,
+ /* 74 */ 0xe8bc86, 0xe8bbbf, 0xe8bc81, 0xe8bc80,
+ /* 78 */ 0xe8bc85, 0xe8bc87, 0xe8bc88, 0xe8bc82,
+ /* 7c */ 0xe8bc8b, 0xe98192, 0xe980bf, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe98184, 0xe98189, 0xe980bd,
+ /* a4 */ 0xe98490, 0xe9848d, 0xe9848f, 0xe98491,
+ /* a8 */ 0xe98496, 0xe98494, 0xe9848b, 0xe9848e,
+ /* ac */ 0xe985ae, 0xe985af, 0xe98988, 0xe98992,
+ /* b0 */ 0xe988b0, 0xe988ba, 0xe989a6, 0xe988b3,
+ /* b4 */ 0xe989a5, 0xe9899e, 0xe98a83, 0xe988ae,
+ /* b8 */ 0xe9898a, 0xe98986, 0xe989ad, 0xe989ac,
+ /* bc */ 0xe9898f, 0xe989a0, 0xe989a7, 0xe989af,
+ /* c0 */ 0xe988b6, 0xe989a1, 0xe989b0, 0xe988b1,
+ /* c4 */ 0xe98994, 0xe989a3, 0xe98990, 0xe989b2,
+ /* c8 */ 0xe9898e, 0xe98993, 0xe9898c, 0xe98996,
+ /* cc */ 0xe988b2, 0xe9969f, 0xe9969c, 0xe9969e,
+ /* d0 */ 0xe9969b, 0xe99a92, 0xe99a93, 0xe99a91,
+ /* d4 */ 0xe99a97, 0xe99b8e, 0xe99bba, 0xe99bbd,
+ /* d8 */ 0xe99bb8, 0xe99bb5, 0xe99db3, 0xe99db7,
+ /* dc */ 0xe99db8, 0xe99db2, 0xe9a08f, 0xe9a08d,
+ /* e0 */ 0xe9a08e, 0xe9a2ac, 0xe9a3b6, 0xe9a3b9,
+ /* e4 */ 0xe9a6af, 0xe9a6b2, 0xe9a6b0, 0xe9a6b5,
+ /* e8 */ 0xe9aaad, 0xe9aaab, 0xe9ad9b, 0xe9b3aa,
+ /* ec */ 0xe9b3ad, 0xe9b3a7, 0xe9ba80, 0xe9bbbd,
+ /* f0 */ 0xe583a6, 0xe58394, 0xe58397, 0xe583a8,
+ /* f4 */ 0xe583b3, 0xe5839b, 0xe583aa, 0xe5839d,
+ /* f8 */ 0xe583a4, 0xe58393, 0xe583ac, 0xe583b0,
+ /* fc */ 0xe583af, 0xe583a3, 0xe583a0,
+
+ /*** Two byte table, leaf: e1xx - offset 0x03019 ***/
+
+ /* 40 */ 0xe58798, 0xe58a80, 0xe58a81, 0xe58ba9,
+ /* 44 */ 0xe58bab, 0xe58cb0, 0xe58eac, 0xe598a7,
+ /* 48 */ 0xe59895, 0xe5988c, 0xe59892, 0xe597bc,
+ /* 4c */ 0xe5988f, 0xe5989c, 0xe59881, 0xe59893,
+ /* 50 */ 0xe59882, 0xe597ba, 0xe5989d, 0xe59884,
+ /* 54 */ 0xe597bf, 0xe597b9, 0xe5a289, 0xe5a1bc,
+ /* 58 */ 0xe5a290, 0xe5a298, 0xe5a286, 0xe5a281,
+ /* 5c */ 0xe5a1bf, 0xe5a1b4, 0xe5a28b, 0xe5a1ba,
+ /* 60 */ 0xe5a287, 0xe5a291, 0xe5a28e, 0xe5a1b6,
+ /* 64 */ 0xe5a282, 0xe5a288, 0xe5a1bb, 0xe5a294,
+ /* 68 */ 0xe5a28f, 0xe5a3be, 0xe5a5ab, 0xe5ab9c,
+ /* 6c */ 0xe5abae, 0xe5aba5, 0xe5ab95, 0xe5abaa,
+ /* 70 */ 0xe5ab9a, 0xe5abad, 0xe5abab, 0xe5abb3,
+ /* 74 */ 0xe5aba2, 0xe5aba0, 0xe5ab9b, 0xe5abac,
+ /* 78 */ 0xe5ab9e, 0xe5ab9d, 0xe5ab99, 0xe5aba8,
+ /* 7c */ 0xe5ab9f, 0xe5adb7, 0xe5afa0, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe5afa3, 0xe5b1a3, 0xe5b682,
+ /* a4 */ 0xe5b680, 0xe5b5bd, 0xe5b686, 0xe5b5ba,
+ /* a8 */ 0xe5b681, 0xe5b5b7, 0xe5b68a, 0xe5b689,
+ /* ac */ 0xe5b688, 0xe5b5be, 0xe5b5bc, 0xe5b68d,
+ /* b0 */ 0xe5b5b9, 0xe5b5bf, 0xe5b998, 0xe5b999,
+ /* b4 */ 0xe5b993, 0xe5bb98, 0xe5bb91, 0xe5bb97,
+ /* b8 */ 0xe5bb8e, 0xe5bb9c, 0xe5bb95, 0xe5bb99,
+ /* bc */ 0xe5bb92, 0xe5bb94, 0xe5bd84, 0xe5bd83,
+ /* c0 */ 0xe5bdaf, 0xe5beb6, 0xe684ac, 0xe684a8,
+ /* c4 */ 0xe68581, 0xe6859e, 0xe685b1, 0xe685b3,
+ /* c8 */ 0xe68592, 0xe68593, 0xe685b2, 0xe685ac,
+ /* cc */ 0xe68680, 0xe685b4, 0xe68594, 0xe685ba,
+ /* d0 */ 0xe6859b, 0xe685a5, 0xe684bb, 0xe685aa,
+ /* d4 */ 0xe685a1, 0xe68596, 0xe688a9, 0xe688a7,
+ /* d8 */ 0xe688ab, 0xe690ab, 0xe6918d, 0xe6919b,
+ /* dc */ 0xe6919d, 0xe691b4, 0xe691b6, 0xe691b2,
+ /* e0 */ 0xe691b3, 0xe691bd, 0xe691b5, 0xe691a6,
+ /* e4 */ 0xe692a6, 0xe6918e, 0xe69282, 0xe6919e,
+ /* e8 */ 0xe6919c, 0xe6918b, 0xe69193, 0xe691a0,
+ /* ec */ 0xe69190, 0xe691bf, 0xe690bf, 0xe691ac,
+ /* f0 */ 0xe691ab, 0xe69199, 0xe691a5, 0xe691b7,
+ /* f4 */ 0xe695b3, 0xe696a0, 0xe69aa1, 0xe69aa0,
+ /* f8 */ 0xe69a9f, 0xe69c85, 0xe69c84, 0xe69ca2,
+ /* fc */ 0xe6a6b1, 0xe6a6b6, 0xe6a789,
+
+ /*** Two byte table, leaf: e2xx - offset 0x030d8 ***/
+
+ /* 40 */ 0xe6a6a0, 0xe6a78e, 0xe6a696, 0xe6a6b0,
+ /* 44 */ 0xe6a6ac, 0xe6a6bc, 0xe6a691, 0xe6a699,
+ /* 48 */ 0xe6a68e, 0xe6a6a7, 0xe6a68d, 0xe6a6a9,
+ /* 4c */ 0xe6a6be, 0xe6a6af, 0xe6a6bf, 0xe6a784,
+ /* 50 */ 0xe6a6bd, 0xe6a6a4, 0xe6a794, 0xe6a6b9,
+ /* 54 */ 0xe6a78a, 0xe6a69a, 0xe6a78f, 0xe6a6b3,
+ /* 58 */ 0xe6a693, 0xe6a6aa, 0xe6a6a1, 0xe6a69e,
+ /* 5c */ 0xe6a799, 0xe6a697, 0xe6a690, 0xe6a782,
+ /* 60 */ 0xe6a6b5, 0xe6a6a5, 0xe6a786, 0xe6ad8a,
+ /* 64 */ 0xe6ad8d, 0xe6ad8b, 0xe6ae9e, 0xe6ae9f,
+ /* 68 */ 0xe6aea0, 0xe6af83, 0xe6af84, 0xe6afbe,
+ /* 6c */ 0xe6bb8e, 0xe6bbb5, 0xe6bbb1, 0xe6bc83,
+ /* 70 */ 0xe6bca5, 0xe6bbb8, 0xe6bcb7, 0xe6bbbb,
+ /* 74 */ 0xe6bcae, 0xe6bc89, 0xe6bd8e, 0xe6bc99,
+ /* 78 */ 0xe6bc9a, 0xe6bca7, 0xe6bc98, 0xe6bcbb,
+ /* 7c */ 0xe6bc92, 0xe6bbad, 0xe6bc8a, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6bcb6, 0xe6bdb3, 0xe6bbb9,
+ /* a4 */ 0xe6bbae, 0xe6bcad, 0xe6bd80, 0xe6bcb0,
+ /* a8 */ 0xe6bcbc, 0xe6bcb5, 0xe6bbab, 0xe6bc87,
+ /* ac */ 0xe6bc8e, 0xe6bd83, 0xe6bc85, 0xe6bbbd,
+ /* b0 */ 0xe6bbb6, 0xe6bcb9, 0xe6bc9c, 0xe6bbbc,
+ /* b4 */ 0xe6bcba, 0xe6bc9f, 0xe6bc8d, 0xe6bc9e,
+ /* b8 */ 0xe6bc88, 0xe6bca1, 0xe78687, 0xe78690,
+ /* bc */ 0xe78689, 0xe78680, 0xe78685, 0xe78682,
+ /* c0 */ 0xe7868f, 0xe785bb, 0xe78686, 0xe78681,
+ /* c4 */ 0xe78697, 0xe78984, 0xe78993, 0xe78a97,
+ /* c8 */ 0xe78a95, 0xe78a93, 0xe78d83, 0xe78d8d,
+ /* cc */ 0xe78d91, 0xe78d8c, 0xe791a2, 0xe791b3,
+ /* d0 */ 0xe791b1, 0xe791b5, 0xe791b2, 0xe791a7,
+ /* d4 */ 0xe791ae, 0xe79480, 0xe79482, 0xe79483,
+ /* d8 */ 0xe795bd, 0xe79690, 0xe79896, 0xe79888,
+ /* dc */ 0xe7988c, 0xe79895, 0xe79891, 0xe7988a,
+ /* e0 */ 0xe79894, 0xe79ab8, 0xe79e81, 0xe79dbc,
+ /* e4 */ 0xe79e85, 0xe79e82, 0xe79dae, 0xe79e80,
+ /* e8 */ 0xe79daf, 0xe79dbe, 0xe79e83, 0xe7a2b2,
+ /* ec */ 0xe7a2aa, 0xe7a2b4, 0xe7a2ad, 0xe7a2a8,
+ /* f0 */ 0xe7a1be, 0xe7a2ab, 0xe7a29e, 0xe7a2a5,
+ /* f4 */ 0xe7a2a0, 0xe7a2ac, 0xe7a2a2, 0xe7a2a4,
+ /* f8 */ 0xe7a698, 0xe7a68a, 0xe7a68b, 0xe7a696,
+ /* fc */ 0xe7a695, 0xe7a694, 0xe7a693,
+
+ /*** Two byte table, leaf: e3xx - offset 0x03197 ***/
+
+ /* 40 */ 0xe7a697, 0xe7a688, 0xe7a692, 0xe7a690,
+ /* 44 */ 0xe7a8ab, 0xe7a98a, 0xe7a8b0, 0xe7a8af,
+ /* 48 */ 0xe7a8a8, 0xe7a8a6, 0xe7aaa8, 0xe7aaab,
+ /* 4c */ 0xe7aaac, 0xe7abae, 0xe7ae88, 0xe7ae9c,
+ /* 50 */ 0xe7ae8a, 0xe7ae91, 0xe7ae90, 0xe7ae96,
+ /* 54 */ 0xe7ae8d, 0xe7ae8c, 0xe7ae9b, 0xe7ae8e,
+ /* 58 */ 0xe7ae85, 0xe7ae98, 0xe58a84, 0xe7ae99,
+ /* 5c */ 0xe7aea4, 0xe7ae82, 0xe7b2bb, 0xe7b2bf,
+ /* 60 */ 0xe7b2bc, 0xe7b2ba, 0xe7b6a7, 0xe7b6b7,
+ /* 64 */ 0xe7b782, 0xe7b6a3, 0xe7b6aa, 0xe7b781,
+ /* 68 */ 0xe7b780, 0xe7b785, 0xe7b69d, 0xe7b78e,
+ /* 6c */ 0xe7b784, 0xe7b786, 0xe7b78b, 0xe7b78c,
+ /* 70 */ 0xe7b6af, 0xe7b6b9, 0xe7b696, 0xe7b6bc,
+ /* 74 */ 0xe7b69f, 0xe7b6a6, 0xe7b6ae, 0xe7b6a9,
+ /* 78 */ 0xe7b6a1, 0xe7b789, 0xe7bdb3, 0xe7bfa2,
+ /* 7c */ 0xe7bfa3, 0xe7bfa5, 0xe7bf9e, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe880a4, 0xe8819d, 0xe8819c,
+ /* a4 */ 0xe88689, 0xe88686, 0xe88683, 0xe88687,
+ /* a8 */ 0xe8868d, 0xe8868c, 0xe8868b, 0xe88895,
+ /* ac */ 0xe89297, 0xe892a4, 0xe892a1, 0xe8929f,
+ /* b0 */ 0xe892ba, 0xe8938e, 0xe89382, 0xe892ac,
+ /* b4 */ 0xe892ae, 0xe892ab, 0xe892b9, 0xe892b4,
+ /* b8 */ 0xe89381, 0xe8938d, 0xe892aa, 0xe8929a,
+ /* bc */ 0xe892b1, 0xe89390, 0xe8929d, 0xe892a7,
+ /* c0 */ 0xe892bb, 0xe892a2, 0xe89294, 0xe89387,
+ /* c4 */ 0xe8938c, 0xe8929b, 0xe892a9, 0xe892af,
+ /* c8 */ 0xe892a8, 0xe89396, 0xe89298, 0xe892b6,
+ /* cc */ 0xe8938f, 0xe892a0, 0xe89397, 0xe89394,
+ /* d0 */ 0xe89392, 0xe8939b, 0xe892b0, 0xe89291,
+ /* d4 */ 0xe899a1, 0xe89cb3, 0xe89ca3, 0xe89ca8,
+ /* d8 */ 0xe89dab, 0xe89d80, 0xe89cae, 0xe89c9e,
+ /* dc */ 0xe89ca1, 0xe89c99, 0xe89c9b, 0xe89d83,
+ /* e0 */ 0xe89cac, 0xe89d81, 0xe89cbe, 0xe89d86,
+ /* e4 */ 0xe89ca0, 0xe89cb2, 0xe89caa, 0xe89cad,
+ /* e8 */ 0xe89cbc, 0xe89c92, 0xe89cba, 0xe89cb1,
+ /* ec */ 0xe89cb5, 0xe89d82, 0xe89ca6, 0xe89ca7,
+ /* f0 */ 0xe89cb8, 0xe89ca4, 0xe89c9a, 0xe89cb0,
+ /* f4 */ 0xe89c91, 0xe8a3b7, 0xe8a3a7, 0xe8a3b1,
+ /* f8 */ 0xe8a3b2, 0xe8a3ba, 0xe8a3be, 0xe8a3ae,
+ /* fc */ 0xe8a3bc, 0xe8a3b6, 0xe8a3bb,
+
+ /*** Two byte table, leaf: e4xx - offset 0x03256 ***/
+
+ /* 40 */ 0xe8a3b0, 0xe8a3ac, 0xe8a3ab, 0xe8a69d,
+ /* 44 */ 0xe8a6a1, 0xe8a69f, 0xe8a69e, 0xe8a7a9,
+ /* 48 */ 0xe8a7ab, 0xe8a7a8, 0xe8aaab, 0xe8aa99,
+ /* 4c */ 0xe8aa8b, 0xe8aa92, 0xe8aa8f, 0xe8aa96,
+ /* 50 */ 0xe8b0bd, 0xe8b1a8, 0xe8b1a9, 0xe8b395,
+ /* 54 */ 0xe8b38f, 0xe8b397, 0xe8b696, 0xe8b889,
+ /* 58 */ 0xe8b882, 0xe8b7bf, 0xe8b88d, 0xe8b7bd,
+ /* 5c */ 0xe8b88a, 0xe8b883, 0xe8b887, 0xe8b886,
+ /* 60 */ 0xe8b885, 0xe8b7be, 0xe8b880, 0xe8b884,
+ /* 64 */ 0xe8bc90, 0xe8bc91, 0xe8bc8e, 0xe8bc8d,
+ /* 68 */ 0xe984a3, 0xe9849c, 0xe984a0, 0xe984a2,
+ /* 6c */ 0xe9849f, 0xe9849d, 0xe9849a, 0xe984a4,
+ /* 70 */ 0xe984a1, 0xe9849b, 0xe985ba, 0xe985b2,
+ /* 74 */ 0xe985b9, 0xe985b3, 0xe98aa5, 0xe98aa4,
+ /* 78 */ 0xe989b6, 0xe98a9b, 0xe989ba, 0xe98aa0,
+ /* 7c */ 0xe98a94, 0xe98aaa, 0xe98a8d, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe98aa6, 0xe98a9a, 0xe98aab,
+ /* a4 */ 0xe989b9, 0xe98a97, 0xe989bf, 0xe98aa3,
+ /* a8 */ 0xe98bae, 0xe98a8e, 0xe98a82, 0xe98a95,
+ /* ac */ 0xe98aa2, 0xe989bd, 0xe98a88, 0xe98aa1,
+ /* b0 */ 0xe98a8a, 0xe98a86, 0xe98a8c, 0xe98a99,
+ /* b4 */ 0xe98aa7, 0xe989be, 0xe98a87, 0xe98aa9,
+ /* b8 */ 0xe98a9d, 0xe98a8b, 0xe988ad, 0xe99a9e,
+ /* bc */ 0xe99aa1, 0xe99bbf, 0xe99d98, 0xe99dbd,
+ /* c0 */ 0xe99dba, 0xe99dbe, 0xe99e83, 0xe99e80,
+ /* c4 */ 0xe99e82, 0xe99dbb, 0xe99e84, 0xe99e81,
+ /* c8 */ 0xe99dbf, 0xe99f8e, 0xe99f8d, 0xe9a096,
+ /* cc */ 0xe9a2ad, 0xe9a2ae, 0xe9a482, 0xe9a480,
+ /* d0 */ 0xe9a487, 0xe9a69d, 0xe9a69c, 0xe9a783,
+ /* d4 */ 0xe9a6b9, 0xe9a6bb, 0xe9a6ba, 0xe9a782,
+ /* d8 */ 0xe9a6bd, 0xe9a787, 0xe9aab1, 0xe9aba3,
+ /* dc */ 0xe9aba7, 0xe9acbe, 0xe9acbf, 0xe9ada0,
+ /* e0 */ 0xe9ada1, 0xe9ad9f, 0xe9b3b1, 0xe9b3b2,
+ /* e4 */ 0xe9b3b5, 0xe9baa7, 0xe583bf, 0xe58483,
+ /* e8 */ 0xe584b0, 0xe583b8, 0xe58486, 0xe58487,
+ /* ec */ 0xe583b6, 0xe583be, 0xe5848b, 0xe5848c,
+ /* f0 */ 0xe583bd, 0xe5848a, 0xe58a8b, 0xe58a8c,
+ /* f4 */ 0xe58bb1, 0xe58baf, 0xe59988, 0xe59982,
+ /* f8 */ 0xe5998c, 0xe598b5, 0xe59981, 0xe5998a,
+ /* fc */ 0xe59989, 0xe59986, 0xe59998,
+
+ /*** Two byte table, leaf: e5xx - offset 0x03315 ***/
+
+ /* 40 */ 0xe5999a, 0xe59980, 0xe598b3, 0xe598bd,
+ /* 44 */ 0xe598ac, 0xe598be, 0xe598b8, 0xe598aa,
+ /* 48 */ 0xe598ba, 0xe59c9a, 0xe5a2ab, 0xe5a29d,
+ /* 4c */ 0xe5a2b1, 0xe5a2a0, 0xe5a2a3, 0xe5a2af,
+ /* 50 */ 0xe5a2ac, 0xe5a2a5, 0xe5a2a1, 0xe5a3bf,
+ /* 54 */ 0xe5abbf, 0xe5abb4, 0xe5abbd, 0xe5abb7,
+ /* 58 */ 0xe5abb6, 0xe5ac83, 0xe5abb8, 0xe5ac82,
+ /* 5c */ 0xe5abb9, 0xe5ac81, 0xe5ac87, 0xe5ac85,
+ /* 60 */ 0xe5ac8f, 0xe5b1a7, 0xe5b699, 0xe5b697,
+ /* 64 */ 0xe5b69f, 0xe5b692, 0xe5b6a2, 0xe5b693,
+ /* 68 */ 0xe5b695, 0xe5b6a0, 0xe5b69c, 0xe5b6a1,
+ /* 6c */ 0xe5b69a, 0xe5b69e, 0xe5b9a9, 0xe5b99d,
+ /* 70 */ 0xe5b9a0, 0xe5b99c, 0xe7b7b3, 0xe5bb9b,
+ /* 74 */ 0xe5bb9e, 0xe5bba1, 0xe5bd89, 0xe5beb2,
+ /* 78 */ 0xe6868b, 0xe68683, 0xe685b9, 0xe686b1,
+ /* 7c */ 0xe686b0, 0xe686a2, 0xe68689, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe6869b, 0xe68693, 0xe686af,
+ /* a4 */ 0xe686ad, 0xe6869f, 0xe68692, 0xe686aa,
+ /* a8 */ 0xe686a1, 0xe6868d, 0xe685a6, 0xe686b3,
+ /* ac */ 0xe688ad, 0xe691ae, 0xe691b0, 0xe69296,
+ /* b0 */ 0xe692a0, 0xe69285, 0xe69297, 0xe6929c,
+ /* b4 */ 0xe6928f, 0xe6928b, 0xe6928a, 0xe6928c,
+ /* b8 */ 0xe692a3, 0xe6929f, 0xe691a8, 0xe692b1,
+ /* bc */ 0xe69298, 0xe695b6, 0xe695ba, 0xe695b9,
+ /* c0 */ 0xe695bb, 0xe696b2, 0xe696b3, 0xe69ab5,
+ /* c4 */ 0xe69ab0, 0xe69aa9, 0xe69ab2, 0xe69ab7,
+ /* c8 */ 0xe69aaa, 0xe69aaf, 0xe6a880, 0xe6a886,
+ /* cc */ 0xe6a897, 0xe6a7a5, 0xe6a7b8, 0xe6a895,
+ /* d0 */ 0xe6a7b1, 0xe6a7a4, 0xe6a8a0, 0xe6a7bf,
+ /* d4 */ 0xe6a7ac, 0xe6a7a2, 0xe6a89b, 0xe6a89d,
+ /* d8 */ 0xe6a7be, 0xe6a8a7, 0xe6a7b2, 0xe6a7ae,
+ /* dc */ 0xe6a894, 0xe6a7b7, 0xe6a7a7, 0xe6a980,
+ /* e0 */ 0xe6a888, 0xe6a7a6, 0xe6a7bb, 0xe6a88d,
+ /* e4 */ 0xe6a7bc, 0xe6a7ab, 0xe6a889, 0xe6a884,
+ /* e8 */ 0xe6a898, 0xe6a8a5, 0xe6a88f, 0xe6a7b6,
+ /* ec */ 0xe6a8a6, 0xe6a887, 0xe6a7b4, 0xe6a896,
+ /* f0 */ 0xe6ad91, 0xe6aea5, 0xe6aea3, 0xe6aea2,
+ /* f4 */ 0xe6aea6, 0xe6b081, 0xe6b080, 0xe6afbf,
+ /* f8 */ 0xe6b082, 0xe6bd81, 0xe6bca6, 0xe6bdbe,
+ /* fc */ 0xe6be87, 0xe6bf86, 0xe6be92,
+
+ /*** Two byte table, leaf: e6xx - offset 0x033d4 ***/
+
+ /* 40 */ 0xe6be8d, 0xe6be89, 0xe6be8c, 0xe6bda2,
+ /* 44 */ 0xe6bd8f, 0xe6be85, 0xe6bd9a, 0xe6be96,
+ /* 48 */ 0xe6bdb6, 0xe6bdac, 0xe6be82, 0xe6bd95,
+ /* 4c */ 0xe6bdb2, 0xe6bd92, 0xe6bd90, 0xe6bd97,
+ /* 50 */ 0xe6be94, 0xe6be93, 0xe6bd9d, 0xe6bc80,
+ /* 54 */ 0xe6bda1, 0xe6bdab, 0xe6bdbd, 0xe6bda7,
+ /* 58 */ 0xe6be90, 0xe6bd93, 0xe6be8b, 0xe6bda9,
+ /* 5c */ 0xe6bdbf, 0xe6be95, 0xe6bda3, 0xe6bdb7,
+ /* 60 */ 0xe6bdaa, 0xe6bdbb, 0xe786b2, 0xe786af,
+ /* 64 */ 0xe7869b, 0xe786b0, 0xe786a0, 0xe7869a,
+ /* 68 */ 0xe786a9, 0xe786b5, 0xe7869d, 0xe786a5,
+ /* 6c */ 0xe7869e, 0xe786a4, 0xe786a1, 0xe786aa,
+ /* 70 */ 0xe7869c, 0xe786a7, 0xe786b3, 0xe78a98,
+ /* 74 */ 0xe78a9a, 0xe78d98, 0xe78d92, 0xe78d9e,
+ /* 78 */ 0xe78d9f, 0xe78da0, 0xe78d9d, 0xe78d9b,
+ /* 7c */ 0xe78da1, 0xe78d9a, 0xe78d99, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe78da2, 0xe79287, 0xe79289,
+ /* a4 */ 0xe7928a, 0xe79286, 0xe79281, 0xe791bd,
+ /* a8 */ 0xe79285, 0xe79288, 0xe791bc, 0xe791b9,
+ /* ac */ 0xe79488, 0xe79487, 0xe795be, 0xe798a5,
+ /* b0 */ 0xe7989e, 0xe79899, 0xe7989d, 0xe7989c,
+ /* b4 */ 0xe798a3, 0xe7989a, 0xe798a8, 0xe7989b,
+ /* b8 */ 0xe79a9c, 0xe79a9d, 0xe79a9e, 0xe79a9b,
+ /* bc */ 0xe79e8d, 0xe79e8f, 0xe79e89, 0xe79e88,
+ /* c0 */ 0xe7a38d, 0xe7a2bb, 0xe7a38f, 0xe7a38c,
+ /* c4 */ 0xe7a391, 0xe7a38e, 0xe7a394, 0xe7a388,
+ /* c8 */ 0xe7a383, 0xe7a384, 0xe7a389, 0xe7a69a,
+ /* cc */ 0xe7a6a1, 0xe7a6a0, 0xe7a69c, 0xe7a6a2,
+ /* d0 */ 0xe7a69b, 0xe6adb6, 0xe7a8b9, 0xe7aab2,
+ /* d4 */ 0xe7aab4, 0xe7aab3, 0xe7aeb7, 0xe7af8b,
+ /* d8 */ 0xe7aebe, 0xe7aeac, 0xe7af8e, 0xe7aeaf,
+ /* dc */ 0xe7aeb9, 0xe7af8a, 0xe7aeb5, 0xe7b385,
+ /* e0 */ 0xe7b388, 0xe7b38c, 0xe7b38b, 0xe7b7b7,
+ /* e4 */ 0xe7b79b, 0xe7b7aa, 0xe7b7a7, 0xe7b797,
+ /* e8 */ 0xe7b7a1, 0xe7b883, 0xe7b7ba, 0xe7b7a6,
+ /* ec */ 0xe7b7b6, 0xe7b7b1, 0xe7b7b0, 0xe7b7ae,
+ /* f0 */ 0xe7b79f, 0xe7bdb6, 0xe7beac, 0xe7beb0,
+ /* f4 */ 0xe7bead, 0xe7bfad, 0xe7bfab, 0xe7bfaa,
+ /* f8 */ 0xe7bfac, 0xe7bfa6, 0xe7bfa8, 0xe881a4,
+ /* fc */ 0xe881a7, 0xe886a3, 0xe8869f,
+
+ /*** Two byte table, leaf: e7xx - offset 0x03493 ***/
+
+ /* 40 */ 0xe8869e, 0xe88695, 0xe886a2, 0xe88699,
+ /* 44 */ 0xe88697, 0xe88896, 0xe8898f, 0xe88993,
+ /* 48 */ 0xe88992, 0xe88990, 0xe8898e, 0xe88991,
+ /* 4c */ 0xe894a4, 0xe894bb, 0xe8948f, 0xe89480,
+ /* 50 */ 0xe894a9, 0xe8948e, 0xe89489, 0xe8948d,
+ /* 54 */ 0xe8949f, 0xe8948a, 0xe894a7, 0xe8949c,
+ /* 58 */ 0xe893bb, 0xe894ab, 0xe893ba, 0xe89488,
+ /* 5c */ 0xe8948c, 0xe893b4, 0xe894aa, 0xe893b2,
+ /* 60 */ 0xe89495, 0xe893b7, 0xe893ab, 0xe893b3,
+ /* 64 */ 0xe893bc, 0xe89492, 0xe893aa, 0xe893a9,
+ /* 68 */ 0xe89496, 0xe893be, 0xe894a8, 0xe8949d,
+ /* 6c */ 0xe894ae, 0xe89482, 0xe893bd, 0xe8949e,
+ /* 70 */ 0xe893b6, 0xe894b1, 0xe894a6, 0xe893a7,
+ /* 74 */ 0xe893a8, 0xe893b0, 0xe893af, 0xe893b9,
+ /* 78 */ 0xe89498, 0xe894a0, 0xe894b0, 0xe8948b,
+ /* 7c */ 0xe89499, 0xe894af, 0xe899a2, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe89d96, 0xe89da3, 0xe89da4,
+ /* a4 */ 0xe89db7, 0xe89fa1, 0xe89db3, 0xe89d98,
+ /* a8 */ 0xe89d94, 0xe89d9b, 0xe89d92, 0xe89da1,
+ /* ac */ 0xe89d9a, 0xe89d91, 0xe89d9e, 0xe89dad,
+ /* b0 */ 0xe89daa, 0xe89d90, 0xe89d8e, 0xe89d9f,
+ /* b4 */ 0xe89d9d, 0xe89daf, 0xe89dac, 0xe89dba,
+ /* b8 */ 0xe89dae, 0xe89d9c, 0xe89da5, 0xe89d8f,
+ /* bc */ 0xe89dbb, 0xe89db5, 0xe89da2, 0xe89da7,
+ /* c0 */ 0xe89da9, 0xe8a19a, 0xe8a485, 0xe8a48c,
+ /* c4 */ 0xe8a494, 0xe8a48b, 0xe8a497, 0xe8a498,
+ /* c8 */ 0xe8a499, 0xe8a486, 0xe8a496, 0xe8a491,
+ /* cc */ 0xe8a48e, 0xe8a489, 0xe8a6a2, 0xe8a6a4,
+ /* d0 */ 0xe8a6a3, 0xe8a7ad, 0xe8a7b0, 0xe8a7ac,
+ /* d4 */ 0xe8ab8f, 0xe8ab86, 0xe8aab8, 0xe8ab93,
+ /* d8 */ 0xe8ab91, 0xe8ab94, 0xe8ab95, 0xe8aabb,
+ /* dc */ 0xe8ab97, 0xe8aabe, 0xe8ab80, 0xe8ab85,
+ /* e0 */ 0xe8ab98, 0xe8ab83, 0xe8aaba, 0xe8aabd,
+ /* e4 */ 0xe8ab99, 0xe8b0be, 0xe8b18d, 0xe8b28f,
+ /* e8 */ 0xe8b3a5, 0xe8b39f, 0xe8b399, 0xe8b3a8,
+ /* ec */ 0xe8b39a, 0xe8b39d, 0xe8b3a7, 0xe8b6a0,
+ /* f0 */ 0xe8b69c, 0xe8b6a1, 0xe8b69b, 0xe8b8a0,
+ /* f4 */ 0xe8b8a3, 0xe8b8a5, 0xe8b8a4, 0xe8b8ae,
+ /* f8 */ 0xe8b895, 0xe8b89b, 0xe8b896, 0xe8b891,
+ /* fc */ 0xe8b899, 0xe8b8a6, 0xe8b8a7,
+
+ /*** Two byte table, leaf: e8xx - offset 0x03552 ***/
+
+ /* 40 */ 0xe8b894, 0xe8b892, 0xe8b898, 0xe8b893,
+ /* 44 */ 0xe8b89c, 0xe8b897, 0xe8b89a, 0xe8bcac,
+ /* 48 */ 0xe8bca4, 0xe8bc98, 0xe8bc9a, 0xe8bca0,
+ /* 4c */ 0xe8bca3, 0xe8bc96, 0xe8bc97, 0xe981b3,
+ /* 50 */ 0xe981b0, 0xe981af, 0xe981a7, 0xe981ab,
+ /* 54 */ 0xe984af, 0xe984ab, 0xe984a9, 0xe984aa,
+ /* 58 */ 0xe984b2, 0xe984a6, 0xe984ae, 0xe98685,
+ /* 5c */ 0xe98686, 0xe9868a, 0xe98681, 0xe98682,
+ /* 60 */ 0xe98684, 0xe98680, 0xe98b90, 0xe98b83,
+ /* 64 */ 0xe98b84, 0xe98b80, 0xe98b99, 0xe98ab6,
+ /* 68 */ 0xe98b8f, 0xe98bb1, 0xe98b9f, 0xe98b98,
+ /* 6c */ 0xe98ba9, 0xe98b97, 0xe98b9d, 0xe98b8c,
+ /* 70 */ 0xe98baf, 0xe98b82, 0xe98ba8, 0xe98b8a,
+ /* 74 */ 0xe98b88, 0xe98b8e, 0xe98ba6, 0xe98b8d,
+ /* 78 */ 0xe98b95, 0xe98b89, 0xe98ba0, 0xe98b9e,
+ /* 7c */ 0xe98ba7, 0xe98b91, 0xe98b93, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe98ab5, 0xe98ba1, 0xe98b86,
+ /* a4 */ 0xe98ab4, 0xe995bc, 0xe996ac, 0xe996ab,
+ /* a8 */ 0xe996ae, 0xe996b0, 0xe99aa4, 0xe99aa2,
+ /* ac */ 0xe99b93, 0xe99c85, 0xe99c88, 0xe99c82,
+ /* b0 */ 0xe99d9a, 0xe99e8a, 0xe99e8e, 0xe99e88,
+ /* b4 */ 0xe99f90, 0xe99f8f, 0xe9a09e, 0xe9a09d,
+ /* b8 */ 0xe9a0a6, 0xe9a0a9, 0xe9a0a8, 0xe9a0a0,
+ /* bc */ 0xe9a09b, 0xe9a0a7, 0xe9a2b2, 0xe9a488,
+ /* c0 */ 0xe9a3ba, 0xe9a491, 0xe9a494, 0xe9a496,
+ /* c4 */ 0xe9a497, 0xe9a495, 0xe9a79c, 0xe9a78d,
+ /* c8 */ 0xe9a78f, 0xe9a793, 0xe9a794, 0xe9a78e,
+ /* cc */ 0xe9a789, 0xe9a796, 0xe9a798, 0xe9a78b,
+ /* d0 */ 0xe9a797, 0xe9a78c, 0xe9aab3, 0xe9abac,
+ /* d4 */ 0xe9abab, 0xe9abb3, 0xe9abb2, 0xe9abb1,
+ /* d8 */ 0xe9ad86, 0xe9ad83, 0xe9ada7, 0xe9adb4,
+ /* dc */ 0xe9adb1, 0xe9ada6, 0xe9adb6, 0xe9adb5,
+ /* e0 */ 0xe9adb0, 0xe9ada8, 0xe9ada4, 0xe9adac,
+ /* e4 */ 0xe9b3bc, 0xe9b3ba, 0xe9b3bd, 0xe9b3bf,
+ /* e8 */ 0xe9b3b7, 0xe9b487, 0xe9b480, 0xe9b3b9,
+ /* ec */ 0xe9b3bb, 0xe9b488, 0xe9b485, 0xe9b484,
+ /* f0 */ 0xe9ba83, 0xe9bb93, 0xe9bc8f, 0xe9bc90,
+ /* f4 */ 0xe5849c, 0xe58493, 0xe58497, 0xe5849a,
+ /* f8 */ 0xe58491, 0xe5879e, 0xe58cb4, 0xe58fa1,
+ /* fc */ 0xe599b0, 0xe599a0, 0xe599ae,
+
+ /*** Two byte table, leaf: e9xx - offset 0x03611 ***/
+
+ /* 40 */ 0xe599b3, 0xe599a6, 0xe599a3, 0xe599ad,
+ /* 44 */ 0xe599b2, 0xe5999e, 0xe599b7, 0xe59c9c,
+ /* 48 */ 0xe59c9b, 0xe5a388, 0xe5a2bd, 0xe5a389,
+ /* 4c */ 0xe5a2bf, 0xe5a2ba, 0xe5a382, 0xe5a2bc,
+ /* 50 */ 0xe5a386, 0xe5ac97, 0xe5ac99, 0xe5ac9b,
+ /* 54 */ 0xe5aca1, 0xe5ac94, 0xe5ac93, 0xe5ac90,
+ /* 58 */ 0xe5ac96, 0xe5aca8, 0xe5ac9a, 0xe5aca0,
+ /* 5c */ 0xe5ac9e, 0xe5afaf, 0xe5b6ac, 0xe5b6b1,
+ /* 60 */ 0xe5b6a9, 0xe5b6a7, 0xe5b6b5, 0xe5b6b0,
+ /* 64 */ 0xe5b6ae, 0xe5b6aa, 0xe5b6a8, 0xe5b6b2,
+ /* 68 */ 0xe5b6ad, 0xe5b6af, 0xe5b6b4, 0xe5b9a7,
+ /* 6c */ 0xe5b9a8, 0xe5b9a6, 0xe5b9af, 0xe5bba9,
+ /* 70 */ 0xe5bba7, 0xe5bba6, 0xe5bba8, 0xe5bba5,
+ /* 74 */ 0xe5bd8b, 0xe5bebc, 0xe6869d, 0xe686a8,
+ /* 78 */ 0xe68696, 0xe68785, 0xe686b4, 0xe68786,
+ /* 7c */ 0xe68781, 0xe6878c, 0xe686ba, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe686bf, 0xe686b8, 0xe6868c,
+ /* a4 */ 0xe69397, 0xe69396, 0xe69390, 0xe6938f,
+ /* a8 */ 0xe69389, 0xe692bd, 0xe69289, 0xe69383,
+ /* ac */ 0xe6939b, 0xe693b3, 0xe69399, 0xe694b3,
+ /* b0 */ 0xe695bf, 0xe695bc, 0xe696a2, 0xe69b88,
+ /* b4 */ 0xe69abe, 0xe69b80, 0xe69b8a, 0xe69b8b,
+ /* b8 */ 0xe69b8f, 0xe69abd, 0xe69abb, 0xe69aba,
+ /* bc */ 0xe69b8c, 0xe69ca3, 0xe6a8b4, 0xe6a9a6,
+ /* c0 */ 0xe6a989, 0xe6a9a7, 0xe6a8b2, 0xe6a9a8,
+ /* c4 */ 0xe6a8be, 0xe6a99d, 0xe6a9ad, 0xe6a9b6,
+ /* c8 */ 0xe6a99b, 0xe6a991, 0xe6a8a8, 0xe6a99a,
+ /* cc */ 0xe6a8bb, 0xe6a8bf, 0xe6a981, 0xe6a9aa,
+ /* d0 */ 0xe6a9a4, 0xe6a990, 0xe6a98f, 0xe6a994,
+ /* d4 */ 0xe6a9af, 0xe6a9a9, 0xe6a9a0, 0xe6a8bc,
+ /* d8 */ 0xe6a99e, 0xe6a996, 0xe6a995, 0xe6a98d,
+ /* dc */ 0xe6a98e, 0xe6a986, 0xe6ad95, 0xe6ad94,
+ /* e0 */ 0xe6ad96, 0xe6aea7, 0xe6aeaa, 0xe6aeab,
+ /* e4 */ 0xe6af88, 0xe6af87, 0xe6b084, 0xe6b083,
+ /* e8 */ 0xe6b086, 0xe6bead, 0xe6bf8b, 0xe6bea3,
+ /* ec */ 0xe6bf87, 0xe6bebc, 0xe6bf8e, 0xe6bf88,
+ /* f0 */ 0xe6bd9e, 0xe6bf84, 0xe6bebd, 0xe6be9e,
+ /* f4 */ 0xe6bf8a, 0xe6bea8, 0xe78084, 0xe6bea5,
+ /* f8 */ 0xe6beae, 0xe6beba, 0xe6beac, 0xe6beaa,
+ /* fc */ 0xe6bf8f, 0xe6bebf, 0xe6beb8,
+
+ /*** Two byte table, leaf: eaxx - offset 0x036d0 ***/
+
+ /* 40 */ 0xe6bea2, 0xe6bf89, 0xe6beab, 0xe6bf8d,
+ /* 44 */ 0xe6beaf, 0xe6beb2, 0xe6beb0, 0xe78785,
+ /* 48 */ 0xe78782, 0xe786bf, 0xe786b8, 0xe78796,
+ /* 4c */ 0xe78780, 0xe78781, 0xe7878b, 0xe78794,
+ /* 50 */ 0xe7878a, 0xe78787, 0xe7878f, 0xe786bd,
+ /* 54 */ 0xe78798, 0xe786bc, 0xe78786, 0xe7879a,
+ /* 58 */ 0xe7879b, 0xe78a9d, 0xe78a9e, 0xe78da9,
+ /* 5c */ 0xe78da6, 0xe78da7, 0xe78dac, 0xe78da5,
+ /* 60 */ 0xe78dab, 0xe78daa, 0xe791bf, 0xe7929a,
+ /* 64 */ 0xe792a0, 0xe79294, 0xe79292, 0xe79295,
+ /* 68 */ 0xe792a1, 0xe7948b, 0xe79680, 0xe798af,
+ /* 6c */ 0xe798ad, 0xe798b1, 0xe798bd, 0xe798b3,
+ /* 70 */ 0xe798bc, 0xe798b5, 0xe798b2, 0xe798b0,
+ /* 74 */ 0xe79abb, 0xe79ba6, 0xe79e9a, 0xe79e9d,
+ /* 78 */ 0xe79ea1, 0xe79e9c, 0xe79e9b, 0xe79ea2,
+ /* 7c */ 0xe79ea3, 0xe79e95, 0xe79e99, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe79e97, 0xe7a39d, 0xe7a3a9,
+ /* a4 */ 0xe7a3a5, 0xe7a3aa, 0xe7a39e, 0xe7a3a3,
+ /* a8 */ 0xe7a39b, 0xe7a3a1, 0xe7a3a2, 0xe7a3ad,
+ /* ac */ 0xe7a39f, 0xe7a3a0, 0xe7a6a4, 0xe7a984,
+ /* b0 */ 0xe7a988, 0xe7a987, 0xe7aab6, 0xe7aab8,
+ /* b4 */ 0xe7aab5, 0xe7aab1, 0xe7aab7, 0xe7af9e,
+ /* b8 */ 0xe7afa3, 0xe7afa7, 0xe7af9d, 0xe7af95,
+ /* bc */ 0xe7afa5, 0xe7af9a, 0xe7afa8, 0xe7afb9,
+ /* c0 */ 0xe7af94, 0xe7afaa, 0xe7afa2, 0xe7af9c,
+ /* c4 */ 0xe7afab, 0xe7af98, 0xe7af9f, 0xe7b392,
+ /* c8 */ 0xe7b394, 0xe7b397, 0xe7b390, 0xe7b391,
+ /* cc */ 0xe7b892, 0xe7b8a1, 0xe7b897, 0xe7b88c,
+ /* d0 */ 0xe7b89f, 0xe7b8a0, 0xe7b893, 0xe7b88e,
+ /* d4 */ 0xe7b89c, 0xe7b895, 0xe7b89a, 0xe7b8a2,
+ /* d8 */ 0xe7b88b, 0xe7b88f, 0xe7b896, 0xe7b88d,
+ /* dc */ 0xe7b894, 0xe7b8a5, 0xe7b8a4, 0xe7bd83,
+ /* e0 */ 0xe7bdbb, 0xe7bdbc, 0xe7bdba, 0xe7beb1,
+ /* e4 */ 0xe7bfaf, 0xe880aa, 0xe880a9, 0xe881ac,
+ /* e8 */ 0xe886b1, 0xe886a6, 0xe886ae, 0xe886b9,
+ /* ec */ 0xe886b5, 0xe886ab, 0xe886b0, 0xe886ac,
+ /* f0 */ 0xe886b4, 0xe886b2, 0xe886b7, 0xe886a7,
+ /* f4 */ 0xe887b2, 0xe88995, 0xe88996, 0xe88997,
+ /* f8 */ 0xe89596, 0xe89585, 0xe895ab, 0xe8958d,
+ /* fc */ 0xe89593, 0xe895a1, 0xe89598,
+
+ /*** Two byte table, leaf: ebxx - offset 0x0378f ***/
+
+ /* 40 */ 0xe89580, 0xe89586, 0xe895a4, 0xe89581,
+ /* 44 */ 0xe895a2, 0xe89584, 0xe89591, 0xe89587,
+ /* 48 */ 0xe895a3, 0xe894be, 0xe8959b, 0xe895b1,
+ /* 4c */ 0xe8958e, 0xe895ae, 0xe895b5, 0xe89595,
+ /* 50 */ 0xe895a7, 0xe895a0, 0xe8968c, 0xe895a6,
+ /* 54 */ 0xe8959d, 0xe89594, 0xe895a5, 0xe895ac,
+ /* 58 */ 0xe899a3, 0xe899a5, 0xe899a4, 0xe89e9b,
+ /* 5c */ 0xe89e8f, 0xe89e97, 0xe89e93, 0xe89e92,
+ /* 60 */ 0xe89e88, 0xe89e81, 0xe89e96, 0xe89e98,
+ /* 64 */ 0xe89db9, 0xe89e87, 0xe89ea3, 0xe89e85,
+ /* 68 */ 0xe89e90, 0xe89e91, 0xe89e9d, 0xe89e84,
+ /* 6c */ 0xe89e94, 0xe89e9c, 0xe89e9a, 0xe89e89,
+ /* 70 */ 0xe8a49e, 0xe8a4a6, 0xe8a4b0, 0xe8a4ad,
+ /* 74 */ 0xe8a4ae, 0xe8a4a7, 0xe8a4b1, 0xe8a4a2,
+ /* 78 */ 0xe8a4a9, 0xe8a4a3, 0xe8a4af, 0xe8a4ac,
+ /* 7c */ 0xe8a49f, 0xe8a7b1, 0xe8aba0, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe8aba2, 0xe8abb2, 0xe8abb4,
+ /* a4 */ 0xe8abb5, 0xe8ab9d, 0xe8ac94, 0xe8aba4,
+ /* a8 */ 0xe8ab9f, 0xe8abb0, 0xe8ab88, 0xe8ab9e,
+ /* ac */ 0xe8aba1, 0xe8aba8, 0xe8abbf, 0xe8abaf,
+ /* b0 */ 0xe8abbb, 0xe8b291, 0xe8b292, 0xe8b290,
+ /* b4 */ 0xe8b3b5, 0xe8b3ae, 0xe8b3b1, 0xe8b3b0,
+ /* b8 */ 0xe8b3b3, 0xe8b5ac, 0xe8b5ae, 0xe8b6a5,
+ /* bc */ 0xe8b6a7, 0xe8b8b3, 0xe8b8be, 0xe8b8b8,
+ /* c0 */ 0xe8b980, 0xe8b985, 0xe8b8b6, 0xe8b8bc,
+ /* c4 */ 0xe8b8bd, 0xe8b981, 0xe8b8b0, 0xe8b8bf,
+ /* c8 */ 0xe8babd, 0xe8bcb6, 0xe8bcae, 0xe8bcb5,
+ /* cc */ 0xe8bcb2, 0xe8bcb9, 0xe8bcb7, 0xe8bcb4,
+ /* d0 */ 0xe981b6, 0xe981b9, 0xe981bb, 0xe98286,
+ /* d4 */ 0xe983ba, 0xe984b3, 0xe984b5, 0xe984b6,
+ /* d8 */ 0xe98693, 0xe98690, 0xe98691, 0xe9868d,
+ /* dc */ 0xe9868f, 0xe98ca7, 0xe98c9e, 0xe98c88,
+ /* e0 */ 0xe98c9f, 0xe98c86, 0xe98c8f, 0xe98dba,
+ /* e4 */ 0xe98cb8, 0xe98cbc, 0xe98c9b, 0xe98ca3,
+ /* e8 */ 0xe98c92, 0xe98c81, 0xe98d86, 0xe98cad,
+ /* ec */ 0xe98c8e, 0xe98c8d, 0xe98b8b, 0xe98c9d,
+ /* f0 */ 0xe98bba, 0xe98ca5, 0xe98c93, 0xe98bb9,
+ /* f4 */ 0xe98bb7, 0xe98cb4, 0xe98c82, 0xe98ca4,
+ /* f8 */ 0xe98bbf, 0xe98ca9, 0xe98cb9, 0xe98cb5,
+ /* fc */ 0xe98caa, 0xe98c94, 0xe98c8c,
+
+ /*** Two byte table, leaf: ecxx - offset 0x0384e ***/
+
+ /* 40 */ 0xe98c8b, 0xe98bbe, 0xe98c89, 0xe98c80,
+ /* 44 */ 0xe98bbb, 0xe98c96, 0xe996bc, 0xe9978d,
+ /* 48 */ 0xe996be, 0xe996b9, 0xe996ba, 0xe996b6,
+ /* 4c */ 0xe996bf, 0xe996b5, 0xe996bd, 0xe99aa9,
+ /* 50 */ 0xe99b94, 0xe99c8b, 0xe99c92, 0xe99c90,
+ /* 54 */ 0xe99e99, 0xe99e97, 0xe99e94, 0xe99fb0,
+ /* 58 */ 0xe99fb8, 0xe9a0b5, 0xe9a0af, 0xe9a0b2,
+ /* 5c */ 0xe9a4a4, 0xe9a49f, 0xe9a4a7, 0xe9a4a9,
+ /* 60 */ 0xe9a69e, 0xe9a7ae, 0xe9a7ac, 0xe9a7a5,
+ /* 64 */ 0xe9a7a4, 0xe9a7b0, 0xe9a7a3, 0xe9a7aa,
+ /* 68 */ 0xe9a7a9, 0xe9a7a7, 0xe9aab9, 0xe9aabf,
+ /* 6c */ 0xe9aab4, 0xe9aabb, 0xe9abb6, 0xe9abba,
+ /* 70 */ 0xe9abb9, 0xe9abb7, 0xe9acb3, 0xe9ae80,
+ /* 74 */ 0xe9ae85, 0xe9ae87, 0xe9adbc, 0xe9adbe,
+ /* 78 */ 0xe9adbb, 0xe9ae82, 0xe9ae93, 0xe9ae92,
+ /* 7c */ 0xe9ae90, 0xe9adba, 0xe9ae95, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9adbd, 0xe9ae88, 0xe9b4a5,
+ /* a4 */ 0xe9b497, 0xe9b4a0, 0xe9b49e, 0xe9b494,
+ /* a8 */ 0xe9b4a9, 0xe9b49d, 0xe9b498, 0xe9b4a2,
+ /* ac */ 0xe9b490, 0xe9b499, 0xe9b49f, 0xe9ba88,
+ /* b0 */ 0xe9ba86, 0xe9ba87, 0xe9baae, 0xe9baad,
+ /* b4 */ 0xe9bb95, 0xe9bb96, 0xe9bbba, 0xe9bc92,
+ /* b8 */ 0xe9bcbd, 0xe584a6, 0xe584a5, 0xe584a2,
+ /* bc */ 0xe584a4, 0xe584a0, 0xe584a9, 0xe58bb4,
+ /* c0 */ 0xe59a93, 0xe59a8c, 0xe59a8d, 0xe59a86,
+ /* c4 */ 0xe59a84, 0xe59a83, 0xe599be, 0xe59a82,
+ /* c8 */ 0xe599bf, 0xe59a81, 0xe5a396, 0xe5a394,
+ /* cc */ 0xe5a38f, 0xe5a392, 0xe5acad, 0xe5aca5,
+ /* d0 */ 0xe5acb2, 0xe5aca3, 0xe5acac, 0xe5aca7,
+ /* d4 */ 0xe5aca6, 0xe5acaf, 0xe5acae, 0xe5adbb,
+ /* d8 */ 0xe5afb1, 0xe5afb2, 0xe5b6b7, 0xe5b9ac,
+ /* dc */ 0xe5b9aa, 0xe5bebe, 0xe5bebb, 0xe68783,
+ /* e0 */ 0xe686b5, 0xe686bc, 0xe687a7, 0xe687a0,
+ /* e4 */ 0xe687a5, 0xe687a4, 0xe687a8, 0xe6879e,
+ /* e8 */ 0xe693af, 0xe693a9, 0xe693a3, 0xe693ab,
+ /* ec */ 0xe693a4, 0xe693a8, 0xe69681, 0xe69680,
+ /* f0 */ 0xe696b6, 0xe6979a, 0xe69b92, 0xe6aa8d,
+ /* f4 */ 0xe6aa96, 0xe6aa81, 0xe6aaa5, 0xe6aa89,
+ /* f8 */ 0xe6aa9f, 0xe6aa9b, 0xe6aaa1, 0xe6aa9e,
+ /* fc */ 0xe6aa87, 0xe6aa93, 0xe6aa8e,
+
+ /*** Two byte table, leaf: edxx - offset 0x0390d ***/
+
+ /* 40 */ 0xe6aa95, 0xe6aa83, 0xe6aaa8, 0xe6aaa4,
+ /* 44 */ 0xe6aa91, 0xe6a9bf, 0xe6aaa6, 0xe6aa9a,
+ /* 48 */ 0xe6aa85, 0xe6aa8c, 0xe6aa92, 0xe6ad9b,
+ /* 4c */ 0xe6aead, 0xe6b089, 0xe6bf8c, 0xe6bea9,
+ /* 50 */ 0xe6bfb4, 0xe6bf94, 0xe6bfa3, 0xe6bf9c,
+ /* 54 */ 0xe6bfad, 0xe6bfa7, 0xe6bfa6, 0xe6bf9e,
+ /* 58 */ 0xe6bfb2, 0xe6bf9d, 0xe6bfa2, 0xe6bfa8,
+ /* 5c */ 0xe787a1, 0xe787b1, 0xe787a8, 0xe787b2,
+ /* 60 */ 0xe787a4, 0xe787b0, 0xe787a2, 0xe78db3,
+ /* 64 */ 0xe78dae, 0xe78daf, 0xe79297, 0xe792b2,
+ /* 68 */ 0xe792ab, 0xe79290, 0xe792aa, 0xe792ad,
+ /* 6c */ 0xe792b1, 0xe792a5, 0xe792af, 0xe79490,
+ /* 70 */ 0xe79491, 0xe79492, 0xe7948f, 0xe79684,
+ /* 74 */ 0xe79983, 0xe79988, 0xe79989, 0xe79987,
+ /* 78 */ 0xe79aa4, 0xe79ba9, 0xe79eb5, 0xe79eab,
+ /* 7c */ 0xe79eb2, 0xe79eb7, 0xe79eb6, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe79eb4, 0xe79eb1, 0xe79ea8,
+ /* a4 */ 0xe79fb0, 0xe7a3b3, 0xe7a3bd, 0xe7a482,
+ /* a8 */ 0xe7a3bb, 0xe7a3bc, 0xe7a3b2, 0xe7a485,
+ /* ac */ 0xe7a3b9, 0xe7a3be, 0xe7a484, 0xe7a6ab,
+ /* b0 */ 0xe7a6a8, 0xe7a99c, 0xe7a99b, 0xe7a996,
+ /* b4 */ 0xe7a998, 0xe7a994, 0xe7a99a, 0xe7aabe,
+ /* b8 */ 0xe7ab80, 0xe7ab81, 0xe7b085, 0xe7b08f,
+ /* bc */ 0xe7afb2, 0xe7b080, 0xe7afbf, 0xe7afbb,
+ /* c0 */ 0xe7b08e, 0xe7afb4, 0xe7b08b, 0xe7afb3,
+ /* c4 */ 0xe7b082, 0xe7b089, 0xe7b083, 0xe7b081,
+ /* c8 */ 0xe7afb8, 0xe7afbd, 0xe7b086, 0xe7afb0,
+ /* cc */ 0xe7afb1, 0xe7b090, 0xe7b08a, 0xe7b3a8,
+ /* d0 */ 0xe7b8ad, 0xe7b8bc, 0xe7b982, 0xe7b8b3,
+ /* d4 */ 0xe9a188, 0xe7b8b8, 0xe7b8aa, 0xe7b989,
+ /* d8 */ 0xe7b980, 0xe7b987, 0xe7b8a9, 0xe7b98c,
+ /* dc */ 0xe7b8b0, 0xe7b8bb, 0xe7b8b6, 0xe7b984,
+ /* e0 */ 0xe7b8ba, 0xe7bd85, 0xe7bdbf, 0xe7bdbe,
+ /* e4 */ 0xe7bdbd, 0xe7bfb4, 0xe7bfb2, 0xe880ac,
+ /* e8 */ 0xe886bb, 0xe88784, 0xe8878c, 0xe8878a,
+ /* ec */ 0xe88785, 0xe88787, 0xe886bc, 0xe887a9,
+ /* f0 */ 0xe8899b, 0xe8899a, 0xe8899c, 0xe89683,
+ /* f4 */ 0xe89680, 0xe8968f, 0xe896a7, 0xe89695,
+ /* f8 */ 0xe896a0, 0xe8968b, 0xe896a3, 0xe895bb,
+ /* fc */ 0xe896a4, 0xe8969a, 0xe8969e,
+
+ /*** Two byte table, leaf: eexx - offset 0x039cc ***/
+
+ /* 40 */ 0xe895b7, 0xe895bc, 0xe89689, 0xe896a1,
+ /* 44 */ 0xe895ba, 0xe895b8, 0xe89597, 0xe8968e,
+ /* 48 */ 0xe89696, 0xe89686, 0xe8968d, 0xe89699,
+ /* 4c */ 0xe8969d, 0xe89681, 0xe896a2, 0xe89682,
+ /* 50 */ 0xe89688, 0xe89685, 0xe895b9, 0xe895b6,
+ /* 54 */ 0xe89698, 0xe89690, 0xe8969f, 0xe899a8,
+ /* 58 */ 0xe89ebe, 0xe89eaa, 0xe89ead, 0xe89f85,
+ /* 5c */ 0xe89eb0, 0xe89eac, 0xe89eb9, 0xe89eb5,
+ /* 60 */ 0xe89ebc, 0xe89eae, 0xe89f89, 0xe89f83,
+ /* 64 */ 0xe89f82, 0xe89f8c, 0xe89eb7, 0xe89eaf,
+ /* 68 */ 0xe89f84, 0xe89f8a, 0xe89eb4, 0xe89eb6,
+ /* 6c */ 0xe89ebf, 0xe89eb8, 0xe89ebd, 0xe89f9e,
+ /* 70 */ 0xe89eb2, 0xe8a4b5, 0xe8a4b3, 0xe8a4bc,
+ /* 74 */ 0xe8a4be, 0xe8a581, 0xe8a592, 0xe8a4b7,
+ /* 78 */ 0xe8a582, 0xe8a6ad, 0xe8a6af, 0xe8a6ae,
+ /* 7c */ 0xe8a7b2, 0xe8a7b3, 0xe8ac9e, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe8ac98, 0xe8ac96, 0xe8ac91,
+ /* a4 */ 0xe8ac85, 0xe8ac8b, 0xe8aca2, 0xe8ac8f,
+ /* a8 */ 0xe8ac92, 0xe8ac95, 0xe8ac87, 0xe8ac8d,
+ /* ac */ 0xe8ac88, 0xe8ac86, 0xe8ac9c, 0xe8ac93,
+ /* b0 */ 0xe8ac9a, 0xe8b18f, 0xe8b1b0, 0xe8b1b2,
+ /* b4 */ 0xe8b1b1, 0xe8b1af, 0xe8b295, 0xe8b294,
+ /* b8 */ 0xe8b3b9, 0xe8b5af, 0xe8b98e, 0xe8b98d,
+ /* bc */ 0xe8b993, 0xe8b990, 0xe8b98c, 0xe8b987,
+ /* c0 */ 0xe8bd83, 0xe8bd80, 0xe98285, 0xe981be,
+ /* c4 */ 0xe984b8, 0xe9869a, 0xe986a2, 0xe9869b,
+ /* c8 */ 0xe98699, 0xe9869f, 0xe986a1, 0xe9869d,
+ /* cc */ 0xe986a0, 0xe98ea1, 0xe98e83, 0xe98eaf,
+ /* d0 */ 0xe98da4, 0xe98d96, 0xe98d87, 0xe98dbc,
+ /* d4 */ 0xe98d98, 0xe98d9c, 0xe98db6, 0xe98d89,
+ /* d8 */ 0xe98d90, 0xe98d91, 0xe98da0, 0xe98dad,
+ /* dc */ 0xe98e8f, 0xe98d8c, 0xe98daa, 0xe98db9,
+ /* e0 */ 0xe98d97, 0xe98d95, 0xe98d92, 0xe98d8f,
+ /* e4 */ 0xe98db1, 0xe98db7, 0xe98dbb, 0xe98da1,
+ /* e8 */ 0xe98d9e, 0xe98da3, 0xe98da7, 0xe98e80,
+ /* ec */ 0xe98d8e, 0xe98d99, 0xe99787, 0xe99780,
+ /* f0 */ 0xe99789, 0xe99783, 0xe99785, 0xe996b7,
+ /* f4 */ 0xe99aae, 0xe99ab0, 0xe99aac, 0xe99ca0,
+ /* f8 */ 0xe99c9f, 0xe99c98, 0xe99c9d, 0xe99c99,
+ /* fc */ 0xe99e9a, 0xe99ea1, 0xe99e9c,
+
+ /*** Two byte table, leaf: efxx - offset 0x03a8b ***/
+
+ /* 40 */ 0xe99e9e, 0xe99e9d, 0xe99f95, 0xe99f94,
+ /* 44 */ 0xe99fb1, 0xe9a181, 0xe9a184, 0xe9a18a,
+ /* 48 */ 0xe9a189, 0xe9a185, 0xe9a183, 0xe9a4a5,
+ /* 4c */ 0xe9a4ab, 0xe9a4ac, 0xe9a4aa, 0xe9a4b3,
+ /* 50 */ 0xe9a4b2, 0xe9a4af, 0xe9a4ad, 0xe9a4b1,
+ /* 54 */ 0xe9a4b0, 0xe9a698, 0xe9a6a3, 0xe9a6a1,
+ /* 58 */ 0xe9a882, 0xe9a7ba, 0xe9a7b4, 0xe9a7b7,
+ /* 5c */ 0xe9a7b9, 0xe9a7b8, 0xe9a7b6, 0xe9a7bb,
+ /* 60 */ 0xe9a7bd, 0xe9a7be, 0xe9a7bc, 0xe9a883,
+ /* 64 */ 0xe9aabe, 0xe9abbe, 0xe9abbd, 0xe9ac81,
+ /* 68 */ 0xe9abbc, 0xe9ad88, 0xe9ae9a, 0xe9aea8,
+ /* 6c */ 0xe9ae9e, 0xe9ae9b, 0xe9aea6, 0xe9aea1,
+ /* 70 */ 0xe9aea5, 0xe9aea4, 0xe9ae86, 0xe9aea2,
+ /* 74 */ 0xe9aea0, 0xe9aeaf, 0xe9b4b3, 0xe9b581,
+ /* 78 */ 0xe9b5a7, 0xe9b4b6, 0xe9b4ae, 0xe9b4af,
+ /* 7c */ 0xe9b4b1, 0xe9b4b8, 0xe9b4b0, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9b585, 0xe9b582, 0xe9b583,
+ /* a4 */ 0xe9b4be, 0xe9b4b7, 0xe9b580, 0xe9b4bd,
+ /* a8 */ 0xe7bfb5, 0xe9b4ad, 0xe9ba8a, 0xe9ba89,
+ /* ac */ 0xe9ba8d, 0xe9bab0, 0xe9bb88, 0xe9bb9a,
+ /* b0 */ 0xe9bbbb, 0xe9bbbf, 0xe9bca4, 0xe9bca3,
+ /* b4 */ 0xe9bca2, 0xe9bd94, 0xe9bea0, 0xe584b1,
+ /* b8 */ 0xe584ad, 0xe584ae, 0xe59a98, 0xe59a9c,
+ /* bc */ 0xe59a97, 0xe59a9a, 0xe59a9d, 0xe59a99,
+ /* c0 */ 0xe5a5b0, 0xe5acbc, 0xe5b1a9, 0xe5b1aa,
+ /* c4 */ 0xe5b780, 0xe5b9ad, 0xe5b9ae, 0xe68798,
+ /* c8 */ 0xe6879f, 0xe687ad, 0xe687ae, 0xe687b1,
+ /* cc */ 0xe687aa, 0xe687b0, 0xe687ab, 0xe68796,
+ /* d0 */ 0xe687a9, 0xe693bf, 0xe69484, 0xe693bd,
+ /* d4 */ 0xe693b8, 0xe69481, 0xe69483, 0xe693bc,
+ /* d8 */ 0xe69694, 0xe6979b, 0xe69b9a, 0xe69b9b,
+ /* dc */ 0xe69b98, 0xe6ab85, 0xe6aab9, 0xe6aabd,
+ /* e0 */ 0xe6aba1, 0xe6ab86, 0xe6aaba, 0xe6aab6,
+ /* e4 */ 0xe6aab7, 0xe6ab87, 0xe6aab4, 0xe6aaad,
+ /* e8 */ 0xe6ad9e, 0xe6af89, 0xe6b08b, 0xe78087,
+ /* ec */ 0xe7808c, 0xe7808d, 0xe78081, 0xe78085,
+ /* f0 */ 0xe78094, 0xe7808e, 0xe6bfbf, 0xe78080,
+ /* f4 */ 0xe6bfbb, 0xe780a6, 0xe6bfbc, 0xe6bfb7,
+ /* f8 */ 0xe7808a, 0xe78881, 0xe787bf, 0xe787b9,
+ /* fc */ 0xe78883, 0xe787bd, 0xe78db6,
+
+ /*** Two byte table, leaf: f0xx - offset 0x03b4a ***/
+
+ /* 40 */ 0xe792b8, 0xe79380, 0xe792b5, 0xe79381,
+ /* 44 */ 0xe792be, 0xe792b6, 0xe792bb, 0xe79382,
+ /* 48 */ 0xe79494, 0xe79493, 0xe7999c, 0xe799a4,
+ /* 4c */ 0xe79999, 0xe79990, 0xe79993, 0xe79997,
+ /* 50 */ 0xe7999a, 0xe79aa6, 0xe79abd, 0xe79bac,
+ /* 54 */ 0xe79f82, 0xe79eba, 0xe7a3bf, 0xe7a48c,
+ /* 58 */ 0xe7a493, 0xe7a494, 0xe7a489, 0xe7a490,
+ /* 5c */ 0xe7a492, 0xe7a491, 0xe7a6ad, 0xe7a6ac,
+ /* 60 */ 0xe7a99f, 0xe7b09c, 0xe7b0a9, 0xe7b099,
+ /* 64 */ 0xe7b0a0, 0xe7b09f, 0xe7b0ad, 0xe7b09d,
+ /* 68 */ 0xe7b0a6, 0xe7b0a8, 0xe7b0a2, 0xe7b0a5,
+ /* 6c */ 0xe7b0b0, 0xe7b99c, 0xe7b990, 0xe7b996,
+ /* 70 */ 0xe7b9a3, 0xe7b998, 0xe7b9a2, 0xe7b99f,
+ /* 74 */ 0xe7b991, 0xe7b9a0, 0xe7b997, 0xe7b993,
+ /* 78 */ 0xe7beb5, 0xe7beb3, 0xe7bfb7, 0xe7bfb8,
+ /* 7c */ 0xe881b5, 0xe88791, 0xe88792, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe88790, 0xe8899f, 0xe8899e,
+ /* a4 */ 0xe896b4, 0xe89786, 0xe89780, 0xe89783,
+ /* a8 */ 0xe89782, 0xe896b3, 0xe896b5, 0xe896bd,
+ /* ac */ 0xe89787, 0xe89784, 0xe896bf, 0xe8978b,
+ /* b0 */ 0xe8978e, 0xe89788, 0xe89785, 0xe896b1,
+ /* b4 */ 0xe896b6, 0xe89792, 0xe898a4, 0xe896b8,
+ /* b8 */ 0xe896b7, 0xe896be, 0xe899a9, 0xe89fa7,
+ /* bc */ 0xe89fa6, 0xe89fa2, 0xe89f9b, 0xe89fab,
+ /* c0 */ 0xe89faa, 0xe89fa5, 0xe89f9f, 0xe89fb3,
+ /* c4 */ 0xe89fa4, 0xe89f94, 0xe89f9c, 0xe89f93,
+ /* c8 */ 0xe89fad, 0xe89f98, 0xe89fa3, 0xe89ea4,
+ /* cc */ 0xe89f97, 0xe89f99, 0xe8a081, 0xe89fb4,
+ /* d0 */ 0xe89fa8, 0xe89f9d, 0xe8a593, 0xe8a58b,
+ /* d4 */ 0xe8a58f, 0xe8a58c, 0xe8a586, 0xe8a590,
+ /* d8 */ 0xe8a591, 0xe8a589, 0xe8acaa, 0xe8aca7,
+ /* dc */ 0xe8aca3, 0xe8acb3, 0xe8acb0, 0xe8acb5,
+ /* e0 */ 0xe8ad87, 0xe8acaf, 0xe8acbc, 0xe8acbe,
+ /* e4 */ 0xe8acb1, 0xe8aca5, 0xe8acb7, 0xe8aca6,
+ /* e8 */ 0xe8acb6, 0xe8acae, 0xe8aca4, 0xe8acbb,
+ /* ec */ 0xe8acbd, 0xe8acba, 0xe8b182, 0xe8b1b5,
+ /* f0 */ 0xe8b299, 0xe8b298, 0xe8b297, 0xe8b3be,
+ /* f4 */ 0xe8b484, 0xe8b482, 0xe8b480, 0xe8b99c,
+ /* f8 */ 0xe8b9a2, 0xe8b9a0, 0xe8b997, 0xe8b996,
+ /* fc */ 0xe8b99e, 0xe8b9a5, 0xe8b9a7,
+
+ /*** Two byte table, leaf: f1xx - offset 0x03c09 ***/
+
+ /* 40 */ 0xe8b99b, 0xe8b99a, 0xe8b9a1, 0xe8b99d,
+ /* 44 */ 0xe8b9a9, 0xe8b994, 0xe8bd86, 0xe8bd87,
+ /* 48 */ 0xe8bd88, 0xe8bd8b, 0xe984a8, 0xe984ba,
+ /* 4c */ 0xe984bb, 0xe984be, 0xe986a8, 0xe986a5,
+ /* 50 */ 0xe986a7, 0xe986af, 0xe986aa, 0xe98eb5,
+ /* 54 */ 0xe98e8c, 0xe98e92, 0xe98eb7, 0xe98e9b,
+ /* 58 */ 0xe98e9d, 0xe98e89, 0xe98ea7, 0xe98e8e,
+ /* 5c */ 0xe98eaa, 0xe98e9e, 0xe98ea6, 0xe98e95,
+ /* 60 */ 0xe98e88, 0xe98e99, 0xe98e9f, 0xe98e8d,
+ /* 64 */ 0xe98eb1, 0xe98e91, 0xe98eb2, 0xe98ea4,
+ /* 68 */ 0xe98ea8, 0xe98eb4, 0xe98ea3, 0xe98ea5,
+ /* 6c */ 0xe99792, 0xe99793, 0xe99791, 0xe99ab3,
+ /* 70 */ 0xe99b97, 0xe99b9a, 0xe5b782, 0xe99b9f,
+ /* 74 */ 0xe99b98, 0xe99b9d, 0xe99ca3, 0xe99ca2,
+ /* 78 */ 0xe99ca5, 0xe99eac, 0xe99eae, 0xe99ea8,
+ /* 7c */ 0xe99eab, 0xe99ea4, 0xe99eaa, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe99ea2, 0xe99ea5, 0xe99f97,
+ /* a4 */ 0xe99f99, 0xe99f96, 0xe99f98, 0xe99fba,
+ /* a8 */ 0xe9a190, 0xe9a191, 0xe9a192, 0xe9a2b8,
+ /* ac */ 0xe9a581, 0xe9a4bc, 0xe9a4ba, 0xe9a88f,
+ /* b0 */ 0xe9a88b, 0xe9a889, 0xe9a88d, 0xe9a884,
+ /* b4 */ 0xe9a891, 0xe9a88a, 0xe9a885, 0xe9a887,
+ /* b8 */ 0xe9a886, 0xe9ab80, 0xe9ab9c, 0xe9ac88,
+ /* bc */ 0xe9ac84, 0xe9ac85, 0xe9aca9, 0xe9acb5,
+ /* c0 */ 0xe9ad8a, 0xe9ad8c, 0xe9ad8b, 0xe9af87,
+ /* c4 */ 0xe9af86, 0xe9af83, 0xe9aebf, 0xe9af81,
+ /* c8 */ 0xe9aeb5, 0xe9aeb8, 0xe9af93, 0xe9aeb6,
+ /* cc */ 0xe9af84, 0xe9aeb9, 0xe9aebd, 0xe9b59c,
+ /* d0 */ 0xe9b593, 0xe9b58f, 0xe9b58a, 0xe9b59b,
+ /* d4 */ 0xe9b58b, 0xe9b599, 0xe9b596, 0xe9b58c,
+ /* d8 */ 0xe9b597, 0xe9b592, 0xe9b594, 0xe9b59f,
+ /* dc */ 0xe9b598, 0xe9b59a, 0xe9ba8e, 0xe9ba8c,
+ /* e0 */ 0xe9bb9f, 0xe9bc81, 0xe9bc80, 0xe9bc96,
+ /* e4 */ 0xe9bca5, 0xe9bcab, 0xe9bcaa, 0xe9bca9,
+ /* e8 */ 0xe9bca8, 0xe9bd8c, 0xe9bd95, 0xe584b4,
+ /* ec */ 0xe584b5, 0xe58a96, 0xe58bb7, 0xe58eb4,
+ /* f0 */ 0xe59aab, 0xe59aad, 0xe59aa6, 0xe59aa7,
+ /* f4 */ 0xe59aaa, 0xe59aac, 0xe5a39a, 0xe5a39d,
+ /* f8 */ 0xe5a39b, 0xe5a492, 0xe5acbd, 0xe5acbe,
+ /* fc */ 0xe5acbf, 0xe5b783, 0xe5b9b0,
+
+ /*** Two byte table, leaf: f2xx - offset 0x03cc8 ***/
+
+ /* 40 */ 0xe5bebf, 0xe687bb, 0xe69487, 0xe69490,
+ /* 44 */ 0xe6948d, 0xe69489, 0xe6948c, 0xe6948e,
+ /* 48 */ 0xe69684, 0xe6979e, 0xe6979d, 0xe69b9e,
+ /* 4c */ 0xe6aba7, 0xe6aba0, 0xe6ab8c, 0xe6ab91,
+ /* 50 */ 0xe6ab99, 0xe6ab8b, 0xe6ab9f, 0xe6ab9c,
+ /* 54 */ 0xe6ab90, 0xe6abab, 0xe6ab8f, 0xe6ab8d,
+ /* 58 */ 0xe6ab9e, 0xe6ada0, 0xe6aeb0, 0xe6b08c,
+ /* 5c */ 0xe78099, 0xe780a7, 0xe780a0, 0xe78096,
+ /* 60 */ 0xe780ab, 0xe780a1, 0xe780a2, 0xe780a3,
+ /* 64 */ 0xe780a9, 0xe78097, 0xe780a4, 0xe7809c,
+ /* 68 */ 0xe780aa, 0xe7888c, 0xe7888a, 0xe78887,
+ /* 6c */ 0xe78882, 0xe78885, 0xe78aa5, 0xe78aa6,
+ /* 70 */ 0xe78aa4, 0xe78aa3, 0xe78aa1, 0xe7938b,
+ /* 74 */ 0xe79385, 0xe792b7, 0xe79383, 0xe79496,
+ /* 78 */ 0xe799a0, 0xe79f89, 0xe79f8a, 0xe79f84,
+ /* 7c */ 0xe79fb1, 0xe7a49d, 0xe7a49b, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7a4a1, 0xe7a49c, 0xe7a497,
+ /* a4 */ 0xe7a49e, 0xe7a6b0, 0xe7a9a7, 0xe7a9a8,
+ /* a8 */ 0xe7b0b3, 0xe7b0bc, 0xe7b0b9, 0xe7b0ac,
+ /* ac */ 0xe7b0bb, 0xe7b3ac, 0xe7b3aa, 0xe7b9b6,
+ /* b0 */ 0xe7b9b5, 0xe7b9b8, 0xe7b9b0, 0xe7b9b7,
+ /* b4 */ 0xe7b9af, 0xe7b9ba, 0xe7b9b2, 0xe7b9b4,
+ /* b8 */ 0xe7b9a8, 0xe7bd8b, 0xe7bd8a, 0xe7be83,
+ /* bc */ 0xe7be86, 0xe7beb7, 0xe7bfbd, 0xe7bfbe,
+ /* c0 */ 0xe881b8, 0xe88797, 0xe88795, 0xe889a4,
+ /* c4 */ 0xe889a1, 0xe889a3, 0xe897ab, 0xe897b1,
+ /* c8 */ 0xe897ad, 0xe89799, 0xe897a1, 0xe897a8,
+ /* cc */ 0xe8979a, 0xe89797, 0xe897ac, 0xe897b2,
+ /* d0 */ 0xe897b8, 0xe89798, 0xe8979f, 0xe897a3,
+ /* d4 */ 0xe8979c, 0xe89791, 0xe897b0, 0xe897a6,
+ /* d8 */ 0xe897af, 0xe8979e, 0xe897a2, 0xe8a080,
+ /* dc */ 0xe89fba, 0xe8a083, 0xe89fb6, 0xe89fb7,
+ /* e0 */ 0xe8a089, 0xe8a08c, 0xe8a08b, 0xe8a086,
+ /* e4 */ 0xe89fbc, 0xe8a088, 0xe89fbf, 0xe8a08a,
+ /* e8 */ 0xe8a082, 0xe8a5a2, 0xe8a59a, 0xe8a59b,
+ /* ec */ 0xe8a597, 0xe8a5a1, 0xe8a59c, 0xe8a598,
+ /* f0 */ 0xe8a59d, 0xe8a599, 0xe8a688, 0xe8a6b7,
+ /* f4 */ 0xe8a6b6, 0xe8a7b6, 0xe8ad90, 0xe8ad88,
+ /* f8 */ 0xe8ad8a, 0xe8ad80, 0xe8ad93, 0xe8ad96,
+ /* fc */ 0xe8ad94, 0xe8ad8b, 0xe8ad95,
+
+ /*** Two byte table, leaf: f3xx - offset 0x03d87 ***/
+
+ /* 40 */ 0xe8ad91, 0xe8ad82, 0xe8ad92, 0xe8ad97,
+ /* 44 */ 0xe8b183, 0xe8b1b7, 0xe8b1b6, 0xe8b29a,
+ /* 48 */ 0xe8b486, 0xe8b487, 0xe8b489, 0xe8b6ac,
+ /* 4c */ 0xe8b6aa, 0xe8b6ad, 0xe8b6ab, 0xe8b9ad,
+ /* 50 */ 0xe8b9b8, 0xe8b9b3, 0xe8b9aa, 0xe8b9af,
+ /* 54 */ 0xe8b9bb, 0xe8bb82, 0xe8bd92, 0xe8bd91,
+ /* 58 */ 0xe8bd8f, 0xe8bd90, 0xe8bd93, 0xe8beb4,
+ /* 5c */ 0xe98580, 0xe984bf, 0xe986b0, 0xe986ad,
+ /* 60 */ 0xe98f9e, 0xe98f87, 0xe98f8f, 0xe98f82,
+ /* 64 */ 0xe98f9a, 0xe98f90, 0xe98fb9, 0xe98fac,
+ /* 68 */ 0xe98f8c, 0xe98f99, 0xe98ea9, 0xe98fa6,
+ /* 6c */ 0xe98f8a, 0xe98f94, 0xe98fae, 0xe98fa3,
+ /* 70 */ 0xe98f95, 0xe98f84, 0xe98f8e, 0xe98f80,
+ /* 74 */ 0xe98f92, 0xe98fa7, 0xe995bd, 0xe9979a,
+ /* 78 */ 0xe9979b, 0xe99ba1, 0xe99ca9, 0xe99cab,
+ /* 7c */ 0xe99cac, 0xe99ca8, 0xe99ca6, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe99eb3, 0xe99eb7, 0xe99eb6,
+ /* a4 */ 0xe99f9d, 0xe99f9e, 0xe99f9f, 0xe9a19c,
+ /* a8 */ 0xe9a199, 0xe9a19d, 0xe9a197, 0xe9a2bf,
+ /* ac */ 0xe9a2bd, 0xe9a2bb, 0xe9a2be, 0xe9a588,
+ /* b0 */ 0xe9a587, 0xe9a583, 0xe9a6a6, 0xe9a6a7,
+ /* b4 */ 0xe9a89a, 0xe9a895, 0xe9a8a5, 0xe9a89d,
+ /* b8 */ 0xe9a8a4, 0xe9a89b, 0xe9a8a2, 0xe9a8a0,
+ /* bc */ 0xe9a8a7, 0xe9a8a3, 0xe9a89e, 0xe9a89c,
+ /* c0 */ 0xe9a894, 0xe9ab82, 0xe9ac8b, 0xe9ac8a,
+ /* c4 */ 0xe9ac8e, 0xe9ac8c, 0xe9acb7, 0xe9afaa,
+ /* c8 */ 0xe9afab, 0xe9afa0, 0xe9af9e, 0xe9afa4,
+ /* cc */ 0xe9afa6, 0xe9afa2, 0xe9afb0, 0xe9af94,
+ /* d0 */ 0xe9af97, 0xe9afac, 0xe9af9c, 0xe9af99,
+ /* d4 */ 0xe9afa5, 0xe9af95, 0xe9afa1, 0xe9af9a,
+ /* d8 */ 0xe9b5b7, 0xe9b681, 0xe9b68a, 0xe9b684,
+ /* dc */ 0xe9b688, 0xe9b5b1, 0xe9b680, 0xe9b5b8,
+ /* e0 */ 0xe9b686, 0xe9b68b, 0xe9b68c, 0xe9b5bd,
+ /* e4 */ 0xe9b5ab, 0xe9b5b4, 0xe9b5b5, 0xe9b5b0,
+ /* e8 */ 0xe9b5a9, 0xe9b685, 0xe9b5b3, 0xe9b5bb,
+ /* ec */ 0xe9b682, 0xe9b5af, 0xe9b5b9, 0xe9b5bf,
+ /* f0 */ 0xe9b687, 0xe9b5a8, 0xe9ba94, 0xe9ba91,
+ /* f4 */ 0xe9bb80, 0xe9bbbc, 0xe9bcad, 0xe9bd80,
+ /* f8 */ 0xe9bd81, 0xe9bd8d, 0xe9bd96, 0xe9bd97,
+ /* fc */ 0xe9bd98, 0xe58cb7, 0xe59ab2,
+
+ /*** Two byte table, leaf: f4xx - offset 0x03e46 ***/
+
+ /* 40 */ 0xe59ab5, 0xe59ab3, 0xe5a3a3, 0xe5ad85,
+ /* 44 */ 0xe5b786, 0xe5b787, 0xe5bbae, 0xe5bbaf,
+ /* 48 */ 0xe5bf80, 0xe5bf81, 0xe687b9, 0xe69497,
+ /* 4c */ 0xe69496, 0xe69495, 0xe69493, 0xe6979f,
+ /* 50 */ 0xe69ba8, 0xe69ba3, 0xe69ba4, 0xe6abb3,
+ /* 54 */ 0xe6abb0, 0xe6abaa, 0xe6aba8, 0xe6abb9,
+ /* 58 */ 0xe6abb1, 0xe6abae, 0xe6abaf, 0xe780bc,
+ /* 5c */ 0xe780b5, 0xe780af, 0xe780b7, 0xe780b4,
+ /* 60 */ 0xe780b1, 0xe78182, 0xe780b8, 0xe780bf,
+ /* 64 */ 0xe780ba, 0xe780b9, 0xe78180, 0xe780bb,
+ /* 68 */ 0xe780b3, 0xe78181, 0xe78893, 0xe78894,
+ /* 6c */ 0xe78aa8, 0xe78dbd, 0xe78dbc, 0xe792ba,
+ /* 70 */ 0xe79aab, 0xe79aaa, 0xe79abe, 0xe79bad,
+ /* 74 */ 0xe79f8c, 0xe79f8e, 0xe79f8f, 0xe79f8d,
+ /* 78 */ 0xe79fb2, 0xe7a4a5, 0xe7a4a3, 0xe7a4a7,
+ /* 7c */ 0xe7a4a8, 0xe7a4a4, 0xe7a4a9, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe7a6b2, 0xe7a9ae, 0xe7a9ac,
+ /* a4 */ 0xe7a9ad, 0xe7abb7, 0xe7b189, 0xe7b188,
+ /* a8 */ 0xe7b18a, 0xe7b187, 0xe7b185, 0xe7b3ae,
+ /* ac */ 0xe7b9bb, 0xe7b9be, 0xe7ba81, 0xe7ba80,
+ /* b0 */ 0xe7beba, 0xe7bfbf, 0xe881b9, 0xe8879b,
+ /* b4 */ 0xe88799, 0xe8888b, 0xe889a8, 0xe889a9,
+ /* b8 */ 0xe898a2, 0xe897bf, 0xe89881, 0xe897be,
+ /* bc */ 0xe8989b, 0xe89880, 0xe897b6, 0xe89884,
+ /* c0 */ 0xe89889, 0xe89885, 0xe8988c, 0xe897bd,
+ /* c4 */ 0xe8a099, 0xe8a090, 0xe8a091, 0xe8a097,
+ /* c8 */ 0xe8a093, 0xe8a096, 0xe8a5a3, 0xe8a5a6,
+ /* cc */ 0xe8a6b9, 0xe8a7b7, 0xe8ada0, 0xe8adaa,
+ /* d0 */ 0xe8ad9d, 0xe8ada8, 0xe8ada3, 0xe8ada5,
+ /* d4 */ 0xe8ada7, 0xe8adad, 0xe8b6ae, 0xe8ba86,
+ /* d8 */ 0xe8ba88, 0xe8ba84, 0xe8bd99, 0xe8bd96,
+ /* dc */ 0xe8bd97, 0xe8bd95, 0xe8bd98, 0xe8bd9a,
+ /* e0 */ 0xe9828d, 0xe98583, 0xe98581, 0xe986b7,
+ /* e4 */ 0xe986b5, 0xe986b2, 0xe986b3, 0xe9908b,
+ /* e8 */ 0xe99093, 0xe98fbb, 0xe990a0, 0xe9908f,
+ /* ec */ 0xe99094, 0xe98fbe, 0xe99095, 0xe99090,
+ /* f0 */ 0xe990a8, 0xe99099, 0xe9908d, 0xe98fb5,
+ /* f4 */ 0xe99080, 0xe98fb7, 0xe99087, 0xe9908e,
+ /* f8 */ 0xe99096, 0xe99092, 0xe98fba, 0xe99089,
+ /* fc */ 0xe98fb8, 0xe9908a, 0xe98fbf,
+
+ /*** Two byte table, leaf: f5xx - offset 0x03f05 ***/
+
+ /* 40 */ 0xe98fbc, 0xe9908c, 0xe98fb6, 0xe99091,
+ /* 44 */ 0xe99086, 0xe9979e, 0xe997a0, 0xe9979f,
+ /* 48 */ 0xe99cae, 0xe99caf, 0xe99eb9, 0xe99ebb,
+ /* 4c */ 0xe99fbd, 0xe99fbe, 0xe9a1a0, 0xe9a1a2,
+ /* 50 */ 0xe9a1a3, 0xe9a19f, 0xe9a381, 0xe9a382,
+ /* 54 */ 0xe9a590, 0xe9a58e, 0xe9a599, 0xe9a58c,
+ /* 58 */ 0xe9a58b, 0xe9a593, 0xe9a8b2, 0xe9a8b4,
+ /* 5c */ 0xe9a8b1, 0xe9a8ac, 0xe9a8aa, 0xe9a8b6,
+ /* 60 */ 0xe9a8a9, 0xe9a8ae, 0xe9a8b8, 0xe9a8ad,
+ /* 64 */ 0xe9ab87, 0xe9ab8a, 0xe9ab86, 0xe9ac90,
+ /* 68 */ 0xe9ac92, 0xe9ac91, 0xe9b08b, 0xe9b088,
+ /* 6c */ 0xe9afb7, 0xe9b085, 0xe9b092, 0xe9afb8,
+ /* 70 */ 0xe9b180, 0xe9b087, 0xe9b08e, 0xe9b086,
+ /* 74 */ 0xe9b097, 0xe9b094, 0xe9b089, 0xe9b69f,
+ /* 78 */ 0xe9b699, 0xe9b6a4, 0xe9b69d, 0xe9b692,
+ /* 7c */ 0xe9b698, 0xe9b690, 0xe9b69b, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9b6a0, 0xe9b694, 0xe9b69c,
+ /* a4 */ 0xe9b6aa, 0xe9b697, 0xe9b6a1, 0xe9b69a,
+ /* a8 */ 0xe9b6a2, 0xe9b6a8, 0xe9b69e, 0xe9b6a3,
+ /* ac */ 0xe9b6bf, 0xe9b6a9, 0xe9b696, 0xe9b6a6,
+ /* b0 */ 0xe9b6a7, 0xe9ba99, 0xe9ba9b, 0xe9ba9a,
+ /* b4 */ 0xe9bba5, 0xe9bba4, 0xe9bba7, 0xe9bba6,
+ /* b8 */ 0xe9bcb0, 0xe9bcae, 0xe9bd9b, 0xe9bda0,
+ /* bc */ 0xe9bd9e, 0xe9bd9d, 0xe9bd99, 0xe9be91,
+ /* c0 */ 0xe584ba, 0xe584b9, 0xe58a98, 0xe58a97,
+ /* c4 */ 0xe59b83, 0xe59abd, 0xe59abe, 0xe5ad88,
+ /* c8 */ 0xe5ad87, 0xe5b78b, 0xe5b78f, 0xe5bbb1,
+ /* cc */ 0xe687bd, 0xe6949b, 0xe6ac82, 0xe6abbc,
+ /* d0 */ 0xe6ac83, 0xe6abb8, 0xe6ac80, 0xe78183,
+ /* d4 */ 0xe78184, 0xe7818a, 0xe78188, 0xe78189,
+ /* d8 */ 0xe78185, 0xe78186, 0xe7889d, 0xe7889a,
+ /* dc */ 0xe78899, 0xe78dbe, 0xe79497, 0xe799aa,
+ /* e0 */ 0xe79f90, 0xe7a4ad, 0xe7a4b1, 0xe7a4af,
+ /* e4 */ 0xe7b194, 0xe7b193, 0xe7b3b2, 0xe7ba8a,
+ /* e8 */ 0xe7ba87, 0xe7ba88, 0xe7ba8b, 0xe7ba86,
+ /* ec */ 0xe7ba8d, 0xe7bd8d, 0xe7bebb, 0xe880b0,
+ /* f0 */ 0xe8879d, 0xe89898, 0xe898aa, 0xe898a6,
+ /* f4 */ 0xe8989f, 0xe898a3, 0xe8989c, 0xe89899,
+ /* f8 */ 0xe898a7, 0xe898ae, 0xe898a1, 0xe898a0,
+ /* fc */ 0xe898a9, 0xe8989e, 0xe898a5,
+
+ /*** Two byte table, leaf: f6xx - offset 0x03fc4 ***/
+
+ /* 40 */ 0xe8a0a9, 0xe8a09d, 0xe8a09b, 0xe8a0a0,
+ /* 44 */ 0xe8a0a4, 0xe8a09c, 0xe8a0ab, 0xe8a18a,
+ /* 48 */ 0xe8a5ad, 0xe8a5a9, 0xe8a5ae, 0xe8a5ab,
+ /* 4c */ 0xe8a7ba, 0xe8adb9, 0xe8adb8, 0xe8ad85,
+ /* 50 */ 0xe8adba, 0xe8adbb, 0xe8b490, 0xe8b494,
+ /* 54 */ 0xe8b6af, 0xe8ba8e, 0xe8ba8c, 0xe8bd9e,
+ /* 58 */ 0xe8bd9b, 0xe8bd9d, 0xe98586, 0xe98584,
+ /* 5c */ 0xe98585, 0xe986b9, 0xe990bf, 0xe990bb,
+ /* 60 */ 0xe990b6, 0xe990a9, 0xe990bd, 0xe990bc,
+ /* 64 */ 0xe990b0, 0xe990b9, 0xe990aa, 0xe990b7,
+ /* 68 */ 0xe990ac, 0xe99180, 0xe990b1, 0xe997a5,
+ /* 6c */ 0xe997a4, 0xe997a3, 0xe99cb5, 0xe99cba,
+ /* 70 */ 0xe99ebf, 0xe99fa1, 0xe9a1a4, 0xe9a389,
+ /* 74 */ 0xe9a386, 0xe9a380, 0xe9a598, 0xe9a596,
+ /* 78 */ 0xe9a8b9, 0xe9a8bd, 0xe9a986, 0xe9a984,
+ /* 7c */ 0xe9a982, 0xe9a981, 0xe9a8ba, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9a8bf, 0xe9ab8d, 0xe9ac95,
+ /* a4 */ 0xe9ac97, 0xe9ac98, 0xe9ac96, 0xe9acba,
+ /* a8 */ 0xe9ad92, 0xe9b0ab, 0xe9b09d, 0xe9b09c,
+ /* ac */ 0xe9b0ac, 0xe9b0a3, 0xe9b0a8, 0xe9b0a9,
+ /* b0 */ 0xe9b0a4, 0xe9b0a1, 0xe9b6b7, 0xe9b6b6,
+ /* b4 */ 0xe9b6bc, 0xe9b781, 0xe9b787, 0xe9b78a,
+ /* b8 */ 0xe9b78f, 0xe9b6be, 0xe9b785, 0xe9b783,
+ /* bc */ 0xe9b6bb, 0xe9b6b5, 0xe9b78e, 0xe9b6b9,
+ /* c0 */ 0xe9b6ba, 0xe9b6ac, 0xe9b788, 0xe9b6b1,
+ /* c4 */ 0xe9b6ad, 0xe9b78c, 0xe9b6b3, 0xe9b78d,
+ /* c8 */ 0xe9b6b2, 0xe9b9ba, 0xe9ba9c, 0xe9bbab,
+ /* cc */ 0xe9bbae, 0xe9bbad, 0xe9bc9b, 0xe9bc98,
+ /* d0 */ 0xe9bc9a, 0xe9bcb1, 0xe9bd8e, 0xe9bda5,
+ /* d4 */ 0xe9bda4, 0xe9be92, 0xe4bab9, 0xe59b86,
+ /* d8 */ 0xe59b85, 0xe59b8b, 0xe5a5b1, 0xe5ad8b,
+ /* dc */ 0xe5ad8c, 0xe5b795, 0xe5b791, 0xe5bbb2,
+ /* e0 */ 0xe694a1, 0xe694a0, 0xe694a6, 0xe694a2,
+ /* e4 */ 0xe6ac8b, 0xe6ac88, 0xe6ac89, 0xe6b08d,
+ /* e8 */ 0xe78195, 0xe78196, 0xe78197, 0xe78192,
+ /* ec */ 0xe7889e, 0xe7889f, 0xe78aa9, 0xe78dbf,
+ /* f0 */ 0xe79398, 0xe79395, 0xe79399, 0xe79397,
+ /* f4 */ 0xe799ad, 0xe79aad, 0xe7a4b5, 0xe7a6b4,
+ /* f8 */ 0xe7a9b0, 0xe7a9b1, 0xe7b197, 0xe7b19c,
+ /* fc */ 0xe7b199, 0xe7b19b, 0xe7b19a,
+
+ /*** Two byte table, leaf: f7xx - offset 0x04083 ***/
+
+ /* 40 */ 0xe7b3b4, 0xe7b3b1, 0xe7ba91, 0xe7bd8f,
+ /* 44 */ 0xe7be87, 0xe8879e, 0xe889ab, 0xe898b4,
+ /* 48 */ 0xe898b5, 0xe898b3, 0xe898ac, 0xe898b2,
+ /* 4c */ 0xe898b6, 0xe8a0ac, 0xe8a0a8, 0xe8a0a6,
+ /* 50 */ 0xe8a0aa, 0xe8a0a5, 0xe8a5b1, 0xe8a6bf,
+ /* 54 */ 0xe8a6be, 0xe8a7bb, 0xe8adbe, 0xe8ae84,
+ /* 58 */ 0xe8ae82, 0xe8ae86, 0xe8ae85, 0xe8adbf,
+ /* 5c */ 0xe8b495, 0xe8ba95, 0xe8ba94, 0xe8ba9a,
+ /* 60 */ 0xe8ba92, 0xe8ba90, 0xe8ba96, 0xe8ba97,
+ /* 64 */ 0xe8bda0, 0xe8bda2, 0xe98587, 0xe9918c,
+ /* 68 */ 0xe99190, 0xe9918a, 0xe9918b, 0xe9918f,
+ /* 6c */ 0xe99187, 0xe99185, 0xe99188, 0xe99189,
+ /* 70 */ 0xe99186, 0xe99cbf, 0xe99fa3, 0xe9a1aa,
+ /* 74 */ 0xe9a1a9, 0xe9a38b, 0xe9a594, 0xe9a59b,
+ /* 78 */ 0xe9a98e, 0xe9a993, 0xe9a994, 0xe9a98c,
+ /* 7c */ 0xe9a98f, 0xe9a988, 0xe9a98a, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9a989, 0xe9a992, 0xe9a990,
+ /* a4 */ 0xe9ab90, 0xe9ac99, 0xe9acab, 0xe9acbb,
+ /* a8 */ 0xe9ad96, 0xe9ad95, 0xe9b186, 0xe9b188,
+ /* ac */ 0xe9b0bf, 0xe9b184, 0xe9b0b9, 0xe9b0b3,
+ /* b0 */ 0xe9b181, 0xe9b0bc, 0xe9b0b7, 0xe9b0b4,
+ /* b4 */ 0xe9b0b2, 0xe9b0bd, 0xe9b0b6, 0xe9b79b,
+ /* b8 */ 0xe9b792, 0xe9b79e, 0xe9b79a, 0xe9b78b,
+ /* bc */ 0xe9b790, 0xe9b79c, 0xe9b791, 0xe9b79f,
+ /* c0 */ 0xe9b7a9, 0xe9b799, 0xe9b798, 0xe9b796,
+ /* c4 */ 0xe9b7b5, 0xe9b795, 0xe9b79d, 0xe9bab6,
+ /* c8 */ 0xe9bbb0, 0xe9bcb5, 0xe9bcb3, 0xe9bcb2,
+ /* cc */ 0xe9bd82, 0xe9bdab, 0xe9be95, 0xe9bea2,
+ /* d0 */ 0xe584bd, 0xe58a99, 0xe5a3a8, 0xe5a3a7,
+ /* d4 */ 0xe5a5b2, 0xe5ad8d, 0xe5b798, 0xe8a0af,
+ /* d8 */ 0xe5bd8f, 0xe68881, 0xe68883, 0xe68884,
+ /* dc */ 0xe694a9, 0xe694a5, 0xe69696, 0xe69bab,
+ /* e0 */ 0xe6ac91, 0xe6ac92, 0xe6ac8f, 0xe6af8a,
+ /* e4 */ 0xe7819b, 0xe7819a, 0xe788a2, 0xe78e82,
+ /* e8 */ 0xe78e81, 0xe78e83, 0xe799b0, 0xe79f94,
+ /* ec */ 0xe7b1a7, 0xe7b1a6, 0xe7ba95, 0xe889ac,
+ /* f0 */ 0xe898ba, 0xe89980, 0xe898b9, 0xe898bc,
+ /* f4 */ 0xe898b1, 0xe898bb, 0xe898be, 0xe8a0b0,
+ /* f8 */ 0xe8a0b2, 0xe8a0ae, 0xe8a0b3, 0xe8a5b6,
+ /* fc */ 0xe8a5b4, 0xe8a5b3, 0xe8a7be,
+
+ /*** Two byte table, leaf: f8xx - offset 0x04142 ***/
+
+ /* 40 */ 0xe8ae8c, 0xe8ae8e, 0xe8ae8b, 0xe8ae88,
+ /* 44 */ 0xe8b185, 0xe8b499, 0xe8ba98, 0xe8bda4,
+ /* 48 */ 0xe8bda3, 0xe986bc, 0xe991a2, 0xe99195,
+ /* 4c */ 0xe9919d, 0xe99197, 0xe9919e, 0xe99f84,
+ /* 50 */ 0xe99f85, 0xe9a080, 0xe9a996, 0xe9a999,
+ /* 54 */ 0xe9ac9e, 0xe9ac9f, 0xe9aca0, 0xe9b192,
+ /* 58 */ 0xe9b198, 0xe9b190, 0xe9b18a, 0xe9b18d,
+ /* 5c */ 0xe9b18b, 0xe9b195, 0xe9b199, 0xe9b18c,
+ /* 60 */ 0xe9b18e, 0xe9b7bb, 0xe9b7b7, 0xe9b7af,
+ /* 64 */ 0xe9b7a3, 0xe9b7ab, 0xe9b7b8, 0xe9b7a4,
+ /* 68 */ 0xe9b7b6, 0xe9b7a1, 0xe9b7ae, 0xe9b7a6,
+ /* 6c */ 0xe9b7b2, 0xe9b7b0, 0xe9b7a2, 0xe9b7ac,
+ /* 70 */ 0xe9b7b4, 0xe9b7b3, 0xe9b7a8, 0xe9b7ad,
+ /* 74 */ 0xe9bb82, 0xe9bb90, 0xe9bbb2, 0xe9bbb3,
+ /* 78 */ 0xe9bc86, 0xe9bc9c, 0xe9bcb8, 0xe9bcb7,
+ /* 7c */ 0xe9bcb6, 0xe9bd83, 0xe9bd8f, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9bdb1, 0xe9bdb0, 0xe9bdae,
+ /* a4 */ 0xe9bdaf, 0xe59b93, 0xe59b8d, 0xe5ad8e,
+ /* a8 */ 0xe5b1ad, 0xe694ad, 0xe69bad, 0xe69bae,
+ /* ac */ 0xe6ac93, 0xe7819f, 0xe781a1, 0xe7819d,
+ /* b0 */ 0xe781a0, 0xe788a3, 0xe7939b, 0xe793a5,
+ /* b4 */ 0xe79f95, 0xe7a4b8, 0xe7a6b7, 0xe7a6b6,
+ /* b8 */ 0xe7b1aa, 0xe7ba97, 0xe7be89, 0xe889ad,
+ /* bc */ 0xe89983, 0xe8a0b8, 0xe8a0b7, 0xe8a0b5,
+ /* c0 */ 0xe8a18b, 0xe8ae94, 0xe8ae95, 0xe8ba9e,
+ /* c4 */ 0xe8ba9f, 0xe8baa0, 0xe8ba9d, 0xe986be,
+ /* c8 */ 0xe986bd, 0xe98782, 0xe991ab, 0xe991a8,
+ /* cc */ 0xe991a9, 0xe99ba5, 0xe99d86, 0xe99d83,
+ /* d0 */ 0xe99d87, 0xe99f87, 0xe99fa5, 0xe9a99e,
+ /* d4 */ 0xe9ab95, 0xe9ad99, 0xe9b1a3, 0xe9b1a7,
+ /* d8 */ 0xe9b1a6, 0xe9b1a2, 0xe9b19e, 0xe9b1a0,
+ /* dc */ 0xe9b882, 0xe9b7be, 0xe9b887, 0xe9b883,
+ /* e0 */ 0xe9b886, 0xe9b885, 0xe9b880, 0xe9b881,
+ /* e4 */ 0xe9b889, 0xe9b7bf, 0xe9b7bd, 0xe9b884,
+ /* e8 */ 0xe9baa0, 0xe9bc9e, 0xe9bd86, 0xe9bdb4,
+ /* ec */ 0xe9bdb5, 0xe9bdb6, 0xe59b94, 0xe694ae,
+ /* f0 */ 0xe696b8, 0xe6ac98, 0xe6ac99, 0xe6ac97,
+ /* f4 */ 0xe6ac9a, 0xe781a2, 0xe788a6, 0xe78aaa,
+ /* f8 */ 0xe79f98, 0xe79f99, 0xe7a4b9, 0xe7b1a9,
+ /* fc */ 0xe7b1ab, 0xe7b3b6, 0xe7ba9a,
+
+ /*** Two byte table, leaf: f9xx - offset 0x04201 ***/
+
+ /* 40 */ 0xe7ba98, 0xe7ba9b, 0xe7ba99, 0xe887a0,
+ /* 44 */ 0xe887a1, 0xe89986, 0xe89987, 0xe89988,
+ /* 48 */ 0xe8a5b9, 0xe8a5ba, 0xe8a5bc, 0xe8a5bb,
+ /* 4c */ 0xe8a7bf, 0xe8ae98, 0xe8ae99, 0xe8baa5,
+ /* 50 */ 0xe8baa4, 0xe8baa3, 0xe991ae, 0xe991ad,
+ /* 54 */ 0xe991af, 0xe991b1, 0xe991b3, 0xe99d89,
+ /* 58 */ 0xe9a1b2, 0xe9a59f, 0xe9b1a8, 0xe9b1ae,
+ /* 5c */ 0xe9b1ad, 0xe9b88b, 0xe9b88d, 0xe9b890,
+ /* 60 */ 0xe9b88f, 0xe9b892, 0xe9b891, 0xe9baa1,
+ /* 64 */ 0xe9bbb5, 0xe9bc89, 0xe9bd87, 0xe9bdb8,
+ /* 68 */ 0xe9bdbb, 0xe9bdba, 0xe9bdb9, 0xe59c9e,
+ /* 6c */ 0xe781a6, 0xe7b1af, 0xe8a0bc, 0xe8b6b2,
+ /* 70 */ 0xe8baa6, 0xe98783, 0xe991b4, 0xe991b8,
+ /* 74 */ 0xe991b6, 0xe991b5, 0xe9a9a0, 0xe9b1b4,
+ /* 78 */ 0xe9b1b3, 0xe9b1b1, 0xe9b1b5, 0xe9b894,
+ /* 7c */ 0xe9b893, 0xe9bbb6, 0xe9bc8a, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe9bea4, 0xe781a8, 0xe781a5,
+ /* a4 */ 0xe7b3b7, 0xe899aa, 0xe8a0be, 0xe8a0bd,
+ /* a8 */ 0xe8a0bf, 0xe8ae9e, 0xe8b29c, 0xe8baa9,
+ /* ac */ 0xe8bb89, 0xe99d8b, 0xe9a1b3, 0xe9a1b4,
+ /* b0 */ 0xe9a38c, 0xe9a5a1, 0xe9a6ab, 0xe9a9a4,
+ /* b4 */ 0xe9a9a6, 0xe9a9a7, 0xe9aca4, 0xe9b895,
+ /* b8 */ 0xe9b897, 0xe9bd88, 0xe68887, 0xe6ac9e,
+ /* bc */ 0xe788a7, 0xe8998c, 0xe8baa8, 0xe99282,
+ /* c0 */ 0xe99280, 0xe99281, 0xe9a9a9, 0xe9a9a8,
+ /* c4 */ 0xe9acae, 0xe9b899, 0xe788a9, 0xe8998b,
+ /* c8 */ 0xe8ae9f, 0xe99283, 0xe9b1b9, 0xe9bab7,
+ /* cc */ 0xe799b5, 0xe9a9ab, 0xe9b1ba, 0xe9b89d,
+ /* d0 */ 0xe781a9, 0xe781aa, 0xe9baa4, 0xe9bdbe,
+ /* d4 */ 0xe9bd89, 0xe9be98, 0xe7a281, 0xe98ab9,
+ /* d8 */ 0xe8a38f, 0xe5a2bb, 0xe68192, 0xe7b2a7,
+ /* dc */ 0xe5abba, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/convutils.pm b/src/backend/utils/mb/Unicode/convutils.pm
new file mode 100644
index 0000000..d774ce3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/convutils.pm
@@ -0,0 +1,838 @@
+#
+# Copyright (c) 2001-2022, PostgreSQL Global Development Group
+#
+# src/backend/utils/mb/Unicode/convutils.pm
+
+package convutils;
+
+use strict;
+use warnings;
+
+use Carp;
+use Exporter 'import';
+
+our @EXPORT =
+ qw( NONE TO_UNICODE FROM_UNICODE BOTH read_source print_conversion_tables);
+
+# Constants used in the 'direction' field of the character maps
+use constant {
+ NONE => 0,
+ TO_UNICODE => 1,
+ FROM_UNICODE => 2,
+ BOTH => 3
+};
+
+#######################################################################
+# read_source - common routine to read source file
+#
+# fname ; input file name
+#
+sub read_source
+{
+ my ($fname) = @_;
+ my @r;
+
+ open(my $in, '<', $fname) || die("cannot open $fname");
+
+ while (<$in>)
+ {
+ next if (/^#/);
+ chop;
+
+ next if (/^$/); # Ignore empty lines
+
+ next if (/^0x([0-9A-F]+)\s+(#.*)$/);
+
+ # The Unicode source files have three columns
+ # 1: The "foreign" code (in hex)
+ # 2: Unicode code point (in hex)
+ # 3: Unicode name
+ if (!/^0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\s+(#.*)$/)
+ {
+ print STDERR "READ ERROR at line $. in $fname: $_\n";
+ exit;
+ }
+ my $out = {
+ code => hex($1),
+ ucs => hex($2),
+ comment => $4,
+ direction => BOTH,
+ f => $fname,
+ l => $.
+ };
+
+ # Ignore pure ASCII mappings. PostgreSQL character conversion code
+ # never even passes these to the conversion code.
+ next if ($out->{code} < 0x80 || $out->{ucs} < 0x80);
+
+ push(@r, $out);
+ }
+ close($in);
+
+ return \@r;
+}
+
+##################################################################
+# print_conversion_tables - output mapping tables
+#
+# print_conversion_tables($this_script, $csname, \%charset)
+#
+# this_script - the name of the *caller script* of this feature
+# csname - character set name other than ucs
+# charset - ref to character set array
+#
+# Input character set array format:
+#
+# Each element in the character set array is a hash. Each hash has the following fields:
+# direction - BOTH, TO_UNICODE, or FROM_UNICODE (or NONE, to ignore the entry altogether)
+# ucs - Unicode code point
+# ucs_second - Second Unicode code point, if this is a "combined" character.
+# code - Byte sequence in the "other" character set, as an integer
+# comment - Text representation of the character
+# f - Source filename
+# l - Line number in source file
+#
+sub print_conversion_tables
+{
+ my ($this_script, $csname, $charset) = @_;
+
+ print_conversion_tables_direction($this_script, $csname, FROM_UNICODE,
+ $charset);
+ print_conversion_tables_direction($this_script, $csname, TO_UNICODE,
+ $charset);
+ return;
+}
+
+#############################################################################
+# INTERNAL ROUTINES
+
+#######################################################################
+# print_conversion_tables_direction - write the whole content of C source of radix tree
+#
+# print_conversion_tables_direction($this_script, $csname, $direction, \%charset, $tblwidth)
+#
+# this_script - the name of the *caller script* of this feature
+# csname - character set name other than ucs
+# direction - desired direction, TO_UNICODE or FROM_UNICODE
+# charset - ref to character set array
+#
+sub print_conversion_tables_direction
+{
+ my ($this_script, $csname, $direction, $charset) = @_;
+
+ my $fname;
+ my $tblname;
+ if ($direction == TO_UNICODE)
+ {
+ $fname = lc("${csname}_to_utf8.map");
+ $tblname = lc("${csname}_to_unicode_tree");
+
+ print "- Writing ${csname}=>UTF8 conversion table: $fname\n";
+ }
+ else
+ {
+ $fname = lc("utf8_to_${csname}.map");
+ $tblname = lc("${csname}_from_unicode_tree");
+
+ print "- Writing UTF8=>${csname} conversion table: $fname\n";
+ }
+
+ open(my $out, '>', $fname) || die("cannot open $fname");
+
+ print $out "/* src/backend/utils/mb/Unicode/$fname */\n";
+ print $out "/* This file is generated by $this_script */\n\n";
+
+ # Collect regular, non-combined, mappings, and create the radix tree from them.
+ my $charmap = &make_charmap($out, $charset, $direction, 0);
+ print_radix_table($out, $tblname, $charmap);
+
+ # Collect combined characters, and create combined character table (if any)
+ my $charmap_combined = &make_charmap_combined($charset, $direction);
+
+ if (scalar @{$charmap_combined} > 0)
+ {
+ if ($direction == TO_UNICODE)
+ {
+ print_to_utf8_combined_map($out, $csname, $charmap_combined, 1);
+ }
+ else
+ {
+ print_from_utf8_combined_map($out, $csname, $charmap_combined, 1);
+ }
+ }
+
+ close($out);
+ return;
+}
+
+sub print_from_utf8_combined_map
+{
+ my ($out, $charset, $table, $verbose) = @_;
+
+ my $last_comment = "";
+
+ printf $out "\n/* Combined character map */\n";
+ printf $out
+ "static const pg_utf_to_local_combined ULmap${charset}_combined[%d] = {",
+ scalar(@$table);
+ my $first = 1;
+ foreach my $i (sort { $a->{utf8} <=> $b->{utf8} } @$table)
+ {
+ print($out ",") if (!$first);
+ $first = 0;
+ print $out "\t/* $last_comment */"
+ if ($verbose && $last_comment ne "");
+
+ printf $out "\n {0x%08x, 0x%08x, 0x%04x}",
+ $i->{utf8}, $i->{utf8_second}, $i->{code};
+ if ($verbose >= 2)
+ {
+ $last_comment =
+ sprintf("%s:%d %s", $i->{f}, $i->{l}, $i->{comment});
+ }
+ elsif ($verbose >= 1)
+ {
+ $last_comment = $i->{comment};
+ }
+ }
+ print $out "\t/* $last_comment */" if ($verbose && $last_comment ne "");
+ print $out "\n};\n";
+ return;
+}
+
+sub print_to_utf8_combined_map
+{
+ my ($out, $charset, $table, $verbose) = @_;
+
+ my $last_comment = "";
+
+ printf $out "\n/* Combined character map */\n";
+ printf $out
+ "static const pg_local_to_utf_combined LUmap${charset}_combined[%d] = {",
+ scalar(@$table);
+
+ my $first = 1;
+ foreach my $i (sort { $a->{code} <=> $b->{code} } @$table)
+ {
+ print($out ",") if (!$first);
+ $first = 0;
+ print $out "\t/* $last_comment */"
+ if ($verbose && $last_comment ne "");
+
+ printf $out "\n {0x%04x, 0x%08x, 0x%08x}",
+ $i->{code}, $i->{utf8}, $i->{utf8_second};
+
+ if ($verbose >= 2)
+ {
+ $last_comment =
+ sprintf("%s:%d %s", $i->{f}, $i->{l}, $i->{comment});
+ }
+ elsif ($verbose >= 1)
+ {
+ $last_comment = $i->{comment};
+ }
+ }
+ print $out "\t/* $last_comment */" if ($verbose && $last_comment ne "");
+ print $out "\n};\n";
+ return;
+}
+
+#######################################################################
+# print_radix_table(<output handle>, <table name>, <charmap hash ref>)
+#
+# Input: A hash, mapping an input character to an output character.
+#
+# Constructs a radix tree from the hash, and prints it out as a C-struct.
+#
+sub print_radix_table
+{
+ my ($out, $tblname, $c) = @_;
+
+ ###
+ ### Build radix trees in memory, for 1-, 2-, 3- and 4-byte inputs. Each
+ ### radix tree is represented as a nested hash, each hash indexed by
+ ### input byte
+ ###
+ my %b1map;
+ my %b2map;
+ my %b3map;
+ my %b4map;
+ foreach my $in (keys %$c)
+ {
+ my $out = $c->{$in};
+
+ if ($in <= 0xff)
+ {
+ $b1map{$in} = $out;
+ }
+ elsif ($in <= 0xffff)
+ {
+ my $b1 = $in >> 8;
+ my $b2 = $in & 0xff;
+
+ $b2map{$b1}{$b2} = $out;
+ }
+ elsif ($in <= 0xffffff)
+ {
+ my $b1 = $in >> 16;
+ my $b2 = ($in >> 8) & 0xff;
+ my $b3 = $in & 0xff;
+
+ $b3map{$b1}{$b2}{$b3} = $out;
+ }
+ elsif ($in <= 0xffffffff)
+ {
+ my $b1 = $in >> 24;
+ my $b2 = ($in >> 16) & 0xff;
+ my $b3 = ($in >> 8) & 0xff;
+ my $b4 = $in & 0xff;
+
+ $b4map{$b1}{$b2}{$b3}{$b4} = $out;
+ }
+ else
+ {
+ die sprintf("up to 4 byte code is supported: %x", $in);
+ }
+ }
+
+ my @segments;
+
+ ###
+ ### Build a linear list of "segments", from the nested hashes.
+ ###
+ ### Each segment is a lookup table, keyed by the next byte in the input.
+ ### The segments are written out physically to one big array in the final
+ ### step, but logically, they form a radix tree. Or rather, four radix
+ ### trees: one for 1-byte inputs, another for 2-byte inputs, 3-byte
+ ### inputs, and 4-byte inputs.
+ ###
+ ### Each segment is represented by a hash with following fields:
+ ###
+ ### comment => <string to output as a comment>
+ ### label => <label that can be used to refer to this segment from elsewhere>
+ ### values => <a hash, keyed by byte, 0-0xff>
+ ###
+ ### Entries in 'values' can be integers (for leaf-level segments), or
+ ### string labels, pointing to a segment with that label. Any missing
+ ### values are treated as zeros. If 'values' hash is missing altogether,
+ ### it's treated as all-zeros.
+ ###
+ ### Subsequent steps will enrich the segments with more fields.
+ ###
+
+ # Add the segments for the radix trees themselves.
+ push @segments,
+ build_segments_from_tree("Single byte table", "1-byte", 1, \%b1map);
+ push @segments,
+ build_segments_from_tree("Two byte table", "2-byte", 2, \%b2map);
+ push @segments,
+ build_segments_from_tree("Three byte table", "3-byte", 3, \%b3map);
+ push @segments,
+ build_segments_from_tree("Four byte table", "4-byte", 4, \%b4map);
+
+ ###
+ ### Find min and max index used in each level of each tree.
+ ###
+ ### These are stored separately, and we can then leave out the unused
+ ### parts of every segment. (When using the resulting tree, you must
+ ### check each input byte against the min and max.)
+ ###
+ my %min_idx;
+ my %max_idx;
+ foreach my $seg (@segments)
+ {
+ my $this_min = $min_idx{ $seg->{depth} }->{ $seg->{level} };
+ my $this_max = $max_idx{ $seg->{depth} }->{ $seg->{level} };
+
+ foreach my $i (keys %{ $seg->{values} })
+ {
+ $this_min = $i if (!defined $this_min || $i < $this_min);
+ $this_max = $i if (!defined $this_max || $i > $this_max);
+ }
+
+ $min_idx{ $seg->{depth} }{ $seg->{level} } = $this_min;
+ $max_idx{ $seg->{depth} }{ $seg->{level} } = $this_max;
+ }
+
+ # Copy the mins and max's back to every segment, for convenience.
+ foreach my $seg (@segments)
+ {
+ $seg->{min_idx} = $min_idx{ $seg->{depth} }{ $seg->{level} };
+ $seg->{max_idx} = $max_idx{ $seg->{depth} }{ $seg->{level} };
+ }
+
+ ###
+ ### Prepend a dummy all-zeros map to the beginning.
+ ###
+ ### A 0 is an invalid value anywhere in the table, and this allows us to
+ ### point to 0 offset from any table, to get a 0 result.
+ ###
+
+ # Find the max range between min and max indexes in any of the segments.
+ my $widest_range = 0;
+ foreach my $seg (@segments)
+ {
+ my $this_range = $seg->{max_idx} - $seg->{min_idx};
+ $widest_range = $this_range if ($this_range > $widest_range);
+ }
+
+ unshift @segments,
+ {
+ header => "Dummy map, for invalid values",
+ min_idx => 0,
+ max_idx => $widest_range,
+ label => "dummy map"
+ };
+
+ ###
+ ### Eliminate overlapping zeros
+ ###
+ ### For each segment, if there are zero values at the end of, and there
+ ### are also zero values at the beginning of the next segment, we can
+ ### overlay the tail of this segment with the head of next segment, to
+ ### save space.
+ ###
+ ### To achieve that, we subtract the 'max_idx' of each segment with the
+ ### amount of zeros that can be overlaid.
+ ###
+ for (my $j = 0; $j < $#segments - 1; $j++)
+ {
+ my $seg = $segments[$j];
+ my $nextseg = $segments[ $j + 1 ];
+
+ # Count the number of zero values at the end of this segment.
+ my $this_trail_zeros = 0;
+ for (
+ my $i = $seg->{max_idx};
+ $i >= $seg->{min_idx} && !$seg->{values}->{$i};
+ $i--)
+ {
+ $this_trail_zeros++;
+ }
+
+ # Count the number of zeros at the beginning of next segment.
+ my $next_lead_zeros = 0;
+ for (
+ my $i = $nextseg->{min_idx};
+ $i <= $nextseg->{max_idx} && !$nextseg->{values}->{$i};
+ $i++)
+ {
+ $next_lead_zeros++;
+ }
+
+ # How many zeros in common?
+ my $overlaid_trail_zeros =
+ ($this_trail_zeros > $next_lead_zeros)
+ ? $next_lead_zeros
+ : $this_trail_zeros;
+
+ $seg->{overlaid_trail_zeros} = $overlaid_trail_zeros;
+ $seg->{max_idx} = $seg->{max_idx} - $overlaid_trail_zeros;
+ }
+
+ ###
+ ### Replace label references with real offsets.
+ ###
+ ### So far, the non-leaf segments have referred to other segments by
+ ### their labels. Replace them with numerical offsets from the beginning
+ ### of the final array. You cannot move, add, or remove segments after
+ ### this step, as that would invalidate the offsets calculated here!
+ ###
+ my $flatoff = 0;
+ my %segmap;
+
+ # First pass: assign offsets to each segment, and build hash
+ # of label => offset.
+ foreach my $seg (@segments)
+ {
+ $seg->{offset} = $flatoff;
+ $segmap{ $seg->{label} } = $flatoff;
+ $flatoff += $seg->{max_idx} - $seg->{min_idx} + 1;
+ }
+ my $tblsize = $flatoff;
+
+ # Second pass: look up the offset of each label reference in the hash.
+ foreach my $seg (@segments)
+ {
+ while (my ($i, $val) = each %{ $seg->{values} })
+ {
+ if (!($val =~ /^[0-9,.E]+$/))
+ {
+ my $segoff = $segmap{$val};
+ if ($segoff)
+ {
+ $seg->{values}->{$i} = $segoff;
+ }
+ else
+ {
+ die "no segment with label $val";
+ }
+ }
+ }
+ }
+
+ # Also look up the positions of the roots in the table.
+ # Missing map represents dummy mapping.
+ my $b1root = $segmap{"1-byte"} || 0;
+ my $b2root = $segmap{"2-byte"} || 0;
+ my $b3root = $segmap{"3-byte"} || 0;
+ my $b4root = $segmap{"4-byte"} || 0;
+
+ # And the lower-upper values of each level in each radix tree.
+ # Missing values represent zero.
+ my $b1_lower = $min_idx{1}{1} || 0;
+ my $b1_upper = $max_idx{1}{1} || 0;
+
+ my $b2_1_lower = $min_idx{2}{1} || 0;
+ my $b2_1_upper = $max_idx{2}{1} || 0;
+ my $b2_2_lower = $min_idx{2}{2} || 0;
+ my $b2_2_upper = $max_idx{2}{2} || 0;
+
+ my $b3_1_lower = $min_idx{3}{1} || 0;
+ my $b3_1_upper = $max_idx{3}{1} || 0;
+ my $b3_2_lower = $min_idx{3}{2} || 0;
+ my $b3_2_upper = $max_idx{3}{2} || 0;
+ my $b3_3_lower = $min_idx{3}{3} || 0;
+ my $b3_3_upper = $max_idx{3}{3} || 0;
+
+ my $b4_1_lower = $min_idx{4}{1} || 0;
+ my $b4_1_upper = $max_idx{4}{1} || 0;
+ my $b4_2_lower = $min_idx{4}{2} || 0;
+ my $b4_2_upper = $max_idx{4}{2} || 0;
+ my $b4_3_lower = $min_idx{4}{3} || 0;
+ my $b4_3_upper = $max_idx{4}{3} || 0;
+ my $b4_4_lower = $min_idx{4}{4} || 0;
+ my $b4_4_upper = $max_idx{4}{4} || 0;
+
+ ###
+ ### Find the maximum value in the whole table, to determine if we can
+ ### use uint16 or if we need to use uint32.
+ ###
+ my $max_val = 0;
+ foreach my $seg (@segments)
+ {
+ foreach my $val (values %{ $seg->{values} })
+ {
+ $max_val = $val if ($val > $max_val);
+ }
+ }
+
+ my $datatype = ($max_val <= 0xffff) ? "uint16" : "uint32";
+
+ # For formatting, determine how many values we can fit on a single
+ # line, and how wide each value needs to be to align nicely.
+ my $vals_per_line;
+ my $colwidth;
+
+ if ($max_val <= 0xffff)
+ {
+ $vals_per_line = 8;
+ $colwidth = 4;
+ }
+ elsif ($max_val <= 0xffffff)
+ {
+ $vals_per_line = 4;
+ $colwidth = 6;
+ }
+ else
+ {
+ $vals_per_line = 4;
+ $colwidth = 8;
+ }
+
+ ###
+ ### Print the struct and array.
+ ###
+ printf $out "static const $datatype ${tblname}_table[$tblsize];\n";
+ printf $out "\n";
+ printf $out "static const pg_mb_radix_tree $tblname =\n";
+ printf $out "{\n";
+ if ($datatype eq "uint16")
+ {
+ print $out " ${tblname}_table,\n";
+ print $out " NULL, /* 32-bit table not used */\n";
+ }
+ if ($datatype eq "uint32")
+ {
+ print $out " NULL, /* 16-bit table not used */\n";
+ print $out " ${tblname}_table,\n";
+ }
+ printf $out "\n";
+ printf $out " 0x%04x, /* offset of table for 1-byte inputs */\n",
+ $b1root;
+ printf $out " 0x%02x, /* b1_lower */\n", $b1_lower;
+ printf $out " 0x%02x, /* b1_upper */\n", $b1_upper;
+ printf $out "\n";
+ printf $out " 0x%04x, /* offset of table for 2-byte inputs */\n",
+ $b2root;
+ printf $out " 0x%02x, /* b2_1_lower */\n", $b2_1_lower;
+ printf $out " 0x%02x, /* b2_1_upper */\n", $b2_1_upper;
+ printf $out " 0x%02x, /* b2_2_lower */\n", $b2_2_lower;
+ printf $out " 0x%02x, /* b2_2_upper */\n", $b2_2_upper;
+ printf $out "\n";
+ printf $out " 0x%04x, /* offset of table for 3-byte inputs */\n",
+ $b3root;
+ printf $out " 0x%02x, /* b3_1_lower */\n", $b3_1_lower;
+ printf $out " 0x%02x, /* b3_1_upper */\n", $b3_1_upper;
+ printf $out " 0x%02x, /* b3_2_lower */\n", $b3_2_lower;
+ printf $out " 0x%02x, /* b3_2_upper */\n", $b3_2_upper;
+ printf $out " 0x%02x, /* b3_3_lower */\n", $b3_3_lower;
+ printf $out " 0x%02x, /* b3_3_upper */\n", $b3_3_upper;
+ printf $out "\n";
+ printf $out " 0x%04x, /* offset of table for 4-byte inputs */\n",
+ $b4root;
+ printf $out " 0x%02x, /* b4_1_lower */\n", $b4_1_lower;
+ printf $out " 0x%02x, /* b4_1_upper */\n", $b4_1_upper;
+ printf $out " 0x%02x, /* b4_2_lower */\n", $b4_2_lower;
+ printf $out " 0x%02x, /* b4_2_upper */\n", $b4_2_upper;
+ printf $out " 0x%02x, /* b4_3_lower */\n", $b4_3_lower;
+ printf $out " 0x%02x, /* b4_3_upper */\n", $b4_3_upper;
+ printf $out " 0x%02x, /* b4_4_lower */\n", $b4_4_lower;
+ printf $out " 0x%02x /* b4_4_upper */\n", $b4_4_upper;
+ print $out "};\n";
+ print $out "\n";
+ print $out "static const $datatype ${tblname}_table[$tblsize] =\n";
+ print $out "{";
+ my $off = 0;
+
+ foreach my $seg (@segments)
+ {
+ printf $out "\n";
+ printf $out " /*** %s - offset 0x%05x ***/\n", $seg->{header}, $off;
+ printf $out "\n";
+
+ for (my $i = $seg->{min_idx}; $i <= $seg->{max_idx};)
+ {
+
+ # Print the next line's worth of values.
+ # XXX pad to begin at a nice boundary
+ printf $out " /* %02x */ ", $i;
+ for (my $j = 0;
+ $j < $vals_per_line && $i <= $seg->{max_idx}; $j++)
+ {
+ # missing values represent zero.
+ my $val = $seg->{values}->{$i} || 0;
+
+ printf $out " 0x%0*x", $colwidth, $val;
+ $off++;
+ if ($off != $tblsize)
+ {
+ print $out ",";
+ }
+ $i++;
+ }
+ print $out "\n";
+ }
+ if ($seg->{overlaid_trail_zeros})
+ {
+ printf $out
+ " /* $seg->{overlaid_trail_zeros} trailing zero values shared with next segment */\n";
+ }
+ }
+
+ # Sanity check.
+ if ($off != $tblsize) { die "table size didn't match!"; }
+
+ print $out "};\n";
+ return;
+}
+
+###
+sub build_segments_from_tree
+{
+ my ($header, $rootlabel, $depth, $map) = @_;
+
+ my @segments;
+
+ if (%{$map})
+ {
+ @segments =
+ build_segments_recurse($header, $rootlabel, "", 1, $depth, $map);
+
+ # Sort the segments into "breadth-first" order. Not strictly required,
+ # but makes the maps nicer to read.
+ @segments =
+ sort { $a->{level} cmp $b->{level} or $a->{path} cmp $b->{path} }
+ @segments;
+ }
+
+ return @segments;
+}
+
+###
+sub build_segments_recurse
+{
+ my ($header, $label, $path, $level, $depth, $map) = @_;
+
+ my @segments;
+
+ if ($level == $depth)
+ {
+ push @segments,
+ {
+ header => $header . ", leaf: ${path}xx",
+ label => $label,
+ level => $level,
+ depth => $depth,
+ path => $path,
+ values => $map
+ };
+ }
+ else
+ {
+ my %children;
+
+ while (my ($i, $val) = each %$map)
+ {
+ my $childpath = $path . sprintf("%02x", $i);
+ my $childlabel = "$depth-level-$level-$childpath";
+
+ push @segments,
+ build_segments_recurse($header, $childlabel, $childpath,
+ $level + 1, $depth, $val);
+ $children{$i} = $childlabel;
+ }
+
+ push @segments,
+ {
+ header => $header . ", byte #$level: ${path}xx",
+ label => $label,
+ level => $level,
+ depth => $depth,
+ path => $path,
+ values => \%children
+ };
+ }
+ return @segments;
+}
+
+#######################################################################
+# make_charmap - convert charset table to charmap hash
+#
+# make_charmap(\@charset, $direction)
+# charset - ref to charset table : see print_conversion_tables
+# direction - conversion direction
+#
+sub make_charmap
+{
+ my ($out, $charset, $direction, $verbose) = @_;
+
+ croak "unacceptable direction : $direction"
+ if ($direction != TO_UNICODE && $direction != FROM_UNICODE);
+
+ # In verbose mode, print a large comment with the source and comment of
+ # each character
+ if ($verbose)
+ {
+ print $out "/*\n";
+ print $out "<src> <dst> <file>:<lineno> <comment>\n";
+ }
+
+ my %charmap;
+ foreach my $c (@$charset)
+ {
+
+ # combined characters are handled elsewhere
+ next if (defined $c->{ucs_second});
+
+ next if ($c->{direction} != $direction && $c->{direction} != BOTH);
+
+ my ($src, $dst) =
+ $direction == TO_UNICODE
+ ? ($c->{code}, ucs2utf($c->{ucs}))
+ : (ucs2utf($c->{ucs}), $c->{code});
+
+ # check for duplicate source codes
+ if (defined $charmap{$src})
+ {
+ printf STDERR
+ "Error: duplicate source code on %s:%d: 0x%04x => 0x%04x, 0x%04x\n",
+ $c->{f}, $c->{l}, $src, $charmap{$src}, $dst;
+ exit;
+ }
+ $charmap{$src} = $dst;
+
+ if ($verbose)
+ {
+ printf $out "0x%04x 0x%04x %s:%d %s\n", $src, $dst, $c->{f},
+ $c->{l}, $c->{comment};
+ }
+ }
+ if ($verbose)
+ {
+ print $out "*/\n\n";
+ }
+
+ return \%charmap;
+}
+
+#######################################################################
+# make_charmap_combined - convert charset table to charmap hash
+# with checking duplicate source code
+#
+# make_charmap_combined(\@charset, $direction)
+# charset - ref to charset table : see print_conversion_tables
+# direction - conversion direction
+#
+sub make_charmap_combined
+{
+ my ($charset, $direction) = @_;
+
+ croak "unacceptable direction : $direction"
+ if ($direction != TO_UNICODE && $direction != FROM_UNICODE);
+
+ my @combined;
+ foreach my $c (@$charset)
+ {
+ next if ($c->{direction} != $direction && $c->{direction} != BOTH);
+
+ if (defined $c->{ucs_second})
+ {
+ my $entry = {
+ utf8 => ucs2utf($c->{ucs}),
+ utf8_second => ucs2utf($c->{ucs_second}),
+ code => $c->{code},
+ comment => $c->{comment},
+ f => $c->{f},
+ l => $c->{l}
+ };
+ push @combined, $entry;
+ }
+ }
+
+ return \@combined;
+}
+
+#######################################################################
+# convert UCS-4 to UTF-8
+#
+sub ucs2utf
+{
+ my ($ucs) = @_;
+ my $utf;
+
+ if ($ucs <= 0x007f)
+ {
+ $utf = $ucs;
+ }
+ elsif ($ucs > 0x007f && $ucs <= 0x07ff)
+ {
+ $utf = (($ucs & 0x003f) | 0x80) | ((($ucs >> 6) | 0xc0) << 8);
+ }
+ elsif ($ucs > 0x07ff && $ucs <= 0xffff)
+ {
+ $utf =
+ ((($ucs >> 12) | 0xe0) << 16) |
+ (((($ucs & 0x0fc0) >> 6) | 0x80) << 8) | (($ucs & 0x003f) | 0x80);
+ }
+ else
+ {
+ $utf =
+ ((($ucs >> 18) | 0xf0) << 24) |
+ (((($ucs & 0x3ffff) >> 12) | 0x80) << 16) |
+ (((($ucs & 0x0fc0) >> 6) | 0x80) << 8) | (($ucs & 0x003f) | 0x80);
+ }
+ return $utf;
+}
+
+1;
diff --git a/src/backend/utils/mb/Unicode/euc-jis-2004-std.txt b/src/backend/utils/mb/Unicode/euc-jis-2004-std.txt
new file mode 100644
index 0000000..3af8d13
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc-jis-2004-std.txt
@@ -0,0 +1,11549 @@
+## EUC-JIS-2004 (JIS X 0213:2004 Appendix 3) vs Unicode mapping table
+##
+## Date: 3 May 2009
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+## Note:
+## [1983] JIS codepoint defined by JIS X 0208-1983
+## [1990] JIS codepoint defined by JIS X 0208-1990
+## [2000] JIS codepoint defined by JIS X 0213:2000
+## [2004] JIS codepoint defined by JIS X 0213:2004
+## [Unicode3.1] UCS codepoint defined by Unicode 3.1
+## [Unicode3.2] UCS codepoint defined by Unicode 3.2
+## Fullwidth UCS fullwidth form (U+Fxxx)
+## Windows Windows (CP932) mapping
+## Some 0213 character can't represent by one UCS character.
+## In this table, such characters are described as 'U+xxxx+xxxx'.
+##
+## JIS Unicode Name Note
+0x00 U+0000 # <control>
+0x01 U+0001 # <control>
+0x02 U+0002 # <control>
+0x03 U+0003 # <control>
+0x04 U+0004 # <control>
+0x05 U+0005 # <control>
+0x06 U+0006 # <control>
+0x07 U+0007 # <control>
+0x08 U+0008 # <control>
+0x09 U+0009 # <control>
+0x0A U+000A # <control>
+0x0B U+000B # <control>
+0x0C U+000C # <control>
+0x0D U+000D # <control>
+0x0E U+000E # <control>
+0x0F U+000F # <control>
+0x10 U+0010 # <control>
+0x11 U+0011 # <control>
+0x12 U+0012 # <control>
+0x13 U+0013 # <control>
+0x14 U+0014 # <control>
+0x15 U+0015 # <control>
+0x16 U+0016 # <control>
+0x17 U+0017 # <control>
+0x18 U+0018 # <control>
+0x19 U+0019 # <control>
+0x1A U+001A # <control>
+0x1B U+001B # <control>
+0x1C U+001C # <control>
+0x1D U+001D # <control>
+0x1E U+001E # <control>
+0x1F U+001F # <control>
+0x20 U+0020 # SPACE
+0x21 U+0021 # EXCLAMATION MARK
+0x22 U+0022 # QUOTATION MARK
+0x23 U+0023 # NUMBER SIGN
+0x24 U+0024 # DOLLAR SIGN
+0x25 U+0025 # PERCENT SIGN
+0x26 U+0026 # AMPERSAND
+0x27 U+0027 # APOSTROPHE
+0x28 U+0028 # LEFT PARENTHESIS
+0x29 U+0029 # RIGHT PARENTHESIS
+0x2A U+002A # ASTERISK
+0x2B U+002B # PLUS SIGN
+0x2C U+002C # COMMA
+0x2D U+002D # HYPHEN-MINUS
+0x2E U+002E # FULL STOP
+0x2F U+002F # SOLIDUS
+0x30 U+0030 # DIGIT ZERO
+0x31 U+0031 # DIGIT ONE
+0x32 U+0032 # DIGIT TWO
+0x33 U+0033 # DIGIT THREE
+0x34 U+0034 # DIGIT FOUR
+0x35 U+0035 # DIGIT FIVE
+0x36 U+0036 # DIGIT SIX
+0x37 U+0037 # DIGIT SEVEN
+0x38 U+0038 # DIGIT EIGHT
+0x39 U+0039 # DIGIT NINE
+0x3A U+003A # COLON
+0x3B U+003B # SEMICOLON
+0x3C U+003C # LESS-THAN SIGN
+0x3D U+003D # EQUALS SIGN
+0x3E U+003E # GREATER-THAN SIGN
+0x3F U+003F # QUESTION MARK
+0x40 U+0040 # COMMERCIAL AT
+0x41 U+0041 # LATIN CAPITAL LETTER A
+0x42 U+0042 # LATIN CAPITAL LETTER B
+0x43 U+0043 # LATIN CAPITAL LETTER C
+0x44 U+0044 # LATIN CAPITAL LETTER D
+0x45 U+0045 # LATIN CAPITAL LETTER E
+0x46 U+0046 # LATIN CAPITAL LETTER F
+0x47 U+0047 # LATIN CAPITAL LETTER G
+0x48 U+0048 # LATIN CAPITAL LETTER H
+0x49 U+0049 # LATIN CAPITAL LETTER I
+0x4A U+004A # LATIN CAPITAL LETTER J
+0x4B U+004B # LATIN CAPITAL LETTER K
+0x4C U+004C # LATIN CAPITAL LETTER L
+0x4D U+004D # LATIN CAPITAL LETTER M
+0x4E U+004E # LATIN CAPITAL LETTER N
+0x4F U+004F # LATIN CAPITAL LETTER O
+0x50 U+0050 # LATIN CAPITAL LETTER P
+0x51 U+0051 # LATIN CAPITAL LETTER Q
+0x52 U+0052 # LATIN CAPITAL LETTER R
+0x53 U+0053 # LATIN CAPITAL LETTER S
+0x54 U+0054 # LATIN CAPITAL LETTER T
+0x55 U+0055 # LATIN CAPITAL LETTER U
+0x56 U+0056 # LATIN CAPITAL LETTER V
+0x57 U+0057 # LATIN CAPITAL LETTER W
+0x58 U+0058 # LATIN CAPITAL LETTER X
+0x59 U+0059 # LATIN CAPITAL LETTER Y
+0x5A U+005A # LATIN CAPITAL LETTER Z
+0x5B U+005B # LEFT SQUARE BRACKET
+0x5C U+005C # REVERSE SOLIDUS
+0x5D U+005D # RIGHT SQUARE BRACKET
+0x5E U+005E # CIRCUMFLEX ACCENT
+0x5F U+005F # LOW LINE
+0x60 U+0060 # GRAVE ACCENT
+0x61 U+0061 # LATIN SMALL LETTER A
+0x62 U+0062 # LATIN SMALL LETTER B
+0x63 U+0063 # LATIN SMALL LETTER C
+0x64 U+0064 # LATIN SMALL LETTER D
+0x65 U+0065 # LATIN SMALL LETTER E
+0x66 U+0066 # LATIN SMALL LETTER F
+0x67 U+0067 # LATIN SMALL LETTER G
+0x68 U+0068 # LATIN SMALL LETTER H
+0x69 U+0069 # LATIN SMALL LETTER I
+0x6A U+006A # LATIN SMALL LETTER J
+0x6B U+006B # LATIN SMALL LETTER K
+0x6C U+006C # LATIN SMALL LETTER L
+0x6D U+006D # LATIN SMALL LETTER M
+0x6E U+006E # LATIN SMALL LETTER N
+0x6F U+006F # LATIN SMALL LETTER O
+0x70 U+0070 # LATIN SMALL LETTER P
+0x71 U+0071 # LATIN SMALL LETTER Q
+0x72 U+0072 # LATIN SMALL LETTER R
+0x73 U+0073 # LATIN SMALL LETTER S
+0x74 U+0074 # LATIN SMALL LETTER T
+0x75 U+0075 # LATIN SMALL LETTER U
+0x76 U+0076 # LATIN SMALL LETTER V
+0x77 U+0077 # LATIN SMALL LETTER W
+0x78 U+0078 # LATIN SMALL LETTER X
+0x79 U+0079 # LATIN SMALL LETTER Y
+0x7A U+007A # LATIN SMALL LETTER Z
+0x7B U+007B # LEFT CURLY BRACKET
+0x7C U+007C # VERTICAL LINE
+0x7D U+007D # RIGHT CURLY BRACKET
+0x7E U+007E # TILDE
+0x7F U+007F # <control>
+0x80 U+0080 # <control>
+0x81 U+0081 # <control>
+0x82 U+0082 # <control>
+0x83 U+0083 # <control>
+0x84 U+0084 # <control>
+0x85 U+0085 # <control>
+0x86 U+0086 # <control>
+0x87 U+0087 # <control>
+0x88 U+0088 # <control>
+0x89 U+0089 # <control>
+0x8A U+008A # <control>
+0x8B U+008B # <control>
+0x8C U+008C # <control>
+0x8D U+008D # <control>
+0x8E U+008E # <control>
+0x8F U+008F # <control>
+0x90 U+0090 # <control>
+0x91 U+0091 # <control>
+0x92 U+0092 # <control>
+0x93 U+0093 # <control>
+0x94 U+0094 # <control>
+0x95 U+0095 # <control>
+0x96 U+0096 # <control>
+0x97 U+0097 # <control>
+0x98 U+0098 # <control>
+0x99 U+0099 # <control>
+0x9A U+009A # <control>
+0x9B U+009B # <control>
+0x9C U+009C # <control>
+0x9D U+009D # <control>
+0x9E U+009E # <control>
+0x9F U+009F # <control>
+0xA0 # <reserved>
+0xFF # <reserved>
+0xA1A1 U+3000 # IDEOGRAPHIC SPACE
+0xA1A2 U+3001 # IDEOGRAPHIC COMMA
+0xA1A3 U+3002 # IDEOGRAPHIC FULL STOP
+0xA1A4 U+FF0C # FULLWIDTH COMMA
+0xA1A5 U+FF0E # FULLWIDTH FULL STOP
+0xA1A6 U+30FB # KATAKANA MIDDLE DOT
+0xA1A7 U+FF1A # FULLWIDTH COLON
+0xA1A8 U+FF1B # FULLWIDTH SEMICOLON
+0xA1A9 U+FF1F # FULLWIDTH QUESTION MARK
+0xA1AA U+FF01 # FULLWIDTH EXCLAMATION MARK
+0xA1AB U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0xA1AC U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0xA1AD U+00B4 # ACUTE ACCENT
+0xA1AE U+FF40 # FULLWIDTH GRAVE ACCENT
+0xA1AF U+00A8 # DIAERESIS
+0xA1B0 U+FF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0xA1B1 U+203E # OVERLINE Windows: U+FFE3
+0xA1B2 U+FF3F # FULLWIDTH LOW LINE
+0xA1B3 U+30FD # KATAKANA ITERATION MARK
+0xA1B4 U+30FE # KATAKANA VOICED ITERATION MARK
+0xA1B5 U+309D # HIRAGANA ITERATION MARK
+0xA1B6 U+309E # HIRAGANA VOICED ITERATION MARK
+0xA1B7 U+3003 # DITTO MARK
+0xA1B8 U+4EDD # <cjk>
+0xA1B9 U+3005 # IDEOGRAPHIC ITERATION MARK
+0xA1BA U+3006 # IDEOGRAPHIC CLOSING MARK
+0xA1BB U+3007 # IDEOGRAPHIC NUMBER ZERO
+0xA1BC U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xA1BD U+2014 # EM DASH Windows: U+2015
+0xA1BE U+2010 # HYPHEN
+0xA1BF U+FF0F # FULLWIDTH SOLIDUS
+0xA1C0 U+FF3C # FULLWIDTH REVERSE SOLIDUS
+0xA1C1 U+301C # WAVE DASH Windows: U+FF5E
+0xA1C2 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225
+0xA1C3 U+FF5C # FULLWIDTH VERTICAL LINE
+0xA1C4 U+2026 # HORIZONTAL ELLIPSIS
+0xA1C5 U+2025 # TWO DOT LEADER
+0xA1C6 U+2018 # LEFT SINGLE QUOTATION MARK
+0xA1C7 U+2019 # RIGHT SINGLE QUOTATION MARK
+0xA1C8 U+201C # LEFT DOUBLE QUOTATION MARK
+0xA1C9 U+201D # RIGHT DOUBLE QUOTATION MARK
+0xA1CA U+FF08 # FULLWIDTH LEFT PARENTHESIS
+0xA1CB U+FF09 # FULLWIDTH RIGHT PARENTHESIS
+0xA1CC U+3014 # LEFT TORTOISE SHELL BRACKET
+0xA1CD U+3015 # RIGHT TORTOISE SHELL BRACKET
+0xA1CE U+FF3B # FULLWIDTH LEFT SQUARE BRACKET
+0xA1CF U+FF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0xA1D0 U+FF5B # FULLWIDTH LEFT CURLY BRACKET
+0xA1D1 U+FF5D # FULLWIDTH RIGHT CURLY BRACKET
+0xA1D2 U+3008 # LEFT ANGLE BRACKET
+0xA1D3 U+3009 # RIGHT ANGLE BRACKET
+0xA1D4 U+300A # LEFT DOUBLE ANGLE BRACKET
+0xA1D5 U+300B # RIGHT DOUBLE ANGLE BRACKET
+0xA1D6 U+300C # LEFT CORNER BRACKET
+0xA1D7 U+300D # RIGHT CORNER BRACKET
+0xA1D8 U+300E # LEFT WHITE CORNER BRACKET
+0xA1D9 U+300F # RIGHT WHITE CORNER BRACKET
+0xA1DA U+3010 # LEFT BLACK LENTICULAR BRACKET
+0xA1DB U+3011 # RIGHT BLACK LENTICULAR BRACKET
+0xA1DC U+FF0B # FULLWIDTH PLUS SIGN
+0xA1DD U+2212 # MINUS SIGN Windows: U+FF0D
+0xA1DE U+00B1 # PLUS-MINUS SIGN
+0xA1DF U+00D7 # MULTIPLICATION SIGN
+0xA1E0 U+00F7 # DIVISION SIGN
+0xA1E1 U+FF1D # FULLWIDTH EQUALS SIGN
+0xA1E2 U+2260 # NOT EQUAL TO
+0xA1E3 U+FF1C # FULLWIDTH LESS-THAN SIGN
+0xA1E4 U+FF1E # FULLWIDTH GREATER-THAN SIGN
+0xA1E5 U+2266 # LESS-THAN OVER EQUAL TO
+0xA1E6 U+2267 # GREATER-THAN OVER EQUAL TO
+0xA1E7 U+221E # INFINITY
+0xA1E8 U+2234 # THEREFORE
+0xA1E9 U+2642 # MALE SIGN
+0xA1EA U+2640 # FEMALE SIGN
+0xA1EB U+00B0 # DEGREE SIGN
+0xA1EC U+2032 # PRIME
+0xA1ED U+2033 # DOUBLE PRIME
+0xA1EE U+2103 # DEGREE CELSIUS
+0xA1EF U+00A5 # YEN SIGN Windows: U+FFE5
+0xA1F0 U+FF04 # FULLWIDTH DOLLAR SIGN
+0xA1F1 U+00A2 # CENT SIGN Windows: U+FFE0
+0xA1F2 U+00A3 # POUND SIGN Windows: U+FFE1
+0xA1F3 U+FF05 # FULLWIDTH PERCENT SIGN
+0xA1F4 U+FF03 # FULLWIDTH NUMBER SIGN
+0xA1F5 U+FF06 # FULLWIDTH AMPERSAND
+0xA1F6 U+FF0A # FULLWIDTH ASTERISK
+0xA1F7 U+FF20 # FULLWIDTH COMMERCIAL AT
+0xA1F8 U+00A7 # SECTION SIGN
+0xA1F9 U+2606 # WHITE STAR
+0xA1FA U+2605 # BLACK STAR
+0xA1FB U+25CB # WHITE CIRCLE
+0xA1FC U+25CF # BLACK CIRCLE
+0xA1FD U+25CE # BULLSEYE
+0xA1FE U+25C7 # WHITE DIAMOND
+0xA2A1 U+25C6 # BLACK DIAMOND
+0xA2A2 U+25A1 # WHITE SQUARE
+0xA2A3 U+25A0 # BLACK SQUARE
+0xA2A4 U+25B3 # WHITE UP-POINTING TRIANGLE
+0xA2A5 U+25B2 # BLACK UP-POINTING TRIANGLE
+0xA2A6 U+25BD # WHITE DOWN-POINTING TRIANGLE
+0xA2A7 U+25BC # BLACK DOWN-POINTING TRIANGLE
+0xA2A8 U+203B # REFERENCE MARK
+0xA2A9 U+3012 # POSTAL MARK
+0xA2AA U+2192 # RIGHTWARDS ARROW
+0xA2AB U+2190 # LEFTWARDS ARROW
+0xA2AC U+2191 # UPWARDS ARROW
+0xA2AD U+2193 # DOWNWARDS ARROW
+0xA2AE U+3013 # GETA MARK
+0xA2AF U+FF07 # FULLWIDTH APOSTROPHE [2000]
+0xA2B0 U+FF02 # FULLWIDTH QUOTATION MARK [2000]
+0xA2B1 U+FF0D # FULLWIDTH HYPHEN-MINUS [2000]
+0xA2B2 U+FF5E # FULLWIDTH TILDE [2000]
+0xA2B3 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000]
+0xA2B4 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000]
+0xA2B5 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000]
+0xA2B6 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2]
+0xA2B7 U+303C # MASU MARK [2000] [Unicode3.2]
+0xA2B8 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2]
+0xA2B9 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2]
+0xA2BA U+2208 # ELEMENT OF [1983]
+0xA2BB U+220B # CONTAINS AS MEMBER [1983]
+0xA2BC U+2286 # SUBSET OF OR EQUAL TO [1983]
+0xA2BD U+2287 # SUPERSET OF OR EQUAL TO [1983]
+0xA2BE U+2282 # SUBSET OF [1983]
+0xA2BF U+2283 # SUPERSET OF [1983]
+0xA2C0 U+222A # UNION [1983]
+0xA2C1 U+2229 # INTERSECTION [1983]
+0xA2C2 U+2284 # NOT A SUBSET OF [2000]
+0xA2C3 U+2285 # NOT A SUPERSET OF [2000]
+0xA2C4 U+228A # SUBSET OF WITH NOT EQUAL TO [2000]
+0xA2C5 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000]
+0xA2C6 U+2209 # NOT AN ELEMENT OF [2000]
+0xA2C7 U+2205 # EMPTY SET [2000]
+0xA2C8 U+2305 # PROJECTIVE [2000]
+0xA2C9 U+2306 # PERSPECTIVE [2000]
+0xA2CA U+2227 # LOGICAL AND [1983]
+0xA2CB U+2228 # LOGICAL OR [1983]
+0xA2CC U+00AC # NOT SIGN [1983] Windows: U+FFE2
+0xA2CD U+21D2 # RIGHTWARDS DOUBLE ARROW [1983]
+0xA2CE U+21D4 # LEFT RIGHT DOUBLE ARROW [1983]
+0xA2CF U+2200 # FOR ALL [1983]
+0xA2D0 U+2203 # THERE EXISTS [1983]
+0xA2D1 U+2295 # CIRCLED PLUS [2000]
+0xA2D2 U+2296 # CIRCLED MINUS [2000]
+0xA2D3 U+2297 # CIRCLED TIMES [2000]
+0xA2D4 U+2225 # PARALLEL TO [2000]
+0xA2D5 U+2226 # NOT PARALLEL TO [2000]
+0xA2D6 U+FF5F # FULLWIDTH LEFT WHITE PARENTHESIS [2000] [Unicode3.2]
+0xA2D7 U+FF60 # FULLWIDTH RIGHT WHITE PARENTHESIS [2000] [Unicode3.2]
+0xA2D8 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000]
+0xA2D9 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000]
+0xA2DA U+3016 # LEFT WHITE LENTICULAR BRACKET [2000]
+0xA2DB U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000]
+0xA2DC U+2220 # ANGLE [1983]
+0xA2DD U+22A5 # UP TACK [1983]
+0xA2DE U+2312 # ARC [1983]
+0xA2DF U+2202 # PARTIAL DIFFERENTIAL [1983]
+0xA2E0 U+2207 # NABLA [1983]
+0xA2E1 U+2261 # IDENTICAL TO [1983]
+0xA2E2 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983]
+0xA2E3 U+226A # MUCH LESS-THAN [1983]
+0xA2E4 U+226B # MUCH GREATER-THAN [1983]
+0xA2E5 U+221A # SQUARE ROOT [1983]
+0xA2E6 U+223D # REVERSED TILDE [1983]
+0xA2E7 U+221D # PROPORTIONAL TO [1983]
+0xA2E8 U+2235 # BECAUSE [1983]
+0xA2E9 U+222B # INTEGRAL [1983]
+0xA2EA U+222C # DOUBLE INTEGRAL [1983]
+0xA2EB U+2262 # NOT IDENTICAL TO [2000]
+0xA2EC U+2243 # ASYMPTOTICALLY EQUAL TO [2000]
+0xA2ED U+2245 # APPROXIMATELY EQUAL TO [2000]
+0xA2EE U+2248 # ALMOST EQUAL TO [2000]
+0xA2EF U+2276 # LESS-THAN OR GREATER-THAN [2000]
+0xA2F0 U+2277 # GREATER-THAN OR LESS-THAN [2000]
+0xA2F1 U+2194 # LEFT RIGHT ARROW [2000]
+0xA2F2 U+212B # ANGSTROM SIGN [1983]
+0xA2F3 U+2030 # PER MILLE SIGN [1983]
+0xA2F4 U+266F # MUSIC SHARP SIGN [1983]
+0xA2F5 U+266D # MUSIC FLAT SIGN [1983]
+0xA2F6 U+266A # EIGHTH NOTE [1983]
+0xA2F7 U+2020 # DAGGER [1983]
+0xA2F8 U+2021 # DOUBLE DAGGER [1983]
+0xA2F9 U+00B6 # PILCROW SIGN [1983]
+0xA2FA U+266E # MUSIC NATURAL SIGN [2000]
+0xA2FB U+266B # BEAMED EIGHTH NOTES [2000]
+0xA2FC U+266C # BEAMED SIXTEENTH NOTES [2000]
+0xA2FD U+2669 # QUARTER NOTE [2000]
+0xA2FE U+25EF # LARGE CIRCLE [1983]
+0xA3A1 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000]
+0xA3A2 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000]
+0xA3A3 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000]
+0xA3A4 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000]
+0xA3A5 U+2197 # NORTH EAST ARROW [2000]
+0xA3A6 U+2198 # SOUTH EAST ARROW [2000]
+0xA3A7 U+2196 # NORTH WEST ARROW [2000]
+0xA3A8 U+2199 # SOUTH WEST ARROW [2000]
+0xA3A9 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000]
+0xA3AA U+21E8 # RIGHTWARDS WHITE ARROW [2000]
+0xA3AB U+21E6 # LEFTWARDS WHITE ARROW [2000]
+0xA3AC U+21E7 # UPWARDS WHITE ARROW [2000]
+0xA3AD U+21E9 # DOWNWARDS WHITE ARROW [2000]
+0xA3AE U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2]
+0xA3AF U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2]
+0xA3B0 U+FF10 # FULLWIDTH DIGIT ZERO
+0xA3B1 U+FF11 # FULLWIDTH DIGIT ONE
+0xA3B2 U+FF12 # FULLWIDTH DIGIT TWO
+0xA3B3 U+FF13 # FULLWIDTH DIGIT THREE
+0xA3B4 U+FF14 # FULLWIDTH DIGIT FOUR
+0xA3B5 U+FF15 # FULLWIDTH DIGIT FIVE
+0xA3B6 U+FF16 # FULLWIDTH DIGIT SIX
+0xA3B7 U+FF17 # FULLWIDTH DIGIT SEVEN
+0xA3B8 U+FF18 # FULLWIDTH DIGIT EIGHT
+0xA3B9 U+FF19 # FULLWIDTH DIGIT NINE
+0xA3BA U+29BF # CIRCLED BULLET [2000] [Unicode3.2]
+0xA3BB U+25C9 # FISHEYE [2000]
+0xA3BC U+303D # PART ALTERNATION MARK [2000] [Unicode3.2]
+0xA3BD U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2]
+0xA3BE U+FE45 # SESAME DOT [2000] [Unicode3.2]
+0xA3BF U+25E6 # WHITE BULLET [2000]
+0xA3C0 U+2022 # BULLET [2000]
+0xA3C1 U+FF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0xA3C2 U+FF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0xA3C3 U+FF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0xA3C4 U+FF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0xA3C5 U+FF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0xA3C6 U+FF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0xA3C7 U+FF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0xA3C8 U+FF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0xA3C9 U+FF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0xA3CA U+FF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0xA3CB U+FF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0xA3CC U+FF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0xA3CD U+FF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0xA3CE U+FF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0xA3CF U+FF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0xA3D0 U+FF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0xA3D1 U+FF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0xA3D2 U+FF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0xA3D3 U+FF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0xA3D4 U+FF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0xA3D5 U+FF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0xA3D6 U+FF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0xA3D7 U+FF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0xA3D8 U+FF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0xA3D9 U+FF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0xA3DA U+FF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0xA3DB U+2213 # MINUS-OR-PLUS SIGN [2000]
+0xA3DC U+2135 # ALEF SYMBOL [2000]
+0xA3DD U+210F # PLANCK CONSTANT OVER TWO PI [2000]
+0xA3DE U+33CB # SQUARE HP [2000]
+0xA3DF U+2113 # SCRIPT SMALL L [2000]
+0xA3E0 U+2127 # INVERTED OHM SIGN [2000]
+0xA3E1 U+FF41 # FULLWIDTH LATIN SMALL LETTER A
+0xA3E2 U+FF42 # FULLWIDTH LATIN SMALL LETTER B
+0xA3E3 U+FF43 # FULLWIDTH LATIN SMALL LETTER C
+0xA3E4 U+FF44 # FULLWIDTH LATIN SMALL LETTER D
+0xA3E5 U+FF45 # FULLWIDTH LATIN SMALL LETTER E
+0xA3E6 U+FF46 # FULLWIDTH LATIN SMALL LETTER F
+0xA3E7 U+FF47 # FULLWIDTH LATIN SMALL LETTER G
+0xA3E8 U+FF48 # FULLWIDTH LATIN SMALL LETTER H
+0xA3E9 U+FF49 # FULLWIDTH LATIN SMALL LETTER I
+0xA3EA U+FF4A # FULLWIDTH LATIN SMALL LETTER J
+0xA3EB U+FF4B # FULLWIDTH LATIN SMALL LETTER K
+0xA3EC U+FF4C # FULLWIDTH LATIN SMALL LETTER L
+0xA3ED U+FF4D # FULLWIDTH LATIN SMALL LETTER M
+0xA3EE U+FF4E # FULLWIDTH LATIN SMALL LETTER N
+0xA3EF U+FF4F # FULLWIDTH LATIN SMALL LETTER O
+0xA3F0 U+FF50 # FULLWIDTH LATIN SMALL LETTER P
+0xA3F1 U+FF51 # FULLWIDTH LATIN SMALL LETTER Q
+0xA3F2 U+FF52 # FULLWIDTH LATIN SMALL LETTER R
+0xA3F3 U+FF53 # FULLWIDTH LATIN SMALL LETTER S
+0xA3F4 U+FF54 # FULLWIDTH LATIN SMALL LETTER T
+0xA3F5 U+FF55 # FULLWIDTH LATIN SMALL LETTER U
+0xA3F6 U+FF56 # FULLWIDTH LATIN SMALL LETTER V
+0xA3F7 U+FF57 # FULLWIDTH LATIN SMALL LETTER W
+0xA3F8 U+FF58 # FULLWIDTH LATIN SMALL LETTER X
+0xA3F9 U+FF59 # FULLWIDTH LATIN SMALL LETTER Y
+0xA3FA U+FF5A # FULLWIDTH LATIN SMALL LETTER Z
+0xA3FB U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2]
+0xA3FC U+2013 # EN DASH [2000]
+0xA3FD U+29FA # DOUBLE PLUS [2000] [Unicode3.2]
+0xA3FE U+29FB # TRIPLE PLUS [2000] [Unicode3.2]
+0xA4A1 U+3041 # HIRAGANA LETTER SMALL A
+0xA4A2 U+3042 # HIRAGANA LETTER A
+0xA4A3 U+3043 # HIRAGANA LETTER SMALL I
+0xA4A4 U+3044 # HIRAGANA LETTER I
+0xA4A5 U+3045 # HIRAGANA LETTER SMALL U
+0xA4A6 U+3046 # HIRAGANA LETTER U
+0xA4A7 U+3047 # HIRAGANA LETTER SMALL E
+0xA4A8 U+3048 # HIRAGANA LETTER E
+0xA4A9 U+3049 # HIRAGANA LETTER SMALL O
+0xA4AA U+304A # HIRAGANA LETTER O
+0xA4AB U+304B # HIRAGANA LETTER KA
+0xA4AC U+304C # HIRAGANA LETTER GA
+0xA4AD U+304D # HIRAGANA LETTER KI
+0xA4AE U+304E # HIRAGANA LETTER GI
+0xA4AF U+304F # HIRAGANA LETTER KU
+0xA4B0 U+3050 # HIRAGANA LETTER GU
+0xA4B1 U+3051 # HIRAGANA LETTER KE
+0xA4B2 U+3052 # HIRAGANA LETTER GE
+0xA4B3 U+3053 # HIRAGANA LETTER KO
+0xA4B4 U+3054 # HIRAGANA LETTER GO
+0xA4B5 U+3055 # HIRAGANA LETTER SA
+0xA4B6 U+3056 # HIRAGANA LETTER ZA
+0xA4B7 U+3057 # HIRAGANA LETTER SI
+0xA4B8 U+3058 # HIRAGANA LETTER ZI
+0xA4B9 U+3059 # HIRAGANA LETTER SU
+0xA4BA U+305A # HIRAGANA LETTER ZU
+0xA4BB U+305B # HIRAGANA LETTER SE
+0xA4BC U+305C # HIRAGANA LETTER ZE
+0xA4BD U+305D # HIRAGANA LETTER SO
+0xA4BE U+305E # HIRAGANA LETTER ZO
+0xA4BF U+305F # HIRAGANA LETTER TA
+0xA4C0 U+3060 # HIRAGANA LETTER DA
+0xA4C1 U+3061 # HIRAGANA LETTER TI
+0xA4C2 U+3062 # HIRAGANA LETTER DI
+0xA4C3 U+3063 # HIRAGANA LETTER SMALL TU
+0xA4C4 U+3064 # HIRAGANA LETTER TU
+0xA4C5 U+3065 # HIRAGANA LETTER DU
+0xA4C6 U+3066 # HIRAGANA LETTER TE
+0xA4C7 U+3067 # HIRAGANA LETTER DE
+0xA4C8 U+3068 # HIRAGANA LETTER TO
+0xA4C9 U+3069 # HIRAGANA LETTER DO
+0xA4CA U+306A # HIRAGANA LETTER NA
+0xA4CB U+306B # HIRAGANA LETTER NI
+0xA4CC U+306C # HIRAGANA LETTER NU
+0xA4CD U+306D # HIRAGANA LETTER NE
+0xA4CE U+306E # HIRAGANA LETTER NO
+0xA4CF U+306F # HIRAGANA LETTER HA
+0xA4D0 U+3070 # HIRAGANA LETTER BA
+0xA4D1 U+3071 # HIRAGANA LETTER PA
+0xA4D2 U+3072 # HIRAGANA LETTER HI
+0xA4D3 U+3073 # HIRAGANA LETTER BI
+0xA4D4 U+3074 # HIRAGANA LETTER PI
+0xA4D5 U+3075 # HIRAGANA LETTER HU
+0xA4D6 U+3076 # HIRAGANA LETTER BU
+0xA4D7 U+3077 # HIRAGANA LETTER PU
+0xA4D8 U+3078 # HIRAGANA LETTER HE
+0xA4D9 U+3079 # HIRAGANA LETTER BE
+0xA4DA U+307A # HIRAGANA LETTER PE
+0xA4DB U+307B # HIRAGANA LETTER HO
+0xA4DC U+307C # HIRAGANA LETTER BO
+0xA4DD U+307D # HIRAGANA LETTER PO
+0xA4DE U+307E # HIRAGANA LETTER MA
+0xA4DF U+307F # HIRAGANA LETTER MI
+0xA4E0 U+3080 # HIRAGANA LETTER MU
+0xA4E1 U+3081 # HIRAGANA LETTER ME
+0xA4E2 U+3082 # HIRAGANA LETTER MO
+0xA4E3 U+3083 # HIRAGANA LETTER SMALL YA
+0xA4E4 U+3084 # HIRAGANA LETTER YA
+0xA4E5 U+3085 # HIRAGANA LETTER SMALL YU
+0xA4E6 U+3086 # HIRAGANA LETTER YU
+0xA4E7 U+3087 # HIRAGANA LETTER SMALL YO
+0xA4E8 U+3088 # HIRAGANA LETTER YO
+0xA4E9 U+3089 # HIRAGANA LETTER RA
+0xA4EA U+308A # HIRAGANA LETTER RI
+0xA4EB U+308B # HIRAGANA LETTER RU
+0xA4EC U+308C # HIRAGANA LETTER RE
+0xA4ED U+308D # HIRAGANA LETTER RO
+0xA4EE U+308E # HIRAGANA LETTER SMALL WA
+0xA4EF U+308F # HIRAGANA LETTER WA
+0xA4F0 U+3090 # HIRAGANA LETTER WI
+0xA4F1 U+3091 # HIRAGANA LETTER WE
+0xA4F2 U+3092 # HIRAGANA LETTER WO
+0xA4F3 U+3093 # HIRAGANA LETTER N
+0xA4F4 U+3094 # HIRAGANA LETTER VU [2000]
+0xA4F5 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2]
+0xA4F6 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2]
+0xA4F7 U+304B+309A # [2000]
+0xA4F8 U+304D+309A # [2000]
+0xA4F9 U+304F+309A # [2000]
+0xA4FA U+3051+309A # [2000]
+0xA4FB U+3053+309A # [2000]
+0xA4FC # <reserved>
+0xA4FD # <reserved>
+0xA4FE # <reserved>
+0xA5A1 U+30A1 # KATAKANA LETTER SMALL A
+0xA5A2 U+30A2 # KATAKANA LETTER A
+0xA5A3 U+30A3 # KATAKANA LETTER SMALL I
+0xA5A4 U+30A4 # KATAKANA LETTER I
+0xA5A5 U+30A5 # KATAKANA LETTER SMALL U
+0xA5A6 U+30A6 # KATAKANA LETTER U
+0xA5A7 U+30A7 # KATAKANA LETTER SMALL E
+0xA5A8 U+30A8 # KATAKANA LETTER E
+0xA5A9 U+30A9 # KATAKANA LETTER SMALL O
+0xA5AA U+30AA # KATAKANA LETTER O
+0xA5AB U+30AB # KATAKANA LETTER KA
+0xA5AC U+30AC # KATAKANA LETTER GA
+0xA5AD U+30AD # KATAKANA LETTER KI
+0xA5AE U+30AE # KATAKANA LETTER GI
+0xA5AF U+30AF # KATAKANA LETTER KU
+0xA5B0 U+30B0 # KATAKANA LETTER GU
+0xA5B1 U+30B1 # KATAKANA LETTER KE
+0xA5B2 U+30B2 # KATAKANA LETTER GE
+0xA5B3 U+30B3 # KATAKANA LETTER KO
+0xA5B4 U+30B4 # KATAKANA LETTER GO
+0xA5B5 U+30B5 # KATAKANA LETTER SA
+0xA5B6 U+30B6 # KATAKANA LETTER ZA
+0xA5B7 U+30B7 # KATAKANA LETTER SI
+0xA5B8 U+30B8 # KATAKANA LETTER ZI
+0xA5B9 U+30B9 # KATAKANA LETTER SU
+0xA5BA U+30BA # KATAKANA LETTER ZU
+0xA5BB U+30BB # KATAKANA LETTER SE
+0xA5BC U+30BC # KATAKANA LETTER ZE
+0xA5BD U+30BD # KATAKANA LETTER SO
+0xA5BE U+30BE # KATAKANA LETTER ZO
+0xA5BF U+30BF # KATAKANA LETTER TA
+0xA5C0 U+30C0 # KATAKANA LETTER DA
+0xA5C1 U+30C1 # KATAKANA LETTER TI
+0xA5C2 U+30C2 # KATAKANA LETTER DI
+0xA5C3 U+30C3 # KATAKANA LETTER SMALL TU
+0xA5C4 U+30C4 # KATAKANA LETTER TU
+0xA5C5 U+30C5 # KATAKANA LETTER DU
+0xA5C6 U+30C6 # KATAKANA LETTER TE
+0xA5C7 U+30C7 # KATAKANA LETTER DE
+0xA5C8 U+30C8 # KATAKANA LETTER TO
+0xA5C9 U+30C9 # KATAKANA LETTER DO
+0xA5CA U+30CA # KATAKANA LETTER NA
+0xA5CB U+30CB # KATAKANA LETTER NI
+0xA5CC U+30CC # KATAKANA LETTER NU
+0xA5CD U+30CD # KATAKANA LETTER NE
+0xA5CE U+30CE # KATAKANA LETTER NO
+0xA5CF U+30CF # KATAKANA LETTER HA
+0xA5D0 U+30D0 # KATAKANA LETTER BA
+0xA5D1 U+30D1 # KATAKANA LETTER PA
+0xA5D2 U+30D2 # KATAKANA LETTER HI
+0xA5D3 U+30D3 # KATAKANA LETTER BI
+0xA5D4 U+30D4 # KATAKANA LETTER PI
+0xA5D5 U+30D5 # KATAKANA LETTER HU
+0xA5D6 U+30D6 # KATAKANA LETTER BU
+0xA5D7 U+30D7 # KATAKANA LETTER PU
+0xA5D8 U+30D8 # KATAKANA LETTER HE
+0xA5D9 U+30D9 # KATAKANA LETTER BE
+0xA5DA U+30DA # KATAKANA LETTER PE
+0xA5DB U+30DB # KATAKANA LETTER HO
+0xA5DC U+30DC # KATAKANA LETTER BO
+0xA5DD U+30DD # KATAKANA LETTER PO
+0xA5DE U+30DE # KATAKANA LETTER MA
+0xA5DF U+30DF # KATAKANA LETTER MI
+0xA5E0 U+30E0 # KATAKANA LETTER MU
+0xA5E1 U+30E1 # KATAKANA LETTER ME
+0xA5E2 U+30E2 # KATAKANA LETTER MO
+0xA5E3 U+30E3 # KATAKANA LETTER SMALL YA
+0xA5E4 U+30E4 # KATAKANA LETTER YA
+0xA5E5 U+30E5 # KATAKANA LETTER SMALL YU
+0xA5E6 U+30E6 # KATAKANA LETTER YU
+0xA5E7 U+30E7 # KATAKANA LETTER SMALL YO
+0xA5E8 U+30E8 # KATAKANA LETTER YO
+0xA5E9 U+30E9 # KATAKANA LETTER RA
+0xA5EA U+30EA # KATAKANA LETTER RI
+0xA5EB U+30EB # KATAKANA LETTER RU
+0xA5EC U+30EC # KATAKANA LETTER RE
+0xA5ED U+30ED # KATAKANA LETTER RO
+0xA5EE U+30EE # KATAKANA LETTER SMALL WA
+0xA5EF U+30EF # KATAKANA LETTER WA
+0xA5F0 U+30F0 # KATAKANA LETTER WI
+0xA5F1 U+30F1 # KATAKANA LETTER WE
+0xA5F2 U+30F2 # KATAKANA LETTER WO
+0xA5F3 U+30F3 # KATAKANA LETTER N
+0xA5F4 U+30F4 # KATAKANA LETTER VU
+0xA5F5 U+30F5 # KATAKANA LETTER SMALL KA
+0xA5F6 U+30F6 # KATAKANA LETTER SMALL KE
+0xA5F7 U+30AB+309A # [2000]
+0xA5F8 U+30AD+309A # [2000]
+0xA5F9 U+30AF+309A # [2000]
+0xA5FA U+30B1+309A # [2000]
+0xA5FB U+30B3+309A # [2000]
+0xA5FC U+30BB+309A # [2000]
+0xA5FD U+30C4+309A # [2000]
+0xA5FE U+30C8+309A # [2000]
+0xA6A1 U+0391 # GREEK CAPITAL LETTER ALPHA
+0xA6A2 U+0392 # GREEK CAPITAL LETTER BETA
+0xA6A3 U+0393 # GREEK CAPITAL LETTER GAMMA
+0xA6A4 U+0394 # GREEK CAPITAL LETTER DELTA
+0xA6A5 U+0395 # GREEK CAPITAL LETTER EPSILON
+0xA6A6 U+0396 # GREEK CAPITAL LETTER ZETA
+0xA6A7 U+0397 # GREEK CAPITAL LETTER ETA
+0xA6A8 U+0398 # GREEK CAPITAL LETTER THETA
+0xA6A9 U+0399 # GREEK CAPITAL LETTER IOTA
+0xA6AA U+039A # GREEK CAPITAL LETTER KAPPA
+0xA6AB U+039B # GREEK CAPITAL LETTER LAMDA
+0xA6AC U+039C # GREEK CAPITAL LETTER MU
+0xA6AD U+039D # GREEK CAPITAL LETTER NU
+0xA6AE U+039E # GREEK CAPITAL LETTER XI
+0xA6AF U+039F # GREEK CAPITAL LETTER OMICRON
+0xA6B0 U+03A0 # GREEK CAPITAL LETTER PI
+0xA6B1 U+03A1 # GREEK CAPITAL LETTER RHO
+0xA6B2 U+03A3 # GREEK CAPITAL LETTER SIGMA
+0xA6B3 U+03A4 # GREEK CAPITAL LETTER TAU
+0xA6B4 U+03A5 # GREEK CAPITAL LETTER UPSILON
+0xA6B5 U+03A6 # GREEK CAPITAL LETTER PHI
+0xA6B6 U+03A7 # GREEK CAPITAL LETTER CHI
+0xA6B7 U+03A8 # GREEK CAPITAL LETTER PSI
+0xA6B8 U+03A9 # GREEK CAPITAL LETTER OMEGA
+0xA6B9 U+2664 # WHITE SPADE SUIT [2000]
+0xA6BA U+2660 # BLACK SPADE SUIT [2000]
+0xA6BB U+2662 # WHITE DIAMOND SUIT [2000]
+0xA6BC U+2666 # BLACK DIAMOND SUIT [2000]
+0xA6BD U+2661 # WHITE HEART SUIT [2000]
+0xA6BE U+2665 # BLACK HEART SUIT [2000]
+0xA6BF U+2667 # WHITE CLUB SUIT [2000]
+0xA6C0 U+2663 # BLACK CLUB SUIT [2000]
+0xA6C1 U+03B1 # GREEK SMALL LETTER ALPHA
+0xA6C2 U+03B2 # GREEK SMALL LETTER BETA
+0xA6C3 U+03B3 # GREEK SMALL LETTER GAMMA
+0xA6C4 U+03B4 # GREEK SMALL LETTER DELTA
+0xA6C5 U+03B5 # GREEK SMALL LETTER EPSILON
+0xA6C6 U+03B6 # GREEK SMALL LETTER ZETA
+0xA6C7 U+03B7 # GREEK SMALL LETTER ETA
+0xA6C8 U+03B8 # GREEK SMALL LETTER THETA
+0xA6C9 U+03B9 # GREEK SMALL LETTER IOTA
+0xA6CA U+03BA # GREEK SMALL LETTER KAPPA
+0xA6CB U+03BB # GREEK SMALL LETTER LAMDA
+0xA6CC U+03BC # GREEK SMALL LETTER MU
+0xA6CD U+03BD # GREEK SMALL LETTER NU
+0xA6CE U+03BE # GREEK SMALL LETTER XI
+0xA6CF U+03BF # GREEK SMALL LETTER OMICRON
+0xA6D0 U+03C0 # GREEK SMALL LETTER PI
+0xA6D1 U+03C1 # GREEK SMALL LETTER RHO
+0xA6D2 U+03C3 # GREEK SMALL LETTER SIGMA
+0xA6D3 U+03C4 # GREEK SMALL LETTER TAU
+0xA6D4 U+03C5 # GREEK SMALL LETTER UPSILON
+0xA6D5 U+03C6 # GREEK SMALL LETTER PHI
+0xA6D6 U+03C7 # GREEK SMALL LETTER CHI
+0xA6D7 U+03C8 # GREEK SMALL LETTER PSI
+0xA6D8 U+03C9 # GREEK SMALL LETTER OMEGA
+0xA6D9 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000]
+0xA6DA U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2]
+0xA6DB U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2]
+0xA6DC U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2]
+0xA6DD U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2]
+0xA6DE U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2]
+0xA6DF U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2]
+0xA6E0 U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2]
+0xA6E1 U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2]
+0xA6E2 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2]
+0xA6E3 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2]
+0xA6E4 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2]
+0xA6E5 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2]
+0xA6E6 U+3020 # POSTAL MARK FACE [2000]
+0xA6E7 U+260E # BLACK TELEPHONE [2000]
+0xA6E8 U+2600 # BLACK SUN WITH RAYS [2000]
+0xA6E9 U+2601 # CLOUD [2000]
+0xA6EA U+2602 # UMBRELLA [2000]
+0xA6EB U+2603 # SNOWMAN [2000]
+0xA6EC U+2668 # HOT SPRINGS [2000]
+0xA6ED U+25B1 # WHITE PARALLELOGRAM [2000]
+0xA6EE U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2]
+0xA6EF U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2]
+0xA6F0 U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2]
+0xA6F1 U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2]
+0xA6F2 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2]
+0xA6F3 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2]
+0xA6F4 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2]
+0xA6F5 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2]
+0xA6F6 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2]
+0xA6F7 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2]
+0xA6F8 U+31F7+309A # [2000]
+0xA6F9 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2]
+0xA6FA U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2]
+0xA6FB U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2]
+0xA6FC U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2]
+0xA6FD U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2]
+0xA6FE U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2]
+0xA7A1 U+0410 # CYRILLIC CAPITAL LETTER A
+0xA7A2 U+0411 # CYRILLIC CAPITAL LETTER BE
+0xA7A3 U+0412 # CYRILLIC CAPITAL LETTER VE
+0xA7A4 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0xA7A5 U+0414 # CYRILLIC CAPITAL LETTER DE
+0xA7A6 U+0415 # CYRILLIC CAPITAL LETTER IE
+0xA7A7 U+0401 # CYRILLIC CAPITAL LETTER IO
+0xA7A8 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0xA7A9 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0xA7AA U+0418 # CYRILLIC CAPITAL LETTER I
+0xA7AB U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xA7AC U+041A # CYRILLIC CAPITAL LETTER KA
+0xA7AD U+041B # CYRILLIC CAPITAL LETTER EL
+0xA7AE U+041C # CYRILLIC CAPITAL LETTER EM
+0xA7AF U+041D # CYRILLIC CAPITAL LETTER EN
+0xA7B0 U+041E # CYRILLIC CAPITAL LETTER O
+0xA7B1 U+041F # CYRILLIC CAPITAL LETTER PE
+0xA7B2 U+0420 # CYRILLIC CAPITAL LETTER ER
+0xA7B3 U+0421 # CYRILLIC CAPITAL LETTER ES
+0xA7B4 U+0422 # CYRILLIC CAPITAL LETTER TE
+0xA7B5 U+0423 # CYRILLIC CAPITAL LETTER U
+0xA7B6 U+0424 # CYRILLIC CAPITAL LETTER EF
+0xA7B7 U+0425 # CYRILLIC CAPITAL LETTER HA
+0xA7B8 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0xA7B9 U+0427 # CYRILLIC CAPITAL LETTER CHE
+0xA7BA U+0428 # CYRILLIC CAPITAL LETTER SHA
+0xA7BB U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xA7BC U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0xA7BD U+042B # CYRILLIC CAPITAL LETTER YERU
+0xA7BE U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xA7BF U+042D # CYRILLIC CAPITAL LETTER E
+0xA7C0 U+042E # CYRILLIC CAPITAL LETTER YU
+0xA7C1 U+042F # CYRILLIC CAPITAL LETTER YA
+0xA7C2 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2]
+0xA7C3 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2]
+0xA7C4 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2]
+0xA7C5 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0xA7C6 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0xA7C7 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2]
+0xA7C8 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0xA7C9 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0xA7CA U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2]
+0xA7CB U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0xA7CC U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0xA7CD U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2]
+0xA7CE U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2]
+0xA7CF U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2]
+0xA7D0 U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2]
+0xA7D1 U+0430 # CYRILLIC SMALL LETTER A
+0xA7D2 U+0431 # CYRILLIC SMALL LETTER BE
+0xA7D3 U+0432 # CYRILLIC SMALL LETTER VE
+0xA7D4 U+0433 # CYRILLIC SMALL LETTER GHE
+0xA7D5 U+0434 # CYRILLIC SMALL LETTER DE
+0xA7D6 U+0435 # CYRILLIC SMALL LETTER IE
+0xA7D7 U+0451 # CYRILLIC SMALL LETTER IO
+0xA7D8 U+0436 # CYRILLIC SMALL LETTER ZHE
+0xA7D9 U+0437 # CYRILLIC SMALL LETTER ZE
+0xA7DA U+0438 # CYRILLIC SMALL LETTER I
+0xA7DB U+0439 # CYRILLIC SMALL LETTER SHORT I
+0xA7DC U+043A # CYRILLIC SMALL LETTER KA
+0xA7DD U+043B # CYRILLIC SMALL LETTER EL
+0xA7DE U+043C # CYRILLIC SMALL LETTER EM
+0xA7DF U+043D # CYRILLIC SMALL LETTER EN
+0xA7E0 U+043E # CYRILLIC SMALL LETTER O
+0xA7E1 U+043F # CYRILLIC SMALL LETTER PE
+0xA7E2 U+0440 # CYRILLIC SMALL LETTER ER
+0xA7E3 U+0441 # CYRILLIC SMALL LETTER ES
+0xA7E4 U+0442 # CYRILLIC SMALL LETTER TE
+0xA7E5 U+0443 # CYRILLIC SMALL LETTER U
+0xA7E6 U+0444 # CYRILLIC SMALL LETTER EF
+0xA7E7 U+0445 # CYRILLIC SMALL LETTER HA
+0xA7E8 U+0446 # CYRILLIC SMALL LETTER TSE
+0xA7E9 U+0447 # CYRILLIC SMALL LETTER CHE
+0xA7EA U+0448 # CYRILLIC SMALL LETTER SHA
+0xA7EB U+0449 # CYRILLIC SMALL LETTER SHCHA
+0xA7EC U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0xA7ED U+044B # CYRILLIC SMALL LETTER YERU
+0xA7EE U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xA7EF U+044D # CYRILLIC SMALL LETTER E
+0xA7F0 U+044E # CYRILLIC SMALL LETTER YU
+0xA7F1 U+044F # CYRILLIC SMALL LETTER YA
+0xA7F2 U+30F7 # KATAKANA LETTER VA [2000]
+0xA7F3 U+30F8 # KATAKANA LETTER VI [2000]
+0xA7F4 U+30F9 # KATAKANA LETTER VE [2000]
+0xA7F5 U+30FA # KATAKANA LETTER VO [2000]
+0xA7F6 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000]
+0xA7F7 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000]
+0xA7F8 U+2153 # VULGAR FRACTION ONE THIRD [2000]
+0xA7F9 U+2154 # VULGAR FRACTION TWO THIRDS [2000]
+0xA7FA U+2155 # VULGAR FRACTION ONE FIFTH [2000]
+0xA7FB U+2713 # CHECK MARK [2000]
+0xA7FC U+2318 # PLACE OF INTEREST SIGN [2000]
+0xA7FD U+2423 # OPEN BOX [2000]
+0xA7FE U+23CE # RETURN SYMBOL [2000] [Unicode3.2]
+0xA8A1 U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983]
+0xA8A2 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983]
+0xA8A3 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983]
+0xA8A4 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983]
+0xA8A5 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983]
+0xA8A6 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983]
+0xA8A7 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983]
+0xA8A8 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983]
+0xA8A9 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983]
+0xA8AA U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983]
+0xA8AB U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983]
+0xA8AC U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983]
+0xA8AD U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983]
+0xA8AE U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983]
+0xA8AF U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983]
+0xA8B0 U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983]
+0xA8B1 U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983]
+0xA8B2 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983]
+0xA8B3 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983]
+0xA8B4 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983]
+0xA8B5 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983]
+0xA8B6 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983]
+0xA8B7 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983]
+0xA8B8 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983]
+0xA8B9 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983]
+0xA8BA U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983]
+0xA8BB U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983]
+0xA8BC U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983]
+0xA8BD U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983]
+0xA8BE U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983]
+0xA8BF U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983]
+0xA8C0 U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983]
+0xA8C1 U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2]
+0xA8C2 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2]
+0xA8C3 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2]
+0xA8C4 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2]
+0xA8C5 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2]
+0xA8C6 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2]
+0xA8C7 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2]
+0xA8C8 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2]
+0xA8C9 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2]
+0xA8CA U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2]
+0xA8CB U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2]
+0xA8CC U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2]
+0xA8CD U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2]
+0xA8CE U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2]
+0xA8CF U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2]
+0xA8D0 U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2]
+0xA8D1 U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2]
+0xA8D2 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2]
+0xA8D3 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2]
+0xA8D4 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2]
+0xA8D5 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2]
+0xA8D6 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2]
+0xA8D7 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2]
+0xA8D8 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2]
+0xA8D9 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2]
+0xA8DA U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2]
+0xA8DB U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2]
+0xA8DC U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2]
+0xA8DD U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2]
+0xA8DE U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2]
+0xA8DF # <reserved>
+0xA8E0 # <reserved>
+0xA8E1 # <reserved>
+0xA8E2 # <reserved>
+0xA8E3 # <reserved>
+0xA8E4 # <reserved>
+0xA8E5 # <reserved>
+0xA8E6 # <reserved>
+0xA8E7 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000]
+0xA8E8 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000]
+0xA8E9 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000]
+0xA8EA U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000]
+0xA8EB U+203C # DOUBLE EXCLAMATION MARK [2000]
+0xA8EC U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2]
+0xA8ED U+2048 # QUESTION EXCLAMATION MARK [2000]
+0xA8EE U+2049 # EXCLAMATION QUESTION MARK [2000]
+0xA8EF U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000]
+0xA8F0 U+01CE # LATIN SMALL LETTER A WITH CARON [2000]
+0xA8F1 U+01D0 # LATIN SMALL LETTER I WITH CARON [2000]
+0xA8F2 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000]
+0xA8F3 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000]
+0xA8F4 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000]
+0xA8F5 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000]
+0xA8F6 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000]
+0xA8F7 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000]
+0xA8F8 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000]
+0xA8F9 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000]
+0xA8FA U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000]
+0xA8FB U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000]
+0xA8FC U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000]
+0xA8FD # <reserved>
+0xA8FE # <reserved>
+0xA9A1 U+20AC # EURO SIGN [2000]
+0xA9A2 U+00A0 # NO-BREAK SPACE [2000]
+0xA9A3 U+00A1 # INVERTED EXCLAMATION MARK [2000]
+0xA9A4 U+00A4 # CURRENCY SIGN [2000]
+0xA9A5 U+00A6 # BROKEN BAR [2000]
+0xA9A6 U+00A9 # COPYRIGHT SIGN [2000]
+0xA9A7 U+00AA # FEMININE ORDINAL INDICATOR [2000]
+0xA9A8 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0xA9A9 U+00AD # SOFT HYPHEN [2000]
+0xA9AA U+00AE # REGISTERED SIGN [2000]
+0xA9AB U+00AF # MACRON [2000]
+0xA9AC U+00B2 # SUPERSCRIPT TWO [2000]
+0xA9AD U+00B3 # SUPERSCRIPT THREE [2000]
+0xA9AE U+00B7 # MIDDLE DOT [2000]
+0xA9AF U+00B8 # CEDILLA [2000]
+0xA9B0 U+00B9 # SUPERSCRIPT ONE [2000]
+0xA9B1 U+00BA # MASCULINE ORDINAL INDICATOR [2000]
+0xA9B2 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0xA9B3 U+00BC # VULGAR FRACTION ONE QUARTER [2000]
+0xA9B4 U+00BD # VULGAR FRACTION ONE HALF [2000]
+0xA9B5 U+00BE # VULGAR FRACTION THREE QUARTERS [2000]
+0xA9B6 U+00BF # INVERTED QUESTION MARK [2000]
+0xA9B7 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000]
+0xA9B8 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000]
+0xA9B9 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000]
+0xA9BA U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000]
+0xA9BB U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000]
+0xA9BC U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000]
+0xA9BD U+00C6 # LATIN CAPITAL LETTER AE [2000]
+0xA9BE U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000]
+0xA9BF U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000]
+0xA9C0 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000]
+0xA9C1 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000]
+0xA9C2 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000]
+0xA9C3 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000]
+0xA9C4 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000]
+0xA9C5 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000]
+0xA9C6 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000]
+0xA9C7 U+00D0 # LATIN CAPITAL LETTER ETH [2000]
+0xA9C8 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000]
+0xA9C9 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000]
+0xA9CA U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000]
+0xA9CB U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000]
+0xA9CC U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000]
+0xA9CD U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000]
+0xA9CE U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000]
+0xA9CF U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000]
+0xA9D0 U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000]
+0xA9D1 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000]
+0xA9D2 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000]
+0xA9D3 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000]
+0xA9D4 U+00DE # LATIN CAPITAL LETTER THORN [2000]
+0xA9D5 U+00DF # LATIN SMALL LETTER SHARP S [2000]
+0xA9D6 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000]
+0xA9D7 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000]
+0xA9D8 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000]
+0xA9D9 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000]
+0xA9DA U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000]
+0xA9DB U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000]
+0xA9DC U+00E6 # LATIN SMALL LETTER AE [2000]
+0xA9DD U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000]
+0xA9DE U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000]
+0xA9DF U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000]
+0xA9E0 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000]
+0xA9E1 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000]
+0xA9E2 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000]
+0xA9E3 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000]
+0xA9E4 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000]
+0xA9E5 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000]
+0xA9E6 U+00F0 # LATIN SMALL LETTER ETH [2000]
+0xA9E7 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000]
+0xA9E8 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000]
+0xA9E9 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000]
+0xA9EA U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000]
+0xA9EB U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000]
+0xA9EC U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000]
+0xA9ED U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000]
+0xA9EE U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000]
+0xA9EF U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000]
+0xA9F0 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000]
+0xA9F1 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000]
+0xA9F2 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000]
+0xA9F3 U+00FE # LATIN SMALL LETTER THORN [2000]
+0xA9F4 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000]
+0xA9F5 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000]
+0xA9F6 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000]
+0xA9F7 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000]
+0xA9F8 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000]
+0xA9F9 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000]
+0xA9FA U+0101 # LATIN SMALL LETTER A WITH MACRON [2000]
+0xA9FB U+012B # LATIN SMALL LETTER I WITH MACRON [2000]
+0xA9FC U+016B # LATIN SMALL LETTER U WITH MACRON [2000]
+0xA9FD U+0113 # LATIN SMALL LETTER E WITH MACRON [2000]
+0xA9FE U+014D # LATIN SMALL LETTER O WITH MACRON [2000]
+0xAAA1 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000]
+0xAAA2 U+02D8 # BREVE [2000]
+0xAAA3 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000]
+0xAAA4 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000]
+0xAAA5 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000]
+0xAAA6 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000]
+0xAAA7 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000]
+0xAAA8 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000]
+0xAAA9 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000]
+0xAAAA U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000]
+0xAAAB U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000]
+0xAAAC U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000]
+0xAAAD U+02DB # OGONEK [2000]
+0xAAAE U+0142 # LATIN SMALL LETTER L WITH STROKE [2000]
+0xAAAF U+013E # LATIN SMALL LETTER L WITH CARON [2000]
+0xAAB0 U+015B # LATIN SMALL LETTER S WITH ACUTE [2000]
+0xAAB1 U+02C7 # CARON [2000]
+0xAAB2 U+0161 # LATIN SMALL LETTER S WITH CARON [2000]
+0xAAB3 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000]
+0xAAB4 U+0165 # LATIN SMALL LETTER T WITH CARON [2000]
+0xAAB5 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000]
+0xAAB6 U+02DD # DOUBLE ACUTE ACCENT [2000]
+0xAAB7 U+017E # LATIN SMALL LETTER Z WITH CARON [2000]
+0xAAB8 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000]
+0xAAB9 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000]
+0xAABA U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000]
+0xAABB U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000]
+0xAABC U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000]
+0xAABD U+010C # LATIN CAPITAL LETTER C WITH CARON [2000]
+0xAABE U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000]
+0xAABF U+011A # LATIN CAPITAL LETTER E WITH CARON [2000]
+0xAAC0 U+010E # LATIN CAPITAL LETTER D WITH CARON [2000]
+0xAAC1 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000]
+0xAAC2 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000]
+0xAAC3 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000]
+0xAAC4 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000]
+0xAAC5 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000]
+0xAAC6 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000]
+0xAAC7 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000]
+0xAAC8 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000]
+0xAAC9 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000]
+0xAACA U+013A # LATIN SMALL LETTER L WITH ACUTE [2000]
+0xAACB U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000]
+0xAACC U+010D # LATIN SMALL LETTER C WITH CARON [2000]
+0xAACD U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000]
+0xAACE U+011B # LATIN SMALL LETTER E WITH CARON [2000]
+0xAACF U+010F # LATIN SMALL LETTER D WITH CARON [2000]
+0xAAD0 U+0111 # LATIN SMALL LETTER D WITH STROKE [2000]
+0xAAD1 U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000]
+0xAAD2 U+0148 # LATIN SMALL LETTER N WITH CARON [2000]
+0xAAD3 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000]
+0xAAD4 U+0159 # LATIN SMALL LETTER R WITH CARON [2000]
+0xAAD5 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000]
+0xAAD6 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000]
+0xAAD7 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000]
+0xAAD8 U+02D9 # DOT ABOVE [2000]
+0xAAD9 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000]
+0xAADA U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000]
+0xAADB U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000]
+0xAADC U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000]
+0xAADD U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000]
+0xAADE U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000]
+0xAADF U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000]
+0xAAE0 U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000]
+0xAAE1 U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000]
+0xAAE2 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000]
+0xAAE3 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000]
+0xAAE4 U+016D # LATIN SMALL LETTER U WITH BREVE [2000]
+0xAAE5 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000]
+0xAAE6 U+028B # LATIN SMALL LETTER V WITH HOOK [2000]
+0xAAE7 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000]
+0xAAE8 U+0283 # LATIN SMALL LETTER ESH [2000]
+0xAAE9 U+0292 # LATIN SMALL LETTER EZH [2000]
+0xAAEA U+026C # LATIN SMALL LETTER L WITH BELT [2000]
+0xAAEB U+026E # LATIN SMALL LETTER LEZH [2000]
+0xAAEC U+0279 # LATIN SMALL LETTER TURNED R [2000]
+0xAAED U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000]
+0xAAEE U+0256 # LATIN SMALL LETTER D WITH TAIL [2000]
+0xAAEF U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000]
+0xAAF0 U+027D # LATIN SMALL LETTER R WITH TAIL [2000]
+0xAAF1 U+0282 # LATIN SMALL LETTER S WITH HOOK [2000]
+0xAAF2 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000]
+0xAAF3 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000]
+0xAAF4 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000]
+0xAAF5 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000]
+0xAAF6 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000]
+0xAAF7 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000]
+0xAAF8 U+028E # LATIN SMALL LETTER TURNED Y [2000]
+0xAAF9 U+0261 # LATIN SMALL LETTER SCRIPT G [2000]
+0xAAFA U+014B # LATIN SMALL LETTER ENG [2000]
+0xAAFB U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000]
+0xAAFC U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000]
+0xAAFD U+0127 # LATIN SMALL LETTER H WITH STROKE [2000]
+0xAAFE U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000]
+0xABA1 U+0294 # LATIN LETTER GLOTTAL STOP [2000]
+0xABA2 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000]
+0xABA3 U+0298 # LATIN LETTER BILABIAL CLICK [2000]
+0xABA4 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000]
+0xABA5 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000]
+0xABA6 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000]
+0xABA7 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000]
+0xABA8 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000]
+0xABA9 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000]
+0xABAA U+0153 # LATIN SMALL LIGATURE OE [2000]
+0xABAB U+0152 # LATIN CAPITAL LIGATURE OE [2000]
+0xABAC U+0268 # LATIN SMALL LETTER I WITH STROKE [2000]
+0xABAD U+0289 # LATIN SMALL LETTER U BAR [2000]
+0xABAE U+0258 # LATIN SMALL LETTER REVERSED E [2000]
+0xABAF U+0275 # LATIN SMALL LETTER BARRED O [2000]
+0xABB0 U+0259 # LATIN SMALL LETTER SCHWA [2000]
+0xABB1 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000]
+0xABB2 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000]
+0xABB3 U+0250 # LATIN SMALL LETTER TURNED A [2000]
+0xABB4 U+026F # LATIN SMALL LETTER TURNED M [2000]
+0xABB5 U+028A # LATIN SMALL LETTER UPSILON [2000]
+0xABB6 U+0264 # LATIN SMALL LETTER RAMS HORN [2000]
+0xABB7 U+028C # LATIN SMALL LETTER TURNED V [2000]
+0xABB8 U+0254 # LATIN SMALL LETTER OPEN O [2000]
+0xABB9 U+0251 # LATIN SMALL LETTER ALPHA [2000]
+0xABBA U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000]
+0xABBB U+028D # LATIN SMALL LETTER TURNED W [2000]
+0xABBC U+0265 # LATIN SMALL LETTER TURNED H [2000]
+0xABBD U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000]
+0xABBE U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000]
+0xABBF U+0255 # LATIN SMALL LETTER C WITH CURL [2000]
+0xABC0 U+0291 # LATIN SMALL LETTER Z WITH CURL [2000]
+0xABC1 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000]
+0xABC2 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000]
+0xABC3 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000]
+0xABC4 U+00E6+0300 # [2000]
+0xABC5 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000]
+0xABC6 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000]
+0xABC7 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000]
+0xABC8 U+0254+0300 # [2000]
+0xABC9 U+0254+0301 # [2000]
+0xABCA U+028C+0300 # [2000]
+0xABCB U+028C+0301 # [2000]
+0xABCC U+0259+0300 # [2000]
+0xABCD U+0259+0301 # [2000]
+0xABCE U+025A+0300 # [2000]
+0xABCF U+025A+0301 # [2000]
+0xABD0 U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000]
+0xABD1 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000]
+0xABD2 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000]
+0xABD3 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000]
+0xABD4 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000]
+0xABD5 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000]
+0xABD6 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000]
+0xABD7 U+0306 # COMBINING BREVE [2000]
+0xABD8 U+203F # UNDERTIE [2000]
+0xABD9 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000]
+0xABDA U+0301 # COMBINING ACUTE ACCENT [2000]
+0xABDB U+0304 # COMBINING MACRON [2000]
+0xABDC U+0300 # COMBINING GRAVE ACCENT [2000]
+0xABDD U+030F # COMBINING DOUBLE GRAVE ACCENT [2000]
+0xABDE U+030C # COMBINING CARON [2000]
+0xABDF U+0302 # COMBINING CIRCUMFLEX ACCENT [2000]
+0xABE0 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000]
+0xABE1 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000]
+0xABE2 U+02E7 # MODIFIER LETTER MID TONE BAR [2000]
+0xABE3 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000]
+0xABE4 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000]
+0xABE5 U+02E9+02E5 # [2000]
+0xABE6 U+02E5+02E9 # [2000]
+0xABE7 U+0325 # COMBINING RING BELOW [2000]
+0xABE8 U+032C # COMBINING CARON BELOW [2000]
+0xABE9 U+0339 # COMBINING RIGHT HALF RING BELOW [2000]
+0xABEA U+031C # COMBINING LEFT HALF RING BELOW [2000]
+0xABEB U+031F # COMBINING PLUS SIGN BELOW [2000]
+0xABEC U+0320 # COMBINING MINUS SIGN BELOW [2000]
+0xABED U+0308 # COMBINING DIAERESIS [2000]
+0xABEE U+033D # COMBINING X ABOVE [2000]
+0xABEF U+0329 # COMBINING VERTICAL LINE BELOW [2000]
+0xABF0 U+032F # COMBINING INVERTED BREVE BELOW [2000]
+0xABF1 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000]
+0xABF2 U+0324 # COMBINING DIAERESIS BELOW [2000]
+0xABF3 U+0330 # COMBINING TILDE BELOW [2000]
+0xABF4 U+033C # COMBINING SEAGULL BELOW [2000]
+0xABF5 U+0334 # COMBINING TILDE OVERLAY [2000]
+0xABF6 U+031D # COMBINING UP TACK BELOW [2000]
+0xABF7 U+031E # COMBINING DOWN TACK BELOW [2000]
+0xABF8 U+0318 # COMBINING LEFT TACK BELOW [2000]
+0xABF9 U+0319 # COMBINING RIGHT TACK BELOW [2000]
+0xABFA U+032A # COMBINING BRIDGE BELOW [2000]
+0xABFB U+033A # COMBINING INVERTED BRIDGE BELOW [2000]
+0xABFC U+033B # COMBINING SQUARE BELOW [2000]
+0xABFD U+0303 # COMBINING TILDE [2000]
+0xABFE U+031A # COMBINING LEFT ANGLE ABOVE [2000]
+0xACA1 U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000]
+0xACA2 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000]
+0xACA3 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000]
+0xACA4 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000]
+0xACA5 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000]
+0xACA6 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000]
+0xACA7 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000]
+0xACA8 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000]
+0xACA9 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000]
+0xACAA U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000]
+0xACAB U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2]
+0xACAC U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2]
+0xACAD U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2]
+0xACAE U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2]
+0xACAF U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2]
+0xACB0 U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2]
+0xACB1 U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2]
+0xACB2 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2]
+0xACB3 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2]
+0xACB4 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2]
+0xACB5 U+2170 # SMALL ROMAN NUMERAL ONE [2000]
+0xACB6 U+2171 # SMALL ROMAN NUMERAL TWO [2000]
+0xACB7 U+2172 # SMALL ROMAN NUMERAL THREE [2000]
+0xACB8 U+2173 # SMALL ROMAN NUMERAL FOUR [2000]
+0xACB9 U+2174 # SMALL ROMAN NUMERAL FIVE [2000]
+0xACBA U+2175 # SMALL ROMAN NUMERAL SIX [2000]
+0xACBB U+2176 # SMALL ROMAN NUMERAL SEVEN [2000]
+0xACBC U+2177 # SMALL ROMAN NUMERAL EIGHT [2000]
+0xACBD U+2178 # SMALL ROMAN NUMERAL NINE [2000]
+0xACBE U+2179 # SMALL ROMAN NUMERAL TEN [2000]
+0xACBF U+217A # SMALL ROMAN NUMERAL ELEVEN [2000]
+0xACC0 U+217B # SMALL ROMAN NUMERAL TWELVE [2000]
+0xACC1 U+24D0 # CIRCLED LATIN SMALL LETTER A [2000]
+0xACC2 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000]
+0xACC3 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000]
+0xACC4 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000]
+0xACC5 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000]
+0xACC6 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000]
+0xACC7 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000]
+0xACC8 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000]
+0xACC9 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000]
+0xACCA U+24D9 # CIRCLED LATIN SMALL LETTER J [2000]
+0xACCB U+24DA # CIRCLED LATIN SMALL LETTER K [2000]
+0xACCC U+24DB # CIRCLED LATIN SMALL LETTER L [2000]
+0xACCD U+24DC # CIRCLED LATIN SMALL LETTER M [2000]
+0xACCE U+24DD # CIRCLED LATIN SMALL LETTER N [2000]
+0xACCF U+24DE # CIRCLED LATIN SMALL LETTER O [2000]
+0xACD0 U+24DF # CIRCLED LATIN SMALL LETTER P [2000]
+0xACD1 U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000]
+0xACD2 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000]
+0xACD3 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000]
+0xACD4 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000]
+0xACD5 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000]
+0xACD6 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000]
+0xACD7 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000]
+0xACD8 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000]
+0xACD9 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000]
+0xACDA U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000]
+0xACDB U+32D0 # CIRCLED KATAKANA A [2000]
+0xACDC U+32D1 # CIRCLED KATAKANA I [2000]
+0xACDD U+32D2 # CIRCLED KATAKANA U [2000]
+0xACDE U+32D3 # CIRCLED KATAKANA E [2000]
+0xACDF U+32D4 # CIRCLED KATAKANA O [2000]
+0xACE0 U+32D5 # CIRCLED KATAKANA KA [2000]
+0xACE1 U+32D6 # CIRCLED KATAKANA KI [2000]
+0xACE2 U+32D7 # CIRCLED KATAKANA KU [2000]
+0xACE3 U+32D8 # CIRCLED KATAKANA KE [2000]
+0xACE4 U+32D9 # CIRCLED KATAKANA KO [2000]
+0xACE5 U+32DA # CIRCLED KATAKANA SA [2000]
+0xACE6 U+32DB # CIRCLED KATAKANA SI [2000]
+0xACE7 U+32DC # CIRCLED KATAKANA SU [2000]
+0xACE8 U+32DD # CIRCLED KATAKANA SE [2000]
+0xACE9 U+32DE # CIRCLED KATAKANA SO [2000]
+0xACEA U+32DF # CIRCLED KATAKANA TA [2000]
+0xACEB U+32E0 # CIRCLED KATAKANA TI [2000]
+0xACEC U+32E1 # CIRCLED KATAKANA TU [2000]
+0xACED U+32E2 # CIRCLED KATAKANA TE [2000]
+0xACEE U+32E3 # CIRCLED KATAKANA TO [2000]
+0xACEF U+32FA # CIRCLED KATAKANA RO [2000]
+0xACF0 U+32E9 # CIRCLED KATAKANA HA [2000]
+0xACF1 U+32E5 # CIRCLED KATAKANA NI [2000]
+0xACF2 U+32ED # CIRCLED KATAKANA HO [2000]
+0xACF3 U+32EC # CIRCLED KATAKANA HE [2000]
+0xACF4 # <reserved>
+0xACF5 # <reserved>
+0xACF6 # <reserved>
+0xACF7 # <reserved>
+0xACF8 # <reserved>
+0xACF9 # <reserved>
+0xACFA # <reserved>
+0xACFB # <reserved>
+0xACFC # <reserved>
+0xACFD U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2]
+0xACFE U+2042 # ASTERISM [2000]
+0xADA1 U+2460 # CIRCLED DIGIT ONE [2000]
+0xADA2 U+2461 # CIRCLED DIGIT TWO [2000]
+0xADA3 U+2462 # CIRCLED DIGIT THREE [2000]
+0xADA4 U+2463 # CIRCLED DIGIT FOUR [2000]
+0xADA5 U+2464 # CIRCLED DIGIT FIVE [2000]
+0xADA6 U+2465 # CIRCLED DIGIT SIX [2000]
+0xADA7 U+2466 # CIRCLED DIGIT SEVEN [2000]
+0xADA8 U+2467 # CIRCLED DIGIT EIGHT [2000]
+0xADA9 U+2468 # CIRCLED DIGIT NINE [2000]
+0xADAA U+2469 # CIRCLED NUMBER TEN [2000]
+0xADAB U+246A # CIRCLED NUMBER ELEVEN [2000]
+0xADAC U+246B # CIRCLED NUMBER TWELVE [2000]
+0xADAD U+246C # CIRCLED NUMBER THIRTEEN [2000]
+0xADAE U+246D # CIRCLED NUMBER FOURTEEN [2000]
+0xADAF U+246E # CIRCLED NUMBER FIFTEEN [2000]
+0xADB0 U+246F # CIRCLED NUMBER SIXTEEN [2000]
+0xADB1 U+2470 # CIRCLED NUMBER SEVENTEEN [2000]
+0xADB2 U+2471 # CIRCLED NUMBER EIGHTEEN [2000]
+0xADB3 U+2472 # CIRCLED NUMBER NINETEEN [2000]
+0xADB4 U+2473 # CIRCLED NUMBER TWENTY [2000]
+0xADB5 U+2160 # ROMAN NUMERAL ONE [2000]
+0xADB6 U+2161 # ROMAN NUMERAL TWO [2000]
+0xADB7 U+2162 # ROMAN NUMERAL THREE [2000]
+0xADB8 U+2163 # ROMAN NUMERAL FOUR [2000]
+0xADB9 U+2164 # ROMAN NUMERAL FIVE [2000]
+0xADBA U+2165 # ROMAN NUMERAL SIX [2000]
+0xADBB U+2166 # ROMAN NUMERAL SEVEN [2000]
+0xADBC U+2167 # ROMAN NUMERAL EIGHT [2000]
+0xADBD U+2168 # ROMAN NUMERAL NINE [2000]
+0xADBE U+2169 # ROMAN NUMERAL TEN [2000]
+0xADBF U+216A # ROMAN NUMERAL ELEVEN [2000]
+0xADC0 U+3349 # SQUARE MIRI [2000]
+0xADC1 U+3314 # SQUARE KIRO [2000]
+0xADC2 U+3322 # SQUARE SENTI [2000]
+0xADC3 U+334D # SQUARE MEETORU [2000]
+0xADC4 U+3318 # SQUARE GURAMU [2000]
+0xADC5 U+3327 # SQUARE TON [2000]
+0xADC6 U+3303 # SQUARE AARU [2000]
+0xADC7 U+3336 # SQUARE HEKUTAARU [2000]
+0xADC8 U+3351 # SQUARE RITTORU [2000]
+0xADC9 U+3357 # SQUARE WATTO [2000]
+0xADCA U+330D # SQUARE KARORII [2000]
+0xADCB U+3326 # SQUARE DORU [2000]
+0xADCC U+3323 # SQUARE SENTO [2000]
+0xADCD U+332B # SQUARE PAASENTO [2000]
+0xADCE U+334A # SQUARE MIRIBAARU [2000]
+0xADCF U+333B # SQUARE PEEZI [2000]
+0xADD0 U+339C # SQUARE MM [2000]
+0xADD1 U+339D # SQUARE CM [2000]
+0xADD2 U+339E # SQUARE KM [2000]
+0xADD3 U+338E # SQUARE MG [2000]
+0xADD4 U+338F # SQUARE KG [2000]
+0xADD5 U+33C4 # SQUARE CC [2000]
+0xADD6 U+33A1 # SQUARE M SQUARED [2000]
+0xADD7 U+216B # ROMAN NUMERAL TWELVE [2000]
+0xADD8 # <reserved>
+0xADD9 # <reserved>
+0xADDA # <reserved>
+0xADDB # <reserved>
+0xADDC # <reserved>
+0xADDD # <reserved>
+0xADDE # <reserved>
+0xADDF U+337B # SQUARE ERA NAME HEISEI [2000]
+0xADE0 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000]
+0xADE1 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000]
+0xADE2 U+2116 # NUMERO SIGN [2000]
+0xADE3 U+33CD # SQUARE KK [2000]
+0xADE4 U+2121 # TELEPHONE SIGN [2000]
+0xADE5 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000]
+0xADE6 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000]
+0xADE7 U+32A6 # CIRCLED IDEOGRAPH LOW [2000]
+0xADE8 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000]
+0xADE9 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000]
+0xADEA U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000]
+0xADEB U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000]
+0xADEC U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000]
+0xADED U+337E # SQUARE ERA NAME MEIZI [2000]
+0xADEE U+337D # SQUARE ERA NAME TAISYOU [2000]
+0xADEF U+337C # SQUARE ERA NAME SYOUWA [2000]
+0xADF0 # <reserved> Windows: U+2252
+0xADF1 # <reserved> Windows: U+2261
+0xADF2 # <reserved> Windows: U+222B
+0xADF3 U+222E # CONTOUR INTEGRAL [2000]
+0xADF4 # <reserved> Windows: U+2211
+0xADF5 # <reserved> Windows: U+221A
+0xADF6 # <reserved> Windows: U+22A5
+0xADF7 # <reserved> Windows: U+2220
+0xADF8 U+221F # RIGHT ANGLE [2000]
+0xADF9 U+22BF # RIGHT TRIANGLE [2000]
+0xADFA # <reserved> Windows: U+2235
+0xADFB # <reserved> Windows: U+2229
+0xADFC # <reserved> Windows: U+222A
+0xADFD U+2756 # BLACK DIAMOND MINUS WHITE X [2000]
+0xADFE U+261E # WHITE RIGHT POINTING INDEX [2000]
+0xAEA1 U+4FF1 # <cjk> [2004]
+0xAEA2 U+2000B # <cjk> [2000] [Unicode3.1]
+0xAEA3 U+3402 # <cjk> [2000]
+0xAEA4 U+4E28 # <cjk> [2000]
+0xAEA5 U+4E2F # <cjk> [2000]
+0xAEA6 U+4E30 # <cjk> [2000]
+0xAEA7 U+4E8D # <cjk> [2000]
+0xAEA8 U+4EE1 # <cjk> [2000]
+0xAEA9 U+4EFD # <cjk> [2000]
+0xAEAA U+4EFF # <cjk> [2000]
+0xAEAB U+4F03 # <cjk> [2000]
+0xAEAC U+4F0B # <cjk> [2000]
+0xAEAD U+4F60 # <cjk> [2000]
+0xAEAE U+4F48 # <cjk> [2000]
+0xAEAF U+4F49 # <cjk> [2000]
+0xAEB0 U+4F56 # <cjk> [2000]
+0xAEB1 U+4F5F # <cjk> [2000]
+0xAEB2 U+4F6A # <cjk> [2000]
+0xAEB3 U+4F6C # <cjk> [2000]
+0xAEB4 U+4F7E # <cjk> [2000]
+0xAEB5 U+4F8A # <cjk> [2000]
+0xAEB6 U+4F94 # <cjk> [2000]
+0xAEB7 U+4F97 # <cjk> [2000]
+0xAEB8 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2]
+0xAEB9 U+4FC9 # <cjk> [2000]
+0xAEBA U+4FE0 # <cjk> [2000]
+0xAEBB U+5001 # <cjk> [2000]
+0xAEBC U+5002 # <cjk> [2000]
+0xAEBD U+500E # <cjk> [2000]
+0xAEBE U+5018 # <cjk> [2000]
+0xAEBF U+5027 # <cjk> [2000]
+0xAEC0 U+502E # <cjk> [2000]
+0xAEC1 U+5040 # <cjk> [2000]
+0xAEC2 U+503B # <cjk> [2000]
+0xAEC3 U+5041 # <cjk> [2000]
+0xAEC4 U+5094 # <cjk> [2000]
+0xAEC5 U+50CC # <cjk> [2000]
+0xAEC6 U+50F2 # <cjk> [2000]
+0xAEC7 U+50D0 # <cjk> [2000]
+0xAEC8 U+50E6 # <cjk> [2000]
+0xAEC9 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2]
+0xAECA U+5106 # <cjk> [2000]
+0xAECB U+5103 # <cjk> [2000]
+0xAECC U+510B # <cjk> [2000]
+0xAECD U+511E # <cjk> [2000]
+0xAECE U+5135 # <cjk> [2000]
+0xAECF U+514A # <cjk> [2000]
+0xAED0 U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2]
+0xAED1 U+5155 # <cjk> [2000]
+0xAED2 U+5157 # <cjk> [2000]
+0xAED3 U+34B5 # <cjk> [2000]
+0xAED4 U+519D # <cjk> [2000]
+0xAED5 U+51C3 # <cjk> [2000]
+0xAED6 U+51CA # <cjk> [2000]
+0xAED7 U+51DE # <cjk> [2000]
+0xAED8 U+51E2 # <cjk> [2000]
+0xAED9 U+51EE # <cjk> [2000]
+0xAEDA U+5201 # <cjk> [2000]
+0xAEDB U+34DB # <cjk> [2000]
+0xAEDC U+5213 # <cjk> [2000]
+0xAEDD U+5215 # <cjk> [2000]
+0xAEDE U+5249 # <cjk> [2000]
+0xAEDF U+5257 # <cjk> [2000]
+0xAEE0 U+5261 # <cjk> [2000]
+0xAEE1 U+5293 # <cjk> [2000]
+0xAEE2 U+52C8 # <cjk> [2000]
+0xAEE3 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2]
+0xAEE4 U+52CC # <cjk> [2000]
+0xAEE5 U+52D0 # <cjk> [2000]
+0xAEE6 U+52D6 # <cjk> [2000]
+0xAEE7 U+52DB # <cjk> [2000]
+0xAEE8 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2]
+0xAEE9 U+52F0 # <cjk> [2000]
+0xAEEA U+52FB # <cjk> [2000]
+0xAEEB U+5300 # <cjk> [2000]
+0xAEEC U+5307 # <cjk> [2000]
+0xAEED U+531C # <cjk> [2000]
+0xAEEE U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2]
+0xAEEF U+5361 # <cjk> [2000]
+0xAEF0 U+5363 # <cjk> [2000]
+0xAEF1 U+537D # <cjk> [2000]
+0xAEF2 U+5393 # <cjk> [2000]
+0xAEF3 U+539D # <cjk> [2000]
+0xAEF4 U+53B2 # <cjk> [2000]
+0xAEF5 U+5412 # <cjk> [2000]
+0xAEF6 U+5427 # <cjk> [2000]
+0xAEF7 U+544D # <cjk> [2000]
+0xAEF8 U+549C # <cjk> [2000]
+0xAEF9 U+546B # <cjk> [2000]
+0xAEFA U+5474 # <cjk> [2000]
+0xAEFB U+547F # <cjk> [2000]
+0xAEFC U+5488 # <cjk> [2000]
+0xAEFD U+5496 # <cjk> [2000]
+0xAEFE U+54A1 # <cjk> [2000]
+0xAFA1 U+54A9 # <cjk> [2000]
+0xAFA2 U+54C6 # <cjk> [2000]
+0xAFA3 U+54FF # <cjk> [2000]
+0xAFA4 U+550E # <cjk> [2000]
+0xAFA5 U+552B # <cjk> [2000]
+0xAFA6 U+5535 # <cjk> [2000]
+0xAFA7 U+5550 # <cjk> [2000]
+0xAFA8 U+555E # <cjk> [2000]
+0xAFA9 U+5581 # <cjk> [2000]
+0xAFAA U+5586 # <cjk> [2000]
+0xAFAB U+558E # <cjk> [2000]
+0xAFAC U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2]
+0xAFAD U+55AD # <cjk> [2000]
+0xAFAE U+55CE # <cjk> [2000]
+0xAFAF U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2]
+0xAFB0 U+5608 # <cjk> [2000]
+0xAFB1 U+560E # <cjk> [2000]
+0xAFB2 U+563B # <cjk> [2000]
+0xAFB3 U+5649 # <cjk> [2000]
+0xAFB4 U+5676 # <cjk> [2000]
+0xAFB5 U+5666 # <cjk> [2000]
+0xAFB6 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2]
+0xAFB7 U+566F # <cjk> [2000]
+0xAFB8 U+5671 # <cjk> [2000]
+0xAFB9 U+5672 # <cjk> [2000]
+0xAFBA U+5699 # <cjk> [2000]
+0xAFBB U+569E # <cjk> [2000]
+0xAFBC U+56A9 # <cjk> [2000]
+0xAFBD U+56AC # <cjk> [2000]
+0xAFBE U+56B3 # <cjk> [2000]
+0xAFBF U+56C9 # <cjk> [2000]
+0xAFC0 U+56CA # <cjk> [2000]
+0xAFC1 U+570A # <cjk> [2000]
+0xAFC2 U+2123D # <cjk> [2000] [Unicode3.1]
+0xAFC3 U+5721 # <cjk> [2000]
+0xAFC4 U+572F # <cjk> [2000]
+0xAFC5 U+5733 # <cjk> [2000]
+0xAFC6 U+5734 # <cjk> [2000]
+0xAFC7 U+5770 # <cjk> [2000]
+0xAFC8 U+5777 # <cjk> [2000]
+0xAFC9 U+577C # <cjk> [2000]
+0xAFCA U+579C # <cjk> [2000]
+0xAFCB U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000]
+0xAFCC U+2131B # <cjk> [2000] [Unicode3.1]
+0xAFCD U+57B8 # <cjk> [2000]
+0xAFCE U+57C7 # <cjk> [2000]
+0xAFCF U+57C8 # <cjk> [2000]
+0xAFD0 U+57CF # <cjk> [2000]
+0xAFD1 U+57E4 # <cjk> [2000]
+0xAFD2 U+57ED # <cjk> [2000]
+0xAFD3 U+57F5 # <cjk> [2000]
+0xAFD4 U+57F6 # <cjk> [2000]
+0xAFD5 U+57FF # <cjk> [2000]
+0xAFD6 U+5809 # <cjk> [2000]
+0xAFD7 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000]
+0xAFD8 U+5861 # <cjk> [2000]
+0xAFD9 U+5864 # <cjk> [2000]
+0xAFDA U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2]
+0xAFDB U+587C # <cjk> [2000]
+0xAFDC U+5889 # <cjk> [2000]
+0xAFDD U+589E # <cjk> [2000]
+0xAFDE U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2]
+0xAFDF U+58A9 # <cjk> [2000]
+0xAFE0 U+2146E # <cjk> [2000] [Unicode3.1]
+0xAFE1 U+58D2 # <cjk> [2000]
+0xAFE2 U+58CE # <cjk> [2000]
+0xAFE3 U+58D4 # <cjk> [2000]
+0xAFE4 U+58DA # <cjk> [2000]
+0xAFE5 U+58E0 # <cjk> [2000]
+0xAFE6 U+58E9 # <cjk> [2000]
+0xAFE7 U+590C # <cjk> [2000]
+0xAFE8 U+8641 # <cjk> [2000]
+0xAFE9 U+595D # <cjk> [2000]
+0xAFEA U+596D # <cjk> [2000]
+0xAFEB U+598B # <cjk> [2000]
+0xAFEC U+5992 # <cjk> [2000]
+0xAFED U+59A4 # <cjk> [2000]
+0xAFEE U+59C3 # <cjk> [2000]
+0xAFEF U+59D2 # <cjk> [2000]
+0xAFF0 U+59DD # <cjk> [2000]
+0xAFF1 U+5A13 # <cjk> [2000]
+0xAFF2 U+5A23 # <cjk> [2000]
+0xAFF3 U+5A67 # <cjk> [2000]
+0xAFF4 U+5A6D # <cjk> [2000]
+0xAFF5 U+5A77 # <cjk> [2000]
+0xAFF6 U+5A7E # <cjk> [2000]
+0xAFF7 U+5A84 # <cjk> [2000]
+0xAFF8 U+5A9E # <cjk> [2000]
+0xAFF9 U+5AA7 # <cjk> [2000]
+0xAFFA U+5AC4 # <cjk> [2000]
+0xAFFB U+218BD # <cjk> [2000] [Unicode3.1]
+0xAFFC U+5B19 # <cjk> [2000]
+0xAFFD U+5B25 # <cjk> [2000]
+0xAFFE U+525D # <cjk> [2004]
+0xB0A1 U+4E9C # <cjk>
+0xB0A2 U+5516 # <cjk>
+0xB0A3 U+5A03 # <cjk>
+0xB0A4 U+963F # <cjk>
+0xB0A5 U+54C0 # <cjk>
+0xB0A6 U+611B # <cjk>
+0xB0A7 U+6328 # <cjk>
+0xB0A8 U+59F6 # <cjk>
+0xB0A9 U+9022 # <cjk>
+0xB0AA U+8475 # <cjk>
+0xB0AB U+831C # <cjk>
+0xB0AC U+7A50 # <cjk>
+0xB0AD U+60AA # <cjk>
+0xB0AE U+63E1 # <cjk>
+0xB0AF U+6E25 # <cjk>
+0xB0B0 U+65ED # <cjk>
+0xB0B1 U+8466 # <cjk>
+0xB0B2 U+82A6 # <cjk>
+0xB0B3 U+9BF5 # <cjk>
+0xB0B4 U+6893 # <cjk>
+0xB0B5 U+5727 # <cjk>
+0xB0B6 U+65A1 # <cjk>
+0xB0B7 U+6271 # <cjk>
+0xB0B8 U+5B9B # <cjk>
+0xB0B9 U+59D0 # <cjk>
+0xB0BA U+867B # <cjk>
+0xB0BB U+98F4 # <cjk>
+0xB0BC U+7D62 # <cjk>
+0xB0BD U+7DBE # <cjk>
+0xB0BE U+9B8E # <cjk>
+0xB0BF U+6216 # <cjk>
+0xB0C0 U+7C9F # <cjk>
+0xB0C1 U+88B7 # <cjk>
+0xB0C2 U+5B89 # <cjk>
+0xB0C3 U+5EB5 # <cjk>
+0xB0C4 U+6309 # <cjk>
+0xB0C5 U+6697 # <cjk>
+0xB0C6 U+6848 # <cjk>
+0xB0C7 U+95C7 # <cjk>
+0xB0C8 U+978D # <cjk>
+0xB0C9 U+674F # <cjk>
+0xB0CA U+4EE5 # <cjk>
+0xB0CB U+4F0A # <cjk>
+0xB0CC U+4F4D # <cjk>
+0xB0CD U+4F9D # <cjk>
+0xB0CE U+5049 # <cjk>
+0xB0CF U+56F2 # <cjk>
+0xB0D0 U+5937 # <cjk>
+0xB0D1 U+59D4 # <cjk>
+0xB0D2 U+5A01 # <cjk>
+0xB0D3 U+5C09 # <cjk>
+0xB0D4 U+60DF # <cjk>
+0xB0D5 U+610F # <cjk>
+0xB0D6 U+6170 # <cjk>
+0xB0D7 U+6613 # <cjk>
+0xB0D8 U+6905 # <cjk>
+0xB0D9 U+70BA # <cjk>
+0xB0DA U+754F # <cjk>
+0xB0DB U+7570 # <cjk>
+0xB0DC U+79FB # <cjk>
+0xB0DD U+7DAD # <cjk>
+0xB0DE U+7DEF # <cjk>
+0xB0DF U+80C3 # <cjk>
+0xB0E0 U+840E # <cjk>
+0xB0E1 U+8863 # <cjk>
+0xB0E2 U+8B02 # <cjk>
+0xB0E3 U+9055 # <cjk>
+0xB0E4 U+907A # <cjk>
+0xB0E5 U+533B # <cjk>
+0xB0E6 U+4E95 # <cjk>
+0xB0E7 U+4EA5 # <cjk>
+0xB0E8 U+57DF # <cjk>
+0xB0E9 U+80B2 # <cjk>
+0xB0EA U+90C1 # <cjk>
+0xB0EB U+78EF # <cjk>
+0xB0EC U+4E00 # <cjk>
+0xB0ED U+58F1 # <cjk>
+0xB0EE U+6EA2 # <cjk>
+0xB0EF U+9038 # <cjk>
+0xB0F0 U+7A32 # <cjk>
+0xB0F1 U+8328 # <cjk>
+0xB0F2 U+828B # <cjk>
+0xB0F3 U+9C2F # <cjk>
+0xB0F4 U+5141 # <cjk>
+0xB0F5 U+5370 # <cjk>
+0xB0F6 U+54BD # <cjk>
+0xB0F7 U+54E1 # <cjk>
+0xB0F8 U+56E0 # <cjk>
+0xB0F9 U+59FB # <cjk>
+0xB0FA U+5F15 # <cjk>
+0xB0FB U+98F2 # <cjk>
+0xB0FC U+6DEB # <cjk>
+0xB0FD U+80E4 # <cjk>
+0xB0FE U+852D # <cjk>
+0xB1A1 U+9662 # <cjk>
+0xB1A2 U+9670 # <cjk>
+0xB1A3 U+96A0 # <cjk>
+0xB1A4 U+97FB # <cjk>
+0xB1A5 U+540B # <cjk>
+0xB1A6 U+53F3 # <cjk>
+0xB1A7 U+5B87 # <cjk>
+0xB1A8 U+70CF # <cjk>
+0xB1A9 U+7FBD # <cjk>
+0xB1AA U+8FC2 # <cjk>
+0xB1AB U+96E8 # <cjk>
+0xB1AC U+536F # <cjk>
+0xB1AD U+9D5C # <cjk>
+0xB1AE U+7ABA # <cjk>
+0xB1AF U+4E11 # <cjk>
+0xB1B0 U+7893 # <cjk>
+0xB1B1 U+81FC # <cjk>
+0xB1B2 U+6E26 # <cjk>
+0xB1B3 U+5618 # <cjk>
+0xB1B4 U+5504 # <cjk>
+0xB1B5 U+6B1D # <cjk>
+0xB1B6 U+851A # <cjk>
+0xB1B7 U+9C3B # <cjk>
+0xB1B8 U+59E5 # <cjk>
+0xB1B9 U+53A9 # <cjk>
+0xB1BA U+6D66 # <cjk>
+0xB1BB U+74DC # <cjk>
+0xB1BC U+958F # <cjk>
+0xB1BD U+5642 # <cjk>
+0xB1BE U+4E91 # <cjk>
+0xB1BF U+904B # <cjk>
+0xB1C0 U+96F2 # <cjk>
+0xB1C1 U+834F # <cjk>
+0xB1C2 U+990C # <cjk>
+0xB1C3 U+53E1 # <cjk>
+0xB1C4 U+55B6 # <cjk>
+0xB1C5 U+5B30 # <cjk>
+0xB1C6 U+5F71 # <cjk>
+0xB1C7 U+6620 # <cjk>
+0xB1C8 U+66F3 # <cjk>
+0xB1C9 U+6804 # <cjk>
+0xB1CA U+6C38 # <cjk>
+0xB1CB U+6CF3 # <cjk>
+0xB1CC U+6D29 # <cjk>
+0xB1CD U+745B # <cjk>
+0xB1CE U+76C8 # <cjk>
+0xB1CF U+7A4E # <cjk>
+0xB1D0 U+9834 # <cjk>
+0xB1D1 U+82F1 # <cjk>
+0xB1D2 U+885B # <cjk>
+0xB1D3 U+8A60 # <cjk>
+0xB1D4 U+92ED # <cjk>
+0xB1D5 U+6DB2 # <cjk>
+0xB1D6 U+75AB # <cjk>
+0xB1D7 U+76CA # <cjk>
+0xB1D8 U+99C5 # <cjk>
+0xB1D9 U+60A6 # <cjk>
+0xB1DA U+8B01 # <cjk>
+0xB1DB U+8D8A # <cjk>
+0xB1DC U+95B2 # <cjk>
+0xB1DD U+698E # <cjk>
+0xB1DE U+53AD # <cjk>
+0xB1DF U+5186 # <cjk>
+0xB1E0 U+5712 # <cjk>
+0xB1E1 U+5830 # <cjk>
+0xB1E2 U+5944 # <cjk>
+0xB1E3 U+5BB4 # <cjk>
+0xB1E4 U+5EF6 # <cjk>
+0xB1E5 U+6028 # <cjk>
+0xB1E6 U+63A9 # <cjk>
+0xB1E7 U+63F4 # <cjk>
+0xB1E8 U+6CBF # <cjk>
+0xB1E9 U+6F14 # <cjk>
+0xB1EA U+708E # <cjk>
+0xB1EB U+7114 # <cjk>
+0xB1EC U+7159 # <cjk>
+0xB1ED U+71D5 # <cjk>
+0xB1EE U+733F # <cjk>
+0xB1EF U+7E01 # <cjk>
+0xB1F0 U+8276 # <cjk>
+0xB1F1 U+82D1 # <cjk>
+0xB1F2 U+8597 # <cjk>
+0xB1F3 U+9060 # <cjk>
+0xB1F4 U+925B # <cjk>
+0xB1F5 U+9D1B # <cjk>
+0xB1F6 U+5869 # <cjk>
+0xB1F7 U+65BC # <cjk>
+0xB1F8 U+6C5A # <cjk>
+0xB1F9 U+7525 # <cjk>
+0xB1FA U+51F9 # <cjk>
+0xB1FB U+592E # <cjk>
+0xB1FC U+5965 # <cjk>
+0xB1FD U+5F80 # <cjk>
+0xB1FE U+5FDC # <cjk>
+0xB2A1 U+62BC # <cjk>
+0xB2A2 U+65FA # <cjk>
+0xB2A3 U+6A2A # <cjk>
+0xB2A4 U+6B27 # <cjk>
+0xB2A5 U+6BB4 # <cjk>
+0xB2A6 U+738B # <cjk>
+0xB2A7 U+7FC1 # <cjk>
+0xB2A8 U+8956 # <cjk>
+0xB2A9 U+9D2C # <cjk>
+0xB2AA U+9D0E # <cjk>
+0xB2AB U+9EC4 # <cjk>
+0xB2AC U+5CA1 # <cjk>
+0xB2AD U+6C96 # <cjk>
+0xB2AE U+837B # <cjk>
+0xB2AF U+5104 # <cjk>
+0xB2B0 U+5C4B # <cjk>
+0xB2B1 U+61B6 # <cjk>
+0xB2B2 U+81C6 # <cjk>
+0xB2B3 U+6876 # <cjk>
+0xB2B4 U+7261 # <cjk>
+0xB2B5 U+4E59 # <cjk>
+0xB2B6 U+4FFA # <cjk>
+0xB2B7 U+5378 # <cjk>
+0xB2B8 U+6069 # <cjk>
+0xB2B9 U+6E29 # <cjk>
+0xB2BA U+7A4F # <cjk>
+0xB2BB U+97F3 # <cjk>
+0xB2BC U+4E0B # <cjk>
+0xB2BD U+5316 # <cjk>
+0xB2BE U+4EEE # <cjk>
+0xB2BF U+4F55 # <cjk>
+0xB2C0 U+4F3D # <cjk>
+0xB2C1 U+4FA1 # <cjk>
+0xB2C2 U+4F73 # <cjk>
+0xB2C3 U+52A0 # <cjk>
+0xB2C4 U+53EF # <cjk>
+0xB2C5 U+5609 # <cjk>
+0xB2C6 U+590F # <cjk>
+0xB2C7 U+5AC1 # <cjk>
+0xB2C8 U+5BB6 # <cjk>
+0xB2C9 U+5BE1 # <cjk>
+0xB2CA U+79D1 # <cjk>
+0xB2CB U+6687 # <cjk>
+0xB2CC U+679C # <cjk>
+0xB2CD U+67B6 # <cjk>
+0xB2CE U+6B4C # <cjk>
+0xB2CF U+6CB3 # <cjk>
+0xB2D0 U+706B # <cjk>
+0xB2D1 U+73C2 # <cjk>
+0xB2D2 U+798D # <cjk>
+0xB2D3 U+79BE # <cjk>
+0xB2D4 U+7A3C # <cjk>
+0xB2D5 U+7B87 # <cjk>
+0xB2D6 U+82B1 # <cjk>
+0xB2D7 U+82DB # <cjk>
+0xB2D8 U+8304 # <cjk>
+0xB2D9 U+8377 # <cjk>
+0xB2DA U+83EF # <cjk>
+0xB2DB U+83D3 # <cjk>
+0xB2DC U+8766 # <cjk>
+0xB2DD U+8AB2 # <cjk>
+0xB2DE U+5629 # <cjk>
+0xB2DF U+8CA8 # <cjk>
+0xB2E0 U+8FE6 # <cjk>
+0xB2E1 U+904E # <cjk>
+0xB2E2 U+971E # <cjk>
+0xB2E3 U+868A # <cjk>
+0xB2E4 U+4FC4 # <cjk>
+0xB2E5 U+5CE8 # <cjk>
+0xB2E6 U+6211 # <cjk>
+0xB2E7 U+7259 # <cjk>
+0xB2E8 U+753B # <cjk>
+0xB2E9 U+81E5 # <cjk>
+0xB2EA U+82BD # <cjk>
+0xB2EB U+86FE # <cjk>
+0xB2EC U+8CC0 # <cjk>
+0xB2ED U+96C5 # <cjk>
+0xB2EE U+9913 # <cjk>
+0xB2EF U+99D5 # <cjk>
+0xB2F0 U+4ECB # <cjk>
+0xB2F1 U+4F1A # <cjk>
+0xB2F2 U+89E3 # <cjk>
+0xB2F3 U+56DE # <cjk>
+0xB2F4 U+584A # <cjk>
+0xB2F5 U+58CA # <cjk>
+0xB2F6 U+5EFB # <cjk>
+0xB2F7 U+5FEB # <cjk>
+0xB2F8 U+602A # <cjk>
+0xB2F9 U+6094 # <cjk>
+0xB2FA U+6062 # <cjk>
+0xB2FB U+61D0 # <cjk>
+0xB2FC U+6212 # <cjk>
+0xB2FD U+62D0 # <cjk>
+0xB2FE U+6539 # <cjk>
+0xB3A1 U+9B41 # <cjk>
+0xB3A2 U+6666 # <cjk>
+0xB3A3 U+68B0 # <cjk>
+0xB3A4 U+6D77 # <cjk>
+0xB3A5 U+7070 # <cjk>
+0xB3A6 U+754C # <cjk>
+0xB3A7 U+7686 # <cjk>
+0xB3A8 U+7D75 # <cjk>
+0xB3A9 U+82A5 # <cjk>
+0xB3AA U+87F9 # <cjk>
+0xB3AB U+958B # <cjk>
+0xB3AC U+968E # <cjk>
+0xB3AD U+8C9D # <cjk>
+0xB3AE U+51F1 # <cjk>
+0xB3AF U+52BE # <cjk>
+0xB3B0 U+5916 # <cjk>
+0xB3B1 U+54B3 # <cjk>
+0xB3B2 U+5BB3 # <cjk>
+0xB3B3 U+5D16 # <cjk>
+0xB3B4 U+6168 # <cjk>
+0xB3B5 U+6982 # <cjk>
+0xB3B6 U+6DAF # <cjk>
+0xB3B7 U+788D # <cjk>
+0xB3B8 U+84CB # <cjk>
+0xB3B9 U+8857 # <cjk>
+0xB3BA U+8A72 # <cjk>
+0xB3BB U+93A7 # <cjk>
+0xB3BC U+9AB8 # <cjk>
+0xB3BD U+6D6C # <cjk>
+0xB3BE U+99A8 # <cjk>
+0xB3BF U+86D9 # <cjk>
+0xB3C0 U+57A3 # <cjk>
+0xB3C1 U+67FF # <cjk>
+0xB3C2 U+86CE # <cjk>
+0xB3C3 U+920E # <cjk>
+0xB3C4 U+5283 # <cjk>
+0xB3C5 U+5687 # <cjk>
+0xB3C6 U+5404 # <cjk>
+0xB3C7 U+5ED3 # <cjk>
+0xB3C8 U+62E1 # <cjk>
+0xB3C9 U+64B9 # <cjk>
+0xB3CA U+683C # <cjk>
+0xB3CB U+6838 # <cjk>
+0xB3CC U+6BBB # <cjk>
+0xB3CD U+7372 # <cjk>
+0xB3CE U+78BA # <cjk>
+0xB3CF U+7A6B # <cjk>
+0xB3D0 U+899A # <cjk>
+0xB3D1 U+89D2 # <cjk>
+0xB3D2 U+8D6B # <cjk>
+0xB3D3 U+8F03 # <cjk>
+0xB3D4 U+90ED # <cjk>
+0xB3D5 U+95A3 # <cjk>
+0xB3D6 U+9694 # <cjk>
+0xB3D7 U+9769 # <cjk>
+0xB3D8 U+5B66 # <cjk>
+0xB3D9 U+5CB3 # <cjk>
+0xB3DA U+697D # <cjk>
+0xB3DB U+984D # <cjk>
+0xB3DC U+984E # <cjk>
+0xB3DD U+639B # <cjk>
+0xB3DE U+7B20 # <cjk>
+0xB3DF U+6A2B # <cjk>
+0xB3E0 U+6A7F # <cjk>
+0xB3E1 U+68B6 # <cjk>
+0xB3E2 U+9C0D # <cjk>
+0xB3E3 U+6F5F # <cjk>
+0xB3E4 U+5272 # <cjk>
+0xB3E5 U+559D # <cjk>
+0xB3E6 U+6070 # <cjk>
+0xB3E7 U+62EC # <cjk>
+0xB3E8 U+6D3B # <cjk>
+0xB3E9 U+6E07 # <cjk>
+0xB3EA U+6ED1 # <cjk>
+0xB3EB U+845B # <cjk>
+0xB3EC U+8910 # <cjk>
+0xB3ED U+8F44 # <cjk>
+0xB3EE U+4E14 # <cjk>
+0xB3EF U+9C39 # <cjk>
+0xB3F0 U+53F6 # <cjk>
+0xB3F1 U+691B # <cjk>
+0xB3F2 U+6A3A # <cjk>
+0xB3F3 U+9784 # <cjk>
+0xB3F4 U+682A # <cjk>
+0xB3F5 U+515C # <cjk>
+0xB3F6 U+7AC3 # <cjk>
+0xB3F7 U+84B2 # <cjk>
+0xB3F8 U+91DC # <cjk>
+0xB3F9 U+938C # <cjk>
+0xB3FA U+565B # <cjk>
+0xB3FB U+9D28 # <cjk>
+0xB3FC U+6822 # <cjk>
+0xB3FD U+8305 # <cjk>
+0xB3FE U+8431 # <cjk>
+0xB4A1 U+7CA5 # <cjk>
+0xB4A2 U+5208 # <cjk>
+0xB4A3 U+82C5 # <cjk>
+0xB4A4 U+74E6 # <cjk>
+0xB4A5 U+4E7E # <cjk>
+0xB4A6 U+4F83 # <cjk>
+0xB4A7 U+51A0 # <cjk>
+0xB4A8 U+5BD2 # <cjk>
+0xB4A9 U+520A # <cjk>
+0xB4AA U+52D8 # <cjk>
+0xB4AB U+52E7 # <cjk>
+0xB4AC U+5DFB # <cjk>
+0xB4AD U+559A # <cjk>
+0xB4AE U+582A # <cjk>
+0xB4AF U+59E6 # <cjk>
+0xB4B0 U+5B8C # <cjk>
+0xB4B1 U+5B98 # <cjk>
+0xB4B2 U+5BDB # <cjk>
+0xB4B3 U+5E72 # <cjk>
+0xB4B4 U+5E79 # <cjk>
+0xB4B5 U+60A3 # <cjk>
+0xB4B6 U+611F # <cjk>
+0xB4B7 U+6163 # <cjk>
+0xB4B8 U+61BE # <cjk>
+0xB4B9 U+63DB # <cjk>
+0xB4BA U+6562 # <cjk>
+0xB4BB U+67D1 # <cjk>
+0xB4BC U+6853 # <cjk>
+0xB4BD U+68FA # <cjk>
+0xB4BE U+6B3E # <cjk>
+0xB4BF U+6B53 # <cjk>
+0xB4C0 U+6C57 # <cjk>
+0xB4C1 U+6F22 # <cjk>
+0xB4C2 U+6F97 # <cjk>
+0xB4C3 U+6F45 # <cjk>
+0xB4C4 U+74B0 # <cjk>
+0xB4C5 U+7518 # <cjk>
+0xB4C6 U+76E3 # <cjk>
+0xB4C7 U+770B # <cjk>
+0xB4C8 U+7AFF # <cjk>
+0xB4C9 U+7BA1 # <cjk>
+0xB4CA U+7C21 # <cjk>
+0xB4CB U+7DE9 # <cjk>
+0xB4CC U+7F36 # <cjk>
+0xB4CD U+7FF0 # <cjk>
+0xB4CE U+809D # <cjk>
+0xB4CF U+8266 # <cjk>
+0xB4D0 U+839E # <cjk>
+0xB4D1 U+89B3 # <cjk>
+0xB4D2 U+8ACC # <cjk>
+0xB4D3 U+8CAB # <cjk>
+0xB4D4 U+9084 # <cjk>
+0xB4D5 U+9451 # <cjk>
+0xB4D6 U+9593 # <cjk>
+0xB4D7 U+9591 # <cjk>
+0xB4D8 U+95A2 # <cjk>
+0xB4D9 U+9665 # <cjk>
+0xB4DA U+97D3 # <cjk>
+0xB4DB U+9928 # <cjk>
+0xB4DC U+8218 # <cjk>
+0xB4DD U+4E38 # <cjk>
+0xB4DE U+542B # <cjk>
+0xB4DF U+5CB8 # <cjk>
+0xB4E0 U+5DCC # <cjk>
+0xB4E1 U+73A9 # <cjk>
+0xB4E2 U+764C # <cjk>
+0xB4E3 U+773C # <cjk>
+0xB4E4 U+5CA9 # <cjk>
+0xB4E5 U+7FEB # <cjk>
+0xB4E6 U+8D0B # <cjk>
+0xB4E7 U+96C1 # <cjk>
+0xB4E8 U+9811 # <cjk>
+0xB4E9 U+9854 # <cjk>
+0xB4EA U+9858 # <cjk>
+0xB4EB U+4F01 # <cjk>
+0xB4EC U+4F0E # <cjk>
+0xB4ED U+5371 # <cjk>
+0xB4EE U+559C # <cjk>
+0xB4EF U+5668 # <cjk>
+0xB4F0 U+57FA # <cjk>
+0xB4F1 U+5947 # <cjk>
+0xB4F2 U+5B09 # <cjk>
+0xB4F3 U+5BC4 # <cjk>
+0xB4F4 U+5C90 # <cjk>
+0xB4F5 U+5E0C # <cjk>
+0xB4F6 U+5E7E # <cjk>
+0xB4F7 U+5FCC # <cjk>
+0xB4F8 U+63EE # <cjk>
+0xB4F9 U+673A # <cjk>
+0xB4FA U+65D7 # <cjk>
+0xB4FB U+65E2 # <cjk>
+0xB4FC U+671F # <cjk>
+0xB4FD U+68CB # <cjk>
+0xB4FE U+68C4 # <cjk>
+0xB5A1 U+6A5F # <cjk>
+0xB5A2 U+5E30 # <cjk>
+0xB5A3 U+6BC5 # <cjk>
+0xB5A4 U+6C17 # <cjk>
+0xB5A5 U+6C7D # <cjk>
+0xB5A6 U+757F # <cjk>
+0xB5A7 U+7948 # <cjk>
+0xB5A8 U+5B63 # <cjk>
+0xB5A9 U+7A00 # <cjk>
+0xB5AA U+7D00 # <cjk>
+0xB5AB U+5FBD # <cjk>
+0xB5AC U+898F # <cjk>
+0xB5AD U+8A18 # <cjk>
+0xB5AE U+8CB4 # <cjk>
+0xB5AF U+8D77 # <cjk>
+0xB5B0 U+8ECC # <cjk>
+0xB5B1 U+8F1D # <cjk>
+0xB5B2 U+98E2 # <cjk>
+0xB5B3 U+9A0E # <cjk>
+0xB5B4 U+9B3C # <cjk>
+0xB5B5 U+4E80 # <cjk>
+0xB5B6 U+507D # <cjk>
+0xB5B7 U+5100 # <cjk>
+0xB5B8 U+5993 # <cjk>
+0xB5B9 U+5B9C # <cjk>
+0xB5BA U+622F # <cjk>
+0xB5BB U+6280 # <cjk>
+0xB5BC U+64EC # <cjk>
+0xB5BD U+6B3A # <cjk>
+0xB5BE U+72A0 # <cjk>
+0xB5BF U+7591 # <cjk>
+0xB5C0 U+7947 # <cjk>
+0xB5C1 U+7FA9 # <cjk>
+0xB5C2 U+87FB # <cjk>
+0xB5C3 U+8ABC # <cjk>
+0xB5C4 U+8B70 # <cjk>
+0xB5C5 U+63AC # <cjk>
+0xB5C6 U+83CA # <cjk>
+0xB5C7 U+97A0 # <cjk>
+0xB5C8 U+5409 # <cjk>
+0xB5C9 U+5403 # <cjk>
+0xB5CA U+55AB # <cjk>
+0xB5CB U+6854 # <cjk>
+0xB5CC U+6A58 # <cjk>
+0xB5CD U+8A70 # <cjk>
+0xB5CE U+7827 # <cjk>
+0xB5CF U+6775 # <cjk>
+0xB5D0 U+9ECD # <cjk>
+0xB5D1 U+5374 # <cjk>
+0xB5D2 U+5BA2 # <cjk>
+0xB5D3 U+811A # <cjk>
+0xB5D4 U+8650 # <cjk>
+0xB5D5 U+9006 # <cjk>
+0xB5D6 U+4E18 # <cjk>
+0xB5D7 U+4E45 # <cjk>
+0xB5D8 U+4EC7 # <cjk>
+0xB5D9 U+4F11 # <cjk>
+0xB5DA U+53CA # <cjk>
+0xB5DB U+5438 # <cjk>
+0xB5DC U+5BAE # <cjk>
+0xB5DD U+5F13 # <cjk>
+0xB5DE U+6025 # <cjk>
+0xB5DF U+6551 # <cjk>
+0xB5E0 U+673D # <cjk>
+0xB5E1 U+6C42 # <cjk>
+0xB5E2 U+6C72 # <cjk>
+0xB5E3 U+6CE3 # <cjk>
+0xB5E4 U+7078 # <cjk>
+0xB5E5 U+7403 # <cjk>
+0xB5E6 U+7A76 # <cjk>
+0xB5E7 U+7AAE # <cjk>
+0xB5E8 U+7B08 # <cjk>
+0xB5E9 U+7D1A # <cjk>
+0xB5EA U+7CFE # <cjk>
+0xB5EB U+7D66 # <cjk>
+0xB5EC U+65E7 # <cjk>
+0xB5ED U+725B # <cjk>
+0xB5EE U+53BB # <cjk>
+0xB5EF U+5C45 # <cjk>
+0xB5F0 U+5DE8 # <cjk>
+0xB5F1 U+62D2 # <cjk>
+0xB5F2 U+62E0 # <cjk>
+0xB5F3 U+6319 # <cjk>
+0xB5F4 U+6E20 # <cjk>
+0xB5F5 U+865A # <cjk>
+0xB5F6 U+8A31 # <cjk>
+0xB5F7 U+8DDD # <cjk>
+0xB5F8 U+92F8 # <cjk>
+0xB5F9 U+6F01 # <cjk>
+0xB5FA U+79A6 # <cjk>
+0xB5FB U+9B5A # <cjk>
+0xB5FC U+4EA8 # <cjk>
+0xB5FD U+4EAB # <cjk>
+0xB5FE U+4EAC # <cjk>
+0xB6A1 U+4F9B # <cjk>
+0xB6A2 U+4FA0 # <cjk>
+0xB6A3 U+50D1 # <cjk>
+0xB6A4 U+5147 # <cjk>
+0xB6A5 U+7AF6 # <cjk>
+0xB6A6 U+5171 # <cjk>
+0xB6A7 U+51F6 # <cjk>
+0xB6A8 U+5354 # <cjk>
+0xB6A9 U+5321 # <cjk>
+0xB6AA U+537F # <cjk>
+0xB6AB U+53EB # <cjk>
+0xB6AC U+55AC # <cjk>
+0xB6AD U+5883 # <cjk>
+0xB6AE U+5CE1 # <cjk>
+0xB6AF U+5F37 # <cjk>
+0xB6B0 U+5F4A # <cjk>
+0xB6B1 U+602F # <cjk>
+0xB6B2 U+6050 # <cjk>
+0xB6B3 U+606D # <cjk>
+0xB6B4 U+631F # <cjk>
+0xB6B5 U+6559 # <cjk>
+0xB6B6 U+6A4B # <cjk>
+0xB6B7 U+6CC1 # <cjk>
+0xB6B8 U+72C2 # <cjk>
+0xB6B9 U+72ED # <cjk>
+0xB6BA U+77EF # <cjk>
+0xB6BB U+80F8 # <cjk>
+0xB6BC U+8105 # <cjk>
+0xB6BD U+8208 # <cjk>
+0xB6BE U+854E # <cjk>
+0xB6BF U+90F7 # <cjk>
+0xB6C0 U+93E1 # <cjk>
+0xB6C1 U+97FF # <cjk>
+0xB6C2 U+9957 # <cjk>
+0xB6C3 U+9A5A # <cjk>
+0xB6C4 U+4EF0 # <cjk>
+0xB6C5 U+51DD # <cjk>
+0xB6C6 U+5C2D # <cjk>
+0xB6C7 U+6681 # <cjk>
+0xB6C8 U+696D # <cjk>
+0xB6C9 U+5C40 # <cjk>
+0xB6CA U+66F2 # <cjk>
+0xB6CB U+6975 # <cjk>
+0xB6CC U+7389 # <cjk>
+0xB6CD U+6850 # <cjk>
+0xB6CE U+7C81 # <cjk>
+0xB6CF U+50C5 # <cjk>
+0xB6D0 U+52E4 # <cjk>
+0xB6D1 U+5747 # <cjk>
+0xB6D2 U+5DFE # <cjk>
+0xB6D3 U+9326 # <cjk>
+0xB6D4 U+65A4 # <cjk>
+0xB6D5 U+6B23 # <cjk>
+0xB6D6 U+6B3D # <cjk>
+0xB6D7 U+7434 # <cjk>
+0xB6D8 U+7981 # <cjk>
+0xB6D9 U+79BD # <cjk>
+0xB6DA U+7B4B # <cjk>
+0xB6DB U+7DCA # <cjk>
+0xB6DC U+82B9 # <cjk>
+0xB6DD U+83CC # <cjk>
+0xB6DE U+887F # <cjk>
+0xB6DF U+895F # <cjk>
+0xB6E0 U+8B39 # <cjk>
+0xB6E1 U+8FD1 # <cjk>
+0xB6E2 U+91D1 # <cjk>
+0xB6E3 U+541F # <cjk>
+0xB6E4 U+9280 # <cjk>
+0xB6E5 U+4E5D # <cjk>
+0xB6E6 U+5036 # <cjk>
+0xB6E7 U+53E5 # <cjk>
+0xB6E8 U+533A # <cjk>
+0xB6E9 U+72D7 # <cjk>
+0xB6EA U+7396 # <cjk>
+0xB6EB U+77E9 # <cjk>
+0xB6EC U+82E6 # <cjk>
+0xB6ED U+8EAF # <cjk>
+0xB6EE U+99C6 # <cjk>
+0xB6EF U+99C8 # <cjk>
+0xB6F0 U+99D2 # <cjk>
+0xB6F1 U+5177 # <cjk>
+0xB6F2 U+611A # <cjk>
+0xB6F3 U+865E # <cjk>
+0xB6F4 U+55B0 # <cjk>
+0xB6F5 U+7A7A # <cjk>
+0xB6F6 U+5076 # <cjk>
+0xB6F7 U+5BD3 # <cjk>
+0xB6F8 U+9047 # <cjk>
+0xB6F9 U+9685 # <cjk>
+0xB6FA U+4E32 # <cjk>
+0xB6FB U+6ADB # <cjk>
+0xB6FC U+91E7 # <cjk>
+0xB6FD U+5C51 # <cjk>
+0xB6FE U+5C48 # <cjk>
+0xB7A1 U+6398 # <cjk>
+0xB7A2 U+7A9F # <cjk>
+0xB7A3 U+6C93 # <cjk>
+0xB7A4 U+9774 # <cjk>
+0xB7A5 U+8F61 # <cjk>
+0xB7A6 U+7AAA # <cjk>
+0xB7A7 U+718A # <cjk>
+0xB7A8 U+9688 # <cjk>
+0xB7A9 U+7C82 # <cjk>
+0xB7AA U+6817 # <cjk>
+0xB7AB U+7E70 # <cjk>
+0xB7AC U+6851 # <cjk>
+0xB7AD U+936C # <cjk>
+0xB7AE U+52F2 # <cjk>
+0xB7AF U+541B # <cjk>
+0xB7B0 U+85AB # <cjk>
+0xB7B1 U+8A13 # <cjk>
+0xB7B2 U+7FA4 # <cjk>
+0xB7B3 U+8ECD # <cjk>
+0xB7B4 U+90E1 # <cjk>
+0xB7B5 U+5366 # <cjk>
+0xB7B6 U+8888 # <cjk>
+0xB7B7 U+7941 # <cjk>
+0xB7B8 U+4FC2 # <cjk>
+0xB7B9 U+50BE # <cjk>
+0xB7BA U+5211 # <cjk>
+0xB7BB U+5144 # <cjk>
+0xB7BC U+5553 # <cjk>
+0xB7BD U+572D # <cjk>
+0xB7BE U+73EA # <cjk>
+0xB7BF U+578B # <cjk>
+0xB7C0 U+5951 # <cjk>
+0xB7C1 U+5F62 # <cjk>
+0xB7C2 U+5F84 # <cjk>
+0xB7C3 U+6075 # <cjk>
+0xB7C4 U+6176 # <cjk>
+0xB7C5 U+6167 # <cjk>
+0xB7C6 U+61A9 # <cjk>
+0xB7C7 U+63B2 # <cjk>
+0xB7C8 U+643A # <cjk>
+0xB7C9 U+656C # <cjk>
+0xB7CA U+666F # <cjk>
+0xB7CB U+6842 # <cjk>
+0xB7CC U+6E13 # <cjk>
+0xB7CD U+7566 # <cjk>
+0xB7CE U+7A3D # <cjk>
+0xB7CF U+7CFB # <cjk>
+0xB7D0 U+7D4C # <cjk>
+0xB7D1 U+7D99 # <cjk>
+0xB7D2 U+7E4B # <cjk>
+0xB7D3 U+7F6B # <cjk>
+0xB7D4 U+830E # <cjk>
+0xB7D5 U+834A # <cjk>
+0xB7D6 U+86CD # <cjk>
+0xB7D7 U+8A08 # <cjk>
+0xB7D8 U+8A63 # <cjk>
+0xB7D9 U+8B66 # <cjk>
+0xB7DA U+8EFD # <cjk>
+0xB7DB U+981A # <cjk>
+0xB7DC U+9D8F # <cjk>
+0xB7DD U+82B8 # <cjk>
+0xB7DE U+8FCE # <cjk>
+0xB7DF U+9BE8 # <cjk>
+0xB7E0 U+5287 # <cjk>
+0xB7E1 U+621F # <cjk>
+0xB7E2 U+6483 # <cjk>
+0xB7E3 U+6FC0 # <cjk>
+0xB7E4 U+9699 # <cjk>
+0xB7E5 U+6841 # <cjk>
+0xB7E6 U+5091 # <cjk>
+0xB7E7 U+6B20 # <cjk>
+0xB7E8 U+6C7A # <cjk>
+0xB7E9 U+6F54 # <cjk>
+0xB7EA U+7A74 # <cjk>
+0xB7EB U+7D50 # <cjk>
+0xB7EC U+8840 # <cjk>
+0xB7ED U+8A23 # <cjk>
+0xB7EE U+6708 # <cjk>
+0xB7EF U+4EF6 # <cjk>
+0xB7F0 U+5039 # <cjk>
+0xB7F1 U+5026 # <cjk>
+0xB7F2 U+5065 # <cjk>
+0xB7F3 U+517C # <cjk>
+0xB7F4 U+5238 # <cjk>
+0xB7F5 U+5263 # <cjk>
+0xB7F6 U+55A7 # <cjk>
+0xB7F7 U+570F # <cjk>
+0xB7F8 U+5805 # <cjk>
+0xB7F9 U+5ACC # <cjk>
+0xB7FA U+5EFA # <cjk>
+0xB7FB U+61B2 # <cjk>
+0xB7FC U+61F8 # <cjk>
+0xB7FD U+62F3 # <cjk>
+0xB7FE U+6372 # <cjk>
+0xB8A1 U+691C # <cjk>
+0xB8A2 U+6A29 # <cjk>
+0xB8A3 U+727D # <cjk>
+0xB8A4 U+72AC # <cjk>
+0xB8A5 U+732E # <cjk>
+0xB8A6 U+7814 # <cjk>
+0xB8A7 U+786F # <cjk>
+0xB8A8 U+7D79 # <cjk>
+0xB8A9 U+770C # <cjk>
+0xB8AA U+80A9 # <cjk>
+0xB8AB U+898B # <cjk>
+0xB8AC U+8B19 # <cjk>
+0xB8AD U+8CE2 # <cjk>
+0xB8AE U+8ED2 # <cjk>
+0xB8AF U+9063 # <cjk>
+0xB8B0 U+9375 # <cjk>
+0xB8B1 U+967A # <cjk>
+0xB8B2 U+9855 # <cjk>
+0xB8B3 U+9A13 # <cjk>
+0xB8B4 U+9E78 # <cjk>
+0xB8B5 U+5143 # <cjk>
+0xB8B6 U+539F # <cjk>
+0xB8B7 U+53B3 # <cjk>
+0xB8B8 U+5E7B # <cjk>
+0xB8B9 U+5F26 # <cjk>
+0xB8BA U+6E1B # <cjk>
+0xB8BB U+6E90 # <cjk>
+0xB8BC U+7384 # <cjk>
+0xB8BD U+73FE # <cjk>
+0xB8BE U+7D43 # <cjk>
+0xB8BF U+8237 # <cjk>
+0xB8C0 U+8A00 # <cjk>
+0xB8C1 U+8AFA # <cjk>
+0xB8C2 U+9650 # <cjk>
+0xB8C3 U+4E4E # <cjk>
+0xB8C4 U+500B # <cjk>
+0xB8C5 U+53E4 # <cjk>
+0xB8C6 U+547C # <cjk>
+0xB8C7 U+56FA # <cjk>
+0xB8C8 U+59D1 # <cjk>
+0xB8C9 U+5B64 # <cjk>
+0xB8CA U+5DF1 # <cjk>
+0xB8CB U+5EAB # <cjk>
+0xB8CC U+5F27 # <cjk>
+0xB8CD U+6238 # <cjk>
+0xB8CE U+6545 # <cjk>
+0xB8CF U+67AF # <cjk>
+0xB8D0 U+6E56 # <cjk>
+0xB8D1 U+72D0 # <cjk>
+0xB8D2 U+7CCA # <cjk>
+0xB8D3 U+88B4 # <cjk>
+0xB8D4 U+80A1 # <cjk>
+0xB8D5 U+80E1 # <cjk>
+0xB8D6 U+83F0 # <cjk>
+0xB8D7 U+864E # <cjk>
+0xB8D8 U+8A87 # <cjk>
+0xB8D9 U+8DE8 # <cjk>
+0xB8DA U+9237 # <cjk>
+0xB8DB U+96C7 # <cjk>
+0xB8DC U+9867 # <cjk>
+0xB8DD U+9F13 # <cjk>
+0xB8DE U+4E94 # <cjk>
+0xB8DF U+4E92 # <cjk>
+0xB8E0 U+4F0D # <cjk>
+0xB8E1 U+5348 # <cjk>
+0xB8E2 U+5449 # <cjk>
+0xB8E3 U+543E # <cjk>
+0xB8E4 U+5A2F # <cjk>
+0xB8E5 U+5F8C # <cjk>
+0xB8E6 U+5FA1 # <cjk>
+0xB8E7 U+609F # <cjk>
+0xB8E8 U+68A7 # <cjk>
+0xB8E9 U+6A8E # <cjk>
+0xB8EA U+745A # <cjk>
+0xB8EB U+7881 # <cjk>
+0xB8EC U+8A9E # <cjk>
+0xB8ED U+8AA4 # <cjk>
+0xB8EE U+8B77 # <cjk>
+0xB8EF U+9190 # <cjk>
+0xB8F0 U+4E5E # <cjk>
+0xB8F1 U+9BC9 # <cjk>
+0xB8F2 U+4EA4 # <cjk>
+0xB8F3 U+4F7C # <cjk>
+0xB8F4 U+4FAF # <cjk>
+0xB8F5 U+5019 # <cjk>
+0xB8F6 U+5016 # <cjk>
+0xB8F7 U+5149 # <cjk>
+0xB8F8 U+516C # <cjk>
+0xB8F9 U+529F # <cjk>
+0xB8FA U+52B9 # <cjk>
+0xB8FB U+52FE # <cjk>
+0xB8FC U+539A # <cjk>
+0xB8FD U+53E3 # <cjk>
+0xB8FE U+5411 # <cjk>
+0xB9A1 U+540E # <cjk>
+0xB9A2 U+5589 # <cjk>
+0xB9A3 U+5751 # <cjk>
+0xB9A4 U+57A2 # <cjk>
+0xB9A5 U+597D # <cjk>
+0xB9A6 U+5B54 # <cjk>
+0xB9A7 U+5B5D # <cjk>
+0xB9A8 U+5B8F # <cjk>
+0xB9A9 U+5DE5 # <cjk>
+0xB9AA U+5DE7 # <cjk>
+0xB9AB U+5DF7 # <cjk>
+0xB9AC U+5E78 # <cjk>
+0xB9AD U+5E83 # <cjk>
+0xB9AE U+5E9A # <cjk>
+0xB9AF U+5EB7 # <cjk>
+0xB9B0 U+5F18 # <cjk>
+0xB9B1 U+6052 # <cjk>
+0xB9B2 U+614C # <cjk>
+0xB9B3 U+6297 # <cjk>
+0xB9B4 U+62D8 # <cjk>
+0xB9B5 U+63A7 # <cjk>
+0xB9B6 U+653B # <cjk>
+0xB9B7 U+6602 # <cjk>
+0xB9B8 U+6643 # <cjk>
+0xB9B9 U+66F4 # <cjk>
+0xB9BA U+676D # <cjk>
+0xB9BB U+6821 # <cjk>
+0xB9BC U+6897 # <cjk>
+0xB9BD U+69CB # <cjk>
+0xB9BE U+6C5F # <cjk>
+0xB9BF U+6D2A # <cjk>
+0xB9C0 U+6D69 # <cjk>
+0xB9C1 U+6E2F # <cjk>
+0xB9C2 U+6E9D # <cjk>
+0xB9C3 U+7532 # <cjk>
+0xB9C4 U+7687 # <cjk>
+0xB9C5 U+786C # <cjk>
+0xB9C6 U+7A3F # <cjk>
+0xB9C7 U+7CE0 # <cjk>
+0xB9C8 U+7D05 # <cjk>
+0xB9C9 U+7D18 # <cjk>
+0xB9CA U+7D5E # <cjk>
+0xB9CB U+7DB1 # <cjk>
+0xB9CC U+8015 # <cjk>
+0xB9CD U+8003 # <cjk>
+0xB9CE U+80AF # <cjk>
+0xB9CF U+80B1 # <cjk>
+0xB9D0 U+8154 # <cjk>
+0xB9D1 U+818F # <cjk>
+0xB9D2 U+822A # <cjk>
+0xB9D3 U+8352 # <cjk>
+0xB9D4 U+884C # <cjk>
+0xB9D5 U+8861 # <cjk>
+0xB9D6 U+8B1B # <cjk>
+0xB9D7 U+8CA2 # <cjk>
+0xB9D8 U+8CFC # <cjk>
+0xB9D9 U+90CA # <cjk>
+0xB9DA U+9175 # <cjk>
+0xB9DB U+9271 # <cjk>
+0xB9DC U+783F # <cjk>
+0xB9DD U+92FC # <cjk>
+0xB9DE U+95A4 # <cjk>
+0xB9DF U+964D # <cjk>
+0xB9E0 U+9805 # <cjk>
+0xB9E1 U+9999 # <cjk>
+0xB9E2 U+9AD8 # <cjk>
+0xB9E3 U+9D3B # <cjk>
+0xB9E4 U+525B # <cjk>
+0xB9E5 U+52AB # <cjk>
+0xB9E6 U+53F7 # <cjk>
+0xB9E7 U+5408 # <cjk>
+0xB9E8 U+58D5 # <cjk>
+0xB9E9 U+62F7 # <cjk>
+0xB9EA U+6FE0 # <cjk>
+0xB9EB U+8C6A # <cjk>
+0xB9EC U+8F5F # <cjk>
+0xB9ED U+9EB9 # <cjk>
+0xB9EE U+514B # <cjk>
+0xB9EF U+523B # <cjk>
+0xB9F0 U+544A # <cjk>
+0xB9F1 U+56FD # <cjk>
+0xB9F2 U+7A40 # <cjk>
+0xB9F3 U+9177 # <cjk>
+0xB9F4 U+9D60 # <cjk>
+0xB9F5 U+9ED2 # <cjk>
+0xB9F6 U+7344 # <cjk>
+0xB9F7 U+6F09 # <cjk>
+0xB9F8 U+8170 # <cjk>
+0xB9F9 U+7511 # <cjk>
+0xB9FA U+5FFD # <cjk>
+0xB9FB U+60DA # <cjk>
+0xB9FC U+9AA8 # <cjk>
+0xB9FD U+72DB # <cjk>
+0xB9FE U+8FBC # <cjk>
+0xBAA1 U+6B64 # <cjk>
+0xBAA2 U+9803 # <cjk>
+0xBAA3 U+4ECA # <cjk>
+0xBAA4 U+56F0 # <cjk>
+0xBAA5 U+5764 # <cjk>
+0xBAA6 U+58BE # <cjk>
+0xBAA7 U+5A5A # <cjk>
+0xBAA8 U+6068 # <cjk>
+0xBAA9 U+61C7 # <cjk>
+0xBAAA U+660F # <cjk>
+0xBAAB U+6606 # <cjk>
+0xBAAC U+6839 # <cjk>
+0xBAAD U+68B1 # <cjk>
+0xBAAE U+6DF7 # <cjk>
+0xBAAF U+75D5 # <cjk>
+0xBAB0 U+7D3A # <cjk>
+0xBAB1 U+826E # <cjk>
+0xBAB2 U+9B42 # <cjk>
+0xBAB3 U+4E9B # <cjk>
+0xBAB4 U+4F50 # <cjk>
+0xBAB5 U+53C9 # <cjk>
+0xBAB6 U+5506 # <cjk>
+0xBAB7 U+5D6F # <cjk>
+0xBAB8 U+5DE6 # <cjk>
+0xBAB9 U+5DEE # <cjk>
+0xBABA U+67FB # <cjk>
+0xBABB U+6C99 # <cjk>
+0xBABC U+7473 # <cjk>
+0xBABD U+7802 # <cjk>
+0xBABE U+8A50 # <cjk>
+0xBABF U+9396 # <cjk>
+0xBAC0 U+88DF # <cjk>
+0xBAC1 U+5750 # <cjk>
+0xBAC2 U+5EA7 # <cjk>
+0xBAC3 U+632B # <cjk>
+0xBAC4 U+50B5 # <cjk>
+0xBAC5 U+50AC # <cjk>
+0xBAC6 U+518D # <cjk>
+0xBAC7 U+6700 # <cjk>
+0xBAC8 U+54C9 # <cjk>
+0xBAC9 U+585E # <cjk>
+0xBACA U+59BB # <cjk>
+0xBACB U+5BB0 # <cjk>
+0xBACC U+5F69 # <cjk>
+0xBACD U+624D # <cjk>
+0xBACE U+63A1 # <cjk>
+0xBACF U+683D # <cjk>
+0xBAD0 U+6B73 # <cjk>
+0xBAD1 U+6E08 # <cjk>
+0xBAD2 U+707D # <cjk>
+0xBAD3 U+91C7 # <cjk>
+0xBAD4 U+7280 # <cjk>
+0xBAD5 U+7815 # <cjk>
+0xBAD6 U+7826 # <cjk>
+0xBAD7 U+796D # <cjk>
+0xBAD8 U+658E # <cjk>
+0xBAD9 U+7D30 # <cjk>
+0xBADA U+83DC # <cjk>
+0xBADB U+88C1 # <cjk>
+0xBADC U+8F09 # <cjk>
+0xBADD U+969B # <cjk>
+0xBADE U+5264 # <cjk>
+0xBADF U+5728 # <cjk>
+0xBAE0 U+6750 # <cjk>
+0xBAE1 U+7F6A # <cjk>
+0xBAE2 U+8CA1 # <cjk>
+0xBAE3 U+51B4 # <cjk>
+0xBAE4 U+5742 # <cjk>
+0xBAE5 U+962A # <cjk>
+0xBAE6 U+583A # <cjk>
+0xBAE7 U+698A # <cjk>
+0xBAE8 U+80B4 # <cjk>
+0xBAE9 U+54B2 # <cjk>
+0xBAEA U+5D0E # <cjk>
+0xBAEB U+57FC # <cjk>
+0xBAEC U+7895 # <cjk>
+0xBAED U+9DFA # <cjk>
+0xBAEE U+4F5C # <cjk>
+0xBAEF U+524A # <cjk>
+0xBAF0 U+548B # <cjk>
+0xBAF1 U+643E # <cjk>
+0xBAF2 U+6628 # <cjk>
+0xBAF3 U+6714 # <cjk>
+0xBAF4 U+67F5 # <cjk>
+0xBAF5 U+7A84 # <cjk>
+0xBAF6 U+7B56 # <cjk>
+0xBAF7 U+7D22 # <cjk>
+0xBAF8 U+932F # <cjk>
+0xBAF9 U+685C # <cjk>
+0xBAFA U+9BAD # <cjk>
+0xBAFB U+7B39 # <cjk>
+0xBAFC U+5319 # <cjk>
+0xBAFD U+518A # <cjk>
+0xBAFE U+5237 # <cjk>
+0xBBA1 U+5BDF # <cjk>
+0xBBA2 U+62F6 # <cjk>
+0xBBA3 U+64AE # <cjk>
+0xBBA4 U+64E6 # <cjk>
+0xBBA5 U+672D # <cjk>
+0xBBA6 U+6BBA # <cjk>
+0xBBA7 U+85A9 # <cjk>
+0xBBA8 U+96D1 # <cjk>
+0xBBA9 U+7690 # <cjk>
+0xBBAA U+9BD6 # <cjk>
+0xBBAB U+634C # <cjk>
+0xBBAC U+9306 # <cjk>
+0xBBAD U+9BAB # <cjk>
+0xBBAE U+76BF # <cjk>
+0xBBAF U+6652 # <cjk>
+0xBBB0 U+4E09 # <cjk>
+0xBBB1 U+5098 # <cjk>
+0xBBB2 U+53C2 # <cjk>
+0xBBB3 U+5C71 # <cjk>
+0xBBB4 U+60E8 # <cjk>
+0xBBB5 U+6492 # <cjk>
+0xBBB6 U+6563 # <cjk>
+0xBBB7 U+685F # <cjk>
+0xBBB8 U+71E6 # <cjk>
+0xBBB9 U+73CA # <cjk>
+0xBBBA U+7523 # <cjk>
+0xBBBB U+7B97 # <cjk>
+0xBBBC U+7E82 # <cjk>
+0xBBBD U+8695 # <cjk>
+0xBBBE U+8B83 # <cjk>
+0xBBBF U+8CDB # <cjk>
+0xBBC0 U+9178 # <cjk>
+0xBBC1 U+9910 # <cjk>
+0xBBC2 U+65AC # <cjk>
+0xBBC3 U+66AB # <cjk>
+0xBBC4 U+6B8B # <cjk>
+0xBBC5 U+4ED5 # <cjk>
+0xBBC6 U+4ED4 # <cjk>
+0xBBC7 U+4F3A # <cjk>
+0xBBC8 U+4F7F # <cjk>
+0xBBC9 U+523A # <cjk>
+0xBBCA U+53F8 # <cjk>
+0xBBCB U+53F2 # <cjk>
+0xBBCC U+55E3 # <cjk>
+0xBBCD U+56DB # <cjk>
+0xBBCE U+58EB # <cjk>
+0xBBCF U+59CB # <cjk>
+0xBBD0 U+59C9 # <cjk>
+0xBBD1 U+59FF # <cjk>
+0xBBD2 U+5B50 # <cjk>
+0xBBD3 U+5C4D # <cjk>
+0xBBD4 U+5E02 # <cjk>
+0xBBD5 U+5E2B # <cjk>
+0xBBD6 U+5FD7 # <cjk>
+0xBBD7 U+601D # <cjk>
+0xBBD8 U+6307 # <cjk>
+0xBBD9 U+652F # <cjk>
+0xBBDA U+5B5C # <cjk>
+0xBBDB U+65AF # <cjk>
+0xBBDC U+65BD # <cjk>
+0xBBDD U+65E8 # <cjk>
+0xBBDE U+679D # <cjk>
+0xBBDF U+6B62 # <cjk>
+0xBBE0 U+6B7B # <cjk>
+0xBBE1 U+6C0F # <cjk>
+0xBBE2 U+7345 # <cjk>
+0xBBE3 U+7949 # <cjk>
+0xBBE4 U+79C1 # <cjk>
+0xBBE5 U+7CF8 # <cjk>
+0xBBE6 U+7D19 # <cjk>
+0xBBE7 U+7D2B # <cjk>
+0xBBE8 U+80A2 # <cjk>
+0xBBE9 U+8102 # <cjk>
+0xBBEA U+81F3 # <cjk>
+0xBBEB U+8996 # <cjk>
+0xBBEC U+8A5E # <cjk>
+0xBBED U+8A69 # <cjk>
+0xBBEE U+8A66 # <cjk>
+0xBBEF U+8A8C # <cjk>
+0xBBF0 U+8AEE # <cjk>
+0xBBF1 U+8CC7 # <cjk>
+0xBBF2 U+8CDC # <cjk>
+0xBBF3 U+96CC # <cjk>
+0xBBF4 U+98FC # <cjk>
+0xBBF5 U+6B6F # <cjk>
+0xBBF6 U+4E8B # <cjk>
+0xBBF7 U+4F3C # <cjk>
+0xBBF8 U+4F8D # <cjk>
+0xBBF9 U+5150 # <cjk>
+0xBBFA U+5B57 # <cjk>
+0xBBFB U+5BFA # <cjk>
+0xBBFC U+6148 # <cjk>
+0xBBFD U+6301 # <cjk>
+0xBBFE U+6642 # <cjk>
+0xBCA1 U+6B21 # <cjk>
+0xBCA2 U+6ECB # <cjk>
+0xBCA3 U+6CBB # <cjk>
+0xBCA4 U+723E # <cjk>
+0xBCA5 U+74BD # <cjk>
+0xBCA6 U+75D4 # <cjk>
+0xBCA7 U+78C1 # <cjk>
+0xBCA8 U+793A # <cjk>
+0xBCA9 U+800C # <cjk>
+0xBCAA U+8033 # <cjk>
+0xBCAB U+81EA # <cjk>
+0xBCAC U+8494 # <cjk>
+0xBCAD U+8F9E # <cjk>
+0xBCAE U+6C50 # <cjk>
+0xBCAF U+9E7F # <cjk>
+0xBCB0 U+5F0F # <cjk>
+0xBCB1 U+8B58 # <cjk>
+0xBCB2 U+9D2B # <cjk>
+0xBCB3 U+7AFA # <cjk>
+0xBCB4 U+8EF8 # <cjk>
+0xBCB5 U+5B8D # <cjk>
+0xBCB6 U+96EB # <cjk>
+0xBCB7 U+4E03 # <cjk>
+0xBCB8 U+53F1 # <cjk>
+0xBCB9 U+57F7 # <cjk>
+0xBCBA U+5931 # <cjk>
+0xBCBB U+5AC9 # <cjk>
+0xBCBC U+5BA4 # <cjk>
+0xBCBD U+6089 # <cjk>
+0xBCBE U+6E7F # <cjk>
+0xBCBF U+6F06 # <cjk>
+0xBCC0 U+75BE # <cjk>
+0xBCC1 U+8CEA # <cjk>
+0xBCC2 U+5B9F # <cjk>
+0xBCC3 U+8500 # <cjk>
+0xBCC4 U+7BE0 # <cjk>
+0xBCC5 U+5072 # <cjk>
+0xBCC6 U+67F4 # <cjk>
+0xBCC7 U+829D # <cjk>
+0xBCC8 U+5C61 # <cjk>
+0xBCC9 U+854A # <cjk>
+0xBCCA U+7E1E # <cjk>
+0xBCCB U+820E # <cjk>
+0xBCCC U+5199 # <cjk>
+0xBCCD U+5C04 # <cjk>
+0xBCCE U+6368 # <cjk>
+0xBCCF U+8D66 # <cjk>
+0xBCD0 U+659C # <cjk>
+0xBCD1 U+716E # <cjk>
+0xBCD2 U+793E # <cjk>
+0xBCD3 U+7D17 # <cjk>
+0xBCD4 U+8005 # <cjk>
+0xBCD5 U+8B1D # <cjk>
+0xBCD6 U+8ECA # <cjk>
+0xBCD7 U+906E # <cjk>
+0xBCD8 U+86C7 # <cjk>
+0xBCD9 U+90AA # <cjk>
+0xBCDA U+501F # <cjk>
+0xBCDB U+52FA # <cjk>
+0xBCDC U+5C3A # <cjk>
+0xBCDD U+6753 # <cjk>
+0xBCDE U+707C # <cjk>
+0xBCDF U+7235 # <cjk>
+0xBCE0 U+914C # <cjk>
+0xBCE1 U+91C8 # <cjk>
+0xBCE2 U+932B # <cjk>
+0xBCE3 U+82E5 # <cjk>
+0xBCE4 U+5BC2 # <cjk>
+0xBCE5 U+5F31 # <cjk>
+0xBCE6 U+60F9 # <cjk>
+0xBCE7 U+4E3B # <cjk>
+0xBCE8 U+53D6 # <cjk>
+0xBCE9 U+5B88 # <cjk>
+0xBCEA U+624B # <cjk>
+0xBCEB U+6731 # <cjk>
+0xBCEC U+6B8A # <cjk>
+0xBCED U+72E9 # <cjk>
+0xBCEE U+73E0 # <cjk>
+0xBCEF U+7A2E # <cjk>
+0xBCF0 U+816B # <cjk>
+0xBCF1 U+8DA3 # <cjk>
+0xBCF2 U+9152 # <cjk>
+0xBCF3 U+9996 # <cjk>
+0xBCF4 U+5112 # <cjk>
+0xBCF5 U+53D7 # <cjk>
+0xBCF6 U+546A # <cjk>
+0xBCF7 U+5BFF # <cjk>
+0xBCF8 U+6388 # <cjk>
+0xBCF9 U+6A39 # <cjk>
+0xBCFA U+7DAC # <cjk>
+0xBCFB U+9700 # <cjk>
+0xBCFC U+56DA # <cjk>
+0xBCFD U+53CE # <cjk>
+0xBCFE U+5468 # <cjk>
+0xBDA1 U+5B97 # <cjk>
+0xBDA2 U+5C31 # <cjk>
+0xBDA3 U+5DDE # <cjk>
+0xBDA4 U+4FEE # <cjk>
+0xBDA5 U+6101 # <cjk>
+0xBDA6 U+62FE # <cjk>
+0xBDA7 U+6D32 # <cjk>
+0xBDA8 U+79C0 # <cjk>
+0xBDA9 U+79CB # <cjk>
+0xBDAA U+7D42 # <cjk>
+0xBDAB U+7E4D # <cjk>
+0xBDAC U+7FD2 # <cjk>
+0xBDAD U+81ED # <cjk>
+0xBDAE U+821F # <cjk>
+0xBDAF U+8490 # <cjk>
+0xBDB0 U+8846 # <cjk>
+0xBDB1 U+8972 # <cjk>
+0xBDB2 U+8B90 # <cjk>
+0xBDB3 U+8E74 # <cjk>
+0xBDB4 U+8F2F # <cjk>
+0xBDB5 U+9031 # <cjk>
+0xBDB6 U+914B # <cjk>
+0xBDB7 U+916C # <cjk>
+0xBDB8 U+96C6 # <cjk>
+0xBDB9 U+919C # <cjk>
+0xBDBA U+4EC0 # <cjk>
+0xBDBB U+4F4F # <cjk>
+0xBDBC U+5145 # <cjk>
+0xBDBD U+5341 # <cjk>
+0xBDBE U+5F93 # <cjk>
+0xBDBF U+620E # <cjk>
+0xBDC0 U+67D4 # <cjk>
+0xBDC1 U+6C41 # <cjk>
+0xBDC2 U+6E0B # <cjk>
+0xBDC3 U+7363 # <cjk>
+0xBDC4 U+7E26 # <cjk>
+0xBDC5 U+91CD # <cjk>
+0xBDC6 U+9283 # <cjk>
+0xBDC7 U+53D4 # <cjk>
+0xBDC8 U+5919 # <cjk>
+0xBDC9 U+5BBF # <cjk>
+0xBDCA U+6DD1 # <cjk>
+0xBDCB U+795D # <cjk>
+0xBDCC U+7E2E # <cjk>
+0xBDCD U+7C9B # <cjk>
+0xBDCE U+587E # <cjk>
+0xBDCF U+719F # <cjk>
+0xBDD0 U+51FA # <cjk>
+0xBDD1 U+8853 # <cjk>
+0xBDD2 U+8FF0 # <cjk>
+0xBDD3 U+4FCA # <cjk>
+0xBDD4 U+5CFB # <cjk>
+0xBDD5 U+6625 # <cjk>
+0xBDD6 U+77AC # <cjk>
+0xBDD7 U+7AE3 # <cjk>
+0xBDD8 U+821C # <cjk>
+0xBDD9 U+99FF # <cjk>
+0xBDDA U+51C6 # <cjk>
+0xBDDB U+5FAA # <cjk>
+0xBDDC U+65EC # <cjk>
+0xBDDD U+696F # <cjk>
+0xBDDE U+6B89 # <cjk>
+0xBDDF U+6DF3 # <cjk>
+0xBDE0 U+6E96 # <cjk>
+0xBDE1 U+6F64 # <cjk>
+0xBDE2 U+76FE # <cjk>
+0xBDE3 U+7D14 # <cjk>
+0xBDE4 U+5DE1 # <cjk>
+0xBDE5 U+9075 # <cjk>
+0xBDE6 U+9187 # <cjk>
+0xBDE7 U+9806 # <cjk>
+0xBDE8 U+51E6 # <cjk>
+0xBDE9 U+521D # <cjk>
+0xBDEA U+6240 # <cjk>
+0xBDEB U+6691 # <cjk>
+0xBDEC U+66D9 # <cjk>
+0xBDED U+6E1A # <cjk>
+0xBDEE U+5EB6 # <cjk>
+0xBDEF U+7DD2 # <cjk>
+0xBDF0 U+7F72 # <cjk>
+0xBDF1 U+66F8 # <cjk>
+0xBDF2 U+85AF # <cjk>
+0xBDF3 U+85F7 # <cjk>
+0xBDF4 U+8AF8 # <cjk>
+0xBDF5 U+52A9 # <cjk>
+0xBDF6 U+53D9 # <cjk>
+0xBDF7 U+5973 # <cjk>
+0xBDF8 U+5E8F # <cjk>
+0xBDF9 U+5F90 # <cjk>
+0xBDFA U+6055 # <cjk>
+0xBDFB U+92E4 # <cjk>
+0xBDFC U+9664 # <cjk>
+0xBDFD U+50B7 # <cjk>
+0xBDFE U+511F # <cjk>
+0xBEA1 U+52DD # <cjk>
+0xBEA2 U+5320 # <cjk>
+0xBEA3 U+5347 # <cjk>
+0xBEA4 U+53EC # <cjk>
+0xBEA5 U+54E8 # <cjk>
+0xBEA6 U+5546 # <cjk>
+0xBEA7 U+5531 # <cjk>
+0xBEA8 U+5617 # <cjk>
+0xBEA9 U+5968 # <cjk>
+0xBEAA U+59BE # <cjk>
+0xBEAB U+5A3C # <cjk>
+0xBEAC U+5BB5 # <cjk>
+0xBEAD U+5C06 # <cjk>
+0xBEAE U+5C0F # <cjk>
+0xBEAF U+5C11 # <cjk>
+0xBEB0 U+5C1A # <cjk>
+0xBEB1 U+5E84 # <cjk>
+0xBEB2 U+5E8A # <cjk>
+0xBEB3 U+5EE0 # <cjk>
+0xBEB4 U+5F70 # <cjk>
+0xBEB5 U+627F # <cjk>
+0xBEB6 U+6284 # <cjk>
+0xBEB7 U+62DB # <cjk>
+0xBEB8 U+638C # <cjk>
+0xBEB9 U+6377 # <cjk>
+0xBEBA U+6607 # <cjk>
+0xBEBB U+660C # <cjk>
+0xBEBC U+662D # <cjk>
+0xBEBD U+6676 # <cjk>
+0xBEBE U+677E # <cjk>
+0xBEBF U+68A2 # <cjk>
+0xBEC0 U+6A1F # <cjk>
+0xBEC1 U+6A35 # <cjk>
+0xBEC2 U+6CBC # <cjk>
+0xBEC3 U+6D88 # <cjk>
+0xBEC4 U+6E09 # <cjk>
+0xBEC5 U+6E58 # <cjk>
+0xBEC6 U+713C # <cjk>
+0xBEC7 U+7126 # <cjk>
+0xBEC8 U+7167 # <cjk>
+0xBEC9 U+75C7 # <cjk>
+0xBECA U+7701 # <cjk>
+0xBECB U+785D # <cjk>
+0xBECC U+7901 # <cjk>
+0xBECD U+7965 # <cjk>
+0xBECE U+79F0 # <cjk>
+0xBECF U+7AE0 # <cjk>
+0xBED0 U+7B11 # <cjk>
+0xBED1 U+7CA7 # <cjk>
+0xBED2 U+7D39 # <cjk>
+0xBED3 U+8096 # <cjk>
+0xBED4 U+83D6 # <cjk>
+0xBED5 U+848B # <cjk>
+0xBED6 U+8549 # <cjk>
+0xBED7 U+885D # <cjk>
+0xBED8 U+88F3 # <cjk>
+0xBED9 U+8A1F # <cjk>
+0xBEDA U+8A3C # <cjk>
+0xBEDB U+8A54 # <cjk>
+0xBEDC U+8A73 # <cjk>
+0xBEDD U+8C61 # <cjk>
+0xBEDE U+8CDE # <cjk>
+0xBEDF U+91A4 # <cjk>
+0xBEE0 U+9266 # <cjk>
+0xBEE1 U+937E # <cjk>
+0xBEE2 U+9418 # <cjk>
+0xBEE3 U+969C # <cjk>
+0xBEE4 U+9798 # <cjk>
+0xBEE5 U+4E0A # <cjk>
+0xBEE6 U+4E08 # <cjk>
+0xBEE7 U+4E1E # <cjk>
+0xBEE8 U+4E57 # <cjk>
+0xBEE9 U+5197 # <cjk>
+0xBEEA U+5270 # <cjk>
+0xBEEB U+57CE # <cjk>
+0xBEEC U+5834 # <cjk>
+0xBEED U+58CC # <cjk>
+0xBEEE U+5B22 # <cjk>
+0xBEEF U+5E38 # <cjk>
+0xBEF0 U+60C5 # <cjk>
+0xBEF1 U+64FE # <cjk>
+0xBEF2 U+6761 # <cjk>
+0xBEF3 U+6756 # <cjk>
+0xBEF4 U+6D44 # <cjk>
+0xBEF5 U+72B6 # <cjk>
+0xBEF6 U+7573 # <cjk>
+0xBEF7 U+7A63 # <cjk>
+0xBEF8 U+84B8 # <cjk>
+0xBEF9 U+8B72 # <cjk>
+0xBEFA U+91B8 # <cjk>
+0xBEFB U+9320 # <cjk>
+0xBEFC U+5631 # <cjk>
+0xBEFD U+57F4 # <cjk>
+0xBEFE U+98FE # <cjk>
+0xBFA1 U+62ED # <cjk>
+0xBFA2 U+690D # <cjk>
+0xBFA3 U+6B96 # <cjk>
+0xBFA4 U+71ED # <cjk>
+0xBFA5 U+7E54 # <cjk>
+0xBFA6 U+8077 # <cjk>
+0xBFA7 U+8272 # <cjk>
+0xBFA8 U+89E6 # <cjk>
+0xBFA9 U+98DF # <cjk>
+0xBFAA U+8755 # <cjk>
+0xBFAB U+8FB1 # <cjk>
+0xBFAC U+5C3B # <cjk>
+0xBFAD U+4F38 # <cjk>
+0xBFAE U+4FE1 # <cjk>
+0xBFAF U+4FB5 # <cjk>
+0xBFB0 U+5507 # <cjk>
+0xBFB1 U+5A20 # <cjk>
+0xBFB2 U+5BDD # <cjk>
+0xBFB3 U+5BE9 # <cjk>
+0xBFB4 U+5FC3 # <cjk>
+0xBFB5 U+614E # <cjk>
+0xBFB6 U+632F # <cjk>
+0xBFB7 U+65B0 # <cjk>
+0xBFB8 U+664B # <cjk>
+0xBFB9 U+68EE # <cjk>
+0xBFBA U+699B # <cjk>
+0xBFBB U+6D78 # <cjk>
+0xBFBC U+6DF1 # <cjk>
+0xBFBD U+7533 # <cjk>
+0xBFBE U+75B9 # <cjk>
+0xBFBF U+771F # <cjk>
+0xBFC0 U+795E # <cjk>
+0xBFC1 U+79E6 # <cjk>
+0xBFC2 U+7D33 # <cjk>
+0xBFC3 U+81E3 # <cjk>
+0xBFC4 U+82AF # <cjk>
+0xBFC5 U+85AA # <cjk>
+0xBFC6 U+89AA # <cjk>
+0xBFC7 U+8A3A # <cjk>
+0xBFC8 U+8EAB # <cjk>
+0xBFC9 U+8F9B # <cjk>
+0xBFCA U+9032 # <cjk>
+0xBFCB U+91DD # <cjk>
+0xBFCC U+9707 # <cjk>
+0xBFCD U+4EBA # <cjk>
+0xBFCE U+4EC1 # <cjk>
+0xBFCF U+5203 # <cjk>
+0xBFD0 U+5875 # <cjk>
+0xBFD1 U+58EC # <cjk>
+0xBFD2 U+5C0B # <cjk>
+0xBFD3 U+751A # <cjk>
+0xBFD4 U+5C3D # <cjk>
+0xBFD5 U+814E # <cjk>
+0xBFD6 U+8A0A # <cjk>
+0xBFD7 U+8FC5 # <cjk>
+0xBFD8 U+9663 # <cjk>
+0xBFD9 U+976D # <cjk>
+0xBFDA U+7B25 # <cjk>
+0xBFDB U+8ACF # <cjk>
+0xBFDC U+9808 # <cjk>
+0xBFDD U+9162 # <cjk>
+0xBFDE U+56F3 # <cjk>
+0xBFDF U+53A8 # <cjk>
+0xBFE0 U+9017 # <cjk>
+0xBFE1 U+5439 # <cjk>
+0xBFE2 U+5782 # <cjk>
+0xBFE3 U+5E25 # <cjk>
+0xBFE4 U+63A8 # <cjk>
+0xBFE5 U+6C34 # <cjk>
+0xBFE6 U+708A # <cjk>
+0xBFE7 U+7761 # <cjk>
+0xBFE8 U+7C8B # <cjk>
+0xBFE9 U+7FE0 # <cjk>
+0xBFEA U+8870 # <cjk>
+0xBFEB U+9042 # <cjk>
+0xBFEC U+9154 # <cjk>
+0xBFED U+9310 # <cjk>
+0xBFEE U+9318 # <cjk>
+0xBFEF U+968F # <cjk>
+0xBFF0 U+745E # <cjk>
+0xBFF1 U+9AC4 # <cjk>
+0xBFF2 U+5D07 # <cjk>
+0xBFF3 U+5D69 # <cjk>
+0xBFF4 U+6570 # <cjk>
+0xBFF5 U+67A2 # <cjk>
+0xBFF6 U+8DA8 # <cjk>
+0xBFF7 U+96DB # <cjk>
+0xBFF8 U+636E # <cjk>
+0xBFF9 U+6749 # <cjk>
+0xBFFA U+6919 # <cjk>
+0xBFFB U+83C5 # <cjk>
+0xBFFC U+9817 # <cjk>
+0xBFFD U+96C0 # <cjk>
+0xBFFE U+88FE # <cjk>
+0xC0A1 U+6F84 # <cjk>
+0xC0A2 U+647A # <cjk>
+0xC0A3 U+5BF8 # <cjk>
+0xC0A4 U+4E16 # <cjk>
+0xC0A5 U+702C # <cjk>
+0xC0A6 U+755D # <cjk>
+0xC0A7 U+662F # <cjk>
+0xC0A8 U+51C4 # <cjk>
+0xC0A9 U+5236 # <cjk>
+0xC0AA U+52E2 # <cjk>
+0xC0AB U+59D3 # <cjk>
+0xC0AC U+5F81 # <cjk>
+0xC0AD U+6027 # <cjk>
+0xC0AE U+6210 # <cjk>
+0xC0AF U+653F # <cjk>
+0xC0B0 U+6574 # <cjk>
+0xC0B1 U+661F # <cjk>
+0xC0B2 U+6674 # <cjk>
+0xC0B3 U+68F2 # <cjk>
+0xC0B4 U+6816 # <cjk>
+0xC0B5 U+6B63 # <cjk>
+0xC0B6 U+6E05 # <cjk>
+0xC0B7 U+7272 # <cjk>
+0xC0B8 U+751F # <cjk>
+0xC0B9 U+76DB # <cjk>
+0xC0BA U+7CBE # <cjk>
+0xC0BB U+8056 # <cjk>
+0xC0BC U+58F0 # <cjk>
+0xC0BD U+88FD # <cjk>
+0xC0BE U+897F # <cjk>
+0xC0BF U+8AA0 # <cjk>
+0xC0C0 U+8A93 # <cjk>
+0xC0C1 U+8ACB # <cjk>
+0xC0C2 U+901D # <cjk>
+0xC0C3 U+9192 # <cjk>
+0xC0C4 U+9752 # <cjk>
+0xC0C5 U+9759 # <cjk>
+0xC0C6 U+6589 # <cjk>
+0xC0C7 U+7A0E # <cjk>
+0xC0C8 U+8106 # <cjk>
+0xC0C9 U+96BB # <cjk>
+0xC0CA U+5E2D # <cjk>
+0xC0CB U+60DC # <cjk>
+0xC0CC U+621A # <cjk>
+0xC0CD U+65A5 # <cjk>
+0xC0CE U+6614 # <cjk>
+0xC0CF U+6790 # <cjk>
+0xC0D0 U+77F3 # <cjk>
+0xC0D1 U+7A4D # <cjk>
+0xC0D2 U+7C4D # <cjk>
+0xC0D3 U+7E3E # <cjk>
+0xC0D4 U+810A # <cjk>
+0xC0D5 U+8CAC # <cjk>
+0xC0D6 U+8D64 # <cjk>
+0xC0D7 U+8DE1 # <cjk>
+0xC0D8 U+8E5F # <cjk>
+0xC0D9 U+78A9 # <cjk>
+0xC0DA U+5207 # <cjk>
+0xC0DB U+62D9 # <cjk>
+0xC0DC U+63A5 # <cjk>
+0xC0DD U+6442 # <cjk>
+0xC0DE U+6298 # <cjk>
+0xC0DF U+8A2D # <cjk>
+0xC0E0 U+7A83 # <cjk>
+0xC0E1 U+7BC0 # <cjk>
+0xC0E2 U+8AAC # <cjk>
+0xC0E3 U+96EA # <cjk>
+0xC0E4 U+7D76 # <cjk>
+0xC0E5 U+820C # <cjk>
+0xC0E6 U+8749 # <cjk>
+0xC0E7 U+4ED9 # <cjk>
+0xC0E8 U+5148 # <cjk>
+0xC0E9 U+5343 # <cjk>
+0xC0EA U+5360 # <cjk>
+0xC0EB U+5BA3 # <cjk>
+0xC0EC U+5C02 # <cjk>
+0xC0ED U+5C16 # <cjk>
+0xC0EE U+5DDD # <cjk>
+0xC0EF U+6226 # <cjk>
+0xC0F0 U+6247 # <cjk>
+0xC0F1 U+64B0 # <cjk>
+0xC0F2 U+6813 # <cjk>
+0xC0F3 U+6834 # <cjk>
+0xC0F4 U+6CC9 # <cjk>
+0xC0F5 U+6D45 # <cjk>
+0xC0F6 U+6D17 # <cjk>
+0xC0F7 U+67D3 # <cjk>
+0xC0F8 U+6F5C # <cjk>
+0xC0F9 U+714E # <cjk>
+0xC0FA U+717D # <cjk>
+0xC0FB U+65CB # <cjk>
+0xC0FC U+7A7F # <cjk>
+0xC0FD U+7BAD # <cjk>
+0xC0FE U+7DDA # <cjk>
+0xC1A1 U+7E4A # <cjk>
+0xC1A2 U+7FA8 # <cjk>
+0xC1A3 U+817A # <cjk>
+0xC1A4 U+821B # <cjk>
+0xC1A5 U+8239 # <cjk>
+0xC1A6 U+85A6 # <cjk>
+0xC1A7 U+8A6E # <cjk>
+0xC1A8 U+8CCE # <cjk>
+0xC1A9 U+8DF5 # <cjk>
+0xC1AA U+9078 # <cjk>
+0xC1AB U+9077 # <cjk>
+0xC1AC U+92AD # <cjk>
+0xC1AD U+9291 # <cjk>
+0xC1AE U+9583 # <cjk>
+0xC1AF U+9BAE # <cjk>
+0xC1B0 U+524D # <cjk>
+0xC1B1 U+5584 # <cjk>
+0xC1B2 U+6F38 # <cjk>
+0xC1B3 U+7136 # <cjk>
+0xC1B4 U+5168 # <cjk>
+0xC1B5 U+7985 # <cjk>
+0xC1B6 U+7E55 # <cjk>
+0xC1B7 U+81B3 # <cjk>
+0xC1B8 U+7CCE # <cjk>
+0xC1B9 U+564C # <cjk>
+0xC1BA U+5851 # <cjk>
+0xC1BB U+5CA8 # <cjk>
+0xC1BC U+63AA # <cjk>
+0xC1BD U+66FE # <cjk>
+0xC1BE U+66FD # <cjk>
+0xC1BF U+695A # <cjk>
+0xC1C0 U+72D9 # <cjk>
+0xC1C1 U+758F # <cjk>
+0xC1C2 U+758E # <cjk>
+0xC1C3 U+790E # <cjk>
+0xC1C4 U+7956 # <cjk>
+0xC1C5 U+79DF # <cjk>
+0xC1C6 U+7C97 # <cjk>
+0xC1C7 U+7D20 # <cjk>
+0xC1C8 U+7D44 # <cjk>
+0xC1C9 U+8607 # <cjk>
+0xC1CA U+8A34 # <cjk>
+0xC1CB U+963B # <cjk>
+0xC1CC U+9061 # <cjk>
+0xC1CD U+9F20 # <cjk>
+0xC1CE U+50E7 # <cjk>
+0xC1CF U+5275 # <cjk>
+0xC1D0 U+53CC # <cjk>
+0xC1D1 U+53E2 # <cjk>
+0xC1D2 U+5009 # <cjk>
+0xC1D3 U+55AA # <cjk>
+0xC1D4 U+58EE # <cjk>
+0xC1D5 U+594F # <cjk>
+0xC1D6 U+723D # <cjk>
+0xC1D7 U+5B8B # <cjk>
+0xC1D8 U+5C64 # <cjk>
+0xC1D9 U+531D # <cjk>
+0xC1DA U+60E3 # <cjk>
+0xC1DB U+60F3 # <cjk>
+0xC1DC U+635C # <cjk>
+0xC1DD U+6383 # <cjk>
+0xC1DE U+633F # <cjk>
+0xC1DF U+63BB # <cjk>
+0xC1E0 U+64CD # <cjk>
+0xC1E1 U+65E9 # <cjk>
+0xC1E2 U+66F9 # <cjk>
+0xC1E3 U+5DE3 # <cjk>
+0xC1E4 U+69CD # <cjk>
+0xC1E5 U+69FD # <cjk>
+0xC1E6 U+6F15 # <cjk>
+0xC1E7 U+71E5 # <cjk>
+0xC1E8 U+4E89 # <cjk>
+0xC1E9 U+75E9 # <cjk>
+0xC1EA U+76F8 # <cjk>
+0xC1EB U+7A93 # <cjk>
+0xC1EC U+7CDF # <cjk>
+0xC1ED U+7DCF # <cjk>
+0xC1EE U+7D9C # <cjk>
+0xC1EF U+8061 # <cjk>
+0xC1F0 U+8349 # <cjk>
+0xC1F1 U+8358 # <cjk>
+0xC1F2 U+846C # <cjk>
+0xC1F3 U+84BC # <cjk>
+0xC1F4 U+85FB # <cjk>
+0xC1F5 U+88C5 # <cjk>
+0xC1F6 U+8D70 # <cjk>
+0xC1F7 U+9001 # <cjk>
+0xC1F8 U+906D # <cjk>
+0xC1F9 U+9397 # <cjk>
+0xC1FA U+971C # <cjk>
+0xC1FB U+9A12 # <cjk>
+0xC1FC U+50CF # <cjk>
+0xC1FD U+5897 # <cjk>
+0xC1FE U+618E # <cjk>
+0xC2A1 U+81D3 # <cjk>
+0xC2A2 U+8535 # <cjk>
+0xC2A3 U+8D08 # <cjk>
+0xC2A4 U+9020 # <cjk>
+0xC2A5 U+4FC3 # <cjk>
+0xC2A6 U+5074 # <cjk>
+0xC2A7 U+5247 # <cjk>
+0xC2A8 U+5373 # <cjk>
+0xC2A9 U+606F # <cjk>
+0xC2AA U+6349 # <cjk>
+0xC2AB U+675F # <cjk>
+0xC2AC U+6E2C # <cjk>
+0xC2AD U+8DB3 # <cjk>
+0xC2AE U+901F # <cjk>
+0xC2AF U+4FD7 # <cjk>
+0xC2B0 U+5C5E # <cjk>
+0xC2B1 U+8CCA # <cjk>
+0xC2B2 U+65CF # <cjk>
+0xC2B3 U+7D9A # <cjk>
+0xC2B4 U+5352 # <cjk>
+0xC2B5 U+8896 # <cjk>
+0xC2B6 U+5176 # <cjk>
+0xC2B7 U+63C3 # <cjk>
+0xC2B8 U+5B58 # <cjk>
+0xC2B9 U+5B6B # <cjk>
+0xC2BA U+5C0A # <cjk>
+0xC2BB U+640D # <cjk>
+0xC2BC U+6751 # <cjk>
+0xC2BD U+905C # <cjk>
+0xC2BE U+4ED6 # <cjk>
+0xC2BF U+591A # <cjk>
+0xC2C0 U+592A # <cjk>
+0xC2C1 U+6C70 # <cjk>
+0xC2C2 U+8A51 # <cjk>
+0xC2C3 U+553E # <cjk>
+0xC2C4 U+5815 # <cjk>
+0xC2C5 U+59A5 # <cjk>
+0xC2C6 U+60F0 # <cjk>
+0xC2C7 U+6253 # <cjk>
+0xC2C8 U+67C1 # <cjk>
+0xC2C9 U+8235 # <cjk>
+0xC2CA U+6955 # <cjk>
+0xC2CB U+9640 # <cjk>
+0xC2CC U+99C4 # <cjk>
+0xC2CD U+9A28 # <cjk>
+0xC2CE U+4F53 # <cjk>
+0xC2CF U+5806 # <cjk>
+0xC2D0 U+5BFE # <cjk>
+0xC2D1 U+8010 # <cjk>
+0xC2D2 U+5CB1 # <cjk>
+0xC2D3 U+5E2F # <cjk>
+0xC2D4 U+5F85 # <cjk>
+0xC2D5 U+6020 # <cjk>
+0xC2D6 U+614B # <cjk>
+0xC2D7 U+6234 # <cjk>
+0xC2D8 U+66FF # <cjk>
+0xC2D9 U+6CF0 # <cjk>
+0xC2DA U+6EDE # <cjk>
+0xC2DB U+80CE # <cjk>
+0xC2DC U+817F # <cjk>
+0xC2DD U+82D4 # <cjk>
+0xC2DE U+888B # <cjk>
+0xC2DF U+8CB8 # <cjk>
+0xC2E0 U+9000 # <cjk>
+0xC2E1 U+902E # <cjk>
+0xC2E2 U+968A # <cjk>
+0xC2E3 U+9EDB # <cjk>
+0xC2E4 U+9BDB # <cjk>
+0xC2E5 U+4EE3 # <cjk>
+0xC2E6 U+53F0 # <cjk>
+0xC2E7 U+5927 # <cjk>
+0xC2E8 U+7B2C # <cjk>
+0xC2E9 U+918D # <cjk>
+0xC2EA U+984C # <cjk>
+0xC2EB U+9DF9 # <cjk>
+0xC2EC U+6EDD # <cjk>
+0xC2ED U+7027 # <cjk>
+0xC2EE U+5353 # <cjk>
+0xC2EF U+5544 # <cjk>
+0xC2F0 U+5B85 # <cjk>
+0xC2F1 U+6258 # <cjk>
+0xC2F2 U+629E # <cjk>
+0xC2F3 U+62D3 # <cjk>
+0xC2F4 U+6CA2 # <cjk>
+0xC2F5 U+6FEF # <cjk>
+0xC2F6 U+7422 # <cjk>
+0xC2F7 U+8A17 # <cjk>
+0xC2F8 U+9438 # <cjk>
+0xC2F9 U+6FC1 # <cjk>
+0xC2FA U+8AFE # <cjk>
+0xC2FB U+8338 # <cjk>
+0xC2FC U+51E7 # <cjk>
+0xC2FD U+86F8 # <cjk>
+0xC2FE U+53EA # <cjk>
+0xC3A1 U+53E9 # <cjk>
+0xC3A2 U+4F46 # <cjk>
+0xC3A3 U+9054 # <cjk>
+0xC3A4 U+8FB0 # <cjk>
+0xC3A5 U+596A # <cjk>
+0xC3A6 U+8131 # <cjk>
+0xC3A7 U+5DFD # <cjk>
+0xC3A8 U+7AEA # <cjk>
+0xC3A9 U+8FBF # <cjk>
+0xC3AA U+68DA # <cjk>
+0xC3AB U+8C37 # <cjk>
+0xC3AC U+72F8 # <cjk>
+0xC3AD U+9C48 # <cjk>
+0xC3AE U+6A3D # <cjk>
+0xC3AF U+8AB0 # <cjk>
+0xC3B0 U+4E39 # <cjk>
+0xC3B1 U+5358 # <cjk>
+0xC3B2 U+5606 # <cjk>
+0xC3B3 U+5766 # <cjk>
+0xC3B4 U+62C5 # <cjk>
+0xC3B5 U+63A2 # <cjk>
+0xC3B6 U+65E6 # <cjk>
+0xC3B7 U+6B4E # <cjk>
+0xC3B8 U+6DE1 # <cjk>
+0xC3B9 U+6E5B # <cjk>
+0xC3BA U+70AD # <cjk>
+0xC3BB U+77ED # <cjk>
+0xC3BC U+7AEF # <cjk>
+0xC3BD U+7BAA # <cjk>
+0xC3BE U+7DBB # <cjk>
+0xC3BF U+803D # <cjk>
+0xC3C0 U+80C6 # <cjk>
+0xC3C1 U+86CB # <cjk>
+0xC3C2 U+8A95 # <cjk>
+0xC3C3 U+935B # <cjk>
+0xC3C4 U+56E3 # <cjk>
+0xC3C5 U+58C7 # <cjk>
+0xC3C6 U+5F3E # <cjk>
+0xC3C7 U+65AD # <cjk>
+0xC3C8 U+6696 # <cjk>
+0xC3C9 U+6A80 # <cjk>
+0xC3CA U+6BB5 # <cjk>
+0xC3CB U+7537 # <cjk>
+0xC3CC U+8AC7 # <cjk>
+0xC3CD U+5024 # <cjk>
+0xC3CE U+77E5 # <cjk>
+0xC3CF U+5730 # <cjk>
+0xC3D0 U+5F1B # <cjk>
+0xC3D1 U+6065 # <cjk>
+0xC3D2 U+667A # <cjk>
+0xC3D3 U+6C60 # <cjk>
+0xC3D4 U+75F4 # <cjk>
+0xC3D5 U+7A1A # <cjk>
+0xC3D6 U+7F6E # <cjk>
+0xC3D7 U+81F4 # <cjk>
+0xC3D8 U+8718 # <cjk>
+0xC3D9 U+9045 # <cjk>
+0xC3DA U+99B3 # <cjk>
+0xC3DB U+7BC9 # <cjk>
+0xC3DC U+755C # <cjk>
+0xC3DD U+7AF9 # <cjk>
+0xC3DE U+7B51 # <cjk>
+0xC3DF U+84C4 # <cjk>
+0xC3E0 U+9010 # <cjk>
+0xC3E1 U+79E9 # <cjk>
+0xC3E2 U+7A92 # <cjk>
+0xC3E3 U+8336 # <cjk>
+0xC3E4 U+5AE1 # <cjk>
+0xC3E5 U+7740 # <cjk>
+0xC3E6 U+4E2D # <cjk>
+0xC3E7 U+4EF2 # <cjk>
+0xC3E8 U+5B99 # <cjk>
+0xC3E9 U+5FE0 # <cjk>
+0xC3EA U+62BD # <cjk>
+0xC3EB U+663C # <cjk>
+0xC3EC U+67F1 # <cjk>
+0xC3ED U+6CE8 # <cjk>
+0xC3EE U+866B # <cjk>
+0xC3EF U+8877 # <cjk>
+0xC3F0 U+8A3B # <cjk>
+0xC3F1 U+914E # <cjk>
+0xC3F2 U+92F3 # <cjk>
+0xC3F3 U+99D0 # <cjk>
+0xC3F4 U+6A17 # <cjk>
+0xC3F5 U+7026 # <cjk>
+0xC3F6 U+732A # <cjk>
+0xC3F7 U+82E7 # <cjk>
+0xC3F8 U+8457 # <cjk>
+0xC3F9 U+8CAF # <cjk>
+0xC3FA U+4E01 # <cjk>
+0xC3FB U+5146 # <cjk>
+0xC3FC U+51CB # <cjk>
+0xC3FD U+558B # <cjk>
+0xC3FE U+5BF5 # <cjk>
+0xC4A1 U+5E16 # <cjk>
+0xC4A2 U+5E33 # <cjk>
+0xC4A3 U+5E81 # <cjk>
+0xC4A4 U+5F14 # <cjk>
+0xC4A5 U+5F35 # <cjk>
+0xC4A6 U+5F6B # <cjk>
+0xC4A7 U+5FB4 # <cjk>
+0xC4A8 U+61F2 # <cjk>
+0xC4A9 U+6311 # <cjk>
+0xC4AA U+66A2 # <cjk>
+0xC4AB U+671D # <cjk>
+0xC4AC U+6F6E # <cjk>
+0xC4AD U+7252 # <cjk>
+0xC4AE U+753A # <cjk>
+0xC4AF U+773A # <cjk>
+0xC4B0 U+8074 # <cjk>
+0xC4B1 U+8139 # <cjk>
+0xC4B2 U+8178 # <cjk>
+0xC4B3 U+8776 # <cjk>
+0xC4B4 U+8ABF # <cjk>
+0xC4B5 U+8ADC # <cjk>
+0xC4B6 U+8D85 # <cjk>
+0xC4B7 U+8DF3 # <cjk>
+0xC4B8 U+929A # <cjk>
+0xC4B9 U+9577 # <cjk>
+0xC4BA U+9802 # <cjk>
+0xC4BB U+9CE5 # <cjk>
+0xC4BC U+52C5 # <cjk>
+0xC4BD U+6357 # <cjk>
+0xC4BE U+76F4 # <cjk>
+0xC4BF U+6715 # <cjk>
+0xC4C0 U+6C88 # <cjk>
+0xC4C1 U+73CD # <cjk>
+0xC4C2 U+8CC3 # <cjk>
+0xC4C3 U+93AE # <cjk>
+0xC4C4 U+9673 # <cjk>
+0xC4C5 U+6D25 # <cjk>
+0xC4C6 U+589C # <cjk>
+0xC4C7 U+690E # <cjk>
+0xC4C8 U+69CC # <cjk>
+0xC4C9 U+8FFD # <cjk>
+0xC4CA U+939A # <cjk>
+0xC4CB U+75DB # <cjk>
+0xC4CC U+901A # <cjk>
+0xC4CD U+585A # <cjk>
+0xC4CE U+6802 # <cjk>
+0xC4CF U+63B4 # <cjk>
+0xC4D0 U+69FB # <cjk>
+0xC4D1 U+4F43 # <cjk>
+0xC4D2 U+6F2C # <cjk>
+0xC4D3 U+67D8 # <cjk>
+0xC4D4 U+8FBB # <cjk>
+0xC4D5 U+8526 # <cjk>
+0xC4D6 U+7DB4 # <cjk>
+0xC4D7 U+9354 # <cjk>
+0xC4D8 U+693F # <cjk>
+0xC4D9 U+6F70 # <cjk>
+0xC4DA U+576A # <cjk>
+0xC4DB U+58F7 # <cjk>
+0xC4DC U+5B2C # <cjk>
+0xC4DD U+7D2C # <cjk>
+0xC4DE U+722A # <cjk>
+0xC4DF U+540A # <cjk>
+0xC4E0 U+91E3 # <cjk>
+0xC4E1 U+9DB4 # <cjk>
+0xC4E2 U+4EAD # <cjk>
+0xC4E3 U+4F4E # <cjk>
+0xC4E4 U+505C # <cjk>
+0xC4E5 U+5075 # <cjk>
+0xC4E6 U+5243 # <cjk>
+0xC4E7 U+8C9E # <cjk>
+0xC4E8 U+5448 # <cjk>
+0xC4E9 U+5824 # <cjk>
+0xC4EA U+5B9A # <cjk>
+0xC4EB U+5E1D # <cjk>
+0xC4EC U+5E95 # <cjk>
+0xC4ED U+5EAD # <cjk>
+0xC4EE U+5EF7 # <cjk>
+0xC4EF U+5F1F # <cjk>
+0xC4F0 U+608C # <cjk>
+0xC4F1 U+62B5 # <cjk>
+0xC4F2 U+633A # <cjk>
+0xC4F3 U+63D0 # <cjk>
+0xC4F4 U+68AF # <cjk>
+0xC4F5 U+6C40 # <cjk>
+0xC4F6 U+7887 # <cjk>
+0xC4F7 U+798E # <cjk>
+0xC4F8 U+7A0B # <cjk>
+0xC4F9 U+7DE0 # <cjk>
+0xC4FA U+8247 # <cjk>
+0xC4FB U+8A02 # <cjk>
+0xC4FC U+8AE6 # <cjk>
+0xC4FD U+8E44 # <cjk>
+0xC4FE U+9013 # <cjk>
+0xC5A1 U+90B8 # <cjk>
+0xC5A2 U+912D # <cjk>
+0xC5A3 U+91D8 # <cjk>
+0xC5A4 U+9F0E # <cjk>
+0xC5A5 U+6CE5 # <cjk>
+0xC5A6 U+6458 # <cjk>
+0xC5A7 U+64E2 # <cjk>
+0xC5A8 U+6575 # <cjk>
+0xC5A9 U+6EF4 # <cjk>
+0xC5AA U+7684 # <cjk>
+0xC5AB U+7B1B # <cjk>
+0xC5AC U+9069 # <cjk>
+0xC5AD U+93D1 # <cjk>
+0xC5AE U+6EBA # <cjk>
+0xC5AF U+54F2 # <cjk>
+0xC5B0 U+5FB9 # <cjk>
+0xC5B1 U+64A4 # <cjk>
+0xC5B2 U+8F4D # <cjk>
+0xC5B3 U+8FED # <cjk>
+0xC5B4 U+9244 # <cjk>
+0xC5B5 U+5178 # <cjk>
+0xC5B6 U+586B # <cjk>
+0xC5B7 U+5929 # <cjk>
+0xC5B8 U+5C55 # <cjk>
+0xC5B9 U+5E97 # <cjk>
+0xC5BA U+6DFB # <cjk>
+0xC5BB U+7E8F # <cjk>
+0xC5BC U+751C # <cjk>
+0xC5BD U+8CBC # <cjk>
+0xC5BE U+8EE2 # <cjk>
+0xC5BF U+985B # <cjk>
+0xC5C0 U+70B9 # <cjk>
+0xC5C1 U+4F1D # <cjk>
+0xC5C2 U+6BBF # <cjk>
+0xC5C3 U+6FB1 # <cjk>
+0xC5C4 U+7530 # <cjk>
+0xC5C5 U+96FB # <cjk>
+0xC5C6 U+514E # <cjk>
+0xC5C7 U+5410 # <cjk>
+0xC5C8 U+5835 # <cjk>
+0xC5C9 U+5857 # <cjk>
+0xC5CA U+59AC # <cjk>
+0xC5CB U+5C60 # <cjk>
+0xC5CC U+5F92 # <cjk>
+0xC5CD U+6597 # <cjk>
+0xC5CE U+675C # <cjk>
+0xC5CF U+6E21 # <cjk>
+0xC5D0 U+767B # <cjk>
+0xC5D1 U+83DF # <cjk>
+0xC5D2 U+8CED # <cjk>
+0xC5D3 U+9014 # <cjk>
+0xC5D4 U+90FD # <cjk>
+0xC5D5 U+934D # <cjk>
+0xC5D6 U+7825 # <cjk>
+0xC5D7 U+783A # <cjk>
+0xC5D8 U+52AA # <cjk>
+0xC5D9 U+5EA6 # <cjk>
+0xC5DA U+571F # <cjk>
+0xC5DB U+5974 # <cjk>
+0xC5DC U+6012 # <cjk>
+0xC5DD U+5012 # <cjk>
+0xC5DE U+515A # <cjk>
+0xC5DF U+51AC # <cjk>
+0xC5E0 U+51CD # <cjk>
+0xC5E1 U+5200 # <cjk>
+0xC5E2 U+5510 # <cjk>
+0xC5E3 U+5854 # <cjk>
+0xC5E4 U+5858 # <cjk>
+0xC5E5 U+5957 # <cjk>
+0xC5E6 U+5B95 # <cjk>
+0xC5E7 U+5CF6 # <cjk>
+0xC5E8 U+5D8B # <cjk>
+0xC5E9 U+60BC # <cjk>
+0xC5EA U+6295 # <cjk>
+0xC5EB U+642D # <cjk>
+0xC5EC U+6771 # <cjk>
+0xC5ED U+6843 # <cjk>
+0xC5EE U+68BC # <cjk>
+0xC5EF U+68DF # <cjk>
+0xC5F0 U+76D7 # <cjk>
+0xC5F1 U+6DD8 # <cjk>
+0xC5F2 U+6E6F # <cjk>
+0xC5F3 U+6D9B # <cjk>
+0xC5F4 U+706F # <cjk>
+0xC5F5 U+71C8 # <cjk>
+0xC5F6 U+5F53 # <cjk>
+0xC5F7 U+75D8 # <cjk>
+0xC5F8 U+7977 # <cjk>
+0xC5F9 U+7B49 # <cjk>
+0xC5FA U+7B54 # <cjk>
+0xC5FB U+7B52 # <cjk>
+0xC5FC U+7CD6 # <cjk>
+0xC5FD U+7D71 # <cjk>
+0xC5FE U+5230 # <cjk>
+0xC6A1 U+8463 # <cjk>
+0xC6A2 U+8569 # <cjk>
+0xC6A3 U+85E4 # <cjk>
+0xC6A4 U+8A0E # <cjk>
+0xC6A5 U+8B04 # <cjk>
+0xC6A6 U+8C46 # <cjk>
+0xC6A7 U+8E0F # <cjk>
+0xC6A8 U+9003 # <cjk>
+0xC6A9 U+900F # <cjk>
+0xC6AA U+9419 # <cjk>
+0xC6AB U+9676 # <cjk>
+0xC6AC U+982D # <cjk>
+0xC6AD U+9A30 # <cjk>
+0xC6AE U+95D8 # <cjk>
+0xC6AF U+50CD # <cjk>
+0xC6B0 U+52D5 # <cjk>
+0xC6B1 U+540C # <cjk>
+0xC6B2 U+5802 # <cjk>
+0xC6B3 U+5C0E # <cjk>
+0xC6B4 U+61A7 # <cjk>
+0xC6B5 U+649E # <cjk>
+0xC6B6 U+6D1E # <cjk>
+0xC6B7 U+77B3 # <cjk>
+0xC6B8 U+7AE5 # <cjk>
+0xC6B9 U+80F4 # <cjk>
+0xC6BA U+8404 # <cjk>
+0xC6BB U+9053 # <cjk>
+0xC6BC U+9285 # <cjk>
+0xC6BD U+5CE0 # <cjk>
+0xC6BE U+9D07 # <cjk>
+0xC6BF U+533F # <cjk>
+0xC6C0 U+5F97 # <cjk>
+0xC6C1 U+5FB3 # <cjk>
+0xC6C2 U+6D9C # <cjk>
+0xC6C3 U+7279 # <cjk>
+0xC6C4 U+7763 # <cjk>
+0xC6C5 U+79BF # <cjk>
+0xC6C6 U+7BE4 # <cjk>
+0xC6C7 U+6BD2 # <cjk>
+0xC6C8 U+72EC # <cjk>
+0xC6C9 U+8AAD # <cjk>
+0xC6CA U+6803 # <cjk>
+0xC6CB U+6A61 # <cjk>
+0xC6CC U+51F8 # <cjk>
+0xC6CD U+7A81 # <cjk>
+0xC6CE U+6934 # <cjk>
+0xC6CF U+5C4A # <cjk>
+0xC6D0 U+9CF6 # <cjk>
+0xC6D1 U+82EB # <cjk>
+0xC6D2 U+5BC5 # <cjk>
+0xC6D3 U+9149 # <cjk>
+0xC6D4 U+701E # <cjk>
+0xC6D5 U+5678 # <cjk>
+0xC6D6 U+5C6F # <cjk>
+0xC6D7 U+60C7 # <cjk>
+0xC6D8 U+6566 # <cjk>
+0xC6D9 U+6C8C # <cjk>
+0xC6DA U+8C5A # <cjk>
+0xC6DB U+9041 # <cjk>
+0xC6DC U+9813 # <cjk>
+0xC6DD U+5451 # <cjk>
+0xC6DE U+66C7 # <cjk>
+0xC6DF U+920D # <cjk>
+0xC6E0 U+5948 # <cjk>
+0xC6E1 U+90A3 # <cjk>
+0xC6E2 U+5185 # <cjk>
+0xC6E3 U+4E4D # <cjk>
+0xC6E4 U+51EA # <cjk>
+0xC6E5 U+8599 # <cjk>
+0xC6E6 U+8B0E # <cjk>
+0xC6E7 U+7058 # <cjk>
+0xC6E8 U+637A # <cjk>
+0xC6E9 U+934B # <cjk>
+0xC6EA U+6962 # <cjk>
+0xC6EB U+99B4 # <cjk>
+0xC6EC U+7E04 # <cjk>
+0xC6ED U+7577 # <cjk>
+0xC6EE U+5357 # <cjk>
+0xC6EF U+6960 # <cjk>
+0xC6F0 U+8EDF # <cjk>
+0xC6F1 U+96E3 # <cjk>
+0xC6F2 U+6C5D # <cjk>
+0xC6F3 U+4E8C # <cjk>
+0xC6F4 U+5C3C # <cjk>
+0xC6F5 U+5F10 # <cjk>
+0xC6F6 U+8FE9 # <cjk>
+0xC6F7 U+5302 # <cjk>
+0xC6F8 U+8CD1 # <cjk>
+0xC6F9 U+8089 # <cjk>
+0xC6FA U+8679 # <cjk>
+0xC6FB U+5EFF # <cjk>
+0xC6FC U+65E5 # <cjk>
+0xC6FD U+4E73 # <cjk>
+0xC6FE U+5165 # <cjk>
+0xC7A1 U+5982 # <cjk>
+0xC7A2 U+5C3F # <cjk>
+0xC7A3 U+97EE # <cjk>
+0xC7A4 U+4EFB # <cjk>
+0xC7A5 U+598A # <cjk>
+0xC7A6 U+5FCD # <cjk>
+0xC7A7 U+8A8D # <cjk>
+0xC7A8 U+6FE1 # <cjk>
+0xC7A9 U+79B0 # <cjk>
+0xC7AA U+7962 # <cjk>
+0xC7AB U+5BE7 # <cjk>
+0xC7AC U+8471 # <cjk>
+0xC7AD U+732B # <cjk>
+0xC7AE U+71B1 # <cjk>
+0xC7AF U+5E74 # <cjk>
+0xC7B0 U+5FF5 # <cjk>
+0xC7B1 U+637B # <cjk>
+0xC7B2 U+649A # <cjk>
+0xC7B3 U+71C3 # <cjk>
+0xC7B4 U+7C98 # <cjk>
+0xC7B5 U+4E43 # <cjk>
+0xC7B6 U+5EFC # <cjk>
+0xC7B7 U+4E4B # <cjk>
+0xC7B8 U+57DC # <cjk>
+0xC7B9 U+56A2 # <cjk>
+0xC7BA U+60A9 # <cjk>
+0xC7BB U+6FC3 # <cjk>
+0xC7BC U+7D0D # <cjk>
+0xC7BD U+80FD # <cjk>
+0xC7BE U+8133 # <cjk>
+0xC7BF U+81BF # <cjk>
+0xC7C0 U+8FB2 # <cjk>
+0xC7C1 U+8997 # <cjk>
+0xC7C2 U+86A4 # <cjk>
+0xC7C3 U+5DF4 # <cjk>
+0xC7C4 U+628A # <cjk>
+0xC7C5 U+64AD # <cjk>
+0xC7C6 U+8987 # <cjk>
+0xC7C7 U+6777 # <cjk>
+0xC7C8 U+6CE2 # <cjk>
+0xC7C9 U+6D3E # <cjk>
+0xC7CA U+7436 # <cjk>
+0xC7CB U+7834 # <cjk>
+0xC7CC U+5A46 # <cjk>
+0xC7CD U+7F75 # <cjk>
+0xC7CE U+82AD # <cjk>
+0xC7CF U+99AC # <cjk>
+0xC7D0 U+4FF3 # <cjk>
+0xC7D1 U+5EC3 # <cjk>
+0xC7D2 U+62DD # <cjk>
+0xC7D3 U+6392 # <cjk>
+0xC7D4 U+6557 # <cjk>
+0xC7D5 U+676F # <cjk>
+0xC7D6 U+76C3 # <cjk>
+0xC7D7 U+724C # <cjk>
+0xC7D8 U+80CC # <cjk>
+0xC7D9 U+80BA # <cjk>
+0xC7DA U+8F29 # <cjk>
+0xC7DB U+914D # <cjk>
+0xC7DC U+500D # <cjk>
+0xC7DD U+57F9 # <cjk>
+0xC7DE U+5A92 # <cjk>
+0xC7DF U+6885 # <cjk>
+0xC7E0 U+6973 # <cjk>
+0xC7E1 U+7164 # <cjk>
+0xC7E2 U+72FD # <cjk>
+0xC7E3 U+8CB7 # <cjk>
+0xC7E4 U+58F2 # <cjk>
+0xC7E5 U+8CE0 # <cjk>
+0xC7E6 U+966A # <cjk>
+0xC7E7 U+9019 # <cjk>
+0xC7E8 U+877F # <cjk>
+0xC7E9 U+79E4 # <cjk>
+0xC7EA U+77E7 # <cjk>
+0xC7EB U+8429 # <cjk>
+0xC7EC U+4F2F # <cjk>
+0xC7ED U+5265 # <cjk>
+0xC7EE U+535A # <cjk>
+0xC7EF U+62CD # <cjk>
+0xC7F0 U+67CF # <cjk>
+0xC7F1 U+6CCA # <cjk>
+0xC7F2 U+767D # <cjk>
+0xC7F3 U+7B94 # <cjk>
+0xC7F4 U+7C95 # <cjk>
+0xC7F5 U+8236 # <cjk>
+0xC7F6 U+8584 # <cjk>
+0xC7F7 U+8FEB # <cjk>
+0xC7F8 U+66DD # <cjk>
+0xC7F9 U+6F20 # <cjk>
+0xC7FA U+7206 # <cjk>
+0xC7FB U+7E1B # <cjk>
+0xC7FC U+83AB # <cjk>
+0xC7FD U+99C1 # <cjk>
+0xC7FE U+9EA6 # <cjk>
+0xC8A1 U+51FD # <cjk>
+0xC8A2 U+7BB1 # <cjk>
+0xC8A3 U+7872 # <cjk>
+0xC8A4 U+7BB8 # <cjk>
+0xC8A5 U+8087 # <cjk>
+0xC8A6 U+7B48 # <cjk>
+0xC8A7 U+6AE8 # <cjk>
+0xC8A8 U+5E61 # <cjk>
+0xC8A9 U+808C # <cjk>
+0xC8AA U+7551 # <cjk>
+0xC8AB U+7560 # <cjk>
+0xC8AC U+516B # <cjk>
+0xC8AD U+9262 # <cjk>
+0xC8AE U+6E8C # <cjk>
+0xC8AF U+767A # <cjk>
+0xC8B0 U+9197 # <cjk>
+0xC8B1 U+9AEA # <cjk>
+0xC8B2 U+4F10 # <cjk>
+0xC8B3 U+7F70 # <cjk>
+0xC8B4 U+629C # <cjk>
+0xC8B5 U+7B4F # <cjk>
+0xC8B6 U+95A5 # <cjk>
+0xC8B7 U+9CE9 # <cjk>
+0xC8B8 U+567A # <cjk>
+0xC8B9 U+5859 # <cjk>
+0xC8BA U+86E4 # <cjk>
+0xC8BB U+96BC # <cjk>
+0xC8BC U+4F34 # <cjk>
+0xC8BD U+5224 # <cjk>
+0xC8BE U+534A # <cjk>
+0xC8BF U+53CD # <cjk>
+0xC8C0 U+53DB # <cjk>
+0xC8C1 U+5E06 # <cjk>
+0xC8C2 U+642C # <cjk>
+0xC8C3 U+6591 # <cjk>
+0xC8C4 U+677F # <cjk>
+0xC8C5 U+6C3E # <cjk>
+0xC8C6 U+6C4E # <cjk>
+0xC8C7 U+7248 # <cjk>
+0xC8C8 U+72AF # <cjk>
+0xC8C9 U+73ED # <cjk>
+0xC8CA U+7554 # <cjk>
+0xC8CB U+7E41 # <cjk>
+0xC8CC U+822C # <cjk>
+0xC8CD U+85E9 # <cjk>
+0xC8CE U+8CA9 # <cjk>
+0xC8CF U+7BC4 # <cjk>
+0xC8D0 U+91C6 # <cjk>
+0xC8D1 U+7169 # <cjk>
+0xC8D2 U+9812 # <cjk>
+0xC8D3 U+98EF # <cjk>
+0xC8D4 U+633D # <cjk>
+0xC8D5 U+6669 # <cjk>
+0xC8D6 U+756A # <cjk>
+0xC8D7 U+76E4 # <cjk>
+0xC8D8 U+78D0 # <cjk>
+0xC8D9 U+8543 # <cjk>
+0xC8DA U+86EE # <cjk>
+0xC8DB U+532A # <cjk>
+0xC8DC U+5351 # <cjk>
+0xC8DD U+5426 # <cjk>
+0xC8DE U+5983 # <cjk>
+0xC8DF U+5E87 # <cjk>
+0xC8E0 U+5F7C # <cjk>
+0xC8E1 U+60B2 # <cjk>
+0xC8E2 U+6249 # <cjk>
+0xC8E3 U+6279 # <cjk>
+0xC8E4 U+62AB # <cjk>
+0xC8E5 U+6590 # <cjk>
+0xC8E6 U+6BD4 # <cjk>
+0xC8E7 U+6CCC # <cjk>
+0xC8E8 U+75B2 # <cjk>
+0xC8E9 U+76AE # <cjk>
+0xC8EA U+7891 # <cjk>
+0xC8EB U+79D8 # <cjk>
+0xC8EC U+7DCB # <cjk>
+0xC8ED U+7F77 # <cjk>
+0xC8EE U+80A5 # <cjk>
+0xC8EF U+88AB # <cjk>
+0xC8F0 U+8AB9 # <cjk>
+0xC8F1 U+8CBB # <cjk>
+0xC8F2 U+907F # <cjk>
+0xC8F3 U+975E # <cjk>
+0xC8F4 U+98DB # <cjk>
+0xC8F5 U+6A0B # <cjk>
+0xC8F6 U+7C38 # <cjk>
+0xC8F7 U+5099 # <cjk>
+0xC8F8 U+5C3E # <cjk>
+0xC8F9 U+5FAE # <cjk>
+0xC8FA U+6787 # <cjk>
+0xC8FB U+6BD8 # <cjk>
+0xC8FC U+7435 # <cjk>
+0xC8FD U+7709 # <cjk>
+0xC8FE U+7F8E # <cjk>
+0xC9A1 U+9F3B # <cjk>
+0xC9A2 U+67CA # <cjk>
+0xC9A3 U+7A17 # <cjk>
+0xC9A4 U+5339 # <cjk>
+0xC9A5 U+758B # <cjk>
+0xC9A6 U+9AED # <cjk>
+0xC9A7 U+5F66 # <cjk>
+0xC9A8 U+819D # <cjk>
+0xC9A9 U+83F1 # <cjk>
+0xC9AA U+8098 # <cjk>
+0xC9AB U+5F3C # <cjk>
+0xC9AC U+5FC5 # <cjk>
+0xC9AD U+7562 # <cjk>
+0xC9AE U+7B46 # <cjk>
+0xC9AF U+903C # <cjk>
+0xC9B0 U+6867 # <cjk>
+0xC9B1 U+59EB # <cjk>
+0xC9B2 U+5A9B # <cjk>
+0xC9B3 U+7D10 # <cjk>
+0xC9B4 U+767E # <cjk>
+0xC9B5 U+8B2C # <cjk>
+0xC9B6 U+4FF5 # <cjk>
+0xC9B7 U+5F6A # <cjk>
+0xC9B8 U+6A19 # <cjk>
+0xC9B9 U+6C37 # <cjk>
+0xC9BA U+6F02 # <cjk>
+0xC9BB U+74E2 # <cjk>
+0xC9BC U+7968 # <cjk>
+0xC9BD U+8868 # <cjk>
+0xC9BE U+8A55 # <cjk>
+0xC9BF U+8C79 # <cjk>
+0xC9C0 U+5EDF # <cjk>
+0xC9C1 U+63CF # <cjk>
+0xC9C2 U+75C5 # <cjk>
+0xC9C3 U+79D2 # <cjk>
+0xC9C4 U+82D7 # <cjk>
+0xC9C5 U+9328 # <cjk>
+0xC9C6 U+92F2 # <cjk>
+0xC9C7 U+849C # <cjk>
+0xC9C8 U+86ED # <cjk>
+0xC9C9 U+9C2D # <cjk>
+0xC9CA U+54C1 # <cjk>
+0xC9CB U+5F6C # <cjk>
+0xC9CC U+658C # <cjk>
+0xC9CD U+6D5C # <cjk>
+0xC9CE U+7015 # <cjk>
+0xC9CF U+8CA7 # <cjk>
+0xC9D0 U+8CD3 # <cjk>
+0xC9D1 U+983B # <cjk>
+0xC9D2 U+654F # <cjk>
+0xC9D3 U+74F6 # <cjk>
+0xC9D4 U+4E0D # <cjk>
+0xC9D5 U+4ED8 # <cjk>
+0xC9D6 U+57E0 # <cjk>
+0xC9D7 U+592B # <cjk>
+0xC9D8 U+5A66 # <cjk>
+0xC9D9 U+5BCC # <cjk>
+0xC9DA U+51A8 # <cjk>
+0xC9DB U+5E03 # <cjk>
+0xC9DC U+5E9C # <cjk>
+0xC9DD U+6016 # <cjk>
+0xC9DE U+6276 # <cjk>
+0xC9DF U+6577 # <cjk>
+0xC9E0 U+65A7 # <cjk>
+0xC9E1 U+666E # <cjk>
+0xC9E2 U+6D6E # <cjk>
+0xC9E3 U+7236 # <cjk>
+0xC9E4 U+7B26 # <cjk>
+0xC9E5 U+8150 # <cjk>
+0xC9E6 U+819A # <cjk>
+0xC9E7 U+8299 # <cjk>
+0xC9E8 U+8B5C # <cjk>
+0xC9E9 U+8CA0 # <cjk>
+0xC9EA U+8CE6 # <cjk>
+0xC9EB U+8D74 # <cjk>
+0xC9EC U+961C # <cjk>
+0xC9ED U+9644 # <cjk>
+0xC9EE U+4FAE # <cjk>
+0xC9EF U+64AB # <cjk>
+0xC9F0 U+6B66 # <cjk>
+0xC9F1 U+821E # <cjk>
+0xC9F2 U+8461 # <cjk>
+0xC9F3 U+856A # <cjk>
+0xC9F4 U+90E8 # <cjk>
+0xC9F5 U+5C01 # <cjk>
+0xC9F6 U+6953 # <cjk>
+0xC9F7 U+98A8 # <cjk>
+0xC9F8 U+847A # <cjk>
+0xC9F9 U+8557 # <cjk>
+0xC9FA U+4F0F # <cjk>
+0xC9FB U+526F # <cjk>
+0xC9FC U+5FA9 # <cjk>
+0xC9FD U+5E45 # <cjk>
+0xC9FE U+670D # <cjk>
+0xCAA1 U+798F # <cjk>
+0xCAA2 U+8179 # <cjk>
+0xCAA3 U+8907 # <cjk>
+0xCAA4 U+8986 # <cjk>
+0xCAA5 U+6DF5 # <cjk>
+0xCAA6 U+5F17 # <cjk>
+0xCAA7 U+6255 # <cjk>
+0xCAA8 U+6CB8 # <cjk>
+0xCAA9 U+4ECF # <cjk>
+0xCAAA U+7269 # <cjk>
+0xCAAB U+9B92 # <cjk>
+0xCAAC U+5206 # <cjk>
+0xCAAD U+543B # <cjk>
+0xCAAE U+5674 # <cjk>
+0xCAAF U+58B3 # <cjk>
+0xCAB0 U+61A4 # <cjk>
+0xCAB1 U+626E # <cjk>
+0xCAB2 U+711A # <cjk>
+0xCAB3 U+596E # <cjk>
+0xCAB4 U+7C89 # <cjk>
+0xCAB5 U+7CDE # <cjk>
+0xCAB6 U+7D1B # <cjk>
+0xCAB7 U+96F0 # <cjk>
+0xCAB8 U+6587 # <cjk>
+0xCAB9 U+805E # <cjk>
+0xCABA U+4E19 # <cjk>
+0xCABB U+4F75 # <cjk>
+0xCABC U+5175 # <cjk>
+0xCABD U+5840 # <cjk>
+0xCABE U+5E63 # <cjk>
+0xCABF U+5E73 # <cjk>
+0xCAC0 U+5F0A # <cjk>
+0xCAC1 U+67C4 # <cjk>
+0xCAC2 U+4E26 # <cjk>
+0xCAC3 U+853D # <cjk>
+0xCAC4 U+9589 # <cjk>
+0xCAC5 U+965B # <cjk>
+0xCAC6 U+7C73 # <cjk>
+0xCAC7 U+9801 # <cjk>
+0xCAC8 U+50FB # <cjk>
+0xCAC9 U+58C1 # <cjk>
+0xCACA U+7656 # <cjk>
+0xCACB U+78A7 # <cjk>
+0xCACC U+5225 # <cjk>
+0xCACD U+77A5 # <cjk>
+0xCACE U+8511 # <cjk>
+0xCACF U+7B86 # <cjk>
+0xCAD0 U+504F # <cjk>
+0xCAD1 U+5909 # <cjk>
+0xCAD2 U+7247 # <cjk>
+0xCAD3 U+7BC7 # <cjk>
+0xCAD4 U+7DE8 # <cjk>
+0xCAD5 U+8FBA # <cjk>
+0xCAD6 U+8FD4 # <cjk>
+0xCAD7 U+904D # <cjk>
+0xCAD8 U+4FBF # <cjk>
+0xCAD9 U+52C9 # <cjk>
+0xCADA U+5A29 # <cjk>
+0xCADB U+5F01 # <cjk>
+0xCADC U+97AD # <cjk>
+0xCADD U+4FDD # <cjk>
+0xCADE U+8217 # <cjk>
+0xCADF U+92EA # <cjk>
+0xCAE0 U+5703 # <cjk>
+0xCAE1 U+6355 # <cjk>
+0xCAE2 U+6B69 # <cjk>
+0xCAE3 U+752B # <cjk>
+0xCAE4 U+88DC # <cjk>
+0xCAE5 U+8F14 # <cjk>
+0xCAE6 U+7A42 # <cjk>
+0xCAE7 U+52DF # <cjk>
+0xCAE8 U+5893 # <cjk>
+0xCAE9 U+6155 # <cjk>
+0xCAEA U+620A # <cjk>
+0xCAEB U+66AE # <cjk>
+0xCAEC U+6BCD # <cjk>
+0xCAED U+7C3F # <cjk>
+0xCAEE U+83E9 # <cjk>
+0xCAEF U+5023 # <cjk>
+0xCAF0 U+4FF8 # <cjk>
+0xCAF1 U+5305 # <cjk>
+0xCAF2 U+5446 # <cjk>
+0xCAF3 U+5831 # <cjk>
+0xCAF4 U+5949 # <cjk>
+0xCAF5 U+5B9D # <cjk>
+0xCAF6 U+5CF0 # <cjk>
+0xCAF7 U+5CEF # <cjk>
+0xCAF8 U+5D29 # <cjk>
+0xCAF9 U+5E96 # <cjk>
+0xCAFA U+62B1 # <cjk>
+0xCAFB U+6367 # <cjk>
+0xCAFC U+653E # <cjk>
+0xCAFD U+65B9 # <cjk>
+0xCAFE U+670B # <cjk>
+0xCBA1 U+6CD5 # <cjk>
+0xCBA2 U+6CE1 # <cjk>
+0xCBA3 U+70F9 # <cjk>
+0xCBA4 U+7832 # <cjk>
+0xCBA5 U+7E2B # <cjk>
+0xCBA6 U+80DE # <cjk>
+0xCBA7 U+82B3 # <cjk>
+0xCBA8 U+840C # <cjk>
+0xCBA9 U+84EC # <cjk>
+0xCBAA U+8702 # <cjk>
+0xCBAB U+8912 # <cjk>
+0xCBAC U+8A2A # <cjk>
+0xCBAD U+8C4A # <cjk>
+0xCBAE U+90A6 # <cjk>
+0xCBAF U+92D2 # <cjk>
+0xCBB0 U+98FD # <cjk>
+0xCBB1 U+9CF3 # <cjk>
+0xCBB2 U+9D6C # <cjk>
+0xCBB3 U+4E4F # <cjk>
+0xCBB4 U+4EA1 # <cjk>
+0xCBB5 U+508D # <cjk>
+0xCBB6 U+5256 # <cjk>
+0xCBB7 U+574A # <cjk>
+0xCBB8 U+59A8 # <cjk>
+0xCBB9 U+5E3D # <cjk>
+0xCBBA U+5FD8 # <cjk>
+0xCBBB U+5FD9 # <cjk>
+0xCBBC U+623F # <cjk>
+0xCBBD U+66B4 # <cjk>
+0xCBBE U+671B # <cjk>
+0xCBBF U+67D0 # <cjk>
+0xCBC0 U+68D2 # <cjk>
+0xCBC1 U+5192 # <cjk>
+0xCBC2 U+7D21 # <cjk>
+0xCBC3 U+80AA # <cjk>
+0xCBC4 U+81A8 # <cjk>
+0xCBC5 U+8B00 # <cjk>
+0xCBC6 U+8C8C # <cjk>
+0xCBC7 U+8CBF # <cjk>
+0xCBC8 U+927E # <cjk>
+0xCBC9 U+9632 # <cjk>
+0xCBCA U+5420 # <cjk>
+0xCBCB U+982C # <cjk>
+0xCBCC U+5317 # <cjk>
+0xCBCD U+50D5 # <cjk>
+0xCBCE U+535C # <cjk>
+0xCBCF U+58A8 # <cjk>
+0xCBD0 U+64B2 # <cjk>
+0xCBD1 U+6734 # <cjk>
+0xCBD2 U+7267 # <cjk>
+0xCBD3 U+7766 # <cjk>
+0xCBD4 U+7A46 # <cjk>
+0xCBD5 U+91E6 # <cjk>
+0xCBD6 U+52C3 # <cjk>
+0xCBD7 U+6CA1 # <cjk>
+0xCBD8 U+6B86 # <cjk>
+0xCBD9 U+5800 # <cjk>
+0xCBDA U+5E4C # <cjk>
+0xCBDB U+5954 # <cjk>
+0xCBDC U+672C # <cjk>
+0xCBDD U+7FFB # <cjk>
+0xCBDE U+51E1 # <cjk>
+0xCBDF U+76C6 # <cjk>
+0xCBE0 U+6469 # <cjk>
+0xCBE1 U+78E8 # <cjk>
+0xCBE2 U+9B54 # <cjk>
+0xCBE3 U+9EBB # <cjk>
+0xCBE4 U+57CB # <cjk>
+0xCBE5 U+59B9 # <cjk>
+0xCBE6 U+6627 # <cjk>
+0xCBE7 U+679A # <cjk>
+0xCBE8 U+6BCE # <cjk>
+0xCBE9 U+54E9 # <cjk>
+0xCBEA U+69D9 # <cjk>
+0xCBEB U+5E55 # <cjk>
+0xCBEC U+819C # <cjk>
+0xCBED U+6795 # <cjk>
+0xCBEE U+9BAA # <cjk>
+0xCBEF U+67FE # <cjk>
+0xCBF0 U+9C52 # <cjk>
+0xCBF1 U+685D # <cjk>
+0xCBF2 U+4EA6 # <cjk>
+0xCBF3 U+4FE3 # <cjk>
+0xCBF4 U+53C8 # <cjk>
+0xCBF5 U+62B9 # <cjk>
+0xCBF6 U+672B # <cjk>
+0xCBF7 U+6CAB # <cjk>
+0xCBF8 U+8FC4 # <cjk>
+0xCBF9 U+4FAD # <cjk>
+0xCBFA U+7E6D # <cjk>
+0xCBFB U+9EBF # <cjk>
+0xCBFC U+4E07 # <cjk>
+0xCBFD U+6162 # <cjk>
+0xCBFE U+6E80 # <cjk>
+0xCCA1 U+6F2B # <cjk>
+0xCCA2 U+8513 # <cjk>
+0xCCA3 U+5473 # <cjk>
+0xCCA4 U+672A # <cjk>
+0xCCA5 U+9B45 # <cjk>
+0xCCA6 U+5DF3 # <cjk>
+0xCCA7 U+7B95 # <cjk>
+0xCCA8 U+5CAC # <cjk>
+0xCCA9 U+5BC6 # <cjk>
+0xCCAA U+871C # <cjk>
+0xCCAB U+6E4A # <cjk>
+0xCCAC U+84D1 # <cjk>
+0xCCAD U+7A14 # <cjk>
+0xCCAE U+8108 # <cjk>
+0xCCAF U+5999 # <cjk>
+0xCCB0 U+7C8D # <cjk>
+0xCCB1 U+6C11 # <cjk>
+0xCCB2 U+7720 # <cjk>
+0xCCB3 U+52D9 # <cjk>
+0xCCB4 U+5922 # <cjk>
+0xCCB5 U+7121 # <cjk>
+0xCCB6 U+725F # <cjk>
+0xCCB7 U+77DB # <cjk>
+0xCCB8 U+9727 # <cjk>
+0xCCB9 U+9D61 # <cjk>
+0xCCBA U+690B # <cjk>
+0xCCBB U+5A7F # <cjk>
+0xCCBC U+5A18 # <cjk>
+0xCCBD U+51A5 # <cjk>
+0xCCBE U+540D # <cjk>
+0xCCBF U+547D # <cjk>
+0xCCC0 U+660E # <cjk>
+0xCCC1 U+76DF # <cjk>
+0xCCC2 U+8FF7 # <cjk>
+0xCCC3 U+9298 # <cjk>
+0xCCC4 U+9CF4 # <cjk>
+0xCCC5 U+59EA # <cjk>
+0xCCC6 U+725D # <cjk>
+0xCCC7 U+6EC5 # <cjk>
+0xCCC8 U+514D # <cjk>
+0xCCC9 U+68C9 # <cjk>
+0xCCCA U+7DBF # <cjk>
+0xCCCB U+7DEC # <cjk>
+0xCCCC U+9762 # <cjk>
+0xCCCD U+9EBA # <cjk>
+0xCCCE U+6478 # <cjk>
+0xCCCF U+6A21 # <cjk>
+0xCCD0 U+8302 # <cjk>
+0xCCD1 U+5984 # <cjk>
+0xCCD2 U+5B5F # <cjk>
+0xCCD3 U+6BDB # <cjk>
+0xCCD4 U+731B # <cjk>
+0xCCD5 U+76F2 # <cjk>
+0xCCD6 U+7DB2 # <cjk>
+0xCCD7 U+8017 # <cjk>
+0xCCD8 U+8499 # <cjk>
+0xCCD9 U+5132 # <cjk>
+0xCCDA U+6728 # <cjk>
+0xCCDB U+9ED9 # <cjk>
+0xCCDC U+76EE # <cjk>
+0xCCDD U+6762 # <cjk>
+0xCCDE U+52FF # <cjk>
+0xCCDF U+9905 # <cjk>
+0xCCE0 U+5C24 # <cjk>
+0xCCE1 U+623B # <cjk>
+0xCCE2 U+7C7E # <cjk>
+0xCCE3 U+8CB0 # <cjk>
+0xCCE4 U+554F # <cjk>
+0xCCE5 U+60B6 # <cjk>
+0xCCE6 U+7D0B # <cjk>
+0xCCE7 U+9580 # <cjk>
+0xCCE8 U+5301 # <cjk>
+0xCCE9 U+4E5F # <cjk>
+0xCCEA U+51B6 # <cjk>
+0xCCEB U+591C # <cjk>
+0xCCEC U+723A # <cjk>
+0xCCED U+8036 # <cjk>
+0xCCEE U+91CE # <cjk>
+0xCCEF U+5F25 # <cjk>
+0xCCF0 U+77E2 # <cjk>
+0xCCF1 U+5384 # <cjk>
+0xCCF2 U+5F79 # <cjk>
+0xCCF3 U+7D04 # <cjk>
+0xCCF4 U+85AC # <cjk>
+0xCCF5 U+8A33 # <cjk>
+0xCCF6 U+8E8D # <cjk>
+0xCCF7 U+9756 # <cjk>
+0xCCF8 U+67F3 # <cjk>
+0xCCF9 U+85AE # <cjk>
+0xCCFA U+9453 # <cjk>
+0xCCFB U+6109 # <cjk>
+0xCCFC U+6108 # <cjk>
+0xCCFD U+6CB9 # <cjk>
+0xCCFE U+7652 # <cjk>
+0xCDA1 U+8AED # <cjk>
+0xCDA2 U+8F38 # <cjk>
+0xCDA3 U+552F # <cjk>
+0xCDA4 U+4F51 # <cjk>
+0xCDA5 U+512A # <cjk>
+0xCDA6 U+52C7 # <cjk>
+0xCDA7 U+53CB # <cjk>
+0xCDA8 U+5BA5 # <cjk>
+0xCDA9 U+5E7D # <cjk>
+0xCDAA U+60A0 # <cjk>
+0xCDAB U+6182 # <cjk>
+0xCDAC U+63D6 # <cjk>
+0xCDAD U+6709 # <cjk>
+0xCDAE U+67DA # <cjk>
+0xCDAF U+6E67 # <cjk>
+0xCDB0 U+6D8C # <cjk>
+0xCDB1 U+7336 # <cjk>
+0xCDB2 U+7337 # <cjk>
+0xCDB3 U+7531 # <cjk>
+0xCDB4 U+7950 # <cjk>
+0xCDB5 U+88D5 # <cjk>
+0xCDB6 U+8A98 # <cjk>
+0xCDB7 U+904A # <cjk>
+0xCDB8 U+9091 # <cjk>
+0xCDB9 U+90F5 # <cjk>
+0xCDBA U+96C4 # <cjk>
+0xCDBB U+878D # <cjk>
+0xCDBC U+5915 # <cjk>
+0xCDBD U+4E88 # <cjk>
+0xCDBE U+4F59 # <cjk>
+0xCDBF U+4E0E # <cjk>
+0xCDC0 U+8A89 # <cjk>
+0xCDC1 U+8F3F # <cjk>
+0xCDC2 U+9810 # <cjk>
+0xCDC3 U+50AD # <cjk>
+0xCDC4 U+5E7C # <cjk>
+0xCDC5 U+5996 # <cjk>
+0xCDC6 U+5BB9 # <cjk>
+0xCDC7 U+5EB8 # <cjk>
+0xCDC8 U+63DA # <cjk>
+0xCDC9 U+63FA # <cjk>
+0xCDCA U+64C1 # <cjk>
+0xCDCB U+66DC # <cjk>
+0xCDCC U+694A # <cjk>
+0xCDCD U+69D8 # <cjk>
+0xCDCE U+6D0B # <cjk>
+0xCDCF U+6EB6 # <cjk>
+0xCDD0 U+7194 # <cjk>
+0xCDD1 U+7528 # <cjk>
+0xCDD2 U+7AAF # <cjk>
+0xCDD3 U+7F8A # <cjk>
+0xCDD4 U+8000 # <cjk>
+0xCDD5 U+8449 # <cjk>
+0xCDD6 U+84C9 # <cjk>
+0xCDD7 U+8981 # <cjk>
+0xCDD8 U+8B21 # <cjk>
+0xCDD9 U+8E0A # <cjk>
+0xCDDA U+9065 # <cjk>
+0xCDDB U+967D # <cjk>
+0xCDDC U+990A # <cjk>
+0xCDDD U+617E # <cjk>
+0xCDDE U+6291 # <cjk>
+0xCDDF U+6B32 # <cjk>
+0xCDE0 U+6C83 # <cjk>
+0xCDE1 U+6D74 # <cjk>
+0xCDE2 U+7FCC # <cjk>
+0xCDE3 U+7FFC # <cjk>
+0xCDE4 U+6DC0 # <cjk>
+0xCDE5 U+7F85 # <cjk>
+0xCDE6 U+87BA # <cjk>
+0xCDE7 U+88F8 # <cjk>
+0xCDE8 U+6765 # <cjk>
+0xCDE9 U+83B1 # <cjk>
+0xCDEA U+983C # <cjk>
+0xCDEB U+96F7 # <cjk>
+0xCDEC U+6D1B # <cjk>
+0xCDED U+7D61 # <cjk>
+0xCDEE U+843D # <cjk>
+0xCDEF U+916A # <cjk>
+0xCDF0 U+4E71 # <cjk>
+0xCDF1 U+5375 # <cjk>
+0xCDF2 U+5D50 # <cjk>
+0xCDF3 U+6B04 # <cjk>
+0xCDF4 U+6FEB # <cjk>
+0xCDF5 U+85CD # <cjk>
+0xCDF6 U+862D # <cjk>
+0xCDF7 U+89A7 # <cjk>
+0xCDF8 U+5229 # <cjk>
+0xCDF9 U+540F # <cjk>
+0xCDFA U+5C65 # <cjk>
+0xCDFB U+674E # <cjk>
+0xCDFC U+68A8 # <cjk>
+0xCDFD U+7406 # <cjk>
+0xCDFE U+7483 # <cjk>
+0xCEA1 U+75E2 # <cjk>
+0xCEA2 U+88CF # <cjk>
+0xCEA3 U+88E1 # <cjk>
+0xCEA4 U+91CC # <cjk>
+0xCEA5 U+96E2 # <cjk>
+0xCEA6 U+9678 # <cjk>
+0xCEA7 U+5F8B # <cjk>
+0xCEA8 U+7387 # <cjk>
+0xCEA9 U+7ACB # <cjk>
+0xCEAA U+844E # <cjk>
+0xCEAB U+63A0 # <cjk>
+0xCEAC U+7565 # <cjk>
+0xCEAD U+5289 # <cjk>
+0xCEAE U+6D41 # <cjk>
+0xCEAF U+6E9C # <cjk>
+0xCEB0 U+7409 # <cjk>
+0xCEB1 U+7559 # <cjk>
+0xCEB2 U+786B # <cjk>
+0xCEB3 U+7C92 # <cjk>
+0xCEB4 U+9686 # <cjk>
+0xCEB5 U+7ADC # <cjk>
+0xCEB6 U+9F8D # <cjk>
+0xCEB7 U+4FB6 # <cjk>
+0xCEB8 U+616E # <cjk>
+0xCEB9 U+65C5 # <cjk>
+0xCEBA U+865C # <cjk>
+0xCEBB U+4E86 # <cjk>
+0xCEBC U+4EAE # <cjk>
+0xCEBD U+50DA # <cjk>
+0xCEBE U+4E21 # <cjk>
+0xCEBF U+51CC # <cjk>
+0xCEC0 U+5BEE # <cjk>
+0xCEC1 U+6599 # <cjk>
+0xCEC2 U+6881 # <cjk>
+0xCEC3 U+6DBC # <cjk>
+0xCEC4 U+731F # <cjk>
+0xCEC5 U+7642 # <cjk>
+0xCEC6 U+77AD # <cjk>
+0xCEC7 U+7A1C # <cjk>
+0xCEC8 U+7CE7 # <cjk>
+0xCEC9 U+826F # <cjk>
+0xCECA U+8AD2 # <cjk>
+0xCECB U+907C # <cjk>
+0xCECC U+91CF # <cjk>
+0xCECD U+9675 # <cjk>
+0xCECE U+9818 # <cjk>
+0xCECF U+529B # <cjk>
+0xCED0 U+7DD1 # <cjk>
+0xCED1 U+502B # <cjk>
+0xCED2 U+5398 # <cjk>
+0xCED3 U+6797 # <cjk>
+0xCED4 U+6DCB # <cjk>
+0xCED5 U+71D0 # <cjk>
+0xCED6 U+7433 # <cjk>
+0xCED7 U+81E8 # <cjk>
+0xCED8 U+8F2A # <cjk>
+0xCED9 U+96A3 # <cjk>
+0xCEDA U+9C57 # <cjk>
+0xCEDB U+9E9F # <cjk>
+0xCEDC U+7460 # <cjk>
+0xCEDD U+5841 # <cjk>
+0xCEDE U+6D99 # <cjk>
+0xCEDF U+7D2F # <cjk>
+0xCEE0 U+985E # <cjk>
+0xCEE1 U+4EE4 # <cjk>
+0xCEE2 U+4F36 # <cjk>
+0xCEE3 U+4F8B # <cjk>
+0xCEE4 U+51B7 # <cjk>
+0xCEE5 U+52B1 # <cjk>
+0xCEE6 U+5DBA # <cjk>
+0xCEE7 U+601C # <cjk>
+0xCEE8 U+73B2 # <cjk>
+0xCEE9 U+793C # <cjk>
+0xCEEA U+82D3 # <cjk>
+0xCEEB U+9234 # <cjk>
+0xCEEC U+96B7 # <cjk>
+0xCEED U+96F6 # <cjk>
+0xCEEE U+970A # <cjk>
+0xCEEF U+9E97 # <cjk>
+0xCEF0 U+9F62 # <cjk>
+0xCEF1 U+66A6 # <cjk>
+0xCEF2 U+6B74 # <cjk>
+0xCEF3 U+5217 # <cjk>
+0xCEF4 U+52A3 # <cjk>
+0xCEF5 U+70C8 # <cjk>
+0xCEF6 U+88C2 # <cjk>
+0xCEF7 U+5EC9 # <cjk>
+0xCEF8 U+604B # <cjk>
+0xCEF9 U+6190 # <cjk>
+0xCEFA U+6F23 # <cjk>
+0xCEFB U+7149 # <cjk>
+0xCEFC U+7C3E # <cjk>
+0xCEFD U+7DF4 # <cjk>
+0xCEFE U+806F # <cjk>
+0xCFA1 U+84EE # <cjk>
+0xCFA2 U+9023 # <cjk>
+0xCFA3 U+932C # <cjk>
+0xCFA4 U+5442 # <cjk>
+0xCFA5 U+9B6F # <cjk>
+0xCFA6 U+6AD3 # <cjk>
+0xCFA7 U+7089 # <cjk>
+0xCFA8 U+8CC2 # <cjk>
+0xCFA9 U+8DEF # <cjk>
+0xCFAA U+9732 # <cjk>
+0xCFAB U+52B4 # <cjk>
+0xCFAC U+5A41 # <cjk>
+0xCFAD U+5ECA # <cjk>
+0xCFAE U+5F04 # <cjk>
+0xCFAF U+6717 # <cjk>
+0xCFB0 U+697C # <cjk>
+0xCFB1 U+6994 # <cjk>
+0xCFB2 U+6D6A # <cjk>
+0xCFB3 U+6F0F # <cjk>
+0xCFB4 U+7262 # <cjk>
+0xCFB5 U+72FC # <cjk>
+0xCFB6 U+7BED # <cjk>
+0xCFB7 U+8001 # <cjk>
+0xCFB8 U+807E # <cjk>
+0xCFB9 U+874B # <cjk>
+0xCFBA U+90CE # <cjk>
+0xCFBB U+516D # <cjk>
+0xCFBC U+9E93 # <cjk>
+0xCFBD U+7984 # <cjk>
+0xCFBE U+808B # <cjk>
+0xCFBF U+9332 # <cjk>
+0xCFC0 U+8AD6 # <cjk>
+0xCFC1 U+502D # <cjk>
+0xCFC2 U+548C # <cjk>
+0xCFC3 U+8A71 # <cjk>
+0xCFC4 U+6B6A # <cjk>
+0xCFC5 U+8CC4 # <cjk>
+0xCFC6 U+8107 # <cjk>
+0xCFC7 U+60D1 # <cjk>
+0xCFC8 U+67A0 # <cjk>
+0xCFC9 U+9DF2 # <cjk>
+0xCFCA U+4E99 # <cjk>
+0xCFCB U+4E98 # <cjk>
+0xCFCC U+9C10 # <cjk>
+0xCFCD U+8A6B # <cjk>
+0xCFCE U+85C1 # <cjk>
+0xCFCF U+8568 # <cjk>
+0xCFD0 U+6900 # <cjk>
+0xCFD1 U+6E7E # <cjk>
+0xCFD2 U+7897 # <cjk>
+0xCFD3 U+8155 # <cjk>
+0xCFD4 U+20B9F # <cjk> [2004] [Unicode3.1]
+0xCFD5 U+5B41 # <cjk> [2000]
+0xCFD6 U+5B56 # <cjk> [2000]
+0xCFD7 U+5B7D # <cjk> [2000]
+0xCFD8 U+5B93 # <cjk> [2000]
+0xCFD9 U+5BD8 # <cjk> [2000]
+0xCFDA U+5BEC # <cjk> [2000]
+0xCFDB U+5C12 # <cjk> [2000]
+0xCFDC U+5C1E # <cjk> [2000]
+0xCFDD U+5C23 # <cjk> [2000]
+0xCFDE U+5C2B # <cjk> [2000]
+0xCFDF U+378D # <cjk> [2000]
+0xCFE0 U+5C62 # <cjk> [2000]
+0xCFE1 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2]
+0xCFE2 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2]
+0xCFE3 U+216B4 # <cjk> [2000] [Unicode3.1]
+0xCFE4 U+5C7A # <cjk> [2000]
+0xCFE5 U+5C8F # <cjk> [2000]
+0xCFE6 U+5C9F # <cjk> [2000]
+0xCFE7 U+5CA3 # <cjk> [2000]
+0xCFE8 U+5CAA # <cjk> [2000]
+0xCFE9 U+5CBA # <cjk> [2000]
+0xCFEA U+5CCB # <cjk> [2000]
+0xCFEB U+5CD0 # <cjk> [2000]
+0xCFEC U+5CD2 # <cjk> [2000]
+0xCFED U+5CF4 # <cjk> [2000]
+0xCFEE U+21E34 # <cjk> [2000] [Unicode3.1]
+0xCFEF U+37E2 # <cjk> [2000]
+0xCFF0 U+5D0D # <cjk> [2000]
+0xCFF1 U+5D27 # <cjk> [2000]
+0xCFF2 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000]
+0xCFF3 U+5D46 # <cjk> [2000]
+0xCFF4 U+5D47 # <cjk> [2000]
+0xCFF5 U+5D53 # <cjk> [2000]
+0xCFF6 U+5D4A # <cjk> [2000]
+0xCFF7 U+5D6D # <cjk> [2000]
+0xCFF8 U+5D81 # <cjk> [2000]
+0xCFF9 U+5DA0 # <cjk> [2000]
+0xCFFA U+5DA4 # <cjk> [2000]
+0xCFFB U+5DA7 # <cjk> [2000]
+0xCFFC U+5DB8 # <cjk> [2000]
+0xCFFD U+5DCB # <cjk> [2000]
+0xCFFE U+541E # <cjk> [2004]
+0xD0A1 U+5F0C # <cjk>
+0xD0A2 U+4E10 # <cjk>
+0xD0A3 U+4E15 # <cjk>
+0xD0A4 U+4E2A # <cjk>
+0xD0A5 U+4E31 # <cjk>
+0xD0A6 U+4E36 # <cjk>
+0xD0A7 U+4E3C # <cjk>
+0xD0A8 U+4E3F # <cjk>
+0xD0A9 U+4E42 # <cjk>
+0xD0AA U+4E56 # <cjk>
+0xD0AB U+4E58 # <cjk>
+0xD0AC U+4E82 # <cjk>
+0xD0AD U+4E85 # <cjk>
+0xD0AE U+8C6B # <cjk>
+0xD0AF U+4E8A # <cjk>
+0xD0B0 U+8212 # <cjk>
+0xD0B1 U+5F0D # <cjk>
+0xD0B2 U+4E8E # <cjk>
+0xD0B3 U+4E9E # <cjk>
+0xD0B4 U+4E9F # <cjk>
+0xD0B5 U+4EA0 # <cjk>
+0xD0B6 U+4EA2 # <cjk>
+0xD0B7 U+4EB0 # <cjk>
+0xD0B8 U+4EB3 # <cjk>
+0xD0B9 U+4EB6 # <cjk>
+0xD0BA U+4ECE # <cjk>
+0xD0BB U+4ECD # <cjk>
+0xD0BC U+4EC4 # <cjk>
+0xD0BD U+4EC6 # <cjk>
+0xD0BE U+4EC2 # <cjk>
+0xD0BF U+4ED7 # <cjk>
+0xD0C0 U+4EDE # <cjk>
+0xD0C1 U+4EED # <cjk>
+0xD0C2 U+4EDF # <cjk>
+0xD0C3 U+4EF7 # <cjk>
+0xD0C4 U+4F09 # <cjk>
+0xD0C5 U+4F5A # <cjk>
+0xD0C6 U+4F30 # <cjk>
+0xD0C7 U+4F5B # <cjk>
+0xD0C8 U+4F5D # <cjk>
+0xD0C9 U+4F57 # <cjk>
+0xD0CA U+4F47 # <cjk>
+0xD0CB U+4F76 # <cjk>
+0xD0CC U+4F88 # <cjk>
+0xD0CD U+4F8F # <cjk>
+0xD0CE U+4F98 # <cjk>
+0xD0CF U+4F7B # <cjk>
+0xD0D0 U+4F69 # <cjk>
+0xD0D1 U+4F70 # <cjk>
+0xD0D2 U+4F91 # <cjk>
+0xD0D3 U+4F6F # <cjk>
+0xD0D4 U+4F86 # <cjk>
+0xD0D5 U+4F96 # <cjk>
+0xD0D6 U+5118 # <cjk>
+0xD0D7 U+4FD4 # <cjk>
+0xD0D8 U+4FDF # <cjk>
+0xD0D9 U+4FCE # <cjk>
+0xD0DA U+4FD8 # <cjk>
+0xD0DB U+4FDB # <cjk>
+0xD0DC U+4FD1 # <cjk>
+0xD0DD U+4FDA # <cjk>
+0xD0DE U+4FD0 # <cjk>
+0xD0DF U+4FE4 # <cjk>
+0xD0E0 U+4FE5 # <cjk>
+0xD0E1 U+501A # <cjk>
+0xD0E2 U+5028 # <cjk>
+0xD0E3 U+5014 # <cjk>
+0xD0E4 U+502A # <cjk>
+0xD0E5 U+5025 # <cjk>
+0xD0E6 U+5005 # <cjk>
+0xD0E7 U+4F1C # <cjk>
+0xD0E8 U+4FF6 # <cjk>
+0xD0E9 U+5021 # <cjk>
+0xD0EA U+5029 # <cjk>
+0xD0EB U+502C # <cjk>
+0xD0EC U+4FFE # <cjk>
+0xD0ED U+4FEF # <cjk>
+0xD0EE U+5011 # <cjk>
+0xD0EF U+5006 # <cjk>
+0xD0F0 U+5043 # <cjk>
+0xD0F1 U+5047 # <cjk>
+0xD0F2 U+6703 # <cjk>
+0xD0F3 U+5055 # <cjk>
+0xD0F4 U+5050 # <cjk>
+0xD0F5 U+5048 # <cjk>
+0xD0F6 U+505A # <cjk>
+0xD0F7 U+5056 # <cjk>
+0xD0F8 U+506C # <cjk>
+0xD0F9 U+5078 # <cjk>
+0xD0FA U+5080 # <cjk>
+0xD0FB U+509A # <cjk>
+0xD0FC U+5085 # <cjk>
+0xD0FD U+50B4 # <cjk>
+0xD0FE U+50B2 # <cjk>
+0xD1A1 U+50C9 # <cjk>
+0xD1A2 U+50CA # <cjk>
+0xD1A3 U+50B3 # <cjk>
+0xD1A4 U+50C2 # <cjk>
+0xD1A5 U+50D6 # <cjk>
+0xD1A6 U+50DE # <cjk>
+0xD1A7 U+50E5 # <cjk>
+0xD1A8 U+50ED # <cjk>
+0xD1A9 U+50E3 # <cjk>
+0xD1AA U+50EE # <cjk>
+0xD1AB U+50F9 # <cjk>
+0xD1AC U+50F5 # <cjk>
+0xD1AD U+5109 # <cjk>
+0xD1AE U+5101 # <cjk>
+0xD1AF U+5102 # <cjk>
+0xD1B0 U+5116 # <cjk>
+0xD1B1 U+5115 # <cjk>
+0xD1B2 U+5114 # <cjk>
+0xD1B3 U+511A # <cjk>
+0xD1B4 U+5121 # <cjk>
+0xD1B5 U+513A # <cjk>
+0xD1B6 U+5137 # <cjk>
+0xD1B7 U+513C # <cjk>
+0xD1B8 U+513B # <cjk>
+0xD1B9 U+513F # <cjk>
+0xD1BA U+5140 # <cjk>
+0xD1BB U+5152 # <cjk>
+0xD1BC U+514C # <cjk>
+0xD1BD U+5154 # <cjk>
+0xD1BE U+5162 # <cjk>
+0xD1BF U+7AF8 # <cjk>
+0xD1C0 U+5169 # <cjk>
+0xD1C1 U+516A # <cjk>
+0xD1C2 U+516E # <cjk>
+0xD1C3 U+5180 # <cjk>
+0xD1C4 U+5182 # <cjk>
+0xD1C5 U+56D8 # <cjk>
+0xD1C6 U+518C # <cjk>
+0xD1C7 U+5189 # <cjk>
+0xD1C8 U+518F # <cjk>
+0xD1C9 U+5191 # <cjk>
+0xD1CA U+5193 # <cjk>
+0xD1CB U+5195 # <cjk>
+0xD1CC U+5196 # <cjk>
+0xD1CD U+51A4 # <cjk>
+0xD1CE U+51A6 # <cjk>
+0xD1CF U+51A2 # <cjk>
+0xD1D0 U+51A9 # <cjk>
+0xD1D1 U+51AA # <cjk>
+0xD1D2 U+51AB # <cjk>
+0xD1D3 U+51B3 # <cjk>
+0xD1D4 U+51B1 # <cjk>
+0xD1D5 U+51B2 # <cjk>
+0xD1D6 U+51B0 # <cjk>
+0xD1D7 U+51B5 # <cjk>
+0xD1D8 U+51BD # <cjk>
+0xD1D9 U+51C5 # <cjk>
+0xD1DA U+51C9 # <cjk>
+0xD1DB U+51DB # <cjk>
+0xD1DC U+51E0 # <cjk>
+0xD1DD U+8655 # <cjk>
+0xD1DE U+51E9 # <cjk>
+0xD1DF U+51ED # <cjk>
+0xD1E0 U+51F0 # <cjk>
+0xD1E1 U+51F5 # <cjk>
+0xD1E2 U+51FE # <cjk>
+0xD1E3 U+5204 # <cjk>
+0xD1E4 U+520B # <cjk>
+0xD1E5 U+5214 # <cjk>
+0xD1E6 U+520E # <cjk>
+0xD1E7 U+5227 # <cjk>
+0xD1E8 U+522A # <cjk>
+0xD1E9 U+522E # <cjk>
+0xD1EA U+5233 # <cjk>
+0xD1EB U+5239 # <cjk>
+0xD1EC U+524F # <cjk>
+0xD1ED U+5244 # <cjk>
+0xD1EE U+524B # <cjk>
+0xD1EF U+524C # <cjk>
+0xD1F0 U+525E # <cjk>
+0xD1F1 U+5254 # <cjk>
+0xD1F2 U+526A # <cjk>
+0xD1F3 U+5274 # <cjk>
+0xD1F4 U+5269 # <cjk>
+0xD1F5 U+5273 # <cjk>
+0xD1F6 U+527F # <cjk>
+0xD1F7 U+527D # <cjk>
+0xD1F8 U+528D # <cjk>
+0xD1F9 U+5294 # <cjk>
+0xD1FA U+5292 # <cjk>
+0xD1FB U+5271 # <cjk>
+0xD1FC U+5288 # <cjk>
+0xD1FD U+5291 # <cjk>
+0xD1FE U+8FA8 # <cjk>
+0xD2A1 U+8FA7 # <cjk>
+0xD2A2 U+52AC # <cjk>
+0xD2A3 U+52AD # <cjk>
+0xD2A4 U+52BC # <cjk>
+0xD2A5 U+52B5 # <cjk>
+0xD2A6 U+52C1 # <cjk>
+0xD2A7 U+52CD # <cjk>
+0xD2A8 U+52D7 # <cjk>
+0xD2A9 U+52DE # <cjk>
+0xD2AA U+52E3 # <cjk>
+0xD2AB U+52E6 # <cjk>
+0xD2AC U+98ED # <cjk>
+0xD2AD U+52E0 # <cjk>
+0xD2AE U+52F3 # <cjk>
+0xD2AF U+52F5 # <cjk>
+0xD2B0 U+52F8 # <cjk>
+0xD2B1 U+52F9 # <cjk>
+0xD2B2 U+5306 # <cjk>
+0xD2B3 U+5308 # <cjk>
+0xD2B4 U+7538 # <cjk>
+0xD2B5 U+530D # <cjk>
+0xD2B6 U+5310 # <cjk>
+0xD2B7 U+530F # <cjk>
+0xD2B8 U+5315 # <cjk>
+0xD2B9 U+531A # <cjk>
+0xD2BA U+5323 # <cjk>
+0xD2BB U+532F # <cjk>
+0xD2BC U+5331 # <cjk>
+0xD2BD U+5333 # <cjk>
+0xD2BE U+5338 # <cjk>
+0xD2BF U+5340 # <cjk>
+0xD2C0 U+5346 # <cjk>
+0xD2C1 U+5345 # <cjk>
+0xD2C2 U+4E17 # <cjk>
+0xD2C3 U+5349 # <cjk>
+0xD2C4 U+534D # <cjk>
+0xD2C5 U+51D6 # <cjk>
+0xD2C6 U+535E # <cjk>
+0xD2C7 U+5369 # <cjk>
+0xD2C8 U+536E # <cjk>
+0xD2C9 U+5918 # <cjk>
+0xD2CA U+537B # <cjk>
+0xD2CB U+5377 # <cjk>
+0xD2CC U+5382 # <cjk>
+0xD2CD U+5396 # <cjk>
+0xD2CE U+53A0 # <cjk>
+0xD2CF U+53A6 # <cjk>
+0xD2D0 U+53A5 # <cjk>
+0xD2D1 U+53AE # <cjk>
+0xD2D2 U+53B0 # <cjk>
+0xD2D3 U+53B6 # <cjk>
+0xD2D4 U+53C3 # <cjk>
+0xD2D5 U+7C12 # <cjk>
+0xD2D6 U+96D9 # <cjk>
+0xD2D7 U+53DF # <cjk>
+0xD2D8 U+66FC # <cjk>
+0xD2D9 U+71EE # <cjk>
+0xD2DA U+53EE # <cjk>
+0xD2DB U+53E8 # <cjk>
+0xD2DC U+53ED # <cjk>
+0xD2DD U+53FA # <cjk>
+0xD2DE U+5401 # <cjk>
+0xD2DF U+543D # <cjk>
+0xD2E0 U+5440 # <cjk>
+0xD2E1 U+542C # <cjk>
+0xD2E2 U+542D # <cjk>
+0xD2E3 U+543C # <cjk>
+0xD2E4 U+542E # <cjk>
+0xD2E5 U+5436 # <cjk>
+0xD2E6 U+5429 # <cjk>
+0xD2E7 U+541D # <cjk>
+0xD2E8 U+544E # <cjk>
+0xD2E9 U+548F # <cjk>
+0xD2EA U+5475 # <cjk>
+0xD2EB U+548E # <cjk>
+0xD2EC U+545F # <cjk>
+0xD2ED U+5471 # <cjk>
+0xD2EE U+5477 # <cjk>
+0xD2EF U+5470 # <cjk>
+0xD2F0 U+5492 # <cjk>
+0xD2F1 U+547B # <cjk>
+0xD2F2 U+5480 # <cjk>
+0xD2F3 U+5476 # <cjk>
+0xD2F4 U+5484 # <cjk>
+0xD2F5 U+5490 # <cjk>
+0xD2F6 U+5486 # <cjk>
+0xD2F7 U+54C7 # <cjk>
+0xD2F8 U+54A2 # <cjk>
+0xD2F9 U+54B8 # <cjk>
+0xD2FA U+54A5 # <cjk>
+0xD2FB U+54AC # <cjk>
+0xD2FC U+54C4 # <cjk>
+0xD2FD U+54C8 # <cjk>
+0xD2FE U+54A8 # <cjk>
+0xD3A1 U+54AB # <cjk>
+0xD3A2 U+54C2 # <cjk>
+0xD3A3 U+54A4 # <cjk>
+0xD3A4 U+54BE # <cjk>
+0xD3A5 U+54BC # <cjk>
+0xD3A6 U+54D8 # <cjk>
+0xD3A7 U+54E5 # <cjk>
+0xD3A8 U+54E6 # <cjk>
+0xD3A9 U+550F # <cjk>
+0xD3AA U+5514 # <cjk>
+0xD3AB U+54FD # <cjk>
+0xD3AC U+54EE # <cjk>
+0xD3AD U+54ED # <cjk>
+0xD3AE U+54FA # <cjk>
+0xD3AF U+54E2 # <cjk>
+0xD3B0 U+5539 # <cjk>
+0xD3B1 U+5540 # <cjk>
+0xD3B2 U+5563 # <cjk>
+0xD3B3 U+554C # <cjk>
+0xD3B4 U+552E # <cjk>
+0xD3B5 U+555C # <cjk>
+0xD3B6 U+5545 # <cjk>
+0xD3B7 U+5556 # <cjk>
+0xD3B8 U+5557 # <cjk>
+0xD3B9 U+5538 # <cjk>
+0xD3BA U+5533 # <cjk>
+0xD3BB U+555D # <cjk>
+0xD3BC U+5599 # <cjk>
+0xD3BD U+5580 # <cjk>
+0xD3BE U+54AF # <cjk>
+0xD3BF U+558A # <cjk>
+0xD3C0 U+559F # <cjk>
+0xD3C1 U+557B # <cjk>
+0xD3C2 U+557E # <cjk>
+0xD3C3 U+5598 # <cjk>
+0xD3C4 U+559E # <cjk>
+0xD3C5 U+55AE # <cjk>
+0xD3C6 U+557C # <cjk>
+0xD3C7 U+5583 # <cjk>
+0xD3C8 U+55A9 # <cjk>
+0xD3C9 U+5587 # <cjk>
+0xD3CA U+55A8 # <cjk>
+0xD3CB U+55DA # <cjk>
+0xD3CC U+55C5 # <cjk>
+0xD3CD U+55DF # <cjk>
+0xD3CE U+55C4 # <cjk>
+0xD3CF U+55DC # <cjk>
+0xD3D0 U+55E4 # <cjk>
+0xD3D1 U+55D4 # <cjk>
+0xD3D2 U+5614 # <cjk>
+0xD3D3 U+55F7 # <cjk>
+0xD3D4 U+5616 # <cjk>
+0xD3D5 U+55FE # <cjk>
+0xD3D6 U+55FD # <cjk>
+0xD3D7 U+561B # <cjk>
+0xD3D8 U+55F9 # <cjk>
+0xD3D9 U+564E # <cjk>
+0xD3DA U+5650 # <cjk>
+0xD3DB U+71DF # <cjk>
+0xD3DC U+5634 # <cjk>
+0xD3DD U+5636 # <cjk>
+0xD3DE U+5632 # <cjk>
+0xD3DF U+5638 # <cjk>
+0xD3E0 U+566B # <cjk>
+0xD3E1 U+5664 # <cjk>
+0xD3E2 U+562F # <cjk>
+0xD3E3 U+566C # <cjk>
+0xD3E4 U+566A # <cjk>
+0xD3E5 U+5686 # <cjk>
+0xD3E6 U+5680 # <cjk>
+0xD3E7 U+568A # <cjk>
+0xD3E8 U+56A0 # <cjk>
+0xD3E9 U+5694 # <cjk>
+0xD3EA U+568F # <cjk>
+0xD3EB U+56A5 # <cjk>
+0xD3EC U+56AE # <cjk>
+0xD3ED U+56B6 # <cjk>
+0xD3EE U+56B4 # <cjk>
+0xD3EF U+56C2 # <cjk>
+0xD3F0 U+56BC # <cjk>
+0xD3F1 U+56C1 # <cjk>
+0xD3F2 U+56C3 # <cjk>
+0xD3F3 U+56C0 # <cjk>
+0xD3F4 U+56C8 # <cjk>
+0xD3F5 U+56CE # <cjk>
+0xD3F6 U+56D1 # <cjk>
+0xD3F7 U+56D3 # <cjk>
+0xD3F8 U+56D7 # <cjk>
+0xD3F9 U+56EE # <cjk>
+0xD3FA U+56F9 # <cjk>
+0xD3FB U+5700 # <cjk>
+0xD3FC U+56FF # <cjk>
+0xD3FD U+5704 # <cjk>
+0xD3FE U+5709 # <cjk>
+0xD4A1 U+5708 # <cjk>
+0xD4A2 U+570B # <cjk>
+0xD4A3 U+570D # <cjk>
+0xD4A4 U+5713 # <cjk>
+0xD4A5 U+5718 # <cjk>
+0xD4A6 U+5716 # <cjk>
+0xD4A7 U+55C7 # <cjk>
+0xD4A8 U+571C # <cjk>
+0xD4A9 U+5726 # <cjk>
+0xD4AA U+5737 # <cjk>
+0xD4AB U+5738 # <cjk>
+0xD4AC U+574E # <cjk>
+0xD4AD U+573B # <cjk>
+0xD4AE U+5740 # <cjk>
+0xD4AF U+574F # <cjk>
+0xD4B0 U+5769 # <cjk>
+0xD4B1 U+57C0 # <cjk>
+0xD4B2 U+5788 # <cjk>
+0xD4B3 U+5761 # <cjk>
+0xD4B4 U+577F # <cjk>
+0xD4B5 U+5789 # <cjk>
+0xD4B6 U+5793 # <cjk>
+0xD4B7 U+57A0 # <cjk>
+0xD4B8 U+57B3 # <cjk>
+0xD4B9 U+57A4 # <cjk>
+0xD4BA U+57AA # <cjk>
+0xD4BB U+57B0 # <cjk>
+0xD4BC U+57C3 # <cjk>
+0xD4BD U+57C6 # <cjk>
+0xD4BE U+57D4 # <cjk>
+0xD4BF U+57D2 # <cjk>
+0xD4C0 U+57D3 # <cjk>
+0xD4C1 U+580A # <cjk>
+0xD4C2 U+57D6 # <cjk>
+0xD4C3 U+57E3 # <cjk>
+0xD4C4 U+580B # <cjk>
+0xD4C5 U+5819 # <cjk>
+0xD4C6 U+581D # <cjk>
+0xD4C7 U+5872 # <cjk>
+0xD4C8 U+5821 # <cjk>
+0xD4C9 U+5862 # <cjk>
+0xD4CA U+584B # <cjk>
+0xD4CB U+5870 # <cjk>
+0xD4CC U+6BC0 # <cjk>
+0xD4CD U+5852 # <cjk>
+0xD4CE U+583D # <cjk>
+0xD4CF U+5879 # <cjk>
+0xD4D0 U+5885 # <cjk>
+0xD4D1 U+58B9 # <cjk>
+0xD4D2 U+589F # <cjk>
+0xD4D3 U+58AB # <cjk>
+0xD4D4 U+58BA # <cjk>
+0xD4D5 U+58DE # <cjk>
+0xD4D6 U+58BB # <cjk>
+0xD4D7 U+58B8 # <cjk>
+0xD4D8 U+58AE # <cjk>
+0xD4D9 U+58C5 # <cjk>
+0xD4DA U+58D3 # <cjk>
+0xD4DB U+58D1 # <cjk>
+0xD4DC U+58D7 # <cjk>
+0xD4DD U+58D9 # <cjk>
+0xD4DE U+58D8 # <cjk>
+0xD4DF U+58E5 # <cjk>
+0xD4E0 U+58DC # <cjk>
+0xD4E1 U+58E4 # <cjk>
+0xD4E2 U+58DF # <cjk>
+0xD4E3 U+58EF # <cjk>
+0xD4E4 U+58FA # <cjk>
+0xD4E5 U+58F9 # <cjk>
+0xD4E6 U+58FB # <cjk>
+0xD4E7 U+58FC # <cjk>
+0xD4E8 U+58FD # <cjk>
+0xD4E9 U+5902 # <cjk>
+0xD4EA U+590A # <cjk>
+0xD4EB U+5910 # <cjk>
+0xD4EC U+591B # <cjk>
+0xD4ED U+68A6 # <cjk>
+0xD4EE U+5925 # <cjk>
+0xD4EF U+592C # <cjk>
+0xD4F0 U+592D # <cjk>
+0xD4F1 U+5932 # <cjk>
+0xD4F2 U+5938 # <cjk>
+0xD4F3 U+593E # <cjk>
+0xD4F4 U+7AD2 # <cjk>
+0xD4F5 U+5955 # <cjk>
+0xD4F6 U+5950 # <cjk>
+0xD4F7 U+594E # <cjk>
+0xD4F8 U+595A # <cjk>
+0xD4F9 U+5958 # <cjk>
+0xD4FA U+5962 # <cjk>
+0xD4FB U+5960 # <cjk>
+0xD4FC U+5967 # <cjk>
+0xD4FD U+596C # <cjk>
+0xD4FE U+5969 # <cjk>
+0xD5A1 U+5978 # <cjk>
+0xD5A2 U+5981 # <cjk>
+0xD5A3 U+599D # <cjk>
+0xD5A4 U+4F5E # <cjk>
+0xD5A5 U+4FAB # <cjk>
+0xD5A6 U+59A3 # <cjk>
+0xD5A7 U+59B2 # <cjk>
+0xD5A8 U+59C6 # <cjk>
+0xD5A9 U+59E8 # <cjk>
+0xD5AA U+59DC # <cjk>
+0xD5AB U+598D # <cjk>
+0xD5AC U+59D9 # <cjk>
+0xD5AD U+59DA # <cjk>
+0xD5AE U+5A25 # <cjk>
+0xD5AF U+5A1F # <cjk>
+0xD5B0 U+5A11 # <cjk>
+0xD5B1 U+5A1C # <cjk>
+0xD5B2 U+5A09 # <cjk>
+0xD5B3 U+5A1A # <cjk>
+0xD5B4 U+5A40 # <cjk>
+0xD5B5 U+5A6C # <cjk>
+0xD5B6 U+5A49 # <cjk>
+0xD5B7 U+5A35 # <cjk>
+0xD5B8 U+5A36 # <cjk>
+0xD5B9 U+5A62 # <cjk>
+0xD5BA U+5A6A # <cjk>
+0xD5BB U+5A9A # <cjk>
+0xD5BC U+5ABC # <cjk>
+0xD5BD U+5ABE # <cjk>
+0xD5BE U+5ACB # <cjk>
+0xD5BF U+5AC2 # <cjk>
+0xD5C0 U+5ABD # <cjk>
+0xD5C1 U+5AE3 # <cjk>
+0xD5C2 U+5AD7 # <cjk>
+0xD5C3 U+5AE6 # <cjk>
+0xD5C4 U+5AE9 # <cjk>
+0xD5C5 U+5AD6 # <cjk>
+0xD5C6 U+5AFA # <cjk>
+0xD5C7 U+5AFB # <cjk>
+0xD5C8 U+5B0C # <cjk>
+0xD5C9 U+5B0B # <cjk>
+0xD5CA U+5B16 # <cjk>
+0xD5CB U+5B32 # <cjk>
+0xD5CC U+5AD0 # <cjk>
+0xD5CD U+5B2A # <cjk>
+0xD5CE U+5B36 # <cjk>
+0xD5CF U+5B3E # <cjk>
+0xD5D0 U+5B43 # <cjk>
+0xD5D1 U+5B45 # <cjk>
+0xD5D2 U+5B40 # <cjk>
+0xD5D3 U+5B51 # <cjk>
+0xD5D4 U+5B55 # <cjk>
+0xD5D5 U+5B5A # <cjk>
+0xD5D6 U+5B5B # <cjk>
+0xD5D7 U+5B65 # <cjk>
+0xD5D8 U+5B69 # <cjk>
+0xD5D9 U+5B70 # <cjk>
+0xD5DA U+5B73 # <cjk>
+0xD5DB U+5B75 # <cjk>
+0xD5DC U+5B78 # <cjk>
+0xD5DD U+6588 # <cjk>
+0xD5DE U+5B7A # <cjk>
+0xD5DF U+5B80 # <cjk>
+0xD5E0 U+5B83 # <cjk>
+0xD5E1 U+5BA6 # <cjk>
+0xD5E2 U+5BB8 # <cjk>
+0xD5E3 U+5BC3 # <cjk>
+0xD5E4 U+5BC7 # <cjk>
+0xD5E5 U+5BC9 # <cjk>
+0xD5E6 U+5BD4 # <cjk>
+0xD5E7 U+5BD0 # <cjk>
+0xD5E8 U+5BE4 # <cjk>
+0xD5E9 U+5BE6 # <cjk>
+0xD5EA U+5BE2 # <cjk>
+0xD5EB U+5BDE # <cjk>
+0xD5EC U+5BE5 # <cjk>
+0xD5ED U+5BEB # <cjk>
+0xD5EE U+5BF0 # <cjk>
+0xD5EF U+5BF6 # <cjk>
+0xD5F0 U+5BF3 # <cjk>
+0xD5F1 U+5C05 # <cjk>
+0xD5F2 U+5C07 # <cjk>
+0xD5F3 U+5C08 # <cjk>
+0xD5F4 U+5C0D # <cjk>
+0xD5F5 U+5C13 # <cjk>
+0xD5F6 U+5C20 # <cjk>
+0xD5F7 U+5C22 # <cjk>
+0xD5F8 U+5C28 # <cjk>
+0xD5F9 U+5C38 # <cjk>
+0xD5FA U+5C39 # <cjk>
+0xD5FB U+5C41 # <cjk>
+0xD5FC U+5C46 # <cjk>
+0xD5FD U+5C4E # <cjk>
+0xD5FE U+5C53 # <cjk>
+0xD6A1 U+5C50 # <cjk>
+0xD6A2 U+5C4F # <cjk>
+0xD6A3 U+5B71 # <cjk>
+0xD6A4 U+5C6C # <cjk>
+0xD6A5 U+5C6E # <cjk>
+0xD6A6 U+4E62 # <cjk>
+0xD6A7 U+5C76 # <cjk>
+0xD6A8 U+5C79 # <cjk>
+0xD6A9 U+5C8C # <cjk>
+0xD6AA U+5C91 # <cjk>
+0xD6AB U+5C94 # <cjk>
+0xD6AC U+599B # <cjk>
+0xD6AD U+5CAB # <cjk>
+0xD6AE U+5CBB # <cjk>
+0xD6AF U+5CB6 # <cjk>
+0xD6B0 U+5CBC # <cjk>
+0xD6B1 U+5CB7 # <cjk>
+0xD6B2 U+5CC5 # <cjk>
+0xD6B3 U+5CBE # <cjk>
+0xD6B4 U+5CC7 # <cjk>
+0xD6B5 U+5CD9 # <cjk>
+0xD6B6 U+5CE9 # <cjk>
+0xD6B7 U+5CFD # <cjk>
+0xD6B8 U+5CFA # <cjk>
+0xD6B9 U+5CED # <cjk>
+0xD6BA U+5D8C # <cjk>
+0xD6BB U+5CEA # <cjk>
+0xD6BC U+5D0B # <cjk>
+0xD6BD U+5D15 # <cjk>
+0xD6BE U+5D17 # <cjk>
+0xD6BF U+5D5C # <cjk>
+0xD6C0 U+5D1F # <cjk>
+0xD6C1 U+5D1B # <cjk>
+0xD6C2 U+5D11 # <cjk>
+0xD6C3 U+5D14 # <cjk>
+0xD6C4 U+5D22 # <cjk>
+0xD6C5 U+5D1A # <cjk>
+0xD6C6 U+5D19 # <cjk>
+0xD6C7 U+5D18 # <cjk>
+0xD6C8 U+5D4C # <cjk>
+0xD6C9 U+5D52 # <cjk>
+0xD6CA U+5D4E # <cjk>
+0xD6CB U+5D4B # <cjk>
+0xD6CC U+5D6C # <cjk>
+0xD6CD U+5D73 # <cjk>
+0xD6CE U+5D76 # <cjk>
+0xD6CF U+5D87 # <cjk>
+0xD6D0 U+5D84 # <cjk>
+0xD6D1 U+5D82 # <cjk>
+0xD6D2 U+5DA2 # <cjk>
+0xD6D3 U+5D9D # <cjk>
+0xD6D4 U+5DAC # <cjk>
+0xD6D5 U+5DAE # <cjk>
+0xD6D6 U+5DBD # <cjk>
+0xD6D7 U+5D90 # <cjk>
+0xD6D8 U+5DB7 # <cjk>
+0xD6D9 U+5DBC # <cjk>
+0xD6DA U+5DC9 # <cjk>
+0xD6DB U+5DCD # <cjk>
+0xD6DC U+5DD3 # <cjk>
+0xD6DD U+5DD2 # <cjk>
+0xD6DE U+5DD6 # <cjk>
+0xD6DF U+5DDB # <cjk>
+0xD6E0 U+5DEB # <cjk>
+0xD6E1 U+5DF2 # <cjk>
+0xD6E2 U+5DF5 # <cjk>
+0xD6E3 U+5E0B # <cjk>
+0xD6E4 U+5E1A # <cjk>
+0xD6E5 U+5E19 # <cjk>
+0xD6E6 U+5E11 # <cjk>
+0xD6E7 U+5E1B # <cjk>
+0xD6E8 U+5E36 # <cjk>
+0xD6E9 U+5E37 # <cjk>
+0xD6EA U+5E44 # <cjk>
+0xD6EB U+5E43 # <cjk>
+0xD6EC U+5E40 # <cjk>
+0xD6ED U+5E4E # <cjk>
+0xD6EE U+5E57 # <cjk>
+0xD6EF U+5E54 # <cjk>
+0xD6F0 U+5E5F # <cjk>
+0xD6F1 U+5E62 # <cjk>
+0xD6F2 U+5E64 # <cjk>
+0xD6F3 U+5E47 # <cjk>
+0xD6F4 U+5E75 # <cjk>
+0xD6F5 U+5E76 # <cjk>
+0xD6F6 U+5E7A # <cjk>
+0xD6F7 U+9EBC # <cjk>
+0xD6F8 U+5E7F # <cjk>
+0xD6F9 U+5EA0 # <cjk>
+0xD6FA U+5EC1 # <cjk>
+0xD6FB U+5EC2 # <cjk>
+0xD6FC U+5EC8 # <cjk>
+0xD6FD U+5ED0 # <cjk>
+0xD6FE U+5ECF # <cjk>
+0xD7A1 U+5ED6 # <cjk>
+0xD7A2 U+5EE3 # <cjk>
+0xD7A3 U+5EDD # <cjk>
+0xD7A4 U+5EDA # <cjk>
+0xD7A5 U+5EDB # <cjk>
+0xD7A6 U+5EE2 # <cjk>
+0xD7A7 U+5EE1 # <cjk>
+0xD7A8 U+5EE8 # <cjk>
+0xD7A9 U+5EE9 # <cjk>
+0xD7AA U+5EEC # <cjk>
+0xD7AB U+5EF1 # <cjk>
+0xD7AC U+5EF3 # <cjk>
+0xD7AD U+5EF0 # <cjk>
+0xD7AE U+5EF4 # <cjk>
+0xD7AF U+5EF8 # <cjk>
+0xD7B0 U+5EFE # <cjk>
+0xD7B1 U+5F03 # <cjk>
+0xD7B2 U+5F09 # <cjk>
+0xD7B3 U+5F5D # <cjk>
+0xD7B4 U+5F5C # <cjk>
+0xD7B5 U+5F0B # <cjk>
+0xD7B6 U+5F11 # <cjk>
+0xD7B7 U+5F16 # <cjk>
+0xD7B8 U+5F29 # <cjk>
+0xD7B9 U+5F2D # <cjk>
+0xD7BA U+5F38 # <cjk>
+0xD7BB U+5F41 # <cjk>
+0xD7BC U+5F48 # <cjk>
+0xD7BD U+5F4C # <cjk>
+0xD7BE U+5F4E # <cjk>
+0xD7BF U+5F2F # <cjk>
+0xD7C0 U+5F51 # <cjk>
+0xD7C1 U+5F56 # <cjk>
+0xD7C2 U+5F57 # <cjk>
+0xD7C3 U+5F59 # <cjk>
+0xD7C4 U+5F61 # <cjk>
+0xD7C5 U+5F6D # <cjk>
+0xD7C6 U+5F73 # <cjk>
+0xD7C7 U+5F77 # <cjk>
+0xD7C8 U+5F83 # <cjk>
+0xD7C9 U+5F82 # <cjk>
+0xD7CA U+5F7F # <cjk>
+0xD7CB U+5F8A # <cjk>
+0xD7CC U+5F88 # <cjk>
+0xD7CD U+5F91 # <cjk>
+0xD7CE U+5F87 # <cjk>
+0xD7CF U+5F9E # <cjk>
+0xD7D0 U+5F99 # <cjk>
+0xD7D1 U+5F98 # <cjk>
+0xD7D2 U+5FA0 # <cjk>
+0xD7D3 U+5FA8 # <cjk>
+0xD7D4 U+5FAD # <cjk>
+0xD7D5 U+5FBC # <cjk>
+0xD7D6 U+5FD6 # <cjk>
+0xD7D7 U+5FFB # <cjk>
+0xD7D8 U+5FE4 # <cjk>
+0xD7D9 U+5FF8 # <cjk>
+0xD7DA U+5FF1 # <cjk>
+0xD7DB U+5FDD # <cjk>
+0xD7DC U+60B3 # <cjk>
+0xD7DD U+5FFF # <cjk>
+0xD7DE U+6021 # <cjk>
+0xD7DF U+6060 # <cjk>
+0xD7E0 U+6019 # <cjk>
+0xD7E1 U+6010 # <cjk>
+0xD7E2 U+6029 # <cjk>
+0xD7E3 U+600E # <cjk>
+0xD7E4 U+6031 # <cjk>
+0xD7E5 U+601B # <cjk>
+0xD7E6 U+6015 # <cjk>
+0xD7E7 U+602B # <cjk>
+0xD7E8 U+6026 # <cjk>
+0xD7E9 U+600F # <cjk>
+0xD7EA U+603A # <cjk>
+0xD7EB U+605A # <cjk>
+0xD7EC U+6041 # <cjk>
+0xD7ED U+606A # <cjk>
+0xD7EE U+6077 # <cjk>
+0xD7EF U+605F # <cjk>
+0xD7F0 U+604A # <cjk>
+0xD7F1 U+6046 # <cjk>
+0xD7F2 U+604D # <cjk>
+0xD7F3 U+6063 # <cjk>
+0xD7F4 U+6043 # <cjk>
+0xD7F5 U+6064 # <cjk>
+0xD7F6 U+6042 # <cjk>
+0xD7F7 U+606C # <cjk>
+0xD7F8 U+606B # <cjk>
+0xD7F9 U+6059 # <cjk>
+0xD7FA U+6081 # <cjk>
+0xD7FB U+608D # <cjk>
+0xD7FC U+60E7 # <cjk>
+0xD7FD U+6083 # <cjk>
+0xD7FE U+609A # <cjk>
+0xD8A1 U+6084 # <cjk>
+0xD8A2 U+609B # <cjk>
+0xD8A3 U+6096 # <cjk>
+0xD8A4 U+6097 # <cjk>
+0xD8A5 U+6092 # <cjk>
+0xD8A6 U+60A7 # <cjk>
+0xD8A7 U+608B # <cjk>
+0xD8A8 U+60E1 # <cjk>
+0xD8A9 U+60B8 # <cjk>
+0xD8AA U+60E0 # <cjk>
+0xD8AB U+60D3 # <cjk>
+0xD8AC U+60B4 # <cjk>
+0xD8AD U+5FF0 # <cjk>
+0xD8AE U+60BD # <cjk>
+0xD8AF U+60C6 # <cjk>
+0xD8B0 U+60B5 # <cjk>
+0xD8B1 U+60D8 # <cjk>
+0xD8B2 U+614D # <cjk>
+0xD8B3 U+6115 # <cjk>
+0xD8B4 U+6106 # <cjk>
+0xD8B5 U+60F6 # <cjk>
+0xD8B6 U+60F7 # <cjk>
+0xD8B7 U+6100 # <cjk>
+0xD8B8 U+60F4 # <cjk>
+0xD8B9 U+60FA # <cjk>
+0xD8BA U+6103 # <cjk>
+0xD8BB U+6121 # <cjk>
+0xD8BC U+60FB # <cjk>
+0xD8BD U+60F1 # <cjk>
+0xD8BE U+610D # <cjk>
+0xD8BF U+610E # <cjk>
+0xD8C0 U+6147 # <cjk>
+0xD8C1 U+613E # <cjk>
+0xD8C2 U+6128 # <cjk>
+0xD8C3 U+6127 # <cjk>
+0xD8C4 U+614A # <cjk>
+0xD8C5 U+613F # <cjk>
+0xD8C6 U+613C # <cjk>
+0xD8C7 U+612C # <cjk>
+0xD8C8 U+6134 # <cjk>
+0xD8C9 U+613D # <cjk>
+0xD8CA U+6142 # <cjk>
+0xD8CB U+6144 # <cjk>
+0xD8CC U+6173 # <cjk>
+0xD8CD U+6177 # <cjk>
+0xD8CE U+6158 # <cjk>
+0xD8CF U+6159 # <cjk>
+0xD8D0 U+615A # <cjk>
+0xD8D1 U+616B # <cjk>
+0xD8D2 U+6174 # <cjk>
+0xD8D3 U+616F # <cjk>
+0xD8D4 U+6165 # <cjk>
+0xD8D5 U+6171 # <cjk>
+0xD8D6 U+615F # <cjk>
+0xD8D7 U+615D # <cjk>
+0xD8D8 U+6153 # <cjk>
+0xD8D9 U+6175 # <cjk>
+0xD8DA U+6199 # <cjk>
+0xD8DB U+6196 # <cjk>
+0xD8DC U+6187 # <cjk>
+0xD8DD U+61AC # <cjk>
+0xD8DE U+6194 # <cjk>
+0xD8DF U+619A # <cjk>
+0xD8E0 U+618A # <cjk>
+0xD8E1 U+6191 # <cjk>
+0xD8E2 U+61AB # <cjk>
+0xD8E3 U+61AE # <cjk>
+0xD8E4 U+61CC # <cjk>
+0xD8E5 U+61CA # <cjk>
+0xD8E6 U+61C9 # <cjk>
+0xD8E7 U+61F7 # <cjk>
+0xD8E8 U+61C8 # <cjk>
+0xD8E9 U+61C3 # <cjk>
+0xD8EA U+61C6 # <cjk>
+0xD8EB U+61BA # <cjk>
+0xD8EC U+61CB # <cjk>
+0xD8ED U+7F79 # <cjk>
+0xD8EE U+61CD # <cjk>
+0xD8EF U+61E6 # <cjk>
+0xD8F0 U+61E3 # <cjk>
+0xD8F1 U+61F6 # <cjk>
+0xD8F2 U+61FA # <cjk>
+0xD8F3 U+61F4 # <cjk>
+0xD8F4 U+61FF # <cjk>
+0xD8F5 U+61FD # <cjk>
+0xD8F6 U+61FC # <cjk>
+0xD8F7 U+61FE # <cjk>
+0xD8F8 U+6200 # <cjk>
+0xD8F9 U+6208 # <cjk>
+0xD8FA U+6209 # <cjk>
+0xD8FB U+620D # <cjk>
+0xD8FC U+620C # <cjk>
+0xD8FD U+6214 # <cjk>
+0xD8FE U+621B # <cjk>
+0xD9A1 U+621E # <cjk>
+0xD9A2 U+6221 # <cjk>
+0xD9A3 U+622A # <cjk>
+0xD9A4 U+622E # <cjk>
+0xD9A5 U+6230 # <cjk>
+0xD9A6 U+6232 # <cjk>
+0xD9A7 U+6233 # <cjk>
+0xD9A8 U+6241 # <cjk>
+0xD9A9 U+624E # <cjk>
+0xD9AA U+625E # <cjk>
+0xD9AB U+6263 # <cjk>
+0xD9AC U+625B # <cjk>
+0xD9AD U+6260 # <cjk>
+0xD9AE U+6268 # <cjk>
+0xD9AF U+627C # <cjk>
+0xD9B0 U+6282 # <cjk>
+0xD9B1 U+6289 # <cjk>
+0xD9B2 U+627E # <cjk>
+0xD9B3 U+6292 # <cjk>
+0xD9B4 U+6293 # <cjk>
+0xD9B5 U+6296 # <cjk>
+0xD9B6 U+62D4 # <cjk>
+0xD9B7 U+6283 # <cjk>
+0xD9B8 U+6294 # <cjk>
+0xD9B9 U+62D7 # <cjk>
+0xD9BA U+62D1 # <cjk>
+0xD9BB U+62BB # <cjk>
+0xD9BC U+62CF # <cjk>
+0xD9BD U+62FF # <cjk>
+0xD9BE U+62C6 # <cjk>
+0xD9BF U+64D4 # <cjk>
+0xD9C0 U+62C8 # <cjk>
+0xD9C1 U+62DC # <cjk>
+0xD9C2 U+62CC # <cjk>
+0xD9C3 U+62CA # <cjk>
+0xD9C4 U+62C2 # <cjk>
+0xD9C5 U+62C7 # <cjk>
+0xD9C6 U+629B # <cjk>
+0xD9C7 U+62C9 # <cjk>
+0xD9C8 U+630C # <cjk>
+0xD9C9 U+62EE # <cjk>
+0xD9CA U+62F1 # <cjk>
+0xD9CB U+6327 # <cjk>
+0xD9CC U+6302 # <cjk>
+0xD9CD U+6308 # <cjk>
+0xD9CE U+62EF # <cjk>
+0xD9CF U+62F5 # <cjk>
+0xD9D0 U+6350 # <cjk>
+0xD9D1 U+633E # <cjk>
+0xD9D2 U+634D # <cjk>
+0xD9D3 U+641C # <cjk>
+0xD9D4 U+634F # <cjk>
+0xD9D5 U+6396 # <cjk>
+0xD9D6 U+638E # <cjk>
+0xD9D7 U+6380 # <cjk>
+0xD9D8 U+63AB # <cjk>
+0xD9D9 U+6376 # <cjk>
+0xD9DA U+63A3 # <cjk>
+0xD9DB U+638F # <cjk>
+0xD9DC U+6389 # <cjk>
+0xD9DD U+639F # <cjk>
+0xD9DE U+63B5 # <cjk>
+0xD9DF U+636B # <cjk>
+0xD9E0 U+6369 # <cjk>
+0xD9E1 U+63BE # <cjk>
+0xD9E2 U+63E9 # <cjk>
+0xD9E3 U+63C0 # <cjk>
+0xD9E4 U+63C6 # <cjk>
+0xD9E5 U+63E3 # <cjk>
+0xD9E6 U+63C9 # <cjk>
+0xD9E7 U+63D2 # <cjk>
+0xD9E8 U+63F6 # <cjk>
+0xD9E9 U+63C4 # <cjk>
+0xD9EA U+6416 # <cjk>
+0xD9EB U+6434 # <cjk>
+0xD9EC U+6406 # <cjk>
+0xD9ED U+6413 # <cjk>
+0xD9EE U+6426 # <cjk>
+0xD9EF U+6436 # <cjk>
+0xD9F0 U+651D # <cjk>
+0xD9F1 U+6417 # <cjk>
+0xD9F2 U+6428 # <cjk>
+0xD9F3 U+640F # <cjk>
+0xD9F4 U+6467 # <cjk>
+0xD9F5 U+646F # <cjk>
+0xD9F6 U+6476 # <cjk>
+0xD9F7 U+644E # <cjk>
+0xD9F8 U+652A # <cjk>
+0xD9F9 U+6495 # <cjk>
+0xD9FA U+6493 # <cjk>
+0xD9FB U+64A5 # <cjk>
+0xD9FC U+64A9 # <cjk>
+0xD9FD U+6488 # <cjk>
+0xD9FE U+64BC # <cjk>
+0xDAA1 U+64DA # <cjk>
+0xDAA2 U+64D2 # <cjk>
+0xDAA3 U+64C5 # <cjk>
+0xDAA4 U+64C7 # <cjk>
+0xDAA5 U+64BB # <cjk>
+0xDAA6 U+64D8 # <cjk>
+0xDAA7 U+64C2 # <cjk>
+0xDAA8 U+64F1 # <cjk>
+0xDAA9 U+64E7 # <cjk>
+0xDAAA U+8209 # <cjk>
+0xDAAB U+64E0 # <cjk>
+0xDAAC U+64E1 # <cjk>
+0xDAAD U+62AC # <cjk>
+0xDAAE U+64E3 # <cjk>
+0xDAAF U+64EF # <cjk>
+0xDAB0 U+652C # <cjk>
+0xDAB1 U+64F6 # <cjk>
+0xDAB2 U+64F4 # <cjk>
+0xDAB3 U+64F2 # <cjk>
+0xDAB4 U+64FA # <cjk>
+0xDAB5 U+6500 # <cjk>
+0xDAB6 U+64FD # <cjk>
+0xDAB7 U+6518 # <cjk>
+0xDAB8 U+651C # <cjk>
+0xDAB9 U+6505 # <cjk>
+0xDABA U+6524 # <cjk>
+0xDABB U+6523 # <cjk>
+0xDABC U+652B # <cjk>
+0xDABD U+6534 # <cjk>
+0xDABE U+6535 # <cjk>
+0xDABF U+6537 # <cjk>
+0xDAC0 U+6536 # <cjk>
+0xDAC1 U+6538 # <cjk>
+0xDAC2 U+754B # <cjk>
+0xDAC3 U+6548 # <cjk>
+0xDAC4 U+6556 # <cjk>
+0xDAC5 U+6555 # <cjk>
+0xDAC6 U+654D # <cjk>
+0xDAC7 U+6558 # <cjk>
+0xDAC8 U+655E # <cjk>
+0xDAC9 U+655D # <cjk>
+0xDACA U+6572 # <cjk>
+0xDACB U+6578 # <cjk>
+0xDACC U+6582 # <cjk>
+0xDACD U+6583 # <cjk>
+0xDACE U+8B8A # <cjk>
+0xDACF U+659B # <cjk>
+0xDAD0 U+659F # <cjk>
+0xDAD1 U+65AB # <cjk>
+0xDAD2 U+65B7 # <cjk>
+0xDAD3 U+65C3 # <cjk>
+0xDAD4 U+65C6 # <cjk>
+0xDAD5 U+65C1 # <cjk>
+0xDAD6 U+65C4 # <cjk>
+0xDAD7 U+65CC # <cjk>
+0xDAD8 U+65D2 # <cjk>
+0xDAD9 U+65DB # <cjk>
+0xDADA U+65D9 # <cjk>
+0xDADB U+65E0 # <cjk>
+0xDADC U+65E1 # <cjk>
+0xDADD U+65F1 # <cjk>
+0xDADE U+6772 # <cjk>
+0xDADF U+660A # <cjk>
+0xDAE0 U+6603 # <cjk>
+0xDAE1 U+65FB # <cjk>
+0xDAE2 U+6773 # <cjk>
+0xDAE3 U+6635 # <cjk>
+0xDAE4 U+6636 # <cjk>
+0xDAE5 U+6634 # <cjk>
+0xDAE6 U+661C # <cjk>
+0xDAE7 U+664F # <cjk>
+0xDAE8 U+6644 # <cjk>
+0xDAE9 U+6649 # <cjk>
+0xDAEA U+6641 # <cjk>
+0xDAEB U+665E # <cjk>
+0xDAEC U+665D # <cjk>
+0xDAED U+6664 # <cjk>
+0xDAEE U+6667 # <cjk>
+0xDAEF U+6668 # <cjk>
+0xDAF0 U+665F # <cjk>
+0xDAF1 U+6662 # <cjk>
+0xDAF2 U+6670 # <cjk>
+0xDAF3 U+6683 # <cjk>
+0xDAF4 U+6688 # <cjk>
+0xDAF5 U+668E # <cjk>
+0xDAF6 U+6689 # <cjk>
+0xDAF7 U+6684 # <cjk>
+0xDAF8 U+6698 # <cjk>
+0xDAF9 U+669D # <cjk>
+0xDAFA U+66C1 # <cjk>
+0xDAFB U+66B9 # <cjk>
+0xDAFC U+66C9 # <cjk>
+0xDAFD U+66BE # <cjk>
+0xDAFE U+66BC # <cjk>
+0xDBA1 U+66C4 # <cjk>
+0xDBA2 U+66B8 # <cjk>
+0xDBA3 U+66D6 # <cjk>
+0xDBA4 U+66DA # <cjk>
+0xDBA5 U+66E0 # <cjk>
+0xDBA6 U+663F # <cjk>
+0xDBA7 U+66E6 # <cjk>
+0xDBA8 U+66E9 # <cjk>
+0xDBA9 U+66F0 # <cjk>
+0xDBAA U+66F5 # <cjk>
+0xDBAB U+66F7 # <cjk>
+0xDBAC U+670F # <cjk>
+0xDBAD U+6716 # <cjk>
+0xDBAE U+671E # <cjk>
+0xDBAF U+6726 # <cjk>
+0xDBB0 U+6727 # <cjk>
+0xDBB1 U+9738 # <cjk>
+0xDBB2 U+672E # <cjk>
+0xDBB3 U+673F # <cjk>
+0xDBB4 U+6736 # <cjk>
+0xDBB5 U+6741 # <cjk>
+0xDBB6 U+6738 # <cjk>
+0xDBB7 U+6737 # <cjk>
+0xDBB8 U+6746 # <cjk>
+0xDBB9 U+675E # <cjk>
+0xDBBA U+6760 # <cjk>
+0xDBBB U+6759 # <cjk>
+0xDBBC U+6763 # <cjk>
+0xDBBD U+6764 # <cjk>
+0xDBBE U+6789 # <cjk>
+0xDBBF U+6770 # <cjk>
+0xDBC0 U+67A9 # <cjk>
+0xDBC1 U+677C # <cjk>
+0xDBC2 U+676A # <cjk>
+0xDBC3 U+678C # <cjk>
+0xDBC4 U+678B # <cjk>
+0xDBC5 U+67A6 # <cjk>
+0xDBC6 U+67A1 # <cjk>
+0xDBC7 U+6785 # <cjk>
+0xDBC8 U+67B7 # <cjk>
+0xDBC9 U+67EF # <cjk>
+0xDBCA U+67B4 # <cjk>
+0xDBCB U+67EC # <cjk>
+0xDBCC U+67B3 # <cjk>
+0xDBCD U+67E9 # <cjk>
+0xDBCE U+67B8 # <cjk>
+0xDBCF U+67E4 # <cjk>
+0xDBD0 U+67DE # <cjk>
+0xDBD1 U+67DD # <cjk>
+0xDBD2 U+67E2 # <cjk>
+0xDBD3 U+67EE # <cjk>
+0xDBD4 U+67B9 # <cjk>
+0xDBD5 U+67CE # <cjk>
+0xDBD6 U+67C6 # <cjk>
+0xDBD7 U+67E7 # <cjk>
+0xDBD8 U+6A9C # <cjk>
+0xDBD9 U+681E # <cjk>
+0xDBDA U+6846 # <cjk>
+0xDBDB U+6829 # <cjk>
+0xDBDC U+6840 # <cjk>
+0xDBDD U+684D # <cjk>
+0xDBDE U+6832 # <cjk>
+0xDBDF U+684E # <cjk>
+0xDBE0 U+68B3 # <cjk>
+0xDBE1 U+682B # <cjk>
+0xDBE2 U+6859 # <cjk>
+0xDBE3 U+6863 # <cjk>
+0xDBE4 U+6877 # <cjk>
+0xDBE5 U+687F # <cjk>
+0xDBE6 U+689F # <cjk>
+0xDBE7 U+688F # <cjk>
+0xDBE8 U+68AD # <cjk>
+0xDBE9 U+6894 # <cjk>
+0xDBEA U+689D # <cjk>
+0xDBEB U+689B # <cjk>
+0xDBEC U+6883 # <cjk>
+0xDBED U+6AAE # <cjk>
+0xDBEE U+68B9 # <cjk>
+0xDBEF U+6874 # <cjk>
+0xDBF0 U+68B5 # <cjk>
+0xDBF1 U+68A0 # <cjk>
+0xDBF2 U+68BA # <cjk>
+0xDBF3 U+690F # <cjk>
+0xDBF4 U+688D # <cjk>
+0xDBF5 U+687E # <cjk>
+0xDBF6 U+6901 # <cjk>
+0xDBF7 U+68CA # <cjk>
+0xDBF8 U+6908 # <cjk>
+0xDBF9 U+68D8 # <cjk>
+0xDBFA U+6922 # <cjk>
+0xDBFB U+6926 # <cjk>
+0xDBFC U+68E1 # <cjk>
+0xDBFD U+690C # <cjk>
+0xDBFE U+68CD # <cjk>
+0xDCA1 U+68D4 # <cjk>
+0xDCA2 U+68E7 # <cjk>
+0xDCA3 U+68D5 # <cjk>
+0xDCA4 U+6936 # <cjk>
+0xDCA5 U+6912 # <cjk>
+0xDCA6 U+6904 # <cjk>
+0xDCA7 U+68D7 # <cjk>
+0xDCA8 U+68E3 # <cjk>
+0xDCA9 U+6925 # <cjk>
+0xDCAA U+68F9 # <cjk>
+0xDCAB U+68E0 # <cjk>
+0xDCAC U+68EF # <cjk>
+0xDCAD U+6928 # <cjk>
+0xDCAE U+692A # <cjk>
+0xDCAF U+691A # <cjk>
+0xDCB0 U+6923 # <cjk>
+0xDCB1 U+6921 # <cjk>
+0xDCB2 U+68C6 # <cjk>
+0xDCB3 U+6979 # <cjk>
+0xDCB4 U+6977 # <cjk>
+0xDCB5 U+695C # <cjk>
+0xDCB6 U+6978 # <cjk>
+0xDCB7 U+696B # <cjk>
+0xDCB8 U+6954 # <cjk>
+0xDCB9 U+697E # <cjk>
+0xDCBA U+696E # <cjk>
+0xDCBB U+6939 # <cjk>
+0xDCBC U+6974 # <cjk>
+0xDCBD U+693D # <cjk>
+0xDCBE U+6959 # <cjk>
+0xDCBF U+6930 # <cjk>
+0xDCC0 U+6961 # <cjk>
+0xDCC1 U+695E # <cjk>
+0xDCC2 U+695D # <cjk>
+0xDCC3 U+6981 # <cjk>
+0xDCC4 U+696A # <cjk>
+0xDCC5 U+69B2 # <cjk>
+0xDCC6 U+69AE # <cjk>
+0xDCC7 U+69D0 # <cjk>
+0xDCC8 U+69BF # <cjk>
+0xDCC9 U+69C1 # <cjk>
+0xDCCA U+69D3 # <cjk>
+0xDCCB U+69BE # <cjk>
+0xDCCC U+69CE # <cjk>
+0xDCCD U+5BE8 # <cjk>
+0xDCCE U+69CA # <cjk>
+0xDCCF U+69DD # <cjk>
+0xDCD0 U+69BB # <cjk>
+0xDCD1 U+69C3 # <cjk>
+0xDCD2 U+69A7 # <cjk>
+0xDCD3 U+6A2E # <cjk>
+0xDCD4 U+6991 # <cjk>
+0xDCD5 U+69A0 # <cjk>
+0xDCD6 U+699C # <cjk>
+0xDCD7 U+6995 # <cjk>
+0xDCD8 U+69B4 # <cjk>
+0xDCD9 U+69DE # <cjk>
+0xDCDA U+69E8 # <cjk>
+0xDCDB U+6A02 # <cjk>
+0xDCDC U+6A1B # <cjk>
+0xDCDD U+69FF # <cjk>
+0xDCDE U+6B0A # <cjk>
+0xDCDF U+69F9 # <cjk>
+0xDCE0 U+69F2 # <cjk>
+0xDCE1 U+69E7 # <cjk>
+0xDCE2 U+6A05 # <cjk>
+0xDCE3 U+69B1 # <cjk>
+0xDCE4 U+6A1E # <cjk>
+0xDCE5 U+69ED # <cjk>
+0xDCE6 U+6A14 # <cjk>
+0xDCE7 U+69EB # <cjk>
+0xDCE8 U+6A0A # <cjk>
+0xDCE9 U+6A12 # <cjk>
+0xDCEA U+6AC1 # <cjk>
+0xDCEB U+6A23 # <cjk>
+0xDCEC U+6A13 # <cjk>
+0xDCED U+6A44 # <cjk>
+0xDCEE U+6A0C # <cjk>
+0xDCEF U+6A72 # <cjk>
+0xDCF0 U+6A36 # <cjk>
+0xDCF1 U+6A78 # <cjk>
+0xDCF2 U+6A47 # <cjk>
+0xDCF3 U+6A62 # <cjk>
+0xDCF4 U+6A59 # <cjk>
+0xDCF5 U+6A66 # <cjk>
+0xDCF6 U+6A48 # <cjk>
+0xDCF7 U+6A38 # <cjk>
+0xDCF8 U+6A22 # <cjk>
+0xDCF9 U+6A90 # <cjk>
+0xDCFA U+6A8D # <cjk>
+0xDCFB U+6AA0 # <cjk>
+0xDCFC U+6A84 # <cjk>
+0xDCFD U+6AA2 # <cjk>
+0xDCFE U+6AA3 # <cjk>
+0xDDA1 U+6A97 # <cjk>
+0xDDA2 U+8617 # <cjk>
+0xDDA3 U+6ABB # <cjk>
+0xDDA4 U+6AC3 # <cjk>
+0xDDA5 U+6AC2 # <cjk>
+0xDDA6 U+6AB8 # <cjk>
+0xDDA7 U+6AB3 # <cjk>
+0xDDA8 U+6AAC # <cjk>
+0xDDA9 U+6ADE # <cjk>
+0xDDAA U+6AD1 # <cjk>
+0xDDAB U+6ADF # <cjk>
+0xDDAC U+6AAA # <cjk>
+0xDDAD U+6ADA # <cjk>
+0xDDAE U+6AEA # <cjk>
+0xDDAF U+6AFB # <cjk>
+0xDDB0 U+6B05 # <cjk>
+0xDDB1 U+8616 # <cjk>
+0xDDB2 U+6AFA # <cjk>
+0xDDB3 U+6B12 # <cjk>
+0xDDB4 U+6B16 # <cjk>
+0xDDB5 U+9B31 # <cjk>
+0xDDB6 U+6B1F # <cjk>
+0xDDB7 U+6B38 # <cjk>
+0xDDB8 U+6B37 # <cjk>
+0xDDB9 U+76DC # <cjk>
+0xDDBA U+6B39 # <cjk>
+0xDDBB U+98EE # <cjk>
+0xDDBC U+6B47 # <cjk>
+0xDDBD U+6B43 # <cjk>
+0xDDBE U+6B49 # <cjk>
+0xDDBF U+6B50 # <cjk>
+0xDDC0 U+6B59 # <cjk>
+0xDDC1 U+6B54 # <cjk>
+0xDDC2 U+6B5B # <cjk>
+0xDDC3 U+6B5F # <cjk>
+0xDDC4 U+6B61 # <cjk>
+0xDDC5 U+6B78 # <cjk>
+0xDDC6 U+6B79 # <cjk>
+0xDDC7 U+6B7F # <cjk>
+0xDDC8 U+6B80 # <cjk>
+0xDDC9 U+6B84 # <cjk>
+0xDDCA U+6B83 # <cjk>
+0xDDCB U+6B8D # <cjk>
+0xDDCC U+6B98 # <cjk>
+0xDDCD U+6B95 # <cjk>
+0xDDCE U+6B9E # <cjk>
+0xDDCF U+6BA4 # <cjk>
+0xDDD0 U+6BAA # <cjk>
+0xDDD1 U+6BAB # <cjk>
+0xDDD2 U+6BAF # <cjk>
+0xDDD3 U+6BB2 # <cjk>
+0xDDD4 U+6BB1 # <cjk>
+0xDDD5 U+6BB3 # <cjk>
+0xDDD6 U+6BB7 # <cjk>
+0xDDD7 U+6BBC # <cjk>
+0xDDD8 U+6BC6 # <cjk>
+0xDDD9 U+6BCB # <cjk>
+0xDDDA U+6BD3 # <cjk>
+0xDDDB U+6BDF # <cjk>
+0xDDDC U+6BEC # <cjk>
+0xDDDD U+6BEB # <cjk>
+0xDDDE U+6BF3 # <cjk>
+0xDDDF U+6BEF # <cjk>
+0xDDE0 U+9EBE # <cjk>
+0xDDE1 U+6C08 # <cjk>
+0xDDE2 U+6C13 # <cjk>
+0xDDE3 U+6C14 # <cjk>
+0xDDE4 U+6C1B # <cjk>
+0xDDE5 U+6C24 # <cjk>
+0xDDE6 U+6C23 # <cjk>
+0xDDE7 U+6C5E # <cjk>
+0xDDE8 U+6C55 # <cjk>
+0xDDE9 U+6C62 # <cjk>
+0xDDEA U+6C6A # <cjk>
+0xDDEB U+6C82 # <cjk>
+0xDDEC U+6C8D # <cjk>
+0xDDED U+6C9A # <cjk>
+0xDDEE U+6C81 # <cjk>
+0xDDEF U+6C9B # <cjk>
+0xDDF0 U+6C7E # <cjk>
+0xDDF1 U+6C68 # <cjk>
+0xDDF2 U+6C73 # <cjk>
+0xDDF3 U+6C92 # <cjk>
+0xDDF4 U+6C90 # <cjk>
+0xDDF5 U+6CC4 # <cjk>
+0xDDF6 U+6CF1 # <cjk>
+0xDDF7 U+6CD3 # <cjk>
+0xDDF8 U+6CBD # <cjk>
+0xDDF9 U+6CD7 # <cjk>
+0xDDFA U+6CC5 # <cjk>
+0xDDFB U+6CDD # <cjk>
+0xDDFC U+6CAE # <cjk>
+0xDDFD U+6CB1 # <cjk>
+0xDDFE U+6CBE # <cjk>
+0xDEA1 U+6CBA # <cjk>
+0xDEA2 U+6CDB # <cjk>
+0xDEA3 U+6CEF # <cjk>
+0xDEA4 U+6CD9 # <cjk>
+0xDEA5 U+6CEA # <cjk>
+0xDEA6 U+6D1F # <cjk>
+0xDEA7 U+884D # <cjk>
+0xDEA8 U+6D36 # <cjk>
+0xDEA9 U+6D2B # <cjk>
+0xDEAA U+6D3D # <cjk>
+0xDEAB U+6D38 # <cjk>
+0xDEAC U+6D19 # <cjk>
+0xDEAD U+6D35 # <cjk>
+0xDEAE U+6D33 # <cjk>
+0xDEAF U+6D12 # <cjk>
+0xDEB0 U+6D0C # <cjk>
+0xDEB1 U+6D63 # <cjk>
+0xDEB2 U+6D93 # <cjk>
+0xDEB3 U+6D64 # <cjk>
+0xDEB4 U+6D5A # <cjk>
+0xDEB5 U+6D79 # <cjk>
+0xDEB6 U+6D59 # <cjk>
+0xDEB7 U+6D8E # <cjk>
+0xDEB8 U+6D95 # <cjk>
+0xDEB9 U+6FE4 # <cjk>
+0xDEBA U+6D85 # <cjk>
+0xDEBB U+6DF9 # <cjk>
+0xDEBC U+6E15 # <cjk>
+0xDEBD U+6E0A # <cjk>
+0xDEBE U+6DB5 # <cjk>
+0xDEBF U+6DC7 # <cjk>
+0xDEC0 U+6DE6 # <cjk>
+0xDEC1 U+6DB8 # <cjk>
+0xDEC2 U+6DC6 # <cjk>
+0xDEC3 U+6DEC # <cjk>
+0xDEC4 U+6DDE # <cjk>
+0xDEC5 U+6DCC # <cjk>
+0xDEC6 U+6DE8 # <cjk>
+0xDEC7 U+6DD2 # <cjk>
+0xDEC8 U+6DC5 # <cjk>
+0xDEC9 U+6DFA # <cjk>
+0xDECA U+6DD9 # <cjk>
+0xDECB U+6DE4 # <cjk>
+0xDECC U+6DD5 # <cjk>
+0xDECD U+6DEA # <cjk>
+0xDECE U+6DEE # <cjk>
+0xDECF U+6E2D # <cjk>
+0xDED0 U+6E6E # <cjk>
+0xDED1 U+6E2E # <cjk>
+0xDED2 U+6E19 # <cjk>
+0xDED3 U+6E72 # <cjk>
+0xDED4 U+6E5F # <cjk>
+0xDED5 U+6E3E # <cjk>
+0xDED6 U+6E23 # <cjk>
+0xDED7 U+6E6B # <cjk>
+0xDED8 U+6E2B # <cjk>
+0xDED9 U+6E76 # <cjk>
+0xDEDA U+6E4D # <cjk>
+0xDEDB U+6E1F # <cjk>
+0xDEDC U+6E43 # <cjk>
+0xDEDD U+6E3A # <cjk>
+0xDEDE U+6E4E # <cjk>
+0xDEDF U+6E24 # <cjk>
+0xDEE0 U+6EFF # <cjk>
+0xDEE1 U+6E1D # <cjk>
+0xDEE2 U+6E38 # <cjk>
+0xDEE3 U+6E82 # <cjk>
+0xDEE4 U+6EAA # <cjk>
+0xDEE5 U+6E98 # <cjk>
+0xDEE6 U+6EC9 # <cjk>
+0xDEE7 U+6EB7 # <cjk>
+0xDEE8 U+6ED3 # <cjk>
+0xDEE9 U+6EBD # <cjk>
+0xDEEA U+6EAF # <cjk>
+0xDEEB U+6EC4 # <cjk>
+0xDEEC U+6EB2 # <cjk>
+0xDEED U+6ED4 # <cjk>
+0xDEEE U+6ED5 # <cjk>
+0xDEEF U+6E8F # <cjk>
+0xDEF0 U+6EA5 # <cjk>
+0xDEF1 U+6EC2 # <cjk>
+0xDEF2 U+6E9F # <cjk>
+0xDEF3 U+6F41 # <cjk>
+0xDEF4 U+6F11 # <cjk>
+0xDEF5 U+704C # <cjk>
+0xDEF6 U+6EEC # <cjk>
+0xDEF7 U+6EF8 # <cjk>
+0xDEF8 U+6EFE # <cjk>
+0xDEF9 U+6F3F # <cjk>
+0xDEFA U+6EF2 # <cjk>
+0xDEFB U+6F31 # <cjk>
+0xDEFC U+6EEF # <cjk>
+0xDEFD U+6F32 # <cjk>
+0xDEFE U+6ECC # <cjk>
+0xDFA1 U+6F3E # <cjk>
+0xDFA2 U+6F13 # <cjk>
+0xDFA3 U+6EF7 # <cjk>
+0xDFA4 U+6F86 # <cjk>
+0xDFA5 U+6F7A # <cjk>
+0xDFA6 U+6F78 # <cjk>
+0xDFA7 U+6F81 # <cjk>
+0xDFA8 U+6F80 # <cjk>
+0xDFA9 U+6F6F # <cjk>
+0xDFAA U+6F5B # <cjk>
+0xDFAB U+6FF3 # <cjk>
+0xDFAC U+6F6D # <cjk>
+0xDFAD U+6F82 # <cjk>
+0xDFAE U+6F7C # <cjk>
+0xDFAF U+6F58 # <cjk>
+0xDFB0 U+6F8E # <cjk>
+0xDFB1 U+6F91 # <cjk>
+0xDFB2 U+6FC2 # <cjk>
+0xDFB3 U+6F66 # <cjk>
+0xDFB4 U+6FB3 # <cjk>
+0xDFB5 U+6FA3 # <cjk>
+0xDFB6 U+6FA1 # <cjk>
+0xDFB7 U+6FA4 # <cjk>
+0xDFB8 U+6FB9 # <cjk>
+0xDFB9 U+6FC6 # <cjk>
+0xDFBA U+6FAA # <cjk>
+0xDFBB U+6FDF # <cjk>
+0xDFBC U+6FD5 # <cjk>
+0xDFBD U+6FEC # <cjk>
+0xDFBE U+6FD4 # <cjk>
+0xDFBF U+6FD8 # <cjk>
+0xDFC0 U+6FF1 # <cjk>
+0xDFC1 U+6FEE # <cjk>
+0xDFC2 U+6FDB # <cjk>
+0xDFC3 U+7009 # <cjk>
+0xDFC4 U+700B # <cjk>
+0xDFC5 U+6FFA # <cjk>
+0xDFC6 U+7011 # <cjk>
+0xDFC7 U+7001 # <cjk>
+0xDFC8 U+700F # <cjk>
+0xDFC9 U+6FFE # <cjk>
+0xDFCA U+701B # <cjk>
+0xDFCB U+701A # <cjk>
+0xDFCC U+6F74 # <cjk>
+0xDFCD U+701D # <cjk>
+0xDFCE U+7018 # <cjk>
+0xDFCF U+701F # <cjk>
+0xDFD0 U+7030 # <cjk>
+0xDFD1 U+703E # <cjk>
+0xDFD2 U+7032 # <cjk>
+0xDFD3 U+7051 # <cjk>
+0xDFD4 U+7063 # <cjk>
+0xDFD5 U+7099 # <cjk>
+0xDFD6 U+7092 # <cjk>
+0xDFD7 U+70AF # <cjk>
+0xDFD8 U+70F1 # <cjk>
+0xDFD9 U+70AC # <cjk>
+0xDFDA U+70B8 # <cjk>
+0xDFDB U+70B3 # <cjk>
+0xDFDC U+70AE # <cjk>
+0xDFDD U+70DF # <cjk>
+0xDFDE U+70CB # <cjk>
+0xDFDF U+70DD # <cjk>
+0xDFE0 U+70D9 # <cjk>
+0xDFE1 U+7109 # <cjk>
+0xDFE2 U+70FD # <cjk>
+0xDFE3 U+711C # <cjk>
+0xDFE4 U+7119 # <cjk>
+0xDFE5 U+7165 # <cjk>
+0xDFE6 U+7155 # <cjk>
+0xDFE7 U+7188 # <cjk>
+0xDFE8 U+7166 # <cjk>
+0xDFE9 U+7162 # <cjk>
+0xDFEA U+714C # <cjk>
+0xDFEB U+7156 # <cjk>
+0xDFEC U+716C # <cjk>
+0xDFED U+718F # <cjk>
+0xDFEE U+71FB # <cjk>
+0xDFEF U+7184 # <cjk>
+0xDFF0 U+7195 # <cjk>
+0xDFF1 U+71A8 # <cjk>
+0xDFF2 U+71AC # <cjk>
+0xDFF3 U+71D7 # <cjk>
+0xDFF4 U+71B9 # <cjk>
+0xDFF5 U+71BE # <cjk>
+0xDFF6 U+71D2 # <cjk>
+0xDFF7 U+71C9 # <cjk>
+0xDFF8 U+71D4 # <cjk>
+0xDFF9 U+71CE # <cjk>
+0xDFFA U+71E0 # <cjk>
+0xDFFB U+71EC # <cjk>
+0xDFFC U+71E7 # <cjk>
+0xDFFD U+71F5 # <cjk>
+0xDFFE U+71FC # <cjk>
+0xE0A1 U+71F9 # <cjk>
+0xE0A2 U+71FF # <cjk>
+0xE0A3 U+720D # <cjk>
+0xE0A4 U+7210 # <cjk>
+0xE0A5 U+721B # <cjk>
+0xE0A6 U+7228 # <cjk>
+0xE0A7 U+722D # <cjk>
+0xE0A8 U+722C # <cjk>
+0xE0A9 U+7230 # <cjk>
+0xE0AA U+7232 # <cjk>
+0xE0AB U+723B # <cjk>
+0xE0AC U+723C # <cjk>
+0xE0AD U+723F # <cjk>
+0xE0AE U+7240 # <cjk>
+0xE0AF U+7246 # <cjk>
+0xE0B0 U+724B # <cjk>
+0xE0B1 U+7258 # <cjk>
+0xE0B2 U+7274 # <cjk>
+0xE0B3 U+727E # <cjk>
+0xE0B4 U+7282 # <cjk>
+0xE0B5 U+7281 # <cjk>
+0xE0B6 U+7287 # <cjk>
+0xE0B7 U+7292 # <cjk>
+0xE0B8 U+7296 # <cjk>
+0xE0B9 U+72A2 # <cjk>
+0xE0BA U+72A7 # <cjk>
+0xE0BB U+72B9 # <cjk>
+0xE0BC U+72B2 # <cjk>
+0xE0BD U+72C3 # <cjk>
+0xE0BE U+72C6 # <cjk>
+0xE0BF U+72C4 # <cjk>
+0xE0C0 U+72CE # <cjk>
+0xE0C1 U+72D2 # <cjk>
+0xE0C2 U+72E2 # <cjk>
+0xE0C3 U+72E0 # <cjk>
+0xE0C4 U+72E1 # <cjk>
+0xE0C5 U+72F9 # <cjk>
+0xE0C6 U+72F7 # <cjk>
+0xE0C7 U+500F # <cjk>
+0xE0C8 U+7317 # <cjk>
+0xE0C9 U+730A # <cjk>
+0xE0CA U+731C # <cjk>
+0xE0CB U+7316 # <cjk>
+0xE0CC U+731D # <cjk>
+0xE0CD U+7334 # <cjk>
+0xE0CE U+732F # <cjk>
+0xE0CF U+7329 # <cjk>
+0xE0D0 U+7325 # <cjk>
+0xE0D1 U+733E # <cjk>
+0xE0D2 U+734E # <cjk>
+0xE0D3 U+734F # <cjk>
+0xE0D4 U+9ED8 # <cjk>
+0xE0D5 U+7357 # <cjk>
+0xE0D6 U+736A # <cjk>
+0xE0D7 U+7368 # <cjk>
+0xE0D8 U+7370 # <cjk>
+0xE0D9 U+7378 # <cjk>
+0xE0DA U+7375 # <cjk>
+0xE0DB U+737B # <cjk>
+0xE0DC U+737A # <cjk>
+0xE0DD U+73C8 # <cjk>
+0xE0DE U+73B3 # <cjk>
+0xE0DF U+73CE # <cjk>
+0xE0E0 U+73BB # <cjk>
+0xE0E1 U+73C0 # <cjk>
+0xE0E2 U+73E5 # <cjk>
+0xE0E3 U+73EE # <cjk>
+0xE0E4 U+73DE # <cjk>
+0xE0E5 U+74A2 # <cjk>
+0xE0E6 U+7405 # <cjk>
+0xE0E7 U+746F # <cjk>
+0xE0E8 U+7425 # <cjk>
+0xE0E9 U+73F8 # <cjk>
+0xE0EA U+7432 # <cjk>
+0xE0EB U+743A # <cjk>
+0xE0EC U+7455 # <cjk>
+0xE0ED U+743F # <cjk>
+0xE0EE U+745F # <cjk>
+0xE0EF U+7459 # <cjk>
+0xE0F0 U+7441 # <cjk>
+0xE0F1 U+745C # <cjk>
+0xE0F2 U+7469 # <cjk>
+0xE0F3 U+7470 # <cjk>
+0xE0F4 U+7463 # <cjk>
+0xE0F5 U+746A # <cjk>
+0xE0F6 U+7476 # <cjk>
+0xE0F7 U+747E # <cjk>
+0xE0F8 U+748B # <cjk>
+0xE0F9 U+749E # <cjk>
+0xE0FA U+74A7 # <cjk>
+0xE0FB U+74CA # <cjk>
+0xE0FC U+74CF # <cjk>
+0xE0FD U+74D4 # <cjk>
+0xE0FE U+73F1 # <cjk>
+0xE1A1 U+74E0 # <cjk>
+0xE1A2 U+74E3 # <cjk>
+0xE1A3 U+74E7 # <cjk>
+0xE1A4 U+74E9 # <cjk>
+0xE1A5 U+74EE # <cjk>
+0xE1A6 U+74F2 # <cjk>
+0xE1A7 U+74F0 # <cjk>
+0xE1A8 U+74F1 # <cjk>
+0xE1A9 U+74F8 # <cjk>
+0xE1AA U+74F7 # <cjk>
+0xE1AB U+7504 # <cjk>
+0xE1AC U+7503 # <cjk>
+0xE1AD U+7505 # <cjk>
+0xE1AE U+750C # <cjk>
+0xE1AF U+750E # <cjk>
+0xE1B0 U+750D # <cjk>
+0xE1B1 U+7515 # <cjk>
+0xE1B2 U+7513 # <cjk>
+0xE1B3 U+751E # <cjk>
+0xE1B4 U+7526 # <cjk>
+0xE1B5 U+752C # <cjk>
+0xE1B6 U+753C # <cjk>
+0xE1B7 U+7544 # <cjk>
+0xE1B8 U+754D # <cjk>
+0xE1B9 U+754A # <cjk>
+0xE1BA U+7549 # <cjk>
+0xE1BB U+755B # <cjk>
+0xE1BC U+7546 # <cjk>
+0xE1BD U+755A # <cjk>
+0xE1BE U+7569 # <cjk>
+0xE1BF U+7564 # <cjk>
+0xE1C0 U+7567 # <cjk>
+0xE1C1 U+756B # <cjk>
+0xE1C2 U+756D # <cjk>
+0xE1C3 U+7578 # <cjk>
+0xE1C4 U+7576 # <cjk>
+0xE1C5 U+7586 # <cjk>
+0xE1C6 U+7587 # <cjk>
+0xE1C7 U+7574 # <cjk>
+0xE1C8 U+758A # <cjk>
+0xE1C9 U+7589 # <cjk>
+0xE1CA U+7582 # <cjk>
+0xE1CB U+7594 # <cjk>
+0xE1CC U+759A # <cjk>
+0xE1CD U+759D # <cjk>
+0xE1CE U+75A5 # <cjk>
+0xE1CF U+75A3 # <cjk>
+0xE1D0 U+75C2 # <cjk>
+0xE1D1 U+75B3 # <cjk>
+0xE1D2 U+75C3 # <cjk>
+0xE1D3 U+75B5 # <cjk>
+0xE1D4 U+75BD # <cjk>
+0xE1D5 U+75B8 # <cjk>
+0xE1D6 U+75BC # <cjk>
+0xE1D7 U+75B1 # <cjk>
+0xE1D8 U+75CD # <cjk>
+0xE1D9 U+75CA # <cjk>
+0xE1DA U+75D2 # <cjk>
+0xE1DB U+75D9 # <cjk>
+0xE1DC U+75E3 # <cjk>
+0xE1DD U+75DE # <cjk>
+0xE1DE U+75FE # <cjk>
+0xE1DF U+75FF # <cjk>
+0xE1E0 U+75FC # <cjk>
+0xE1E1 U+7601 # <cjk>
+0xE1E2 U+75F0 # <cjk>
+0xE1E3 U+75FA # <cjk>
+0xE1E4 U+75F2 # <cjk>
+0xE1E5 U+75F3 # <cjk>
+0xE1E6 U+760B # <cjk>
+0xE1E7 U+760D # <cjk>
+0xE1E8 U+7609 # <cjk>
+0xE1E9 U+761F # <cjk>
+0xE1EA U+7627 # <cjk>
+0xE1EB U+7620 # <cjk>
+0xE1EC U+7621 # <cjk>
+0xE1ED U+7622 # <cjk>
+0xE1EE U+7624 # <cjk>
+0xE1EF U+7634 # <cjk>
+0xE1F0 U+7630 # <cjk>
+0xE1F1 U+763B # <cjk>
+0xE1F2 U+7647 # <cjk>
+0xE1F3 U+7648 # <cjk>
+0xE1F4 U+7646 # <cjk>
+0xE1F5 U+765C # <cjk>
+0xE1F6 U+7658 # <cjk>
+0xE1F7 U+7661 # <cjk>
+0xE1F8 U+7662 # <cjk>
+0xE1F9 U+7668 # <cjk>
+0xE1FA U+7669 # <cjk>
+0xE1FB U+766A # <cjk>
+0xE1FC U+7667 # <cjk>
+0xE1FD U+766C # <cjk>
+0xE1FE U+7670 # <cjk>
+0xE2A1 U+7672 # <cjk>
+0xE2A2 U+7676 # <cjk>
+0xE2A3 U+7678 # <cjk>
+0xE2A4 U+767C # <cjk>
+0xE2A5 U+7680 # <cjk>
+0xE2A6 U+7683 # <cjk>
+0xE2A7 U+7688 # <cjk>
+0xE2A8 U+768B # <cjk>
+0xE2A9 U+768E # <cjk>
+0xE2AA U+7696 # <cjk>
+0xE2AB U+7693 # <cjk>
+0xE2AC U+7699 # <cjk>
+0xE2AD U+769A # <cjk>
+0xE2AE U+76B0 # <cjk>
+0xE2AF U+76B4 # <cjk>
+0xE2B0 U+76B8 # <cjk>
+0xE2B1 U+76B9 # <cjk>
+0xE2B2 U+76BA # <cjk>
+0xE2B3 U+76C2 # <cjk>
+0xE2B4 U+76CD # <cjk>
+0xE2B5 U+76D6 # <cjk>
+0xE2B6 U+76D2 # <cjk>
+0xE2B7 U+76DE # <cjk>
+0xE2B8 U+76E1 # <cjk>
+0xE2B9 U+76E5 # <cjk>
+0xE2BA U+76E7 # <cjk>
+0xE2BB U+76EA # <cjk>
+0xE2BC U+862F # <cjk>
+0xE2BD U+76FB # <cjk>
+0xE2BE U+7708 # <cjk>
+0xE2BF U+7707 # <cjk>
+0xE2C0 U+7704 # <cjk>
+0xE2C1 U+7729 # <cjk>
+0xE2C2 U+7724 # <cjk>
+0xE2C3 U+771E # <cjk>
+0xE2C4 U+7725 # <cjk>
+0xE2C5 U+7726 # <cjk>
+0xE2C6 U+771B # <cjk>
+0xE2C7 U+7737 # <cjk>
+0xE2C8 U+7738 # <cjk>
+0xE2C9 U+7747 # <cjk>
+0xE2CA U+775A # <cjk>
+0xE2CB U+7768 # <cjk>
+0xE2CC U+776B # <cjk>
+0xE2CD U+775B # <cjk>
+0xE2CE U+7765 # <cjk>
+0xE2CF U+777F # <cjk>
+0xE2D0 U+777E # <cjk>
+0xE2D1 U+7779 # <cjk>
+0xE2D2 U+778E # <cjk>
+0xE2D3 U+778B # <cjk>
+0xE2D4 U+7791 # <cjk>
+0xE2D5 U+77A0 # <cjk>
+0xE2D6 U+779E # <cjk>
+0xE2D7 U+77B0 # <cjk>
+0xE2D8 U+77B6 # <cjk>
+0xE2D9 U+77B9 # <cjk>
+0xE2DA U+77BF # <cjk>
+0xE2DB U+77BC # <cjk>
+0xE2DC U+77BD # <cjk>
+0xE2DD U+77BB # <cjk>
+0xE2DE U+77C7 # <cjk>
+0xE2DF U+77CD # <cjk>
+0xE2E0 U+77D7 # <cjk>
+0xE2E1 U+77DA # <cjk>
+0xE2E2 U+77DC # <cjk>
+0xE2E3 U+77E3 # <cjk>
+0xE2E4 U+77EE # <cjk>
+0xE2E5 U+77FC # <cjk>
+0xE2E6 U+780C # <cjk>
+0xE2E7 U+7812 # <cjk>
+0xE2E8 U+7926 # <cjk>
+0xE2E9 U+7820 # <cjk>
+0xE2EA U+792A # <cjk>
+0xE2EB U+7845 # <cjk>
+0xE2EC U+788E # <cjk>
+0xE2ED U+7874 # <cjk>
+0xE2EE U+7886 # <cjk>
+0xE2EF U+787C # <cjk>
+0xE2F0 U+789A # <cjk>
+0xE2F1 U+788C # <cjk>
+0xE2F2 U+78A3 # <cjk>
+0xE2F3 U+78B5 # <cjk>
+0xE2F4 U+78AA # <cjk>
+0xE2F5 U+78AF # <cjk>
+0xE2F6 U+78D1 # <cjk>
+0xE2F7 U+78C6 # <cjk>
+0xE2F8 U+78CB # <cjk>
+0xE2F9 U+78D4 # <cjk>
+0xE2FA U+78BE # <cjk>
+0xE2FB U+78BC # <cjk>
+0xE2FC U+78C5 # <cjk>
+0xE2FD U+78CA # <cjk>
+0xE2FE U+78EC # <cjk>
+0xE3A1 U+78E7 # <cjk>
+0xE3A2 U+78DA # <cjk>
+0xE3A3 U+78FD # <cjk>
+0xE3A4 U+78F4 # <cjk>
+0xE3A5 U+7907 # <cjk>
+0xE3A6 U+7912 # <cjk>
+0xE3A7 U+7911 # <cjk>
+0xE3A8 U+7919 # <cjk>
+0xE3A9 U+792C # <cjk>
+0xE3AA U+792B # <cjk>
+0xE3AB U+7940 # <cjk>
+0xE3AC U+7960 # <cjk>
+0xE3AD U+7957 # <cjk>
+0xE3AE U+795F # <cjk>
+0xE3AF U+795A # <cjk>
+0xE3B0 U+7955 # <cjk>
+0xE3B1 U+7953 # <cjk>
+0xE3B2 U+797A # <cjk>
+0xE3B3 U+797F # <cjk>
+0xE3B4 U+798A # <cjk>
+0xE3B5 U+799D # <cjk>
+0xE3B6 U+79A7 # <cjk>
+0xE3B7 U+9F4B # <cjk>
+0xE3B8 U+79AA # <cjk>
+0xE3B9 U+79AE # <cjk>
+0xE3BA U+79B3 # <cjk>
+0xE3BB U+79B9 # <cjk>
+0xE3BC U+79BA # <cjk>
+0xE3BD U+79C9 # <cjk>
+0xE3BE U+79D5 # <cjk>
+0xE3BF U+79E7 # <cjk>
+0xE3C0 U+79EC # <cjk>
+0xE3C1 U+79E1 # <cjk>
+0xE3C2 U+79E3 # <cjk>
+0xE3C3 U+7A08 # <cjk>
+0xE3C4 U+7A0D # <cjk>
+0xE3C5 U+7A18 # <cjk>
+0xE3C6 U+7A19 # <cjk>
+0xE3C7 U+7A20 # <cjk>
+0xE3C8 U+7A1F # <cjk>
+0xE3C9 U+7980 # <cjk>
+0xE3CA U+7A31 # <cjk>
+0xE3CB U+7A3B # <cjk>
+0xE3CC U+7A3E # <cjk>
+0xE3CD U+7A37 # <cjk>
+0xE3CE U+7A43 # <cjk>
+0xE3CF U+7A57 # <cjk>
+0xE3D0 U+7A49 # <cjk>
+0xE3D1 U+7A61 # <cjk>
+0xE3D2 U+7A62 # <cjk>
+0xE3D3 U+7A69 # <cjk>
+0xE3D4 U+9F9D # <cjk>
+0xE3D5 U+7A70 # <cjk>
+0xE3D6 U+7A79 # <cjk>
+0xE3D7 U+7A7D # <cjk>
+0xE3D8 U+7A88 # <cjk>
+0xE3D9 U+7A97 # <cjk>
+0xE3DA U+7A95 # <cjk>
+0xE3DB U+7A98 # <cjk>
+0xE3DC U+7A96 # <cjk>
+0xE3DD U+7AA9 # <cjk>
+0xE3DE U+7AC8 # <cjk>
+0xE3DF U+7AB0 # <cjk>
+0xE3E0 U+7AB6 # <cjk>
+0xE3E1 U+7AC5 # <cjk>
+0xE3E2 U+7AC4 # <cjk>
+0xE3E3 U+7ABF # <cjk>
+0xE3E4 U+9083 # <cjk>
+0xE3E5 U+7AC7 # <cjk>
+0xE3E6 U+7ACA # <cjk>
+0xE3E7 U+7ACD # <cjk>
+0xE3E8 U+7ACF # <cjk>
+0xE3E9 U+7AD5 # <cjk>
+0xE3EA U+7AD3 # <cjk>
+0xE3EB U+7AD9 # <cjk>
+0xE3EC U+7ADA # <cjk>
+0xE3ED U+7ADD # <cjk>
+0xE3EE U+7AE1 # <cjk>
+0xE3EF U+7AE2 # <cjk>
+0xE3F0 U+7AE6 # <cjk>
+0xE3F1 U+7AED # <cjk>
+0xE3F2 U+7AF0 # <cjk>
+0xE3F3 U+7B02 # <cjk>
+0xE3F4 U+7B0F # <cjk>
+0xE3F5 U+7B0A # <cjk>
+0xE3F6 U+7B06 # <cjk>
+0xE3F7 U+7B33 # <cjk>
+0xE3F8 U+7B18 # <cjk>
+0xE3F9 U+7B19 # <cjk>
+0xE3FA U+7B1E # <cjk>
+0xE3FB U+7B35 # <cjk>
+0xE3FC U+7B28 # <cjk>
+0xE3FD U+7B36 # <cjk>
+0xE3FE U+7B50 # <cjk>
+0xE4A1 U+7B7A # <cjk>
+0xE4A2 U+7B04 # <cjk>
+0xE4A3 U+7B4D # <cjk>
+0xE4A4 U+7B0B # <cjk>
+0xE4A5 U+7B4C # <cjk>
+0xE4A6 U+7B45 # <cjk>
+0xE4A7 U+7B75 # <cjk>
+0xE4A8 U+7B65 # <cjk>
+0xE4A9 U+7B74 # <cjk>
+0xE4AA U+7B67 # <cjk>
+0xE4AB U+7B70 # <cjk>
+0xE4AC U+7B71 # <cjk>
+0xE4AD U+7B6C # <cjk>
+0xE4AE U+7B6E # <cjk>
+0xE4AF U+7B9D # <cjk>
+0xE4B0 U+7B98 # <cjk>
+0xE4B1 U+7B9F # <cjk>
+0xE4B2 U+7B8D # <cjk>
+0xE4B3 U+7B9C # <cjk>
+0xE4B4 U+7B9A # <cjk>
+0xE4B5 U+7B8B # <cjk>
+0xE4B6 U+7B92 # <cjk>
+0xE4B7 U+7B8F # <cjk>
+0xE4B8 U+7B5D # <cjk>
+0xE4B9 U+7B99 # <cjk>
+0xE4BA U+7BCB # <cjk>
+0xE4BB U+7BC1 # <cjk>
+0xE4BC U+7BCC # <cjk>
+0xE4BD U+7BCF # <cjk>
+0xE4BE U+7BB4 # <cjk>
+0xE4BF U+7BC6 # <cjk>
+0xE4C0 U+7BDD # <cjk>
+0xE4C1 U+7BE9 # <cjk>
+0xE4C2 U+7C11 # <cjk>
+0xE4C3 U+7C14 # <cjk>
+0xE4C4 U+7BE6 # <cjk>
+0xE4C5 U+7BE5 # <cjk>
+0xE4C6 U+7C60 # <cjk>
+0xE4C7 U+7C00 # <cjk>
+0xE4C8 U+7C07 # <cjk>
+0xE4C9 U+7C13 # <cjk>
+0xE4CA U+7BF3 # <cjk>
+0xE4CB U+7BF7 # <cjk>
+0xE4CC U+7C17 # <cjk>
+0xE4CD U+7C0D # <cjk>
+0xE4CE U+7BF6 # <cjk>
+0xE4CF U+7C23 # <cjk>
+0xE4D0 U+7C27 # <cjk>
+0xE4D1 U+7C2A # <cjk>
+0xE4D2 U+7C1F # <cjk>
+0xE4D3 U+7C37 # <cjk>
+0xE4D4 U+7C2B # <cjk>
+0xE4D5 U+7C3D # <cjk>
+0xE4D6 U+7C4C # <cjk>
+0xE4D7 U+7C43 # <cjk>
+0xE4D8 U+7C54 # <cjk>
+0xE4D9 U+7C4F # <cjk>
+0xE4DA U+7C40 # <cjk>
+0xE4DB U+7C50 # <cjk>
+0xE4DC U+7C58 # <cjk>
+0xE4DD U+7C5F # <cjk>
+0xE4DE U+7C64 # <cjk>
+0xE4DF U+7C56 # <cjk>
+0xE4E0 U+7C65 # <cjk>
+0xE4E1 U+7C6C # <cjk>
+0xE4E2 U+7C75 # <cjk>
+0xE4E3 U+7C83 # <cjk>
+0xE4E4 U+7C90 # <cjk>
+0xE4E5 U+7CA4 # <cjk>
+0xE4E6 U+7CAD # <cjk>
+0xE4E7 U+7CA2 # <cjk>
+0xE4E8 U+7CAB # <cjk>
+0xE4E9 U+7CA1 # <cjk>
+0xE4EA U+7CA8 # <cjk>
+0xE4EB U+7CB3 # <cjk>
+0xE4EC U+7CB2 # <cjk>
+0xE4ED U+7CB1 # <cjk>
+0xE4EE U+7CAE # <cjk>
+0xE4EF U+7CB9 # <cjk>
+0xE4F0 U+7CBD # <cjk>
+0xE4F1 U+7CC0 # <cjk>
+0xE4F2 U+7CC5 # <cjk>
+0xE4F3 U+7CC2 # <cjk>
+0xE4F4 U+7CD8 # <cjk>
+0xE4F5 U+7CD2 # <cjk>
+0xE4F6 U+7CDC # <cjk>
+0xE4F7 U+7CE2 # <cjk>
+0xE4F8 U+9B3B # <cjk>
+0xE4F9 U+7CEF # <cjk>
+0xE4FA U+7CF2 # <cjk>
+0xE4FB U+7CF4 # <cjk>
+0xE4FC U+7CF6 # <cjk>
+0xE4FD U+7CFA # <cjk>
+0xE4FE U+7D06 # <cjk>
+0xE5A1 U+7D02 # <cjk>
+0xE5A2 U+7D1C # <cjk>
+0xE5A3 U+7D15 # <cjk>
+0xE5A4 U+7D0A # <cjk>
+0xE5A5 U+7D45 # <cjk>
+0xE5A6 U+7D4B # <cjk>
+0xE5A7 U+7D2E # <cjk>
+0xE5A8 U+7D32 # <cjk>
+0xE5A9 U+7D3F # <cjk>
+0xE5AA U+7D35 # <cjk>
+0xE5AB U+7D46 # <cjk>
+0xE5AC U+7D73 # <cjk>
+0xE5AD U+7D56 # <cjk>
+0xE5AE U+7D4E # <cjk>
+0xE5AF U+7D72 # <cjk>
+0xE5B0 U+7D68 # <cjk>
+0xE5B1 U+7D6E # <cjk>
+0xE5B2 U+7D4F # <cjk>
+0xE5B3 U+7D63 # <cjk>
+0xE5B4 U+7D93 # <cjk>
+0xE5B5 U+7D89 # <cjk>
+0xE5B6 U+7D5B # <cjk>
+0xE5B7 U+7D8F # <cjk>
+0xE5B8 U+7D7D # <cjk>
+0xE5B9 U+7D9B # <cjk>
+0xE5BA U+7DBA # <cjk>
+0xE5BB U+7DAE # <cjk>
+0xE5BC U+7DA3 # <cjk>
+0xE5BD U+7DB5 # <cjk>
+0xE5BE U+7DC7 # <cjk>
+0xE5BF U+7DBD # <cjk>
+0xE5C0 U+7DAB # <cjk>
+0xE5C1 U+7E3D # <cjk>
+0xE5C2 U+7DA2 # <cjk>
+0xE5C3 U+7DAF # <cjk>
+0xE5C4 U+7DDC # <cjk>
+0xE5C5 U+7DB8 # <cjk>
+0xE5C6 U+7D9F # <cjk>
+0xE5C7 U+7DB0 # <cjk>
+0xE5C8 U+7DD8 # <cjk>
+0xE5C9 U+7DDD # <cjk>
+0xE5CA U+7DE4 # <cjk>
+0xE5CB U+7DDE # <cjk>
+0xE5CC U+7DFB # <cjk>
+0xE5CD U+7DF2 # <cjk>
+0xE5CE U+7DE1 # <cjk>
+0xE5CF U+7E05 # <cjk>
+0xE5D0 U+7E0A # <cjk>
+0xE5D1 U+7E23 # <cjk>
+0xE5D2 U+7E21 # <cjk>
+0xE5D3 U+7E12 # <cjk>
+0xE5D4 U+7E31 # <cjk>
+0xE5D5 U+7E1F # <cjk>
+0xE5D6 U+7E09 # <cjk>
+0xE5D7 U+7E0B # <cjk>
+0xE5D8 U+7E22 # <cjk>
+0xE5D9 U+7E46 # <cjk>
+0xE5DA U+7E66 # <cjk>
+0xE5DB U+7E3B # <cjk>
+0xE5DC U+7E35 # <cjk>
+0xE5DD U+7E39 # <cjk>
+0xE5DE U+7E43 # <cjk>
+0xE5DF U+7E37 # <cjk>
+0xE5E0 U+7E32 # <cjk>
+0xE5E1 U+7E3A # <cjk>
+0xE5E2 U+7E67 # <cjk>
+0xE5E3 U+7E5D # <cjk>
+0xE5E4 U+7E56 # <cjk>
+0xE5E5 U+7E5E # <cjk>
+0xE5E6 U+7E59 # <cjk>
+0xE5E7 U+7E5A # <cjk>
+0xE5E8 U+7E79 # <cjk>
+0xE5E9 U+7E6A # <cjk>
+0xE5EA U+7E69 # <cjk>
+0xE5EB U+7E7C # <cjk>
+0xE5EC U+7E7B # <cjk>
+0xE5ED U+7E83 # <cjk>
+0xE5EE U+7DD5 # <cjk>
+0xE5EF U+7E7D # <cjk>
+0xE5F0 U+8FAE # <cjk>
+0xE5F1 U+7E7F # <cjk>
+0xE5F2 U+7E88 # <cjk>
+0xE5F3 U+7E89 # <cjk>
+0xE5F4 U+7E8C # <cjk>
+0xE5F5 U+7E92 # <cjk>
+0xE5F6 U+7E90 # <cjk>
+0xE5F7 U+7E93 # <cjk>
+0xE5F8 U+7E94 # <cjk>
+0xE5F9 U+7E96 # <cjk>
+0xE5FA U+7E8E # <cjk>
+0xE5FB U+7E9B # <cjk>
+0xE5FC U+7E9C # <cjk>
+0xE5FD U+7F38 # <cjk>
+0xE5FE U+7F3A # <cjk>
+0xE6A1 U+7F45 # <cjk>
+0xE6A2 U+7F4C # <cjk>
+0xE6A3 U+7F4D # <cjk>
+0xE6A4 U+7F4E # <cjk>
+0xE6A5 U+7F50 # <cjk>
+0xE6A6 U+7F51 # <cjk>
+0xE6A7 U+7F55 # <cjk>
+0xE6A8 U+7F54 # <cjk>
+0xE6A9 U+7F58 # <cjk>
+0xE6AA U+7F5F # <cjk>
+0xE6AB U+7F60 # <cjk>
+0xE6AC U+7F68 # <cjk>
+0xE6AD U+7F69 # <cjk>
+0xE6AE U+7F67 # <cjk>
+0xE6AF U+7F78 # <cjk>
+0xE6B0 U+7F82 # <cjk>
+0xE6B1 U+7F86 # <cjk>
+0xE6B2 U+7F83 # <cjk>
+0xE6B3 U+7F88 # <cjk>
+0xE6B4 U+7F87 # <cjk>
+0xE6B5 U+7F8C # <cjk>
+0xE6B6 U+7F94 # <cjk>
+0xE6B7 U+7F9E # <cjk>
+0xE6B8 U+7F9D # <cjk>
+0xE6B9 U+7F9A # <cjk>
+0xE6BA U+7FA3 # <cjk>
+0xE6BB U+7FAF # <cjk>
+0xE6BC U+7FB2 # <cjk>
+0xE6BD U+7FB9 # <cjk>
+0xE6BE U+7FAE # <cjk>
+0xE6BF U+7FB6 # <cjk>
+0xE6C0 U+7FB8 # <cjk>
+0xE6C1 U+8B71 # <cjk>
+0xE6C2 U+7FC5 # <cjk>
+0xE6C3 U+7FC6 # <cjk>
+0xE6C4 U+7FCA # <cjk>
+0xE6C5 U+7FD5 # <cjk>
+0xE6C6 U+7FD4 # <cjk>
+0xE6C7 U+7FE1 # <cjk>
+0xE6C8 U+7FE6 # <cjk>
+0xE6C9 U+7FE9 # <cjk>
+0xE6CA U+7FF3 # <cjk>
+0xE6CB U+7FF9 # <cjk>
+0xE6CC U+98DC # <cjk>
+0xE6CD U+8006 # <cjk>
+0xE6CE U+8004 # <cjk>
+0xE6CF U+800B # <cjk>
+0xE6D0 U+8012 # <cjk>
+0xE6D1 U+8018 # <cjk>
+0xE6D2 U+8019 # <cjk>
+0xE6D3 U+801C # <cjk>
+0xE6D4 U+8021 # <cjk>
+0xE6D5 U+8028 # <cjk>
+0xE6D6 U+803F # <cjk>
+0xE6D7 U+803B # <cjk>
+0xE6D8 U+804A # <cjk>
+0xE6D9 U+8046 # <cjk>
+0xE6DA U+8052 # <cjk>
+0xE6DB U+8058 # <cjk>
+0xE6DC U+805A # <cjk>
+0xE6DD U+805F # <cjk>
+0xE6DE U+8062 # <cjk>
+0xE6DF U+8068 # <cjk>
+0xE6E0 U+8073 # <cjk>
+0xE6E1 U+8072 # <cjk>
+0xE6E2 U+8070 # <cjk>
+0xE6E3 U+8076 # <cjk>
+0xE6E4 U+8079 # <cjk>
+0xE6E5 U+807D # <cjk>
+0xE6E6 U+807F # <cjk>
+0xE6E7 U+8084 # <cjk>
+0xE6E8 U+8086 # <cjk>
+0xE6E9 U+8085 # <cjk>
+0xE6EA U+809B # <cjk>
+0xE6EB U+8093 # <cjk>
+0xE6EC U+809A # <cjk>
+0xE6ED U+80AD # <cjk>
+0xE6EE U+5190 # <cjk>
+0xE6EF U+80AC # <cjk>
+0xE6F0 U+80DB # <cjk>
+0xE6F1 U+80E5 # <cjk>
+0xE6F2 U+80D9 # <cjk>
+0xE6F3 U+80DD # <cjk>
+0xE6F4 U+80C4 # <cjk>
+0xE6F5 U+80DA # <cjk>
+0xE6F6 U+80D6 # <cjk>
+0xE6F7 U+8109 # <cjk>
+0xE6F8 U+80EF # <cjk>
+0xE6F9 U+80F1 # <cjk>
+0xE6FA U+811B # <cjk>
+0xE6FB U+8129 # <cjk>
+0xE6FC U+8123 # <cjk>
+0xE6FD U+812F # <cjk>
+0xE6FE U+814B # <cjk>
+0xE7A1 U+968B # <cjk>
+0xE7A2 U+8146 # <cjk>
+0xE7A3 U+813E # <cjk>
+0xE7A4 U+8153 # <cjk>
+0xE7A5 U+8151 # <cjk>
+0xE7A6 U+80FC # <cjk>
+0xE7A7 U+8171 # <cjk>
+0xE7A8 U+816E # <cjk>
+0xE7A9 U+8165 # <cjk>
+0xE7AA U+8166 # <cjk>
+0xE7AB U+8174 # <cjk>
+0xE7AC U+8183 # <cjk>
+0xE7AD U+8188 # <cjk>
+0xE7AE U+818A # <cjk>
+0xE7AF U+8180 # <cjk>
+0xE7B0 U+8182 # <cjk>
+0xE7B1 U+81A0 # <cjk>
+0xE7B2 U+8195 # <cjk>
+0xE7B3 U+81A4 # <cjk>
+0xE7B4 U+81A3 # <cjk>
+0xE7B5 U+815F # <cjk>
+0xE7B6 U+8193 # <cjk>
+0xE7B7 U+81A9 # <cjk>
+0xE7B8 U+81B0 # <cjk>
+0xE7B9 U+81B5 # <cjk>
+0xE7BA U+81BE # <cjk>
+0xE7BB U+81B8 # <cjk>
+0xE7BC U+81BD # <cjk>
+0xE7BD U+81C0 # <cjk>
+0xE7BE U+81C2 # <cjk>
+0xE7BF U+81BA # <cjk>
+0xE7C0 U+81C9 # <cjk>
+0xE7C1 U+81CD # <cjk>
+0xE7C2 U+81D1 # <cjk>
+0xE7C3 U+81D9 # <cjk>
+0xE7C4 U+81D8 # <cjk>
+0xE7C5 U+81C8 # <cjk>
+0xE7C6 U+81DA # <cjk>
+0xE7C7 U+81DF # <cjk>
+0xE7C8 U+81E0 # <cjk>
+0xE7C9 U+81E7 # <cjk>
+0xE7CA U+81FA # <cjk>
+0xE7CB U+81FB # <cjk>
+0xE7CC U+81FE # <cjk>
+0xE7CD U+8201 # <cjk>
+0xE7CE U+8202 # <cjk>
+0xE7CF U+8205 # <cjk>
+0xE7D0 U+8207 # <cjk>
+0xE7D1 U+820A # <cjk>
+0xE7D2 U+820D # <cjk>
+0xE7D3 U+8210 # <cjk>
+0xE7D4 U+8216 # <cjk>
+0xE7D5 U+8229 # <cjk>
+0xE7D6 U+822B # <cjk>
+0xE7D7 U+8238 # <cjk>
+0xE7D8 U+8233 # <cjk>
+0xE7D9 U+8240 # <cjk>
+0xE7DA U+8259 # <cjk>
+0xE7DB U+8258 # <cjk>
+0xE7DC U+825D # <cjk>
+0xE7DD U+825A # <cjk>
+0xE7DE U+825F # <cjk>
+0xE7DF U+8264 # <cjk>
+0xE7E0 U+8262 # <cjk>
+0xE7E1 U+8268 # <cjk>
+0xE7E2 U+826A # <cjk>
+0xE7E3 U+826B # <cjk>
+0xE7E4 U+822E # <cjk>
+0xE7E5 U+8271 # <cjk>
+0xE7E6 U+8277 # <cjk>
+0xE7E7 U+8278 # <cjk>
+0xE7E8 U+827E # <cjk>
+0xE7E9 U+828D # <cjk>
+0xE7EA U+8292 # <cjk>
+0xE7EB U+82AB # <cjk>
+0xE7EC U+829F # <cjk>
+0xE7ED U+82BB # <cjk>
+0xE7EE U+82AC # <cjk>
+0xE7EF U+82E1 # <cjk>
+0xE7F0 U+82E3 # <cjk>
+0xE7F1 U+82DF # <cjk>
+0xE7F2 U+82D2 # <cjk>
+0xE7F3 U+82F4 # <cjk>
+0xE7F4 U+82F3 # <cjk>
+0xE7F5 U+82FA # <cjk>
+0xE7F6 U+8393 # <cjk>
+0xE7F7 U+8303 # <cjk>
+0xE7F8 U+82FB # <cjk>
+0xE7F9 U+82F9 # <cjk>
+0xE7FA U+82DE # <cjk>
+0xE7FB U+8306 # <cjk>
+0xE7FC U+82DC # <cjk>
+0xE7FD U+8309 # <cjk>
+0xE7FE U+82D9 # <cjk>
+0xE8A1 U+8335 # <cjk>
+0xE8A2 U+8334 # <cjk>
+0xE8A3 U+8316 # <cjk>
+0xE8A4 U+8332 # <cjk>
+0xE8A5 U+8331 # <cjk>
+0xE8A6 U+8340 # <cjk>
+0xE8A7 U+8339 # <cjk>
+0xE8A8 U+8350 # <cjk>
+0xE8A9 U+8345 # <cjk>
+0xE8AA U+832F # <cjk>
+0xE8AB U+832B # <cjk>
+0xE8AC U+8317 # <cjk>
+0xE8AD U+8318 # <cjk>
+0xE8AE U+8385 # <cjk>
+0xE8AF U+839A # <cjk>
+0xE8B0 U+83AA # <cjk>
+0xE8B1 U+839F # <cjk>
+0xE8B2 U+83A2 # <cjk>
+0xE8B3 U+8396 # <cjk>
+0xE8B4 U+8323 # <cjk>
+0xE8B5 U+838E # <cjk>
+0xE8B6 U+8387 # <cjk>
+0xE8B7 U+838A # <cjk>
+0xE8B8 U+837C # <cjk>
+0xE8B9 U+83B5 # <cjk>
+0xE8BA U+8373 # <cjk>
+0xE8BB U+8375 # <cjk>
+0xE8BC U+83A0 # <cjk>
+0xE8BD U+8389 # <cjk>
+0xE8BE U+83A8 # <cjk>
+0xE8BF U+83F4 # <cjk>
+0xE8C0 U+8413 # <cjk>
+0xE8C1 U+83EB # <cjk>
+0xE8C2 U+83CE # <cjk>
+0xE8C3 U+83FD # <cjk>
+0xE8C4 U+8403 # <cjk>
+0xE8C5 U+83D8 # <cjk>
+0xE8C6 U+840B # <cjk>
+0xE8C7 U+83C1 # <cjk>
+0xE8C8 U+83F7 # <cjk>
+0xE8C9 U+8407 # <cjk>
+0xE8CA U+83E0 # <cjk>
+0xE8CB U+83F2 # <cjk>
+0xE8CC U+840D # <cjk>
+0xE8CD U+8422 # <cjk>
+0xE8CE U+8420 # <cjk>
+0xE8CF U+83BD # <cjk>
+0xE8D0 U+8438 # <cjk>
+0xE8D1 U+8506 # <cjk>
+0xE8D2 U+83FB # <cjk>
+0xE8D3 U+846D # <cjk>
+0xE8D4 U+842A # <cjk>
+0xE8D5 U+843C # <cjk>
+0xE8D6 U+855A # <cjk>
+0xE8D7 U+8484 # <cjk>
+0xE8D8 U+8477 # <cjk>
+0xE8D9 U+846B # <cjk>
+0xE8DA U+84AD # <cjk>
+0xE8DB U+846E # <cjk>
+0xE8DC U+8482 # <cjk>
+0xE8DD U+8469 # <cjk>
+0xE8DE U+8446 # <cjk>
+0xE8DF U+842C # <cjk>
+0xE8E0 U+846F # <cjk>
+0xE8E1 U+8479 # <cjk>
+0xE8E2 U+8435 # <cjk>
+0xE8E3 U+84CA # <cjk>
+0xE8E4 U+8462 # <cjk>
+0xE8E5 U+84B9 # <cjk>
+0xE8E6 U+84BF # <cjk>
+0xE8E7 U+849F # <cjk>
+0xE8E8 U+84D9 # <cjk>
+0xE8E9 U+84CD # <cjk>
+0xE8EA U+84BB # <cjk>
+0xE8EB U+84DA # <cjk>
+0xE8EC U+84D0 # <cjk>
+0xE8ED U+84C1 # <cjk>
+0xE8EE U+84C6 # <cjk>
+0xE8EF U+84D6 # <cjk>
+0xE8F0 U+84A1 # <cjk>
+0xE8F1 U+8521 # <cjk>
+0xE8F2 U+84FF # <cjk>
+0xE8F3 U+84F4 # <cjk>
+0xE8F4 U+8517 # <cjk>
+0xE8F5 U+8518 # <cjk>
+0xE8F6 U+852C # <cjk>
+0xE8F7 U+851F # <cjk>
+0xE8F8 U+8515 # <cjk>
+0xE8F9 U+8514 # <cjk>
+0xE8FA U+84FC # <cjk>
+0xE8FB U+8540 # <cjk>
+0xE8FC U+8563 # <cjk>
+0xE8FD U+8558 # <cjk>
+0xE8FE U+8548 # <cjk>
+0xE9A1 U+8541 # <cjk>
+0xE9A2 U+8602 # <cjk>
+0xE9A3 U+854B # <cjk>
+0xE9A4 U+8555 # <cjk>
+0xE9A5 U+8580 # <cjk>
+0xE9A6 U+85A4 # <cjk>
+0xE9A7 U+8588 # <cjk>
+0xE9A8 U+8591 # <cjk>
+0xE9A9 U+858A # <cjk>
+0xE9AA U+85A8 # <cjk>
+0xE9AB U+856D # <cjk>
+0xE9AC U+8594 # <cjk>
+0xE9AD U+859B # <cjk>
+0xE9AE U+85EA # <cjk>
+0xE9AF U+8587 # <cjk>
+0xE9B0 U+859C # <cjk>
+0xE9B1 U+8577 # <cjk>
+0xE9B2 U+857E # <cjk>
+0xE9B3 U+8590 # <cjk>
+0xE9B4 U+85C9 # <cjk>
+0xE9B5 U+85BA # <cjk>
+0xE9B6 U+85CF # <cjk>
+0xE9B7 U+85B9 # <cjk>
+0xE9B8 U+85D0 # <cjk>
+0xE9B9 U+85D5 # <cjk>
+0xE9BA U+85DD # <cjk>
+0xE9BB U+85E5 # <cjk>
+0xE9BC U+85DC # <cjk>
+0xE9BD U+85F9 # <cjk>
+0xE9BE U+860A # <cjk>
+0xE9BF U+8613 # <cjk>
+0xE9C0 U+860B # <cjk>
+0xE9C1 U+85FE # <cjk>
+0xE9C2 U+85FA # <cjk>
+0xE9C3 U+8606 # <cjk>
+0xE9C4 U+8622 # <cjk>
+0xE9C5 U+861A # <cjk>
+0xE9C6 U+8630 # <cjk>
+0xE9C7 U+863F # <cjk>
+0xE9C8 U+864D # <cjk>
+0xE9C9 U+4E55 # <cjk>
+0xE9CA U+8654 # <cjk>
+0xE9CB U+865F # <cjk>
+0xE9CC U+8667 # <cjk>
+0xE9CD U+8671 # <cjk>
+0xE9CE U+8693 # <cjk>
+0xE9CF U+86A3 # <cjk>
+0xE9D0 U+86A9 # <cjk>
+0xE9D1 U+86AA # <cjk>
+0xE9D2 U+868B # <cjk>
+0xE9D3 U+868C # <cjk>
+0xE9D4 U+86B6 # <cjk>
+0xE9D5 U+86AF # <cjk>
+0xE9D6 U+86C4 # <cjk>
+0xE9D7 U+86C6 # <cjk>
+0xE9D8 U+86B0 # <cjk>
+0xE9D9 U+86C9 # <cjk>
+0xE9DA U+8823 # <cjk>
+0xE9DB U+86AB # <cjk>
+0xE9DC U+86D4 # <cjk>
+0xE9DD U+86DE # <cjk>
+0xE9DE U+86E9 # <cjk>
+0xE9DF U+86EC # <cjk>
+0xE9E0 U+86DF # <cjk>
+0xE9E1 U+86DB # <cjk>
+0xE9E2 U+86EF # <cjk>
+0xE9E3 U+8712 # <cjk>
+0xE9E4 U+8706 # <cjk>
+0xE9E5 U+8708 # <cjk>
+0xE9E6 U+8700 # <cjk>
+0xE9E7 U+8703 # <cjk>
+0xE9E8 U+86FB # <cjk>
+0xE9E9 U+8711 # <cjk>
+0xE9EA U+8709 # <cjk>
+0xE9EB U+870D # <cjk>
+0xE9EC U+86F9 # <cjk>
+0xE9ED U+870A # <cjk>
+0xE9EE U+8734 # <cjk>
+0xE9EF U+873F # <cjk>
+0xE9F0 U+8737 # <cjk>
+0xE9F1 U+873B # <cjk>
+0xE9F2 U+8725 # <cjk>
+0xE9F3 U+8729 # <cjk>
+0xE9F4 U+871A # <cjk>
+0xE9F5 U+8760 # <cjk>
+0xE9F6 U+875F # <cjk>
+0xE9F7 U+8778 # <cjk>
+0xE9F8 U+874C # <cjk>
+0xE9F9 U+874E # <cjk>
+0xE9FA U+8774 # <cjk>
+0xE9FB U+8757 # <cjk>
+0xE9FC U+8768 # <cjk>
+0xE9FD U+876E # <cjk>
+0xE9FE U+8759 # <cjk>
+0xEAA1 U+8753 # <cjk>
+0xEAA2 U+8763 # <cjk>
+0xEAA3 U+876A # <cjk>
+0xEAA4 U+8805 # <cjk>
+0xEAA5 U+87A2 # <cjk>
+0xEAA6 U+879F # <cjk>
+0xEAA7 U+8782 # <cjk>
+0xEAA8 U+87AF # <cjk>
+0xEAA9 U+87CB # <cjk>
+0xEAAA U+87BD # <cjk>
+0xEAAB U+87C0 # <cjk>
+0xEAAC U+87D0 # <cjk>
+0xEAAD U+96D6 # <cjk>
+0xEAAE U+87AB # <cjk>
+0xEAAF U+87C4 # <cjk>
+0xEAB0 U+87B3 # <cjk>
+0xEAB1 U+87C7 # <cjk>
+0xEAB2 U+87C6 # <cjk>
+0xEAB3 U+87BB # <cjk>
+0xEAB4 U+87EF # <cjk>
+0xEAB5 U+87F2 # <cjk>
+0xEAB6 U+87E0 # <cjk>
+0xEAB7 U+880F # <cjk>
+0xEAB8 U+880D # <cjk>
+0xEAB9 U+87FE # <cjk>
+0xEABA U+87F6 # <cjk>
+0xEABB U+87F7 # <cjk>
+0xEABC U+880E # <cjk>
+0xEABD U+87D2 # <cjk>
+0xEABE U+8811 # <cjk>
+0xEABF U+8816 # <cjk>
+0xEAC0 U+8815 # <cjk>
+0xEAC1 U+8822 # <cjk>
+0xEAC2 U+8821 # <cjk>
+0xEAC3 U+8831 # <cjk>
+0xEAC4 U+8836 # <cjk>
+0xEAC5 U+8839 # <cjk>
+0xEAC6 U+8827 # <cjk>
+0xEAC7 U+883B # <cjk>
+0xEAC8 U+8844 # <cjk>
+0xEAC9 U+8842 # <cjk>
+0xEACA U+8852 # <cjk>
+0xEACB U+8859 # <cjk>
+0xEACC U+885E # <cjk>
+0xEACD U+8862 # <cjk>
+0xEACE U+886B # <cjk>
+0xEACF U+8881 # <cjk>
+0xEAD0 U+887E # <cjk>
+0xEAD1 U+889E # <cjk>
+0xEAD2 U+8875 # <cjk>
+0xEAD3 U+887D # <cjk>
+0xEAD4 U+88B5 # <cjk>
+0xEAD5 U+8872 # <cjk>
+0xEAD6 U+8882 # <cjk>
+0xEAD7 U+8897 # <cjk>
+0xEAD8 U+8892 # <cjk>
+0xEAD9 U+88AE # <cjk>
+0xEADA U+8899 # <cjk>
+0xEADB U+88A2 # <cjk>
+0xEADC U+888D # <cjk>
+0xEADD U+88A4 # <cjk>
+0xEADE U+88B0 # <cjk>
+0xEADF U+88BF # <cjk>
+0xEAE0 U+88B1 # <cjk>
+0xEAE1 U+88C3 # <cjk>
+0xEAE2 U+88C4 # <cjk>
+0xEAE3 U+88D4 # <cjk>
+0xEAE4 U+88D8 # <cjk>
+0xEAE5 U+88D9 # <cjk>
+0xEAE6 U+88DD # <cjk>
+0xEAE7 U+88F9 # <cjk>
+0xEAE8 U+8902 # <cjk>
+0xEAE9 U+88FC # <cjk>
+0xEAEA U+88F4 # <cjk>
+0xEAEB U+88E8 # <cjk>
+0xEAEC U+88F2 # <cjk>
+0xEAED U+8904 # <cjk>
+0xEAEE U+890C # <cjk>
+0xEAEF U+890A # <cjk>
+0xEAF0 U+8913 # <cjk>
+0xEAF1 U+8943 # <cjk>
+0xEAF2 U+891E # <cjk>
+0xEAF3 U+8925 # <cjk>
+0xEAF4 U+892A # <cjk>
+0xEAF5 U+892B # <cjk>
+0xEAF6 U+8941 # <cjk>
+0xEAF7 U+8944 # <cjk>
+0xEAF8 U+893B # <cjk>
+0xEAF9 U+8936 # <cjk>
+0xEAFA U+8938 # <cjk>
+0xEAFB U+894C # <cjk>
+0xEAFC U+891D # <cjk>
+0xEAFD U+8960 # <cjk>
+0xEAFE U+895E # <cjk>
+0xEBA1 U+8966 # <cjk>
+0xEBA2 U+8964 # <cjk>
+0xEBA3 U+896D # <cjk>
+0xEBA4 U+896A # <cjk>
+0xEBA5 U+896F # <cjk>
+0xEBA6 U+8974 # <cjk>
+0xEBA7 U+8977 # <cjk>
+0xEBA8 U+897E # <cjk>
+0xEBA9 U+8983 # <cjk>
+0xEBAA U+8988 # <cjk>
+0xEBAB U+898A # <cjk>
+0xEBAC U+8993 # <cjk>
+0xEBAD U+8998 # <cjk>
+0xEBAE U+89A1 # <cjk>
+0xEBAF U+89A9 # <cjk>
+0xEBB0 U+89A6 # <cjk>
+0xEBB1 U+89AC # <cjk>
+0xEBB2 U+89AF # <cjk>
+0xEBB3 U+89B2 # <cjk>
+0xEBB4 U+89BA # <cjk>
+0xEBB5 U+89BD # <cjk>
+0xEBB6 U+89BF # <cjk>
+0xEBB7 U+89C0 # <cjk>
+0xEBB8 U+89DA # <cjk>
+0xEBB9 U+89DC # <cjk>
+0xEBBA U+89DD # <cjk>
+0xEBBB U+89E7 # <cjk>
+0xEBBC U+89F4 # <cjk>
+0xEBBD U+89F8 # <cjk>
+0xEBBE U+8A03 # <cjk>
+0xEBBF U+8A16 # <cjk>
+0xEBC0 U+8A10 # <cjk>
+0xEBC1 U+8A0C # <cjk>
+0xEBC2 U+8A1B # <cjk>
+0xEBC3 U+8A1D # <cjk>
+0xEBC4 U+8A25 # <cjk>
+0xEBC5 U+8A36 # <cjk>
+0xEBC6 U+8A41 # <cjk>
+0xEBC7 U+8A5B # <cjk>
+0xEBC8 U+8A52 # <cjk>
+0xEBC9 U+8A46 # <cjk>
+0xEBCA U+8A48 # <cjk>
+0xEBCB U+8A7C # <cjk>
+0xEBCC U+8A6D # <cjk>
+0xEBCD U+8A6C # <cjk>
+0xEBCE U+8A62 # <cjk>
+0xEBCF U+8A85 # <cjk>
+0xEBD0 U+8A82 # <cjk>
+0xEBD1 U+8A84 # <cjk>
+0xEBD2 U+8AA8 # <cjk>
+0xEBD3 U+8AA1 # <cjk>
+0xEBD4 U+8A91 # <cjk>
+0xEBD5 U+8AA5 # <cjk>
+0xEBD6 U+8AA6 # <cjk>
+0xEBD7 U+8A9A # <cjk>
+0xEBD8 U+8AA3 # <cjk>
+0xEBD9 U+8AC4 # <cjk>
+0xEBDA U+8ACD # <cjk>
+0xEBDB U+8AC2 # <cjk>
+0xEBDC U+8ADA # <cjk>
+0xEBDD U+8AEB # <cjk>
+0xEBDE U+8AF3 # <cjk>
+0xEBDF U+8AE7 # <cjk>
+0xEBE0 U+8AE4 # <cjk>
+0xEBE1 U+8AF1 # <cjk>
+0xEBE2 U+8B14 # <cjk>
+0xEBE3 U+8AE0 # <cjk>
+0xEBE4 U+8AE2 # <cjk>
+0xEBE5 U+8AF7 # <cjk>
+0xEBE6 U+8ADE # <cjk>
+0xEBE7 U+8ADB # <cjk>
+0xEBE8 U+8B0C # <cjk>
+0xEBE9 U+8B07 # <cjk>
+0xEBEA U+8B1A # <cjk>
+0xEBEB U+8AE1 # <cjk>
+0xEBEC U+8B16 # <cjk>
+0xEBED U+8B10 # <cjk>
+0xEBEE U+8B17 # <cjk>
+0xEBEF U+8B20 # <cjk>
+0xEBF0 U+8B33 # <cjk>
+0xEBF1 U+97AB # <cjk>
+0xEBF2 U+8B26 # <cjk>
+0xEBF3 U+8B2B # <cjk>
+0xEBF4 U+8B3E # <cjk>
+0xEBF5 U+8B28 # <cjk>
+0xEBF6 U+8B41 # <cjk>
+0xEBF7 U+8B4C # <cjk>
+0xEBF8 U+8B4F # <cjk>
+0xEBF9 U+8B4E # <cjk>
+0xEBFA U+8B49 # <cjk>
+0xEBFB U+8B56 # <cjk>
+0xEBFC U+8B5B # <cjk>
+0xEBFD U+8B5A # <cjk>
+0xEBFE U+8B6B # <cjk>
+0xECA1 U+8B5F # <cjk>
+0xECA2 U+8B6C # <cjk>
+0xECA3 U+8B6F # <cjk>
+0xECA4 U+8B74 # <cjk>
+0xECA5 U+8B7D # <cjk>
+0xECA6 U+8B80 # <cjk>
+0xECA7 U+8B8C # <cjk>
+0xECA8 U+8B8E # <cjk>
+0xECA9 U+8B92 # <cjk>
+0xECAA U+8B93 # <cjk>
+0xECAB U+8B96 # <cjk>
+0xECAC U+8B99 # <cjk>
+0xECAD U+8B9A # <cjk>
+0xECAE U+8C3A # <cjk>
+0xECAF U+8C41 # <cjk>
+0xECB0 U+8C3F # <cjk>
+0xECB1 U+8C48 # <cjk>
+0xECB2 U+8C4C # <cjk>
+0xECB3 U+8C4E # <cjk>
+0xECB4 U+8C50 # <cjk>
+0xECB5 U+8C55 # <cjk>
+0xECB6 U+8C62 # <cjk>
+0xECB7 U+8C6C # <cjk>
+0xECB8 U+8C78 # <cjk>
+0xECB9 U+8C7A # <cjk>
+0xECBA U+8C82 # <cjk>
+0xECBB U+8C89 # <cjk>
+0xECBC U+8C85 # <cjk>
+0xECBD U+8C8A # <cjk>
+0xECBE U+8C8D # <cjk>
+0xECBF U+8C8E # <cjk>
+0xECC0 U+8C94 # <cjk>
+0xECC1 U+8C7C # <cjk>
+0xECC2 U+8C98 # <cjk>
+0xECC3 U+621D # <cjk>
+0xECC4 U+8CAD # <cjk>
+0xECC5 U+8CAA # <cjk>
+0xECC6 U+8CBD # <cjk>
+0xECC7 U+8CB2 # <cjk>
+0xECC8 U+8CB3 # <cjk>
+0xECC9 U+8CAE # <cjk>
+0xECCA U+8CB6 # <cjk>
+0xECCB U+8CC8 # <cjk>
+0xECCC U+8CC1 # <cjk>
+0xECCD U+8CE4 # <cjk>
+0xECCE U+8CE3 # <cjk>
+0xECCF U+8CDA # <cjk>
+0xECD0 U+8CFD # <cjk>
+0xECD1 U+8CFA # <cjk>
+0xECD2 U+8CFB # <cjk>
+0xECD3 U+8D04 # <cjk>
+0xECD4 U+8D05 # <cjk>
+0xECD5 U+8D0A # <cjk>
+0xECD6 U+8D07 # <cjk>
+0xECD7 U+8D0F # <cjk>
+0xECD8 U+8D0D # <cjk>
+0xECD9 U+8D10 # <cjk>
+0xECDA U+9F4E # <cjk>
+0xECDB U+8D13 # <cjk>
+0xECDC U+8CCD # <cjk>
+0xECDD U+8D14 # <cjk>
+0xECDE U+8D16 # <cjk>
+0xECDF U+8D67 # <cjk>
+0xECE0 U+8D6D # <cjk>
+0xECE1 U+8D71 # <cjk>
+0xECE2 U+8D73 # <cjk>
+0xECE3 U+8D81 # <cjk>
+0xECE4 U+8D99 # <cjk>
+0xECE5 U+8DC2 # <cjk>
+0xECE6 U+8DBE # <cjk>
+0xECE7 U+8DBA # <cjk>
+0xECE8 U+8DCF # <cjk>
+0xECE9 U+8DDA # <cjk>
+0xECEA U+8DD6 # <cjk>
+0xECEB U+8DCC # <cjk>
+0xECEC U+8DDB # <cjk>
+0xECED U+8DCB # <cjk>
+0xECEE U+8DEA # <cjk>
+0xECEF U+8DEB # <cjk>
+0xECF0 U+8DDF # <cjk>
+0xECF1 U+8DE3 # <cjk>
+0xECF2 U+8DFC # <cjk>
+0xECF3 U+8E08 # <cjk>
+0xECF4 U+8E09 # <cjk>
+0xECF5 U+8DFF # <cjk>
+0xECF6 U+8E1D # <cjk>
+0xECF7 U+8E1E # <cjk>
+0xECF8 U+8E10 # <cjk>
+0xECF9 U+8E1F # <cjk>
+0xECFA U+8E42 # <cjk>
+0xECFB U+8E35 # <cjk>
+0xECFC U+8E30 # <cjk>
+0xECFD U+8E34 # <cjk>
+0xECFE U+8E4A # <cjk>
+0xEDA1 U+8E47 # <cjk>
+0xEDA2 U+8E49 # <cjk>
+0xEDA3 U+8E4C # <cjk>
+0xEDA4 U+8E50 # <cjk>
+0xEDA5 U+8E48 # <cjk>
+0xEDA6 U+8E59 # <cjk>
+0xEDA7 U+8E64 # <cjk>
+0xEDA8 U+8E60 # <cjk>
+0xEDA9 U+8E2A # <cjk>
+0xEDAA U+8E63 # <cjk>
+0xEDAB U+8E55 # <cjk>
+0xEDAC U+8E76 # <cjk>
+0xEDAD U+8E72 # <cjk>
+0xEDAE U+8E7C # <cjk>
+0xEDAF U+8E81 # <cjk>
+0xEDB0 U+8E87 # <cjk>
+0xEDB1 U+8E85 # <cjk>
+0xEDB2 U+8E84 # <cjk>
+0xEDB3 U+8E8B # <cjk>
+0xEDB4 U+8E8A # <cjk>
+0xEDB5 U+8E93 # <cjk>
+0xEDB6 U+8E91 # <cjk>
+0xEDB7 U+8E94 # <cjk>
+0xEDB8 U+8E99 # <cjk>
+0xEDB9 U+8EAA # <cjk>
+0xEDBA U+8EA1 # <cjk>
+0xEDBB U+8EAC # <cjk>
+0xEDBC U+8EB0 # <cjk>
+0xEDBD U+8EC6 # <cjk>
+0xEDBE U+8EB1 # <cjk>
+0xEDBF U+8EBE # <cjk>
+0xEDC0 U+8EC5 # <cjk>
+0xEDC1 U+8EC8 # <cjk>
+0xEDC2 U+8ECB # <cjk>
+0xEDC3 U+8EDB # <cjk>
+0xEDC4 U+8EE3 # <cjk>
+0xEDC5 U+8EFC # <cjk>
+0xEDC6 U+8EFB # <cjk>
+0xEDC7 U+8EEB # <cjk>
+0xEDC8 U+8EFE # <cjk>
+0xEDC9 U+8F0A # <cjk>
+0xEDCA U+8F05 # <cjk>
+0xEDCB U+8F15 # <cjk>
+0xEDCC U+8F12 # <cjk>
+0xEDCD U+8F19 # <cjk>
+0xEDCE U+8F13 # <cjk>
+0xEDCF U+8F1C # <cjk>
+0xEDD0 U+8F1F # <cjk>
+0xEDD1 U+8F1B # <cjk>
+0xEDD2 U+8F0C # <cjk>
+0xEDD3 U+8F26 # <cjk>
+0xEDD4 U+8F33 # <cjk>
+0xEDD5 U+8F3B # <cjk>
+0xEDD6 U+8F39 # <cjk>
+0xEDD7 U+8F45 # <cjk>
+0xEDD8 U+8F42 # <cjk>
+0xEDD9 U+8F3E # <cjk>
+0xEDDA U+8F4C # <cjk>
+0xEDDB U+8F49 # <cjk>
+0xEDDC U+8F46 # <cjk>
+0xEDDD U+8F4E # <cjk>
+0xEDDE U+8F57 # <cjk>
+0xEDDF U+8F5C # <cjk>
+0xEDE0 U+8F62 # <cjk>
+0xEDE1 U+8F63 # <cjk>
+0xEDE2 U+8F64 # <cjk>
+0xEDE3 U+8F9C # <cjk>
+0xEDE4 U+8F9F # <cjk>
+0xEDE5 U+8FA3 # <cjk>
+0xEDE6 U+8FAD # <cjk>
+0xEDE7 U+8FAF # <cjk>
+0xEDE8 U+8FB7 # <cjk>
+0xEDE9 U+8FDA # <cjk>
+0xEDEA U+8FE5 # <cjk>
+0xEDEB U+8FE2 # <cjk>
+0xEDEC U+8FEA # <cjk>
+0xEDED U+8FEF # <cjk>
+0xEDEE U+9087 # <cjk>
+0xEDEF U+8FF4 # <cjk>
+0xEDF0 U+9005 # <cjk>
+0xEDF1 U+8FF9 # <cjk>
+0xEDF2 U+8FFA # <cjk>
+0xEDF3 U+9011 # <cjk>
+0xEDF4 U+9015 # <cjk>
+0xEDF5 U+9021 # <cjk>
+0xEDF6 U+900D # <cjk>
+0xEDF7 U+901E # <cjk>
+0xEDF8 U+9016 # <cjk>
+0xEDF9 U+900B # <cjk>
+0xEDFA U+9027 # <cjk>
+0xEDFB U+9036 # <cjk>
+0xEDFC U+9035 # <cjk>
+0xEDFD U+9039 # <cjk>
+0xEDFE U+8FF8 # <cjk>
+0xEEA1 U+904F # <cjk>
+0xEEA2 U+9050 # <cjk>
+0xEEA3 U+9051 # <cjk>
+0xEEA4 U+9052 # <cjk>
+0xEEA5 U+900E # <cjk>
+0xEEA6 U+9049 # <cjk>
+0xEEA7 U+903E # <cjk>
+0xEEA8 U+9056 # <cjk>
+0xEEA9 U+9058 # <cjk>
+0xEEAA U+905E # <cjk>
+0xEEAB U+9068 # <cjk>
+0xEEAC U+906F # <cjk>
+0xEEAD U+9076 # <cjk>
+0xEEAE U+96A8 # <cjk>
+0xEEAF U+9072 # <cjk>
+0xEEB0 U+9082 # <cjk>
+0xEEB1 U+907D # <cjk>
+0xEEB2 U+9081 # <cjk>
+0xEEB3 U+9080 # <cjk>
+0xEEB4 U+908A # <cjk>
+0xEEB5 U+9089 # <cjk>
+0xEEB6 U+908F # <cjk>
+0xEEB7 U+90A8 # <cjk>
+0xEEB8 U+90AF # <cjk>
+0xEEB9 U+90B1 # <cjk>
+0xEEBA U+90B5 # <cjk>
+0xEEBB U+90E2 # <cjk>
+0xEEBC U+90E4 # <cjk>
+0xEEBD U+6248 # <cjk>
+0xEEBE U+90DB # <cjk>
+0xEEBF U+9102 # <cjk>
+0xEEC0 U+9112 # <cjk>
+0xEEC1 U+9119 # <cjk>
+0xEEC2 U+9132 # <cjk>
+0xEEC3 U+9130 # <cjk>
+0xEEC4 U+914A # <cjk>
+0xEEC5 U+9156 # <cjk>
+0xEEC6 U+9158 # <cjk>
+0xEEC7 U+9163 # <cjk>
+0xEEC8 U+9165 # <cjk>
+0xEEC9 U+9169 # <cjk>
+0xEECA U+9173 # <cjk>
+0xEECB U+9172 # <cjk>
+0xEECC U+918B # <cjk>
+0xEECD U+9189 # <cjk>
+0xEECE U+9182 # <cjk>
+0xEECF U+91A2 # <cjk>
+0xEED0 U+91AB # <cjk>
+0xEED1 U+91AF # <cjk>
+0xEED2 U+91AA # <cjk>
+0xEED3 U+91B5 # <cjk>
+0xEED4 U+91B4 # <cjk>
+0xEED5 U+91BA # <cjk>
+0xEED6 U+91C0 # <cjk>
+0xEED7 U+91C1 # <cjk>
+0xEED8 U+91C9 # <cjk>
+0xEED9 U+91CB # <cjk>
+0xEEDA U+91D0 # <cjk>
+0xEEDB U+91D6 # <cjk>
+0xEEDC U+91DF # <cjk>
+0xEEDD U+91E1 # <cjk>
+0xEEDE U+91DB # <cjk>
+0xEEDF U+91FC # <cjk>
+0xEEE0 U+91F5 # <cjk>
+0xEEE1 U+91F6 # <cjk>
+0xEEE2 U+921E # <cjk>
+0xEEE3 U+91FF # <cjk>
+0xEEE4 U+9214 # <cjk>
+0xEEE5 U+922C # <cjk>
+0xEEE6 U+9215 # <cjk>
+0xEEE7 U+9211 # <cjk>
+0xEEE8 U+925E # <cjk>
+0xEEE9 U+9257 # <cjk>
+0xEEEA U+9245 # <cjk>
+0xEEEB U+9249 # <cjk>
+0xEEEC U+9264 # <cjk>
+0xEEED U+9248 # <cjk>
+0xEEEE U+9295 # <cjk>
+0xEEEF U+923F # <cjk>
+0xEEF0 U+924B # <cjk>
+0xEEF1 U+9250 # <cjk>
+0xEEF2 U+929C # <cjk>
+0xEEF3 U+9296 # <cjk>
+0xEEF4 U+9293 # <cjk>
+0xEEF5 U+929B # <cjk>
+0xEEF6 U+925A # <cjk>
+0xEEF7 U+92CF # <cjk>
+0xEEF8 U+92B9 # <cjk>
+0xEEF9 U+92B7 # <cjk>
+0xEEFA U+92E9 # <cjk>
+0xEEFB U+930F # <cjk>
+0xEEFC U+92FA # <cjk>
+0xEEFD U+9344 # <cjk>
+0xEEFE U+932E # <cjk>
+0xEFA1 U+9319 # <cjk>
+0xEFA2 U+9322 # <cjk>
+0xEFA3 U+931A # <cjk>
+0xEFA4 U+9323 # <cjk>
+0xEFA5 U+933A # <cjk>
+0xEFA6 U+9335 # <cjk>
+0xEFA7 U+933B # <cjk>
+0xEFA8 U+935C # <cjk>
+0xEFA9 U+9360 # <cjk>
+0xEFAA U+937C # <cjk>
+0xEFAB U+936E # <cjk>
+0xEFAC U+9356 # <cjk>
+0xEFAD U+93B0 # <cjk>
+0xEFAE U+93AC # <cjk>
+0xEFAF U+93AD # <cjk>
+0xEFB0 U+9394 # <cjk>
+0xEFB1 U+93B9 # <cjk>
+0xEFB2 U+93D6 # <cjk>
+0xEFB3 U+93D7 # <cjk>
+0xEFB4 U+93E8 # <cjk>
+0xEFB5 U+93E5 # <cjk>
+0xEFB6 U+93D8 # <cjk>
+0xEFB7 U+93C3 # <cjk>
+0xEFB8 U+93DD # <cjk>
+0xEFB9 U+93D0 # <cjk>
+0xEFBA U+93C8 # <cjk>
+0xEFBB U+93E4 # <cjk>
+0xEFBC U+941A # <cjk>
+0xEFBD U+9414 # <cjk>
+0xEFBE U+9413 # <cjk>
+0xEFBF U+9403 # <cjk>
+0xEFC0 U+9407 # <cjk>
+0xEFC1 U+9410 # <cjk>
+0xEFC2 U+9436 # <cjk>
+0xEFC3 U+942B # <cjk>
+0xEFC4 U+9435 # <cjk>
+0xEFC5 U+9421 # <cjk>
+0xEFC6 U+943A # <cjk>
+0xEFC7 U+9441 # <cjk>
+0xEFC8 U+9452 # <cjk>
+0xEFC9 U+9444 # <cjk>
+0xEFCA U+945B # <cjk>
+0xEFCB U+9460 # <cjk>
+0xEFCC U+9462 # <cjk>
+0xEFCD U+945E # <cjk>
+0xEFCE U+946A # <cjk>
+0xEFCF U+9229 # <cjk>
+0xEFD0 U+9470 # <cjk>
+0xEFD1 U+9475 # <cjk>
+0xEFD2 U+9477 # <cjk>
+0xEFD3 U+947D # <cjk>
+0xEFD4 U+945A # <cjk>
+0xEFD5 U+947C # <cjk>
+0xEFD6 U+947E # <cjk>
+0xEFD7 U+9481 # <cjk>
+0xEFD8 U+947F # <cjk>
+0xEFD9 U+9582 # <cjk>
+0xEFDA U+9587 # <cjk>
+0xEFDB U+958A # <cjk>
+0xEFDC U+9594 # <cjk>
+0xEFDD U+9596 # <cjk>
+0xEFDE U+9598 # <cjk>
+0xEFDF U+9599 # <cjk>
+0xEFE0 U+95A0 # <cjk>
+0xEFE1 U+95A8 # <cjk>
+0xEFE2 U+95A7 # <cjk>
+0xEFE3 U+95AD # <cjk>
+0xEFE4 U+95BC # <cjk>
+0xEFE5 U+95BB # <cjk>
+0xEFE6 U+95B9 # <cjk>
+0xEFE7 U+95BE # <cjk>
+0xEFE8 U+95CA # <cjk>
+0xEFE9 U+6FF6 # <cjk>
+0xEFEA U+95C3 # <cjk>
+0xEFEB U+95CD # <cjk>
+0xEFEC U+95CC # <cjk>
+0xEFED U+95D5 # <cjk>
+0xEFEE U+95D4 # <cjk>
+0xEFEF U+95D6 # <cjk>
+0xEFF0 U+95DC # <cjk>
+0xEFF1 U+95E1 # <cjk>
+0xEFF2 U+95E5 # <cjk>
+0xEFF3 U+95E2 # <cjk>
+0xEFF4 U+9621 # <cjk>
+0xEFF5 U+9628 # <cjk>
+0xEFF6 U+962E # <cjk>
+0xEFF7 U+962F # <cjk>
+0xEFF8 U+9642 # <cjk>
+0xEFF9 U+964C # <cjk>
+0xEFFA U+964F # <cjk>
+0xEFFB U+964B # <cjk>
+0xEFFC U+9677 # <cjk>
+0xEFFD U+965C # <cjk>
+0xEFFE U+965E # <cjk>
+0xF0A1 U+965D # <cjk>
+0xF0A2 U+965F # <cjk>
+0xF0A3 U+9666 # <cjk>
+0xF0A4 U+9672 # <cjk>
+0xF0A5 U+966C # <cjk>
+0xF0A6 U+968D # <cjk>
+0xF0A7 U+9698 # <cjk>
+0xF0A8 U+9695 # <cjk>
+0xF0A9 U+9697 # <cjk>
+0xF0AA U+96AA # <cjk>
+0xF0AB U+96A7 # <cjk>
+0xF0AC U+96B1 # <cjk>
+0xF0AD U+96B2 # <cjk>
+0xF0AE U+96B0 # <cjk>
+0xF0AF U+96B4 # <cjk>
+0xF0B0 U+96B6 # <cjk>
+0xF0B1 U+96B8 # <cjk>
+0xF0B2 U+96B9 # <cjk>
+0xF0B3 U+96CE # <cjk>
+0xF0B4 U+96CB # <cjk>
+0xF0B5 U+96C9 # <cjk>
+0xF0B6 U+96CD # <cjk>
+0xF0B7 U+894D # <cjk>
+0xF0B8 U+96DC # <cjk>
+0xF0B9 U+970D # <cjk>
+0xF0BA U+96D5 # <cjk>
+0xF0BB U+96F9 # <cjk>
+0xF0BC U+9704 # <cjk>
+0xF0BD U+9706 # <cjk>
+0xF0BE U+9708 # <cjk>
+0xF0BF U+9713 # <cjk>
+0xF0C0 U+970E # <cjk>
+0xF0C1 U+9711 # <cjk>
+0xF0C2 U+970F # <cjk>
+0xF0C3 U+9716 # <cjk>
+0xF0C4 U+9719 # <cjk>
+0xF0C5 U+9724 # <cjk>
+0xF0C6 U+972A # <cjk>
+0xF0C7 U+9730 # <cjk>
+0xF0C8 U+9739 # <cjk>
+0xF0C9 U+973D # <cjk>
+0xF0CA U+973E # <cjk>
+0xF0CB U+9744 # <cjk>
+0xF0CC U+9746 # <cjk>
+0xF0CD U+9748 # <cjk>
+0xF0CE U+9742 # <cjk>
+0xF0CF U+9749 # <cjk>
+0xF0D0 U+975C # <cjk>
+0xF0D1 U+9760 # <cjk>
+0xF0D2 U+9764 # <cjk>
+0xF0D3 U+9766 # <cjk>
+0xF0D4 U+9768 # <cjk>
+0xF0D5 U+52D2 # <cjk>
+0xF0D6 U+976B # <cjk>
+0xF0D7 U+9771 # <cjk>
+0xF0D8 U+9779 # <cjk>
+0xF0D9 U+9785 # <cjk>
+0xF0DA U+977C # <cjk>
+0xF0DB U+9781 # <cjk>
+0xF0DC U+977A # <cjk>
+0xF0DD U+9786 # <cjk>
+0xF0DE U+978B # <cjk>
+0xF0DF U+978F # <cjk>
+0xF0E0 U+9790 # <cjk>
+0xF0E1 U+979C # <cjk>
+0xF0E2 U+97A8 # <cjk>
+0xF0E3 U+97A6 # <cjk>
+0xF0E4 U+97A3 # <cjk>
+0xF0E5 U+97B3 # <cjk>
+0xF0E6 U+97B4 # <cjk>
+0xF0E7 U+97C3 # <cjk>
+0xF0E8 U+97C6 # <cjk>
+0xF0E9 U+97C8 # <cjk>
+0xF0EA U+97CB # <cjk>
+0xF0EB U+97DC # <cjk>
+0xF0EC U+97ED # <cjk>
+0xF0ED U+9F4F # <cjk>
+0xF0EE U+97F2 # <cjk>
+0xF0EF U+7ADF # <cjk>
+0xF0F0 U+97F6 # <cjk>
+0xF0F1 U+97F5 # <cjk>
+0xF0F2 U+980F # <cjk>
+0xF0F3 U+980C # <cjk>
+0xF0F4 U+9838 # <cjk>
+0xF0F5 U+9824 # <cjk>
+0xF0F6 U+9821 # <cjk>
+0xF0F7 U+9837 # <cjk>
+0xF0F8 U+983D # <cjk>
+0xF0F9 U+9846 # <cjk>
+0xF0FA U+984F # <cjk>
+0xF0FB U+984B # <cjk>
+0xF0FC U+986B # <cjk>
+0xF0FD U+986F # <cjk>
+0xF0FE U+9870 # <cjk>
+0xF1A1 U+9871 # <cjk>
+0xF1A2 U+9874 # <cjk>
+0xF1A3 U+9873 # <cjk>
+0xF1A4 U+98AA # <cjk>
+0xF1A5 U+98AF # <cjk>
+0xF1A6 U+98B1 # <cjk>
+0xF1A7 U+98B6 # <cjk>
+0xF1A8 U+98C4 # <cjk>
+0xF1A9 U+98C3 # <cjk>
+0xF1AA U+98C6 # <cjk>
+0xF1AB U+98E9 # <cjk>
+0xF1AC U+98EB # <cjk>
+0xF1AD U+9903 # <cjk>
+0xF1AE U+9909 # <cjk>
+0xF1AF U+9912 # <cjk>
+0xF1B0 U+9914 # <cjk>
+0xF1B1 U+9918 # <cjk>
+0xF1B2 U+9921 # <cjk>
+0xF1B3 U+991D # <cjk>
+0xF1B4 U+991E # <cjk>
+0xF1B5 U+9924 # <cjk>
+0xF1B6 U+9920 # <cjk>
+0xF1B7 U+992C # <cjk>
+0xF1B8 U+992E # <cjk>
+0xF1B9 U+993D # <cjk>
+0xF1BA U+993E # <cjk>
+0xF1BB U+9942 # <cjk>
+0xF1BC U+9949 # <cjk>
+0xF1BD U+9945 # <cjk>
+0xF1BE U+9950 # <cjk>
+0xF1BF U+994B # <cjk>
+0xF1C0 U+9951 # <cjk>
+0xF1C1 U+9952 # <cjk>
+0xF1C2 U+994C # <cjk>
+0xF1C3 U+9955 # <cjk>
+0xF1C4 U+9997 # <cjk>
+0xF1C5 U+9998 # <cjk>
+0xF1C6 U+99A5 # <cjk>
+0xF1C7 U+99AD # <cjk>
+0xF1C8 U+99AE # <cjk>
+0xF1C9 U+99BC # <cjk>
+0xF1CA U+99DF # <cjk>
+0xF1CB U+99DB # <cjk>
+0xF1CC U+99DD # <cjk>
+0xF1CD U+99D8 # <cjk>
+0xF1CE U+99D1 # <cjk>
+0xF1CF U+99ED # <cjk>
+0xF1D0 U+99EE # <cjk>
+0xF1D1 U+99F1 # <cjk>
+0xF1D2 U+99F2 # <cjk>
+0xF1D3 U+99FB # <cjk>
+0xF1D4 U+99F8 # <cjk>
+0xF1D5 U+9A01 # <cjk>
+0xF1D6 U+9A0F # <cjk>
+0xF1D7 U+9A05 # <cjk>
+0xF1D8 U+99E2 # <cjk>
+0xF1D9 U+9A19 # <cjk>
+0xF1DA U+9A2B # <cjk>
+0xF1DB U+9A37 # <cjk>
+0xF1DC U+9A45 # <cjk>
+0xF1DD U+9A42 # <cjk>
+0xF1DE U+9A40 # <cjk>
+0xF1DF U+9A43 # <cjk>
+0xF1E0 U+9A3E # <cjk>
+0xF1E1 U+9A55 # <cjk>
+0xF1E2 U+9A4D # <cjk>
+0xF1E3 U+9A5B # <cjk>
+0xF1E4 U+9A57 # <cjk>
+0xF1E5 U+9A5F # <cjk>
+0xF1E6 U+9A62 # <cjk>
+0xF1E7 U+9A65 # <cjk>
+0xF1E8 U+9A64 # <cjk>
+0xF1E9 U+9A69 # <cjk>
+0xF1EA U+9A6B # <cjk>
+0xF1EB U+9A6A # <cjk>
+0xF1EC U+9AAD # <cjk>
+0xF1ED U+9AB0 # <cjk>
+0xF1EE U+9ABC # <cjk>
+0xF1EF U+9AC0 # <cjk>
+0xF1F0 U+9ACF # <cjk>
+0xF1F1 U+9AD1 # <cjk>
+0xF1F2 U+9AD3 # <cjk>
+0xF1F3 U+9AD4 # <cjk>
+0xF1F4 U+9ADE # <cjk>
+0xF1F5 U+9ADF # <cjk>
+0xF1F6 U+9AE2 # <cjk>
+0xF1F7 U+9AE3 # <cjk>
+0xF1F8 U+9AE6 # <cjk>
+0xF1F9 U+9AEF # <cjk>
+0xF1FA U+9AEB # <cjk>
+0xF1FB U+9AEE # <cjk>
+0xF1FC U+9AF4 # <cjk>
+0xF1FD U+9AF1 # <cjk>
+0xF1FE U+9AF7 # <cjk>
+0xF2A1 U+9AFB # <cjk>
+0xF2A2 U+9B06 # <cjk>
+0xF2A3 U+9B18 # <cjk>
+0xF2A4 U+9B1A # <cjk>
+0xF2A5 U+9B1F # <cjk>
+0xF2A6 U+9B22 # <cjk>
+0xF2A7 U+9B23 # <cjk>
+0xF2A8 U+9B25 # <cjk>
+0xF2A9 U+9B27 # <cjk>
+0xF2AA U+9B28 # <cjk>
+0xF2AB U+9B29 # <cjk>
+0xF2AC U+9B2A # <cjk>
+0xF2AD U+9B2E # <cjk>
+0xF2AE U+9B2F # <cjk>
+0xF2AF U+9B32 # <cjk>
+0xF2B0 U+9B44 # <cjk>
+0xF2B1 U+9B43 # <cjk>
+0xF2B2 U+9B4F # <cjk>
+0xF2B3 U+9B4D # <cjk>
+0xF2B4 U+9B4E # <cjk>
+0xF2B5 U+9B51 # <cjk>
+0xF2B6 U+9B58 # <cjk>
+0xF2B7 U+9B74 # <cjk>
+0xF2B8 U+9B93 # <cjk>
+0xF2B9 U+9B83 # <cjk>
+0xF2BA U+9B91 # <cjk>
+0xF2BB U+9B96 # <cjk>
+0xF2BC U+9B97 # <cjk>
+0xF2BD U+9B9F # <cjk>
+0xF2BE U+9BA0 # <cjk>
+0xF2BF U+9BA8 # <cjk>
+0xF2C0 U+9BB4 # <cjk>
+0xF2C1 U+9BC0 # <cjk>
+0xF2C2 U+9BCA # <cjk>
+0xF2C3 U+9BB9 # <cjk>
+0xF2C4 U+9BC6 # <cjk>
+0xF2C5 U+9BCF # <cjk>
+0xF2C6 U+9BD1 # <cjk>
+0xF2C7 U+9BD2 # <cjk>
+0xF2C8 U+9BE3 # <cjk>
+0xF2C9 U+9BE2 # <cjk>
+0xF2CA U+9BE4 # <cjk>
+0xF2CB U+9BD4 # <cjk>
+0xF2CC U+9BE1 # <cjk>
+0xF2CD U+9C3A # <cjk>
+0xF2CE U+9BF2 # <cjk>
+0xF2CF U+9BF1 # <cjk>
+0xF2D0 U+9BF0 # <cjk>
+0xF2D1 U+9C15 # <cjk>
+0xF2D2 U+9C14 # <cjk>
+0xF2D3 U+9C09 # <cjk>
+0xF2D4 U+9C13 # <cjk>
+0xF2D5 U+9C0C # <cjk>
+0xF2D6 U+9C06 # <cjk>
+0xF2D7 U+9C08 # <cjk>
+0xF2D8 U+9C12 # <cjk>
+0xF2D9 U+9C0A # <cjk>
+0xF2DA U+9C04 # <cjk>
+0xF2DB U+9C2E # <cjk>
+0xF2DC U+9C1B # <cjk>
+0xF2DD U+9C25 # <cjk>
+0xF2DE U+9C24 # <cjk>
+0xF2DF U+9C21 # <cjk>
+0xF2E0 U+9C30 # <cjk>
+0xF2E1 U+9C47 # <cjk>
+0xF2E2 U+9C32 # <cjk>
+0xF2E3 U+9C46 # <cjk>
+0xF2E4 U+9C3E # <cjk>
+0xF2E5 U+9C5A # <cjk>
+0xF2E6 U+9C60 # <cjk>
+0xF2E7 U+9C67 # <cjk>
+0xF2E8 U+9C76 # <cjk>
+0xF2E9 U+9C78 # <cjk>
+0xF2EA U+9CE7 # <cjk>
+0xF2EB U+9CEC # <cjk>
+0xF2EC U+9CF0 # <cjk>
+0xF2ED U+9D09 # <cjk>
+0xF2EE U+9D08 # <cjk>
+0xF2EF U+9CEB # <cjk>
+0xF2F0 U+9D03 # <cjk>
+0xF2F1 U+9D06 # <cjk>
+0xF2F2 U+9D2A # <cjk>
+0xF2F3 U+9D26 # <cjk>
+0xF2F4 U+9DAF # <cjk>
+0xF2F5 U+9D23 # <cjk>
+0xF2F6 U+9D1F # <cjk>
+0xF2F7 U+9D44 # <cjk>
+0xF2F8 U+9D15 # <cjk>
+0xF2F9 U+9D12 # <cjk>
+0xF2FA U+9D41 # <cjk>
+0xF2FB U+9D3F # <cjk>
+0xF2FC U+9D3E # <cjk>
+0xF2FD U+9D46 # <cjk>
+0xF2FE U+9D48 # <cjk>
+0xF3A1 U+9D5D # <cjk>
+0xF3A2 U+9D5E # <cjk>
+0xF3A3 U+9D64 # <cjk>
+0xF3A4 U+9D51 # <cjk>
+0xF3A5 U+9D50 # <cjk>
+0xF3A6 U+9D59 # <cjk>
+0xF3A7 U+9D72 # <cjk>
+0xF3A8 U+9D89 # <cjk>
+0xF3A9 U+9D87 # <cjk>
+0xF3AA U+9DAB # <cjk>
+0xF3AB U+9D6F # <cjk>
+0xF3AC U+9D7A # <cjk>
+0xF3AD U+9D9A # <cjk>
+0xF3AE U+9DA4 # <cjk>
+0xF3AF U+9DA9 # <cjk>
+0xF3B0 U+9DB2 # <cjk>
+0xF3B1 U+9DC4 # <cjk>
+0xF3B2 U+9DC1 # <cjk>
+0xF3B3 U+9DBB # <cjk>
+0xF3B4 U+9DB8 # <cjk>
+0xF3B5 U+9DBA # <cjk>
+0xF3B6 U+9DC6 # <cjk>
+0xF3B7 U+9DCF # <cjk>
+0xF3B8 U+9DC2 # <cjk>
+0xF3B9 U+9DD9 # <cjk>
+0xF3BA U+9DD3 # <cjk>
+0xF3BB U+9DF8 # <cjk>
+0xF3BC U+9DE6 # <cjk>
+0xF3BD U+9DED # <cjk>
+0xF3BE U+9DEF # <cjk>
+0xF3BF U+9DFD # <cjk>
+0xF3C0 U+9E1A # <cjk>
+0xF3C1 U+9E1B # <cjk>
+0xF3C2 U+9E1E # <cjk>
+0xF3C3 U+9E75 # <cjk>
+0xF3C4 U+9E79 # <cjk>
+0xF3C5 U+9E7D # <cjk>
+0xF3C6 U+9E81 # <cjk>
+0xF3C7 U+9E88 # <cjk>
+0xF3C8 U+9E8B # <cjk>
+0xF3C9 U+9E8C # <cjk>
+0xF3CA U+9E92 # <cjk>
+0xF3CB U+9E95 # <cjk>
+0xF3CC U+9E91 # <cjk>
+0xF3CD U+9E9D # <cjk>
+0xF3CE U+9EA5 # <cjk>
+0xF3CF U+9EA9 # <cjk>
+0xF3D0 U+9EB8 # <cjk>
+0xF3D1 U+9EAA # <cjk>
+0xF3D2 U+9EAD # <cjk>
+0xF3D3 U+9761 # <cjk>
+0xF3D4 U+9ECC # <cjk>
+0xF3D5 U+9ECE # <cjk>
+0xF3D6 U+9ECF # <cjk>
+0xF3D7 U+9ED0 # <cjk>
+0xF3D8 U+9ED4 # <cjk>
+0xF3D9 U+9EDC # <cjk>
+0xF3DA U+9EDE # <cjk>
+0xF3DB U+9EDD # <cjk>
+0xF3DC U+9EE0 # <cjk>
+0xF3DD U+9EE5 # <cjk>
+0xF3DE U+9EE8 # <cjk>
+0xF3DF U+9EEF # <cjk>
+0xF3E0 U+9EF4 # <cjk>
+0xF3E1 U+9EF6 # <cjk>
+0xF3E2 U+9EF7 # <cjk>
+0xF3E3 U+9EF9 # <cjk>
+0xF3E4 U+9EFB # <cjk>
+0xF3E5 U+9EFC # <cjk>
+0xF3E6 U+9EFD # <cjk>
+0xF3E7 U+9F07 # <cjk>
+0xF3E8 U+9F08 # <cjk>
+0xF3E9 U+76B7 # <cjk>
+0xF3EA U+9F15 # <cjk>
+0xF3EB U+9F21 # <cjk>
+0xF3EC U+9F2C # <cjk>
+0xF3ED U+9F3E # <cjk>
+0xF3EE U+9F4A # <cjk>
+0xF3EF U+9F52 # <cjk>
+0xF3F0 U+9F54 # <cjk>
+0xF3F1 U+9F63 # <cjk>
+0xF3F2 U+9F5F # <cjk>
+0xF3F3 U+9F60 # <cjk>
+0xF3F4 U+9F61 # <cjk>
+0xF3F5 U+9F66 # <cjk>
+0xF3F6 U+9F67 # <cjk>
+0xF3F7 U+9F6C # <cjk>
+0xF3F8 U+9F6A # <cjk>
+0xF3F9 U+9F77 # <cjk>
+0xF3FA U+9F72 # <cjk>
+0xF3FB U+9F76 # <cjk>
+0xF3FC U+9F95 # <cjk>
+0xF3FD U+9F9C # <cjk>
+0xF3FE U+9FA0 # <cjk>
+0xF4A1 U+582F # <cjk> [1983]
+0xF4A2 U+69C7 # <cjk> [1983]
+0xF4A3 U+9059 # <cjk> [1983]
+0xF4A4 U+7464 # <cjk> [1983]
+0xF4A5 U+51DC # <cjk> [1990]
+0xF4A6 U+7199 # <cjk> [1990]
+0xF4A7 U+5653 # <cjk> [2004]
+0xF4A8 U+5DE2 # <cjk> [2000]
+0xF4A9 U+5E14 # <cjk> [2000]
+0xF4AA U+5E18 # <cjk> [2000]
+0xF4AB U+5E58 # <cjk> [2000]
+0xF4AC U+5E5E # <cjk> [2000]
+0xF4AD U+5EBE # <cjk> [2000]
+0xF4AE U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000]
+0xF4AF U+5ECB # <cjk> [2000]
+0xF4B0 U+5EF9 # <cjk> [2000]
+0xF4B1 U+5F00 # <cjk> [2000]
+0xF4B2 U+5F02 # <cjk> [2000]
+0xF4B3 U+5F07 # <cjk> [2000]
+0xF4B4 U+5F1D # <cjk> [2000]
+0xF4B5 U+5F23 # <cjk> [2000]
+0xF4B6 U+5F34 # <cjk> [2000]
+0xF4B7 U+5F36 # <cjk> [2000]
+0xF4B8 U+5F3D # <cjk> [2000]
+0xF4B9 U+5F40 # <cjk> [2000]
+0xF4BA U+5F45 # <cjk> [2000]
+0xF4BB U+5F54 # <cjk> [2000]
+0xF4BC U+5F58 # <cjk> [2000]
+0xF4BD U+5F64 # <cjk> [2000]
+0xF4BE U+5F67 # <cjk> [2000]
+0xF4BF U+5F7D # <cjk> [2000]
+0xF4C0 U+5F89 # <cjk> [2000]
+0xF4C1 U+5F9C # <cjk> [2000]
+0xF4C2 U+5FA7 # <cjk> [2000]
+0xF4C3 U+5FAF # <cjk> [2000]
+0xF4C4 U+5FB5 # <cjk> [2000]
+0xF4C5 U+5FB7 # <cjk> [2000]
+0xF4C6 U+5FC9 # <cjk> [2000]
+0xF4C7 U+5FDE # <cjk> [2000]
+0xF4C8 U+5FE1 # <cjk> [2000]
+0xF4C9 U+5FE9 # <cjk> [2000]
+0xF4CA U+600D # <cjk> [2000]
+0xF4CB U+6014 # <cjk> [2000]
+0xF4CC U+6018 # <cjk> [2000]
+0xF4CD U+6033 # <cjk> [2000]
+0xF4CE U+6035 # <cjk> [2000]
+0xF4CF U+6047 # <cjk> [2000]
+0xF4D0 U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2]
+0xF4D1 U+609D # <cjk> [2000]
+0xF4D2 U+609E # <cjk> [2000]
+0xF4D3 U+60CB # <cjk> [2000]
+0xF4D4 U+60D4 # <cjk> [2000]
+0xF4D5 U+60D5 # <cjk> [2000]
+0xF4D6 U+60DD # <cjk> [2000]
+0xF4D7 U+60F8 # <cjk> [2000]
+0xF4D8 U+611C # <cjk> [2000]
+0xF4D9 U+612B # <cjk> [2000]
+0xF4DA U+6130 # <cjk> [2000]
+0xF4DB U+6137 # <cjk> [2000]
+0xF4DC U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2]
+0xF4DD U+618D # <cjk> [2000]
+0xF4DE U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2]
+0xF4DF U+61BC # <cjk> [2000]
+0xF4E0 U+61B9 # <cjk> [2000]
+0xF4E1 U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2]
+0xF4E2 U+6222 # <cjk> [2000]
+0xF4E3 U+623E # <cjk> [2000]
+0xF4E4 U+6243 # <cjk> [2000]
+0xF4E5 U+6256 # <cjk> [2000]
+0xF4E6 U+625A # <cjk> [2000]
+0xF4E7 U+626F # <cjk> [2000]
+0xF4E8 U+6285 # <cjk> [2000]
+0xF4E9 U+62C4 # <cjk> [2000]
+0xF4EA U+62D6 # <cjk> [2000]
+0xF4EB U+62FC # <cjk> [2000]
+0xF4EC U+630A # <cjk> [2000]
+0xF4ED U+6318 # <cjk> [2000]
+0xF4EE U+6339 # <cjk> [2000]
+0xF4EF U+6343 # <cjk> [2000]
+0xF4F0 U+6365 # <cjk> [2000]
+0xF4F1 U+637C # <cjk> [2000]
+0xF4F2 U+63E5 # <cjk> [2000]
+0xF4F3 U+63ED # <cjk> [2000]
+0xF4F4 U+63F5 # <cjk> [2000]
+0xF4F5 U+6410 # <cjk> [2000]
+0xF4F6 U+6414 # <cjk> [2000]
+0xF4F7 U+6422 # <cjk> [2000]
+0xF4F8 U+6479 # <cjk> [2000]
+0xF4F9 U+6451 # <cjk> [2000]
+0xF4FA U+6460 # <cjk> [2000]
+0xF4FB U+646D # <cjk> [2000]
+0xF4FC U+64CE # <cjk> [2000]
+0xF4FD U+64BE # <cjk> [2000]
+0xF4FE U+64BF # <cjk> [2000]
+0xF5A1 U+64C4 # <cjk> [2000]
+0xF5A2 U+64CA # <cjk> [2000]
+0xF5A3 U+64D0 # <cjk> [2000]
+0xF5A4 U+64F7 # <cjk> [2000]
+0xF5A5 U+64FB # <cjk> [2000]
+0xF5A6 U+6522 # <cjk> [2000]
+0xF5A7 U+6529 # <cjk> [2000]
+0xF5A8 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2]
+0xF5A9 U+6567 # <cjk> [2000]
+0xF5AA U+659D # <cjk> [2000]
+0xF5AB U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2]
+0xF5AC U+6600 # <cjk> [2000]
+0xF5AD U+6609 # <cjk> [2000]
+0xF5AE U+6615 # <cjk> [2000]
+0xF5AF U+661E # <cjk> [2000]
+0xF5B0 U+663A # <cjk> [2000]
+0xF5B1 U+6622 # <cjk> [2000]
+0xF5B2 U+6624 # <cjk> [2000]
+0xF5B3 U+662B # <cjk> [2000]
+0xF5B4 U+6630 # <cjk> [2000]
+0xF5B5 U+6631 # <cjk> [2000]
+0xF5B6 U+6633 # <cjk> [2000]
+0xF5B7 U+66FB # <cjk> [2000]
+0xF5B8 U+6648 # <cjk> [2000]
+0xF5B9 U+664C # <cjk> [2000]
+0xF5BA U+231C4 # <cjk> [2000] [Unicode3.1]
+0xF5BB U+6659 # <cjk> [2000]
+0xF5BC U+665A # <cjk> [2000]
+0xF5BD U+6661 # <cjk> [2000]
+0xF5BE U+6665 # <cjk> [2000]
+0xF5BF U+6673 # <cjk> [2000]
+0xF5C0 U+6677 # <cjk> [2000]
+0xF5C1 U+6678 # <cjk> [2000]
+0xF5C2 U+668D # <cjk> [2000]
+0xF5C3 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2]
+0xF5C4 U+66A0 # <cjk> [2000]
+0xF5C5 U+66B2 # <cjk> [2000]
+0xF5C6 U+66BB # <cjk> [2000]
+0xF5C7 U+66C6 # <cjk> [2000]
+0xF5C8 U+66C8 # <cjk> [2000]
+0xF5C9 U+3B22 # <cjk> [2000]
+0xF5CA U+66DB # <cjk> [2000]
+0xF5CB U+66E8 # <cjk> [2000]
+0xF5CC U+66FA # <cjk> [2000]
+0xF5CD U+6713 # <cjk> [2000]
+0xF5CE U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000]
+0xF5CF U+6733 # <cjk> [2000]
+0xF5D0 U+6766 # <cjk> [2000]
+0xF5D1 U+6747 # <cjk> [2000]
+0xF5D2 U+6748 # <cjk> [2000]
+0xF5D3 U+677B # <cjk> [2000]
+0xF5D4 U+6781 # <cjk> [2000]
+0xF5D5 U+6793 # <cjk> [2000]
+0xF5D6 U+6798 # <cjk> [2000]
+0xF5D7 U+679B # <cjk> [2000]
+0xF5D8 U+67BB # <cjk> [2000]
+0xF5D9 U+67F9 # <cjk> [2000]
+0xF5DA U+67C0 # <cjk> [2000]
+0xF5DB U+67D7 # <cjk> [2000]
+0xF5DC U+67FC # <cjk> [2000]
+0xF5DD U+6801 # <cjk> [2000]
+0xF5DE U+6852 # <cjk> [2000]
+0xF5DF U+681D # <cjk> [2000]
+0xF5E0 U+682C # <cjk> [2000]
+0xF5E1 U+6831 # <cjk> [2000]
+0xF5E2 U+685B # <cjk> [2000]
+0xF5E3 U+6872 # <cjk> [2000]
+0xF5E4 U+6875 # <cjk> [2000]
+0xF5E5 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2]
+0xF5E6 U+68A3 # <cjk> [2000]
+0xF5E7 U+68A5 # <cjk> [2000]
+0xF5E8 U+68B2 # <cjk> [2000]
+0xF5E9 U+68C8 # <cjk> [2000]
+0xF5EA U+68D0 # <cjk> [2000]
+0xF5EB U+68E8 # <cjk> [2000]
+0xF5EC U+68ED # <cjk> [2000]
+0xF5ED U+68F0 # <cjk> [2000]
+0xF5EE U+68F1 # <cjk> [2000]
+0xF5EF U+68FC # <cjk> [2000]
+0xF5F0 U+690A # <cjk> [2000]
+0xF5F1 U+6949 # <cjk> [2000]
+0xF5F2 U+235C4 # <cjk> [2000] [Unicode3.1]
+0xF5F3 U+6935 # <cjk> [2000]
+0xF5F4 U+6942 # <cjk> [2000]
+0xF5F5 U+6957 # <cjk> [2000]
+0xF5F6 U+6963 # <cjk> [2000]
+0xF5F7 U+6964 # <cjk> [2000]
+0xF5F8 U+6968 # <cjk> [2000]
+0xF5F9 U+6980 # <cjk> [2000]
+0xF5FA U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000]
+0xF5FB U+69A5 # <cjk> [2000]
+0xF5FC U+69AD # <cjk> [2000]
+0xF5FD U+69CF # <cjk> [2000]
+0xF5FE U+3BB6 # <cjk> [2000]
+0xF6A1 U+3BC3 # <cjk> [2000]
+0xF6A2 U+69E2 # <cjk> [2000]
+0xF6A3 U+69E9 # <cjk> [2000]
+0xF6A4 U+69EA # <cjk> [2000]
+0xF6A5 U+69F5 # <cjk> [2000]
+0xF6A6 U+69F6 # <cjk> [2000]
+0xF6A7 U+6A0F # <cjk> [2000]
+0xF6A8 U+6A15 # <cjk> [2000]
+0xF6A9 U+2373F # <cjk> [2000] [Unicode3.1]
+0xF6AA U+6A3B # <cjk> [2000]
+0xF6AB U+6A3E # <cjk> [2000]
+0xF6AC U+6A45 # <cjk> [2000]
+0xF6AD U+6A50 # <cjk> [2000]
+0xF6AE U+6A56 # <cjk> [2000]
+0xF6AF U+6A5B # <cjk> [2000]
+0xF6B0 U+6A6B # <cjk> [2000]
+0xF6B1 U+6A73 # <cjk> [2000]
+0xF6B2 U+23763 # <cjk> [2000] [Unicode3.1]
+0xF6B3 U+6A89 # <cjk> [2000]
+0xF6B4 U+6A94 # <cjk> [2000]
+0xF6B5 U+6A9D # <cjk> [2000]
+0xF6B6 U+6A9E # <cjk> [2000]
+0xF6B7 U+6AA5 # <cjk> [2000]
+0xF6B8 U+6AE4 # <cjk> [2000]
+0xF6B9 U+6AE7 # <cjk> [2000]
+0xF6BA U+3C0F # <cjk> [2000]
+0xF6BB U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000]
+0xF6BC U+6B1B # <cjk> [2000]
+0xF6BD U+6B1E # <cjk> [2000]
+0xF6BE U+6B2C # <cjk> [2000]
+0xF6BF U+6B35 # <cjk> [2000]
+0xF6C0 U+6B46 # <cjk> [2000]
+0xF6C1 U+6B56 # <cjk> [2000]
+0xF6C2 U+6B60 # <cjk> [2000]
+0xF6C3 U+6B65 # <cjk> [2000]
+0xF6C4 U+6B67 # <cjk> [2000]
+0xF6C5 U+6B77 # <cjk> [2000]
+0xF6C6 U+6B82 # <cjk> [2000]
+0xF6C7 U+6BA9 # <cjk> [2000]
+0xF6C8 U+6BAD # <cjk> [2000]
+0xF6C9 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000]
+0xF6CA U+6BCF # <cjk> [2000]
+0xF6CB U+6BD6 # <cjk> [2000]
+0xF6CC U+6BD7 # <cjk> [2000]
+0xF6CD U+6BFF # <cjk> [2000]
+0xF6CE U+6C05 # <cjk> [2000]
+0xF6CF U+6C10 # <cjk> [2000]
+0xF6D0 U+6C33 # <cjk> [2000]
+0xF6D1 U+6C59 # <cjk> [2000]
+0xF6D2 U+6C5C # <cjk> [2000]
+0xF6D3 U+6CAA # <cjk> [2000]
+0xF6D4 U+6C74 # <cjk> [2000]
+0xF6D5 U+6C76 # <cjk> [2000]
+0xF6D6 U+6C85 # <cjk> [2000]
+0xF6D7 U+6C86 # <cjk> [2000]
+0xF6D8 U+6C98 # <cjk> [2000]
+0xF6D9 U+6C9C # <cjk> [2000]
+0xF6DA U+6CFB # <cjk> [2000]
+0xF6DB U+6CC6 # <cjk> [2000]
+0xF6DC U+6CD4 # <cjk> [2000]
+0xF6DD U+6CE0 # <cjk> [2000]
+0xF6DE U+6CEB # <cjk> [2000]
+0xF6DF U+6CEE # <cjk> [2000]
+0xF6E0 U+23CFE # <cjk> [2000] [Unicode3.1]
+0xF6E1 U+6D04 # <cjk> [2000]
+0xF6E2 U+6D0E # <cjk> [2000]
+0xF6E3 U+6D2E # <cjk> [2000]
+0xF6E4 U+6D31 # <cjk> [2000]
+0xF6E5 U+6D39 # <cjk> [2000]
+0xF6E6 U+6D3F # <cjk> [2000]
+0xF6E7 U+6D58 # <cjk> [2000]
+0xF6E8 U+6D65 # <cjk> [2000]
+0xF6E9 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2]
+0xF6EA U+6D82 # <cjk> [2000]
+0xF6EB U+6D87 # <cjk> [2000]
+0xF6EC U+6D89 # <cjk> [2000]
+0xF6ED U+6D94 # <cjk> [2000]
+0xF6EE U+6DAA # <cjk> [2000]
+0xF6EF U+6DAC # <cjk> [2000]
+0xF6F0 U+6DBF # <cjk> [2000]
+0xF6F1 U+6DC4 # <cjk> [2000]
+0xF6F2 U+6DD6 # <cjk> [2000]
+0xF6F3 U+6DDA # <cjk> [2000]
+0xF6F4 U+6DDB # <cjk> [2000]
+0xF6F5 U+6DDD # <cjk> [2000]
+0xF6F6 U+6DFC # <cjk> [2000]
+0xF6F7 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2]
+0xF6F8 U+6E34 # <cjk> [2000]
+0xF6F9 U+6E44 # <cjk> [2000]
+0xF6FA U+6E5C # <cjk> [2000]
+0xF6FB U+6E5E # <cjk> [2000]
+0xF6FC U+6EAB # <cjk> [2000]
+0xF6FD U+6EB1 # <cjk> [2000]
+0xF6FE U+6EC1 # <cjk> [2000]
+0xF7A1 U+6EC7 # <cjk> [2000]
+0xF7A2 U+6ECE # <cjk> [2000]
+0xF7A3 U+6F10 # <cjk> [2000]
+0xF7A4 U+6F1A # <cjk> [2000]
+0xF7A5 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2]
+0xF7A6 U+6F2A # <cjk> [2000]
+0xF7A7 U+6F2F # <cjk> [2000]
+0xF7A8 U+6F33 # <cjk> [2000]
+0xF7A9 U+6F51 # <cjk> [2000]
+0xF7AA U+6F59 # <cjk> [2000]
+0xF7AB U+6F5E # <cjk> [2000]
+0xF7AC U+6F61 # <cjk> [2000]
+0xF7AD U+6F62 # <cjk> [2000]
+0xF7AE U+6F7E # <cjk> [2000]
+0xF7AF U+6F88 # <cjk> [2000]
+0xF7B0 U+6F8C # <cjk> [2000]
+0xF7B1 U+6F8D # <cjk> [2000]
+0xF7B2 U+6F94 # <cjk> [2000]
+0xF7B3 U+6FA0 # <cjk> [2000]
+0xF7B4 U+6FA7 # <cjk> [2000]
+0xF7B5 U+6FB6 # <cjk> [2000]
+0xF7B6 U+6FBC # <cjk> [2000]
+0xF7B7 U+6FC7 # <cjk> [2000]
+0xF7B8 U+6FCA # <cjk> [2000]
+0xF7B9 U+6FF9 # <cjk> [2000]
+0xF7BA U+6FF0 # <cjk> [2000]
+0xF7BB U+6FF5 # <cjk> [2000]
+0xF7BC U+7005 # <cjk> [2000]
+0xF7BD U+7006 # <cjk> [2000]
+0xF7BE U+7028 # <cjk> [2000]
+0xF7BF U+704A # <cjk> [2000]
+0xF7C0 U+705D # <cjk> [2000]
+0xF7C1 U+705E # <cjk> [2000]
+0xF7C2 U+704E # <cjk> [2000]
+0xF7C3 U+7064 # <cjk> [2000]
+0xF7C4 U+7075 # <cjk> [2000]
+0xF7C5 U+7085 # <cjk> [2000]
+0xF7C6 U+70A4 # <cjk> [2000]
+0xF7C7 U+70AB # <cjk> [2000]
+0xF7C8 U+70B7 # <cjk> [2000]
+0xF7C9 U+70D4 # <cjk> [2000]
+0xF7CA U+70D8 # <cjk> [2000]
+0xF7CB U+70E4 # <cjk> [2000]
+0xF7CC U+710F # <cjk> [2000]
+0xF7CD U+712B # <cjk> [2000]
+0xF7CE U+711E # <cjk> [2000]
+0xF7CF U+7120 # <cjk> [2000]
+0xF7D0 U+712E # <cjk> [2000]
+0xF7D1 U+7130 # <cjk> [2000]
+0xF7D2 U+7146 # <cjk> [2000]
+0xF7D3 U+7147 # <cjk> [2000]
+0xF7D4 U+7151 # <cjk> [2000]
+0xF7D5 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2]
+0xF7D6 U+7152 # <cjk> [2000]
+0xF7D7 U+715C # <cjk> [2000]
+0xF7D8 U+7160 # <cjk> [2000]
+0xF7D9 U+7168 # <cjk> [2000]
+0xF7DA U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000]
+0xF7DB U+7185 # <cjk> [2000]
+0xF7DC U+7187 # <cjk> [2000]
+0xF7DD U+7192 # <cjk> [2000]
+0xF7DE U+71C1 # <cjk> [2000]
+0xF7DF U+71BA # <cjk> [2000]
+0xF7E0 U+71C4 # <cjk> [2000]
+0xF7E1 U+71FE # <cjk> [2000]
+0xF7E2 U+7200 # <cjk> [2000]
+0xF7E3 U+7215 # <cjk> [2000]
+0xF7E4 U+7255 # <cjk> [2000]
+0xF7E5 U+7256 # <cjk> [2000]
+0xF7E6 U+3E3F # <cjk> [2000]
+0xF7E7 U+728D # <cjk> [2000]
+0xF7E8 U+729B # <cjk> [2000]
+0xF7E9 U+72BE # <cjk> [2000]
+0xF7EA U+72C0 # <cjk> [2000]
+0xF7EB U+72FB # <cjk> [2000]
+0xF7EC U+247F1 # <cjk> [2000] [Unicode3.1]
+0xF7ED U+7327 # <cjk> [2000]
+0xF7EE U+7328 # <cjk> [2000]
+0xF7EF U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000]
+0xF7F0 U+7350 # <cjk> [2000]
+0xF7F1 U+7366 # <cjk> [2000]
+0xF7F2 U+737C # <cjk> [2000]
+0xF7F3 U+7395 # <cjk> [2000]
+0xF7F4 U+739F # <cjk> [2000]
+0xF7F5 U+73A0 # <cjk> [2000]
+0xF7F6 U+73A2 # <cjk> [2000]
+0xF7F7 U+73A6 # <cjk> [2000]
+0xF7F8 U+73AB # <cjk> [2000]
+0xF7F9 U+73C9 # <cjk> [2000]
+0xF7FA U+73CF # <cjk> [2000]
+0xF7FB U+73D6 # <cjk> [2000]
+0xF7FC U+73D9 # <cjk> [2000]
+0xF7FD U+73E3 # <cjk> [2000]
+0xF7FE U+73E9 # <cjk> [2000]
+0xF8A1 U+7407 # <cjk> [2000]
+0xF8A2 U+740A # <cjk> [2000]
+0xF8A3 U+741A # <cjk> [2000]
+0xF8A4 U+741B # <cjk> [2000]
+0xF8A5 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2]
+0xF8A6 U+7426 # <cjk> [2000]
+0xF8A7 U+7428 # <cjk> [2000]
+0xF8A8 U+742A # <cjk> [2000]
+0xF8A9 U+742B # <cjk> [2000]
+0xF8AA U+742C # <cjk> [2000]
+0xF8AB U+742E # <cjk> [2000]
+0xF8AC U+742F # <cjk> [2000]
+0xF8AD U+7430 # <cjk> [2000]
+0xF8AE U+7444 # <cjk> [2000]
+0xF8AF U+7446 # <cjk> [2000]
+0xF8B0 U+7447 # <cjk> [2000]
+0xF8B1 U+744B # <cjk> [2000]
+0xF8B2 U+7457 # <cjk> [2000]
+0xF8B3 U+7462 # <cjk> [2000]
+0xF8B4 U+746B # <cjk> [2000]
+0xF8B5 U+746D # <cjk> [2000]
+0xF8B6 U+7486 # <cjk> [2000]
+0xF8B7 U+7487 # <cjk> [2000]
+0xF8B8 U+7489 # <cjk> [2000]
+0xF8B9 U+7498 # <cjk> [2000]
+0xF8BA U+749C # <cjk> [2000]
+0xF8BB U+749F # <cjk> [2000]
+0xF8BC U+74A3 # <cjk> [2000]
+0xF8BD U+7490 # <cjk> [2000]
+0xF8BE U+74A6 # <cjk> [2000]
+0xF8BF U+74A8 # <cjk> [2000]
+0xF8C0 U+74A9 # <cjk> [2000]
+0xF8C1 U+74B5 # <cjk> [2000]
+0xF8C2 U+74BF # <cjk> [2000]
+0xF8C3 U+74C8 # <cjk> [2000]
+0xF8C4 U+74C9 # <cjk> [2000]
+0xF8C5 U+74DA # <cjk> [2000]
+0xF8C6 U+74FF # <cjk> [2000]
+0xF8C7 U+7501 # <cjk> [2000]
+0xF8C8 U+7517 # <cjk> [2000]
+0xF8C9 U+752F # <cjk> [2000]
+0xF8CA U+756F # <cjk> [2000]
+0xF8CB U+7579 # <cjk> [2000]
+0xF8CC U+7592 # <cjk> [2000]
+0xF8CD U+3F72 # <cjk> [2000]
+0xF8CE U+75CE # <cjk> [2000]
+0xF8CF U+75E4 # <cjk> [2000]
+0xF8D0 U+7600 # <cjk> [2000]
+0xF8D1 U+7602 # <cjk> [2000]
+0xF8D2 U+7608 # <cjk> [2000]
+0xF8D3 U+7615 # <cjk> [2000]
+0xF8D4 U+7616 # <cjk> [2000]
+0xF8D5 U+7619 # <cjk> [2000]
+0xF8D6 U+761E # <cjk> [2000]
+0xF8D7 U+762D # <cjk> [2000]
+0xF8D8 U+7635 # <cjk> [2000]
+0xF8D9 U+7643 # <cjk> [2000]
+0xF8DA U+764B # <cjk> [2000]
+0xF8DB U+7664 # <cjk> [2000]
+0xF8DC U+7665 # <cjk> [2000]
+0xF8DD U+766D # <cjk> [2000]
+0xF8DE U+766F # <cjk> [2000]
+0xF8DF U+7671 # <cjk> [2000]
+0xF8E0 U+7681 # <cjk> [2000]
+0xF8E1 U+769B # <cjk> [2000]
+0xF8E2 U+769D # <cjk> [2000]
+0xF8E3 U+769E # <cjk> [2000]
+0xF8E4 U+76A6 # <cjk> [2000]
+0xF8E5 U+76AA # <cjk> [2000]
+0xF8E6 U+76B6 # <cjk> [2000]
+0xF8E7 U+76C5 # <cjk> [2000]
+0xF8E8 U+76CC # <cjk> [2000]
+0xF8E9 U+76CE # <cjk> [2000]
+0xF8EA U+76D4 # <cjk> [2000]
+0xF8EB U+76E6 # <cjk> [2000]
+0xF8EC U+76F1 # <cjk> [2000]
+0xF8ED U+76FC # <cjk> [2000]
+0xF8EE U+770A # <cjk> [2000]
+0xF8EF U+7719 # <cjk> [2000]
+0xF8F0 U+7734 # <cjk> [2000]
+0xF8F1 U+7736 # <cjk> [2000]
+0xF8F2 U+7746 # <cjk> [2000]
+0xF8F3 U+774D # <cjk> [2000]
+0xF8F4 U+774E # <cjk> [2000]
+0xF8F5 U+775C # <cjk> [2000]
+0xF8F6 U+775F # <cjk> [2000]
+0xF8F7 U+7762 # <cjk> [2000]
+0xF8F8 U+777A # <cjk> [2000]
+0xF8F9 U+7780 # <cjk> [2000]
+0xF8FA U+7794 # <cjk> [2000]
+0xF8FB U+77AA # <cjk> [2000]
+0xF8FC U+77E0 # <cjk> [2000]
+0xF8FD U+782D # <cjk> [2000]
+0xF8FE U+2548E # <cjk> [2000] [Unicode3.1]
+0xF9A1 U+7843 # <cjk> [2000]
+0xF9A2 U+784E # <cjk> [2000]
+0xF9A3 U+784F # <cjk> [2000]
+0xF9A4 U+7851 # <cjk> [2000]
+0xF9A5 U+7868 # <cjk> [2000]
+0xF9A6 U+786E # <cjk> [2000]
+0xF9A7 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2]
+0xF9A8 U+78B0 # <cjk> [2000]
+0xF9A9 U+2550E # <cjk> [2000] [Unicode3.1]
+0xF9AA U+78AD # <cjk> [2000]
+0xF9AB U+78E4 # <cjk> [2000]
+0xF9AC U+78F2 # <cjk> [2000]
+0xF9AD U+7900 # <cjk> [2000]
+0xF9AE U+78F7 # <cjk> [2000]
+0xF9AF U+791C # <cjk> [2000]
+0xF9B0 U+792E # <cjk> [2000]
+0xF9B1 U+7931 # <cjk> [2000]
+0xF9B2 U+7934 # <cjk> [2000]
+0xF9B3 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2]
+0xF9B4 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2]
+0xF9B5 U+7945 # <cjk> [2000]
+0xF9B6 U+7946 # <cjk> [2000]
+0xF9B7 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2]
+0xF9B8 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2]
+0xF9B9 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2]
+0xF9BA U+795C # <cjk> [2000]
+0xF9BB U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2]
+0xF9BC U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000]
+0xF9BD U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000]
+0xF9BE U+7979 # <cjk> [2000]
+0xF9BF U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2]
+0xF9C0 U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2]
+0xF9C1 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000]
+0xF9C2 U+7998 # <cjk> [2000]
+0xF9C3 U+79B1 # <cjk> [2000]
+0xF9C4 U+79B8 # <cjk> [2000]
+0xF9C5 U+79C8 # <cjk> [2000]
+0xF9C6 U+79CA # <cjk> [2000]
+0xF9C7 U+25771 # <cjk> [2000] [Unicode3.1]
+0xF9C8 U+79D4 # <cjk> [2000]
+0xF9C9 U+79DE # <cjk> [2000]
+0xF9CA U+79EB # <cjk> [2000]
+0xF9CB U+79ED # <cjk> [2000]
+0xF9CC U+7A03 # <cjk> [2000]
+0xF9CD U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2]
+0xF9CE U+7A39 # <cjk> [2000]
+0xF9CF U+7A5D # <cjk> [2000]
+0xF9D0 U+7A6D # <cjk> [2000]
+0xF9D1 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2]
+0xF9D2 U+7A85 # <cjk> [2000]
+0xF9D3 U+7AA0 # <cjk> [2000]
+0xF9D4 U+259C4 # <cjk> [2000] [Unicode3.1]
+0xF9D5 U+7AB3 # <cjk> [2000]
+0xF9D6 U+7ABB # <cjk> [2000]
+0xF9D7 U+7ACE # <cjk> [2000]
+0xF9D8 U+7AEB # <cjk> [2000]
+0xF9D9 U+7AFD # <cjk> [2000]
+0xF9DA U+7B12 # <cjk> [2000]
+0xF9DB U+7B2D # <cjk> [2000]
+0xF9DC U+7B3B # <cjk> [2000]
+0xF9DD U+7B47 # <cjk> [2000]
+0xF9DE U+7B4E # <cjk> [2000]
+0xF9DF U+7B60 # <cjk> [2000]
+0xF9E0 U+7B6D # <cjk> [2000]
+0xF9E1 U+7B6F # <cjk> [2000]
+0xF9E2 U+7B72 # <cjk> [2000]
+0xF9E3 U+7B9E # <cjk> [2000]
+0xF9E4 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2]
+0xF9E5 U+7BD7 # <cjk> [2000]
+0xF9E6 U+7BD9 # <cjk> [2000]
+0xF9E7 U+7C01 # <cjk> [2000]
+0xF9E8 U+7C31 # <cjk> [2000]
+0xF9E9 U+7C1E # <cjk> [2000]
+0xF9EA U+7C20 # <cjk> [2000]
+0xF9EB U+7C33 # <cjk> [2000]
+0xF9EC U+7C36 # <cjk> [2000]
+0xF9ED U+4264 # <cjk> [2000]
+0xF9EE U+25DA1 # <cjk> [2000] [Unicode3.1]
+0xF9EF U+7C59 # <cjk> [2000]
+0xF9F0 U+7C6D # <cjk> [2000]
+0xF9F1 U+7C79 # <cjk> [2000]
+0xF9F2 U+7C8F # <cjk> [2000]
+0xF9F3 U+7C94 # <cjk> [2000]
+0xF9F4 U+7CA0 # <cjk> [2000]
+0xF9F5 U+7CBC # <cjk> [2000]
+0xF9F6 U+7CD5 # <cjk> [2000]
+0xF9F7 U+7CD9 # <cjk> [2000]
+0xF9F8 U+7CDD # <cjk> [2000]
+0xF9F9 U+7D07 # <cjk> [2000]
+0xF9FA U+7D08 # <cjk> [2000]
+0xF9FB U+7D13 # <cjk> [2000]
+0xF9FC U+7D1D # <cjk> [2000]
+0xF9FD U+7D23 # <cjk> [2000]
+0xF9FE U+7D31 # <cjk> [2000]
+0xFAA1 U+7D41 # <cjk> [2000]
+0xFAA2 U+7D48 # <cjk> [2000]
+0xFAA3 U+7D53 # <cjk> [2000]
+0xFAA4 U+7D5C # <cjk> [2000]
+0xFAA5 U+7D7A # <cjk> [2000]
+0xFAA6 U+7D83 # <cjk> [2000]
+0xFAA7 U+7D8B # <cjk> [2000]
+0xFAA8 U+7DA0 # <cjk> [2000]
+0xFAA9 U+7DA6 # <cjk> [2000]
+0xFAAA U+7DC2 # <cjk> [2000]
+0xFAAB U+7DCC # <cjk> [2000]
+0xFAAC U+7DD6 # <cjk> [2000]
+0xFAAD U+7DE3 # <cjk> [2000]
+0xFAAE U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2]
+0xFAAF U+7E28 # <cjk> [2000]
+0xFAB0 U+7E08 # <cjk> [2000]
+0xFAB1 U+7E11 # <cjk> [2000]
+0xFAB2 U+7E15 # <cjk> [2000]
+0xFAB3 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2]
+0xFAB4 U+7E47 # <cjk> [2000]
+0xFAB5 U+7E52 # <cjk> [2000]
+0xFAB6 U+7E61 # <cjk> [2000]
+0xFAB7 U+7E8A # <cjk> [2000]
+0xFAB8 U+7E8D # <cjk> [2000]
+0xFAB9 U+7F47 # <cjk> [2000]
+0xFABA U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2]
+0xFABB U+7F91 # <cjk> [2000]
+0xFABC U+7F97 # <cjk> [2000]
+0xFABD U+7FBF # <cjk> [2000]
+0xFABE U+7FCE # <cjk> [2000]
+0xFABF U+7FDB # <cjk> [2000]
+0xFAC0 U+7FDF # <cjk> [2000]
+0xFAC1 U+7FEC # <cjk> [2000]
+0xFAC2 U+7FEE # <cjk> [2000]
+0xFAC3 U+7FFA # <cjk> [2000]
+0xFAC4 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2]
+0xFAC5 U+8014 # <cjk> [2000]
+0xFAC6 U+8026 # <cjk> [2000]
+0xFAC7 U+8035 # <cjk> [2000]
+0xFAC8 U+8037 # <cjk> [2000]
+0xFAC9 U+803C # <cjk> [2000]
+0xFACA U+80CA # <cjk> [2000]
+0xFACB U+80D7 # <cjk> [2000]
+0xFACC U+80E0 # <cjk> [2000]
+0xFACD U+80F3 # <cjk> [2000]
+0xFACE U+8118 # <cjk> [2000]
+0xFACF U+814A # <cjk> [2000]
+0xFAD0 U+8160 # <cjk> [2000]
+0xFAD1 U+8167 # <cjk> [2000]
+0xFAD2 U+8168 # <cjk> [2000]
+0xFAD3 U+816D # <cjk> [2000]
+0xFAD4 U+81BB # <cjk> [2000]
+0xFAD5 U+81CA # <cjk> [2000]
+0xFAD6 U+81CF # <cjk> [2000]
+0xFAD7 U+81D7 # <cjk> [2000]
+0xFAD8 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2]
+0xFAD9 U+4453 # <cjk> [2000]
+0xFADA U+445B # <cjk> [2000]
+0xFADB U+8260 # <cjk> [2000]
+0xFADC U+8274 # <cjk> [2000]
+0xFADD U+26AFF # <cjk> [2000] [Unicode3.1]
+0xFADE U+828E # <cjk> [2000]
+0xFADF U+82A1 # <cjk> [2000]
+0xFAE0 U+82A3 # <cjk> [2000]
+0xFAE1 U+82A4 # <cjk> [2000]
+0xFAE2 U+82A9 # <cjk> [2000]
+0xFAE3 U+82AE # <cjk> [2000]
+0xFAE4 U+82B7 # <cjk> [2000]
+0xFAE5 U+82BE # <cjk> [2000]
+0xFAE6 U+82BF # <cjk> [2000]
+0xFAE7 U+82C6 # <cjk> [2000]
+0xFAE8 U+82D5 # <cjk> [2000]
+0xFAE9 U+82FD # <cjk> [2000]
+0xFAEA U+82FE # <cjk> [2000]
+0xFAEB U+8300 # <cjk> [2000]
+0xFAEC U+8301 # <cjk> [2000]
+0xFAED U+8362 # <cjk> [2000]
+0xFAEE U+8322 # <cjk> [2000]
+0xFAEF U+832D # <cjk> [2000]
+0xFAF0 U+833A # <cjk> [2000]
+0xFAF1 U+8343 # <cjk> [2000]
+0xFAF2 U+8347 # <cjk> [2000]
+0xFAF3 U+8351 # <cjk> [2000]
+0xFAF4 U+8355 # <cjk> [2000]
+0xFAF5 U+837D # <cjk> [2000]
+0xFAF6 U+8386 # <cjk> [2000]
+0xFAF7 U+8392 # <cjk> [2000]
+0xFAF8 U+8398 # <cjk> [2000]
+0xFAF9 U+83A7 # <cjk> [2000]
+0xFAFA U+83A9 # <cjk> [2000]
+0xFAFB U+83BF # <cjk> [2000]
+0xFAFC U+83C0 # <cjk> [2000]
+0xFAFD U+83C7 # <cjk> [2000]
+0xFAFE U+83CF # <cjk> [2000]
+0xFBA1 U+83D1 # <cjk> [2000]
+0xFBA2 U+83E1 # <cjk> [2000]
+0xFBA3 U+83EA # <cjk> [2000]
+0xFBA4 U+8401 # <cjk> [2000]
+0xFBA5 U+8406 # <cjk> [2000]
+0xFBA6 U+840A # <cjk> [2000]
+0xFBA7 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2]
+0xFBA8 U+8448 # <cjk> [2000]
+0xFBA9 U+845F # <cjk> [2000]
+0xFBAA U+8470 # <cjk> [2000]
+0xFBAB U+8473 # <cjk> [2000]
+0xFBAC U+8485 # <cjk> [2000]
+0xFBAD U+849E # <cjk> [2000]
+0xFBAE U+84AF # <cjk> [2000]
+0xFBAF U+84B4 # <cjk> [2000]
+0xFBB0 U+84BA # <cjk> [2000]
+0xFBB1 U+84C0 # <cjk> [2000]
+0xFBB2 U+84C2 # <cjk> [2000]
+0xFBB3 U+26E40 # <cjk> [2000] [Unicode3.1]
+0xFBB4 U+8532 # <cjk> [2000]
+0xFBB5 U+851E # <cjk> [2000]
+0xFBB6 U+8523 # <cjk> [2000]
+0xFBB7 U+852F # <cjk> [2000]
+0xFBB8 U+8559 # <cjk> [2000]
+0xFBB9 U+8564 # <cjk> [2000]
+0xFBBA U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000]
+0xFBBB U+85AD # <cjk> [2000]
+0xFBBC U+857A # <cjk> [2000]
+0xFBBD U+858C # <cjk> [2000]
+0xFBBE U+858F # <cjk> [2000]
+0xFBBF U+85A2 # <cjk> [2000]
+0xFBC0 U+85B0 # <cjk> [2000]
+0xFBC1 U+85CB # <cjk> [2000]
+0xFBC2 U+85CE # <cjk> [2000]
+0xFBC3 U+85ED # <cjk> [2000]
+0xFBC4 U+8612 # <cjk> [2000]
+0xFBC5 U+85FF # <cjk> [2000]
+0xFBC6 U+8604 # <cjk> [2000]
+0xFBC7 U+8605 # <cjk> [2000]
+0xFBC8 U+8610 # <cjk> [2000]
+0xFBC9 U+270F4 # <cjk> [2000] [Unicode3.1]
+0xFBCA U+8618 # <cjk> [2000]
+0xFBCB U+8629 # <cjk> [2000]
+0xFBCC U+8638 # <cjk> [2000]
+0xFBCD U+8657 # <cjk> [2000]
+0xFBCE U+865B # <cjk> [2000]
+0xFBCF U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000]
+0xFBD0 U+8662 # <cjk> [2000]
+0xFBD1 U+459D # <cjk> [2000]
+0xFBD2 U+866C # <cjk> [2000]
+0xFBD3 U+8675 # <cjk> [2000]
+0xFBD4 U+8698 # <cjk> [2000]
+0xFBD5 U+86B8 # <cjk> [2000]
+0xFBD6 U+86FA # <cjk> [2000]
+0xFBD7 U+86FC # <cjk> [2000]
+0xFBD8 U+86FD # <cjk> [2000]
+0xFBD9 U+870B # <cjk> [2000]
+0xFBDA U+8771 # <cjk> [2000]
+0xFBDB U+8787 # <cjk> [2000]
+0xFBDC U+8788 # <cjk> [2000]
+0xFBDD U+87AC # <cjk> [2000]
+0xFBDE U+87AD # <cjk> [2000]
+0xFBDF U+87B5 # <cjk> [2000]
+0xFBE0 U+45EA # <cjk> [2000]
+0xFBE1 U+87D6 # <cjk> [2000]
+0xFBE2 U+87EC # <cjk> [2000]
+0xFBE3 U+8806 # <cjk> [2000]
+0xFBE4 U+880A # <cjk> [2000]
+0xFBE5 U+8810 # <cjk> [2000]
+0xFBE6 U+8814 # <cjk> [2000]
+0xFBE7 U+881F # <cjk> [2000]
+0xFBE8 U+8898 # <cjk> [2000]
+0xFBE9 U+88AA # <cjk> [2000]
+0xFBEA U+88CA # <cjk> [2000]
+0xFBEB U+88CE # <cjk> [2000]
+0xFBEC U+27684 # <cjk> [2000] [Unicode3.1]
+0xFBED U+88F5 # <cjk> [2000]
+0xFBEE U+891C # <cjk> [2000]
+0xFBEF U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2]
+0xFBF0 U+8918 # <cjk> [2000]
+0xFBF1 U+8919 # <cjk> [2000]
+0xFBF2 U+891A # <cjk> [2000]
+0xFBF3 U+8927 # <cjk> [2000]
+0xFBF4 U+8930 # <cjk> [2000]
+0xFBF5 U+8932 # <cjk> [2000]
+0xFBF6 U+8939 # <cjk> [2000]
+0xFBF7 U+8940 # <cjk> [2000]
+0xFBF8 U+8994 # <cjk> [2000]
+0xFBF9 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2]
+0xFBFA U+89D4 # <cjk> [2000]
+0xFBFB U+89E5 # <cjk> [2000]
+0xFBFC U+89F6 # <cjk> [2000]
+0xFBFD U+8A12 # <cjk> [2000]
+0xFBFE U+8A15 # <cjk> [2000]
+0xFCA1 U+8A22 # <cjk> [2000]
+0xFCA2 U+8A37 # <cjk> [2000]
+0xFCA3 U+8A47 # <cjk> [2000]
+0xFCA4 U+8A4E # <cjk> [2000]
+0xFCA5 U+8A5D # <cjk> [2000]
+0xFCA6 U+8A61 # <cjk> [2000]
+0xFCA7 U+8A75 # <cjk> [2000]
+0xFCA8 U+8A79 # <cjk> [2000]
+0xFCA9 U+8AA7 # <cjk> [2000]
+0xFCAA U+8AD0 # <cjk> [2000]
+0xFCAB U+8ADF # <cjk> [2000]
+0xFCAC U+8AF4 # <cjk> [2000]
+0xFCAD U+8AF6 # <cjk> [2000]
+0xFCAE U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000]
+0xFCAF U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2]
+0xFCB0 U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2]
+0xFCB1 U+8B46 # <cjk> [2000]
+0xFCB2 U+8B54 # <cjk> [2000]
+0xFCB3 U+8B59 # <cjk> [2000]
+0xFCB4 U+8B69 # <cjk> [2000]
+0xFCB5 U+8B9D # <cjk> [2000]
+0xFCB6 U+8C49 # <cjk> [2000]
+0xFCB7 U+8C68 # <cjk> [2000]
+0xFCB8 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2]
+0xFCB9 U+8CE1 # <cjk> [2000]
+0xFCBA U+8CF4 # <cjk> [2000]
+0xFCBB U+8CF8 # <cjk> [2000]
+0xFCBC U+8CFE # <cjk> [2000]
+0xFCBD U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2]
+0xFCBE U+8D12 # <cjk> [2000]
+0xFCBF U+8D1B # <cjk> [2000]
+0xFCC0 U+8DAF # <cjk> [2000]
+0xFCC1 U+8DCE # <cjk> [2000]
+0xFCC2 U+8DD1 # <cjk> [2000]
+0xFCC3 U+8DD7 # <cjk> [2000]
+0xFCC4 U+8E20 # <cjk> [2000]
+0xFCC5 U+8E23 # <cjk> [2000]
+0xFCC6 U+8E3D # <cjk> [2000]
+0xFCC7 U+8E70 # <cjk> [2000]
+0xFCC8 U+8E7B # <cjk> [2000]
+0xFCC9 U+28277 # <cjk> [2000] [Unicode3.1]
+0xFCCA U+8EC0 # <cjk> [2000]
+0xFCCB U+4844 # <cjk> [2000]
+0xFCCC U+8EFA # <cjk> [2000]
+0xFCCD U+8F1E # <cjk> [2000]
+0xFCCE U+8F2D # <cjk> [2000]
+0xFCCF U+8F36 # <cjk> [2000]
+0xFCD0 U+8F54 # <cjk> [2000]
+0xFCD1 U+283CD # <cjk> [2000] [Unicode3.1]
+0xFCD2 U+8FA6 # <cjk> [2000]
+0xFCD3 U+8FB5 # <cjk> [2000]
+0xFCD4 U+8FE4 # <cjk> [2000]
+0xFCD5 U+8FE8 # <cjk> [2000]
+0xFCD6 U+8FEE # <cjk> [2000]
+0xFCD7 U+9008 # <cjk> [2000]
+0xFCD8 U+902D # <cjk> [2000]
+0xFCD9 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2]
+0xFCDA U+9088 # <cjk> [2000]
+0xFCDB U+9095 # <cjk> [2000]
+0xFCDC U+9097 # <cjk> [2000]
+0xFCDD U+9099 # <cjk> [2000]
+0xFCDE U+909B # <cjk> [2000]
+0xFCDF U+90A2 # <cjk> [2000]
+0xFCE0 U+90B3 # <cjk> [2000]
+0xFCE1 U+90BE # <cjk> [2000]
+0xFCE2 U+90C4 # <cjk> [2000]
+0xFCE3 U+90C5 # <cjk> [2000]
+0xFCE4 U+90C7 # <cjk> [2000]
+0xFCE5 U+90D7 # <cjk> [2000]
+0xFCE6 U+90DD # <cjk> [2000]
+0xFCE7 U+90DE # <cjk> [2000]
+0xFCE8 U+90EF # <cjk> [2000]
+0xFCE9 U+90F4 # <cjk> [2000]
+0xFCEA U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000]
+0xFCEB U+9114 # <cjk> [2000]
+0xFCEC U+9115 # <cjk> [2000]
+0xFCED U+9116 # <cjk> [2000]
+0xFCEE U+9122 # <cjk> [2000]
+0xFCEF U+9123 # <cjk> [2000]
+0xFCF0 U+9127 # <cjk> [2000]
+0xFCF1 U+912F # <cjk> [2000]
+0xFCF2 U+9131 # <cjk> [2000]
+0xFCF3 U+9134 # <cjk> [2000]
+0xFCF4 U+913D # <cjk> [2000]
+0xFCF5 U+9148 # <cjk> [2000]
+0xFCF6 U+915B # <cjk> [2000]
+0xFCF7 U+9183 # <cjk> [2000]
+0xFCF8 U+919E # <cjk> [2000]
+0xFCF9 U+91AC # <cjk> [2000]
+0xFCFA U+91B1 # <cjk> [2000]
+0xFCFB U+91BC # <cjk> [2000]
+0xFCFC U+91D7 # <cjk> [2000]
+0xFCFD U+91FB # <cjk> [2000]
+0xFCFE U+91E4 # <cjk> [2000]
+0xFDA1 U+91E5 # <cjk> [2000]
+0xFDA2 U+91ED # <cjk> [2000]
+0xFDA3 U+91F1 # <cjk> [2000]
+0xFDA4 U+9207 # <cjk> [2000]
+0xFDA5 U+9210 # <cjk> [2000]
+0xFDA6 U+9238 # <cjk> [2000]
+0xFDA7 U+9239 # <cjk> [2000]
+0xFDA8 U+923A # <cjk> [2000]
+0xFDA9 U+923C # <cjk> [2000]
+0xFDAA U+9240 # <cjk> [2000]
+0xFDAB U+9243 # <cjk> [2000]
+0xFDAC U+924F # <cjk> [2000]
+0xFDAD U+9278 # <cjk> [2000]
+0xFDAE U+9288 # <cjk> [2000]
+0xFDAF U+92C2 # <cjk> [2000]
+0xFDB0 U+92CB # <cjk> [2000]
+0xFDB1 U+92CC # <cjk> [2000]
+0xFDB2 U+92D3 # <cjk> [2000]
+0xFDB3 U+92E0 # <cjk> [2000]
+0xFDB4 U+92FF # <cjk> [2000]
+0xFDB5 U+9304 # <cjk> [2000]
+0xFDB6 U+931F # <cjk> [2000]
+0xFDB7 U+9321 # <cjk> [2000]
+0xFDB8 U+9325 # <cjk> [2000]
+0xFDB9 U+9348 # <cjk> [2000]
+0xFDBA U+9349 # <cjk> [2000]
+0xFDBB U+934A # <cjk> [2000]
+0xFDBC U+9364 # <cjk> [2000]
+0xFDBD U+9365 # <cjk> [2000]
+0xFDBE U+936A # <cjk> [2000]
+0xFDBF U+9370 # <cjk> [2000]
+0xFDC0 U+939B # <cjk> [2000]
+0xFDC1 U+93A3 # <cjk> [2000]
+0xFDC2 U+93BA # <cjk> [2000]
+0xFDC3 U+93C6 # <cjk> [2000]
+0xFDC4 U+93DE # <cjk> [2000]
+0xFDC5 U+93DF # <cjk> [2000]
+0xFDC6 U+9404 # <cjk> [2000]
+0xFDC7 U+93FD # <cjk> [2000]
+0xFDC8 U+9433 # <cjk> [2000]
+0xFDC9 U+944A # <cjk> [2000]
+0xFDCA U+9463 # <cjk> [2000]
+0xFDCB U+946B # <cjk> [2000]
+0xFDCC U+9471 # <cjk> [2000]
+0xFDCD U+9472 # <cjk> [2000]
+0xFDCE U+958E # <cjk> [2000]
+0xFDCF U+959F # <cjk> [2000]
+0xFDD0 U+95A6 # <cjk> [2000]
+0xFDD1 U+95A9 # <cjk> [2000]
+0xFDD2 U+95AC # <cjk> [2000]
+0xFDD3 U+95B6 # <cjk> [2000]
+0xFDD4 U+95BD # <cjk> [2000]
+0xFDD5 U+95CB # <cjk> [2000]
+0xFDD6 U+95D0 # <cjk> [2000]
+0xFDD7 U+95D3 # <cjk> [2000]
+0xFDD8 U+49B0 # <cjk> [2000]
+0xFDD9 U+95DA # <cjk> [2000]
+0xFDDA U+95DE # <cjk> [2000]
+0xFDDB U+9658 # <cjk> [2000]
+0xFDDC U+9684 # <cjk> [2000]
+0xFDDD U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000]
+0xFDDE U+969D # <cjk> [2000]
+0xFDDF U+96A4 # <cjk> [2000]
+0xFDE0 U+96A5 # <cjk> [2000]
+0xFDE1 U+96D2 # <cjk> [2000]
+0xFDE2 U+96DE # <cjk> [2000]
+0xFDE3 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2]
+0xFDE4 U+96E9 # <cjk> [2000]
+0xFDE5 U+96EF # <cjk> [2000]
+0xFDE6 U+9733 # <cjk> [2000]
+0xFDE7 U+973B # <cjk> [2000]
+0xFDE8 U+974D # <cjk> [2000]
+0xFDE9 U+974E # <cjk> [2000]
+0xFDEA U+974F # <cjk> [2000]
+0xFDEB U+975A # <cjk> [2000]
+0xFDEC U+976E # <cjk> [2000]
+0xFDED U+9773 # <cjk> [2000]
+0xFDEE U+9795 # <cjk> [2000]
+0xFDEF U+97AE # <cjk> [2000]
+0xFDF0 U+97BA # <cjk> [2000]
+0xFDF1 U+97C1 # <cjk> [2000]
+0xFDF2 U+97C9 # <cjk> [2000]
+0xFDF3 U+97DE # <cjk> [2000]
+0xFDF4 U+97DB # <cjk> [2000]
+0xFDF5 U+97F4 # <cjk> [2000]
+0xFDF6 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2]
+0xFDF7 U+980A # <cjk> [2000]
+0xFDF8 U+981E # <cjk> [2000]
+0xFDF9 U+982B # <cjk> [2000]
+0xFDFA U+9830 # <cjk> [2000]
+0xFDFB U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2]
+0xFDFC U+9852 # <cjk> [2000]
+0xFDFD U+9853 # <cjk> [2000]
+0xFDFE U+9856 # <cjk> [2000]
+0xFEA1 U+9857 # <cjk> [2000]
+0xFEA2 U+9859 # <cjk> [2000]
+0xFEA3 U+985A # <cjk> [2000]
+0xFEA4 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000]
+0xFEA5 U+9865 # <cjk> [2000]
+0xFEA6 U+986C # <cjk> [2000]
+0xFEA7 U+98BA # <cjk> [2000]
+0xFEA8 U+98C8 # <cjk> [2000]
+0xFEA9 U+98E7 # <cjk> [2000]
+0xFEAA U+9958 # <cjk> [2000]
+0xFEAB U+999E # <cjk> [2000]
+0xFEAC U+9A02 # <cjk> [2000]
+0xFEAD U+9A03 # <cjk> [2000]
+0xFEAE U+9A24 # <cjk> [2000]
+0xFEAF U+9A2D # <cjk> [2000]
+0xFEB0 U+9A2E # <cjk> [2000]
+0xFEB1 U+9A38 # <cjk> [2000]
+0xFEB2 U+9A4A # <cjk> [2000]
+0xFEB3 U+9A4E # <cjk> [2000]
+0xFEB4 U+9A52 # <cjk> [2000]
+0xFEB5 U+9AB6 # <cjk> [2000]
+0xFEB6 U+9AC1 # <cjk> [2000]
+0xFEB7 U+9AC3 # <cjk> [2000]
+0xFEB8 U+9ACE # <cjk> [2000]
+0xFEB9 U+9AD6 # <cjk> [2000]
+0xFEBA U+9AF9 # <cjk> [2000]
+0xFEBB U+9B02 # <cjk> [2000]
+0xFEBC U+9B08 # <cjk> [2000]
+0xFEBD U+9B20 # <cjk> [2000]
+0xFEBE U+4C17 # <cjk> [2000]
+0xFEBF U+9B2D # <cjk> [2000]
+0xFEC0 U+9B5E # <cjk> [2000]
+0xFEC1 U+9B79 # <cjk> [2000]
+0xFEC2 U+9B66 # <cjk> [2000]
+0xFEC3 U+9B72 # <cjk> [2000]
+0xFEC4 U+9B75 # <cjk> [2000]
+0xFEC5 U+9B84 # <cjk> [2000]
+0xFEC6 U+9B8A # <cjk> [2000]
+0xFEC7 U+9B8F # <cjk> [2000]
+0xFEC8 U+9B9E # <cjk> [2000]
+0xFEC9 U+9BA7 # <cjk> [2000]
+0xFECA U+9BC1 # <cjk> [2000]
+0xFECB U+9BCE # <cjk> [2000]
+0xFECC U+9BE5 # <cjk> [2000]
+0xFECD U+9BF8 # <cjk> [2000]
+0xFECE U+9BFD # <cjk> [2000]
+0xFECF U+9C00 # <cjk> [2000]
+0xFED0 U+9C23 # <cjk> [2000]
+0xFED1 U+9C41 # <cjk> [2000]
+0xFED2 U+9C4F # <cjk> [2000]
+0xFED3 U+9C50 # <cjk> [2000]
+0xFED4 U+9C53 # <cjk> [2000]
+0xFED5 U+9C63 # <cjk> [2000]
+0xFED6 U+9C65 # <cjk> [2000]
+0xFED7 U+9C77 # <cjk> [2000]
+0xFED8 U+9D1D # <cjk> [2000]
+0xFED9 U+9D1E # <cjk> [2000]
+0xFEDA U+9D43 # <cjk> [2000]
+0xFEDB U+9D47 # <cjk> [2000]
+0xFEDC U+9D52 # <cjk> [2000]
+0xFEDD U+9D63 # <cjk> [2000]
+0xFEDE U+9D70 # <cjk> [2000]
+0xFEDF U+9D7C # <cjk> [2000]
+0xFEE0 U+9D8A # <cjk> [2000]
+0xFEE1 U+9D96 # <cjk> [2000]
+0xFEE2 U+9DC0 # <cjk> [2000]
+0xFEE3 U+9DAC # <cjk> [2000]
+0xFEE4 U+9DBC # <cjk> [2000]
+0xFEE5 U+9DD7 # <cjk> [2000]
+0xFEE6 U+2A190 # <cjk> [2000] [Unicode3.1]
+0xFEE7 U+9DE7 # <cjk> [2000]
+0xFEE8 U+9E07 # <cjk> [2000]
+0xFEE9 U+9E15 # <cjk> [2000]
+0xFEEA U+9E7C # <cjk> [2000]
+0xFEEB U+9E9E # <cjk> [2000]
+0xFEEC U+9EA4 # <cjk> [2000]
+0xFEED U+9EAC # <cjk> [2000]
+0xFEEE U+9EAF # <cjk> [2000]
+0xFEEF U+9EB4 # <cjk> [2000]
+0xFEF0 U+9EB5 # <cjk> [2000]
+0xFEF1 U+9EC3 # <cjk> [2000]
+0xFEF2 U+9ED1 # <cjk> [2000]
+0xFEF3 U+9F10 # <cjk> [2000]
+0xFEF4 U+9F39 # <cjk> [2000]
+0xFEF5 U+9F57 # <cjk> [2000]
+0xFEF6 U+9F90 # <cjk> [2000]
+0xFEF7 U+9F94 # <cjk> [2000]
+0xFEF8 U+9F97 # <cjk> [2000]
+0xFEF9 U+9FA2 # <cjk> [2000]
+0xFEFA U+59F8 # <cjk> [2004]
+0xFEFB U+5C5B # <cjk> [2004]
+0xFEFC U+5E77 # <cjk> [2004]
+0xFEFD U+7626 # <cjk> [2004]
+0xFEFE U+7E6B # <cjk> [2004]
+0x8EA1 U+FF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0x8EA2 U+FF62 # HALFWIDTH LEFT CORNER BRACKET
+0x8EA3 U+FF63 # HALFWIDTH RIGHT CORNER BRACKET
+0x8EA4 U+FF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0x8EA5 U+FF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0x8EA6 U+FF66 # HALFWIDTH KATAKANA LETTER WO
+0x8EA7 U+FF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0x8EA8 U+FF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0x8EA9 U+FF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0x8EAA U+FF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0x8EAB U+FF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0x8EAC U+FF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0x8EAD U+FF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0x8EAE U+FF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0x8EAF U+FF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0x8EB0 U+FF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x8EB1 U+FF71 # HALFWIDTH KATAKANA LETTER A
+0x8EB2 U+FF72 # HALFWIDTH KATAKANA LETTER I
+0x8EB3 U+FF73 # HALFWIDTH KATAKANA LETTER U
+0x8EB4 U+FF74 # HALFWIDTH KATAKANA LETTER E
+0x8EB5 U+FF75 # HALFWIDTH KATAKANA LETTER O
+0x8EB6 U+FF76 # HALFWIDTH KATAKANA LETTER KA
+0x8EB7 U+FF77 # HALFWIDTH KATAKANA LETTER KI
+0x8EB8 U+FF78 # HALFWIDTH KATAKANA LETTER KU
+0x8EB9 U+FF79 # HALFWIDTH KATAKANA LETTER KE
+0x8EBA U+FF7A # HALFWIDTH KATAKANA LETTER KO
+0x8EBB U+FF7B # HALFWIDTH KATAKANA LETTER SA
+0x8EBC U+FF7C # HALFWIDTH KATAKANA LETTER SI
+0x8EBD U+FF7D # HALFWIDTH KATAKANA LETTER SU
+0x8EBE U+FF7E # HALFWIDTH KATAKANA LETTER SE
+0x8EBF U+FF7F # HALFWIDTH KATAKANA LETTER SO
+0x8EC0 U+FF80 # HALFWIDTH KATAKANA LETTER TA
+0x8EC1 U+FF81 # HALFWIDTH KATAKANA LETTER TI
+0x8EC2 U+FF82 # HALFWIDTH KATAKANA LETTER TU
+0x8EC3 U+FF83 # HALFWIDTH KATAKANA LETTER TE
+0x8EC4 U+FF84 # HALFWIDTH KATAKANA LETTER TO
+0x8EC5 U+FF85 # HALFWIDTH KATAKANA LETTER NA
+0x8EC6 U+FF86 # HALFWIDTH KATAKANA LETTER NI
+0x8EC7 U+FF87 # HALFWIDTH KATAKANA LETTER NU
+0x8EC8 U+FF88 # HALFWIDTH KATAKANA LETTER NE
+0x8EC9 U+FF89 # HALFWIDTH KATAKANA LETTER NO
+0x8ECA U+FF8A # HALFWIDTH KATAKANA LETTER HA
+0x8ECB U+FF8B # HALFWIDTH KATAKANA LETTER HI
+0x8ECC U+FF8C # HALFWIDTH KATAKANA LETTER HU
+0x8ECD U+FF8D # HALFWIDTH KATAKANA LETTER HE
+0x8ECE U+FF8E # HALFWIDTH KATAKANA LETTER HO
+0x8ECF U+FF8F # HALFWIDTH KATAKANA LETTER MA
+0x8ED0 U+FF90 # HALFWIDTH KATAKANA LETTER MI
+0x8ED1 U+FF91 # HALFWIDTH KATAKANA LETTER MU
+0x8ED2 U+FF92 # HALFWIDTH KATAKANA LETTER ME
+0x8ED3 U+FF93 # HALFWIDTH KATAKANA LETTER MO
+0x8ED4 U+FF94 # HALFWIDTH KATAKANA LETTER YA
+0x8ED5 U+FF95 # HALFWIDTH KATAKANA LETTER YU
+0x8ED6 U+FF96 # HALFWIDTH KATAKANA LETTER YO
+0x8ED7 U+FF97 # HALFWIDTH KATAKANA LETTER RA
+0x8ED8 U+FF98 # HALFWIDTH KATAKANA LETTER RI
+0x8ED9 U+FF99 # HALFWIDTH KATAKANA LETTER RU
+0x8EDA U+FF9A # HALFWIDTH KATAKANA LETTER RE
+0x8EDB U+FF9B # HALFWIDTH KATAKANA LETTER RO
+0x8EDC U+FF9C # HALFWIDTH KATAKANA LETTER WA
+0x8EDD U+FF9D # HALFWIDTH KATAKANA LETTER N
+0x8EDE U+FF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0x8EDF U+FF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0x8EE0 # <reserved>
+0x8EE1 # <reserved>
+0x8EE2 # <reserved>
+0x8EE3 # <reserved>
+0x8EE4 # <reserved>
+0x8EE5 # <reserved>
+0x8EE6 # <reserved>
+0x8EE7 # <reserved>
+0x8EE8 # <reserved>
+0x8EE9 # <reserved>
+0x8EEA # <reserved>
+0x8EEB # <reserved>
+0x8EEC # <reserved>
+0x8EED # <reserved>
+0x8EEE # <reserved>
+0x8EEF # <reserved>
+0x8EF0 # <reserved>
+0x8EF1 # <reserved>
+0x8EF2 # <reserved>
+0x8EF3 # <reserved>
+0x8EF4 # <reserved>
+0x8EF5 # <reserved>
+0x8EF6 # <reserved>
+0x8EF7 # <reserved>
+0x8EF8 # <reserved>
+0x8EF9 # <reserved>
+0x8EFA # <reserved>
+0x8EFB # <reserved>
+0x8EFC # <reserved>
+0x8EFD # <reserved>
+0x8EFE # <reserved>
+0x8FA1A1 U+20089 # <cjk> [2000] [Unicode3.1]
+0x8FA1A2 U+4E02 # <cjk> [2000]
+0x8FA1A3 U+4E0F # <cjk> [2000]
+0x8FA1A4 U+4E12 # <cjk> [2000]
+0x8FA1A5 U+4E29 # <cjk> [2000]
+0x8FA1A6 U+4E2B # <cjk> [2000]
+0x8FA1A7 U+4E2E # <cjk> [2000]
+0x8FA1A8 U+4E40 # <cjk> [2000]
+0x8FA1A9 U+4E47 # <cjk> [2000]
+0x8FA1AA U+4E48 # <cjk> [2000]
+0x8FA1AB U+200A2 # <cjk> [2000] [Unicode3.1]
+0x8FA1AC U+4E51 # <cjk> [2000]
+0x8FA1AD U+3406 # <cjk> [2000]
+0x8FA1AE U+200A4 # <cjk> [2000] [Unicode3.1]
+0x8FA1AF U+4E5A # <cjk> [2000]
+0x8FA1B0 U+4E69 # <cjk> [2000]
+0x8FA1B1 U+4E9D # <cjk> [2000]
+0x8FA1B2 U+342C # <cjk> [2000]
+0x8FA1B3 U+342E # <cjk> [2000]
+0x8FA1B4 U+4EB9 # <cjk> [2000]
+0x8FA1B5 U+4EBB # <cjk> [2000]
+0x8FA1B6 U+201A2 # <cjk> [2000] [Unicode3.1]
+0x8FA1B7 U+4EBC # <cjk> [2000]
+0x8FA1B8 U+4EC3 # <cjk> [2000]
+0x8FA1B9 U+4EC8 # <cjk> [2000]
+0x8FA1BA U+4ED0 # <cjk> [2000]
+0x8FA1BB U+4EEB # <cjk> [2000]
+0x8FA1BC U+4EDA # <cjk> [2000]
+0x8FA1BD U+4EF1 # <cjk> [2000]
+0x8FA1BE U+4EF5 # <cjk> [2000]
+0x8FA1BF U+4F00 # <cjk> [2000]
+0x8FA1C0 U+4F16 # <cjk> [2000]
+0x8FA1C1 U+4F64 # <cjk> [2000]
+0x8FA1C2 U+4F37 # <cjk> [2000]
+0x8FA1C3 U+4F3E # <cjk> [2000]
+0x8FA1C4 U+4F54 # <cjk> [2000]
+0x8FA1C5 U+4F58 # <cjk> [2000]
+0x8FA1C6 U+20213 # <cjk> [2000] [Unicode3.1]
+0x8FA1C7 U+4F77 # <cjk> [2000]
+0x8FA1C8 U+4F78 # <cjk> [2000]
+0x8FA1C9 U+4F7A # <cjk> [2000]
+0x8FA1CA U+4F7D # <cjk> [2000]
+0x8FA1CB U+4F82 # <cjk> [2000]
+0x8FA1CC U+4F85 # <cjk> [2000]
+0x8FA1CD U+4F92 # <cjk> [2000]
+0x8FA1CE U+4F9A # <cjk> [2000]
+0x8FA1CF U+4FE6 # <cjk> [2000]
+0x8FA1D0 U+4FB2 # <cjk> [2000]
+0x8FA1D1 U+4FBE # <cjk> [2000]
+0x8FA1D2 U+4FC5 # <cjk> [2000]
+0x8FA1D3 U+4FCB # <cjk> [2000]
+0x8FA1D4 U+4FCF # <cjk> [2000]
+0x8FA1D5 U+4FD2 # <cjk> [2000]
+0x8FA1D6 U+346A # <cjk> [2000]
+0x8FA1D7 U+4FF2 # <cjk> [2000]
+0x8FA1D8 U+5000 # <cjk> [2000]
+0x8FA1D9 U+5010 # <cjk> [2000]
+0x8FA1DA U+5013 # <cjk> [2000]
+0x8FA1DB U+501C # <cjk> [2000]
+0x8FA1DC U+501E # <cjk> [2000]
+0x8FA1DD U+5022 # <cjk> [2000]
+0x8FA1DE U+3468 # <cjk> [2000]
+0x8FA1DF U+5042 # <cjk> [2000]
+0x8FA1E0 U+5046 # <cjk> [2000]
+0x8FA1E1 U+504E # <cjk> [2000]
+0x8FA1E2 U+5053 # <cjk> [2000]
+0x8FA1E3 U+5057 # <cjk> [2000]
+0x8FA1E4 U+5063 # <cjk> [2000]
+0x8FA1E5 U+5066 # <cjk> [2000]
+0x8FA1E6 U+506A # <cjk> [2000]
+0x8FA1E7 U+5070 # <cjk> [2000]
+0x8FA1E8 U+50A3 # <cjk> [2000]
+0x8FA1E9 U+5088 # <cjk> [2000]
+0x8FA1EA U+5092 # <cjk> [2000]
+0x8FA1EB U+5093 # <cjk> [2000]
+0x8FA1EC U+5095 # <cjk> [2000]
+0x8FA1ED U+5096 # <cjk> [2000]
+0x8FA1EE U+509C # <cjk> [2000]
+0x8FA1EF U+50AA # <cjk> [2000]
+0x8FA1F0 U+2032B # <cjk> [2000] [Unicode3.1]
+0x8FA1F1 U+50B1 # <cjk> [2000]
+0x8FA1F2 U+50BA # <cjk> [2000]
+0x8FA1F3 U+50BB # <cjk> [2000]
+0x8FA1F4 U+50C4 # <cjk> [2000]
+0x8FA1F5 U+50C7 # <cjk> [2000]
+0x8FA1F6 U+50F3 # <cjk> [2000]
+0x8FA1F7 U+20381 # <cjk> [2000] [Unicode3.1]
+0x8FA1F8 U+50CE # <cjk> [2000]
+0x8FA1F9 U+20371 # <cjk> [2000] [Unicode3.1]
+0x8FA1FA U+50D4 # <cjk> [2000]
+0x8FA1FB U+50D9 # <cjk> [2000]
+0x8FA1FC U+50E1 # <cjk> [2000]
+0x8FA1FD U+50E9 # <cjk> [2000]
+0x8FA1FE U+3492 # <cjk> [2000]
+0x8FA3A1 U+5108 # <cjk> [2000]
+0x8FA3A2 U+203F9 # <cjk> [2000] [Unicode3.1]
+0x8FA3A3 U+5117 # <cjk> [2000]
+0x8FA3A4 U+511B # <cjk> [2000]
+0x8FA3A5 U+2044A # <cjk> [2000] [Unicode3.1]
+0x8FA3A6 U+5160 # <cjk> [2000]
+0x8FA3A7 U+20509 # <cjk> [2000] [Unicode3.1]
+0x8FA3A8 U+5173 # <cjk> [2000]
+0x8FA3A9 U+5183 # <cjk> [2000]
+0x8FA3AA U+518B # <cjk> [2000]
+0x8FA3AB U+34BC # <cjk> [2000]
+0x8FA3AC U+5198 # <cjk> [2000]
+0x8FA3AD U+51A3 # <cjk> [2000]
+0x8FA3AE U+51AD # <cjk> [2000]
+0x8FA3AF U+34C7 # <cjk> [2000]
+0x8FA3B0 U+51BC # <cjk> [2000]
+0x8FA3B1 U+205D6 # <cjk> [2000] [Unicode3.1]
+0x8FA3B2 U+20628 # <cjk> [2000] [Unicode3.1]
+0x8FA3B3 U+51F3 # <cjk> [2000]
+0x8FA3B4 U+51F4 # <cjk> [2000]
+0x8FA3B5 U+5202 # <cjk> [2000]
+0x8FA3B6 U+5212 # <cjk> [2000]
+0x8FA3B7 U+5216 # <cjk> [2000]
+0x8FA3B8 U+2074F # <cjk> [2000] [Unicode3.1]
+0x8FA3B9 U+5255 # <cjk> [2000]
+0x8FA3BA U+525C # <cjk> [2000]
+0x8FA3BB U+526C # <cjk> [2000]
+0x8FA3BC U+5277 # <cjk> [2000]
+0x8FA3BD U+5284 # <cjk> [2000]
+0x8FA3BE U+5282 # <cjk> [2000]
+0x8FA3BF U+20807 # <cjk> [2000] [Unicode3.1]
+0x8FA3C0 U+5298 # <cjk> [2000]
+0x8FA3C1 U+2083A # <cjk> [2000] [Unicode3.1]
+0x8FA3C2 U+52A4 # <cjk> [2000]
+0x8FA3C3 U+52A6 # <cjk> [2000]
+0x8FA3C4 U+52AF # <cjk> [2000]
+0x8FA3C5 U+52BA # <cjk> [2000]
+0x8FA3C6 U+52BB # <cjk> [2000]
+0x8FA3C7 U+52CA # <cjk> [2000]
+0x8FA3C8 U+351F # <cjk> [2000]
+0x8FA3C9 U+52D1 # <cjk> [2000]
+0x8FA3CA U+208B9 # <cjk> [2000] [Unicode3.1]
+0x8FA3CB U+52F7 # <cjk> [2000]
+0x8FA3CC U+530A # <cjk> [2000]
+0x8FA3CD U+530B # <cjk> [2000]
+0x8FA3CE U+5324 # <cjk> [2000]
+0x8FA3CF U+5335 # <cjk> [2000]
+0x8FA3D0 U+533E # <cjk> [2000]
+0x8FA3D1 U+5342 # <cjk> [2000]
+0x8FA3D2 U+2097C # <cjk> [2000] [Unicode3.1]
+0x8FA3D3 U+2099D # <cjk> [2000] [Unicode3.1]
+0x8FA3D4 U+5367 # <cjk> [2000]
+0x8FA3D5 U+536C # <cjk> [2000]
+0x8FA3D6 U+537A # <cjk> [2000]
+0x8FA3D7 U+53A4 # <cjk> [2000]
+0x8FA3D8 U+53B4 # <cjk> [2000]
+0x8FA3D9 U+20AD3 # <cjk> [2000] [Unicode3.1]
+0x8FA3DA U+53B7 # <cjk> [2000]
+0x8FA3DB U+53C0 # <cjk> [2000]
+0x8FA3DC U+20B1D # <cjk> [2000] [Unicode3.1]
+0x8FA3DD U+355D # <cjk> [2000]
+0x8FA3DE U+355E # <cjk> [2000]
+0x8FA3DF U+53D5 # <cjk> [2000]
+0x8FA3E0 U+53DA # <cjk> [2000]
+0x8FA3E1 U+3563 # <cjk> [2000]
+0x8FA3E2 U+53F4 # <cjk> [2000]
+0x8FA3E3 U+53F5 # <cjk> [2000]
+0x8FA3E4 U+5455 # <cjk> [2000]
+0x8FA3E5 U+5424 # <cjk> [2000]
+0x8FA3E6 U+5428 # <cjk> [2000]
+0x8FA3E7 U+356E # <cjk> [2000]
+0x8FA3E8 U+5443 # <cjk> [2000]
+0x8FA3E9 U+5462 # <cjk> [2000]
+0x8FA3EA U+5466 # <cjk> [2000]
+0x8FA3EB U+546C # <cjk> [2000]
+0x8FA3EC U+548A # <cjk> [2000]
+0x8FA3ED U+548D # <cjk> [2000]
+0x8FA3EE U+5495 # <cjk> [2000]
+0x8FA3EF U+54A0 # <cjk> [2000]
+0x8FA3F0 U+54A6 # <cjk> [2000]
+0x8FA3F1 U+54AD # <cjk> [2000]
+0x8FA3F2 U+54AE # <cjk> [2000]
+0x8FA3F3 U+54B7 # <cjk> [2000]
+0x8FA3F4 U+54BA # <cjk> [2000]
+0x8FA3F5 U+54BF # <cjk> [2000]
+0x8FA3F6 U+54C3 # <cjk> [2000]
+0x8FA3F7 U+20D45 # <cjk> [2000] [Unicode3.1]
+0x8FA3F8 U+54EC # <cjk> [2000]
+0x8FA3F9 U+54EF # <cjk> [2000]
+0x8FA3FA U+54F1 # <cjk> [2000]
+0x8FA3FB U+54F3 # <cjk> [2000]
+0x8FA3FC U+5500 # <cjk> [2000]
+0x8FA3FD U+5501 # <cjk> [2000]
+0x8FA3FE U+5509 # <cjk> [2000]
+0x8FA4A1 U+553C # <cjk> [2000]
+0x8FA4A2 U+5541 # <cjk> [2000]
+0x8FA4A3 U+35A6 # <cjk> [2000]
+0x8FA4A4 U+5547 # <cjk> [2000]
+0x8FA4A5 U+554A # <cjk> [2000]
+0x8FA4A6 U+35A8 # <cjk> [2000]
+0x8FA4A7 U+5560 # <cjk> [2000]
+0x8FA4A8 U+5561 # <cjk> [2000]
+0x8FA4A9 U+5564 # <cjk> [2000]
+0x8FA4AA U+20DE1 # <cjk> [2000] [Unicode3.1]
+0x8FA4AB U+557D # <cjk> [2000]
+0x8FA4AC U+5582 # <cjk> [2000]
+0x8FA4AD U+5588 # <cjk> [2000]
+0x8FA4AE U+5591 # <cjk> [2000]
+0x8FA4AF U+35C5 # <cjk> [2000]
+0x8FA4B0 U+55D2 # <cjk> [2000]
+0x8FA4B1 U+20E95 # <cjk> [2000] [Unicode3.1]
+0x8FA4B2 U+20E6D # <cjk> [2000] [Unicode3.1]
+0x8FA4B3 U+55BF # <cjk> [2000]
+0x8FA4B4 U+55C9 # <cjk> [2000]
+0x8FA4B5 U+55CC # <cjk> [2000]
+0x8FA4B6 U+55D1 # <cjk> [2000]
+0x8FA4B7 U+55DD # <cjk> [2000]
+0x8FA4B8 U+35DA # <cjk> [2000]
+0x8FA4B9 U+55E2 # <cjk> [2000]
+0x8FA4BA U+20E64 # <cjk> [2000] [Unicode3.1]
+0x8FA4BB U+55E9 # <cjk> [2000]
+0x8FA4BC U+5628 # <cjk> [2000]
+0x8FA4BD U+20F5F # <cjk> [2000] [Unicode3.1]
+0x8FA4BE U+5607 # <cjk> [2000]
+0x8FA4BF U+5610 # <cjk> [2000]
+0x8FA4C0 U+5630 # <cjk> [2000]
+0x8FA4C1 U+5637 # <cjk> [2000]
+0x8FA4C2 U+35F4 # <cjk> [2000]
+0x8FA4C3 U+563D # <cjk> [2000]
+0x8FA4C4 U+563F # <cjk> [2000]
+0x8FA4C5 U+5640 # <cjk> [2000]
+0x8FA4C6 U+5647 # <cjk> [2000]
+0x8FA4C7 U+565E # <cjk> [2000]
+0x8FA4C8 U+5660 # <cjk> [2000]
+0x8FA4C9 U+566D # <cjk> [2000]
+0x8FA4CA U+3605 # <cjk> [2000]
+0x8FA4CB U+5688 # <cjk> [2000]
+0x8FA4CC U+568C # <cjk> [2000]
+0x8FA4CD U+5695 # <cjk> [2000]
+0x8FA4CE U+569A # <cjk> [2000]
+0x8FA4CF U+569D # <cjk> [2000]
+0x8FA4D0 U+56A8 # <cjk> [2000]
+0x8FA4D1 U+56AD # <cjk> [2000]
+0x8FA4D2 U+56B2 # <cjk> [2000]
+0x8FA4D3 U+56C5 # <cjk> [2000]
+0x8FA4D4 U+56CD # <cjk> [2000]
+0x8FA4D5 U+56DF # <cjk> [2000]
+0x8FA4D6 U+56E8 # <cjk> [2000]
+0x8FA4D7 U+56F6 # <cjk> [2000]
+0x8FA4D8 U+56F7 # <cjk> [2000]
+0x8FA4D9 U+21201 # <cjk> [2000] [Unicode3.1]
+0x8FA4DA U+5715 # <cjk> [2000]
+0x8FA4DB U+5723 # <cjk> [2000]
+0x8FA4DC U+21255 # <cjk> [2000] [Unicode3.1]
+0x8FA4DD U+5729 # <cjk> [2000]
+0x8FA4DE U+2127B # <cjk> [2000] [Unicode3.1]
+0x8FA4DF U+5745 # <cjk> [2000]
+0x8FA4E0 U+5746 # <cjk> [2000]
+0x8FA4E1 U+574C # <cjk> [2000]
+0x8FA4E2 U+574D # <cjk> [2000]
+0x8FA4E3 U+21274 # <cjk> [2000] [Unicode3.1]
+0x8FA4E4 U+5768 # <cjk> [2000]
+0x8FA4E5 U+576F # <cjk> [2000]
+0x8FA4E6 U+5773 # <cjk> [2000]
+0x8FA4E7 U+5774 # <cjk> [2000]
+0x8FA4E8 U+5775 # <cjk> [2000]
+0x8FA4E9 U+577B # <cjk> [2000]
+0x8FA4EA U+212E4 # <cjk> [2000] [Unicode3.1]
+0x8FA4EB U+212D7 # <cjk> [2000] [Unicode3.1]
+0x8FA4EC U+57AC # <cjk> [2000]
+0x8FA4ED U+579A # <cjk> [2000]
+0x8FA4EE U+579D # <cjk> [2000]
+0x8FA4EF U+579E # <cjk> [2000]
+0x8FA4F0 U+57A8 # <cjk> [2000]
+0x8FA4F1 U+57D7 # <cjk> [2000]
+0x8FA4F2 U+212FD # <cjk> [2000] [Unicode3.1]
+0x8FA4F3 U+57CC # <cjk> [2000]
+0x8FA4F4 U+21336 # <cjk> [2000] [Unicode3.1]
+0x8FA4F5 U+21344 # <cjk> [2000] [Unicode3.1]
+0x8FA4F6 U+57DE # <cjk> [2000]
+0x8FA4F7 U+57E6 # <cjk> [2000]
+0x8FA4F8 U+57F0 # <cjk> [2000]
+0x8FA4F9 U+364A # <cjk> [2000]
+0x8FA4FA U+57F8 # <cjk> [2000]
+0x8FA4FB U+57FB # <cjk> [2000]
+0x8FA4FC U+57FD # <cjk> [2000]
+0x8FA4FD U+5804 # <cjk> [2000]
+0x8FA4FE U+581E # <cjk> [2000]
+0x8FA5A1 U+5820 # <cjk> [2000]
+0x8FA5A2 U+5827 # <cjk> [2000]
+0x8FA5A3 U+5832 # <cjk> [2000]
+0x8FA5A4 U+5839 # <cjk> [2000]
+0x8FA5A5 U+213C4 # <cjk> [2000] [Unicode3.1]
+0x8FA5A6 U+5849 # <cjk> [2000]
+0x8FA5A7 U+584C # <cjk> [2000]
+0x8FA5A8 U+5867 # <cjk> [2000]
+0x8FA5A9 U+588A # <cjk> [2000]
+0x8FA5AA U+588B # <cjk> [2000]
+0x8FA5AB U+588D # <cjk> [2000]
+0x8FA5AC U+588F # <cjk> [2000]
+0x8FA5AD U+5890 # <cjk> [2000]
+0x8FA5AE U+5894 # <cjk> [2000]
+0x8FA5AF U+589D # <cjk> [2000]
+0x8FA5B0 U+58AA # <cjk> [2000]
+0x8FA5B1 U+58B1 # <cjk> [2000]
+0x8FA5B2 U+2146D # <cjk> [2000] [Unicode3.1]
+0x8FA5B3 U+58C3 # <cjk> [2000]
+0x8FA5B4 U+58CD # <cjk> [2000]
+0x8FA5B5 U+58E2 # <cjk> [2000]
+0x8FA5B6 U+58F3 # <cjk> [2000]
+0x8FA5B7 U+58F4 # <cjk> [2000]
+0x8FA5B8 U+5905 # <cjk> [2000]
+0x8FA5B9 U+5906 # <cjk> [2000]
+0x8FA5BA U+590B # <cjk> [2000]
+0x8FA5BB U+590D # <cjk> [2000]
+0x8FA5BC U+5914 # <cjk> [2000]
+0x8FA5BD U+5924 # <cjk> [2000]
+0x8FA5BE U+215D7 # <cjk> [2000] [Unicode3.1]
+0x8FA5BF U+3691 # <cjk> [2000]
+0x8FA5C0 U+593D # <cjk> [2000]
+0x8FA5C1 U+3699 # <cjk> [2000]
+0x8FA5C2 U+5946 # <cjk> [2000]
+0x8FA5C3 U+3696 # <cjk> [2000]
+0x8FA5C4 U+26C29 # <cjk> [2000] [Unicode3.1]
+0x8FA5C5 U+595B # <cjk> [2000]
+0x8FA5C6 U+595F # <cjk> [2000]
+0x8FA5C7 U+21647 # <cjk> [2000] [Unicode3.1]
+0x8FA5C8 U+5975 # <cjk> [2000]
+0x8FA5C9 U+5976 # <cjk> [2000]
+0x8FA5CA U+597C # <cjk> [2000]
+0x8FA5CB U+599F # <cjk> [2000]
+0x8FA5CC U+59AE # <cjk> [2000]
+0x8FA5CD U+59BC # <cjk> [2000]
+0x8FA5CE U+59C8 # <cjk> [2000]
+0x8FA5CF U+59CD # <cjk> [2000]
+0x8FA5D0 U+59DE # <cjk> [2000]
+0x8FA5D1 U+59E3 # <cjk> [2000]
+0x8FA5D2 U+59E4 # <cjk> [2000]
+0x8FA5D3 U+59E7 # <cjk> [2000]
+0x8FA5D4 U+59EE # <cjk> [2000]
+0x8FA5D5 U+21706 # <cjk> [2000] [Unicode3.1]
+0x8FA5D6 U+21742 # <cjk> [2000] [Unicode3.1]
+0x8FA5D7 U+36CF # <cjk> [2000]
+0x8FA5D8 U+5A0C # <cjk> [2000]
+0x8FA5D9 U+5A0D # <cjk> [2000]
+0x8FA5DA U+5A17 # <cjk> [2000]
+0x8FA5DB U+5A27 # <cjk> [2000]
+0x8FA5DC U+5A2D # <cjk> [2000]
+0x8FA5DD U+5A55 # <cjk> [2000]
+0x8FA5DE U+5A65 # <cjk> [2000]
+0x8FA5DF U+5A7A # <cjk> [2000]
+0x8FA5E0 U+5A8B # <cjk> [2000]
+0x8FA5E1 U+5A9C # <cjk> [2000]
+0x8FA5E2 U+5A9F # <cjk> [2000]
+0x8FA5E3 U+5AA0 # <cjk> [2000]
+0x8FA5E4 U+5AA2 # <cjk> [2000]
+0x8FA5E5 U+5AB1 # <cjk> [2000]
+0x8FA5E6 U+5AB3 # <cjk> [2000]
+0x8FA5E7 U+5AB5 # <cjk> [2000]
+0x8FA5E8 U+5ABA # <cjk> [2000]
+0x8FA5E9 U+5ABF # <cjk> [2000]
+0x8FA5EA U+5ADA # <cjk> [2000]
+0x8FA5EB U+5ADC # <cjk> [2000]
+0x8FA5EC U+5AE0 # <cjk> [2000]
+0x8FA5ED U+5AE5 # <cjk> [2000]
+0x8FA5EE U+5AF0 # <cjk> [2000]
+0x8FA5EF U+5AEE # <cjk> [2000]
+0x8FA5F0 U+5AF5 # <cjk> [2000]
+0x8FA5F1 U+5B00 # <cjk> [2000]
+0x8FA5F2 U+5B08 # <cjk> [2000]
+0x8FA5F3 U+5B17 # <cjk> [2000]
+0x8FA5F4 U+5B34 # <cjk> [2000]
+0x8FA5F5 U+5B2D # <cjk> [2000]
+0x8FA5F6 U+5B4C # <cjk> [2000]
+0x8FA5F7 U+5B52 # <cjk> [2000]
+0x8FA5F8 U+5B68 # <cjk> [2000]
+0x8FA5F9 U+5B6F # <cjk> [2000]
+0x8FA5FA U+5B7C # <cjk> [2000]
+0x8FA5FB U+5B7F # <cjk> [2000]
+0x8FA5FC U+5B81 # <cjk> [2000]
+0x8FA5FD U+5B84 # <cjk> [2000]
+0x8FA5FE U+219C3 # <cjk> [2000] [Unicode3.1]
+0x8FA8A1 U+5B96 # <cjk> [2000]
+0x8FA8A2 U+5BAC # <cjk> [2000]
+0x8FA8A3 U+3761 # <cjk> [2000]
+0x8FA8A4 U+5BC0 # <cjk> [2000]
+0x8FA8A5 U+3762 # <cjk> [2000]
+0x8FA8A6 U+5BCE # <cjk> [2000]
+0x8FA8A7 U+5BD6 # <cjk> [2000]
+0x8FA8A8 U+376C # <cjk> [2000]
+0x8FA8A9 U+376B # <cjk> [2000]
+0x8FA8AA U+5BF1 # <cjk> [2000]
+0x8FA8AB U+5BFD # <cjk> [2000]
+0x8FA8AC U+3775 # <cjk> [2000]
+0x8FA8AD U+5C03 # <cjk> [2000]
+0x8FA8AE U+5C29 # <cjk> [2000]
+0x8FA8AF U+5C30 # <cjk> [2000]
+0x8FA8B0 U+21C56 # <cjk> [2000] [Unicode3.1]
+0x8FA8B1 U+5C5F # <cjk> [2000]
+0x8FA8B2 U+5C63 # <cjk> [2000]
+0x8FA8B3 U+5C67 # <cjk> [2000]
+0x8FA8B4 U+5C68 # <cjk> [2000]
+0x8FA8B5 U+5C69 # <cjk> [2000]
+0x8FA8B6 U+5C70 # <cjk> [2000]
+0x8FA8B7 U+21D2D # <cjk> [2000] [Unicode3.1]
+0x8FA8B8 U+21D45 # <cjk> [2000] [Unicode3.1]
+0x8FA8B9 U+5C7C # <cjk> [2000]
+0x8FA8BA U+21D78 # <cjk> [2000] [Unicode3.1]
+0x8FA8BB U+21D62 # <cjk> [2000] [Unicode3.1]
+0x8FA8BC U+5C88 # <cjk> [2000]
+0x8FA8BD U+5C8A # <cjk> [2000]
+0x8FA8BE U+37C1 # <cjk> [2000]
+0x8FA8BF U+21DA1 # <cjk> [2000] [Unicode3.1]
+0x8FA8C0 U+21D9C # <cjk> [2000] [Unicode3.1]
+0x8FA8C1 U+5CA0 # <cjk> [2000]
+0x8FA8C2 U+5CA2 # <cjk> [2000]
+0x8FA8C3 U+5CA6 # <cjk> [2000]
+0x8FA8C4 U+5CA7 # <cjk> [2000]
+0x8FA8C5 U+21D92 # <cjk> [2000] [Unicode3.1]
+0x8FA8C6 U+5CAD # <cjk> [2000]
+0x8FA8C7 U+5CB5 # <cjk> [2000]
+0x8FA8C8 U+21DB7 # <cjk> [2000] [Unicode3.1]
+0x8FA8C9 U+5CC9 # <cjk> [2000]
+0x8FA8CA U+21DE0 # <cjk> [2000] [Unicode3.1]
+0x8FA8CB U+21E33 # <cjk> [2000] [Unicode3.1]
+0x8FA8CC U+5D06 # <cjk> [2000]
+0x8FA8CD U+5D10 # <cjk> [2000]
+0x8FA8CE U+5D2B # <cjk> [2000]
+0x8FA8CF U+5D1D # <cjk> [2000]
+0x8FA8D0 U+5D20 # <cjk> [2000]
+0x8FA8D1 U+5D24 # <cjk> [2000]
+0x8FA8D2 U+5D26 # <cjk> [2000]
+0x8FA8D3 U+5D31 # <cjk> [2000]
+0x8FA8D4 U+5D39 # <cjk> [2000]
+0x8FA8D5 U+5D42 # <cjk> [2000]
+0x8FA8D6 U+37E8 # <cjk> [2000]
+0x8FA8D7 U+5D61 # <cjk> [2000]
+0x8FA8D8 U+5D6A # <cjk> [2000]
+0x8FA8D9 U+37F4 # <cjk> [2000]
+0x8FA8DA U+5D70 # <cjk> [2000]
+0x8FA8DB U+21F1E # <cjk> [2000] [Unicode3.1]
+0x8FA8DC U+37FD # <cjk> [2000]
+0x8FA8DD U+5D88 # <cjk> [2000]
+0x8FA8DE U+3800 # <cjk> [2000]
+0x8FA8DF U+5D92 # <cjk> [2000]
+0x8FA8E0 U+5D94 # <cjk> [2000]
+0x8FA8E1 U+5D97 # <cjk> [2000]
+0x8FA8E2 U+5D99 # <cjk> [2000]
+0x8FA8E3 U+5DB0 # <cjk> [2000]
+0x8FA8E4 U+5DB2 # <cjk> [2000]
+0x8FA8E5 U+5DB4 # <cjk> [2000]
+0x8FA8E6 U+21F76 # <cjk> [2000] [Unicode3.1]
+0x8FA8E7 U+5DB9 # <cjk> [2000]
+0x8FA8E8 U+5DD1 # <cjk> [2000]
+0x8FA8E9 U+5DD7 # <cjk> [2000]
+0x8FA8EA U+5DD8 # <cjk> [2000]
+0x8FA8EB U+5DE0 # <cjk> [2000]
+0x8FA8EC U+21FFA # <cjk> [2000] [Unicode3.1]
+0x8FA8ED U+5DE4 # <cjk> [2000]
+0x8FA8EE U+5DE9 # <cjk> [2000]
+0x8FA8EF U+382F # <cjk> [2000]
+0x8FA8F0 U+5E00 # <cjk> [2000]
+0x8FA8F1 U+3836 # <cjk> [2000]
+0x8FA8F2 U+5E12 # <cjk> [2000]
+0x8FA8F3 U+5E15 # <cjk> [2000]
+0x8FA8F4 U+3840 # <cjk> [2000]
+0x8FA8F5 U+5E1F # <cjk> [2000]
+0x8FA8F6 U+5E2E # <cjk> [2000]
+0x8FA8F7 U+5E3E # <cjk> [2000]
+0x8FA8F8 U+5E49 # <cjk> [2000]
+0x8FA8F9 U+385C # <cjk> [2000]
+0x8FA8FA U+5E56 # <cjk> [2000]
+0x8FA8FB U+3861 # <cjk> [2000]
+0x8FA8FC U+5E6B # <cjk> [2000]
+0x8FA8FD U+5E6C # <cjk> [2000]
+0x8FA8FE U+5E6D # <cjk> [2000]
+0x8FACA1 U+5E6E # <cjk> [2000]
+0x8FACA2 U+2217B # <cjk> [2000] [Unicode3.1]
+0x8FACA3 U+5EA5 # <cjk> [2000]
+0x8FACA4 U+5EAA # <cjk> [2000]
+0x8FACA5 U+5EAC # <cjk> [2000]
+0x8FACA6 U+5EB9 # <cjk> [2000]
+0x8FACA7 U+5EBF # <cjk> [2000]
+0x8FACA8 U+5EC6 # <cjk> [2000]
+0x8FACA9 U+5ED2 # <cjk> [2000]
+0x8FACAA U+5ED9 # <cjk> [2000]
+0x8FACAB U+2231E # <cjk> [2000] [Unicode3.1]
+0x8FACAC U+5EFD # <cjk> [2000]
+0x8FACAD U+5F08 # <cjk> [2000]
+0x8FACAE U+5F0E # <cjk> [2000]
+0x8FACAF U+5F1C # <cjk> [2000]
+0x8FACB0 U+223AD # <cjk> [2000] [Unicode3.1]
+0x8FACB1 U+5F1E # <cjk> [2000]
+0x8FACB2 U+5F47 # <cjk> [2000]
+0x8FACB3 U+5F63 # <cjk> [2000]
+0x8FACB4 U+5F72 # <cjk> [2000]
+0x8FACB5 U+5F7E # <cjk> [2000]
+0x8FACB6 U+5F8F # <cjk> [2000]
+0x8FACB7 U+5FA2 # <cjk> [2000]
+0x8FACB8 U+5FA4 # <cjk> [2000]
+0x8FACB9 U+5FB8 # <cjk> [2000]
+0x8FACBA U+5FC4 # <cjk> [2000]
+0x8FACBB U+38FA # <cjk> [2000]
+0x8FACBC U+5FC7 # <cjk> [2000]
+0x8FACBD U+5FCB # <cjk> [2000]
+0x8FACBE U+5FD2 # <cjk> [2000]
+0x8FACBF U+5FD3 # <cjk> [2000]
+0x8FACC0 U+5FD4 # <cjk> [2000]
+0x8FACC1 U+5FE2 # <cjk> [2000]
+0x8FACC2 U+5FEE # <cjk> [2000]
+0x8FACC3 U+5FEF # <cjk> [2000]
+0x8FACC4 U+5FF3 # <cjk> [2000]
+0x8FACC5 U+5FFC # <cjk> [2000]
+0x8FACC6 U+3917 # <cjk> [2000]
+0x8FACC7 U+6017 # <cjk> [2000]
+0x8FACC8 U+6022 # <cjk> [2000]
+0x8FACC9 U+6024 # <cjk> [2000]
+0x8FACCA U+391A # <cjk> [2000]
+0x8FACCB U+604C # <cjk> [2000]
+0x8FACCC U+607F # <cjk> [2000]
+0x8FACCD U+608A # <cjk> [2000]
+0x8FACCE U+6095 # <cjk> [2000]
+0x8FACCF U+60A8 # <cjk> [2000]
+0x8FACD0 U+226F3 # <cjk> [2000] [Unicode3.1]
+0x8FACD1 U+60B0 # <cjk> [2000]
+0x8FACD2 U+60B1 # <cjk> [2000]
+0x8FACD3 U+60BE # <cjk> [2000]
+0x8FACD4 U+60C8 # <cjk> [2000]
+0x8FACD5 U+60D9 # <cjk> [2000]
+0x8FACD6 U+60DB # <cjk> [2000]
+0x8FACD7 U+60EE # <cjk> [2000]
+0x8FACD8 U+60F2 # <cjk> [2000]
+0x8FACD9 U+60F5 # <cjk> [2000]
+0x8FACDA U+6110 # <cjk> [2000]
+0x8FACDB U+6112 # <cjk> [2000]
+0x8FACDC U+6113 # <cjk> [2000]
+0x8FACDD U+6119 # <cjk> [2000]
+0x8FACDE U+611E # <cjk> [2000]
+0x8FACDF U+613A # <cjk> [2000]
+0x8FACE0 U+396F # <cjk> [2000]
+0x8FACE1 U+6141 # <cjk> [2000]
+0x8FACE2 U+6146 # <cjk> [2000]
+0x8FACE3 U+6160 # <cjk> [2000]
+0x8FACE4 U+617C # <cjk> [2000]
+0x8FACE5 U+2285B # <cjk> [2000] [Unicode3.1]
+0x8FACE6 U+6192 # <cjk> [2000]
+0x8FACE7 U+6193 # <cjk> [2000]
+0x8FACE8 U+6197 # <cjk> [2000]
+0x8FACE9 U+6198 # <cjk> [2000]
+0x8FACEA U+61A5 # <cjk> [2000]
+0x8FACEB U+61A8 # <cjk> [2000]
+0x8FACEC U+61AD # <cjk> [2000]
+0x8FACED U+228AB # <cjk> [2000] [Unicode3.1]
+0x8FACEE U+61D5 # <cjk> [2000]
+0x8FACEF U+61DD # <cjk> [2000]
+0x8FACF0 U+61DF # <cjk> [2000]
+0x8FACF1 U+61F5 # <cjk> [2000]
+0x8FACF2 U+2298F # <cjk> [2000] [Unicode3.1]
+0x8FACF3 U+6215 # <cjk> [2000]
+0x8FACF4 U+6223 # <cjk> [2000]
+0x8FACF5 U+6229 # <cjk> [2000]
+0x8FACF6 U+6246 # <cjk> [2000]
+0x8FACF7 U+624C # <cjk> [2000]
+0x8FACF8 U+6251 # <cjk> [2000]
+0x8FACF9 U+6252 # <cjk> [2000]
+0x8FACFA U+6261 # <cjk> [2000]
+0x8FACFB U+6264 # <cjk> [2000]
+0x8FACFC U+627B # <cjk> [2000]
+0x8FACFD U+626D # <cjk> [2000]
+0x8FACFE U+6273 # <cjk> [2000]
+0x8FADA1 U+6299 # <cjk> [2000]
+0x8FADA2 U+62A6 # <cjk> [2000]
+0x8FADA3 U+62D5 # <cjk> [2000]
+0x8FADA4 U+22AB8 # <cjk> [2000] [Unicode3.1]
+0x8FADA5 U+62FD # <cjk> [2000]
+0x8FADA6 U+6303 # <cjk> [2000]
+0x8FADA7 U+630D # <cjk> [2000]
+0x8FADA8 U+6310 # <cjk> [2000]
+0x8FADA9 U+22B4F # <cjk> [2000] [Unicode3.1]
+0x8FADAA U+22B50 # <cjk> [2000] [Unicode3.1]
+0x8FADAB U+6332 # <cjk> [2000]
+0x8FADAC U+6335 # <cjk> [2000]
+0x8FADAD U+633B # <cjk> [2000]
+0x8FADAE U+633C # <cjk> [2000]
+0x8FADAF U+6341 # <cjk> [2000]
+0x8FADB0 U+6344 # <cjk> [2000]
+0x8FADB1 U+634E # <cjk> [2000]
+0x8FADB2 U+22B46 # <cjk> [2000] [Unicode3.1]
+0x8FADB3 U+6359 # <cjk> [2000]
+0x8FADB4 U+22C1D # <cjk> [2000] [Unicode3.1]
+0x8FADB5 U+22BA6 # <cjk> [2000] [Unicode3.1]
+0x8FADB6 U+636C # <cjk> [2000]
+0x8FADB7 U+6384 # <cjk> [2000]
+0x8FADB8 U+6399 # <cjk> [2000]
+0x8FADB9 U+22C24 # <cjk> [2000] [Unicode3.1]
+0x8FADBA U+6394 # <cjk> [2000]
+0x8FADBB U+63BD # <cjk> [2000]
+0x8FADBC U+63F7 # <cjk> [2000]
+0x8FADBD U+63D4 # <cjk> [2000]
+0x8FADBE U+63D5 # <cjk> [2000]
+0x8FADBF U+63DC # <cjk> [2000]
+0x8FADC0 U+63E0 # <cjk> [2000]
+0x8FADC1 U+63EB # <cjk> [2000]
+0x8FADC2 U+63EC # <cjk> [2000]
+0x8FADC3 U+63F2 # <cjk> [2000]
+0x8FADC4 U+6409 # <cjk> [2000]
+0x8FADC5 U+641E # <cjk> [2000]
+0x8FADC6 U+6425 # <cjk> [2000]
+0x8FADC7 U+6429 # <cjk> [2000]
+0x8FADC8 U+642F # <cjk> [2000]
+0x8FADC9 U+645A # <cjk> [2000]
+0x8FADCA U+645B # <cjk> [2000]
+0x8FADCB U+645D # <cjk> [2000]
+0x8FADCC U+6473 # <cjk> [2000]
+0x8FADCD U+647D # <cjk> [2000]
+0x8FADCE U+6487 # <cjk> [2000]
+0x8FADCF U+6491 # <cjk> [2000]
+0x8FADD0 U+649D # <cjk> [2000]
+0x8FADD1 U+649F # <cjk> [2000]
+0x8FADD2 U+64CB # <cjk> [2000]
+0x8FADD3 U+64CC # <cjk> [2000]
+0x8FADD4 U+64D5 # <cjk> [2000]
+0x8FADD5 U+64D7 # <cjk> [2000]
+0x8FADD6 U+22DE1 # <cjk> [2000] [Unicode3.1]
+0x8FADD7 U+64E4 # <cjk> [2000]
+0x8FADD8 U+64E5 # <cjk> [2000]
+0x8FADD9 U+64FF # <cjk> [2000]
+0x8FADDA U+6504 # <cjk> [2000]
+0x8FADDB U+3A6E # <cjk> [2000]
+0x8FADDC U+650F # <cjk> [2000]
+0x8FADDD U+6514 # <cjk> [2000]
+0x8FADDE U+6516 # <cjk> [2000]
+0x8FADDF U+3A73 # <cjk> [2000]
+0x8FADE0 U+651E # <cjk> [2000]
+0x8FADE1 U+6532 # <cjk> [2000]
+0x8FADE2 U+6544 # <cjk> [2000]
+0x8FADE3 U+6554 # <cjk> [2000]
+0x8FADE4 U+656B # <cjk> [2000]
+0x8FADE5 U+657A # <cjk> [2000]
+0x8FADE6 U+6581 # <cjk> [2000]
+0x8FADE7 U+6584 # <cjk> [2000]
+0x8FADE8 U+6585 # <cjk> [2000]
+0x8FADE9 U+658A # <cjk> [2000]
+0x8FADEA U+65B2 # <cjk> [2000]
+0x8FADEB U+65B5 # <cjk> [2000]
+0x8FADEC U+65B8 # <cjk> [2000]
+0x8FADED U+65BF # <cjk> [2000]
+0x8FADEE U+65C2 # <cjk> [2000]
+0x8FADEF U+65C9 # <cjk> [2000]
+0x8FADF0 U+65D4 # <cjk> [2000]
+0x8FADF1 U+3AD6 # <cjk> [2000]
+0x8FADF2 U+65F2 # <cjk> [2000]
+0x8FADF3 U+65F9 # <cjk> [2000]
+0x8FADF4 U+65FC # <cjk> [2000]
+0x8FADF5 U+6604 # <cjk> [2000]
+0x8FADF6 U+6608 # <cjk> [2000]
+0x8FADF7 U+6621 # <cjk> [2000]
+0x8FADF8 U+662A # <cjk> [2000]
+0x8FADF9 U+6645 # <cjk> [2000]
+0x8FADFA U+6651 # <cjk> [2000]
+0x8FADFB U+664E # <cjk> [2000]
+0x8FADFC U+3AEA # <cjk> [2000]
+0x8FADFD U+231C3 # <cjk> [2000] [Unicode3.1]
+0x8FADFE U+6657 # <cjk> [2000]
+0x8FAEA1 U+665B # <cjk> [2000]
+0x8FAEA2 U+6663 # <cjk> [2000]
+0x8FAEA3 U+231F5 # <cjk> [2000] [Unicode3.1]
+0x8FAEA4 U+231B6 # <cjk> [2000] [Unicode3.1]
+0x8FAEA5 U+666A # <cjk> [2000]
+0x8FAEA6 U+666B # <cjk> [2000]
+0x8FAEA7 U+666C # <cjk> [2000]
+0x8FAEA8 U+666D # <cjk> [2000]
+0x8FAEA9 U+667B # <cjk> [2000]
+0x8FAEAA U+6680 # <cjk> [2000]
+0x8FAEAB U+6690 # <cjk> [2000]
+0x8FAEAC U+6692 # <cjk> [2000]
+0x8FAEAD U+6699 # <cjk> [2000]
+0x8FAEAE U+3B0E # <cjk> [2000]
+0x8FAEAF U+66AD # <cjk> [2000]
+0x8FAEB0 U+66B1 # <cjk> [2000]
+0x8FAEB1 U+66B5 # <cjk> [2000]
+0x8FAEB2 U+3B1A # <cjk> [2000]
+0x8FAEB3 U+66BF # <cjk> [2000]
+0x8FAEB4 U+3B1C # <cjk> [2000]
+0x8FAEB5 U+66EC # <cjk> [2000]
+0x8FAEB6 U+3AD7 # <cjk> [2000]
+0x8FAEB7 U+6701 # <cjk> [2000]
+0x8FAEB8 U+6705 # <cjk> [2000]
+0x8FAEB9 U+6712 # <cjk> [2000]
+0x8FAEBA U+23372 # <cjk> [2000] [Unicode3.1]
+0x8FAEBB U+6719 # <cjk> [2000]
+0x8FAEBC U+233D3 # <cjk> [2000] [Unicode3.1]
+0x8FAEBD U+233D2 # <cjk> [2000] [Unicode3.1]
+0x8FAEBE U+674C # <cjk> [2000]
+0x8FAEBF U+674D # <cjk> [2000]
+0x8FAEC0 U+6754 # <cjk> [2000]
+0x8FAEC1 U+675D # <cjk> [2000]
+0x8FAEC2 U+233D0 # <cjk> [2000] [Unicode3.1]
+0x8FAEC3 U+233E4 # <cjk> [2000] [Unicode3.1]
+0x8FAEC4 U+233D5 # <cjk> [2000] [Unicode3.1]
+0x8FAEC5 U+6774 # <cjk> [2000]
+0x8FAEC6 U+6776 # <cjk> [2000]
+0x8FAEC7 U+233DA # <cjk> [2000] [Unicode3.1]
+0x8FAEC8 U+6792 # <cjk> [2000]
+0x8FAEC9 U+233DF # <cjk> [2000] [Unicode3.1]
+0x8FAECA U+8363 # <cjk> [2000]
+0x8FAECB U+6810 # <cjk> [2000]
+0x8FAECC U+67B0 # <cjk> [2000]
+0x8FAECD U+67B2 # <cjk> [2000]
+0x8FAECE U+67C3 # <cjk> [2000]
+0x8FAECF U+67C8 # <cjk> [2000]
+0x8FAED0 U+67D2 # <cjk> [2000]
+0x8FAED1 U+67D9 # <cjk> [2000]
+0x8FAED2 U+67DB # <cjk> [2000]
+0x8FAED3 U+67F0 # <cjk> [2000]
+0x8FAED4 U+67F7 # <cjk> [2000]
+0x8FAED5 U+2344A # <cjk> [2000] [Unicode3.1]
+0x8FAED6 U+23451 # <cjk> [2000] [Unicode3.1]
+0x8FAED7 U+2344B # <cjk> [2000] [Unicode3.1]
+0x8FAED8 U+6818 # <cjk> [2000]
+0x8FAED9 U+681F # <cjk> [2000]
+0x8FAEDA U+682D # <cjk> [2000]
+0x8FAEDB U+23465 # <cjk> [2000] [Unicode3.1]
+0x8FAEDC U+6833 # <cjk> [2000]
+0x8FAEDD U+683B # <cjk> [2000]
+0x8FAEDE U+683E # <cjk> [2000]
+0x8FAEDF U+6844 # <cjk> [2000]
+0x8FAEE0 U+6845 # <cjk> [2000]
+0x8FAEE1 U+6849 # <cjk> [2000]
+0x8FAEE2 U+684C # <cjk> [2000]
+0x8FAEE3 U+6855 # <cjk> [2000]
+0x8FAEE4 U+6857 # <cjk> [2000]
+0x8FAEE5 U+3B77 # <cjk> [2000]
+0x8FAEE6 U+686B # <cjk> [2000]
+0x8FAEE7 U+686E # <cjk> [2000]
+0x8FAEE8 U+687A # <cjk> [2000]
+0x8FAEE9 U+687C # <cjk> [2000]
+0x8FAEEA U+6882 # <cjk> [2000]
+0x8FAEEB U+6890 # <cjk> [2000]
+0x8FAEEC U+6896 # <cjk> [2000]
+0x8FAEED U+3B6D # <cjk> [2000]
+0x8FAEEE U+6898 # <cjk> [2000]
+0x8FAEEF U+6899 # <cjk> [2000]
+0x8FAEF0 U+689A # <cjk> [2000]
+0x8FAEF1 U+689C # <cjk> [2000]
+0x8FAEF2 U+68AA # <cjk> [2000]
+0x8FAEF3 U+68AB # <cjk> [2000]
+0x8FAEF4 U+68B4 # <cjk> [2000]
+0x8FAEF5 U+68BB # <cjk> [2000]
+0x8FAEF6 U+68FB # <cjk> [2000]
+0x8FAEF7 U+234E4 # <cjk> [2000] [Unicode3.1]
+0x8FAEF8 U+2355A # <cjk> [2000] [Unicode3.1]
+0x8FAEF9 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000]
+0x8FAEFA U+68C3 # <cjk> [2000]
+0x8FAEFB U+68C5 # <cjk> [2000]
+0x8FAEFC U+68CC # <cjk> [2000]
+0x8FAEFD U+68CF # <cjk> [2000]
+0x8FAEFE U+68D6 # <cjk> [2000]
+0x8FAFA1 U+68D9 # <cjk> [2000]
+0x8FAFA2 U+68E4 # <cjk> [2000]
+0x8FAFA3 U+68E5 # <cjk> [2000]
+0x8FAFA4 U+68EC # <cjk> [2000]
+0x8FAFA5 U+68F7 # <cjk> [2000]
+0x8FAFA6 U+6903 # <cjk> [2000]
+0x8FAFA7 U+6907 # <cjk> [2000]
+0x8FAFA8 U+3B87 # <cjk> [2000]
+0x8FAFA9 U+3B88 # <cjk> [2000]
+0x8FAFAA U+23594 # <cjk> [2000] [Unicode3.1]
+0x8FAFAB U+693B # <cjk> [2000]
+0x8FAFAC U+3B8D # <cjk> [2000]
+0x8FAFAD U+6946 # <cjk> [2000]
+0x8FAFAE U+6969 # <cjk> [2000]
+0x8FAFAF U+696C # <cjk> [2000]
+0x8FAFB0 U+6972 # <cjk> [2000]
+0x8FAFB1 U+697A # <cjk> [2000]
+0x8FAFB2 U+697F # <cjk> [2000]
+0x8FAFB3 U+6992 # <cjk> [2000]
+0x8FAFB4 U+3BA4 # <cjk> [2000]
+0x8FAFB5 U+6996 # <cjk> [2000]
+0x8FAFB6 U+6998 # <cjk> [2000]
+0x8FAFB7 U+69A6 # <cjk> [2000]
+0x8FAFB8 U+69B0 # <cjk> [2000]
+0x8FAFB9 U+69B7 # <cjk> [2000]
+0x8FAFBA U+69BA # <cjk> [2000]
+0x8FAFBB U+69BC # <cjk> [2000]
+0x8FAFBC U+69C0 # <cjk> [2000]
+0x8FAFBD U+69D1 # <cjk> [2000]
+0x8FAFBE U+69D6 # <cjk> [2000]
+0x8FAFBF U+23639 # <cjk> [2000] [Unicode3.1]
+0x8FAFC0 U+23647 # <cjk> [2000] [Unicode3.1]
+0x8FAFC1 U+6A30 # <cjk> [2000]
+0x8FAFC2 U+23638 # <cjk> [2000] [Unicode3.1]
+0x8FAFC3 U+2363A # <cjk> [2000] [Unicode3.1]
+0x8FAFC4 U+69E3 # <cjk> [2000]
+0x8FAFC5 U+69EE # <cjk> [2000]
+0x8FAFC6 U+69EF # <cjk> [2000]
+0x8FAFC7 U+69F3 # <cjk> [2000]
+0x8FAFC8 U+3BCD # <cjk> [2000]
+0x8FAFC9 U+69F4 # <cjk> [2000]
+0x8FAFCA U+69FE # <cjk> [2000]
+0x8FAFCB U+6A11 # <cjk> [2000]
+0x8FAFCC U+6A1A # <cjk> [2000]
+0x8FAFCD U+6A1D # <cjk> [2000]
+0x8FAFCE U+2371C # <cjk> [2000] [Unicode3.1]
+0x8FAFCF U+6A32 # <cjk> [2000]
+0x8FAFD0 U+6A33 # <cjk> [2000]
+0x8FAFD1 U+6A34 # <cjk> [2000]
+0x8FAFD2 U+6A3F # <cjk> [2000]
+0x8FAFD3 U+6A46 # <cjk> [2000]
+0x8FAFD4 U+6A49 # <cjk> [2000]
+0x8FAFD5 U+6A7A # <cjk> [2000]
+0x8FAFD6 U+6A4E # <cjk> [2000]
+0x8FAFD7 U+6A52 # <cjk> [2000]
+0x8FAFD8 U+6A64 # <cjk> [2000]
+0x8FAFD9 U+2370C # <cjk> [2000] [Unicode3.1]
+0x8FAFDA U+6A7E # <cjk> [2000]
+0x8FAFDB U+6A83 # <cjk> [2000]
+0x8FAFDC U+6A8B # <cjk> [2000]
+0x8FAFDD U+3BF0 # <cjk> [2000]
+0x8FAFDE U+6A91 # <cjk> [2000]
+0x8FAFDF U+6A9F # <cjk> [2000]
+0x8FAFE0 U+6AA1 # <cjk> [2000]
+0x8FAFE1 U+23764 # <cjk> [2000] [Unicode3.1]
+0x8FAFE2 U+6AAB # <cjk> [2000]
+0x8FAFE3 U+6ABD # <cjk> [2000]
+0x8FAFE4 U+6AC6 # <cjk> [2000]
+0x8FAFE5 U+6AD4 # <cjk> [2000]
+0x8FAFE6 U+6AD0 # <cjk> [2000]
+0x8FAFE7 U+6ADC # <cjk> [2000]
+0x8FAFE8 U+6ADD # <cjk> [2000]
+0x8FAFE9 U+237FF # <cjk> [2000] [Unicode3.1]
+0x8FAFEA U+237E7 # <cjk> [2000] [Unicode3.1]
+0x8FAFEB U+6AEC # <cjk> [2000]
+0x8FAFEC U+6AF1 # <cjk> [2000]
+0x8FAFED U+6AF2 # <cjk> [2000]
+0x8FAFEE U+6AF3 # <cjk> [2000]
+0x8FAFEF U+6AFD # <cjk> [2000]
+0x8FAFF0 U+23824 # <cjk> [2000] [Unicode3.1]
+0x8FAFF1 U+6B0B # <cjk> [2000]
+0x8FAFF2 U+6B0F # <cjk> [2000]
+0x8FAFF3 U+6B10 # <cjk> [2000]
+0x8FAFF4 U+6B11 # <cjk> [2000]
+0x8FAFF5 U+2383D # <cjk> [2000] [Unicode3.1]
+0x8FAFF6 U+6B17 # <cjk> [2000]
+0x8FAFF7 U+3C26 # <cjk> [2000]
+0x8FAFF8 U+6B2F # <cjk> [2000]
+0x8FAFF9 U+6B4A # <cjk> [2000]
+0x8FAFFA U+6B58 # <cjk> [2000]
+0x8FAFFB U+6B6C # <cjk> [2000]
+0x8FAFFC U+6B75 # <cjk> [2000]
+0x8FAFFD U+6B7A # <cjk> [2000]
+0x8FAFFE U+6B81 # <cjk> [2000]
+0x8FEEA1 U+6B9B # <cjk> [2000]
+0x8FEEA2 U+6BAE # <cjk> [2000]
+0x8FEEA3 U+23A98 # <cjk> [2000] [Unicode3.1]
+0x8FEEA4 U+6BBD # <cjk> [2000]
+0x8FEEA5 U+6BBE # <cjk> [2000]
+0x8FEEA6 U+6BC7 # <cjk> [2000]
+0x8FEEA7 U+6BC8 # <cjk> [2000]
+0x8FEEA8 U+6BC9 # <cjk> [2000]
+0x8FEEA9 U+6BDA # <cjk> [2000]
+0x8FEEAA U+6BE6 # <cjk> [2000]
+0x8FEEAB U+6BE7 # <cjk> [2000]
+0x8FEEAC U+6BEE # <cjk> [2000]
+0x8FEEAD U+6BF1 # <cjk> [2000]
+0x8FEEAE U+6C02 # <cjk> [2000]
+0x8FEEAF U+6C0A # <cjk> [2000]
+0x8FEEB0 U+6C0E # <cjk> [2000]
+0x8FEEB1 U+6C35 # <cjk> [2000]
+0x8FEEB2 U+6C36 # <cjk> [2000]
+0x8FEEB3 U+6C3A # <cjk> [2000]
+0x8FEEB4 U+23C7F # <cjk> [2000] [Unicode3.1]
+0x8FEEB5 U+6C3F # <cjk> [2000]
+0x8FEEB6 U+6C4D # <cjk> [2000]
+0x8FEEB7 U+6C5B # <cjk> [2000]
+0x8FEEB8 U+6C6D # <cjk> [2000]
+0x8FEEB9 U+6C84 # <cjk> [2000]
+0x8FEEBA U+6C89 # <cjk> [2000]
+0x8FEEBB U+3CC3 # <cjk> [2000]
+0x8FEEBC U+6C94 # <cjk> [2000]
+0x8FEEBD U+6C95 # <cjk> [2000]
+0x8FEEBE U+6C97 # <cjk> [2000]
+0x8FEEBF U+6CAD # <cjk> [2000]
+0x8FEEC0 U+6CC2 # <cjk> [2000]
+0x8FEEC1 U+6CD0 # <cjk> [2000]
+0x8FEEC2 U+3CD2 # <cjk> [2000]
+0x8FEEC3 U+6CD6 # <cjk> [2000]
+0x8FEEC4 U+6CDA # <cjk> [2000]
+0x8FEEC5 U+6CDC # <cjk> [2000]
+0x8FEEC6 U+6CE9 # <cjk> [2000]
+0x8FEEC7 U+6CEC # <cjk> [2000]
+0x8FEEC8 U+6CED # <cjk> [2000]
+0x8FEEC9 U+23D00 # <cjk> [2000] [Unicode3.1]
+0x8FEECA U+6D00 # <cjk> [2000]
+0x8FEECB U+6D0A # <cjk> [2000]
+0x8FEECC U+6D24 # <cjk> [2000]
+0x8FEECD U+6D26 # <cjk> [2000]
+0x8FEECE U+6D27 # <cjk> [2000]
+0x8FEECF U+6C67 # <cjk> [2000]
+0x8FEED0 U+6D2F # <cjk> [2000]
+0x8FEED1 U+6D3C # <cjk> [2000]
+0x8FEED2 U+6D5B # <cjk> [2000]
+0x8FEED3 U+6D5E # <cjk> [2000]
+0x8FEED4 U+6D60 # <cjk> [2000]
+0x8FEED5 U+6D70 # <cjk> [2000]
+0x8FEED6 U+6D80 # <cjk> [2000]
+0x8FEED7 U+6D81 # <cjk> [2000]
+0x8FEED8 U+6D8A # <cjk> [2000]
+0x8FEED9 U+6D8D # <cjk> [2000]
+0x8FEEDA U+6D91 # <cjk> [2000]
+0x8FEEDB U+6D98 # <cjk> [2000]
+0x8FEEDC U+23D40 # <cjk> [2000] [Unicode3.1]
+0x8FEEDD U+6E17 # <cjk> [2000]
+0x8FEEDE U+23DFA # <cjk> [2000] [Unicode3.1]
+0x8FEEDF U+23DF9 # <cjk> [2000] [Unicode3.1]
+0x8FEEE0 U+23DD3 # <cjk> [2000] [Unicode3.1]
+0x8FEEE1 U+6DAB # <cjk> [2000]
+0x8FEEE2 U+6DAE # <cjk> [2000]
+0x8FEEE3 U+6DB4 # <cjk> [2000]
+0x8FEEE4 U+6DC2 # <cjk> [2000]
+0x8FEEE5 U+6D34 # <cjk> [2000]
+0x8FEEE6 U+6DC8 # <cjk> [2000]
+0x8FEEE7 U+6DCE # <cjk> [2000]
+0x8FEEE8 U+6DCF # <cjk> [2000]
+0x8FEEE9 U+6DD0 # <cjk> [2000]
+0x8FEEEA U+6DDF # <cjk> [2000]
+0x8FEEEB U+6DE9 # <cjk> [2000]
+0x8FEEEC U+6DF6 # <cjk> [2000]
+0x8FEEED U+6E36 # <cjk> [2000]
+0x8FEEEE U+6E1E # <cjk> [2000]
+0x8FEEEF U+6E22 # <cjk> [2000]
+0x8FEEF0 U+6E27 # <cjk> [2000]
+0x8FEEF1 U+3D11 # <cjk> [2000]
+0x8FEEF2 U+6E32 # <cjk> [2000]
+0x8FEEF3 U+6E3C # <cjk> [2000]
+0x8FEEF4 U+6E48 # <cjk> [2000]
+0x8FEEF5 U+6E49 # <cjk> [2000]
+0x8FEEF6 U+6E4B # <cjk> [2000]
+0x8FEEF7 U+6E4C # <cjk> [2000]
+0x8FEEF8 U+6E4F # <cjk> [2000]
+0x8FEEF9 U+6E51 # <cjk> [2000]
+0x8FEEFA U+6E53 # <cjk> [2000]
+0x8FEEFB U+6E54 # <cjk> [2000]
+0x8FEEFC U+6E57 # <cjk> [2000]
+0x8FEEFD U+6E63 # <cjk> [2000]
+0x8FEEFE U+3D1E # <cjk> [2000]
+0x8FEFA1 U+6E93 # <cjk> [2000]
+0x8FEFA2 U+6EA7 # <cjk> [2000]
+0x8FEFA3 U+6EB4 # <cjk> [2000]
+0x8FEFA4 U+6EBF # <cjk> [2000]
+0x8FEFA5 U+6EC3 # <cjk> [2000]
+0x8FEFA6 U+6ECA # <cjk> [2000]
+0x8FEFA7 U+6ED9 # <cjk> [2000]
+0x8FEFA8 U+6F35 # <cjk> [2000]
+0x8FEFA9 U+6EEB # <cjk> [2000]
+0x8FEFAA U+6EF9 # <cjk> [2000]
+0x8FEFAB U+6EFB # <cjk> [2000]
+0x8FEFAC U+6F0A # <cjk> [2000]
+0x8FEFAD U+6F0C # <cjk> [2000]
+0x8FEFAE U+6F18 # <cjk> [2000]
+0x8FEFAF U+6F25 # <cjk> [2000]
+0x8FEFB0 U+6F36 # <cjk> [2000]
+0x8FEFB1 U+6F3C # <cjk> [2000]
+0x8FEFB2 U+23F7E # <cjk> [2000] [Unicode3.1]
+0x8FEFB3 U+6F52 # <cjk> [2000]
+0x8FEFB4 U+6F57 # <cjk> [2000]
+0x8FEFB5 U+6F5A # <cjk> [2000]
+0x8FEFB6 U+6F60 # <cjk> [2000]
+0x8FEFB7 U+6F68 # <cjk> [2000]
+0x8FEFB8 U+6F98 # <cjk> [2000]
+0x8FEFB9 U+6F7D # <cjk> [2000]
+0x8FEFBA U+6F90 # <cjk> [2000]
+0x8FEFBB U+6F96 # <cjk> [2000]
+0x8FEFBC U+6FBE # <cjk> [2000]
+0x8FEFBD U+6F9F # <cjk> [2000]
+0x8FEFBE U+6FA5 # <cjk> [2000]
+0x8FEFBF U+6FAF # <cjk> [2000]
+0x8FEFC0 U+3D64 # <cjk> [2000]
+0x8FEFC1 U+6FB5 # <cjk> [2000]
+0x8FEFC2 U+6FC8 # <cjk> [2000]
+0x8FEFC3 U+6FC9 # <cjk> [2000]
+0x8FEFC4 U+6FDA # <cjk> [2000]
+0x8FEFC5 U+6FDE # <cjk> [2000]
+0x8FEFC6 U+6FE9 # <cjk> [2000]
+0x8FEFC7 U+24096 # <cjk> [2000] [Unicode3.1]
+0x8FEFC8 U+6FFC # <cjk> [2000]
+0x8FEFC9 U+7000 # <cjk> [2000]
+0x8FEFCA U+7007 # <cjk> [2000]
+0x8FEFCB U+700A # <cjk> [2000]
+0x8FEFCC U+7023 # <cjk> [2000]
+0x8FEFCD U+24103 # <cjk> [2000] [Unicode3.1]
+0x8FEFCE U+7039 # <cjk> [2000]
+0x8FEFCF U+703A # <cjk> [2000]
+0x8FEFD0 U+703C # <cjk> [2000]
+0x8FEFD1 U+7043 # <cjk> [2000]
+0x8FEFD2 U+7047 # <cjk> [2000]
+0x8FEFD3 U+704B # <cjk> [2000]
+0x8FEFD4 U+3D9A # <cjk> [2000]
+0x8FEFD5 U+7054 # <cjk> [2000]
+0x8FEFD6 U+7065 # <cjk> [2000]
+0x8FEFD7 U+7069 # <cjk> [2000]
+0x8FEFD8 U+706C # <cjk> [2000]
+0x8FEFD9 U+706E # <cjk> [2000]
+0x8FEFDA U+7076 # <cjk> [2000]
+0x8FEFDB U+707E # <cjk> [2000]
+0x8FEFDC U+7081 # <cjk> [2000]
+0x8FEFDD U+7086 # <cjk> [2000]
+0x8FEFDE U+7095 # <cjk> [2000]
+0x8FEFDF U+7097 # <cjk> [2000]
+0x8FEFE0 U+70BB # <cjk> [2000]
+0x8FEFE1 U+241C6 # <cjk> [2000] [Unicode3.1]
+0x8FEFE2 U+709F # <cjk> [2000]
+0x8FEFE3 U+70B1 # <cjk> [2000]
+0x8FEFE4 U+241FE # <cjk> [2000] [Unicode3.1]
+0x8FEFE5 U+70EC # <cjk> [2000]
+0x8FEFE6 U+70CA # <cjk> [2000]
+0x8FEFE7 U+70D1 # <cjk> [2000]
+0x8FEFE8 U+70D3 # <cjk> [2000]
+0x8FEFE9 U+70DC # <cjk> [2000]
+0x8FEFEA U+7103 # <cjk> [2000]
+0x8FEFEB U+7104 # <cjk> [2000]
+0x8FEFEC U+7106 # <cjk> [2000]
+0x8FEFED U+7107 # <cjk> [2000]
+0x8FEFEE U+7108 # <cjk> [2000]
+0x8FEFEF U+710C # <cjk> [2000]
+0x8FEFF0 U+3DC0 # <cjk> [2000]
+0x8FEFF1 U+712F # <cjk> [2000]
+0x8FEFF2 U+7131 # <cjk> [2000]
+0x8FEFF3 U+7150 # <cjk> [2000]
+0x8FEFF4 U+714A # <cjk> [2000]
+0x8FEFF5 U+7153 # <cjk> [2000]
+0x8FEFF6 U+715E # <cjk> [2000]
+0x8FEFF7 U+3DD4 # <cjk> [2000]
+0x8FEFF8 U+7196 # <cjk> [2000]
+0x8FEFF9 U+7180 # <cjk> [2000]
+0x8FEFFA U+719B # <cjk> [2000]
+0x8FEFFB U+71A0 # <cjk> [2000]
+0x8FEFFC U+71A2 # <cjk> [2000]
+0x8FEFFD U+71AE # <cjk> [2000]
+0x8FEFFE U+71AF # <cjk> [2000]
+0x8FF0A1 U+71B3 # <cjk> [2000]
+0x8FF0A2 U+243BC # <cjk> [2000] [Unicode3.1]
+0x8FF0A3 U+71CB # <cjk> [2000]
+0x8FF0A4 U+71D3 # <cjk> [2000]
+0x8FF0A5 U+71D9 # <cjk> [2000]
+0x8FF0A6 U+71DC # <cjk> [2000]
+0x8FF0A7 U+7207 # <cjk> [2000]
+0x8FF0A8 U+3E05 # <cjk> [2000]
+0x8FF0A9 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2]
+0x8FF0AA U+722B # <cjk> [2000]
+0x8FF0AB U+7234 # <cjk> [2000]
+0x8FF0AC U+7238 # <cjk> [2000]
+0x8FF0AD U+7239 # <cjk> [2000]
+0x8FF0AE U+4E2C # <cjk> [2000]
+0x8FF0AF U+7242 # <cjk> [2000]
+0x8FF0B0 U+7253 # <cjk> [2000]
+0x8FF0B1 U+7257 # <cjk> [2000]
+0x8FF0B2 U+7263 # <cjk> [2000]
+0x8FF0B3 U+24629 # <cjk> [2000] [Unicode3.1]
+0x8FF0B4 U+726E # <cjk> [2000]
+0x8FF0B5 U+726F # <cjk> [2000]
+0x8FF0B6 U+7278 # <cjk> [2000]
+0x8FF0B7 U+727F # <cjk> [2000]
+0x8FF0B8 U+728E # <cjk> [2000]
+0x8FF0B9 U+246A5 # <cjk> [2000] [Unicode3.1]
+0x8FF0BA U+72AD # <cjk> [2000]
+0x8FF0BB U+72AE # <cjk> [2000]
+0x8FF0BC U+72B0 # <cjk> [2000]
+0x8FF0BD U+72B1 # <cjk> [2000]
+0x8FF0BE U+72C1 # <cjk> [2000]
+0x8FF0BF U+3E60 # <cjk> [2000]
+0x8FF0C0 U+72CC # <cjk> [2000]
+0x8FF0C1 U+3E66 # <cjk> [2000]
+0x8FF0C2 U+3E68 # <cjk> [2000]
+0x8FF0C3 U+72F3 # <cjk> [2000]
+0x8FF0C4 U+72FA # <cjk> [2000]
+0x8FF0C5 U+7307 # <cjk> [2000]
+0x8FF0C6 U+7312 # <cjk> [2000]
+0x8FF0C7 U+7318 # <cjk> [2000]
+0x8FF0C8 U+7319 # <cjk> [2000]
+0x8FF0C9 U+3E83 # <cjk> [2000]
+0x8FF0CA U+7339 # <cjk> [2000]
+0x8FF0CB U+732C # <cjk> [2000]
+0x8FF0CC U+7331 # <cjk> [2000]
+0x8FF0CD U+7333 # <cjk> [2000]
+0x8FF0CE U+733D # <cjk> [2000]
+0x8FF0CF U+7352 # <cjk> [2000]
+0x8FF0D0 U+3E94 # <cjk> [2000]
+0x8FF0D1 U+736B # <cjk> [2000]
+0x8FF0D2 U+736C # <cjk> [2000]
+0x8FF0D3 U+24896 # <cjk> [2000] [Unicode3.1]
+0x8FF0D4 U+736E # <cjk> [2000]
+0x8FF0D5 U+736F # <cjk> [2000]
+0x8FF0D6 U+7371 # <cjk> [2000]
+0x8FF0D7 U+7377 # <cjk> [2000]
+0x8FF0D8 U+7381 # <cjk> [2000]
+0x8FF0D9 U+7385 # <cjk> [2000]
+0x8FF0DA U+738A # <cjk> [2000]
+0x8FF0DB U+7394 # <cjk> [2000]
+0x8FF0DC U+7398 # <cjk> [2000]
+0x8FF0DD U+739C # <cjk> [2000]
+0x8FF0DE U+739E # <cjk> [2000]
+0x8FF0DF U+73A5 # <cjk> [2000]
+0x8FF0E0 U+73A8 # <cjk> [2000]
+0x8FF0E1 U+73B5 # <cjk> [2000]
+0x8FF0E2 U+73B7 # <cjk> [2000]
+0x8FF0E3 U+73B9 # <cjk> [2000]
+0x8FF0E4 U+73BC # <cjk> [2000]
+0x8FF0E5 U+73BF # <cjk> [2000]
+0x8FF0E6 U+73C5 # <cjk> [2000]
+0x8FF0E7 U+73CB # <cjk> [2000]
+0x8FF0E8 U+73E1 # <cjk> [2000]
+0x8FF0E9 U+73E7 # <cjk> [2000]
+0x8FF0EA U+73F9 # <cjk> [2000]
+0x8FF0EB U+7413 # <cjk> [2000]
+0x8FF0EC U+73FA # <cjk> [2000]
+0x8FF0ED U+7401 # <cjk> [2000]
+0x8FF0EE U+7424 # <cjk> [2000]
+0x8FF0EF U+7431 # <cjk> [2000]
+0x8FF0F0 U+7439 # <cjk> [2000]
+0x8FF0F1 U+7453 # <cjk> [2000]
+0x8FF0F2 U+7440 # <cjk> [2000]
+0x8FF0F3 U+7443 # <cjk> [2000]
+0x8FF0F4 U+744D # <cjk> [2000]
+0x8FF0F5 U+7452 # <cjk> [2000]
+0x8FF0F6 U+745D # <cjk> [2000]
+0x8FF0F7 U+7471 # <cjk> [2000]
+0x8FF0F8 U+7481 # <cjk> [2000]
+0x8FF0F9 U+7485 # <cjk> [2000]
+0x8FF0FA U+7488 # <cjk> [2000]
+0x8FF0FB U+24A4D # <cjk> [2000] [Unicode3.1]
+0x8FF0FC U+7492 # <cjk> [2000]
+0x8FF0FD U+7497 # <cjk> [2000]
+0x8FF0FE U+7499 # <cjk> [2000]
+0x8FF1A1 U+74A0 # <cjk> [2000]
+0x8FF1A2 U+74A1 # <cjk> [2000]
+0x8FF1A3 U+74A5 # <cjk> [2000]
+0x8FF1A4 U+74AA # <cjk> [2000]
+0x8FF1A5 U+74AB # <cjk> [2000]
+0x8FF1A6 U+74B9 # <cjk> [2000]
+0x8FF1A7 U+74BB # <cjk> [2000]
+0x8FF1A8 U+74BA # <cjk> [2000]
+0x8FF1A9 U+74D6 # <cjk> [2000]
+0x8FF1AA U+74D8 # <cjk> [2000]
+0x8FF1AB U+74DE # <cjk> [2000]
+0x8FF1AC U+74EF # <cjk> [2000]
+0x8FF1AD U+74EB # <cjk> [2000]
+0x8FF1AE U+24B56 # <cjk> [2000] [Unicode3.1]
+0x8FF1AF U+74FA # <cjk> [2000]
+0x8FF1B0 U+24B6F # <cjk> [2000] [Unicode3.1]
+0x8FF1B1 U+7520 # <cjk> [2000]
+0x8FF1B2 U+7524 # <cjk> [2000]
+0x8FF1B3 U+752A # <cjk> [2000]
+0x8FF1B4 U+3F57 # <cjk> [2000]
+0x8FF1B5 U+24C16 # <cjk> [2000] [Unicode3.1]
+0x8FF1B6 U+753D # <cjk> [2000]
+0x8FF1B7 U+753E # <cjk> [2000]
+0x8FF1B8 U+7540 # <cjk> [2000]
+0x8FF1B9 U+7548 # <cjk> [2000]
+0x8FF1BA U+754E # <cjk> [2000]
+0x8FF1BB U+7550 # <cjk> [2000]
+0x8FF1BC U+7552 # <cjk> [2000]
+0x8FF1BD U+756C # <cjk> [2000]
+0x8FF1BE U+7572 # <cjk> [2000]
+0x8FF1BF U+7571 # <cjk> [2000]
+0x8FF1C0 U+757A # <cjk> [2000]
+0x8FF1C1 U+757D # <cjk> [2000]
+0x8FF1C2 U+757E # <cjk> [2000]
+0x8FF1C3 U+7581 # <cjk> [2000]
+0x8FF1C4 U+24D14 # <cjk> [2000] [Unicode3.1]
+0x8FF1C5 U+758C # <cjk> [2000]
+0x8FF1C6 U+3F75 # <cjk> [2000]
+0x8FF1C7 U+75A2 # <cjk> [2000]
+0x8FF1C8 U+3F77 # <cjk> [2000]
+0x8FF1C9 U+75B0 # <cjk> [2000]
+0x8FF1CA U+75B7 # <cjk> [2000]
+0x8FF1CB U+75BF # <cjk> [2000]
+0x8FF1CC U+75C0 # <cjk> [2000]
+0x8FF1CD U+75C6 # <cjk> [2000]
+0x8FF1CE U+75CF # <cjk> [2000]
+0x8FF1CF U+75D3 # <cjk> [2000]
+0x8FF1D0 U+75DD # <cjk> [2000]
+0x8FF1D1 U+75DF # <cjk> [2000]
+0x8FF1D2 U+75E0 # <cjk> [2000]
+0x8FF1D3 U+75E7 # <cjk> [2000]
+0x8FF1D4 U+75EC # <cjk> [2000]
+0x8FF1D5 U+75EE # <cjk> [2000]
+0x8FF1D6 U+75F1 # <cjk> [2000]
+0x8FF1D7 U+75F9 # <cjk> [2000]
+0x8FF1D8 U+7603 # <cjk> [2000]
+0x8FF1D9 U+7618 # <cjk> [2000]
+0x8FF1DA U+7607 # <cjk> [2000]
+0x8FF1DB U+760F # <cjk> [2000]
+0x8FF1DC U+3FAE # <cjk> [2000]
+0x8FF1DD U+24E0E # <cjk> [2000] [Unicode3.1]
+0x8FF1DE U+7613 # <cjk> [2000]
+0x8FF1DF U+761B # <cjk> [2000]
+0x8FF1E0 U+761C # <cjk> [2000]
+0x8FF1E1 U+24E37 # <cjk> [2000] [Unicode3.1]
+0x8FF1E2 U+7625 # <cjk> [2000]
+0x8FF1E3 U+7628 # <cjk> [2000]
+0x8FF1E4 U+763C # <cjk> [2000]
+0x8FF1E5 U+7633 # <cjk> [2000]
+0x8FF1E6 U+24E6A # <cjk> [2000] [Unicode3.1]
+0x8FF1E7 U+3FC9 # <cjk> [2000]
+0x8FF1E8 U+7641 # <cjk> [2000]
+0x8FF1E9 U+24E8B # <cjk> [2000] [Unicode3.1]
+0x8FF1EA U+7649 # <cjk> [2000]
+0x8FF1EB U+7655 # <cjk> [2000]
+0x8FF1EC U+3FD7 # <cjk> [2000]
+0x8FF1ED U+766E # <cjk> [2000]
+0x8FF1EE U+7695 # <cjk> [2000]
+0x8FF1EF U+769C # <cjk> [2000]
+0x8FF1F0 U+76A1 # <cjk> [2000]
+0x8FF1F1 U+76A0 # <cjk> [2000]
+0x8FF1F2 U+76A7 # <cjk> [2000]
+0x8FF1F3 U+76A8 # <cjk> [2000]
+0x8FF1F4 U+76AF # <cjk> [2000]
+0x8FF1F5 U+2504A # <cjk> [2000] [Unicode3.1]
+0x8FF1F6 U+76C9 # <cjk> [2000]
+0x8FF1F7 U+25055 # <cjk> [2000] [Unicode3.1]
+0x8FF1F8 U+76E8 # <cjk> [2000]
+0x8FF1F9 U+76EC # <cjk> [2000]
+0x8FF1FA U+25122 # <cjk> [2000] [Unicode3.1]
+0x8FF1FB U+7717 # <cjk> [2000]
+0x8FF1FC U+771A # <cjk> [2000]
+0x8FF1FD U+772D # <cjk> [2000]
+0x8FF1FE U+7735 # <cjk> [2000]
+0x8FF2A1 U+251A9 # <cjk> [2000] [Unicode3.1]
+0x8FF2A2 U+4039 # <cjk> [2000]
+0x8FF2A3 U+251E5 # <cjk> [2000] [Unicode3.1]
+0x8FF2A4 U+251CD # <cjk> [2000] [Unicode3.1]
+0x8FF2A5 U+7758 # <cjk> [2000]
+0x8FF2A6 U+7760 # <cjk> [2000]
+0x8FF2A7 U+776A # <cjk> [2000]
+0x8FF2A8 U+2521E # <cjk> [2000] [Unicode3.1]
+0x8FF2A9 U+7772 # <cjk> [2000]
+0x8FF2AA U+777C # <cjk> [2000]
+0x8FF2AB U+777D # <cjk> [2000]
+0x8FF2AC U+2524C # <cjk> [2000] [Unicode3.1]
+0x8FF2AD U+4058 # <cjk> [2000]
+0x8FF2AE U+779A # <cjk> [2000]
+0x8FF2AF U+779F # <cjk> [2000]
+0x8FF2B0 U+77A2 # <cjk> [2000]
+0x8FF2B1 U+77A4 # <cjk> [2000]
+0x8FF2B2 U+77A9 # <cjk> [2000]
+0x8FF2B3 U+77DE # <cjk> [2000]
+0x8FF2B4 U+77DF # <cjk> [2000]
+0x8FF2B5 U+77E4 # <cjk> [2000]
+0x8FF2B6 U+77E6 # <cjk> [2000]
+0x8FF2B7 U+77EA # <cjk> [2000]
+0x8FF2B8 U+77EC # <cjk> [2000]
+0x8FF2B9 U+4093 # <cjk> [2000]
+0x8FF2BA U+77F0 # <cjk> [2000]
+0x8FF2BB U+77F4 # <cjk> [2000]
+0x8FF2BC U+77FB # <cjk> [2000]
+0x8FF2BD U+2542E # <cjk> [2000] [Unicode3.1]
+0x8FF2BE U+7805 # <cjk> [2000]
+0x8FF2BF U+7806 # <cjk> [2000]
+0x8FF2C0 U+7809 # <cjk> [2000]
+0x8FF2C1 U+780D # <cjk> [2000]
+0x8FF2C2 U+7819 # <cjk> [2000]
+0x8FF2C3 U+7821 # <cjk> [2000]
+0x8FF2C4 U+782C # <cjk> [2000]
+0x8FF2C5 U+7847 # <cjk> [2000]
+0x8FF2C6 U+7864 # <cjk> [2000]
+0x8FF2C7 U+786A # <cjk> [2000]
+0x8FF2C8 U+254D9 # <cjk> [2000] [Unicode3.1]
+0x8FF2C9 U+788A # <cjk> [2000]
+0x8FF2CA U+7894 # <cjk> [2000]
+0x8FF2CB U+78A4 # <cjk> [2000]
+0x8FF2CC U+789D # <cjk> [2000]
+0x8FF2CD U+789E # <cjk> [2000]
+0x8FF2CE U+789F # <cjk> [2000]
+0x8FF2CF U+78BB # <cjk> [2000]
+0x8FF2D0 U+78C8 # <cjk> [2000]
+0x8FF2D1 U+78CC # <cjk> [2000]
+0x8FF2D2 U+78CE # <cjk> [2000]
+0x8FF2D3 U+78D5 # <cjk> [2000]
+0x8FF2D4 U+78E0 # <cjk> [2000]
+0x8FF2D5 U+78E1 # <cjk> [2000]
+0x8FF2D6 U+78E6 # <cjk> [2000]
+0x8FF2D7 U+78F9 # <cjk> [2000]
+0x8FF2D8 U+78FA # <cjk> [2000]
+0x8FF2D9 U+78FB # <cjk> [2000]
+0x8FF2DA U+78FE # <cjk> [2000]
+0x8FF2DB U+255A7 # <cjk> [2000] [Unicode3.1]
+0x8FF2DC U+7910 # <cjk> [2000]
+0x8FF2DD U+791B # <cjk> [2000]
+0x8FF2DE U+7930 # <cjk> [2000]
+0x8FF2DF U+7925 # <cjk> [2000]
+0x8FF2E0 U+793B # <cjk> [2000]
+0x8FF2E1 U+794A # <cjk> [2000]
+0x8FF2E2 U+7958 # <cjk> [2000]
+0x8FF2E3 U+795B # <cjk> [2000]
+0x8FF2E4 U+4105 # <cjk> [2000]
+0x8FF2E5 U+7967 # <cjk> [2000]
+0x8FF2E6 U+7972 # <cjk> [2000]
+0x8FF2E7 U+7994 # <cjk> [2000]
+0x8FF2E8 U+7995 # <cjk> [2000]
+0x8FF2E9 U+7996 # <cjk> [2000]
+0x8FF2EA U+799B # <cjk> [2000]
+0x8FF2EB U+79A1 # <cjk> [2000]
+0x8FF2EC U+79A9 # <cjk> [2000]
+0x8FF2ED U+79B4 # <cjk> [2000]
+0x8FF2EE U+79BB # <cjk> [2000]
+0x8FF2EF U+79C2 # <cjk> [2000]
+0x8FF2F0 U+79C7 # <cjk> [2000]
+0x8FF2F1 U+79CC # <cjk> [2000]
+0x8FF2F2 U+79CD # <cjk> [2000]
+0x8FF2F3 U+79D6 # <cjk> [2000]
+0x8FF2F4 U+4148 # <cjk> [2000]
+0x8FF2F5 U+257A9 # <cjk> [2000] [Unicode3.1]
+0x8FF2F6 U+257B4 # <cjk> [2000] [Unicode3.1]
+0x8FF2F7 U+414F # <cjk> [2000]
+0x8FF2F8 U+7A0A # <cjk> [2000]
+0x8FF2F9 U+7A11 # <cjk> [2000]
+0x8FF2FA U+7A15 # <cjk> [2000]
+0x8FF2FB U+7A1B # <cjk> [2000]
+0x8FF2FC U+7A1E # <cjk> [2000]
+0x8FF2FD U+4163 # <cjk> [2000]
+0x8FF2FE U+7A2D # <cjk> [2000]
+0x8FF3A1 U+7A38 # <cjk> [2000]
+0x8FF3A2 U+7A47 # <cjk> [2000]
+0x8FF3A3 U+7A4C # <cjk> [2000]
+0x8FF3A4 U+7A56 # <cjk> [2000]
+0x8FF3A5 U+7A59 # <cjk> [2000]
+0x8FF3A6 U+7A5C # <cjk> [2000]
+0x8FF3A7 U+7A5F # <cjk> [2000]
+0x8FF3A8 U+7A60 # <cjk> [2000]
+0x8FF3A9 U+7A67 # <cjk> [2000]
+0x8FF3AA U+7A6A # <cjk> [2000]
+0x8FF3AB U+7A75 # <cjk> [2000]
+0x8FF3AC U+7A78 # <cjk> [2000]
+0x8FF3AD U+7A82 # <cjk> [2000]
+0x8FF3AE U+7A8A # <cjk> [2000]
+0x8FF3AF U+7A90 # <cjk> [2000]
+0x8FF3B0 U+7AA3 # <cjk> [2000]
+0x8FF3B1 U+7AAC # <cjk> [2000]
+0x8FF3B2 U+259D4 # <cjk> [2000] [Unicode3.1]
+0x8FF3B3 U+41B4 # <cjk> [2000]
+0x8FF3B4 U+7AB9 # <cjk> [2000]
+0x8FF3B5 U+7ABC # <cjk> [2000]
+0x8FF3B6 U+7ABE # <cjk> [2000]
+0x8FF3B7 U+41BF # <cjk> [2000]
+0x8FF3B8 U+7ACC # <cjk> [2000]
+0x8FF3B9 U+7AD1 # <cjk> [2000]
+0x8FF3BA U+7AE7 # <cjk> [2000]
+0x8FF3BB U+7AE8 # <cjk> [2000]
+0x8FF3BC U+7AF4 # <cjk> [2000]
+0x8FF3BD U+25AE4 # <cjk> [2000] [Unicode3.1]
+0x8FF3BE U+25AE3 # <cjk> [2000] [Unicode3.1]
+0x8FF3BF U+7B07 # <cjk> [2000]
+0x8FF3C0 U+25AF1 # <cjk> [2000] [Unicode3.1]
+0x8FF3C1 U+7B3D # <cjk> [2000]
+0x8FF3C2 U+7B27 # <cjk> [2000]
+0x8FF3C3 U+7B2A # <cjk> [2000]
+0x8FF3C4 U+7B2E # <cjk> [2000]
+0x8FF3C5 U+7B2F # <cjk> [2000]
+0x8FF3C6 U+7B31 # <cjk> [2000]
+0x8FF3C7 U+41E6 # <cjk> [2000]
+0x8FF3C8 U+41F3 # <cjk> [2000]
+0x8FF3C9 U+7B7F # <cjk> [2000]
+0x8FF3CA U+7B41 # <cjk> [2000]
+0x8FF3CB U+41EE # <cjk> [2000]
+0x8FF3CC U+7B55 # <cjk> [2000]
+0x8FF3CD U+7B79 # <cjk> [2000]
+0x8FF3CE U+7B64 # <cjk> [2000]
+0x8FF3CF U+7B66 # <cjk> [2000]
+0x8FF3D0 U+7B69 # <cjk> [2000]
+0x8FF3D1 U+7B73 # <cjk> [2000]
+0x8FF3D2 U+25BB2 # <cjk> [2000] [Unicode3.1]
+0x8FF3D3 U+4207 # <cjk> [2000]
+0x8FF3D4 U+7B90 # <cjk> [2000]
+0x8FF3D5 U+7B91 # <cjk> [2000]
+0x8FF3D6 U+7B9B # <cjk> [2000]
+0x8FF3D7 U+420E # <cjk> [2000]
+0x8FF3D8 U+7BAF # <cjk> [2000]
+0x8FF3D9 U+7BB5 # <cjk> [2000]
+0x8FF3DA U+7BBC # <cjk> [2000]
+0x8FF3DB U+7BC5 # <cjk> [2000]
+0x8FF3DC U+7BCA # <cjk> [2000]
+0x8FF3DD U+25C4B # <cjk> [2000] [Unicode3.1]
+0x8FF3DE U+25C64 # <cjk> [2000] [Unicode3.1]
+0x8FF3DF U+7BD4 # <cjk> [2000]
+0x8FF3E0 U+7BD6 # <cjk> [2000]
+0x8FF3E1 U+7BDA # <cjk> [2000]
+0x8FF3E2 U+7BEA # <cjk> [2000]
+0x8FF3E3 U+7BF0 # <cjk> [2000]
+0x8FF3E4 U+7C03 # <cjk> [2000]
+0x8FF3E5 U+7C0B # <cjk> [2000]
+0x8FF3E6 U+7C0E # <cjk> [2000]
+0x8FF3E7 U+7C0F # <cjk> [2000]
+0x8FF3E8 U+7C26 # <cjk> [2000]
+0x8FF3E9 U+7C45 # <cjk> [2000]
+0x8FF3EA U+7C4A # <cjk> [2000]
+0x8FF3EB U+7C51 # <cjk> [2000]
+0x8FF3EC U+7C57 # <cjk> [2000]
+0x8FF3ED U+7C5E # <cjk> [2000]
+0x8FF3EE U+7C61 # <cjk> [2000]
+0x8FF3EF U+7C69 # <cjk> [2000]
+0x8FF3F0 U+7C6E # <cjk> [2000]
+0x8FF3F1 U+7C6F # <cjk> [2000]
+0x8FF3F2 U+7C70 # <cjk> [2000]
+0x8FF3F3 U+25E2E # <cjk> [2000] [Unicode3.1]
+0x8FF3F4 U+25E56 # <cjk> [2000] [Unicode3.1]
+0x8FF3F5 U+25E65 # <cjk> [2000] [Unicode3.1]
+0x8FF3F6 U+7CA6 # <cjk> [2000]
+0x8FF3F7 U+25E62 # <cjk> [2000] [Unicode3.1]
+0x8FF3F8 U+7CB6 # <cjk> [2000]
+0x8FF3F9 U+7CB7 # <cjk> [2000]
+0x8FF3FA U+7CBF # <cjk> [2000]
+0x8FF3FB U+25ED8 # <cjk> [2000] [Unicode3.1]
+0x8FF3FC U+7CC4 # <cjk> [2000]
+0x8FF3FD U+25EC2 # <cjk> [2000] [Unicode3.1]
+0x8FF3FE U+7CC8 # <cjk> [2000]
+0x8FF4A1 U+7CCD # <cjk> [2000]
+0x8FF4A2 U+25EE8 # <cjk> [2000] [Unicode3.1]
+0x8FF4A3 U+7CD7 # <cjk> [2000]
+0x8FF4A4 U+25F23 # <cjk> [2000] [Unicode3.1]
+0x8FF4A5 U+7CE6 # <cjk> [2000]
+0x8FF4A6 U+7CEB # <cjk> [2000]
+0x8FF4A7 U+25F5C # <cjk> [2000] [Unicode3.1]
+0x8FF4A8 U+7CF5 # <cjk> [2000]
+0x8FF4A9 U+7D03 # <cjk> [2000]
+0x8FF4AA U+7D09 # <cjk> [2000]
+0x8FF4AB U+42C6 # <cjk> [2000]
+0x8FF4AC U+7D12 # <cjk> [2000]
+0x8FF4AD U+7D1E # <cjk> [2000]
+0x8FF4AE U+25FE0 # <cjk> [2000] [Unicode3.1]
+0x8FF4AF U+25FD4 # <cjk> [2000] [Unicode3.1]
+0x8FF4B0 U+7D3D # <cjk> [2000]
+0x8FF4B1 U+7D3E # <cjk> [2000]
+0x8FF4B2 U+7D40 # <cjk> [2000]
+0x8FF4B3 U+7D47 # <cjk> [2000]
+0x8FF4B4 U+2600C # <cjk> [2000] [Unicode3.1]
+0x8FF4B5 U+25FFB # <cjk> [2000] [Unicode3.1]
+0x8FF4B6 U+42D6 # <cjk> [2000]
+0x8FF4B7 U+7D59 # <cjk> [2000]
+0x8FF4B8 U+7D5A # <cjk> [2000]
+0x8FF4B9 U+7D6A # <cjk> [2000]
+0x8FF4BA U+7D70 # <cjk> [2000]
+0x8FF4BB U+42DD # <cjk> [2000]
+0x8FF4BC U+7D7F # <cjk> [2000]
+0x8FF4BD U+26017 # <cjk> [2000] [Unicode3.1]
+0x8FF4BE U+7D86 # <cjk> [2000]
+0x8FF4BF U+7D88 # <cjk> [2000]
+0x8FF4C0 U+7D8C # <cjk> [2000]
+0x8FF4C1 U+7D97 # <cjk> [2000]
+0x8FF4C2 U+26060 # <cjk> [2000] [Unicode3.1]
+0x8FF4C3 U+7D9D # <cjk> [2000]
+0x8FF4C4 U+7DA7 # <cjk> [2000]
+0x8FF4C5 U+7DAA # <cjk> [2000]
+0x8FF4C6 U+7DB6 # <cjk> [2000]
+0x8FF4C7 U+7DB7 # <cjk> [2000]
+0x8FF4C8 U+7DC0 # <cjk> [2000]
+0x8FF4C9 U+7DD7 # <cjk> [2000]
+0x8FF4CA U+7DD9 # <cjk> [2000]
+0x8FF4CB U+7DE6 # <cjk> [2000]
+0x8FF4CC U+7DF1 # <cjk> [2000]
+0x8FF4CD U+7DF9 # <cjk> [2000]
+0x8FF4CE U+4302 # <cjk> [2000]
+0x8FF4CF U+260ED # <cjk> [2000] [Unicode3.1]
+0x8FF4D0 U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2]
+0x8FF4D1 U+7E10 # <cjk> [2000]
+0x8FF4D2 U+7E17 # <cjk> [2000]
+0x8FF4D3 U+7E1D # <cjk> [2000]
+0x8FF4D4 U+7E20 # <cjk> [2000]
+0x8FF4D5 U+7E27 # <cjk> [2000]
+0x8FF4D6 U+7E2C # <cjk> [2000]
+0x8FF4D7 U+7E45 # <cjk> [2000]
+0x8FF4D8 U+7E73 # <cjk> [2000]
+0x8FF4D9 U+7E75 # <cjk> [2000]
+0x8FF4DA U+7E7E # <cjk> [2000]
+0x8FF4DB U+7E86 # <cjk> [2000]
+0x8FF4DC U+7E87 # <cjk> [2000]
+0x8FF4DD U+432B # <cjk> [2000]
+0x8FF4DE U+7E91 # <cjk> [2000]
+0x8FF4DF U+7E98 # <cjk> [2000]
+0x8FF4E0 U+7E9A # <cjk> [2000]
+0x8FF4E1 U+4343 # <cjk> [2000]
+0x8FF4E2 U+7F3C # <cjk> [2000]
+0x8FF4E3 U+7F3B # <cjk> [2000]
+0x8FF4E4 U+7F3E # <cjk> [2000]
+0x8FF4E5 U+7F43 # <cjk> [2000]
+0x8FF4E6 U+7F44 # <cjk> [2000]
+0x8FF4E7 U+7F4F # <cjk> [2000]
+0x8FF4E8 U+34C1 # <cjk> [2000]
+0x8FF4E9 U+26270 # <cjk> [2000] [Unicode3.1]
+0x8FF4EA U+7F52 # <cjk> [2000]
+0x8FF4EB U+26286 # <cjk> [2000] [Unicode3.1]
+0x8FF4EC U+7F61 # <cjk> [2000]
+0x8FF4ED U+7F63 # <cjk> [2000]
+0x8FF4EE U+7F64 # <cjk> [2000]
+0x8FF4EF U+7F6D # <cjk> [2000]
+0x8FF4F0 U+7F7D # <cjk> [2000]
+0x8FF4F1 U+7F7E # <cjk> [2000]
+0x8FF4F2 U+2634C # <cjk> [2000] [Unicode3.1]
+0x8FF4F3 U+7F90 # <cjk> [2000]
+0x8FF4F4 U+517B # <cjk> [2000]
+0x8FF4F5 U+23D0E # <cjk> [2000] [Unicode3.1]
+0x8FF4F6 U+7F96 # <cjk> [2000]
+0x8FF4F7 U+7F9C # <cjk> [2000]
+0x8FF4F8 U+7FAD # <cjk> [2000]
+0x8FF4F9 U+26402 # <cjk> [2000] [Unicode3.1]
+0x8FF4FA U+7FC3 # <cjk> [2000]
+0x8FF4FB U+7FCF # <cjk> [2000]
+0x8FF4FC U+7FE3 # <cjk> [2000]
+0x8FF4FD U+7FE5 # <cjk> [2000]
+0x8FF4FE U+7FEF # <cjk> [2000]
+0x8FF5A1 U+7FF2 # <cjk> [2000]
+0x8FF5A2 U+8002 # <cjk> [2000]
+0x8FF5A3 U+800A # <cjk> [2000]
+0x8FF5A4 U+8008 # <cjk> [2000]
+0x8FF5A5 U+800E # <cjk> [2000]
+0x8FF5A6 U+8011 # <cjk> [2000]
+0x8FF5A7 U+8016 # <cjk> [2000]
+0x8FF5A8 U+8024 # <cjk> [2000]
+0x8FF5A9 U+802C # <cjk> [2000]
+0x8FF5AA U+8030 # <cjk> [2000]
+0x8FF5AB U+8043 # <cjk> [2000]
+0x8FF5AC U+8066 # <cjk> [2000]
+0x8FF5AD U+8071 # <cjk> [2000]
+0x8FF5AE U+8075 # <cjk> [2000]
+0x8FF5AF U+807B # <cjk> [2000]
+0x8FF5B0 U+8099 # <cjk> [2000]
+0x8FF5B1 U+809C # <cjk> [2000]
+0x8FF5B2 U+80A4 # <cjk> [2000]
+0x8FF5B3 U+80A7 # <cjk> [2000]
+0x8FF5B4 U+80B8 # <cjk> [2000]
+0x8FF5B5 U+2667E # <cjk> [2000] [Unicode3.1]
+0x8FF5B6 U+80C5 # <cjk> [2000]
+0x8FF5B7 U+80D5 # <cjk> [2000]
+0x8FF5B8 U+80D8 # <cjk> [2000]
+0x8FF5B9 U+80E6 # <cjk> [2000]
+0x8FF5BA U+266B0 # <cjk> [2000] [Unicode3.1]
+0x8FF5BB U+810D # <cjk> [2000]
+0x8FF5BC U+80F5 # <cjk> [2000]
+0x8FF5BD U+80FB # <cjk> [2000]
+0x8FF5BE U+43EE # <cjk> [2000]
+0x8FF5BF U+8135 # <cjk> [2000]
+0x8FF5C0 U+8116 # <cjk> [2000]
+0x8FF5C1 U+811E # <cjk> [2000]
+0x8FF5C2 U+43F0 # <cjk> [2000]
+0x8FF5C3 U+8124 # <cjk> [2000]
+0x8FF5C4 U+8127 # <cjk> [2000]
+0x8FF5C5 U+812C # <cjk> [2000]
+0x8FF5C6 U+2671D # <cjk> [2000] [Unicode3.1]
+0x8FF5C7 U+813D # <cjk> [2000]
+0x8FF5C8 U+4408 # <cjk> [2000]
+0x8FF5C9 U+8169 # <cjk> [2000]
+0x8FF5CA U+4417 # <cjk> [2000]
+0x8FF5CB U+8181 # <cjk> [2000]
+0x8FF5CC U+441C # <cjk> [2000]
+0x8FF5CD U+8184 # <cjk> [2000]
+0x8FF5CE U+8185 # <cjk> [2000]
+0x8FF5CF U+4422 # <cjk> [2000]
+0x8FF5D0 U+8198 # <cjk> [2000]
+0x8FF5D1 U+81B2 # <cjk> [2000]
+0x8FF5D2 U+81C1 # <cjk> [2000]
+0x8FF5D3 U+81C3 # <cjk> [2000]
+0x8FF5D4 U+81D6 # <cjk> [2000]
+0x8FF5D5 U+81DB # <cjk> [2000]
+0x8FF5D6 U+268DD # <cjk> [2000] [Unicode3.1]
+0x8FF5D7 U+81E4 # <cjk> [2000]
+0x8FF5D8 U+268EA # <cjk> [2000] [Unicode3.1]
+0x8FF5D9 U+81EC # <cjk> [2000]
+0x8FF5DA U+26951 # <cjk> [2000] [Unicode3.1]
+0x8FF5DB U+81FD # <cjk> [2000]
+0x8FF5DC U+81FF # <cjk> [2000]
+0x8FF5DD U+2696F # <cjk> [2000] [Unicode3.1]
+0x8FF5DE U+8204 # <cjk> [2000]
+0x8FF5DF U+269DD # <cjk> [2000] [Unicode3.1]
+0x8FF5E0 U+8219 # <cjk> [2000]
+0x8FF5E1 U+8221 # <cjk> [2000]
+0x8FF5E2 U+8222 # <cjk> [2000]
+0x8FF5E3 U+26A1E # <cjk> [2000] [Unicode3.1]
+0x8FF5E4 U+8232 # <cjk> [2000]
+0x8FF5E5 U+8234 # <cjk> [2000]
+0x8FF5E6 U+823C # <cjk> [2000]
+0x8FF5E7 U+8246 # <cjk> [2000]
+0x8FF5E8 U+8249 # <cjk> [2000]
+0x8FF5E9 U+8245 # <cjk> [2000]
+0x8FF5EA U+26A58 # <cjk> [2000] [Unicode3.1]
+0x8FF5EB U+824B # <cjk> [2000]
+0x8FF5EC U+4476 # <cjk> [2000]
+0x8FF5ED U+824F # <cjk> [2000]
+0x8FF5EE U+447A # <cjk> [2000]
+0x8FF5EF U+8257 # <cjk> [2000]
+0x8FF5F0 U+26A8C # <cjk> [2000] [Unicode3.1]
+0x8FF5F1 U+825C # <cjk> [2000]
+0x8FF5F2 U+8263 # <cjk> [2000]
+0x8FF5F3 U+26AB7 # <cjk> [2000] [Unicode3.1]
+0x8FF5F4 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2]
+0x8FF5F5 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2]
+0x8FF5F6 U+8279 # <cjk> [2000]
+0x8FF5F7 U+4491 # <cjk> [2000]
+0x8FF5F8 U+827D # <cjk> [2000]
+0x8FF5F9 U+827F # <cjk> [2000]
+0x8FF5FA U+8283 # <cjk> [2000]
+0x8FF5FB U+828A # <cjk> [2000]
+0x8FF5FC U+8293 # <cjk> [2000]
+0x8FF5FD U+82A7 # <cjk> [2000]
+0x8FF5FE U+82A8 # <cjk> [2000]
+0x8FF6A1 U+82B2 # <cjk> [2000]
+0x8FF6A2 U+82B4 # <cjk> [2000]
+0x8FF6A3 U+82BA # <cjk> [2000]
+0x8FF6A4 U+82BC # <cjk> [2000]
+0x8FF6A5 U+82E2 # <cjk> [2000]
+0x8FF6A6 U+82E8 # <cjk> [2000]
+0x8FF6A7 U+82F7 # <cjk> [2000]
+0x8FF6A8 U+8307 # <cjk> [2000]
+0x8FF6A9 U+8308 # <cjk> [2000]
+0x8FF6AA U+830C # <cjk> [2000]
+0x8FF6AB U+8354 # <cjk> [2000]
+0x8FF6AC U+831B # <cjk> [2000]
+0x8FF6AD U+831D # <cjk> [2000]
+0x8FF6AE U+8330 # <cjk> [2000]
+0x8FF6AF U+833C # <cjk> [2000]
+0x8FF6B0 U+8344 # <cjk> [2000]
+0x8FF6B1 U+8357 # <cjk> [2000]
+0x8FF6B2 U+44BE # <cjk> [2000]
+0x8FF6B3 U+837F # <cjk> [2000]
+0x8FF6B4 U+44D4 # <cjk> [2000]
+0x8FF6B5 U+44B3 # <cjk> [2000]
+0x8FF6B6 U+838D # <cjk> [2000]
+0x8FF6B7 U+8394 # <cjk> [2000]
+0x8FF6B8 U+8395 # <cjk> [2000]
+0x8FF6B9 U+839B # <cjk> [2000]
+0x8FF6BA U+839D # <cjk> [2000]
+0x8FF6BB U+83C9 # <cjk> [2000]
+0x8FF6BC U+83D0 # <cjk> [2000]
+0x8FF6BD U+83D4 # <cjk> [2000]
+0x8FF6BE U+83DD # <cjk> [2000]
+0x8FF6BF U+83E5 # <cjk> [2000]
+0x8FF6C0 U+83F9 # <cjk> [2000]
+0x8FF6C1 U+840F # <cjk> [2000]
+0x8FF6C2 U+8411 # <cjk> [2000]
+0x8FF6C3 U+8415 # <cjk> [2000]
+0x8FF6C4 U+26C73 # <cjk> [2000] [Unicode3.1]
+0x8FF6C5 U+8417 # <cjk> [2000]
+0x8FF6C6 U+8439 # <cjk> [2000]
+0x8FF6C7 U+844A # <cjk> [2000]
+0x8FF6C8 U+844F # <cjk> [2000]
+0x8FF6C9 U+8451 # <cjk> [2000]
+0x8FF6CA U+8452 # <cjk> [2000]
+0x8FF6CB U+8459 # <cjk> [2000]
+0x8FF6CC U+845A # <cjk> [2000]
+0x8FF6CD U+845C # <cjk> [2000]
+0x8FF6CE U+26CDD # <cjk> [2000] [Unicode3.1]
+0x8FF6CF U+8465 # <cjk> [2000]
+0x8FF6D0 U+8476 # <cjk> [2000]
+0x8FF6D1 U+8478 # <cjk> [2000]
+0x8FF6D2 U+847C # <cjk> [2000]
+0x8FF6D3 U+8481 # <cjk> [2000]
+0x8FF6D4 U+450D # <cjk> [2000]
+0x8FF6D5 U+84DC # <cjk> [2000]
+0x8FF6D6 U+8497 # <cjk> [2000]
+0x8FF6D7 U+84A6 # <cjk> [2000]
+0x8FF6D8 U+84BE # <cjk> [2000]
+0x8FF6D9 U+4508 # <cjk> [2000]
+0x8FF6DA U+84CE # <cjk> [2000]
+0x8FF6DB U+84CF # <cjk> [2000]
+0x8FF6DC U+84D3 # <cjk> [2000]
+0x8FF6DD U+26E65 # <cjk> [2000] [Unicode3.1]
+0x8FF6DE U+84E7 # <cjk> [2000]
+0x8FF6DF U+84EA # <cjk> [2000]
+0x8FF6E0 U+84EF # <cjk> [2000]
+0x8FF6E1 U+84F0 # <cjk> [2000]
+0x8FF6E2 U+84F1 # <cjk> [2000]
+0x8FF6E3 U+84FA # <cjk> [2000]
+0x8FF6E4 U+84FD # <cjk> [2000]
+0x8FF6E5 U+850C # <cjk> [2000]
+0x8FF6E6 U+851B # <cjk> [2000]
+0x8FF6E7 U+8524 # <cjk> [2000]
+0x8FF6E8 U+8525 # <cjk> [2000]
+0x8FF6E9 U+852B # <cjk> [2000]
+0x8FF6EA U+8534 # <cjk> [2000]
+0x8FF6EB U+854F # <cjk> [2000]
+0x8FF6EC U+856F # <cjk> [2000]
+0x8FF6ED U+4525 # <cjk> [2000]
+0x8FF6EE U+4543 # <cjk> [2000]
+0x8FF6EF U+853E # <cjk> [2000]
+0x8FF6F0 U+8551 # <cjk> [2000]
+0x8FF6F1 U+8553 # <cjk> [2000]
+0x8FF6F2 U+855E # <cjk> [2000]
+0x8FF6F3 U+8561 # <cjk> [2000]
+0x8FF6F4 U+8562 # <cjk> [2000]
+0x8FF6F5 U+26F94 # <cjk> [2000] [Unicode3.1]
+0x8FF6F6 U+857B # <cjk> [2000]
+0x8FF6F7 U+857D # <cjk> [2000]
+0x8FF6F8 U+857F # <cjk> [2000]
+0x8FF6F9 U+8581 # <cjk> [2000]
+0x8FF6FA U+8586 # <cjk> [2000]
+0x8FF6FB U+8593 # <cjk> [2000]
+0x8FF6FC U+859D # <cjk> [2000]
+0x8FF6FD U+859F # <cjk> [2000]
+0x8FF6FE U+26FF8 # <cjk> [2000] [Unicode3.1]
+0x8FF7A1 U+26FF6 # <cjk> [2000] [Unicode3.1]
+0x8FF7A2 U+26FF7 # <cjk> [2000] [Unicode3.1]
+0x8FF7A3 U+85B7 # <cjk> [2000]
+0x8FF7A4 U+85BC # <cjk> [2000]
+0x8FF7A5 U+85C7 # <cjk> [2000]
+0x8FF7A6 U+85CA # <cjk> [2000]
+0x8FF7A7 U+85D8 # <cjk> [2000]
+0x8FF7A8 U+85D9 # <cjk> [2000]
+0x8FF7A9 U+85DF # <cjk> [2000]
+0x8FF7AA U+85E1 # <cjk> [2000]
+0x8FF7AB U+85E6 # <cjk> [2000]
+0x8FF7AC U+85F6 # <cjk> [2000]
+0x8FF7AD U+8600 # <cjk> [2000]
+0x8FF7AE U+8611 # <cjk> [2000]
+0x8FF7AF U+861E # <cjk> [2000]
+0x8FF7B0 U+8621 # <cjk> [2000]
+0x8FF7B1 U+8624 # <cjk> [2000]
+0x8FF7B2 U+8627 # <cjk> [2000]
+0x8FF7B3 U+2710D # <cjk> [2000] [Unicode3.1]
+0x8FF7B4 U+8639 # <cjk> [2000]
+0x8FF7B5 U+863C # <cjk> [2000]
+0x8FF7B6 U+27139 # <cjk> [2000] [Unicode3.1]
+0x8FF7B7 U+8640 # <cjk> [2000]
+0x8FF7B8 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000]
+0x8FF7B9 U+8653 # <cjk> [2000]
+0x8FF7BA U+8656 # <cjk> [2000]
+0x8FF7BB U+866F # <cjk> [2000]
+0x8FF7BC U+8677 # <cjk> [2000]
+0x8FF7BD U+867A # <cjk> [2000]
+0x8FF7BE U+8687 # <cjk> [2000]
+0x8FF7BF U+8689 # <cjk> [2000]
+0x8FF7C0 U+868D # <cjk> [2000]
+0x8FF7C1 U+8691 # <cjk> [2000]
+0x8FF7C2 U+869C # <cjk> [2000]
+0x8FF7C3 U+869D # <cjk> [2000]
+0x8FF7C4 U+86A8 # <cjk> [2000]
+0x8FF7C5 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000]
+0x8FF7C6 U+86B1 # <cjk> [2000]
+0x8FF7C7 U+86B3 # <cjk> [2000]
+0x8FF7C8 U+86C1 # <cjk> [2000]
+0x8FF7C9 U+86C3 # <cjk> [2000]
+0x8FF7CA U+86D1 # <cjk> [2000]
+0x8FF7CB U+86D5 # <cjk> [2000]
+0x8FF7CC U+86D7 # <cjk> [2000]
+0x8FF7CD U+86E3 # <cjk> [2000]
+0x8FF7CE U+86E6 # <cjk> [2000]
+0x8FF7CF U+45B8 # <cjk> [2000]
+0x8FF7D0 U+8705 # <cjk> [2000]
+0x8FF7D1 U+8707 # <cjk> [2000]
+0x8FF7D2 U+870E # <cjk> [2000]
+0x8FF7D3 U+8710 # <cjk> [2000]
+0x8FF7D4 U+8713 # <cjk> [2000]
+0x8FF7D5 U+8719 # <cjk> [2000]
+0x8FF7D6 U+871F # <cjk> [2000]
+0x8FF7D7 U+8721 # <cjk> [2000]
+0x8FF7D8 U+8723 # <cjk> [2000]
+0x8FF7D9 U+8731 # <cjk> [2000]
+0x8FF7DA U+873A # <cjk> [2000]
+0x8FF7DB U+873E # <cjk> [2000]
+0x8FF7DC U+8740 # <cjk> [2000]
+0x8FF7DD U+8743 # <cjk> [2000]
+0x8FF7DE U+8751 # <cjk> [2000]
+0x8FF7DF U+8758 # <cjk> [2000]
+0x8FF7E0 U+8764 # <cjk> [2000]
+0x8FF7E1 U+8765 # <cjk> [2000]
+0x8FF7E2 U+8772 # <cjk> [2000]
+0x8FF7E3 U+877C # <cjk> [2000]
+0x8FF7E4 U+273DB # <cjk> [2000] [Unicode3.1]
+0x8FF7E5 U+273DA # <cjk> [2000] [Unicode3.1]
+0x8FF7E6 U+87A7 # <cjk> [2000]
+0x8FF7E7 U+8789 # <cjk> [2000]
+0x8FF7E8 U+878B # <cjk> [2000]
+0x8FF7E9 U+8793 # <cjk> [2000]
+0x8FF7EA U+87A0 # <cjk> [2000]
+0x8FF7EB U+273FE # <cjk> [2000] [Unicode3.1]
+0x8FF7EC U+45E5 # <cjk> [2000]
+0x8FF7ED U+87BE # <cjk> [2000]
+0x8FF7EE U+27410 # <cjk> [2000] [Unicode3.1]
+0x8FF7EF U+87C1 # <cjk> [2000]
+0x8FF7F0 U+87CE # <cjk> [2000]
+0x8FF7F1 U+87F5 # <cjk> [2000]
+0x8FF7F2 U+87DF # <cjk> [2000]
+0x8FF7F3 U+27449 # <cjk> [2000] [Unicode3.1]
+0x8FF7F4 U+87E3 # <cjk> [2000]
+0x8FF7F5 U+87E5 # <cjk> [2000]
+0x8FF7F6 U+87E6 # <cjk> [2000]
+0x8FF7F7 U+87EA # <cjk> [2000]
+0x8FF7F8 U+87EB # <cjk> [2000]
+0x8FF7F9 U+87ED # <cjk> [2000]
+0x8FF7FA U+8801 # <cjk> [2000]
+0x8FF7FB U+8803 # <cjk> [2000]
+0x8FF7FC U+880B # <cjk> [2000]
+0x8FF7FD U+8813 # <cjk> [2000]
+0x8FF7FE U+8828 # <cjk> [2000]
+0x8FF8A1 U+882E # <cjk> [2000]
+0x8FF8A2 U+8832 # <cjk> [2000]
+0x8FF8A3 U+883C # <cjk> [2000]
+0x8FF8A4 U+460F # <cjk> [2000]
+0x8FF8A5 U+884A # <cjk> [2000]
+0x8FF8A6 U+8858 # <cjk> [2000]
+0x8FF8A7 U+885F # <cjk> [2000]
+0x8FF8A8 U+8864 # <cjk> [2000]
+0x8FF8A9 U+27615 # <cjk> [2000] [Unicode3.1]
+0x8FF8AA U+27614 # <cjk> [2000] [Unicode3.1]
+0x8FF8AB U+8869 # <cjk> [2000]
+0x8FF8AC U+27631 # <cjk> [2000] [Unicode3.1]
+0x8FF8AD U+886F # <cjk> [2000]
+0x8FF8AE U+88A0 # <cjk> [2000]
+0x8FF8AF U+88BC # <cjk> [2000]
+0x8FF8B0 U+88BD # <cjk> [2000]
+0x8FF8B1 U+88BE # <cjk> [2000]
+0x8FF8B2 U+88C0 # <cjk> [2000]
+0x8FF8B3 U+88D2 # <cjk> [2000]
+0x8FF8B4 U+27693 # <cjk> [2000] [Unicode3.1]
+0x8FF8B5 U+88D1 # <cjk> [2000]
+0x8FF8B6 U+88D3 # <cjk> [2000]
+0x8FF8B7 U+88DB # <cjk> [2000]
+0x8FF8B8 U+88F0 # <cjk> [2000]
+0x8FF8B9 U+88F1 # <cjk> [2000]
+0x8FF8BA U+4641 # <cjk> [2000]
+0x8FF8BB U+8901 # <cjk> [2000]
+0x8FF8BC U+2770E # <cjk> [2000] [Unicode3.1]
+0x8FF8BD U+8937 # <cjk> [2000]
+0x8FF8BE U+27723 # <cjk> [2000] [Unicode3.1]
+0x8FF8BF U+8942 # <cjk> [2000]
+0x8FF8C0 U+8945 # <cjk> [2000]
+0x8FF8C1 U+8949 # <cjk> [2000]
+0x8FF8C2 U+27752 # <cjk> [2000] [Unicode3.1]
+0x8FF8C3 U+4665 # <cjk> [2000]
+0x8FF8C4 U+8962 # <cjk> [2000]
+0x8FF8C5 U+8980 # <cjk> [2000]
+0x8FF8C6 U+8989 # <cjk> [2000]
+0x8FF8C7 U+8990 # <cjk> [2000]
+0x8FF8C8 U+899F # <cjk> [2000]
+0x8FF8C9 U+89B0 # <cjk> [2000]
+0x8FF8CA U+89B7 # <cjk> [2000]
+0x8FF8CB U+89D6 # <cjk> [2000]
+0x8FF8CC U+89D8 # <cjk> [2000]
+0x8FF8CD U+89EB # <cjk> [2000]
+0x8FF8CE U+46A1 # <cjk> [2000]
+0x8FF8CF U+89F1 # <cjk> [2000]
+0x8FF8D0 U+89F3 # <cjk> [2000]
+0x8FF8D1 U+89FD # <cjk> [2000]
+0x8FF8D2 U+89FF # <cjk> [2000]
+0x8FF8D3 U+46AF # <cjk> [2000]
+0x8FF8D4 U+8A11 # <cjk> [2000]
+0x8FF8D5 U+8A14 # <cjk> [2000]
+0x8FF8D6 U+27985 # <cjk> [2000] [Unicode3.1]
+0x8FF8D7 U+8A21 # <cjk> [2000]
+0x8FF8D8 U+8A35 # <cjk> [2000]
+0x8FF8D9 U+8A3E # <cjk> [2000]
+0x8FF8DA U+8A45 # <cjk> [2000]
+0x8FF8DB U+8A4D # <cjk> [2000]
+0x8FF8DC U+8A58 # <cjk> [2000]
+0x8FF8DD U+8AAE # <cjk> [2000]
+0x8FF8DE U+8A90 # <cjk> [2000]
+0x8FF8DF U+8AB7 # <cjk> [2000]
+0x8FF8E0 U+8ABE # <cjk> [2000]
+0x8FF8E1 U+8AD7 # <cjk> [2000]
+0x8FF8E2 U+8AFC # <cjk> [2000]
+0x8FF8E3 U+27A84 # <cjk> [2000] [Unicode3.1]
+0x8FF8E4 U+8B0A # <cjk> [2000]
+0x8FF8E5 U+8B05 # <cjk> [2000]
+0x8FF8E6 U+8B0D # <cjk> [2000]
+0x8FF8E7 U+8B1C # <cjk> [2000]
+0x8FF8E8 U+8B1F # <cjk> [2000]
+0x8FF8E9 U+8B2D # <cjk> [2000]
+0x8FF8EA U+8B43 # <cjk> [2000]
+0x8FF8EB U+470C # <cjk> [2000]
+0x8FF8EC U+8B51 # <cjk> [2000]
+0x8FF8ED U+8B5E # <cjk> [2000]
+0x8FF8EE U+8B76 # <cjk> [2000]
+0x8FF8EF U+8B7F # <cjk> [2000]
+0x8FF8F0 U+8B81 # <cjk> [2000]
+0x8FF8F1 U+8B8B # <cjk> [2000]
+0x8FF8F2 U+8B94 # <cjk> [2000]
+0x8FF8F3 U+8B95 # <cjk> [2000]
+0x8FF8F4 U+8B9C # <cjk> [2000]
+0x8FF8F5 U+8B9E # <cjk> [2000]
+0x8FF8F6 U+8C39 # <cjk> [2000]
+0x8FF8F7 U+27BB3 # <cjk> [2000] [Unicode3.1]
+0x8FF8F8 U+8C3D # <cjk> [2000]
+0x8FF8F9 U+27BBE # <cjk> [2000] [Unicode3.1]
+0x8FF8FA U+27BC7 # <cjk> [2000] [Unicode3.1]
+0x8FF8FB U+8C45 # <cjk> [2000]
+0x8FF8FC U+8C47 # <cjk> [2000]
+0x8FF8FD U+8C4F # <cjk> [2000]
+0x8FF8FE U+8C54 # <cjk> [2000]
+0x8FF9A1 U+8C57 # <cjk> [2000]
+0x8FF9A2 U+8C69 # <cjk> [2000]
+0x8FF9A3 U+8C6D # <cjk> [2000]
+0x8FF9A4 U+8C73 # <cjk> [2000]
+0x8FF9A5 U+27CB8 # <cjk> [2000] [Unicode3.1]
+0x8FF9A6 U+8C93 # <cjk> [2000]
+0x8FF9A7 U+8C92 # <cjk> [2000]
+0x8FF9A8 U+8C99 # <cjk> [2000]
+0x8FF9A9 U+4764 # <cjk> [2000]
+0x8FF9AA U+8C9B # <cjk> [2000]
+0x8FF9AB U+8CA4 # <cjk> [2000]
+0x8FF9AC U+8CD6 # <cjk> [2000]
+0x8FF9AD U+8CD5 # <cjk> [2000]
+0x8FF9AE U+8CD9 # <cjk> [2000]
+0x8FF9AF U+27DA0 # <cjk> [2000] [Unicode3.1]
+0x8FF9B0 U+8CF0 # <cjk> [2000]
+0x8FF9B1 U+8CF1 # <cjk> [2000]
+0x8FF9B2 U+27E10 # <cjk> [2000] [Unicode3.1]
+0x8FF9B3 U+8D09 # <cjk> [2000]
+0x8FF9B4 U+8D0E # <cjk> [2000]
+0x8FF9B5 U+8D6C # <cjk> [2000]
+0x8FF9B6 U+8D84 # <cjk> [2000]
+0x8FF9B7 U+8D95 # <cjk> [2000]
+0x8FF9B8 U+8DA6 # <cjk> [2000]
+0x8FF9B9 U+27FB7 # <cjk> [2000] [Unicode3.1]
+0x8FF9BA U+8DC6 # <cjk> [2000]
+0x8FF9BB U+8DC8 # <cjk> [2000]
+0x8FF9BC U+8DD9 # <cjk> [2000]
+0x8FF9BD U+8DEC # <cjk> [2000]
+0x8FF9BE U+8E0C # <cjk> [2000]
+0x8FF9BF U+47FD # <cjk> [2000]
+0x8FF9C0 U+8DFD # <cjk> [2000]
+0x8FF9C1 U+8E06 # <cjk> [2000]
+0x8FF9C2 U+2808A # <cjk> [2000] [Unicode3.1]
+0x8FF9C3 U+8E14 # <cjk> [2000]
+0x8FF9C4 U+8E16 # <cjk> [2000]
+0x8FF9C5 U+8E21 # <cjk> [2000]
+0x8FF9C6 U+8E22 # <cjk> [2000]
+0x8FF9C7 U+8E27 # <cjk> [2000]
+0x8FF9C8 U+280BB # <cjk> [2000] [Unicode3.1]
+0x8FF9C9 U+4816 # <cjk> [2000]
+0x8FF9CA U+8E36 # <cjk> [2000]
+0x8FF9CB U+8E39 # <cjk> [2000]
+0x8FF9CC U+8E4B # <cjk> [2000]
+0x8FF9CD U+8E54 # <cjk> [2000]
+0x8FF9CE U+8E62 # <cjk> [2000]
+0x8FF9CF U+8E6C # <cjk> [2000]
+0x8FF9D0 U+8E6D # <cjk> [2000]
+0x8FF9D1 U+8E6F # <cjk> [2000]
+0x8FF9D2 U+8E98 # <cjk> [2000]
+0x8FF9D3 U+8E9E # <cjk> [2000]
+0x8FF9D4 U+8EAE # <cjk> [2000]
+0x8FF9D5 U+8EB3 # <cjk> [2000]
+0x8FF9D6 U+8EB5 # <cjk> [2000]
+0x8FF9D7 U+8EB6 # <cjk> [2000]
+0x8FF9D8 U+8EBB # <cjk> [2000]
+0x8FF9D9 U+28282 # <cjk> [2000] [Unicode3.1]
+0x8FF9DA U+8ED1 # <cjk> [2000]
+0x8FF9DB U+8ED4 # <cjk> [2000]
+0x8FF9DC U+484E # <cjk> [2000]
+0x8FF9DD U+8EF9 # <cjk> [2000]
+0x8FF9DE U+282F3 # <cjk> [2000] [Unicode3.1]
+0x8FF9DF U+8F00 # <cjk> [2000]
+0x8FF9E0 U+8F08 # <cjk> [2000]
+0x8FF9E1 U+8F17 # <cjk> [2000]
+0x8FF9E2 U+8F2B # <cjk> [2000]
+0x8FF9E3 U+8F40 # <cjk> [2000]
+0x8FF9E4 U+8F4A # <cjk> [2000]
+0x8FF9E5 U+8F58 # <cjk> [2000]
+0x8FF9E6 U+2840C # <cjk> [2000] [Unicode3.1]
+0x8FF9E7 U+8FA4 # <cjk> [2000]
+0x8FF9E8 U+8FB4 # <cjk> [2000]
+0x8FF9E9 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2]
+0x8FF9EA U+8FB6 # <cjk> [2000]
+0x8FF9EB U+28455 # <cjk> [2000] [Unicode3.1]
+0x8FF9EC U+8FC1 # <cjk> [2000]
+0x8FF9ED U+8FC6 # <cjk> [2000]
+0x8FF9EE U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000]
+0x8FF9EF U+8FCA # <cjk> [2000]
+0x8FF9F0 U+8FCD # <cjk> [2000]
+0x8FF9F1 U+8FD3 # <cjk> [2000]
+0x8FF9F2 U+8FD5 # <cjk> [2000]
+0x8FF9F3 U+8FE0 # <cjk> [2000]
+0x8FF9F4 U+8FF1 # <cjk> [2000]
+0x8FF9F5 U+8FF5 # <cjk> [2000]
+0x8FF9F6 U+8FFB # <cjk> [2000]
+0x8FF9F7 U+9002 # <cjk> [2000]
+0x8FF9F8 U+900C # <cjk> [2000]
+0x8FF9F9 U+9037 # <cjk> [2000]
+0x8FF9FA U+2856B # <cjk> [2000] [Unicode3.1]
+0x8FF9FB U+9043 # <cjk> [2000]
+0x8FF9FC U+9044 # <cjk> [2000]
+0x8FF9FD U+905D # <cjk> [2000]
+0x8FF9FE U+285C8 # <cjk> [2000] [Unicode3.1]
+0x8FFAA1 U+285C9 # <cjk> [2000] [Unicode3.1]
+0x8FFAA2 U+9085 # <cjk> [2000]
+0x8FFAA3 U+908C # <cjk> [2000]
+0x8FFAA4 U+9090 # <cjk> [2000]
+0x8FFAA5 U+961D # <cjk> [2000]
+0x8FFAA6 U+90A1 # <cjk> [2000]
+0x8FFAA7 U+48B5 # <cjk> [2000]
+0x8FFAA8 U+90B0 # <cjk> [2000]
+0x8FFAA9 U+90B6 # <cjk> [2000]
+0x8FFAAA U+90C3 # <cjk> [2000]
+0x8FFAAB U+90C8 # <cjk> [2000]
+0x8FFAAC U+286D7 # <cjk> [2000] [Unicode3.1]
+0x8FFAAD U+90DC # <cjk> [2000]
+0x8FFAAE U+90DF # <cjk> [2000]
+0x8FFAAF U+286FA # <cjk> [2000] [Unicode3.1]
+0x8FFAB0 U+90F6 # <cjk> [2000]
+0x8FFAB1 U+90F2 # <cjk> [2000]
+0x8FFAB2 U+9100 # <cjk> [2000]
+0x8FFAB3 U+90EB # <cjk> [2000]
+0x8FFAB4 U+90FE # <cjk> [2000]
+0x8FFAB5 U+90FF # <cjk> [2000]
+0x8FFAB6 U+9104 # <cjk> [2000]
+0x8FFAB7 U+9106 # <cjk> [2000]
+0x8FFAB8 U+9118 # <cjk> [2000]
+0x8FFAB9 U+911C # <cjk> [2000]
+0x8FFABA U+911E # <cjk> [2000]
+0x8FFABB U+9137 # <cjk> [2000]
+0x8FFABC U+9139 # <cjk> [2000]
+0x8FFABD U+913A # <cjk> [2000]
+0x8FFABE U+9146 # <cjk> [2000]
+0x8FFABF U+9147 # <cjk> [2000]
+0x8FFAC0 U+9157 # <cjk> [2000]
+0x8FFAC1 U+9159 # <cjk> [2000]
+0x8FFAC2 U+9161 # <cjk> [2000]
+0x8FFAC3 U+9164 # <cjk> [2000]
+0x8FFAC4 U+9174 # <cjk> [2000]
+0x8FFAC5 U+9179 # <cjk> [2000]
+0x8FFAC6 U+9185 # <cjk> [2000]
+0x8FFAC7 U+918E # <cjk> [2000]
+0x8FFAC8 U+91A8 # <cjk> [2000]
+0x8FFAC9 U+91AE # <cjk> [2000]
+0x8FFACA U+91B3 # <cjk> [2000]
+0x8FFACB U+91B6 # <cjk> [2000]
+0x8FFACC U+91C3 # <cjk> [2000]
+0x8FFACD U+91C4 # <cjk> [2000]
+0x8FFACE U+91DA # <cjk> [2000]
+0x8FFACF U+28949 # <cjk> [2000] [Unicode3.1]
+0x8FFAD0 U+28946 # <cjk> [2000] [Unicode3.1]
+0x8FFAD1 U+91EC # <cjk> [2000]
+0x8FFAD2 U+91EE # <cjk> [2000]
+0x8FFAD3 U+9201 # <cjk> [2000]
+0x8FFAD4 U+920A # <cjk> [2000]
+0x8FFAD5 U+9216 # <cjk> [2000]
+0x8FFAD6 U+9217 # <cjk> [2000]
+0x8FFAD7 U+2896B # <cjk> [2000] [Unicode3.1]
+0x8FFAD8 U+9233 # <cjk> [2000]
+0x8FFAD9 U+9242 # <cjk> [2000]
+0x8FFADA U+9247 # <cjk> [2000]
+0x8FFADB U+924A # <cjk> [2000]
+0x8FFADC U+924E # <cjk> [2000]
+0x8FFADD U+9251 # <cjk> [2000]
+0x8FFADE U+9256 # <cjk> [2000]
+0x8FFADF U+9259 # <cjk> [2000]
+0x8FFAE0 U+9260 # <cjk> [2000]
+0x8FFAE1 U+9261 # <cjk> [2000]
+0x8FFAE2 U+9265 # <cjk> [2000]
+0x8FFAE3 U+9267 # <cjk> [2000]
+0x8FFAE4 U+9268 # <cjk> [2000]
+0x8FFAE5 U+28987 # <cjk> [2000] [Unicode3.1]
+0x8FFAE6 U+28988 # <cjk> [2000] [Unicode3.1]
+0x8FFAE7 U+927C # <cjk> [2000]
+0x8FFAE8 U+927D # <cjk> [2000]
+0x8FFAE9 U+927F # <cjk> [2000]
+0x8FFAEA U+9289 # <cjk> [2000]
+0x8FFAEB U+928D # <cjk> [2000]
+0x8FFAEC U+9297 # <cjk> [2000]
+0x8FFAED U+9299 # <cjk> [2000]
+0x8FFAEE U+929F # <cjk> [2000]
+0x8FFAEF U+92A7 # <cjk> [2000]
+0x8FFAF0 U+92AB # <cjk> [2000]
+0x8FFAF1 U+289BA # <cjk> [2000] [Unicode3.1]
+0x8FFAF2 U+289BB # <cjk> [2000] [Unicode3.1]
+0x8FFAF3 U+92B2 # <cjk> [2000]
+0x8FFAF4 U+92BF # <cjk> [2000]
+0x8FFAF5 U+92C0 # <cjk> [2000]
+0x8FFAF6 U+92C6 # <cjk> [2000]
+0x8FFAF7 U+92CE # <cjk> [2000]
+0x8FFAF8 U+92D0 # <cjk> [2000]
+0x8FFAF9 U+92D7 # <cjk> [2000]
+0x8FFAFA U+92D9 # <cjk> [2000]
+0x8FFAFB U+92E5 # <cjk> [2000]
+0x8FFAFC U+92E7 # <cjk> [2000]
+0x8FFAFD U+9311 # <cjk> [2000]
+0x8FFAFE U+28A1E # <cjk> [2000] [Unicode3.1]
+0x8FFBA1 U+28A29 # <cjk> [2000] [Unicode3.1]
+0x8FFBA2 U+92F7 # <cjk> [2000]
+0x8FFBA3 U+92F9 # <cjk> [2000]
+0x8FFBA4 U+92FB # <cjk> [2000]
+0x8FFBA5 U+9302 # <cjk> [2000]
+0x8FFBA6 U+930D # <cjk> [2000]
+0x8FFBA7 U+9315 # <cjk> [2000]
+0x8FFBA8 U+931D # <cjk> [2000]
+0x8FFBA9 U+931E # <cjk> [2000]
+0x8FFBAA U+9327 # <cjk> [2000]
+0x8FFBAB U+9329 # <cjk> [2000]
+0x8FFBAC U+28A71 # <cjk> [2000] [Unicode3.1]
+0x8FFBAD U+28A43 # <cjk> [2000] [Unicode3.1]
+0x8FFBAE U+9347 # <cjk> [2000]
+0x8FFBAF U+9351 # <cjk> [2000]
+0x8FFBB0 U+9357 # <cjk> [2000]
+0x8FFBB1 U+935A # <cjk> [2000]
+0x8FFBB2 U+936B # <cjk> [2000]
+0x8FFBB3 U+9371 # <cjk> [2000]
+0x8FFBB4 U+9373 # <cjk> [2000]
+0x8FFBB5 U+93A1 # <cjk> [2000]
+0x8FFBB6 U+28A99 # <cjk> [2000] [Unicode3.1]
+0x8FFBB7 U+28ACD # <cjk> [2000] [Unicode3.1]
+0x8FFBB8 U+9388 # <cjk> [2000]
+0x8FFBB9 U+938B # <cjk> [2000]
+0x8FFBBA U+938F # <cjk> [2000]
+0x8FFBBB U+939E # <cjk> [2000]
+0x8FFBBC U+93F5 # <cjk> [2000]
+0x8FFBBD U+28AE4 # <cjk> [2000] [Unicode3.1]
+0x8FFBBE U+28ADD # <cjk> [2000] [Unicode3.1]
+0x8FFBBF U+93F1 # <cjk> [2000]
+0x8FFBC0 U+93C1 # <cjk> [2000]
+0x8FFBC1 U+93C7 # <cjk> [2000]
+0x8FFBC2 U+93DC # <cjk> [2000]
+0x8FFBC3 U+93E2 # <cjk> [2000]
+0x8FFBC4 U+93E7 # <cjk> [2000]
+0x8FFBC5 U+9409 # <cjk> [2000]
+0x8FFBC6 U+940F # <cjk> [2000]
+0x8FFBC7 U+9416 # <cjk> [2000]
+0x8FFBC8 U+9417 # <cjk> [2000]
+0x8FFBC9 U+93FB # <cjk> [2000]
+0x8FFBCA U+9432 # <cjk> [2000]
+0x8FFBCB U+9434 # <cjk> [2000]
+0x8FFBCC U+943B # <cjk> [2000]
+0x8FFBCD U+9445 # <cjk> [2000]
+0x8FFBCE U+28BC1 # <cjk> [2000] [Unicode3.1]
+0x8FFBCF U+28BEF # <cjk> [2000] [Unicode3.1]
+0x8FFBD0 U+946D # <cjk> [2000]
+0x8FFBD1 U+946F # <cjk> [2000]
+0x8FFBD2 U+9578 # <cjk> [2000]
+0x8FFBD3 U+9579 # <cjk> [2000]
+0x8FFBD4 U+9586 # <cjk> [2000]
+0x8FFBD5 U+958C # <cjk> [2000]
+0x8FFBD6 U+958D # <cjk> [2000]
+0x8FFBD7 U+28D10 # <cjk> [2000] [Unicode3.1]
+0x8FFBD8 U+95AB # <cjk> [2000]
+0x8FFBD9 U+95B4 # <cjk> [2000]
+0x8FFBDA U+28D71 # <cjk> [2000] [Unicode3.1]
+0x8FFBDB U+95C8 # <cjk> [2000]
+0x8FFBDC U+28DFB # <cjk> [2000] [Unicode3.1]
+0x8FFBDD U+28E1F # <cjk> [2000] [Unicode3.1]
+0x8FFBDE U+962C # <cjk> [2000]
+0x8FFBDF U+9633 # <cjk> [2000]
+0x8FFBE0 U+9634 # <cjk> [2000]
+0x8FFBE1 U+28E36 # <cjk> [2000] [Unicode3.1]
+0x8FFBE2 U+963C # <cjk> [2000]
+0x8FFBE3 U+9641 # <cjk> [2000]
+0x8FFBE4 U+9661 # <cjk> [2000]
+0x8FFBE5 U+28E89 # <cjk> [2000] [Unicode3.1]
+0x8FFBE6 U+9682 # <cjk> [2000]
+0x8FFBE7 U+28EEB # <cjk> [2000] [Unicode3.1]
+0x8FFBE8 U+969A # <cjk> [2000]
+0x8FFBE9 U+28F32 # <cjk> [2000] [Unicode3.1]
+0x8FFBEA U+49E7 # <cjk> [2000]
+0x8FFBEB U+96A9 # <cjk> [2000]
+0x8FFBEC U+96AF # <cjk> [2000]
+0x8FFBED U+96B3 # <cjk> [2000]
+0x8FFBEE U+96BA # <cjk> [2000]
+0x8FFBEF U+96BD # <cjk> [2000]
+0x8FFBF0 U+49FA # <cjk> [2000]
+0x8FFBF1 U+28FF8 # <cjk> [2000] [Unicode3.1]
+0x8FFBF2 U+96D8 # <cjk> [2000]
+0x8FFBF3 U+96DA # <cjk> [2000]
+0x8FFBF4 U+96DD # <cjk> [2000]
+0x8FFBF5 U+4A04 # <cjk> [2000]
+0x8FFBF6 U+9714 # <cjk> [2000]
+0x8FFBF7 U+9723 # <cjk> [2000]
+0x8FFBF8 U+4A29 # <cjk> [2000]
+0x8FFBF9 U+9736 # <cjk> [2000]
+0x8FFBFA U+9741 # <cjk> [2000]
+0x8FFBFB U+9747 # <cjk> [2000]
+0x8FFBFC U+9755 # <cjk> [2000]
+0x8FFBFD U+9757 # <cjk> [2000]
+0x8FFBFE U+975B # <cjk> [2000]
+0x8FFCA1 U+976A # <cjk> [2000]
+0x8FFCA2 U+292A0 # <cjk> [2000] [Unicode3.1]
+0x8FFCA3 U+292B1 # <cjk> [2000] [Unicode3.1]
+0x8FFCA4 U+9796 # <cjk> [2000]
+0x8FFCA5 U+979A # <cjk> [2000]
+0x8FFCA6 U+979E # <cjk> [2000]
+0x8FFCA7 U+97A2 # <cjk> [2000]
+0x8FFCA8 U+97B1 # <cjk> [2000]
+0x8FFCA9 U+97B2 # <cjk> [2000]
+0x8FFCAA U+97BE # <cjk> [2000]
+0x8FFCAB U+97CC # <cjk> [2000]
+0x8FFCAC U+97D1 # <cjk> [2000]
+0x8FFCAD U+97D4 # <cjk> [2000]
+0x8FFCAE U+97D8 # <cjk> [2000]
+0x8FFCAF U+97D9 # <cjk> [2000]
+0x8FFCB0 U+97E1 # <cjk> [2000]
+0x8FFCB1 U+97F1 # <cjk> [2000]
+0x8FFCB2 U+9804 # <cjk> [2000]
+0x8FFCB3 U+980D # <cjk> [2000]
+0x8FFCB4 U+980E # <cjk> [2000]
+0x8FFCB5 U+9814 # <cjk> [2000]
+0x8FFCB6 U+9816 # <cjk> [2000]
+0x8FFCB7 U+4ABC # <cjk> [2000]
+0x8FFCB8 U+29490 # <cjk> [2000] [Unicode3.1]
+0x8FFCB9 U+9823 # <cjk> [2000]
+0x8FFCBA U+9832 # <cjk> [2000]
+0x8FFCBB U+9833 # <cjk> [2000]
+0x8FFCBC U+9825 # <cjk> [2000]
+0x8FFCBD U+9847 # <cjk> [2000]
+0x8FFCBE U+9866 # <cjk> [2000]
+0x8FFCBF U+98AB # <cjk> [2000]
+0x8FFCC0 U+98AD # <cjk> [2000]
+0x8FFCC1 U+98B0 # <cjk> [2000]
+0x8FFCC2 U+295CF # <cjk> [2000] [Unicode3.1]
+0x8FFCC3 U+98B7 # <cjk> [2000]
+0x8FFCC4 U+98B8 # <cjk> [2000]
+0x8FFCC5 U+98BB # <cjk> [2000]
+0x8FFCC6 U+98BC # <cjk> [2000]
+0x8FFCC7 U+98BF # <cjk> [2000]
+0x8FFCC8 U+98C2 # <cjk> [2000]
+0x8FFCC9 U+98C7 # <cjk> [2000]
+0x8FFCCA U+98CB # <cjk> [2000]
+0x8FFCCB U+98E0 # <cjk> [2000]
+0x8FFCCC U+2967F # <cjk> [2000] [Unicode3.1]
+0x8FFCCD U+98E1 # <cjk> [2000]
+0x8FFCCE U+98E3 # <cjk> [2000]
+0x8FFCCF U+98E5 # <cjk> [2000]
+0x8FFCD0 U+98EA # <cjk> [2000]
+0x8FFCD1 U+98F0 # <cjk> [2000]
+0x8FFCD2 U+98F1 # <cjk> [2000]
+0x8FFCD3 U+98F3 # <cjk> [2000]
+0x8FFCD4 U+9908 # <cjk> [2000]
+0x8FFCD5 U+4B3B # <cjk> [2000]
+0x8FFCD6 U+296F0 # <cjk> [2000] [Unicode3.1]
+0x8FFCD7 U+9916 # <cjk> [2000]
+0x8FFCD8 U+9917 # <cjk> [2000]
+0x8FFCD9 U+29719 # <cjk> [2000] [Unicode3.1]
+0x8FFCDA U+991A # <cjk> [2000]
+0x8FFCDB U+991B # <cjk> [2000]
+0x8FFCDC U+991C # <cjk> [2000]
+0x8FFCDD U+29750 # <cjk> [2000] [Unicode3.1]
+0x8FFCDE U+9931 # <cjk> [2000]
+0x8FFCDF U+9932 # <cjk> [2000]
+0x8FFCE0 U+9933 # <cjk> [2000]
+0x8FFCE1 U+993A # <cjk> [2000]
+0x8FFCE2 U+993B # <cjk> [2000]
+0x8FFCE3 U+993C # <cjk> [2000]
+0x8FFCE4 U+9940 # <cjk> [2000]
+0x8FFCE5 U+9941 # <cjk> [2000]
+0x8FFCE6 U+9946 # <cjk> [2000]
+0x8FFCE7 U+994D # <cjk> [2000]
+0x8FFCE8 U+994E # <cjk> [2000]
+0x8FFCE9 U+995C # <cjk> [2000]
+0x8FFCEA U+995F # <cjk> [2000]
+0x8FFCEB U+9960 # <cjk> [2000]
+0x8FFCEC U+99A3 # <cjk> [2000]
+0x8FFCED U+99A6 # <cjk> [2000]
+0x8FFCEE U+99B9 # <cjk> [2000]
+0x8FFCEF U+99BD # <cjk> [2000]
+0x8FFCF0 U+99BF # <cjk> [2000]
+0x8FFCF1 U+99C3 # <cjk> [2000]
+0x8FFCF2 U+99C9 # <cjk> [2000]
+0x8FFCF3 U+99D4 # <cjk> [2000]
+0x8FFCF4 U+99D9 # <cjk> [2000]
+0x8FFCF5 U+99DE # <cjk> [2000]
+0x8FFCF6 U+298C6 # <cjk> [2000] [Unicode3.1]
+0x8FFCF7 U+99F0 # <cjk> [2000]
+0x8FFCF8 U+99F9 # <cjk> [2000]
+0x8FFCF9 U+99FC # <cjk> [2000]
+0x8FFCFA U+9A0A # <cjk> [2000]
+0x8FFCFB U+9A11 # <cjk> [2000]
+0x8FFCFC U+9A16 # <cjk> [2000]
+0x8FFCFD U+9A1A # <cjk> [2000]
+0x8FFCFE U+9A20 # <cjk> [2000]
+0x8FFDA1 U+9A31 # <cjk> [2000]
+0x8FFDA2 U+9A36 # <cjk> [2000]
+0x8FFDA3 U+9A44 # <cjk> [2000]
+0x8FFDA4 U+9A4C # <cjk> [2000]
+0x8FFDA5 U+9A58 # <cjk> [2000]
+0x8FFDA6 U+4BC2 # <cjk> [2000]
+0x8FFDA7 U+9AAF # <cjk> [2000]
+0x8FFDA8 U+4BCA # <cjk> [2000]
+0x8FFDA9 U+9AB7 # <cjk> [2000]
+0x8FFDAA U+4BD2 # <cjk> [2000]
+0x8FFDAB U+9AB9 # <cjk> [2000]
+0x8FFDAC U+29A72 # <cjk> [2000] [Unicode3.1]
+0x8FFDAD U+9AC6 # <cjk> [2000]
+0x8FFDAE U+9AD0 # <cjk> [2000]
+0x8FFDAF U+9AD2 # <cjk> [2000]
+0x8FFDB0 U+9AD5 # <cjk> [2000]
+0x8FFDB1 U+4BE8 # <cjk> [2000]
+0x8FFDB2 U+9ADC # <cjk> [2000]
+0x8FFDB3 U+9AE0 # <cjk> [2000]
+0x8FFDB4 U+9AE5 # <cjk> [2000]
+0x8FFDB5 U+9AE9 # <cjk> [2000]
+0x8FFDB6 U+9B03 # <cjk> [2000]
+0x8FFDB7 U+9B0C # <cjk> [2000]
+0x8FFDB8 U+9B10 # <cjk> [2000]
+0x8FFDB9 U+9B12 # <cjk> [2000]
+0x8FFDBA U+9B16 # <cjk> [2000]
+0x8FFDBB U+9B1C # <cjk> [2000]
+0x8FFDBC U+9B2B # <cjk> [2000]
+0x8FFDBD U+9B33 # <cjk> [2000]
+0x8FFDBE U+9B3D # <cjk> [2000]
+0x8FFDBF U+4C20 # <cjk> [2000]
+0x8FFDC0 U+9B4B # <cjk> [2000]
+0x8FFDC1 U+9B63 # <cjk> [2000]
+0x8FFDC2 U+9B65 # <cjk> [2000]
+0x8FFDC3 U+9B6B # <cjk> [2000]
+0x8FFDC4 U+9B6C # <cjk> [2000]
+0x8FFDC5 U+9B73 # <cjk> [2000]
+0x8FFDC6 U+9B76 # <cjk> [2000]
+0x8FFDC7 U+9B77 # <cjk> [2000]
+0x8FFDC8 U+9BA6 # <cjk> [2000]
+0x8FFDC9 U+9BAC # <cjk> [2000]
+0x8FFDCA U+9BB1 # <cjk> [2000]
+0x8FFDCB U+29DDB # <cjk> [2000] [Unicode3.1]
+0x8FFDCC U+29E3D # <cjk> [2000] [Unicode3.1]
+0x8FFDCD U+9BB2 # <cjk> [2000]
+0x8FFDCE U+9BB8 # <cjk> [2000]
+0x8FFDCF U+9BBE # <cjk> [2000]
+0x8FFDD0 U+9BC7 # <cjk> [2000]
+0x8FFDD1 U+9BF3 # <cjk> [2000]
+0x8FFDD2 U+9BD8 # <cjk> [2000]
+0x8FFDD3 U+9BDD # <cjk> [2000]
+0x8FFDD4 U+9BE7 # <cjk> [2000]
+0x8FFDD5 U+9BEA # <cjk> [2000]
+0x8FFDD6 U+9BEB # <cjk> [2000]
+0x8FFDD7 U+9BEF # <cjk> [2000]
+0x8FFDD8 U+9BEE # <cjk> [2000]
+0x8FFDD9 U+29E15 # <cjk> [2000] [Unicode3.1]
+0x8FFDDA U+9BFA # <cjk> [2000]
+0x8FFDDB U+29E8A # <cjk> [2000] [Unicode3.1]
+0x8FFDDC U+9BF7 # <cjk> [2000]
+0x8FFDDD U+29E49 # <cjk> [2000] [Unicode3.1]
+0x8FFDDE U+9C16 # <cjk> [2000]
+0x8FFDDF U+9C18 # <cjk> [2000]
+0x8FFDE0 U+9C19 # <cjk> [2000]
+0x8FFDE1 U+9C1A # <cjk> [2000]
+0x8FFDE2 U+9C1D # <cjk> [2000]
+0x8FFDE3 U+9C22 # <cjk> [2000]
+0x8FFDE4 U+9C27 # <cjk> [2000]
+0x8FFDE5 U+9C29 # <cjk> [2000]
+0x8FFDE6 U+9C2A # <cjk> [2000]
+0x8FFDE7 U+29EC4 # <cjk> [2000] [Unicode3.1]
+0x8FFDE8 U+9C31 # <cjk> [2000]
+0x8FFDE9 U+9C36 # <cjk> [2000]
+0x8FFDEA U+9C37 # <cjk> [2000]
+0x8FFDEB U+9C45 # <cjk> [2000]
+0x8FFDEC U+9C5C # <cjk> [2000]
+0x8FFDED U+29EE9 # <cjk> [2000] [Unicode3.1]
+0x8FFDEE U+9C49 # <cjk> [2000]
+0x8FFDEF U+9C4A # <cjk> [2000]
+0x8FFDF0 U+29EDB # <cjk> [2000] [Unicode3.1]
+0x8FFDF1 U+9C54 # <cjk> [2000]
+0x8FFDF2 U+9C58 # <cjk> [2000]
+0x8FFDF3 U+9C5B # <cjk> [2000]
+0x8FFDF4 U+9C5D # <cjk> [2000]
+0x8FFDF5 U+9C5F # <cjk> [2000]
+0x8FFDF6 U+9C69 # <cjk> [2000]
+0x8FFDF7 U+9C6A # <cjk> [2000]
+0x8FFDF8 U+9C6B # <cjk> [2000]
+0x8FFDF9 U+9C6D # <cjk> [2000]
+0x8FFDFA U+9C6E # <cjk> [2000]
+0x8FFDFB U+9C70 # <cjk> [2000]
+0x8FFDFC U+9C72 # <cjk> [2000]
+0x8FFDFD U+9C75 # <cjk> [2000]
+0x8FFDFE U+9C7A # <cjk> [2000]
+0x8FFEA1 U+9CE6 # <cjk> [2000]
+0x8FFEA2 U+9CF2 # <cjk> [2000]
+0x8FFEA3 U+9D0B # <cjk> [2000]
+0x8FFEA4 U+9D02 # <cjk> [2000]
+0x8FFEA5 U+29FCE # <cjk> [2000] [Unicode3.1]
+0x8FFEA6 U+9D11 # <cjk> [2000]
+0x8FFEA7 U+9D17 # <cjk> [2000]
+0x8FFEA8 U+9D18 # <cjk> [2000]
+0x8FFEA9 U+2A02F # <cjk> [2000] [Unicode3.1]
+0x8FFEAA U+4CC4 # <cjk> [2000]
+0x8FFEAB U+2A01A # <cjk> [2000] [Unicode3.1]
+0x8FFEAC U+9D32 # <cjk> [2000]
+0x8FFEAD U+4CD1 # <cjk> [2000]
+0x8FFEAE U+9D42 # <cjk> [2000]
+0x8FFEAF U+9D4A # <cjk> [2000]
+0x8FFEB0 U+9D5F # <cjk> [2000]
+0x8FFEB1 U+9D62 # <cjk> [2000]
+0x8FFEB2 U+2A0F9 # <cjk> [2000] [Unicode3.1]
+0x8FFEB3 U+9D69 # <cjk> [2000]
+0x8FFEB4 U+9D6B # <cjk> [2000]
+0x8FFEB5 U+2A082 # <cjk> [2000] [Unicode3.1]
+0x8FFEB6 U+9D73 # <cjk> [2000]
+0x8FFEB7 U+9D76 # <cjk> [2000]
+0x8FFEB8 U+9D77 # <cjk> [2000]
+0x8FFEB9 U+9D7E # <cjk> [2000]
+0x8FFEBA U+9D84 # <cjk> [2000]
+0x8FFEBB U+9D8D # <cjk> [2000]
+0x8FFEBC U+9D99 # <cjk> [2000]
+0x8FFEBD U+9DA1 # <cjk> [2000]
+0x8FFEBE U+9DBF # <cjk> [2000]
+0x8FFEBF U+9DB5 # <cjk> [2000]
+0x8FFEC0 U+9DB9 # <cjk> [2000]
+0x8FFEC1 U+9DBD # <cjk> [2000]
+0x8FFEC2 U+9DC3 # <cjk> [2000]
+0x8FFEC3 U+9DC7 # <cjk> [2000]
+0x8FFEC4 U+9DC9 # <cjk> [2000]
+0x8FFEC5 U+9DD6 # <cjk> [2000]
+0x8FFEC6 U+9DDA # <cjk> [2000]
+0x8FFEC7 U+9DDF # <cjk> [2000]
+0x8FFEC8 U+9DE0 # <cjk> [2000]
+0x8FFEC9 U+9DE3 # <cjk> [2000]
+0x8FFECA U+9DF4 # <cjk> [2000]
+0x8FFECB U+4D07 # <cjk> [2000]
+0x8FFECC U+9E0A # <cjk> [2000]
+0x8FFECD U+9E02 # <cjk> [2000]
+0x8FFECE U+9E0D # <cjk> [2000]
+0x8FFECF U+9E19 # <cjk> [2000]
+0x8FFED0 U+9E1C # <cjk> [2000]
+0x8FFED1 U+9E1D # <cjk> [2000]
+0x8FFED2 U+9E7B # <cjk> [2000]
+0x8FFED3 U+22218 # <cjk> [2000] [Unicode3.1]
+0x8FFED4 U+9E80 # <cjk> [2000]
+0x8FFED5 U+9E85 # <cjk> [2000]
+0x8FFED6 U+9E9B # <cjk> [2000]
+0x8FFED7 U+9EA8 # <cjk> [2000]
+0x8FFED8 U+2A38C # <cjk> [2000] [Unicode3.1]
+0x8FFED9 U+9EBD # <cjk> [2000]
+0x8FFEDA U+2A437 # <cjk> [2000] [Unicode3.1]
+0x8FFEDB U+9EDF # <cjk> [2000]
+0x8FFEDC U+9EE7 # <cjk> [2000]
+0x8FFEDD U+9EEE # <cjk> [2000]
+0x8FFEDE U+9EFF # <cjk> [2000]
+0x8FFEDF U+9F02 # <cjk> [2000]
+0x8FFEE0 U+4D77 # <cjk> [2000]
+0x8FFEE1 U+9F03 # <cjk> [2000]
+0x8FFEE2 U+9F17 # <cjk> [2000]
+0x8FFEE3 U+9F19 # <cjk> [2000]
+0x8FFEE4 U+9F2F # <cjk> [2000]
+0x8FFEE5 U+9F37 # <cjk> [2000]
+0x8FFEE6 U+9F3A # <cjk> [2000]
+0x8FFEE7 U+9F3D # <cjk> [2000]
+0x8FFEE8 U+9F41 # <cjk> [2000]
+0x8FFEE9 U+9F45 # <cjk> [2000]
+0x8FFEEA U+9F46 # <cjk> [2000]
+0x8FFEEB U+9F53 # <cjk> [2000]
+0x8FFEEC U+9F55 # <cjk> [2000]
+0x8FFEED U+9F58 # <cjk> [2000]
+0x8FFEEE U+2A5F1 # <cjk> [2000] [Unicode3.1]
+0x8FFEEF U+9F5D # <cjk> [2000]
+0x8FFEF0 U+2A602 # <cjk> [2000] [Unicode3.1]
+0x8FFEF1 U+9F69 # <cjk> [2000]
+0x8FFEF2 U+2A61A # <cjk> [2000] [Unicode3.1]
+0x8FFEF3 U+9F6D # <cjk> [2000]
+0x8FFEF4 U+9F70 # <cjk> [2000]
+0x8FFEF5 U+9F75 # <cjk> [2000]
+0x8FFEF6 U+2A6B2 # <cjk> [2000] [Unicode3.1]
diff --git a/src/backend/utils/mb/Unicode/euc_cn_to_utf8.map b/src/backend/utils/mb/Unicode/euc_cn_to_utf8.map
new file mode 100644
index 0000000..f8503d3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc_cn_to_utf8.map
@@ -0,0 +1,2280 @@
+/* src/backend/utils/mb/Unicode/euc_cn_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl */
+
+static const uint32 euc_cn_to_unicode_tree_table[7792];
+
+static const pg_mb_radix_tree euc_cn_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_cn_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x005e, /* offset of table for 2-byte inputs */
+ 0xa1, /* b2_1_lower */
+ 0xf7, /* b2_1_upper */
+ 0xa1, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_cn_to_unicode_tree_table[7792] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0005e ***/
+
+ /* a1 */ 0x0000b5, 0x000113, 0x000171, 0x0001cf,
+ /* a5 */ 0x00022d, 0x00028b, 0x0002e9, 0x000347,
+ /* a9 */ 0x0003a2, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000400,
+ /* b1 */ 0x00045e, 0x0004bc, 0x00051a, 0x000578,
+ /* b5 */ 0x0005d6, 0x000634, 0x000692, 0x0006f0,
+ /* b9 */ 0x00074e, 0x0007ac, 0x00080a, 0x000868,
+ /* bd */ 0x0008c6, 0x000924, 0x000982, 0x0009e0,
+ /* c1 */ 0x000a3e, 0x000a9c, 0x000afa, 0x000b58,
+ /* c5 */ 0x000bb6, 0x000c14, 0x000c72, 0x000cd0,
+ /* c9 */ 0x000d2e, 0x000d8c, 0x000dea, 0x000e48,
+ /* cd */ 0x000ea6, 0x000f04, 0x000f62, 0x000fc0,
+ /* d1 */ 0x00101e, 0x00107c, 0x0010da, 0x001138,
+ /* d5 */ 0x001196, 0x0011f4, 0x001252, 0x0012b0,
+ /* d9 */ 0x00130e, 0x00136c, 0x0013ca, 0x001428,
+ /* dd */ 0x001486, 0x0014e4, 0x001542, 0x0015a0,
+ /* e1 */ 0x0015fe, 0x00165c, 0x0016ba, 0x001718,
+ /* e5 */ 0x001776, 0x0017d4, 0x001832, 0x001890,
+ /* e9 */ 0x0018ee, 0x00194c, 0x0019aa, 0x001a08,
+ /* ed */ 0x001a66, 0x001ac4, 0x001b22, 0x001b80,
+ /* f1 */ 0x001bde, 0x001c3c, 0x001c9a, 0x001cf8,
+ /* f5 */ 0x001d56, 0x001db4, 0x001e12,
+
+ /*** Two byte table, leaf: a1xx - offset 0x000b5 ***/
+
+ /* a1 */ 0xe38080, 0xe38081, 0xe38082, 0xe383bb,
+ /* a5 */ 0x00cb89, 0x00cb87, 0x00c2a8, 0xe38083,
+ /* a9 */ 0xe38085, 0xe28095, 0xefbd9e, 0xe28096,
+ /* ad */ 0xe280a6, 0xe28098, 0xe28099, 0xe2809c,
+ /* b1 */ 0xe2809d, 0xe38094, 0xe38095, 0xe38088,
+ /* b5 */ 0xe38089, 0xe3808a, 0xe3808b, 0xe3808c,
+ /* b9 */ 0xe3808d, 0xe3808e, 0xe3808f, 0xe38096,
+ /* bd */ 0xe38097, 0xe38090, 0xe38091, 0x00c2b1,
+ /* c1 */ 0x00c397, 0x00c3b7, 0xe288b6, 0xe288a7,
+ /* c5 */ 0xe288a8, 0xe28891, 0xe2888f, 0xe288aa,
+ /* c9 */ 0xe288a9, 0xe28888, 0xe288b7, 0xe2889a,
+ /* cd */ 0xe28aa5, 0xe288a5, 0xe288a0, 0xe28c92,
+ /* d1 */ 0xe28a99, 0xe288ab, 0xe288ae, 0xe289a1,
+ /* d5 */ 0xe2898c, 0xe28988, 0xe288bd, 0xe2889d,
+ /* d9 */ 0xe289a0, 0xe289ae, 0xe289af, 0xe289a4,
+ /* dd */ 0xe289a5, 0xe2889e, 0xe288b5, 0xe288b4,
+ /* e1 */ 0xe29982, 0xe29980, 0x00c2b0, 0xe280b2,
+ /* e5 */ 0xe280b3, 0xe28483, 0xefbc84, 0x00c2a4,
+ /* e9 */ 0xefbfa0, 0xefbfa1, 0xe280b0, 0x00c2a7,
+ /* ed */ 0xe28496, 0xe29886, 0xe29885, 0xe2978b,
+ /* f1 */ 0xe2978f, 0xe2978e, 0xe29787, 0xe29786,
+ /* f5 */ 0xe296a1, 0xe296a0, 0xe296b3, 0xe296b2,
+ /* f9 */ 0xe280bb, 0xe28692, 0xe28690, 0xe28691,
+ /* fd */ 0xe28693, 0xe38093,
+
+ /*** Two byte table, leaf: a2xx - offset 0x00113 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0xe29288, 0xe29289, 0xe2928a, 0xe2928b,
+ /* b5 */ 0xe2928c, 0xe2928d, 0xe2928e, 0xe2928f,
+ /* b9 */ 0xe29290, 0xe29291, 0xe29292, 0xe29293,
+ /* bd */ 0xe29294, 0xe29295, 0xe29296, 0xe29297,
+ /* c1 */ 0xe29298, 0xe29299, 0xe2929a, 0xe2929b,
+ /* c5 */ 0xe291b4, 0xe291b5, 0xe291b6, 0xe291b7,
+ /* c9 */ 0xe291b8, 0xe291b9, 0xe291ba, 0xe291bb,
+ /* cd */ 0xe291bc, 0xe291bd, 0xe291be, 0xe291bf,
+ /* d1 */ 0xe29280, 0xe29281, 0xe29282, 0xe29283,
+ /* d5 */ 0xe29284, 0xe29285, 0xe29286, 0xe29287,
+ /* d9 */ 0xe291a0, 0xe291a1, 0xe291a2, 0xe291a3,
+ /* dd */ 0xe291a4, 0xe291a5, 0xe291a6, 0xe291a7,
+ /* e1 */ 0xe291a8, 0xe291a9, 0x000000, 0x000000,
+ /* e5 */ 0xe388a0, 0xe388a1, 0xe388a2, 0xe388a3,
+ /* e9 */ 0xe388a4, 0xe388a5, 0xe388a6, 0xe388a7,
+ /* ed */ 0xe388a8, 0xe388a9, 0x000000, 0x000000,
+ /* f1 */ 0xe285a0, 0xe285a1, 0xe285a2, 0xe285a3,
+ /* f5 */ 0xe285a4, 0xe285a5, 0xe285a6, 0xe285a7,
+ /* f9 */ 0xe285a8, 0xe285a9, 0xe285aa, 0xe285ab,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a3xx - offset 0x00171 ***/
+
+ /* a1 */ 0xefbc81, 0xefbc82, 0xefbc83, 0xefbfa5,
+ /* a5 */ 0xefbc85, 0xefbc86, 0xefbc87, 0xefbc88,
+ /* a9 */ 0xefbc89, 0xefbc8a, 0xefbc8b, 0xefbc8c,
+ /* ad */ 0xefbc8d, 0xefbc8e, 0xefbc8f, 0xefbc90,
+ /* b1 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* b5 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* b9 */ 0xefbc99, 0xefbc9a, 0xefbc9b, 0xefbc9c,
+ /* bd */ 0xefbc9d, 0xefbc9e, 0xefbc9f, 0xefbca0,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0xefbcbb, 0xefbcbc,
+ /* dd */ 0xefbcbd, 0xefbcbe, 0xefbcbf, 0xefbd80,
+ /* e1 */ 0xefbd81, 0xefbd82, 0xefbd83, 0xefbd84,
+ /* e5 */ 0xefbd85, 0xefbd86, 0xefbd87, 0xefbd88,
+ /* e9 */ 0xefbd89, 0xefbd8a, 0xefbd8b, 0xefbd8c,
+ /* ed */ 0xefbd8d, 0xefbd8e, 0xefbd8f, 0xefbd90,
+ /* f1 */ 0xefbd91, 0xefbd92, 0xefbd93, 0xefbd94,
+ /* f5 */ 0xefbd95, 0xefbd96, 0xefbd97, 0xefbd98,
+ /* f9 */ 0xefbd99, 0xefbd9a, 0xefbd9b, 0xefbd9c,
+ /* fd */ 0xefbd9d, 0xefbfa3,
+
+ /*** Two byte table, leaf: a4xx - offset 0x001cf ***/
+
+ /* a1 */ 0xe38181, 0xe38182, 0xe38183, 0xe38184,
+ /* a5 */ 0xe38185, 0xe38186, 0xe38187, 0xe38188,
+ /* a9 */ 0xe38189, 0xe3818a, 0xe3818b, 0xe3818c,
+ /* ad */ 0xe3818d, 0xe3818e, 0xe3818f, 0xe38190,
+ /* b1 */ 0xe38191, 0xe38192, 0xe38193, 0xe38194,
+ /* b5 */ 0xe38195, 0xe38196, 0xe38197, 0xe38198,
+ /* b9 */ 0xe38199, 0xe3819a, 0xe3819b, 0xe3819c,
+ /* bd */ 0xe3819d, 0xe3819e, 0xe3819f, 0xe381a0,
+ /* c1 */ 0xe381a1, 0xe381a2, 0xe381a3, 0xe381a4,
+ /* c5 */ 0xe381a5, 0xe381a6, 0xe381a7, 0xe381a8,
+ /* c9 */ 0xe381a9, 0xe381aa, 0xe381ab, 0xe381ac,
+ /* cd */ 0xe381ad, 0xe381ae, 0xe381af, 0xe381b0,
+ /* d1 */ 0xe381b1, 0xe381b2, 0xe381b3, 0xe381b4,
+ /* d5 */ 0xe381b5, 0xe381b6, 0xe381b7, 0xe381b8,
+ /* d9 */ 0xe381b9, 0xe381ba, 0xe381bb, 0xe381bc,
+ /* dd */ 0xe381bd, 0xe381be, 0xe381bf, 0xe38280,
+ /* e1 */ 0xe38281, 0xe38282, 0xe38283, 0xe38284,
+ /* e5 */ 0xe38285, 0xe38286, 0xe38287, 0xe38288,
+ /* e9 */ 0xe38289, 0xe3828a, 0xe3828b, 0xe3828c,
+ /* ed */ 0xe3828d, 0xe3828e, 0xe3828f, 0xe38290,
+ /* f1 */ 0xe38291, 0xe38292, 0xe38293, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a5xx - offset 0x0022d ***/
+
+ /* a1 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* a5 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* a9 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* ad */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* b1 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* b5 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* b9 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* bd */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* c1 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* c5 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* c9 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* cd */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* d1 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* d5 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* d9 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* dd */ 0xe3839d, 0xe3839e, 0xe3839f, 0xe383a0,
+ /* e1 */ 0xe383a1, 0xe383a2, 0xe383a3, 0xe383a4,
+ /* e5 */ 0xe383a5, 0xe383a6, 0xe383a7, 0xe383a8,
+ /* e9 */ 0xe383a9, 0xe383aa, 0xe383ab, 0xe383ac,
+ /* ed */ 0xe383ad, 0xe383ae, 0xe383af, 0xe383b0,
+ /* f1 */ 0xe383b1, 0xe383b2, 0xe383b3, 0xe383b4,
+ /* f5 */ 0xe383b5, 0xe383b6, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x0028b ***/
+
+ /* a1 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* a5 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* a9 */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* ad */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* b1 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* b5 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* c5 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* c9 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* cd */ 0x00cebd, 0x00cebe, 0x00cebf, 0x00cf80,
+ /* d1 */ 0x00cf81, 0x00cf83, 0x00cf84, 0x00cf85,
+ /* d5 */ 0x00cf86, 0x00cf87, 0x00cf88, 0x00cf89,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a7xx - offset 0x002e9 ***/
+
+ /* a1 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* a5 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* a9 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* ad */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* b1 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* b5 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* b9 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* bd */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* c1 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d5 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d9 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* dd */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* e1 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* e5 */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e9 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* ed */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* f1 */ 0x00d18f, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a8xx - offset 0x00347 ***/
+
+ /* a1 */ 0x00c481, 0x00c3a1, 0x00c78e, 0x00c3a0,
+ /* a5 */ 0x00c493, 0x00c3a9, 0x00c49b, 0x00c3a8,
+ /* a9 */ 0x00c4ab, 0x00c3ad, 0x00c790, 0x00c3ac,
+ /* ad */ 0x00c58d, 0x00c3b3, 0x00c792, 0x00c3b2,
+ /* b1 */ 0x00c5ab, 0x00c3ba, 0x00c794, 0x00c3b9,
+ /* b5 */ 0x00c796, 0x00c798, 0x00c79a, 0x00c79c,
+ /* b9 */ 0x00c3bc, 0x00c3aa, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0xe38485, 0xe38486, 0xe38487, 0xe38488,
+ /* c9 */ 0xe38489, 0xe3848a, 0xe3848b, 0xe3848c,
+ /* cd */ 0xe3848d, 0xe3848e, 0xe3848f, 0xe38490,
+ /* d1 */ 0xe38491, 0xe38492, 0xe38493, 0xe38494,
+ /* d5 */ 0xe38495, 0xe38496, 0xe38497, 0xe38498,
+ /* d9 */ 0xe38499, 0xe3849a, 0xe3849b, 0xe3849c,
+ /* dd */ 0xe3849d, 0xe3849e, 0xe3849f, 0xe384a0,
+ /* e1 */ 0xe384a1, 0xe384a2, 0xe384a3, 0xe384a4,
+ /* e5 */ 0xe384a5, 0xe384a6, 0xe384a7, 0xe384a8,
+ /* e9 */ 0xe384a9, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a9xx - offset 0x003a2 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0xe29480,
+ /* a5 */ 0xe29481, 0xe29482, 0xe29483, 0xe29484,
+ /* a9 */ 0xe29485, 0xe29486, 0xe29487, 0xe29488,
+ /* ad */ 0xe29489, 0xe2948a, 0xe2948b, 0xe2948c,
+ /* b1 */ 0xe2948d, 0xe2948e, 0xe2948f, 0xe29490,
+ /* b5 */ 0xe29491, 0xe29492, 0xe29493, 0xe29494,
+ /* b9 */ 0xe29495, 0xe29496, 0xe29497, 0xe29498,
+ /* bd */ 0xe29499, 0xe2949a, 0xe2949b, 0xe2949c,
+ /* c1 */ 0xe2949d, 0xe2949e, 0xe2949f, 0xe294a0,
+ /* c5 */ 0xe294a1, 0xe294a2, 0xe294a3, 0xe294a4,
+ /* c9 */ 0xe294a5, 0xe294a6, 0xe294a7, 0xe294a8,
+ /* cd */ 0xe294a9, 0xe294aa, 0xe294ab, 0xe294ac,
+ /* d1 */ 0xe294ad, 0xe294ae, 0xe294af, 0xe294b0,
+ /* d5 */ 0xe294b1, 0xe294b2, 0xe294b3, 0xe294b4,
+ /* d9 */ 0xe294b5, 0xe294b6, 0xe294b7, 0xe294b8,
+ /* dd */ 0xe294b9, 0xe294ba, 0xe294bb, 0xe294bc,
+ /* e1 */ 0xe294bd, 0xe294be, 0xe294bf, 0xe29580,
+ /* e5 */ 0xe29581, 0xe29582, 0xe29583, 0xe29584,
+ /* e9 */ 0xe29585, 0xe29586, 0xe29587, 0xe29588,
+ /* ed */ 0xe29589, 0xe2958a, 0xe2958b, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: b0xx - offset 0x00400 ***/
+
+ /* a1 */ 0xe5958a, 0xe998bf, 0xe59f83, 0xe68ca8,
+ /* a5 */ 0xe5938e, 0xe59489, 0xe59380, 0xe79a91,
+ /* a9 */ 0xe7998c, 0xe894bc, 0xe79fae, 0xe889be,
+ /* ad */ 0xe7a28d, 0xe788b1, 0xe99a98, 0xe99e8d,
+ /* b1 */ 0xe6b0a8, 0xe5ae89, 0xe4bfba, 0xe68c89,
+ /* b5 */ 0xe69a97, 0xe5b2b8, 0xe883ba, 0xe6a188,
+ /* b9 */ 0xe882ae, 0xe69882, 0xe79b8e, 0xe587b9,
+ /* bd */ 0xe69596, 0xe786ac, 0xe7bfb1, 0xe8a284,
+ /* c1 */ 0xe582b2, 0xe5a5a5, 0xe6878a, 0xe6beb3,
+ /* c5 */ 0xe88aad, 0xe68d8c, 0xe68992, 0xe58fad,
+ /* c9 */ 0xe590a7, 0xe7ac86, 0xe585ab, 0xe796a4,
+ /* cd */ 0xe5b7b4, 0xe68b94, 0xe8b78b, 0xe99db6,
+ /* d1 */ 0xe68a8a, 0xe88099, 0xe59d9d, 0xe99cb8,
+ /* d5 */ 0xe7bda2, 0xe788b8, 0xe799bd, 0xe69f8f,
+ /* d9 */ 0xe799be, 0xe69186, 0xe4bdb0, 0xe8b4a5,
+ /* dd */ 0xe68b9c, 0xe7a897, 0xe69691, 0xe78fad,
+ /* e1 */ 0xe690ac, 0xe689b3, 0xe888ac, 0xe9a281,
+ /* e5 */ 0xe69dbf, 0xe78988, 0xe689ae, 0xe68b8c,
+ /* e9 */ 0xe4bcb4, 0xe793a3, 0xe58d8a, 0xe58a9e,
+ /* ed */ 0xe7bb8a, 0xe982a6, 0xe5b8ae, 0xe6a286,
+ /* f1 */ 0xe6a69c, 0xe88680, 0xe7bb91, 0xe6a392,
+ /* f5 */ 0xe7a385, 0xe89a8c, 0xe99591, 0xe5828d,
+ /* f9 */ 0xe8b0a4, 0xe88b9e, 0xe8839e, 0xe58c85,
+ /* fd */ 0xe8a492, 0xe589a5,
+
+ /*** Two byte table, leaf: b1xx - offset 0x0045e ***/
+
+ /* a1 */ 0xe89684, 0xe99bb9, 0xe4bf9d, 0xe5a0a1,
+ /* a5 */ 0xe9a5b1, 0xe5ae9d, 0xe68ab1, 0xe68aa5,
+ /* a9 */ 0xe69ab4, 0xe8b1b9, 0xe9b28d, 0xe78886,
+ /* ad */ 0xe69daf, 0xe7a291, 0xe682b2, 0xe58d91,
+ /* b1 */ 0xe58c97, 0xe8be88, 0xe8838c, 0xe8b49d,
+ /* b5 */ 0xe992a1, 0xe5808d, 0xe78b88, 0xe5a487,
+ /* b9 */ 0xe683ab, 0xe78499, 0xe8a2ab, 0xe5a594,
+ /* bd */ 0xe88baf, 0xe69cac, 0xe7aca8, 0xe5b4a9,
+ /* c1 */ 0xe7bbb7, 0xe794ad, 0xe6b3b5, 0xe8b9a6,
+ /* c5 */ 0xe8bfb8, 0xe980bc, 0xe9bcbb, 0xe6af94,
+ /* c9 */ 0xe98499, 0xe7ac94, 0xe5bdbc, 0xe7a2a7,
+ /* cd */ 0xe89396, 0xe894bd, 0xe6af95, 0xe6af99,
+ /* d1 */ 0xe6af96, 0xe5b881, 0xe5ba87, 0xe797b9,
+ /* d5 */ 0xe997ad, 0xe6959d, 0xe5bc8a, 0xe5bf85,
+ /* d9 */ 0xe8be9f, 0xe5a381, 0xe88782, 0xe981bf,
+ /* dd */ 0xe9999b, 0xe99ead, 0xe8beb9, 0xe7bc96,
+ /* e1 */ 0xe8b4ac, 0xe68981, 0xe4bebf, 0xe58f98,
+ /* e5 */ 0xe58d9e, 0xe8bea8, 0xe8bea9, 0xe8beab,
+ /* e9 */ 0xe9818d, 0xe6a087, 0xe5bdaa, 0xe88698,
+ /* ed */ 0xe8a1a8, 0xe9b396, 0xe6868b, 0xe588ab,
+ /* f1 */ 0xe798aa, 0xe5bdac, 0xe6968c, 0xe6bf92,
+ /* f5 */ 0xe6bba8, 0xe5aebe, 0xe69188, 0xe585b5,
+ /* f9 */ 0xe586b0, 0xe69f84, 0xe4b899, 0xe7a789,
+ /* fd */ 0xe9a5bc, 0xe782b3,
+
+ /*** Two byte table, leaf: b2xx - offset 0x004bc ***/
+
+ /* a1 */ 0xe79785, 0xe5b9b6, 0xe78ebb, 0xe88fa0,
+ /* a5 */ 0xe692ad, 0xe68ba8, 0xe992b5, 0xe6b3a2,
+ /* a9 */ 0xe58d9a, 0xe58b83, 0xe6908f, 0xe99382,
+ /* ad */ 0xe7ae94, 0xe4bcaf, 0xe5b89b, 0xe888b6,
+ /* b1 */ 0xe88496, 0xe8868a, 0xe6b8a4, 0xe6b38a,
+ /* b5 */ 0xe9a9b3, 0xe68d95, 0xe58d9c, 0xe593ba,
+ /* b9 */ 0xe8a1a5, 0xe59fa0, 0xe4b88d, 0xe5b883,
+ /* bd */ 0xe6ada5, 0xe7b0bf, 0xe983a8, 0xe68096,
+ /* c1 */ 0xe693a6, 0xe78c9c, 0xe8a381, 0xe69d90,
+ /* c5 */ 0xe6898d, 0xe8b4a2, 0xe79dac, 0xe8b8a9,
+ /* c9 */ 0xe98787, 0xe5bda9, 0xe88f9c, 0xe894a1,
+ /* cd */ 0xe9a490, 0xe58f82, 0xe89a95, 0xe6ae8b,
+ /* d1 */ 0xe683ad, 0xe683a8, 0xe781bf, 0xe88b8d,
+ /* d5 */ 0xe888b1, 0xe4bb93, 0xe6b2a7, 0xe8978f,
+ /* d9 */ 0xe6938d, 0xe7b399, 0xe6a7bd, 0xe69bb9,
+ /* dd */ 0xe88d89, 0xe58e95, 0xe7ad96, 0xe4bea7,
+ /* e1 */ 0xe5868c, 0xe6b58b, 0xe5b182, 0xe8b9ad,
+ /* e5 */ 0xe68f92, 0xe58f89, 0xe88cac, 0xe88cb6,
+ /* e9 */ 0xe69fa5, 0xe7a2b4, 0xe690bd, 0xe5af9f,
+ /* ed */ 0xe5b294, 0xe5b7ae, 0xe8afa7, 0xe68b86,
+ /* f1 */ 0xe69fb4, 0xe8b1ba, 0xe69080, 0xe68eba,
+ /* f5 */ 0xe89d89, 0xe9a68b, 0xe8b097, 0xe7bca0,
+ /* f9 */ 0xe993b2, 0xe4baa7, 0xe99890, 0xe9a2a4,
+ /* fd */ 0xe6988c, 0xe78c96,
+
+ /*** Two byte table, leaf: b3xx - offset 0x0051a ***/
+
+ /* a1 */ 0xe59cba, 0xe5b09d, 0xe5b8b8, 0xe995bf,
+ /* a5 */ 0xe581bf, 0xe882a0, 0xe58e82, 0xe6959e,
+ /* a9 */ 0xe79585, 0xe594b1, 0xe580a1, 0xe8b685,
+ /* ad */ 0xe68a84, 0xe9929e, 0xe69c9d, 0xe598b2,
+ /* b1 */ 0xe6bdae, 0xe5b7a2, 0xe590b5, 0xe78292,
+ /* b5 */ 0xe8bda6, 0xe689af, 0xe692a4, 0xe68ea3,
+ /* b9 */ 0xe5bdbb, 0xe6be88, 0xe983b4, 0xe887a3,
+ /* bd */ 0xe8beb0, 0xe5b098, 0xe699a8, 0xe5bfb1,
+ /* c1 */ 0xe6b289, 0xe99988, 0xe8b681, 0xe8a1ac,
+ /* c5 */ 0xe69291, 0xe7a7b0, 0xe59f8e, 0xe6a999,
+ /* c9 */ 0xe68890, 0xe59188, 0xe4b998, 0xe7a88b,
+ /* cd */ 0xe683a9, 0xe6be84, 0xe8af9a, 0xe689bf,
+ /* d1 */ 0xe9809e, 0xe9aa8b, 0xe7a7a4, 0xe59083,
+ /* d5 */ 0xe797b4, 0xe68c81, 0xe58c99, 0xe6b1a0,
+ /* d9 */ 0xe8bf9f, 0xe5bc9b, 0xe9a9b0, 0xe880bb,
+ /* dd */ 0xe9bdbf, 0xe4be88, 0xe5b0ba, 0xe8b5a4,
+ /* e1 */ 0xe7bf85, 0xe696a5, 0xe782bd, 0xe58585,
+ /* e5 */ 0xe586b2, 0xe899ab, 0xe5b487, 0xe5aea0,
+ /* e9 */ 0xe68abd, 0xe985ac, 0xe795b4, 0xe8b88c,
+ /* ed */ 0xe7a8a0, 0xe68481, 0xe7adb9, 0xe4bb87,
+ /* f1 */ 0xe7bbb8, 0xe79e85, 0xe4b891, 0xe887ad,
+ /* f5 */ 0xe5889d, 0xe587ba, 0xe6a9b1, 0xe58ea8,
+ /* f9 */ 0xe8ba87, 0xe99484, 0xe99b8f, 0xe6bb81,
+ /* fd */ 0xe999a4, 0xe6a59a,
+
+ /*** Two byte table, leaf: b4xx - offset 0x00578 ***/
+
+ /* a1 */ 0xe7a180, 0xe582a8, 0xe79f97, 0xe69090,
+ /* a5 */ 0xe8a7a6, 0xe5a484, 0xe68fa3, 0xe5b79d,
+ /* a9 */ 0xe7a9bf, 0xe6a4bd, 0xe4bca0, 0xe888b9,
+ /* ad */ 0xe59698, 0xe4b8b2, 0xe796ae, 0xe7aa97,
+ /* b1 */ 0xe5b9a2, 0xe5ba8a, 0xe997af, 0xe5889b,
+ /* b5 */ 0xe590b9, 0xe7828a, 0xe68db6, 0xe994a4,
+ /* b9 */ 0xe59e82, 0xe698a5, 0xe6a4bf, 0xe98687,
+ /* bd */ 0xe59487, 0xe6b7b3, 0xe7baaf, 0xe8a0a2,
+ /* c1 */ 0xe688b3, 0xe7bbb0, 0xe796b5, 0xe88ca8,
+ /* c5 */ 0xe7a381, 0xe99b8c, 0xe8be9e, 0xe68588,
+ /* c9 */ 0xe793b7, 0xe8af8d, 0xe6ada4, 0xe588ba,
+ /* cd */ 0xe8b590, 0xe6aca1, 0xe881aa, 0xe891b1,
+ /* d1 */ 0xe59bb1, 0xe58c86, 0xe4bb8e, 0xe4b89b,
+ /* d5 */ 0xe58791, 0xe7b297, 0xe9868b, 0xe7b087,
+ /* d9 */ 0xe4bf83, 0xe8b9bf, 0xe7afa1, 0xe7aa9c,
+ /* dd */ 0xe691a7, 0xe5b494, 0xe582ac, 0xe88486,
+ /* e1 */ 0xe79881, 0xe7b2b9, 0xe6b7ac, 0xe7bfa0,
+ /* e5 */ 0xe69d91, 0xe5ad98, 0xe5afb8, 0xe7a38b,
+ /* e9 */ 0xe692ae, 0xe69093, 0xe68eaa, 0xe68cab,
+ /* ed */ 0xe99499, 0xe690ad, 0xe8bebe, 0xe7ad94,
+ /* f1 */ 0xe798a9, 0xe68993, 0xe5a4a7, 0xe59186,
+ /* f5 */ 0xe6adb9, 0xe582a3, 0xe688b4, 0xe5b8a6,
+ /* f9 */ 0xe6ae86, 0xe4bba3, 0xe8b4b7, 0xe8a28b,
+ /* fd */ 0xe5be85, 0xe980ae,
+
+ /*** Two byte table, leaf: b5xx - offset 0x005d6 ***/
+
+ /* a1 */ 0xe680a0, 0xe880bd, 0xe68b85, 0xe4b8b9,
+ /* a5 */ 0xe58d95, 0xe983b8, 0xe68eb8, 0xe88386,
+ /* a9 */ 0xe697a6, 0xe6b0ae, 0xe4bd86, 0xe683ae,
+ /* ad */ 0xe6b7a1, 0xe8af9e, 0xe5bcb9, 0xe89b8b,
+ /* b1 */ 0xe5bd93, 0xe68ca1, 0xe5859a, 0xe88da1,
+ /* b5 */ 0xe6a1a3, 0xe58880, 0xe68da3, 0xe8b988,
+ /* b9 */ 0xe58092, 0xe5b29b, 0xe7a5b7, 0xe5afbc,
+ /* bd */ 0xe588b0, 0xe7a8bb, 0xe682bc, 0xe98193,
+ /* c1 */ 0xe79b97, 0xe5beb7, 0xe5be97, 0xe79a84,
+ /* c5 */ 0xe8b9ac, 0xe781af, 0xe799bb, 0xe7ad89,
+ /* c9 */ 0xe79eaa, 0xe587b3, 0xe98293, 0xe5a0a4,
+ /* cd */ 0xe4bd8e, 0xe6bbb4, 0xe8bfaa, 0xe6958c,
+ /* d1 */ 0xe7ac9b, 0xe78b84, 0xe6b6a4, 0xe7bf9f,
+ /* d5 */ 0xe5aba1, 0xe68ab5, 0xe5ba95, 0xe59cb0,
+ /* d9 */ 0xe89282, 0xe7acac, 0xe5b89d, 0xe5bc9f,
+ /* dd */ 0xe98092, 0xe7bc94, 0xe9a2a0, 0xe68e82,
+ /* e1 */ 0xe6bb87, 0xe7a298, 0xe782b9, 0xe585b8,
+ /* e5 */ 0xe99d9b, 0xe59eab, 0xe794b5, 0xe4bd83,
+ /* e9 */ 0xe794b8, 0xe5ba97, 0xe683a6, 0xe5a5a0,
+ /* ed */ 0xe6b780, 0xe6aebf, 0xe7a289, 0xe58fbc,
+ /* f1 */ 0xe99b95, 0xe5878b, 0xe58881, 0xe68e89,
+ /* f5 */ 0xe5908a, 0xe99293, 0xe8b083, 0xe8b78c,
+ /* f9 */ 0xe788b9, 0xe7a29f, 0xe89db6, 0xe8bfad,
+ /* fd */ 0xe8b08d, 0xe58fa0,
+
+ /*** Two byte table, leaf: b6xx - offset 0x00634 ***/
+
+ /* a1 */ 0xe4b881, 0xe79baf, 0xe58fae, 0xe99289,
+ /* a5 */ 0xe9a1b6, 0xe9bc8e, 0xe994ad, 0xe5ae9a,
+ /* a9 */ 0xe8aea2, 0xe4b8a2, 0xe4b89c, 0xe586ac,
+ /* ad */ 0xe891a3, 0xe68782, 0xe58aa8, 0xe6a08b,
+ /* b1 */ 0xe4be97, 0xe681ab, 0xe586bb, 0xe6b49e,
+ /* b5 */ 0xe5859c, 0xe68a96, 0xe69697, 0xe999a1,
+ /* b9 */ 0xe8b186, 0xe98097, 0xe79798, 0xe983bd,
+ /* bd */ 0xe79da3, 0xe6af92, 0xe78a8a, 0xe78bac,
+ /* c1 */ 0xe8afbb, 0xe5a0b5, 0xe79db9, 0xe8b58c,
+ /* c5 */ 0xe69d9c, 0xe99580, 0xe8829a, 0xe5baa6,
+ /* c9 */ 0xe6b8a1, 0xe5a692, 0xe7abaf, 0xe79fad,
+ /* cd */ 0xe994bb, 0xe6aeb5, 0xe696ad, 0xe7bc8e,
+ /* d1 */ 0xe5a086, 0xe58591, 0xe9989f, 0xe5afb9,
+ /* d5 */ 0xe5a2a9, 0xe590a8, 0xe8b9b2, 0xe695a6,
+ /* d9 */ 0xe9a1bf, 0xe59ba4, 0xe9929d, 0xe79bbe,
+ /* dd */ 0xe98181, 0xe68e87, 0xe59386, 0xe5a49a,
+ /* e1 */ 0xe5a4ba, 0xe59e9b, 0xe8bab2, 0xe69cb5,
+ /* e5 */ 0xe8b7ba, 0xe888b5, 0xe58981, 0xe683b0,
+ /* e9 */ 0xe5a095, 0xe89bbe, 0xe5b3a8, 0xe9b985,
+ /* ed */ 0xe4bf84, 0xe9a29d, 0xe8aeb9, 0xe5a8a5,
+ /* f1 */ 0xe681b6, 0xe58e84, 0xe689bc, 0xe9818f,
+ /* f5 */ 0xe98482, 0xe9a5bf, 0xe681a9, 0xe8808c,
+ /* f9 */ 0xe584bf, 0xe880b3, 0xe5b094, 0xe9a5b5,
+ /* fd */ 0xe6b4b1, 0xe4ba8c,
+
+ /*** Two byte table, leaf: b7xx - offset 0x00692 ***/
+
+ /* a1 */ 0xe8b4b0, 0xe58f91, 0xe7bd9a, 0xe7ad8f,
+ /* a5 */ 0xe4bc90, 0xe4b98f, 0xe99880, 0xe6b395,
+ /* a9 */ 0xe78f90, 0xe897a9, 0xe5b886, 0xe795aa,
+ /* ad */ 0xe7bfbb, 0xe6a88a, 0xe79fbe, 0xe99292,
+ /* b1 */ 0xe7b981, 0xe587a1, 0xe783a6, 0xe58f8d,
+ /* b5 */ 0xe8bf94, 0xe88c83, 0xe8b4a9, 0xe78aaf,
+ /* b9 */ 0xe9a5ad, 0xe6b39b, 0xe59d8a, 0xe88ab3,
+ /* bd */ 0xe696b9, 0xe882aa, 0xe688bf, 0xe998b2,
+ /* c1 */ 0xe5a6a8, 0xe4bbbf, 0xe8aebf, 0xe7baba,
+ /* c5 */ 0xe694be, 0xe88fb2, 0xe99d9e, 0xe595a1,
+ /* c9 */ 0xe9a39e, 0xe882a5, 0xe58caa, 0xe8afbd,
+ /* cd */ 0xe590a0, 0xe882ba, 0xe5ba9f, 0xe6b2b8,
+ /* d1 */ 0xe8b4b9, 0xe88aac, 0xe9859a, 0xe590a9,
+ /* d5 */ 0xe6b09b, 0xe58886, 0xe7bab7, 0xe59d9f,
+ /* d9 */ 0xe7849a, 0xe6b1be, 0xe7b289, 0xe5a58b,
+ /* dd */ 0xe4bbbd, 0xe5bfbf, 0xe684a4, 0xe7b2aa,
+ /* e1 */ 0xe4b8b0, 0xe5b081, 0xe69eab, 0xe89c82,
+ /* e5 */ 0xe5b3b0, 0xe9948b, 0xe9a38e, 0xe796af,
+ /* e9 */ 0xe783bd, 0xe980a2, 0xe586af, 0xe7bc9d,
+ /* ed */ 0xe8aebd, 0xe5a589, 0xe587a4, 0xe4bd9b,
+ /* f1 */ 0xe590a6, 0xe5a4ab, 0xe695b7, 0xe882a4,
+ /* f5 */ 0xe5adb5, 0xe689b6, 0xe68b82, 0xe8be90,
+ /* f9 */ 0xe5b985, 0xe6b09f, 0xe7aca6, 0xe4bc8f,
+ /* fd */ 0xe4bf98, 0xe69c8d,
+
+ /*** Two byte table, leaf: b8xx - offset 0x006f0 ***/
+
+ /* a1 */ 0xe6b5ae, 0xe6b6aa, 0xe7a68f, 0xe8a2b1,
+ /* a5 */ 0xe5bc97, 0xe794ab, 0xe68a9a, 0xe8be85,
+ /* a9 */ 0xe4bfaf, 0xe9879c, 0xe696a7, 0xe884af,
+ /* ad */ 0xe88591, 0xe5ba9c, 0xe88590, 0xe8b5b4,
+ /* b1 */ 0xe589af, 0xe8a686, 0xe8b58b, 0xe5a48d,
+ /* b5 */ 0xe58285, 0xe4bb98, 0xe9989c, 0xe788b6,
+ /* b9 */ 0xe885b9, 0xe8b49f, 0xe5af8c, 0xe8aea3,
+ /* bd */ 0xe99984, 0xe5a687, 0xe7bc9a, 0xe59290,
+ /* c1 */ 0xe599b6, 0xe5988e, 0xe8afa5, 0xe694b9,
+ /* c5 */ 0xe6a682, 0xe99299, 0xe79b96, 0xe6ba89,
+ /* c9 */ 0xe5b9b2, 0xe79498, 0xe69d86, 0xe69f91,
+ /* cd */ 0xe7abbf, 0xe8829d, 0xe8b5b6, 0xe6849f,
+ /* d1 */ 0xe7a786, 0xe695a2, 0xe8b5a3, 0xe58688,
+ /* d5 */ 0xe5889a, 0xe992a2, 0xe7bcb8, 0xe8829b,
+ /* d9 */ 0xe7bab2, 0xe5b297, 0xe6b8af, 0xe69da0,
+ /* dd */ 0xe7af99, 0xe79a8b, 0xe9ab98, 0xe8868f,
+ /* e1 */ 0xe7be94, 0xe7b395, 0xe6909e, 0xe99590,
+ /* e5 */ 0xe7a8bf, 0xe5918a, 0xe593a5, 0xe6ad8c,
+ /* e9 */ 0xe69081, 0xe68888, 0xe9b8bd, 0xe883b3,
+ /* ed */ 0xe79699, 0xe589b2, 0xe99da9, 0xe8919b,
+ /* f1 */ 0xe6a0bc, 0xe89ba4, 0xe99881, 0xe99a94,
+ /* f5 */ 0xe993ac, 0xe4b8aa, 0xe59084, 0xe7bb99,
+ /* f9 */ 0xe6a0b9, 0xe8b79f, 0xe88095, 0xe69bb4,
+ /* fd */ 0xe5ba9a, 0xe7beb9,
+
+ /*** Two byte table, leaf: b9xx - offset 0x0074e ***/
+
+ /* a1 */ 0xe59f82, 0xe880bf, 0xe6a297, 0xe5b7a5,
+ /* a5 */ 0xe694bb, 0xe58a9f, 0xe681ad, 0xe9be9a,
+ /* a9 */ 0xe4be9b, 0xe8baac, 0xe585ac, 0xe5aeab,
+ /* ad */ 0xe5bc93, 0xe5b7a9, 0xe6b19e, 0xe68bb1,
+ /* b1 */ 0xe8b4a1, 0xe585b1, 0xe992a9, 0xe58bbe,
+ /* b5 */ 0xe6b29f, 0xe88b9f, 0xe78b97, 0xe59ea2,
+ /* b9 */ 0xe69e84, 0xe8b4ad, 0xe5a49f, 0xe8be9c,
+ /* bd */ 0xe88f87, 0xe59295, 0xe7ae8d, 0xe4bcb0,
+ /* c1 */ 0xe6b2bd, 0xe5ada4, 0xe5a791, 0xe9bc93,
+ /* c5 */ 0xe58fa4, 0xe89b8a, 0xe9aaa8, 0xe8b0b7,
+ /* c9 */ 0xe882a1, 0xe69585, 0xe9a1be, 0xe59bba,
+ /* cd */ 0xe99b87, 0xe588ae, 0xe7939c, 0xe58990,
+ /* d1 */ 0xe5afa1, 0xe68c82, 0xe8a482, 0xe4b996,
+ /* d5 */ 0xe68b90, 0xe680aa, 0xe6a3ba, 0xe585b3,
+ /* d9 */ 0xe5ae98, 0xe586a0, 0xe8a782, 0xe7aea1,
+ /* dd */ 0xe9a686, 0xe7bd90, 0xe683af, 0xe7818c,
+ /* e1 */ 0xe8b4af, 0xe58589, 0xe5b9bf, 0xe9809b,
+ /* e5 */ 0xe791b0, 0xe8a784, 0xe59cad, 0xe7a185,
+ /* e9 */ 0xe5bd92, 0xe9be9f, 0xe997ba, 0xe8bda8,
+ /* ed */ 0xe9acbc, 0xe8afa1, 0xe799b8, 0xe6a182,
+ /* f1 */ 0xe69f9c, 0xe8b7aa, 0xe8b4b5, 0xe588bd,
+ /* f5 */ 0xe8be8a, 0xe6bb9a, 0xe6a38d, 0xe99485,
+ /* f9 */ 0xe983ad, 0xe59bbd, 0xe69e9c, 0xe8a3b9,
+ /* fd */ 0xe8bf87, 0xe59388,
+
+ /*** Two byte table, leaf: baxx - offset 0x007ac ***/
+
+ /* a1 */ 0xe9aab8, 0xe5ada9, 0xe6b5b7, 0xe6b0a6,
+ /* a5 */ 0xe4baa5, 0xe5aeb3, 0xe9aa87, 0xe985a3,
+ /* a9 */ 0xe686a8, 0xe982af, 0xe99fa9, 0xe590ab,
+ /* ad */ 0xe6b6b5, 0xe5af92, 0xe587bd, 0xe5968a,
+ /* b1 */ 0xe7bd95, 0xe7bfb0, 0xe692bc, 0xe68d8d,
+ /* b5 */ 0xe697b1, 0xe686be, 0xe6828d, 0xe7848a,
+ /* b9 */ 0xe6b197, 0xe6b189, 0xe5a4af, 0xe69dad,
+ /* bd */ 0xe888aa, 0xe5a395, 0xe59a8e, 0xe8b1aa,
+ /* c1 */ 0xe6afab, 0xe9839d, 0xe5a5bd, 0xe88097,
+ /* c5 */ 0xe58fb7, 0xe6b5a9, 0xe591b5, 0xe5969d,
+ /* c9 */ 0xe88db7, 0xe88f8f, 0xe6a0b8, 0xe7a6be,
+ /* cd */ 0xe5928c, 0xe4bd95, 0xe59088, 0xe79b92,
+ /* d1 */ 0xe8b289, 0xe99882, 0xe6b2b3, 0xe6b6b8,
+ /* d5 */ 0xe8b5ab, 0xe8a490, 0xe9b9a4, 0xe8b4ba,
+ /* d9 */ 0xe598bf, 0xe9bb91, 0xe79795, 0xe5be88,
+ /* dd */ 0xe78ba0, 0xe681a8, 0xe593bc, 0xe4baa8,
+ /* e1 */ 0xe6a8aa, 0xe8a1a1, 0xe68192, 0xe8bdb0,
+ /* e5 */ 0xe59384, 0xe78398, 0xe899b9, 0xe9b8bf,
+ /* e9 */ 0xe6b4aa, 0xe5ae8f, 0xe5bc98, 0xe7baa2,
+ /* ed */ 0xe59689, 0xe4beaf, 0xe78cb4, 0xe590bc,
+ /* f1 */ 0xe58e9a, 0xe58099, 0xe5908e, 0xe591bc,
+ /* f5 */ 0xe4b98e, 0xe5bfbd, 0xe7919a, 0xe5a3b6,
+ /* f9 */ 0xe891ab, 0xe883a1, 0xe89db4, 0xe78b90,
+ /* fd */ 0xe7b38a, 0xe6b996,
+
+ /*** Two byte table, leaf: bbxx - offset 0x0080a ***/
+
+ /* a1 */ 0xe5bca7, 0xe8998e, 0xe594ac, 0xe68aa4,
+ /* a5 */ 0xe4ba92, 0xe6b2aa, 0xe688b7, 0xe88ab1,
+ /* a9 */ 0xe59397, 0xe58d8e, 0xe78cbe, 0xe6bb91,
+ /* ad */ 0xe794bb, 0xe58892, 0xe58c96, 0xe8af9d,
+ /* b1 */ 0xe6a790, 0xe5be8a, 0xe68080, 0xe6b7ae,
+ /* b5 */ 0xe59d8f, 0xe6aca2, 0xe78eaf, 0xe6a193,
+ /* b9 */ 0xe8bf98, 0xe7bc93, 0xe68da2, 0xe682a3,
+ /* bd */ 0xe594a4, 0xe797aa, 0xe8b1a2, 0xe78495,
+ /* c1 */ 0xe6b6a3, 0xe5aea6, 0xe5b9bb, 0xe88d92,
+ /* c5 */ 0xe6858c, 0xe9bb84, 0xe7a3ba, 0xe89d97,
+ /* c9 */ 0xe7b0a7, 0xe79a87, 0xe587b0, 0xe683b6,
+ /* cd */ 0xe7858c, 0xe69983, 0xe5b98c, 0xe6818d,
+ /* d1 */ 0xe8b08e, 0xe781b0, 0xe68ca5, 0xe8be89,
+ /* d5 */ 0xe5bebd, 0xe681a2, 0xe89b94, 0xe59b9e,
+ /* d9 */ 0xe6af81, 0xe68294, 0xe685a7, 0xe58d89,
+ /* dd */ 0xe683a0, 0xe699a6, 0xe8b4bf, 0xe7a7bd,
+ /* e1 */ 0xe4bc9a, 0xe783a9, 0xe6b187, 0xe8aeb3,
+ /* e5 */ 0xe8afb2, 0xe7bb98, 0xe88da4, 0xe6988f,
+ /* e9 */ 0xe5a99a, 0xe9ad82, 0xe6b591, 0xe6b7b7,
+ /* ed */ 0xe8b181, 0xe6b4bb, 0xe4bc99, 0xe781ab,
+ /* f1 */ 0xe88eb7, 0xe68896, 0xe68391, 0xe99c8d,
+ /* f5 */ 0xe8b4a7, 0xe7a5b8, 0xe587bb, 0xe59cbe,
+ /* f9 */ 0xe59fba, 0xe69cba, 0xe795b8, 0xe7a8bd,
+ /* fd */ 0xe7a7af, 0xe7ae95,
+
+ /*** Two byte table, leaf: bcxx - offset 0x00868 ***/
+
+ /* a1 */ 0xe8828c, 0xe9a5a5, 0xe8bfb9, 0xe6bf80,
+ /* a5 */ 0xe8aea5, 0xe9b8a1, 0xe5a7ac, 0xe7bba9,
+ /* a9 */ 0xe7bc89, 0xe59089, 0xe69e81, 0xe6a398,
+ /* ad */ 0xe8be91, 0xe7b18d, 0xe99b86, 0xe58f8a,
+ /* b1 */ 0xe680a5, 0xe796be, 0xe6b1b2, 0xe58db3,
+ /* b5 */ 0xe5ab89, 0xe7baa7, 0xe68ca4, 0xe587a0,
+ /* b9 */ 0xe8848a, 0xe5b7b1, 0xe8939f, 0xe68a80,
+ /* bd */ 0xe58680, 0xe5ada3, 0xe4bc8e, 0xe7a5ad,
+ /* c1 */ 0xe58982, 0xe682b8, 0xe6b58e, 0xe5af84,
+ /* c5 */ 0xe5af82, 0xe8aea1, 0xe8aeb0, 0xe697a2,
+ /* c9 */ 0xe5bf8c, 0xe99985, 0xe5a693, 0xe7bba7,
+ /* cd */ 0xe7baaa, 0xe59889, 0xe69eb7, 0xe5a4b9,
+ /* d1 */ 0xe4bdb3, 0xe5aeb6, 0xe58aa0, 0xe88d9a,
+ /* d5 */ 0xe9a28a, 0xe8b4be, 0xe794b2, 0xe992be,
+ /* d9 */ 0xe58187, 0xe7a8bc, 0xe4bbb7, 0xe69eb6,
+ /* dd */ 0xe9a9be, 0xe5ab81, 0xe6adbc, 0xe79b91,
+ /* e1 */ 0xe59d9a, 0xe5b096, 0xe7acba, 0xe997b4,
+ /* e5 */ 0xe7858e, 0xe585bc, 0xe882a9, 0xe889b0,
+ /* e9 */ 0xe5a5b8, 0xe7bc84, 0xe88ca7, 0xe6a380,
+ /* ed */ 0xe69fac, 0xe7a2b1, 0xe7a1b7, 0xe68ba3,
+ /* f1 */ 0xe68da1, 0xe7ae80, 0xe4bfad, 0xe589aa,
+ /* f5 */ 0xe5878f, 0xe88d90, 0xe6a79b, 0xe989b4,
+ /* f9 */ 0xe8b7b5, 0xe8b4b1, 0xe8a781, 0xe994ae,
+ /* fd */ 0xe7aead, 0xe4bbb6,
+
+ /*** Two byte table, leaf: bdxx - offset 0x008c6 ***/
+
+ /* a1 */ 0xe581a5, 0xe888b0, 0xe58991, 0xe9a5af,
+ /* a5 */ 0xe6b890, 0xe6ba85, 0xe6b6a7, 0xe5bbba,
+ /* a9 */ 0xe583b5, 0xe5a79c, 0xe5b086, 0xe6b586,
+ /* ad */ 0xe6b19f, 0xe79686, 0xe8928b, 0xe6a1a8,
+ /* b1 */ 0xe5a596, 0xe8aeb2, 0xe58ca0, 0xe985b1,
+ /* b5 */ 0xe9998d, 0xe89589, 0xe6a492, 0xe7a481,
+ /* b9 */ 0xe784a6, 0xe883b6, 0xe4baa4, 0xe9838a,
+ /* bd */ 0xe6b587, 0xe9aa84, 0xe5a887, 0xe59abc,
+ /* c1 */ 0xe69085, 0xe993b0, 0xe79fab, 0xe4bea5,
+ /* c5 */ 0xe8849a, 0xe78ba1, 0xe8a792, 0xe9a5ba,
+ /* c9 */ 0xe7bcb4, 0xe7bb9e, 0xe589bf, 0xe69599,
+ /* cd */ 0xe985b5, 0xe8bdbf, 0xe8be83, 0xe58fab,
+ /* d1 */ 0xe7aa96, 0xe68fad, 0xe68ea5, 0xe79a86,
+ /* d5 */ 0xe7a7b8, 0xe8a197, 0xe998b6, 0xe688aa,
+ /* d9 */ 0xe58aab, 0xe88a82, 0xe6a194, 0xe69db0,
+ /* dd */ 0xe68db7, 0xe79dab, 0xe7abad, 0xe6b481,
+ /* e1 */ 0xe7bb93, 0xe8a7a3, 0xe5a790, 0xe68892,
+ /* e5 */ 0xe89789, 0xe88aa5, 0xe7958c, 0xe5809f,
+ /* e9 */ 0xe4bb8b, 0xe796a5, 0xe8afab, 0xe5b18a,
+ /* ed */ 0xe5b7be, 0xe7ad8b, 0xe696a4, 0xe98791,
+ /* f1 */ 0xe4bb8a, 0xe6b4a5, 0xe8a59f, 0xe7b4a7,
+ /* f5 */ 0xe994a6, 0xe4bb85, 0xe8b0a8, 0xe8bf9b,
+ /* f9 */ 0xe99db3, 0xe6998b, 0xe7a681, 0xe8bf91,
+ /* fd */ 0xe783ac, 0xe6b5b8,
+
+ /*** Two byte table, leaf: bexx - offset 0x00924 ***/
+
+ /* a1 */ 0xe5b0bd, 0xe58ab2, 0xe88d86, 0xe585a2,
+ /* a5 */ 0xe88c8e, 0xe79d9b, 0xe699b6, 0xe9b2b8,
+ /* a9 */ 0xe4baac, 0xe6838a, 0xe7b2be, 0xe7b2b3,
+ /* ad */ 0xe7bb8f, 0xe4ba95, 0xe8ada6, 0xe699af,
+ /* b1 */ 0xe9a288, 0xe99d99, 0xe5a283, 0xe695ac,
+ /* b5 */ 0xe9959c, 0xe5be84, 0xe79789, 0xe99d96,
+ /* b9 */ 0xe7ab9f, 0xe7ab9e, 0xe58780, 0xe782af,
+ /* bd */ 0xe7aa98, 0xe68faa, 0xe7a9b6, 0xe7baa0,
+ /* c1 */ 0xe78e96, 0xe99fad, 0xe4b985, 0xe781b8,
+ /* c5 */ 0xe4b99d, 0xe98592, 0xe58ea9, 0xe69591,
+ /* c9 */ 0xe697a7, 0xe887bc, 0xe88885, 0xe5928e,
+ /* cd */ 0xe5b0b1, 0xe7969a, 0xe99ea0, 0xe68b98,
+ /* d1 */ 0xe78b99, 0xe796bd, 0xe5b185, 0xe9a9b9,
+ /* d5 */ 0xe88f8a, 0xe5b180, 0xe59280, 0xe79fa9,
+ /* d9 */ 0xe4b8be, 0xe6b2ae, 0xe8819a, 0xe68b92,
+ /* dd */ 0xe68dae, 0xe5b7a8, 0xe585b7, 0xe8b79d,
+ /* e1 */ 0xe8b89e, 0xe994af, 0xe4bfb1, 0xe58fa5,
+ /* e5 */ 0xe683a7, 0xe782ac, 0xe589a7, 0xe68d90,
+ /* e9 */ 0xe9b983, 0xe5a89f, 0xe580a6, 0xe79cb7,
+ /* ed */ 0xe58db7, 0xe7bba2, 0xe69285, 0xe694ab,
+ /* f1 */ 0xe68a89, 0xe68e98, 0xe58094, 0xe788b5,
+ /* f5 */ 0xe8a789, 0xe586b3, 0xe8af80, 0xe7bb9d,
+ /* f9 */ 0xe59d87, 0xe88f8c, 0xe992a7, 0xe5869b,
+ /* fd */ 0xe5909b, 0xe5b3bb,
+
+ /*** Two byte table, leaf: bfxx - offset 0x00982 ***/
+
+ /* a1 */ 0xe4bf8a, 0xe7aba3, 0xe6b59a, 0xe983a1,
+ /* a5 */ 0xe9aa8f, 0xe59680, 0xe59296, 0xe58da1,
+ /* a9 */ 0xe592af, 0xe5bc80, 0xe68fa9, 0xe6a5b7,
+ /* ad */ 0xe587af, 0xe685a8, 0xe5888a, 0xe5a0aa,
+ /* b1 */ 0xe58b98, 0xe59d8e, 0xe7a08d, 0xe79c8b,
+ /* b5 */ 0xe5bab7, 0xe685b7, 0xe7b3a0, 0xe6899b,
+ /* b9 */ 0xe68a97, 0xe4baa2, 0xe78295, 0xe88083,
+ /* bd */ 0xe68bb7, 0xe783a4, 0xe99da0, 0xe59db7,
+ /* c1 */ 0xe88b9b, 0xe69faf, 0xe6a3b5, 0xe7a395,
+ /* c5 */ 0xe9a297, 0xe7a791, 0xe5a3b3, 0xe592b3,
+ /* c9 */ 0xe58faf, 0xe6b8b4, 0xe5858b, 0xe588bb,
+ /* cd */ 0xe5aea2, 0xe8afbe, 0xe882af, 0xe59583,
+ /* d1 */ 0xe59ea6, 0xe681b3, 0xe59d91, 0xe590ad,
+ /* d5 */ 0xe7a9ba, 0xe68190, 0xe5ad94, 0xe68ea7,
+ /* d9 */ 0xe68aa0, 0xe58fa3, 0xe689a3, 0xe5af87,
+ /* dd */ 0xe69eaf, 0xe593ad, 0xe7aa9f, 0xe88ba6,
+ /* e1 */ 0xe985b7, 0xe5ba93, 0xe8a3a4, 0xe5a4b8,
+ /* e5 */ 0xe59eae, 0xe68c8e, 0xe8b7a8, 0xe883af,
+ /* e9 */ 0xe59d97, 0xe7adb7, 0xe4bea9, 0xe5bfab,
+ /* ed */ 0xe5aebd, 0xe6acbe, 0xe58ca1, 0xe7ad90,
+ /* f1 */ 0xe78b82, 0xe6a186, 0xe79fbf, 0xe79cb6,
+ /* f5 */ 0xe697b7, 0xe586b5, 0xe4ba8f, 0xe79b94,
+ /* f9 */ 0xe5b2bf, 0xe7aaa5, 0xe891b5, 0xe5a58e,
+ /* fd */ 0xe9ad81, 0xe58280,
+
+ /*** Two byte table, leaf: c0xx - offset 0x009e0 ***/
+
+ /* a1 */ 0xe9a688, 0xe684a7, 0xe6ba83, 0xe59da4,
+ /* a5 */ 0xe69886, 0xe68d86, 0xe59bb0, 0xe68bac,
+ /* a9 */ 0xe689a9, 0xe5bb93, 0xe99894, 0xe59e83,
+ /* ad */ 0xe68b89, 0xe59687, 0xe89ca1, 0xe8858a,
+ /* b1 */ 0xe8bea3, 0xe595a6, 0xe88eb1, 0xe69da5,
+ /* b5 */ 0xe8b596, 0xe8939d, 0xe5a9aa, 0xe6a08f,
+ /* b9 */ 0xe68ba6, 0xe7afae, 0xe99891, 0xe585b0,
+ /* bd */ 0xe6be9c, 0xe8b0b0, 0xe68fbd, 0xe8a788,
+ /* c1 */ 0xe68792, 0xe7bc86, 0xe78382, 0xe6bba5,
+ /* c5 */ 0xe79085, 0xe6a694, 0xe78bbc, 0xe5bb8a,
+ /* c9 */ 0xe9838e, 0xe69c97, 0xe6b5aa, 0xe68d9e,
+ /* cd */ 0xe58ab3, 0xe789a2, 0xe88081, 0xe4bdac,
+ /* d1 */ 0xe5a7a5, 0xe985aa, 0xe78399, 0xe6b69d,
+ /* d5 */ 0xe58b92, 0xe4b990, 0xe99bb7, 0xe995ad,
+ /* d9 */ 0xe895be, 0xe7a38a, 0xe7b4af, 0xe584a1,
+ /* dd */ 0xe59e92, 0xe69382, 0xe8828b, 0xe7b1bb,
+ /* e1 */ 0xe6b3aa, 0xe6a3b1, 0xe6a59e, 0xe586b7,
+ /* e5 */ 0xe58e98, 0xe6a2a8, 0xe78a81, 0xe9bb8e,
+ /* e9 */ 0xe7afb1, 0xe78bb8, 0xe7a6bb, 0xe6bc93,
+ /* ed */ 0xe79086, 0xe69d8e, 0xe9878c, 0xe9b2a4,
+ /* f1 */ 0xe7a4bc, 0xe88e89, 0xe88d94, 0xe5908f,
+ /* f5 */ 0xe6a097, 0xe4b8bd, 0xe58e89, 0xe58ab1,
+ /* f9 */ 0xe7a0be, 0xe58e86, 0xe588a9, 0xe58288,
+ /* fd */ 0xe4be8b, 0xe4bf90,
+
+ /*** Two byte table, leaf: c1xx - offset 0x00a3e ***/
+
+ /* a1 */ 0xe797a2, 0xe7ab8b, 0xe7b292, 0xe6b2a5,
+ /* a5 */ 0xe99ab6, 0xe58a9b, 0xe79283, 0xe593a9,
+ /* a9 */ 0xe4bfa9, 0xe88194, 0xe88eb2, 0xe8bf9e,
+ /* ad */ 0xe995b0, 0xe5bb89, 0xe6809c, 0xe6b69f,
+ /* b1 */ 0xe5b898, 0xe6959b, 0xe884b8, 0xe993be,
+ /* b5 */ 0xe6818b, 0xe782bc, 0xe7bb83, 0xe7b2ae,
+ /* b9 */ 0xe58789, 0xe6a281, 0xe7b2b1, 0xe889af,
+ /* bd */ 0xe4b8a4, 0xe8be86, 0xe9878f, 0xe699be,
+ /* c1 */ 0xe4baae, 0xe8b085, 0xe692a9, 0xe8818a,
+ /* c5 */ 0xe5839a, 0xe79697, 0xe7878e, 0xe5afa5,
+ /* c9 */ 0xe8bebd, 0xe6bda6, 0xe4ba86, 0xe69282,
+ /* cd */ 0xe995a3, 0xe5bb96, 0xe69699, 0xe58897,
+ /* d1 */ 0xe8a382, 0xe78388, 0xe58aa3, 0xe78c8e,
+ /* d5 */ 0xe790b3, 0xe69e97, 0xe7a3b7, 0xe99c96,
+ /* d9 */ 0xe4b8b4, 0xe982bb, 0xe9b39e, 0xe6b78b,
+ /* dd */ 0xe5879b, 0xe8b581, 0xe5909d, 0xe68b8e,
+ /* e1 */ 0xe78eb2, 0xe88fb1, 0xe99bb6, 0xe9be84,
+ /* e5 */ 0xe99383, 0xe4bcb6, 0xe7be9a, 0xe5878c,
+ /* e9 */ 0xe781b5, 0xe999b5, 0xe5b2ad, 0xe9a286,
+ /* ed */ 0xe58fa6, 0xe4bba4, 0xe6ba9c, 0xe79089,
+ /* f1 */ 0xe6a6b4, 0xe7a1ab, 0xe9a68f, 0xe79599,
+ /* f5 */ 0xe58898, 0xe798a4, 0xe6b581, 0xe69fb3,
+ /* f9 */ 0xe585ad, 0xe9be99, 0xe8818b, 0xe59299,
+ /* fd */ 0xe7acbc, 0xe7aabf,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00a9c ***/
+
+ /* a1 */ 0xe99a86, 0xe59e84, 0xe68ba2, 0xe99987,
+ /* a5 */ 0xe6a5bc, 0xe5a884, 0xe69082, 0xe7af93,
+ /* a9 */ 0xe6bc8f, 0xe9998b, 0xe88aa6, 0xe58da2,
+ /* ad */ 0xe9a285, 0xe5ba90, 0xe78289, 0xe68eb3,
+ /* b1 */ 0xe58da4, 0xe8998f, 0xe9b281, 0xe9ba93,
+ /* b5 */ 0xe7a28c, 0xe99cb2, 0xe8b7af, 0xe8b582,
+ /* b9 */ 0xe9b9bf, 0xe6bd9e, 0xe7a684, 0xe5bd95,
+ /* bd */ 0xe99986, 0xe688ae, 0xe9a9b4, 0xe59095,
+ /* c1 */ 0xe9939d, 0xe4bea3, 0xe69785, 0xe5b1a5,
+ /* c5 */ 0xe5b1a1, 0xe7bc95, 0xe89991, 0xe6b0af,
+ /* c9 */ 0xe5be8b, 0xe78e87, 0xe6bba4, 0xe7bbbf,
+ /* cd */ 0xe5b3a6, 0xe68c9b, 0xe5adaa, 0xe6bba6,
+ /* d1 */ 0xe58db5, 0xe4b9b1, 0xe68ea0, 0xe795a5,
+ /* d5 */ 0xe68aa1, 0xe8bdae, 0xe4bca6, 0xe4bb91,
+ /* d9 */ 0xe6b2a6, 0xe7bab6, 0xe8aeba, 0xe8909d,
+ /* dd */ 0xe89eba, 0xe7bd97, 0xe980bb, 0xe994a3,
+ /* e1 */ 0xe7aea9, 0xe9aaa1, 0xe8a3b8, 0xe890bd,
+ /* e5 */ 0xe6b49b, 0xe9aa86, 0xe7bb9c, 0xe5a688,
+ /* e9 */ 0xe9babb, 0xe78e9b, 0xe7a081, 0xe89a82,
+ /* ed */ 0xe9a9ac, 0xe9aa82, 0xe5989b, 0xe59097,
+ /* f1 */ 0xe59f8b, 0xe4b9b0, 0xe9baa6, 0xe58d96,
+ /* f5 */ 0xe8bf88, 0xe88489, 0xe79e92, 0xe9a692,
+ /* f9 */ 0xe89bae, 0xe6bba1, 0xe89493, 0xe69bbc,
+ /* fd */ 0xe685a2, 0xe6bcab,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00afa ***/
+
+ /* a1 */ 0xe8b0a9, 0xe88a92, 0xe88cab, 0xe79bb2,
+ /* a5 */ 0xe6b093, 0xe5bf99, 0xe88ebd, 0xe78cab,
+ /* a9 */ 0xe88c85, 0xe9949a, 0xe6af9b, 0xe79f9b,
+ /* ad */ 0xe99386, 0xe58daf, 0xe88c82, 0xe58692,
+ /* b1 */ 0xe5b8bd, 0xe8b28c, 0xe8b4b8, 0xe4b988,
+ /* b5 */ 0xe78eab, 0xe69e9a, 0xe6a285, 0xe985b6,
+ /* b9 */ 0xe99c89, 0xe785a4, 0xe6b2a1, 0xe79c89,
+ /* bd */ 0xe5aa92, 0xe99581, 0xe6af8f, 0xe7be8e,
+ /* c1 */ 0xe698a7, 0xe5af90, 0xe5a6b9, 0xe5aa9a,
+ /* c5 */ 0xe997a8, 0xe997b7, 0xe4bbac, 0xe8908c,
+ /* c9 */ 0xe89299, 0xe6aaac, 0xe79b9f, 0xe994b0,
+ /* cd */ 0xe78c9b, 0xe6a2a6, 0xe5ad9f, 0xe79caf,
+ /* d1 */ 0xe9869a, 0xe99da1, 0xe7b39c, 0xe8bfb7,
+ /* d5 */ 0xe8b09c, 0xe5bca5, 0xe7b1b3, 0xe7a798,
+ /* d9 */ 0xe8a785, 0xe6b38c, 0xe89c9c, 0xe5af86,
+ /* dd */ 0xe5b982, 0xe6a389, 0xe79ca0, 0xe7bbb5,
+ /* e1 */ 0xe58695, 0xe5858d, 0xe58b89, 0xe5a8a9,
+ /* e5 */ 0xe7bc85, 0xe99da2, 0xe88b97, 0xe68f8f,
+ /* e9 */ 0xe79e84, 0xe89790, 0xe7a792, 0xe6b8ba,
+ /* ed */ 0xe5ba99, 0xe5a699, 0xe89491, 0xe781ad,
+ /* f1 */ 0xe6b091, 0xe68abf, 0xe79abf, 0xe6958f,
+ /* f5 */ 0xe682af, 0xe997bd, 0xe6988e, 0xe89e9f,
+ /* f9 */ 0xe9b8a3, 0xe993ad, 0xe5908d, 0xe591bd,
+ /* fd */ 0xe8b0ac, 0xe691b8,
+
+ /*** Two byte table, leaf: c4xx - offset 0x00b58 ***/
+
+ /* a1 */ 0xe691b9, 0xe89891, 0xe6a8a1, 0xe8869c,
+ /* a5 */ 0xe7a3a8, 0xe691a9, 0xe9ad94, 0xe68ab9,
+ /* a9 */ 0xe69cab, 0xe88eab, 0xe5a2a8, 0xe9bb98,
+ /* ad */ 0xe6b2ab, 0xe6bca0, 0xe5af9e, 0xe9998c,
+ /* b1 */ 0xe8b08b, 0xe7899f, 0xe69f90, 0xe68b87,
+ /* b5 */ 0xe789a1, 0xe4baa9, 0xe5a786, 0xe6af8d,
+ /* b9 */ 0xe5a293, 0xe69aae, 0xe5b995, 0xe58b9f,
+ /* bd */ 0xe68595, 0xe69ca8, 0xe79bae, 0xe79da6,
+ /* c1 */ 0xe789a7, 0xe7a986, 0xe68bbf, 0xe593aa,
+ /* c5 */ 0xe59190, 0xe992a0, 0xe982a3, 0xe5a89c,
+ /* c9 */ 0xe7bab3, 0xe6b096, 0xe4b983, 0xe5a5b6,
+ /* cd */ 0xe88090, 0xe5a588, 0xe58d97, 0xe794b7,
+ /* d1 */ 0xe99abe, 0xe59b8a, 0xe68ca0, 0xe88491,
+ /* d5 */ 0xe681bc, 0xe997b9, 0xe6b796, 0xe591a2,
+ /* d9 */ 0xe9a681, 0xe58685, 0xe5aba9, 0xe883bd,
+ /* dd */ 0xe5a6ae, 0xe99c93, 0xe580aa, 0xe6b3a5,
+ /* e1 */ 0xe5b0bc, 0xe68b9f, 0xe4bda0, 0xe58cbf,
+ /* e5 */ 0xe885bb, 0xe98086, 0xe6baba, 0xe894ab,
+ /* e9 */ 0xe68b88, 0xe5b9b4, 0xe7a2be, 0xe692b5,
+ /* ed */ 0xe68dbb, 0xe5bfb5, 0xe5a898, 0xe985bf,
+ /* f1 */ 0xe9b89f, 0xe5b0bf, 0xe68d8f, 0xe88182,
+ /* f5 */ 0xe5adbd, 0xe595ae, 0xe9958a, 0xe9958d,
+ /* f9 */ 0xe6b685, 0xe682a8, 0xe69fa0, 0xe78b9e,
+ /* fd */ 0xe5879d, 0xe5ae81,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00bb6 ***/
+
+ /* a1 */ 0xe68ba7, 0xe6b39e, 0xe7899b, 0xe689ad,
+ /* a5 */ 0xe992ae, 0xe7babd, 0xe88493, 0xe6b593,
+ /* a9 */ 0xe5869c, 0xe5bc84, 0xe5a5b4, 0xe58aaa,
+ /* ad */ 0xe68092, 0xe5a5b3, 0xe69a96, 0xe89990,
+ /* b1 */ 0xe7969f, 0xe68caa, 0xe687a6, 0xe7b3af,
+ /* b5 */ 0xe8afba, 0xe593a6, 0xe6aca7, 0xe9b8a5,
+ /* b9 */ 0xe6aeb4, 0xe89795, 0xe59195, 0xe581b6,
+ /* bd */ 0xe6b2a4, 0xe595aa, 0xe8b6b4, 0xe788ac,
+ /* c1 */ 0xe5b895, 0xe68095, 0xe790b6, 0xe68b8d,
+ /* c5 */ 0xe68e92, 0xe7898c, 0xe5be98, 0xe6b983,
+ /* c9 */ 0xe6b4be, 0xe69480, 0xe6bd98, 0xe79b98,
+ /* cd */ 0xe7a390, 0xe79bbc, 0xe79594, 0xe588a4,
+ /* d1 */ 0xe58f9b, 0xe4b993, 0xe5ba9e, 0xe69781,
+ /* d5 */ 0xe880aa, 0xe88396, 0xe68a9b, 0xe59286,
+ /* d9 */ 0xe588a8, 0xe782ae, 0xe8a28d, 0xe8b791,
+ /* dd */ 0xe6b3a1, 0xe591b8, 0xe8839a, 0xe59fb9,
+ /* e1 */ 0xe8a3b4, 0xe8b594, 0xe999aa, 0xe9858d,
+ /* e5 */ 0xe4bda9, 0xe6b29b, 0xe596b7, 0xe79b86,
+ /* e9 */ 0xe7a0b0, 0xe68aa8, 0xe783b9, 0xe6be8e,
+ /* ed */ 0xe5bdad, 0xe893ac, 0xe6a39a, 0xe7a1bc,
+ /* f1 */ 0xe7afb7, 0xe886a8, 0xe69c8b, 0xe9b98f,
+ /* f5 */ 0xe68da7, 0xe7a2b0, 0xe59daf, 0xe7a092,
+ /* f9 */ 0xe99cb9, 0xe689b9, 0xe68aab, 0xe58a88,
+ /* fd */ 0xe790b5, 0xe6af97,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00c14 ***/
+
+ /* a1 */ 0xe595a4, 0xe884be, 0xe796b2, 0xe79aae,
+ /* a5 */ 0xe58cb9, 0xe7979e, 0xe583bb, 0xe5b181,
+ /* a9 */ 0xe8adac, 0xe7af87, 0xe5818f, 0xe78987,
+ /* ad */ 0xe9aa97, 0xe9a398, 0xe6bc82, 0xe793a2,
+ /* b1 */ 0xe7a5a8, 0xe69287, 0xe79ea5, 0xe68bbc,
+ /* b5 */ 0xe9a291, 0xe8b4ab, 0xe59381, 0xe88198,
+ /* b9 */ 0xe4b992, 0xe59daa, 0xe88bb9, 0xe8908d,
+ /* bd */ 0xe5b9b3, 0xe587ad, 0xe793b6, 0xe8af84,
+ /* c1 */ 0xe5b18f, 0xe59da1, 0xe6b3bc, 0xe9a287,
+ /* c5 */ 0xe5a986, 0xe7a0b4, 0xe9ad84, 0xe8bfab,
+ /* c9 */ 0xe7b295, 0xe58996, 0xe68991, 0xe993ba,
+ /* cd */ 0xe4bb86, 0xe88e86, 0xe891a1, 0xe88fa9,
+ /* d1 */ 0xe892b2, 0xe59f94, 0xe69cb4, 0xe59c83,
+ /* d5 */ 0xe699ae, 0xe6b5a6, 0xe8b0b1, 0xe69b9d,
+ /* d9 */ 0xe78091, 0xe69c9f, 0xe6acba, 0xe6a096,
+ /* dd */ 0xe6889a, 0xe5a6bb, 0xe4b883, 0xe58784,
+ /* e1 */ 0xe6bc86, 0xe69f92, 0xe6b28f, 0xe585b6,
+ /* e5 */ 0xe6a38b, 0xe5a587, 0xe6ada7, 0xe795a6,
+ /* e9 */ 0xe5b48e, 0xe88490, 0xe9bd90, 0xe69797,
+ /* ed */ 0xe7a588, 0xe7a581, 0xe9aa91, 0xe8b5b7,
+ /* f1 */ 0xe5b282, 0xe4b99e, 0xe4bc81, 0xe590af,
+ /* f5 */ 0xe5a591, 0xe7a08c, 0xe599a8, 0xe6b094,
+ /* f9 */ 0xe8bf84, 0xe5bc83, 0xe6b1bd, 0xe6b3a3,
+ /* fd */ 0xe8aeab, 0xe68e90,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00c72 ***/
+
+ /* a1 */ 0xe681b0, 0xe6b4bd, 0xe789b5, 0xe689a6,
+ /* a5 */ 0xe9928e, 0xe99385, 0xe58d83, 0xe8bf81,
+ /* a9 */ 0xe7adbe, 0xe4bb9f, 0xe8b0a6, 0xe4b9be,
+ /* ad */ 0xe9bb94, 0xe992b1, 0xe992b3, 0xe5898d,
+ /* b1 */ 0xe6bd9c, 0xe981a3, 0xe6b585, 0xe8b0b4,
+ /* b5 */ 0xe5a091, 0xe5b58c, 0xe6aca0, 0xe6ad89,
+ /* b9 */ 0xe69eaa, 0xe5919b, 0xe88594, 0xe7be8c,
+ /* bd */ 0xe5a299, 0xe894b7, 0xe5bcba, 0xe68aa2,
+ /* c1 */ 0xe6a987, 0xe994b9, 0xe695b2, 0xe68284,
+ /* c5 */ 0xe6a1a5, 0xe79ea7, 0xe4b994, 0xe4bea8,
+ /* c9 */ 0xe5b7a7, 0xe99e98, 0xe692ac, 0xe7bf98,
+ /* cd */ 0xe5b3ad, 0xe4bf8f, 0xe7aa8d, 0xe58887,
+ /* d1 */ 0xe88c84, 0xe4b894, 0xe680af, 0xe7aa83,
+ /* d5 */ 0xe992a6, 0xe4beb5, 0xe4bab2, 0xe7a7a6,
+ /* d9 */ 0xe790b4, 0xe58ba4, 0xe88ab9, 0xe69392,
+ /* dd */ 0xe7a6bd, 0xe5af9d, 0xe6b281, 0xe99d92,
+ /* e1 */ 0xe8bdbb, 0xe6b0a2, 0xe580be, 0xe58dbf,
+ /* e5 */ 0xe6b885, 0xe6938e, 0xe699b4, 0xe6b0b0,
+ /* e9 */ 0xe68385, 0xe9a1b7, 0xe8afb7, 0xe5ba86,
+ /* ed */ 0xe790bc, 0xe7a9b7, 0xe7a78b, 0xe4b898,
+ /* f1 */ 0xe982b1, 0xe79083, 0xe6b182, 0xe59b9a,
+ /* f5 */ 0xe9858b, 0xe6b385, 0xe8b68b, 0xe58cba,
+ /* f9 */ 0xe89b86, 0xe69bb2, 0xe8baaf, 0xe5b188,
+ /* fd */ 0xe9a9b1, 0xe6b8a0,
+
+ /*** Two byte table, leaf: c8xx - offset 0x00cd0 ***/
+
+ /* a1 */ 0xe58f96, 0xe5a8b6, 0xe9be8b, 0xe8b6a3,
+ /* a5 */ 0xe58ebb, 0xe59c88, 0xe9a2a7, 0xe69d83,
+ /* a9 */ 0xe9869b, 0xe6b389, 0xe585a8, 0xe7978a,
+ /* ad */ 0xe68bb3, 0xe78aac, 0xe588b8, 0xe58a9d,
+ /* b1 */ 0xe7bcba, 0xe78294, 0xe798b8, 0xe58db4,
+ /* b5 */ 0xe9b98a, 0xe6a6b7, 0xe7a1ae, 0xe99b80,
+ /* b9 */ 0xe8a399, 0xe7bea4, 0xe784b6, 0xe78783,
+ /* bd */ 0xe58689, 0xe69f93, 0xe793a4, 0xe5a3a4,
+ /* c1 */ 0xe69498, 0xe59ab7, 0xe8aea9, 0xe9a5b6,
+ /* c5 */ 0xe689b0, 0xe7bb95, 0xe683b9, 0xe783ad,
+ /* c9 */ 0xe5a3ac, 0xe4bb81, 0xe4baba, 0xe5bf8d,
+ /* cd */ 0xe99fa7, 0xe4bbbb, 0xe8aea4, 0xe58883,
+ /* d1 */ 0xe5a68a, 0xe7baab, 0xe68994, 0xe4bb8d,
+ /* d5 */ 0xe697a5, 0xe6888e, 0xe88cb8, 0xe89389,
+ /* d9 */ 0xe88da3, 0xe89e8d, 0xe78694, 0xe6bab6,
+ /* dd */ 0xe5aeb9, 0xe7bb92, 0xe58697, 0xe68f89,
+ /* e1 */ 0xe69f94, 0xe88289, 0xe88cb9, 0xe8a095,
+ /* e5 */ 0xe58492, 0xe5adba, 0xe5a682, 0xe8beb1,
+ /* e9 */ 0xe4b9b3, 0xe6b19d, 0xe585a5, 0xe8a4a5,
+ /* ed */ 0xe8bdaf, 0xe998ae, 0xe8958a, 0xe7919e,
+ /* f1 */ 0xe99490, 0xe997b0, 0xe6b6a6, 0xe88ba5,
+ /* f5 */ 0xe5bcb1, 0xe69292, 0xe6b492, 0xe890a8,
+ /* f9 */ 0xe885ae, 0xe9b383, 0xe5a19e, 0xe8b59b,
+ /* fd */ 0xe4b889, 0xe58f81,
+
+ /*** Two byte table, leaf: c9xx - offset 0x00d2e ***/
+
+ /* a1 */ 0xe4bc9e, 0xe695a3, 0xe6a191, 0xe59793,
+ /* a5 */ 0xe4b8a7, 0xe69094, 0xe9aa9a, 0xe689ab,
+ /* a9 */ 0xe5ab82, 0xe7919f, 0xe889b2, 0xe6b6a9,
+ /* ad */ 0xe6a3ae, 0xe583a7, 0xe88e8e, 0xe7a082,
+ /* b1 */ 0xe69d80, 0xe588b9, 0xe6b299, 0xe7bab1,
+ /* b5 */ 0xe582bb, 0xe595a5, 0xe7859e, 0xe7ad9b,
+ /* b9 */ 0xe69992, 0xe78f8a, 0xe88bab, 0xe69d89,
+ /* bd */ 0xe5b1b1, 0xe588a0, 0xe785bd, 0xe8a1ab,
+ /* c1 */ 0xe997aa, 0xe99995, 0xe69385, 0xe8b5a1,
+ /* c5 */ 0xe886b3, 0xe59684, 0xe6b195, 0xe68987,
+ /* c9 */ 0xe7bcae, 0xe5a292, 0xe4bca4, 0xe59586,
+ /* cd */ 0xe8b58f, 0xe6998c, 0xe4b88a, 0xe5b09a,
+ /* d1 */ 0xe8a3b3, 0xe6a2a2, 0xe68d8e, 0xe7a88d,
+ /* d5 */ 0xe783a7, 0xe88a8d, 0xe58bba, 0xe99fb6,
+ /* d9 */ 0xe5b091, 0xe593a8, 0xe982b5, 0xe7bb8d,
+ /* dd */ 0xe5a5a2, 0xe8b58a, 0xe89b87, 0xe8888c,
+ /* e1 */ 0xe8888d, 0xe8b5a6, 0xe69184, 0xe5b084,
+ /* e5 */ 0xe68591, 0xe6b689, 0xe7a4be, 0xe8aebe,
+ /* e9 */ 0xe7a0b7, 0xe794b3, 0xe591bb, 0xe4bcb8,
+ /* ed */ 0xe8baab, 0xe6b7b1, 0xe5a8a0, 0xe7bb85,
+ /* f1 */ 0xe7a59e, 0xe6b288, 0xe5aea1, 0xe5a9b6,
+ /* f5 */ 0xe7949a, 0xe882be, 0xe6858e, 0xe6b897,
+ /* f9 */ 0xe5a3b0, 0xe7949f, 0xe794a5, 0xe789b2,
+ /* fd */ 0xe58d87, 0xe7bbb3,
+
+ /*** Two byte table, leaf: caxx - offset 0x00d8c ***/
+
+ /* a1 */ 0xe79c81, 0xe79b9b, 0xe589a9, 0xe8839c,
+ /* a5 */ 0xe59ca3, 0xe5b888, 0xe5a4b1, 0xe78bae,
+ /* a9 */ 0xe696bd, 0xe6b9bf, 0xe8af97, 0xe5b0b8,
+ /* ad */ 0xe899b1, 0xe58d81, 0xe79fb3, 0xe68bbe,
+ /* b1 */ 0xe697b6, 0xe4bb80, 0xe9a39f, 0xe89a80,
+ /* b5 */ 0xe5ae9e, 0xe8af86, 0xe58fb2, 0xe79fa2,
+ /* b9 */ 0xe4bdbf, 0xe5b18e, 0xe9a9b6, 0xe5a78b,
+ /* bd */ 0xe5bc8f, 0xe7a4ba, 0xe5a3ab, 0xe4b896,
+ /* c1 */ 0xe69fbf, 0xe4ba8b, 0xe68bad, 0xe8aa93,
+ /* c5 */ 0xe9809d, 0xe58abf, 0xe698af, 0xe5979c,
+ /* c9 */ 0xe599ac, 0xe98082, 0xe4bb95, 0xe4be8d,
+ /* cd */ 0xe9878a, 0xe9a5b0, 0xe6b08f, 0xe5b882,
+ /* d1 */ 0xe68183, 0xe5aea4, 0xe8a786, 0xe8af95,
+ /* d5 */ 0xe694b6, 0xe6898b, 0xe9a696, 0xe5ae88,
+ /* d9 */ 0xe5afbf, 0xe68e88, 0xe594ae, 0xe58f97,
+ /* dd */ 0xe798a6, 0xe585bd, 0xe894ac, 0xe69ea2,
+ /* e1 */ 0xe6a2b3, 0xe6ae8a, 0xe68a92, 0xe8be93,
+ /* e5 */ 0xe58f94, 0xe88892, 0xe6b791, 0xe7968f,
+ /* e9 */ 0xe4b9a6, 0xe8b58e, 0xe5adb0, 0xe7869f,
+ /* ed */ 0xe896af, 0xe69a91, 0xe69b99, 0xe7bdb2,
+ /* f1 */ 0xe89c80, 0xe9bb8d, 0xe9bca0, 0xe5b19e,
+ /* f5 */ 0xe69caf, 0xe8bfb0, 0xe6a091, 0xe69d9f,
+ /* f9 */ 0xe6888d, 0xe7ab96, 0xe5a285, 0xe5bab6,
+ /* fd */ 0xe695b0, 0xe6bcb1,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00dea ***/
+
+ /* a1 */ 0xe68195, 0xe588b7, 0xe8808d, 0xe69194,
+ /* a5 */ 0xe8a1b0, 0xe794a9, 0xe5b885, 0xe6a093,
+ /* a9 */ 0xe68bb4, 0xe99c9c, 0xe58f8c, 0xe788bd,
+ /* ad */ 0xe8b081, 0xe6b0b4, 0xe79da1, 0xe7a88e,
+ /* b1 */ 0xe590ae, 0xe79eac, 0xe9a1ba, 0xe8889c,
+ /* b5 */ 0xe8afb4, 0xe7a195, 0xe69c94, 0xe78381,
+ /* b9 */ 0xe696af, 0xe69295, 0xe598b6, 0xe6809d,
+ /* bd */ 0xe7a781, 0xe58fb8, 0xe4b89d, 0xe6adbb,
+ /* c1 */ 0xe88286, 0xe5afba, 0xe597a3, 0xe59b9b,
+ /* c5 */ 0xe4bcba, 0xe4bcbc, 0xe9a5b2, 0xe5b7b3,
+ /* c9 */ 0xe69dbe, 0xe880b8, 0xe68082, 0xe9a282,
+ /* cd */ 0xe98081, 0xe5ae8b, 0xe8aebc, 0xe8afb5,
+ /* d1 */ 0xe6909c, 0xe88998, 0xe6939e, 0xe597bd,
+ /* d5 */ 0xe88b8f, 0xe985a5, 0xe4bf97, 0xe7b4a0,
+ /* d9 */ 0xe9809f, 0xe7b29f, 0xe583b3, 0xe5a191,
+ /* dd */ 0xe6baaf, 0xe5aebf, 0xe8af89, 0xe88283,
+ /* e1 */ 0xe985b8, 0xe8929c, 0xe7ae97, 0xe899bd,
+ /* e5 */ 0xe99a8b, 0xe99a8f, 0xe7bba5, 0xe9ab93,
+ /* e9 */ 0xe7a28e, 0xe5b281, 0xe7a997, 0xe98182,
+ /* ed */ 0xe99aa7, 0xe7a59f, 0xe5ad99, 0xe68d9f,
+ /* f1 */ 0xe7ac8b, 0xe89391, 0xe6a2ad, 0xe59486,
+ /* f5 */ 0xe7bca9, 0xe79090, 0xe7b4a2, 0xe99481,
+ /* f9 */ 0xe68980, 0xe5a18c, 0xe4bb96, 0xe5ae83,
+ /* fd */ 0xe5a5b9, 0xe5a194,
+
+ /*** Two byte table, leaf: ccxx - offset 0x00e48 ***/
+
+ /* a1 */ 0xe78dad, 0xe68c9e, 0xe8b98b, 0xe8b88f,
+ /* a5 */ 0xe8838e, 0xe88b94, 0xe68aac, 0xe58fb0,
+ /* a9 */ 0xe6b3b0, 0xe9859e, 0xe5a4aa, 0xe68081,
+ /* ad */ 0xe6b1b0, 0xe59d8d, 0xe6918a, 0xe8b4aa,
+ /* b1 */ 0xe798ab, 0xe6bba9, 0xe59d9b, 0xe6aa80,
+ /* b5 */ 0xe797b0, 0xe6bdad, 0xe8b0ad, 0xe8b088,
+ /* b9 */ 0xe59da6, 0xe6afaf, 0xe8a292, 0xe7a2b3,
+ /* bd */ 0xe68ea2, 0xe58fb9, 0xe782ad, 0xe6b1a4,
+ /* c1 */ 0xe5a198, 0xe690aa, 0xe5a082, 0xe6a3a0,
+ /* c5 */ 0xe8869b, 0xe59490, 0xe7b396, 0xe58098,
+ /* c9 */ 0xe8baba, 0xe6b78c, 0xe8b69f, 0xe783ab,
+ /* cd */ 0xe68e8f, 0xe6b69b, 0xe6bb94, 0xe7bba6,
+ /* d1 */ 0xe89084, 0xe6a183, 0xe98083, 0xe6b798,
+ /* d5 */ 0xe999b6, 0xe8aea8, 0xe5a597, 0xe789b9,
+ /* d9 */ 0xe897a4, 0xe885be, 0xe796bc, 0xe8aa8a,
+ /* dd */ 0xe6a2af, 0xe58994, 0xe8b8a2, 0xe99491,
+ /* e1 */ 0xe68f90, 0xe9a298, 0xe8b984, 0xe595bc,
+ /* e5 */ 0xe4bd93, 0xe69bbf, 0xe59a8f, 0xe68395,
+ /* e9 */ 0xe6b695, 0xe58983, 0xe5b189, 0xe5a4a9,
+ /* ed */ 0xe6b7bb, 0xe5a1ab, 0xe794b0, 0xe7949c,
+ /* f1 */ 0xe681ac, 0xe88894, 0xe88586, 0xe68c91,
+ /* f5 */ 0xe69da1, 0xe8bfa2, 0xe79cba, 0xe8b7b3,
+ /* f9 */ 0xe8b4b4, 0xe99381, 0xe5b896, 0xe58e85,
+ /* fd */ 0xe590ac, 0xe78383,
+
+ /*** Two byte table, leaf: cdxx - offset 0x00ea6 ***/
+
+ /* a1 */ 0xe6b180, 0xe5bbb7, 0xe5819c, 0xe4baad,
+ /* a5 */ 0xe5baad, 0xe68cba, 0xe88987, 0xe9809a,
+ /* a9 */ 0xe6a190, 0xe985ae, 0xe79eb3, 0xe5908c,
+ /* ad */ 0xe9939c, 0xe5bda4, 0xe7aba5, 0xe6a1b6,
+ /* b1 */ 0xe68d85, 0xe7ad92, 0xe7bb9f, 0xe7979b,
+ /* b5 */ 0xe581b7, 0xe68a95, 0xe5a4b4, 0xe9808f,
+ /* b9 */ 0xe587b8, 0xe7a783, 0xe7aa81, 0xe59bbe,
+ /* bd */ 0xe5be92, 0xe98094, 0xe6b682, 0xe5b1a0,
+ /* c1 */ 0xe59c9f, 0xe59090, 0xe58594, 0xe6b98d,
+ /* c5 */ 0xe59ba2, 0xe68ea8, 0xe9a293, 0xe885bf,
+ /* c9 */ 0xe89c95, 0xe8a4aa, 0xe98080, 0xe5909e,
+ /* cd */ 0xe5b1af, 0xe88780, 0xe68b96, 0xe68998,
+ /* d1 */ 0xe884b1, 0xe9b8b5, 0xe99980, 0xe9a9ae,
+ /* d5 */ 0xe9a9bc, 0xe6a4ad, 0xe5a6a5, 0xe68b93,
+ /* d9 */ 0xe594be, 0xe68c96, 0xe59387, 0xe89b99,
+ /* dd */ 0xe6b4bc, 0xe5a883, 0xe793a6, 0xe8a29c,
+ /* e1 */ 0xe6adaa, 0xe5a496, 0xe8b18c, 0xe5bcaf,
+ /* e5 */ 0xe6b9be, 0xe78ea9, 0xe9a1bd, 0xe4b8b8,
+ /* e9 */ 0xe783b7, 0xe5ae8c, 0xe7a297, 0xe68cbd,
+ /* ed */ 0xe6999a, 0xe79a96, 0xe6838b, 0xe5ae9b,
+ /* f1 */ 0xe5a989, 0xe4b887, 0xe88595, 0xe6b1aa,
+ /* f5 */ 0xe78e8b, 0xe4baa1, 0xe69e89, 0xe7bd91,
+ /* f9 */ 0xe5be80, 0xe697ba, 0xe69c9b, 0xe5bf98,
+ /* fd */ 0xe5a684, 0xe5a881,
+
+ /*** Two byte table, leaf: cexx - offset 0x00f04 ***/
+
+ /* a1 */ 0xe5b78d, 0xe5beae, 0xe58db1, 0xe99fa6,
+ /* a5 */ 0xe8bf9d, 0xe6a185, 0xe59bb4, 0xe594af,
+ /* a9 */ 0xe6839f, 0xe4b8ba, 0xe6bd8d, 0xe7bbb4,
+ /* ad */ 0xe88b87, 0xe8908e, 0xe5a794, 0xe4bc9f,
+ /* b1 */ 0xe4bcaa, 0xe5b0be, 0xe7baac, 0xe69caa,
+ /* b5 */ 0xe8949a, 0xe591b3, 0xe7958f, 0xe88383,
+ /* b9 */ 0xe59682, 0xe9ad8f, 0xe4bd8d, 0xe6b8ad,
+ /* bd */ 0xe8b093, 0xe5b089, 0xe685b0, 0xe58dab,
+ /* c1 */ 0xe7989f, 0xe6b8a9, 0xe89a8a, 0xe69687,
+ /* c5 */ 0xe997bb, 0xe7bab9, 0xe590bb, 0xe7a8b3,
+ /* c9 */ 0xe7b48a, 0xe997ae, 0xe597a1, 0xe7bf81,
+ /* cd */ 0xe793ae, 0xe68c9d, 0xe89c97, 0xe6b6a1,
+ /* d1 */ 0xe7aa9d, 0xe68891, 0xe696a1, 0xe58da7,
+ /* d5 */ 0xe68fa1, 0xe6b283, 0xe5b7ab, 0xe5919c,
+ /* d9 */ 0xe992a8, 0xe4b98c, 0xe6b1a1, 0xe8afac,
+ /* dd */ 0xe5b18b, 0xe697a0, 0xe88a9c, 0xe6a2a7,
+ /* e1 */ 0xe590be, 0xe590b4, 0xe6af8b, 0xe6ada6,
+ /* e5 */ 0xe4ba94, 0xe68d82, 0xe58d88, 0xe8889e,
+ /* e9 */ 0xe4bc8d, 0xe4beae, 0xe59d9e, 0xe6888a,
+ /* ed */ 0xe99bbe, 0xe699a4, 0xe789a9, 0xe58bbf,
+ /* f1 */ 0xe58aa1, 0xe6829f, 0xe8afaf, 0xe69894,
+ /* f5 */ 0xe78699, 0xe69e90, 0xe8a5bf, 0xe7a192,
+ /* f9 */ 0xe79fbd, 0xe699b0, 0xe598bb, 0xe590b8,
+ /* fd */ 0xe994a1, 0xe789ba,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00f62 ***/
+
+ /* a1 */ 0xe7a880, 0xe681af, 0xe5b88c, 0xe68289,
+ /* a5 */ 0xe8869d, 0xe5a495, 0xe6839c, 0xe78684,
+ /* a9 */ 0xe783af, 0xe6baaa, 0xe6b190, 0xe78a80,
+ /* ad */ 0xe6aa84, 0xe8a2ad, 0xe5b8ad, 0xe4b9a0,
+ /* b1 */ 0xe5aab3, 0xe5969c, 0xe993a3, 0xe6b497,
+ /* b5 */ 0xe7b3bb, 0xe99a99, 0xe6888f, 0xe7bb86,
+ /* b9 */ 0xe79e8e, 0xe899be, 0xe58ca3, 0xe99c9e,
+ /* bd */ 0xe8be96, 0xe69a87, 0xe5b3a1, 0xe4bea0,
+ /* c1 */ 0xe78bad, 0xe4b88b, 0xe58ea6, 0xe5a48f,
+ /* c5 */ 0xe59093, 0xe68e80, 0xe994a8, 0xe58588,
+ /* c9 */ 0xe4bb99, 0xe9b29c, 0xe7baa4, 0xe592b8,
+ /* cd */ 0xe8b4a4, 0xe8a194, 0xe888b7, 0xe997b2,
+ /* d1 */ 0xe6b68e, 0xe5bca6, 0xe5ab8c, 0xe698be,
+ /* d5 */ 0xe999a9, 0xe78eb0, 0xe78cae, 0xe58ebf,
+ /* d9 */ 0xe885ba, 0xe9a685, 0xe7bea1, 0xe5aeaa,
+ /* dd */ 0xe999b7, 0xe99990, 0xe7babf, 0xe79bb8,
+ /* e1 */ 0xe58ea2, 0xe995b6, 0xe9a699, 0xe7aeb1,
+ /* e5 */ 0xe8a584, 0xe6b998, 0xe4b9a1, 0xe7bf94,
+ /* e9 */ 0xe7a5a5, 0xe8afa6, 0xe683b3, 0xe5938d,
+ /* ed */ 0xe4baab, 0xe9a1b9, 0xe5b7b7, 0xe6a9a1,
+ /* f1 */ 0xe5838f, 0xe59091, 0xe8b1a1, 0xe890a7,
+ /* f5 */ 0xe7a19d, 0xe99c84, 0xe5898a, 0xe593ae,
+ /* f9 */ 0xe59aa3, 0xe99480, 0xe6b688, 0xe5aeb5,
+ /* fd */ 0xe6b786, 0xe69993,
+
+ /*** Two byte table, leaf: d0xx - offset 0x00fc0 ***/
+
+ /* a1 */ 0xe5b08f, 0xe5ad9d, 0xe6a0a1, 0xe88296,
+ /* a5 */ 0xe595b8, 0xe7ac91, 0xe69588, 0xe6a594,
+ /* a9 */ 0xe4ba9b, 0xe6ad87, 0xe89d8e, 0xe99e8b,
+ /* ad */ 0xe58d8f, 0xe68c9f, 0xe690ba, 0xe982aa,
+ /* b1 */ 0xe6969c, 0xe88381, 0xe8b090, 0xe58699,
+ /* b5 */ 0xe6a2b0, 0xe58db8, 0xe89fb9, 0xe68788,
+ /* b9 */ 0xe6b384, 0xe6b3bb, 0xe8b0a2, 0xe5b191,
+ /* bd */ 0xe896aa, 0xe88aaf, 0xe9948c, 0xe6aca3,
+ /* c1 */ 0xe8be9b, 0xe696b0, 0xe5bfbb, 0xe5bf83,
+ /* c5 */ 0xe4bfa1, 0xe8a185, 0xe6989f, 0xe885a5,
+ /* c9 */ 0xe78ca9, 0xe683ba, 0xe585b4, 0xe58891,
+ /* cd */ 0xe59e8b, 0xe5bda2, 0xe982a2, 0xe8a18c,
+ /* d1 */ 0xe98692, 0xe5b9b8, 0xe69d8f, 0xe680a7,
+ /* d5 */ 0xe5a793, 0xe58584, 0xe587b6, 0xe883b8,
+ /* d9 */ 0xe58c88, 0xe6b1b9, 0xe99b84, 0xe7868a,
+ /* dd */ 0xe4bc91, 0xe4bfae, 0xe7be9e, 0xe69cbd,
+ /* e1 */ 0xe59785, 0xe99488, 0xe7a780, 0xe8a296,
+ /* e5 */ 0xe7bba3, 0xe5a29f, 0xe6888c, 0xe99c80,
+ /* e9 */ 0xe8999a, 0xe59898, 0xe9a1bb, 0xe5be90,
+ /* ed */ 0xe8aeb8, 0xe89384, 0xe98597, 0xe58f99,
+ /* f1 */ 0xe697ad, 0xe5ba8f, 0xe7959c, 0xe681a4,
+ /* f5 */ 0xe7b5ae, 0xe5a9bf, 0xe7bbaa, 0xe7bbad,
+ /* f9 */ 0xe8bda9, 0xe596a7, 0xe5aea3, 0xe682ac,
+ /* fd */ 0xe6978b, 0xe78e84,
+
+ /*** Two byte table, leaf: d1xx - offset 0x0101e ***/
+
+ /* a1 */ 0xe98089, 0xe799a3, 0xe79ca9, 0xe7bb9a,
+ /* a5 */ 0xe99db4, 0xe8969b, 0xe5ada6, 0xe7a9b4,
+ /* a9 */ 0xe99baa, 0xe8a180, 0xe58b8b, 0xe7868f,
+ /* ad */ 0xe5beaa, 0xe697ac, 0xe8afa2, 0xe5afbb,
+ /* b1 */ 0xe9a9af, 0xe5b7a1, 0xe6ae89, 0xe6b19b,
+ /* b5 */ 0xe8aead, 0xe8aeaf, 0xe9808a, 0xe8bf85,
+ /* b9 */ 0xe58e8b, 0xe68abc, 0xe9b8a6, 0xe9b8ad,
+ /* bd */ 0xe59180, 0xe4b8ab, 0xe88abd, 0xe78999,
+ /* c1 */ 0xe89a9c, 0xe5b496, 0xe8a199, 0xe6b6af,
+ /* c5 */ 0xe99b85, 0xe59391, 0xe4ba9a, 0xe8aeb6,
+ /* c9 */ 0xe78489, 0xe592bd, 0xe99889, 0xe7839f,
+ /* cd */ 0xe6b7b9, 0xe79b90, 0xe4b8a5, 0xe7a094,
+ /* d1 */ 0xe89c92, 0xe5b2a9, 0xe5bbb6, 0xe8a880,
+ /* d5 */ 0xe9a29c, 0xe9988e, 0xe7828e, 0xe6b2bf,
+ /* d9 */ 0xe5a584, 0xe68ea9, 0xe79cbc, 0xe8a18d,
+ /* dd */ 0xe6bc94, 0xe889b3, 0xe5a0b0, 0xe78795,
+ /* e1 */ 0xe58e8c, 0xe7a09a, 0xe99b81, 0xe59481,
+ /* e5 */ 0xe5bda6, 0xe784b0, 0xe5aeb4, 0xe8b09a,
+ /* e9 */ 0xe9aa8c, 0xe6ae83, 0xe5a4ae, 0xe9b8af,
+ /* ed */ 0xe7a7a7, 0xe69da8, 0xe689ac, 0xe4bdaf,
+ /* f1 */ 0xe796a1, 0xe7be8a, 0xe6b48b, 0xe998b3,
+ /* f5 */ 0xe6b0a7, 0xe4bbb0, 0xe79792, 0xe585bb,
+ /* f9 */ 0xe6a0b7, 0xe6bcbe, 0xe98280, 0xe885b0,
+ /* fd */ 0xe5a696, 0xe791b6,
+
+ /*** Two byte table, leaf: d2xx - offset 0x0107c ***/
+
+ /* a1 */ 0xe69187, 0xe5b0a7, 0xe981a5, 0xe7aa91,
+ /* a5 */ 0xe8b0a3, 0xe5a79a, 0xe592ac, 0xe88880,
+ /* a9 */ 0xe88daf, 0xe8a681, 0xe88080, 0xe6a4b0,
+ /* ad */ 0xe5998e, 0xe880b6, 0xe788b7, 0xe9878e,
+ /* b1 */ 0xe586b6, 0xe4b99f, 0xe9a1b5, 0xe68e96,
+ /* b5 */ 0xe4b89a, 0xe58fb6, 0xe69bb3, 0xe8858b,
+ /* b9 */ 0xe5a49c, 0xe6b6b2, 0xe4b880, 0xe5a3b9,
+ /* bd */ 0xe58cbb, 0xe68f96, 0xe993b1, 0xe4be9d,
+ /* c1 */ 0xe4bc8a, 0xe8a1a3, 0xe9a290, 0xe5a4b7,
+ /* c5 */ 0xe98197, 0xe7a7bb, 0xe4bbaa, 0xe883b0,
+ /* c9 */ 0xe79691, 0xe6b282, 0xe5ae9c, 0xe5a7a8,
+ /* cd */ 0xe5bd9d, 0xe6a485, 0xe89a81, 0xe5809a,
+ /* d1 */ 0xe5b7b2, 0xe4b999, 0xe79fa3, 0xe4bba5,
+ /* d5 */ 0xe889ba, 0xe68a91, 0xe69893, 0xe98291,
+ /* d9 */ 0xe5b1b9, 0xe4babf, 0xe5bdb9, 0xe88786,
+ /* dd */ 0xe980b8, 0xe88284, 0xe796ab, 0xe4baa6,
+ /* e1 */ 0xe8a394, 0xe6848f, 0xe6af85, 0xe5bf86,
+ /* e5 */ 0xe4b989, 0xe79b8a, 0xe6baa2, 0xe8afa3,
+ /* e9 */ 0xe8aeae, 0xe8b08a, 0xe8af91, 0xe5bc82,
+ /* ed */ 0xe7bfbc, 0xe7bf8c, 0xe7bb8e, 0xe88cb5,
+ /* f1 */ 0xe88dab, 0xe59ba0, 0xe6aeb7, 0xe99fb3,
+ /* f5 */ 0xe998b4, 0xe5a7bb, 0xe5909f, 0xe993b6,
+ /* f9 */ 0xe6b7ab, 0xe5af85, 0xe9a5ae, 0xe5b0b9,
+ /* fd */ 0xe5bc95, 0xe99a90,
+
+ /*** Two byte table, leaf: d3xx - offset 0x010da ***/
+
+ /* a1 */ 0xe58db0, 0xe88bb1, 0xe6a8b1, 0xe5a9b4,
+ /* a5 */ 0xe9b9b0, 0xe5ba94, 0xe7bca8, 0xe88eb9,
+ /* a9 */ 0xe890a4, 0xe890a5, 0xe88da7, 0xe89d87,
+ /* ad */ 0xe8bf8e, 0xe8b5a2, 0xe79b88, 0xe5bdb1,
+ /* b1 */ 0xe9a296, 0xe7a1ac, 0xe698a0, 0xe5939f,
+ /* b5 */ 0xe68ba5, 0xe4bda3, 0xe88783, 0xe79788,
+ /* b9 */ 0xe5bab8, 0xe99b8d, 0xe8b88a, 0xe89bb9,
+ /* bd */ 0xe5928f, 0xe6b3b3, 0xe6b68c, 0xe6b0b8,
+ /* c1 */ 0xe681bf, 0xe58b87, 0xe794a8, 0xe5b9bd,
+ /* c5 */ 0xe4bc98, 0xe682a0, 0xe5bfa7, 0xe5b0a4,
+ /* c9 */ 0xe794b1, 0xe982ae, 0xe99380, 0xe78ab9,
+ /* cd */ 0xe6b2b9, 0xe6b8b8, 0xe98589, 0xe69c89,
+ /* d1 */ 0xe58f8b, 0xe58fb3, 0xe4bd91, 0xe98789,
+ /* d5 */ 0xe8afb1, 0xe58f88, 0xe5b9bc, 0xe8bf82,
+ /* d9 */ 0xe6b7a4, 0xe4ba8e, 0xe79b82, 0xe6a686,
+ /* dd */ 0xe8999e, 0xe6849a, 0xe88886, 0xe4bd99,
+ /* e1 */ 0xe4bf9e, 0xe980be, 0xe9b1bc, 0xe68489,
+ /* e5 */ 0xe6b89d, 0xe6b894, 0xe99a85, 0xe4ba88,
+ /* e9 */ 0xe5a8b1, 0xe99ba8, 0xe4b88e, 0xe5b1bf,
+ /* ed */ 0xe7a6b9, 0xe5ae87, 0xe8afad, 0xe7bebd,
+ /* f1 */ 0xe78e89, 0xe59f9f, 0xe88a8b, 0xe98381,
+ /* f5 */ 0xe59081, 0xe98187, 0xe596bb, 0xe5b3aa,
+ /* f9 */ 0xe5bea1, 0xe68488, 0xe6acb2, 0xe78bb1,
+ /* fd */ 0xe882b2, 0xe8aa89,
+
+ /*** Two byte table, leaf: d4xx - offset 0x01138 ***/
+
+ /* a1 */ 0xe6b5b4, 0xe5af93, 0xe8a395, 0xe9a284,
+ /* a5 */ 0xe8b1ab, 0xe9a9ad, 0xe9b8b3, 0xe6b88a,
+ /* a9 */ 0xe586a4, 0xe58583, 0xe59ea3, 0xe8a281,
+ /* ad */ 0xe58e9f, 0xe68fb4, 0xe8be95, 0xe59bad,
+ /* b1 */ 0xe59198, 0xe59c86, 0xe78cbf, 0xe6ba90,
+ /* b5 */ 0xe7bc98, 0xe8bf9c, 0xe88b91, 0xe684bf,
+ /* b9 */ 0xe680a8, 0xe999a2, 0xe69bb0, 0xe7baa6,
+ /* bd */ 0xe8b68a, 0xe8b783, 0xe992a5, 0xe5b2b3,
+ /* c1 */ 0xe7b2a4, 0xe69c88, 0xe682a6, 0xe99885,
+ /* c5 */ 0xe88098, 0xe4ba91, 0xe983a7, 0xe58c80,
+ /* c9 */ 0xe999a8, 0xe58581, 0xe8bf90, 0xe895b4,
+ /* cd */ 0xe9859d, 0xe69995, 0xe99fb5, 0xe5ad95,
+ /* d1 */ 0xe58c9d, 0xe7a0b8, 0xe69d82, 0xe6a0bd,
+ /* d5 */ 0xe59389, 0xe781be, 0xe5aeb0, 0xe8bdbd,
+ /* d9 */ 0xe5868d, 0xe59ca8, 0xe592b1, 0xe69492,
+ /* dd */ 0xe69a82, 0xe8b59e, 0xe8b583, 0xe8848f,
+ /* e1 */ 0xe891ac, 0xe981ad, 0xe7b39f, 0xe587bf,
+ /* e5 */ 0xe897bb, 0xe69ea3, 0xe697a9, 0xe6bea1,
+ /* e9 */ 0xe89aa4, 0xe8ba81, 0xe599aa, 0xe980a0,
+ /* ed */ 0xe79a82, 0xe781b6, 0xe787a5, 0xe8b4a3,
+ /* f1 */ 0xe68ba9, 0xe58899, 0xe6b3bd, 0xe8b4bc,
+ /* f5 */ 0xe6808e, 0xe5a29e, 0xe6868e, 0xe69bbe,
+ /* f9 */ 0xe8b5a0, 0xe6898e, 0xe596b3, 0xe6b8a3,
+ /* fd */ 0xe69cad, 0xe8bda7,
+
+ /*** Two byte table, leaf: d5xx - offset 0x01196 ***/
+
+ /* a1 */ 0xe993a1, 0xe997b8, 0xe79ca8, 0xe6a085,
+ /* a5 */ 0xe6a6a8, 0xe5928b, 0xe4b98d, 0xe782b8,
+ /* a9 */ 0xe8af88, 0xe69198, 0xe6968b, 0xe5ae85,
+ /* ad */ 0xe7aa84, 0xe580ba, 0xe5afa8, 0xe79ebb,
+ /* b1 */ 0xe6afa1, 0xe8a9b9, 0xe7b298, 0xe6b2be,
+ /* b5 */ 0xe79b8f, 0xe696a9, 0xe8be97, 0xe5b4ad,
+ /* b9 */ 0xe5b195, 0xe898b8, 0xe6a088, 0xe58da0,
+ /* bd */ 0xe68898, 0xe7ab99, 0xe6b99b, 0xe7bbbd,
+ /* c1 */ 0xe6a89f, 0xe7aba0, 0xe5bdb0, 0xe6bcb3,
+ /* c5 */ 0xe5bca0, 0xe68e8c, 0xe6b6a8, 0xe69d96,
+ /* c9 */ 0xe4b888, 0xe5b890, 0xe8b4a6, 0xe4bb97,
+ /* cd */ 0xe88380, 0xe798b4, 0xe99a9c, 0xe68b9b,
+ /* d1 */ 0xe698ad, 0xe689be, 0xe6b2bc, 0xe8b5b5,
+ /* d5 */ 0xe785a7, 0xe7bda9, 0xe58586, 0xe88287,
+ /* d9 */ 0xe58fac, 0xe981ae, 0xe68a98, 0xe593b2,
+ /* dd */ 0xe89bb0, 0xe8be99, 0xe88085, 0xe99497,
+ /* e1 */ 0xe89497, 0xe8bf99, 0xe6b599, 0xe78f8d,
+ /* e5 */ 0xe6969f, 0xe79c9f, 0xe79484, 0xe7a0a7,
+ /* e9 */ 0xe887bb, 0xe8b49e, 0xe99288, 0xe4bea6,
+ /* ed */ 0xe69e95, 0xe796b9, 0xe8af8a, 0xe99c87,
+ /* f1 */ 0xe68caf, 0xe99587, 0xe998b5, 0xe892b8,
+ /* f5 */ 0xe68ca3, 0xe79d81, 0xe5be81, 0xe78bb0,
+ /* f9 */ 0xe4ba89, 0xe68094, 0xe695b4, 0xe68baf,
+ /* fd */ 0xe6ada3, 0xe694bf,
+
+ /*** Two byte table, leaf: d6xx - offset 0x011f4 ***/
+
+ /* a1 */ 0xe5b8a7, 0xe79787, 0xe98391, 0xe8af81,
+ /* a5 */ 0xe88a9d, 0xe69e9d, 0xe694af, 0xe590b1,
+ /* a9 */ 0xe89c98, 0xe79fa5, 0xe882a2, 0xe88482,
+ /* ad */ 0xe6b181, 0xe4b98b, 0xe7bb87, 0xe8818c,
+ /* b1 */ 0xe79bb4, 0xe6a48d, 0xe6ae96, 0xe689a7,
+ /* b5 */ 0xe580bc, 0xe4be84, 0xe59d80, 0xe68c87,
+ /* b9 */ 0xe6ada2, 0xe8b6be, 0xe58faa, 0xe697a8,
+ /* bd */ 0xe7bab8, 0xe5bf97, 0xe68c9a, 0xe68eb7,
+ /* c1 */ 0xe887b3, 0xe887b4, 0xe7bdae, 0xe5b89c,
+ /* c5 */ 0xe5b399, 0xe588b6, 0xe699ba, 0xe7a7a9,
+ /* c9 */ 0xe7a89a, 0xe8b4a8, 0xe78299, 0xe79794,
+ /* cd */ 0xe6bb9e, 0xe6b2bb, 0xe7aa92, 0xe4b8ad,
+ /* d1 */ 0xe79b85, 0xe5bfa0, 0xe9929f, 0xe8a1b7,
+ /* d5 */ 0xe7bb88, 0xe7a78d, 0xe882bf, 0xe9878d,
+ /* d9 */ 0xe4bbb2, 0xe4bc97, 0xe8889f, 0xe591a8,
+ /* dd */ 0xe5b79e, 0xe6b4b2, 0xe8af8c, 0xe7b2a5,
+ /* e1 */ 0xe8bdb4, 0xe88298, 0xe5b89a, 0xe59292,
+ /* e5 */ 0xe79ab1, 0xe5ae99, 0xe698bc, 0xe9aaa4,
+ /* e9 */ 0xe78fa0, 0xe6a0aa, 0xe89b9b, 0xe69cb1,
+ /* ed */ 0xe78caa, 0xe8afb8, 0xe8af9b, 0xe98090,
+ /* f1 */ 0xe7abb9, 0xe7839b, 0xe785ae, 0xe68b84,
+ /* f5 */ 0xe79ea9, 0xe598b1, 0xe4b8bb, 0xe89197,
+ /* f9 */ 0xe69fb1, 0xe58aa9, 0xe89b80, 0xe8b4ae,
+ /* fd */ 0xe993b8, 0xe7ad91,
+
+ /*** Two byte table, leaf: d7xx - offset 0x01252 ***/
+
+ /* a1 */ 0xe4bd8f, 0xe6b3a8, 0xe7a59d, 0xe9a9bb,
+ /* a5 */ 0xe68a93, 0xe788aa, 0xe68bbd, 0xe4b893,
+ /* a9 */ 0xe7a096, 0xe8bdac, 0xe692b0, 0xe8b59a,
+ /* ad */ 0xe7af86, 0xe6a1a9, 0xe5ba84, 0xe8a385,
+ /* b1 */ 0xe5a686, 0xe6929e, 0xe5a3ae, 0xe78ab6,
+ /* b5 */ 0xe6a48e, 0xe994a5, 0xe8bfbd, 0xe8b598,
+ /* b9 */ 0xe59da0, 0xe7bc80, 0xe8b086, 0xe58786,
+ /* bd */ 0xe68d89, 0xe68b99, 0xe58d93, 0xe6a18c,
+ /* c1 */ 0xe790a2, 0xe88c81, 0xe9858c, 0xe59584,
+ /* c5 */ 0xe79d80, 0xe781bc, 0xe6b58a, 0xe585b9,
+ /* c9 */ 0xe592a8, 0xe8b584, 0xe5a7bf, 0xe6bb8b,
+ /* cd */ 0xe6b784, 0xe5ad9c, 0xe7b4ab, 0xe4bb94,
+ /* d1 */ 0xe7b1bd, 0xe6bb93, 0xe5ad90, 0xe887aa,
+ /* d5 */ 0xe6b88d, 0xe5ad97, 0xe9ac83, 0xe6a395,
+ /* d9 */ 0xe8b8aa, 0xe5ae97, 0xe7bbbc, 0xe680bb,
+ /* dd */ 0xe7bab5, 0xe982b9, 0xe8b5b0, 0xe5a58f,
+ /* e1 */ 0xe68f8d, 0xe7a79f, 0xe8b6b3, 0xe58d92,
+ /* e5 */ 0xe6978f, 0xe7a596, 0xe8af85, 0xe998bb,
+ /* e9 */ 0xe7bb84, 0xe992bb, 0xe7ba82, 0xe598b4,
+ /* ed */ 0xe98689, 0xe69c80, 0xe7bdaa, 0xe5b08a,
+ /* f1 */ 0xe981b5, 0xe698a8, 0xe5b7a6, 0xe4bd90,
+ /* f5 */ 0xe69f9e, 0xe5819a, 0xe4bd9c, 0xe59d90,
+ /* f9 */ 0xe5baa7, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: d8xx - offset 0x012b0 ***/
+
+ /* a1 */ 0xe4ba8d, 0xe4b88c, 0xe58580, 0xe4b890,
+ /* a5 */ 0xe5bbbf, 0xe58d85, 0xe4b895, 0xe4ba98,
+ /* a9 */ 0xe4b89e, 0xe9acb2, 0xe5adac, 0xe599a9,
+ /* ad */ 0xe4b8a8, 0xe7a6ba, 0xe4b8bf, 0xe58c95,
+ /* b1 */ 0xe4b987, 0xe5a4ad, 0xe788bb, 0xe58dae,
+ /* b5 */ 0xe6b090, 0xe59b9f, 0xe883a4, 0xe9a697,
+ /* b9 */ 0xe6af93, 0xe79dbe, 0xe9bc97, 0xe4b8b6,
+ /* bd */ 0xe4ba9f, 0xe9bc90, 0xe4b99c, 0xe4b9a9,
+ /* c1 */ 0xe4ba93, 0xe88a88, 0xe5ad9b, 0xe595ac,
+ /* c5 */ 0xe5988f, 0xe4bb84, 0xe58e8d, 0xe58e9d,
+ /* c9 */ 0xe58ea3, 0xe58ea5, 0xe58eae, 0xe99da5,
+ /* cd */ 0xe8b59d, 0xe58c9a, 0xe58fb5, 0xe58ca6,
+ /* d1 */ 0xe58cae, 0xe58cbe, 0xe8b59c, 0xe58da6,
+ /* d5 */ 0xe58da3, 0xe58882, 0xe58888, 0xe5888e,
+ /* d9 */ 0xe588ad, 0xe588b3, 0xe588bf, 0xe58980,
+ /* dd */ 0xe5898c, 0xe5899e, 0xe589a1, 0xe5899c,
+ /* e1 */ 0xe892af, 0xe589bd, 0xe58a82, 0xe58a81,
+ /* e5 */ 0xe58a90, 0xe58a93, 0xe58682, 0xe7bd94,
+ /* e9 */ 0xe4babb, 0xe4bb83, 0xe4bb89, 0xe4bb82,
+ /* ed */ 0xe4bba8, 0xe4bba1, 0xe4bbab, 0xe4bb9e,
+ /* f1 */ 0xe4bc9b, 0xe4bbb3, 0xe4bca2, 0xe4bda4,
+ /* f5 */ 0xe4bbb5, 0xe4bca5, 0xe4bca7, 0xe4bc89,
+ /* f9 */ 0xe4bcab, 0xe4bd9e, 0xe4bda7, 0xe694b8,
+ /* fd */ 0xe4bd9a, 0xe4bd9d,
+
+ /*** Two byte table, leaf: d9xx - offset 0x0130e ***/
+
+ /* a1 */ 0xe4bd9f, 0xe4bd97, 0xe4bcb2, 0xe4bcbd,
+ /* a5 */ 0xe4bdb6, 0xe4bdb4, 0xe4be91, 0xe4be89,
+ /* a9 */ 0xe4be83, 0xe4be8f, 0xe4bdbe, 0xe4bdbb,
+ /* ad */ 0xe4beaa, 0xe4bdbc, 0xe4beac, 0xe4be94,
+ /* b1 */ 0xe4bfa6, 0xe4bfa8, 0xe4bfaa, 0xe4bf85,
+ /* b5 */ 0xe4bf9a, 0xe4bfa3, 0xe4bf9c, 0xe4bf91,
+ /* b9 */ 0xe4bf9f, 0xe4bfb8, 0xe580a9, 0xe5818c,
+ /* bd */ 0xe4bfb3, 0xe580ac, 0xe5808f, 0xe580ae,
+ /* c1 */ 0xe580ad, 0xe4bfbe, 0xe5809c, 0xe5808c,
+ /* c5 */ 0xe580a5, 0xe580a8, 0xe581be, 0xe58183,
+ /* c9 */ 0xe58195, 0xe58188, 0xe5818e, 0xe581ac,
+ /* cd */ 0xe581bb, 0xe582a5, 0xe582a7, 0xe582a9,
+ /* d1 */ 0xe582ba, 0xe58396, 0xe58486, 0xe583ad,
+ /* d5 */ 0xe583ac, 0xe583a6, 0xe583ae, 0xe58487,
+ /* d9 */ 0xe5848b, 0xe4bb9d, 0xe6b0bd, 0xe4bd98,
+ /* dd */ 0xe4bda5, 0xe4bf8e, 0xe9bea0, 0xe6b186,
+ /* e1 */ 0xe7b1b4, 0xe585ae, 0xe5b7bd, 0xe9bb89,
+ /* e5 */ 0xe9a698, 0xe58681, 0xe5a494, 0xe58bb9,
+ /* e9 */ 0xe58c8d, 0xe8a887, 0xe58c90, 0xe587ab,
+ /* ed */ 0xe5a499, 0xe58595, 0xe4baa0, 0xe58596,
+ /* f1 */ 0xe4bab3, 0xe8a1ae, 0xe8a2a4, 0xe4bab5,
+ /* f5 */ 0xe88494, 0xe8a392, 0xe7a680, 0xe5acb4,
+ /* f9 */ 0xe8a083, 0xe7beb8, 0xe586ab, 0xe586b1,
+ /* fd */ 0xe586bd, 0xe586bc,
+
+ /*** Two byte table, leaf: daxx - offset 0x0136c ***/
+
+ /* a1 */ 0xe58787, 0xe58696, 0xe586a2, 0xe586a5,
+ /* a5 */ 0xe8aea0, 0xe8aea6, 0xe8aea7, 0xe8aeaa,
+ /* a9 */ 0xe8aeb4, 0xe8aeb5, 0xe8aeb7, 0xe8af82,
+ /* ad */ 0xe8af83, 0xe8af8b, 0xe8af8f, 0xe8af8e,
+ /* b1 */ 0xe8af92, 0xe8af93, 0xe8af94, 0xe8af96,
+ /* b5 */ 0xe8af98, 0xe8af99, 0xe8af9c, 0xe8af9f,
+ /* b9 */ 0xe8afa0, 0xe8afa4, 0xe8afa8, 0xe8afa9,
+ /* bd */ 0xe8afae, 0xe8afb0, 0xe8afb3, 0xe8afb6,
+ /* c1 */ 0xe8afb9, 0xe8afbc, 0xe8afbf, 0xe8b080,
+ /* c5 */ 0xe8b082, 0xe8b084, 0xe8b087, 0xe8b08c,
+ /* c9 */ 0xe8b08f, 0xe8b091, 0xe8b092, 0xe8b094,
+ /* cd */ 0xe8b095, 0xe8b096, 0xe8b099, 0xe8b09b,
+ /* d1 */ 0xe8b098, 0xe8b09d, 0xe8b09f, 0xe8b0a0,
+ /* d5 */ 0xe8b0a1, 0xe8b0a5, 0xe8b0a7, 0xe8b0aa,
+ /* d9 */ 0xe8b0ab, 0xe8b0ae, 0xe8b0af, 0xe8b0b2,
+ /* dd */ 0xe8b0b3, 0xe8b0b5, 0xe8b0b6, 0xe58da9,
+ /* e1 */ 0xe58dba, 0xe9989d, 0xe998a2, 0xe998a1,
+ /* e5 */ 0xe998b1, 0xe998aa, 0xe998bd, 0xe998bc,
+ /* e9 */ 0xe99982, 0xe99989, 0xe99994, 0xe9999f,
+ /* ed */ 0xe999a7, 0xe999ac, 0xe999b2, 0xe999b4,
+ /* f1 */ 0xe99a88, 0xe99a8d, 0xe99a97, 0xe99ab0,
+ /* f5 */ 0xe98297, 0xe9829b, 0xe9829d, 0xe98299,
+ /* f9 */ 0xe982ac, 0xe982a1, 0xe982b4, 0xe982b3,
+ /* fd */ 0xe982b6, 0xe982ba,
+
+ /*** Two byte table, leaf: dbxx - offset 0x013ca ***/
+
+ /* a1 */ 0xe982b8, 0xe982b0, 0xe9838f, 0xe98385,
+ /* a5 */ 0xe982be, 0xe98390, 0xe98384, 0xe98387,
+ /* a9 */ 0xe98393, 0xe983a6, 0xe983a2, 0xe9839c,
+ /* ad */ 0xe98397, 0xe9839b, 0xe983ab, 0xe983af,
+ /* b1 */ 0xe983be, 0xe98484, 0xe984a2, 0xe9849e,
+ /* b5 */ 0xe984a3, 0xe984b1, 0xe984af, 0xe984b9,
+ /* b9 */ 0xe98583, 0xe98586, 0xe5888d, 0xe5a582,
+ /* bd */ 0xe58aa2, 0xe58aac, 0xe58aad, 0xe58abe,
+ /* c1 */ 0xe593bf, 0xe58b90, 0xe58b96, 0xe58bb0,
+ /* c5 */ 0xe58f9f, 0xe787ae, 0xe79f8d, 0xe5bbb4,
+ /* c9 */ 0xe587b5, 0xe587bc, 0xe9acaf, 0xe58eb6,
+ /* cd */ 0xe5bc81, 0xe7959a, 0xe5b7af, 0xe59d8c,
+ /* d1 */ 0xe59ea9, 0xe59ea1, 0xe5a1be, 0xe5a2bc,
+ /* d5 */ 0xe5a385, 0xe5a391, 0xe59ca9, 0xe59cac,
+ /* d9 */ 0xe59caa, 0xe59cb3, 0xe59cb9, 0xe59cae,
+ /* dd */ 0xe59caf, 0xe59d9c, 0xe59cbb, 0xe59d82,
+ /* e1 */ 0xe59da9, 0xe59e85, 0xe59dab, 0xe59e86,
+ /* e5 */ 0xe59dbc, 0xe59dbb, 0xe59da8, 0xe59dad,
+ /* e9 */ 0xe59db6, 0xe59db3, 0xe59ead, 0xe59ea4,
+ /* ed */ 0xe59e8c, 0xe59eb2, 0xe59f8f, 0xe59ea7,
+ /* f1 */ 0xe59eb4, 0xe59e93, 0xe59ea0, 0xe59f95,
+ /* f5 */ 0xe59f98, 0xe59f9a, 0xe59f99, 0xe59f92,
+ /* f9 */ 0xe59eb8, 0xe59fb4, 0xe59faf, 0xe59fb8,
+ /* fd */ 0xe59fa4, 0xe59f9d,
+
+ /*** Two byte table, leaf: dcxx - offset 0x01428 ***/
+
+ /* a1 */ 0xe5a08b, 0xe5a08d, 0xe59fbd, 0xe59fad,
+ /* a5 */ 0xe5a080, 0xe5a09e, 0xe5a099, 0xe5a184,
+ /* a9 */ 0xe5a0a0, 0xe5a1a5, 0xe5a1ac, 0xe5a281,
+ /* ad */ 0xe5a289, 0xe5a29a, 0xe5a280, 0xe9a6a8,
+ /* b1 */ 0xe9bc99, 0xe687bf, 0xe889b9, 0xe889bd,
+ /* b5 */ 0xe889bf, 0xe88a8f, 0xe88a8a, 0xe88aa8,
+ /* b9 */ 0xe88a84, 0xe88a8e, 0xe88a91, 0xe88a97,
+ /* bd */ 0xe88a99, 0xe88aab, 0xe88ab8, 0xe88abe,
+ /* c1 */ 0xe88ab0, 0xe88b88, 0xe88b8a, 0xe88ba3,
+ /* c5 */ 0xe88a98, 0xe88ab7, 0xe88aae, 0xe88b8b,
+ /* c9 */ 0xe88b8c, 0xe88b81, 0xe88aa9, 0xe88ab4,
+ /* cd */ 0xe88aa1, 0xe88aaa, 0xe88a9f, 0xe88b84,
+ /* d1 */ 0xe88b8e, 0xe88aa4, 0xe88ba1, 0xe88c89,
+ /* d5 */ 0xe88bb7, 0xe88ba4, 0xe88c8f, 0xe88c87,
+ /* d9 */ 0xe88b9c, 0xe88bb4, 0xe88b92, 0xe88b98,
+ /* dd */ 0xe88c8c, 0xe88bbb, 0xe88b93, 0xe88c91,
+ /* e1 */ 0xe88c9a, 0xe88c86, 0xe88c94, 0xe88c95,
+ /* e5 */ 0xe88ba0, 0xe88b95, 0xe88c9c, 0xe88d91,
+ /* e9 */ 0xe88d9b, 0xe88d9c, 0xe88c88, 0xe88e92,
+ /* ed */ 0xe88cbc, 0xe88cb4, 0xe88cb1, 0xe88e9b,
+ /* f1 */ 0xe88d9e, 0xe88caf, 0xe88d8f, 0xe88d87,
+ /* f5 */ 0xe88d83, 0xe88d9f, 0xe88d80, 0xe88c97,
+ /* f9 */ 0xe88da0, 0xe88cad, 0xe88cba, 0xe88cb3,
+ /* fd */ 0xe88da6, 0xe88da5,
+
+ /*** Two byte table, leaf: ddxx - offset 0x01486 ***/
+
+ /* a1 */ 0xe88da8, 0xe88c9b, 0xe88da9, 0xe88dac,
+ /* a5 */ 0xe88daa, 0xe88dad, 0xe88dae, 0xe88eb0,
+ /* a9 */ 0xe88db8, 0xe88eb3, 0xe88eb4, 0xe88ea0,
+ /* ad */ 0xe88eaa, 0xe88e93, 0xe88e9c, 0xe88e85,
+ /* b1 */ 0xe88dbc, 0xe88eb6, 0xe88ea9, 0xe88dbd,
+ /* b5 */ 0xe88eb8, 0xe88dbb, 0xe88e98, 0xe88e9e,
+ /* b9 */ 0xe88ea8, 0xe88eba, 0xe88ebc, 0xe88f81,
+ /* bd */ 0xe89081, 0xe88fa5, 0xe88f98, 0xe5a087,
+ /* c1 */ 0xe89098, 0xe8908b, 0xe88f9d, 0xe88fbd,
+ /* c5 */ 0xe88f96, 0xe8909c, 0xe890b8, 0xe89091,
+ /* c9 */ 0xe89086, 0xe88f94, 0xe88f9f, 0xe8908f,
+ /* cd */ 0xe89083, 0xe88fb8, 0xe88fb9, 0xe88faa,
+ /* d1 */ 0xe88f85, 0xe88f80, 0xe890a6, 0xe88fb0,
+ /* d5 */ 0xe88fa1, 0xe8919c, 0xe89191, 0xe8919a,
+ /* d9 */ 0xe89199, 0xe891b3, 0xe89287, 0xe89288,
+ /* dd */ 0xe891ba, 0xe89289, 0xe891b8, 0xe890bc,
+ /* e1 */ 0xe89186, 0xe891a9, 0xe891b6, 0xe8928c,
+ /* e5 */ 0xe8928e, 0xe890b1, 0xe891ad, 0xe89381,
+ /* e9 */ 0xe8938d, 0xe89390, 0xe893a6, 0xe892bd,
+ /* ed */ 0xe89393, 0xe8938a, 0xe892bf, 0xe892ba,
+ /* f1 */ 0xe893a0, 0xe892a1, 0xe892b9, 0xe892b4,
+ /* f5 */ 0xe89297, 0xe893a5, 0xe893a3, 0xe8948c,
+ /* f9 */ 0xe7948d, 0xe894b8, 0xe893b0, 0xe894b9,
+ /* fd */ 0xe8949f, 0xe894ba,
+
+ /*** Two byte table, leaf: dexx - offset 0x014e4 ***/
+
+ /* a1 */ 0xe89596, 0xe894bb, 0xe893bf, 0xe893bc,
+ /* a5 */ 0xe89599, 0xe89588, 0xe895a8, 0xe895a4,
+ /* a9 */ 0xe8959e, 0xe895ba, 0xe79ea2, 0xe89583,
+ /* ad */ 0xe895b2, 0xe895bb, 0xe896a4, 0xe896a8,
+ /* b1 */ 0xe89687, 0xe8968f, 0xe895b9, 0xe896ae,
+ /* b5 */ 0xe8969c, 0xe89685, 0xe896b9, 0xe896b7,
+ /* b9 */ 0xe896b0, 0xe89793, 0xe89781, 0xe8979c,
+ /* bd */ 0xe897bf, 0xe898a7, 0xe89885, 0xe898a9,
+ /* c1 */ 0xe89896, 0xe898bc, 0xe5bbbe, 0xe5bc88,
+ /* c5 */ 0xe5a4bc, 0xe5a581, 0xe880b7, 0xe5a595,
+ /* c9 */ 0xe5a59a, 0xe5a598, 0xe58c8f, 0xe5b0a2,
+ /* cd */ 0xe5b0a5, 0xe5b0ac, 0xe5b0b4, 0xe6898c,
+ /* d1 */ 0xe689aa, 0xe68a9f, 0xe68abb, 0xe68b8a,
+ /* d5 */ 0xe68b9a, 0xe68b97, 0xe68bae, 0xe68ca2,
+ /* d9 */ 0xe68bb6, 0xe68cb9, 0xe68d8b, 0xe68d83,
+ /* dd */ 0xe68ead, 0xe68fb6, 0xe68db1, 0xe68dba,
+ /* e1 */ 0xe68e8e, 0xe68eb4, 0xe68dad, 0xe68eac,
+ /* e5 */ 0xe68e8a, 0xe68da9, 0xe68eae, 0xe68ebc,
+ /* e9 */ 0xe68fb2, 0xe68fb8, 0xe68fa0, 0xe68fbf,
+ /* ed */ 0xe68f84, 0xe68f9e, 0xe68f8e, 0xe69192,
+ /* f1 */ 0xe68f86, 0xe68ebe, 0xe69185, 0xe69181,
+ /* f5 */ 0xe6908b, 0xe6909b, 0xe690a0, 0xe6908c,
+ /* f9 */ 0xe690a6, 0xe690a1, 0xe6919e, 0xe69284,
+ /* fd */ 0xe691ad, 0xe69296,
+
+ /*** Two byte table, leaf: dfxx - offset 0x01542 ***/
+
+ /* a1 */ 0xe691ba, 0xe692b7, 0xe692b8, 0xe69299,
+ /* a5 */ 0xe692ba, 0xe69380, 0xe69390, 0xe69397,
+ /* a9 */ 0xe693a4, 0xe693a2, 0xe69489, 0xe694a5,
+ /* ad */ 0xe694ae, 0xe5bc8b, 0xe5bf92, 0xe79499,
+ /* b1 */ 0xe5bc91, 0xe58d9f, 0xe58fb1, 0xe58fbd,
+ /* b5 */ 0xe58fa9, 0xe58fa8, 0xe58fbb, 0xe59092,
+ /* b9 */ 0xe59096, 0xe59086, 0xe5918b, 0xe59192,
+ /* bd */ 0xe59193, 0xe59194, 0xe59196, 0xe59183,
+ /* c1 */ 0xe590a1, 0xe59197, 0xe59199, 0xe590a3,
+ /* c5 */ 0xe590b2, 0xe59282, 0xe59294, 0xe591b7,
+ /* c9 */ 0xe591b1, 0xe591a4, 0xe5929a, 0xe5929b,
+ /* cd */ 0xe59284, 0xe591b6, 0xe591a6, 0xe5929d,
+ /* d1 */ 0xe59390, 0xe592ad, 0xe59382, 0xe592b4,
+ /* d5 */ 0xe59392, 0xe592a7, 0xe592a6, 0xe59393,
+ /* d9 */ 0xe59394, 0xe591b2, 0xe592a3, 0xe59395,
+ /* dd */ 0xe592bb, 0xe592bf, 0xe5938c, 0xe59399,
+ /* e1 */ 0xe5939a, 0xe5939c, 0xe592a9, 0xe592aa,
+ /* e5 */ 0xe592a4, 0xe5939d, 0xe5938f, 0xe5939e,
+ /* e9 */ 0xe5949b, 0xe593a7, 0xe594a0, 0xe593bd,
+ /* ed */ 0xe59494, 0xe593b3, 0xe594a2, 0xe594a3,
+ /* f1 */ 0xe5948f, 0xe59491, 0xe594a7, 0xe594aa,
+ /* f5 */ 0xe595a7, 0xe5968f, 0xe596b5, 0xe59589,
+ /* f9 */ 0xe595ad, 0xe59581, 0xe59595, 0xe594bf,
+ /* fd */ 0xe59590, 0xe594bc,
+
+ /*** Two byte table, leaf: e0xx - offset 0x015a0 ***/
+
+ /* a1 */ 0xe594b7, 0xe59596, 0xe595b5, 0xe595b6,
+ /* a5 */ 0xe595b7, 0xe594b3, 0xe594b0, 0xe5959c,
+ /* a9 */ 0xe5968b, 0xe59792, 0xe59683, 0xe596b1,
+ /* ad */ 0xe596b9, 0xe59688, 0xe59681, 0xe5969f,
+ /* b1 */ 0xe595be, 0xe59796, 0xe59691, 0xe595bb,
+ /* b5 */ 0xe5979f, 0xe596bd, 0xe596be, 0xe59694,
+ /* b9 */ 0xe59699, 0xe597aa, 0xe597b7, 0xe59789,
+ /* bd */ 0xe5989f, 0xe59791, 0xe597ab, 0xe597ac,
+ /* c1 */ 0xe59794, 0xe597a6, 0xe5979d, 0xe59784,
+ /* c5 */ 0xe597af, 0xe597a5, 0xe597b2, 0xe597b3,
+ /* c9 */ 0xe5978c, 0xe5978d, 0xe597a8, 0xe597b5,
+ /* cd */ 0xe597a4, 0xe8be94, 0xe5989e, 0xe59888,
+ /* d1 */ 0xe5988c, 0xe59881, 0xe598a4, 0xe598a3,
+ /* d5 */ 0xe597be, 0xe59880, 0xe598a7, 0xe598ad,
+ /* d9 */ 0xe59998, 0xe598b9, 0xe59997, 0xe598ac,
+ /* dd */ 0xe5998d, 0xe599a2, 0xe59999, 0xe5999c,
+ /* e1 */ 0xe5998c, 0xe59994, 0xe59a86, 0xe599a4,
+ /* e5 */ 0xe599b1, 0xe599ab, 0xe599bb, 0xe599bc,
+ /* e9 */ 0xe59a85, 0xe59a93, 0xe59aaf, 0xe59b94,
+ /* ed */ 0xe59b97, 0xe59b9d, 0xe59ba1, 0xe59bb5,
+ /* f1 */ 0xe59bab, 0xe59bb9, 0xe59bbf, 0xe59c84,
+ /* f5 */ 0xe59c8a, 0xe59c89, 0xe59c9c, 0xe5b88f,
+ /* f9 */ 0xe5b899, 0xe5b894, 0xe5b891, 0xe5b8b1,
+ /* fd */ 0xe5b8bb, 0xe5b8bc,
+
+ /*** Two byte table, leaf: e1xx - offset 0x015fe ***/
+
+ /* a1 */ 0xe5b8b7, 0xe5b984, 0xe5b994, 0xe5b99b,
+ /* a5 */ 0xe5b99e, 0xe5b9a1, 0xe5b28c, 0xe5b1ba,
+ /* a9 */ 0xe5b28d, 0xe5b290, 0xe5b296, 0xe5b288,
+ /* ad */ 0xe5b298, 0xe5b299, 0xe5b291, 0xe5b29a,
+ /* b1 */ 0xe5b29c, 0xe5b2b5, 0xe5b2a2, 0xe5b2bd,
+ /* b5 */ 0xe5b2ac, 0xe5b2ab, 0xe5b2b1, 0xe5b2a3,
+ /* b9 */ 0xe5b381, 0xe5b2b7, 0xe5b384, 0xe5b392,
+ /* bd */ 0xe5b3a4, 0xe5b38b, 0xe5b3a5, 0xe5b482,
+ /* c1 */ 0xe5b483, 0xe5b4a7, 0xe5b4a6, 0xe5b4ae,
+ /* c5 */ 0xe5b4a4, 0xe5b49e, 0xe5b486, 0xe5b49b,
+ /* c9 */ 0xe5b598, 0xe5b4be, 0xe5b4b4, 0xe5b4bd,
+ /* cd */ 0xe5b5ac, 0xe5b59b, 0xe5b5af, 0xe5b59d,
+ /* d1 */ 0xe5b5ab, 0xe5b58b, 0xe5b58a, 0xe5b5a9,
+ /* d5 */ 0xe5b5b4, 0xe5b682, 0xe5b699, 0xe5b69d,
+ /* d9 */ 0xe8b1b3, 0xe5b6b7, 0xe5b785, 0xe5bdb3,
+ /* dd */ 0xe5bdb7, 0xe5be82, 0xe5be87, 0xe5be89,
+ /* e1 */ 0xe5be8c, 0xe5be95, 0xe5be99, 0xe5be9c,
+ /* e5 */ 0xe5bea8, 0xe5bead, 0xe5beb5, 0xe5bebc,
+ /* e9 */ 0xe8a1a2, 0xe5bda1, 0xe78aad, 0xe78ab0,
+ /* ed */ 0xe78ab4, 0xe78ab7, 0xe78ab8, 0xe78b83,
+ /* f1 */ 0xe78b81, 0xe78b8e, 0xe78b8d, 0xe78b92,
+ /* f5 */ 0xe78ba8, 0xe78baf, 0xe78ba9, 0xe78bb2,
+ /* f9 */ 0xe78bb4, 0xe78bb7, 0xe78c81, 0xe78bb3,
+ /* fd */ 0xe78c83, 0xe78bba,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0165c ***/
+
+ /* a1 */ 0xe78bbb, 0xe78c97, 0xe78c93, 0xe78ca1,
+ /* a5 */ 0xe78c8a, 0xe78c9e, 0xe78c9d, 0xe78c95,
+ /* a9 */ 0xe78ca2, 0xe78cb9, 0xe78ca5, 0xe78cac,
+ /* ad */ 0xe78cb8, 0xe78cb1, 0xe78d90, 0xe78d8d,
+ /* b1 */ 0xe78d97, 0xe78da0, 0xe78dac, 0xe78daf,
+ /* b5 */ 0xe78dbe, 0xe8889b, 0xe5a4a5, 0xe9a3a7,
+ /* b9 */ 0xe5a4a4, 0xe5a482, 0xe9a5a3, 0xe9a5a7,
+ /* bd */ 0xe9a5a8, 0xe9a5a9, 0xe9a5aa, 0xe9a5ab,
+ /* c1 */ 0xe9a5ac, 0xe9a5b4, 0xe9a5b7, 0xe9a5bd,
+ /* c5 */ 0xe9a680, 0xe9a684, 0xe9a687, 0xe9a68a,
+ /* c9 */ 0xe9a68d, 0xe9a690, 0xe9a691, 0xe9a693,
+ /* cd */ 0xe9a694, 0xe9a695, 0xe5ba80, 0xe5ba91,
+ /* d1 */ 0xe5ba8b, 0xe5ba96, 0xe5baa5, 0xe5baa0,
+ /* d5 */ 0xe5bab9, 0xe5bab5, 0xe5babe, 0xe5bab3,
+ /* d9 */ 0xe8b593, 0xe5bb92, 0xe5bb91, 0xe5bb9b,
+ /* dd */ 0xe5bba8, 0xe5bbaa, 0xe886ba, 0xe5bf84,
+ /* e1 */ 0xe5bf89, 0xe5bf96, 0xe5bf8f, 0xe68083,
+ /* e5 */ 0xe5bfae, 0xe68084, 0xe5bfa1, 0xe5bfa4,
+ /* e9 */ 0xe5bfbe, 0xe68085, 0xe68086, 0xe5bfaa,
+ /* ed */ 0xe5bfad, 0xe5bfb8, 0xe68099, 0xe680b5,
+ /* f1 */ 0xe680a6, 0xe6809b, 0xe6808f, 0xe6808d,
+ /* f5 */ 0xe680a9, 0xe680ab, 0xe6808a, 0xe680bf,
+ /* f9 */ 0xe680a1, 0xe681b8, 0xe681b9, 0xe681bb,
+ /* fd */ 0xe681ba, 0xe68182,
+
+ /*** Two byte table, leaf: e3xx - offset 0x016ba ***/
+
+ /* a1 */ 0xe681aa, 0xe681bd, 0xe68296, 0xe6829a,
+ /* a5 */ 0xe682ad, 0xe6829d, 0xe68283, 0xe68292,
+ /* a9 */ 0xe6828c, 0xe6829b, 0xe683ac, 0xe682bb,
+ /* ad */ 0xe682b1, 0xe6839d, 0xe68398, 0xe68386,
+ /* b1 */ 0xe6839a, 0xe682b4, 0xe684a0, 0xe684a6,
+ /* b5 */ 0xe68495, 0xe684a3, 0xe683b4, 0xe68480,
+ /* b9 */ 0xe6848e, 0xe684ab, 0xe6858a, 0xe685b5,
+ /* bd */ 0xe686ac, 0xe68694, 0xe686a7, 0xe686b7,
+ /* c1 */ 0xe68794, 0xe687b5, 0xe5bf9d, 0xe99ab3,
+ /* c5 */ 0xe997a9, 0xe997ab, 0xe997b1, 0xe997b3,
+ /* c9 */ 0xe997b5, 0xe997b6, 0xe997bc, 0xe997be,
+ /* cd */ 0xe99883, 0xe99884, 0xe99886, 0xe99888,
+ /* d1 */ 0xe9988a, 0xe9988b, 0xe9988c, 0xe9988d,
+ /* d5 */ 0xe9988f, 0xe99892, 0xe99895, 0xe99896,
+ /* d9 */ 0xe99897, 0xe99899, 0xe9989a, 0xe4b8ac,
+ /* dd */ 0xe788bf, 0xe68895, 0xe6b0b5, 0xe6b194,
+ /* e1 */ 0xe6b19c, 0xe6b18a, 0xe6b2a3, 0xe6b285,
+ /* e5 */ 0xe6b290, 0xe6b294, 0xe6b28c, 0xe6b1a8,
+ /* e9 */ 0xe6b1a9, 0xe6b1b4, 0xe6b1b6, 0xe6b286,
+ /* ed */ 0xe6b2a9, 0xe6b390, 0xe6b394, 0xe6b2ad,
+ /* f1 */ 0xe6b3b7, 0xe6b3b8, 0xe6b3b1, 0xe6b397,
+ /* f5 */ 0xe6b2b2, 0xe6b3a0, 0xe6b396, 0xe6b3ba,
+ /* f9 */ 0xe6b3ab, 0xe6b3ae, 0xe6b2b1, 0xe6b393,
+ /* fd */ 0xe6b3af, 0xe6b3be,
+
+ /*** Two byte table, leaf: e4xx - offset 0x01718 ***/
+
+ /* a1 */ 0xe6b4b9, 0xe6b4a7, 0xe6b48c, 0xe6b583,
+ /* a5 */ 0xe6b588, 0xe6b487, 0xe6b484, 0xe6b499,
+ /* a9 */ 0xe6b48e, 0xe6b4ab, 0xe6b58d, 0xe6b4ae,
+ /* ad */ 0xe6b4b5, 0xe6b49a, 0xe6b58f, 0xe6b592,
+ /* b1 */ 0xe6b594, 0xe6b4b3, 0xe6b691, 0xe6b5af,
+ /* b5 */ 0xe6b69e, 0xe6b6a0, 0xe6b59e, 0xe6b693,
+ /* b9 */ 0xe6b694, 0xe6b59c, 0xe6b5a0, 0xe6b5bc,
+ /* bd */ 0xe6b5a3, 0xe6b89a, 0xe6b787, 0xe6b785,
+ /* c1 */ 0xe6b79e, 0xe6b88e, 0xe6b6bf, 0xe6b7a0,
+ /* c5 */ 0xe6b891, 0xe6b7a6, 0xe6b79d, 0xe6b799,
+ /* c9 */ 0xe6b896, 0xe6b6ab, 0xe6b88c, 0xe6b6ae,
+ /* cd */ 0xe6b8ab, 0xe6b9ae, 0xe6b98e, 0xe6b9ab,
+ /* d1 */ 0xe6bab2, 0xe6b99f, 0xe6ba86, 0xe6b993,
+ /* d5 */ 0xe6b994, 0xe6b8b2, 0xe6b8a5, 0xe6b984,
+ /* d9 */ 0xe6bb9f, 0xe6bab1, 0xe6ba98, 0xe6bba0,
+ /* dd */ 0xe6bcad, 0xe6bba2, 0xe6baa5, 0xe6baa7,
+ /* e1 */ 0xe6babd, 0xe6babb, 0xe6bab7, 0xe6bb97,
+ /* e5 */ 0xe6bab4, 0xe6bb8f, 0xe6ba8f, 0xe6bb82,
+ /* e9 */ 0xe6ba9f, 0xe6bda2, 0xe6bd86, 0xe6bd87,
+ /* ed */ 0xe6bca4, 0xe6bc95, 0xe6bbb9, 0xe6bcaf,
+ /* f1 */ 0xe6bcb6, 0xe6bd8b, 0xe6bdb4, 0xe6bcaa,
+ /* f5 */ 0xe6bc89, 0xe6bca9, 0xe6be89, 0xe6be8d,
+ /* f9 */ 0xe6be8c, 0xe6bdb8, 0xe6bdb2, 0xe6bdbc,
+ /* fd */ 0xe6bdba, 0xe6bf91,
+
+ /*** Two byte table, leaf: e5xx - offset 0x01776 ***/
+
+ /* a1 */ 0xe6bf89, 0xe6bea7, 0xe6beb9, 0xe6beb6,
+ /* a5 */ 0xe6bf82, 0xe6bfa1, 0xe6bfae, 0xe6bf9e,
+ /* a9 */ 0xe6bfa0, 0xe6bfaf, 0xe7809a, 0xe780a3,
+ /* ad */ 0xe7809b, 0xe780b9, 0xe780b5, 0xe7818f,
+ /* b1 */ 0xe7819e, 0xe5ae80, 0xe5ae84, 0xe5ae95,
+ /* b5 */ 0xe5ae93, 0xe5aea5, 0xe5aeb8, 0xe794af,
+ /* b9 */ 0xe9aa9e, 0xe690b4, 0xe5afa4, 0xe5afae,
+ /* bd */ 0xe8a4b0, 0xe5afb0, 0xe8b987, 0xe8ac87,
+ /* c1 */ 0xe8beb6, 0xe8bf93, 0xe8bf95, 0xe8bfa5,
+ /* c5 */ 0xe8bfae, 0xe8bfa4, 0xe8bfa9, 0xe8bfa6,
+ /* c9 */ 0xe8bfb3, 0xe8bfa8, 0xe98085, 0xe98084,
+ /* cd */ 0xe9808b, 0xe980a6, 0xe98091, 0xe9808d,
+ /* d1 */ 0xe98096, 0xe980a1, 0xe980b5, 0xe980b6,
+ /* d5 */ 0xe980ad, 0xe980af, 0xe98184, 0xe98191,
+ /* d9 */ 0xe98192, 0xe98190, 0xe981a8, 0xe98198,
+ /* dd */ 0xe981a2, 0xe9819b, 0xe69ab9, 0xe981b4,
+ /* e1 */ 0xe981bd, 0xe98282, 0xe98288, 0xe98283,
+ /* e5 */ 0xe9828b, 0xe5bd90, 0xe5bd97, 0xe5bd96,
+ /* e9 */ 0xe5bd98, 0xe5b0bb, 0xe592ab, 0xe5b190,
+ /* ed */ 0xe5b199, 0xe5adb1, 0xe5b1a3, 0xe5b1a6,
+ /* f1 */ 0xe7bebc, 0xe5bcaa, 0xe5bca9, 0xe5bcad,
+ /* f5 */ 0xe889b4, 0xe5bcbc, 0xe9acbb, 0xe5b1ae,
+ /* f9 */ 0xe5a681, 0xe5a683, 0xe5a68d, 0xe5a6a9,
+ /* fd */ 0xe5a6aa, 0xe5a6a3,
+
+ /*** Two byte table, leaf: e6xx - offset 0x017d4 ***/
+
+ /* a1 */ 0xe5a697, 0xe5a78a, 0xe5a6ab, 0xe5a69e,
+ /* a5 */ 0xe5a6a4, 0xe5a792, 0xe5a6b2, 0xe5a6af,
+ /* a9 */ 0xe5a797, 0xe5a6be, 0xe5a885, 0xe5a886,
+ /* ad */ 0xe5a79d, 0xe5a888, 0xe5a7a3, 0xe5a798,
+ /* b1 */ 0xe5a7b9, 0xe5a88c, 0xe5a889, 0xe5a8b2,
+ /* b5 */ 0xe5a8b4, 0xe5a891, 0xe5a8a3, 0xe5a893,
+ /* b9 */ 0xe5a980, 0xe5a9a7, 0xe5a98a, 0xe5a995,
+ /* bd */ 0xe5a8bc, 0xe5a9a2, 0xe5a9b5, 0xe883ac,
+ /* c1 */ 0xe5aaaa, 0xe5aa9b, 0xe5a9b7, 0xe5a9ba,
+ /* c5 */ 0xe5aabe, 0xe5abab, 0xe5aab2, 0xe5ab92,
+ /* c9 */ 0xe5ab94, 0xe5aab8, 0xe5aba0, 0xe5aba3,
+ /* cd */ 0xe5abb1, 0xe5ab96, 0xe5aba6, 0xe5ab98,
+ /* d1 */ 0xe5ab9c, 0xe5ac89, 0xe5ac97, 0xe5ac96,
+ /* d5 */ 0xe5acb2, 0xe5acb7, 0xe5ad80, 0xe5b095,
+ /* d9 */ 0xe5b09c, 0xe5ad9a, 0xe5ada5, 0xe5adb3,
+ /* dd */ 0xe5ad91, 0xe5ad93, 0xe5ada2, 0xe9a9b5,
+ /* e1 */ 0xe9a9b7, 0xe9a9b8, 0xe9a9ba, 0xe9a9bf,
+ /* e5 */ 0xe9a9bd, 0xe9aa80, 0xe9aa81, 0xe9aa85,
+ /* e9 */ 0xe9aa88, 0xe9aa8a, 0xe9aa90, 0xe9aa92,
+ /* ed */ 0xe9aa93, 0xe9aa96, 0xe9aa98, 0xe9aa9b,
+ /* f1 */ 0xe9aa9c, 0xe9aa9d, 0xe9aa9f, 0xe9aaa0,
+ /* f5 */ 0xe9aaa2, 0xe9aaa3, 0xe9aaa5, 0xe9aaa7,
+ /* f9 */ 0xe7ba9f, 0xe7baa1, 0xe7baa3, 0xe7baa5,
+ /* fd */ 0xe7baa8, 0xe7baa9,
+
+ /*** Two byte table, leaf: e7xx - offset 0x01832 ***/
+
+ /* a1 */ 0xe7baad, 0xe7bab0, 0xe7babe, 0xe7bb80,
+ /* a5 */ 0xe7bb81, 0xe7bb82, 0xe7bb89, 0xe7bb8b,
+ /* a9 */ 0xe7bb8c, 0xe7bb90, 0xe7bb94, 0xe7bb97,
+ /* ad */ 0xe7bb9b, 0xe7bba0, 0xe7bba1, 0xe7bba8,
+ /* b1 */ 0xe7bbab, 0xe7bbae, 0xe7bbaf, 0xe7bbb1,
+ /* b5 */ 0xe7bbb2, 0xe7bc8d, 0xe7bbb6, 0xe7bbba,
+ /* b9 */ 0xe7bbbb, 0xe7bbbe, 0xe7bc81, 0xe7bc82,
+ /* bd */ 0xe7bc83, 0xe7bc87, 0xe7bc88, 0xe7bc8b,
+ /* c1 */ 0xe7bc8c, 0xe7bc8f, 0xe7bc91, 0xe7bc92,
+ /* c5 */ 0xe7bc97, 0xe7bc99, 0xe7bc9c, 0xe7bc9b,
+ /* c9 */ 0xe7bc9f, 0xe7bca1, 0xe7bca2, 0xe7bca3,
+ /* cd */ 0xe7bca4, 0xe7bca5, 0xe7bca6, 0xe7bca7,
+ /* d1 */ 0xe7bcaa, 0xe7bcab, 0xe7bcac, 0xe7bcad,
+ /* d5 */ 0xe7bcaf, 0xe7bcb0, 0xe7bcb1, 0xe7bcb2,
+ /* d9 */ 0xe7bcb3, 0xe7bcb5, 0xe5b9ba, 0xe795bf,
+ /* dd */ 0xe5b79b, 0xe794be, 0xe98295, 0xe78e8e,
+ /* e1 */ 0xe78e91, 0xe78eae, 0xe78ea2, 0xe78e9f,
+ /* e5 */ 0xe78f8f, 0xe78f82, 0xe78f91, 0xe78eb7,
+ /* e9 */ 0xe78eb3, 0xe78f80, 0xe78f89, 0xe78f88,
+ /* ed */ 0xe78fa5, 0xe78f99, 0xe9a1bc, 0xe7908a,
+ /* f1 */ 0xe78fa9, 0xe78fa7, 0xe78f9e, 0xe78eba,
+ /* f5 */ 0xe78fb2, 0xe7908f, 0xe790aa, 0xe7919b,
+ /* f9 */ 0xe790a6, 0xe790a5, 0xe790a8, 0xe790b0,
+ /* fd */ 0xe790ae, 0xe790ac,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01890 ***/
+
+ /* a1 */ 0xe7909b, 0xe7909a, 0xe79181, 0xe7919c,
+ /* a5 */ 0xe79197, 0xe79195, 0xe79199, 0xe791b7,
+ /* a9 */ 0xe791ad, 0xe791be, 0xe7929c, 0xe7928e,
+ /* ad */ 0xe79280, 0xe79281, 0xe79287, 0xe7928b,
+ /* b1 */ 0xe7929e, 0xe792a8, 0xe792a9, 0xe79290,
+ /* b5 */ 0xe792a7, 0xe79392, 0xe792ba, 0xe99faa,
+ /* b9 */ 0xe99fab, 0xe99fac, 0xe69d8c, 0xe69d93,
+ /* bd */ 0xe69d9e, 0xe69d88, 0xe69da9, 0xe69ea5,
+ /* c1 */ 0xe69e87, 0xe69daa, 0xe69db3, 0xe69e98,
+ /* c5 */ 0xe69ea7, 0xe69db5, 0xe69ea8, 0xe69e9e,
+ /* c9 */ 0xe69ead, 0xe69e8b, 0xe69db7, 0xe69dbc,
+ /* cd */ 0xe69fb0, 0xe6a089, 0xe69f98, 0xe6a08a,
+ /* d1 */ 0xe69fa9, 0xe69eb0, 0xe6a08c, 0xe69f99,
+ /* d5 */ 0xe69eb5, 0xe69f9a, 0xe69eb3, 0xe69f9d,
+ /* d9 */ 0xe6a080, 0xe69f83, 0xe69eb8, 0xe69fa2,
+ /* dd */ 0xe6a08e, 0xe69f81, 0xe69fbd, 0xe6a0b2,
+ /* e1 */ 0xe6a0b3, 0xe6a1a0, 0xe6a1a1, 0xe6a18e,
+ /* e5 */ 0xe6a1a2, 0xe6a184, 0xe6a1a4, 0xe6a283,
+ /* e9 */ 0xe6a09d, 0xe6a195, 0xe6a1a6, 0xe6a181,
+ /* ed */ 0xe6a1a7, 0xe6a180, 0xe6a0be, 0xe6a18a,
+ /* f1 */ 0xe6a189, 0xe6a0a9, 0xe6a2b5, 0xe6a28f,
+ /* f5 */ 0xe6a1b4, 0xe6a1b7, 0xe6a293, 0xe6a1ab,
+ /* f9 */ 0xe6a382, 0xe6a5ae, 0xe6a3bc, 0xe6a49f,
+ /* fd */ 0xe6a4a0, 0xe6a3b9,
+
+ /*** Two byte table, leaf: e9xx - offset 0x018ee ***/
+
+ /* a1 */ 0xe6a4a4, 0xe6a3b0, 0xe6a48b, 0xe6a481,
+ /* a5 */ 0xe6a597, 0xe6a3a3, 0xe6a490, 0xe6a5b1,
+ /* a9 */ 0xe6a4b9, 0xe6a5a0, 0xe6a582, 0xe6a59d,
+ /* ad */ 0xe6a684, 0xe6a5ab, 0xe6a680, 0xe6a698,
+ /* b1 */ 0xe6a5b8, 0xe6a4b4, 0xe6a78c, 0xe6a687,
+ /* b5 */ 0xe6a688, 0xe6a78e, 0xe6a689, 0xe6a5a6,
+ /* b9 */ 0xe6a5a3, 0xe6a5b9, 0xe6a69b, 0xe6a6a7,
+ /* bd */ 0xe6a6bb, 0xe6a6ab, 0xe6a6ad, 0xe6a794,
+ /* c1 */ 0xe6a6b1, 0xe6a781, 0xe6a78a, 0xe6a79f,
+ /* c5 */ 0xe6a695, 0xe6a7a0, 0xe6a68d, 0xe6a7bf,
+ /* c9 */ 0xe6a8af, 0xe6a7ad, 0xe6a897, 0xe6a898,
+ /* cd */ 0xe6a9a5, 0xe6a7b2, 0xe6a984, 0xe6a8be,
+ /* d1 */ 0xe6aaa0, 0xe6a990, 0xe6a99b, 0xe6a8b5,
+ /* d5 */ 0xe6aa8e, 0xe6a9b9, 0xe6a8bd, 0xe6a8a8,
+ /* d9 */ 0xe6a998, 0xe6a9bc, 0xe6aa91, 0xe6aa90,
+ /* dd */ 0xe6aaa9, 0xe6aa97, 0xe6aaab, 0xe78cb7,
+ /* e1 */ 0xe78d92, 0xe6ae81, 0xe6ae82, 0xe6ae87,
+ /* e5 */ 0xe6ae84, 0xe6ae92, 0xe6ae93, 0xe6ae8d,
+ /* e9 */ 0xe6ae9a, 0xe6ae9b, 0xe6aea1, 0xe6aeaa,
+ /* ed */ 0xe8bdab, 0xe8bdad, 0xe8bdb1, 0xe8bdb2,
+ /* f1 */ 0xe8bdb3, 0xe8bdb5, 0xe8bdb6, 0xe8bdb8,
+ /* f5 */ 0xe8bdb7, 0xe8bdb9, 0xe8bdba, 0xe8bdbc,
+ /* f9 */ 0xe8bdbe, 0xe8be81, 0xe8be82, 0xe8be84,
+ /* fd */ 0xe8be87, 0xe8be8b,
+
+ /*** Two byte table, leaf: eaxx - offset 0x0194c ***/
+
+ /* a1 */ 0xe8be8d, 0xe8be8e, 0xe8be8f, 0xe8be98,
+ /* a5 */ 0xe8be9a, 0xe8bb8e, 0xe6888b, 0xe68897,
+ /* a9 */ 0xe6889b, 0xe6889f, 0xe688a2, 0xe688a1,
+ /* ad */ 0xe688a5, 0xe688a4, 0xe688ac, 0xe887a7,
+ /* b1 */ 0xe793af, 0xe793b4, 0xe793bf, 0xe7948f,
+ /* b5 */ 0xe79491, 0xe79493, 0xe694b4, 0xe697ae,
+ /* b9 */ 0xe697af, 0xe697b0, 0xe6988a, 0xe69899,
+ /* bd */ 0xe69db2, 0xe69883, 0xe69895, 0xe69880,
+ /* c1 */ 0xe78285, 0xe69bb7, 0xe6989d, 0xe698b4,
+ /* c5 */ 0xe698b1, 0xe698b6, 0xe698b5, 0xe88086,
+ /* c9 */ 0xe6999f, 0xe69994, 0xe69981, 0xe6998f,
+ /* cd */ 0xe69996, 0xe699a1, 0xe69997, 0xe699b7,
+ /* d1 */ 0xe69a84, 0xe69a8c, 0xe69aa7, 0xe69a9d,
+ /* d5 */ 0xe69abe, 0xe69b9b, 0xe69b9c, 0xe69ba6,
+ /* d9 */ 0xe69ba9, 0xe8b4b2, 0xe8b4b3, 0xe8b4b6,
+ /* dd */ 0xe8b4bb, 0xe8b4bd, 0xe8b580, 0xe8b585,
+ /* e1 */ 0xe8b586, 0xe8b588, 0xe8b589, 0xe8b587,
+ /* e5 */ 0xe8b58d, 0xe8b595, 0xe8b599, 0xe8a787,
+ /* e9 */ 0xe8a78a, 0xe8a78b, 0xe8a78c, 0xe8a78e,
+ /* ed */ 0xe8a78f, 0xe8a790, 0xe8a791, 0xe789ae,
+ /* f1 */ 0xe78a9f, 0xe7899d, 0xe789a6, 0xe789af,
+ /* f5 */ 0xe789be, 0xe789bf, 0xe78a84, 0xe78a8b,
+ /* f9 */ 0xe78a8d, 0xe78a8f, 0xe78a92, 0xe68c88,
+ /* fd */ 0xe68cb2, 0xe68eb0,
+
+ /*** Two byte table, leaf: ebxx - offset 0x019aa ***/
+
+ /* a1 */ 0xe690bf, 0xe69398, 0xe88084, 0xe6afaa,
+ /* a5 */ 0xe6afb3, 0xe6afbd, 0xe6afb5, 0xe6afb9,
+ /* a9 */ 0xe6b085, 0xe6b087, 0xe6b086, 0xe6b08d,
+ /* ad */ 0xe6b095, 0xe6b098, 0xe6b099, 0xe6b09a,
+ /* b1 */ 0xe6b0a1, 0xe6b0a9, 0xe6b0a4, 0xe6b0aa,
+ /* b5 */ 0xe6b0b2, 0xe694b5, 0xe69595, 0xe695ab,
+ /* b9 */ 0xe7898d, 0xe78992, 0xe78996, 0xe788b0,
+ /* bd */ 0xe899a2, 0xe58896, 0xe8829f, 0xe8829c,
+ /* c1 */ 0xe88293, 0xe882bc, 0xe69c8a, 0xe882bd,
+ /* c5 */ 0xe882b1, 0xe882ab, 0xe882ad, 0xe882b4,
+ /* c9 */ 0xe882b7, 0xe883a7, 0xe883a8, 0xe883a9,
+ /* cd */ 0xe883aa, 0xe8839b, 0xe88382, 0xe88384,
+ /* d1 */ 0xe88399, 0xe8838d, 0xe88397, 0xe69c90,
+ /* d5 */ 0xe8839d, 0xe883ab, 0xe883b1, 0xe883b4,
+ /* d9 */ 0xe883ad, 0xe8848d, 0xe8848e, 0xe883b2,
+ /* dd */ 0xe883bc, 0xe69c95, 0xe88492, 0xe8b19a,
+ /* e1 */ 0xe884b6, 0xe8849e, 0xe884ac, 0xe88498,
+ /* e5 */ 0xe884b2, 0xe88588, 0xe8858c, 0xe88593,
+ /* e9 */ 0xe885b4, 0xe88599, 0xe8859a, 0xe885b1,
+ /* ed */ 0xe885a0, 0xe885a9, 0xe885bc, 0xe885bd,
+ /* f1 */ 0xe885ad, 0xe885a7, 0xe5a18d, 0xe5aab5,
+ /* f5 */ 0xe88688, 0xe88682, 0xe88691, 0xe6bb95,
+ /* f9 */ 0xe886a3, 0xe886aa, 0xe8878c, 0xe69ca6,
+ /* fd */ 0xe8878a, 0xe886bb,
+
+ /*** Two byte table, leaf: ecxx - offset 0x01a08 ***/
+
+ /* a1 */ 0xe88781, 0xe886a6, 0xe6aca4, 0xe6acb7,
+ /* a5 */ 0xe6acb9, 0xe6ad83, 0xe6ad86, 0xe6ad99,
+ /* a9 */ 0xe9a391, 0xe9a392, 0xe9a393, 0xe9a395,
+ /* ad */ 0xe9a399, 0xe9a39a, 0xe6aeb3, 0xe5bd80,
+ /* b1 */ 0xe6af82, 0xe8a7b3, 0xe69690, 0xe9bd91,
+ /* b5 */ 0xe69693, 0xe696bc, 0xe69786, 0xe69784,
+ /* b9 */ 0xe69783, 0xe6978c, 0xe6978e, 0xe69792,
+ /* bd */ 0xe69796, 0xe78280, 0xe7829c, 0xe78296,
+ /* c1 */ 0xe7829d, 0xe782bb, 0xe78380, 0xe782b7,
+ /* c5 */ 0xe782ab, 0xe782b1, 0xe783a8, 0xe7838a,
+ /* c9 */ 0xe78490, 0xe78493, 0xe78496, 0xe784af,
+ /* cd */ 0xe784b1, 0xe785b3, 0xe7859c, 0xe785a8,
+ /* d1 */ 0xe78585, 0xe785b2, 0xe7858a, 0xe785b8,
+ /* d5 */ 0xe785ba, 0xe78698, 0xe786b3, 0xe786b5,
+ /* d9 */ 0xe786a8, 0xe786a0, 0xe787a0, 0xe78794,
+ /* dd */ 0xe787a7, 0xe787b9, 0xe7889d, 0xe788a8,
+ /* e1 */ 0xe781ac, 0xe78498, 0xe785a6, 0xe786b9,
+ /* e5 */ 0xe688be, 0xe688bd, 0xe68983, 0xe68988,
+ /* e9 */ 0xe68989, 0xe7a4bb, 0xe7a580, 0xe7a586,
+ /* ed */ 0xe7a589, 0xe7a59b, 0xe7a59c, 0xe7a593,
+ /* f1 */ 0xe7a59a, 0xe7a5a2, 0xe7a597, 0xe7a5a0,
+ /* f5 */ 0xe7a5af, 0xe7a5a7, 0xe7a5ba, 0xe7a685,
+ /* f9 */ 0xe7a68a, 0xe7a69a, 0xe7a6a7, 0xe7a6b3,
+ /* fd */ 0xe5bf91, 0xe5bf90,
+
+ /*** Two byte table, leaf: edxx - offset 0x01a66 ***/
+
+ /* a1 */ 0xe680bc, 0xe6819d, 0xe6819a, 0xe681a7,
+ /* a5 */ 0xe68181, 0xe68199, 0xe681a3, 0xe682ab,
+ /* a9 */ 0xe68486, 0xe6848d, 0xe6859d, 0xe686a9,
+ /* ad */ 0xe6869d, 0xe6878b, 0xe68791, 0xe68886,
+ /* b1 */ 0xe88280, 0xe881bf, 0xe6b293, 0xe6b3b6,
+ /* b5 */ 0xe6b7bc, 0xe79fb6, 0xe79fb8, 0xe7a080,
+ /* b9 */ 0xe7a089, 0xe7a097, 0xe7a098, 0xe7a091,
+ /* bd */ 0xe696ab, 0xe7a0ad, 0xe7a09c, 0xe7a09d,
+ /* c1 */ 0xe7a0b9, 0xe7a0ba, 0xe7a0bb, 0xe7a09f,
+ /* c5 */ 0xe7a0bc, 0xe7a0a5, 0xe7a0ac, 0xe7a0a3,
+ /* c9 */ 0xe7a0a9, 0xe7a18e, 0xe7a1ad, 0xe7a196,
+ /* cd */ 0xe7a197, 0xe7a0a6, 0xe7a190, 0xe7a187,
+ /* d1 */ 0xe7a18c, 0xe7a1aa, 0xe7a29b, 0xe7a293,
+ /* d5 */ 0xe7a29a, 0xe7a287, 0xe7a29c, 0xe7a2a1,
+ /* d9 */ 0xe7a2a3, 0xe7a2b2, 0xe7a2b9, 0xe7a2a5,
+ /* dd */ 0xe7a394, 0xe7a399, 0xe7a389, 0xe7a3ac,
+ /* e1 */ 0xe7a3b2, 0xe7a485, 0xe7a3b4, 0xe7a493,
+ /* e5 */ 0xe7a4a4, 0xe7a49e, 0xe7a4b4, 0xe9be9b,
+ /* e9 */ 0xe9bbb9, 0xe9bbbb, 0xe9bbbc, 0xe79bb1,
+ /* ed */ 0xe79c84, 0xe79c8d, 0xe79bb9, 0xe79c87,
+ /* f1 */ 0xe79c88, 0xe79c9a, 0xe79ca2, 0xe79c99,
+ /* f5 */ 0xe79cad, 0xe79ca6, 0xe79cb5, 0xe79cb8,
+ /* f9 */ 0xe79d90, 0xe79d91, 0xe79d87, 0xe79d83,
+ /* fd */ 0xe79d9a, 0xe79da8,
+
+ /*** Two byte table, leaf: eexx - offset 0x01ac4 ***/
+
+ /* a1 */ 0xe79da2, 0xe79da5, 0xe79dbf, 0xe79e8d,
+ /* a5 */ 0xe79dbd, 0xe79e80, 0xe79e8c, 0xe79e91,
+ /* a9 */ 0xe79e9f, 0xe79ea0, 0xe79eb0, 0xe79eb5,
+ /* ad */ 0xe79ebd, 0xe794ba, 0xe79580, 0xe7958e,
+ /* b1 */ 0xe7958b, 0xe79588, 0xe7959b, 0xe795b2,
+ /* b5 */ 0xe795b9, 0xe79683, 0xe7bd98, 0xe7bda1,
+ /* b9 */ 0xe7bd9f, 0xe8a988, 0xe7bda8, 0xe7bdb4,
+ /* bd */ 0xe7bdb1, 0xe7bdb9, 0xe7be81, 0xe7bdbe,
+ /* c1 */ 0xe79b8d, 0xe79ba5, 0xe8a0b2, 0xe99285,
+ /* c5 */ 0xe99286, 0xe99287, 0xe9928b, 0xe9928a,
+ /* c9 */ 0xe9928c, 0xe9928d, 0xe9928f, 0xe99290,
+ /* cd */ 0xe99294, 0xe99297, 0xe99295, 0xe9929a,
+ /* d1 */ 0xe9929b, 0xe9929c, 0xe992a3, 0xe992a4,
+ /* d5 */ 0xe992ab, 0xe992aa, 0xe992ad, 0xe992ac,
+ /* d9 */ 0xe992af, 0xe992b0, 0xe992b2, 0xe992b4,
+ /* dd */ 0xe992b6, 0xe992b7, 0xe992b8, 0xe992b9,
+ /* e1 */ 0xe992ba, 0xe992bc, 0xe992bd, 0xe992bf,
+ /* e5 */ 0xe99384, 0xe99388, 0xe99389, 0xe9938a,
+ /* e9 */ 0xe9938b, 0xe9938c, 0xe9938d, 0xe9938e,
+ /* ed */ 0xe99390, 0xe99391, 0xe99392, 0xe99395,
+ /* f1 */ 0xe99396, 0xe99397, 0xe99399, 0xe99398,
+ /* f5 */ 0xe9939b, 0xe9939e, 0xe9939f, 0xe993a0,
+ /* f9 */ 0xe993a2, 0xe993a4, 0xe993a5, 0xe993a7,
+ /* fd */ 0xe993a8, 0xe993aa,
+
+ /*** Two byte table, leaf: efxx - offset 0x01b22 ***/
+
+ /* a1 */ 0xe993a9, 0xe993ab, 0xe993ae, 0xe993af,
+ /* a5 */ 0xe993b3, 0xe993b4, 0xe993b5, 0xe993b7,
+ /* a9 */ 0xe993b9, 0xe993bc, 0xe993bd, 0xe993bf,
+ /* ad */ 0xe99483, 0xe99482, 0xe99486, 0xe99487,
+ /* b1 */ 0xe99489, 0xe9948a, 0xe9948d, 0xe9948e,
+ /* b5 */ 0xe9948f, 0xe99492, 0xe99493, 0xe99494,
+ /* b9 */ 0xe99495, 0xe99496, 0xe99498, 0xe9949b,
+ /* bd */ 0xe9949d, 0xe9949e, 0xe9949f, 0xe994a2,
+ /* c1 */ 0xe994aa, 0xe994ab, 0xe994a9, 0xe994ac,
+ /* c5 */ 0xe994b1, 0xe994b2, 0xe994b4, 0xe994b6,
+ /* c9 */ 0xe994b7, 0xe994b8, 0xe994bc, 0xe994be,
+ /* cd */ 0xe994bf, 0xe99582, 0xe994b5, 0xe99584,
+ /* d1 */ 0xe99585, 0xe99586, 0xe99589, 0xe9958c,
+ /* d5 */ 0xe9958e, 0xe9958f, 0xe99592, 0xe99593,
+ /* d9 */ 0xe99594, 0xe99596, 0xe99597, 0xe99598,
+ /* dd */ 0xe99599, 0xe9959b, 0xe9959e, 0xe9959f,
+ /* e1 */ 0xe9959d, 0xe995a1, 0xe995a2, 0xe995a4,
+ /* e5 */ 0xe995a5, 0xe995a6, 0xe995a7, 0xe995a8,
+ /* e9 */ 0xe995a9, 0xe995aa, 0xe995ab, 0xe995ac,
+ /* ed */ 0xe995af, 0xe995b1, 0xe995b2, 0xe995b3,
+ /* f1 */ 0xe994ba, 0xe79fa7, 0xe79fac, 0xe99b89,
+ /* f5 */ 0xe7a795, 0xe7a7ad, 0xe7a7a3, 0xe7a7ab,
+ /* f9 */ 0xe7a886, 0xe5b587, 0xe7a883, 0xe7a882,
+ /* fd */ 0xe7a89e, 0xe7a894,
+
+ /*** Two byte table, leaf: f0xx - offset 0x01b80 ***/
+
+ /* a1 */ 0xe7a8b9, 0xe7a8b7, 0xe7a991, 0xe9bb8f,
+ /* a5 */ 0xe9a6a5, 0xe7a9b0, 0xe79a88, 0xe79a8e,
+ /* a9 */ 0xe79a93, 0xe79a99, 0xe79aa4, 0xe7939e,
+ /* ad */ 0xe793a0, 0xe794ac, 0xe9b8a0, 0xe9b8a2,
+ /* b1 */ 0xe9b8a8, 0xe9b8a9, 0xe9b8aa, 0xe9b8ab,
+ /* b5 */ 0xe9b8ac, 0xe9b8b2, 0xe9b8b1, 0xe9b8b6,
+ /* b9 */ 0xe9b8b8, 0xe9b8b7, 0xe9b8b9, 0xe9b8ba,
+ /* bd */ 0xe9b8be, 0xe9b981, 0xe9b982, 0xe9b984,
+ /* c1 */ 0xe9b986, 0xe9b987, 0xe9b988, 0xe9b989,
+ /* c5 */ 0xe9b98b, 0xe9b98c, 0xe9b98e, 0xe9b991,
+ /* c9 */ 0xe9b995, 0xe9b997, 0xe9b99a, 0xe9b99b,
+ /* cd */ 0xe9b99c, 0xe9b99e, 0xe9b9a3, 0xe9b9a6,
+ /* d1 */ 0xe9b9a7, 0xe9b9a8, 0xe9b9a9, 0xe9b9aa,
+ /* d5 */ 0xe9b9ab, 0xe9b9ac, 0xe9b9b1, 0xe9b9ad,
+ /* d9 */ 0xe9b9b3, 0xe79692, 0xe79694, 0xe79696,
+ /* dd */ 0xe796a0, 0xe7969d, 0xe796ac, 0xe796a3,
+ /* e1 */ 0xe796b3, 0xe796b4, 0xe796b8, 0xe79784,
+ /* e5 */ 0xe796b1, 0xe796b0, 0xe79783, 0xe79782,
+ /* e9 */ 0xe79796, 0xe7978d, 0xe797a3, 0xe797a8,
+ /* ed */ 0xe797a6, 0xe797a4, 0xe797ab, 0xe797a7,
+ /* f1 */ 0xe79883, 0xe797b1, 0xe797bc, 0xe797bf,
+ /* f5 */ 0xe79890, 0xe79880, 0xe79885, 0xe7988c,
+ /* f9 */ 0xe79897, 0xe7988a, 0xe798a5, 0xe79898,
+ /* fd */ 0xe79895, 0xe79899,
+
+ /*** Two byte table, leaf: f1xx - offset 0x01bde ***/
+
+ /* a1 */ 0xe7989b, 0xe798bc, 0xe798a2, 0xe798a0,
+ /* a5 */ 0xe79980, 0xe798ad, 0xe798b0, 0xe798bf,
+ /* a9 */ 0xe798b5, 0xe79983, 0xe798be, 0xe798b3,
+ /* ad */ 0xe7998d, 0xe7999e, 0xe79994, 0xe7999c,
+ /* b1 */ 0xe79996, 0xe799ab, 0xe799af, 0xe7bf8a,
+ /* b5 */ 0xe7aba6, 0xe7a9b8, 0xe7a9b9, 0xe7aa80,
+ /* b9 */ 0xe7aa86, 0xe7aa88, 0xe7aa95, 0xe7aaa6,
+ /* bd */ 0xe7aaa0, 0xe7aaac, 0xe7aaa8, 0xe7aaad,
+ /* c1 */ 0xe7aab3, 0xe8a1a4, 0xe8a1a9, 0xe8a1b2,
+ /* c5 */ 0xe8a1bd, 0xe8a1bf, 0xe8a282, 0xe8a2a2,
+ /* c9 */ 0xe8a386, 0xe8a2b7, 0xe8a2bc, 0xe8a389,
+ /* cd */ 0xe8a3a2, 0xe8a38e, 0xe8a3a3, 0xe8a3a5,
+ /* d1 */ 0xe8a3b1, 0xe8a49a, 0xe8a3bc, 0xe8a3a8,
+ /* d5 */ 0xe8a3be, 0xe8a3b0, 0xe8a4a1, 0xe8a499,
+ /* d9 */ 0xe8a493, 0xe8a49b, 0xe8a48a, 0xe8a4b4,
+ /* dd */ 0xe8a4ab, 0xe8a4b6, 0xe8a581, 0xe8a5a6,
+ /* e1 */ 0xe8a5bb, 0xe7968b, 0xe883a5, 0xe79ab2,
+ /* e5 */ 0xe79ab4, 0xe79f9c, 0xe88092, 0xe88094,
+ /* e9 */ 0xe88096, 0xe8809c, 0xe880a0, 0xe880a2,
+ /* ed */ 0xe880a5, 0xe880a6, 0xe880a7, 0xe880a9,
+ /* f1 */ 0xe880a8, 0xe880b1, 0xe8808b, 0xe880b5,
+ /* f5 */ 0xe88183, 0xe88186, 0xe8818d, 0xe88192,
+ /* f9 */ 0xe881a9, 0xe881b1, 0xe8a683, 0xe9a1b8,
+ /* fd */ 0xe9a280, 0xe9a283,
+
+ /*** Two byte table, leaf: f2xx - offset 0x01c3c ***/
+
+ /* a1 */ 0xe9a289, 0xe9a28c, 0xe9a28d, 0xe9a28f,
+ /* a5 */ 0xe9a294, 0xe9a29a, 0xe9a29b, 0xe9a29e,
+ /* a9 */ 0xe9a29f, 0xe9a2a1, 0xe9a2a2, 0xe9a2a5,
+ /* ad */ 0xe9a2a6, 0xe8998d, 0xe89994, 0xe899ac,
+ /* b1 */ 0xe899ae, 0xe899bf, 0xe899ba, 0xe899bc,
+ /* b5 */ 0xe899bb, 0xe89aa8, 0xe89a8d, 0xe89a8b,
+ /* b9 */ 0xe89aac, 0xe89a9d, 0xe89aa7, 0xe89aa3,
+ /* bd */ 0xe89aaa, 0xe89a93, 0xe89aa9, 0xe89ab6,
+ /* c1 */ 0xe89b84, 0xe89ab5, 0xe89b8e, 0xe89ab0,
+ /* c5 */ 0xe89aba, 0xe89ab1, 0xe89aaf, 0xe89b89,
+ /* c9 */ 0xe89b8f, 0xe89ab4, 0xe89ba9, 0xe89bb1,
+ /* cd */ 0xe89bb2, 0xe89bad, 0xe89bb3, 0xe89b90,
+ /* d1 */ 0xe89c93, 0xe89b9e, 0xe89bb4, 0xe89b9f,
+ /* d5 */ 0xe89b98, 0xe89b91, 0xe89c83, 0xe89c87,
+ /* d9 */ 0xe89bb8, 0xe89c88, 0xe89c8a, 0xe89c8d,
+ /* dd */ 0xe89c89, 0xe89ca3, 0xe89cbb, 0xe89c9e,
+ /* e1 */ 0xe89ca5, 0xe89cae, 0xe89c9a, 0xe89cbe,
+ /* e5 */ 0xe89d88, 0xe89cb4, 0xe89cb1, 0xe89ca9,
+ /* e9 */ 0xe89cb7, 0xe89cbf, 0xe89e82, 0xe89ca2,
+ /* ed */ 0xe89dbd, 0xe89dbe, 0xe89dbb, 0xe89da0,
+ /* f1 */ 0xe89db0, 0xe89d8c, 0xe89dae, 0xe89e8b,
+ /* f5 */ 0xe89d93, 0xe89da3, 0xe89dbc, 0xe89da4,
+ /* f9 */ 0xe89d99, 0xe89da5, 0xe89e93, 0xe89eaf,
+ /* fd */ 0xe89ea8, 0xe89f92,
+
+ /*** Two byte table, leaf: f3xx - offset 0x01c9a ***/
+
+ /* a1 */ 0xe89f86, 0xe89e88, 0xe89e85, 0xe89ead,
+ /* a5 */ 0xe89e97, 0xe89e83, 0xe89eab, 0xe89fa5,
+ /* a9 */ 0xe89eac, 0xe89eb5, 0xe89eb3, 0xe89f8b,
+ /* ad */ 0xe89f93, 0xe89ebd, 0xe89f91, 0xe89f80,
+ /* b1 */ 0xe89f8a, 0xe89f9b, 0xe89faa, 0xe89fa0,
+ /* b5 */ 0xe89fae, 0xe8a096, 0xe8a093, 0xe89fbe,
+ /* b9 */ 0xe8a08a, 0xe8a09b, 0xe8a0a1, 0xe8a0b9,
+ /* bd */ 0xe8a0bc, 0xe7bcb6, 0xe7bd82, 0xe7bd84,
+ /* c1 */ 0xe7bd85, 0xe88890, 0xe7abba, 0xe7abbd,
+ /* c5 */ 0xe7ac88, 0xe7ac83, 0xe7ac84, 0xe7ac95,
+ /* c9 */ 0xe7ac8a, 0xe7acab, 0xe7ac8f, 0xe7ad87,
+ /* cd */ 0xe7acb8, 0xe7acaa, 0xe7ac99, 0xe7acae,
+ /* d1 */ 0xe7acb1, 0xe7aca0, 0xe7aca5, 0xe7aca4,
+ /* d5 */ 0xe7acb3, 0xe7acbe, 0xe7ac9e, 0xe7ad98,
+ /* d9 */ 0xe7ad9a, 0xe7ad85, 0xe7adb5, 0xe7ad8c,
+ /* dd */ 0xe7ad9d, 0xe7ada0, 0xe7adae, 0xe7adbb,
+ /* e1 */ 0xe7ada2, 0xe7adb2, 0xe7adb1, 0xe7ae90,
+ /* e5 */ 0xe7aea6, 0xe7aea7, 0xe7aeb8, 0xe7aeac,
+ /* e9 */ 0xe7ae9d, 0xe7aea8, 0xe7ae85, 0xe7aeaa,
+ /* ed */ 0xe7ae9c, 0xe7aea2, 0xe7aeab, 0xe7aeb4,
+ /* f1 */ 0xe7af91, 0xe7af81, 0xe7af8c, 0xe7af9d,
+ /* f5 */ 0xe7af9a, 0xe7afa5, 0xe7afa6, 0xe7afaa,
+ /* f9 */ 0xe7b08c, 0xe7afbe, 0xe7afbc, 0xe7b08f,
+ /* fd */ 0xe7b096, 0xe7b08b,
+
+ /*** Two byte table, leaf: f4xx - offset 0x01cf8 ***/
+
+ /* a1 */ 0xe7b09f, 0xe7b0aa, 0xe7b0a6, 0xe7b0b8,
+ /* a5 */ 0xe7b181, 0xe7b180, 0xe887be, 0xe88881,
+ /* a9 */ 0xe88882, 0xe88884, 0xe887ac, 0xe8a184,
+ /* ad */ 0xe888a1, 0xe888a2, 0xe888a3, 0xe888ad,
+ /* b1 */ 0xe888af, 0xe888a8, 0xe888ab, 0xe888b8,
+ /* b5 */ 0xe888bb, 0xe888b3, 0xe888b4, 0xe888be,
+ /* b9 */ 0xe88984, 0xe88989, 0xe8898b, 0xe8898f,
+ /* bd */ 0xe8899a, 0xe8899f, 0xe889a8, 0xe8a1be,
+ /* c1 */ 0xe8a285, 0xe8a288, 0xe8a398, 0xe8a39f,
+ /* c5 */ 0xe8a59e, 0xe7be9d, 0xe7be9f, 0xe7bea7,
+ /* c9 */ 0xe7beaf, 0xe7beb0, 0xe7beb2, 0xe7b1bc,
+ /* cd */ 0xe69589, 0xe7b291, 0xe7b29d, 0xe7b29c,
+ /* d1 */ 0xe7b29e, 0xe7b2a2, 0xe7b2b2, 0xe7b2bc,
+ /* d5 */ 0xe7b2bd, 0xe7b381, 0xe7b387, 0xe7b38c,
+ /* d9 */ 0xe7b38d, 0xe7b388, 0xe7b385, 0xe7b397,
+ /* dd */ 0xe7b3a8, 0xe889ae, 0xe69aa8, 0xe7bebf,
+ /* e1 */ 0xe7bf8e, 0xe7bf95, 0xe7bfa5, 0xe7bfa1,
+ /* e5 */ 0xe7bfa6, 0xe7bfa9, 0xe7bfae, 0xe7bfb3,
+ /* e9 */ 0xe7b3b8, 0xe7b5b7, 0xe7b6a6, 0xe7b6ae,
+ /* ed */ 0xe7b987, 0xe7ba9b, 0xe9bab8, 0xe9bab4,
+ /* f1 */ 0xe8b5b3, 0xe8b684, 0xe8b694, 0xe8b691,
+ /* f5 */ 0xe8b6b1, 0xe8b5a7, 0xe8b5ad, 0xe8b187,
+ /* f9 */ 0xe8b189, 0xe9858a, 0xe98590, 0xe9858e,
+ /* fd */ 0xe9858f, 0xe985a4,
+
+ /*** Two byte table, leaf: f5xx - offset 0x01d56 ***/
+
+ /* a1 */ 0xe985a2, 0xe985a1, 0xe985b0, 0xe985a9,
+ /* a5 */ 0xe985af, 0xe985bd, 0xe985be, 0xe985b2,
+ /* a9 */ 0xe985b4, 0xe985b9, 0xe9868c, 0xe98685,
+ /* ad */ 0xe98690, 0xe9868d, 0xe98691, 0xe986a2,
+ /* b1 */ 0xe986a3, 0xe986aa, 0xe986ad, 0xe986ae,
+ /* b5 */ 0xe986af, 0xe986b5, 0xe986b4, 0xe986ba,
+ /* b9 */ 0xe8b195, 0xe9b9be, 0xe8b6b8, 0xe8b7ab,
+ /* bd */ 0xe8b885, 0xe8b999, 0xe8b9a9, 0xe8b6b5,
+ /* c1 */ 0xe8b6bf, 0xe8b6bc, 0xe8b6ba, 0xe8b784,
+ /* c5 */ 0xe8b796, 0xe8b797, 0xe8b79a, 0xe8b79e,
+ /* c9 */ 0xe8b78e, 0xe8b78f, 0xe8b79b, 0xe8b786,
+ /* cd */ 0xe8b7ac, 0xe8b7b7, 0xe8b7b8, 0xe8b7a3,
+ /* d1 */ 0xe8b7b9, 0xe8b7bb, 0xe8b7a4, 0xe8b889,
+ /* d5 */ 0xe8b7bd, 0xe8b894, 0xe8b89d, 0xe8b89f,
+ /* d9 */ 0xe8b8ac, 0xe8b8ae, 0xe8b8a3, 0xe8b8af,
+ /* dd */ 0xe8b8ba, 0xe8b980, 0xe8b8b9, 0xe8b8b5,
+ /* e1 */ 0xe8b8bd, 0xe8b8b1, 0xe8b989, 0xe8b981,
+ /* e5 */ 0xe8b982, 0xe8b991, 0xe8b992, 0xe8b98a,
+ /* e9 */ 0xe8b9b0, 0xe8b9b6, 0xe8b9bc, 0xe8b9af,
+ /* ed */ 0xe8b9b4, 0xe8ba85, 0xe8ba8f, 0xe8ba94,
+ /* f1 */ 0xe8ba90, 0xe8ba9c, 0xe8ba9e, 0xe8b1b8,
+ /* f5 */ 0xe8b282, 0xe8b28a, 0xe8b285, 0xe8b298,
+ /* f9 */ 0xe8b294, 0xe6969b, 0xe8a796, 0xe8a79e,
+ /* fd */ 0xe8a79a, 0xe8a79c,
+
+ /*** Two byte table, leaf: f6xx - offset 0x01db4 ***/
+
+ /* a1 */ 0xe8a7a5, 0xe8a7ab, 0xe8a7af, 0xe8a8be,
+ /* a5 */ 0xe8aca6, 0xe99d93, 0xe99ba9, 0xe99bb3,
+ /* a9 */ 0xe99baf, 0xe99c86, 0xe99c81, 0xe99c88,
+ /* ad */ 0xe99c8f, 0xe99c8e, 0xe99caa, 0xe99cad,
+ /* b1 */ 0xe99cb0, 0xe99cbe, 0xe9be80, 0xe9be83,
+ /* b5 */ 0xe9be85, 0xe9be86, 0xe9be87, 0xe9be88,
+ /* b9 */ 0xe9be89, 0xe9be8a, 0xe9be8c, 0xe9bbbe,
+ /* bd */ 0xe9bc8b, 0xe9bc8d, 0xe99ab9, 0xe99abc,
+ /* c1 */ 0xe99abd, 0xe99b8e, 0xe99b92, 0xe79ebf,
+ /* c5 */ 0xe99ba0, 0xe98a8e, 0xe98aae, 0xe98b88,
+ /* c9 */ 0xe98cbe, 0xe98daa, 0xe98f8a, 0xe98e8f,
+ /* cd */ 0xe990be, 0xe991ab, 0xe9b1bf, 0xe9b282,
+ /* d1 */ 0xe9b285, 0xe9b286, 0xe9b287, 0xe9b288,
+ /* d5 */ 0xe7a8a3, 0xe9b28b, 0xe9b28e, 0xe9b290,
+ /* d9 */ 0xe9b291, 0xe9b292, 0xe9b294, 0xe9b295,
+ /* dd */ 0xe9b29a, 0xe9b29b, 0xe9b29e, 0xe9b29f,
+ /* e1 */ 0xe9b2a0, 0xe9b2a1, 0xe9b2a2, 0xe9b2a3,
+ /* e5 */ 0xe9b2a5, 0xe9b2a6, 0xe9b2a7, 0xe9b2a8,
+ /* e9 */ 0xe9b2a9, 0xe9b2ab, 0xe9b2ad, 0xe9b2ae,
+ /* ed */ 0xe9b2b0, 0xe9b2b1, 0xe9b2b2, 0xe9b2b3,
+ /* f1 */ 0xe9b2b4, 0xe9b2b5, 0xe9b2b6, 0xe9b2b7,
+ /* f5 */ 0xe9b2ba, 0xe9b2bb, 0xe9b2bc, 0xe9b2bd,
+ /* f9 */ 0xe9b384, 0xe9b385, 0xe9b386, 0xe9b387,
+ /* fd */ 0xe9b38a, 0xe9b38b,
+
+ /*** Two byte table, leaf: f7xx - offset 0x01e12 ***/
+
+ /* a1 */ 0xe9b38c, 0xe9b38d, 0xe9b38e, 0xe9b38f,
+ /* a5 */ 0xe9b390, 0xe9b393, 0xe9b394, 0xe9b395,
+ /* a9 */ 0xe9b397, 0xe9b398, 0xe9b399, 0xe9b39c,
+ /* ad */ 0xe9b39d, 0xe9b39f, 0xe9b3a2, 0xe99dbc,
+ /* b1 */ 0xe99e85, 0xe99e91, 0xe99e92, 0xe99e94,
+ /* b5 */ 0xe99eaf, 0xe99eab, 0xe99ea3, 0xe99eb2,
+ /* b9 */ 0xe99eb4, 0xe9aab1, 0xe9aab0, 0xe9aab7,
+ /* bd */ 0xe9b998, 0xe9aab6, 0xe9aaba, 0xe9aabc,
+ /* c1 */ 0xe9ab81, 0xe9ab80, 0xe9ab85, 0xe9ab82,
+ /* c5 */ 0xe9ab8b, 0xe9ab8c, 0xe9ab91, 0xe9ad85,
+ /* c9 */ 0xe9ad83, 0xe9ad87, 0xe9ad89, 0xe9ad88,
+ /* cd */ 0xe9ad8d, 0xe9ad91, 0xe9a3a8, 0xe9a48d,
+ /* d1 */ 0xe9a4ae, 0xe9a595, 0xe9a594, 0xe9ab9f,
+ /* d5 */ 0xe9aba1, 0xe9aba6, 0xe9abaf, 0xe9abab,
+ /* d9 */ 0xe9abbb, 0xe9abad, 0xe9abb9, 0xe9ac88,
+ /* dd */ 0xe9ac8f, 0xe9ac93, 0xe9ac9f, 0xe9aca3,
+ /* e1 */ 0xe9babd, 0xe9babe, 0xe7b8bb, 0xe9ba82,
+ /* e5 */ 0xe9ba87, 0xe9ba88, 0xe9ba8b, 0xe9ba92,
+ /* e9 */ 0xe98f96, 0xe9ba9d, 0xe9ba9f, 0xe9bb9b,
+ /* ed */ 0xe9bb9c, 0xe9bb9d, 0xe9bba0, 0xe9bb9f,
+ /* f1 */ 0xe9bba2, 0xe9bba9, 0xe9bba7, 0xe9bba5,
+ /* f5 */ 0xe9bbaa, 0xe9bbaf, 0xe9bca2, 0xe9bcac,
+ /* f9 */ 0xe9bcaf, 0xe9bcb9, 0xe9bcb7, 0xe9bcbd,
+ /* fd */ 0xe9bcbe, 0xe9bd84
+};
diff --git a/src/backend/utils/mb/Unicode/euc_jis_2004_to_utf8.map b/src/backend/utils/mb/Unicode/euc_jis_2004_to_utf8.map
new file mode 100644
index 0000000..e0ce072
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc_jis_2004_to_utf8.map
@@ -0,0 +1,3443 @@
+/* src/backend/utils/mb/Unicode/euc_jis_2004_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl */
+
+static const uint32 euc_jis_2004_to_unicode_tree_table[11727];
+
+static const pg_mb_radix_tree euc_jis_2004_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_jis_2004_to_unicode_tree_table,
+
+ 0x0071, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0x9f, /* b1_upper */
+
+ 0x0091, /* offset of table for 2-byte inputs */
+ 0x8e, /* b2_1_lower */
+ 0xfe, /* b2_1_upper */
+ 0xa1, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x23e4, /* offset of table for 3-byte inputs */
+ 0x8f, /* b3_1_lower */
+ 0x8f, /* b3_1_upper */
+ 0xa1, /* b3_2_lower */
+ 0xfe, /* b3_2_upper */
+ 0xa1, /* b3_3_lower */
+ 0xfe, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_jis_2004_to_unicode_tree_table[11727] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 04 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 08 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 0c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 10 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 14 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 18 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 1c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 20 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 24 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 28 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 2c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 30 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 34 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 38 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 3c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 44 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 48 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 4c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 50 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 54 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 58 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 5c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 60 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 64 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 68 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 6c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 70 */ 0x00000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00071 ***/
+
+ /* 80 */ 0x0000c280, 0x0000c281, 0x0000c282, 0x0000c283,
+ /* 84 */ 0x0000c284, 0x0000c285, 0x0000c286, 0x0000c287,
+ /* 88 */ 0x0000c288, 0x0000c289, 0x0000c28a, 0x0000c28b,
+ /* 8c */ 0x0000c28c, 0x0000c28d, 0x0000c28e, 0x0000c28f,
+ /* 90 */ 0x0000c290, 0x0000c291, 0x0000c292, 0x0000c293,
+ /* 94 */ 0x0000c294, 0x0000c295, 0x0000c296, 0x0000c297,
+ /* 98 */ 0x0000c298, 0x0000c299, 0x0000c29a, 0x0000c29b,
+ /* 9c */ 0x0000c29c, 0x0000c29d, 0x0000c29e, 0x0000c29f,
+
+ /*** Two byte table, byte #1: xx - offset 0x00091 ***/
+
+ /* 8e */ 0x00000102, 0x00000000, 0x00000000, 0x00000000,
+ /* 92 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 96 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9a */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9e */ 0x00000000, 0x00000000, 0x00000000, 0x00000160,
+ /* a2 */ 0x000001be, 0x0000021c, 0x0000027a, 0x000002d8,
+ /* a6 */ 0x00000336, 0x00000394, 0x000003f2, 0x00000450,
+ /* aa */ 0x000004ae, 0x0000050c, 0x0000056a, 0x000005c8,
+ /* ae */ 0x00000626, 0x00000684, 0x000006e2, 0x00000740,
+ /* b2 */ 0x0000079e, 0x000007fc, 0x0000085a, 0x000008b8,
+ /* b6 */ 0x00000916, 0x00000974, 0x000009d2, 0x00000a30,
+ /* ba */ 0x00000a8e, 0x00000aec, 0x00000b4a, 0x00000ba8,
+ /* be */ 0x00000c06, 0x00000c64, 0x00000cc2, 0x00000d20,
+ /* c2 */ 0x00000d7e, 0x00000ddc, 0x00000e3a, 0x00000e98,
+ /* c6 */ 0x00000ef6, 0x00000f54, 0x00000fb2, 0x00001010,
+ /* ca */ 0x0000106e, 0x000010cc, 0x0000112a, 0x00001188,
+ /* ce */ 0x000011e6, 0x00001244, 0x000012a2, 0x00001300,
+ /* d2 */ 0x0000135e, 0x000013bc, 0x0000141a, 0x00001478,
+ /* d6 */ 0x000014d6, 0x00001534, 0x00001592, 0x000015f0,
+ /* da */ 0x0000164e, 0x000016ac, 0x0000170a, 0x00001768,
+ /* de */ 0x000017c6, 0x00001824, 0x00001882, 0x000018e0,
+ /* e2 */ 0x0000193e, 0x0000199c, 0x000019fa, 0x00001a58,
+ /* e6 */ 0x00001ab6, 0x00001b14, 0x00001b72, 0x00001bd0,
+ /* ea */ 0x00001c2e, 0x00001c8c, 0x00001cea, 0x00001d48,
+ /* ee */ 0x00001da6, 0x00001e04, 0x00001e62, 0x00001ec0,
+ /* f2 */ 0x00001f1e, 0x00001f7c, 0x00001fda, 0x00002038,
+ /* f6 */ 0x00002096, 0x000020f4, 0x00002152, 0x000021b0,
+ /* fa */ 0x0000220e, 0x0000226c, 0x000022ca, 0x00002328,
+ /* fe */ 0x00002386,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00102 ***/
+
+ /* a1 */ 0x00efbda1, 0x00efbda2, 0x00efbda3, 0x00efbda4,
+ /* a5 */ 0x00efbda5, 0x00efbda6, 0x00efbda7, 0x00efbda8,
+ /* a9 */ 0x00efbda9, 0x00efbdaa, 0x00efbdab, 0x00efbdac,
+ /* ad */ 0x00efbdad, 0x00efbdae, 0x00efbdaf, 0x00efbdb0,
+ /* b1 */ 0x00efbdb1, 0x00efbdb2, 0x00efbdb3, 0x00efbdb4,
+ /* b5 */ 0x00efbdb5, 0x00efbdb6, 0x00efbdb7, 0x00efbdb8,
+ /* b9 */ 0x00efbdb9, 0x00efbdba, 0x00efbdbb, 0x00efbdbc,
+ /* bd */ 0x00efbdbd, 0x00efbdbe, 0x00efbdbf, 0x00efbe80,
+ /* c1 */ 0x00efbe81, 0x00efbe82, 0x00efbe83, 0x00efbe84,
+ /* c5 */ 0x00efbe85, 0x00efbe86, 0x00efbe87, 0x00efbe88,
+ /* c9 */ 0x00efbe89, 0x00efbe8a, 0x00efbe8b, 0x00efbe8c,
+ /* cd */ 0x00efbe8d, 0x00efbe8e, 0x00efbe8f, 0x00efbe90,
+ /* d1 */ 0x00efbe91, 0x00efbe92, 0x00efbe93, 0x00efbe94,
+ /* d5 */ 0x00efbe95, 0x00efbe96, 0x00efbe97, 0x00efbe98,
+ /* d9 */ 0x00efbe99, 0x00efbe9a, 0x00efbe9b, 0x00efbe9c,
+ /* dd */ 0x00efbe9d, 0x00efbe9e, 0x00efbe9f, 0x00000000,
+ /* e1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ed */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* f1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* f5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* f9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00000000, 0x00000000,
+
+ /*** Two byte table, leaf: a1xx - offset 0x00160 ***/
+
+ /* a1 */ 0x00e38080, 0x00e38081, 0x00e38082, 0x00efbc8c,
+ /* a5 */ 0x00efbc8e, 0x00e383bb, 0x00efbc9a, 0x00efbc9b,
+ /* a9 */ 0x00efbc9f, 0x00efbc81, 0x00e3829b, 0x00e3829c,
+ /* ad */ 0x0000c2b4, 0x00efbd80, 0x0000c2a8, 0x00efbcbe,
+ /* b1 */ 0x00e280be, 0x00efbcbf, 0x00e383bd, 0x00e383be,
+ /* b5 */ 0x00e3829d, 0x00e3829e, 0x00e38083, 0x00e4bb9d,
+ /* b9 */ 0x00e38085, 0x00e38086, 0x00e38087, 0x00e383bc,
+ /* bd */ 0x00e28094, 0x00e28090, 0x00efbc8f, 0x00efbcbc,
+ /* c1 */ 0x00e3809c, 0x00e28096, 0x00efbd9c, 0x00e280a6,
+ /* c5 */ 0x00e280a5, 0x00e28098, 0x00e28099, 0x00e2809c,
+ /* c9 */ 0x00e2809d, 0x00efbc88, 0x00efbc89, 0x00e38094,
+ /* cd */ 0x00e38095, 0x00efbcbb, 0x00efbcbd, 0x00efbd9b,
+ /* d1 */ 0x00efbd9d, 0x00e38088, 0x00e38089, 0x00e3808a,
+ /* d5 */ 0x00e3808b, 0x00e3808c, 0x00e3808d, 0x00e3808e,
+ /* d9 */ 0x00e3808f, 0x00e38090, 0x00e38091, 0x00efbc8b,
+ /* dd */ 0x00e28892, 0x0000c2b1, 0x0000c397, 0x0000c3b7,
+ /* e1 */ 0x00efbc9d, 0x00e289a0, 0x00efbc9c, 0x00efbc9e,
+ /* e5 */ 0x00e289a6, 0x00e289a7, 0x00e2889e, 0x00e288b4,
+ /* e9 */ 0x00e29982, 0x00e29980, 0x0000c2b0, 0x00e280b2,
+ /* ed */ 0x00e280b3, 0x00e28483, 0x0000c2a5, 0x00efbc84,
+ /* f1 */ 0x0000c2a2, 0x0000c2a3, 0x00efbc85, 0x00efbc83,
+ /* f5 */ 0x00efbc86, 0x00efbc8a, 0x00efbca0, 0x0000c2a7,
+ /* f9 */ 0x00e29886, 0x00e29885, 0x00e2978b, 0x00e2978f,
+ /* fd */ 0x00e2978e, 0x00e29787,
+
+ /*** Two byte table, leaf: a2xx - offset 0x001be ***/
+
+ /* a1 */ 0x00e29786, 0x00e296a1, 0x00e296a0, 0x00e296b3,
+ /* a5 */ 0x00e296b2, 0x00e296bd, 0x00e296bc, 0x00e280bb,
+ /* a9 */ 0x00e38092, 0x00e28692, 0x00e28690, 0x00e28691,
+ /* ad */ 0x00e28693, 0x00e38093, 0x00efbc87, 0x00efbc82,
+ /* b1 */ 0x00efbc8d, 0x00efbd9e, 0x00e380b3, 0x00e380b4,
+ /* b5 */ 0x00e380b5, 0x00e380bb, 0x00e380bc, 0x00e383bf,
+ /* b9 */ 0x00e3829f, 0x00e28888, 0x00e2888b, 0x00e28a86,
+ /* bd */ 0x00e28a87, 0x00e28a82, 0x00e28a83, 0x00e288aa,
+ /* c1 */ 0x00e288a9, 0x00e28a84, 0x00e28a85, 0x00e28a8a,
+ /* c5 */ 0x00e28a8b, 0x00e28889, 0x00e28885, 0x00e28c85,
+ /* c9 */ 0x00e28c86, 0x00e288a7, 0x00e288a8, 0x0000c2ac,
+ /* cd */ 0x00e28792, 0x00e28794, 0x00e28880, 0x00e28883,
+ /* d1 */ 0x00e28a95, 0x00e28a96, 0x00e28a97, 0x00e288a5,
+ /* d5 */ 0x00e288a6, 0x00efbd9f, 0x00efbda0, 0x00e38098,
+ /* d9 */ 0x00e38099, 0x00e38096, 0x00e38097, 0x00e288a0,
+ /* dd */ 0x00e28aa5, 0x00e28c92, 0x00e28882, 0x00e28887,
+ /* e1 */ 0x00e289a1, 0x00e28992, 0x00e289aa, 0x00e289ab,
+ /* e5 */ 0x00e2889a, 0x00e288bd, 0x00e2889d, 0x00e288b5,
+ /* e9 */ 0x00e288ab, 0x00e288ac, 0x00e289a2, 0x00e28983,
+ /* ed */ 0x00e28985, 0x00e28988, 0x00e289b6, 0x00e289b7,
+ /* f1 */ 0x00e28694, 0x00e284ab, 0x00e280b0, 0x00e299af,
+ /* f5 */ 0x00e299ad, 0x00e299aa, 0x00e280a0, 0x00e280a1,
+ /* f9 */ 0x0000c2b6, 0x00e299ae, 0x00e299ab, 0x00e299ac,
+ /* fd */ 0x00e299a9, 0x00e297af,
+
+ /*** Two byte table, leaf: a3xx - offset 0x0021c ***/
+
+ /* a1 */ 0x00e296b7, 0x00e296b6, 0x00e29781, 0x00e29780,
+ /* a5 */ 0x00e28697, 0x00e28698, 0x00e28696, 0x00e28699,
+ /* a9 */ 0x00e28784, 0x00e287a8, 0x00e287a6, 0x00e287a7,
+ /* ad */ 0x00e287a9, 0x00e2a4b4, 0x00e2a4b5, 0x00efbc90,
+ /* b1 */ 0x00efbc91, 0x00efbc92, 0x00efbc93, 0x00efbc94,
+ /* b5 */ 0x00efbc95, 0x00efbc96, 0x00efbc97, 0x00efbc98,
+ /* b9 */ 0x00efbc99, 0x00e2a6bf, 0x00e29789, 0x00e380bd,
+ /* bd */ 0x00efb986, 0x00efb985, 0x00e297a6, 0x00e280a2,
+ /* c1 */ 0x00efbca1, 0x00efbca2, 0x00efbca3, 0x00efbca4,
+ /* c5 */ 0x00efbca5, 0x00efbca6, 0x00efbca7, 0x00efbca8,
+ /* c9 */ 0x00efbca9, 0x00efbcaa, 0x00efbcab, 0x00efbcac,
+ /* cd */ 0x00efbcad, 0x00efbcae, 0x00efbcaf, 0x00efbcb0,
+ /* d1 */ 0x00efbcb1, 0x00efbcb2, 0x00efbcb3, 0x00efbcb4,
+ /* d5 */ 0x00efbcb5, 0x00efbcb6, 0x00efbcb7, 0x00efbcb8,
+ /* d9 */ 0x00efbcb9, 0x00efbcba, 0x00e28893, 0x00e284b5,
+ /* dd */ 0x00e2848f, 0x00e38f8b, 0x00e28493, 0x00e284a7,
+ /* e1 */ 0x00efbd81, 0x00efbd82, 0x00efbd83, 0x00efbd84,
+ /* e5 */ 0x00efbd85, 0x00efbd86, 0x00efbd87, 0x00efbd88,
+ /* e9 */ 0x00efbd89, 0x00efbd8a, 0x00efbd8b, 0x00efbd8c,
+ /* ed */ 0x00efbd8d, 0x00efbd8e, 0x00efbd8f, 0x00efbd90,
+ /* f1 */ 0x00efbd91, 0x00efbd92, 0x00efbd93, 0x00efbd94,
+ /* f5 */ 0x00efbd95, 0x00efbd96, 0x00efbd97, 0x00efbd98,
+ /* f9 */ 0x00efbd99, 0x00efbd9a, 0x00e382a0, 0x00e28093,
+ /* fd */ 0x00e2a7ba, 0x00e2a7bb,
+
+ /*** Two byte table, leaf: a4xx - offset 0x0027a ***/
+
+ /* a1 */ 0x00e38181, 0x00e38182, 0x00e38183, 0x00e38184,
+ /* a5 */ 0x00e38185, 0x00e38186, 0x00e38187, 0x00e38188,
+ /* a9 */ 0x00e38189, 0x00e3818a, 0x00e3818b, 0x00e3818c,
+ /* ad */ 0x00e3818d, 0x00e3818e, 0x00e3818f, 0x00e38190,
+ /* b1 */ 0x00e38191, 0x00e38192, 0x00e38193, 0x00e38194,
+ /* b5 */ 0x00e38195, 0x00e38196, 0x00e38197, 0x00e38198,
+ /* b9 */ 0x00e38199, 0x00e3819a, 0x00e3819b, 0x00e3819c,
+ /* bd */ 0x00e3819d, 0x00e3819e, 0x00e3819f, 0x00e381a0,
+ /* c1 */ 0x00e381a1, 0x00e381a2, 0x00e381a3, 0x00e381a4,
+ /* c5 */ 0x00e381a5, 0x00e381a6, 0x00e381a7, 0x00e381a8,
+ /* c9 */ 0x00e381a9, 0x00e381aa, 0x00e381ab, 0x00e381ac,
+ /* cd */ 0x00e381ad, 0x00e381ae, 0x00e381af, 0x00e381b0,
+ /* d1 */ 0x00e381b1, 0x00e381b2, 0x00e381b3, 0x00e381b4,
+ /* d5 */ 0x00e381b5, 0x00e381b6, 0x00e381b7, 0x00e381b8,
+ /* d9 */ 0x00e381b9, 0x00e381ba, 0x00e381bb, 0x00e381bc,
+ /* dd */ 0x00e381bd, 0x00e381be, 0x00e381bf, 0x00e38280,
+ /* e1 */ 0x00e38281, 0x00e38282, 0x00e38283, 0x00e38284,
+ /* e5 */ 0x00e38285, 0x00e38286, 0x00e38287, 0x00e38288,
+ /* e9 */ 0x00e38289, 0x00e3828a, 0x00e3828b, 0x00e3828c,
+ /* ed */ 0x00e3828d, 0x00e3828e, 0x00e3828f, 0x00e38290,
+ /* f1 */ 0x00e38291, 0x00e38292, 0x00e38293, 0x00e38294,
+ /* f5 */ 0x00e38295, 0x00e38296, 0x00000000, 0x00000000,
+ /* f9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00000000, 0x00000000,
+
+ /*** Two byte table, leaf: a5xx - offset 0x002d8 ***/
+
+ /* a1 */ 0x00e382a1, 0x00e382a2, 0x00e382a3, 0x00e382a4,
+ /* a5 */ 0x00e382a5, 0x00e382a6, 0x00e382a7, 0x00e382a8,
+ /* a9 */ 0x00e382a9, 0x00e382aa, 0x00e382ab, 0x00e382ac,
+ /* ad */ 0x00e382ad, 0x00e382ae, 0x00e382af, 0x00e382b0,
+ /* b1 */ 0x00e382b1, 0x00e382b2, 0x00e382b3, 0x00e382b4,
+ /* b5 */ 0x00e382b5, 0x00e382b6, 0x00e382b7, 0x00e382b8,
+ /* b9 */ 0x00e382b9, 0x00e382ba, 0x00e382bb, 0x00e382bc,
+ /* bd */ 0x00e382bd, 0x00e382be, 0x00e382bf, 0x00e38380,
+ /* c1 */ 0x00e38381, 0x00e38382, 0x00e38383, 0x00e38384,
+ /* c5 */ 0x00e38385, 0x00e38386, 0x00e38387, 0x00e38388,
+ /* c9 */ 0x00e38389, 0x00e3838a, 0x00e3838b, 0x00e3838c,
+ /* cd */ 0x00e3838d, 0x00e3838e, 0x00e3838f, 0x00e38390,
+ /* d1 */ 0x00e38391, 0x00e38392, 0x00e38393, 0x00e38394,
+ /* d5 */ 0x00e38395, 0x00e38396, 0x00e38397, 0x00e38398,
+ /* d9 */ 0x00e38399, 0x00e3839a, 0x00e3839b, 0x00e3839c,
+ /* dd */ 0x00e3839d, 0x00e3839e, 0x00e3839f, 0x00e383a0,
+ /* e1 */ 0x00e383a1, 0x00e383a2, 0x00e383a3, 0x00e383a4,
+ /* e5 */ 0x00e383a5, 0x00e383a6, 0x00e383a7, 0x00e383a8,
+ /* e9 */ 0x00e383a9, 0x00e383aa, 0x00e383ab, 0x00e383ac,
+ /* ed */ 0x00e383ad, 0x00e383ae, 0x00e383af, 0x00e383b0,
+ /* f1 */ 0x00e383b1, 0x00e383b2, 0x00e383b3, 0x00e383b4,
+ /* f5 */ 0x00e383b5, 0x00e383b6, 0x00000000, 0x00000000,
+ /* f9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00000000, 0x00000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x00336 ***/
+
+ /* a1 */ 0x0000ce91, 0x0000ce92, 0x0000ce93, 0x0000ce94,
+ /* a5 */ 0x0000ce95, 0x0000ce96, 0x0000ce97, 0x0000ce98,
+ /* a9 */ 0x0000ce99, 0x0000ce9a, 0x0000ce9b, 0x0000ce9c,
+ /* ad */ 0x0000ce9d, 0x0000ce9e, 0x0000ce9f, 0x0000cea0,
+ /* b1 */ 0x0000cea1, 0x0000cea3, 0x0000cea4, 0x0000cea5,
+ /* b5 */ 0x0000cea6, 0x0000cea7, 0x0000cea8, 0x0000cea9,
+ /* b9 */ 0x00e299a4, 0x00e299a0, 0x00e299a2, 0x00e299a6,
+ /* bd */ 0x00e299a1, 0x00e299a5, 0x00e299a7, 0x00e299a3,
+ /* c1 */ 0x0000ceb1, 0x0000ceb2, 0x0000ceb3, 0x0000ceb4,
+ /* c5 */ 0x0000ceb5, 0x0000ceb6, 0x0000ceb7, 0x0000ceb8,
+ /* c9 */ 0x0000ceb9, 0x0000ceba, 0x0000cebb, 0x0000cebc,
+ /* cd */ 0x0000cebd, 0x0000cebe, 0x0000cebf, 0x0000cf80,
+ /* d1 */ 0x0000cf81, 0x0000cf83, 0x0000cf84, 0x0000cf85,
+ /* d5 */ 0x0000cf86, 0x0000cf87, 0x0000cf88, 0x0000cf89,
+ /* d9 */ 0x0000cf82, 0x00e293b5, 0x00e293b6, 0x00e293b7,
+ /* dd */ 0x00e293b8, 0x00e293b9, 0x00e293ba, 0x00e293bb,
+ /* e1 */ 0x00e293bc, 0x00e293bd, 0x00e293be, 0x00e29896,
+ /* e5 */ 0x00e29897, 0x00e380a0, 0x00e2988e, 0x00e29880,
+ /* e9 */ 0x00e29881, 0x00e29882, 0x00e29883, 0x00e299a8,
+ /* ed */ 0x00e296b1, 0x00e387b0, 0x00e387b1, 0x00e387b2,
+ /* f1 */ 0x00e387b3, 0x00e387b4, 0x00e387b5, 0x00e387b6,
+ /* f5 */ 0x00e387b7, 0x00e387b8, 0x00e387b9, 0x00000000,
+ /* f9 */ 0x00e387ba, 0x00e387bb, 0x00e387bc, 0x00e387bd,
+ /* fd */ 0x00e387be, 0x00e387bf,
+
+ /*** Two byte table, leaf: a7xx - offset 0x00394 ***/
+
+ /* a1 */ 0x0000d090, 0x0000d091, 0x0000d092, 0x0000d093,
+ /* a5 */ 0x0000d094, 0x0000d095, 0x0000d081, 0x0000d096,
+ /* a9 */ 0x0000d097, 0x0000d098, 0x0000d099, 0x0000d09a,
+ /* ad */ 0x0000d09b, 0x0000d09c, 0x0000d09d, 0x0000d09e,
+ /* b1 */ 0x0000d09f, 0x0000d0a0, 0x0000d0a1, 0x0000d0a2,
+ /* b5 */ 0x0000d0a3, 0x0000d0a4, 0x0000d0a5, 0x0000d0a6,
+ /* b9 */ 0x0000d0a7, 0x0000d0a8, 0x0000d0a9, 0x0000d0aa,
+ /* bd */ 0x0000d0ab, 0x0000d0ac, 0x0000d0ad, 0x0000d0ae,
+ /* c1 */ 0x0000d0af, 0x00e28ebe, 0x00e28ebf, 0x00e28f80,
+ /* c5 */ 0x00e28f81, 0x00e28f82, 0x00e28f83, 0x00e28f84,
+ /* c9 */ 0x00e28f85, 0x00e28f86, 0x00e28f87, 0x00e28f88,
+ /* cd */ 0x00e28f89, 0x00e28f8a, 0x00e28f8b, 0x00e28f8c,
+ /* d1 */ 0x0000d0b0, 0x0000d0b1, 0x0000d0b2, 0x0000d0b3,
+ /* d5 */ 0x0000d0b4, 0x0000d0b5, 0x0000d191, 0x0000d0b6,
+ /* d9 */ 0x0000d0b7, 0x0000d0b8, 0x0000d0b9, 0x0000d0ba,
+ /* dd */ 0x0000d0bb, 0x0000d0bc, 0x0000d0bd, 0x0000d0be,
+ /* e1 */ 0x0000d0bf, 0x0000d180, 0x0000d181, 0x0000d182,
+ /* e5 */ 0x0000d183, 0x0000d184, 0x0000d185, 0x0000d186,
+ /* e9 */ 0x0000d187, 0x0000d188, 0x0000d189, 0x0000d18a,
+ /* ed */ 0x0000d18b, 0x0000d18c, 0x0000d18d, 0x0000d18e,
+ /* f1 */ 0x0000d18f, 0x00e383b7, 0x00e383b8, 0x00e383b9,
+ /* f5 */ 0x00e383ba, 0x00e28b9a, 0x00e28b9b, 0x00e28593,
+ /* f9 */ 0x00e28594, 0x00e28595, 0x00e29c93, 0x00e28c98,
+ /* fd */ 0x00e290a3, 0x00e28f8e,
+
+ /*** Two byte table, leaf: a8xx - offset 0x003f2 ***/
+
+ /* a1 */ 0x00e29480, 0x00e29482, 0x00e2948c, 0x00e29490,
+ /* a5 */ 0x00e29498, 0x00e29494, 0x00e2949c, 0x00e294ac,
+ /* a9 */ 0x00e294a4, 0x00e294b4, 0x00e294bc, 0x00e29481,
+ /* ad */ 0x00e29483, 0x00e2948f, 0x00e29493, 0x00e2949b,
+ /* b1 */ 0x00e29497, 0x00e294a3, 0x00e294b3, 0x00e294ab,
+ /* b5 */ 0x00e294bb, 0x00e2958b, 0x00e294a0, 0x00e294af,
+ /* b9 */ 0x00e294a8, 0x00e294b7, 0x00e294bf, 0x00e2949d,
+ /* bd */ 0x00e294b0, 0x00e294a5, 0x00e294b8, 0x00e29582,
+ /* c1 */ 0x00e38991, 0x00e38992, 0x00e38993, 0x00e38994,
+ /* c5 */ 0x00e38995, 0x00e38996, 0x00e38997, 0x00e38998,
+ /* c9 */ 0x00e38999, 0x00e3899a, 0x00e3899b, 0x00e3899c,
+ /* cd */ 0x00e3899d, 0x00e3899e, 0x00e3899f, 0x00e38ab1,
+ /* d1 */ 0x00e38ab2, 0x00e38ab3, 0x00e38ab4, 0x00e38ab5,
+ /* d5 */ 0x00e38ab6, 0x00e38ab7, 0x00e38ab8, 0x00e38ab9,
+ /* d9 */ 0x00e38aba, 0x00e38abb, 0x00e38abc, 0x00e38abd,
+ /* dd */ 0x00e38abe, 0x00e38abf, 0x00000000, 0x00000000,
+ /* e1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e5 */ 0x00000000, 0x00000000, 0x00e29790, 0x00e29791,
+ /* e9 */ 0x00e29792, 0x00e29793, 0x00e280bc, 0x00e28187,
+ /* ed */ 0x00e28188, 0x00e28189, 0x0000c78d, 0x0000c78e,
+ /* f1 */ 0x0000c790, 0x00e1b8be, 0x00e1b8bf, 0x0000c7b8,
+ /* f5 */ 0x0000c7b9, 0x0000c791, 0x0000c792, 0x0000c794,
+ /* f9 */ 0x0000c796, 0x0000c798, 0x0000c79a, 0x0000c79c,
+ /* fd */ 0x00000000, 0x00000000,
+
+ /*** Two byte table, leaf: a9xx - offset 0x00450 ***/
+
+ /* a1 */ 0x00e282ac, 0x0000c2a0, 0x0000c2a1, 0x0000c2a4,
+ /* a5 */ 0x0000c2a6, 0x0000c2a9, 0x0000c2aa, 0x0000c2ab,
+ /* a9 */ 0x0000c2ad, 0x0000c2ae, 0x0000c2af, 0x0000c2b2,
+ /* ad */ 0x0000c2b3, 0x0000c2b7, 0x0000c2b8, 0x0000c2b9,
+ /* b1 */ 0x0000c2ba, 0x0000c2bb, 0x0000c2bc, 0x0000c2bd,
+ /* b5 */ 0x0000c2be, 0x0000c2bf, 0x0000c380, 0x0000c381,
+ /* b9 */ 0x0000c382, 0x0000c383, 0x0000c384, 0x0000c385,
+ /* bd */ 0x0000c386, 0x0000c387, 0x0000c388, 0x0000c389,
+ /* c1 */ 0x0000c38a, 0x0000c38b, 0x0000c38c, 0x0000c38d,
+ /* c5 */ 0x0000c38e, 0x0000c38f, 0x0000c390, 0x0000c391,
+ /* c9 */ 0x0000c392, 0x0000c393, 0x0000c394, 0x0000c395,
+ /* cd */ 0x0000c396, 0x0000c398, 0x0000c399, 0x0000c39a,
+ /* d1 */ 0x0000c39b, 0x0000c39c, 0x0000c39d, 0x0000c39e,
+ /* d5 */ 0x0000c39f, 0x0000c3a0, 0x0000c3a1, 0x0000c3a2,
+ /* d9 */ 0x0000c3a3, 0x0000c3a4, 0x0000c3a5, 0x0000c3a6,
+ /* dd */ 0x0000c3a7, 0x0000c3a8, 0x0000c3a9, 0x0000c3aa,
+ /* e1 */ 0x0000c3ab, 0x0000c3ac, 0x0000c3ad, 0x0000c3ae,
+ /* e5 */ 0x0000c3af, 0x0000c3b0, 0x0000c3b1, 0x0000c3b2,
+ /* e9 */ 0x0000c3b3, 0x0000c3b4, 0x0000c3b5, 0x0000c3b6,
+ /* ed */ 0x0000c3b8, 0x0000c3b9, 0x0000c3ba, 0x0000c3bb,
+ /* f1 */ 0x0000c3bc, 0x0000c3bd, 0x0000c3be, 0x0000c3bf,
+ /* f5 */ 0x0000c480, 0x0000c4aa, 0x0000c5aa, 0x0000c492,
+ /* f9 */ 0x0000c58c, 0x0000c481, 0x0000c4ab, 0x0000c5ab,
+ /* fd */ 0x0000c493, 0x0000c58d,
+
+ /*** Two byte table, leaf: aaxx - offset 0x004ae ***/
+
+ /* a1 */ 0x0000c484, 0x0000cb98, 0x0000c581, 0x0000c4bd,
+ /* a5 */ 0x0000c59a, 0x0000c5a0, 0x0000c59e, 0x0000c5a4,
+ /* a9 */ 0x0000c5b9, 0x0000c5bd, 0x0000c5bb, 0x0000c485,
+ /* ad */ 0x0000cb9b, 0x0000c582, 0x0000c4be, 0x0000c59b,
+ /* b1 */ 0x0000cb87, 0x0000c5a1, 0x0000c59f, 0x0000c5a5,
+ /* b5 */ 0x0000c5ba, 0x0000cb9d, 0x0000c5be, 0x0000c5bc,
+ /* b9 */ 0x0000c594, 0x0000c482, 0x0000c4b9, 0x0000c486,
+ /* bd */ 0x0000c48c, 0x0000c498, 0x0000c49a, 0x0000c48e,
+ /* c1 */ 0x0000c583, 0x0000c587, 0x0000c590, 0x0000c598,
+ /* c5 */ 0x0000c5ae, 0x0000c5b0, 0x0000c5a2, 0x0000c595,
+ /* c9 */ 0x0000c483, 0x0000c4ba, 0x0000c487, 0x0000c48d,
+ /* cd */ 0x0000c499, 0x0000c49b, 0x0000c48f, 0x0000c491,
+ /* d1 */ 0x0000c584, 0x0000c588, 0x0000c591, 0x0000c599,
+ /* d5 */ 0x0000c5af, 0x0000c5b1, 0x0000c5a3, 0x0000cb99,
+ /* d9 */ 0x0000c488, 0x0000c49c, 0x0000c4a4, 0x0000c4b4,
+ /* dd */ 0x0000c59c, 0x0000c5ac, 0x0000c489, 0x0000c49d,
+ /* e1 */ 0x0000c4a5, 0x0000c4b5, 0x0000c59d, 0x0000c5ad,
+ /* e5 */ 0x0000c9b1, 0x0000ca8b, 0x0000c9be, 0x0000ca83,
+ /* e9 */ 0x0000ca92, 0x0000c9ac, 0x0000c9ae, 0x0000c9b9,
+ /* ed */ 0x0000ca88, 0x0000c996, 0x0000c9b3, 0x0000c9bd,
+ /* f1 */ 0x0000ca82, 0x0000ca90, 0x0000c9bb, 0x0000c9ad,
+ /* f5 */ 0x0000c99f, 0x0000c9b2, 0x0000ca9d, 0x0000ca8e,
+ /* f9 */ 0x0000c9a1, 0x0000c58b, 0x0000c9b0, 0x0000ca81,
+ /* fd */ 0x0000c4a7, 0x0000ca95,
+
+ /*** Two byte table, leaf: abxx - offset 0x0050c ***/
+
+ /* a1 */ 0x0000ca94, 0x0000c9a6, 0x0000ca98, 0x0000c782,
+ /* a5 */ 0x0000c993, 0x0000c997, 0x0000ca84, 0x0000c9a0,
+ /* a9 */ 0x0000c693, 0x0000c593, 0x0000c592, 0x0000c9a8,
+ /* ad */ 0x0000ca89, 0x0000c998, 0x0000c9b5, 0x0000c999,
+ /* b1 */ 0x0000c99c, 0x0000c99e, 0x0000c990, 0x0000c9af,
+ /* b5 */ 0x0000ca8a, 0x0000c9a4, 0x0000ca8c, 0x0000c994,
+ /* b9 */ 0x0000c991, 0x0000c992, 0x0000ca8d, 0x0000c9a5,
+ /* bd */ 0x0000caa2, 0x0000caa1, 0x0000c995, 0x0000ca91,
+ /* c1 */ 0x0000c9ba, 0x0000c9a7, 0x0000c99a, 0x00000000,
+ /* c5 */ 0x0000c7bd, 0x00e1bdb0, 0x00e1bdb1, 0x00000000,
+ /* c9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* cd */ 0x00000000, 0x00000000, 0x00000000, 0x00e1bdb2,
+ /* d1 */ 0x00e1bdb3, 0x0000cda1, 0x0000cb88, 0x0000cb8c,
+ /* d5 */ 0x0000cb90, 0x0000cb91, 0x0000cc86, 0x00e280bf,
+ /* d9 */ 0x0000cc8b, 0x0000cc81, 0x0000cc84, 0x0000cc80,
+ /* dd */ 0x0000cc8f, 0x0000cc8c, 0x0000cc82, 0x0000cba5,
+ /* e1 */ 0x0000cba6, 0x0000cba7, 0x0000cba8, 0x0000cba9,
+ /* e5 */ 0x00000000, 0x00000000, 0x0000cca5, 0x0000ccac,
+ /* e9 */ 0x0000ccb9, 0x0000cc9c, 0x0000cc9f, 0x0000cca0,
+ /* ed */ 0x0000cc88, 0x0000ccbd, 0x0000cca9, 0x0000ccaf,
+ /* f1 */ 0x0000cb9e, 0x0000cca4, 0x0000ccb0, 0x0000ccbc,
+ /* f5 */ 0x0000ccb4, 0x0000cc9d, 0x0000cc9e, 0x0000cc98,
+ /* f9 */ 0x0000cc99, 0x0000ccaa, 0x0000ccba, 0x0000ccbb,
+ /* fd */ 0x0000cc83, 0x0000cc9a,
+
+ /*** Two byte table, leaf: acxx - offset 0x0056a ***/
+
+ /* a1 */ 0x00e29db6, 0x00e29db7, 0x00e29db8, 0x00e29db9,
+ /* a5 */ 0x00e29dba, 0x00e29dbb, 0x00e29dbc, 0x00e29dbd,
+ /* a9 */ 0x00e29dbe, 0x00e29dbf, 0x00e293ab, 0x00e293ac,
+ /* ad */ 0x00e293ad, 0x00e293ae, 0x00e293af, 0x00e293b0,
+ /* b1 */ 0x00e293b1, 0x00e293b2, 0x00e293b3, 0x00e293b4,
+ /* b5 */ 0x00e285b0, 0x00e285b1, 0x00e285b2, 0x00e285b3,
+ /* b9 */ 0x00e285b4, 0x00e285b5, 0x00e285b6, 0x00e285b7,
+ /* bd */ 0x00e285b8, 0x00e285b9, 0x00e285ba, 0x00e285bb,
+ /* c1 */ 0x00e29390, 0x00e29391, 0x00e29392, 0x00e29393,
+ /* c5 */ 0x00e29394, 0x00e29395, 0x00e29396, 0x00e29397,
+ /* c9 */ 0x00e29398, 0x00e29399, 0x00e2939a, 0x00e2939b,
+ /* cd */ 0x00e2939c, 0x00e2939d, 0x00e2939e, 0x00e2939f,
+ /* d1 */ 0x00e293a0, 0x00e293a1, 0x00e293a2, 0x00e293a3,
+ /* d5 */ 0x00e293a4, 0x00e293a5, 0x00e293a6, 0x00e293a7,
+ /* d9 */ 0x00e293a8, 0x00e293a9, 0x00e38b90, 0x00e38b91,
+ /* dd */ 0x00e38b92, 0x00e38b93, 0x00e38b94, 0x00e38b95,
+ /* e1 */ 0x00e38b96, 0x00e38b97, 0x00e38b98, 0x00e38b99,
+ /* e5 */ 0x00e38b9a, 0x00e38b9b, 0x00e38b9c, 0x00e38b9d,
+ /* e9 */ 0x00e38b9e, 0x00e38b9f, 0x00e38ba0, 0x00e38ba1,
+ /* ed */ 0x00e38ba2, 0x00e38ba3, 0x00e38bba, 0x00e38ba9,
+ /* f1 */ 0x00e38ba5, 0x00e38bad, 0x00e38bac, 0x00000000,
+ /* f5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* f9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00e28191, 0x00e28182,
+
+ /*** Two byte table, leaf: adxx - offset 0x005c8 ***/
+
+ /* a1 */ 0x00e291a0, 0x00e291a1, 0x00e291a2, 0x00e291a3,
+ /* a5 */ 0x00e291a4, 0x00e291a5, 0x00e291a6, 0x00e291a7,
+ /* a9 */ 0x00e291a8, 0x00e291a9, 0x00e291aa, 0x00e291ab,
+ /* ad */ 0x00e291ac, 0x00e291ad, 0x00e291ae, 0x00e291af,
+ /* b1 */ 0x00e291b0, 0x00e291b1, 0x00e291b2, 0x00e291b3,
+ /* b5 */ 0x00e285a0, 0x00e285a1, 0x00e285a2, 0x00e285a3,
+ /* b9 */ 0x00e285a4, 0x00e285a5, 0x00e285a6, 0x00e285a7,
+ /* bd */ 0x00e285a8, 0x00e285a9, 0x00e285aa, 0x00e38d89,
+ /* c1 */ 0x00e38c94, 0x00e38ca2, 0x00e38d8d, 0x00e38c98,
+ /* c5 */ 0x00e38ca7, 0x00e38c83, 0x00e38cb6, 0x00e38d91,
+ /* c9 */ 0x00e38d97, 0x00e38c8d, 0x00e38ca6, 0x00e38ca3,
+ /* cd */ 0x00e38cab, 0x00e38d8a, 0x00e38cbb, 0x00e38e9c,
+ /* d1 */ 0x00e38e9d, 0x00e38e9e, 0x00e38e8e, 0x00e38e8f,
+ /* d5 */ 0x00e38f84, 0x00e38ea1, 0x00e285ab, 0x00000000,
+ /* d9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* dd */ 0x00000000, 0x00000000, 0x00e38dbb, 0x00e3809d,
+ /* e1 */ 0x00e3809f, 0x00e28496, 0x00e38f8d, 0x00e284a1,
+ /* e5 */ 0x00e38aa4, 0x00e38aa5, 0x00e38aa6, 0x00e38aa7,
+ /* e9 */ 0x00e38aa8, 0x00e388b1, 0x00e388b2, 0x00e388b9,
+ /* ed */ 0x00e38dbe, 0x00e38dbd, 0x00e38dbc, 0x00000000,
+ /* f1 */ 0x00000000, 0x00000000, 0x00e288ae, 0x00000000,
+ /* f5 */ 0x00000000, 0x00000000, 0x00000000, 0x00e2889f,
+ /* f9 */ 0x00e28abf, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00e29d96, 0x00e2989e,
+
+ /*** Two byte table, leaf: aexx - offset 0x00626 ***/
+
+ /* a1 */ 0x00e4bfb1, 0xf0a0808b, 0x00e39082, 0x00e4b8a8,
+ /* a5 */ 0x00e4b8af, 0x00e4b8b0, 0x00e4ba8d, 0x00e4bba1,
+ /* a9 */ 0x00e4bbbd, 0x00e4bbbf, 0x00e4bc83, 0x00e4bc8b,
+ /* ad */ 0x00e4bda0, 0x00e4bd88, 0x00e4bd89, 0x00e4bd96,
+ /* b1 */ 0x00e4bd9f, 0x00e4bdaa, 0x00e4bdac, 0x00e4bdbe,
+ /* b5 */ 0x00e4be8a, 0x00e4be94, 0x00e4be97, 0x00efa8b0,
+ /* b9 */ 0x00e4bf89, 0x00e4bfa0, 0x00e58081, 0x00e58082,
+ /* bd */ 0x00e5808e, 0x00e58098, 0x00e580a7, 0x00e580ae,
+ /* c1 */ 0x00e58180, 0x00e580bb, 0x00e58181, 0x00e58294,
+ /* c5 */ 0x00e5838c, 0x00e583b2, 0x00e58390, 0x00e583a6,
+ /* c9 */ 0x00efa8b1, 0x00e58486, 0x00e58483, 0x00e5848b,
+ /* cd */ 0x00e5849e, 0x00e584b5, 0x00e5858a, 0x00efa8b2,
+ /* d1 */ 0x00e58595, 0x00e58597, 0x00e392b5, 0x00e5869d,
+ /* d5 */ 0x00e58783, 0x00e5878a, 0x00e5879e, 0x00e587a2,
+ /* d9 */ 0x00e587ae, 0x00e58881, 0x00e3939b, 0x00e58893,
+ /* dd */ 0x00e58895, 0x00e58989, 0x00e58997, 0x00e589a1,
+ /* e1 */ 0x00e58a93, 0x00e58b88, 0x00efa8b3, 0x00e58b8c,
+ /* e5 */ 0x00e58b90, 0x00e58b96, 0x00e58b9b, 0x00efa8b4,
+ /* e9 */ 0x00e58bb0, 0x00e58bbb, 0x00e58c80, 0x00e58c87,
+ /* ed */ 0x00e58c9c, 0x00efa8b5, 0x00e58da1, 0x00e58da3,
+ /* f1 */ 0x00e58dbd, 0x00e58e93, 0x00e58e9d, 0x00e58eb2,
+ /* f5 */ 0x00e59092, 0x00e590a7, 0x00e5918d, 0x00e5929c,
+ /* f9 */ 0x00e591ab, 0x00e591b4, 0x00e591bf, 0x00e59288,
+ /* fd */ 0x00e59296, 0x00e592a1,
+
+ /*** Two byte table, leaf: afxx - offset 0x00684 ***/
+
+ /* a1 */ 0x00e592a9, 0x00e59386, 0x00e593bf, 0x00e5948e,
+ /* a5 */ 0x00e594ab, 0x00e594b5, 0x00e59590, 0x00e5959e,
+ /* a9 */ 0x00e59681, 0x00e59686, 0x00e5968e, 0x00efa8b6,
+ /* ad */ 0x00e596ad, 0x00e5978e, 0x00efa8b7, 0x00e59888,
+ /* b1 */ 0x00e5988e, 0x00e598bb, 0x00e59989, 0x00e599b6,
+ /* b5 */ 0x00e599a6, 0x00efa8b8, 0x00e599af, 0x00e599b1,
+ /* b9 */ 0x00e599b2, 0x00e59a99, 0x00e59a9e, 0x00e59aa9,
+ /* bd */ 0x00e59aac, 0x00e59ab3, 0x00e59b89, 0x00e59b8a,
+ /* c1 */ 0x00e59c8a, 0xf0a188bd, 0x00e59ca1, 0x00e59caf,
+ /* c5 */ 0x00e59cb3, 0x00e59cb4, 0x00e59db0, 0x00e59db7,
+ /* c9 */ 0x00e59dbc, 0x00e59e9c, 0x00efa88f, 0xf0a18c9b,
+ /* cd */ 0x00e59eb8, 0x00e59f87, 0x00e59f88, 0x00e59f8f,
+ /* d1 */ 0x00e59fa4, 0x00e59fad, 0x00e59fb5, 0x00e59fb6,
+ /* d5 */ 0x00e59fbf, 0x00e5a089, 0x00efa890, 0x00e5a1a1,
+ /* d9 */ 0x00e5a1a4, 0x00efa8b9, 0x00e5a1bc, 0x00e5a289,
+ /* dd */ 0x00e5a29e, 0x00efa8ba, 0x00e5a2a9, 0xf0a191ae,
+ /* e1 */ 0x00e5a392, 0x00e5a38e, 0x00e5a394, 0x00e5a39a,
+ /* e5 */ 0x00e5a3a0, 0x00e5a3a9, 0x00e5a48c, 0x00e89981,
+ /* e9 */ 0x00e5a59d, 0x00e5a5ad, 0x00e5a68b, 0x00e5a692,
+ /* ed */ 0x00e5a6a4, 0x00e5a783, 0x00e5a792, 0x00e5a79d,
+ /* f1 */ 0x00e5a893, 0x00e5a8a3, 0x00e5a9a7, 0x00e5a9ad,
+ /* f5 */ 0x00e5a9b7, 0x00e5a9be, 0x00e5aa84, 0x00e5aa9e,
+ /* f9 */ 0x00e5aaa7, 0x00e5ab84, 0xf0a1a2bd, 0x00e5ac99,
+ /* fd */ 0x00e5aca5, 0x00e5899d,
+
+ /*** Two byte table, leaf: b0xx - offset 0x006e2 ***/
+
+ /* a1 */ 0x00e4ba9c, 0x00e59496, 0x00e5a883, 0x00e998bf,
+ /* a5 */ 0x00e59380, 0x00e6849b, 0x00e68ca8, 0x00e5a7b6,
+ /* a9 */ 0x00e980a2, 0x00e891b5, 0x00e88c9c, 0x00e7a990,
+ /* ad */ 0x00e682aa, 0x00e68fa1, 0x00e6b8a5, 0x00e697ad,
+ /* b1 */ 0x00e891a6, 0x00e88aa6, 0x00e9afb5, 0x00e6a293,
+ /* b5 */ 0x00e59ca7, 0x00e696a1, 0x00e689b1, 0x00e5ae9b,
+ /* b9 */ 0x00e5a790, 0x00e899bb, 0x00e9a3b4, 0x00e7b5a2,
+ /* bd */ 0x00e7b6be, 0x00e9ae8e, 0x00e68896, 0x00e7b29f,
+ /* c1 */ 0x00e8a2b7, 0x00e5ae89, 0x00e5bab5, 0x00e68c89,
+ /* c5 */ 0x00e69a97, 0x00e6a188, 0x00e99787, 0x00e99e8d,
+ /* c9 */ 0x00e69d8f, 0x00e4bba5, 0x00e4bc8a, 0x00e4bd8d,
+ /* cd */ 0x00e4be9d, 0x00e58189, 0x00e59bb2, 0x00e5a4b7,
+ /* d1 */ 0x00e5a794, 0x00e5a881, 0x00e5b089, 0x00e6839f,
+ /* d5 */ 0x00e6848f, 0x00e685b0, 0x00e69893, 0x00e6a485,
+ /* d9 */ 0x00e782ba, 0x00e7958f, 0x00e795b0, 0x00e7a7bb,
+ /* dd */ 0x00e7b6ad, 0x00e7b7af, 0x00e88383, 0x00e8908e,
+ /* e1 */ 0x00e8a1a3, 0x00e8ac82, 0x00e98195, 0x00e981ba,
+ /* e5 */ 0x00e58cbb, 0x00e4ba95, 0x00e4baa5, 0x00e59f9f,
+ /* e9 */ 0x00e882b2, 0x00e98381, 0x00e7a3af, 0x00e4b880,
+ /* ed */ 0x00e5a3b1, 0x00e6baa2, 0x00e980b8, 0x00e7a8b2,
+ /* f1 */ 0x00e88ca8, 0x00e88a8b, 0x00e9b0af, 0x00e58581,
+ /* f5 */ 0x00e58db0, 0x00e592bd, 0x00e593a1, 0x00e59ba0,
+ /* f9 */ 0x00e5a7bb, 0x00e5bc95, 0x00e9a3b2, 0x00e6b7ab,
+ /* fd */ 0x00e883a4, 0x00e894ad,
+
+ /*** Two byte table, leaf: b1xx - offset 0x00740 ***/
+
+ /* a1 */ 0x00e999a2, 0x00e999b0, 0x00e99aa0, 0x00e99fbb,
+ /* a5 */ 0x00e5908b, 0x00e58fb3, 0x00e5ae87, 0x00e7838f,
+ /* a9 */ 0x00e7bebd, 0x00e8bf82, 0x00e99ba8, 0x00e58daf,
+ /* ad */ 0x00e9b59c, 0x00e7aaba, 0x00e4b891, 0x00e7a293,
+ /* b1 */ 0x00e887bc, 0x00e6b8a6, 0x00e59898, 0x00e59484,
+ /* b5 */ 0x00e6ac9d, 0x00e8949a, 0x00e9b0bb, 0x00e5a7a5,
+ /* b9 */ 0x00e58ea9, 0x00e6b5a6, 0x00e7939c, 0x00e9968f,
+ /* bd */ 0x00e59982, 0x00e4ba91, 0x00e9818b, 0x00e99bb2,
+ /* c1 */ 0x00e88d8f, 0x00e9a48c, 0x00e58fa1, 0x00e596b6,
+ /* c5 */ 0x00e5acb0, 0x00e5bdb1, 0x00e698a0, 0x00e69bb3,
+ /* c9 */ 0x00e6a084, 0x00e6b0b8, 0x00e6b3b3, 0x00e6b4a9,
+ /* cd */ 0x00e7919b, 0x00e79b88, 0x00e7a98e, 0x00e9a0b4,
+ /* d1 */ 0x00e88bb1, 0x00e8a19b, 0x00e8a9a0, 0x00e98bad,
+ /* d5 */ 0x00e6b6b2, 0x00e796ab, 0x00e79b8a, 0x00e9a785,
+ /* d9 */ 0x00e682a6, 0x00e8ac81, 0x00e8b68a, 0x00e996b2,
+ /* dd */ 0x00e6a68e, 0x00e58ead, 0x00e58686, 0x00e59c92,
+ /* e1 */ 0x00e5a0b0, 0x00e5a584, 0x00e5aeb4, 0x00e5bbb6,
+ /* e5 */ 0x00e680a8, 0x00e68ea9, 0x00e68fb4, 0x00e6b2bf,
+ /* e9 */ 0x00e6bc94, 0x00e7828e, 0x00e78494, 0x00e78599,
+ /* ed */ 0x00e78795, 0x00e78cbf, 0x00e7b881, 0x00e889b6,
+ /* f1 */ 0x00e88b91, 0x00e89697, 0x00e981a0, 0x00e9899b,
+ /* f5 */ 0x00e9b49b, 0x00e5a1a9, 0x00e696bc, 0x00e6b19a,
+ /* f9 */ 0x00e794a5, 0x00e587b9, 0x00e5a4ae, 0x00e5a5a5,
+ /* fd */ 0x00e5be80, 0x00e5bf9c,
+
+ /*** Two byte table, leaf: b2xx - offset 0x0079e ***/
+
+ /* a1 */ 0x00e68abc, 0x00e697ba, 0x00e6a8aa, 0x00e6aca7,
+ /* a5 */ 0x00e6aeb4, 0x00e78e8b, 0x00e7bf81, 0x00e8a596,
+ /* a9 */ 0x00e9b4ac, 0x00e9b48e, 0x00e9bb84, 0x00e5b2a1,
+ /* ad */ 0x00e6b296, 0x00e88dbb, 0x00e58484, 0x00e5b18b,
+ /* b1 */ 0x00e686b6, 0x00e88786, 0x00e6a1b6, 0x00e789a1,
+ /* b5 */ 0x00e4b999, 0x00e4bfba, 0x00e58db8, 0x00e681a9,
+ /* b9 */ 0x00e6b8a9, 0x00e7a98f, 0x00e99fb3, 0x00e4b88b,
+ /* bd */ 0x00e58c96, 0x00e4bbae, 0x00e4bd95, 0x00e4bcbd,
+ /* c1 */ 0x00e4bea1, 0x00e4bdb3, 0x00e58aa0, 0x00e58faf,
+ /* c5 */ 0x00e59889, 0x00e5a48f, 0x00e5ab81, 0x00e5aeb6,
+ /* c9 */ 0x00e5afa1, 0x00e7a791, 0x00e69a87, 0x00e69e9c,
+ /* cd */ 0x00e69eb6, 0x00e6ad8c, 0x00e6b2b3, 0x00e781ab,
+ /* d1 */ 0x00e78f82, 0x00e7a68d, 0x00e7a6be, 0x00e7a8bc,
+ /* d5 */ 0x00e7ae87, 0x00e88ab1, 0x00e88b9b, 0x00e88c84,
+ /* d9 */ 0x00e88db7, 0x00e88faf, 0x00e88f93, 0x00e89da6,
+ /* dd */ 0x00e8aab2, 0x00e598a9, 0x00e8b2a8, 0x00e8bfa6,
+ /* e1 */ 0x00e9818e, 0x00e99c9e, 0x00e89a8a, 0x00e4bf84,
+ /* e5 */ 0x00e5b3a8, 0x00e68891, 0x00e78999, 0x00e794bb,
+ /* e9 */ 0x00e887a5, 0x00e88abd, 0x00e89bbe, 0x00e8b380,
+ /* ed */ 0x00e99b85, 0x00e9a493, 0x00e9a795, 0x00e4bb8b,
+ /* f1 */ 0x00e4bc9a, 0x00e8a7a3, 0x00e59b9e, 0x00e5a18a,
+ /* f5 */ 0x00e5a38a, 0x00e5bbbb, 0x00e5bfab, 0x00e680aa,
+ /* f9 */ 0x00e68294, 0x00e681a2, 0x00e68790, 0x00e68892,
+ /* fd */ 0x00e68b90, 0x00e694b9,
+
+ /*** Two byte table, leaf: b3xx - offset 0x007fc ***/
+
+ /* a1 */ 0x00e9ad81, 0x00e699a6, 0x00e6a2b0, 0x00e6b5b7,
+ /* a5 */ 0x00e781b0, 0x00e7958c, 0x00e79a86, 0x00e7b5b5,
+ /* a9 */ 0x00e88aa5, 0x00e89fb9, 0x00e9968b, 0x00e99a8e,
+ /* ad */ 0x00e8b29d, 0x00e587b1, 0x00e58abe, 0x00e5a496,
+ /* b1 */ 0x00e592b3, 0x00e5aeb3, 0x00e5b496, 0x00e685a8,
+ /* b5 */ 0x00e6a682, 0x00e6b6af, 0x00e7a28d, 0x00e8938b,
+ /* b9 */ 0x00e8a197, 0x00e8a9b2, 0x00e98ea7, 0x00e9aab8,
+ /* bd */ 0x00e6b5ac, 0x00e9a6a8, 0x00e89b99, 0x00e59ea3,
+ /* c1 */ 0x00e69fbf, 0x00e89b8e, 0x00e9888e, 0x00e58a83,
+ /* c5 */ 0x00e59a87, 0x00e59084, 0x00e5bb93, 0x00e68ba1,
+ /* c9 */ 0x00e692b9, 0x00e6a0bc, 0x00e6a0b8, 0x00e6aebb,
+ /* cd */ 0x00e78db2, 0x00e7a2ba, 0x00e7a9ab, 0x00e8a69a,
+ /* d1 */ 0x00e8a792, 0x00e8b5ab, 0x00e8bc83, 0x00e983ad,
+ /* d5 */ 0x00e996a3, 0x00e99a94, 0x00e99da9, 0x00e5ada6,
+ /* d9 */ 0x00e5b2b3, 0x00e6a5bd, 0x00e9a18d, 0x00e9a18e,
+ /* dd */ 0x00e68e9b, 0x00e7aca0, 0x00e6a8ab, 0x00e6a9bf,
+ /* e1 */ 0x00e6a2b6, 0x00e9b08d, 0x00e6bd9f, 0x00e589b2,
+ /* e5 */ 0x00e5969d, 0x00e681b0, 0x00e68bac, 0x00e6b4bb,
+ /* e9 */ 0x00e6b887, 0x00e6bb91, 0x00e8919b, 0x00e8a490,
+ /* ed */ 0x00e8bd84, 0x00e4b894, 0x00e9b0b9, 0x00e58fb6,
+ /* f1 */ 0x00e6a49b, 0x00e6a8ba, 0x00e99e84, 0x00e6a0aa,
+ /* f5 */ 0x00e5859c, 0x00e7ab83, 0x00e892b2, 0x00e9879c,
+ /* f9 */ 0x00e98e8c, 0x00e5999b, 0x00e9b4a8, 0x00e6a0a2,
+ /* fd */ 0x00e88c85, 0x00e890b1,
+
+ /*** Two byte table, leaf: b4xx - offset 0x0085a ***/
+
+ /* a1 */ 0x00e7b2a5, 0x00e58888, 0x00e88b85, 0x00e793a6,
+ /* a5 */ 0x00e4b9be, 0x00e4be83, 0x00e586a0, 0x00e5af92,
+ /* a9 */ 0x00e5888a, 0x00e58b98, 0x00e58ba7, 0x00e5b7bb,
+ /* ad */ 0x00e5969a, 0x00e5a0aa, 0x00e5a7a6, 0x00e5ae8c,
+ /* b1 */ 0x00e5ae98, 0x00e5af9b, 0x00e5b9b2, 0x00e5b9b9,
+ /* b5 */ 0x00e682a3, 0x00e6849f, 0x00e685a3, 0x00e686be,
+ /* b9 */ 0x00e68f9b, 0x00e695a2, 0x00e69f91, 0x00e6a193,
+ /* bd */ 0x00e6a3ba, 0x00e6acbe, 0x00e6ad93, 0x00e6b197,
+ /* c1 */ 0x00e6bca2, 0x00e6be97, 0x00e6bd85, 0x00e792b0,
+ /* c5 */ 0x00e79498, 0x00e79ba3, 0x00e79c8b, 0x00e7abbf,
+ /* c9 */ 0x00e7aea1, 0x00e7b0a1, 0x00e7b7a9, 0x00e7bcb6,
+ /* cd */ 0x00e7bfb0, 0x00e8829d, 0x00e889a6, 0x00e88e9e,
+ /* d1 */ 0x00e8a6b3, 0x00e8ab8c, 0x00e8b2ab, 0x00e98284,
+ /* d5 */ 0x00e99191, 0x00e99693, 0x00e99691, 0x00e996a2,
+ /* d9 */ 0x00e999a5, 0x00e99f93, 0x00e9a4a8, 0x00e88898,
+ /* dd */ 0x00e4b8b8, 0x00e590ab, 0x00e5b2b8, 0x00e5b78c,
+ /* e1 */ 0x00e78ea9, 0x00e7998c, 0x00e79cbc, 0x00e5b2a9,
+ /* e5 */ 0x00e7bfab, 0x00e8b48b, 0x00e99b81, 0x00e9a091,
+ /* e9 */ 0x00e9a194, 0x00e9a198, 0x00e4bc81, 0x00e4bc8e,
+ /* ed */ 0x00e58db1, 0x00e5969c, 0x00e599a8, 0x00e59fba,
+ /* f1 */ 0x00e5a587, 0x00e5ac89, 0x00e5af84, 0x00e5b290,
+ /* f5 */ 0x00e5b88c, 0x00e5b9be, 0x00e5bf8c, 0x00e68fae,
+ /* f9 */ 0x00e69cba, 0x00e69797, 0x00e697a2, 0x00e69c9f,
+ /* fd */ 0x00e6a38b, 0x00e6a384,
+
+ /*** Two byte table, leaf: b5xx - offset 0x008b8 ***/
+
+ /* a1 */ 0x00e6a99f, 0x00e5b8b0, 0x00e6af85, 0x00e6b097,
+ /* a5 */ 0x00e6b1bd, 0x00e795bf, 0x00e7a588, 0x00e5ada3,
+ /* a9 */ 0x00e7a880, 0x00e7b480, 0x00e5bebd, 0x00e8a68f,
+ /* ad */ 0x00e8a898, 0x00e8b2b4, 0x00e8b5b7, 0x00e8bb8c,
+ /* b1 */ 0x00e8bc9d, 0x00e9a3a2, 0x00e9a88e, 0x00e9acbc,
+ /* b5 */ 0x00e4ba80, 0x00e581bd, 0x00e58480, 0x00e5a693,
+ /* b9 */ 0x00e5ae9c, 0x00e688af, 0x00e68a80, 0x00e693ac,
+ /* bd */ 0x00e6acba, 0x00e78aa0, 0x00e79691, 0x00e7a587,
+ /* c1 */ 0x00e7bea9, 0x00e89fbb, 0x00e8aabc, 0x00e8adb0,
+ /* c5 */ 0x00e68eac, 0x00e88f8a, 0x00e99ea0, 0x00e59089,
+ /* c9 */ 0x00e59083, 0x00e596ab, 0x00e6a194, 0x00e6a998,
+ /* cd */ 0x00e8a9b0, 0x00e7a0a7, 0x00e69db5, 0x00e9bb8d,
+ /* d1 */ 0x00e58db4, 0x00e5aea2, 0x00e8849a, 0x00e89990,
+ /* d5 */ 0x00e98086, 0x00e4b898, 0x00e4b985, 0x00e4bb87,
+ /* d9 */ 0x00e4bc91, 0x00e58f8a, 0x00e590b8, 0x00e5aeae,
+ /* dd */ 0x00e5bc93, 0x00e680a5, 0x00e69591, 0x00e69cbd,
+ /* e1 */ 0x00e6b182, 0x00e6b1b2, 0x00e6b3a3, 0x00e781b8,
+ /* e5 */ 0x00e79083, 0x00e7a9b6, 0x00e7aaae, 0x00e7ac88,
+ /* e9 */ 0x00e7b49a, 0x00e7b3be, 0x00e7b5a6, 0x00e697a7,
+ /* ed */ 0x00e7899b, 0x00e58ebb, 0x00e5b185, 0x00e5b7a8,
+ /* f1 */ 0x00e68b92, 0x00e68ba0, 0x00e68c99, 0x00e6b8a0,
+ /* f5 */ 0x00e8999a, 0x00e8a8b1, 0x00e8b79d, 0x00e98bb8,
+ /* f9 */ 0x00e6bc81, 0x00e7a6a6, 0x00e9ad9a, 0x00e4baa8,
+ /* fd */ 0x00e4baab, 0x00e4baac,
+
+ /*** Two byte table, leaf: b6xx - offset 0x00916 ***/
+
+ /* a1 */ 0x00e4be9b, 0x00e4bea0, 0x00e58391, 0x00e58587,
+ /* a5 */ 0x00e7abb6, 0x00e585b1, 0x00e587b6, 0x00e58d94,
+ /* a9 */ 0x00e58ca1, 0x00e58dbf, 0x00e58fab, 0x00e596ac,
+ /* ad */ 0x00e5a283, 0x00e5b3a1, 0x00e5bcb7, 0x00e5bd8a,
+ /* b1 */ 0x00e680af, 0x00e68190, 0x00e681ad, 0x00e68c9f,
+ /* b5 */ 0x00e69599, 0x00e6a98b, 0x00e6b381, 0x00e78b82,
+ /* b9 */ 0x00e78bad, 0x00e79faf, 0x00e883b8, 0x00e88485,
+ /* bd */ 0x00e88888, 0x00e8958e, 0x00e983b7, 0x00e98fa1,
+ /* c1 */ 0x00e99fbf, 0x00e9a597, 0x00e9a99a, 0x00e4bbb0,
+ /* c5 */ 0x00e5879d, 0x00e5b0ad, 0x00e69a81, 0x00e6a5ad,
+ /* c9 */ 0x00e5b180, 0x00e69bb2, 0x00e6a5b5, 0x00e78e89,
+ /* cd */ 0x00e6a190, 0x00e7b281, 0x00e58385, 0x00e58ba4,
+ /* d1 */ 0x00e59d87, 0x00e5b7be, 0x00e98ca6, 0x00e696a4,
+ /* d5 */ 0x00e6aca3, 0x00e6acbd, 0x00e790b4, 0x00e7a681,
+ /* d9 */ 0x00e7a6bd, 0x00e7ad8b, 0x00e7b78a, 0x00e88ab9,
+ /* dd */ 0x00e88f8c, 0x00e8a1bf, 0x00e8a59f, 0x00e8acb9,
+ /* e1 */ 0x00e8bf91, 0x00e98791, 0x00e5909f, 0x00e98a80,
+ /* e5 */ 0x00e4b99d, 0x00e580b6, 0x00e58fa5, 0x00e58cba,
+ /* e9 */ 0x00e78b97, 0x00e78e96, 0x00e79fa9, 0x00e88ba6,
+ /* ed */ 0x00e8baaf, 0x00e9a786, 0x00e9a788, 0x00e9a792,
+ /* f1 */ 0x00e585b7, 0x00e6849a, 0x00e8999e, 0x00e596b0,
+ /* f5 */ 0x00e7a9ba, 0x00e581b6, 0x00e5af93, 0x00e98187,
+ /* f9 */ 0x00e99a85, 0x00e4b8b2, 0x00e6ab9b, 0x00e987a7,
+ /* fd */ 0x00e5b191, 0x00e5b188,
+
+ /*** Two byte table, leaf: b7xx - offset 0x00974 ***/
+
+ /* a1 */ 0x00e68e98, 0x00e7aa9f, 0x00e6b293, 0x00e99db4,
+ /* a5 */ 0x00e8bda1, 0x00e7aaaa, 0x00e7868a, 0x00e99a88,
+ /* a9 */ 0x00e7b282, 0x00e6a097, 0x00e7b9b0, 0x00e6a191,
+ /* ad */ 0x00e98dac, 0x00e58bb2, 0x00e5909b, 0x00e896ab,
+ /* b1 */ 0x00e8a893, 0x00e7bea4, 0x00e8bb8d, 0x00e983a1,
+ /* b5 */ 0x00e58da6, 0x00e8a288, 0x00e7a581, 0x00e4bf82,
+ /* b9 */ 0x00e582be, 0x00e58891, 0x00e58584, 0x00e59593,
+ /* bd */ 0x00e59cad, 0x00e78faa, 0x00e59e8b, 0x00e5a591,
+ /* c1 */ 0x00e5bda2, 0x00e5be84, 0x00e681b5, 0x00e685b6,
+ /* c5 */ 0x00e685a7, 0x00e686a9, 0x00e68eb2, 0x00e690ba,
+ /* c9 */ 0x00e695ac, 0x00e699af, 0x00e6a182, 0x00e6b893,
+ /* cd */ 0x00e795a6, 0x00e7a8bd, 0x00e7b3bb, 0x00e7b58c,
+ /* d1 */ 0x00e7b699, 0x00e7b98b, 0x00e7bdab, 0x00e88c8e,
+ /* d5 */ 0x00e88d8a, 0x00e89b8d, 0x00e8a888, 0x00e8a9a3,
+ /* d9 */ 0x00e8ada6, 0x00e8bbbd, 0x00e9a09a, 0x00e9b68f,
+ /* dd */ 0x00e88ab8, 0x00e8bf8e, 0x00e9afa8, 0x00e58a87,
+ /* e1 */ 0x00e6889f, 0x00e69283, 0x00e6bf80, 0x00e99a99,
+ /* e5 */ 0x00e6a181, 0x00e58291, 0x00e6aca0, 0x00e6b1ba,
+ /* e9 */ 0x00e6bd94, 0x00e7a9b4, 0x00e7b590, 0x00e8a180,
+ /* ed */ 0x00e8a8a3, 0x00e69c88, 0x00e4bbb6, 0x00e580b9,
+ /* f1 */ 0x00e580a6, 0x00e581a5, 0x00e585bc, 0x00e588b8,
+ /* f5 */ 0x00e589a3, 0x00e596a7, 0x00e59c8f, 0x00e5a085,
+ /* f9 */ 0x00e5ab8c, 0x00e5bbba, 0x00e686b2, 0x00e687b8,
+ /* fd */ 0x00e68bb3, 0x00e68db2,
+
+ /*** Two byte table, leaf: b8xx - offset 0x009d2 ***/
+
+ /* a1 */ 0x00e6a49c, 0x00e6a8a9, 0x00e789bd, 0x00e78aac,
+ /* a5 */ 0x00e78cae, 0x00e7a094, 0x00e7a1af, 0x00e7b5b9,
+ /* a9 */ 0x00e79c8c, 0x00e882a9, 0x00e8a68b, 0x00e8ac99,
+ /* ad */ 0x00e8b3a2, 0x00e8bb92, 0x00e981a3, 0x00e98db5,
+ /* b1 */ 0x00e999ba, 0x00e9a195, 0x00e9a893, 0x00e9b9b8,
+ /* b5 */ 0x00e58583, 0x00e58e9f, 0x00e58eb3, 0x00e5b9bb,
+ /* b9 */ 0x00e5bca6, 0x00e6b89b, 0x00e6ba90, 0x00e78e84,
+ /* bd */ 0x00e78fbe, 0x00e7b583, 0x00e888b7, 0x00e8a880,
+ /* c1 */ 0x00e8abba, 0x00e99990, 0x00e4b98e, 0x00e5808b,
+ /* c5 */ 0x00e58fa4, 0x00e591bc, 0x00e59bba, 0x00e5a791,
+ /* c9 */ 0x00e5ada4, 0x00e5b7b1, 0x00e5baab, 0x00e5bca7,
+ /* cd */ 0x00e688b8, 0x00e69585, 0x00e69eaf, 0x00e6b996,
+ /* d1 */ 0x00e78b90, 0x00e7b38a, 0x00e8a2b4, 0x00e882a1,
+ /* d5 */ 0x00e883a1, 0x00e88fb0, 0x00e8998e, 0x00e8aa87,
+ /* d9 */ 0x00e8b7a8, 0x00e988b7, 0x00e99b87, 0x00e9a1a7,
+ /* dd */ 0x00e9bc93, 0x00e4ba94, 0x00e4ba92, 0x00e4bc8d,
+ /* e1 */ 0x00e58d88, 0x00e59189, 0x00e590be, 0x00e5a8af,
+ /* e5 */ 0x00e5be8c, 0x00e5bea1, 0x00e6829f, 0x00e6a2a7,
+ /* e9 */ 0x00e6aa8e, 0x00e7919a, 0x00e7a281, 0x00e8aa9e,
+ /* ed */ 0x00e8aaa4, 0x00e8adb7, 0x00e98690, 0x00e4b99e,
+ /* f1 */ 0x00e9af89, 0x00e4baa4, 0x00e4bdbc, 0x00e4beaf,
+ /* f5 */ 0x00e58099, 0x00e58096, 0x00e58589, 0x00e585ac,
+ /* f9 */ 0x00e58a9f, 0x00e58ab9, 0x00e58bbe, 0x00e58e9a,
+ /* fd */ 0x00e58fa3, 0x00e59091,
+
+ /*** Two byte table, leaf: b9xx - offset 0x00a30 ***/
+
+ /* a1 */ 0x00e5908e, 0x00e59689, 0x00e59d91, 0x00e59ea2,
+ /* a5 */ 0x00e5a5bd, 0x00e5ad94, 0x00e5ad9d, 0x00e5ae8f,
+ /* a9 */ 0x00e5b7a5, 0x00e5b7a7, 0x00e5b7b7, 0x00e5b9b8,
+ /* ad */ 0x00e5ba83, 0x00e5ba9a, 0x00e5bab7, 0x00e5bc98,
+ /* b1 */ 0x00e68192, 0x00e6858c, 0x00e68a97, 0x00e68b98,
+ /* b5 */ 0x00e68ea7, 0x00e694bb, 0x00e69882, 0x00e69983,
+ /* b9 */ 0x00e69bb4, 0x00e69dad, 0x00e6a0a1, 0x00e6a297,
+ /* bd */ 0x00e6a78b, 0x00e6b19f, 0x00e6b4aa, 0x00e6b5a9,
+ /* c1 */ 0x00e6b8af, 0x00e6ba9d, 0x00e794b2, 0x00e79a87,
+ /* c5 */ 0x00e7a1ac, 0x00e7a8bf, 0x00e7b3a0, 0x00e7b485,
+ /* c9 */ 0x00e7b498, 0x00e7b59e, 0x00e7b6b1, 0x00e88095,
+ /* cd */ 0x00e88083, 0x00e882af, 0x00e882b1, 0x00e88594,
+ /* d1 */ 0x00e8868f, 0x00e888aa, 0x00e88d92, 0x00e8a18c,
+ /* d5 */ 0x00e8a1a1, 0x00e8ac9b, 0x00e8b2a2, 0x00e8b3bc,
+ /* d9 */ 0x00e9838a, 0x00e985b5, 0x00e989b1, 0x00e7a0bf,
+ /* dd */ 0x00e98bbc, 0x00e996a4, 0x00e9998d, 0x00e9a085,
+ /* e1 */ 0x00e9a699, 0x00e9ab98, 0x00e9b4bb, 0x00e5899b,
+ /* e5 */ 0x00e58aab, 0x00e58fb7, 0x00e59088, 0x00e5a395,
+ /* e9 */ 0x00e68bb7, 0x00e6bfa0, 0x00e8b1aa, 0x00e8bd9f,
+ /* ed */ 0x00e9bab9, 0x00e5858b, 0x00e588bb, 0x00e5918a,
+ /* f1 */ 0x00e59bbd, 0x00e7a980, 0x00e985b7, 0x00e9b5a0,
+ /* f5 */ 0x00e9bb92, 0x00e78d84, 0x00e6bc89, 0x00e885b0,
+ /* f9 */ 0x00e79491, 0x00e5bfbd, 0x00e6839a, 0x00e9aaa8,
+ /* fd */ 0x00e78b9b, 0x00e8bebc,
+
+ /*** Two byte table, leaf: baxx - offset 0x00a8e ***/
+
+ /* a1 */ 0x00e6ada4, 0x00e9a083, 0x00e4bb8a, 0x00e59bb0,
+ /* a5 */ 0x00e59da4, 0x00e5a2be, 0x00e5a99a, 0x00e681a8,
+ /* a9 */ 0x00e68787, 0x00e6988f, 0x00e69886, 0x00e6a0b9,
+ /* ad */ 0x00e6a2b1, 0x00e6b7b7, 0x00e79795, 0x00e7b4ba,
+ /* b1 */ 0x00e889ae, 0x00e9ad82, 0x00e4ba9b, 0x00e4bd90,
+ /* b5 */ 0x00e58f89, 0x00e59486, 0x00e5b5af, 0x00e5b7a6,
+ /* b9 */ 0x00e5b7ae, 0x00e69fbb, 0x00e6b299, 0x00e791b3,
+ /* bd */ 0x00e7a082, 0x00e8a990, 0x00e98e96, 0x00e8a39f,
+ /* c1 */ 0x00e59d90, 0x00e5baa7, 0x00e68cab, 0x00e582b5,
+ /* c5 */ 0x00e582ac, 0x00e5868d, 0x00e69c80, 0x00e59389,
+ /* c9 */ 0x00e5a19e, 0x00e5a6bb, 0x00e5aeb0, 0x00e5bda9,
+ /* cd */ 0x00e6898d, 0x00e68ea1, 0x00e6a0bd, 0x00e6adb3,
+ /* d1 */ 0x00e6b888, 0x00e781bd, 0x00e98787, 0x00e78a80,
+ /* d5 */ 0x00e7a095, 0x00e7a0a6, 0x00e7a5ad, 0x00e6968e,
+ /* d9 */ 0x00e7b4b0, 0x00e88f9c, 0x00e8a381, 0x00e8bc89,
+ /* dd */ 0x00e99a9b, 0x00e589a4, 0x00e59ca8, 0x00e69d90,
+ /* e1 */ 0x00e7bdaa, 0x00e8b2a1, 0x00e586b4, 0x00e59d82,
+ /* e5 */ 0x00e998aa, 0x00e5a0ba, 0x00e6a68a, 0x00e882b4,
+ /* e9 */ 0x00e592b2, 0x00e5b48e, 0x00e59fbc, 0x00e7a295,
+ /* ed */ 0x00e9b7ba, 0x00e4bd9c, 0x00e5898a, 0x00e5928b,
+ /* f1 */ 0x00e690be, 0x00e698a8, 0x00e69c94, 0x00e69fb5,
+ /* f5 */ 0x00e7aa84, 0x00e7ad96, 0x00e7b4a2, 0x00e98caf,
+ /* f9 */ 0x00e6a19c, 0x00e9aead, 0x00e7acb9, 0x00e58c99,
+ /* fd */ 0x00e5868a, 0x00e588b7,
+
+ /*** Two byte table, leaf: bbxx - offset 0x00aec ***/
+
+ /* a1 */ 0x00e5af9f, 0x00e68bb6, 0x00e692ae, 0x00e693a6,
+ /* a5 */ 0x00e69cad, 0x00e6aeba, 0x00e896a9, 0x00e99b91,
+ /* a9 */ 0x00e79a90, 0x00e9af96, 0x00e68d8c, 0x00e98c86,
+ /* ad */ 0x00e9aeab, 0x00e79abf, 0x00e69992, 0x00e4b889,
+ /* b1 */ 0x00e58298, 0x00e58f82, 0x00e5b1b1, 0x00e683a8,
+ /* b5 */ 0x00e69292, 0x00e695a3, 0x00e6a19f, 0x00e787a6,
+ /* b9 */ 0x00e78f8a, 0x00e794a3, 0x00e7ae97, 0x00e7ba82,
+ /* bd */ 0x00e89a95, 0x00e8ae83, 0x00e8b39b, 0x00e985b8,
+ /* c1 */ 0x00e9a490, 0x00e696ac, 0x00e69aab, 0x00e6ae8b,
+ /* c5 */ 0x00e4bb95, 0x00e4bb94, 0x00e4bcba, 0x00e4bdbf,
+ /* c9 */ 0x00e588ba, 0x00e58fb8, 0x00e58fb2, 0x00e597a3,
+ /* cd */ 0x00e59b9b, 0x00e5a3ab, 0x00e5a78b, 0x00e5a789,
+ /* d1 */ 0x00e5a7bf, 0x00e5ad90, 0x00e5b18d, 0x00e5b882,
+ /* d5 */ 0x00e5b8ab, 0x00e5bf97, 0x00e6809d, 0x00e68c87,
+ /* d9 */ 0x00e694af, 0x00e5ad9c, 0x00e696af, 0x00e696bd,
+ /* dd */ 0x00e697a8, 0x00e69e9d, 0x00e6ada2, 0x00e6adbb,
+ /* e1 */ 0x00e6b08f, 0x00e78d85, 0x00e7a589, 0x00e7a781,
+ /* e5 */ 0x00e7b3b8, 0x00e7b499, 0x00e7b4ab, 0x00e882a2,
+ /* e9 */ 0x00e88482, 0x00e887b3, 0x00e8a696, 0x00e8a99e,
+ /* ed */ 0x00e8a9a9, 0x00e8a9a6, 0x00e8aa8c, 0x00e8abae,
+ /* f1 */ 0x00e8b387, 0x00e8b39c, 0x00e99b8c, 0x00e9a3bc,
+ /* f5 */ 0x00e6adaf, 0x00e4ba8b, 0x00e4bcbc, 0x00e4be8d,
+ /* f9 */ 0x00e58590, 0x00e5ad97, 0x00e5afba, 0x00e68588,
+ /* fd */ 0x00e68c81, 0x00e69982,
+
+ /*** Two byte table, leaf: bcxx - offset 0x00b4a ***/
+
+ /* a1 */ 0x00e6aca1, 0x00e6bb8b, 0x00e6b2bb, 0x00e788be,
+ /* a5 */ 0x00e792bd, 0x00e79794, 0x00e7a381, 0x00e7a4ba,
+ /* a9 */ 0x00e8808c, 0x00e880b3, 0x00e887aa, 0x00e89294,
+ /* ad */ 0x00e8be9e, 0x00e6b190, 0x00e9b9bf, 0x00e5bc8f,
+ /* b1 */ 0x00e8ad98, 0x00e9b4ab, 0x00e7abba, 0x00e8bbb8,
+ /* b5 */ 0x00e5ae8d, 0x00e99bab, 0x00e4b883, 0x00e58fb1,
+ /* b9 */ 0x00e59fb7, 0x00e5a4b1, 0x00e5ab89, 0x00e5aea4,
+ /* bd */ 0x00e68289, 0x00e6b9bf, 0x00e6bc86, 0x00e796be,
+ /* c1 */ 0x00e8b3aa, 0x00e5ae9f, 0x00e89480, 0x00e7afa0,
+ /* c5 */ 0x00e581b2, 0x00e69fb4, 0x00e88a9d, 0x00e5b1a1,
+ /* c9 */ 0x00e8958a, 0x00e7b89e, 0x00e8888e, 0x00e58699,
+ /* cd */ 0x00e5b084, 0x00e68da8, 0x00e8b5a6, 0x00e6969c,
+ /* d1 */ 0x00e785ae, 0x00e7a4be, 0x00e7b497, 0x00e88085,
+ /* d5 */ 0x00e8ac9d, 0x00e8bb8a, 0x00e981ae, 0x00e89b87,
+ /* d9 */ 0x00e982aa, 0x00e5809f, 0x00e58bba, 0x00e5b0ba,
+ /* dd */ 0x00e69d93, 0x00e781bc, 0x00e788b5, 0x00e9858c,
+ /* e1 */ 0x00e98788, 0x00e98cab, 0x00e88ba5, 0x00e5af82,
+ /* e5 */ 0x00e5bcb1, 0x00e683b9, 0x00e4b8bb, 0x00e58f96,
+ /* e9 */ 0x00e5ae88, 0x00e6898b, 0x00e69cb1, 0x00e6ae8a,
+ /* ed */ 0x00e78ba9, 0x00e78fa0, 0x00e7a8ae, 0x00e885ab,
+ /* f1 */ 0x00e8b6a3, 0x00e98592, 0x00e9a696, 0x00e58492,
+ /* f5 */ 0x00e58f97, 0x00e591aa, 0x00e5afbf, 0x00e68e88,
+ /* f9 */ 0x00e6a8b9, 0x00e7b6ac, 0x00e99c80, 0x00e59b9a,
+ /* fd */ 0x00e58f8e, 0x00e591a8,
+
+ /*** Two byte table, leaf: bdxx - offset 0x00ba8 ***/
+
+ /* a1 */ 0x00e5ae97, 0x00e5b0b1, 0x00e5b79e, 0x00e4bfae,
+ /* a5 */ 0x00e68481, 0x00e68bbe, 0x00e6b4b2, 0x00e7a780,
+ /* a9 */ 0x00e7a78b, 0x00e7b582, 0x00e7b98d, 0x00e7bf92,
+ /* ad */ 0x00e887ad, 0x00e8889f, 0x00e89290, 0x00e8a186,
+ /* b1 */ 0x00e8a5b2, 0x00e8ae90, 0x00e8b9b4, 0x00e8bcaf,
+ /* b5 */ 0x00e980b1, 0x00e9858b, 0x00e985ac, 0x00e99b86,
+ /* b9 */ 0x00e9869c, 0x00e4bb80, 0x00e4bd8f, 0x00e58585,
+ /* bd */ 0x00e58d81, 0x00e5be93, 0x00e6888e, 0x00e69f94,
+ /* c1 */ 0x00e6b181, 0x00e6b88b, 0x00e78da3, 0x00e7b8a6,
+ /* c5 */ 0x00e9878d, 0x00e98a83, 0x00e58f94, 0x00e5a499,
+ /* c9 */ 0x00e5aebf, 0x00e6b791, 0x00e7a59d, 0x00e7b8ae,
+ /* cd */ 0x00e7b29b, 0x00e5a1be, 0x00e7869f, 0x00e587ba,
+ /* d1 */ 0x00e8a193, 0x00e8bfb0, 0x00e4bf8a, 0x00e5b3bb,
+ /* d5 */ 0x00e698a5, 0x00e79eac, 0x00e7aba3, 0x00e8889c,
+ /* d9 */ 0x00e9a7bf, 0x00e58786, 0x00e5beaa, 0x00e697ac,
+ /* dd */ 0x00e6a5af, 0x00e6ae89, 0x00e6b7b3, 0x00e6ba96,
+ /* e1 */ 0x00e6bda4, 0x00e79bbe, 0x00e7b494, 0x00e5b7a1,
+ /* e5 */ 0x00e981b5, 0x00e98687, 0x00e9a086, 0x00e587a6,
+ /* e9 */ 0x00e5889d, 0x00e68980, 0x00e69a91, 0x00e69b99,
+ /* ed */ 0x00e6b89a, 0x00e5bab6, 0x00e7b792, 0x00e7bdb2,
+ /* f1 */ 0x00e69bb8, 0x00e896af, 0x00e897b7, 0x00e8abb8,
+ /* f5 */ 0x00e58aa9, 0x00e58f99, 0x00e5a5b3, 0x00e5ba8f,
+ /* f9 */ 0x00e5be90, 0x00e68195, 0x00e98ba4, 0x00e999a4,
+ /* fd */ 0x00e582b7, 0x00e5849f,
+
+ /*** Two byte table, leaf: bexx - offset 0x00c06 ***/
+
+ /* a1 */ 0x00e58b9d, 0x00e58ca0, 0x00e58d87, 0x00e58fac,
+ /* a5 */ 0x00e593a8, 0x00e59586, 0x00e594b1, 0x00e59897,
+ /* a9 */ 0x00e5a5a8, 0x00e5a6be, 0x00e5a8bc, 0x00e5aeb5,
+ /* ad */ 0x00e5b086, 0x00e5b08f, 0x00e5b091, 0x00e5b09a,
+ /* b1 */ 0x00e5ba84, 0x00e5ba8a, 0x00e5bba0, 0x00e5bdb0,
+ /* b5 */ 0x00e689bf, 0x00e68a84, 0x00e68b9b, 0x00e68e8c,
+ /* b9 */ 0x00e68db7, 0x00e69887, 0x00e6988c, 0x00e698ad,
+ /* bd */ 0x00e699b6, 0x00e69dbe, 0x00e6a2a2, 0x00e6a89f,
+ /* c1 */ 0x00e6a8b5, 0x00e6b2bc, 0x00e6b688, 0x00e6b889,
+ /* c5 */ 0x00e6b998, 0x00e784bc, 0x00e784a6, 0x00e785a7,
+ /* c9 */ 0x00e79787, 0x00e79c81, 0x00e7a19d, 0x00e7a481,
+ /* cd */ 0x00e7a5a5, 0x00e7a7b0, 0x00e7aba0, 0x00e7ac91,
+ /* d1 */ 0x00e7b2a7, 0x00e7b4b9, 0x00e88296, 0x00e88f96,
+ /* d5 */ 0x00e8928b, 0x00e89589, 0x00e8a19d, 0x00e8a3b3,
+ /* d9 */ 0x00e8a89f, 0x00e8a8bc, 0x00e8a994, 0x00e8a9b3,
+ /* dd */ 0x00e8b1a1, 0x00e8b39e, 0x00e986a4, 0x00e989a6,
+ /* e1 */ 0x00e98dbe, 0x00e99098, 0x00e99a9c, 0x00e99e98,
+ /* e5 */ 0x00e4b88a, 0x00e4b888, 0x00e4b89e, 0x00e4b997,
+ /* e9 */ 0x00e58697, 0x00e589b0, 0x00e59f8e, 0x00e5a0b4,
+ /* ed */ 0x00e5a38c, 0x00e5aca2, 0x00e5b8b8, 0x00e68385,
+ /* f1 */ 0x00e693be, 0x00e69da1, 0x00e69d96, 0x00e6b584,
+ /* f5 */ 0x00e78ab6, 0x00e795b3, 0x00e7a9a3, 0x00e892b8,
+ /* f9 */ 0x00e8adb2, 0x00e986b8, 0x00e98ca0, 0x00e598b1,
+ /* fd */ 0x00e59fb4, 0x00e9a3be,
+
+ /*** Two byte table, leaf: bfxx - offset 0x00c64 ***/
+
+ /* a1 */ 0x00e68bad, 0x00e6a48d, 0x00e6ae96, 0x00e787ad,
+ /* a5 */ 0x00e7b994, 0x00e881b7, 0x00e889b2, 0x00e8a7a6,
+ /* a9 */ 0x00e9a39f, 0x00e89d95, 0x00e8beb1, 0x00e5b0bb,
+ /* ad */ 0x00e4bcb8, 0x00e4bfa1, 0x00e4beb5, 0x00e59487,
+ /* b1 */ 0x00e5a8a0, 0x00e5af9d, 0x00e5afa9, 0x00e5bf83,
+ /* b5 */ 0x00e6858e, 0x00e68caf, 0x00e696b0, 0x00e6998b,
+ /* b9 */ 0x00e6a3ae, 0x00e6a69b, 0x00e6b5b8, 0x00e6b7b1,
+ /* bd */ 0x00e794b3, 0x00e796b9, 0x00e79c9f, 0x00e7a59e,
+ /* c1 */ 0x00e7a7a6, 0x00e7b4b3, 0x00e887a3, 0x00e88aaf,
+ /* c5 */ 0x00e896aa, 0x00e8a6aa, 0x00e8a8ba, 0x00e8baab,
+ /* c9 */ 0x00e8be9b, 0x00e980b2, 0x00e9879d, 0x00e99c87,
+ /* cd */ 0x00e4baba, 0x00e4bb81, 0x00e58883, 0x00e5a1b5,
+ /* d1 */ 0x00e5a3ac, 0x00e5b08b, 0x00e7949a, 0x00e5b0bd,
+ /* d5 */ 0x00e8858e, 0x00e8a88a, 0x00e8bf85, 0x00e999a3,
+ /* d9 */ 0x00e99dad, 0x00e7aca5, 0x00e8ab8f, 0x00e9a088,
+ /* dd */ 0x00e985a2, 0x00e59bb3, 0x00e58ea8, 0x00e98097,
+ /* e1 */ 0x00e590b9, 0x00e59e82, 0x00e5b8a5, 0x00e68ea8,
+ /* e5 */ 0x00e6b0b4, 0x00e7828a, 0x00e79da1, 0x00e7b28b,
+ /* e9 */ 0x00e7bfa0, 0x00e8a1b0, 0x00e98182, 0x00e98594,
+ /* ed */ 0x00e98c90, 0x00e98c98, 0x00e99a8f, 0x00e7919e,
+ /* f1 */ 0x00e9ab84, 0x00e5b487, 0x00e5b5a9, 0x00e695b0,
+ /* f5 */ 0x00e69ea2, 0x00e8b6a8, 0x00e99b9b, 0x00e68dae,
+ /* f9 */ 0x00e69d89, 0x00e6a499, 0x00e88f85, 0x00e9a097,
+ /* fd */ 0x00e99b80, 0x00e8a3be,
+
+ /*** Two byte table, leaf: c0xx - offset 0x00cc2 ***/
+
+ /* a1 */ 0x00e6be84, 0x00e691ba, 0x00e5afb8, 0x00e4b896,
+ /* a5 */ 0x00e780ac, 0x00e7959d, 0x00e698af, 0x00e58784,
+ /* a9 */ 0x00e588b6, 0x00e58ba2, 0x00e5a793, 0x00e5be81,
+ /* ad */ 0x00e680a7, 0x00e68890, 0x00e694bf, 0x00e695b4,
+ /* b1 */ 0x00e6989f, 0x00e699b4, 0x00e6a3b2, 0x00e6a096,
+ /* b5 */ 0x00e6ada3, 0x00e6b885, 0x00e789b2, 0x00e7949f,
+ /* b9 */ 0x00e79b9b, 0x00e7b2be, 0x00e88196, 0x00e5a3b0,
+ /* bd */ 0x00e8a3bd, 0x00e8a5bf, 0x00e8aaa0, 0x00e8aa93,
+ /* c1 */ 0x00e8ab8b, 0x00e9809d, 0x00e98692, 0x00e99d92,
+ /* c5 */ 0x00e99d99, 0x00e69689, 0x00e7a88e, 0x00e88486,
+ /* c9 */ 0x00e99abb, 0x00e5b8ad, 0x00e6839c, 0x00e6889a,
+ /* cd */ 0x00e696a5, 0x00e69894, 0x00e69e90, 0x00e79fb3,
+ /* d1 */ 0x00e7a98d, 0x00e7b18d, 0x00e7b8be, 0x00e8848a,
+ /* d5 */ 0x00e8b2ac, 0x00e8b5a4, 0x00e8b7a1, 0x00e8b99f,
+ /* d9 */ 0x00e7a2a9, 0x00e58887, 0x00e68b99, 0x00e68ea5,
+ /* dd */ 0x00e69182, 0x00e68a98, 0x00e8a8ad, 0x00e7aa83,
+ /* e1 */ 0x00e7af80, 0x00e8aaac, 0x00e99baa, 0x00e7b5b6,
+ /* e5 */ 0x00e8888c, 0x00e89d89, 0x00e4bb99, 0x00e58588,
+ /* e9 */ 0x00e58d83, 0x00e58da0, 0x00e5aea3, 0x00e5b082,
+ /* ed */ 0x00e5b096, 0x00e5b79d, 0x00e688a6, 0x00e68987,
+ /* f1 */ 0x00e692b0, 0x00e6a093, 0x00e6a0b4, 0x00e6b389,
+ /* f5 */ 0x00e6b585, 0x00e6b497, 0x00e69f93, 0x00e6bd9c,
+ /* f9 */ 0x00e7858e, 0x00e785bd, 0x00e6978b, 0x00e7a9bf,
+ /* fd */ 0x00e7aead, 0x00e7b79a,
+
+ /*** Two byte table, leaf: c1xx - offset 0x00d20 ***/
+
+ /* a1 */ 0x00e7b98a, 0x00e7bea8, 0x00e885ba, 0x00e8889b,
+ /* a5 */ 0x00e888b9, 0x00e896a6, 0x00e8a9ae, 0x00e8b38e,
+ /* a9 */ 0x00e8b7b5, 0x00e981b8, 0x00e981b7, 0x00e98aad,
+ /* ad */ 0x00e98a91, 0x00e99683, 0x00e9aeae, 0x00e5898d,
+ /* b1 */ 0x00e59684, 0x00e6bcb8, 0x00e784b6, 0x00e585a8,
+ /* b5 */ 0x00e7a685, 0x00e7b995, 0x00e886b3, 0x00e7b38e,
+ /* b9 */ 0x00e5998c, 0x00e5a191, 0x00e5b2a8, 0x00e68eaa,
+ /* bd */ 0x00e69bbe, 0x00e69bbd, 0x00e6a59a, 0x00e78b99,
+ /* c1 */ 0x00e7968f, 0x00e7968e, 0x00e7a48e, 0x00e7a596,
+ /* c5 */ 0x00e7a79f, 0x00e7b297, 0x00e7b4a0, 0x00e7b584,
+ /* c9 */ 0x00e89887, 0x00e8a8b4, 0x00e998bb, 0x00e981a1,
+ /* cd */ 0x00e9bca0, 0x00e583a7, 0x00e589b5, 0x00e58f8c,
+ /* d1 */ 0x00e58fa2, 0x00e58089, 0x00e596aa, 0x00e5a3ae,
+ /* d5 */ 0x00e5a58f, 0x00e788bd, 0x00e5ae8b, 0x00e5b1a4,
+ /* d9 */ 0x00e58c9d, 0x00e683a3, 0x00e683b3, 0x00e68d9c,
+ /* dd */ 0x00e68e83, 0x00e68cbf, 0x00e68ebb, 0x00e6938d,
+ /* e1 */ 0x00e697a9, 0x00e69bb9, 0x00e5b7a3, 0x00e6a78d,
+ /* e5 */ 0x00e6a7bd, 0x00e6bc95, 0x00e787a5, 0x00e4ba89,
+ /* e9 */ 0x00e797a9, 0x00e79bb8, 0x00e7aa93, 0x00e7b39f,
+ /* ed */ 0x00e7b78f, 0x00e7b69c, 0x00e881a1, 0x00e88d89,
+ /* f1 */ 0x00e88d98, 0x00e891ac, 0x00e892bc, 0x00e897bb,
+ /* f5 */ 0x00e8a385, 0x00e8b5b0, 0x00e98081, 0x00e981ad,
+ /* f9 */ 0x00e98e97, 0x00e99c9c, 0x00e9a892, 0x00e5838f,
+ /* fd */ 0x00e5a297, 0x00e6868e,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00d7e ***/
+
+ /* a1 */ 0x00e88793, 0x00e894b5, 0x00e8b488, 0x00e980a0,
+ /* a5 */ 0x00e4bf83, 0x00e581b4, 0x00e58987, 0x00e58db3,
+ /* a9 */ 0x00e681af, 0x00e68d89, 0x00e69d9f, 0x00e6b8ac,
+ /* ad */ 0x00e8b6b3, 0x00e9809f, 0x00e4bf97, 0x00e5b19e,
+ /* b1 */ 0x00e8b38a, 0x00e6978f, 0x00e7b69a, 0x00e58d92,
+ /* b5 */ 0x00e8a296, 0x00e585b6, 0x00e68f83, 0x00e5ad98,
+ /* b9 */ 0x00e5adab, 0x00e5b08a, 0x00e6908d, 0x00e69d91,
+ /* bd */ 0x00e9819c, 0x00e4bb96, 0x00e5a49a, 0x00e5a4aa,
+ /* c1 */ 0x00e6b1b0, 0x00e8a991, 0x00e594be, 0x00e5a095,
+ /* c5 */ 0x00e5a6a5, 0x00e683b0, 0x00e68993, 0x00e69f81,
+ /* c9 */ 0x00e888b5, 0x00e6a595, 0x00e99980, 0x00e9a784,
+ /* cd */ 0x00e9a8a8, 0x00e4bd93, 0x00e5a086, 0x00e5afbe,
+ /* d1 */ 0x00e88090, 0x00e5b2b1, 0x00e5b8af, 0x00e5be85,
+ /* d5 */ 0x00e680a0, 0x00e6858b, 0x00e688b4, 0x00e69bbf,
+ /* d9 */ 0x00e6b3b0, 0x00e6bb9e, 0x00e8838e, 0x00e885bf,
+ /* dd */ 0x00e88b94, 0x00e8a28b, 0x00e8b2b8, 0x00e98080,
+ /* e1 */ 0x00e980ae, 0x00e99a8a, 0x00e9bb9b, 0x00e9af9b,
+ /* e5 */ 0x00e4bba3, 0x00e58fb0, 0x00e5a4a7, 0x00e7acac,
+ /* e9 */ 0x00e9868d, 0x00e9a18c, 0x00e9b7b9, 0x00e6bb9d,
+ /* ed */ 0x00e780a7, 0x00e58d93, 0x00e59584, 0x00e5ae85,
+ /* f1 */ 0x00e68998, 0x00e68a9e, 0x00e68b93, 0x00e6b2a2,
+ /* f5 */ 0x00e6bfaf, 0x00e790a2, 0x00e8a897, 0x00e990b8,
+ /* f9 */ 0x00e6bf81, 0x00e8abbe, 0x00e88cb8, 0x00e587a7,
+ /* fd */ 0x00e89bb8, 0x00e58faa,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00ddc ***/
+
+ /* a1 */ 0x00e58fa9, 0x00e4bd86, 0x00e98194, 0x00e8beb0,
+ /* a5 */ 0x00e5a5aa, 0x00e884b1, 0x00e5b7bd, 0x00e7abaa,
+ /* a9 */ 0x00e8bebf, 0x00e6a39a, 0x00e8b0b7, 0x00e78bb8,
+ /* ad */ 0x00e9b188, 0x00e6a8bd, 0x00e8aab0, 0x00e4b8b9,
+ /* b1 */ 0x00e58d98, 0x00e59886, 0x00e59da6, 0x00e68b85,
+ /* b5 */ 0x00e68ea2, 0x00e697a6, 0x00e6ad8e, 0x00e6b7a1,
+ /* b9 */ 0x00e6b99b, 0x00e782ad, 0x00e79fad, 0x00e7abaf,
+ /* bd */ 0x00e7aeaa, 0x00e7b6bb, 0x00e880bd, 0x00e88386,
+ /* c1 */ 0x00e89b8b, 0x00e8aa95, 0x00e98d9b, 0x00e59ba3,
+ /* c5 */ 0x00e5a387, 0x00e5bcbe, 0x00e696ad, 0x00e69a96,
+ /* c9 */ 0x00e6aa80, 0x00e6aeb5, 0x00e794b7, 0x00e8ab87,
+ /* cd */ 0x00e580a4, 0x00e79fa5, 0x00e59cb0, 0x00e5bc9b,
+ /* d1 */ 0x00e681a5, 0x00e699ba, 0x00e6b1a0, 0x00e797b4,
+ /* d5 */ 0x00e7a89a, 0x00e7bdae, 0x00e887b4, 0x00e89c98,
+ /* d9 */ 0x00e98185, 0x00e9a6b3, 0x00e7af89, 0x00e7959c,
+ /* dd */ 0x00e7abb9, 0x00e7ad91, 0x00e89384, 0x00e98090,
+ /* e1 */ 0x00e7a7a9, 0x00e7aa92, 0x00e88cb6, 0x00e5aba1,
+ /* e5 */ 0x00e79d80, 0x00e4b8ad, 0x00e4bbb2, 0x00e5ae99,
+ /* e9 */ 0x00e5bfa0, 0x00e68abd, 0x00e698bc, 0x00e69fb1,
+ /* ed */ 0x00e6b3a8, 0x00e899ab, 0x00e8a1b7, 0x00e8a8bb,
+ /* f1 */ 0x00e9858e, 0x00e98bb3, 0x00e9a790, 0x00e6a897,
+ /* f5 */ 0x00e780a6, 0x00e78caa, 0x00e88ba7, 0x00e89197,
+ /* f9 */ 0x00e8b2af, 0x00e4b881, 0x00e58586, 0x00e5878b,
+ /* fd */ 0x00e5968b, 0x00e5afb5,
+
+ /*** Two byte table, leaf: c4xx - offset 0x00e3a ***/
+
+ /* a1 */ 0x00e5b896, 0x00e5b8b3, 0x00e5ba81, 0x00e5bc94,
+ /* a5 */ 0x00e5bcb5, 0x00e5bdab, 0x00e5beb4, 0x00e687b2,
+ /* a9 */ 0x00e68c91, 0x00e69aa2, 0x00e69c9d, 0x00e6bdae,
+ /* ad */ 0x00e78992, 0x00e794ba, 0x00e79cba, 0x00e881b4,
+ /* b1 */ 0x00e884b9, 0x00e885b8, 0x00e89db6, 0x00e8aabf,
+ /* b5 */ 0x00e8ab9c, 0x00e8b685, 0x00e8b7b3, 0x00e98a9a,
+ /* b9 */ 0x00e995b7, 0x00e9a082, 0x00e9b3a5, 0x00e58b85,
+ /* bd */ 0x00e68d97, 0x00e79bb4, 0x00e69c95, 0x00e6b288,
+ /* c1 */ 0x00e78f8d, 0x00e8b383, 0x00e98eae, 0x00e999b3,
+ /* c5 */ 0x00e6b4a5, 0x00e5a29c, 0x00e6a48e, 0x00e6a78c,
+ /* c9 */ 0x00e8bfbd, 0x00e98e9a, 0x00e7979b, 0x00e9809a,
+ /* cd */ 0x00e5a19a, 0x00e6a082, 0x00e68eb4, 0x00e6a7bb,
+ /* d1 */ 0x00e4bd83, 0x00e6bcac, 0x00e69f98, 0x00e8bebb,
+ /* d5 */ 0x00e894a6, 0x00e7b6b4, 0x00e98d94, 0x00e6a4bf,
+ /* d9 */ 0x00e6bdb0, 0x00e59daa, 0x00e5a3b7, 0x00e5acac,
+ /* dd */ 0x00e7b4ac, 0x00e788aa, 0x00e5908a, 0x00e987a3,
+ /* e1 */ 0x00e9b6b4, 0x00e4baad, 0x00e4bd8e, 0x00e5819c,
+ /* e5 */ 0x00e581b5, 0x00e58983, 0x00e8b29e, 0x00e59188,
+ /* e9 */ 0x00e5a0a4, 0x00e5ae9a, 0x00e5b89d, 0x00e5ba95,
+ /* ed */ 0x00e5baad, 0x00e5bbb7, 0x00e5bc9f, 0x00e6828c,
+ /* f1 */ 0x00e68ab5, 0x00e68cba, 0x00e68f90, 0x00e6a2af,
+ /* f5 */ 0x00e6b180, 0x00e7a287, 0x00e7a68e, 0x00e7a88b,
+ /* f9 */ 0x00e7b7a0, 0x00e88987, 0x00e8a882, 0x00e8aba6,
+ /* fd */ 0x00e8b984, 0x00e98093,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00e98 ***/
+
+ /* a1 */ 0x00e982b8, 0x00e984ad, 0x00e98798, 0x00e9bc8e,
+ /* a5 */ 0x00e6b3a5, 0x00e69198, 0x00e693a2, 0x00e695b5,
+ /* a9 */ 0x00e6bbb4, 0x00e79a84, 0x00e7ac9b, 0x00e981a9,
+ /* ad */ 0x00e98f91, 0x00e6baba, 0x00e593b2, 0x00e5beb9,
+ /* b1 */ 0x00e692a4, 0x00e8bd8d, 0x00e8bfad, 0x00e98984,
+ /* b5 */ 0x00e585b8, 0x00e5a1ab, 0x00e5a4a9, 0x00e5b195,
+ /* b9 */ 0x00e5ba97, 0x00e6b7bb, 0x00e7ba8f, 0x00e7949c,
+ /* bd */ 0x00e8b2bc, 0x00e8bba2, 0x00e9a19b, 0x00e782b9,
+ /* c1 */ 0x00e4bc9d, 0x00e6aebf, 0x00e6beb1, 0x00e794b0,
+ /* c5 */ 0x00e99bbb, 0x00e5858e, 0x00e59090, 0x00e5a0b5,
+ /* c9 */ 0x00e5a197, 0x00e5a6ac, 0x00e5b1a0, 0x00e5be92,
+ /* cd */ 0x00e69697, 0x00e69d9c, 0x00e6b8a1, 0x00e799bb,
+ /* d1 */ 0x00e88f9f, 0x00e8b3ad, 0x00e98094, 0x00e983bd,
+ /* d5 */ 0x00e98d8d, 0x00e7a0a5, 0x00e7a0ba, 0x00e58aaa,
+ /* d9 */ 0x00e5baa6, 0x00e59c9f, 0x00e5a5b4, 0x00e68092,
+ /* dd */ 0x00e58092, 0x00e5859a, 0x00e586ac, 0x00e5878d,
+ /* e1 */ 0x00e58880, 0x00e59490, 0x00e5a194, 0x00e5a198,
+ /* e5 */ 0x00e5a597, 0x00e5ae95, 0x00e5b3b6, 0x00e5b68b,
+ /* e9 */ 0x00e682bc, 0x00e68a95, 0x00e690ad, 0x00e69db1,
+ /* ed */ 0x00e6a183, 0x00e6a2bc, 0x00e6a39f, 0x00e79b97,
+ /* f1 */ 0x00e6b798, 0x00e6b9af, 0x00e6b69b, 0x00e781af,
+ /* f5 */ 0x00e78788, 0x00e5bd93, 0x00e79798, 0x00e7a5b7,
+ /* f9 */ 0x00e7ad89, 0x00e7ad94, 0x00e7ad92, 0x00e7b396,
+ /* fd */ 0x00e7b5b1, 0x00e588b0,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00ef6 ***/
+
+ /* a1 */ 0x00e891a3, 0x00e895a9, 0x00e897a4, 0x00e8a88e,
+ /* a5 */ 0x00e8ac84, 0x00e8b186, 0x00e8b88f, 0x00e98083,
+ /* a9 */ 0x00e9808f, 0x00e99099, 0x00e999b6, 0x00e9a0ad,
+ /* ad */ 0x00e9a8b0, 0x00e99798, 0x00e5838d, 0x00e58b95,
+ /* b1 */ 0x00e5908c, 0x00e5a082, 0x00e5b08e, 0x00e686a7,
+ /* b5 */ 0x00e6929e, 0x00e6b49e, 0x00e79eb3, 0x00e7aba5,
+ /* b9 */ 0x00e883b4, 0x00e89084, 0x00e98193, 0x00e98a85,
+ /* bd */ 0x00e5b3a0, 0x00e9b487, 0x00e58cbf, 0x00e5be97,
+ /* c1 */ 0x00e5beb3, 0x00e6b69c, 0x00e789b9, 0x00e79da3,
+ /* c5 */ 0x00e7a6bf, 0x00e7afa4, 0x00e6af92, 0x00e78bac,
+ /* c9 */ 0x00e8aaad, 0x00e6a083, 0x00e6a9a1, 0x00e587b8,
+ /* cd */ 0x00e7aa81, 0x00e6a4b4, 0x00e5b18a, 0x00e9b3b6,
+ /* d1 */ 0x00e88bab, 0x00e5af85, 0x00e98589, 0x00e7809e,
+ /* d5 */ 0x00e599b8, 0x00e5b1af, 0x00e68387, 0x00e695a6,
+ /* d9 */ 0x00e6b28c, 0x00e8b19a, 0x00e98181, 0x00e9a093,
+ /* dd */ 0x00e59191, 0x00e69b87, 0x00e9888d, 0x00e5a588,
+ /* e1 */ 0x00e982a3, 0x00e58685, 0x00e4b98d, 0x00e587aa,
+ /* e5 */ 0x00e89699, 0x00e8ac8e, 0x00e78198, 0x00e68dba,
+ /* e9 */ 0x00e98d8b, 0x00e6a5a2, 0x00e9a6b4, 0x00e7b884,
+ /* ed */ 0x00e795b7, 0x00e58d97, 0x00e6a5a0, 0x00e8bb9f,
+ /* f1 */ 0x00e99ba3, 0x00e6b19d, 0x00e4ba8c, 0x00e5b0bc,
+ /* f5 */ 0x00e5bc90, 0x00e8bfa9, 0x00e58c82, 0x00e8b391,
+ /* f9 */ 0x00e88289, 0x00e899b9, 0x00e5bbbf, 0x00e697a5,
+ /* fd */ 0x00e4b9b3, 0x00e585a5,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00f54 ***/
+
+ /* a1 */ 0x00e5a682, 0x00e5b0bf, 0x00e99fae, 0x00e4bbbb,
+ /* a5 */ 0x00e5a68a, 0x00e5bf8d, 0x00e8aa8d, 0x00e6bfa1,
+ /* a9 */ 0x00e7a6b0, 0x00e7a5a2, 0x00e5afa7, 0x00e891b1,
+ /* ad */ 0x00e78cab, 0x00e786b1, 0x00e5b9b4, 0x00e5bfb5,
+ /* b1 */ 0x00e68dbb, 0x00e6929a, 0x00e78783, 0x00e7b298,
+ /* b5 */ 0x00e4b983, 0x00e5bbbc, 0x00e4b98b, 0x00e59f9c,
+ /* b9 */ 0x00e59aa2, 0x00e682a9, 0x00e6bf83, 0x00e7b48d,
+ /* bd */ 0x00e883bd, 0x00e884b3, 0x00e886bf, 0x00e8beb2,
+ /* c1 */ 0x00e8a697, 0x00e89aa4, 0x00e5b7b4, 0x00e68a8a,
+ /* c5 */ 0x00e692ad, 0x00e8a687, 0x00e69db7, 0x00e6b3a2,
+ /* c9 */ 0x00e6b4be, 0x00e790b6, 0x00e7a0b4, 0x00e5a986,
+ /* cd */ 0x00e7bdb5, 0x00e88aad, 0x00e9a6ac, 0x00e4bfb3,
+ /* d1 */ 0x00e5bb83, 0x00e68b9d, 0x00e68e92, 0x00e69597,
+ /* d5 */ 0x00e69daf, 0x00e79b83, 0x00e7898c, 0x00e8838c,
+ /* d9 */ 0x00e882ba, 0x00e8bca9, 0x00e9858d, 0x00e5808d,
+ /* dd */ 0x00e59fb9, 0x00e5aa92, 0x00e6a285, 0x00e6a5b3,
+ /* e1 */ 0x00e785a4, 0x00e78bbd, 0x00e8b2b7, 0x00e5a3b2,
+ /* e5 */ 0x00e8b3a0, 0x00e999aa, 0x00e98099, 0x00e89dbf,
+ /* e9 */ 0x00e7a7a4, 0x00e79fa7, 0x00e890a9, 0x00e4bcaf,
+ /* ed */ 0x00e589a5, 0x00e58d9a, 0x00e68b8d, 0x00e69f8f,
+ /* f1 */ 0x00e6b38a, 0x00e799bd, 0x00e7ae94, 0x00e7b295,
+ /* f5 */ 0x00e888b6, 0x00e89684, 0x00e8bfab, 0x00e69b9d,
+ /* f9 */ 0x00e6bca0, 0x00e78886, 0x00e7b89b, 0x00e88eab,
+ /* fd */ 0x00e9a781, 0x00e9baa6,
+
+ /*** Two byte table, leaf: c8xx - offset 0x00fb2 ***/
+
+ /* a1 */ 0x00e587bd, 0x00e7aeb1, 0x00e7a1b2, 0x00e7aeb8,
+ /* a5 */ 0x00e88287, 0x00e7ad88, 0x00e6aba8, 0x00e5b9a1,
+ /* a9 */ 0x00e8828c, 0x00e79591, 0x00e795a0, 0x00e585ab,
+ /* ad */ 0x00e989a2, 0x00e6ba8c, 0x00e799ba, 0x00e98697,
+ /* b1 */ 0x00e9abaa, 0x00e4bc90, 0x00e7bdb0, 0x00e68a9c,
+ /* b5 */ 0x00e7ad8f, 0x00e996a5, 0x00e9b3a9, 0x00e599ba,
+ /* b9 */ 0x00e5a199, 0x00e89ba4, 0x00e99abc, 0x00e4bcb4,
+ /* bd */ 0x00e588a4, 0x00e58d8a, 0x00e58f8d, 0x00e58f9b,
+ /* c1 */ 0x00e5b886, 0x00e690ac, 0x00e69691, 0x00e69dbf,
+ /* c5 */ 0x00e6b0be, 0x00e6b18e, 0x00e78988, 0x00e78aaf,
+ /* c9 */ 0x00e78fad, 0x00e79594, 0x00e7b981, 0x00e888ac,
+ /* cd */ 0x00e897a9, 0x00e8b2a9, 0x00e7af84, 0x00e98786,
+ /* d1 */ 0x00e785a9, 0x00e9a092, 0x00e9a3af, 0x00e68cbd,
+ /* d5 */ 0x00e699a9, 0x00e795aa, 0x00e79ba4, 0x00e7a390,
+ /* d9 */ 0x00e89583, 0x00e89bae, 0x00e58caa, 0x00e58d91,
+ /* dd */ 0x00e590a6, 0x00e5a683, 0x00e5ba87, 0x00e5bdbc,
+ /* e1 */ 0x00e682b2, 0x00e68989, 0x00e689b9, 0x00e68aab,
+ /* e5 */ 0x00e69690, 0x00e6af94, 0x00e6b38c, 0x00e796b2,
+ /* e9 */ 0x00e79aae, 0x00e7a291, 0x00e7a798, 0x00e7b78b,
+ /* ed */ 0x00e7bdb7, 0x00e882a5, 0x00e8a2ab, 0x00e8aab9,
+ /* f1 */ 0x00e8b2bb, 0x00e981bf, 0x00e99d9e, 0x00e9a39b,
+ /* f5 */ 0x00e6a88b, 0x00e7b0b8, 0x00e58299, 0x00e5b0be,
+ /* f9 */ 0x00e5beae, 0x00e69e87, 0x00e6af98, 0x00e790b5,
+ /* fd */ 0x00e79c89, 0x00e7be8e,
+
+ /*** Two byte table, leaf: c9xx - offset 0x01010 ***/
+
+ /* a1 */ 0x00e9bcbb, 0x00e69f8a, 0x00e7a897, 0x00e58cb9,
+ /* a5 */ 0x00e7968b, 0x00e9abad, 0x00e5bda6, 0x00e8869d,
+ /* a9 */ 0x00e88fb1, 0x00e88298, 0x00e5bcbc, 0x00e5bf85,
+ /* ad */ 0x00e795a2, 0x00e7ad86, 0x00e980bc, 0x00e6a1a7,
+ /* b1 */ 0x00e5a7ab, 0x00e5aa9b, 0x00e7b490, 0x00e799be,
+ /* b5 */ 0x00e8acac, 0x00e4bfb5, 0x00e5bdaa, 0x00e6a899,
+ /* b9 */ 0x00e6b0b7, 0x00e6bc82, 0x00e793a2, 0x00e7a5a8,
+ /* bd */ 0x00e8a1a8, 0x00e8a995, 0x00e8b1b9, 0x00e5bb9f,
+ /* c1 */ 0x00e68f8f, 0x00e79785, 0x00e7a792, 0x00e88b97,
+ /* c5 */ 0x00e98ca8, 0x00e98bb2, 0x00e8929c, 0x00e89bad,
+ /* c9 */ 0x00e9b0ad, 0x00e59381, 0x00e5bdac, 0x00e6968c,
+ /* cd */ 0x00e6b59c, 0x00e78095, 0x00e8b2a7, 0x00e8b393,
+ /* d1 */ 0x00e9a0bb, 0x00e6958f, 0x00e793b6, 0x00e4b88d,
+ /* d5 */ 0x00e4bb98, 0x00e59fa0, 0x00e5a4ab, 0x00e5a9a6,
+ /* d9 */ 0x00e5af8c, 0x00e586a8, 0x00e5b883, 0x00e5ba9c,
+ /* dd */ 0x00e68096, 0x00e689b6, 0x00e695b7, 0x00e696a7,
+ /* e1 */ 0x00e699ae, 0x00e6b5ae, 0x00e788b6, 0x00e7aca6,
+ /* e5 */ 0x00e88590, 0x00e8869a, 0x00e88a99, 0x00e8ad9c,
+ /* e9 */ 0x00e8b2a0, 0x00e8b3a6, 0x00e8b5b4, 0x00e9989c,
+ /* ed */ 0x00e99984, 0x00e4beae, 0x00e692ab, 0x00e6ada6,
+ /* f1 */ 0x00e8889e, 0x00e891a1, 0x00e895aa, 0x00e983a8,
+ /* f5 */ 0x00e5b081, 0x00e6a593, 0x00e9a2a8, 0x00e891ba,
+ /* f9 */ 0x00e89597, 0x00e4bc8f, 0x00e589af, 0x00e5bea9,
+ /* fd */ 0x00e5b985, 0x00e69c8d,
+
+ /*** Two byte table, leaf: caxx - offset 0x0106e ***/
+
+ /* a1 */ 0x00e7a68f, 0x00e885b9, 0x00e8a487, 0x00e8a686,
+ /* a5 */ 0x00e6b7b5, 0x00e5bc97, 0x00e68995, 0x00e6b2b8,
+ /* a9 */ 0x00e4bb8f, 0x00e789a9, 0x00e9ae92, 0x00e58886,
+ /* ad */ 0x00e590bb, 0x00e599b4, 0x00e5a2b3, 0x00e686a4,
+ /* b1 */ 0x00e689ae, 0x00e7849a, 0x00e5a5ae, 0x00e7b289,
+ /* b5 */ 0x00e7b39e, 0x00e7b49b, 0x00e99bb0, 0x00e69687,
+ /* b9 */ 0x00e8819e, 0x00e4b899, 0x00e4bdb5, 0x00e585b5,
+ /* bd */ 0x00e5a180, 0x00e5b9a3, 0x00e5b9b3, 0x00e5bc8a,
+ /* c1 */ 0x00e69f84, 0x00e4b8a6, 0x00e894bd, 0x00e99689,
+ /* c5 */ 0x00e9999b, 0x00e7b1b3, 0x00e9a081, 0x00e583bb,
+ /* c9 */ 0x00e5a381, 0x00e79996, 0x00e7a2a7, 0x00e588a5,
+ /* cd */ 0x00e79ea5, 0x00e89491, 0x00e7ae86, 0x00e5818f,
+ /* d1 */ 0x00e5a489, 0x00e78987, 0x00e7af87, 0x00e7b7a8,
+ /* d5 */ 0x00e8beba, 0x00e8bf94, 0x00e9818d, 0x00e4bebf,
+ /* d9 */ 0x00e58b89, 0x00e5a8a9, 0x00e5bc81, 0x00e99ead,
+ /* dd */ 0x00e4bf9d, 0x00e88897, 0x00e98baa, 0x00e59c83,
+ /* e1 */ 0x00e68d95, 0x00e6ada9, 0x00e794ab, 0x00e8a39c,
+ /* e5 */ 0x00e8bc94, 0x00e7a982, 0x00e58b9f, 0x00e5a293,
+ /* e9 */ 0x00e68595, 0x00e6888a, 0x00e69aae, 0x00e6af8d,
+ /* ed */ 0x00e7b0bf, 0x00e88fa9, 0x00e580a3, 0x00e4bfb8,
+ /* f1 */ 0x00e58c85, 0x00e59186, 0x00e5a0b1, 0x00e5a589,
+ /* f5 */ 0x00e5ae9d, 0x00e5b3b0, 0x00e5b3af, 0x00e5b4a9,
+ /* f9 */ 0x00e5ba96, 0x00e68ab1, 0x00e68da7, 0x00e694be,
+ /* fd */ 0x00e696b9, 0x00e69c8b,
+
+ /*** Two byte table, leaf: cbxx - offset 0x010cc ***/
+
+ /* a1 */ 0x00e6b395, 0x00e6b3a1, 0x00e783b9, 0x00e7a0b2,
+ /* a5 */ 0x00e7b8ab, 0x00e8839e, 0x00e88ab3, 0x00e8908c,
+ /* a9 */ 0x00e893ac, 0x00e89c82, 0x00e8a492, 0x00e8a8aa,
+ /* ad */ 0x00e8b18a, 0x00e982a6, 0x00e98b92, 0x00e9a3bd,
+ /* b1 */ 0x00e9b3b3, 0x00e9b5ac, 0x00e4b98f, 0x00e4baa1,
+ /* b5 */ 0x00e5828d, 0x00e58996, 0x00e59d8a, 0x00e5a6a8,
+ /* b9 */ 0x00e5b8bd, 0x00e5bf98, 0x00e5bf99, 0x00e688bf,
+ /* bd */ 0x00e69ab4, 0x00e69c9b, 0x00e69f90, 0x00e6a392,
+ /* c1 */ 0x00e58692, 0x00e7b4a1, 0x00e882aa, 0x00e886a8,
+ /* c5 */ 0x00e8ac80, 0x00e8b28c, 0x00e8b2bf, 0x00e989be,
+ /* c9 */ 0x00e998b2, 0x00e590a0, 0x00e9a0ac, 0x00e58c97,
+ /* cd */ 0x00e58395, 0x00e58d9c, 0x00e5a2a8, 0x00e692b2,
+ /* d1 */ 0x00e69cb4, 0x00e789a7, 0x00e79da6, 0x00e7a986,
+ /* d5 */ 0x00e987a6, 0x00e58b83, 0x00e6b2a1, 0x00e6ae86,
+ /* d9 */ 0x00e5a080, 0x00e5b98c, 0x00e5a594, 0x00e69cac,
+ /* dd */ 0x00e7bfbb, 0x00e587a1, 0x00e79b86, 0x00e691a9,
+ /* e1 */ 0x00e7a3a8, 0x00e9ad94, 0x00e9babb, 0x00e59f8b,
+ /* e5 */ 0x00e5a6b9, 0x00e698a7, 0x00e69e9a, 0x00e6af8e,
+ /* e9 */ 0x00e593a9, 0x00e6a799, 0x00e5b995, 0x00e8869c,
+ /* ed */ 0x00e69e95, 0x00e9aeaa, 0x00e69fbe, 0x00e9b192,
+ /* f1 */ 0x00e6a19d, 0x00e4baa6, 0x00e4bfa3, 0x00e58f88,
+ /* f5 */ 0x00e68ab9, 0x00e69cab, 0x00e6b2ab, 0x00e8bf84,
+ /* f9 */ 0x00e4bead, 0x00e7b9ad, 0x00e9babf, 0x00e4b887,
+ /* fd */ 0x00e685a2, 0x00e6ba80,
+
+ /*** Two byte table, leaf: ccxx - offset 0x0112a ***/
+
+ /* a1 */ 0x00e6bcab, 0x00e89493, 0x00e591b3, 0x00e69caa,
+ /* a5 */ 0x00e9ad85, 0x00e5b7b3, 0x00e7ae95, 0x00e5b2ac,
+ /* a9 */ 0x00e5af86, 0x00e89c9c, 0x00e6b98a, 0x00e89391,
+ /* ad */ 0x00e7a894, 0x00e88488, 0x00e5a699, 0x00e7b28d,
+ /* b1 */ 0x00e6b091, 0x00e79ca0, 0x00e58b99, 0x00e5a4a2,
+ /* b5 */ 0x00e784a1, 0x00e7899f, 0x00e79f9b, 0x00e99ca7,
+ /* b9 */ 0x00e9b5a1, 0x00e6a48b, 0x00e5a9bf, 0x00e5a898,
+ /* bd */ 0x00e586a5, 0x00e5908d, 0x00e591bd, 0x00e6988e,
+ /* c1 */ 0x00e79b9f, 0x00e8bfb7, 0x00e98a98, 0x00e9b3b4,
+ /* c5 */ 0x00e5a7aa, 0x00e7899d, 0x00e6bb85, 0x00e5858d,
+ /* c9 */ 0x00e6a389, 0x00e7b6bf, 0x00e7b7ac, 0x00e99da2,
+ /* cd */ 0x00e9baba, 0x00e691b8, 0x00e6a8a1, 0x00e88c82,
+ /* d1 */ 0x00e5a684, 0x00e5ad9f, 0x00e6af9b, 0x00e78c9b,
+ /* d5 */ 0x00e79bb2, 0x00e7b6b2, 0x00e88097, 0x00e89299,
+ /* d9 */ 0x00e584b2, 0x00e69ca8, 0x00e9bb99, 0x00e79bae,
+ /* dd */ 0x00e69da2, 0x00e58bbf, 0x00e9a485, 0x00e5b0a4,
+ /* e1 */ 0x00e688bb, 0x00e7b1be, 0x00e8b2b0, 0x00e5958f,
+ /* e5 */ 0x00e682b6, 0x00e7b48b, 0x00e99680, 0x00e58c81,
+ /* e9 */ 0x00e4b99f, 0x00e586b6, 0x00e5a49c, 0x00e788ba,
+ /* ed */ 0x00e880b6, 0x00e9878e, 0x00e5bca5, 0x00e79fa2,
+ /* f1 */ 0x00e58e84, 0x00e5bdb9, 0x00e7b484, 0x00e896ac,
+ /* f5 */ 0x00e8a8b3, 0x00e8ba8d, 0x00e99d96, 0x00e69fb3,
+ /* f9 */ 0x00e896ae, 0x00e99193, 0x00e68489, 0x00e68488,
+ /* fd */ 0x00e6b2b9, 0x00e79992,
+
+ /*** Two byte table, leaf: cdxx - offset 0x01188 ***/
+
+ /* a1 */ 0x00e8abad, 0x00e8bcb8, 0x00e594af, 0x00e4bd91,
+ /* a5 */ 0x00e584aa, 0x00e58b87, 0x00e58f8b, 0x00e5aea5,
+ /* a9 */ 0x00e5b9bd, 0x00e682a0, 0x00e68682, 0x00e68f96,
+ /* ad */ 0x00e69c89, 0x00e69f9a, 0x00e6b9a7, 0x00e6b68c,
+ /* b1 */ 0x00e78cb6, 0x00e78cb7, 0x00e794b1, 0x00e7a590,
+ /* b5 */ 0x00e8a395, 0x00e8aa98, 0x00e9818a, 0x00e98291,
+ /* b9 */ 0x00e983b5, 0x00e99b84, 0x00e89e8d, 0x00e5a495,
+ /* bd */ 0x00e4ba88, 0x00e4bd99, 0x00e4b88e, 0x00e8aa89,
+ /* c1 */ 0x00e8bcbf, 0x00e9a090, 0x00e582ad, 0x00e5b9bc,
+ /* c5 */ 0x00e5a696, 0x00e5aeb9, 0x00e5bab8, 0x00e68f9a,
+ /* c9 */ 0x00e68fba, 0x00e69381, 0x00e69b9c, 0x00e6a58a,
+ /* cd */ 0x00e6a798, 0x00e6b48b, 0x00e6bab6, 0x00e78694,
+ /* d1 */ 0x00e794a8, 0x00e7aaaf, 0x00e7be8a, 0x00e88080,
+ /* d5 */ 0x00e89189, 0x00e89389, 0x00e8a681, 0x00e8aca1,
+ /* d9 */ 0x00e8b88a, 0x00e981a5, 0x00e999bd, 0x00e9a48a,
+ /* dd */ 0x00e685be, 0x00e68a91, 0x00e6acb2, 0x00e6b283,
+ /* e1 */ 0x00e6b5b4, 0x00e7bf8c, 0x00e7bfbc, 0x00e6b780,
+ /* e5 */ 0x00e7be85, 0x00e89eba, 0x00e8a3b8, 0x00e69da5,
+ /* e9 */ 0x00e88eb1, 0x00e9a0bc, 0x00e99bb7, 0x00e6b49b,
+ /* ed */ 0x00e7b5a1, 0x00e890bd, 0x00e985aa, 0x00e4b9b1,
+ /* f1 */ 0x00e58db5, 0x00e5b590, 0x00e6ac84, 0x00e6bfab,
+ /* f5 */ 0x00e8978d, 0x00e898ad, 0x00e8a6a7, 0x00e588a9,
+ /* f9 */ 0x00e5908f, 0x00e5b1a5, 0x00e69d8e, 0x00e6a2a8,
+ /* fd */ 0x00e79086, 0x00e79283,
+
+ /*** Two byte table, leaf: cexx - offset 0x011e6 ***/
+
+ /* a1 */ 0x00e797a2, 0x00e8a38f, 0x00e8a3a1, 0x00e9878c,
+ /* a5 */ 0x00e99ba2, 0x00e999b8, 0x00e5be8b, 0x00e78e87,
+ /* a9 */ 0x00e7ab8b, 0x00e8918e, 0x00e68ea0, 0x00e795a5,
+ /* ad */ 0x00e58a89, 0x00e6b581, 0x00e6ba9c, 0x00e79089,
+ /* b1 */ 0x00e79599, 0x00e7a1ab, 0x00e7b292, 0x00e99a86,
+ /* b5 */ 0x00e7ab9c, 0x00e9be8d, 0x00e4beb6, 0x00e685ae,
+ /* b9 */ 0x00e69785, 0x00e8999c, 0x00e4ba86, 0x00e4baae,
+ /* bd */ 0x00e5839a, 0x00e4b8a1, 0x00e5878c, 0x00e5afae,
+ /* c1 */ 0x00e69699, 0x00e6a281, 0x00e6b6bc, 0x00e78c9f,
+ /* c5 */ 0x00e79982, 0x00e79ead, 0x00e7a89c, 0x00e7b3a7,
+ /* c9 */ 0x00e889af, 0x00e8ab92, 0x00e981bc, 0x00e9878f,
+ /* cd */ 0x00e999b5, 0x00e9a098, 0x00e58a9b, 0x00e7b791,
+ /* d1 */ 0x00e580ab, 0x00e58e98, 0x00e69e97, 0x00e6b78b,
+ /* d5 */ 0x00e78790, 0x00e790b3, 0x00e887a8, 0x00e8bcaa,
+ /* d9 */ 0x00e99aa3, 0x00e9b197, 0x00e9ba9f, 0x00e791a0,
+ /* dd */ 0x00e5a181, 0x00e6b699, 0x00e7b4af, 0x00e9a19e,
+ /* e1 */ 0x00e4bba4, 0x00e4bcb6, 0x00e4be8b, 0x00e586b7,
+ /* e5 */ 0x00e58ab1, 0x00e5b6ba, 0x00e6809c, 0x00e78eb2,
+ /* e9 */ 0x00e7a4bc, 0x00e88b93, 0x00e988b4, 0x00e99ab7,
+ /* ed */ 0x00e99bb6, 0x00e99c8a, 0x00e9ba97, 0x00e9bda2,
+ /* f1 */ 0x00e69aa6, 0x00e6adb4, 0x00e58897, 0x00e58aa3,
+ /* f5 */ 0x00e78388, 0x00e8a382, 0x00e5bb89, 0x00e6818b,
+ /* f9 */ 0x00e68690, 0x00e6bca3, 0x00e78589, 0x00e7b0be,
+ /* fd */ 0x00e7b7b4, 0x00e881af,
+
+ /*** Two byte table, leaf: cfxx - offset 0x01244 ***/
+
+ /* a1 */ 0x00e893ae, 0x00e980a3, 0x00e98cac, 0x00e59182,
+ /* a5 */ 0x00e9adaf, 0x00e6ab93, 0x00e78289, 0x00e8b382,
+ /* a9 */ 0x00e8b7af, 0x00e99cb2, 0x00e58ab4, 0x00e5a981,
+ /* ad */ 0x00e5bb8a, 0x00e5bc84, 0x00e69c97, 0x00e6a5bc,
+ /* b1 */ 0x00e6a694, 0x00e6b5aa, 0x00e6bc8f, 0x00e789a2,
+ /* b5 */ 0x00e78bbc, 0x00e7afad, 0x00e88081, 0x00e881be,
+ /* b9 */ 0x00e89d8b, 0x00e9838e, 0x00e585ad, 0x00e9ba93,
+ /* bd */ 0x00e7a684, 0x00e8828b, 0x00e98cb2, 0x00e8ab96,
+ /* c1 */ 0x00e580ad, 0x00e5928c, 0x00e8a9b1, 0x00e6adaa,
+ /* c5 */ 0x00e8b384, 0x00e88487, 0x00e68391, 0x00e69ea0,
+ /* c9 */ 0x00e9b7b2, 0x00e4ba99, 0x00e4ba98, 0x00e9b090,
+ /* cd */ 0x00e8a9ab, 0x00e89781, 0x00e895a8, 0x00e6a480,
+ /* d1 */ 0x00e6b9be, 0x00e7a297, 0x00e88595, 0xf0a0ae9f,
+ /* d5 */ 0x00e5ad81, 0x00e5ad96, 0x00e5adbd, 0x00e5ae93,
+ /* d9 */ 0x00e5af98, 0x00e5afac, 0x00e5b092, 0x00e5b09e,
+ /* dd */ 0x00e5b0a3, 0x00e5b0ab, 0x00e39e8d, 0x00e5b1a2,
+ /* e1 */ 0x00efa8bb, 0x00efa8bc, 0xf0a19ab4, 0x00e5b1ba,
+ /* e5 */ 0x00e5b28f, 0x00e5b29f, 0x00e5b2a3, 0x00e5b2aa,
+ /* e9 */ 0x00e5b2ba, 0x00e5b38b, 0x00e5b390, 0x00e5b392,
+ /* ed */ 0x00e5b3b4, 0xf0a1b8b4, 0x00e39fa2, 0x00e5b48d,
+ /* f1 */ 0x00e5b4a7, 0x00efa891, 0x00e5b586, 0x00e5b587,
+ /* f5 */ 0x00e5b593, 0x00e5b58a, 0x00e5b5ad, 0x00e5b681,
+ /* f9 */ 0x00e5b6a0, 0x00e5b6a4, 0x00e5b6a7, 0x00e5b6b8,
+ /* fd */ 0x00e5b78b, 0x00e5909e,
+
+ /*** Two byte table, leaf: d0xx - offset 0x012a2 ***/
+
+ /* a1 */ 0x00e5bc8c, 0x00e4b890, 0x00e4b895, 0x00e4b8aa,
+ /* a5 */ 0x00e4b8b1, 0x00e4b8b6, 0x00e4b8bc, 0x00e4b8bf,
+ /* a9 */ 0x00e4b982, 0x00e4b996, 0x00e4b998, 0x00e4ba82,
+ /* ad */ 0x00e4ba85, 0x00e8b1ab, 0x00e4ba8a, 0x00e88892,
+ /* b1 */ 0x00e5bc8d, 0x00e4ba8e, 0x00e4ba9e, 0x00e4ba9f,
+ /* b5 */ 0x00e4baa0, 0x00e4baa2, 0x00e4bab0, 0x00e4bab3,
+ /* b9 */ 0x00e4bab6, 0x00e4bb8e, 0x00e4bb8d, 0x00e4bb84,
+ /* bd */ 0x00e4bb86, 0x00e4bb82, 0x00e4bb97, 0x00e4bb9e,
+ /* c1 */ 0x00e4bbad, 0x00e4bb9f, 0x00e4bbb7, 0x00e4bc89,
+ /* c5 */ 0x00e4bd9a, 0x00e4bcb0, 0x00e4bd9b, 0x00e4bd9d,
+ /* c9 */ 0x00e4bd97, 0x00e4bd87, 0x00e4bdb6, 0x00e4be88,
+ /* cd */ 0x00e4be8f, 0x00e4be98, 0x00e4bdbb, 0x00e4bda9,
+ /* d1 */ 0x00e4bdb0, 0x00e4be91, 0x00e4bdaf, 0x00e4be86,
+ /* d5 */ 0x00e4be96, 0x00e58498, 0x00e4bf94, 0x00e4bf9f,
+ /* d9 */ 0x00e4bf8e, 0x00e4bf98, 0x00e4bf9b, 0x00e4bf91,
+ /* dd */ 0x00e4bf9a, 0x00e4bf90, 0x00e4bfa4, 0x00e4bfa5,
+ /* e1 */ 0x00e5809a, 0x00e580a8, 0x00e58094, 0x00e580aa,
+ /* e5 */ 0x00e580a5, 0x00e58085, 0x00e4bc9c, 0x00e4bfb6,
+ /* e9 */ 0x00e580a1, 0x00e580a9, 0x00e580ac, 0x00e4bfbe,
+ /* ed */ 0x00e4bfaf, 0x00e58091, 0x00e58086, 0x00e58183,
+ /* f1 */ 0x00e58187, 0x00e69c83, 0x00e58195, 0x00e58190,
+ /* f5 */ 0x00e58188, 0x00e5819a, 0x00e58196, 0x00e581ac,
+ /* f9 */ 0x00e581b8, 0x00e58280, 0x00e5829a, 0x00e58285,
+ /* fd */ 0x00e582b4, 0x00e582b2,
+
+ /*** Two byte table, leaf: d1xx - offset 0x01300 ***/
+
+ /* a1 */ 0x00e58389, 0x00e5838a, 0x00e582b3, 0x00e58382,
+ /* a5 */ 0x00e58396, 0x00e5839e, 0x00e583a5, 0x00e583ad,
+ /* a9 */ 0x00e583a3, 0x00e583ae, 0x00e583b9, 0x00e583b5,
+ /* ad */ 0x00e58489, 0x00e58481, 0x00e58482, 0x00e58496,
+ /* b1 */ 0x00e58495, 0x00e58494, 0x00e5849a, 0x00e584a1,
+ /* b5 */ 0x00e584ba, 0x00e584b7, 0x00e584bc, 0x00e584bb,
+ /* b9 */ 0x00e584bf, 0x00e58580, 0x00e58592, 0x00e5858c,
+ /* bd */ 0x00e58594, 0x00e585a2, 0x00e7abb8, 0x00e585a9,
+ /* c1 */ 0x00e585aa, 0x00e585ae, 0x00e58680, 0x00e58682,
+ /* c5 */ 0x00e59b98, 0x00e5868c, 0x00e58689, 0x00e5868f,
+ /* c9 */ 0x00e58691, 0x00e58693, 0x00e58695, 0x00e58696,
+ /* cd */ 0x00e586a4, 0x00e586a6, 0x00e586a2, 0x00e586a9,
+ /* d1 */ 0x00e586aa, 0x00e586ab, 0x00e586b3, 0x00e586b1,
+ /* d5 */ 0x00e586b2, 0x00e586b0, 0x00e586b5, 0x00e586bd,
+ /* d9 */ 0x00e58785, 0x00e58789, 0x00e5879b, 0x00e587a0,
+ /* dd */ 0x00e89995, 0x00e587a9, 0x00e587ad, 0x00e587b0,
+ /* e1 */ 0x00e587b5, 0x00e587be, 0x00e58884, 0x00e5888b,
+ /* e5 */ 0x00e58894, 0x00e5888e, 0x00e588a7, 0x00e588aa,
+ /* e9 */ 0x00e588ae, 0x00e588b3, 0x00e588b9, 0x00e5898f,
+ /* ed */ 0x00e58984, 0x00e5898b, 0x00e5898c, 0x00e5899e,
+ /* f1 */ 0x00e58994, 0x00e589aa, 0x00e589b4, 0x00e589a9,
+ /* f5 */ 0x00e589b3, 0x00e589bf, 0x00e589bd, 0x00e58a8d,
+ /* f9 */ 0x00e58a94, 0x00e58a92, 0x00e589b1, 0x00e58a88,
+ /* fd */ 0x00e58a91, 0x00e8bea8,
+
+ /*** Two byte table, leaf: d2xx - offset 0x0135e ***/
+
+ /* a1 */ 0x00e8bea7, 0x00e58aac, 0x00e58aad, 0x00e58abc,
+ /* a5 */ 0x00e58ab5, 0x00e58b81, 0x00e58b8d, 0x00e58b97,
+ /* a9 */ 0x00e58b9e, 0x00e58ba3, 0x00e58ba6, 0x00e9a3ad,
+ /* ad */ 0x00e58ba0, 0x00e58bb3, 0x00e58bb5, 0x00e58bb8,
+ /* b1 */ 0x00e58bb9, 0x00e58c86, 0x00e58c88, 0x00e794b8,
+ /* b5 */ 0x00e58c8d, 0x00e58c90, 0x00e58c8f, 0x00e58c95,
+ /* b9 */ 0x00e58c9a, 0x00e58ca3, 0x00e58caf, 0x00e58cb1,
+ /* bd */ 0x00e58cb3, 0x00e58cb8, 0x00e58d80, 0x00e58d86,
+ /* c1 */ 0x00e58d85, 0x00e4b897, 0x00e58d89, 0x00e58d8d,
+ /* c5 */ 0x00e58796, 0x00e58d9e, 0x00e58da9, 0x00e58dae,
+ /* c9 */ 0x00e5a498, 0x00e58dbb, 0x00e58db7, 0x00e58e82,
+ /* cd */ 0x00e58e96, 0x00e58ea0, 0x00e58ea6, 0x00e58ea5,
+ /* d1 */ 0x00e58eae, 0x00e58eb0, 0x00e58eb6, 0x00e58f83,
+ /* d5 */ 0x00e7b092, 0x00e99b99, 0x00e58f9f, 0x00e69bbc,
+ /* d9 */ 0x00e787ae, 0x00e58fae, 0x00e58fa8, 0x00e58fad,
+ /* dd */ 0x00e58fba, 0x00e59081, 0x00e590bd, 0x00e59180,
+ /* e1 */ 0x00e590ac, 0x00e590ad, 0x00e590bc, 0x00e590ae,
+ /* e5 */ 0x00e590b6, 0x00e590a9, 0x00e5909d, 0x00e5918e,
+ /* e9 */ 0x00e5928f, 0x00e591b5, 0x00e5928e, 0x00e5919f,
+ /* ed */ 0x00e591b1, 0x00e591b7, 0x00e591b0, 0x00e59292,
+ /* f1 */ 0x00e591bb, 0x00e59280, 0x00e591b6, 0x00e59284,
+ /* f5 */ 0x00e59290, 0x00e59286, 0x00e59387, 0x00e592a2,
+ /* f9 */ 0x00e592b8, 0x00e592a5, 0x00e592ac, 0x00e59384,
+ /* fd */ 0x00e59388, 0x00e592a8,
+
+ /*** Two byte table, leaf: d3xx - offset 0x013bc ***/
+
+ /* a1 */ 0x00e592ab, 0x00e59382, 0x00e592a4, 0x00e592be,
+ /* a5 */ 0x00e592bc, 0x00e59398, 0x00e593a5, 0x00e593a6,
+ /* a9 */ 0x00e5948f, 0x00e59494, 0x00e593bd, 0x00e593ae,
+ /* ad */ 0x00e593ad, 0x00e593ba, 0x00e593a2, 0x00e594b9,
+ /* b1 */ 0x00e59580, 0x00e595a3, 0x00e5958c, 0x00e594ae,
+ /* b5 */ 0x00e5959c, 0x00e59585, 0x00e59596, 0x00e59597,
+ /* b9 */ 0x00e594b8, 0x00e594b3, 0x00e5959d, 0x00e59699,
+ /* bd */ 0x00e59680, 0x00e592af, 0x00e5968a, 0x00e5969f,
+ /* c1 */ 0x00e595bb, 0x00e595be, 0x00e59698, 0x00e5969e,
+ /* c5 */ 0x00e596ae, 0x00e595bc, 0x00e59683, 0x00e596a9,
+ /* c9 */ 0x00e59687, 0x00e596a8, 0x00e5979a, 0x00e59785,
+ /* cd */ 0x00e5979f, 0x00e59784, 0x00e5979c, 0x00e597a4,
+ /* d1 */ 0x00e59794, 0x00e59894, 0x00e597b7, 0x00e59896,
+ /* d5 */ 0x00e597be, 0x00e597bd, 0x00e5989b, 0x00e597b9,
+ /* d9 */ 0x00e5998e, 0x00e59990, 0x00e7879f, 0x00e598b4,
+ /* dd */ 0x00e598b6, 0x00e598b2, 0x00e598b8, 0x00e599ab,
+ /* e1 */ 0x00e599a4, 0x00e598af, 0x00e599ac, 0x00e599aa,
+ /* e5 */ 0x00e59a86, 0x00e59a80, 0x00e59a8a, 0x00e59aa0,
+ /* e9 */ 0x00e59a94, 0x00e59a8f, 0x00e59aa5, 0x00e59aae,
+ /* ed */ 0x00e59ab6, 0x00e59ab4, 0x00e59b82, 0x00e59abc,
+ /* f1 */ 0x00e59b81, 0x00e59b83, 0x00e59b80, 0x00e59b88,
+ /* f5 */ 0x00e59b8e, 0x00e59b91, 0x00e59b93, 0x00e59b97,
+ /* f9 */ 0x00e59bae, 0x00e59bb9, 0x00e59c80, 0x00e59bbf,
+ /* fd */ 0x00e59c84, 0x00e59c89,
+
+ /*** Two byte table, leaf: d4xx - offset 0x0141a ***/
+
+ /* a1 */ 0x00e59c88, 0x00e59c8b, 0x00e59c8d, 0x00e59c93,
+ /* a5 */ 0x00e59c98, 0x00e59c96, 0x00e59787, 0x00e59c9c,
+ /* a9 */ 0x00e59ca6, 0x00e59cb7, 0x00e59cb8, 0x00e59d8e,
+ /* ad */ 0x00e59cbb, 0x00e59d80, 0x00e59d8f, 0x00e59da9,
+ /* b1 */ 0x00e59f80, 0x00e59e88, 0x00e59da1, 0x00e59dbf,
+ /* b5 */ 0x00e59e89, 0x00e59e93, 0x00e59ea0, 0x00e59eb3,
+ /* b9 */ 0x00e59ea4, 0x00e59eaa, 0x00e59eb0, 0x00e59f83,
+ /* bd */ 0x00e59f86, 0x00e59f94, 0x00e59f92, 0x00e59f93,
+ /* c1 */ 0x00e5a08a, 0x00e59f96, 0x00e59fa3, 0x00e5a08b,
+ /* c5 */ 0x00e5a099, 0x00e5a09d, 0x00e5a1b2, 0x00e5a0a1,
+ /* c9 */ 0x00e5a1a2, 0x00e5a18b, 0x00e5a1b0, 0x00e6af80,
+ /* cd */ 0x00e5a192, 0x00e5a0bd, 0x00e5a1b9, 0x00e5a285,
+ /* d1 */ 0x00e5a2b9, 0x00e5a29f, 0x00e5a2ab, 0x00e5a2ba,
+ /* d5 */ 0x00e5a39e, 0x00e5a2bb, 0x00e5a2b8, 0x00e5a2ae,
+ /* d9 */ 0x00e5a385, 0x00e5a393, 0x00e5a391, 0x00e5a397,
+ /* dd */ 0x00e5a399, 0x00e5a398, 0x00e5a3a5, 0x00e5a39c,
+ /* e1 */ 0x00e5a3a4, 0x00e5a39f, 0x00e5a3af, 0x00e5a3ba,
+ /* e5 */ 0x00e5a3b9, 0x00e5a3bb, 0x00e5a3bc, 0x00e5a3bd,
+ /* e9 */ 0x00e5a482, 0x00e5a48a, 0x00e5a490, 0x00e5a49b,
+ /* ed */ 0x00e6a2a6, 0x00e5a4a5, 0x00e5a4ac, 0x00e5a4ad,
+ /* f1 */ 0x00e5a4b2, 0x00e5a4b8, 0x00e5a4be, 0x00e7ab92,
+ /* f5 */ 0x00e5a595, 0x00e5a590, 0x00e5a58e, 0x00e5a59a,
+ /* f9 */ 0x00e5a598, 0x00e5a5a2, 0x00e5a5a0, 0x00e5a5a7,
+ /* fd */ 0x00e5a5ac, 0x00e5a5a9,
+
+ /*** Two byte table, leaf: d5xx - offset 0x01478 ***/
+
+ /* a1 */ 0x00e5a5b8, 0x00e5a681, 0x00e5a69d, 0x00e4bd9e,
+ /* a5 */ 0x00e4beab, 0x00e5a6a3, 0x00e5a6b2, 0x00e5a786,
+ /* a9 */ 0x00e5a7a8, 0x00e5a79c, 0x00e5a68d, 0x00e5a799,
+ /* ad */ 0x00e5a79a, 0x00e5a8a5, 0x00e5a89f, 0x00e5a891,
+ /* b1 */ 0x00e5a89c, 0x00e5a889, 0x00e5a89a, 0x00e5a980,
+ /* b5 */ 0x00e5a9ac, 0x00e5a989, 0x00e5a8b5, 0x00e5a8b6,
+ /* b9 */ 0x00e5a9a2, 0x00e5a9aa, 0x00e5aa9a, 0x00e5aabc,
+ /* bd */ 0x00e5aabe, 0x00e5ab8b, 0x00e5ab82, 0x00e5aabd,
+ /* c1 */ 0x00e5aba3, 0x00e5ab97, 0x00e5aba6, 0x00e5aba9,
+ /* c5 */ 0x00e5ab96, 0x00e5abba, 0x00e5abbb, 0x00e5ac8c,
+ /* c9 */ 0x00e5ac8b, 0x00e5ac96, 0x00e5acb2, 0x00e5ab90,
+ /* cd */ 0x00e5acaa, 0x00e5acb6, 0x00e5acbe, 0x00e5ad83,
+ /* d1 */ 0x00e5ad85, 0x00e5ad80, 0x00e5ad91, 0x00e5ad95,
+ /* d5 */ 0x00e5ad9a, 0x00e5ad9b, 0x00e5ada5, 0x00e5ada9,
+ /* d9 */ 0x00e5adb0, 0x00e5adb3, 0x00e5adb5, 0x00e5adb8,
+ /* dd */ 0x00e69688, 0x00e5adba, 0x00e5ae80, 0x00e5ae83,
+ /* e1 */ 0x00e5aea6, 0x00e5aeb8, 0x00e5af83, 0x00e5af87,
+ /* e5 */ 0x00e5af89, 0x00e5af94, 0x00e5af90, 0x00e5afa4,
+ /* e9 */ 0x00e5afa6, 0x00e5afa2, 0x00e5af9e, 0x00e5afa5,
+ /* ed */ 0x00e5afab, 0x00e5afb0, 0x00e5afb6, 0x00e5afb3,
+ /* f1 */ 0x00e5b085, 0x00e5b087, 0x00e5b088, 0x00e5b08d,
+ /* f5 */ 0x00e5b093, 0x00e5b0a0, 0x00e5b0a2, 0x00e5b0a8,
+ /* f9 */ 0x00e5b0b8, 0x00e5b0b9, 0x00e5b181, 0x00e5b186,
+ /* fd */ 0x00e5b18e, 0x00e5b193,
+
+ /*** Two byte table, leaf: d6xx - offset 0x014d6 ***/
+
+ /* a1 */ 0x00e5b190, 0x00e5b18f, 0x00e5adb1, 0x00e5b1ac,
+ /* a5 */ 0x00e5b1ae, 0x00e4b9a2, 0x00e5b1b6, 0x00e5b1b9,
+ /* a9 */ 0x00e5b28c, 0x00e5b291, 0x00e5b294, 0x00e5a69b,
+ /* ad */ 0x00e5b2ab, 0x00e5b2bb, 0x00e5b2b6, 0x00e5b2bc,
+ /* b1 */ 0x00e5b2b7, 0x00e5b385, 0x00e5b2be, 0x00e5b387,
+ /* b5 */ 0x00e5b399, 0x00e5b3a9, 0x00e5b3bd, 0x00e5b3ba,
+ /* b9 */ 0x00e5b3ad, 0x00e5b68c, 0x00e5b3aa, 0x00e5b48b,
+ /* bd */ 0x00e5b495, 0x00e5b497, 0x00e5b59c, 0x00e5b49f,
+ /* c1 */ 0x00e5b49b, 0x00e5b491, 0x00e5b494, 0x00e5b4a2,
+ /* c5 */ 0x00e5b49a, 0x00e5b499, 0x00e5b498, 0x00e5b58c,
+ /* c9 */ 0x00e5b592, 0x00e5b58e, 0x00e5b58b, 0x00e5b5ac,
+ /* cd */ 0x00e5b5b3, 0x00e5b5b6, 0x00e5b687, 0x00e5b684,
+ /* d1 */ 0x00e5b682, 0x00e5b6a2, 0x00e5b69d, 0x00e5b6ac,
+ /* d5 */ 0x00e5b6ae, 0x00e5b6bd, 0x00e5b690, 0x00e5b6b7,
+ /* d9 */ 0x00e5b6bc, 0x00e5b789, 0x00e5b78d, 0x00e5b793,
+ /* dd */ 0x00e5b792, 0x00e5b796, 0x00e5b79b, 0x00e5b7ab,
+ /* e1 */ 0x00e5b7b2, 0x00e5b7b5, 0x00e5b88b, 0x00e5b89a,
+ /* e5 */ 0x00e5b899, 0x00e5b891, 0x00e5b89b, 0x00e5b8b6,
+ /* e9 */ 0x00e5b8b7, 0x00e5b984, 0x00e5b983, 0x00e5b980,
+ /* ed */ 0x00e5b98e, 0x00e5b997, 0x00e5b994, 0x00e5b99f,
+ /* f1 */ 0x00e5b9a2, 0x00e5b9a4, 0x00e5b987, 0x00e5b9b5,
+ /* f5 */ 0x00e5b9b6, 0x00e5b9ba, 0x00e9babc, 0x00e5b9bf,
+ /* f9 */ 0x00e5baa0, 0x00e5bb81, 0x00e5bb82, 0x00e5bb88,
+ /* fd */ 0x00e5bb90, 0x00e5bb8f,
+
+ /*** Two byte table, leaf: d7xx - offset 0x01534 ***/
+
+ /* a1 */ 0x00e5bb96, 0x00e5bba3, 0x00e5bb9d, 0x00e5bb9a,
+ /* a5 */ 0x00e5bb9b, 0x00e5bba2, 0x00e5bba1, 0x00e5bba8,
+ /* a9 */ 0x00e5bba9, 0x00e5bbac, 0x00e5bbb1, 0x00e5bbb3,
+ /* ad */ 0x00e5bbb0, 0x00e5bbb4, 0x00e5bbb8, 0x00e5bbbe,
+ /* b1 */ 0x00e5bc83, 0x00e5bc89, 0x00e5bd9d, 0x00e5bd9c,
+ /* b5 */ 0x00e5bc8b, 0x00e5bc91, 0x00e5bc96, 0x00e5bca9,
+ /* b9 */ 0x00e5bcad, 0x00e5bcb8, 0x00e5bd81, 0x00e5bd88,
+ /* bd */ 0x00e5bd8c, 0x00e5bd8e, 0x00e5bcaf, 0x00e5bd91,
+ /* c1 */ 0x00e5bd96, 0x00e5bd97, 0x00e5bd99, 0x00e5bda1,
+ /* c5 */ 0x00e5bdad, 0x00e5bdb3, 0x00e5bdb7, 0x00e5be83,
+ /* c9 */ 0x00e5be82, 0x00e5bdbf, 0x00e5be8a, 0x00e5be88,
+ /* cd */ 0x00e5be91, 0x00e5be87, 0x00e5be9e, 0x00e5be99,
+ /* d1 */ 0x00e5be98, 0x00e5bea0, 0x00e5bea8, 0x00e5bead,
+ /* d5 */ 0x00e5bebc, 0x00e5bf96, 0x00e5bfbb, 0x00e5bfa4,
+ /* d9 */ 0x00e5bfb8, 0x00e5bfb1, 0x00e5bf9d, 0x00e682b3,
+ /* dd */ 0x00e5bfbf, 0x00e680a1, 0x00e681a0, 0x00e68099,
+ /* e1 */ 0x00e68090, 0x00e680a9, 0x00e6808e, 0x00e680b1,
+ /* e5 */ 0x00e6809b, 0x00e68095, 0x00e680ab, 0x00e680a6,
+ /* e9 */ 0x00e6808f, 0x00e680ba, 0x00e6819a, 0x00e68181,
+ /* ed */ 0x00e681aa, 0x00e681b7, 0x00e6819f, 0x00e6818a,
+ /* f1 */ 0x00e68186, 0x00e6818d, 0x00e681a3, 0x00e68183,
+ /* f5 */ 0x00e681a4, 0x00e68182, 0x00e681ac, 0x00e681ab,
+ /* f9 */ 0x00e68199, 0x00e68281, 0x00e6828d, 0x00e683a7,
+ /* fd */ 0x00e68283, 0x00e6829a,
+
+ /*** Two byte table, leaf: d8xx - offset 0x01592 ***/
+
+ /* a1 */ 0x00e68284, 0x00e6829b, 0x00e68296, 0x00e68297,
+ /* a5 */ 0x00e68292, 0x00e682a7, 0x00e6828b, 0x00e683a1,
+ /* a9 */ 0x00e682b8, 0x00e683a0, 0x00e68393, 0x00e682b4,
+ /* ad */ 0x00e5bfb0, 0x00e682bd, 0x00e68386, 0x00e682b5,
+ /* b1 */ 0x00e68398, 0x00e6858d, 0x00e68495, 0x00e68486,
+ /* b5 */ 0x00e683b6, 0x00e683b7, 0x00e68480, 0x00e683b4,
+ /* b9 */ 0x00e683ba, 0x00e68483, 0x00e684a1, 0x00e683bb,
+ /* bd */ 0x00e683b1, 0x00e6848d, 0x00e6848e, 0x00e68587,
+ /* c1 */ 0x00e684be, 0x00e684a8, 0x00e684a7, 0x00e6858a,
+ /* c5 */ 0x00e684bf, 0x00e684bc, 0x00e684ac, 0x00e684b4,
+ /* c9 */ 0x00e684bd, 0x00e68582, 0x00e68584, 0x00e685b3,
+ /* cd */ 0x00e685b7, 0x00e68598, 0x00e68599, 0x00e6859a,
+ /* d1 */ 0x00e685ab, 0x00e685b4, 0x00e685af, 0x00e685a5,
+ /* d5 */ 0x00e685b1, 0x00e6859f, 0x00e6859d, 0x00e68593,
+ /* d9 */ 0x00e685b5, 0x00e68699, 0x00e68696, 0x00e68687,
+ /* dd */ 0x00e686ac, 0x00e68694, 0x00e6869a, 0x00e6868a,
+ /* e1 */ 0x00e68691, 0x00e686ab, 0x00e686ae, 0x00e6878c,
+ /* e5 */ 0x00e6878a, 0x00e68789, 0x00e687b7, 0x00e68788,
+ /* e9 */ 0x00e68783, 0x00e68786, 0x00e686ba, 0x00e6878b,
+ /* ed */ 0x00e7bdb9, 0x00e6878d, 0x00e687a6, 0x00e687a3,
+ /* f1 */ 0x00e687b6, 0x00e687ba, 0x00e687b4, 0x00e687bf,
+ /* f5 */ 0x00e687bd, 0x00e687bc, 0x00e687be, 0x00e68880,
+ /* f9 */ 0x00e68888, 0x00e68889, 0x00e6888d, 0x00e6888c,
+ /* fd */ 0x00e68894, 0x00e6889b,
+
+ /*** Two byte table, leaf: d9xx - offset 0x015f0 ***/
+
+ /* a1 */ 0x00e6889e, 0x00e688a1, 0x00e688aa, 0x00e688ae,
+ /* a5 */ 0x00e688b0, 0x00e688b2, 0x00e688b3, 0x00e68981,
+ /* a9 */ 0x00e6898e, 0x00e6899e, 0x00e689a3, 0x00e6899b,
+ /* ad */ 0x00e689a0, 0x00e689a8, 0x00e689bc, 0x00e68a82,
+ /* b1 */ 0x00e68a89, 0x00e689be, 0x00e68a92, 0x00e68a93,
+ /* b5 */ 0x00e68a96, 0x00e68b94, 0x00e68a83, 0x00e68a94,
+ /* b9 */ 0x00e68b97, 0x00e68b91, 0x00e68abb, 0x00e68b8f,
+ /* bd */ 0x00e68bbf, 0x00e68b86, 0x00e69394, 0x00e68b88,
+ /* c1 */ 0x00e68b9c, 0x00e68b8c, 0x00e68b8a, 0x00e68b82,
+ /* c5 */ 0x00e68b87, 0x00e68a9b, 0x00e68b89, 0x00e68c8c,
+ /* c9 */ 0x00e68bae, 0x00e68bb1, 0x00e68ca7, 0x00e68c82,
+ /* cd */ 0x00e68c88, 0x00e68baf, 0x00e68bb5, 0x00e68d90,
+ /* d1 */ 0x00e68cbe, 0x00e68d8d, 0x00e6909c, 0x00e68d8f,
+ /* d5 */ 0x00e68e96, 0x00e68e8e, 0x00e68e80, 0x00e68eab,
+ /* d9 */ 0x00e68db6, 0x00e68ea3, 0x00e68e8f, 0x00e68e89,
+ /* dd */ 0x00e68e9f, 0x00e68eb5, 0x00e68dab, 0x00e68da9,
+ /* e1 */ 0x00e68ebe, 0x00e68fa9, 0x00e68f80, 0x00e68f86,
+ /* e5 */ 0x00e68fa3, 0x00e68f89, 0x00e68f92, 0x00e68fb6,
+ /* e9 */ 0x00e68f84, 0x00e69096, 0x00e690b4, 0x00e69086,
+ /* ed */ 0x00e69093, 0x00e690a6, 0x00e690b6, 0x00e6949d,
+ /* f1 */ 0x00e69097, 0x00e690a8, 0x00e6908f, 0x00e691a7,
+ /* f5 */ 0x00e691af, 0x00e691b6, 0x00e6918e, 0x00e694aa,
+ /* f9 */ 0x00e69295, 0x00e69293, 0x00e692a5, 0x00e692a9,
+ /* fd */ 0x00e69288, 0x00e692bc,
+
+ /*** Two byte table, leaf: daxx - offset 0x0164e ***/
+
+ /* a1 */ 0x00e6939a, 0x00e69392, 0x00e69385, 0x00e69387,
+ /* a5 */ 0x00e692bb, 0x00e69398, 0x00e69382, 0x00e693b1,
+ /* a9 */ 0x00e693a7, 0x00e88889, 0x00e693a0, 0x00e693a1,
+ /* ad */ 0x00e68aac, 0x00e693a3, 0x00e693af, 0x00e694ac,
+ /* b1 */ 0x00e693b6, 0x00e693b4, 0x00e693b2, 0x00e693ba,
+ /* b5 */ 0x00e69480, 0x00e693bd, 0x00e69498, 0x00e6949c,
+ /* b9 */ 0x00e69485, 0x00e694a4, 0x00e694a3, 0x00e694ab,
+ /* bd */ 0x00e694b4, 0x00e694b5, 0x00e694b7, 0x00e694b6,
+ /* c1 */ 0x00e694b8, 0x00e7958b, 0x00e69588, 0x00e69596,
+ /* c5 */ 0x00e69595, 0x00e6958d, 0x00e69598, 0x00e6959e,
+ /* c9 */ 0x00e6959d, 0x00e695b2, 0x00e695b8, 0x00e69682,
+ /* cd */ 0x00e69683, 0x00e8ae8a, 0x00e6969b, 0x00e6969f,
+ /* d1 */ 0x00e696ab, 0x00e696b7, 0x00e69783, 0x00e69786,
+ /* d5 */ 0x00e69781, 0x00e69784, 0x00e6978c, 0x00e69792,
+ /* d9 */ 0x00e6979b, 0x00e69799, 0x00e697a0, 0x00e697a1,
+ /* dd */ 0x00e697b1, 0x00e69db2, 0x00e6988a, 0x00e69883,
+ /* e1 */ 0x00e697bb, 0x00e69db3, 0x00e698b5, 0x00e698b6,
+ /* e5 */ 0x00e698b4, 0x00e6989c, 0x00e6998f, 0x00e69984,
+ /* e9 */ 0x00e69989, 0x00e69981, 0x00e6999e, 0x00e6999d,
+ /* ed */ 0x00e699a4, 0x00e699a7, 0x00e699a8, 0x00e6999f,
+ /* f1 */ 0x00e699a2, 0x00e699b0, 0x00e69a83, 0x00e69a88,
+ /* f5 */ 0x00e69a8e, 0x00e69a89, 0x00e69a84, 0x00e69a98,
+ /* f9 */ 0x00e69a9d, 0x00e69b81, 0x00e69ab9, 0x00e69b89,
+ /* fd */ 0x00e69abe, 0x00e69abc,
+
+ /*** Two byte table, leaf: dbxx - offset 0x016ac ***/
+
+ /* a1 */ 0x00e69b84, 0x00e69ab8, 0x00e69b96, 0x00e69b9a,
+ /* a5 */ 0x00e69ba0, 0x00e698bf, 0x00e69ba6, 0x00e69ba9,
+ /* a9 */ 0x00e69bb0, 0x00e69bb5, 0x00e69bb7, 0x00e69c8f,
+ /* ad */ 0x00e69c96, 0x00e69c9e, 0x00e69ca6, 0x00e69ca7,
+ /* b1 */ 0x00e99cb8, 0x00e69cae, 0x00e69cbf, 0x00e69cb6,
+ /* b5 */ 0x00e69d81, 0x00e69cb8, 0x00e69cb7, 0x00e69d86,
+ /* b9 */ 0x00e69d9e, 0x00e69da0, 0x00e69d99, 0x00e69da3,
+ /* bd */ 0x00e69da4, 0x00e69e89, 0x00e69db0, 0x00e69ea9,
+ /* c1 */ 0x00e69dbc, 0x00e69daa, 0x00e69e8c, 0x00e69e8b,
+ /* c5 */ 0x00e69ea6, 0x00e69ea1, 0x00e69e85, 0x00e69eb7,
+ /* c9 */ 0x00e69faf, 0x00e69eb4, 0x00e69fac, 0x00e69eb3,
+ /* cd */ 0x00e69fa9, 0x00e69eb8, 0x00e69fa4, 0x00e69f9e,
+ /* d1 */ 0x00e69f9d, 0x00e69fa2, 0x00e69fae, 0x00e69eb9,
+ /* d5 */ 0x00e69f8e, 0x00e69f86, 0x00e69fa7, 0x00e6aa9c,
+ /* d9 */ 0x00e6a09e, 0x00e6a186, 0x00e6a0a9, 0x00e6a180,
+ /* dd */ 0x00e6a18d, 0x00e6a0b2, 0x00e6a18e, 0x00e6a2b3,
+ /* e1 */ 0x00e6a0ab, 0x00e6a199, 0x00e6a1a3, 0x00e6a1b7,
+ /* e5 */ 0x00e6a1bf, 0x00e6a29f, 0x00e6a28f, 0x00e6a2ad,
+ /* e9 */ 0x00e6a294, 0x00e6a29d, 0x00e6a29b, 0x00e6a283,
+ /* ed */ 0x00e6aaae, 0x00e6a2b9, 0x00e6a1b4, 0x00e6a2b5,
+ /* f1 */ 0x00e6a2a0, 0x00e6a2ba, 0x00e6a48f, 0x00e6a28d,
+ /* f5 */ 0x00e6a1be, 0x00e6a481, 0x00e6a38a, 0x00e6a488,
+ /* f9 */ 0x00e6a398, 0x00e6a4a2, 0x00e6a4a6, 0x00e6a3a1,
+ /* fd */ 0x00e6a48c, 0x00e6a38d,
+
+ /*** Two byte table, leaf: dcxx - offset 0x0170a ***/
+
+ /* a1 */ 0x00e6a394, 0x00e6a3a7, 0x00e6a395, 0x00e6a4b6,
+ /* a5 */ 0x00e6a492, 0x00e6a484, 0x00e6a397, 0x00e6a3a3,
+ /* a9 */ 0x00e6a4a5, 0x00e6a3b9, 0x00e6a3a0, 0x00e6a3af,
+ /* ad */ 0x00e6a4a8, 0x00e6a4aa, 0x00e6a49a, 0x00e6a4a3,
+ /* b1 */ 0x00e6a4a1, 0x00e6a386, 0x00e6a5b9, 0x00e6a5b7,
+ /* b5 */ 0x00e6a59c, 0x00e6a5b8, 0x00e6a5ab, 0x00e6a594,
+ /* b9 */ 0x00e6a5be, 0x00e6a5ae, 0x00e6a4b9, 0x00e6a5b4,
+ /* bd */ 0x00e6a4bd, 0x00e6a599, 0x00e6a4b0, 0x00e6a5a1,
+ /* c1 */ 0x00e6a59e, 0x00e6a59d, 0x00e6a681, 0x00e6a5aa,
+ /* c5 */ 0x00e6a6b2, 0x00e6a6ae, 0x00e6a790, 0x00e6a6bf,
+ /* c9 */ 0x00e6a781, 0x00e6a793, 0x00e6a6be, 0x00e6a78e,
+ /* cd */ 0x00e5afa8, 0x00e6a78a, 0x00e6a79d, 0x00e6a6bb,
+ /* d1 */ 0x00e6a783, 0x00e6a6a7, 0x00e6a8ae, 0x00e6a691,
+ /* d5 */ 0x00e6a6a0, 0x00e6a69c, 0x00e6a695, 0x00e6a6b4,
+ /* d9 */ 0x00e6a79e, 0x00e6a7a8, 0x00e6a882, 0x00e6a89b,
+ /* dd */ 0x00e6a7bf, 0x00e6ac8a, 0x00e6a7b9, 0x00e6a7b2,
+ /* e1 */ 0x00e6a7a7, 0x00e6a885, 0x00e6a6b1, 0x00e6a89e,
+ /* e5 */ 0x00e6a7ad, 0x00e6a894, 0x00e6a7ab, 0x00e6a88a,
+ /* e9 */ 0x00e6a892, 0x00e6ab81, 0x00e6a8a3, 0x00e6a893,
+ /* ed */ 0x00e6a984, 0x00e6a88c, 0x00e6a9b2, 0x00e6a8b6,
+ /* f1 */ 0x00e6a9b8, 0x00e6a987, 0x00e6a9a2, 0x00e6a999,
+ /* f5 */ 0x00e6a9a6, 0x00e6a988, 0x00e6a8b8, 0x00e6a8a2,
+ /* f9 */ 0x00e6aa90, 0x00e6aa8d, 0x00e6aaa0, 0x00e6aa84,
+ /* fd */ 0x00e6aaa2, 0x00e6aaa3,
+
+ /*** Two byte table, leaf: ddxx - offset 0x01768 ***/
+
+ /* a1 */ 0x00e6aa97, 0x00e89897, 0x00e6aabb, 0x00e6ab83,
+ /* a5 */ 0x00e6ab82, 0x00e6aab8, 0x00e6aab3, 0x00e6aaac,
+ /* a9 */ 0x00e6ab9e, 0x00e6ab91, 0x00e6ab9f, 0x00e6aaaa,
+ /* ad */ 0x00e6ab9a, 0x00e6abaa, 0x00e6abbb, 0x00e6ac85,
+ /* b1 */ 0x00e89896, 0x00e6abba, 0x00e6ac92, 0x00e6ac96,
+ /* b5 */ 0x00e9acb1, 0x00e6ac9f, 0x00e6acb8, 0x00e6acb7,
+ /* b9 */ 0x00e79b9c, 0x00e6acb9, 0x00e9a3ae, 0x00e6ad87,
+ /* bd */ 0x00e6ad83, 0x00e6ad89, 0x00e6ad90, 0x00e6ad99,
+ /* c1 */ 0x00e6ad94, 0x00e6ad9b, 0x00e6ad9f, 0x00e6ada1,
+ /* c5 */ 0x00e6adb8, 0x00e6adb9, 0x00e6adbf, 0x00e6ae80,
+ /* c9 */ 0x00e6ae84, 0x00e6ae83, 0x00e6ae8d, 0x00e6ae98,
+ /* cd */ 0x00e6ae95, 0x00e6ae9e, 0x00e6aea4, 0x00e6aeaa,
+ /* d1 */ 0x00e6aeab, 0x00e6aeaf, 0x00e6aeb2, 0x00e6aeb1,
+ /* d5 */ 0x00e6aeb3, 0x00e6aeb7, 0x00e6aebc, 0x00e6af86,
+ /* d9 */ 0x00e6af8b, 0x00e6af93, 0x00e6af9f, 0x00e6afac,
+ /* dd */ 0x00e6afab, 0x00e6afb3, 0x00e6afaf, 0x00e9babe,
+ /* e1 */ 0x00e6b088, 0x00e6b093, 0x00e6b094, 0x00e6b09b,
+ /* e5 */ 0x00e6b0a4, 0x00e6b0a3, 0x00e6b19e, 0x00e6b195,
+ /* e9 */ 0x00e6b1a2, 0x00e6b1aa, 0x00e6b282, 0x00e6b28d,
+ /* ed */ 0x00e6b29a, 0x00e6b281, 0x00e6b29b, 0x00e6b1be,
+ /* f1 */ 0x00e6b1a8, 0x00e6b1b3, 0x00e6b292, 0x00e6b290,
+ /* f5 */ 0x00e6b384, 0x00e6b3b1, 0x00e6b393, 0x00e6b2bd,
+ /* f9 */ 0x00e6b397, 0x00e6b385, 0x00e6b39d, 0x00e6b2ae,
+ /* fd */ 0x00e6b2b1, 0x00e6b2be,
+
+ /*** Two byte table, leaf: dexx - offset 0x017c6 ***/
+
+ /* a1 */ 0x00e6b2ba, 0x00e6b39b, 0x00e6b3af, 0x00e6b399,
+ /* a5 */ 0x00e6b3aa, 0x00e6b49f, 0x00e8a18d, 0x00e6b4b6,
+ /* a9 */ 0x00e6b4ab, 0x00e6b4bd, 0x00e6b4b8, 0x00e6b499,
+ /* ad */ 0x00e6b4b5, 0x00e6b4b3, 0x00e6b492, 0x00e6b48c,
+ /* b1 */ 0x00e6b5a3, 0x00e6b693, 0x00e6b5a4, 0x00e6b59a,
+ /* b5 */ 0x00e6b5b9, 0x00e6b599, 0x00e6b68e, 0x00e6b695,
+ /* b9 */ 0x00e6bfa4, 0x00e6b685, 0x00e6b7b9, 0x00e6b895,
+ /* bd */ 0x00e6b88a, 0x00e6b6b5, 0x00e6b787, 0x00e6b7a6,
+ /* c1 */ 0x00e6b6b8, 0x00e6b786, 0x00e6b7ac, 0x00e6b79e,
+ /* c5 */ 0x00e6b78c, 0x00e6b7a8, 0x00e6b792, 0x00e6b785,
+ /* c9 */ 0x00e6b7ba, 0x00e6b799, 0x00e6b7a4, 0x00e6b795,
+ /* cd */ 0x00e6b7aa, 0x00e6b7ae, 0x00e6b8ad, 0x00e6b9ae,
+ /* d1 */ 0x00e6b8ae, 0x00e6b899, 0x00e6b9b2, 0x00e6b99f,
+ /* d5 */ 0x00e6b8be, 0x00e6b8a3, 0x00e6b9ab, 0x00e6b8ab,
+ /* d9 */ 0x00e6b9b6, 0x00e6b98d, 0x00e6b89f, 0x00e6b983,
+ /* dd */ 0x00e6b8ba, 0x00e6b98e, 0x00e6b8a4, 0x00e6bbbf,
+ /* e1 */ 0x00e6b89d, 0x00e6b8b8, 0x00e6ba82, 0x00e6baaa,
+ /* e5 */ 0x00e6ba98, 0x00e6bb89, 0x00e6bab7, 0x00e6bb93,
+ /* e9 */ 0x00e6babd, 0x00e6baaf, 0x00e6bb84, 0x00e6bab2,
+ /* ed */ 0x00e6bb94, 0x00e6bb95, 0x00e6ba8f, 0x00e6baa5,
+ /* f1 */ 0x00e6bb82, 0x00e6ba9f, 0x00e6bd81, 0x00e6bc91,
+ /* f5 */ 0x00e7818c, 0x00e6bbac, 0x00e6bbb8, 0x00e6bbbe,
+ /* f9 */ 0x00e6bcbf, 0x00e6bbb2, 0x00e6bcb1, 0x00e6bbaf,
+ /* fd */ 0x00e6bcb2, 0x00e6bb8c,
+
+ /*** Two byte table, leaf: dfxx - offset 0x01824 ***/
+
+ /* a1 */ 0x00e6bcbe, 0x00e6bc93, 0x00e6bbb7, 0x00e6be86,
+ /* a5 */ 0x00e6bdba, 0x00e6bdb8, 0x00e6be81, 0x00e6be80,
+ /* a9 */ 0x00e6bdaf, 0x00e6bd9b, 0x00e6bfb3, 0x00e6bdad,
+ /* ad */ 0x00e6be82, 0x00e6bdbc, 0x00e6bd98, 0x00e6be8e,
+ /* b1 */ 0x00e6be91, 0x00e6bf82, 0x00e6bda6, 0x00e6beb3,
+ /* b5 */ 0x00e6bea3, 0x00e6bea1, 0x00e6bea4, 0x00e6beb9,
+ /* b9 */ 0x00e6bf86, 0x00e6beaa, 0x00e6bf9f, 0x00e6bf95,
+ /* bd */ 0x00e6bfac, 0x00e6bf94, 0x00e6bf98, 0x00e6bfb1,
+ /* c1 */ 0x00e6bfae, 0x00e6bf9b, 0x00e78089, 0x00e7808b,
+ /* c5 */ 0x00e6bfba, 0x00e78091, 0x00e78081, 0x00e7808f,
+ /* c9 */ 0x00e6bfbe, 0x00e7809b, 0x00e7809a, 0x00e6bdb4,
+ /* cd */ 0x00e7809d, 0x00e78098, 0x00e7809f, 0x00e780b0,
+ /* d1 */ 0x00e780be, 0x00e780b2, 0x00e78191, 0x00e781a3,
+ /* d5 */ 0x00e78299, 0x00e78292, 0x00e782af, 0x00e783b1,
+ /* d9 */ 0x00e782ac, 0x00e782b8, 0x00e782b3, 0x00e782ae,
+ /* dd */ 0x00e7839f, 0x00e7838b, 0x00e7839d, 0x00e78399,
+ /* e1 */ 0x00e78489, 0x00e783bd, 0x00e7849c, 0x00e78499,
+ /* e5 */ 0x00e785a5, 0x00e78595, 0x00e78688, 0x00e785a6,
+ /* e9 */ 0x00e785a2, 0x00e7858c, 0x00e78596, 0x00e785ac,
+ /* ed */ 0x00e7868f, 0x00e787bb, 0x00e78684, 0x00e78695,
+ /* f1 */ 0x00e786a8, 0x00e786ac, 0x00e78797, 0x00e786b9,
+ /* f5 */ 0x00e786be, 0x00e78792, 0x00e78789, 0x00e78794,
+ /* f9 */ 0x00e7878e, 0x00e787a0, 0x00e787ac, 0x00e787a7,
+ /* fd */ 0x00e787b5, 0x00e787bc,
+
+ /*** Two byte table, leaf: e0xx - offset 0x01882 ***/
+
+ /* a1 */ 0x00e787b9, 0x00e787bf, 0x00e7888d, 0x00e78890,
+ /* a5 */ 0x00e7889b, 0x00e788a8, 0x00e788ad, 0x00e788ac,
+ /* a9 */ 0x00e788b0, 0x00e788b2, 0x00e788bb, 0x00e788bc,
+ /* ad */ 0x00e788bf, 0x00e78980, 0x00e78986, 0x00e7898b,
+ /* b1 */ 0x00e78998, 0x00e789b4, 0x00e789be, 0x00e78a82,
+ /* b5 */ 0x00e78a81, 0x00e78a87, 0x00e78a92, 0x00e78a96,
+ /* b9 */ 0x00e78aa2, 0x00e78aa7, 0x00e78ab9, 0x00e78ab2,
+ /* bd */ 0x00e78b83, 0x00e78b86, 0x00e78b84, 0x00e78b8e,
+ /* c1 */ 0x00e78b92, 0x00e78ba2, 0x00e78ba0, 0x00e78ba1,
+ /* c5 */ 0x00e78bb9, 0x00e78bb7, 0x00e5808f, 0x00e78c97,
+ /* c9 */ 0x00e78c8a, 0x00e78c9c, 0x00e78c96, 0x00e78c9d,
+ /* cd */ 0x00e78cb4, 0x00e78caf, 0x00e78ca9, 0x00e78ca5,
+ /* d1 */ 0x00e78cbe, 0x00e78d8e, 0x00e78d8f, 0x00e9bb98,
+ /* d5 */ 0x00e78d97, 0x00e78daa, 0x00e78da8, 0x00e78db0,
+ /* d9 */ 0x00e78db8, 0x00e78db5, 0x00e78dbb, 0x00e78dba,
+ /* dd */ 0x00e78f88, 0x00e78eb3, 0x00e78f8e, 0x00e78ebb,
+ /* e1 */ 0x00e78f80, 0x00e78fa5, 0x00e78fae, 0x00e78f9e,
+ /* e5 */ 0x00e792a2, 0x00e79085, 0x00e791af, 0x00e790a5,
+ /* e9 */ 0x00e78fb8, 0x00e790b2, 0x00e790ba, 0x00e79195,
+ /* ed */ 0x00e790bf, 0x00e7919f, 0x00e79199, 0x00e79181,
+ /* f1 */ 0x00e7919c, 0x00e791a9, 0x00e791b0, 0x00e791a3,
+ /* f5 */ 0x00e791aa, 0x00e791b6, 0x00e791be, 0x00e7928b,
+ /* f9 */ 0x00e7929e, 0x00e792a7, 0x00e7938a, 0x00e7938f,
+ /* fd */ 0x00e79394, 0x00e78fb1,
+
+ /*** Two byte table, leaf: e1xx - offset 0x018e0 ***/
+
+ /* a1 */ 0x00e793a0, 0x00e793a3, 0x00e793a7, 0x00e793a9,
+ /* a5 */ 0x00e793ae, 0x00e793b2, 0x00e793b0, 0x00e793b1,
+ /* a9 */ 0x00e793b8, 0x00e793b7, 0x00e79484, 0x00e79483,
+ /* ad */ 0x00e79485, 0x00e7948c, 0x00e7948e, 0x00e7948d,
+ /* b1 */ 0x00e79495, 0x00e79493, 0x00e7949e, 0x00e794a6,
+ /* b5 */ 0x00e794ac, 0x00e794bc, 0x00e79584, 0x00e7958d,
+ /* b9 */ 0x00e7958a, 0x00e79589, 0x00e7959b, 0x00e79586,
+ /* bd */ 0x00e7959a, 0x00e795a9, 0x00e795a4, 0x00e795a7,
+ /* c1 */ 0x00e795ab, 0x00e795ad, 0x00e795b8, 0x00e795b6,
+ /* c5 */ 0x00e79686, 0x00e79687, 0x00e795b4, 0x00e7968a,
+ /* c9 */ 0x00e79689, 0x00e79682, 0x00e79694, 0x00e7969a,
+ /* cd */ 0x00e7969d, 0x00e796a5, 0x00e796a3, 0x00e79782,
+ /* d1 */ 0x00e796b3, 0x00e79783, 0x00e796b5, 0x00e796bd,
+ /* d5 */ 0x00e796b8, 0x00e796bc, 0x00e796b1, 0x00e7978d,
+ /* d9 */ 0x00e7978a, 0x00e79792, 0x00e79799, 0x00e797a3,
+ /* dd */ 0x00e7979e, 0x00e797be, 0x00e797bf, 0x00e797bc,
+ /* e1 */ 0x00e79881, 0x00e797b0, 0x00e797ba, 0x00e797b2,
+ /* e5 */ 0x00e797b3, 0x00e7988b, 0x00e7988d, 0x00e79889,
+ /* e9 */ 0x00e7989f, 0x00e798a7, 0x00e798a0, 0x00e798a1,
+ /* ed */ 0x00e798a2, 0x00e798a4, 0x00e798b4, 0x00e798b0,
+ /* f1 */ 0x00e798bb, 0x00e79987, 0x00e79988, 0x00e79986,
+ /* f5 */ 0x00e7999c, 0x00e79998, 0x00e799a1, 0x00e799a2,
+ /* f9 */ 0x00e799a8, 0x00e799a9, 0x00e799aa, 0x00e799a7,
+ /* fd */ 0x00e799ac, 0x00e799b0,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0193e ***/
+
+ /* a1 */ 0x00e799b2, 0x00e799b6, 0x00e799b8, 0x00e799bc,
+ /* a5 */ 0x00e79a80, 0x00e79a83, 0x00e79a88, 0x00e79a8b,
+ /* a9 */ 0x00e79a8e, 0x00e79a96, 0x00e79a93, 0x00e79a99,
+ /* ad */ 0x00e79a9a, 0x00e79ab0, 0x00e79ab4, 0x00e79ab8,
+ /* b1 */ 0x00e79ab9, 0x00e79aba, 0x00e79b82, 0x00e79b8d,
+ /* b5 */ 0x00e79b96, 0x00e79b92, 0x00e79b9e, 0x00e79ba1,
+ /* b9 */ 0x00e79ba5, 0x00e79ba7, 0x00e79baa, 0x00e898af,
+ /* bd */ 0x00e79bbb, 0x00e79c88, 0x00e79c87, 0x00e79c84,
+ /* c1 */ 0x00e79ca9, 0x00e79ca4, 0x00e79c9e, 0x00e79ca5,
+ /* c5 */ 0x00e79ca6, 0x00e79c9b, 0x00e79cb7, 0x00e79cb8,
+ /* c9 */ 0x00e79d87, 0x00e79d9a, 0x00e79da8, 0x00e79dab,
+ /* cd */ 0x00e79d9b, 0x00e79da5, 0x00e79dbf, 0x00e79dbe,
+ /* d1 */ 0x00e79db9, 0x00e79e8e, 0x00e79e8b, 0x00e79e91,
+ /* d5 */ 0x00e79ea0, 0x00e79e9e, 0x00e79eb0, 0x00e79eb6,
+ /* d9 */ 0x00e79eb9, 0x00e79ebf, 0x00e79ebc, 0x00e79ebd,
+ /* dd */ 0x00e79ebb, 0x00e79f87, 0x00e79f8d, 0x00e79f97,
+ /* e1 */ 0x00e79f9a, 0x00e79f9c, 0x00e79fa3, 0x00e79fae,
+ /* e5 */ 0x00e79fbc, 0x00e7a08c, 0x00e7a092, 0x00e7a4a6,
+ /* e9 */ 0x00e7a0a0, 0x00e7a4aa, 0x00e7a185, 0x00e7a28e,
+ /* ed */ 0x00e7a1b4, 0x00e7a286, 0x00e7a1bc, 0x00e7a29a,
+ /* f1 */ 0x00e7a28c, 0x00e7a2a3, 0x00e7a2b5, 0x00e7a2aa,
+ /* f5 */ 0x00e7a2af, 0x00e7a391, 0x00e7a386, 0x00e7a38b,
+ /* f9 */ 0x00e7a394, 0x00e7a2be, 0x00e7a2bc, 0x00e7a385,
+ /* fd */ 0x00e7a38a, 0x00e7a3ac,
+
+ /*** Two byte table, leaf: e3xx - offset 0x0199c ***/
+
+ /* a1 */ 0x00e7a3a7, 0x00e7a39a, 0x00e7a3bd, 0x00e7a3b4,
+ /* a5 */ 0x00e7a487, 0x00e7a492, 0x00e7a491, 0x00e7a499,
+ /* a9 */ 0x00e7a4ac, 0x00e7a4ab, 0x00e7a580, 0x00e7a5a0,
+ /* ad */ 0x00e7a597, 0x00e7a59f, 0x00e7a59a, 0x00e7a595,
+ /* b1 */ 0x00e7a593, 0x00e7a5ba, 0x00e7a5bf, 0x00e7a68a,
+ /* b5 */ 0x00e7a69d, 0x00e7a6a7, 0x00e9bd8b, 0x00e7a6aa,
+ /* b9 */ 0x00e7a6ae, 0x00e7a6b3, 0x00e7a6b9, 0x00e7a6ba,
+ /* bd */ 0x00e7a789, 0x00e7a795, 0x00e7a7a7, 0x00e7a7ac,
+ /* c1 */ 0x00e7a7a1, 0x00e7a7a3, 0x00e7a888, 0x00e7a88d,
+ /* c5 */ 0x00e7a898, 0x00e7a899, 0x00e7a8a0, 0x00e7a89f,
+ /* c9 */ 0x00e7a680, 0x00e7a8b1, 0x00e7a8bb, 0x00e7a8be,
+ /* cd */ 0x00e7a8b7, 0x00e7a983, 0x00e7a997, 0x00e7a989,
+ /* d1 */ 0x00e7a9a1, 0x00e7a9a2, 0x00e7a9a9, 0x00e9be9d,
+ /* d5 */ 0x00e7a9b0, 0x00e7a9b9, 0x00e7a9bd, 0x00e7aa88,
+ /* d9 */ 0x00e7aa97, 0x00e7aa95, 0x00e7aa98, 0x00e7aa96,
+ /* dd */ 0x00e7aaa9, 0x00e7ab88, 0x00e7aab0, 0x00e7aab6,
+ /* e1 */ 0x00e7ab85, 0x00e7ab84, 0x00e7aabf, 0x00e98283,
+ /* e5 */ 0x00e7ab87, 0x00e7ab8a, 0x00e7ab8d, 0x00e7ab8f,
+ /* e9 */ 0x00e7ab95, 0x00e7ab93, 0x00e7ab99, 0x00e7ab9a,
+ /* ed */ 0x00e7ab9d, 0x00e7aba1, 0x00e7aba2, 0x00e7aba6,
+ /* f1 */ 0x00e7abad, 0x00e7abb0, 0x00e7ac82, 0x00e7ac8f,
+ /* f5 */ 0x00e7ac8a, 0x00e7ac86, 0x00e7acb3, 0x00e7ac98,
+ /* f9 */ 0x00e7ac99, 0x00e7ac9e, 0x00e7acb5, 0x00e7aca8,
+ /* fd */ 0x00e7acb6, 0x00e7ad90,
+
+ /*** Two byte table, leaf: e4xx - offset 0x019fa ***/
+
+ /* a1 */ 0x00e7adba, 0x00e7ac84, 0x00e7ad8d, 0x00e7ac8b,
+ /* a5 */ 0x00e7ad8c, 0x00e7ad85, 0x00e7adb5, 0x00e7ada5,
+ /* a9 */ 0x00e7adb4, 0x00e7ada7, 0x00e7adb0, 0x00e7adb1,
+ /* ad */ 0x00e7adac, 0x00e7adae, 0x00e7ae9d, 0x00e7ae98,
+ /* b1 */ 0x00e7ae9f, 0x00e7ae8d, 0x00e7ae9c, 0x00e7ae9a,
+ /* b5 */ 0x00e7ae8b, 0x00e7ae92, 0x00e7ae8f, 0x00e7ad9d,
+ /* b9 */ 0x00e7ae99, 0x00e7af8b, 0x00e7af81, 0x00e7af8c,
+ /* bd */ 0x00e7af8f, 0x00e7aeb4, 0x00e7af86, 0x00e7af9d,
+ /* c1 */ 0x00e7afa9, 0x00e7b091, 0x00e7b094, 0x00e7afa6,
+ /* c5 */ 0x00e7afa5, 0x00e7b1a0, 0x00e7b080, 0x00e7b087,
+ /* c9 */ 0x00e7b093, 0x00e7afb3, 0x00e7afb7, 0x00e7b097,
+ /* cd */ 0x00e7b08d, 0x00e7afb6, 0x00e7b0a3, 0x00e7b0a7,
+ /* d1 */ 0x00e7b0aa, 0x00e7b09f, 0x00e7b0b7, 0x00e7b0ab,
+ /* d5 */ 0x00e7b0bd, 0x00e7b18c, 0x00e7b183, 0x00e7b194,
+ /* d9 */ 0x00e7b18f, 0x00e7b180, 0x00e7b190, 0x00e7b198,
+ /* dd */ 0x00e7b19f, 0x00e7b1a4, 0x00e7b196, 0x00e7b1a5,
+ /* e1 */ 0x00e7b1ac, 0x00e7b1b5, 0x00e7b283, 0x00e7b290,
+ /* e5 */ 0x00e7b2a4, 0x00e7b2ad, 0x00e7b2a2, 0x00e7b2ab,
+ /* e9 */ 0x00e7b2a1, 0x00e7b2a8, 0x00e7b2b3, 0x00e7b2b2,
+ /* ed */ 0x00e7b2b1, 0x00e7b2ae, 0x00e7b2b9, 0x00e7b2bd,
+ /* f1 */ 0x00e7b380, 0x00e7b385, 0x00e7b382, 0x00e7b398,
+ /* f5 */ 0x00e7b392, 0x00e7b39c, 0x00e7b3a2, 0x00e9acbb,
+ /* f9 */ 0x00e7b3af, 0x00e7b3b2, 0x00e7b3b4, 0x00e7b3b6,
+ /* fd */ 0x00e7b3ba, 0x00e7b486,
+
+ /*** Two byte table, leaf: e5xx - offset 0x01a58 ***/
+
+ /* a1 */ 0x00e7b482, 0x00e7b49c, 0x00e7b495, 0x00e7b48a,
+ /* a5 */ 0x00e7b585, 0x00e7b58b, 0x00e7b4ae, 0x00e7b4b2,
+ /* a9 */ 0x00e7b4bf, 0x00e7b4b5, 0x00e7b586, 0x00e7b5b3,
+ /* ad */ 0x00e7b596, 0x00e7b58e, 0x00e7b5b2, 0x00e7b5a8,
+ /* b1 */ 0x00e7b5ae, 0x00e7b58f, 0x00e7b5a3, 0x00e7b693,
+ /* b5 */ 0x00e7b689, 0x00e7b59b, 0x00e7b68f, 0x00e7b5bd,
+ /* b9 */ 0x00e7b69b, 0x00e7b6ba, 0x00e7b6ae, 0x00e7b6a3,
+ /* bd */ 0x00e7b6b5, 0x00e7b787, 0x00e7b6bd, 0x00e7b6ab,
+ /* c1 */ 0x00e7b8bd, 0x00e7b6a2, 0x00e7b6af, 0x00e7b79c,
+ /* c5 */ 0x00e7b6b8, 0x00e7b69f, 0x00e7b6b0, 0x00e7b798,
+ /* c9 */ 0x00e7b79d, 0x00e7b7a4, 0x00e7b79e, 0x00e7b7bb,
+ /* cd */ 0x00e7b7b2, 0x00e7b7a1, 0x00e7b885, 0x00e7b88a,
+ /* d1 */ 0x00e7b8a3, 0x00e7b8a1, 0x00e7b892, 0x00e7b8b1,
+ /* d5 */ 0x00e7b89f, 0x00e7b889, 0x00e7b88b, 0x00e7b8a2,
+ /* d9 */ 0x00e7b986, 0x00e7b9a6, 0x00e7b8bb, 0x00e7b8b5,
+ /* dd */ 0x00e7b8b9, 0x00e7b983, 0x00e7b8b7, 0x00e7b8b2,
+ /* e1 */ 0x00e7b8ba, 0x00e7b9a7, 0x00e7b99d, 0x00e7b996,
+ /* e5 */ 0x00e7b99e, 0x00e7b999, 0x00e7b99a, 0x00e7b9b9,
+ /* e9 */ 0x00e7b9aa, 0x00e7b9a9, 0x00e7b9bc, 0x00e7b9bb,
+ /* ed */ 0x00e7ba83, 0x00e7b795, 0x00e7b9bd, 0x00e8beae,
+ /* f1 */ 0x00e7b9bf, 0x00e7ba88, 0x00e7ba89, 0x00e7ba8c,
+ /* f5 */ 0x00e7ba92, 0x00e7ba90, 0x00e7ba93, 0x00e7ba94,
+ /* f9 */ 0x00e7ba96, 0x00e7ba8e, 0x00e7ba9b, 0x00e7ba9c,
+ /* fd */ 0x00e7bcb8, 0x00e7bcba,
+
+ /*** Two byte table, leaf: e6xx - offset 0x01ab6 ***/
+
+ /* a1 */ 0x00e7bd85, 0x00e7bd8c, 0x00e7bd8d, 0x00e7bd8e,
+ /* a5 */ 0x00e7bd90, 0x00e7bd91, 0x00e7bd95, 0x00e7bd94,
+ /* a9 */ 0x00e7bd98, 0x00e7bd9f, 0x00e7bda0, 0x00e7bda8,
+ /* ad */ 0x00e7bda9, 0x00e7bda7, 0x00e7bdb8, 0x00e7be82,
+ /* b1 */ 0x00e7be86, 0x00e7be83, 0x00e7be88, 0x00e7be87,
+ /* b5 */ 0x00e7be8c, 0x00e7be94, 0x00e7be9e, 0x00e7be9d,
+ /* b9 */ 0x00e7be9a, 0x00e7bea3, 0x00e7beaf, 0x00e7beb2,
+ /* bd */ 0x00e7beb9, 0x00e7beae, 0x00e7beb6, 0x00e7beb8,
+ /* c1 */ 0x00e8adb1, 0x00e7bf85, 0x00e7bf86, 0x00e7bf8a,
+ /* c5 */ 0x00e7bf95, 0x00e7bf94, 0x00e7bfa1, 0x00e7bfa6,
+ /* c9 */ 0x00e7bfa9, 0x00e7bfb3, 0x00e7bfb9, 0x00e9a39c,
+ /* cd */ 0x00e88086, 0x00e88084, 0x00e8808b, 0x00e88092,
+ /* d1 */ 0x00e88098, 0x00e88099, 0x00e8809c, 0x00e880a1,
+ /* d5 */ 0x00e880a8, 0x00e880bf, 0x00e880bb, 0x00e8818a,
+ /* d9 */ 0x00e88186, 0x00e88192, 0x00e88198, 0x00e8819a,
+ /* dd */ 0x00e8819f, 0x00e881a2, 0x00e881a8, 0x00e881b3,
+ /* e1 */ 0x00e881b2, 0x00e881b0, 0x00e881b6, 0x00e881b9,
+ /* e5 */ 0x00e881bd, 0x00e881bf, 0x00e88284, 0x00e88286,
+ /* e9 */ 0x00e88285, 0x00e8829b, 0x00e88293, 0x00e8829a,
+ /* ed */ 0x00e882ad, 0x00e58690, 0x00e882ac, 0x00e8839b,
+ /* f1 */ 0x00e883a5, 0x00e88399, 0x00e8839d, 0x00e88384,
+ /* f5 */ 0x00e8839a, 0x00e88396, 0x00e88489, 0x00e883af,
+ /* f9 */ 0x00e883b1, 0x00e8849b, 0x00e884a9, 0x00e884a3,
+ /* fd */ 0x00e884af, 0x00e8858b,
+
+ /*** Two byte table, leaf: e7xx - offset 0x01b14 ***/
+
+ /* a1 */ 0x00e99a8b, 0x00e88586, 0x00e884be, 0x00e88593,
+ /* a5 */ 0x00e88591, 0x00e883bc, 0x00e885b1, 0x00e885ae,
+ /* a9 */ 0x00e885a5, 0x00e885a6, 0x00e885b4, 0x00e88683,
+ /* ad */ 0x00e88688, 0x00e8868a, 0x00e88680, 0x00e88682,
+ /* b1 */ 0x00e886a0, 0x00e88695, 0x00e886a4, 0x00e886a3,
+ /* b5 */ 0x00e8859f, 0x00e88693, 0x00e886a9, 0x00e886b0,
+ /* b9 */ 0x00e886b5, 0x00e886be, 0x00e886b8, 0x00e886bd,
+ /* bd */ 0x00e88780, 0x00e88782, 0x00e886ba, 0x00e88789,
+ /* c1 */ 0x00e8878d, 0x00e88791, 0x00e88799, 0x00e88798,
+ /* c5 */ 0x00e88788, 0x00e8879a, 0x00e8879f, 0x00e887a0,
+ /* c9 */ 0x00e887a7, 0x00e887ba, 0x00e887bb, 0x00e887be,
+ /* cd */ 0x00e88881, 0x00e88882, 0x00e88885, 0x00e88887,
+ /* d1 */ 0x00e8888a, 0x00e8888d, 0x00e88890, 0x00e88896,
+ /* d5 */ 0x00e888a9, 0x00e888ab, 0x00e888b8, 0x00e888b3,
+ /* d9 */ 0x00e88980, 0x00e88999, 0x00e88998, 0x00e8899d,
+ /* dd */ 0x00e8899a, 0x00e8899f, 0x00e889a4, 0x00e889a2,
+ /* e1 */ 0x00e889a8, 0x00e889aa, 0x00e889ab, 0x00e888ae,
+ /* e5 */ 0x00e889b1, 0x00e889b7, 0x00e889b8, 0x00e889be,
+ /* e9 */ 0x00e88a8d, 0x00e88a92, 0x00e88aab, 0x00e88a9f,
+ /* ed */ 0x00e88abb, 0x00e88aac, 0x00e88ba1, 0x00e88ba3,
+ /* f1 */ 0x00e88b9f, 0x00e88b92, 0x00e88bb4, 0x00e88bb3,
+ /* f5 */ 0x00e88bba, 0x00e88e93, 0x00e88c83, 0x00e88bbb,
+ /* f9 */ 0x00e88bb9, 0x00e88b9e, 0x00e88c86, 0x00e88b9c,
+ /* fd */ 0x00e88c89, 0x00e88b99,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01b72 ***/
+
+ /* a1 */ 0x00e88cb5, 0x00e88cb4, 0x00e88c96, 0x00e88cb2,
+ /* a5 */ 0x00e88cb1, 0x00e88d80, 0x00e88cb9, 0x00e88d90,
+ /* a9 */ 0x00e88d85, 0x00e88caf, 0x00e88cab, 0x00e88c97,
+ /* ad */ 0x00e88c98, 0x00e88e85, 0x00e88e9a, 0x00e88eaa,
+ /* b1 */ 0x00e88e9f, 0x00e88ea2, 0x00e88e96, 0x00e88ca3,
+ /* b5 */ 0x00e88e8e, 0x00e88e87, 0x00e88e8a, 0x00e88dbc,
+ /* b9 */ 0x00e88eb5, 0x00e88db3, 0x00e88db5, 0x00e88ea0,
+ /* bd */ 0x00e88e89, 0x00e88ea8, 0x00e88fb4, 0x00e89093,
+ /* c1 */ 0x00e88fab, 0x00e88f8e, 0x00e88fbd, 0x00e89083,
+ /* c5 */ 0x00e88f98, 0x00e8908b, 0x00e88f81, 0x00e88fb7,
+ /* c9 */ 0x00e89087, 0x00e88fa0, 0x00e88fb2, 0x00e8908d,
+ /* cd */ 0x00e890a2, 0x00e890a0, 0x00e88ebd, 0x00e890b8,
+ /* d1 */ 0x00e89486, 0x00e88fbb, 0x00e891ad, 0x00e890aa,
+ /* d5 */ 0x00e890bc, 0x00e8959a, 0x00e89284, 0x00e891b7,
+ /* d9 */ 0x00e891ab, 0x00e892ad, 0x00e891ae, 0x00e89282,
+ /* dd */ 0x00e891a9, 0x00e89186, 0x00e890ac, 0x00e891af,
+ /* e1 */ 0x00e891b9, 0x00e890b5, 0x00e8938a, 0x00e891a2,
+ /* e5 */ 0x00e892b9, 0x00e892bf, 0x00e8929f, 0x00e89399,
+ /* e9 */ 0x00e8938d, 0x00e892bb, 0x00e8939a, 0x00e89390,
+ /* ed */ 0x00e89381, 0x00e89386, 0x00e89396, 0x00e892a1,
+ /* f1 */ 0x00e894a1, 0x00e893bf, 0x00e893b4, 0x00e89497,
+ /* f5 */ 0x00e89498, 0x00e894ac, 0x00e8949f, 0x00e89495,
+ /* f9 */ 0x00e89494, 0x00e893bc, 0x00e89580, 0x00e895a3,
+ /* fd */ 0x00e89598, 0x00e89588,
+
+ /*** Two byte table, leaf: e9xx - offset 0x01bd0 ***/
+
+ /* a1 */ 0x00e89581, 0x00e89882, 0x00e8958b, 0x00e89595,
+ /* a5 */ 0x00e89680, 0x00e896a4, 0x00e89688, 0x00e89691,
+ /* a9 */ 0x00e8968a, 0x00e896a8, 0x00e895ad, 0x00e89694,
+ /* ad */ 0x00e8969b, 0x00e897aa, 0x00e89687, 0x00e8969c,
+ /* b1 */ 0x00e895b7, 0x00e895be, 0x00e89690, 0x00e89789,
+ /* b5 */ 0x00e896ba, 0x00e8978f, 0x00e896b9, 0x00e89790,
+ /* b9 */ 0x00e89795, 0x00e8979d, 0x00e897a5, 0x00e8979c,
+ /* bd */ 0x00e897b9, 0x00e8988a, 0x00e89893, 0x00e8988b,
+ /* c1 */ 0x00e897be, 0x00e897ba, 0x00e89886, 0x00e898a2,
+ /* c5 */ 0x00e8989a, 0x00e898b0, 0x00e898bf, 0x00e8998d,
+ /* c9 */ 0x00e4b995, 0x00e89994, 0x00e8999f, 0x00e899a7,
+ /* cd */ 0x00e899b1, 0x00e89a93, 0x00e89aa3, 0x00e89aa9,
+ /* d1 */ 0x00e89aaa, 0x00e89a8b, 0x00e89a8c, 0x00e89ab6,
+ /* d5 */ 0x00e89aaf, 0x00e89b84, 0x00e89b86, 0x00e89ab0,
+ /* d9 */ 0x00e89b89, 0x00e8a0a3, 0x00e89aab, 0x00e89b94,
+ /* dd */ 0x00e89b9e, 0x00e89ba9, 0x00e89bac, 0x00e89b9f,
+ /* e1 */ 0x00e89b9b, 0x00e89baf, 0x00e89c92, 0x00e89c86,
+ /* e5 */ 0x00e89c88, 0x00e89c80, 0x00e89c83, 0x00e89bbb,
+ /* e9 */ 0x00e89c91, 0x00e89c89, 0x00e89c8d, 0x00e89bb9,
+ /* ed */ 0x00e89c8a, 0x00e89cb4, 0x00e89cbf, 0x00e89cb7,
+ /* f1 */ 0x00e89cbb, 0x00e89ca5, 0x00e89ca9, 0x00e89c9a,
+ /* f5 */ 0x00e89da0, 0x00e89d9f, 0x00e89db8, 0x00e89d8c,
+ /* f9 */ 0x00e89d8e, 0x00e89db4, 0x00e89d97, 0x00e89da8,
+ /* fd */ 0x00e89dae, 0x00e89d99,
+
+ /*** Two byte table, leaf: eaxx - offset 0x01c2e ***/
+
+ /* a1 */ 0x00e89d93, 0x00e89da3, 0x00e89daa, 0x00e8a085,
+ /* a5 */ 0x00e89ea2, 0x00e89e9f, 0x00e89e82, 0x00e89eaf,
+ /* a9 */ 0x00e89f8b, 0x00e89ebd, 0x00e89f80, 0x00e89f90,
+ /* ad */ 0x00e99b96, 0x00e89eab, 0x00e89f84, 0x00e89eb3,
+ /* b1 */ 0x00e89f87, 0x00e89f86, 0x00e89ebb, 0x00e89faf,
+ /* b5 */ 0x00e89fb2, 0x00e89fa0, 0x00e8a08f, 0x00e8a08d,
+ /* b9 */ 0x00e89fbe, 0x00e89fb6, 0x00e89fb7, 0x00e8a08e,
+ /* bd */ 0x00e89f92, 0x00e8a091, 0x00e8a096, 0x00e8a095,
+ /* c1 */ 0x00e8a0a2, 0x00e8a0a1, 0x00e8a0b1, 0x00e8a0b6,
+ /* c5 */ 0x00e8a0b9, 0x00e8a0a7, 0x00e8a0bb, 0x00e8a184,
+ /* c9 */ 0x00e8a182, 0x00e8a192, 0x00e8a199, 0x00e8a19e,
+ /* cd */ 0x00e8a1a2, 0x00e8a1ab, 0x00e8a281, 0x00e8a1be,
+ /* d1 */ 0x00e8a29e, 0x00e8a1b5, 0x00e8a1bd, 0x00e8a2b5,
+ /* d5 */ 0x00e8a1b2, 0x00e8a282, 0x00e8a297, 0x00e8a292,
+ /* d9 */ 0x00e8a2ae, 0x00e8a299, 0x00e8a2a2, 0x00e8a28d,
+ /* dd */ 0x00e8a2a4, 0x00e8a2b0, 0x00e8a2bf, 0x00e8a2b1,
+ /* e1 */ 0x00e8a383, 0x00e8a384, 0x00e8a394, 0x00e8a398,
+ /* e5 */ 0x00e8a399, 0x00e8a39d, 0x00e8a3b9, 0x00e8a482,
+ /* e9 */ 0x00e8a3bc, 0x00e8a3b4, 0x00e8a3a8, 0x00e8a3b2,
+ /* ed */ 0x00e8a484, 0x00e8a48c, 0x00e8a48a, 0x00e8a493,
+ /* f1 */ 0x00e8a583, 0x00e8a49e, 0x00e8a4a5, 0x00e8a4aa,
+ /* f5 */ 0x00e8a4ab, 0x00e8a581, 0x00e8a584, 0x00e8a4bb,
+ /* f9 */ 0x00e8a4b6, 0x00e8a4b8, 0x00e8a58c, 0x00e8a49d,
+ /* fd */ 0x00e8a5a0, 0x00e8a59e,
+
+ /*** Two byte table, leaf: ebxx - offset 0x01c8c ***/
+
+ /* a1 */ 0x00e8a5a6, 0x00e8a5a4, 0x00e8a5ad, 0x00e8a5aa,
+ /* a5 */ 0x00e8a5af, 0x00e8a5b4, 0x00e8a5b7, 0x00e8a5be,
+ /* a9 */ 0x00e8a683, 0x00e8a688, 0x00e8a68a, 0x00e8a693,
+ /* ad */ 0x00e8a698, 0x00e8a6a1, 0x00e8a6a9, 0x00e8a6a6,
+ /* b1 */ 0x00e8a6ac, 0x00e8a6af, 0x00e8a6b2, 0x00e8a6ba,
+ /* b5 */ 0x00e8a6bd, 0x00e8a6bf, 0x00e8a780, 0x00e8a79a,
+ /* b9 */ 0x00e8a79c, 0x00e8a79d, 0x00e8a7a7, 0x00e8a7b4,
+ /* bd */ 0x00e8a7b8, 0x00e8a883, 0x00e8a896, 0x00e8a890,
+ /* c1 */ 0x00e8a88c, 0x00e8a89b, 0x00e8a89d, 0x00e8a8a5,
+ /* c5 */ 0x00e8a8b6, 0x00e8a981, 0x00e8a99b, 0x00e8a992,
+ /* c9 */ 0x00e8a986, 0x00e8a988, 0x00e8a9bc, 0x00e8a9ad,
+ /* cd */ 0x00e8a9ac, 0x00e8a9a2, 0x00e8aa85, 0x00e8aa82,
+ /* d1 */ 0x00e8aa84, 0x00e8aaa8, 0x00e8aaa1, 0x00e8aa91,
+ /* d5 */ 0x00e8aaa5, 0x00e8aaa6, 0x00e8aa9a, 0x00e8aaa3,
+ /* d9 */ 0x00e8ab84, 0x00e8ab8d, 0x00e8ab82, 0x00e8ab9a,
+ /* dd */ 0x00e8abab, 0x00e8abb3, 0x00e8aba7, 0x00e8aba4,
+ /* e1 */ 0x00e8abb1, 0x00e8ac94, 0x00e8aba0, 0x00e8aba2,
+ /* e5 */ 0x00e8abb7, 0x00e8ab9e, 0x00e8ab9b, 0x00e8ac8c,
+ /* e9 */ 0x00e8ac87, 0x00e8ac9a, 0x00e8aba1, 0x00e8ac96,
+ /* ed */ 0x00e8ac90, 0x00e8ac97, 0x00e8aca0, 0x00e8acb3,
+ /* f1 */ 0x00e99eab, 0x00e8aca6, 0x00e8acab, 0x00e8acbe,
+ /* f5 */ 0x00e8aca8, 0x00e8ad81, 0x00e8ad8c, 0x00e8ad8f,
+ /* f9 */ 0x00e8ad8e, 0x00e8ad89, 0x00e8ad96, 0x00e8ad9b,
+ /* fd */ 0x00e8ad9a, 0x00e8adab,
+
+ /*** Two byte table, leaf: ecxx - offset 0x01cea ***/
+
+ /* a1 */ 0x00e8ad9f, 0x00e8adac, 0x00e8adaf, 0x00e8adb4,
+ /* a5 */ 0x00e8adbd, 0x00e8ae80, 0x00e8ae8c, 0x00e8ae8e,
+ /* a9 */ 0x00e8ae92, 0x00e8ae93, 0x00e8ae96, 0x00e8ae99,
+ /* ad */ 0x00e8ae9a, 0x00e8b0ba, 0x00e8b181, 0x00e8b0bf,
+ /* b1 */ 0x00e8b188, 0x00e8b18c, 0x00e8b18e, 0x00e8b190,
+ /* b5 */ 0x00e8b195, 0x00e8b1a2, 0x00e8b1ac, 0x00e8b1b8,
+ /* b9 */ 0x00e8b1ba, 0x00e8b282, 0x00e8b289, 0x00e8b285,
+ /* bd */ 0x00e8b28a, 0x00e8b28d, 0x00e8b28e, 0x00e8b294,
+ /* c1 */ 0x00e8b1bc, 0x00e8b298, 0x00e6889d, 0x00e8b2ad,
+ /* c5 */ 0x00e8b2aa, 0x00e8b2bd, 0x00e8b2b2, 0x00e8b2b3,
+ /* c9 */ 0x00e8b2ae, 0x00e8b2b6, 0x00e8b388, 0x00e8b381,
+ /* cd */ 0x00e8b3a4, 0x00e8b3a3, 0x00e8b39a, 0x00e8b3bd,
+ /* d1 */ 0x00e8b3ba, 0x00e8b3bb, 0x00e8b484, 0x00e8b485,
+ /* d5 */ 0x00e8b48a, 0x00e8b487, 0x00e8b48f, 0x00e8b48d,
+ /* d9 */ 0x00e8b490, 0x00e9bd8e, 0x00e8b493, 0x00e8b38d,
+ /* dd */ 0x00e8b494, 0x00e8b496, 0x00e8b5a7, 0x00e8b5ad,
+ /* e1 */ 0x00e8b5b1, 0x00e8b5b3, 0x00e8b681, 0x00e8b699,
+ /* e5 */ 0x00e8b782, 0x00e8b6be, 0x00e8b6ba, 0x00e8b78f,
+ /* e9 */ 0x00e8b79a, 0x00e8b796, 0x00e8b78c, 0x00e8b79b,
+ /* ed */ 0x00e8b78b, 0x00e8b7aa, 0x00e8b7ab, 0x00e8b79f,
+ /* f1 */ 0x00e8b7a3, 0x00e8b7bc, 0x00e8b888, 0x00e8b889,
+ /* f5 */ 0x00e8b7bf, 0x00e8b89d, 0x00e8b89e, 0x00e8b890,
+ /* f9 */ 0x00e8b89f, 0x00e8b982, 0x00e8b8b5, 0x00e8b8b0,
+ /* fd */ 0x00e8b8b4, 0x00e8b98a,
+
+ /*** Two byte table, leaf: edxx - offset 0x01d48 ***/
+
+ /* a1 */ 0x00e8b987, 0x00e8b989, 0x00e8b98c, 0x00e8b990,
+ /* a5 */ 0x00e8b988, 0x00e8b999, 0x00e8b9a4, 0x00e8b9a0,
+ /* a9 */ 0x00e8b8aa, 0x00e8b9a3, 0x00e8b995, 0x00e8b9b6,
+ /* ad */ 0x00e8b9b2, 0x00e8b9bc, 0x00e8ba81, 0x00e8ba87,
+ /* b1 */ 0x00e8ba85, 0x00e8ba84, 0x00e8ba8b, 0x00e8ba8a,
+ /* b5 */ 0x00e8ba93, 0x00e8ba91, 0x00e8ba94, 0x00e8ba99,
+ /* b9 */ 0x00e8baaa, 0x00e8baa1, 0x00e8baac, 0x00e8bab0,
+ /* bd */ 0x00e8bb86, 0x00e8bab1, 0x00e8babe, 0x00e8bb85,
+ /* c1 */ 0x00e8bb88, 0x00e8bb8b, 0x00e8bb9b, 0x00e8bba3,
+ /* c5 */ 0x00e8bbbc, 0x00e8bbbb, 0x00e8bbab, 0x00e8bbbe,
+ /* c9 */ 0x00e8bc8a, 0x00e8bc85, 0x00e8bc95, 0x00e8bc92,
+ /* cd */ 0x00e8bc99, 0x00e8bc93, 0x00e8bc9c, 0x00e8bc9f,
+ /* d1 */ 0x00e8bc9b, 0x00e8bc8c, 0x00e8bca6, 0x00e8bcb3,
+ /* d5 */ 0x00e8bcbb, 0x00e8bcb9, 0x00e8bd85, 0x00e8bd82,
+ /* d9 */ 0x00e8bcbe, 0x00e8bd8c, 0x00e8bd89, 0x00e8bd86,
+ /* dd */ 0x00e8bd8e, 0x00e8bd97, 0x00e8bd9c, 0x00e8bda2,
+ /* e1 */ 0x00e8bda3, 0x00e8bda4, 0x00e8be9c, 0x00e8be9f,
+ /* e5 */ 0x00e8bea3, 0x00e8bead, 0x00e8beaf, 0x00e8beb7,
+ /* e9 */ 0x00e8bf9a, 0x00e8bfa5, 0x00e8bfa2, 0x00e8bfaa,
+ /* ed */ 0x00e8bfaf, 0x00e98287, 0x00e8bfb4, 0x00e98085,
+ /* f1 */ 0x00e8bfb9, 0x00e8bfba, 0x00e98091, 0x00e98095,
+ /* f5 */ 0x00e980a1, 0x00e9808d, 0x00e9809e, 0x00e98096,
+ /* f9 */ 0x00e9808b, 0x00e980a7, 0x00e980b6, 0x00e980b5,
+ /* fd */ 0x00e980b9, 0x00e8bfb8,
+
+ /*** Two byte table, leaf: eexx - offset 0x01da6 ***/
+
+ /* a1 */ 0x00e9818f, 0x00e98190, 0x00e98191, 0x00e98192,
+ /* a5 */ 0x00e9808e, 0x00e98189, 0x00e980be, 0x00e98196,
+ /* a9 */ 0x00e98198, 0x00e9819e, 0x00e981a8, 0x00e981af,
+ /* ad */ 0x00e981b6, 0x00e99aa8, 0x00e981b2, 0x00e98282,
+ /* b1 */ 0x00e981bd, 0x00e98281, 0x00e98280, 0x00e9828a,
+ /* b5 */ 0x00e98289, 0x00e9828f, 0x00e982a8, 0x00e982af,
+ /* b9 */ 0x00e982b1, 0x00e982b5, 0x00e983a2, 0x00e983a4,
+ /* bd */ 0x00e68988, 0x00e9839b, 0x00e98482, 0x00e98492,
+ /* c1 */ 0x00e98499, 0x00e984b2, 0x00e984b0, 0x00e9858a,
+ /* c5 */ 0x00e98596, 0x00e98598, 0x00e985a3, 0x00e985a5,
+ /* c9 */ 0x00e985a9, 0x00e985b3, 0x00e985b2, 0x00e9868b,
+ /* cd */ 0x00e98689, 0x00e98682, 0x00e986a2, 0x00e986ab,
+ /* d1 */ 0x00e986af, 0x00e986aa, 0x00e986b5, 0x00e986b4,
+ /* d5 */ 0x00e986ba, 0x00e98780, 0x00e98781, 0x00e98789,
+ /* d9 */ 0x00e9878b, 0x00e98790, 0x00e98796, 0x00e9879f,
+ /* dd */ 0x00e987a1, 0x00e9879b, 0x00e987bc, 0x00e987b5,
+ /* e1 */ 0x00e987b6, 0x00e9889e, 0x00e987bf, 0x00e98894,
+ /* e5 */ 0x00e988ac, 0x00e98895, 0x00e98891, 0x00e9899e,
+ /* e9 */ 0x00e98997, 0x00e98985, 0x00e98989, 0x00e989a4,
+ /* ed */ 0x00e98988, 0x00e98a95, 0x00e988bf, 0x00e9898b,
+ /* f1 */ 0x00e98990, 0x00e98a9c, 0x00e98a96, 0x00e98a93,
+ /* f5 */ 0x00e98a9b, 0x00e9899a, 0x00e98b8f, 0x00e98ab9,
+ /* f9 */ 0x00e98ab7, 0x00e98ba9, 0x00e98c8f, 0x00e98bba,
+ /* fd */ 0x00e98d84, 0x00e98cae,
+
+ /*** Two byte table, leaf: efxx - offset 0x01e04 ***/
+
+ /* a1 */ 0x00e98c99, 0x00e98ca2, 0x00e98c9a, 0x00e98ca3,
+ /* a5 */ 0x00e98cba, 0x00e98cb5, 0x00e98cbb, 0x00e98d9c,
+ /* a9 */ 0x00e98da0, 0x00e98dbc, 0x00e98dae, 0x00e98d96,
+ /* ad */ 0x00e98eb0, 0x00e98eac, 0x00e98ead, 0x00e98e94,
+ /* b1 */ 0x00e98eb9, 0x00e98f96, 0x00e98f97, 0x00e98fa8,
+ /* b5 */ 0x00e98fa5, 0x00e98f98, 0x00e98f83, 0x00e98f9d,
+ /* b9 */ 0x00e98f90, 0x00e98f88, 0x00e98fa4, 0x00e9909a,
+ /* bd */ 0x00e99094, 0x00e99093, 0x00e99083, 0x00e99087,
+ /* c1 */ 0x00e99090, 0x00e990b6, 0x00e990ab, 0x00e990b5,
+ /* c5 */ 0x00e990a1, 0x00e990ba, 0x00e99181, 0x00e99192,
+ /* c9 */ 0x00e99184, 0x00e9919b, 0x00e991a0, 0x00e991a2,
+ /* cd */ 0x00e9919e, 0x00e991aa, 0x00e988a9, 0x00e991b0,
+ /* d1 */ 0x00e991b5, 0x00e991b7, 0x00e991bd, 0x00e9919a,
+ /* d5 */ 0x00e991bc, 0x00e991be, 0x00e99281, 0x00e991bf,
+ /* d9 */ 0x00e99682, 0x00e99687, 0x00e9968a, 0x00e99694,
+ /* dd */ 0x00e99696, 0x00e99698, 0x00e99699, 0x00e996a0,
+ /* e1 */ 0x00e996a8, 0x00e996a7, 0x00e996ad, 0x00e996bc,
+ /* e5 */ 0x00e996bb, 0x00e996b9, 0x00e996be, 0x00e9978a,
+ /* e9 */ 0x00e6bfb6, 0x00e99783, 0x00e9978d, 0x00e9978c,
+ /* ed */ 0x00e99795, 0x00e99794, 0x00e99796, 0x00e9979c,
+ /* f1 */ 0x00e997a1, 0x00e997a5, 0x00e997a2, 0x00e998a1,
+ /* f5 */ 0x00e998a8, 0x00e998ae, 0x00e998af, 0x00e99982,
+ /* f9 */ 0x00e9998c, 0x00e9998f, 0x00e9998b, 0x00e999b7,
+ /* fd */ 0x00e9999c, 0x00e9999e,
+
+ /*** Two byte table, leaf: f0xx - offset 0x01e62 ***/
+
+ /* a1 */ 0x00e9999d, 0x00e9999f, 0x00e999a6, 0x00e999b2,
+ /* a5 */ 0x00e999ac, 0x00e99a8d, 0x00e99a98, 0x00e99a95,
+ /* a9 */ 0x00e99a97, 0x00e99aaa, 0x00e99aa7, 0x00e99ab1,
+ /* ad */ 0x00e99ab2, 0x00e99ab0, 0x00e99ab4, 0x00e99ab6,
+ /* b1 */ 0x00e99ab8, 0x00e99ab9, 0x00e99b8e, 0x00e99b8b,
+ /* b5 */ 0x00e99b89, 0x00e99b8d, 0x00e8a58d, 0x00e99b9c,
+ /* b9 */ 0x00e99c8d, 0x00e99b95, 0x00e99bb9, 0x00e99c84,
+ /* bd */ 0x00e99c86, 0x00e99c88, 0x00e99c93, 0x00e99c8e,
+ /* c1 */ 0x00e99c91, 0x00e99c8f, 0x00e99c96, 0x00e99c99,
+ /* c5 */ 0x00e99ca4, 0x00e99caa, 0x00e99cb0, 0x00e99cb9,
+ /* c9 */ 0x00e99cbd, 0x00e99cbe, 0x00e99d84, 0x00e99d86,
+ /* cd */ 0x00e99d88, 0x00e99d82, 0x00e99d89, 0x00e99d9c,
+ /* d1 */ 0x00e99da0, 0x00e99da4, 0x00e99da6, 0x00e99da8,
+ /* d5 */ 0x00e58b92, 0x00e99dab, 0x00e99db1, 0x00e99db9,
+ /* d9 */ 0x00e99e85, 0x00e99dbc, 0x00e99e81, 0x00e99dba,
+ /* dd */ 0x00e99e86, 0x00e99e8b, 0x00e99e8f, 0x00e99e90,
+ /* e1 */ 0x00e99e9c, 0x00e99ea8, 0x00e99ea6, 0x00e99ea3,
+ /* e5 */ 0x00e99eb3, 0x00e99eb4, 0x00e99f83, 0x00e99f86,
+ /* e9 */ 0x00e99f88, 0x00e99f8b, 0x00e99f9c, 0x00e99fad,
+ /* ed */ 0x00e9bd8f, 0x00e99fb2, 0x00e7ab9f, 0x00e99fb6,
+ /* f1 */ 0x00e99fb5, 0x00e9a08f, 0x00e9a08c, 0x00e9a0b8,
+ /* f5 */ 0x00e9a0a4, 0x00e9a0a1, 0x00e9a0b7, 0x00e9a0bd,
+ /* f9 */ 0x00e9a186, 0x00e9a18f, 0x00e9a18b, 0x00e9a1ab,
+ /* fd */ 0x00e9a1af, 0x00e9a1b0,
+
+ /*** Two byte table, leaf: f1xx - offset 0x01ec0 ***/
+
+ /* a1 */ 0x00e9a1b1, 0x00e9a1b4, 0x00e9a1b3, 0x00e9a2aa,
+ /* a5 */ 0x00e9a2af, 0x00e9a2b1, 0x00e9a2b6, 0x00e9a384,
+ /* a9 */ 0x00e9a383, 0x00e9a386, 0x00e9a3a9, 0x00e9a3ab,
+ /* ad */ 0x00e9a483, 0x00e9a489, 0x00e9a492, 0x00e9a494,
+ /* b1 */ 0x00e9a498, 0x00e9a4a1, 0x00e9a49d, 0x00e9a49e,
+ /* b5 */ 0x00e9a4a4, 0x00e9a4a0, 0x00e9a4ac, 0x00e9a4ae,
+ /* b9 */ 0x00e9a4bd, 0x00e9a4be, 0x00e9a582, 0x00e9a589,
+ /* bd */ 0x00e9a585, 0x00e9a590, 0x00e9a58b, 0x00e9a591,
+ /* c1 */ 0x00e9a592, 0x00e9a58c, 0x00e9a595, 0x00e9a697,
+ /* c5 */ 0x00e9a698, 0x00e9a6a5, 0x00e9a6ad, 0x00e9a6ae,
+ /* c9 */ 0x00e9a6bc, 0x00e9a79f, 0x00e9a79b, 0x00e9a79d,
+ /* cd */ 0x00e9a798, 0x00e9a791, 0x00e9a7ad, 0x00e9a7ae,
+ /* d1 */ 0x00e9a7b1, 0x00e9a7b2, 0x00e9a7bb, 0x00e9a7b8,
+ /* d5 */ 0x00e9a881, 0x00e9a88f, 0x00e9a885, 0x00e9a7a2,
+ /* d9 */ 0x00e9a899, 0x00e9a8ab, 0x00e9a8b7, 0x00e9a985,
+ /* dd */ 0x00e9a982, 0x00e9a980, 0x00e9a983, 0x00e9a8be,
+ /* e1 */ 0x00e9a995, 0x00e9a98d, 0x00e9a99b, 0x00e9a997,
+ /* e5 */ 0x00e9a99f, 0x00e9a9a2, 0x00e9a9a5, 0x00e9a9a4,
+ /* e9 */ 0x00e9a9a9, 0x00e9a9ab, 0x00e9a9aa, 0x00e9aaad,
+ /* ed */ 0x00e9aab0, 0x00e9aabc, 0x00e9ab80, 0x00e9ab8f,
+ /* f1 */ 0x00e9ab91, 0x00e9ab93, 0x00e9ab94, 0x00e9ab9e,
+ /* f5 */ 0x00e9ab9f, 0x00e9aba2, 0x00e9aba3, 0x00e9aba6,
+ /* f9 */ 0x00e9abaf, 0x00e9abab, 0x00e9abae, 0x00e9abb4,
+ /* fd */ 0x00e9abb1, 0x00e9abb7,
+
+ /*** Two byte table, leaf: f2xx - offset 0x01f1e ***/
+
+ /* a1 */ 0x00e9abbb, 0x00e9ac86, 0x00e9ac98, 0x00e9ac9a,
+ /* a5 */ 0x00e9ac9f, 0x00e9aca2, 0x00e9aca3, 0x00e9aca5,
+ /* a9 */ 0x00e9aca7, 0x00e9aca8, 0x00e9aca9, 0x00e9acaa,
+ /* ad */ 0x00e9acae, 0x00e9acaf, 0x00e9acb2, 0x00e9ad84,
+ /* b1 */ 0x00e9ad83, 0x00e9ad8f, 0x00e9ad8d, 0x00e9ad8e,
+ /* b5 */ 0x00e9ad91, 0x00e9ad98, 0x00e9adb4, 0x00e9ae93,
+ /* b9 */ 0x00e9ae83, 0x00e9ae91, 0x00e9ae96, 0x00e9ae97,
+ /* bd */ 0x00e9ae9f, 0x00e9aea0, 0x00e9aea8, 0x00e9aeb4,
+ /* c1 */ 0x00e9af80, 0x00e9af8a, 0x00e9aeb9, 0x00e9af86,
+ /* c5 */ 0x00e9af8f, 0x00e9af91, 0x00e9af92, 0x00e9afa3,
+ /* c9 */ 0x00e9afa2, 0x00e9afa4, 0x00e9af94, 0x00e9afa1,
+ /* cd */ 0x00e9b0ba, 0x00e9afb2, 0x00e9afb1, 0x00e9afb0,
+ /* d1 */ 0x00e9b095, 0x00e9b094, 0x00e9b089, 0x00e9b093,
+ /* d5 */ 0x00e9b08c, 0x00e9b086, 0x00e9b088, 0x00e9b092,
+ /* d9 */ 0x00e9b08a, 0x00e9b084, 0x00e9b0ae, 0x00e9b09b,
+ /* dd */ 0x00e9b0a5, 0x00e9b0a4, 0x00e9b0a1, 0x00e9b0b0,
+ /* e1 */ 0x00e9b187, 0x00e9b0b2, 0x00e9b186, 0x00e9b0be,
+ /* e5 */ 0x00e9b19a, 0x00e9b1a0, 0x00e9b1a7, 0x00e9b1b6,
+ /* e9 */ 0x00e9b1b8, 0x00e9b3a7, 0x00e9b3ac, 0x00e9b3b0,
+ /* ed */ 0x00e9b489, 0x00e9b488, 0x00e9b3ab, 0x00e9b483,
+ /* f1 */ 0x00e9b486, 0x00e9b4aa, 0x00e9b4a6, 0x00e9b6af,
+ /* f5 */ 0x00e9b4a3, 0x00e9b49f, 0x00e9b584, 0x00e9b495,
+ /* f9 */ 0x00e9b492, 0x00e9b581, 0x00e9b4bf, 0x00e9b4be,
+ /* fd */ 0x00e9b586, 0x00e9b588,
+
+ /*** Two byte table, leaf: f3xx - offset 0x01f7c ***/
+
+ /* a1 */ 0x00e9b59d, 0x00e9b59e, 0x00e9b5a4, 0x00e9b591,
+ /* a5 */ 0x00e9b590, 0x00e9b599, 0x00e9b5b2, 0x00e9b689,
+ /* a9 */ 0x00e9b687, 0x00e9b6ab, 0x00e9b5af, 0x00e9b5ba,
+ /* ad */ 0x00e9b69a, 0x00e9b6a4, 0x00e9b6a9, 0x00e9b6b2,
+ /* b1 */ 0x00e9b784, 0x00e9b781, 0x00e9b6bb, 0x00e9b6b8,
+ /* b5 */ 0x00e9b6ba, 0x00e9b786, 0x00e9b78f, 0x00e9b782,
+ /* b9 */ 0x00e9b799, 0x00e9b793, 0x00e9b7b8, 0x00e9b7a6,
+ /* bd */ 0x00e9b7ad, 0x00e9b7af, 0x00e9b7bd, 0x00e9b89a,
+ /* c1 */ 0x00e9b89b, 0x00e9b89e, 0x00e9b9b5, 0x00e9b9b9,
+ /* c5 */ 0x00e9b9bd, 0x00e9ba81, 0x00e9ba88, 0x00e9ba8b,
+ /* c9 */ 0x00e9ba8c, 0x00e9ba92, 0x00e9ba95, 0x00e9ba91,
+ /* cd */ 0x00e9ba9d, 0x00e9baa5, 0x00e9baa9, 0x00e9bab8,
+ /* d1 */ 0x00e9baaa, 0x00e9baad, 0x00e99da1, 0x00e9bb8c,
+ /* d5 */ 0x00e9bb8e, 0x00e9bb8f, 0x00e9bb90, 0x00e9bb94,
+ /* d9 */ 0x00e9bb9c, 0x00e9bb9e, 0x00e9bb9d, 0x00e9bba0,
+ /* dd */ 0x00e9bba5, 0x00e9bba8, 0x00e9bbaf, 0x00e9bbb4,
+ /* e1 */ 0x00e9bbb6, 0x00e9bbb7, 0x00e9bbb9, 0x00e9bbbb,
+ /* e5 */ 0x00e9bbbc, 0x00e9bbbd, 0x00e9bc87, 0x00e9bc88,
+ /* e9 */ 0x00e79ab7, 0x00e9bc95, 0x00e9bca1, 0x00e9bcac,
+ /* ed */ 0x00e9bcbe, 0x00e9bd8a, 0x00e9bd92, 0x00e9bd94,
+ /* f1 */ 0x00e9bda3, 0x00e9bd9f, 0x00e9bda0, 0x00e9bda1,
+ /* f5 */ 0x00e9bda6, 0x00e9bda7, 0x00e9bdac, 0x00e9bdaa,
+ /* f9 */ 0x00e9bdb7, 0x00e9bdb2, 0x00e9bdb6, 0x00e9be95,
+ /* fd */ 0x00e9be9c, 0x00e9bea0,
+
+ /*** Two byte table, leaf: f4xx - offset 0x01fda ***/
+
+ /* a1 */ 0x00e5a0af, 0x00e6a787, 0x00e98199, 0x00e791a4,
+ /* a5 */ 0x00e5879c, 0x00e78699, 0x00e59993, 0x00e5b7a2,
+ /* a9 */ 0x00e5b894, 0x00e5b898, 0x00e5b998, 0x00e5b99e,
+ /* ad */ 0x00e5babe, 0x00efa4a8, 0x00e5bb8b, 0x00e5bbb9,
+ /* b1 */ 0x00e5bc80, 0x00e5bc82, 0x00e5bc87, 0x00e5bc9d,
+ /* b5 */ 0x00e5bca3, 0x00e5bcb4, 0x00e5bcb6, 0x00e5bcbd,
+ /* b9 */ 0x00e5bd80, 0x00e5bd85, 0x00e5bd94, 0x00e5bd98,
+ /* bd */ 0x00e5bda4, 0x00e5bda7, 0x00e5bdbd, 0x00e5be89,
+ /* c1 */ 0x00e5be9c, 0x00e5bea7, 0x00e5beaf, 0x00e5beb5,
+ /* c5 */ 0x00e5beb7, 0x00e5bf89, 0x00e5bf9e, 0x00e5bfa1,
+ /* c9 */ 0x00e5bfa9, 0x00e6808d, 0x00e68094, 0x00e68098,
+ /* cd */ 0x00e680b3, 0x00e680b5, 0x00e68187, 0x00efa8bd,
+ /* d1 */ 0x00e6829d, 0x00e6829e, 0x00e6838b, 0x00e68394,
+ /* d5 */ 0x00e68395, 0x00e6839d, 0x00e683b8, 0x00e6849c,
+ /* d9 */ 0x00e684ab, 0x00e684b0, 0x00e684b7, 0x00efa8be,
+ /* dd */ 0x00e6868d, 0x00efa8bf, 0x00e686bc, 0x00e686b9,
+ /* e1 */ 0x00efa980, 0x00e688a2, 0x00e688be, 0x00e68983,
+ /* e5 */ 0x00e68996, 0x00e6899a, 0x00e689af, 0x00e68a85,
+ /* e9 */ 0x00e68b84, 0x00e68b96, 0x00e68bbc, 0x00e68c8a,
+ /* ed */ 0x00e68c98, 0x00e68cb9, 0x00e68d83, 0x00e68da5,
+ /* f1 */ 0x00e68dbc, 0x00e68fa5, 0x00e68fad, 0x00e68fb5,
+ /* f5 */ 0x00e69090, 0x00e69094, 0x00e690a2, 0x00e691b9,
+ /* f9 */ 0x00e69191, 0x00e691a0, 0x00e691ad, 0x00e6938e,
+ /* fd */ 0x00e692be, 0x00e692bf,
+
+ /*** Two byte table, leaf: f5xx - offset 0x02038 ***/
+
+ /* a1 */ 0x00e69384, 0x00e6938a, 0x00e69390, 0x00e693b7,
+ /* a5 */ 0x00e693bb, 0x00e694a2, 0x00e694a9, 0x00efa981,
+ /* a9 */ 0x00e695a7, 0x00e6969d, 0x00efa982, 0x00e69880,
+ /* ad */ 0x00e69889, 0x00e69895, 0x00e6989e, 0x00e698ba,
+ /* b1 */ 0x00e698a2, 0x00e698a4, 0x00e698ab, 0x00e698b0,
+ /* b5 */ 0x00e698b1, 0x00e698b3, 0x00e69bbb, 0x00e69988,
+ /* b9 */ 0x00e6998c, 0xf0a38784, 0x00e69999, 0x00e6999a,
+ /* bd */ 0x00e699a1, 0x00e699a5, 0x00e699b3, 0x00e699b7,
+ /* c1 */ 0x00e699b8, 0x00e69a8d, 0x00efa983, 0x00e69aa0,
+ /* c5 */ 0x00e69ab2, 0x00e69abb, 0x00e69b86, 0x00e69b88,
+ /* c9 */ 0x00e3aca2, 0x00e69b9b, 0x00e69ba8, 0x00e69bba,
+ /* cd */ 0x00e69c93, 0x00efa4a9, 0x00e69cb3, 0x00e69da6,
+ /* d1 */ 0x00e69d87, 0x00e69d88, 0x00e69dbb, 0x00e69e81,
+ /* d5 */ 0x00e69e93, 0x00e69e98, 0x00e69e9b, 0x00e69ebb,
+ /* d9 */ 0x00e69fb9, 0x00e69f80, 0x00e69f97, 0x00e69fbc,
+ /* dd */ 0x00e6a081, 0x00e6a192, 0x00e6a09d, 0x00e6a0ac,
+ /* e1 */ 0x00e6a0b1, 0x00e6a19b, 0x00e6a1b2, 0x00e6a1b5,
+ /* e5 */ 0x00efa984, 0x00e6a2a3, 0x00e6a2a5, 0x00e6a2b2,
+ /* e9 */ 0x00e6a388, 0x00e6a390, 0x00e6a3a8, 0x00e6a3ad,
+ /* ed */ 0x00e6a3b0, 0x00e6a3b1, 0x00e6a3bc, 0x00e6a48a,
+ /* f1 */ 0x00e6a589, 0xf0a39784, 0x00e6a4b5, 0x00e6a582,
+ /* f5 */ 0x00e6a597, 0x00e6a5a3, 0x00e6a5a4, 0x00e6a5a8,
+ /* f9 */ 0x00e6a680, 0x00efa894, 0x00e6a6a5, 0x00e6a6ad,
+ /* fd */ 0x00e6a78f, 0x00e3aeb6,
+
+ /*** Two byte table, leaf: f6xx - offset 0x02096 ***/
+
+ /* a1 */ 0x00e3af83, 0x00e6a7a2, 0x00e6a7a9, 0x00e6a7aa,
+ /* a5 */ 0x00e6a7b5, 0x00e6a7b6, 0x00e6a88f, 0x00e6a895,
+ /* a9 */ 0xf0a39cbf, 0x00e6a8bb, 0x00e6a8be, 0x00e6a985,
+ /* ad */ 0x00e6a990, 0x00e6a996, 0x00e6a99b, 0x00e6a9ab,
+ /* b1 */ 0x00e6a9b3, 0xf0a39da3, 0x00e6aa89, 0x00e6aa94,
+ /* b5 */ 0x00e6aa9d, 0x00e6aa9e, 0x00e6aaa5, 0x00e6aba4,
+ /* b9 */ 0x00e6aba7, 0x00e3b08f, 0x00efa49d, 0x00e6ac9b,
+ /* bd */ 0x00e6ac9e, 0x00e6acac, 0x00e6acb5, 0x00e6ad86,
+ /* c1 */ 0x00e6ad96, 0x00e6ada0, 0x00e6ada5, 0x00e6ada7,
+ /* c5 */ 0x00e6adb7, 0x00e6ae82, 0x00e6aea9, 0x00e6aead,
+ /* c9 */ 0x00efa5b0, 0x00e6af8f, 0x00e6af96, 0x00e6af97,
+ /* cd */ 0x00e6afbf, 0x00e6b085, 0x00e6b090, 0x00e6b0b3,
+ /* d1 */ 0x00e6b199, 0x00e6b19c, 0x00e6b2aa, 0x00e6b1b4,
+ /* d5 */ 0x00e6b1b6, 0x00e6b285, 0x00e6b286, 0x00e6b298,
+ /* d9 */ 0x00e6b29c, 0x00e6b3bb, 0x00e6b386, 0x00e6b394,
+ /* dd */ 0x00e6b3a0, 0x00e6b3ab, 0x00e6b3ae, 0xf0a3b3be,
+ /* e1 */ 0x00e6b484, 0x00e6b48e, 0x00e6b4ae, 0x00e6b4b1,
+ /* e5 */ 0x00e6b4b9, 0x00e6b4bf, 0x00e6b598, 0x00e6b5a5,
+ /* e9 */ 0x00efa985, 0x00e6b682, 0x00e6b687, 0x00e6b689,
+ /* ed */ 0x00e6b694, 0x00e6b6aa, 0x00e6b6ac, 0x00e6b6bf,
+ /* f1 */ 0x00e6b784, 0x00e6b796, 0x00e6b79a, 0x00e6b79b,
+ /* f5 */ 0x00e6b79d, 0x00e6b7bc, 0x00efa986, 0x00e6b8b4,
+ /* f9 */ 0x00e6b984, 0x00e6b99c, 0x00e6b99e, 0x00e6baab,
+ /* fd */ 0x00e6bab1, 0x00e6bb81,
+
+ /*** Two byte table, leaf: f7xx - offset 0x020f4 ***/
+
+ /* a1 */ 0x00e6bb87, 0x00e6bb8e, 0x00e6bc90, 0x00e6bc9a,
+ /* a5 */ 0x00efa987, 0x00e6bcaa, 0x00e6bcaf, 0x00e6bcb3,
+ /* a9 */ 0x00e6bd91, 0x00e6bd99, 0x00e6bd9e, 0x00e6bda1,
+ /* ad */ 0x00e6bda2, 0x00e6bdbe, 0x00e6be88, 0x00e6be8c,
+ /* b1 */ 0x00e6be8d, 0x00e6be94, 0x00e6bea0, 0x00e6bea7,
+ /* b5 */ 0x00e6beb6, 0x00e6bebc, 0x00e6bf87, 0x00e6bf8a,
+ /* b9 */ 0x00e6bfb9, 0x00e6bfb0, 0x00e6bfb5, 0x00e78085,
+ /* bd */ 0x00e78086, 0x00e780a8, 0x00e7818a, 0x00e7819d,
+ /* c1 */ 0x00e7819e, 0x00e7818e, 0x00e781a4, 0x00e781b5,
+ /* c5 */ 0x00e78285, 0x00e782a4, 0x00e782ab, 0x00e782b7,
+ /* c9 */ 0x00e78394, 0x00e78398, 0x00e783a4, 0x00e7848f,
+ /* cd */ 0x00e784ab, 0x00e7849e, 0x00e784a0, 0x00e784ae,
+ /* d1 */ 0x00e784b0, 0x00e78586, 0x00e78587, 0x00e78591,
+ /* d5 */ 0x00efa988, 0x00e78592, 0x00e7859c, 0x00e785a0,
+ /* d9 */ 0x00e785a8, 0x00efa895, 0x00e78685, 0x00e78687,
+ /* dd */ 0x00e78692, 0x00e78781, 0x00e786ba, 0x00e78784,
+ /* e1 */ 0x00e787be, 0x00e78880, 0x00e78895, 0x00e78995,
+ /* e5 */ 0x00e78996, 0x00e3b8bf, 0x00e78a8d, 0x00e78a9b,
+ /* e9 */ 0x00e78abe, 0x00e78b80, 0x00e78bbb, 0xf0a49fb1,
+ /* ed */ 0x00e78ca7, 0x00e78ca8, 0x00efa896, 0x00e78d90,
+ /* f1 */ 0x00e78da6, 0x00e78dbc, 0x00e78e95, 0x00e78e9f,
+ /* f5 */ 0x00e78ea0, 0x00e78ea2, 0x00e78ea6, 0x00e78eab,
+ /* f9 */ 0x00e78f89, 0x00e78f8f, 0x00e78f96, 0x00e78f99,
+ /* fd */ 0x00e78fa3, 0x00e78fa9,
+
+ /*** Two byte table, leaf: f8xx - offset 0x02152 ***/
+
+ /* a1 */ 0x00e79087, 0x00e7908a, 0x00e7909a, 0x00e7909b,
+ /* a5 */ 0x00efa98a, 0x00e790a6, 0x00e790a8, 0x00e790aa,
+ /* a9 */ 0x00e790ab, 0x00e790ac, 0x00e790ae, 0x00e790af,
+ /* ad */ 0x00e790b0, 0x00e79184, 0x00e79186, 0x00e79187,
+ /* b1 */ 0x00e7918b, 0x00e79197, 0x00e791a2, 0x00e791ab,
+ /* b5 */ 0x00e791ad, 0x00e79286, 0x00e79287, 0x00e79289,
+ /* b9 */ 0x00e79298, 0x00e7929c, 0x00e7929f, 0x00e792a3,
+ /* bd */ 0x00e79290, 0x00e792a6, 0x00e792a8, 0x00e792a9,
+ /* c1 */ 0x00e792b5, 0x00e792bf, 0x00e79388, 0x00e79389,
+ /* c5 */ 0x00e7939a, 0x00e793bf, 0x00e79481, 0x00e79497,
+ /* c9 */ 0x00e794af, 0x00e795af, 0x00e795b9, 0x00e79692,
+ /* cd */ 0x00e3bdb2, 0x00e7978e, 0x00e797a4, 0x00e79880,
+ /* d1 */ 0x00e79882, 0x00e79888, 0x00e79895, 0x00e79896,
+ /* d5 */ 0x00e79899, 0x00e7989e, 0x00e798ad, 0x00e798b5,
+ /* d9 */ 0x00e79983, 0x00e7998b, 0x00e799a4, 0x00e799a5,
+ /* dd */ 0x00e799ad, 0x00e799af, 0x00e799b1, 0x00e79a81,
+ /* e1 */ 0x00e79a9b, 0x00e79a9d, 0x00e79a9e, 0x00e79aa6,
+ /* e5 */ 0x00e79aaa, 0x00e79ab6, 0x00e79b85, 0x00e79b8c,
+ /* e9 */ 0x00e79b8e, 0x00e79b94, 0x00e79ba6, 0x00e79bb1,
+ /* ed */ 0x00e79bbc, 0x00e79c8a, 0x00e79c99, 0x00e79cb4,
+ /* f1 */ 0x00e79cb6, 0x00e79d86, 0x00e79d8d, 0x00e79d8e,
+ /* f5 */ 0x00e79d9c, 0x00e79d9f, 0x00e79da2, 0x00e79dba,
+ /* f9 */ 0x00e79e80, 0x00e79e94, 0x00e79eaa, 0x00e79fa0,
+ /* fd */ 0x00e7a0ad, 0xf0a5928e,
+
+ /*** Two byte table, leaf: f9xx - offset 0x021b0 ***/
+
+ /* a1 */ 0x00e7a183, 0x00e7a18e, 0x00e7a18f, 0x00e7a191,
+ /* a5 */ 0x00e7a1a8, 0x00e7a1ae, 0x00efa98b, 0x00e7a2b0,
+ /* a9 */ 0xf0a5948e, 0x00e7a2ad, 0x00e7a3a4, 0x00e7a3b2,
+ /* ad */ 0x00e7a480, 0x00e7a3b7, 0x00e7a49c, 0x00e7a4ae,
+ /* b1 */ 0x00e7a4b1, 0x00e7a4b4, 0x00efa98c, 0x00efa98d,
+ /* b5 */ 0x00e7a585, 0x00e7a586, 0x00efa98e, 0x00efa98f,
+ /* b9 */ 0x00efa990, 0x00e7a59c, 0x00efa991, 0x00efa899,
+ /* bd */ 0x00efa89a, 0x00e7a5b9, 0x00efa992, 0x00efa993,
+ /* c1 */ 0x00efa89b, 0x00e7a698, 0x00e7a6b1, 0x00e7a6b8,
+ /* c5 */ 0x00e7a788, 0x00e7a78a, 0xf0a59db1, 0x00e7a794,
+ /* c9 */ 0x00e7a79e, 0x00e7a7ab, 0x00e7a7ad, 0x00e7a883,
+ /* cd */ 0x00efa994, 0x00e7a8b9, 0x00e7a99d, 0x00e7a9ad,
+ /* d1 */ 0x00efa995, 0x00e7aa85, 0x00e7aaa0, 0xf0a5a784,
+ /* d5 */ 0x00e7aab3, 0x00e7aabb, 0x00e7ab8e, 0x00e7abab,
+ /* d9 */ 0x00e7abbd, 0x00e7ac92, 0x00e7acad, 0x00e7acbb,
+ /* dd */ 0x00e7ad87, 0x00e7ad8e, 0x00e7ada0, 0x00e7adad,
+ /* e1 */ 0x00e7adaf, 0x00e7adb2, 0x00e7ae9e, 0x00efa996,
+ /* e5 */ 0x00e7af97, 0x00e7af99, 0x00e7b081, 0x00e7b0b1,
+ /* e9 */ 0x00e7b09e, 0x00e7b0a0, 0x00e7b0b3, 0x00e7b0b6,
+ /* ed */ 0x00e489a4, 0xf0a5b6a1, 0x00e7b199, 0x00e7b1ad,
+ /* f1 */ 0x00e7b1b9, 0x00e7b28f, 0x00e7b294, 0x00e7b2a0,
+ /* f5 */ 0x00e7b2bc, 0x00e7b395, 0x00e7b399, 0x00e7b39d,
+ /* f9 */ 0x00e7b487, 0x00e7b488, 0x00e7b493, 0x00e7b49d,
+ /* fd */ 0x00e7b4a3, 0x00e7b4b1,
+
+ /*** Two byte table, leaf: faxx - offset 0x0220e ***/
+
+ /* a1 */ 0x00e7b581, 0x00e7b588, 0x00e7b593, 0x00e7b59c,
+ /* a5 */ 0x00e7b5ba, 0x00e7b683, 0x00e7b68b, 0x00e7b6a0,
+ /* a9 */ 0x00e7b6a6, 0x00e7b782, 0x00e7b78c, 0x00e7b796,
+ /* ad */ 0x00e7b7a3, 0x00efa997, 0x00e7b8a8, 0x00e7b888,
+ /* b1 */ 0x00e7b891, 0x00e7b895, 0x00efa999, 0x00e7b987,
+ /* b5 */ 0x00e7b992, 0x00e7b9a1, 0x00e7ba8a, 0x00e7ba8d,
+ /* b9 */ 0x00e7bd87, 0x00efa99a, 0x00e7be91, 0x00e7be97,
+ /* bd */ 0x00e7bebf, 0x00e7bf8e, 0x00e7bf9b, 0x00e7bf9f,
+ /* c1 */ 0x00e7bfac, 0x00e7bfae, 0x00e7bfba, 0x00efa99b,
+ /* c5 */ 0x00e88094, 0x00e880a6, 0x00e880b5, 0x00e880b7,
+ /* c9 */ 0x00e880bc, 0x00e8838a, 0x00e88397, 0x00e883a0,
+ /* cd */ 0x00e883b3, 0x00e88498, 0x00e8858a, 0x00e885a0,
+ /* d1 */ 0x00e885a7, 0x00e885a8, 0x00e885ad, 0x00e886bb,
+ /* d5 */ 0x00e8878a, 0x00e8878f, 0x00e88797, 0x00efa99c,
+ /* d9 */ 0x00e49193, 0x00e4919b, 0x00e889a0, 0x00e889b4,
+ /* dd */ 0xf0a6abbf, 0x00e88a8e, 0x00e88aa1, 0x00e88aa3,
+ /* e1 */ 0x00e88aa4, 0x00e88aa9, 0x00e88aae, 0x00e88ab7,
+ /* e5 */ 0x00e88abe, 0x00e88abf, 0x00e88b86, 0x00e88b95,
+ /* e9 */ 0x00e88bbd, 0x00e88bbe, 0x00e88c80, 0x00e88c81,
+ /* ed */ 0x00e88da2, 0x00e88ca2, 0x00e88cad, 0x00e88cba,
+ /* f1 */ 0x00e88d83, 0x00e88d87, 0x00e88d91, 0x00e88d95,
+ /* f5 */ 0x00e88dbd, 0x00e88e86, 0x00e88e92, 0x00e88e98,
+ /* f9 */ 0x00e88ea7, 0x00e88ea9, 0x00e88ebf, 0x00e88f80,
+ /* fd */ 0x00e88f87, 0x00e88f8f,
+
+ /*** Two byte table, leaf: fbxx - offset 0x0226c ***/
+
+ /* a1 */ 0x00e88f91, 0x00e88fa1, 0x00e88faa, 0x00e89081,
+ /* a5 */ 0x00e89086, 0x00e8908a, 0x00efa99f, 0x00e89188,
+ /* a9 */ 0x00e8919f, 0x00e891b0, 0x00e891b3, 0x00e89285,
+ /* ad */ 0x00e8929e, 0x00e892af, 0x00e892b4, 0x00e892ba,
+ /* b1 */ 0x00e89380, 0x00e89382, 0xf0a6b980, 0x00e894b2,
+ /* b5 */ 0x00e8949e, 0x00e894a3, 0x00e894af, 0x00e89599,
+ /* b9 */ 0x00e895a4, 0x00efa89f, 0x00e896ad, 0x00e895ba,
+ /* bd */ 0x00e8968c, 0x00e8968f, 0x00e896a2, 0x00e896b0,
+ /* c1 */ 0x00e8978b, 0x00e8978e, 0x00e897ad, 0x00e89892,
+ /* c5 */ 0x00e897bf, 0x00e89884, 0x00e89885, 0x00e89890,
+ /* c9 */ 0xf0a783b4, 0x00e89898, 0x00e898a9, 0x00e898b8,
+ /* cd */ 0x00e89997, 0x00e8999b, 0x00efa4b6, 0x00e899a2,
+ /* d1 */ 0x00e4969d, 0x00e899ac, 0x00e899b5, 0x00e89a98,
+ /* d5 */ 0x00e89ab8, 0x00e89bba, 0x00e89bbc, 0x00e89bbd,
+ /* d9 */ 0x00e89c8b, 0x00e89db1, 0x00e89e87, 0x00e89e88,
+ /* dd */ 0x00e89eac, 0x00e89ead, 0x00e89eb5, 0x00e497aa,
+ /* e1 */ 0x00e89f96, 0x00e89fac, 0x00e8a086, 0x00e8a08a,
+ /* e5 */ 0x00e8a090, 0x00e8a094, 0x00e8a09f, 0x00e8a298,
+ /* e9 */ 0x00e8a2aa, 0x00e8a38a, 0x00e8a38e, 0xf0a79a84,
+ /* ed */ 0x00e8a3b5, 0x00e8a49c, 0x00efa9a0, 0x00e8a498,
+ /* f1 */ 0x00e8a499, 0x00e8a49a, 0x00e8a4a7, 0x00e8a4b0,
+ /* f5 */ 0x00e8a4b2, 0x00e8a4b9, 0x00e8a580, 0x00e8a694,
+ /* f9 */ 0x00efa9a1, 0x00e8a794, 0x00e8a7a5, 0x00e8a7b6,
+ /* fd */ 0x00e8a892, 0x00e8a895,
+
+ /*** Two byte table, leaf: fcxx - offset 0x022ca ***/
+
+ /* a1 */ 0x00e8a8a2, 0x00e8a8b7, 0x00e8a987, 0x00e8a98e,
+ /* a5 */ 0x00e8a99d, 0x00e8a9a1, 0x00e8a9b5, 0x00e8a9b9,
+ /* a9 */ 0x00e8aaa7, 0x00e8ab90, 0x00e8ab9f, 0x00e8abb4,
+ /* ad */ 0x00e8abb6, 0x00efa8a2, 0x00efa9a2, 0x00efa9a3,
+ /* b1 */ 0x00e8ad86, 0x00e8ad94, 0x00e8ad99, 0x00e8ada9,
+ /* b5 */ 0x00e8ae9d, 0x00e8b189, 0x00e8b1a8, 0x00efa9a4,
+ /* b9 */ 0x00e8b3a1, 0x00e8b3b4, 0x00e8b3b8, 0x00e8b3be,
+ /* bd */ 0x00efa9a5, 0x00e8b492, 0x00e8b49b, 0x00e8b6af,
+ /* c1 */ 0x00e8b78e, 0x00e8b791, 0x00e8b797, 0x00e8b8a0,
+ /* c5 */ 0x00e8b8a3, 0x00e8b8bd, 0x00e8b9b0, 0x00e8b9bb,
+ /* c9 */ 0xf0a889b7, 0x00e8bb80, 0x00e4a184, 0x00e8bbba,
+ /* cd */ 0x00e8bc9e, 0x00e8bcad, 0x00e8bcb6, 0x00e8bd94,
+ /* d1 */ 0xf0a88f8d, 0x00e8bea6, 0x00e8beb5, 0x00e8bfa4,
+ /* d5 */ 0x00e8bfa8, 0x00e8bfae, 0x00e98088, 0x00e980ad,
+ /* d9 */ 0x00efa9a7, 0x00e98288, 0x00e98295, 0x00e98297,
+ /* dd */ 0x00e98299, 0x00e9829b, 0x00e982a2, 0x00e982b3,
+ /* e1 */ 0x00e982be, 0x00e98384, 0x00e98385, 0x00e98387,
+ /* e5 */ 0x00e98397, 0x00e9839d, 0x00e9839e, 0x00e983af,
+ /* e9 */ 0x00e983b4, 0x00efa8a6, 0x00e98494, 0x00e98495,
+ /* ed */ 0x00e98496, 0x00e984a2, 0x00e984a3, 0x00e984a7,
+ /* f1 */ 0x00e984af, 0x00e984b1, 0x00e984b4, 0x00e984bd,
+ /* f5 */ 0x00e98588, 0x00e9859b, 0x00e98683, 0x00e9869e,
+ /* f9 */ 0x00e986ac, 0x00e986b1, 0x00e986bc, 0x00e98797,
+ /* fd */ 0x00e987bb, 0x00e987a4,
+
+ /*** Two byte table, leaf: fdxx - offset 0x02328 ***/
+
+ /* a1 */ 0x00e987a5, 0x00e987ad, 0x00e987b1, 0x00e98887,
+ /* a5 */ 0x00e98890, 0x00e988b8, 0x00e988b9, 0x00e988ba,
+ /* a9 */ 0x00e988bc, 0x00e98980, 0x00e98983, 0x00e9898f,
+ /* ad */ 0x00e989b8, 0x00e98a88, 0x00e98b82, 0x00e98b8b,
+ /* b1 */ 0x00e98b8c, 0x00e98b93, 0x00e98ba0, 0x00e98bbf,
+ /* b5 */ 0x00e98c84, 0x00e98c9f, 0x00e98ca1, 0x00e98ca5,
+ /* b9 */ 0x00e98d88, 0x00e98d89, 0x00e98d8a, 0x00e98da4,
+ /* bd */ 0x00e98da5, 0x00e98daa, 0x00e98db0, 0x00e98e9b,
+ /* c1 */ 0x00e98ea3, 0x00e98eba, 0x00e98f86, 0x00e98f9e,
+ /* c5 */ 0x00e98f9f, 0x00e99084, 0x00e98fbd, 0x00e990b3,
+ /* c9 */ 0x00e9918a, 0x00e991a3, 0x00e991ab, 0x00e991b1,
+ /* cd */ 0x00e991b2, 0x00e9968e, 0x00e9969f, 0x00e996a6,
+ /* d1 */ 0x00e996a9, 0x00e996ac, 0x00e996b6, 0x00e996bd,
+ /* d5 */ 0x00e9978b, 0x00e99790, 0x00e99793, 0x00e4a6b0,
+ /* d9 */ 0x00e9979a, 0x00e9979e, 0x00e99998, 0x00e99a84,
+ /* dd */ 0x00efa79c, 0x00e99a9d, 0x00e99aa4, 0x00e99aa5,
+ /* e1 */ 0x00e99b92, 0x00e99b9e, 0x00efa9a8, 0x00e99ba9,
+ /* e5 */ 0x00e99baf, 0x00e99cb3, 0x00e99cbb, 0x00e99d8d,
+ /* e9 */ 0x00e99d8e, 0x00e99d8f, 0x00e99d9a, 0x00e99dae,
+ /* ed */ 0x00e99db3, 0x00e99e95, 0x00e99eae, 0x00e99eba,
+ /* f1 */ 0x00e99f81, 0x00e99f89, 0x00e99f9e, 0x00e99f9b,
+ /* f5 */ 0x00e99fb4, 0x00efa9a9, 0x00e9a08a, 0x00e9a09e,
+ /* f9 */ 0x00e9a0ab, 0x00e9a0b0, 0x00efa9aa, 0x00e9a192,
+ /* fd */ 0x00e9a193, 0x00e9a196,
+
+ /*** Two byte table, leaf: fexx - offset 0x02386 ***/
+
+ /* a1 */ 0x00e9a197, 0x00e9a199, 0x00e9a19a, 0x00efa790,
+ /* a5 */ 0x00e9a1a5, 0x00e9a1ac, 0x00e9a2ba, 0x00e9a388,
+ /* a9 */ 0x00e9a3a7, 0x00e9a598, 0x00e9a69e, 0x00e9a882,
+ /* ad */ 0x00e9a883, 0x00e9a8a4, 0x00e9a8ad, 0x00e9a8ae,
+ /* b1 */ 0x00e9a8b8, 0x00e9a98a, 0x00e9a98e, 0x00e9a992,
+ /* b5 */ 0x00e9aab6, 0x00e9ab81, 0x00e9ab83, 0x00e9ab8e,
+ /* b9 */ 0x00e9ab96, 0x00e9abb9, 0x00e9ac82, 0x00e9ac88,
+ /* bd */ 0x00e9aca0, 0x00e4b097, 0x00e9acad, 0x00e9ad9e,
+ /* c1 */ 0x00e9adb9, 0x00e9ada6, 0x00e9adb2, 0x00e9adb5,
+ /* c5 */ 0x00e9ae84, 0x00e9ae8a, 0x00e9ae8f, 0x00e9ae9e,
+ /* c9 */ 0x00e9aea7, 0x00e9af81, 0x00e9af8e, 0x00e9afa5,
+ /* cd */ 0x00e9afb8, 0x00e9afbd, 0x00e9b080, 0x00e9b0a3,
+ /* d1 */ 0x00e9b181, 0x00e9b18f, 0x00e9b190, 0x00e9b193,
+ /* d5 */ 0x00e9b1a3, 0x00e9b1a5, 0x00e9b1b7, 0x00e9b49d,
+ /* d9 */ 0x00e9b49e, 0x00e9b583, 0x00e9b587, 0x00e9b592,
+ /* dd */ 0x00e9b5a3, 0x00e9b5b0, 0x00e9b5bc, 0x00e9b68a,
+ /* e1 */ 0x00e9b696, 0x00e9b780, 0x00e9b6ac, 0x00e9b6bc,
+ /* e5 */ 0x00e9b797, 0xf0aa8690, 0x00e9b7a7, 0x00e9b887,
+ /* e9 */ 0x00e9b895, 0x00e9b9bc, 0x00e9ba9e, 0x00e9baa4,
+ /* ed */ 0x00e9baac, 0x00e9baaf, 0x00e9bab4, 0x00e9bab5,
+ /* f1 */ 0x00e9bb83, 0x00e9bb91, 0x00e9bc90, 0x00e9bcb9,
+ /* f5 */ 0x00e9bd97, 0x00e9be90, 0x00e9be94, 0x00e9be97,
+ /* f9 */ 0x00e9bea2, 0x00e5a7b8, 0x00e5b19b, 0x00e5b9b7,
+ /* fd */ 0x00e798a6, 0x00e7b9ab,
+
+ /*** Three byte table, byte #1: xx - offset 0x023e4 ***/
+
+ /* 8f */ 0x000023e5,
+
+ /*** Three byte table, byte #2: 8fxx - offset 0x023e5 ***/
+
+ /* a1 */ 0x00002443, 0x00000000, 0x000024a1, 0x000024ff,
+ /* a5 */ 0x0000255d, 0x00000000, 0x00000000, 0x000025bb,
+ /* a9 */ 0x00000000, 0x00000000, 0x00000000, 0x00002619,
+ /* ad */ 0x00002677, 0x000026d5, 0x00002733, 0x00000000,
+ /* b1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bd */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* cd */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* dd */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ed */ 0x00000000, 0x00002791, 0x000027ef, 0x0000284d,
+ /* f1 */ 0x000028ab, 0x00002909, 0x00002967, 0x000029c5,
+ /* f5 */ 0x00002a23, 0x00002a81, 0x00002adf, 0x00002b3d,
+ /* f9 */ 0x00002b9b, 0x00002bf9, 0x00002c57, 0x00002cb5,
+ /* fd */ 0x00002d13, 0x00002d71,
+
+ /*** Three byte table, leaf: 8fa1xx - offset 0x02443 ***/
+
+ /* a1 */ 0xf0a08289, 0x00e4b882, 0x00e4b88f, 0x00e4b892,
+ /* a5 */ 0x00e4b8a9, 0x00e4b8ab, 0x00e4b8ae, 0x00e4b980,
+ /* a9 */ 0x00e4b987, 0x00e4b988, 0xf0a082a2, 0x00e4b991,
+ /* ad */ 0x00e39086, 0xf0a082a4, 0x00e4b99a, 0x00e4b9a9,
+ /* b1 */ 0x00e4ba9d, 0x00e390ac, 0x00e390ae, 0x00e4bab9,
+ /* b5 */ 0x00e4babb, 0xf0a086a2, 0x00e4babc, 0x00e4bb83,
+ /* b9 */ 0x00e4bb88, 0x00e4bb90, 0x00e4bbab, 0x00e4bb9a,
+ /* bd */ 0x00e4bbb1, 0x00e4bbb5, 0x00e4bc80, 0x00e4bc96,
+ /* c1 */ 0x00e4bda4, 0x00e4bcb7, 0x00e4bcbe, 0x00e4bd94,
+ /* c5 */ 0x00e4bd98, 0xf0a08893, 0x00e4bdb7, 0x00e4bdb8,
+ /* c9 */ 0x00e4bdba, 0x00e4bdbd, 0x00e4be82, 0x00e4be85,
+ /* cd */ 0x00e4be92, 0x00e4be9a, 0x00e4bfa6, 0x00e4beb2,
+ /* d1 */ 0x00e4bebe, 0x00e4bf85, 0x00e4bf8b, 0x00e4bf8f,
+ /* d5 */ 0x00e4bf92, 0x00e391aa, 0x00e4bfb2, 0x00e58080,
+ /* d9 */ 0x00e58090, 0x00e58093, 0x00e5809c, 0x00e5809e,
+ /* dd */ 0x00e580a2, 0x00e391a8, 0x00e58182, 0x00e58186,
+ /* e1 */ 0x00e5818e, 0x00e58193, 0x00e58197, 0x00e581a3,
+ /* e5 */ 0x00e581a6, 0x00e581aa, 0x00e581b0, 0x00e582a3,
+ /* e9 */ 0x00e58288, 0x00e58292, 0x00e58293, 0x00e58295,
+ /* ed */ 0x00e58296, 0x00e5829c, 0x00e582aa, 0xf0a08cab,
+ /* f1 */ 0x00e582b1, 0x00e582ba, 0x00e582bb, 0x00e58384,
+ /* f5 */ 0x00e58387, 0x00e583b3, 0xf0a08e81, 0x00e5838e,
+ /* f9 */ 0xf0a08db1, 0x00e58394, 0x00e58399, 0x00e583a1,
+ /* fd */ 0x00e583a9, 0x00e39292,
+
+ /*** Three byte table, leaf: 8fa3xx - offset 0x024a1 ***/
+
+ /* a1 */ 0x00e58488, 0xf0a08fb9, 0x00e58497, 0x00e5849b,
+ /* a5 */ 0xf0a0918a, 0x00e585a0, 0xf0a09489, 0x00e585b3,
+ /* a9 */ 0x00e58683, 0x00e5868b, 0x00e392bc, 0x00e58698,
+ /* ad */ 0x00e586a3, 0x00e586ad, 0x00e39387, 0x00e586bc,
+ /* b1 */ 0xf0a09796, 0xf0a098a8, 0x00e587b3, 0x00e587b4,
+ /* b5 */ 0x00e58882, 0x00e58892, 0x00e58896, 0xf0a09d8f,
+ /* b9 */ 0x00e58995, 0x00e5899c, 0x00e589ac, 0x00e589b7,
+ /* bd */ 0x00e58a84, 0x00e58a82, 0xf0a0a087, 0x00e58a98,
+ /* c1 */ 0xf0a0a0ba, 0x00e58aa4, 0x00e58aa6, 0x00e58aaf,
+ /* c5 */ 0x00e58aba, 0x00e58abb, 0x00e58b8a, 0x00e3949f,
+ /* c9 */ 0x00e58b91, 0xf0a0a2b9, 0x00e58bb7, 0x00e58c8a,
+ /* cd */ 0x00e58c8b, 0x00e58ca4, 0x00e58cb5, 0x00e58cbe,
+ /* d1 */ 0x00e58d82, 0xf0a0a5bc, 0xf0a0a69d, 0x00e58da7,
+ /* d5 */ 0x00e58dac, 0x00e58dba, 0x00e58ea4, 0x00e58eb4,
+ /* d9 */ 0xf0a0ab93, 0x00e58eb7, 0x00e58f80, 0xf0a0ac9d,
+ /* dd */ 0x00e3959d, 0x00e3959e, 0x00e58f95, 0x00e58f9a,
+ /* e1 */ 0x00e395a3, 0x00e58fb4, 0x00e58fb5, 0x00e59195,
+ /* e5 */ 0x00e590a4, 0x00e590a8, 0x00e395ae, 0x00e59183,
+ /* e9 */ 0x00e591a2, 0x00e591a6, 0x00e591ac, 0x00e5928a,
+ /* ed */ 0x00e5928d, 0x00e59295, 0x00e592a0, 0x00e592a6,
+ /* f1 */ 0x00e592ad, 0x00e592ae, 0x00e592b7, 0x00e592ba,
+ /* f5 */ 0x00e592bf, 0x00e59383, 0xf0a0b585, 0x00e593ac,
+ /* f9 */ 0x00e593af, 0x00e593b1, 0x00e593b3, 0x00e59480,
+ /* fd */ 0x00e59481, 0x00e59489,
+
+ /*** Three byte table, leaf: 8fa4xx - offset 0x024ff ***/
+
+ /* a1 */ 0x00e594bc, 0x00e59581, 0x00e396a6, 0x00e59587,
+ /* a5 */ 0x00e5958a, 0x00e396a8, 0x00e595a0, 0x00e595a1,
+ /* a9 */ 0x00e595a4, 0xf0a0b7a1, 0x00e595bd, 0x00e59682,
+ /* ad */ 0x00e59688, 0x00e59691, 0x00e39785, 0x00e59792,
+ /* b1 */ 0xf0a0ba95, 0xf0a0b9ad, 0x00e596bf, 0x00e59789,
+ /* b5 */ 0x00e5978c, 0x00e59791, 0x00e5979d, 0x00e3979a,
+ /* b9 */ 0x00e597a2, 0xf0a0b9a4, 0x00e597a9, 0x00e598a8,
+ /* bd */ 0xf0a0bd9f, 0x00e59887, 0x00e59890, 0x00e598b0,
+ /* c1 */ 0x00e598b7, 0x00e397b4, 0x00e598bd, 0x00e598bf,
+ /* c5 */ 0x00e59980, 0x00e59987, 0x00e5999e, 0x00e599a0,
+ /* c9 */ 0x00e599ad, 0x00e39885, 0x00e59a88, 0x00e59a8c,
+ /* cd */ 0x00e59a95, 0x00e59a9a, 0x00e59a9d, 0x00e59aa8,
+ /* d1 */ 0x00e59aad, 0x00e59ab2, 0x00e59b85, 0x00e59b8d,
+ /* d5 */ 0x00e59b9f, 0x00e59ba8, 0x00e59bb6, 0x00e59bb7,
+ /* d9 */ 0xf0a18881, 0x00e59c95, 0x00e59ca3, 0xf0a18995,
+ /* dd */ 0x00e59ca9, 0xf0a189bb, 0x00e59d85, 0x00e59d86,
+ /* e1 */ 0x00e59d8c, 0x00e59d8d, 0xf0a189b4, 0x00e59da8,
+ /* e5 */ 0x00e59daf, 0x00e59db3, 0x00e59db4, 0x00e59db5,
+ /* e9 */ 0x00e59dbb, 0xf0a18ba4, 0xf0a18b97, 0x00e59eac,
+ /* ed */ 0x00e59e9a, 0x00e59e9d, 0x00e59e9e, 0x00e59ea8,
+ /* f1 */ 0x00e59f97, 0xf0a18bbd, 0x00e59f8c, 0xf0a18cb6,
+ /* f5 */ 0xf0a18d84, 0x00e59f9e, 0x00e59fa6, 0x00e59fb0,
+ /* f9 */ 0x00e3998a, 0x00e59fb8, 0x00e59fbb, 0x00e59fbd,
+ /* fd */ 0x00e5a084, 0x00e5a09e,
+
+ /*** Three byte table, leaf: 8fa5xx - offset 0x0255d ***/
+
+ /* a1 */ 0x00e5a0a0, 0x00e5a0a7, 0x00e5a0b2, 0x00e5a0b9,
+ /* a5 */ 0xf0a18f84, 0x00e5a189, 0x00e5a18c, 0x00e5a1a7,
+ /* a9 */ 0x00e5a28a, 0x00e5a28b, 0x00e5a28d, 0x00e5a28f,
+ /* ad */ 0x00e5a290, 0x00e5a294, 0x00e5a29d, 0x00e5a2aa,
+ /* b1 */ 0x00e5a2b1, 0xf0a191ad, 0x00e5a383, 0x00e5a38d,
+ /* b5 */ 0x00e5a3a2, 0x00e5a3b3, 0x00e5a3b4, 0x00e5a485,
+ /* b9 */ 0x00e5a486, 0x00e5a48b, 0x00e5a48d, 0x00e5a494,
+ /* bd */ 0x00e5a4a4, 0xf0a19797, 0x00e39a91, 0x00e5a4bd,
+ /* c1 */ 0x00e39a99, 0x00e5a586, 0x00e39a96, 0xf0a6b0a9,
+ /* c5 */ 0x00e5a59b, 0x00e5a59f, 0xf0a19987, 0x00e5a5b5,
+ /* c9 */ 0x00e5a5b6, 0x00e5a5bc, 0x00e5a69f, 0x00e5a6ae,
+ /* cd */ 0x00e5a6bc, 0x00e5a788, 0x00e5a78d, 0x00e5a79e,
+ /* d1 */ 0x00e5a7a3, 0x00e5a7a4, 0x00e5a7a7, 0x00e5a7ae,
+ /* d5 */ 0xf0a19c86, 0xf0a19d82, 0x00e39b8f, 0x00e5a88c,
+ /* d9 */ 0x00e5a88d, 0x00e5a897, 0x00e5a8a7, 0x00e5a8ad,
+ /* dd */ 0x00e5a995, 0x00e5a9a5, 0x00e5a9ba, 0x00e5aa8b,
+ /* e1 */ 0x00e5aa9c, 0x00e5aa9f, 0x00e5aaa0, 0x00e5aaa2,
+ /* e5 */ 0x00e5aab1, 0x00e5aab3, 0x00e5aab5, 0x00e5aaba,
+ /* e9 */ 0x00e5aabf, 0x00e5ab9a, 0x00e5ab9c, 0x00e5aba0,
+ /* ed */ 0x00e5aba5, 0x00e5abb0, 0x00e5abae, 0x00e5abb5,
+ /* f1 */ 0x00e5ac80, 0x00e5ac88, 0x00e5ac97, 0x00e5acb4,
+ /* f5 */ 0x00e5acad, 0x00e5ad8c, 0x00e5ad92, 0x00e5ada8,
+ /* f9 */ 0x00e5adaf, 0x00e5adbc, 0x00e5adbf, 0x00e5ae81,
+ /* fd */ 0x00e5ae84, 0xf0a1a783,
+
+ /*** Three byte table, leaf: 8fa8xx - offset 0x025bb ***/
+
+ /* a1 */ 0x00e5ae96, 0x00e5aeac, 0x00e39da1, 0x00e5af80,
+ /* a5 */ 0x00e39da2, 0x00e5af8e, 0x00e5af96, 0x00e39dac,
+ /* a9 */ 0x00e39dab, 0x00e5afb1, 0x00e5afbd, 0x00e39db5,
+ /* ad */ 0x00e5b083, 0x00e5b0a9, 0x00e5b0b0, 0xf0a1b196,
+ /* b1 */ 0x00e5b19f, 0x00e5b1a3, 0x00e5b1a7, 0x00e5b1a8,
+ /* b5 */ 0x00e5b1a9, 0x00e5b1b0, 0xf0a1b4ad, 0xf0a1b585,
+ /* b9 */ 0x00e5b1bc, 0xf0a1b5b8, 0xf0a1b5a2, 0x00e5b288,
+ /* bd */ 0x00e5b28a, 0x00e39f81, 0xf0a1b6a1, 0xf0a1b69c,
+ /* c1 */ 0x00e5b2a0, 0x00e5b2a2, 0x00e5b2a6, 0x00e5b2a7,
+ /* c5 */ 0xf0a1b692, 0x00e5b2ad, 0x00e5b2b5, 0xf0a1b6b7,
+ /* c9 */ 0x00e5b389, 0xf0a1b7a0, 0xf0a1b8b3, 0x00e5b486,
+ /* cd */ 0x00e5b490, 0x00e5b4ab, 0x00e5b49d, 0x00e5b4a0,
+ /* d1 */ 0x00e5b4a4, 0x00e5b4a6, 0x00e5b4b1, 0x00e5b4b9,
+ /* d5 */ 0x00e5b582, 0x00e39fa8, 0x00e5b5a1, 0x00e5b5aa,
+ /* d9 */ 0x00e39fb4, 0x00e5b5b0, 0xf0a1bc9e, 0x00e39fbd,
+ /* dd */ 0x00e5b688, 0x00e3a080, 0x00e5b692, 0x00e5b694,
+ /* e1 */ 0x00e5b697, 0x00e5b699, 0x00e5b6b0, 0x00e5b6b2,
+ /* e5 */ 0x00e5b6b4, 0xf0a1bdb6, 0x00e5b6b9, 0x00e5b791,
+ /* e9 */ 0x00e5b797, 0x00e5b798, 0x00e5b7a0, 0xf0a1bfba,
+ /* ed */ 0x00e5b7a4, 0x00e5b7a9, 0x00e3a0af, 0x00e5b880,
+ /* f1 */ 0x00e3a0b6, 0x00e5b892, 0x00e5b895, 0x00e3a180,
+ /* f5 */ 0x00e5b89f, 0x00e5b8ae, 0x00e5b8be, 0x00e5b989,
+ /* f9 */ 0x00e3a19c, 0x00e5b996, 0x00e3a1a1, 0x00e5b9ab,
+ /* fd */ 0x00e5b9ac, 0x00e5b9ad,
+
+ /*** Three byte table, leaf: 8facxx - offset 0x02619 ***/
+
+ /* a1 */ 0x00e5b9ae, 0xf0a285bb, 0x00e5baa5, 0x00e5baaa,
+ /* a5 */ 0x00e5baac, 0x00e5bab9, 0x00e5babf, 0x00e5bb86,
+ /* a9 */ 0x00e5bb92, 0x00e5bb99, 0xf0a28c9e, 0x00e5bbbd,
+ /* ad */ 0x00e5bc88, 0x00e5bc8e, 0x00e5bc9c, 0xf0a28ead,
+ /* b1 */ 0x00e5bc9e, 0x00e5bd87, 0x00e5bda3, 0x00e5bdb2,
+ /* b5 */ 0x00e5bdbe, 0x00e5be8f, 0x00e5bea2, 0x00e5bea4,
+ /* b9 */ 0x00e5beb8, 0x00e5bf84, 0x00e3a3ba, 0x00e5bf87,
+ /* bd */ 0x00e5bf8b, 0x00e5bf92, 0x00e5bf93, 0x00e5bf94,
+ /* c1 */ 0x00e5bfa2, 0x00e5bfae, 0x00e5bfaf, 0x00e5bfb3,
+ /* c5 */ 0x00e5bfbc, 0x00e3a497, 0x00e68097, 0x00e680a2,
+ /* c9 */ 0x00e680a4, 0x00e3a49a, 0x00e6818c, 0x00e681bf,
+ /* cd */ 0x00e6828a, 0x00e68295, 0x00e682a8, 0xf0a29bb3,
+ /* d1 */ 0x00e682b0, 0x00e682b1, 0x00e682be, 0x00e68388,
+ /* d5 */ 0x00e68399, 0x00e6839b, 0x00e683ae, 0x00e683b2,
+ /* d9 */ 0x00e683b5, 0x00e68490, 0x00e68492, 0x00e68493,
+ /* dd */ 0x00e68499, 0x00e6849e, 0x00e684ba, 0x00e3a5af,
+ /* e1 */ 0x00e68581, 0x00e68586, 0x00e685a0, 0x00e685bc,
+ /* e5 */ 0xf0a2a19b, 0x00e68692, 0x00e68693, 0x00e68697,
+ /* e9 */ 0x00e68698, 0x00e686a5, 0x00e686a8, 0x00e686ad,
+ /* ed */ 0xf0a2a2ab, 0x00e68795, 0x00e6879d, 0x00e6879f,
+ /* f1 */ 0x00e687b5, 0xf0a2a68f, 0x00e68895, 0x00e688a3,
+ /* f5 */ 0x00e688a9, 0x00e68986, 0x00e6898c, 0x00e68991,
+ /* f9 */ 0x00e68992, 0x00e689a1, 0x00e689a4, 0x00e689bb,
+ /* fd */ 0x00e689ad, 0x00e689b3,
+
+ /*** Three byte table, leaf: 8fadxx - offset 0x02677 ***/
+
+ /* a1 */ 0x00e68a99, 0x00e68aa6, 0x00e68b95, 0xf0a2aab8,
+ /* a5 */ 0x00e68bbd, 0x00e68c83, 0x00e68c8d, 0x00e68c90,
+ /* a9 */ 0xf0a2ad8f, 0xf0a2ad90, 0x00e68cb2, 0x00e68cb5,
+ /* ad */ 0x00e68cbb, 0x00e68cbc, 0x00e68d81, 0x00e68d84,
+ /* b1 */ 0x00e68d8e, 0xf0a2ad86, 0x00e68d99, 0xf0a2b09d,
+ /* b5 */ 0xf0a2aea6, 0x00e68dac, 0x00e68e84, 0x00e68e99,
+ /* b9 */ 0xf0a2b0a4, 0x00e68e94, 0x00e68ebd, 0x00e68fb7,
+ /* bd */ 0x00e68f94, 0x00e68f95, 0x00e68f9c, 0x00e68fa0,
+ /* c1 */ 0x00e68fab, 0x00e68fac, 0x00e68fb2, 0x00e69089,
+ /* c5 */ 0x00e6909e, 0x00e690a5, 0x00e690a9, 0x00e690af,
+ /* c9 */ 0x00e6919a, 0x00e6919b, 0x00e6919d, 0x00e691b3,
+ /* cd */ 0x00e691bd, 0x00e69287, 0x00e69291, 0x00e6929d,
+ /* d1 */ 0x00e6929f, 0x00e6938b, 0x00e6938c, 0x00e69395,
+ /* d5 */ 0x00e69397, 0xf0a2b7a1, 0x00e693a4, 0x00e693a5,
+ /* d9 */ 0x00e693bf, 0x00e69484, 0x00e3a9ae, 0x00e6948f,
+ /* dd */ 0x00e69494, 0x00e69496, 0x00e3a9b3, 0x00e6949e,
+ /* e1 */ 0x00e694b2, 0x00e69584, 0x00e69594, 0x00e695ab,
+ /* e5 */ 0x00e695ba, 0x00e69681, 0x00e69684, 0x00e69685,
+ /* e9 */ 0x00e6968a, 0x00e696b2, 0x00e696b5, 0x00e696b8,
+ /* ed */ 0x00e696bf, 0x00e69782, 0x00e69789, 0x00e69794,
+ /* f1 */ 0x00e3ab96, 0x00e697b2, 0x00e697b9, 0x00e697bc,
+ /* f5 */ 0x00e69884, 0x00e69888, 0x00e698a1, 0x00e698aa,
+ /* f9 */ 0x00e69985, 0x00e69991, 0x00e6998e, 0x00e3abaa,
+ /* fd */ 0xf0a38783, 0x00e69997,
+
+ /*** Three byte table, leaf: 8faexx - offset 0x026d5 ***/
+
+ /* a1 */ 0x00e6999b, 0x00e699a3, 0xf0a387b5, 0xf0a386b6,
+ /* a5 */ 0x00e699aa, 0x00e699ab, 0x00e699ac, 0x00e699ad,
+ /* a9 */ 0x00e699bb, 0x00e69a80, 0x00e69a90, 0x00e69a92,
+ /* ad */ 0x00e69a99, 0x00e3ac8e, 0x00e69aad, 0x00e69ab1,
+ /* b1 */ 0x00e69ab5, 0x00e3ac9a, 0x00e69abf, 0x00e3ac9c,
+ /* b5 */ 0x00e69bac, 0x00e3ab97, 0x00e69c81, 0x00e69c85,
+ /* b9 */ 0x00e69c92, 0xf0a38db2, 0x00e69c99, 0xf0a38f93,
+ /* bd */ 0xf0a38f92, 0x00e69d8c, 0x00e69d8d, 0x00e69d94,
+ /* c1 */ 0x00e69d9d, 0xf0a38f90, 0xf0a38fa4, 0xf0a38f95,
+ /* c5 */ 0x00e69db4, 0x00e69db6, 0xf0a38f9a, 0x00e69e92,
+ /* c9 */ 0xf0a38f9f, 0x00e88da3, 0x00e6a090, 0x00e69eb0,
+ /* cd */ 0x00e69eb2, 0x00e69f83, 0x00e69f88, 0x00e69f92,
+ /* d1 */ 0x00e69f99, 0x00e69f9b, 0x00e69fb0, 0x00e69fb7,
+ /* d5 */ 0xf0a3918a, 0xf0a39191, 0xf0a3918b, 0x00e6a098,
+ /* d9 */ 0x00e6a09f, 0x00e6a0ad, 0xf0a391a5, 0x00e6a0b3,
+ /* dd */ 0x00e6a0bb, 0x00e6a0be, 0x00e6a184, 0x00e6a185,
+ /* e1 */ 0x00e6a189, 0x00e6a18c, 0x00e6a195, 0x00e6a197,
+ /* e5 */ 0x00e3adb7, 0x00e6a1ab, 0x00e6a1ae, 0x00e6a1ba,
+ /* e9 */ 0x00e6a1bc, 0x00e6a282, 0x00e6a290, 0x00e6a296,
+ /* ed */ 0x00e3adad, 0x00e6a298, 0x00e6a299, 0x00e6a29a,
+ /* f1 */ 0x00e6a29c, 0x00e6a2aa, 0x00e6a2ab, 0x00e6a2b4,
+ /* f5 */ 0x00e6a2bb, 0x00e6a3bb, 0xf0a393a4, 0xf0a3959a,
+ /* f9 */ 0x00efa893, 0x00e6a383, 0x00e6a385, 0x00e6a38c,
+ /* fd */ 0x00e6a38f, 0x00e6a396,
+
+ /*** Three byte table, leaf: 8fafxx - offset 0x02733 ***/
+
+ /* a1 */ 0x00e6a399, 0x00e6a3a4, 0x00e6a3a5, 0x00e6a3ac,
+ /* a5 */ 0x00e6a3b7, 0x00e6a483, 0x00e6a487, 0x00e3ae87,
+ /* a9 */ 0x00e3ae88, 0xf0a39694, 0x00e6a4bb, 0x00e3ae8d,
+ /* ad */ 0x00e6a586, 0x00e6a5a9, 0x00e6a5ac, 0x00e6a5b2,
+ /* b1 */ 0x00e6a5ba, 0x00e6a5bf, 0x00e6a692, 0x00e3aea4,
+ /* b5 */ 0x00e6a696, 0x00e6a698, 0x00e6a6a6, 0x00e6a6b0,
+ /* b9 */ 0x00e6a6b7, 0x00e6a6ba, 0x00e6a6bc, 0x00e6a780,
+ /* bd */ 0x00e6a791, 0x00e6a796, 0xf0a398b9, 0xf0a39987,
+ /* c1 */ 0x00e6a8b0, 0xf0a398b8, 0xf0a398ba, 0x00e6a7a3,
+ /* c5 */ 0x00e6a7ae, 0x00e6a7af, 0x00e6a7b3, 0x00e3af8d,
+ /* c9 */ 0x00e6a7b4, 0x00e6a7be, 0x00e6a891, 0x00e6a89a,
+ /* cd */ 0x00e6a89d, 0xf0a39c9c, 0x00e6a8b2, 0x00e6a8b3,
+ /* d1 */ 0x00e6a8b4, 0x00e6a8bf, 0x00e6a986, 0x00e6a989,
+ /* d5 */ 0x00e6a9ba, 0x00e6a98e, 0x00e6a992, 0x00e6a9a4,
+ /* d9 */ 0xf0a39c8c, 0x00e6a9be, 0x00e6aa83, 0x00e6aa8b,
+ /* dd */ 0x00e3afb0, 0x00e6aa91, 0x00e6aa9f, 0x00e6aaa1,
+ /* e1 */ 0xf0a39da4, 0x00e6aaab, 0x00e6aabd, 0x00e6ab86,
+ /* e5 */ 0x00e6ab94, 0x00e6ab90, 0x00e6ab9c, 0x00e6ab9d,
+ /* e9 */ 0xf0a39fbf, 0xf0a39fa7, 0x00e6abac, 0x00e6abb1,
+ /* ed */ 0x00e6abb2, 0x00e6abb3, 0x00e6abbd, 0xf0a3a0a4,
+ /* f1 */ 0x00e6ac8b, 0x00e6ac8f, 0x00e6ac90, 0x00e6ac91,
+ /* f5 */ 0xf0a3a0bd, 0x00e6ac97, 0x00e3b0a6, 0x00e6acaf,
+ /* f9 */ 0x00e6ad8a, 0x00e6ad98, 0x00e6adac, 0x00e6adb5,
+ /* fd */ 0x00e6adba, 0x00e6ae81,
+
+ /*** Three byte table, leaf: 8feexx - offset 0x02791 ***/
+
+ /* a1 */ 0x00e6ae9b, 0x00e6aeae, 0xf0a3aa98, 0x00e6aebd,
+ /* a5 */ 0x00e6aebe, 0x00e6af87, 0x00e6af88, 0x00e6af89,
+ /* a9 */ 0x00e6af9a, 0x00e6afa6, 0x00e6afa7, 0x00e6afae,
+ /* ad */ 0x00e6afb1, 0x00e6b082, 0x00e6b08a, 0x00e6b08e,
+ /* b1 */ 0x00e6b0b5, 0x00e6b0b6, 0x00e6b0ba, 0xf0a3b1bf,
+ /* b5 */ 0x00e6b0bf, 0x00e6b18d, 0x00e6b19b, 0x00e6b1ad,
+ /* b9 */ 0x00e6b284, 0x00e6b289, 0x00e3b383, 0x00e6b294,
+ /* bd */ 0x00e6b295, 0x00e6b297, 0x00e6b2ad, 0x00e6b382,
+ /* c1 */ 0x00e6b390, 0x00e3b392, 0x00e6b396, 0x00e6b39a,
+ /* c5 */ 0x00e6b39c, 0x00e6b3a9, 0x00e6b3ac, 0x00e6b3ad,
+ /* c9 */ 0xf0a3b480, 0x00e6b480, 0x00e6b48a, 0x00e6b4a4,
+ /* cd */ 0x00e6b4a6, 0x00e6b4a7, 0x00e6b1a7, 0x00e6b4af,
+ /* d1 */ 0x00e6b4bc, 0x00e6b59b, 0x00e6b59e, 0x00e6b5a0,
+ /* d5 */ 0x00e6b5b0, 0x00e6b680, 0x00e6b681, 0x00e6b68a,
+ /* d9 */ 0x00e6b68d, 0x00e6b691, 0x00e6b698, 0xf0a3b580,
+ /* dd */ 0x00e6b897, 0xf0a3b7ba, 0xf0a3b7b9, 0xf0a3b793,
+ /* e1 */ 0x00e6b6ab, 0x00e6b6ae, 0x00e6b6b4, 0x00e6b782,
+ /* e5 */ 0x00e6b4b4, 0x00e6b788, 0x00e6b78e, 0x00e6b78f,
+ /* e9 */ 0x00e6b790, 0x00e6b79f, 0x00e6b7a9, 0x00e6b7b6,
+ /* ed */ 0x00e6b8b6, 0x00e6b89e, 0x00e6b8a2, 0x00e6b8a7,
+ /* f1 */ 0x00e3b491, 0x00e6b8b2, 0x00e6b8bc, 0x00e6b988,
+ /* f5 */ 0x00e6b989, 0x00e6b98b, 0x00e6b98c, 0x00e6b98f,
+ /* f9 */ 0x00e6b991, 0x00e6b993, 0x00e6b994, 0x00e6b997,
+ /* fd */ 0x00e6b9a3, 0x00e3b49e,
+
+ /*** Three byte table, leaf: 8fefxx - offset 0x027ef ***/
+
+ /* a1 */ 0x00e6ba93, 0x00e6baa7, 0x00e6bab4, 0x00e6babf,
+ /* a5 */ 0x00e6bb83, 0x00e6bb8a, 0x00e6bb99, 0x00e6bcb5,
+ /* a9 */ 0x00e6bbab, 0x00e6bbb9, 0x00e6bbbb, 0x00e6bc8a,
+ /* ad */ 0x00e6bc8c, 0x00e6bc98, 0x00e6bca5, 0x00e6bcb6,
+ /* b1 */ 0x00e6bcbc, 0xf0a3bdbe, 0x00e6bd92, 0x00e6bd97,
+ /* b5 */ 0x00e6bd9a, 0x00e6bda0, 0x00e6bda8, 0x00e6be98,
+ /* b9 */ 0x00e6bdbd, 0x00e6be90, 0x00e6be96, 0x00e6bebe,
+ /* bd */ 0x00e6be9f, 0x00e6bea5, 0x00e6beaf, 0x00e3b5a4,
+ /* c1 */ 0x00e6beb5, 0x00e6bf88, 0x00e6bf89, 0x00e6bf9a,
+ /* c5 */ 0x00e6bf9e, 0x00e6bfa9, 0xf0a48296, 0x00e6bfbc,
+ /* c9 */ 0x00e78080, 0x00e78087, 0x00e7808a, 0x00e780a3,
+ /* cd */ 0xf0a48483, 0x00e780b9, 0x00e780ba, 0x00e780bc,
+ /* d1 */ 0x00e78183, 0x00e78187, 0x00e7818b, 0x00e3b69a,
+ /* d5 */ 0x00e78194, 0x00e781a5, 0x00e781a9, 0x00e781ac,
+ /* d9 */ 0x00e781ae, 0x00e781b6, 0x00e781be, 0x00e78281,
+ /* dd */ 0x00e78286, 0x00e78295, 0x00e78297, 0x00e782bb,
+ /* e1 */ 0xf0a48786, 0x00e7829f, 0x00e782b1, 0xf0a487be,
+ /* e5 */ 0x00e783ac, 0x00e7838a, 0x00e78391, 0x00e78393,
+ /* e9 */ 0x00e7839c, 0x00e78483, 0x00e78484, 0x00e78486,
+ /* ed */ 0x00e78487, 0x00e78488, 0x00e7848c, 0x00e3b780,
+ /* f1 */ 0x00e784af, 0x00e784b1, 0x00e78590, 0x00e7858a,
+ /* f5 */ 0x00e78593, 0x00e7859e, 0x00e3b794, 0x00e78696,
+ /* f9 */ 0x00e78680, 0x00e7869b, 0x00e786a0, 0x00e786a2,
+ /* fd */ 0x00e786ae, 0x00e786af,
+
+ /*** Three byte table, leaf: 8ff0xx - offset 0x0284d ***/
+
+ /* a1 */ 0x00e786b3, 0xf0a48ebc, 0x00e7878b, 0x00e78793,
+ /* a5 */ 0x00e78799, 0x00e7879c, 0x00e78887, 0x00e3b885,
+ /* a9 */ 0x00efa989, 0x00e788ab, 0x00e788b4, 0x00e788b8,
+ /* ad */ 0x00e788b9, 0x00e4b8ac, 0x00e78982, 0x00e78993,
+ /* b1 */ 0x00e78997, 0x00e789a3, 0xf0a498a9, 0x00e789ae,
+ /* b5 */ 0x00e789af, 0x00e789b8, 0x00e789bf, 0x00e78a8e,
+ /* b9 */ 0xf0a49aa5, 0x00e78aad, 0x00e78aae, 0x00e78ab0,
+ /* bd */ 0x00e78ab1, 0x00e78b81, 0x00e3b9a0, 0x00e78b8c,
+ /* c1 */ 0x00e3b9a6, 0x00e3b9a8, 0x00e78bb3, 0x00e78bba,
+ /* c5 */ 0x00e78c87, 0x00e78c92, 0x00e78c98, 0x00e78c99,
+ /* c9 */ 0x00e3ba83, 0x00e78cb9, 0x00e78cac, 0x00e78cb1,
+ /* cd */ 0x00e78cb3, 0x00e78cbd, 0x00e78d92, 0x00e3ba94,
+ /* d1 */ 0x00e78dab, 0x00e78dac, 0xf0a4a296, 0x00e78dae,
+ /* d5 */ 0x00e78daf, 0x00e78db1, 0x00e78db7, 0x00e78e81,
+ /* d9 */ 0x00e78e85, 0x00e78e8a, 0x00e78e94, 0x00e78e98,
+ /* dd */ 0x00e78e9c, 0x00e78e9e, 0x00e78ea5, 0x00e78ea8,
+ /* e1 */ 0x00e78eb5, 0x00e78eb7, 0x00e78eb9, 0x00e78ebc,
+ /* e5 */ 0x00e78ebf, 0x00e78f85, 0x00e78f8b, 0x00e78fa1,
+ /* e9 */ 0x00e78fa7, 0x00e78fb9, 0x00e79093, 0x00e78fba,
+ /* ed */ 0x00e79081, 0x00e790a4, 0x00e790b1, 0x00e790b9,
+ /* f1 */ 0x00e79193, 0x00e79180, 0x00e79183, 0x00e7918d,
+ /* f5 */ 0x00e79192, 0x00e7919d, 0x00e791b1, 0x00e79281,
+ /* f9 */ 0x00e79285, 0x00e79288, 0xf0a4a98d, 0x00e79292,
+ /* fd */ 0x00e79297, 0x00e79299,
+
+ /*** Three byte table, leaf: 8ff1xx - offset 0x028ab ***/
+
+ /* a1 */ 0x00e792a0, 0x00e792a1, 0x00e792a5, 0x00e792aa,
+ /* a5 */ 0x00e792ab, 0x00e792b9, 0x00e792bb, 0x00e792ba,
+ /* a9 */ 0x00e79396, 0x00e79398, 0x00e7939e, 0x00e793af,
+ /* ad */ 0x00e793ab, 0xf0a4ad96, 0x00e793ba, 0xf0a4adaf,
+ /* b1 */ 0x00e794a0, 0x00e794a4, 0x00e794aa, 0x00e3bd97,
+ /* b5 */ 0xf0a4b096, 0x00e794bd, 0x00e794be, 0x00e79580,
+ /* b9 */ 0x00e79588, 0x00e7958e, 0x00e79590, 0x00e79592,
+ /* bd */ 0x00e795ac, 0x00e795b2, 0x00e795b1, 0x00e795ba,
+ /* c1 */ 0x00e795bd, 0x00e795be, 0x00e79681, 0xf0a4b494,
+ /* c5 */ 0x00e7968c, 0x00e3bdb5, 0x00e796a2, 0x00e3bdb7,
+ /* c9 */ 0x00e796b0, 0x00e796b7, 0x00e796bf, 0x00e79780,
+ /* cd */ 0x00e79786, 0x00e7978f, 0x00e79793, 0x00e7979d,
+ /* d1 */ 0x00e7979f, 0x00e797a0, 0x00e797a7, 0x00e797ac,
+ /* d5 */ 0x00e797ae, 0x00e797b1, 0x00e797b9, 0x00e79883,
+ /* d9 */ 0x00e79898, 0x00e79887, 0x00e7988f, 0x00e3beae,
+ /* dd */ 0xf0a4b88e, 0x00e79893, 0x00e7989b, 0x00e7989c,
+ /* e1 */ 0xf0a4b8b7, 0x00e798a5, 0x00e798a8, 0x00e798bc,
+ /* e5 */ 0x00e798b3, 0xf0a4b9aa, 0x00e3bf89, 0x00e79981,
+ /* e9 */ 0xf0a4ba8b, 0x00e79989, 0x00e79995, 0x00e3bf97,
+ /* ed */ 0x00e799ae, 0x00e79a95, 0x00e79a9c, 0x00e79aa1,
+ /* f1 */ 0x00e79aa0, 0x00e79aa7, 0x00e79aa8, 0x00e79aaf,
+ /* f5 */ 0xf0a5818a, 0x00e79b89, 0xf0a58195, 0x00e79ba8,
+ /* f9 */ 0x00e79bac, 0xf0a584a2, 0x00e79c97, 0x00e79c9a,
+ /* fd */ 0x00e79cad, 0x00e79cb5,
+
+ /*** Three byte table, leaf: 8ff2xx - offset 0x02909 ***/
+
+ /* a1 */ 0xf0a586a9, 0x00e480b9, 0xf0a587a5, 0xf0a5878d,
+ /* a5 */ 0x00e79d98, 0x00e79da0, 0x00e79daa, 0xf0a5889e,
+ /* a9 */ 0x00e79db2, 0x00e79dbc, 0x00e79dbd, 0xf0a5898c,
+ /* ad */ 0x00e48198, 0x00e79e9a, 0x00e79e9f, 0x00e79ea2,
+ /* b1 */ 0x00e79ea4, 0x00e79ea9, 0x00e79f9e, 0x00e79f9f,
+ /* b5 */ 0x00e79fa4, 0x00e79fa6, 0x00e79faa, 0x00e79fac,
+ /* b9 */ 0x00e48293, 0x00e79fb0, 0x00e79fb4, 0x00e79fbb,
+ /* bd */ 0xf0a590ae, 0x00e7a085, 0x00e7a086, 0x00e7a089,
+ /* c1 */ 0x00e7a08d, 0x00e7a099, 0x00e7a0a1, 0x00e7a0ac,
+ /* c5 */ 0x00e7a187, 0x00e7a1a4, 0x00e7a1aa, 0xf0a59399,
+ /* c9 */ 0x00e7a28a, 0x00e7a294, 0x00e7a2a4, 0x00e7a29d,
+ /* cd */ 0x00e7a29e, 0x00e7a29f, 0x00e7a2bb, 0x00e7a388,
+ /* d1 */ 0x00e7a38c, 0x00e7a38e, 0x00e7a395, 0x00e7a3a0,
+ /* d5 */ 0x00e7a3a1, 0x00e7a3a6, 0x00e7a3b9, 0x00e7a3ba,
+ /* d9 */ 0x00e7a3bb, 0x00e7a3be, 0xf0a596a7, 0x00e7a490,
+ /* dd */ 0x00e7a49b, 0x00e7a4b0, 0x00e7a4a5, 0x00e7a4bb,
+ /* e1 */ 0x00e7a58a, 0x00e7a598, 0x00e7a59b, 0x00e48485,
+ /* e5 */ 0x00e7a5a7, 0x00e7a5b2, 0x00e7a694, 0x00e7a695,
+ /* e9 */ 0x00e7a696, 0x00e7a69b, 0x00e7a6a1, 0x00e7a6a9,
+ /* ed */ 0x00e7a6b4, 0x00e7a6bb, 0x00e7a782, 0x00e7a787,
+ /* f1 */ 0x00e7a78c, 0x00e7a78d, 0x00e7a796, 0x00e48588,
+ /* f5 */ 0xf0a59ea9, 0xf0a59eb4, 0x00e4858f, 0x00e7a88a,
+ /* f9 */ 0x00e7a891, 0x00e7a895, 0x00e7a89b, 0x00e7a89e,
+ /* fd */ 0x00e485a3, 0x00e7a8ad,
+
+ /*** Three byte table, leaf: 8ff3xx - offset 0x02967 ***/
+
+ /* a1 */ 0x00e7a8b8, 0x00e7a987, 0x00e7a98c, 0x00e7a996,
+ /* a5 */ 0x00e7a999, 0x00e7a99c, 0x00e7a99f, 0x00e7a9a0,
+ /* a9 */ 0x00e7a9a7, 0x00e7a9aa, 0x00e7a9b5, 0x00e7a9b8,
+ /* ad */ 0x00e7aa82, 0x00e7aa8a, 0x00e7aa90, 0x00e7aaa3,
+ /* b1 */ 0x00e7aaac, 0xf0a5a794, 0x00e486b4, 0x00e7aab9,
+ /* b5 */ 0x00e7aabc, 0x00e7aabe, 0x00e486bf, 0x00e7ab8c,
+ /* b9 */ 0x00e7ab91, 0x00e7aba7, 0x00e7aba8, 0x00e7abb4,
+ /* bd */ 0xf0a5aba4, 0xf0a5aba3, 0x00e7ac87, 0xf0a5abb1,
+ /* c1 */ 0x00e7acbd, 0x00e7aca7, 0x00e7acaa, 0x00e7acae,
+ /* c5 */ 0x00e7acaf, 0x00e7acb1, 0x00e487a6, 0x00e487b3,
+ /* c9 */ 0x00e7adbf, 0x00e7ad81, 0x00e487ae, 0x00e7ad95,
+ /* cd */ 0x00e7adb9, 0x00e7ada4, 0x00e7ada6, 0x00e7ada9,
+ /* d1 */ 0x00e7adb3, 0xf0a5aeb2, 0x00e48887, 0x00e7ae90,
+ /* d5 */ 0x00e7ae91, 0x00e7ae9b, 0x00e4888e, 0x00e7aeaf,
+ /* d9 */ 0x00e7aeb5, 0x00e7aebc, 0x00e7af85, 0x00e7af8a,
+ /* dd */ 0xf0a5b18b, 0xf0a5b1a4, 0x00e7af94, 0x00e7af96,
+ /* e1 */ 0x00e7af9a, 0x00e7afaa, 0x00e7afb0, 0x00e7b083,
+ /* e5 */ 0x00e7b08b, 0x00e7b08e, 0x00e7b08f, 0x00e7b0a6,
+ /* e9 */ 0x00e7b185, 0x00e7b18a, 0x00e7b191, 0x00e7b197,
+ /* ed */ 0x00e7b19e, 0x00e7b1a1, 0x00e7b1a9, 0x00e7b1ae,
+ /* f1 */ 0x00e7b1af, 0x00e7b1b0, 0xf0a5b8ae, 0xf0a5b996,
+ /* f5 */ 0xf0a5b9a5, 0x00e7b2a6, 0xf0a5b9a2, 0x00e7b2b6,
+ /* f9 */ 0x00e7b2b7, 0x00e7b2bf, 0xf0a5bb98, 0x00e7b384,
+ /* fd */ 0xf0a5bb82, 0x00e7b388,
+
+ /*** Three byte table, leaf: 8ff4xx - offset 0x029c5 ***/
+
+ /* a1 */ 0x00e7b38d, 0xf0a5bba8, 0x00e7b397, 0xf0a5bca3,
+ /* a5 */ 0x00e7b3a6, 0x00e7b3ab, 0xf0a5bd9c, 0x00e7b3b5,
+ /* a9 */ 0x00e7b483, 0x00e7b489, 0x00e48b86, 0x00e7b492,
+ /* ad */ 0x00e7b49e, 0xf0a5bfa0, 0xf0a5bf94, 0x00e7b4bd,
+ /* b1 */ 0x00e7b4be, 0x00e7b580, 0x00e7b587, 0xf0a6808c,
+ /* b5 */ 0xf0a5bfbb, 0x00e48b96, 0x00e7b599, 0x00e7b59a,
+ /* b9 */ 0x00e7b5aa, 0x00e7b5b0, 0x00e48b9d, 0x00e7b5bf,
+ /* bd */ 0xf0a68097, 0x00e7b686, 0x00e7b688, 0x00e7b68c,
+ /* c1 */ 0x00e7b697, 0xf0a681a0, 0x00e7b69d, 0x00e7b6a7,
+ /* c5 */ 0x00e7b6aa, 0x00e7b6b6, 0x00e7b6b7, 0x00e7b780,
+ /* c9 */ 0x00e7b797, 0x00e7b799, 0x00e7b7a6, 0x00e7b7b1,
+ /* cd */ 0x00e7b7b9, 0x00e48c82, 0xf0a683ad, 0x00efa998,
+ /* d1 */ 0x00e7b890, 0x00e7b897, 0x00e7b89d, 0x00e7b8a0,
+ /* d5 */ 0x00e7b8a7, 0x00e7b8ac, 0x00e7b985, 0x00e7b9b3,
+ /* d9 */ 0x00e7b9b5, 0x00e7b9be, 0x00e7ba86, 0x00e7ba87,
+ /* dd */ 0x00e48cab, 0x00e7ba91, 0x00e7ba98, 0x00e7ba9a,
+ /* e1 */ 0x00e48d83, 0x00e7bcbc, 0x00e7bcbb, 0x00e7bcbe,
+ /* e5 */ 0x00e7bd83, 0x00e7bd84, 0x00e7bd8f, 0x00e39381,
+ /* e9 */ 0xf0a689b0, 0x00e7bd92, 0xf0a68a86, 0x00e7bda1,
+ /* ed */ 0x00e7bda3, 0x00e7bda4, 0x00e7bdad, 0x00e7bdbd,
+ /* f1 */ 0x00e7bdbe, 0xf0a68d8c, 0x00e7be90, 0x00e585bb,
+ /* f5 */ 0xf0a3b48e, 0x00e7be96, 0x00e7be9c, 0x00e7bead,
+ /* f9 */ 0xf0a69082, 0x00e7bf83, 0x00e7bf8f, 0x00e7bfa3,
+ /* fd */ 0x00e7bfa5, 0x00e7bfaf,
+
+ /*** Three byte table, leaf: 8ff5xx - offset 0x02a23 ***/
+
+ /* a1 */ 0x00e7bfb2, 0x00e88082, 0x00e8808a, 0x00e88088,
+ /* a5 */ 0x00e8808e, 0x00e88091, 0x00e88096, 0x00e880a4,
+ /* a9 */ 0x00e880ac, 0x00e880b0, 0x00e88183, 0x00e881a6,
+ /* ad */ 0x00e881b1, 0x00e881b5, 0x00e881bb, 0x00e88299,
+ /* b1 */ 0x00e8829c, 0x00e882a4, 0x00e882a7, 0x00e882b8,
+ /* b5 */ 0xf0a699be, 0x00e88385, 0x00e88395, 0x00e88398,
+ /* b9 */ 0x00e883a6, 0xf0a69ab0, 0x00e8848d, 0x00e883b5,
+ /* bd */ 0x00e883bb, 0x00e48fae, 0x00e884b5, 0x00e88496,
+ /* c1 */ 0x00e8849e, 0x00e48fb0, 0x00e884a4, 0x00e884a7,
+ /* c5 */ 0x00e884ac, 0xf0a69c9d, 0x00e884bd, 0x00e49088,
+ /* c9 */ 0x00e885a9, 0x00e49097, 0x00e88681, 0x00e4909c,
+ /* cd */ 0x00e88684, 0x00e88685, 0x00e490a2, 0x00e88698,
+ /* d1 */ 0x00e886b2, 0x00e88781, 0x00e88783, 0x00e88796,
+ /* d5 */ 0x00e8879b, 0xf0a6a39d, 0x00e887a4, 0xf0a6a3aa,
+ /* d9 */ 0x00e887ac, 0xf0a6a591, 0x00e887bd, 0x00e887bf,
+ /* dd */ 0xf0a6a5af, 0x00e88884, 0xf0a6a79d, 0x00e88899,
+ /* e1 */ 0x00e888a1, 0x00e888a2, 0xf0a6a89e, 0x00e888b2,
+ /* e5 */ 0x00e888b4, 0x00e888bc, 0x00e88986, 0x00e88989,
+ /* e9 */ 0x00e88985, 0xf0a6a998, 0x00e8898b, 0x00e491b6,
+ /* ed */ 0x00e8898f, 0x00e491ba, 0x00e88997, 0xf0a6aa8c,
+ /* f1 */ 0x00e8899c, 0x00e889a3, 0xf0a6aab7, 0x00efa99d,
+ /* f5 */ 0x00efa99e, 0x00e889b9, 0x00e49291, 0x00e889bd,
+ /* f9 */ 0x00e889bf, 0x00e88a83, 0x00e88a8a, 0x00e88a93,
+ /* fd */ 0x00e88aa7, 0x00e88aa8,
+
+ /*** Three byte table, leaf: 8ff6xx - offset 0x02a81 ***/
+
+ /* a1 */ 0x00e88ab2, 0x00e88ab4, 0x00e88aba, 0x00e88abc,
+ /* a5 */ 0x00e88ba2, 0x00e88ba8, 0x00e88bb7, 0x00e88c87,
+ /* a9 */ 0x00e88c88, 0x00e88c8c, 0x00e88d94, 0x00e88c9b,
+ /* ad */ 0x00e88c9d, 0x00e88cb0, 0x00e88cbc, 0x00e88d84,
+ /* b1 */ 0x00e88d97, 0x00e492be, 0x00e88dbf, 0x00e49394,
+ /* b5 */ 0x00e492b3, 0x00e88e8d, 0x00e88e94, 0x00e88e95,
+ /* b9 */ 0x00e88e9b, 0x00e88e9d, 0x00e88f89, 0x00e88f90,
+ /* bd */ 0x00e88f94, 0x00e88f9d, 0x00e88fa5, 0x00e88fb9,
+ /* c1 */ 0x00e8908f, 0x00e89091, 0x00e89095, 0xf0a6b1b3,
+ /* c5 */ 0x00e89097, 0x00e890b9, 0x00e8918a, 0x00e8918f,
+ /* c9 */ 0x00e89191, 0x00e89192, 0x00e89199, 0x00e8919a,
+ /* cd */ 0x00e8919c, 0xf0a6b39d, 0x00e891a5, 0x00e891b6,
+ /* d1 */ 0x00e891b8, 0x00e891bc, 0x00e89281, 0x00e4948d,
+ /* d5 */ 0x00e8939c, 0x00e89297, 0x00e892a6, 0x00e892be,
+ /* d9 */ 0x00e49488, 0x00e8938e, 0x00e8938f, 0x00e89393,
+ /* dd */ 0xf0a6b9a5, 0x00e893a7, 0x00e893aa, 0x00e893af,
+ /* e1 */ 0x00e893b0, 0x00e893b1, 0x00e893ba, 0x00e893bd,
+ /* e5 */ 0x00e8948c, 0x00e8949b, 0x00e894a4, 0x00e894a5,
+ /* e9 */ 0x00e894ab, 0x00e894b4, 0x00e8958f, 0x00e895af,
+ /* ed */ 0x00e494a5, 0x00e49583, 0x00e894be, 0x00e89591,
+ /* f1 */ 0x00e89593, 0x00e8959e, 0x00e895a1, 0x00e895a2,
+ /* f5 */ 0xf0a6be94, 0x00e895bb, 0x00e895bd, 0x00e895bf,
+ /* f9 */ 0x00e89681, 0x00e89686, 0x00e89693, 0x00e8969d,
+ /* fd */ 0x00e8969f, 0xf0a6bfb8,
+
+ /*** Three byte table, leaf: 8ff7xx - offset 0x02adf ***/
+
+ /* a1 */ 0xf0a6bfb6, 0xf0a6bfb7, 0x00e896b7, 0x00e896bc,
+ /* a5 */ 0x00e89787, 0x00e8978a, 0x00e89798, 0x00e89799,
+ /* a9 */ 0x00e8979f, 0x00e897a1, 0x00e897a6, 0x00e897b6,
+ /* ad */ 0x00e89880, 0x00e89891, 0x00e8989e, 0x00e898a1,
+ /* b1 */ 0x00e898a4, 0x00e898a7, 0xf0a7848d, 0x00e898b9,
+ /* b5 */ 0x00e898bc, 0xf0a784b9, 0x00e89980, 0x00efa8a0,
+ /* b9 */ 0x00e89993, 0x00e89996, 0x00e899af, 0x00e899b7,
+ /* bd */ 0x00e899ba, 0x00e89a87, 0x00e89a89, 0x00e89a8d,
+ /* c1 */ 0x00e89a91, 0x00e89a9c, 0x00e89a9d, 0x00e89aa8,
+ /* c5 */ 0x00efa8a1, 0x00e89ab1, 0x00e89ab3, 0x00e89b81,
+ /* c9 */ 0x00e89b83, 0x00e89b91, 0x00e89b95, 0x00e89b97,
+ /* cd */ 0x00e89ba3, 0x00e89ba6, 0x00e496b8, 0x00e89c85,
+ /* d1 */ 0x00e89c87, 0x00e89c8e, 0x00e89c90, 0x00e89c93,
+ /* d5 */ 0x00e89c99, 0x00e89c9f, 0x00e89ca1, 0x00e89ca3,
+ /* d9 */ 0x00e89cb1, 0x00e89cba, 0x00e89cbe, 0x00e89d80,
+ /* dd */ 0x00e89d83, 0x00e89d91, 0x00e89d98, 0x00e89da4,
+ /* e1 */ 0x00e89da5, 0x00e89db2, 0x00e89dbc, 0xf0a78f9b,
+ /* e5 */ 0xf0a78f9a, 0x00e89ea7, 0x00e89e89, 0x00e89e8b,
+ /* e9 */ 0x00e89e93, 0x00e89ea0, 0xf0a78fbe, 0x00e497a5,
+ /* ed */ 0x00e89ebe, 0xf0a79090, 0x00e89f81, 0x00e89f8e,
+ /* f1 */ 0x00e89fb5, 0x00e89f9f, 0xf0a79189, 0x00e89fa3,
+ /* f5 */ 0x00e89fa5, 0x00e89fa6, 0x00e89faa, 0x00e89fab,
+ /* f9 */ 0x00e89fad, 0x00e8a081, 0x00e8a083, 0x00e8a08b,
+ /* fd */ 0x00e8a093, 0x00e8a0a8,
+
+ /*** Three byte table, leaf: 8ff8xx - offset 0x02b3d ***/
+
+ /* a1 */ 0x00e8a0ae, 0x00e8a0b2, 0x00e8a0bc, 0x00e4988f,
+ /* a5 */ 0x00e8a18a, 0x00e8a198, 0x00e8a19f, 0x00e8a1a4,
+ /* a9 */ 0xf0a79895, 0xf0a79894, 0x00e8a1a9, 0xf0a798b1,
+ /* ad */ 0x00e8a1af, 0x00e8a2a0, 0x00e8a2bc, 0x00e8a2bd,
+ /* b1 */ 0x00e8a2be, 0x00e8a380, 0x00e8a392, 0xf0a79a93,
+ /* b5 */ 0x00e8a391, 0x00e8a393, 0x00e8a39b, 0x00e8a3b0,
+ /* b9 */ 0x00e8a3b1, 0x00e49981, 0x00e8a481, 0xf0a79c8e,
+ /* bd */ 0x00e8a4b7, 0xf0a79ca3, 0x00e8a582, 0x00e8a585,
+ /* c1 */ 0x00e8a589, 0xf0a79d92, 0x00e499a5, 0x00e8a5a2,
+ /* c5 */ 0x00e8a680, 0x00e8a689, 0x00e8a690, 0x00e8a69f,
+ /* c9 */ 0x00e8a6b0, 0x00e8a6b7, 0x00e8a796, 0x00e8a798,
+ /* cd */ 0x00e8a7ab, 0x00e49aa1, 0x00e8a7b1, 0x00e8a7b3,
+ /* d1 */ 0x00e8a7bd, 0x00e8a7bf, 0x00e49aaf, 0x00e8a891,
+ /* d5 */ 0x00e8a894, 0xf0a7a685, 0x00e8a8a1, 0x00e8a8b5,
+ /* d9 */ 0x00e8a8be, 0x00e8a985, 0x00e8a98d, 0x00e8a998,
+ /* dd */ 0x00e8aaae, 0x00e8aa90, 0x00e8aab7, 0x00e8aabe,
+ /* e1 */ 0x00e8ab97, 0x00e8abbc, 0xf0a7aa84, 0x00e8ac8a,
+ /* e5 */ 0x00e8ac85, 0x00e8ac8d, 0x00e8ac9c, 0x00e8ac9f,
+ /* e9 */ 0x00e8acad, 0x00e8ad83, 0x00e49c8c, 0x00e8ad91,
+ /* ed */ 0x00e8ad9e, 0x00e8adb6, 0x00e8adbf, 0x00e8ae81,
+ /* f1 */ 0x00e8ae8b, 0x00e8ae94, 0x00e8ae95, 0x00e8ae9c,
+ /* f5 */ 0x00e8ae9e, 0x00e8b0b9, 0xf0a7aeb3, 0x00e8b0bd,
+ /* f9 */ 0xf0a7aebe, 0xf0a7af87, 0x00e8b185, 0x00e8b187,
+ /* fd */ 0x00e8b18f, 0x00e8b194,
+
+ /*** Three byte table, leaf: 8ff9xx - offset 0x02b9b ***/
+
+ /* a1 */ 0x00e8b197, 0x00e8b1a9, 0x00e8b1ad, 0x00e8b1b3,
+ /* a5 */ 0xf0a7b2b8, 0x00e8b293, 0x00e8b292, 0x00e8b299,
+ /* a9 */ 0x00e49da4, 0x00e8b29b, 0x00e8b2a4, 0x00e8b396,
+ /* ad */ 0x00e8b395, 0x00e8b399, 0xf0a7b6a0, 0x00e8b3b0,
+ /* b1 */ 0x00e8b3b1, 0xf0a7b890, 0x00e8b489, 0x00e8b48e,
+ /* b5 */ 0x00e8b5ac, 0x00e8b684, 0x00e8b695, 0x00e8b6a6,
+ /* b9 */ 0xf0a7beb7, 0x00e8b786, 0x00e8b788, 0x00e8b799,
+ /* bd */ 0x00e8b7ac, 0x00e8b88c, 0x00e49fbd, 0x00e8b7bd,
+ /* c1 */ 0x00e8b886, 0xf0a8828a, 0x00e8b894, 0x00e8b896,
+ /* c5 */ 0x00e8b8a1, 0x00e8b8a2, 0x00e8b8a7, 0xf0a882bb,
+ /* c9 */ 0x00e4a096, 0x00e8b8b6, 0x00e8b8b9, 0x00e8b98b,
+ /* cd */ 0x00e8b994, 0x00e8b9a2, 0x00e8b9ac, 0x00e8b9ad,
+ /* d1 */ 0x00e8b9af, 0x00e8ba98, 0x00e8ba9e, 0x00e8baae,
+ /* d5 */ 0x00e8bab3, 0x00e8bab5, 0x00e8bab6, 0x00e8babb,
+ /* d9 */ 0xf0a88a82, 0x00e8bb91, 0x00e8bb94, 0x00e4a18e,
+ /* dd */ 0x00e8bbb9, 0xf0a88bb3, 0x00e8bc80, 0x00e8bc88,
+ /* e1 */ 0x00e8bc97, 0x00e8bcab, 0x00e8bd80, 0x00e8bd8a,
+ /* e5 */ 0x00e8bd98, 0xf0a8908c, 0x00e8bea4, 0x00e8beb4,
+ /* e9 */ 0x00efa9a6, 0x00e8beb6, 0xf0a89195, 0x00e8bf81,
+ /* ed */ 0x00e8bf86, 0x00efa8a4, 0x00e8bf8a, 0x00e8bf8d,
+ /* f1 */ 0x00e8bf93, 0x00e8bf95, 0x00e8bfa0, 0x00e8bfb1,
+ /* f5 */ 0x00e8bfb5, 0x00e8bfbb, 0x00e98082, 0x00e9808c,
+ /* f9 */ 0x00e980b7, 0xf0a895ab, 0x00e98183, 0x00e98184,
+ /* fd */ 0x00e9819d, 0xf0a89788,
+
+ /*** Three byte table, leaf: 8ffaxx - offset 0x02bf9 ***/
+
+ /* a1 */ 0xf0a89789, 0x00e98285, 0x00e9828c, 0x00e98290,
+ /* a5 */ 0x00e9989d, 0x00e982a1, 0x00e4a2b5, 0x00e982b0,
+ /* a9 */ 0x00e982b6, 0x00e98383, 0x00e98388, 0xf0a89b97,
+ /* ad */ 0x00e9839c, 0x00e9839f, 0xf0a89bba, 0x00e983b6,
+ /* b1 */ 0x00e983b2, 0x00e98480, 0x00e983ab, 0x00e983be,
+ /* b5 */ 0x00e983bf, 0x00e98484, 0x00e98486, 0x00e98498,
+ /* b9 */ 0x00e9849c, 0x00e9849e, 0x00e984b7, 0x00e984b9,
+ /* bd */ 0x00e984ba, 0x00e98586, 0x00e98587, 0x00e98597,
+ /* c1 */ 0x00e98599, 0x00e985a1, 0x00e985a4, 0x00e985b4,
+ /* c5 */ 0x00e985b9, 0x00e98685, 0x00e9868e, 0x00e986a8,
+ /* c9 */ 0x00e986ae, 0x00e986b3, 0x00e986b6, 0x00e98783,
+ /* cd */ 0x00e98784, 0x00e9879a, 0xf0a8a589, 0xf0a8a586,
+ /* d1 */ 0x00e987ac, 0x00e987ae, 0x00e98881, 0x00e9888a,
+ /* d5 */ 0x00e98896, 0x00e98897, 0xf0a8a5ab, 0x00e988b3,
+ /* d9 */ 0x00e98982, 0x00e98987, 0x00e9898a, 0x00e9898e,
+ /* dd */ 0x00e98991, 0x00e98996, 0x00e98999, 0x00e989a0,
+ /* e1 */ 0x00e989a1, 0x00e989a5, 0x00e989a7, 0x00e989a8,
+ /* e5 */ 0xf0a8a687, 0xf0a8a688, 0x00e989bc, 0x00e989bd,
+ /* e9 */ 0x00e989bf, 0x00e98a89, 0x00e98a8d, 0x00e98a97,
+ /* ed */ 0x00e98a99, 0x00e98a9f, 0x00e98aa7, 0x00e98aab,
+ /* f1 */ 0xf0a8a6ba, 0xf0a8a6bb, 0x00e98ab2, 0x00e98abf,
+ /* f5 */ 0x00e98b80, 0x00e98b86, 0x00e98b8e, 0x00e98b90,
+ /* f9 */ 0x00e98b97, 0x00e98b99, 0x00e98ba5, 0x00e98ba7,
+ /* fd */ 0x00e98c91, 0xf0a8a89e,
+
+ /*** Three byte table, leaf: 8ffbxx - offset 0x02c57 ***/
+
+ /* a1 */ 0xf0a8a8a9, 0x00e98bb7, 0x00e98bb9, 0x00e98bbb,
+ /* a5 */ 0x00e98c82, 0x00e98c8d, 0x00e98c95, 0x00e98c9d,
+ /* a9 */ 0x00e98c9e, 0x00e98ca7, 0x00e98ca9, 0xf0a8a9b1,
+ /* ad */ 0xf0a8a983, 0x00e98d87, 0x00e98d91, 0x00e98d97,
+ /* b1 */ 0x00e98d9a, 0x00e98dab, 0x00e98db1, 0x00e98db3,
+ /* b5 */ 0x00e98ea1, 0xf0a8aa99, 0xf0a8ab8d, 0x00e98e88,
+ /* b9 */ 0x00e98e8b, 0x00e98e8f, 0x00e98e9e, 0x00e98fb5,
+ /* bd */ 0xf0a8aba4, 0xf0a8ab9d, 0x00e98fb1, 0x00e98f81,
+ /* c1 */ 0x00e98f87, 0x00e98f9c, 0x00e98fa2, 0x00e98fa7,
+ /* c5 */ 0x00e99089, 0x00e9908f, 0x00e99096, 0x00e99097,
+ /* c9 */ 0x00e98fbb, 0x00e990b2, 0x00e990b4, 0x00e990bb,
+ /* cd */ 0x00e99185, 0xf0a8af81, 0xf0a8afaf, 0x00e991ad,
+ /* d1 */ 0x00e991af, 0x00e995b8, 0x00e995b9, 0x00e99686,
+ /* d5 */ 0x00e9968c, 0x00e9968d, 0xf0a8b490, 0x00e996ab,
+ /* d9 */ 0x00e996b4, 0xf0a8b5b1, 0x00e99788, 0xf0a8b7bb,
+ /* dd */ 0xf0a8b89f, 0x00e998ac, 0x00e998b3, 0x00e998b4,
+ /* e1 */ 0xf0a8b8b6, 0x00e998bc, 0x00e99981, 0x00e999a1,
+ /* e5 */ 0xf0a8ba89, 0x00e99a82, 0xf0a8bbab, 0x00e99a9a,
+ /* e9 */ 0xf0a8bcb2, 0x00e4a7a7, 0x00e99aa9, 0x00e99aaf,
+ /* ed */ 0x00e99ab3, 0x00e99aba, 0x00e99abd, 0x00e4a7ba,
+ /* f1 */ 0xf0a8bfb8, 0x00e99b98, 0x00e99b9a, 0x00e99b9d,
+ /* f5 */ 0x00e4a884, 0x00e99c94, 0x00e99ca3, 0x00e4a8a9,
+ /* f9 */ 0x00e99cb6, 0x00e99d81, 0x00e99d87, 0x00e99d95,
+ /* fd */ 0x00e99d97, 0x00e99d9b,
+
+ /*** Three byte table, leaf: 8ffcxx - offset 0x02cb5 ***/
+
+ /* a1 */ 0x00e99daa, 0xf0a98aa0, 0xf0a98ab1, 0x00e99e96,
+ /* a5 */ 0x00e99e9a, 0x00e99e9e, 0x00e99ea2, 0x00e99eb1,
+ /* a9 */ 0x00e99eb2, 0x00e99ebe, 0x00e99f8c, 0x00e99f91,
+ /* ad */ 0x00e99f94, 0x00e99f98, 0x00e99f99, 0x00e99fa1,
+ /* b1 */ 0x00e99fb1, 0x00e9a084, 0x00e9a08d, 0x00e9a08e,
+ /* b5 */ 0x00e9a094, 0x00e9a096, 0x00e4aabc, 0xf0a99290,
+ /* b9 */ 0x00e9a0a3, 0x00e9a0b2, 0x00e9a0b3, 0x00e9a0a5,
+ /* bd */ 0x00e9a187, 0x00e9a1a6, 0x00e9a2ab, 0x00e9a2ad,
+ /* c1 */ 0x00e9a2b0, 0xf0a9978f, 0x00e9a2b7, 0x00e9a2b8,
+ /* c5 */ 0x00e9a2bb, 0x00e9a2bc, 0x00e9a2bf, 0x00e9a382,
+ /* c9 */ 0x00e9a387, 0x00e9a38b, 0x00e9a3a0, 0xf0a999bf,
+ /* cd */ 0x00e9a3a1, 0x00e9a3a3, 0x00e9a3a5, 0x00e9a3aa,
+ /* d1 */ 0x00e9a3b0, 0x00e9a3b1, 0x00e9a3b3, 0x00e9a488,
+ /* d5 */ 0x00e4acbb, 0xf0a99bb0, 0x00e9a496, 0x00e9a497,
+ /* d9 */ 0xf0a99c99, 0x00e9a49a, 0x00e9a49b, 0x00e9a49c,
+ /* dd */ 0xf0a99d90, 0x00e9a4b1, 0x00e9a4b2, 0x00e9a4b3,
+ /* e1 */ 0x00e9a4ba, 0x00e9a4bb, 0x00e9a4bc, 0x00e9a580,
+ /* e5 */ 0x00e9a581, 0x00e9a586, 0x00e9a58d, 0x00e9a58e,
+ /* e9 */ 0x00e9a59c, 0x00e9a59f, 0x00e9a5a0, 0x00e9a6a3,
+ /* ed */ 0x00e9a6a6, 0x00e9a6b9, 0x00e9a6bd, 0x00e9a6bf,
+ /* f1 */ 0x00e9a783, 0x00e9a789, 0x00e9a794, 0x00e9a799,
+ /* f5 */ 0x00e9a79e, 0xf0a9a386, 0x00e9a7b0, 0x00e9a7b9,
+ /* f9 */ 0x00e9a7bc, 0x00e9a88a, 0x00e9a891, 0x00e9a896,
+ /* fd */ 0x00e9a89a, 0x00e9a8a0,
+
+ /*** Three byte table, leaf: 8ffdxx - offset 0x02d13 ***/
+
+ /* a1 */ 0x00e9a8b1, 0x00e9a8b6, 0x00e9a984, 0x00e9a98c,
+ /* a5 */ 0x00e9a998, 0x00e4af82, 0x00e9aaaf, 0x00e4af8a,
+ /* a9 */ 0x00e9aab7, 0x00e4af92, 0x00e9aab9, 0xf0a9a9b2,
+ /* ad */ 0x00e9ab86, 0x00e9ab90, 0x00e9ab92, 0x00e9ab95,
+ /* b1 */ 0x00e4afa8, 0x00e9ab9c, 0x00e9aba0, 0x00e9aba5,
+ /* b5 */ 0x00e9aba9, 0x00e9ac83, 0x00e9ac8c, 0x00e9ac90,
+ /* b9 */ 0x00e9ac92, 0x00e9ac96, 0x00e9ac9c, 0x00e9acab,
+ /* bd */ 0x00e9acb3, 0x00e9acbd, 0x00e4b0a0, 0x00e9ad8b,
+ /* c1 */ 0x00e9ada3, 0x00e9ada5, 0x00e9adab, 0x00e9adac,
+ /* c5 */ 0x00e9adb3, 0x00e9adb6, 0x00e9adb7, 0x00e9aea6,
+ /* c9 */ 0x00e9aeac, 0x00e9aeb1, 0xf0a9b79b, 0xf0a9b8bd,
+ /* cd */ 0x00e9aeb2, 0x00e9aeb8, 0x00e9aebe, 0x00e9af87,
+ /* d1 */ 0x00e9afb3, 0x00e9af98, 0x00e9af9d, 0x00e9afa7,
+ /* d5 */ 0x00e9afaa, 0x00e9afab, 0x00e9afaf, 0x00e9afae,
+ /* d9 */ 0xf0a9b895, 0x00e9afba, 0xf0a9ba8a, 0x00e9afb7,
+ /* dd */ 0xf0a9b989, 0x00e9b096, 0x00e9b098, 0x00e9b099,
+ /* e1 */ 0x00e9b09a, 0x00e9b09d, 0x00e9b0a2, 0x00e9b0a7,
+ /* e5 */ 0x00e9b0a9, 0x00e9b0aa, 0xf0a9bb84, 0x00e9b0b1,
+ /* e9 */ 0x00e9b0b6, 0x00e9b0b7, 0x00e9b185, 0x00e9b19c,
+ /* ed */ 0xf0a9bba9, 0x00e9b189, 0x00e9b18a, 0xf0a9bb9b,
+ /* f1 */ 0x00e9b194, 0x00e9b198, 0x00e9b19b, 0x00e9b19d,
+ /* f5 */ 0x00e9b19f, 0x00e9b1a9, 0x00e9b1aa, 0x00e9b1ab,
+ /* f9 */ 0x00e9b1ad, 0x00e9b1ae, 0x00e9b1b0, 0x00e9b1b2,
+ /* fd */ 0x00e9b1b5, 0x00e9b1ba,
+
+ /*** Three byte table, leaf: 8ffexx - offset 0x02d71 ***/
+
+ /* a1 */ 0x00e9b3a6, 0x00e9b3b2, 0x00e9b48b, 0x00e9b482,
+ /* a5 */ 0xf0a9bf8e, 0x00e9b491, 0x00e9b497, 0x00e9b498,
+ /* a9 */ 0xf0aa80af, 0x00e4b384, 0xf0aa809a, 0x00e9b4b2,
+ /* ad */ 0x00e4b391, 0x00e9b582, 0x00e9b58a, 0x00e9b59f,
+ /* b1 */ 0x00e9b5a2, 0xf0aa83b9, 0x00e9b5a9, 0x00e9b5ab,
+ /* b5 */ 0xf0aa8282, 0x00e9b5b3, 0x00e9b5b6, 0x00e9b5b7,
+ /* b9 */ 0x00e9b5be, 0x00e9b684, 0x00e9b68d, 0x00e9b699,
+ /* bd */ 0x00e9b6a1, 0x00e9b6bf, 0x00e9b6b5, 0x00e9b6b9,
+ /* c1 */ 0x00e9b6bd, 0x00e9b783, 0x00e9b787, 0x00e9b789,
+ /* c5 */ 0x00e9b796, 0x00e9b79a, 0x00e9b79f, 0x00e9b7a0,
+ /* c9 */ 0x00e9b7a3, 0x00e9b7b4, 0x00e4b487, 0x00e9b88a,
+ /* cd */ 0x00e9b882, 0x00e9b88d, 0x00e9b899, 0x00e9b89c,
+ /* d1 */ 0x00e9b89d, 0x00e9b9bb, 0xf0a28898, 0x00e9ba80,
+ /* d5 */ 0x00e9ba85, 0x00e9ba9b, 0x00e9baa8, 0xf0aa8e8c,
+ /* d9 */ 0x00e9babd, 0xf0aa90b7, 0x00e9bb9f, 0x00e9bba7,
+ /* dd */ 0x00e9bbae, 0x00e9bbbf, 0x00e9bc82, 0x00e4b5b7,
+ /* e1 */ 0x00e9bc83, 0x00e9bc97, 0x00e9bc99, 0x00e9bcaf,
+ /* e5 */ 0x00e9bcb7, 0x00e9bcba, 0x00e9bcbd, 0x00e9bd81,
+ /* e9 */ 0x00e9bd85, 0x00e9bd86, 0x00e9bd93, 0x00e9bd95,
+ /* ed */ 0x00e9bd98, 0xf0aa97b1, 0x00e9bd9d, 0xf0aa9882,
+ /* f1 */ 0x00e9bda9, 0xf0aa989a, 0x00e9bdad, 0x00e9bdb0,
+ /* f5 */ 0x00e9bdb5, 0xf0aa9ab2, 0x00000000, 0x00000000,
+ /* f9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fd */ 0x00000000, 0x00000000
+};
+
+/* Combined character map */
+static const pg_local_to_utf_combined LUmapEUC_JIS_2004_combined[25] = {
+ {0xa4f7, 0x00e3818b, 0x00e3829a}, /* U+304B+309A [2000] */
+ {0xa4f8, 0x00e3818d, 0x00e3829a}, /* U+304D+309A [2000] */
+ {0xa4f9, 0x00e3818f, 0x00e3829a}, /* U+304F+309A [2000] */
+ {0xa4fa, 0x00e38191, 0x00e3829a}, /* U+3051+309A [2000] */
+ {0xa4fb, 0x00e38193, 0x00e3829a}, /* U+3053+309A [2000] */
+ {0xa5f7, 0x00e382ab, 0x00e3829a}, /* U+30AB+309A [2000] */
+ {0xa5f8, 0x00e382ad, 0x00e3829a}, /* U+30AD+309A [2000] */
+ {0xa5f9, 0x00e382af, 0x00e3829a}, /* U+30AF+309A [2000] */
+ {0xa5fa, 0x00e382b1, 0x00e3829a}, /* U+30B1+309A [2000] */
+ {0xa5fb, 0x00e382b3, 0x00e3829a}, /* U+30B3+309A [2000] */
+ {0xa5fc, 0x00e382bb, 0x00e3829a}, /* U+30BB+309A [2000] */
+ {0xa5fd, 0x00e38384, 0x00e3829a}, /* U+30C4+309A [2000] */
+ {0xa5fe, 0x00e38388, 0x00e3829a}, /* U+30C8+309A [2000] */
+ {0xa6f8, 0x00e387b7, 0x00e3829a}, /* U+31F7+309A [2000] */
+ {0xabc4, 0x0000c3a6, 0x0000cc80}, /* U+00E6+0300 [2000] */
+ {0xabc8, 0x0000c994, 0x0000cc80}, /* U+0254+0300 [2000] */
+ {0xabc9, 0x0000c994, 0x0000cc81}, /* U+0254+0301 [2000] */
+ {0xabca, 0x0000ca8c, 0x0000cc80}, /* U+028C+0300 [2000] */
+ {0xabcb, 0x0000ca8c, 0x0000cc81}, /* U+028C+0301 [2000] */
+ {0xabcc, 0x0000c999, 0x0000cc80}, /* U+0259+0300 [2000] */
+ {0xabcd, 0x0000c999, 0x0000cc81}, /* U+0259+0301 [2000] */
+ {0xabce, 0x0000c99a, 0x0000cc80}, /* U+025A+0300 [2000] */
+ {0xabcf, 0x0000c99a, 0x0000cc81}, /* U+025A+0301 [2000] */
+ {0xabe5, 0x0000cba9, 0x0000cba5}, /* U+02E9+02E5 [2000] */
+ {0xabe6, 0x0000cba5, 0x0000cba9} /* U+02E5+02E9 [2000] */
+};
diff --git a/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map b/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
new file mode 100644
index 0000000..ee23de2
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
@@ -0,0 +1,4142 @@
+/* src/backend/utils/mb/Unicode/euc_jp_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl */
+
+static const uint32 euc_jp_to_unicode_tree_table[14254];
+
+static const pg_mb_radix_tree euc_jp_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_jp_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0067, /* offset of table for 2-byte inputs */
+ 0x8e, /* b2_1_lower */
+ 0xf4, /* b2_1_upper */
+ 0xa1, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x1dd0, /* offset of table for 3-byte inputs */
+ 0x8f, /* b3_1_lower */
+ 0x8f, /* b3_1_upper */
+ 0xa2, /* b3_2_lower */
+ 0xf4, /* b3_2_upper */
+ 0xa1, /* b3_3_lower */
+ 0xfe, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_jp_to_unicode_tree_table[14254] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00067 ***/
+
+ /* 8e */ 0x0000ce, 0x000000, 0x000000, 0x000000,
+ /* 92 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 96 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9a */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9e */ 0x000000, 0x000000, 0x000000, 0x00012c,
+ /* a2 */ 0x00018a, 0x0001e8, 0x000246, 0x0002a4,
+ /* a6 */ 0x000302, 0x000360, 0x0003be, 0x000000,
+ /* aa */ 0x000000, 0x000000, 0x000000, 0x00041c,
+ /* ae */ 0x000000, 0x000000, 0x00047a, 0x0004d8,
+ /* b2 */ 0x000536, 0x000594, 0x0005f2, 0x000650,
+ /* b6 */ 0x0006ae, 0x00070c, 0x00076a, 0x0007c8,
+ /* ba */ 0x000826, 0x000884, 0x0008e2, 0x000940,
+ /* be */ 0x00099e, 0x0009fc, 0x000a5a, 0x000ab8,
+ /* c2 */ 0x000b16, 0x000b74, 0x000bd2, 0x000c30,
+ /* c6 */ 0x000c8e, 0x000cec, 0x000d4a, 0x000da8,
+ /* ca */ 0x000e06, 0x000e64, 0x000ec2, 0x000f20,
+ /* ce */ 0x000f7e, 0x000fdc, 0x00103a, 0x001098,
+ /* d2 */ 0x0010f6, 0x001154, 0x0011b2, 0x001210,
+ /* d6 */ 0x00126e, 0x0012cc, 0x00132a, 0x001388,
+ /* da */ 0x0013e6, 0x001444, 0x0014a2, 0x001500,
+ /* de */ 0x00155e, 0x0015bc, 0x00161a, 0x001678,
+ /* e2 */ 0x0016d6, 0x001734, 0x001792, 0x0017f0,
+ /* e6 */ 0x00184e, 0x0018ac, 0x00190a, 0x001968,
+ /* ea */ 0x0019c6, 0x001a24, 0x001a82, 0x001ae0,
+ /* ee */ 0x001b3e, 0x001b9c, 0x001bfa, 0x001c58,
+ /* f2 */ 0x001cb6, 0x001d14, 0x001d72,
+
+ /*** Two byte table, leaf: 8exx - offset 0x000ce ***/
+
+ /* a1 */ 0xefbda1, 0xefbda2, 0xefbda3, 0xefbda4,
+ /* a5 */ 0xefbda5, 0xefbda6, 0xefbda7, 0xefbda8,
+ /* a9 */ 0xefbda9, 0xefbdaa, 0xefbdab, 0xefbdac,
+ /* ad */ 0xefbdad, 0xefbdae, 0xefbdaf, 0xefbdb0,
+ /* b1 */ 0xefbdb1, 0xefbdb2, 0xefbdb3, 0xefbdb4,
+ /* b5 */ 0xefbdb5, 0xefbdb6, 0xefbdb7, 0xefbdb8,
+ /* b9 */ 0xefbdb9, 0xefbdba, 0xefbdbb, 0xefbdbc,
+ /* bd */ 0xefbdbd, 0xefbdbe, 0xefbdbf, 0xefbe80,
+ /* c1 */ 0xefbe81, 0xefbe82, 0xefbe83, 0xefbe84,
+ /* c5 */ 0xefbe85, 0xefbe86, 0xefbe87, 0xefbe88,
+ /* c9 */ 0xefbe89, 0xefbe8a, 0xefbe8b, 0xefbe8c,
+ /* cd */ 0xefbe8d, 0xefbe8e, 0xefbe8f, 0xefbe90,
+ /* d1 */ 0xefbe91, 0xefbe92, 0xefbe93, 0xefbe94,
+ /* d5 */ 0xefbe95, 0xefbe96, 0xefbe97, 0xefbe98,
+ /* d9 */ 0xefbe99, 0xefbe9a, 0xefbe9b, 0xefbe9c,
+ /* dd */ 0xefbe9d, 0xefbe9e, 0xefbe9f, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a1xx - offset 0x0012c ***/
+
+ /* a1 */ 0xe38080, 0xe38081, 0xe38082, 0xefbc8c,
+ /* a5 */ 0xefbc8e, 0xe383bb, 0xefbc9a, 0xefbc9b,
+ /* a9 */ 0xefbc9f, 0xefbc81, 0xe3829b, 0xe3829c,
+ /* ad */ 0x00c2b4, 0xefbd80, 0x00c2a8, 0xefbcbe,
+ /* b1 */ 0xefbfa3, 0xefbcbf, 0xe383bd, 0xe383be,
+ /* b5 */ 0xe3829d, 0xe3829e, 0xe38083, 0xe4bb9d,
+ /* b9 */ 0xe38085, 0xe38086, 0xe38087, 0xe383bc,
+ /* bd */ 0xe28095, 0xe28090, 0xefbc8f, 0xefbcbc,
+ /* c1 */ 0xefbd9e, 0xe288a5, 0xefbd9c, 0xe280a6,
+ /* c5 */ 0xe280a5, 0xe28098, 0xe28099, 0xe2809c,
+ /* c9 */ 0xe2809d, 0xefbc88, 0xefbc89, 0xe38094,
+ /* cd */ 0xe38095, 0xefbcbb, 0xefbcbd, 0xefbd9b,
+ /* d1 */ 0xefbd9d, 0xe38088, 0xe38089, 0xe3808a,
+ /* d5 */ 0xe3808b, 0xe3808c, 0xe3808d, 0xe3808e,
+ /* d9 */ 0xe3808f, 0xe38090, 0xe38091, 0xefbc8b,
+ /* dd */ 0xefbc8d, 0x00c2b1, 0x00c397, 0x00c3b7,
+ /* e1 */ 0xefbc9d, 0xe289a0, 0xefbc9c, 0xefbc9e,
+ /* e5 */ 0xe289a6, 0xe289a7, 0xe2889e, 0xe288b4,
+ /* e9 */ 0xe29982, 0xe29980, 0x00c2b0, 0xe280b2,
+ /* ed */ 0xe280b3, 0xe28483, 0xefbfa5, 0xefbc84,
+ /* f1 */ 0xefbfa0, 0xefbfa1, 0xefbc85, 0xefbc83,
+ /* f5 */ 0xefbc86, 0xefbc8a, 0xefbca0, 0x00c2a7,
+ /* f9 */ 0xe29886, 0xe29885, 0xe2978b, 0xe2978f,
+ /* fd */ 0xe2978e, 0xe29787,
+
+ /*** Two byte table, leaf: a2xx - offset 0x0018a ***/
+
+ /* a1 */ 0xe29786, 0xe296a1, 0xe296a0, 0xe296b3,
+ /* a5 */ 0xe296b2, 0xe296bd, 0xe296bc, 0xe280bb,
+ /* a9 */ 0xe38092, 0xe28692, 0xe28690, 0xe28691,
+ /* ad */ 0xe28693, 0xe38093, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0xe28888, 0xe2888b, 0xe28a86,
+ /* bd */ 0xe28a87, 0xe28a82, 0xe28a83, 0xe288aa,
+ /* c1 */ 0xe288a9, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0xe288a7, 0xe288a8, 0xefbfa2,
+ /* cd */ 0xe28792, 0xe28794, 0xe28880, 0xe28883,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0xe288a0,
+ /* dd */ 0xe28aa5, 0xe28c92, 0xe28882, 0xe28887,
+ /* e1 */ 0xe289a1, 0xe28992, 0xe289aa, 0xe289ab,
+ /* e5 */ 0xe2889a, 0xe288bd, 0xe2889d, 0xe288b5,
+ /* e9 */ 0xe288ab, 0xe288ac, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0xe284ab, 0xe280b0, 0xe299af,
+ /* f5 */ 0xe299ad, 0xe299aa, 0xe280a0, 0xe280a1,
+ /* f9 */ 0x00c2b6, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0xe297af,
+
+ /*** Two byte table, leaf: a3xx - offset 0x001e8 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0xefbc90,
+ /* b1 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* b5 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* b9 */ 0xefbc99, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xefbd81, 0xefbd82, 0xefbd83, 0xefbd84,
+ /* e5 */ 0xefbd85, 0xefbd86, 0xefbd87, 0xefbd88,
+ /* e9 */ 0xefbd89, 0xefbd8a, 0xefbd8b, 0xefbd8c,
+ /* ed */ 0xefbd8d, 0xefbd8e, 0xefbd8f, 0xefbd90,
+ /* f1 */ 0xefbd91, 0xefbd92, 0xefbd93, 0xefbd94,
+ /* f5 */ 0xefbd95, 0xefbd96, 0xefbd97, 0xefbd98,
+ /* f9 */ 0xefbd99, 0xefbd9a, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a4xx - offset 0x00246 ***/
+
+ /* a1 */ 0xe38181, 0xe38182, 0xe38183, 0xe38184,
+ /* a5 */ 0xe38185, 0xe38186, 0xe38187, 0xe38188,
+ /* a9 */ 0xe38189, 0xe3818a, 0xe3818b, 0xe3818c,
+ /* ad */ 0xe3818d, 0xe3818e, 0xe3818f, 0xe38190,
+ /* b1 */ 0xe38191, 0xe38192, 0xe38193, 0xe38194,
+ /* b5 */ 0xe38195, 0xe38196, 0xe38197, 0xe38198,
+ /* b9 */ 0xe38199, 0xe3819a, 0xe3819b, 0xe3819c,
+ /* bd */ 0xe3819d, 0xe3819e, 0xe3819f, 0xe381a0,
+ /* c1 */ 0xe381a1, 0xe381a2, 0xe381a3, 0xe381a4,
+ /* c5 */ 0xe381a5, 0xe381a6, 0xe381a7, 0xe381a8,
+ /* c9 */ 0xe381a9, 0xe381aa, 0xe381ab, 0xe381ac,
+ /* cd */ 0xe381ad, 0xe381ae, 0xe381af, 0xe381b0,
+ /* d1 */ 0xe381b1, 0xe381b2, 0xe381b3, 0xe381b4,
+ /* d5 */ 0xe381b5, 0xe381b6, 0xe381b7, 0xe381b8,
+ /* d9 */ 0xe381b9, 0xe381ba, 0xe381bb, 0xe381bc,
+ /* dd */ 0xe381bd, 0xe381be, 0xe381bf, 0xe38280,
+ /* e1 */ 0xe38281, 0xe38282, 0xe38283, 0xe38284,
+ /* e5 */ 0xe38285, 0xe38286, 0xe38287, 0xe38288,
+ /* e9 */ 0xe38289, 0xe3828a, 0xe3828b, 0xe3828c,
+ /* ed */ 0xe3828d, 0xe3828e, 0xe3828f, 0xe38290,
+ /* f1 */ 0xe38291, 0xe38292, 0xe38293, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a5xx - offset 0x002a4 ***/
+
+ /* a1 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* a5 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* a9 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* ad */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* b1 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* b5 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* b9 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* bd */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* c1 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* c5 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* c9 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* cd */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* d1 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* d5 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* d9 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* dd */ 0xe3839d, 0xe3839e, 0xe3839f, 0xe383a0,
+ /* e1 */ 0xe383a1, 0xe383a2, 0xe383a3, 0xe383a4,
+ /* e5 */ 0xe383a5, 0xe383a6, 0xe383a7, 0xe383a8,
+ /* e9 */ 0xe383a9, 0xe383aa, 0xe383ab, 0xe383ac,
+ /* ed */ 0xe383ad, 0xe383ae, 0xe383af, 0xe383b0,
+ /* f1 */ 0xe383b1, 0xe383b2, 0xe383b3, 0xe383b4,
+ /* f5 */ 0xe383b5, 0xe383b6, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x00302 ***/
+
+ /* a1 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* a5 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* a9 */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* ad */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* b1 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* b5 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* c5 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* c9 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* cd */ 0x00cebd, 0x00cebe, 0x00cebf, 0x00cf80,
+ /* d1 */ 0x00cf81, 0x00cf83, 0x00cf84, 0x00cf85,
+ /* d5 */ 0x00cf86, 0x00cf87, 0x00cf88, 0x00cf89,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a7xx - offset 0x00360 ***/
+
+ /* a1 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* a5 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* a9 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* ad */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* b1 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* b5 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* b9 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* bd */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* c1 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d5 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d9 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* dd */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* e1 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* e5 */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e9 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* ed */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* f1 */ 0x00d18f, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a8xx - offset 0x003be ***/
+
+ /* a1 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* a5 */ 0xe29498, 0xe29494, 0xe2949c, 0xe294ac,
+ /* a9 */ 0xe294a4, 0xe294b4, 0xe294bc, 0xe29481,
+ /* ad */ 0xe29483, 0xe2948f, 0xe29493, 0xe2949b,
+ /* b1 */ 0xe29497, 0xe294a3, 0xe294b3, 0xe294ab,
+ /* b5 */ 0xe294bb, 0xe2958b, 0xe294a0, 0xe294af,
+ /* b9 */ 0xe294a8, 0xe294b7, 0xe294bf, 0xe2949d,
+ /* bd */ 0xe294b0, 0xe294a5, 0xe294b8, 0xe29582,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: adxx - offset 0x0041c ***/
+
+ /* a1 */ 0xe291a0, 0xe291a1, 0xe291a2, 0xe291a3,
+ /* a5 */ 0xe291a4, 0xe291a5, 0xe291a6, 0xe291a7,
+ /* a9 */ 0xe291a8, 0xe291a9, 0xe291aa, 0xe291ab,
+ /* ad */ 0xe291ac, 0xe291ad, 0xe291ae, 0xe291af,
+ /* b1 */ 0xe291b0, 0xe291b1, 0xe291b2, 0xe291b3,
+ /* b5 */ 0xe285a0, 0xe285a1, 0xe285a2, 0xe285a3,
+ /* b9 */ 0xe285a4, 0xe285a5, 0xe285a6, 0xe285a7,
+ /* bd */ 0xe285a8, 0xe285a9, 0x000000, 0xe38d89,
+ /* c1 */ 0xe38c94, 0xe38ca2, 0xe38d8d, 0xe38c98,
+ /* c5 */ 0xe38ca7, 0xe38c83, 0xe38cb6, 0xe38d91,
+ /* c9 */ 0xe38d97, 0xe38c8d, 0xe38ca6, 0xe38ca3,
+ /* cd */ 0xe38cab, 0xe38d8a, 0xe38cbb, 0xe38e9c,
+ /* d1 */ 0xe38e9d, 0xe38e9e, 0xe38e8e, 0xe38e8f,
+ /* d5 */ 0xe38f84, 0xe38ea1, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0xe38dbb, 0xe3809d,
+ /* e1 */ 0xe3809f, 0xe28496, 0xe38f8d, 0xe284a1,
+ /* e5 */ 0xe38aa4, 0xe38aa5, 0xe38aa6, 0xe38aa7,
+ /* e9 */ 0xe38aa8, 0xe388b1, 0xe388b2, 0xe388b9,
+ /* ed */ 0xe38dbe, 0xe38dbd, 0xe38dbc, 0xe28992,
+ /* f1 */ 0xe289a1, 0xe288ab, 0xe288ae, 0xe28891,
+ /* f5 */ 0xe2889a, 0xe28aa5, 0xe288a0, 0xe2889f,
+ /* f9 */ 0xe28abf, 0xe288b5, 0xe288a9, 0xe288aa,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: b0xx - offset 0x0047a ***/
+
+ /* a1 */ 0xe4ba9c, 0xe59496, 0xe5a883, 0xe998bf,
+ /* a5 */ 0xe59380, 0xe6849b, 0xe68ca8, 0xe5a7b6,
+ /* a9 */ 0xe980a2, 0xe891b5, 0xe88c9c, 0xe7a990,
+ /* ad */ 0xe682aa, 0xe68fa1, 0xe6b8a5, 0xe697ad,
+ /* b1 */ 0xe891a6, 0xe88aa6, 0xe9afb5, 0xe6a293,
+ /* b5 */ 0xe59ca7, 0xe696a1, 0xe689b1, 0xe5ae9b,
+ /* b9 */ 0xe5a790, 0xe899bb, 0xe9a3b4, 0xe7b5a2,
+ /* bd */ 0xe7b6be, 0xe9ae8e, 0xe68896, 0xe7b29f,
+ /* c1 */ 0xe8a2b7, 0xe5ae89, 0xe5bab5, 0xe68c89,
+ /* c5 */ 0xe69a97, 0xe6a188, 0xe99787, 0xe99e8d,
+ /* c9 */ 0xe69d8f, 0xe4bba5, 0xe4bc8a, 0xe4bd8d,
+ /* cd */ 0xe4be9d, 0xe58189, 0xe59bb2, 0xe5a4b7,
+ /* d1 */ 0xe5a794, 0xe5a881, 0xe5b089, 0xe6839f,
+ /* d5 */ 0xe6848f, 0xe685b0, 0xe69893, 0xe6a485,
+ /* d9 */ 0xe782ba, 0xe7958f, 0xe795b0, 0xe7a7bb,
+ /* dd */ 0xe7b6ad, 0xe7b7af, 0xe88383, 0xe8908e,
+ /* e1 */ 0xe8a1a3, 0xe8ac82, 0xe98195, 0xe981ba,
+ /* e5 */ 0xe58cbb, 0xe4ba95, 0xe4baa5, 0xe59f9f,
+ /* e9 */ 0xe882b2, 0xe98381, 0xe7a3af, 0xe4b880,
+ /* ed */ 0xe5a3b1, 0xe6baa2, 0xe980b8, 0xe7a8b2,
+ /* f1 */ 0xe88ca8, 0xe88a8b, 0xe9b0af, 0xe58581,
+ /* f5 */ 0xe58db0, 0xe592bd, 0xe593a1, 0xe59ba0,
+ /* f9 */ 0xe5a7bb, 0xe5bc95, 0xe9a3b2, 0xe6b7ab,
+ /* fd */ 0xe883a4, 0xe894ad,
+
+ /*** Two byte table, leaf: b1xx - offset 0x004d8 ***/
+
+ /* a1 */ 0xe999a2, 0xe999b0, 0xe99aa0, 0xe99fbb,
+ /* a5 */ 0xe5908b, 0xe58fb3, 0xe5ae87, 0xe7838f,
+ /* a9 */ 0xe7bebd, 0xe8bf82, 0xe99ba8, 0xe58daf,
+ /* ad */ 0xe9b59c, 0xe7aaba, 0xe4b891, 0xe7a293,
+ /* b1 */ 0xe887bc, 0xe6b8a6, 0xe59898, 0xe59484,
+ /* b5 */ 0xe6ac9d, 0xe8949a, 0xe9b0bb, 0xe5a7a5,
+ /* b9 */ 0xe58ea9, 0xe6b5a6, 0xe7939c, 0xe9968f,
+ /* bd */ 0xe59982, 0xe4ba91, 0xe9818b, 0xe99bb2,
+ /* c1 */ 0xe88d8f, 0xe9a48c, 0xe58fa1, 0xe596b6,
+ /* c5 */ 0xe5acb0, 0xe5bdb1, 0xe698a0, 0xe69bb3,
+ /* c9 */ 0xe6a084, 0xe6b0b8, 0xe6b3b3, 0xe6b4a9,
+ /* cd */ 0xe7919b, 0xe79b88, 0xe7a98e, 0xe9a0b4,
+ /* d1 */ 0xe88bb1, 0xe8a19b, 0xe8a9a0, 0xe98bad,
+ /* d5 */ 0xe6b6b2, 0xe796ab, 0xe79b8a, 0xe9a785,
+ /* d9 */ 0xe682a6, 0xe8ac81, 0xe8b68a, 0xe996b2,
+ /* dd */ 0xe6a68e, 0xe58ead, 0xe58686, 0xe59c92,
+ /* e1 */ 0xe5a0b0, 0xe5a584, 0xe5aeb4, 0xe5bbb6,
+ /* e5 */ 0xe680a8, 0xe68ea9, 0xe68fb4, 0xe6b2bf,
+ /* e9 */ 0xe6bc94, 0xe7828e, 0xe78494, 0xe78599,
+ /* ed */ 0xe78795, 0xe78cbf, 0xe7b881, 0xe889b6,
+ /* f1 */ 0xe88b91, 0xe89697, 0xe981a0, 0xe9899b,
+ /* f5 */ 0xe9b49b, 0xe5a1a9, 0xe696bc, 0xe6b19a,
+ /* f9 */ 0xe794a5, 0xe587b9, 0xe5a4ae, 0xe5a5a5,
+ /* fd */ 0xe5be80, 0xe5bf9c,
+
+ /*** Two byte table, leaf: b2xx - offset 0x00536 ***/
+
+ /* a1 */ 0xe68abc, 0xe697ba, 0xe6a8aa, 0xe6aca7,
+ /* a5 */ 0xe6aeb4, 0xe78e8b, 0xe7bf81, 0xe8a596,
+ /* a9 */ 0xe9b4ac, 0xe9b48e, 0xe9bb84, 0xe5b2a1,
+ /* ad */ 0xe6b296, 0xe88dbb, 0xe58484, 0xe5b18b,
+ /* b1 */ 0xe686b6, 0xe88786, 0xe6a1b6, 0xe789a1,
+ /* b5 */ 0xe4b999, 0xe4bfba, 0xe58db8, 0xe681a9,
+ /* b9 */ 0xe6b8a9, 0xe7a98f, 0xe99fb3, 0xe4b88b,
+ /* bd */ 0xe58c96, 0xe4bbae, 0xe4bd95, 0xe4bcbd,
+ /* c1 */ 0xe4bea1, 0xe4bdb3, 0xe58aa0, 0xe58faf,
+ /* c5 */ 0xe59889, 0xe5a48f, 0xe5ab81, 0xe5aeb6,
+ /* c9 */ 0xe5afa1, 0xe7a791, 0xe69a87, 0xe69e9c,
+ /* cd */ 0xe69eb6, 0xe6ad8c, 0xe6b2b3, 0xe781ab,
+ /* d1 */ 0xe78f82, 0xe7a68d, 0xe7a6be, 0xe7a8bc,
+ /* d5 */ 0xe7ae87, 0xe88ab1, 0xe88b9b, 0xe88c84,
+ /* d9 */ 0xe88db7, 0xe88faf, 0xe88f93, 0xe89da6,
+ /* dd */ 0xe8aab2, 0xe598a9, 0xe8b2a8, 0xe8bfa6,
+ /* e1 */ 0xe9818e, 0xe99c9e, 0xe89a8a, 0xe4bf84,
+ /* e5 */ 0xe5b3a8, 0xe68891, 0xe78999, 0xe794bb,
+ /* e9 */ 0xe887a5, 0xe88abd, 0xe89bbe, 0xe8b380,
+ /* ed */ 0xe99b85, 0xe9a493, 0xe9a795, 0xe4bb8b,
+ /* f1 */ 0xe4bc9a, 0xe8a7a3, 0xe59b9e, 0xe5a18a,
+ /* f5 */ 0xe5a38a, 0xe5bbbb, 0xe5bfab, 0xe680aa,
+ /* f9 */ 0xe68294, 0xe681a2, 0xe68790, 0xe68892,
+ /* fd */ 0xe68b90, 0xe694b9,
+
+ /*** Two byte table, leaf: b3xx - offset 0x00594 ***/
+
+ /* a1 */ 0xe9ad81, 0xe699a6, 0xe6a2b0, 0xe6b5b7,
+ /* a5 */ 0xe781b0, 0xe7958c, 0xe79a86, 0xe7b5b5,
+ /* a9 */ 0xe88aa5, 0xe89fb9, 0xe9968b, 0xe99a8e,
+ /* ad */ 0xe8b29d, 0xe587b1, 0xe58abe, 0xe5a496,
+ /* b1 */ 0xe592b3, 0xe5aeb3, 0xe5b496, 0xe685a8,
+ /* b5 */ 0xe6a682, 0xe6b6af, 0xe7a28d, 0xe8938b,
+ /* b9 */ 0xe8a197, 0xe8a9b2, 0xe98ea7, 0xe9aab8,
+ /* bd */ 0xe6b5ac, 0xe9a6a8, 0xe89b99, 0xe59ea3,
+ /* c1 */ 0xe69fbf, 0xe89b8e, 0xe9888e, 0xe58a83,
+ /* c5 */ 0xe59a87, 0xe59084, 0xe5bb93, 0xe68ba1,
+ /* c9 */ 0xe692b9, 0xe6a0bc, 0xe6a0b8, 0xe6aebb,
+ /* cd */ 0xe78db2, 0xe7a2ba, 0xe7a9ab, 0xe8a69a,
+ /* d1 */ 0xe8a792, 0xe8b5ab, 0xe8bc83, 0xe983ad,
+ /* d5 */ 0xe996a3, 0xe99a94, 0xe99da9, 0xe5ada6,
+ /* d9 */ 0xe5b2b3, 0xe6a5bd, 0xe9a18d, 0xe9a18e,
+ /* dd */ 0xe68e9b, 0xe7aca0, 0xe6a8ab, 0xe6a9bf,
+ /* e1 */ 0xe6a2b6, 0xe9b08d, 0xe6bd9f, 0xe589b2,
+ /* e5 */ 0xe5969d, 0xe681b0, 0xe68bac, 0xe6b4bb,
+ /* e9 */ 0xe6b887, 0xe6bb91, 0xe8919b, 0xe8a490,
+ /* ed */ 0xe8bd84, 0xe4b894, 0xe9b0b9, 0xe58fb6,
+ /* f1 */ 0xe6a49b, 0xe6a8ba, 0xe99e84, 0xe6a0aa,
+ /* f5 */ 0xe5859c, 0xe7ab83, 0xe892b2, 0xe9879c,
+ /* f9 */ 0xe98e8c, 0xe5999b, 0xe9b4a8, 0xe6a0a2,
+ /* fd */ 0xe88c85, 0xe890b1,
+
+ /*** Two byte table, leaf: b4xx - offset 0x005f2 ***/
+
+ /* a1 */ 0xe7b2a5, 0xe58888, 0xe88b85, 0xe793a6,
+ /* a5 */ 0xe4b9be, 0xe4be83, 0xe586a0, 0xe5af92,
+ /* a9 */ 0xe5888a, 0xe58b98, 0xe58ba7, 0xe5b7bb,
+ /* ad */ 0xe5969a, 0xe5a0aa, 0xe5a7a6, 0xe5ae8c,
+ /* b1 */ 0xe5ae98, 0xe5af9b, 0xe5b9b2, 0xe5b9b9,
+ /* b5 */ 0xe682a3, 0xe6849f, 0xe685a3, 0xe686be,
+ /* b9 */ 0xe68f9b, 0xe695a2, 0xe69f91, 0xe6a193,
+ /* bd */ 0xe6a3ba, 0xe6acbe, 0xe6ad93, 0xe6b197,
+ /* c1 */ 0xe6bca2, 0xe6be97, 0xe6bd85, 0xe792b0,
+ /* c5 */ 0xe79498, 0xe79ba3, 0xe79c8b, 0xe7abbf,
+ /* c9 */ 0xe7aea1, 0xe7b0a1, 0xe7b7a9, 0xe7bcb6,
+ /* cd */ 0xe7bfb0, 0xe8829d, 0xe889a6, 0xe88e9e,
+ /* d1 */ 0xe8a6b3, 0xe8ab8c, 0xe8b2ab, 0xe98284,
+ /* d5 */ 0xe99191, 0xe99693, 0xe99691, 0xe996a2,
+ /* d9 */ 0xe999a5, 0xe99f93, 0xe9a4a8, 0xe88898,
+ /* dd */ 0xe4b8b8, 0xe590ab, 0xe5b2b8, 0xe5b78c,
+ /* e1 */ 0xe78ea9, 0xe7998c, 0xe79cbc, 0xe5b2a9,
+ /* e5 */ 0xe7bfab, 0xe8b48b, 0xe99b81, 0xe9a091,
+ /* e9 */ 0xe9a194, 0xe9a198, 0xe4bc81, 0xe4bc8e,
+ /* ed */ 0xe58db1, 0xe5969c, 0xe599a8, 0xe59fba,
+ /* f1 */ 0xe5a587, 0xe5ac89, 0xe5af84, 0xe5b290,
+ /* f5 */ 0xe5b88c, 0xe5b9be, 0xe5bf8c, 0xe68fae,
+ /* f9 */ 0xe69cba, 0xe69797, 0xe697a2, 0xe69c9f,
+ /* fd */ 0xe6a38b, 0xe6a384,
+
+ /*** Two byte table, leaf: b5xx - offset 0x00650 ***/
+
+ /* a1 */ 0xe6a99f, 0xe5b8b0, 0xe6af85, 0xe6b097,
+ /* a5 */ 0xe6b1bd, 0xe795bf, 0xe7a588, 0xe5ada3,
+ /* a9 */ 0xe7a880, 0xe7b480, 0xe5bebd, 0xe8a68f,
+ /* ad */ 0xe8a898, 0xe8b2b4, 0xe8b5b7, 0xe8bb8c,
+ /* b1 */ 0xe8bc9d, 0xe9a3a2, 0xe9a88e, 0xe9acbc,
+ /* b5 */ 0xe4ba80, 0xe581bd, 0xe58480, 0xe5a693,
+ /* b9 */ 0xe5ae9c, 0xe688af, 0xe68a80, 0xe693ac,
+ /* bd */ 0xe6acba, 0xe78aa0, 0xe79691, 0xe7a587,
+ /* c1 */ 0xe7bea9, 0xe89fbb, 0xe8aabc, 0xe8adb0,
+ /* c5 */ 0xe68eac, 0xe88f8a, 0xe99ea0, 0xe59089,
+ /* c9 */ 0xe59083, 0xe596ab, 0xe6a194, 0xe6a998,
+ /* cd */ 0xe8a9b0, 0xe7a0a7, 0xe69db5, 0xe9bb8d,
+ /* d1 */ 0xe58db4, 0xe5aea2, 0xe8849a, 0xe89990,
+ /* d5 */ 0xe98086, 0xe4b898, 0xe4b985, 0xe4bb87,
+ /* d9 */ 0xe4bc91, 0xe58f8a, 0xe590b8, 0xe5aeae,
+ /* dd */ 0xe5bc93, 0xe680a5, 0xe69591, 0xe69cbd,
+ /* e1 */ 0xe6b182, 0xe6b1b2, 0xe6b3a3, 0xe781b8,
+ /* e5 */ 0xe79083, 0xe7a9b6, 0xe7aaae, 0xe7ac88,
+ /* e9 */ 0xe7b49a, 0xe7b3be, 0xe7b5a6, 0xe697a7,
+ /* ed */ 0xe7899b, 0xe58ebb, 0xe5b185, 0xe5b7a8,
+ /* f1 */ 0xe68b92, 0xe68ba0, 0xe68c99, 0xe6b8a0,
+ /* f5 */ 0xe8999a, 0xe8a8b1, 0xe8b79d, 0xe98bb8,
+ /* f9 */ 0xe6bc81, 0xe7a6a6, 0xe9ad9a, 0xe4baa8,
+ /* fd */ 0xe4baab, 0xe4baac,
+
+ /*** Two byte table, leaf: b6xx - offset 0x006ae ***/
+
+ /* a1 */ 0xe4be9b, 0xe4bea0, 0xe58391, 0xe58587,
+ /* a5 */ 0xe7abb6, 0xe585b1, 0xe587b6, 0xe58d94,
+ /* a9 */ 0xe58ca1, 0xe58dbf, 0xe58fab, 0xe596ac,
+ /* ad */ 0xe5a283, 0xe5b3a1, 0xe5bcb7, 0xe5bd8a,
+ /* b1 */ 0xe680af, 0xe68190, 0xe681ad, 0xe68c9f,
+ /* b5 */ 0xe69599, 0xe6a98b, 0xe6b381, 0xe78b82,
+ /* b9 */ 0xe78bad, 0xe79faf, 0xe883b8, 0xe88485,
+ /* bd */ 0xe88888, 0xe8958e, 0xe983b7, 0xe98fa1,
+ /* c1 */ 0xe99fbf, 0xe9a597, 0xe9a99a, 0xe4bbb0,
+ /* c5 */ 0xe5879d, 0xe5b0ad, 0xe69a81, 0xe6a5ad,
+ /* c9 */ 0xe5b180, 0xe69bb2, 0xe6a5b5, 0xe78e89,
+ /* cd */ 0xe6a190, 0xe7b281, 0xe58385, 0xe58ba4,
+ /* d1 */ 0xe59d87, 0xe5b7be, 0xe98ca6, 0xe696a4,
+ /* d5 */ 0xe6aca3, 0xe6acbd, 0xe790b4, 0xe7a681,
+ /* d9 */ 0xe7a6bd, 0xe7ad8b, 0xe7b78a, 0xe88ab9,
+ /* dd */ 0xe88f8c, 0xe8a1bf, 0xe8a59f, 0xe8acb9,
+ /* e1 */ 0xe8bf91, 0xe98791, 0xe5909f, 0xe98a80,
+ /* e5 */ 0xe4b99d, 0xe580b6, 0xe58fa5, 0xe58cba,
+ /* e9 */ 0xe78b97, 0xe78e96, 0xe79fa9, 0xe88ba6,
+ /* ed */ 0xe8baaf, 0xe9a786, 0xe9a788, 0xe9a792,
+ /* f1 */ 0xe585b7, 0xe6849a, 0xe8999e, 0xe596b0,
+ /* f5 */ 0xe7a9ba, 0xe581b6, 0xe5af93, 0xe98187,
+ /* f9 */ 0xe99a85, 0xe4b8b2, 0xe6ab9b, 0xe987a7,
+ /* fd */ 0xe5b191, 0xe5b188,
+
+ /*** Two byte table, leaf: b7xx - offset 0x0070c ***/
+
+ /* a1 */ 0xe68e98, 0xe7aa9f, 0xe6b293, 0xe99db4,
+ /* a5 */ 0xe8bda1, 0xe7aaaa, 0xe7868a, 0xe99a88,
+ /* a9 */ 0xe7b282, 0xe6a097, 0xe7b9b0, 0xe6a191,
+ /* ad */ 0xe98dac, 0xe58bb2, 0xe5909b, 0xe896ab,
+ /* b1 */ 0xe8a893, 0xe7bea4, 0xe8bb8d, 0xe983a1,
+ /* b5 */ 0xe58da6, 0xe8a288, 0xe7a581, 0xe4bf82,
+ /* b9 */ 0xe582be, 0xe58891, 0xe58584, 0xe59593,
+ /* bd */ 0xe59cad, 0xe78faa, 0xe59e8b, 0xe5a591,
+ /* c1 */ 0xe5bda2, 0xe5be84, 0xe681b5, 0xe685b6,
+ /* c5 */ 0xe685a7, 0xe686a9, 0xe68eb2, 0xe690ba,
+ /* c9 */ 0xe695ac, 0xe699af, 0xe6a182, 0xe6b893,
+ /* cd */ 0xe795a6, 0xe7a8bd, 0xe7b3bb, 0xe7b58c,
+ /* d1 */ 0xe7b699, 0xe7b98b, 0xe7bdab, 0xe88c8e,
+ /* d5 */ 0xe88d8a, 0xe89b8d, 0xe8a888, 0xe8a9a3,
+ /* d9 */ 0xe8ada6, 0xe8bbbd, 0xe9a09a, 0xe9b68f,
+ /* dd */ 0xe88ab8, 0xe8bf8e, 0xe9afa8, 0xe58a87,
+ /* e1 */ 0xe6889f, 0xe69283, 0xe6bf80, 0xe99a99,
+ /* e5 */ 0xe6a181, 0xe58291, 0xe6aca0, 0xe6b1ba,
+ /* e9 */ 0xe6bd94, 0xe7a9b4, 0xe7b590, 0xe8a180,
+ /* ed */ 0xe8a8a3, 0xe69c88, 0xe4bbb6, 0xe580b9,
+ /* f1 */ 0xe580a6, 0xe581a5, 0xe585bc, 0xe588b8,
+ /* f5 */ 0xe589a3, 0xe596a7, 0xe59c8f, 0xe5a085,
+ /* f9 */ 0xe5ab8c, 0xe5bbba, 0xe686b2, 0xe687b8,
+ /* fd */ 0xe68bb3, 0xe68db2,
+
+ /*** Two byte table, leaf: b8xx - offset 0x0076a ***/
+
+ /* a1 */ 0xe6a49c, 0xe6a8a9, 0xe789bd, 0xe78aac,
+ /* a5 */ 0xe78cae, 0xe7a094, 0xe7a1af, 0xe7b5b9,
+ /* a9 */ 0xe79c8c, 0xe882a9, 0xe8a68b, 0xe8ac99,
+ /* ad */ 0xe8b3a2, 0xe8bb92, 0xe981a3, 0xe98db5,
+ /* b1 */ 0xe999ba, 0xe9a195, 0xe9a893, 0xe9b9b8,
+ /* b5 */ 0xe58583, 0xe58e9f, 0xe58eb3, 0xe5b9bb,
+ /* b9 */ 0xe5bca6, 0xe6b89b, 0xe6ba90, 0xe78e84,
+ /* bd */ 0xe78fbe, 0xe7b583, 0xe888b7, 0xe8a880,
+ /* c1 */ 0xe8abba, 0xe99990, 0xe4b98e, 0xe5808b,
+ /* c5 */ 0xe58fa4, 0xe591bc, 0xe59bba, 0xe5a791,
+ /* c9 */ 0xe5ada4, 0xe5b7b1, 0xe5baab, 0xe5bca7,
+ /* cd */ 0xe688b8, 0xe69585, 0xe69eaf, 0xe6b996,
+ /* d1 */ 0xe78b90, 0xe7b38a, 0xe8a2b4, 0xe882a1,
+ /* d5 */ 0xe883a1, 0xe88fb0, 0xe8998e, 0xe8aa87,
+ /* d9 */ 0xe8b7a8, 0xe988b7, 0xe99b87, 0xe9a1a7,
+ /* dd */ 0xe9bc93, 0xe4ba94, 0xe4ba92, 0xe4bc8d,
+ /* e1 */ 0xe58d88, 0xe59189, 0xe590be, 0xe5a8af,
+ /* e5 */ 0xe5be8c, 0xe5bea1, 0xe6829f, 0xe6a2a7,
+ /* e9 */ 0xe6aa8e, 0xe7919a, 0xe7a281, 0xe8aa9e,
+ /* ed */ 0xe8aaa4, 0xe8adb7, 0xe98690, 0xe4b99e,
+ /* f1 */ 0xe9af89, 0xe4baa4, 0xe4bdbc, 0xe4beaf,
+ /* f5 */ 0xe58099, 0xe58096, 0xe58589, 0xe585ac,
+ /* f9 */ 0xe58a9f, 0xe58ab9, 0xe58bbe, 0xe58e9a,
+ /* fd */ 0xe58fa3, 0xe59091,
+
+ /*** Two byte table, leaf: b9xx - offset 0x007c8 ***/
+
+ /* a1 */ 0xe5908e, 0xe59689, 0xe59d91, 0xe59ea2,
+ /* a5 */ 0xe5a5bd, 0xe5ad94, 0xe5ad9d, 0xe5ae8f,
+ /* a9 */ 0xe5b7a5, 0xe5b7a7, 0xe5b7b7, 0xe5b9b8,
+ /* ad */ 0xe5ba83, 0xe5ba9a, 0xe5bab7, 0xe5bc98,
+ /* b1 */ 0xe68192, 0xe6858c, 0xe68a97, 0xe68b98,
+ /* b5 */ 0xe68ea7, 0xe694bb, 0xe69882, 0xe69983,
+ /* b9 */ 0xe69bb4, 0xe69dad, 0xe6a0a1, 0xe6a297,
+ /* bd */ 0xe6a78b, 0xe6b19f, 0xe6b4aa, 0xe6b5a9,
+ /* c1 */ 0xe6b8af, 0xe6ba9d, 0xe794b2, 0xe79a87,
+ /* c5 */ 0xe7a1ac, 0xe7a8bf, 0xe7b3a0, 0xe7b485,
+ /* c9 */ 0xe7b498, 0xe7b59e, 0xe7b6b1, 0xe88095,
+ /* cd */ 0xe88083, 0xe882af, 0xe882b1, 0xe88594,
+ /* d1 */ 0xe8868f, 0xe888aa, 0xe88d92, 0xe8a18c,
+ /* d5 */ 0xe8a1a1, 0xe8ac9b, 0xe8b2a2, 0xe8b3bc,
+ /* d9 */ 0xe9838a, 0xe985b5, 0xe989b1, 0xe7a0bf,
+ /* dd */ 0xe98bbc, 0xe996a4, 0xe9998d, 0xe9a085,
+ /* e1 */ 0xe9a699, 0xe9ab98, 0xe9b4bb, 0xe5899b,
+ /* e5 */ 0xe58aab, 0xe58fb7, 0xe59088, 0xe5a395,
+ /* e9 */ 0xe68bb7, 0xe6bfa0, 0xe8b1aa, 0xe8bd9f,
+ /* ed */ 0xe9bab9, 0xe5858b, 0xe588bb, 0xe5918a,
+ /* f1 */ 0xe59bbd, 0xe7a980, 0xe985b7, 0xe9b5a0,
+ /* f5 */ 0xe9bb92, 0xe78d84, 0xe6bc89, 0xe885b0,
+ /* f9 */ 0xe79491, 0xe5bfbd, 0xe6839a, 0xe9aaa8,
+ /* fd */ 0xe78b9b, 0xe8bebc,
+
+ /*** Two byte table, leaf: baxx - offset 0x00826 ***/
+
+ /* a1 */ 0xe6ada4, 0xe9a083, 0xe4bb8a, 0xe59bb0,
+ /* a5 */ 0xe59da4, 0xe5a2be, 0xe5a99a, 0xe681a8,
+ /* a9 */ 0xe68787, 0xe6988f, 0xe69886, 0xe6a0b9,
+ /* ad */ 0xe6a2b1, 0xe6b7b7, 0xe79795, 0xe7b4ba,
+ /* b1 */ 0xe889ae, 0xe9ad82, 0xe4ba9b, 0xe4bd90,
+ /* b5 */ 0xe58f89, 0xe59486, 0xe5b5af, 0xe5b7a6,
+ /* b9 */ 0xe5b7ae, 0xe69fbb, 0xe6b299, 0xe791b3,
+ /* bd */ 0xe7a082, 0xe8a990, 0xe98e96, 0xe8a39f,
+ /* c1 */ 0xe59d90, 0xe5baa7, 0xe68cab, 0xe582b5,
+ /* c5 */ 0xe582ac, 0xe5868d, 0xe69c80, 0xe59389,
+ /* c9 */ 0xe5a19e, 0xe5a6bb, 0xe5aeb0, 0xe5bda9,
+ /* cd */ 0xe6898d, 0xe68ea1, 0xe6a0bd, 0xe6adb3,
+ /* d1 */ 0xe6b888, 0xe781bd, 0xe98787, 0xe78a80,
+ /* d5 */ 0xe7a095, 0xe7a0a6, 0xe7a5ad, 0xe6968e,
+ /* d9 */ 0xe7b4b0, 0xe88f9c, 0xe8a381, 0xe8bc89,
+ /* dd */ 0xe99a9b, 0xe589a4, 0xe59ca8, 0xe69d90,
+ /* e1 */ 0xe7bdaa, 0xe8b2a1, 0xe586b4, 0xe59d82,
+ /* e5 */ 0xe998aa, 0xe5a0ba, 0xe6a68a, 0xe882b4,
+ /* e9 */ 0xe592b2, 0xe5b48e, 0xe59fbc, 0xe7a295,
+ /* ed */ 0xe9b7ba, 0xe4bd9c, 0xe5898a, 0xe5928b,
+ /* f1 */ 0xe690be, 0xe698a8, 0xe69c94, 0xe69fb5,
+ /* f5 */ 0xe7aa84, 0xe7ad96, 0xe7b4a2, 0xe98caf,
+ /* f9 */ 0xe6a19c, 0xe9aead, 0xe7acb9, 0xe58c99,
+ /* fd */ 0xe5868a, 0xe588b7,
+
+ /*** Two byte table, leaf: bbxx - offset 0x00884 ***/
+
+ /* a1 */ 0xe5af9f, 0xe68bb6, 0xe692ae, 0xe693a6,
+ /* a5 */ 0xe69cad, 0xe6aeba, 0xe896a9, 0xe99b91,
+ /* a9 */ 0xe79a90, 0xe9af96, 0xe68d8c, 0xe98c86,
+ /* ad */ 0xe9aeab, 0xe79abf, 0xe69992, 0xe4b889,
+ /* b1 */ 0xe58298, 0xe58f82, 0xe5b1b1, 0xe683a8,
+ /* b5 */ 0xe69292, 0xe695a3, 0xe6a19f, 0xe787a6,
+ /* b9 */ 0xe78f8a, 0xe794a3, 0xe7ae97, 0xe7ba82,
+ /* bd */ 0xe89a95, 0xe8ae83, 0xe8b39b, 0xe985b8,
+ /* c1 */ 0xe9a490, 0xe696ac, 0xe69aab, 0xe6ae8b,
+ /* c5 */ 0xe4bb95, 0xe4bb94, 0xe4bcba, 0xe4bdbf,
+ /* c9 */ 0xe588ba, 0xe58fb8, 0xe58fb2, 0xe597a3,
+ /* cd */ 0xe59b9b, 0xe5a3ab, 0xe5a78b, 0xe5a789,
+ /* d1 */ 0xe5a7bf, 0xe5ad90, 0xe5b18d, 0xe5b882,
+ /* d5 */ 0xe5b8ab, 0xe5bf97, 0xe6809d, 0xe68c87,
+ /* d9 */ 0xe694af, 0xe5ad9c, 0xe696af, 0xe696bd,
+ /* dd */ 0xe697a8, 0xe69e9d, 0xe6ada2, 0xe6adbb,
+ /* e1 */ 0xe6b08f, 0xe78d85, 0xe7a589, 0xe7a781,
+ /* e5 */ 0xe7b3b8, 0xe7b499, 0xe7b4ab, 0xe882a2,
+ /* e9 */ 0xe88482, 0xe887b3, 0xe8a696, 0xe8a99e,
+ /* ed */ 0xe8a9a9, 0xe8a9a6, 0xe8aa8c, 0xe8abae,
+ /* f1 */ 0xe8b387, 0xe8b39c, 0xe99b8c, 0xe9a3bc,
+ /* f5 */ 0xe6adaf, 0xe4ba8b, 0xe4bcbc, 0xe4be8d,
+ /* f9 */ 0xe58590, 0xe5ad97, 0xe5afba, 0xe68588,
+ /* fd */ 0xe68c81, 0xe69982,
+
+ /*** Two byte table, leaf: bcxx - offset 0x008e2 ***/
+
+ /* a1 */ 0xe6aca1, 0xe6bb8b, 0xe6b2bb, 0xe788be,
+ /* a5 */ 0xe792bd, 0xe79794, 0xe7a381, 0xe7a4ba,
+ /* a9 */ 0xe8808c, 0xe880b3, 0xe887aa, 0xe89294,
+ /* ad */ 0xe8be9e, 0xe6b190, 0xe9b9bf, 0xe5bc8f,
+ /* b1 */ 0xe8ad98, 0xe9b4ab, 0xe7abba, 0xe8bbb8,
+ /* b5 */ 0xe5ae8d, 0xe99bab, 0xe4b883, 0xe58fb1,
+ /* b9 */ 0xe59fb7, 0xe5a4b1, 0xe5ab89, 0xe5aea4,
+ /* bd */ 0xe68289, 0xe6b9bf, 0xe6bc86, 0xe796be,
+ /* c1 */ 0xe8b3aa, 0xe5ae9f, 0xe89480, 0xe7afa0,
+ /* c5 */ 0xe581b2, 0xe69fb4, 0xe88a9d, 0xe5b1a1,
+ /* c9 */ 0xe8958a, 0xe7b89e, 0xe8888e, 0xe58699,
+ /* cd */ 0xe5b084, 0xe68da8, 0xe8b5a6, 0xe6969c,
+ /* d1 */ 0xe785ae, 0xe7a4be, 0xe7b497, 0xe88085,
+ /* d5 */ 0xe8ac9d, 0xe8bb8a, 0xe981ae, 0xe89b87,
+ /* d9 */ 0xe982aa, 0xe5809f, 0xe58bba, 0xe5b0ba,
+ /* dd */ 0xe69d93, 0xe781bc, 0xe788b5, 0xe9858c,
+ /* e1 */ 0xe98788, 0xe98cab, 0xe88ba5, 0xe5af82,
+ /* e5 */ 0xe5bcb1, 0xe683b9, 0xe4b8bb, 0xe58f96,
+ /* e9 */ 0xe5ae88, 0xe6898b, 0xe69cb1, 0xe6ae8a,
+ /* ed */ 0xe78ba9, 0xe78fa0, 0xe7a8ae, 0xe885ab,
+ /* f1 */ 0xe8b6a3, 0xe98592, 0xe9a696, 0xe58492,
+ /* f5 */ 0xe58f97, 0xe591aa, 0xe5afbf, 0xe68e88,
+ /* f9 */ 0xe6a8b9, 0xe7b6ac, 0xe99c80, 0xe59b9a,
+ /* fd */ 0xe58f8e, 0xe591a8,
+
+ /*** Two byte table, leaf: bdxx - offset 0x00940 ***/
+
+ /* a1 */ 0xe5ae97, 0xe5b0b1, 0xe5b79e, 0xe4bfae,
+ /* a5 */ 0xe68481, 0xe68bbe, 0xe6b4b2, 0xe7a780,
+ /* a9 */ 0xe7a78b, 0xe7b582, 0xe7b98d, 0xe7bf92,
+ /* ad */ 0xe887ad, 0xe8889f, 0xe89290, 0xe8a186,
+ /* b1 */ 0xe8a5b2, 0xe8ae90, 0xe8b9b4, 0xe8bcaf,
+ /* b5 */ 0xe980b1, 0xe9858b, 0xe985ac, 0xe99b86,
+ /* b9 */ 0xe9869c, 0xe4bb80, 0xe4bd8f, 0xe58585,
+ /* bd */ 0xe58d81, 0xe5be93, 0xe6888e, 0xe69f94,
+ /* c1 */ 0xe6b181, 0xe6b88b, 0xe78da3, 0xe7b8a6,
+ /* c5 */ 0xe9878d, 0xe98a83, 0xe58f94, 0xe5a499,
+ /* c9 */ 0xe5aebf, 0xe6b791, 0xe7a59d, 0xe7b8ae,
+ /* cd */ 0xe7b29b, 0xe5a1be, 0xe7869f, 0xe587ba,
+ /* d1 */ 0xe8a193, 0xe8bfb0, 0xe4bf8a, 0xe5b3bb,
+ /* d5 */ 0xe698a5, 0xe79eac, 0xe7aba3, 0xe8889c,
+ /* d9 */ 0xe9a7bf, 0xe58786, 0xe5beaa, 0xe697ac,
+ /* dd */ 0xe6a5af, 0xe6ae89, 0xe6b7b3, 0xe6ba96,
+ /* e1 */ 0xe6bda4, 0xe79bbe, 0xe7b494, 0xe5b7a1,
+ /* e5 */ 0xe981b5, 0xe98687, 0xe9a086, 0xe587a6,
+ /* e9 */ 0xe5889d, 0xe68980, 0xe69a91, 0xe69b99,
+ /* ed */ 0xe6b89a, 0xe5bab6, 0xe7b792, 0xe7bdb2,
+ /* f1 */ 0xe69bb8, 0xe896af, 0xe897b7, 0xe8abb8,
+ /* f5 */ 0xe58aa9, 0xe58f99, 0xe5a5b3, 0xe5ba8f,
+ /* f9 */ 0xe5be90, 0xe68195, 0xe98ba4, 0xe999a4,
+ /* fd */ 0xe582b7, 0xe5849f,
+
+ /*** Two byte table, leaf: bexx - offset 0x0099e ***/
+
+ /* a1 */ 0xe58b9d, 0xe58ca0, 0xe58d87, 0xe58fac,
+ /* a5 */ 0xe593a8, 0xe59586, 0xe594b1, 0xe59897,
+ /* a9 */ 0xe5a5a8, 0xe5a6be, 0xe5a8bc, 0xe5aeb5,
+ /* ad */ 0xe5b086, 0xe5b08f, 0xe5b091, 0xe5b09a,
+ /* b1 */ 0xe5ba84, 0xe5ba8a, 0xe5bba0, 0xe5bdb0,
+ /* b5 */ 0xe689bf, 0xe68a84, 0xe68b9b, 0xe68e8c,
+ /* b9 */ 0xe68db7, 0xe69887, 0xe6988c, 0xe698ad,
+ /* bd */ 0xe699b6, 0xe69dbe, 0xe6a2a2, 0xe6a89f,
+ /* c1 */ 0xe6a8b5, 0xe6b2bc, 0xe6b688, 0xe6b889,
+ /* c5 */ 0xe6b998, 0xe784bc, 0xe784a6, 0xe785a7,
+ /* c9 */ 0xe79787, 0xe79c81, 0xe7a19d, 0xe7a481,
+ /* cd */ 0xe7a5a5, 0xe7a7b0, 0xe7aba0, 0xe7ac91,
+ /* d1 */ 0xe7b2a7, 0xe7b4b9, 0xe88296, 0xe88f96,
+ /* d5 */ 0xe8928b, 0xe89589, 0xe8a19d, 0xe8a3b3,
+ /* d9 */ 0xe8a89f, 0xe8a8bc, 0xe8a994, 0xe8a9b3,
+ /* dd */ 0xe8b1a1, 0xe8b39e, 0xe986a4, 0xe989a6,
+ /* e1 */ 0xe98dbe, 0xe99098, 0xe99a9c, 0xe99e98,
+ /* e5 */ 0xe4b88a, 0xe4b888, 0xe4b89e, 0xe4b997,
+ /* e9 */ 0xe58697, 0xe589b0, 0xe59f8e, 0xe5a0b4,
+ /* ed */ 0xe5a38c, 0xe5aca2, 0xe5b8b8, 0xe68385,
+ /* f1 */ 0xe693be, 0xe69da1, 0xe69d96, 0xe6b584,
+ /* f5 */ 0xe78ab6, 0xe795b3, 0xe7a9a3, 0xe892b8,
+ /* f9 */ 0xe8adb2, 0xe986b8, 0xe98ca0, 0xe598b1,
+ /* fd */ 0xe59fb4, 0xe9a3be,
+
+ /*** Two byte table, leaf: bfxx - offset 0x009fc ***/
+
+ /* a1 */ 0xe68bad, 0xe6a48d, 0xe6ae96, 0xe787ad,
+ /* a5 */ 0xe7b994, 0xe881b7, 0xe889b2, 0xe8a7a6,
+ /* a9 */ 0xe9a39f, 0xe89d95, 0xe8beb1, 0xe5b0bb,
+ /* ad */ 0xe4bcb8, 0xe4bfa1, 0xe4beb5, 0xe59487,
+ /* b1 */ 0xe5a8a0, 0xe5af9d, 0xe5afa9, 0xe5bf83,
+ /* b5 */ 0xe6858e, 0xe68caf, 0xe696b0, 0xe6998b,
+ /* b9 */ 0xe6a3ae, 0xe6a69b, 0xe6b5b8, 0xe6b7b1,
+ /* bd */ 0xe794b3, 0xe796b9, 0xe79c9f, 0xe7a59e,
+ /* c1 */ 0xe7a7a6, 0xe7b4b3, 0xe887a3, 0xe88aaf,
+ /* c5 */ 0xe896aa, 0xe8a6aa, 0xe8a8ba, 0xe8baab,
+ /* c9 */ 0xe8be9b, 0xe980b2, 0xe9879d, 0xe99c87,
+ /* cd */ 0xe4baba, 0xe4bb81, 0xe58883, 0xe5a1b5,
+ /* d1 */ 0xe5a3ac, 0xe5b08b, 0xe7949a, 0xe5b0bd,
+ /* d5 */ 0xe8858e, 0xe8a88a, 0xe8bf85, 0xe999a3,
+ /* d9 */ 0xe99dad, 0xe7aca5, 0xe8ab8f, 0xe9a088,
+ /* dd */ 0xe985a2, 0xe59bb3, 0xe58ea8, 0xe98097,
+ /* e1 */ 0xe590b9, 0xe59e82, 0xe5b8a5, 0xe68ea8,
+ /* e5 */ 0xe6b0b4, 0xe7828a, 0xe79da1, 0xe7b28b,
+ /* e9 */ 0xe7bfa0, 0xe8a1b0, 0xe98182, 0xe98594,
+ /* ed */ 0xe98c90, 0xe98c98, 0xe99a8f, 0xe7919e,
+ /* f1 */ 0xe9ab84, 0xe5b487, 0xe5b5a9, 0xe695b0,
+ /* f5 */ 0xe69ea2, 0xe8b6a8, 0xe99b9b, 0xe68dae,
+ /* f9 */ 0xe69d89, 0xe6a499, 0xe88f85, 0xe9a097,
+ /* fd */ 0xe99b80, 0xe8a3be,
+
+ /*** Two byte table, leaf: c0xx - offset 0x00a5a ***/
+
+ /* a1 */ 0xe6be84, 0xe691ba, 0xe5afb8, 0xe4b896,
+ /* a5 */ 0xe780ac, 0xe7959d, 0xe698af, 0xe58784,
+ /* a9 */ 0xe588b6, 0xe58ba2, 0xe5a793, 0xe5be81,
+ /* ad */ 0xe680a7, 0xe68890, 0xe694bf, 0xe695b4,
+ /* b1 */ 0xe6989f, 0xe699b4, 0xe6a3b2, 0xe6a096,
+ /* b5 */ 0xe6ada3, 0xe6b885, 0xe789b2, 0xe7949f,
+ /* b9 */ 0xe79b9b, 0xe7b2be, 0xe88196, 0xe5a3b0,
+ /* bd */ 0xe8a3bd, 0xe8a5bf, 0xe8aaa0, 0xe8aa93,
+ /* c1 */ 0xe8ab8b, 0xe9809d, 0xe98692, 0xe99d92,
+ /* c5 */ 0xe99d99, 0xe69689, 0xe7a88e, 0xe88486,
+ /* c9 */ 0xe99abb, 0xe5b8ad, 0xe6839c, 0xe6889a,
+ /* cd */ 0xe696a5, 0xe69894, 0xe69e90, 0xe79fb3,
+ /* d1 */ 0xe7a98d, 0xe7b18d, 0xe7b8be, 0xe8848a,
+ /* d5 */ 0xe8b2ac, 0xe8b5a4, 0xe8b7a1, 0xe8b99f,
+ /* d9 */ 0xe7a2a9, 0xe58887, 0xe68b99, 0xe68ea5,
+ /* dd */ 0xe69182, 0xe68a98, 0xe8a8ad, 0xe7aa83,
+ /* e1 */ 0xe7af80, 0xe8aaac, 0xe99baa, 0xe7b5b6,
+ /* e5 */ 0xe8888c, 0xe89d89, 0xe4bb99, 0xe58588,
+ /* e9 */ 0xe58d83, 0xe58da0, 0xe5aea3, 0xe5b082,
+ /* ed */ 0xe5b096, 0xe5b79d, 0xe688a6, 0xe68987,
+ /* f1 */ 0xe692b0, 0xe6a093, 0xe6a0b4, 0xe6b389,
+ /* f5 */ 0xe6b585, 0xe6b497, 0xe69f93, 0xe6bd9c,
+ /* f9 */ 0xe7858e, 0xe785bd, 0xe6978b, 0xe7a9bf,
+ /* fd */ 0xe7aead, 0xe7b79a,
+
+ /*** Two byte table, leaf: c1xx - offset 0x00ab8 ***/
+
+ /* a1 */ 0xe7b98a, 0xe7bea8, 0xe885ba, 0xe8889b,
+ /* a5 */ 0xe888b9, 0xe896a6, 0xe8a9ae, 0xe8b38e,
+ /* a9 */ 0xe8b7b5, 0xe981b8, 0xe981b7, 0xe98aad,
+ /* ad */ 0xe98a91, 0xe99683, 0xe9aeae, 0xe5898d,
+ /* b1 */ 0xe59684, 0xe6bcb8, 0xe784b6, 0xe585a8,
+ /* b5 */ 0xe7a685, 0xe7b995, 0xe886b3, 0xe7b38e,
+ /* b9 */ 0xe5998c, 0xe5a191, 0xe5b2a8, 0xe68eaa,
+ /* bd */ 0xe69bbe, 0xe69bbd, 0xe6a59a, 0xe78b99,
+ /* c1 */ 0xe7968f, 0xe7968e, 0xe7a48e, 0xe7a596,
+ /* c5 */ 0xe7a79f, 0xe7b297, 0xe7b4a0, 0xe7b584,
+ /* c9 */ 0xe89887, 0xe8a8b4, 0xe998bb, 0xe981a1,
+ /* cd */ 0xe9bca0, 0xe583a7, 0xe589b5, 0xe58f8c,
+ /* d1 */ 0xe58fa2, 0xe58089, 0xe596aa, 0xe5a3ae,
+ /* d5 */ 0xe5a58f, 0xe788bd, 0xe5ae8b, 0xe5b1a4,
+ /* d9 */ 0xe58c9d, 0xe683a3, 0xe683b3, 0xe68d9c,
+ /* dd */ 0xe68e83, 0xe68cbf, 0xe68ebb, 0xe6938d,
+ /* e1 */ 0xe697a9, 0xe69bb9, 0xe5b7a3, 0xe6a78d,
+ /* e5 */ 0xe6a7bd, 0xe6bc95, 0xe787a5, 0xe4ba89,
+ /* e9 */ 0xe797a9, 0xe79bb8, 0xe7aa93, 0xe7b39f,
+ /* ed */ 0xe7b78f, 0xe7b69c, 0xe881a1, 0xe88d89,
+ /* f1 */ 0xe88d98, 0xe891ac, 0xe892bc, 0xe897bb,
+ /* f5 */ 0xe8a385, 0xe8b5b0, 0xe98081, 0xe981ad,
+ /* f9 */ 0xe98e97, 0xe99c9c, 0xe9a892, 0xe5838f,
+ /* fd */ 0xe5a297, 0xe6868e,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00b16 ***/
+
+ /* a1 */ 0xe88793, 0xe894b5, 0xe8b488, 0xe980a0,
+ /* a5 */ 0xe4bf83, 0xe581b4, 0xe58987, 0xe58db3,
+ /* a9 */ 0xe681af, 0xe68d89, 0xe69d9f, 0xe6b8ac,
+ /* ad */ 0xe8b6b3, 0xe9809f, 0xe4bf97, 0xe5b19e,
+ /* b1 */ 0xe8b38a, 0xe6978f, 0xe7b69a, 0xe58d92,
+ /* b5 */ 0xe8a296, 0xe585b6, 0xe68f83, 0xe5ad98,
+ /* b9 */ 0xe5adab, 0xe5b08a, 0xe6908d, 0xe69d91,
+ /* bd */ 0xe9819c, 0xe4bb96, 0xe5a49a, 0xe5a4aa,
+ /* c1 */ 0xe6b1b0, 0xe8a991, 0xe594be, 0xe5a095,
+ /* c5 */ 0xe5a6a5, 0xe683b0, 0xe68993, 0xe69f81,
+ /* c9 */ 0xe888b5, 0xe6a595, 0xe99980, 0xe9a784,
+ /* cd */ 0xe9a8a8, 0xe4bd93, 0xe5a086, 0xe5afbe,
+ /* d1 */ 0xe88090, 0xe5b2b1, 0xe5b8af, 0xe5be85,
+ /* d5 */ 0xe680a0, 0xe6858b, 0xe688b4, 0xe69bbf,
+ /* d9 */ 0xe6b3b0, 0xe6bb9e, 0xe8838e, 0xe885bf,
+ /* dd */ 0xe88b94, 0xe8a28b, 0xe8b2b8, 0xe98080,
+ /* e1 */ 0xe980ae, 0xe99a8a, 0xe9bb9b, 0xe9af9b,
+ /* e5 */ 0xe4bba3, 0xe58fb0, 0xe5a4a7, 0xe7acac,
+ /* e9 */ 0xe9868d, 0xe9a18c, 0xe9b7b9, 0xe6bb9d,
+ /* ed */ 0xe780a7, 0xe58d93, 0xe59584, 0xe5ae85,
+ /* f1 */ 0xe68998, 0xe68a9e, 0xe68b93, 0xe6b2a2,
+ /* f5 */ 0xe6bfaf, 0xe790a2, 0xe8a897, 0xe990b8,
+ /* f9 */ 0xe6bf81, 0xe8abbe, 0xe88cb8, 0xe587a7,
+ /* fd */ 0xe89bb8, 0xe58faa,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00b74 ***/
+
+ /* a1 */ 0xe58fa9, 0xe4bd86, 0xe98194, 0xe8beb0,
+ /* a5 */ 0xe5a5aa, 0xe884b1, 0xe5b7bd, 0xe7abaa,
+ /* a9 */ 0xe8bebf, 0xe6a39a, 0xe8b0b7, 0xe78bb8,
+ /* ad */ 0xe9b188, 0xe6a8bd, 0xe8aab0, 0xe4b8b9,
+ /* b1 */ 0xe58d98, 0xe59886, 0xe59da6, 0xe68b85,
+ /* b5 */ 0xe68ea2, 0xe697a6, 0xe6ad8e, 0xe6b7a1,
+ /* b9 */ 0xe6b99b, 0xe782ad, 0xe79fad, 0xe7abaf,
+ /* bd */ 0xe7aeaa, 0xe7b6bb, 0xe880bd, 0xe88386,
+ /* c1 */ 0xe89b8b, 0xe8aa95, 0xe98d9b, 0xe59ba3,
+ /* c5 */ 0xe5a387, 0xe5bcbe, 0xe696ad, 0xe69a96,
+ /* c9 */ 0xe6aa80, 0xe6aeb5, 0xe794b7, 0xe8ab87,
+ /* cd */ 0xe580a4, 0xe79fa5, 0xe59cb0, 0xe5bc9b,
+ /* d1 */ 0xe681a5, 0xe699ba, 0xe6b1a0, 0xe797b4,
+ /* d5 */ 0xe7a89a, 0xe7bdae, 0xe887b4, 0xe89c98,
+ /* d9 */ 0xe98185, 0xe9a6b3, 0xe7af89, 0xe7959c,
+ /* dd */ 0xe7abb9, 0xe7ad91, 0xe89384, 0xe98090,
+ /* e1 */ 0xe7a7a9, 0xe7aa92, 0xe88cb6, 0xe5aba1,
+ /* e5 */ 0xe79d80, 0xe4b8ad, 0xe4bbb2, 0xe5ae99,
+ /* e9 */ 0xe5bfa0, 0xe68abd, 0xe698bc, 0xe69fb1,
+ /* ed */ 0xe6b3a8, 0xe899ab, 0xe8a1b7, 0xe8a8bb,
+ /* f1 */ 0xe9858e, 0xe98bb3, 0xe9a790, 0xe6a897,
+ /* f5 */ 0xe780a6, 0xe78caa, 0xe88ba7, 0xe89197,
+ /* f9 */ 0xe8b2af, 0xe4b881, 0xe58586, 0xe5878b,
+ /* fd */ 0xe5968b, 0xe5afb5,
+
+ /*** Two byte table, leaf: c4xx - offset 0x00bd2 ***/
+
+ /* a1 */ 0xe5b896, 0xe5b8b3, 0xe5ba81, 0xe5bc94,
+ /* a5 */ 0xe5bcb5, 0xe5bdab, 0xe5beb4, 0xe687b2,
+ /* a9 */ 0xe68c91, 0xe69aa2, 0xe69c9d, 0xe6bdae,
+ /* ad */ 0xe78992, 0xe794ba, 0xe79cba, 0xe881b4,
+ /* b1 */ 0xe884b9, 0xe885b8, 0xe89db6, 0xe8aabf,
+ /* b5 */ 0xe8ab9c, 0xe8b685, 0xe8b7b3, 0xe98a9a,
+ /* b9 */ 0xe995b7, 0xe9a082, 0xe9b3a5, 0xe58b85,
+ /* bd */ 0xe68d97, 0xe79bb4, 0xe69c95, 0xe6b288,
+ /* c1 */ 0xe78f8d, 0xe8b383, 0xe98eae, 0xe999b3,
+ /* c5 */ 0xe6b4a5, 0xe5a29c, 0xe6a48e, 0xe6a78c,
+ /* c9 */ 0xe8bfbd, 0xe98e9a, 0xe7979b, 0xe9809a,
+ /* cd */ 0xe5a19a, 0xe6a082, 0xe68eb4, 0xe6a7bb,
+ /* d1 */ 0xe4bd83, 0xe6bcac, 0xe69f98, 0xe8bebb,
+ /* d5 */ 0xe894a6, 0xe7b6b4, 0xe98d94, 0xe6a4bf,
+ /* d9 */ 0xe6bdb0, 0xe59daa, 0xe5a3b7, 0xe5acac,
+ /* dd */ 0xe7b4ac, 0xe788aa, 0xe5908a, 0xe987a3,
+ /* e1 */ 0xe9b6b4, 0xe4baad, 0xe4bd8e, 0xe5819c,
+ /* e5 */ 0xe581b5, 0xe58983, 0xe8b29e, 0xe59188,
+ /* e9 */ 0xe5a0a4, 0xe5ae9a, 0xe5b89d, 0xe5ba95,
+ /* ed */ 0xe5baad, 0xe5bbb7, 0xe5bc9f, 0xe6828c,
+ /* f1 */ 0xe68ab5, 0xe68cba, 0xe68f90, 0xe6a2af,
+ /* f5 */ 0xe6b180, 0xe7a287, 0xe7a68e, 0xe7a88b,
+ /* f9 */ 0xe7b7a0, 0xe88987, 0xe8a882, 0xe8aba6,
+ /* fd */ 0xe8b984, 0xe98093,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00c30 ***/
+
+ /* a1 */ 0xe982b8, 0xe984ad, 0xe98798, 0xe9bc8e,
+ /* a5 */ 0xe6b3a5, 0xe69198, 0xe693a2, 0xe695b5,
+ /* a9 */ 0xe6bbb4, 0xe79a84, 0xe7ac9b, 0xe981a9,
+ /* ad */ 0xe98f91, 0xe6baba, 0xe593b2, 0xe5beb9,
+ /* b1 */ 0xe692a4, 0xe8bd8d, 0xe8bfad, 0xe98984,
+ /* b5 */ 0xe585b8, 0xe5a1ab, 0xe5a4a9, 0xe5b195,
+ /* b9 */ 0xe5ba97, 0xe6b7bb, 0xe7ba8f, 0xe7949c,
+ /* bd */ 0xe8b2bc, 0xe8bba2, 0xe9a19b, 0xe782b9,
+ /* c1 */ 0xe4bc9d, 0xe6aebf, 0xe6beb1, 0xe794b0,
+ /* c5 */ 0xe99bbb, 0xe5858e, 0xe59090, 0xe5a0b5,
+ /* c9 */ 0xe5a197, 0xe5a6ac, 0xe5b1a0, 0xe5be92,
+ /* cd */ 0xe69697, 0xe69d9c, 0xe6b8a1, 0xe799bb,
+ /* d1 */ 0xe88f9f, 0xe8b3ad, 0xe98094, 0xe983bd,
+ /* d5 */ 0xe98d8d, 0xe7a0a5, 0xe7a0ba, 0xe58aaa,
+ /* d9 */ 0xe5baa6, 0xe59c9f, 0xe5a5b4, 0xe68092,
+ /* dd */ 0xe58092, 0xe5859a, 0xe586ac, 0xe5878d,
+ /* e1 */ 0xe58880, 0xe59490, 0xe5a194, 0xe5a198,
+ /* e5 */ 0xe5a597, 0xe5ae95, 0xe5b3b6, 0xe5b68b,
+ /* e9 */ 0xe682bc, 0xe68a95, 0xe690ad, 0xe69db1,
+ /* ed */ 0xe6a183, 0xe6a2bc, 0xe6a39f, 0xe79b97,
+ /* f1 */ 0xe6b798, 0xe6b9af, 0xe6b69b, 0xe781af,
+ /* f5 */ 0xe78788, 0xe5bd93, 0xe79798, 0xe7a5b7,
+ /* f9 */ 0xe7ad89, 0xe7ad94, 0xe7ad92, 0xe7b396,
+ /* fd */ 0xe7b5b1, 0xe588b0,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00c8e ***/
+
+ /* a1 */ 0xe891a3, 0xe895a9, 0xe897a4, 0xe8a88e,
+ /* a5 */ 0xe8ac84, 0xe8b186, 0xe8b88f, 0xe98083,
+ /* a9 */ 0xe9808f, 0xe99099, 0xe999b6, 0xe9a0ad,
+ /* ad */ 0xe9a8b0, 0xe99798, 0xe5838d, 0xe58b95,
+ /* b1 */ 0xe5908c, 0xe5a082, 0xe5b08e, 0xe686a7,
+ /* b5 */ 0xe6929e, 0xe6b49e, 0xe79eb3, 0xe7aba5,
+ /* b9 */ 0xe883b4, 0xe89084, 0xe98193, 0xe98a85,
+ /* bd */ 0xe5b3a0, 0xe9b487, 0xe58cbf, 0xe5be97,
+ /* c1 */ 0xe5beb3, 0xe6b69c, 0xe789b9, 0xe79da3,
+ /* c5 */ 0xe7a6bf, 0xe7afa4, 0xe6af92, 0xe78bac,
+ /* c9 */ 0xe8aaad, 0xe6a083, 0xe6a9a1, 0xe587b8,
+ /* cd */ 0xe7aa81, 0xe6a4b4, 0xe5b18a, 0xe9b3b6,
+ /* d1 */ 0xe88bab, 0xe5af85, 0xe98589, 0xe7809e,
+ /* d5 */ 0xe599b8, 0xe5b1af, 0xe68387, 0xe695a6,
+ /* d9 */ 0xe6b28c, 0xe8b19a, 0xe98181, 0xe9a093,
+ /* dd */ 0xe59191, 0xe69b87, 0xe9888d, 0xe5a588,
+ /* e1 */ 0xe982a3, 0xe58685, 0xe4b98d, 0xe587aa,
+ /* e5 */ 0xe89699, 0xe8ac8e, 0xe78198, 0xe68dba,
+ /* e9 */ 0xe98d8b, 0xe6a5a2, 0xe9a6b4, 0xe7b884,
+ /* ed */ 0xe795b7, 0xe58d97, 0xe6a5a0, 0xe8bb9f,
+ /* f1 */ 0xe99ba3, 0xe6b19d, 0xe4ba8c, 0xe5b0bc,
+ /* f5 */ 0xe5bc90, 0xe8bfa9, 0xe58c82, 0xe8b391,
+ /* f9 */ 0xe88289, 0xe899b9, 0xe5bbbf, 0xe697a5,
+ /* fd */ 0xe4b9b3, 0xe585a5,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00cec ***/
+
+ /* a1 */ 0xe5a682, 0xe5b0bf, 0xe99fae, 0xe4bbbb,
+ /* a5 */ 0xe5a68a, 0xe5bf8d, 0xe8aa8d, 0xe6bfa1,
+ /* a9 */ 0xe7a6b0, 0xe7a5a2, 0xe5afa7, 0xe891b1,
+ /* ad */ 0xe78cab, 0xe786b1, 0xe5b9b4, 0xe5bfb5,
+ /* b1 */ 0xe68dbb, 0xe6929a, 0xe78783, 0xe7b298,
+ /* b5 */ 0xe4b983, 0xe5bbbc, 0xe4b98b, 0xe59f9c,
+ /* b9 */ 0xe59aa2, 0xe682a9, 0xe6bf83, 0xe7b48d,
+ /* bd */ 0xe883bd, 0xe884b3, 0xe886bf, 0xe8beb2,
+ /* c1 */ 0xe8a697, 0xe89aa4, 0xe5b7b4, 0xe68a8a,
+ /* c5 */ 0xe692ad, 0xe8a687, 0xe69db7, 0xe6b3a2,
+ /* c9 */ 0xe6b4be, 0xe790b6, 0xe7a0b4, 0xe5a986,
+ /* cd */ 0xe7bdb5, 0xe88aad, 0xe9a6ac, 0xe4bfb3,
+ /* d1 */ 0xe5bb83, 0xe68b9d, 0xe68e92, 0xe69597,
+ /* d5 */ 0xe69daf, 0xe79b83, 0xe7898c, 0xe8838c,
+ /* d9 */ 0xe882ba, 0xe8bca9, 0xe9858d, 0xe5808d,
+ /* dd */ 0xe59fb9, 0xe5aa92, 0xe6a285, 0xe6a5b3,
+ /* e1 */ 0xe785a4, 0xe78bbd, 0xe8b2b7, 0xe5a3b2,
+ /* e5 */ 0xe8b3a0, 0xe999aa, 0xe98099, 0xe89dbf,
+ /* e9 */ 0xe7a7a4, 0xe79fa7, 0xe890a9, 0xe4bcaf,
+ /* ed */ 0xe589a5, 0xe58d9a, 0xe68b8d, 0xe69f8f,
+ /* f1 */ 0xe6b38a, 0xe799bd, 0xe7ae94, 0xe7b295,
+ /* f5 */ 0xe888b6, 0xe89684, 0xe8bfab, 0xe69b9d,
+ /* f9 */ 0xe6bca0, 0xe78886, 0xe7b89b, 0xe88eab,
+ /* fd */ 0xe9a781, 0xe9baa6,
+
+ /*** Two byte table, leaf: c8xx - offset 0x00d4a ***/
+
+ /* a1 */ 0xe587bd, 0xe7aeb1, 0xe7a1b2, 0xe7aeb8,
+ /* a5 */ 0xe88287, 0xe7ad88, 0xe6aba8, 0xe5b9a1,
+ /* a9 */ 0xe8828c, 0xe79591, 0xe795a0, 0xe585ab,
+ /* ad */ 0xe989a2, 0xe6ba8c, 0xe799ba, 0xe98697,
+ /* b1 */ 0xe9abaa, 0xe4bc90, 0xe7bdb0, 0xe68a9c,
+ /* b5 */ 0xe7ad8f, 0xe996a5, 0xe9b3a9, 0xe599ba,
+ /* b9 */ 0xe5a199, 0xe89ba4, 0xe99abc, 0xe4bcb4,
+ /* bd */ 0xe588a4, 0xe58d8a, 0xe58f8d, 0xe58f9b,
+ /* c1 */ 0xe5b886, 0xe690ac, 0xe69691, 0xe69dbf,
+ /* c5 */ 0xe6b0be, 0xe6b18e, 0xe78988, 0xe78aaf,
+ /* c9 */ 0xe78fad, 0xe79594, 0xe7b981, 0xe888ac,
+ /* cd */ 0xe897a9, 0xe8b2a9, 0xe7af84, 0xe98786,
+ /* d1 */ 0xe785a9, 0xe9a092, 0xe9a3af, 0xe68cbd,
+ /* d5 */ 0xe699a9, 0xe795aa, 0xe79ba4, 0xe7a390,
+ /* d9 */ 0xe89583, 0xe89bae, 0xe58caa, 0xe58d91,
+ /* dd */ 0xe590a6, 0xe5a683, 0xe5ba87, 0xe5bdbc,
+ /* e1 */ 0xe682b2, 0xe68989, 0xe689b9, 0xe68aab,
+ /* e5 */ 0xe69690, 0xe6af94, 0xe6b38c, 0xe796b2,
+ /* e9 */ 0xe79aae, 0xe7a291, 0xe7a798, 0xe7b78b,
+ /* ed */ 0xe7bdb7, 0xe882a5, 0xe8a2ab, 0xe8aab9,
+ /* f1 */ 0xe8b2bb, 0xe981bf, 0xe99d9e, 0xe9a39b,
+ /* f5 */ 0xe6a88b, 0xe7b0b8, 0xe58299, 0xe5b0be,
+ /* f9 */ 0xe5beae, 0xe69e87, 0xe6af98, 0xe790b5,
+ /* fd */ 0xe79c89, 0xe7be8e,
+
+ /*** Two byte table, leaf: c9xx - offset 0x00da8 ***/
+
+ /* a1 */ 0xe9bcbb, 0xe69f8a, 0xe7a897, 0xe58cb9,
+ /* a5 */ 0xe7968b, 0xe9abad, 0xe5bda6, 0xe8869d,
+ /* a9 */ 0xe88fb1, 0xe88298, 0xe5bcbc, 0xe5bf85,
+ /* ad */ 0xe795a2, 0xe7ad86, 0xe980bc, 0xe6a1a7,
+ /* b1 */ 0xe5a7ab, 0xe5aa9b, 0xe7b490, 0xe799be,
+ /* b5 */ 0xe8acac, 0xe4bfb5, 0xe5bdaa, 0xe6a899,
+ /* b9 */ 0xe6b0b7, 0xe6bc82, 0xe793a2, 0xe7a5a8,
+ /* bd */ 0xe8a1a8, 0xe8a995, 0xe8b1b9, 0xe5bb9f,
+ /* c1 */ 0xe68f8f, 0xe79785, 0xe7a792, 0xe88b97,
+ /* c5 */ 0xe98ca8, 0xe98bb2, 0xe8929c, 0xe89bad,
+ /* c9 */ 0xe9b0ad, 0xe59381, 0xe5bdac, 0xe6968c,
+ /* cd */ 0xe6b59c, 0xe78095, 0xe8b2a7, 0xe8b393,
+ /* d1 */ 0xe9a0bb, 0xe6958f, 0xe793b6, 0xe4b88d,
+ /* d5 */ 0xe4bb98, 0xe59fa0, 0xe5a4ab, 0xe5a9a6,
+ /* d9 */ 0xe5af8c, 0xe586a8, 0xe5b883, 0xe5ba9c,
+ /* dd */ 0xe68096, 0xe689b6, 0xe695b7, 0xe696a7,
+ /* e1 */ 0xe699ae, 0xe6b5ae, 0xe788b6, 0xe7aca6,
+ /* e5 */ 0xe88590, 0xe8869a, 0xe88a99, 0xe8ad9c,
+ /* e9 */ 0xe8b2a0, 0xe8b3a6, 0xe8b5b4, 0xe9989c,
+ /* ed */ 0xe99984, 0xe4beae, 0xe692ab, 0xe6ada6,
+ /* f1 */ 0xe8889e, 0xe891a1, 0xe895aa, 0xe983a8,
+ /* f5 */ 0xe5b081, 0xe6a593, 0xe9a2a8, 0xe891ba,
+ /* f9 */ 0xe89597, 0xe4bc8f, 0xe589af, 0xe5bea9,
+ /* fd */ 0xe5b985, 0xe69c8d,
+
+ /*** Two byte table, leaf: caxx - offset 0x00e06 ***/
+
+ /* a1 */ 0xe7a68f, 0xe885b9, 0xe8a487, 0xe8a686,
+ /* a5 */ 0xe6b7b5, 0xe5bc97, 0xe68995, 0xe6b2b8,
+ /* a9 */ 0xe4bb8f, 0xe789a9, 0xe9ae92, 0xe58886,
+ /* ad */ 0xe590bb, 0xe599b4, 0xe5a2b3, 0xe686a4,
+ /* b1 */ 0xe689ae, 0xe7849a, 0xe5a5ae, 0xe7b289,
+ /* b5 */ 0xe7b39e, 0xe7b49b, 0xe99bb0, 0xe69687,
+ /* b9 */ 0xe8819e, 0xe4b899, 0xe4bdb5, 0xe585b5,
+ /* bd */ 0xe5a180, 0xe5b9a3, 0xe5b9b3, 0xe5bc8a,
+ /* c1 */ 0xe69f84, 0xe4b8a6, 0xe894bd, 0xe99689,
+ /* c5 */ 0xe9999b, 0xe7b1b3, 0xe9a081, 0xe583bb,
+ /* c9 */ 0xe5a381, 0xe79996, 0xe7a2a7, 0xe588a5,
+ /* cd */ 0xe79ea5, 0xe89491, 0xe7ae86, 0xe5818f,
+ /* d1 */ 0xe5a489, 0xe78987, 0xe7af87, 0xe7b7a8,
+ /* d5 */ 0xe8beba, 0xe8bf94, 0xe9818d, 0xe4bebf,
+ /* d9 */ 0xe58b89, 0xe5a8a9, 0xe5bc81, 0xe99ead,
+ /* dd */ 0xe4bf9d, 0xe88897, 0xe98baa, 0xe59c83,
+ /* e1 */ 0xe68d95, 0xe6ada9, 0xe794ab, 0xe8a39c,
+ /* e5 */ 0xe8bc94, 0xe7a982, 0xe58b9f, 0xe5a293,
+ /* e9 */ 0xe68595, 0xe6888a, 0xe69aae, 0xe6af8d,
+ /* ed */ 0xe7b0bf, 0xe88fa9, 0xe580a3, 0xe4bfb8,
+ /* f1 */ 0xe58c85, 0xe59186, 0xe5a0b1, 0xe5a589,
+ /* f5 */ 0xe5ae9d, 0xe5b3b0, 0xe5b3af, 0xe5b4a9,
+ /* f9 */ 0xe5ba96, 0xe68ab1, 0xe68da7, 0xe694be,
+ /* fd */ 0xe696b9, 0xe69c8b,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00e64 ***/
+
+ /* a1 */ 0xe6b395, 0xe6b3a1, 0xe783b9, 0xe7a0b2,
+ /* a5 */ 0xe7b8ab, 0xe8839e, 0xe88ab3, 0xe8908c,
+ /* a9 */ 0xe893ac, 0xe89c82, 0xe8a492, 0xe8a8aa,
+ /* ad */ 0xe8b18a, 0xe982a6, 0xe98b92, 0xe9a3bd,
+ /* b1 */ 0xe9b3b3, 0xe9b5ac, 0xe4b98f, 0xe4baa1,
+ /* b5 */ 0xe5828d, 0xe58996, 0xe59d8a, 0xe5a6a8,
+ /* b9 */ 0xe5b8bd, 0xe5bf98, 0xe5bf99, 0xe688bf,
+ /* bd */ 0xe69ab4, 0xe69c9b, 0xe69f90, 0xe6a392,
+ /* c1 */ 0xe58692, 0xe7b4a1, 0xe882aa, 0xe886a8,
+ /* c5 */ 0xe8ac80, 0xe8b28c, 0xe8b2bf, 0xe989be,
+ /* c9 */ 0xe998b2, 0xe590a0, 0xe9a0ac, 0xe58c97,
+ /* cd */ 0xe58395, 0xe58d9c, 0xe5a2a8, 0xe692b2,
+ /* d1 */ 0xe69cb4, 0xe789a7, 0xe79da6, 0xe7a986,
+ /* d5 */ 0xe987a6, 0xe58b83, 0xe6b2a1, 0xe6ae86,
+ /* d9 */ 0xe5a080, 0xe5b98c, 0xe5a594, 0xe69cac,
+ /* dd */ 0xe7bfbb, 0xe587a1, 0xe79b86, 0xe691a9,
+ /* e1 */ 0xe7a3a8, 0xe9ad94, 0xe9babb, 0xe59f8b,
+ /* e5 */ 0xe5a6b9, 0xe698a7, 0xe69e9a, 0xe6af8e,
+ /* e9 */ 0xe593a9, 0xe6a799, 0xe5b995, 0xe8869c,
+ /* ed */ 0xe69e95, 0xe9aeaa, 0xe69fbe, 0xe9b192,
+ /* f1 */ 0xe6a19d, 0xe4baa6, 0xe4bfa3, 0xe58f88,
+ /* f5 */ 0xe68ab9, 0xe69cab, 0xe6b2ab, 0xe8bf84,
+ /* f9 */ 0xe4bead, 0xe7b9ad, 0xe9babf, 0xe4b887,
+ /* fd */ 0xe685a2, 0xe6ba80,
+
+ /*** Two byte table, leaf: ccxx - offset 0x00ec2 ***/
+
+ /* a1 */ 0xe6bcab, 0xe89493, 0xe591b3, 0xe69caa,
+ /* a5 */ 0xe9ad85, 0xe5b7b3, 0xe7ae95, 0xe5b2ac,
+ /* a9 */ 0xe5af86, 0xe89c9c, 0xe6b98a, 0xe89391,
+ /* ad */ 0xe7a894, 0xe88488, 0xe5a699, 0xe7b28d,
+ /* b1 */ 0xe6b091, 0xe79ca0, 0xe58b99, 0xe5a4a2,
+ /* b5 */ 0xe784a1, 0xe7899f, 0xe79f9b, 0xe99ca7,
+ /* b9 */ 0xe9b5a1, 0xe6a48b, 0xe5a9bf, 0xe5a898,
+ /* bd */ 0xe586a5, 0xe5908d, 0xe591bd, 0xe6988e,
+ /* c1 */ 0xe79b9f, 0xe8bfb7, 0xe98a98, 0xe9b3b4,
+ /* c5 */ 0xe5a7aa, 0xe7899d, 0xe6bb85, 0xe5858d,
+ /* c9 */ 0xe6a389, 0xe7b6bf, 0xe7b7ac, 0xe99da2,
+ /* cd */ 0xe9baba, 0xe691b8, 0xe6a8a1, 0xe88c82,
+ /* d1 */ 0xe5a684, 0xe5ad9f, 0xe6af9b, 0xe78c9b,
+ /* d5 */ 0xe79bb2, 0xe7b6b2, 0xe88097, 0xe89299,
+ /* d9 */ 0xe584b2, 0xe69ca8, 0xe9bb99, 0xe79bae,
+ /* dd */ 0xe69da2, 0xe58bbf, 0xe9a485, 0xe5b0a4,
+ /* e1 */ 0xe688bb, 0xe7b1be, 0xe8b2b0, 0xe5958f,
+ /* e5 */ 0xe682b6, 0xe7b48b, 0xe99680, 0xe58c81,
+ /* e9 */ 0xe4b99f, 0xe586b6, 0xe5a49c, 0xe788ba,
+ /* ed */ 0xe880b6, 0xe9878e, 0xe5bca5, 0xe79fa2,
+ /* f1 */ 0xe58e84, 0xe5bdb9, 0xe7b484, 0xe896ac,
+ /* f5 */ 0xe8a8b3, 0xe8ba8d, 0xe99d96, 0xe69fb3,
+ /* f9 */ 0xe896ae, 0xe99193, 0xe68489, 0xe68488,
+ /* fd */ 0xe6b2b9, 0xe79992,
+
+ /*** Two byte table, leaf: cdxx - offset 0x00f20 ***/
+
+ /* a1 */ 0xe8abad, 0xe8bcb8, 0xe594af, 0xe4bd91,
+ /* a5 */ 0xe584aa, 0xe58b87, 0xe58f8b, 0xe5aea5,
+ /* a9 */ 0xe5b9bd, 0xe682a0, 0xe68682, 0xe68f96,
+ /* ad */ 0xe69c89, 0xe69f9a, 0xe6b9a7, 0xe6b68c,
+ /* b1 */ 0xe78cb6, 0xe78cb7, 0xe794b1, 0xe7a590,
+ /* b5 */ 0xe8a395, 0xe8aa98, 0xe9818a, 0xe98291,
+ /* b9 */ 0xe983b5, 0xe99b84, 0xe89e8d, 0xe5a495,
+ /* bd */ 0xe4ba88, 0xe4bd99, 0xe4b88e, 0xe8aa89,
+ /* c1 */ 0xe8bcbf, 0xe9a090, 0xe582ad, 0xe5b9bc,
+ /* c5 */ 0xe5a696, 0xe5aeb9, 0xe5bab8, 0xe68f9a,
+ /* c9 */ 0xe68fba, 0xe69381, 0xe69b9c, 0xe6a58a,
+ /* cd */ 0xe6a798, 0xe6b48b, 0xe6bab6, 0xe78694,
+ /* d1 */ 0xe794a8, 0xe7aaaf, 0xe7be8a, 0xe88080,
+ /* d5 */ 0xe89189, 0xe89389, 0xe8a681, 0xe8aca1,
+ /* d9 */ 0xe8b88a, 0xe981a5, 0xe999bd, 0xe9a48a,
+ /* dd */ 0xe685be, 0xe68a91, 0xe6acb2, 0xe6b283,
+ /* e1 */ 0xe6b5b4, 0xe7bf8c, 0xe7bfbc, 0xe6b780,
+ /* e5 */ 0xe7be85, 0xe89eba, 0xe8a3b8, 0xe69da5,
+ /* e9 */ 0xe88eb1, 0xe9a0bc, 0xe99bb7, 0xe6b49b,
+ /* ed */ 0xe7b5a1, 0xe890bd, 0xe985aa, 0xe4b9b1,
+ /* f1 */ 0xe58db5, 0xe5b590, 0xe6ac84, 0xe6bfab,
+ /* f5 */ 0xe8978d, 0xe898ad, 0xe8a6a7, 0xe588a9,
+ /* f9 */ 0xe5908f, 0xe5b1a5, 0xe69d8e, 0xe6a2a8,
+ /* fd */ 0xe79086, 0xe79283,
+
+ /*** Two byte table, leaf: cexx - offset 0x00f7e ***/
+
+ /* a1 */ 0xe797a2, 0xe8a38f, 0xe8a3a1, 0xe9878c,
+ /* a5 */ 0xe99ba2, 0xe999b8, 0xe5be8b, 0xe78e87,
+ /* a9 */ 0xe7ab8b, 0xe8918e, 0xe68ea0, 0xe795a5,
+ /* ad */ 0xe58a89, 0xe6b581, 0xe6ba9c, 0xe79089,
+ /* b1 */ 0xe79599, 0xe7a1ab, 0xe7b292, 0xe99a86,
+ /* b5 */ 0xe7ab9c, 0xe9be8d, 0xe4beb6, 0xe685ae,
+ /* b9 */ 0xe69785, 0xe8999c, 0xe4ba86, 0xe4baae,
+ /* bd */ 0xe5839a, 0xe4b8a1, 0xe5878c, 0xe5afae,
+ /* c1 */ 0xe69699, 0xe6a281, 0xe6b6bc, 0xe78c9f,
+ /* c5 */ 0xe79982, 0xe79ead, 0xe7a89c, 0xe7b3a7,
+ /* c9 */ 0xe889af, 0xe8ab92, 0xe981bc, 0xe9878f,
+ /* cd */ 0xe999b5, 0xe9a098, 0xe58a9b, 0xe7b791,
+ /* d1 */ 0xe580ab, 0xe58e98, 0xe69e97, 0xe6b78b,
+ /* d5 */ 0xe78790, 0xe790b3, 0xe887a8, 0xe8bcaa,
+ /* d9 */ 0xe99aa3, 0xe9b197, 0xe9ba9f, 0xe791a0,
+ /* dd */ 0xe5a181, 0xe6b699, 0xe7b4af, 0xe9a19e,
+ /* e1 */ 0xe4bba4, 0xe4bcb6, 0xe4be8b, 0xe586b7,
+ /* e5 */ 0xe58ab1, 0xe5b6ba, 0xe6809c, 0xe78eb2,
+ /* e9 */ 0xe7a4bc, 0xe88b93, 0xe988b4, 0xe99ab7,
+ /* ed */ 0xe99bb6, 0xe99c8a, 0xe9ba97, 0xe9bda2,
+ /* f1 */ 0xe69aa6, 0xe6adb4, 0xe58897, 0xe58aa3,
+ /* f5 */ 0xe78388, 0xe8a382, 0xe5bb89, 0xe6818b,
+ /* f9 */ 0xe68690, 0xe6bca3, 0xe78589, 0xe7b0be,
+ /* fd */ 0xe7b7b4, 0xe881af,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00fdc ***/
+
+ /* a1 */ 0xe893ae, 0xe980a3, 0xe98cac, 0xe59182,
+ /* a5 */ 0xe9adaf, 0xe6ab93, 0xe78289, 0xe8b382,
+ /* a9 */ 0xe8b7af, 0xe99cb2, 0xe58ab4, 0xe5a981,
+ /* ad */ 0xe5bb8a, 0xe5bc84, 0xe69c97, 0xe6a5bc,
+ /* b1 */ 0xe6a694, 0xe6b5aa, 0xe6bc8f, 0xe789a2,
+ /* b5 */ 0xe78bbc, 0xe7afad, 0xe88081, 0xe881be,
+ /* b9 */ 0xe89d8b, 0xe9838e, 0xe585ad, 0xe9ba93,
+ /* bd */ 0xe7a684, 0xe8828b, 0xe98cb2, 0xe8ab96,
+ /* c1 */ 0xe580ad, 0xe5928c, 0xe8a9b1, 0xe6adaa,
+ /* c5 */ 0xe8b384, 0xe88487, 0xe68391, 0xe69ea0,
+ /* c9 */ 0xe9b7b2, 0xe4ba99, 0xe4ba98, 0xe9b090,
+ /* cd */ 0xe8a9ab, 0xe89781, 0xe895a8, 0xe6a480,
+ /* d1 */ 0xe6b9be, 0xe7a297, 0xe88595, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: d0xx - offset 0x0103a ***/
+
+ /* a1 */ 0xe5bc8c, 0xe4b890, 0xe4b895, 0xe4b8aa,
+ /* a5 */ 0xe4b8b1, 0xe4b8b6, 0xe4b8bc, 0xe4b8bf,
+ /* a9 */ 0xe4b982, 0xe4b996, 0xe4b998, 0xe4ba82,
+ /* ad */ 0xe4ba85, 0xe8b1ab, 0xe4ba8a, 0xe88892,
+ /* b1 */ 0xe5bc8d, 0xe4ba8e, 0xe4ba9e, 0xe4ba9f,
+ /* b5 */ 0xe4baa0, 0xe4baa2, 0xe4bab0, 0xe4bab3,
+ /* b9 */ 0xe4bab6, 0xe4bb8e, 0xe4bb8d, 0xe4bb84,
+ /* bd */ 0xe4bb86, 0xe4bb82, 0xe4bb97, 0xe4bb9e,
+ /* c1 */ 0xe4bbad, 0xe4bb9f, 0xe4bbb7, 0xe4bc89,
+ /* c5 */ 0xe4bd9a, 0xe4bcb0, 0xe4bd9b, 0xe4bd9d,
+ /* c9 */ 0xe4bd97, 0xe4bd87, 0xe4bdb6, 0xe4be88,
+ /* cd */ 0xe4be8f, 0xe4be98, 0xe4bdbb, 0xe4bda9,
+ /* d1 */ 0xe4bdb0, 0xe4be91, 0xe4bdaf, 0xe4be86,
+ /* d5 */ 0xe4be96, 0xe58498, 0xe4bf94, 0xe4bf9f,
+ /* d9 */ 0xe4bf8e, 0xe4bf98, 0xe4bf9b, 0xe4bf91,
+ /* dd */ 0xe4bf9a, 0xe4bf90, 0xe4bfa4, 0xe4bfa5,
+ /* e1 */ 0xe5809a, 0xe580a8, 0xe58094, 0xe580aa,
+ /* e5 */ 0xe580a5, 0xe58085, 0xe4bc9c, 0xe4bfb6,
+ /* e9 */ 0xe580a1, 0xe580a9, 0xe580ac, 0xe4bfbe,
+ /* ed */ 0xe4bfaf, 0xe58091, 0xe58086, 0xe58183,
+ /* f1 */ 0xe58187, 0xe69c83, 0xe58195, 0xe58190,
+ /* f5 */ 0xe58188, 0xe5819a, 0xe58196, 0xe581ac,
+ /* f9 */ 0xe581b8, 0xe58280, 0xe5829a, 0xe58285,
+ /* fd */ 0xe582b4, 0xe582b2,
+
+ /*** Two byte table, leaf: d1xx - offset 0x01098 ***/
+
+ /* a1 */ 0xe58389, 0xe5838a, 0xe582b3, 0xe58382,
+ /* a5 */ 0xe58396, 0xe5839e, 0xe583a5, 0xe583ad,
+ /* a9 */ 0xe583a3, 0xe583ae, 0xe583b9, 0xe583b5,
+ /* ad */ 0xe58489, 0xe58481, 0xe58482, 0xe58496,
+ /* b1 */ 0xe58495, 0xe58494, 0xe5849a, 0xe584a1,
+ /* b5 */ 0xe584ba, 0xe584b7, 0xe584bc, 0xe584bb,
+ /* b9 */ 0xe584bf, 0xe58580, 0xe58592, 0xe5858c,
+ /* bd */ 0xe58594, 0xe585a2, 0xe7abb8, 0xe585a9,
+ /* c1 */ 0xe585aa, 0xe585ae, 0xe58680, 0xe58682,
+ /* c5 */ 0xe59b98, 0xe5868c, 0xe58689, 0xe5868f,
+ /* c9 */ 0xe58691, 0xe58693, 0xe58695, 0xe58696,
+ /* cd */ 0xe586a4, 0xe586a6, 0xe586a2, 0xe586a9,
+ /* d1 */ 0xe586aa, 0xe586ab, 0xe586b3, 0xe586b1,
+ /* d5 */ 0xe586b2, 0xe586b0, 0xe586b5, 0xe586bd,
+ /* d9 */ 0xe58785, 0xe58789, 0xe5879b, 0xe587a0,
+ /* dd */ 0xe89995, 0xe587a9, 0xe587ad, 0xe587b0,
+ /* e1 */ 0xe587b5, 0xe587be, 0xe58884, 0xe5888b,
+ /* e5 */ 0xe58894, 0xe5888e, 0xe588a7, 0xe588aa,
+ /* e9 */ 0xe588ae, 0xe588b3, 0xe588b9, 0xe5898f,
+ /* ed */ 0xe58984, 0xe5898b, 0xe5898c, 0xe5899e,
+ /* f1 */ 0xe58994, 0xe589aa, 0xe589b4, 0xe589a9,
+ /* f5 */ 0xe589b3, 0xe589bf, 0xe589bd, 0xe58a8d,
+ /* f9 */ 0xe58a94, 0xe58a92, 0xe589b1, 0xe58a88,
+ /* fd */ 0xe58a91, 0xe8bea8,
+
+ /*** Two byte table, leaf: d2xx - offset 0x010f6 ***/
+
+ /* a1 */ 0xe8bea7, 0xe58aac, 0xe58aad, 0xe58abc,
+ /* a5 */ 0xe58ab5, 0xe58b81, 0xe58b8d, 0xe58b97,
+ /* a9 */ 0xe58b9e, 0xe58ba3, 0xe58ba6, 0xe9a3ad,
+ /* ad */ 0xe58ba0, 0xe58bb3, 0xe58bb5, 0xe58bb8,
+ /* b1 */ 0xe58bb9, 0xe58c86, 0xe58c88, 0xe794b8,
+ /* b5 */ 0xe58c8d, 0xe58c90, 0xe58c8f, 0xe58c95,
+ /* b9 */ 0xe58c9a, 0xe58ca3, 0xe58caf, 0xe58cb1,
+ /* bd */ 0xe58cb3, 0xe58cb8, 0xe58d80, 0xe58d86,
+ /* c1 */ 0xe58d85, 0xe4b897, 0xe58d89, 0xe58d8d,
+ /* c5 */ 0xe58796, 0xe58d9e, 0xe58da9, 0xe58dae,
+ /* c9 */ 0xe5a498, 0xe58dbb, 0xe58db7, 0xe58e82,
+ /* cd */ 0xe58e96, 0xe58ea0, 0xe58ea6, 0xe58ea5,
+ /* d1 */ 0xe58eae, 0xe58eb0, 0xe58eb6, 0xe58f83,
+ /* d5 */ 0xe7b092, 0xe99b99, 0xe58f9f, 0xe69bbc,
+ /* d9 */ 0xe787ae, 0xe58fae, 0xe58fa8, 0xe58fad,
+ /* dd */ 0xe58fba, 0xe59081, 0xe590bd, 0xe59180,
+ /* e1 */ 0xe590ac, 0xe590ad, 0xe590bc, 0xe590ae,
+ /* e5 */ 0xe590b6, 0xe590a9, 0xe5909d, 0xe5918e,
+ /* e9 */ 0xe5928f, 0xe591b5, 0xe5928e, 0xe5919f,
+ /* ed */ 0xe591b1, 0xe591b7, 0xe591b0, 0xe59292,
+ /* f1 */ 0xe591bb, 0xe59280, 0xe591b6, 0xe59284,
+ /* f5 */ 0xe59290, 0xe59286, 0xe59387, 0xe592a2,
+ /* f9 */ 0xe592b8, 0xe592a5, 0xe592ac, 0xe59384,
+ /* fd */ 0xe59388, 0xe592a8,
+
+ /*** Two byte table, leaf: d3xx - offset 0x01154 ***/
+
+ /* a1 */ 0xe592ab, 0xe59382, 0xe592a4, 0xe592be,
+ /* a5 */ 0xe592bc, 0xe59398, 0xe593a5, 0xe593a6,
+ /* a9 */ 0xe5948f, 0xe59494, 0xe593bd, 0xe593ae,
+ /* ad */ 0xe593ad, 0xe593ba, 0xe593a2, 0xe594b9,
+ /* b1 */ 0xe59580, 0xe595a3, 0xe5958c, 0xe594ae,
+ /* b5 */ 0xe5959c, 0xe59585, 0xe59596, 0xe59597,
+ /* b9 */ 0xe594b8, 0xe594b3, 0xe5959d, 0xe59699,
+ /* bd */ 0xe59680, 0xe592af, 0xe5968a, 0xe5969f,
+ /* c1 */ 0xe595bb, 0xe595be, 0xe59698, 0xe5969e,
+ /* c5 */ 0xe596ae, 0xe595bc, 0xe59683, 0xe596a9,
+ /* c9 */ 0xe59687, 0xe596a8, 0xe5979a, 0xe59785,
+ /* cd */ 0xe5979f, 0xe59784, 0xe5979c, 0xe597a4,
+ /* d1 */ 0xe59794, 0xe59894, 0xe597b7, 0xe59896,
+ /* d5 */ 0xe597be, 0xe597bd, 0xe5989b, 0xe597b9,
+ /* d9 */ 0xe5998e, 0xe59990, 0xe7879f, 0xe598b4,
+ /* dd */ 0xe598b6, 0xe598b2, 0xe598b8, 0xe599ab,
+ /* e1 */ 0xe599a4, 0xe598af, 0xe599ac, 0xe599aa,
+ /* e5 */ 0xe59a86, 0xe59a80, 0xe59a8a, 0xe59aa0,
+ /* e9 */ 0xe59a94, 0xe59a8f, 0xe59aa5, 0xe59aae,
+ /* ed */ 0xe59ab6, 0xe59ab4, 0xe59b82, 0xe59abc,
+ /* f1 */ 0xe59b81, 0xe59b83, 0xe59b80, 0xe59b88,
+ /* f5 */ 0xe59b8e, 0xe59b91, 0xe59b93, 0xe59b97,
+ /* f9 */ 0xe59bae, 0xe59bb9, 0xe59c80, 0xe59bbf,
+ /* fd */ 0xe59c84, 0xe59c89,
+
+ /*** Two byte table, leaf: d4xx - offset 0x011b2 ***/
+
+ /* a1 */ 0xe59c88, 0xe59c8b, 0xe59c8d, 0xe59c93,
+ /* a5 */ 0xe59c98, 0xe59c96, 0xe59787, 0xe59c9c,
+ /* a9 */ 0xe59ca6, 0xe59cb7, 0xe59cb8, 0xe59d8e,
+ /* ad */ 0xe59cbb, 0xe59d80, 0xe59d8f, 0xe59da9,
+ /* b1 */ 0xe59f80, 0xe59e88, 0xe59da1, 0xe59dbf,
+ /* b5 */ 0xe59e89, 0xe59e93, 0xe59ea0, 0xe59eb3,
+ /* b9 */ 0xe59ea4, 0xe59eaa, 0xe59eb0, 0xe59f83,
+ /* bd */ 0xe59f86, 0xe59f94, 0xe59f92, 0xe59f93,
+ /* c1 */ 0xe5a08a, 0xe59f96, 0xe59fa3, 0xe5a08b,
+ /* c5 */ 0xe5a099, 0xe5a09d, 0xe5a1b2, 0xe5a0a1,
+ /* c9 */ 0xe5a1a2, 0xe5a18b, 0xe5a1b0, 0xe6af80,
+ /* cd */ 0xe5a192, 0xe5a0bd, 0xe5a1b9, 0xe5a285,
+ /* d1 */ 0xe5a2b9, 0xe5a29f, 0xe5a2ab, 0xe5a2ba,
+ /* d5 */ 0xe5a39e, 0xe5a2bb, 0xe5a2b8, 0xe5a2ae,
+ /* d9 */ 0xe5a385, 0xe5a393, 0xe5a391, 0xe5a397,
+ /* dd */ 0xe5a399, 0xe5a398, 0xe5a3a5, 0xe5a39c,
+ /* e1 */ 0xe5a3a4, 0xe5a39f, 0xe5a3af, 0xe5a3ba,
+ /* e5 */ 0xe5a3b9, 0xe5a3bb, 0xe5a3bc, 0xe5a3bd,
+ /* e9 */ 0xe5a482, 0xe5a48a, 0xe5a490, 0xe5a49b,
+ /* ed */ 0xe6a2a6, 0xe5a4a5, 0xe5a4ac, 0xe5a4ad,
+ /* f1 */ 0xe5a4b2, 0xe5a4b8, 0xe5a4be, 0xe7ab92,
+ /* f5 */ 0xe5a595, 0xe5a590, 0xe5a58e, 0xe5a59a,
+ /* f9 */ 0xe5a598, 0xe5a5a2, 0xe5a5a0, 0xe5a5a7,
+ /* fd */ 0xe5a5ac, 0xe5a5a9,
+
+ /*** Two byte table, leaf: d5xx - offset 0x01210 ***/
+
+ /* a1 */ 0xe5a5b8, 0xe5a681, 0xe5a69d, 0xe4bd9e,
+ /* a5 */ 0xe4beab, 0xe5a6a3, 0xe5a6b2, 0xe5a786,
+ /* a9 */ 0xe5a7a8, 0xe5a79c, 0xe5a68d, 0xe5a799,
+ /* ad */ 0xe5a79a, 0xe5a8a5, 0xe5a89f, 0xe5a891,
+ /* b1 */ 0xe5a89c, 0xe5a889, 0xe5a89a, 0xe5a980,
+ /* b5 */ 0xe5a9ac, 0xe5a989, 0xe5a8b5, 0xe5a8b6,
+ /* b9 */ 0xe5a9a2, 0xe5a9aa, 0xe5aa9a, 0xe5aabc,
+ /* bd */ 0xe5aabe, 0xe5ab8b, 0xe5ab82, 0xe5aabd,
+ /* c1 */ 0xe5aba3, 0xe5ab97, 0xe5aba6, 0xe5aba9,
+ /* c5 */ 0xe5ab96, 0xe5abba, 0xe5abbb, 0xe5ac8c,
+ /* c9 */ 0xe5ac8b, 0xe5ac96, 0xe5acb2, 0xe5ab90,
+ /* cd */ 0xe5acaa, 0xe5acb6, 0xe5acbe, 0xe5ad83,
+ /* d1 */ 0xe5ad85, 0xe5ad80, 0xe5ad91, 0xe5ad95,
+ /* d5 */ 0xe5ad9a, 0xe5ad9b, 0xe5ada5, 0xe5ada9,
+ /* d9 */ 0xe5adb0, 0xe5adb3, 0xe5adb5, 0xe5adb8,
+ /* dd */ 0xe69688, 0xe5adba, 0xe5ae80, 0xe5ae83,
+ /* e1 */ 0xe5aea6, 0xe5aeb8, 0xe5af83, 0xe5af87,
+ /* e5 */ 0xe5af89, 0xe5af94, 0xe5af90, 0xe5afa4,
+ /* e9 */ 0xe5afa6, 0xe5afa2, 0xe5af9e, 0xe5afa5,
+ /* ed */ 0xe5afab, 0xe5afb0, 0xe5afb6, 0xe5afb3,
+ /* f1 */ 0xe5b085, 0xe5b087, 0xe5b088, 0xe5b08d,
+ /* f5 */ 0xe5b093, 0xe5b0a0, 0xe5b0a2, 0xe5b0a8,
+ /* f9 */ 0xe5b0b8, 0xe5b0b9, 0xe5b181, 0xe5b186,
+ /* fd */ 0xe5b18e, 0xe5b193,
+
+ /*** Two byte table, leaf: d6xx - offset 0x0126e ***/
+
+ /* a1 */ 0xe5b190, 0xe5b18f, 0xe5adb1, 0xe5b1ac,
+ /* a5 */ 0xe5b1ae, 0xe4b9a2, 0xe5b1b6, 0xe5b1b9,
+ /* a9 */ 0xe5b28c, 0xe5b291, 0xe5b294, 0xe5a69b,
+ /* ad */ 0xe5b2ab, 0xe5b2bb, 0xe5b2b6, 0xe5b2bc,
+ /* b1 */ 0xe5b2b7, 0xe5b385, 0xe5b2be, 0xe5b387,
+ /* b5 */ 0xe5b399, 0xe5b3a9, 0xe5b3bd, 0xe5b3ba,
+ /* b9 */ 0xe5b3ad, 0xe5b68c, 0xe5b3aa, 0xe5b48b,
+ /* bd */ 0xe5b495, 0xe5b497, 0xe5b59c, 0xe5b49f,
+ /* c1 */ 0xe5b49b, 0xe5b491, 0xe5b494, 0xe5b4a2,
+ /* c5 */ 0xe5b49a, 0xe5b499, 0xe5b498, 0xe5b58c,
+ /* c9 */ 0xe5b592, 0xe5b58e, 0xe5b58b, 0xe5b5ac,
+ /* cd */ 0xe5b5b3, 0xe5b5b6, 0xe5b687, 0xe5b684,
+ /* d1 */ 0xe5b682, 0xe5b6a2, 0xe5b69d, 0xe5b6ac,
+ /* d5 */ 0xe5b6ae, 0xe5b6bd, 0xe5b690, 0xe5b6b7,
+ /* d9 */ 0xe5b6bc, 0xe5b789, 0xe5b78d, 0xe5b793,
+ /* dd */ 0xe5b792, 0xe5b796, 0xe5b79b, 0xe5b7ab,
+ /* e1 */ 0xe5b7b2, 0xe5b7b5, 0xe5b88b, 0xe5b89a,
+ /* e5 */ 0xe5b899, 0xe5b891, 0xe5b89b, 0xe5b8b6,
+ /* e9 */ 0xe5b8b7, 0xe5b984, 0xe5b983, 0xe5b980,
+ /* ed */ 0xe5b98e, 0xe5b997, 0xe5b994, 0xe5b99f,
+ /* f1 */ 0xe5b9a2, 0xe5b9a4, 0xe5b987, 0xe5b9b5,
+ /* f5 */ 0xe5b9b6, 0xe5b9ba, 0xe9babc, 0xe5b9bf,
+ /* f9 */ 0xe5baa0, 0xe5bb81, 0xe5bb82, 0xe5bb88,
+ /* fd */ 0xe5bb90, 0xe5bb8f,
+
+ /*** Two byte table, leaf: d7xx - offset 0x012cc ***/
+
+ /* a1 */ 0xe5bb96, 0xe5bba3, 0xe5bb9d, 0xe5bb9a,
+ /* a5 */ 0xe5bb9b, 0xe5bba2, 0xe5bba1, 0xe5bba8,
+ /* a9 */ 0xe5bba9, 0xe5bbac, 0xe5bbb1, 0xe5bbb3,
+ /* ad */ 0xe5bbb0, 0xe5bbb4, 0xe5bbb8, 0xe5bbbe,
+ /* b1 */ 0xe5bc83, 0xe5bc89, 0xe5bd9d, 0xe5bd9c,
+ /* b5 */ 0xe5bc8b, 0xe5bc91, 0xe5bc96, 0xe5bca9,
+ /* b9 */ 0xe5bcad, 0xe5bcb8, 0xe5bd81, 0xe5bd88,
+ /* bd */ 0xe5bd8c, 0xe5bd8e, 0xe5bcaf, 0xe5bd91,
+ /* c1 */ 0xe5bd96, 0xe5bd97, 0xe5bd99, 0xe5bda1,
+ /* c5 */ 0xe5bdad, 0xe5bdb3, 0xe5bdb7, 0xe5be83,
+ /* c9 */ 0xe5be82, 0xe5bdbf, 0xe5be8a, 0xe5be88,
+ /* cd */ 0xe5be91, 0xe5be87, 0xe5be9e, 0xe5be99,
+ /* d1 */ 0xe5be98, 0xe5bea0, 0xe5bea8, 0xe5bead,
+ /* d5 */ 0xe5bebc, 0xe5bf96, 0xe5bfbb, 0xe5bfa4,
+ /* d9 */ 0xe5bfb8, 0xe5bfb1, 0xe5bf9d, 0xe682b3,
+ /* dd */ 0xe5bfbf, 0xe680a1, 0xe681a0, 0xe68099,
+ /* e1 */ 0xe68090, 0xe680a9, 0xe6808e, 0xe680b1,
+ /* e5 */ 0xe6809b, 0xe68095, 0xe680ab, 0xe680a6,
+ /* e9 */ 0xe6808f, 0xe680ba, 0xe6819a, 0xe68181,
+ /* ed */ 0xe681aa, 0xe681b7, 0xe6819f, 0xe6818a,
+ /* f1 */ 0xe68186, 0xe6818d, 0xe681a3, 0xe68183,
+ /* f5 */ 0xe681a4, 0xe68182, 0xe681ac, 0xe681ab,
+ /* f9 */ 0xe68199, 0xe68281, 0xe6828d, 0xe683a7,
+ /* fd */ 0xe68283, 0xe6829a,
+
+ /*** Two byte table, leaf: d8xx - offset 0x0132a ***/
+
+ /* a1 */ 0xe68284, 0xe6829b, 0xe68296, 0xe68297,
+ /* a5 */ 0xe68292, 0xe682a7, 0xe6828b, 0xe683a1,
+ /* a9 */ 0xe682b8, 0xe683a0, 0xe68393, 0xe682b4,
+ /* ad */ 0xe5bfb0, 0xe682bd, 0xe68386, 0xe682b5,
+ /* b1 */ 0xe68398, 0xe6858d, 0xe68495, 0xe68486,
+ /* b5 */ 0xe683b6, 0xe683b7, 0xe68480, 0xe683b4,
+ /* b9 */ 0xe683ba, 0xe68483, 0xe684a1, 0xe683bb,
+ /* bd */ 0xe683b1, 0xe6848d, 0xe6848e, 0xe68587,
+ /* c1 */ 0xe684be, 0xe684a8, 0xe684a7, 0xe6858a,
+ /* c5 */ 0xe684bf, 0xe684bc, 0xe684ac, 0xe684b4,
+ /* c9 */ 0xe684bd, 0xe68582, 0xe68584, 0xe685b3,
+ /* cd */ 0xe685b7, 0xe68598, 0xe68599, 0xe6859a,
+ /* d1 */ 0xe685ab, 0xe685b4, 0xe685af, 0xe685a5,
+ /* d5 */ 0xe685b1, 0xe6859f, 0xe6859d, 0xe68593,
+ /* d9 */ 0xe685b5, 0xe68699, 0xe68696, 0xe68687,
+ /* dd */ 0xe686ac, 0xe68694, 0xe6869a, 0xe6868a,
+ /* e1 */ 0xe68691, 0xe686ab, 0xe686ae, 0xe6878c,
+ /* e5 */ 0xe6878a, 0xe68789, 0xe687b7, 0xe68788,
+ /* e9 */ 0xe68783, 0xe68786, 0xe686ba, 0xe6878b,
+ /* ed */ 0xe7bdb9, 0xe6878d, 0xe687a6, 0xe687a3,
+ /* f1 */ 0xe687b6, 0xe687ba, 0xe687b4, 0xe687bf,
+ /* f5 */ 0xe687bd, 0xe687bc, 0xe687be, 0xe68880,
+ /* f9 */ 0xe68888, 0xe68889, 0xe6888d, 0xe6888c,
+ /* fd */ 0xe68894, 0xe6889b,
+
+ /*** Two byte table, leaf: d9xx - offset 0x01388 ***/
+
+ /* a1 */ 0xe6889e, 0xe688a1, 0xe688aa, 0xe688ae,
+ /* a5 */ 0xe688b0, 0xe688b2, 0xe688b3, 0xe68981,
+ /* a9 */ 0xe6898e, 0xe6899e, 0xe689a3, 0xe6899b,
+ /* ad */ 0xe689a0, 0xe689a8, 0xe689bc, 0xe68a82,
+ /* b1 */ 0xe68a89, 0xe689be, 0xe68a92, 0xe68a93,
+ /* b5 */ 0xe68a96, 0xe68b94, 0xe68a83, 0xe68a94,
+ /* b9 */ 0xe68b97, 0xe68b91, 0xe68abb, 0xe68b8f,
+ /* bd */ 0xe68bbf, 0xe68b86, 0xe69394, 0xe68b88,
+ /* c1 */ 0xe68b9c, 0xe68b8c, 0xe68b8a, 0xe68b82,
+ /* c5 */ 0xe68b87, 0xe68a9b, 0xe68b89, 0xe68c8c,
+ /* c9 */ 0xe68bae, 0xe68bb1, 0xe68ca7, 0xe68c82,
+ /* cd */ 0xe68c88, 0xe68baf, 0xe68bb5, 0xe68d90,
+ /* d1 */ 0xe68cbe, 0xe68d8d, 0xe6909c, 0xe68d8f,
+ /* d5 */ 0xe68e96, 0xe68e8e, 0xe68e80, 0xe68eab,
+ /* d9 */ 0xe68db6, 0xe68ea3, 0xe68e8f, 0xe68e89,
+ /* dd */ 0xe68e9f, 0xe68eb5, 0xe68dab, 0xe68da9,
+ /* e1 */ 0xe68ebe, 0xe68fa9, 0xe68f80, 0xe68f86,
+ /* e5 */ 0xe68fa3, 0xe68f89, 0xe68f92, 0xe68fb6,
+ /* e9 */ 0xe68f84, 0xe69096, 0xe690b4, 0xe69086,
+ /* ed */ 0xe69093, 0xe690a6, 0xe690b6, 0xe6949d,
+ /* f1 */ 0xe69097, 0xe690a8, 0xe6908f, 0xe691a7,
+ /* f5 */ 0xe691af, 0xe691b6, 0xe6918e, 0xe694aa,
+ /* f9 */ 0xe69295, 0xe69293, 0xe692a5, 0xe692a9,
+ /* fd */ 0xe69288, 0xe692bc,
+
+ /*** Two byte table, leaf: daxx - offset 0x013e6 ***/
+
+ /* a1 */ 0xe6939a, 0xe69392, 0xe69385, 0xe69387,
+ /* a5 */ 0xe692bb, 0xe69398, 0xe69382, 0xe693b1,
+ /* a9 */ 0xe693a7, 0xe88889, 0xe693a0, 0xe693a1,
+ /* ad */ 0xe68aac, 0xe693a3, 0xe693af, 0xe694ac,
+ /* b1 */ 0xe693b6, 0xe693b4, 0xe693b2, 0xe693ba,
+ /* b5 */ 0xe69480, 0xe693bd, 0xe69498, 0xe6949c,
+ /* b9 */ 0xe69485, 0xe694a4, 0xe694a3, 0xe694ab,
+ /* bd */ 0xe694b4, 0xe694b5, 0xe694b7, 0xe694b6,
+ /* c1 */ 0xe694b8, 0xe7958b, 0xe69588, 0xe69596,
+ /* c5 */ 0xe69595, 0xe6958d, 0xe69598, 0xe6959e,
+ /* c9 */ 0xe6959d, 0xe695b2, 0xe695b8, 0xe69682,
+ /* cd */ 0xe69683, 0xe8ae8a, 0xe6969b, 0xe6969f,
+ /* d1 */ 0xe696ab, 0xe696b7, 0xe69783, 0xe69786,
+ /* d5 */ 0xe69781, 0xe69784, 0xe6978c, 0xe69792,
+ /* d9 */ 0xe6979b, 0xe69799, 0xe697a0, 0xe697a1,
+ /* dd */ 0xe697b1, 0xe69db2, 0xe6988a, 0xe69883,
+ /* e1 */ 0xe697bb, 0xe69db3, 0xe698b5, 0xe698b6,
+ /* e5 */ 0xe698b4, 0xe6989c, 0xe6998f, 0xe69984,
+ /* e9 */ 0xe69989, 0xe69981, 0xe6999e, 0xe6999d,
+ /* ed */ 0xe699a4, 0xe699a7, 0xe699a8, 0xe6999f,
+ /* f1 */ 0xe699a2, 0xe699b0, 0xe69a83, 0xe69a88,
+ /* f5 */ 0xe69a8e, 0xe69a89, 0xe69a84, 0xe69a98,
+ /* f9 */ 0xe69a9d, 0xe69b81, 0xe69ab9, 0xe69b89,
+ /* fd */ 0xe69abe, 0xe69abc,
+
+ /*** Two byte table, leaf: dbxx - offset 0x01444 ***/
+
+ /* a1 */ 0xe69b84, 0xe69ab8, 0xe69b96, 0xe69b9a,
+ /* a5 */ 0xe69ba0, 0xe698bf, 0xe69ba6, 0xe69ba9,
+ /* a9 */ 0xe69bb0, 0xe69bb5, 0xe69bb7, 0xe69c8f,
+ /* ad */ 0xe69c96, 0xe69c9e, 0xe69ca6, 0xe69ca7,
+ /* b1 */ 0xe99cb8, 0xe69cae, 0xe69cbf, 0xe69cb6,
+ /* b5 */ 0xe69d81, 0xe69cb8, 0xe69cb7, 0xe69d86,
+ /* b9 */ 0xe69d9e, 0xe69da0, 0xe69d99, 0xe69da3,
+ /* bd */ 0xe69da4, 0xe69e89, 0xe69db0, 0xe69ea9,
+ /* c1 */ 0xe69dbc, 0xe69daa, 0xe69e8c, 0xe69e8b,
+ /* c5 */ 0xe69ea6, 0xe69ea1, 0xe69e85, 0xe69eb7,
+ /* c9 */ 0xe69faf, 0xe69eb4, 0xe69fac, 0xe69eb3,
+ /* cd */ 0xe69fa9, 0xe69eb8, 0xe69fa4, 0xe69f9e,
+ /* d1 */ 0xe69f9d, 0xe69fa2, 0xe69fae, 0xe69eb9,
+ /* d5 */ 0xe69f8e, 0xe69f86, 0xe69fa7, 0xe6aa9c,
+ /* d9 */ 0xe6a09e, 0xe6a186, 0xe6a0a9, 0xe6a180,
+ /* dd */ 0xe6a18d, 0xe6a0b2, 0xe6a18e, 0xe6a2b3,
+ /* e1 */ 0xe6a0ab, 0xe6a199, 0xe6a1a3, 0xe6a1b7,
+ /* e5 */ 0xe6a1bf, 0xe6a29f, 0xe6a28f, 0xe6a2ad,
+ /* e9 */ 0xe6a294, 0xe6a29d, 0xe6a29b, 0xe6a283,
+ /* ed */ 0xe6aaae, 0xe6a2b9, 0xe6a1b4, 0xe6a2b5,
+ /* f1 */ 0xe6a2a0, 0xe6a2ba, 0xe6a48f, 0xe6a28d,
+ /* f5 */ 0xe6a1be, 0xe6a481, 0xe6a38a, 0xe6a488,
+ /* f9 */ 0xe6a398, 0xe6a4a2, 0xe6a4a6, 0xe6a3a1,
+ /* fd */ 0xe6a48c, 0xe6a38d,
+
+ /*** Two byte table, leaf: dcxx - offset 0x014a2 ***/
+
+ /* a1 */ 0xe6a394, 0xe6a3a7, 0xe6a395, 0xe6a4b6,
+ /* a5 */ 0xe6a492, 0xe6a484, 0xe6a397, 0xe6a3a3,
+ /* a9 */ 0xe6a4a5, 0xe6a3b9, 0xe6a3a0, 0xe6a3af,
+ /* ad */ 0xe6a4a8, 0xe6a4aa, 0xe6a49a, 0xe6a4a3,
+ /* b1 */ 0xe6a4a1, 0xe6a386, 0xe6a5b9, 0xe6a5b7,
+ /* b5 */ 0xe6a59c, 0xe6a5b8, 0xe6a5ab, 0xe6a594,
+ /* b9 */ 0xe6a5be, 0xe6a5ae, 0xe6a4b9, 0xe6a5b4,
+ /* bd */ 0xe6a4bd, 0xe6a599, 0xe6a4b0, 0xe6a5a1,
+ /* c1 */ 0xe6a59e, 0xe6a59d, 0xe6a681, 0xe6a5aa,
+ /* c5 */ 0xe6a6b2, 0xe6a6ae, 0xe6a790, 0xe6a6bf,
+ /* c9 */ 0xe6a781, 0xe6a793, 0xe6a6be, 0xe6a78e,
+ /* cd */ 0xe5afa8, 0xe6a78a, 0xe6a79d, 0xe6a6bb,
+ /* d1 */ 0xe6a783, 0xe6a6a7, 0xe6a8ae, 0xe6a691,
+ /* d5 */ 0xe6a6a0, 0xe6a69c, 0xe6a695, 0xe6a6b4,
+ /* d9 */ 0xe6a79e, 0xe6a7a8, 0xe6a882, 0xe6a89b,
+ /* dd */ 0xe6a7bf, 0xe6ac8a, 0xe6a7b9, 0xe6a7b2,
+ /* e1 */ 0xe6a7a7, 0xe6a885, 0xe6a6b1, 0xe6a89e,
+ /* e5 */ 0xe6a7ad, 0xe6a894, 0xe6a7ab, 0xe6a88a,
+ /* e9 */ 0xe6a892, 0xe6ab81, 0xe6a8a3, 0xe6a893,
+ /* ed */ 0xe6a984, 0xe6a88c, 0xe6a9b2, 0xe6a8b6,
+ /* f1 */ 0xe6a9b8, 0xe6a987, 0xe6a9a2, 0xe6a999,
+ /* f5 */ 0xe6a9a6, 0xe6a988, 0xe6a8b8, 0xe6a8a2,
+ /* f9 */ 0xe6aa90, 0xe6aa8d, 0xe6aaa0, 0xe6aa84,
+ /* fd */ 0xe6aaa2, 0xe6aaa3,
+
+ /*** Two byte table, leaf: ddxx - offset 0x01500 ***/
+
+ /* a1 */ 0xe6aa97, 0xe89897, 0xe6aabb, 0xe6ab83,
+ /* a5 */ 0xe6ab82, 0xe6aab8, 0xe6aab3, 0xe6aaac,
+ /* a9 */ 0xe6ab9e, 0xe6ab91, 0xe6ab9f, 0xe6aaaa,
+ /* ad */ 0xe6ab9a, 0xe6abaa, 0xe6abbb, 0xe6ac85,
+ /* b1 */ 0xe89896, 0xe6abba, 0xe6ac92, 0xe6ac96,
+ /* b5 */ 0xe9acb1, 0xe6ac9f, 0xe6acb8, 0xe6acb7,
+ /* b9 */ 0xe79b9c, 0xe6acb9, 0xe9a3ae, 0xe6ad87,
+ /* bd */ 0xe6ad83, 0xe6ad89, 0xe6ad90, 0xe6ad99,
+ /* c1 */ 0xe6ad94, 0xe6ad9b, 0xe6ad9f, 0xe6ada1,
+ /* c5 */ 0xe6adb8, 0xe6adb9, 0xe6adbf, 0xe6ae80,
+ /* c9 */ 0xe6ae84, 0xe6ae83, 0xe6ae8d, 0xe6ae98,
+ /* cd */ 0xe6ae95, 0xe6ae9e, 0xe6aea4, 0xe6aeaa,
+ /* d1 */ 0xe6aeab, 0xe6aeaf, 0xe6aeb2, 0xe6aeb1,
+ /* d5 */ 0xe6aeb3, 0xe6aeb7, 0xe6aebc, 0xe6af86,
+ /* d9 */ 0xe6af8b, 0xe6af93, 0xe6af9f, 0xe6afac,
+ /* dd */ 0xe6afab, 0xe6afb3, 0xe6afaf, 0xe9babe,
+ /* e1 */ 0xe6b088, 0xe6b093, 0xe6b094, 0xe6b09b,
+ /* e5 */ 0xe6b0a4, 0xe6b0a3, 0xe6b19e, 0xe6b195,
+ /* e9 */ 0xe6b1a2, 0xe6b1aa, 0xe6b282, 0xe6b28d,
+ /* ed */ 0xe6b29a, 0xe6b281, 0xe6b29b, 0xe6b1be,
+ /* f1 */ 0xe6b1a8, 0xe6b1b3, 0xe6b292, 0xe6b290,
+ /* f5 */ 0xe6b384, 0xe6b3b1, 0xe6b393, 0xe6b2bd,
+ /* f9 */ 0xe6b397, 0xe6b385, 0xe6b39d, 0xe6b2ae,
+ /* fd */ 0xe6b2b1, 0xe6b2be,
+
+ /*** Two byte table, leaf: dexx - offset 0x0155e ***/
+
+ /* a1 */ 0xe6b2ba, 0xe6b39b, 0xe6b3af, 0xe6b399,
+ /* a5 */ 0xe6b3aa, 0xe6b49f, 0xe8a18d, 0xe6b4b6,
+ /* a9 */ 0xe6b4ab, 0xe6b4bd, 0xe6b4b8, 0xe6b499,
+ /* ad */ 0xe6b4b5, 0xe6b4b3, 0xe6b492, 0xe6b48c,
+ /* b1 */ 0xe6b5a3, 0xe6b693, 0xe6b5a4, 0xe6b59a,
+ /* b5 */ 0xe6b5b9, 0xe6b599, 0xe6b68e, 0xe6b695,
+ /* b9 */ 0xe6bfa4, 0xe6b685, 0xe6b7b9, 0xe6b895,
+ /* bd */ 0xe6b88a, 0xe6b6b5, 0xe6b787, 0xe6b7a6,
+ /* c1 */ 0xe6b6b8, 0xe6b786, 0xe6b7ac, 0xe6b79e,
+ /* c5 */ 0xe6b78c, 0xe6b7a8, 0xe6b792, 0xe6b785,
+ /* c9 */ 0xe6b7ba, 0xe6b799, 0xe6b7a4, 0xe6b795,
+ /* cd */ 0xe6b7aa, 0xe6b7ae, 0xe6b8ad, 0xe6b9ae,
+ /* d1 */ 0xe6b8ae, 0xe6b899, 0xe6b9b2, 0xe6b99f,
+ /* d5 */ 0xe6b8be, 0xe6b8a3, 0xe6b9ab, 0xe6b8ab,
+ /* d9 */ 0xe6b9b6, 0xe6b98d, 0xe6b89f, 0xe6b983,
+ /* dd */ 0xe6b8ba, 0xe6b98e, 0xe6b8a4, 0xe6bbbf,
+ /* e1 */ 0xe6b89d, 0xe6b8b8, 0xe6ba82, 0xe6baaa,
+ /* e5 */ 0xe6ba98, 0xe6bb89, 0xe6bab7, 0xe6bb93,
+ /* e9 */ 0xe6babd, 0xe6baaf, 0xe6bb84, 0xe6bab2,
+ /* ed */ 0xe6bb94, 0xe6bb95, 0xe6ba8f, 0xe6baa5,
+ /* f1 */ 0xe6bb82, 0xe6ba9f, 0xe6bd81, 0xe6bc91,
+ /* f5 */ 0xe7818c, 0xe6bbac, 0xe6bbb8, 0xe6bbbe,
+ /* f9 */ 0xe6bcbf, 0xe6bbb2, 0xe6bcb1, 0xe6bbaf,
+ /* fd */ 0xe6bcb2, 0xe6bb8c,
+
+ /*** Two byte table, leaf: dfxx - offset 0x015bc ***/
+
+ /* a1 */ 0xe6bcbe, 0xe6bc93, 0xe6bbb7, 0xe6be86,
+ /* a5 */ 0xe6bdba, 0xe6bdb8, 0xe6be81, 0xe6be80,
+ /* a9 */ 0xe6bdaf, 0xe6bd9b, 0xe6bfb3, 0xe6bdad,
+ /* ad */ 0xe6be82, 0xe6bdbc, 0xe6bd98, 0xe6be8e,
+ /* b1 */ 0xe6be91, 0xe6bf82, 0xe6bda6, 0xe6beb3,
+ /* b5 */ 0xe6bea3, 0xe6bea1, 0xe6bea4, 0xe6beb9,
+ /* b9 */ 0xe6bf86, 0xe6beaa, 0xe6bf9f, 0xe6bf95,
+ /* bd */ 0xe6bfac, 0xe6bf94, 0xe6bf98, 0xe6bfb1,
+ /* c1 */ 0xe6bfae, 0xe6bf9b, 0xe78089, 0xe7808b,
+ /* c5 */ 0xe6bfba, 0xe78091, 0xe78081, 0xe7808f,
+ /* c9 */ 0xe6bfbe, 0xe7809b, 0xe7809a, 0xe6bdb4,
+ /* cd */ 0xe7809d, 0xe78098, 0xe7809f, 0xe780b0,
+ /* d1 */ 0xe780be, 0xe780b2, 0xe78191, 0xe781a3,
+ /* d5 */ 0xe78299, 0xe78292, 0xe782af, 0xe783b1,
+ /* d9 */ 0xe782ac, 0xe782b8, 0xe782b3, 0xe782ae,
+ /* dd */ 0xe7839f, 0xe7838b, 0xe7839d, 0xe78399,
+ /* e1 */ 0xe78489, 0xe783bd, 0xe7849c, 0xe78499,
+ /* e5 */ 0xe785a5, 0xe78595, 0xe78688, 0xe785a6,
+ /* e9 */ 0xe785a2, 0xe7858c, 0xe78596, 0xe785ac,
+ /* ed */ 0xe7868f, 0xe787bb, 0xe78684, 0xe78695,
+ /* f1 */ 0xe786a8, 0xe786ac, 0xe78797, 0xe786b9,
+ /* f5 */ 0xe786be, 0xe78792, 0xe78789, 0xe78794,
+ /* f9 */ 0xe7878e, 0xe787a0, 0xe787ac, 0xe787a7,
+ /* fd */ 0xe787b5, 0xe787bc,
+
+ /*** Two byte table, leaf: e0xx - offset 0x0161a ***/
+
+ /* a1 */ 0xe787b9, 0xe787bf, 0xe7888d, 0xe78890,
+ /* a5 */ 0xe7889b, 0xe788a8, 0xe788ad, 0xe788ac,
+ /* a9 */ 0xe788b0, 0xe788b2, 0xe788bb, 0xe788bc,
+ /* ad */ 0xe788bf, 0xe78980, 0xe78986, 0xe7898b,
+ /* b1 */ 0xe78998, 0xe789b4, 0xe789be, 0xe78a82,
+ /* b5 */ 0xe78a81, 0xe78a87, 0xe78a92, 0xe78a96,
+ /* b9 */ 0xe78aa2, 0xe78aa7, 0xe78ab9, 0xe78ab2,
+ /* bd */ 0xe78b83, 0xe78b86, 0xe78b84, 0xe78b8e,
+ /* c1 */ 0xe78b92, 0xe78ba2, 0xe78ba0, 0xe78ba1,
+ /* c5 */ 0xe78bb9, 0xe78bb7, 0xe5808f, 0xe78c97,
+ /* c9 */ 0xe78c8a, 0xe78c9c, 0xe78c96, 0xe78c9d,
+ /* cd */ 0xe78cb4, 0xe78caf, 0xe78ca9, 0xe78ca5,
+ /* d1 */ 0xe78cbe, 0xe78d8e, 0xe78d8f, 0xe9bb98,
+ /* d5 */ 0xe78d97, 0xe78daa, 0xe78da8, 0xe78db0,
+ /* d9 */ 0xe78db8, 0xe78db5, 0xe78dbb, 0xe78dba,
+ /* dd */ 0xe78f88, 0xe78eb3, 0xe78f8e, 0xe78ebb,
+ /* e1 */ 0xe78f80, 0xe78fa5, 0xe78fae, 0xe78f9e,
+ /* e5 */ 0xe792a2, 0xe79085, 0xe791af, 0xe790a5,
+ /* e9 */ 0xe78fb8, 0xe790b2, 0xe790ba, 0xe79195,
+ /* ed */ 0xe790bf, 0xe7919f, 0xe79199, 0xe79181,
+ /* f1 */ 0xe7919c, 0xe791a9, 0xe791b0, 0xe791a3,
+ /* f5 */ 0xe791aa, 0xe791b6, 0xe791be, 0xe7928b,
+ /* f9 */ 0xe7929e, 0xe792a7, 0xe7938a, 0xe7938f,
+ /* fd */ 0xe79394, 0xe78fb1,
+
+ /*** Two byte table, leaf: e1xx - offset 0x01678 ***/
+
+ /* a1 */ 0xe793a0, 0xe793a3, 0xe793a7, 0xe793a9,
+ /* a5 */ 0xe793ae, 0xe793b2, 0xe793b0, 0xe793b1,
+ /* a9 */ 0xe793b8, 0xe793b7, 0xe79484, 0xe79483,
+ /* ad */ 0xe79485, 0xe7948c, 0xe7948e, 0xe7948d,
+ /* b1 */ 0xe79495, 0xe79493, 0xe7949e, 0xe794a6,
+ /* b5 */ 0xe794ac, 0xe794bc, 0xe79584, 0xe7958d,
+ /* b9 */ 0xe7958a, 0xe79589, 0xe7959b, 0xe79586,
+ /* bd */ 0xe7959a, 0xe795a9, 0xe795a4, 0xe795a7,
+ /* c1 */ 0xe795ab, 0xe795ad, 0xe795b8, 0xe795b6,
+ /* c5 */ 0xe79686, 0xe79687, 0xe795b4, 0xe7968a,
+ /* c9 */ 0xe79689, 0xe79682, 0xe79694, 0xe7969a,
+ /* cd */ 0xe7969d, 0xe796a5, 0xe796a3, 0xe79782,
+ /* d1 */ 0xe796b3, 0xe79783, 0xe796b5, 0xe796bd,
+ /* d5 */ 0xe796b8, 0xe796bc, 0xe796b1, 0xe7978d,
+ /* d9 */ 0xe7978a, 0xe79792, 0xe79799, 0xe797a3,
+ /* dd */ 0xe7979e, 0xe797be, 0xe797bf, 0xe797bc,
+ /* e1 */ 0xe79881, 0xe797b0, 0xe797ba, 0xe797b2,
+ /* e5 */ 0xe797b3, 0xe7988b, 0xe7988d, 0xe79889,
+ /* e9 */ 0xe7989f, 0xe798a7, 0xe798a0, 0xe798a1,
+ /* ed */ 0xe798a2, 0xe798a4, 0xe798b4, 0xe798b0,
+ /* f1 */ 0xe798bb, 0xe79987, 0xe79988, 0xe79986,
+ /* f5 */ 0xe7999c, 0xe79998, 0xe799a1, 0xe799a2,
+ /* f9 */ 0xe799a8, 0xe799a9, 0xe799aa, 0xe799a7,
+ /* fd */ 0xe799ac, 0xe799b0,
+
+ /*** Two byte table, leaf: e2xx - offset 0x016d6 ***/
+
+ /* a1 */ 0xe799b2, 0xe799b6, 0xe799b8, 0xe799bc,
+ /* a5 */ 0xe79a80, 0xe79a83, 0xe79a88, 0xe79a8b,
+ /* a9 */ 0xe79a8e, 0xe79a96, 0xe79a93, 0xe79a99,
+ /* ad */ 0xe79a9a, 0xe79ab0, 0xe79ab4, 0xe79ab8,
+ /* b1 */ 0xe79ab9, 0xe79aba, 0xe79b82, 0xe79b8d,
+ /* b5 */ 0xe79b96, 0xe79b92, 0xe79b9e, 0xe79ba1,
+ /* b9 */ 0xe79ba5, 0xe79ba7, 0xe79baa, 0xe898af,
+ /* bd */ 0xe79bbb, 0xe79c88, 0xe79c87, 0xe79c84,
+ /* c1 */ 0xe79ca9, 0xe79ca4, 0xe79c9e, 0xe79ca5,
+ /* c5 */ 0xe79ca6, 0xe79c9b, 0xe79cb7, 0xe79cb8,
+ /* c9 */ 0xe79d87, 0xe79d9a, 0xe79da8, 0xe79dab,
+ /* cd */ 0xe79d9b, 0xe79da5, 0xe79dbf, 0xe79dbe,
+ /* d1 */ 0xe79db9, 0xe79e8e, 0xe79e8b, 0xe79e91,
+ /* d5 */ 0xe79ea0, 0xe79e9e, 0xe79eb0, 0xe79eb6,
+ /* d9 */ 0xe79eb9, 0xe79ebf, 0xe79ebc, 0xe79ebd,
+ /* dd */ 0xe79ebb, 0xe79f87, 0xe79f8d, 0xe79f97,
+ /* e1 */ 0xe79f9a, 0xe79f9c, 0xe79fa3, 0xe79fae,
+ /* e5 */ 0xe79fbc, 0xe7a08c, 0xe7a092, 0xe7a4a6,
+ /* e9 */ 0xe7a0a0, 0xe7a4aa, 0xe7a185, 0xe7a28e,
+ /* ed */ 0xe7a1b4, 0xe7a286, 0xe7a1bc, 0xe7a29a,
+ /* f1 */ 0xe7a28c, 0xe7a2a3, 0xe7a2b5, 0xe7a2aa,
+ /* f5 */ 0xe7a2af, 0xe7a391, 0xe7a386, 0xe7a38b,
+ /* f9 */ 0xe7a394, 0xe7a2be, 0xe7a2bc, 0xe7a385,
+ /* fd */ 0xe7a38a, 0xe7a3ac,
+
+ /*** Two byte table, leaf: e3xx - offset 0x01734 ***/
+
+ /* a1 */ 0xe7a3a7, 0xe7a39a, 0xe7a3bd, 0xe7a3b4,
+ /* a5 */ 0xe7a487, 0xe7a492, 0xe7a491, 0xe7a499,
+ /* a9 */ 0xe7a4ac, 0xe7a4ab, 0xe7a580, 0xe7a5a0,
+ /* ad */ 0xe7a597, 0xe7a59f, 0xe7a59a, 0xe7a595,
+ /* b1 */ 0xe7a593, 0xe7a5ba, 0xe7a5bf, 0xe7a68a,
+ /* b5 */ 0xe7a69d, 0xe7a6a7, 0xe9bd8b, 0xe7a6aa,
+ /* b9 */ 0xe7a6ae, 0xe7a6b3, 0xe7a6b9, 0xe7a6ba,
+ /* bd */ 0xe7a789, 0xe7a795, 0xe7a7a7, 0xe7a7ac,
+ /* c1 */ 0xe7a7a1, 0xe7a7a3, 0xe7a888, 0xe7a88d,
+ /* c5 */ 0xe7a898, 0xe7a899, 0xe7a8a0, 0xe7a89f,
+ /* c9 */ 0xe7a680, 0xe7a8b1, 0xe7a8bb, 0xe7a8be,
+ /* cd */ 0xe7a8b7, 0xe7a983, 0xe7a997, 0xe7a989,
+ /* d1 */ 0xe7a9a1, 0xe7a9a2, 0xe7a9a9, 0xe9be9d,
+ /* d5 */ 0xe7a9b0, 0xe7a9b9, 0xe7a9bd, 0xe7aa88,
+ /* d9 */ 0xe7aa97, 0xe7aa95, 0xe7aa98, 0xe7aa96,
+ /* dd */ 0xe7aaa9, 0xe7ab88, 0xe7aab0, 0xe7aab6,
+ /* e1 */ 0xe7ab85, 0xe7ab84, 0xe7aabf, 0xe98283,
+ /* e5 */ 0xe7ab87, 0xe7ab8a, 0xe7ab8d, 0xe7ab8f,
+ /* e9 */ 0xe7ab95, 0xe7ab93, 0xe7ab99, 0xe7ab9a,
+ /* ed */ 0xe7ab9d, 0xe7aba1, 0xe7aba2, 0xe7aba6,
+ /* f1 */ 0xe7abad, 0xe7abb0, 0xe7ac82, 0xe7ac8f,
+ /* f5 */ 0xe7ac8a, 0xe7ac86, 0xe7acb3, 0xe7ac98,
+ /* f9 */ 0xe7ac99, 0xe7ac9e, 0xe7acb5, 0xe7aca8,
+ /* fd */ 0xe7acb6, 0xe7ad90,
+
+ /*** Two byte table, leaf: e4xx - offset 0x01792 ***/
+
+ /* a1 */ 0xe7adba, 0xe7ac84, 0xe7ad8d, 0xe7ac8b,
+ /* a5 */ 0xe7ad8c, 0xe7ad85, 0xe7adb5, 0xe7ada5,
+ /* a9 */ 0xe7adb4, 0xe7ada7, 0xe7adb0, 0xe7adb1,
+ /* ad */ 0xe7adac, 0xe7adae, 0xe7ae9d, 0xe7ae98,
+ /* b1 */ 0xe7ae9f, 0xe7ae8d, 0xe7ae9c, 0xe7ae9a,
+ /* b5 */ 0xe7ae8b, 0xe7ae92, 0xe7ae8f, 0xe7ad9d,
+ /* b9 */ 0xe7ae99, 0xe7af8b, 0xe7af81, 0xe7af8c,
+ /* bd */ 0xe7af8f, 0xe7aeb4, 0xe7af86, 0xe7af9d,
+ /* c1 */ 0xe7afa9, 0xe7b091, 0xe7b094, 0xe7afa6,
+ /* c5 */ 0xe7afa5, 0xe7b1a0, 0xe7b080, 0xe7b087,
+ /* c9 */ 0xe7b093, 0xe7afb3, 0xe7afb7, 0xe7b097,
+ /* cd */ 0xe7b08d, 0xe7afb6, 0xe7b0a3, 0xe7b0a7,
+ /* d1 */ 0xe7b0aa, 0xe7b09f, 0xe7b0b7, 0xe7b0ab,
+ /* d5 */ 0xe7b0bd, 0xe7b18c, 0xe7b183, 0xe7b194,
+ /* d9 */ 0xe7b18f, 0xe7b180, 0xe7b190, 0xe7b198,
+ /* dd */ 0xe7b19f, 0xe7b1a4, 0xe7b196, 0xe7b1a5,
+ /* e1 */ 0xe7b1ac, 0xe7b1b5, 0xe7b283, 0xe7b290,
+ /* e5 */ 0xe7b2a4, 0xe7b2ad, 0xe7b2a2, 0xe7b2ab,
+ /* e9 */ 0xe7b2a1, 0xe7b2a8, 0xe7b2b3, 0xe7b2b2,
+ /* ed */ 0xe7b2b1, 0xe7b2ae, 0xe7b2b9, 0xe7b2bd,
+ /* f1 */ 0xe7b380, 0xe7b385, 0xe7b382, 0xe7b398,
+ /* f5 */ 0xe7b392, 0xe7b39c, 0xe7b3a2, 0xe9acbb,
+ /* f9 */ 0xe7b3af, 0xe7b3b2, 0xe7b3b4, 0xe7b3b6,
+ /* fd */ 0xe7b3ba, 0xe7b486,
+
+ /*** Two byte table, leaf: e5xx - offset 0x017f0 ***/
+
+ /* a1 */ 0xe7b482, 0xe7b49c, 0xe7b495, 0xe7b48a,
+ /* a5 */ 0xe7b585, 0xe7b58b, 0xe7b4ae, 0xe7b4b2,
+ /* a9 */ 0xe7b4bf, 0xe7b4b5, 0xe7b586, 0xe7b5b3,
+ /* ad */ 0xe7b596, 0xe7b58e, 0xe7b5b2, 0xe7b5a8,
+ /* b1 */ 0xe7b5ae, 0xe7b58f, 0xe7b5a3, 0xe7b693,
+ /* b5 */ 0xe7b689, 0xe7b59b, 0xe7b68f, 0xe7b5bd,
+ /* b9 */ 0xe7b69b, 0xe7b6ba, 0xe7b6ae, 0xe7b6a3,
+ /* bd */ 0xe7b6b5, 0xe7b787, 0xe7b6bd, 0xe7b6ab,
+ /* c1 */ 0xe7b8bd, 0xe7b6a2, 0xe7b6af, 0xe7b79c,
+ /* c5 */ 0xe7b6b8, 0xe7b69f, 0xe7b6b0, 0xe7b798,
+ /* c9 */ 0xe7b79d, 0xe7b7a4, 0xe7b79e, 0xe7b7bb,
+ /* cd */ 0xe7b7b2, 0xe7b7a1, 0xe7b885, 0xe7b88a,
+ /* d1 */ 0xe7b8a3, 0xe7b8a1, 0xe7b892, 0xe7b8b1,
+ /* d5 */ 0xe7b89f, 0xe7b889, 0xe7b88b, 0xe7b8a2,
+ /* d9 */ 0xe7b986, 0xe7b9a6, 0xe7b8bb, 0xe7b8b5,
+ /* dd */ 0xe7b8b9, 0xe7b983, 0xe7b8b7, 0xe7b8b2,
+ /* e1 */ 0xe7b8ba, 0xe7b9a7, 0xe7b99d, 0xe7b996,
+ /* e5 */ 0xe7b99e, 0xe7b999, 0xe7b99a, 0xe7b9b9,
+ /* e9 */ 0xe7b9aa, 0xe7b9a9, 0xe7b9bc, 0xe7b9bb,
+ /* ed */ 0xe7ba83, 0xe7b795, 0xe7b9bd, 0xe8beae,
+ /* f1 */ 0xe7b9bf, 0xe7ba88, 0xe7ba89, 0xe7ba8c,
+ /* f5 */ 0xe7ba92, 0xe7ba90, 0xe7ba93, 0xe7ba94,
+ /* f9 */ 0xe7ba96, 0xe7ba8e, 0xe7ba9b, 0xe7ba9c,
+ /* fd */ 0xe7bcb8, 0xe7bcba,
+
+ /*** Two byte table, leaf: e6xx - offset 0x0184e ***/
+
+ /* a1 */ 0xe7bd85, 0xe7bd8c, 0xe7bd8d, 0xe7bd8e,
+ /* a5 */ 0xe7bd90, 0xe7bd91, 0xe7bd95, 0xe7bd94,
+ /* a9 */ 0xe7bd98, 0xe7bd9f, 0xe7bda0, 0xe7bda8,
+ /* ad */ 0xe7bda9, 0xe7bda7, 0xe7bdb8, 0xe7be82,
+ /* b1 */ 0xe7be86, 0xe7be83, 0xe7be88, 0xe7be87,
+ /* b5 */ 0xe7be8c, 0xe7be94, 0xe7be9e, 0xe7be9d,
+ /* b9 */ 0xe7be9a, 0xe7bea3, 0xe7beaf, 0xe7beb2,
+ /* bd */ 0xe7beb9, 0xe7beae, 0xe7beb6, 0xe7beb8,
+ /* c1 */ 0xe8adb1, 0xe7bf85, 0xe7bf86, 0xe7bf8a,
+ /* c5 */ 0xe7bf95, 0xe7bf94, 0xe7bfa1, 0xe7bfa6,
+ /* c9 */ 0xe7bfa9, 0xe7bfb3, 0xe7bfb9, 0xe9a39c,
+ /* cd */ 0xe88086, 0xe88084, 0xe8808b, 0xe88092,
+ /* d1 */ 0xe88098, 0xe88099, 0xe8809c, 0xe880a1,
+ /* d5 */ 0xe880a8, 0xe880bf, 0xe880bb, 0xe8818a,
+ /* d9 */ 0xe88186, 0xe88192, 0xe88198, 0xe8819a,
+ /* dd */ 0xe8819f, 0xe881a2, 0xe881a8, 0xe881b3,
+ /* e1 */ 0xe881b2, 0xe881b0, 0xe881b6, 0xe881b9,
+ /* e5 */ 0xe881bd, 0xe881bf, 0xe88284, 0xe88286,
+ /* e9 */ 0xe88285, 0xe8829b, 0xe88293, 0xe8829a,
+ /* ed */ 0xe882ad, 0xe58690, 0xe882ac, 0xe8839b,
+ /* f1 */ 0xe883a5, 0xe88399, 0xe8839d, 0xe88384,
+ /* f5 */ 0xe8839a, 0xe88396, 0xe88489, 0xe883af,
+ /* f9 */ 0xe883b1, 0xe8849b, 0xe884a9, 0xe884a3,
+ /* fd */ 0xe884af, 0xe8858b,
+
+ /*** Two byte table, leaf: e7xx - offset 0x018ac ***/
+
+ /* a1 */ 0xe99a8b, 0xe88586, 0xe884be, 0xe88593,
+ /* a5 */ 0xe88591, 0xe883bc, 0xe885b1, 0xe885ae,
+ /* a9 */ 0xe885a5, 0xe885a6, 0xe885b4, 0xe88683,
+ /* ad */ 0xe88688, 0xe8868a, 0xe88680, 0xe88682,
+ /* b1 */ 0xe886a0, 0xe88695, 0xe886a4, 0xe886a3,
+ /* b5 */ 0xe8859f, 0xe88693, 0xe886a9, 0xe886b0,
+ /* b9 */ 0xe886b5, 0xe886be, 0xe886b8, 0xe886bd,
+ /* bd */ 0xe88780, 0xe88782, 0xe886ba, 0xe88789,
+ /* c1 */ 0xe8878d, 0xe88791, 0xe88799, 0xe88798,
+ /* c5 */ 0xe88788, 0xe8879a, 0xe8879f, 0xe887a0,
+ /* c9 */ 0xe887a7, 0xe887ba, 0xe887bb, 0xe887be,
+ /* cd */ 0xe88881, 0xe88882, 0xe88885, 0xe88887,
+ /* d1 */ 0xe8888a, 0xe8888d, 0xe88890, 0xe88896,
+ /* d5 */ 0xe888a9, 0xe888ab, 0xe888b8, 0xe888b3,
+ /* d9 */ 0xe88980, 0xe88999, 0xe88998, 0xe8899d,
+ /* dd */ 0xe8899a, 0xe8899f, 0xe889a4, 0xe889a2,
+ /* e1 */ 0xe889a8, 0xe889aa, 0xe889ab, 0xe888ae,
+ /* e5 */ 0xe889b1, 0xe889b7, 0xe889b8, 0xe889be,
+ /* e9 */ 0xe88a8d, 0xe88a92, 0xe88aab, 0xe88a9f,
+ /* ed */ 0xe88abb, 0xe88aac, 0xe88ba1, 0xe88ba3,
+ /* f1 */ 0xe88b9f, 0xe88b92, 0xe88bb4, 0xe88bb3,
+ /* f5 */ 0xe88bba, 0xe88e93, 0xe88c83, 0xe88bbb,
+ /* f9 */ 0xe88bb9, 0xe88b9e, 0xe88c86, 0xe88b9c,
+ /* fd */ 0xe88c89, 0xe88b99,
+
+ /*** Two byte table, leaf: e8xx - offset 0x0190a ***/
+
+ /* a1 */ 0xe88cb5, 0xe88cb4, 0xe88c96, 0xe88cb2,
+ /* a5 */ 0xe88cb1, 0xe88d80, 0xe88cb9, 0xe88d90,
+ /* a9 */ 0xe88d85, 0xe88caf, 0xe88cab, 0xe88c97,
+ /* ad */ 0xe88c98, 0xe88e85, 0xe88e9a, 0xe88eaa,
+ /* b1 */ 0xe88e9f, 0xe88ea2, 0xe88e96, 0xe88ca3,
+ /* b5 */ 0xe88e8e, 0xe88e87, 0xe88e8a, 0xe88dbc,
+ /* b9 */ 0xe88eb5, 0xe88db3, 0xe88db5, 0xe88ea0,
+ /* bd */ 0xe88e89, 0xe88ea8, 0xe88fb4, 0xe89093,
+ /* c1 */ 0xe88fab, 0xe88f8e, 0xe88fbd, 0xe89083,
+ /* c5 */ 0xe88f98, 0xe8908b, 0xe88f81, 0xe88fb7,
+ /* c9 */ 0xe89087, 0xe88fa0, 0xe88fb2, 0xe8908d,
+ /* cd */ 0xe890a2, 0xe890a0, 0xe88ebd, 0xe890b8,
+ /* d1 */ 0xe89486, 0xe88fbb, 0xe891ad, 0xe890aa,
+ /* d5 */ 0xe890bc, 0xe8959a, 0xe89284, 0xe891b7,
+ /* d9 */ 0xe891ab, 0xe892ad, 0xe891ae, 0xe89282,
+ /* dd */ 0xe891a9, 0xe89186, 0xe890ac, 0xe891af,
+ /* e1 */ 0xe891b9, 0xe890b5, 0xe8938a, 0xe891a2,
+ /* e5 */ 0xe892b9, 0xe892bf, 0xe8929f, 0xe89399,
+ /* e9 */ 0xe8938d, 0xe892bb, 0xe8939a, 0xe89390,
+ /* ed */ 0xe89381, 0xe89386, 0xe89396, 0xe892a1,
+ /* f1 */ 0xe894a1, 0xe893bf, 0xe893b4, 0xe89497,
+ /* f5 */ 0xe89498, 0xe894ac, 0xe8949f, 0xe89495,
+ /* f9 */ 0xe89494, 0xe893bc, 0xe89580, 0xe895a3,
+ /* fd */ 0xe89598, 0xe89588,
+
+ /*** Two byte table, leaf: e9xx - offset 0x01968 ***/
+
+ /* a1 */ 0xe89581, 0xe89882, 0xe8958b, 0xe89595,
+ /* a5 */ 0xe89680, 0xe896a4, 0xe89688, 0xe89691,
+ /* a9 */ 0xe8968a, 0xe896a8, 0xe895ad, 0xe89694,
+ /* ad */ 0xe8969b, 0xe897aa, 0xe89687, 0xe8969c,
+ /* b1 */ 0xe895b7, 0xe895be, 0xe89690, 0xe89789,
+ /* b5 */ 0xe896ba, 0xe8978f, 0xe896b9, 0xe89790,
+ /* b9 */ 0xe89795, 0xe8979d, 0xe897a5, 0xe8979c,
+ /* bd */ 0xe897b9, 0xe8988a, 0xe89893, 0xe8988b,
+ /* c1 */ 0xe897be, 0xe897ba, 0xe89886, 0xe898a2,
+ /* c5 */ 0xe8989a, 0xe898b0, 0xe898bf, 0xe8998d,
+ /* c9 */ 0xe4b995, 0xe89994, 0xe8999f, 0xe899a7,
+ /* cd */ 0xe899b1, 0xe89a93, 0xe89aa3, 0xe89aa9,
+ /* d1 */ 0xe89aaa, 0xe89a8b, 0xe89a8c, 0xe89ab6,
+ /* d5 */ 0xe89aaf, 0xe89b84, 0xe89b86, 0xe89ab0,
+ /* d9 */ 0xe89b89, 0xe8a0a3, 0xe89aab, 0xe89b94,
+ /* dd */ 0xe89b9e, 0xe89ba9, 0xe89bac, 0xe89b9f,
+ /* e1 */ 0xe89b9b, 0xe89baf, 0xe89c92, 0xe89c86,
+ /* e5 */ 0xe89c88, 0xe89c80, 0xe89c83, 0xe89bbb,
+ /* e9 */ 0xe89c91, 0xe89c89, 0xe89c8d, 0xe89bb9,
+ /* ed */ 0xe89c8a, 0xe89cb4, 0xe89cbf, 0xe89cb7,
+ /* f1 */ 0xe89cbb, 0xe89ca5, 0xe89ca9, 0xe89c9a,
+ /* f5 */ 0xe89da0, 0xe89d9f, 0xe89db8, 0xe89d8c,
+ /* f9 */ 0xe89d8e, 0xe89db4, 0xe89d97, 0xe89da8,
+ /* fd */ 0xe89dae, 0xe89d99,
+
+ /*** Two byte table, leaf: eaxx - offset 0x019c6 ***/
+
+ /* a1 */ 0xe89d93, 0xe89da3, 0xe89daa, 0xe8a085,
+ /* a5 */ 0xe89ea2, 0xe89e9f, 0xe89e82, 0xe89eaf,
+ /* a9 */ 0xe89f8b, 0xe89ebd, 0xe89f80, 0xe89f90,
+ /* ad */ 0xe99b96, 0xe89eab, 0xe89f84, 0xe89eb3,
+ /* b1 */ 0xe89f87, 0xe89f86, 0xe89ebb, 0xe89faf,
+ /* b5 */ 0xe89fb2, 0xe89fa0, 0xe8a08f, 0xe8a08d,
+ /* b9 */ 0xe89fbe, 0xe89fb6, 0xe89fb7, 0xe8a08e,
+ /* bd */ 0xe89f92, 0xe8a091, 0xe8a096, 0xe8a095,
+ /* c1 */ 0xe8a0a2, 0xe8a0a1, 0xe8a0b1, 0xe8a0b6,
+ /* c5 */ 0xe8a0b9, 0xe8a0a7, 0xe8a0bb, 0xe8a184,
+ /* c9 */ 0xe8a182, 0xe8a192, 0xe8a199, 0xe8a19e,
+ /* cd */ 0xe8a1a2, 0xe8a1ab, 0xe8a281, 0xe8a1be,
+ /* d1 */ 0xe8a29e, 0xe8a1b5, 0xe8a1bd, 0xe8a2b5,
+ /* d5 */ 0xe8a1b2, 0xe8a282, 0xe8a297, 0xe8a292,
+ /* d9 */ 0xe8a2ae, 0xe8a299, 0xe8a2a2, 0xe8a28d,
+ /* dd */ 0xe8a2a4, 0xe8a2b0, 0xe8a2bf, 0xe8a2b1,
+ /* e1 */ 0xe8a383, 0xe8a384, 0xe8a394, 0xe8a398,
+ /* e5 */ 0xe8a399, 0xe8a39d, 0xe8a3b9, 0xe8a482,
+ /* e9 */ 0xe8a3bc, 0xe8a3b4, 0xe8a3a8, 0xe8a3b2,
+ /* ed */ 0xe8a484, 0xe8a48c, 0xe8a48a, 0xe8a493,
+ /* f1 */ 0xe8a583, 0xe8a49e, 0xe8a4a5, 0xe8a4aa,
+ /* f5 */ 0xe8a4ab, 0xe8a581, 0xe8a584, 0xe8a4bb,
+ /* f9 */ 0xe8a4b6, 0xe8a4b8, 0xe8a58c, 0xe8a49d,
+ /* fd */ 0xe8a5a0, 0xe8a59e,
+
+ /*** Two byte table, leaf: ebxx - offset 0x01a24 ***/
+
+ /* a1 */ 0xe8a5a6, 0xe8a5a4, 0xe8a5ad, 0xe8a5aa,
+ /* a5 */ 0xe8a5af, 0xe8a5b4, 0xe8a5b7, 0xe8a5be,
+ /* a9 */ 0xe8a683, 0xe8a688, 0xe8a68a, 0xe8a693,
+ /* ad */ 0xe8a698, 0xe8a6a1, 0xe8a6a9, 0xe8a6a6,
+ /* b1 */ 0xe8a6ac, 0xe8a6af, 0xe8a6b2, 0xe8a6ba,
+ /* b5 */ 0xe8a6bd, 0xe8a6bf, 0xe8a780, 0xe8a79a,
+ /* b9 */ 0xe8a79c, 0xe8a79d, 0xe8a7a7, 0xe8a7b4,
+ /* bd */ 0xe8a7b8, 0xe8a883, 0xe8a896, 0xe8a890,
+ /* c1 */ 0xe8a88c, 0xe8a89b, 0xe8a89d, 0xe8a8a5,
+ /* c5 */ 0xe8a8b6, 0xe8a981, 0xe8a99b, 0xe8a992,
+ /* c9 */ 0xe8a986, 0xe8a988, 0xe8a9bc, 0xe8a9ad,
+ /* cd */ 0xe8a9ac, 0xe8a9a2, 0xe8aa85, 0xe8aa82,
+ /* d1 */ 0xe8aa84, 0xe8aaa8, 0xe8aaa1, 0xe8aa91,
+ /* d5 */ 0xe8aaa5, 0xe8aaa6, 0xe8aa9a, 0xe8aaa3,
+ /* d9 */ 0xe8ab84, 0xe8ab8d, 0xe8ab82, 0xe8ab9a,
+ /* dd */ 0xe8abab, 0xe8abb3, 0xe8aba7, 0xe8aba4,
+ /* e1 */ 0xe8abb1, 0xe8ac94, 0xe8aba0, 0xe8aba2,
+ /* e5 */ 0xe8abb7, 0xe8ab9e, 0xe8ab9b, 0xe8ac8c,
+ /* e9 */ 0xe8ac87, 0xe8ac9a, 0xe8aba1, 0xe8ac96,
+ /* ed */ 0xe8ac90, 0xe8ac97, 0xe8aca0, 0xe8acb3,
+ /* f1 */ 0xe99eab, 0xe8aca6, 0xe8acab, 0xe8acbe,
+ /* f5 */ 0xe8aca8, 0xe8ad81, 0xe8ad8c, 0xe8ad8f,
+ /* f9 */ 0xe8ad8e, 0xe8ad89, 0xe8ad96, 0xe8ad9b,
+ /* fd */ 0xe8ad9a, 0xe8adab,
+
+ /*** Two byte table, leaf: ecxx - offset 0x01a82 ***/
+
+ /* a1 */ 0xe8ad9f, 0xe8adac, 0xe8adaf, 0xe8adb4,
+ /* a5 */ 0xe8adbd, 0xe8ae80, 0xe8ae8c, 0xe8ae8e,
+ /* a9 */ 0xe8ae92, 0xe8ae93, 0xe8ae96, 0xe8ae99,
+ /* ad */ 0xe8ae9a, 0xe8b0ba, 0xe8b181, 0xe8b0bf,
+ /* b1 */ 0xe8b188, 0xe8b18c, 0xe8b18e, 0xe8b190,
+ /* b5 */ 0xe8b195, 0xe8b1a2, 0xe8b1ac, 0xe8b1b8,
+ /* b9 */ 0xe8b1ba, 0xe8b282, 0xe8b289, 0xe8b285,
+ /* bd */ 0xe8b28a, 0xe8b28d, 0xe8b28e, 0xe8b294,
+ /* c1 */ 0xe8b1bc, 0xe8b298, 0xe6889d, 0xe8b2ad,
+ /* c5 */ 0xe8b2aa, 0xe8b2bd, 0xe8b2b2, 0xe8b2b3,
+ /* c9 */ 0xe8b2ae, 0xe8b2b6, 0xe8b388, 0xe8b381,
+ /* cd */ 0xe8b3a4, 0xe8b3a3, 0xe8b39a, 0xe8b3bd,
+ /* d1 */ 0xe8b3ba, 0xe8b3bb, 0xe8b484, 0xe8b485,
+ /* d5 */ 0xe8b48a, 0xe8b487, 0xe8b48f, 0xe8b48d,
+ /* d9 */ 0xe8b490, 0xe9bd8e, 0xe8b493, 0xe8b38d,
+ /* dd */ 0xe8b494, 0xe8b496, 0xe8b5a7, 0xe8b5ad,
+ /* e1 */ 0xe8b5b1, 0xe8b5b3, 0xe8b681, 0xe8b699,
+ /* e5 */ 0xe8b782, 0xe8b6be, 0xe8b6ba, 0xe8b78f,
+ /* e9 */ 0xe8b79a, 0xe8b796, 0xe8b78c, 0xe8b79b,
+ /* ed */ 0xe8b78b, 0xe8b7aa, 0xe8b7ab, 0xe8b79f,
+ /* f1 */ 0xe8b7a3, 0xe8b7bc, 0xe8b888, 0xe8b889,
+ /* f5 */ 0xe8b7bf, 0xe8b89d, 0xe8b89e, 0xe8b890,
+ /* f9 */ 0xe8b89f, 0xe8b982, 0xe8b8b5, 0xe8b8b0,
+ /* fd */ 0xe8b8b4, 0xe8b98a,
+
+ /*** Two byte table, leaf: edxx - offset 0x01ae0 ***/
+
+ /* a1 */ 0xe8b987, 0xe8b989, 0xe8b98c, 0xe8b990,
+ /* a5 */ 0xe8b988, 0xe8b999, 0xe8b9a4, 0xe8b9a0,
+ /* a9 */ 0xe8b8aa, 0xe8b9a3, 0xe8b995, 0xe8b9b6,
+ /* ad */ 0xe8b9b2, 0xe8b9bc, 0xe8ba81, 0xe8ba87,
+ /* b1 */ 0xe8ba85, 0xe8ba84, 0xe8ba8b, 0xe8ba8a,
+ /* b5 */ 0xe8ba93, 0xe8ba91, 0xe8ba94, 0xe8ba99,
+ /* b9 */ 0xe8baaa, 0xe8baa1, 0xe8baac, 0xe8bab0,
+ /* bd */ 0xe8bb86, 0xe8bab1, 0xe8babe, 0xe8bb85,
+ /* c1 */ 0xe8bb88, 0xe8bb8b, 0xe8bb9b, 0xe8bba3,
+ /* c5 */ 0xe8bbbc, 0xe8bbbb, 0xe8bbab, 0xe8bbbe,
+ /* c9 */ 0xe8bc8a, 0xe8bc85, 0xe8bc95, 0xe8bc92,
+ /* cd */ 0xe8bc99, 0xe8bc93, 0xe8bc9c, 0xe8bc9f,
+ /* d1 */ 0xe8bc9b, 0xe8bc8c, 0xe8bca6, 0xe8bcb3,
+ /* d5 */ 0xe8bcbb, 0xe8bcb9, 0xe8bd85, 0xe8bd82,
+ /* d9 */ 0xe8bcbe, 0xe8bd8c, 0xe8bd89, 0xe8bd86,
+ /* dd */ 0xe8bd8e, 0xe8bd97, 0xe8bd9c, 0xe8bda2,
+ /* e1 */ 0xe8bda3, 0xe8bda4, 0xe8be9c, 0xe8be9f,
+ /* e5 */ 0xe8bea3, 0xe8bead, 0xe8beaf, 0xe8beb7,
+ /* e9 */ 0xe8bf9a, 0xe8bfa5, 0xe8bfa2, 0xe8bfaa,
+ /* ed */ 0xe8bfaf, 0xe98287, 0xe8bfb4, 0xe98085,
+ /* f1 */ 0xe8bfb9, 0xe8bfba, 0xe98091, 0xe98095,
+ /* f5 */ 0xe980a1, 0xe9808d, 0xe9809e, 0xe98096,
+ /* f9 */ 0xe9808b, 0xe980a7, 0xe980b6, 0xe980b5,
+ /* fd */ 0xe980b9, 0xe8bfb8,
+
+ /*** Two byte table, leaf: eexx - offset 0x01b3e ***/
+
+ /* a1 */ 0xe9818f, 0xe98190, 0xe98191, 0xe98192,
+ /* a5 */ 0xe9808e, 0xe98189, 0xe980be, 0xe98196,
+ /* a9 */ 0xe98198, 0xe9819e, 0xe981a8, 0xe981af,
+ /* ad */ 0xe981b6, 0xe99aa8, 0xe981b2, 0xe98282,
+ /* b1 */ 0xe981bd, 0xe98281, 0xe98280, 0xe9828a,
+ /* b5 */ 0xe98289, 0xe9828f, 0xe982a8, 0xe982af,
+ /* b9 */ 0xe982b1, 0xe982b5, 0xe983a2, 0xe983a4,
+ /* bd */ 0xe68988, 0xe9839b, 0xe98482, 0xe98492,
+ /* c1 */ 0xe98499, 0xe984b2, 0xe984b0, 0xe9858a,
+ /* c5 */ 0xe98596, 0xe98598, 0xe985a3, 0xe985a5,
+ /* c9 */ 0xe985a9, 0xe985b3, 0xe985b2, 0xe9868b,
+ /* cd */ 0xe98689, 0xe98682, 0xe986a2, 0xe986ab,
+ /* d1 */ 0xe986af, 0xe986aa, 0xe986b5, 0xe986b4,
+ /* d5 */ 0xe986ba, 0xe98780, 0xe98781, 0xe98789,
+ /* d9 */ 0xe9878b, 0xe98790, 0xe98796, 0xe9879f,
+ /* dd */ 0xe987a1, 0xe9879b, 0xe987bc, 0xe987b5,
+ /* e1 */ 0xe987b6, 0xe9889e, 0xe987bf, 0xe98894,
+ /* e5 */ 0xe988ac, 0xe98895, 0xe98891, 0xe9899e,
+ /* e9 */ 0xe98997, 0xe98985, 0xe98989, 0xe989a4,
+ /* ed */ 0xe98988, 0xe98a95, 0xe988bf, 0xe9898b,
+ /* f1 */ 0xe98990, 0xe98a9c, 0xe98a96, 0xe98a93,
+ /* f5 */ 0xe98a9b, 0xe9899a, 0xe98b8f, 0xe98ab9,
+ /* f9 */ 0xe98ab7, 0xe98ba9, 0xe98c8f, 0xe98bba,
+ /* fd */ 0xe98d84, 0xe98cae,
+
+ /*** Two byte table, leaf: efxx - offset 0x01b9c ***/
+
+ /* a1 */ 0xe98c99, 0xe98ca2, 0xe98c9a, 0xe98ca3,
+ /* a5 */ 0xe98cba, 0xe98cb5, 0xe98cbb, 0xe98d9c,
+ /* a9 */ 0xe98da0, 0xe98dbc, 0xe98dae, 0xe98d96,
+ /* ad */ 0xe98eb0, 0xe98eac, 0xe98ead, 0xe98e94,
+ /* b1 */ 0xe98eb9, 0xe98f96, 0xe98f97, 0xe98fa8,
+ /* b5 */ 0xe98fa5, 0xe98f98, 0xe98f83, 0xe98f9d,
+ /* b9 */ 0xe98f90, 0xe98f88, 0xe98fa4, 0xe9909a,
+ /* bd */ 0xe99094, 0xe99093, 0xe99083, 0xe99087,
+ /* c1 */ 0xe99090, 0xe990b6, 0xe990ab, 0xe990b5,
+ /* c5 */ 0xe990a1, 0xe990ba, 0xe99181, 0xe99192,
+ /* c9 */ 0xe99184, 0xe9919b, 0xe991a0, 0xe991a2,
+ /* cd */ 0xe9919e, 0xe991aa, 0xe988a9, 0xe991b0,
+ /* d1 */ 0xe991b5, 0xe991b7, 0xe991bd, 0xe9919a,
+ /* d5 */ 0xe991bc, 0xe991be, 0xe99281, 0xe991bf,
+ /* d9 */ 0xe99682, 0xe99687, 0xe9968a, 0xe99694,
+ /* dd */ 0xe99696, 0xe99698, 0xe99699, 0xe996a0,
+ /* e1 */ 0xe996a8, 0xe996a7, 0xe996ad, 0xe996bc,
+ /* e5 */ 0xe996bb, 0xe996b9, 0xe996be, 0xe9978a,
+ /* e9 */ 0xe6bfb6, 0xe99783, 0xe9978d, 0xe9978c,
+ /* ed */ 0xe99795, 0xe99794, 0xe99796, 0xe9979c,
+ /* f1 */ 0xe997a1, 0xe997a5, 0xe997a2, 0xe998a1,
+ /* f5 */ 0xe998a8, 0xe998ae, 0xe998af, 0xe99982,
+ /* f9 */ 0xe9998c, 0xe9998f, 0xe9998b, 0xe999b7,
+ /* fd */ 0xe9999c, 0xe9999e,
+
+ /*** Two byte table, leaf: f0xx - offset 0x01bfa ***/
+
+ /* a1 */ 0xe9999d, 0xe9999f, 0xe999a6, 0xe999b2,
+ /* a5 */ 0xe999ac, 0xe99a8d, 0xe99a98, 0xe99a95,
+ /* a9 */ 0xe99a97, 0xe99aaa, 0xe99aa7, 0xe99ab1,
+ /* ad */ 0xe99ab2, 0xe99ab0, 0xe99ab4, 0xe99ab6,
+ /* b1 */ 0xe99ab8, 0xe99ab9, 0xe99b8e, 0xe99b8b,
+ /* b5 */ 0xe99b89, 0xe99b8d, 0xe8a58d, 0xe99b9c,
+ /* b9 */ 0xe99c8d, 0xe99b95, 0xe99bb9, 0xe99c84,
+ /* bd */ 0xe99c86, 0xe99c88, 0xe99c93, 0xe99c8e,
+ /* c1 */ 0xe99c91, 0xe99c8f, 0xe99c96, 0xe99c99,
+ /* c5 */ 0xe99ca4, 0xe99caa, 0xe99cb0, 0xe99cb9,
+ /* c9 */ 0xe99cbd, 0xe99cbe, 0xe99d84, 0xe99d86,
+ /* cd */ 0xe99d88, 0xe99d82, 0xe99d89, 0xe99d9c,
+ /* d1 */ 0xe99da0, 0xe99da4, 0xe99da6, 0xe99da8,
+ /* d5 */ 0xe58b92, 0xe99dab, 0xe99db1, 0xe99db9,
+ /* d9 */ 0xe99e85, 0xe99dbc, 0xe99e81, 0xe99dba,
+ /* dd */ 0xe99e86, 0xe99e8b, 0xe99e8f, 0xe99e90,
+ /* e1 */ 0xe99e9c, 0xe99ea8, 0xe99ea6, 0xe99ea3,
+ /* e5 */ 0xe99eb3, 0xe99eb4, 0xe99f83, 0xe99f86,
+ /* e9 */ 0xe99f88, 0xe99f8b, 0xe99f9c, 0xe99fad,
+ /* ed */ 0xe9bd8f, 0xe99fb2, 0xe7ab9f, 0xe99fb6,
+ /* f1 */ 0xe99fb5, 0xe9a08f, 0xe9a08c, 0xe9a0b8,
+ /* f5 */ 0xe9a0a4, 0xe9a0a1, 0xe9a0b7, 0xe9a0bd,
+ /* f9 */ 0xe9a186, 0xe9a18f, 0xe9a18b, 0xe9a1ab,
+ /* fd */ 0xe9a1af, 0xe9a1b0,
+
+ /*** Two byte table, leaf: f1xx - offset 0x01c58 ***/
+
+ /* a1 */ 0xe9a1b1, 0xe9a1b4, 0xe9a1b3, 0xe9a2aa,
+ /* a5 */ 0xe9a2af, 0xe9a2b1, 0xe9a2b6, 0xe9a384,
+ /* a9 */ 0xe9a383, 0xe9a386, 0xe9a3a9, 0xe9a3ab,
+ /* ad */ 0xe9a483, 0xe9a489, 0xe9a492, 0xe9a494,
+ /* b1 */ 0xe9a498, 0xe9a4a1, 0xe9a49d, 0xe9a49e,
+ /* b5 */ 0xe9a4a4, 0xe9a4a0, 0xe9a4ac, 0xe9a4ae,
+ /* b9 */ 0xe9a4bd, 0xe9a4be, 0xe9a582, 0xe9a589,
+ /* bd */ 0xe9a585, 0xe9a590, 0xe9a58b, 0xe9a591,
+ /* c1 */ 0xe9a592, 0xe9a58c, 0xe9a595, 0xe9a697,
+ /* c5 */ 0xe9a698, 0xe9a6a5, 0xe9a6ad, 0xe9a6ae,
+ /* c9 */ 0xe9a6bc, 0xe9a79f, 0xe9a79b, 0xe9a79d,
+ /* cd */ 0xe9a798, 0xe9a791, 0xe9a7ad, 0xe9a7ae,
+ /* d1 */ 0xe9a7b1, 0xe9a7b2, 0xe9a7bb, 0xe9a7b8,
+ /* d5 */ 0xe9a881, 0xe9a88f, 0xe9a885, 0xe9a7a2,
+ /* d9 */ 0xe9a899, 0xe9a8ab, 0xe9a8b7, 0xe9a985,
+ /* dd */ 0xe9a982, 0xe9a980, 0xe9a983, 0xe9a8be,
+ /* e1 */ 0xe9a995, 0xe9a98d, 0xe9a99b, 0xe9a997,
+ /* e5 */ 0xe9a99f, 0xe9a9a2, 0xe9a9a5, 0xe9a9a4,
+ /* e9 */ 0xe9a9a9, 0xe9a9ab, 0xe9a9aa, 0xe9aaad,
+ /* ed */ 0xe9aab0, 0xe9aabc, 0xe9ab80, 0xe9ab8f,
+ /* f1 */ 0xe9ab91, 0xe9ab93, 0xe9ab94, 0xe9ab9e,
+ /* f5 */ 0xe9ab9f, 0xe9aba2, 0xe9aba3, 0xe9aba6,
+ /* f9 */ 0xe9abaf, 0xe9abab, 0xe9abae, 0xe9abb4,
+ /* fd */ 0xe9abb1, 0xe9abb7,
+
+ /*** Two byte table, leaf: f2xx - offset 0x01cb6 ***/
+
+ /* a1 */ 0xe9abbb, 0xe9ac86, 0xe9ac98, 0xe9ac9a,
+ /* a5 */ 0xe9ac9f, 0xe9aca2, 0xe9aca3, 0xe9aca5,
+ /* a9 */ 0xe9aca7, 0xe9aca8, 0xe9aca9, 0xe9acaa,
+ /* ad */ 0xe9acae, 0xe9acaf, 0xe9acb2, 0xe9ad84,
+ /* b1 */ 0xe9ad83, 0xe9ad8f, 0xe9ad8d, 0xe9ad8e,
+ /* b5 */ 0xe9ad91, 0xe9ad98, 0xe9adb4, 0xe9ae93,
+ /* b9 */ 0xe9ae83, 0xe9ae91, 0xe9ae96, 0xe9ae97,
+ /* bd */ 0xe9ae9f, 0xe9aea0, 0xe9aea8, 0xe9aeb4,
+ /* c1 */ 0xe9af80, 0xe9af8a, 0xe9aeb9, 0xe9af86,
+ /* c5 */ 0xe9af8f, 0xe9af91, 0xe9af92, 0xe9afa3,
+ /* c9 */ 0xe9afa2, 0xe9afa4, 0xe9af94, 0xe9afa1,
+ /* cd */ 0xe9b0ba, 0xe9afb2, 0xe9afb1, 0xe9afb0,
+ /* d1 */ 0xe9b095, 0xe9b094, 0xe9b089, 0xe9b093,
+ /* d5 */ 0xe9b08c, 0xe9b086, 0xe9b088, 0xe9b092,
+ /* d9 */ 0xe9b08a, 0xe9b084, 0xe9b0ae, 0xe9b09b,
+ /* dd */ 0xe9b0a5, 0xe9b0a4, 0xe9b0a1, 0xe9b0b0,
+ /* e1 */ 0xe9b187, 0xe9b0b2, 0xe9b186, 0xe9b0be,
+ /* e5 */ 0xe9b19a, 0xe9b1a0, 0xe9b1a7, 0xe9b1b6,
+ /* e9 */ 0xe9b1b8, 0xe9b3a7, 0xe9b3ac, 0xe9b3b0,
+ /* ed */ 0xe9b489, 0xe9b488, 0xe9b3ab, 0xe9b483,
+ /* f1 */ 0xe9b486, 0xe9b4aa, 0xe9b4a6, 0xe9b6af,
+ /* f5 */ 0xe9b4a3, 0xe9b49f, 0xe9b584, 0xe9b495,
+ /* f9 */ 0xe9b492, 0xe9b581, 0xe9b4bf, 0xe9b4be,
+ /* fd */ 0xe9b586, 0xe9b588,
+
+ /*** Two byte table, leaf: f3xx - offset 0x01d14 ***/
+
+ /* a1 */ 0xe9b59d, 0xe9b59e, 0xe9b5a4, 0xe9b591,
+ /* a5 */ 0xe9b590, 0xe9b599, 0xe9b5b2, 0xe9b689,
+ /* a9 */ 0xe9b687, 0xe9b6ab, 0xe9b5af, 0xe9b5ba,
+ /* ad */ 0xe9b69a, 0xe9b6a4, 0xe9b6a9, 0xe9b6b2,
+ /* b1 */ 0xe9b784, 0xe9b781, 0xe9b6bb, 0xe9b6b8,
+ /* b5 */ 0xe9b6ba, 0xe9b786, 0xe9b78f, 0xe9b782,
+ /* b9 */ 0xe9b799, 0xe9b793, 0xe9b7b8, 0xe9b7a6,
+ /* bd */ 0xe9b7ad, 0xe9b7af, 0xe9b7bd, 0xe9b89a,
+ /* c1 */ 0xe9b89b, 0xe9b89e, 0xe9b9b5, 0xe9b9b9,
+ /* c5 */ 0xe9b9bd, 0xe9ba81, 0xe9ba88, 0xe9ba8b,
+ /* c9 */ 0xe9ba8c, 0xe9ba92, 0xe9ba95, 0xe9ba91,
+ /* cd */ 0xe9ba9d, 0xe9baa5, 0xe9baa9, 0xe9bab8,
+ /* d1 */ 0xe9baaa, 0xe9baad, 0xe99da1, 0xe9bb8c,
+ /* d5 */ 0xe9bb8e, 0xe9bb8f, 0xe9bb90, 0xe9bb94,
+ /* d9 */ 0xe9bb9c, 0xe9bb9e, 0xe9bb9d, 0xe9bba0,
+ /* dd */ 0xe9bba5, 0xe9bba8, 0xe9bbaf, 0xe9bbb4,
+ /* e1 */ 0xe9bbb6, 0xe9bbb7, 0xe9bbb9, 0xe9bbbb,
+ /* e5 */ 0xe9bbbc, 0xe9bbbd, 0xe9bc87, 0xe9bc88,
+ /* e9 */ 0xe79ab7, 0xe9bc95, 0xe9bca1, 0xe9bcac,
+ /* ed */ 0xe9bcbe, 0xe9bd8a, 0xe9bd92, 0xe9bd94,
+ /* f1 */ 0xe9bda3, 0xe9bd9f, 0xe9bda0, 0xe9bda1,
+ /* f5 */ 0xe9bda6, 0xe9bda7, 0xe9bdac, 0xe9bdaa,
+ /* f9 */ 0xe9bdb7, 0xe9bdb2, 0xe9bdb6, 0xe9be95,
+ /* fd */ 0xe9be9c, 0xe9bea0,
+
+ /*** Two byte table, leaf: f4xx - offset 0x01d72 ***/
+
+ /* a1 */ 0xe5a0af, 0xe6a787, 0xe98199, 0xe791a4,
+ /* a5 */ 0xe5879c, 0xe78699, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Three byte table, byte #1: xx - offset 0x01dd0 ***/
+
+ /* 8f */ 0x001dd1,
+
+ /*** Three byte table, byte #2: 8fxx - offset 0x01dd1 ***/
+
+ /* a2 */ 0x001e24, 0x000000, 0x000000, 0x000000,
+ /* a6 */ 0x001e75, 0x001ed1, 0x000000, 0x001f2f,
+ /* aa */ 0x001f8d, 0x001feb, 0x000000, 0x000000,
+ /* ae */ 0x000000, 0x000000, 0x002049, 0x0020a7,
+ /* b2 */ 0x002105, 0x002163, 0x0021c1, 0x00221f,
+ /* b6 */ 0x00227d, 0x0022db, 0x002339, 0x002397,
+ /* ba */ 0x0023f5, 0x002453, 0x0024b1, 0x00250f,
+ /* be */ 0x00256d, 0x0025cb, 0x002629, 0x002687,
+ /* c2 */ 0x0026e5, 0x002743, 0x0027a1, 0x0027ff,
+ /* c6 */ 0x00285d, 0x0028bb, 0x002919, 0x002977,
+ /* ca */ 0x0029d5, 0x002a33, 0x002a91, 0x002aef,
+ /* ce */ 0x002b4d, 0x002bab, 0x002c09, 0x002c67,
+ /* d2 */ 0x002cc5, 0x002d23, 0x002d81, 0x002ddf,
+ /* d6 */ 0x002e3d, 0x002e9b, 0x002ef9, 0x002f57,
+ /* da */ 0x002fb5, 0x003013, 0x003071, 0x0030cf,
+ /* de */ 0x00312d, 0x00318b, 0x0031e9, 0x003247,
+ /* e2 */ 0x0032a5, 0x003303, 0x003361, 0x0033bf,
+ /* e6 */ 0x00341d, 0x00347b, 0x0034d9, 0x003537,
+ /* ea */ 0x003595, 0x0035f3, 0x003651, 0x0036af,
+ /* ee */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f2 */ 0x000000, 0x0036f2, 0x003750,
+
+ /*** Three byte table, leaf: 8fa2xx - offset 0x01e24 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x00cb98, 0x00cb87,
+ /* b1 */ 0x00c2b8, 0x00cb99, 0x00cb9d, 0x00c2af,
+ /* b5 */ 0x00cb9b, 0x00cb9a, 0x000000, 0x00ce84,
+ /* b9 */ 0x00ce85, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x00c2a1, 0xefbfa4, 0x00c2bf,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x00c2ba, 0x00c2aa,
+ /* ed */ 0x00c2a9, 0x00c2ae, 0xe284a2, 0x00c2a4,
+ /* f1 */ 0xe28496,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: 8fa6xx - offset 0x01e75 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x00ce86, 0x00ce88, 0x00ce89, 0x00ce8a,
+ /* e5 */ 0x00ceaa, 0x000000, 0x00ce8c, 0x000000,
+ /* e9 */ 0x00ce8e, 0x00ceab, 0x000000, 0x00ce8f,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x00ceac, 0x00cead, 0x00ceae, 0x00ceaf,
+ /* f5 */ 0x00cf8a, 0x00ce90, 0x00cf8c, 0x00cf82,
+ /* f9 */ 0x00cf8d, 0x00cf8b, 0x00ceb0, 0x00cf8e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: 8fa7xx - offset 0x01ed1 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x00d082, 0x00d083, 0x00d084,
+ /* c5 */ 0x00d085, 0x00d086, 0x00d087, 0x00d088,
+ /* c9 */ 0x00d089, 0x00d08a, 0x00d08b, 0x00d08c,
+ /* cd */ 0x00d08e, 0x00d08f, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x00d192, 0x00d193, 0x00d194,
+ /* f5 */ 0x00d195, 0x00d196, 0x00d197, 0x00d198,
+ /* f9 */ 0x00d199, 0x00d19a, 0x00d19b, 0x00d19c,
+ /* fd */ 0x00d19e, 0x00d19f,
+
+ /*** Three byte table, leaf: 8fa9xx - offset 0x01f2f ***/
+
+ /* a1 */ 0x00c386, 0x00c490, 0x000000, 0x00c4a6,
+ /* a5 */ 0x000000, 0x00c4b2, 0x000000, 0x00c581,
+ /* a9 */ 0x00c4bf, 0x000000, 0x00c58a, 0x00c398,
+ /* ad */ 0x00c592, 0x000000, 0x00c5a6, 0x00c39e,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x00c3a6, 0x00c491, 0x00c3b0, 0x00c4a7,
+ /* c5 */ 0x00c4b1, 0x00c4b3, 0x00c4b8, 0x00c582,
+ /* c9 */ 0x00c580, 0x00c589, 0x00c58b, 0x00c3b8,
+ /* cd */ 0x00c593, 0x00c39f, 0x00c5a7, 0x00c3be,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: 8faaxx - offset 0x01f8d ***/
+
+ /* a1 */ 0x00c381, 0x00c380, 0x00c384, 0x00c382,
+ /* a5 */ 0x00c482, 0x00c78d, 0x00c480, 0x00c484,
+ /* a9 */ 0x00c385, 0x00c383, 0x00c486, 0x00c488,
+ /* ad */ 0x00c48c, 0x00c387, 0x00c48a, 0x00c48e,
+ /* b1 */ 0x00c389, 0x00c388, 0x00c38b, 0x00c38a,
+ /* b5 */ 0x00c49a, 0x00c496, 0x00c492, 0x00c498,
+ /* b9 */ 0x000000, 0x00c49c, 0x00c49e, 0x00c4a2,
+ /* bd */ 0x00c4a0, 0x00c4a4, 0x00c38d, 0x00c38c,
+ /* c1 */ 0x00c38f, 0x00c38e, 0x00c78f, 0x00c4b0,
+ /* c5 */ 0x00c4aa, 0x00c4ae, 0x00c4a8, 0x00c4b4,
+ /* c9 */ 0x00c4b6, 0x00c4b9, 0x00c4bd, 0x00c4bb,
+ /* cd */ 0x00c583, 0x00c587, 0x00c585, 0x00c391,
+ /* d1 */ 0x00c393, 0x00c392, 0x00c396, 0x00c394,
+ /* d5 */ 0x00c791, 0x00c590, 0x00c58c, 0x00c395,
+ /* d9 */ 0x00c594, 0x00c598, 0x00c596, 0x00c59a,
+ /* dd */ 0x00c59c, 0x00c5a0, 0x00c59e, 0x00c5a4,
+ /* e1 */ 0x00c5a2, 0x00c39a, 0x00c399, 0x00c39c,
+ /* e5 */ 0x00c39b, 0x00c5ac, 0x00c793, 0x00c5b0,
+ /* e9 */ 0x00c5aa, 0x00c5b2, 0x00c5ae, 0x00c5a8,
+ /* ed */ 0x00c797, 0x00c79b, 0x00c799, 0x00c795,
+ /* f1 */ 0x00c5b4, 0x00c39d, 0x00c5b8, 0x00c5b6,
+ /* f5 */ 0x00c5b9, 0x00c5bd, 0x00c5bb, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: 8fabxx - offset 0x01feb ***/
+
+ /* a1 */ 0x00c3a1, 0x00c3a0, 0x00c3a4, 0x00c3a2,
+ /* a5 */ 0x00c483, 0x00c78e, 0x00c481, 0x00c485,
+ /* a9 */ 0x00c3a5, 0x00c3a3, 0x00c487, 0x00c489,
+ /* ad */ 0x00c48d, 0x00c3a7, 0x00c48b, 0x00c48f,
+ /* b1 */ 0x00c3a9, 0x00c3a8, 0x00c3ab, 0x00c3aa,
+ /* b5 */ 0x00c49b, 0x00c497, 0x00c493, 0x00c499,
+ /* b9 */ 0x00c7b5, 0x00c49d, 0x00c49f, 0x000000,
+ /* bd */ 0x00c4a1, 0x00c4a5, 0x00c3ad, 0x00c3ac,
+ /* c1 */ 0x00c3af, 0x00c3ae, 0x00c790, 0x000000,
+ /* c5 */ 0x00c4ab, 0x00c4af, 0x00c4a9, 0x00c4b5,
+ /* c9 */ 0x00c4b7, 0x00c4ba, 0x00c4be, 0x00c4bc,
+ /* cd */ 0x00c584, 0x00c588, 0x00c586, 0x00c3b1,
+ /* d1 */ 0x00c3b3, 0x00c3b2, 0x00c3b6, 0x00c3b4,
+ /* d5 */ 0x00c792, 0x00c591, 0x00c58d, 0x00c3b5,
+ /* d9 */ 0x00c595, 0x00c599, 0x00c597, 0x00c59b,
+ /* dd */ 0x00c59d, 0x00c5a1, 0x00c59f, 0x00c5a5,
+ /* e1 */ 0x00c5a3, 0x00c3ba, 0x00c3b9, 0x00c3bc,
+ /* e5 */ 0x00c3bb, 0x00c5ad, 0x00c794, 0x00c5b1,
+ /* e9 */ 0x00c5ab, 0x00c5b3, 0x00c5af, 0x00c5a9,
+ /* ed */ 0x00c798, 0x00c79c, 0x00c79a, 0x00c796,
+ /* f1 */ 0x00c5b5, 0x00c3bd, 0x00c3bf, 0x00c5b7,
+ /* f5 */ 0x00c5ba, 0x00c5be, 0x00c5bc, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: 8fb0xx - offset 0x02049 ***/
+
+ /* a1 */ 0xe4b882, 0xe4b884, 0xe4b885, 0xe4b88c,
+ /* a5 */ 0xe4b892, 0xe4b89f, 0xe4b8a3, 0xe4b8a4,
+ /* a9 */ 0xe4b8a8, 0xe4b8ab, 0xe4b8ae, 0xe4b8af,
+ /* ad */ 0xe4b8b0, 0xe4b8b5, 0xe4b980, 0xe4b981,
+ /* b1 */ 0xe4b984, 0xe4b987, 0xe4b991, 0xe4b99a,
+ /* b5 */ 0xe4b99c, 0xe4b9a3, 0xe4b9a8, 0xe4b9a9,
+ /* b9 */ 0xe4b9b4, 0xe4b9b5, 0xe4b9b9, 0xe4b9bf,
+ /* bd */ 0xe4ba8d, 0xe4ba96, 0xe4ba97, 0xe4ba9d,
+ /* c1 */ 0xe4baaf, 0xe4bab9, 0xe4bb83, 0xe4bb90,
+ /* c5 */ 0xe4bb9a, 0xe4bb9b, 0xe4bba0, 0xe4bba1,
+ /* c9 */ 0xe4bba2, 0xe4bba8, 0xe4bbaf, 0xe4bbb1,
+ /* cd */ 0xe4bbb3, 0xe4bbb5, 0xe4bbbd, 0xe4bbbe,
+ /* d1 */ 0xe4bbbf, 0xe4bc80, 0xe4bc82, 0xe4bc83,
+ /* d5 */ 0xe4bc88, 0xe4bc8b, 0xe4bc8c, 0xe4bc92,
+ /* d9 */ 0xe4bc95, 0xe4bc96, 0xe4bc97, 0xe4bc99,
+ /* dd */ 0xe4bcae, 0xe4bcb1, 0xe4bda0, 0xe4bcb3,
+ /* e1 */ 0xe4bcb5, 0xe4bcb7, 0xe4bcb9, 0xe4bcbb,
+ /* e5 */ 0xe4bcbe, 0xe4bd80, 0xe4bd82, 0xe4bd88,
+ /* e9 */ 0xe4bd89, 0xe4bd8b, 0xe4bd8c, 0xe4bd92,
+ /* ed */ 0xe4bd94, 0xe4bd96, 0xe4bd98, 0xe4bd9f,
+ /* f1 */ 0xe4bda3, 0xe4bdaa, 0xe4bdac, 0xe4bdae,
+ /* f5 */ 0xe4bdb1, 0xe4bdb7, 0xe4bdb8, 0xe4bdb9,
+ /* f9 */ 0xe4bdba, 0xe4bdbd, 0xe4bdbe, 0xe4be81,
+ /* fd */ 0xe4be82, 0xe4be84,
+
+ /*** Three byte table, leaf: 8fb1xx - offset 0x020a7 ***/
+
+ /* a1 */ 0xe4be85, 0xe4be89, 0xe4be8a, 0xe4be8c,
+ /* a5 */ 0xe4be8e, 0xe4be90, 0xe4be92, 0xe4be93,
+ /* a9 */ 0xe4be94, 0xe4be97, 0xe4be99, 0xe4be9a,
+ /* ad */ 0xe4be9e, 0xe4be9f, 0xe4beb2, 0xe4beb7,
+ /* b1 */ 0xe4beb9, 0xe4bebb, 0xe4bebc, 0xe4bebd,
+ /* b5 */ 0xe4bebe, 0xe4bf80, 0xe4bf81, 0xe4bf85,
+ /* b9 */ 0xe4bf86, 0xe4bf88, 0xe4bf89, 0xe4bf8b,
+ /* bd */ 0xe4bf8c, 0xe4bf8d, 0xe4bf8f, 0xe4bf92,
+ /* c1 */ 0xe4bf9c, 0xe4bfa0, 0xe4bfa2, 0xe4bfb0,
+ /* c5 */ 0xe4bfb2, 0xe4bfbc, 0xe4bfbd, 0xe4bfbf,
+ /* c9 */ 0xe58080, 0xe58081, 0xe58084, 0xe58087,
+ /* cd */ 0xe5808a, 0xe5808c, 0xe5808e, 0xe58090,
+ /* d1 */ 0xe58093, 0xe58097, 0xe58098, 0xe5809b,
+ /* d5 */ 0xe5809c, 0xe5809d, 0xe5809e, 0xe580a2,
+ /* d9 */ 0xe580a7, 0xe580ae, 0xe580b0, 0xe580b2,
+ /* dd */ 0xe580b3, 0xe580b5, 0xe58180, 0xe58181,
+ /* e1 */ 0xe58182, 0xe58185, 0xe58186, 0xe5818a,
+ /* e5 */ 0xe5818c, 0xe5818e, 0xe58191, 0xe58192,
+ /* e9 */ 0xe58193, 0xe58197, 0xe58199, 0xe5819f,
+ /* ed */ 0xe581a0, 0xe581a2, 0xe581a3, 0xe581a6,
+ /* f1 */ 0xe581a7, 0xe581aa, 0xe581ad, 0xe581b0,
+ /* f5 */ 0xe581b1, 0xe580bb, 0xe58281, 0xe58283,
+ /* f9 */ 0xe58284, 0xe58286, 0xe5828a, 0xe5828e,
+ /* fd */ 0xe5828f, 0xe58290,
+
+ /*** Three byte table, leaf: 8fb2xx - offset 0x02105 ***/
+
+ /* a1 */ 0xe58292, 0xe58293, 0xe58294, 0xe58296,
+ /* a5 */ 0xe5829b, 0xe5829c, 0xe5829e, 0xe5829f,
+ /* a9 */ 0xe582a0, 0xe582a1, 0xe582a2, 0xe582aa,
+ /* ad */ 0xe582af, 0xe582b0, 0xe582b9, 0xe582ba,
+ /* b1 */ 0xe582bd, 0xe58380, 0xe58383, 0xe58384,
+ /* b5 */ 0xe58387, 0xe5838c, 0xe5838e, 0xe58390,
+ /* b9 */ 0xe58393, 0xe58394, 0xe58398, 0xe5839c,
+ /* bd */ 0xe5839d, 0xe5839f, 0xe583a2, 0xe583a4,
+ /* c1 */ 0xe583a6, 0xe583a8, 0xe583a9, 0xe583af,
+ /* c5 */ 0xe583b1, 0xe583b6, 0xe583ba, 0xe583be,
+ /* c9 */ 0xe58483, 0xe58486, 0xe58487, 0xe58488,
+ /* cd */ 0xe5848b, 0xe5848c, 0xe5848d, 0xe5848e,
+ /* d1 */ 0xe583b2, 0xe58490, 0xe58497, 0xe58499,
+ /* d5 */ 0xe5849b, 0xe5849c, 0xe5849d, 0xe5849e,
+ /* d9 */ 0xe584a3, 0xe584a7, 0xe584a8, 0xe584ac,
+ /* dd */ 0xe584ad, 0xe584af, 0xe584b1, 0xe584b3,
+ /* e1 */ 0xe584b4, 0xe584b5, 0xe584b8, 0xe584b9,
+ /* e5 */ 0xe58582, 0xe5858a, 0xe5858f, 0xe58593,
+ /* e9 */ 0xe58595, 0xe58597, 0xe58598, 0xe5859f,
+ /* ed */ 0xe585a4, 0xe585a6, 0xe585be, 0xe58683,
+ /* f1 */ 0xe58684, 0xe5868b, 0xe5868e, 0xe58698,
+ /* f5 */ 0xe5869d, 0xe586a1, 0xe586a3, 0xe586ad,
+ /* f9 */ 0xe586b8, 0xe586ba, 0xe586bc, 0xe586be,
+ /* fd */ 0xe586bf, 0xe58782,
+
+ /*** Three byte table, leaf: 8fb3xx - offset 0x02163 ***/
+
+ /* a1 */ 0xe58788, 0xe5878f, 0xe58791, 0xe58792,
+ /* a5 */ 0xe58793, 0xe58795, 0xe58798, 0xe5879e,
+ /* a9 */ 0xe587a2, 0xe587a5, 0xe587ae, 0xe587b2,
+ /* ad */ 0xe587b3, 0xe587b4, 0xe587b7, 0xe58881,
+ /* b1 */ 0xe58882, 0xe58885, 0xe58892, 0xe58893,
+ /* b5 */ 0xe58895, 0xe58896, 0xe58898, 0xe588a2,
+ /* b9 */ 0xe588a8, 0xe588b1, 0xe588b2, 0xe588b5,
+ /* bd */ 0xe588bc, 0xe58985, 0xe58989, 0xe58995,
+ /* c1 */ 0xe58997, 0xe58998, 0xe5899a, 0xe5899c,
+ /* c5 */ 0xe5899f, 0xe589a0, 0xe589a1, 0xe589a6,
+ /* c9 */ 0xe589ae, 0xe589b7, 0xe589b8, 0xe589b9,
+ /* cd */ 0xe58a80, 0xe58a82, 0xe58a85, 0xe58a8a,
+ /* d1 */ 0xe58a8c, 0xe58a93, 0xe58a95, 0xe58a96,
+ /* d5 */ 0xe58a97, 0xe58a98, 0xe58a9a, 0xe58a9c,
+ /* d9 */ 0xe58aa4, 0xe58aa5, 0xe58aa6, 0xe58aa7,
+ /* dd */ 0xe58aaf, 0xe58ab0, 0xe58ab6, 0xe58ab7,
+ /* e1 */ 0xe58ab8, 0xe58aba, 0xe58abb, 0xe58abd,
+ /* e5 */ 0xe58b80, 0xe58b84, 0xe58b86, 0xe58b88,
+ /* e9 */ 0xe58b8c, 0xe58b8f, 0xe58b91, 0xe58b94,
+ /* ed */ 0xe58b96, 0xe58b9b, 0xe58b9c, 0xe58ba1,
+ /* f1 */ 0xe58ba5, 0xe58ba8, 0xe58ba9, 0xe58baa,
+ /* f5 */ 0xe58bac, 0xe58bb0, 0xe58bb1, 0xe58bb4,
+ /* f9 */ 0xe58bb6, 0xe58bb7, 0xe58c80, 0xe58c83,
+ /* fd */ 0xe58c8a, 0xe58c8b,
+
+ /*** Three byte table, leaf: 8fb4xx - offset 0x021c1 ***/
+
+ /* a1 */ 0xe58c8c, 0xe58c91, 0xe58c93, 0xe58c98,
+ /* a5 */ 0xe58c9b, 0xe58c9c, 0xe58c9e, 0xe58c9f,
+ /* a9 */ 0xe58ca5, 0xe58ca7, 0xe58ca8, 0xe58ca9,
+ /* ad */ 0xe58cab, 0xe58cac, 0xe58cad, 0xe58cb0,
+ /* b1 */ 0xe58cb2, 0xe58cb5, 0xe58cbc, 0xe58cbd,
+ /* b5 */ 0xe58cbe, 0xe58d82, 0xe58d8c, 0xe58d8b,
+ /* b9 */ 0xe58d99, 0xe58d9b, 0xe58da1, 0xe58da3,
+ /* bd */ 0xe58da5, 0xe58dac, 0xe58dad, 0xe58db2,
+ /* c1 */ 0xe58db9, 0xe58dbe, 0xe58e83, 0xe58e87,
+ /* c5 */ 0xe58e88, 0xe58e8e, 0xe58e93, 0xe58e94,
+ /* c9 */ 0xe58e99, 0xe58e9d, 0xe58ea1, 0xe58ea4,
+ /* cd */ 0xe58eaa, 0xe58eab, 0xe58eaf, 0xe58eb2,
+ /* d1 */ 0xe58eb4, 0xe58eb5, 0xe58eb7, 0xe58eb8,
+ /* d5 */ 0xe58eba, 0xe58ebd, 0xe58f80, 0xe58f85,
+ /* d9 */ 0xe58f8f, 0xe58f92, 0xe58f93, 0xe58f95,
+ /* dd */ 0xe58f9a, 0xe58f9d, 0xe58f9e, 0xe58fa0,
+ /* e1 */ 0xe58fa6, 0xe58fa7, 0xe58fb5, 0xe59082,
+ /* e5 */ 0xe59093, 0xe5909a, 0xe590a1, 0xe590a7,
+ /* e9 */ 0xe590a8, 0xe590aa, 0xe590af, 0xe590b1,
+ /* ed */ 0xe590b4, 0xe590b5, 0xe59183, 0xe59184,
+ /* f1 */ 0xe59187, 0xe5918d, 0xe5918f, 0xe5919e,
+ /* f5 */ 0xe591a2, 0xe591a4, 0xe591a6, 0xe591a7,
+ /* f9 */ 0xe591a9, 0xe591ab, 0xe591ad, 0xe591ae,
+ /* fd */ 0xe591b4, 0xe591bf,
+
+ /*** Three byte table, leaf: 8fb5xx - offset 0x0221f ***/
+
+ /* a1 */ 0xe59281, 0xe59283, 0xe59285, 0xe59288,
+ /* a5 */ 0xe59289, 0xe5928d, 0xe59291, 0xe59295,
+ /* a9 */ 0xe59296, 0xe5929c, 0xe5929f, 0xe592a1,
+ /* ad */ 0xe592a6, 0xe592a7, 0xe592a9, 0xe592aa,
+ /* b1 */ 0xe592ad, 0xe592ae, 0xe592b1, 0xe592b7,
+ /* b5 */ 0xe592b9, 0xe592ba, 0xe592bb, 0xe592bf,
+ /* b9 */ 0xe59386, 0xe5938a, 0xe5938d, 0xe5938e,
+ /* bd */ 0xe593a0, 0xe593aa, 0xe593ac, 0xe593af,
+ /* c1 */ 0xe593b6, 0xe593bc, 0xe593be, 0xe593bf,
+ /* c5 */ 0xe59480, 0xe59481, 0xe59485, 0xe59488,
+ /* c9 */ 0xe59489, 0xe5948c, 0xe5948d, 0xe5948e,
+ /* cd */ 0xe59495, 0xe594aa, 0xe594ab, 0xe594b2,
+ /* d1 */ 0xe594b5, 0xe594b6, 0xe594bb, 0xe594bc,
+ /* d5 */ 0xe594bd, 0xe59581, 0xe59587, 0xe59589,
+ /* d9 */ 0xe5958a, 0xe5958d, 0xe59590, 0xe59591,
+ /* dd */ 0xe59598, 0xe5959a, 0xe5959b, 0xe5959e,
+ /* e1 */ 0xe595a0, 0xe595a1, 0xe595a4, 0xe595a6,
+ /* e5 */ 0xe595bf, 0xe59681, 0xe59682, 0xe59686,
+ /* e9 */ 0xe59688, 0xe5968e, 0xe5968f, 0xe59691,
+ /* ed */ 0xe59692, 0xe59693, 0xe59694, 0xe59697,
+ /* f1 */ 0xe596a3, 0xe596a4, 0xe596ad, 0xe596b2,
+ /* f5 */ 0xe596bf, 0xe59781, 0xe59783, 0xe59786,
+ /* f9 */ 0xe59789, 0xe5978b, 0xe5978c, 0xe5978e,
+ /* fd */ 0xe59791, 0xe59792,
+
+ /*** Three byte table, leaf: 8fb6xx - offset 0x0227d ***/
+
+ /* a1 */ 0xe59793, 0xe59797, 0xe59798, 0xe5979b,
+ /* a5 */ 0xe5979e, 0xe597a2, 0xe597a9, 0xe597b6,
+ /* a9 */ 0xe597bf, 0xe59885, 0xe59888, 0xe5988a,
+ /* ad */ 0xe5988d, 0xe5988e, 0xe5988f, 0xe59890,
+ /* b1 */ 0xe59891, 0xe59892, 0xe59899, 0xe598ac,
+ /* b5 */ 0xe598b0, 0xe598b3, 0xe598b5, 0xe598b7,
+ /* b9 */ 0xe598b9, 0xe598bb, 0xe598bc, 0xe598bd,
+ /* bd */ 0xe598bf, 0xe59980, 0xe59981, 0xe59983,
+ /* c1 */ 0xe59984, 0xe59986, 0xe59989, 0xe5998b,
+ /* c5 */ 0xe5998d, 0xe5998f, 0xe59994, 0xe5999e,
+ /* c9 */ 0xe599a0, 0xe599a1, 0xe599a2, 0xe599a3,
+ /* cd */ 0xe599a6, 0xe599a9, 0xe599ad, 0xe599af,
+ /* d1 */ 0xe599b1, 0xe599b2, 0xe599b5, 0xe59a84,
+ /* d5 */ 0xe59a85, 0xe59a88, 0xe59a8b, 0xe59a8c,
+ /* d9 */ 0xe59a95, 0xe59a99, 0xe59a9a, 0xe59a9d,
+ /* dd */ 0xe59a9e, 0xe59a9f, 0xe59aa6, 0xe59aa7,
+ /* e1 */ 0xe59aa8, 0xe59aa9, 0xe59aab, 0xe59aac,
+ /* e5 */ 0xe59aad, 0xe59ab1, 0xe59ab3, 0xe59ab7,
+ /* e9 */ 0xe59abe, 0xe59b85, 0xe59b89, 0xe59b8a,
+ /* ed */ 0xe59b8b, 0xe59b8f, 0xe59b90, 0xe59b8c,
+ /* f1 */ 0xe59b8d, 0xe59b99, 0xe59b9c, 0xe59b9d,
+ /* f5 */ 0xe59b9f, 0xe59ba1, 0xe59ba4, 0xe59ba5,
+ /* f9 */ 0xe59ba6, 0xe59ba7, 0xe59ba8, 0xe59bb1,
+ /* fd */ 0xe59bab, 0xe59bad,
+
+ /*** Three byte table, leaf: 8fb7xx - offset 0x022db ***/
+
+ /* a1 */ 0xe59bb6, 0xe59bb7, 0xe59c81, 0xe59c82,
+ /* a5 */ 0xe59c87, 0xe59c8a, 0xe59c8c, 0xe59c91,
+ /* a9 */ 0xe59c95, 0xe59c9a, 0xe59c9b, 0xe59c9d,
+ /* ad */ 0xe59ca0, 0xe59ca2, 0xe59ca3, 0xe59ca4,
+ /* b1 */ 0xe59ca5, 0xe59ca9, 0xe59caa, 0xe59cac,
+ /* b5 */ 0xe59cae, 0xe59caf, 0xe59cb3, 0xe59cb4,
+ /* b9 */ 0xe59cbd, 0xe59cbe, 0xe59cbf, 0xe59d85,
+ /* bd */ 0xe59d86, 0xe59d8c, 0xe59d8d, 0xe59d92,
+ /* c1 */ 0xe59da2, 0xe59da5, 0xe59da7, 0xe59da8,
+ /* c5 */ 0xe59dab, 0xe59dad, 0xe59dae, 0xe59daf,
+ /* c9 */ 0xe59db0, 0xe59db1, 0xe59db3, 0xe59db4,
+ /* cd */ 0xe59db5, 0xe59db7, 0xe59db9, 0xe59dba,
+ /* d1 */ 0xe59dbb, 0xe59dbc, 0xe59dbe, 0xe59e81,
+ /* d5 */ 0xe59e83, 0xe59e8c, 0xe59e94, 0xe59e97,
+ /* d9 */ 0xe59e99, 0xe59e9a, 0xe59e9c, 0xe59e9d,
+ /* dd */ 0xe59e9e, 0xe59e9f, 0xe59ea1, 0xe59e95,
+ /* e1 */ 0xe59ea7, 0xe59ea8, 0xe59ea9, 0xe59eac,
+ /* e5 */ 0xe59eb8, 0xe59ebd, 0xe59f87, 0xe59f88,
+ /* e9 */ 0xe59f8c, 0xe59f8f, 0xe59f95, 0xe59f9d,
+ /* ed */ 0xe59f9e, 0xe59fa4, 0xe59fa6, 0xe59fa7,
+ /* f1 */ 0xe59fa9, 0xe59fad, 0xe59fb0, 0xe59fb5,
+ /* f5 */ 0xe59fb6, 0xe59fb8, 0xe59fbd, 0xe59fbe,
+ /* f9 */ 0xe59fbf, 0xe5a083, 0xe5a084, 0xe5a088,
+ /* fd */ 0xe5a089, 0xe59fa1,
+
+ /*** Three byte table, leaf: 8fb8xx - offset 0x02339 ***/
+
+ /* a1 */ 0xe5a08c, 0xe5a08d, 0xe5a09b, 0xe5a09e,
+ /* a5 */ 0xe5a09f, 0xe5a0a0, 0xe5a0a6, 0xe5a0a7,
+ /* a9 */ 0xe5a0ad, 0xe5a0b2, 0xe5a0b9, 0xe5a0bf,
+ /* ad */ 0xe5a189, 0xe5a18c, 0xe5a18d, 0xe5a18f,
+ /* b1 */ 0xe5a190, 0xe5a195, 0xe5a19f, 0xe5a1a1,
+ /* b5 */ 0xe5a1a4, 0xe5a1a7, 0xe5a1a8, 0xe5a1b8,
+ /* b9 */ 0xe5a1bc, 0xe5a1bf, 0xe5a280, 0xe5a281,
+ /* bd */ 0xe5a287, 0xe5a288, 0xe5a289, 0xe5a28a,
+ /* c1 */ 0xe5a28c, 0xe5a28d, 0xe5a28f, 0xe5a290,
+ /* c5 */ 0xe5a294, 0xe5a296, 0xe5a29d, 0xe5a2a0,
+ /* c9 */ 0xe5a2a1, 0xe5a2a2, 0xe5a2a6, 0xe5a2a9,
+ /* cd */ 0xe5a2b1, 0xe5a2b2, 0xe5a384, 0xe5a2bc,
+ /* d1 */ 0xe5a382, 0xe5a388, 0xe5a38d, 0xe5a38e,
+ /* d5 */ 0xe5a390, 0xe5a392, 0xe5a394, 0xe5a396,
+ /* d9 */ 0xe5a39a, 0xe5a39d, 0xe5a3a1, 0xe5a3a2,
+ /* dd */ 0xe5a3a9, 0xe5a3b3, 0xe5a485, 0xe5a486,
+ /* e1 */ 0xe5a48b, 0xe5a48c, 0xe5a492, 0xe5a493,
+ /* e5 */ 0xe5a494, 0xe89981, 0xe5a49d, 0xe5a4a1,
+ /* e9 */ 0xe5a4a3, 0xe5a4a4, 0xe5a4a8, 0xe5a4af,
+ /* ed */ 0xe5a4b0, 0xe5a4b3, 0xe5a4b5, 0xe5a4b6,
+ /* f1 */ 0xe5a4bf, 0xe5a583, 0xe5a586, 0xe5a592,
+ /* f5 */ 0xe5a593, 0xe5a599, 0xe5a59b, 0xe5a59d,
+ /* f9 */ 0xe5a59e, 0xe5a59f, 0xe5a5a1, 0xe5a5a3,
+ /* fd */ 0xe5a5ab, 0xe5a5ad,
+
+ /*** Three byte table, leaf: 8fb9xx - offset 0x02397 ***/
+
+ /* a1 */ 0xe5a5af, 0xe5a5b2, 0xe5a5b5, 0xe5a5b6,
+ /* a5 */ 0xe5a5b9, 0xe5a5bb, 0xe5a5bc, 0xe5a68b,
+ /* a9 */ 0xe5a68c, 0xe5a68e, 0xe5a692, 0xe5a695,
+ /* ad */ 0xe5a697, 0xe5a69f, 0xe5a6a4, 0xe5a6a7,
+ /* b1 */ 0xe5a6ad, 0xe5a6ae, 0xe5a6af, 0xe5a6b0,
+ /* b5 */ 0xe5a6b3, 0xe5a6b7, 0xe5a6ba, 0xe5a6bc,
+ /* b9 */ 0xe5a781, 0xe5a783, 0xe5a784, 0xe5a788,
+ /* bd */ 0xe5a78a, 0xe5a78d, 0xe5a792, 0xe5a79d,
+ /* c1 */ 0xe5a79e, 0xe5a79f, 0xe5a7a3, 0xe5a7a4,
+ /* c5 */ 0xe5a7a7, 0xe5a7ae, 0xe5a7af, 0xe5a7b1,
+ /* c9 */ 0xe5a7b2, 0xe5a7b4, 0xe5a7b7, 0xe5a880,
+ /* cd */ 0xe5a884, 0xe5a88c, 0xe5a88d, 0xe5a88e,
+ /* d1 */ 0xe5a892, 0xe5a893, 0xe5a89e, 0xe5a8a3,
+ /* d5 */ 0xe5a8a4, 0xe5a8a7, 0xe5a8a8, 0xe5a8aa,
+ /* d9 */ 0xe5a8ad, 0xe5a8b0, 0xe5a984, 0xe5a985,
+ /* dd */ 0xe5a987, 0xe5a988, 0xe5a98c, 0xe5a990,
+ /* e1 */ 0xe5a995, 0xe5a99e, 0xe5a9a3, 0xe5a9a5,
+ /* e5 */ 0xe5a9a7, 0xe5a9ad, 0xe5a9b7, 0xe5a9ba,
+ /* e9 */ 0xe5a9bb, 0xe5a9be, 0xe5aa8b, 0xe5aa90,
+ /* ed */ 0xe5aa93, 0xe5aa96, 0xe5aa99, 0xe5aa9c,
+ /* f1 */ 0xe5aa9e, 0xe5aa9f, 0xe5aaa0, 0xe5aaa2,
+ /* f5 */ 0xe5aaa7, 0xe5aaac, 0xe5aab1, 0xe5aab2,
+ /* f9 */ 0xe5aab3, 0xe5aab5, 0xe5aab8, 0xe5aaba,
+ /* fd */ 0xe5aabb, 0xe5aabf,
+
+ /*** Three byte table, leaf: 8fbaxx - offset 0x023f5 ***/
+
+ /* a1 */ 0xe5ab84, 0xe5ab86, 0xe5ab88, 0xe5ab8f,
+ /* a5 */ 0xe5ab9a, 0xe5ab9c, 0xe5aba0, 0xe5aba5,
+ /* a9 */ 0xe5abaa, 0xe5abae, 0xe5abb5, 0xe5abb6,
+ /* ad */ 0xe5abbd, 0xe5ac80, 0xe5ac81, 0xe5ac88,
+ /* b1 */ 0xe5ac97, 0xe5acb4, 0xe5ac99, 0xe5ac9b,
+ /* b5 */ 0xe5ac9d, 0xe5aca1, 0xe5aca5, 0xe5acad,
+ /* b9 */ 0xe5acb8, 0xe5ad81, 0xe5ad8b, 0xe5ad8c,
+ /* bd */ 0xe5ad92, 0xe5ad96, 0xe5ad9e, 0xe5ada8,
+ /* c1 */ 0xe5adae, 0xe5adaf, 0xe5adbc, 0xe5adbd,
+ /* c5 */ 0xe5adbe, 0xe5adbf, 0xe5ae81, 0xe5ae84,
+ /* c9 */ 0xe5ae86, 0xe5ae8a, 0xe5ae8e, 0xe5ae90,
+ /* cd */ 0xe5ae91, 0xe5ae93, 0xe5ae94, 0xe5ae96,
+ /* d1 */ 0xe5aea8, 0xe5aea9, 0xe5aeac, 0xe5aead,
+ /* d5 */ 0xe5aeaf, 0xe5aeb1, 0xe5aeb2, 0xe5aeb7,
+ /* d9 */ 0xe5aeba, 0xe5aebc, 0xe5af80, 0xe5af81,
+ /* dd */ 0xe5af8d, 0xe5af8f, 0xe5af96, 0xe5af97,
+ /* e1 */ 0xe5af98, 0xe5af99, 0xe5af9a, 0xe5afa0,
+ /* e5 */ 0xe5afaf, 0xe5afb1, 0xe5afb4, 0xe5afbd,
+ /* e9 */ 0xe5b08c, 0xe5b097, 0xe5b09e, 0xe5b09f,
+ /* ed */ 0xe5b0a3, 0xe5b0a6, 0xe5b0a9, 0xe5b0ab,
+ /* f1 */ 0xe5b0ac, 0xe5b0ae, 0xe5b0b0, 0xe5b0b2,
+ /* f5 */ 0xe5b0b5, 0xe5b0b6, 0xe5b199, 0xe5b19a,
+ /* f9 */ 0xe5b19c, 0xe5b1a2, 0xe5b1a3, 0xe5b1a7,
+ /* fd */ 0xe5b1a8, 0xe5b1a9,
+
+ /*** Three byte table, leaf: 8fbbxx - offset 0x02453 ***/
+
+ /* a1 */ 0xe5b1ad, 0xe5b1b0, 0xe5b1b4, 0xe5b1b5,
+ /* a5 */ 0xe5b1ba, 0xe5b1bb, 0xe5b1bc, 0xe5b1bd,
+ /* a9 */ 0xe5b287, 0xe5b288, 0xe5b28a, 0xe5b28f,
+ /* ad */ 0xe5b292, 0xe5b29d, 0xe5b29f, 0xe5b2a0,
+ /* b1 */ 0xe5b2a2, 0xe5b2a3, 0xe5b2a6, 0xe5b2aa,
+ /* b5 */ 0xe5b2b2, 0xe5b2b4, 0xe5b2b5, 0xe5b2ba,
+ /* b9 */ 0xe5b389, 0xe5b38b, 0xe5b392, 0xe5b39d,
+ /* bd */ 0xe5b397, 0xe5b3ae, 0xe5b3b1, 0xe5b3b2,
+ /* c1 */ 0xe5b3b4, 0xe5b481, 0xe5b486, 0xe5b48d,
+ /* c5 */ 0xe5b492, 0xe5b4ab, 0xe5b4a3, 0xe5b4a4,
+ /* c9 */ 0xe5b4a6, 0xe5b4a7, 0xe5b4b1, 0xe5b4b4,
+ /* cd */ 0xe5b4b9, 0xe5b4bd, 0xe5b4bf, 0xe5b582,
+ /* d1 */ 0xe5b583, 0xe5b586, 0xe5b588, 0xe5b595,
+ /* d5 */ 0xe5b591, 0xe5b599, 0xe5b58a, 0xe5b59f,
+ /* d9 */ 0xe5b5a0, 0xe5b5a1, 0xe5b5a2, 0xe5b5a4,
+ /* dd */ 0xe5b5aa, 0xe5b5ad, 0xe5b5b0, 0xe5b5b9,
+ /* e1 */ 0xe5b5ba, 0xe5b5be, 0xe5b5bf, 0xe5b681,
+ /* e5 */ 0xe5b683, 0xe5b688, 0xe5b68a, 0xe5b692,
+ /* e9 */ 0xe5b693, 0xe5b694, 0xe5b695, 0xe5b699,
+ /* ed */ 0xe5b69b, 0xe5b69f, 0xe5b6a0, 0xe5b6a7,
+ /* f1 */ 0xe5b6ab, 0xe5b6b0, 0xe5b6b4, 0xe5b6b8,
+ /* f5 */ 0xe5b6b9, 0xe5b783, 0xe5b787, 0xe5b78b,
+ /* f9 */ 0xe5b790, 0xe5b78e, 0xe5b798, 0xe5b799,
+ /* fd */ 0xe5b7a0, 0xe5b7a4,
+
+ /*** Three byte table, leaf: 8fbcxx - offset 0x024b1 ***/
+
+ /* a1 */ 0xe5b7a9, 0xe5b7b8, 0xe5b7b9, 0xe5b880,
+ /* a5 */ 0xe5b887, 0xe5b88d, 0xe5b892, 0xe5b894,
+ /* a9 */ 0xe5b895, 0xe5b898, 0xe5b89f, 0xe5b8a0,
+ /* ad */ 0xe5b8ae, 0xe5b8a8, 0xe5b8b2, 0xe5b8b5,
+ /* b1 */ 0xe5b8be, 0xe5b98b, 0xe5b990, 0xe5b989,
+ /* b5 */ 0xe5b991, 0xe5b996, 0xe5b998, 0xe5b99b,
+ /* b9 */ 0xe5b99c, 0xe5b99e, 0xe5b9a8, 0xe5b9aa,
+ /* bd */ 0xe5b9ab, 0xe5b9ac, 0xe5b9ad, 0xe5b9ae,
+ /* c1 */ 0xe5b9b0, 0xe5ba80, 0xe5ba8b, 0xe5ba8e,
+ /* c5 */ 0xe5baa2, 0xe5baa4, 0xe5baa5, 0xe5baa8,
+ /* c9 */ 0xe5baaa, 0xe5baac, 0xe5bab1, 0xe5bab3,
+ /* cd */ 0xe5babd, 0xe5babe, 0xe5babf, 0xe5bb86,
+ /* d1 */ 0xe5bb8c, 0xe5bb8b, 0xe5bb8e, 0xe5bb91,
+ /* d5 */ 0xe5bb92, 0xe5bb94, 0xe5bb95, 0xe5bb9c,
+ /* d9 */ 0xe5bb9e, 0xe5bba5, 0xe5bbab, 0xe5bc82,
+ /* dd */ 0xe5bc86, 0xe5bc87, 0xe5bc88, 0xe5bc8e,
+ /* e1 */ 0xe5bc99, 0xe5bc9c, 0xe5bc9d, 0xe5bca1,
+ /* e5 */ 0xe5bca2, 0xe5bca3, 0xe5bca4, 0xe5bca8,
+ /* e9 */ 0xe5bcab, 0xe5bcac, 0xe5bcae, 0xe5bcb0,
+ /* ed */ 0xe5bcb4, 0xe5bcb6, 0xe5bcbb, 0xe5bcbd,
+ /* f1 */ 0xe5bcbf, 0xe5bd80, 0xe5bd84, 0xe5bd85,
+ /* f5 */ 0xe5bd87, 0xe5bd8d, 0xe5bd90, 0xe5bd94,
+ /* f9 */ 0xe5bd98, 0xe5bd9b, 0xe5bda0, 0xe5bda3,
+ /* fd */ 0xe5bda4, 0xe5bda7,
+
+ /*** Three byte table, leaf: 8fbdxx - offset 0x0250f ***/
+
+ /* a1 */ 0xe5bdaf, 0xe5bdb2, 0xe5bdb4, 0xe5bdb5,
+ /* a5 */ 0xe5bdb8, 0xe5bdba, 0xe5bdbd, 0xe5bdbe,
+ /* a9 */ 0xe5be89, 0xe5be8d, 0xe5be8f, 0xe5be96,
+ /* ad */ 0xe5be9c, 0xe5be9d, 0xe5bea2, 0xe5bea7,
+ /* b1 */ 0xe5beab, 0xe5bea4, 0xe5beac, 0xe5beaf,
+ /* b5 */ 0xe5beb0, 0xe5beb1, 0xe5beb8, 0xe5bf84,
+ /* b9 */ 0xe5bf87, 0xe5bf88, 0xe5bf89, 0xe5bf8b,
+ /* bd */ 0xe5bf90, 0xe5bf91, 0xe5bf92, 0xe5bf93,
+ /* c1 */ 0xe5bf94, 0xe5bf9e, 0xe5bfa1, 0xe5bfa2,
+ /* c5 */ 0xe5bfa8, 0xe5bfa9, 0xe5bfaa, 0xe5bfac,
+ /* c9 */ 0xe5bfad, 0xe5bfae, 0xe5bfaf, 0xe5bfb2,
+ /* cd */ 0xe5bfb3, 0xe5bfb6, 0xe5bfba, 0xe5bfbc,
+ /* d1 */ 0xe68087, 0xe6808a, 0xe6808d, 0xe68093,
+ /* d5 */ 0xe68094, 0xe68097, 0xe68098, 0xe6809a,
+ /* d9 */ 0xe6809f, 0xe680a4, 0xe680ad, 0xe680b3,
+ /* dd */ 0xe680b5, 0xe68180, 0xe68187, 0xe68188,
+ /* e1 */ 0xe68189, 0xe6818c, 0xe68191, 0xe68194,
+ /* e5 */ 0xe68196, 0xe68197, 0xe6819d, 0xe681a1,
+ /* e9 */ 0xe681a7, 0xe681b1, 0xe681be, 0xe681bf,
+ /* ed */ 0xe68282, 0xe68286, 0xe68288, 0xe6828a,
+ /* f1 */ 0xe6828e, 0xe68291, 0xe68293, 0xe68295,
+ /* f5 */ 0xe68298, 0xe6829d, 0xe6829e, 0xe682a2,
+ /* f9 */ 0xe682a4, 0xe682a5, 0xe682a8, 0xe682b0,
+ /* fd */ 0xe682b1, 0xe682b7,
+
+ /*** Three byte table, leaf: 8fbexx - offset 0x0256d ***/
+
+ /* a1 */ 0xe682bb, 0xe682be, 0xe68382, 0xe68384,
+ /* a5 */ 0xe68388, 0xe68389, 0xe6838a, 0xe6838b,
+ /* a9 */ 0xe6838e, 0xe6838f, 0xe68394, 0xe68395,
+ /* ad */ 0xe68399, 0xe6839b, 0xe6839d, 0xe6839e,
+ /* b1 */ 0xe683a2, 0xe683a5, 0xe683b2, 0xe683b5,
+ /* b5 */ 0xe683b8, 0xe683bc, 0xe683bd, 0xe68482,
+ /* b9 */ 0xe68487, 0xe6848a, 0xe6848c, 0xe68490,
+ /* bd */ 0xe68491, 0xe68492, 0xe68493, 0xe68494,
+ /* c1 */ 0xe68496, 0xe68497, 0xe68499, 0xe6849c,
+ /* c5 */ 0xe6849e, 0xe684a2, 0xe684aa, 0xe684ab,
+ /* c9 */ 0xe684b0, 0xe684b1, 0xe684b5, 0xe684b6,
+ /* cd */ 0xe684b7, 0xe684b9, 0xe68581, 0xe68585,
+ /* d1 */ 0xe68586, 0xe68589, 0xe6859e, 0xe685a0,
+ /* d5 */ 0xe685ac, 0xe685b2, 0xe685b8, 0xe685bb,
+ /* d9 */ 0xe685bc, 0xe685bf, 0xe68680, 0xe68681,
+ /* dd */ 0xe68683, 0xe68684, 0xe6868b, 0xe6868d,
+ /* e1 */ 0xe68692, 0xe68693, 0xe68697, 0xe68698,
+ /* e5 */ 0xe6869c, 0xe6869d, 0xe6869f, 0xe686a0,
+ /* e9 */ 0xe686a5, 0xe686a8, 0xe686aa, 0xe686ad,
+ /* ed */ 0xe686b8, 0xe686b9, 0xe686bc, 0xe68780,
+ /* f1 */ 0xe68781, 0xe68782, 0xe6878e, 0xe6878f,
+ /* f5 */ 0xe68795, 0xe6879c, 0xe6879d, 0xe6879e,
+ /* f9 */ 0xe6879f, 0xe687a1, 0xe687a2, 0xe687a7,
+ /* fd */ 0xe687a9, 0xe687a5,
+
+ /*** Three byte table, leaf: 8fbfxx - offset 0x025cb ***/
+
+ /* a1 */ 0xe687ac, 0xe687ad, 0xe687af, 0xe68881,
+ /* a5 */ 0xe68883, 0xe68884, 0xe68887, 0xe68893,
+ /* a9 */ 0xe68895, 0xe6889c, 0xe688a0, 0xe688a2,
+ /* ad */ 0xe688a3, 0xe688a7, 0xe688a9, 0xe688ab,
+ /* b1 */ 0xe688b9, 0xe688bd, 0xe68982, 0xe68983,
+ /* b5 */ 0xe68984, 0xe68986, 0xe6898c, 0xe68990,
+ /* b9 */ 0xe68991, 0xe68992, 0xe68994, 0xe68996,
+ /* bd */ 0xe6899a, 0xe6899c, 0xe689a4, 0xe689ad,
+ /* c1 */ 0xe689af, 0xe689b3, 0xe689ba, 0xe689bd,
+ /* c5 */ 0xe68a8d, 0xe68a8e, 0xe68a8f, 0xe68a90,
+ /* c9 */ 0xe68aa6, 0xe68aa8, 0xe68ab3, 0xe68ab6,
+ /* cd */ 0xe68ab7, 0xe68aba, 0xe68abe, 0xe68abf,
+ /* d1 */ 0xe68b84, 0xe68b8e, 0xe68b95, 0xe68b96,
+ /* d5 */ 0xe68b9a, 0xe68baa, 0xe68bb2, 0xe68bb4,
+ /* d9 */ 0xe68bbc, 0xe68bbd, 0xe68c83, 0xe68c84,
+ /* dd */ 0xe68c8a, 0xe68c8b, 0xe68c8d, 0xe68c90,
+ /* e1 */ 0xe68c93, 0xe68c96, 0xe68c98, 0xe68ca9,
+ /* e5 */ 0xe68caa, 0xe68cad, 0xe68cb5, 0xe68cb6,
+ /* e9 */ 0xe68cb9, 0xe68cbc, 0xe68d81, 0xe68d82,
+ /* ed */ 0xe68d83, 0xe68d84, 0xe68d86, 0xe68d8a,
+ /* f1 */ 0xe68d8b, 0xe68d8e, 0xe68d92, 0xe68d93,
+ /* f5 */ 0xe68d94, 0xe68d98, 0xe68d9b, 0xe68da5,
+ /* f9 */ 0xe68da6, 0xe68dac, 0xe68dad, 0xe68db1,
+ /* fd */ 0xe68db4, 0xe68db5,
+
+ /*** Three byte table, leaf: 8fc0xx - offset 0x02629 ***/
+
+ /* a1 */ 0xe68db8, 0xe68dbc, 0xe68dbd, 0xe68dbf,
+ /* a5 */ 0xe68e82, 0xe68e84, 0xe68e87, 0xe68e8a,
+ /* a9 */ 0xe68e90, 0xe68e94, 0xe68e95, 0xe68e99,
+ /* ad */ 0xe68e9a, 0xe68e9e, 0xe68ea4, 0xe68ea6,
+ /* b1 */ 0xe68ead, 0xe68eae, 0xe68eaf, 0xe68ebd,
+ /* b5 */ 0xe68f81, 0xe68f85, 0xe68f88, 0xe68f8e,
+ /* b9 */ 0xe68f91, 0xe68f93, 0xe68f94, 0xe68f95,
+ /* bd */ 0xe68f9c, 0xe68fa0, 0xe68fa5, 0xe68faa,
+ /* c1 */ 0xe68fac, 0xe68fb2, 0xe68fb3, 0xe68fb5,
+ /* c5 */ 0xe68fb8, 0xe68fb9, 0xe69089, 0xe6908a,
+ /* c9 */ 0xe69090, 0xe69092, 0xe69094, 0xe69098,
+ /* cd */ 0xe6909e, 0xe690a0, 0xe690a2, 0xe690a4,
+ /* d1 */ 0xe690a5, 0xe690a9, 0xe690aa, 0xe690af,
+ /* d5 */ 0xe690b0, 0xe690b5, 0xe690bd, 0xe690bf,
+ /* d9 */ 0xe6918b, 0xe6918f, 0xe69191, 0xe69192,
+ /* dd */ 0xe69193, 0xe69194, 0xe6919a, 0xe6919b,
+ /* e1 */ 0xe6919c, 0xe6919d, 0xe6919f, 0xe691a0,
+ /* e5 */ 0xe691a1, 0xe691a3, 0xe691ad, 0xe691b3,
+ /* e9 */ 0xe691b4, 0xe691bb, 0xe691bd, 0xe69285,
+ /* ed */ 0xe69287, 0xe6928f, 0xe69290, 0xe69291,
+ /* f1 */ 0xe69298, 0xe69299, 0xe6929b, 0xe6929d,
+ /* f5 */ 0xe6929f, 0xe692a1, 0xe692a3, 0xe692a6,
+ /* f9 */ 0xe692a8, 0xe692ac, 0xe692b3, 0xe692bd,
+ /* fd */ 0xe692be, 0xe692bf,
+
+ /*** Three byte table, leaf: 8fc1xx - offset 0x02687 ***/
+
+ /* a1 */ 0xe69384, 0xe69389, 0xe6938a, 0xe6938b,
+ /* a5 */ 0xe6938c, 0xe6938e, 0xe69390, 0xe69391,
+ /* a9 */ 0xe69395, 0xe69397, 0xe693a4, 0xe693a5,
+ /* ad */ 0xe693a9, 0xe693aa, 0xe693ad, 0xe693b0,
+ /* b1 */ 0xe693b5, 0xe693b7, 0xe693bb, 0xe693bf,
+ /* b5 */ 0xe69481, 0xe69484, 0xe69488, 0xe69489,
+ /* b9 */ 0xe6948a, 0xe6948f, 0xe69493, 0xe69494,
+ /* bd */ 0xe69496, 0xe69499, 0xe6949b, 0xe6949e,
+ /* c1 */ 0xe6949f, 0xe694a2, 0xe694a6, 0xe694a9,
+ /* c5 */ 0xe694ae, 0xe694b1, 0xe694ba, 0xe694bc,
+ /* c9 */ 0xe694bd, 0xe69583, 0xe69587, 0xe69589,
+ /* cd */ 0xe69590, 0xe69592, 0xe69594, 0xe6959f,
+ /* d1 */ 0xe695a0, 0xe695a7, 0xe695ab, 0xe695ba,
+ /* d5 */ 0xe695bd, 0xe69681, 0xe69685, 0xe6968a,
+ /* d9 */ 0xe69692, 0xe69695, 0xe69698, 0xe6969d,
+ /* dd */ 0xe696a0, 0xe696a3, 0xe696a6, 0xe696ae,
+ /* e1 */ 0xe696b2, 0xe696b3, 0xe696b4, 0xe696bf,
+ /* e5 */ 0xe69782, 0xe69788, 0xe69789, 0xe6978e,
+ /* e9 */ 0xe69790, 0xe69794, 0xe69796, 0xe69798,
+ /* ed */ 0xe6979f, 0xe697b0, 0xe697b2, 0xe697b4,
+ /* f1 */ 0xe697b5, 0xe697b9, 0xe697be, 0xe697bf,
+ /* f5 */ 0xe69880, 0xe69884, 0xe69888, 0xe69889,
+ /* f9 */ 0xe6988d, 0xe69891, 0xe69892, 0xe69895,
+ /* fd */ 0xe69896, 0xe6989d,
+
+ /*** Three byte table, leaf: 8fc2xx - offset 0x026e5 ***/
+
+ /* a1 */ 0xe6989e, 0xe698a1, 0xe698a2, 0xe698a3,
+ /* a5 */ 0xe698a4, 0xe698a6, 0xe698a9, 0xe698aa,
+ /* a9 */ 0xe698ab, 0xe698ac, 0xe698ae, 0xe698b0,
+ /* ad */ 0xe698b1, 0xe698b3, 0xe698b9, 0xe698b7,
+ /* b1 */ 0xe69980, 0xe69985, 0xe69986, 0xe6998a,
+ /* b5 */ 0xe6998c, 0xe69991, 0xe6998e, 0xe69997,
+ /* b9 */ 0xe69998, 0xe69999, 0xe6999b, 0xe6999c,
+ /* bd */ 0xe699a0, 0xe699a1, 0xe69bbb, 0xe699aa,
+ /* c1 */ 0xe699ab, 0xe699ac, 0xe699be, 0xe699b3,
+ /* c5 */ 0xe699b5, 0xe699bf, 0xe699b7, 0xe699b8,
+ /* c9 */ 0xe699b9, 0xe699bb, 0xe69a80, 0xe699bc,
+ /* cd */ 0xe69a8b, 0xe69a8c, 0xe69a8d, 0xe69a90,
+ /* d1 */ 0xe69a92, 0xe69a99, 0xe69a9a, 0xe69a9b,
+ /* d5 */ 0xe69a9c, 0xe69a9f, 0xe69aa0, 0xe69aa4,
+ /* d9 */ 0xe69aad, 0xe69ab1, 0xe69ab2, 0xe69ab5,
+ /* dd */ 0xe69abb, 0xe69abf, 0xe69b80, 0xe69b82,
+ /* e1 */ 0xe69b83, 0xe69b88, 0xe69b8c, 0xe69b8e,
+ /* e5 */ 0xe69b8f, 0xe69b94, 0xe69b9b, 0xe69b9f,
+ /* e9 */ 0xe69ba8, 0xe69bab, 0xe69bac, 0xe69bae,
+ /* ed */ 0xe69bba, 0xe69c85, 0xe69c87, 0xe69c8e,
+ /* f1 */ 0xe69c93, 0xe69c99, 0xe69c9c, 0xe69ca0,
+ /* f5 */ 0xe69ca2, 0xe69cb3, 0xe69cbe, 0xe69d85,
+ /* f9 */ 0xe69d87, 0xe69d88, 0xe69d8c, 0xe69d94,
+ /* fd */ 0xe69d95, 0xe69d9d,
+
+ /*** Three byte table, leaf: 8fc3xx - offset 0x02743 ***/
+
+ /* a1 */ 0xe69da6, 0xe69dac, 0xe69dae, 0xe69db4,
+ /* a5 */ 0xe69db6, 0xe69dbb, 0xe69e81, 0xe69e84,
+ /* a9 */ 0xe69e8e, 0xe69e8f, 0xe69e91, 0xe69e93,
+ /* ad */ 0xe69e96, 0xe69e98, 0xe69e99, 0xe69e9b,
+ /* b1 */ 0xe69eb0, 0xe69eb1, 0xe69eb2, 0xe69eb5,
+ /* b5 */ 0xe69ebb, 0xe69ebc, 0xe69ebd, 0xe69fb9,
+ /* b9 */ 0xe69f80, 0xe69f82, 0xe69f83, 0xe69f85,
+ /* bd */ 0xe69f88, 0xe69f89, 0xe69f92, 0xe69f97,
+ /* c1 */ 0xe69f99, 0xe69f9c, 0xe69fa1, 0xe69fa6,
+ /* c5 */ 0xe69fb0, 0xe69fb2, 0xe69fb6, 0xe69fb7,
+ /* c9 */ 0xe6a192, 0xe6a094, 0xe6a099, 0xe6a09d,
+ /* cd */ 0xe6a09f, 0xe6a0a8, 0xe6a0a7, 0xe6a0ac,
+ /* d1 */ 0xe6a0ad, 0xe6a0af, 0xe6a0b0, 0xe6a0b1,
+ /* d5 */ 0xe6a0b3, 0xe6a0bb, 0xe6a0bf, 0xe6a184,
+ /* d9 */ 0xe6a185, 0xe6a18a, 0xe6a18c, 0xe6a195,
+ /* dd */ 0xe6a197, 0xe6a198, 0xe6a19b, 0xe6a1ab,
+ /* e1 */ 0xe6a1ae, 0xe6a1af, 0xe6a1b0, 0xe6a1b1,
+ /* e5 */ 0xe6a1b2, 0xe6a1b5, 0xe6a1b9, 0xe6a1ba,
+ /* e9 */ 0xe6a1bb, 0xe6a1bc, 0xe6a282, 0xe6a284,
+ /* ed */ 0xe6a286, 0xe6a288, 0xe6a296, 0xe6a298,
+ /* f1 */ 0xe6a29a, 0xe6a29c, 0xe6a2a1, 0xe6a2a3,
+ /* f5 */ 0xe6a2a5, 0xe6a2a9, 0xe6a2aa, 0xe6a2ae,
+ /* f9 */ 0xe6a2b2, 0xe6a2bb, 0xe6a385, 0xe6a388,
+ /* fd */ 0xe6a38c, 0xe6a38f,
+
+ /*** Three byte table, leaf: 8fc4xx - offset 0x027a1 ***/
+
+ /* a1 */ 0xe6a390, 0xe6a391, 0xe6a393, 0xe6a396,
+ /* a5 */ 0xe6a399, 0xe6a39c, 0xe6a39d, 0xe6a3a5,
+ /* a9 */ 0xe6a3a8, 0xe6a3aa, 0xe6a3ab, 0xe6a3ac,
+ /* ad */ 0xe6a3ad, 0xe6a3b0, 0xe6a3b1, 0xe6a3b5,
+ /* b1 */ 0xe6a3b6, 0xe6a3bb, 0xe6a3bc, 0xe6a3bd,
+ /* b5 */ 0xe6a486, 0xe6a489, 0xe6a48a, 0xe6a490,
+ /* b9 */ 0xe6a491, 0xe6a493, 0xe6a496, 0xe6a497,
+ /* bd */ 0xe6a4b1, 0xe6a4b3, 0xe6a4b5, 0xe6a4b8,
+ /* c1 */ 0xe6a4bb, 0xe6a582, 0xe6a585, 0xe6a589,
+ /* c5 */ 0xe6a58e, 0xe6a597, 0xe6a59b, 0xe6a5a3,
+ /* c9 */ 0xe6a5a4, 0xe6a5a5, 0xe6a5a6, 0xe6a5a8,
+ /* cd */ 0xe6a5a9, 0xe6a5ac, 0xe6a5b0, 0xe6a5b1,
+ /* d1 */ 0xe6a5b2, 0xe6a5ba, 0xe6a5bb, 0xe6a5bf,
+ /* d5 */ 0xe6a680, 0xe6a68d, 0xe6a692, 0xe6a696,
+ /* d9 */ 0xe6a698, 0xe6a6a1, 0xe6a6a5, 0xe6a6a6,
+ /* dd */ 0xe6a6a8, 0xe6a6ab, 0xe6a6ad, 0xe6a6af,
+ /* e1 */ 0xe6a6b7, 0xe6a6b8, 0xe6a6ba, 0xe6a6bc,
+ /* e5 */ 0xe6a785, 0xe6a788, 0xe6a791, 0xe6a796,
+ /* e9 */ 0xe6a797, 0xe6a7a2, 0xe6a7a5, 0xe6a7ae,
+ /* ed */ 0xe6a7af, 0xe6a7b1, 0xe6a7b3, 0xe6a7b5,
+ /* f1 */ 0xe6a7be, 0xe6a880, 0xe6a881, 0xe6a883,
+ /* f5 */ 0xe6a88f, 0xe6a891, 0xe6a895, 0xe6a89a,
+ /* f9 */ 0xe6a89d, 0xe6a8a0, 0xe6a8a4, 0xe6a8a8,
+ /* fd */ 0xe6a8b0, 0xe6a8b2,
+
+ /*** Three byte table, leaf: 8fc5xx - offset 0x027ff ***/
+
+ /* a1 */ 0xe6a8b4, 0xe6a8b7, 0xe6a8bb, 0xe6a8be,
+ /* a5 */ 0xe6a8bf, 0xe6a985, 0xe6a986, 0xe6a989,
+ /* a9 */ 0xe6a98a, 0xe6a98e, 0xe6a990, 0xe6a991,
+ /* ad */ 0xe6a992, 0xe6a995, 0xe6a996, 0xe6a99b,
+ /* b1 */ 0xe6a9a4, 0xe6a9a7, 0xe6a9aa, 0xe6a9b1,
+ /* b5 */ 0xe6a9b3, 0xe6a9be, 0xe6aa81, 0xe6aa83,
+ /* b9 */ 0xe6aa86, 0xe6aa87, 0xe6aa89, 0xe6aa8b,
+ /* bd */ 0xe6aa91, 0xe6aa9b, 0xe6aa9d, 0xe6aa9e,
+ /* c1 */ 0xe6aa9f, 0xe6aaa5, 0xe6aaab, 0xe6aaaf,
+ /* c5 */ 0xe6aab0, 0xe6aab1, 0xe6aab4, 0xe6aabd,
+ /* c9 */ 0xe6aabe, 0xe6aabf, 0xe6ab86, 0xe6ab89,
+ /* cd */ 0xe6ab88, 0xe6ab8c, 0xe6ab90, 0xe6ab94,
+ /* d1 */ 0xe6ab95, 0xe6ab96, 0xe6ab9c, 0xe6ab9d,
+ /* d5 */ 0xe6aba4, 0xe6aba7, 0xe6abac, 0xe6abb0,
+ /* d9 */ 0xe6abb1, 0xe6abb2, 0xe6abbc, 0xe6abbd,
+ /* dd */ 0xe6ac82, 0xe6ac83, 0xe6ac86, 0xe6ac87,
+ /* e1 */ 0xe6ac89, 0xe6ac8f, 0xe6ac90, 0xe6ac91,
+ /* e5 */ 0xe6ac97, 0xe6ac9b, 0xe6ac9e, 0xe6aca4,
+ /* e9 */ 0xe6aca8, 0xe6acab, 0xe6acac, 0xe6acaf,
+ /* ed */ 0xe6acb5, 0xe6acb6, 0xe6acbb, 0xe6acbf,
+ /* f1 */ 0xe6ad86, 0xe6ad8a, 0xe6ad8d, 0xe6ad92,
+ /* f5 */ 0xe6ad96, 0xe6ad98, 0xe6ad9d, 0xe6ada0,
+ /* f9 */ 0xe6ada7, 0xe6adab, 0xe6adae, 0xe6adb0,
+ /* fd */ 0xe6adb5, 0xe6adbd,
+
+ /*** Three byte table, leaf: 8fc6xx - offset 0x0285d ***/
+
+ /* a1 */ 0xe6adbe, 0xe6ae82, 0xe6ae85, 0xe6ae97,
+ /* a5 */ 0xe6ae9b, 0xe6ae9f, 0xe6aea0, 0xe6aea2,
+ /* a9 */ 0xe6aea3, 0xe6aea8, 0xe6aea9, 0xe6aeac,
+ /* ad */ 0xe6aead, 0xe6aeae, 0xe6aeb0, 0xe6aeb8,
+ /* b1 */ 0xe6aeb9, 0xe6aebd, 0xe6aebe, 0xe6af83,
+ /* b5 */ 0xe6af84, 0xe6af89, 0xe6af8c, 0xe6af96,
+ /* b9 */ 0xe6af9a, 0xe6afa1, 0xe6afa3, 0xe6afa6,
+ /* bd */ 0xe6afa7, 0xe6afae, 0xe6afb1, 0xe6afb7,
+ /* c1 */ 0xe6afb9, 0xe6afbf, 0xe6b082, 0xe6b084,
+ /* c5 */ 0xe6b085, 0xe6b089, 0xe6b08d, 0xe6b08e,
+ /* c9 */ 0xe6b090, 0xe6b092, 0xe6b099, 0xe6b09f,
+ /* cd */ 0xe6b0a6, 0xe6b0a7, 0xe6b0a8, 0xe6b0ac,
+ /* d1 */ 0xe6b0ae, 0xe6b0b3, 0xe6b0b5, 0xe6b0b6,
+ /* d5 */ 0xe6b0ba, 0xe6b0bb, 0xe6b0bf, 0xe6b18a,
+ /* d9 */ 0xe6b18b, 0xe6b18d, 0xe6b18f, 0xe6b192,
+ /* dd */ 0xe6b194, 0xe6b199, 0xe6b19b, 0xe6b19c,
+ /* e1 */ 0xe6b1ab, 0xe6b1ad, 0xe6b1af, 0xe6b1b4,
+ /* e5 */ 0xe6b1b6, 0xe6b1b8, 0xe6b1b9, 0xe6b1bb,
+ /* e9 */ 0xe6b285, 0xe6b286, 0xe6b287, 0xe6b289,
+ /* ed */ 0xe6b294, 0xe6b295, 0xe6b297, 0xe6b298,
+ /* f1 */ 0xe6b29c, 0xe6b29f, 0xe6b2b0, 0xe6b2b2,
+ /* f5 */ 0xe6b2b4, 0xe6b382, 0xe6b386, 0xe6b38d,
+ /* f9 */ 0xe6b38f, 0xe6b390, 0xe6b391, 0xe6b392,
+ /* fd */ 0xe6b394, 0xe6b396,
+
+ /*** Three byte table, leaf: 8fc7xx - offset 0x028bb ***/
+
+ /* a1 */ 0xe6b39a, 0xe6b39c, 0xe6b3a0, 0xe6b3a7,
+ /* a5 */ 0xe6b3a9, 0xe6b3ab, 0xe6b3ac, 0xe6b3ae,
+ /* a9 */ 0xe6b3b2, 0xe6b3b4, 0xe6b484, 0xe6b487,
+ /* ad */ 0xe6b48a, 0xe6b48e, 0xe6b48f, 0xe6b491,
+ /* b1 */ 0xe6b493, 0xe6b49a, 0xe6b4a6, 0xe6b4a7,
+ /* b5 */ 0xe6b4a8, 0xe6b1a7, 0xe6b4ae, 0xe6b4af,
+ /* b9 */ 0xe6b4b1, 0xe6b4b9, 0xe6b4bc, 0xe6b4bf,
+ /* bd */ 0xe6b597, 0xe6b59e, 0xe6b59f, 0xe6b5a1,
+ /* c1 */ 0xe6b5a5, 0xe6b5a7, 0xe6b5af, 0xe6b5b0,
+ /* c5 */ 0xe6b5bc, 0xe6b682, 0xe6b687, 0xe6b691,
+ /* c9 */ 0xe6b692, 0xe6b694, 0xe6b696, 0xe6b697,
+ /* cd */ 0xe6b698, 0xe6b6aa, 0xe6b6ac, 0xe6b6b4,
+ /* d1 */ 0xe6b6b7, 0xe6b6b9, 0xe6b6bd, 0xe6b6bf,
+ /* d5 */ 0xe6b784, 0xe6b788, 0xe6b78a, 0xe6b78e,
+ /* d9 */ 0xe6b78f, 0xe6b796, 0xe6b79b, 0xe6b79d,
+ /* dd */ 0xe6b79f, 0xe6b7a0, 0xe6b7a2, 0xe6b7a5,
+ /* e1 */ 0xe6b7a9, 0xe6b7af, 0xe6b7b0, 0xe6b7b4,
+ /* e5 */ 0xe6b7b6, 0xe6b7bc, 0xe6b880, 0xe6b884,
+ /* e9 */ 0xe6b89e, 0xe6b8a2, 0xe6b8a7, 0xe6b8b2,
+ /* ed */ 0xe6b8b6, 0xe6b8b9, 0xe6b8bb, 0xe6b8bc,
+ /* f1 */ 0xe6b984, 0xe6b985, 0xe6b988, 0xe6b989,
+ /* f5 */ 0xe6b98b, 0xe6b98f, 0xe6b991, 0xe6b992,
+ /* f9 */ 0xe6b993, 0xe6b994, 0xe6b997, 0xe6b99c,
+ /* fd */ 0xe6b99d, 0xe6b99e,
+
+ /*** Three byte table, leaf: 8fc8xx - offset 0x02919 ***/
+
+ /* a1 */ 0xe6b9a2, 0xe6b9a3, 0xe6b9a8, 0xe6b9b3,
+ /* a5 */ 0xe6b9bb, 0xe6b9bd, 0xe6ba8d, 0xe6ba93,
+ /* a9 */ 0xe6ba99, 0xe6baa0, 0xe6baa7, 0xe6baad,
+ /* ad */ 0xe6baae, 0xe6bab1, 0xe6bab3, 0xe6babb,
+ /* b1 */ 0xe6babf, 0xe6bb80, 0xe6bb81, 0xe6bb83,
+ /* b5 */ 0xe6bb87, 0xe6bb88, 0xe6bb8a, 0xe6bb8d,
+ /* b9 */ 0xe6bb8e, 0xe6bb8f, 0xe6bbab, 0xe6bbad,
+ /* bd */ 0xe6bbae, 0xe6bbb9, 0xe6bbbb, 0xe6bbbd,
+ /* c1 */ 0xe6bc84, 0xe6bc88, 0xe6bc8a, 0xe6bc8c,
+ /* c5 */ 0xe6bc8d, 0xe6bc96, 0xe6bc98, 0xe6bc9a,
+ /* c9 */ 0xe6bc9b, 0xe6bca6, 0xe6bca9, 0xe6bcaa,
+ /* cd */ 0xe6bcaf, 0xe6bcb0, 0xe6bcb3, 0xe6bcb6,
+ /* d1 */ 0xe6bcbb, 0xe6bcbc, 0xe6bcad, 0xe6bd8f,
+ /* d5 */ 0xe6bd91, 0xe6bd92, 0xe6bd93, 0xe6bd97,
+ /* d9 */ 0xe6bd99, 0xe6bd9a, 0xe6bd9d, 0xe6bd9e,
+ /* dd */ 0xe6bda1, 0xe6bda2, 0xe6bda8, 0xe6bdac,
+ /* e1 */ 0xe6bdbd, 0xe6bdbe, 0xe6be83, 0xe6be87,
+ /* e5 */ 0xe6be88, 0xe6be8b, 0xe6be8c, 0xe6be8d,
+ /* e9 */ 0xe6be90, 0xe6be92, 0xe6be93, 0xe6be94,
+ /* ed */ 0xe6be96, 0xe6be9a, 0xe6be9f, 0xe6bea0,
+ /* f1 */ 0xe6bea5, 0xe6bea6, 0xe6bea7, 0xe6bea8,
+ /* f5 */ 0xe6beae, 0xe6beaf, 0xe6beb0, 0xe6beb5,
+ /* f9 */ 0xe6beb6, 0xe6bebc, 0xe6bf85, 0xe6bf87,
+ /* fd */ 0xe6bf88, 0xe6bf8a,
+
+ /*** Three byte table, leaf: 8fc9xx - offset 0x02977 ***/
+
+ /* a1 */ 0xe6bf9a, 0xe6bf9e, 0xe6bfa8, 0xe6bfa9,
+ /* a5 */ 0xe6bfb0, 0xe6bfb5, 0xe6bfb9, 0xe6bfbc,
+ /* a9 */ 0xe6bfbd, 0xe78080, 0xe78085, 0xe78086,
+ /* ad */ 0xe78087, 0xe7808d, 0xe78097, 0xe780a0,
+ /* b1 */ 0xe780a3, 0xe780af, 0xe780b4, 0xe780b7,
+ /* b5 */ 0xe780b9, 0xe780bc, 0xe78183, 0xe78184,
+ /* b9 */ 0xe78188, 0xe78189, 0xe7818a, 0xe7818b,
+ /* bd */ 0xe78194, 0xe78195, 0xe7819d, 0xe7819e,
+ /* c1 */ 0xe7818e, 0xe781a4, 0xe781a5, 0xe781ac,
+ /* c5 */ 0xe781ae, 0xe781b5, 0xe781b6, 0xe781be,
+ /* c9 */ 0xe78281, 0xe78285, 0xe78286, 0xe78294,
+ /* cd */ 0xe78295, 0xe78296, 0xe78297, 0xe78298,
+ /* d1 */ 0xe7829b, 0xe782a4, 0xe782ab, 0xe782b0,
+ /* d5 */ 0xe782b1, 0xe782b4, 0xe782b7, 0xe7838a,
+ /* d9 */ 0xe78391, 0xe78393, 0xe78394, 0xe78395,
+ /* dd */ 0xe78396, 0xe78398, 0xe7839c, 0xe783a4,
+ /* e1 */ 0xe783ba, 0xe78483, 0xe78484, 0xe78485,
+ /* e5 */ 0xe78486, 0xe78487, 0xe7848b, 0xe7848c,
+ /* e9 */ 0xe7848f, 0xe7849e, 0xe784a0, 0xe784ab,
+ /* ed */ 0xe784ad, 0xe784af, 0xe784b0, 0xe784b1,
+ /* f1 */ 0xe784b8, 0xe78581, 0xe78585, 0xe78586,
+ /* f5 */ 0xe78587, 0xe7858a, 0xe7858b, 0xe78590,
+ /* f9 */ 0xe78592, 0xe78597, 0xe7859a, 0xe7859c,
+ /* fd */ 0xe7859e, 0xe785a0,
+
+ /*** Three byte table, leaf: 8fcaxx - offset 0x029d5 ***/
+
+ /* a1 */ 0xe785a8, 0xe785b9, 0xe78680, 0xe78685,
+ /* a5 */ 0xe78687, 0xe7868c, 0xe78692, 0xe7869a,
+ /* a9 */ 0xe7869b, 0xe786a0, 0xe786a2, 0xe786af,
+ /* ad */ 0xe786b0, 0xe786b2, 0xe786b3, 0xe786ba,
+ /* b1 */ 0xe786bf, 0xe78780, 0xe78781, 0xe78784,
+ /* b5 */ 0xe7878b, 0xe7878c, 0xe78793, 0xe78796,
+ /* b9 */ 0xe78799, 0xe7879a, 0xe7879c, 0xe787b8,
+ /* bd */ 0xe787be, 0xe78880, 0xe78887, 0xe78888,
+ /* c1 */ 0xe78889, 0xe78893, 0xe78897, 0xe7889a,
+ /* c5 */ 0xe7889d, 0xe7889f, 0xe788a4, 0xe788ab,
+ /* c9 */ 0xe788af, 0xe788b4, 0xe788b8, 0xe788b9,
+ /* cd */ 0xe78981, 0xe78982, 0xe78983, 0xe78985,
+ /* d1 */ 0xe7898e, 0xe7898f, 0xe78990, 0xe78993,
+ /* d5 */ 0xe78995, 0xe78996, 0xe7899a, 0xe7899c,
+ /* d9 */ 0xe7899e, 0xe789a0, 0xe789a3, 0xe789a8,
+ /* dd */ 0xe789ab, 0xe789ae, 0xe789af, 0xe789b1,
+ /* e1 */ 0xe789b7, 0xe789b8, 0xe789bb, 0xe789bc,
+ /* e5 */ 0xe789bf, 0xe78a84, 0xe78a89, 0xe78a8d,
+ /* e9 */ 0xe78a8e, 0xe78a93, 0xe78a9b, 0xe78aa8,
+ /* ed */ 0xe78aad, 0xe78aae, 0xe78ab1, 0xe78ab4,
+ /* f1 */ 0xe78abe, 0xe78b81, 0xe78b87, 0xe78b89,
+ /* f5 */ 0xe78b8c, 0xe78b95, 0xe78b96, 0xe78b98,
+ /* f9 */ 0xe78b9f, 0xe78ba5, 0xe78bb3, 0xe78bb4,
+ /* fd */ 0xe78bba, 0xe78bbb,
+
+ /*** Three byte table, leaf: 8fcbxx - offset 0x02a33 ***/
+
+ /* a1 */ 0xe78bbe, 0xe78c82, 0xe78c84, 0xe78c85,
+ /* a5 */ 0xe78c87, 0xe78c8b, 0xe78c8d, 0xe78c92,
+ /* a9 */ 0xe78c93, 0xe78c98, 0xe78c99, 0xe78c9e,
+ /* ad */ 0xe78ca2, 0xe78ca4, 0xe78ca7, 0xe78ca8,
+ /* b1 */ 0xe78cac, 0xe78cb1, 0xe78cb2, 0xe78cb5,
+ /* b5 */ 0xe78cba, 0xe78cbb, 0xe78cbd, 0xe78d83,
+ /* b9 */ 0xe78d8d, 0xe78d90, 0xe78d92, 0xe78d96,
+ /* bd */ 0xe78d98, 0xe78d9d, 0xe78d9e, 0xe78d9f,
+ /* c1 */ 0xe78da0, 0xe78da6, 0xe78da7, 0xe78da9,
+ /* c5 */ 0xe78dab, 0xe78dac, 0xe78dae, 0xe78daf,
+ /* c9 */ 0xe78db1, 0xe78db7, 0xe78db9, 0xe78dbc,
+ /* cd */ 0xe78e80, 0xe78e81, 0xe78e83, 0xe78e85,
+ /* d1 */ 0xe78e86, 0xe78e8e, 0xe78e90, 0xe78e93,
+ /* d5 */ 0xe78e95, 0xe78e97, 0xe78e98, 0xe78e9c,
+ /* d9 */ 0xe78e9e, 0xe78e9f, 0xe78ea0, 0xe78ea2,
+ /* dd */ 0xe78ea5, 0xe78ea6, 0xe78eaa, 0xe78eab,
+ /* e1 */ 0xe78ead, 0xe78eb5, 0xe78eb7, 0xe78eb9,
+ /* e5 */ 0xe78ebc, 0xe78ebd, 0xe78ebf, 0xe78f85,
+ /* e9 */ 0xe78f86, 0xe78f89, 0xe78f8b, 0xe78f8c,
+ /* ed */ 0xe78f8f, 0xe78f92, 0xe78f93, 0xe78f96,
+ /* f1 */ 0xe78f99, 0xe78f9d, 0xe78fa1, 0xe78fa3,
+ /* f5 */ 0xe78fa6, 0xe78fa7, 0xe78fa9, 0xe78fb4,
+ /* f9 */ 0xe78fb5, 0xe78fb7, 0xe78fb9, 0xe78fba,
+ /* fd */ 0xe78fbb, 0xe78fbd,
+
+ /*** Three byte table, leaf: 8fccxx - offset 0x02a91 ***/
+
+ /* a1 */ 0xe78fbf, 0xe79080, 0xe79081, 0xe79084,
+ /* a5 */ 0xe79087, 0xe7908a, 0xe79091, 0xe7909a,
+ /* a9 */ 0xe7909b, 0xe790a4, 0xe790a6, 0xe790a8,
+ /* ad */ 0xe790a9, 0xe790aa, 0xe790ab, 0xe790ac,
+ /* b1 */ 0xe790ad, 0xe790ae, 0xe790af, 0xe790b0,
+ /* b5 */ 0xe790b1, 0xe790b9, 0xe79180, 0xe79183,
+ /* b9 */ 0xe79184, 0xe79186, 0xe79187, 0xe7918b,
+ /* bd */ 0xe7918d, 0xe79191, 0xe79192, 0xe79197,
+ /* c1 */ 0xe7919d, 0xe791a2, 0xe791a6, 0xe791a7,
+ /* c5 */ 0xe791a8, 0xe791ab, 0xe791ad, 0xe791ae,
+ /* c9 */ 0xe791b1, 0xe791b2, 0xe79280, 0xe79281,
+ /* cd */ 0xe79285, 0xe79286, 0xe79287, 0xe79289,
+ /* d1 */ 0xe7928f, 0xe79290, 0xe79291, 0xe79292,
+ /* d5 */ 0xe79298, 0xe79299, 0xe7929a, 0xe7929c,
+ /* d9 */ 0xe7929f, 0xe792a0, 0xe792a1, 0xe792a3,
+ /* dd */ 0xe792a6, 0xe792a8, 0xe792a9, 0xe792aa,
+ /* e1 */ 0xe792ab, 0xe792ae, 0xe792af, 0xe792b1,
+ /* e5 */ 0xe792b2, 0xe792b5, 0xe792b9, 0xe792bb,
+ /* e9 */ 0xe792bf, 0xe79388, 0xe79389, 0xe7938c,
+ /* ed */ 0xe79390, 0xe79393, 0xe79398, 0xe7939a,
+ /* f1 */ 0xe7939b, 0xe7939e, 0xe7939f, 0xe793a4,
+ /* f5 */ 0xe793a8, 0xe793aa, 0xe793ab, 0xe793af,
+ /* f9 */ 0xe793b4, 0xe793ba, 0xe793bb, 0xe793bc,
+ /* fd */ 0xe793bf, 0xe79486,
+
+ /*** Three byte table, leaf: 8fcdxx - offset 0x02aef ***/
+
+ /* a1 */ 0xe79492, 0xe79496, 0xe79497, 0xe794a0,
+ /* a5 */ 0xe794a1, 0xe794a4, 0xe794a7, 0xe794a9,
+ /* a9 */ 0xe794aa, 0xe794af, 0xe794b6, 0xe794b9,
+ /* ad */ 0xe794bd, 0xe794be, 0xe794bf, 0xe79580,
+ /* b1 */ 0xe79583, 0xe79587, 0xe79588, 0xe7958e,
+ /* b5 */ 0xe79590, 0xe79592, 0xe79597, 0xe7959e,
+ /* b9 */ 0xe7959f, 0xe795a1, 0xe795af, 0xe795b1,
+ /* bd */ 0xe795b9, 0xe795ba, 0xe795bb, 0xe795bc,
+ /* c1 */ 0xe795bd, 0xe795be, 0xe79681, 0xe79685,
+ /* c5 */ 0xe79690, 0xe79692, 0xe79693, 0xe79695,
+ /* c9 */ 0xe79699, 0xe7969c, 0xe796a2, 0xe796a4,
+ /* cd */ 0xe796b4, 0xe796ba, 0xe796bf, 0xe79780,
+ /* d1 */ 0xe79781, 0xe79784, 0xe79786, 0xe7978c,
+ /* d5 */ 0xe7978e, 0xe7978f, 0xe79797, 0xe7979c,
+ /* d9 */ 0xe7979f, 0xe797a0, 0xe797a1, 0xe797a4,
+ /* dd */ 0xe797a7, 0xe797ac, 0xe797ae, 0xe797af,
+ /* e1 */ 0xe797b1, 0xe797b9, 0xe79880, 0xe79882,
+ /* e5 */ 0xe79883, 0xe79884, 0xe79887, 0xe79888,
+ /* e9 */ 0xe7988a, 0xe7988c, 0xe7988f, 0xe79892,
+ /* ed */ 0xe79893, 0xe79895, 0xe79896, 0xe79899,
+ /* f1 */ 0xe7989b, 0xe7989c, 0xe7989d, 0xe7989e,
+ /* f5 */ 0xe798a3, 0xe798a5, 0xe798a6, 0xe798a9,
+ /* f9 */ 0xe798ad, 0xe798b2, 0xe798b3, 0xe798b5,
+ /* fd */ 0xe798b8, 0xe798b9,
+
+ /*** Three byte table, leaf: 8fcexx - offset 0x02b4d ***/
+
+ /* a1 */ 0xe798ba, 0xe798bc, 0xe7998a, 0xe79980,
+ /* a5 */ 0xe79981, 0xe79983, 0xe79984, 0xe79985,
+ /* a9 */ 0xe79989, 0xe7998b, 0xe79995, 0xe79999,
+ /* ad */ 0xe7999f, 0xe799a4, 0xe799a5, 0xe799ad,
+ /* b1 */ 0xe799ae, 0xe799af, 0xe799b1, 0xe799b4,
+ /* b5 */ 0xe79a81, 0xe79a85, 0xe79a8c, 0xe79a8d,
+ /* b9 */ 0xe79a95, 0xe79a9b, 0xe79a9c, 0xe79a9d,
+ /* bd */ 0xe79a9f, 0xe79aa0, 0xe79aa2, 0xe79aa3,
+ /* c1 */ 0xe79aa4, 0xe79aa5, 0xe79aa6, 0xe79aa7,
+ /* c5 */ 0xe79aa8, 0xe79aaa, 0xe79aad, 0xe79abd,
+ /* c9 */ 0xe79b81, 0xe79b85, 0xe79b89, 0xe79b8b,
+ /* cd */ 0xe79b8c, 0xe79b8e, 0xe79b94, 0xe79b99,
+ /* d1 */ 0xe79ba0, 0xe79ba6, 0xe79ba8, 0xe79bac,
+ /* d5 */ 0xe79bb0, 0xe79bb1, 0xe79bb6, 0xe79bb9,
+ /* d9 */ 0xe79bbc, 0xe79c80, 0xe79c86, 0xe79c8a,
+ /* dd */ 0xe79c8e, 0xe79c92, 0xe79c94, 0xe79c95,
+ /* e1 */ 0xe79c97, 0xe79c99, 0xe79c9a, 0xe79c9c,
+ /* e5 */ 0xe79ca2, 0xe79ca8, 0xe79cad, 0xe79cae,
+ /* e9 */ 0xe79caf, 0xe79cb4, 0xe79cb5, 0xe79cb6,
+ /* ed */ 0xe79cb9, 0xe79cbd, 0xe79cbe, 0xe79d82,
+ /* f1 */ 0xe79d85, 0xe79d86, 0xe79d8a, 0xe79d8d,
+ /* f5 */ 0xe79d8e, 0xe79d8f, 0xe79d92, 0xe79d96,
+ /* f9 */ 0xe79d97, 0xe79d9c, 0xe79d9e, 0xe79d9f,
+ /* fd */ 0xe79da0, 0xe79da2,
+
+ /*** Three byte table, leaf: 8fcfxx - offset 0x02bab ***/
+
+ /* a1 */ 0xe79da4, 0xe79da7, 0xe79daa, 0xe79dac,
+ /* a5 */ 0xe79db0, 0xe79db2, 0xe79db3, 0xe79db4,
+ /* a9 */ 0xe79dba, 0xe79dbd, 0xe79e80, 0xe79e84,
+ /* ad */ 0xe79e8c, 0xe79e8d, 0xe79e94, 0xe79e95,
+ /* b1 */ 0xe79e96, 0xe79e9a, 0xe79e9f, 0xe79ea2,
+ /* b5 */ 0xe79ea7, 0xe79eaa, 0xe79eae, 0xe79eaf,
+ /* b9 */ 0xe79eb1, 0xe79eb5, 0xe79ebe, 0xe79f83,
+ /* bd */ 0xe79f89, 0xe79f91, 0xe79f92, 0xe79f95,
+ /* c1 */ 0xe79f99, 0xe79f9e, 0xe79f9f, 0xe79fa0,
+ /* c5 */ 0xe79fa4, 0xe79fa6, 0xe79faa, 0xe79fac,
+ /* c9 */ 0xe79fb0, 0xe79fb1, 0xe79fb4, 0xe79fb8,
+ /* cd */ 0xe79fbb, 0xe7a085, 0xe7a086, 0xe7a089,
+ /* d1 */ 0xe7a08d, 0xe7a08e, 0xe7a091, 0xe7a09d,
+ /* d5 */ 0xe7a0a1, 0xe7a0a2, 0xe7a0a3, 0xe7a0ad,
+ /* d9 */ 0xe7a0ae, 0xe7a0b0, 0xe7a0b5, 0xe7a0b7,
+ /* dd */ 0xe7a183, 0xe7a184, 0xe7a187, 0xe7a188,
+ /* e1 */ 0xe7a18c, 0xe7a18e, 0xe7a192, 0xe7a19c,
+ /* e5 */ 0xe7a19e, 0xe7a1a0, 0xe7a1a1, 0xe7a1a3,
+ /* e9 */ 0xe7a1a4, 0xe7a1a8, 0xe7a1aa, 0xe7a1ae,
+ /* ed */ 0xe7a1ba, 0xe7a1be, 0xe7a28a, 0xe7a28f,
+ /* f1 */ 0xe7a294, 0xe7a298, 0xe7a2a1, 0xe7a29d,
+ /* f5 */ 0xe7a29e, 0xe7a29f, 0xe7a2a4, 0xe7a2a8,
+ /* f9 */ 0xe7a2ac, 0xe7a2ad, 0xe7a2b0, 0xe7a2b1,
+ /* fd */ 0xe7a2b2, 0xe7a2b3,
+
+ /*** Three byte table, leaf: 8fd0xx - offset 0x02c09 ***/
+
+ /* a1 */ 0xe7a2bb, 0xe7a2bd, 0xe7a2bf, 0xe7a387,
+ /* a5 */ 0xe7a388, 0xe7a389, 0xe7a38c, 0xe7a38e,
+ /* a9 */ 0xe7a392, 0xe7a393, 0xe7a395, 0xe7a396,
+ /* ad */ 0xe7a3a4, 0xe7a39b, 0xe7a39f, 0xe7a3a0,
+ /* b1 */ 0xe7a3a1, 0xe7a3a6, 0xe7a3aa, 0xe7a3b2,
+ /* b5 */ 0xe7a3b3, 0xe7a480, 0xe7a3b6, 0xe7a3b7,
+ /* b9 */ 0xe7a3ba, 0xe7a3bb, 0xe7a3bf, 0xe7a486,
+ /* bd */ 0xe7a48c, 0xe7a490, 0xe7a49a, 0xe7a49c,
+ /* c1 */ 0xe7a49e, 0xe7a49f, 0xe7a4a0, 0xe7a4a5,
+ /* c5 */ 0xe7a4a7, 0xe7a4a9, 0xe7a4ad, 0xe7a4b1,
+ /* c9 */ 0xe7a4b4, 0xe7a4b5, 0xe7a4bb, 0xe7a4bd,
+ /* cd */ 0xe7a4bf, 0xe7a584, 0xe7a585, 0xe7a586,
+ /* d1 */ 0xe7a58a, 0xe7a58b, 0xe7a58f, 0xe7a591,
+ /* d5 */ 0xe7a594, 0xe7a598, 0xe7a59b, 0xe7a59c,
+ /* d9 */ 0xe7a5a7, 0xe7a5a9, 0xe7a5ab, 0xe7a5b2,
+ /* dd */ 0xe7a5b9, 0xe7a5bb, 0xe7a5bc, 0xe7a5be,
+ /* e1 */ 0xe7a68b, 0xe7a68c, 0xe7a691, 0xe7a693,
+ /* e5 */ 0xe7a694, 0xe7a695, 0xe7a696, 0xe7a698,
+ /* e9 */ 0xe7a69b, 0xe7a69c, 0xe7a6a1, 0xe7a6a8,
+ /* ed */ 0xe7a6a9, 0xe7a6ab, 0xe7a6af, 0xe7a6b1,
+ /* f1 */ 0xe7a6b4, 0xe7a6b8, 0xe7a6bb, 0xe7a782,
+ /* f5 */ 0xe7a784, 0xe7a787, 0xe7a788, 0xe7a78a,
+ /* f9 */ 0xe7a78f, 0xe7a794, 0xe7a796, 0xe7a79a,
+ /* fd */ 0xe7a79d, 0xe7a79e,
+
+ /*** Three byte table, leaf: 8fd1xx - offset 0x02c67 ***/
+
+ /* a1 */ 0xe7a7a0, 0xe7a7a2, 0xe7a7a5, 0xe7a7aa,
+ /* a5 */ 0xe7a7ab, 0xe7a7ad, 0xe7a7b1, 0xe7a7b8,
+ /* a9 */ 0xe7a7bc, 0xe7a882, 0xe7a883, 0xe7a887,
+ /* ad */ 0xe7a889, 0xe7a88a, 0xe7a88c, 0xe7a891,
+ /* b1 */ 0xe7a895, 0xe7a89b, 0xe7a89e, 0xe7a8a1,
+ /* b5 */ 0xe7a8a7, 0xe7a8ab, 0xe7a8ad, 0xe7a8af,
+ /* b9 */ 0xe7a8b0, 0xe7a8b4, 0xe7a8b5, 0xe7a8b8,
+ /* bd */ 0xe7a8b9, 0xe7a8ba, 0xe7a984, 0xe7a985,
+ /* c1 */ 0xe7a987, 0xe7a988, 0xe7a98c, 0xe7a995,
+ /* c5 */ 0xe7a996, 0xe7a999, 0xe7a99c, 0xe7a99d,
+ /* c9 */ 0xe7a99f, 0xe7a9a0, 0xe7a9a5, 0xe7a9a7,
+ /* cd */ 0xe7a9aa, 0xe7a9ad, 0xe7a9b5, 0xe7a9b8,
+ /* d1 */ 0xe7a9be, 0xe7aa80, 0xe7aa82, 0xe7aa85,
+ /* d5 */ 0xe7aa86, 0xe7aa8a, 0xe7aa8b, 0xe7aa90,
+ /* d9 */ 0xe7aa91, 0xe7aa94, 0xe7aa9e, 0xe7aaa0,
+ /* dd */ 0xe7aaa3, 0xe7aaac, 0xe7aab3, 0xe7aab5,
+ /* e1 */ 0xe7aab9, 0xe7aabb, 0xe7aabc, 0xe7ab86,
+ /* e5 */ 0xe7ab89, 0xe7ab8c, 0xe7ab8e, 0xe7ab91,
+ /* e9 */ 0xe7ab9b, 0xe7aba8, 0xe7aba9, 0xe7abab,
+ /* ed */ 0xe7abac, 0xe7abb1, 0xe7abb4, 0xe7abbb,
+ /* f1 */ 0xe7abbd, 0xe7abbe, 0xe7ac87, 0xe7ac94,
+ /* f5 */ 0xe7ac9f, 0xe7aca3, 0xe7aca7, 0xe7aca9,
+ /* f9 */ 0xe7acaa, 0xe7acab, 0xe7acad, 0xe7acae,
+ /* fd */ 0xe7acaf, 0xe7acb0,
+
+ /*** Three byte table, leaf: 8fd2xx - offset 0x02cc5 ***/
+
+ /* a1 */ 0xe7acb1, 0xe7acb4, 0xe7acbd, 0xe7acbf,
+ /* a5 */ 0xe7ad80, 0xe7ad81, 0xe7ad87, 0xe7ad8e,
+ /* a9 */ 0xe7ad95, 0xe7ada0, 0xe7ada4, 0xe7ada6,
+ /* ad */ 0xe7ada9, 0xe7adaa, 0xe7adad, 0xe7adaf,
+ /* b1 */ 0xe7adb2, 0xe7adb3, 0xe7adb7, 0xe7ae84,
+ /* b5 */ 0xe7ae89, 0xe7ae8e, 0xe7ae90, 0xe7ae91,
+ /* b9 */ 0xe7ae96, 0xe7ae9b, 0xe7ae9e, 0xe7aea0,
+ /* bd */ 0xe7aea5, 0xe7aeac, 0xe7aeaf, 0xe7aeb0,
+ /* c1 */ 0xe7aeb2, 0xe7aeb5, 0xe7aeb6, 0xe7aeba,
+ /* c5 */ 0xe7aebb, 0xe7aebc, 0xe7aebd, 0xe7af82,
+ /* c9 */ 0xe7af85, 0xe7af88, 0xe7af8a, 0xe7af94,
+ /* cd */ 0xe7af96, 0xe7af97, 0xe7af99, 0xe7af9a,
+ /* d1 */ 0xe7af9b, 0xe7afa8, 0xe7afaa, 0xe7afb2,
+ /* d5 */ 0xe7afb4, 0xe7afb5, 0xe7afb8, 0xe7afb9,
+ /* d9 */ 0xe7afba, 0xe7afbc, 0xe7afbe, 0xe7b081,
+ /* dd */ 0xe7b082, 0xe7b083, 0xe7b084, 0xe7b086,
+ /* e1 */ 0xe7b089, 0xe7b08b, 0xe7b08c, 0xe7b08e,
+ /* e5 */ 0xe7b08f, 0xe7b099, 0xe7b09b, 0xe7b0a0,
+ /* e9 */ 0xe7b0a5, 0xe7b0a6, 0xe7b0a8, 0xe7b0ac,
+ /* ed */ 0xe7b0b1, 0xe7b0b3, 0xe7b0b4, 0xe7b0b6,
+ /* f1 */ 0xe7b0b9, 0xe7b0ba, 0xe7b186, 0xe7b18a,
+ /* f5 */ 0xe7b195, 0xe7b191, 0xe7b192, 0xe7b193,
+ /* f9 */ 0xe7b199, 0xe7b19a, 0xe7b19b, 0xe7b19c,
+ /* fd */ 0xe7b19d, 0xe7b19e,
+
+ /*** Three byte table, leaf: 8fd3xx - offset 0x02d23 ***/
+
+ /* a1 */ 0xe7b1a1, 0xe7b1a3, 0xe7b1a7, 0xe7b1a9,
+ /* a5 */ 0xe7b1ad, 0xe7b1ae, 0xe7b1b0, 0xe7b1b2,
+ /* a9 */ 0xe7b1b9, 0xe7b1bc, 0xe7b1bd, 0xe7b286,
+ /* ad */ 0xe7b287, 0xe7b28f, 0xe7b294, 0xe7b29e,
+ /* b1 */ 0xe7b2a0, 0xe7b2a6, 0xe7b2b0, 0xe7b2b6,
+ /* b5 */ 0xe7b2b7, 0xe7b2ba, 0xe7b2bb, 0xe7b2bc,
+ /* b9 */ 0xe7b2bf, 0xe7b384, 0xe7b387, 0xe7b388,
+ /* bd */ 0xe7b389, 0xe7b38d, 0xe7b38f, 0xe7b393,
+ /* c1 */ 0xe7b394, 0xe7b395, 0xe7b397, 0xe7b399,
+ /* c5 */ 0xe7b39a, 0xe7b39d, 0xe7b3a6, 0xe7b3a9,
+ /* c9 */ 0xe7b3ab, 0xe7b3b5, 0xe7b483, 0xe7b487,
+ /* cd */ 0xe7b488, 0xe7b489, 0xe7b48f, 0xe7b491,
+ /* d1 */ 0xe7b492, 0xe7b493, 0xe7b496, 0xe7b49d,
+ /* d5 */ 0xe7b49e, 0xe7b4a3, 0xe7b4a6, 0xe7b4aa,
+ /* d9 */ 0xe7b4ad, 0xe7b4b1, 0xe7b4bc, 0xe7b4bd,
+ /* dd */ 0xe7b4be, 0xe7b580, 0xe7b581, 0xe7b587,
+ /* e1 */ 0xe7b588, 0xe7b58d, 0xe7b591, 0xe7b593,
+ /* e5 */ 0xe7b597, 0xe7b599, 0xe7b59a, 0xe7b59c,
+ /* e9 */ 0xe7b59d, 0xe7b5a5, 0xe7b5a7, 0xe7b5aa,
+ /* ed */ 0xe7b5b0, 0xe7b5b8, 0xe7b5ba, 0xe7b5bb,
+ /* f1 */ 0xe7b5bf, 0xe7b681, 0xe7b682, 0xe7b683,
+ /* f5 */ 0xe7b685, 0xe7b686, 0xe7b688, 0xe7b68b,
+ /* f9 */ 0xe7b68c, 0xe7b68d, 0xe7b691, 0xe7b696,
+ /* fd */ 0xe7b697, 0xe7b69d,
+
+ /*** Three byte table, leaf: 8fd4xx - offset 0x02d81 ***/
+
+ /* a1 */ 0xe7b69e, 0xe7b6a6, 0xe7b6a7, 0xe7b6aa,
+ /* a5 */ 0xe7b6b3, 0xe7b6b6, 0xe7b6b7, 0xe7b6b9,
+ /* a9 */ 0xe7b782, 0xe7b783, 0xe7b784, 0xe7b785,
+ /* ad */ 0xe7b786, 0xe7b78c, 0xe7b78d, 0xe7b78e,
+ /* b1 */ 0xe7b797, 0xe7b799, 0xe7b880, 0xe7b7a2,
+ /* b5 */ 0xe7b7a5, 0xe7b7a6, 0xe7b7aa, 0xe7b7ab,
+ /* b9 */ 0xe7b7ad, 0xe7b7b1, 0xe7b7b5, 0xe7b7b6,
+ /* bd */ 0xe7b7b9, 0xe7b7ba, 0xe7b888, 0xe7b890,
+ /* c1 */ 0xe7b891, 0xe7b895, 0xe7b897, 0xe7b89c,
+ /* c5 */ 0xe7b89d, 0xe7b8a0, 0xe7b8a7, 0xe7b8a8,
+ /* c9 */ 0xe7b8ac, 0xe7b8ad, 0xe7b8af, 0xe7b8b3,
+ /* cd */ 0xe7b8b6, 0xe7b8bf, 0xe7b984, 0xe7b985,
+ /* d1 */ 0xe7b987, 0xe7b98e, 0xe7b990, 0xe7b992,
+ /* d5 */ 0xe7b998, 0xe7b99f, 0xe7b9a1, 0xe7b9a2,
+ /* d9 */ 0xe7b9a5, 0xe7b9ab, 0xe7b9ae, 0xe7b9af,
+ /* dd */ 0xe7b9b3, 0xe7b9b8, 0xe7b9be, 0xe7ba81,
+ /* e1 */ 0xe7ba86, 0xe7ba87, 0xe7ba8a, 0xe7ba8d,
+ /* e5 */ 0xe7ba91, 0xe7ba95, 0xe7ba98, 0xe7ba9a,
+ /* e9 */ 0xe7ba9d, 0xe7ba9e, 0xe7bcbc, 0xe7bcbb,
+ /* ed */ 0xe7bcbd, 0xe7bcbe, 0xe7bcbf, 0xe7bd83,
+ /* f1 */ 0xe7bd84, 0xe7bd87, 0xe7bd8f, 0xe7bd92,
+ /* f5 */ 0xe7bd93, 0xe7bd9b, 0xe7bd9c, 0xe7bd9d,
+ /* f9 */ 0xe7bda1, 0xe7bda3, 0xe7bda4, 0xe7bda5,
+ /* fd */ 0xe7bda6, 0xe7bdad,
+
+ /*** Three byte table, leaf: 8fd5xx - offset 0x02ddf ***/
+
+ /* a1 */ 0xe7bdb1, 0xe7bdbd, 0xe7bdbe, 0xe7bdbf,
+ /* a5 */ 0xe7be80, 0xe7be8b, 0xe7be8d, 0xe7be8f,
+ /* a9 */ 0xe7be90, 0xe7be91, 0xe7be96, 0xe7be97,
+ /* ad */ 0xe7be9c, 0xe7bea1, 0xe7bea2, 0xe7bea6,
+ /* b1 */ 0xe7beaa, 0xe7bead, 0xe7beb4, 0xe7bebc,
+ /* b5 */ 0xe7bebf, 0xe7bf80, 0xe7bf83, 0xe7bf88,
+ /* b9 */ 0xe7bf8e, 0xe7bf8f, 0xe7bf9b, 0xe7bf9f,
+ /* bd */ 0xe7bfa3, 0xe7bfa5, 0xe7bfa8, 0xe7bfac,
+ /* c1 */ 0xe7bfae, 0xe7bfaf, 0xe7bfb2, 0xe7bfba,
+ /* c5 */ 0xe7bfbd, 0xe7bfbe, 0xe7bfbf, 0xe88087,
+ /* c9 */ 0xe88088, 0xe8808a, 0xe8808d, 0xe8808e,
+ /* cd */ 0xe8808f, 0xe88091, 0xe88093, 0xe88094,
+ /* d1 */ 0xe88096, 0xe8809d, 0xe8809e, 0xe8809f,
+ /* d5 */ 0xe880a0, 0xe880a4, 0xe880a6, 0xe880ac,
+ /* d9 */ 0xe880ae, 0xe880b0, 0xe880b4, 0xe880b5,
+ /* dd */ 0xe880b7, 0xe880b9, 0xe880ba, 0xe880bc,
+ /* e1 */ 0xe880be, 0xe88180, 0xe88184, 0xe881a0,
+ /* e5 */ 0xe881a4, 0xe881a6, 0xe881ad, 0xe881b1,
+ /* e9 */ 0xe881b5, 0xe88281, 0xe88288, 0xe8828e,
+ /* ed */ 0xe8829c, 0xe8829e, 0xe882a6, 0xe882a7,
+ /* f1 */ 0xe882ab, 0xe882b8, 0xe882b9, 0xe88388,
+ /* f5 */ 0xe8838d, 0xe8838f, 0xe88392, 0xe88394,
+ /* f9 */ 0xe88395, 0xe88397, 0xe88398, 0xe883a0,
+ /* fd */ 0xe883ad, 0xe883ae,
+
+ /*** Three byte table, leaf: 8fd6xx - offset 0x02e3d ***/
+
+ /* a1 */ 0xe883b0, 0xe883b2, 0xe883b3, 0xe883b6,
+ /* a5 */ 0xe883b9, 0xe883ba, 0xe883be, 0xe88483,
+ /* a9 */ 0xe8848b, 0xe88496, 0xe88497, 0xe88498,
+ /* ad */ 0xe8849c, 0xe8849e, 0xe884a0, 0xe884a4,
+ /* b1 */ 0xe884a7, 0xe884ac, 0xe884b0, 0xe884b5,
+ /* b5 */ 0xe884ba, 0xe884bc, 0xe88585, 0xe88587,
+ /* b9 */ 0xe8858a, 0xe8858c, 0xe88592, 0xe88597,
+ /* bd */ 0xe885a0, 0xe885a1, 0xe885a7, 0xe885a8,
+ /* c1 */ 0xe885a9, 0xe885ad, 0xe885af, 0xe885b7,
+ /* c5 */ 0xe88681, 0xe88690, 0xe88684, 0xe88685,
+ /* c9 */ 0xe88686, 0xe8868b, 0xe8868e, 0xe88696,
+ /* cd */ 0xe88698, 0xe8869b, 0xe8869e, 0xe886a2,
+ /* d1 */ 0xe886ae, 0xe886b2, 0xe886b4, 0xe886bb,
+ /* d5 */ 0xe8878b, 0xe88783, 0xe88785, 0xe8878a,
+ /* d9 */ 0xe8878e, 0xe8878f, 0xe88795, 0xe88797,
+ /* dd */ 0xe8879b, 0xe8879d, 0xe8879e, 0xe887a1,
+ /* e1 */ 0xe887a4, 0xe887ab, 0xe887ac, 0xe887b0,
+ /* e5 */ 0xe887b1, 0xe887b2, 0xe887b5, 0xe887b6,
+ /* e9 */ 0xe887b8, 0xe887b9, 0xe887bd, 0xe887bf,
+ /* ed */ 0xe88880, 0xe88883, 0xe8888f, 0xe88893,
+ /* f1 */ 0xe88894, 0xe88899, 0xe8889a, 0xe8889d,
+ /* f5 */ 0xe888a1, 0xe888a2, 0xe888a8, 0xe888b2,
+ /* f9 */ 0xe888b4, 0xe888ba, 0xe88983, 0xe88984,
+ /* fd */ 0xe88985, 0xe88986,
+
+ /*** Three byte table, leaf: 8fd7xx - offset 0x02e9b ***/
+
+ /* a1 */ 0xe8898b, 0xe8898e, 0xe8898f, 0xe88991,
+ /* a5 */ 0xe88996, 0xe8899c, 0xe889a0, 0xe889a3,
+ /* a9 */ 0xe889a7, 0xe889ad, 0xe889b4, 0xe889bb,
+ /* ad */ 0xe889bd, 0xe889bf, 0xe88a80, 0xe88a81,
+ /* b1 */ 0xe88a83, 0xe88a84, 0xe88a87, 0xe88a89,
+ /* b5 */ 0xe88a8a, 0xe88a8e, 0xe88a91, 0xe88a94,
+ /* b9 */ 0xe88a96, 0xe88a98, 0xe88a9a, 0xe88a9b,
+ /* bd */ 0xe88aa0, 0xe88aa1, 0xe88aa3, 0xe88aa4,
+ /* c1 */ 0xe88aa7, 0xe88aa8, 0xe88aa9, 0xe88aaa,
+ /* c5 */ 0xe88aae, 0xe88ab0, 0xe88ab2, 0xe88ab4,
+ /* c9 */ 0xe88ab7, 0xe88aba, 0xe88abc, 0xe88abe,
+ /* cd */ 0xe88abf, 0xe88b86, 0xe88b90, 0xe88b95,
+ /* d1 */ 0xe88b9a, 0xe88ba0, 0xe88ba2, 0xe88ba4,
+ /* d5 */ 0xe88ba8, 0xe88baa, 0xe88bad, 0xe88baf,
+ /* d9 */ 0xe88bb6, 0xe88bb7, 0xe88bbd, 0xe88bbe,
+ /* dd */ 0xe88c80, 0xe88c81, 0xe88c87, 0xe88c88,
+ /* e1 */ 0xe88c8a, 0xe88c8b, 0xe88d94, 0xe88c9b,
+ /* e5 */ 0xe88c9d, 0xe88c9e, 0xe88c9f, 0xe88ca1,
+ /* e9 */ 0xe88ca2, 0xe88cac, 0xe88cad, 0xe88cae,
+ /* ed */ 0xe88cb0, 0xe88cb3, 0xe88cb7, 0xe88cba,
+ /* f1 */ 0xe88cbc, 0xe88cbd, 0xe88d82, 0xe88d83,
+ /* f5 */ 0xe88d84, 0xe88d87, 0xe88d8d, 0xe88d8e,
+ /* f9 */ 0xe88d91, 0xe88d95, 0xe88d96, 0xe88d97,
+ /* fd */ 0xe88db0, 0xe88db8,
+
+ /*** Three byte table, leaf: 8fd8xx - offset 0x02ef9 ***/
+
+ /* a1 */ 0xe88dbd, 0xe88dbf, 0xe88e80, 0xe88e82,
+ /* a5 */ 0xe88e84, 0xe88e86, 0xe88e8d, 0xe88e92,
+ /* a9 */ 0xe88e94, 0xe88e95, 0xe88e98, 0xe88e99,
+ /* ad */ 0xe88e9b, 0xe88e9c, 0xe88e9d, 0xe88ea6,
+ /* b1 */ 0xe88ea7, 0xe88ea9, 0xe88eac, 0xe88ebe,
+ /* b5 */ 0xe88ebf, 0xe88f80, 0xe88f87, 0xe88f89,
+ /* b9 */ 0xe88f8f, 0xe88f90, 0xe88f91, 0xe88f94,
+ /* bd */ 0xe88f9d, 0xe88d93, 0xe88fa8, 0xe88faa,
+ /* c1 */ 0xe88fb6, 0xe88fb8, 0xe88fb9, 0xe88fbc,
+ /* c5 */ 0xe89081, 0xe89086, 0xe8908a, 0xe8908f,
+ /* c9 */ 0xe89091, 0xe89095, 0xe89099, 0xe88ead,
+ /* cd */ 0xe890af, 0xe890b9, 0xe89185, 0xe89187,
+ /* d1 */ 0xe89188, 0xe8918a, 0xe8918d, 0xe8918f,
+ /* d5 */ 0xe89191, 0xe89192, 0xe89196, 0xe89198,
+ /* d9 */ 0xe89199, 0xe8919a, 0xe8919c, 0xe891a0,
+ /* dd */ 0xe891a4, 0xe891a5, 0xe891a7, 0xe891aa,
+ /* e1 */ 0xe891b0, 0xe891b3, 0xe891b4, 0xe891b6,
+ /* e5 */ 0xe891b8, 0xe891bc, 0xe891bd, 0xe89281,
+ /* e9 */ 0xe89285, 0xe89292, 0xe89293, 0xe89295,
+ /* ed */ 0xe8929e, 0xe892a6, 0xe892a8, 0xe892a9,
+ /* f1 */ 0xe892aa, 0xe892af, 0xe892b1, 0xe892b4,
+ /* f5 */ 0xe892ba, 0xe892bd, 0xe892be, 0xe89380,
+ /* f9 */ 0xe89382, 0xe89387, 0xe89388, 0xe8938c,
+ /* fd */ 0xe8938f, 0xe89393,
+
+ /*** Three byte table, leaf: 8fd9xx - offset 0x02f57 ***/
+
+ /* a1 */ 0xe8939c, 0xe893a7, 0xe893aa, 0xe893af,
+ /* a5 */ 0xe893b0, 0xe893b1, 0xe893b2, 0xe893b7,
+ /* a9 */ 0xe894b2, 0xe893ba, 0xe893bb, 0xe893bd,
+ /* ad */ 0xe89482, 0xe89483, 0xe89487, 0xe8948c,
+ /* b1 */ 0xe8948e, 0xe89490, 0xe8949c, 0xe8949e,
+ /* b5 */ 0xe894a2, 0xe894a3, 0xe894a4, 0xe894a5,
+ /* b9 */ 0xe894a7, 0xe894aa, 0xe894ab, 0xe894af,
+ /* bd */ 0xe894b3, 0xe894b4, 0xe894b6, 0xe894bf,
+ /* c1 */ 0xe89586, 0xe8958f, 0xe89590, 0xe89591,
+ /* c5 */ 0xe89592, 0xe89593, 0xe89596, 0xe89599,
+ /* c9 */ 0xe8959c, 0xe8959d, 0xe8959e, 0xe8959f,
+ /* cd */ 0xe895a0, 0xe895a1, 0xe895a2, 0xe895a4,
+ /* d1 */ 0xe895ab, 0xe895af, 0xe895b9, 0xe895ba,
+ /* d5 */ 0xe895bb, 0xe895bd, 0xe895bf, 0xe89681,
+ /* d9 */ 0xe89685, 0xe89686, 0xe89689, 0xe8968b,
+ /* dd */ 0xe8968c, 0xe8968f, 0xe89693, 0xe89698,
+ /* e1 */ 0xe8969d, 0xe8969f, 0xe896a0, 0xe896a2,
+ /* e5 */ 0xe896a5, 0xe896a7, 0xe896b4, 0xe896b6,
+ /* e9 */ 0xe896b7, 0xe896b8, 0xe896bc, 0xe896bd,
+ /* ed */ 0xe896be, 0xe896bf, 0xe89782, 0xe89787,
+ /* f1 */ 0xe8978a, 0xe8978b, 0xe8978e, 0xe896ad,
+ /* f5 */ 0xe89798, 0xe8979a, 0xe8979f, 0xe897a0,
+ /* f9 */ 0xe897a6, 0xe897a8, 0xe897ad, 0xe897b3,
+ /* fd */ 0xe897b6, 0xe897bc,
+
+ /*** Three byte table, leaf: 8fdaxx - offset 0x02fb5 ***/
+
+ /* a1 */ 0xe897bf, 0xe89880, 0xe89884, 0xe89885,
+ /* a5 */ 0xe8988d, 0xe8988e, 0xe89890, 0xe89891,
+ /* a9 */ 0xe89892, 0xe89898, 0xe89899, 0xe8989b,
+ /* ad */ 0xe8989e, 0xe898a1, 0xe898a7, 0xe898a9,
+ /* b1 */ 0xe898b6, 0xe898b8, 0xe898ba, 0xe898bc,
+ /* b5 */ 0xe898bd, 0xe89980, 0xe89982, 0xe89986,
+ /* b9 */ 0xe89992, 0xe89993, 0xe89996, 0xe89997,
+ /* bd */ 0xe89998, 0xe89999, 0xe8999d, 0xe899a0,
+ /* c1 */ 0xe899a1, 0xe899a2, 0xe899a3, 0xe899a4,
+ /* c5 */ 0xe899a9, 0xe899ac, 0xe899af, 0xe899b5,
+ /* c9 */ 0xe899b6, 0xe899b7, 0xe899ba, 0xe89a8d,
+ /* cd */ 0xe89a91, 0xe89a96, 0xe89a98, 0xe89a9a,
+ /* d1 */ 0xe89a9c, 0xe89aa1, 0xe89aa6, 0xe89aa7,
+ /* d5 */ 0xe89aa8, 0xe89aad, 0xe89ab1, 0xe89ab3,
+ /* d9 */ 0xe89ab4, 0xe89ab5, 0xe89ab7, 0xe89ab8,
+ /* dd */ 0xe89ab9, 0xe89abf, 0xe89b80, 0xe89b81,
+ /* e1 */ 0xe89b83, 0xe89b85, 0xe89b91, 0xe89b92,
+ /* e5 */ 0xe89b95, 0xe89b97, 0xe89b9a, 0xe89b9c,
+ /* e9 */ 0xe89ba0, 0xe89ba3, 0xe89ba5, 0xe89ba7,
+ /* ed */ 0xe89a88, 0xe89bba, 0xe89bbc, 0xe89bbd,
+ /* f1 */ 0xe89c84, 0xe89c85, 0xe89c87, 0xe89c8b,
+ /* f5 */ 0xe89c8e, 0xe89c8f, 0xe89c90, 0xe89c93,
+ /* f9 */ 0xe89c94, 0xe89c99, 0xe89c9e, 0xe89c9f,
+ /* fd */ 0xe89ca1, 0xe89ca3,
+
+ /*** Three byte table, leaf: 8fdbxx - offset 0x03013 ***/
+
+ /* a1 */ 0xe89ca8, 0xe89cae, 0xe89caf, 0xe89cb1,
+ /* a5 */ 0xe89cb2, 0xe89cb9, 0xe89cba, 0xe89cbc,
+ /* a9 */ 0xe89cbd, 0xe89cbe, 0xe89d80, 0xe89d83,
+ /* ad */ 0xe89d85, 0xe89d8d, 0xe89d98, 0xe89d9d,
+ /* b1 */ 0xe89da1, 0xe89da4, 0xe89da5, 0xe89daf,
+ /* b5 */ 0xe89db1, 0xe89db2, 0xe89dbb, 0xe89e83,
+ /* b9 */ 0xe89e84, 0xe89e85, 0xe89e86, 0xe89e87,
+ /* bd */ 0xe89e88, 0xe89e89, 0xe89e8b, 0xe89e8c,
+ /* c1 */ 0xe89e90, 0xe89e93, 0xe89e95, 0xe89e97,
+ /* c5 */ 0xe89e98, 0xe89e99, 0xe89e9e, 0xe89ea0,
+ /* c9 */ 0xe89ea3, 0xe89ea7, 0xe89eac, 0xe89ead,
+ /* cd */ 0xe89eae, 0xe89eb1, 0xe89eb5, 0xe89ebe,
+ /* d1 */ 0xe89ebf, 0xe89f81, 0xe89f88, 0xe89f89,
+ /* d5 */ 0xe89f8a, 0xe89f8e, 0xe89f95, 0xe89f96,
+ /* d9 */ 0xe89f99, 0xe89f9a, 0xe89f9c, 0xe89f9f,
+ /* dd */ 0xe89fa2, 0xe89fa3, 0xe89fa4, 0xe89faa,
+ /* e1 */ 0xe89fab, 0xe89fad, 0xe89fb1, 0xe89fb3,
+ /* e5 */ 0xe89fb8, 0xe89fba, 0xe89fbf, 0xe8a081,
+ /* e9 */ 0xe8a083, 0xe8a086, 0xe8a089, 0xe8a08a,
+ /* ed */ 0xe8a08b, 0xe8a090, 0xe8a099, 0xe8a092,
+ /* f1 */ 0xe8a093, 0xe8a094, 0xe8a098, 0xe8a09a,
+ /* f5 */ 0xe8a09b, 0xe8a09c, 0xe8a09e, 0xe8a09f,
+ /* f9 */ 0xe8a0a8, 0xe8a0ad, 0xe8a0ae, 0xe8a0b0,
+ /* fd */ 0xe8a0b2, 0xe8a0b5,
+
+ /*** Three byte table, leaf: 8fdcxx - offset 0x03071 ***/
+
+ /* a1 */ 0xe8a0ba, 0xe8a0bc, 0xe8a181, 0xe8a183,
+ /* a5 */ 0xe8a185, 0xe8a188, 0xe8a189, 0xe8a18a,
+ /* a9 */ 0xe8a18b, 0xe8a18e, 0xe8a191, 0xe8a195,
+ /* ad */ 0xe8a196, 0xe8a198, 0xe8a19a, 0xe8a19c,
+ /* b1 */ 0xe8a19f, 0xe8a1a0, 0xe8a1a4, 0xe8a1a9,
+ /* b5 */ 0xe8a1b1, 0xe8a1b9, 0xe8a1bb, 0xe8a280,
+ /* b9 */ 0xe8a298, 0xe8a29a, 0xe8a29b, 0xe8a29c,
+ /* bd */ 0xe8a29f, 0xe8a2a0, 0xe8a2a8, 0xe8a2aa,
+ /* c1 */ 0xe8a2ba, 0xe8a2bd, 0xe8a2be, 0xe8a380,
+ /* c5 */ 0xe8a38a, 0xe8a38b, 0xe8a38c, 0xe8a38d,
+ /* c9 */ 0xe8a38e, 0xe8a391, 0xe8a392, 0xe8a393,
+ /* cd */ 0xe8a39b, 0xe8a39e, 0xe8a3a7, 0xe8a3af,
+ /* d1 */ 0xe8a3b0, 0xe8a3b1, 0xe8a3b5, 0xe8a3b7,
+ /* d5 */ 0xe8a481, 0xe8a486, 0xe8a48d, 0xe8a48e,
+ /* d9 */ 0xe8a48f, 0xe8a495, 0xe8a496, 0xe8a498,
+ /* dd */ 0xe8a499, 0xe8a49a, 0xe8a49c, 0xe8a4a0,
+ /* e1 */ 0xe8a4a6, 0xe8a4a7, 0xe8a4a8, 0xe8a4b0,
+ /* e5 */ 0xe8a4b1, 0xe8a4b2, 0xe8a4b5, 0xe8a4b9,
+ /* e9 */ 0xe8a4ba, 0xe8a4be, 0xe8a580, 0xe8a582,
+ /* ed */ 0xe8a585, 0xe8a586, 0xe8a589, 0xe8a58f,
+ /* f1 */ 0xe8a592, 0xe8a597, 0xe8a59a, 0xe8a59b,
+ /* f5 */ 0xe8a59c, 0xe8a5a1, 0xe8a5a2, 0xe8a5a3,
+ /* f9 */ 0xe8a5ab, 0xe8a5ae, 0xe8a5b0, 0xe8a5b3,
+ /* fd */ 0xe8a5b5, 0xe8a5ba,
+
+ /*** Three byte table, leaf: 8fddxx - offset 0x030cf ***/
+
+ /* a1 */ 0xe8a5bb, 0xe8a5bc, 0xe8a5bd, 0xe8a689,
+ /* a5 */ 0xe8a68d, 0xe8a690, 0xe8a694, 0xe8a695,
+ /* a9 */ 0xe8a69b, 0xe8a69c, 0xe8a69f, 0xe8a6a0,
+ /* ad */ 0xe8a6a5, 0xe8a6b0, 0xe8a6b4, 0xe8a6b5,
+ /* b1 */ 0xe8a6b6, 0xe8a6b7, 0xe8a6bc, 0xe8a794,
+ /* b5 */ 0xe8a795, 0xe8a796, 0xe8a797, 0xe8a798,
+ /* b9 */ 0xe8a7a5, 0xe8a7a9, 0xe8a7ab, 0xe8a7ad,
+ /* bd */ 0xe8a7b1, 0xe8a7b3, 0xe8a7b6, 0xe8a7b9,
+ /* c1 */ 0xe8a7bd, 0xe8a7bf, 0xe8a884, 0xe8a885,
+ /* c5 */ 0xe8a887, 0xe8a88f, 0xe8a891, 0xe8a892,
+ /* c9 */ 0xe8a894, 0xe8a895, 0xe8a89e, 0xe8a8a0,
+ /* cd */ 0xe8a8a2, 0xe8a8a4, 0xe8a8a6, 0xe8a8ab,
+ /* d1 */ 0xe8a8ac, 0xe8a8af, 0xe8a8b5, 0xe8a8b7,
+ /* d5 */ 0xe8a8bd, 0xe8a8be, 0xe8a980, 0xe8a983,
+ /* d9 */ 0xe8a985, 0xe8a987, 0xe8a989, 0xe8a98d,
+ /* dd */ 0xe8a98e, 0xe8a993, 0xe8a996, 0xe8a997,
+ /* e1 */ 0xe8a998, 0xe8a99c, 0xe8a99d, 0xe8a9a1,
+ /* e5 */ 0xe8a9a5, 0xe8a9a7, 0xe8a9b5, 0xe8a9b6,
+ /* e9 */ 0xe8a9b7, 0xe8a9b9, 0xe8a9ba, 0xe8a9bb,
+ /* ed */ 0xe8a9be, 0xe8a9bf, 0xe8aa80, 0xe8aa83,
+ /* f1 */ 0xe8aa86, 0xe8aa8b, 0xe8aa8f, 0xe8aa90,
+ /* f5 */ 0xe8aa92, 0xe8aa96, 0xe8aa97, 0xe8aa99,
+ /* f9 */ 0xe8aa9f, 0xe8aaa7, 0xe8aaa9, 0xe8aaae,
+ /* fd */ 0xe8aaaf, 0xe8aab3,
+
+ /*** Three byte table, leaf: 8fdexx - offset 0x0312d ***/
+
+ /* a1 */ 0xe8aab6, 0xe8aab7, 0xe8aabb, 0xe8aabe,
+ /* a5 */ 0xe8ab83, 0xe8ab86, 0xe8ab88, 0xe8ab89,
+ /* a9 */ 0xe8ab8a, 0xe8ab91, 0xe8ab93, 0xe8ab94,
+ /* ad */ 0xe8ab95, 0xe8ab97, 0xe8ab9d, 0xe8ab9f,
+ /* b1 */ 0xe8abac, 0xe8abb0, 0xe8abb4, 0xe8abb5,
+ /* b5 */ 0xe8abb6, 0xe8abbc, 0xe8abbf, 0xe8ac85,
+ /* b9 */ 0xe8ac86, 0xe8ac8b, 0xe8ac91, 0xe8ac9c,
+ /* bd */ 0xe8ac9e, 0xe8ac9f, 0xe8ac8a, 0xe8acad,
+ /* c1 */ 0xe8acb0, 0xe8acb7, 0xe8acbc, 0xe8ad82,
+ /* c5 */ 0xe8ad83, 0xe8ad84, 0xe8ad85, 0xe8ad86,
+ /* c9 */ 0xe8ad88, 0xe8ad92, 0xe8ad93, 0xe8ad94,
+ /* cd */ 0xe8ad99, 0xe8ad8d, 0xe8ad9e, 0xe8ada3,
+ /* d1 */ 0xe8adad, 0xe8adb6, 0xe8adb8, 0xe8adb9,
+ /* d5 */ 0xe8adbc, 0xe8adbe, 0xe8ae81, 0xe8ae84,
+ /* d9 */ 0xe8ae85, 0xe8ae8b, 0xe8ae8d, 0xe8ae8f,
+ /* dd */ 0xe8ae94, 0xe8ae95, 0xe8ae9c, 0xe8ae9e,
+ /* e1 */ 0xe8ae9f, 0xe8b0b8, 0xe8b0b9, 0xe8b0bd,
+ /* e5 */ 0xe8b0be, 0xe8b185, 0xe8b187, 0xe8b189,
+ /* e9 */ 0xe8b18b, 0xe8b18f, 0xe8b191, 0xe8b193,
+ /* ed */ 0xe8b194, 0xe8b197, 0xe8b198, 0xe8b19b,
+ /* f1 */ 0xe8b19d, 0xe8b199, 0xe8b1a3, 0xe8b1a4,
+ /* f5 */ 0xe8b1a6, 0xe8b1a8, 0xe8b1a9, 0xe8b1ad,
+ /* f9 */ 0xe8b1b3, 0xe8b1b5, 0xe8b1b6, 0xe8b1bb,
+ /* fd */ 0xe8b1be, 0xe8b286,
+
+ /*** Three byte table, leaf: 8fdfxx - offset 0x0318b ***/
+
+ /* a1 */ 0xe8b287, 0xe8b28b, 0xe8b290, 0xe8b292,
+ /* a5 */ 0xe8b293, 0xe8b299, 0xe8b29b, 0xe8b29c,
+ /* a9 */ 0xe8b2a4, 0xe8b2b9, 0xe8b2ba, 0xe8b385,
+ /* ad */ 0xe8b386, 0xe8b389, 0xe8b38b, 0xe8b38f,
+ /* b1 */ 0xe8b396, 0xe8b395, 0xe8b399, 0xe8b39d,
+ /* b5 */ 0xe8b3a1, 0xe8b3a8, 0xe8b3ac, 0xe8b3af,
+ /* b9 */ 0xe8b3b0, 0xe8b3b2, 0xe8b3b5, 0xe8b3b7,
+ /* bd */ 0xe8b3b8, 0xe8b3be, 0xe8b3bf, 0xe8b481,
+ /* c1 */ 0xe8b483, 0xe8b489, 0xe8b492, 0xe8b497,
+ /* c5 */ 0xe8b49b, 0xe8b5a5, 0xe8b5a9, 0xe8b5ac,
+ /* c9 */ 0xe8b5ae, 0xe8b5bf, 0xe8b682, 0xe8b684,
+ /* cd */ 0xe8b688, 0xe8b68d, 0xe8b690, 0xe8b691,
+ /* d1 */ 0xe8b695, 0xe8b69e, 0xe8b69f, 0xe8b6a0,
+ /* d5 */ 0xe8b6a6, 0xe8b6ab, 0xe8b6ac, 0xe8b6af,
+ /* d9 */ 0xe8b6b2, 0xe8b6b5, 0xe8b6b7, 0xe8b6b9,
+ /* dd */ 0xe8b6bb, 0xe8b780, 0xe8b785, 0xe8b786,
+ /* e1 */ 0xe8b787, 0xe8b788, 0xe8b78a, 0xe8b78e,
+ /* e5 */ 0xe8b791, 0xe8b794, 0xe8b795, 0xe8b797,
+ /* e9 */ 0xe8b799, 0xe8b7a4, 0xe8b7a5, 0xe8b7a7,
+ /* ed */ 0xe8b7ac, 0xe8b7b0, 0xe8b6bc, 0xe8b7b1,
+ /* f1 */ 0xe8b7b2, 0xe8b7b4, 0xe8b7bd, 0xe8b881,
+ /* f5 */ 0xe8b884, 0xe8b885, 0xe8b886, 0xe8b88b,
+ /* f9 */ 0xe8b891, 0xe8b894, 0xe8b896, 0xe8b8a0,
+ /* fd */ 0xe8b8a1, 0xe8b8a2,
+
+ /*** Three byte table, leaf: 8fe0xx - offset 0x031e9 ***/
+
+ /* a1 */ 0xe8b8a3, 0xe8b8a6, 0xe8b8a7, 0xe8b8b1,
+ /* a5 */ 0xe8b8b3, 0xe8b8b6, 0xe8b8b7, 0xe8b8b8,
+ /* a9 */ 0xe8b8b9, 0xe8b8bd, 0xe8b980, 0xe8b981,
+ /* ad */ 0xe8b98b, 0xe8b98d, 0xe8b98e, 0xe8b98f,
+ /* b1 */ 0xe8b994, 0xe8b99b, 0xe8b99c, 0xe8b99d,
+ /* b5 */ 0xe8b99e, 0xe8b9a1, 0xe8b9a2, 0xe8b9a9,
+ /* b9 */ 0xe8b9ac, 0xe8b9ad, 0xe8b9af, 0xe8b9b0,
+ /* bd */ 0xe8b9b1, 0xe8b9b9, 0xe8b9ba, 0xe8b9bb,
+ /* c1 */ 0xe8ba82, 0xe8ba83, 0xe8ba89, 0xe8ba90,
+ /* c5 */ 0xe8ba92, 0xe8ba95, 0xe8ba9a, 0xe8ba9b,
+ /* c9 */ 0xe8ba9d, 0xe8ba9e, 0xe8baa2, 0xe8baa7,
+ /* cd */ 0xe8baa9, 0xe8baad, 0xe8baae, 0xe8bab3,
+ /* d1 */ 0xe8bab5, 0xe8baba, 0xe8babb, 0xe8bb80,
+ /* d5 */ 0xe8bb81, 0xe8bb83, 0xe8bb84, 0xe8bb87,
+ /* d9 */ 0xe8bb8f, 0xe8bb91, 0xe8bb94, 0xe8bb9c,
+ /* dd */ 0xe8bba8, 0xe8bbae, 0xe8bbb0, 0xe8bbb1,
+ /* e1 */ 0xe8bbb7, 0xe8bbb9, 0xe8bbba, 0xe8bbad,
+ /* e5 */ 0xe8bc80, 0xe8bc82, 0xe8bc87, 0xe8bc88,
+ /* e9 */ 0xe8bc8f, 0xe8bc90, 0xe8bc96, 0xe8bc97,
+ /* ed */ 0xe8bc98, 0xe8bc9e, 0xe8bca0, 0xe8bca1,
+ /* f1 */ 0xe8bca3, 0xe8bca5, 0xe8bca7, 0xe8bca8,
+ /* f5 */ 0xe8bcac, 0xe8bcad, 0xe8bcae, 0xe8bcb4,
+ /* f9 */ 0xe8bcb5, 0xe8bcb6, 0xe8bcb7, 0xe8bcba,
+ /* fd */ 0xe8bd80, 0xe8bd81,
+
+ /*** Three byte table, leaf: 8fe1xx - offset 0x03247 ***/
+
+ /* a1 */ 0xe8bd83, 0xe8bd87, 0xe8bd8f, 0xe8bd91,
+ /* a5 */ 0xe8bd92, 0xe8bd93, 0xe8bd94, 0xe8bd95,
+ /* a9 */ 0xe8bd98, 0xe8bd9d, 0xe8bd9e, 0xe8bda5,
+ /* ad */ 0xe8be9d, 0xe8bea0, 0xe8bea1, 0xe8bea4,
+ /* b1 */ 0xe8bea5, 0xe8bea6, 0xe8beb5, 0xe8beb6,
+ /* b5 */ 0xe8beb8, 0xe8bebe, 0xe8bf80, 0xe8bf81,
+ /* b9 */ 0xe8bf86, 0xe8bf8a, 0xe8bf8b, 0xe8bf8d,
+ /* bd */ 0xe8bf90, 0xe8bf92, 0xe8bf93, 0xe8bf95,
+ /* c1 */ 0xe8bfa0, 0xe8bfa3, 0xe8bfa4, 0xe8bfa8,
+ /* c5 */ 0xe8bfae, 0xe8bfb1, 0xe8bfb5, 0xe8bfb6,
+ /* c9 */ 0xe8bfbb, 0xe8bfbe, 0xe98082, 0xe98084,
+ /* cd */ 0xe98088, 0xe9808c, 0xe98098, 0xe9809b,
+ /* d1 */ 0xe980a8, 0xe980a9, 0xe980af, 0xe980aa,
+ /* d5 */ 0xe980ac, 0xe980ad, 0xe980b3, 0xe980b4,
+ /* d9 */ 0xe980b7, 0xe980bf, 0xe98183, 0xe98184,
+ /* dd */ 0xe9818c, 0xe9819b, 0xe9819d, 0xe981a2,
+ /* e1 */ 0xe981a6, 0xe981a7, 0xe981ac, 0xe981b0,
+ /* e5 */ 0xe981b4, 0xe981b9, 0xe98285, 0xe98288,
+ /* e9 */ 0xe9828b, 0xe9828c, 0xe9828e, 0xe98290,
+ /* ed */ 0xe98295, 0xe98297, 0xe98298, 0xe98299,
+ /* f1 */ 0xe9829b, 0xe982a0, 0xe982a1, 0xe982a2,
+ /* f5 */ 0xe982a5, 0xe982b0, 0xe982b2, 0xe982b3,
+ /* f9 */ 0xe982b4, 0xe982b6, 0xe982bd, 0xe9838c,
+ /* fd */ 0xe982be, 0xe98383,
+
+ /*** Three byte table, leaf: 8fe2xx - offset 0x032a5 ***/
+
+ /* a1 */ 0xe98384, 0xe98385, 0xe98387, 0xe98388,
+ /* a5 */ 0xe98395, 0xe98397, 0xe98398, 0xe98399,
+ /* a9 */ 0xe9839c, 0xe9839d, 0xe9839f, 0xe983a5,
+ /* ad */ 0xe98392, 0xe983b6, 0xe983ab, 0xe983af,
+ /* b1 */ 0xe983b0, 0xe983b4, 0xe983be, 0xe983bf,
+ /* b5 */ 0xe98480, 0xe98484, 0xe98485, 0xe98486,
+ /* b9 */ 0xe98488, 0xe9848d, 0xe98490, 0xe98494,
+ /* bd */ 0xe98496, 0xe98497, 0xe98498, 0xe9849a,
+ /* c1 */ 0xe9849c, 0xe9849e, 0xe984a0, 0xe984a5,
+ /* c5 */ 0xe984a2, 0xe984a3, 0xe984a7, 0xe984a9,
+ /* c9 */ 0xe984ae, 0xe984af, 0xe984b1, 0xe984b4,
+ /* cd */ 0xe984b6, 0xe984b7, 0xe984b9, 0xe984ba,
+ /* d1 */ 0xe984bc, 0xe984bd, 0xe98583, 0xe98587,
+ /* d5 */ 0xe98588, 0xe9858f, 0xe98593, 0xe98597,
+ /* d9 */ 0xe98599, 0xe9859a, 0xe9859b, 0xe985a1,
+ /* dd */ 0xe985a4, 0xe985a7, 0xe985ad, 0xe985b4,
+ /* e1 */ 0xe985b9, 0xe985ba, 0xe985bb, 0xe98681,
+ /* e5 */ 0xe98683, 0xe98685, 0xe98686, 0xe9868a,
+ /* e9 */ 0xe9868e, 0xe98691, 0xe98693, 0xe98694,
+ /* ed */ 0xe98695, 0xe98698, 0xe9869e, 0xe986a1,
+ /* f1 */ 0xe986a6, 0xe986a8, 0xe986ac, 0xe986ad,
+ /* f5 */ 0xe986ae, 0xe986b0, 0xe986b1, 0xe986b2,
+ /* f9 */ 0xe986b3, 0xe986b6, 0xe986bb, 0xe986bc,
+ /* fd */ 0xe986bd, 0xe986bf,
+
+ /*** Three byte table, leaf: 8fe3xx - offset 0x03303 ***/
+
+ /* a1 */ 0xe98782, 0xe98783, 0xe98785, 0xe98793,
+ /* a5 */ 0xe98794, 0xe98797, 0xe98799, 0xe9879a,
+ /* a9 */ 0xe9879e, 0xe987a4, 0xe987a5, 0xe987a9,
+ /* ad */ 0xe987aa, 0xe987ac, 0xe987ad, 0xe987ae,
+ /* b1 */ 0xe987af, 0xe987b0, 0xe987b1, 0xe987b7,
+ /* b5 */ 0xe987b9, 0xe987bb, 0xe987bd, 0xe98880,
+ /* b9 */ 0xe98881, 0xe98884, 0xe98885, 0xe98886,
+ /* bd */ 0xe98887, 0xe98889, 0xe9888a, 0xe9888c,
+ /* c1 */ 0xe98890, 0xe98892, 0xe98893, 0xe98896,
+ /* c5 */ 0xe98898, 0xe9889c, 0xe9889d, 0xe988a3,
+ /* c9 */ 0xe988a4, 0xe988a5, 0xe988a6, 0xe988a8,
+ /* cd */ 0xe988ae, 0xe988af, 0xe988b0, 0xe988b3,
+ /* d1 */ 0xe988b5, 0xe988b6, 0xe988b8, 0xe988b9,
+ /* d5 */ 0xe988ba, 0xe988bc, 0xe988be, 0xe98980,
+ /* d9 */ 0xe98982, 0xe98983, 0xe98986, 0xe98987,
+ /* dd */ 0xe9898a, 0xe9898d, 0xe9898e, 0xe9898f,
+ /* e1 */ 0xe98991, 0xe98998, 0xe98999, 0xe9899c,
+ /* e5 */ 0xe9899d, 0xe989a0, 0xe989a1, 0xe989a5,
+ /* e9 */ 0xe989a7, 0xe989a8, 0xe989a9, 0xe989ae,
+ /* ed */ 0xe989af, 0xe989b0, 0xe989b5, 0xe989b6,
+ /* f1 */ 0xe989b7, 0xe989b8, 0xe989b9, 0xe989bb,
+ /* f5 */ 0xe989bc, 0xe989bd, 0xe989bf, 0xe98a88,
+ /* f9 */ 0xe98a89, 0xe98a8a, 0xe98a8d, 0xe98a8e,
+ /* fd */ 0xe98a92, 0xe98a97,
+
+ /*** Three byte table, leaf: 8fe4xx - offset 0x03361 ***/
+
+ /* a1 */ 0xe98a99, 0xe98a9f, 0xe98aa0, 0xe98aa4,
+ /* a5 */ 0xe98aa5, 0xe98aa7, 0xe98aa8, 0xe98aab,
+ /* a9 */ 0xe98aaf, 0xe98ab2, 0xe98ab6, 0xe98ab8,
+ /* ad */ 0xe98aba, 0xe98abb, 0xe98abc, 0xe98abd,
+ /* b1 */ 0xe98abf, 0xe98b80, 0xe98b81, 0xe98b82,
+ /* b5 */ 0xe98b83, 0xe98b85, 0xe98b86, 0xe98b87,
+ /* b9 */ 0xe98b88, 0xe98b8b, 0xe98b8c, 0xe98b8d,
+ /* bd */ 0xe98b8e, 0xe98b90, 0xe98b93, 0xe98b95,
+ /* c1 */ 0xe98b97, 0xe98b98, 0xe98b99, 0xe98b9c,
+ /* c5 */ 0xe98b9d, 0xe98b9f, 0xe98ba0, 0xe98ba1,
+ /* c9 */ 0xe98ba3, 0xe98ba5, 0xe98ba7, 0xe98ba8,
+ /* cd */ 0xe98bac, 0xe98bae, 0xe98bb0, 0xe98bb9,
+ /* d1 */ 0xe98bbb, 0xe98bbf, 0xe98c80, 0xe98c82,
+ /* d5 */ 0xe98c88, 0xe98c8d, 0xe98c91, 0xe98c94,
+ /* d9 */ 0xe98c95, 0xe98c9c, 0xe98c9d, 0xe98c9e,
+ /* dd */ 0xe98c9f, 0xe98ca1, 0xe98ca4, 0xe98ca5,
+ /* e1 */ 0xe98ca7, 0xe98ca9, 0xe98caa, 0xe98cb3,
+ /* e5 */ 0xe98cb4, 0xe98cb6, 0xe98cb7, 0xe98d87,
+ /* e9 */ 0xe98d88, 0xe98d89, 0xe98d90, 0xe98d91,
+ /* ed */ 0xe98d92, 0xe98d95, 0xe98d97, 0xe98d98,
+ /* f1 */ 0xe98d9a, 0xe98d9e, 0xe98da4, 0xe98da5,
+ /* f5 */ 0xe98da7, 0xe98da9, 0xe98daa, 0xe98dad,
+ /* f9 */ 0xe98daf, 0xe98db0, 0xe98db1, 0xe98db3,
+ /* fd */ 0xe98db4, 0xe98db6,
+
+ /*** Three byte table, leaf: 8fe5xx - offset 0x033bf ***/
+
+ /* a1 */ 0xe98dba, 0xe98dbd, 0xe98dbf, 0xe98e80,
+ /* a5 */ 0xe98e81, 0xe98e82, 0xe98e88, 0xe98e8a,
+ /* a9 */ 0xe98e8b, 0xe98e8d, 0xe98e8f, 0xe98e92,
+ /* ad */ 0xe98e95, 0xe98e98, 0xe98e9b, 0xe98e9e,
+ /* b1 */ 0xe98ea1, 0xe98ea3, 0xe98ea4, 0xe98ea6,
+ /* b5 */ 0xe98ea8, 0xe98eab, 0xe98eb4, 0xe98eb5,
+ /* b9 */ 0xe98eb6, 0xe98eba, 0xe98ea9, 0xe98f81,
+ /* bd */ 0xe98f84, 0xe98f85, 0xe98f86, 0xe98f87,
+ /* c1 */ 0xe98f89, 0xe98f8a, 0xe98f8b, 0xe98f8c,
+ /* c5 */ 0xe98f8d, 0xe98f93, 0xe98f99, 0xe98f9c,
+ /* c9 */ 0xe98f9e, 0xe98f9f, 0xe98fa2, 0xe98fa6,
+ /* cd */ 0xe98fa7, 0xe98fb9, 0xe98fb7, 0xe98fb8,
+ /* d1 */ 0xe98fba, 0xe98fbb, 0xe98fbd, 0xe99081,
+ /* d5 */ 0xe99082, 0xe99084, 0xe99088, 0xe99089,
+ /* d9 */ 0xe9908d, 0xe9908e, 0xe9908f, 0xe99095,
+ /* dd */ 0xe99096, 0xe99097, 0xe9909f, 0xe990ae,
+ /* e1 */ 0xe990af, 0xe990b1, 0xe990b2, 0xe990b3,
+ /* e5 */ 0xe990b4, 0xe990bb, 0xe990bf, 0xe990bd,
+ /* e9 */ 0xe99183, 0xe99185, 0xe99188, 0xe9918a,
+ /* ed */ 0xe9918c, 0xe99195, 0xe99199, 0xe9919c,
+ /* f1 */ 0xe9919f, 0xe991a1, 0xe991a3, 0xe991a8,
+ /* f5 */ 0xe991ab, 0xe991ad, 0xe991ae, 0xe991af,
+ /* f9 */ 0xe991b1, 0xe991b2, 0xe99284, 0xe99283,
+ /* fd */ 0xe995b8, 0xe995b9,
+
+ /*** Three byte table, leaf: 8fe6xx - offset 0x0341d ***/
+
+ /* a1 */ 0xe995be, 0xe99684, 0xe99688, 0xe9968c,
+ /* a5 */ 0xe9968d, 0xe9968e, 0xe9969d, 0xe9969e,
+ /* a9 */ 0xe9969f, 0xe996a1, 0xe996a6, 0xe996a9,
+ /* ad */ 0xe996ab, 0xe996ac, 0xe996b4, 0xe996b6,
+ /* b1 */ 0xe996ba, 0xe996bd, 0xe996bf, 0xe99786,
+ /* b5 */ 0xe99788, 0xe99789, 0xe9978b, 0xe99790,
+ /* b9 */ 0xe99791, 0xe99792, 0xe99793, 0xe99799,
+ /* bd */ 0xe9979a, 0xe9979d, 0xe9979e, 0xe9979f,
+ /* c1 */ 0xe997a0, 0xe997a4, 0xe997a6, 0xe9989d,
+ /* c5 */ 0xe9989e, 0xe998a2, 0xe998a4, 0xe998a5,
+ /* c9 */ 0xe998a6, 0xe998ac, 0xe998b1, 0xe998b3,
+ /* cd */ 0xe998b7, 0xe998b8, 0xe998b9, 0xe998ba,
+ /* d1 */ 0xe998bc, 0xe998bd, 0xe99981, 0xe99992,
+ /* d5 */ 0xe99994, 0xe99996, 0xe99997, 0xe99998,
+ /* d9 */ 0xe999a1, 0xe999ae, 0xe999b4, 0xe999bb,
+ /* dd */ 0xe999bc, 0xe999be, 0xe999bf, 0xe99a81,
+ /* e1 */ 0xe99a82, 0xe99a83, 0xe99a84, 0xe99a89,
+ /* e5 */ 0xe99a91, 0xe99a96, 0xe99a9a, 0xe99a9d,
+ /* e9 */ 0xe99a9f, 0xe99aa4, 0xe99aa5, 0xe99aa6,
+ /* ed */ 0xe99aa9, 0xe99aae, 0xe99aaf, 0xe99ab3,
+ /* f1 */ 0xe99aba, 0xe99b8a, 0xe99b92, 0xe5b6b2,
+ /* f5 */ 0xe99b98, 0xe99b9a, 0xe99b9d, 0xe99b9e,
+ /* f9 */ 0xe99b9f, 0xe99ba9, 0xe99baf, 0xe99bb1,
+ /* fd */ 0xe99bba, 0xe99c82,
+
+ /*** Three byte table, leaf: 8fe7xx - offset 0x0347b ***/
+
+ /* a1 */ 0xe99c83, 0xe99c85, 0xe99c89, 0xe99c9a,
+ /* a5 */ 0xe99c9b, 0xe99c9d, 0xe99ca1, 0xe99ca2,
+ /* a9 */ 0xe99ca3, 0xe99ca8, 0xe99cb1, 0xe99cb3,
+ /* ad */ 0xe99d81, 0xe99d83, 0xe99d8a, 0xe99d8e,
+ /* b1 */ 0xe99d8f, 0xe99d95, 0xe99d97, 0xe99d98,
+ /* b5 */ 0xe99d9a, 0xe99d9b, 0xe99da3, 0xe99da7,
+ /* b9 */ 0xe99daa, 0xe99dae, 0xe99db3, 0xe99db6,
+ /* bd */ 0xe99db7, 0xe99db8, 0xe99dbb, 0xe99dbd,
+ /* c1 */ 0xe99dbf, 0xe99e80, 0xe99e89, 0xe99e95,
+ /* c5 */ 0xe99e96, 0xe99e97, 0xe99e99, 0xe99e9a,
+ /* c9 */ 0xe99e9e, 0xe99e9f, 0xe99ea2, 0xe99eac,
+ /* cd */ 0xe99eae, 0xe99eb1, 0xe99eb2, 0xe99eb5,
+ /* d1 */ 0xe99eb6, 0xe99eb8, 0xe99eb9, 0xe99eba,
+ /* d5 */ 0xe99ebc, 0xe99ebe, 0xe99ebf, 0xe99f81,
+ /* d9 */ 0xe99f84, 0xe99f85, 0xe99f87, 0xe99f89,
+ /* dd */ 0xe99f8a, 0xe99f8c, 0xe99f8d, 0xe99f8e,
+ /* e1 */ 0xe99f90, 0xe99f91, 0xe99f94, 0xe99f97,
+ /* e5 */ 0xe99f98, 0xe99f99, 0xe99f9d, 0xe99f9e,
+ /* e9 */ 0xe99fa0, 0xe99f9b, 0xe99fa1, 0xe99fa4,
+ /* ed */ 0xe99faf, 0xe99fb1, 0xe99fb4, 0xe99fb7,
+ /* f1 */ 0xe99fb8, 0xe99fba, 0xe9a087, 0xe9a08a,
+ /* f5 */ 0xe9a099, 0xe9a08d, 0xe9a08e, 0xe9a094,
+ /* f9 */ 0xe9a096, 0xe9a09c, 0xe9a09e, 0xe9a0a0,
+ /* fd */ 0xe9a0a3, 0xe9a0a6,
+
+ /*** Three byte table, leaf: 8fe8xx - offset 0x034d9 ***/
+
+ /* a1 */ 0xe9a0ab, 0xe9a0ae, 0xe9a0af, 0xe9a0b0,
+ /* a5 */ 0xe9a0b2, 0xe9a0b3, 0xe9a0b5, 0xe9a0a5,
+ /* a9 */ 0xe9a0be, 0xe9a184, 0xe9a187, 0xe9a18a,
+ /* ad */ 0xe9a191, 0xe9a192, 0xe9a193, 0xe9a196,
+ /* b1 */ 0xe9a197, 0xe9a199, 0xe9a19a, 0xe9a1a2,
+ /* b5 */ 0xe9a1a3, 0xe9a1a5, 0xe9a1a6, 0xe9a1aa,
+ /* b9 */ 0xe9a1ac, 0xe9a2ab, 0xe9a2ad, 0xe9a2ae,
+ /* bd */ 0xe9a2b0, 0xe9a2b4, 0xe9a2b7, 0xe9a2b8,
+ /* c1 */ 0xe9a2ba, 0xe9a2bb, 0xe9a2bf, 0xe9a382,
+ /* c5 */ 0xe9a385, 0xe9a388, 0xe9a38c, 0xe9a3a1,
+ /* c9 */ 0xe9a3a3, 0xe9a3a5, 0xe9a3a6, 0xe9a3a7,
+ /* cd */ 0xe9a3aa, 0xe9a3b3, 0xe9a3b6, 0xe9a482,
+ /* d1 */ 0xe9a487, 0xe9a488, 0xe9a491, 0xe9a495,
+ /* d5 */ 0xe9a496, 0xe9a497, 0xe9a49a, 0xe9a49b,
+ /* d9 */ 0xe9a49c, 0xe9a49f, 0xe9a4a2, 0xe9a4a6,
+ /* dd */ 0xe9a4a7, 0xe9a4ab, 0xe9a4b1, 0xe9a4b2,
+ /* e1 */ 0xe9a4b3, 0xe9a4b4, 0xe9a4b5, 0xe9a4b9,
+ /* e5 */ 0xe9a4ba, 0xe9a4bb, 0xe9a4bc, 0xe9a580,
+ /* e9 */ 0xe9a581, 0xe9a586, 0xe9a587, 0xe9a588,
+ /* ed */ 0xe9a58d, 0xe9a58e, 0xe9a594, 0xe9a598,
+ /* f1 */ 0xe9a599, 0xe9a59b, 0xe9a59c, 0xe9a59e,
+ /* f5 */ 0xe9a59f, 0xe9a5a0, 0xe9a69b, 0xe9a69d,
+ /* f9 */ 0xe9a69f, 0xe9a6a6, 0xe9a6b0, 0xe9a6b1,
+ /* fd */ 0xe9a6b2, 0xe9a6b5,
+
+ /*** Three byte table, leaf: 8fe9xx - offset 0x03537 ***/
+
+ /* a1 */ 0xe9a6b9, 0xe9a6ba, 0xe9a6bd, 0xe9a6bf,
+ /* a5 */ 0xe9a783, 0xe9a789, 0xe9a793, 0xe9a794,
+ /* a9 */ 0xe9a799, 0xe9a79a, 0xe9a79c, 0xe9a79e,
+ /* ad */ 0xe9a7a7, 0xe9a7aa, 0xe9a7ab, 0xe9a7ac,
+ /* b1 */ 0xe9a7b0, 0xe9a7b4, 0xe9a7b5, 0xe9a7b9,
+ /* b5 */ 0xe9a7bd, 0xe9a7be, 0xe9a882, 0xe9a883,
+ /* b9 */ 0xe9a884, 0xe9a88b, 0xe9a88c, 0xe9a890,
+ /* bd */ 0xe9a891, 0xe9a896, 0xe9a89e, 0xe9a8a0,
+ /* c1 */ 0xe9a8a2, 0xe9a8a3, 0xe9a8a4, 0xe9a8a7,
+ /* c5 */ 0xe9a8ad, 0xe9a8ae, 0xe9a8b3, 0xe9a8b5,
+ /* c9 */ 0xe9a8b6, 0xe9a8b8, 0xe9a987, 0xe9a981,
+ /* cd */ 0xe9a984, 0xe9a98a, 0xe9a98b, 0xe9a98c,
+ /* d1 */ 0xe9a98e, 0xe9a991, 0xe9a994, 0xe9a996,
+ /* d5 */ 0xe9a99d, 0xe9aaaa, 0xe9aaac, 0xe9aaae,
+ /* d9 */ 0xe9aaaf, 0xe9aab2, 0xe9aab4, 0xe9aab5,
+ /* dd */ 0xe9aab6, 0xe9aab9, 0xe9aabb, 0xe9aabe,
+ /* e1 */ 0xe9aabf, 0xe9ab81, 0xe9ab83, 0xe9ab86,
+ /* e5 */ 0xe9ab88, 0xe9ab8e, 0xe9ab90, 0xe9ab92,
+ /* e9 */ 0xe9ab95, 0xe9ab96, 0xe9ab97, 0xe9ab9b,
+ /* ed */ 0xe9ab9c, 0xe9aba0, 0xe9aba4, 0xe9aba5,
+ /* f1 */ 0xe9aba7, 0xe9aba9, 0xe9abac, 0xe9abb2,
+ /* f5 */ 0xe9abb3, 0xe9abb5, 0xe9abb9, 0xe9abba,
+ /* f9 */ 0xe9abbd, 0xe9abbf, 0xe9ac80, 0xe9ac81,
+ /* fd */ 0xe9ac82, 0xe9ac83,
+
+ /*** Three byte table, leaf: 8feaxx - offset 0x03595 ***/
+
+ /* a1 */ 0xe9ac84, 0xe9ac85, 0xe9ac88, 0xe9ac89,
+ /* a5 */ 0xe9ac8b, 0xe9ac8c, 0xe9ac8d, 0xe9ac8e,
+ /* a9 */ 0xe9ac90, 0xe9ac92, 0xe9ac96, 0xe9ac99,
+ /* ad */ 0xe9ac9b, 0xe9ac9c, 0xe9aca0, 0xe9aca6,
+ /* b1 */ 0xe9acab, 0xe9acad, 0xe9acb3, 0xe9acb4,
+ /* b5 */ 0xe9acb5, 0xe9acb7, 0xe9acb9, 0xe9acba,
+ /* b9 */ 0xe9acbd, 0xe9ad88, 0xe9ad8b, 0xe9ad8c,
+ /* bd */ 0xe9ad95, 0xe9ad96, 0xe9ad97, 0xe9ad9b,
+ /* c1 */ 0xe9ad9e, 0xe9ada1, 0xe9ada3, 0xe9ada5,
+ /* c5 */ 0xe9ada6, 0xe9ada8, 0xe9adaa, 0xe9adab,
+ /* c9 */ 0xe9adac, 0xe9adad, 0xe9adae, 0xe9adb3,
+ /* cd */ 0xe9adb5, 0xe9adb7, 0xe9adb8, 0xe9adb9,
+ /* d1 */ 0xe9adbf, 0xe9ae80, 0xe9ae84, 0xe9ae85,
+ /* d5 */ 0xe9ae86, 0xe9ae87, 0xe9ae89, 0xe9ae8a,
+ /* d9 */ 0xe9ae8b, 0xe9ae8d, 0xe9ae8f, 0xe9ae90,
+ /* dd */ 0xe9ae94, 0xe9ae9a, 0xe9ae9d, 0xe9ae9e,
+ /* e1 */ 0xe9aea6, 0xe9aea7, 0xe9aea9, 0xe9aeac,
+ /* e5 */ 0xe9aeb0, 0xe9aeb1, 0xe9aeb2, 0xe9aeb7,
+ /* e9 */ 0xe9aeb8, 0xe9aebb, 0xe9aebc, 0xe9aebe,
+ /* ed */ 0xe9aebf, 0xe9af81, 0xe9af87, 0xe9af88,
+ /* f1 */ 0xe9af8e, 0xe9af90, 0xe9af97, 0xe9af98,
+ /* f5 */ 0xe9af9d, 0xe9af9f, 0xe9afa5, 0xe9afa7,
+ /* f9 */ 0xe9afaa, 0xe9afab, 0xe9afaf, 0xe9afb3,
+ /* fd */ 0xe9afb7, 0xe9afb8,
+
+ /*** Three byte table, leaf: 8febxx - offset 0x035f3 ***/
+
+ /* a1 */ 0xe9afb9, 0xe9afba, 0xe9afbd, 0xe9afbf,
+ /* a5 */ 0xe9b080, 0xe9b082, 0xe9b08b, 0xe9b08f,
+ /* a9 */ 0xe9b091, 0xe9b096, 0xe9b098, 0xe9b099,
+ /* ad */ 0xe9b09a, 0xe9b09c, 0xe9b09e, 0xe9b0a2,
+ /* b1 */ 0xe9b0a3, 0xe9b0a6, 0xe9b0a7, 0xe9b0a8,
+ /* b5 */ 0xe9b0a9, 0xe9b0aa, 0xe9b0b1, 0xe9b0b5,
+ /* b9 */ 0xe9b0b6, 0xe9b0b7, 0xe9b0bd, 0xe9b181,
+ /* bd */ 0xe9b183, 0xe9b184, 0xe9b185, 0xe9b189,
+ /* c1 */ 0xe9b18a, 0xe9b18e, 0xe9b18f, 0xe9b190,
+ /* c5 */ 0xe9b193, 0xe9b194, 0xe9b196, 0xe9b198,
+ /* c9 */ 0xe9b19b, 0xe9b19d, 0xe9b19e, 0xe9b19f,
+ /* cd */ 0xe9b1a3, 0xe9b1a9, 0xe9b1aa, 0xe9b19c,
+ /* d1 */ 0xe9b1ab, 0xe9b1a8, 0xe9b1ae, 0xe9b1b0,
+ /* d5 */ 0xe9b1b2, 0xe9b1b5, 0xe9b1b7, 0xe9b1bb,
+ /* d9 */ 0xe9b3a6, 0xe9b3b2, 0xe9b3b7, 0xe9b3b9,
+ /* dd */ 0xe9b48b, 0xe9b482, 0xe9b491, 0xe9b497,
+ /* e1 */ 0xe9b498, 0xe9b49c, 0xe9b49d, 0xe9b49e,
+ /* e5 */ 0xe9b4af, 0xe9b4b0, 0xe9b4b2, 0xe9b4b3,
+ /* e9 */ 0xe9b4b4, 0xe9b4ba, 0xe9b4bc, 0xe9b585,
+ /* ed */ 0xe9b4bd, 0xe9b582, 0xe9b583, 0xe9b587,
+ /* f1 */ 0xe9b58a, 0xe9b593, 0xe9b594, 0xe9b59f,
+ /* f5 */ 0xe9b5a3, 0xe9b5a2, 0xe9b5a5, 0xe9b5a9,
+ /* f9 */ 0xe9b5aa, 0xe9b5ab, 0xe9b5b0, 0xe9b5b6,
+ /* fd */ 0xe9b5b7, 0xe9b5bb,
+
+ /*** Three byte table, leaf: 8fecxx - offset 0x03651 ***/
+
+ /* a1 */ 0xe9b5bc, 0xe9b5be, 0xe9b683, 0xe9b684,
+ /* a5 */ 0xe9b686, 0xe9b68a, 0xe9b68d, 0xe9b68e,
+ /* a9 */ 0xe9b692, 0xe9b693, 0xe9b695, 0xe9b696,
+ /* ad */ 0xe9b697, 0xe9b698, 0xe9b6a1, 0xe9b6aa,
+ /* b1 */ 0xe9b6ac, 0xe9b6ae, 0xe9b6b1, 0xe9b6b5,
+ /* b5 */ 0xe9b6b9, 0xe9b6bc, 0xe9b6bf, 0xe9b783,
+ /* b9 */ 0xe9b787, 0xe9b789, 0xe9b78a, 0xe9b794,
+ /* bd */ 0xe9b795, 0xe9b796, 0xe9b797, 0xe9b79a,
+ /* c1 */ 0xe9b79e, 0xe9b79f, 0xe9b7a0, 0xe9b7a5,
+ /* c5 */ 0xe9b7a7, 0xe9b7a9, 0xe9b7ab, 0xe9b7ae,
+ /* c9 */ 0xe9b7b0, 0xe9b7b3, 0xe9b7b4, 0xe9b7be,
+ /* cd */ 0xe9b88a, 0xe9b882, 0xe9b887, 0xe9b88e,
+ /* d1 */ 0xe9b890, 0xe9b891, 0xe9b892, 0xe9b895,
+ /* d5 */ 0xe9b896, 0xe9b899, 0xe9b89c, 0xe9b89d,
+ /* d9 */ 0xe9b9ba, 0xe9b9bb, 0xe9b9bc, 0xe9ba80,
+ /* dd */ 0xe9ba82, 0xe9ba83, 0xe9ba84, 0xe9ba85,
+ /* e1 */ 0xe9ba87, 0xe9ba8e, 0xe9ba8f, 0xe9ba96,
+ /* e5 */ 0xe9ba98, 0xe9ba9b, 0xe9ba9e, 0xe9baa4,
+ /* e9 */ 0xe9baa8, 0xe9baac, 0xe9baae, 0xe9baaf,
+ /* ed */ 0xe9bab0, 0xe9bab3, 0xe9bab4, 0xe9bab5,
+ /* f1 */ 0xe9bb86, 0xe9bb88, 0xe9bb8b, 0xe9bb95,
+ /* f5 */ 0xe9bb9f, 0xe9bba4, 0xe9bba7, 0xe9bbac,
+ /* f9 */ 0xe9bbad, 0xe9bbae, 0xe9bbb0, 0xe9bbb1,
+ /* fd */ 0xe9bbb2, 0xe9bbb5,
+
+ /*** Three byte table, leaf: 8fedxx - offset 0x036af ***/
+
+ /* a1 */ 0xe9bbb8, 0xe9bbbf, 0xe9bc82, 0xe9bc83,
+ /* a5 */ 0xe9bc89, 0xe9bc8f, 0xe9bc90, 0xe9bc91,
+ /* a9 */ 0xe9bc92, 0xe9bc94, 0xe9bc96, 0xe9bc97,
+ /* ad */ 0xe9bc99, 0xe9bc9a, 0xe9bc9b, 0xe9bc9f,
+ /* b1 */ 0xe9bca2, 0xe9bca6, 0xe9bcaa, 0xe9bcab,
+ /* b5 */ 0xe9bcaf, 0xe9bcb1, 0xe9bcb2, 0xe9bcb4,
+ /* b9 */ 0xe9bcb7, 0xe9bcb9, 0xe9bcba, 0xe9bcbc,
+ /* bd */ 0xe9bcbd, 0xe9bcbf, 0xe9bd81, 0xe9bd83,
+ /* c1 */ 0xe9bd84, 0xe9bd85, 0xe9bd86, 0xe9bd87,
+ /* c5 */ 0xe9bd93, 0xe9bd95, 0xe9bd96, 0xe9bd97,
+ /* c9 */ 0xe9bd98, 0xe9bd9a, 0xe9bd9d, 0xe9bd9e,
+ /* cd */ 0xe9bda8, 0xe9bda9, 0xe9bdad, 0xe9bdae,
+ /* d1 */ 0xe9bdaf, 0xe9bdb0, 0xe9bdb1, 0xe9bdb3,
+ /* d5 */ 0xe9bdb5, 0xe9bdba, 0xe9bdbd, 0xe9be8f,
+ /* d9 */ 0xe9be90, 0xe9be91, 0xe9be92, 0xe9be94,
+ /* dd */ 0xe9be96, 0xe9be97, 0xe9be9e, 0xe9bea1,
+ /* e1 */ 0xe9bea2, 0xe9bea3, 0xe9bea5,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: 8ff3xx - offset 0x036f2 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe285b0, 0xe285b1,
+ /* f5 */ 0xe285b2, 0xe285b3, 0xe285b4, 0xe285b5,
+ /* f9 */ 0xe285b6, 0xe285b7, 0xe285b8, 0xe285b9,
+ /* fd */ 0xe285a0, 0xe285a1,
+
+ /*** Three byte table, leaf: 8ff4xx - offset 0x03750 ***/
+
+ /* a1 */ 0xe285a2, 0xe285a3, 0xe285a4, 0xe285a5,
+ /* a5 */ 0xe285a6, 0xe285a7, 0xe285a8, 0xe285a9,
+ /* a9 */ 0xefbc87, 0xefbc82, 0xe388b1, 0xe28496,
+ /* ad */ 0xe284a1, 0xe782bb, 0xe4bbbc, 0xe583b4,
+ /* b1 */ 0xe587ac, 0xe58c87, 0xe58ca4, 0xefa88e,
+ /* b5 */ 0xe5928a, 0xe59d99, 0xefa88f, 0xefa890,
+ /* b9 */ 0xe5a29e, 0xe5afac, 0xe5b3b5, 0xe5b593,
+ /* bd */ 0xefa891, 0xe5beb7, 0xe68285, 0xe684a0,
+ /* c1 */ 0xe6958e, 0xe698bb, 0xe699a5, 0xefa892,
+ /* c5 */ 0xefa4a9, 0xe6a081, 0xefa893, 0xefa894,
+ /* c9 */ 0xe6a9ab, 0xe6aba2, 0xe6b7b8, 0xe6b7b2,
+ /* cd */ 0xe780a8, 0xefa895, 0xefa896, 0xe79481,
+ /* d1 */ 0xe79a82, 0xe79a9e, 0xefa897, 0xe7a4b0,
+ /* d5 */ 0xefa898, 0xefa899, 0xefa89a, 0xefa89b,
+ /* d9 */ 0xe7aba7, 0xefa89c, 0xefa89d, 0xe7b6a0,
+ /* dd */ 0xe7b796, 0xefa89e, 0xe88da2, 0xefa89f,
+ /* e1 */ 0xe896b0, 0xefa8a0, 0xefa8a1, 0xe8a087,
+ /* e5 */ 0xefa8a2, 0xe8adbf, 0xe8b3b4, 0xe8b5b6,
+ /* e9 */ 0xefa8a3, 0xefa8a4, 0xefa8a5, 0xe9839e,
+ /* ed */ 0xefa8a6, 0xe98495, 0xefa8a7, 0xefa8a8,
+ /* f1 */ 0xe99692, 0xefa79c, 0xefa8a9, 0xe99cbb,
+ /* f5 */ 0xe99d8d, 0xe99d91, 0xefa8aa, 0xefa8ab,
+ /* f9 */ 0xefa8ac, 0xe9a69e, 0xe9ab99, 0xe9adb2,
+ /* fd */ 0xefa8ad, 0xe9bb91
+};
diff --git a/src/backend/utils/mb/Unicode/euc_kr_to_utf8.map b/src/backend/utils/mb/Unicode/euc_kr_to_utf8.map
new file mode 100644
index 0000000..5d6bcc5
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc_kr_to_utf8.map
@@ -0,0 +1,2498 @@
+/* src/backend/utils/mb/Unicode/euc_kr_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl */
+
+static const uint32 euc_kr_to_unicode_tree_table[8553];
+
+static const pg_mb_radix_tree euc_kr_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_kr_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x005e, /* offset of table for 2-byte inputs */
+ 0xa1, /* b2_1_lower */
+ 0xfd, /* b2_1_upper */
+ 0xa1, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_kr_to_unicode_tree_table[8553] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0005e ***/
+
+ /* a1 */ 0x0000bb, 0x000119, 0x000177, 0x0001d5,
+ /* a5 */ 0x000233, 0x000291, 0x0002ef, 0x00034d,
+ /* a9 */ 0x0003ab, 0x000409, 0x000467, 0x0004c5,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000523,
+ /* b1 */ 0x000581, 0x0005df, 0x00063d, 0x00069b,
+ /* b5 */ 0x0006f9, 0x000757, 0x0007b5, 0x000813,
+ /* b9 */ 0x000871, 0x0008cf, 0x00092d, 0x00098b,
+ /* bd */ 0x0009e9, 0x000a47, 0x000aa5, 0x000b03,
+ /* c1 */ 0x000b61, 0x000bbf, 0x000c1d, 0x000c7b,
+ /* c5 */ 0x000cd9, 0x000d37, 0x000d95, 0x000df3,
+ /* c9 */ 0x000000, 0x000e51, 0x000eaf, 0x000f0d,
+ /* cd */ 0x000f6b, 0x000fc9, 0x001027, 0x001085,
+ /* d1 */ 0x0010e3, 0x001141, 0x00119f, 0x0011fd,
+ /* d5 */ 0x00125b, 0x0012b9, 0x001317, 0x001375,
+ /* d9 */ 0x0013d3, 0x001431, 0x00148f, 0x0014ed,
+ /* dd */ 0x00154b, 0x0015a9, 0x001607, 0x001665,
+ /* e1 */ 0x0016c3, 0x001721, 0x00177f, 0x0017dd,
+ /* e5 */ 0x00183b, 0x001899, 0x0018f7, 0x001955,
+ /* e9 */ 0x0019b3, 0x001a11, 0x001a6f, 0x001acd,
+ /* ed */ 0x001b2b, 0x001b89, 0x001be7, 0x001c45,
+ /* f1 */ 0x001ca3, 0x001d01, 0x001d5f, 0x001dbd,
+ /* f5 */ 0x001e1b, 0x001e79, 0x001ed7, 0x001f35,
+ /* f9 */ 0x001f93, 0x001ff1, 0x00204f, 0x0020ad,
+ /* fd */ 0x00210b,
+
+ /*** Two byte table, leaf: a1xx - offset 0x000bb ***/
+
+ /* a1 */ 0xe38080, 0xe38081, 0xe38082, 0x00c2b7,
+ /* a5 */ 0xe280a5, 0xe280a6, 0x00c2a8, 0xe38083,
+ /* a9 */ 0x00c2ad, 0xe28095, 0xe288a5, 0xefbcbc,
+ /* ad */ 0xe288bc, 0xe28098, 0xe28099, 0xe2809c,
+ /* b1 */ 0xe2809d, 0xe38094, 0xe38095, 0xe38088,
+ /* b5 */ 0xe38089, 0xe3808a, 0xe3808b, 0xe3808c,
+ /* b9 */ 0xe3808d, 0xe3808e, 0xe3808f, 0xe38090,
+ /* bd */ 0xe38091, 0x00c2b1, 0x00c397, 0x00c3b7,
+ /* c1 */ 0xe289a0, 0xe289a4, 0xe289a5, 0xe2889e,
+ /* c5 */ 0xe288b4, 0x00c2b0, 0xe280b2, 0xe280b3,
+ /* c9 */ 0xe28483, 0xe284ab, 0xefbfa0, 0xefbfa1,
+ /* cd */ 0xefbfa5, 0xe29982, 0xe29980, 0xe288a0,
+ /* d1 */ 0xe28aa5, 0xe28c92, 0xe28882, 0xe28887,
+ /* d5 */ 0xe289a1, 0xe28992, 0x00c2a7, 0xe280bb,
+ /* d9 */ 0xe29886, 0xe29885, 0xe2978b, 0xe2978f,
+ /* dd */ 0xe2978e, 0xe29787, 0xe29786, 0xe296a1,
+ /* e1 */ 0xe296a0, 0xe296b3, 0xe296b2, 0xe296bd,
+ /* e5 */ 0xe296bc, 0xe28692, 0xe28690, 0xe28691,
+ /* e9 */ 0xe28693, 0xe28694, 0xe38093, 0xe289aa,
+ /* ed */ 0xe289ab, 0xe2889a, 0xe288bd, 0xe2889d,
+ /* f1 */ 0xe288b5, 0xe288ab, 0xe288ac, 0xe28888,
+ /* f5 */ 0xe2888b, 0xe28a86, 0xe28a87, 0xe28a82,
+ /* f9 */ 0xe28a83, 0xe288aa, 0xe288a9, 0xe288a7,
+ /* fd */ 0xe288a8, 0xefbfa2,
+
+ /*** Two byte table, leaf: a2xx - offset 0x00119 ***/
+
+ /* a1 */ 0xe28792, 0xe28794, 0xe28880, 0xe28883,
+ /* a5 */ 0x00c2b4, 0xefbd9e, 0x00cb87, 0x00cb98,
+ /* a9 */ 0x00cb9d, 0x00cb9a, 0x00cb99, 0x00c2b8,
+ /* ad */ 0x00cb9b, 0x00c2a1, 0x00c2bf, 0x00cb90,
+ /* b1 */ 0xe288ae, 0xe28891, 0xe2888f, 0x00c2a4,
+ /* b5 */ 0xe28489, 0xe280b0, 0xe29781, 0xe29780,
+ /* b9 */ 0xe296b7, 0xe296b6, 0xe299a4, 0xe299a0,
+ /* bd */ 0xe299a1, 0xe299a5, 0xe299a7, 0xe299a3,
+ /* c1 */ 0xe28a99, 0xe29788, 0xe296a3, 0xe29790,
+ /* c5 */ 0xe29791, 0xe29692, 0xe296a4, 0xe296a5,
+ /* c9 */ 0xe296a8, 0xe296a7, 0xe296a6, 0xe296a9,
+ /* cd */ 0xe299a8, 0xe2988f, 0xe2988e, 0xe2989c,
+ /* d1 */ 0xe2989e, 0x00c2b6, 0xe280a0, 0xe280a1,
+ /* d5 */ 0xe28695, 0xe28697, 0xe28699, 0xe28696,
+ /* d9 */ 0xe28698, 0xe299ad, 0xe299a9, 0xe299aa,
+ /* dd */ 0xe299ac, 0xe389bf, 0xe3889c, 0xe28496,
+ /* e1 */ 0xe38f87, 0xe284a2, 0xe38f82, 0xe38f98,
+ /* e5 */ 0xe284a1, 0xe282ac, 0x00c2ae, 0xe389be,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a3xx - offset 0x00177 ***/
+
+ /* a1 */ 0xefbc81, 0xefbc82, 0xefbc83, 0xefbc84,
+ /* a5 */ 0xefbc85, 0xefbc86, 0xefbc87, 0xefbc88,
+ /* a9 */ 0xefbc89, 0xefbc8a, 0xefbc8b, 0xefbc8c,
+ /* ad */ 0xefbc8d, 0xefbc8e, 0xefbc8f, 0xefbc90,
+ /* b1 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* b5 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* b9 */ 0xefbc99, 0xefbc9a, 0xefbc9b, 0xefbc9c,
+ /* bd */ 0xefbc9d, 0xefbc9e, 0xefbc9f, 0xefbca0,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0xefbcbb, 0xefbfa6,
+ /* dd */ 0xefbcbd, 0xefbcbe, 0xefbcbf, 0xefbd80,
+ /* e1 */ 0xefbd81, 0xefbd82, 0xefbd83, 0xefbd84,
+ /* e5 */ 0xefbd85, 0xefbd86, 0xefbd87, 0xefbd88,
+ /* e9 */ 0xefbd89, 0xefbd8a, 0xefbd8b, 0xefbd8c,
+ /* ed */ 0xefbd8d, 0xefbd8e, 0xefbd8f, 0xefbd90,
+ /* f1 */ 0xefbd91, 0xefbd92, 0xefbd93, 0xefbd94,
+ /* f5 */ 0xefbd95, 0xefbd96, 0xefbd97, 0xefbd98,
+ /* f9 */ 0xefbd99, 0xefbd9a, 0xefbd9b, 0xefbd9c,
+ /* fd */ 0xefbd9d, 0xefbfa3,
+
+ /*** Two byte table, leaf: a4xx - offset 0x001d5 ***/
+
+ /* a1 */ 0xe384b1, 0xe384b2, 0xe384b3, 0xe384b4,
+ /* a5 */ 0xe384b5, 0xe384b6, 0xe384b7, 0xe384b8,
+ /* a9 */ 0xe384b9, 0xe384ba, 0xe384bb, 0xe384bc,
+ /* ad */ 0xe384bd, 0xe384be, 0xe384bf, 0xe38580,
+ /* b1 */ 0xe38581, 0xe38582, 0xe38583, 0xe38584,
+ /* b5 */ 0xe38585, 0xe38586, 0xe38587, 0xe38588,
+ /* b9 */ 0xe38589, 0xe3858a, 0xe3858b, 0xe3858c,
+ /* bd */ 0xe3858d, 0xe3858e, 0xe3858f, 0xe38590,
+ /* c1 */ 0xe38591, 0xe38592, 0xe38593, 0xe38594,
+ /* c5 */ 0xe38595, 0xe38596, 0xe38597, 0xe38598,
+ /* c9 */ 0xe38599, 0xe3859a, 0xe3859b, 0xe3859c,
+ /* cd */ 0xe3859d, 0xe3859e, 0xe3859f, 0xe385a0,
+ /* d1 */ 0xe385a1, 0xe385a2, 0xe385a3, 0xe385a4,
+ /* d5 */ 0xe385a5, 0xe385a6, 0xe385a7, 0xe385a8,
+ /* d9 */ 0xe385a9, 0xe385aa, 0xe385ab, 0xe385ac,
+ /* dd */ 0xe385ad, 0xe385ae, 0xe385af, 0xe385b0,
+ /* e1 */ 0xe385b1, 0xe385b2, 0xe385b3, 0xe385b4,
+ /* e5 */ 0xe385b5, 0xe385b6, 0xe385b7, 0xe385b8,
+ /* e9 */ 0xe385b9, 0xe385ba, 0xe385bb, 0xe385bc,
+ /* ed */ 0xe385bd, 0xe385be, 0xe385bf, 0xe38680,
+ /* f1 */ 0xe38681, 0xe38682, 0xe38683, 0xe38684,
+ /* f5 */ 0xe38685, 0xe38686, 0xe38687, 0xe38688,
+ /* f9 */ 0xe38689, 0xe3868a, 0xe3868b, 0xe3868c,
+ /* fd */ 0xe3868d, 0xe3868e,
+
+ /*** Two byte table, leaf: a5xx - offset 0x00233 ***/
+
+ /* a1 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* a5 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* a9 */ 0xe285b8, 0xe285b9, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0xe285a0,
+ /* b1 */ 0xe285a1, 0xe285a2, 0xe285a3, 0xe285a4,
+ /* b5 */ 0xe285a5, 0xe285a6, 0xe285a7, 0xe285a8,
+ /* b9 */ 0xe285a9, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* c5 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* c9 */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* cd */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* d1 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* d5 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* e5 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* e9 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* ed */ 0x00cebd, 0x00cebe, 0x00cebf, 0x00cf80,
+ /* f1 */ 0x00cf81, 0x00cf83, 0x00cf84, 0x00cf85,
+ /* f5 */ 0x00cf86, 0x00cf87, 0x00cf88, 0x00cf89,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x00291 ***/
+
+ /* a1 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* a5 */ 0xe29498, 0xe29494, 0xe2949c, 0xe294ac,
+ /* a9 */ 0xe294a4, 0xe294b4, 0xe294bc, 0xe29481,
+ /* ad */ 0xe29483, 0xe2948f, 0xe29493, 0xe2949b,
+ /* b1 */ 0xe29497, 0xe294a3, 0xe294b3, 0xe294ab,
+ /* b5 */ 0xe294bb, 0xe2958b, 0xe294a0, 0xe294af,
+ /* b9 */ 0xe294a8, 0xe294b7, 0xe294bf, 0xe2949d,
+ /* bd */ 0xe294b0, 0xe294a5, 0xe294b8, 0xe29582,
+ /* c1 */ 0xe29492, 0xe29491, 0xe2949a, 0xe29499,
+ /* c5 */ 0xe29496, 0xe29495, 0xe2948e, 0xe2948d,
+ /* c9 */ 0xe2949e, 0xe2949f, 0xe294a1, 0xe294a2,
+ /* cd */ 0xe294a6, 0xe294a7, 0xe294a9, 0xe294aa,
+ /* d1 */ 0xe294ad, 0xe294ae, 0xe294b1, 0xe294b2,
+ /* d5 */ 0xe294b5, 0xe294b6, 0xe294b9, 0xe294ba,
+ /* d9 */ 0xe294bd, 0xe294be, 0xe29580, 0xe29581,
+ /* dd */ 0xe29583, 0xe29584, 0xe29585, 0xe29586,
+ /* e1 */ 0xe29587, 0xe29588, 0xe29589, 0xe2958a,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a7xx - offset 0x002ef ***/
+
+ /* a1 */ 0xe38e95, 0xe38e96, 0xe38e97, 0xe28493,
+ /* a5 */ 0xe38e98, 0xe38f84, 0xe38ea3, 0xe38ea4,
+ /* a9 */ 0xe38ea5, 0xe38ea6, 0xe38e99, 0xe38e9a,
+ /* ad */ 0xe38e9b, 0xe38e9c, 0xe38e9d, 0xe38e9e,
+ /* b1 */ 0xe38e9f, 0xe38ea0, 0xe38ea1, 0xe38ea2,
+ /* b5 */ 0xe38f8a, 0xe38e8d, 0xe38e8e, 0xe38e8f,
+ /* b9 */ 0xe38f8f, 0xe38e88, 0xe38e89, 0xe38f88,
+ /* bd */ 0xe38ea7, 0xe38ea8, 0xe38eb0, 0xe38eb1,
+ /* c1 */ 0xe38eb2, 0xe38eb3, 0xe38eb4, 0xe38eb5,
+ /* c5 */ 0xe38eb6, 0xe38eb7, 0xe38eb8, 0xe38eb9,
+ /* c9 */ 0xe38e80, 0xe38e81, 0xe38e82, 0xe38e83,
+ /* cd */ 0xe38e84, 0xe38eba, 0xe38ebb, 0xe38ebc,
+ /* d1 */ 0xe38ebd, 0xe38ebe, 0xe38ebf, 0xe38e90,
+ /* d5 */ 0xe38e91, 0xe38e92, 0xe38e93, 0xe38e94,
+ /* d9 */ 0xe284a6, 0xe38f80, 0xe38f81, 0xe38e8a,
+ /* dd */ 0xe38e8b, 0xe38e8c, 0xe38f96, 0xe38f85,
+ /* e1 */ 0xe38ead, 0xe38eae, 0xe38eaf, 0xe38f9b,
+ /* e5 */ 0xe38ea9, 0xe38eaa, 0xe38eab, 0xe38eac,
+ /* e9 */ 0xe38f9d, 0xe38f90, 0xe38f93, 0xe38f83,
+ /* ed */ 0xe38f89, 0xe38f9c, 0xe38f86, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a8xx - offset 0x0034d ***/
+
+ /* a1 */ 0x00c386, 0x00c390, 0x00c2aa, 0x00c4a6,
+ /* a5 */ 0x000000, 0x00c4b2, 0x000000, 0x00c4bf,
+ /* a9 */ 0x00c581, 0x00c398, 0x00c592, 0x00c2ba,
+ /* ad */ 0x00c39e, 0x00c5a6, 0x00c58a, 0x000000,
+ /* b1 */ 0xe389a0, 0xe389a1, 0xe389a2, 0xe389a3,
+ /* b5 */ 0xe389a4, 0xe389a5, 0xe389a6, 0xe389a7,
+ /* b9 */ 0xe389a8, 0xe389a9, 0xe389aa, 0xe389ab,
+ /* bd */ 0xe389ac, 0xe389ad, 0xe389ae, 0xe389af,
+ /* c1 */ 0xe389b0, 0xe389b1, 0xe389b2, 0xe389b3,
+ /* c5 */ 0xe389b4, 0xe389b5, 0xe389b6, 0xe389b7,
+ /* c9 */ 0xe389b8, 0xe389b9, 0xe389ba, 0xe389bb,
+ /* cd */ 0xe29390, 0xe29391, 0xe29392, 0xe29393,
+ /* d1 */ 0xe29394, 0xe29395, 0xe29396, 0xe29397,
+ /* d5 */ 0xe29398, 0xe29399, 0xe2939a, 0xe2939b,
+ /* d9 */ 0xe2939c, 0xe2939d, 0xe2939e, 0xe2939f,
+ /* dd */ 0xe293a0, 0xe293a1, 0xe293a2, 0xe293a3,
+ /* e1 */ 0xe293a4, 0xe293a5, 0xe293a6, 0xe293a7,
+ /* e5 */ 0xe293a8, 0xe293a9, 0xe291a0, 0xe291a1,
+ /* e9 */ 0xe291a2, 0xe291a3, 0xe291a4, 0xe291a5,
+ /* ed */ 0xe291a6, 0xe291a7, 0xe291a8, 0xe291a9,
+ /* f1 */ 0xe291aa, 0xe291ab, 0xe291ac, 0xe291ad,
+ /* f5 */ 0xe291ae, 0x00c2bd, 0xe28593, 0xe28594,
+ /* f9 */ 0x00c2bc, 0x00c2be, 0xe2859b, 0xe2859c,
+ /* fd */ 0xe2859d, 0xe2859e,
+
+ /*** Two byte table, leaf: a9xx - offset 0x003ab ***/
+
+ /* a1 */ 0x00c3a6, 0x00c491, 0x00c3b0, 0x00c4a7,
+ /* a5 */ 0x00c4b1, 0x00c4b3, 0x00c4b8, 0x00c580,
+ /* a9 */ 0x00c582, 0x00c3b8, 0x00c593, 0x00c39f,
+ /* ad */ 0x00c3be, 0x00c5a7, 0x00c58b, 0x00c589,
+ /* b1 */ 0xe38880, 0xe38881, 0xe38882, 0xe38883,
+ /* b5 */ 0xe38884, 0xe38885, 0xe38886, 0xe38887,
+ /* b9 */ 0xe38888, 0xe38889, 0xe3888a, 0xe3888b,
+ /* bd */ 0xe3888c, 0xe3888d, 0xe3888e, 0xe3888f,
+ /* c1 */ 0xe38890, 0xe38891, 0xe38892, 0xe38893,
+ /* c5 */ 0xe38894, 0xe38895, 0xe38896, 0xe38897,
+ /* c9 */ 0xe38898, 0xe38899, 0xe3889a, 0xe3889b,
+ /* cd */ 0xe2929c, 0xe2929d, 0xe2929e, 0xe2929f,
+ /* d1 */ 0xe292a0, 0xe292a1, 0xe292a2, 0xe292a3,
+ /* d5 */ 0xe292a4, 0xe292a5, 0xe292a6, 0xe292a7,
+ /* d9 */ 0xe292a8, 0xe292a9, 0xe292aa, 0xe292ab,
+ /* dd */ 0xe292ac, 0xe292ad, 0xe292ae, 0xe292af,
+ /* e1 */ 0xe292b0, 0xe292b1, 0xe292b2, 0xe292b3,
+ /* e5 */ 0xe292b4, 0xe292b5, 0xe291b4, 0xe291b5,
+ /* e9 */ 0xe291b6, 0xe291b7, 0xe291b8, 0xe291b9,
+ /* ed */ 0xe291ba, 0xe291bb, 0xe291bc, 0xe291bd,
+ /* f1 */ 0xe291be, 0xe291bf, 0xe29280, 0xe29281,
+ /* f5 */ 0xe29282, 0x00c2b9, 0x00c2b2, 0x00c2b3,
+ /* f9 */ 0xe281b4, 0xe281bf, 0xe28281, 0xe28282,
+ /* fd */ 0xe28283, 0xe28284,
+
+ /*** Two byte table, leaf: aaxx - offset 0x00409 ***/
+
+ /* a1 */ 0xe38181, 0xe38182, 0xe38183, 0xe38184,
+ /* a5 */ 0xe38185, 0xe38186, 0xe38187, 0xe38188,
+ /* a9 */ 0xe38189, 0xe3818a, 0xe3818b, 0xe3818c,
+ /* ad */ 0xe3818d, 0xe3818e, 0xe3818f, 0xe38190,
+ /* b1 */ 0xe38191, 0xe38192, 0xe38193, 0xe38194,
+ /* b5 */ 0xe38195, 0xe38196, 0xe38197, 0xe38198,
+ /* b9 */ 0xe38199, 0xe3819a, 0xe3819b, 0xe3819c,
+ /* bd */ 0xe3819d, 0xe3819e, 0xe3819f, 0xe381a0,
+ /* c1 */ 0xe381a1, 0xe381a2, 0xe381a3, 0xe381a4,
+ /* c5 */ 0xe381a5, 0xe381a6, 0xe381a7, 0xe381a8,
+ /* c9 */ 0xe381a9, 0xe381aa, 0xe381ab, 0xe381ac,
+ /* cd */ 0xe381ad, 0xe381ae, 0xe381af, 0xe381b0,
+ /* d1 */ 0xe381b1, 0xe381b2, 0xe381b3, 0xe381b4,
+ /* d5 */ 0xe381b5, 0xe381b6, 0xe381b7, 0xe381b8,
+ /* d9 */ 0xe381b9, 0xe381ba, 0xe381bb, 0xe381bc,
+ /* dd */ 0xe381bd, 0xe381be, 0xe381bf, 0xe38280,
+ /* e1 */ 0xe38281, 0xe38282, 0xe38283, 0xe38284,
+ /* e5 */ 0xe38285, 0xe38286, 0xe38287, 0xe38288,
+ /* e9 */ 0xe38289, 0xe3828a, 0xe3828b, 0xe3828c,
+ /* ed */ 0xe3828d, 0xe3828e, 0xe3828f, 0xe38290,
+ /* f1 */ 0xe38291, 0xe38292, 0xe38293, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: abxx - offset 0x00467 ***/
+
+ /* a1 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* a5 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* a9 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* ad */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* b1 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* b5 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* b9 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* bd */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* c1 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* c5 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* c9 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* cd */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* d1 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* d5 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* d9 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* dd */ 0xe3839d, 0xe3839e, 0xe3839f, 0xe383a0,
+ /* e1 */ 0xe383a1, 0xe383a2, 0xe383a3, 0xe383a4,
+ /* e5 */ 0xe383a5, 0xe383a6, 0xe383a7, 0xe383a8,
+ /* e9 */ 0xe383a9, 0xe383aa, 0xe383ab, 0xe383ac,
+ /* ed */ 0xe383ad, 0xe383ae, 0xe383af, 0xe383b0,
+ /* f1 */ 0xe383b1, 0xe383b2, 0xe383b3, 0xe383b4,
+ /* f5 */ 0xe383b5, 0xe383b6, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: acxx - offset 0x004c5 ***/
+
+ /* a1 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* a5 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* a9 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* ad */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* b1 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* b5 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* b9 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* bd */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* c1 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d5 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d9 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* dd */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* e1 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* e5 */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e9 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* ed */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* f1 */ 0x00d18f, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: b0xx - offset 0x00523 ***/
+
+ /* a1 */ 0xeab080, 0xeab081, 0xeab084, 0xeab087,
+ /* a5 */ 0xeab088, 0xeab089, 0xeab08a, 0xeab090,
+ /* a9 */ 0xeab091, 0xeab092, 0xeab093, 0xeab094,
+ /* ad */ 0xeab095, 0xeab096, 0xeab097, 0xeab099,
+ /* b1 */ 0xeab09a, 0xeab09b, 0xeab09c, 0xeab09d,
+ /* b5 */ 0xeab0a0, 0xeab0a4, 0xeab0ac, 0xeab0ad,
+ /* b9 */ 0xeab0af, 0xeab0b0, 0xeab0b1, 0xeab0b8,
+ /* bd */ 0xeab0b9, 0xeab0bc, 0xeab180, 0xeab18b,
+ /* c1 */ 0xeab18d, 0xeab194, 0xeab198, 0xeab19c,
+ /* c5 */ 0xeab1b0, 0xeab1b1, 0xeab1b4, 0xeab1b7,
+ /* c9 */ 0xeab1b8, 0xeab1ba, 0xeab280, 0xeab281,
+ /* cd */ 0xeab283, 0xeab284, 0xeab285, 0xeab286,
+ /* d1 */ 0xeab289, 0xeab28a, 0xeab28b, 0xeab28c,
+ /* d5 */ 0xeab290, 0xeab294, 0xeab29c, 0xeab29d,
+ /* d9 */ 0xeab29f, 0xeab2a0, 0xeab2a1, 0xeab2a8,
+ /* dd */ 0xeab2a9, 0xeab2aa, 0xeab2ac, 0xeab2af,
+ /* e1 */ 0xeab2b0, 0xeab2b8, 0xeab2b9, 0xeab2bb,
+ /* e5 */ 0xeab2bc, 0xeab2bd, 0xeab381, 0xeab384,
+ /* e9 */ 0xeab388, 0xeab38c, 0xeab395, 0xeab397,
+ /* ed */ 0xeab3a0, 0xeab3a1, 0xeab3a4, 0xeab3a7,
+ /* f1 */ 0xeab3a8, 0xeab3aa, 0xeab3ac, 0xeab3af,
+ /* f5 */ 0xeab3b0, 0xeab3b1, 0xeab3b3, 0xeab3b5,
+ /* f9 */ 0xeab3b6, 0xeab3bc, 0xeab3bd, 0xeab480,
+ /* fd */ 0xeab484, 0xeab486,
+
+ /*** Two byte table, leaf: b1xx - offset 0x00581 ***/
+
+ /* a1 */ 0xeab48c, 0xeab48d, 0xeab48f, 0xeab491,
+ /* a5 */ 0xeab498, 0xeab49c, 0xeab4a0, 0xeab4a9,
+ /* a9 */ 0xeab4ac, 0xeab4ad, 0xeab4b4, 0xeab4b5,
+ /* ad */ 0xeab4b8, 0xeab4bc, 0xeab584, 0xeab585,
+ /* b1 */ 0xeab587, 0xeab589, 0xeab590, 0xeab594,
+ /* b5 */ 0xeab598, 0xeab5a1, 0xeab5a3, 0xeab5ac,
+ /* b9 */ 0xeab5ad, 0xeab5b0, 0xeab5b3, 0xeab5b4,
+ /* bd */ 0xeab5b5, 0xeab5b6, 0xeab5bb, 0xeab5bc,
+ /* c1 */ 0xeab5bd, 0xeab5bf, 0xeab681, 0xeab682,
+ /* c5 */ 0xeab688, 0xeab689, 0xeab68c, 0xeab690,
+ /* c9 */ 0xeab69c, 0xeab69d, 0xeab6a4, 0xeab6b7,
+ /* cd */ 0xeab780, 0xeab781, 0xeab784, 0xeab788,
+ /* d1 */ 0xeab790, 0xeab791, 0xeab793, 0xeab79c,
+ /* d5 */ 0xeab7a0, 0xeab7a4, 0xeab7b8, 0xeab7b9,
+ /* d9 */ 0xeab7bc, 0xeab7bf, 0xeab880, 0xeab881,
+ /* dd */ 0xeab888, 0xeab889, 0xeab88b, 0xeab88d,
+ /* e1 */ 0xeab894, 0xeab8b0, 0xeab8b1, 0xeab8b4,
+ /* e5 */ 0xeab8b7, 0xeab8b8, 0xeab8ba, 0xeab980,
+ /* e9 */ 0xeab981, 0xeab983, 0xeab985, 0xeab986,
+ /* ed */ 0xeab98a, 0xeab98c, 0xeab98d, 0xeab98e,
+ /* f1 */ 0xeab990, 0xeab994, 0xeab996, 0xeab99c,
+ /* f5 */ 0xeab99d, 0xeab99f, 0xeab9a0, 0xeab9a1,
+ /* f9 */ 0xeab9a5, 0xeab9a8, 0xeab9a9, 0xeab9ac,
+ /* fd */ 0xeab9b0, 0xeab9b8,
+
+ /*** Two byte table, leaf: b2xx - offset 0x005df ***/
+
+ /* a1 */ 0xeab9b9, 0xeab9bb, 0xeab9bc, 0xeab9bd,
+ /* a5 */ 0xeaba84, 0xeaba85, 0xeaba8c, 0xeababc,
+ /* a9 */ 0xeababd, 0xeababe, 0xeabb80, 0xeabb84,
+ /* ad */ 0xeabb8c, 0xeabb8d, 0xeabb8f, 0xeabb90,
+ /* b1 */ 0xeabb91, 0xeabb98, 0xeabb99, 0xeabb9c,
+ /* b5 */ 0xeabba8, 0xeabbab, 0xeabbad, 0xeabbb4,
+ /* b9 */ 0xeabbb8, 0xeabbbc, 0xeabc87, 0xeabc88,
+ /* bd */ 0xeabc8d, 0xeabc90, 0xeabcac, 0xeabcad,
+ /* c1 */ 0xeabcb0, 0xeabcb2, 0xeabcb4, 0xeabcbc,
+ /* c5 */ 0xeabcbd, 0xeabcbf, 0xeabd81, 0xeabd82,
+ /* c9 */ 0xeabd83, 0xeabd88, 0xeabd89, 0xeabd90,
+ /* cd */ 0xeabd9c, 0xeabd9d, 0xeabda4, 0xeabda5,
+ /* d1 */ 0xeabdb9, 0xeabe80, 0xeabe84, 0xeabe88,
+ /* d5 */ 0xeabe90, 0xeabe91, 0xeabe95, 0xeabe9c,
+ /* d9 */ 0xeabeb8, 0xeabeb9, 0xeabebc, 0xeabf80,
+ /* dd */ 0xeabf87, 0xeabf88, 0xeabf89, 0xeabf8b,
+ /* e1 */ 0xeabf8d, 0xeabf8e, 0xeabf94, 0xeabf9c,
+ /* e5 */ 0xeabfa8, 0xeabfa9, 0xeabfb0, 0xeabfb1,
+ /* e9 */ 0xeabfb4, 0xeabfb8, 0xeb8080, 0xeb8081,
+ /* ed */ 0xeb8084, 0xeb808c, 0xeb8090, 0xeb8094,
+ /* f1 */ 0xeb809c, 0xeb809d, 0xeb80a8, 0xeb8184,
+ /* f5 */ 0xeb8185, 0xeb8188, 0xeb818a, 0xeb818c,
+ /* f9 */ 0xeb818e, 0xeb8193, 0xeb8194, 0xeb8195,
+ /* fd */ 0xeb8197, 0xeb8199,
+
+ /*** Two byte table, leaf: b3xx - offset 0x0063d ***/
+
+ /* a1 */ 0xeb819d, 0xeb81bc, 0xeb81bd, 0xeb8280,
+ /* a5 */ 0xeb8284, 0xeb828c, 0xeb828d, 0xeb828f,
+ /* a9 */ 0xeb8291, 0xeb8298, 0xeb8299, 0xeb829a,
+ /* ad */ 0xeb829c, 0xeb829f, 0xeb82a0, 0xeb82a1,
+ /* b1 */ 0xeb82a2, 0xeb82a8, 0xeb82a9, 0xeb82ab,
+ /* b5 */ 0xeb82ac, 0xeb82ad, 0xeb82ae, 0xeb82af,
+ /* b9 */ 0xeb82b1, 0xeb82b3, 0xeb82b4, 0xeb82b5,
+ /* bd */ 0xeb82b8, 0xeb82bc, 0xeb8384, 0xeb8385,
+ /* c1 */ 0xeb8387, 0xeb8388, 0xeb8389, 0xeb8390,
+ /* c5 */ 0xeb8391, 0xeb8394, 0xeb8398, 0xeb83a0,
+ /* c9 */ 0xeb83a5, 0xeb8488, 0xeb8489, 0xeb848b,
+ /* cd */ 0xeb848c, 0xeb8490, 0xeb8492, 0xeb8493,
+ /* d1 */ 0xeb8498, 0xeb8499, 0xeb849b, 0xeb849c,
+ /* d5 */ 0xeb849d, 0xeb84a3, 0xeb84a4, 0xeb84a5,
+ /* d9 */ 0xeb84a8, 0xeb84ac, 0xeb84b4, 0xeb84b5,
+ /* dd */ 0xeb84b7, 0xeb84b8, 0xeb84b9, 0xeb8580,
+ /* e1 */ 0xeb8581, 0xeb8584, 0xeb8588, 0xeb8590,
+ /* e5 */ 0xeb8591, 0xeb8594, 0xeb8595, 0xeb8598,
+ /* e9 */ 0xeb859c, 0xeb85a0, 0xeb85b8, 0xeb85b9,
+ /* ed */ 0xeb85bc, 0xeb8680, 0xeb8682, 0xeb8688,
+ /* f1 */ 0xeb8689, 0xeb868b, 0xeb868d, 0xeb8692,
+ /* f5 */ 0xeb8693, 0xeb8694, 0xeb8698, 0xeb869c,
+ /* f9 */ 0xeb86a8, 0xeb878c, 0xeb8790, 0xeb8794,
+ /* fd */ 0xeb879c, 0xeb879d,
+
+ /*** Two byte table, leaf: b4xx - offset 0x0069b ***/
+
+ /* a1 */ 0xeb879f, 0xeb87a8, 0xeb87a9, 0xeb87ac,
+ /* a5 */ 0xeb87b0, 0xeb87b9, 0xeb87bb, 0xeb87bd,
+ /* a9 */ 0xeb8884, 0xeb8885, 0xeb8888, 0xeb888b,
+ /* ad */ 0xeb888c, 0xeb8894, 0xeb8895, 0xeb8897,
+ /* b1 */ 0xeb8899, 0xeb88a0, 0xeb88b4, 0xeb88bc,
+ /* b5 */ 0xeb8998, 0xeb899c, 0xeb89a0, 0xeb89a8,
+ /* b9 */ 0xeb89a9, 0xeb89b4, 0xeb89b5, 0xeb89bc,
+ /* bd */ 0xeb8a84, 0xeb8a85, 0xeb8a89, 0xeb8a90,
+ /* c1 */ 0xeb8a91, 0xeb8a94, 0xeb8a98, 0xeb8a99,
+ /* c5 */ 0xeb8a9a, 0xeb8aa0, 0xeb8aa1, 0xeb8aa3,
+ /* c9 */ 0xeb8aa5, 0xeb8aa6, 0xeb8aaa, 0xeb8aac,
+ /* cd */ 0xeb8ab0, 0xeb8ab4, 0xeb8b88, 0xeb8b89,
+ /* d1 */ 0xeb8b8c, 0xeb8b90, 0xeb8b92, 0xeb8b98,
+ /* d5 */ 0xeb8b99, 0xeb8b9b, 0xeb8b9d, 0xeb8ba2,
+ /* d9 */ 0xeb8ba4, 0xeb8ba5, 0xeb8ba6, 0xeb8ba8,
+ /* dd */ 0xeb8bab, 0xeb8bac, 0xeb8bad, 0xeb8bae,
+ /* e1 */ 0xeb8baf, 0xeb8bb3, 0xeb8bb4, 0xeb8bb5,
+ /* e5 */ 0xeb8bb7, 0xeb8bb8, 0xeb8bb9, 0xeb8bba,
+ /* e9 */ 0xeb8bbb, 0xeb8bbf, 0xeb8c80, 0xeb8c81,
+ /* ed */ 0xeb8c84, 0xeb8c88, 0xeb8c90, 0xeb8c91,
+ /* f1 */ 0xeb8c93, 0xeb8c94, 0xeb8c95, 0xeb8c9c,
+ /* f5 */ 0xeb8d94, 0xeb8d95, 0xeb8d96, 0xeb8d98,
+ /* f9 */ 0xeb8d9b, 0xeb8d9c, 0xeb8d9e, 0xeb8d9f,
+ /* fd */ 0xeb8da4, 0xeb8da5,
+
+ /*** Two byte table, leaf: b5xx - offset 0x006f9 ***/
+
+ /* a1 */ 0xeb8da7, 0xeb8da9, 0xeb8dab, 0xeb8dae,
+ /* a5 */ 0xeb8db0, 0xeb8db1, 0xeb8db4, 0xeb8db8,
+ /* a9 */ 0xeb8e80, 0xeb8e81, 0xeb8e83, 0xeb8e84,
+ /* ad */ 0xeb8e85, 0xeb8e8c, 0xeb8e90, 0xeb8e94,
+ /* b1 */ 0xeb8ea0, 0xeb8ea1, 0xeb8ea8, 0xeb8eac,
+ /* b5 */ 0xeb8f84, 0xeb8f85, 0xeb8f88, 0xeb8f8b,
+ /* b9 */ 0xeb8f8c, 0xeb8f8e, 0xeb8f90, 0xeb8f94,
+ /* bd */ 0xeb8f95, 0xeb8f97, 0xeb8f99, 0xeb8f9b,
+ /* c1 */ 0xeb8f9d, 0xeb8fa0, 0xeb8fa4, 0xeb8fa8,
+ /* c5 */ 0xeb8fbc, 0xeb9090, 0xeb9098, 0xeb909c,
+ /* c9 */ 0xeb90a0, 0xeb90a8, 0xeb90a9, 0xeb90ab,
+ /* cd */ 0xeb90b4, 0xeb9190, 0xeb9191, 0xeb9194,
+ /* d1 */ 0xeb9198, 0xeb91a0, 0xeb91a1, 0xeb91a3,
+ /* d5 */ 0xeb91a5, 0xeb91ac, 0xeb9280, 0xeb9288,
+ /* d9 */ 0xeb929d, 0xeb92a4, 0xeb92a8, 0xeb92ac,
+ /* dd */ 0xeb92b5, 0xeb92b7, 0xeb92b9, 0xeb9380,
+ /* e1 */ 0xeb9384, 0xeb9388, 0xeb9390, 0xeb9395,
+ /* e5 */ 0xeb939c, 0xeb939d, 0xeb93a0, 0xeb93a3,
+ /* e9 */ 0xeb93a4, 0xeb93a6, 0xeb93ac, 0xeb93ad,
+ /* ed */ 0xeb93af, 0xeb93b1, 0xeb93b8, 0xeb9494,
+ /* f1 */ 0xeb9495, 0xeb9498, 0xeb949b, 0xeb949c,
+ /* f5 */ 0xeb94a4, 0xeb94a5, 0xeb94a7, 0xeb94a8,
+ /* f9 */ 0xeb94a9, 0xeb94aa, 0xeb94b0, 0xeb94b1,
+ /* fd */ 0xeb94b4, 0xeb94b8,
+
+ /*** Two byte table, leaf: b6xx - offset 0x00757 ***/
+
+ /* a1 */ 0xeb9580, 0xeb9581, 0xeb9583, 0xeb9584,
+ /* a5 */ 0xeb9585, 0xeb958b, 0xeb958c, 0xeb958d,
+ /* a9 */ 0xeb9590, 0xeb9594, 0xeb959c, 0xeb959d,
+ /* ad */ 0xeb959f, 0xeb95a0, 0xeb95a1, 0xeb96a0,
+ /* b1 */ 0xeb96a1, 0xeb96a4, 0xeb96a8, 0xeb96aa,
+ /* b5 */ 0xeb96ab, 0xeb96b0, 0xeb96b1, 0xeb96b3,
+ /* b9 */ 0xeb96b4, 0xeb96b5, 0xeb96bb, 0xeb96bc,
+ /* bd */ 0xeb96bd, 0xeb9780, 0xeb9784, 0xeb978c,
+ /* c1 */ 0xeb978d, 0xeb978f, 0xeb9790, 0xeb9791,
+ /* c5 */ 0xeb9798, 0xeb97ac, 0xeb9890, 0xeb9891,
+ /* c9 */ 0xeb9894, 0xeb9898, 0xeb98a5, 0xeb98ac,
+ /* cd */ 0xeb98b4, 0xeb9988, 0xeb99a4, 0xeb99a8,
+ /* d1 */ 0xeb9a9c, 0xeb9a9d, 0xeb9aa0, 0xeb9aa4,
+ /* d5 */ 0xeb9aab, 0xeb9aac, 0xeb9ab1, 0xeb9b94,
+ /* d9 */ 0xeb9bb0, 0xeb9bb4, 0xeb9bb8, 0xeb9c80,
+ /* dd */ 0xeb9c81, 0xeb9c85, 0xeb9ca8, 0xeb9ca9,
+ /* e1 */ 0xeb9cac, 0xeb9caf, 0xeb9cb0, 0xeb9cb8,
+ /* e5 */ 0xeb9cb9, 0xeb9cbb, 0xeb9d84, 0xeb9d88,
+ /* e9 */ 0xeb9d8c, 0xeb9d94, 0xeb9d95, 0xeb9da0,
+ /* ed */ 0xeb9da4, 0xeb9da8, 0xeb9db0, 0xeb9db1,
+ /* f1 */ 0xeb9db3, 0xeb9db5, 0xeb9dbc, 0xeb9dbd,
+ /* f5 */ 0xeb9e80, 0xeb9e84, 0xeb9e8c, 0xeb9e8d,
+ /* f9 */ 0xeb9e8f, 0xeb9e90, 0xeb9e91, 0xeb9e92,
+ /* fd */ 0xeb9e96, 0xeb9e97,
+
+ /*** Two byte table, leaf: b7xx - offset 0x007b5 ***/
+
+ /* a1 */ 0xeb9e98, 0xeb9e99, 0xeb9e9c, 0xeb9ea0,
+ /* a5 */ 0xeb9ea8, 0xeb9ea9, 0xeb9eab, 0xeb9eac,
+ /* a9 */ 0xeb9ead, 0xeb9eb4, 0xeb9eb5, 0xeb9eb8,
+ /* ad */ 0xeb9f87, 0xeb9f89, 0xeb9fac, 0xeb9fad,
+ /* b1 */ 0xeb9fb0, 0xeb9fb4, 0xeb9fbc, 0xeb9fbd,
+ /* b5 */ 0xeb9fbf, 0xeba080, 0xeba081, 0xeba087,
+ /* b9 */ 0xeba088, 0xeba089, 0xeba08c, 0xeba090,
+ /* bd */ 0xeba098, 0xeba099, 0xeba09b, 0xeba09d,
+ /* c1 */ 0xeba0a4, 0xeba0a5, 0xeba0a8, 0xeba0ac,
+ /* c5 */ 0xeba0b4, 0xeba0b5, 0xeba0b7, 0xeba0b8,
+ /* c9 */ 0xeba0b9, 0xeba180, 0xeba184, 0xeba191,
+ /* cd */ 0xeba193, 0xeba19c, 0xeba19d, 0xeba1a0,
+ /* d1 */ 0xeba1a4, 0xeba1ac, 0xeba1ad, 0xeba1af,
+ /* d5 */ 0xeba1b1, 0xeba1b8, 0xeba1bc, 0xeba28d,
+ /* d9 */ 0xeba2a8, 0xeba2b0, 0xeba2b4, 0xeba2b8,
+ /* dd */ 0xeba380, 0xeba381, 0xeba383, 0xeba385,
+ /* e1 */ 0xeba38c, 0xeba390, 0xeba394, 0xeba39d,
+ /* e5 */ 0xeba39f, 0xeba3a1, 0xeba3a8, 0xeba3a9,
+ /* e9 */ 0xeba3ac, 0xeba3b0, 0xeba3b8, 0xeba3b9,
+ /* ed */ 0xeba3bb, 0xeba3bd, 0xeba484, 0xeba498,
+ /* f1 */ 0xeba4a0, 0xeba4bc, 0xeba4bd, 0xeba580,
+ /* f5 */ 0xeba584, 0xeba58c, 0xeba58f, 0xeba591,
+ /* f9 */ 0xeba598, 0xeba599, 0xeba59c, 0xeba5a0,
+ /* fd */ 0xeba5a8, 0xeba5a9,
+
+ /*** Two byte table, leaf: b8xx - offset 0x00813 ***/
+
+ /* a1 */ 0xeba5ab, 0xeba5ad, 0xeba5b4, 0xeba5b5,
+ /* a5 */ 0xeba5b8, 0xeba5bc, 0xeba684, 0xeba685,
+ /* a9 */ 0xeba687, 0xeba689, 0xeba68a, 0xeba68d,
+ /* ad */ 0xeba68e, 0xeba6ac, 0xeba6ad, 0xeba6b0,
+ /* b1 */ 0xeba6b4, 0xeba6bc, 0xeba6bd, 0xeba6bf,
+ /* b5 */ 0xeba781, 0xeba788, 0xeba789, 0xeba78c,
+ /* b9 */ 0xeba78e, 0xeba78f, 0xeba790, 0xeba791,
+ /* bd */ 0xeba792, 0xeba798, 0xeba799, 0xeba79b,
+ /* c1 */ 0xeba79d, 0xeba79e, 0xeba7a1, 0xeba7a3,
+ /* c5 */ 0xeba7a4, 0xeba7a5, 0xeba7a8, 0xeba7ac,
+ /* c9 */ 0xeba7b4, 0xeba7b5, 0xeba7b7, 0xeba7b8,
+ /* cd */ 0xeba7b9, 0xeba7ba, 0xeba880, 0xeba881,
+ /* d1 */ 0xeba888, 0xeba895, 0xeba8b8, 0xeba8b9,
+ /* d5 */ 0xeba8bc, 0xeba980, 0xeba982, 0xeba988,
+ /* d9 */ 0xeba989, 0xeba98b, 0xeba98d, 0xeba98e,
+ /* dd */ 0xeba993, 0xeba994, 0xeba995, 0xeba998,
+ /* e1 */ 0xeba99c, 0xeba9a4, 0xeba9a5, 0xeba9a7,
+ /* e5 */ 0xeba9a8, 0xeba9a9, 0xeba9b0, 0xeba9b1,
+ /* e9 */ 0xeba9b4, 0xeba9b8, 0xebaa83, 0xebaa84,
+ /* ed */ 0xebaa85, 0xebaa87, 0xebaa8c, 0xebaaa8,
+ /* f1 */ 0xebaaa9, 0xebaaab, 0xebaaac, 0xebaab0,
+ /* f5 */ 0xebaab2, 0xebaab8, 0xebaab9, 0xebaabb,
+ /* f9 */ 0xebaabd, 0xebab84, 0xebab88, 0xebab98,
+ /* fd */ 0xebab99, 0xebabbc,
+
+ /*** Two byte table, leaf: b9xx - offset 0x00871 ***/
+
+ /* a1 */ 0xebac80, 0xebac84, 0xebac8d, 0xebac8f,
+ /* a5 */ 0xebac91, 0xebac98, 0xebac9c, 0xebaca0,
+ /* a9 */ 0xebaca9, 0xebacab, 0xebacb4, 0xebacb5,
+ /* ad */ 0xebacb6, 0xebacb8, 0xebacbb, 0xebacbc,
+ /* b1 */ 0xebacbd, 0xebacbe, 0xebad84, 0xebad85,
+ /* b5 */ 0xebad87, 0xebad89, 0xebad8d, 0xebad8f,
+ /* b9 */ 0xebad90, 0xebad94, 0xebad98, 0xebada1,
+ /* bd */ 0xebada3, 0xebadac, 0xebae88, 0xebae8c,
+ /* c1 */ 0xebae90, 0xebaea4, 0xebaea8, 0xebaeac,
+ /* c5 */ 0xebaeb4, 0xebaeb7, 0xebaf80, 0xebaf84,
+ /* c9 */ 0xebaf88, 0xebaf90, 0xebaf93, 0xebafb8,
+ /* cd */ 0xebafb9, 0xebafbc, 0xebafbf, 0xebb080,
+ /* d1 */ 0xebb082, 0xebb088, 0xebb089, 0xebb08b,
+ /* d5 */ 0xebb08c, 0xebb08d, 0xebb08f, 0xebb091,
+ /* d9 */ 0xebb094, 0xebb095, 0xebb096, 0xebb097,
+ /* dd */ 0xebb098, 0xebb09b, 0xebb09c, 0xebb09d,
+ /* e1 */ 0xebb09e, 0xebb09f, 0xebb0a4, 0xebb0a5,
+ /* e5 */ 0xebb0a7, 0xebb0a9, 0xebb0ad, 0xebb0b0,
+ /* e9 */ 0xebb0b1, 0xebb0b4, 0xebb0b8, 0xebb180,
+ /* ed */ 0xebb181, 0xebb183, 0xebb184, 0xebb185,
+ /* f1 */ 0xebb189, 0xebb18c, 0xebb18d, 0xebb190,
+ /* f5 */ 0xebb19d, 0xebb284, 0xebb285, 0xebb288,
+ /* f9 */ 0xebb28b, 0xebb28c, 0xebb28e, 0xebb294,
+ /* fd */ 0xebb295, 0xebb297,
+
+ /*** Two byte table, leaf: baxx - offset 0x008cf ***/
+
+ /* a1 */ 0xebb299, 0xebb29a, 0xebb2a0, 0xebb2a1,
+ /* a5 */ 0xebb2a4, 0xebb2a7, 0xebb2a8, 0xebb2b0,
+ /* a9 */ 0xebb2b1, 0xebb2b3, 0xebb2b4, 0xebb2b5,
+ /* ad */ 0xebb2bc, 0xebb2bd, 0xebb380, 0xebb384,
+ /* b1 */ 0xebb38d, 0xebb38f, 0xebb390, 0xebb391,
+ /* b5 */ 0xebb395, 0xebb398, 0xebb39c, 0xebb3b4,
+ /* b9 */ 0xebb3b5, 0xebb3b6, 0xebb3b8, 0xebb3bc,
+ /* bd */ 0xebb484, 0xebb485, 0xebb487, 0xebb489,
+ /* c1 */ 0xebb490, 0xebb494, 0xebb4a4, 0xebb4ac,
+ /* c5 */ 0xebb580, 0xebb588, 0xebb589, 0xebb58c,
+ /* c9 */ 0xebb590, 0xebb598, 0xebb599, 0xebb5a4,
+ /* cd */ 0xebb5a8, 0xebb680, 0xebb681, 0xebb684,
+ /* d1 */ 0xebb687, 0xebb688, 0xebb689, 0xebb68a,
+ /* d5 */ 0xebb690, 0xebb691, 0xebb693, 0xebb695,
+ /* d9 */ 0xebb699, 0xebb69a, 0xebb69c, 0xebb6a4,
+ /* dd */ 0xebb6b0, 0xebb6b8, 0xebb794, 0xebb795,
+ /* e1 */ 0xebb798, 0xebb79c, 0xebb7a9, 0xebb7b0,
+ /* e5 */ 0xebb7b4, 0xebb7b8, 0xebb880, 0xebb883,
+ /* e9 */ 0xebb885, 0xebb88c, 0xebb88d, 0xebb890,
+ /* ed */ 0xebb894, 0xebb89c, 0xebb89d, 0xebb89f,
+ /* f1 */ 0xebb984, 0xebb985, 0xebb988, 0xebb98c,
+ /* f5 */ 0xebb98e, 0xebb994, 0xebb995, 0xebb997,
+ /* f9 */ 0xebb999, 0xebb99a, 0xebb99b, 0xebb9a0,
+ /* fd */ 0xebb9a1, 0xebb9a4,
+
+ /*** Two byte table, leaf: bbxx - offset 0x0092d ***/
+
+ /* a1 */ 0xebb9a8, 0xebb9aa, 0xebb9b0, 0xebb9b1,
+ /* a5 */ 0xebb9b3, 0xebb9b4, 0xebb9b5, 0xebb9bb,
+ /* a9 */ 0xebb9bc, 0xebb9bd, 0xebba80, 0xebba84,
+ /* ad */ 0xebba8c, 0xebba8d, 0xebba8f, 0xebba90,
+ /* b1 */ 0xebba91, 0xebba98, 0xebba99, 0xebbaa8,
+ /* b5 */ 0xebbb90, 0xebbb91, 0xebbb94, 0xebbb97,
+ /* b9 */ 0xebbb98, 0xebbba0, 0xebbba3, 0xebbba4,
+ /* bd */ 0xebbba5, 0xebbbac, 0xebbc81, 0xebbc88,
+ /* c1 */ 0xebbc89, 0xebbc98, 0xebbc99, 0xebbc9b,
+ /* c5 */ 0xebbc9c, 0xebbc9d, 0xebbd80, 0xebbd81,
+ /* c9 */ 0xebbd84, 0xebbd88, 0xebbd90, 0xebbd91,
+ /* cd */ 0xebbd95, 0xebbe94, 0xebbeb0, 0xebbf85,
+ /* d1 */ 0xebbf8c, 0xebbf8d, 0xebbf90, 0xebbf94,
+ /* d5 */ 0xebbf9c, 0xebbf9f, 0xebbfa1, 0xec80bc,
+ /* d9 */ 0xec8191, 0xec8198, 0xec819c, 0xec81a0,
+ /* dd */ 0xec81a8, 0xec81a9, 0xec8290, 0xec8291,
+ /* e1 */ 0xec8294, 0xec8298, 0xec82a0, 0xec82a1,
+ /* e5 */ 0xec82a3, 0xec82a5, 0xec82ac, 0xec82ad,
+ /* e9 */ 0xec82af, 0xec82b0, 0xec82b3, 0xec82b4,
+ /* ed */ 0xec82b5, 0xec82b6, 0xec82bc, 0xec82bd,
+ /* f1 */ 0xec82bf, 0xec8380, 0xec8381, 0xec8385,
+ /* f5 */ 0xec8388, 0xec8389, 0xec838c, 0xec8390,
+ /* f9 */ 0xec8398, 0xec8399, 0xec839b, 0xec839c,
+ /* fd */ 0xec839d, 0xec83a4,
+
+ /*** Two byte table, leaf: bcxx - offset 0x0098b ***/
+
+ /* a1 */ 0xec83a5, 0xec83a8, 0xec83ac, 0xec83b4,
+ /* a5 */ 0xec83b5, 0xec83b7, 0xec83b9, 0xec8480,
+ /* a9 */ 0xec8484, 0xec8488, 0xec8490, 0xec8495,
+ /* ad */ 0xec849c, 0xec849d, 0xec849e, 0xec849f,
+ /* b1 */ 0xec84a0, 0xec84a3, 0xec84a4, 0xec84a6,
+ /* b5 */ 0xec84a7, 0xec84ac, 0xec84ad, 0xec84af,
+ /* b9 */ 0xec84b0, 0xec84b1, 0xec84b6, 0xec84b8,
+ /* bd */ 0xec84b9, 0xec84bc, 0xec8580, 0xec8588,
+ /* c1 */ 0xec8589, 0xec858b, 0xec858c, 0xec858d,
+ /* c5 */ 0xec8594, 0xec8595, 0xec8598, 0xec859c,
+ /* c9 */ 0xec85a4, 0xec85a5, 0xec85a7, 0xec85a8,
+ /* cd */ 0xec85a9, 0xec85b0, 0xec85b4, 0xec85b8,
+ /* d1 */ 0xec8685, 0xec868c, 0xec868d, 0xec868e,
+ /* d5 */ 0xec8690, 0xec8694, 0xec8696, 0xec869c,
+ /* d9 */ 0xec869d, 0xec869f, 0xec86a1, 0xec86a5,
+ /* dd */ 0xec86a8, 0xec86a9, 0xec86ac, 0xec86b0,
+ /* e1 */ 0xec86bd, 0xec8784, 0xec8788, 0xec878c,
+ /* e5 */ 0xec8794, 0xec8797, 0xec8798, 0xec87a0,
+ /* e9 */ 0xec87a4, 0xec87a8, 0xec87b0, 0xec87b1,
+ /* ed */ 0xec87b3, 0xec87bc, 0xec87bd, 0xec8880,
+ /* f1 */ 0xec8884, 0xec888c, 0xec888d, 0xec888f,
+ /* f5 */ 0xec8891, 0xec8898, 0xec8899, 0xec889c,
+ /* f9 */ 0xec889f, 0xec88a0, 0xec88a8, 0xec88a9,
+ /* fd */ 0xec88ab, 0xec88ad,
+
+ /*** Two byte table, leaf: bdxx - offset 0x009e9 ***/
+
+ /* a1 */ 0xec88af, 0xec88b1, 0xec88b2, 0xec88b4,
+ /* a5 */ 0xec8988, 0xec8990, 0xec8991, 0xec8994,
+ /* a9 */ 0xec8998, 0xec89a0, 0xec89a5, 0xec89ac,
+ /* ad */ 0xec89ad, 0xec89b0, 0xec89b4, 0xec89bc,
+ /* b1 */ 0xec89bd, 0xec89bf, 0xec8a81, 0xec8a88,
+ /* b5 */ 0xec8a89, 0xec8a90, 0xec8a98, 0xec8a9b,
+ /* b9 */ 0xec8a9d, 0xec8aa4, 0xec8aa5, 0xec8aa8,
+ /* bd */ 0xec8aac, 0xec8aad, 0xec8ab4, 0xec8ab5,
+ /* c1 */ 0xec8ab7, 0xec8ab9, 0xec8b9c, 0xec8b9d,
+ /* c5 */ 0xec8ba0, 0xec8ba3, 0xec8ba4, 0xec8bab,
+ /* c9 */ 0xec8bac, 0xec8bad, 0xec8baf, 0xec8bb1,
+ /* cd */ 0xec8bb6, 0xec8bb8, 0xec8bb9, 0xec8bbb,
+ /* d1 */ 0xec8bbc, 0xec8c80, 0xec8c88, 0xec8c89,
+ /* d5 */ 0xec8c8c, 0xec8c8d, 0xec8c93, 0xec8c94,
+ /* d9 */ 0xec8c95, 0xec8c98, 0xec8c9c, 0xec8ca4,
+ /* dd */ 0xec8ca5, 0xec8ca8, 0xec8ca9, 0xec8d85,
+ /* e1 */ 0xec8da8, 0xec8da9, 0xec8dac, 0xec8db0,
+ /* e5 */ 0xec8db2, 0xec8db8, 0xec8db9, 0xec8dbc,
+ /* e9 */ 0xec8dbd, 0xec8e84, 0xec8e88, 0xec8e8c,
+ /* ed */ 0xec8f80, 0xec8f98, 0xec8f99, 0xec8f9c,
+ /* f1 */ 0xec8f9f, 0xec8fa0, 0xec8fa2, 0xec8fa8,
+ /* f5 */ 0xec8fa9, 0xec8fad, 0xec8fb4, 0xec8fb5,
+ /* f9 */ 0xec8fb8, 0xec9088, 0xec9090, 0xec90a4,
+ /* fd */ 0xec90ac, 0xec90b0,
+
+ /*** Two byte table, leaf: bexx - offset 0x00a47 ***/
+
+ /* a1 */ 0xec90b4, 0xec90bc, 0xec90bd, 0xec9188,
+ /* a5 */ 0xec91a4, 0xec91a5, 0xec91a8, 0xec91ac,
+ /* a9 */ 0xec91b4, 0xec91b5, 0xec91b9, 0xec9280,
+ /* ad */ 0xec9294, 0xec929c, 0xec92b8, 0xec92bc,
+ /* b1 */ 0xec93a9, 0xec93b0, 0xec93b1, 0xec93b4,
+ /* b5 */ 0xec93b8, 0xec93ba, 0xec93bf, 0xec9480,
+ /* b9 */ 0xec9481, 0xec948c, 0xec9490, 0xec9494,
+ /* bd */ 0xec949c, 0xec94a8, 0xec94a9, 0xec94ac,
+ /* c1 */ 0xec94b0, 0xec94b8, 0xec94b9, 0xec94bb,
+ /* c5 */ 0xec94bd, 0xec9584, 0xec9585, 0xec9588,
+ /* c9 */ 0xec9589, 0xec958a, 0xec958c, 0xec958d,
+ /* cd */ 0xec958e, 0xec9593, 0xec9594, 0xec9595,
+ /* d1 */ 0xec9597, 0xec9598, 0xec9599, 0xec959d,
+ /* d5 */ 0xec959e, 0xec95a0, 0xec95a1, 0xec95a4,
+ /* d9 */ 0xec95a8, 0xec95b0, 0xec95b1, 0xec95b3,
+ /* dd */ 0xec95b4, 0xec95b5, 0xec95bc, 0xec95bd,
+ /* e1 */ 0xec9680, 0xec9684, 0xec9687, 0xec968c,
+ /* e5 */ 0xec968d, 0xec968f, 0xec9691, 0xec9695,
+ /* e9 */ 0xec9697, 0xec9698, 0xec969c, 0xec96a0,
+ /* ed */ 0xec96a9, 0xec96b4, 0xec96b5, 0xec96b8,
+ /* f1 */ 0xec96b9, 0xec96bb, 0xec96bc, 0xec96bd,
+ /* f5 */ 0xec96be, 0xec9784, 0xec9785, 0xec9786,
+ /* f9 */ 0xec9787, 0xec9788, 0xec9789, 0xec978a,
+ /* fd */ 0xec978c, 0xec978e,
+
+ /*** Two byte table, leaf: bfxx - offset 0x00aa5 ***/
+
+ /* a1 */ 0xec9790, 0xec9791, 0xec9794, 0xec9798,
+ /* a5 */ 0xec97a0, 0xec97a1, 0xec97a3, 0xec97a5,
+ /* a9 */ 0xec97ac, 0xec97ad, 0xec97ae, 0xec97b0,
+ /* ad */ 0xec97b4, 0xec97b6, 0xec97b7, 0xec97bc,
+ /* b1 */ 0xec97bd, 0xec97be, 0xec97bf, 0xec9880,
+ /* b5 */ 0xec9881, 0xec9885, 0xec9886, 0xec9887,
+ /* b9 */ 0xec9888, 0xec988c, 0xec9890, 0xec9898,
+ /* bd */ 0xec9899, 0xec989b, 0xec989c, 0xec98a4,
+ /* c1 */ 0xec98a5, 0xec98a8, 0xec98ac, 0xec98ad,
+ /* c5 */ 0xec98ae, 0xec98b0, 0xec98b3, 0xec98b4,
+ /* c9 */ 0xec98b5, 0xec98b7, 0xec98b9, 0xec98bb,
+ /* cd */ 0xec9980, 0xec9981, 0xec9984, 0xec9988,
+ /* d1 */ 0xec9990, 0xec9991, 0xec9993, 0xec9994,
+ /* d5 */ 0xec9995, 0xec999c, 0xec999d, 0xec99a0,
+ /* d9 */ 0xec99ac, 0xec99af, 0xec99b1, 0xec99b8,
+ /* dd */ 0xec99b9, 0xec99bc, 0xec9a80, 0xec9a88,
+ /* e1 */ 0xec9a89, 0xec9a8b, 0xec9a8d, 0xec9a94,
+ /* e5 */ 0xec9a95, 0xec9a98, 0xec9a9c, 0xec9aa4,
+ /* e9 */ 0xec9aa5, 0xec9aa7, 0xec9aa9, 0xec9ab0,
+ /* ed */ 0xec9ab1, 0xec9ab4, 0xec9ab8, 0xec9ab9,
+ /* f1 */ 0xec9aba, 0xec9b80, 0xec9b81, 0xec9b83,
+ /* f5 */ 0xec9b85, 0xec9b8c, 0xec9b8d, 0xec9b90,
+ /* f9 */ 0xec9b94, 0xec9b9c, 0xec9b9d, 0xec9ba0,
+ /* fd */ 0xec9ba1, 0xec9ba8,
+
+ /*** Two byte table, leaf: c0xx - offset 0x00b03 ***/
+
+ /* a1 */ 0xec9ba9, 0xec9bac, 0xec9bb0, 0xec9bb8,
+ /* a5 */ 0xec9bb9, 0xec9bbd, 0xec9c84, 0xec9c85,
+ /* a9 */ 0xec9c88, 0xec9c8c, 0xec9c94, 0xec9c95,
+ /* ad */ 0xec9c97, 0xec9c99, 0xec9ca0, 0xec9ca1,
+ /* b1 */ 0xec9ca4, 0xec9ca8, 0xec9cb0, 0xec9cb1,
+ /* b5 */ 0xec9cb3, 0xec9cb5, 0xec9cb7, 0xec9cbc,
+ /* b9 */ 0xec9cbd, 0xec9d80, 0xec9d84, 0xec9d8a,
+ /* bd */ 0xec9d8c, 0xec9d8d, 0xec9d8f, 0xec9d91,
+ /* c1 */ 0xec9d92, 0xec9d93, 0xec9d94, 0xec9d95,
+ /* c5 */ 0xec9d96, 0xec9d97, 0xec9d98, 0xec9d9c,
+ /* c9 */ 0xec9da0, 0xec9da8, 0xec9dab, 0xec9db4,
+ /* cd */ 0xec9db5, 0xec9db8, 0xec9dbc, 0xec9dbd,
+ /* d1 */ 0xec9dbe, 0xec9e83, 0xec9e84, 0xec9e85,
+ /* d5 */ 0xec9e87, 0xec9e88, 0xec9e89, 0xec9e8a,
+ /* d9 */ 0xec9e8e, 0xec9e90, 0xec9e91, 0xec9e94,
+ /* dd */ 0xec9e96, 0xec9e97, 0xec9e98, 0xec9e9a,
+ /* e1 */ 0xec9ea0, 0xec9ea1, 0xec9ea3, 0xec9ea4,
+ /* e5 */ 0xec9ea5, 0xec9ea6, 0xec9eac, 0xec9ead,
+ /* e9 */ 0xec9eb0, 0xec9eb4, 0xec9ebc, 0xec9ebd,
+ /* ed */ 0xec9ebf, 0xec9f80, 0xec9f81, 0xec9f88,
+ /* f1 */ 0xec9f89, 0xec9f8c, 0xec9f8e, 0xec9f90,
+ /* f5 */ 0xec9f98, 0xec9f9d, 0xec9fa4, 0xec9fa8,
+ /* f9 */ 0xec9fac, 0xeca080, 0xeca081, 0xeca084,
+ /* fd */ 0xeca088, 0xeca08a,
+
+ /*** Two byte table, leaf: c1xx - offset 0x00b61 ***/
+
+ /* a1 */ 0xeca090, 0xeca091, 0xeca093, 0xeca095,
+ /* a5 */ 0xeca096, 0xeca09c, 0xeca09d, 0xeca0a0,
+ /* a9 */ 0xeca0a4, 0xeca0ac, 0xeca0ad, 0xeca0af,
+ /* ad */ 0xeca0b1, 0xeca0b8, 0xeca0bc, 0xeca180,
+ /* b1 */ 0xeca188, 0xeca189, 0xeca18c, 0xeca18d,
+ /* b5 */ 0xeca194, 0xeca1b0, 0xeca1b1, 0xeca1b4,
+ /* b9 */ 0xeca1b8, 0xeca1ba, 0xeca280, 0xeca281,
+ /* bd */ 0xeca283, 0xeca285, 0xeca286, 0xeca287,
+ /* c1 */ 0xeca28b, 0xeca28c, 0xeca28d, 0xeca294,
+ /* c5 */ 0xeca29d, 0xeca29f, 0xeca2a1, 0xeca2a8,
+ /* c9 */ 0xeca2bc, 0xeca2bd, 0xeca384, 0xeca388,
+ /* cd */ 0xeca38c, 0xeca394, 0xeca395, 0xeca397,
+ /* d1 */ 0xeca399, 0xeca3a0, 0xeca3a1, 0xeca3a4,
+ /* d5 */ 0xeca3b5, 0xeca3bc, 0xeca3bd, 0xeca480,
+ /* d9 */ 0xeca484, 0xeca485, 0xeca486, 0xeca48c,
+ /* dd */ 0xeca48d, 0xeca48f, 0xeca491, 0xeca498,
+ /* e1 */ 0xeca4ac, 0xeca4b4, 0xeca590, 0xeca591,
+ /* e5 */ 0xeca594, 0xeca598, 0xeca5a0, 0xeca5a1,
+ /* e9 */ 0xeca5a3, 0xeca5ac, 0xeca5b0, 0xeca5b4,
+ /* ed */ 0xeca5bc, 0xeca688, 0xeca689, 0xeca68c,
+ /* f1 */ 0xeca690, 0xeca698, 0xeca699, 0xeca69b,
+ /* f5 */ 0xeca69d, 0xeca780, 0xeca781, 0xeca784,
+ /* f9 */ 0xeca787, 0xeca788, 0xeca78a, 0xeca790,
+ /* fd */ 0xeca791, 0xeca793,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00bbf ***/
+
+ /* a1 */ 0xeca795, 0xeca796, 0xeca799, 0xeca79a,
+ /* a5 */ 0xeca79c, 0xeca79d, 0xeca7a0, 0xeca7a2,
+ /* a9 */ 0xeca7a4, 0xeca7a7, 0xeca7ac, 0xeca7ad,
+ /* ad */ 0xeca7af, 0xeca7b0, 0xeca7b1, 0xeca7b8,
+ /* b1 */ 0xeca7b9, 0xeca7bc, 0xeca880, 0xeca888,
+ /* b5 */ 0xeca889, 0xeca88b, 0xeca88c, 0xeca88d,
+ /* b9 */ 0xeca894, 0xeca898, 0xeca8a9, 0xeca98c,
+ /* bd */ 0xeca98d, 0xeca990, 0xeca994, 0xeca99c,
+ /* c1 */ 0xeca99d, 0xeca99f, 0xeca9a0, 0xeca9a1,
+ /* c5 */ 0xeca9a8, 0xeca9bd, 0xecaa84, 0xecaa98,
+ /* c9 */ 0xecaabc, 0xecaabd, 0xecab80, 0xecab84,
+ /* cd */ 0xecab8c, 0xecab8d, 0xecab8f, 0xecab91,
+ /* d1 */ 0xecab93, 0xecab98, 0xecab99, 0xecaba0,
+ /* d5 */ 0xecabac, 0xecabb4, 0xecac88, 0xecac90,
+ /* d9 */ 0xecac94, 0xecac98, 0xecaca0, 0xecaca1,
+ /* dd */ 0xecad81, 0xecad88, 0xecad89, 0xecad8c,
+ /* e1 */ 0xecad90, 0xecad98, 0xecad99, 0xecad9d,
+ /* e5 */ 0xecada4, 0xecadb8, 0xecadb9, 0xecae9c,
+ /* e9 */ 0xecaeb8, 0xecaf94, 0xecafa4, 0xecafa7,
+ /* ed */ 0xecafa9, 0xecb08c, 0xecb08d, 0xecb090,
+ /* f1 */ 0xecb094, 0xecb09c, 0xecb09d, 0xecb0a1,
+ /* f5 */ 0xecb0a2, 0xecb0a7, 0xecb0a8, 0xecb0a9,
+ /* f9 */ 0xecb0ac, 0xecb0ae, 0xecb0b0, 0xecb0b8,
+ /* fd */ 0xecb0b9, 0xecb0bb,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00c1d ***/
+
+ /* a1 */ 0xecb0bc, 0xecb0bd, 0xecb0be, 0xecb184,
+ /* a5 */ 0xecb185, 0xecb188, 0xecb18c, 0xecb194,
+ /* a9 */ 0xecb195, 0xecb197, 0xecb198, 0xecb199,
+ /* ad */ 0xecb1a0, 0xecb1a4, 0xecb1a6, 0xecb1a8,
+ /* b1 */ 0xecb1b0, 0xecb1b5, 0xecb298, 0xecb299,
+ /* b5 */ 0xecb29c, 0xecb2a0, 0xecb2a8, 0xecb2a9,
+ /* b9 */ 0xecb2ab, 0xecb2ac, 0xecb2ad, 0xecb2b4,
+ /* bd */ 0xecb2b5, 0xecb2b8, 0xecb2bc, 0xecb384,
+ /* c1 */ 0xecb385, 0xecb387, 0xecb389, 0xecb390,
+ /* c5 */ 0xecb394, 0xecb3a4, 0xecb3ac, 0xecb3b0,
+ /* c9 */ 0xecb481, 0xecb488, 0xecb489, 0xecb48c,
+ /* cd */ 0xecb490, 0xecb498, 0xecb499, 0xecb49b,
+ /* d1 */ 0xecb49d, 0xecb4a4, 0xecb4a8, 0xecb4ac,
+ /* d5 */ 0xecb4b9, 0xecb59c, 0xecb5a0, 0xecb5a4,
+ /* d9 */ 0xecb5ac, 0xecb5ad, 0xecb5af, 0xecb5b1,
+ /* dd */ 0xecb5b8, 0xecb688, 0xecb694, 0xecb695,
+ /* e1 */ 0xecb698, 0xecb69c, 0xecb6a4, 0xecb6a5,
+ /* e5 */ 0xecb6a7, 0xecb6a9, 0xecb6b0, 0xecb784,
+ /* e9 */ 0xecb78c, 0xecb790, 0xecb7a8, 0xecb7ac,
+ /* ed */ 0xecb7b0, 0xecb7b8, 0xecb7b9, 0xecb7bb,
+ /* f1 */ 0xecb7bd, 0xecb884, 0xecb888, 0xecb88c,
+ /* f5 */ 0xecb894, 0xecb899, 0xecb8a0, 0xecb8a1,
+ /* f9 */ 0xecb8a4, 0xecb8a8, 0xecb8b0, 0xecb8b1,
+ /* fd */ 0xecb8b3, 0xecb8b5,
+
+ /*** Two byte table, leaf: c4xx - offset 0x00c7b ***/
+
+ /* a1 */ 0xecb998, 0xecb999, 0xecb99c, 0xecb99f,
+ /* a5 */ 0xecb9a0, 0xecb9a1, 0xecb9a8, 0xecb9a9,
+ /* a9 */ 0xecb9ab, 0xecb9ad, 0xecb9b4, 0xecb9b5,
+ /* ad */ 0xecb9b8, 0xecb9bc, 0xecba84, 0xecba85,
+ /* b1 */ 0xecba87, 0xecba89, 0xecba90, 0xecba91,
+ /* b5 */ 0xecba94, 0xecba98, 0xecbaa0, 0xecbaa1,
+ /* b9 */ 0xecbaa3, 0xecbaa4, 0xecbaa5, 0xecbaac,
+ /* bd */ 0xecbaad, 0xecbb81, 0xecbba4, 0xecbba5,
+ /* c1 */ 0xecbba8, 0xecbbab, 0xecbbac, 0xecbbb4,
+ /* c5 */ 0xecbbb5, 0xecbbb7, 0xecbbb8, 0xecbbb9,
+ /* c9 */ 0xecbc80, 0xecbc81, 0xecbc84, 0xecbc88,
+ /* cd */ 0xecbc90, 0xecbc91, 0xecbc93, 0xecbc95,
+ /* d1 */ 0xecbc9c, 0xecbca0, 0xecbca4, 0xecbcac,
+ /* d5 */ 0xecbcad, 0xecbcaf, 0xecbcb0, 0xecbcb1,
+ /* d9 */ 0xecbcb8, 0xecbd94, 0xecbd95, 0xecbd98,
+ /* dd */ 0xecbd9c, 0xecbda4, 0xecbda5, 0xecbda7,
+ /* e1 */ 0xecbda9, 0xecbdb0, 0xecbdb1, 0xecbdb4,
+ /* e5 */ 0xecbdb8, 0xecbe80, 0xecbe85, 0xecbe8c,
+ /* e9 */ 0xecbea1, 0xecbea8, 0xecbeb0, 0xecbf84,
+ /* ed */ 0xecbfa0, 0xecbfa1, 0xecbfa4, 0xecbfa8,
+ /* f1 */ 0xecbfb0, 0xecbfb1, 0xecbfb3, 0xecbfb5,
+ /* f5 */ 0xecbfbc, 0xed8080, 0xed8084, 0xed8091,
+ /* f9 */ 0xed8098, 0xed80ad, 0xed80b4, 0xed80b5,
+ /* fd */ 0xed80b8, 0xed80bc,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00cd9 ***/
+
+ /* a1 */ 0xed8184, 0xed8185, 0xed8187, 0xed8189,
+ /* a5 */ 0xed8190, 0xed8194, 0xed8198, 0xed81a0,
+ /* a9 */ 0xed81ac, 0xed81ad, 0xed81b0, 0xed81b4,
+ /* ad */ 0xed81bc, 0xed81bd, 0xed8281, 0xed82a4,
+ /* b1 */ 0xed82a5, 0xed82a8, 0xed82ac, 0xed82b4,
+ /* b5 */ 0xed82b5, 0xed82b7, 0xed82b9, 0xed8380,
+ /* b9 */ 0xed8381, 0xed8384, 0xed8388, 0xed8389,
+ /* bd */ 0xed8390, 0xed8391, 0xed8393, 0xed8394,
+ /* c1 */ 0xed8395, 0xed839c, 0xed839d, 0xed83a0,
+ /* c5 */ 0xed83a4, 0xed83ac, 0xed83ad, 0xed83af,
+ /* c9 */ 0xed83b0, 0xed83b1, 0xed83b8, 0xed848d,
+ /* cd */ 0xed84b0, 0xed84b1, 0xed84b4, 0xed84b8,
+ /* d1 */ 0xed84ba, 0xed8580, 0xed8581, 0xed8583,
+ /* d5 */ 0xed8584, 0xed8585, 0xed858c, 0xed858d,
+ /* d9 */ 0xed8590, 0xed8594, 0xed859c, 0xed859d,
+ /* dd */ 0xed859f, 0xed85a1, 0xed85a8, 0xed85ac,
+ /* e1 */ 0xed85bc, 0xed8684, 0xed8688, 0xed86a0,
+ /* e5 */ 0xed86a1, 0xed86a4, 0xed86a8, 0xed86b0,
+ /* e9 */ 0xed86b1, 0xed86b3, 0xed86b5, 0xed86ba,
+ /* ed */ 0xed86bc, 0xed8780, 0xed8798, 0xed87b4,
+ /* f1 */ 0xed87b8, 0xed8887, 0xed8889, 0xed8890,
+ /* f5 */ 0xed88ac, 0xed88ad, 0xed88b0, 0xed88b4,
+ /* f9 */ 0xed88bc, 0xed88bd, 0xed88bf, 0xed8981,
+ /* fd */ 0xed8988, 0xed899c,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00d37 ***/
+
+ /* a1 */ 0xed89a4, 0xed8a80, 0xed8a81, 0xed8a84,
+ /* a5 */ 0xed8a88, 0xed8a90, 0xed8a91, 0xed8a95,
+ /* a9 */ 0xed8a9c, 0xed8aa0, 0xed8aa4, 0xed8aac,
+ /* ad */ 0xed8ab1, 0xed8ab8, 0xed8ab9, 0xed8abc,
+ /* b1 */ 0xed8abf, 0xed8b80, 0xed8b82, 0xed8b88,
+ /* b5 */ 0xed8b89, 0xed8b8b, 0xed8b94, 0xed8b98,
+ /* b9 */ 0xed8b9c, 0xed8ba4, 0xed8ba5, 0xed8bb0,
+ /* bd */ 0xed8bb1, 0xed8bb4, 0xed8bb8, 0xed8c80,
+ /* c1 */ 0xed8c81, 0xed8c83, 0xed8c85, 0xed8c8c,
+ /* c5 */ 0xed8c8d, 0xed8c8e, 0xed8c90, 0xed8c94,
+ /* c9 */ 0xed8c96, 0xed8c9c, 0xed8c9d, 0xed8c9f,
+ /* cd */ 0xed8ca0, 0xed8ca1, 0xed8ca5, 0xed8ca8,
+ /* d1 */ 0xed8ca9, 0xed8cac, 0xed8cb0, 0xed8cb8,
+ /* d5 */ 0xed8cb9, 0xed8cbb, 0xed8cbc, 0xed8cbd,
+ /* d9 */ 0xed8d84, 0xed8d85, 0xed8dbc, 0xed8dbd,
+ /* dd */ 0xed8e80, 0xed8e84, 0xed8e8c, 0xed8e8d,
+ /* e1 */ 0xed8e8f, 0xed8e90, 0xed8e91, 0xed8e98,
+ /* e5 */ 0xed8e99, 0xed8e9c, 0xed8ea0, 0xed8ea8,
+ /* e9 */ 0xed8ea9, 0xed8eab, 0xed8ead, 0xed8eb4,
+ /* ed */ 0xed8eb8, 0xed8ebc, 0xed8f84, 0xed8f85,
+ /* f1 */ 0xed8f88, 0xed8f89, 0xed8f90, 0xed8f98,
+ /* f5 */ 0xed8fa1, 0xed8fa3, 0xed8fac, 0xed8fad,
+ /* f9 */ 0xed8fb0, 0xed8fb4, 0xed8fbc, 0xed8fbd,
+ /* fd */ 0xed8fbf, 0xed9081,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00d95 ***/
+
+ /* a1 */ 0xed9088, 0xed909d, 0xed9180, 0xed9184,
+ /* a5 */ 0xed919c, 0xed91a0, 0xed91a4, 0xed91ad,
+ /* a9 */ 0xed91af, 0xed91b8, 0xed91b9, 0xed91bc,
+ /* ad */ 0xed91bf, 0xed9280, 0xed9282, 0xed9288,
+ /* b1 */ 0xed9289, 0xed928b, 0xed928d, 0xed9294,
+ /* b5 */ 0xed92a9, 0xed938c, 0xed9390, 0xed9394,
+ /* b9 */ 0xed939c, 0xed939f, 0xed93a8, 0xed93ac,
+ /* bd */ 0xed93b0, 0xed93b8, 0xed93bb, 0xed93bd,
+ /* c1 */ 0xed9484, 0xed9488, 0xed948c, 0xed9494,
+ /* c5 */ 0xed9495, 0xed9497, 0xed94bc, 0xed94bd,
+ /* c9 */ 0xed9580, 0xed9584, 0xed958c, 0xed958d,
+ /* cd */ 0xed958f, 0xed9591, 0xed9598, 0xed9599,
+ /* d1 */ 0xed959c, 0xed95a0, 0xed95a5, 0xed95a8,
+ /* d5 */ 0xed95a9, 0xed95ab, 0xed95ad, 0xed95b4,
+ /* d9 */ 0xed95b5, 0xed95b8, 0xed95bc, 0xed9684,
+ /* dd */ 0xed9685, 0xed9687, 0xed9688, 0xed9689,
+ /* e1 */ 0xed9690, 0xed96a5, 0xed9788, 0xed9789,
+ /* e5 */ 0xed978c, 0xed9790, 0xed9792, 0xed9798,
+ /* e9 */ 0xed9799, 0xed979b, 0xed979d, 0xed97a4,
+ /* ed */ 0xed97a5, 0xed97a8, 0xed97ac, 0xed97b4,
+ /* f1 */ 0xed97b5, 0xed97b7, 0xed97b9, 0xed9880,
+ /* f5 */ 0xed9881, 0xed9884, 0xed9888, 0xed9890,
+ /* f9 */ 0xed9891, 0xed9893, 0xed9894, 0xed9895,
+ /* fd */ 0xed989c, 0xed98a0,
+
+ /*** Two byte table, leaf: c8xx - offset 0x00df3 ***/
+
+ /* a1 */ 0xed98a4, 0xed98ad, 0xed98b8, 0xed98b9,
+ /* a5 */ 0xed98bc, 0xed9980, 0xed9985, 0xed9988,
+ /* a9 */ 0xed9989, 0xed998b, 0xed998d, 0xed9991,
+ /* ad */ 0xed9994, 0xed9995, 0xed9998, 0xed999c,
+ /* b1 */ 0xed99a7, 0xed99a9, 0xed99b0, 0xed99b1,
+ /* b5 */ 0xed99b4, 0xed9a83, 0xed9a85, 0xed9a8c,
+ /* b9 */ 0xed9a8d, 0xed9a90, 0xed9a94, 0xed9a9d,
+ /* bd */ 0xed9a9f, 0xed9aa1, 0xed9aa8, 0xed9aac,
+ /* c1 */ 0xed9ab0, 0xed9ab9, 0xed9abb, 0xed9b84,
+ /* c5 */ 0xed9b85, 0xed9b88, 0xed9b8c, 0xed9b91,
+ /* c9 */ 0xed9b94, 0xed9b97, 0xed9b99, 0xed9ba0,
+ /* cd */ 0xed9ba4, 0xed9ba8, 0xed9bb0, 0xed9bb5,
+ /* d1 */ 0xed9bbc, 0xed9bbd, 0xed9c80, 0xed9c84,
+ /* d5 */ 0xed9c91, 0xed9c98, 0xed9c99, 0xed9c9c,
+ /* d9 */ 0xed9ca0, 0xed9ca8, 0xed9ca9, 0xed9cab,
+ /* dd */ 0xed9cad, 0xed9cb4, 0xed9cb5, 0xed9cb8,
+ /* e1 */ 0xed9cbc, 0xed9d84, 0xed9d87, 0xed9d89,
+ /* e5 */ 0xed9d90, 0xed9d91, 0xed9d94, 0xed9d96,
+ /* e9 */ 0xed9d97, 0xed9d98, 0xed9d99, 0xed9da0,
+ /* ed */ 0xed9da1, 0xed9da3, 0xed9da5, 0xed9da9,
+ /* f1 */ 0xed9dac, 0xed9db0, 0xed9db4, 0xed9dbc,
+ /* f5 */ 0xed9dbd, 0xed9e81, 0xed9e88, 0xed9e89,
+ /* f9 */ 0xed9e8c, 0xed9e90, 0xed9e98, 0xed9e99,
+ /* fd */ 0xed9e9b, 0xed9e9d,
+
+ /*** Two byte table, leaf: caxx - offset 0x00e51 ***/
+
+ /* a1 */ 0xe4bcbd, 0xe4bdb3, 0xe58187, 0xe583b9,
+ /* a5 */ 0xe58aa0, 0xe58faf, 0xe591b5, 0xe593a5,
+ /* a9 */ 0xe59889, 0xe5ab81, 0xe5aeb6, 0xe69a87,
+ /* ad */ 0xe69eb6, 0xe69eb7, 0xe69faf, 0xe6ad8c,
+ /* b1 */ 0xe78f82, 0xe79782, 0xe7a8bc, 0xe88b9b,
+ /* b5 */ 0xe88c84, 0xe8a197, 0xe8a288, 0xe8a8b6,
+ /* b9 */ 0xe8b388, 0xe8b78f, 0xe8bbbb, 0xe8bfa6,
+ /* bd */ 0xe9a795, 0xe588bb, 0xe58db4, 0xe59084,
+ /* c1 */ 0xe681aa, 0xe685a4, 0xe6aebc, 0xe78f8f,
+ /* c5 */ 0xe8849a, 0xe8a6ba, 0xe8a792, 0xe996a3,
+ /* c9 */ 0xe4be83, 0xe5888a, 0xe5a2be, 0xe5a5b8,
+ /* cd */ 0xe5a7a6, 0xe5b9b2, 0xe5b9b9, 0xe68787,
+ /* d1 */ 0xe68f80, 0xe69d86, 0xe69fac, 0xe6a1bf,
+ /* d5 */ 0xe6be97, 0xe7998e, 0xe79c8b, 0xe7a3b5,
+ /* d9 */ 0xe7a888, 0xe7abbf, 0xe7b0a1, 0xe8829d,
+ /* dd */ 0xe889ae, 0xe889b1, 0xe8abab, 0xe99693,
+ /* e1 */ 0xe4b9ab, 0xe5969d, 0xe69bb7, 0xe6b8b4,
+ /* e5 */ 0xe7a2a3, 0xe7abad, 0xe8919b, 0xe8a490,
+ /* e9 */ 0xe89d8e, 0xe99ea8, 0xe58b98, 0xe59d8e,
+ /* ed */ 0xe5a0aa, 0xe5b58c, 0xe6849f, 0xe686be,
+ /* f1 */ 0xe688a1, 0xe695a2, 0xe69f91, 0xe6a984,
+ /* f5 */ 0xe6b89b, 0xe79498, 0xe796b3, 0xe79ba3,
+ /* f9 */ 0xe79eb0, 0xe7b4ba, 0xe982af, 0xe99191,
+ /* fd */ 0xe99192, 0xe9be95,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00eaf ***/
+
+ /* a1 */ 0xe58ca3, 0xe5b2ac, 0xe794b2, 0xe8839b,
+ /* a5 */ 0xe98980, 0xe99698, 0xe5899b, 0xe5a088,
+ /* a9 */ 0xe5a79c, 0xe5b2a1, 0xe5b497, 0xe5bab7,
+ /* ad */ 0xe5bcba, 0xe5bd8a, 0xe685b7, 0xe6b19f,
+ /* b1 */ 0xe795ba, 0xe79686, 0xe7b3a0, 0xe7b5b3,
+ /* b5 */ 0xe7b6b1, 0xe7be8c, 0xe88594, 0xe888a1,
+ /* b9 */ 0xe89691, 0xe8a581, 0xe8ac9b, 0xe98bbc,
+ /* bd */ 0xe9998d, 0xe9b187, 0xe4bb8b, 0xe4bbb7,
+ /* c1 */ 0xe5808b, 0xe587b1, 0xe5a18f, 0xe684b7,
+ /* c5 */ 0xe684be, 0xe685a8, 0xe694b9, 0xe6a7aa,
+ /* c9 */ 0xe6bc91, 0xe796a5, 0xe79a86, 0xe79b96,
+ /* cd */ 0xe7ae87, 0xe88aa5, 0xe8938b, 0xefa480,
+ /* d1 */ 0xe98ea7, 0xe9968b, 0xe59680, 0xe5aea2,
+ /* d5 */ 0xe59d91, 0xefa481, 0xe7b2b3, 0xe7beb9,
+ /* d9 */ 0xe986b5, 0xe580a8, 0xe58ebb, 0xe5b185,
+ /* dd */ 0xe5b7a8, 0xe68b92, 0xe68dae, 0xe6939a,
+ /* e1 */ 0xe693a7, 0xe6b8a0, 0xe782ac, 0xe7a59b,
+ /* e5 */ 0xe8b79d, 0xe8b89e, 0xefa482, 0xe981bd,
+ /* e9 */ 0xe98985, 0xe98bb8, 0xe4b9be, 0xe4bbb6,
+ /* ed */ 0xe581a5, 0xe5b7be, 0xe5bbba, 0xe68486,
+ /* f1 */ 0xe6a597, 0xe885b1, 0xe89994, 0xe8b987,
+ /* f5 */ 0xe98db5, 0xe9a8ab, 0xe4b99e, 0xe58291,
+ /* f9 */ 0xe69db0, 0xe6a180, 0xe58489, 0xe58a8d,
+ /* fd */ 0xe58a92, 0xe6aaa2,
+
+ /*** Two byte table, leaf: ccxx - offset 0x00f0d ***/
+
+ /* a1 */ 0xe79ebc, 0xe98890, 0xe9bb94, 0xe58aab,
+ /* a5 */ 0xe680af, 0xe8bfb2, 0xe58188, 0xe686a9,
+ /* a9 */ 0xe68fad, 0xe6938a, 0xe6a0bc, 0xe6aa84,
+ /* ad */ 0xe6bf80, 0xe88688, 0xe8a6a1, 0xe99a94,
+ /* b1 */ 0xe5a085, 0xe789bd, 0xe78aac, 0xe79484,
+ /* b5 */ 0xe7b5b9, 0xe7b9ad, 0xe882a9, 0xe8a68b,
+ /* b9 */ 0xe8adb4, 0xe981a3, 0xe9b591, 0xe68a89,
+ /* bd */ 0xe6b1ba, 0xe6bd94, 0xe7b590, 0xe7bcba,
+ /* c1 */ 0xe8a8a3, 0xe585bc, 0xe6858a, 0xe7ae9d,
+ /* c5 */ 0xe8ac99, 0xe98997, 0xe98e8c, 0xe4baac,
+ /* c9 */ 0xe4bf93, 0xe5809e, 0xe582be, 0xe58486,
+ /* cd */ 0xe58b81, 0xe58b8d, 0xe58dbf, 0xe59db0,
+ /* d1 */ 0xe5a283, 0xe5ba9a, 0xe5be91, 0xe685b6,
+ /* d5 */ 0xe686ac, 0xe6938e, 0xe695ac, 0xe699af,
+ /* d9 */ 0xe69abb, 0xe69bb4, 0xe6a297, 0xe6b687,
+ /* dd */ 0xe78285, 0xe783b1, 0xe7929f, 0xe792a5,
+ /* e1 */ 0xe7938a, 0xe79799, 0xe7a1ac, 0xe7a3ac,
+ /* e5 */ 0xe7ab9f, 0xe7abb6, 0xe7b585, 0xe7b693,
+ /* e9 */ 0xe88095, 0xe880bf, 0xe8849b, 0xe88e96,
+ /* ed */ 0xe8ada6, 0xe8bc95, 0xe98095, 0xe98fa1,
+ /* f1 */ 0xe9a083, 0xe9a0b8, 0xe9a99a, 0xe9afa8,
+ /* f5 */ 0xe4bf82, 0xe59593, 0xe5a0ba, 0xe5a591,
+ /* f9 */ 0xe5ada3, 0xe5b186, 0xe682b8, 0xe68892,
+ /* fd */ 0xe6a182, 0xe6a2b0,
+
+ /*** Two byte table, leaf: cdxx - offset 0x00f6b ***/
+
+ /* a1 */ 0xe6a3a8, 0xe6baaa, 0xe7958c, 0xe799b8,
+ /* a5 */ 0xe7a38e, 0xe7a8bd, 0xe7b3bb, 0xe7b9ab,
+ /* a9 */ 0xe7b9bc, 0xe8a888, 0xe8aaa1, 0xe8b0bf,
+ /* ad */ 0xe99a8e, 0xe9b784, 0xe58fa4, 0xe58fa9,
+ /* b1 */ 0xe5918a, 0xe591b1, 0xe59bba, 0xe5a791,
+ /* b5 */ 0xe5ada4, 0xe5b0bb, 0xe5baab, 0xe68bb7,
+ /* b9 */ 0xe694b7, 0xe69585, 0xe695b2, 0xe69aa0,
+ /* bd */ 0xe69eaf, 0xe6a781, 0xe6b2bd, 0xe797bc,
+ /* c1 */ 0xe79a90, 0xe79dbe, 0xe7a8bf, 0xe7be94,
+ /* c5 */ 0xe88083, 0xe882a1, 0xe8868f, 0xe88ba6,
+ /* c9 */ 0xe88bbd, 0xe88fb0, 0xe89781, 0xe8a0b1,
+ /* cd */ 0xe8a2b4, 0xe8aaa5, 0xefa483, 0xe8be9c,
+ /* d1 */ 0xe98cae, 0xe99b87, 0xe9a1a7, 0xe9ab98,
+ /* d5 */ 0xe9bc93, 0xe593ad, 0xe6969b, 0xe69bb2,
+ /* d9 */ 0xe6a28f, 0xe7a980, 0xe8b0b7, 0xe9b5a0,
+ /* dd */ 0xe59bb0, 0xe59da4, 0xe5b491, 0xe69886,
+ /* e1 */ 0xe6a2b1, 0xe6a38d, 0xe6bbbe, 0xe790a8,
+ /* e5 */ 0xe8a29e, 0xe9afa4, 0xe6b1a8, 0xefa484,
+ /* e9 */ 0xe9aaa8, 0xe4be9b, 0xe585ac, 0xe585b1,
+ /* ed */ 0xe58a9f, 0xe5ad94, 0xe5b7a5, 0xe68190,
+ /* f1 */ 0xe681ad, 0xe68bb1, 0xe68ea7, 0xe694bb,
+ /* f5 */ 0xe78f99, 0xe7a9ba, 0xe89aa3, 0xe8b2a2,
+ /* f9 */ 0xe99e8f, 0xe4b8b2, 0xe5afa1, 0xe68888,
+ /* fd */ 0xe69e9c, 0xe7939c,
+
+ /*** Two byte table, leaf: cexx - offset 0x00fc9 ***/
+
+ /* a1 */ 0xe7a791, 0xe88f93, 0xe8aa87, 0xe8aab2,
+ /* a5 */ 0xe8b7a8, 0xe9818e, 0xe98d8b, 0xe9a186,
+ /* a9 */ 0xe5bb93, 0xe6a7a8, 0xe897bf, 0xe983ad,
+ /* ad */ 0xefa485, 0xe586a0, 0xe5ae98, 0xe5afac,
+ /* b1 */ 0xe685a3, 0xe6a3ba, 0xe6acbe, 0xe7818c,
+ /* b5 */ 0xe790af, 0xe79398, 0xe7aea1, 0xe7bd90,
+ /* b9 */ 0xe88f85, 0xe8a780, 0xe8b2ab, 0xe9979c,
+ /* bd */ 0xe9a4a8, 0xe588ae, 0xe6819d, 0xe68bac,
+ /* c1 */ 0xe98082, 0xe4be8a, 0xe58589, 0xe58ca1,
+ /* c5 */ 0xe5a399, 0xe5bba3, 0xe69ba0, 0xe6b4b8,
+ /* c9 */ 0xe7829a, 0xe78b82, 0xe78f96, 0xe7ad90,
+ /* cd */ 0xe883b1, 0xe9919b, 0xe58da6, 0xe68e9b,
+ /* d1 */ 0xe7bdab, 0xe4b996, 0xe58280, 0xe5a18a,
+ /* d5 */ 0xe5a39e, 0xe680aa, 0xe684a7, 0xe68b90,
+ /* d9 */ 0xe6a790, 0xe9ad81, 0xe5ae8f, 0xe7b498,
+ /* dd */ 0xe882b1, 0xe8bd9f, 0xe4baa4, 0xe58391,
+ /* e1 */ 0xe592ac, 0xe596ac, 0xe5ac8c, 0xe5b6a0,
+ /* e5 */ 0xe5b7a7, 0xe694aa, 0xe6958e, 0xe6a0a1,
+ /* e9 */ 0xe6a98b, 0xe78ba1, 0xe79a8e, 0xe79faf,
+ /* ed */ 0xe7b59e, 0xe7bfb9, 0xe886a0, 0xe8958e,
+ /* f1 */ 0xe89b9f, 0xe8bc83, 0xe8bd8e, 0xe9838a,
+ /* f5 */ 0xe9a483, 0xe9a995, 0xe9aeab, 0xe4b898,
+ /* f9 */ 0xe4b985, 0xe4b99d, 0xe4bb87, 0xe4bfb1,
+ /* fd */ 0xe585b7, 0xe58bbe,
+
+ /*** Two byte table, leaf: cfxx - offset 0x01027 ***/
+
+ /* a1 */ 0xe58d80, 0xe58fa3, 0xe58fa5, 0xe5928e,
+ /* a5 */ 0xe59894, 0xe59db5, 0xe59ea2, 0xe5af87,
+ /* a9 */ 0xe5b687, 0xe5bb90, 0xe687bc, 0xe68b98,
+ /* ad */ 0xe69591, 0xe69eb8, 0xe69fa9, 0xe6a78b,
+ /* b1 */ 0xe6ad90, 0xe6af86, 0xe6afac, 0xe6b182,
+ /* b5 */ 0xe6ba9d, 0xe781b8, 0xe78b97, 0xe78e96,
+ /* b9 */ 0xe79083, 0xe79ebf, 0xe79fa9, 0xe7a9b6,
+ /* bd */ 0xe7b5bf, 0xe88089, 0xe887bc, 0xe88885,
+ /* c1 */ 0xe8888a, 0xe88b9f, 0xe8a1a2, 0xe8acb3,
+ /* c5 */ 0xe8b3bc, 0xe8bb80, 0xe98091, 0xe982b1,
+ /* c9 */ 0xe989a4, 0xe98ab6, 0xe9a792, 0xe9a985,
+ /* cd */ 0xe9b3a9, 0xe9b797, 0xe9be9c, 0xe59c8b,
+ /* d1 */ 0xe5b180, 0xe88f8a, 0xe99ea0, 0xe99eab,
+ /* d5 */ 0xe9bab4, 0xe5909b, 0xe7aa98, 0xe7bea4,
+ /* d9 */ 0xe8a399, 0xe8bb8d, 0xe983a1, 0xe5a080,
+ /* dd */ 0xe5b188, 0xe68e98, 0xe7aa9f, 0xe5aeae,
+ /* e1 */ 0xe5bc93, 0xe7a9b9, 0xe7aaae, 0xe88a8e,
+ /* e5 */ 0xe8baac, 0xe580a6, 0xe588b8, 0xe58bb8,
+ /* e9 */ 0xe58db7, 0xe59c88, 0xe68bb3, 0xe68db2,
+ /* ed */ 0xe6ac8a, 0xe6b783, 0xe79cb7, 0xe58ea5,
+ /* f1 */ 0xe78d97, 0xe895a8, 0xe8b9b6, 0xe99795,
+ /* f5 */ 0xe69cba, 0xe6ab83, 0xe6bdb0, 0xe8a9ad,
+ /* f9 */ 0xe8bb8c, 0xe9a58b, 0xefa486, 0xe699b7,
+ /* fd */ 0xe6adb8, 0xe8b2b4,
+
+ /*** Two byte table, leaf: d0xx - offset 0x01085 ***/
+
+ /* a1 */ 0xe9acbc, 0xefa487, 0xe58fab, 0xe59cad,
+ /* a5 */ 0xe5a58e, 0xe68f86, 0xe6a7bb, 0xe78faa,
+ /* a9 */ 0xe7a185, 0xe7aaba, 0xe7ab85, 0xe7b3be,
+ /* ad */ 0xe891b5, 0xe8a68f, 0xe8b5b3, 0xe980b5,
+ /* b1 */ 0xe996a8, 0xe58bbb, 0xe59d87, 0xe79587,
+ /* b5 */ 0xe7ada0, 0xe88f8c, 0xe9889e, 0xefa488,
+ /* b9 */ 0xe6a998, 0xe5858b, 0xe5898b, 0xe58a87,
+ /* bd */ 0xe6889f, 0xe6a398, 0xe6a5b5, 0xe99a99,
+ /* c1 */ 0xe58385, 0xe58aa4, 0xe58ba4, 0xe68783,
+ /* c5 */ 0xe696a4, 0xe6a0b9, 0xe6a7bf, 0xe791be,
+ /* c9 */ 0xe7ad8b, 0xe88ab9, 0xe88fab, 0xe8a6b2,
+ /* cd */ 0xe8acb9, 0xe8bf91, 0xe9a589, 0xefa489,
+ /* d1 */ 0xe4bb8a, 0xe5a697, 0xe69392, 0xe69891,
+ /* d5 */ 0xe6aa8e, 0xe790b4, 0xe7a681, 0xe7a6bd,
+ /* d9 */ 0xe88aa9, 0xe8a1be, 0xe8a1bf, 0xe8a59f,
+ /* dd */ 0xefa48a, 0xe98ca6, 0xe4bc8b, 0xe58f8a,
+ /* e1 */ 0xe680a5, 0xe689b1, 0xe6b1b2, 0xe7b49a,
+ /* e5 */ 0xe7b5a6, 0xe4ba98, 0xe585a2, 0xe79f9c,
+ /* e9 */ 0xe882af, 0xe4bc81, 0xe4bc8e, 0xe585b6,
+ /* ed */ 0xe58680, 0xe5979c, 0xe599a8, 0xe59cbb,
+ /* f1 */ 0xe59fba, 0xe59fbc, 0xe5a494, 0xe5a587,
+ /* f5 */ 0xe5a693, 0xe5af84, 0xe5b290, 0xe5b48e,
+ /* f9 */ 0xe5b7b1, 0xe5b9be, 0xe5bf8c, 0xe68a80,
+ /* fd */ 0xe69797, 0xe697a3,
+
+ /*** Two byte table, leaf: d1xx - offset 0x010e3 ***/
+
+ /* a1 */ 0xe69c9e, 0xe69c9f, 0xe69d9e, 0xe6a38b,
+ /* a5 */ 0xe6a384, 0xe6a99f, 0xe6acba, 0xe6b0a3,
+ /* a9 */ 0xe6b1bd, 0xe6b282, 0xe6b787, 0xe78e98,
+ /* ad */ 0xe790a6, 0xe790aa, 0xe79282, 0xe792a3,
+ /* b1 */ 0xe795b8, 0xe795bf, 0xe7a281, 0xe7a3af,
+ /* b5 */ 0xe7a581, 0xe7a587, 0xe7a588, 0xe7a5ba,
+ /* b9 */ 0xe7ae95, 0xe7b480, 0xe7b6ba, 0xe7be88,
+ /* bd */ 0xe88086, 0xe880ad, 0xe8828c, 0xe8a898,
+ /* c1 */ 0xe8ad8f, 0xe8b188, 0xe8b5b7, 0xe98ca1,
+ /* c5 */ 0xe98ca4, 0xe9a3a2, 0xe9a591, 0xe9a88e,
+ /* c9 */ 0xe9a88f, 0xe9a9a5, 0xe9ba92, 0xe7b78a,
+ /* cd */ 0xe4bdb6, 0xe59089, 0xe68bae, 0xe6a194,
+ /* d1 */ 0xe98791, 0xe596ab, 0xe584ba, 0xefa48b,
+ /* d5 */ 0xefa48c, 0xe5a89c, 0xe687a6, 0xefa48d,
+ /* d9 */ 0xe68b8f, 0xe68bbf, 0xefa48e, 0xefa48f,
+ /* dd */ 0xefa490, 0xefa491, 0xefa492, 0xefa493,
+ /* e1 */ 0xe982a3, 0xefa494, 0xefa495, 0xefa496,
+ /* e5 */ 0xefa497, 0xefa498, 0xe8abbe, 0xefa499,
+ /* e9 */ 0xefa49a, 0xefa49b, 0xefa49c, 0xe69a96,
+ /* ed */ 0xefa49d, 0xe78596, 0xefa49e, 0xefa49f,
+ /* f1 */ 0xe99ba3, 0xefa4a0, 0xe68d8f, 0xe68dba,
+ /* f5 */ 0xe58d97, 0xefa4a1, 0xe69e8f, 0xe6a5a0,
+ /* f9 */ 0xe6b9b3, 0xefa4a2, 0xe794b7, 0xefa4a3,
+ /* fd */ 0xefa4a4, 0xefa4a5,
+
+ /*** Two byte table, leaf: d2xx - offset 0x01141 ***/
+
+ /* a1 */ 0xe7b48d, 0xefa4a6, 0xefa4a7, 0xe8a1b2,
+ /* a5 */ 0xe59b8a, 0xe5a898, 0xefa4a8, 0xefa4a9,
+ /* a9 */ 0xefa4aa, 0xefa4ab, 0xefa4ac, 0xe4b983,
+ /* ad */ 0xefa4ad, 0xe585a7, 0xe5a588, 0xe69fb0,
+ /* b1 */ 0xe88090, 0xefa4ae, 0xe5a5b3, 0xe5b9b4,
+ /* b5 */ 0xe6929a, 0xe7a78a, 0xe5bfb5, 0xe681ac,
+ /* b9 */ 0xe68b88, 0xe68dbb, 0xe5afa7, 0xe5af97,
+ /* bd */ 0xe58aaa, 0xefa4af, 0xe5a5b4, 0xe5bca9,
+ /* c1 */ 0xe68092, 0xefa4b0, 0xefa4b1, 0xefa4b2,
+ /* c5 */ 0xe79199, 0xefa4b3, 0xefa4b4, 0xefa4b5,
+ /* c9 */ 0xefa4b6, 0xefa4b7, 0xefa4b8, 0xe9a791,
+ /* cd */ 0xefa4b9, 0xefa4ba, 0xefa4bb, 0xefa4bc,
+ /* d1 */ 0xefa4bd, 0xefa4be, 0xefa4bf, 0xefa580,
+ /* d5 */ 0xefa581, 0xefa582, 0xefa583, 0xe6bf83,
+ /* d9 */ 0xefa584, 0xefa585, 0xe886bf, 0xe8beb2,
+ /* dd */ 0xe683b1, 0xefa586, 0xefa587, 0xe885a6,
+ /* e1 */ 0xefa588, 0xefa589, 0xe5b0bf, 0xefa58a,
+ /* e5 */ 0xefa58b, 0xefa58c, 0xefa58d, 0xefa58e,
+ /* e9 */ 0xefa58f, 0xefa590, 0xefa591, 0xe5aba9,
+ /* ed */ 0xe8a8a5, 0xe69dbb, 0xe7b490, 0xefa592,
+ /* f1 */ 0xefa593, 0xefa594, 0xefa595, 0xefa596,
+ /* f5 */ 0xefa597, 0xe883bd, 0xefa598, 0xefa599,
+ /* f9 */ 0xe5b0bc, 0xe6b3a5, 0xe58cbf, 0xe6baba,
+ /* fd */ 0xe5a49a, 0xe88cb6,
+
+ /*** Two byte table, leaf: d3xx - offset 0x0119f ***/
+
+ /* a1 */ 0xe4b8b9, 0xe4bab6, 0xe4bd86, 0xe596ae,
+ /* a5 */ 0xe59c98, 0xe5a387, 0xe5bd96, 0xe696b7,
+ /* a9 */ 0xe697a6, 0xe6aa80, 0xe6aeb5, 0xe6b98d,
+ /* ad */ 0xe79fad, 0xe7abaf, 0xe7b09e, 0xe7b79e,
+ /* b1 */ 0xe89b8b, 0xe8a292, 0xe984b2, 0xe98d9b,
+ /* b5 */ 0xe692bb, 0xe6bebe, 0xe78dba, 0xe796b8,
+ /* b9 */ 0xe98194, 0xe59596, 0xe59d8d, 0xe686ba,
+ /* bd */ 0xe69394, 0xe69b87, 0xe6b7a1, 0xe6b99b,
+ /* c1 */ 0xe6bdad, 0xe6beb9, 0xe797b0, 0xe88183,
+ /* c5 */ 0xe886bd, 0xe89581, 0xe8a683, 0xe8ab87,
+ /* c9 */ 0xe8ad9a, 0xe98c9f, 0xe6b293, 0xe79593,
+ /* cd */ 0xe7ad94, 0xe8b88f, 0xe9819d, 0xe59490,
+ /* d1 */ 0xe5a082, 0xe5a198, 0xe5b9a2, 0xe68887,
+ /* d5 */ 0xe6929e, 0xe6a3a0, 0xe795b6, 0xe7b396,
+ /* d9 */ 0xe89eb3, 0xe9bba8, 0xe4bba3, 0xe59e88,
+ /* dd */ 0xe59dae, 0xe5a4a7, 0xe5b08d, 0xe5b2b1,
+ /* e1 */ 0xe5b8b6, 0xe5be85, 0xe688b4, 0xe693a1,
+ /* e5 */ 0xe78eb3, 0xe887ba, 0xe8a28b, 0xe8b2b8,
+ /* e9 */ 0xe99a8a, 0xe9bb9b, 0xe5ae85, 0xe5beb7,
+ /* ed */ 0xe682b3, 0xe58092, 0xe58880, 0xe588b0,
+ /* f1 */ 0xe59c96, 0xe5a0b5, 0xe5a197, 0xe5b08e,
+ /* f5 */ 0xe5b1a0, 0xe5b3b6, 0xe5b68b, 0xe5baa6,
+ /* f9 */ 0xe5be92, 0xe682bc, 0xe68c91, 0xe68e89,
+ /* fd */ 0xe69097, 0xe6a183,
+
+ /*** Two byte table, leaf: d4xx - offset 0x011fd ***/
+
+ /* a1 */ 0xe6a3b9, 0xe6ab82, 0xe6b798, 0xe6b8a1,
+ /* a5 */ 0xe6bb94, 0xe6bfa4, 0xe787be, 0xe79b9c,
+ /* a9 */ 0xe79db9, 0xe7a6b1, 0xe7a8bb, 0xe89084,
+ /* ad */ 0xe8a6a9, 0xe8b3ad, 0xe8b7b3, 0xe8b988,
+ /* b1 */ 0xe98083, 0xe98094, 0xe98193, 0xe983bd,
+ /* b5 */ 0xe98d8d, 0xe999b6, 0xe99f9c, 0xe6af92,
+ /* b9 */ 0xe78086, 0xe78998, 0xe78aa2, 0xe78da8,
+ /* bd */ 0xe79da3, 0xe7a6bf, 0xe7afa4, 0xe7ba9b,
+ /* c1 */ 0xe8ae80, 0xe5a2a9, 0xe68387, 0xe695a6,
+ /* c5 */ 0xe697bd, 0xe69abe, 0xe6b28c, 0xe7849e,
+ /* c9 */ 0xe78789, 0xe8b19a, 0xe9a093, 0xe4b9ad,
+ /* cd */ 0xe7aa81, 0xe4bb9d, 0xe586ac, 0xe5878d,
+ /* d1 */ 0xe58b95, 0xe5908c, 0xe686a7, 0xe69db1,
+ /* d5 */ 0xe6a190, 0xe6a39f, 0xe6b49e, 0xe6bdbc,
+ /* d9 */ 0xe796bc, 0xe79eb3, 0xe7aba5, 0xe883b4,
+ /* dd */ 0xe891a3, 0xe98a85, 0xe5859c, 0xe69697,
+ /* e1 */ 0xe69d9c, 0xe69e93, 0xe79798, 0xe7ab87,
+ /* e5 */ 0xe88db3, 0xefa59a, 0xe8b186, 0xe98097,
+ /* e9 */ 0xe9a0ad, 0xe5b1af, 0xe88780, 0xe88a9a,
+ /* ed */ 0xe98181, 0xe981af, 0xe9888d, 0xe5be97,
+ /* f1 */ 0xe5b69d, 0xe6a999, 0xe78788, 0xe799bb,
+ /* f5 */ 0xe7ad89, 0xe897a4, 0xe8ac84, 0xe984a7,
+ /* f9 */ 0xe9a8b0, 0xe59687, 0xe687b6, 0xefa59b,
+ /* fd */ 0xe799a9, 0xe7be85,
+
+ /*** Two byte table, leaf: d5xx - offset 0x0125b ***/
+
+ /* a1 */ 0xe898bf, 0xe89eba, 0xe8a3b8, 0xe9828f,
+ /* a5 */ 0xefa59c, 0xe6b49b, 0xe78399, 0xe78f9e,
+ /* a9 */ 0xe7b5a1, 0xe890bd, 0xefa59d, 0xe985aa,
+ /* ad */ 0xe9a7b1, 0xefa59e, 0xe4ba82, 0xe58db5,
+ /* b1 */ 0xe6ac84, 0xe6ac92, 0xe780be, 0xe7889b,
+ /* b5 */ 0xe898ad, 0xe9b89e, 0xe5898c, 0xe8bea3,
+ /* b9 */ 0xe5b590, 0xe693a5, 0xe694ac, 0xe6ac96,
+ /* bd */ 0xe6bfab, 0xe7b183, 0xe7ba9c, 0xe8978d,
+ /* c1 */ 0xe8a5a4, 0xe8a6bd, 0xe68b89, 0xe88798,
+ /* c5 */ 0xe8a09f, 0xe5bb8a, 0xe69c97, 0xe6b5aa,
+ /* c9 */ 0xe78bbc, 0xe79085, 0xe791af, 0xe89e82,
+ /* cd */ 0xe9839e, 0xe4be86, 0xe5b48d, 0xe5bea0,
+ /* d1 */ 0xe8908a, 0xe586b7, 0xe68ea0, 0xe795a5,
+ /* d5 */ 0xe4baae, 0xe58086, 0xe585a9, 0xe58789,
+ /* d9 */ 0xe6a281, 0xe6a891, 0xe7b2ae, 0xe7b2b1,
+ /* dd */ 0xe7b3a7, 0xe889af, 0xe8ab92, 0xe8bc9b,
+ /* e1 */ 0xe9878f, 0xe4beb6, 0xe584b7, 0xe58bb5,
+ /* e5 */ 0xe59182, 0xe5bbac, 0xe685ae, 0xe688be,
+ /* e9 */ 0xe69785, 0xe6ab9a, 0xe6bfbe, 0xe7a4aa,
+ /* ed */ 0xe8979c, 0xe8a0a3, 0xe996ad, 0xe9a9a2,
+ /* f1 */ 0xe9a9aa, 0xe9ba97, 0xe9bb8e, 0xe58a9b,
+ /* f5 */ 0xe69b86, 0xe6adb7, 0xe7809d, 0xe7a4ab,
+ /* f9 */ 0xe8bda2, 0xe99d82, 0xe68690, 0xe68880,
+ /* fd */ 0xe694a3, 0xe6bca3,
+
+ /*** Two byte table, leaf: d6xx - offset 0x012b9 ***/
+
+ /* a1 */ 0xe78589, 0xe79289, 0xe7b7b4, 0xe881af,
+ /* a5 */ 0xe893ae, 0xe8bca6, 0xe980a3, 0xe98d8a,
+ /* a9 */ 0xe586bd, 0xe58897, 0xe58aa3, 0xe6b48c,
+ /* ad */ 0xe78388, 0xe8a382, 0xe5bb89, 0xe69682,
+ /* b1 */ 0xe6aeae, 0xe6bf82, 0xe7b0be, 0xe78db5,
+ /* b5 */ 0xe4bba4, 0xe4bcb6, 0xe59bb9, 0xefa59f,
+ /* b9 */ 0xe5b2ba, 0xe5b6ba, 0xe6809c, 0xe78eb2,
+ /* bd */ 0xe7acad, 0xe7be9a, 0xe7bf8e, 0xe88186,
+ /* c1 */ 0xe9809e, 0xe988b4, 0xe99bb6, 0xe99d88,
+ /* c5 */ 0xe9a098, 0xe9bda1, 0xe4be8b, 0xe6bea7,
+ /* c9 */ 0xe7a6ae, 0xe986b4, 0xe99ab7, 0xe58b9e,
+ /* cd */ 0xefa5a0, 0xe69288, 0xe69384, 0xe6ab93,
+ /* d1 */ 0xe6bd9e, 0xe78098, 0xe78890, 0xe79ba7,
+ /* d5 */ 0xe88081, 0xe89886, 0xe8999c, 0xe8b7af,
+ /* d9 */ 0xe8bc85, 0xe99cb2, 0xe9adaf, 0xe9b7ba,
+ /* dd */ 0xe9b9b5, 0xe7a28c, 0xe7a5bf, 0xe7b6a0,
+ /* e1 */ 0xe88f89, 0xe98c84, 0xe9b9bf, 0xe9ba93,
+ /* e5 */ 0xe8ab96, 0xe5a39f, 0xe5bc84, 0xe69ca7,
+ /* e9 */ 0xe780a7, 0xe7938f, 0xe7b1a0, 0xe881be,
+ /* ed */ 0xe584a1, 0xe780a8, 0xe789a2, 0xe7a38a,
+ /* f1 */ 0xe8b382, 0xe8b39a, 0xe8b3b4, 0xe99bb7,
+ /* f5 */ 0xe4ba86, 0xe5839a, 0xe5afae, 0xe5bb96,
+ /* f9 */ 0xe69699, 0xe7878e, 0xe79982, 0xe79ead,
+ /* fd */ 0xe8818a, 0xe893bc,
+
+ /*** Two byte table, leaf: d7xx - offset 0x01317 ***/
+
+ /* a1 */ 0xe981bc, 0xe9aca7, 0xe9be8d, 0xe5a398,
+ /* a5 */ 0xe5a981, 0xe5b1a2, 0xe6a893, 0xe6b79a,
+ /* a9 */ 0xe6bc8f, 0xe798bb, 0xe7b4af, 0xe7b8b7,
+ /* ad */ 0xe8949e, 0xe8a4b8, 0xe98fa4, 0xe9998b,
+ /* b1 */ 0xe58a89, 0xe69792, 0xe69fb3, 0xe6a6b4,
+ /* b5 */ 0xe6b581, 0xe6ba9c, 0xe7808f, 0xe79089,
+ /* b9 */ 0xe791a0, 0xe79599, 0xe798a4, 0xe7a1ab,
+ /* bd */ 0xe8acac, 0xe9a19e, 0xe585ad, 0xe688ae,
+ /* c1 */ 0xe999b8, 0xe4be96, 0xe580ab, 0xe5b499,
+ /* c5 */ 0xe6b7aa, 0xe7b6b8, 0xe8bcaa, 0xe5be8b,
+ /* c9 */ 0xe68584, 0xe6a097, 0xefa5a1, 0xe99a86,
+ /* cd */ 0xe58b92, 0xe8828b, 0xe5879c, 0xe5878c,
+ /* d1 */ 0xe6a59e, 0xe7a89c, 0xe7b6be, 0xe88fb1,
+ /* d5 */ 0xe999b5, 0xe4bf9a, 0xe588a9, 0xe58e98,
+ /* d9 */ 0xe5908f, 0xe5948e, 0xe5b1a5, 0xe682a7,
+ /* dd */ 0xe69d8e, 0xe6a2a8, 0xe6b5ac, 0xe78a81,
+ /* e1 */ 0xe78bb8, 0xe79086, 0xe79283, 0xefa5a2,
+ /* e5 */ 0xe797a2, 0xe7b1ac, 0xe7bdb9, 0xe7beb8,
+ /* e9 */ 0xe88e89, 0xe8a38f, 0xe8a3a1, 0xe9878c,
+ /* ed */ 0xe98790, 0xe99ba2, 0xe9af89, 0xe5909d,
+ /* f1 */ 0xe6bdbe, 0xe78790, 0xe79298, 0xe897ba,
+ /* f5 */ 0xe8baaa, 0xe99aa3, 0xe9b197, 0xe9ba9f,
+ /* f9 */ 0xe69e97, 0xe6b78b, 0xe790b3, 0xe887a8,
+ /* fd */ 0xe99c96, 0xe7a0ac,
+
+ /*** Two byte table, leaf: d8xx - offset 0x01375 ***/
+
+ /* a1 */ 0xe7ab8b, 0xe7aca0, 0xe7b292, 0xe691a9,
+ /* a5 */ 0xe791aa, 0xe797b2, 0xe7a2bc, 0xe7a3a8,
+ /* a9 */ 0xe9a6ac, 0xe9ad94, 0xe9babb, 0xe5af9e,
+ /* ad */ 0xe5b995, 0xe6bca0, 0xe8869c, 0xe88eab,
+ /* b1 */ 0xe98288, 0xe4b887, 0xe58d8d, 0xe5a8a9,
+ /* b5 */ 0xe5b792, 0xe5bd8e, 0xe685a2, 0xe68cbd,
+ /* b9 */ 0xe699a9, 0xe69bbc, 0xe6bbbf, 0xe6bcab,
+ /* bd */ 0xe781a3, 0xe79e9e, 0xe890ac, 0xe89493,
+ /* c1 */ 0xe8a0bb, 0xe8bc93, 0xe9a585, 0xe9b0bb,
+ /* c5 */ 0xe5949c, 0xe68ab9, 0xe69cab, 0xe6b2ab,
+ /* c9 */ 0xe88c89, 0xe8a5aa, 0xe99dba, 0xe4baa1,
+ /* cd */ 0xe5a684, 0xe5bf98, 0xe5bf99, 0xe69c9b,
+ /* d1 */ 0xe7b6b2, 0xe7bd94, 0xe88a92, 0xe88cab,
+ /* d5 */ 0xe88ebd, 0xe8bc9e, 0xe98299, 0xe59f8b,
+ /* d9 */ 0xe5a6b9, 0xe5aa92, 0xe5af90, 0xe698a7,
+ /* dd */ 0xe69e9a, 0xe6a285, 0xe6af8f, 0xe785a4,
+ /* e1 */ 0xe7bdb5, 0xe8b2b7, 0xe8b3a3, 0xe98281,
+ /* e5 */ 0xe9ad85, 0xe88488, 0xe8b28a, 0xe9998c,
+ /* e9 */ 0xe9a980, 0xe9baa5, 0xe5ad9f, 0xe6b093,
+ /* ed */ 0xe78c9b, 0xe79bb2, 0xe79b9f, 0xe8908c,
+ /* f1 */ 0xe586aa, 0xe8a693, 0xe5858d, 0xe58695,
+ /* f5 */ 0xe58b89, 0xe6a389, 0xe6b294, 0xe79c84,
+ /* f9 */ 0xe79ca0, 0xe7b6bf, 0xe7b7ac, 0xe99da2,
+ /* fd */ 0xe9bab5, 0xe6bb85,
+
+ /*** Two byte table, leaf: d9xx - offset 0x013d3 ***/
+
+ /* a1 */ 0xe89491, 0xe586a5, 0xe5908d, 0xe591bd,
+ /* a5 */ 0xe6988e, 0xe69a9d, 0xe6a4a7, 0xe6ba9f,
+ /* a9 */ 0xe79abf, 0xe79e91, 0xe88c97, 0xe89382,
+ /* ad */ 0xe89e9f, 0xe985a9, 0xe98a98, 0xe9b3b4,
+ /* b1 */ 0xe8a282, 0xe4beae, 0xe58692, 0xe58b9f,
+ /* b5 */ 0xe5a786, 0xe5b8bd, 0xe68595, 0xe691b8,
+ /* b9 */ 0xe691b9, 0xe69aae, 0xe69f90, 0xe6a8a1,
+ /* bd */ 0xe6af8d, 0xe6af9b, 0xe7899f, 0xe789a1,
+ /* c1 */ 0xe79181, 0xe79cb8, 0xe79f9b, 0xe88097,
+ /* c5 */ 0xe88abc, 0xe88c85, 0xe8ac80, 0xe8aca8,
+ /* c9 */ 0xe8b28c, 0xe69ca8, 0xe6b290, 0xe789a7,
+ /* cd */ 0xe79bae, 0xe79da6, 0xe7a986, 0xe9b6a9,
+ /* d1 */ 0xe6adbf, 0xe6b292, 0xe5a4a2, 0xe69ca6,
+ /* d5 */ 0xe89299, 0xe58daf, 0xe5a293, 0xe5a699,
+ /* d9 */ 0xe5bb9f, 0xe68f8f, 0xe698b4, 0xe69db3,
+ /* dd */ 0xe6b8ba, 0xe78cab, 0xe7ab97, 0xe88b97,
+ /* e1 */ 0xe98ca8, 0xe58b99, 0xe5b7ab, 0xe686ae,
+ /* e5 */ 0xe6878b, 0xe6888a, 0xe68b87, 0xe692ab,
+ /* e9 */ 0xe697a0, 0xe6a599, 0xe6ada6, 0xe6af8b,
+ /* ed */ 0xe784a1, 0xe78fb7, 0xe7959d, 0xe7b986,
+ /* f1 */ 0xe8889e, 0xe88c82, 0xe895aa, 0xe8aaa3,
+ /* f5 */ 0xe8b2bf, 0xe99ca7, 0xe9b5a1, 0xe5a2a8,
+ /* f9 */ 0xe9bb98, 0xe58091, 0xe5888e, 0xe590bb,
+ /* fd */ 0xe5958f, 0xe69687,
+
+ /*** Two byte table, leaf: daxx - offset 0x01431 ***/
+
+ /* a1 */ 0xe6b1b6, 0xe7b48a, 0xe7b48b, 0xe8819e,
+ /* a5 */ 0xe89a8a, 0xe99680, 0xe99baf, 0xe58bbf,
+ /* a9 */ 0xe6b295, 0xe789a9, 0xe591b3, 0xe5aa9a,
+ /* ad */ 0xe5b0be, 0xe5b58b, 0xe5bd8c, 0xe5beae,
+ /* b1 */ 0xe69caa, 0xe6a2b6, 0xe6a5a3, 0xe6b8bc,
+ /* b5 */ 0xe6b984, 0xe79c89, 0xe7b1b3, 0xe7be8e,
+ /* b9 */ 0xe89687, 0xe8ac8e, 0xe8bfb7, 0xe99da1,
+ /* bd */ 0xe9bbb4, 0xe5b2b7, 0xe682b6, 0xe6848d,
+ /* c1 */ 0xe686ab, 0xe6958f, 0xe697bb, 0xe697bc,
+ /* c5 */ 0xe6b091, 0xe6b3af, 0xe78e9f, 0xe78f89,
+ /* c9 */ 0xe7b7a1, 0xe99694, 0xe5af86, 0xe89c9c,
+ /* cd */ 0xe8ac90, 0xe5899d, 0xe58d9a, 0xe68b8d,
+ /* d1 */ 0xe6908f, 0xe692b2, 0xe69cb4, 0xe6a8b8,
+ /* d5 */ 0xe6b38a, 0xe78f80, 0xe7929e, 0xe7ae94,
+ /* d9 */ 0xe7b295, 0xe7b89b, 0xe8868a, 0xe888b6,
+ /* dd */ 0xe89684, 0xe8bfab, 0xe99bb9, 0xe9a781,
+ /* e1 */ 0xe4bcb4, 0xe58d8a, 0xe58f8d, 0xe58f9b,
+ /* e5 */ 0xe68b8c, 0xe690ac, 0xe69480, 0xe69691,
+ /* e9 */ 0xe6a783, 0xe6b3ae, 0xe6bd98, 0xe78fad,
+ /* ed */ 0xe79594, 0xe798a2, 0xe79ba4, 0xe79bbc,
+ /* f1 */ 0xe7a390, 0xe7a3bb, 0xe7a4ac, 0xe7b586,
+ /* f5 */ 0xe888ac, 0xe89fa0, 0xe8bf94, 0xe9a092,
+ /* f9 */ 0xe9a3af, 0xe58b83, 0xe68b94, 0xe692a5,
+ /* fd */ 0xe6b8a4, 0xe6bd91,
+
+ /*** Two byte table, leaf: dbxx - offset 0x0148f ***/
+
+ /* a1 */ 0xe799bc, 0xe8b78b, 0xe986b1, 0xe989a2,
+ /* a5 */ 0xe9abae, 0xe9ad83, 0xe580a3, 0xe5828d,
+ /* a9 */ 0xe59d8a, 0xe5a6a8, 0xe5b0a8, 0xe5b987,
+ /* ad */ 0xe5bdb7, 0xe688bf, 0xe694be, 0xe696b9,
+ /* b1 */ 0xe69781, 0xe69889, 0xe69e8b, 0xe6a69c,
+ /* b5 */ 0xe6bb82, 0xe7a385, 0xe7b4a1, 0xe882aa,
+ /* b9 */ 0xe88680, 0xe888ab, 0xe88ab3, 0xe892a1,
+ /* bd */ 0xe89a8c, 0xe8a8aa, 0xe8ac97, 0xe982a6,
+ /* c1 */ 0xe998b2, 0xe9be90, 0xe5808d, 0xe4bfb3,
+ /* c5 */ 0xefa5a3, 0xe59fb9, 0xe5be98, 0xe68b9c,
+ /* c9 */ 0xe68e92, 0xe69daf, 0xe6b983, 0xe78499,
+ /* cd */ 0xe79b83, 0xe8838c, 0xe8839a, 0xe8a3b4,
+ /* d1 */ 0xe8a3b5, 0xe8a499, 0xe8b3a0, 0xe8bca9,
+ /* d5 */ 0xe9858d, 0xe999aa, 0xe4bcaf, 0xe4bdb0,
+ /* d9 */ 0xe5b89b, 0xe69f8f, 0xe6a0a2, 0xe799bd,
+ /* dd */ 0xe799be, 0xe9ad84, 0xe5b9a1, 0xe6a88a,
+ /* e1 */ 0xe785a9, 0xe78794, 0xe795aa, 0xefa5a4,
+ /* e5 */ 0xe7b981, 0xe89583, 0xe897a9, 0xe9a39c,
+ /* e9 */ 0xe4bc90, 0xe7ad8f, 0xe7bdb0, 0xe996a5,
+ /* ed */ 0xe587a1, 0xe5b886, 0xe6a2b5, 0xe6b0be,
+ /* f1 */ 0xe6b18e, 0xe6b39b, 0xe78aaf, 0xe7af84,
+ /* f5 */ 0xe88c83, 0xe6b395, 0xe790ba, 0xe583bb,
+ /* f9 */ 0xe58a88, 0xe5a381, 0xe69398, 0xe6aa97,
+ /* fd */ 0xe792a7, 0xe79996,
+
+ /*** Two byte table, leaf: dcxx - offset 0x014ed ***/
+
+ /* a1 */ 0xe7a2a7, 0xe89897, 0xe997a2, 0xe99cb9,
+ /* a5 */ 0xefa5a5, 0xe58d9e, 0xe5bc81, 0xe8ae8a,
+ /* a9 */ 0xe8bea8, 0xe8beaf, 0xe9828a, 0xe588a5,
+ /* ad */ 0xe79ea5, 0xe9b189, 0xe9bc88, 0xe4b899,
+ /* b1 */ 0xe58082, 0xe585b5, 0xe5b19b, 0xe5b9b7,
+ /* b5 */ 0xe6989e, 0xe698ba, 0xe69f84, 0xe6a385,
+ /* b9 */ 0xe782b3, 0xe79481, 0xe79785, 0xe7a789,
+ /* bd */ 0xe7ab9d, 0xe8bca7, 0xe9a4a0, 0xe9a888,
+ /* c1 */ 0xe4bf9d, 0xe5a0a1, 0xe5a0b1, 0xe5afb6,
+ /* c5 */ 0xe699ae, 0xe6ada5, 0xe6b491, 0xe6b9ba,
+ /* c9 */ 0xe6bdbd, 0xe78fa4, 0xe794ab, 0xe88fa9,
+ /* cd */ 0xe8a39c, 0xe8a493, 0xe8ad9c, 0xe8bc94,
+ /* d1 */ 0xe4bc8f, 0xe58395, 0xe58c90, 0xe58d9c,
+ /* d5 */ 0xe5ae93, 0xe5bea9, 0xe69c8d, 0xe7a68f,
+ /* d9 */ 0xe885b9, 0xe88caf, 0xe89494, 0xe8a487,
+ /* dd */ 0xe8a686, 0xe8bcb9, 0xe8bcbb, 0xe9a6a5,
+ /* e1 */ 0xe9b092, 0xe69cac, 0xe4b9b6, 0xe4bfb8,
+ /* e5 */ 0xe5a589, 0xe5b081, 0xe5b3af, 0xe5b3b0,
+ /* e9 */ 0xe68da7, 0xe6a392, 0xe783bd, 0xe786a2,
+ /* ed */ 0xe790ab, 0xe7b8ab, 0xe893ac, 0xe89c82,
+ /* f1 */ 0xe980a2, 0xe98b92, 0xe9b3b3, 0xe4b88d,
+ /* f5 */ 0xe4bb98, 0xe4bfaf, 0xe58285, 0xe58996,
+ /* f9 */ 0xe589af, 0xe590a6, 0xe59290, 0xe59fa0,
+ /* fd */ 0xe5a4ab, 0xe5a9a6,
+
+ /*** Two byte table, leaf: ddxx - offset 0x0154b ***/
+
+ /* a1 */ 0xe5ad9a, 0xe5adb5, 0xe5af8c, 0xe5ba9c,
+ /* a5 */ 0xefa5a6, 0xe689b6, 0xe695b7, 0xe696a7,
+ /* a9 */ 0xe6b5ae, 0xe6baa5, 0xe788b6, 0xe7aca6,
+ /* ad */ 0xe7b0bf, 0xe7bcb6, 0xe88590, 0xe88591,
+ /* b1 */ 0xe8869a, 0xe88980, 0xe88a99, 0xe88ea9,
+ /* b5 */ 0xe8a883, 0xe8b2a0, 0xe8b3a6, 0xe8b3bb,
+ /* b9 */ 0xe8b5b4, 0xe8b6ba, 0xe983a8, 0xe9879c,
+ /* bd */ 0xe9989c, 0xe99984, 0xe9a799, 0xe9b3a7,
+ /* c1 */ 0xe58c97, 0xe58886, 0xe590a9, 0xe599b4,
+ /* c5 */ 0xe5a2b3, 0xe5a594, 0xe5a5ae, 0xe5bfbf,
+ /* c9 */ 0xe686a4, 0xe689ae, 0xe69890, 0xe6b1be,
+ /* cd */ 0xe7849a, 0xe79b86, 0xe7b289, 0xe7b39e,
+ /* d1 */ 0xe7b49b, 0xe88aac, 0xe8b381, 0xe99bb0,
+ /* d5 */ 0xefa5a7, 0xe4bd9b, 0xe5bc97, 0xe5bdbf,
+ /* d9 */ 0xe68b82, 0xe5b4a9, 0xe69c8b, 0xe6a39a,
+ /* dd */ 0xe7a1bc, 0xe7b983, 0xe9b5ac, 0xe4b895,
+ /* e1 */ 0xe58299, 0xe58c95, 0xe58caa, 0xe58d91,
+ /* e5 */ 0xe5a683, 0xe5a9a2, 0xe5ba87, 0xe682b2,
+ /* e9 */ 0xe6868a, 0xe68989, 0xe689b9, 0xe69690,
+ /* ed */ 0xe69e87, 0xe6a6a7, 0xe6af94, 0xe6af96,
+ /* f1 */ 0xe6af97, 0xe6af98, 0xe6b2b8, 0xefa5a8,
+ /* f5 */ 0xe790b5, 0xe797ba, 0xe7a092, 0xe7a291,
+ /* f9 */ 0xe7a795, 0xe7a798, 0xe7b283, 0xe7b78b,
+ /* fd */ 0xe7bfa1, 0xe882a5,
+
+ /*** Two byte table, leaf: dexx - offset 0x015a9 ***/
+
+ /* a1 */ 0xe884be, 0xe88782, 0xe88fb2, 0xe89c9a,
+ /* a5 */ 0xe8a3a8, 0xe8aab9, 0xe8adac, 0xe8b2bb,
+ /* a9 */ 0xe98499, 0xe99d9e, 0xe9a39b, 0xe9bcbb,
+ /* ad */ 0xe59aac, 0xe5acaa, 0xe5bdac, 0xe6968c,
+ /* b1 */ 0xe6aab3, 0xe6aeaf, 0xe6b59c, 0xe6bfb1,
+ /* b5 */ 0xe78095, 0xe7899d, 0xe78ead, 0xe8b2a7,
+ /* b9 */ 0xe8b393, 0xe9a0bb, 0xe68691, 0xe6b0b7,
+ /* bd */ 0xe88198, 0xe9a881, 0xe4b98d, 0xe4ba8b,
+ /* c1 */ 0xe4ba9b, 0xe4bb95, 0xe4bcba, 0xe4bcbc,
+ /* c5 */ 0xe4bdbf, 0xe4bf9f, 0xe583bf, 0xe58fb2,
+ /* c9 */ 0xe58fb8, 0xe59486, 0xe597a3, 0xe59b9b,
+ /* cd */ 0xe5a3ab, 0xe5a5a2, 0xe5a891, 0xe5afab,
+ /* d1 */ 0xe5afba, 0xe5b084, 0xe5b7b3, 0xe5b8ab,
+ /* d5 */ 0xe5be99, 0xe6809d, 0xe68da8, 0xe6969c,
+ /* d9 */ 0xe696af, 0xe69fb6, 0xe69fbb, 0xe6a2ad,
+ /* dd */ 0xe6adbb, 0xe6b299, 0xe6b397, 0xe6b8a3,
+ /* e1 */ 0xe78089, 0xe78d85, 0xe7a082, 0xe7a4be,
+ /* e5 */ 0xe7a580, 0xe7a5a0, 0xe7a781, 0xe7afa9,
+ /* e9 */ 0xe7b497, 0xe7b5b2, 0xe88286, 0xe8888d,
+ /* ed */ 0xe88e8e, 0xe89391, 0xe89b87, 0xe8a39f,
+ /* f1 */ 0xe8a990, 0xe8a99e, 0xe8ac9d, 0xe8b39c,
+ /* f5 */ 0xe8b5a6, 0xe8bead, 0xe982aa, 0xe9a3bc,
+ /* f9 */ 0xe9a79f, 0xe9ba9d, 0xe5898a, 0xefa5a9,
+ /* fd */ 0xe69c94, 0xefa5aa,
+
+ /*** Two byte table, leaf: dfxx - offset 0x01607 ***/
+
+ /* a1 */ 0xe58298, 0xe588aa, 0xe5b1b1, 0xe695a3,
+ /* a5 */ 0xe6b195, 0xe78f8a, 0xe794a3, 0xe7969d,
+ /* a9 */ 0xe7ae97, 0xe8929c, 0xe985b8, 0xe99cb0,
+ /* ad */ 0xe4b9b7, 0xe69292, 0xe6aeba, 0xe7859e,
+ /* b1 */ 0xe896a9, 0xe4b889, 0xefa5ab, 0xe69d89,
+ /* b5 */ 0xe6a3ae, 0xe6b897, 0xe88a9f, 0xe89498,
+ /* b9 */ 0xe8a1ab, 0xe68fb7, 0xe6be81, 0xe98892,
+ /* bd */ 0xe9a2af, 0xe4b88a, 0xe582b7, 0xe5838f,
+ /* c1 */ 0xe5849f, 0xe59586, 0xe596aa, 0xe59897,
+ /* c5 */ 0xe5ad80, 0xe5b099, 0xe5b3a0, 0xe5b8b8,
+ /* c9 */ 0xe5ba8a, 0xe5baa0, 0xe5bb82, 0xe683b3,
+ /* cd */ 0xe6a191, 0xe6a9a1, 0xe6b998, 0xe788bd,
+ /* d1 */ 0xe78980, 0xe78b80, 0xe79bb8, 0xe7a5a5,
+ /* d5 */ 0xe7aeb1, 0xe7bf94, 0xe8a3b3, 0xe8a7b4,
+ /* d9 */ 0xe8a9b3, 0xe8b1a1, 0xe8b39e, 0xe99c9c,
+ /* dd */ 0xe5a19e, 0xe792bd, 0xe8b3bd, 0xe59787,
+ /* e1 */ 0xefa5ac, 0xe7a9a1, 0xe7b4a2, 0xe889b2,
+ /* e5 */ 0xe789b2, 0xe7949f, 0xe794a5, 0xefa5ad,
+ /* e9 */ 0xe7ac99, 0xe5a285, 0xe5a3bb, 0xe5b6bc,
+ /* ed */ 0xe5ba8f, 0xe5bab6, 0xe5be90, 0xe68195,
+ /* f1 */ 0xe68a92, 0xe68dbf, 0xe6958d, 0xe69a91,
+ /* f5 */ 0xe69b99, 0xe69bb8, 0xe6a096, 0xe6a3b2,
+ /* f9 */ 0xe78a80, 0xe7919e, 0xe7adae, 0xe7b5ae,
+ /* fd */ 0xe7b796, 0xe7bdb2,
+
+ /*** Two byte table, leaf: e0xx - offset 0x01665 ***/
+
+ /* a1 */ 0xe883a5, 0xe88892, 0xe896af, 0xe8a5bf,
+ /* a5 */ 0xe8aa93, 0xe9809d, 0xe98ba4, 0xe9bb8d,
+ /* a9 */ 0xe9bca0, 0xe5a495, 0xe5a5ad, 0xe5b8ad,
+ /* ad */ 0xe6839c, 0xe69894, 0xe699b3, 0xe69e90,
+ /* b1 */ 0xe6b190, 0xe6b785, 0xe6bd9f, 0xe79fb3,
+ /* b5 */ 0xe7a2a9, 0xe89386, 0xe9878b, 0xe98cab,
+ /* b9 */ 0xe4bb99, 0xe5838a, 0xe58588, 0xe59684,
+ /* bd */ 0xe5ac8b, 0xe5aea3, 0xe68987, 0xe695be,
+ /* c1 */ 0xe6978b, 0xe6b8b2, 0xe785bd, 0xe79081,
+ /* c5 */ 0xe79184, 0xe79287, 0xe792bf, 0xe799ac,
+ /* c9 */ 0xe7a6aa, 0xe7b79a, 0xe7b995, 0xe7bea8,
+ /* cd */ 0xe885ba, 0xe886b3, 0xe888b9, 0xe8989a,
+ /* d1 */ 0xe89fac, 0xe8a9b5, 0xe8b7a3, 0xe981b8,
+ /* d5 */ 0xe98a91, 0xe990a5, 0xe9a58d, 0xe9aeae,
+ /* d9 */ 0xe58da8, 0xe5b191, 0xe6a594, 0xe6b384,
+ /* dd */ 0xe6b4a9, 0xe6b8ab, 0xe8888c, 0xe8969b,
+ /* e1 */ 0xe8a4bb, 0xe8a8ad, 0xe8aaaa, 0xe99baa,
+ /* e5 */ 0xe9bda7, 0xe589a1, 0xe69ab9, 0xe6aeb2,
+ /* e9 */ 0xe7ba96, 0xe89fbe, 0xe8b48d, 0xe99683,
+ /* ed */ 0xe9999d, 0xe6949d, 0xe6b689, 0xe787ae,
+ /* f1 */ 0xefa5ae, 0xe59f8e, 0xe5a793, 0xe5aeac,
+ /* f5 */ 0xe680a7, 0xe683ba, 0xe68890, 0xe6989f,
+ /* f9 */ 0xe6999f, 0xe78ca9, 0xe78fb9, 0xe79b9b,
+ /* fd */ 0xe79c81, 0xe7adac,
+
+ /*** Two byte table, leaf: e1xx - offset 0x016c3 ***/
+
+ /* a1 */ 0xe88196, 0xe881b2, 0xe885a5, 0xe8aaa0,
+ /* a5 */ 0xe98692, 0xe4b896, 0xe58ba2, 0xe6adb2,
+ /* a9 */ 0xe6b497, 0xe7a885, 0xe7acb9, 0xe7b4b0,
+ /* ad */ 0xefa5af, 0xe8b2b0, 0xe58fac, 0xe598af,
+ /* b1 */ 0xe5a191, 0xe5aeb5, 0xe5b08f, 0xe5b091,
+ /* b5 */ 0xe5b7a2, 0xe68980, 0xe68e83, 0xe69094,
+ /* b9 */ 0xe698ad, 0xe6a2b3, 0xe6b2bc, 0xe6b688,
+ /* bd */ 0xe6baaf, 0xe7809f, 0xe782a4, 0xe78792,
+ /* c1 */ 0xe794a6, 0xe7968f, 0xe7968e, 0xe79899,
+ /* c5 */ 0xe7ac91, 0xe7afa0, 0xe7b0ab, 0xe7b4a0,
+ /* c9 */ 0xe7b4b9, 0xe894ac, 0xe895ad, 0xe89887,
+ /* cd */ 0xe8a8b4, 0xe9808d, 0xe981a1, 0xe982b5,
+ /* d1 */ 0xe98ab7, 0xe99fb6, 0xe9a8b7, 0xe4bf97,
+ /* d5 */ 0xe5b1ac, 0xe69d9f, 0xe6b691, 0xe7b29f,
+ /* d9 */ 0xe7ba8c, 0xe8ac96, 0xe8b496, 0xe9809f,
+ /* dd */ 0xe5adab, 0xe5b7bd, 0xe6908d, 0xe89380,
+ /* e1 */ 0xe9819c, 0xe9a3a1, 0xe78e87, 0xe5ae8b,
+ /* e5 */ 0xe6829a, 0xe69dbe, 0xe6b79e, 0xe8a89f,
+ /* e9 */ 0xe8aaa6, 0xe98081, 0xe9a08c, 0xe588b7,
+ /* ed */ 0xefa5b0, 0xe78191, 0xe7a28e, 0xe98e96,
+ /* f1 */ 0xe8a1b0, 0xe98797, 0xe4bfae, 0xe58f97,
+ /* f5 */ 0xe597bd, 0xe59b9a, 0xe59e82, 0xe5a3bd,
+ /* f9 */ 0xe5ab82, 0xe5ae88, 0xe5b2ab, 0xe5b380,
+ /* fd */ 0xe5b8a5, 0xe68481,
+
+ /*** Two byte table, leaf: e2xx - offset 0x01721 ***/
+
+ /* a1 */ 0xe6888d, 0xe6898b, 0xe68e88, 0xe6909c,
+ /* a5 */ 0xe694b6, 0xe695b8, 0xe6a8b9, 0xe6ae8a,
+ /* a9 */ 0xe6b0b4, 0xe6b499, 0xe6bcb1, 0xe787a7,
+ /* ad */ 0xe78ba9, 0xe78db8, 0xe79087, 0xe792b2,
+ /* b1 */ 0xe798a6, 0xe79da1, 0xe7a780, 0xe7a997,
+ /* b5 */ 0xe7abaa, 0xe7b2b9, 0xe7b68f, 0xe7b6ac,
+ /* b9 */ 0xe7b9a1, 0xe7be9e, 0xe884a9, 0xe88cb1,
+ /* bd */ 0xe89290, 0xe8939a, 0xe897aa, 0xe8a296,
+ /* c1 */ 0xe8aab0, 0xe8ae90, 0xe8bcb8, 0xe98182,
+ /* c5 */ 0xe98283, 0xe985ac, 0xe98a96, 0xe98ab9,
+ /* c9 */ 0xe99a8b, 0xe99aa7, 0xe99aa8, 0xe99b96,
+ /* cd */ 0xe99c80, 0xe9a088, 0xe9a696, 0xe9ab93,
+ /* d1 */ 0xe9ac9a, 0xe58f94, 0xe5a1be, 0xe5a499,
+ /* d5 */ 0xe5adb0, 0xe5aebf, 0xe6b791, 0xe6bd9a,
+ /* d9 */ 0xe7869f, 0xe790a1, 0xe792b9, 0xe88285,
+ /* dd */ 0xe88fbd, 0xe5b7a1, 0xe5be87, 0xe5beaa,
+ /* e1 */ 0xe68182, 0xe697ac, 0xe6a092, 0xe6a5af,
+ /* e5 */ 0xe6a993, 0xe6ae89, 0xe6b4b5, 0xe6b7b3,
+ /* e9 */ 0xe78fa3, 0xe79bbe, 0xe79eac, 0xe7ad8d,
+ /* ed */ 0xe7b494, 0xe884a3, 0xe8889c, 0xe88d80,
+ /* f1 */ 0xe893b4, 0xe895a3, 0xe8a9a2, 0xe8ab84,
+ /* f5 */ 0xe98687, 0xe98c9e, 0xe9a086, 0xe9a6b4,
+ /* f9 */ 0xe6888c, 0xe8a193, 0xe8bfb0, 0xe989a5,
+ /* fd */ 0xe5b487, 0xe5b4a7,
+
+ /*** Two byte table, leaf: e3xx - offset 0x0177f ***/
+
+ /* a1 */ 0xe5b5a9, 0xe7919f, 0xe8869d, 0xe89da8,
+ /* a5 */ 0xe6bf95, 0xe68bbe, 0xe7bf92, 0xe8a4b6,
+ /* a9 */ 0xe8a5b2, 0xe4b89e, 0xe4b998, 0xe583a7,
+ /* ad */ 0xe58b9d, 0xe58d87, 0xe689bf, 0xe69887,
+ /* b1 */ 0xe7b9a9, 0xe8a085, 0xe9999e, 0xe4be8d,
+ /* b5 */ 0xe58c99, 0xe598b6, 0xe5a78b, 0xe5aaa4,
+ /* b9 */ 0xe5b0b8, 0xe5b18e, 0xe5b18d, 0xe5b882,
+ /* bd */ 0xe5bc91, 0xe68183, 0xe696bd, 0xe698af,
+ /* c1 */ 0xe69982, 0xe69ebe, 0xe69fb4, 0xe78c9c,
+ /* c5 */ 0xe79fa2, 0xe7a4ba, 0xe7bf85, 0xe89294,
+ /* c9 */ 0xe8938d, 0xe8a696, 0xe8a9a6, 0xe8a9a9,
+ /* cd */ 0xe8aba1, 0xe8b195, 0xe8b1ba, 0xe59fb4,
+ /* d1 */ 0xe5af94, 0xe5bc8f, 0xe681af, 0xe68bad,
+ /* d5 */ 0xe6a48d, 0xe6ae96, 0xe6b99c, 0xe78684,
+ /* d9 */ 0xe7af92, 0xe89d95, 0xe8ad98, 0xe8bbbe,
+ /* dd */ 0xe9a39f, 0xe9a3be, 0xe4bcb8, 0xe4be81,
+ /* e1 */ 0xe4bfa1, 0xe591bb, 0xe5a8a0, 0xe5aeb8,
+ /* e5 */ 0xe684bc, 0xe696b0, 0xe699a8, 0xe787bc,
+ /* e9 */ 0xe794b3, 0xe7a59e, 0xe7b4b3, 0xe8858e,
+ /* ed */ 0xe887a3, 0xe88e98, 0xe896aa, 0xe8978e,
+ /* f1 */ 0xe89c83, 0xe8a88a, 0xe8baab, 0xe8be9b,
+ /* f5 */ 0xefa5b1, 0xe8bf85, 0xe5a4b1, 0xe5aea4,
+ /* f9 */ 0xe5afa6, 0xe68289, 0xe5afa9, 0xe5b08b,
+ /* fd */ 0xe5bf83, 0xe6b281,
+
+ /*** Two byte table, leaf: e4xx - offset 0x017dd ***/
+
+ /* a1 */ 0xefa5b2, 0xe6b7b1, 0xe7808b, 0xe7949a,
+ /* a5 */ 0xe88aaf, 0xe8abb6, 0xe4bb80, 0xe58d81,
+ /* a9 */ 0xefa5b3, 0xe99b99, 0xe6b08f, 0xe4ba9e,
+ /* ad */ 0xe4bf84, 0xe58592, 0xe5959e, 0xe5a8a5,
+ /* b1 */ 0xe5b3a8, 0xe68891, 0xe78999, 0xe88abd,
+ /* b5 */ 0xe88eaa, 0xe89bbe, 0xe8a199, 0xe8a89d,
+ /* b9 */ 0xe998bf, 0xe99b85, 0xe9a493, 0xe9b489,
+ /* bd */ 0xe9b59d, 0xe5a08a, 0xe5b2b3, 0xe5b6bd,
+ /* c1 */ 0xe5b984, 0xe683a1, 0xe68495, 0xe68fa1,
+ /* c5 */ 0xe6a882, 0xe6b8a5, 0xe98482, 0xe98d94,
+ /* c9 */ 0xe9a18e, 0xe9b090, 0xe9bdb7, 0xe5ae89,
+ /* cd */ 0xe5b2b8, 0xe68c89, 0xe6998f, 0xe6a188,
+ /* d1 */ 0xe79cbc, 0xe99b81, 0xe99e8d, 0xe9a194,
+ /* d5 */ 0xe9ae9f, 0xe696a1, 0xe8ac81, 0xe8bb8b,
+ /* d9 */ 0xe996bc, 0xe594b5, 0xe5b2a9, 0xe5b796,
+ /* dd */ 0xe5bab5, 0xe69a97, 0xe7998c, 0xe88fb4,
+ /* e1 */ 0xe99787, 0xe5a393, 0xe68abc, 0xe78b8e,
+ /* e5 */ 0xe9b4a8, 0xe4bbb0, 0xe5a4ae, 0xe6808f,
+ /* e9 */ 0xe698bb, 0xe6ae83, 0xe7a7a7, 0xe9b4a6,
+ /* ed */ 0xe58e93, 0xe59380, 0xe59f83, 0xe5b496,
+ /* f1 */ 0xe6849b, 0xe69b96, 0xe6b6af, 0xe7a28d,
+ /* f5 */ 0xe889be, 0xe99a98, 0xe99d84, 0xe58e84,
+ /* f9 */ 0xe689bc, 0xe68e96, 0xe6b6b2, 0xe7b88a,
+ /* fd */ 0xe8858b, 0xe9a18d,
+
+ /*** Two byte table, leaf: e5xx - offset 0x0183b ***/
+
+ /* a1 */ 0xe6abbb, 0xe7bd8c, 0xe9b6af, 0xe9b89a,
+ /* a5 */ 0xe4b99f, 0xe580bb, 0xe586b6, 0xe5a49c,
+ /* a9 */ 0xe683b9, 0xe68fb6, 0xe6a4b0, 0xe788ba,
+ /* ad */ 0xe880b6, 0xefa5b4, 0xe9878e, 0xe5bcb1,
+ /* b1 */ 0xefa5b5, 0xefa5b6, 0xe7b484, 0xe88ba5,
+ /* b5 */ 0xe891af, 0xe892bb, 0xe897a5, 0xe8ba8d,
+ /* b9 */ 0xefa5b7, 0xe4bdaf, 0xefa5b8, 0xefa5b9,
+ /* bd */ 0xe5a3a4, 0xe5ad83, 0xe68199, 0xe68f9a,
+ /* c1 */ 0xe69498, 0xe695ad, 0xe69a98, 0xefa5ba,
+ /* c5 */ 0xe6a58a, 0xe6a8a3, 0xe6b48b, 0xe78081,
+ /* c9 */ 0xe785ac, 0xe79792, 0xe7988d, 0xe7a6b3,
+ /* cd */ 0xe7a9b0, 0xefa5bb, 0xe7be8a, 0xefa5bc,
+ /* d1 */ 0xe8a584, 0xefa5bd, 0xe8ae93, 0xe98780,
+ /* d5 */ 0xe999bd, 0xefa5be, 0xe9a48a, 0xe59c84,
+ /* d9 */ 0xe5bea1, 0xe696bc, 0xe6bc81, 0xe79880,
+ /* dd */ 0xe7a6a6, 0xe8aa9e, 0xe9a6ad, 0xe9ad9a,
+ /* e1 */ 0xe9bdac, 0xe58484, 0xe686b6, 0xe68a91,
+ /* e5 */ 0xe6aa8d, 0xe88786, 0xe58183, 0xe5a0b0,
+ /* e9 */ 0xe5bda6, 0xe78489, 0xe8a880, 0xe8abba,
+ /* ed */ 0xe5adbc, 0xe89896, 0xe4bfba, 0xe584bc,
+ /* f1 */ 0xe59ab4, 0xe5a584, 0xe68ea9, 0xe6b7b9,
+ /* f5 */ 0xe5b6aa, 0xe6a5ad, 0xe58686, 0xe4ba88,
+ /* f9 */ 0xe4bd99, 0xefa5bf, 0xefa680, 0xefa681,
+ /* fd */ 0xe5a682, 0xefa682,
+
+ /*** Two byte table, leaf: e6xx - offset 0x01899 ***/
+
+ /* a1 */ 0xefa683, 0xe6ad9f, 0xe6b19d, 0xefa684,
+ /* a5 */ 0xe792b5, 0xe7a496, 0xefa685, 0xe88887,
+ /* a9 */ 0xe88985, 0xe88cb9, 0xe8bcbf, 0xe8bd9d,
+ /* ad */ 0xefa686, 0xe9a498, 0xefa687, 0xefa688,
+ /* b1 */ 0xefa689, 0xe4baa6, 0xefa68a, 0xe59f9f,
+ /* b5 */ 0xe5bdb9, 0xe69893, 0xefa68b, 0xefa68c,
+ /* b9 */ 0xe796ab, 0xe7b9b9, 0xe8adaf, 0xefa68d,
+ /* bd */ 0xe98086, 0xe9a99b, 0xe59aa5, 0xe5a0a7,
+ /* c1 */ 0xe5a7b8, 0xe5a89f, 0xe5aeb4, 0xefa68e,
+ /* c5 */ 0xe5bbb6, 0xefa68f, 0xefa690, 0xe68d90,
+ /* c9 */ 0xe68cbb, 0xefa691, 0xe6a4bd, 0xe6b287,
+ /* cd */ 0xe6b2bf, 0xe6b68e, 0xe6b693, 0xe6b7b5,
+ /* d1 */ 0xe6bc94, 0xefa692, 0xe7839f, 0xe784b6,
+ /* d5 */ 0xe78599, 0xefa693, 0xe78783, 0xe78795,
+ /* d9 */ 0xefa694, 0xe7a18f, 0xe7a1af, 0xefa695,
+ /* dd */ 0xe7adb5, 0xe7b7a3, 0xefa696, 0xe7b8af,
+ /* e1 */ 0xefa697, 0xe8a18d, 0xe8bb9f, 0xefa698,
+ /* e5 */ 0xefa699, 0xefa69a, 0xe9899b, 0xefa69b,
+ /* e9 */ 0xe9b3b6, 0xefa69c, 0xefa69d, 0xefa69e,
+ /* ed */ 0xe68285, 0xe6b685, 0xefa69f, 0xe786b1,
+ /* f1 */ 0xefa6a0, 0xefa6a1, 0xe996b1, 0xe58ead,
+ /* f5 */ 0xefa6a2, 0xefa6a3, 0xefa6a4, 0xe69f93,
+ /* f9 */ 0xefa6a5, 0xe7828e, 0xe784b0, 0xe790b0,
+ /* fd */ 0xe889b6, 0xe88b92,
+
+ /*** Two byte table, leaf: e7xx - offset 0x018f7 ***/
+
+ /* a1 */ 0xefa6a6, 0xe996bb, 0xe9aba5, 0xe9b9bd,
+ /* a5 */ 0xe69b84, 0xefa6a7, 0xe78781, 0xe89189,
+ /* a9 */ 0xefa6a8, 0xefa6a9, 0xe5a18b, 0xefa6aa,
+ /* ad */ 0xefa6ab, 0xe5b6b8, 0xe5bdb1, 0xefa6ac,
+ /* b1 */ 0xe698a0, 0xe69a8e, 0xe6a5b9, 0xe6a6ae,
+ /* b5 */ 0xe6b0b8, 0xe6b3b3, 0xe6b8b6, 0xe6bd81,
+ /* b9 */ 0xe6bf9a, 0xe7809b, 0xe780af, 0xe78590,
+ /* bd */ 0xe7879f, 0xe78db0, 0xefa6ad, 0xe7919b,
+ /* c1 */ 0xefa6ae, 0xe79394, 0xe79b88, 0xe7a98e,
+ /* c5 */ 0xe7ba93, 0xefa6af, 0xefa6b0, 0xe88bb1,
+ /* c9 */ 0xe8a9a0, 0xe8bf8e, 0xefa6b1, 0xe98d88,
+ /* cd */ 0xefa6b2, 0xe99c99, 0xefa6b3, 0xefa6b4,
+ /* d1 */ 0xe4b982, 0xe580aa, 0xefa6b5, 0xe58888,
+ /* d5 */ 0xe58fa1, 0xe69bb3, 0xe6b1ad, 0xe6bf8a,
+ /* d9 */ 0xe78c8a, 0xe79dbf, 0xe7a9a2, 0xe88aae,
+ /* dd */ 0xe8979d, 0xe89882, 0xefa6b6, 0xe8a394,
+ /* e1 */ 0xe8a9a3, 0xe8adbd, 0xe8b1ab, 0xefa6b7,
+ /* e5 */ 0xe98ab3, 0xefa6b8, 0xe99c93, 0xe9a090,
+ /* e9 */ 0xe4ba94, 0xe4bc8d, 0xe4bf89, 0xe582b2,
+ /* ed */ 0xe58d88, 0xe590be, 0xe590b3, 0xe5979a,
+ /* f1 */ 0xe5a1a2, 0xe5a2ba, 0xe5a5a7, 0xe5a89b,
+ /* f5 */ 0xe5afa4, 0xe6829f, 0xefa6b9, 0xe6878a,
+ /* f9 */ 0xe69596, 0xe697bf, 0xe699a4, 0xe6a2a7,
+ /* fd */ 0xe6b19a, 0xe6beb3,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01955 ***/
+
+ /* a1 */ 0xe7838f, 0xe786ac, 0xe78d92, 0xe7adbd,
+ /* a5 */ 0xe89c88, 0xe8aaa4, 0xe9b0b2, 0xe9bc87,
+ /* a9 */ 0xe5b18b, 0xe6b283, 0xe78d84, 0xe78e89,
+ /* ad */ 0xe988ba, 0xe6baab, 0xe791a5, 0xe7989f,
+ /* b1 */ 0xe7a9a9, 0xe7b895, 0xe8988a, 0xe58580,
+ /* b5 */ 0xe5a385, 0xe69381, 0xe793ae, 0xe79495,
+ /* b9 */ 0xe799b0, 0xe7bf81, 0xe98295, 0xe99b8d,
+ /* bd */ 0xe9a594, 0xe6b8a6, 0xe793a6, 0xe7aaa9,
+ /* c1 */ 0xe7aaaa, 0xe887a5, 0xe89b99, 0xe89db8,
+ /* c5 */ 0xe8a89b, 0xe5a989, 0xe5ae8c, 0xe5ae9b,
+ /* c9 */ 0xe6a2a1, 0xe6a480, 0xe6b5a3, 0xe78ea9,
+ /* cd */ 0xe79093, 0xe790ac, 0xe7a297, 0xe7b7a9,
+ /* d1 */ 0xe7bfab, 0xe88498, 0xe88595, 0xe88e9e,
+ /* d5 */ 0xe8b18c, 0xe998ae, 0xe9a091, 0xe69bb0,
+ /* d9 */ 0xe5be80, 0xe697ba, 0xe69e89, 0xe6b1aa,
+ /* dd */ 0xe78e8b, 0xe580ad, 0xe5a883, 0xe6adaa,
+ /* e1 */ 0xe79fae, 0xe5a496, 0xe5b5ac, 0xe5b78d,
+ /* e5 */ 0xe78ca5, 0xe7958f, 0xefa6ba, 0xefa6bb,
+ /* e9 */ 0xe583a5, 0xe587b9, 0xe5a0af, 0xe5a4ad,
+ /* ed */ 0xe5a696, 0xe5a79a, 0xe5afa5, 0xefa6bc,
+ /* f1 */ 0xefa6bd, 0xe5b6a2, 0xe68b97, 0xe69096,
+ /* f5 */ 0xe69293, 0xe693be, 0xefa6be, 0xe69b9c,
+ /* f9 */ 0xefa6bf, 0xe6a988, 0xefa780, 0xe787bf,
+ /* fd */ 0xe791a4, 0xefa781,
+
+ /*** Two byte table, leaf: e9xx - offset 0x019b3 ***/
+
+ /* a1 */ 0xe7aa88, 0xe7aaaf, 0xe7b987, 0xe7b99e,
+ /* a5 */ 0xe88080, 0xe885b0, 0xefa782, 0xe89faf,
+ /* a9 */ 0xe8a681, 0xe8aca0, 0xe98199, 0xefa783,
+ /* ad */ 0xe98280, 0xe9a592, 0xe685be, 0xe6acb2,
+ /* b1 */ 0xe6b5b4, 0xe7b89f, 0xe8a4a5, 0xe8beb1,
+ /* b5 */ 0xe4bf91, 0xe582ad, 0xe58697, 0xe58b87,
+ /* b9 */ 0xe59f87, 0xe5a289, 0xe5aeb9, 0xe5bab8,
+ /* bd */ 0xe68582, 0xe6a695, 0xe6b68c, 0xe6b9a7,
+ /* c1 */ 0xe6bab6, 0xe78694, 0xe791a2, 0xe794a8,
+ /* c5 */ 0xe794ac, 0xe881b3, 0xe88cb8, 0xe89389,
+ /* c9 */ 0xe8b88a, 0xe98e94, 0xe98f9e, 0xefa784,
+ /* cd */ 0xe4ba8e, 0xe4bd91, 0xe581b6, 0xe584aa,
+ /* d1 */ 0xe58f88, 0xe58f8b, 0xe58fb3, 0xe5ae87,
+ /* d5 */ 0xe5af93, 0xe5b0a4, 0xe6849a, 0xe68682,
+ /* d9 */ 0xe697b4, 0xe7899b, 0xe78e97, 0xe79180,
+ /* dd */ 0xe79b82, 0xe7a590, 0xe7a691, 0xe7a6b9,
+ /* e1 */ 0xe7b486, 0xe7bebd, 0xe88a8b, 0xe89795,
+ /* e5 */ 0xe8999e, 0xe8bf82, 0xe98187, 0xe983b5,
+ /* e9 */ 0xe987aa, 0xe99a85, 0xe99ba8, 0xe99ba9,
+ /* ed */ 0xe58b96, 0xe5bda7, 0xe697ad, 0xe698b1,
+ /* f1 */ 0xe6a0af, 0xe7859c, 0xe7a8b6, 0xe98381,
+ /* f5 */ 0xe9a08a, 0xe4ba91, 0xefa785, 0xe6a992,
+ /* f9 */ 0xe6ae9e, 0xe6be90, 0xe78689, 0xe88098,
+ /* fd */ 0xe88ab8, 0xe89593,
+
+ /*** Two byte table, leaf: eaxx - offset 0x01a11 ***/
+
+ /* a1 */ 0xe9818b, 0xe99a95, 0xe99bb2, 0xe99fbb,
+ /* a5 */ 0xe8949a, 0xe9acb1, 0xe4ba90, 0xe7868a,
+ /* a9 */ 0xe99b84, 0xe58583, 0xe58e9f, 0xe593a1,
+ /* ad */ 0xe59c93, 0xe59c92, 0xe59ea3, 0xe5aa9b,
+ /* b1 */ 0xe5ab84, 0xe5af83, 0xe680a8, 0xe684bf,
+ /* b5 */ 0xe68fb4, 0xe6b285, 0xe6b4b9, 0xe6b9b2,
+ /* b9 */ 0xe6ba90, 0xe788b0, 0xe78cbf, 0xe79197,
+ /* bd */ 0xe88b91, 0xe8a281, 0xe8bd85, 0xe981a0,
+ /* c1 */ 0xefa786, 0xe999a2, 0xe9a198, 0xe9b49b,
+ /* c5 */ 0xe69c88, 0xe8b68a, 0xe9899e, 0xe4bd8d,
+ /* c9 */ 0xe58189, 0xe5839e, 0xe58db1, 0xe59c8d,
+ /* cd */ 0xe5a794, 0xe5a881, 0xe5b089, 0xe685b0,
+ /* d1 */ 0xe69a90, 0xe6b8ad, 0xe788b2, 0xe7918b,
+ /* d5 */ 0xe7b7af, 0xe88383, 0xe8908e, 0xe891a6,
+ /* d9 */ 0xe894bf, 0xe89d9f, 0xe8a19b, 0xe8a498,
+ /* dd */ 0xe8ac82, 0xe98195, 0xe99f8b, 0xe9ad8f,
+ /* e1 */ 0xe4b9b3, 0xe4be91, 0xe58492, 0xe585aa,
+ /* e5 */ 0xefa787, 0xe594af, 0xe596a9, 0xe5adba,
+ /* e9 */ 0xe5aea5, 0xe5b9bc, 0xe5b9bd, 0xe5babe,
+ /* ed */ 0xe682a0, 0xe6839f, 0xe68488, 0xe68489,
+ /* f1 */ 0xe68f84, 0xe694b8, 0xe69c89, 0xefa788,
+ /* f5 */ 0xe69f94, 0xe69f9a, 0xefa789, 0xe6a5a1,
+ /* f9 */ 0xe6a5a2, 0xe6b2b9, 0xe6b4a7, 0xefa78a,
+ /* fd */ 0xe6b8b8, 0xefa78b,
+
+ /*** Two byte table, leaf: ebxx - offset 0x01a6f ***/
+
+ /* a1 */ 0xe6bfa1, 0xe78cb6, 0xe78cb7, 0xefa78c,
+ /* a5 */ 0xe7919c, 0xe794b1, 0xefa78d, 0xe79992,
+ /* a9 */ 0xefa78e, 0xefa78f, 0xe7b6ad, 0xe887be,
+ /* ad */ 0xe890b8, 0xe8a395, 0xe8aa98, 0xe8ab9b,
+ /* b1 */ 0xe8abad, 0xe8b8b0, 0xe8b982, 0xe9818a,
+ /* b5 */ 0xe980be, 0xe981ba, 0xe98589, 0xe98789,
+ /* b9 */ 0xe98dae, 0xefa790, 0xefa791, 0xe5a089,
+ /* bd */ 0xefa792, 0xe6af93, 0xe88289, 0xe882b2,
+ /* c1 */ 0xefa793, 0xefa794, 0xe58581, 0xe5a5ab,
+ /* c5 */ 0xe5b0b9, 0xefa795, 0xefa796, 0xe6bda4,
+ /* c9 */ 0xe78ea7, 0xe883a4, 0xe8b487, 0xefa797,
+ /* cd */ 0xe98897, 0xe9968f, 0xefa798, 0xefa799,
+ /* d1 */ 0xefa79a, 0xefa79b, 0xe881bf, 0xe6888e,
+ /* d5 */ 0xe7809c, 0xe7b5a8, 0xe89e8d, 0xefa79c,
+ /* d9 */ 0xe59ea0, 0xe681a9, 0xe68587, 0xe6aeb7,
+ /* dd */ 0xe8aabe, 0xe98a80, 0xe99ab1, 0xe4b999,
+ /* e1 */ 0xe5909f, 0xe6b7ab, 0xe894ad, 0xe999b0,
+ /* e5 */ 0xe99fb3, 0xe9a3ae, 0xe68f96, 0xe6b3a3,
+ /* e9 */ 0xe98291, 0xe5879d, 0xe68789, 0xe886ba,
+ /* ed */ 0xe9b7b9, 0xe4be9d, 0xe5809a, 0xe58480,
+ /* f1 */ 0xe5ae9c, 0xe6848f, 0xe687bf, 0xe693ac,
+ /* f5 */ 0xe6a485, 0xe6af85, 0xe79691, 0xe79fa3,
+ /* f9 */ 0xe7bea9, 0xe889a4, 0xe8968f, 0xe89fbb,
+ /* fd */ 0xe8a1a3, 0xe8aabc,
+
+ /*** Two byte table, leaf: ecxx - offset 0x01acd ***/
+
+ /* a1 */ 0xe8adb0, 0xe986ab, 0xe4ba8c, 0xe4bba5,
+ /* a5 */ 0xe4bc8a, 0xefa79d, 0xefa79e, 0xe5a4b7,
+ /* a9 */ 0xe5a7a8, 0xefa79f, 0xe5b7b2, 0xe5bc9b,
+ /* ad */ 0xe5bd9b, 0xe680a1, 0xefa7a0, 0xefa7a1,
+ /* b1 */ 0xefa7a2, 0xefa7a3, 0xe788be, 0xe78fa5,
+ /* b5 */ 0xefa7a4, 0xe795b0, 0xe7978d, 0xefa7a5,
+ /* b9 */ 0xe7a7bb, 0xefa7a6, 0xe8808c, 0xe880b3,
+ /* bd */ 0xe88284, 0xe88ba1, 0xe88d91, 0xefa7a7,
+ /* c1 */ 0xefa7a8, 0xe8b2bd, 0xe8b2b3, 0xe98287,
+ /* c5 */ 0xefa7a9, 0xefa7aa, 0xe9a3b4, 0xe9a48c,
+ /* c9 */ 0xefa7ab, 0xefa7ac, 0xe780b7, 0xe79b8a,
+ /* cd */ 0xe7bf8a, 0xe7bf8c, 0xe7bfbc, 0xe8ac9a,
+ /* d1 */ 0xe4baba, 0xe4bb81, 0xe58883, 0xe58db0,
+ /* d5 */ 0xefa7ad, 0xe592bd, 0xe59ba0, 0xe5a7bb,
+ /* d9 */ 0xe5af85, 0xe5bc95, 0xe5bf8d, 0xe6b9ae,
+ /* dd */ 0xefa7ae, 0xefa7af, 0xe7b5aa, 0xe88cb5,
+ /* e1 */ 0xefa7b0, 0xe89a93, 0xe8aa8d, 0xefa7b1,
+ /* e5 */ 0xe99dad, 0xe99db7, 0xefa7b2, 0xefa7b3,
+ /* e9 */ 0xe4b880, 0xe4bd9a, 0xe4bdbe, 0xe5a3b9,
+ /* ed */ 0xe697a5, 0xe6baa2, 0xe980b8, 0xe98eb0,
+ /* f1 */ 0xe9a6b9, 0xe4bbbb, 0xe5a3ac, 0xe5a68a,
+ /* f5 */ 0xe5a799, 0xe68181, 0xefa7b4, 0xefa7b5,
+ /* f9 */ 0xe7a894, 0xefa7b6, 0xe88d8f, 0xe8b383,
+ /* fd */ 0xe585a5, 0xe58d84,
+
+ /*** Two byte table, leaf: edxx - offset 0x01b2b ***/
+
+ /* a1 */ 0xefa7b7, 0xefa7b8, 0xefa7b9, 0xe4bb8d,
+ /* a5 */ 0xe589a9, 0xe5ad95, 0xe88abf, 0xe4bb94,
+ /* a9 */ 0xe588ba, 0xe592a8, 0xe5a789, 0xe5a7bf,
+ /* ad */ 0xe5ad90, 0xe5ad97, 0xe5ad9c, 0xe681a3,
+ /* b1 */ 0xe68588, 0xe6bb8b, 0xe78299, 0xe785ae,
+ /* b5 */ 0xe78e86, 0xe793b7, 0xe796b5, 0xe7a381,
+ /* b9 */ 0xe7b4ab, 0xe88085, 0xe887aa, 0xe88ca8,
+ /* bd */ 0xe89497, 0xe89789, 0xe8abae, 0xe8b387,
+ /* c1 */ 0xe99b8c, 0xe4bd9c, 0xe58bba, 0xe59abc,
+ /* c5 */ 0xe696ab, 0xe698a8, 0xe781bc, 0xe782b8,
+ /* c9 */ 0xe788b5, 0xe7b6bd, 0xe88a8d, 0xe9858c,
+ /* cd */ 0xe99b80, 0xe9b5b2, 0xe5adb1, 0xe6a3a7,
+ /* d1 */ 0xe6ae98, 0xe6bdba, 0xe79b9e, 0xe5b291,
+ /* d5 */ 0xe69aab, 0xe6bd9b, 0xe7aeb4, 0xe7b0aa,
+ /* d9 */ 0xe8a0b6, 0xe99b9c, 0xe4b888, 0xe4bb97,
+ /* dd */ 0xe58ca0, 0xe5a0b4, 0xe5a2bb, 0xe5a3af,
+ /* e1 */ 0xe5a5ac, 0xe5b087, 0xe5b8b3, 0xe5ba84,
+ /* e5 */ 0xe5bcb5, 0xe68e8c, 0xe69ab2, 0xe69d96,
+ /* e9 */ 0xe6a89f, 0xe6aaa3, 0xe6ac8c, 0xe6bcbf,
+ /* ed */ 0xe78986, 0xefa7ba, 0xe78d90, 0xe7928b,
+ /* f1 */ 0xe7aba0, 0xe7b2a7, 0xe885b8, 0xe8879f,
+ /* f5 */ 0xe887a7, 0xe88e8a, 0xe891ac, 0xe894a3,
+ /* f9 */ 0xe89694, 0xe8978f, 0xe8a39d, 0xe8b493,
+ /* fd */ 0xe986ac, 0xe995b7,
+
+ /*** Two byte table, leaf: eexx - offset 0x01b89 ***/
+
+ /* a1 */ 0xe99a9c, 0xe5868d, 0xe59389, 0xe59ca8,
+ /* a5 */ 0xe5aeb0, 0xe6898d, 0xe69d90, 0xe6a0bd,
+ /* a9 */ 0xe6a293, 0xe6b8bd, 0xe6bb93, 0xe781bd,
+ /* ad */ 0xe7b8a1, 0xe8a381, 0xe8b2a1, 0xe8bc89,
+ /* b1 */ 0xe9bd8b, 0xe9bd8e, 0xe788ad, 0xe7ae8f,
+ /* b5 */ 0xe8ab8d, 0xe98c9a, 0xe4bd87, 0xe4bd8e,
+ /* b9 */ 0xe584b2, 0xe59280, 0xe5a790, 0xe5ba95,
+ /* bd */ 0xe68ab5, 0xe69db5, 0xe6a5ae, 0xe6a897,
+ /* c1 */ 0xe6b2ae, 0xe6b89a, 0xe78b99, 0xe78caa,
+ /* c5 */ 0xe796bd, 0xe7aeb8, 0xe7b4b5, 0xe88ba7,
+ /* c9 */ 0xe88fb9, 0xe89197, 0xe897b7, 0xe8a99b,
+ /* cd */ 0xe8b2af, 0xe8ba87, 0xe98099, 0xe982b8,
+ /* d1 */ 0xe99b8e, 0xe9bd9f, 0xe58ba3, 0xe5908a,
+ /* d5 */ 0xe5aba1, 0xe5af82, 0xe69198, 0xe695b5,
+ /* d9 */ 0xe6bbb4, 0xe78b84, 0xefa7bb, 0xe79a84,
+ /* dd */ 0xe7a98d, 0xe7ac9b, 0xe7b18d, 0xe7b8be,
+ /* e1 */ 0xe7bf9f, 0xe88dbb, 0xe8acab, 0xe8b38a,
+ /* e5 */ 0xe8b5a4, 0xe8b7a1, 0xe8b99f, 0xe8bfaa,
+ /* e9 */ 0xe8bfb9, 0xe981a9, 0xe98f91, 0xe4bd83,
+ /* ed */ 0xe4bdba, 0xe582b3, 0xe585a8, 0xe585b8,
+ /* f1 */ 0xe5898d, 0xe589aa, 0xe5a1a1, 0xe5a1bc,
+ /* f5 */ 0xe5a5a0, 0xe5b088, 0xe5b195, 0xe5bb9b,
+ /* f9 */ 0xe6829b, 0xe688b0, 0xe6a093, 0xe6aebf,
+ /* fd */ 0xe6b088, 0xe6beb1,
+
+ /*** Two byte table, leaf: efxx - offset 0x01be7 ***/
+
+ /* a1 */ 0xe7858e, 0xe790a0, 0xe794b0, 0xe794b8,
+ /* a5 */ 0xe79591, 0xe799b2, 0xe7ad8c, 0xe7ae8b,
+ /* a9 */ 0xe7aead, 0xe7af86, 0xe7ba8f, 0xe8a9ae,
+ /* ad */ 0xe8bcbe, 0xe8bd89, 0xe988bf, 0xe98a93,
+ /* b1 */ 0xe98ca2, 0xe990ab, 0xe99bbb, 0xe9a19a,
+ /* b5 */ 0xe9a1ab, 0xe9a49e, 0xe58887, 0xe688aa,
+ /* b9 */ 0xe68a98, 0xe6b599, 0xe799a4, 0xe7ab8a,
+ /* bd */ 0xe7af80, 0xe7b5b6, 0xe58da0, 0xe5b2be,
+ /* c1 */ 0xe5ba97, 0xe6bcb8, 0xe782b9, 0xe7b298,
+ /* c5 */ 0xe99c91, 0xe9ae8e, 0xe9bb9e, 0xe68ea5,
+ /* c9 */ 0xe691ba, 0xe89db6, 0xe4b881, 0xe4ba95,
+ /* cd */ 0xe4baad, 0xe5819c, 0xe581b5, 0xe59188,
+ /* d1 */ 0xe5a783, 0xe5ae9a, 0xe5b980, 0xe5baad,
+ /* d5 */ 0xe5bbb7, 0xe5be81, 0xe68385, 0xe68cba,
+ /* d9 */ 0xe694bf, 0xe695b4, 0xe6978c, 0xe699b6,
+ /* dd */ 0xe699b8, 0xe69fbe, 0xe6a5a8, 0xe6aa89,
+ /* e1 */ 0xe6ada3, 0xe6b180, 0xe6b780, 0xe6b7a8,
+ /* e5 */ 0xe6b89f, 0xe6b99e, 0xe7809e, 0xe782a1,
+ /* e9 */ 0xe78e8e, 0xe78fbd, 0xe794ba, 0xe79d9b,
+ /* ed */ 0xe7a287, 0xe7a68e, 0xe7a88b, 0xe7a9bd,
+ /* f1 */ 0xe7b2be, 0xe7b68e, 0xe88987, 0xe8a882,
+ /* f5 */ 0xe8abaa, 0xe8b29e, 0xe984ad, 0xe9858a,
+ /* f9 */ 0xe98798, 0xe989a6, 0xe98b8c, 0xe98ca0,
+ /* fd */ 0xe99c86, 0xe99d96,
+
+ /*** Two byte table, leaf: f0xx - offset 0x01c45 ***/
+
+ /* a1 */ 0xe99d9c, 0xe9a082, 0xe9bc8e, 0xe588b6,
+ /* a5 */ 0xe58a91, 0xe595bc, 0xe5a0a4, 0xe5b89d,
+ /* a9 */ 0xe5bc9f, 0xe6828c, 0xe68f90, 0xe6a2af,
+ /* ad */ 0xe6bf9f, 0xe7a5ad, 0xe7acac, 0xe8878d,
+ /* b1 */ 0xe896ba, 0xe8a3bd, 0xe8abb8, 0xe8b984,
+ /* b5 */ 0xe9868d, 0xe999a4, 0xe99a9b, 0xe99cbd,
+ /* b9 */ 0xe9a18c, 0xe9bd8a, 0xe4bf8e, 0xe58586,
+ /* bd */ 0xe5878b, 0xe58aa9, 0xe598b2, 0xe5bc94,
+ /* c1 */ 0xe5bdab, 0xe68eaa, 0xe6938d, 0xe697a9,
+ /* c5 */ 0xe69981, 0xe69bba, 0xe69bb9, 0xe69c9d,
+ /* c9 */ 0xe6a29d, 0xe6a397, 0xe6a7bd, 0xe6bc95,
+ /* cd */ 0xe6bdae, 0xe785a7, 0xe787a5, 0xe788aa,
+ /* d1 */ 0xe792aa, 0xe79cba, 0xe7a596, 0xe7a59a,
+ /* d5 */ 0xe7a79f, 0xe7a8a0, 0xe7aa95, 0xe7b297,
+ /* d9 */ 0xe7b39f, 0xe7b584, 0xe7b9b0, 0xe88287,
+ /* dd */ 0xe897bb, 0xe89aa4, 0xe8a994, 0xe8aabf,
+ /* e1 */ 0xe8b699, 0xe8ba81, 0xe980a0, 0xe981ad,
+ /* e5 */ 0xe987a3, 0xe998bb, 0xe99b95, 0xe9b3a5,
+ /* e9 */ 0xe6978f, 0xe7b087, 0xe8b6b3, 0xe98f83,
+ /* ed */ 0xe5ad98, 0xe5b08a, 0xe58d92, 0xe68b99,
+ /* f1 */ 0xe78c9d, 0xe580a7, 0xe5ae97, 0xe5be9e,
+ /* f5 */ 0xe682b0, 0xe685ab, 0xe6a395, 0xe6b799,
+ /* f9 */ 0xe790ae, 0xe7a8ae, 0xe7b582, 0xe7b69c,
+ /* fd */ 0xe7b8b1, 0xe885ab,
+
+ /*** Two byte table, leaf: f1xx - offset 0x01ca3 ***/
+
+ /* a1 */ 0xe8b8aa, 0xe8b8b5, 0xe98dbe, 0xe99098,
+ /* a5 */ 0xe4bd90, 0xe59d90, 0xe5b7a6, 0xe5baa7,
+ /* a9 */ 0xe68cab, 0xe7bdaa, 0xe4b8bb, 0xe4bd8f,
+ /* ad */ 0xe4be8f, 0xe5819a, 0xe5a79d, 0xe88384,
+ /* b1 */ 0xe591aa, 0xe591a8, 0xe597be, 0xe5a58f,
+ /* b5 */ 0xe5ae99, 0xe5b79e, 0xe5bb9a, 0xe6999d,
+ /* b9 */ 0xe69cb1, 0xe69fb1, 0xe6a0aa, 0xe6b3a8,
+ /* bd */ 0xe6b4b2, 0xe6b98a, 0xe6be8d, 0xe782b7,
+ /* c1 */ 0xe78fa0, 0xe79687, 0xe7b18c, 0xe7b482,
+ /* c5 */ 0xe7b4ac, 0xe7b6a2, 0xe8889f, 0xe89b9b,
+ /* c9 */ 0xe8a8bb, 0xe8aa85, 0xe8b5b0, 0xe8ba8a,
+ /* cd */ 0xe8bcb3, 0xe980b1, 0xe9858e, 0xe98592,
+ /* d1 */ 0xe99184, 0xe9a790, 0xe7abb9, 0xe7b2a5,
+ /* d5 */ 0xe4bf8a, 0xe58481, 0xe58786, 0xe59f88,
+ /* d9 */ 0xe5afaf, 0xe5b3bb, 0xe69999, 0xe6a8bd,
+ /* dd */ 0xe6b59a, 0xe6ba96, 0xe6bfac, 0xe7848c,
+ /* e1 */ 0xe795af, 0xe7aba3, 0xe8a0a2, 0xe980a1,
+ /* e5 */ 0xe981b5, 0xe99b8b, 0xe9a7bf, 0xe88c81,
+ /* e9 */ 0xe4b8ad, 0xe4bbb2, 0xe8a186, 0xe9878d,
+ /* ed */ 0xe58dbd, 0xe6ab9b, 0xe6a5ab, 0xe6b181,
+ /* f1 */ 0xe891ba, 0xe5a29e, 0xe6868e, 0xe69bbe,
+ /* f5 */ 0xe68baf, 0xe7839d, 0xe79491, 0xe79787,
+ /* f9 */ 0xe7b992, 0xe892b8, 0xe8ad89, 0xe8b488,
+ /* fd */ 0xe4b98b, 0xe58faa,
+
+ /*** Two byte table, leaf: f2xx - offset 0x01d01 ***/
+
+ /* a1 */ 0xe592ab, 0xe59cb0, 0xe59d80, 0xe5bf97,
+ /* a5 */ 0xe68c81, 0xe68c87, 0xe691af, 0xe694af,
+ /* a9 */ 0xe697a8, 0xe699ba, 0xe69e9d, 0xe69eb3,
+ /* ad */ 0xe6ada2, 0xe6b1a0, 0xe6b29a, 0xe6bcac,
+ /* b1 */ 0xe79fa5, 0xe7a0a5, 0xe7a589, 0xe7a597,
+ /* b5 */ 0xe7b499, 0xe882a2, 0xe88482, 0xe887b3,
+ /* b9 */ 0xe88a9d, 0xe88ab7, 0xe89c98, 0xe8aa8c,
+ /* bd */ 0xefa7bc, 0xe8b484, 0xe8b6be, 0xe981b2,
+ /* c1 */ 0xe79bb4, 0xe7a899, 0xe7a8b7, 0xe7b994,
+ /* c5 */ 0xe881b7, 0xe59487, 0xe59794, 0xe5a1b5,
+ /* c9 */ 0xe68caf, 0xe690a2, 0xe69989, 0xe6998b,
+ /* cd */ 0xe6a1ad, 0xe6a69b, 0xe6ae84, 0xe6b4a5,
+ /* d1 */ 0xe6bab1, 0xe78f8d, 0xe791a8, 0xe792a1,
+ /* d5 */ 0xe7959b, 0xe796b9, 0xe79ba1, 0xe79c9e,
+ /* d9 */ 0xe79e8b, 0xe7a7a6, 0xe7b889, 0xe7b89d,
+ /* dd */ 0xe887bb, 0xe894af, 0xe8a297, 0xe8a8ba,
+ /* e1 */ 0xe8b391, 0xe8bbab, 0xe8beb0, 0xe980b2,
+ /* e5 */ 0xe98ead, 0xe999a3, 0xe999b3, 0xe99c87,
+ /* e9 */ 0xe4be84, 0xe58fb1, 0xe5a7aa, 0xe5ab89,
+ /* ed */ 0xe5b899, 0xe6a18e, 0xe79386, 0xe796be,
+ /* f1 */ 0xe7a7a9, 0xe7aa92, 0xe886a3, 0xe89bad,
+ /* f5 */ 0xe8b3aa, 0xe8b78c, 0xe8bfad, 0xe6969f,
+ /* f9 */ 0xe69c95, 0xefa7bd, 0xe59fb7, 0xe6bd97,
+ /* fd */ 0xe7b79d, 0xe8bcaf,
+
+ /*** Two byte table, leaf: f3xx - offset 0x01d5f ***/
+
+ /* a1 */ 0xe98fb6, 0xe99b86, 0xe5beb5, 0xe687b2,
+ /* a5 */ 0xe6be84, 0xe4b894, 0xe4be98, 0xe5809f,
+ /* a9 */ 0xe58f89, 0xe5979f, 0xe5b5af, 0xe5b7ae,
+ /* ad */ 0xe6aca1, 0xe6ada4, 0xe7a38b, 0xe7ae9a,
+ /* b1 */ 0xefa7be, 0xe8b989, 0xe8bb8a, 0xe981ae,
+ /* b5 */ 0xe68d89, 0xe690be, 0xe79d80, 0xe7aa84,
+ /* b9 */ 0xe98caf, 0xe991bf, 0xe9bdaa, 0xe692b0,
+ /* bd */ 0xe6beaf, 0xe787a6, 0xe792a8, 0xe7939a,
+ /* c1 */ 0xe7ab84, 0xe7b092, 0xe7ba82, 0xe7b2b2,
+ /* c5 */ 0xe7ba98, 0xe8ae9a, 0xe8b48a, 0xe991bd,
+ /* c9 */ 0xe9a490, 0xe9a58c, 0xe588b9, 0xe5af9f,
+ /* cd */ 0xe693a6, 0xe69cad, 0xe7b4ae, 0xe583ad,
+ /* d1 */ 0xe58f83, 0xe5a1b9, 0xe68598, 0xe68599,
+ /* d5 */ 0xe687ba, 0xe696ac, 0xe7ab99, 0xe8ae92,
+ /* d9 */ 0xe8ae96, 0xe58089, 0xe580a1, 0xe589b5,
+ /* dd */ 0xe594b1, 0xe5a8bc, 0xe5bba0, 0xe5bdb0,
+ /* e1 */ 0xe684b4, 0xe6959e, 0xe6988c, 0xe698b6,
+ /* e5 */ 0xe69aa2, 0xe6a78d, 0xe6bb84, 0xe6bcb2,
+ /* e9 */ 0xe78c96, 0xe798a1, 0xe7aa93, 0xe884b9,
+ /* ed */ 0xe88999, 0xe88f96, 0xe892bc, 0xe582b5,
+ /* f1 */ 0xe59fb0, 0xe5af80, 0xe5afa8, 0xe5bda9,
+ /* f5 */ 0xe68ea1, 0xe7a0a6, 0xe7b6b5, 0xe88f9c,
+ /* f9 */ 0xe894a1, 0xe98787, 0xe987b5, 0xe5868a,
+ /* fd */ 0xe69fb5, 0xe7ad96,
+
+ /*** Two byte table, leaf: f4xx - offset 0x01dbd ***/
+
+ /* a1 */ 0xe8b2ac, 0xe58784, 0xe5a6bb, 0xe682bd,
+ /* a5 */ 0xe89995, 0xe5809c, 0xefa7bf, 0xe58994,
+ /* a9 */ 0xe5b0ba, 0xe685bd, 0xe6889a, 0xe68b93,
+ /* ad */ 0xe693b2, 0xe696a5, 0xe6bb8c, 0xe798a0,
+ /* b1 */ 0xe8848a, 0xe8b9a0, 0xe9999f, 0xe99abb,
+ /* b5 */ 0xe4bb9f, 0xe58d83, 0xe59698, 0xe5a4a9,
+ /* b9 */ 0xe5b79d, 0xe69385, 0xe6b389, 0xe6b7ba,
+ /* bd */ 0xe78e94, 0xe7a9bf, 0xe8889b, 0xe896a6,
+ /* c1 */ 0xe8b3a4, 0xe8b890, 0xe981b7, 0xe987a7,
+ /* c5 */ 0xe997a1, 0xe998a1, 0xe99f86, 0xe587b8,
+ /* c9 */ 0xe593b2, 0xe59686, 0xe5beb9, 0xe692a4,
+ /* cd */ 0xe6be88, 0xe7b6b4, 0xe8bc9f, 0xe8bd8d,
+ /* d1 */ 0xe990b5, 0xe58389, 0xe5b096, 0xe6b2be,
+ /* d5 */ 0xe6b7bb, 0xe7949b, 0xe79ebb, 0xe7b0bd,
+ /* d9 */ 0xe7b1a4, 0xe8a9b9, 0xe8ab82, 0xe5a09e,
+ /* dd */ 0xe5a6be, 0xe5b896, 0xe68db7, 0xe78992,
+ /* e1 */ 0xe7968a, 0xe79dab, 0xe8ab9c, 0xe8b2bc,
+ /* e5 */ 0xe8bc92, 0xe5bbb3, 0xe699b4, 0xe6b7b8,
+ /* e9 */ 0xe881bd, 0xe88f81, 0xe8ab8b, 0xe99d91,
+ /* ed */ 0xe9af96, 0xefa880, 0xe58983, 0xe69bbf,
+ /* f1 */ 0xe6b695, 0xe6bbaf, 0xe7b7a0, 0xe8aba6,
+ /* f5 */ 0xe980ae, 0xe9819e, 0xe9ab94, 0xe5889d,
+ /* f9 */ 0xe589bf, 0xe593a8, 0xe68694, 0xe68a84,
+ /* fd */ 0xe68b9b, 0xe6a2a2,
+
+ /*** Two byte table, leaf: f5xx - offset 0x01e1b ***/
+
+ /* a1 */ 0xe6a492, 0xe6a59a, 0xe6a8b5, 0xe78292,
+ /* a5 */ 0xe784a6, 0xe7a19d, 0xe7a481, 0xe7a48e,
+ /* a9 */ 0xe7a792, 0xe7a88d, 0xe88296, 0xe889b8,
+ /* ad */ 0xe88b95, 0xe88d89, 0xe89589, 0xe8b282,
+ /* b1 */ 0xe8b685, 0xe985a2, 0xe9868b, 0xe986ae,
+ /* b5 */ 0xe4bf83, 0xe59b91, 0xe787ad, 0xe79f97,
+ /* b9 */ 0xe89c80, 0xe8a7b8, 0xe5afb8, 0xe5bf96,
+ /* bd */ 0xe69d91, 0xe982a8, 0xe58fa2, 0xe5a19a,
+ /* c1 */ 0xe5afb5, 0xe682a4, 0xe68681, 0xe691a0,
+ /* c5 */ 0xe7b8bd, 0xe881b0, 0xe894a5, 0xe98a83,
+ /* c9 */ 0xe692ae, 0xe582ac, 0xe5b494, 0xe69c80,
+ /* cd */ 0xe5a29c, 0xe68abd, 0xe68ea8, 0xe6a48e,
+ /* d1 */ 0xe6a5b8, 0xe6a89e, 0xe6b9ab, 0xe79aba,
+ /* d5 */ 0xe7a78b, 0xe88abb, 0xe890a9, 0xe8ab8f,
+ /* d9 */ 0xe8b6a8, 0xe8bfbd, 0xe98492, 0xe9858b,
+ /* dd */ 0xe9869c, 0xe98c90, 0xe98c98, 0xe98e9a,
+ /* e1 */ 0xe99b9b, 0xe9a8b6, 0xe9b08d, 0xe4b891,
+ /* e5 */ 0xe7959c, 0xe7a59d, 0xe7abba, 0xe7ad91,
+ /* e9 */ 0xe7af89, 0xe7b8ae, 0xe89384, 0xe8b999,
+ /* ed */ 0xe8b9b4, 0xe8bbb8, 0xe98090, 0xe698a5,
+ /* f1 */ 0xe6a4bf, 0xe79183, 0xe587ba, 0xe69cae,
+ /* f5 */ 0xe9bb9c, 0xe58585, 0xe5bfa0, 0xe6b296,
+ /* f9 */ 0xe89fb2, 0xe8a19d, 0xe8a1b7, 0xe682b4,
+ /* fd */ 0xe886b5, 0xe89083,
+
+ /*** Two byte table, leaf: f6xx - offset 0x01e79 ***/
+
+ /* a1 */ 0xe8b485, 0xe58f96, 0xe590b9, 0xe598b4,
+ /* a5 */ 0xe5a8b6, 0xe5b0b1, 0xe7828a, 0xe7bfa0,
+ /* a9 */ 0xe8819a, 0xe88486, 0xe887ad, 0xe8b6a3,
+ /* ad */ 0xe98689, 0xe9a99f, 0xe9b7b2, 0xe581b4,
+ /* b1 */ 0xe4bb84, 0xe58ea0, 0xe683bb, 0xe6b8ac,
+ /* b5 */ 0xe5b1a4, 0xe4be88, 0xe580a4, 0xe597a4,
+ /* b9 */ 0xe5b399, 0xe5b99f, 0xe681a5, 0xe6a294,
+ /* bd */ 0xe6b2bb, 0xe6b784, 0xe786be, 0xe79794,
+ /* c1 */ 0xe797b4, 0xe799a1, 0xe7a89a, 0xe7a989,
+ /* c5 */ 0xe7b787, 0xe7b7bb, 0xe7bdae, 0xe887b4,
+ /* c9 */ 0xe89aa9, 0xe8bc9c, 0xe99b89, 0xe9a6b3,
+ /* cd */ 0xe9bd92, 0xe58987, 0xe58b85, 0xe9a3ad,
+ /* d1 */ 0xe8a6aa, 0xe4b883, 0xe69f92, 0xe6bc86,
+ /* d5 */ 0xe4beb5, 0xe5afa2, 0xe69e95, 0xe6b288,
+ /* d9 */ 0xe6b5b8, 0xe7909b, 0xe7a0a7, 0xe9879d,
+ /* dd */ 0xe98dbc, 0xe89f84, 0xe7a7a4, 0xe7a8b1,
+ /* e1 */ 0xe5bfab, 0xe4bb96, 0xe592a4, 0xe594be,
+ /* e5 */ 0xe5a2ae, 0xe5a6a5, 0xe683b0, 0xe68993,
+ /* e9 */ 0xe68b96, 0xe69cb6, 0xe6a595, 0xe888b5,
+ /* ed */ 0xe99980, 0xe9a6b1, 0xe9a79d, 0xe580ac,
+ /* f1 */ 0xe58d93, 0xe59584, 0xe59dbc, 0xefa881,
+ /* f5 */ 0xe68998, 0xefa882, 0xe693a2, 0xe699ab,
+ /* f9 */ 0xe69f9d, 0xe6bf81, 0xe6bfaf, 0xe790a2,
+ /* fd */ 0xe790b8, 0xe8a897,
+
+ /*** Two byte table, leaf: f7xx - offset 0x01ed7 ***/
+
+ /* a1 */ 0xe990b8, 0xe59191, 0xe59886, 0xe59da6,
+ /* a5 */ 0xe5bd88, 0xe6869a, 0xe6ad8e, 0xe78198,
+ /* a9 */ 0xe782ad, 0xe7b6bb, 0xe8aa95, 0xe5a5aa,
+ /* ad */ 0xe884ab, 0xe68ea2, 0xe79c88, 0xe880bd,
+ /* b1 */ 0xe8b2aa, 0xe5a194, 0xe690ad, 0xe6a6bb,
+ /* b5 */ 0xe5ae95, 0xe5b891, 0xe6b9af, 0xefa883,
+ /* b9 */ 0xe895a9, 0xe5858c, 0xe58fb0, 0xe5a4aa,
+ /* bd */ 0xe680a0, 0xe6858b, 0xe6ae86, 0xe6b1b0,
+ /* c1 */ 0xe6b3b0, 0xe7ac9e, 0xe8838e, 0xe88b94,
+ /* c5 */ 0xe8b786, 0xe982b0, 0xe9a2b1, 0xefa884,
+ /* c9 */ 0xe69387, 0xe6bea4, 0xe69291, 0xe69484,
+ /* cd */ 0xe5858e, 0xe59090, 0xe59c9f, 0xe8a88e,
+ /* d1 */ 0xe6859f, 0xe6a1b6, 0xefa885, 0xe7979b,
+ /* d5 */ 0xe7ad92, 0xe7b5b1, 0xe9809a, 0xe5a086,
+ /* d9 */ 0xe6a78c, 0xe885bf, 0xe8a4aa, 0xe98080,
+ /* dd */ 0xe9a0b9, 0xe581b8, 0xe5a597, 0xe5a6ac,
+ /* e1 */ 0xe68a95, 0xe9808f, 0xe9acaa, 0xe6859d,
+ /* e5 */ 0xe789b9, 0xe99796, 0xe59da1, 0xe5a986,
+ /* e9 */ 0xe5b7b4, 0xe68a8a, 0xe692ad, 0xe693ba,
+ /* ed */ 0xe69db7, 0xe6b3a2, 0xe6b4be, 0xe788ac,
+ /* f1 */ 0xe790b6, 0xe7a0b4, 0xe7bdb7, 0xe88aad,
+ /* f5 */ 0xe8b79b, 0xe9a097, 0xe588a4, 0xe59d82,
+ /* f9 */ 0xe69dbf, 0xe78988, 0xe793a3, 0xe8b2a9,
+ /* fd */ 0xe8bea6, 0xe98891,
+
+ /*** Two byte table, leaf: f8xx - offset 0x01f35 ***/
+
+ /* a1 */ 0xe998aa, 0xe585ab, 0xe58fad, 0xe68d8c,
+ /* a5 */ 0xe4bda9, 0xe59484, 0xe68296, 0xe69597,
+ /* a9 */ 0xe6b29b, 0xe6b5bf, 0xe7898c, 0xe78bbd,
+ /* ad */ 0xe7a897, 0xe8a687, 0xe8b29d, 0xe5bdad,
+ /* b1 */ 0xe6be8e, 0xe783b9, 0xe886a8, 0xe6848e,
+ /* b5 */ 0xe4bebf, 0xe5818f, 0xe68981, 0xe78987,
+ /* b9 */ 0xe7af87, 0xe7b7a8, 0xe7bfa9, 0xe9818d,
+ /* bd */ 0xe99ead, 0xe9a899, 0xe8b2b6, 0xe59daa,
+ /* c1 */ 0xe5b9b3, 0xe69eb0, 0xe8908d, 0xe8a995,
+ /* c5 */ 0xe590a0, 0xe5ac96, 0xe5b9a3, 0xe5bba2,
+ /* c9 */ 0xe5bc8a, 0xe69683, 0xe882ba, 0xe894bd,
+ /* cd */ 0xe99689, 0xe9999b, 0xe4bd88, 0xe58c85,
+ /* d1 */ 0xe58c8d, 0xe58c8f, 0xe59286, 0xe593ba,
+ /* d5 */ 0xe59c83, 0xe5b883, 0xe68096, 0xe68a9b,
+ /* d9 */ 0xe68ab1, 0xe68d95, 0xefa886, 0xe6b3a1,
+ /* dd */ 0xe6b5a6, 0xe796b1, 0xe7a0b2, 0xe8839e,
+ /* e1 */ 0xe884af, 0xe88b9e, 0xe891a1, 0xe892b2,
+ /* e5 */ 0xe8a28d, 0xe8a492, 0xe9808b, 0xe98baa,
+ /* e9 */ 0xe9a3bd, 0xe9ae91, 0xe5b985, 0xe69ab4,
+ /* ed */ 0xe69b9d, 0xe78091, 0xe78886, 0xefa887,
+ /* f1 */ 0xe4bfb5, 0xe589bd, 0xe5bdaa, 0xe68593,
+ /* f5 */ 0xe69d93, 0xe6a899, 0xe6bc82, 0xe793a2,
+ /* f9 */ 0xe7a5a8, 0xe8a1a8, 0xe8b1b9, 0xe9a387,
+ /* fd */ 0xe9a384, 0xe9a983,
+
+ /*** Two byte table, leaf: f9xx - offset 0x01f93 ***/
+
+ /* a1 */ 0xe59381, 0xe7a89f, 0xe6a593, 0xe8abb7,
+ /* a5 */ 0xe8b18a, 0xe9a2a8, 0xe9a6ae, 0xe5bdbc,
+ /* a9 */ 0xe68aab, 0xe796b2, 0xe79aae, 0xe8a2ab,
+ /* ad */ 0xe981bf, 0xe99982, 0xe58cb9, 0xe5bcbc,
+ /* b1 */ 0xe5bf85, 0xe6b38c, 0xe78f8c, 0xe795a2,
+ /* b5 */ 0xe7968b, 0xe7ad86, 0xe88bbe, 0xe9a69d,
+ /* b9 */ 0xe4b98f, 0xe980bc, 0xe4b88b, 0xe4bd95,
+ /* bd */ 0xe58ea6, 0xe5a48f, 0xe5bb88, 0xe698b0,
+ /* c1 */ 0xe6b2b3, 0xe79195, 0xe88db7, 0xe89da6,
+ /* c5 */ 0xe8b380, 0xe98190, 0xe99c9e, 0xe9b095,
+ /* c9 */ 0xe5a391, 0xe5adb8, 0xe89990, 0xe8ac94,
+ /* cd */ 0xe9b6b4, 0xe5af92, 0xe681a8, 0xe6828d,
+ /* d1 */ 0xe697b1, 0xe6b197, 0xe6bca2, 0xe6bea3,
+ /* d5 */ 0xe7809a, 0xe7bd95, 0xe7bfb0, 0xe99691,
+ /* d9 */ 0xe99692, 0xe99990, 0xe99f93, 0xe589b2,
+ /* dd */ 0xe8bd84, 0xe587bd, 0xe590ab, 0xe592b8,
+ /* e1 */ 0xe595a3, 0xe5968a, 0xe6aabb, 0xe6b6b5,
+ /* e5 */ 0xe7b798, 0xe889a6, 0xe98a9c, 0xe999b7,
+ /* e9 */ 0xe9b9b9, 0xe59088, 0xe59388, 0xe79b92,
+ /* ed */ 0xe89ba4, 0xe996a4, 0xe99794, 0xe9999c,
+ /* f1 */ 0xe4baa2, 0xe4bc89, 0xe5a7ae, 0xe5aba6,
+ /* f5 */ 0xe5b7b7, 0xe68192, 0xe68a97, 0xe69dad,
+ /* f9 */ 0xe6a181, 0xe6b286, 0xe6b8af, 0xe7bcb8,
+ /* fd */ 0xe8829b, 0xe888aa,
+
+ /*** Two byte table, leaf: faxx - offset 0x01ff1 ***/
+
+ /* a1 */ 0xefa888, 0xefa889, 0xe9a085, 0xe4baa5,
+ /* a5 */ 0xe58195, 0xe592b3, 0xe59e93, 0xe5a59a,
+ /* a9 */ 0xe5ada9, 0xe5aeb3, 0xe68788, 0xe6a5b7,
+ /* ad */ 0xe6b5b7, 0xe780a3, 0xe89fb9, 0xe8a7a3,
+ /* b1 */ 0xe8a9b2, 0xe8aba7, 0xe98282, 0xe9a7ad,
+ /* b5 */ 0xe9aab8, 0xe58abe, 0xe6a0b8, 0xe58096,
+ /* b9 */ 0xe5b9b8, 0xe69d8f, 0xe88d87, 0xe8a18c,
+ /* bd */ 0xe4baab, 0xe59091, 0xe59aae, 0xe78fa6,
+ /* c1 */ 0xe98495, 0xe99fbf, 0xe9a489, 0xe9a597,
+ /* c5 */ 0xe9a699, 0xe59993, 0xe5a29f, 0xe8999b,
+ /* c9 */ 0xe8a8b1, 0xe686b2, 0xe6abb6, 0xe78dbb,
+ /* cd */ 0xe8bb92, 0xe6ad87, 0xe99aaa, 0xe9a997,
+ /* d1 */ 0xe5a595, 0xe78880, 0xe8b5ab, 0xe99da9,
+ /* d5 */ 0xe4bf94, 0xe5b3b4, 0xe5bca6, 0xe687b8,
+ /* d9 */ 0xe6999b, 0xe6b3ab, 0xe782ab, 0xe78e84,
+ /* dd */ 0xe78eb9, 0xe78fbe, 0xe79ca9, 0xe79d8d,
+ /* e1 */ 0xe7b583, 0xe7b5a2, 0xe7b8a3, 0xe888b7,
+ /* e5 */ 0xe8a192, 0xefa88a, 0xe8b3a2, 0xe98989,
+ /* e9 */ 0xe9a1af, 0xe5ad91, 0xe7a9b4, 0xe8a180,
+ /* ed */ 0xe9a081, 0xe5ab8c, 0xe4bfa0, 0xe58d94,
+ /* f1 */ 0xe5a4be, 0xe5b3bd, 0xe68cbe, 0xe6b5b9,
+ /* f5 */ 0xe78bb9, 0xe88485, 0xe88487, 0xe88ea2,
+ /* f9 */ 0xe98b8f, 0xe9a0b0, 0xe4baa8, 0xe58584,
+ /* fd */ 0xe58891, 0xe59e8b,
+
+ /*** Two byte table, leaf: fbxx - offset 0x0204f ***/
+
+ /* a1 */ 0xe5bda2, 0xe6b382, 0xe6bb8e, 0xe78085,
+ /* a5 */ 0xe78190, 0xe782af, 0xe78692, 0xe78fa9,
+ /* a9 */ 0xe791a9, 0xe88d8a, 0xe89ea2, 0xe8a1a1,
+ /* ad */ 0xe98088, 0xe982a2, 0xe98ea3, 0xe9a6a8,
+ /* b1 */ 0xe585ae, 0xe5bd97, 0xe683a0, 0xe685a7,
+ /* b5 */ 0xe69ab3, 0xe89599, 0xe8b98a, 0xe986af,
+ /* b9 */ 0xe99e8b, 0xe4b98e, 0xe4ba92, 0xe591bc,
+ /* bd */ 0xe5a395, 0xe5a3ba, 0xe5a5bd, 0xe5b2b5,
+ /* c1 */ 0xe5bca7, 0xe688b6, 0xe68988, 0xe6988a,
+ /* c5 */ 0xe699a7, 0xe6afab, 0xe6b5a9, 0xe6b78f,
+ /* c9 */ 0xe6b996, 0xe6bbb8, 0xe6be94, 0xe6bfa0,
+ /* cd */ 0xe6bfa9, 0xe7819d, 0xe78b90, 0xe790a5,
+ /* d1 */ 0xe7919a, 0xe793a0, 0xe79a93, 0xe7a59c,
+ /* d5 */ 0xe7b38a, 0xe7b89e, 0xe883a1, 0xe88aa6,
+ /* d9 */ 0xe891ab, 0xe892bf, 0xe8998e, 0xe8999f,
+ /* dd */ 0xe89db4, 0xe8adb7, 0xe8b1aa, 0xe98eac,
+ /* e1 */ 0xe9a080, 0xe9a1a5, 0xe68391, 0xe68896,
+ /* e5 */ 0xe985b7, 0xe5a99a, 0xe6988f, 0xe6b7b7,
+ /* e9 */ 0xe6b8be, 0xe790bf, 0xe9ad82, 0xe5bfbd,
+ /* ed */ 0xe6839a, 0xe7ac8f, 0xe59384, 0xe5bc98,
+ /* f1 */ 0xe6b19e, 0xe6b393, 0xe6b4aa, 0xe78398,
+ /* f5 */ 0xe7b485, 0xe899b9, 0xe8a88c, 0xe9b4bb,
+ /* f9 */ 0xe58c96, 0xe5928c, 0xe5ac85, 0xe6a8ba,
+ /* fd */ 0xe781ab, 0xe795b5,
+
+ /*** Two byte table, leaf: fcxx - offset 0x020ad ***/
+
+ /* a1 */ 0xe7a68d, 0xe7a6be, 0xe88ab1, 0xe88faf,
+ /* a5 */ 0xe8a9b1, 0xe8ad81, 0xe8b2a8, 0xe99db4,
+ /* a9 */ 0xefa88b, 0xe693b4, 0xe694ab, 0xe7a2ba,
+ /* ad */ 0xe7a2bb, 0xe7a9ab, 0xe4b8b8, 0xe5969a,
+ /* b1 */ 0xe5a590, 0xe5aea6, 0xe5b9bb, 0xe682a3,
+ /* b5 */ 0xe68f9b, 0xe6ada1, 0xe699a5, 0xe6a193,
+ /* b9 */ 0xe6b899, 0xe785a5, 0xe792b0, 0xe7b488,
+ /* bd */ 0xe98284, 0xe9a9a9, 0xe9b0a5, 0xe6b4bb,
+ /* c1 */ 0xe6bb91, 0xe78cbe, 0xe8b181, 0xe9978a,
+ /* c5 */ 0xe587b0, 0xe5b98c, 0xe5bea8, 0xe6818d,
+ /* c9 */ 0xe683b6, 0xe684b0, 0xe6858c, 0xe69983,
+ /* cd */ 0xe69984, 0xe6a6a5, 0xe6b381, 0xe6b99f,
+ /* d1 */ 0xe6bb89, 0xe6bda2, 0xe7858c, 0xe7929c,
+ /* d5 */ 0xe79a87, 0xe7af81, 0xe7b0a7, 0xe88d92,
+ /* d9 */ 0xe89d97, 0xe98191, 0xe99a8d, 0xe9bb83,
+ /* dd */ 0xe58caf, 0xe59b9e, 0xe5bbbb, 0xe5be8a,
+ /* e1 */ 0xe681a2, 0xe68294, 0xe687b7, 0xe699a6,
+ /* e5 */ 0xe69c83, 0xe6aa9c, 0xe6b7ae, 0xe6beae,
+ /* e9 */ 0xe781b0, 0xe78daa, 0xe7b9aa, 0xe886be,
+ /* ed */ 0xe88cb4, 0xe89b94, 0xe8aaa8, 0xe8b384,
+ /* f1 */ 0xe58a83, 0xe78db2, 0xe5ae96, 0xe6a9ab,
+ /* f5 */ 0xe99084, 0xe593ae, 0xe59a86, 0xe5ad9d,
+ /* f9 */ 0xe69588, 0xe69685, 0xe69b89, 0xe6a29f,
+ /* fd */ 0xe6b68d, 0xe6b786,
+
+ /*** Two byte table, leaf: fdxx - offset 0x0210b ***/
+
+ /* a1 */ 0xe788bb, 0xe882b4, 0xe985b5, 0xe9a98d,
+ /* a5 */ 0xe4beaf, 0xe58099, 0xe58e9a, 0xe5908e,
+ /* a9 */ 0xe590bc, 0xe59689, 0xe59785, 0xe5b8bf,
+ /* ad */ 0xe5be8c, 0xe69cbd, 0xe785a6, 0xe78f9d,
+ /* b1 */ 0xe98085, 0xe58b9b, 0xe58bb3, 0xe5a1a4,
+ /* b5 */ 0xe5a38e, 0xe78484, 0xe7868f, 0xe787bb,
+ /* b9 */ 0xe896b0, 0xe8a893, 0xe69a88, 0xe896a8,
+ /* bd */ 0xe596a7, 0xe69a84, 0xe7858a, 0xe890b1,
+ /* c1 */ 0xe58d89, 0xe59699, 0xe6af81, 0xe5bd99,
+ /* c5 */ 0xe5bebd, 0xe68fae, 0xe69a89, 0xe78587,
+ /* c9 */ 0xe8abb1, 0xe8bc9d, 0xe9babe, 0xe4bc91,
+ /* cd */ 0xe690ba, 0xe7838b, 0xe795a6, 0xe899a7,
+ /* d1 */ 0xe681a4, 0xe8ad8e, 0xe9b7b8, 0xe58587,
+ /* d5 */ 0xe587b6, 0xe58c88, 0xe6b4b6, 0xe883b8,
+ /* d9 */ 0xe9bb91, 0xe69895, 0xe6aca3, 0xe78298,
+ /* dd */ 0xe79795, 0xe59083, 0xe5b1b9, 0xe7b487,
+ /* e1 */ 0xe8a896, 0xe6aca0, 0xe6acbd, 0xe6ad86,
+ /* e5 */ 0xe590b8, 0xe681b0, 0xe6b4bd, 0xe7bf95,
+ /* e9 */ 0xe88888, 0xe58396, 0xe5879e, 0xe5969c,
+ /* ed */ 0xe599ab, 0xe59b8d, 0xe5a7ac, 0xe5ac89,
+ /* f1 */ 0xe5b88c, 0xe68699, 0xe68698, 0xe688b1,
+ /* f5 */ 0xe6999e, 0xe69ba6, 0xe78699, 0xe786b9,
+ /* f9 */ 0xe786ba, 0xe78aa7, 0xe7a6a7, 0xe7a880,
+ /* fd */ 0xe7beb2, 0xe8a9b0
+};
diff --git a/src/backend/utils/mb/Unicode/euc_tw_to_utf8.map b/src/backend/utils/mb/Unicode/euc_tw_to_utf8.map
new file mode 100644
index 0000000..5a17746
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/euc_tw_to_utf8.map
@@ -0,0 +1,7834 @@
+/* src/backend/utils/mb/Unicode/euc_tw_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl */
+
+static const uint32 euc_tw_to_unicode_tree_table[27068];
+
+static const pg_mb_radix_tree euc_tw_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_tw_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x005e, /* offset of table for 2-byte inputs */
+ 0xa1, /* b2_1_lower */
+ 0xfd, /* b2_1_upper */
+ 0xa1, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x1899, /* offset of table for 4-byte inputs */
+ 0x8e, /* b4_1_lower */
+ 0x8e, /* b4_1_upper */
+ 0xa1, /* b4_2_lower */
+ 0xae, /* b4_2_upper */
+ 0xa1, /* b4_3_lower */
+ 0xfd, /* b4_3_upper */
+ 0xa1, /* b4_4_lower */
+ 0xfe /* b4_4_upper */
+};
+
+static const uint32 euc_tw_to_unicode_tree_table[27068] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0005e ***/
+
+ /* a1 */ 0x0000bb, 0x000119, 0x000177, 0x0001d5,
+ /* a5 */ 0x000233, 0x000291, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x0002ef, 0x000000, 0x00034d,
+ /* c5 */ 0x0003ab, 0x000409, 0x000467, 0x0004c5,
+ /* c9 */ 0x000523, 0x000581, 0x0005df, 0x00063d,
+ /* cd */ 0x00069b, 0x0006f9, 0x000757, 0x0007b5,
+ /* d1 */ 0x000813, 0x000871, 0x0008cf, 0x00092d,
+ /* d5 */ 0x00098b, 0x0009e9, 0x000a47, 0x000aa5,
+ /* d9 */ 0x000b03, 0x000b61, 0x000bbf, 0x000c1d,
+ /* dd */ 0x000c7b, 0x000cd9, 0x000d37, 0x000d95,
+ /* e1 */ 0x000df3, 0x000e51, 0x000eaf, 0x000f0d,
+ /* e5 */ 0x000f6b, 0x000fc9, 0x001027, 0x001085,
+ /* e9 */ 0x0010e3, 0x001141, 0x00119f, 0x0011fd,
+ /* ed */ 0x00125b, 0x0012b9, 0x001317, 0x001375,
+ /* f1 */ 0x0013d3, 0x001431, 0x00148f, 0x0014ed,
+ /* f5 */ 0x00154b, 0x0015a9, 0x001607, 0x001665,
+ /* f9 */ 0x0016c3, 0x001721, 0x00177f, 0x0017dd,
+ /* fd */ 0x00183b,
+
+ /*** Two byte table, leaf: a1xx - offset 0x000bb ***/
+
+ /* a1 */ 0xe38080, 0xefbc8c, 0xe38081, 0xe38082,
+ /* a5 */ 0xefbc8e, 0xe383bb, 0xefbc9b, 0xefbc9a,
+ /* a9 */ 0xefbc9f, 0xefbc81, 0xefb8b0, 0xe280a6,
+ /* ad */ 0xe280a5, 0xefb990, 0xefb991, 0xefb992,
+ /* b1 */ 0x00c2b7, 0xefb994, 0xefb995, 0xefb996,
+ /* b5 */ 0xefb997, 0xefb8b1, 0xe28094, 0xefb8b2,
+ /* b9 */ 0xe28093, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0xefbc88, 0xefbc89, 0xefb8b5,
+ /* c1 */ 0xefb8b6, 0xefbd9b, 0xefbd9d, 0xefb8b7,
+ /* c5 */ 0xefb8b8, 0xe38094, 0xe38095, 0xefb8b9,
+ /* c9 */ 0xefb8ba, 0xe38090, 0xe38091, 0xefb8bb,
+ /* cd */ 0xefb8bc, 0xe3808a, 0xe3808b, 0xefb8bd,
+ /* d1 */ 0xefb8be, 0xe38088, 0xe38089, 0xefb8bf,
+ /* d5 */ 0xefb980, 0xe3808c, 0xe3808d, 0xefb981,
+ /* d9 */ 0xefb982, 0xe3808e, 0xe3808f, 0xefb983,
+ /* dd */ 0xefb984, 0xefb999, 0xefb99a, 0xefb99b,
+ /* e1 */ 0xefb99c, 0xefb99d, 0xefb99e, 0xe28098,
+ /* e5 */ 0xe28099, 0xe2809c, 0xe2809d, 0xe3809d,
+ /* e9 */ 0xe3809e, 0xe280b2, 0xe280b5, 0xefbc83,
+ /* ed */ 0xefbc86, 0xefbc8a, 0xe280bb, 0x00c2a7,
+ /* f1 */ 0xe38083, 0xe2978b, 0xe2978f, 0xe296b3,
+ /* f5 */ 0xe296b2, 0xe2978e, 0xe29886, 0xe29885,
+ /* f9 */ 0xe29787, 0xe29786, 0xe296a1, 0xe296a0,
+ /* fd */ 0xe296bd, 0xe296bc,
+
+ /*** Two byte table, leaf: a2xx - offset 0x00119 ***/
+
+ /* a1 */ 0xe38aa3, 0xe28485, 0xe280be, 0x000000,
+ /* a5 */ 0xefbcbf, 0x000000, 0xefb989, 0xefb98a,
+ /* a9 */ 0xefb98d, 0xefb98e, 0xefb98b, 0xefb98c,
+ /* ad */ 0xefb99f, 0xefb9a0, 0xefb9a1, 0xefbc8b,
+ /* b1 */ 0xefbc8d, 0x00c397, 0x00c3b7, 0x00c2b1,
+ /* b5 */ 0xe2889a, 0xefbc9c, 0xefbc9e, 0xefbc9d,
+ /* b9 */ 0xe289a6, 0xe289a7, 0xe289a0, 0xe2889e,
+ /* bd */ 0xe28992, 0xe289a1, 0xefb9a2, 0xefb9a3,
+ /* c1 */ 0xefb9a4, 0xefb9a6, 0xefb9a5, 0xe288bc,
+ /* c5 */ 0xe288a9, 0xe288aa, 0xe28aa5, 0xe288a0,
+ /* c9 */ 0xe2889f, 0xe28abf, 0xe38f92, 0xe38f91,
+ /* cd */ 0xe288ab, 0xe288ae, 0xe288b5, 0xe288b4,
+ /* d1 */ 0xe29980, 0xe29982, 0xe29981, 0xe29889,
+ /* d5 */ 0xe28691, 0xe28693, 0xe28692, 0xe28690,
+ /* d9 */ 0xe28696, 0xe28697, 0xe28699, 0xe28698,
+ /* dd */ 0xe28096, 0xefbd9c, 0xefbc8f, 0xefbcbc,
+ /* e1 */ 0xe28895, 0xefb9a8, 0xefbc84, 0xefbfa5,
+ /* e5 */ 0xe38092, 0xefbfa0, 0xefbfa1, 0xefbc85,
+ /* e9 */ 0xefbca0, 0xe28483, 0xe28489, 0xefb9a9,
+ /* ed */ 0xefb9aa, 0xefb9ab, 0xe38f95, 0xe38e9c,
+ /* f1 */ 0xe38e9d, 0xe38e9e, 0xe38f8e, 0xe38ea1,
+ /* f5 */ 0xe38e8e, 0xe38e8f, 0xe38f84, 0x00c2b0,
+ /* f9 */ 0xe58599, 0xe5859b, 0xe5859e, 0xe5859d,
+ /* fd */ 0xe585a1, 0xe585a3,
+
+ /*** Two byte table, leaf: a3xx - offset 0x00177 ***/
+
+ /* a1 */ 0xe597a7, 0xe793a9, 0xe7b38e, 0xe29681,
+ /* a5 */ 0xe29682, 0xe29683, 0xe29684, 0xe29685,
+ /* a9 */ 0xe29686, 0xe29687, 0xe29688, 0xe2968f,
+ /* ad */ 0xe2968e, 0xe2968d, 0xe2968c, 0xe2968b,
+ /* b1 */ 0xe2968a, 0xe29689, 0xe294bc, 0xe294b4,
+ /* b5 */ 0xe294ac, 0xe294a4, 0xe2949c, 0xe29694,
+ /* b9 */ 0xe29480, 0xe29482, 0xe29695, 0xe2948c,
+ /* bd */ 0xe29490, 0xe29494, 0xe29498, 0xe295ad,
+ /* c1 */ 0xe295ae, 0xe295b0, 0xe295af, 0xe29590,
+ /* c5 */ 0xe2959e, 0xe295aa, 0xe295a1, 0xe297a2,
+ /* c9 */ 0xe297a3, 0xe297a5, 0xe297a4, 0xe295b1,
+ /* cd */ 0xe295b2, 0xe295b3, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a4xx - offset 0x001d5 ***/
+
+ /* a1 */ 0xefbc90, 0xefbc91, 0xefbc92, 0xefbc93,
+ /* a5 */ 0xefbc94, 0xefbc95, 0xefbc96, 0xefbc97,
+ /* a9 */ 0xefbc98, 0xefbc99, 0xe285a0, 0xe285a1,
+ /* ad */ 0xe285a2, 0xe285a3, 0xe285a4, 0xe285a5,
+ /* b1 */ 0xe285a6, 0xe285a7, 0xe285a8, 0xe285a9,
+ /* b5 */ 0xe380a1, 0xe380a2, 0xe380a3, 0xe380a4,
+ /* b9 */ 0xe380a5, 0xe380a6, 0xe380a7, 0xe380a8,
+ /* bd */ 0xe380a9, 0x000000, 0xe58d84, 0x000000,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0xefbd81, 0xefbd82,
+ /* dd */ 0xefbd83, 0xefbd84, 0xefbd85, 0xefbd86,
+ /* e1 */ 0xefbd87, 0xefbd88, 0xefbd89, 0xefbd8a,
+ /* e5 */ 0xefbd8b, 0xefbd8c, 0xefbd8d, 0xefbd8e,
+ /* e9 */ 0xefbd8f, 0xefbd90, 0xefbd91, 0xefbd92,
+ /* ed */ 0xefbd93, 0xefbd94, 0xefbd95, 0xefbd96,
+ /* f1 */ 0xefbd97, 0xefbd98, 0xefbd99, 0xefbd9a,
+ /* f5 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* f9 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* fd */ 0x00ce99, 0x00ce9a,
+
+ /*** Two byte table, leaf: a5xx - offset 0x00233 ***/
+
+ /* a1 */ 0x00ce9b, 0x00ce9c, 0x00ce9d, 0x00ce9e,
+ /* a5 */ 0x00ce9f, 0x00cea0, 0x00cea1, 0x00cea3,
+ /* a9 */ 0x00cea4, 0x00cea5, 0x00cea6, 0x00cea7,
+ /* ad */ 0x00cea8, 0x00cea9, 0x00ceb1, 0x00ceb2,
+ /* b1 */ 0x00ceb3, 0x00ceb4, 0x00ceb5, 0x00ceb6,
+ /* b5 */ 0x00ceb7, 0x00ceb8, 0x00ceb9, 0x00ceba,
+ /* b9 */ 0x00cebb, 0x00cebc, 0x00cebd, 0x00cebe,
+ /* bd */ 0x00cebf, 0x00cf80, 0x00cf81, 0x00cf83,
+ /* c1 */ 0x00cf84, 0x00cf85, 0x00cf86, 0x00cf87,
+ /* c5 */ 0x00cf88, 0x00cf89, 0xe38485, 0xe38486,
+ /* c9 */ 0xe38487, 0xe38488, 0xe38489, 0xe3848a,
+ /* cd */ 0xe3848b, 0xe3848c, 0xe3848d, 0xe3848e,
+ /* d1 */ 0xe3848f, 0xe38490, 0xe38491, 0xe38492,
+ /* d5 */ 0xe38493, 0xe38494, 0xe38495, 0xe38496,
+ /* d9 */ 0xe38497, 0xe38498, 0xe38499, 0xe3849a,
+ /* dd */ 0xe3849b, 0xe3849c, 0xe3849d, 0xe3849e,
+ /* e1 */ 0xe3849f, 0xe384a0, 0xe384a1, 0xe384a2,
+ /* e5 */ 0xe384a3, 0xe384a4, 0xe384a5, 0xe384a6,
+ /* e9 */ 0xe384a7, 0xe384a8, 0xe384a9, 0x00cb99,
+ /* ed */ 0x00cb89, 0x00cb8a, 0x00cb87, 0x00cb8b,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x00291 ***/
+
+ /* a1 */ 0xe291a0, 0xe291a1, 0xe291a2, 0xe291a3,
+ /* a5 */ 0xe291a4, 0xe291a5, 0xe291a6, 0xe291a7,
+ /* a9 */ 0xe291a8, 0xe291a9, 0xe291b4, 0xe291b5,
+ /* ad */ 0xe291b6, 0xe291b7, 0xe291b8, 0xe291b9,
+ /* b1 */ 0xe291ba, 0xe291bb, 0xe291bc, 0xe291bd,
+ /* b5 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* b9 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* bd */ 0xe285b8, 0xe285b9, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: c2xx - offset 0x002ef ***/
+
+ /* a1 */ 0xe29080, 0xe29081, 0xe29082, 0xe29083,
+ /* a5 */ 0xe29084, 0xe29085, 0xe29086, 0xe29087,
+ /* a9 */ 0xe29088, 0xe29089, 0xe2908a, 0xe2908b,
+ /* ad */ 0xe2908c, 0xe2908d, 0xe2908e, 0xe2908f,
+ /* b1 */ 0xe29090, 0xe29091, 0xe29092, 0xe29093,
+ /* b5 */ 0xe29094, 0xe29095, 0xe29096, 0xe29097,
+ /* b9 */ 0xe29098, 0xe29099, 0xe2909a, 0xe2909b,
+ /* bd */ 0xe2909c, 0xe2909d, 0xe2909e, 0xe2909f,
+ /* c1 */ 0xe290a1, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: c4xx - offset 0x0034d ***/
+
+ /* a1 */ 0xe4b880, 0xe4b999, 0xe4b881, 0xe4b883,
+ /* a5 */ 0xe4b983, 0xe4b99d, 0xe4ba86, 0xe4ba8c,
+ /* a9 */ 0xe4baba, 0xe584bf, 0xe585a5, 0xe585ab,
+ /* ad */ 0xe587a0, 0xe58880, 0xe58881, 0xe58a9b,
+ /* b1 */ 0xe58c95, 0xe58d81, 0xe58d9c, 0xe58f88,
+ /* b5 */ 0xe4b889, 0xe4b88b, 0xe4b888, 0xe4b88a,
+ /* b9 */ 0xe4b8ab, 0xe4b8b8, 0xe587a1, 0xe4b985,
+ /* bd */ 0xe4b988, 0xe4b99f, 0xe4b99e, 0xe4ba8e,
+ /* c1 */ 0xe4baa1, 0xe58580, 0xe58883, 0xe58bba,
+ /* c5 */ 0xe58d83, 0xe58f89, 0xe58fa3, 0xe59c9f,
+ /* c9 */ 0xe5a3ab, 0xe5a495, 0xe5a4a7, 0xe5a5b3,
+ /* cd */ 0xe5ad90, 0xe5ad91, 0xe5ad93, 0xe5afb8,
+ /* d1 */ 0xe5b08f, 0xe5b0a2, 0xe5b0b8, 0xe5b1b1,
+ /* d5 */ 0xe5b79d, 0xe5b7a5, 0xe5b7b1, 0xe5b7b2,
+ /* d9 */ 0xe5b7b3, 0xe5b7be, 0xe5b9b2, 0xe5bbbe,
+ /* dd */ 0xe5bc8b, 0xe5bc93, 0xe6898d, 0xe4b891,
+ /* e1 */ 0xe4b890, 0xe4b88d, 0xe4b8ad, 0xe4b8b0,
+ /* e5 */ 0xe4b8b9, 0xe4b98b, 0xe5b0b9, 0xe4ba88,
+ /* e9 */ 0xe4ba91, 0xe4ba95, 0xe4ba92, 0xe4ba94,
+ /* ed */ 0xe4baa2, 0xe4bb81, 0xe4bb80, 0xe4bb83,
+ /* f1 */ 0xe4bb86, 0xe4bb87, 0xe4bb8d, 0xe4bb8a,
+ /* f5 */ 0xe4bb8b, 0xe4bb84, 0xe58583, 0xe58581,
+ /* f9 */ 0xe585a7, 0xe585ad, 0xe585ae, 0xe585ac,
+ /* fd */ 0xe58697, 0xe587b6,
+
+ /*** Two byte table, leaf: c5xx - offset 0x003ab ***/
+
+ /* a1 */ 0xe58886, 0xe58887, 0xe58888, 0xe58bbb,
+ /* a5 */ 0xe58bbe, 0xe58bbf, 0xe58c96, 0xe58cb9,
+ /* a9 */ 0xe58d88, 0xe58d87, 0xe58d85, 0xe58d9e,
+ /* ad */ 0xe58e84, 0xe58f8b, 0xe58f8a, 0xe58f8d,
+ /* b1 */ 0xe5a3ac, 0xe5a4a9, 0xe5a4ab, 0xe5a4aa,
+ /* b5 */ 0xe5a4ad, 0xe5ad94, 0xe5b091, 0xe5b0a4,
+ /* b9 */ 0xe5b0ba, 0xe5b1af, 0xe5b7b4, 0xe5b9bb,
+ /* bd */ 0xe5bbbf, 0xe5bc94, 0xe5bc95, 0xe5bf83,
+ /* c1 */ 0xe68888, 0xe688b6, 0xe6898b, 0xe6898e,
+ /* c5 */ 0xe694af, 0xe69687, 0xe69697, 0xe696a4,
+ /* c9 */ 0xe696b9, 0xe697a5, 0xe69bb0, 0xe69c88,
+ /* cd */ 0xe69ca8, 0xe6aca0, 0xe6ada2, 0xe6adb9,
+ /* d1 */ 0xe6af8b, 0xe6af94, 0xe6af9b, 0xe6b08f,
+ /* d5 */ 0xe6b0b4, 0xe781ab, 0xe788aa, 0xe788b6,
+ /* d9 */ 0xe788bb, 0xe78987, 0xe78999, 0xe7899b,
+ /* dd */ 0xe78aac, 0xe78e8b, 0xe4b899, 0xe4b896,
+ /* e1 */ 0xe4b895, 0xe4b894, 0xe4b898, 0xe4b8bb,
+ /* e5 */ 0xe4b98d, 0xe4b98f, 0xe4b98e, 0xe4bba5,
+ /* e9 */ 0xe4bb98, 0xe4bb94, 0xe4bb95, 0xe4bb96,
+ /* ed */ 0xe4bb97, 0xe4bba3, 0xe4bba4, 0xe4bb99,
+ /* f1 */ 0xe4bb9e, 0xe58585, 0xe58584, 0xe58689,
+ /* f5 */ 0xe5868a, 0xe586ac, 0xe587b9, 0xe587ba,
+ /* f9 */ 0xe587b8, 0xe5888a, 0xe58aa0, 0xe58a9f,
+ /* fd */ 0xe58c85, 0xe58c86,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00409 ***/
+
+ /* a1 */ 0xe58c97, 0xe58c9d, 0xe4bb9f, 0xe58d8a,
+ /* a5 */ 0xe58d89, 0xe58da1, 0xe58da0, 0xe58daf,
+ /* a9 */ 0xe58dae, 0xe58ebb, 0xe58faf, 0xe58fa4,
+ /* ad */ 0xe58fb3, 0xe58fac, 0xe58fae, 0xe58fa9,
+ /* b1 */ 0xe58fa8, 0xe58fbc, 0xe58fb8, 0xe58fb5,
+ /* b5 */ 0xe58fab, 0xe58fa6, 0xe58faa, 0xe58fb2,
+ /* b9 */ 0xe58fb1, 0xe58fb0, 0xe58fa5, 0xe58fad,
+ /* bd */ 0xe58fbb, 0xe59b9b, 0xe59b9a, 0xe5a496,
+ /* c1 */ 0xe5a4ae, 0xe5a4b1, 0xe5a5b4, 0xe5a5b6,
+ /* c5 */ 0xe5ad95, 0xe5ae83, 0xe5b0bc, 0xe5b7a8,
+ /* c9 */ 0xe5b7a7, 0xe5b7a6, 0xe5b882, 0xe5b883,
+ /* cd */ 0xe5b9b3, 0xe5b9bc, 0xe5bc81, 0xe5bc98,
+ /* d1 */ 0xe5bc97, 0xe5bf85, 0xe6888a, 0xe68993,
+ /* d5 */ 0xe68994, 0xe68992, 0xe68991, 0xe696a5,
+ /* d9 */ 0xe697a6, 0xe69cae, 0xe69cac, 0xe69caa,
+ /* dd */ 0xe69cab, 0xe69cad, 0xe6ada3, 0xe6af8d,
+ /* e1 */ 0xe6b091, 0xe6b090, 0xe6b0b8, 0xe6b181,
+ /* e5 */ 0xe6b180, 0xe6b0be, 0xe78aaf, 0xe78e84,
+ /* e9 */ 0xe78e89, 0xe7939c, 0xe793a6, 0xe79498,
+ /* ed */ 0xe7949f, 0xe794a8, 0xe794a9, 0xe794b0,
+ /* f1 */ 0xe794b1, 0xe794b2, 0xe794b3, 0xe7968b,
+ /* f5 */ 0xe799bd, 0xe79aae, 0xe79abf, 0xe79bae,
+ /* f9 */ 0xe79f9b, 0xe79fa2, 0xe79fb3, 0xe7a4ba,
+ /* fd */ 0xe7a6be, 0xe7a9b4,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00467 ***/
+
+ /* a1 */ 0xe7ab8b, 0xe4b89e, 0xe4b89f, 0xe4b992,
+ /* a5 */ 0xe4b993, 0xe4b9a9, 0xe4ba99, 0xe4baa4,
+ /* a9 */ 0xe4baa6, 0xe4baa5, 0xe4bbbf, 0xe4bc89,
+ /* ad */ 0xe4bc99, 0xe4bc8a, 0xe4bc95, 0xe4bc8d,
+ /* b1 */ 0xe4bc90, 0xe4bc91, 0xe4bc8f, 0xe4bbb2,
+ /* b5 */ 0xe4bbb6, 0xe4bbbb, 0xe4bbb0, 0xe4bbb3,
+ /* b9 */ 0xe4bbbd, 0xe4bc81, 0xe4bc8b, 0xe58589,
+ /* bd */ 0xe58587, 0xe58586, 0xe58588, 0xe585a8,
+ /* c1 */ 0xe585b1, 0xe5868d, 0xe586b0, 0xe58897,
+ /* c5 */ 0xe58891, 0xe58892, 0xe5888e, 0xe58896,
+ /* c9 */ 0xe58aa3, 0xe58c88, 0xe58ca1, 0xe58ca0,
+ /* cd */ 0xe58db0, 0xe58db1, 0xe59089, 0xe5908f,
+ /* d1 */ 0xe5908c, 0xe5908a, 0xe59090, 0xe59081,
+ /* d5 */ 0xe5908b, 0xe59084, 0xe59091, 0xe5908d,
+ /* d9 */ 0xe59088, 0xe59083, 0xe5908e, 0xe59086,
+ /* dd */ 0xe59092, 0xe59ba0, 0xe59b9e, 0xe59b9d,
+ /* e1 */ 0xe59cb3, 0xe59cb0, 0xe59ca8, 0xe59cad,
+ /* e5 */ 0xe59cac, 0xe59caf, 0xe59ca9, 0xe5a499,
+ /* e9 */ 0xe5a49a, 0xe5a4b7, 0xe5a4b8, 0xe5a684,
+ /* ed */ 0xe5a5b8, 0xe5a683, 0xe5a5bd, 0xe5a5b9,
+ /* f1 */ 0xe5a682, 0xe5a681, 0xe5ad97, 0xe5ad98,
+ /* f5 */ 0xe5ae87, 0xe5ae88, 0xe5ae85, 0xe5ae89,
+ /* f9 */ 0xe5afba, 0xe5b096, 0xe5b1b9, 0xe5b79e,
+ /* fd */ 0xe5b886, 0xe5b9b6,
+
+ /*** Two byte table, leaf: c8xx - offset 0x004c5 ***/
+
+ /* a1 */ 0xe5b9b4, 0xe5bc8f, 0xe5bc9b, 0xe5bf99,
+ /* a5 */ 0xe5bf96, 0xe6888e, 0xe6888c, 0xe6888d,
+ /* a9 */ 0xe68890, 0xe689a3, 0xe6899b, 0xe68998,
+ /* ad */ 0xe694b6, 0xe697a9, 0xe697a8, 0xe697ac,
+ /* b1 */ 0xe697ad, 0xe69bb2, 0xe69bb3, 0xe69c89,
+ /* b5 */ 0xe69cbd, 0xe69cb4, 0xe69cb1, 0xe69cb5,
+ /* b9 */ 0xe6aca1, 0xe6ada4, 0xe6adbb, 0xe6b096,
+ /* bd */ 0xe6b19d, 0xe6b197, 0xe6b199, 0xe6b19f,
+ /* c1 */ 0xe6b1a0, 0xe6b190, 0xe6b195, 0xe6b1a1,
+ /* c5 */ 0xe6b19b, 0xe6b18d, 0xe6b18e, 0xe781b0,
+ /* c9 */ 0xe7899f, 0xe7899d, 0xe799be, 0xe7abb9,
+ /* cd */ 0xe7b1b3, 0xe7b3b8, 0xe7bcb6, 0xe7be8a,
+ /* d1 */ 0xe7bebd, 0xe88081, 0xe88083, 0xe8808c,
+ /* d5 */ 0xe88092, 0xe880b3, 0xe881bf, 0xe88289,
+ /* d9 */ 0xe8828b, 0xe8828c, 0xe887a3, 0xe887aa,
+ /* dd */ 0xe887b3, 0xe887bc, 0xe8888c, 0xe8889b,
+ /* e1 */ 0xe8889f, 0xe889ae, 0xe889b2, 0xe889be,
+ /* e5 */ 0xe899ab, 0xe8a180, 0xe8a18c, 0xe8a1a3,
+ /* e9 */ 0xe8a5bf, 0xe998a1, 0xe4b8b2, 0xe4baa8,
+ /* ed */ 0xe4bd8d, 0xe4bd8f, 0xe4bd87, 0xe4bd97,
+ /* f1 */ 0xe4bd9e, 0xe4bcb4, 0xe4bd9b, 0xe4bd95,
+ /* f5 */ 0xe4bcb0, 0xe4bd90, 0xe4bd91, 0xe4bcbd,
+ /* f9 */ 0xe4bcba, 0xe4bcb8, 0xe4bd83, 0xe4bd94,
+ /* fd */ 0xe4bcbc, 0xe4bd86,
+
+ /*** Two byte table, leaf: c9xx - offset 0x00523 ***/
+
+ /* a1 */ 0xe4bda3, 0xe4bd9c, 0xe4bda0, 0xe4bcaf,
+ /* a5 */ 0xe4bd8e, 0xe4bcb6, 0xe4bd99, 0xe4bd9d,
+ /* a9 */ 0xe4bd88, 0xe4bd9a, 0xe5858c, 0xe5858b,
+ /* ad */ 0xe5858d, 0xe585b5, 0xe586b6, 0xe586b7,
+ /* b1 */ 0xe588a5, 0xe588a4, 0xe588a9, 0xe588aa,
+ /* b5 */ 0xe588a8, 0xe58aab, 0xe58aa9, 0xe58aaa,
+ /* b9 */ 0xe58aac, 0xe58ca3, 0xe58db3, 0xe58db5,
+ /* bd */ 0xe5909d, 0xe590ad, 0xe5909e, 0xe590be,
+ /* c1 */ 0xe590a6, 0xe5918e, 0xe590a7, 0xe59186,
+ /* c5 */ 0xe59183, 0xe590b3, 0xe59188, 0xe59182,
+ /* c9 */ 0xe5909b, 0xe590a9, 0xe5918a, 0xe590b9,
+ /* cd */ 0xe590bb, 0xe590b8, 0xe590ae, 0xe590b5,
+ /* d1 */ 0xe590b6, 0xe590a0, 0xe590bc, 0xe59180,
+ /* d5 */ 0xe590b1, 0xe590ab, 0xe5909f, 0xe590ac,
+ /* d9 */ 0xe59baa, 0xe59bb0, 0xe59ba4, 0xe59bab,
+ /* dd */ 0xe59d8a, 0xe59d91, 0xe59d80, 0xe59d8d,
+ /* e1 */ 0xe59d87, 0xe59d8e, 0xe59cbe, 0xe59d90,
+ /* e5 */ 0xe59d8f, 0xe59cbb, 0xe5a3af, 0xe5a4be,
+ /* e9 */ 0xe5a69d, 0xe5a692, 0xe5a6a8, 0xe5a69e,
+ /* ed */ 0xe5a6a3, 0xe5a699, 0xe5a696, 0xe5a68d,
+ /* f1 */ 0xe5a6a4, 0xe5a693, 0xe5a68a, 0xe5a6a5,
+ /* f5 */ 0xe5ad9d, 0xe5ad9c, 0xe5ad9a, 0xe5ad9b,
+ /* f9 */ 0xe5ae8c, 0xe5ae8b, 0xe5ae8f, 0xe5b0ac,
+ /* fd */ 0xe5b180, 0xe5b181,
+
+ /*** Two byte table, leaf: caxx - offset 0x00581 ***/
+
+ /* a1 */ 0xe5b0bf, 0xe5b0be, 0xe5b290, 0xe5b291,
+ /* a5 */ 0xe5b294, 0xe5b28c, 0xe5b7ab, 0xe5b88c,
+ /* a9 */ 0xe5ba8f, 0xe5ba87, 0xe5ba8a, 0xe5bbb7,
+ /* ad */ 0xe5bc84, 0xe5bc9f, 0xe5bda4, 0xe5bda2,
+ /* b1 */ 0xe5bdb7, 0xe5bdb9, 0xe5bf98, 0xe5bf8c,
+ /* b5 */ 0xe5bf97, 0xe5bf8d, 0xe5bfb1, 0xe5bfab,
+ /* b9 */ 0xe5bfb8, 0xe5bfaa, 0xe68892, 0xe68891,
+ /* bd */ 0xe68a84, 0xe68a97, 0xe68a96, 0xe68a80,
+ /* c1 */ 0xe689b6, 0xe68a89, 0xe689ad, 0xe68a8a,
+ /* c5 */ 0xe689bc, 0xe689be, 0xe689b9, 0xe689b3,
+ /* c9 */ 0xe68a92, 0xe689af, 0xe68a98, 0xe689ae,
+ /* cd */ 0xe68a95, 0xe68a93, 0xe68a91, 0xe68a86,
+ /* d1 */ 0xe694b9, 0xe694bb, 0xe694b8, 0xe697b1,
+ /* d5 */ 0xe69bb4, 0xe69d9f, 0xe69d8e, 0xe69d8f,
+ /* d9 */ 0xe69d90, 0xe69d91, 0xe69d9c, 0xe69d96,
+ /* dd */ 0xe69d9e, 0xe69d89, 0xe69d86, 0xe69da0,
+ /* e1 */ 0xe69d93, 0xe69d97, 0xe6ada5, 0xe6af8f,
+ /* e5 */ 0xe6b182, 0xe6b19e, 0xe6b299, 0xe6b281,
+ /* e9 */ 0xe6b288, 0xe6b289, 0xe6b285, 0xe6b29b,
+ /* ed */ 0xe6b1aa, 0xe6b1ba, 0xe6b290, 0xe6b1b0,
+ /* f1 */ 0xe6b28c, 0xe6b1a8, 0xe6b296, 0xe6b292,
+ /* f5 */ 0xe6b1bd, 0xe6b283, 0xe6b1b2, 0xe6b1be,
+ /* f9 */ 0xe6b1b4, 0xe6b286, 0xe6b1b6, 0xe6b28d,
+ /* fd */ 0xe6b294, 0xe6b298,
+
+ /*** Two byte table, leaf: cbxx - offset 0x005df ***/
+
+ /* a1 */ 0xe6b282, 0xe781b6, 0xe781bc, 0xe781bd,
+ /* a5 */ 0xe781b8, 0xe789a2, 0xe789a1, 0xe789a0,
+ /* a9 */ 0xe78b84, 0xe78b82, 0xe78e96, 0xe794ac,
+ /* ad */ 0xe794ab, 0xe794b7, 0xe794b8, 0xe79a82,
+ /* b1 */ 0xe79baf, 0xe79fa3, 0xe7a781, 0xe7a780,
+ /* b5 */ 0xe7a6bf, 0xe7a9b6, 0xe7b3bb, 0xe7bd95,
+ /* b9 */ 0xe88296, 0xe88293, 0xe8829d, 0xe88298,
+ /* bd */ 0xe8829b, 0xe8829a, 0xe882b2, 0xe889af,
+ /* c1 */ 0xe88a92, 0xe88a8b, 0xe88a8d, 0xe8a68b,
+ /* c5 */ 0xe8a792, 0xe8a880, 0xe8b0b7, 0xe8b186,
+ /* c9 */ 0xe8b195, 0xe8b29d, 0xe8b5a4, 0xe8b5b0,
+ /* cd */ 0xe8b6b3, 0xe8baab, 0xe8bb8a, 0xe8be9b,
+ /* d1 */ 0xe8beb0, 0xe8bf82, 0xe8bf86, 0xe8bf85,
+ /* d5 */ 0xe8bf84, 0xe5b7a1, 0xe98291, 0xe982a2,
+ /* d9 */ 0xe982aa, 0xe982a6, 0xe982a3, 0xe98589,
+ /* dd */ 0xe98786, 0xe9878c, 0xe998b2, 0xe998ae,
+ /* e1 */ 0xe998b1, 0xe998aa, 0xe998ac, 0xe4b8a6,
+ /* e5 */ 0xe4b996, 0xe4b9b3, 0xe4ba8b, 0xe4ba9b,
+ /* e9 */ 0xe4ba9e, 0xe4baab, 0xe4baac, 0xe4bdaf,
+ /* ed */ 0xe4be9d, 0xe4be8d, 0xe4bdb3, 0xe4bdbf,
+ /* f1 */ 0xe4bdac, 0xe4be9b, 0xe4be8b, 0xe4be86,
+ /* f5 */ 0xe4be83, 0xe4bdb0, 0xe4bdb5, 0xe4be88,
+ /* f9 */ 0xe4bda9, 0xe4bdbb, 0xe4be96, 0xe4bdbe,
+ /* fd */ 0xe4be8f, 0xe4be91,
+
+ /*** Two byte table, leaf: ccxx - offset 0x0063d ***/
+
+ /* a1 */ 0xe4bdba, 0xe58594, 0xe58592, 0xe58595,
+ /* a5 */ 0xe585a9, 0xe585b7, 0xe585b6, 0xe585b8,
+ /* a9 */ 0xe586bd, 0xe587bd, 0xe588bb, 0xe588b8,
+ /* ad */ 0xe588b7, 0xe588ba, 0xe588b0, 0xe588ae,
+ /* b1 */ 0xe588b6, 0xe58981, 0xe58abe, 0xe58abb,
+ /* b5 */ 0xe58d92, 0xe58d94, 0xe58d93, 0xe58d91,
+ /* b9 */ 0xe58da6, 0xe58db7, 0xe58db8, 0xe58db9,
+ /* bd */ 0xe58f96, 0xe58f94, 0xe58f97, 0xe591b3,
+ /* c1 */ 0xe591b5, 0xe59296, 0xe591b8, 0xe59295,
+ /* c5 */ 0xe59280, 0xe591bb, 0xe591b7, 0xe59284,
+ /* c9 */ 0xe59292, 0xe59286, 0xe591bc, 0xe59290,
+ /* cd */ 0xe591b1, 0xe591b6, 0xe5928c, 0xe5929a,
+ /* d1 */ 0xe591a2, 0xe591a8, 0xe5928b, 0xe591bd,
+ /* d5 */ 0xe5928e, 0xe59bba, 0xe59e83, 0xe59db7,
+ /* d9 */ 0xe59daa, 0xe59da9, 0xe59da1, 0xe59da6,
+ /* dd */ 0xe59da4, 0xe59dbc, 0xe5a49c, 0xe5a589,
+ /* e1 */ 0xe5a587, 0xe5a588, 0xe5a584, 0xe5a594,
+ /* e5 */ 0xe5a6be, 0xe5a6bb, 0xe5a794, 0xe5a6b9,
+ /* e9 */ 0xe5a6ae, 0xe5a791, 0xe5a786, 0xe5a790,
+ /* ed */ 0xe5a78d, 0xe5a78b, 0xe5a793, 0xe5a78a,
+ /* f1 */ 0xe5a6af, 0xe5a6b3, 0xe5a792, 0xe5a785,
+ /* f5 */ 0xe5ad9f, 0xe5ada4, 0xe5ada3, 0xe5ae97,
+ /* f9 */ 0xe5ae9a, 0xe5ae98, 0xe5ae9c, 0xe5ae99,
+ /* fd */ 0xe5ae9b, 0xe5b09a,
+
+ /*** Two byte table, leaf: cdxx - offset 0x0069b ***/
+
+ /* a1 */ 0xe5b188, 0xe5b185, 0xe5b186, 0xe5b2b7,
+ /* a5 */ 0xe5b2a1, 0xe5b2b8, 0xe5b2a9, 0xe5b2ab,
+ /* a9 */ 0xe5b2b1, 0xe5b2b3, 0xe5b898, 0xe5b89a,
+ /* ad */ 0xe5b896, 0xe5b895, 0xe5b89b, 0xe5b891,
+ /* b1 */ 0xe5b9b8, 0xe5ba9a, 0xe5ba97, 0xe5ba9c,
+ /* b5 */ 0xe5ba95, 0xe5ba96, 0xe5bbb6, 0xe5bca6,
+ /* b9 */ 0xe5bca7, 0xe5bca9, 0xe5be80, 0xe5be81,
+ /* bd */ 0xe5bdbf, 0xe5bdbc, 0xe5bf9d, 0xe5bfa0,
+ /* c1 */ 0xe5bfbd, 0xe5bfb5, 0xe5bfbf, 0xe6808f,
+ /* c5 */ 0xe68094, 0xe680af, 0xe680b5, 0xe68096,
+ /* c9 */ 0xe680aa, 0xe68095, 0xe680a1, 0xe680a7,
+ /* cd */ 0xe680a9, 0xe680ab, 0xe6809b, 0xe68896,
+ /* d1 */ 0xe68895, 0xe688bf, 0xe688be, 0xe68980,
+ /* d5 */ 0xe689bf, 0xe68b89, 0xe68b8c, 0xe68b84,
+ /* d9 */ 0xe68abf, 0xe68b82, 0xe68ab9, 0xe68b92,
+ /* dd */ 0xe68b9b, 0xe68aab, 0xe68b93, 0xe68b94,
+ /* e1 */ 0xe68b8b, 0xe68b88, 0xe68aa8, 0xe68abd,
+ /* e5 */ 0xe68abc, 0xe68b90, 0xe68b99, 0xe68b87,
+ /* e9 */ 0xe68b8d, 0xe68ab5, 0xe68b9a, 0xe68ab1,
+ /* ed */ 0xe68b98, 0xe68b96, 0xe68b97, 0xe68b86,
+ /* f1 */ 0xe68aac, 0xe68b8e, 0xe694be, 0xe696a7,
+ /* f5 */ 0xe696bc, 0xe697ba, 0xe69894, 0xe69893,
+ /* f9 */ 0xe6988c, 0xe69886, 0xe69882, 0xe6988e,
+ /* fd */ 0xe69880, 0xe6988f,
+
+ /*** Two byte table, leaf: cexx - offset 0x006f9 ***/
+
+ /* a1 */ 0xe69895, 0xe6988a, 0xe69887, 0xe69c8d,
+ /* a5 */ 0xe69c8b, 0xe69dad, 0xe69e8b, 0xe69e95,
+ /* a9 */ 0xe69db1, 0xe69e9c, 0xe69db3, 0xe69db7,
+ /* ad */ 0xe69e87, 0xe69e9d, 0xe69e97, 0xe69daf,
+ /* b1 */ 0xe69db0, 0xe69dbf, 0xe69e89, 0xe69dbe,
+ /* b5 */ 0xe69e90, 0xe69db5, 0xe69e9a, 0xe69e93,
+ /* b9 */ 0xe69dbc, 0xe69daa, 0xe69db2, 0xe6aca3,
+ /* bd */ 0xe6ada6, 0xe6ada7, 0xe6adbf, 0xe6b093,
+ /* c1 */ 0xe6b09b, 0xe6b3a3, 0xe6b3a8, 0xe6b3b3,
+ /* c5 */ 0xe6b2b1, 0xe6b38c, 0xe6b3a5, 0xe6b2b3,
+ /* c9 */ 0xe6b2bd, 0xe6b2be, 0xe6b2bc, 0xe6b3a2,
+ /* cd */ 0xe6b2ab, 0xe6b395, 0xe6b393, 0xe6b2b8,
+ /* d1 */ 0xe6b384, 0xe6b2b9, 0xe6b381, 0xe6b2ae,
+ /* d5 */ 0xe6b397, 0xe6b385, 0xe6b3b1, 0xe6b2bf,
+ /* d9 */ 0xe6b2bb, 0xe6b3a1, 0xe6b39b, 0xe6b38a,
+ /* dd */ 0xe6b2ac, 0xe6b3af, 0xe6b39c, 0xe6b396,
+ /* e1 */ 0xe6b3a0, 0xe78295, 0xe7828e, 0xe78292,
+ /* e5 */ 0xe7828a, 0xe78299, 0xe788ac, 0xe788ad,
+ /* e9 */ 0xe788b8, 0xe78988, 0xe789a7, 0xe789a9,
+ /* ed */ 0xe78b80, 0xe78b8e, 0xe78b99, 0xe78b97,
+ /* f1 */ 0xe78b90, 0xe78ea9, 0xe78ea8, 0xe78e9f,
+ /* f5 */ 0xe78eab, 0xe78ea5, 0xe794bd, 0xe7969d,
+ /* f9 */ 0xe79699, 0xe7969a, 0xe79a84, 0xe79b82,
+ /* fd */ 0xe79bb2, 0xe79bb4,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00757 ***/
+
+ /* a1 */ 0xe79fa5, 0xe79fbd, 0xe7a4be, 0xe7a580,
+ /* a5 */ 0xe7a581, 0xe7a789, 0xe7a788, 0xe7a9ba,
+ /* a9 */ 0xe7a9b9, 0xe7abba, 0xe7b3be, 0xe7bd94,
+ /* ad */ 0xe7be8c, 0xe7be8b, 0xe88085, 0xe882ba,
+ /* b1 */ 0xe882a5, 0xe882a2, 0xe882b1, 0xe882a1,
+ /* b5 */ 0xe882ab, 0xe882a9, 0xe882b4, 0xe882aa,
+ /* b9 */ 0xe882af, 0xe887a5, 0xe887be, 0xe8888d,
+ /* bd */ 0xe88ab3, 0xe88a9d, 0xe88a99, 0xe88aad,
+ /* c1 */ 0xe88abd, 0xe88a9f, 0xe88ab9, 0xe88ab1,
+ /* c5 */ 0xe88aac, 0xe88aa5, 0xe88aaf, 0xe88ab8,
+ /* c9 */ 0xe88aa3, 0xe88ab0, 0xe88abe, 0xe88ab7,
+ /* cd */ 0xe8998e, 0xe899b1, 0xe5889d, 0xe8a1a8,
+ /* d1 */ 0xe8bb8b, 0xe8bf8e, 0xe8bf94, 0xe8bf91,
+ /* d5 */ 0xe982b5, 0xe982b8, 0xe982b1, 0xe982b6,
+ /* d9 */ 0xe98787, 0xe98791, 0xe995b7, 0xe99680,
+ /* dd */ 0xe9989c, 0xe99980, 0xe998bf, 0xe998bb,
+ /* e1 */ 0xe99984, 0xe99982, 0xe99ab9, 0xe99ba8,
+ /* e5 */ 0xe99d92, 0xe99d9e, 0xe4ba9f, 0xe4baad,
+ /* e9 */ 0xe4baae, 0xe4bfa1, 0xe4beb5, 0xe4beaf,
+ /* ed */ 0xe4bebf, 0xe4bfa0, 0xe4bf91, 0xe4bf8f,
+ /* f1 */ 0xe4bf9d, 0xe4bf83, 0xe4beb6, 0xe4bf98,
+ /* f5 */ 0xe4bf9f, 0xe4bf8a, 0xe4bf97, 0xe4beae,
+ /* f9 */ 0xe4bf90, 0xe4bf84, 0xe4bf82, 0xe4bf9a,
+ /* fd */ 0xe4bf8e, 0xe4bf9e,
+
+ /*** Two byte table, leaf: d0xx - offset 0x007b5 ***/
+
+ /* a1 */ 0xe4beb7, 0xe58597, 0xe58692, 0xe58691,
+ /* a5 */ 0xe586a0, 0xe5898e, 0xe58983, 0xe5898a,
+ /* a9 */ 0xe5898d, 0xe5898c, 0xe5898b, 0xe58987,
+ /* ad */ 0xe58b87, 0xe58b89, 0xe58b83, 0xe58b81,
+ /* b1 */ 0xe58c8d, 0xe58d97, 0xe58dbb, 0xe58e9a,
+ /* b5 */ 0xe58f9b, 0xe592ac, 0xe59380, 0xe592a8,
+ /* b9 */ 0xe5938e, 0xe59389, 0xe592b8, 0xe592a6,
+ /* bd */ 0xe592b3, 0xe59387, 0xe59382, 0xe592bd,
+ /* c1 */ 0xe592aa, 0xe59381, 0xe59384, 0xe59388,
+ /* c5 */ 0xe592af, 0xe592ab, 0xe592b1, 0xe592bb,
+ /* c9 */ 0xe592a9, 0xe592a7, 0xe592bf, 0xe59bbf,
+ /* cd */ 0xe59e82, 0xe59e8b, 0xe59ea0, 0xe59ea3,
+ /* d1 */ 0xe59ea2, 0xe59f8e, 0xe59eae, 0xe59e93,
+ /* d5 */ 0xe5a595, 0xe5a591, 0xe5a58f, 0xe5a58e,
+ /* d9 */ 0xe5a590, 0xe5a79c, 0xe5a798, 0xe5a7bf,
+ /* dd */ 0xe5a7a3, 0xe5a7a8, 0xe5a883, 0xe5a7a5,
+ /* e1 */ 0xe5a7aa, 0xe5a79a, 0xe5a7a6, 0xe5a881,
+ /* e5 */ 0xe5a7bb, 0xe5ada9, 0xe5aea3, 0xe5aea6,
+ /* e9 */ 0xe5aea4, 0xe5aea2, 0xe5aea5, 0xe5b081,
+ /* ed */ 0xe5b18e, 0xe5b18f, 0xe5b18d, 0xe5b18b,
+ /* f1 */ 0xe5b399, 0xe5b392, 0xe5b7b7, 0xe5b89d,
+ /* f5 */ 0xe5b8a5, 0xe5b89f, 0xe5b9bd, 0xe5baa0,
+ /* f9 */ 0xe5baa6, 0xe5bbba, 0xe5bc88, 0xe5bcad,
+ /* fd */ 0xe5bda5, 0xe5be88,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00813 ***/
+
+ /* a1 */ 0xe5be85, 0xe5be8a, 0xe5be8b, 0xe5be87,
+ /* a5 */ 0xe5be8c, 0xe5be89, 0xe68092, 0xe6809d,
+ /* a9 */ 0xe680a0, 0xe680a5, 0xe6808e, 0xe680a8,
+ /* ad */ 0xe6818d, 0xe681b0, 0xe681a8, 0xe681a2,
+ /* b1 */ 0xe68186, 0xe68183, 0xe681ac, 0xe681ab,
+ /* b5 */ 0xe681aa, 0xe681a4, 0xe68981, 0xe68b9c,
+ /* b9 */ 0xe68c96, 0xe68c89, 0xe68bbc, 0xe68bad,
+ /* bd */ 0xe68c81, 0xe68bae, 0xe68bbd, 0xe68c87,
+ /* c1 */ 0xe68bb1, 0xe68bb7, 0xe68baf, 0xe68bac,
+ /* c5 */ 0xe68bbe, 0xe68bb4, 0xe68c91, 0xe68c82,
+ /* c9 */ 0xe694bf, 0xe69585, 0xe696ab, 0xe696bd,
+ /* cd */ 0xe697a2, 0xe698a5, 0xe698ad, 0xe698a0,
+ /* d1 */ 0xe698a7, 0xe698af, 0xe6989f, 0xe698a8,
+ /* d5 */ 0xe698b1, 0xe698a4, 0xe69bb7, 0xe69fbf,
+ /* d9 */ 0xe69f93, 0xe69fb1, 0xe69f94, 0xe69f90,
+ /* dd */ 0xe69fac, 0xe69eb6, 0xe69eaf, 0xe69fb5,
+ /* e1 */ 0xe69fa9, 0xe69faf, 0xe69f84, 0xe69f91,
+ /* e5 */ 0xe69eb4, 0xe69f9a, 0xe69fa5, 0xe69eb8,
+ /* e9 */ 0xe69f8f, 0xe69f9e, 0xe69fb3, 0xe69eb0,
+ /* ed */ 0xe69f99, 0xe69fa2, 0xe69f9d, 0xe69f92,
+ /* f1 */ 0xe6adaa, 0xe6ae83, 0xe6ae86, 0xe6aeb5,
+ /* f5 */ 0xe6af92, 0xe6af97, 0xe6b09f, 0xe6b389,
+ /* f9 */ 0xe6b48b, 0xe6b4b2, 0xe6b4aa, 0xe6b581,
+ /* fd */ 0xe6b4a5, 0xe6b48c,
+
+ /*** Two byte table, leaf: d2xx - offset 0x00871 ***/
+
+ /* a1 */ 0xe6b4b1, 0xe6b49e, 0xe6b497, 0xe6b4bb,
+ /* a5 */ 0xe6b4bd, 0xe6b4be, 0xe6b4b6, 0xe6b49b,
+ /* a9 */ 0xe6b3b5, 0xe6b4b9, 0xe6b4a7, 0xe6b4b8,
+ /* ad */ 0xe6b4a9, 0xe6b4ae, 0xe6b4b5, 0xe6b48e,
+ /* b1 */ 0xe6b4ab, 0xe782ab, 0xe782ba, 0xe782b3,
+ /* b5 */ 0xe782ac, 0xe782af, 0xe782ad, 0xe782b8,
+ /* b9 */ 0xe782ae, 0xe782a4, 0xe788b0, 0xe789b2,
+ /* bd */ 0xe789af, 0xe789b4, 0xe78ba9, 0xe78ba0,
+ /* c1 */ 0xe78ba1, 0xe78eb7, 0xe78f8a, 0xe78ebb,
+ /* c5 */ 0xe78eb2, 0xe78f8d, 0xe78f80, 0xe78eb3,
+ /* c9 */ 0xe7949a, 0xe794ad, 0xe7958f, 0xe7958c,
+ /* cd */ 0xe7958e, 0xe7958b, 0xe796ab, 0xe796a4,
+ /* d1 */ 0xe796a5, 0xe796a2, 0xe796a3, 0xe799b8,
+ /* d5 */ 0xe79a86, 0xe79a87, 0xe79a88, 0xe79b88,
+ /* d9 */ 0xe79b86, 0xe79b83, 0xe79b85, 0xe79c81,
+ /* dd */ 0xe79bb9, 0xe79bb8, 0xe79c89, 0xe79c8b,
+ /* e1 */ 0xe79bbe, 0xe79bbc, 0xe79c87, 0xe79f9c,
+ /* e5 */ 0xe7a082, 0xe7a094, 0xe7a08c, 0xe7a08d,
+ /* e9 */ 0xe7a586, 0xe7a589, 0xe7a588, 0xe7a587,
+ /* ed */ 0xe7a6b9, 0xe7a6ba, 0xe7a791, 0xe7a792,
+ /* f1 */ 0xe7a78b, 0xe7a9bf, 0xe7aa81, 0xe7abbf,
+ /* f5 */ 0xe7abbd, 0xe7b1bd, 0xe7b482, 0xe7b485,
+ /* f9 */ 0xe7b480, 0xe7b489, 0xe7b487, 0xe7b484,
+ /* fd */ 0xe7b486, 0xe7bcb8,
+
+ /*** Two byte table, leaf: d3xx - offset 0x008cf ***/
+
+ /* a1 */ 0xe7be8e, 0xe7bebf, 0xe88090, 0xe8808d,
+ /* a5 */ 0xe88091, 0xe880b6, 0xe88396, 0xe883a5,
+ /* a9 */ 0xe8839a, 0xe88383, 0xe88384, 0xe8838c,
+ /* ad */ 0xe883a1, 0xe8839b, 0xe8838e, 0xe8839e,
+ /* b1 */ 0xe883a4, 0xe8839d, 0xe887b4, 0xe888a2,
+ /* b5 */ 0xe88ba7, 0xe88c83, 0xe88c85, 0xe88ba3,
+ /* b9 */ 0xe88b9b, 0xe88ba6, 0xe88c84, 0xe88ba5,
+ /* bd */ 0xe88c82, 0xe88c89, 0xe88b92, 0xe88b97,
+ /* c1 */ 0xe88bb1, 0xe88c81, 0xe88b9c, 0xe88b94,
+ /* c5 */ 0xe88b91, 0xe88b9e, 0xe88b93, 0xe88b9f,
+ /* c9 */ 0xe88baf, 0xe88c86, 0xe89990, 0xe899b9,
+ /* cd */ 0xe899bb, 0xe899ba, 0xe8a18d, 0xe8a1ab,
+ /* d1 */ 0xe8a681, 0xe8a794, 0xe8a888, 0xe8a882,
+ /* d5 */ 0xe8a883, 0xe8b29e, 0xe8b2a0, 0xe8b5b4,
+ /* d9 */ 0xe8b5b3, 0xe8b6b4, 0xe8bb8d, 0xe8bb8c,
+ /* dd */ 0xe8bfb0, 0xe8bfa6, 0xe8bfa2, 0xe8bfaa,
+ /* e1 */ 0xe8bfa5, 0xe8bfad, 0xe8bfab, 0xe8bfa4,
+ /* e5 */ 0xe8bfa8, 0xe9838a, 0xe9838e, 0xe98381,
+ /* e9 */ 0xe98383, 0xe9858b, 0xe9858a, 0xe9878d,
+ /* ed */ 0xe99682, 0xe99990, 0xe9998b, 0xe9998c,
+ /* f1 */ 0xe9998d, 0xe99da2, 0xe99da9, 0xe99f8b,
+ /* f5 */ 0xe99fad, 0xe99fb3, 0xe9a081, 0xe9a2a8,
+ /* f9 */ 0xe9a39b, 0xe9a39f, 0xe9a696, 0xe9a699,
+ /* fd */ 0xe4b998, 0xe4bab3,
+
+ /*** Two byte table, leaf: d4xx - offset 0x0092d ***/
+
+ /* a1 */ 0xe5808c, 0xe5808d, 0xe580a3, 0xe4bfaf,
+ /* a5 */ 0xe580a6, 0xe580a5, 0xe4bfb8, 0xe580a9,
+ /* a9 */ 0xe58096, 0xe58086, 0xe580bc, 0xe5809f,
+ /* ad */ 0xe5809a, 0xe58092, 0xe58091, 0xe4bfba,
+ /* b1 */ 0xe58080, 0xe58094, 0xe580a8, 0xe4bfb1,
+ /* b5 */ 0xe580a1, 0xe5808b, 0xe58099, 0xe58098,
+ /* b9 */ 0xe4bfb3, 0xe4bfae, 0xe580ad, 0xe580aa,
+ /* bd */ 0xe4bfbe, 0xe580ab, 0xe58089, 0xe585bc,
+ /* c1 */ 0xe586a4, 0xe586a5, 0xe586a2, 0xe5878d,
+ /* c5 */ 0xe5878c, 0xe58786, 0xe5878b, 0xe58996,
+ /* c9 */ 0xe5899c, 0xe58994, 0xe5899b, 0xe5899d,
+ /* cd */ 0xe58caa, 0xe58dbf, 0xe58e9f, 0xe58e9d,
+ /* d1 */ 0xe58f9f, 0xe593a8, 0xe59490, 0xe59481,
+ /* d5 */ 0xe594b7, 0xe593bc, 0xe593a5, 0xe593b2,
+ /* d9 */ 0xe59486, 0xe593ba, 0xe59494, 0xe593a9,
+ /* dd */ 0xe593ad, 0xe593a1, 0xe59489, 0xe593ae,
+ /* e1 */ 0xe593aa, 0xe593a6, 0xe594a7, 0xe59487,
+ /* e5 */ 0xe593bd, 0xe5948f, 0xe59c83, 0xe59c84,
+ /* e9 */ 0xe59f82, 0xe59f94, 0xe59f8b, 0xe59f83,
+ /* ed */ 0xe5a089, 0xe5a48f, 0xe5a597, 0xe5a598,
+ /* f1 */ 0xe5a59a, 0xe5a891, 0xe5a898, 0xe5a89c,
+ /* f5 */ 0xe5a89f, 0xe5a89b, 0xe5a893, 0xe5a7ac,
+ /* f9 */ 0xe5a8a0, 0xe5a8a3, 0xe5a8a9, 0xe5a8a5,
+ /* fd */ 0xe5a88c, 0xe5a889,
+
+ /*** Two byte table, leaf: d5xx - offset 0x0098b ***/
+
+ /* a1 */ 0xe5adab, 0xe5b198, 0xe5aeb0, 0xe5aeb3,
+ /* a5 */ 0xe5aeb6, 0xe5aeb4, 0xe5aeae, 0xe5aeb5,
+ /* a9 */ 0xe5aeb9, 0xe5aeb8, 0xe5b084, 0xe5b191,
+ /* ad */ 0xe5b195, 0xe5b190, 0xe5b3ad, 0xe5b3bd,
+ /* b1 */ 0xe5b3bb, 0xe5b3aa, 0xe5b3a8, 0xe5b3b0,
+ /* b5 */ 0xe5b3b6, 0xe5b481, 0xe5b3b4, 0xe5b7ae,
+ /* b9 */ 0xe5b8ad, 0xe5b8ab, 0xe5baab, 0xe5baad,
+ /* bd */ 0xe5baa7, 0xe5bcb1, 0xe5be92, 0xe5be91,
+ /* c1 */ 0xe5be90, 0xe68199, 0xe681a3, 0xe681a5,
+ /* c5 */ 0xe68190, 0xe68195, 0xe681ad, 0xe681a9,
+ /* c9 */ 0xe681af, 0xe68284, 0xe6829f, 0xe6829a,
+ /* cd */ 0xe6828d, 0xe68294, 0xe6828c, 0xe68285,
+ /* d1 */ 0xe68296, 0xe68987, 0xe68bb3, 0xe68c88,
+ /* d5 */ 0xe68bbf, 0xe68d8e, 0xe68cbe, 0xe68caf,
+ /* d9 */ 0xe68d95, 0xe68d82, 0xe68d86, 0xe68d8f,
+ /* dd */ 0xe68d89, 0xe68cba, 0xe68d90, 0xe68cbd,
+ /* e1 */ 0xe68caa, 0xe68cab, 0xe68ca8, 0xe68d8d,
+ /* e5 */ 0xe68d8c, 0xe69588, 0xe69589, 0xe69699,
+ /* e9 */ 0xe69781, 0xe69785, 0xe69982, 0xe69989,
+ /* ed */ 0xe6998f, 0xe69983, 0xe69992, 0xe6998c,
+ /* f1 */ 0xe69985, 0xe69981, 0xe69bb8, 0xe69c94,
+ /* f5 */ 0xe69c95, 0xe69c97, 0xe6a0a1, 0xe6a0b8,
+ /* f9 */ 0xe6a188, 0xe6a186, 0xe6a193, 0xe6a0b9,
+ /* fd */ 0xe6a182, 0xe6a194,
+
+ /*** Two byte table, leaf: d6xx - offset 0x009e9 ***/
+
+ /* a1 */ 0xe6a0a9, 0xe6a2b3, 0xe6a097, 0xe6a18c,
+ /* a5 */ 0xe6a191, 0xe6a0bd, 0xe69fb4, 0xe6a190,
+ /* a9 */ 0xe6a180, 0xe6a0bc, 0xe6a183, 0xe6a0aa,
+ /* ad */ 0xe6a185, 0xe6a093, 0xe6a098, 0xe6a181,
+ /* b1 */ 0xe6ae8a, 0xe6ae89, 0xe6aeb7, 0xe6b0a3,
+ /* b5 */ 0xe6b0a7, 0xe6b0a8, 0xe6b0a6, 0xe6b0a4,
+ /* b9 */ 0xe6b3b0, 0xe6b5aa, 0xe6b695, 0xe6b688,
+ /* bd */ 0xe6b687, 0xe6b5a6, 0xe6b5b8, 0xe6b5b7,
+ /* c1 */ 0xe6b599, 0xe6b693, 0xe6b5ac, 0xe6b689,
+ /* c5 */ 0xe6b5ae, 0xe6b59a, 0xe6b5b4, 0xe6b5a9,
+ /* c9 */ 0xe6b68c, 0xe6b68a, 0xe6b5b9, 0xe6b685,
+ /* cd */ 0xe6b5a5, 0xe6b694, 0xe7838a, 0xe78398,
+ /* d1 */ 0xe783a4, 0xe78399, 0xe78388, 0xe7838f,
+ /* d5 */ 0xe788b9, 0xe789b9, 0xe78bbc, 0xe78bb9,
+ /* d9 */ 0xe78bbd, 0xe78bb8, 0xe78bb7, 0xe78e86,
+ /* dd */ 0xe78fad, 0xe79089, 0xe78fae, 0xe78fa0,
+ /* e1 */ 0xe78faa, 0xe78f9e, 0xe79594, 0xe7959d,
+ /* e5 */ 0xe7959c, 0xe7959a, 0xe79599, 0xe796be,
+ /* e9 */ 0xe79785, 0xe79787, 0xe796b2, 0xe796b3,
+ /* ed */ 0xe796bd, 0xe796bc, 0xe796b9, 0xe79782,
+ /* f1 */ 0xe796b8, 0xe79a8b, 0xe79ab0, 0xe79b8a,
+ /* f5 */ 0xe79b8d, 0xe79b8e, 0xe79ca9, 0xe79c9f,
+ /* f9 */ 0xe79ca0, 0xe79ca8, 0xe79fa9, 0xe7a0b0,
+ /* fd */ 0xe7a0a7, 0xe7a0b8,
+
+ /*** Two byte table, leaf: d7xx - offset 0x00a47 ***/
+
+ /* a1 */ 0xe7a09d, 0xe7a0b4, 0xe7a0b7, 0xe7a0a5,
+ /* a5 */ 0xe7a0ad, 0xe7a0a0, 0xe7a09f, 0xe7a0b2,
+ /* a9 */ 0xe7a595, 0xe7a590, 0xe7a5a0, 0xe7a59f,
+ /* ad */ 0xe7a596, 0xe7a59e, 0xe7a59d, 0xe7a597,
+ /* b1 */ 0xe7a59a, 0xe7a7a4, 0xe7a7a3, 0xe7a7a7,
+ /* b5 */ 0xe7a79f, 0xe7a7a6, 0xe7a7a9, 0xe7a798,
+ /* b9 */ 0xe7aa84, 0xe7aa88, 0xe7ab99, 0xe7ac86,
+ /* bd */ 0xe7ac91, 0xe7b289, 0xe7b4a1, 0xe7b497,
+ /* c1 */ 0xe7b48b, 0xe7b48a, 0xe7b4a0, 0xe7b4a2,
+ /* c5 */ 0xe7b494, 0xe7b490, 0xe7b495, 0xe7b49a,
+ /* c9 */ 0xe7b49c, 0xe7b48d, 0xe7b499, 0xe7b49b,
+ /* cd */ 0xe7bcba, 0xe7bd9f, 0xe7be94, 0xe7bf85,
+ /* d1 */ 0xe7bf81, 0xe88086, 0xe88084, 0xe88098,
+ /* d5 */ 0xe88095, 0xe88099, 0xe88097, 0xe880bd,
+ /* d9 */ 0xe880bf, 0xe883b1, 0xe88482, 0xe883b0,
+ /* dd */ 0xe88485, 0xe883ad, 0xe883b4, 0xe88486,
+ /* e1 */ 0xe883b8, 0xe883b3, 0xe88488, 0xe883bd,
+ /* e5 */ 0xe8848a, 0xe883bc, 0xe883af, 0xe887ad,
+ /* e9 */ 0xe887ac, 0xe88880, 0xe88890, 0xe888aa,
+ /* ed */ 0xe888ab, 0xe888a8, 0xe888ac, 0xe88abb,
+ /* f1 */ 0xe88cab, 0xe88d92, 0xe88d94, 0xe88d8a,
+ /* f5 */ 0xe88cb8, 0xe88d90, 0xe88d89, 0xe88cb5,
+ /* f9 */ 0xe88cb4, 0xe88d8f, 0xe88cb2, 0xe88cb9,
+ /* fd */ 0xe88cb6, 0xe88c97,
+
+ /*** Two byte table, leaf: d8xx - offset 0x00aa5 ***/
+
+ /* a1 */ 0xe88d80, 0xe88cb1, 0xe88ca8, 0xe88d83,
+ /* a5 */ 0xe89994, 0xe89a8a, 0xe89aaa, 0xe89a93,
+ /* a9 */ 0xe89aa4, 0xe89aa9, 0xe89a8c, 0xe89aa3,
+ /* ad */ 0xe89a9c, 0xe8a1b0, 0xe8a1b7, 0xe8a281,
+ /* b1 */ 0xe8a282, 0xe8a1bd, 0xe8a1b9, 0xe8a898,
+ /* b5 */ 0xe8a890, 0xe8a88e, 0xe8a88c, 0xe8a895,
+ /* b9 */ 0xe8a88a, 0xe8a897, 0xe8a893, 0xe8a896,
+ /* bd */ 0xe8a88f, 0xe8a891, 0xe8b188, 0xe8b1ba,
+ /* c1 */ 0xe8b1b9, 0xe8b2a1, 0xe8b2a2, 0xe8b5b7,
+ /* c5 */ 0xe8baac, 0xe8bb92, 0xe8bb94, 0xe8bb8f,
+ /* c9 */ 0xe8beb1, 0xe98081, 0xe98086, 0xe8bfb7,
+ /* cd */ 0xe98080, 0xe8bfba, 0xe8bfb4, 0xe98083,
+ /* d1 */ 0xe8bfbd, 0xe98085, 0xe8bfb8, 0xe98295,
+ /* d5 */ 0xe983a1, 0xe9839d, 0xe983a2, 0xe98592,
+ /* d9 */ 0xe9858d, 0xe9858c, 0xe98798, 0xe9879d,
+ /* dd */ 0xe98797, 0xe9879c, 0xe98799, 0xe99683,
+ /* e1 */ 0xe999a2, 0xe999a3, 0xe999a1, 0xe9999b,
+ /* e5 */ 0xe9999d, 0xe999a4, 0xe99998, 0xe9999e,
+ /* e9 */ 0xe99abb, 0xe9a3a2, 0xe9a6ac, 0xe9aaa8,
+ /* ed */ 0xe9ab98, 0xe9aca5, 0xe9acb2, 0xe9acbc,
+ /* f1 */ 0xe4b9be, 0xe581ba, 0xe581bd, 0xe5819c,
+ /* f5 */ 0xe58187, 0xe58183, 0xe5818c, 0xe5819a,
+ /* f9 */ 0xe58189, 0xe581a5, 0xe581b6, 0xe5818e,
+ /* fd */ 0xe58195, 0xe581b5,
+
+ /*** Two byte table, leaf: d9xx - offset 0x00b03 ***/
+
+ /* a1 */ 0xe581b4, 0xe581b7, 0xe5818f, 0xe5808f,
+ /* a5 */ 0xe581af, 0xe581ad, 0xe5859c, 0xe58695,
+ /* a9 */ 0xe587b0, 0xe589aa, 0xe589af, 0xe58b92,
+ /* ad */ 0xe58b99, 0xe58b98, 0xe58b95, 0xe58c90,
+ /* b1 */ 0xe58c8f, 0xe58c99, 0xe58cbf, 0xe58d80,
+ /* b5 */ 0xe58cbe, 0xe58f83, 0xe69bbc, 0xe59586,
+ /* b9 */ 0xe595aa, 0xe595a6, 0xe59584, 0xe5959e,
+ /* bd */ 0xe595a1, 0xe59583, 0xe5958a, 0xe594b1,
+ /* c1 */ 0xe59596, 0xe5958f, 0xe59595, 0xe594af,
+ /* c5 */ 0xe595a4, 0xe594b8, 0xe594ae, 0xe5959c,
+ /* c9 */ 0xe594ac, 0xe595a3, 0xe594b3, 0xe59581,
+ /* cd */ 0xe59597, 0xe59c88, 0xe59c8b, 0xe59c89,
+ /* d1 */ 0xe59f9f, 0xe5a085, 0xe5a08a, 0xe5a086,
+ /* d5 */ 0xe59fa0, 0xe59fa4, 0xe59fba, 0xe5a082,
+ /* d9 */ 0xe5a0b5, 0xe59fb7, 0xe59fb9, 0xe5a4a0,
+ /* dd */ 0xe5a5a2, 0xe5a8b6, 0xe5a981, 0xe5a989,
+ /* e1 */ 0xe5a9a6, 0xe5a9aa, 0xe5a980, 0xe5a8bc,
+ /* e5 */ 0xe5a9a2, 0xe5a99a, 0xe5a986, 0xe5a98a,
+ /* e9 */ 0xe5adb0, 0xe5af87, 0xe5af85, 0xe5af84,
+ /* ed */ 0xe5af82, 0xe5aebf, 0xe5af86, 0xe5b089,
+ /* f1 */ 0xe5b088, 0xe5b087, 0xe5b1a0, 0xe5b19c,
+ /* f5 */ 0xe5b19d, 0xe5b487, 0xe5b486, 0xe5b48e,
+ /* f9 */ 0xe5b49b, 0xe5b496, 0xe5b4a2, 0xe5b491,
+ /* fd */ 0xe5b4a9, 0xe5b494,
+
+ /*** Two byte table, leaf: daxx - offset 0x00b61 ***/
+
+ /* a1 */ 0xe5b499, 0xe5b4a4, 0xe5b4a7, 0xe5b497,
+ /* a5 */ 0xe5b7a2, 0xe5b8b8, 0xe5b8b6, 0xe5b8b3,
+ /* a9 */ 0xe5b8b7, 0xe5bab7, 0xe5bab8, 0xe5bab6,
+ /* ad */ 0xe5bab5, 0xe5babe, 0xe5bcb5, 0xe5bcb7,
+ /* b1 */ 0xe5bd97, 0xe5bdac, 0xe5bda9, 0xe5bdab,
+ /* b5 */ 0xe5be97, 0xe5be99, 0xe5be9e, 0xe5be98,
+ /* b9 */ 0xe5bea1, 0xe5bea0, 0xe5be9c, 0xe681bf,
+ /* bd */ 0xe682a3, 0xe68289, 0xe682a0, 0xe682a8,
+ /* c1 */ 0xe6838b, 0xe682b4, 0xe683a6, 0xe682bd,
+ /* c5 */ 0xe68385, 0xe682bb, 0xe682b5, 0xe6839c,
+ /* c9 */ 0xe682bc, 0xe68398, 0xe68395, 0xe68386,
+ /* cd */ 0xe6839f, 0xe682b8, 0xe6839a, 0xe68387,
+ /* d1 */ 0xe6889a, 0xe6889b, 0xe68988, 0xe68ea0,
+ /* d5 */ 0xe68ea7, 0xe68db2, 0xe68e96, 0xe68ea2,
+ /* d9 */ 0xe68ea5, 0xe68db7, 0xe68da7, 0xe68e98,
+ /* dd */ 0xe68eaa, 0xe68db1, 0xe68ea9, 0xe68e89,
+ /* e1 */ 0xe68e83, 0xe68e9b, 0xe68dab, 0xe68ea8,
+ /* e5 */ 0xe68e84, 0xe68e88, 0xe68e99, 0xe68ea1,
+ /* e9 */ 0xe68eac, 0xe68e92, 0xe68e8f, 0xe68e80,
+ /* ed */ 0xe68dbb, 0xe68da9, 0xe68da8, 0xe68dba,
+ /* f1 */ 0xe6959d, 0xe69596, 0xe69591, 0xe69599,
+ /* f5 */ 0xe69597, 0xe5959f, 0xe6958f, 0xe69598,
+ /* f9 */ 0xe69595, 0xe69594, 0xe6969c, 0xe6969b,
+ /* fd */ 0xe696ac, 0xe6978f,
+
+ /*** Two byte table, leaf: dbxx - offset 0x00bbf ***/
+
+ /* a1 */ 0xe6978b, 0xe6978c, 0xe6978e, 0xe6999d,
+ /* a5 */ 0xe6999a, 0xe699a4, 0xe699a8, 0xe699a6,
+ /* a9 */ 0xe6999e, 0xe69bb9, 0xe58b97, 0xe69c9b,
+ /* ad */ 0xe6a281, 0xe6a2af, 0xe6a2a2, 0xe6a293,
+ /* b1 */ 0xe6a2b5, 0xe6a1bf, 0xe6a1b6, 0xe6a2b1,
+ /* b5 */ 0xe6a2a7, 0xe6a297, 0xe6a2b0, 0xe6a283,
+ /* b9 */ 0xe6a384, 0xe6a2ad, 0xe6a286, 0xe6a285,
+ /* bd */ 0xe6a294, 0xe6a29d, 0xe6a2a8, 0xe6a29f,
+ /* c1 */ 0xe6a2a1, 0xe6a282, 0xe6acb2, 0xe6aeba,
+ /* c5 */ 0xe6afab, 0xe6afac, 0xe6b0ab, 0xe6b68e,
+ /* c9 */ 0xe6b6bc, 0xe6b7b3, 0xe6b799, 0xe6b6b2,
+ /* cd */ 0xe6b7a1, 0xe6b78c, 0xe6b7a4, 0xe6b7bb,
+ /* d1 */ 0xe6b7ba, 0xe6b885, 0xe6b787, 0xe6b78b,
+ /* d5 */ 0xe6b6af, 0xe6b791, 0xe6b6ae, 0xe6b79e,
+ /* d9 */ 0xe6b7b9, 0xe6b6b8, 0xe6b7b7, 0xe6b7b5,
+ /* dd */ 0xe6b785, 0xe6b792, 0xe6b89a, 0xe6b6b5,
+ /* e1 */ 0xe6b79a, 0xe6b7ab, 0xe6b798, 0xe6b7aa,
+ /* e5 */ 0xe6b7b1, 0xe6b7ae, 0xe6b7a8, 0xe6b786,
+ /* e9 */ 0xe6b784, 0xe6b6aa, 0xe6b7ac, 0xe6b6bf,
+ /* ed */ 0xe6b7a6, 0xe783b9, 0xe78489, 0xe7848a,
+ /* f1 */ 0xe783bd, 0xe783af, 0xe788bd, 0xe789bd,
+ /* f5 */ 0xe78a81, 0xe78c9c, 0xe78c9b, 0xe78c96,
+ /* f9 */ 0xe78c93, 0xe78c99, 0xe78e87, 0xe79085,
+ /* fd */ 0xe7908a, 0xe79083,
+
+ /*** Two byte table, leaf: dcxx - offset 0x00c1d ***/
+
+ /* a1 */ 0xe79086, 0xe78fbe, 0xe7908d, 0xe793a0,
+ /* a5 */ 0xe793b6, 0xe793b7, 0xe7949c, 0xe794a2,
+ /* a9 */ 0xe795a5, 0xe795a6, 0xe795a2, 0xe795b0,
+ /* ad */ 0xe7968f, 0xe79794, 0xe79795, 0xe796b5,
+ /* b1 */ 0xe7978a, 0xe7978d, 0xe79a8e, 0xe79b94,
+ /* b5 */ 0xe79b92, 0xe79b9b, 0xe79cb7, 0xe79cbe,
+ /* b9 */ 0xe79cbc, 0xe79cb6, 0xe79cb8, 0xe79cba,
+ /* bd */ 0xe7a1ab, 0xe7a183, 0xe7a18e, 0xe7a5a5,
+ /* c1 */ 0xe7a5a8, 0xe7a5ad, 0xe7a7bb, 0xe7aa92,
+ /* c5 */ 0xe7aa95, 0xe7aca0, 0xe7aca8, 0xe7ac9b,
+ /* c9 */ 0xe7acac, 0xe7aca6, 0xe7ac99, 0xe7ac9e,
+ /* cd */ 0xe7acae, 0xe7b292, 0xe7b297, 0xe7b295,
+ /* d1 */ 0xe7b586, 0xe7b583, 0xe7b5b1, 0xe7b4ae,
+ /* d5 */ 0xe7b4b9, 0xe7b4bc, 0xe7b580, 0xe7b4b0,
+ /* d9 */ 0xe7b4b3, 0xe7b584, 0xe7b4af, 0xe7b582,
+ /* dd */ 0xe7b4b2, 0xe7b4b1, 0xe7bcbd, 0xe7be9e,
+ /* e1 */ 0xe7be9a, 0xe7bf8c, 0xe7bf8e, 0xe7bf92,
+ /* e5 */ 0xe8809c, 0xe8818a, 0xe88186, 0xe884af,
+ /* e9 */ 0xe88496, 0xe884a3, 0xe884ab, 0xe884a9,
+ /* ed */ 0xe884b0, 0xe884a4, 0xe88882, 0xe888b5,
+ /* f1 */ 0xe888b7, 0xe888b6, 0xe888b9, 0xe88e8e,
+ /* f5 */ 0xe88e9e, 0xe88e98, 0xe88db8, 0xe88ea2,
+ /* f9 */ 0xe88e96, 0xe88ebd, 0xe88eab, 0xe88e92,
+ /* fd */ 0xe88e8a, 0xe88e93,
+
+ /*** Two byte table, leaf: ddxx - offset 0x00c7b ***/
+
+ /* a1 */ 0xe88e89, 0xe88ea0, 0xe88db7, 0xe88dbb,
+ /* a5 */ 0xe88dbc, 0xe88e86, 0xe88ea7, 0xe89995,
+ /* a9 */ 0xe5bdaa, 0xe89b87, 0xe89b80, 0xe89ab6,
+ /* ad */ 0xe89b84, 0xe89ab5, 0xe89b86, 0xe89b8b,
+ /* b1 */ 0xe89ab1, 0xe89aaf, 0xe89b89, 0xe8a193,
+ /* b5 */ 0xe8a29e, 0xe8a288, 0xe8a2ab, 0xe8a292,
+ /* b9 */ 0xe8a296, 0xe8a28d, 0xe8a28b, 0xe8a693,
+ /* bd */ 0xe8a68f, 0xe8a8aa, 0xe8a89d, 0xe8a8a3,
+ /* c1 */ 0xe8a8a5, 0xe8a8b1, 0xe8a8ad, 0xe8a89f,
+ /* c5 */ 0xe8a89b, 0xe8a8a2, 0xe8b189, 0xe8b19a,
+ /* c9 */ 0xe8b2a9, 0xe8b2ac, 0xe8b2ab, 0xe8b2a8,
+ /* cd */ 0xe8b2aa, 0xe8b2a7, 0xe8b5a7, 0xe8b5a6,
+ /* d1 */ 0xe8b6be, 0xe8b6ba, 0xe8bb9b, 0xe8bb9f,
+ /* d5 */ 0xe98099, 0xe9808d, 0xe9809a, 0xe98097,
+ /* d9 */ 0xe980a3, 0xe9809f, 0xe9809d, 0xe98090,
+ /* dd */ 0xe98095, 0xe9809e, 0xe980a0, 0xe9808f,
+ /* e1 */ 0xe980a2, 0xe98096, 0xe9809b, 0xe98094,
+ /* e5 */ 0xe983a8, 0xe983ad, 0xe983bd, 0xe98597,
+ /* e9 */ 0xe9878e, 0xe987b5, 0xe987a6, 0xe987a3,
+ /* ed */ 0xe987a7, 0xe987ad, 0xe987a9, 0xe99689,
+ /* f1 */ 0xe999aa, 0xe999b5, 0xe999b3, 0xe999b8,
+ /* f5 */ 0xe999b0, 0xe999b4, 0xe999b6, 0xe999b7,
+ /* f9 */ 0xe999ac, 0xe99b80, 0xe99baa, 0xe99ba9,
+ /* fd */ 0xe7aba0, 0xe7ab9f,
+
+ /*** Two byte table, leaf: dexx - offset 0x00cd9 ***/
+
+ /* a1 */ 0xe9a082, 0xe9a083, 0xe9ad9a, 0xe9b3a5,
+ /* a5 */ 0xe9b9b5, 0xe9b9bf, 0xe9baa5, 0xe9babb,
+ /* a9 */ 0xe582a2, 0xe5828d, 0xe58285, 0xe58299,
+ /* ad */ 0xe58291, 0xe58280, 0xe58296, 0xe58298,
+ /* b1 */ 0xe5829a, 0xe69c80, 0xe587b1, 0xe589b2,
+ /* b5 */ 0xe589b4, 0xe589b5, 0xe589a9, 0xe58b9e,
+ /* b9 */ 0xe58b9d, 0xe58b9b, 0xe58d9a, 0xe58ea5,
+ /* bd */ 0xe595bb, 0xe59680, 0xe596a7, 0xe595bc,
+ /* c1 */ 0xe5968a, 0xe5969d, 0xe59698, 0xe59682,
+ /* c5 */ 0xe5969c, 0xe596aa, 0xe59694, 0xe59687,
+ /* c9 */ 0xe5968b, 0xe59683, 0xe596b3, 0xe596ae,
+ /* cd */ 0xe5969f, 0xe594be, 0xe596b2, 0xe5969a,
+ /* d1 */ 0xe596bb, 0xe596ac, 0xe596b1, 0xe595be,
+ /* d5 */ 0xe59689, 0xe596ab, 0xe59699, 0xe59c8d,
+ /* d9 */ 0xe5a0af, 0xe5a0aa, 0xe5a0b4, 0xe5a0a4,
+ /* dd */ 0xe5a0b0, 0xe5a0b1, 0xe5a0a1, 0xe5a09d,
+ /* e1 */ 0xe5a0a0, 0xe5a3b9, 0xe5a3ba, 0xe5a5a0,
+ /* e5 */ 0xe5a9b7, 0xe5aa9a, 0xe5a9bf, 0xe5aa92,
+ /* e9 */ 0xe5aa9b, 0xe5aaa7, 0xe5adb3, 0xe5adb1,
+ /* ed */ 0xe5af92, 0xe5af8c, 0xe5af93, 0xe5af90,
+ /* f1 */ 0xe5b08a, 0xe5b08b, 0xe5b0b1, 0xe5b58c,
+ /* f5 */ 0xe5b590, 0xe5b4b4, 0xe5b587, 0xe5b7bd,
+ /* f9 */ 0xe5b985, 0xe5b8bd, 0xe5b980, 0xe5b983,
+ /* fd */ 0xe5b9be, 0xe5bb8a,
+
+ /*** Two byte table, leaf: dfxx - offset 0x00d37 ***/
+
+ /* a1 */ 0xe5bb81, 0xe5bb82, 0xe5bb84, 0xe5bcbc,
+ /* a5 */ 0xe5bdad, 0xe5bea9, 0xe5beaa, 0xe5bea8,
+ /* a9 */ 0xe68391, 0xe683a1, 0xe682b2, 0xe682b6,
+ /* ad */ 0xe683a0, 0xe6849c, 0xe684a3, 0xe683ba,
+ /* b1 */ 0xe68495, 0xe683b0, 0xe683bb, 0xe683b4,
+ /* b5 */ 0xe685a8, 0xe683b1, 0xe6848e, 0xe683b6,
+ /* b9 */ 0xe68489, 0xe68480, 0xe68492, 0xe6889f,
+ /* bd */ 0xe68989, 0xe68ea3, 0xe68e8c, 0xe68f8f,
+ /* c1 */ 0xe68f80, 0xe68fa9, 0xe68f89, 0xe68f86,
+ /* c5 */ 0xe68f8d, 0xe68f92, 0xe68fa3, 0xe68f90,
+ /* c9 */ 0xe68fa1, 0xe68f96, 0xe68fad, 0xe68fae,
+ /* cd */ 0xe68db6, 0xe68fb4, 0xe68faa, 0xe68f9b,
+ /* d1 */ 0xe69192, 0xe68f9a, 0xe68fb9, 0xe6959e,
+ /* d5 */ 0xe695a6, 0xe695a2, 0xe695a3, 0xe69691,
+ /* d9 */ 0xe69690, 0xe696af, 0xe699ae, 0xe699b0,
+ /* dd */ 0xe699b4, 0xe699b6, 0xe699af, 0xe69a91,
+ /* e1 */ 0xe699ba, 0xe699be, 0xe699b7, 0xe69bbe,
+ /* e5 */ 0xe69bbf, 0xe69c9f, 0xe69c9d, 0xe6a3ba,
+ /* e9 */ 0xe6a395, 0xe6a3a0, 0xe6a398, 0xe6a397,
+ /* ed */ 0xe6a485, 0xe6a39f, 0xe6a3b5, 0xe6a3ae,
+ /* f1 */ 0xe6a3a7, 0xe6a3b9, 0xe6a392, 0xe6a3b2,
+ /* f5 */ 0xe6a3a3, 0xe6a38b, 0xe6a38d, 0xe6a48d,
+ /* f9 */ 0xe6a492, 0xe6a48e, 0xe6a389, 0xe6a39a,
+ /* fd */ 0xe6a5ae, 0xe6a3bb,
+
+ /*** Two byte table, leaf: e0xx - offset 0x00d95 ***/
+
+ /* a1 */ 0xe6acbe, 0xe6acba, 0xe6acbd, 0xe6ae98,
+ /* a5 */ 0xe6ae96, 0xe6aebc, 0xe6afaf, 0xe6b0ae,
+ /* a9 */ 0xe6b0af, 0xe6b0ac, 0xe6b8af, 0xe6b8b8,
+ /* ad */ 0xe6b994, 0xe6b8a1, 0xe6b8b2, 0xe6b9a7,
+ /* b1 */ 0xe6b98a, 0xe6b8a0, 0xe6b8a5, 0xe6b8a3,
+ /* b5 */ 0xe6b89b, 0xe6b99b, 0xe6b998, 0xe6b8a4,
+ /* b9 */ 0xe6b996, 0xe6b9ae, 0xe6b8ad, 0xe6b8a6,
+ /* bd */ 0xe6b9af, 0xe6b8b4, 0xe6b98d, 0xe6b8ba,
+ /* c1 */ 0xe6b8ac, 0xe6b983, 0xe6b89d, 0xe6b8be,
+ /* c5 */ 0xe6bb8b, 0xe6ba89, 0xe6b899, 0xe6b98e,
+ /* c9 */ 0xe6b9a3, 0xe6b984, 0xe6b9b2, 0xe6b9a9,
+ /* cd */ 0xe6b99f, 0xe78499, 0xe7849a, 0xe784a6,
+ /* d1 */ 0xe784b0, 0xe784a1, 0xe784b6, 0xe785ae,
+ /* d5 */ 0xe7849c, 0xe7898c, 0xe78a84, 0xe78a80,
+ /* d9 */ 0xe78cb6, 0xe78ca5, 0xe78cb4, 0xe78ca9,
+ /* dd */ 0xe790ba, 0xe790aa, 0xe790b3, 0xe790a2,
+ /* e1 */ 0xe790a5, 0xe790b5, 0xe790b6, 0xe790b4,
+ /* e5 */ 0xe790af, 0xe7909b, 0xe790a6, 0xe790a8,
+ /* e9 */ 0xe794a5, 0xe794a6, 0xe795ab, 0xe795aa,
+ /* ed */ 0xe797a2, 0xe7979b, 0xe797a3, 0xe79799,
+ /* f1 */ 0xe79798, 0xe7979e, 0xe797a0, 0xe799bb,
+ /* f5 */ 0xe799bc, 0xe79a96, 0xe79a93, 0xe79ab4,
+ /* f9 */ 0xe79b9c, 0xe79d8f, 0xe79fad, 0xe7a19d,
+ /* fd */ 0xe7a1ac, 0xe7a1af,
+
+ /*** Two byte table, leaf: e1xx - offset 0x00df3 ***/
+
+ /* a1 */ 0xe7a88d, 0xe7a888, 0xe7a88b, 0xe7a885,
+ /* a5 */ 0xe7a880, 0xe7aa98, 0xe7aa97, 0xe7aa96,
+ /* a9 */ 0xe7aba5, 0xe7aba3, 0xe7ad89, 0xe7ad96,
+ /* ad */ 0xe7ad86, 0xe7ad90, 0xe7ad92, 0xe7ad94,
+ /* b1 */ 0xe7ad8d, 0xe7ad8b, 0xe7ad8f, 0xe7ad91,
+ /* b5 */ 0xe7b29f, 0xe7b2a5, 0xe7b59e, 0xe7b590,
+ /* b9 */ 0xe7b5a8, 0xe7b595, 0xe7b4ab, 0xe7b5ae,
+ /* bd */ 0xe7b5b2, 0xe7b5a1, 0xe7b5a6, 0xe7b5a2,
+ /* c1 */ 0xe7b5b0, 0xe7b5b3, 0xe59684, 0xe7bf94,
+ /* c5 */ 0xe7bf95, 0xe8808b, 0xe88192, 0xe88285,
+ /* c9 */ 0xe88595, 0xe88594, 0xe8858b, 0xe88591,
+ /* cd */ 0xe8858e, 0xe884b9, 0xe88586, 0xe884be,
+ /* d1 */ 0xe8858c, 0xe88593, 0xe885b4, 0xe88892,
+ /* d5 */ 0xe8889c, 0xe88fa9, 0xe89083, 0xe88fb8,
+ /* d9 */ 0xe8908d, 0xe88fa0, 0xe88f85, 0xe8908b,
+ /* dd */ 0xe88f81, 0xe88faf, 0xe88fb1, 0xe88fb4,
+ /* e1 */ 0xe89197, 0xe8908a, 0xe88fb0, 0xe8908c,
+ /* e5 */ 0xe88f8c, 0xe88fbd, 0xe88fb2, 0xe88f8a,
+ /* e9 */ 0xe890b8, 0xe8908e, 0xe89084, 0xe88f9c,
+ /* ed */ 0xe89087, 0xe88f94, 0xe88f9f, 0xe8999b,
+ /* f1 */ 0xe89b9f, 0xe89b99, 0xe89bad, 0xe89b94,
+ /* f5 */ 0xe89b9b, 0xe89ba4, 0xe89b90, 0xe89b9e,
+ /* f9 */ 0xe8a197, 0xe8a381, 0xe8a382, 0xe8a2b1,
+ /* fd */ 0xe8a683, 0xe8a696,
+
+ /*** Two byte table, leaf: e2xx - offset 0x00e51 ***/
+
+ /* a1 */ 0xe8a8bb, 0xe8a9a0, 0xe8a995, 0xe8a99e,
+ /* a5 */ 0xe8a8bc, 0xe8a981, 0xe8a994, 0xe8a99b,
+ /* a9 */ 0xe8a990, 0xe8a986, 0xe8a8b4, 0xe8a8ba,
+ /* ad */ 0xe8a8b6, 0xe8a996, 0xe8b1a1, 0xe8b282,
+ /* b1 */ 0xe8b2af, 0xe8b2bc, 0xe8b2b3, 0xe8b2bd,
+ /* b5 */ 0xe8b381, 0xe8b2bb, 0xe8b380, 0xe8b2b4,
+ /* b9 */ 0xe8b2b7, 0xe8b2b6, 0xe8b2bf, 0xe8b2b8,
+ /* bd */ 0xe8b68a, 0xe8b685, 0xe8b681, 0xe8b78e,
+ /* c1 */ 0xe8b79d, 0xe8b78b, 0xe8b79a, 0xe8b791,
+ /* c5 */ 0xe8b78c, 0xe8b79b, 0xe8b786, 0xe8bbbb,
+ /* c9 */ 0xe8bbb8, 0xe8bbbc, 0xe8be9c, 0xe980ae,
+ /* cd */ 0xe980b5, 0xe980b1, 0xe980b8, 0xe980b2,
+ /* d1 */ 0xe980b6, 0xe98482, 0xe983b5, 0xe98489,
+ /* d5 */ 0xe983be, 0xe985a3, 0xe985a5, 0xe9878f,
+ /* d9 */ 0xe98894, 0xe98895, 0xe988a3, 0xe98889,
+ /* dd */ 0xe9889e, 0xe9888d, 0xe98890, 0xe98887,
+ /* e1 */ 0xe98891, 0xe99694, 0xe9968f, 0xe9968b,
+ /* e5 */ 0xe99691, 0xe99693, 0xe99692, 0xe9968e,
+ /* e9 */ 0xe99a8a, 0xe99a8e, 0xe99a8b, 0xe999bd,
+ /* ed */ 0xe99a85, 0xe99a86, 0xe99a8d, 0xe999b2,
+ /* f1 */ 0xe99a84, 0xe99b81, 0xe99b85, 0xe99b84,
+ /* f5 */ 0xe99b86, 0xe99b87, 0xe99baf, 0xe99bb2,
+ /* f9 */ 0xe99f8c, 0xe9a085, 0xe9a086, 0xe9a088,
+ /* fd */ 0xe9a3a7, 0xe9a3aa,
+
+ /*** Two byte table, leaf: e3xx - offset 0x00eaf ***/
+
+ /* a1 */ 0xe9a3af, 0xe9a3a9, 0xe9a3b2, 0xe9a3ad,
+ /* a5 */ 0xe9a6ae, 0xe9a6ad, 0xe9bb83, 0xe9bb8d,
+ /* a9 */ 0xe9bb91, 0xe4ba82, 0xe582ad, 0xe582b5,
+ /* ad */ 0xe582b2, 0xe582b3, 0xe58385, 0xe582be,
+ /* b1 */ 0xe582ac, 0xe582b7, 0xe582bb, 0xe582af,
+ /* b5 */ 0xe58387, 0xe589bf, 0xe589b7, 0xe589bd,
+ /* b9 */ 0xe58b9f, 0xe58ba6, 0xe58ba4, 0xe58ba2,
+ /* bd */ 0xe58ba3, 0xe58caf, 0xe5979f, 0xe597a8,
+ /* c1 */ 0xe59793, 0xe597a6, 0xe5978e, 0xe5979c,
+ /* c5 */ 0xe59787, 0xe59791, 0xe597a3, 0xe597a4,
+ /* c9 */ 0xe597af, 0xe5979a, 0xe597a1, 0xe59785,
+ /* cd */ 0xe59786, 0xe597a5, 0xe59789, 0xe59c92,
+ /* d1 */ 0xe59c93, 0xe5a19e, 0xe5a191, 0xe5a198,
+ /* d5 */ 0xe5a197, 0xe5a19a, 0xe5a194, 0xe5a1ab,
+ /* d9 */ 0xe5a18c, 0xe5a1ad, 0xe5a18a, 0xe5a1a2,
+ /* dd */ 0xe5a192, 0xe5a18b, 0xe5a5a7, 0xe5ab81,
+ /* e1 */ 0xe5ab89, 0xe5ab8c, 0xe5aabe, 0xe5aabd,
+ /* e5 */ 0xe5aabc, 0xe5aab3, 0xe5ab82, 0xe5aab2,
+ /* e9 */ 0xe5b5a9, 0xe5b5af, 0xe5b98c, 0xe5b9b9,
+ /* ed */ 0xe5bb89, 0xe5bb88, 0xe5bc92, 0xe5bd99,
+ /* f1 */ 0xe5beac, 0xe5beae, 0xe6849a, 0xe6848f,
+ /* f5 */ 0xe68588, 0xe6849f, 0xe683b3, 0xe6849b,
+ /* f9 */ 0xe683b9, 0xe68481, 0xe68488, 0xe6858e,
+ /* fd */ 0xe6858c, 0xe68584,
+
+ /*** Two byte table, leaf: e4xx - offset 0x00f0d ***/
+
+ /* a1 */ 0xe6858d, 0xe684be, 0xe684b4, 0xe684a7,
+ /* a5 */ 0xe6848d, 0xe68486, 0xe684b7, 0xe688a1,
+ /* a9 */ 0xe688a2, 0xe69093, 0xe690be, 0xe6909e,
+ /* ad */ 0xe690aa, 0xe690ad, 0xe690bd, 0xe690ac,
+ /* b1 */ 0xe6908f, 0xe6909c, 0xe69094, 0xe6908d,
+ /* b5 */ 0xe690b6, 0xe69096, 0xe69097, 0xe69086,
+ /* b9 */ 0xe695ac, 0xe6969f, 0xe696b0, 0xe69a97,
+ /* bd */ 0xe69a89, 0xe69a87, 0xe69a88, 0xe69a96,
+ /* c1 */ 0xe69a84, 0xe69a98, 0xe69a8d, 0xe69c83,
+ /* c5 */ 0xe6a694, 0xe6a5ad, 0xe6a59a, 0xe6a5b7,
+ /* c9 */ 0xe6a5a0, 0xe6a594, 0xe6a5b5, 0xe6a4b0,
+ /* cd */ 0xe6a682, 0xe6a58a, 0xe6a5a8, 0xe6a5ab,
+ /* d1 */ 0xe6a59e, 0xe6a593, 0xe6a5b9, 0xe6a686,
+ /* d5 */ 0xe6a59d, 0xe6a5a3, 0xe6a59b, 0xe6ad87,
+ /* d9 */ 0xe6adb2, 0xe6af80, 0xe6aebf, 0xe6af93,
+ /* dd */ 0xe6afbd, 0xe6baa2, 0xe6baaf, 0xe6bb93,
+ /* e1 */ 0xe6bab6, 0xe6bb82, 0xe6ba90, 0xe6ba9d,
+ /* e5 */ 0xe6bb87, 0xe6bb85, 0xe6baa5, 0xe6ba98,
+ /* e9 */ 0xe6babc, 0xe6baba, 0xe6baab, 0xe6bb91,
+ /* ed */ 0xe6ba96, 0xe6ba9c, 0xe6bb84, 0xe6bb94,
+ /* f1 */ 0xe6baaa, 0xe6baa7, 0xe6bab4, 0xe7858e,
+ /* f5 */ 0xe78599, 0xe785a9, 0xe785a4, 0xe78589,
+ /* f9 */ 0xe785a7, 0xe7859c, 0xe785ac, 0xe785a6,
+ /* fd */ 0xe7858c, 0xe785a5,
+
+ /*** Two byte table, leaf: e5xx - offset 0x00f6b ***/
+
+ /* a1 */ 0xe7859e, 0xe78586, 0xe785a8, 0xe78596,
+ /* a5 */ 0xe788ba, 0xe78992, 0xe78cb7, 0xe78d85,
+ /* a9 */ 0xe78cbf, 0xe78cbe, 0xe791af, 0xe7919a,
+ /* ad */ 0xe79195, 0xe7919f, 0xe7919e, 0xe79181,
+ /* b1 */ 0xe790bf, 0xe79199, 0xe7919b, 0xe7919c,
+ /* b5 */ 0xe795b6, 0xe795b8, 0xe79880, 0xe797b0,
+ /* b9 */ 0xe79881, 0xe797b2, 0xe797b1, 0xe797ba,
+ /* bd */ 0xe797bf, 0xe797b4, 0xe797b3, 0xe79b9e,
+ /* c1 */ 0xe79b9f, 0xe79d9b, 0xe79dab, 0xe79da6,
+ /* c5 */ 0xe79d9e, 0xe79da3, 0xe79db9, 0xe79daa,
+ /* c9 */ 0xe79dac, 0xe79d9c, 0xe79da5, 0xe79da8,
+ /* cd */ 0xe79da2, 0xe79fae, 0xe7a28e, 0xe7a2b0,
+ /* d1 */ 0xe7a297, 0xe7a298, 0xe7a28c, 0xe7a289,
+ /* d5 */ 0xe7a1bc, 0xe7a291, 0xe7a293, 0xe7a1bf,
+ /* d9 */ 0xe7a5ba, 0xe7a5bf, 0xe7a681, 0xe890ac,
+ /* dd */ 0xe7a6bd, 0xe7a89c, 0xe7a89a, 0xe7a8a0,
+ /* e1 */ 0xe7a894, 0xe7a89f, 0xe7a89e, 0xe7aa9f,
+ /* e5 */ 0xe7aaa0, 0xe7adb7, 0xe7af80, 0xe7ada0,
+ /* e9 */ 0xe7adae, 0xe7ada7, 0xe7b2b1, 0xe7b2b3,
+ /* ed */ 0xe7b2b5, 0xe7b693, 0xe7b5b9, 0xe7b691,
+ /* f1 */ 0xe7b681, 0xe7b68f, 0xe7b59b, 0xe7bdae,
+ /* f5 */ 0xe7bda9, 0xe7bdaa, 0xe7bdb2, 0xe7bea9,
+ /* f9 */ 0xe7bea8, 0xe7bea4, 0xe88196, 0xe88198,
+ /* fd */ 0xe88286, 0xe88284,
+
+ /*** Two byte table, leaf: e6xx - offset 0x00fc9 ***/
+
+ /* a1 */ 0xe885b1, 0xe885b0, 0xe885b8, 0xe885a5,
+ /* a5 */ 0xe885ae, 0xe885b3, 0xe885ab, 0xe885b9,
+ /* a9 */ 0xe885ba, 0xe885a6, 0xe88885, 0xe88987,
+ /* ad */ 0xe89282, 0xe891b7, 0xe890bd, 0xe890b1,
+ /* b1 */ 0xe891b5, 0xe891a6, 0xe891ab, 0xe89189,
+ /* b5 */ 0xe891ac, 0xe8919b, 0xe890bc, 0xe890b5,
+ /* b9 */ 0xe891a1, 0xe891a3, 0xe891a9, 0xe891ad,
+ /* bd */ 0xe89186, 0xe8999e, 0xe8999c, 0xe8999f,
+ /* c1 */ 0xe89bb9, 0xe89c93, 0xe89c88, 0xe89c87,
+ /* c5 */ 0xe89c80, 0xe89bbe, 0xe89bbb, 0xe89c82,
+ /* c9 */ 0xe89c83, 0xe89c86, 0xe89c8a, 0xe8a199,
+ /* cd */ 0xe8a39f, 0xe8a394, 0xe8a399, 0xe8a39c,
+ /* d1 */ 0xe8a398, 0xe8a39d, 0xe8a3a1, 0xe8a38a,
+ /* d5 */ 0xe8a395, 0xe8a392, 0xe8a69c, 0xe8a7a3,
+ /* d9 */ 0xe8a9ab, 0xe8a9b2, 0xe8a9b3, 0xe8a9a6,
+ /* dd */ 0xe8a9a9, 0xe8a9b0, 0xe8aa87, 0xe8a9bc,
+ /* e1 */ 0xe8a9a3, 0xe8aaa0, 0xe8a9b1, 0xe8aa85,
+ /* e5 */ 0xe8a9ad, 0xe8a9a2, 0xe8a9ae, 0xe8a9ac,
+ /* e9 */ 0xe8a9b9, 0xe8a9bb, 0xe8a8be, 0xe8a9a8,
+ /* ed */ 0xe8b1a2, 0xe8b28a, 0xe8b289, 0xe8b38a,
+ /* f1 */ 0xe8b387, 0xe8b388, 0xe8b384, 0xe8b2b2,
+ /* f5 */ 0xe8b383, 0xe8b382, 0xe8b385, 0xe8b7a1,
+ /* f9 */ 0xe8b79f, 0xe8b7a8, 0xe8b7af, 0xe8b7b3,
+ /* fd */ 0xe8b7ba, 0xe8b7aa,
+
+ /*** Two byte table, leaf: e7xx - offset 0x01027 ***/
+
+ /* a1 */ 0xe8b7a4, 0xe8b7a6, 0xe8bab2, 0xe8bc83,
+ /* a5 */ 0xe8bc89, 0xe8bbbe, 0xe8bc8a, 0xe8be9f,
+ /* a9 */ 0xe8beb2, 0xe9818b, 0xe9818a, 0xe98193,
+ /* ad */ 0xe98182, 0xe98194, 0xe980bc, 0xe98195,
+ /* b1 */ 0xe98190, 0xe98187, 0xe9818f, 0xe9818e,
+ /* b5 */ 0xe9818d, 0xe98191, 0xe980be, 0xe98181,
+ /* b9 */ 0xe98492, 0xe98497, 0xe985ac, 0xe985aa,
+ /* bd */ 0xe985a9, 0xe98789, 0xe988b7, 0xe98997,
+ /* c1 */ 0xe988b8, 0xe988bd, 0xe98980, 0xe988be,
+ /* c5 */ 0xe9899b, 0xe9898b, 0xe989a4, 0xe98991,
+ /* c9 */ 0xe988b4, 0xe98989, 0xe9898d, 0xe98985,
+ /* cd */ 0xe988b9, 0xe988bf, 0xe9899a, 0xe99698,
+ /* d1 */ 0xe99a98, 0xe99a94, 0xe99a95, 0xe99b8d,
+ /* d5 */ 0xe99b8b, 0xe99b89, 0xe99b8a, 0xe99bb7,
+ /* d9 */ 0xe99bbb, 0xe99bb9, 0xe99bb6, 0xe99d96,
+ /* dd */ 0xe99db4, 0xe99db6, 0xe9a090, 0xe9a091,
+ /* e1 */ 0xe9a093, 0xe9a08a, 0xe9a092, 0xe9a08c,
+ /* e5 */ 0xe9a3bc, 0xe9a3b4, 0xe9a3bd, 0xe9a3be,
+ /* e9 */ 0xe9a6b3, 0xe9a6b1, 0xe9a6b4, 0xe9aba1,
+ /* ed */ 0xe9b3a9, 0xe9ba82, 0xe9bc8e, 0xe9bc93,
+ /* f1 */ 0xe9bca0, 0xe583a7, 0xe583ae, 0xe583a5,
+ /* f5 */ 0xe58396, 0xe583ad, 0xe5839a, 0xe58395,
+ /* f9 */ 0xe5838f, 0xe58391, 0xe583b1, 0xe5838e,
+ /* fd */ 0xe583a9, 0xe585a2,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01085 ***/
+
+ /* a1 */ 0xe587b3, 0xe58a83, 0xe58a82, 0xe58cb1,
+ /* a5 */ 0xe58ead, 0xe597be, 0xe59880, 0xe5989b,
+ /* a9 */ 0xe59897, 0xe597bd, 0xe59894, 0xe59886,
+ /* ad */ 0xe59889, 0xe5988d, 0xe5988e, 0xe597b7,
+ /* b1 */ 0xe59896, 0xe5989f, 0xe59888, 0xe59890,
+ /* b5 */ 0xe597b6, 0xe59c98, 0xe59c96, 0xe5a1b5,
+ /* b9 */ 0xe5a1be, 0xe5a283, 0xe5a293, 0xe5a28a,
+ /* bd */ 0xe5a1b9, 0xe5a285, 0xe5a1bd, 0xe5a3bd,
+ /* c1 */ 0xe5a4a5, 0xe5a4a2, 0xe5a4a4, 0xe5a5aa,
+ /* c5 */ 0xe5a5a9, 0xe5aba1, 0xe5aba6, 0xe5aba9,
+ /* c9 */ 0xe5ab97, 0xe5ab96, 0xe5ab98, 0xe5aba3,
+ /* cd */ 0xe5adb5, 0xe5af9e, 0xe5afa7, 0xe5afa1,
+ /* d1 */ 0xe5afa5, 0xe5afa6, 0xe5afa8, 0xe5afa2,
+ /* d5 */ 0xe5afa4, 0xe5af9f, 0xe5b08d, 0xe5b1a2,
+ /* d9 */ 0xe5b684, 0xe5b687, 0xe5b99b, 0xe5b9a3,
+ /* dd */ 0xe5b995, 0xe5b997, 0xe5b994, 0xe5bb93,
+ /* e1 */ 0xe5bb96, 0xe5bc8a, 0xe5bd86, 0xe5bdb0,
+ /* e5 */ 0xe5beb9, 0xe68587, 0xe684bf, 0xe6858b,
+ /* e9 */ 0xe685b7, 0xe685a2, 0xe685a3, 0xe6859f,
+ /* ed */ 0xe6859a, 0xe68598, 0xe685b5, 0xe688aa,
+ /* f1 */ 0xe69287, 0xe69198, 0xe69194, 0xe692a4,
+ /* f5 */ 0xe691b8, 0xe6919f, 0xe691ba, 0xe69191,
+ /* f9 */ 0xe691a7, 0xe690b4, 0xe691ad, 0xe691bb,
+ /* fd */ 0xe695b2, 0xe696a1,
+
+ /*** Two byte table, leaf: e9xx - offset 0x010e3 ***/
+
+ /* a1 */ 0xe69797, 0xe69796, 0xe69aa2, 0xe69aa8,
+ /* a5 */ 0xe69a9d, 0xe6a69c, 0xe6a6a8, 0xe6a695,
+ /* a9 */ 0xe6a781, 0xe6a6ae, 0xe6a793, 0xe6a78b,
+ /* ad */ 0xe6a69b, 0xe6a6b7, 0xe6a6bb, 0xe6a6ab,
+ /* b1 */ 0xe6a6b4, 0xe6a790, 0xe6a78d, 0xe6a6ad,
+ /* b5 */ 0xe6a78c, 0xe6a6a6, 0xe6a783, 0xe6a6a3,
+ /* b9 */ 0xe6ad89, 0xe6ad8c, 0xe6b0b3, 0xe6bcb3,
+ /* bd */ 0xe6bc94, 0xe6bbbe, 0xe6bc93, 0xe6bbb4,
+ /* c1 */ 0xe6bca9, 0xe6bcbe, 0xe6bca0, 0xe6bcac,
+ /* c5 */ 0xe6bc8f, 0xe6bc82, 0xe6bca2, 0xe6bbbf,
+ /* c9 */ 0xe6bbaf, 0xe6bc86, 0xe6bcb1, 0xe6bcb8,
+ /* cd */ 0xe6bcb2, 0xe6bca3, 0xe6bc95, 0xe6bcab,
+ /* d1 */ 0xe6bcaf, 0xe6be88, 0xe6bcaa, 0xe6bbac,
+ /* d5 */ 0xe6bc81, 0xe6bbb2, 0xe6bb8c, 0xe6bbb7,
+ /* d9 */ 0xe78694, 0xe78699, 0xe785bd, 0xe7868a,
+ /* dd */ 0xe78684, 0xe78692, 0xe788be, 0xe78a92,
+ /* e1 */ 0xe78a96, 0xe78d84, 0xe78d90, 0xe791a4,
+ /* e5 */ 0xe791a3, 0xe791aa, 0xe791b0, 0xe791ad,
+ /* e9 */ 0xe79484, 0xe79691, 0xe798a7, 0xe7988d,
+ /* ed */ 0xe7988b, 0xe79889, 0xe79893, 0xe79ba1,
+ /* f1 */ 0xe79ba3, 0xe79e84, 0xe79dbd, 0xe79dbf,
+ /* f5 */ 0xe79da1, 0xe7a381, 0xe7a29f, 0xe7a2a7,
+ /* f9 */ 0xe7a2b3, 0xe7a2a9, 0xe7a2a3, 0xe7a68e,
+ /* fd */ 0xe7a68f, 0xe7a68d,
+
+ /*** Two byte table, leaf: eaxx - offset 0x01141 ***/
+
+ /* a1 */ 0xe7a8ae, 0xe7a8b1, 0xe7aaaa, 0xe7aaa9,
+ /* a5 */ 0xe7abad, 0xe7abaf, 0xe7aea1, 0xe7ae95,
+ /* a9 */ 0xe7ae8b, 0xe7adb5, 0xe7ae97, 0xe7ae9d,
+ /* ad */ 0xe7ae94, 0xe7ae8f, 0xe7aeb8, 0xe7ae87,
+ /* b1 */ 0xe7ae84, 0xe7b2b9, 0xe7b2bd, 0xe7b2be,
+ /* b5 */ 0xe7b6bb, 0xe7b6b0, 0xe7b69c, 0xe7b6bd,
+ /* b9 */ 0xe7b6be, 0xe7b6a0, 0xe7b78a, 0xe7b6b4,
+ /* bd */ 0xe7b6b2, 0xe7b6b1, 0xe7b6ba, 0xe7b6a2,
+ /* c1 */ 0xe7b6bf, 0xe7b6b5, 0xe7b6b8, 0xe7b6ad,
+ /* c5 */ 0xe7b792, 0xe7b787, 0xe7b6ac, 0xe7bdb0,
+ /* c9 */ 0xe7bfa0, 0xe7bfa1, 0xe7bf9f, 0xe8819e,
+ /* cd */ 0xe8819a, 0xe88287, 0xe88590, 0xe88680,
+ /* d1 */ 0xe8868f, 0xe88688, 0xe8868a, 0xe885bf,
+ /* d5 */ 0xe88682, 0xe887a7, 0xe887ba, 0xe88887,
+ /* d9 */ 0xe88894, 0xe8889e, 0xe8898b, 0xe89389,
+ /* dd */ 0xe892bf, 0xe89386, 0xe89384, 0xe89299,
+ /* e1 */ 0xe8929e, 0xe892b2, 0xe8929c, 0xe8938b,
+ /* e5 */ 0xe892b8, 0xe89380, 0xe89393, 0xe89290,
+ /* e9 */ 0xe892bc, 0xe89391, 0xe8938a, 0xe89cbf,
+ /* ed */ 0xe89c9c, 0xe89cbb, 0xe89ca2, 0xe89ca5,
+ /* f1 */ 0xe89cb4, 0xe89c98, 0xe89d95, 0xe89cb7,
+ /* f5 */ 0xe89ca9, 0xe8a3b3, 0xe8a482, 0xe8a3b4,
+ /* f9 */ 0xe8a3b9, 0xe8a3b8, 0xe8a3bd, 0xe8a3a8,
+ /* fd */ 0xe8a49a, 0xe8a3af,
+
+ /*** Two byte table, leaf: ebxx - offset 0x0119f ***/
+
+ /* a1 */ 0xe8aaa6, 0xe8aa8c, 0xe8aa9e, 0xe8aaa3,
+ /* a5 */ 0xe8aa8d, 0xe8aaa1, 0xe8aa93, 0xe8aaa4,
+ /* a9 */ 0xe8aaaa, 0xe8aaa5, 0xe8aaa8, 0xe8aa98,
+ /* ad */ 0xe8aa91, 0xe8aa9a, 0xe8aaa7, 0xe8b1aa,
+ /* b1 */ 0xe8b28d, 0xe8b28c, 0xe8b393, 0xe8b391,
+ /* b5 */ 0xe8b392, 0xe8b5ab, 0xe8b699, 0xe8b695,
+ /* b9 */ 0xe8b7bc, 0xe8bc94, 0xe8bc92, 0xe8bc95,
+ /* bd */ 0xe8bc93, 0xe8bea3, 0xe981a0, 0xe98198,
+ /* c1 */ 0xe9819c, 0xe981a3, 0xe98199, 0xe9819e,
+ /* c5 */ 0xe981a2, 0xe9819d, 0xe9819b, 0xe98499,
+ /* c9 */ 0xe98498, 0xe9849e, 0xe985b5, 0xe985b8,
+ /* cd */ 0xe985b7, 0xe985b4, 0xe989b8, 0xe98aac,
+ /* d1 */ 0xe98a80, 0xe98a85, 0xe98a98, 0xe98a96,
+ /* d5 */ 0xe989bb, 0xe98a93, 0xe98a9c, 0xe98aa8,
+ /* d9 */ 0xe989bc, 0xe98a91, 0xe996a1, 0xe996a8,
+ /* dd */ 0xe996a9, 0xe996a3, 0xe996a5, 0xe996a4,
+ /* e1 */ 0xe99a99, 0xe99a9c, 0xe99a9b, 0xe99b8c,
+ /* e5 */ 0xe99b92, 0xe99c80, 0xe99dbc, 0xe99e85,
+ /* e9 */ 0xe99fb6, 0xe9a097, 0xe9a098, 0xe9a2af,
+ /* ed */ 0xe9a2b1, 0xe9a483, 0xe9a485, 0xe9a48c,
+ /* f1 */ 0xe9a489, 0xe9a781, 0xe9aaaf, 0xe9aab0,
+ /* f5 */ 0xe9aba6, 0xe9ad81, 0xe9ad82, 0xe9b3b4,
+ /* f9 */ 0xe9b3b6, 0xe9b3b3, 0xe9babc, 0xe9bcbb,
+ /* fd */ 0xe9bd8a, 0xe58484,
+
+ /*** Two byte table, leaf: ecxx - offset 0x011fd ***/
+
+ /* a1 */ 0xe58480, 0xe583bb, 0xe583b5, 0xe583b9,
+ /* a5 */ 0xe58482, 0xe58488, 0xe58489, 0xe58485,
+ /* a9 */ 0xe5879c, 0xe58a87, 0xe58a88, 0xe58a89,
+ /* ad */ 0xe58a8d, 0xe58a8a, 0xe58bb0, 0xe58eb2,
+ /* b1 */ 0xe598ae, 0xe598bb, 0xe598b9, 0xe598b2,
+ /* b5 */ 0xe598bf, 0xe598b4, 0xe598a9, 0xe59993,
+ /* b9 */ 0xe5998e, 0xe59997, 0xe599b4, 0xe598b6,
+ /* bd */ 0xe598af, 0xe598b0, 0xe5a280, 0xe5a29f,
+ /* c1 */ 0xe5a29e, 0xe5a2b3, 0xe5a29c, 0xe5a2ae,
+ /* c5 */ 0xe5a2a9, 0xe5a2a6, 0xe5a5ad, 0xe5ac89,
+ /* c9 */ 0xe5abbb, 0xe5ac8b, 0xe5abb5, 0xe5ac8c,
+ /* cd */ 0xe5ac88, 0xe5afae, 0xe5afac, 0xe5afa9,
+ /* d1 */ 0xe5afab, 0xe5b1a4, 0xe5b1a5, 0xe5b69d,
+ /* d5 */ 0xe5b694, 0xe5b9a2, 0xe5b99f, 0xe5b9a1,
+ /* d9 */ 0xe5bba2, 0xe5bb9a, 0xe5bb9f, 0xe5bb9d,
+ /* dd */ 0xe5bba3, 0xe5bba0, 0xe5bd88, 0xe5bdb1,
+ /* e1 */ 0xe5beb7, 0xe5beb5, 0xe685b6, 0xe685a7,
+ /* e5 */ 0xe685ae, 0xe6859d, 0xe68595, 0xe68682,
+ /* e9 */ 0xe685bc, 0xe685b0, 0xe685ab, 0xe685be,
+ /* ed */ 0xe686a7, 0xe68690, 0xe686ab, 0xe6868e,
+ /* f1 */ 0xe686ac, 0xe6869a, 0xe686a4, 0xe68694,
+ /* f5 */ 0xe686ae, 0xe688ae, 0xe691a9, 0xe691af,
+ /* f9 */ 0xe691b9, 0xe6929e, 0xe692b2, 0xe69288,
+ /* fd */ 0xe69290, 0xe692b0,
+
+ /*** Two byte table, leaf: edxx - offset 0x0125b ***/
+
+ /* a1 */ 0xe692a5, 0xe69293, 0xe69295, 0xe692a9,
+ /* a5 */ 0xe69292, 0xe692ae, 0xe692ad, 0xe692ab,
+ /* a9 */ 0xe6929a, 0xe692ac, 0xe69299, 0xe692a2,
+ /* ad */ 0xe692b3, 0xe695b5, 0xe695b7, 0xe695b8,
+ /* b1 */ 0xe69aae, 0xe69aab, 0xe69ab4, 0xe69ab1,
+ /* b5 */ 0xe6a8a3, 0xe6a89f, 0xe6a7a8, 0xe6a881,
+ /* b9 */ 0xe6a89e, 0xe6a899, 0xe6a7bd, 0xe6a8a1,
+ /* bd */ 0xe6a893, 0xe6a88a, 0xe6a7b3, 0xe6a882,
+ /* c1 */ 0xe6a885, 0xe6a7ad, 0xe6a891, 0xe6ad90,
+ /* c5 */ 0xe6ad8e, 0xe6aea4, 0xe6af85, 0xe6af86,
+ /* c9 */ 0xe6bcbf, 0xe6bdbc, 0xe6be84, 0xe6bd91,
+ /* cd */ 0xe6bda6, 0xe6bd94, 0xe6be86, 0xe6bdad,
+ /* d1 */ 0xe6bd9b, 0xe6bdb8, 0xe6bdae, 0xe6be8e,
+ /* d5 */ 0xe6bdba, 0xe6bdb0, 0xe6bda4, 0xe6be97,
+ /* d9 */ 0xe6bd98, 0xe6bb95, 0xe6bdaf, 0xe6bda0,
+ /* dd */ 0xe6bd9f, 0xe7869f, 0xe786ac, 0xe786b1,
+ /* e1 */ 0xe786a8, 0xe78996, 0xe78a9b, 0xe78d8e,
+ /* e5 */ 0xe78d97, 0xe791a9, 0xe7928b, 0xe79283,
+ /* e9 */ 0xe791be, 0xe79280, 0xe795bf, 0xe798a0,
+ /* ed */ 0xe798a9, 0xe7989f, 0xe798a4, 0xe798a6,
+ /* f1 */ 0xe798a1, 0xe798a2, 0xe79a9a, 0xe79aba,
+ /* f5 */ 0xe79ba4, 0xe79e8e, 0xe79e87, 0xe79e8c,
+ /* f9 */ 0xe79e91, 0xe79e8b, 0xe7a38b, 0xe7a385,
+ /* fd */ 0xe7a2ba, 0xe7a38a,
+
+ /*** Two byte table, leaf: eexx - offset 0x012b9 ***/
+
+ /* a1 */ 0xe7a2be, 0xe7a395, 0xe7a2bc, 0xe7a390,
+ /* a5 */ 0xe7a8bf, 0xe7a8bc, 0xe7a980, 0xe7a8bd,
+ /* a9 */ 0xe7a8b7, 0xe7a8bb, 0xe7aaaf, 0xe7aaae,
+ /* ad */ 0xe7aead, 0xe7aeb1, 0xe7af84, 0xe7aeb4,
+ /* b1 */ 0xe7af86, 0xe7af87, 0xe7af81, 0xe7aea0,
+ /* b5 */ 0xe7af8c, 0xe7b38a, 0xe7b7a0, 0xe7b7b4,
+ /* b9 */ 0xe7b7af, 0xe7b7bb, 0xe7b798, 0xe7b7ac,
+ /* bd */ 0xe7b79d, 0xe7b7a8, 0xe7b7a3, 0xe7b79a,
+ /* c1 */ 0xe7b79e, 0xe7b7a9, 0xe7b69e, 0xe7b799,
+ /* c5 */ 0xe7b7b2, 0xe7b7b9, 0xe7bdb5, 0xe7bdb7,
+ /* c9 */ 0xe7beaf, 0xe7bfa9, 0xe880a6, 0xe8869b,
+ /* cd */ 0xe8869c, 0xe8869d, 0xe886a0, 0xe8869a,
+ /* d1 */ 0xe88698, 0xe89497, 0xe894bd, 0xe8949a,
+ /* d5 */ 0xe893ae, 0xe894ac, 0xe894ad, 0xe89493,
+ /* d9 */ 0xe89491, 0xe894a3, 0xe894a1, 0xe89494,
+ /* dd */ 0xe893ac, 0xe894a5, 0xe893bf, 0xe89486,
+ /* e1 */ 0xe89e82, 0xe89db4, 0xe89db6, 0xe89da0,
+ /* e5 */ 0xe89da6, 0xe89db8, 0xe89da8, 0xe89d99,
+ /* e9 */ 0xe89d97, 0xe89d8c, 0xe89d93, 0xe8a19b,
+ /* ed */ 0xe8a19d, 0xe8a490, 0xe8a487, 0xe8a492,
+ /* f1 */ 0xe8a493, 0xe8a495, 0xe8a48a, 0xe8aabc,
+ /* f5 */ 0xe8ab92, 0xe8ab87, 0xe8ab84, 0xe8aa95,
+ /* f9 */ 0xe8ab8b, 0xe8abb8, 0xe8aab2, 0xe8ab89,
+ /* fd */ 0xe8ab82, 0xe8aabf,
+
+ /*** Two byte table, leaf: efxx - offset 0x01317 ***/
+
+ /* a1 */ 0xe8aab0, 0xe8ab96, 0xe8ab8d, 0xe8aab6,
+ /* a5 */ 0xe8aab9, 0xe8ab9b, 0xe8b18c, 0xe8b18e,
+ /* a9 */ 0xe8b1ac, 0xe8b3a0, 0xe8b39e, 0xe8b3a6,
+ /* ad */ 0xe8b3a4, 0xe8b3ac, 0xe8b3ad, 0xe8b3a2,
+ /* b1 */ 0xe8b3a3, 0xe8b39c, 0xe8b3aa, 0xe8b3a1,
+ /* b5 */ 0xe8b5ad, 0xe8b69f, 0xe8b6a3, 0xe8b8ab,
+ /* b9 */ 0xe8b890, 0xe8b89d, 0xe8b8a2, 0xe8b88f,
+ /* bd */ 0xe8b8a9, 0xe8b89f, 0xe8b8a1, 0xe8b89e,
+ /* c1 */ 0xe8baba, 0xe8bc9d, 0xe8bc9b, 0xe8bc9f,
+ /* c5 */ 0xe8bca9, 0xe8bca6, 0xe8bcaa, 0xe8bc9c,
+ /* c9 */ 0xe8bc9e, 0xe8bca5, 0xe981a9, 0xe981ae,
+ /* cd */ 0xe981a8, 0xe981ad, 0xe981b7, 0xe984b0,
+ /* d1 */ 0xe984ad, 0xe984a7, 0xe984b1, 0xe98687,
+ /* d5 */ 0xe98689, 0xe9868b, 0xe98683, 0xe98b85,
+ /* d9 */ 0xe98abb, 0xe98ab7, 0xe98baa, 0xe98ba4,
+ /* dd */ 0xe98b81, 0xe98ab3, 0xe98abc, 0xe98b92,
+ /* e1 */ 0xe98b87, 0xe98bb0, 0xe98ab2, 0xe996ad,
+ /* e5 */ 0xe996b1, 0xe99c84, 0xe99c86, 0xe99c87,
+ /* e9 */ 0xe99c89, 0xe99da0, 0xe99e8d, 0xe99e8b,
+ /* ed */ 0xe99e8f, 0xe9a0a1, 0xe9a0ab, 0xe9a09c,
+ /* f1 */ 0xe9a2b3, 0xe9a48a, 0xe9a493, 0xe9a492,
+ /* f5 */ 0xe9a498, 0xe9a79d, 0xe9a790, 0xe9a79f,
+ /* f9 */ 0xe9a79b, 0xe9a791, 0xe9a795, 0xe9a792,
+ /* fd */ 0xe9a799, 0xe9aab7,
+
+ /*** Two byte table, leaf: f0xx - offset 0x01375 ***/
+
+ /* a1 */ 0xe9abae, 0xe9abaf, 0xe9aca7, 0xe9ad85,
+ /* a5 */ 0xe9ad84, 0xe9adb7, 0xe9adaf, 0xe9b486,
+ /* a9 */ 0xe9b489, 0xe9b483, 0xe9baa9, 0xe9babe,
+ /* ad */ 0xe9bb8e, 0xe5a2a8, 0xe9bd92, 0xe58492,
+ /* b1 */ 0xe58498, 0xe58494, 0xe58490, 0xe58495,
+ /* b5 */ 0xe58680, 0xe586aa, 0xe5879d, 0xe58a91,
+ /* b9 */ 0xe58a93, 0xe58bb3, 0xe59999, 0xe599ab,
+ /* bd */ 0xe599b9, 0xe599a9, 0xe599a4, 0xe599b8,
+ /* c1 */ 0xe599aa, 0xe599a8, 0xe599a5, 0xe599b1,
+ /* c5 */ 0xe599af, 0xe599ac, 0xe599a2, 0xe599b6,
+ /* c9 */ 0xe5a381, 0xe5a2be, 0xe5a387, 0xe5a385,
+ /* cd */ 0xe5a5ae, 0xe5ac9d, 0xe5acb4, 0xe5adb8,
+ /* d1 */ 0xe5afb0, 0xe5b08e, 0xe5bd8a, 0xe686b2,
+ /* d5 */ 0xe68691, 0xe686a9, 0xe6868a, 0xe6878d,
+ /* d9 */ 0xe686b6, 0xe686be, 0xe6878a, 0xe68788,
+ /* dd */ 0xe688b0, 0xe69385, 0xe69381, 0xe6938b,
+ /* e1 */ 0xe692bb, 0xe692bc, 0xe6939a, 0xe69384,
+ /* e5 */ 0xe69387, 0xe69382, 0xe6938d, 0xe692bf,
+ /* e9 */ 0xe69392, 0xe69394, 0xe692be, 0xe695b4,
+ /* ed */ 0xe69b86, 0xe69b89, 0xe69ab9, 0xe69b84,
+ /* f1 */ 0xe69b87, 0xe69ab8, 0xe6a8bd, 0xe6a8b8,
+ /* f5 */ 0xe6a8ba, 0xe6a999, 0xe6a9ab, 0xe6a998,
+ /* f9 */ 0xe6a8b9, 0xe6a984, 0xe6a9a2, 0xe6a9a1,
+ /* fd */ 0xe6a98b, 0xe6a987,
+
+ /*** Two byte table, leaf: f1xx - offset 0x013d3 ***/
+
+ /* a1 */ 0xe6a8b5, 0xe6a99f, 0xe6a988, 0xe6ad99,
+ /* a5 */ 0xe6adb7, 0xe6b085, 0xe6bf82, 0xe6beb1,
+ /* a9 */ 0xe6bea1, 0xe6bf83, 0xe6bea4, 0xe6bf81,
+ /* ad */ 0xe6bea7, 0xe6beb3, 0xe6bf80, 0xe6beb9,
+ /* b1 */ 0xe6beb6, 0xe6bea6, 0xe6bea0, 0xe6beb4,
+ /* b5 */ 0xe786be, 0xe78789, 0xe78790, 0xe78792,
+ /* b9 */ 0xe78788, 0xe78795, 0xe786b9, 0xe7878e,
+ /* bd */ 0xe78799, 0xe7879c, 0xe78783, 0xe78784,
+ /* c1 */ 0xe78da8, 0xe7929c, 0xe792a3, 0xe79298,
+ /* c5 */ 0xe7929f, 0xe7929e, 0xe793a2, 0xe7948c,
+ /* c9 */ 0xe7948d, 0xe798b4, 0xe798b8, 0xe798ba,
+ /* cd */ 0xe79ba7, 0xe79ba5, 0xe79ea0, 0xe79e9e,
+ /* d1 */ 0xe79e9f, 0xe79ea5, 0xe7a3a8, 0xe7a39a,
+ /* d5 */ 0xe7a3ac, 0xe7a3a7, 0xe7a6a6, 0xe7a98d,
+ /* d9 */ 0xe7a98e, 0xe7a986, 0xe7a98c, 0xe7a98b,
+ /* dd */ 0xe7aaba, 0xe7af99, 0xe7b091, 0xe7af89,
+ /* e1 */ 0xe7afa4, 0xe7af9b, 0xe7afa1, 0xe7afa9,
+ /* e5 */ 0xe7afa6, 0xe7b395, 0xe7b396, 0xe7b88a,
+ /* e9 */ 0xe7b891, 0xe7b888, 0xe7b89b, 0xe7b8a3,
+ /* ed */ 0xe7b89e, 0xe7b89d, 0xe7b889, 0xe7b890,
+ /* f1 */ 0xe7bdb9, 0xe7beb2, 0xe7bfb0, 0xe7bfb1,
+ /* f5 */ 0xe7bfae, 0xe880a8, 0xe886b3, 0xe886a9,
+ /* f9 */ 0xe886a8, 0xe887bb, 0xe88888, 0xe88998,
+ /* fd */ 0xe88999, 0xe8958a,
+
+ /*** Two byte table, leaf: f2xx - offset 0x01431 ***/
+
+ /* a1 */ 0xe89599, 0xe89588, 0xe895a8, 0xe895a9,
+ /* a5 */ 0xe89583, 0xe89589, 0xe895ad, 0xe895aa,
+ /* a9 */ 0xe8959e, 0xe89e83, 0xe89e9f, 0xe89e9e,
+ /* ad */ 0xe89ea2, 0xe89e8d, 0xe8a1a1, 0xe8a4aa,
+ /* b1 */ 0xe8a4b2, 0xe8a4a5, 0xe8a4ab, 0xe8a4a1,
+ /* b5 */ 0xe8a6aa, 0xe8a6a6, 0xe8aba6, 0xe8abba,
+ /* b9 */ 0xe8abab, 0xe8abb1, 0xe8ac80, 0xe8ab9c,
+ /* bd */ 0xe8aba7, 0xe8abae, 0xe8abbe, 0xe8ac81,
+ /* c1 */ 0xe8ac82, 0xe8abb7, 0xe8abad, 0xe8abb3,
+ /* c5 */ 0xe8abb6, 0xe8abbc, 0xe8b1ab, 0xe8b1ad,
+ /* c9 */ 0xe8b293, 0xe8b3b4, 0xe8b984, 0xe8b8b1,
+ /* cd */ 0xe8b8b4, 0xe8b982, 0xe8b8b9, 0xe8b8b5,
+ /* d1 */ 0xe8bcbb, 0xe8bcaf, 0xe8bcb8, 0xe8bcb3,
+ /* d5 */ 0xe8bea8, 0xe8bea6, 0xe981b5, 0xe981b4,
+ /* d9 */ 0xe981b8, 0xe981b2, 0xe981bc, 0xe981ba,
+ /* dd */ 0xe984b4, 0xe98692, 0xe98ca0, 0xe98cb6,
+ /* e1 */ 0xe98bb8, 0xe98cb3, 0xe98caf, 0xe98ca2,
+ /* e5 */ 0xe98bbc, 0xe98cab, 0xe98c84, 0xe98c9a,
+ /* e9 */ 0xe98c90, 0xe98ca6, 0xe98ca1, 0xe98c95,
+ /* ed */ 0xe98cae, 0xe98c99, 0xe996bb, 0xe99aa7,
+ /* f1 */ 0xe99aa8, 0xe99aaa, 0xe99b95, 0xe99c8e,
+ /* f5 */ 0xe99c91, 0xe99c96, 0xe99c8d, 0xe99c93,
+ /* f9 */ 0xe99c8f, 0xe99d9b, 0xe99d9c, 0xe99da6,
+ /* fd */ 0xe99e98, 0xe9a0b0,
+
+ /*** Two byte table, leaf: f3xx - offset 0x0148f ***/
+
+ /* a1 */ 0xe9a0b8, 0xe9a0bb, 0xe9a0b7, 0xe9a0ad,
+ /* a5 */ 0xe9a0b9, 0xe9a0a4, 0xe9a490, 0xe9a4a8,
+ /* a9 */ 0xe9a49e, 0xe9a49b, 0xe9a4a1, 0xe9a49a,
+ /* ad */ 0xe9a7ad, 0xe9a7a2, 0xe9a7b1, 0xe9aab8,
+ /* b1 */ 0xe9aabc, 0xe9abbb, 0xe9abad, 0xe9aca8,
+ /* b5 */ 0xe9ae91, 0xe9b495, 0xe9b4a3, 0xe9b4a6,
+ /* b9 */ 0xe9b4a8, 0xe9b492, 0xe9b49b, 0xe9bb98,
+ /* bd */ 0xe9bb94, 0xe9be8d, 0xe9be9c, 0xe584aa,
+ /* c1 */ 0xe5849f, 0xe584a1, 0xe584b2, 0xe58bb5,
+ /* c5 */ 0xe59a8e, 0xe59a80, 0xe59a90, 0xe59a85,
+ /* c9 */ 0xe59a87, 0xe59a8f, 0xe5a395, 0xe5a393,
+ /* cd */ 0xe5a391, 0xe5a38e, 0xe5acb0, 0xe5acaa,
+ /* d1 */ 0xe5aca4, 0xe5adba, 0xe5b0b7, 0xe5b1a8,
+ /* d5 */ 0xe5b6bc, 0xe5b6ba, 0xe5b6bd, 0xe5b6b8,
+ /* d9 */ 0xe5b9ab, 0xe5bd8c, 0xe5bebd, 0xe68789,
+ /* dd */ 0xe68782, 0xe68787, 0xe687a6, 0xe6878b,
+ /* e1 */ 0xe688b2, 0xe688b4, 0xe6938e, 0xe6938a,
+ /* e5 */ 0xe69398, 0xe693a0, 0xe693b0, 0xe693a6,
+ /* e9 */ 0xe693ac, 0xe693b1, 0xe693a2, 0xe693ad,
+ /* ed */ 0xe69682, 0xe69683, 0xe69b99, 0xe69b96,
+ /* f1 */ 0xe6aa80, 0xe6aa94, 0xe6aa84, 0xe6aaa2,
+ /* f5 */ 0xe6aa9c, 0xe6ab9b, 0xe6aaa3, 0xe6a9be,
+ /* f9 */ 0xe6aa97, 0xe6aa90, 0xe6aaa0, 0xe6ad9c,
+ /* fd */ 0xe6aeae, 0xe6af9a,
+
+ /*** Two byte table, leaf: f4xx - offset 0x014ed ***/
+
+ /* a1 */ 0xe6b088, 0xe6bf98, 0xe6bfb1, 0xe6bf9f,
+ /* a5 */ 0xe6bfa0, 0xe6bf9b, 0xe6bfa4, 0xe6bfab,
+ /* a9 */ 0xe6bfaf, 0xe6be80, 0xe6bfac, 0xe6bfa1,
+ /* ad */ 0xe6bfa9, 0xe6bf95, 0xe6bfae, 0xe6bfb0,
+ /* b1 */ 0xe787a7, 0xe7879f, 0xe787ae, 0xe787a6,
+ /* b5 */ 0xe787a5, 0xe787ad, 0xe787ac, 0xe787b4,
+ /* b9 */ 0xe787a0, 0xe788b5, 0xe78986, 0xe78db0,
+ /* bd */ 0xe78db2, 0xe792a9, 0xe792b0, 0xe792a6,
+ /* c1 */ 0xe792a8, 0xe79986, 0xe79982, 0xe7998c,
+ /* c5 */ 0xe79baa, 0xe79eb3, 0xe79eaa, 0xe79eb0,
+ /* c9 */ 0xe79eac, 0xe79ea7, 0xe79ead, 0xe79faf,
+ /* cd */ 0xe7a3b7, 0xe7a3ba, 0xe7a3b4, 0xe7a3af,
+ /* d1 */ 0xe7a481, 0xe7a6a7, 0xe7a6aa, 0xe7a997,
+ /* d5 */ 0xe7aabf, 0xe7b087, 0xe7b08d, 0xe7afbe,
+ /* d9 */ 0xe7afb7, 0xe7b08c, 0xe7afa0, 0xe7b3a0,
+ /* dd */ 0xe7b39c, 0xe7b39e, 0xe7b3a2, 0xe7b39f,
+ /* e1 */ 0xe7b399, 0xe7b39d, 0xe7b8ae, 0xe7b8be,
+ /* e5 */ 0xe7b986, 0xe7b8b7, 0xe7b8b2, 0xe7b983,
+ /* e9 */ 0xe7b8ab, 0xe7b8bd, 0xe7b8b1, 0xe7b985,
+ /* ed */ 0xe7b981, 0xe7b8b4, 0xe7b8b9, 0xe7b988,
+ /* f1 */ 0xe7b8b5, 0xe7b8bf, 0xe7b8af, 0xe7bd84,
+ /* f5 */ 0xe7bfb3, 0xe7bfbc, 0xe881b1, 0xe881b2,
+ /* f9 */ 0xe881b0, 0xe881af, 0xe881b3, 0xe88786,
+ /* fd */ 0xe88783, 0xe886ba,
+
+ /*** Two byte table, leaf: f5xx - offset 0x0154b ***/
+
+ /* a1 */ 0xe88782, 0xe88780, 0xe886bf, 0xe886bd,
+ /* a5 */ 0xe88789, 0xe886be, 0xe887a8, 0xe88889,
+ /* a9 */ 0xe889b1, 0xe896aa, 0xe89684, 0xe895be,
+ /* ad */ 0xe8969c, 0xe89691, 0xe89694, 0xe896af,
+ /* b1 */ 0xe8969b, 0xe89687, 0xe896a8, 0xe8968a,
+ /* b5 */ 0xe896a6, 0xe899a7, 0xe89f80, 0xe89f91,
+ /* b9 */ 0xe89eb3, 0xe89f92, 0xe89f86, 0xe89eab,
+ /* bd */ 0xe89ebb, 0xe89eba, 0xe89f88, 0xe89f8b,
+ /* c1 */ 0xe8a4bb, 0xe8a4b6, 0xe8a584, 0xe8a4b8,
+ /* c5 */ 0xe8a4bd, 0xe8a6ac, 0xe8ac8e, 0xe8ac97,
+ /* c9 */ 0xe8ac99, 0xe8ac9b, 0xe8ac8a, 0xe8aca0,
+ /* cd */ 0xe8ac9d, 0xe8ac84, 0xe8ac90, 0xe8b181,
+ /* d1 */ 0xe8b0bf, 0xe8b1b3, 0xe8b3ba, 0xe8b3bd,
+ /* d5 */ 0xe8b3bc, 0xe8b3b8, 0xe8b3bb, 0xe8b6a8,
+ /* d9 */ 0xe8b989, 0xe8b98b, 0xe8b988, 0xe8b98a,
+ /* dd */ 0xe8bd84, 0xe8bcbe, 0xe8bd82, 0xe8bd85,
+ /* e1 */ 0xe8bcbf, 0xe981bf, 0xe981bd, 0xe98284,
+ /* e5 */ 0xe98281, 0xe98282, 0xe98280, 0xe984b9,
+ /* e9 */ 0xe986a3, 0xe9869e, 0xe9869c, 0xe98d8d,
+ /* ed */ 0xe98e82, 0xe98ca8, 0xe98db5, 0xe98d8a,
+ /* f1 */ 0xe98da5, 0xe98d8b, 0xe98c98, 0xe98dbe,
+ /* f5 */ 0xe98dac, 0xe98d9b, 0xe98db0, 0xe98d9a,
+ /* f9 */ 0xe98d94, 0xe9978a, 0xe9978b, 0xe9978c,
+ /* fd */ 0xe99788, 0xe99786,
+
+ /*** Two byte table, leaf: f6xx - offset 0x015a9 ***/
+
+ /* a1 */ 0xe99ab1, 0xe99ab8, 0xe99b96, 0xe99c9c,
+ /* a5 */ 0xe99c9e, 0xe99ea0, 0xe99f93, 0xe9a186,
+ /* a9 */ 0xe9a2b6, 0xe9a4b5, 0xe9a881, 0xe9a7bf,
+ /* ad */ 0xe9aeae, 0xe9aeab, 0xe9aeaa, 0xe9aead,
+ /* b1 */ 0xe9b4bb, 0xe9b4bf, 0xe9ba8b, 0xe9bb8f,
+ /* b5 */ 0xe9bb9e, 0xe9bb9c, 0xe9bb9d, 0xe9bb9b,
+ /* b9 */ 0xe9bcbe, 0xe9bd8b, 0xe58fa2, 0xe59a95,
+ /* bd */ 0xe59aae, 0xe5a399, 0xe5a398, 0xe5acb8,
+ /* c1 */ 0xe5bd9e, 0xe687a3, 0xe688b3, 0xe693b4,
+ /* c5 */ 0xe693b2, 0xe693be, 0xe69486, 0xe693ba,
+ /* c9 */ 0xe693bb, 0xe693b7, 0xe696b7, 0xe69b9c,
+ /* cd */ 0xe69ca6, 0xe6aab3, 0xe6aaac, 0xe6ab83,
+ /* d1 */ 0xe6aabb, 0xe6aab8, 0xe6ab82, 0xe6aaae,
+ /* d5 */ 0xe6aaaf, 0xe6ad9f, 0xe6adb8, 0xe6aeaf,
+ /* d9 */ 0xe78089, 0xe7808b, 0xe6bfbe, 0xe78086,
+ /* dd */ 0xe6bfba, 0xe78091, 0xe7808f, 0xe787bb,
+ /* e1 */ 0xe787bc, 0xe787be, 0xe787b8, 0xe78db7,
+ /* e5 */ 0xe78db5, 0xe792a7, 0xe792bf, 0xe79495,
+ /* e9 */ 0xe79996, 0xe79998, 0xe79992, 0xe79ebd,
+ /* ed */ 0xe79ebf, 0xe79ebb, 0xe79ebc, 0xe7a48e,
+ /* f1 */ 0xe7a6ae, 0xe7a9a1, 0xe7a9a2, 0xe7a9a0,
+ /* f5 */ 0xe7ab84, 0xe7ab85, 0xe7b0ab, 0xe7b0a7,
+ /* f9 */ 0xe7b0aa, 0xe7b09e, 0xe7b0a3, 0xe7b0a1,
+ /* fd */ 0xe7b3a7, 0xe7b994,
+
+ /*** Two byte table, leaf: f7xx - offset 0x01607 ***/
+
+ /* a1 */ 0xe7b995, 0xe7b99e, 0xe7b99a, 0xe7b9a1,
+ /* a5 */ 0xe7b992, 0xe7b999, 0xe7bd88, 0xe7bfb9,
+ /* a9 */ 0xe7bfbb, 0xe881b7, 0xe881b6, 0xe8878d,
+ /* ad */ 0xe8878f, 0xe8888a, 0xe8978f, 0xe896a9,
+ /* b1 */ 0xe8978d, 0xe89790, 0xe89789, 0xe896b0,
+ /* b5 */ 0xe896ba, 0xe896b9, 0xe89faf, 0xe89fac,
+ /* b9 */ 0xe89fb2, 0xe89fa0, 0xe8a686, 0xe8a6b2,
+ /* bd */ 0xe8a7b4, 0xe8aca8, 0xe8acb9, 0xe8acac,
+ /* c1 */ 0xe8acab, 0xe8b190, 0xe8b485, 0xe8b999,
+ /* c5 */ 0xe8b9a3, 0xe8b9a6, 0xe8b9a4, 0xe8b99f,
+ /* c9 */ 0xe8b995, 0xe8bb80, 0xe8bd89, 0xe8bd8d,
+ /* cd */ 0xe98287, 0xe98283, 0xe98288, 0xe986ab,
+ /* d1 */ 0xe986ac, 0xe98790, 0xe98e94, 0xe98e8a,
+ /* d5 */ 0xe98e96, 0xe98ea2, 0xe98eb3, 0xe98eae,
+ /* d9 */ 0xe98eac, 0xe98eb0, 0xe98e98, 0xe98e9a,
+ /* dd */ 0xe98e97, 0xe99794, 0xe99796, 0xe99790,
+ /* e1 */ 0xe99795, 0xe99ba2, 0xe99b9c, 0xe99b99,
+ /* e5 */ 0xe99b9b, 0xe99b9e, 0xe99ca4, 0xe99ea3,
+ /* e9 */ 0xe99ea6, 0xe99ead, 0xe99fb9, 0xe9a18d,
+ /* ed */ 0xe9a18f, 0xe9a18c, 0xe9a18e, 0xe9a193,
+ /* f1 */ 0xe9a2ba, 0xe9a4be, 0xe9a4bf, 0xe9a4bd,
+ /* f5 */ 0xe9a4ae, 0xe9a6a5, 0xe9a88e, 0xe9ab81,
+ /* f9 */ 0xe9ac83, 0xe9ac86, 0xe9ad8f, 0xe9ad8e,
+ /* fd */ 0xe9ad8d, 0xe9af8a,
+
+ /*** Two byte table, leaf: f8xx - offset 0x01665 ***/
+
+ /* a1 */ 0xe9af89, 0xe9afbd, 0xe9af88, 0xe9af80,
+ /* a5 */ 0xe9b591, 0xe9b59d, 0xe9b5a0, 0xe9bba0,
+ /* a9 */ 0xe9bc95, 0xe9bcac, 0xe584b3, 0xe59aa5,
+ /* ad */ 0xe59aa8, 0xe5a39e, 0xe5a39f, 0xe5a3a2,
+ /* b1 */ 0xe5afb5, 0xe9be90, 0xe5bbac, 0xe687b2,
+ /* b5 */ 0xe687b7, 0xe687b6, 0xe687b5, 0xe69480,
+ /* b9 */ 0xe6948f, 0xe69ba0, 0xe69b9d, 0xe6aba5,
+ /* bd */ 0xe6ab9d, 0xe6ab9a, 0xe6ab93, 0xe7809b,
+ /* c1 */ 0xe7809f, 0xe780a8, 0xe7809a, 0xe7809d,
+ /* c5 */ 0xe78095, 0xe78098, 0xe78886, 0xe7888d,
+ /* c9 */ 0xe78998, 0xe78aa2, 0xe78db8, 0xe78dba,
+ /* cd */ 0xe792bd, 0xe7938a, 0xe793a3, 0xe79687,
+ /* d1 */ 0xe79686, 0xe7999f, 0xe799a1, 0xe79f87,
+ /* d5 */ 0xe7a499, 0xe7a6b1, 0xe7a9ab, 0xe7a9a9,
+ /* d9 */ 0xe7b0be, 0xe7b0bf, 0xe7b0b8, 0xe7b0bd,
+ /* dd */ 0xe7b0b7, 0xe7b180, 0xe7b9ab, 0xe7b9ad,
+ /* e1 */ 0xe7b9b9, 0xe7b9a9, 0xe7b9aa, 0xe7b9b3,
+ /* e5 */ 0xe7be85, 0xe7beb6, 0xe7beb9, 0xe7beb8,
+ /* e9 */ 0xe88798, 0xe897a9, 0xe8979d, 0xe897aa,
+ /* ed */ 0xe89795, 0xe897a4, 0xe897a5, 0xe897b7,
+ /* f1 */ 0xe89fbb, 0xe8a085, 0xe8a08d, 0xe89fb9,
+ /* f5 */ 0xe89fbe, 0xe8a5a0, 0xe8a59f, 0xe8a596,
+ /* f9 */ 0xe8a59e, 0xe8ad81, 0xe8ad9c, 0xe8ad98,
+ /* fd */ 0xe8ad89, 0xe8ad9a,
+
+ /*** Two byte table, leaf: f9xx - offset 0x016c3 ***/
+
+ /* a1 */ 0xe8ad8e, 0xe8ad8f, 0xe8ad86, 0xe8ad99,
+ /* a5 */ 0xe8b488, 0xe8b48a, 0xe8b9bc, 0xe8b9b2,
+ /* a9 */ 0xe8ba87, 0xe8b9b6, 0xe8b9ac, 0xe8b9ba,
+ /* ad */ 0xe8b9b4, 0xe8bd94, 0xe8bd8e, 0xe8bead,
+ /* b1 */ 0xe9828a, 0xe9828b, 0xe986b1, 0xe986ae,
+ /* b5 */ 0xe98fa1, 0xe98f91, 0xe98f9f, 0xe98f83,
+ /* b9 */ 0xe98f88, 0xe98f9c, 0xe98f9d, 0xe98f96,
+ /* bd */ 0xe98fa2, 0xe98f8d, 0xe98f98, 0xe98fa4,
+ /* c1 */ 0xe98f97, 0xe98fa8, 0xe9979c, 0xe99ab4,
+ /* c5 */ 0xe99ba3, 0xe99caa, 0xe99ca7, 0xe99da1,
+ /* c9 */ 0xe99f9c, 0xe99fbb, 0xe9a19e, 0xe9a198,
+ /* cd */ 0xe9a19b, 0xe9a2bc, 0xe9a585, 0xe9a589,
+ /* d1 */ 0xe9a896, 0xe9a899, 0xe9ac8d, 0xe9afa8,
+ /* d5 */ 0xe9afa7, 0xe9af96, 0xe9af9b, 0xe9b689,
+ /* d9 */ 0xe9b5a1, 0xe9b5b2, 0xe9b5aa, 0xe9b5ac,
+ /* dd */ 0xe9ba92, 0xe9ba97, 0xe9ba93, 0xe9bab4,
+ /* e1 */ 0xe58bb8, 0xe59ab7, 0xe59ab6, 0xe59ab4,
+ /* e5 */ 0xe59abc, 0xe5a3a4, 0xe5ad80, 0xe5ad83,
+ /* e9 */ 0xe5adbd, 0xe5afb6, 0xe5b789, 0xe687b8,
+ /* ed */ 0xe687ba, 0xe69498, 0xe69494, 0xe69499,
+ /* f1 */ 0xe69ba6, 0xe69ca7, 0xe6abac, 0xe780be,
+ /* f5 */ 0xe780b0, 0xe780b2, 0xe78890, 0xe78dbb,
+ /* f9 */ 0xe7938f, 0xe799a2, 0xe799a5, 0xe7a4a6,
+ /* fd */ 0xe7a4aa, 0xe7a4ac,
+
+ /*** Two byte table, leaf: faxx - offset 0x01721 ***/
+
+ /* a1 */ 0xe7a4ab, 0xe7ab87, 0xe7abb6, 0xe7b18c,
+ /* a5 */ 0xe7b183, 0xe7b18d, 0xe7b3af, 0xe7b3b0,
+ /* a9 */ 0xe8beae, 0xe7b9bd, 0xe7b9bc, 0xe7ba82,
+ /* ad */ 0xe7bd8c, 0xe88080, 0xe8879a, 0xe889a6,
+ /* b1 */ 0xe897bb, 0xe897b9, 0xe89891, 0xe897ba,
+ /* b5 */ 0xe89886, 0xe8988b, 0xe89887, 0xe8988a,
+ /* b9 */ 0xe8a094, 0xe8a095, 0xe8a5a4, 0xe8a6ba,
+ /* bd */ 0xe8a7b8, 0xe8adb0, 0xe8adac, 0xe8ada6,
+ /* c1 */ 0xe8adaf, 0xe8ad9f, 0xe8adab, 0xe8b48f,
+ /* c5 */ 0xe8b48d, 0xe8ba89, 0xe8ba81, 0xe8ba85,
+ /* c9 */ 0xe8ba82, 0xe986b4, 0xe9878b, 0xe99098,
+ /* cd */ 0xe99083, 0xe98fbd, 0xe997a1, 0xe99cb0,
+ /* d1 */ 0xe9a384, 0xe9a592, 0xe9a591, 0xe9a6a8,
+ /* d5 */ 0xe9a8ab, 0xe9a8b0, 0xe9a8b7, 0xe9a8b5,
+ /* d9 */ 0xe9b093, 0xe9b08d, 0xe9b9b9, 0xe9bab5,
+ /* dd */ 0xe9bba8, 0xe9bcaf, 0xe9bd9f, 0xe9bda3,
+ /* e1 */ 0xe9bda1, 0xe584b7, 0xe584b8, 0xe59b81,
+ /* e5 */ 0xe59b80, 0xe59b82, 0xe5a494, 0xe5b1ac,
+ /* e9 */ 0xe5b78d, 0xe687bc, 0xe687be, 0xe6949d,
+ /* ed */ 0xe6949c, 0xe69695, 0xe69ba9, 0xe6abbb,
+ /* f1 */ 0xe6ac84, 0xe6abba, 0xe6aeb2, 0xe7818c,
+ /* f5 */ 0xe7889b, 0xe78aa7, 0xe79396, 0xe79394,
+ /* f9 */ 0xe799a9, 0xe79f93, 0xe7b190, 0xe7ba8f,
+ /* fd */ 0xe7ba8c, 0xe7bebc,
+
+ /*** Two byte table, leaf: fbxx - offset 0x0177f ***/
+
+ /* a1 */ 0xe89897, 0xe898ad, 0xe8989a, 0xe8a0a3,
+ /* a5 */ 0xe8a0a2, 0xe8a0a1, 0xe8a09f, 0xe8a5aa,
+ /* a9 */ 0xe8a5ac, 0xe8a6bd, 0xe8adb4, 0xe8adb7,
+ /* ad */ 0xe8adbd, 0xe8b493, 0xe8ba8a, 0xe8ba8d,
+ /* b1 */ 0xe8ba8b, 0xe8bd9f, 0xe8beaf, 0xe986ba,
+ /* b5 */ 0xe990ae, 0xe990b3, 0xe990b5, 0xe990ba,
+ /* b9 */ 0xe990b8, 0xe990b2, 0xe990ab, 0xe997a2,
+ /* bd */ 0xe99cb8, 0xe99cb9, 0xe99cb2, 0xe99fbf,
+ /* c1 */ 0xe9a1a7, 0xe9a1a5, 0xe9a597, 0xe9a985,
+ /* c5 */ 0xe9a983, 0xe9a980, 0xe9a8be, 0xe9ab8f,
+ /* c9 */ 0xe9ad94, 0xe9ad91, 0xe9b0ad, 0xe9b0a5,
+ /* cd */ 0xe9b6af, 0xe9b6b4, 0xe9b782, 0xe9b6b8,
+ /* d1 */ 0xe9ba9d, 0xe9bbaf, 0xe9bc99, 0xe9bd9c,
+ /* d5 */ 0xe9bda6, 0xe9bda7, 0xe584bc, 0xe584bb,
+ /* d9 */ 0xe59b88, 0xe59b8a, 0xe59b89, 0xe5adbf,
+ /* dd */ 0xe5b794, 0xe5b792, 0xe5bd8e, 0xe687bf,
+ /* e1 */ 0xe694a4, 0xe6ac8a, 0xe6ada1, 0xe78191,
+ /* e5 */ 0xe78198, 0xe78e80, 0xe793a4, 0xe7968a,
+ /* e9 */ 0xe799ae, 0xe799ac, 0xe7a6b3, 0xe7b1a0,
+ /* ed */ 0xe7b19f, 0xe881be, 0xe881bd, 0xe8879f,
+ /* f1 */ 0xe8a5b2, 0xe8a5af, 0xe8a7bc, 0xe8ae80,
+ /* f5 */ 0xe8b496, 0xe8b497, 0xe8ba91, 0xe8ba93,
+ /* f9 */ 0xe8bda1, 0xe98588, 0xe99184, 0xe99191,
+ /* fd */ 0xe99192, 0xe99cbd,
+
+ /*** Two byte table, leaf: fcxx - offset 0x017dd ***/
+
+ /* a1 */ 0xe99cbe, 0xe99f83, 0xe99f81, 0xe9a1ab,
+ /* a5 */ 0xe9a595, 0xe9a995, 0xe9a98d, 0xe9ab92,
+ /* a9 */ 0xe9ac9a, 0xe9b189, 0xe9b0b1, 0xe9b0be,
+ /* ad */ 0xe9b0bb, 0xe9b793, 0xe9b797, 0xe9bcb4,
+ /* b1 */ 0xe9bdac, 0xe9bdaa, 0xe9be94, 0xe59b8c,
+ /* b5 */ 0xe5b796, 0xe68880, 0xe694a3, 0xe694ab,
+ /* b9 */ 0xe694aa, 0xe69bac, 0xe6ac90, 0xe7939a,
+ /* bd */ 0xe7ab8a, 0xe7b1a4, 0xe7b1a3, 0xe7b1a5,
+ /* c1 */ 0xe7ba93, 0xe7ba96, 0xe7ba94, 0xe887a2,
+ /* c5 */ 0xe898b8, 0xe898bf, 0xe8a0b1, 0xe8ae8a,
+ /* c9 */ 0xe98290, 0xe9828f, 0xe991a3, 0xe991a0,
+ /* cd */ 0xe991a4, 0xe99da8, 0xe9a1af, 0xe9a59c,
+ /* d1 */ 0xe9a99a, 0xe9a99b, 0xe9a997, 0xe9ab93,
+ /* d5 */ 0xe9ab94, 0xe9ab91, 0xe9b194, 0xe9b197,
+ /* d9 */ 0xe9b196, 0xe9b7a5, 0xe9ba9f, 0xe9bbb4,
+ /* dd */ 0xe59b91, 0xe5a3a9, 0xe694ac, 0xe7819e,
+ /* e1 */ 0xe799b1, 0xe799b2, 0xe79f97, 0xe7bd90,
+ /* e5 */ 0xe7be88, 0xe8a0b6, 0xe8a0b9, 0xe8a1a2,
+ /* e9 */ 0xe8ae93, 0xe8ae92, 0xe8ae96, 0xe889b7,
+ /* ed */ 0xe8b49b, 0xe98780, 0xe991aa, 0xe99d82,
+ /* f1 */ 0xe99d88, 0xe99d84, 0xe99f86, 0xe9a1b0,
+ /* f5 */ 0xe9a99f, 0xe9aca2, 0xe9ad98, 0xe9b19f,
+ /* f9 */ 0xe9b7b9, 0xe9b7ba, 0xe9b9bc, 0xe9b9bd,
+ /* fd */ 0xe9bc87, 0xe9bdb7,
+
+ /*** Two byte table, leaf: fdxx - offset 0x0183b ***/
+
+ /* a1 */ 0xe9bdb2, 0xe5bbb3, 0xe6ac96, 0xe781a3,
+ /* a5 */ 0xe7b1ac, 0xe7b1ae, 0xe8a0bb, 0xe8a780,
+ /* a9 */ 0xe8baa1, 0xe98781, 0xe991b2, 0xe991b0,
+ /* ad */ 0xe9a1b1, 0xe9a59e, 0xe9ab96, 0xe9aca3,
+ /* b1 */ 0xe9bb8c, 0xe781a4, 0xe79f9a, 0xe8ae9a,
+ /* b5 */ 0xe991b7, 0xe99f89, 0xe9a9a2, 0xe9a9a5,
+ /* b9 */ 0xe7ba9c, 0xe8ae9c, 0xe8baaa, 0xe98785,
+ /* bd */ 0xe991bd, 0xe991be, 0xe991bc, 0xe9b1b7,
+ /* c1 */ 0xe9b1b8, 0xe9bbb7, 0xe8b194, 0xe991bf,
+ /* c5 */ 0xe9b89a, 0xe788a8, 0xe9a9aa, 0xe9acb1,
+ /* c9 */ 0xe9b89b, 0xe9b89e, 0xe7b1b2, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, byte #1: xx - offset 0x01899 ***/
+
+ /* 8e */ 0x00189a,
+
+ /*** Four byte table, byte #2: 8exx - offset 0x0189a ***/
+
+ /* a1 */ 0x0018a8, 0x001905, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x001962,
+
+ /*** Four byte table, byte #3: 8ea1xx - offset 0x018a8 ***/
+
+ /* a1 */ 0x0019bf, 0x001a1d, 0x001a7b, 0x001ad9,
+ /* a5 */ 0x001b37, 0x001b95, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x001bf3, 0x000000, 0x001c51,
+ /* c5 */ 0x001caf, 0x001d0d, 0x001d6b, 0x001dc9,
+ /* c9 */ 0x001e27, 0x001e85, 0x001ee3, 0x001f41,
+ /* cd */ 0x001f9f, 0x001ffd, 0x00205b, 0x0020b9,
+ /* d1 */ 0x002117, 0x002175, 0x0021d3, 0x002231,
+ /* d5 */ 0x00228f, 0x0022ed, 0x00234b, 0x0023a9,
+ /* d9 */ 0x002407, 0x002465, 0x0024c3, 0x002521,
+ /* dd */ 0x00257f, 0x0025dd, 0x00263b, 0x002699,
+ /* e1 */ 0x0026f7, 0x002755, 0x0027b3, 0x002811,
+ /* e5 */ 0x00286f, 0x0028cd, 0x00292b, 0x002989,
+ /* e9 */ 0x0029e7, 0x002a45, 0x002aa3, 0x002b01,
+ /* ed */ 0x002b5f, 0x002bbd, 0x002c1b, 0x002c79,
+ /* f1 */ 0x002cd7, 0x002d35, 0x002d93, 0x002df1,
+ /* f5 */ 0x002e4f, 0x002ead, 0x002f0b, 0x002f69,
+ /* f9 */ 0x002fc7, 0x003025, 0x003083, 0x0030e1,
+ /* fd */ 0x00313f,
+
+ /*** Four byte table, byte #3: 8ea2xx - offset 0x01905 ***/
+
+ /* a1 */ 0x00319d, 0x0031fb, 0x003259, 0x0032b7,
+ /* a5 */ 0x003315, 0x003373, 0x0033d1, 0x00342f,
+ /* a9 */ 0x00348d, 0x0034eb, 0x003549, 0x0035a7,
+ /* ad */ 0x003605, 0x003663, 0x0036c1, 0x00371f,
+ /* b1 */ 0x00377d, 0x0037db, 0x003839, 0x003897,
+ /* b5 */ 0x0038f5, 0x003953, 0x0039b1, 0x003a0f,
+ /* b9 */ 0x003a6d, 0x003acb, 0x003b29, 0x003b87,
+ /* bd */ 0x003be5, 0x003c43, 0x003ca1, 0x003cff,
+ /* c1 */ 0x003d5d, 0x003dbb, 0x003e19, 0x003e77,
+ /* c5 */ 0x003ed5, 0x003f33, 0x003f91, 0x003fef,
+ /* c9 */ 0x00404d, 0x0040ab, 0x004109, 0x004167,
+ /* cd */ 0x0041c5, 0x004223, 0x004281, 0x0042df,
+ /* d1 */ 0x00433d, 0x00439b, 0x0043f9, 0x004457,
+ /* d5 */ 0x0044b5, 0x004513, 0x004571, 0x0045cf,
+ /* d9 */ 0x00462d, 0x00468b, 0x0046e9, 0x004747,
+ /* dd */ 0x0047a5, 0x004803, 0x004861, 0x0048bf,
+ /* e1 */ 0x00491d, 0x00497b, 0x0049d9, 0x004a37,
+ /* e5 */ 0x004a95, 0x004af3, 0x004b51, 0x004baf,
+ /* e9 */ 0x004c0d, 0x004c6b, 0x004cc9, 0x004d27,
+ /* ed */ 0x004d85, 0x004de3, 0x004e41, 0x004e9f,
+ /* f1 */ 0x004efd, 0x004f5b, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000,
+
+ /*** Four byte table, byte #3: 8eaexx - offset 0x01962 ***/
+
+ /* a1 */ 0x004fb9, 0x005016, 0x005074, 0x0050d2,
+ /* a5 */ 0x005130, 0x00518e, 0x0051ec, 0x00524a,
+ /* a9 */ 0x0052a8, 0x005306, 0x005364, 0x0053c2,
+ /* ad */ 0x005420, 0x00547e, 0x0054dc, 0x00553a,
+ /* b1 */ 0x005598, 0x0055f6, 0x005652, 0x0056ae,
+ /* b5 */ 0x00570b, 0x005768, 0x0057c6, 0x005824,
+ /* b9 */ 0x005882, 0x0058e0, 0x00593e, 0x00599c,
+ /* bd */ 0x0059fa, 0x005a58, 0x005ab6, 0x005b14,
+ /* c1 */ 0x005b72, 0x005bd0, 0x005c2e, 0x005c8c,
+ /* c5 */ 0x005cea, 0x005d48, 0x005da6, 0x005e04,
+ /* c9 */ 0x005e61, 0x005ebf, 0x005f1c, 0x005f7a,
+ /* cd */ 0x005fd8, 0x006036, 0x006094, 0x0060f2,
+ /* d1 */ 0x006150, 0x0061ae, 0x00620c, 0x00626a,
+ /* d5 */ 0x0062c8, 0x006326, 0x006381, 0x0063df,
+ /* d9 */ 0x00643d, 0x00649b, 0x0064f9, 0x006557,
+ /* dd */ 0x0065b5, 0x006613, 0x006671, 0x0066cf,
+ /* e1 */ 0x00672d, 0x00678b, 0x0067e7, 0x006844,
+ /* e5 */ 0x0068a2, 0x006900, 0x00695e, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000,
+
+ /*** Four byte table, leaf: 8ea1a1xx - offset 0x019bf ***/
+
+ /* a1 */ 0xe38080, 0xefbc8c, 0xe38081, 0xe38082,
+ /* a5 */ 0xefbc8e, 0xe383bb, 0xefbc9b, 0xefbc9a,
+ /* a9 */ 0xefbc9f, 0xefbc81, 0xefb8b0, 0xe280a6,
+ /* ad */ 0xe280a5, 0xefb990, 0xefb991, 0xefb992,
+ /* b1 */ 0x00c2b7, 0xefb994, 0xefb995, 0xefb996,
+ /* b5 */ 0xefb997, 0xefb8b1, 0xe28094, 0xefb8b2,
+ /* b9 */ 0xe28093, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0xefbc88, 0xefbc89, 0xefb8b5,
+ /* c1 */ 0xefb8b6, 0xefbd9b, 0xefbd9d, 0xefb8b7,
+ /* c5 */ 0xefb8b8, 0xe38094, 0xe38095, 0xefb8b9,
+ /* c9 */ 0xefb8ba, 0xe38090, 0xe38091, 0xefb8bb,
+ /* cd */ 0xefb8bc, 0xe3808a, 0xe3808b, 0xefb8bd,
+ /* d1 */ 0xefb8be, 0xe38088, 0xe38089, 0xefb8bf,
+ /* d5 */ 0xefb980, 0xe3808c, 0xe3808d, 0xefb981,
+ /* d9 */ 0xefb982, 0xe3808e, 0xe3808f, 0xefb983,
+ /* dd */ 0xefb984, 0xefb999, 0xefb99a, 0xefb99b,
+ /* e1 */ 0xefb99c, 0xefb99d, 0xefb99e, 0xe28098,
+ /* e5 */ 0xe28099, 0xe2809c, 0xe2809d, 0xe3809d,
+ /* e9 */ 0xe3809e, 0xe280b2, 0xe280b5, 0xefbc83,
+ /* ed */ 0xefbc86, 0xefbc8a, 0xe280bb, 0x00c2a7,
+ /* f1 */ 0xe38083, 0xe2978b, 0xe2978f, 0xe296b3,
+ /* f5 */ 0xe296b2, 0xe2978e, 0xe29886, 0xe29885,
+ /* f9 */ 0xe29787, 0xe29786, 0xe296a1, 0xe296a0,
+ /* fd */ 0xe296bd, 0xe296bc,
+
+ /*** Four byte table, leaf: 8ea1a2xx - offset 0x01a1d ***/
+
+ /* a1 */ 0xe38aa3, 0xe28485, 0xe280be, 0x000000,
+ /* a5 */ 0xefbcbf, 0x000000, 0xefb989, 0xefb98a,
+ /* a9 */ 0xefb98d, 0xefb98e, 0xefb98b, 0xefb98c,
+ /* ad */ 0xefb99f, 0xefb9a0, 0xefb9a1, 0xefbc8b,
+ /* b1 */ 0xefbc8d, 0x00c397, 0x00c3b7, 0x00c2b1,
+ /* b5 */ 0xe2889a, 0xefbc9c, 0xefbc9e, 0xefbc9d,
+ /* b9 */ 0xe289a6, 0xe289a7, 0xe289a0, 0xe2889e,
+ /* bd */ 0xe28992, 0xe289a1, 0xefb9a2, 0xefb9a3,
+ /* c1 */ 0xefb9a4, 0xefb9a6, 0xefb9a5, 0xe288bc,
+ /* c5 */ 0xe288a9, 0xe288aa, 0xe28aa5, 0xe288a0,
+ /* c9 */ 0xe2889f, 0xe28abf, 0xe38f92, 0xe38f91,
+ /* cd */ 0xe288ab, 0xe288ae, 0xe288b5, 0xe288b4,
+ /* d1 */ 0xe29980, 0xe29982, 0xe29981, 0xe29889,
+ /* d5 */ 0xe28691, 0xe28693, 0xe28692, 0xe28690,
+ /* d9 */ 0xe28696, 0xe28697, 0xe28699, 0xe28698,
+ /* dd */ 0xe28096, 0xefbd9c, 0xefbc8f, 0xefbcbc,
+ /* e1 */ 0xe28895, 0xefb9a8, 0xefbc84, 0xefbfa5,
+ /* e5 */ 0xe38092, 0xefbfa0, 0xefbfa1, 0xefbc85,
+ /* e9 */ 0xefbca0, 0xe28483, 0xe28489, 0xefb9a9,
+ /* ed */ 0xefb9aa, 0xefb9ab, 0xe38f95, 0xe38e9c,
+ /* f1 */ 0xe38e9d, 0xe38e9e, 0xe38f8e, 0xe38ea1,
+ /* f5 */ 0xe38e8e, 0xe38e8f, 0xe38f84, 0x00c2b0,
+ /* f9 */ 0xe58599, 0xe5859b, 0xe5859e, 0xe5859d,
+ /* fd */ 0xe585a1, 0xe585a3,
+
+ /*** Four byte table, leaf: 8ea1a3xx - offset 0x01a7b ***/
+
+ /* a1 */ 0xe597a7, 0xe793a9, 0xe7b38e, 0xe29681,
+ /* a5 */ 0xe29682, 0xe29683, 0xe29684, 0xe29685,
+ /* a9 */ 0xe29686, 0xe29687, 0xe29688, 0xe2968f,
+ /* ad */ 0xe2968e, 0xe2968d, 0xe2968c, 0xe2968b,
+ /* b1 */ 0xe2968a, 0xe29689, 0xe294bc, 0xe294b4,
+ /* b5 */ 0xe294ac, 0xe294a4, 0xe2949c, 0xe29694,
+ /* b9 */ 0xe29480, 0xe29482, 0xe29695, 0xe2948c,
+ /* bd */ 0xe29490, 0xe29494, 0xe29498, 0xe295ad,
+ /* c1 */ 0xe295ae, 0xe295b0, 0xe295af, 0xe29590,
+ /* c5 */ 0xe2959e, 0xe295aa, 0xe295a1, 0xe297a2,
+ /* c9 */ 0xe297a3, 0xe297a5, 0xe297a4, 0xe295b1,
+ /* cd */ 0xe295b2, 0xe295b3, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8ea1a4xx - offset 0x01ad9 ***/
+
+ /* a1 */ 0xefbc90, 0xefbc91, 0xefbc92, 0xefbc93,
+ /* a5 */ 0xefbc94, 0xefbc95, 0xefbc96, 0xefbc97,
+ /* a9 */ 0xefbc98, 0xefbc99, 0xe285a0, 0xe285a1,
+ /* ad */ 0xe285a2, 0xe285a3, 0xe285a4, 0xe285a5,
+ /* b1 */ 0xe285a6, 0xe285a7, 0xe285a8, 0xe285a9,
+ /* b5 */ 0xe380a1, 0xe380a2, 0xe380a3, 0xe380a4,
+ /* b9 */ 0xe380a5, 0xe380a6, 0xe380a7, 0xe380a8,
+ /* bd */ 0xe380a9, 0x000000, 0xe58d84, 0x000000,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0xefbd81, 0xefbd82,
+ /* dd */ 0xefbd83, 0xefbd84, 0xefbd85, 0xefbd86,
+ /* e1 */ 0xefbd87, 0xefbd88, 0xefbd89, 0xefbd8a,
+ /* e5 */ 0xefbd8b, 0xefbd8c, 0xefbd8d, 0xefbd8e,
+ /* e9 */ 0xefbd8f, 0xefbd90, 0xefbd91, 0xefbd92,
+ /* ed */ 0xefbd93, 0xefbd94, 0xefbd95, 0xefbd96,
+ /* f1 */ 0xefbd97, 0xefbd98, 0xefbd99, 0xefbd9a,
+ /* f5 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* f9 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* fd */ 0x00ce99, 0x00ce9a,
+
+ /*** Four byte table, leaf: 8ea1a5xx - offset 0x01b37 ***/
+
+ /* a1 */ 0x00ce9b, 0x00ce9c, 0x00ce9d, 0x00ce9e,
+ /* a5 */ 0x00ce9f, 0x00cea0, 0x00cea1, 0x00cea3,
+ /* a9 */ 0x00cea4, 0x00cea5, 0x00cea6, 0x00cea7,
+ /* ad */ 0x00cea8, 0x00cea9, 0x00ceb1, 0x00ceb2,
+ /* b1 */ 0x00ceb3, 0x00ceb4, 0x00ceb5, 0x00ceb6,
+ /* b5 */ 0x00ceb7, 0x00ceb8, 0x00ceb9, 0x00ceba,
+ /* b9 */ 0x00cebb, 0x00cebc, 0x00cebd, 0x00cebe,
+ /* bd */ 0x00cebf, 0x00cf80, 0x00cf81, 0x00cf83,
+ /* c1 */ 0x00cf84, 0x00cf85, 0x00cf86, 0x00cf87,
+ /* c5 */ 0x00cf88, 0x00cf89, 0xe38485, 0xe38486,
+ /* c9 */ 0xe38487, 0xe38488, 0xe38489, 0xe3848a,
+ /* cd */ 0xe3848b, 0xe3848c, 0xe3848d, 0xe3848e,
+ /* d1 */ 0xe3848f, 0xe38490, 0xe38491, 0xe38492,
+ /* d5 */ 0xe38493, 0xe38494, 0xe38495, 0xe38496,
+ /* d9 */ 0xe38497, 0xe38498, 0xe38499, 0xe3849a,
+ /* dd */ 0xe3849b, 0xe3849c, 0xe3849d, 0xe3849e,
+ /* e1 */ 0xe3849f, 0xe384a0, 0xe384a1, 0xe384a2,
+ /* e5 */ 0xe384a3, 0xe384a4, 0xe384a5, 0xe384a6,
+ /* e9 */ 0xe384a7, 0xe384a8, 0xe384a9, 0x00cb99,
+ /* ed */ 0x00cb89, 0x00cb8a, 0x00cb87, 0x00cb8b,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8ea1a6xx - offset 0x01b95 ***/
+
+ /* a1 */ 0xe291a0, 0xe291a1, 0xe291a2, 0xe291a3,
+ /* a5 */ 0xe291a4, 0xe291a5, 0xe291a6, 0xe291a7,
+ /* a9 */ 0xe291a8, 0xe291a9, 0xe291b4, 0xe291b5,
+ /* ad */ 0xe291b6, 0xe291b7, 0xe291b8, 0xe291b9,
+ /* b1 */ 0xe291ba, 0xe291bb, 0xe291bc, 0xe291bd,
+ /* b5 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* b9 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* bd */ 0xe285b8, 0xe285b9, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8ea1c2xx - offset 0x01bf3 ***/
+
+ /* a1 */ 0xe29080, 0xe29081, 0xe29082, 0xe29083,
+ /* a5 */ 0xe29084, 0xe29085, 0xe29086, 0xe29087,
+ /* a9 */ 0xe29088, 0xe29089, 0xe2908a, 0xe2908b,
+ /* ad */ 0xe2908c, 0xe2908d, 0xe2908e, 0xe2908f,
+ /* b1 */ 0xe29090, 0xe29091, 0xe29092, 0xe29093,
+ /* b5 */ 0xe29094, 0xe29095, 0xe29096, 0xe29097,
+ /* b9 */ 0xe29098, 0xe29099, 0xe2909a, 0xe2909b,
+ /* bd */ 0xe2909c, 0xe2909d, 0xe2909e, 0xe2909f,
+ /* c1 */ 0xe290a1, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8ea1c4xx - offset 0x01c51 ***/
+
+ /* a1 */ 0xe4b880, 0xe4b999, 0xe4b881, 0xe4b883,
+ /* a5 */ 0xe4b983, 0xe4b99d, 0xe4ba86, 0xe4ba8c,
+ /* a9 */ 0xe4baba, 0xe584bf, 0xe585a5, 0xe585ab,
+ /* ad */ 0xe587a0, 0xe58880, 0xe58881, 0xe58a9b,
+ /* b1 */ 0xe58c95, 0xe58d81, 0xe58d9c, 0xe58f88,
+ /* b5 */ 0xe4b889, 0xe4b88b, 0xe4b888, 0xe4b88a,
+ /* b9 */ 0xe4b8ab, 0xe4b8b8, 0xe587a1, 0xe4b985,
+ /* bd */ 0xe4b988, 0xe4b99f, 0xe4b99e, 0xe4ba8e,
+ /* c1 */ 0xe4baa1, 0xe58580, 0xe58883, 0xe58bba,
+ /* c5 */ 0xe58d83, 0xe58f89, 0xe58fa3, 0xe59c9f,
+ /* c9 */ 0xe5a3ab, 0xe5a495, 0xe5a4a7, 0xe5a5b3,
+ /* cd */ 0xe5ad90, 0xe5ad91, 0xe5ad93, 0xe5afb8,
+ /* d1 */ 0xe5b08f, 0xe5b0a2, 0xe5b0b8, 0xe5b1b1,
+ /* d5 */ 0xe5b79d, 0xe5b7a5, 0xe5b7b1, 0xe5b7b2,
+ /* d9 */ 0xe5b7b3, 0xe5b7be, 0xe5b9b2, 0xe5bbbe,
+ /* dd */ 0xe5bc8b, 0xe5bc93, 0xe6898d, 0xe4b891,
+ /* e1 */ 0xe4b890, 0xe4b88d, 0xe4b8ad, 0xe4b8b0,
+ /* e5 */ 0xe4b8b9, 0xe4b98b, 0xe5b0b9, 0xe4ba88,
+ /* e9 */ 0xe4ba91, 0xe4ba95, 0xe4ba92, 0xe4ba94,
+ /* ed */ 0xe4baa2, 0xe4bb81, 0xe4bb80, 0xe4bb83,
+ /* f1 */ 0xe4bb86, 0xe4bb87, 0xe4bb8d, 0xe4bb8a,
+ /* f5 */ 0xe4bb8b, 0xe4bb84, 0xe58583, 0xe58581,
+ /* f9 */ 0xe585a7, 0xe585ad, 0xe585ae, 0xe585ac,
+ /* fd */ 0xe58697, 0xe587b6,
+
+ /*** Four byte table, leaf: 8ea1c5xx - offset 0x01caf ***/
+
+ /* a1 */ 0xe58886, 0xe58887, 0xe58888, 0xe58bbb,
+ /* a5 */ 0xe58bbe, 0xe58bbf, 0xe58c96, 0xe58cb9,
+ /* a9 */ 0xe58d88, 0xe58d87, 0xe58d85, 0xe58d9e,
+ /* ad */ 0xe58e84, 0xe58f8b, 0xe58f8a, 0xe58f8d,
+ /* b1 */ 0xe5a3ac, 0xe5a4a9, 0xe5a4ab, 0xe5a4aa,
+ /* b5 */ 0xe5a4ad, 0xe5ad94, 0xe5b091, 0xe5b0a4,
+ /* b9 */ 0xe5b0ba, 0xe5b1af, 0xe5b7b4, 0xe5b9bb,
+ /* bd */ 0xe5bbbf, 0xe5bc94, 0xe5bc95, 0xe5bf83,
+ /* c1 */ 0xe68888, 0xe688b6, 0xe6898b, 0xe6898e,
+ /* c5 */ 0xe694af, 0xe69687, 0xe69697, 0xe696a4,
+ /* c9 */ 0xe696b9, 0xe697a5, 0xe69bb0, 0xe69c88,
+ /* cd */ 0xe69ca8, 0xe6aca0, 0xe6ada2, 0xe6adb9,
+ /* d1 */ 0xe6af8b, 0xe6af94, 0xe6af9b, 0xe6b08f,
+ /* d5 */ 0xe6b0b4, 0xe781ab, 0xe788aa, 0xe788b6,
+ /* d9 */ 0xe788bb, 0xe78987, 0xe78999, 0xe7899b,
+ /* dd */ 0xe78aac, 0xe78e8b, 0xe4b899, 0xe4b896,
+ /* e1 */ 0xe4b895, 0xe4b894, 0xe4b898, 0xe4b8bb,
+ /* e5 */ 0xe4b98d, 0xe4b98f, 0xe4b98e, 0xe4bba5,
+ /* e9 */ 0xe4bb98, 0xe4bb94, 0xe4bb95, 0xe4bb96,
+ /* ed */ 0xe4bb97, 0xe4bba3, 0xe4bba4, 0xe4bb99,
+ /* f1 */ 0xe4bb9e, 0xe58585, 0xe58584, 0xe58689,
+ /* f5 */ 0xe5868a, 0xe586ac, 0xe587b9, 0xe587ba,
+ /* f9 */ 0xe587b8, 0xe5888a, 0xe58aa0, 0xe58a9f,
+ /* fd */ 0xe58c85, 0xe58c86,
+
+ /*** Four byte table, leaf: 8ea1c6xx - offset 0x01d0d ***/
+
+ /* a1 */ 0xe58c97, 0xe58c9d, 0xe4bb9f, 0xe58d8a,
+ /* a5 */ 0xe58d89, 0xe58da1, 0xe58da0, 0xe58daf,
+ /* a9 */ 0xe58dae, 0xe58ebb, 0xe58faf, 0xe58fa4,
+ /* ad */ 0xe58fb3, 0xe58fac, 0xe58fae, 0xe58fa9,
+ /* b1 */ 0xe58fa8, 0xe58fbc, 0xe58fb8, 0xe58fb5,
+ /* b5 */ 0xe58fab, 0xe58fa6, 0xe58faa, 0xe58fb2,
+ /* b9 */ 0xe58fb1, 0xe58fb0, 0xe58fa5, 0xe58fad,
+ /* bd */ 0xe58fbb, 0xe59b9b, 0xe59b9a, 0xe5a496,
+ /* c1 */ 0xe5a4ae, 0xe5a4b1, 0xe5a5b4, 0xe5a5b6,
+ /* c5 */ 0xe5ad95, 0xe5ae83, 0xe5b0bc, 0xe5b7a8,
+ /* c9 */ 0xe5b7a7, 0xe5b7a6, 0xe5b882, 0xe5b883,
+ /* cd */ 0xe5b9b3, 0xe5b9bc, 0xe5bc81, 0xe5bc98,
+ /* d1 */ 0xe5bc97, 0xe5bf85, 0xe6888a, 0xe68993,
+ /* d5 */ 0xe68994, 0xe68992, 0xe68991, 0xe696a5,
+ /* d9 */ 0xe697a6, 0xe69cae, 0xe69cac, 0xe69caa,
+ /* dd */ 0xe69cab, 0xe69cad, 0xe6ada3, 0xe6af8d,
+ /* e1 */ 0xe6b091, 0xe6b090, 0xe6b0b8, 0xe6b181,
+ /* e5 */ 0xe6b180, 0xe6b0be, 0xe78aaf, 0xe78e84,
+ /* e9 */ 0xe78e89, 0xe7939c, 0xe793a6, 0xe79498,
+ /* ed */ 0xe7949f, 0xe794a8, 0xe794a9, 0xe794b0,
+ /* f1 */ 0xe794b1, 0xe794b2, 0xe794b3, 0xe7968b,
+ /* f5 */ 0xe799bd, 0xe79aae, 0xe79abf, 0xe79bae,
+ /* f9 */ 0xe79f9b, 0xe79fa2, 0xe79fb3, 0xe7a4ba,
+ /* fd */ 0xe7a6be, 0xe7a9b4,
+
+ /*** Four byte table, leaf: 8ea1c7xx - offset 0x01d6b ***/
+
+ /* a1 */ 0xe7ab8b, 0xe4b89e, 0xe4b89f, 0xe4b992,
+ /* a5 */ 0xe4b993, 0xe4b9a9, 0xe4ba99, 0xe4baa4,
+ /* a9 */ 0xe4baa6, 0xe4baa5, 0xe4bbbf, 0xe4bc89,
+ /* ad */ 0xe4bc99, 0xe4bc8a, 0xe4bc95, 0xe4bc8d,
+ /* b1 */ 0xe4bc90, 0xe4bc91, 0xe4bc8f, 0xe4bbb2,
+ /* b5 */ 0xe4bbb6, 0xe4bbbb, 0xe4bbb0, 0xe4bbb3,
+ /* b9 */ 0xe4bbbd, 0xe4bc81, 0xe4bc8b, 0xe58589,
+ /* bd */ 0xe58587, 0xe58586, 0xe58588, 0xe585a8,
+ /* c1 */ 0xe585b1, 0xe5868d, 0xe586b0, 0xe58897,
+ /* c5 */ 0xe58891, 0xe58892, 0xe5888e, 0xe58896,
+ /* c9 */ 0xe58aa3, 0xe58c88, 0xe58ca1, 0xe58ca0,
+ /* cd */ 0xe58db0, 0xe58db1, 0xe59089, 0xe5908f,
+ /* d1 */ 0xe5908c, 0xe5908a, 0xe59090, 0xe59081,
+ /* d5 */ 0xe5908b, 0xe59084, 0xe59091, 0xe5908d,
+ /* d9 */ 0xe59088, 0xe59083, 0xe5908e, 0xe59086,
+ /* dd */ 0xe59092, 0xe59ba0, 0xe59b9e, 0xe59b9d,
+ /* e1 */ 0xe59cb3, 0xe59cb0, 0xe59ca8, 0xe59cad,
+ /* e5 */ 0xe59cac, 0xe59caf, 0xe59ca9, 0xe5a499,
+ /* e9 */ 0xe5a49a, 0xe5a4b7, 0xe5a4b8, 0xe5a684,
+ /* ed */ 0xe5a5b8, 0xe5a683, 0xe5a5bd, 0xe5a5b9,
+ /* f1 */ 0xe5a682, 0xe5a681, 0xe5ad97, 0xe5ad98,
+ /* f5 */ 0xe5ae87, 0xe5ae88, 0xe5ae85, 0xe5ae89,
+ /* f9 */ 0xe5afba, 0xe5b096, 0xe5b1b9, 0xe5b79e,
+ /* fd */ 0xe5b886, 0xe5b9b6,
+
+ /*** Four byte table, leaf: 8ea1c8xx - offset 0x01dc9 ***/
+
+ /* a1 */ 0xe5b9b4, 0xe5bc8f, 0xe5bc9b, 0xe5bf99,
+ /* a5 */ 0xe5bf96, 0xe6888e, 0xe6888c, 0xe6888d,
+ /* a9 */ 0xe68890, 0xe689a3, 0xe6899b, 0xe68998,
+ /* ad */ 0xe694b6, 0xe697a9, 0xe697a8, 0xe697ac,
+ /* b1 */ 0xe697ad, 0xe69bb2, 0xe69bb3, 0xe69c89,
+ /* b5 */ 0xe69cbd, 0xe69cb4, 0xe69cb1, 0xe69cb5,
+ /* b9 */ 0xe6aca1, 0xe6ada4, 0xe6adbb, 0xe6b096,
+ /* bd */ 0xe6b19d, 0xe6b197, 0xe6b199, 0xe6b19f,
+ /* c1 */ 0xe6b1a0, 0xe6b190, 0xe6b195, 0xe6b1a1,
+ /* c5 */ 0xe6b19b, 0xe6b18d, 0xe6b18e, 0xe781b0,
+ /* c9 */ 0xe7899f, 0xe7899d, 0xe799be, 0xe7abb9,
+ /* cd */ 0xe7b1b3, 0xe7b3b8, 0xe7bcb6, 0xe7be8a,
+ /* d1 */ 0xe7bebd, 0xe88081, 0xe88083, 0xe8808c,
+ /* d5 */ 0xe88092, 0xe880b3, 0xe881bf, 0xe88289,
+ /* d9 */ 0xe8828b, 0xe8828c, 0xe887a3, 0xe887aa,
+ /* dd */ 0xe887b3, 0xe887bc, 0xe8888c, 0xe8889b,
+ /* e1 */ 0xe8889f, 0xe889ae, 0xe889b2, 0xe889be,
+ /* e5 */ 0xe899ab, 0xe8a180, 0xe8a18c, 0xe8a1a3,
+ /* e9 */ 0xe8a5bf, 0xe998a1, 0xe4b8b2, 0xe4baa8,
+ /* ed */ 0xe4bd8d, 0xe4bd8f, 0xe4bd87, 0xe4bd97,
+ /* f1 */ 0xe4bd9e, 0xe4bcb4, 0xe4bd9b, 0xe4bd95,
+ /* f5 */ 0xe4bcb0, 0xe4bd90, 0xe4bd91, 0xe4bcbd,
+ /* f9 */ 0xe4bcba, 0xe4bcb8, 0xe4bd83, 0xe4bd94,
+ /* fd */ 0xe4bcbc, 0xe4bd86,
+
+ /*** Four byte table, leaf: 8ea1c9xx - offset 0x01e27 ***/
+
+ /* a1 */ 0xe4bda3, 0xe4bd9c, 0xe4bda0, 0xe4bcaf,
+ /* a5 */ 0xe4bd8e, 0xe4bcb6, 0xe4bd99, 0xe4bd9d,
+ /* a9 */ 0xe4bd88, 0xe4bd9a, 0xe5858c, 0xe5858b,
+ /* ad */ 0xe5858d, 0xe585b5, 0xe586b6, 0xe586b7,
+ /* b1 */ 0xe588a5, 0xe588a4, 0xe588a9, 0xe588aa,
+ /* b5 */ 0xe588a8, 0xe58aab, 0xe58aa9, 0xe58aaa,
+ /* b9 */ 0xe58aac, 0xe58ca3, 0xe58db3, 0xe58db5,
+ /* bd */ 0xe5909d, 0xe590ad, 0xe5909e, 0xe590be,
+ /* c1 */ 0xe590a6, 0xe5918e, 0xe590a7, 0xe59186,
+ /* c5 */ 0xe59183, 0xe590b3, 0xe59188, 0xe59182,
+ /* c9 */ 0xe5909b, 0xe590a9, 0xe5918a, 0xe590b9,
+ /* cd */ 0xe590bb, 0xe590b8, 0xe590ae, 0xe590b5,
+ /* d1 */ 0xe590b6, 0xe590a0, 0xe590bc, 0xe59180,
+ /* d5 */ 0xe590b1, 0xe590ab, 0xe5909f, 0xe590ac,
+ /* d9 */ 0xe59baa, 0xe59bb0, 0xe59ba4, 0xe59bab,
+ /* dd */ 0xe59d8a, 0xe59d91, 0xe59d80, 0xe59d8d,
+ /* e1 */ 0xe59d87, 0xe59d8e, 0xe59cbe, 0xe59d90,
+ /* e5 */ 0xe59d8f, 0xe59cbb, 0xe5a3af, 0xe5a4be,
+ /* e9 */ 0xe5a69d, 0xe5a692, 0xe5a6a8, 0xe5a69e,
+ /* ed */ 0xe5a6a3, 0xe5a699, 0xe5a696, 0xe5a68d,
+ /* f1 */ 0xe5a6a4, 0xe5a693, 0xe5a68a, 0xe5a6a5,
+ /* f5 */ 0xe5ad9d, 0xe5ad9c, 0xe5ad9a, 0xe5ad9b,
+ /* f9 */ 0xe5ae8c, 0xe5ae8b, 0xe5ae8f, 0xe5b0ac,
+ /* fd */ 0xe5b180, 0xe5b181,
+
+ /*** Four byte table, leaf: 8ea1caxx - offset 0x01e85 ***/
+
+ /* a1 */ 0xe5b0bf, 0xe5b0be, 0xe5b290, 0xe5b291,
+ /* a5 */ 0xe5b294, 0xe5b28c, 0xe5b7ab, 0xe5b88c,
+ /* a9 */ 0xe5ba8f, 0xe5ba87, 0xe5ba8a, 0xe5bbb7,
+ /* ad */ 0xe5bc84, 0xe5bc9f, 0xe5bda4, 0xe5bda2,
+ /* b1 */ 0xe5bdb7, 0xe5bdb9, 0xe5bf98, 0xe5bf8c,
+ /* b5 */ 0xe5bf97, 0xe5bf8d, 0xe5bfb1, 0xe5bfab,
+ /* b9 */ 0xe5bfb8, 0xe5bfaa, 0xe68892, 0xe68891,
+ /* bd */ 0xe68a84, 0xe68a97, 0xe68a96, 0xe68a80,
+ /* c1 */ 0xe689b6, 0xe68a89, 0xe689ad, 0xe68a8a,
+ /* c5 */ 0xe689bc, 0xe689be, 0xe689b9, 0xe689b3,
+ /* c9 */ 0xe68a92, 0xe689af, 0xe68a98, 0xe689ae,
+ /* cd */ 0xe68a95, 0xe68a93, 0xe68a91, 0xe68a86,
+ /* d1 */ 0xe694b9, 0xe694bb, 0xe694b8, 0xe697b1,
+ /* d5 */ 0xe69bb4, 0xe69d9f, 0xe69d8e, 0xe69d8f,
+ /* d9 */ 0xe69d90, 0xe69d91, 0xe69d9c, 0xe69d96,
+ /* dd */ 0xe69d9e, 0xe69d89, 0xe69d86, 0xe69da0,
+ /* e1 */ 0xe69d93, 0xe69d97, 0xe6ada5, 0xe6af8f,
+ /* e5 */ 0xe6b182, 0xe6b19e, 0xe6b299, 0xe6b281,
+ /* e9 */ 0xe6b288, 0xe6b289, 0xe6b285, 0xe6b29b,
+ /* ed */ 0xe6b1aa, 0xe6b1ba, 0xe6b290, 0xe6b1b0,
+ /* f1 */ 0xe6b28c, 0xe6b1a8, 0xe6b296, 0xe6b292,
+ /* f5 */ 0xe6b1bd, 0xe6b283, 0xe6b1b2, 0xe6b1be,
+ /* f9 */ 0xe6b1b4, 0xe6b286, 0xe6b1b6, 0xe6b28d,
+ /* fd */ 0xe6b294, 0xe6b298,
+
+ /*** Four byte table, leaf: 8ea1cbxx - offset 0x01ee3 ***/
+
+ /* a1 */ 0xe6b282, 0xe781b6, 0xe781bc, 0xe781bd,
+ /* a5 */ 0xe781b8, 0xe789a2, 0xe789a1, 0xe789a0,
+ /* a9 */ 0xe78b84, 0xe78b82, 0xe78e96, 0xe794ac,
+ /* ad */ 0xe794ab, 0xe794b7, 0xe794b8, 0xe79a82,
+ /* b1 */ 0xe79baf, 0xe79fa3, 0xe7a781, 0xe7a780,
+ /* b5 */ 0xe7a6bf, 0xe7a9b6, 0xe7b3bb, 0xe7bd95,
+ /* b9 */ 0xe88296, 0xe88293, 0xe8829d, 0xe88298,
+ /* bd */ 0xe8829b, 0xe8829a, 0xe882b2, 0xe889af,
+ /* c1 */ 0xe88a92, 0xe88a8b, 0xe88a8d, 0xe8a68b,
+ /* c5 */ 0xe8a792, 0xe8a880, 0xe8b0b7, 0xe8b186,
+ /* c9 */ 0xe8b195, 0xe8b29d, 0xe8b5a4, 0xe8b5b0,
+ /* cd */ 0xe8b6b3, 0xe8baab, 0xe8bb8a, 0xe8be9b,
+ /* d1 */ 0xe8beb0, 0xe8bf82, 0xe8bf86, 0xe8bf85,
+ /* d5 */ 0xe8bf84, 0xe5b7a1, 0xe98291, 0xe982a2,
+ /* d9 */ 0xe982aa, 0xe982a6, 0xe982a3, 0xe98589,
+ /* dd */ 0xe98786, 0xe9878c, 0xe998b2, 0xe998ae,
+ /* e1 */ 0xe998b1, 0xe998aa, 0xe998ac, 0xe4b8a6,
+ /* e5 */ 0xe4b996, 0xe4b9b3, 0xe4ba8b, 0xe4ba9b,
+ /* e9 */ 0xe4ba9e, 0xe4baab, 0xe4baac, 0xe4bdaf,
+ /* ed */ 0xe4be9d, 0xe4be8d, 0xe4bdb3, 0xe4bdbf,
+ /* f1 */ 0xe4bdac, 0xe4be9b, 0xe4be8b, 0xe4be86,
+ /* f5 */ 0xe4be83, 0xe4bdb0, 0xe4bdb5, 0xe4be88,
+ /* f9 */ 0xe4bda9, 0xe4bdbb, 0xe4be96, 0xe4bdbe,
+ /* fd */ 0xe4be8f, 0xe4be91,
+
+ /*** Four byte table, leaf: 8ea1ccxx - offset 0x01f41 ***/
+
+ /* a1 */ 0xe4bdba, 0xe58594, 0xe58592, 0xe58595,
+ /* a5 */ 0xe585a9, 0xe585b7, 0xe585b6, 0xe585b8,
+ /* a9 */ 0xe586bd, 0xe587bd, 0xe588bb, 0xe588b8,
+ /* ad */ 0xe588b7, 0xe588ba, 0xe588b0, 0xe588ae,
+ /* b1 */ 0xe588b6, 0xe58981, 0xe58abe, 0xe58abb,
+ /* b5 */ 0xe58d92, 0xe58d94, 0xe58d93, 0xe58d91,
+ /* b9 */ 0xe58da6, 0xe58db7, 0xe58db8, 0xe58db9,
+ /* bd */ 0xe58f96, 0xe58f94, 0xe58f97, 0xe591b3,
+ /* c1 */ 0xe591b5, 0xe59296, 0xe591b8, 0xe59295,
+ /* c5 */ 0xe59280, 0xe591bb, 0xe591b7, 0xe59284,
+ /* c9 */ 0xe59292, 0xe59286, 0xe591bc, 0xe59290,
+ /* cd */ 0xe591b1, 0xe591b6, 0xe5928c, 0xe5929a,
+ /* d1 */ 0xe591a2, 0xe591a8, 0xe5928b, 0xe591bd,
+ /* d5 */ 0xe5928e, 0xe59bba, 0xe59e83, 0xe59db7,
+ /* d9 */ 0xe59daa, 0xe59da9, 0xe59da1, 0xe59da6,
+ /* dd */ 0xe59da4, 0xe59dbc, 0xe5a49c, 0xe5a589,
+ /* e1 */ 0xe5a587, 0xe5a588, 0xe5a584, 0xe5a594,
+ /* e5 */ 0xe5a6be, 0xe5a6bb, 0xe5a794, 0xe5a6b9,
+ /* e9 */ 0xe5a6ae, 0xe5a791, 0xe5a786, 0xe5a790,
+ /* ed */ 0xe5a78d, 0xe5a78b, 0xe5a793, 0xe5a78a,
+ /* f1 */ 0xe5a6af, 0xe5a6b3, 0xe5a792, 0xe5a785,
+ /* f5 */ 0xe5ad9f, 0xe5ada4, 0xe5ada3, 0xe5ae97,
+ /* f9 */ 0xe5ae9a, 0xe5ae98, 0xe5ae9c, 0xe5ae99,
+ /* fd */ 0xe5ae9b, 0xe5b09a,
+
+ /*** Four byte table, leaf: 8ea1cdxx - offset 0x01f9f ***/
+
+ /* a1 */ 0xe5b188, 0xe5b185, 0xe5b186, 0xe5b2b7,
+ /* a5 */ 0xe5b2a1, 0xe5b2b8, 0xe5b2a9, 0xe5b2ab,
+ /* a9 */ 0xe5b2b1, 0xe5b2b3, 0xe5b898, 0xe5b89a,
+ /* ad */ 0xe5b896, 0xe5b895, 0xe5b89b, 0xe5b891,
+ /* b1 */ 0xe5b9b8, 0xe5ba9a, 0xe5ba97, 0xe5ba9c,
+ /* b5 */ 0xe5ba95, 0xe5ba96, 0xe5bbb6, 0xe5bca6,
+ /* b9 */ 0xe5bca7, 0xe5bca9, 0xe5be80, 0xe5be81,
+ /* bd */ 0xe5bdbf, 0xe5bdbc, 0xe5bf9d, 0xe5bfa0,
+ /* c1 */ 0xe5bfbd, 0xe5bfb5, 0xe5bfbf, 0xe6808f,
+ /* c5 */ 0xe68094, 0xe680af, 0xe680b5, 0xe68096,
+ /* c9 */ 0xe680aa, 0xe68095, 0xe680a1, 0xe680a7,
+ /* cd */ 0xe680a9, 0xe680ab, 0xe6809b, 0xe68896,
+ /* d1 */ 0xe68895, 0xe688bf, 0xe688be, 0xe68980,
+ /* d5 */ 0xe689bf, 0xe68b89, 0xe68b8c, 0xe68b84,
+ /* d9 */ 0xe68abf, 0xe68b82, 0xe68ab9, 0xe68b92,
+ /* dd */ 0xe68b9b, 0xe68aab, 0xe68b93, 0xe68b94,
+ /* e1 */ 0xe68b8b, 0xe68b88, 0xe68aa8, 0xe68abd,
+ /* e5 */ 0xe68abc, 0xe68b90, 0xe68b99, 0xe68b87,
+ /* e9 */ 0xe68b8d, 0xe68ab5, 0xe68b9a, 0xe68ab1,
+ /* ed */ 0xe68b98, 0xe68b96, 0xe68b97, 0xe68b86,
+ /* f1 */ 0xe68aac, 0xe68b8e, 0xe694be, 0xe696a7,
+ /* f5 */ 0xe696bc, 0xe697ba, 0xe69894, 0xe69893,
+ /* f9 */ 0xe6988c, 0xe69886, 0xe69882, 0xe6988e,
+ /* fd */ 0xe69880, 0xe6988f,
+
+ /*** Four byte table, leaf: 8ea1cexx - offset 0x01ffd ***/
+
+ /* a1 */ 0xe69895, 0xe6988a, 0xe69887, 0xe69c8d,
+ /* a5 */ 0xe69c8b, 0xe69dad, 0xe69e8b, 0xe69e95,
+ /* a9 */ 0xe69db1, 0xe69e9c, 0xe69db3, 0xe69db7,
+ /* ad */ 0xe69e87, 0xe69e9d, 0xe69e97, 0xe69daf,
+ /* b1 */ 0xe69db0, 0xe69dbf, 0xe69e89, 0xe69dbe,
+ /* b5 */ 0xe69e90, 0xe69db5, 0xe69e9a, 0xe69e93,
+ /* b9 */ 0xe69dbc, 0xe69daa, 0xe69db2, 0xe6aca3,
+ /* bd */ 0xe6ada6, 0xe6ada7, 0xe6adbf, 0xe6b093,
+ /* c1 */ 0xe6b09b, 0xe6b3a3, 0xe6b3a8, 0xe6b3b3,
+ /* c5 */ 0xe6b2b1, 0xe6b38c, 0xe6b3a5, 0xe6b2b3,
+ /* c9 */ 0xe6b2bd, 0xe6b2be, 0xe6b2bc, 0xe6b3a2,
+ /* cd */ 0xe6b2ab, 0xe6b395, 0xe6b393, 0xe6b2b8,
+ /* d1 */ 0xe6b384, 0xe6b2b9, 0xe6b381, 0xe6b2ae,
+ /* d5 */ 0xe6b397, 0xe6b385, 0xe6b3b1, 0xe6b2bf,
+ /* d9 */ 0xe6b2bb, 0xe6b3a1, 0xe6b39b, 0xe6b38a,
+ /* dd */ 0xe6b2ac, 0xe6b3af, 0xe6b39c, 0xe6b396,
+ /* e1 */ 0xe6b3a0, 0xe78295, 0xe7828e, 0xe78292,
+ /* e5 */ 0xe7828a, 0xe78299, 0xe788ac, 0xe788ad,
+ /* e9 */ 0xe788b8, 0xe78988, 0xe789a7, 0xe789a9,
+ /* ed */ 0xe78b80, 0xe78b8e, 0xe78b99, 0xe78b97,
+ /* f1 */ 0xe78b90, 0xe78ea9, 0xe78ea8, 0xe78e9f,
+ /* f5 */ 0xe78eab, 0xe78ea5, 0xe794bd, 0xe7969d,
+ /* f9 */ 0xe79699, 0xe7969a, 0xe79a84, 0xe79b82,
+ /* fd */ 0xe79bb2, 0xe79bb4,
+
+ /*** Four byte table, leaf: 8ea1cfxx - offset 0x0205b ***/
+
+ /* a1 */ 0xe79fa5, 0xe79fbd, 0xe7a4be, 0xe7a580,
+ /* a5 */ 0xe7a581, 0xe7a789, 0xe7a788, 0xe7a9ba,
+ /* a9 */ 0xe7a9b9, 0xe7abba, 0xe7b3be, 0xe7bd94,
+ /* ad */ 0xe7be8c, 0xe7be8b, 0xe88085, 0xe882ba,
+ /* b1 */ 0xe882a5, 0xe882a2, 0xe882b1, 0xe882a1,
+ /* b5 */ 0xe882ab, 0xe882a9, 0xe882b4, 0xe882aa,
+ /* b9 */ 0xe882af, 0xe887a5, 0xe887be, 0xe8888d,
+ /* bd */ 0xe88ab3, 0xe88a9d, 0xe88a99, 0xe88aad,
+ /* c1 */ 0xe88abd, 0xe88a9f, 0xe88ab9, 0xe88ab1,
+ /* c5 */ 0xe88aac, 0xe88aa5, 0xe88aaf, 0xe88ab8,
+ /* c9 */ 0xe88aa3, 0xe88ab0, 0xe88abe, 0xe88ab7,
+ /* cd */ 0xe8998e, 0xe899b1, 0xe5889d, 0xe8a1a8,
+ /* d1 */ 0xe8bb8b, 0xe8bf8e, 0xe8bf94, 0xe8bf91,
+ /* d5 */ 0xe982b5, 0xe982b8, 0xe982b1, 0xe982b6,
+ /* d9 */ 0xe98787, 0xe98791, 0xe995b7, 0xe99680,
+ /* dd */ 0xe9989c, 0xe99980, 0xe998bf, 0xe998bb,
+ /* e1 */ 0xe99984, 0xe99982, 0xe99ab9, 0xe99ba8,
+ /* e5 */ 0xe99d92, 0xe99d9e, 0xe4ba9f, 0xe4baad,
+ /* e9 */ 0xe4baae, 0xe4bfa1, 0xe4beb5, 0xe4beaf,
+ /* ed */ 0xe4bebf, 0xe4bfa0, 0xe4bf91, 0xe4bf8f,
+ /* f1 */ 0xe4bf9d, 0xe4bf83, 0xe4beb6, 0xe4bf98,
+ /* f5 */ 0xe4bf9f, 0xe4bf8a, 0xe4bf97, 0xe4beae,
+ /* f9 */ 0xe4bf90, 0xe4bf84, 0xe4bf82, 0xe4bf9a,
+ /* fd */ 0xe4bf8e, 0xe4bf9e,
+
+ /*** Four byte table, leaf: 8ea1d0xx - offset 0x020b9 ***/
+
+ /* a1 */ 0xe4beb7, 0xe58597, 0xe58692, 0xe58691,
+ /* a5 */ 0xe586a0, 0xe5898e, 0xe58983, 0xe5898a,
+ /* a9 */ 0xe5898d, 0xe5898c, 0xe5898b, 0xe58987,
+ /* ad */ 0xe58b87, 0xe58b89, 0xe58b83, 0xe58b81,
+ /* b1 */ 0xe58c8d, 0xe58d97, 0xe58dbb, 0xe58e9a,
+ /* b5 */ 0xe58f9b, 0xe592ac, 0xe59380, 0xe592a8,
+ /* b9 */ 0xe5938e, 0xe59389, 0xe592b8, 0xe592a6,
+ /* bd */ 0xe592b3, 0xe59387, 0xe59382, 0xe592bd,
+ /* c1 */ 0xe592aa, 0xe59381, 0xe59384, 0xe59388,
+ /* c5 */ 0xe592af, 0xe592ab, 0xe592b1, 0xe592bb,
+ /* c9 */ 0xe592a9, 0xe592a7, 0xe592bf, 0xe59bbf,
+ /* cd */ 0xe59e82, 0xe59e8b, 0xe59ea0, 0xe59ea3,
+ /* d1 */ 0xe59ea2, 0xe59f8e, 0xe59eae, 0xe59e93,
+ /* d5 */ 0xe5a595, 0xe5a591, 0xe5a58f, 0xe5a58e,
+ /* d9 */ 0xe5a590, 0xe5a79c, 0xe5a798, 0xe5a7bf,
+ /* dd */ 0xe5a7a3, 0xe5a7a8, 0xe5a883, 0xe5a7a5,
+ /* e1 */ 0xe5a7aa, 0xe5a79a, 0xe5a7a6, 0xe5a881,
+ /* e5 */ 0xe5a7bb, 0xe5ada9, 0xe5aea3, 0xe5aea6,
+ /* e9 */ 0xe5aea4, 0xe5aea2, 0xe5aea5, 0xe5b081,
+ /* ed */ 0xe5b18e, 0xe5b18f, 0xe5b18d, 0xe5b18b,
+ /* f1 */ 0xe5b399, 0xe5b392, 0xe5b7b7, 0xe5b89d,
+ /* f5 */ 0xe5b8a5, 0xe5b89f, 0xe5b9bd, 0xe5baa0,
+ /* f9 */ 0xe5baa6, 0xe5bbba, 0xe5bc88, 0xe5bcad,
+ /* fd */ 0xe5bda5, 0xe5be88,
+
+ /*** Four byte table, leaf: 8ea1d1xx - offset 0x02117 ***/
+
+ /* a1 */ 0xe5be85, 0xe5be8a, 0xe5be8b, 0xe5be87,
+ /* a5 */ 0xe5be8c, 0xe5be89, 0xe68092, 0xe6809d,
+ /* a9 */ 0xe680a0, 0xe680a5, 0xe6808e, 0xe680a8,
+ /* ad */ 0xe6818d, 0xe681b0, 0xe681a8, 0xe681a2,
+ /* b1 */ 0xe68186, 0xe68183, 0xe681ac, 0xe681ab,
+ /* b5 */ 0xe681aa, 0xe681a4, 0xe68981, 0xe68b9c,
+ /* b9 */ 0xe68c96, 0xe68c89, 0xe68bbc, 0xe68bad,
+ /* bd */ 0xe68c81, 0xe68bae, 0xe68bbd, 0xe68c87,
+ /* c1 */ 0xe68bb1, 0xe68bb7, 0xe68baf, 0xe68bac,
+ /* c5 */ 0xe68bbe, 0xe68bb4, 0xe68c91, 0xe68c82,
+ /* c9 */ 0xe694bf, 0xe69585, 0xe696ab, 0xe696bd,
+ /* cd */ 0xe697a2, 0xe698a5, 0xe698ad, 0xe698a0,
+ /* d1 */ 0xe698a7, 0xe698af, 0xe6989f, 0xe698a8,
+ /* d5 */ 0xe698b1, 0xe698a4, 0xe69bb7, 0xe69fbf,
+ /* d9 */ 0xe69f93, 0xe69fb1, 0xe69f94, 0xe69f90,
+ /* dd */ 0xe69fac, 0xe69eb6, 0xe69eaf, 0xe69fb5,
+ /* e1 */ 0xe69fa9, 0xe69faf, 0xe69f84, 0xe69f91,
+ /* e5 */ 0xe69eb4, 0xe69f9a, 0xe69fa5, 0xe69eb8,
+ /* e9 */ 0xe69f8f, 0xe69f9e, 0xe69fb3, 0xe69eb0,
+ /* ed */ 0xe69f99, 0xe69fa2, 0xe69f9d, 0xe69f92,
+ /* f1 */ 0xe6adaa, 0xe6ae83, 0xe6ae86, 0xe6aeb5,
+ /* f5 */ 0xe6af92, 0xe6af97, 0xe6b09f, 0xe6b389,
+ /* f9 */ 0xe6b48b, 0xe6b4b2, 0xe6b4aa, 0xe6b581,
+ /* fd */ 0xe6b4a5, 0xe6b48c,
+
+ /*** Four byte table, leaf: 8ea1d2xx - offset 0x02175 ***/
+
+ /* a1 */ 0xe6b4b1, 0xe6b49e, 0xe6b497, 0xe6b4bb,
+ /* a5 */ 0xe6b4bd, 0xe6b4be, 0xe6b4b6, 0xe6b49b,
+ /* a9 */ 0xe6b3b5, 0xe6b4b9, 0xe6b4a7, 0xe6b4b8,
+ /* ad */ 0xe6b4a9, 0xe6b4ae, 0xe6b4b5, 0xe6b48e,
+ /* b1 */ 0xe6b4ab, 0xe782ab, 0xe782ba, 0xe782b3,
+ /* b5 */ 0xe782ac, 0xe782af, 0xe782ad, 0xe782b8,
+ /* b9 */ 0xe782ae, 0xe782a4, 0xe788b0, 0xe789b2,
+ /* bd */ 0xe789af, 0xe789b4, 0xe78ba9, 0xe78ba0,
+ /* c1 */ 0xe78ba1, 0xe78eb7, 0xe78f8a, 0xe78ebb,
+ /* c5 */ 0xe78eb2, 0xe78f8d, 0xe78f80, 0xe78eb3,
+ /* c9 */ 0xe7949a, 0xe794ad, 0xe7958f, 0xe7958c,
+ /* cd */ 0xe7958e, 0xe7958b, 0xe796ab, 0xe796a4,
+ /* d1 */ 0xe796a5, 0xe796a2, 0xe796a3, 0xe799b8,
+ /* d5 */ 0xe79a86, 0xe79a87, 0xe79a88, 0xe79b88,
+ /* d9 */ 0xe79b86, 0xe79b83, 0xe79b85, 0xe79c81,
+ /* dd */ 0xe79bb9, 0xe79bb8, 0xe79c89, 0xe79c8b,
+ /* e1 */ 0xe79bbe, 0xe79bbc, 0xe79c87, 0xe79f9c,
+ /* e5 */ 0xe7a082, 0xe7a094, 0xe7a08c, 0xe7a08d,
+ /* e9 */ 0xe7a586, 0xe7a589, 0xe7a588, 0xe7a587,
+ /* ed */ 0xe7a6b9, 0xe7a6ba, 0xe7a791, 0xe7a792,
+ /* f1 */ 0xe7a78b, 0xe7a9bf, 0xe7aa81, 0xe7abbf,
+ /* f5 */ 0xe7abbd, 0xe7b1bd, 0xe7b482, 0xe7b485,
+ /* f9 */ 0xe7b480, 0xe7b489, 0xe7b487, 0xe7b484,
+ /* fd */ 0xe7b486, 0xe7bcb8,
+
+ /*** Four byte table, leaf: 8ea1d3xx - offset 0x021d3 ***/
+
+ /* a1 */ 0xe7be8e, 0xe7bebf, 0xe88090, 0xe8808d,
+ /* a5 */ 0xe88091, 0xe880b6, 0xe88396, 0xe883a5,
+ /* a9 */ 0xe8839a, 0xe88383, 0xe88384, 0xe8838c,
+ /* ad */ 0xe883a1, 0xe8839b, 0xe8838e, 0xe8839e,
+ /* b1 */ 0xe883a4, 0xe8839d, 0xe887b4, 0xe888a2,
+ /* b5 */ 0xe88ba7, 0xe88c83, 0xe88c85, 0xe88ba3,
+ /* b9 */ 0xe88b9b, 0xe88ba6, 0xe88c84, 0xe88ba5,
+ /* bd */ 0xe88c82, 0xe88c89, 0xe88b92, 0xe88b97,
+ /* c1 */ 0xe88bb1, 0xe88c81, 0xe88b9c, 0xe88b94,
+ /* c5 */ 0xe88b91, 0xe88b9e, 0xe88b93, 0xe88b9f,
+ /* c9 */ 0xe88baf, 0xe88c86, 0xe89990, 0xe899b9,
+ /* cd */ 0xe899bb, 0xe899ba, 0xe8a18d, 0xe8a1ab,
+ /* d1 */ 0xe8a681, 0xe8a794, 0xe8a888, 0xe8a882,
+ /* d5 */ 0xe8a883, 0xe8b29e, 0xe8b2a0, 0xe8b5b4,
+ /* d9 */ 0xe8b5b3, 0xe8b6b4, 0xe8bb8d, 0xe8bb8c,
+ /* dd */ 0xe8bfb0, 0xe8bfa6, 0xe8bfa2, 0xe8bfaa,
+ /* e1 */ 0xe8bfa5, 0xe8bfad, 0xe8bfab, 0xe8bfa4,
+ /* e5 */ 0xe8bfa8, 0xe9838a, 0xe9838e, 0xe98381,
+ /* e9 */ 0xe98383, 0xe9858b, 0xe9858a, 0xe9878d,
+ /* ed */ 0xe99682, 0xe99990, 0xe9998b, 0xe9998c,
+ /* f1 */ 0xe9998d, 0xe99da2, 0xe99da9, 0xe99f8b,
+ /* f5 */ 0xe99fad, 0xe99fb3, 0xe9a081, 0xe9a2a8,
+ /* f9 */ 0xe9a39b, 0xe9a39f, 0xe9a696, 0xe9a699,
+ /* fd */ 0xe4b998, 0xe4bab3,
+
+ /*** Four byte table, leaf: 8ea1d4xx - offset 0x02231 ***/
+
+ /* a1 */ 0xe5808c, 0xe5808d, 0xe580a3, 0xe4bfaf,
+ /* a5 */ 0xe580a6, 0xe580a5, 0xe4bfb8, 0xe580a9,
+ /* a9 */ 0xe58096, 0xe58086, 0xe580bc, 0xe5809f,
+ /* ad */ 0xe5809a, 0xe58092, 0xe58091, 0xe4bfba,
+ /* b1 */ 0xe58080, 0xe58094, 0xe580a8, 0xe4bfb1,
+ /* b5 */ 0xe580a1, 0xe5808b, 0xe58099, 0xe58098,
+ /* b9 */ 0xe4bfb3, 0xe4bfae, 0xe580ad, 0xe580aa,
+ /* bd */ 0xe4bfbe, 0xe580ab, 0xe58089, 0xe585bc,
+ /* c1 */ 0xe586a4, 0xe586a5, 0xe586a2, 0xe5878d,
+ /* c5 */ 0xe5878c, 0xe58786, 0xe5878b, 0xe58996,
+ /* c9 */ 0xe5899c, 0xe58994, 0xe5899b, 0xe5899d,
+ /* cd */ 0xe58caa, 0xe58dbf, 0xe58e9f, 0xe58e9d,
+ /* d1 */ 0xe58f9f, 0xe593a8, 0xe59490, 0xe59481,
+ /* d5 */ 0xe594b7, 0xe593bc, 0xe593a5, 0xe593b2,
+ /* d9 */ 0xe59486, 0xe593ba, 0xe59494, 0xe593a9,
+ /* dd */ 0xe593ad, 0xe593a1, 0xe59489, 0xe593ae,
+ /* e1 */ 0xe593aa, 0xe593a6, 0xe594a7, 0xe59487,
+ /* e5 */ 0xe593bd, 0xe5948f, 0xe59c83, 0xe59c84,
+ /* e9 */ 0xe59f82, 0xe59f94, 0xe59f8b, 0xe59f83,
+ /* ed */ 0xe5a089, 0xe5a48f, 0xe5a597, 0xe5a598,
+ /* f1 */ 0xe5a59a, 0xe5a891, 0xe5a898, 0xe5a89c,
+ /* f5 */ 0xe5a89f, 0xe5a89b, 0xe5a893, 0xe5a7ac,
+ /* f9 */ 0xe5a8a0, 0xe5a8a3, 0xe5a8a9, 0xe5a8a5,
+ /* fd */ 0xe5a88c, 0xe5a889,
+
+ /*** Four byte table, leaf: 8ea1d5xx - offset 0x0228f ***/
+
+ /* a1 */ 0xe5adab, 0xe5b198, 0xe5aeb0, 0xe5aeb3,
+ /* a5 */ 0xe5aeb6, 0xe5aeb4, 0xe5aeae, 0xe5aeb5,
+ /* a9 */ 0xe5aeb9, 0xe5aeb8, 0xe5b084, 0xe5b191,
+ /* ad */ 0xe5b195, 0xe5b190, 0xe5b3ad, 0xe5b3bd,
+ /* b1 */ 0xe5b3bb, 0xe5b3aa, 0xe5b3a8, 0xe5b3b0,
+ /* b5 */ 0xe5b3b6, 0xe5b481, 0xe5b3b4, 0xe5b7ae,
+ /* b9 */ 0xe5b8ad, 0xe5b8ab, 0xe5baab, 0xe5baad,
+ /* bd */ 0xe5baa7, 0xe5bcb1, 0xe5be92, 0xe5be91,
+ /* c1 */ 0xe5be90, 0xe68199, 0xe681a3, 0xe681a5,
+ /* c5 */ 0xe68190, 0xe68195, 0xe681ad, 0xe681a9,
+ /* c9 */ 0xe681af, 0xe68284, 0xe6829f, 0xe6829a,
+ /* cd */ 0xe6828d, 0xe68294, 0xe6828c, 0xe68285,
+ /* d1 */ 0xe68296, 0xe68987, 0xe68bb3, 0xe68c88,
+ /* d5 */ 0xe68bbf, 0xe68d8e, 0xe68cbe, 0xe68caf,
+ /* d9 */ 0xe68d95, 0xe68d82, 0xe68d86, 0xe68d8f,
+ /* dd */ 0xe68d89, 0xe68cba, 0xe68d90, 0xe68cbd,
+ /* e1 */ 0xe68caa, 0xe68cab, 0xe68ca8, 0xe68d8d,
+ /* e5 */ 0xe68d8c, 0xe69588, 0xe69589, 0xe69699,
+ /* e9 */ 0xe69781, 0xe69785, 0xe69982, 0xe69989,
+ /* ed */ 0xe6998f, 0xe69983, 0xe69992, 0xe6998c,
+ /* f1 */ 0xe69985, 0xe69981, 0xe69bb8, 0xe69c94,
+ /* f5 */ 0xe69c95, 0xe69c97, 0xe6a0a1, 0xe6a0b8,
+ /* f9 */ 0xe6a188, 0xe6a186, 0xe6a193, 0xe6a0b9,
+ /* fd */ 0xe6a182, 0xe6a194,
+
+ /*** Four byte table, leaf: 8ea1d6xx - offset 0x022ed ***/
+
+ /* a1 */ 0xe6a0a9, 0xe6a2b3, 0xe6a097, 0xe6a18c,
+ /* a5 */ 0xe6a191, 0xe6a0bd, 0xe69fb4, 0xe6a190,
+ /* a9 */ 0xe6a180, 0xe6a0bc, 0xe6a183, 0xe6a0aa,
+ /* ad */ 0xe6a185, 0xe6a093, 0xe6a098, 0xe6a181,
+ /* b1 */ 0xe6ae8a, 0xe6ae89, 0xe6aeb7, 0xe6b0a3,
+ /* b5 */ 0xe6b0a7, 0xe6b0a8, 0xe6b0a6, 0xe6b0a4,
+ /* b9 */ 0xe6b3b0, 0xe6b5aa, 0xe6b695, 0xe6b688,
+ /* bd */ 0xe6b687, 0xe6b5a6, 0xe6b5b8, 0xe6b5b7,
+ /* c1 */ 0xe6b599, 0xe6b693, 0xe6b5ac, 0xe6b689,
+ /* c5 */ 0xe6b5ae, 0xe6b59a, 0xe6b5b4, 0xe6b5a9,
+ /* c9 */ 0xe6b68c, 0xe6b68a, 0xe6b5b9, 0xe6b685,
+ /* cd */ 0xe6b5a5, 0xe6b694, 0xe7838a, 0xe78398,
+ /* d1 */ 0xe783a4, 0xe78399, 0xe78388, 0xe7838f,
+ /* d5 */ 0xe788b9, 0xe789b9, 0xe78bbc, 0xe78bb9,
+ /* d9 */ 0xe78bbd, 0xe78bb8, 0xe78bb7, 0xe78e86,
+ /* dd */ 0xe78fad, 0xe79089, 0xe78fae, 0xe78fa0,
+ /* e1 */ 0xe78faa, 0xe78f9e, 0xe79594, 0xe7959d,
+ /* e5 */ 0xe7959c, 0xe7959a, 0xe79599, 0xe796be,
+ /* e9 */ 0xe79785, 0xe79787, 0xe796b2, 0xe796b3,
+ /* ed */ 0xe796bd, 0xe796bc, 0xe796b9, 0xe79782,
+ /* f1 */ 0xe796b8, 0xe79a8b, 0xe79ab0, 0xe79b8a,
+ /* f5 */ 0xe79b8d, 0xe79b8e, 0xe79ca9, 0xe79c9f,
+ /* f9 */ 0xe79ca0, 0xe79ca8, 0xe79fa9, 0xe7a0b0,
+ /* fd */ 0xe7a0a7, 0xe7a0b8,
+
+ /*** Four byte table, leaf: 8ea1d7xx - offset 0x0234b ***/
+
+ /* a1 */ 0xe7a09d, 0xe7a0b4, 0xe7a0b7, 0xe7a0a5,
+ /* a5 */ 0xe7a0ad, 0xe7a0a0, 0xe7a09f, 0xe7a0b2,
+ /* a9 */ 0xe7a595, 0xe7a590, 0xe7a5a0, 0xe7a59f,
+ /* ad */ 0xe7a596, 0xe7a59e, 0xe7a59d, 0xe7a597,
+ /* b1 */ 0xe7a59a, 0xe7a7a4, 0xe7a7a3, 0xe7a7a7,
+ /* b5 */ 0xe7a79f, 0xe7a7a6, 0xe7a7a9, 0xe7a798,
+ /* b9 */ 0xe7aa84, 0xe7aa88, 0xe7ab99, 0xe7ac86,
+ /* bd */ 0xe7ac91, 0xe7b289, 0xe7b4a1, 0xe7b497,
+ /* c1 */ 0xe7b48b, 0xe7b48a, 0xe7b4a0, 0xe7b4a2,
+ /* c5 */ 0xe7b494, 0xe7b490, 0xe7b495, 0xe7b49a,
+ /* c9 */ 0xe7b49c, 0xe7b48d, 0xe7b499, 0xe7b49b,
+ /* cd */ 0xe7bcba, 0xe7bd9f, 0xe7be94, 0xe7bf85,
+ /* d1 */ 0xe7bf81, 0xe88086, 0xe88084, 0xe88098,
+ /* d5 */ 0xe88095, 0xe88099, 0xe88097, 0xe880bd,
+ /* d9 */ 0xe880bf, 0xe883b1, 0xe88482, 0xe883b0,
+ /* dd */ 0xe88485, 0xe883ad, 0xe883b4, 0xe88486,
+ /* e1 */ 0xe883b8, 0xe883b3, 0xe88488, 0xe883bd,
+ /* e5 */ 0xe8848a, 0xe883bc, 0xe883af, 0xe887ad,
+ /* e9 */ 0xe887ac, 0xe88880, 0xe88890, 0xe888aa,
+ /* ed */ 0xe888ab, 0xe888a8, 0xe888ac, 0xe88abb,
+ /* f1 */ 0xe88cab, 0xe88d92, 0xe88d94, 0xe88d8a,
+ /* f5 */ 0xe88cb8, 0xe88d90, 0xe88d89, 0xe88cb5,
+ /* f9 */ 0xe88cb4, 0xe88d8f, 0xe88cb2, 0xe88cb9,
+ /* fd */ 0xe88cb6, 0xe88c97,
+
+ /*** Four byte table, leaf: 8ea1d8xx - offset 0x023a9 ***/
+
+ /* a1 */ 0xe88d80, 0xe88cb1, 0xe88ca8, 0xe88d83,
+ /* a5 */ 0xe89994, 0xe89a8a, 0xe89aaa, 0xe89a93,
+ /* a9 */ 0xe89aa4, 0xe89aa9, 0xe89a8c, 0xe89aa3,
+ /* ad */ 0xe89a9c, 0xe8a1b0, 0xe8a1b7, 0xe8a281,
+ /* b1 */ 0xe8a282, 0xe8a1bd, 0xe8a1b9, 0xe8a898,
+ /* b5 */ 0xe8a890, 0xe8a88e, 0xe8a88c, 0xe8a895,
+ /* b9 */ 0xe8a88a, 0xe8a897, 0xe8a893, 0xe8a896,
+ /* bd */ 0xe8a88f, 0xe8a891, 0xe8b188, 0xe8b1ba,
+ /* c1 */ 0xe8b1b9, 0xe8b2a1, 0xe8b2a2, 0xe8b5b7,
+ /* c5 */ 0xe8baac, 0xe8bb92, 0xe8bb94, 0xe8bb8f,
+ /* c9 */ 0xe8beb1, 0xe98081, 0xe98086, 0xe8bfb7,
+ /* cd */ 0xe98080, 0xe8bfba, 0xe8bfb4, 0xe98083,
+ /* d1 */ 0xe8bfbd, 0xe98085, 0xe8bfb8, 0xe98295,
+ /* d5 */ 0xe983a1, 0xe9839d, 0xe983a2, 0xe98592,
+ /* d9 */ 0xe9858d, 0xe9858c, 0xe98798, 0xe9879d,
+ /* dd */ 0xe98797, 0xe9879c, 0xe98799, 0xe99683,
+ /* e1 */ 0xe999a2, 0xe999a3, 0xe999a1, 0xe9999b,
+ /* e5 */ 0xe9999d, 0xe999a4, 0xe99998, 0xe9999e,
+ /* e9 */ 0xe99abb, 0xe9a3a2, 0xe9a6ac, 0xe9aaa8,
+ /* ed */ 0xe9ab98, 0xe9aca5, 0xe9acb2, 0xe9acbc,
+ /* f1 */ 0xe4b9be, 0xe581ba, 0xe581bd, 0xe5819c,
+ /* f5 */ 0xe58187, 0xe58183, 0xe5818c, 0xe5819a,
+ /* f9 */ 0xe58189, 0xe581a5, 0xe581b6, 0xe5818e,
+ /* fd */ 0xe58195, 0xe581b5,
+
+ /*** Four byte table, leaf: 8ea1d9xx - offset 0x02407 ***/
+
+ /* a1 */ 0xe581b4, 0xe581b7, 0xe5818f, 0xe5808f,
+ /* a5 */ 0xe581af, 0xe581ad, 0xe5859c, 0xe58695,
+ /* a9 */ 0xe587b0, 0xe589aa, 0xe589af, 0xe58b92,
+ /* ad */ 0xe58b99, 0xe58b98, 0xe58b95, 0xe58c90,
+ /* b1 */ 0xe58c8f, 0xe58c99, 0xe58cbf, 0xe58d80,
+ /* b5 */ 0xe58cbe, 0xe58f83, 0xe69bbc, 0xe59586,
+ /* b9 */ 0xe595aa, 0xe595a6, 0xe59584, 0xe5959e,
+ /* bd */ 0xe595a1, 0xe59583, 0xe5958a, 0xe594b1,
+ /* c1 */ 0xe59596, 0xe5958f, 0xe59595, 0xe594af,
+ /* c5 */ 0xe595a4, 0xe594b8, 0xe594ae, 0xe5959c,
+ /* c9 */ 0xe594ac, 0xe595a3, 0xe594b3, 0xe59581,
+ /* cd */ 0xe59597, 0xe59c88, 0xe59c8b, 0xe59c89,
+ /* d1 */ 0xe59f9f, 0xe5a085, 0xe5a08a, 0xe5a086,
+ /* d5 */ 0xe59fa0, 0xe59fa4, 0xe59fba, 0xe5a082,
+ /* d9 */ 0xe5a0b5, 0xe59fb7, 0xe59fb9, 0xe5a4a0,
+ /* dd */ 0xe5a5a2, 0xe5a8b6, 0xe5a981, 0xe5a989,
+ /* e1 */ 0xe5a9a6, 0xe5a9aa, 0xe5a980, 0xe5a8bc,
+ /* e5 */ 0xe5a9a2, 0xe5a99a, 0xe5a986, 0xe5a98a,
+ /* e9 */ 0xe5adb0, 0xe5af87, 0xe5af85, 0xe5af84,
+ /* ed */ 0xe5af82, 0xe5aebf, 0xe5af86, 0xe5b089,
+ /* f1 */ 0xe5b088, 0xe5b087, 0xe5b1a0, 0xe5b19c,
+ /* f5 */ 0xe5b19d, 0xe5b487, 0xe5b486, 0xe5b48e,
+ /* f9 */ 0xe5b49b, 0xe5b496, 0xe5b4a2, 0xe5b491,
+ /* fd */ 0xe5b4a9, 0xe5b494,
+
+ /*** Four byte table, leaf: 8ea1daxx - offset 0x02465 ***/
+
+ /* a1 */ 0xe5b499, 0xe5b4a4, 0xe5b4a7, 0xe5b497,
+ /* a5 */ 0xe5b7a2, 0xe5b8b8, 0xe5b8b6, 0xe5b8b3,
+ /* a9 */ 0xe5b8b7, 0xe5bab7, 0xe5bab8, 0xe5bab6,
+ /* ad */ 0xe5bab5, 0xe5babe, 0xe5bcb5, 0xe5bcb7,
+ /* b1 */ 0xe5bd97, 0xe5bdac, 0xe5bda9, 0xe5bdab,
+ /* b5 */ 0xe5be97, 0xe5be99, 0xe5be9e, 0xe5be98,
+ /* b9 */ 0xe5bea1, 0xe5bea0, 0xe5be9c, 0xe681bf,
+ /* bd */ 0xe682a3, 0xe68289, 0xe682a0, 0xe682a8,
+ /* c1 */ 0xe6838b, 0xe682b4, 0xe683a6, 0xe682bd,
+ /* c5 */ 0xe68385, 0xe682bb, 0xe682b5, 0xe6839c,
+ /* c9 */ 0xe682bc, 0xe68398, 0xe68395, 0xe68386,
+ /* cd */ 0xe6839f, 0xe682b8, 0xe6839a, 0xe68387,
+ /* d1 */ 0xe6889a, 0xe6889b, 0xe68988, 0xe68ea0,
+ /* d5 */ 0xe68ea7, 0xe68db2, 0xe68e96, 0xe68ea2,
+ /* d9 */ 0xe68ea5, 0xe68db7, 0xe68da7, 0xe68e98,
+ /* dd */ 0xe68eaa, 0xe68db1, 0xe68ea9, 0xe68e89,
+ /* e1 */ 0xe68e83, 0xe68e9b, 0xe68dab, 0xe68ea8,
+ /* e5 */ 0xe68e84, 0xe68e88, 0xe68e99, 0xe68ea1,
+ /* e9 */ 0xe68eac, 0xe68e92, 0xe68e8f, 0xe68e80,
+ /* ed */ 0xe68dbb, 0xe68da9, 0xe68da8, 0xe68dba,
+ /* f1 */ 0xe6959d, 0xe69596, 0xe69591, 0xe69599,
+ /* f5 */ 0xe69597, 0xe5959f, 0xe6958f, 0xe69598,
+ /* f9 */ 0xe69595, 0xe69594, 0xe6969c, 0xe6969b,
+ /* fd */ 0xe696ac, 0xe6978f,
+
+ /*** Four byte table, leaf: 8ea1dbxx - offset 0x024c3 ***/
+
+ /* a1 */ 0xe6978b, 0xe6978c, 0xe6978e, 0xe6999d,
+ /* a5 */ 0xe6999a, 0xe699a4, 0xe699a8, 0xe699a6,
+ /* a9 */ 0xe6999e, 0xe69bb9, 0xe58b97, 0xe69c9b,
+ /* ad */ 0xe6a281, 0xe6a2af, 0xe6a2a2, 0xe6a293,
+ /* b1 */ 0xe6a2b5, 0xe6a1bf, 0xe6a1b6, 0xe6a2b1,
+ /* b5 */ 0xe6a2a7, 0xe6a297, 0xe6a2b0, 0xe6a283,
+ /* b9 */ 0xe6a384, 0xe6a2ad, 0xe6a286, 0xe6a285,
+ /* bd */ 0xe6a294, 0xe6a29d, 0xe6a2a8, 0xe6a29f,
+ /* c1 */ 0xe6a2a1, 0xe6a282, 0xe6acb2, 0xe6aeba,
+ /* c5 */ 0xe6afab, 0xe6afac, 0xe6b0ab, 0xe6b68e,
+ /* c9 */ 0xe6b6bc, 0xe6b7b3, 0xe6b799, 0xe6b6b2,
+ /* cd */ 0xe6b7a1, 0xe6b78c, 0xe6b7a4, 0xe6b7bb,
+ /* d1 */ 0xe6b7ba, 0xe6b885, 0xe6b787, 0xe6b78b,
+ /* d5 */ 0xe6b6af, 0xe6b791, 0xe6b6ae, 0xe6b79e,
+ /* d9 */ 0xe6b7b9, 0xe6b6b8, 0xe6b7b7, 0xe6b7b5,
+ /* dd */ 0xe6b785, 0xe6b792, 0xe6b89a, 0xe6b6b5,
+ /* e1 */ 0xe6b79a, 0xe6b7ab, 0xe6b798, 0xe6b7aa,
+ /* e5 */ 0xe6b7b1, 0xe6b7ae, 0xe6b7a8, 0xe6b786,
+ /* e9 */ 0xe6b784, 0xe6b6aa, 0xe6b7ac, 0xe6b6bf,
+ /* ed */ 0xe6b7a6, 0xe783b9, 0xe78489, 0xe7848a,
+ /* f1 */ 0xe783bd, 0xe783af, 0xe788bd, 0xe789bd,
+ /* f5 */ 0xe78a81, 0xe78c9c, 0xe78c9b, 0xe78c96,
+ /* f9 */ 0xe78c93, 0xe78c99, 0xe78e87, 0xe79085,
+ /* fd */ 0xe7908a, 0xe79083,
+
+ /*** Four byte table, leaf: 8ea1dcxx - offset 0x02521 ***/
+
+ /* a1 */ 0xe79086, 0xe78fbe, 0xe7908d, 0xe793a0,
+ /* a5 */ 0xe793b6, 0xe793b7, 0xe7949c, 0xe794a2,
+ /* a9 */ 0xe795a5, 0xe795a6, 0xe795a2, 0xe795b0,
+ /* ad */ 0xe7968f, 0xe79794, 0xe79795, 0xe796b5,
+ /* b1 */ 0xe7978a, 0xe7978d, 0xe79a8e, 0xe79b94,
+ /* b5 */ 0xe79b92, 0xe79b9b, 0xe79cb7, 0xe79cbe,
+ /* b9 */ 0xe79cbc, 0xe79cb6, 0xe79cb8, 0xe79cba,
+ /* bd */ 0xe7a1ab, 0xe7a183, 0xe7a18e, 0xe7a5a5,
+ /* c1 */ 0xe7a5a8, 0xe7a5ad, 0xe7a7bb, 0xe7aa92,
+ /* c5 */ 0xe7aa95, 0xe7aca0, 0xe7aca8, 0xe7ac9b,
+ /* c9 */ 0xe7acac, 0xe7aca6, 0xe7ac99, 0xe7ac9e,
+ /* cd */ 0xe7acae, 0xe7b292, 0xe7b297, 0xe7b295,
+ /* d1 */ 0xe7b586, 0xe7b583, 0xe7b5b1, 0xe7b4ae,
+ /* d5 */ 0xe7b4b9, 0xe7b4bc, 0xe7b580, 0xe7b4b0,
+ /* d9 */ 0xe7b4b3, 0xe7b584, 0xe7b4af, 0xe7b582,
+ /* dd */ 0xe7b4b2, 0xe7b4b1, 0xe7bcbd, 0xe7be9e,
+ /* e1 */ 0xe7be9a, 0xe7bf8c, 0xe7bf8e, 0xe7bf92,
+ /* e5 */ 0xe8809c, 0xe8818a, 0xe88186, 0xe884af,
+ /* e9 */ 0xe88496, 0xe884a3, 0xe884ab, 0xe884a9,
+ /* ed */ 0xe884b0, 0xe884a4, 0xe88882, 0xe888b5,
+ /* f1 */ 0xe888b7, 0xe888b6, 0xe888b9, 0xe88e8e,
+ /* f5 */ 0xe88e9e, 0xe88e98, 0xe88db8, 0xe88ea2,
+ /* f9 */ 0xe88e96, 0xe88ebd, 0xe88eab, 0xe88e92,
+ /* fd */ 0xe88e8a, 0xe88e93,
+
+ /*** Four byte table, leaf: 8ea1ddxx - offset 0x0257f ***/
+
+ /* a1 */ 0xe88e89, 0xe88ea0, 0xe88db7, 0xe88dbb,
+ /* a5 */ 0xe88dbc, 0xe88e86, 0xe88ea7, 0xe89995,
+ /* a9 */ 0xe5bdaa, 0xe89b87, 0xe89b80, 0xe89ab6,
+ /* ad */ 0xe89b84, 0xe89ab5, 0xe89b86, 0xe89b8b,
+ /* b1 */ 0xe89ab1, 0xe89aaf, 0xe89b89, 0xe8a193,
+ /* b5 */ 0xe8a29e, 0xe8a288, 0xe8a2ab, 0xe8a292,
+ /* b9 */ 0xe8a296, 0xe8a28d, 0xe8a28b, 0xe8a693,
+ /* bd */ 0xe8a68f, 0xe8a8aa, 0xe8a89d, 0xe8a8a3,
+ /* c1 */ 0xe8a8a5, 0xe8a8b1, 0xe8a8ad, 0xe8a89f,
+ /* c5 */ 0xe8a89b, 0xe8a8a2, 0xe8b189, 0xe8b19a,
+ /* c9 */ 0xe8b2a9, 0xe8b2ac, 0xe8b2ab, 0xe8b2a8,
+ /* cd */ 0xe8b2aa, 0xe8b2a7, 0xe8b5a7, 0xe8b5a6,
+ /* d1 */ 0xe8b6be, 0xe8b6ba, 0xe8bb9b, 0xe8bb9f,
+ /* d5 */ 0xe98099, 0xe9808d, 0xe9809a, 0xe98097,
+ /* d9 */ 0xe980a3, 0xe9809f, 0xe9809d, 0xe98090,
+ /* dd */ 0xe98095, 0xe9809e, 0xe980a0, 0xe9808f,
+ /* e1 */ 0xe980a2, 0xe98096, 0xe9809b, 0xe98094,
+ /* e5 */ 0xe983a8, 0xe983ad, 0xe983bd, 0xe98597,
+ /* e9 */ 0xe9878e, 0xe987b5, 0xe987a6, 0xe987a3,
+ /* ed */ 0xe987a7, 0xe987ad, 0xe987a9, 0xe99689,
+ /* f1 */ 0xe999aa, 0xe999b5, 0xe999b3, 0xe999b8,
+ /* f5 */ 0xe999b0, 0xe999b4, 0xe999b6, 0xe999b7,
+ /* f9 */ 0xe999ac, 0xe99b80, 0xe99baa, 0xe99ba9,
+ /* fd */ 0xe7aba0, 0xe7ab9f,
+
+ /*** Four byte table, leaf: 8ea1dexx - offset 0x025dd ***/
+
+ /* a1 */ 0xe9a082, 0xe9a083, 0xe9ad9a, 0xe9b3a5,
+ /* a5 */ 0xe9b9b5, 0xe9b9bf, 0xe9baa5, 0xe9babb,
+ /* a9 */ 0xe582a2, 0xe5828d, 0xe58285, 0xe58299,
+ /* ad */ 0xe58291, 0xe58280, 0xe58296, 0xe58298,
+ /* b1 */ 0xe5829a, 0xe69c80, 0xe587b1, 0xe589b2,
+ /* b5 */ 0xe589b4, 0xe589b5, 0xe589a9, 0xe58b9e,
+ /* b9 */ 0xe58b9d, 0xe58b9b, 0xe58d9a, 0xe58ea5,
+ /* bd */ 0xe595bb, 0xe59680, 0xe596a7, 0xe595bc,
+ /* c1 */ 0xe5968a, 0xe5969d, 0xe59698, 0xe59682,
+ /* c5 */ 0xe5969c, 0xe596aa, 0xe59694, 0xe59687,
+ /* c9 */ 0xe5968b, 0xe59683, 0xe596b3, 0xe596ae,
+ /* cd */ 0xe5969f, 0xe594be, 0xe596b2, 0xe5969a,
+ /* d1 */ 0xe596bb, 0xe596ac, 0xe596b1, 0xe595be,
+ /* d5 */ 0xe59689, 0xe596ab, 0xe59699, 0xe59c8d,
+ /* d9 */ 0xe5a0af, 0xe5a0aa, 0xe5a0b4, 0xe5a0a4,
+ /* dd */ 0xe5a0b0, 0xe5a0b1, 0xe5a0a1, 0xe5a09d,
+ /* e1 */ 0xe5a0a0, 0xe5a3b9, 0xe5a3ba, 0xe5a5a0,
+ /* e5 */ 0xe5a9b7, 0xe5aa9a, 0xe5a9bf, 0xe5aa92,
+ /* e9 */ 0xe5aa9b, 0xe5aaa7, 0xe5adb3, 0xe5adb1,
+ /* ed */ 0xe5af92, 0xe5af8c, 0xe5af93, 0xe5af90,
+ /* f1 */ 0xe5b08a, 0xe5b08b, 0xe5b0b1, 0xe5b58c,
+ /* f5 */ 0xe5b590, 0xe5b4b4, 0xe5b587, 0xe5b7bd,
+ /* f9 */ 0xe5b985, 0xe5b8bd, 0xe5b980, 0xe5b983,
+ /* fd */ 0xe5b9be, 0xe5bb8a,
+
+ /*** Four byte table, leaf: 8ea1dfxx - offset 0x0263b ***/
+
+ /* a1 */ 0xe5bb81, 0xe5bb82, 0xe5bb84, 0xe5bcbc,
+ /* a5 */ 0xe5bdad, 0xe5bea9, 0xe5beaa, 0xe5bea8,
+ /* a9 */ 0xe68391, 0xe683a1, 0xe682b2, 0xe682b6,
+ /* ad */ 0xe683a0, 0xe6849c, 0xe684a3, 0xe683ba,
+ /* b1 */ 0xe68495, 0xe683b0, 0xe683bb, 0xe683b4,
+ /* b5 */ 0xe685a8, 0xe683b1, 0xe6848e, 0xe683b6,
+ /* b9 */ 0xe68489, 0xe68480, 0xe68492, 0xe6889f,
+ /* bd */ 0xe68989, 0xe68ea3, 0xe68e8c, 0xe68f8f,
+ /* c1 */ 0xe68f80, 0xe68fa9, 0xe68f89, 0xe68f86,
+ /* c5 */ 0xe68f8d, 0xe68f92, 0xe68fa3, 0xe68f90,
+ /* c9 */ 0xe68fa1, 0xe68f96, 0xe68fad, 0xe68fae,
+ /* cd */ 0xe68db6, 0xe68fb4, 0xe68faa, 0xe68f9b,
+ /* d1 */ 0xe69192, 0xe68f9a, 0xe68fb9, 0xe6959e,
+ /* d5 */ 0xe695a6, 0xe695a2, 0xe695a3, 0xe69691,
+ /* d9 */ 0xe69690, 0xe696af, 0xe699ae, 0xe699b0,
+ /* dd */ 0xe699b4, 0xe699b6, 0xe699af, 0xe69a91,
+ /* e1 */ 0xe699ba, 0xe699be, 0xe699b7, 0xe69bbe,
+ /* e5 */ 0xe69bbf, 0xe69c9f, 0xe69c9d, 0xe6a3ba,
+ /* e9 */ 0xe6a395, 0xe6a3a0, 0xe6a398, 0xe6a397,
+ /* ed */ 0xe6a485, 0xe6a39f, 0xe6a3b5, 0xe6a3ae,
+ /* f1 */ 0xe6a3a7, 0xe6a3b9, 0xe6a392, 0xe6a3b2,
+ /* f5 */ 0xe6a3a3, 0xe6a38b, 0xe6a38d, 0xe6a48d,
+ /* f9 */ 0xe6a492, 0xe6a48e, 0xe6a389, 0xe6a39a,
+ /* fd */ 0xe6a5ae, 0xe6a3bb,
+
+ /*** Four byte table, leaf: 8ea1e0xx - offset 0x02699 ***/
+
+ /* a1 */ 0xe6acbe, 0xe6acba, 0xe6acbd, 0xe6ae98,
+ /* a5 */ 0xe6ae96, 0xe6aebc, 0xe6afaf, 0xe6b0ae,
+ /* a9 */ 0xe6b0af, 0xe6b0ac, 0xe6b8af, 0xe6b8b8,
+ /* ad */ 0xe6b994, 0xe6b8a1, 0xe6b8b2, 0xe6b9a7,
+ /* b1 */ 0xe6b98a, 0xe6b8a0, 0xe6b8a5, 0xe6b8a3,
+ /* b5 */ 0xe6b89b, 0xe6b99b, 0xe6b998, 0xe6b8a4,
+ /* b9 */ 0xe6b996, 0xe6b9ae, 0xe6b8ad, 0xe6b8a6,
+ /* bd */ 0xe6b9af, 0xe6b8b4, 0xe6b98d, 0xe6b8ba,
+ /* c1 */ 0xe6b8ac, 0xe6b983, 0xe6b89d, 0xe6b8be,
+ /* c5 */ 0xe6bb8b, 0xe6ba89, 0xe6b899, 0xe6b98e,
+ /* c9 */ 0xe6b9a3, 0xe6b984, 0xe6b9b2, 0xe6b9a9,
+ /* cd */ 0xe6b99f, 0xe78499, 0xe7849a, 0xe784a6,
+ /* d1 */ 0xe784b0, 0xe784a1, 0xe784b6, 0xe785ae,
+ /* d5 */ 0xe7849c, 0xe7898c, 0xe78a84, 0xe78a80,
+ /* d9 */ 0xe78cb6, 0xe78ca5, 0xe78cb4, 0xe78ca9,
+ /* dd */ 0xe790ba, 0xe790aa, 0xe790b3, 0xe790a2,
+ /* e1 */ 0xe790a5, 0xe790b5, 0xe790b6, 0xe790b4,
+ /* e5 */ 0xe790af, 0xe7909b, 0xe790a6, 0xe790a8,
+ /* e9 */ 0xe794a5, 0xe794a6, 0xe795ab, 0xe795aa,
+ /* ed */ 0xe797a2, 0xe7979b, 0xe797a3, 0xe79799,
+ /* f1 */ 0xe79798, 0xe7979e, 0xe797a0, 0xe799bb,
+ /* f5 */ 0xe799bc, 0xe79a96, 0xe79a93, 0xe79ab4,
+ /* f9 */ 0xe79b9c, 0xe79d8f, 0xe79fad, 0xe7a19d,
+ /* fd */ 0xe7a1ac, 0xe7a1af,
+
+ /*** Four byte table, leaf: 8ea1e1xx - offset 0x026f7 ***/
+
+ /* a1 */ 0xe7a88d, 0xe7a888, 0xe7a88b, 0xe7a885,
+ /* a5 */ 0xe7a880, 0xe7aa98, 0xe7aa97, 0xe7aa96,
+ /* a9 */ 0xe7aba5, 0xe7aba3, 0xe7ad89, 0xe7ad96,
+ /* ad */ 0xe7ad86, 0xe7ad90, 0xe7ad92, 0xe7ad94,
+ /* b1 */ 0xe7ad8d, 0xe7ad8b, 0xe7ad8f, 0xe7ad91,
+ /* b5 */ 0xe7b29f, 0xe7b2a5, 0xe7b59e, 0xe7b590,
+ /* b9 */ 0xe7b5a8, 0xe7b595, 0xe7b4ab, 0xe7b5ae,
+ /* bd */ 0xe7b5b2, 0xe7b5a1, 0xe7b5a6, 0xe7b5a2,
+ /* c1 */ 0xe7b5b0, 0xe7b5b3, 0xe59684, 0xe7bf94,
+ /* c5 */ 0xe7bf95, 0xe8808b, 0xe88192, 0xe88285,
+ /* c9 */ 0xe88595, 0xe88594, 0xe8858b, 0xe88591,
+ /* cd */ 0xe8858e, 0xe884b9, 0xe88586, 0xe884be,
+ /* d1 */ 0xe8858c, 0xe88593, 0xe885b4, 0xe88892,
+ /* d5 */ 0xe8889c, 0xe88fa9, 0xe89083, 0xe88fb8,
+ /* d9 */ 0xe8908d, 0xe88fa0, 0xe88f85, 0xe8908b,
+ /* dd */ 0xe88f81, 0xe88faf, 0xe88fb1, 0xe88fb4,
+ /* e1 */ 0xe89197, 0xe8908a, 0xe88fb0, 0xe8908c,
+ /* e5 */ 0xe88f8c, 0xe88fbd, 0xe88fb2, 0xe88f8a,
+ /* e9 */ 0xe890b8, 0xe8908e, 0xe89084, 0xe88f9c,
+ /* ed */ 0xe89087, 0xe88f94, 0xe88f9f, 0xe8999b,
+ /* f1 */ 0xe89b9f, 0xe89b99, 0xe89bad, 0xe89b94,
+ /* f5 */ 0xe89b9b, 0xe89ba4, 0xe89b90, 0xe89b9e,
+ /* f9 */ 0xe8a197, 0xe8a381, 0xe8a382, 0xe8a2b1,
+ /* fd */ 0xe8a683, 0xe8a696,
+
+ /*** Four byte table, leaf: 8ea1e2xx - offset 0x02755 ***/
+
+ /* a1 */ 0xe8a8bb, 0xe8a9a0, 0xe8a995, 0xe8a99e,
+ /* a5 */ 0xe8a8bc, 0xe8a981, 0xe8a994, 0xe8a99b,
+ /* a9 */ 0xe8a990, 0xe8a986, 0xe8a8b4, 0xe8a8ba,
+ /* ad */ 0xe8a8b6, 0xe8a996, 0xe8b1a1, 0xe8b282,
+ /* b1 */ 0xe8b2af, 0xe8b2bc, 0xe8b2b3, 0xe8b2bd,
+ /* b5 */ 0xe8b381, 0xe8b2bb, 0xe8b380, 0xe8b2b4,
+ /* b9 */ 0xe8b2b7, 0xe8b2b6, 0xe8b2bf, 0xe8b2b8,
+ /* bd */ 0xe8b68a, 0xe8b685, 0xe8b681, 0xe8b78e,
+ /* c1 */ 0xe8b79d, 0xe8b78b, 0xe8b79a, 0xe8b791,
+ /* c5 */ 0xe8b78c, 0xe8b79b, 0xe8b786, 0xe8bbbb,
+ /* c9 */ 0xe8bbb8, 0xe8bbbc, 0xe8be9c, 0xe980ae,
+ /* cd */ 0xe980b5, 0xe980b1, 0xe980b8, 0xe980b2,
+ /* d1 */ 0xe980b6, 0xe98482, 0xe983b5, 0xe98489,
+ /* d5 */ 0xe983be, 0xe985a3, 0xe985a5, 0xe9878f,
+ /* d9 */ 0xe98894, 0xe98895, 0xe988a3, 0xe98889,
+ /* dd */ 0xe9889e, 0xe9888d, 0xe98890, 0xe98887,
+ /* e1 */ 0xe98891, 0xe99694, 0xe9968f, 0xe9968b,
+ /* e5 */ 0xe99691, 0xe99693, 0xe99692, 0xe9968e,
+ /* e9 */ 0xe99a8a, 0xe99a8e, 0xe99a8b, 0xe999bd,
+ /* ed */ 0xe99a85, 0xe99a86, 0xe99a8d, 0xe999b2,
+ /* f1 */ 0xe99a84, 0xe99b81, 0xe99b85, 0xe99b84,
+ /* f5 */ 0xe99b86, 0xe99b87, 0xe99baf, 0xe99bb2,
+ /* f9 */ 0xe99f8c, 0xe9a085, 0xe9a086, 0xe9a088,
+ /* fd */ 0xe9a3a7, 0xe9a3aa,
+
+ /*** Four byte table, leaf: 8ea1e3xx - offset 0x027b3 ***/
+
+ /* a1 */ 0xe9a3af, 0xe9a3a9, 0xe9a3b2, 0xe9a3ad,
+ /* a5 */ 0xe9a6ae, 0xe9a6ad, 0xe9bb83, 0xe9bb8d,
+ /* a9 */ 0xe9bb91, 0xe4ba82, 0xe582ad, 0xe582b5,
+ /* ad */ 0xe582b2, 0xe582b3, 0xe58385, 0xe582be,
+ /* b1 */ 0xe582ac, 0xe582b7, 0xe582bb, 0xe582af,
+ /* b5 */ 0xe58387, 0xe589bf, 0xe589b7, 0xe589bd,
+ /* b9 */ 0xe58b9f, 0xe58ba6, 0xe58ba4, 0xe58ba2,
+ /* bd */ 0xe58ba3, 0xe58caf, 0xe5979f, 0xe597a8,
+ /* c1 */ 0xe59793, 0xe597a6, 0xe5978e, 0xe5979c,
+ /* c5 */ 0xe59787, 0xe59791, 0xe597a3, 0xe597a4,
+ /* c9 */ 0xe597af, 0xe5979a, 0xe597a1, 0xe59785,
+ /* cd */ 0xe59786, 0xe597a5, 0xe59789, 0xe59c92,
+ /* d1 */ 0xe59c93, 0xe5a19e, 0xe5a191, 0xe5a198,
+ /* d5 */ 0xe5a197, 0xe5a19a, 0xe5a194, 0xe5a1ab,
+ /* d9 */ 0xe5a18c, 0xe5a1ad, 0xe5a18a, 0xe5a1a2,
+ /* dd */ 0xe5a192, 0xe5a18b, 0xe5a5a7, 0xe5ab81,
+ /* e1 */ 0xe5ab89, 0xe5ab8c, 0xe5aabe, 0xe5aabd,
+ /* e5 */ 0xe5aabc, 0xe5aab3, 0xe5ab82, 0xe5aab2,
+ /* e9 */ 0xe5b5a9, 0xe5b5af, 0xe5b98c, 0xe5b9b9,
+ /* ed */ 0xe5bb89, 0xe5bb88, 0xe5bc92, 0xe5bd99,
+ /* f1 */ 0xe5beac, 0xe5beae, 0xe6849a, 0xe6848f,
+ /* f5 */ 0xe68588, 0xe6849f, 0xe683b3, 0xe6849b,
+ /* f9 */ 0xe683b9, 0xe68481, 0xe68488, 0xe6858e,
+ /* fd */ 0xe6858c, 0xe68584,
+
+ /*** Four byte table, leaf: 8ea1e4xx - offset 0x02811 ***/
+
+ /* a1 */ 0xe6858d, 0xe684be, 0xe684b4, 0xe684a7,
+ /* a5 */ 0xe6848d, 0xe68486, 0xe684b7, 0xe688a1,
+ /* a9 */ 0xe688a2, 0xe69093, 0xe690be, 0xe6909e,
+ /* ad */ 0xe690aa, 0xe690ad, 0xe690bd, 0xe690ac,
+ /* b1 */ 0xe6908f, 0xe6909c, 0xe69094, 0xe6908d,
+ /* b5 */ 0xe690b6, 0xe69096, 0xe69097, 0xe69086,
+ /* b9 */ 0xe695ac, 0xe6969f, 0xe696b0, 0xe69a97,
+ /* bd */ 0xe69a89, 0xe69a87, 0xe69a88, 0xe69a96,
+ /* c1 */ 0xe69a84, 0xe69a98, 0xe69a8d, 0xe69c83,
+ /* c5 */ 0xe6a694, 0xe6a5ad, 0xe6a59a, 0xe6a5b7,
+ /* c9 */ 0xe6a5a0, 0xe6a594, 0xe6a5b5, 0xe6a4b0,
+ /* cd */ 0xe6a682, 0xe6a58a, 0xe6a5a8, 0xe6a5ab,
+ /* d1 */ 0xe6a59e, 0xe6a593, 0xe6a5b9, 0xe6a686,
+ /* d5 */ 0xe6a59d, 0xe6a5a3, 0xe6a59b, 0xe6ad87,
+ /* d9 */ 0xe6adb2, 0xe6af80, 0xe6aebf, 0xe6af93,
+ /* dd */ 0xe6afbd, 0xe6baa2, 0xe6baaf, 0xe6bb93,
+ /* e1 */ 0xe6bab6, 0xe6bb82, 0xe6ba90, 0xe6ba9d,
+ /* e5 */ 0xe6bb87, 0xe6bb85, 0xe6baa5, 0xe6ba98,
+ /* e9 */ 0xe6babc, 0xe6baba, 0xe6baab, 0xe6bb91,
+ /* ed */ 0xe6ba96, 0xe6ba9c, 0xe6bb84, 0xe6bb94,
+ /* f1 */ 0xe6baaa, 0xe6baa7, 0xe6bab4, 0xe7858e,
+ /* f5 */ 0xe78599, 0xe785a9, 0xe785a4, 0xe78589,
+ /* f9 */ 0xe785a7, 0xe7859c, 0xe785ac, 0xe785a6,
+ /* fd */ 0xe7858c, 0xe785a5,
+
+ /*** Four byte table, leaf: 8ea1e5xx - offset 0x0286f ***/
+
+ /* a1 */ 0xe7859e, 0xe78586, 0xe785a8, 0xe78596,
+ /* a5 */ 0xe788ba, 0xe78992, 0xe78cb7, 0xe78d85,
+ /* a9 */ 0xe78cbf, 0xe78cbe, 0xe791af, 0xe7919a,
+ /* ad */ 0xe79195, 0xe7919f, 0xe7919e, 0xe79181,
+ /* b1 */ 0xe790bf, 0xe79199, 0xe7919b, 0xe7919c,
+ /* b5 */ 0xe795b6, 0xe795b8, 0xe79880, 0xe797b0,
+ /* b9 */ 0xe79881, 0xe797b2, 0xe797b1, 0xe797ba,
+ /* bd */ 0xe797bf, 0xe797b4, 0xe797b3, 0xe79b9e,
+ /* c1 */ 0xe79b9f, 0xe79d9b, 0xe79dab, 0xe79da6,
+ /* c5 */ 0xe79d9e, 0xe79da3, 0xe79db9, 0xe79daa,
+ /* c9 */ 0xe79dac, 0xe79d9c, 0xe79da5, 0xe79da8,
+ /* cd */ 0xe79da2, 0xe79fae, 0xe7a28e, 0xe7a2b0,
+ /* d1 */ 0xe7a297, 0xe7a298, 0xe7a28c, 0xe7a289,
+ /* d5 */ 0xe7a1bc, 0xe7a291, 0xe7a293, 0xe7a1bf,
+ /* d9 */ 0xe7a5ba, 0xe7a5bf, 0xe7a681, 0xe890ac,
+ /* dd */ 0xe7a6bd, 0xe7a89c, 0xe7a89a, 0xe7a8a0,
+ /* e1 */ 0xe7a894, 0xe7a89f, 0xe7a89e, 0xe7aa9f,
+ /* e5 */ 0xe7aaa0, 0xe7adb7, 0xe7af80, 0xe7ada0,
+ /* e9 */ 0xe7adae, 0xe7ada7, 0xe7b2b1, 0xe7b2b3,
+ /* ed */ 0xe7b2b5, 0xe7b693, 0xe7b5b9, 0xe7b691,
+ /* f1 */ 0xe7b681, 0xe7b68f, 0xe7b59b, 0xe7bdae,
+ /* f5 */ 0xe7bda9, 0xe7bdaa, 0xe7bdb2, 0xe7bea9,
+ /* f9 */ 0xe7bea8, 0xe7bea4, 0xe88196, 0xe88198,
+ /* fd */ 0xe88286, 0xe88284,
+
+ /*** Four byte table, leaf: 8ea1e6xx - offset 0x028cd ***/
+
+ /* a1 */ 0xe885b1, 0xe885b0, 0xe885b8, 0xe885a5,
+ /* a5 */ 0xe885ae, 0xe885b3, 0xe885ab, 0xe885b9,
+ /* a9 */ 0xe885ba, 0xe885a6, 0xe88885, 0xe88987,
+ /* ad */ 0xe89282, 0xe891b7, 0xe890bd, 0xe890b1,
+ /* b1 */ 0xe891b5, 0xe891a6, 0xe891ab, 0xe89189,
+ /* b5 */ 0xe891ac, 0xe8919b, 0xe890bc, 0xe890b5,
+ /* b9 */ 0xe891a1, 0xe891a3, 0xe891a9, 0xe891ad,
+ /* bd */ 0xe89186, 0xe8999e, 0xe8999c, 0xe8999f,
+ /* c1 */ 0xe89bb9, 0xe89c93, 0xe89c88, 0xe89c87,
+ /* c5 */ 0xe89c80, 0xe89bbe, 0xe89bbb, 0xe89c82,
+ /* c9 */ 0xe89c83, 0xe89c86, 0xe89c8a, 0xe8a199,
+ /* cd */ 0xe8a39f, 0xe8a394, 0xe8a399, 0xe8a39c,
+ /* d1 */ 0xe8a398, 0xe8a39d, 0xe8a3a1, 0xe8a38a,
+ /* d5 */ 0xe8a395, 0xe8a392, 0xe8a69c, 0xe8a7a3,
+ /* d9 */ 0xe8a9ab, 0xe8a9b2, 0xe8a9b3, 0xe8a9a6,
+ /* dd */ 0xe8a9a9, 0xe8a9b0, 0xe8aa87, 0xe8a9bc,
+ /* e1 */ 0xe8a9a3, 0xe8aaa0, 0xe8a9b1, 0xe8aa85,
+ /* e5 */ 0xe8a9ad, 0xe8a9a2, 0xe8a9ae, 0xe8a9ac,
+ /* e9 */ 0xe8a9b9, 0xe8a9bb, 0xe8a8be, 0xe8a9a8,
+ /* ed */ 0xe8b1a2, 0xe8b28a, 0xe8b289, 0xe8b38a,
+ /* f1 */ 0xe8b387, 0xe8b388, 0xe8b384, 0xe8b2b2,
+ /* f5 */ 0xe8b383, 0xe8b382, 0xe8b385, 0xe8b7a1,
+ /* f9 */ 0xe8b79f, 0xe8b7a8, 0xe8b7af, 0xe8b7b3,
+ /* fd */ 0xe8b7ba, 0xe8b7aa,
+
+ /*** Four byte table, leaf: 8ea1e7xx - offset 0x0292b ***/
+
+ /* a1 */ 0xe8b7a4, 0xe8b7a6, 0xe8bab2, 0xe8bc83,
+ /* a5 */ 0xe8bc89, 0xe8bbbe, 0xe8bc8a, 0xe8be9f,
+ /* a9 */ 0xe8beb2, 0xe9818b, 0xe9818a, 0xe98193,
+ /* ad */ 0xe98182, 0xe98194, 0xe980bc, 0xe98195,
+ /* b1 */ 0xe98190, 0xe98187, 0xe9818f, 0xe9818e,
+ /* b5 */ 0xe9818d, 0xe98191, 0xe980be, 0xe98181,
+ /* b9 */ 0xe98492, 0xe98497, 0xe985ac, 0xe985aa,
+ /* bd */ 0xe985a9, 0xe98789, 0xe988b7, 0xe98997,
+ /* c1 */ 0xe988b8, 0xe988bd, 0xe98980, 0xe988be,
+ /* c5 */ 0xe9899b, 0xe9898b, 0xe989a4, 0xe98991,
+ /* c9 */ 0xe988b4, 0xe98989, 0xe9898d, 0xe98985,
+ /* cd */ 0xe988b9, 0xe988bf, 0xe9899a, 0xe99698,
+ /* d1 */ 0xe99a98, 0xe99a94, 0xe99a95, 0xe99b8d,
+ /* d5 */ 0xe99b8b, 0xe99b89, 0xe99b8a, 0xe99bb7,
+ /* d9 */ 0xe99bbb, 0xe99bb9, 0xe99bb6, 0xe99d96,
+ /* dd */ 0xe99db4, 0xe99db6, 0xe9a090, 0xe9a091,
+ /* e1 */ 0xe9a093, 0xe9a08a, 0xe9a092, 0xe9a08c,
+ /* e5 */ 0xe9a3bc, 0xe9a3b4, 0xe9a3bd, 0xe9a3be,
+ /* e9 */ 0xe9a6b3, 0xe9a6b1, 0xe9a6b4, 0xe9aba1,
+ /* ed */ 0xe9b3a9, 0xe9ba82, 0xe9bc8e, 0xe9bc93,
+ /* f1 */ 0xe9bca0, 0xe583a7, 0xe583ae, 0xe583a5,
+ /* f5 */ 0xe58396, 0xe583ad, 0xe5839a, 0xe58395,
+ /* f9 */ 0xe5838f, 0xe58391, 0xe583b1, 0xe5838e,
+ /* fd */ 0xe583a9, 0xe585a2,
+
+ /*** Four byte table, leaf: 8ea1e8xx - offset 0x02989 ***/
+
+ /* a1 */ 0xe587b3, 0xe58a83, 0xe58a82, 0xe58cb1,
+ /* a5 */ 0xe58ead, 0xe597be, 0xe59880, 0xe5989b,
+ /* a9 */ 0xe59897, 0xe597bd, 0xe59894, 0xe59886,
+ /* ad */ 0xe59889, 0xe5988d, 0xe5988e, 0xe597b7,
+ /* b1 */ 0xe59896, 0xe5989f, 0xe59888, 0xe59890,
+ /* b5 */ 0xe597b6, 0xe59c98, 0xe59c96, 0xe5a1b5,
+ /* b9 */ 0xe5a1be, 0xe5a283, 0xe5a293, 0xe5a28a,
+ /* bd */ 0xe5a1b9, 0xe5a285, 0xe5a1bd, 0xe5a3bd,
+ /* c1 */ 0xe5a4a5, 0xe5a4a2, 0xe5a4a4, 0xe5a5aa,
+ /* c5 */ 0xe5a5a9, 0xe5aba1, 0xe5aba6, 0xe5aba9,
+ /* c9 */ 0xe5ab97, 0xe5ab96, 0xe5ab98, 0xe5aba3,
+ /* cd */ 0xe5adb5, 0xe5af9e, 0xe5afa7, 0xe5afa1,
+ /* d1 */ 0xe5afa5, 0xe5afa6, 0xe5afa8, 0xe5afa2,
+ /* d5 */ 0xe5afa4, 0xe5af9f, 0xe5b08d, 0xe5b1a2,
+ /* d9 */ 0xe5b684, 0xe5b687, 0xe5b99b, 0xe5b9a3,
+ /* dd */ 0xe5b995, 0xe5b997, 0xe5b994, 0xe5bb93,
+ /* e1 */ 0xe5bb96, 0xe5bc8a, 0xe5bd86, 0xe5bdb0,
+ /* e5 */ 0xe5beb9, 0xe68587, 0xe684bf, 0xe6858b,
+ /* e9 */ 0xe685b7, 0xe685a2, 0xe685a3, 0xe6859f,
+ /* ed */ 0xe6859a, 0xe68598, 0xe685b5, 0xe688aa,
+ /* f1 */ 0xe69287, 0xe69198, 0xe69194, 0xe692a4,
+ /* f5 */ 0xe691b8, 0xe6919f, 0xe691ba, 0xe69191,
+ /* f9 */ 0xe691a7, 0xe690b4, 0xe691ad, 0xe691bb,
+ /* fd */ 0xe695b2, 0xe696a1,
+
+ /*** Four byte table, leaf: 8ea1e9xx - offset 0x029e7 ***/
+
+ /* a1 */ 0xe69797, 0xe69796, 0xe69aa2, 0xe69aa8,
+ /* a5 */ 0xe69a9d, 0xe6a69c, 0xe6a6a8, 0xe6a695,
+ /* a9 */ 0xe6a781, 0xe6a6ae, 0xe6a793, 0xe6a78b,
+ /* ad */ 0xe6a69b, 0xe6a6b7, 0xe6a6bb, 0xe6a6ab,
+ /* b1 */ 0xe6a6b4, 0xe6a790, 0xe6a78d, 0xe6a6ad,
+ /* b5 */ 0xe6a78c, 0xe6a6a6, 0xe6a783, 0xe6a6a3,
+ /* b9 */ 0xe6ad89, 0xe6ad8c, 0xe6b0b3, 0xe6bcb3,
+ /* bd */ 0xe6bc94, 0xe6bbbe, 0xe6bc93, 0xe6bbb4,
+ /* c1 */ 0xe6bca9, 0xe6bcbe, 0xe6bca0, 0xe6bcac,
+ /* c5 */ 0xe6bc8f, 0xe6bc82, 0xe6bca2, 0xe6bbbf,
+ /* c9 */ 0xe6bbaf, 0xe6bc86, 0xe6bcb1, 0xe6bcb8,
+ /* cd */ 0xe6bcb2, 0xe6bca3, 0xe6bc95, 0xe6bcab,
+ /* d1 */ 0xe6bcaf, 0xe6be88, 0xe6bcaa, 0xe6bbac,
+ /* d5 */ 0xe6bc81, 0xe6bbb2, 0xe6bb8c, 0xe6bbb7,
+ /* d9 */ 0xe78694, 0xe78699, 0xe785bd, 0xe7868a,
+ /* dd */ 0xe78684, 0xe78692, 0xe788be, 0xe78a92,
+ /* e1 */ 0xe78a96, 0xe78d84, 0xe78d90, 0xe791a4,
+ /* e5 */ 0xe791a3, 0xe791aa, 0xe791b0, 0xe791ad,
+ /* e9 */ 0xe79484, 0xe79691, 0xe798a7, 0xe7988d,
+ /* ed */ 0xe7988b, 0xe79889, 0xe79893, 0xe79ba1,
+ /* f1 */ 0xe79ba3, 0xe79e84, 0xe79dbd, 0xe79dbf,
+ /* f5 */ 0xe79da1, 0xe7a381, 0xe7a29f, 0xe7a2a7,
+ /* f9 */ 0xe7a2b3, 0xe7a2a9, 0xe7a2a3, 0xe7a68e,
+ /* fd */ 0xe7a68f, 0xe7a68d,
+
+ /*** Four byte table, leaf: 8ea1eaxx - offset 0x02a45 ***/
+
+ /* a1 */ 0xe7a8ae, 0xe7a8b1, 0xe7aaaa, 0xe7aaa9,
+ /* a5 */ 0xe7abad, 0xe7abaf, 0xe7aea1, 0xe7ae95,
+ /* a9 */ 0xe7ae8b, 0xe7adb5, 0xe7ae97, 0xe7ae9d,
+ /* ad */ 0xe7ae94, 0xe7ae8f, 0xe7aeb8, 0xe7ae87,
+ /* b1 */ 0xe7ae84, 0xe7b2b9, 0xe7b2bd, 0xe7b2be,
+ /* b5 */ 0xe7b6bb, 0xe7b6b0, 0xe7b69c, 0xe7b6bd,
+ /* b9 */ 0xe7b6be, 0xe7b6a0, 0xe7b78a, 0xe7b6b4,
+ /* bd */ 0xe7b6b2, 0xe7b6b1, 0xe7b6ba, 0xe7b6a2,
+ /* c1 */ 0xe7b6bf, 0xe7b6b5, 0xe7b6b8, 0xe7b6ad,
+ /* c5 */ 0xe7b792, 0xe7b787, 0xe7b6ac, 0xe7bdb0,
+ /* c9 */ 0xe7bfa0, 0xe7bfa1, 0xe7bf9f, 0xe8819e,
+ /* cd */ 0xe8819a, 0xe88287, 0xe88590, 0xe88680,
+ /* d1 */ 0xe8868f, 0xe88688, 0xe8868a, 0xe885bf,
+ /* d5 */ 0xe88682, 0xe887a7, 0xe887ba, 0xe88887,
+ /* d9 */ 0xe88894, 0xe8889e, 0xe8898b, 0xe89389,
+ /* dd */ 0xe892bf, 0xe89386, 0xe89384, 0xe89299,
+ /* e1 */ 0xe8929e, 0xe892b2, 0xe8929c, 0xe8938b,
+ /* e5 */ 0xe892b8, 0xe89380, 0xe89393, 0xe89290,
+ /* e9 */ 0xe892bc, 0xe89391, 0xe8938a, 0xe89cbf,
+ /* ed */ 0xe89c9c, 0xe89cbb, 0xe89ca2, 0xe89ca5,
+ /* f1 */ 0xe89cb4, 0xe89c98, 0xe89d95, 0xe89cb7,
+ /* f5 */ 0xe89ca9, 0xe8a3b3, 0xe8a482, 0xe8a3b4,
+ /* f9 */ 0xe8a3b9, 0xe8a3b8, 0xe8a3bd, 0xe8a3a8,
+ /* fd */ 0xe8a49a, 0xe8a3af,
+
+ /*** Four byte table, leaf: 8ea1ebxx - offset 0x02aa3 ***/
+
+ /* a1 */ 0xe8aaa6, 0xe8aa8c, 0xe8aa9e, 0xe8aaa3,
+ /* a5 */ 0xe8aa8d, 0xe8aaa1, 0xe8aa93, 0xe8aaa4,
+ /* a9 */ 0xe8aaaa, 0xe8aaa5, 0xe8aaa8, 0xe8aa98,
+ /* ad */ 0xe8aa91, 0xe8aa9a, 0xe8aaa7, 0xe8b1aa,
+ /* b1 */ 0xe8b28d, 0xe8b28c, 0xe8b393, 0xe8b391,
+ /* b5 */ 0xe8b392, 0xe8b5ab, 0xe8b699, 0xe8b695,
+ /* b9 */ 0xe8b7bc, 0xe8bc94, 0xe8bc92, 0xe8bc95,
+ /* bd */ 0xe8bc93, 0xe8bea3, 0xe981a0, 0xe98198,
+ /* c1 */ 0xe9819c, 0xe981a3, 0xe98199, 0xe9819e,
+ /* c5 */ 0xe981a2, 0xe9819d, 0xe9819b, 0xe98499,
+ /* c9 */ 0xe98498, 0xe9849e, 0xe985b5, 0xe985b8,
+ /* cd */ 0xe985b7, 0xe985b4, 0xe989b8, 0xe98aac,
+ /* d1 */ 0xe98a80, 0xe98a85, 0xe98a98, 0xe98a96,
+ /* d5 */ 0xe989bb, 0xe98a93, 0xe98a9c, 0xe98aa8,
+ /* d9 */ 0xe989bc, 0xe98a91, 0xe996a1, 0xe996a8,
+ /* dd */ 0xe996a9, 0xe996a3, 0xe996a5, 0xe996a4,
+ /* e1 */ 0xe99a99, 0xe99a9c, 0xe99a9b, 0xe99b8c,
+ /* e5 */ 0xe99b92, 0xe99c80, 0xe99dbc, 0xe99e85,
+ /* e9 */ 0xe99fb6, 0xe9a097, 0xe9a098, 0xe9a2af,
+ /* ed */ 0xe9a2b1, 0xe9a483, 0xe9a485, 0xe9a48c,
+ /* f1 */ 0xe9a489, 0xe9a781, 0xe9aaaf, 0xe9aab0,
+ /* f5 */ 0xe9aba6, 0xe9ad81, 0xe9ad82, 0xe9b3b4,
+ /* f9 */ 0xe9b3b6, 0xe9b3b3, 0xe9babc, 0xe9bcbb,
+ /* fd */ 0xe9bd8a, 0xe58484,
+
+ /*** Four byte table, leaf: 8ea1ecxx - offset 0x02b01 ***/
+
+ /* a1 */ 0xe58480, 0xe583bb, 0xe583b5, 0xe583b9,
+ /* a5 */ 0xe58482, 0xe58488, 0xe58489, 0xe58485,
+ /* a9 */ 0xe5879c, 0xe58a87, 0xe58a88, 0xe58a89,
+ /* ad */ 0xe58a8d, 0xe58a8a, 0xe58bb0, 0xe58eb2,
+ /* b1 */ 0xe598ae, 0xe598bb, 0xe598b9, 0xe598b2,
+ /* b5 */ 0xe598bf, 0xe598b4, 0xe598a9, 0xe59993,
+ /* b9 */ 0xe5998e, 0xe59997, 0xe599b4, 0xe598b6,
+ /* bd */ 0xe598af, 0xe598b0, 0xe5a280, 0xe5a29f,
+ /* c1 */ 0xe5a29e, 0xe5a2b3, 0xe5a29c, 0xe5a2ae,
+ /* c5 */ 0xe5a2a9, 0xe5a2a6, 0xe5a5ad, 0xe5ac89,
+ /* c9 */ 0xe5abbb, 0xe5ac8b, 0xe5abb5, 0xe5ac8c,
+ /* cd */ 0xe5ac88, 0xe5afae, 0xe5afac, 0xe5afa9,
+ /* d1 */ 0xe5afab, 0xe5b1a4, 0xe5b1a5, 0xe5b69d,
+ /* d5 */ 0xe5b694, 0xe5b9a2, 0xe5b99f, 0xe5b9a1,
+ /* d9 */ 0xe5bba2, 0xe5bb9a, 0xe5bb9f, 0xe5bb9d,
+ /* dd */ 0xe5bba3, 0xe5bba0, 0xe5bd88, 0xe5bdb1,
+ /* e1 */ 0xe5beb7, 0xe5beb5, 0xe685b6, 0xe685a7,
+ /* e5 */ 0xe685ae, 0xe6859d, 0xe68595, 0xe68682,
+ /* e9 */ 0xe685bc, 0xe685b0, 0xe685ab, 0xe685be,
+ /* ed */ 0xe686a7, 0xe68690, 0xe686ab, 0xe6868e,
+ /* f1 */ 0xe686ac, 0xe6869a, 0xe686a4, 0xe68694,
+ /* f5 */ 0xe686ae, 0xe688ae, 0xe691a9, 0xe691af,
+ /* f9 */ 0xe691b9, 0xe6929e, 0xe692b2, 0xe69288,
+ /* fd */ 0xe69290, 0xe692b0,
+
+ /*** Four byte table, leaf: 8ea1edxx - offset 0x02b5f ***/
+
+ /* a1 */ 0xe692a5, 0xe69293, 0xe69295, 0xe692a9,
+ /* a5 */ 0xe69292, 0xe692ae, 0xe692ad, 0xe692ab,
+ /* a9 */ 0xe6929a, 0xe692ac, 0xe69299, 0xe692a2,
+ /* ad */ 0xe692b3, 0xe695b5, 0xe695b7, 0xe695b8,
+ /* b1 */ 0xe69aae, 0xe69aab, 0xe69ab4, 0xe69ab1,
+ /* b5 */ 0xe6a8a3, 0xe6a89f, 0xe6a7a8, 0xe6a881,
+ /* b9 */ 0xe6a89e, 0xe6a899, 0xe6a7bd, 0xe6a8a1,
+ /* bd */ 0xe6a893, 0xe6a88a, 0xe6a7b3, 0xe6a882,
+ /* c1 */ 0xe6a885, 0xe6a7ad, 0xe6a891, 0xe6ad90,
+ /* c5 */ 0xe6ad8e, 0xe6aea4, 0xe6af85, 0xe6af86,
+ /* c9 */ 0xe6bcbf, 0xe6bdbc, 0xe6be84, 0xe6bd91,
+ /* cd */ 0xe6bda6, 0xe6bd94, 0xe6be86, 0xe6bdad,
+ /* d1 */ 0xe6bd9b, 0xe6bdb8, 0xe6bdae, 0xe6be8e,
+ /* d5 */ 0xe6bdba, 0xe6bdb0, 0xe6bda4, 0xe6be97,
+ /* d9 */ 0xe6bd98, 0xe6bb95, 0xe6bdaf, 0xe6bda0,
+ /* dd */ 0xe6bd9f, 0xe7869f, 0xe786ac, 0xe786b1,
+ /* e1 */ 0xe786a8, 0xe78996, 0xe78a9b, 0xe78d8e,
+ /* e5 */ 0xe78d97, 0xe791a9, 0xe7928b, 0xe79283,
+ /* e9 */ 0xe791be, 0xe79280, 0xe795bf, 0xe798a0,
+ /* ed */ 0xe798a9, 0xe7989f, 0xe798a4, 0xe798a6,
+ /* f1 */ 0xe798a1, 0xe798a2, 0xe79a9a, 0xe79aba,
+ /* f5 */ 0xe79ba4, 0xe79e8e, 0xe79e87, 0xe79e8c,
+ /* f9 */ 0xe79e91, 0xe79e8b, 0xe7a38b, 0xe7a385,
+ /* fd */ 0xe7a2ba, 0xe7a38a,
+
+ /*** Four byte table, leaf: 8ea1eexx - offset 0x02bbd ***/
+
+ /* a1 */ 0xe7a2be, 0xe7a395, 0xe7a2bc, 0xe7a390,
+ /* a5 */ 0xe7a8bf, 0xe7a8bc, 0xe7a980, 0xe7a8bd,
+ /* a9 */ 0xe7a8b7, 0xe7a8bb, 0xe7aaaf, 0xe7aaae,
+ /* ad */ 0xe7aead, 0xe7aeb1, 0xe7af84, 0xe7aeb4,
+ /* b1 */ 0xe7af86, 0xe7af87, 0xe7af81, 0xe7aea0,
+ /* b5 */ 0xe7af8c, 0xe7b38a, 0xe7b7a0, 0xe7b7b4,
+ /* b9 */ 0xe7b7af, 0xe7b7bb, 0xe7b798, 0xe7b7ac,
+ /* bd */ 0xe7b79d, 0xe7b7a8, 0xe7b7a3, 0xe7b79a,
+ /* c1 */ 0xe7b79e, 0xe7b7a9, 0xe7b69e, 0xe7b799,
+ /* c5 */ 0xe7b7b2, 0xe7b7b9, 0xe7bdb5, 0xe7bdb7,
+ /* c9 */ 0xe7beaf, 0xe7bfa9, 0xe880a6, 0xe8869b,
+ /* cd */ 0xe8869c, 0xe8869d, 0xe886a0, 0xe8869a,
+ /* d1 */ 0xe88698, 0xe89497, 0xe894bd, 0xe8949a,
+ /* d5 */ 0xe893ae, 0xe894ac, 0xe894ad, 0xe89493,
+ /* d9 */ 0xe89491, 0xe894a3, 0xe894a1, 0xe89494,
+ /* dd */ 0xe893ac, 0xe894a5, 0xe893bf, 0xe89486,
+ /* e1 */ 0xe89e82, 0xe89db4, 0xe89db6, 0xe89da0,
+ /* e5 */ 0xe89da6, 0xe89db8, 0xe89da8, 0xe89d99,
+ /* e9 */ 0xe89d97, 0xe89d8c, 0xe89d93, 0xe8a19b,
+ /* ed */ 0xe8a19d, 0xe8a490, 0xe8a487, 0xe8a492,
+ /* f1 */ 0xe8a493, 0xe8a495, 0xe8a48a, 0xe8aabc,
+ /* f5 */ 0xe8ab92, 0xe8ab87, 0xe8ab84, 0xe8aa95,
+ /* f9 */ 0xe8ab8b, 0xe8abb8, 0xe8aab2, 0xe8ab89,
+ /* fd */ 0xe8ab82, 0xe8aabf,
+
+ /*** Four byte table, leaf: 8ea1efxx - offset 0x02c1b ***/
+
+ /* a1 */ 0xe8aab0, 0xe8ab96, 0xe8ab8d, 0xe8aab6,
+ /* a5 */ 0xe8aab9, 0xe8ab9b, 0xe8b18c, 0xe8b18e,
+ /* a9 */ 0xe8b1ac, 0xe8b3a0, 0xe8b39e, 0xe8b3a6,
+ /* ad */ 0xe8b3a4, 0xe8b3ac, 0xe8b3ad, 0xe8b3a2,
+ /* b1 */ 0xe8b3a3, 0xe8b39c, 0xe8b3aa, 0xe8b3a1,
+ /* b5 */ 0xe8b5ad, 0xe8b69f, 0xe8b6a3, 0xe8b8ab,
+ /* b9 */ 0xe8b890, 0xe8b89d, 0xe8b8a2, 0xe8b88f,
+ /* bd */ 0xe8b8a9, 0xe8b89f, 0xe8b8a1, 0xe8b89e,
+ /* c1 */ 0xe8baba, 0xe8bc9d, 0xe8bc9b, 0xe8bc9f,
+ /* c5 */ 0xe8bca9, 0xe8bca6, 0xe8bcaa, 0xe8bc9c,
+ /* c9 */ 0xe8bc9e, 0xe8bca5, 0xe981a9, 0xe981ae,
+ /* cd */ 0xe981a8, 0xe981ad, 0xe981b7, 0xe984b0,
+ /* d1 */ 0xe984ad, 0xe984a7, 0xe984b1, 0xe98687,
+ /* d5 */ 0xe98689, 0xe9868b, 0xe98683, 0xe98b85,
+ /* d9 */ 0xe98abb, 0xe98ab7, 0xe98baa, 0xe98ba4,
+ /* dd */ 0xe98b81, 0xe98ab3, 0xe98abc, 0xe98b92,
+ /* e1 */ 0xe98b87, 0xe98bb0, 0xe98ab2, 0xe996ad,
+ /* e5 */ 0xe996b1, 0xe99c84, 0xe99c86, 0xe99c87,
+ /* e9 */ 0xe99c89, 0xe99da0, 0xe99e8d, 0xe99e8b,
+ /* ed */ 0xe99e8f, 0xe9a0a1, 0xe9a0ab, 0xe9a09c,
+ /* f1 */ 0xe9a2b3, 0xe9a48a, 0xe9a493, 0xe9a492,
+ /* f5 */ 0xe9a498, 0xe9a79d, 0xe9a790, 0xe9a79f,
+ /* f9 */ 0xe9a79b, 0xe9a791, 0xe9a795, 0xe9a792,
+ /* fd */ 0xe9a799, 0xe9aab7,
+
+ /*** Four byte table, leaf: 8ea1f0xx - offset 0x02c79 ***/
+
+ /* a1 */ 0xe9abae, 0xe9abaf, 0xe9aca7, 0xe9ad85,
+ /* a5 */ 0xe9ad84, 0xe9adb7, 0xe9adaf, 0xe9b486,
+ /* a9 */ 0xe9b489, 0xe9b483, 0xe9baa9, 0xe9babe,
+ /* ad */ 0xe9bb8e, 0xe5a2a8, 0xe9bd92, 0xe58492,
+ /* b1 */ 0xe58498, 0xe58494, 0xe58490, 0xe58495,
+ /* b5 */ 0xe58680, 0xe586aa, 0xe5879d, 0xe58a91,
+ /* b9 */ 0xe58a93, 0xe58bb3, 0xe59999, 0xe599ab,
+ /* bd */ 0xe599b9, 0xe599a9, 0xe599a4, 0xe599b8,
+ /* c1 */ 0xe599aa, 0xe599a8, 0xe599a5, 0xe599b1,
+ /* c5 */ 0xe599af, 0xe599ac, 0xe599a2, 0xe599b6,
+ /* c9 */ 0xe5a381, 0xe5a2be, 0xe5a387, 0xe5a385,
+ /* cd */ 0xe5a5ae, 0xe5ac9d, 0xe5acb4, 0xe5adb8,
+ /* d1 */ 0xe5afb0, 0xe5b08e, 0xe5bd8a, 0xe686b2,
+ /* d5 */ 0xe68691, 0xe686a9, 0xe6868a, 0xe6878d,
+ /* d9 */ 0xe686b6, 0xe686be, 0xe6878a, 0xe68788,
+ /* dd */ 0xe688b0, 0xe69385, 0xe69381, 0xe6938b,
+ /* e1 */ 0xe692bb, 0xe692bc, 0xe6939a, 0xe69384,
+ /* e5 */ 0xe69387, 0xe69382, 0xe6938d, 0xe692bf,
+ /* e9 */ 0xe69392, 0xe69394, 0xe692be, 0xe695b4,
+ /* ed */ 0xe69b86, 0xe69b89, 0xe69ab9, 0xe69b84,
+ /* f1 */ 0xe69b87, 0xe69ab8, 0xe6a8bd, 0xe6a8b8,
+ /* f5 */ 0xe6a8ba, 0xe6a999, 0xe6a9ab, 0xe6a998,
+ /* f9 */ 0xe6a8b9, 0xe6a984, 0xe6a9a2, 0xe6a9a1,
+ /* fd */ 0xe6a98b, 0xe6a987,
+
+ /*** Four byte table, leaf: 8ea1f1xx - offset 0x02cd7 ***/
+
+ /* a1 */ 0xe6a8b5, 0xe6a99f, 0xe6a988, 0xe6ad99,
+ /* a5 */ 0xe6adb7, 0xe6b085, 0xe6bf82, 0xe6beb1,
+ /* a9 */ 0xe6bea1, 0xe6bf83, 0xe6bea4, 0xe6bf81,
+ /* ad */ 0xe6bea7, 0xe6beb3, 0xe6bf80, 0xe6beb9,
+ /* b1 */ 0xe6beb6, 0xe6bea6, 0xe6bea0, 0xe6beb4,
+ /* b5 */ 0xe786be, 0xe78789, 0xe78790, 0xe78792,
+ /* b9 */ 0xe78788, 0xe78795, 0xe786b9, 0xe7878e,
+ /* bd */ 0xe78799, 0xe7879c, 0xe78783, 0xe78784,
+ /* c1 */ 0xe78da8, 0xe7929c, 0xe792a3, 0xe79298,
+ /* c5 */ 0xe7929f, 0xe7929e, 0xe793a2, 0xe7948c,
+ /* c9 */ 0xe7948d, 0xe798b4, 0xe798b8, 0xe798ba,
+ /* cd */ 0xe79ba7, 0xe79ba5, 0xe79ea0, 0xe79e9e,
+ /* d1 */ 0xe79e9f, 0xe79ea5, 0xe7a3a8, 0xe7a39a,
+ /* d5 */ 0xe7a3ac, 0xe7a3a7, 0xe7a6a6, 0xe7a98d,
+ /* d9 */ 0xe7a98e, 0xe7a986, 0xe7a98c, 0xe7a98b,
+ /* dd */ 0xe7aaba, 0xe7af99, 0xe7b091, 0xe7af89,
+ /* e1 */ 0xe7afa4, 0xe7af9b, 0xe7afa1, 0xe7afa9,
+ /* e5 */ 0xe7afa6, 0xe7b395, 0xe7b396, 0xe7b88a,
+ /* e9 */ 0xe7b891, 0xe7b888, 0xe7b89b, 0xe7b8a3,
+ /* ed */ 0xe7b89e, 0xe7b89d, 0xe7b889, 0xe7b890,
+ /* f1 */ 0xe7bdb9, 0xe7beb2, 0xe7bfb0, 0xe7bfb1,
+ /* f5 */ 0xe7bfae, 0xe880a8, 0xe886b3, 0xe886a9,
+ /* f9 */ 0xe886a8, 0xe887bb, 0xe88888, 0xe88998,
+ /* fd */ 0xe88999, 0xe8958a,
+
+ /*** Four byte table, leaf: 8ea1f2xx - offset 0x02d35 ***/
+
+ /* a1 */ 0xe89599, 0xe89588, 0xe895a8, 0xe895a9,
+ /* a5 */ 0xe89583, 0xe89589, 0xe895ad, 0xe895aa,
+ /* a9 */ 0xe8959e, 0xe89e83, 0xe89e9f, 0xe89e9e,
+ /* ad */ 0xe89ea2, 0xe89e8d, 0xe8a1a1, 0xe8a4aa,
+ /* b1 */ 0xe8a4b2, 0xe8a4a5, 0xe8a4ab, 0xe8a4a1,
+ /* b5 */ 0xe8a6aa, 0xe8a6a6, 0xe8aba6, 0xe8abba,
+ /* b9 */ 0xe8abab, 0xe8abb1, 0xe8ac80, 0xe8ab9c,
+ /* bd */ 0xe8aba7, 0xe8abae, 0xe8abbe, 0xe8ac81,
+ /* c1 */ 0xe8ac82, 0xe8abb7, 0xe8abad, 0xe8abb3,
+ /* c5 */ 0xe8abb6, 0xe8abbc, 0xe8b1ab, 0xe8b1ad,
+ /* c9 */ 0xe8b293, 0xe8b3b4, 0xe8b984, 0xe8b8b1,
+ /* cd */ 0xe8b8b4, 0xe8b982, 0xe8b8b9, 0xe8b8b5,
+ /* d1 */ 0xe8bcbb, 0xe8bcaf, 0xe8bcb8, 0xe8bcb3,
+ /* d5 */ 0xe8bea8, 0xe8bea6, 0xe981b5, 0xe981b4,
+ /* d9 */ 0xe981b8, 0xe981b2, 0xe981bc, 0xe981ba,
+ /* dd */ 0xe984b4, 0xe98692, 0xe98ca0, 0xe98cb6,
+ /* e1 */ 0xe98bb8, 0xe98cb3, 0xe98caf, 0xe98ca2,
+ /* e5 */ 0xe98bbc, 0xe98cab, 0xe98c84, 0xe98c9a,
+ /* e9 */ 0xe98c90, 0xe98ca6, 0xe98ca1, 0xe98c95,
+ /* ed */ 0xe98cae, 0xe98c99, 0xe996bb, 0xe99aa7,
+ /* f1 */ 0xe99aa8, 0xe99aaa, 0xe99b95, 0xe99c8e,
+ /* f5 */ 0xe99c91, 0xe99c96, 0xe99c8d, 0xe99c93,
+ /* f9 */ 0xe99c8f, 0xe99d9b, 0xe99d9c, 0xe99da6,
+ /* fd */ 0xe99e98, 0xe9a0b0,
+
+ /*** Four byte table, leaf: 8ea1f3xx - offset 0x02d93 ***/
+
+ /* a1 */ 0xe9a0b8, 0xe9a0bb, 0xe9a0b7, 0xe9a0ad,
+ /* a5 */ 0xe9a0b9, 0xe9a0a4, 0xe9a490, 0xe9a4a8,
+ /* a9 */ 0xe9a49e, 0xe9a49b, 0xe9a4a1, 0xe9a49a,
+ /* ad */ 0xe9a7ad, 0xe9a7a2, 0xe9a7b1, 0xe9aab8,
+ /* b1 */ 0xe9aabc, 0xe9abbb, 0xe9abad, 0xe9aca8,
+ /* b5 */ 0xe9ae91, 0xe9b495, 0xe9b4a3, 0xe9b4a6,
+ /* b9 */ 0xe9b4a8, 0xe9b492, 0xe9b49b, 0xe9bb98,
+ /* bd */ 0xe9bb94, 0xe9be8d, 0xe9be9c, 0xe584aa,
+ /* c1 */ 0xe5849f, 0xe584a1, 0xe584b2, 0xe58bb5,
+ /* c5 */ 0xe59a8e, 0xe59a80, 0xe59a90, 0xe59a85,
+ /* c9 */ 0xe59a87, 0xe59a8f, 0xe5a395, 0xe5a393,
+ /* cd */ 0xe5a391, 0xe5a38e, 0xe5acb0, 0xe5acaa,
+ /* d1 */ 0xe5aca4, 0xe5adba, 0xe5b0b7, 0xe5b1a8,
+ /* d5 */ 0xe5b6bc, 0xe5b6ba, 0xe5b6bd, 0xe5b6b8,
+ /* d9 */ 0xe5b9ab, 0xe5bd8c, 0xe5bebd, 0xe68789,
+ /* dd */ 0xe68782, 0xe68787, 0xe687a6, 0xe6878b,
+ /* e1 */ 0xe688b2, 0xe688b4, 0xe6938e, 0xe6938a,
+ /* e5 */ 0xe69398, 0xe693a0, 0xe693b0, 0xe693a6,
+ /* e9 */ 0xe693ac, 0xe693b1, 0xe693a2, 0xe693ad,
+ /* ed */ 0xe69682, 0xe69683, 0xe69b99, 0xe69b96,
+ /* f1 */ 0xe6aa80, 0xe6aa94, 0xe6aa84, 0xe6aaa2,
+ /* f5 */ 0xe6aa9c, 0xe6ab9b, 0xe6aaa3, 0xe6a9be,
+ /* f9 */ 0xe6aa97, 0xe6aa90, 0xe6aaa0, 0xe6ad9c,
+ /* fd */ 0xe6aeae, 0xe6af9a,
+
+ /*** Four byte table, leaf: 8ea1f4xx - offset 0x02df1 ***/
+
+ /* a1 */ 0xe6b088, 0xe6bf98, 0xe6bfb1, 0xe6bf9f,
+ /* a5 */ 0xe6bfa0, 0xe6bf9b, 0xe6bfa4, 0xe6bfab,
+ /* a9 */ 0xe6bfaf, 0xe6be80, 0xe6bfac, 0xe6bfa1,
+ /* ad */ 0xe6bfa9, 0xe6bf95, 0xe6bfae, 0xe6bfb0,
+ /* b1 */ 0xe787a7, 0xe7879f, 0xe787ae, 0xe787a6,
+ /* b5 */ 0xe787a5, 0xe787ad, 0xe787ac, 0xe787b4,
+ /* b9 */ 0xe787a0, 0xe788b5, 0xe78986, 0xe78db0,
+ /* bd */ 0xe78db2, 0xe792a9, 0xe792b0, 0xe792a6,
+ /* c1 */ 0xe792a8, 0xe79986, 0xe79982, 0xe7998c,
+ /* c5 */ 0xe79baa, 0xe79eb3, 0xe79eaa, 0xe79eb0,
+ /* c9 */ 0xe79eac, 0xe79ea7, 0xe79ead, 0xe79faf,
+ /* cd */ 0xe7a3b7, 0xe7a3ba, 0xe7a3b4, 0xe7a3af,
+ /* d1 */ 0xe7a481, 0xe7a6a7, 0xe7a6aa, 0xe7a997,
+ /* d5 */ 0xe7aabf, 0xe7b087, 0xe7b08d, 0xe7afbe,
+ /* d9 */ 0xe7afb7, 0xe7b08c, 0xe7afa0, 0xe7b3a0,
+ /* dd */ 0xe7b39c, 0xe7b39e, 0xe7b3a2, 0xe7b39f,
+ /* e1 */ 0xe7b399, 0xe7b39d, 0xe7b8ae, 0xe7b8be,
+ /* e5 */ 0xe7b986, 0xe7b8b7, 0xe7b8b2, 0xe7b983,
+ /* e9 */ 0xe7b8ab, 0xe7b8bd, 0xe7b8b1, 0xe7b985,
+ /* ed */ 0xe7b981, 0xe7b8b4, 0xe7b8b9, 0xe7b988,
+ /* f1 */ 0xe7b8b5, 0xe7b8bf, 0xe7b8af, 0xe7bd84,
+ /* f5 */ 0xe7bfb3, 0xe7bfbc, 0xe881b1, 0xe881b2,
+ /* f9 */ 0xe881b0, 0xe881af, 0xe881b3, 0xe88786,
+ /* fd */ 0xe88783, 0xe886ba,
+
+ /*** Four byte table, leaf: 8ea1f5xx - offset 0x02e4f ***/
+
+ /* a1 */ 0xe88782, 0xe88780, 0xe886bf, 0xe886bd,
+ /* a5 */ 0xe88789, 0xe886be, 0xe887a8, 0xe88889,
+ /* a9 */ 0xe889b1, 0xe896aa, 0xe89684, 0xe895be,
+ /* ad */ 0xe8969c, 0xe89691, 0xe89694, 0xe896af,
+ /* b1 */ 0xe8969b, 0xe89687, 0xe896a8, 0xe8968a,
+ /* b5 */ 0xe896a6, 0xe899a7, 0xe89f80, 0xe89f91,
+ /* b9 */ 0xe89eb3, 0xe89f92, 0xe89f86, 0xe89eab,
+ /* bd */ 0xe89ebb, 0xe89eba, 0xe89f88, 0xe89f8b,
+ /* c1 */ 0xe8a4bb, 0xe8a4b6, 0xe8a584, 0xe8a4b8,
+ /* c5 */ 0xe8a4bd, 0xe8a6ac, 0xe8ac8e, 0xe8ac97,
+ /* c9 */ 0xe8ac99, 0xe8ac9b, 0xe8ac8a, 0xe8aca0,
+ /* cd */ 0xe8ac9d, 0xe8ac84, 0xe8ac90, 0xe8b181,
+ /* d1 */ 0xe8b0bf, 0xe8b1b3, 0xe8b3ba, 0xe8b3bd,
+ /* d5 */ 0xe8b3bc, 0xe8b3b8, 0xe8b3bb, 0xe8b6a8,
+ /* d9 */ 0xe8b989, 0xe8b98b, 0xe8b988, 0xe8b98a,
+ /* dd */ 0xe8bd84, 0xe8bcbe, 0xe8bd82, 0xe8bd85,
+ /* e1 */ 0xe8bcbf, 0xe981bf, 0xe981bd, 0xe98284,
+ /* e5 */ 0xe98281, 0xe98282, 0xe98280, 0xe984b9,
+ /* e9 */ 0xe986a3, 0xe9869e, 0xe9869c, 0xe98d8d,
+ /* ed */ 0xe98e82, 0xe98ca8, 0xe98db5, 0xe98d8a,
+ /* f1 */ 0xe98da5, 0xe98d8b, 0xe98c98, 0xe98dbe,
+ /* f5 */ 0xe98dac, 0xe98d9b, 0xe98db0, 0xe98d9a,
+ /* f9 */ 0xe98d94, 0xe9978a, 0xe9978b, 0xe9978c,
+ /* fd */ 0xe99788, 0xe99786,
+
+ /*** Four byte table, leaf: 8ea1f6xx - offset 0x02ead ***/
+
+ /* a1 */ 0xe99ab1, 0xe99ab8, 0xe99b96, 0xe99c9c,
+ /* a5 */ 0xe99c9e, 0xe99ea0, 0xe99f93, 0xe9a186,
+ /* a9 */ 0xe9a2b6, 0xe9a4b5, 0xe9a881, 0xe9a7bf,
+ /* ad */ 0xe9aeae, 0xe9aeab, 0xe9aeaa, 0xe9aead,
+ /* b1 */ 0xe9b4bb, 0xe9b4bf, 0xe9ba8b, 0xe9bb8f,
+ /* b5 */ 0xe9bb9e, 0xe9bb9c, 0xe9bb9d, 0xe9bb9b,
+ /* b9 */ 0xe9bcbe, 0xe9bd8b, 0xe58fa2, 0xe59a95,
+ /* bd */ 0xe59aae, 0xe5a399, 0xe5a398, 0xe5acb8,
+ /* c1 */ 0xe5bd9e, 0xe687a3, 0xe688b3, 0xe693b4,
+ /* c5 */ 0xe693b2, 0xe693be, 0xe69486, 0xe693ba,
+ /* c9 */ 0xe693bb, 0xe693b7, 0xe696b7, 0xe69b9c,
+ /* cd */ 0xe69ca6, 0xe6aab3, 0xe6aaac, 0xe6ab83,
+ /* d1 */ 0xe6aabb, 0xe6aab8, 0xe6ab82, 0xe6aaae,
+ /* d5 */ 0xe6aaaf, 0xe6ad9f, 0xe6adb8, 0xe6aeaf,
+ /* d9 */ 0xe78089, 0xe7808b, 0xe6bfbe, 0xe78086,
+ /* dd */ 0xe6bfba, 0xe78091, 0xe7808f, 0xe787bb,
+ /* e1 */ 0xe787bc, 0xe787be, 0xe787b8, 0xe78db7,
+ /* e5 */ 0xe78db5, 0xe792a7, 0xe792bf, 0xe79495,
+ /* e9 */ 0xe79996, 0xe79998, 0xe79992, 0xe79ebd,
+ /* ed */ 0xe79ebf, 0xe79ebb, 0xe79ebc, 0xe7a48e,
+ /* f1 */ 0xe7a6ae, 0xe7a9a1, 0xe7a9a2, 0xe7a9a0,
+ /* f5 */ 0xe7ab84, 0xe7ab85, 0xe7b0ab, 0xe7b0a7,
+ /* f9 */ 0xe7b0aa, 0xe7b09e, 0xe7b0a3, 0xe7b0a1,
+ /* fd */ 0xe7b3a7, 0xe7b994,
+
+ /*** Four byte table, leaf: 8ea1f7xx - offset 0x02f0b ***/
+
+ /* a1 */ 0xe7b995, 0xe7b99e, 0xe7b99a, 0xe7b9a1,
+ /* a5 */ 0xe7b992, 0xe7b999, 0xe7bd88, 0xe7bfb9,
+ /* a9 */ 0xe7bfbb, 0xe881b7, 0xe881b6, 0xe8878d,
+ /* ad */ 0xe8878f, 0xe8888a, 0xe8978f, 0xe896a9,
+ /* b1 */ 0xe8978d, 0xe89790, 0xe89789, 0xe896b0,
+ /* b5 */ 0xe896ba, 0xe896b9, 0xe89faf, 0xe89fac,
+ /* b9 */ 0xe89fb2, 0xe89fa0, 0xe8a686, 0xe8a6b2,
+ /* bd */ 0xe8a7b4, 0xe8aca8, 0xe8acb9, 0xe8acac,
+ /* c1 */ 0xe8acab, 0xe8b190, 0xe8b485, 0xe8b999,
+ /* c5 */ 0xe8b9a3, 0xe8b9a6, 0xe8b9a4, 0xe8b99f,
+ /* c9 */ 0xe8b995, 0xe8bb80, 0xe8bd89, 0xe8bd8d,
+ /* cd */ 0xe98287, 0xe98283, 0xe98288, 0xe986ab,
+ /* d1 */ 0xe986ac, 0xe98790, 0xe98e94, 0xe98e8a,
+ /* d5 */ 0xe98e96, 0xe98ea2, 0xe98eb3, 0xe98eae,
+ /* d9 */ 0xe98eac, 0xe98eb0, 0xe98e98, 0xe98e9a,
+ /* dd */ 0xe98e97, 0xe99794, 0xe99796, 0xe99790,
+ /* e1 */ 0xe99795, 0xe99ba2, 0xe99b9c, 0xe99b99,
+ /* e5 */ 0xe99b9b, 0xe99b9e, 0xe99ca4, 0xe99ea3,
+ /* e9 */ 0xe99ea6, 0xe99ead, 0xe99fb9, 0xe9a18d,
+ /* ed */ 0xe9a18f, 0xe9a18c, 0xe9a18e, 0xe9a193,
+ /* f1 */ 0xe9a2ba, 0xe9a4be, 0xe9a4bf, 0xe9a4bd,
+ /* f5 */ 0xe9a4ae, 0xe9a6a5, 0xe9a88e, 0xe9ab81,
+ /* f9 */ 0xe9ac83, 0xe9ac86, 0xe9ad8f, 0xe9ad8e,
+ /* fd */ 0xe9ad8d, 0xe9af8a,
+
+ /*** Four byte table, leaf: 8ea1f8xx - offset 0x02f69 ***/
+
+ /* a1 */ 0xe9af89, 0xe9afbd, 0xe9af88, 0xe9af80,
+ /* a5 */ 0xe9b591, 0xe9b59d, 0xe9b5a0, 0xe9bba0,
+ /* a9 */ 0xe9bc95, 0xe9bcac, 0xe584b3, 0xe59aa5,
+ /* ad */ 0xe59aa8, 0xe5a39e, 0xe5a39f, 0xe5a3a2,
+ /* b1 */ 0xe5afb5, 0xe9be90, 0xe5bbac, 0xe687b2,
+ /* b5 */ 0xe687b7, 0xe687b6, 0xe687b5, 0xe69480,
+ /* b9 */ 0xe6948f, 0xe69ba0, 0xe69b9d, 0xe6aba5,
+ /* bd */ 0xe6ab9d, 0xe6ab9a, 0xe6ab93, 0xe7809b,
+ /* c1 */ 0xe7809f, 0xe780a8, 0xe7809a, 0xe7809d,
+ /* c5 */ 0xe78095, 0xe78098, 0xe78886, 0xe7888d,
+ /* c9 */ 0xe78998, 0xe78aa2, 0xe78db8, 0xe78dba,
+ /* cd */ 0xe792bd, 0xe7938a, 0xe793a3, 0xe79687,
+ /* d1 */ 0xe79686, 0xe7999f, 0xe799a1, 0xe79f87,
+ /* d5 */ 0xe7a499, 0xe7a6b1, 0xe7a9ab, 0xe7a9a9,
+ /* d9 */ 0xe7b0be, 0xe7b0bf, 0xe7b0b8, 0xe7b0bd,
+ /* dd */ 0xe7b0b7, 0xe7b180, 0xe7b9ab, 0xe7b9ad,
+ /* e1 */ 0xe7b9b9, 0xe7b9a9, 0xe7b9aa, 0xe7b9b3,
+ /* e5 */ 0xe7be85, 0xe7beb6, 0xe7beb9, 0xe7beb8,
+ /* e9 */ 0xe88798, 0xe897a9, 0xe8979d, 0xe897aa,
+ /* ed */ 0xe89795, 0xe897a4, 0xe897a5, 0xe897b7,
+ /* f1 */ 0xe89fbb, 0xe8a085, 0xe8a08d, 0xe89fb9,
+ /* f5 */ 0xe89fbe, 0xe8a5a0, 0xe8a59f, 0xe8a596,
+ /* f9 */ 0xe8a59e, 0xe8ad81, 0xe8ad9c, 0xe8ad98,
+ /* fd */ 0xe8ad89, 0xe8ad9a,
+
+ /*** Four byte table, leaf: 8ea1f9xx - offset 0x02fc7 ***/
+
+ /* a1 */ 0xe8ad8e, 0xe8ad8f, 0xe8ad86, 0xe8ad99,
+ /* a5 */ 0xe8b488, 0xe8b48a, 0xe8b9bc, 0xe8b9b2,
+ /* a9 */ 0xe8ba87, 0xe8b9b6, 0xe8b9ac, 0xe8b9ba,
+ /* ad */ 0xe8b9b4, 0xe8bd94, 0xe8bd8e, 0xe8bead,
+ /* b1 */ 0xe9828a, 0xe9828b, 0xe986b1, 0xe986ae,
+ /* b5 */ 0xe98fa1, 0xe98f91, 0xe98f9f, 0xe98f83,
+ /* b9 */ 0xe98f88, 0xe98f9c, 0xe98f9d, 0xe98f96,
+ /* bd */ 0xe98fa2, 0xe98f8d, 0xe98f98, 0xe98fa4,
+ /* c1 */ 0xe98f97, 0xe98fa8, 0xe9979c, 0xe99ab4,
+ /* c5 */ 0xe99ba3, 0xe99caa, 0xe99ca7, 0xe99da1,
+ /* c9 */ 0xe99f9c, 0xe99fbb, 0xe9a19e, 0xe9a198,
+ /* cd */ 0xe9a19b, 0xe9a2bc, 0xe9a585, 0xe9a589,
+ /* d1 */ 0xe9a896, 0xe9a899, 0xe9ac8d, 0xe9afa8,
+ /* d5 */ 0xe9afa7, 0xe9af96, 0xe9af9b, 0xe9b689,
+ /* d9 */ 0xe9b5a1, 0xe9b5b2, 0xe9b5aa, 0xe9b5ac,
+ /* dd */ 0xe9ba92, 0xe9ba97, 0xe9ba93, 0xe9bab4,
+ /* e1 */ 0xe58bb8, 0xe59ab7, 0xe59ab6, 0xe59ab4,
+ /* e5 */ 0xe59abc, 0xe5a3a4, 0xe5ad80, 0xe5ad83,
+ /* e9 */ 0xe5adbd, 0xe5afb6, 0xe5b789, 0xe687b8,
+ /* ed */ 0xe687ba, 0xe69498, 0xe69494, 0xe69499,
+ /* f1 */ 0xe69ba6, 0xe69ca7, 0xe6abac, 0xe780be,
+ /* f5 */ 0xe780b0, 0xe780b2, 0xe78890, 0xe78dbb,
+ /* f9 */ 0xe7938f, 0xe799a2, 0xe799a5, 0xe7a4a6,
+ /* fd */ 0xe7a4aa, 0xe7a4ac,
+
+ /*** Four byte table, leaf: 8ea1faxx - offset 0x03025 ***/
+
+ /* a1 */ 0xe7a4ab, 0xe7ab87, 0xe7abb6, 0xe7b18c,
+ /* a5 */ 0xe7b183, 0xe7b18d, 0xe7b3af, 0xe7b3b0,
+ /* a9 */ 0xe8beae, 0xe7b9bd, 0xe7b9bc, 0xe7ba82,
+ /* ad */ 0xe7bd8c, 0xe88080, 0xe8879a, 0xe889a6,
+ /* b1 */ 0xe897bb, 0xe897b9, 0xe89891, 0xe897ba,
+ /* b5 */ 0xe89886, 0xe8988b, 0xe89887, 0xe8988a,
+ /* b9 */ 0xe8a094, 0xe8a095, 0xe8a5a4, 0xe8a6ba,
+ /* bd */ 0xe8a7b8, 0xe8adb0, 0xe8adac, 0xe8ada6,
+ /* c1 */ 0xe8adaf, 0xe8ad9f, 0xe8adab, 0xe8b48f,
+ /* c5 */ 0xe8b48d, 0xe8ba89, 0xe8ba81, 0xe8ba85,
+ /* c9 */ 0xe8ba82, 0xe986b4, 0xe9878b, 0xe99098,
+ /* cd */ 0xe99083, 0xe98fbd, 0xe997a1, 0xe99cb0,
+ /* d1 */ 0xe9a384, 0xe9a592, 0xe9a591, 0xe9a6a8,
+ /* d5 */ 0xe9a8ab, 0xe9a8b0, 0xe9a8b7, 0xe9a8b5,
+ /* d9 */ 0xe9b093, 0xe9b08d, 0xe9b9b9, 0xe9bab5,
+ /* dd */ 0xe9bba8, 0xe9bcaf, 0xe9bd9f, 0xe9bda3,
+ /* e1 */ 0xe9bda1, 0xe584b7, 0xe584b8, 0xe59b81,
+ /* e5 */ 0xe59b80, 0xe59b82, 0xe5a494, 0xe5b1ac,
+ /* e9 */ 0xe5b78d, 0xe687bc, 0xe687be, 0xe6949d,
+ /* ed */ 0xe6949c, 0xe69695, 0xe69ba9, 0xe6abbb,
+ /* f1 */ 0xe6ac84, 0xe6abba, 0xe6aeb2, 0xe7818c,
+ /* f5 */ 0xe7889b, 0xe78aa7, 0xe79396, 0xe79394,
+ /* f9 */ 0xe799a9, 0xe79f93, 0xe7b190, 0xe7ba8f,
+ /* fd */ 0xe7ba8c, 0xe7bebc,
+
+ /*** Four byte table, leaf: 8ea1fbxx - offset 0x03083 ***/
+
+ /* a1 */ 0xe89897, 0xe898ad, 0xe8989a, 0xe8a0a3,
+ /* a5 */ 0xe8a0a2, 0xe8a0a1, 0xe8a09f, 0xe8a5aa,
+ /* a9 */ 0xe8a5ac, 0xe8a6bd, 0xe8adb4, 0xe8adb7,
+ /* ad */ 0xe8adbd, 0xe8b493, 0xe8ba8a, 0xe8ba8d,
+ /* b1 */ 0xe8ba8b, 0xe8bd9f, 0xe8beaf, 0xe986ba,
+ /* b5 */ 0xe990ae, 0xe990b3, 0xe990b5, 0xe990ba,
+ /* b9 */ 0xe990b8, 0xe990b2, 0xe990ab, 0xe997a2,
+ /* bd */ 0xe99cb8, 0xe99cb9, 0xe99cb2, 0xe99fbf,
+ /* c1 */ 0xe9a1a7, 0xe9a1a5, 0xe9a597, 0xe9a985,
+ /* c5 */ 0xe9a983, 0xe9a980, 0xe9a8be, 0xe9ab8f,
+ /* c9 */ 0xe9ad94, 0xe9ad91, 0xe9b0ad, 0xe9b0a5,
+ /* cd */ 0xe9b6af, 0xe9b6b4, 0xe9b782, 0xe9b6b8,
+ /* d1 */ 0xe9ba9d, 0xe9bbaf, 0xe9bc99, 0xe9bd9c,
+ /* d5 */ 0xe9bda6, 0xe9bda7, 0xe584bc, 0xe584bb,
+ /* d9 */ 0xe59b88, 0xe59b8a, 0xe59b89, 0xe5adbf,
+ /* dd */ 0xe5b794, 0xe5b792, 0xe5bd8e, 0xe687bf,
+ /* e1 */ 0xe694a4, 0xe6ac8a, 0xe6ada1, 0xe78191,
+ /* e5 */ 0xe78198, 0xe78e80, 0xe793a4, 0xe7968a,
+ /* e9 */ 0xe799ae, 0xe799ac, 0xe7a6b3, 0xe7b1a0,
+ /* ed */ 0xe7b19f, 0xe881be, 0xe881bd, 0xe8879f,
+ /* f1 */ 0xe8a5b2, 0xe8a5af, 0xe8a7bc, 0xe8ae80,
+ /* f5 */ 0xe8b496, 0xe8b497, 0xe8ba91, 0xe8ba93,
+ /* f9 */ 0xe8bda1, 0xe98588, 0xe99184, 0xe99191,
+ /* fd */ 0xe99192, 0xe99cbd,
+
+ /*** Four byte table, leaf: 8ea1fcxx - offset 0x030e1 ***/
+
+ /* a1 */ 0xe99cbe, 0xe99f83, 0xe99f81, 0xe9a1ab,
+ /* a5 */ 0xe9a595, 0xe9a995, 0xe9a98d, 0xe9ab92,
+ /* a9 */ 0xe9ac9a, 0xe9b189, 0xe9b0b1, 0xe9b0be,
+ /* ad */ 0xe9b0bb, 0xe9b793, 0xe9b797, 0xe9bcb4,
+ /* b1 */ 0xe9bdac, 0xe9bdaa, 0xe9be94, 0xe59b8c,
+ /* b5 */ 0xe5b796, 0xe68880, 0xe694a3, 0xe694ab,
+ /* b9 */ 0xe694aa, 0xe69bac, 0xe6ac90, 0xe7939a,
+ /* bd */ 0xe7ab8a, 0xe7b1a4, 0xe7b1a3, 0xe7b1a5,
+ /* c1 */ 0xe7ba93, 0xe7ba96, 0xe7ba94, 0xe887a2,
+ /* c5 */ 0xe898b8, 0xe898bf, 0xe8a0b1, 0xe8ae8a,
+ /* c9 */ 0xe98290, 0xe9828f, 0xe991a3, 0xe991a0,
+ /* cd */ 0xe991a4, 0xe99da8, 0xe9a1af, 0xe9a59c,
+ /* d1 */ 0xe9a99a, 0xe9a99b, 0xe9a997, 0xe9ab93,
+ /* d5 */ 0xe9ab94, 0xe9ab91, 0xe9b194, 0xe9b197,
+ /* d9 */ 0xe9b196, 0xe9b7a5, 0xe9ba9f, 0xe9bbb4,
+ /* dd */ 0xe59b91, 0xe5a3a9, 0xe694ac, 0xe7819e,
+ /* e1 */ 0xe799b1, 0xe799b2, 0xe79f97, 0xe7bd90,
+ /* e5 */ 0xe7be88, 0xe8a0b6, 0xe8a0b9, 0xe8a1a2,
+ /* e9 */ 0xe8ae93, 0xe8ae92, 0xe8ae96, 0xe889b7,
+ /* ed */ 0xe8b49b, 0xe98780, 0xe991aa, 0xe99d82,
+ /* f1 */ 0xe99d88, 0xe99d84, 0xe99f86, 0xe9a1b0,
+ /* f5 */ 0xe9a99f, 0xe9aca2, 0xe9ad98, 0xe9b19f,
+ /* f9 */ 0xe9b7b9, 0xe9b7ba, 0xe9b9bc, 0xe9b9bd,
+ /* fd */ 0xe9bc87, 0xe9bdb7,
+
+ /*** Four byte table, leaf: 8ea1fdxx - offset 0x0313f ***/
+
+ /* a1 */ 0xe9bdb2, 0xe5bbb3, 0xe6ac96, 0xe781a3,
+ /* a5 */ 0xe7b1ac, 0xe7b1ae, 0xe8a0bb, 0xe8a780,
+ /* a9 */ 0xe8baa1, 0xe98781, 0xe991b2, 0xe991b0,
+ /* ad */ 0xe9a1b1, 0xe9a59e, 0xe9ab96, 0xe9aca3,
+ /* b1 */ 0xe9bb8c, 0xe781a4, 0xe79f9a, 0xe8ae9a,
+ /* b5 */ 0xe991b7, 0xe99f89, 0xe9a9a2, 0xe9a9a5,
+ /* b9 */ 0xe7ba9c, 0xe8ae9c, 0xe8baaa, 0xe98785,
+ /* bd */ 0xe991bd, 0xe991be, 0xe991bc, 0xe9b1b7,
+ /* c1 */ 0xe9b1b8, 0xe9bbb7, 0xe8b194, 0xe991bf,
+ /* c5 */ 0xe9b89a, 0xe788a8, 0xe9a9aa, 0xe9acb1,
+ /* c9 */ 0xe9b89b, 0xe9b89e, 0xe7b1b2, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8ea2a1xx - offset 0x0319d ***/
+
+ /* a1 */ 0xe4b982, 0xe4b99c, 0xe587b5, 0xe58c9a,
+ /* a5 */ 0xe58e82, 0xe4b887, 0xe4b88c, 0xe4b987,
+ /* a9 */ 0xe4ba8d, 0xe59b97, 0xe5b1ae, 0xe5bdb3,
+ /* ad */ 0xe4b88f, 0xe58687, 0xe4b88e, 0xe4b8ae,
+ /* b1 */ 0xe4ba93, 0xe4bb82, 0xe4bb89, 0xe4bb88,
+ /* b5 */ 0xe58698, 0xe58bbc, 0xe58dac, 0xe58eb9,
+ /* b9 */ 0xe59ca0, 0xe5a483, 0xe5a4ac, 0xe5b090,
+ /* bd */ 0xe5b7bf, 0xe697a1, 0xe6aeb3, 0xe6af8c,
+ /* c1 */ 0xe6b094, 0xe788bf, 0xe4b8b1, 0xe4b8bc,
+ /* c5 */ 0xe4bba8, 0xe4bb9c, 0xe4bba9, 0xe4bba1,
+ /* c9 */ 0xe4bb9d, 0xe4bb9a, 0xe5888c, 0xe58889,
+ /* cd */ 0xe58c9c, 0xe58d8c, 0xe59ca2, 0xe59ca3,
+ /* d1 */ 0xe5a497, 0xe5a4af, 0xe5ae81, 0xe5ae84,
+ /* d5 */ 0xe5b092, 0xe5b0bb, 0xe5b1b4, 0xe5b1b3,
+ /* d9 */ 0xe5b884, 0xe5ba80, 0xe5ba82, 0xe5bf89,
+ /* dd */ 0xe68889, 0xe68990, 0xe6b095, 0xe6b0b6,
+ /* e1 */ 0xe6b183, 0xe6b0bf, 0xe6b0bb, 0xe78aae,
+ /* e5 */ 0xe78ab0, 0xe78e8a, 0xe7a6b8, 0xe8828a,
+ /* e9 */ 0xe9989e, 0xe4bc8e, 0xe4bc98, 0xe4bcac,
+ /* ed */ 0xe4bbb5, 0xe4bc94, 0xe4bbb1, 0xe4bc80,
+ /* f1 */ 0xe4bbb7, 0xe4bc88, 0xe4bc9d, 0xe4bc82,
+ /* f5 */ 0xe4bc85, 0xe4bca2, 0xe4bc93, 0xe4bc84,
+ /* f9 */ 0xe4bbb4, 0xe4bc92, 0xe586b1, 0xe58893,
+ /* fd */ 0xe58890, 0xe58aa6,
+
+ /*** Four byte table, leaf: 8ea2a2xx - offset 0x031fb ***/
+
+ /* a1 */ 0xe58ca2, 0xe58c9f, 0xe58d8d, 0xe58e8a,
+ /* a5 */ 0xe59087, 0xe59ba1, 0xe59b9f, 0xe59cae,
+ /* a9 */ 0xe59caa, 0xe59cb4, 0xe5a4bc, 0xe5a680,
+ /* ad */ 0xe5a5bc, 0xe5a685, 0xe5a5bb, 0xe5a5be,
+ /* b1 */ 0xe5a5b7, 0xe5a5bf, 0xe5ad96, 0xe5b095,
+ /* b5 */ 0xe5b0a5, 0xe5b1bc, 0xe5b1ba, 0xe5b1bb,
+ /* b9 */ 0xe5b1be, 0xe5b79f, 0xe5b9b5, 0xe5ba84,
+ /* bd */ 0xe5bc82, 0xe5bc9a, 0xe5bdb4, 0xe5bf95,
+ /* c1 */ 0xe5bf94, 0xe5bf8f, 0xe6899c, 0xe6899e,
+ /* c5 */ 0xe689a4, 0xe689a1, 0xe689a6, 0xe689a2,
+ /* c9 */ 0xe68999, 0xe689a0, 0xe6899a, 0xe689a5,
+ /* cd */ 0xe694b7, 0xe697af, 0xe697ae, 0xe69cbe,
+ /* d1 */ 0xe69cb9, 0xe69cb8, 0xe69cbb, 0xe69cba,
+ /* d5 */ 0xe69cbf, 0xe69cbc, 0xe69cb3, 0xe6b098,
+ /* d9 */ 0xe6b186, 0xe6b192, 0xe6b19c, 0xe6b18f,
+ /* dd */ 0xe6b18a, 0xe6b194, 0xe6b18b, 0xe6b18c,
+ /* e1 */ 0xe781b1, 0xe7899e, 0xe78ab4, 0xe78ab5,
+ /* e5 */ 0xe78e8e, 0xe794aa, 0xe799bf, 0xe7a9b5,
+ /* e9 */ 0xe7bd91, 0xe889b8, 0xe889bc, 0xe88a80,
+ /* ed */ 0xe889bd, 0xe889bf, 0xe8998d, 0xe8a5be,
+ /* f1 */ 0xe98299, 0xe98297, 0xe98298, 0xe9829b,
+ /* f5 */ 0xe98294, 0xe998a2, 0xe998a4, 0xe998a0,
+ /* f9 */ 0xe998a3, 0xe4bd96, 0xe4bcbb, 0xe4bda2,
+ /* fd */ 0xe4bd89, 0xe4bd93,
+
+ /*** Four byte table, leaf: 8ea2a3xx - offset 0x03259 ***/
+
+ /* a1 */ 0xe4bda4, 0xe4bcbe, 0xe4bda7, 0xe4bd92,
+ /* a5 */ 0xe4bd9f, 0xe4bd81, 0xe4bd98, 0xe4bcad,
+ /* a9 */ 0xe4bcb3, 0xe4bcbf, 0xe4bda1, 0xe5868f,
+ /* ad */ 0xe586b9, 0xe5889c, 0xe5889e, 0xe588a1,
+ /* b1 */ 0xe58aad, 0xe58aae, 0xe58c89, 0xe58da3,
+ /* b5 */ 0xe58db2, 0xe58e8e, 0xe58e8f, 0xe590b0,
+ /* b9 */ 0xe590b7, 0xe590aa, 0xe59194, 0xe59185,
+ /* bd */ 0xe59099, 0xe5909c, 0xe590a5, 0xe59098,
+ /* c1 */ 0xe590bd, 0xe5918f, 0xe59181, 0xe590a8,
+ /* c5 */ 0xe590a4, 0xe59187, 0xe59bae, 0xe59ba7,
+ /* c9 */ 0xe59ba5, 0xe59d81, 0xe59d85, 0xe59d8c,
+ /* cd */ 0xe59d89, 0xe59d8b, 0xe59d92, 0xe5a486,
+ /* d1 */ 0xe5a580, 0xe5a6a6, 0xe5a698, 0xe5a6a0,
+ /* d5 */ 0xe5a697, 0xe5a68e, 0xe5a6a2, 0xe5a690,
+ /* d9 */ 0xe5a68f, 0xe5a6a7, 0xe5a6a1, 0xe5ae8e,
+ /* dd */ 0xe5ae92, 0xe5b0a8, 0xe5b0aa, 0xe5b28d,
+ /* e1 */ 0xe5b28f, 0xe5b288, 0xe5b28b, 0xe5b289,
+ /* e5 */ 0xe5b292, 0xe5b28a, 0xe5b286, 0xe5b293,
+ /* e9 */ 0xe5b295, 0xe5b7a0, 0xe5b88a, 0xe5b88e,
+ /* ed */ 0xe5ba8b, 0xe5ba89, 0xe5ba8c, 0xe5ba88,
+ /* f1 */ 0xe5ba8d, 0xe5bc85, 0xe5bc9d, 0xe5bdb8,
+ /* f5 */ 0xe5bdb6, 0xe5bf92, 0xe5bf91, 0xe5bf90,
+ /* f9 */ 0xe5bfad, 0xe5bfa8, 0xe5bfae, 0xe5bfb3,
+ /* fd */ 0xe5bfa1, 0xe5bfa4,
+
+ /*** Four byte table, leaf: 8ea2a4xx - offset 0x032b7 ***/
+
+ /* a1 */ 0xe5bfa3, 0xe5bfba, 0xe5bfaf, 0xe5bfb7,
+ /* a5 */ 0xe5bfbb, 0xe68080, 0xe5bfb4, 0xe688ba,
+ /* a9 */ 0xe68a83, 0xe68a8c, 0xe68a8e, 0xe68a8f,
+ /* ad */ 0xe68a94, 0xe68a87, 0xe689b1, 0xe689bb,
+ /* b1 */ 0xe689ba, 0xe689b0, 0xe68a81, 0xe68a88,
+ /* b5 */ 0xe689b7, 0xe689bd, 0xe689b2, 0xe689b4,
+ /* b9 */ 0xe697b0, 0xe697b4, 0xe697b3, 0xe697b2,
+ /* bd */ 0xe697b5, 0xe69d85, 0xe69d87, 0xe69d99,
+ /* c1 */ 0xe69d95, 0xe69d8c, 0xe69d88, 0xe69d9d,
+ /* c5 */ 0xe69d8d, 0xe69d9a, 0xe69d8b, 0xe6af90,
+ /* c9 */ 0xe6b099, 0xe6b09a, 0xe6b1b8, 0xe6b1a7,
+ /* cd */ 0xe6b1ab, 0xe6b284, 0xe6b28b, 0xe6b28f,
+ /* d1 */ 0xe6b1b1, 0xe6b1af, 0xe6b1a9, 0xe6b29a,
+ /* d5 */ 0xe6b1ad, 0xe6b287, 0xe6b295, 0xe6b29c,
+ /* d9 */ 0xe6b1a6, 0xe6b1b3, 0xe6b1a5, 0xe6b1bb,
+ /* dd */ 0xe6b28e, 0xe781b4, 0xe781ba, 0xe789a3,
+ /* e1 */ 0xe78abf, 0xe78abd, 0xe78b83, 0xe78b86,
+ /* e5 */ 0xe78b81, 0xe78aba, 0xe78b85, 0xe78e95,
+ /* e9 */ 0xe78e97, 0xe78e93, 0xe78e94, 0xe78e92,
+ /* ed */ 0xe794ba, 0xe794b9, 0xe79694, 0xe79695,
+ /* f1 */ 0xe79a81, 0xe7a4bd, 0xe880b4, 0xe88295,
+ /* f5 */ 0xe88299, 0xe88290, 0xe88292, 0xe8829c,
+ /* f9 */ 0xe88a90, 0xe88a8f, 0xe88a85, 0xe88a8e,
+ /* fd */ 0xe88a91, 0xe88a93,
+
+ /*** Four byte table, leaf: 8ea2a5xx - offset 0x03315 ***/
+
+ /* a1 */ 0xe88a8a, 0xe88a83, 0xe88a84, 0xe8b1b8,
+ /* a5 */ 0xe8bf89, 0xe8bebf, 0xe9829f, 0xe982a1,
+ /* a9 */ 0xe982a5, 0xe9829e, 0xe982a7, 0xe982a0,
+ /* ad */ 0xe998b0, 0xe998a8, 0xe998af, 0xe998ad,
+ /* b1 */ 0xe4b8b3, 0xe4be98, 0xe4bdbc, 0xe4be85,
+ /* b5 */ 0xe4bdbd, 0xe4be80, 0xe4be87, 0xe4bdb6,
+ /* b9 */ 0xe4bdb4, 0xe4be89, 0xe4be84, 0xe4bdb7,
+ /* bd */ 0xe4bd8c, 0xe4be97, 0xe4bdaa, 0xe4be9a,
+ /* c1 */ 0xe4bdb9, 0xe4be81, 0xe4bdb8, 0xe4be90,
+ /* c5 */ 0xe4be9c, 0xe4be94, 0xe4be9e, 0xe4be92,
+ /* c9 */ 0xe4be82, 0xe4be95, 0xe4bdab, 0xe4bdae,
+ /* cd */ 0xe5869e, 0xe586bc, 0xe586be, 0xe588b5,
+ /* d1 */ 0xe588b2, 0xe588b3, 0xe58986, 0xe588b1,
+ /* d5 */ 0xe58abc, 0xe58c8a, 0xe58c8b, 0xe58cbc,
+ /* d9 */ 0xe58e92, 0xe58e94, 0xe59287, 0xe591bf,
+ /* dd */ 0xe59281, 0xe59291, 0xe59282, 0xe59288,
+ /* e1 */ 0xe591ab, 0xe591ba, 0xe591be, 0xe591a5,
+ /* e5 */ 0xe591ac, 0xe591b4, 0xe591a6, 0xe5928d,
+ /* e9 */ 0xe591af, 0xe591a1, 0xe591a0, 0xe59298,
+ /* ed */ 0xe591a3, 0xe591a7, 0xe591a4, 0xe59bb7,
+ /* f1 */ 0xe59bb9, 0xe59daf, 0xe59db2, 0xe59dad,
+ /* f5 */ 0xe59dab, 0xe59db1, 0xe59db0, 0xe59db6,
+ /* f9 */ 0xe59e80, 0xe59db5, 0xe59dbb, 0xe59db3,
+ /* fd */ 0xe59db4, 0xe59da2,
+
+ /*** Four byte table, leaf: 8ea2a6xx - offset 0x03373 ***/
+
+ /* a1 */ 0xe59da8, 0xe59dbd, 0xe5a48c, 0xe5a585,
+ /* a5 */ 0xe5a6b5, 0xe5a6ba, 0xe5a78f, 0xe5a78e,
+ /* a9 */ 0xe5a6b2, 0xe5a78c, 0xe5a781, 0xe5a6b6,
+ /* ad */ 0xe5a6bc, 0xe5a783, 0xe5a796, 0xe5a6b1,
+ /* b1 */ 0xe5a6bd, 0xe5a780, 0xe5a788, 0xe5a6b4,
+ /* b5 */ 0xe5a787, 0xe5ada2, 0xe5ada5, 0xe5ae93,
+ /* b9 */ 0xe5ae95, 0xe5b184, 0xe5b187, 0xe5b2ae,
+ /* bd */ 0xe5b2a4, 0xe5b2a0, 0xe5b2b5, 0xe5b2af,
+ /* c1 */ 0xe5b2a8, 0xe5b2ac, 0xe5b29f, 0xe5b2a3,
+ /* c5 */ 0xe5b2ad, 0xe5b2a2, 0xe5b2aa, 0xe5b2a7,
+ /* c9 */ 0xe5b29d, 0xe5b2a5, 0xe5b2b6, 0xe5b2b0,
+ /* cd */ 0xe5b2a6, 0xe5b897, 0xe5b894, 0xe5b899,
+ /* d1 */ 0xe5bca8, 0xe5bca2, 0xe5bca3, 0xe5bca4,
+ /* d5 */ 0xe5bd94, 0xe5be82, 0xe5bdbe, 0xe5bdbd,
+ /* d9 */ 0xe5bf9e, 0xe5bfa5, 0xe680ad, 0xe680a6,
+ /* dd */ 0xe68099, 0xe680b2, 0xe6808b, 0xe680b4,
+ /* e1 */ 0xe6808a, 0xe68097, 0xe680b3, 0xe6809a,
+ /* e5 */ 0xe6809e, 0xe680ac, 0xe680a2, 0xe6808d,
+ /* e9 */ 0xe68090, 0xe680ae, 0xe68093, 0xe68091,
+ /* ed */ 0xe6808c, 0xe68089, 0xe6809c, 0xe68894,
+ /* f1 */ 0xe688bd, 0xe68aad, 0xe68ab4, 0xe68b91,
+ /* f5 */ 0xe68abe, 0xe68aaa, 0xe68ab6, 0xe68b8a,
+ /* f9 */ 0xe68aae, 0xe68ab3, 0xe68aaf, 0xe68abb,
+ /* fd */ 0xe68aa9, 0xe68ab0,
+
+ /*** Four byte table, leaf: 8ea2a7xx - offset 0x033d1 ***/
+
+ /* a1 */ 0xe68ab8, 0xe694bd, 0xe696a8, 0xe696bb,
+ /* a5 */ 0xe69889, 0xe697bc, 0xe69884, 0xe69892,
+ /* a9 */ 0xe69888, 0xe697bb, 0xe69883, 0xe6988b,
+ /* ad */ 0xe6988d, 0xe69885, 0xe697bd, 0xe69891,
+ /* b1 */ 0xe69890, 0xe69bb6, 0xe69c8a, 0xe69e85,
+ /* b5 */ 0xe69dac, 0xe69e8e, 0xe69e92, 0xe69db6,
+ /* b9 */ 0xe69dbb, 0xe69e98, 0xe69e86, 0xe69e84,
+ /* bd */ 0xe69db4, 0xe69e8d, 0xe69e8c, 0xe69dba,
+ /* c1 */ 0xe69e9f, 0xe69e91, 0xe69e99, 0xe69e83,
+ /* c5 */ 0xe69dbd, 0xe69e81, 0xe69db8, 0xe69db9,
+ /* c9 */ 0xe69e94, 0xe6aca5, 0xe6ae80, 0xe6adbe,
+ /* cd */ 0xe6af9e, 0xe6b09d, 0xe6b293, 0xe6b3ac,
+ /* d1 */ 0xe6b3ab, 0xe6b3ae, 0xe6b399, 0xe6b2b6,
+ /* d5 */ 0xe6b394, 0xe6b2ad, 0xe6b3a7, 0xe6b2b7,
+ /* d9 */ 0xe6b390, 0xe6b382, 0xe6b2ba, 0xe6b383,
+ /* dd */ 0xe6b386, 0xe6b3ad, 0xe6b3b2, 0xe6b392,
+ /* e1 */ 0xe6b39d, 0xe6b2b4, 0xe6b28a, 0xe6b29d,
+ /* e5 */ 0xe6b280, 0xe6b39e, 0xe6b380, 0xe6b4b0,
+ /* e9 */ 0xe6b38d, 0xe6b387, 0xe6b2b0, 0xe6b3b9,
+ /* ed */ 0xe6b38f, 0xe6b3a9, 0xe6b391, 0xe78294,
+ /* f1 */ 0xe78298, 0xe78285, 0xe78293, 0xe78286,
+ /* f5 */ 0xe78284, 0xe78291, 0xe78296, 0xe78282,
+ /* f9 */ 0xe7829a, 0xe78283, 0xe789aa, 0xe78b96,
+ /* fd */ 0xe78b8b, 0xe78b98,
+
+ /*** Four byte table, leaf: 8ea2a8xx - offset 0x0342f ***/
+
+ /* a1 */ 0xe78b89, 0xe78b9c, 0xe78b92, 0xe78b94,
+ /* a5 */ 0xe78b9a, 0xe78b8c, 0xe78b91, 0xe78ea4,
+ /* a9 */ 0xe78ea1, 0xe78ead, 0xe78ea6, 0xe78ea2,
+ /* ad */ 0xe78ea0, 0xe78eac, 0xe78e9d, 0xe7939d,
+ /* b1 */ 0xe793a8, 0xe794bf, 0xe79580, 0xe794be,
+ /* b5 */ 0xe7968c, 0xe79698, 0xe79aaf, 0xe79bb3,
+ /* b9 */ 0xe79bb1, 0xe79bb0, 0xe79bb5, 0xe79fb8,
+ /* bd */ 0xe79fbc, 0xe79fb9, 0xe79fbb, 0xe79fba,
+ /* c1 */ 0xe79fb7, 0xe7a582, 0xe7a4bf, 0xe7a785,
+ /* c5 */ 0xe7a9b8, 0xe7a9bb, 0xe7abbb, 0xe7b1b5,
+ /* c9 */ 0xe7b3bd, 0xe880b5, 0xe8828f, 0xe882ae,
+ /* cd */ 0xe882a3, 0xe882b8, 0xe882b5, 0xe882ad,
+ /* d1 */ 0xe888a0, 0xe88aa0, 0xe88b80, 0xe88aab,
+ /* d5 */ 0xe88a9a, 0xe88a98, 0xe88a9b, 0xe88ab5,
+ /* d9 */ 0xe88aa7, 0xe88aae, 0xe88abc, 0xe88a9e,
+ /* dd */ 0xe88aba, 0xe88ab4, 0xe88aa8, 0xe88aa1,
+ /* e1 */ 0xe88aa9, 0xe88b82, 0xe88aa4, 0xe88b83,
+ /* e5 */ 0xe88ab6, 0xe88aa2, 0xe899b0, 0xe899af,
+ /* e9 */ 0xe899ad, 0xe899ae, 0xe8b196, 0xe8bf92,
+ /* ed */ 0xe8bf8b, 0xe8bf93, 0xe8bf8d, 0xe8bf96,
+ /* f1 */ 0xe8bf95, 0xe8bf97, 0xe982b2, 0xe982b4,
+ /* f5 */ 0xe982af, 0xe982b3, 0xe982b0, 0xe998b9,
+ /* f9 */ 0xe998bd, 0xe998bc, 0xe998ba, 0xe99983,
+ /* fd */ 0xe4bf8d, 0xe4bf85,
+
+ /*** Four byte table, leaf: 8ea2a9xx - offset 0x0348d ***/
+
+ /* a1 */ 0xe4bf93, 0xe4beb2, 0xe4bf89, 0xe4bf8b,
+ /* a5 */ 0xe4bf81, 0xe4bf94, 0xe4bf9c, 0xe4bf99,
+ /* a9 */ 0xe4bebb, 0xe4beb3, 0xe4bf9b, 0xe4bf87,
+ /* ad */ 0xe4bf96, 0xe4beba, 0xe4bf80, 0xe4beb9,
+ /* b1 */ 0xe4bfac, 0xe58984, 0xe58989, 0xe58b80,
+ /* b5 */ 0xe58b82, 0xe58cbd, 0xe58dbc, 0xe58e97,
+ /* b9 */ 0xe58e96, 0xe58e99, 0xe58e98, 0xe592ba,
+ /* bd */ 0xe592a1, 0xe592ad, 0xe592a5, 0xe5938f,
+ /* c1 */ 0xe59383, 0xe88c8d, 0xe592b7, 0xe592ae,
+ /* c5 */ 0xe59396, 0xe592b6, 0xe59385, 0xe59386,
+ /* c9 */ 0xe592a0, 0xe591b0, 0xe592bc, 0xe592a2,
+ /* cd */ 0xe592be, 0xe591b2, 0xe5939e, 0xe592b0,
+ /* d1 */ 0xe59eb5, 0xe59e9e, 0xe59e9f, 0xe59ea4,
+ /* d5 */ 0xe59e8c, 0xe59e97, 0xe59e9d, 0xe59e9b,
+ /* d9 */ 0xe59e94, 0xe59e98, 0xe59e8f, 0xe59e99,
+ /* dd */ 0xe59ea5, 0xe59e9a, 0xe59e95, 0xe5a3b4,
+ /* e1 */ 0xe5a48d, 0xe5a593, 0xe5a7a1, 0xe5a79e,
+ /* e5 */ 0xe5a7ae, 0xe5a880, 0xe5a7b1, 0xe5a79d,
+ /* e9 */ 0xe5a7ba, 0xe5a7bd, 0xe5a7bc, 0xe5a7b6,
+ /* ed */ 0xe5a7a4, 0xe5a7b2, 0xe5a7b7, 0xe5a79b,
+ /* f1 */ 0xe5a7a9, 0xe5a7b3, 0xe5a7b5, 0xe5a7a0,
+ /* f5 */ 0xe5a7be, 0xe5a7b4, 0xe5a7ad, 0xe5aea8,
+ /* f9 */ 0xe5b18c, 0xe5b390, 0xe5b398, 0xe5b38c,
+ /* fd */ 0xe5b397, 0xe5b38b,
+
+ /*** Four byte table, leaf: 8ea2aaxx - offset 0x034eb ***/
+
+ /* a1 */ 0xe5b39b, 0xe5b39e, 0xe5b39a, 0xe5b389,
+ /* a5 */ 0xe5b387, 0xe5b38a, 0xe5b396, 0xe5b393,
+ /* a9 */ 0xe5b394, 0xe5b38f, 0xe5b388, 0xe5b386,
+ /* ad */ 0xe5b38e, 0xe5b39f, 0xe5b3b8, 0xe5b7b9,
+ /* b1 */ 0xe5b8a1, 0xe5b8a2, 0xe5b8a3, 0xe5b8a0,
+ /* b5 */ 0xe5b8a4, 0xe5bab0, 0xe5baa4, 0xe5baa2,
+ /* b9 */ 0xe5ba9b, 0xe5baa3, 0xe5baa5, 0xe5bc87,
+ /* bd */ 0xe5bcae, 0xe5bd96, 0xe5be86, 0xe680b7,
+ /* c1 */ 0xe680b9, 0xe68194, 0xe681b2, 0xe6819e,
+ /* c5 */ 0xe68185, 0xe68193, 0xe68187, 0xe68189,
+ /* c9 */ 0xe6819b, 0xe6818c, 0xe68180, 0xe68182,
+ /* cd */ 0xe6819f, 0xe680a4, 0xe68184, 0xe68198,
+ /* d1 */ 0xe681a6, 0xe681ae, 0xe68982, 0xe68983,
+ /* d5 */ 0xe68b8f, 0xe68c8d, 0xe68c8b, 0xe68bb5,
+ /* d9 */ 0xe68c8e, 0xe68c83, 0xe68bab, 0xe68bb9,
+ /* dd */ 0xe68c8f, 0xe68c8c, 0xe68bb8, 0xe68bb6,
+ /* e1 */ 0xe68c80, 0xe68c93, 0xe68c94, 0xe68bba,
+ /* e5 */ 0xe68c95, 0xe68bbb, 0xe68bb0, 0xe69581,
+ /* e9 */ 0xe69583, 0xe696aa, 0xe696bf, 0xe698b6,
+ /* ed */ 0xe698a1, 0xe698b2, 0xe698b5, 0xe6989c,
+ /* f1 */ 0xe698a6, 0xe698a2, 0xe698b3, 0xe698ab,
+ /* f5 */ 0xe698ba, 0xe6989d, 0xe698b4, 0xe698b9,
+ /* f9 */ 0xe698ae, 0xe69c8f, 0xe69c90, 0xe69f81,
+ /* fd */ 0xe69fb2, 0xe69f88,
+
+ /*** Four byte table, leaf: 8ea2abxx - offset 0x03549 ***/
+
+ /* a1 */ 0xe69eba, 0xe69f9c, 0xe69ebb, 0xe69fb8,
+ /* a5 */ 0xe69f98, 0xe69f80, 0xe69eb7, 0xe69f85,
+ /* a9 */ 0xe69fab, 0xe69fa4, 0xe69f9f, 0xe69eb5,
+ /* ad */ 0xe69f8d, 0xe69eb3, 0xe69fb7, 0xe69fb6,
+ /* b1 */ 0xe69fae, 0xe69fa3, 0xe69f82, 0xe69eb9,
+ /* b5 */ 0xe69f8e, 0xe69fa7, 0xe69fb0, 0xe69eb2,
+ /* b9 */ 0xe69fbc, 0xe69f86, 0xe69fad, 0xe69f8c,
+ /* bd */ 0xe69eae, 0xe69fa6, 0xe69f9b, 0xe69fba,
+ /* c1 */ 0xe69f89, 0xe69f8a, 0xe69f83, 0xe69faa,
+ /* c5 */ 0xe69f8b, 0xe6aca8, 0xe6ae82, 0xe6ae84,
+ /* c9 */ 0xe6aeb6, 0xe6af96, 0xe6af98, 0xe6afa0,
+ /* cd */ 0xe6b0a0, 0xe6b0a1, 0xe6b4a8, 0xe6b4b4,
+ /* d1 */ 0xe6b4ad, 0xe6b49f, 0xe6b4bc, 0xe6b4bf,
+ /* d5 */ 0xe6b492, 0xe6b48a, 0xe6b39a, 0xe6b4b3,
+ /* d9 */ 0xe6b484, 0xe6b499, 0xe6b4ba, 0xe6b49a,
+ /* dd */ 0xe6b491, 0xe6b480, 0xe6b49d, 0xe6b582,
+ /* e1 */ 0xe6b481, 0xe6b498, 0xe6b4b7, 0xe6b483,
+ /* e5 */ 0xe6b48f, 0xe6b580, 0xe6b487, 0xe6b4a0,
+ /* e9 */ 0xe6b4ac, 0xe6b488, 0xe6b4a2, 0xe6b489,
+ /* ed */ 0xe6b490, 0xe782b7, 0xe7829f, 0xe782be,
+ /* f1 */ 0xe782b1, 0xe782b0, 0xe782a1, 0xe782b4,
+ /* f5 */ 0xe782b5, 0xe782a9, 0xe78981, 0xe78989,
+ /* f9 */ 0xe7898a, 0xe789ac, 0xe789b0, 0xe789b3,
+ /* fd */ 0xe789ae, 0xe78b8a,
+
+ /*** Four byte table, leaf: 8ea2acxx - offset 0x035a7 ***/
+
+ /* a1 */ 0xe78ba4, 0xe78ba8, 0xe78bab, 0xe78b9f,
+ /* a5 */ 0xe78baa, 0xe78ba6, 0xe78ba3, 0xe78e85,
+ /* a9 */ 0xe78f8c, 0xe78f82, 0xe78f88, 0xe78f85,
+ /* ad */ 0xe78eb9, 0xe78eb6, 0xe78eb5, 0xe78eb4,
+ /* b1 */ 0xe78fab, 0xe78ebf, 0xe78f87, 0xe78ebe,
+ /* b5 */ 0xe78f83, 0xe78f86, 0xe78eb8, 0xe78f8b,
+ /* b9 */ 0xe793ac, 0xe793ae, 0xe794ae, 0xe79587,
+ /* bd */ 0xe79588, 0xe796a7, 0xe796aa, 0xe799b9,
+ /* c1 */ 0xe79b84, 0xe79c88, 0xe79c83, 0xe79c84,
+ /* c5 */ 0xe79c85, 0xe79c8a, 0xe79bb7, 0xe79bbb,
+ /* c9 */ 0xe79bba, 0xe79fa7, 0xe79fa8, 0xe7a086,
+ /* cd */ 0xe7a091, 0xe7a092, 0xe7a085, 0xe7a090,
+ /* d1 */ 0xe7a08f, 0xe7a08e, 0xe7a089, 0xe7a083,
+ /* d5 */ 0xe7a093, 0xe7a58a, 0xe7a58c, 0xe7a58b,
+ /* d9 */ 0xe7a585, 0xe7a584, 0xe7a795, 0xe7a78d,
+ /* dd */ 0xe7a78f, 0xe7a796, 0xe7a78e, 0xe7aa80,
+ /* e1 */ 0xe7a9be, 0xe7ab91, 0xe7ac80, 0xe7ac81,
+ /* e5 */ 0xe7b1ba, 0xe7b1b8, 0xe7b1b9, 0xe7b1bf,
+ /* e9 */ 0xe7b280, 0xe7b281, 0xe7b483, 0xe7b488,
+ /* ed */ 0xe7b481, 0xe7bd98, 0xe7be91, 0xe7be8d,
+ /* f1 */ 0xe7bebe, 0xe88087, 0xe8808e, 0xe8808f,
+ /* f5 */ 0xe88094, 0xe880b7, 0xe88398, 0xe88387,
+ /* f9 */ 0xe883a0, 0xe88391, 0xe88388, 0xe88382,
+ /* fd */ 0xe88390, 0xe88385,
+
+ /*** Four byte table, leaf: 8ea2adxx - offset 0x03605 ***/
+
+ /* a1 */ 0xe883a3, 0xe88399, 0xe8839c, 0xe8838a,
+ /* a5 */ 0xe88395, 0xe88389, 0xe8838f, 0xe88397,
+ /* a9 */ 0xe883a6, 0xe8838d, 0xe887bf, 0xe888a1,
+ /* ad */ 0xe88a94, 0xe88b99, 0xe88bbe, 0xe88bb9,
+ /* b1 */ 0xe88c87, 0xe88ba8, 0xe88c80, 0xe88b95,
+ /* b5 */ 0xe88cba, 0xe88bab, 0xe88b96, 0xe88bb4,
+ /* b9 */ 0xe88bac, 0xe88ba1, 0xe88bb2, 0xe88bb5,
+ /* bd */ 0xe88c8c, 0xe88bbb, 0xe88bb6, 0xe88bb0,
+ /* c1 */ 0xe88baa, 0xe88ba4, 0xe88ba0, 0xe88bba,
+ /* c5 */ 0xe88bb3, 0xe88bad, 0xe899b7, 0xe899b4,
+ /* c9 */ 0xe899bc, 0xe899b3, 0xe8a181, 0xe8a18e,
+ /* cd */ 0xe8a1a7, 0xe8a1aa, 0xe8a1a9, 0xe8a793,
+ /* d1 */ 0xe8a884, 0xe8a887, 0xe8b5b2, 0xe8bfa3,
+ /* d5 */ 0xe8bfa1, 0xe8bfae, 0xe8bfa0, 0xe983b1,
+ /* d9 */ 0xe982bd, 0xe982bf, 0xe98395, 0xe98385,
+ /* dd */ 0xe982be, 0xe98387, 0xe9838b, 0xe98388,
+ /* e1 */ 0xe98794, 0xe98793, 0xe99994, 0xe9998f,
+ /* e5 */ 0xe99991, 0xe99993, 0xe9998a, 0xe9998e,
+ /* e9 */ 0xe5809e, 0xe58085, 0xe58087, 0xe58093,
+ /* ed */ 0xe580a2, 0xe580b0, 0xe5809b, 0xe4bfb5,
+ /* f1 */ 0xe4bfb4, 0xe580b3, 0xe580b7, 0xe580ac,
+ /* f5 */ 0xe4bfb6, 0xe4bfb7, 0xe58097, 0xe5809c,
+ /* f9 */ 0xe580a0, 0xe580a7, 0xe580b5, 0xe580af,
+ /* fd */ 0xe580b1, 0xe5808e,
+
+ /*** Four byte table, leaf: 8ea2aexx - offset 0x03663 ***/
+
+ /* a1 */ 0xe5859a, 0xe58694, 0xe58693, 0xe5878a,
+ /* a5 */ 0xe58784, 0xe58785, 0xe58788, 0xe5878e,
+ /* a9 */ 0xe589a1, 0xe5899a, 0xe58992, 0xe5899e,
+ /* ad */ 0xe5899f, 0xe58995, 0xe589a2, 0xe58b8d,
+ /* b1 */ 0xe58c8e, 0xe58e9e, 0xe594a6, 0xe593a2,
+ /* b5 */ 0xe59497, 0xe59492, 0xe593a7, 0xe593b3,
+ /* b9 */ 0xe593a4, 0xe5949a, 0xe593bf, 0xe59484,
+ /* bd */ 0xe59488, 0xe593ab, 0xe59491, 0xe59485,
+ /* c1 */ 0xe593b1, 0xe5948a, 0xe593bb, 0xe593b7,
+ /* c5 */ 0xe593b8, 0xe593a0, 0xe5948e, 0xe59483,
+ /* c9 */ 0xe5948b, 0xe59c81, 0xe59c82, 0xe59f8c,
+ /* cd */ 0xe5a0b2, 0xe59f95, 0xe59f92, 0xe59eba,
+ /* d1 */ 0xe59f86, 0xe59ebd, 0xe59ebc, 0xe59eb8,
+ /* d5 */ 0xe59eb6, 0xe59ebf, 0xe59f87, 0xe59f90,
+ /* d9 */ 0xe59eb9, 0xe59f81, 0xe5a48e, 0xe5a58a,
+ /* dd */ 0xe5a899, 0xe5a896, 0xe5a8ad, 0xe5a8ae,
+ /* e1 */ 0xe5a895, 0xe5a88f, 0xe5a897, 0xe5a88a,
+ /* e5 */ 0xe5a89e, 0xe5a8b3, 0xe5adac, 0xe5aea7,
+ /* e9 */ 0xe5aead, 0xe5aeac, 0xe5b083, 0xe5b196,
+ /* ed */ 0xe5b194, 0xe5b3ac, 0xe5b3bf, 0xe5b3ae,
+ /* f1 */ 0xe5b3b1, 0xe5b3b7, 0xe5b480, 0xe5b3b9,
+ /* f5 */ 0xe5b8a9, 0xe5b8a8, 0xe5baa8, 0xe5baae,
+ /* f9 */ 0xe5baaa, 0xe5baac, 0xe5bcb3, 0xe5bcb0,
+ /* fd */ 0xe5bda7, 0xe6819d,
+
+ /*** Four byte table, leaf: 8ea2afxx - offset 0x036c1 ***/
+
+ /* a1 */ 0xe6819a, 0xe681a7, 0xe68181, 0xe682a2,
+ /* a5 */ 0xe68288, 0xe68280, 0xe68292, 0xe68281,
+ /* a9 */ 0xe6829d, 0xe68283, 0xe68295, 0xe6829b,
+ /* ad */ 0xe68297, 0xe68287, 0xe6829c, 0xe6828e,
+ /* b1 */ 0xe68899, 0xe68986, 0xe68bb2, 0xe68c90,
+ /* b5 */ 0xe68d96, 0xe68cac, 0xe68d84, 0xe68d85,
+ /* b9 */ 0xe68cb6, 0xe68d83, 0xe68fa4, 0xe68cb9,
+ /* bd */ 0xe68d8b, 0xe68d8a, 0xe68cbc, 0xe68ca9,
+ /* c1 */ 0xe68d81, 0xe68cb4, 0xe68d98, 0xe68d94,
+ /* c5 */ 0xe68d99, 0xe68cad, 0xe68d87, 0xe68cb3,
+ /* c9 */ 0xe68d9a, 0xe68d91, 0xe68cb8, 0xe68d97,
+ /* cd */ 0xe68d80, 0xe68d88, 0xe6958a, 0xe69586,
+ /* d1 */ 0xe69786, 0xe69783, 0xe69784, 0xe69782,
+ /* d5 */ 0xe6998a, 0xe6999f, 0xe69987, 0xe69991,
+ /* d9 */ 0xe69c92, 0xe69c93, 0xe6a09f, 0xe6a09a,
+ /* dd */ 0xe6a189, 0xe6a0b2, 0xe6a0b3, 0xe6a0bb,
+ /* e1 */ 0xe6a18b, 0xe6a18f, 0xe6a096, 0xe6a0b1,
+ /* e5 */ 0xe6a09c, 0xe6a0b5, 0xe6a0ab, 0xe6a0ad,
+ /* e9 */ 0xe6a0af, 0xe6a18e, 0xe6a184, 0xe6a0b4,
+ /* ed */ 0xe6a09d, 0xe6a092, 0xe6a094, 0xe6a0a6,
+ /* f1 */ 0xe6a0a8, 0xe6a0ae, 0xe6a18d, 0xe6a0ba,
+ /* f5 */ 0xe6a0a5, 0xe6a0a0, 0xe6acac, 0xe6acaf,
+ /* f9 */ 0xe6acad, 0xe6acb1, 0xe6acb4, 0xe6adad,
+ /* fd */ 0xe88282, 0xe6ae88,
+
+ /*** Four byte table, leaf: 8ea2b0xx - offset 0x0371f ***/
+
+ /* a1 */ 0xe6afa6, 0xe6afa4, 0xe6afa8, 0xe6afa3,
+ /* a5 */ 0xe6afa2, 0xe6afa7, 0xe6b0a5, 0xe6b5ba,
+ /* a9 */ 0xe6b5a3, 0xe6b5a4, 0xe6b5b6, 0xe6b48d,
+ /* ad */ 0xe6b5a1, 0xe6b692, 0xe6b598, 0xe6b5a2,
+ /* b1 */ 0xe6b5ad, 0xe6b5af, 0xe6b691, 0xe6b68d,
+ /* b5 */ 0xe6b7af, 0xe6b5bf, 0xe6b686, 0xe6b59e,
+ /* b9 */ 0xe6b5a7, 0xe6b5a0, 0xe6b697, 0xe6b5b0,
+ /* bd */ 0xe6b5bc, 0xe6b59f, 0xe6b682, 0xe6b698,
+ /* c1 */ 0xe6b4af, 0xe6b5a8, 0xe6b68b, 0xe6b5be,
+ /* c5 */ 0xe6b680, 0xe6b684, 0xe6b496, 0xe6b683,
+ /* c9 */ 0xe6b5bb, 0xe6b5bd, 0xe6b5b5, 0xe6b690,
+ /* cd */ 0xe7839c, 0xe78393, 0xe78391, 0xe7839d,
+ /* d1 */ 0xe7838b, 0xe7bcb9, 0xe783a2, 0xe78397,
+ /* d5 */ 0xe78392, 0xe7839e, 0xe783a0, 0xe78394,
+ /* d9 */ 0xe7838d, 0xe78385, 0xe78386, 0xe78387,
+ /* dd */ 0xe7839a, 0xe7838e, 0xe783a1, 0xe78982,
+ /* e1 */ 0xe789b8, 0xe789b7, 0xe789b6, 0xe78c80,
+ /* e5 */ 0xe78bba, 0xe78bb4, 0xe78bbe, 0xe78bb6,
+ /* e9 */ 0xe78bb3, 0xe78bbb, 0xe78c81, 0xe78f93,
+ /* ed */ 0xe78f99, 0xe78fa5, 0xe78f96, 0xe78ebc,
+ /* f1 */ 0xe78fa7, 0xe78fa3, 0xe78fa9, 0xe78f9c,
+ /* f5 */ 0xe78f92, 0xe78f9b, 0xe78f94, 0xe78f9d,
+ /* f9 */ 0xe78f9a, 0xe78f97, 0xe78f98, 0xe78fa8,
+ /* fd */ 0xe7939e, 0xe7939f,
+
+ /*** Four byte table, leaf: 8ea2b1xx - offset 0x0377d ***/
+
+ /* a1 */ 0xe793b4, 0xe793b5, 0xe794a1, 0xe7959b,
+ /* a5 */ 0xe7959f, 0xe796b0, 0xe79781, 0xe796bb,
+ /* a9 */ 0xe79784, 0xe79780, 0xe796bf, 0xe796b6,
+ /* ad */ 0xe796ba, 0xe79a8a, 0xe79b89, 0xe79c9d,
+ /* b1 */ 0xe79c9b, 0xe79c90, 0xe79c93, 0xe79c92,
+ /* b5 */ 0xe79ca3, 0xe79c91, 0xe79c95, 0xe79c99,
+ /* b9 */ 0xe79c9a, 0xe79ca2, 0xe79ca7, 0xe7a0a3,
+ /* bd */ 0xe7a0ac, 0xe7a0a2, 0xe7a0b5, 0xe7a0af,
+ /* c1 */ 0xe7a0a8, 0xe7a0ae, 0xe7a0ab, 0xe7a0a1,
+ /* c5 */ 0xe7a0a9, 0xe7a0b3, 0xe7a0aa, 0xe7a0b1,
+ /* c9 */ 0xe7a594, 0xe7a59b, 0xe7a58f, 0xe7a59c,
+ /* cd */ 0xe7a593, 0xe7a592, 0xe7a591, 0xe7a7ab,
+ /* d1 */ 0xe7a7ac, 0xe7a7a0, 0xe7a7ae, 0xe7a7ad,
+ /* d5 */ 0xe7a7aa, 0xe7a79c, 0xe7a79e, 0xe7a79d,
+ /* d9 */ 0xe7aa86, 0xe7aa89, 0xe7aa85, 0xe7aa8b,
+ /* dd */ 0xe7aa8c, 0xe7aa8a, 0xe7aa87, 0xe7ab98,
+ /* e1 */ 0xe7ac90, 0xe7ac84, 0xe7ac93, 0xe7ac85,
+ /* e5 */ 0xe7ac8f, 0xe7ac88, 0xe7ac8a, 0xe7ac8e,
+ /* e9 */ 0xe7ac89, 0xe7ac92, 0xe7b284, 0xe7b291,
+ /* ed */ 0xe7b28a, 0xe7b28c, 0xe7b288, 0xe7b28d,
+ /* f1 */ 0xe7b285, 0xe7b49e, 0xe7b49d, 0xe7b491,
+ /* f5 */ 0xe7b48e, 0xe7b498, 0xe7b496, 0xe7b493,
+ /* f9 */ 0xe7b49f, 0xe7b492, 0xe7b48f, 0xe7b48c,
+ /* fd */ 0xe7bd9c, 0xe7bda1,
+
+ /*** Four byte table, leaf: 8ea2b2xx - offset 0x037db ***/
+
+ /* a1 */ 0xe7bd9e, 0xe7bda0, 0xe7bd9d, 0xe7bd9b,
+ /* a5 */ 0xe7be96, 0xe7be92, 0xe7bf83, 0xe7bf82,
+ /* a9 */ 0xe7bf80, 0xe88096, 0xe880be, 0xe880b9,
+ /* ad */ 0xe883ba, 0xe883b2, 0xe883b9, 0xe883b5,
+ /* b1 */ 0xe88481, 0xe883bb, 0xe88480, 0xe88881,
+ /* b5 */ 0xe888af, 0xe888a5, 0xe88cb3, 0xe88cad,
+ /* b9 */ 0xe88d84, 0xe88c99, 0xe88d91, 0xe88ca5,
+ /* bd */ 0xe88d96, 0xe88cbf, 0xe88d81, 0xe88ca6,
+ /* c1 */ 0xe88c9c, 0xe88ca2, 0xe88d82, 0xe88d8e,
+ /* c5 */ 0xe88c9b, 0xe88caa, 0xe88c88, 0xe88cbc,
+ /* c9 */ 0xe88d8d, 0xe88c96, 0xe88ca4, 0xe88ca0,
+ /* cd */ 0xe88cb7, 0xe88caf, 0xe88ca9, 0xe88d87,
+ /* d1 */ 0xe88d85, 0xe88d8c, 0xe88d93, 0xe88c9e,
+ /* d5 */ 0xe88cac, 0xe88d8b, 0xe88ca7, 0xe88d88,
+ /* d9 */ 0xe89993, 0xe89992, 0xe89aa2, 0xe89aa8,
+ /* dd */ 0xe89a96, 0xe89a8d, 0xe89a91, 0xe89a9e,
+ /* e1 */ 0xe89a87, 0xe89a97, 0xe89a86, 0xe89a8b,
+ /* e5 */ 0xe89a9a, 0xe89a85, 0xe89aa5, 0xe89a99,
+ /* e9 */ 0xe89aa1, 0xe89aa7, 0xe89a95, 0xe89a98,
+ /* ed */ 0xe89a8e, 0xe89a9d, 0xe89a90, 0xe89a94,
+ /* f1 */ 0xe8a183, 0xe8a184, 0xe8a1ad, 0xe8a1b5,
+ /* f5 */ 0xe8a1b6, 0xe8a1b2, 0xe8a280, 0xe8a1b1,
+ /* f9 */ 0xe8a1bf, 0xe8a1af, 0xe8a283, 0xe8a1be,
+ /* fd */ 0xe8a1b4, 0xe8a1bc,
+
+ /*** Four byte table, leaf: 8ea2b3xx - offset 0x03839 ***/
+
+ /* a1 */ 0xe8a892, 0xe8b187, 0xe8b197, 0xe8b1bb,
+ /* a5 */ 0xe8b2a4, 0xe8b2a3, 0xe8b5b6, 0xe8b5b8,
+ /* a9 */ 0xe8b6b5, 0xe8b6b7, 0xe8b6b6, 0xe8bb91,
+ /* ad */ 0xe8bb93, 0xe8bfbe, 0xe8bfb5, 0xe98082,
+ /* b1 */ 0xe8bfbf, 0xe8bfbb, 0xe98084, 0xe8bfbc,
+ /* b5 */ 0xe8bfb6, 0xe98396, 0xe983a0, 0xe98399,
+ /* b9 */ 0xe9839a, 0xe983a3, 0xe9839f, 0xe983a5,
+ /* bd */ 0xe98398, 0xe9839b, 0xe98397, 0xe9839c,
+ /* c1 */ 0xe983a4, 0xe98590, 0xe9858e, 0xe9858f,
+ /* c5 */ 0xe98795, 0xe987a2, 0xe9879a, 0xe9999c,
+ /* c9 */ 0xe9999f, 0xe99abc, 0xe9a3a3, 0xe9ab9f,
+ /* cd */ 0xe9acaf, 0xe4b9bf, 0xe581b0, 0xe581aa,
+ /* d1 */ 0xe581a1, 0xe5819e, 0xe581a0, 0xe58193,
+ /* d5 */ 0xe5818b, 0xe5819d, 0xe581b2, 0xe58188,
+ /* d9 */ 0xe5818d, 0xe58181, 0xe5819b, 0xe5818a,
+ /* dd */ 0xe581a2, 0xe58095, 0xe58185, 0xe5819f,
+ /* e1 */ 0xe581a9, 0xe581ab, 0xe581a3, 0xe581a4,
+ /* e5 */ 0xe58186, 0xe58180, 0xe581ae, 0xe581b3,
+ /* e9 */ 0xe58197, 0xe58191, 0xe58790, 0xe589ab,
+ /* ed */ 0xe589ad, 0xe589ac, 0xe589ae, 0xe58b96,
+ /* f1 */ 0xe58b93, 0xe58cad, 0xe58e9c, 0xe595b5,
+ /* f5 */ 0xe595b6, 0xe594bc, 0xe5958d, 0xe59590,
+ /* f9 */ 0xe594b4, 0xe594aa, 0xe59591, 0xe595a2,
+ /* fd */ 0xe594b6, 0xe594b5,
+
+ /*** Four byte table, leaf: 8ea2b4xx - offset 0x03897 ***/
+
+ /* a1 */ 0xe594b0, 0xe59592, 0xe59585, 0xe5948c,
+ /* a5 */ 0xe594b2, 0xe595a5, 0xe5958e, 0xe594b9,
+ /* a9 */ 0xe59588, 0xe594ad, 0xe594bb, 0xe59580,
+ /* ad */ 0xe5958b, 0xe59c8a, 0xe59c87, 0xe59fbb,
+ /* b1 */ 0xe5a094, 0xe59fa2, 0xe59fb6, 0xe59f9c,
+ /* b5 */ 0xe59fb4, 0xe5a080, 0xe59fad, 0xe59fbd,
+ /* b9 */ 0xe5a088, 0xe59fb8, 0xe5a08b, 0xe59fb3,
+ /* bd */ 0xe59f8f, 0xe5a087, 0xe59fae, 0xe59fa3,
+ /* c1 */ 0xe59fb2, 0xe59fa5, 0xe59fac, 0xe59fa1,
+ /* c5 */ 0xe5a08e, 0xe59fbc, 0xe5a090, 0xe59fa7,
+ /* c9 */ 0xe5a081, 0xe5a08c, 0xe59fb1, 0xe59fa9,
+ /* cd */ 0xe59fb0, 0xe5a08d, 0xe5a084, 0xe5a59c,
+ /* d1 */ 0xe5a9a0, 0xe5a998, 0xe5a995, 0xe5a9a7,
+ /* d5 */ 0xe5a99e, 0xe5a8b8, 0xe5a8b5, 0xe5a9ad,
+ /* d9 */ 0xe5a990, 0xe5a99f, 0xe5a9a5, 0xe5a9ac,
+ /* dd */ 0xe5a993, 0xe5a9a4, 0xe5a997, 0xe5a983,
+ /* e1 */ 0xe5a99d, 0xe5a992, 0xe5a984, 0xe5a99b,
+ /* e5 */ 0xe5a988, 0xe5aa8e, 0xe5a8be, 0xe5a98d,
+ /* e9 */ 0xe5a8b9, 0xe5a98c, 0xe5a9b0, 0xe5a9a9,
+ /* ed */ 0xe5a987, 0xe5a991, 0xe5a996, 0xe5a982,
+ /* f1 */ 0xe5a99c, 0xe5adb2, 0xe5adae, 0xe5af81,
+ /* f5 */ 0xe5af80, 0xe5b199, 0xe5b49e, 0xe5b48b,
+ /* f9 */ 0xe5b49d, 0xe5b49a, 0xe5b4a0, 0xe5b48c,
+ /* fd */ 0xe5b4a8, 0xe5b48d,
+
+ /*** Four byte table, leaf: 8ea2b5xx - offset 0x038f5 ***/
+
+ /* a1 */ 0xe5b4a6, 0xe5b4a5, 0xe5b48f, 0xe5b4b0,
+ /* a5 */ 0xe5b492, 0xe5b4a3, 0xe5b49f, 0xe5b4ae,
+ /* a9 */ 0xe5b8be, 0xe5b8b4, 0xe5bab1, 0xe5bab4,
+ /* ad */ 0xe5bab9, 0xe5bab2, 0xe5bab3, 0xe5bcb6,
+ /* b1 */ 0xe5bcb8, 0xe5be9b, 0xe5be96, 0xe5be9f,
+ /* b5 */ 0xe6828a, 0xe68290, 0xe68286, 0xe682be,
+ /* b9 */ 0xe682b0, 0xe682ba, 0xe68393, 0xe68394,
+ /* bd */ 0xe6838f, 0xe683a4, 0xe68399, 0xe6839d,
+ /* c1 */ 0xe68388, 0xe682b1, 0xe6839b, 0xe682b7,
+ /* c5 */ 0xe6838a, 0xe682bf, 0xe68383, 0xe6838d,
+ /* c9 */ 0xe68380, 0xe68cb2, 0xe68da5, 0xe68e8a,
+ /* cd */ 0xe68e82, 0xe68dbd, 0xe68ebd, 0xe68e9e,
+ /* d1 */ 0xe68ead, 0xe68e9d, 0xe68e97, 0xe68eab,
+ /* d5 */ 0xe68e8e, 0xe68daf, 0xe68e87, 0xe68e90,
+ /* d9 */ 0xe68dae, 0xe68eaf, 0xe68db5, 0xe68e9c,
+ /* dd */ 0xe68dad, 0xe68eae, 0xe68dbc, 0xe68ea4,
+ /* e1 */ 0xe68cbb, 0xe68e9f, 0xe68db8, 0xe68e85,
+ /* e5 */ 0xe68e81, 0xe68e91, 0xe68e8d, 0xe68db0,
+ /* e9 */ 0xe69593, 0xe6978d, 0xe699a5, 0xe699a1,
+ /* ed */ 0xe6999b, 0xe69999, 0xe6999c, 0xe699a2,
+ /* f1 */ 0xe69c98, 0xe6a1b9, 0xe6a287, 0xe6a290,
+ /* f5 */ 0xe6a29c, 0xe6a1ad, 0xe6a1ae, 0xe6a2ae,
+ /* f9 */ 0xe6a2ab, 0xe6a596, 0xe6a1af, 0xe6a2a3,
+ /* fd */ 0xe6a2ac, 0xe6a2a9,
+
+ /*** Four byte table, leaf: 8ea2b6xx - offset 0x03953 ***/
+
+ /* a1 */ 0xe6a1b5, 0xe6a1b4, 0xe6a2b2, 0xe6a28f,
+ /* a5 */ 0xe6a1b7, 0xe6a292, 0xe6a1bc, 0xe6a1ab,
+ /* a9 */ 0xe6a1b2, 0xe6a2aa, 0xe6a280, 0xe6a1b1,
+ /* ad */ 0xe6a1be, 0xe6a29b, 0xe6a296, 0xe6a28b,
+ /* b1 */ 0xe6a2a0, 0xe6a289, 0xe6a2a4, 0xe6a1b8,
+ /* b5 */ 0xe6a1bb, 0xe6a291, 0xe6a28c, 0xe6a28a,
+ /* b9 */ 0xe6a1bd, 0xe6acb6, 0xe6acb3, 0xe6acb7,
+ /* bd */ 0xe6acb8, 0xe6ae91, 0xe6ae8f, 0xe6ae8d,
+ /* c1 */ 0xe6ae8e, 0xe6ae8c, 0xe6b0aa, 0xe6b780,
+ /* c5 */ 0xe6b6ab, 0xe6b6b4, 0xe6b6b3, 0xe6b9b4,
+ /* c9 */ 0xe6b6ac, 0xe6b7a9, 0xe6b7a2, 0xe6b6b7,
+ /* cd */ 0xe6b7b6, 0xe6b794, 0xe6b880, 0xe6b788,
+ /* d1 */ 0xe6b7a0, 0xe6b79f, 0xe6b796, 0xe6b6be,
+ /* d5 */ 0xe6b7a5, 0xe6b79c, 0xe6b79d, 0xe6b79b,
+ /* d9 */ 0xe6b7b4, 0xe6b78a, 0xe6b6bd, 0xe6b7ad,
+ /* dd */ 0xe6b7b0, 0xe6b6ba, 0xe6b795, 0xe6b782,
+ /* e1 */ 0xe6b78f, 0xe6b789, 0xe6b790, 0xe6b7b2,
+ /* e5 */ 0xe6b793, 0xe6b7bd, 0xe6b797, 0xe6b78d,
+ /* e9 */ 0xe6b7a3, 0xe6b6bb, 0xe783ba, 0xe7848d,
+ /* ed */ 0xe783b7, 0xe78497, 0xe783b4, 0xe7848c,
+ /* f1 */ 0xe783b0, 0xe78484, 0xe783b3, 0xe78490,
+ /* f5 */ 0xe783bc, 0xe783bf, 0xe78486, 0xe78493,
+ /* f9 */ 0xe78480, 0xe783b8, 0xe783b6, 0xe7848b,
+ /* fd */ 0xe78482, 0xe7848e,
+
+ /*** Four byte table, leaf: 8ea2b7xx - offset 0x039b1 ***/
+
+ /* a1 */ 0xe789be, 0xe789bb, 0xe789bc, 0xe789bf,
+ /* a5 */ 0xe78c9d, 0xe78c97, 0xe78c87, 0xe78c91,
+ /* a9 */ 0xe78c98, 0xe78c8a, 0xe78c88, 0xe78bbf,
+ /* ad */ 0xe78c8f, 0xe78c9e, 0xe78e88, 0xe78fb6,
+ /* b1 */ 0xe78fb8, 0xe78fb5, 0xe79084, 0xe79081,
+ /* b5 */ 0xe78fbd, 0xe79087, 0xe79080, 0xe78fba,
+ /* b9 */ 0xe78fbc, 0xe78fbf, 0xe7908c, 0xe7908b,
+ /* bd */ 0xe78fb4, 0xe79088, 0xe795a4, 0xe795a3,
+ /* c1 */ 0xe7978e, 0xe79792, 0xe7978f, 0xe7978b,
+ /* c5 */ 0xe7978c, 0xe79791, 0xe79790, 0xe79a8f,
+ /* c9 */ 0xe79a89, 0xe79b93, 0xe79cb9, 0xe79caf,
+ /* cd */ 0xe79cad, 0xe79cb1, 0xe79cb2, 0xe79cb4,
+ /* d1 */ 0xe79cb3, 0xe79cbd, 0xe79ca5, 0xe79cbb,
+ /* d5 */ 0xe79cb5, 0xe7a188, 0xe7a192, 0xe7a189,
+ /* d9 */ 0xe7a18d, 0xe7a18a, 0xe7a18c, 0xe7a0a6,
+ /* dd */ 0xe7a185, 0xe7a190, 0xe7a5a4, 0xe7a5a7,
+ /* e1 */ 0xe7a5a9, 0xe7a5aa, 0xe7a5a3, 0xe7a5ab,
+ /* e5 */ 0xe7a5a1, 0xe7a6bb, 0xe7a7ba, 0xe7a7b8,
+ /* e9 */ 0xe7a7b6, 0xe7a7b7, 0xe7aa8f, 0xe7aa94,
+ /* ed */ 0xe7aa90, 0xe7acb5, 0xe7acbb, 0xe7acb4,
+ /* f1 */ 0xe7aca5, 0xe7acb0, 0xe7aca2, 0xe7aca4,
+ /* f5 */ 0xe7acb3, 0xe7ac98, 0xe7acaa, 0xe7ac9d,
+ /* f9 */ 0xe7acb1, 0xe7acab, 0xe7acad, 0xe7acaf,
+ /* fd */ 0xe7acb2, 0xe7acb8,
+
+ /*** Four byte table, leaf: 8ea2b8xx - offset 0x03a0f ***/
+
+ /* a1 */ 0xe7ac9a, 0xe7aca3, 0xe7b294, 0xe7b298,
+ /* a5 */ 0xe7b296, 0xe7b2a3, 0xe7b4b5, 0xe7b4bd,
+ /* a9 */ 0xe7b4b8, 0xe7b4b6, 0xe7b4ba, 0xe7b585,
+ /* ad */ 0xe7b4ac, 0xe7b4a9, 0xe7b581, 0xe7b587,
+ /* b1 */ 0xe7b4be, 0xe7b4bf, 0xe7b58a, 0xe7b4bb,
+ /* b5 */ 0xe7b4a8, 0xe7bda3, 0xe7be95, 0xe7be9c,
+ /* b9 */ 0xe7be9d, 0xe7be9b, 0xe7bf8a, 0xe7bf8b,
+ /* bd */ 0xe7bf8d, 0xe7bf90, 0xe7bf91, 0xe7bf87,
+ /* c1 */ 0xe7bf8f, 0xe7bf89, 0xe8809f, 0xe8809e,
+ /* c5 */ 0xe8809b, 0xe88187, 0xe88183, 0xe88188,
+ /* c9 */ 0xe88498, 0xe884a5, 0xe88499, 0xe8849b,
+ /* cd */ 0xe884ad, 0xe8849f, 0xe884ac, 0xe8849e,
+ /* d1 */ 0xe884a1, 0xe88495, 0xe884a7, 0xe8849d,
+ /* d5 */ 0xe884a2, 0xe88891, 0xe888b8, 0xe888b3,
+ /* d9 */ 0xe888ba, 0xe888b4, 0xe888b2, 0xe889b4,
+ /* dd */ 0xe88e90, 0xe88ea3, 0xe88ea8, 0xe88e8d,
+ /* e1 */ 0xe88dba, 0xe88db3, 0xe88ea4, 0xe88db4,
+ /* e5 */ 0xe88e8f, 0xe88e81, 0xe88e95, 0xe88e99,
+ /* e9 */ 0xe88db5, 0xe88e94, 0xe88ea9, 0xe88dbd,
+ /* ed */ 0xe88e83, 0xe88e8c, 0xe88e9d, 0xe88e9b,
+ /* f1 */ 0xe88eaa, 0xe88e8b, 0xe88dbe, 0xe88ea5,
+ /* f5 */ 0xe88eaf, 0xe88e88, 0xe88e97, 0xe88eb0,
+ /* f9 */ 0xe88dbf, 0xe88ea6, 0xe88e87, 0xe88eae,
+ /* fd */ 0xe88db6, 0xe89999,
+
+ /*** Four byte table, leaf: 8ea2b9xx - offset 0x03a6d ***/
+
+ /* a1 */ 0xe89996, 0xe89abf, 0xe89ab7, 0xe89b82,
+ /* a5 */ 0xe89b81, 0xe89b85, 0xe89aba, 0xe89ab0,
+ /* a9 */ 0xe89b88, 0xe89ab9, 0xe89ab3, 0xe89ab8,
+ /* ad */ 0xe89b8c, 0xe89ab4, 0xe89abb, 0xe89abc,
+ /* b1 */ 0xe89b83, 0xe89abd, 0xe89abe, 0xe8a192,
+ /* b5 */ 0xe8a289, 0xe8a295, 0xe8a2a8, 0xe8a2a2,
+ /* b9 */ 0xe8a2aa, 0xe8a29a, 0xe8a291, 0xe8a2a1,
+ /* bd */ 0xe8a29f, 0xe8a298, 0xe8a2a7, 0xe8a299,
+ /* c1 */ 0xe8a29b, 0xe8a297, 0xe8a2a4, 0xe8a2ac,
+ /* c5 */ 0xe8a28c, 0xe8a293, 0xe8a28e, 0xe8a682,
+ /* c9 */ 0xe8a796, 0xe8a799, 0xe8a795, 0xe8a8b0,
+ /* cd */ 0xe8a8a7, 0xe8a8ac, 0xe8a89e, 0xe8b0b9,
+ /* d1 */ 0xe8b0bb, 0xe8b19c, 0xe8b19d, 0xe8b1bd,
+ /* d5 */ 0xe8b2a5, 0xe8b5bd, 0xe8b5bb, 0xe8b5b9,
+ /* d9 */ 0xe8b6bc, 0xe8b782, 0xe8b6b9, 0xe8b6bf,
+ /* dd */ 0xe8b781, 0xe8bb98, 0xe8bb9e, 0xe8bb9d,
+ /* e1 */ 0xe8bb9c, 0xe8bb97, 0xe8bba0, 0xe8bba1,
+ /* e5 */ 0xe980a4, 0xe9808b, 0xe98091, 0xe9809c,
+ /* e9 */ 0xe9808c, 0xe980a1, 0xe983af, 0xe983aa,
+ /* ed */ 0xe983b0, 0xe983b4, 0xe983b2, 0xe983b3,
+ /* f1 */ 0xe98394, 0xe983ab, 0xe983ac, 0xe983a9,
+ /* f5 */ 0xe98596, 0xe98598, 0xe9859a, 0xe98593,
+ /* f9 */ 0xe98595, 0xe987ac, 0xe987b4, 0xe987b1,
+ /* fd */ 0xe987b3, 0xe987b8,
+
+ /*** Four byte table, leaf: 8ea2baxx - offset 0x03acb ***/
+
+ /* a1 */ 0xe987a4, 0xe987b9, 0xe987aa, 0xe987ab,
+ /* a5 */ 0xe987b7, 0xe987a8, 0xe987ae, 0xe995ba,
+ /* a9 */ 0xe99686, 0xe99688, 0xe999bc, 0xe999ad,
+ /* ad */ 0xe999ab, 0xe999b1, 0xe999af, 0xe99abf,
+ /* b1 */ 0xe99daa, 0xe9a084, 0xe9a3a5, 0xe9a697,
+ /* b5 */ 0xe5829b, 0xe58295, 0xe58294, 0xe5829e,
+ /* b9 */ 0xe5828b, 0xe582a3, 0xe58283, 0xe5828c,
+ /* bd */ 0xe5828e, 0xe5829d, 0xe581a8, 0xe5829c,
+ /* c1 */ 0xe58292, 0xe58282, 0xe58287, 0xe5859f,
+ /* c5 */ 0xe58794, 0xe58c92, 0xe58c91, 0xe58ea4,
+ /* c9 */ 0xe58ea7, 0xe59691, 0xe596a8, 0xe596a5,
+ /* cd */ 0xe596ad, 0xe595b7, 0xe59985, 0xe596a2,
+ /* d1 */ 0xe59693, 0xe59688, 0xe5968f, 0xe596b5,
+ /* d5 */ 0xe59681, 0xe596a3, 0xe59692, 0xe596a4,
+ /* d9 */ 0xe595bd, 0xe5968c, 0xe596a6, 0xe595bf,
+ /* dd */ 0xe59695, 0xe596a1, 0xe5968e, 0xe59c8c,
+ /* e1 */ 0xe5a0a9, 0xe5a0b7, 0xe5a099, 0xe5a09e,
+ /* e5 */ 0xe5a0a7, 0xe5a0a3, 0xe5a0a8, 0xe59fb5,
+ /* e9 */ 0xe5a188, 0xe5a0a5, 0xe5a09c, 0xe5a09b,
+ /* ed */ 0xe5a0b3, 0xe5a0bf, 0xe5a0b6, 0xe5a0ae,
+ /* f1 */ 0xe5a0b9, 0xe5a0b8, 0xe5a0ad, 0xe5a0ac,
+ /* f5 */ 0xe5a0bb, 0xe5a5a1, 0xe5aaaf, 0xe5aa94,
+ /* f9 */ 0xe5aa9f, 0xe5a9ba, 0xe5aaa2, 0xe5aa9e,
+ /* fd */ 0xe5a9b8, 0xe5aaa6,
+
+ /*** Four byte table, leaf: 8ea2bbxx - offset 0x03b29 ***/
+
+ /* a1 */ 0xe5a9bc, 0xe5aaa5, 0xe5aaac, 0xe5aa95,
+ /* a5 */ 0xe5aaae, 0xe5a8b7, 0xe5aa84, 0xe5aa8a,
+ /* a9 */ 0xe5aa97, 0xe5aa83, 0xe5aa8b, 0xe5aaa9,
+ /* ad */ 0xe5a9bb, 0xe5a9bd, 0xe5aa8c, 0xe5aa9c,
+ /* b1 */ 0xe5aa8f, 0xe5aa93, 0xe5aa9d, 0xe5afaa,
+ /* b5 */ 0xe5af8d, 0xe5af8b, 0xe5af94, 0xe5af91,
+ /* b9 */ 0xe5af8a, 0xe5af8e, 0xe5b08c, 0xe5b0b0,
+ /* bd */ 0xe5b4b7, 0xe5b583, 0xe5b5ab, 0xe5b581,
+ /* c1 */ 0xe5b58b, 0xe5b4bf, 0xe5b4b5, 0xe5b591,
+ /* c5 */ 0xe5b58e, 0xe5b595, 0xe5b4b3, 0xe5b4ba,
+ /* c9 */ 0xe5b592, 0xe5b4bd, 0xe5b4b1, 0xe5b599,
+ /* cd */ 0xe5b582, 0xe5b4b9, 0xe5b589, 0xe5b4b8,
+ /* d1 */ 0xe5b4bc, 0xe5b4b2, 0xe5b4b6, 0xe5b580,
+ /* d5 */ 0xe5b585, 0xe5b984, 0xe5b981, 0xe5bd98,
+ /* d9 */ 0xe5bea6, 0xe5bea5, 0xe5beab, 0xe68389,
+ /* dd */ 0xe682b9, 0xe6838c, 0xe683a2, 0xe6838e,
+ /* e1 */ 0xe68384, 0xe68494, 0xe683b2, 0xe6848a,
+ /* e5 */ 0xe68496, 0xe68485, 0xe683b5, 0xe68493,
+ /* e9 */ 0xe683b8, 0xe683bc, 0xe683be, 0xe68381,
+ /* ed */ 0xe68483, 0xe68498, 0xe6849d, 0xe68490,
+ /* f1 */ 0xe683bf, 0xe68484, 0xe6848b, 0xe6898a,
+ /* f5 */ 0xe68e94, 0xe68eb1, 0xe68eb0, 0xe68f8e,
+ /* f9 */ 0xe68fa5, 0xe68fa8, 0xe68faf, 0xe68f83,
+ /* fd */ 0xe6929d, 0xe68fb3,
+
+ /*** Four byte table, leaf: 8ea2bcxx - offset 0x03b87 ***/
+
+ /* a1 */ 0xe68f8a, 0xe68fa0, 0xe68fb6, 0xe68f95,
+ /* a5 */ 0xe68fb2, 0xe68fb5, 0xe691a1, 0xe68f9f,
+ /* a9 */ 0xe68ebe, 0xe68f9d, 0xe68f9c, 0xe68f84,
+ /* ad */ 0xe68f98, 0xe68f93, 0xe68f82, 0xe68f87,
+ /* b1 */ 0xe68f8c, 0xe68f8b, 0xe68f88, 0xe68fb0,
+ /* b5 */ 0xe68f97, 0xe68f99, 0xe694b2, 0xe695a7,
+ /* b9 */ 0xe695aa, 0xe695a4, 0xe6959c, 0xe695a8,
+ /* bd */ 0xe695a5, 0xe6968c, 0xe6969d, 0xe6969e,
+ /* c1 */ 0xe696ae, 0xe69790, 0xe69792, 0xe699bc,
+ /* c5 */ 0xe699ac, 0xe699bb, 0xe69a80, 0xe699b1,
+ /* c9 */ 0xe699b9, 0xe699aa, 0xe699b2, 0xe69c81,
+ /* cd */ 0xe6a48c, 0xe6a393, 0xe6a484, 0xe6a39c,
+ /* d1 */ 0xe6a4aa, 0xe6a3ac, 0xe6a3aa, 0xe6a3b1,
+ /* d5 */ 0xe6a48f, 0xe6a396, 0xe6a3b7, 0xe6a3ab,
+ /* d9 */ 0xe6a3a4, 0xe6a3b6, 0xe6a493, 0xe6a490,
+ /* dd */ 0xe6a3b3, 0xe6a3a1, 0xe6a487, 0xe6a38c,
+ /* e1 */ 0xe6a488, 0xe6a5b0, 0xe6a2b4, 0xe6a491,
+ /* e5 */ 0xe6a3af, 0xe6a386, 0xe6a494, 0xe6a3b8,
+ /* e9 */ 0xe6a390, 0xe6a3bd, 0xe6a3bc, 0xe6a3a8,
+ /* ed */ 0xe6a48b, 0xe6a48a, 0xe6a497, 0xe6a38e,
+ /* f1 */ 0xe6a388, 0xe6a39d, 0xe6a39e, 0xe6a3a6,
+ /* f5 */ 0xe6a3b4, 0xe6a391, 0xe6a486, 0xe6a394,
+ /* f9 */ 0xe6a3a9, 0xe6a495, 0xe6a4a5, 0xe6a387,
+ /* fd */ 0xe6acb9, 0xe6acbb,
+
+ /*** Four byte table, leaf: 8ea2bdxx - offset 0x03be5 ***/
+
+ /* a1 */ 0xe6acbf, 0xe6acbc, 0xe6ae94, 0xe6ae97,
+ /* a5 */ 0xe6ae99, 0xe6ae95, 0xe6aebd, 0xe6afb0,
+ /* a9 */ 0xe6afb2, 0xe6afb3, 0xe6b0b0, 0xe6b7bc,
+ /* ad */ 0xe6b986, 0xe6b987, 0xe6b89f, 0xe6b989,
+ /* b1 */ 0xe6ba88, 0xe6b8bc, 0xe6b8bd, 0xe6b985,
+ /* b5 */ 0xe6b9a2, 0xe6b8ab, 0xe6b8bf, 0xe6b981,
+ /* b9 */ 0xe6b99d, 0xe6b9b3, 0xe6b89c, 0xe6b8b3,
+ /* bd */ 0xe6b98b, 0xe6b980, 0xe6b991, 0xe6b8bb,
+ /* c1 */ 0xe6b883, 0xe6b8ae, 0xe6b99e, 0xe6b9a8,
+ /* c5 */ 0xe6b99c, 0xe6b9a1, 0xe6b8b1, 0xe6b8a8,
+ /* c9 */ 0xe6b9a0, 0xe6b9b1, 0xe6b9ab, 0xe6b8b9,
+ /* cd */ 0xe6b8a2, 0xe6b8b0, 0xe6b993, 0xe6b9a5,
+ /* d1 */ 0xe6b8a7, 0xe6b9b8, 0xe6b9a4, 0xe6b9b7,
+ /* d5 */ 0xe6b995, 0xe6b9b9, 0xe6b992, 0xe6b9a6,
+ /* d9 */ 0xe6b8b5, 0xe6b8b6, 0xe6b99a, 0xe784a0,
+ /* dd */ 0xe7849e, 0xe784af, 0xe783bb, 0xe784ae,
+ /* e1 */ 0xe784b1, 0xe784a3, 0xe784a5, 0xe784a2,
+ /* e5 */ 0xe784b2, 0xe7849f, 0xe784a8, 0xe784ba,
+ /* e9 */ 0xe7849b, 0xe7898b, 0xe7899a, 0xe78a88,
+ /* ed */ 0xe78a89, 0xe78a86, 0xe78a85, 0xe78a8b,
+ /* f1 */ 0xe78c92, 0xe78c8b, 0xe78cb0, 0xe78ca2,
+ /* f5 */ 0xe78cb1, 0xe78cb3, 0xe78ca7, 0xe78cb2,
+ /* f9 */ 0xe78cad, 0xe78ca6, 0xe78ca3, 0xe78cb5,
+ /* fd */ 0xe78c8c, 0xe790ae,
+
+ /*** Four byte table, leaf: 8ea2bexx - offset 0x03c43 ***/
+
+ /* a1 */ 0xe790ac, 0xe790b0, 0xe790ab, 0xe79096,
+ /* a5 */ 0xe7909a, 0xe790a1, 0xe790ad, 0xe790b1,
+ /* a9 */ 0xe790a4, 0xe790a3, 0xe7909d, 0xe790a9,
+ /* ad */ 0xe790a0, 0xe790b2, 0xe793bb, 0xe794af,
+ /* b1 */ 0xe795af, 0xe795ac, 0xe797a7, 0xe7979a,
+ /* b5 */ 0xe797a1, 0xe797a6, 0xe7979d, 0xe7979f,
+ /* b9 */ 0xe797a4, 0xe79797, 0xe79a95, 0xe79a92,
+ /* bd */ 0xe79b9a, 0xe79d86, 0xe79d87, 0xe79d84,
+ /* c1 */ 0xe79d8d, 0xe79d85, 0xe79d8a, 0xe79d8e,
+ /* c5 */ 0xe79d8b, 0xe79d8c, 0xe79f9e, 0xe79fac,
+ /* c9 */ 0xe7a1a0, 0xe7a1a4, 0xe7a1a5, 0xe7a19c,
+ /* cd */ 0xe7a1ad, 0xe7a1b1, 0xe7a1aa, 0xe7a1ae,
+ /* d1 */ 0xe7a1b0, 0xe7a1a9, 0xe7a1a8, 0xe7a19e,
+ /* d5 */ 0xe7a1a2, 0xe7a5b4, 0xe7a5b3, 0xe7a5b2,
+ /* d9 */ 0xe7a5b0, 0xe7a882, 0xe7a88a, 0xe7a883,
+ /* dd */ 0xe7a88c, 0xe7a884, 0xe7aa99, 0xe7aba6,
+ /* e1 */ 0xe7aba4, 0xe7ad8a, 0xe7ad87, 0xe7ad84,
+ /* e5 */ 0xe7ad88, 0xe7ad8c, 0xe7ad8e, 0xe7ad80,
+ /* e9 */ 0xe7ad98, 0xe7ad85, 0xe7b2a2, 0xe7b29e,
+ /* ed */ 0xe7b2a8, 0xe7b2a1, 0xe7b598, 0xe7b5af,
+ /* f1 */ 0xe7b5a3, 0xe7b593, 0xe7b596, 0xe7b5a7,
+ /* f5 */ 0xe7b5aa, 0xe7b58f, 0xe7b5ad, 0xe7b59c,
+ /* f9 */ 0xe7b5ab, 0xe7b592, 0xe7b594, 0xe7b5a9,
+ /* fd */ 0xe7b591, 0xe7b59f,
+
+ /*** Four byte table, leaf: 8ea2bfxx - offset 0x03ca1 ***/
+
+ /* a1 */ 0xe7b58e, 0xe7bcbe, 0xe7bcbf, 0xe7bda5,
+ /* a5 */ 0xe7bda6, 0xe7bea2, 0xe7bea0, 0xe7bea1,
+ /* a9 */ 0xe7bf97, 0xe88191, 0xe8818f, 0xe88190,
+ /* ad */ 0xe883be, 0xe88394, 0xe88583, 0xe8858a,
+ /* b1 */ 0xe88592, 0xe8858f, 0xe88587, 0xe884bd,
+ /* b5 */ 0xe8858d, 0xe884ba, 0xe887a6, 0xe887ae,
+ /* b9 */ 0xe887b7, 0xe887b8, 0xe887b9, 0xe88884,
+ /* bd */ 0xe888bc, 0xe888bd, 0xe888bf, 0xe889b5,
+ /* c1 */ 0xe88cbb, 0xe88f8f, 0xe88fb9, 0xe890a3,
+ /* c5 */ 0xe88f80, 0xe88fa8, 0xe89092, 0xe88fa7,
+ /* c9 */ 0xe88fa4, 0xe88fbc, 0xe88fb6, 0xe89090,
+ /* cd */ 0xe88f86, 0xe88f88, 0xe88fab, 0xe88fa3,
+ /* d1 */ 0xe88ebf, 0xe89081, 0xe88f9d, 0xe88fa5,
+ /* d5 */ 0xe88f98, 0xe88fbf, 0xe88fa1, 0xe88f8b,
+ /* d9 */ 0xe88f8e, 0xe88f96, 0xe88fb5, 0xe88f89,
+ /* dd */ 0xe89089, 0xe8908f, 0xe88f9e, 0xe89091,
+ /* e1 */ 0xe89086, 0xe88f82, 0xe88fb3, 0xe88f95,
+ /* e5 */ 0xe88fba, 0xe88f87, 0xe88f91, 0xe88faa,
+ /* e9 */ 0xe89093, 0xe88e9a, 0xe88f83, 0xe88fac,
+ /* ed */ 0xe88fae, 0xe88f84, 0xe88fbb, 0xe88f97,
+ /* f1 */ 0xe88fa2, 0xe8909b, 0xe88f9b, 0xe88fbe,
+ /* f5 */ 0xe89b98, 0xe89ba2, 0xe89ba6, 0xe89b93,
+ /* f9 */ 0xe89ba3, 0xe89b9a, 0xe89baa, 0xe89b9d,
+ /* fd */ 0xe89bab, 0xe89b9c,
+
+ /*** Four byte table, leaf: 8ea2c0xx - offset 0x03cff ***/
+
+ /* a1 */ 0xe89bac, 0xe89ba9, 0xe89b97, 0xe89ba8,
+ /* a5 */ 0xe89b91, 0xe8a188, 0xe8a196, 0xe8a195,
+ /* a9 */ 0xe8a2ba, 0xe8a397, 0xe8a2b9, 0xe8a2b8,
+ /* ad */ 0xe8a380, 0xe8a2be, 0xe8a2b6, 0xe8a2bc,
+ /* b1 */ 0xe8a2b7, 0xe8a2bd, 0xe8a2b2, 0xe8a481,
+ /* b5 */ 0xe8a389, 0xe8a695, 0xe8a698, 0xe8a697,
+ /* b9 */ 0xe8a79d, 0xe8a79a, 0xe8a79b, 0xe8a98e,
+ /* bd */ 0xe8a98d, 0xe8a8b9, 0xe8a999, 0xe8a980,
+ /* c1 */ 0xe8a997, 0xe8a998, 0xe8a984, 0xe8a985,
+ /* c5 */ 0xe8a992, 0xe8a988, 0xe8a991, 0xe8a98a,
+ /* c9 */ 0xe8a98c, 0xe8a98f, 0xe8b19f, 0xe8b281,
+ /* cd */ 0xe8b280, 0xe8b2ba, 0xe8b2be, 0xe8b2b0,
+ /* d1 */ 0xe8b2b9, 0xe8b2b5, 0xe8b684, 0xe8b680,
+ /* d5 */ 0xe8b689, 0xe8b798, 0xe8b793, 0xe8b78d,
+ /* d9 */ 0xe8b787, 0xe8b796, 0xe8b79c, 0xe8b78f,
+ /* dd */ 0xe8b795, 0xe8b799, 0xe8b788, 0xe8b797,
+ /* e1 */ 0xe8b785, 0xe8bbaf, 0xe8bbb7, 0xe8bbba,
+ /* e5 */ 0xe8bbb9, 0xe8bba6, 0xe8bbae, 0xe8bba5,
+ /* e9 */ 0xe8bbb5, 0xe8bba7, 0xe8bba8, 0xe8bbb6,
+ /* ed */ 0xe8bbab, 0xe8bbb1, 0xe8bbac, 0xe8bbb4,
+ /* f1 */ 0xe8bba9, 0xe980ad, 0xe980b4, 0xe980af,
+ /* f5 */ 0xe98486, 0xe984ac, 0xe98484, 0xe983bf,
+ /* f9 */ 0xe983bc, 0xe98488, 0xe983b9, 0xe983bb,
+ /* fd */ 0xe98481, 0xe98480,
+
+ /*** Four byte table, leaf: 8ea2c1xx - offset 0x03d5d ***/
+
+ /* a1 */ 0xe98487, 0xe98485, 0xe98483, 0xe985a1,
+ /* a5 */ 0xe985a4, 0xe9859f, 0xe985a2, 0xe985a0,
+ /* a9 */ 0xe98881, 0xe9888a, 0xe988a5, 0xe98883,
+ /* ad */ 0xe9889a, 0xe988a6, 0xe9888f, 0xe9888c,
+ /* b1 */ 0xe98880, 0xe98892, 0xe987bf, 0xe987bd,
+ /* b5 */ 0xe98886, 0xe98884, 0xe988a7, 0xe98882,
+ /* b9 */ 0xe9889c, 0xe988a4, 0xe98899, 0xe98897,
+ /* bd */ 0xe98885, 0xe98896, 0xe995bb, 0xe9968d,
+ /* c1 */ 0xe9968c, 0xe99690, 0xe99a87, 0xe999be,
+ /* c5 */ 0xe99a88, 0xe99a89, 0xe99a83, 0xe99a80,
+ /* c9 */ 0xe99b82, 0xe99b88, 0xe99b83, 0xe99bb1,
+ /* cd */ 0xe99bb0, 0xe99dac, 0xe99db0, 0xe99dae,
+ /* d1 */ 0xe9a087, 0xe9a2a9, 0xe9a3ab, 0xe9b3a6,
+ /* d5 */ 0xe9bbb9, 0xe4ba83, 0xe4ba84, 0xe4bab6,
+ /* d9 */ 0xe582bd, 0xe582bf, 0xe58386, 0xe582ae,
+ /* dd */ 0xe58384, 0xe5838a, 0xe582b4, 0xe58388,
+ /* e1 */ 0xe58382, 0xe582b0, 0xe58381, 0xe582ba,
+ /* e5 */ 0xe582b1, 0xe5838b, 0xe58389, 0xe582b6,
+ /* e9 */ 0xe582b8, 0xe58797, 0xe589ba, 0xe589b8,
+ /* ed */ 0xe589bb, 0xe589bc, 0xe59783, 0xe5979b,
+ /* f1 */ 0xe5978c, 0xe59790, 0xe5978b, 0xe5978a,
+ /* f5 */ 0xe5979d, 0xe59780, 0xe59794, 0xe59784,
+ /* f9 */ 0xe597a9, 0xe596bf, 0xe59792, 0xe5968d,
+ /* fd */ 0xe5978f, 0xe59795,
+
+ /*** Four byte table, leaf: 8ea2c2xx - offset 0x03dbb ***/
+
+ /* a1 */ 0xe597a2, 0xe59796, 0xe59788, 0xe597b2,
+ /* a5 */ 0xe5978d, 0xe59799, 0xe59782, 0xe59c94,
+ /* a9 */ 0xe5a193, 0xe5a1a8, 0xe5a1a4, 0xe5a18f,
+ /* ad */ 0xe5a18d, 0xe5a189, 0xe5a1af, 0xe5a195,
+ /* b1 */ 0xe5a18e, 0xe5a19d, 0xe5a199, 0xe5a1a5,
+ /* b5 */ 0xe5a19b, 0xe5a0bd, 0xe5a1a3, 0xe5a1b1,
+ /* b9 */ 0xe5a3bc, 0xe5ab87, 0xe5ab84, 0xe5ab8b,
+ /* bd */ 0xe5aaba, 0xe5aab8, 0xe5aab1, 0xe5aab5,
+ /* c1 */ 0xe5aab0, 0xe5aabf, 0xe5ab88, 0xe5aabb,
+ /* c5 */ 0xe5ab86, 0xe5aab7, 0xe5ab80, 0xe5ab8a,
+ /* c9 */ 0xe5aab4, 0xe5aab6, 0xe5ab8d, 0xe5aab9,
+ /* cd */ 0xe5aa90, 0xe5af96, 0xe5af98, 0xe5af99,
+ /* d1 */ 0xe5b09f, 0xe5b0b3, 0xe5b5b1, 0xe5b5a3,
+ /* d5 */ 0xe5b58a, 0xe5b5a5, 0xe5b5b2, 0xe5b5ac,
+ /* d9 */ 0xe5b59e, 0xe5b5a8, 0xe5b5a7, 0xe5b5a2,
+ /* dd */ 0xe5b7b0, 0xe5b98f, 0xe5b98e, 0xe5b98a,
+ /* e1 */ 0xe5b98d, 0xe5b98b, 0xe5bb85, 0xe5bb8c,
+ /* e5 */ 0xe5bb86, 0xe5bb8b, 0xe5bb87, 0xe5bd80,
+ /* e9 */ 0xe5beaf, 0xe5bead, 0xe683b7, 0xe68589,
+ /* ed */ 0xe6858a, 0xe684ab, 0xe68585, 0xe684b6,
+ /* f1 */ 0xe684b2, 0xe684ae, 0xe68586, 0xe684af,
+ /* f5 */ 0xe6858f, 0xe684a9, 0xe68580, 0xe688a0,
+ /* f9 */ 0xe985a8, 0xe688a3, 0xe688a5, 0xe688a4,
+ /* fd */ 0xe68f85, 0xe68fb1,
+
+ /*** Four byte table, leaf: 8ea2c3xx - offset 0x03e19 ***/
+
+ /* a1 */ 0xe68fab, 0xe69090, 0xe69092, 0xe69089,
+ /* a5 */ 0xe690a0, 0xe690a4, 0xe690b3, 0xe69183,
+ /* a9 */ 0xe6909f, 0xe69095, 0xe69098, 0xe690b9,
+ /* ad */ 0xe690b7, 0xe690a2, 0xe690a3, 0xe6908c,
+ /* b1 */ 0xe690a6, 0xe690b0, 0xe690a8, 0xe69181,
+ /* b5 */ 0xe690b5, 0xe690af, 0xe6908a, 0xe6909a,
+ /* b9 */ 0xe69180, 0xe690a5, 0xe690a7, 0xe6908b,
+ /* bd */ 0xe68fa7, 0xe6909b, 0xe690ae, 0xe690a1,
+ /* c1 */ 0xe6908e, 0xe695af, 0xe69692, 0xe69793,
+ /* c5 */ 0xe69a86, 0xe69a8c, 0xe69a95, 0xe69a90,
+ /* c9 */ 0xe69a8b, 0xe69a8a, 0xe69a99, 0xe69a94,
+ /* cd */ 0xe699b8, 0xe69ca0, 0xe6a5a6, 0xe6a59f,
+ /* d1 */ 0xe6a4b8, 0xe6a58e, 0xe6a5a2, 0xe6a5b1,
+ /* d5 */ 0xe6a4bf, 0xe6a585, 0xe6a5aa, 0xe6a4b9,
+ /* d9 */ 0xe6a582, 0xe6a597, 0xe6a599, 0xe6a5ba,
+ /* dd */ 0xe6a588, 0xe6a589, 0xe6a4b5, 0xe6a5ac,
+ /* e1 */ 0xe6a4b3, 0xe6a4bd, 0xe6a5a5, 0xe6a3b0,
+ /* e5 */ 0xe6a5b8, 0xe6a4b4, 0xe6a5a9, 0xe6a580,
+ /* e9 */ 0xe6a5af, 0xe6a584, 0xe6a5b6, 0xe6a598,
+ /* ed */ 0xe6a581, 0xe6a5b4, 0xe6a58c, 0xe6a4bb,
+ /* f1 */ 0xe6a58b, 0xe6a4b7, 0xe6a59c, 0xe6a58f,
+ /* f5 */ 0xe6a591, 0xe6a4b2, 0xe6a592, 0xe6a4af,
+ /* f9 */ 0xe6a5bb, 0xe6a4bc, 0xe6ad86, 0xe6ad85,
+ /* fd */ 0xe6ad83, 0xe6ad82,
+
+ /*** Four byte table, leaf: 8ea2c4xx - offset 0x03e77 ***/
+
+ /* a1 */ 0xe6ad88, 0xe6ad81, 0xe6ae9b, 0xe6afbb,
+ /* a5 */ 0xe6afbc, 0xe6afb9, 0xe6afb7, 0xe6afb8,
+ /* a9 */ 0xe6ba9b, 0xe6bb96, 0xe6bb88, 0xe6ba8f,
+ /* ad */ 0xe6bb80, 0xe6ba9f, 0xe6ba93, 0xe6ba94,
+ /* b1 */ 0xe6baa0, 0xe6bab1, 0xe6bab9, 0xe6bb86,
+ /* b5 */ 0xe6bb92, 0xe6babd, 0xe6bb81, 0xe6ba9e,
+ /* b9 */ 0xe6bb89, 0xe6bab7, 0xe6bab0, 0xe6bb8d,
+ /* bd */ 0xe6baa6, 0xe6bb8f, 0xe6bab2, 0xe6babe,
+ /* c1 */ 0xe6bb83, 0xe6bb9c, 0xe6bb98, 0xe6ba99,
+ /* c5 */ 0xe6ba92, 0xe6ba8e, 0xe6ba8d, 0xe6baa4,
+ /* c9 */ 0xe6baa1, 0xe6babf, 0xe6bab3, 0xe6bb90,
+ /* cd */ 0xe6bb8a, 0xe6ba97, 0xe6baae, 0xe6baa3,
+ /* d1 */ 0xe78587, 0xe78594, 0xe78592, 0xe785a3,
+ /* d5 */ 0xe785a0, 0xe78581, 0xe7859d, 0xe785a2,
+ /* d9 */ 0xe785b2, 0xe785b8, 0xe785aa, 0xe785a1,
+ /* dd */ 0xe78582, 0xe78598, 0xe78583, 0xe7858b,
+ /* e1 */ 0xe785b0, 0xe7859f, 0xe78590, 0xe78593,
+ /* e5 */ 0xe78584, 0xe7858d, 0xe7859a, 0xe7898f,
+ /* e9 */ 0xe78a8d, 0xe78a8c, 0xe78a91, 0xe78a90,
+ /* ed */ 0xe78a8e, 0xe78cbc, 0xe78d82, 0xe78cbb,
+ /* f1 */ 0xe78cba, 0xe78d80, 0xe78d8a, 0xe78d89,
+ /* f5 */ 0xe79184, 0xe7918a, 0xe7918b, 0xe79192,
+ /* f9 */ 0xe79191, 0xe79197, 0xe79180, 0xe7918f,
+ /* fd */ 0xe79190, 0xe7918e,
+
+ /*** Four byte table, leaf: 8ea2c5xx - offset 0x03ed5 ***/
+
+ /* a1 */ 0xe79182, 0xe79186, 0xe7918d, 0xe79194,
+ /* a5 */ 0xe793a1, 0xe793bf, 0xe793be, 0xe793bd,
+ /* a9 */ 0xe7949d, 0xe795b9, 0xe795b7, 0xe6a683,
+ /* ad */ 0xe797af, 0xe7988f, 0xe79883, 0xe797b7,
+ /* b1 */ 0xe797be, 0xe797bc, 0xe797b9, 0xe797b8,
+ /* b5 */ 0xe79890, 0xe797bb, 0xe797b6, 0xe797ad,
+ /* b9 */ 0xe797b5, 0xe797bd, 0xe79a99, 0xe79ab5,
+ /* bd */ 0xe79b9d, 0xe79d95, 0xe79d9f, 0xe79da0,
+ /* c1 */ 0xe79d92, 0xe79d96, 0xe79d9a, 0xe79da9,
+ /* c5 */ 0xe79da7, 0xe79d94, 0xe79d99, 0xe79dad,
+ /* c9 */ 0xe79fa0, 0xe7a287, 0xe7a29a, 0xe7a294,
+ /* cd */ 0xe7a28f, 0xe7a284, 0xe7a295, 0xe7a285,
+ /* d1 */ 0xe7a286, 0xe7a2a1, 0xe7a283, 0xe7a1b9,
+ /* d5 */ 0xe7a299, 0xe7a280, 0xe7a296, 0xe7a1bb,
+ /* d9 */ 0xe7a5bc, 0xe7a682, 0xe7a5bd, 0xe7a5b9,
+ /* dd */ 0xe7a891, 0xe7a898, 0xe7a899, 0xe7a892,
+ /* e1 */ 0xe7a897, 0xe7a895, 0xe7a8a2, 0xe7a893,
+ /* e5 */ 0xe7a89b, 0xe7a890, 0xe7aaa3, 0xe7aaa2,
+ /* e9 */ 0xe7aa9e, 0xe7abab, 0xe7ada6, 0xe7ada4,
+ /* ed */ 0xe7adad, 0xe7adb4, 0xe7ada9, 0xe7adb2,
+ /* f1 */ 0xe7ada5, 0xe7adb3, 0xe7adb1, 0xe7adb0,
+ /* f5 */ 0xe7ada1, 0xe7adb8, 0xe7adb6, 0xe7ada3,
+ /* f9 */ 0xe7b2b2, 0xe7b2b4, 0xe7b2af, 0xe7b688,
+ /* fd */ 0xe7b686, 0xe7b680,
+
+ /*** Four byte table, leaf: 8ea2c6xx - offset 0x03f33 ***/
+
+ /* a1 */ 0xe7b68d, 0xe7b5bf, 0xe7b685, 0xe7b5ba,
+ /* a5 */ 0xe7b68e, 0xe7b5bb, 0xe7b683, 0xe7b5bc,
+ /* a9 */ 0xe7b68c, 0xe7b694, 0xe7b684, 0xe7b5bd,
+ /* ad */ 0xe7b692, 0xe7bdad, 0xe7bdab, 0xe7bda7,
+ /* b1 */ 0xe7bda8, 0xe7bdac, 0xe7bea6, 0xe7bea5,
+ /* b5 */ 0xe7bea7, 0xe7bf9b, 0xe7bf9c, 0xe880a1,
+ /* b9 */ 0xe885a4, 0xe885a0, 0xe885b7, 0xe8859c,
+ /* bd */ 0xe885a9, 0xe8859b, 0xe885a2, 0xe885b2,
+ /* c1 */ 0xe69ca1, 0xe8859e, 0xe885b6, 0xe885a7,
+ /* c5 */ 0xe885af, 0xe88584, 0xe885a1, 0xe8889d,
+ /* c9 */ 0xe88989, 0xe88984, 0xe88980, 0xe88982,
+ /* cd */ 0xe88985, 0xe893b1, 0xe890bf, 0xe89196,
+ /* d1 */ 0xe891b6, 0xe891b9, 0xe8928f, 0xe8928d,
+ /* d5 */ 0xe891a5, 0xe89191, 0xe89180, 0xe89286,
+ /* d9 */ 0xe891a7, 0xe890b0, 0xe8918d, 0xe891bd,
+ /* dd */ 0xe8919a, 0xe89199, 0xe891b4, 0xe891b3,
+ /* e1 */ 0xe8919d, 0xe89487, 0xe8919e, 0xe890b7,
+ /* e5 */ 0xe890ba, 0xe890b4, 0xe891ba, 0xe89183,
+ /* e9 */ 0xe891b8, 0xe890b2, 0xe89185, 0xe890a9,
+ /* ed */ 0xe88f99, 0xe8918b, 0xe890af, 0xe89182,
+ /* f1 */ 0xe890ad, 0xe8919f, 0xe891b0, 0xe890b9,
+ /* f5 */ 0xe8918e, 0xe8918c, 0xe89192, 0xe891af,
+ /* f9 */ 0xe89385, 0xe8928e, 0xe890bb, 0xe89187,
+ /* fd */ 0xe890b6, 0xe890b3,
+
+ /*** Four byte table, leaf: 8ea2c7xx - offset 0x03f91 ***/
+
+ /* a1 */ 0xe891a8, 0xe891be, 0xe89184, 0xe890ab,
+ /* a5 */ 0xe891a0, 0xe89194, 0xe891ae, 0xe89190,
+ /* a9 */ 0xe89c8b, 0xe89c84, 0xe89bb7, 0xe89c8c,
+ /* ad */ 0xe89bba, 0xe89b96, 0xe89bb5, 0xe89d8d,
+ /* b1 */ 0xe89bb8, 0xe89c8e, 0xe89c89, 0xe89c81,
+ /* b5 */ 0xe89bb6, 0xe89c8d, 0xe89c85, 0xe8a396,
+ /* b9 */ 0xe8a38b, 0xe8a38d, 0xe8a38e, 0xe8a39e,
+ /* bd */ 0xe8a39b, 0xe8a39a, 0xe8a38c, 0xe8a390,
+ /* c1 */ 0xe8a685, 0xe8a69b, 0xe8a79f, 0xe8a7a5,
+ /* c5 */ 0xe8a7a4, 0xe8a7a1, 0xe8a7a0, 0xe8a7a2,
+ /* c9 */ 0xe8a79c, 0xe8a7a6, 0xe8a9b6, 0xe8aa86,
+ /* cd */ 0xe8a9bf, 0xe8a9a1, 0xe8a8bf, 0xe8a9b7,
+ /* d1 */ 0xe8aa82, 0xe8aa84, 0xe8a9b5, 0xe8aa83,
+ /* d5 */ 0xe8aa81, 0xe8a9b4, 0xe8a9ba, 0xe8b0bc,
+ /* d9 */ 0xe8b18b, 0xe8b18a, 0xe8b1a5, 0xe8b1a4,
+ /* dd */ 0xe8b1a6, 0xe8b286, 0xe8b284, 0xe8b285,
+ /* e1 */ 0xe8b38c, 0xe8b5a8, 0xe8b5a9, 0xe8b691,
+ /* e5 */ 0xe8b68c, 0xe8b68e, 0xe8b68f, 0xe8b68d,
+ /* e9 */ 0xe8b693, 0xe8b694, 0xe8b690, 0xe8b692,
+ /* ed */ 0xe8b7b0, 0xe8b7a0, 0xe8b7ac, 0xe8b7b1,
+ /* f1 */ 0xe8b7ae, 0xe8b790, 0xe8b7a9, 0xe8b7a3,
+ /* f5 */ 0xe8b7a2, 0xe8b7a7, 0xe8b7b2, 0xe8b7ab,
+ /* f9 */ 0xe8b7b4, 0xe8bc86, 0xe8bbbf, 0xe8bc81,
+ /* fd */ 0xe8bc80, 0xe8bc85,
+
+ /*** Four byte table, leaf: 8ea2c8xx - offset 0x03fef ***/
+
+ /* a1 */ 0xe8bc87, 0xe8bc88, 0xe8bc82, 0xe8bc8b,
+ /* a5 */ 0xe98192, 0xe980bf, 0xe98184, 0xe98189,
+ /* a9 */ 0xe980bd, 0xe98490, 0xe9848d, 0xe9848f,
+ /* ad */ 0xe98491, 0xe98496, 0xe98494, 0xe9848b,
+ /* b1 */ 0xe9848e, 0xe985ae, 0xe985af, 0xe98988,
+ /* b5 */ 0xe98992, 0xe988b0, 0xe988ba, 0xe989a6,
+ /* b9 */ 0xe988b3, 0xe989a5, 0xe9899e, 0xe98a83,
+ /* bd */ 0xe988ae, 0xe9898a, 0xe98986, 0xe989ad,
+ /* c1 */ 0xe989ac, 0xe9898f, 0xe989a0, 0xe989a7,
+ /* c5 */ 0xe989af, 0xe988b6, 0xe989a1, 0xe989b0,
+ /* c9 */ 0xe988b1, 0xe98994, 0xe989a3, 0xe98990,
+ /* cd */ 0xe989b2, 0xe9898e, 0xe98993, 0xe9898c,
+ /* d1 */ 0xe98996, 0xe988b2, 0xe9969f, 0xe9969c,
+ /* d5 */ 0xe9969e, 0xe9969b, 0xe99a92, 0xe99a93,
+ /* d9 */ 0xe99a91, 0xe99a97, 0xe99b8e, 0xe99bba,
+ /* dd */ 0xe99bbd, 0xe99bb8, 0xe99bb5, 0xe99db3,
+ /* e1 */ 0xe99db7, 0xe99db8, 0xe99db2, 0xe9a08f,
+ /* e5 */ 0xe9a08d, 0xe9a08e, 0xe9a2ac, 0xe9a3b6,
+ /* e9 */ 0xe9a3b9, 0xe9a6af, 0xe9a6b2, 0xe9a6b0,
+ /* ed */ 0xe9a6b5, 0xe9aaad, 0xe9aaab, 0xe9ad9b,
+ /* f1 */ 0xe9b3aa, 0xe9b3ad, 0xe9b3a7, 0xe9ba80,
+ /* f5 */ 0xe9bbbd, 0xe583a6, 0xe58394, 0xe58397,
+ /* f9 */ 0xe583a8, 0xe583b3, 0xe5839b, 0xe583aa,
+ /* fd */ 0xe5839d, 0xe583a4,
+
+ /*** Four byte table, leaf: 8ea2c9xx - offset 0x0404d ***/
+
+ /* a1 */ 0xe58393, 0xe583ac, 0xe583b0, 0xe583af,
+ /* a5 */ 0xe583a3, 0xe583a0, 0xe58798, 0xe58a80,
+ /* a9 */ 0xe58a81, 0xe58ba9, 0xe58bab, 0xe58cb0,
+ /* ad */ 0xe58eac, 0xe598a7, 0xe59895, 0xe5988c,
+ /* b1 */ 0xe59892, 0xe597bc, 0xe5988f, 0xe5989c,
+ /* b5 */ 0xe59881, 0xe59893, 0xe59882, 0xe597ba,
+ /* b9 */ 0xe5989d, 0xe59884, 0xe597bf, 0xe597b9,
+ /* bd */ 0xe5a289, 0xe5a1bc, 0xe5a290, 0xe5a298,
+ /* c1 */ 0xe5a286, 0xe5a281, 0xe5a1bf, 0xe5a1b4,
+ /* c5 */ 0xe5a28b, 0xe5a1ba, 0xe5a287, 0xe5a291,
+ /* c9 */ 0xe5a28e, 0xe5a1b6, 0xe5a282, 0xe5a288,
+ /* cd */ 0xe5a1bb, 0xe5a294, 0xe5a28f, 0xe5a3be,
+ /* d1 */ 0xe5a5ab, 0xe5ab9c, 0xe5abae, 0xe5aba5,
+ /* d5 */ 0xe5ab95, 0xe5abaa, 0xe5ab9a, 0xe5abad,
+ /* d9 */ 0xe5abab, 0xe5abb3, 0xe5aba2, 0xe5aba0,
+ /* dd */ 0xe5ab9b, 0xe5abac, 0xe5ab9e, 0xe5ab9d,
+ /* e1 */ 0xe5ab99, 0xe5aba8, 0xe5ab9f, 0xe5adb7,
+ /* e5 */ 0xe5afa0, 0xe5afa3, 0xe5b1a3, 0xe5b682,
+ /* e9 */ 0xe5b680, 0xe5b5bd, 0xe5b686, 0xe5b5ba,
+ /* ed */ 0xe5b681, 0xe5b5b7, 0xe5b68a, 0xe5b689,
+ /* f1 */ 0xe5b688, 0xe5b5be, 0xe5b5bc, 0xe5b68d,
+ /* f5 */ 0xe5b5b9, 0xe5b5bf, 0xe5b998, 0xe5b999,
+ /* f9 */ 0xe5b993, 0xe5bb98, 0xe5bb91, 0xe5bb97,
+ /* fd */ 0xe5bb8e, 0xe5bb9c,
+
+ /*** Four byte table, leaf: 8ea2caxx - offset 0x040ab ***/
+
+ /* a1 */ 0xe5bb95, 0xe5bb99, 0xe5bb92, 0xe5bb94,
+ /* a5 */ 0xe5bd84, 0xe5bd83, 0xe5bdaf, 0xe5beb6,
+ /* a9 */ 0xe684ac, 0xe684a8, 0xe68581, 0xe6859e,
+ /* ad */ 0xe685b1, 0xe685b3, 0xe68592, 0xe68593,
+ /* b1 */ 0xe685b2, 0xe685ac, 0xe68680, 0xe685b4,
+ /* b5 */ 0xe68594, 0xe685ba, 0xe6859b, 0xe685a5,
+ /* b9 */ 0xe684bb, 0xe685aa, 0xe685a1, 0xe68596,
+ /* bd */ 0xe688a9, 0xe688a7, 0xe688ab, 0xe690ab,
+ /* c1 */ 0xe6918d, 0xe6919b, 0xe6919d, 0xe691b4,
+ /* c5 */ 0xe691b6, 0xe691b2, 0xe691b3, 0xe691bd,
+ /* c9 */ 0xe691b5, 0xe691a6, 0xe692a6, 0xe6918e,
+ /* cd */ 0xe69282, 0xe6919e, 0xe6919c, 0xe6918b,
+ /* d1 */ 0xe69193, 0xe691a0, 0xe69190, 0xe691bf,
+ /* d5 */ 0xe690bf, 0xe691ac, 0xe691ab, 0xe69199,
+ /* d9 */ 0xe691a5, 0xe691b7, 0xe695b3, 0xe696a0,
+ /* dd */ 0xe69aa1, 0xe69aa0, 0xe69a9f, 0xe69c85,
+ /* e1 */ 0xe69c84, 0xe69ca2, 0xe6a6b1, 0xe6a6b6,
+ /* e5 */ 0xe6a789, 0xe6a6a0, 0xe6a78e, 0xe6a696,
+ /* e9 */ 0xe6a6b0, 0xe6a6ac, 0xe6a6bc, 0xe6a691,
+ /* ed */ 0xe6a699, 0xe6a68e, 0xe6a6a7, 0xe6a68d,
+ /* f1 */ 0xe6a6a9, 0xe6a6be, 0xe6a6af, 0xe6a6bf,
+ /* f5 */ 0xe6a784, 0xe6a6bd, 0xe6a6a4, 0xe6a794,
+ /* f9 */ 0xe6a6b9, 0xe6a78a, 0xe6a69a, 0xe6a78f,
+ /* fd */ 0xe6a6b3, 0xe6a693,
+
+ /*** Four byte table, leaf: 8ea2cbxx - offset 0x04109 ***/
+
+ /* a1 */ 0xe6a6aa, 0xe6a6a1, 0xe6a69e, 0xe6a799,
+ /* a5 */ 0xe6a697, 0xe6a690, 0xe6a782, 0xe6a6b5,
+ /* a9 */ 0xe6a6a5, 0xe6a786, 0xe6ad8a, 0xe6ad8d,
+ /* ad */ 0xe6ad8b, 0xe6ae9e, 0xe6ae9f, 0xe6aea0,
+ /* b1 */ 0xe6af83, 0xe6af84, 0xe6afbe, 0xe6bb8e,
+ /* b5 */ 0xe6bbb5, 0xe6bbb1, 0xe6bc83, 0xe6bca5,
+ /* b9 */ 0xe6bbb8, 0xe6bcb7, 0xe6bbbb, 0xe6bcae,
+ /* bd */ 0xe6bc89, 0xe6bd8e, 0xe6bc99, 0xe6bc9a,
+ /* c1 */ 0xe6bca7, 0xe6bc98, 0xe6bcbb, 0xe6bc92,
+ /* c5 */ 0xe6bbad, 0xe6bc8a, 0xe6bcb6, 0xe6bdb3,
+ /* c9 */ 0xe6bbb9, 0xe6bbae, 0xe6bcad, 0xe6bd80,
+ /* cd */ 0xe6bcb0, 0xe6bcbc, 0xe6bcb5, 0xe6bbab,
+ /* d1 */ 0xe6bc87, 0xe6bc8e, 0xe6bd83, 0xe6bc85,
+ /* d5 */ 0xe6bbbd, 0xe6bbb6, 0xe6bcb9, 0xe6bc9c,
+ /* d9 */ 0xe6bbbc, 0xe6bcba, 0xe6bc9f, 0xe6bc8d,
+ /* dd */ 0xe6bc9e, 0xe6bc88, 0xe6bca1, 0xe78687,
+ /* e1 */ 0xe78690, 0xe78689, 0xe78680, 0xe78685,
+ /* e5 */ 0xe78682, 0xe7868f, 0xe785bb, 0xe78686,
+ /* e9 */ 0xe78681, 0xe78697, 0xe78984, 0xe78993,
+ /* ed */ 0xe78a97, 0xe78a95, 0xe78a93, 0xe78d83,
+ /* f1 */ 0xe78d8d, 0xe78d91, 0xe78d8c, 0xe791a2,
+ /* f5 */ 0xe791b3, 0xe791b1, 0xe791b5, 0xe791b2,
+ /* f9 */ 0xe791a7, 0xe791ae, 0xe79480, 0xe79482,
+ /* fd */ 0xe79483, 0xe795bd,
+
+ /*** Four byte table, leaf: 8ea2ccxx - offset 0x04167 ***/
+
+ /* a1 */ 0xe79690, 0xe79896, 0xe79888, 0xe7988c,
+ /* a5 */ 0xe79895, 0xe79891, 0xe7988a, 0xe79894,
+ /* a9 */ 0xe79ab8, 0xe79e81, 0xe79dbc, 0xe79e85,
+ /* ad */ 0xe79e82, 0xe79dae, 0xe79e80, 0xe79daf,
+ /* b1 */ 0xe79dbe, 0xe79e83, 0xe7a2b2, 0xe7a2aa,
+ /* b5 */ 0xe7a2b4, 0xe7a2ad, 0xe7a2a8, 0xe7a1be,
+ /* b9 */ 0xe7a2ab, 0xe7a29e, 0xe7a2a5, 0xe7a2a0,
+ /* bd */ 0xe7a2ac, 0xe7a2a2, 0xe7a2a4, 0xe7a698,
+ /* c1 */ 0xe7a68a, 0xe7a68b, 0xe7a696, 0xe7a695,
+ /* c5 */ 0xe7a694, 0xe7a693, 0xe7a697, 0xe7a688,
+ /* c9 */ 0xe7a692, 0xe7a690, 0xe7a8ab, 0xe7a98a,
+ /* cd */ 0xe7a8b0, 0xe7a8af, 0xe7a8a8, 0xe7a8a6,
+ /* d1 */ 0xe7aaa8, 0xe7aaab, 0xe7aaac, 0xe7abae,
+ /* d5 */ 0xe7ae88, 0xe7ae9c, 0xe7ae8a, 0xe7ae91,
+ /* d9 */ 0xe7ae90, 0xe7ae96, 0xe7ae8d, 0xe7ae8c,
+ /* dd */ 0xe7ae9b, 0xe7ae8e, 0xe7ae85, 0xe7ae98,
+ /* e1 */ 0xe58a84, 0xe7ae99, 0xe7aea4, 0xe7ae82,
+ /* e5 */ 0xe7b2bb, 0xe7b2bf, 0xe7b2bc, 0xe7b2ba,
+ /* e9 */ 0xe7b6a7, 0xe7b6b7, 0xe7b782, 0xe7b6a3,
+ /* ed */ 0xe7b6aa, 0xe7b781, 0xe7b780, 0xe7b785,
+ /* f1 */ 0xe7b69d, 0xe7b78e, 0xe7b784, 0xe7b786,
+ /* f5 */ 0xe7b78b, 0xe7b78c, 0xe7b6af, 0xe7b6b9,
+ /* f9 */ 0xe7b696, 0xe7b6bc, 0xe7b69f, 0xe7b6a6,
+ /* fd */ 0xe7b6ae, 0xe7b6a9,
+
+ /*** Four byte table, leaf: 8ea2cdxx - offset 0x041c5 ***/
+
+ /* a1 */ 0xe7b6a1, 0xe7b789, 0xe7bdb3, 0xe7bfa2,
+ /* a5 */ 0xe7bfa3, 0xe7bfa5, 0xe7bf9e, 0xe880a4,
+ /* a9 */ 0xe8819d, 0xe8819c, 0xe88689, 0xe88686,
+ /* ad */ 0xe88683, 0xe88687, 0xe8868d, 0xe8868c,
+ /* b1 */ 0xe8868b, 0xe88895, 0xe89297, 0xe892a4,
+ /* b5 */ 0xe892a1, 0xe8929f, 0xe892ba, 0xe8938e,
+ /* b9 */ 0xe89382, 0xe892ac, 0xe892ae, 0xe892ab,
+ /* bd */ 0xe892b9, 0xe892b4, 0xe89381, 0xe8938d,
+ /* c1 */ 0xe892aa, 0xe8929a, 0xe892b1, 0xe89390,
+ /* c5 */ 0xe8929d, 0xe892a7, 0xe892bb, 0xe892a2,
+ /* c9 */ 0xe89294, 0xe89387, 0xe8938c, 0xe8929b,
+ /* cd */ 0xe892a9, 0xe892af, 0xe892a8, 0xe89396,
+ /* d1 */ 0xe89298, 0xe892b6, 0xe8938f, 0xe892a0,
+ /* d5 */ 0xe89397, 0xe89394, 0xe89392, 0xe8939b,
+ /* d9 */ 0xe892b0, 0xe89291, 0xe899a1, 0xe89cb3,
+ /* dd */ 0xe89ca3, 0xe89ca8, 0xe89dab, 0xe89d80,
+ /* e1 */ 0xe89cae, 0xe89c9e, 0xe89ca1, 0xe89c99,
+ /* e5 */ 0xe89c9b, 0xe89d83, 0xe89cac, 0xe89d81,
+ /* e9 */ 0xe89cbe, 0xe89d86, 0xe89ca0, 0xe89cb2,
+ /* ed */ 0xe89caa, 0xe89cad, 0xe89cbc, 0xe89c92,
+ /* f1 */ 0xe89cba, 0xe89cb1, 0xe89cb5, 0xe89d82,
+ /* f5 */ 0xe89ca6, 0xe89ca7, 0xe89cb8, 0xe89ca4,
+ /* f9 */ 0xe89c9a, 0xe89cb0, 0xe89c91, 0xe8a3b7,
+ /* fd */ 0xe8a3a7, 0xe8a3b1,
+
+ /*** Four byte table, leaf: 8ea2cexx - offset 0x04223 ***/
+
+ /* a1 */ 0xe8a3b2, 0xe8a3ba, 0xe8a3be, 0xe8a3ae,
+ /* a5 */ 0xe8a3bc, 0xe8a3b6, 0xe8a3bb, 0xe8a3b0,
+ /* a9 */ 0xe8a3ac, 0xe8a3ab, 0xe8a69d, 0xe8a6a1,
+ /* ad */ 0xe8a69f, 0xe8a69e, 0xe8a7a9, 0xe8a7ab,
+ /* b1 */ 0xe8a7a8, 0xe8aaab, 0xe8aa99, 0xe8aa8b,
+ /* b5 */ 0xe8aa92, 0xe8aa8f, 0xe8aa96, 0xe8b0bd,
+ /* b9 */ 0xe8b1a8, 0xe8b1a9, 0xe8b395, 0xe8b38f,
+ /* bd */ 0xe8b397, 0xe8b696, 0xe8b889, 0xe8b882,
+ /* c1 */ 0xe8b7bf, 0xe8b88d, 0xe8b7bd, 0xe8b88a,
+ /* c5 */ 0xe8b883, 0xe8b887, 0xe8b886, 0xe8b885,
+ /* c9 */ 0xe8b7be, 0xe8b880, 0xe8b884, 0xe8bc90,
+ /* cd */ 0xe8bc91, 0xe8bc8e, 0xe8bc8d, 0xe984a3,
+ /* d1 */ 0xe9849c, 0xe984a0, 0xe984a2, 0xe9849f,
+ /* d5 */ 0xe9849d, 0xe9849a, 0xe984a4, 0xe984a1,
+ /* d9 */ 0xe9849b, 0xe985ba, 0xe985b2, 0xe985b9,
+ /* dd */ 0xe985b3, 0xe98aa5, 0xe98aa4, 0xe989b6,
+ /* e1 */ 0xe98a9b, 0xe989ba, 0xe98aa0, 0xe98a94,
+ /* e5 */ 0xe98aaa, 0xe98a8d, 0xe98aa6, 0xe98a9a,
+ /* e9 */ 0xe98aab, 0xe989b9, 0xe98a97, 0xe989bf,
+ /* ed */ 0xe98aa3, 0xe98bae, 0xe98a8e, 0xe98a82,
+ /* f1 */ 0xe98a95, 0xe98aa2, 0xe989bd, 0xe98a88,
+ /* f5 */ 0xe98aa1, 0xe98a8a, 0xe98a86, 0xe98a8c,
+ /* f9 */ 0xe98a99, 0xe98aa7, 0xe989be, 0xe98a87,
+ /* fd */ 0xe98aa9, 0xe98a9d,
+
+ /*** Four byte table, leaf: 8ea2cfxx - offset 0x04281 ***/
+
+ /* a1 */ 0xe98a8b, 0xe988ad, 0xe99a9e, 0xe99aa1,
+ /* a5 */ 0xe99bbf, 0xe99d98, 0xe99dbd, 0xe99dba,
+ /* a9 */ 0xe99dbe, 0xe99e83, 0xe99e80, 0xe99e82,
+ /* ad */ 0xe99dbb, 0xe99e84, 0xe99e81, 0xe99dbf,
+ /* b1 */ 0xe99f8e, 0xe99f8d, 0xe9a096, 0xe9a2ad,
+ /* b5 */ 0xe9a2ae, 0xe9a482, 0xe9a480, 0xe9a487,
+ /* b9 */ 0xe9a69d, 0xe9a69c, 0xe9a783, 0xe9a6b9,
+ /* bd */ 0xe9a6bb, 0xe9a6ba, 0xe9a782, 0xe9a6bd,
+ /* c1 */ 0xe9a787, 0xe9aab1, 0xe9aba3, 0xe9aba7,
+ /* c5 */ 0xe9acbe, 0xe9acbf, 0xe9ada0, 0xe9ada1,
+ /* c9 */ 0xe9ad9f, 0xe9b3b1, 0xe9b3b2, 0xe9b3b5,
+ /* cd */ 0xe9baa7, 0xe583bf, 0xe58483, 0xe584b0,
+ /* d1 */ 0xe583b8, 0xe58486, 0xe58487, 0xe583b6,
+ /* d5 */ 0xe583be, 0xe5848b, 0xe5848c, 0xe583bd,
+ /* d9 */ 0xe5848a, 0xe58a8b, 0xe58a8c, 0xe58bb1,
+ /* dd */ 0xe58baf, 0xe59988, 0xe59982, 0xe5998c,
+ /* e1 */ 0xe598b5, 0xe59981, 0xe5998a, 0xe59989,
+ /* e5 */ 0xe59986, 0xe59998, 0xe5999a, 0xe59980,
+ /* e9 */ 0xe598b3, 0xe598bd, 0xe598ac, 0xe598be,
+ /* ed */ 0xe598b8, 0xe598aa, 0xe598ba, 0xe59c9a,
+ /* f1 */ 0xe5a2ab, 0xe5a29d, 0xe5a2b1, 0xe5a2a0,
+ /* f5 */ 0xe5a2a3, 0xe5a2af, 0xe5a2ac, 0xe5a2a5,
+ /* f9 */ 0xe5a2a1, 0xe5a3bf, 0xe5abbf, 0xe5abb4,
+ /* fd */ 0xe5abbd, 0xe5abb7,
+
+ /*** Four byte table, leaf: 8ea2d0xx - offset 0x042df ***/
+
+ /* a1 */ 0xe5abb6, 0xe5ac83, 0xe5abb8, 0xe5ac82,
+ /* a5 */ 0xe5abb9, 0xe5ac81, 0xe5ac87, 0xe5ac85,
+ /* a9 */ 0xe5ac8f, 0xe5b1a7, 0xe5b699, 0xe5b697,
+ /* ad */ 0xe5b69f, 0xe5b692, 0xe5b6a2, 0xe5b693,
+ /* b1 */ 0xe5b695, 0xe5b6a0, 0xe5b69c, 0xe5b6a1,
+ /* b5 */ 0xe5b69a, 0xe5b69e, 0xe5b9a9, 0xe5b99d,
+ /* b9 */ 0xe5b9a0, 0xe5b99c, 0xe7b7b3, 0xe5bb9b,
+ /* bd */ 0xe5bb9e, 0xe5bba1, 0xe5bd89, 0xe5beb2,
+ /* c1 */ 0xe6868b, 0xe68683, 0xe685b9, 0xe686b1,
+ /* c5 */ 0xe686b0, 0xe686a2, 0xe68689, 0xe6869b,
+ /* c9 */ 0xe68693, 0xe686af, 0xe686ad, 0xe6869f,
+ /* cd */ 0xe68692, 0xe686aa, 0xe686a1, 0xe6868d,
+ /* d1 */ 0xe685a6, 0xe686b3, 0xe688ad, 0xe691ae,
+ /* d5 */ 0xe691b0, 0xe69296, 0xe692a0, 0xe69285,
+ /* d9 */ 0xe69297, 0xe6929c, 0xe6928f, 0xe6928b,
+ /* dd */ 0xe6928a, 0xe6928c, 0xe692a3, 0xe6929f,
+ /* e1 */ 0xe691a8, 0xe692b1, 0xe69298, 0xe695b6,
+ /* e5 */ 0xe695ba, 0xe695b9, 0xe695bb, 0xe696b2,
+ /* e9 */ 0xe696b3, 0xe69ab5, 0xe69ab0, 0xe69aa9,
+ /* ed */ 0xe69ab2, 0xe69ab7, 0xe69aaa, 0xe69aaf,
+ /* f1 */ 0xe6a880, 0xe6a886, 0xe6a897, 0xe6a7a5,
+ /* f5 */ 0xe6a7b8, 0xe6a895, 0xe6a7b1, 0xe6a7a4,
+ /* f9 */ 0xe6a8a0, 0xe6a7bf, 0xe6a7ac, 0xe6a7a2,
+ /* fd */ 0xe6a89b, 0xe6a89d,
+
+ /*** Four byte table, leaf: 8ea2d1xx - offset 0x0433d ***/
+
+ /* a1 */ 0xe6a7be, 0xe6a8a7, 0xe6a7b2, 0xe6a7ae,
+ /* a5 */ 0xe6a894, 0xe6a7b7, 0xe6a7a7, 0xe6a980,
+ /* a9 */ 0xe6a888, 0xe6a7a6, 0xe6a7bb, 0xe6a88d,
+ /* ad */ 0xe6a7bc, 0xe6a7ab, 0xe6a889, 0xe6a884,
+ /* b1 */ 0xe6a898, 0xe6a8a5, 0xe6a88f, 0xe6a7b6,
+ /* b5 */ 0xe6a8a6, 0xe6a887, 0xe6a7b4, 0xe6a896,
+ /* b9 */ 0xe6ad91, 0xe6aea5, 0xe6aea3, 0xe6aea2,
+ /* bd */ 0xe6aea6, 0xe6b081, 0xe6b080, 0xe6afbf,
+ /* c1 */ 0xe6b082, 0xe6bd81, 0xe6bca6, 0xe6bdbe,
+ /* c5 */ 0xe6be87, 0xe6bf86, 0xe6be92, 0xe6be8d,
+ /* c9 */ 0xe6be89, 0xe6be8c, 0xe6bda2, 0xe6bd8f,
+ /* cd */ 0xe6be85, 0xe6bd9a, 0xe6be96, 0xe6bdb6,
+ /* d1 */ 0xe6bdac, 0xe6be82, 0xe6bd95, 0xe6bdb2,
+ /* d5 */ 0xe6bd92, 0xe6bd90, 0xe6bd97, 0xe6be94,
+ /* d9 */ 0xe6be93, 0xe6bd9d, 0xe6bc80, 0xe6bda1,
+ /* dd */ 0xe6bdab, 0xe6bdbd, 0xe6bda7, 0xe6be90,
+ /* e1 */ 0xe6bd93, 0xe6be8b, 0xe6bda9, 0xe6bdbf,
+ /* e5 */ 0xe6be95, 0xe6bda3, 0xe6bdb7, 0xe6bdaa,
+ /* e9 */ 0xe6bdbb, 0xe786b2, 0xe786af, 0xe7869b,
+ /* ed */ 0xe786b0, 0xe786a0, 0xe7869a, 0xe786a9,
+ /* f1 */ 0xe786b5, 0xe7869d, 0xe786a5, 0xe7869e,
+ /* f5 */ 0xe786a4, 0xe786a1, 0xe786aa, 0xe7869c,
+ /* f9 */ 0xe786a7, 0xe786b3, 0xe78a98, 0xe78a9a,
+ /* fd */ 0xe78d98, 0xe78d92,
+
+ /*** Four byte table, leaf: 8ea2d2xx - offset 0x0439b ***/
+
+ /* a1 */ 0xe78d9e, 0xe78d9f, 0xe78da0, 0xe78d9d,
+ /* a5 */ 0xe78d9b, 0xe78da1, 0xe78d9a, 0xe78d99,
+ /* a9 */ 0xe78da2, 0xe79287, 0xe79289, 0xe7928a,
+ /* ad */ 0xe79286, 0xe79281, 0xe791bd, 0xe79285,
+ /* b1 */ 0xe79288, 0xe791bc, 0xe791b9, 0xe79488,
+ /* b5 */ 0xe79487, 0xe795be, 0xe798a5, 0xe7989e,
+ /* b9 */ 0xe79899, 0xe7989d, 0xe7989c, 0xe798a3,
+ /* bd */ 0xe7989a, 0xe798a8, 0xe7989b, 0xe79a9c,
+ /* c1 */ 0xe79a9d, 0xe79a9e, 0xe79a9b, 0xe79e8d,
+ /* c5 */ 0xe79e8f, 0xe79e89, 0xe79e88, 0xe7a38d,
+ /* c9 */ 0xe7a2bb, 0xe7a38f, 0xe7a38c, 0xe7a391,
+ /* cd */ 0xe7a38e, 0xe7a394, 0xe7a388, 0xe7a383,
+ /* d1 */ 0xe7a384, 0xe7a389, 0xe7a69a, 0xe7a6a1,
+ /* d5 */ 0xe7a6a0, 0xe7a69c, 0xe7a6a2, 0xe7a69b,
+ /* d9 */ 0xe6adb6, 0xe7a8b9, 0xe7aab2, 0xe7aab4,
+ /* dd */ 0xe7aab3, 0xe7aeb7, 0xe7af8b, 0xe7aebe,
+ /* e1 */ 0xe7aeac, 0xe7af8e, 0xe7aeaf, 0xe7aeb9,
+ /* e5 */ 0xe7af8a, 0xe7aeb5, 0xe7b385, 0xe7b388,
+ /* e9 */ 0xe7b38c, 0xe7b38b, 0xe7b7b7, 0xe7b79b,
+ /* ed */ 0xe7b7aa, 0xe7b7a7, 0xe7b797, 0xe7b7a1,
+ /* f1 */ 0xe7b883, 0xe7b7ba, 0xe7b7a6, 0xe7b7b6,
+ /* f5 */ 0xe7b7b1, 0xe7b7b0, 0xe7b7ae, 0xe7b79f,
+ /* f9 */ 0xe7bdb6, 0xe7beac, 0xe7beb0, 0xe7bead,
+ /* fd */ 0xe7bfad, 0xe7bfab,
+
+ /*** Four byte table, leaf: 8ea2d3xx - offset 0x043f9 ***/
+
+ /* a1 */ 0xe7bfaa, 0xe7bfac, 0xe7bfa6, 0xe7bfa8,
+ /* a5 */ 0xe881a4, 0xe881a7, 0xe886a3, 0xe8869f,
+ /* a9 */ 0xe8869e, 0xe88695, 0xe886a2, 0xe88699,
+ /* ad */ 0xe88697, 0xe88896, 0xe8898f, 0xe88993,
+ /* b1 */ 0xe88992, 0xe88990, 0xe8898e, 0xe88991,
+ /* b5 */ 0xe894a4, 0xe894bb, 0xe8948f, 0xe89480,
+ /* b9 */ 0xe894a9, 0xe8948e, 0xe89489, 0xe8948d,
+ /* bd */ 0xe8949f, 0xe8948a, 0xe894a7, 0xe8949c,
+ /* c1 */ 0xe893bb, 0xe894ab, 0xe893ba, 0xe89488,
+ /* c5 */ 0xe8948c, 0xe893b4, 0xe894aa, 0xe893b2,
+ /* c9 */ 0xe89495, 0xe893b7, 0xe893ab, 0xe893b3,
+ /* cd */ 0xe893bc, 0xe89492, 0xe893aa, 0xe893a9,
+ /* d1 */ 0xe89496, 0xe893be, 0xe894a8, 0xe8949d,
+ /* d5 */ 0xe894ae, 0xe89482, 0xe893bd, 0xe8949e,
+ /* d9 */ 0xe893b6, 0xe894b1, 0xe894a6, 0xe893a7,
+ /* dd */ 0xe893a8, 0xe893b0, 0xe893af, 0xe893b9,
+ /* e1 */ 0xe89498, 0xe894a0, 0xe894b0, 0xe8948b,
+ /* e5 */ 0xe89499, 0xe894af, 0xe899a2, 0xe89d96,
+ /* e9 */ 0xe89da3, 0xe89da4, 0xe89db7, 0xe89fa1,
+ /* ed */ 0xe89db3, 0xe89d98, 0xe89d94, 0xe89d9b,
+ /* f1 */ 0xe89d92, 0xe89da1, 0xe89d9a, 0xe89d91,
+ /* f5 */ 0xe89d9e, 0xe89dad, 0xe89daa, 0xe89d90,
+ /* f9 */ 0xe89d8e, 0xe89d9f, 0xe89d9d, 0xe89daf,
+ /* fd */ 0xe89dac, 0xe89dba,
+
+ /*** Four byte table, leaf: 8ea2d4xx - offset 0x04457 ***/
+
+ /* a1 */ 0xe89dae, 0xe89d9c, 0xe89da5, 0xe89d8f,
+ /* a5 */ 0xe89dbb, 0xe89db5, 0xe89da2, 0xe89da7,
+ /* a9 */ 0xe89da9, 0xe8a19a, 0xe8a485, 0xe8a48c,
+ /* ad */ 0xe8a494, 0xe8a48b, 0xe8a497, 0xe8a498,
+ /* b1 */ 0xe8a499, 0xe8a486, 0xe8a496, 0xe8a491,
+ /* b5 */ 0xe8a48e, 0xe8a489, 0xe8a6a2, 0xe8a6a4,
+ /* b9 */ 0xe8a6a3, 0xe8a7ad, 0xe8a7b0, 0xe8a7ac,
+ /* bd */ 0xe8ab8f, 0xe8ab86, 0xe8aab8, 0xe8ab93,
+ /* c1 */ 0xe8ab91, 0xe8ab94, 0xe8ab95, 0xe8aabb,
+ /* c5 */ 0xe8ab97, 0xe8aabe, 0xe8ab80, 0xe8ab85,
+ /* c9 */ 0xe8ab98, 0xe8ab83, 0xe8aaba, 0xe8aabd,
+ /* cd */ 0xe8ab99, 0xe8b0be, 0xe8b18d, 0xe8b28f,
+ /* d1 */ 0xe8b3a5, 0xe8b39f, 0xe8b399, 0xe8b3a8,
+ /* d5 */ 0xe8b39a, 0xe8b39d, 0xe8b3a7, 0xe8b6a0,
+ /* d9 */ 0xe8b69c, 0xe8b6a1, 0xe8b69b, 0xe8b8a0,
+ /* dd */ 0xe8b8a3, 0xe8b8a5, 0xe8b8a4, 0xe8b8ae,
+ /* e1 */ 0xe8b895, 0xe8b89b, 0xe8b896, 0xe8b891,
+ /* e5 */ 0xe8b899, 0xe8b8a6, 0xe8b8a7, 0xe8b894,
+ /* e9 */ 0xe8b892, 0xe8b898, 0xe8b893, 0xe8b89c,
+ /* ed */ 0xe8b897, 0xe8b89a, 0xe8bcac, 0xe8bca4,
+ /* f1 */ 0xe8bc98, 0xe8bc9a, 0xe8bca0, 0xe8bca3,
+ /* f5 */ 0xe8bc96, 0xe8bc97, 0xe981b3, 0xe981b0,
+ /* f9 */ 0xe981af, 0xe981a7, 0xe981ab, 0xe984af,
+ /* fd */ 0xe984ab, 0xe984a9,
+
+ /*** Four byte table, leaf: 8ea2d5xx - offset 0x044b5 ***/
+
+ /* a1 */ 0xe984aa, 0xe984b2, 0xe984a6, 0xe984ae,
+ /* a5 */ 0xe98685, 0xe98686, 0xe9868a, 0xe98681,
+ /* a9 */ 0xe98682, 0xe98684, 0xe98680, 0xe98b90,
+ /* ad */ 0xe98b83, 0xe98b84, 0xe98b80, 0xe98b99,
+ /* b1 */ 0xe98ab6, 0xe98b8f, 0xe98bb1, 0xe98b9f,
+ /* b5 */ 0xe98b98, 0xe98ba9, 0xe98b97, 0xe98b9d,
+ /* b9 */ 0xe98b8c, 0xe98baf, 0xe98b82, 0xe98ba8,
+ /* bd */ 0xe98b8a, 0xe98b88, 0xe98b8e, 0xe98ba6,
+ /* c1 */ 0xe98b8d, 0xe98b95, 0xe98b89, 0xe98ba0,
+ /* c5 */ 0xe98b9e, 0xe98ba7, 0xe98b91, 0xe98b93,
+ /* c9 */ 0xe98ab5, 0xe98ba1, 0xe98ca5, 0xe98b86,
+ /* cd */ 0xe98ab4, 0xe995bc, 0xe996ac, 0xe996ab,
+ /* d1 */ 0xe996ae, 0xe996b0, 0xe99aa4, 0xe99aa2,
+ /* d5 */ 0xe99b93, 0xe99c85, 0xe99c88, 0xe99c82,
+ /* d9 */ 0xe99d9a, 0xe99e8a, 0xe99e8e, 0xe99e88,
+ /* dd */ 0xe99f90, 0xe99f8f, 0xe9a09e, 0xe9a09d,
+ /* e1 */ 0xe9a0a6, 0xe9a0a9, 0xe9a0a8, 0xe9a0a0,
+ /* e5 */ 0xe9a09b, 0xe9a0a7, 0xe9a2b2, 0xe9a488,
+ /* e9 */ 0xe9a3ba, 0xe9a491, 0xe9a494, 0xe9a496,
+ /* ed */ 0xe9a497, 0xe9a495, 0xe9a79c, 0xe9a78d,
+ /* f1 */ 0xe9a78f, 0xe9a793, 0xe9a794, 0xe9a78e,
+ /* f5 */ 0xe9a789, 0xe9a796, 0xe9a798, 0xe9a78b,
+ /* f9 */ 0xe9a797, 0xe9a78c, 0xe9aab3, 0xe9abac,
+ /* fd */ 0xe9abab, 0xe9abb3,
+
+ /*** Four byte table, leaf: 8ea2d6xx - offset 0x04513 ***/
+
+ /* a1 */ 0xe9abb2, 0xe9abb1, 0xe9ad86, 0xe9ad83,
+ /* a5 */ 0xe9ada7, 0xe9adb4, 0xe9adb1, 0xe9ada6,
+ /* a9 */ 0xe9adb6, 0xe9adb5, 0xe9adb0, 0xe9ada8,
+ /* ad */ 0xe9ada4, 0xe9adac, 0xe9b3bc, 0xe9b3ba,
+ /* b1 */ 0xe9b3bd, 0xe9b3bf, 0xe9b3b7, 0xe9b487,
+ /* b5 */ 0xe9b480, 0xe9b3b9, 0xe9b3bb, 0xe9b488,
+ /* b9 */ 0xe9b485, 0xe9b484, 0xe9ba83, 0xe9bb93,
+ /* bd */ 0xe9bc8f, 0xe9bc90, 0xe5849c, 0xe58493,
+ /* c1 */ 0xe58497, 0xe5849a, 0xe58491, 0xe5879e,
+ /* c5 */ 0xe58cb4, 0xe58fa1, 0xe599b0, 0xe599a0,
+ /* c9 */ 0xe599ae, 0xe599b3, 0xe599a6, 0xe599a3,
+ /* cd */ 0xe599ad, 0xe599b2, 0xe5999e, 0xe599b7,
+ /* d1 */ 0xe59c9c, 0xe59c9b, 0xe5a388, 0xe5a2bd,
+ /* d5 */ 0xe5a389, 0xe5a2bf, 0xe5a2ba, 0xe5a382,
+ /* d9 */ 0xe5a2bc, 0xe5a386, 0xe5ac97, 0xe5ac99,
+ /* dd */ 0xe5ac9b, 0xe5aca1, 0xe5ac94, 0xe5ac93,
+ /* e1 */ 0xe5ac90, 0xe5ac96, 0xe5aca8, 0xe5ac9a,
+ /* e5 */ 0xe5aca0, 0xe5ac9e, 0xe5afaf, 0xe5b6ac,
+ /* e9 */ 0xe5b6b1, 0xe5b6a9, 0xe5b6a7, 0xe5b6b5,
+ /* ed */ 0xe5b6b0, 0xe5b6ae, 0xe5b6aa, 0xe5b6a8,
+ /* f1 */ 0xe5b6b2, 0xe5b6ad, 0xe5b6af, 0xe5b6b4,
+ /* f5 */ 0xe5b9a7, 0xe5b9a8, 0xe5b9a6, 0xe5b9af,
+ /* f9 */ 0xe5bba9, 0xe5bba7, 0xe5bba6, 0xe5bba8,
+ /* fd */ 0xe5bba5, 0xe5bd8b,
+
+ /*** Four byte table, leaf: 8ea2d7xx - offset 0x04571 ***/
+
+ /* a1 */ 0xe5bebc, 0xe5bebb, 0xe6869d, 0xe686a8,
+ /* a5 */ 0xe68696, 0xe68785, 0xe686b4, 0xe68786,
+ /* a9 */ 0xe68781, 0xe6878c, 0xe686ba, 0xe686bf,
+ /* ad */ 0xe686b8, 0xe6868c, 0xe69397, 0xe69396,
+ /* b1 */ 0xe69390, 0xe6938f, 0xe69389, 0xe692bd,
+ /* b5 */ 0xe69289, 0xe69383, 0xe6939b, 0xe693b3,
+ /* b9 */ 0xe69399, 0xe694b3, 0xe695bf, 0xe695bc,
+ /* bd */ 0xe696a2, 0xe69b88, 0xe69abe, 0xe69b80,
+ /* c1 */ 0xe69b8a, 0xe69b8b, 0xe69b8f, 0xe69abd,
+ /* c5 */ 0xe69abb, 0xe69aba, 0xe69b8c, 0xe69ca3,
+ /* c9 */ 0xe6a8b4, 0xe6a9a6, 0xe6a989, 0xe6a9a7,
+ /* cd */ 0xe6a8b2, 0xe6a9a8, 0xe6a8be, 0xe6a99d,
+ /* d1 */ 0xe6a9ad, 0xe6a9b6, 0xe6a99b, 0xe6a991,
+ /* d5 */ 0xe6a8a8, 0xe6a99a, 0xe6a8bb, 0xe6a8bf,
+ /* d9 */ 0xe6a981, 0xe6a9aa, 0xe6a9a4, 0xe6a990,
+ /* dd */ 0xe6a98f, 0xe6a994, 0xe6a9af, 0xe6a9a9,
+ /* e1 */ 0xe6a9a0, 0xe6a8bc, 0xe6a99e, 0xe6a996,
+ /* e5 */ 0xe6a995, 0xe6a98d, 0xe6a98e, 0xe6a986,
+ /* e9 */ 0xe6ad95, 0xe6ad94, 0xe6ad96, 0xe6aea7,
+ /* ed */ 0xe6aeaa, 0xe6aeab, 0xe6af88, 0xe6af87,
+ /* f1 */ 0xe6b084, 0xe6b083, 0xe6b086, 0xe6bead,
+ /* f5 */ 0xe6bf8b, 0xe6bea3, 0xe6bf87, 0xe6bebc,
+ /* f9 */ 0xe6bf8e, 0xe6bf88, 0xe6bd9e, 0xe6bf84,
+ /* fd */ 0xe6bebd, 0xe6be9e,
+
+ /*** Four byte table, leaf: 8ea2d8xx - offset 0x045cf ***/
+
+ /* a1 */ 0xe6bf8a, 0xe6bea8, 0xe78084, 0xe6bea5,
+ /* a5 */ 0xe6beae, 0xe6beba, 0xe6beac, 0xe6beaa,
+ /* a9 */ 0xe6bf8f, 0xe6bebf, 0xe6beb8, 0xe6bea2,
+ /* ad */ 0xe6bf89, 0xe6beab, 0xe6bf8d, 0xe6beaf,
+ /* b1 */ 0xe6beb2, 0xe6beb0, 0xe78785, 0xe78782,
+ /* b5 */ 0xe786bf, 0xe786b8, 0xe78796, 0xe78780,
+ /* b9 */ 0xe78781, 0xe7878b, 0xe78794, 0xe7878a,
+ /* bd */ 0xe78787, 0xe7878f, 0xe786bd, 0xe78798,
+ /* c1 */ 0xe786bc, 0xe78786, 0xe7879a, 0xe7879b,
+ /* c5 */ 0xe78a9d, 0xe78a9e, 0xe78da9, 0xe78da6,
+ /* c9 */ 0xe78da7, 0xe78dac, 0xe78da5, 0xe78dab,
+ /* cd */ 0xe78daa, 0xe791bf, 0xe7929a, 0xe792a0,
+ /* d1 */ 0xe79294, 0xe79292, 0xe79295, 0xe792a1,
+ /* d5 */ 0xe7948b, 0xe79680, 0xe798af, 0xe798ad,
+ /* d9 */ 0xe798b1, 0xe798bd, 0xe798b3, 0xe798bc,
+ /* dd */ 0xe798b5, 0xe798b2, 0xe798b0, 0xe79abb,
+ /* e1 */ 0xe79ba6, 0xe79e9a, 0xe79e9d, 0xe79ea1,
+ /* e5 */ 0xe79e9c, 0xe79e9b, 0xe79ea2, 0xe79ea3,
+ /* e9 */ 0xe79e95, 0xe79e99, 0xe79e97, 0xe7a39d,
+ /* ed */ 0xe7a3a9, 0xe7a3a5, 0xe7a3aa, 0xe7a39e,
+ /* f1 */ 0xe7a3a3, 0xe7a39b, 0xe7a3a1, 0xe7a3a2,
+ /* f5 */ 0xe7a3ad, 0xe7a39f, 0xe7a3a0, 0xe7a6a4,
+ /* f9 */ 0xe7a984, 0xe7a988, 0xe7a987, 0xe7aab6,
+ /* fd */ 0xe7aab8, 0xe7aab5,
+
+ /*** Four byte table, leaf: 8ea2d9xx - offset 0x0462d ***/
+
+ /* a1 */ 0xe7aab1, 0xe7aab7, 0xe7af9e, 0xe7afa3,
+ /* a5 */ 0xe7afa7, 0xe7af9d, 0xe7af95, 0xe7afa5,
+ /* a9 */ 0xe7af9a, 0xe7afa8, 0xe7afb9, 0xe7af94,
+ /* ad */ 0xe7afaa, 0xe7afa2, 0xe7af9c, 0xe7afab,
+ /* b1 */ 0xe7af98, 0xe7af9f, 0xe7b392, 0xe7b394,
+ /* b5 */ 0xe7b397, 0xe7b390, 0xe7b391, 0xe7b892,
+ /* b9 */ 0xe7b8a1, 0xe7b897, 0xe7b88c, 0xe7b89f,
+ /* bd */ 0xe7b8a0, 0xe7b893, 0xe7b88e, 0xe7b89c,
+ /* c1 */ 0xe7b895, 0xe7b89a, 0xe7b8a2, 0xe7b88b,
+ /* c5 */ 0xe7b88f, 0xe7b896, 0xe7b88d, 0xe7b894,
+ /* c9 */ 0xe7b8a5, 0xe7b8a4, 0xe7bd83, 0xe7bdbb,
+ /* cd */ 0xe7bdbc, 0xe7bdba, 0xe7beb1, 0xe7bfaf,
+ /* d1 */ 0xe880aa, 0xe880a9, 0xe881ac, 0xe886b1,
+ /* d5 */ 0xe886a6, 0xe886ae, 0xe886b9, 0xe886b5,
+ /* d9 */ 0xe886ab, 0xe886b0, 0xe886ac, 0xe886b4,
+ /* dd */ 0xe886b2, 0xe886b7, 0xe886a7, 0xe887b2,
+ /* e1 */ 0xe88995, 0xe88996, 0xe88997, 0xe89596,
+ /* e5 */ 0xe89585, 0xe895ab, 0xe8958d, 0xe89593,
+ /* e9 */ 0xe895a1, 0xe89598, 0xe89580, 0xe89586,
+ /* ed */ 0xe895a4, 0xe89581, 0xe895a2, 0xe89584,
+ /* f1 */ 0xe89591, 0xe89587, 0xe895a3, 0xe894be,
+ /* f5 */ 0xe8959b, 0xe895b1, 0xe8958e, 0xe895ae,
+ /* f9 */ 0xe895b5, 0xe89595, 0xe895a7, 0xe895a0,
+ /* fd */ 0xe8968c, 0xe895a6,
+
+ /*** Four byte table, leaf: 8ea2daxx - offset 0x0468b ***/
+
+ /* a1 */ 0xe8959d, 0xe89594, 0xe895a5, 0xe895ac,
+ /* a5 */ 0xe899a3, 0xe899a5, 0xe899a4, 0xe89ea4,
+ /* a9 */ 0xe89e9b, 0xe89e8f, 0xe89e97, 0xe89e93,
+ /* ad */ 0xe89e92, 0xe89e88, 0xe89e81, 0xe89e96,
+ /* b1 */ 0xe89e98, 0xe89db9, 0xe89e87, 0xe89ea3,
+ /* b5 */ 0xe89e85, 0xe89e90, 0xe89e91, 0xe89e9d,
+ /* b9 */ 0xe89e84, 0xe89e94, 0xe89e9c, 0xe89e9a,
+ /* bd */ 0xe89e89, 0xe8a49e, 0xe8a4a6, 0xe8a4b0,
+ /* c1 */ 0xe8a4ad, 0xe8a4ae, 0xe8a4a7, 0xe8a4b1,
+ /* c5 */ 0xe8a4a2, 0xe8a4a9, 0xe8a4a3, 0xe8a4af,
+ /* c9 */ 0xe8a4ac, 0xe8a49f, 0xe8a7b1, 0xe8aba0,
+ /* cd */ 0xe8aba2, 0xe8abb2, 0xe8abb4, 0xe8abb5,
+ /* d1 */ 0xe8ab9d, 0xe8ac94, 0xe8aba4, 0xe8ab9f,
+ /* d5 */ 0xe8abb0, 0xe8ab88, 0xe8ab9e, 0xe8aba1,
+ /* d9 */ 0xe8aba8, 0xe8abbf, 0xe8abaf, 0xe8abbb,
+ /* dd */ 0xe8b291, 0xe8b292, 0xe8b290, 0xe8b3b5,
+ /* e1 */ 0xe8b3ae, 0xe8b3b1, 0xe8b3b0, 0xe8b3b3,
+ /* e5 */ 0xe8b5ac, 0xe8b5ae, 0xe8b6a5, 0xe8b6a7,
+ /* e9 */ 0xe8b8b3, 0xe8b8be, 0xe8b8b8, 0xe8b980,
+ /* ed */ 0xe8b985, 0xe8b8b6, 0xe8b8bc, 0xe8b8bd,
+ /* f1 */ 0xe8b981, 0xe8b8b0, 0xe8b8bf, 0xe8babd,
+ /* f5 */ 0xe8bcb6, 0xe8bcae, 0xe8bcb5, 0xe8bcb2,
+ /* f9 */ 0xe8bcb9, 0xe8bcb7, 0xe8bcb4, 0xe981b6,
+ /* fd */ 0xe981b9, 0xe981bb,
+
+ /*** Four byte table, leaf: 8ea2dbxx - offset 0x046e9 ***/
+
+ /* a1 */ 0xe98286, 0xe983ba, 0xe984b3, 0xe984b5,
+ /* a5 */ 0xe984b6, 0xe98693, 0xe98690, 0xe98691,
+ /* a9 */ 0xe9868d, 0xe9868f, 0xe98ca7, 0xe98c9e,
+ /* ad */ 0xe98c88, 0xe98c9f, 0xe98c86, 0xe98c8f,
+ /* b1 */ 0xe98dba, 0xe98cb8, 0xe98cbc, 0xe98c9b,
+ /* b5 */ 0xe98ca3, 0xe98c92, 0xe98c81, 0xe98d86,
+ /* b9 */ 0xe98cad, 0xe98c8e, 0xe98c8d, 0xe98b8b,
+ /* bd */ 0xe98c9d, 0xe98bba, 0xe98c93, 0xe98bb9,
+ /* c1 */ 0xe98bb7, 0xe98cb4, 0xe98c82, 0xe98ca4,
+ /* c5 */ 0xe98bbf, 0xe98ca9, 0xe98cb9, 0xe98cb5,
+ /* c9 */ 0xe98caa, 0xe98c94, 0xe98c8c, 0xe98c8b,
+ /* cd */ 0xe98bbe, 0xe98c89, 0xe98c80, 0xe98bbb,
+ /* d1 */ 0xe98c96, 0xe996bc, 0xe9978d, 0xe996be,
+ /* d5 */ 0xe996b9, 0xe996ba, 0xe996b6, 0xe996bf,
+ /* d9 */ 0xe996b5, 0xe996bd, 0xe99aa9, 0xe99b94,
+ /* dd */ 0xe99c8b, 0xe99c92, 0xe99c90, 0xe99e99,
+ /* e1 */ 0xe99e97, 0xe99e94, 0xe99fb0, 0xe99fb8,
+ /* e5 */ 0xe9a0b5, 0xe9a0af, 0xe9a0b2, 0xe9a4a4,
+ /* e9 */ 0xe9a49f, 0xe9a4a7, 0xe9a4a9, 0xe9a69e,
+ /* ed */ 0xe9a7ae, 0xe9a7ac, 0xe9a7a5, 0xe9a7a4,
+ /* f1 */ 0xe9a7b0, 0xe9a7a3, 0xe9a7aa, 0xe9a7a9,
+ /* f5 */ 0xe9a7a7, 0xe9aab9, 0xe9aabf, 0xe9aab4,
+ /* f9 */ 0xe9aabb, 0xe9abb6, 0xe9abba, 0xe9abb9,
+ /* fd */ 0xe9abb7, 0xe9acb3,
+
+ /*** Four byte table, leaf: 8ea2dcxx - offset 0x04747 ***/
+
+ /* a1 */ 0xe9ae80, 0xe9ae85, 0xe9ae87, 0xe9adbc,
+ /* a5 */ 0xe9adbe, 0xe9adbb, 0xe9ae82, 0xe9ae93,
+ /* a9 */ 0xe9ae92, 0xe9ae90, 0xe9adba, 0xe9ae95,
+ /* ad */ 0xe9adbd, 0xe9ae88, 0xe9b4a5, 0xe9b497,
+ /* b1 */ 0xe9b4a0, 0xe9b49e, 0xe9b494, 0xe9b4a9,
+ /* b5 */ 0xe9b49d, 0xe9b498, 0xe9b4a2, 0xe9b490,
+ /* b9 */ 0xe9b499, 0xe9b49f, 0xe9ba88, 0xe9ba86,
+ /* bd */ 0xe9ba87, 0xe9baae, 0xe9baad, 0xe9bb95,
+ /* c1 */ 0xe9bb96, 0xe9bbba, 0xe9bc92, 0xe9bcbd,
+ /* c5 */ 0xe584a6, 0xe584a5, 0xe584a2, 0xe584a4,
+ /* c9 */ 0xe584a0, 0xe584a9, 0xe58bb4, 0xe59a93,
+ /* cd */ 0xe59a8c, 0xe59a8d, 0xe59a86, 0xe59a84,
+ /* d1 */ 0xe59a83, 0xe599be, 0xe59a82, 0xe599bf,
+ /* d5 */ 0xe59a81, 0xe5a396, 0xe5a394, 0xe5a38f,
+ /* d9 */ 0xe5a392, 0xe5acad, 0xe5aca5, 0xe5acb2,
+ /* dd */ 0xe5aca3, 0xe5acac, 0xe5aca7, 0xe5aca6,
+ /* e1 */ 0xe5acaf, 0xe5acae, 0xe5adbb, 0xe5afb1,
+ /* e5 */ 0xe5afb2, 0xe5b6b7, 0xe5b9ac, 0xe5b9aa,
+ /* e9 */ 0xe5bebe, 0xe68783, 0xe686b5, 0xe686bc,
+ /* ed */ 0xe687a7, 0xe687a0, 0xe687a5, 0xe687a4,
+ /* f1 */ 0xe687a8, 0xe6879e, 0xe693af, 0xe693a9,
+ /* f5 */ 0xe693a3, 0xe693ab, 0xe693a4, 0xe693a8,
+ /* f9 */ 0xe69681, 0xe69680, 0xe696b6, 0xe6979a,
+ /* fd */ 0xe69b92, 0xe6aa8d,
+
+ /*** Four byte table, leaf: 8ea2ddxx - offset 0x047a5 ***/
+
+ /* a1 */ 0xe6aa96, 0xe6aa81, 0xe6aaa5, 0xe6aa89,
+ /* a5 */ 0xe6aa9f, 0xe6aa9b, 0xe6aaa1, 0xe6aa9e,
+ /* a9 */ 0xe6aa87, 0xe6aa93, 0xe6aa8e, 0xe6aa95,
+ /* ad */ 0xe6aa83, 0xe6aaa8, 0xe6aaa4, 0xe6aa91,
+ /* b1 */ 0xe6a9bf, 0xe6aaa6, 0xe6aa9a, 0xe6aa85,
+ /* b5 */ 0xe6aa8c, 0xe6aa92, 0xe6ad9b, 0xe6aead,
+ /* b9 */ 0xe6b089, 0xe6bf8c, 0xe6bea9, 0xe6bfb4,
+ /* bd */ 0xe6bf94, 0xe6bfa3, 0xe6bf9c, 0xe6bfad,
+ /* c1 */ 0xe6bfa7, 0xe6bfa6, 0xe6bf9e, 0xe6bfb2,
+ /* c5 */ 0xe6bf9d, 0xe6bfa2, 0xe6bfa8, 0xe787a1,
+ /* c9 */ 0xe787b1, 0xe787a8, 0xe787b2, 0xe787a4,
+ /* cd */ 0xe787b0, 0xe787a2, 0xe78db3, 0xe78dae,
+ /* d1 */ 0xe78daf, 0xe79297, 0xe792b2, 0xe792ab,
+ /* d5 */ 0xe79290, 0xe792aa, 0xe792ad, 0xe792b1,
+ /* d9 */ 0xe792a5, 0xe792af, 0xe79490, 0xe79491,
+ /* dd */ 0xe79492, 0xe7948f, 0xe79684, 0xe79983,
+ /* e1 */ 0xe79988, 0xe79989, 0xe79987, 0xe79aa4,
+ /* e5 */ 0xe79ba9, 0xe79eb5, 0xe79eab, 0xe79eb2,
+ /* e9 */ 0xe79eb7, 0xe79eb6, 0xe79eb4, 0xe79eb1,
+ /* ed */ 0xe79ea8, 0xe79fb0, 0xe7a3b3, 0xe7a3bd,
+ /* f1 */ 0xe7a482, 0xe7a3bb, 0xe7a3bc, 0xe7a3bf,
+ /* f5 */ 0xe7a3b2, 0xe7a485, 0xe7a3b9, 0xe7a3be,
+ /* f9 */ 0xe7a484, 0xe7a6ab, 0xe7a6a8, 0xe7a99c,
+ /* fd */ 0xe7a99b, 0xe7a996,
+
+ /*** Four byte table, leaf: 8ea2dexx - offset 0x04803 ***/
+
+ /* a1 */ 0xe7a998, 0xe7a994, 0xe7a99a, 0xe7aabe,
+ /* a5 */ 0xe7ab80, 0xe7ab81, 0xe7b085, 0xe7b08f,
+ /* a9 */ 0xe7afb2, 0xe7b080, 0xe7afbf, 0xe7afbb,
+ /* ad */ 0xe7b08e, 0xe7afb4, 0xe7b08b, 0xe7afb3,
+ /* b1 */ 0xe7b082, 0xe7b089, 0xe7b083, 0xe7b081,
+ /* b5 */ 0xe7afb8, 0xe7afbd, 0xe7b086, 0xe7afb0,
+ /* b9 */ 0xe7afb1, 0xe7b090, 0xe7b08a, 0xe7b3a8,
+ /* bd */ 0xe7b8ad, 0xe7b8bc, 0xe7b982, 0xe7b8b3,
+ /* c1 */ 0xe9a188, 0xe7b8b8, 0xe7b8aa, 0xe7b989,
+ /* c5 */ 0xe7b980, 0xe7b987, 0xe7b8a9, 0xe7b98c,
+ /* c9 */ 0xe7b8b0, 0xe7b8bb, 0xe7b8b6, 0xe7b984,
+ /* cd */ 0xe7b8ba, 0xe7bd85, 0xe7bdbf, 0xe7bdbe,
+ /* d1 */ 0xe7bdbd, 0xe7bfb4, 0xe7bfb2, 0xe880ac,
+ /* d5 */ 0xe886bb, 0xe88784, 0xe8878c, 0xe8878a,
+ /* d9 */ 0xe88785, 0xe88787, 0xe886bc, 0xe887a9,
+ /* dd */ 0xe8899b, 0xe8899a, 0xe8899c, 0xe89683,
+ /* e1 */ 0xe89680, 0xe8968f, 0xe896a7, 0xe89695,
+ /* e5 */ 0xe896a0, 0xe8968b, 0xe896a3, 0xe895bb,
+ /* e9 */ 0xe896a4, 0xe8969a, 0xe8969e, 0xe895b7,
+ /* ed */ 0xe895bc, 0xe89689, 0xe896a1, 0xe895ba,
+ /* f1 */ 0xe895b8, 0xe89597, 0xe8968e, 0xe89696,
+ /* f5 */ 0xe89686, 0xe8968d, 0xe89699, 0xe8969d,
+ /* f9 */ 0xe89681, 0xe896a2, 0xe89682, 0xe89688,
+ /* fd */ 0xe89685, 0xe895b9,
+
+ /*** Four byte table, leaf: 8ea2dfxx - offset 0x04861 ***/
+
+ /* a1 */ 0xe895b6, 0xe89698, 0xe89690, 0xe8969f,
+ /* a5 */ 0xe899a8, 0xe89ebe, 0xe89eaa, 0xe89ead,
+ /* a9 */ 0xe89f85, 0xe89eb0, 0xe89eac, 0xe89eb9,
+ /* ad */ 0xe89eb5, 0xe89ebc, 0xe89eae, 0xe89f89,
+ /* b1 */ 0xe89f83, 0xe89f82, 0xe89f8c, 0xe89eb7,
+ /* b5 */ 0xe89eaf, 0xe89f84, 0xe89f8a, 0xe89eb4,
+ /* b9 */ 0xe89eb6, 0xe89ebf, 0xe89eb8, 0xe89ebd,
+ /* bd */ 0xe89f9e, 0xe89eb2, 0xe8a4b5, 0xe8a4b3,
+ /* c1 */ 0xe8a4bc, 0xe8a4be, 0xe8a581, 0xe8a592,
+ /* c5 */ 0xe8a4b7, 0xe8a582, 0xe8a6ad, 0xe8a6af,
+ /* c9 */ 0xe8a6ae, 0xe8a7b2, 0xe8a7b3, 0xe8ac9e,
+ /* cd */ 0xe8ac98, 0xe8ac96, 0xe8ac91, 0xe8ac85,
+ /* d1 */ 0xe8ac8b, 0xe8aca2, 0xe8ac8f, 0xe8ac92,
+ /* d5 */ 0xe8ac95, 0xe8ac87, 0xe8ac8d, 0xe8ac88,
+ /* d9 */ 0xe8ac86, 0xe8ac9c, 0xe8ac93, 0xe8ac9a,
+ /* dd */ 0xe8b18f, 0xe8b1b0, 0xe8b1b2, 0xe8b1b1,
+ /* e1 */ 0xe8b1af, 0xe8b295, 0xe8b294, 0xe8b3b9,
+ /* e5 */ 0xe8b5af, 0xe8b98e, 0xe8b98d, 0xe8b993,
+ /* e9 */ 0xe8b990, 0xe8b98c, 0xe8b987, 0xe8bd83,
+ /* ed */ 0xe8bd80, 0xe98285, 0xe981be, 0xe984b8,
+ /* f1 */ 0xe9869a, 0xe986a2, 0xe9869b, 0xe98699,
+ /* f5 */ 0xe9869f, 0xe986a1, 0xe9869d, 0xe986a0,
+ /* f9 */ 0xe98ea1, 0xe98e83, 0xe98eaf, 0xe98da4,
+ /* fd */ 0xe98d96, 0xe98d87,
+
+ /*** Four byte table, leaf: 8ea2e0xx - offset 0x048bf ***/
+
+ /* a1 */ 0xe98dbc, 0xe98d98, 0xe98d9c, 0xe98db6,
+ /* a5 */ 0xe98d89, 0xe98d90, 0xe98d91, 0xe98da0,
+ /* a9 */ 0xe98dad, 0xe98e8f, 0xe98d8c, 0xe98daa,
+ /* ad */ 0xe98db9, 0xe98d97, 0xe98d95, 0xe98d92,
+ /* b1 */ 0xe98d8f, 0xe98db1, 0xe98db7, 0xe98dbb,
+ /* b5 */ 0xe98da1, 0xe98d9e, 0xe98da3, 0xe98da7,
+ /* b9 */ 0xe98d8e, 0xe98d99, 0xe99787, 0xe99780,
+ /* bd */ 0xe99789, 0xe99783, 0xe99785, 0xe996b7,
+ /* c1 */ 0xe99aae, 0xe99ab0, 0xe99aac, 0xe99ca0,
+ /* c5 */ 0xe99c9f, 0xe99c98, 0xe99c9d, 0xe99c99,
+ /* c9 */ 0xe99e9a, 0xe99ea1, 0xe99e9c, 0xe99e9e,
+ /* cd */ 0xe99e9d, 0xe99f95, 0xe99f94, 0xe99fb1,
+ /* d1 */ 0xe9a181, 0xe9a184, 0xe9a18a, 0xe9a189,
+ /* d5 */ 0xe9a185, 0xe9a183, 0xe9a4a5, 0xe9a4ab,
+ /* d9 */ 0xe9a4ac, 0xe9a4aa, 0xe9a4b3, 0xe9a4b2,
+ /* dd */ 0xe9a4af, 0xe9a4ad, 0xe9a4b1, 0xe9a4b0,
+ /* e1 */ 0xe9a698, 0xe9a6a3, 0xe9a6a1, 0xe9a882,
+ /* e5 */ 0xe9a7ba, 0xe9a7b4, 0xe9a7b7, 0xe9a7b9,
+ /* e9 */ 0xe9a7b8, 0xe9a7b6, 0xe9a7bb, 0xe9a7bd,
+ /* ed */ 0xe9a7be, 0xe9a7bc, 0xe9a883, 0xe9aabe,
+ /* f1 */ 0xe9abbe, 0xe9abbd, 0xe9ac81, 0xe9abbc,
+ /* f5 */ 0xe9ad88, 0xe9ae9a, 0xe9aea8, 0xe9ae9e,
+ /* f9 */ 0xe9ae9b, 0xe9aea6, 0xe9aea1, 0xe9aea5,
+ /* fd */ 0xe9aea4, 0xe9ae86,
+
+ /*** Four byte table, leaf: 8ea2e1xx - offset 0x0491d ***/
+
+ /* a1 */ 0xe9aea2, 0xe9aea0, 0xe9aeaf, 0xe9b4b3,
+ /* a5 */ 0xe9b581, 0xe9b5a7, 0xe9b4b6, 0xe9b4ae,
+ /* a9 */ 0xe9b4af, 0xe9b4b1, 0xe9b4b8, 0xe9b4b0,
+ /* ad */ 0xe9b585, 0xe9b582, 0xe9b583, 0xe9b4be,
+ /* b1 */ 0xe9b4b7, 0xe9b580, 0xe9b4bd, 0xe7bfb5,
+ /* b5 */ 0xe9b4ad, 0xe9ba8a, 0xe9ba89, 0xe9ba8d,
+ /* b9 */ 0xe9bab0, 0xe9bb88, 0xe9bb9a, 0xe9bbbb,
+ /* bd */ 0xe9bbbf, 0xe9bca4, 0xe9bca3, 0xe9bca2,
+ /* c1 */ 0xe9bd94, 0xe9bea0, 0xe584b1, 0xe584ad,
+ /* c5 */ 0xe584ae, 0xe59a98, 0xe59a9c, 0xe59a97,
+ /* c9 */ 0xe59a9a, 0xe59a9d, 0xe59a99, 0xe5a5b0,
+ /* cd */ 0xe5acbc, 0xe5b1a9, 0xe5b1aa, 0xe5b780,
+ /* d1 */ 0xe5b9ad, 0xe5b9ae, 0xe68798, 0xe6879f,
+ /* d5 */ 0xe687ad, 0xe687ae, 0xe687b1, 0xe687aa,
+ /* d9 */ 0xe687b0, 0xe687ab, 0xe68796, 0xe687a9,
+ /* dd */ 0xe693bf, 0xe69484, 0xe693bd, 0xe693b8,
+ /* e1 */ 0xe69481, 0xe69483, 0xe693bc, 0xe69694,
+ /* e5 */ 0xe6979b, 0xe69b9a, 0xe69b9b, 0xe69b98,
+ /* e9 */ 0xe6ab85, 0xe6aab9, 0xe6aabd, 0xe6aba1,
+ /* ed */ 0xe6ab86, 0xe6aaba, 0xe6aab6, 0xe6aab7,
+ /* f1 */ 0xe6ab87, 0xe6aab4, 0xe6aaad, 0xe6ad9e,
+ /* f5 */ 0xe6af89, 0xe6b08b, 0xe78087, 0xe7808c,
+ /* f9 */ 0xe7808d, 0xe78081, 0xe78085, 0xe78094,
+ /* fd */ 0xe7808e, 0xe6bfbf,
+
+ /*** Four byte table, leaf: 8ea2e2xx - offset 0x0497b ***/
+
+ /* a1 */ 0xe78080, 0xe6bfbb, 0xe780a6, 0xe6bfbc,
+ /* a5 */ 0xe6bfb7, 0xe7808a, 0xe78881, 0xe787bf,
+ /* a9 */ 0xe787b9, 0xe78883, 0xe787bd, 0xe78db6,
+ /* ad */ 0xe792b8, 0xe79380, 0xe792b5, 0xe79381,
+ /* b1 */ 0xe792be, 0xe792b6, 0xe792bb, 0xe79382,
+ /* b5 */ 0xe79494, 0xe79493, 0xe7999c, 0xe799a4,
+ /* b9 */ 0xe79999, 0xe79990, 0xe79993, 0xe79997,
+ /* bd */ 0xe7999a, 0xe79aa6, 0xe79abd, 0xe79bac,
+ /* c1 */ 0xe79f82, 0xe79eba, 0xe7a48c, 0xe7a493,
+ /* c5 */ 0xe7a494, 0xe7a489, 0xe7a490, 0xe7a492,
+ /* c9 */ 0xe7a491, 0xe7a6ad, 0xe7a6ac, 0xe7a99f,
+ /* cd */ 0xe7b09c, 0xe7b0a9, 0xe7b099, 0xe7b0a0,
+ /* d1 */ 0xe7b09f, 0xe7b0ad, 0xe7b09d, 0xe7b0a6,
+ /* d5 */ 0xe7b0a8, 0xe7b0a2, 0xe7b0a5, 0xe7b0b0,
+ /* d9 */ 0xe7b99c, 0xe7b990, 0xe7b996, 0xe7b9a3,
+ /* dd */ 0xe7b998, 0xe7b9a2, 0xe7b99f, 0xe7b991,
+ /* e1 */ 0xe7b9a0, 0xe7b997, 0xe7b993, 0xe7beb5,
+ /* e5 */ 0xe7beb3, 0xe7bfb7, 0xe7bfb8, 0xe881b5,
+ /* e9 */ 0xe88791, 0xe88792, 0xe88790, 0xe8899f,
+ /* ed */ 0xe8899e, 0xe896b4, 0xe89786, 0xe89780,
+ /* f1 */ 0xe89783, 0xe89782, 0xe896b3, 0xe896b5,
+ /* f5 */ 0xe896bd, 0xe89787, 0xe89784, 0xe896bf,
+ /* f9 */ 0xe8978b, 0xe8978e, 0xe89788, 0xe89785,
+ /* fd */ 0xe896b1, 0xe896b6,
+
+ /*** Four byte table, leaf: 8ea2e3xx - offset 0x049d9 ***/
+
+ /* a1 */ 0xe89792, 0xe898a4, 0xe896b8, 0xe896b7,
+ /* a5 */ 0xe896be, 0xe899a9, 0xe89fa7, 0xe89fa6,
+ /* a9 */ 0xe89fa2, 0xe89f9b, 0xe89fab, 0xe89faa,
+ /* ad */ 0xe89fa5, 0xe89f9f, 0xe89fb3, 0xe89fa4,
+ /* b1 */ 0xe89f94, 0xe89f9c, 0xe89f93, 0xe89fad,
+ /* b5 */ 0xe89f98, 0xe89fa3, 0xe89f97, 0xe89f99,
+ /* b9 */ 0xe8a081, 0xe89fb4, 0xe89fa8, 0xe89f9d,
+ /* bd */ 0xe8a593, 0xe8a58b, 0xe8a58f, 0xe8a58c,
+ /* c1 */ 0xe8a586, 0xe8a590, 0xe8a591, 0xe8a589,
+ /* c5 */ 0xe8acaa, 0xe8aca7, 0xe8aca3, 0xe8acb3,
+ /* c9 */ 0xe8acb0, 0xe8acb5, 0xe8ad87, 0xe8acaf,
+ /* cd */ 0xe8acbc, 0xe8acbe, 0xe8acb1, 0xe8aca5,
+ /* d1 */ 0xe8acb7, 0xe8aca6, 0xe8acb6, 0xe8acae,
+ /* d5 */ 0xe8aca4, 0xe8acbb, 0xe8acbd, 0xe8acba,
+ /* d9 */ 0xe8b182, 0xe8b1b5, 0xe8b299, 0xe8b298,
+ /* dd */ 0xe8b297, 0xe8b3be, 0xe8b484, 0xe8b482,
+ /* e1 */ 0xe8b480, 0xe8b99c, 0xe8b9a2, 0xe8b9a0,
+ /* e5 */ 0xe8b997, 0xe8b996, 0xe8b99e, 0xe8b9a5,
+ /* e9 */ 0xe8b9a7, 0xe8b99b, 0xe8b99a, 0xe8b9a1,
+ /* ed */ 0xe8b99d, 0xe8b9a9, 0xe8b994, 0xe8bd86,
+ /* f1 */ 0xe8bd87, 0xe8bd88, 0xe8bd8b, 0xe984a8,
+ /* f5 */ 0xe984ba, 0xe984bb, 0xe984be, 0xe986a8,
+ /* f9 */ 0xe986a5, 0xe986a7, 0xe986af, 0xe986aa,
+ /* fd */ 0xe98eb5, 0xe98e8c,
+
+ /*** Four byte table, leaf: 8ea2e4xx - offset 0x04a37 ***/
+
+ /* a1 */ 0xe98e92, 0xe98eb7, 0xe98e9b, 0xe98e9d,
+ /* a5 */ 0xe98e89, 0xe98ea7, 0xe98e8e, 0xe98eaa,
+ /* a9 */ 0xe98e9e, 0xe98ea6, 0xe98e95, 0xe98e88,
+ /* ad */ 0xe98e99, 0xe98e9f, 0xe98e80, 0xe98e8d,
+ /* b1 */ 0xe98eb1, 0xe98e91, 0xe98eb2, 0xe98ea4,
+ /* b5 */ 0xe98ea8, 0xe98eb4, 0xe98ea3, 0xe99792,
+ /* b9 */ 0xe99793, 0xe99791, 0xe99ab3, 0xe99b97,
+ /* bd */ 0xe99b9a, 0xe5b782, 0xe99b9f, 0xe99b98,
+ /* c1 */ 0xe99b9d, 0xe99ca3, 0xe99ca2, 0xe99ca5,
+ /* c5 */ 0xe99eac, 0xe99eae, 0xe99ea8, 0xe99eab,
+ /* c9 */ 0xe99ea4, 0xe99eaa, 0xe99ea2, 0xe99ea5,
+ /* cd */ 0xe99f97, 0xe99f99, 0xe99f96, 0xe99f98,
+ /* d1 */ 0xe99fba, 0xe9a190, 0xe9a191, 0xe9a192,
+ /* d5 */ 0xe9a2b8, 0xe9a581, 0xe9a4bc, 0xe9a4ba,
+ /* d9 */ 0xe9a88f, 0xe9a88b, 0xe9a889, 0xe9a88d,
+ /* dd */ 0xe9a884, 0xe9a891, 0xe9a88a, 0xe9a885,
+ /* e1 */ 0xe9a887, 0xe9a886, 0xe9ab80, 0xe9ab9c,
+ /* e5 */ 0xe9ac88, 0xe9ac84, 0xe9ac85, 0xe9aca9,
+ /* e9 */ 0xe9acb5, 0xe9ad8a, 0xe9ad8c, 0xe9ad8b,
+ /* ed */ 0xe9af87, 0xe9af86, 0xe9af83, 0xe9aebf,
+ /* f1 */ 0xe9af81, 0xe9aeb5, 0xe9aeb8, 0xe9af93,
+ /* f5 */ 0xe9aeb6, 0xe9af84, 0xe9aeb9, 0xe9aebd,
+ /* f9 */ 0xe9b59c, 0xe9b593, 0xe9b58f, 0xe9b58a,
+ /* fd */ 0xe9b59b, 0xe9b58b,
+
+ /*** Four byte table, leaf: 8ea2e5xx - offset 0x04a95 ***/
+
+ /* a1 */ 0xe9b599, 0xe9b596, 0xe9b58c, 0xe9b597,
+ /* a5 */ 0xe9b592, 0xe9b594, 0xe9b59f, 0xe9b598,
+ /* a9 */ 0xe9b59a, 0xe9ba8e, 0xe9ba8c, 0xe9bb9f,
+ /* ad */ 0xe9bc81, 0xe9bc80, 0xe9bc96, 0xe9bca5,
+ /* b1 */ 0xe9bcab, 0xe9bcaa, 0xe9bca9, 0xe9bca8,
+ /* b5 */ 0xe9bd8c, 0xe9bd95, 0xe584b4, 0xe584b5,
+ /* b9 */ 0xe58a96, 0xe58bb7, 0xe58eb4, 0xe59aab,
+ /* bd */ 0xe59aad, 0xe59aa6, 0xe59aa7, 0xe59aaa,
+ /* c1 */ 0xe59aac, 0xe5a39a, 0xe5a39d, 0xe5a39b,
+ /* c5 */ 0xe5a492, 0xe5acbd, 0xe5acbe, 0xe5acbf,
+ /* c9 */ 0xe5b783, 0xe5b9b0, 0xe5bebf, 0xe687bb,
+ /* cd */ 0xe69487, 0xe69490, 0xe6948d, 0xe69489,
+ /* d1 */ 0xe6948c, 0xe6948e, 0xe69684, 0xe6979e,
+ /* d5 */ 0xe6979d, 0xe69b9e, 0xe6aba7, 0xe6aba0,
+ /* d9 */ 0xe6ab8c, 0xe6ab91, 0xe6ab99, 0xe6ab8b,
+ /* dd */ 0xe6ab9f, 0xe6ab9c, 0xe6ab90, 0xe6abab,
+ /* e1 */ 0xe6ab8f, 0xe6ab8d, 0xe6ab9e, 0xe6ada0,
+ /* e5 */ 0xe6aeb0, 0xe6b08c, 0xe78099, 0xe780a7,
+ /* e9 */ 0xe780a0, 0xe78096, 0xe780ab, 0xe780a1,
+ /* ed */ 0xe780a2, 0xe780a3, 0xe780a9, 0xe78097,
+ /* f1 */ 0xe780a4, 0xe7809c, 0xe7888c, 0xe7888a,
+ /* f5 */ 0xe78887, 0xe78882, 0xe78885, 0xe78aa5,
+ /* f9 */ 0xe78aa6, 0xe78aa4, 0xe78aa3, 0xe78aa1,
+ /* fd */ 0xe7938b, 0xe79385,
+
+ /*** Four byte table, leaf: 8ea2e6xx - offset 0x04af3 ***/
+
+ /* a1 */ 0xe792b7, 0xe79383, 0xe79496, 0xe799a0,
+ /* a5 */ 0xe79f89, 0xe79f8a, 0xe79f84, 0xe79fb1,
+ /* a9 */ 0xe7a49d, 0xe7a49b, 0xe7a4a1, 0xe7a49c,
+ /* ad */ 0xe7a497, 0xe7a49e, 0xe7a6b0, 0xe7a9a7,
+ /* b1 */ 0xe7a9a8, 0xe7b0b3, 0xe7b0bc, 0xe7b0b9,
+ /* b5 */ 0xe7b0ac, 0xe7b0bb, 0xe7b3ac, 0xe7b3aa,
+ /* b9 */ 0xe7b9b6, 0xe7b9b5, 0xe7b9b8, 0xe7b9b0,
+ /* bd */ 0xe7b9b7, 0xe7b9af, 0xe7b9ba, 0xe7b9b2,
+ /* c1 */ 0xe7b9b4, 0xe7b9a8, 0xe7bd8b, 0xe7bd8a,
+ /* c5 */ 0xe7be83, 0xe7be86, 0xe7beb7, 0xe7bfbd,
+ /* c9 */ 0xe7bfbe, 0xe881b8, 0xe88797, 0xe88795,
+ /* cd */ 0xe8888b, 0xe889a4, 0xe889a1, 0xe889a3,
+ /* d1 */ 0xe897ab, 0xe897b1, 0xe897ad, 0xe89799,
+ /* d5 */ 0xe897a1, 0xe897a8, 0xe8979a, 0xe89797,
+ /* d9 */ 0xe897ac, 0xe897b2, 0xe897b8, 0xe89798,
+ /* dd */ 0xe8979f, 0xe897a3, 0xe8979c, 0xe89791,
+ /* e1 */ 0xe897b0, 0xe897a6, 0xe897af, 0xe8979e,
+ /* e5 */ 0xe897a2, 0xe8a080, 0xe89fba, 0xe8a083,
+ /* e9 */ 0xe89fb6, 0xe89fb7, 0xe8a089, 0xe8a08c,
+ /* ed */ 0xe8a08b, 0xe8a086, 0xe89fbc, 0xe8a088,
+ /* f1 */ 0xe89fbf, 0xe8a08a, 0xe8a082, 0xe8a5a2,
+ /* f5 */ 0xe8a59a, 0xe8a59b, 0xe8a597, 0xe8a5a1,
+ /* f9 */ 0xe8a59c, 0xe8a598, 0xe8a59d, 0xe8a599,
+ /* fd */ 0xe8a688, 0xe8a6b7,
+
+ /*** Four byte table, leaf: 8ea2e7xx - offset 0x04b51 ***/
+
+ /* a1 */ 0xe8a6b6, 0xe8a7b6, 0xe8ad90, 0xe8ad88,
+ /* a5 */ 0xe8ad8a, 0xe8ad80, 0xe8ad93, 0xe8ad96,
+ /* a9 */ 0xe8ad94, 0xe8ad8b, 0xe8ad95, 0xe8ad91,
+ /* ad */ 0xe8ad82, 0xe8ad92, 0xe8ad97, 0xe8b183,
+ /* b1 */ 0xe8b1b7, 0xe8b1b6, 0xe8b29a, 0xe8b486,
+ /* b5 */ 0xe8b487, 0xe8b489, 0xe8b6ac, 0xe8b6aa,
+ /* b9 */ 0xe8b6ad, 0xe8b6ab, 0xe8b9ad, 0xe8b9b8,
+ /* bd */ 0xe8b9b3, 0xe8b9aa, 0xe8b9af, 0xe8b9bb,
+ /* c1 */ 0xe8bb82, 0xe8bd92, 0xe8bd91, 0xe8bd8f,
+ /* c5 */ 0xe8bd90, 0xe8bd93, 0xe8beb4, 0xe98580,
+ /* c9 */ 0xe984bf, 0xe986b0, 0xe986ad, 0xe98f9e,
+ /* cd */ 0xe98f87, 0xe98f8f, 0xe98f82, 0xe98f9a,
+ /* d1 */ 0xe98f90, 0xe98fb9, 0xe98fac, 0xe98f8c,
+ /* d5 */ 0xe98f99, 0xe98ea9, 0xe98fa6, 0xe98f8a,
+ /* d9 */ 0xe98f94, 0xe98fae, 0xe98fa3, 0xe98f95,
+ /* dd */ 0xe98f84, 0xe98f8e, 0xe98f80, 0xe98f92,
+ /* e1 */ 0xe98ea5, 0xe98fa7, 0xe995bd, 0xe9979a,
+ /* e5 */ 0xe9979b, 0xe99ba1, 0xe99ca9, 0xe99cab,
+ /* e9 */ 0xe99cac, 0xe99ca8, 0xe99ca6, 0xe99eb3,
+ /* ed */ 0xe99eb7, 0xe99eb6, 0xe99f9d, 0xe99f9e,
+ /* f1 */ 0xe99f9f, 0xe9a19c, 0xe9a199, 0xe9a19d,
+ /* f5 */ 0xe9a197, 0xe9a2bf, 0xe9a2bd, 0xe9a2bb,
+ /* f9 */ 0xe9a2be, 0xe9a588, 0xe9a587, 0xe9a583,
+ /* fd */ 0xe9a6a6, 0xe9a6a7,
+
+ /*** Four byte table, leaf: 8ea2e8xx - offset 0x04baf ***/
+
+ /* a1 */ 0xe9a89a, 0xe9a895, 0xe9a8a5, 0xe9a89d,
+ /* a5 */ 0xe9a8a4, 0xe9a89b, 0xe9a8a2, 0xe9a8a0,
+ /* a9 */ 0xe9a8a7, 0xe9a8a3, 0xe9a89e, 0xe9a89c,
+ /* ad */ 0xe9a894, 0xe9ab82, 0xe9ac8b, 0xe9ac8a,
+ /* b1 */ 0xe9ac8e, 0xe9ac8c, 0xe9acb7, 0xe9afaa,
+ /* b5 */ 0xe9afab, 0xe9afa0, 0xe9af9e, 0xe9afa4,
+ /* b9 */ 0xe9afa6, 0xe9afa2, 0xe9afb0, 0xe9af94,
+ /* bd */ 0xe9af97, 0xe9afac, 0xe9af9c, 0xe9af99,
+ /* c1 */ 0xe9afa5, 0xe9af95, 0xe9afa1, 0xe9af9a,
+ /* c5 */ 0xe9b5b7, 0xe9b681, 0xe9b68a, 0xe9b684,
+ /* c9 */ 0xe9b688, 0xe9b5b1, 0xe9b680, 0xe9b5b8,
+ /* cd */ 0xe9b686, 0xe9b68b, 0xe9b68c, 0xe9b5bd,
+ /* d1 */ 0xe9b5ab, 0xe9b5b4, 0xe9b5b5, 0xe9b5b0,
+ /* d5 */ 0xe9b5a9, 0xe9b685, 0xe9b5b3, 0xe9b5bb,
+ /* d9 */ 0xe9b682, 0xe9b5af, 0xe9b5b9, 0xe9b5bf,
+ /* dd */ 0xe9b687, 0xe9b5a8, 0xe9ba94, 0xe9ba91,
+ /* e1 */ 0xe9bb80, 0xe9bbbc, 0xe9bcad, 0xe9bd80,
+ /* e5 */ 0xe9bd81, 0xe9bd8d, 0xe9bd96, 0xe9bd97,
+ /* e9 */ 0xe9bd98, 0xe58cb7, 0xe59ab2, 0xe59ab5,
+ /* ed */ 0xe59ab3, 0xe5a3a3, 0xe5ad85, 0xe5b786,
+ /* f1 */ 0xe5b787, 0xe5bbae, 0xe5bbaf, 0xe5bf80,
+ /* f5 */ 0xe5bf81, 0xe687b9, 0xe69497, 0xe69496,
+ /* f9 */ 0xe69495, 0xe69493, 0xe6979f, 0xe69ba8,
+ /* fd */ 0xe69ba3, 0xe69ba4,
+
+ /*** Four byte table, leaf: 8ea2e9xx - offset 0x04c0d ***/
+
+ /* a1 */ 0xe6abb3, 0xe6abb0, 0xe6abaa, 0xe6aba8,
+ /* a5 */ 0xe6abb9, 0xe6abb1, 0xe6abae, 0xe6abaf,
+ /* a9 */ 0xe780bc, 0xe780b5, 0xe780af, 0xe780b7,
+ /* ad */ 0xe780b4, 0xe780b1, 0xe78182, 0xe780b8,
+ /* b1 */ 0xe780bf, 0xe780ba, 0xe780b9, 0xe780aa,
+ /* b5 */ 0xe78180, 0xe780bb, 0xe780b3, 0xe78181,
+ /* b9 */ 0xe78893, 0xe78894, 0xe78aa8, 0xe78dbd,
+ /* bd */ 0xe78dbc, 0xe792ba, 0xe79aab, 0xe79aaa,
+ /* c1 */ 0xe79abe, 0xe79bad, 0xe79f8c, 0xe79f8e,
+ /* c5 */ 0xe79f8f, 0xe79f8d, 0xe79fb2, 0xe7a4a5,
+ /* c9 */ 0xe7a4a3, 0xe7a4a7, 0xe7a4a8, 0xe7a4a4,
+ /* cd */ 0xe7a4a9, 0xe7a6b2, 0xe7a9ae, 0xe7a9ac,
+ /* d1 */ 0xe7a9ad, 0xe7abb7, 0xe7b189, 0xe7b188,
+ /* d5 */ 0xe7b18a, 0xe7b187, 0xe7b185, 0xe7b3ae,
+ /* d9 */ 0xe7b9bb, 0xe7b9be, 0xe7ba81, 0xe7ba80,
+ /* dd */ 0xe7beba, 0xe7bfbf, 0xe881b9, 0xe8879b,
+ /* e1 */ 0xe88799, 0xe889a8, 0xe889a9, 0xe898a2,
+ /* e5 */ 0xe897bf, 0xe89881, 0xe897be, 0xe8989b,
+ /* e9 */ 0xe89880, 0xe897b6, 0xe89884, 0xe89889,
+ /* ed */ 0xe89885, 0xe8988c, 0xe897bd, 0xe8a099,
+ /* f1 */ 0xe8a090, 0xe8a091, 0xe8a097, 0xe8a093,
+ /* f5 */ 0xe8a096, 0xe8a5a3, 0xe8a5a6, 0xe8a6b9,
+ /* f9 */ 0xe8a7b7, 0xe8ada0, 0xe8adaa, 0xe8ad9d,
+ /* fd */ 0xe8ada8, 0xe8ada3,
+
+ /*** Four byte table, leaf: 8ea2eaxx - offset 0x04c6b ***/
+
+ /* a1 */ 0xe8ada5, 0xe8ada7, 0xe8adad, 0xe8b6ae,
+ /* a5 */ 0xe8ba86, 0xe8ba88, 0xe8ba84, 0xe8bd99,
+ /* a9 */ 0xe8bd96, 0xe8bd97, 0xe8bd95, 0xe8bd98,
+ /* ad */ 0xe8bd9a, 0xe9828d, 0xe98583, 0xe98581,
+ /* b1 */ 0xe986b7, 0xe986b5, 0xe986b2, 0xe986b3,
+ /* b5 */ 0xe9908b, 0xe99093, 0xe98fbb, 0xe990a0,
+ /* b9 */ 0xe9908f, 0xe99094, 0xe98fbe, 0xe99095,
+ /* bd */ 0xe99090, 0xe990a8, 0xe99099, 0xe9908d,
+ /* c1 */ 0xe98fb5, 0xe99080, 0xe98fb7, 0xe99087,
+ /* c5 */ 0xe9908e, 0xe99096, 0xe99092, 0xe98fba,
+ /* c9 */ 0xe99089, 0xe98fb8, 0xe990bc, 0xe9908a,
+ /* cd */ 0xe98fbf, 0xe98fbc, 0xe9908c, 0xe98fb6,
+ /* d1 */ 0xe99091, 0xe99086, 0xe9979e, 0xe997a0,
+ /* d5 */ 0xe9979f, 0xe99cae, 0xe99caf, 0xe99eb9,
+ /* d9 */ 0xe99ebb, 0xe99fbd, 0xe99fbe, 0xe9a1a0,
+ /* dd */ 0xe9a1a2, 0xe9a1a3, 0xe9a19f, 0xe9a381,
+ /* e1 */ 0xe9a382, 0xe9a590, 0xe9a58e, 0xe9a599,
+ /* e5 */ 0xe9a58c, 0xe9a58b, 0xe9a593, 0xe9a8b2,
+ /* e9 */ 0xe9a8b4, 0xe9a8b1, 0xe9a8ac, 0xe9a8aa,
+ /* ed */ 0xe9a8b6, 0xe9a8a9, 0xe9a8ae, 0xe9a8b8,
+ /* f1 */ 0xe9a8ad, 0xe9ab87, 0xe9ab8a, 0xe9ab86,
+ /* f5 */ 0xe9ac90, 0xe9ac92, 0xe9ac91, 0xe9b08b,
+ /* f9 */ 0xe9b088, 0xe9afb7, 0xe9b085, 0xe9b092,
+ /* fd */ 0xe9afb8, 0xe9b180,
+
+ /*** Four byte table, leaf: 8ea2ebxx - offset 0x04cc9 ***/
+
+ /* a1 */ 0xe9b087, 0xe9b08e, 0xe9b086, 0xe9b097,
+ /* a5 */ 0xe9b094, 0xe9b089, 0xe9b69f, 0xe9b699,
+ /* a9 */ 0xe9b6a4, 0xe9b69d, 0xe9b692, 0xe9b698,
+ /* ad */ 0xe9b690, 0xe9b69b, 0xe9b6a0, 0xe9b694,
+ /* b1 */ 0xe9b69c, 0xe9b6aa, 0xe9b697, 0xe9b6a1,
+ /* b5 */ 0xe9b69a, 0xe9b6a2, 0xe9b6a8, 0xe9b69e,
+ /* b9 */ 0xe9b6a3, 0xe9b6bf, 0xe9b6a9, 0xe9b696,
+ /* bd */ 0xe9b6a6, 0xe9b6a7, 0xe9ba99, 0xe9ba9b,
+ /* c1 */ 0xe9ba9a, 0xe9bba5, 0xe9bba4, 0xe9bba7,
+ /* c5 */ 0xe9bba6, 0xe9bcb0, 0xe9bcae, 0xe9bd9b,
+ /* c9 */ 0xe9bda0, 0xe9bd9e, 0xe9bd9d, 0xe9bd99,
+ /* cd */ 0xe9be91, 0xe584ba, 0xe584b9, 0xe58a98,
+ /* d1 */ 0xe58a97, 0xe59b83, 0xe59abd, 0xe59abe,
+ /* d5 */ 0xe5ad88, 0xe5ad87, 0xe5b78b, 0xe5b78f,
+ /* d9 */ 0xe5bbb1, 0xe687bd, 0xe6949b, 0xe6ac82,
+ /* dd */ 0xe6abbc, 0xe6ac83, 0xe6abb8, 0xe6ac80,
+ /* e1 */ 0xe78183, 0xe78184, 0xe7818a, 0xe78188,
+ /* e5 */ 0xe78189, 0xe78185, 0xe78186, 0xe7889d,
+ /* e9 */ 0xe7889a, 0xe78899, 0xe78dbe, 0xe79497,
+ /* ed */ 0xe799aa, 0xe79f90, 0xe7a4ad, 0xe7a4b1,
+ /* f1 */ 0xe7a4af, 0xe7b194, 0xe7b193, 0xe7b3b2,
+ /* f5 */ 0xe7ba8a, 0xe7ba87, 0xe7ba88, 0xe7ba8b,
+ /* f9 */ 0xe7ba86, 0xe7ba8d, 0xe7bd8d, 0xe7bebb,
+ /* fd */ 0xe880b0, 0xe8879d,
+
+ /*** Four byte table, leaf: 8ea2ecxx - offset 0x04d27 ***/
+
+ /* a1 */ 0xe89898, 0xe898aa, 0xe898a6, 0xe8989f,
+ /* a5 */ 0xe898a3, 0xe8989c, 0xe89899, 0xe898a7,
+ /* a9 */ 0xe898ae, 0xe898a1, 0xe898a0, 0xe898a9,
+ /* ad */ 0xe8989e, 0xe898a5, 0xe8a0a9, 0xe8a09d,
+ /* b1 */ 0xe8a09b, 0xe8a0a0, 0xe8a0a4, 0xe8a09c,
+ /* b5 */ 0xe8a0ab, 0xe8a18a, 0xe8a5ad, 0xe8a5a9,
+ /* b9 */ 0xe8a5ae, 0xe8a5ab, 0xe8a7ba, 0xe8adb9,
+ /* bd */ 0xe8adb8, 0xe8ad85, 0xe8adba, 0xe8adbb,
+ /* c1 */ 0xe8b490, 0xe8b494, 0xe8b6af, 0xe8ba8e,
+ /* c5 */ 0xe8ba8c, 0xe8bd9e, 0xe8bd9b, 0xe8bd9d,
+ /* c9 */ 0xe98586, 0xe98584, 0xe98585, 0xe986b9,
+ /* cd */ 0xe990bf, 0xe990bb, 0xe990b6, 0xe990a9,
+ /* d1 */ 0xe990bd, 0xe990b0, 0xe990b9, 0xe990aa,
+ /* d5 */ 0xe990b7, 0xe990ac, 0xe99180, 0xe990b1,
+ /* d9 */ 0xe997a5, 0xe997a4, 0xe997a3, 0xe99cb5,
+ /* dd */ 0xe99cba, 0xe99ebf, 0xe99fa1, 0xe9a1a4,
+ /* e1 */ 0xe9a389, 0xe9a386, 0xe9a380, 0xe9a598,
+ /* e5 */ 0xe9a596, 0xe9a8b9, 0xe9a8bd, 0xe9a986,
+ /* e9 */ 0xe9a984, 0xe9a982, 0xe9a981, 0xe9a8ba,
+ /* ed */ 0xe9a8bf, 0xe9ab8d, 0xe9ac95, 0xe9ac97,
+ /* f1 */ 0xe9ac98, 0xe9ac96, 0xe9acba, 0xe9ad92,
+ /* f5 */ 0xe9b0ab, 0xe9b09d, 0xe9b09c, 0xe9b0ac,
+ /* f9 */ 0xe9b0a3, 0xe9b0a8, 0xe9b0a9, 0xe9b0a4,
+ /* fd */ 0xe9b0a1, 0xe9b6b7,
+
+ /*** Four byte table, leaf: 8ea2edxx - offset 0x04d85 ***/
+
+ /* a1 */ 0xe9b6b6, 0xe9b6bc, 0xe9b781, 0xe9b787,
+ /* a5 */ 0xe9b78a, 0xe9b78f, 0xe9b6be, 0xe9b785,
+ /* a9 */ 0xe9b783, 0xe9b6bb, 0xe9b6b5, 0xe9b78e,
+ /* ad */ 0xe9b6b9, 0xe9b6ba, 0xe9b6ac, 0xe9b788,
+ /* b1 */ 0xe9b6b1, 0xe9b6ad, 0xe9b78c, 0xe9b6b3,
+ /* b5 */ 0xe9b78d, 0xe9b6b2, 0xe9b9ba, 0xe9ba9c,
+ /* b9 */ 0xe9bbab, 0xe9bbae, 0xe9bbad, 0xe9bc9b,
+ /* bd */ 0xe9bc98, 0xe9bc9a, 0xe9bcb1, 0xe9bd8e,
+ /* c1 */ 0xe9bda5, 0xe9bda4, 0xe9be92, 0xe4bab9,
+ /* c5 */ 0xe59b86, 0xe59b85, 0xe59b8b, 0xe5a5b1,
+ /* c9 */ 0xe5ad8b, 0xe5ad8c, 0xe5b795, 0xe5b791,
+ /* cd */ 0xe5bbb2, 0xe694a1, 0xe694a0, 0xe694a6,
+ /* d1 */ 0xe694a2, 0xe6ac8b, 0xe6ac88, 0xe6ac89,
+ /* d5 */ 0xe6b08d, 0xe78195, 0xe78196, 0xe78197,
+ /* d9 */ 0xe78192, 0xe7889e, 0xe7889f, 0xe78aa9,
+ /* dd */ 0xe78dbf, 0xe79398, 0xe79395, 0xe79399,
+ /* e1 */ 0xe79397, 0xe799ad, 0xe79aad, 0xe7a4b5,
+ /* e5 */ 0xe7a6b4, 0xe7a9b0, 0xe7a9b1, 0xe7b197,
+ /* e9 */ 0xe7b19c, 0xe7b199, 0xe7b19b, 0xe7b19a,
+ /* ed */ 0xe7b3b4, 0xe7b3b1, 0xe7ba91, 0xe7bd8f,
+ /* f1 */ 0xe7be87, 0xe8879e, 0xe889ab, 0xe898b4,
+ /* f5 */ 0xe898b5, 0xe898b3, 0xe898ac, 0xe898b2,
+ /* f9 */ 0xe898b6, 0xe8a0ac, 0xe8a0a8, 0xe8a0a6,
+ /* fd */ 0xe8a0aa, 0xe8a0a5,
+
+ /*** Four byte table, leaf: 8ea2eexx - offset 0x04de3 ***/
+
+ /* a1 */ 0xe8a5b1, 0xe8a6bf, 0xe8a6be, 0xe8a7bb,
+ /* a5 */ 0xe8adbe, 0xe8ae84, 0xe8ae82, 0xe8ae86,
+ /* a9 */ 0xe8ae85, 0xe8adbf, 0xe8b495, 0xe8ba95,
+ /* ad */ 0xe8ba94, 0xe8ba9a, 0xe8ba92, 0xe8ba90,
+ /* b1 */ 0xe8ba96, 0xe8ba97, 0xe8bda0, 0xe8bda2,
+ /* b5 */ 0xe98587, 0xe9918c, 0xe99190, 0xe9918a,
+ /* b9 */ 0xe9918b, 0xe9918f, 0xe99187, 0xe99185,
+ /* bd */ 0xe99188, 0xe99189, 0xe99186, 0xe99cbf,
+ /* c1 */ 0xe99fa3, 0xe9a1aa, 0xe9a1a9, 0xe9a38b,
+ /* c5 */ 0xe9a594, 0xe9a59b, 0xe9a98e, 0xe9a993,
+ /* c9 */ 0xe9a994, 0xe9a98c, 0xe9a98f, 0xe9a988,
+ /* cd */ 0xe9a98a, 0xe9a989, 0xe9a992, 0xe9a990,
+ /* d1 */ 0xe9ab90, 0xe9ac99, 0xe9acab, 0xe9acbb,
+ /* d5 */ 0xe9ad96, 0xe9ad95, 0xe9b186, 0xe9b188,
+ /* d9 */ 0xe9b0bf, 0xe9b184, 0xe9b0b9, 0xe9b0b3,
+ /* dd */ 0xe9b181, 0xe9b0bc, 0xe9b0b7, 0xe9b0b4,
+ /* e1 */ 0xe9b0b2, 0xe9b0bd, 0xe9b0b6, 0xe9b79b,
+ /* e5 */ 0xe9b792, 0xe9b79e, 0xe9b79a, 0xe9b78b,
+ /* e9 */ 0xe9b790, 0xe9b79c, 0xe9b791, 0xe9b79f,
+ /* ed */ 0xe9b7a9, 0xe9b799, 0xe9b798, 0xe9b796,
+ /* f1 */ 0xe9b7b5, 0xe9b795, 0xe9b79d, 0xe9bab6,
+ /* f5 */ 0xe9bbb0, 0xe9bcb5, 0xe9bcb3, 0xe9bcb2,
+ /* f9 */ 0xe9bd82, 0xe9bdab, 0xe9be95, 0xe9bea2,
+ /* fd */ 0xe584bd, 0xe58a99,
+
+ /*** Four byte table, leaf: 8ea2efxx - offset 0x04e41 ***/
+
+ /* a1 */ 0xe5a3a8, 0xe5a3a7, 0xe5a5b2, 0xe5ad8d,
+ /* a5 */ 0xe5b798, 0xe8a0af, 0xe5bd8f, 0xe68881,
+ /* a9 */ 0xe68883, 0xe68884, 0xe694a9, 0xe694a5,
+ /* ad */ 0xe69696, 0xe69bab, 0xe6ac91, 0xe6ac92,
+ /* b1 */ 0xe6ac8f, 0xe6af8a, 0xe7819b, 0xe7819a,
+ /* b5 */ 0xe788a2, 0xe78e82, 0xe78e81, 0xe78e83,
+ /* b9 */ 0xe799b0, 0xe79f94, 0xe7b1a7, 0xe7b1a6,
+ /* bd */ 0xe7ba95, 0xe889ac, 0xe898ba, 0xe89980,
+ /* c1 */ 0xe898b9, 0xe898bc, 0xe898b1, 0xe898bb,
+ /* c5 */ 0xe898be, 0xe8a0b0, 0xe8a0b2, 0xe8a0ae,
+ /* c9 */ 0xe8a0b3, 0xe8a5b6, 0xe8a5b4, 0xe8a5b3,
+ /* cd */ 0xe8a7be, 0xe8ae8c, 0xe8ae8e, 0xe8ae8b,
+ /* d1 */ 0xe8ae88, 0xe8b185, 0xe8b499, 0xe8ba98,
+ /* d5 */ 0xe8bda4, 0xe8bda3, 0xe986bc, 0xe991a2,
+ /* d9 */ 0xe99195, 0xe9919d, 0xe99197, 0xe9919e,
+ /* dd */ 0xe99f84, 0xe99f85, 0xe9a080, 0xe9a996,
+ /* e1 */ 0xe9a999, 0xe9ac9e, 0xe9ac9f, 0xe9aca0,
+ /* e5 */ 0xe9b192, 0xe9b198, 0xe9b190, 0xe9b18a,
+ /* e9 */ 0xe9b18d, 0xe9b18b, 0xe9b195, 0xe9b199,
+ /* ed */ 0xe9b18c, 0xe9b18e, 0xe9b7bb, 0xe9b7b7,
+ /* f1 */ 0xe9b7af, 0xe9b7a3, 0xe9b7ab, 0xe9b7b8,
+ /* f5 */ 0xe9b7a4, 0xe9b7b6, 0xe9b7a1, 0xe9b7ae,
+ /* f9 */ 0xe9b7a6, 0xe9b7b2, 0xe9b7b0, 0xe9b7a2,
+ /* fd */ 0xe9b7ac, 0xe9b7b4,
+
+ /*** Four byte table, leaf: 8ea2f0xx - offset 0x04e9f ***/
+
+ /* a1 */ 0xe9b7b3, 0xe9b7a8, 0xe9b7ad, 0xe9bb82,
+ /* a5 */ 0xe9bb90, 0xe9bbb2, 0xe9bbb3, 0xe9bc86,
+ /* a9 */ 0xe9bc9c, 0xe9bcb8, 0xe9bcb7, 0xe9bcb6,
+ /* ad */ 0xe9bd83, 0xe9bd8f, 0xe9bdb1, 0xe9bdb0,
+ /* b1 */ 0xe9bdae, 0xe9bdaf, 0xe59b93, 0xe59b8d,
+ /* b5 */ 0xe5ad8e, 0xe5b1ad, 0xe694ad, 0xe69bad,
+ /* b9 */ 0xe69bae, 0xe6ac93, 0xe7819f, 0xe781a1,
+ /* bd */ 0xe7819d, 0xe781a0, 0xe788a3, 0xe7939b,
+ /* c1 */ 0xe793a5, 0xe79f95, 0xe7a4b8, 0xe7a6b7,
+ /* c5 */ 0xe7a6b6, 0xe7b1aa, 0xe7ba97, 0xe7be89,
+ /* c9 */ 0xe889ad, 0xe89983, 0xe8a0b8, 0xe8a0b7,
+ /* cd */ 0xe8a0b5, 0xe8a18b, 0xe8ae94, 0xe8ae95,
+ /* d1 */ 0xe8ba9e, 0xe8ba9f, 0xe8baa0, 0xe8ba9d,
+ /* d5 */ 0xe986be, 0xe986bd, 0xe98782, 0xe991ab,
+ /* d9 */ 0xe991a8, 0xe991a9, 0xe99ba5, 0xe99d86,
+ /* dd */ 0xe99d83, 0xe99d87, 0xe99f87, 0xe99fa5,
+ /* e1 */ 0xe9a99e, 0xe9ab95, 0xe9ad99, 0xe9b1a3,
+ /* e5 */ 0xe9b1a7, 0xe9b1a6, 0xe9b1a2, 0xe9b19e,
+ /* e9 */ 0xe9b1a0, 0xe9b882, 0xe9b7be, 0xe9b887,
+ /* ed */ 0xe9b883, 0xe9b886, 0xe9b885, 0xe9b880,
+ /* f1 */ 0xe9b881, 0xe9b889, 0xe9b7bf, 0xe9b7bd,
+ /* f5 */ 0xe9b884, 0xe9baa0, 0xe9bc9e, 0xe9bd86,
+ /* f9 */ 0xe9bdb4, 0xe9bdb5, 0xe9bdb6, 0xe59b94,
+ /* fd */ 0xe694ae, 0xe696b8,
+
+ /*** Four byte table, leaf: 8ea2f1xx - offset 0x04efd ***/
+
+ /* a1 */ 0xe6ac98, 0xe6ac99, 0xe6ac97, 0xe6ac9a,
+ /* a5 */ 0xe781a2, 0xe788a6, 0xe78aaa, 0xe79f98,
+ /* a9 */ 0xe79f99, 0xe7a4b9, 0xe7b1a9, 0xe7b1ab,
+ /* ad */ 0xe7b3b6, 0xe7ba9a, 0xe7ba98, 0xe7ba9b,
+ /* b1 */ 0xe7ba99, 0xe887a0, 0xe887a1, 0xe89986,
+ /* b5 */ 0xe89987, 0xe89988, 0xe8a5b9, 0xe8a5ba,
+ /* b9 */ 0xe8a5bc, 0xe8a5bb, 0xe8a7bf, 0xe8ae98,
+ /* bd */ 0xe8ae99, 0xe8baa5, 0xe8baa4, 0xe8baa3,
+ /* c1 */ 0xe991ae, 0xe991ad, 0xe991af, 0xe991b1,
+ /* c5 */ 0xe991b3, 0xe99d89, 0xe9a1b2, 0xe9a59f,
+ /* c9 */ 0xe9b1a8, 0xe9b1ae, 0xe9b1ad, 0xe9b88b,
+ /* cd */ 0xe9b88d, 0xe9b890, 0xe9b88f, 0xe9b892,
+ /* d1 */ 0xe9b891, 0xe9baa1, 0xe9bbb5, 0xe9bc89,
+ /* d5 */ 0xe9bd87, 0xe9bdb8, 0xe9bdbb, 0xe9bdba,
+ /* d9 */ 0xe9bdb9, 0xe59c9e, 0xe781a6, 0xe7b1af,
+ /* dd */ 0xe8a0bc, 0xe8b6b2, 0xe8baa6, 0xe98783,
+ /* e1 */ 0xe991b4, 0xe991b8, 0xe991b6, 0xe991b5,
+ /* e5 */ 0xe9a9a0, 0xe9acae, 0xe9b1b4, 0xe9b1b3,
+ /* e9 */ 0xe9b1b1, 0xe9b1b5, 0xe9b894, 0xe9b893,
+ /* ed */ 0xe9bbb6, 0xe9bc8a, 0xe9bea4, 0xe781a8,
+ /* f1 */ 0xe781a5, 0xe7b3b7, 0xe899aa, 0xe8a0be,
+ /* f5 */ 0xe8a0bd, 0xe8a0bf, 0xe8ae9e, 0xe8b29c,
+ /* f9 */ 0xe8baa9, 0xe8bb89, 0xe99d8b, 0xe9a1b3,
+ /* fd */ 0xe9a1b4, 0xe9a38c,
+
+ /*** Four byte table, leaf: 8ea2f2xx - offset 0x04f5b ***/
+
+ /* a1 */ 0xe9a5a1, 0xe9a6ab, 0xe9a9a4, 0xe9a9a6,
+ /* a5 */ 0xe9a9a7, 0xe9aca4, 0xe9b895, 0xe9b897,
+ /* a9 */ 0xe9bd88, 0xe68887, 0xe6ac9e, 0xe788a7,
+ /* ad */ 0xe8998c, 0xe8baa8, 0xe99282, 0xe99280,
+ /* b1 */ 0xe99281, 0xe9a9a9, 0xe9a9a8, 0xe9b899,
+ /* b5 */ 0xe8998b, 0xe8ae9f, 0xe99283, 0xe9b1b9,
+ /* b9 */ 0xe9bab7, 0xe799b5, 0xe9a9ab, 0xe9b1ba,
+ /* bd */ 0xe9b89d, 0xe781a9, 0xe781aa, 0xe788a9,
+ /* c1 */ 0xe9baa4, 0xe9bdbe, 0xe9bd89, 0xe9be98,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaea1xx - offset 0x04fb9 ***/
+
+ /* a1 */ 0xe4b8a8, 0xe4b8b6, 0xe4b8bf, 0xe4ba85,
+ /* a5 */ 0xe4b885, 0xe4b884, 0xe58682, 0xe58696,
+ /* a9 */ 0xe58cb8, 0xe58da9, 0xe58eb6, 0xe4b8aa,
+ /* ad */ 0xe4ba87, 0xe4b989, 0xe587a2, 0xe4b986,
+ /* b1 */ 0xe4ba8f, 0xe4babc, 0xe4babe, 0xe585a6,
+ /* b5 */ 0xe587a3, 0xe58884, 0xe58a9c, 0x000000,
+ /* b9 */ 0xe5a482, 0xe5a48a, 0xe5ae80, 0xe5b79b,
+ /* bd */ 0xe5b9ba, 0xe5b9bf, 0xe5bbb4, 0xe5bd90,
+ /* c1 */ 0xe5bd91, 0xe5bda1, 0xe9989d, 0x000000,
+ /* c5 */ 0xe4b9a3, 0xe4b9a2, 0xe4baa3, 0xe58685,
+ /* c9 */ 0xe4bb85, 0xe4bb8f, 0xe4bb8e, 0xe4bb8c,
+ /* cd */ 0xe58684, 0xe58686, 0x000000, 0x000000,
+ /* d1 */ 0xe587a4, 0xe58885, 0xe58a9e, 0xe58a9d,
+ /* d5 */ 0xe58bbd, 0xe58c80, 0xe58cba, 0x000000,
+ /* d9 */ 0xe58d86, 0xe58d9d, 0xe58e86, 0xe58eb7,
+ /* dd */ 0x000000, 0xe58f8c, 0x000000, 0xe58f8e,
+ /* e1 */ 0xe59ca1, 0x000000, 0xe5b880, 0xe5bc8c,
+ /* e5 */ 0xe688b7, 0xe688b8, 0xe694b4, 0xe694b5,
+ /* e9 */ 0xe697a0, 0x000000, 0xe78e8d, 0xe4ba97,
+ /* ed */ 0xe4bba0, 0x000000, 0x000000, 0xe4bba7,
+ /* f1 */ 0x000000, 0xe4bba6, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0xe59b98, 0xe5868b,
+ /* f9 */ 0xe5868c, 0xe58699, 0xe587a5, 0x000000,
+ /* fd */ 0xe5888b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaea2xx - offset 0x05016 ***/
+
+ /* a1 */ 0x000000, 0xe58c84, 0xe58c83, 0xe58c87,
+ /* a5 */ 0x000000, 0xe58c9e, 0xe58d9f, 0xe58dad,
+ /* a9 */ 0xe58e89, 0xe58eba, 0xe58f90, 0x000000,
+ /* ad */ 0xe58fb6, 0xe58fb7, 0xe58fb9, 0x000000,
+ /* b1 */ 0xe58fb4, 0x000000, 0x000000, 0xe59ca4,
+ /* b5 */ 0xe5a484, 0xe5a498, 0xe5a4b2, 0xe5a4b0,
+ /* b9 */ 0xe5a4b4, 0x000000, 0xe5a5b5, 0x000000,
+ /* bd */ 0xe5ae82, 0xe5afb9, 0xe5b094, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0xe5ba81, 0xe5ba83,
+ /* c9 */ 0xe5bc8d, 0xe5bd92, 0x000000, 0xe5bf8a,
+ /* cd */ 0xe5bf87, 0xe688b9, 0x000000, 0xe6898f,
+ /* d1 */ 0xe697a7, 0xe69caf, 0xe6adba, 0xe6b0b9,
+ /* d5 */ 0x000000, 0x000000, 0xe6b0b7, 0xe6b184,
+ /* d9 */ 0xe6b185, 0xe78e8c, 0xe79692, 0xe799b6,
+ /* dd */ 0xe98293, 0xe98292, 0x000000, 0x000000,
+ /* e1 */ 0xe4b8a1, 0xe4b8a0, 0xe4b8a2, 0xe4b9a8,
+ /* e5 */ 0xe4ba89, 0xe4ba98, 0xe4bbb9, 0xe4bbaf,
+ /* e9 */ 0x000000, 0x000000, 0xe4bbb8, 0xe4bc86,
+ /* ed */ 0xe4bc83, 0xe4bbbc, 0xe4bbae, 0xe4bc96,
+ /* f1 */ 0x000000, 0xe4bca8, 0xe4bc9c, 0xe4bc87,
+ /* f5 */ 0xe4bc9a, 0xe4bbba, 0xe4bc97, 0xe5858a,
+ /* f9 */ 0x000000, 0xe585b2, 0x000000, 0xe586b4,
+ /* fd */ 0xe586b3, 0xe586b2,
+
+ /*** Four byte table, leaf: 8eaea3xx - offset 0x05074 ***/
+
+ /* a1 */ 0x000000, 0xe587a8, 0x000000, 0xe58894,
+ /* a5 */ 0xe5888f, 0xe58895, 0xe58898, 0xe58aa8,
+ /* a9 */ 0x000000, 0xe58d8b, 0xe58d8f, 0x000000,
+ /* ad */ 0xe58d90, 0x000000, 0xe58e8b, 0x000000,
+ /* b1 */ 0xe58ebe, 0x000000, 0xe58f92, 0xe59096,
+ /* b5 */ 0xe58fbf, 0x000000, 0xe59080, 0x000000,
+ /* b9 */ 0xe59085, 0xe59093, 0xe59095, 0x000000,
+ /* bd */ 0x000000, 0xe59ba3, 0xe59cb5, 0xe59cb6,
+ /* c1 */ 0xe59cb1, 0xe59cb2, 0xe5a3ae, 0xe5a485,
+ /* c5 */ 0xe4b994, 0x000000, 0xe5a4b6, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0xe5a5ba, 0x000000,
+ /* cd */ 0xe5a686, 0x000000, 0x000000, 0xe5ae86,
+ /* d1 */ 0xe5bd93, 0xe5b098, 0x000000, 0xe5b0bd,
+ /* d5 */ 0xe5b1b8, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0xe5b280, 0x000000, 0xe5b888,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe5bbb5, 0xe5bc8e, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0xe5bf93, 0xe5bf9a, 0x000000,
+ /* e9 */ 0xe5bf9b, 0x000000, 0xe6888f, 0xe6899d,
+ /* ed */ 0xe6899f, 0xe689a7, 0xe68997, 0xe9bd90,
+ /* f1 */ 0x000000, 0xe697ab, 0xe697aa, 0x000000,
+ /* f5 */ 0xe69cb7, 0x000000, 0xe69cb2, 0xe69cb6,
+ /* f9 */ 0xe6aca2, 0xe6af8e, 0x000000, 0xe6b198,
+ /* fd */ 0xe6b191, 0xe6b1b7,
+
+ /*** Four byte table, leaf: 8eaea4xx - offset 0x050d2 ***/
+
+ /* a1 */ 0xe6b0bc, 0x000000, 0xe6b19a, 0x000000,
+ /* a5 */ 0xe6b193, 0xe781af, 0xe781b2, 0xe781ae,
+ /* a9 */ 0x000000, 0x000000, 0xe781b3, 0xe78ab1,
+ /* ad */ 0xe78ab2, 0x000000, 0xe78e8f, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0xe7a4bc, 0x000000,
+ /* b5 */ 0xe8828d, 0xe8828e, 0x000000, 0xe889bb,
+ /* b9 */ 0x000000, 0xe8b5b1, 0xe8beb9, 0xe98296,
+ /* bd */ 0xe9829a, 0x000000, 0xe4b8a4, 0xe4b9b1,
+ /* c1 */ 0x000000, 0xe4ba9c, 0xe4bd85, 0xe4bd8a,
+ /* c5 */ 0xe4bcb9, 0xe4bcb7, 0x000000, 0xe4bcb2,
+ /* c9 */ 0xe4bd82, 0x000000, 0xe4bd84, 0xe4bd8b,
+ /* cd */ 0x000000, 0xe4bd80, 0xe4bcb5, 0xe4bcb1,
+ /* d1 */ 0xe58591, 0x000000, 0xe58590, 0xe5858e,
+ /* d5 */ 0x000000, 0x000000, 0xe5869d, 0x000000,
+ /* d9 */ 0xe586b5, 0xe586b8, 0xe587ac, 0xe588a3,
+ /* dd */ 0xe588a7, 0xe588a6, 0xe5889f, 0xe588ab,
+ /* e1 */ 0xe588a0, 0xe58ab4, 0xe58ab3, 0x000000,
+ /* e5 */ 0xe58ca5, 0xe58cbb, 0xe58db4, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0xe5918d, 0x000000, 0x000000, 0xe590ba,
+ /* f1 */ 0x000000, 0x000000, 0xe59184, 0xe5918c,
+ /* f5 */ 0xe590a3, 0xe5909a, 0xe590b2, 0xe5918b,
+ /* f9 */ 0xe590a1, 0x000000, 0xe590b4, 0xe59189,
+ /* fd */ 0xe59190, 0xe590a2,
+
+ /*** Four byte table, leaf: 8eaea5xx - offset 0x05130 ***/
+
+ /* a1 */ 0xe590bf, 0xe59191, 0xe5919a, 0xe590af,
+ /* a5 */ 0x000000, 0xe59ba9, 0xe59bb2, 0xe59bb3,
+ /* a9 */ 0xe59baf, 0xe59bad, 0xe59bac, 0xe59ba6,
+ /* ad */ 0xe59d88, 0x000000, 0xe59d84, 0xe59cbf,
+ /* b1 */ 0xe59cbc, 0xe59d93, 0xe59d96, 0x000000,
+ /* b5 */ 0xe59d9f, 0xe59d83, 0xe59d98, 0xe59d97,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0xe59d86,
+ /* bd */ 0x000000, 0xe59cbd, 0x000000, 0xe59d82,
+ /* c1 */ 0xe59d94, 0xe59d95, 0xe5a3b1, 0xe5a3b2,
+ /* c5 */ 0xe5a3b0, 0xe5a48b, 0xe9baa6, 0xe59bb1,
+ /* c9 */ 0xe5a4bd, 0x000000, 0xe5a694, 0xe5a68c,
+ /* cd */ 0x000000, 0xe5a69c, 0x000000, 0x000000,
+ /* d1 */ 0xe5a69f, 0x000000, 0xe5a69b, 0x000000,
+ /* d5 */ 0xe5a689, 0xe5a69a, 0x000000, 0xe69688,
+ /* d9 */ 0x000000, 0xe5ae8d, 0x000000, 0xe5afbe,
+ /* dd */ 0xe5afbf, 0xe5afbd, 0xe5b0ab, 0x000000,
+ /* e1 */ 0xe5b284, 0xe5b28e, 0xe5b29c, 0x000000,
+ /* e5 */ 0x000000, 0xe5b285, 0xe5b7b5, 0xe5b889,
+ /* e9 */ 0x000000, 0x000000, 0xe5b88b, 0x000000,
+ /* ed */ 0xe5ba92, 0xe5ba90, 0xe5bc83, 0x000000,
+ /* f1 */ 0xe5bc9e, 0xe5bda3, 0x000000, 0xe5bfa7,
+ /* f5 */ 0xe5bfbe, 0xe5bfa6, 0xe5bf9c, 0xe5bf8e,
+ /* f9 */ 0x000000, 0xe5bfbc, 0xe5bf9f, 0xe5bfac,
+ /* fd */ 0xe5bfb6, 0x000000,
+
+ /*** Four byte table, leaf: 8eaea6xx - offset 0x0518e ***/
+
+ /* a1 */ 0xe5bfb2, 0xe5bfb0, 0xe5bfb9, 0x000000,
+ /* a5 */ 0xe68893, 0x000000, 0x000000, 0xe688bb,
+ /* a9 */ 0xe688bc, 0xe68a82, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0xe689b8, 0xe68a8b, 0x000000,
+ /* b1 */ 0xe68a9e, 0xe68aa5, 0xe68a9b, 0xe68a9c,
+ /* b5 */ 0xe68a99, 0xe68a8d, 0xe68a85, 0xe68a9d,
+ /* b9 */ 0xe689b5, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0xe697b6, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xe69bb5, 0xe69d9b, 0x000000, 0xe69d94,
+ /* c5 */ 0xe69d92, 0x000000, 0xe69d98, 0xe69d84,
+ /* c9 */ 0xe69d8a, 0xe69da1, 0x000000, 0xe6b1bf,
+ /* cd */ 0xe6b291, 0xe6b29e, 0x000000, 0xe6b1ae,
+ /* d1 */ 0xe6b1bc, 0xe6b29f, 0xe6b1b5, 0x000000,
+ /* d5 */ 0xe6b196, 0xe6b2a2, 0xe6b1b9, 0x000000,
+ /* d9 */ 0xe6b2a1, 0x000000, 0xe6b2aa, 0xe6b2a0,
+ /* dd */ 0x000000, 0xe781b9, 0xe781b7, 0xe781be,
+ /* e1 */ 0x000000, 0xe781b5, 0xe781bb, 0xe789a4,
+ /* e5 */ 0x000000, 0xe78abb, 0xe78abc, 0xe78b87,
+ /* e9 */ 0xe78ab9, 0xe78abe, 0xe78ab6, 0x000000,
+ /* ed */ 0x000000, 0xe78e98, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe79693, 0xe79a80,
+ /* f5 */ 0x000000, 0xe79a83, 0xe79b80, 0xe79b81,
+ /* f9 */ 0x000000, 0x000000, 0xe79fb4, 0xe79fb5,
+ /* fd */ 0x000000, 0xe7ab8c,
+
+ /*** Four byte table, leaf: 8eaea7xx - offset 0x051ec ***/
+
+ /* a1 */ 0xe7ab8d, 0xe7b3ba, 0xe8829f, 0xe88291,
+ /* a5 */ 0xe88297, 0xe88294, 0x000000, 0xe88a86,
+ /* a9 */ 0xe88a8c, 0x000000, 0xe88a95, 0x000000,
+ /* ad */ 0xe899ac, 0x000000, 0xe8beb5, 0xe8bebe,
+ /* b1 */ 0xe8bf87, 0x000000, 0xe8bf81, 0xe982a9,
+ /* b5 */ 0xe982a4, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0xe982a8, 0xe998a7, 0xe998a6, 0xe998ab,
+ /* bd */ 0xe998b3, 0xe998b4, 0xe998a9, 0xe4b8bd,
+ /* c1 */ 0x000000, 0xe4ba9d, 0xe4be93, 0xe4be8a,
+ /* c5 */ 0x000000, 0x000000, 0xe4bdad, 0xe4be8e,
+ /* c9 */ 0xe4bea0, 0xe4bea2, 0xe4bea1, 0xe4be9f,
+ /* cd */ 0xe4bea3, 0x000000, 0xe4bdb2, 0x000000,
+ /* d1 */ 0xe4be8c, 0xe58596, 0x000000, 0x000000,
+ /* d5 */ 0xe58690, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0xe587ad, 0xe587be, 0xe588af, 0x000000,
+ /* dd */ 0xe588bc, 0xe588b4, 0xe588b9, 0xe58ab9,
+ /* e1 */ 0xe58ab5, 0xe58abf, 0xe58d95, 0x000000,
+ /* e5 */ 0xe58db6, 0xe58dba, 0xe58e93, 0x000000,
+ /* e9 */ 0xe58f81, 0xe58f82, 0xe58f95, 0xe59285,
+ /* ed */ 0x000000, 0xe5919f, 0xe59293, 0xe59289,
+ /* f1 */ 0xe591b9, 0xe9bbbe, 0xe5928f, 0xe591a9,
+ /* f5 */ 0xe591ad, 0x000000, 0xe59294, 0xe591aa,
+ /* f9 */ 0xe5928a, 0x000000, 0xe59bbd, 0xe59bbb,
+ /* fd */ 0xe59bb8, 0x000000,
+
+ /*** Four byte table, leaf: 8eaea8xx - offset 0x0524a ***/
+
+ /* a1 */ 0xe59bbc, 0xe59bb6, 0xe59da5, 0xe59e81,
+ /* a5 */ 0xe59da3, 0xe59da7, 0x000000, 0xe59dae,
+ /* a9 */ 0xe59db8, 0xe59dbf, 0x000000, 0x000000,
+ /* ad */ 0xe5a3b3, 0xe5a58b, 0xe5a58c, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0xe5a6ad, 0x000000,
+ /* b5 */ 0xe5a784, 0x000000, 0xe5a782, 0xe5a6b0,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0xe5a6bf, 0x000000, 0xe5a789, 0xe5a6b8,
+ /* c1 */ 0xe5a6ac, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0xe5a6b7, 0xe5a797, 0x000000, 0xe5ada0,
+ /* c9 */ 0x000000, 0xe5ae96, 0xe5ae9e, 0xe5ae94,
+ /* cd */ 0xe5ae9f, 0xe5ae9d, 0x000000, 0xe5b080,
+ /* d1 */ 0xe5b099, 0x000000, 0x000000, 0xe5b189,
+ /* d5 */ 0xe5b18a, 0x000000, 0xe5b2bb, 0xe5b381,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0xe5b2b9,
+ /* dd */ 0xe5b29e, 0xe5b2b4, 0xe5b2ba, 0xe5b7b6,
+ /* e1 */ 0xe5b893, 0xe5b892, 0xe5b9b7, 0x000000,
+ /* e5 */ 0xe5ba98, 0x000000, 0xe5ba99, 0xe5ba9d,
+ /* e9 */ 0xe5bbb8, 0x000000, 0xe5bbb9, 0x000000,
+ /* ed */ 0xe5bc86, 0xe5bca1, 0x000000, 0xe5bca5,
+ /* f1 */ 0xe5bd95, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0xe5be84, 0xe5be83, 0xe680b0, 0xe68087,
+ /* f9 */ 0x000000, 0xe680b6, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0xe5bfa9,
+
+ /*** Four byte table, leaf: 8eaea9xx - offset 0x052a8 ***/
+
+ /* a1 */ 0xe680bd, 0xe68088, 0x000000, 0x000000,
+ /* a5 */ 0xe68aba, 0xe68ab2, 0x000000, 0xe68ab7,
+ /* a9 */ 0xe68ba4, 0xe68aa7, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0xe68b95, 0xe68ba1, 0xe68b9d,
+ /* b1 */ 0xe68aa6, 0xe68b81, 0xe68b85, 0xe68b80,
+ /* b5 */ 0xe68b9f, 0xe68ba0, 0xe68b9e, 0x000000,
+ /* b9 */ 0xe69689, 0x000000, 0xe696a6, 0xe696ba,
+ /* bd */ 0x000000, 0xe697bf, 0x000000, 0xe69897,
+ /* c1 */ 0xe69898, 0xe69881, 0xe697be, 0x000000,
+ /* c5 */ 0xe69c8c, 0x000000, 0xe69dab, 0xe69e96,
+ /* c9 */ 0xe69e82, 0xe69e8a, 0x000000, 0xe69ea3,
+ /* cd */ 0x000000, 0xe69ea2, 0xe69e8f, 0x000000,
+ /* d1 */ 0xe69fb9, 0xe69e80, 0xe6aca6, 0xe6aca7,
+ /* d5 */ 0xe6ada8, 0xe6ada9, 0x000000, 0xe6ae81,
+ /* d9 */ 0xe6aeb4, 0xe6af91, 0x000000, 0x000000,
+ /* dd */ 0xe6b09c, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0xe6b297, 0xe6b1ac,
+ /* e5 */ 0xe6b39f, 0x000000, 0xe6b3aa, 0x000000,
+ /* e9 */ 0xe6b3a4, 0xe6b398, 0xe6b2b2, 0xe6b38e,
+ /* ed */ 0xe6b388, 0x000000, 0xe7828b, 0xe78288,
+ /* f1 */ 0xe78290, 0xe7828f, 0x000000, 0xe78287,
+ /* f5 */ 0xe78289, 0xe7828d, 0xe78281, 0x000000,
+ /* f9 */ 0xe7828c, 0x000000, 0x000000, 0xe78980,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaeaaxx - offset 0x05306 ***/
+
+ /* a1 */ 0xe789a5, 0xe789a6, 0xe789a8, 0x000000,
+ /* a5 */ 0x000000, 0xe78b8d, 0xe78b93, 0xe78b9b,
+ /* a9 */ 0x000000, 0xe78b8f, 0xe78ea7, 0xe78ea3,
+ /* ad */ 0xe78e9e, 0x000000, 0xe78eaf, 0x000000,
+ /* b1 */ 0x000000, 0xe78eaa, 0xe78e9c, 0x000000,
+ /* b5 */ 0xe79582, 0xe79584, 0xe794bb, 0xe79581,
+ /* b9 */ 0x000000, 0xe7969b, 0xe7969e, 0x000000,
+ /* bd */ 0xe7a784, 0xe7a783, 0xe7a786, 0x000000,
+ /* c1 */ 0x000000, 0xe7a787, 0x000000, 0xe7a78a,
+ /* c5 */ 0x000000, 0x000000, 0xe7ab8f, 0xe7b1b6,
+ /* c9 */ 0xe7b1b4, 0xe7b3bf, 0xe7b3bc, 0x000000,
+ /* cd */ 0x000000, 0xe7bd99, 0xe882a8, 0x000000,
+ /* d1 */ 0x000000, 0xe882b0, 0x000000, 0xe882b3,
+ /* d5 */ 0x000000, 0xe882a4, 0xe882b6, 0xe882a7,
+ /* d9 */ 0xe882ac, 0x000000, 0xe882a6, 0xe58da7,
+ /* dd */ 0xe8888e, 0xe88b84, 0xe88cbe, 0xe88a9c,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0xe88aaa, 0x000000, 0xe88b89,
+ /* e9 */ 0x000000, 0x000000, 0xe88aa6, 0xe88ab2,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe8bf8c,
+ /* f1 */ 0xe8bf99, 0xe8bf8a, 0xe8bf98, 0xe8bf8f,
+ /* f5 */ 0xe982b7, 0x000000, 0xe982ad, 0xe982b9,
+ /* f9 */ 0xe998b7, 0x000000, 0xe99981, 0xe998be,
+ /* fd */ 0xe99ab6, 0xe99d91,
+
+ /*** Four byte table, leaf: 8eaeabxx - offset 0x05364 ***/
+
+ /* a1 */ 0xe99da3, 0xe4b997, 0xe4b9b9, 0xe4bab2,
+ /* a5 */ 0xe4bab0, 0xe4baaf, 0xe4bab1, 0xe4bf92,
+ /* a9 */ 0xe4bf95, 0x000000, 0xe4bebe, 0xe4beb8,
+ /* ad */ 0xe4beb0, 0xe4beb1, 0xe4bf88, 0x000000,
+ /* b1 */ 0x000000, 0xe4bf86, 0xe4bf8c, 0xe4bfa5,
+ /* b5 */ 0xe4bfa3, 0xe4beb4, 0xe585aa, 0x000000,
+ /* b9 */ 0xe5869f, 0x000000, 0xe58781, 0x000000,
+ /* bd */ 0xe58782, 0xe58783, 0xe58985, 0xe58988,
+ /* c1 */ 0x000000, 0x000000, 0xe5898f, 0x000000,
+ /* c5 */ 0x000000, 0xe58b85, 0xe58b8a, 0xe58b84,
+ /* c9 */ 0xe58ca7, 0xe58d98, 0xe58dbd, 0x000000,
+ /* cd */ 0xe58f9d, 0xe58f9c, 0xe58f9a, 0xe58f99,
+ /* d1 */ 0xe592b9, 0x000000, 0xe59390, 0xe592b4,
+ /* d5 */ 0xe5938a, 0x000000, 0xe592a3, 0xe5939a,
+ /* d9 */ 0xe592a4, 0x000000, 0xe592b2, 0xe5929e,
+ /* dd */ 0xe5929f, 0xe592b5, 0x000000, 0x000000,
+ /* e1 */ 0xe5938d, 0x000000, 0xe5938c, 0x000000,
+ /* e5 */ 0xe59c80, 0xe59eac, 0xe59e91, 0xe59e8e,
+ /* e9 */ 0xe59e8d, 0xe59e92, 0xe59ea1, 0xe59e90,
+ /* ed */ 0xe59ea6, 0xe59ea8, 0x000000, 0xe59e9c,
+ /* f1 */ 0xe59e96, 0xe59ea7, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0xe5a3b5, 0x000000,
+ /* f9 */ 0xe5a489, 0xe5a488, 0x000000, 0xe5a592,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaeacxx - offset 0x053c2 ***/
+
+ /* a1 */ 0xe5a79f, 0x000000, 0xe5a7ab, 0xe5a7af,
+ /* a5 */ 0xe5a7b0, 0xe5a795, 0xe5a88d, 0xe5a884,
+ /* a9 */ 0xe5a7b9, 0xe5a882, 0xe5a7b8, 0xe5a7a2,
+ /* ad */ 0xe5a799, 0xe5a7a7, 0xe5adaa, 0x000000,
+ /* b1 */ 0x000000, 0xe5aeab, 0x000000, 0xe5b09b,
+ /* b5 */ 0xe5b0af, 0x000000, 0xe698bc, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0xe5b391, 0xe5b39c,
+ /* bd */ 0xe5b3a6, 0xe5b3a1, 0xe5b38d, 0x000000,
+ /* c1 */ 0xe5b3a2, 0xe5b39d, 0xe5b3a5, 0xe5b7bb,
+ /* c5 */ 0xe5b7ba, 0xe5b89e, 0x000000, 0xe5baa1,
+ /* c9 */ 0x000000, 0x000000, 0xe5bbbc, 0xe5bbbb,
+ /* cd */ 0xe5bcaf, 0x000000, 0x000000, 0xe5bda6,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0xe6819c,
+ /* d5 */ 0x000000, 0xe6818e, 0xe68191, 0x000000,
+ /* d9 */ 0x000000, 0xe680a3, 0xe680b1, 0xe681bc,
+ /* dd */ 0xe68192, 0x000000, 0xe681a0, 0xe6818a,
+ /* e1 */ 0xe681a1, 0x000000, 0xe68898, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0xe68c9f, 0xe68c97,
+ /* ed */ 0xe68baa, 0xe68ca1, 0xe68c84, 0xe68c85,
+ /* f1 */ 0x000000, 0xe694b1, 0xe69584, 0xe69580,
+ /* f5 */ 0x000000, 0xe69582, 0xe696be, 0x000000,
+ /* f9 */ 0xe698a9, 0xe6989b, 0x000000, 0xe698a3,
+ /* fd */ 0xe698ac, 0xe6989a,
+
+ /*** Four byte table, leaf: 8eaeadxx - offset 0x05420 ***/
+
+ /* a1 */ 0xe698b0, 0xe698bb, 0xe6989e, 0xe698b7,
+ /* a5 */ 0xe698b8, 0x000000, 0xe69c8e, 0x000000,
+ /* a9 */ 0x000000, 0xe69fa8, 0xe69f96, 0x000000,
+ /* ad */ 0xe69f87, 0xe69ebc, 0xe6a192, 0xe69ebf,
+ /* b1 */ 0xe69f95, 0xe69fbe, 0xe88da3, 0xe69fbb,
+ /* b5 */ 0x000000, 0xe69eb1, 0xe6a081, 0xe6a085,
+ /* b9 */ 0xe6a080, 0xe69f97, 0x000000, 0xe6acaa,
+ /* bd */ 0xe6adab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0xe6afa1, 0x000000, 0x000000,
+ /* c5 */ 0xe6b4a3, 0xe6b3bf, 0xe6b494, 0xe6b485,
+ /* c9 */ 0xe6b493, 0xe6b486, 0xe6b4a1, 0x000000,
+ /* cd */ 0xe6b495, 0xe6b2af, 0xe6b3b4, 0xe6b482,
+ /* d1 */ 0xe6b585, 0x000000, 0xe6b4a6, 0x000000,
+ /* d5 */ 0xe6b584, 0x000000, 0xe6b4a4, 0xe782a5,
+ /* d9 */ 0x000000, 0xe782a3, 0x000000, 0xe782a2,
+ /* dd */ 0xe782bb, 0xe782a0, 0xe782aa, 0x000000,
+ /* e1 */ 0x000000, 0xe782a8, 0xe782b6, 0xe782b2,
+ /* e5 */ 0xe782a7, 0x000000, 0x000000, 0xe782b9,
+ /* e9 */ 0xe788ae, 0x000000, 0xe788bc, 0x000000,
+ /* ed */ 0xe789ad, 0x000000, 0x000000, 0xe78ba7,
+ /* f1 */ 0xe78bad, 0x000000, 0xe78bac, 0xe78ba5,
+ /* f5 */ 0xe78ba2, 0x000000, 0xe78f84, 0xe78ebd,
+ /* f9 */ 0xe78f8f, 0xe78f89, 0xe78f81, 0xe78f90,
+ /* fd */ 0x000000, 0xe78f8e,
+
+ /*** Four byte table, leaf: 8eaeaexx - offset 0x0547e ***/
+
+ /* a1 */ 0xe793ad, 0xe793ab, 0x000000, 0xe793af,
+ /* a5 */ 0xe79589, 0xe79590, 0xe79586, 0xe7958a,
+ /* a9 */ 0x000000, 0xe7958d, 0xe796a6, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0xe796a8, 0x000000,
+ /* b1 */ 0x000000, 0xe79b87, 0xe79bbf, 0x000000,
+ /* b5 */ 0xe79bbd, 0xe79fa6, 0xe7a08a, 0x000000,
+ /* b9 */ 0xe7a084, 0xe7a08b, 0xe7a087, 0x000000,
+ /* bd */ 0xe7a095, 0xe7a088, 0x000000, 0xe7a793,
+ /* c1 */ 0xe7a794, 0xe7a790, 0xe7a797, 0xe7a9bc,
+ /* c5 */ 0x000000, 0x000000, 0xe7a9bd, 0xe7aa83,
+ /* c9 */ 0xe7aa82, 0x000000, 0xe7ab94, 0xe7ab95,
+ /* cd */ 0xe7ab93, 0xe7ab90, 0xe7ab92, 0xe7abbe,
+ /* d1 */ 0xe7abbc, 0xe7b1b7, 0xe7b1bc, 0xe7b1bb,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0xe7be8f, 0xe88393, 0x000000, 0xe8838b,
+ /* e1 */ 0xe88392, 0x000000, 0xe88489, 0xe883a2,
+ /* e5 */ 0xe8839f, 0xe88386, 0x000000, 0xe888a4,
+ /* e9 */ 0xe88bb7, 0xe88b98, 0xe88b9d, 0x000000,
+ /* ed */ 0x000000, 0xe88bb8, 0xe88bbc, 0x000000,
+ /* f1 */ 0x000000, 0xe88ba9, 0x000000, 0xe88bae,
+ /* f5 */ 0x000000, 0xe88b90, 0xe88c8e, 0xe88ba2,
+ /* f9 */ 0xe88c8b, 0xe88bbd, 0xe585b9, 0xe899b6,
+ /* fd */ 0x000000, 0xe899b8,
+
+ /*** Four byte table, leaf: 8eaeafxx - offset 0x054dc ***/
+
+ /* a1 */ 0x000000, 0x000000, 0xe899b5, 0xe899bd,
+ /* a5 */ 0x000000, 0xe8a182, 0xe8a1a6, 0x000000,
+ /* a9 */ 0xe8a68c, 0xe8a885, 0x000000, 0xe8a886,
+ /* ad */ 0x000000, 0xe8b29f, 0x000000, 0xe8bfb1,
+ /* b1 */ 0xe8bfa7, 0xe8bfa9, 0xe8bfaf, 0xe98382,
+ /* b5 */ 0xe982bc, 0x000000, 0xe98386, 0xe98380,
+ /* b9 */ 0x000000, 0x000000, 0xe9838d, 0xe98389,
+ /* bd */ 0x000000, 0xe98384, 0x000000, 0xe99681,
+ /* c1 */ 0x000000, 0xe9b3ac, 0xe580b2, 0xe4bfb9,
+ /* c5 */ 0xe5809d, 0xe4bfbf, 0xe58084, 0xe4bfb0,
+ /* c9 */ 0xe58083, 0x000000, 0xe58082, 0xe4bfbc,
+ /* cd */ 0xe4bfb2, 0xe580a4, 0xe58088, 0xe580b6,
+ /* d1 */ 0xe580ae, 0x000000, 0xe58090, 0xe580b8,
+ /* d5 */ 0xe580b9, 0xe4bfbd, 0xe58196, 0xe4bfbb,
+ /* d9 */ 0xe586a3, 0xe586a6, 0xe586a1, 0x000000,
+ /* dd */ 0x000000, 0xe58787, 0xe58789, 0xe589a0,
+ /* e1 */ 0xe589a4, 0xe58999, 0xe589a5, 0xe589a7,
+ /* e5 */ 0xe58997, 0xe589a3, 0x000000, 0xe58993,
+ /* e9 */ 0x000000, 0xe58b8f, 0x000000, 0xe58b8e,
+ /* ed */ 0xe58b90, 0xe58b91, 0xe58b8c, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe5948d, 0xe593b4,
+ /* f5 */ 0x000000, 0xe59493, 0xe593af, 0xe593b5,
+ /* f9 */ 0xe593b9, 0xe59482, 0xe59480, 0x000000,
+ /* fd */ 0x000000, 0xe59498,
+
+ /*** Four byte table, leaf: 8eaeb0xx - offset 0x0553a ***/
+
+ /* a1 */ 0xe593b0, 0xe593b6, 0x000000, 0x000000,
+ /* a5 */ 0xe59499, 0x000000, 0xe59c85, 0xe59f89,
+ /* a9 */ 0x000000, 0xe59eb7, 0xe59f8d, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0xe59ebe, 0xe59ebb,
+ /* b1 */ 0x000000, 0xe59f9b, 0xe59f88, 0xe59f84,
+ /* b5 */ 0xe59f85, 0xe59f91, 0xe59f8a, 0xe59f80,
+ /* b9 */ 0x000000, 0x000000, 0xe5a8a1, 0xe5a8aa,
+ /* bd */ 0x000000, 0xe5a89d, 0x000000, 0xe5a88b,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0xe5a8a2, 0x000000, 0x000000, 0xe5a8a4,
+ /* c9 */ 0x000000, 0xe5a894, 0xe5a8b1, 0x000000,
+ /* cd */ 0xe5a8af, 0xe5a89a, 0xe5a892, 0x000000,
+ /* d1 */ 0x000000, 0xe5a8a6, 0x000000, 0x000000,
+ /* d5 */ 0xe5aebc, 0xe5aebb, 0xe5aeb7, 0xe5b085,
+ /* d9 */ 0xe5b086, 0xe5b192, 0xe5b193, 0x000000,
+ /* dd */ 0x000000, 0xe5b3ba, 0xe5b3ab, 0x000000,
+ /* e1 */ 0xe5b3b3, 0xe5b3b5, 0xe5b3a9, 0xe5b3af,
+ /* e5 */ 0x000000, 0xe5b8aa, 0xe5b8b0, 0xe5b8ae,
+ /* e9 */ 0xe5b8ac, 0xe5b8af, 0xe5baaf, 0xe5baa9,
+ /* ed */ 0x000000, 0xe5bbbd, 0xe5bcb2, 0xe5be8e,
+ /* f1 */ 0xe5be93, 0xe5be8f, 0xe6818f, 0xe68299,
+ /* f5 */ 0x000000, 0xe681be, 0x000000, 0xe681b4,
+ /* f9 */ 0xe6818b, 0xe681b3, 0xe681b5, 0x000000,
+ /* fd */ 0x000000, 0xe68196,
+
+ /*** Four byte table, leaf: 8eaeb1xx - offset 0x05598 ***/
+
+ /* a1 */ 0xe682a9, 0xe6828b, 0xe682a6, 0x000000,
+ /* a5 */ 0xe68293, 0xe682ae, 0xe6829e, 0xe682a7,
+ /* a9 */ 0xe68985, 0x000000, 0x000000, 0xe68cae,
+ /* ad */ 0x000000, 0xe68d92, 0xe68cb0, 0xe68d9b,
+ /* b1 */ 0x000000, 0xe68c99, 0xe68c9b, 0x000000,
+ /* b5 */ 0xe68cb1, 0xe68d9d, 0xe68cb7, 0xe68cb5,
+ /* b9 */ 0xe68d93, 0x000000, 0xe68d9c, 0xe68cbf,
+ /* bd */ 0xe6958b, 0x000000, 0x000000, 0xe6968b,
+ /* c1 */ 0x000000, 0xe6969a, 0xe69990, 0xe69986,
+ /* c5 */ 0xe6998e, 0xe69980, 0x000000, 0xe6998b,
+ /* c9 */ 0xe69988, 0x000000, 0xe699a0, 0xe69984,
+ /* cd */ 0xe6998d, 0x000000, 0xe6a0b7, 0xe6a0a4,
+ /* d1 */ 0x000000, 0x000000, 0xe6a09b, 0xe6a0b6,
+ /* d5 */ 0x000000, 0xe6a0ac, 0xe6a099, 0xe6a196,
+ /* d9 */ 0xe6a187, 0xe6a0be, 0xe6a09e, 0x000000,
+ /* dd */ 0xe6a095, 0xe6a0a2, 0xe6a0a7, 0xe6a199,
+ /* e1 */ 0xe6a198, 0xe6a195, 0xe6a0b0, 0xe6a0a3,
+ /* e5 */ 0xe6acae, 0xe6acab, 0xe6acb0, 0xe6adac,
+ /* e9 */ 0x000000, 0xe6ae8b, 0x000000, 0xe6afa9,
+ /* ed */ 0xe6afaa, 0xe6afa5, 0xe6b5ab, 0x000000,
+ /* f1 */ 0x000000, 0xe6b5b3, 0xe6b597, 0x000000,
+ /* f5 */ 0x000000, 0xe6b59d, 0xe6b596, 0xe6b68f,
+ /* f9 */ 0xe6b59b, 0xe6b49c, 0xe6b69a, 0xe6b69b,
+ /* fd */ 0xe6b699, 0x000000,
+
+ /*** Four byte table, leaf: 8eaeb2xx - offset 0x055f6 ***/
+
+ /* a1 */ 0xe6b681, 0xe6b5b1, 0x000000, 0x000000,
+ /* a5 */ 0xe6b5b2, 0xe6b59c, 0xe6b696, 0xe78384,
+ /* a9 */ 0xe7839b, 0xe7838c, 0xe78390, 0xe783a3,
+ /* ad */ 0xe7839f, 0x000000, 0xe78396, 0xe783ae,
+ /* b1 */ 0xe78395, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0xe789ba, 0x000000, 0xe78bb5,
+ /* b9 */ 0xe78c82, 0x000000, 0x000000, 0xe78fa2,
+ /* bd */ 0xe78fac, 0xe78f95, 0xe78fb9, 0xe78f9f,
+ /* c1 */ 0xe78fa6, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0xe78fa4, 0xe78fa1, 0xe793b3,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0xe79596, 0xe79595, 0xe79598, 0xe79597,
+ /* d1 */ 0xe7959e, 0xe79783, 0x000000, 0x000000,
+ /* d5 */ 0xe796b4, 0x000000, 0xe796b1, 0x000000,
+ /* d9 */ 0x000000, 0xe79b8b, 0xe79b8c, 0xe79caa,
+ /* dd */ 0x000000, 0xe79c96, 0xe79c8f, 0x000000,
+ /* e1 */ 0x000000, 0xe79cbf, 0xe79cab, 0xe79c8e,
+ /* e5 */ 0xe79ca4, 0x000000, 0xe79ca1, 0xe79c98,
+ /* e9 */ 0xe79f9d, 0x000000, 0x000000, 0xe7a0a4,
+ /* ed */ 0xe7a0b6, 0x000000, 0xe7a598, 0xe7a599,
+ /* f1 */ 0x000000, 0xe7a5a2, 0xe7a79a, 0xe7a799,
+ /* f5 */ 0x000000, 0xe7a7a1, 0xe7a7a5, 0xe7a7a8,
+ /* f9 */ 0xe7a79b, 0x000000, 0xe7a7a2, 0xe7a7b0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaeb3xx - offset 0x05652 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0xe7ab9a, 0xe7ab9d,
+ /* a5 */ 0x000000, 0xe7ab9b, 0xe7ab9c, 0x000000,
+ /* a9 */ 0x000000, 0xe7ac8d, 0xe7ac8b, 0xe7ac94,
+ /* ad */ 0xe7b28e, 0xe7b286, 0x000000, 0xe7b287,
+ /* b1 */ 0xe7b283, 0xe7b28b, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0xe7b4a4, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0xe7b4a5, 0xe7bda2,
+ /* bd */ 0xe7be93, 0xe7be99, 0xe7be97, 0x000000,
+ /* c1 */ 0x000000, 0xe7bf84, 0xe7bf86, 0xe8808a,
+ /* c5 */ 0x000000, 0x000000, 0xe88180, 0xe880bc,
+ /* c9 */ 0xe880bb, 0xe883b6, 0xe883bf, 0xe883ae,
+ /* cd */ 0xe88484, 0xe88483, 0xe88487, 0x000000,
+ /* d1 */ 0x000000, 0xe883b7, 0x000000, 0x000000,
+ /* d5 */ 0xe888ad, 0x000000, 0xe888a7, 0xe888a9,
+ /* d9 */ 0xe88c9f, 0xe88d97, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0xe88ca1, 0x000000,
+ /* e1 */ 0x000000, 0xe88c98, 0xe88d98, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0xe89a84, 0xe89a9f, 0xe89a9b, 0xe89a89,
+ /* ed */ 0xe89aa6, 0xe89a92, 0xe89a8f, 0xe89aa0,
+ /* f1 */ 0xe8a18f, 0xe8a1b8, 0xe8a1ba, 0xe8a1ae,
+ /* f5 */ 0xe8a1bb, 0xe8a284, 0xe8a1b3, 0x000000,
+ /* f9 */ 0x000000, 0xe8a88d, 0xe8a88b, 0xe8a899,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaeb4xx - offset 0x056ae ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0xe8bfb9, 0xe98089, 0xe98088, 0x000000,
+ /* a9 */ 0xe9839e, 0xe98591, 0x000000, 0x000000,
+ /* ad */ 0xe9879b, 0xe9879f, 0xe9879e, 0xe98796,
+ /* b1 */ 0xe987a0, 0xe99685, 0xe999a0, 0xe99999,
+ /* b5 */ 0x000000, 0xe99996, 0x000000, 0x000000,
+ /* b9 */ 0xe99abd, 0x000000, 0x000000, 0xe58182,
+ /* bd */ 0xe58199, 0x000000, 0xe58184, 0xe581a6,
+ /* c1 */ 0xe58192, 0xe58194, 0xe581b1, 0xe58190,
+ /* c5 */ 0xe581bb, 0xe581bc, 0xe58198, 0x000000,
+ /* c9 */ 0x000000, 0xe581b9, 0xe581ac, 0xe581b8,
+ /* cd */ 0xe586a8, 0xe58791, 0xe5878f, 0xe589a8,
+ /* d1 */ 0xe589b6, 0xe58b94, 0x000000, 0xe58ea0,
+ /* d5 */ 0xe58f84, 0x000000, 0xe59598, 0xe5958c,
+ /* d9 */ 0xe595a8, 0x000000, 0xe59589, 0x000000,
+ /* dd */ 0x000000, 0xe5959d, 0xe594a9, 0x000000,
+ /* e1 */ 0xe59594, 0xe59593, 0x000000, 0xe5959a,
+ /* e5 */ 0x000000, 0xe594ba, 0xe594bf, 0xe594ab,
+ /* e9 */ 0xe59faa, 0x000000, 0xe59faf, 0x000000,
+ /* ed */ 0x000000, 0xe59f9d, 0xe59fbe, 0x000000,
+ /* f1 */ 0xe59f9e, 0xe59fa6, 0x000000, 0xe59fa8,
+ /* f5 */ 0xe59fbf, 0xe5a083, 0xe5a3b7, 0xe6a2a6,
+ /* f9 */ 0xe5a49f, 0x000000, 0xe5a59b, 0xe5a59d,
+ /* fd */ 0xe5a59e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaeb5xx - offset 0x0570b ***/
+
+ /* a1 */ 0x000000, 0xe5a8ab, 0x000000, 0xe5a8bb,
+ /* a5 */ 0x000000, 0x000000, 0xe5a9a1, 0xe5a8ba,
+ /* a9 */ 0xe5a9ae, 0xe5a98b, 0xe5a9ab, 0x000000,
+ /* ad */ 0x000000, 0xe5a985, 0xe5a98e, 0xe5a9a8,
+ /* b1 */ 0xe5a8bd, 0xe5a9b1, 0xe5a8bf, 0xe5a9af,
+ /* b5 */ 0xe5a9b5, 0x000000, 0xe5a9b3, 0xe5a8ac,
+ /* b9 */ 0xe5a999, 0xe5a994, 0xe5a98f, 0xe5a9a3,
+ /* bd */ 0x000000, 0x000000, 0xe5af88, 0x000000,
+ /* c1 */ 0xe5af83, 0x000000, 0xe5b19b, 0xe5b1a1,
+ /* c5 */ 0x000000, 0xe5b4a1, 0xe5b48a, 0xe5b489,
+ /* c9 */ 0x000000, 0xe5b4ac, 0xe5b488, 0x000000,
+ /* cd */ 0x000000, 0xe5b4aa, 0xe5b495, 0x000000,
+ /* d1 */ 0xe5b490, 0xe5b493, 0x000000, 0xe5b4af,
+ /* d5 */ 0xe5b498, 0x000000, 0xe5b7a3, 0xe5b8b9,
+ /* d9 */ 0xe5b8b5, 0xe5b8ba, 0xe5b8b2, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0xe5babb,
+ /* e1 */ 0xe5baba, 0xe5bcb4, 0xe5bcb9, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0xe68298,
+ /* e9 */ 0x000000, 0xe68390, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0xe68397, 0xe682aa, 0x000000,
+ /* f1 */ 0xe682a1, 0xe682a4, 0x000000, 0xe683ae,
+ /* f5 */ 0x000000, 0xe683a7, 0x000000, 0x000000,
+ /* f9 */ 0xe6839e, 0x000000, 0x000000, 0xe68dbe,
+ /* fd */ 0xe68e8b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaeb6xx - offset 0x05768 ***/
+
+ /* a1 */ 0x000000, 0xe68db9, 0xe68e86, 0xe68e93,
+ /* a5 */ 0x000000, 0xe68db3, 0xe68daa, 0x000000,
+ /* a9 */ 0xe68dac, 0x000000, 0xe68dbf, 0x000000,
+ /* ad */ 0xe68eb2, 0xe68eba, 0x000000, 0x000000,
+ /* b1 */ 0xe68da6, 0xe68db4, 0x000000, 0xe6959a,
+ /* b5 */ 0x000000, 0xe6958e, 0xe6958d, 0xe6968d,
+ /* b9 */ 0xe6968e, 0xe696ad, 0x000000, 0xe69787,
+ /* bd */ 0xe6978a, 0x000000, 0xe69789, 0x000000,
+ /* c1 */ 0xe697a3, 0xe69997, 0x000000, 0xe699a3,
+ /* c5 */ 0xe699a7, 0xe69c9a, 0xe69c99, 0xe69c96,
+ /* c9 */ 0x000000, 0x000000, 0xe6a29e, 0xe6a2b6,
+ /* cd */ 0xe6a298, 0xe6a1b3, 0x000000, 0xe6a29a,
+ /* d1 */ 0xe6a28e, 0xe6a2b7, 0xe6a39b, 0xe6a2a5,
+ /* d5 */ 0xe6a1ac, 0xe6a381, 0xe6a284, 0x000000,
+ /* d9 */ 0x000000, 0xe6a295, 0xe6a1ba, 0xe6a299,
+ /* dd */ 0x000000, 0xe6a2b8, 0xe6a2b9, 0xe6a1b0,
+ /* e1 */ 0x000000, 0xe6acb5, 0x000000, 0xe6ae90,
+ /* e5 */ 0xe6aebb, 0xe6afad, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0xe6b781, 0xe6b783, 0xe6b78e,
+ /* ed */ 0x000000, 0x000000, 0xe6b6ad, 0xe6b884,
+ /* f1 */ 0x000000, 0xe6b6b9, 0x000000, 0xe6b7a7,
+ /* f5 */ 0x000000, 0xe6b888, 0xe6b886, 0x000000,
+ /* f9 */ 0xe6b88a, 0xe6b6b0, 0x000000, 0xe6b7b8,
+ /* fd */ 0xe6b88c, 0x000000,
+
+ /*** Four byte table, leaf: 8eaeb7xx - offset 0x057c6 ***/
+
+ /* a1 */ 0xe6b6b1, 0x000000, 0xe6b882, 0xe6b887,
+ /* a5 */ 0xe6b889, 0xe6b881, 0xe6b897, 0xe6b7bf,
+ /* a9 */ 0xe6b892, 0x000000, 0x000000, 0xe78483,
+ /* ad */ 0xe78487, 0xe78481, 0xe783b5, 0xe783b1,
+ /* b1 */ 0xe78488, 0xe783b2, 0xe7848f, 0x000000,
+ /* b5 */ 0xe783be, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0xe78c9a, 0xe78c90, 0xe78c8e, 0xe79082,
+ /* bd */ 0xe78fb3, 0x000000, 0x000000, 0xe78fbb,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe7949b,
+ /* c5 */ 0xe794a3, 0xe795a1, 0xe795a8, 0x000000,
+ /* c9 */ 0xe795a7, 0xe79793, 0x000000, 0x000000,
+ /* cd */ 0xe79a90, 0x000000, 0x000000, 0xe79b95,
+ /* d1 */ 0xe79b97, 0xe79b96, 0xe79cb0, 0x000000,
+ /* d5 */ 0xe79ca6, 0x000000, 0xe79d80, 0x000000,
+ /* d9 */ 0xe79c9e, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0xe7a187, 0x000000, 0xe7a18b, 0xe7a191,
+ /* e1 */ 0xe7a18f, 0xe7a182, 0xe7a186, 0x000000,
+ /* e5 */ 0xe7a5ae, 0xe7a5ac, 0xe7a7b2, 0x000000,
+ /* e9 */ 0xe7a7b1, 0xe7a7b5, 0xe7a7b3, 0xe7a7b9,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe7aa9a,
+ /* f1 */ 0xe7aa93, 0xe7aa91, 0xe7aba1, 0x000000,
+ /* f5 */ 0x000000, 0xe7aca1, 0xe7ac9c, 0xe7ac96,
+ /* f9 */ 0xe7ac97, 0xe7acb6, 0xe7ac9f, 0x000000,
+ /* fd */ 0xe7b293, 0xe7b299,
+
+ /*** Four byte table, leaf: 8eaeb8xx - offset 0x05824 ***/
+
+ /* a1 */ 0xe7b29a, 0xe7b29c, 0x000000, 0xe7b589,
+ /* a5 */ 0x000000, 0xe7b4b4, 0xe7b4b7, 0x000000,
+ /* a9 */ 0xe7b4ad, 0x000000, 0xe7b58c, 0x000000,
+ /* ad */ 0x000000, 0xe7b588, 0x000000, 0x000000,
+ /* b1 */ 0xe7bcbb, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0xe88088, 0xe8809a, 0x000000,
+ /* b9 */ 0xe8809d, 0x000000, 0xe88189, 0xe88185,
+ /* bd */ 0xe88184, 0xe7b29b, 0x000000, 0x000000,
+ /* c1 */ 0xe884aa, 0xe884ae, 0x000000, 0x000000,
+ /* c5 */ 0xe884b1, 0x000000, 0xe8849a, 0xe884b4,
+ /* c9 */ 0xe88497, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0xe88c9d, 0xe88db1, 0xe88e84, 0xe88e80,
+ /* d1 */ 0xe88db2, 0xe88ea1, 0x000000, 0xe88db9,
+ /* d5 */ 0xe88e91, 0x000000, 0xe88e9f, 0xe88ead,
+ /* d9 */ 0x000000, 0x000000, 0xe88ca3, 0x000000,
+ /* dd */ 0xe88e85, 0xe88e9c, 0xe88eb7, 0xe89998,
+ /* e1 */ 0xe8999a, 0x000000, 0xe89997, 0xe89ab2,
+ /* e5 */ 0x000000, 0xe89aae, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0xe8a185, 0xe8a29c, 0xe8a294,
+ /* ed */ 0xe8a2a3, 0xe8a28f, 0xe8a2a5, 0xe8a2a9,
+ /* f1 */ 0xe8a2a6, 0xe8a28a, 0xe8a2a0, 0xe8a290,
+ /* f5 */ 0xe8a692, 0xe8a691, 0xe8a694, 0x000000,
+ /* f9 */ 0xe8a8a6, 0xe8a8b2, 0xe8a8a8, 0x000000,
+ /* fd */ 0x000000, 0xe8a89c,
+
+ /*** Four byte table, leaf: 8eaeb9xx - offset 0x05882 ***/
+
+ /* a1 */ 0x000000, 0xe8a8ab, 0xe8a8a0, 0x000000,
+ /* a5 */ 0xe8a8a9, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0xe8a8a1, 0xe8b0ba, 0x000000, 0xe8b19b,
+ /* ad */ 0xe8b198, 0xe8b1bc, 0x000000, 0xe8b2a6,
+ /* b1 */ 0xe8b2ae, 0xe8b2ad, 0xe8b5a5, 0x000000,
+ /* b5 */ 0xe8b5be, 0x000000, 0xe8b5bc, 0xe8b5bf,
+ /* b9 */ 0xe8b5ba, 0xe8b6bd, 0x000000, 0x000000,
+ /* bd */ 0xe8b780, 0xe8b6bb, 0xe8baad, 0xe8baaf,
+ /* c1 */ 0xe8bb96, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0xe8bb99, 0x000000,
+ /* c9 */ 0x000000, 0xe98092, 0xe9808e, 0xe980a5,
+ /* cd */ 0x000000, 0xe98093, 0xe983ae, 0x000000,
+ /* d1 */ 0xe982ab, 0xe983b7, 0x000000, 0xe98599,
+ /* d5 */ 0xe98594, 0xe987b2, 0xe987b0, 0xe987a5,
+ /* d9 */ 0xe987b6, 0x000000, 0x000000, 0xe99687,
+ /* dd */ 0x000000, 0xe9999a, 0x000000, 0x000000,
+ /* e1 */ 0xe999ae, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0xe999b9, 0x000000, 0xe9a3a1, 0xe9a3a6,
+ /* e9 */ 0x000000, 0xe9bb84, 0xe9bb92, 0xe4ba80,
+ /* ed */ 0x000000, 0xe4ba81, 0xe5828f, 0xe58297,
+ /* f1 */ 0xe58288, 0xe58289, 0x000000, 0x000000,
+ /* f5 */ 0xe58281, 0xe585a0, 0x000000, 0x000000,
+ /* f9 */ 0xe5b982, 0xe58793, 0x000000, 0x000000,
+ /* fd */ 0xe58792, 0xe58796,
+
+ /*** Four byte table, leaf: 8eaebaxx - offset 0x058e0 ***/
+
+ /* a1 */ 0xe589b3, 0x000000, 0xe589b0, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0xe58ea8, 0xe58ea6,
+ /* a9 */ 0xe58f85, 0xe59697, 0xe5979e, 0x000000,
+ /* ad */ 0x000000, 0xe59696, 0xe596b4, 0x000000,
+ /* b1 */ 0xe59685, 0x000000, 0xe5969b, 0xe596a0,
+ /* b5 */ 0x000000, 0xe59599, 0x000000, 0xe59686,
+ /* b9 */ 0x000000, 0x000000, 0xe596af, 0xe595ba,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0xe5969e,
+ /* c1 */ 0x000000, 0xe596a9, 0xe59c8f, 0xe59c8e,
+ /* c5 */ 0xe5a09a, 0x000000, 0xe5a09f, 0x000000,
+ /* c9 */ 0xe5a0bc, 0xe5a098, 0xe5a0be, 0xe5a0a6,
+ /* cd */ 0x000000, 0xe5a0ba, 0x000000, 0xe5a0a2,
+ /* d1 */ 0x000000, 0xe5a3bb, 0xe5a5a3, 0xe5a5a4,
+ /* d5 */ 0x000000, 0xe5aaa8, 0xe5aaa3, 0xe5aa82,
+ /* d9 */ 0xe5aa88, 0xe5aaa1, 0xe5aa85, 0xe5aa98,
+ /* dd */ 0x000000, 0xe5aa99, 0x000000, 0xe5aa89,
+ /* e1 */ 0xe5aa81, 0xe5aa96, 0xe5aa80, 0x000000,
+ /* e5 */ 0x000000, 0xe5aa91, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0xe5ab8f, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0xe5aa87, 0xe5aaa0, 0x000000,
+ /* f5 */ 0xe5a9b9, 0x000000, 0xe5aa86, 0xe5aaab,
+ /* f9 */ 0xe5aaaa, 0xe5aaa4, 0xe5aa8d, 0xe5a9be,
+ /* fd */ 0x000000, 0xe5af95,
+
+ /*** Four byte table, leaf: 8eaebbxx - offset 0x0593e ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0xe5b09e,
+ /* a5 */ 0xe5b19f, 0xe5b19e, 0xe5b584, 0xe5b4be,
+ /* a9 */ 0x000000, 0xe5b588, 0xe5b49c, 0x000000,
+ /* ad */ 0xe5b59b, 0xe5b58d, 0x000000, 0x000000,
+ /* b1 */ 0xe5b597, 0x000000, 0xe5b593, 0xe5b58f,
+ /* b5 */ 0x000000, 0xe5b4bb, 0xe5b586, 0x000000,
+ /* b9 */ 0x000000, 0xe5b986, 0xe5b987, 0x000000,
+ /* bd */ 0xe5b988, 0xe5bb80, 0xe5babd, 0xe5babf,
+ /* c1 */ 0x000000, 0xe5bc91, 0x000000, 0xe5bcbe,
+ /* c5 */ 0xe5bcbb, 0x000000, 0xe5bcba, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0xe5bea7, 0x000000,
+ /* cd */ 0xe683aa, 0x000000, 0xe68487, 0xe684a2,
+ /* d1 */ 0xe6848c, 0x000000, 0x000000, 0xe682b3,
+ /* d5 */ 0xe68396, 0xe68392, 0x000000, 0xe683a3,
+ /* d9 */ 0xe683a5, 0xe683a9, 0x000000, 0x000000,
+ /* dd */ 0xe68491, 0xe683bd, 0x000000, 0x000000,
+ /* e1 */ 0xe6849e, 0xe684a0, 0xe684a1, 0xe6889e,
+ /* e5 */ 0x000000, 0xe68fa2, 0xe68f9e, 0xe68fa6,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0xe68fb8, 0x000000, 0xe68fbe, 0xe68f81,
+ /* f1 */ 0xe68ebf, 0xe68fb7, 0xe68f91, 0xe6959f,
+ /* f5 */ 0xe695a0, 0xe695a1, 0x000000, 0x000000,
+ /* f9 */ 0xe69791, 0x000000, 0x000000, 0xe699bd,
+ /* fd */ 0xe699ab, 0xe699bf,
+
+ /*** Four byte table, leaf: 8eaebcxx - offset 0x0599c ***/
+
+ /* a1 */ 0x000000, 0x000000, 0xe699b3, 0xe69a81,
+ /* a5 */ 0xe699ad, 0xe699a9, 0x000000, 0x000000,
+ /* a9 */ 0xe69c9e, 0xe6a3ad, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0xe6a483, 0x000000,
+ /* b1 */ 0xe6a3be, 0xe6a3a5, 0xe6a49e, 0xe6a482,
+ /* b5 */ 0x000000, 0x000000, 0xe6a489, 0xe6a38a,
+ /* b9 */ 0xe6a480, 0x000000, 0xe6a481, 0xe6a498,
+ /* bd */ 0xe6a3a2, 0xe6a38f, 0x000000, 0xe6a4ae,
+ /* c1 */ 0xe6a385, 0xe6a3bf, 0x000000, 0xe6a49c,
+ /* c5 */ 0xe6a383, 0x000000, 0xe6adaf, 0x000000,
+ /* c9 */ 0xe6adae, 0x000000, 0xe6aebe, 0x000000,
+ /* cd */ 0xe6afb4, 0xe6b0ad, 0x000000, 0xe6b6b6,
+ /* d1 */ 0xe6b9b5, 0xe6b89e, 0x000000, 0xe6b898,
+ /* d5 */ 0x000000, 0xe6b988, 0x000000, 0xe6b98f,
+ /* d9 */ 0x000000, 0xe6b982, 0xe6b9aa, 0xe6b9b0,
+ /* dd */ 0xe6b7be, 0x000000, 0x000000, 0xe6b9ad,
+ /* e1 */ 0x000000, 0xe6b9bb, 0xe6b9be, 0xe6b999,
+ /* e5 */ 0x000000, 0xe6b997, 0x000000, 0xe6ba80,
+ /* e9 */ 0xe6b990, 0x000000, 0xe6b8a9, 0xe6b9b6,
+ /* ed */ 0xe6b8aa, 0xe6b98c, 0xe784aa, 0x000000,
+ /* f1 */ 0xe784b5, 0xe784ac, 0xe784b7, 0xe7849d,
+ /* f5 */ 0x000000, 0x000000, 0xe784b8, 0x000000,
+ /* f9 */ 0xe784b4, 0xe784ab, 0xe784b3, 0xe784a7,
+ /* fd */ 0xe784a4, 0x000000,
+
+ /*** Four byte table, leaf: 8eaebdxx - offset 0x059fa ***/
+
+ /* a1 */ 0xe784ad, 0xe788b2, 0xe78a83, 0xe78a82,
+ /* a5 */ 0xe78a87, 0xe78c86, 0xe78ca4, 0xe78cb8,
+ /* a9 */ 0xe78caa, 0xe78cac, 0xe78cab, 0x000000,
+ /* ad */ 0xe78caf, 0xe78ca8, 0xe79097, 0x000000,
+ /* b1 */ 0x000000, 0xe79099, 0xe790b8, 0x000000,
+ /* b5 */ 0xe7909f, 0xe79094, 0xe790bc, 0xe78fb7,
+ /* b9 */ 0xe7909c, 0xe79095, 0xe79098, 0xe790b9,
+ /* bd */ 0xe793b9, 0xe794a4, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0xe795ae, 0xe795ad, 0xe795b1,
+ /* c5 */ 0xe7968e, 0x000000, 0xe797a5, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0xe79a94,
+ /* cd */ 0xe79ab3, 0x000000, 0xe79b99, 0x000000,
+ /* d1 */ 0xe79d88, 0xe79d89, 0xe79d83, 0x000000,
+ /* d5 */ 0x000000, 0xe79d82, 0xe79f9f, 0x000000,
+ /* d9 */ 0xe7a1a3, 0xe7a1b6, 0x000000, 0xe7a19f,
+ /* dd */ 0xe7a1a6, 0xe7a5a6, 0xe7a5b1, 0x000000,
+ /* e1 */ 0x000000, 0xe7a5b6, 0xe7a684, 0xe7a5b5,
+ /* e5 */ 0xe7a7bf, 0xe7a887, 0x000000, 0xe7a88e,
+ /* e9 */ 0xe7a889, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe7aba7,
+ /* f1 */ 0xe7aba2, 0xe7ad95, 0x000000, 0x000000,
+ /* f5 */ 0xe7ad83, 0xe7ad97, 0xe7adac, 0xe7ad82,
+ /* f9 */ 0xe7ad93, 0x000000, 0xe7ad81, 0x000000,
+ /* fd */ 0x000000, 0xe7b2a7,
+
+ /*** Four byte table, leaf: 8eaebexx - offset 0x05a58 ***/
+
+ /* a1 */ 0xe7b2a0, 0xe7b2a6, 0xe7b2a4, 0xe7b5b4,
+ /* a5 */ 0x000000, 0xe7b599, 0x000000, 0xe7b5a0,
+ /* a9 */ 0xe7b597, 0xe7b5ac, 0xe7b5be, 0xe7b5a4,
+ /* ad */ 0x000000, 0xe7b59a, 0xe7b59d, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0xe7b5b6, 0xe7b58d,
+ /* b5 */ 0xe7b5b5, 0x000000, 0xe7bf93, 0xe7bf96,
+ /* b9 */ 0x000000, 0x000000, 0xe881a0, 0xe8818e,
+ /* bd */ 0xe88585, 0xe884bb, 0x000000, 0xe88588,
+ /* c1 */ 0xe88582, 0xe88589, 0xe88580, 0xe88494,
+ /* c5 */ 0xe88581, 0x000000, 0xe887af, 0xe887b6,
+ /* c9 */ 0xe88883, 0x000000, 0xe88fad, 0x000000,
+ /* cd */ 0xe88f9a, 0xe89098, 0xe88f92, 0xe89088,
+ /* d1 */ 0x000000, 0xe89080, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0xe89097, 0xe88d86, 0xe89094,
+ /* d9 */ 0xe88f93, 0xe89085, 0xe8909f, 0xe89082,
+ /* dd */ 0xe89096, 0xe88f8d, 0xe88fa6, 0x000000,
+ /* e1 */ 0xe8999d, 0xe89b95, 0xe89ba1, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0xe89bae,
+ /* e9 */ 0xe8a187, 0xe8a186, 0x000000, 0x000000,
+ /* ed */ 0xe8a2bb, 0x000000, 0xe8a2bf, 0xe8a2b4,
+ /* f1 */ 0x000000, 0xe8a2b5, 0x000000, 0xe8a69a,
+ /* f5 */ 0xe8a983, 0x000000, 0x000000, 0xe8a99a,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0xe8a8b5,
+ /* fd */ 0xe8a8b8, 0xe8a982,
+
+ /*** Four byte table, leaf: 8eaebfxx - offset 0x05ab6 ***/
+
+ /* a1 */ 0xe8a989, 0xe8a99d, 0xe8a98b, 0xe8a8bd,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0xe8b1a0, 0xe8b19e, 0xe8b1bf, 0xe8b1be,
+ /* ad */ 0xe8b283, 0x000000, 0xe8b2b1, 0xe8b687,
+ /* b1 */ 0x000000, 0x000000, 0xe8b688, 0xe8b683,
+ /* b5 */ 0x000000, 0x000000, 0xe8b686, 0xe8b68b,
+ /* b9 */ 0xe8b682, 0xe8b78a, 0xe8b792, 0x000000,
+ /* bd */ 0x000000, 0xe8b794, 0xe8b789, 0xe8bab0,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe8bbb2,
+ /* c5 */ 0xe8bba4, 0xe8bbb3, 0xe8bbaa, 0x000000,
+ /* c9 */ 0xe8bbbd, 0x000000, 0xe8be9d, 0xe980ab,
+ /* cd */ 0xe980aa, 0x000000, 0xe980a8, 0xe980a9,
+ /* d1 */ 0xe980ac, 0x000000, 0x000000, 0xe980ba,
+ /* d5 */ 0xe980b0, 0xe980b7, 0xe980bb, 0x000000,
+ /* d9 */ 0xe9848a, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0xe987be, 0xe988a0, 0x000000, 0xe9888b,
+ /* e1 */ 0x000000, 0xe98898, 0xe988a2, 0x000000,
+ /* e5 */ 0xe9889b, 0xe98888, 0x000000, 0xe9888e,
+ /* e9 */ 0xe98893, 0x000000, 0x000000, 0xe99695,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe99a8c,
+ /* f1 */ 0xe999bb, 0xe999bf, 0xe99a81, 0x000000,
+ /* f5 */ 0xe99a82, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0xe99bae, 0xe99bad,
+ /* fd */ 0x000000, 0xe99bac,
+
+ /*** Four byte table, leaf: 8eaec0xx - offset 0x05b14 ***/
+
+ /* a1 */ 0xe99d9f, 0xe99daf, 0x000000, 0xe99dad,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0xe9a3b0, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0xe9aaa9, 0x000000,
+ /* b1 */ 0x000000, 0xe9aba0, 0xe4bab7, 0x000000,
+ /* b5 */ 0x000000, 0xe5838c, 0xe582bc, 0x000000,
+ /* b9 */ 0xe582aa, 0xe582b9, 0x000000, 0xe582ab,
+ /* bd */ 0xe58383, 0xe5838d, 0xe585be, 0xe589be,
+ /* c1 */ 0xe589b9, 0x000000, 0x000000, 0xe58ba1,
+ /* c5 */ 0xe58ba0, 0xe58ba7, 0xe58e80, 0xe58eab,
+ /* c9 */ 0xe58eaa, 0xe58ea9, 0xe58fa0, 0xe597aa,
+ /* cd */ 0x000000, 0xe59797, 0x000000, 0x000000,
+ /* d1 */ 0xe59781, 0xe59c95, 0x000000, 0xe5a1ac,
+ /* d5 */ 0x000000, 0xe5a19c, 0xe5a190, 0xe5a1a1,
+ /* d9 */ 0xe5a1aa, 0xe5a1a9, 0xe5a196, 0xe5a1a0,
+ /* dd */ 0xe5a1a6, 0xe5a19f, 0xe5a4a3, 0xe5a5a6,
+ /* e1 */ 0xe5a5a8, 0x000000, 0x000000, 0xe5ab8e,
+ /* e5 */ 0x000000, 0xe5ab85, 0xe5ab83, 0x000000,
+ /* e9 */ 0x000000, 0xe5ab90, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0xe5adb4, 0xe5adb6, 0xe5af9c, 0xe5af97,
+ /* f5 */ 0xe5af9a, 0xe5af9b, 0x000000, 0xe5b0a0,
+ /* f9 */ 0xe5b5ad, 0xe5b5a6, 0x000000, 0xe5b5a4,
+ /* fd */ 0xe5b5ae, 0x000000,
+
+ /*** Four byte table, leaf: 8eaec1xx - offset 0x05b72 ***/
+
+ /* a1 */ 0xe5b5a0, 0xe5bd82, 0xe5bd9a, 0xe5bdae,
+ /* a5 */ 0x000000, 0x000000, 0xe684b0, 0xe684ba,
+ /* a9 */ 0xe684aa, 0xe68583, 0xe68499, 0xe684b1,
+ /* ad */ 0x000000, 0xe684bd, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0xe69088, 0xe690b2, 0xe690b8,
+ /* b5 */ 0x000000, 0xe690b1, 0x000000, 0xe69099,
+ /* b9 */ 0x000000, 0xe69091, 0x000000, 0x000000,
+ /* bd */ 0xe690a9, 0xe6909d, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0xe690bc, 0x000000, 0xe69186,
+ /* c5 */ 0xe69187, 0x000000, 0x000000, 0xe690ba,
+ /* c9 */ 0xe69087, 0x000000, 0xe695ab, 0x000000,
+ /* cd */ 0xe695b0, 0xe695ad, 0x000000, 0xe697a4,
+ /* d1 */ 0xe69a93, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0xe69a8f, 0x000000, 0x000000,
+ /* d9 */ 0xe69a92, 0x000000, 0xe69a8e, 0x000000,
+ /* dd */ 0xe6a586, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0xe6a4b1, 0x000000, 0x000000, 0xe6a4be,
+ /* e9 */ 0x000000, 0xe6a5bc, 0xe6a583, 0x000000,
+ /* ed */ 0xe6a5b3, 0x000000, 0xe6a595, 0x000000,
+ /* f1 */ 0x000000, 0xe6a685, 0xe6a58d, 0xe6a590,
+ /* f5 */ 0xe6a587, 0xe6a5a7, 0xe6a4b6, 0xe6a5a4,
+ /* f9 */ 0xe6a5a1, 0x000000, 0xe6a5bd, 0xe6ad84,
+ /* fd */ 0xe6ad80, 0xe6adb1,
+
+ /*** Four byte table, leaf: 8eaec2xx - offset 0x05bd0 ***/
+
+ /* a1 */ 0xe6adb3, 0xe6ae9c, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0xe6af81, 0x000000, 0xe6afba,
+ /* a9 */ 0xe6b0b1, 0xe6b0b2, 0x000000, 0x000000,
+ /* ad */ 0xe6bab8, 0xe6baa8, 0x000000, 0xe6ba91,
+ /* b1 */ 0xe6babb, 0x000000, 0xe6ba9a, 0x000000,
+ /* b5 */ 0x000000, 0xe6baa9, 0x000000, 0x000000,
+ /* b9 */ 0xe6bab5, 0xe6b9ac, 0xe6bba8, 0x000000,
+ /* bd */ 0xe6bb9d, 0xe6bb9a, 0xe6bba6, 0xe6baac,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe6bb99,
+ /* c5 */ 0xe6bba3, 0xe6bba9, 0xe6bb9b, 0x000000,
+ /* c9 */ 0xe785af, 0x000000, 0x000000, 0xe78588,
+ /* cd */ 0x000000, 0xe7858a, 0xe785ab, 0x000000,
+ /* d1 */ 0xe7858f, 0xe78597, 0xe785b4, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0xe78585, 0xe78591,
+ /* d9 */ 0xe785ad, 0x000000, 0xe78991, 0xe78990,
+ /* dd */ 0xe7898e, 0x000000, 0xe78d81, 0x000000,
+ /* e1 */ 0xe78cae, 0xe78d86, 0x000000, 0xe790a7,
+ /* e5 */ 0x000000, 0xe79188, 0xe79193, 0xe790bd,
+ /* e9 */ 0x000000, 0xe7919d, 0xe79196, 0x000000,
+ /* ed */ 0xe7909e, 0xe79187, 0xe79183, 0xe79198,
+ /* f1 */ 0xe79189, 0x000000, 0xe7918c, 0xe79185,
+ /* f5 */ 0xe790be, 0x000000, 0xe79481, 0xe7949e,
+ /* f9 */ 0x000000, 0x000000, 0xe795ba, 0xe797ae,
+ /* fd */ 0xe79882, 0xe79a97,
+
+ /*** Four byte table, leaf: 8eaec3xx - offset 0x05c2e ***/
+
+ /* a1 */ 0xe79a98, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0xe79d9d, 0xe79da4, 0xe79d93, 0xe79d98,
+ /* a9 */ 0xe7a282, 0xe7a290, 0xe7a28a, 0x000000,
+ /* ad */ 0xe7a1ba, 0xe7a1bd, 0x000000, 0xe7a28b,
+ /* b1 */ 0xe7a1b8, 0x000000, 0x000000, 0xe7a28d,
+ /* b5 */ 0xe7a288, 0xe7a292, 0xe7a281, 0xe7a5be,
+ /* b9 */ 0xe7a683, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0xe7a680, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xe7a88f, 0x000000, 0x000000, 0xe7a89d,
+ /* c5 */ 0x000000, 0xe7aaa1, 0xe7aaa4, 0x000000,
+ /* c9 */ 0xe7aba9, 0xe7abaa, 0x000000, 0xe7ada2,
+ /* cd */ 0xe7adab, 0x000000, 0xe7ad9e, 0x000000,
+ /* d1 */ 0xe7adb9, 0x000000, 0x000000, 0xe7adaf,
+ /* d5 */ 0xe7ada8, 0x000000, 0x000000, 0xe7b2ae,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0xe7b2b0,
+ /* dd */ 0x000000, 0xe7b690, 0x000000, 0xe7b68a,
+ /* e1 */ 0x000000, 0xe7b68b, 0xe7b699, 0xe7b695,
+ /* e5 */ 0x000000, 0xe7b687, 0xe7b5b8, 0xe7b697,
+ /* e9 */ 0xe7b689, 0xe7b698, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0xe7bea3, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0xe7bf9d, 0xe88197, 0x000000,
+ /* f5 */ 0xe885a3, 0xe885aa, 0xe885ac, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0xe8859d, 0xe885b5,
+ /* fd */ 0x000000, 0xe8859f,
+
+ /*** Four byte table, leaf: 8eaec4xx - offset 0x05c8c ***/
+
+ /* a1 */ 0x000000, 0xe885bd, 0xe885ad, 0x000000,
+ /* a5 */ 0x000000, 0xe88981, 0xe8918f, 0xe89284,
+ /* a9 */ 0x000000, 0xe891bf, 0x000000, 0xe89188,
+ /* ad */ 0xe890aa, 0xe891bb, 0xe891b2, 0xe891a4,
+ /* b1 */ 0xe890ae, 0xe8919c, 0xe89193, 0x000000,
+ /* b5 */ 0xe89181, 0xe89388, 0x000000, 0xe891a2,
+ /* b9 */ 0xe89280, 0xe890be, 0xe89283, 0xe891b1,
+ /* bd */ 0x000000, 0xe8918a, 0xe89195, 0xe89198,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe89bbc,
+ /* c5 */ 0xe89bbd, 0xe89c95, 0x000000, 0xe89c96,
+ /* c9 */ 0xe89bbf, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0xe8a198, 0xe8a38f, 0xe8a3a0, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0xe8a7a7,
+ /* d5 */ 0xe8a9aa, 0xe8aa80, 0x000000, 0xe8a9af,
+ /* d9 */ 0xe8a9a5, 0x000000, 0xe8a9b8, 0xe8a9bd,
+ /* dd */ 0xe8aa88, 0x000000, 0x000000, 0xe8a9a4,
+ /* e1 */ 0xe8a9be, 0x000000, 0xe8a9a7, 0xe8b1a3,
+ /* e5 */ 0xe8b288, 0x000000, 0xe8b38d, 0x000000,
+ /* e9 */ 0xe8b389, 0x000000, 0xe8b7ad, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe8bab1, 0x000000,
+ /* f5 */ 0x000000, 0xe8bc84, 0xe8be9e, 0xe8bea0,
+ /* f9 */ 0xe98183, 0xe98186, 0xe98188, 0xe98185,
+ /* fd */ 0xe98180, 0xe9818c,
+
+ /*** Four byte table, leaf: 8eaec5xx - offset 0x05cea ***/
+
+ /* a1 */ 0x000000, 0x000000, 0xe9848c, 0xe98493,
+ /* a5 */ 0xe98495, 0x000000, 0xe985ab, 0xe985a7,
+ /* a9 */ 0xe9899d, 0xe98995, 0xe988b5, 0x000000,
+ /* ad */ 0xe98999, 0xe988af, 0xe988bc, 0xe98a8f,
+ /* b1 */ 0xe9899c, 0xe989aa, 0xe989a2, 0xe9899f,
+ /* b5 */ 0xe989ab, 0xe989ae, 0xe988bb, 0xe98984,
+ /* b9 */ 0xe98981, 0xe9969a, 0x000000, 0xe99699,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0xe99a8f,
+ /* c1 */ 0x000000, 0xe99a96, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0xe99bb4, 0xe99bbc, 0x000000,
+ /* c9 */ 0xe99d95, 0x000000, 0xe99db9, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0xe99fae, 0xe99fb5,
+ /* d1 */ 0x000000, 0xe9a08b, 0x000000, 0xe9a3b3,
+ /* d5 */ 0x000000, 0x000000, 0xe9a3b7, 0xe9a3bf,
+ /* d9 */ 0xe9a3b5, 0x000000, 0xe9a3ac, 0xe9a3b1,
+ /* dd */ 0x000000, 0x000000, 0xe9a69a, 0x000000,
+ /* e1 */ 0xe9aba2, 0xe9acbd, 0xe9ad9d, 0xe9b3a8,
+ /* e5 */ 0x000000, 0xe9b3ab, 0xe9b3af, 0xe9b3ae,
+ /* e9 */ 0xe9ba81, 0xe9bc94, 0xe58390, 0xe58399,
+ /* ed */ 0xe5839c, 0xe58398, 0x000000, 0xe583a1,
+ /* f1 */ 0xe583ab, 0x000000, 0x000000, 0xe583b4,
+ /* f5 */ 0xe583a2, 0xe5839e, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0xe587b4, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0xe58bad,
+
+ /*** Four byte table, leaf: 8eaec6xx - offset 0x05d48 ***/
+
+ /* a1 */ 0xe58baa, 0x000000, 0xe58cb2, 0x000000,
+ /* a5 */ 0xe58eae, 0xe58eb0, 0x000000, 0xe597bb,
+ /* a9 */ 0xe59883, 0xe5988b, 0x000000, 0xe59887,
+ /* ad */ 0x000000, 0xe597b8, 0x000000, 0xe598a8,
+ /* b1 */ 0xe5989e, 0x000000, 0xe59898, 0xe59891,
+ /* b5 */ 0xe59991, 0xe59885, 0xe59c97, 0xe5a292,
+ /* b9 */ 0x000000, 0xe5a28c, 0x000000, 0xe5a1b8,
+ /* bd */ 0xe5a284, 0xe5a1b3, 0xe5a2ad, 0xe5a297,
+ /* c1 */ 0xe5a295, 0xe5a1b7, 0xe5a1b2, 0xe5a296,
+ /* c5 */ 0xe5a28d, 0xe5a490, 0x000000, 0xe5a5ac,
+ /* c9 */ 0x000000, 0xe5aba7, 0x000000, 0xe5aba4,
+ /* cd */ 0x000000, 0x000000, 0xe5abaf, 0xe598a6,
+ /* d1 */ 0x000000, 0x000000, 0xe5abb0, 0xe5b5bb,
+ /* d5 */ 0x000000, 0xe5b683, 0x000000, 0x000000,
+ /* d9 */ 0xe5b68b, 0xe5b68c, 0x000000, 0xe5b5b8,
+ /* dd */ 0xe5b992, 0x000000, 0x000000, 0xe5bb90,
+ /* e1 */ 0xe5bb8f, 0x000000, 0xe5beb3, 0xe5beb4,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0xe685bb,
+ /* e9 */ 0x000000, 0xe685af, 0xe68681, 0xe684bc,
+ /* ed */ 0xe68582, 0xe684b8, 0xe684b3, 0x000000,
+ /* f1 */ 0xe685a0, 0xe685a9, 0xe685bd, 0xe68686,
+ /* f5 */ 0xe688ac, 0xe688a8, 0x000000, 0xe6918c,
+ /* f9 */ 0x000000, 0xe69197, 0xe691bc, 0x000000,
+ /* fd */ 0x000000, 0xe69195,
+
+ /*** Four byte table, leaf: 8eaec7xx - offset 0x05da6 ***/
+
+ /* a1 */ 0xe691a2, 0xe691b1, 0xe691aa, 0xe69196,
+ /* a5 */ 0xe690bb, 0xe69281, 0x000000, 0xe6918f,
+ /* a9 */ 0xe691be, 0xe691a4, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0xe695b1,
+ /* b1 */ 0x000000, 0x000000, 0xe69aa5, 0xe69a9a,
+ /* b5 */ 0xe69a9c, 0x000000, 0xe69aa6, 0x000000,
+ /* b9 */ 0xe69aa4, 0xe6a68f, 0xe6a785, 0xe6a788,
+ /* bd */ 0xe6a692, 0xe6a6b2, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0xe6a7a3, 0xe6a780, 0xe6a796,
+ /* c5 */ 0xe6a791, 0xe6a69f, 0xe6a6a2, 0xe6a792,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0xe6a7a1,
+ /* cd */ 0xe6a795, 0xe6a69d, 0x000000, 0x000000,
+ /* d1 */ 0xe6a698, 0x000000, 0xe6adb4, 0xe6aea1,
+ /* d5 */ 0x000000, 0xe6bbb0, 0xe6bbb3, 0x000000,
+ /* d9 */ 0x000000, 0xe6bc9b, 0xe6bc8c, 0xe6bc9d,
+ /* dd */ 0xe6bcb4, 0xe6bca8, 0xe6bc97, 0x000000,
+ /* e1 */ 0xe6bd84, 0xe6bd82, 0xe6bc84, 0xe6bc91,
+ /* e5 */ 0xe6bbba, 0xe6bd8a, 0xe78691, 0xe7868e,
+ /* e9 */ 0x000000, 0xe7868b, 0xe7868d, 0xe785bf,
+ /* ed */ 0xe7868c, 0xe785be, 0xe785bc, 0xe78683,
+ /* f1 */ 0x000000, 0xe78688, 0x000000, 0x000000,
+ /* f5 */ 0xe78a94, 0x000000, 0xe78d95, 0xe78d93,
+ /* f9 */ 0xe78d8f, 0xe78d94, 0xe791ac, 0xe791a5,
+ /* fd */ 0xe791a6, 0xe791a1,
+
+ /*** Four byte table, leaf: 8eaec8xx - offset 0x05e04 ***/
+
+ /* a1 */ 0xe791ab, 0xe791a8, 0xe791b6, 0x000000,
+ /* a5 */ 0xe791a0, 0x000000, 0xe791b4, 0xe79486,
+ /* a9 */ 0xe7988e, 0x000000, 0xe79887, 0x000000,
+ /* ad */ 0x000000, 0xe79ab9, 0x000000, 0xe79ab7,
+ /* b1 */ 0xe79ba2, 0x000000, 0xe79db4, 0xe79db7,
+ /* b5 */ 0xe79db6, 0xe79db5, 0x000000, 0xe79db8,
+ /* b9 */ 0xe79db1, 0x000000, 0xe79dba, 0xe7859b,
+ /* bd */ 0xe79dbb, 0xe7a2a6, 0xe7a2ae, 0xe7a2b8,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe7a2b1,
+ /* c5 */ 0xe7a2af, 0x000000, 0xe7a689, 0xe7a687,
+ /* c9 */ 0x000000, 0x000000, 0xe7a8a9, 0x000000,
+ /* cd */ 0xe7a8aa, 0x000000, 0xe7a8ad, 0xe7a8ac,
+ /* d1 */ 0x000000, 0xe7a8b2, 0x000000, 0xe7abac,
+ /* d5 */ 0xe7abb0, 0xe7ae81, 0xe7ae9e, 0xe7ae83,
+ /* d9 */ 0x000000, 0xe7ae92, 0x000000, 0xe7aea3,
+ /* dd */ 0xe7ae9f, 0xe7ae93, 0x000000, 0xe7ae86,
+ /* e1 */ 0xe7b2b8, 0xe7b2b7, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0xe7b788,
+ /* e9 */ 0xe7b6b6, 0x000000, 0xe7b791, 0x000000,
+ /* ed */ 0xe7b6a8, 0xe7b6ab, 0x000000, 0xe7b6b3,
+ /* f1 */ 0xe7b78d, 0x000000, 0xe7b78f, 0xe7b6a4,
+ /* f5 */ 0x000000, 0x000000, 0xe7bd81, 0xe7bdaf,
+ /* f9 */ 0xe7bdb1, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaec9xx - offset 0x05e61 ***/
+
+ /* a1 */ 0x000000, 0xe880a3, 0xe8819b, 0x000000,
+ /* a5 */ 0xe881a1, 0xe8819f, 0xe88681, 0x000000,
+ /* a9 */ 0x000000, 0xe88684, 0xe88893, 0x000000,
+ /* ad */ 0xe8898a, 0xe8898c, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0xe892bd, 0xe89295, 0x000000,
+ /* b5 */ 0xe89292, 0xe89383, 0x000000, 0xe89296,
+ /* b9 */ 0xe892a5, 0xe892b5, 0xe892b3, 0xe892a3,
+ /* bd */ 0xe893a4, 0xe89398, 0xe89395, 0x000000,
+ /* c1 */ 0xe892b7, 0xe892ad, 0xe8939a, 0xe89293,
+ /* c5 */ 0xe89cb6, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0xe89cbd, 0xe89cab, 0xe89d87, 0xe89cb9,
+ /* cd */ 0x000000, 0xe89d85, 0xe89c9d, 0x000000,
+ /* d1 */ 0xe8a3bf, 0xe8a3aa, 0x000000, 0xe8a3b5,
+ /* d5 */ 0x000000, 0xe8a480, 0xe8a3ad, 0xe8a483,
+ /* d9 */ 0xe8a3a9, 0x000000, 0x000000, 0xe8a7aa,
+ /* dd */ 0x000000, 0xe8aa9b, 0xe8aa8e, 0xe8aaa2,
+ /* e1 */ 0x000000, 0xe8aa9c, 0xe8aa94, 0xe8aa90,
+ /* e5 */ 0xe8aaa9, 0xe8aaac, 0x000000, 0xe8aa9f,
+ /* e9 */ 0x000000, 0x000000, 0xe8aa9d, 0x000000,
+ /* ed */ 0xe8b1a7, 0x000000, 0x000000, 0xe8b390,
+ /* f1 */ 0xe8b396, 0xe8b394, 0xe8b698, 0xe8b69a,
+ /* f5 */ 0xe8b697, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0xe8b88b, 0xe8b888, 0xe8b881, 0xe8bab4,
+ /* fd */ 0xe8bab3, 0x000000,
+
+ /*** Four byte table, leaf: 8eaecaxx - offset 0x05ebf ***/
+
+ /* a1 */ 0xe8bea1, 0xe8bea2, 0x000000, 0xe9819a,
+ /* a5 */ 0x000000, 0xe981a1, 0xe9819f, 0x000000,
+ /* a9 */ 0x000000, 0xe984a5, 0xe985bb, 0xe985b6,
+ /* ad */ 0xe985bc, 0x000000, 0xe98a89, 0xe98bb6,
+ /* b1 */ 0xe98ab1, 0xe98aad, 0xe98a92, 0xe98a81,
+ /* b5 */ 0xe98a84, 0x000000, 0xe98aae, 0xe98a90,
+ /* b9 */ 0xe98a9e, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0xe996a2, 0xe996a7, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe99aa0,
+ /* c5 */ 0xe99a9d, 0xe99a9f, 0xe99b90, 0x000000,
+ /* c9 */ 0xe99b91, 0x000000, 0x000000, 0xe99d99,
+ /* cd */ 0x000000, 0xe99da4, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0xe9a099, 0x000000, 0xe9a094,
+ /* d5 */ 0xe9a095, 0xe9a09a, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0xe9a486, 0x000000,
+ /* dd */ 0xe9a3b8, 0xe9a481, 0x000000, 0xe9a6be,
+ /* e1 */ 0xe9a6bc, 0xe9a6b7, 0xe9a6b6, 0xe9a780,
+ /* e5 */ 0x000000, 0xe9a6b8, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0xe9a784, 0x000000, 0xe9a6bf,
+ /* ed */ 0x000000, 0xe9ab9a, 0xe9aba4, 0xe9aba9,
+ /* f1 */ 0xe9aba8, 0xe9abaa, 0xe9aba5, 0x000000,
+ /* f5 */ 0xe9aca6, 0x000000, 0x000000, 0xe9ad80,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaecbxx - offset 0x05f1c ***/
+
+ /* a1 */ 0x000000, 0xe9babd, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0xe5848e, 0x000000,
+ /* a9 */ 0xe583b7, 0x000000, 0xe583bc, 0xe5848d,
+ /* ad */ 0xe58481, 0xe5879a, 0xe58799, 0xe5879b,
+ /* b1 */ 0xe58a86, 0xe58a8e, 0xe58bae, 0xe58cb3,
+ /* b5 */ 0xe58eb1, 0x000000, 0xe59987, 0xe598ad,
+ /* b9 */ 0xe59994, 0x000000, 0xe5998b, 0xe59992,
+ /* bd */ 0xe598b1, 0xe59984, 0xe59996, 0xe59990,
+ /* c1 */ 0xe598ab, 0x000000, 0xe5998d, 0xe598b7,
+ /* c5 */ 0xe5998f, 0xe5a2a2, 0xe5a2b7, 0x000000,
+ /* c9 */ 0xe5a2b2, 0x000000, 0xe5a2aa, 0xe5a2b5,
+ /* cd */ 0xe5a2b0, 0x000000, 0xe5a2b4, 0xe5a2a4,
+ /* d1 */ 0xe5a2a7, 0x000000, 0xe5a4a6, 0xe5abbe,
+ /* d5 */ 0x000000, 0xe5ac84, 0x000000, 0xe5abbc,
+ /* d9 */ 0x000000, 0xe5ac86, 0xe5ac8a, 0xe5abba,
+ /* dd */ 0xe5ac8d, 0xe5ac80, 0xe5ac8e, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0xe5b691, 0x000000,
+ /* e5 */ 0xe5b68f, 0xe5b690, 0xe5b698, 0xe5b6a4,
+ /* e9 */ 0xe5b69b, 0xe5b6a3, 0xe5b696, 0xe5b7a4,
+ /* ed */ 0xe5b99a, 0x000000, 0x000000, 0xe5b99e,
+ /* f1 */ 0x000000, 0xe5beb8, 0xe68597, 0xe6859c,
+ /* f5 */ 0xe686a6, 0xe68695, 0xe68688, 0x000000,
+ /* f9 */ 0xe686a3, 0xe6868f, 0x000000, 0xe685a4,
+ /* fd */ 0x000000, 0xe68599,
+
+ /*** Four byte table, leaf: 8eaeccxx - offset 0x05f7a ***/
+
+ /* a1 */ 0xe685b8, 0x000000, 0xe68685, 0xe68687,
+ /* a5 */ 0xe6869e, 0x000000, 0x000000, 0xe68698,
+ /* a9 */ 0xe6869c, 0x000000, 0x000000, 0xe688af,
+ /* ad */ 0xe69280, 0xe6929b, 0xe6928e, 0xe6928d,
+ /* b1 */ 0xe69294, 0xe69386, 0x000000, 0xe692a8,
+ /* b5 */ 0xe69283, 0x000000, 0xe692b9, 0xe69286,
+ /* b9 */ 0xe692b4, 0xe692af, 0xe69291, 0x000000,
+ /* bd */ 0xe692aa, 0xe692a1, 0xe692a7, 0xe69ab6,
+ /* c1 */ 0xe69ab3, 0x000000, 0xe69abc, 0xe69aac,
+ /* c5 */ 0x000000, 0xe69aad, 0xe6a88e, 0x000000,
+ /* c9 */ 0xe6a89c, 0xe6a89a, 0x000000, 0x000000,
+ /* cd */ 0xe6a88b, 0x000000, 0xe6a7af, 0xe6a88c,
+ /* d1 */ 0xe6a7b0, 0xe6a8a2, 0x000000, 0xe6a798,
+ /* d5 */ 0x000000, 0xe6a892, 0xe6a7ba, 0x000000,
+ /* d9 */ 0xe6a8aa, 0x000000, 0xe6a890, 0x000000,
+ /* dd */ 0x000000, 0xe6a8a9, 0xe6a7b9, 0xe6a7aa,
+ /* e1 */ 0xe6a8ac, 0xe6a8a4, 0x000000, 0xe6a7a9,
+ /* e5 */ 0xe6ad92, 0xe6ad8f, 0xe6ad93, 0x000000,
+ /* e9 */ 0x000000, 0xe6bc90, 0xe6bda5, 0xe6bdb5,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0xe6bf90, 0x000000, 0xe6bd9c, 0xe6bcbd,
+ /* f5 */ 0xe6bdb1, 0x000000, 0xe6be91, 0xe6bc8b,
+ /* f9 */ 0xe6bdb9, 0xe6be81, 0xe6be8f, 0x000000,
+ /* fd */ 0xe6bd99, 0xe6bdb4,
+
+ /*** Four byte table, leaf: 8eaecdxx - offset 0x05fd8 ***/
+
+ /* a1 */ 0x000000, 0xe786ae, 0x000000, 0xe786a3,
+ /* a5 */ 0xe786ad, 0x000000, 0x000000, 0xe786ab,
+ /* a9 */ 0xe786a6, 0xe786a2, 0x000000, 0xe58bb2,
+ /* ad */ 0xe78997, 0xe78995, 0xe78a99, 0xe78d8b,
+ /* b1 */ 0xe791ba, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0xe7928c, 0xe79284, 0x000000, 0x000000,
+ /* b9 */ 0xe79282, 0xe79293, 0xe791bb, 0x000000,
+ /* bd */ 0xe79489, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0xe79e8a,
+ /* c5 */ 0x000000, 0xe79e90, 0x000000, 0xe7a386,
+ /* c9 */ 0xe7a393, 0xe7a380, 0xe7a392, 0xe7a387,
+ /* cd */ 0xe7a382, 0x000000, 0xe7a69f, 0xe7a69d,
+ /* d1 */ 0xe7a69e, 0x000000, 0xe7a981, 0x000000,
+ /* d5 */ 0xe7a8b8, 0xe7a8ba, 0xe7a982, 0x000000,
+ /* d9 */ 0x000000, 0xe7a8be, 0xe7aab0, 0xe7aeae,
+ /* dd */ 0xe7aeb3, 0x000000, 0x000000, 0xe7aebf,
+ /* e1 */ 0x000000, 0x000000, 0xe7af8d, 0x000000,
+ /* e5 */ 0xe7aeb2, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0xe7b384, 0xe7b38d, 0xe7b382, 0xe7b386,
+ /* f1 */ 0xe7b383, 0xe7b389, 0xe7b387, 0x000000,
+ /* f5 */ 0xe7b7b8, 0x000000, 0xe7b7ad, 0xe7b7a2,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0xe7b79c,
+ /* fd */ 0xe7b882, 0xe7b881,
+
+ /*** Four byte table, leaf: 8eaecexx - offset 0x06036 ***/
+
+ /* a1 */ 0x000000, 0xe7b796, 0x000000, 0xe7b7a4,
+ /* a5 */ 0xe7b7be, 0x000000, 0xe7b880, 0xe7b7bc,
+ /* a9 */ 0xe7b7bd, 0x000000, 0xe7b7b5, 0xe7b7bf,
+ /* ad */ 0x000000, 0xe7b7ab, 0xe7b7a5, 0xe7bdb8,
+ /* b1 */ 0xe7beae, 0xe7bfa7, 0x000000, 0xe881a5,
+ /* b5 */ 0xe881aa, 0xe881a6, 0xe881a8, 0xe881ab,
+ /* b9 */ 0xe88694, 0xe886a1, 0xe88692, 0xe88696,
+ /* bd */ 0xe88693, 0x000000, 0x000000, 0xe89481,
+ /* c1 */ 0x000000, 0xe893b8, 0x000000, 0xe893b5,
+ /* c5 */ 0x000000, 0xe89484, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0xe8949b, 0xe89483,
+ /* cd */ 0xe894b3, 0xe894b4, 0xe893ad, 0x000000,
+ /* d1 */ 0x000000, 0xe894b5, 0x000000, 0xe89485,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0xe89dbd, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0xe89db1, 0x000000, 0xe8a19c, 0xe8a3a6,
+ /* e1 */ 0xe8a48f, 0xe8a49b, 0x000000, 0xe8a6a9,
+ /* e5 */ 0xe8a6a5, 0xe8a7ae, 0xe8aab1, 0x000000,
+ /* e9 */ 0xe8ab8c, 0xe8ab8e, 0x000000, 0xe8aab7,
+ /* ed */ 0x000000, 0xe8aab5, 0xe8aba9, 0xe8aab4,
+ /* f1 */ 0x000000, 0xe8aab3, 0xe8ab81, 0xe8aaaf,
+ /* f5 */ 0xe8ab8a, 0xe8ab90, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0xe8b28e, 0x000000, 0x000000,
+ /* fd */ 0xe8b3a9, 0xe8b39b,
+
+ /*** Four byte table, leaf: 8eaecfxx - offset 0x06094 ***/
+
+ /* a1 */ 0x000000, 0xe8b3ab, 0xe8b6a4, 0x000000,
+ /* a5 */ 0xe8b6a2, 0xe8b69d, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0xe8b8aa, 0xe8b8a8,
+ /* ad */ 0x000000, 0x000000, 0xe8bab8, 0xe8bab6,
+ /* b1 */ 0xe8bab9, 0xe8bab7, 0xe8bca2, 0xe8bcab,
+ /* b5 */ 0xe8bca7, 0xe8bc99, 0xe8bea4, 0x000000,
+ /* b9 */ 0xe8beb3, 0x000000, 0xe981b1, 0xe981aa,
+ /* bd */ 0x000000, 0x000000, 0xe98688, 0xe9868c,
+ /* c1 */ 0xe98abf, 0xe98ab8, 0xe98abe, 0xe98b9c,
+ /* c5 */ 0xe98ba5, 0x000000, 0x000000, 0xe98b94,
+ /* c9 */ 0xe98b96, 0x000000, 0xe98b9a, 0xe98bad,
+ /* cd */ 0xe98bb3, 0xe98b9b, 0x000000, 0xe98ab9,
+ /* d1 */ 0xe98ba2, 0xe98bab, 0xe996af, 0x000000,
+ /* d5 */ 0xe996b2, 0xe996b3, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0xe99aa3, 0xe99aa5, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0xe99c8a,
+ /* e1 */ 0x000000, 0xe99e87, 0xe99e89, 0xe99e8c,
+ /* e5 */ 0xe99faf, 0xe9a0aa, 0xe9a0a2, 0x000000,
+ /* e9 */ 0xe9a09f, 0x000000, 0xe9a499, 0x000000,
+ /* ed */ 0xe9a78a, 0xe9a79a, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0xe9a79e, 0xe9a788, 0xe9a7a0,
+ /* f5 */ 0x000000, 0xe9aab6, 0xe9aab5, 0x000000,
+ /* f9 */ 0xe9abb4, 0x000000, 0xe9adab, 0xe9ada9,
+ /* fd */ 0xe9adb2, 0xe9ada3,
+
+ /*** Four byte table, leaf: 8eaed0xx - offset 0x060f2 ***/
+
+ /* a1 */ 0x000000, 0xe9b48d, 0x000000, 0xe9b481,
+ /* a5 */ 0xe9b48c, 0x000000, 0xe9b3b8, 0x000000,
+ /* a9 */ 0x000000, 0xe9b3be, 0xe9b482, 0xe9ba84,
+ /* ad */ 0x000000, 0xe9baab, 0xe9baaa, 0xe5849d,
+ /* b1 */ 0xe58496, 0x000000, 0xe584ab, 0xe5849e,
+ /* b5 */ 0xe5849b, 0xe58a90, 0xe58a94, 0xe58c94,
+ /* b9 */ 0x000000, 0x000000, 0xe599a7, 0x000000,
+ /* bd */ 0xe599bb, 0x000000, 0xe5999f, 0xe599a1,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0xe5a383,
+ /* c9 */ 0xe5a38a, 0xe5a2bb, 0xe5a380, 0xe5a384,
+ /* cd */ 0xe5a481, 0xe5ac9f, 0xe5ac98, 0xe5ac91,
+ /* d1 */ 0xe5ac95, 0x000000, 0xe5ac92, 0xe5ac9c,
+ /* d5 */ 0x000000, 0xe5aca2, 0xe5adb9, 0xe5b6a6,
+ /* d9 */ 0x000000, 0xe5b6b3, 0xe5b6ab, 0xe5bbaa,
+ /* dd */ 0x000000, 0xe5bd9b, 0x000000, 0x000000,
+ /* e1 */ 0xe686b7, 0xe6878e, 0xe686b9, 0xe686bd,
+ /* e5 */ 0xe6878f, 0xe68780, 0xe68699, 0xe68697,
+ /* e9 */ 0x000000, 0xe686bb, 0xe68790, 0xe68784,
+ /* ed */ 0xe688b1, 0x000000, 0xe69393, 0xe69380,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0xe6939c, 0xe69391, 0xe69388, 0x000000,
+ /* f9 */ 0xe69395, 0xe69b83, 0x000000, 0x000000,
+ /* fd */ 0xe69abf, 0xe69b85,
+
+ /*** Four byte table, leaf: 8eaed1xx - offset 0x06150 ***/
+
+ /* a1 */ 0x000000, 0xe69b8d, 0xe69b81, 0xe69c86,
+ /* a5 */ 0x000000, 0xe69ca4, 0xe6a9a3, 0xe6a982,
+ /* a9 */ 0xe6a992, 0x000000, 0xe6a983, 0xe6a8b3,
+ /* ad */ 0x000000, 0xe6a9ac, 0xe6a997, 0x000000,
+ /* b1 */ 0xe6a98c, 0xe6a9ae, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0xe6a8b7,
+ /* b9 */ 0x000000, 0xe6a9b1, 0xe6a98a, 0xe6a8b6,
+ /* bd */ 0x000000, 0xe6a993, 0x000000, 0xe6a985,
+ /* c1 */ 0xe6a9b0, 0x000000, 0x000000, 0xe6a99c,
+ /* c5 */ 0xe6ad98, 0xe6ad97, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0xe6bebb, 0x000000, 0x000000, 0xe6bebe,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0xe6beb5,
+ /* d5 */ 0xe6bf93, 0xe6be9f, 0x000000, 0xe6beb7,
+ /* d9 */ 0xe6bfb5, 0xe786b7, 0x000000, 0xe786bb,
+ /* dd */ 0x000000, 0xe78791, 0x000000, 0xe786ba,
+ /* e1 */ 0x000000, 0xe786b6, 0xe7878c, 0x000000,
+ /* e5 */ 0x000000, 0xe78793, 0xe7929b, 0x000000,
+ /* e9 */ 0x000000, 0xe79296, 0xe792a2, 0xe7929d,
+ /* ed */ 0xe7948a, 0xe7948e, 0x000000, 0xe79681,
+ /* f1 */ 0xe798ac, 0xe798b7, 0xe798b6, 0xe798bb,
+ /* f5 */ 0x000000, 0xe79aa1, 0x000000, 0x000000,
+ /* f9 */ 0xe79e98, 0x000000, 0xe79e96, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaed2xx - offset 0x061ae ***/
+
+ /* a1 */ 0xe7a396, 0xe7a3ab, 0x000000, 0xe7a39c,
+ /* a5 */ 0x000000, 0xe7a6a5, 0xe7a6a9, 0xe9a0b4,
+ /* a9 */ 0xe7a993, 0xe7a985, 0x000000, 0xe7a98f,
+ /* ad */ 0x000000, 0xe7aabd, 0xe7aabb, 0xe7abb1,
+ /* b1 */ 0x000000, 0x000000, 0xe7afac, 0xe7afad,
+ /* b5 */ 0x000000, 0x000000, 0xe7b393, 0x000000,
+ /* b9 */ 0xe7b3a1, 0x000000, 0xe7b899, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0xe7b8a7, 0xe7b8a6,
+ /* c1 */ 0x000000, 0x000000, 0xe881ae, 0xe886af,
+ /* c5 */ 0x000000, 0x000000, 0xe886ad, 0x000000,
+ /* c9 */ 0xe886aa, 0xe88898, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0xe895af, 0xe8958c,
+ /* d1 */ 0x000000, 0xe89582, 0x000000, 0xe8959c,
+ /* d5 */ 0xe895b0, 0xe8959f, 0x000000, 0xe8959a,
+ /* d9 */ 0xe8958b, 0xe894bf, 0xe89e8a, 0x000000,
+ /* dd */ 0xe89e8b, 0xe89ea1, 0xe89e8e, 0x000000,
+ /* e1 */ 0x000000, 0xe89e99, 0xe8a19e, 0xe8a19f,
+ /* e5 */ 0xe8a4a4, 0xe8a6a7, 0xe8abaa, 0xe8abbd,
+ /* e9 */ 0xe8abb9, 0xe8aba3, 0xe8aba5, 0x000000,
+ /* ed */ 0x000000, 0xe8abac, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe8b3b2, 0x000000,
+ /* f5 */ 0xe8b3af, 0x000000, 0xe8b6a6, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0xe8b8bb, 0xe8b983,
+ /* fd */ 0x000000, 0xe8b8b2,
+
+ /*** Four byte table, leaf: 8eaed3xx - offset 0x0620c ***/
+
+ /* a1 */ 0xe8bcb1, 0xe8bcb0, 0x000000, 0xe8bcad,
+ /* a5 */ 0xe8bcbc, 0xe8bea7, 0xe8bea5, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0xe984b7, 0xe98695,
+ /* ad */ 0xe9868e, 0x000000, 0xe98696, 0x000000,
+ /* b1 */ 0xe98d85, 0xe98c8a, 0x000000, 0x000000,
+ /* b5 */ 0xe98bbd, 0xe98c97, 0xe98c9c, 0xe98c87,
+ /* b9 */ 0xe98cb1, 0xe98cb2, 0xe98cac, 0xe98cb0,
+ /* bd */ 0xe98c83, 0xe98c85, 0x000000, 0xe99782,
+ /* c1 */ 0x000000, 0xe996b8, 0x000000, 0xe99781,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0xe99aab,
+ /* c9 */ 0xe99ab7, 0x000000, 0x000000, 0xe99c95,
+ /* cd */ 0xe99c94, 0x000000, 0x000000, 0xe99c8c,
+ /* d1 */ 0xe99c97, 0x000000, 0xe99e93, 0x000000,
+ /* d5 */ 0xe99f92, 0x000000, 0x000000, 0xe9a0b6,
+ /* d9 */ 0xe9a0b1, 0xe9a0b3, 0xe9a0bc, 0xe9a0ae,
+ /* dd */ 0xe9a0ba, 0x000000, 0xe9a0bd, 0x000000,
+ /* e1 */ 0xe9a2b5, 0xe9a4a2, 0xe9a4a3, 0xe9a4a0,
+ /* e5 */ 0xe9a49c, 0xe9a49d, 0x000000, 0xe9a6a0,
+ /* e9 */ 0x000000, 0xe9a7af, 0xe9a7a8, 0xe9a7ab,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe9a7a1,
+ /* f1 */ 0xe9a7a6, 0x000000, 0x000000, 0xe9abb8,
+ /* f5 */ 0xe9abb5, 0x000000, 0x000000, 0xe9ae83,
+ /* f9 */ 0xe9ae94, 0xe9ae84, 0x000000, 0xe9ae8b,
+ /* fd */ 0xe9ae8f, 0x000000,
+
+ /*** Four byte table, leaf: 8eaed4xx - offset 0x0626a ***/
+
+ /* a1 */ 0xe9ae8c, 0x000000, 0xe9ae89, 0x000000,
+ /* a5 */ 0xe9ae8e, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0xe9b4a4, 0xe9b48f, 0x000000, 0xe9b493,
+ /* ad */ 0xe9b48a, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0xe9b4aa, 0xe9b49a, 0x000000,
+ /* b5 */ 0xe9b4a7, 0xe9b496, 0xe9b4a1, 0x000000,
+ /* b9 */ 0xe9ba85, 0xe9baac, 0xe9bb86, 0xe9bb85,
+ /* bd */ 0xe9bb97, 0xe9bd93, 0x000000, 0xe584a8,
+ /* c1 */ 0xe584a7, 0xe5879f, 0x000000, 0xe58cb5,
+ /* c5 */ 0xe58eb3, 0x000000, 0xe59a8a, 0xe599bd,
+ /* c9 */ 0xe59a89, 0x000000, 0xe5a38d, 0xe5a390,
+ /* cd */ 0x000000, 0xe5acab, 0xe5acb3, 0xe5aca9,
+ /* d1 */ 0xe5acb5, 0xe5acb1, 0xe5acb7, 0xe5b0b6,
+ /* d5 */ 0xe5b6be, 0x000000, 0xe5b6b9, 0x000000,
+ /* d9 */ 0xe5b6bb, 0x000000, 0xe687a2, 0xe6879b,
+ /* dd */ 0xe6879d, 0xe6879c, 0xe6879a, 0x000000,
+ /* e1 */ 0xe68799, 0x000000, 0x000000, 0xe6939f,
+ /* e5 */ 0x000000, 0x000000, 0xe693a1, 0x000000,
+ /* e9 */ 0xe693ae, 0x000000, 0xe696b5, 0xe69b94,
+ /* ed */ 0xe69b95, 0x000000, 0xe69b90, 0xe69b91,
+ /* f1 */ 0xe69b8e, 0xe69b97, 0x000000, 0x000000,
+ /* f5 */ 0xe6a9bd, 0xe6aa8a, 0x000000, 0xe6aaa7,
+ /* f9 */ 0x000000, 0xe6aa99, 0xe6aa82, 0xe6aa88,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaed5xx - offset 0x062c8 ***/
+
+ /* a1 */ 0xe6aa86, 0x000000, 0xe6aa98, 0xe6aa9d,
+ /* a5 */ 0x000000, 0x000000, 0xe6aa8f, 0x000000,
+ /* a9 */ 0xe6aaaa, 0x000000, 0xe6ad9d, 0x000000,
+ /* ad */ 0xe6b08a, 0x000000, 0xe6bf97, 0xe6bf96,
+ /* b1 */ 0xe6bfa5, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0xe6bf99, 0xe6bf9a, 0xe6bfaa, 0x000000,
+ /* b9 */ 0xe6bfb6, 0x000000, 0x000000, 0xe787a3,
+ /* bd */ 0x000000, 0xe787a9, 0x000000, 0xe787ab,
+ /* c1 */ 0xe787af, 0xe787b3, 0xe787aa, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0xe78db1, 0x000000, 0xe792ae, 0x000000,
+ /* cd */ 0xe792b3, 0x000000, 0xe792ac, 0x000000,
+ /* d1 */ 0x000000, 0xe79683, 0xe79985, 0xe7998e,
+ /* d5 */ 0xe79984, 0xe79aa3, 0xe79aa5, 0xe79ea6,
+ /* d9 */ 0xe79ea4, 0x000000, 0xe79ea9, 0xe79eaf,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0xe7a3b0,
+ /* e1 */ 0xe7a3b8, 0xe7a3b1, 0x000000, 0xe7a989,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0xe7ab82,
+ /* e9 */ 0xe7abb2, 0xe7abb3, 0xe7afba, 0x000000,
+ /* ed */ 0xe7afb6, 0xe7afbc, 0xe7b098, 0xe7b088,
+ /* f1 */ 0xe7b092, 0x000000, 0x000000, 0xe7b39b,
+ /* f5 */ 0xe7b39a, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0xe7b8ac, 0xe7b98d, 0x000000, 0x000000,
+ /* fd */ 0xe7bd86, 0xe7bfb6,
+
+ /*** Four byte table, leaf: 8eaed6xx - offset 0x06326 ***/
+
+ /* a1 */ 0xe880ab, 0xe881b4, 0xe886b8, 0xe88788,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0xe89692,
+ /* a9 */ 0xe89693, 0x000000, 0xe895bf, 0xe896ab,
+ /* ad */ 0xe89697, 0x000000, 0x000000, 0xe896ac,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0xe89f8e,
+ /* b5 */ 0x000000, 0xe89f8d, 0x000000, 0x000000,
+ /* b9 */ 0xe89f81, 0xe89eb1, 0xe89f87, 0x000000,
+ /* bd */ 0xe8a580, 0x000000, 0xe8a4bf, 0xe8a4b9,
+ /* c1 */ 0x000000, 0xe8a583, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0xe8a6ab, 0x000000, 0xe8ac9f,
+ /* c9 */ 0xe8ac89, 0xe8ac8c, 0x000000, 0x000000,
+ /* cd */ 0xe8b180, 0x000000, 0xe8b296, 0x000000,
+ /* d1 */ 0xe8b3b6, 0xe8b3b7, 0x000000, 0xe8b986,
+ /* d5 */ 0xe8b98f, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0xe8bcbd, 0xe8bd81, 0xe98da6, 0xe98db8,
+ /* dd */ 0xe98d9d, 0xe98da9, 0xe98db4, 0xe98dbd,
+ /* e1 */ 0xe98dae, 0xe98db2, 0xe98db3, 0xe98da2,
+ /* e5 */ 0xe98d88, 0xe98d93, 0xe98d9f, 0xe98da8,
+ /* e9 */ 0x000000, 0xe98dbf, 0xe98dab, 0x000000,
+ /* ed */ 0xe99784, 0x000000, 0xe99aaf, 0xe99aad,
+ /* f1 */ 0xe99ab2, 0x000000, 0x000000, 0xe99c9a,
+ /* f5 */ 0xe99c9b, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0xe99e9b, 0xe99e9f,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaed7xx - offset 0x06381 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0xe9a180, 0x000000, 0xe9a187,
+ /* a9 */ 0x000000, 0xe9a2b7, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0xe9a6a2,
+ /* b1 */ 0x000000, 0x000000, 0xe9a880, 0xe9a7b3,
+ /* b5 */ 0x000000, 0x000000, 0xe9a7b5, 0x000000,
+ /* b9 */ 0x000000, 0xe9aabd, 0xe9ac80, 0xe9ac82,
+ /* bd */ 0x000000, 0xe9acb4, 0xe9ad89, 0xe9ae9f,
+ /* c1 */ 0x000000, 0xe9aea3, 0xe9af8d, 0xe9ae99,
+ /* c5 */ 0xe9ae9d, 0x000000, 0x000000, 0xe9b4b9,
+ /* c9 */ 0x000000, 0xe9b584, 0x000000, 0x000000,
+ /* cd */ 0xe9b4b5, 0x000000, 0x000000, 0xe9baaf,
+ /* d1 */ 0x000000, 0xe584af, 0x000000, 0x000000,
+ /* d5 */ 0xe9be8e, 0x000000, 0xe59a9f, 0xe59a9b,
+ /* d9 */ 0xe59a9e, 0xe59a96, 0xe59a94, 0xe59aa0,
+ /* dd */ 0x000000, 0xe5acbb, 0x000000, 0x000000,
+ /* e1 */ 0xe5acba, 0xe5b781, 0xe5bd8d, 0xe5bd9d,
+ /* e5 */ 0xe687b3, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0xe693b6, 0xe693a5, 0xe693aa,
+ /* ed */ 0xe693a7, 0xe69485, 0x000000, 0xe693b9,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0xe6aaab,
+ /* f5 */ 0xe6abad, 0xe6aab2, 0xe6aab0, 0xe6aab5,
+ /* f9 */ 0xe6aabe, 0xe6ab81, 0xe6ab88, 0x000000,
+ /* fd */ 0xe6ab80, 0xe6aabc,
+
+ /*** Four byte table, leaf: 8eaed8xx - offset 0x063df ***/
+
+ /* a1 */ 0xe6aab1, 0xe6ab84, 0xe6aabf, 0x000000,
+ /* a5 */ 0x000000, 0xe78088, 0xe78083, 0xe6bfbd,
+ /* a9 */ 0xe78090, 0xe78082, 0xe78093, 0x000000,
+ /* ad */ 0xe787ba, 0xe78880, 0xe792b9, 0xe792bc,
+ /* b1 */ 0x000000, 0xe7999b, 0xe79991, 0xe7998f,
+ /* b5 */ 0xe79bab, 0xe79eb8, 0x000000, 0xe79eb9,
+ /* b9 */ 0xe79f81, 0xe79f80, 0xe79ebe, 0xe7a48b,
+ /* bd */ 0x000000, 0xe7a487, 0xe7a48a, 0xe7a488,
+ /* c1 */ 0x000000, 0xe7a48d, 0xe7a486, 0xe7a495,
+ /* c5 */ 0xe7a6af, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0xe7abb5, 0x000000, 0x000000, 0xe7b0ae,
+ /* cd */ 0x000000, 0xe7b09b, 0x000000, 0xe7b09a,
+ /* d1 */ 0xe7b0a4, 0x000000, 0x000000, 0xe7b3a6,
+ /* d5 */ 0xe7b3a3, 0x000000, 0x000000, 0xe7b99d,
+ /* d9 */ 0xe7b98f, 0xe7b9a6, 0xe7b99b, 0xe7bd87,
+ /* dd */ 0xe7beb4, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe7bfba, 0xe880ae, 0x000000, 0x000000,
+ /* e5 */ 0xe8878e, 0x000000, 0x000000, 0xe88899,
+ /* e9 */ 0x000000, 0x000000, 0xe8978c, 0xe896b2,
+ /* ed */ 0x000000, 0xe896bb, 0xe89781, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0xe89fa9, 0xe89fae,
+ /* f5 */ 0xe89fb0, 0xe89f96, 0xe8a08e, 0xe89f9a,
+ /* f9 */ 0xe8a588, 0xe8a58a, 0xe8a58e, 0xe8a58d,
+ /* fd */ 0xe8a6b1, 0xe8a6b0,
+
+ /*** Four byte table, leaf: 8eaed9xx - offset 0x0643d ***/
+
+ /* a1 */ 0xe8a6b3, 0x000000, 0xe8acb8, 0xe8acb2,
+ /* a5 */ 0x000000, 0xe8acad, 0x000000, 0xe8acb4,
+ /* a9 */ 0x000000, 0xe8aca9, 0xe8b1b4, 0x000000,
+ /* ad */ 0x000000, 0xe8b483, 0x000000, 0x000000,
+ /* b1 */ 0xe8b6a9, 0xe8b998, 0x000000, 0x000000,
+ /* b5 */ 0xe8babf, 0xe8bb81, 0xe8bd8a, 0xe8beac,
+ /* b9 */ 0x000000, 0xe98289, 0xe984bd, 0xe984bc,
+ /* bd */ 0xe986a9, 0xe98ea0, 0x000000, 0xe98e90,
+ /* c1 */ 0x000000, 0xe98e93, 0xe98e8b, 0xe98ead,
+ /* c5 */ 0xe98ebb, 0xe98eb8, 0x000000, 0x000000,
+ /* c9 */ 0xe98e9c, 0xe99798, 0xe99797, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0xe99d9d, 0xe99ea9,
+ /* d1 */ 0xe99f9a, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0xe9a194, 0x000000, 0xe9a195,
+ /* d9 */ 0xe9a18b, 0x000000, 0xe9a0bf, 0xe9a2b9,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe9a4b8, 0xe9a4b6, 0xe9a580, 0x000000,
+ /* e5 */ 0xe9a4bb, 0xe9a4b9, 0xe9a6a4, 0x000000,
+ /* e9 */ 0x000000, 0xe9a888, 0xe9a88c, 0x000000,
+ /* ed */ 0xe9a890, 0x000000, 0xe9ac87, 0x000000,
+ /* f1 */ 0xe9af92, 0x000000, 0xe9af82, 0xe9aebb,
+ /* f5 */ 0xe9af8c, 0xe9af8b, 0x000000, 0x000000,
+ /* f9 */ 0xe9b58d, 0xe9b5a3, 0xe9b58e, 0x000000,
+ /* fd */ 0xe9b590, 0xe9b595,
+
+ /*** Four byte table, leaf: 8eaedaxx - offset 0x0649b ***/
+
+ /* a1 */ 0x000000, 0xe9b59e, 0x000000, 0xe9ba90,
+ /* a5 */ 0xe9bab2, 0xe9bab1, 0x000000, 0xe9bb8a,
+ /* a9 */ 0xe9bc82, 0xe9bca7, 0xe9bca6, 0x000000,
+ /* ad */ 0xe59aaf, 0xe5a3a0, 0xe5a39c, 0x000000,
+ /* b1 */ 0xe5acb9, 0x000000, 0x000000, 0xe5adbc,
+ /* b5 */ 0xe5afb3, 0x000000, 0x000000, 0xe5b1ab,
+ /* b9 */ 0xe5b784, 0xe6948b, 0xe69488, 0xe6948a,
+ /* bd */ 0x000000, 0x000000, 0xe6979c, 0x000000,
+ /* c1 */ 0x000000, 0xe69ba1, 0xe69b9f, 0xe6ab8e,
+ /* c5 */ 0xe6ab94, 0xe6aba3, 0xe6ab97, 0xe6aba2,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0xe6ab98, 0xe6ab95, 0xe6ab92, 0x000000,
+ /* d1 */ 0x000000, 0xe7809e, 0xe780ac, 0xe780a5,
+ /* d5 */ 0xe6bfb3, 0xe78884, 0xe78888, 0xe78895,
+ /* d9 */ 0x000000, 0xe79384, 0xe79389, 0xe79387,
+ /* dd */ 0xe79388, 0xe79aa9, 0xe79f86, 0xe79f85,
+ /* e1 */ 0xe7a498, 0xe7a49a, 0xe7a4a0, 0x000000,
+ /* e5 */ 0xe7a9a6, 0xe7a9a4, 0xe7a9aa, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0xe7b0b5, 0xe7b0b4, 0x000000,
+ /* f1 */ 0x000000, 0xe7b9ac, 0x000000, 0xe7b9ae,
+ /* f5 */ 0xe7b9b1, 0x000000, 0xe88794, 0xe88796,
+ /* f9 */ 0xe8889a, 0xe889a2, 0xe889a5, 0xe889b6,
+ /* fd */ 0xe8979b, 0xe89796,
+
+ /*** Four byte table, leaf: 8eaedbxx - offset 0x064f9 ***/
+
+ /* a1 */ 0x000000, 0xe897a7, 0x000000, 0x000000,
+ /* a5 */ 0xe897b4, 0x000000, 0xe89fbd, 0xe89f95,
+ /* a9 */ 0xe8a087, 0x000000, 0xe8a08f, 0xe89fb8,
+ /* ad */ 0x000000, 0x000000, 0xe8a687, 0x000000,
+ /* b1 */ 0xe8a6b5, 0xe8a7b5, 0x000000, 0xe8acbf,
+ /* b5 */ 0xe8ad83, 0xe8ad8c, 0x000000, 0xe8b48b,
+ /* b9 */ 0xe8b9ab, 0xe8b9a8, 0xe8b9b0, 0xe8b9b5,
+ /* bd */ 0xe8b9b7, 0x000000, 0xe8bb83, 0x000000,
+ /* c1 */ 0xe98fa9, 0xe98faa, 0xe98f8b, 0xe98f85,
+ /* c5 */ 0xe98f86, 0x000000, 0xe98fad, 0xe98f93,
+ /* c9 */ 0x000000, 0xe98fa5, 0x000000, 0x000000,
+ /* cd */ 0xe98f9b, 0xe98fab, 0xe98fa0, 0xe98f81,
+ /* d1 */ 0x000000, 0x000000, 0xe9979d, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0xe99eb2, 0xe99eb4, 0xe99eb1, 0xe99eb5,
+ /* e1 */ 0xe99fb2, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0xe9a196, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0xe9a584, 0x000000, 0xe9a8a6, 0xe9a89f,
+ /* ed */ 0xe9a898, 0xe9a8a1, 0xe9a897, 0x000000,
+ /* f1 */ 0xe9ac89, 0x000000, 0x000000, 0xe9af85,
+ /* f5 */ 0xe9af9f, 0x000000, 0xe9afa3, 0x000000,
+ /* f9 */ 0xe9afa9, 0xe9afae, 0x000000, 0x000000,
+ /* fd */ 0xe9b5a6, 0xe9b5ba,
+
+ /*** Four byte table, leaf: 8eaedcxx - offset 0x06557 ***/
+
+ /* a1 */ 0x000000, 0xe9b5ae, 0xe9b691, 0xe9b683,
+ /* a5 */ 0xe9b5b6, 0xe9b5be, 0xe9b5ad, 0x000000,
+ /* a9 */ 0xe9ba95, 0xe9bba3, 0x000000, 0x000000,
+ /* ad */ 0xe9bc83, 0xe9bc84, 0x000000, 0xe9bc97,
+ /* b1 */ 0x000000, 0xe584b6, 0x000000, 0xe58cb6,
+ /* b5 */ 0x000000, 0xe5ad82, 0x000000, 0x000000,
+ /* b9 */ 0xe5ad84, 0xe5ad86, 0xe5adbe, 0xe5b78a,
+ /* bd */ 0xe5b788, 0xe5b78c, 0xe5bbb0, 0x000000,
+ /* c1 */ 0xe69685, 0xe69ba5, 0xe69ba7, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0xe6abb4, 0x000000,
+ /* c9 */ 0xe6aba9, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0xe780bd, 0x000000,
+ /* d1 */ 0xe780b6, 0x000000, 0xe78896, 0x000000,
+ /* d5 */ 0xe78892, 0xe7888f, 0xe78897, 0xe78891,
+ /* d9 */ 0xe7888b, 0x000000, 0x000000, 0xe7938d,
+ /* dd */ 0xe79390, 0xe7938c, 0xe7938e, 0xe79391,
+ /* e1 */ 0x000000, 0xe79689, 0x000000, 0xe7a9af,
+ /* e5 */ 0xe7b18b, 0xe7b184, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0xe7b9bf,
+ /* ed */ 0xe8adb1, 0x000000, 0xe880af, 0xe881ba,
+ /* f1 */ 0xe881bb, 0xe881bc, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0xe897bc, 0xe89890, 0xe89882,
+ /* f9 */ 0x000000, 0x000000, 0xe897ae, 0xe89883,
+ /* fd */ 0x000000, 0xe8988d,
+
+ /*** Four byte table, leaf: 8eaeddxx - offset 0x065b5 ***/
+
+ /* a1 */ 0xe89893, 0xe89888, 0xe8988f, 0xe8a098,
+ /* a5 */ 0xe8a092, 0x000000, 0x000000, 0xe8a5a7,
+ /* a9 */ 0xe8a5a5, 0xe8a6bb, 0xe8ada9, 0xe8ada2,
+ /* ad */ 0x000000, 0xe8adae, 0x000000, 0xe8ada1,
+ /* b1 */ 0x000000, 0xe8ada4, 0xe8ad8d, 0xe8b191,
+ /* b5 */ 0x000000, 0x000000, 0xe8ba83, 0xe8bb86,
+ /* b9 */ 0x000000, 0xe9909f, 0x000000, 0xe99084,
+ /* bd */ 0xe99097, 0xe99088, 0xe99085, 0x000000,
+ /* c1 */ 0xe98fb3, 0xe9909e, 0xe99082, 0xe9909a,
+ /* c5 */ 0xe9909b, 0xe990a7, 0xe9909c, 0x000000,
+ /* c9 */ 0xe99ab5, 0x000000, 0x000000, 0xe99cb3,
+ /* cd */ 0x000000, 0xe99cb4, 0xe99cb1, 0xe99eb8,
+ /* d1 */ 0xe99eba, 0x000000, 0xe99fbc, 0x000000,
+ /* d5 */ 0x000000, 0xe9a383, 0x000000, 0xe9a58d,
+ /* d9 */ 0x000000, 0xe9a8af, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0xe9ab89, 0x000000, 0xe9ab88,
+ /* e1 */ 0xe9ab84, 0xe9acaa, 0xe9acb8, 0xe9ad90,
+ /* e5 */ 0x000000, 0xe9b08a, 0xe9afbb, 0xe9b084,
+ /* e9 */ 0xe9afbc, 0xe9afbe, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0xe9b082, 0xe9afb6, 0xe9b09b,
+ /* f1 */ 0xe9afb9, 0xe9b095, 0xe9b090, 0xe9afbf,
+ /* f5 */ 0xe9b080, 0xe9b08c, 0x000000, 0x000000,
+ /* f9 */ 0xe9b695, 0xe9b6a5, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaedexx - offset 0x06613 ***/
+
+ /* a1 */ 0xe9ba98, 0xe9bb81, 0x000000, 0xe9bd9a,
+ /* a5 */ 0xe585a4, 0xe59abb, 0x000000, 0xe5a3a6,
+ /* a9 */ 0xe5ad89, 0xe5afb7, 0x000000, 0x000000,
+ /* ad */ 0xe5b790, 0x000000, 0xe5bf82, 0x000000,
+ /* b1 */ 0xe69491, 0x000000, 0xe6abbf, 0xe6abbe,
+ /* b5 */ 0xe6abbd, 0x000000, 0xe6ac81, 0x000000,
+ /* b9 */ 0x000000, 0xe7818b, 0xe7818d, 0xe78187,
+ /* bd */ 0xe79393, 0xe799a8, 0xe799a7, 0x000000,
+ /* c1 */ 0x000000, 0xe79f91, 0xe7a4b0, 0xe7a4b2,
+ /* c5 */ 0xe7a4ae, 0x000000, 0xe9be9d, 0xe7ab89,
+ /* c9 */ 0xe7ab88, 0x000000, 0xe7b196, 0xe7b191,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0xe7ba85,
+ /* d1 */ 0xe7ba89, 0xe7ba8e, 0xe7ba84, 0x000000,
+ /* d5 */ 0xe889aa, 0xe898ab, 0xe898af, 0xe898a8,
+ /* d9 */ 0x000000, 0xe89896, 0xe89895, 0xe8989d,
+ /* dd */ 0xe8a09a, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe8a6bc, 0xe8adb5, 0xe8adbc, 0x000000,
+ /* e5 */ 0xe8b491, 0xe8b492, 0xe8bd9c, 0xe986bb,
+ /* e9 */ 0x000000, 0xe98fb4, 0x000000, 0x000000,
+ /* ed */ 0xe990ad, 0x000000, 0x000000, 0xe99ba4,
+ /* f1 */ 0xe99cb7, 0xe99cb6, 0xe99da7, 0xe99ebe,
+ /* f5 */ 0xe99ebd, 0xe99fa2, 0xe9a1a8, 0xe9a1a6,
+ /* f9 */ 0xe9a388, 0xe9a38a, 0xe9a387, 0xe9a39c,
+ /* fd */ 0x000000, 0xe9a58f,
+
+ /*** Four byte table, leaf: 8eaedfxx - offset 0x06671 ***/
+
+ /* a1 */ 0xe9a6a9, 0xe9a8bc, 0x000000, 0xe9a8bb,
+ /* a5 */ 0xe9ab8e, 0x000000, 0xe9ac94, 0xe9ad93,
+ /* a9 */ 0x000000, 0xe9b0ae, 0x000000, 0xe9b09f,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0xe9b6b0, 0xe9b6bd, 0x000000, 0x000000,
+ /* b5 */ 0xe9b6ae, 0xe9b784, 0xe9b9bb, 0x000000,
+ /* b9 */ 0x000000, 0xe9ba9e, 0x000000, 0xe9bc85,
+ /* bd */ 0x000000, 0xe9bda9, 0xe9bea1, 0xe59b87,
+ /* c1 */ 0xe59c9d, 0xe5ad8a, 0xe5b793, 0x000000,
+ /* c5 */ 0xe5bdb2, 0xe68882, 0x000000, 0xe688b5,
+ /* c9 */ 0xe694a7, 0xe6949e, 0xe6949f, 0x000000,
+ /* cd */ 0x000000, 0xe6ac87, 0xe6ac86, 0x000000,
+ /* d1 */ 0x000000, 0xe78194, 0xe7889c, 0xe788a0,
+ /* d5 */ 0xe7abb8, 0x000000, 0xe7b19d, 0xe7b198,
+ /* d9 */ 0x000000, 0xe7ba92, 0xe7bd8e, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0xe8a0a7, 0x000000,
+ /* e1 */ 0xe8ae81, 0xe8ae83, 0x000000, 0xe8b184,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0xe99182, 0xe9918d, 0xe99194, 0xe9918e,
+ /* ed */ 0x000000, 0xe99183, 0x000000, 0x000000,
+ /* f1 */ 0xe99cbc, 0xe99d80, 0xe99f80, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0xe9a59a,
+ /* f9 */ 0xe9a991, 0x000000, 0xe9ab9d, 0x000000,
+ /* fd */ 0x000000, 0xe9b0b8,
+
+ /*** Four byte table, leaf: 8eaee0xx - offset 0x066cf ***/
+
+ /* a1 */ 0x000000, 0xe9b185, 0xe9b0ba, 0x000000,
+ /* a5 */ 0xe9b0b5, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0xe9bbb1, 0x000000, 0xe9be93, 0xe58a9a,
+ /* ad */ 0x000000, 0x000000, 0xe89981, 0xe5b797,
+ /* b1 */ 0x000000, 0xe694a8, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0xe78193, 0xe78199, 0x000000,
+ /* b9 */ 0xe788a1, 0x000000, 0xe799af, 0xe7a4b7,
+ /* bd */ 0xe7a6b5, 0xe7b1a2, 0xe7b19e, 0xe7b3b5,
+ /* c1 */ 0x000000, 0x000000, 0xe898bd, 0x000000,
+ /* c5 */ 0xe8a0ad, 0xe8a689, 0xe8ae8d, 0xe8ae87,
+ /* c9 */ 0xe8ae90, 0xe8b49a, 0xe8ba99, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0xe9919f, 0x000000,
+ /* d1 */ 0x000000, 0xe99196, 0xe991a1, 0xe9919b,
+ /* d5 */ 0xe9919a, 0xe9919c, 0xe991a5, 0x000000,
+ /* d9 */ 0xe99d81, 0x000000, 0x000000, 0xe9a1ae,
+ /* dd */ 0xe9a1ac, 0xe9a1ad, 0x000000, 0xe9a6aa,
+ /* e1 */ 0xe9a99c, 0xe9a998, 0xe9ab9e, 0x000000,
+ /* e5 */ 0xe9b18f, 0xe9b191, 0x000000, 0xe9b193,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0xe9b7bc,
+ /* ed */ 0xe9bcb9, 0x000000, 0xe584be, 0x000000,
+ /* f1 */ 0xe59b92, 0x000000, 0xe5ad8f, 0xe6ac94,
+ /* f5 */ 0x000000, 0xe7a9b2, 0xe7a9b3, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0xe8ae91, 0x000000,
+ /* fd */ 0x000000, 0xe986bf,
+
+ /*** Four byte table, leaf: 8eaee1xx - offset 0x0672d ***/
+
+ /* a1 */ 0x000000, 0xe991ac, 0x000000, 0x000000,
+ /* a5 */ 0xe99ba6, 0xe99d85, 0x000000, 0xe99f88,
+ /* a9 */ 0xe99fa4, 0xe9a59d, 0x000000, 0xe9aca1,
+ /* ad */ 0x000000, 0xe9acac, 0xe9ad97, 0x000000,
+ /* b1 */ 0x000000, 0xe9b19d, 0xe9b1a1, 0xe9b1a5,
+ /* b5 */ 0xe9b888, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0xe9bd85, 0x000000,
+ /* bd */ 0x000000, 0xe68885, 0xe69baf, 0xe6ac9b,
+ /* c1 */ 0xe6ac9d, 0xe788a5, 0xe788a4, 0xe7b1ad,
+ /* c5 */ 0x000000, 0xe89982, 0xe89989, 0x000000,
+ /* c9 */ 0xe8a5b8, 0xe8a68a, 0xe8ae97, 0x000000,
+ /* cd */ 0xe8b29b, 0xe8b49c, 0x000000, 0xe8baa2,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0xe9b1ac, 0x000000, 0xe9b1af, 0x000000,
+ /* dd */ 0xe9b88e, 0x000000, 0xe9bc88, 0xe9bc9d,
+ /* e1 */ 0xe9bea3, 0x000000, 0x000000, 0xe5bda0,
+ /* e5 */ 0xe6ac9c, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0xe7b3b3, 0x000000, 0xe8ae9b, 0xe8baa7,
+ /* ed */ 0xe98784, 0x000000, 0xe991ba, 0x000000,
+ /* f1 */ 0x000000, 0xe9a9a1, 0xe9a9a3, 0xe9ab97,
+ /* f5 */ 0xe9b1b6, 0x000000, 0xe9bea5, 0x000000,
+ /* f9 */ 0xe781a7, 0x000000, 0xe78aab, 0xe8998a,
+ /* fd */ 0xe8a5bd, 0xe8ae9d,
+
+ /*** Four byte table, leaf: 8eaee2xx - offset 0x0678b ***/
+
+ /* a1 */ 0xe8b193, 0xe8bda5, 0xe991bb, 0x000000,
+ /* a5 */ 0xe9a38d, 0xe9a39d, 0x000000, 0xe9acb0,
+ /* a9 */ 0xe9b896, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0xe99ba7, 0xe9b898,
+ /* b1 */ 0xe9baa2, 0x000000, 0xe9bdbc, 0x000000,
+ /* b5 */ 0xe7ba9e, 0xe99284, 0x000000, 0xe9b89c,
+ /* b9 */ 0x000000, 0xe7b1b1, 0xe99f8a, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0xe9baa3, 0x000000,
+ /* c1 */ 0xe9b1bb, 0xe9be97, 0x000000, 0x000000,
+ /* c5 */ 0xe99d90, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0xe59ca7, 0xe5b093, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0xe5bf88, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0xe69da5, 0x000000,
+ /* d9 */ 0x000000, 0xe58abd, 0x000000, 0xe5ada6,
+ /* dd */ 0x000000, 0xe697b9, 0xe69e88, 0xe6b3a6,
+ /* e1 */ 0xe6b38b, 0x000000, 0xe4bebd, 0xe5be8d,
+ /* e5 */ 0x000000, 0xe68098, 0xe68188, 0x000000,
+ /* e9 */ 0xe6aca9, 0xe782a6, 0x000000, 0xe79c86,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0xe5a890,
+ /* f1 */ 0xe5b3bc, 0xe5b3be, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0xe78389, 0x000000, 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaee3xx - offset 0x067e7 ***/
+
+ /* a1 */ 0x000000, 0x000000, 0xe995b9, 0x000000,
+ /* a5 */ 0xe99aba, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0xe7aca9, 0xe884a8, 0x000000, 0xe8a8ae,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0xe9ab99,
+ /* b5 */ 0x000000, 0xe5a0ab, 0xe5a185, 0x000000,
+ /* b9 */ 0xe68fba, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0xe6ba86, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0xe5a1a7, 0x000000,
+ /* c5 */ 0xe5af9d, 0xe695ae, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0xe8b287, 0x000000, 0xe58392,
+ /* cd */ 0xe5839f, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0xe6a6ba, 0x000000, 0xe6ae9d,
+ /* d5 */ 0x000000, 0xe88199, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0xe6be8a, 0x000000,
+ /* e5 */ 0x000000, 0xe7af83, 0xe7af82, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0xe983b6,
+ /* ed */ 0x000000, 0xe9a0a3, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0xe7878d,
+ /* f5 */ 0xe79299, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0xe9a182, 0x000000,
+ /* fd */ 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8eaee4xx - offset 0x06844 ***/
+
+ /* a1 */ 0x000000, 0xe7be84, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0xe8b48e,
+ /* a9 */ 0x000000, 0xe9a1a1, 0x000000, 0x000000,
+ /* ad */ 0xe8adb3, 0x000000, 0xe9b0a7, 0x000000,
+ /* b1 */ 0xe99198, 0xe79f96, 0xe9acad, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0xe4bda6,
+ /* c9 */ 0xe4bda8, 0xe4bfa7, 0xe580bf, 0x000000,
+ /* cd */ 0xe582a6, 0xe5848f, 0xe588be, 0xe58ca4,
+ /* d1 */ 0xe58da5, 0xe58e9b, 0xe585bf, 0xe5938b,
+ /* d5 */ 0xe595b3, 0xe595b1, 0xe595ab, 0xe597b4,
+ /* d9 */ 0xe598a2, 0xe598a0, 0xe59a92, 0xe59aba,
+ /* dd */ 0xe59a91, 0xe59ab0, 0xe59d99, 0xe59e8a,
+ /* e1 */ 0xe5a08f, 0xe5a092, 0xe5a093, 0xe5a187,
+ /* e5 */ 0xe5a29b, 0xe5a480, 0xe5a58d, 0xe5ab91,
+ /* e9 */ 0xe5ab93, 0xe5ada7, 0xe5b197, 0xe5b1b7,
+ /* ed */ 0xe5b395, 0xe5b5b5, 0xe5b68e, 0xe5b6a5,
+ /* f1 */ 0xe5b6b6, 0xe5b6bf, 0xe5b9a5, 0xe5bb8d,
+ /* f5 */ 0xe5bbad, 0xe5be94, 0xe5be9a, 0xe5beba,
+ /* f9 */ 0xe684a5, 0xe68590, 0xe68aa3, 0xe68da0,
+ /* fd */ 0xe68da4, 0xe68eb6,
+
+ /*** Four byte table, leaf: 8eaee5xx - offset 0x068a2 ***/
+
+ /* a1 */ 0xe69083, 0xe692b6, 0xe6949a, 0xe7a8a5,
+ /* a5 */ 0xe5b0a1, 0xe69ba2, 0xe69c82, 0xe69ea4,
+ /* a9 */ 0xe69eac, 0xe6a090, 0xe6a086, 0xe6a19e,
+ /* ad */ 0xe6a19a, 0xe6a4ac, 0xe6a4a9, 0xe6a8ad,
+ /* b1 */ 0xe6a9b7, 0xe6a9ba, 0xe6ab8a, 0xe6aba6,
+ /* b5 */ 0xe6abb5, 0xe6ac8d, 0xe6ac8e, 0xe6af9c,
+ /* b9 */ 0xe6af9d, 0xe6afb6, 0xe6b09e, 0xe6b1a3,
+ /* bd */ 0xe6b6a5, 0xe6b88f, 0xe6ba8a, 0xe6ba84,
+ /* c1 */ 0xe6ba8b, 0xe6b9bc, 0xe6bd8c, 0xe6bd88,
+ /* c5 */ 0xe6bd89, 0xe6be9d, 0xe6be99, 0xe6bfb8,
+ /* c9 */ 0xe780ae, 0xe780ad, 0xe7819c, 0xe7a78c,
+ /* cd */ 0xe782bf, 0xe783aa, 0xe783a5, 0xe78491,
+ /* d1 */ 0xe78492, 0xe784bf, 0xe784b9, 0xe784bb,
+ /* d5 */ 0xe784bd, 0xe785b7, 0xe785b5, 0xe785b6,
+ /* d9 */ 0xe785b1, 0xe78696, 0xe78693, 0xe786b4,
+ /* dd */ 0xe7879d, 0xe7879e, 0xe7888e, 0xe5a491,
+ /* e1 */ 0xe78898, 0xe78d87, 0xe78d88, 0xe78faf,
+ /* e5 */ 0xe79092, 0xe790bb, 0xe792a4, 0xe7928d,
+ /* e9 */ 0xe792b4, 0xe799b3, 0xe799b7, 0xe79abc,
+ /* ed */ 0xe7a099, 0xe7a09b, 0xe7a0bd, 0xe7a193,
+ /* f1 */ 0xe7a194, 0xe7a198, 0xe7a2b7, 0xe7a398,
+ /* f5 */ 0xe7a3ae, 0xe7a4a2, 0xe7a58d, 0xe7a686,
+ /* f9 */ 0xe7a699, 0xe7a6a3, 0xe7a6bc, 0xe7aaa7,
+ /* fd */ 0xe7acb7, 0xe7ad99,
+
+ /*** Four byte table, leaf: 8eaee6xx - offset 0x06900 ***/
+
+ /* a1 */ 0xe7af90, 0xe7b0af, 0xe7b0b2, 0xe7b182,
+ /* a5 */ 0xe7b18e, 0xe7b1a8, 0xe7b2a9, 0xe7b3ad,
+ /* a9 */ 0xe7b790, 0xe7b887, 0xe7b793, 0xe7b9a4,
+ /* ad */ 0xe7bd80, 0x000000, 0xe88181, 0xe881a3,
+ /* b1 */ 0xe882bb, 0xe69c91, 0xe69ca5, 0xe88988,
+ /* b5 */ 0xe88c90, 0xe88da2, 0xe88c92, 0xe890a1,
+ /* b9 */ 0xe8909e, 0xe893a2, 0xe8939e, 0xe893a1,
+ /* bd */ 0xe895b3, 0xe89794, 0xe897b5, 0xe898b7,
+ /* c1 */ 0xe89985, 0xe899b2, 0xe89d8a, 0xe89ea9,
+ /* c5 */ 0xe89ea5, 0xe89fb5, 0xe8a0b4, 0xe8a190,
+ /* c9 */ 0xe8a287, 0xe8a594, 0xe8a684, 0xe8ac83,
+ /* cd */ 0xe8b192, 0xe8b398, 0xe8b48c, 0xe8b498,
+ /* d1 */ 0xe8b6b0, 0xe8babc, 0xe8bb95, 0xe8beaa,
+ /* d5 */ 0xe9829c, 0x000000, 0xe9859c, 0xe988ab,
+ /* d9 */ 0xe988a1, 0xe989b3, 0xe98bb4, 0xe98bb5,
+ /* dd */ 0xe98cbf, 0xe98d82, 0xe98e86, 0xe98ebe,
+ /* e1 */ 0xe98ebc, 0xe98ebd, 0xe98fb1, 0xe98fb2,
+ /* e5 */ 0xe98faf, 0xe990a2, 0xe990a3, 0xe990a4,
+ /* e9 */ 0xe991a7, 0xe991a6, 0xe99697, 0xe9978e,
+ /* ed */ 0xe997a7, 0xe99cbb, 0xe99d8d, 0xe9a3a4,
+ /* f1 */ 0xe9a582, 0xe9ac9d, 0xe9ae98, 0x000000,
+ /* f5 */ 0xe9b589, 0xe69189, 0xe5b9b1, 0xe5ba85,
+ /* f9 */ 0xe68793, 0xe9a48e, 0xe88082, 0xe7a09e,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 8eaee7xx - offset 0x0695e ***/
+
+ /* a1 */ 0xe594a8, 0xe595b2, 0xe596ba, 0xe597b0,
+ /* a5 */ 0xe597ae, 0xe59ab8, 0xe59ab9, 0xe59b84,
+ /* a9 */ 0xe88193, 0xe98ab0, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/gb-18030-2000.xml b/src/backend/utils/mb/Unicode/gb-18030-2000.xml
new file mode 100644
index 0000000..fbbc9e3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/gb-18030-2000.xml
@@ -0,0 +1,30916 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE characterMapping SYSTEM "http://www.unicode.org/unicode/reports/tr22/CharacterMapping.dtd">
+<characterMapping id="gb-18030-2000" version="3">
+ <history>
+ <modified version="3" date="2001-02-21">
+ 0x80 appears to be a valid (and unassigned) single-byte code, added to the validity.
+ </modified>
+ <modified version="2" date="2000-11-30">
+ New mapping data, changing all four-byte mappings to the BMP.
+ Removed mappings to single surrogates.
+ </modified>
+ <modified version="1" date="2000-03-17">
+ Original table.
+ </modified>
+ </history>
+
+ <validity>
+ <state type="FIRST" s="00" e="80" next="VALID" max="7f"/>
+ <state type="FIRST" s="81" e="fe" next="SECOND"/>
+
+ <state type="SECOND" s="40" e="7e" next="VALID" max="ffff"/>
+ <state type="SECOND" s="80" e="fe" next="VALID" max="ffff"/>
+ <state type="SECOND" s="30" e="39" next="THIRD"/>
+
+ <state type="THIRD" s="81" e="fe" next="FOURTH"/>
+
+ <state type="FOURTH" s="30" e="39" next="VALID" max="10ffff"/>
+ </validity>
+ <assignments sub="1A">
+ <!-- One to one mappings -->
+ <a u="0000" b="00"/>
+ <a u="0001" b="01"/>
+ <a u="0002" b="02"/>
+ <a u="0003" b="03"/>
+ <a u="0004" b="04"/>
+ <a u="0005" b="05"/>
+ <a u="0006" b="06"/>
+ <a u="0007" b="07"/>
+ <a u="0008" b="08"/>
+ <a u="0009" b="09"/>
+ <a u="000A" b="0A"/>
+ <a u="000B" b="0B"/>
+ <a u="000C" b="0C"/>
+ <a u="000D" b="0D"/>
+ <a u="000E" b="0E"/>
+ <a u="000F" b="0F"/>
+ <a u="0010" b="10"/>
+ <a u="0011" b="11"/>
+ <a u="0012" b="12"/>
+ <a u="0013" b="13"/>
+ <a u="0014" b="14"/>
+ <a u="0015" b="15"/>
+ <a u="0016" b="16"/>
+ <a u="0017" b="17"/>
+ <a u="0018" b="18"/>
+ <a u="0019" b="19"/>
+ <a u="001A" b="1A"/>
+ <a u="001B" b="1B"/>
+ <a u="001C" b="1C"/>
+ <a u="001D" b="1D"/>
+ <a u="001E" b="1E"/>
+ <a u="001F" b="1F"/>
+ <a u="0020" b="20"/>
+ <a u="0021" b="21"/>
+ <a u="0022" b="22"/>
+ <a u="0023" b="23"/>
+ <a u="0024" b="24"/>
+ <a u="0025" b="25"/>
+ <a u="0026" b="26"/>
+ <a u="0027" b="27"/>
+ <a u="0028" b="28"/>
+ <a u="0029" b="29"/>
+ <a u="002A" b="2A"/>
+ <a u="002B" b="2B"/>
+ <a u="002C" b="2C"/>
+ <a u="002D" b="2D"/>
+ <a u="002E" b="2E"/>
+ <a u="002F" b="2F"/>
+ <a u="0030" b="30"/>
+ <a u="0031" b="31"/>
+ <a u="0032" b="32"/>
+ <a u="0033" b="33"/>
+ <a u="0034" b="34"/>
+ <a u="0035" b="35"/>
+ <a u="0036" b="36"/>
+ <a u="0037" b="37"/>
+ <a u="0038" b="38"/>
+ <a u="0039" b="39"/>
+ <a u="003A" b="3A"/>
+ <a u="003B" b="3B"/>
+ <a u="003C" b="3C"/>
+ <a u="003D" b="3D"/>
+ <a u="003E" b="3E"/>
+ <a u="003F" b="3F"/>
+ <a u="0040" b="40"/>
+ <a u="0041" b="41"/>
+ <a u="0042" b="42"/>
+ <a u="0043" b="43"/>
+ <a u="0044" b="44"/>
+ <a u="0045" b="45"/>
+ <a u="0046" b="46"/>
+ <a u="0047" b="47"/>
+ <a u="0048" b="48"/>
+ <a u="0049" b="49"/>
+ <a u="004A" b="4A"/>
+ <a u="004B" b="4B"/>
+ <a u="004C" b="4C"/>
+ <a u="004D" b="4D"/>
+ <a u="004E" b="4E"/>
+ <a u="004F" b="4F"/>
+ <a u="0050" b="50"/>
+ <a u="0051" b="51"/>
+ <a u="0052" b="52"/>
+ <a u="0053" b="53"/>
+ <a u="0054" b="54"/>
+ <a u="0055" b="55"/>
+ <a u="0056" b="56"/>
+ <a u="0057" b="57"/>
+ <a u="0058" b="58"/>
+ <a u="0059" b="59"/>
+ <a u="005A" b="5A"/>
+ <a u="005B" b="5B"/>
+ <a u="005C" b="5C"/>
+ <a u="005D" b="5D"/>
+ <a u="005E" b="5E"/>
+ <a u="005F" b="5F"/>
+ <a u="0060" b="60"/>
+ <a u="0061" b="61"/>
+ <a u="0062" b="62"/>
+ <a u="0063" b="63"/>
+ <a u="0064" b="64"/>
+ <a u="0065" b="65"/>
+ <a u="0066" b="66"/>
+ <a u="0067" b="67"/>
+ <a u="0068" b="68"/>
+ <a u="0069" b="69"/>
+ <a u="006A" b="6A"/>
+ <a u="006B" b="6B"/>
+ <a u="006C" b="6C"/>
+ <a u="006D" b="6D"/>
+ <a u="006E" b="6E"/>
+ <a u="006F" b="6F"/>
+ <a u="0070" b="70"/>
+ <a u="0071" b="71"/>
+ <a u="0072" b="72"/>
+ <a u="0073" b="73"/>
+ <a u="0074" b="74"/>
+ <a u="0075" b="75"/>
+ <a u="0076" b="76"/>
+ <a u="0077" b="77"/>
+ <a u="0078" b="78"/>
+ <a u="0079" b="79"/>
+ <a u="007A" b="7A"/>
+ <a u="007B" b="7B"/>
+ <a u="007C" b="7C"/>
+ <a u="007D" b="7D"/>
+ <a u="007E" b="7E"/>
+ <a u="007F" b="7F"/>
+ <a u="0080" b="81 30 81 30"/>
+ <a u="0081" b="81 30 81 31"/>
+ <a u="0082" b="81 30 81 32"/>
+ <a u="0083" b="81 30 81 33"/>
+ <a u="0084" b="81 30 81 34"/>
+ <a u="0085" b="81 30 81 35"/>
+ <a u="0086" b="81 30 81 36"/>
+ <a u="0087" b="81 30 81 37"/>
+ <a u="0088" b="81 30 81 38"/>
+ <a u="0089" b="81 30 81 39"/>
+ <a u="008A" b="81 30 82 30"/>
+ <a u="008B" b="81 30 82 31"/>
+ <a u="008C" b="81 30 82 32"/>
+ <a u="008D" b="81 30 82 33"/>
+ <a u="008E" b="81 30 82 34"/>
+ <a u="008F" b="81 30 82 35"/>
+ <a u="0090" b="81 30 82 36"/>
+ <a u="0091" b="81 30 82 37"/>
+ <a u="0092" b="81 30 82 38"/>
+ <a u="0093" b="81 30 82 39"/>
+ <a u="0094" b="81 30 83 30"/>
+ <a u="0095" b="81 30 83 31"/>
+ <a u="0096" b="81 30 83 32"/>
+ <a u="0097" b="81 30 83 33"/>
+ <a u="0098" b="81 30 83 34"/>
+ <a u="0099" b="81 30 83 35"/>
+ <a u="009A" b="81 30 83 36"/>
+ <a u="009B" b="81 30 83 37"/>
+ <a u="009C" b="81 30 83 38"/>
+ <a u="009D" b="81 30 83 39"/>
+ <a u="009E" b="81 30 84 30"/>
+ <a u="009F" b="81 30 84 31"/>
+ <a u="00A0" b="81 30 84 32"/>
+ <a u="00A1" b="81 30 84 33"/>
+ <a u="00A2" b="81 30 84 34"/>
+ <a u="00A3" b="81 30 84 35"/>
+ <a u="00A4" b="A1 E8"/>
+ <a u="00A5" b="81 30 84 36"/>
+ <a u="00A6" b="81 30 84 37"/>
+ <a u="00A7" b="A1 EC"/>
+ <a u="00A8" b="A1 A7"/>
+ <a u="00A9" b="81 30 84 38"/>
+ <a u="00AA" b="81 30 84 39"/>
+ <a u="00AB" b="81 30 85 30"/>
+ <a u="00AC" b="81 30 85 31"/>
+ <a u="00AD" b="81 30 85 32"/>
+ <a u="00AE" b="81 30 85 33"/>
+ <a u="00AF" b="81 30 85 34"/>
+ <a u="00B0" b="A1 E3"/>
+ <a u="00B1" b="A1 C0"/>
+ <a u="00B2" b="81 30 85 35"/>
+ <a u="00B3" b="81 30 85 36"/>
+ <a u="00B4" b="81 30 85 37"/>
+ <a u="00B5" b="81 30 85 38"/>
+ <a u="00B6" b="81 30 85 39"/>
+ <a u="00B7" b="A1 A4"/>
+ <a u="00B8" b="81 30 86 30"/>
+ <a u="00B9" b="81 30 86 31"/>
+ <a u="00BA" b="81 30 86 32"/>
+ <a u="00BB" b="81 30 86 33"/>
+ <a u="00BC" b="81 30 86 34"/>
+ <a u="00BD" b="81 30 86 35"/>
+ <a u="00BE" b="81 30 86 36"/>
+ <a u="00BF" b="81 30 86 37"/>
+ <a u="00C0" b="81 30 86 38"/>
+ <a u="00C1" b="81 30 86 39"/>
+ <a u="00C2" b="81 30 87 30"/>
+ <a u="00C3" b="81 30 87 31"/>
+ <a u="00C4" b="81 30 87 32"/>
+ <a u="00C5" b="81 30 87 33"/>
+ <a u="00C6" b="81 30 87 34"/>
+ <a u="00C7" b="81 30 87 35"/>
+ <a u="00C8" b="81 30 87 36"/>
+ <a u="00C9" b="81 30 87 37"/>
+ <a u="00CA" b="81 30 87 38"/>
+ <a u="00CB" b="81 30 87 39"/>
+ <a u="00CC" b="81 30 88 30"/>
+ <a u="00CD" b="81 30 88 31"/>
+ <a u="00CE" b="81 30 88 32"/>
+ <a u="00CF" b="81 30 88 33"/>
+ <a u="00D0" b="81 30 88 34"/>
+ <a u="00D1" b="81 30 88 35"/>
+ <a u="00D2" b="81 30 88 36"/>
+ <a u="00D3" b="81 30 88 37"/>
+ <a u="00D4" b="81 30 88 38"/>
+ <a u="00D5" b="81 30 88 39"/>
+ <a u="00D6" b="81 30 89 30"/>
+ <a u="00D7" b="A1 C1"/>
+ <a u="00D8" b="81 30 89 31"/>
+ <a u="00D9" b="81 30 89 32"/>
+ <a u="00DA" b="81 30 89 33"/>
+ <a u="00DB" b="81 30 89 34"/>
+ <a u="00DC" b="81 30 89 35"/>
+ <a u="00DD" b="81 30 89 36"/>
+ <a u="00DE" b="81 30 89 37"/>
+ <a u="00DF" b="81 30 89 38"/>
+ <a u="00E0" b="A8 A4"/>
+ <a u="00E1" b="A8 A2"/>
+ <a u="00E2" b="81 30 89 39"/>
+ <a u="00E3" b="81 30 8A 30"/>
+ <a u="00E4" b="81 30 8A 31"/>
+ <a u="00E5" b="81 30 8A 32"/>
+ <a u="00E6" b="81 30 8A 33"/>
+ <a u="00E7" b="81 30 8A 34"/>
+ <a u="00E8" b="A8 A8"/>
+ <a u="00E9" b="A8 A6"/>
+ <a u="00EA" b="A8 BA"/>
+ <a u="00EB" b="81 30 8A 35"/>
+ <a u="00EC" b="A8 AC"/>
+ <a u="00ED" b="A8 AA"/>
+ <a u="00EE" b="81 30 8A 36"/>
+ <a u="00EF" b="81 30 8A 37"/>
+ <a u="00F0" b="81 30 8A 38"/>
+ <a u="00F1" b="81 30 8A 39"/>
+ <a u="00F2" b="A8 B0"/>
+ <a u="00F3" b="A8 AE"/>
+ <a u="00F4" b="81 30 8B 30"/>
+ <a u="00F5" b="81 30 8B 31"/>
+ <a u="00F6" b="81 30 8B 32"/>
+ <a u="00F7" b="A1 C2"/>
+ <a u="00F8" b="81 30 8B 33"/>
+ <a u="00F9" b="A8 B4"/>
+ <a u="00FA" b="A8 B2"/>
+ <a u="00FB" b="81 30 8B 34"/>
+ <a u="00FC" b="A8 B9"/>
+ <a u="00FD" b="81 30 8B 35"/>
+ <a u="00FE" b="81 30 8B 36"/>
+ <a u="00FF" b="81 30 8B 37"/>
+ <a u="0100" b="81 30 8B 38"/>
+ <a u="0101" b="A8 A1"/>
+ <a u="0102" b="81 30 8B 39"/>
+ <a u="0103" b="81 30 8C 30"/>
+ <a u="0104" b="81 30 8C 31"/>
+ <a u="0105" b="81 30 8C 32"/>
+ <a u="0106" b="81 30 8C 33"/>
+ <a u="0107" b="81 30 8C 34"/>
+ <a u="0108" b="81 30 8C 35"/>
+ <a u="0109" b="81 30 8C 36"/>
+ <a u="010A" b="81 30 8C 37"/>
+ <a u="010B" b="81 30 8C 38"/>
+ <a u="010C" b="81 30 8C 39"/>
+ <a u="010D" b="81 30 8D 30"/>
+ <a u="010E" b="81 30 8D 31"/>
+ <a u="010F" b="81 30 8D 32"/>
+ <a u="0110" b="81 30 8D 33"/>
+ <a u="0111" b="81 30 8D 34"/>
+ <a u="0112" b="81 30 8D 35"/>
+ <a u="0113" b="A8 A5"/>
+ <a u="0114" b="81 30 8D 36"/>
+ <a u="0115" b="81 30 8D 37"/>
+ <a u="0116" b="81 30 8D 38"/>
+ <a u="0117" b="81 30 8D 39"/>
+ <a u="0118" b="81 30 8E 30"/>
+ <a u="0119" b="81 30 8E 31"/>
+ <a u="011A" b="81 30 8E 32"/>
+ <a u="011B" b="A8 A7"/>
+ <a u="011C" b="81 30 8E 33"/>
+ <a u="011D" b="81 30 8E 34"/>
+ <a u="011E" b="81 30 8E 35"/>
+ <a u="011F" b="81 30 8E 36"/>
+ <a u="0120" b="81 30 8E 37"/>
+ <a u="0121" b="81 30 8E 38"/>
+ <a u="0122" b="81 30 8E 39"/>
+ <a u="0123" b="81 30 8F 30"/>
+ <a u="0124" b="81 30 8F 31"/>
+ <a u="0125" b="81 30 8F 32"/>
+ <a u="0126" b="81 30 8F 33"/>
+ <a u="0127" b="81 30 8F 34"/>
+ <a u="0128" b="81 30 8F 35"/>
+ <a u="0129" b="81 30 8F 36"/>
+ <a u="012A" b="81 30 8F 37"/>
+ <a u="012B" b="A8 A9"/>
+ <a u="012C" b="81 30 8F 38"/>
+ <a u="012D" b="81 30 8F 39"/>
+ <a u="012E" b="81 30 90 30"/>
+ <a u="012F" b="81 30 90 31"/>
+ <a u="0130" b="81 30 90 32"/>
+ <a u="0131" b="81 30 90 33"/>
+ <a u="0132" b="81 30 90 34"/>
+ <a u="0133" b="81 30 90 35"/>
+ <a u="0134" b="81 30 90 36"/>
+ <a u="0135" b="81 30 90 37"/>
+ <a u="0136" b="81 30 90 38"/>
+ <a u="0137" b="81 30 90 39"/>
+ <a u="0138" b="81 30 91 30"/>
+ <a u="0139" b="81 30 91 31"/>
+ <a u="013A" b="81 30 91 32"/>
+ <a u="013B" b="81 30 91 33"/>
+ <a u="013C" b="81 30 91 34"/>
+ <a u="013D" b="81 30 91 35"/>
+ <a u="013E" b="81 30 91 36"/>
+ <a u="013F" b="81 30 91 37"/>
+ <a u="0140" b="81 30 91 38"/>
+ <a u="0141" b="81 30 91 39"/>
+ <a u="0142" b="81 30 92 30"/>
+ <a u="0143" b="81 30 92 31"/>
+ <a u="0144" b="A8 BD"/>
+ <a u="0145" b="81 30 92 32"/>
+ <a u="0146" b="81 30 92 33"/>
+ <a u="0147" b="81 30 92 34"/>
+ <a u="0148" b="A8 BE"/>
+ <a u="0149" b="81 30 92 35"/>
+ <a u="014A" b="81 30 92 36"/>
+ <a u="014B" b="81 30 92 37"/>
+ <a u="014C" b="81 30 92 38"/>
+ <a u="014D" b="A8 AD"/>
+ <a u="014E" b="81 30 92 39"/>
+ <a u="014F" b="81 30 93 30"/>
+ <a u="0150" b="81 30 93 31"/>
+ <a u="0151" b="81 30 93 32"/>
+ <a u="0152" b="81 30 93 33"/>
+ <a u="0153" b="81 30 93 34"/>
+ <a u="0154" b="81 30 93 35"/>
+ <a u="0155" b="81 30 93 36"/>
+ <a u="0156" b="81 30 93 37"/>
+ <a u="0157" b="81 30 93 38"/>
+ <a u="0158" b="81 30 93 39"/>
+ <a u="0159" b="81 30 94 30"/>
+ <a u="015A" b="81 30 94 31"/>
+ <a u="015B" b="81 30 94 32"/>
+ <a u="015C" b="81 30 94 33"/>
+ <a u="015D" b="81 30 94 34"/>
+ <a u="015E" b="81 30 94 35"/>
+ <a u="015F" b="81 30 94 36"/>
+ <a u="0160" b="81 30 94 37"/>
+ <a u="0161" b="81 30 94 38"/>
+ <a u="0162" b="81 30 94 39"/>
+ <a u="0163" b="81 30 95 30"/>
+ <a u="0164" b="81 30 95 31"/>
+ <a u="0165" b="81 30 95 32"/>
+ <a u="0166" b="81 30 95 33"/>
+ <a u="0167" b="81 30 95 34"/>
+ <a u="0168" b="81 30 95 35"/>
+ <a u="0169" b="81 30 95 36"/>
+ <a u="016A" b="81 30 95 37"/>
+ <a u="016B" b="A8 B1"/>
+ <a u="016C" b="81 30 95 38"/>
+ <a u="016D" b="81 30 95 39"/>
+ <a u="016E" b="81 30 96 30"/>
+ <a u="016F" b="81 30 96 31"/>
+ <a u="0170" b="81 30 96 32"/>
+ <a u="0171" b="81 30 96 33"/>
+ <a u="0172" b="81 30 96 34"/>
+ <a u="0173" b="81 30 96 35"/>
+ <a u="0174" b="81 30 96 36"/>
+ <a u="0175" b="81 30 96 37"/>
+ <a u="0176" b="81 30 96 38"/>
+ <a u="0177" b="81 30 96 39"/>
+ <a u="0178" b="81 30 97 30"/>
+ <a u="0179" b="81 30 97 31"/>
+ <a u="017A" b="81 30 97 32"/>
+ <a u="017B" b="81 30 97 33"/>
+ <a u="017C" b="81 30 97 34"/>
+ <a u="017D" b="81 30 97 35"/>
+ <a u="017E" b="81 30 97 36"/>
+ <a u="017F" b="81 30 97 37"/>
+ <a u="0180" b="81 30 97 38"/>
+ <a u="0181" b="81 30 97 39"/>
+ <a u="0182" b="81 30 98 30"/>
+ <a u="0183" b="81 30 98 31"/>
+ <a u="0184" b="81 30 98 32"/>
+ <a u="0185" b="81 30 98 33"/>
+ <a u="0186" b="81 30 98 34"/>
+ <a u="0187" b="81 30 98 35"/>
+ <a u="0188" b="81 30 98 36"/>
+ <a u="0189" b="81 30 98 37"/>
+ <a u="018A" b="81 30 98 38"/>
+ <a u="018B" b="81 30 98 39"/>
+ <a u="018C" b="81 30 99 30"/>
+ <a u="018D" b="81 30 99 31"/>
+ <a u="018E" b="81 30 99 32"/>
+ <a u="018F" b="81 30 99 33"/>
+ <a u="0190" b="81 30 99 34"/>
+ <a u="0191" b="81 30 99 35"/>
+ <a u="0192" b="81 30 99 36"/>
+ <a u="0193" b="81 30 99 37"/>
+ <a u="0194" b="81 30 99 38"/>
+ <a u="0195" b="81 30 99 39"/>
+ <a u="0196" b="81 30 9A 30"/>
+ <a u="0197" b="81 30 9A 31"/>
+ <a u="0198" b="81 30 9A 32"/>
+ <a u="0199" b="81 30 9A 33"/>
+ <a u="019A" b="81 30 9A 34"/>
+ <a u="019B" b="81 30 9A 35"/>
+ <a u="019C" b="81 30 9A 36"/>
+ <a u="019D" b="81 30 9A 37"/>
+ <a u="019E" b="81 30 9A 38"/>
+ <a u="019F" b="81 30 9A 39"/>
+ <a u="01A0" b="81 30 9B 30"/>
+ <a u="01A1" b="81 30 9B 31"/>
+ <a u="01A2" b="81 30 9B 32"/>
+ <a u="01A3" b="81 30 9B 33"/>
+ <a u="01A4" b="81 30 9B 34"/>
+ <a u="01A5" b="81 30 9B 35"/>
+ <a u="01A6" b="81 30 9B 36"/>
+ <a u="01A7" b="81 30 9B 37"/>
+ <a u="01A8" b="81 30 9B 38"/>
+ <a u="01A9" b="81 30 9B 39"/>
+ <a u="01AA" b="81 30 9C 30"/>
+ <a u="01AB" b="81 30 9C 31"/>
+ <a u="01AC" b="81 30 9C 32"/>
+ <a u="01AD" b="81 30 9C 33"/>
+ <a u="01AE" b="81 30 9C 34"/>
+ <a u="01AF" b="81 30 9C 35"/>
+ <a u="01B0" b="81 30 9C 36"/>
+ <a u="01B1" b="81 30 9C 37"/>
+ <a u="01B2" b="81 30 9C 38"/>
+ <a u="01B3" b="81 30 9C 39"/>
+ <a u="01B4" b="81 30 9D 30"/>
+ <a u="01B5" b="81 30 9D 31"/>
+ <a u="01B6" b="81 30 9D 32"/>
+ <a u="01B7" b="81 30 9D 33"/>
+ <a u="01B8" b="81 30 9D 34"/>
+ <a u="01B9" b="81 30 9D 35"/>
+ <a u="01BA" b="81 30 9D 36"/>
+ <a u="01BB" b="81 30 9D 37"/>
+ <a u="01BC" b="81 30 9D 38"/>
+ <a u="01BD" b="81 30 9D 39"/>
+ <a u="01BE" b="81 30 9E 30"/>
+ <a u="01BF" b="81 30 9E 31"/>
+ <a u="01C0" b="81 30 9E 32"/>
+ <a u="01C1" b="81 30 9E 33"/>
+ <a u="01C2" b="81 30 9E 34"/>
+ <a u="01C3" b="81 30 9E 35"/>
+ <a u="01C4" b="81 30 9E 36"/>
+ <a u="01C5" b="81 30 9E 37"/>
+ <a u="01C6" b="81 30 9E 38"/>
+ <a u="01C7" b="81 30 9E 39"/>
+ <a u="01C8" b="81 30 9F 30"/>
+ <a u="01C9" b="81 30 9F 31"/>
+ <a u="01CA" b="81 30 9F 32"/>
+ <a u="01CB" b="81 30 9F 33"/>
+ <a u="01CC" b="81 30 9F 34"/>
+ <a u="01CD" b="81 30 9F 35"/>
+ <a u="01CE" b="A8 A3"/>
+ <a u="01CF" b="81 30 9F 36"/>
+ <a u="01D0" b="A8 AB"/>
+ <a u="01D1" b="81 30 9F 37"/>
+ <a u="01D2" b="A8 AF"/>
+ <a u="01D3" b="81 30 9F 38"/>
+ <a u="01D4" b="A8 B3"/>
+ <a u="01D5" b="81 30 9F 39"/>
+ <a u="01D6" b="A8 B5"/>
+ <a u="01D7" b="81 30 A0 30"/>
+ <a u="01D8" b="A8 B6"/>
+ <a u="01D9" b="81 30 A0 31"/>
+ <a u="01DA" b="A8 B7"/>
+ <a u="01DB" b="81 30 A0 32"/>
+ <a u="01DC" b="A8 B8"/>
+ <a u="01DD" b="81 30 A0 33"/>
+ <a u="01DE" b="81 30 A0 34"/>
+ <a u="01DF" b="81 30 A0 35"/>
+ <a u="01E0" b="81 30 A0 36"/>
+ <a u="01E1" b="81 30 A0 37"/>
+ <a u="01E2" b="81 30 A0 38"/>
+ <a u="01E3" b="81 30 A0 39"/>
+ <a u="01E4" b="81 30 A1 30"/>
+ <a u="01E5" b="81 30 A1 31"/>
+ <a u="01E6" b="81 30 A1 32"/>
+ <a u="01E7" b="81 30 A1 33"/>
+ <a u="01E8" b="81 30 A1 34"/>
+ <a u="01E9" b="81 30 A1 35"/>
+ <a u="01EA" b="81 30 A1 36"/>
+ <a u="01EB" b="81 30 A1 37"/>
+ <a u="01EC" b="81 30 A1 38"/>
+ <a u="01ED" b="81 30 A1 39"/>
+ <a u="01EE" b="81 30 A2 30"/>
+ <a u="01EF" b="81 30 A2 31"/>
+ <a u="01F0" b="81 30 A2 32"/>
+ <a u="01F1" b="81 30 A2 33"/>
+ <a u="01F2" b="81 30 A2 34"/>
+ <a u="01F3" b="81 30 A2 35"/>
+ <a u="01F4" b="81 30 A2 36"/>
+ <a u="01F5" b="81 30 A2 37"/>
+ <a u="01F6" b="81 30 A2 38"/>
+ <a u="01F7" b="81 30 A2 39"/>
+ <a u="01F8" b="81 30 A3 30"/>
+ <a u="01F9" b="A8 BF"/>
+ <a u="01FA" b="81 30 A3 31"/>
+ <a u="01FB" b="81 30 A3 32"/>
+ <a u="01FC" b="81 30 A3 33"/>
+ <a u="01FD" b="81 30 A3 34"/>
+ <a u="01FE" b="81 30 A3 35"/>
+ <a u="01FF" b="81 30 A3 36"/>
+ <a u="0200" b="81 30 A3 37"/>
+ <a u="0201" b="81 30 A3 38"/>
+ <a u="0202" b="81 30 A3 39"/>
+ <a u="0203" b="81 30 A4 30"/>
+ <a u="0204" b="81 30 A4 31"/>
+ <a u="0205" b="81 30 A4 32"/>
+ <a u="0206" b="81 30 A4 33"/>
+ <a u="0207" b="81 30 A4 34"/>
+ <a u="0208" b="81 30 A4 35"/>
+ <a u="0209" b="81 30 A4 36"/>
+ <a u="020A" b="81 30 A4 37"/>
+ <a u="020B" b="81 30 A4 38"/>
+ <a u="020C" b="81 30 A4 39"/>
+ <a u="020D" b="81 30 A5 30"/>
+ <a u="020E" b="81 30 A5 31"/>
+ <a u="020F" b="81 30 A5 32"/>
+ <a u="0210" b="81 30 A5 33"/>
+ <a u="0211" b="81 30 A5 34"/>
+ <a u="0212" b="81 30 A5 35"/>
+ <a u="0213" b="81 30 A5 36"/>
+ <a u="0214" b="81 30 A5 37"/>
+ <a u="0215" b="81 30 A5 38"/>
+ <a u="0216" b="81 30 A5 39"/>
+ <a u="0217" b="81 30 A6 30"/>
+ <a u="0218" b="81 30 A6 31"/>
+ <a u="0219" b="81 30 A6 32"/>
+ <a u="021A" b="81 30 A6 33"/>
+ <a u="021B" b="81 30 A6 34"/>
+ <a u="021C" b="81 30 A6 35"/>
+ <a u="021D" b="81 30 A6 36"/>
+ <a u="021E" b="81 30 A6 37"/>
+ <a u="021F" b="81 30 A6 38"/>
+ <a u="0220" b="81 30 A6 39"/>
+ <a u="0221" b="81 30 A7 30"/>
+ <a u="0222" b="81 30 A7 31"/>
+ <a u="0223" b="81 30 A7 32"/>
+ <a u="0224" b="81 30 A7 33"/>
+ <a u="0225" b="81 30 A7 34"/>
+ <a u="0226" b="81 30 A7 35"/>
+ <a u="0227" b="81 30 A7 36"/>
+ <a u="0228" b="81 30 A7 37"/>
+ <a u="0229" b="81 30 A7 38"/>
+ <a u="022A" b="81 30 A7 39"/>
+ <a u="022B" b="81 30 A8 30"/>
+ <a u="022C" b="81 30 A8 31"/>
+ <a u="022D" b="81 30 A8 32"/>
+ <a u="022E" b="81 30 A8 33"/>
+ <a u="022F" b="81 30 A8 34"/>
+ <a u="0230" b="81 30 A8 35"/>
+ <a u="0231" b="81 30 A8 36"/>
+ <a u="0232" b="81 30 A8 37"/>
+ <a u="0233" b="81 30 A8 38"/>
+ <a u="0234" b="81 30 A8 39"/>
+ <a u="0235" b="81 30 A9 30"/>
+ <a u="0236" b="81 30 A9 31"/>
+ <a u="0237" b="81 30 A9 32"/>
+ <a u="0238" b="81 30 A9 33"/>
+ <a u="0239" b="81 30 A9 34"/>
+ <a u="023A" b="81 30 A9 35"/>
+ <a u="023B" b="81 30 A9 36"/>
+ <a u="023C" b="81 30 A9 37"/>
+ <a u="023D" b="81 30 A9 38"/>
+ <a u="023E" b="81 30 A9 39"/>
+ <a u="023F" b="81 30 AA 30"/>
+ <a u="0240" b="81 30 AA 31"/>
+ <a u="0241" b="81 30 AA 32"/>
+ <a u="0242" b="81 30 AA 33"/>
+ <a u="0243" b="81 30 AA 34"/>
+ <a u="0244" b="81 30 AA 35"/>
+ <a u="0245" b="81 30 AA 36"/>
+ <a u="0246" b="81 30 AA 37"/>
+ <a u="0247" b="81 30 AA 38"/>
+ <a u="0248" b="81 30 AA 39"/>
+ <a u="0249" b="81 30 AB 30"/>
+ <a u="024A" b="81 30 AB 31"/>
+ <a u="024B" b="81 30 AB 32"/>
+ <a u="024C" b="81 30 AB 33"/>
+ <a u="024D" b="81 30 AB 34"/>
+ <a u="024E" b="81 30 AB 35"/>
+ <a u="024F" b="81 30 AB 36"/>
+ <a u="0250" b="81 30 AB 37"/>
+ <a u="0251" b="A8 BB"/>
+ <a u="0252" b="81 30 AB 38"/>
+ <a u="0253" b="81 30 AB 39"/>
+ <a u="0254" b="81 30 AC 30"/>
+ <a u="0255" b="81 30 AC 31"/>
+ <a u="0256" b="81 30 AC 32"/>
+ <a u="0257" b="81 30 AC 33"/>
+ <a u="0258" b="81 30 AC 34"/>
+ <a u="0259" b="81 30 AC 35"/>
+ <a u="025A" b="81 30 AC 36"/>
+ <a u="025B" b="81 30 AC 37"/>
+ <a u="025C" b="81 30 AC 38"/>
+ <a u="025D" b="81 30 AC 39"/>
+ <a u="025E" b="81 30 AD 30"/>
+ <a u="025F" b="81 30 AD 31"/>
+ <a u="0260" b="81 30 AD 32"/>
+ <a u="0261" b="A8 C0"/>
+ <a u="0262" b="81 30 AD 33"/>
+ <a u="0263" b="81 30 AD 34"/>
+ <a u="0264" b="81 30 AD 35"/>
+ <a u="0265" b="81 30 AD 36"/>
+ <a u="0266" b="81 30 AD 37"/>
+ <a u="0267" b="81 30 AD 38"/>
+ <a u="0268" b="81 30 AD 39"/>
+ <a u="0269" b="81 30 AE 30"/>
+ <a u="026A" b="81 30 AE 31"/>
+ <a u="026B" b="81 30 AE 32"/>
+ <a u="026C" b="81 30 AE 33"/>
+ <a u="026D" b="81 30 AE 34"/>
+ <a u="026E" b="81 30 AE 35"/>
+ <a u="026F" b="81 30 AE 36"/>
+ <a u="0270" b="81 30 AE 37"/>
+ <a u="0271" b="81 30 AE 38"/>
+ <a u="0272" b="81 30 AE 39"/>
+ <a u="0273" b="81 30 AF 30"/>
+ <a u="0274" b="81 30 AF 31"/>
+ <a u="0275" b="81 30 AF 32"/>
+ <a u="0276" b="81 30 AF 33"/>
+ <a u="0277" b="81 30 AF 34"/>
+ <a u="0278" b="81 30 AF 35"/>
+ <a u="0279" b="81 30 AF 36"/>
+ <a u="027A" b="81 30 AF 37"/>
+ <a u="027B" b="81 30 AF 38"/>
+ <a u="027C" b="81 30 AF 39"/>
+ <a u="027D" b="81 30 B0 30"/>
+ <a u="027E" b="81 30 B0 31"/>
+ <a u="027F" b="81 30 B0 32"/>
+ <a u="0280" b="81 30 B0 33"/>
+ <a u="0281" b="81 30 B0 34"/>
+ <a u="0282" b="81 30 B0 35"/>
+ <a u="0283" b="81 30 B0 36"/>
+ <a u="0284" b="81 30 B0 37"/>
+ <a u="0285" b="81 30 B0 38"/>
+ <a u="0286" b="81 30 B0 39"/>
+ <a u="0287" b="81 30 B1 30"/>
+ <a u="0288" b="81 30 B1 31"/>
+ <a u="0289" b="81 30 B1 32"/>
+ <a u="028A" b="81 30 B1 33"/>
+ <a u="028B" b="81 30 B1 34"/>
+ <a u="028C" b="81 30 B1 35"/>
+ <a u="028D" b="81 30 B1 36"/>
+ <a u="028E" b="81 30 B1 37"/>
+ <a u="028F" b="81 30 B1 38"/>
+ <a u="0290" b="81 30 B1 39"/>
+ <a u="0291" b="81 30 B2 30"/>
+ <a u="0292" b="81 30 B2 31"/>
+ <a u="0293" b="81 30 B2 32"/>
+ <a u="0294" b="81 30 B2 33"/>
+ <a u="0295" b="81 30 B2 34"/>
+ <a u="0296" b="81 30 B2 35"/>
+ <a u="0297" b="81 30 B2 36"/>
+ <a u="0298" b="81 30 B2 37"/>
+ <a u="0299" b="81 30 B2 38"/>
+ <a u="029A" b="81 30 B2 39"/>
+ <a u="029B" b="81 30 B3 30"/>
+ <a u="029C" b="81 30 B3 31"/>
+ <a u="029D" b="81 30 B3 32"/>
+ <a u="029E" b="81 30 B3 33"/>
+ <a u="029F" b="81 30 B3 34"/>
+ <a u="02A0" b="81 30 B3 35"/>
+ <a u="02A1" b="81 30 B3 36"/>
+ <a u="02A2" b="81 30 B3 37"/>
+ <a u="02A3" b="81 30 B3 38"/>
+ <a u="02A4" b="81 30 B3 39"/>
+ <a u="02A5" b="81 30 B4 30"/>
+ <a u="02A6" b="81 30 B4 31"/>
+ <a u="02A7" b="81 30 B4 32"/>
+ <a u="02A8" b="81 30 B4 33"/>
+ <a u="02A9" b="81 30 B4 34"/>
+ <a u="02AA" b="81 30 B4 35"/>
+ <a u="02AB" b="81 30 B4 36"/>
+ <a u="02AC" b="81 30 B4 37"/>
+ <a u="02AD" b="81 30 B4 38"/>
+ <a u="02AE" b="81 30 B4 39"/>
+ <a u="02AF" b="81 30 B5 30"/>
+ <a u="02B0" b="81 30 B5 31"/>
+ <a u="02B1" b="81 30 B5 32"/>
+ <a u="02B2" b="81 30 B5 33"/>
+ <a u="02B3" b="81 30 B5 34"/>
+ <a u="02B4" b="81 30 B5 35"/>
+ <a u="02B5" b="81 30 B5 36"/>
+ <a u="02B6" b="81 30 B5 37"/>
+ <a u="02B7" b="81 30 B5 38"/>
+ <a u="02B8" b="81 30 B5 39"/>
+ <a u="02B9" b="81 30 B6 30"/>
+ <a u="02BA" b="81 30 B6 31"/>
+ <a u="02BB" b="81 30 B6 32"/>
+ <a u="02BC" b="81 30 B6 33"/>
+ <a u="02BD" b="81 30 B6 34"/>
+ <a u="02BE" b="81 30 B6 35"/>
+ <a u="02BF" b="81 30 B6 36"/>
+ <a u="02C0" b="81 30 B6 37"/>
+ <a u="02C1" b="81 30 B6 38"/>
+ <a u="02C2" b="81 30 B6 39"/>
+ <a u="02C3" b="81 30 B7 30"/>
+ <a u="02C4" b="81 30 B7 31"/>
+ <a u="02C5" b="81 30 B7 32"/>
+ <a u="02C6" b="81 30 B7 33"/>
+ <a u="02C7" b="A1 A6"/>
+ <a u="02C8" b="81 30 B7 34"/>
+ <a u="02C9" b="A1 A5"/>
+ <a u="02CA" b="A8 40"/>
+ <a u="02CB" b="A8 41"/>
+ <a u="02CC" b="81 30 B7 35"/>
+ <a u="02CD" b="81 30 B7 36"/>
+ <a u="02CE" b="81 30 B7 37"/>
+ <a u="02CF" b="81 30 B7 38"/>
+ <a u="02D0" b="81 30 B7 39"/>
+ <a u="02D1" b="81 30 B8 30"/>
+ <a u="02D2" b="81 30 B8 31"/>
+ <a u="02D3" b="81 30 B8 32"/>
+ <a u="02D4" b="81 30 B8 33"/>
+ <a u="02D5" b="81 30 B8 34"/>
+ <a u="02D6" b="81 30 B8 35"/>
+ <a u="02D7" b="81 30 B8 36"/>
+ <a u="02D8" b="81 30 B8 37"/>
+ <a u="02D9" b="A8 42"/>
+ <a u="02DA" b="81 30 B8 38"/>
+ <a u="02DB" b="81 30 B8 39"/>
+ <a u="02DC" b="81 30 B9 30"/>
+ <a u="02DD" b="81 30 B9 31"/>
+ <a u="02DE" b="81 30 B9 32"/>
+ <a u="02DF" b="81 30 B9 33"/>
+ <a u="02E0" b="81 30 B9 34"/>
+ <a u="02E1" b="81 30 B9 35"/>
+ <a u="02E2" b="81 30 B9 36"/>
+ <a u="02E3" b="81 30 B9 37"/>
+ <a u="02E4" b="81 30 B9 38"/>
+ <a u="02E5" b="81 30 B9 39"/>
+ <a u="02E6" b="81 30 BA 30"/>
+ <a u="02E7" b="81 30 BA 31"/>
+ <a u="02E8" b="81 30 BA 32"/>
+ <a u="02E9" b="81 30 BA 33"/>
+ <a u="02EA" b="81 30 BA 34"/>
+ <a u="02EB" b="81 30 BA 35"/>
+ <a u="02EC" b="81 30 BA 36"/>
+ <a u="02ED" b="81 30 BA 37"/>
+ <a u="02EE" b="81 30 BA 38"/>
+ <a u="02EF" b="81 30 BA 39"/>
+ <a u="02F0" b="81 30 BB 30"/>
+ <a u="02F1" b="81 30 BB 31"/>
+ <a u="02F2" b="81 30 BB 32"/>
+ <a u="02F3" b="81 30 BB 33"/>
+ <a u="02F4" b="81 30 BB 34"/>
+ <a u="02F5" b="81 30 BB 35"/>
+ <a u="02F6" b="81 30 BB 36"/>
+ <a u="02F7" b="81 30 BB 37"/>
+ <a u="02F8" b="81 30 BB 38"/>
+ <a u="02F9" b="81 30 BB 39"/>
+ <a u="02FA" b="81 30 BC 30"/>
+ <a u="02FB" b="81 30 BC 31"/>
+ <a u="02FC" b="81 30 BC 32"/>
+ <a u="02FD" b="81 30 BC 33"/>
+ <a u="02FE" b="81 30 BC 34"/>
+ <a u="02FF" b="81 30 BC 35"/>
+ <a u="0300" b="81 30 BC 36"/>
+ <a u="0301" b="81 30 BC 37"/>
+ <a u="0302" b="81 30 BC 38"/>
+ <a u="0303" b="81 30 BC 39"/>
+ <a u="0304" b="81 30 BD 30"/>
+ <a u="0305" b="81 30 BD 31"/>
+ <a u="0306" b="81 30 BD 32"/>
+ <a u="0307" b="81 30 BD 33"/>
+ <a u="0308" b="81 30 BD 34"/>
+ <a u="0309" b="81 30 BD 35"/>
+ <a u="030A" b="81 30 BD 36"/>
+ <a u="030B" b="81 30 BD 37"/>
+ <a u="030C" b="81 30 BD 38"/>
+ <a u="030D" b="81 30 BD 39"/>
+ <a u="030E" b="81 30 BE 30"/>
+ <a u="030F" b="81 30 BE 31"/>
+ <a u="0310" b="81 30 BE 32"/>
+ <a u="0311" b="81 30 BE 33"/>
+ <a u="0312" b="81 30 BE 34"/>
+ <a u="0313" b="81 30 BE 35"/>
+ <a u="0314" b="81 30 BE 36"/>
+ <a u="0315" b="81 30 BE 37"/>
+ <a u="0316" b="81 30 BE 38"/>
+ <a u="0317" b="81 30 BE 39"/>
+ <a u="0318" b="81 30 BF 30"/>
+ <a u="0319" b="81 30 BF 31"/>
+ <a u="031A" b="81 30 BF 32"/>
+ <a u="031B" b="81 30 BF 33"/>
+ <a u="031C" b="81 30 BF 34"/>
+ <a u="031D" b="81 30 BF 35"/>
+ <a u="031E" b="81 30 BF 36"/>
+ <a u="031F" b="81 30 BF 37"/>
+ <a u="0320" b="81 30 BF 38"/>
+ <a u="0321" b="81 30 BF 39"/>
+ <a u="0322" b="81 30 C0 30"/>
+ <a u="0323" b="81 30 C0 31"/>
+ <a u="0324" b="81 30 C0 32"/>
+ <a u="0325" b="81 30 C0 33"/>
+ <a u="0326" b="81 30 C0 34"/>
+ <a u="0327" b="81 30 C0 35"/>
+ <a u="0328" b="81 30 C0 36"/>
+ <a u="0329" b="81 30 C0 37"/>
+ <a u="032A" b="81 30 C0 38"/>
+ <a u="032B" b="81 30 C0 39"/>
+ <a u="032C" b="81 30 C1 30"/>
+ <a u="032D" b="81 30 C1 31"/>
+ <a u="032E" b="81 30 C1 32"/>
+ <a u="032F" b="81 30 C1 33"/>
+ <a u="0330" b="81 30 C1 34"/>
+ <a u="0331" b="81 30 C1 35"/>
+ <a u="0332" b="81 30 C1 36"/>
+ <a u="0333" b="81 30 C1 37"/>
+ <a u="0334" b="81 30 C1 38"/>
+ <a u="0335" b="81 30 C1 39"/>
+ <a u="0336" b="81 30 C2 30"/>
+ <a u="0337" b="81 30 C2 31"/>
+ <a u="0338" b="81 30 C2 32"/>
+ <a u="0339" b="81 30 C2 33"/>
+ <a u="033A" b="81 30 C2 34"/>
+ <a u="033B" b="81 30 C2 35"/>
+ <a u="033C" b="81 30 C2 36"/>
+ <a u="033D" b="81 30 C2 37"/>
+ <a u="033E" b="81 30 C2 38"/>
+ <a u="033F" b="81 30 C2 39"/>
+ <a u="0340" b="81 30 C3 30"/>
+ <a u="0341" b="81 30 C3 31"/>
+ <a u="0342" b="81 30 C3 32"/>
+ <a u="0343" b="81 30 C3 33"/>
+ <a u="0344" b="81 30 C3 34"/>
+ <a u="0345" b="81 30 C3 35"/>
+ <a u="0346" b="81 30 C3 36"/>
+ <a u="0347" b="81 30 C3 37"/>
+ <a u="0348" b="81 30 C3 38"/>
+ <a u="0349" b="81 30 C3 39"/>
+ <a u="034A" b="81 30 C4 30"/>
+ <a u="034B" b="81 30 C4 31"/>
+ <a u="034C" b="81 30 C4 32"/>
+ <a u="034D" b="81 30 C4 33"/>
+ <a u="034E" b="81 30 C4 34"/>
+ <a u="034F" b="81 30 C4 35"/>
+ <a u="0350" b="81 30 C4 36"/>
+ <a u="0351" b="81 30 C4 37"/>
+ <a u="0352" b="81 30 C4 38"/>
+ <a u="0353" b="81 30 C4 39"/>
+ <a u="0354" b="81 30 C5 30"/>
+ <a u="0355" b="81 30 C5 31"/>
+ <a u="0356" b="81 30 C5 32"/>
+ <a u="0357" b="81 30 C5 33"/>
+ <a u="0358" b="81 30 C5 34"/>
+ <a u="0359" b="81 30 C5 35"/>
+ <a u="035A" b="81 30 C5 36"/>
+ <a u="035B" b="81 30 C5 37"/>
+ <a u="035C" b="81 30 C5 38"/>
+ <a u="035D" b="81 30 C5 39"/>
+ <a u="035E" b="81 30 C6 30"/>
+ <a u="035F" b="81 30 C6 31"/>
+ <a u="0360" b="81 30 C6 32"/>
+ <a u="0361" b="81 30 C6 33"/>
+ <a u="0362" b="81 30 C6 34"/>
+ <a u="0363" b="81 30 C6 35"/>
+ <a u="0364" b="81 30 C6 36"/>
+ <a u="0365" b="81 30 C6 37"/>
+ <a u="0366" b="81 30 C6 38"/>
+ <a u="0367" b="81 30 C6 39"/>
+ <a u="0368" b="81 30 C7 30"/>
+ <a u="0369" b="81 30 C7 31"/>
+ <a u="036A" b="81 30 C7 32"/>
+ <a u="036B" b="81 30 C7 33"/>
+ <a u="036C" b="81 30 C7 34"/>
+ <a u="036D" b="81 30 C7 35"/>
+ <a u="036E" b="81 30 C7 36"/>
+ <a u="036F" b="81 30 C7 37"/>
+ <a u="0370" b="81 30 C7 38"/>
+ <a u="0371" b="81 30 C7 39"/>
+ <a u="0372" b="81 30 C8 30"/>
+ <a u="0373" b="81 30 C8 31"/>
+ <a u="0374" b="81 30 C8 32"/>
+ <a u="0375" b="81 30 C8 33"/>
+ <a u="0376" b="81 30 C8 34"/>
+ <a u="0377" b="81 30 C8 35"/>
+ <a u="0378" b="81 30 C8 36"/>
+ <a u="0379" b="81 30 C8 37"/>
+ <a u="037A" b="81 30 C8 38"/>
+ <a u="037B" b="81 30 C8 39"/>
+ <a u="037C" b="81 30 C9 30"/>
+ <a u="037D" b="81 30 C9 31"/>
+ <a u="037E" b="81 30 C9 32"/>
+ <a u="037F" b="81 30 C9 33"/>
+ <a u="0380" b="81 30 C9 34"/>
+ <a u="0381" b="81 30 C9 35"/>
+ <a u="0382" b="81 30 C9 36"/>
+ <a u="0383" b="81 30 C9 37"/>
+ <a u="0384" b="81 30 C9 38"/>
+ <a u="0385" b="81 30 C9 39"/>
+ <a u="0386" b="81 30 CA 30"/>
+ <a u="0387" b="81 30 CA 31"/>
+ <a u="0388" b="81 30 CA 32"/>
+ <a u="0389" b="81 30 CA 33"/>
+ <a u="038A" b="81 30 CA 34"/>
+ <a u="038B" b="81 30 CA 35"/>
+ <a u="038C" b="81 30 CA 36"/>
+ <a u="038D" b="81 30 CA 37"/>
+ <a u="038E" b="81 30 CA 38"/>
+ <a u="038F" b="81 30 CA 39"/>
+ <a u="0390" b="81 30 CB 30"/>
+ <a u="0391" b="A6 A1"/>
+ <a u="0392" b="A6 A2"/>
+ <a u="0393" b="A6 A3"/>
+ <a u="0394" b="A6 A4"/>
+ <a u="0395" b="A6 A5"/>
+ <a u="0396" b="A6 A6"/>
+ <a u="0397" b="A6 A7"/>
+ <a u="0398" b="A6 A8"/>
+ <a u="0399" b="A6 A9"/>
+ <a u="039A" b="A6 AA"/>
+ <a u="039B" b="A6 AB"/>
+ <a u="039C" b="A6 AC"/>
+ <a u="039D" b="A6 AD"/>
+ <a u="039E" b="A6 AE"/>
+ <a u="039F" b="A6 AF"/>
+ <a u="03A0" b="A6 B0"/>
+ <a u="03A1" b="A6 B1"/>
+ <a u="03A2" b="81 30 CB 31"/>
+ <a u="03A3" b="A6 B2"/>
+ <a u="03A4" b="A6 B3"/>
+ <a u="03A5" b="A6 B4"/>
+ <a u="03A6" b="A6 B5"/>
+ <a u="03A7" b="A6 B6"/>
+ <a u="03A8" b="A6 B7"/>
+ <a u="03A9" b="A6 B8"/>
+ <a u="03AA" b="81 30 CB 32"/>
+ <a u="03AB" b="81 30 CB 33"/>
+ <a u="03AC" b="81 30 CB 34"/>
+ <a u="03AD" b="81 30 CB 35"/>
+ <a u="03AE" b="81 30 CB 36"/>
+ <a u="03AF" b="81 30 CB 37"/>
+ <a u="03B0" b="81 30 CB 38"/>
+ <a u="03B1" b="A6 C1"/>
+ <a u="03B2" b="A6 C2"/>
+ <a u="03B3" b="A6 C3"/>
+ <a u="03B4" b="A6 C4"/>
+ <a u="03B5" b="A6 C5"/>
+ <a u="03B6" b="A6 C6"/>
+ <a u="03B7" b="A6 C7"/>
+ <a u="03B8" b="A6 C8"/>
+ <a u="03B9" b="A6 C9"/>
+ <a u="03BA" b="A6 CA"/>
+ <a u="03BB" b="A6 CB"/>
+ <a u="03BC" b="A6 CC"/>
+ <a u="03BD" b="A6 CD"/>
+ <a u="03BE" b="A6 CE"/>
+ <a u="03BF" b="A6 CF"/>
+ <a u="03C0" b="A6 D0"/>
+ <a u="03C1" b="A6 D1"/>
+ <a u="03C2" b="81 30 CB 39"/>
+ <a u="03C3" b="A6 D2"/>
+ <a u="03C4" b="A6 D3"/>
+ <a u="03C5" b="A6 D4"/>
+ <a u="03C6" b="A6 D5"/>
+ <a u="03C7" b="A6 D6"/>
+ <a u="03C8" b="A6 D7"/>
+ <a u="03C9" b="A6 D8"/>
+ <a u="03CA" b="81 30 CC 30"/>
+ <a u="03CB" b="81 30 CC 31"/>
+ <a u="03CC" b="81 30 CC 32"/>
+ <a u="03CD" b="81 30 CC 33"/>
+ <a u="03CE" b="81 30 CC 34"/>
+ <a u="03CF" b="81 30 CC 35"/>
+ <a u="03D0" b="81 30 CC 36"/>
+ <a u="03D1" b="81 30 CC 37"/>
+ <a u="03D2" b="81 30 CC 38"/>
+ <a u="03D3" b="81 30 CC 39"/>
+ <a u="03D4" b="81 30 CD 30"/>
+ <a u="03D5" b="81 30 CD 31"/>
+ <a u="03D6" b="81 30 CD 32"/>
+ <a u="03D7" b="81 30 CD 33"/>
+ <a u="03D8" b="81 30 CD 34"/>
+ <a u="03D9" b="81 30 CD 35"/>
+ <a u="03DA" b="81 30 CD 36"/>
+ <a u="03DB" b="81 30 CD 37"/>
+ <a u="03DC" b="81 30 CD 38"/>
+ <a u="03DD" b="81 30 CD 39"/>
+ <a u="03DE" b="81 30 CE 30"/>
+ <a u="03DF" b="81 30 CE 31"/>
+ <a u="03E0" b="81 30 CE 32"/>
+ <a u="03E1" b="81 30 CE 33"/>
+ <a u="03E2" b="81 30 CE 34"/>
+ <a u="03E3" b="81 30 CE 35"/>
+ <a u="03E4" b="81 30 CE 36"/>
+ <a u="03E5" b="81 30 CE 37"/>
+ <a u="03E6" b="81 30 CE 38"/>
+ <a u="03E7" b="81 30 CE 39"/>
+ <a u="03E8" b="81 30 CF 30"/>
+ <a u="03E9" b="81 30 CF 31"/>
+ <a u="03EA" b="81 30 CF 32"/>
+ <a u="03EB" b="81 30 CF 33"/>
+ <a u="03EC" b="81 30 CF 34"/>
+ <a u="03ED" b="81 30 CF 35"/>
+ <a u="03EE" b="81 30 CF 36"/>
+ <a u="03EF" b="81 30 CF 37"/>
+ <a u="03F0" b="81 30 CF 38"/>
+ <a u="03F1" b="81 30 CF 39"/>
+ <a u="03F2" b="81 30 D0 30"/>
+ <a u="03F3" b="81 30 D0 31"/>
+ <a u="03F4" b="81 30 D0 32"/>
+ <a u="03F5" b="81 30 D0 33"/>
+ <a u="03F6" b="81 30 D0 34"/>
+ <a u="03F7" b="81 30 D0 35"/>
+ <a u="03F8" b="81 30 D0 36"/>
+ <a u="03F9" b="81 30 D0 37"/>
+ <a u="03FA" b="81 30 D0 38"/>
+ <a u="03FB" b="81 30 D0 39"/>
+ <a u="03FC" b="81 30 D1 30"/>
+ <a u="03FD" b="81 30 D1 31"/>
+ <a u="03FE" b="81 30 D1 32"/>
+ <a u="03FF" b="81 30 D1 33"/>
+ <a u="0400" b="81 30 D1 34"/>
+ <a u="0401" b="A7 A7"/>
+ <a u="0402" b="81 30 D1 35"/>
+ <a u="0403" b="81 30 D1 36"/>
+ <a u="0404" b="81 30 D1 37"/>
+ <a u="0405" b="81 30 D1 38"/>
+ <a u="0406" b="81 30 D1 39"/>
+ <a u="0407" b="81 30 D2 30"/>
+ <a u="0408" b="81 30 D2 31"/>
+ <a u="0409" b="81 30 D2 32"/>
+ <a u="040A" b="81 30 D2 33"/>
+ <a u="040B" b="81 30 D2 34"/>
+ <a u="040C" b="81 30 D2 35"/>
+ <a u="040D" b="81 30 D2 36"/>
+ <a u="040E" b="81 30 D2 37"/>
+ <a u="040F" b="81 30 D2 38"/>
+ <a u="0410" b="A7 A1"/>
+ <a u="0411" b="A7 A2"/>
+ <a u="0412" b="A7 A3"/>
+ <a u="0413" b="A7 A4"/>
+ <a u="0414" b="A7 A5"/>
+ <a u="0415" b="A7 A6"/>
+ <a u="0416" b="A7 A8"/>
+ <a u="0417" b="A7 A9"/>
+ <a u="0418" b="A7 AA"/>
+ <a u="0419" b="A7 AB"/>
+ <a u="041A" b="A7 AC"/>
+ <a u="041B" b="A7 AD"/>
+ <a u="041C" b="A7 AE"/>
+ <a u="041D" b="A7 AF"/>
+ <a u="041E" b="A7 B0"/>
+ <a u="041F" b="A7 B1"/>
+ <a u="0420" b="A7 B2"/>
+ <a u="0421" b="A7 B3"/>
+ <a u="0422" b="A7 B4"/>
+ <a u="0423" b="A7 B5"/>
+ <a u="0424" b="A7 B6"/>
+ <a u="0425" b="A7 B7"/>
+ <a u="0426" b="A7 B8"/>
+ <a u="0427" b="A7 B9"/>
+ <a u="0428" b="A7 BA"/>
+ <a u="0429" b="A7 BB"/>
+ <a u="042A" b="A7 BC"/>
+ <a u="042B" b="A7 BD"/>
+ <a u="042C" b="A7 BE"/>
+ <a u="042D" b="A7 BF"/>
+ <a u="042E" b="A7 C0"/>
+ <a u="042F" b="A7 C1"/>
+ <a u="0430" b="A7 D1"/>
+ <a u="0431" b="A7 D2"/>
+ <a u="0432" b="A7 D3"/>
+ <a u="0433" b="A7 D4"/>
+ <a u="0434" b="A7 D5"/>
+ <a u="0435" b="A7 D6"/>
+ <a u="0436" b="A7 D8"/>
+ <a u="0437" b="A7 D9"/>
+ <a u="0438" b="A7 DA"/>
+ <a u="0439" b="A7 DB"/>
+ <a u="043A" b="A7 DC"/>
+ <a u="043B" b="A7 DD"/>
+ <a u="043C" b="A7 DE"/>
+ <a u="043D" b="A7 DF"/>
+ <a u="043E" b="A7 E0"/>
+ <a u="043F" b="A7 E1"/>
+ <a u="0440" b="A7 E2"/>
+ <a u="0441" b="A7 E3"/>
+ <a u="0442" b="A7 E4"/>
+ <a u="0443" b="A7 E5"/>
+ <a u="0444" b="A7 E6"/>
+ <a u="0445" b="A7 E7"/>
+ <a u="0446" b="A7 E8"/>
+ <a u="0447" b="A7 E9"/>
+ <a u="0448" b="A7 EA"/>
+ <a u="0449" b="A7 EB"/>
+ <a u="044A" b="A7 EC"/>
+ <a u="044B" b="A7 ED"/>
+ <a u="044C" b="A7 EE"/>
+ <a u="044D" b="A7 EF"/>
+ <a u="044E" b="A7 F0"/>
+ <a u="044F" b="A7 F1"/>
+ <a u="0450" b="81 30 D2 39"/>
+ <a u="0451" b="A7 D7"/>
+ <a u="2010" b="A9 5C"/>
+ <a u="2011" b="81 36 A5 32"/>
+ <a u="2012" b="81 36 A5 33"/>
+ <a u="2013" b="A8 43"/>
+ <a u="2014" b="A1 AA"/>
+ <a u="2015" b="A8 44"/>
+ <a u="2016" b="A1 AC"/>
+ <a u="2017" b="81 36 A5 34"/>
+ <a u="2018" b="A1 AE"/>
+ <a u="2019" b="A1 AF"/>
+ <a u="201A" b="81 36 A5 35"/>
+ <a u="201B" b="81 36 A5 36"/>
+ <a u="201C" b="A1 B0"/>
+ <a u="201D" b="A1 B1"/>
+ <a u="201E" b="81 36 A5 37"/>
+ <a u="201F" b="81 36 A5 38"/>
+ <a u="2020" b="81 36 A5 39"/>
+ <a u="2021" b="81 36 A6 30"/>
+ <a u="2022" b="81 36 A6 31"/>
+ <a u="2023" b="81 36 A6 32"/>
+ <a u="2024" b="81 36 A6 33"/>
+ <a u="2025" b="A8 45"/>
+ <a u="2026" b="A1 AD"/>
+ <a u="2027" b="81 36 A6 34"/>
+ <a u="2028" b="81 36 A6 35"/>
+ <a u="2029" b="81 36 A6 36"/>
+ <a u="202A" b="81 36 A6 37"/>
+ <a u="202B" b="81 36 A6 38"/>
+ <a u="202C" b="81 36 A6 39"/>
+ <a u="202D" b="81 36 A7 30"/>
+ <a u="202E" b="81 36 A7 31"/>
+ <a u="202F" b="81 36 A7 32"/>
+ <a u="2030" b="A1 EB"/>
+ <a u="2031" b="81 36 A7 33"/>
+ <a u="2032" b="A1 E4"/>
+ <a u="2033" b="A1 E5"/>
+ <a u="2034" b="81 36 A7 34"/>
+ <a u="2035" b="A8 46"/>
+ <a u="2036" b="81 36 A7 35"/>
+ <a u="2037" b="81 36 A7 36"/>
+ <a u="2038" b="81 36 A7 37"/>
+ <a u="2039" b="81 36 A7 38"/>
+ <a u="203A" b="81 36 A7 39"/>
+ <a u="203B" b="A1 F9"/>
+ <a u="203C" b="81 36 A8 30"/>
+ <a u="203D" b="81 36 A8 31"/>
+ <a u="203E" b="81 36 A8 32"/>
+ <a u="203F" b="81 36 A8 33"/>
+ <a u="2040" b="81 36 A8 34"/>
+ <a u="2041" b="81 36 A8 35"/>
+ <a u="2042" b="81 36 A8 36"/>
+ <a u="2043" b="81 36 A8 37"/>
+ <a u="2044" b="81 36 A8 38"/>
+ <a u="2045" b="81 36 A8 39"/>
+ <a u="2046" b="81 36 A9 30"/>
+ <a u="2047" b="81 36 A9 31"/>
+ <a u="2048" b="81 36 A9 32"/>
+ <a u="2049" b="81 36 A9 33"/>
+ <a u="204A" b="81 36 A9 34"/>
+ <a u="204B" b="81 36 A9 35"/>
+ <a u="204C" b="81 36 A9 36"/>
+ <a u="204D" b="81 36 A9 37"/>
+ <a u="204E" b="81 36 A9 38"/>
+ <a u="204F" b="81 36 A9 39"/>
+ <a u="2050" b="81 36 AA 30"/>
+ <a u="2051" b="81 36 AA 31"/>
+ <a u="2052" b="81 36 AA 32"/>
+ <a u="2053" b="81 36 AA 33"/>
+ <a u="2054" b="81 36 AA 34"/>
+ <a u="2055" b="81 36 AA 35"/>
+ <a u="2056" b="81 36 AA 36"/>
+ <a u="2057" b="81 36 AA 37"/>
+ <a u="2058" b="81 36 AA 38"/>
+ <a u="2059" b="81 36 AA 39"/>
+ <a u="205A" b="81 36 AB 30"/>
+ <a u="205B" b="81 36 AB 31"/>
+ <a u="205C" b="81 36 AB 32"/>
+ <a u="205D" b="81 36 AB 33"/>
+ <a u="205E" b="81 36 AB 34"/>
+ <a u="205F" b="81 36 AB 35"/>
+ <a u="2060" b="81 36 AB 36"/>
+ <a u="2061" b="81 36 AB 37"/>
+ <a u="2062" b="81 36 AB 38"/>
+ <a u="2063" b="81 36 AB 39"/>
+ <a u="2064" b="81 36 AC 30"/>
+ <a u="2065" b="81 36 AC 31"/>
+ <a u="2066" b="81 36 AC 32"/>
+ <a u="2067" b="81 36 AC 33"/>
+ <a u="2068" b="81 36 AC 34"/>
+ <a u="2069" b="81 36 AC 35"/>
+ <a u="206A" b="81 36 AC 36"/>
+ <a u="206B" b="81 36 AC 37"/>
+ <a u="206C" b="81 36 AC 38"/>
+ <a u="206D" b="81 36 AC 39"/>
+ <a u="206E" b="81 36 AD 30"/>
+ <a u="206F" b="81 36 AD 31"/>
+ <a u="2070" b="81 36 AD 32"/>
+ <a u="2071" b="81 36 AD 33"/>
+ <a u="2072" b="81 36 AD 34"/>
+ <a u="2073" b="81 36 AD 35"/>
+ <a u="2074" b="81 36 AD 36"/>
+ <a u="2075" b="81 36 AD 37"/>
+ <a u="2076" b="81 36 AD 38"/>
+ <a u="2077" b="81 36 AD 39"/>
+ <a u="2078" b="81 36 AE 30"/>
+ <a u="2079" b="81 36 AE 31"/>
+ <a u="207A" b="81 36 AE 32"/>
+ <a u="207B" b="81 36 AE 33"/>
+ <a u="207C" b="81 36 AE 34"/>
+ <a u="207D" b="81 36 AE 35"/>
+ <a u="207E" b="81 36 AE 36"/>
+ <a u="207F" b="81 36 AE 37"/>
+ <a u="2080" b="81 36 AE 38"/>
+ <a u="2081" b="81 36 AE 39"/>
+ <a u="2082" b="81 36 AF 30"/>
+ <a u="2083" b="81 36 AF 31"/>
+ <a u="2084" b="81 36 AF 32"/>
+ <a u="2085" b="81 36 AF 33"/>
+ <a u="2086" b="81 36 AF 34"/>
+ <a u="2087" b="81 36 AF 35"/>
+ <a u="2088" b="81 36 AF 36"/>
+ <a u="2089" b="81 36 AF 37"/>
+ <a u="208A" b="81 36 AF 38"/>
+ <a u="208B" b="81 36 AF 39"/>
+ <a u="208C" b="81 36 B0 30"/>
+ <a u="208D" b="81 36 B0 31"/>
+ <a u="208E" b="81 36 B0 32"/>
+ <a u="208F" b="81 36 B0 33"/>
+ <a u="2090" b="81 36 B0 34"/>
+ <a u="2091" b="81 36 B0 35"/>
+ <a u="2092" b="81 36 B0 36"/>
+ <a u="2093" b="81 36 B0 37"/>
+ <a u="2094" b="81 36 B0 38"/>
+ <a u="2095" b="81 36 B0 39"/>
+ <a u="2096" b="81 36 B1 30"/>
+ <a u="2097" b="81 36 B1 31"/>
+ <a u="2098" b="81 36 B1 32"/>
+ <a u="2099" b="81 36 B1 33"/>
+ <a u="209A" b="81 36 B1 34"/>
+ <a u="209B" b="81 36 B1 35"/>
+ <a u="209C" b="81 36 B1 36"/>
+ <a u="209D" b="81 36 B1 37"/>
+ <a u="209E" b="81 36 B1 38"/>
+ <a u="209F" b="81 36 B1 39"/>
+ <a u="20A0" b="81 36 B2 30"/>
+ <a u="20A1" b="81 36 B2 31"/>
+ <a u="20A2" b="81 36 B2 32"/>
+ <a u="20A3" b="81 36 B2 33"/>
+ <a u="20A4" b="81 36 B2 34"/>
+ <a u="20A5" b="81 36 B2 35"/>
+ <a u="20A6" b="81 36 B2 36"/>
+ <a u="20A7" b="81 36 B2 37"/>
+ <a u="20A8" b="81 36 B2 38"/>
+ <a u="20A9" b="81 36 B2 39"/>
+ <a u="20AA" b="81 36 B3 30"/>
+ <a u="20AB" b="81 36 B3 31"/>
+ <a u="20AC" b="A2 E3"/>
+ <a u="20AD" b="81 36 B3 32"/>
+ <a u="20AE" b="81 36 B3 33"/>
+ <a u="20AF" b="81 36 B3 34"/>
+ <a u="20B0" b="81 36 B3 35"/>
+ <a u="20B1" b="81 36 B3 36"/>
+ <a u="20B2" b="81 36 B3 37"/>
+ <a u="20B3" b="81 36 B3 38"/>
+ <a u="20B4" b="81 36 B3 39"/>
+ <a u="20B5" b="81 36 B4 30"/>
+ <a u="20B6" b="81 36 B4 31"/>
+ <a u="20B7" b="81 36 B4 32"/>
+ <a u="20B8" b="81 36 B4 33"/>
+ <a u="20B9" b="81 36 B4 34"/>
+ <a u="20BA" b="81 36 B4 35"/>
+ <a u="20BB" b="81 36 B4 36"/>
+ <a u="20BC" b="81 36 B4 37"/>
+ <a u="20BD" b="81 36 B4 38"/>
+ <a u="20BE" b="81 36 B4 39"/>
+ <a u="20BF" b="81 36 B5 30"/>
+ <a u="20C0" b="81 36 B5 31"/>
+ <a u="20C1" b="81 36 B5 32"/>
+ <a u="20C2" b="81 36 B5 33"/>
+ <a u="20C3" b="81 36 B5 34"/>
+ <a u="20C4" b="81 36 B5 35"/>
+ <a u="20C5" b="81 36 B5 36"/>
+ <a u="20C6" b="81 36 B5 37"/>
+ <a u="20C7" b="81 36 B5 38"/>
+ <a u="20C8" b="81 36 B5 39"/>
+ <a u="20C9" b="81 36 B6 30"/>
+ <a u="20CA" b="81 36 B6 31"/>
+ <a u="20CB" b="81 36 B6 32"/>
+ <a u="20CC" b="81 36 B6 33"/>
+ <a u="20CD" b="81 36 B6 34"/>
+ <a u="20CE" b="81 36 B6 35"/>
+ <a u="20CF" b="81 36 B6 36"/>
+ <a u="20D0" b="81 36 B6 37"/>
+ <a u="20D1" b="81 36 B6 38"/>
+ <a u="20D2" b="81 36 B6 39"/>
+ <a u="20D3" b="81 36 B7 30"/>
+ <a u="20D4" b="81 36 B7 31"/>
+ <a u="20D5" b="81 36 B7 32"/>
+ <a u="20D6" b="81 36 B7 33"/>
+ <a u="20D7" b="81 36 B7 34"/>
+ <a u="20D8" b="81 36 B7 35"/>
+ <a u="20D9" b="81 36 B7 36"/>
+ <a u="20DA" b="81 36 B7 37"/>
+ <a u="20DB" b="81 36 B7 38"/>
+ <a u="20DC" b="81 36 B7 39"/>
+ <a u="20DD" b="81 36 B8 30"/>
+ <a u="20DE" b="81 36 B8 31"/>
+ <a u="20DF" b="81 36 B8 32"/>
+ <a u="20E0" b="81 36 B8 33"/>
+ <a u="20E1" b="81 36 B8 34"/>
+ <a u="20E2" b="81 36 B8 35"/>
+ <a u="20E3" b="81 36 B8 36"/>
+ <a u="20E4" b="81 36 B8 37"/>
+ <a u="20E5" b="81 36 B8 38"/>
+ <a u="20E6" b="81 36 B8 39"/>
+ <a u="20E7" b="81 36 B9 30"/>
+ <a u="20E8" b="81 36 B9 31"/>
+ <a u="20E9" b="81 36 B9 32"/>
+ <a u="20EA" b="81 36 B9 33"/>
+ <a u="20EB" b="81 36 B9 34"/>
+ <a u="20EC" b="81 36 B9 35"/>
+ <a u="20ED" b="81 36 B9 36"/>
+ <a u="20EE" b="81 36 B9 37"/>
+ <a u="20EF" b="81 36 B9 38"/>
+ <a u="20F0" b="81 36 B9 39"/>
+ <a u="20F1" b="81 36 BA 30"/>
+ <a u="20F2" b="81 36 BA 31"/>
+ <a u="20F3" b="81 36 BA 32"/>
+ <a u="20F4" b="81 36 BA 33"/>
+ <a u="20F5" b="81 36 BA 34"/>
+ <a u="20F6" b="81 36 BA 35"/>
+ <a u="20F7" b="81 36 BA 36"/>
+ <a u="20F8" b="81 36 BA 37"/>
+ <a u="20F9" b="81 36 BA 38"/>
+ <a u="20FA" b="81 36 BA 39"/>
+ <a u="20FB" b="81 36 BB 30"/>
+ <a u="20FC" b="81 36 BB 31"/>
+ <a u="20FD" b="81 36 BB 32"/>
+ <a u="20FE" b="81 36 BB 33"/>
+ <a u="20FF" b="81 36 BB 34"/>
+ <a u="2100" b="81 36 BB 35"/>
+ <a u="2101" b="81 36 BB 36"/>
+ <a u="2102" b="81 36 BB 37"/>
+ <a u="2103" b="A1 E6"/>
+ <a u="2104" b="81 36 BB 38"/>
+ <a u="2105" b="A8 47"/>
+ <a u="2106" b="81 36 BB 39"/>
+ <a u="2107" b="81 36 BC 30"/>
+ <a u="2108" b="81 36 BC 31"/>
+ <a u="2109" b="A8 48"/>
+ <a u="210A" b="81 36 BC 32"/>
+ <a u="210B" b="81 36 BC 33"/>
+ <a u="210C" b="81 36 BC 34"/>
+ <a u="210D" b="81 36 BC 35"/>
+ <a u="210E" b="81 36 BC 36"/>
+ <a u="210F" b="81 36 BC 37"/>
+ <a u="2110" b="81 36 BC 38"/>
+ <a u="2111" b="81 36 BC 39"/>
+ <a u="2112" b="81 36 BD 30"/>
+ <a u="2113" b="81 36 BD 31"/>
+ <a u="2114" b="81 36 BD 32"/>
+ <a u="2115" b="81 36 BD 33"/>
+ <a u="2116" b="A1 ED"/>
+ <a u="2117" b="81 36 BD 34"/>
+ <a u="2118" b="81 36 BD 35"/>
+ <a u="2119" b="81 36 BD 36"/>
+ <a u="211A" b="81 36 BD 37"/>
+ <a u="211B" b="81 36 BD 38"/>
+ <a u="211C" b="81 36 BD 39"/>
+ <a u="211D" b="81 36 BE 30"/>
+ <a u="211E" b="81 36 BE 31"/>
+ <a u="211F" b="81 36 BE 32"/>
+ <a u="2120" b="81 36 BE 33"/>
+ <a u="2121" b="A9 59"/>
+ <a u="2122" b="81 36 BE 34"/>
+ <a u="2123" b="81 36 BE 35"/>
+ <a u="2124" b="81 36 BE 36"/>
+ <a u="2125" b="81 36 BE 37"/>
+ <a u="2126" b="81 36 BE 38"/>
+ <a u="2127" b="81 36 BE 39"/>
+ <a u="2128" b="81 36 BF 30"/>
+ <a u="2129" b="81 36 BF 31"/>
+ <a u="212A" b="81 36 BF 32"/>
+ <a u="212B" b="81 36 BF 33"/>
+ <a u="212C" b="81 36 BF 34"/>
+ <a u="212D" b="81 36 BF 35"/>
+ <a u="212E" b="81 36 BF 36"/>
+ <a u="212F" b="81 36 BF 37"/>
+ <a u="2130" b="81 36 BF 38"/>
+ <a u="2131" b="81 36 BF 39"/>
+ <a u="2132" b="81 36 C0 30"/>
+ <a u="2133" b="81 36 C0 31"/>
+ <a u="2134" b="81 36 C0 32"/>
+ <a u="2135" b="81 36 C0 33"/>
+ <a u="2136" b="81 36 C0 34"/>
+ <a u="2137" b="81 36 C0 35"/>
+ <a u="2138" b="81 36 C0 36"/>
+ <a u="2139" b="81 36 C0 37"/>
+ <a u="213A" b="81 36 C0 38"/>
+ <a u="213B" b="81 36 C0 39"/>
+ <a u="213C" b="81 36 C1 30"/>
+ <a u="213D" b="81 36 C1 31"/>
+ <a u="213E" b="81 36 C1 32"/>
+ <a u="213F" b="81 36 C1 33"/>
+ <a u="2140" b="81 36 C1 34"/>
+ <a u="2141" b="81 36 C1 35"/>
+ <a u="2142" b="81 36 C1 36"/>
+ <a u="2143" b="81 36 C1 37"/>
+ <a u="2144" b="81 36 C1 38"/>
+ <a u="2145" b="81 36 C1 39"/>
+ <a u="2146" b="81 36 C2 30"/>
+ <a u="2147" b="81 36 C2 31"/>
+ <a u="2148" b="81 36 C2 32"/>
+ <a u="2149" b="81 36 C2 33"/>
+ <a u="214A" b="81 36 C2 34"/>
+ <a u="214B" b="81 36 C2 35"/>
+ <a u="214C" b="81 36 C2 36"/>
+ <a u="214D" b="81 36 C2 37"/>
+ <a u="214E" b="81 36 C2 38"/>
+ <a u="214F" b="81 36 C2 39"/>
+ <a u="2150" b="81 36 C3 30"/>
+ <a u="2151" b="81 36 C3 31"/>
+ <a u="2152" b="81 36 C3 32"/>
+ <a u="2153" b="81 36 C3 33"/>
+ <a u="2154" b="81 36 C3 34"/>
+ <a u="2155" b="81 36 C3 35"/>
+ <a u="2156" b="81 36 C3 36"/>
+ <a u="2157" b="81 36 C3 37"/>
+ <a u="2158" b="81 36 C3 38"/>
+ <a u="2159" b="81 36 C3 39"/>
+ <a u="215A" b="81 36 C4 30"/>
+ <a u="215B" b="81 36 C4 31"/>
+ <a u="215C" b="81 36 C4 32"/>
+ <a u="215D" b="81 36 C4 33"/>
+ <a u="215E" b="81 36 C4 34"/>
+ <a u="215F" b="81 36 C4 35"/>
+ <a u="2160" b="A2 F1"/>
+ <a u="2161" b="A2 F2"/>
+ <a u="2162" b="A2 F3"/>
+ <a u="2163" b="A2 F4"/>
+ <a u="2164" b="A2 F5"/>
+ <a u="2165" b="A2 F6"/>
+ <a u="2166" b="A2 F7"/>
+ <a u="2167" b="A2 F8"/>
+ <a u="2168" b="A2 F9"/>
+ <a u="2169" b="A2 FA"/>
+ <a u="216A" b="A2 FB"/>
+ <a u="216B" b="A2 FC"/>
+ <a u="216C" b="81 36 C4 36"/>
+ <a u="216D" b="81 36 C4 37"/>
+ <a u="216E" b="81 36 C4 38"/>
+ <a u="216F" b="81 36 C4 39"/>
+ <a u="2170" b="A2 A1"/>
+ <a u="2171" b="A2 A2"/>
+ <a u="2172" b="A2 A3"/>
+ <a u="2173" b="A2 A4"/>
+ <a u="2174" b="A2 A5"/>
+ <a u="2175" b="A2 A6"/>
+ <a u="2176" b="A2 A7"/>
+ <a u="2177" b="A2 A8"/>
+ <a u="2178" b="A2 A9"/>
+ <a u="2179" b="A2 AA"/>
+ <a u="217A" b="81 36 C5 30"/>
+ <a u="217B" b="81 36 C5 31"/>
+ <a u="217C" b="81 36 C5 32"/>
+ <a u="217D" b="81 36 C5 33"/>
+ <a u="217E" b="81 36 C5 34"/>
+ <a u="217F" b="81 36 C5 35"/>
+ <a u="2180" b="81 36 C5 36"/>
+ <a u="2181" b="81 36 C5 37"/>
+ <a u="2182" b="81 36 C5 38"/>
+ <a u="2183" b="81 36 C5 39"/>
+ <a u="2184" b="81 36 C6 30"/>
+ <a u="2185" b="81 36 C6 31"/>
+ <a u="2186" b="81 36 C6 32"/>
+ <a u="2187" b="81 36 C6 33"/>
+ <a u="2188" b="81 36 C6 34"/>
+ <a u="2189" b="81 36 C6 35"/>
+ <a u="218A" b="81 36 C6 36"/>
+ <a u="218B" b="81 36 C6 37"/>
+ <a u="218C" b="81 36 C6 38"/>
+ <a u="218D" b="81 36 C6 39"/>
+ <a u="218E" b="81 36 C7 30"/>
+ <a u="218F" b="81 36 C7 31"/>
+ <a u="2190" b="A1 FB"/>
+ <a u="2191" b="A1 FC"/>
+ <a u="2192" b="A1 FA"/>
+ <a u="2193" b="A1 FD"/>
+ <a u="2194" b="81 36 C7 32"/>
+ <a u="2195" b="81 36 C7 33"/>
+ <a u="2196" b="A8 49"/>
+ <a u="2197" b="A8 4A"/>
+ <a u="2198" b="A8 4B"/>
+ <a u="2199" b="A8 4C"/>
+ <a u="219A" b="81 36 C7 34"/>
+ <a u="219B" b="81 36 C7 35"/>
+ <a u="219C" b="81 36 C7 36"/>
+ <a u="219D" b="81 36 C7 37"/>
+ <a u="219E" b="81 36 C7 38"/>
+ <a u="219F" b="81 36 C7 39"/>
+ <a u="21A0" b="81 36 C8 30"/>
+ <a u="21A1" b="81 36 C8 31"/>
+ <a u="21A2" b="81 36 C8 32"/>
+ <a u="21A3" b="81 36 C8 33"/>
+ <a u="21A4" b="81 36 C8 34"/>
+ <a u="21A5" b="81 36 C8 35"/>
+ <a u="21A6" b="81 36 C8 36"/>
+ <a u="21A7" b="81 36 C8 37"/>
+ <a u="21A8" b="81 36 C8 38"/>
+ <a u="21A9" b="81 36 C8 39"/>
+ <a u="21AA" b="81 36 C9 30"/>
+ <a u="21AB" b="81 36 C9 31"/>
+ <a u="21AC" b="81 36 C9 32"/>
+ <a u="21AD" b="81 36 C9 33"/>
+ <a u="21AE" b="81 36 C9 34"/>
+ <a u="21AF" b="81 36 C9 35"/>
+ <a u="21B0" b="81 36 C9 36"/>
+ <a u="21B1" b="81 36 C9 37"/>
+ <a u="21B2" b="81 36 C9 38"/>
+ <a u="21B3" b="81 36 C9 39"/>
+ <a u="21B4" b="81 36 CA 30"/>
+ <a u="21B5" b="81 36 CA 31"/>
+ <a u="21B6" b="81 36 CA 32"/>
+ <a u="21B7" b="81 36 CA 33"/>
+ <a u="21B8" b="81 36 CA 34"/>
+ <a u="21B9" b="81 36 CA 35"/>
+ <a u="21BA" b="81 36 CA 36"/>
+ <a u="21BB" b="81 36 CA 37"/>
+ <a u="21BC" b="81 36 CA 38"/>
+ <a u="21BD" b="81 36 CA 39"/>
+ <a u="21BE" b="81 36 CB 30"/>
+ <a u="21BF" b="81 36 CB 31"/>
+ <a u="21C0" b="81 36 CB 32"/>
+ <a u="21C1" b="81 36 CB 33"/>
+ <a u="21C2" b="81 36 CB 34"/>
+ <a u="21C3" b="81 36 CB 35"/>
+ <a u="21C4" b="81 36 CB 36"/>
+ <a u="21C5" b="81 36 CB 37"/>
+ <a u="21C6" b="81 36 CB 38"/>
+ <a u="21C7" b="81 36 CB 39"/>
+ <a u="21C8" b="81 36 CC 30"/>
+ <a u="21C9" b="81 36 CC 31"/>
+ <a u="21CA" b="81 36 CC 32"/>
+ <a u="21CB" b="81 36 CC 33"/>
+ <a u="21CC" b="81 36 CC 34"/>
+ <a u="21CD" b="81 36 CC 35"/>
+ <a u="21CE" b="81 36 CC 36"/>
+ <a u="21CF" b="81 36 CC 37"/>
+ <a u="21D0" b="81 36 CC 38"/>
+ <a u="21D1" b="81 36 CC 39"/>
+ <a u="21D2" b="81 36 CD 30"/>
+ <a u="21D3" b="81 36 CD 31"/>
+ <a u="21D4" b="81 36 CD 32"/>
+ <a u="21D5" b="81 36 CD 33"/>
+ <a u="21D6" b="81 36 CD 34"/>
+ <a u="21D7" b="81 36 CD 35"/>
+ <a u="21D8" b="81 36 CD 36"/>
+ <a u="21D9" b="81 36 CD 37"/>
+ <a u="21DA" b="81 36 CD 38"/>
+ <a u="21DB" b="81 36 CD 39"/>
+ <a u="21DC" b="81 36 CE 30"/>
+ <a u="21DD" b="81 36 CE 31"/>
+ <a u="21DE" b="81 36 CE 32"/>
+ <a u="21DF" b="81 36 CE 33"/>
+ <a u="21E0" b="81 36 CE 34"/>
+ <a u="21E1" b="81 36 CE 35"/>
+ <a u="21E2" b="81 36 CE 36"/>
+ <a u="21E3" b="81 36 CE 37"/>
+ <a u="21E4" b="81 36 CE 38"/>
+ <a u="21E5" b="81 36 CE 39"/>
+ <a u="21E6" b="81 36 CF 30"/>
+ <a u="21E7" b="81 36 CF 31"/>
+ <a u="21E8" b="81 36 CF 32"/>
+ <a u="21E9" b="81 36 CF 33"/>
+ <a u="21EA" b="81 36 CF 34"/>
+ <a u="21EB" b="81 36 CF 35"/>
+ <a u="21EC" b="81 36 CF 36"/>
+ <a u="21ED" b="81 36 CF 37"/>
+ <a u="21EE" b="81 36 CF 38"/>
+ <a u="21EF" b="81 36 CF 39"/>
+ <a u="21F0" b="81 36 D0 30"/>
+ <a u="21F1" b="81 36 D0 31"/>
+ <a u="21F2" b="81 36 D0 32"/>
+ <a u="21F3" b="81 36 D0 33"/>
+ <a u="21F4" b="81 36 D0 34"/>
+ <a u="21F5" b="81 36 D0 35"/>
+ <a u="21F6" b="81 36 D0 36"/>
+ <a u="21F7" b="81 36 D0 37"/>
+ <a u="21F8" b="81 36 D0 38"/>
+ <a u="21F9" b="81 36 D0 39"/>
+ <a u="21FA" b="81 36 D1 30"/>
+ <a u="21FB" b="81 36 D1 31"/>
+ <a u="21FC" b="81 36 D1 32"/>
+ <a u="21FD" b="81 36 D1 33"/>
+ <a u="21FE" b="81 36 D1 34"/>
+ <a u="21FF" b="81 36 D1 35"/>
+ <a u="2200" b="81 36 D1 36"/>
+ <a u="2201" b="81 36 D1 37"/>
+ <a u="2202" b="81 36 D1 38"/>
+ <a u="2203" b="81 36 D1 39"/>
+ <a u="2204" b="81 36 D2 30"/>
+ <a u="2205" b="81 36 D2 31"/>
+ <a u="2206" b="81 36 D2 32"/>
+ <a u="2207" b="81 36 D2 33"/>
+ <a u="2208" b="A1 CA"/>
+ <a u="2209" b="81 36 D2 34"/>
+ <a u="220A" b="81 36 D2 35"/>
+ <a u="220B" b="81 36 D2 36"/>
+ <a u="220C" b="81 36 D2 37"/>
+ <a u="220D" b="81 36 D2 38"/>
+ <a u="220E" b="81 36 D2 39"/>
+ <a u="220F" b="A1 C7"/>
+ <a u="2210" b="81 36 D3 30"/>
+ <a u="2211" b="A1 C6"/>
+ <a u="2212" b="81 36 D3 31"/>
+ <a u="2213" b="81 36 D3 32"/>
+ <a u="2214" b="81 36 D3 33"/>
+ <a u="2215" b="A8 4D"/>
+ <a u="2216" b="81 36 D3 34"/>
+ <a u="2217" b="81 36 D3 35"/>
+ <a u="2218" b="81 36 D3 36"/>
+ <a u="2219" b="81 36 D3 37"/>
+ <a u="221A" b="A1 CC"/>
+ <a u="221B" b="81 36 D3 38"/>
+ <a u="221C" b="81 36 D3 39"/>
+ <a u="221D" b="A1 D8"/>
+ <a u="221E" b="A1 DE"/>
+ <a u="221F" b="A8 4E"/>
+ <a u="2220" b="A1 CF"/>
+ <a u="2221" b="81 36 D4 30"/>
+ <a u="2222" b="81 36 D4 31"/>
+ <a u="2223" b="A8 4F"/>
+ <a u="2224" b="81 36 D4 32"/>
+ <a u="2225" b="A1 CE"/>
+ <a u="2226" b="81 36 D4 33"/>
+ <a u="2227" b="A1 C4"/>
+ <a u="2228" b="A1 C5"/>
+ <a u="2229" b="A1 C9"/>
+ <a u="222A" b="A1 C8"/>
+ <a u="222B" b="A1 D2"/>
+ <a u="222C" b="81 36 D4 34"/>
+ <a u="222D" b="81 36 D4 35"/>
+ <a u="222E" b="A1 D3"/>
+ <a u="222F" b="81 36 D4 36"/>
+ <a u="2230" b="81 36 D4 37"/>
+ <a u="2231" b="81 36 D4 38"/>
+ <a u="2232" b="81 36 D4 39"/>
+ <a u="2233" b="81 36 D5 30"/>
+ <a u="2234" b="A1 E0"/>
+ <a u="2235" b="A1 DF"/>
+ <a u="2236" b="A1 C3"/>
+ <a u="2237" b="A1 CB"/>
+ <a u="2238" b="81 36 D5 31"/>
+ <a u="2239" b="81 36 D5 32"/>
+ <a u="223A" b="81 36 D5 33"/>
+ <a u="223B" b="81 36 D5 34"/>
+ <a u="223C" b="81 36 D5 35"/>
+ <a u="223D" b="A1 D7"/>
+ <a u="223E" b="81 36 D5 36"/>
+ <a u="223F" b="81 36 D5 37"/>
+ <a u="2240" b="81 36 D5 38"/>
+ <a u="2241" b="81 36 D5 39"/>
+ <a u="2242" b="81 36 D6 30"/>
+ <a u="2243" b="81 36 D6 31"/>
+ <a u="2244" b="81 36 D6 32"/>
+ <a u="2245" b="81 36 D6 33"/>
+ <a u="2246" b="81 36 D6 34"/>
+ <a u="2247" b="81 36 D6 35"/>
+ <a u="2248" b="A1 D6"/>
+ <a u="2249" b="81 36 D6 36"/>
+ <a u="224A" b="81 36 D6 37"/>
+ <a u="224B" b="81 36 D6 38"/>
+ <a u="224C" b="A1 D5"/>
+ <a u="224D" b="81 36 D6 39"/>
+ <a u="224E" b="81 36 D7 30"/>
+ <a u="224F" b="81 36 D7 31"/>
+ <a u="2250" b="81 36 D7 32"/>
+ <a u="2251" b="81 36 D7 33"/>
+ <a u="2252" b="A8 50"/>
+ <a u="2253" b="81 36 D7 34"/>
+ <a u="2254" b="81 36 D7 35"/>
+ <a u="2255" b="81 36 D7 36"/>
+ <a u="2256" b="81 36 D7 37"/>
+ <a u="2257" b="81 36 D7 38"/>
+ <a u="2258" b="81 36 D7 39"/>
+ <a u="2259" b="81 36 D8 30"/>
+ <a u="225A" b="81 36 D8 31"/>
+ <a u="225B" b="81 36 D8 32"/>
+ <a u="225C" b="81 36 D8 33"/>
+ <a u="225D" b="81 36 D8 34"/>
+ <a u="225E" b="81 36 D8 35"/>
+ <a u="225F" b="81 36 D8 36"/>
+ <a u="2260" b="A1 D9"/>
+ <a u="2261" b="A1 D4"/>
+ <a u="2262" b="81 36 D8 37"/>
+ <a u="2263" b="81 36 D8 38"/>
+ <a u="2264" b="A1 DC"/>
+ <a u="2265" b="A1 DD"/>
+ <a u="2266" b="A8 51"/>
+ <a u="2267" b="A8 52"/>
+ <a u="2268" b="81 36 D8 39"/>
+ <a u="2269" b="81 36 D9 30"/>
+ <a u="226A" b="81 36 D9 31"/>
+ <a u="226B" b="81 36 D9 32"/>
+ <a u="226C" b="81 36 D9 33"/>
+ <a u="226D" b="81 36 D9 34"/>
+ <a u="226E" b="A1 DA"/>
+ <a u="226F" b="A1 DB"/>
+ <a u="2270" b="81 36 D9 35"/>
+ <a u="2271" b="81 36 D9 36"/>
+ <a u="2272" b="81 36 D9 37"/>
+ <a u="2273" b="81 36 D9 38"/>
+ <a u="2274" b="81 36 D9 39"/>
+ <a u="2275" b="81 36 DA 30"/>
+ <a u="2276" b="81 36 DA 31"/>
+ <a u="2277" b="81 36 DA 32"/>
+ <a u="2278" b="81 36 DA 33"/>
+ <a u="2279" b="81 36 DA 34"/>
+ <a u="227A" b="81 36 DA 35"/>
+ <a u="227B" b="81 36 DA 36"/>
+ <a u="227C" b="81 36 DA 37"/>
+ <a u="227D" b="81 36 DA 38"/>
+ <a u="227E" b="81 36 DA 39"/>
+ <a u="227F" b="81 36 DB 30"/>
+ <a u="2280" b="81 36 DB 31"/>
+ <a u="2281" b="81 36 DB 32"/>
+ <a u="2282" b="81 36 DB 33"/>
+ <a u="2283" b="81 36 DB 34"/>
+ <a u="2284" b="81 36 DB 35"/>
+ <a u="2285" b="81 36 DB 36"/>
+ <a u="2286" b="81 36 DB 37"/>
+ <a u="2287" b="81 36 DB 38"/>
+ <a u="2288" b="81 36 DB 39"/>
+ <a u="2289" b="81 36 DC 30"/>
+ <a u="228A" b="81 36 DC 31"/>
+ <a u="228B" b="81 36 DC 32"/>
+ <a u="228C" b="81 36 DC 33"/>
+ <a u="228D" b="81 36 DC 34"/>
+ <a u="228E" b="81 36 DC 35"/>
+ <a u="228F" b="81 36 DC 36"/>
+ <a u="2290" b="81 36 DC 37"/>
+ <a u="2291" b="81 36 DC 38"/>
+ <a u="2292" b="81 36 DC 39"/>
+ <a u="2293" b="81 36 DD 30"/>
+ <a u="2294" b="81 36 DD 31"/>
+ <a u="2295" b="A8 92"/>
+ <a u="2296" b="81 36 DD 32"/>
+ <a u="2297" b="81 36 DD 33"/>
+ <a u="2298" b="81 36 DD 34"/>
+ <a u="2299" b="A1 D1"/>
+ <a u="229A" b="81 36 DD 35"/>
+ <a u="229B" b="81 36 DD 36"/>
+ <a u="229C" b="81 36 DD 37"/>
+ <a u="229D" b="81 36 DD 38"/>
+ <a u="229E" b="81 36 DD 39"/>
+ <a u="229F" b="81 36 DE 30"/>
+ <a u="22A0" b="81 36 DE 31"/>
+ <a u="22A1" b="81 36 DE 32"/>
+ <a u="22A2" b="81 36 DE 33"/>
+ <a u="22A3" b="81 36 DE 34"/>
+ <a u="22A4" b="81 36 DE 35"/>
+ <a u="22A5" b="A1 CD"/>
+ <a u="22A6" b="81 36 DE 36"/>
+ <a u="22A7" b="81 36 DE 37"/>
+ <a u="22A8" b="81 36 DE 38"/>
+ <a u="22A9" b="81 36 DE 39"/>
+ <a u="22AA" b="81 36 DF 30"/>
+ <a u="22AB" b="81 36 DF 31"/>
+ <a u="22AC" b="81 36 DF 32"/>
+ <a u="22AD" b="81 36 DF 33"/>
+ <a u="22AE" b="81 36 DF 34"/>
+ <a u="22AF" b="81 36 DF 35"/>
+ <a u="22B0" b="81 36 DF 36"/>
+ <a u="22B1" b="81 36 DF 37"/>
+ <a u="22B2" b="81 36 DF 38"/>
+ <a u="22B3" b="81 36 DF 39"/>
+ <a u="22B4" b="81 36 E0 30"/>
+ <a u="22B5" b="81 36 E0 31"/>
+ <a u="22B6" b="81 36 E0 32"/>
+ <a u="22B7" b="81 36 E0 33"/>
+ <a u="22B8" b="81 36 E0 34"/>
+ <a u="22B9" b="81 36 E0 35"/>
+ <a u="22BA" b="81 36 E0 36"/>
+ <a u="22BB" b="81 36 E0 37"/>
+ <a u="22BC" b="81 36 E0 38"/>
+ <a u="22BD" b="81 36 E0 39"/>
+ <a u="22BE" b="81 36 E1 30"/>
+ <a u="22BF" b="A8 53"/>
+ <a u="22C0" b="81 36 E1 31"/>
+ <a u="22C1" b="81 36 E1 32"/>
+ <a u="22C2" b="81 36 E1 33"/>
+ <a u="22C3" b="81 36 E1 34"/>
+ <a u="22C4" b="81 36 E1 35"/>
+ <a u="22C5" b="81 36 E1 36"/>
+ <a u="22C6" b="81 36 E1 37"/>
+ <a u="22C7" b="81 36 E1 38"/>
+ <a u="22C8" b="81 36 E1 39"/>
+ <a u="22C9" b="81 36 E2 30"/>
+ <a u="22CA" b="81 36 E2 31"/>
+ <a u="22CB" b="81 36 E2 32"/>
+ <a u="22CC" b="81 36 E2 33"/>
+ <a u="22CD" b="81 36 E2 34"/>
+ <a u="22CE" b="81 36 E2 35"/>
+ <a u="22CF" b="81 36 E2 36"/>
+ <a u="22D0" b="81 36 E2 37"/>
+ <a u="22D1" b="81 36 E2 38"/>
+ <a u="22D2" b="81 36 E2 39"/>
+ <a u="22D3" b="81 36 E3 30"/>
+ <a u="22D4" b="81 36 E3 31"/>
+ <a u="22D5" b="81 36 E3 32"/>
+ <a u="22D6" b="81 36 E3 33"/>
+ <a u="22D7" b="81 36 E3 34"/>
+ <a u="22D8" b="81 36 E3 35"/>
+ <a u="22D9" b="81 36 E3 36"/>
+ <a u="22DA" b="81 36 E3 37"/>
+ <a u="22DB" b="81 36 E3 38"/>
+ <a u="22DC" b="81 36 E3 39"/>
+ <a u="22DD" b="81 36 E4 30"/>
+ <a u="22DE" b="81 36 E4 31"/>
+ <a u="22DF" b="81 36 E4 32"/>
+ <a u="22E0" b="81 36 E4 33"/>
+ <a u="22E1" b="81 36 E4 34"/>
+ <a u="22E2" b="81 36 E4 35"/>
+ <a u="22E3" b="81 36 E4 36"/>
+ <a u="22E4" b="81 36 E4 37"/>
+ <a u="22E5" b="81 36 E4 38"/>
+ <a u="22E6" b="81 36 E4 39"/>
+ <a u="22E7" b="81 36 E5 30"/>
+ <a u="22E8" b="81 36 E5 31"/>
+ <a u="22E9" b="81 36 E5 32"/>
+ <a u="22EA" b="81 36 E5 33"/>
+ <a u="22EB" b="81 36 E5 34"/>
+ <a u="22EC" b="81 36 E5 35"/>
+ <a u="22ED" b="81 36 E5 36"/>
+ <a u="22EE" b="81 36 E5 37"/>
+ <a u="22EF" b="81 36 E5 38"/>
+ <a u="22F0" b="81 36 E5 39"/>
+ <a u="22F1" b="81 36 E6 30"/>
+ <a u="22F2" b="81 36 E6 31"/>
+ <a u="22F3" b="81 36 E6 32"/>
+ <a u="22F4" b="81 36 E6 33"/>
+ <a u="22F5" b="81 36 E6 34"/>
+ <a u="22F6" b="81 36 E6 35"/>
+ <a u="22F7" b="81 36 E6 36"/>
+ <a u="22F8" b="81 36 E6 37"/>
+ <a u="22F9" b="81 36 E6 38"/>
+ <a u="22FA" b="81 36 E6 39"/>
+ <a u="22FB" b="81 36 E7 30"/>
+ <a u="22FC" b="81 36 E7 31"/>
+ <a u="22FD" b="81 36 E7 32"/>
+ <a u="22FE" b="81 36 E7 33"/>
+ <a u="22FF" b="81 36 E7 34"/>
+ <a u="2300" b="81 36 E7 35"/>
+ <a u="2301" b="81 36 E7 36"/>
+ <a u="2302" b="81 36 E7 37"/>
+ <a u="2303" b="81 36 E7 38"/>
+ <a u="2304" b="81 36 E7 39"/>
+ <a u="2305" b="81 36 E8 30"/>
+ <a u="2306" b="81 36 E8 31"/>
+ <a u="2307" b="81 36 E8 32"/>
+ <a u="2308" b="81 36 E8 33"/>
+ <a u="2309" b="81 36 E8 34"/>
+ <a u="230A" b="81 36 E8 35"/>
+ <a u="230B" b="81 36 E8 36"/>
+ <a u="230C" b="81 36 E8 37"/>
+ <a u="230D" b="81 36 E8 38"/>
+ <a u="230E" b="81 36 E8 39"/>
+ <a u="230F" b="81 36 E9 30"/>
+ <a u="2310" b="81 36 E9 31"/>
+ <a u="2311" b="81 36 E9 32"/>
+ <a u="2312" b="A1 D0"/>
+ <a u="2313" b="81 36 E9 33"/>
+ <a u="2314" b="81 36 E9 34"/>
+ <a u="2315" b="81 36 E9 35"/>
+ <a u="2316" b="81 36 E9 36"/>
+ <a u="2317" b="81 36 E9 37"/>
+ <a u="2318" b="81 36 E9 38"/>
+ <a u="2319" b="81 36 E9 39"/>
+ <a u="231A" b="81 36 EA 30"/>
+ <a u="231B" b="81 36 EA 31"/>
+ <a u="231C" b="81 36 EA 32"/>
+ <a u="231D" b="81 36 EA 33"/>
+ <a u="231E" b="81 36 EA 34"/>
+ <a u="231F" b="81 36 EA 35"/>
+ <a u="2320" b="81 36 EA 36"/>
+ <a u="2321" b="81 36 EA 37"/>
+ <a u="2322" b="81 36 EA 38"/>
+ <a u="2323" b="81 36 EA 39"/>
+ <a u="2324" b="81 36 EB 30"/>
+ <a u="2325" b="81 36 EB 31"/>
+ <a u="2326" b="81 36 EB 32"/>
+ <a u="2327" b="81 36 EB 33"/>
+ <a u="2328" b="81 36 EB 34"/>
+ <a u="2329" b="81 36 EB 35"/>
+ <a u="232A" b="81 36 EB 36"/>
+ <a u="232B" b="81 36 EB 37"/>
+ <a u="232C" b="81 36 EB 38"/>
+ <a u="232D" b="81 36 EB 39"/>
+ <a u="232E" b="81 36 EC 30"/>
+ <a u="232F" b="81 36 EC 31"/>
+ <a u="2330" b="81 36 EC 32"/>
+ <a u="2331" b="81 36 EC 33"/>
+ <a u="2332" b="81 36 EC 34"/>
+ <a u="2333" b="81 36 EC 35"/>
+ <a u="2334" b="81 36 EC 36"/>
+ <a u="2335" b="81 36 EC 37"/>
+ <a u="2336" b="81 36 EC 38"/>
+ <a u="2337" b="81 36 EC 39"/>
+ <a u="2338" b="81 36 ED 30"/>
+ <a u="2339" b="81 36 ED 31"/>
+ <a u="233A" b="81 36 ED 32"/>
+ <a u="233B" b="81 36 ED 33"/>
+ <a u="233C" b="81 36 ED 34"/>
+ <a u="233D" b="81 36 ED 35"/>
+ <a u="233E" b="81 36 ED 36"/>
+ <a u="233F" b="81 36 ED 37"/>
+ <a u="2340" b="81 36 ED 38"/>
+ <a u="2341" b="81 36 ED 39"/>
+ <a u="2342" b="81 36 EE 30"/>
+ <a u="2343" b="81 36 EE 31"/>
+ <a u="2344" b="81 36 EE 32"/>
+ <a u="2345" b="81 36 EE 33"/>
+ <a u="2346" b="81 36 EE 34"/>
+ <a u="2347" b="81 36 EE 35"/>
+ <a u="2348" b="81 36 EE 36"/>
+ <a u="2349" b="81 36 EE 37"/>
+ <a u="234A" b="81 36 EE 38"/>
+ <a u="234B" b="81 36 EE 39"/>
+ <a u="234C" b="81 36 EF 30"/>
+ <a u="234D" b="81 36 EF 31"/>
+ <a u="234E" b="81 36 EF 32"/>
+ <a u="234F" b="81 36 EF 33"/>
+ <a u="2350" b="81 36 EF 34"/>
+ <a u="2351" b="81 36 EF 35"/>
+ <a u="2352" b="81 36 EF 36"/>
+ <a u="2353" b="81 36 EF 37"/>
+ <a u="2354" b="81 36 EF 38"/>
+ <a u="2355" b="81 36 EF 39"/>
+ <a u="2356" b="81 36 F0 30"/>
+ <a u="2357" b="81 36 F0 31"/>
+ <a u="2358" b="81 36 F0 32"/>
+ <a u="2359" b="81 36 F0 33"/>
+ <a u="235A" b="81 36 F0 34"/>
+ <a u="235B" b="81 36 F0 35"/>
+ <a u="235C" b="81 36 F0 36"/>
+ <a u="235D" b="81 36 F0 37"/>
+ <a u="235E" b="81 36 F0 38"/>
+ <a u="235F" b="81 36 F0 39"/>
+ <a u="2360" b="81 36 F1 30"/>
+ <a u="2361" b="81 36 F1 31"/>
+ <a u="2362" b="81 36 F1 32"/>
+ <a u="2363" b="81 36 F1 33"/>
+ <a u="2364" b="81 36 F1 34"/>
+ <a u="2365" b="81 36 F1 35"/>
+ <a u="2366" b="81 36 F1 36"/>
+ <a u="2367" b="81 36 F1 37"/>
+ <a u="2368" b="81 36 F1 38"/>
+ <a u="2369" b="81 36 F1 39"/>
+ <a u="236A" b="81 36 F2 30"/>
+ <a u="236B" b="81 36 F2 31"/>
+ <a u="236C" b="81 36 F2 32"/>
+ <a u="236D" b="81 36 F2 33"/>
+ <a u="236E" b="81 36 F2 34"/>
+ <a u="236F" b="81 36 F2 35"/>
+ <a u="2370" b="81 36 F2 36"/>
+ <a u="2371" b="81 36 F2 37"/>
+ <a u="2372" b="81 36 F2 38"/>
+ <a u="2373" b="81 36 F2 39"/>
+ <a u="2374" b="81 36 F3 30"/>
+ <a u="2375" b="81 36 F3 31"/>
+ <a u="2376" b="81 36 F3 32"/>
+ <a u="2377" b="81 36 F3 33"/>
+ <a u="2378" b="81 36 F3 34"/>
+ <a u="2379" b="81 36 F3 35"/>
+ <a u="237A" b="81 36 F3 36"/>
+ <a u="237B" b="81 36 F3 37"/>
+ <a u="237C" b="81 36 F3 38"/>
+ <a u="237D" b="81 36 F3 39"/>
+ <a u="237E" b="81 36 F4 30"/>
+ <a u="237F" b="81 36 F4 31"/>
+ <a u="2380" b="81 36 F4 32"/>
+ <a u="2381" b="81 36 F4 33"/>
+ <a u="2382" b="81 36 F4 34"/>
+ <a u="2383" b="81 36 F4 35"/>
+ <a u="2384" b="81 36 F4 36"/>
+ <a u="2385" b="81 36 F4 37"/>
+ <a u="2386" b="81 36 F4 38"/>
+ <a u="2387" b="81 36 F4 39"/>
+ <a u="2388" b="81 36 F5 30"/>
+ <a u="2389" b="81 36 F5 31"/>
+ <a u="238A" b="81 36 F5 32"/>
+ <a u="238B" b="81 36 F5 33"/>
+ <a u="238C" b="81 36 F5 34"/>
+ <a u="238D" b="81 36 F5 35"/>
+ <a u="238E" b="81 36 F5 36"/>
+ <a u="238F" b="81 36 F5 37"/>
+ <a u="2390" b="81 36 F5 38"/>
+ <a u="2391" b="81 36 F5 39"/>
+ <a u="2392" b="81 36 F6 30"/>
+ <a u="2393" b="81 36 F6 31"/>
+ <a u="2394" b="81 36 F6 32"/>
+ <a u="2395" b="81 36 F6 33"/>
+ <a u="2396" b="81 36 F6 34"/>
+ <a u="2397" b="81 36 F6 35"/>
+ <a u="2398" b="81 36 F6 36"/>
+ <a u="2399" b="81 36 F6 37"/>
+ <a u="239A" b="81 36 F6 38"/>
+ <a u="239B" b="81 36 F6 39"/>
+ <a u="239C" b="81 36 F7 30"/>
+ <a u="239D" b="81 36 F7 31"/>
+ <a u="239E" b="81 36 F7 32"/>
+ <a u="239F" b="81 36 F7 33"/>
+ <a u="23A0" b="81 36 F7 34"/>
+ <a u="23A1" b="81 36 F7 35"/>
+ <a u="23A2" b="81 36 F7 36"/>
+ <a u="23A3" b="81 36 F7 37"/>
+ <a u="23A4" b="81 36 F7 38"/>
+ <a u="23A5" b="81 36 F7 39"/>
+ <a u="23A6" b="81 36 F8 30"/>
+ <a u="23A7" b="81 36 F8 31"/>
+ <a u="23A8" b="81 36 F8 32"/>
+ <a u="23A9" b="81 36 F8 33"/>
+ <a u="23AA" b="81 36 F8 34"/>
+ <a u="23AB" b="81 36 F8 35"/>
+ <a u="23AC" b="81 36 F8 36"/>
+ <a u="23AD" b="81 36 F8 37"/>
+ <a u="23AE" b="81 36 F8 38"/>
+ <a u="23AF" b="81 36 F8 39"/>
+ <a u="23B0" b="81 36 F9 30"/>
+ <a u="23B1" b="81 36 F9 31"/>
+ <a u="23B2" b="81 36 F9 32"/>
+ <a u="23B3" b="81 36 F9 33"/>
+ <a u="23B4" b="81 36 F9 34"/>
+ <a u="23B5" b="81 36 F9 35"/>
+ <a u="23B6" b="81 36 F9 36"/>
+ <a u="23B7" b="81 36 F9 37"/>
+ <a u="23B8" b="81 36 F9 38"/>
+ <a u="23B9" b="81 36 F9 39"/>
+ <a u="23BA" b="81 36 FA 30"/>
+ <a u="23BB" b="81 36 FA 31"/>
+ <a u="23BC" b="81 36 FA 32"/>
+ <a u="23BD" b="81 36 FA 33"/>
+ <a u="23BE" b="81 36 FA 34"/>
+ <a u="23BF" b="81 36 FA 35"/>
+ <a u="23C0" b="81 36 FA 36"/>
+ <a u="23C1" b="81 36 FA 37"/>
+ <a u="23C2" b="81 36 FA 38"/>
+ <a u="23C3" b="81 36 FA 39"/>
+ <a u="23C4" b="81 36 FB 30"/>
+ <a u="23C5" b="81 36 FB 31"/>
+ <a u="23C6" b="81 36 FB 32"/>
+ <a u="23C7" b="81 36 FB 33"/>
+ <a u="23C8" b="81 36 FB 34"/>
+ <a u="23C9" b="81 36 FB 35"/>
+ <a u="23CA" b="81 36 FB 36"/>
+ <a u="23CB" b="81 36 FB 37"/>
+ <a u="23CC" b="81 36 FB 38"/>
+ <a u="23CD" b="81 36 FB 39"/>
+ <a u="23CE" b="81 36 FC 30"/>
+ <a u="23CF" b="81 36 FC 31"/>
+ <a u="23D0" b="81 36 FC 32"/>
+ <a u="23D1" b="81 36 FC 33"/>
+ <a u="23D2" b="81 36 FC 34"/>
+ <a u="23D3" b="81 36 FC 35"/>
+ <a u="23D4" b="81 36 FC 36"/>
+ <a u="23D5" b="81 36 FC 37"/>
+ <a u="23D6" b="81 36 FC 38"/>
+ <a u="23D7" b="81 36 FC 39"/>
+ <a u="23D8" b="81 36 FD 30"/>
+ <a u="23D9" b="81 36 FD 31"/>
+ <a u="23DA" b="81 36 FD 32"/>
+ <a u="23DB" b="81 36 FD 33"/>
+ <a u="23DC" b="81 36 FD 34"/>
+ <a u="23DD" b="81 36 FD 35"/>
+ <a u="23DE" b="81 36 FD 36"/>
+ <a u="23DF" b="81 36 FD 37"/>
+ <a u="23E0" b="81 36 FD 38"/>
+ <a u="23E1" b="81 36 FD 39"/>
+ <a u="23E2" b="81 36 FE 30"/>
+ <a u="23E3" b="81 36 FE 31"/>
+ <a u="23E4" b="81 36 FE 32"/>
+ <a u="23E5" b="81 36 FE 33"/>
+ <a u="23E6" b="81 36 FE 34"/>
+ <a u="23E7" b="81 36 FE 35"/>
+ <a u="23E8" b="81 36 FE 36"/>
+ <a u="23E9" b="81 36 FE 37"/>
+ <a u="23EA" b="81 36 FE 38"/>
+ <a u="23EB" b="81 36 FE 39"/>
+ <a u="23EC" b="81 37 81 30"/>
+ <a u="23ED" b="81 37 81 31"/>
+ <a u="23EE" b="81 37 81 32"/>
+ <a u="23EF" b="81 37 81 33"/>
+ <a u="23F0" b="81 37 81 34"/>
+ <a u="23F1" b="81 37 81 35"/>
+ <a u="23F2" b="81 37 81 36"/>
+ <a u="23F3" b="81 37 81 37"/>
+ <a u="23F4" b="81 37 81 38"/>
+ <a u="23F5" b="81 37 81 39"/>
+ <a u="23F6" b="81 37 82 30"/>
+ <a u="23F7" b="81 37 82 31"/>
+ <a u="23F8" b="81 37 82 32"/>
+ <a u="23F9" b="81 37 82 33"/>
+ <a u="23FA" b="81 37 82 34"/>
+ <a u="23FB" b="81 37 82 35"/>
+ <a u="23FC" b="81 37 82 36"/>
+ <a u="23FD" b="81 37 82 37"/>
+ <a u="23FE" b="81 37 82 38"/>
+ <a u="23FF" b="81 37 82 39"/>
+ <a u="2400" b="81 37 83 30"/>
+ <a u="2401" b="81 37 83 31"/>
+ <a u="2402" b="81 37 83 32"/>
+ <a u="2403" b="81 37 83 33"/>
+ <a u="2404" b="81 37 83 34"/>
+ <a u="2405" b="81 37 83 35"/>
+ <a u="2406" b="81 37 83 36"/>
+ <a u="2407" b="81 37 83 37"/>
+ <a u="2408" b="81 37 83 38"/>
+ <a u="2409" b="81 37 83 39"/>
+ <a u="240A" b="81 37 84 30"/>
+ <a u="240B" b="81 37 84 31"/>
+ <a u="240C" b="81 37 84 32"/>
+ <a u="240D" b="81 37 84 33"/>
+ <a u="240E" b="81 37 84 34"/>
+ <a u="240F" b="81 37 84 35"/>
+ <a u="2410" b="81 37 84 36"/>
+ <a u="2411" b="81 37 84 37"/>
+ <a u="2412" b="81 37 84 38"/>
+ <a u="2413" b="81 37 84 39"/>
+ <a u="2414" b="81 37 85 30"/>
+ <a u="2415" b="81 37 85 31"/>
+ <a u="2416" b="81 37 85 32"/>
+ <a u="2417" b="81 37 85 33"/>
+ <a u="2418" b="81 37 85 34"/>
+ <a u="2419" b="81 37 85 35"/>
+ <a u="241A" b="81 37 85 36"/>
+ <a u="241B" b="81 37 85 37"/>
+ <a u="241C" b="81 37 85 38"/>
+ <a u="241D" b="81 37 85 39"/>
+ <a u="241E" b="81 37 86 30"/>
+ <a u="241F" b="81 37 86 31"/>
+ <a u="2420" b="81 37 86 32"/>
+ <a u="2421" b="81 37 86 33"/>
+ <a u="2422" b="81 37 86 34"/>
+ <a u="2423" b="81 37 86 35"/>
+ <a u="2424" b="81 37 86 36"/>
+ <a u="2425" b="81 37 86 37"/>
+ <a u="2426" b="81 37 86 38"/>
+ <a u="2427" b="81 37 86 39"/>
+ <a u="2428" b="81 37 87 30"/>
+ <a u="2429" b="81 37 87 31"/>
+ <a u="242A" b="81 37 87 32"/>
+ <a u="242B" b="81 37 87 33"/>
+ <a u="242C" b="81 37 87 34"/>
+ <a u="242D" b="81 37 87 35"/>
+ <a u="242E" b="81 37 87 36"/>
+ <a u="242F" b="81 37 87 37"/>
+ <a u="2430" b="81 37 87 38"/>
+ <a u="2431" b="81 37 87 39"/>
+ <a u="2432" b="81 37 88 30"/>
+ <a u="2433" b="81 37 88 31"/>
+ <a u="2434" b="81 37 88 32"/>
+ <a u="2435" b="81 37 88 33"/>
+ <a u="2436" b="81 37 88 34"/>
+ <a u="2437" b="81 37 88 35"/>
+ <a u="2438" b="81 37 88 36"/>
+ <a u="2439" b="81 37 88 37"/>
+ <a u="243A" b="81 37 88 38"/>
+ <a u="243B" b="81 37 88 39"/>
+ <a u="243C" b="81 37 89 30"/>
+ <a u="243D" b="81 37 89 31"/>
+ <a u="243E" b="81 37 89 32"/>
+ <a u="243F" b="81 37 89 33"/>
+ <a u="2440" b="81 37 89 34"/>
+ <a u="2441" b="81 37 89 35"/>
+ <a u="2442" b="81 37 89 36"/>
+ <a u="2443" b="81 37 89 37"/>
+ <a u="2444" b="81 37 89 38"/>
+ <a u="2445" b="81 37 89 39"/>
+ <a u="2446" b="81 37 8A 30"/>
+ <a u="2447" b="81 37 8A 31"/>
+ <a u="2448" b="81 37 8A 32"/>
+ <a u="2449" b="81 37 8A 33"/>
+ <a u="244A" b="81 37 8A 34"/>
+ <a u="244B" b="81 37 8A 35"/>
+ <a u="244C" b="81 37 8A 36"/>
+ <a u="244D" b="81 37 8A 37"/>
+ <a u="244E" b="81 37 8A 38"/>
+ <a u="244F" b="81 37 8A 39"/>
+ <a u="2450" b="81 37 8B 30"/>
+ <a u="2451" b="81 37 8B 31"/>
+ <a u="2452" b="81 37 8B 32"/>
+ <a u="2453" b="81 37 8B 33"/>
+ <a u="2454" b="81 37 8B 34"/>
+ <a u="2455" b="81 37 8B 35"/>
+ <a u="2456" b="81 37 8B 36"/>
+ <a u="2457" b="81 37 8B 37"/>
+ <a u="2458" b="81 37 8B 38"/>
+ <a u="2459" b="81 37 8B 39"/>
+ <a u="245A" b="81 37 8C 30"/>
+ <a u="245B" b="81 37 8C 31"/>
+ <a u="245C" b="81 37 8C 32"/>
+ <a u="245D" b="81 37 8C 33"/>
+ <a u="245E" b="81 37 8C 34"/>
+ <a u="245F" b="81 37 8C 35"/>
+ <a u="2460" b="A2 D9"/>
+ <a u="2461" b="A2 DA"/>
+ <a u="2462" b="A2 DB"/>
+ <a u="2463" b="A2 DC"/>
+ <a u="2464" b="A2 DD"/>
+ <a u="2465" b="A2 DE"/>
+ <a u="2466" b="A2 DF"/>
+ <a u="2467" b="A2 E0"/>
+ <a u="2468" b="A2 E1"/>
+ <a u="2469" b="A2 E2"/>
+ <a u="246A" b="81 37 8C 36"/>
+ <a u="246B" b="81 37 8C 37"/>
+ <a u="246C" b="81 37 8C 38"/>
+ <a u="246D" b="81 37 8C 39"/>
+ <a u="246E" b="81 37 8D 30"/>
+ <a u="246F" b="81 37 8D 31"/>
+ <a u="2470" b="81 37 8D 32"/>
+ <a u="2471" b="81 37 8D 33"/>
+ <a u="2472" b="81 37 8D 34"/>
+ <a u="2473" b="81 37 8D 35"/>
+ <a u="2474" b="A2 C5"/>
+ <a u="2475" b="A2 C6"/>
+ <a u="2476" b="A2 C7"/>
+ <a u="2477" b="A2 C8"/>
+ <a u="2478" b="A2 C9"/>
+ <a u="2479" b="A2 CA"/>
+ <a u="247A" b="A2 CB"/>
+ <a u="247B" b="A2 CC"/>
+ <a u="247C" b="A2 CD"/>
+ <a u="247D" b="A2 CE"/>
+ <a u="247E" b="A2 CF"/>
+ <a u="247F" b="A2 D0"/>
+ <a u="2480" b="A2 D1"/>
+ <a u="2481" b="A2 D2"/>
+ <a u="2482" b="A2 D3"/>
+ <a u="2483" b="A2 D4"/>
+ <a u="2484" b="A2 D5"/>
+ <a u="2485" b="A2 D6"/>
+ <a u="2486" b="A2 D7"/>
+ <a u="2487" b="A2 D8"/>
+ <a u="2488" b="A2 B1"/>
+ <a u="2489" b="A2 B2"/>
+ <a u="248A" b="A2 B3"/>
+ <a u="248B" b="A2 B4"/>
+ <a u="248C" b="A2 B5"/>
+ <a u="248D" b="A2 B6"/>
+ <a u="248E" b="A2 B7"/>
+ <a u="248F" b="A2 B8"/>
+ <a u="2490" b="A2 B9"/>
+ <a u="2491" b="A2 BA"/>
+ <a u="2492" b="A2 BB"/>
+ <a u="2493" b="A2 BC"/>
+ <a u="2494" b="A2 BD"/>
+ <a u="2495" b="A2 BE"/>
+ <a u="2496" b="A2 BF"/>
+ <a u="2497" b="A2 C0"/>
+ <a u="2498" b="A2 C1"/>
+ <a u="2499" b="A2 C2"/>
+ <a u="249A" b="A2 C3"/>
+ <a u="249B" b="A2 C4"/>
+ <a u="249C" b="81 37 8D 36"/>
+ <a u="249D" b="81 37 8D 37"/>
+ <a u="249E" b="81 37 8D 38"/>
+ <a u="249F" b="81 37 8D 39"/>
+ <a u="24A0" b="81 37 8E 30"/>
+ <a u="24A1" b="81 37 8E 31"/>
+ <a u="24A2" b="81 37 8E 32"/>
+ <a u="24A3" b="81 37 8E 33"/>
+ <a u="24A4" b="81 37 8E 34"/>
+ <a u="24A5" b="81 37 8E 35"/>
+ <a u="24A6" b="81 37 8E 36"/>
+ <a u="24A7" b="81 37 8E 37"/>
+ <a u="24A8" b="81 37 8E 38"/>
+ <a u="24A9" b="81 37 8E 39"/>
+ <a u="24AA" b="81 37 8F 30"/>
+ <a u="24AB" b="81 37 8F 31"/>
+ <a u="24AC" b="81 37 8F 32"/>
+ <a u="24AD" b="81 37 8F 33"/>
+ <a u="24AE" b="81 37 8F 34"/>
+ <a u="24AF" b="81 37 8F 35"/>
+ <a u="24B0" b="81 37 8F 36"/>
+ <a u="24B1" b="81 37 8F 37"/>
+ <a u="24B2" b="81 37 8F 38"/>
+ <a u="24B3" b="81 37 8F 39"/>
+ <a u="24B4" b="81 37 90 30"/>
+ <a u="24B5" b="81 37 90 31"/>
+ <a u="24B6" b="81 37 90 32"/>
+ <a u="24B7" b="81 37 90 33"/>
+ <a u="24B8" b="81 37 90 34"/>
+ <a u="24B9" b="81 37 90 35"/>
+ <a u="24BA" b="81 37 90 36"/>
+ <a u="24BB" b="81 37 90 37"/>
+ <a u="24BC" b="81 37 90 38"/>
+ <a u="24BD" b="81 37 90 39"/>
+ <a u="24BE" b="81 37 91 30"/>
+ <a u="24BF" b="81 37 91 31"/>
+ <a u="24C0" b="81 37 91 32"/>
+ <a u="24C1" b="81 37 91 33"/>
+ <a u="24C2" b="81 37 91 34"/>
+ <a u="24C3" b="81 37 91 35"/>
+ <a u="24C4" b="81 37 91 36"/>
+ <a u="24C5" b="81 37 91 37"/>
+ <a u="24C6" b="81 37 91 38"/>
+ <a u="24C7" b="81 37 91 39"/>
+ <a u="24C8" b="81 37 92 30"/>
+ <a u="24C9" b="81 37 92 31"/>
+ <a u="24CA" b="81 37 92 32"/>
+ <a u="24CB" b="81 37 92 33"/>
+ <a u="24CC" b="81 37 92 34"/>
+ <a u="24CD" b="81 37 92 35"/>
+ <a u="24CE" b="81 37 92 36"/>
+ <a u="24CF" b="81 37 92 37"/>
+ <a u="24D0" b="81 37 92 38"/>
+ <a u="24D1" b="81 37 92 39"/>
+ <a u="24D2" b="81 37 93 30"/>
+ <a u="24D3" b="81 37 93 31"/>
+ <a u="24D4" b="81 37 93 32"/>
+ <a u="24D5" b="81 37 93 33"/>
+ <a u="24D6" b="81 37 93 34"/>
+ <a u="24D7" b="81 37 93 35"/>
+ <a u="24D8" b="81 37 93 36"/>
+ <a u="24D9" b="81 37 93 37"/>
+ <a u="24DA" b="81 37 93 38"/>
+ <a u="24DB" b="81 37 93 39"/>
+ <a u="24DC" b="81 37 94 30"/>
+ <a u="24DD" b="81 37 94 31"/>
+ <a u="24DE" b="81 37 94 32"/>
+ <a u="24DF" b="81 37 94 33"/>
+ <a u="24E0" b="81 37 94 34"/>
+ <a u="24E1" b="81 37 94 35"/>
+ <a u="24E2" b="81 37 94 36"/>
+ <a u="24E3" b="81 37 94 37"/>
+ <a u="24E4" b="81 37 94 38"/>
+ <a u="24E5" b="81 37 94 39"/>
+ <a u="24E6" b="81 37 95 30"/>
+ <a u="24E7" b="81 37 95 31"/>
+ <a u="24E8" b="81 37 95 32"/>
+ <a u="24E9" b="81 37 95 33"/>
+ <a u="24EA" b="81 37 95 34"/>
+ <a u="24EB" b="81 37 95 35"/>
+ <a u="24EC" b="81 37 95 36"/>
+ <a u="24ED" b="81 37 95 37"/>
+ <a u="24EE" b="81 37 95 38"/>
+ <a u="24EF" b="81 37 95 39"/>
+ <a u="24F0" b="81 37 96 30"/>
+ <a u="24F1" b="81 37 96 31"/>
+ <a u="24F2" b="81 37 96 32"/>
+ <a u="24F3" b="81 37 96 33"/>
+ <a u="24F4" b="81 37 96 34"/>
+ <a u="24F5" b="81 37 96 35"/>
+ <a u="24F6" b="81 37 96 36"/>
+ <a u="24F7" b="81 37 96 37"/>
+ <a u="24F8" b="81 37 96 38"/>
+ <a u="24F9" b="81 37 96 39"/>
+ <a u="24FA" b="81 37 97 30"/>
+ <a u="24FB" b="81 37 97 31"/>
+ <a u="24FC" b="81 37 97 32"/>
+ <a u="24FD" b="81 37 97 33"/>
+ <a u="24FE" b="81 37 97 34"/>
+ <a u="24FF" b="81 37 97 35"/>
+ <a u="2500" b="A9 A4"/>
+ <a u="2501" b="A9 A5"/>
+ <a u="2502" b="A9 A6"/>
+ <a u="2503" b="A9 A7"/>
+ <a u="2504" b="A9 A8"/>
+ <a u="2505" b="A9 A9"/>
+ <a u="2506" b="A9 AA"/>
+ <a u="2507" b="A9 AB"/>
+ <a u="2508" b="A9 AC"/>
+ <a u="2509" b="A9 AD"/>
+ <a u="250A" b="A9 AE"/>
+ <a u="250B" b="A9 AF"/>
+ <a u="250C" b="A9 B0"/>
+ <a u="250D" b="A9 B1"/>
+ <a u="250E" b="A9 B2"/>
+ <a u="250F" b="A9 B3"/>
+ <a u="2510" b="A9 B4"/>
+ <a u="2511" b="A9 B5"/>
+ <a u="2512" b="A9 B6"/>
+ <a u="2513" b="A9 B7"/>
+ <a u="2514" b="A9 B8"/>
+ <a u="2515" b="A9 B9"/>
+ <a u="2516" b="A9 BA"/>
+ <a u="2517" b="A9 BB"/>
+ <a u="2518" b="A9 BC"/>
+ <a u="2519" b="A9 BD"/>
+ <a u="251A" b="A9 BE"/>
+ <a u="251B" b="A9 BF"/>
+ <a u="251C" b="A9 C0"/>
+ <a u="251D" b="A9 C1"/>
+ <a u="251E" b="A9 C2"/>
+ <a u="251F" b="A9 C3"/>
+ <a u="2520" b="A9 C4"/>
+ <a u="2521" b="A9 C5"/>
+ <a u="2522" b="A9 C6"/>
+ <a u="2523" b="A9 C7"/>
+ <a u="2524" b="A9 C8"/>
+ <a u="2525" b="A9 C9"/>
+ <a u="2526" b="A9 CA"/>
+ <a u="2527" b="A9 CB"/>
+ <a u="2528" b="A9 CC"/>
+ <a u="2529" b="A9 CD"/>
+ <a u="252A" b="A9 CE"/>
+ <a u="252B" b="A9 CF"/>
+ <a u="252C" b="A9 D0"/>
+ <a u="252D" b="A9 D1"/>
+ <a u="252E" b="A9 D2"/>
+ <a u="252F" b="A9 D3"/>
+ <a u="2530" b="A9 D4"/>
+ <a u="2531" b="A9 D5"/>
+ <a u="2532" b="A9 D6"/>
+ <a u="2533" b="A9 D7"/>
+ <a u="2534" b="A9 D8"/>
+ <a u="2535" b="A9 D9"/>
+ <a u="2536" b="A9 DA"/>
+ <a u="2537" b="A9 DB"/>
+ <a u="2538" b="A9 DC"/>
+ <a u="2539" b="A9 DD"/>
+ <a u="253A" b="A9 DE"/>
+ <a u="253B" b="A9 DF"/>
+ <a u="253C" b="A9 E0"/>
+ <a u="253D" b="A9 E1"/>
+ <a u="253E" b="A9 E2"/>
+ <a u="253F" b="A9 E3"/>
+ <a u="2540" b="A9 E4"/>
+ <a u="2541" b="A9 E5"/>
+ <a u="2542" b="A9 E6"/>
+ <a u="2543" b="A9 E7"/>
+ <a u="2544" b="A9 E8"/>
+ <a u="2545" b="A9 E9"/>
+ <a u="2546" b="A9 EA"/>
+ <a u="2547" b="A9 EB"/>
+ <a u="2548" b="A9 EC"/>
+ <a u="2549" b="A9 ED"/>
+ <a u="254A" b="A9 EE"/>
+ <a u="254B" b="A9 EF"/>
+ <a u="254C" b="81 37 97 36"/>
+ <a u="254D" b="81 37 97 37"/>
+ <a u="254E" b="81 37 97 38"/>
+ <a u="254F" b="81 37 97 39"/>
+ <a u="2550" b="A8 54"/>
+ <a u="2551" b="A8 55"/>
+ <a u="2552" b="A8 56"/>
+ <a u="2553" b="A8 57"/>
+ <a u="2554" b="A8 58"/>
+ <a u="2555" b="A8 59"/>
+ <a u="2556" b="A8 5A"/>
+ <a u="2557" b="A8 5B"/>
+ <a u="2558" b="A8 5C"/>
+ <a u="2559" b="A8 5D"/>
+ <a u="255A" b="A8 5E"/>
+ <a u="255B" b="A8 5F"/>
+ <a u="255C" b="A8 60"/>
+ <a u="255D" b="A8 61"/>
+ <a u="255E" b="A8 62"/>
+ <a u="255F" b="A8 63"/>
+ <a u="2560" b="A8 64"/>
+ <a u="2561" b="A8 65"/>
+ <a u="2562" b="A8 66"/>
+ <a u="2563" b="A8 67"/>
+ <a u="2564" b="A8 68"/>
+ <a u="2565" b="A8 69"/>
+ <a u="2566" b="A8 6A"/>
+ <a u="2567" b="A8 6B"/>
+ <a u="2568" b="A8 6C"/>
+ <a u="2569" b="A8 6D"/>
+ <a u="256A" b="A8 6E"/>
+ <a u="256B" b="A8 6F"/>
+ <a u="256C" b="A8 70"/>
+ <a u="256D" b="A8 71"/>
+ <a u="256E" b="A8 72"/>
+ <a u="256F" b="A8 73"/>
+ <a u="2570" b="A8 74"/>
+ <a u="2571" b="A8 75"/>
+ <a u="2572" b="A8 76"/>
+ <a u="2573" b="A8 77"/>
+ <a u="2574" b="81 37 98 30"/>
+ <a u="2575" b="81 37 98 31"/>
+ <a u="2576" b="81 37 98 32"/>
+ <a u="2577" b="81 37 98 33"/>
+ <a u="2578" b="81 37 98 34"/>
+ <a u="2579" b="81 37 98 35"/>
+ <a u="257A" b="81 37 98 36"/>
+ <a u="257B" b="81 37 98 37"/>
+ <a u="257C" b="81 37 98 38"/>
+ <a u="257D" b="81 37 98 39"/>
+ <a u="257E" b="81 37 99 30"/>
+ <a u="257F" b="81 37 99 31"/>
+ <a u="2580" b="81 37 99 32"/>
+ <a u="2581" b="A8 78"/>
+ <a u="2582" b="A8 79"/>
+ <a u="2583" b="A8 7A"/>
+ <a u="2584" b="A8 7B"/>
+ <a u="2585" b="A8 7C"/>
+ <a u="2586" b="A8 7D"/>
+ <a u="2587" b="A8 7E"/>
+ <a u="2588" b="A8 80"/>
+ <a u="2589" b="A8 81"/>
+ <a u="258A" b="A8 82"/>
+ <a u="258B" b="A8 83"/>
+ <a u="258C" b="A8 84"/>
+ <a u="258D" b="A8 85"/>
+ <a u="258E" b="A8 86"/>
+ <a u="258F" b="A8 87"/>
+ <a u="2590" b="81 37 99 33"/>
+ <a u="2591" b="81 37 99 34"/>
+ <a u="2592" b="81 37 99 35"/>
+ <a u="2593" b="A8 88"/>
+ <a u="2594" b="A8 89"/>
+ <a u="2595" b="A8 8A"/>
+ <a u="2596" b="81 37 99 36"/>
+ <a u="2597" b="81 37 99 37"/>
+ <a u="2598" b="81 37 99 38"/>
+ <a u="2599" b="81 37 99 39"/>
+ <a u="259A" b="81 37 9A 30"/>
+ <a u="259B" b="81 37 9A 31"/>
+ <a u="259C" b="81 37 9A 32"/>
+ <a u="259D" b="81 37 9A 33"/>
+ <a u="259E" b="81 37 9A 34"/>
+ <a u="259F" b="81 37 9A 35"/>
+ <a u="25A0" b="A1 F6"/>
+ <a u="25A1" b="A1 F5"/>
+ <a u="25A2" b="81 37 9A 36"/>
+ <a u="25A3" b="81 37 9A 37"/>
+ <a u="25A4" b="81 37 9A 38"/>
+ <a u="25A5" b="81 37 9A 39"/>
+ <a u="25A6" b="81 37 9B 30"/>
+ <a u="25A7" b="81 37 9B 31"/>
+ <a u="25A8" b="81 37 9B 32"/>
+ <a u="25A9" b="81 37 9B 33"/>
+ <a u="25AA" b="81 37 9B 34"/>
+ <a u="25AB" b="81 37 9B 35"/>
+ <a u="25AC" b="81 37 9B 36"/>
+ <a u="25AD" b="81 37 9B 37"/>
+ <a u="25AE" b="81 37 9B 38"/>
+ <a u="25AF" b="81 37 9B 39"/>
+ <a u="25B0" b="81 37 9C 30"/>
+ <a u="25B1" b="81 37 9C 31"/>
+ <a u="25B2" b="A1 F8"/>
+ <a u="25B3" b="A1 F7"/>
+ <a u="25B4" b="81 37 9C 32"/>
+ <a u="25B5" b="81 37 9C 33"/>
+ <a u="25B6" b="81 37 9C 34"/>
+ <a u="25B7" b="81 37 9C 35"/>
+ <a u="25B8" b="81 37 9C 36"/>
+ <a u="25B9" b="81 37 9C 37"/>
+ <a u="25BA" b="81 37 9C 38"/>
+ <a u="25BB" b="81 37 9C 39"/>
+ <a u="25BC" b="A8 8B"/>
+ <a u="25BD" b="A8 8C"/>
+ <a u="25BE" b="81 37 9D 30"/>
+ <a u="25BF" b="81 37 9D 31"/>
+ <a u="25C0" b="81 37 9D 32"/>
+ <a u="25C1" b="81 37 9D 33"/>
+ <a u="25C2" b="81 37 9D 34"/>
+ <a u="25C3" b="81 37 9D 35"/>
+ <a u="25C4" b="81 37 9D 36"/>
+ <a u="25C5" b="81 37 9D 37"/>
+ <a u="25C6" b="A1 F4"/>
+ <a u="25C7" b="A1 F3"/>
+ <a u="25C8" b="81 37 9D 38"/>
+ <a u="25C9" b="81 37 9D 39"/>
+ <a u="25CA" b="81 37 9E 30"/>
+ <a u="25CB" b="A1 F0"/>
+ <a u="25CC" b="81 37 9E 31"/>
+ <a u="25CD" b="81 37 9E 32"/>
+ <a u="25CE" b="A1 F2"/>
+ <a u="25CF" b="A1 F1"/>
+ <a u="25D0" b="81 37 9E 33"/>
+ <a u="25D1" b="81 37 9E 34"/>
+ <a u="25D2" b="81 37 9E 35"/>
+ <a u="25D3" b="81 37 9E 36"/>
+ <a u="25D4" b="81 37 9E 37"/>
+ <a u="25D5" b="81 37 9E 38"/>
+ <a u="25D6" b="81 37 9E 39"/>
+ <a u="25D7" b="81 37 9F 30"/>
+ <a u="25D8" b="81 37 9F 31"/>
+ <a u="25D9" b="81 37 9F 32"/>
+ <a u="25DA" b="81 37 9F 33"/>
+ <a u="25DB" b="81 37 9F 34"/>
+ <a u="25DC" b="81 37 9F 35"/>
+ <a u="25DD" b="81 37 9F 36"/>
+ <a u="25DE" b="81 37 9F 37"/>
+ <a u="25DF" b="81 37 9F 38"/>
+ <a u="25E0" b="81 37 9F 39"/>
+ <a u="25E1" b="81 37 A0 30"/>
+ <a u="25E2" b="A8 8D"/>
+ <a u="25E3" b="A8 8E"/>
+ <a u="25E4" b="A8 8F"/>
+ <a u="25E5" b="A8 90"/>
+ <a u="25E6" b="81 37 A0 31"/>
+ <a u="25E7" b="81 37 A0 32"/>
+ <a u="25E8" b="81 37 A0 33"/>
+ <a u="25E9" b="81 37 A0 34"/>
+ <a u="25EA" b="81 37 A0 35"/>
+ <a u="25EB" b="81 37 A0 36"/>
+ <a u="25EC" b="81 37 A0 37"/>
+ <a u="25ED" b="81 37 A0 38"/>
+ <a u="25EE" b="81 37 A0 39"/>
+ <a u="25EF" b="81 37 A1 30"/>
+ <a u="25F0" b="81 37 A1 31"/>
+ <a u="25F1" b="81 37 A1 32"/>
+ <a u="25F2" b="81 37 A1 33"/>
+ <a u="25F3" b="81 37 A1 34"/>
+ <a u="25F4" b="81 37 A1 35"/>
+ <a u="25F5" b="81 37 A1 36"/>
+ <a u="25F6" b="81 37 A1 37"/>
+ <a u="25F7" b="81 37 A1 38"/>
+ <a u="25F8" b="81 37 A1 39"/>
+ <a u="25F9" b="81 37 A2 30"/>
+ <a u="25FA" b="81 37 A2 31"/>
+ <a u="25FB" b="81 37 A2 32"/>
+ <a u="25FC" b="81 37 A2 33"/>
+ <a u="25FD" b="81 37 A2 34"/>
+ <a u="25FE" b="81 37 A2 35"/>
+ <a u="25FF" b="81 37 A2 36"/>
+ <a u="2600" b="81 37 A2 37"/>
+ <a u="2601" b="81 37 A2 38"/>
+ <a u="2602" b="81 37 A2 39"/>
+ <a u="2603" b="81 37 A3 30"/>
+ <a u="2604" b="81 37 A3 31"/>
+ <a u="2605" b="A1 EF"/>
+ <a u="2606" b="A1 EE"/>
+ <a u="2607" b="81 37 A3 32"/>
+ <a u="2608" b="81 37 A3 33"/>
+ <a u="2609" b="A8 91"/>
+ <a u="260A" b="81 37 A3 34"/>
+ <a u="260B" b="81 37 A3 35"/>
+ <a u="260C" b="81 37 A3 36"/>
+ <a u="260D" b="81 37 A3 37"/>
+ <a u="260E" b="81 37 A3 38"/>
+ <a u="260F" b="81 37 A3 39"/>
+ <a u="2610" b="81 37 A4 30"/>
+ <a u="2611" b="81 37 A4 31"/>
+ <a u="2612" b="81 37 A4 32"/>
+ <a u="2613" b="81 37 A4 33"/>
+ <a u="2614" b="81 37 A4 34"/>
+ <a u="2615" b="81 37 A4 35"/>
+ <a u="2616" b="81 37 A4 36"/>
+ <a u="2617" b="81 37 A4 37"/>
+ <a u="2618" b="81 37 A4 38"/>
+ <a u="2619" b="81 37 A4 39"/>
+ <a u="261A" b="81 37 A5 30"/>
+ <a u="261B" b="81 37 A5 31"/>
+ <a u="261C" b="81 37 A5 32"/>
+ <a u="261D" b="81 37 A5 33"/>
+ <a u="261E" b="81 37 A5 34"/>
+ <a u="261F" b="81 37 A5 35"/>
+ <a u="2620" b="81 37 A5 36"/>
+ <a u="2621" b="81 37 A5 37"/>
+ <a u="2622" b="81 37 A5 38"/>
+ <a u="2623" b="81 37 A5 39"/>
+ <a u="2624" b="81 37 A6 30"/>
+ <a u="2625" b="81 37 A6 31"/>
+ <a u="2626" b="81 37 A6 32"/>
+ <a u="2627" b="81 37 A6 33"/>
+ <a u="2628" b="81 37 A6 34"/>
+ <a u="2629" b="81 37 A6 35"/>
+ <a u="262A" b="81 37 A6 36"/>
+ <a u="262B" b="81 37 A6 37"/>
+ <a u="262C" b="81 37 A6 38"/>
+ <a u="262D" b="81 37 A6 39"/>
+ <a u="262E" b="81 37 A7 30"/>
+ <a u="262F" b="81 37 A7 31"/>
+ <a u="2630" b="81 37 A7 32"/>
+ <a u="2631" b="81 37 A7 33"/>
+ <a u="2632" b="81 37 A7 34"/>
+ <a u="2633" b="81 37 A7 35"/>
+ <a u="2634" b="81 37 A7 36"/>
+ <a u="2635" b="81 37 A7 37"/>
+ <a u="2636" b="81 37 A7 38"/>
+ <a u="2637" b="81 37 A7 39"/>
+ <a u="2638" b="81 37 A8 30"/>
+ <a u="2639" b="81 37 A8 31"/>
+ <a u="263A" b="81 37 A8 32"/>
+ <a u="263B" b="81 37 A8 33"/>
+ <a u="263C" b="81 37 A8 34"/>
+ <a u="263D" b="81 37 A8 35"/>
+ <a u="263E" b="81 37 A8 36"/>
+ <a u="263F" b="81 37 A8 37"/>
+ <a u="2640" b="A1 E2"/>
+ <a u="2641" b="81 37 A8 38"/>
+ <a u="2642" b="A1 E1"/>
+ <a u="2E81" b="FE 50"/>
+ <a u="2E82" b="81 38 FD 39"/>
+ <a u="2E83" b="81 38 FE 30"/>
+ <a u="2E84" b="FE 54"/>
+ <a u="2E85" b="81 38 FE 31"/>
+ <a u="2E86" b="81 38 FE 32"/>
+ <a u="2E87" b="81 38 FE 33"/>
+ <a u="2E88" b="FE 57"/>
+ <a u="2E89" b="81 38 FE 34"/>
+ <a u="2E8A" b="81 38 FE 35"/>
+ <a u="2E8B" b="FE 58"/>
+ <a u="2E8C" b="FE 5D"/>
+ <a u="2E8D" b="81 38 FE 36"/>
+ <a u="2E8E" b="81 38 FE 37"/>
+ <a u="2E8F" b="81 38 FE 38"/>
+ <a u="2E90" b="81 38 FE 39"/>
+ <a u="2E91" b="81 39 81 30"/>
+ <a u="2E92" b="81 39 81 31"/>
+ <a u="2E93" b="81 39 81 32"/>
+ <a u="2E94" b="81 39 81 33"/>
+ <a u="2E95" b="81 39 81 34"/>
+ <a u="2E96" b="81 39 81 35"/>
+ <a u="2E97" b="FE 5E"/>
+ <a u="2E98" b="81 39 81 36"/>
+ <a u="2E99" b="81 39 81 37"/>
+ <a u="2E9A" b="81 39 81 38"/>
+ <a u="2E9B" b="81 39 81 39"/>
+ <a u="2E9C" b="81 39 82 30"/>
+ <a u="2E9D" b="81 39 82 31"/>
+ <a u="2E9E" b="81 39 82 32"/>
+ <a u="2E9F" b="81 39 82 33"/>
+ <a u="2EA0" b="81 39 82 34"/>
+ <a u="2EA1" b="81 39 82 35"/>
+ <a u="2EA2" b="81 39 82 36"/>
+ <a u="2EA3" b="81 39 82 37"/>
+ <a u="2EA4" b="81 39 82 38"/>
+ <a u="2EA5" b="81 39 82 39"/>
+ <a u="2EA6" b="81 39 83 30"/>
+ <a u="2EA7" b="FE 6B"/>
+ <a u="2EA8" b="81 39 83 31"/>
+ <a u="2EA9" b="81 39 83 32"/>
+ <a u="2EAA" b="FE 6E"/>
+ <a u="2EAB" b="81 39 83 33"/>
+ <a u="2EAC" b="81 39 83 34"/>
+ <a u="2EAD" b="81 39 83 35"/>
+ <a u="2EAE" b="FE 71"/>
+ <a u="2EAF" b="81 39 83 36"/>
+ <a u="2EB0" b="81 39 83 37"/>
+ <a u="2EB1" b="81 39 83 38"/>
+ <a u="2EB2" b="81 39 83 39"/>
+ <a u="2EB3" b="FE 73"/>
+ <a u="2EB4" b="81 39 84 30"/>
+ <a u="2EB5" b="81 39 84 31"/>
+ <a u="2EB6" b="FE 74"/>
+ <a u="2EB7" b="FE 75"/>
+ <a u="2EB8" b="81 39 84 32"/>
+ <a u="2EB9" b="81 39 84 33"/>
+ <a u="2EBA" b="81 39 84 34"/>
+ <a u="2EBB" b="FE 79"/>
+ <a u="2EBC" b="81 39 84 35"/>
+ <a u="2EBD" b="81 39 84 36"/>
+ <a u="2EBE" b="81 39 84 37"/>
+ <a u="2EBF" b="81 39 84 38"/>
+ <a u="2EC0" b="81 39 84 39"/>
+ <a u="2EC1" b="81 39 85 30"/>
+ <a u="2EC2" b="81 39 85 31"/>
+ <a u="2EC3" b="81 39 85 32"/>
+ <a u="2EC4" b="81 39 85 33"/>
+ <a u="2EC5" b="81 39 85 34"/>
+ <a u="2EC6" b="81 39 85 35"/>
+ <a u="2EC7" b="81 39 85 36"/>
+ <a u="2EC8" b="81 39 85 37"/>
+ <a u="2EC9" b="81 39 85 38"/>
+ <a u="2ECA" b="FE 84"/>
+ <a u="2ECB" b="81 39 85 39"/>
+ <a u="2ECC" b="81 39 86 30"/>
+ <a u="2ECD" b="81 39 86 31"/>
+ <a u="2ECE" b="81 39 86 32"/>
+ <a u="2ECF" b="81 39 86 33"/>
+ <a u="2ED0" b="81 39 86 34"/>
+ <a u="2ED1" b="81 39 86 35"/>
+ <a u="2ED2" b="81 39 86 36"/>
+ <a u="2ED3" b="81 39 86 37"/>
+ <a u="2ED4" b="81 39 86 38"/>
+ <a u="2ED5" b="81 39 86 39"/>
+ <a u="2ED6" b="81 39 87 30"/>
+ <a u="2ED7" b="81 39 87 31"/>
+ <a u="2ED8" b="81 39 87 32"/>
+ <a u="2ED9" b="81 39 87 33"/>
+ <a u="2EDA" b="81 39 87 34"/>
+ <a u="2EDB" b="81 39 87 35"/>
+ <a u="2EDC" b="81 39 87 36"/>
+ <a u="2EDD" b="81 39 87 37"/>
+ <a u="2EDE" b="81 39 87 38"/>
+ <a u="2EDF" b="81 39 87 39"/>
+ <a u="2EE0" b="81 39 88 30"/>
+ <a u="2EE1" b="81 39 88 31"/>
+ <a u="2EE2" b="81 39 88 32"/>
+ <a u="2EE3" b="81 39 88 33"/>
+ <a u="2EE4" b="81 39 88 34"/>
+ <a u="2EE5" b="81 39 88 35"/>
+ <a u="2EE6" b="81 39 88 36"/>
+ <a u="2EE7" b="81 39 88 37"/>
+ <a u="2EE8" b="81 39 88 38"/>
+ <a u="2EE9" b="81 39 88 39"/>
+ <a u="2EEA" b="81 39 89 30"/>
+ <a u="2EEB" b="81 39 89 31"/>
+ <a u="2EEC" b="81 39 89 32"/>
+ <a u="2EED" b="81 39 89 33"/>
+ <a u="2EEE" b="81 39 89 34"/>
+ <a u="2EEF" b="81 39 89 35"/>
+ <a u="2EF0" b="81 39 89 36"/>
+ <a u="2EF1" b="81 39 89 37"/>
+ <a u="2EF2" b="81 39 89 38"/>
+ <a u="2EF3" b="81 39 89 39"/>
+ <a u="2EF4" b="81 39 8A 30"/>
+ <a u="2EF5" b="81 39 8A 31"/>
+ <a u="2EF6" b="81 39 8A 32"/>
+ <a u="2EF7" b="81 39 8A 33"/>
+ <a u="2EF8" b="81 39 8A 34"/>
+ <a u="2EF9" b="81 39 8A 35"/>
+ <a u="2EFA" b="81 39 8A 36"/>
+ <a u="2EFB" b="81 39 8A 37"/>
+ <a u="2EFC" b="81 39 8A 38"/>
+ <a u="2EFD" b="81 39 8A 39"/>
+ <a u="2EFE" b="81 39 8B 30"/>
+ <a u="2EFF" b="81 39 8B 31"/>
+ <a u="2F00" b="81 39 8B 32"/>
+ <a u="2F01" b="81 39 8B 33"/>
+ <a u="2F02" b="81 39 8B 34"/>
+ <a u="2F03" b="81 39 8B 35"/>
+ <a u="2F04" b="81 39 8B 36"/>
+ <a u="2F05" b="81 39 8B 37"/>
+ <a u="2F06" b="81 39 8B 38"/>
+ <a u="2F07" b="81 39 8B 39"/>
+ <a u="2F08" b="81 39 8C 30"/>
+ <a u="2F09" b="81 39 8C 31"/>
+ <a u="2F0A" b="81 39 8C 32"/>
+ <a u="2F0B" b="81 39 8C 33"/>
+ <a u="2F0C" b="81 39 8C 34"/>
+ <a u="2F0D" b="81 39 8C 35"/>
+ <a u="2F0E" b="81 39 8C 36"/>
+ <a u="2F0F" b="81 39 8C 37"/>
+ <a u="2F10" b="81 39 8C 38"/>
+ <a u="2F11" b="81 39 8C 39"/>
+ <a u="2F12" b="81 39 8D 30"/>
+ <a u="2F13" b="81 39 8D 31"/>
+ <a u="2F14" b="81 39 8D 32"/>
+ <a u="2F15" b="81 39 8D 33"/>
+ <a u="2F16" b="81 39 8D 34"/>
+ <a u="2F17" b="81 39 8D 35"/>
+ <a u="2F18" b="81 39 8D 36"/>
+ <a u="2F19" b="81 39 8D 37"/>
+ <a u="2F1A" b="81 39 8D 38"/>
+ <a u="2F1B" b="81 39 8D 39"/>
+ <a u="2F1C" b="81 39 8E 30"/>
+ <a u="2F1D" b="81 39 8E 31"/>
+ <a u="2F1E" b="81 39 8E 32"/>
+ <a u="2F1F" b="81 39 8E 33"/>
+ <a u="2F20" b="81 39 8E 34"/>
+ <a u="2F21" b="81 39 8E 35"/>
+ <a u="2F22" b="81 39 8E 36"/>
+ <a u="2F23" b="81 39 8E 37"/>
+ <a u="2F24" b="81 39 8E 38"/>
+ <a u="2F25" b="81 39 8E 39"/>
+ <a u="2F26" b="81 39 8F 30"/>
+ <a u="2F27" b="81 39 8F 31"/>
+ <a u="2F28" b="81 39 8F 32"/>
+ <a u="2F29" b="81 39 8F 33"/>
+ <a u="2F2A" b="81 39 8F 34"/>
+ <a u="2F2B" b="81 39 8F 35"/>
+ <a u="2F2C" b="81 39 8F 36"/>
+ <a u="2F2D" b="81 39 8F 37"/>
+ <a u="2F2E" b="81 39 8F 38"/>
+ <a u="2F2F" b="81 39 8F 39"/>
+ <a u="2F30" b="81 39 90 30"/>
+ <a u="2F31" b="81 39 90 31"/>
+ <a u="2F32" b="81 39 90 32"/>
+ <a u="2F33" b="81 39 90 33"/>
+ <a u="2F34" b="81 39 90 34"/>
+ <a u="2F35" b="81 39 90 35"/>
+ <a u="2F36" b="81 39 90 36"/>
+ <a u="2F37" b="81 39 90 37"/>
+ <a u="2F38" b="81 39 90 38"/>
+ <a u="2F39" b="81 39 90 39"/>
+ <a u="2F3A" b="81 39 91 30"/>
+ <a u="2F3B" b="81 39 91 31"/>
+ <a u="2F3C" b="81 39 91 32"/>
+ <a u="2F3D" b="81 39 91 33"/>
+ <a u="2F3E" b="81 39 91 34"/>
+ <a u="2F3F" b="81 39 91 35"/>
+ <a u="2F40" b="81 39 91 36"/>
+ <a u="2F41" b="81 39 91 37"/>
+ <a u="2F42" b="81 39 91 38"/>
+ <a u="2F43" b="81 39 91 39"/>
+ <a u="2F44" b="81 39 92 30"/>
+ <a u="2F45" b="81 39 92 31"/>
+ <a u="2F46" b="81 39 92 32"/>
+ <a u="2F47" b="81 39 92 33"/>
+ <a u="2F48" b="81 39 92 34"/>
+ <a u="2F49" b="81 39 92 35"/>
+ <a u="2F4A" b="81 39 92 36"/>
+ <a u="2F4B" b="81 39 92 37"/>
+ <a u="2F4C" b="81 39 92 38"/>
+ <a u="2F4D" b="81 39 92 39"/>
+ <a u="2F4E" b="81 39 93 30"/>
+ <a u="2F4F" b="81 39 93 31"/>
+ <a u="2F50" b="81 39 93 32"/>
+ <a u="2F51" b="81 39 93 33"/>
+ <a u="2F52" b="81 39 93 34"/>
+ <a u="2F53" b="81 39 93 35"/>
+ <a u="2F54" b="81 39 93 36"/>
+ <a u="2F55" b="81 39 93 37"/>
+ <a u="2F56" b="81 39 93 38"/>
+ <a u="2F57" b="81 39 93 39"/>
+ <a u="2F58" b="81 39 94 30"/>
+ <a u="2F59" b="81 39 94 31"/>
+ <a u="2F5A" b="81 39 94 32"/>
+ <a u="2F5B" b="81 39 94 33"/>
+ <a u="2F5C" b="81 39 94 34"/>
+ <a u="2F5D" b="81 39 94 35"/>
+ <a u="2F5E" b="81 39 94 36"/>
+ <a u="2F5F" b="81 39 94 37"/>
+ <a u="2F60" b="81 39 94 38"/>
+ <a u="2F61" b="81 39 94 39"/>
+ <a u="2F62" b="81 39 95 30"/>
+ <a u="2F63" b="81 39 95 31"/>
+ <a u="2F64" b="81 39 95 32"/>
+ <a u="2F65" b="81 39 95 33"/>
+ <a u="2F66" b="81 39 95 34"/>
+ <a u="2F67" b="81 39 95 35"/>
+ <a u="2F68" b="81 39 95 36"/>
+ <a u="2F69" b="81 39 95 37"/>
+ <a u="2F6A" b="81 39 95 38"/>
+ <a u="2F6B" b="81 39 95 39"/>
+ <a u="2F6C" b="81 39 96 30"/>
+ <a u="2F6D" b="81 39 96 31"/>
+ <a u="2F6E" b="81 39 96 32"/>
+ <a u="2F6F" b="81 39 96 33"/>
+ <a u="2F70" b="81 39 96 34"/>
+ <a u="2F71" b="81 39 96 35"/>
+ <a u="2F72" b="81 39 96 36"/>
+ <a u="2F73" b="81 39 96 37"/>
+ <a u="2F74" b="81 39 96 38"/>
+ <a u="2F75" b="81 39 96 39"/>
+ <a u="2F76" b="81 39 97 30"/>
+ <a u="2F77" b="81 39 97 31"/>
+ <a u="2F78" b="81 39 97 32"/>
+ <a u="2F79" b="81 39 97 33"/>
+ <a u="2F7A" b="81 39 97 34"/>
+ <a u="2F7B" b="81 39 97 35"/>
+ <a u="2F7C" b="81 39 97 36"/>
+ <a u="2F7D" b="81 39 97 37"/>
+ <a u="2F7E" b="81 39 97 38"/>
+ <a u="2F7F" b="81 39 97 39"/>
+ <a u="2F80" b="81 39 98 30"/>
+ <a u="2F81" b="81 39 98 31"/>
+ <a u="2F82" b="81 39 98 32"/>
+ <a u="2F83" b="81 39 98 33"/>
+ <a u="2F84" b="81 39 98 34"/>
+ <a u="2F85" b="81 39 98 35"/>
+ <a u="2F86" b="81 39 98 36"/>
+ <a u="2F87" b="81 39 98 37"/>
+ <a u="2F88" b="81 39 98 38"/>
+ <a u="2F89" b="81 39 98 39"/>
+ <a u="2F8A" b="81 39 99 30"/>
+ <a u="2F8B" b="81 39 99 31"/>
+ <a u="2F8C" b="81 39 99 32"/>
+ <a u="2F8D" b="81 39 99 33"/>
+ <a u="2F8E" b="81 39 99 34"/>
+ <a u="2F8F" b="81 39 99 35"/>
+ <a u="2F90" b="81 39 99 36"/>
+ <a u="2F91" b="81 39 99 37"/>
+ <a u="2F92" b="81 39 99 38"/>
+ <a u="2F93" b="81 39 99 39"/>
+ <a u="2F94" b="81 39 9A 30"/>
+ <a u="2F95" b="81 39 9A 31"/>
+ <a u="2F96" b="81 39 9A 32"/>
+ <a u="2F97" b="81 39 9A 33"/>
+ <a u="2F98" b="81 39 9A 34"/>
+ <a u="2F99" b="81 39 9A 35"/>
+ <a u="2F9A" b="81 39 9A 36"/>
+ <a u="2F9B" b="81 39 9A 37"/>
+ <a u="2F9C" b="81 39 9A 38"/>
+ <a u="2F9D" b="81 39 9A 39"/>
+ <a u="2F9E" b="81 39 9B 30"/>
+ <a u="2F9F" b="81 39 9B 31"/>
+ <a u="2FA0" b="81 39 9B 32"/>
+ <a u="2FA1" b="81 39 9B 33"/>
+ <a u="2FA2" b="81 39 9B 34"/>
+ <a u="2FA3" b="81 39 9B 35"/>
+ <a u="2FA4" b="81 39 9B 36"/>
+ <a u="2FA5" b="81 39 9B 37"/>
+ <a u="2FA6" b="81 39 9B 38"/>
+ <a u="2FA7" b="81 39 9B 39"/>
+ <a u="2FA8" b="81 39 9C 30"/>
+ <a u="2FA9" b="81 39 9C 31"/>
+ <a u="2FAA" b="81 39 9C 32"/>
+ <a u="2FAB" b="81 39 9C 33"/>
+ <a u="2FAC" b="81 39 9C 34"/>
+ <a u="2FAD" b="81 39 9C 35"/>
+ <a u="2FAE" b="81 39 9C 36"/>
+ <a u="2FAF" b="81 39 9C 37"/>
+ <a u="2FB0" b="81 39 9C 38"/>
+ <a u="2FB1" b="81 39 9C 39"/>
+ <a u="2FB2" b="81 39 9D 30"/>
+ <a u="2FB3" b="81 39 9D 31"/>
+ <a u="2FB4" b="81 39 9D 32"/>
+ <a u="2FB5" b="81 39 9D 33"/>
+ <a u="2FB6" b="81 39 9D 34"/>
+ <a u="2FB7" b="81 39 9D 35"/>
+ <a u="2FB8" b="81 39 9D 36"/>
+ <a u="2FB9" b="81 39 9D 37"/>
+ <a u="2FBA" b="81 39 9D 38"/>
+ <a u="2FBB" b="81 39 9D 39"/>
+ <a u="2FBC" b="81 39 9E 30"/>
+ <a u="2FBD" b="81 39 9E 31"/>
+ <a u="2FBE" b="81 39 9E 32"/>
+ <a u="2FBF" b="81 39 9E 33"/>
+ <a u="2FC0" b="81 39 9E 34"/>
+ <a u="2FC1" b="81 39 9E 35"/>
+ <a u="2FC2" b="81 39 9E 36"/>
+ <a u="2FC3" b="81 39 9E 37"/>
+ <a u="2FC4" b="81 39 9E 38"/>
+ <a u="2FC5" b="81 39 9E 39"/>
+ <a u="2FC6" b="81 39 9F 30"/>
+ <a u="2FC7" b="81 39 9F 31"/>
+ <a u="2FC8" b="81 39 9F 32"/>
+ <a u="2FC9" b="81 39 9F 33"/>
+ <a u="2FCA" b="81 39 9F 34"/>
+ <a u="2FCB" b="81 39 9F 35"/>
+ <a u="2FCC" b="81 39 9F 36"/>
+ <a u="2FCD" b="81 39 9F 37"/>
+ <a u="2FCE" b="81 39 9F 38"/>
+ <a u="2FCF" b="81 39 9F 39"/>
+ <a u="2FD0" b="81 39 A0 30"/>
+ <a u="2FD1" b="81 39 A0 31"/>
+ <a u="2FD2" b="81 39 A0 32"/>
+ <a u="2FD3" b="81 39 A0 33"/>
+ <a u="2FD4" b="81 39 A0 34"/>
+ <a u="2FD5" b="81 39 A0 35"/>
+ <a u="2FD6" b="81 39 A0 36"/>
+ <a u="2FD7" b="81 39 A0 37"/>
+ <a u="2FD8" b="81 39 A0 38"/>
+ <a u="2FD9" b="81 39 A0 39"/>
+ <a u="2FDA" b="81 39 A1 30"/>
+ <a u="2FDB" b="81 39 A1 31"/>
+ <a u="2FDC" b="81 39 A1 32"/>
+ <a u="2FDD" b="81 39 A1 33"/>
+ <a u="2FDE" b="81 39 A1 34"/>
+ <a u="2FDF" b="81 39 A1 35"/>
+ <a u="2FE0" b="81 39 A1 36"/>
+ <a u="2FE1" b="81 39 A1 37"/>
+ <a u="2FE2" b="81 39 A1 38"/>
+ <a u="2FE3" b="81 39 A1 39"/>
+ <a u="2FE4" b="81 39 A2 30"/>
+ <a u="2FE5" b="81 39 A2 31"/>
+ <a u="2FE6" b="81 39 A2 32"/>
+ <a u="2FE7" b="81 39 A2 33"/>
+ <a u="2FE8" b="81 39 A2 34"/>
+ <a u="2FE9" b="81 39 A2 35"/>
+ <a u="2FEA" b="81 39 A2 36"/>
+ <a u="2FEB" b="81 39 A2 37"/>
+ <a u="2FEC" b="81 39 A2 38"/>
+ <a u="2FED" b="81 39 A2 39"/>
+ <a u="2FEE" b="81 39 A3 30"/>
+ <a u="2FEF" b="81 39 A3 31"/>
+ <a u="2FF0" b="A9 8A"/>
+ <a u="2FF1" b="A9 8B"/>
+ <a u="2FF2" b="A9 8C"/>
+ <a u="2FF3" b="A9 8D"/>
+ <a u="2FF4" b="A9 8E"/>
+ <a u="2FF5" b="A9 8F"/>
+ <a u="2FF6" b="A9 90"/>
+ <a u="2FF7" b="A9 91"/>
+ <a u="2FF8" b="A9 92"/>
+ <a u="2FF9" b="A9 93"/>
+ <a u="2FFA" b="A9 94"/>
+ <a u="2FFB" b="A9 95"/>
+ <a u="2FFC" b="81 39 A3 32"/>
+ <a u="2FFD" b="81 39 A3 33"/>
+ <a u="2FFE" b="81 39 A3 34"/>
+ <a u="2FFF" b="81 39 A3 35"/>
+ <a u="3000" b="A1 A1"/>
+ <a u="3001" b="A1 A2"/>
+ <a u="3002" b="A1 A3"/>
+ <a u="3003" b="A1 A8"/>
+ <a u="3004" b="81 39 A3 36"/>
+ <a u="3005" b="A1 A9"/>
+ <a u="3006" b="A9 65"/>
+ <a u="3007" b="A9 96"/>
+ <a u="3008" b="A1 B4"/>
+ <a u="3009" b="A1 B5"/>
+ <a u="300A" b="A1 B6"/>
+ <a u="300B" b="A1 B7"/>
+ <a u="300C" b="A1 B8"/>
+ <a u="300D" b="A1 B9"/>
+ <a u="300E" b="A1 BA"/>
+ <a u="300F" b="A1 BB"/>
+ <a u="3010" b="A1 BE"/>
+ <a u="3011" b="A1 BF"/>
+ <a u="3012" b="A8 93"/>
+ <a u="3013" b="A1 FE"/>
+ <a u="3014" b="A1 B2"/>
+ <a u="3015" b="A1 B3"/>
+ <a u="3016" b="A1 BC"/>
+ <a u="3017" b="A1 BD"/>
+ <a u="3018" b="81 39 A3 37"/>
+ <a u="3019" b="81 39 A3 38"/>
+ <a u="301A" b="81 39 A3 39"/>
+ <a u="301B" b="81 39 A4 30"/>
+ <a u="301C" b="81 39 A4 31"/>
+ <a u="301D" b="A8 94"/>
+ <a u="301E" b="A8 95"/>
+ <a u="301F" b="81 39 A4 32"/>
+ <a u="3020" b="81 39 A4 33"/>
+ <a u="3021" b="A9 40"/>
+ <a u="3022" b="A9 41"/>
+ <a u="3023" b="A9 42"/>
+ <a u="3024" b="A9 43"/>
+ <a u="3025" b="A9 44"/>
+ <a u="3026" b="A9 45"/>
+ <a u="3027" b="A9 46"/>
+ <a u="3028" b="A9 47"/>
+ <a u="3029" b="A9 48"/>
+ <a u="302A" b="81 39 A4 34"/>
+ <a u="302B" b="81 39 A4 35"/>
+ <a u="302C" b="81 39 A4 36"/>
+ <a u="302D" b="81 39 A4 37"/>
+ <a u="302E" b="81 39 A4 38"/>
+ <a u="302F" b="81 39 A4 39"/>
+ <a u="3030" b="81 39 A5 30"/>
+ <a u="3031" b="81 39 A5 31"/>
+ <a u="3032" b="81 39 A5 32"/>
+ <a u="3033" b="81 39 A5 33"/>
+ <a u="3034" b="81 39 A5 34"/>
+ <a u="3035" b="81 39 A5 35"/>
+ <a u="3036" b="81 39 A5 36"/>
+ <a u="3037" b="81 39 A5 37"/>
+ <a u="3038" b="81 39 A5 38"/>
+ <a u="3039" b="81 39 A5 39"/>
+ <a u="303A" b="81 39 A6 30"/>
+ <a u="303B" b="81 39 A6 31"/>
+ <a u="303C" b="81 39 A6 32"/>
+ <a u="303D" b="81 39 A6 33"/>
+ <a u="303E" b="A9 89"/>
+ <a u="303F" b="81 39 A6 34"/>
+ <a u="3040" b="81 39 A6 35"/>
+ <a u="3041" b="A4 A1"/>
+ <a u="3042" b="A4 A2"/>
+ <a u="3043" b="A4 A3"/>
+ <a u="3044" b="A4 A4"/>
+ <a u="3045" b="A4 A5"/>
+ <a u="3046" b="A4 A6"/>
+ <a u="3047" b="A4 A7"/>
+ <a u="3048" b="A4 A8"/>
+ <a u="3049" b="A4 A9"/>
+ <a u="304A" b="A4 AA"/>
+ <a u="304B" b="A4 AB"/>
+ <a u="304C" b="A4 AC"/>
+ <a u="304D" b="A4 AD"/>
+ <a u="304E" b="A4 AE"/>
+ <a u="304F" b="A4 AF"/>
+ <a u="3050" b="A4 B0"/>
+ <a u="3051" b="A4 B1"/>
+ <a u="3052" b="A4 B2"/>
+ <a u="3053" b="A4 B3"/>
+ <a u="3054" b="A4 B4"/>
+ <a u="3055" b="A4 B5"/>
+ <a u="3056" b="A4 B6"/>
+ <a u="3057" b="A4 B7"/>
+ <a u="3058" b="A4 B8"/>
+ <a u="3059" b="A4 B9"/>
+ <a u="305A" b="A4 BA"/>
+ <a u="305B" b="A4 BB"/>
+ <a u="305C" b="A4 BC"/>
+ <a u="305D" b="A4 BD"/>
+ <a u="305E" b="A4 BE"/>
+ <a u="305F" b="A4 BF"/>
+ <a u="3060" b="A4 C0"/>
+ <a u="3061" b="A4 C1"/>
+ <a u="3062" b="A4 C2"/>
+ <a u="3063" b="A4 C3"/>
+ <a u="3064" b="A4 C4"/>
+ <a u="3065" b="A4 C5"/>
+ <a u="3066" b="A4 C6"/>
+ <a u="3067" b="A4 C7"/>
+ <a u="3068" b="A4 C8"/>
+ <a u="3069" b="A4 C9"/>
+ <a u="306A" b="A4 CA"/>
+ <a u="306B" b="A4 CB"/>
+ <a u="306C" b="A4 CC"/>
+ <a u="306D" b="A4 CD"/>
+ <a u="306E" b="A4 CE"/>
+ <a u="306F" b="A4 CF"/>
+ <a u="3070" b="A4 D0"/>
+ <a u="3071" b="A4 D1"/>
+ <a u="3072" b="A4 D2"/>
+ <a u="3073" b="A4 D3"/>
+ <a u="3074" b="A4 D4"/>
+ <a u="3075" b="A4 D5"/>
+ <a u="3076" b="A4 D6"/>
+ <a u="3077" b="A4 D7"/>
+ <a u="3078" b="A4 D8"/>
+ <a u="3079" b="A4 D9"/>
+ <a u="307A" b="A4 DA"/>
+ <a u="307B" b="A4 DB"/>
+ <a u="307C" b="A4 DC"/>
+ <a u="307D" b="A4 DD"/>
+ <a u="307E" b="A4 DE"/>
+ <a u="307F" b="A4 DF"/>
+ <a u="3080" b="A4 E0"/>
+ <a u="3081" b="A4 E1"/>
+ <a u="3082" b="A4 E2"/>
+ <a u="3083" b="A4 E3"/>
+ <a u="3084" b="A4 E4"/>
+ <a u="3085" b="A4 E5"/>
+ <a u="3086" b="A4 E6"/>
+ <a u="3087" b="A4 E7"/>
+ <a u="3088" b="A4 E8"/>
+ <a u="3089" b="A4 E9"/>
+ <a u="308A" b="A4 EA"/>
+ <a u="308B" b="A4 EB"/>
+ <a u="308C" b="A4 EC"/>
+ <a u="308D" b="A4 ED"/>
+ <a u="308E" b="A4 EE"/>
+ <a u="308F" b="A4 EF"/>
+ <a u="3090" b="A4 F0"/>
+ <a u="3091" b="A4 F1"/>
+ <a u="3092" b="A4 F2"/>
+ <a u="3093" b="A4 F3"/>
+ <a u="3094" b="81 39 A6 36"/>
+ <a u="3095" b="81 39 A6 37"/>
+ <a u="3096" b="81 39 A6 38"/>
+ <a u="3097" b="81 39 A6 39"/>
+ <a u="3098" b="81 39 A7 30"/>
+ <a u="3099" b="81 39 A7 31"/>
+ <a u="309A" b="81 39 A7 32"/>
+ <a u="309B" b="A9 61"/>
+ <a u="309C" b="A9 62"/>
+ <a u="309D" b="A9 66"/>
+ <a u="309E" b="A9 67"/>
+ <a u="309F" b="81 39 A7 33"/>
+ <a u="30A0" b="81 39 A7 34"/>
+ <a u="30A1" b="A5 A1"/>
+ <a u="30A2" b="A5 A2"/>
+ <a u="30A3" b="A5 A3"/>
+ <a u="30A4" b="A5 A4"/>
+ <a u="30A5" b="A5 A5"/>
+ <a u="30A6" b="A5 A6"/>
+ <a u="30A7" b="A5 A7"/>
+ <a u="30A8" b="A5 A8"/>
+ <a u="30A9" b="A5 A9"/>
+ <a u="30AA" b="A5 AA"/>
+ <a u="30AB" b="A5 AB"/>
+ <a u="30AC" b="A5 AC"/>
+ <a u="30AD" b="A5 AD"/>
+ <a u="30AE" b="A5 AE"/>
+ <a u="30AF" b="A5 AF"/>
+ <a u="30B0" b="A5 B0"/>
+ <a u="30B1" b="A5 B1"/>
+ <a u="30B2" b="A5 B2"/>
+ <a u="30B3" b="A5 B3"/>
+ <a u="30B4" b="A5 B4"/>
+ <a u="30B5" b="A5 B5"/>
+ <a u="30B6" b="A5 B6"/>
+ <a u="30B7" b="A5 B7"/>
+ <a u="30B8" b="A5 B8"/>
+ <a u="30B9" b="A5 B9"/>
+ <a u="30BA" b="A5 BA"/>
+ <a u="30BB" b="A5 BB"/>
+ <a u="30BC" b="A5 BC"/>
+ <a u="30BD" b="A5 BD"/>
+ <a u="30BE" b="A5 BE"/>
+ <a u="30BF" b="A5 BF"/>
+ <a u="30C0" b="A5 C0"/>
+ <a u="30C1" b="A5 C1"/>
+ <a u="30C2" b="A5 C2"/>
+ <a u="30C3" b="A5 C3"/>
+ <a u="30C4" b="A5 C4"/>
+ <a u="30C5" b="A5 C5"/>
+ <a u="30C6" b="A5 C6"/>
+ <a u="30C7" b="A5 C7"/>
+ <a u="30C8" b="A5 C8"/>
+ <a u="30C9" b="A5 C9"/>
+ <a u="30CA" b="A5 CA"/>
+ <a u="30CB" b="A5 CB"/>
+ <a u="30CC" b="A5 CC"/>
+ <a u="30CD" b="A5 CD"/>
+ <a u="30CE" b="A5 CE"/>
+ <a u="30CF" b="A5 CF"/>
+ <a u="30D0" b="A5 D0"/>
+ <a u="30D1" b="A5 D1"/>
+ <a u="30D2" b="A5 D2"/>
+ <a u="30D3" b="A5 D3"/>
+ <a u="30D4" b="A5 D4"/>
+ <a u="30D5" b="A5 D5"/>
+ <a u="30D6" b="A5 D6"/>
+ <a u="30D7" b="A5 D7"/>
+ <a u="30D8" b="A5 D8"/>
+ <a u="30D9" b="A5 D9"/>
+ <a u="30DA" b="A5 DA"/>
+ <a u="30DB" b="A5 DB"/>
+ <a u="30DC" b="A5 DC"/>
+ <a u="30DD" b="A5 DD"/>
+ <a u="30DE" b="A5 DE"/>
+ <a u="30DF" b="A5 DF"/>
+ <a u="30E0" b="A5 E0"/>
+ <a u="30E1" b="A5 E1"/>
+ <a u="30E2" b="A5 E2"/>
+ <a u="30E3" b="A5 E3"/>
+ <a u="30E4" b="A5 E4"/>
+ <a u="30E5" b="A5 E5"/>
+ <a u="30E6" b="A5 E6"/>
+ <a u="30E7" b="A5 E7"/>
+ <a u="30E8" b="A5 E8"/>
+ <a u="30E9" b="A5 E9"/>
+ <a u="30EA" b="A5 EA"/>
+ <a u="30EB" b="A5 EB"/>
+ <a u="30EC" b="A5 EC"/>
+ <a u="30ED" b="A5 ED"/>
+ <a u="30EE" b="A5 EE"/>
+ <a u="30EF" b="A5 EF"/>
+ <a u="30F0" b="A5 F0"/>
+ <a u="30F1" b="A5 F1"/>
+ <a u="30F2" b="A5 F2"/>
+ <a u="30F3" b="A5 F3"/>
+ <a u="30F4" b="A5 F4"/>
+ <a u="30F5" b="A5 F5"/>
+ <a u="30F6" b="A5 F6"/>
+ <a u="30F7" b="81 39 A7 35"/>
+ <a u="30F8" b="81 39 A7 36"/>
+ <a u="30F9" b="81 39 A7 37"/>
+ <a u="30FA" b="81 39 A7 38"/>
+ <a u="30FB" b="81 39 A7 39"/>
+ <a u="30FC" b="A9 60"/>
+ <a u="30FD" b="A9 63"/>
+ <a u="30FE" b="A9 64"/>
+ <a u="30FF" b="81 39 A8 30"/>
+ <a u="3100" b="81 39 A8 31"/>
+ <a u="3101" b="81 39 A8 32"/>
+ <a u="3102" b="81 39 A8 33"/>
+ <a u="3103" b="81 39 A8 34"/>
+ <a u="3104" b="81 39 A8 35"/>
+ <a u="3105" b="A8 C5"/>
+ <a u="3106" b="A8 C6"/>
+ <a u="3107" b="A8 C7"/>
+ <a u="3108" b="A8 C8"/>
+ <a u="3109" b="A8 C9"/>
+ <a u="310A" b="A8 CA"/>
+ <a u="310B" b="A8 CB"/>
+ <a u="310C" b="A8 CC"/>
+ <a u="310D" b="A8 CD"/>
+ <a u="310E" b="A8 CE"/>
+ <a u="310F" b="A8 CF"/>
+ <a u="3110" b="A8 D0"/>
+ <a u="3111" b="A8 D1"/>
+ <a u="3112" b="A8 D2"/>
+ <a u="3113" b="A8 D3"/>
+ <a u="3114" b="A8 D4"/>
+ <a u="3115" b="A8 D5"/>
+ <a u="3116" b="A8 D6"/>
+ <a u="3117" b="A8 D7"/>
+ <a u="3118" b="A8 D8"/>
+ <a u="3119" b="A8 D9"/>
+ <a u="311A" b="A8 DA"/>
+ <a u="311B" b="A8 DB"/>
+ <a u="311C" b="A8 DC"/>
+ <a u="311D" b="A8 DD"/>
+ <a u="311E" b="A8 DE"/>
+ <a u="311F" b="A8 DF"/>
+ <a u="3120" b="A8 E0"/>
+ <a u="3121" b="A8 E1"/>
+ <a u="3122" b="A8 E2"/>
+ <a u="3123" b="A8 E3"/>
+ <a u="3124" b="A8 E4"/>
+ <a u="3125" b="A8 E5"/>
+ <a u="3126" b="A8 E6"/>
+ <a u="3127" b="A8 E7"/>
+ <a u="3128" b="A8 E8"/>
+ <a u="3129" b="A8 E9"/>
+ <a u="312A" b="81 39 A8 36"/>
+ <a u="312B" b="81 39 A8 37"/>
+ <a u="312C" b="81 39 A8 38"/>
+ <a u="312D" b="81 39 A8 39"/>
+ <a u="312E" b="81 39 A9 30"/>
+ <a u="312F" b="81 39 A9 31"/>
+ <a u="3130" b="81 39 A9 32"/>
+ <a u="3131" b="81 39 A9 33"/>
+ <a u="3132" b="81 39 A9 34"/>
+ <a u="3133" b="81 39 A9 35"/>
+ <a u="3134" b="81 39 A9 36"/>
+ <a u="3135" b="81 39 A9 37"/>
+ <a u="3136" b="81 39 A9 38"/>
+ <a u="3137" b="81 39 A9 39"/>
+ <a u="3138" b="81 39 AA 30"/>
+ <a u="3139" b="81 39 AA 31"/>
+ <a u="313A" b="81 39 AA 32"/>
+ <a u="313B" b="81 39 AA 33"/>
+ <a u="313C" b="81 39 AA 34"/>
+ <a u="313D" b="81 39 AA 35"/>
+ <a u="313E" b="81 39 AA 36"/>
+ <a u="313F" b="81 39 AA 37"/>
+ <a u="3140" b="81 39 AA 38"/>
+ <a u="3141" b="81 39 AA 39"/>
+ <a u="3142" b="81 39 AB 30"/>
+ <a u="3143" b="81 39 AB 31"/>
+ <a u="3144" b="81 39 AB 32"/>
+ <a u="3145" b="81 39 AB 33"/>
+ <a u="3146" b="81 39 AB 34"/>
+ <a u="3147" b="81 39 AB 35"/>
+ <a u="3148" b="81 39 AB 36"/>
+ <a u="3149" b="81 39 AB 37"/>
+ <a u="314A" b="81 39 AB 38"/>
+ <a u="314B" b="81 39 AB 39"/>
+ <a u="314C" b="81 39 AC 30"/>
+ <a u="314D" b="81 39 AC 31"/>
+ <a u="314E" b="81 39 AC 32"/>
+ <a u="314F" b="81 39 AC 33"/>
+ <a u="3150" b="81 39 AC 34"/>
+ <a u="3151" b="81 39 AC 35"/>
+ <a u="3152" b="81 39 AC 36"/>
+ <a u="3153" b="81 39 AC 37"/>
+ <a u="3154" b="81 39 AC 38"/>
+ <a u="3155" b="81 39 AC 39"/>
+ <a u="3156" b="81 39 AD 30"/>
+ <a u="3157" b="81 39 AD 31"/>
+ <a u="3158" b="81 39 AD 32"/>
+ <a u="3159" b="81 39 AD 33"/>
+ <a u="315A" b="81 39 AD 34"/>
+ <a u="315B" b="81 39 AD 35"/>
+ <a u="315C" b="81 39 AD 36"/>
+ <a u="315D" b="81 39 AD 37"/>
+ <a u="315E" b="81 39 AD 38"/>
+ <a u="315F" b="81 39 AD 39"/>
+ <a u="3160" b="81 39 AE 30"/>
+ <a u="3161" b="81 39 AE 31"/>
+ <a u="3162" b="81 39 AE 32"/>
+ <a u="3163" b="81 39 AE 33"/>
+ <a u="3164" b="81 39 AE 34"/>
+ <a u="3165" b="81 39 AE 35"/>
+ <a u="3166" b="81 39 AE 36"/>
+ <a u="3167" b="81 39 AE 37"/>
+ <a u="3168" b="81 39 AE 38"/>
+ <a u="3169" b="81 39 AE 39"/>
+ <a u="316A" b="81 39 AF 30"/>
+ <a u="316B" b="81 39 AF 31"/>
+ <a u="316C" b="81 39 AF 32"/>
+ <a u="316D" b="81 39 AF 33"/>
+ <a u="316E" b="81 39 AF 34"/>
+ <a u="316F" b="81 39 AF 35"/>
+ <a u="3170" b="81 39 AF 36"/>
+ <a u="3171" b="81 39 AF 37"/>
+ <a u="3172" b="81 39 AF 38"/>
+ <a u="3173" b="81 39 AF 39"/>
+ <a u="3174" b="81 39 B0 30"/>
+ <a u="3175" b="81 39 B0 31"/>
+ <a u="3176" b="81 39 B0 32"/>
+ <a u="3177" b="81 39 B0 33"/>
+ <a u="3178" b="81 39 B0 34"/>
+ <a u="3179" b="81 39 B0 35"/>
+ <a u="317A" b="81 39 B0 36"/>
+ <a u="317B" b="81 39 B0 37"/>
+ <a u="317C" b="81 39 B0 38"/>
+ <a u="317D" b="81 39 B0 39"/>
+ <a u="317E" b="81 39 B1 30"/>
+ <a u="317F" b="81 39 B1 31"/>
+ <a u="3180" b="81 39 B1 32"/>
+ <a u="3181" b="81 39 B1 33"/>
+ <a u="3182" b="81 39 B1 34"/>
+ <a u="3183" b="81 39 B1 35"/>
+ <a u="3184" b="81 39 B1 36"/>
+ <a u="3185" b="81 39 B1 37"/>
+ <a u="3186" b="81 39 B1 38"/>
+ <a u="3187" b="81 39 B1 39"/>
+ <a u="3188" b="81 39 B2 30"/>
+ <a u="3189" b="81 39 B2 31"/>
+ <a u="318A" b="81 39 B2 32"/>
+ <a u="318B" b="81 39 B2 33"/>
+ <a u="318C" b="81 39 B2 34"/>
+ <a u="318D" b="81 39 B2 35"/>
+ <a u="318E" b="81 39 B2 36"/>
+ <a u="318F" b="81 39 B2 37"/>
+ <a u="3190" b="81 39 B2 38"/>
+ <a u="3191" b="81 39 B2 39"/>
+ <a u="3192" b="81 39 B3 30"/>
+ <a u="3193" b="81 39 B3 31"/>
+ <a u="3194" b="81 39 B3 32"/>
+ <a u="3195" b="81 39 B3 33"/>
+ <a u="3196" b="81 39 B3 34"/>
+ <a u="3197" b="81 39 B3 35"/>
+ <a u="3198" b="81 39 B3 36"/>
+ <a u="3199" b="81 39 B3 37"/>
+ <a u="319A" b="81 39 B3 38"/>
+ <a u="319B" b="81 39 B3 39"/>
+ <a u="319C" b="81 39 B4 30"/>
+ <a u="319D" b="81 39 B4 31"/>
+ <a u="319E" b="81 39 B4 32"/>
+ <a u="319F" b="81 39 B4 33"/>
+ <a u="31A0" b="81 39 B4 34"/>
+ <a u="31A1" b="81 39 B4 35"/>
+ <a u="31A2" b="81 39 B4 36"/>
+ <a u="31A3" b="81 39 B4 37"/>
+ <a u="31A4" b="81 39 B4 38"/>
+ <a u="31A5" b="81 39 B4 39"/>
+ <a u="31A6" b="81 39 B5 30"/>
+ <a u="31A7" b="81 39 B5 31"/>
+ <a u="31A8" b="81 39 B5 32"/>
+ <a u="31A9" b="81 39 B5 33"/>
+ <a u="31AA" b="81 39 B5 34"/>
+ <a u="31AB" b="81 39 B5 35"/>
+ <a u="31AC" b="81 39 B5 36"/>
+ <a u="31AD" b="81 39 B5 37"/>
+ <a u="31AE" b="81 39 B5 38"/>
+ <a u="31AF" b="81 39 B5 39"/>
+ <a u="31B0" b="81 39 B6 30"/>
+ <a u="31B1" b="81 39 B6 31"/>
+ <a u="31B2" b="81 39 B6 32"/>
+ <a u="31B3" b="81 39 B6 33"/>
+ <a u="31B4" b="81 39 B6 34"/>
+ <a u="31B5" b="81 39 B6 35"/>
+ <a u="31B6" b="81 39 B6 36"/>
+ <a u="31B7" b="81 39 B6 37"/>
+ <a u="31B8" b="81 39 B6 38"/>
+ <a u="31B9" b="81 39 B6 39"/>
+ <a u="31BA" b="81 39 B7 30"/>
+ <a u="31BB" b="81 39 B7 31"/>
+ <a u="31BC" b="81 39 B7 32"/>
+ <a u="31BD" b="81 39 B7 33"/>
+ <a u="31BE" b="81 39 B7 34"/>
+ <a u="31BF" b="81 39 B7 35"/>
+ <a u="31C0" b="81 39 B7 36"/>
+ <a u="31C1" b="81 39 B7 37"/>
+ <a u="31C2" b="81 39 B7 38"/>
+ <a u="31C3" b="81 39 B7 39"/>
+ <a u="31C4" b="81 39 B8 30"/>
+ <a u="31C5" b="81 39 B8 31"/>
+ <a u="31C6" b="81 39 B8 32"/>
+ <a u="31C7" b="81 39 B8 33"/>
+ <a u="31C8" b="81 39 B8 34"/>
+ <a u="31C9" b="81 39 B8 35"/>
+ <a u="31CA" b="81 39 B8 36"/>
+ <a u="31CB" b="81 39 B8 37"/>
+ <a u="31CC" b="81 39 B8 38"/>
+ <a u="31CD" b="81 39 B8 39"/>
+ <a u="31CE" b="81 39 B9 30"/>
+ <a u="31CF" b="81 39 B9 31"/>
+ <a u="31D0" b="81 39 B9 32"/>
+ <a u="31D1" b="81 39 B9 33"/>
+ <a u="31D2" b="81 39 B9 34"/>
+ <a u="31D3" b="81 39 B9 35"/>
+ <a u="31D4" b="81 39 B9 36"/>
+ <a u="31D5" b="81 39 B9 37"/>
+ <a u="31D6" b="81 39 B9 38"/>
+ <a u="31D7" b="81 39 B9 39"/>
+ <a u="31D8" b="81 39 BA 30"/>
+ <a u="31D9" b="81 39 BA 31"/>
+ <a u="31DA" b="81 39 BA 32"/>
+ <a u="31DB" b="81 39 BA 33"/>
+ <a u="31DC" b="81 39 BA 34"/>
+ <a u="31DD" b="81 39 BA 35"/>
+ <a u="31DE" b="81 39 BA 36"/>
+ <a u="31DF" b="81 39 BA 37"/>
+ <a u="31E0" b="81 39 BA 38"/>
+ <a u="31E1" b="81 39 BA 39"/>
+ <a u="31E2" b="81 39 BB 30"/>
+ <a u="31E3" b="81 39 BB 31"/>
+ <a u="31E4" b="81 39 BB 32"/>
+ <a u="31E5" b="81 39 BB 33"/>
+ <a u="31E6" b="81 39 BB 34"/>
+ <a u="31E7" b="81 39 BB 35"/>
+ <a u="31E8" b="81 39 BB 36"/>
+ <a u="31E9" b="81 39 BB 37"/>
+ <a u="31EA" b="81 39 BB 38"/>
+ <a u="31EB" b="81 39 BB 39"/>
+ <a u="31EC" b="81 39 BC 30"/>
+ <a u="31ED" b="81 39 BC 31"/>
+ <a u="31EE" b="81 39 BC 32"/>
+ <a u="31EF" b="81 39 BC 33"/>
+ <a u="31F0" b="81 39 BC 34"/>
+ <a u="31F1" b="81 39 BC 35"/>
+ <a u="31F2" b="81 39 BC 36"/>
+ <a u="31F3" b="81 39 BC 37"/>
+ <a u="31F4" b="81 39 BC 38"/>
+ <a u="31F5" b="81 39 BC 39"/>
+ <a u="31F6" b="81 39 BD 30"/>
+ <a u="31F7" b="81 39 BD 31"/>
+ <a u="31F8" b="81 39 BD 32"/>
+ <a u="31F9" b="81 39 BD 33"/>
+ <a u="31FA" b="81 39 BD 34"/>
+ <a u="31FB" b="81 39 BD 35"/>
+ <a u="31FC" b="81 39 BD 36"/>
+ <a u="31FD" b="81 39 BD 37"/>
+ <a u="31FE" b="81 39 BD 38"/>
+ <a u="31FF" b="81 39 BD 39"/>
+ <a u="3200" b="81 39 BE 30"/>
+ <a u="3201" b="81 39 BE 31"/>
+ <a u="3202" b="81 39 BE 32"/>
+ <a u="3203" b="81 39 BE 33"/>
+ <a u="3204" b="81 39 BE 34"/>
+ <a u="3205" b="81 39 BE 35"/>
+ <a u="3206" b="81 39 BE 36"/>
+ <a u="3207" b="81 39 BE 37"/>
+ <a u="3208" b="81 39 BE 38"/>
+ <a u="3209" b="81 39 BE 39"/>
+ <a u="320A" b="81 39 BF 30"/>
+ <a u="320B" b="81 39 BF 31"/>
+ <a u="320C" b="81 39 BF 32"/>
+ <a u="320D" b="81 39 BF 33"/>
+ <a u="320E" b="81 39 BF 34"/>
+ <a u="320F" b="81 39 BF 35"/>
+ <a u="3210" b="81 39 BF 36"/>
+ <a u="3211" b="81 39 BF 37"/>
+ <a u="3212" b="81 39 BF 38"/>
+ <a u="3213" b="81 39 BF 39"/>
+ <a u="3214" b="81 39 C0 30"/>
+ <a u="3215" b="81 39 C0 31"/>
+ <a u="3216" b="81 39 C0 32"/>
+ <a u="3217" b="81 39 C0 33"/>
+ <a u="3218" b="81 39 C0 34"/>
+ <a u="3219" b="81 39 C0 35"/>
+ <a u="321A" b="81 39 C0 36"/>
+ <a u="321B" b="81 39 C0 37"/>
+ <a u="321C" b="81 39 C0 38"/>
+ <a u="321D" b="81 39 C0 39"/>
+ <a u="321E" b="81 39 C1 30"/>
+ <a u="321F" b="81 39 C1 31"/>
+ <a u="3220" b="A2 E5"/>
+ <a u="3221" b="A2 E6"/>
+ <a u="3222" b="A2 E7"/>
+ <a u="3223" b="A2 E8"/>
+ <a u="3224" b="A2 E9"/>
+ <a u="3225" b="A2 EA"/>
+ <a u="3226" b="A2 EB"/>
+ <a u="3227" b="A2 EC"/>
+ <a u="3228" b="A2 ED"/>
+ <a u="3229" b="A2 EE"/>
+ <a u="322A" b="81 39 C1 32"/>
+ <a u="322B" b="81 39 C1 33"/>
+ <a u="322C" b="81 39 C1 34"/>
+ <a u="322D" b="81 39 C1 35"/>
+ <a u="322E" b="81 39 C1 36"/>
+ <a u="322F" b="81 39 C1 37"/>
+ <a u="3230" b="81 39 C1 38"/>
+ <a u="3231" b="A9 5A"/>
+ <a u="3232" b="81 39 C1 39"/>
+ <a u="3233" b="81 39 C2 30"/>
+ <a u="3234" b="81 39 C2 31"/>
+ <a u="3235" b="81 39 C2 32"/>
+ <a u="3236" b="81 39 C2 33"/>
+ <a u="3237" b="81 39 C2 34"/>
+ <a u="3238" b="81 39 C2 35"/>
+ <a u="3239" b="81 39 C2 36"/>
+ <a u="323A" b="81 39 C2 37"/>
+ <a u="323B" b="81 39 C2 38"/>
+ <a u="323C" b="81 39 C2 39"/>
+ <a u="323D" b="81 39 C3 30"/>
+ <a u="323E" b="81 39 C3 31"/>
+ <a u="323F" b="81 39 C3 32"/>
+ <a u="3240" b="81 39 C3 33"/>
+ <a u="3241" b="81 39 C3 34"/>
+ <a u="3242" b="81 39 C3 35"/>
+ <a u="3243" b="81 39 C3 36"/>
+ <a u="3244" b="81 39 C3 37"/>
+ <a u="3245" b="81 39 C3 38"/>
+ <a u="3246" b="81 39 C3 39"/>
+ <a u="3247" b="81 39 C4 30"/>
+ <a u="3248" b="81 39 C4 31"/>
+ <a u="3249" b="81 39 C4 32"/>
+ <a u="324A" b="81 39 C4 33"/>
+ <a u="324B" b="81 39 C4 34"/>
+ <a u="324C" b="81 39 C4 35"/>
+ <a u="324D" b="81 39 C4 36"/>
+ <a u="324E" b="81 39 C4 37"/>
+ <a u="324F" b="81 39 C4 38"/>
+ <a u="3250" b="81 39 C4 39"/>
+ <a u="3251" b="81 39 C5 30"/>
+ <a u="3252" b="81 39 C5 31"/>
+ <a u="3253" b="81 39 C5 32"/>
+ <a u="3254" b="81 39 C5 33"/>
+ <a u="3255" b="81 39 C5 34"/>
+ <a u="3256" b="81 39 C5 35"/>
+ <a u="3257" b="81 39 C5 36"/>
+ <a u="3258" b="81 39 C5 37"/>
+ <a u="3259" b="81 39 C5 38"/>
+ <a u="325A" b="81 39 C5 39"/>
+ <a u="325B" b="81 39 C6 30"/>
+ <a u="325C" b="81 39 C6 31"/>
+ <a u="325D" b="81 39 C6 32"/>
+ <a u="325E" b="81 39 C6 33"/>
+ <a u="325F" b="81 39 C6 34"/>
+ <a u="3260" b="81 39 C6 35"/>
+ <a u="3261" b="81 39 C6 36"/>
+ <a u="3262" b="81 39 C6 37"/>
+ <a u="3263" b="81 39 C6 38"/>
+ <a u="3264" b="81 39 C6 39"/>
+ <a u="3265" b="81 39 C7 30"/>
+ <a u="3266" b="81 39 C7 31"/>
+ <a u="3267" b="81 39 C7 32"/>
+ <a u="3268" b="81 39 C7 33"/>
+ <a u="3269" b="81 39 C7 34"/>
+ <a u="326A" b="81 39 C7 35"/>
+ <a u="326B" b="81 39 C7 36"/>
+ <a u="326C" b="81 39 C7 37"/>
+ <a u="326D" b="81 39 C7 38"/>
+ <a u="326E" b="81 39 C7 39"/>
+ <a u="326F" b="81 39 C8 30"/>
+ <a u="3270" b="81 39 C8 31"/>
+ <a u="3271" b="81 39 C8 32"/>
+ <a u="3272" b="81 39 C8 33"/>
+ <a u="3273" b="81 39 C8 34"/>
+ <a u="3274" b="81 39 C8 35"/>
+ <a u="3275" b="81 39 C8 36"/>
+ <a u="3276" b="81 39 C8 37"/>
+ <a u="3277" b="81 39 C8 38"/>
+ <a u="3278" b="81 39 C8 39"/>
+ <a u="3279" b="81 39 C9 30"/>
+ <a u="327A" b="81 39 C9 31"/>
+ <a u="327B" b="81 39 C9 32"/>
+ <a u="327C" b="81 39 C9 33"/>
+ <a u="327D" b="81 39 C9 34"/>
+ <a u="327E" b="81 39 C9 35"/>
+ <a u="327F" b="81 39 C9 36"/>
+ <a u="3280" b="81 39 C9 37"/>
+ <a u="3281" b="81 39 C9 38"/>
+ <a u="3282" b="81 39 C9 39"/>
+ <a u="3283" b="81 39 CA 30"/>
+ <a u="3284" b="81 39 CA 31"/>
+ <a u="3285" b="81 39 CA 32"/>
+ <a u="3286" b="81 39 CA 33"/>
+ <a u="3287" b="81 39 CA 34"/>
+ <a u="3288" b="81 39 CA 35"/>
+ <a u="3289" b="81 39 CA 36"/>
+ <a u="328A" b="81 39 CA 37"/>
+ <a u="328B" b="81 39 CA 38"/>
+ <a u="328C" b="81 39 CA 39"/>
+ <a u="328D" b="81 39 CB 30"/>
+ <a u="328E" b="81 39 CB 31"/>
+ <a u="328F" b="81 39 CB 32"/>
+ <a u="3290" b="81 39 CB 33"/>
+ <a u="3291" b="81 39 CB 34"/>
+ <a u="3292" b="81 39 CB 35"/>
+ <a u="3293" b="81 39 CB 36"/>
+ <a u="3294" b="81 39 CB 37"/>
+ <a u="3295" b="81 39 CB 38"/>
+ <a u="3296" b="81 39 CB 39"/>
+ <a u="3297" b="81 39 CC 30"/>
+ <a u="3298" b="81 39 CC 31"/>
+ <a u="3299" b="81 39 CC 32"/>
+ <a u="329A" b="81 39 CC 33"/>
+ <a u="329B" b="81 39 CC 34"/>
+ <a u="329C" b="81 39 CC 35"/>
+ <a u="329D" b="81 39 CC 36"/>
+ <a u="329E" b="81 39 CC 37"/>
+ <a u="329F" b="81 39 CC 38"/>
+ <a u="32A0" b="81 39 CC 39"/>
+ <a u="32A1" b="81 39 CD 30"/>
+ <a u="32A2" b="81 39 CD 31"/>
+ <a u="32A3" b="A9 49"/>
+ <a u="32A4" b="81 39 CD 32"/>
+ <a u="32A5" b="81 39 CD 33"/>
+ <a u="32A6" b="81 39 CD 34"/>
+ <a u="32A7" b="81 39 CD 35"/>
+ <a u="32A8" b="81 39 CD 36"/>
+ <a u="32A9" b="81 39 CD 37"/>
+ <a u="32AA" b="81 39 CD 38"/>
+ <a u="32AB" b="81 39 CD 39"/>
+ <a u="32AC" b="81 39 CE 30"/>
+ <a u="32AD" b="81 39 CE 31"/>
+ <a u="32AE" b="81 39 CE 32"/>
+ <a u="32AF" b="81 39 CE 33"/>
+ <a u="32B0" b="81 39 CE 34"/>
+ <a u="32B1" b="81 39 CE 35"/>
+ <a u="32B2" b="81 39 CE 36"/>
+ <a u="32B3" b="81 39 CE 37"/>
+ <a u="32B4" b="81 39 CE 38"/>
+ <a u="32B5" b="81 39 CE 39"/>
+ <a u="32B6" b="81 39 CF 30"/>
+ <a u="32B7" b="81 39 CF 31"/>
+ <a u="32B8" b="81 39 CF 32"/>
+ <a u="32B9" b="81 39 CF 33"/>
+ <a u="32BA" b="81 39 CF 34"/>
+ <a u="32BB" b="81 39 CF 35"/>
+ <a u="32BC" b="81 39 CF 36"/>
+ <a u="32BD" b="81 39 CF 37"/>
+ <a u="32BE" b="81 39 CF 38"/>
+ <a u="32BF" b="81 39 CF 39"/>
+ <a u="32C0" b="81 39 D0 30"/>
+ <a u="32C1" b="81 39 D0 31"/>
+ <a u="32C2" b="81 39 D0 32"/>
+ <a u="32C3" b="81 39 D0 33"/>
+ <a u="32C4" b="81 39 D0 34"/>
+ <a u="32C5" b="81 39 D0 35"/>
+ <a u="32C6" b="81 39 D0 36"/>
+ <a u="32C7" b="81 39 D0 37"/>
+ <a u="32C8" b="81 39 D0 38"/>
+ <a u="32C9" b="81 39 D0 39"/>
+ <a u="32CA" b="81 39 D1 30"/>
+ <a u="32CB" b="81 39 D1 31"/>
+ <a u="32CC" b="81 39 D1 32"/>
+ <a u="32CD" b="81 39 D1 33"/>
+ <a u="32CE" b="81 39 D1 34"/>
+ <a u="32CF" b="81 39 D1 35"/>
+ <a u="32D0" b="81 39 D1 36"/>
+ <a u="32D1" b="81 39 D1 37"/>
+ <a u="32D2" b="81 39 D1 38"/>
+ <a u="32D3" b="81 39 D1 39"/>
+ <a u="32D4" b="81 39 D2 30"/>
+ <a u="32D5" b="81 39 D2 31"/>
+ <a u="32D6" b="81 39 D2 32"/>
+ <a u="32D7" b="81 39 D2 33"/>
+ <a u="32D8" b="81 39 D2 34"/>
+ <a u="32D9" b="81 39 D2 35"/>
+ <a u="32DA" b="81 39 D2 36"/>
+ <a u="32DB" b="81 39 D2 37"/>
+ <a u="32DC" b="81 39 D2 38"/>
+ <a u="32DD" b="81 39 D2 39"/>
+ <a u="32DE" b="81 39 D3 30"/>
+ <a u="32DF" b="81 39 D3 31"/>
+ <a u="32E0" b="81 39 D3 32"/>
+ <a u="32E1" b="81 39 D3 33"/>
+ <a u="32E2" b="81 39 D3 34"/>
+ <a u="32E3" b="81 39 D3 35"/>
+ <a u="32E4" b="81 39 D3 36"/>
+ <a u="32E5" b="81 39 D3 37"/>
+ <a u="32E6" b="81 39 D3 38"/>
+ <a u="32E7" b="81 39 D3 39"/>
+ <a u="32E8" b="81 39 D4 30"/>
+ <a u="32E9" b="81 39 D4 31"/>
+ <a u="32EA" b="81 39 D4 32"/>
+ <a u="32EB" b="81 39 D4 33"/>
+ <a u="32EC" b="81 39 D4 34"/>
+ <a u="32ED" b="81 39 D4 35"/>
+ <a u="32EE" b="81 39 D4 36"/>
+ <a u="32EF" b="81 39 D4 37"/>
+ <a u="32F0" b="81 39 D4 38"/>
+ <a u="32F1" b="81 39 D4 39"/>
+ <a u="32F2" b="81 39 D5 30"/>
+ <a u="32F3" b="81 39 D5 31"/>
+ <a u="32F4" b="81 39 D5 32"/>
+ <a u="32F5" b="81 39 D5 33"/>
+ <a u="32F6" b="81 39 D5 34"/>
+ <a u="32F7" b="81 39 D5 35"/>
+ <a u="32F8" b="81 39 D5 36"/>
+ <a u="32F9" b="81 39 D5 37"/>
+ <a u="32FA" b="81 39 D5 38"/>
+ <a u="32FB" b="81 39 D5 39"/>
+ <a u="32FC" b="81 39 D6 30"/>
+ <a u="32FD" b="81 39 D6 31"/>
+ <a u="32FE" b="81 39 D6 32"/>
+ <a u="32FF" b="81 39 D6 33"/>
+ <a u="3300" b="81 39 D6 34"/>
+ <a u="3301" b="81 39 D6 35"/>
+ <a u="3302" b="81 39 D6 36"/>
+ <a u="3303" b="81 39 D6 37"/>
+ <a u="3304" b="81 39 D6 38"/>
+ <a u="3305" b="81 39 D6 39"/>
+ <a u="3306" b="81 39 D7 30"/>
+ <a u="3307" b="81 39 D7 31"/>
+ <a u="3308" b="81 39 D7 32"/>
+ <a u="3309" b="81 39 D7 33"/>
+ <a u="330A" b="81 39 D7 34"/>
+ <a u="330B" b="81 39 D7 35"/>
+ <a u="330C" b="81 39 D7 36"/>
+ <a u="330D" b="81 39 D7 37"/>
+ <a u="330E" b="81 39 D7 38"/>
+ <a u="330F" b="81 39 D7 39"/>
+ <a u="3310" b="81 39 D8 30"/>
+ <a u="3311" b="81 39 D8 31"/>
+ <a u="3312" b="81 39 D8 32"/>
+ <a u="3313" b="81 39 D8 33"/>
+ <a u="3314" b="81 39 D8 34"/>
+ <a u="3315" b="81 39 D8 35"/>
+ <a u="3316" b="81 39 D8 36"/>
+ <a u="3317" b="81 39 D8 37"/>
+ <a u="3318" b="81 39 D8 38"/>
+ <a u="3319" b="81 39 D8 39"/>
+ <a u="331A" b="81 39 D9 30"/>
+ <a u="331B" b="81 39 D9 31"/>
+ <a u="331C" b="81 39 D9 32"/>
+ <a u="331D" b="81 39 D9 33"/>
+ <a u="331E" b="81 39 D9 34"/>
+ <a u="331F" b="81 39 D9 35"/>
+ <a u="3320" b="81 39 D9 36"/>
+ <a u="3321" b="81 39 D9 37"/>
+ <a u="3322" b="81 39 D9 38"/>
+ <a u="3323" b="81 39 D9 39"/>
+ <a u="3324" b="81 39 DA 30"/>
+ <a u="3325" b="81 39 DA 31"/>
+ <a u="3326" b="81 39 DA 32"/>
+ <a u="3327" b="81 39 DA 33"/>
+ <a u="3328" b="81 39 DA 34"/>
+ <a u="3329" b="81 39 DA 35"/>
+ <a u="332A" b="81 39 DA 36"/>
+ <a u="332B" b="81 39 DA 37"/>
+ <a u="332C" b="81 39 DA 38"/>
+ <a u="332D" b="81 39 DA 39"/>
+ <a u="332E" b="81 39 DB 30"/>
+ <a u="332F" b="81 39 DB 31"/>
+ <a u="3330" b="81 39 DB 32"/>
+ <a u="3331" b="81 39 DB 33"/>
+ <a u="3332" b="81 39 DB 34"/>
+ <a u="3333" b="81 39 DB 35"/>
+ <a u="3334" b="81 39 DB 36"/>
+ <a u="3335" b="81 39 DB 37"/>
+ <a u="3336" b="81 39 DB 38"/>
+ <a u="3337" b="81 39 DB 39"/>
+ <a u="3338" b="81 39 DC 30"/>
+ <a u="3339" b="81 39 DC 31"/>
+ <a u="333A" b="81 39 DC 32"/>
+ <a u="333B" b="81 39 DC 33"/>
+ <a u="333C" b="81 39 DC 34"/>
+ <a u="333D" b="81 39 DC 35"/>
+ <a u="333E" b="81 39 DC 36"/>
+ <a u="333F" b="81 39 DC 37"/>
+ <a u="3340" b="81 39 DC 38"/>
+ <a u="3341" b="81 39 DC 39"/>
+ <a u="3342" b="81 39 DD 30"/>
+ <a u="3343" b="81 39 DD 31"/>
+ <a u="3344" b="81 39 DD 32"/>
+ <a u="3345" b="81 39 DD 33"/>
+ <a u="3346" b="81 39 DD 34"/>
+ <a u="3347" b="81 39 DD 35"/>
+ <a u="3348" b="81 39 DD 36"/>
+ <a u="3349" b="81 39 DD 37"/>
+ <a u="334A" b="81 39 DD 38"/>
+ <a u="334B" b="81 39 DD 39"/>
+ <a u="334C" b="81 39 DE 30"/>
+ <a u="334D" b="81 39 DE 31"/>
+ <a u="334E" b="81 39 DE 32"/>
+ <a u="334F" b="81 39 DE 33"/>
+ <a u="3350" b="81 39 DE 34"/>
+ <a u="3351" b="81 39 DE 35"/>
+ <a u="3352" b="81 39 DE 36"/>
+ <a u="3353" b="81 39 DE 37"/>
+ <a u="3354" b="81 39 DE 38"/>
+ <a u="3355" b="81 39 DE 39"/>
+ <a u="3356" b="81 39 DF 30"/>
+ <a u="3357" b="81 39 DF 31"/>
+ <a u="3358" b="81 39 DF 32"/>
+ <a u="3359" b="81 39 DF 33"/>
+ <a u="335A" b="81 39 DF 34"/>
+ <a u="335B" b="81 39 DF 35"/>
+ <a u="335C" b="81 39 DF 36"/>
+ <a u="335D" b="81 39 DF 37"/>
+ <a u="335E" b="81 39 DF 38"/>
+ <a u="335F" b="81 39 DF 39"/>
+ <a u="3360" b="81 39 E0 30"/>
+ <a u="3361" b="81 39 E0 31"/>
+ <a u="3362" b="81 39 E0 32"/>
+ <a u="3363" b="81 39 E0 33"/>
+ <a u="3364" b="81 39 E0 34"/>
+ <a u="3365" b="81 39 E0 35"/>
+ <a u="3366" b="81 39 E0 36"/>
+ <a u="3367" b="81 39 E0 37"/>
+ <a u="3368" b="81 39 E0 38"/>
+ <a u="3369" b="81 39 E0 39"/>
+ <a u="336A" b="81 39 E1 30"/>
+ <a u="336B" b="81 39 E1 31"/>
+ <a u="336C" b="81 39 E1 32"/>
+ <a u="336D" b="81 39 E1 33"/>
+ <a u="336E" b="81 39 E1 34"/>
+ <a u="336F" b="81 39 E1 35"/>
+ <a u="3370" b="81 39 E1 36"/>
+ <a u="3371" b="81 39 E1 37"/>
+ <a u="3372" b="81 39 E1 38"/>
+ <a u="3373" b="81 39 E1 39"/>
+ <a u="3374" b="81 39 E2 30"/>
+ <a u="3375" b="81 39 E2 31"/>
+ <a u="3376" b="81 39 E2 32"/>
+ <a u="3377" b="81 39 E2 33"/>
+ <a u="3378" b="81 39 E2 34"/>
+ <a u="3379" b="81 39 E2 35"/>
+ <a u="337A" b="81 39 E2 36"/>
+ <a u="337B" b="81 39 E2 37"/>
+ <a u="337C" b="81 39 E2 38"/>
+ <a u="337D" b="81 39 E2 39"/>
+ <a u="337E" b="81 39 E3 30"/>
+ <a u="337F" b="81 39 E3 31"/>
+ <a u="3380" b="81 39 E3 32"/>
+ <a u="3381" b="81 39 E3 33"/>
+ <a u="3382" b="81 39 E3 34"/>
+ <a u="3383" b="81 39 E3 35"/>
+ <a u="3384" b="81 39 E3 36"/>
+ <a u="3385" b="81 39 E3 37"/>
+ <a u="3386" b="81 39 E3 38"/>
+ <a u="3387" b="81 39 E3 39"/>
+ <a u="3388" b="81 39 E4 30"/>
+ <a u="3389" b="81 39 E4 31"/>
+ <a u="338A" b="81 39 E4 32"/>
+ <a u="338B" b="81 39 E4 33"/>
+ <a u="338C" b="81 39 E4 34"/>
+ <a u="338D" b="81 39 E4 35"/>
+ <a u="338E" b="A9 4A"/>
+ <a u="338F" b="A9 4B"/>
+ <a u="3390" b="81 39 E4 36"/>
+ <a u="3391" b="81 39 E4 37"/>
+ <a u="3392" b="81 39 E4 38"/>
+ <a u="3393" b="81 39 E4 39"/>
+ <a u="3394" b="81 39 E5 30"/>
+ <a u="3395" b="81 39 E5 31"/>
+ <a u="3396" b="81 39 E5 32"/>
+ <a u="3397" b="81 39 E5 33"/>
+ <a u="3398" b="81 39 E5 34"/>
+ <a u="3399" b="81 39 E5 35"/>
+ <a u="339A" b="81 39 E5 36"/>
+ <a u="339B" b="81 39 E5 37"/>
+ <a u="339C" b="A9 4C"/>
+ <a u="339D" b="A9 4D"/>
+ <a u="339E" b="A9 4E"/>
+ <a u="339F" b="81 39 E5 38"/>
+ <a u="33A0" b="81 39 E5 39"/>
+ <a u="33A1" b="A9 4F"/>
+ <a u="33A2" b="81 39 E6 30"/>
+ <a u="33A3" b="81 39 E6 31"/>
+ <a u="33A4" b="81 39 E6 32"/>
+ <a u="33A5" b="81 39 E6 33"/>
+ <a u="33A6" b="81 39 E6 34"/>
+ <a u="33A7" b="81 39 E6 35"/>
+ <a u="33A8" b="81 39 E6 36"/>
+ <a u="33A9" b="81 39 E6 37"/>
+ <a u="33AA" b="81 39 E6 38"/>
+ <a u="33AB" b="81 39 E6 39"/>
+ <a u="33AC" b="81 39 E7 30"/>
+ <a u="33AD" b="81 39 E7 31"/>
+ <a u="33AE" b="81 39 E7 32"/>
+ <a u="33AF" b="81 39 E7 33"/>
+ <a u="33B0" b="81 39 E7 34"/>
+ <a u="33B1" b="81 39 E7 35"/>
+ <a u="33B2" b="81 39 E7 36"/>
+ <a u="33B3" b="81 39 E7 37"/>
+ <a u="33B4" b="81 39 E7 38"/>
+ <a u="33B5" b="81 39 E7 39"/>
+ <a u="33B6" b="81 39 E8 30"/>
+ <a u="33B7" b="81 39 E8 31"/>
+ <a u="33B8" b="81 39 E8 32"/>
+ <a u="33B9" b="81 39 E8 33"/>
+ <a u="33BA" b="81 39 E8 34"/>
+ <a u="33BB" b="81 39 E8 35"/>
+ <a u="33BC" b="81 39 E8 36"/>
+ <a u="33BD" b="81 39 E8 37"/>
+ <a u="33BE" b="81 39 E8 38"/>
+ <a u="33BF" b="81 39 E8 39"/>
+ <a u="33C0" b="81 39 E9 30"/>
+ <a u="33C1" b="81 39 E9 31"/>
+ <a u="33C2" b="81 39 E9 32"/>
+ <a u="33C3" b="81 39 E9 33"/>
+ <a u="33C4" b="A9 50"/>
+ <a u="33C5" b="81 39 E9 34"/>
+ <a u="33C6" b="81 39 E9 35"/>
+ <a u="33C7" b="81 39 E9 36"/>
+ <a u="33C8" b="81 39 E9 37"/>
+ <a u="33C9" b="81 39 E9 38"/>
+ <a u="33CA" b="81 39 E9 39"/>
+ <a u="33CB" b="81 39 EA 30"/>
+ <a u="33CC" b="81 39 EA 31"/>
+ <a u="33CD" b="81 39 EA 32"/>
+ <a u="33CE" b="A9 51"/>
+ <a u="33CF" b="81 39 EA 33"/>
+ <a u="33D0" b="81 39 EA 34"/>
+ <a u="33D1" b="A9 52"/>
+ <a u="33D2" b="A9 53"/>
+ <a u="33D3" b="81 39 EA 35"/>
+ <a u="33D4" b="81 39 EA 36"/>
+ <a u="33D5" b="A9 54"/>
+ <a u="33D6" b="81 39 EA 37"/>
+ <a u="33D7" b="81 39 EA 38"/>
+ <a u="33D8" b="81 39 EA 39"/>
+ <a u="33D9" b="81 39 EB 30"/>
+ <a u="33DA" b="81 39 EB 31"/>
+ <a u="33DB" b="81 39 EB 32"/>
+ <a u="33DC" b="81 39 EB 33"/>
+ <a u="33DD" b="81 39 EB 34"/>
+ <a u="33DE" b="81 39 EB 35"/>
+ <a u="33DF" b="81 39 EB 36"/>
+ <a u="33E0" b="81 39 EB 37"/>
+ <a u="33E1" b="81 39 EB 38"/>
+ <a u="33E2" b="81 39 EB 39"/>
+ <a u="33E3" b="81 39 EC 30"/>
+ <a u="33E4" b="81 39 EC 31"/>
+ <a u="33E5" b="81 39 EC 32"/>
+ <a u="33E6" b="81 39 EC 33"/>
+ <a u="33E7" b="81 39 EC 34"/>
+ <a u="33E8" b="81 39 EC 35"/>
+ <a u="33E9" b="81 39 EC 36"/>
+ <a u="33EA" b="81 39 EC 37"/>
+ <a u="33EB" b="81 39 EC 38"/>
+ <a u="33EC" b="81 39 EC 39"/>
+ <a u="33ED" b="81 39 ED 30"/>
+ <a u="33EE" b="81 39 ED 31"/>
+ <a u="33EF" b="81 39 ED 32"/>
+ <a u="33F0" b="81 39 ED 33"/>
+ <a u="33F1" b="81 39 ED 34"/>
+ <a u="33F2" b="81 39 ED 35"/>
+ <a u="33F3" b="81 39 ED 36"/>
+ <a u="33F4" b="81 39 ED 37"/>
+ <a u="33F5" b="81 39 ED 38"/>
+ <a u="33F6" b="81 39 ED 39"/>
+ <a u="33F7" b="81 39 EE 30"/>
+ <a u="33F8" b="81 39 EE 31"/>
+ <a u="33F9" b="81 39 EE 32"/>
+ <a u="33FA" b="81 39 EE 33"/>
+ <a u="33FB" b="81 39 EE 34"/>
+ <a u="33FC" b="81 39 EE 35"/>
+ <a u="33FD" b="81 39 EE 36"/>
+ <a u="33FE" b="81 39 EE 37"/>
+ <a u="33FF" b="81 39 EE 38"/>
+ <a u="3400" b="81 39 EE 39"/>
+ <a u="3401" b="81 39 EF 30"/>
+ <a u="3402" b="81 39 EF 31"/>
+ <a u="3403" b="81 39 EF 32"/>
+ <a u="3404" b="81 39 EF 33"/>
+ <a u="3405" b="81 39 EF 34"/>
+ <a u="3406" b="81 39 EF 35"/>
+ <a u="3407" b="81 39 EF 36"/>
+ <a u="3408" b="81 39 EF 37"/>
+ <a u="3409" b="81 39 EF 38"/>
+ <a u="340A" b="81 39 EF 39"/>
+ <a u="340B" b="81 39 F0 30"/>
+ <a u="340C" b="81 39 F0 31"/>
+ <a u="340D" b="81 39 F0 32"/>
+ <a u="340E" b="81 39 F0 33"/>
+ <a u="340F" b="81 39 F0 34"/>
+ <a u="3410" b="81 39 F0 35"/>
+ <a u="3411" b="81 39 F0 36"/>
+ <a u="3412" b="81 39 F0 37"/>
+ <a u="3413" b="81 39 F0 38"/>
+ <a u="3414" b="81 39 F0 39"/>
+ <a u="3415" b="81 39 F1 30"/>
+ <a u="3416" b="81 39 F1 31"/>
+ <a u="3417" b="81 39 F1 32"/>
+ <a u="3418" b="81 39 F1 33"/>
+ <a u="3419" b="81 39 F1 34"/>
+ <a u="341A" b="81 39 F1 35"/>
+ <a u="341B" b="81 39 F1 36"/>
+ <a u="341C" b="81 39 F1 37"/>
+ <a u="341D" b="81 39 F1 38"/>
+ <a u="341E" b="81 39 F1 39"/>
+ <a u="341F" b="81 39 F2 30"/>
+ <a u="3420" b="81 39 F2 31"/>
+ <a u="3421" b="81 39 F2 32"/>
+ <a u="3422" b="81 39 F2 33"/>
+ <a u="3423" b="81 39 F2 34"/>
+ <a u="3424" b="81 39 F2 35"/>
+ <a u="3425" b="81 39 F2 36"/>
+ <a u="3426" b="81 39 F2 37"/>
+ <a u="3427" b="81 39 F2 38"/>
+ <a u="3428" b="81 39 F2 39"/>
+ <a u="3429" b="81 39 F3 30"/>
+ <a u="342A" b="81 39 F3 31"/>
+ <a u="342B" b="81 39 F3 32"/>
+ <a u="342C" b="81 39 F3 33"/>
+ <a u="342D" b="81 39 F3 34"/>
+ <a u="342E" b="81 39 F3 35"/>
+ <a u="342F" b="81 39 F3 36"/>
+ <a u="3430" b="81 39 F3 37"/>
+ <a u="3431" b="81 39 F3 38"/>
+ <a u="3432" b="81 39 F3 39"/>
+ <a u="3433" b="81 39 F4 30"/>
+ <a u="3434" b="81 39 F4 31"/>
+ <a u="3435" b="81 39 F4 32"/>
+ <a u="3436" b="81 39 F4 33"/>
+ <a u="3437" b="81 39 F4 34"/>
+ <a u="3438" b="81 39 F4 35"/>
+ <a u="3439" b="81 39 F4 36"/>
+ <a u="343A" b="81 39 F4 37"/>
+ <a u="343B" b="81 39 F4 38"/>
+ <a u="343C" b="81 39 F4 39"/>
+ <a u="343D" b="81 39 F5 30"/>
+ <a u="343E" b="81 39 F5 31"/>
+ <a u="343F" b="81 39 F5 32"/>
+ <a u="3440" b="81 39 F5 33"/>
+ <a u="3441" b="81 39 F5 34"/>
+ <a u="3442" b="81 39 F5 35"/>
+ <a u="3443" b="81 39 F5 36"/>
+ <a u="3444" b="81 39 F5 37"/>
+ <a u="3445" b="81 39 F5 38"/>
+ <a u="3446" b="81 39 F5 39"/>
+ <a u="3447" b="FE 56"/>
+ <a u="3448" b="81 39 F6 30"/>
+ <a u="3449" b="81 39 F6 31"/>
+ <a u="344A" b="81 39 F6 32"/>
+ <a u="344B" b="81 39 F6 33"/>
+ <a u="344C" b="81 39 F6 34"/>
+ <a u="344D" b="81 39 F6 35"/>
+ <a u="344E" b="81 39 F6 36"/>
+ <a u="344F" b="81 39 F6 37"/>
+ <a u="3450" b="81 39 F6 38"/>
+ <a u="3451" b="81 39 F6 39"/>
+ <a u="3452" b="81 39 F7 30"/>
+ <a u="3453" b="81 39 F7 31"/>
+ <a u="3454" b="81 39 F7 32"/>
+ <a u="3455" b="81 39 F7 33"/>
+ <a u="3456" b="81 39 F7 34"/>
+ <a u="3457" b="81 39 F7 35"/>
+ <a u="3458" b="81 39 F7 36"/>
+ <a u="3459" b="81 39 F7 37"/>
+ <a u="345A" b="81 39 F7 38"/>
+ <a u="345B" b="81 39 F7 39"/>
+ <a u="345C" b="81 39 F8 30"/>
+ <a u="345D" b="81 39 F8 31"/>
+ <a u="345E" b="81 39 F8 32"/>
+ <a u="345F" b="81 39 F8 33"/>
+ <a u="3460" b="81 39 F8 34"/>
+ <a u="3461" b="81 39 F8 35"/>
+ <a u="3462" b="81 39 F8 36"/>
+ <a u="3463" b="81 39 F8 37"/>
+ <a u="3464" b="81 39 F8 38"/>
+ <a u="3465" b="81 39 F8 39"/>
+ <a u="3466" b="81 39 F9 30"/>
+ <a u="3467" b="81 39 F9 31"/>
+ <a u="3468" b="81 39 F9 32"/>
+ <a u="3469" b="81 39 F9 33"/>
+ <a u="346A" b="81 39 F9 34"/>
+ <a u="346B" b="81 39 F9 35"/>
+ <a u="346C" b="81 39 F9 36"/>
+ <a u="346D" b="81 39 F9 37"/>
+ <a u="346E" b="81 39 F9 38"/>
+ <a u="346F" b="81 39 F9 39"/>
+ <a u="3470" b="81 39 FA 30"/>
+ <a u="3471" b="81 39 FA 31"/>
+ <a u="3472" b="81 39 FA 32"/>
+ <a u="3473" b="FE 55"/>
+ <a u="3474" b="81 39 FA 33"/>
+ <a u="3475" b="81 39 FA 34"/>
+ <a u="3476" b="81 39 FA 35"/>
+ <a u="3477" b="81 39 FA 36"/>
+ <a u="3478" b="81 39 FA 37"/>
+ <a u="3479" b="81 39 FA 38"/>
+ <a u="347A" b="81 39 FA 39"/>
+ <a u="347B" b="81 39 FB 30"/>
+ <a u="347C" b="81 39 FB 31"/>
+ <a u="347D" b="81 39 FB 32"/>
+ <a u="347E" b="81 39 FB 33"/>
+ <a u="347F" b="81 39 FB 34"/>
+ <a u="3480" b="81 39 FB 35"/>
+ <a u="3481" b="81 39 FB 36"/>
+ <a u="3482" b="81 39 FB 37"/>
+ <a u="3483" b="81 39 FB 38"/>
+ <a u="3484" b="81 39 FB 39"/>
+ <a u="3485" b="81 39 FC 30"/>
+ <a u="3486" b="81 39 FC 31"/>
+ <a u="3487" b="81 39 FC 32"/>
+ <a u="3488" b="81 39 FC 33"/>
+ <a u="3489" b="81 39 FC 34"/>
+ <a u="348A" b="81 39 FC 35"/>
+ <a u="348B" b="81 39 FC 36"/>
+ <a u="348C" b="81 39 FC 37"/>
+ <a u="348D" b="81 39 FC 38"/>
+ <a u="348E" b="81 39 FC 39"/>
+ <a u="348F" b="81 39 FD 30"/>
+ <a u="3490" b="81 39 FD 31"/>
+ <a u="3491" b="81 39 FD 32"/>
+ <a u="3492" b="81 39 FD 33"/>
+ <a u="3493" b="81 39 FD 34"/>
+ <a u="3494" b="81 39 FD 35"/>
+ <a u="3495" b="81 39 FD 36"/>
+ <a u="3496" b="81 39 FD 37"/>
+ <a u="3497" b="81 39 FD 38"/>
+ <a u="3498" b="81 39 FD 39"/>
+ <a u="3499" b="81 39 FE 30"/>
+ <a u="349A" b="81 39 FE 31"/>
+ <a u="349B" b="81 39 FE 32"/>
+ <a u="349C" b="81 39 FE 33"/>
+ <a u="349D" b="81 39 FE 34"/>
+ <a u="349E" b="81 39 FE 35"/>
+ <a u="349F" b="81 39 FE 36"/>
+ <a u="34A0" b="81 39 FE 37"/>
+ <a u="34A1" b="81 39 FE 38"/>
+ <a u="34A2" b="81 39 FE 39"/>
+ <a u="34A3" b="82 30 81 30"/>
+ <a u="34A4" b="82 30 81 31"/>
+ <a u="34A5" b="82 30 81 32"/>
+ <a u="34A6" b="82 30 81 33"/>
+ <a u="34A7" b="82 30 81 34"/>
+ <a u="34A8" b="82 30 81 35"/>
+ <a u="34A9" b="82 30 81 36"/>
+ <a u="34AA" b="82 30 81 37"/>
+ <a u="34AB" b="82 30 81 38"/>
+ <a u="34AC" b="82 30 81 39"/>
+ <a u="34AD" b="82 30 82 30"/>
+ <a u="34AE" b="82 30 82 31"/>
+ <a u="34AF" b="82 30 82 32"/>
+ <a u="34B0" b="82 30 82 33"/>
+ <a u="34B1" b="82 30 82 34"/>
+ <a u="34B2" b="82 30 82 35"/>
+ <a u="34B3" b="82 30 82 36"/>
+ <a u="34B4" b="82 30 82 37"/>
+ <a u="34B5" b="82 30 82 38"/>
+ <a u="34B6" b="82 30 82 39"/>
+ <a u="34B7" b="82 30 83 30"/>
+ <a u="34B8" b="82 30 83 31"/>
+ <a u="34B9" b="82 30 83 32"/>
+ <a u="34BA" b="82 30 83 33"/>
+ <a u="34BB" b="82 30 83 34"/>
+ <a u="34BC" b="82 30 83 35"/>
+ <a u="34BD" b="82 30 83 36"/>
+ <a u="34BE" b="82 30 83 37"/>
+ <a u="34BF" b="82 30 83 38"/>
+ <a u="34C0" b="82 30 83 39"/>
+ <a u="34C1" b="82 30 84 30"/>
+ <a u="34C2" b="82 30 84 31"/>
+ <a u="34C3" b="82 30 84 32"/>
+ <a u="34C4" b="82 30 84 33"/>
+ <a u="34C5" b="82 30 84 34"/>
+ <a u="34C6" b="82 30 84 35"/>
+ <a u="34C7" b="82 30 84 36"/>
+ <a u="34C8" b="82 30 84 37"/>
+ <a u="34C9" b="82 30 84 38"/>
+ <a u="34CA" b="82 30 84 39"/>
+ <a u="34CB" b="82 30 85 30"/>
+ <a u="34CC" b="82 30 85 31"/>
+ <a u="34CD" b="82 30 85 32"/>
+ <a u="34CE" b="82 30 85 33"/>
+ <a u="34CF" b="82 30 85 34"/>
+ <a u="34D0" b="82 30 85 35"/>
+ <a u="34D1" b="82 30 85 36"/>
+ <a u="34D2" b="82 30 85 37"/>
+ <a u="34D3" b="82 30 85 38"/>
+ <a u="34D4" b="82 30 85 39"/>
+ <a u="34D5" b="82 30 86 30"/>
+ <a u="34D6" b="82 30 86 31"/>
+ <a u="34D7" b="82 30 86 32"/>
+ <a u="34D8" b="82 30 86 33"/>
+ <a u="34D9" b="82 30 86 34"/>
+ <a u="34DA" b="82 30 86 35"/>
+ <a u="34DB" b="82 30 86 36"/>
+ <a u="34DC" b="82 30 86 37"/>
+ <a u="34DD" b="82 30 86 38"/>
+ <a u="34DE" b="82 30 86 39"/>
+ <a u="34DF" b="82 30 87 30"/>
+ <a u="34E0" b="82 30 87 31"/>
+ <a u="34E1" b="82 30 87 32"/>
+ <a u="34E2" b="82 30 87 33"/>
+ <a u="34E3" b="82 30 87 34"/>
+ <a u="34E4" b="82 30 87 35"/>
+ <a u="34E5" b="82 30 87 36"/>
+ <a u="34E6" b="82 30 87 37"/>
+ <a u="34E7" b="82 30 87 38"/>
+ <a u="34E8" b="82 30 87 39"/>
+ <a u="34E9" b="82 30 88 30"/>
+ <a u="34EA" b="82 30 88 31"/>
+ <a u="34EB" b="82 30 88 32"/>
+ <a u="34EC" b="82 30 88 33"/>
+ <a u="34ED" b="82 30 88 34"/>
+ <a u="34EE" b="82 30 88 35"/>
+ <a u="34EF" b="82 30 88 36"/>
+ <a u="34F0" b="82 30 88 37"/>
+ <a u="34F1" b="82 30 88 38"/>
+ <a u="34F2" b="82 30 88 39"/>
+ <a u="34F3" b="82 30 89 30"/>
+ <a u="34F4" b="82 30 89 31"/>
+ <a u="34F5" b="82 30 89 32"/>
+ <a u="34F6" b="82 30 89 33"/>
+ <a u="34F7" b="82 30 89 34"/>
+ <a u="34F8" b="82 30 89 35"/>
+ <a u="34F9" b="82 30 89 36"/>
+ <a u="34FA" b="82 30 89 37"/>
+ <a u="34FB" b="82 30 89 38"/>
+ <a u="34FC" b="82 30 89 39"/>
+ <a u="34FD" b="82 30 8A 30"/>
+ <a u="34FE" b="82 30 8A 31"/>
+ <a u="34FF" b="82 30 8A 32"/>
+ <a u="3500" b="82 30 8A 33"/>
+ <a u="3501" b="82 30 8A 34"/>
+ <a u="3502" b="82 30 8A 35"/>
+ <a u="3503" b="82 30 8A 36"/>
+ <a u="3504" b="82 30 8A 37"/>
+ <a u="3505" b="82 30 8A 38"/>
+ <a u="3506" b="82 30 8A 39"/>
+ <a u="3507" b="82 30 8B 30"/>
+ <a u="3508" b="82 30 8B 31"/>
+ <a u="3509" b="82 30 8B 32"/>
+ <a u="350A" b="82 30 8B 33"/>
+ <a u="350B" b="82 30 8B 34"/>
+ <a u="350C" b="82 30 8B 35"/>
+ <a u="350D" b="82 30 8B 36"/>
+ <a u="350E" b="82 30 8B 37"/>
+ <a u="350F" b="82 30 8B 38"/>
+ <a u="3510" b="82 30 8B 39"/>
+ <a u="3511" b="82 30 8C 30"/>
+ <a u="3512" b="82 30 8C 31"/>
+ <a u="3513" b="82 30 8C 32"/>
+ <a u="3514" b="82 30 8C 33"/>
+ <a u="3515" b="82 30 8C 34"/>
+ <a u="3516" b="82 30 8C 35"/>
+ <a u="3517" b="82 30 8C 36"/>
+ <a u="3518" b="82 30 8C 37"/>
+ <a u="3519" b="82 30 8C 38"/>
+ <a u="351A" b="82 30 8C 39"/>
+ <a u="351B" b="82 30 8D 30"/>
+ <a u="351C" b="82 30 8D 31"/>
+ <a u="351D" b="82 30 8D 32"/>
+ <a u="351E" b="82 30 8D 33"/>
+ <a u="351F" b="82 30 8D 34"/>
+ <a u="3520" b="82 30 8D 35"/>
+ <a u="3521" b="82 30 8D 36"/>
+ <a u="3522" b="82 30 8D 37"/>
+ <a u="3523" b="82 30 8D 38"/>
+ <a u="3524" b="82 30 8D 39"/>
+ <a u="3525" b="82 30 8E 30"/>
+ <a u="3526" b="82 30 8E 31"/>
+ <a u="3527" b="82 30 8E 32"/>
+ <a u="3528" b="82 30 8E 33"/>
+ <a u="3529" b="82 30 8E 34"/>
+ <a u="352A" b="82 30 8E 35"/>
+ <a u="352B" b="82 30 8E 36"/>
+ <a u="352C" b="82 30 8E 37"/>
+ <a u="352D" b="82 30 8E 38"/>
+ <a u="352E" b="82 30 8E 39"/>
+ <a u="352F" b="82 30 8F 30"/>
+ <a u="3530" b="82 30 8F 31"/>
+ <a u="3531" b="82 30 8F 32"/>
+ <a u="3532" b="82 30 8F 33"/>
+ <a u="3533" b="82 30 8F 34"/>
+ <a u="3534" b="82 30 8F 35"/>
+ <a u="3535" b="82 30 8F 36"/>
+ <a u="3536" b="82 30 8F 37"/>
+ <a u="3537" b="82 30 8F 38"/>
+ <a u="3538" b="82 30 8F 39"/>
+ <a u="3539" b="82 30 90 30"/>
+ <a u="353A" b="82 30 90 31"/>
+ <a u="353B" b="82 30 90 32"/>
+ <a u="353C" b="82 30 90 33"/>
+ <a u="353D" b="82 30 90 34"/>
+ <a u="353E" b="82 30 90 35"/>
+ <a u="353F" b="82 30 90 36"/>
+ <a u="3540" b="82 30 90 37"/>
+ <a u="3541" b="82 30 90 38"/>
+ <a u="3542" b="82 30 90 39"/>
+ <a u="3543" b="82 30 91 30"/>
+ <a u="3544" b="82 30 91 31"/>
+ <a u="3545" b="82 30 91 32"/>
+ <a u="3546" b="82 30 91 33"/>
+ <a u="3547" b="82 30 91 34"/>
+ <a u="3548" b="82 30 91 35"/>
+ <a u="3549" b="82 30 91 36"/>
+ <a u="354A" b="82 30 91 37"/>
+ <a u="354B" b="82 30 91 38"/>
+ <a u="354C" b="82 30 91 39"/>
+ <a u="354D" b="82 30 92 30"/>
+ <a u="354E" b="82 30 92 31"/>
+ <a u="354F" b="82 30 92 32"/>
+ <a u="3550" b="82 30 92 33"/>
+ <a u="3551" b="82 30 92 34"/>
+ <a u="3552" b="82 30 92 35"/>
+ <a u="3553" b="82 30 92 36"/>
+ <a u="3554" b="82 30 92 37"/>
+ <a u="3555" b="82 30 92 38"/>
+ <a u="3556" b="82 30 92 39"/>
+ <a u="3557" b="82 30 93 30"/>
+ <a u="3558" b="82 30 93 31"/>
+ <a u="3559" b="82 30 93 32"/>
+ <a u="355A" b="82 30 93 33"/>
+ <a u="355B" b="82 30 93 34"/>
+ <a u="355C" b="82 30 93 35"/>
+ <a u="355D" b="82 30 93 36"/>
+ <a u="355E" b="82 30 93 37"/>
+ <a u="355F" b="82 30 93 38"/>
+ <a u="3560" b="82 30 93 39"/>
+ <a u="3561" b="82 30 94 30"/>
+ <a u="3562" b="82 30 94 31"/>
+ <a u="3563" b="82 30 94 32"/>
+ <a u="3564" b="82 30 94 33"/>
+ <a u="3565" b="82 30 94 34"/>
+ <a u="3566" b="82 30 94 35"/>
+ <a u="3567" b="82 30 94 36"/>
+ <a u="3568" b="82 30 94 37"/>
+ <a u="3569" b="82 30 94 38"/>
+ <a u="356A" b="82 30 94 39"/>
+ <a u="356B" b="82 30 95 30"/>
+ <a u="356C" b="82 30 95 31"/>
+ <a u="356D" b="82 30 95 32"/>
+ <a u="356E" b="82 30 95 33"/>
+ <a u="356F" b="82 30 95 34"/>
+ <a u="3570" b="82 30 95 35"/>
+ <a u="3571" b="82 30 95 36"/>
+ <a u="3572" b="82 30 95 37"/>
+ <a u="3573" b="82 30 95 38"/>
+ <a u="3574" b="82 30 95 39"/>
+ <a u="3575" b="82 30 96 30"/>
+ <a u="3576" b="82 30 96 31"/>
+ <a u="3577" b="82 30 96 32"/>
+ <a u="3578" b="82 30 96 33"/>
+ <a u="3579" b="82 30 96 34"/>
+ <a u="357A" b="82 30 96 35"/>
+ <a u="357B" b="82 30 96 36"/>
+ <a u="357C" b="82 30 96 37"/>
+ <a u="357D" b="82 30 96 38"/>
+ <a u="357E" b="82 30 96 39"/>
+ <a u="357F" b="82 30 97 30"/>
+ <a u="3580" b="82 30 97 31"/>
+ <a u="3581" b="82 30 97 32"/>
+ <a u="3582" b="82 30 97 33"/>
+ <a u="3583" b="82 30 97 34"/>
+ <a u="3584" b="82 30 97 35"/>
+ <a u="3585" b="82 30 97 36"/>
+ <a u="3586" b="82 30 97 37"/>
+ <a u="3587" b="82 30 97 38"/>
+ <a u="3588" b="82 30 97 39"/>
+ <a u="3589" b="82 30 98 30"/>
+ <a u="358A" b="82 30 98 31"/>
+ <a u="358B" b="82 30 98 32"/>
+ <a u="358C" b="82 30 98 33"/>
+ <a u="358D" b="82 30 98 34"/>
+ <a u="358E" b="82 30 98 35"/>
+ <a u="358F" b="82 30 98 36"/>
+ <a u="3590" b="82 30 98 37"/>
+ <a u="3591" b="82 30 98 38"/>
+ <a u="3592" b="82 30 98 39"/>
+ <a u="3593" b="82 30 99 30"/>
+ <a u="3594" b="82 30 99 31"/>
+ <a u="3595" b="82 30 99 32"/>
+ <a u="3596" b="82 30 99 33"/>
+ <a u="3597" b="82 30 99 34"/>
+ <a u="3598" b="82 30 99 35"/>
+ <a u="3599" b="82 30 99 36"/>
+ <a u="359A" b="82 30 99 37"/>
+ <a u="359B" b="82 30 99 38"/>
+ <a u="359C" b="82 30 99 39"/>
+ <a u="359D" b="82 30 9A 30"/>
+ <a u="359E" b="FE 5A"/>
+ <a u="359F" b="82 30 9A 31"/>
+ <a u="35A0" b="82 30 9A 32"/>
+ <a u="35A1" b="82 30 9A 33"/>
+ <a u="35A2" b="82 30 9A 34"/>
+ <a u="35A3" b="82 30 9A 35"/>
+ <a u="35A4" b="82 30 9A 36"/>
+ <a u="35A5" b="82 30 9A 37"/>
+ <a u="35A6" b="82 30 9A 38"/>
+ <a u="35A7" b="82 30 9A 39"/>
+ <a u="35A8" b="82 30 9B 30"/>
+ <a u="35A9" b="82 30 9B 31"/>
+ <a u="35AA" b="82 30 9B 32"/>
+ <a u="35AB" b="82 30 9B 33"/>
+ <a u="35AC" b="82 30 9B 34"/>
+ <a u="35AD" b="82 30 9B 35"/>
+ <a u="35AE" b="82 30 9B 36"/>
+ <a u="35AF" b="82 30 9B 37"/>
+ <a u="35B0" b="82 30 9B 38"/>
+ <a u="35B1" b="82 30 9B 39"/>
+ <a u="35B2" b="82 30 9C 30"/>
+ <a u="35B3" b="82 30 9C 31"/>
+ <a u="35B4" b="82 30 9C 32"/>
+ <a u="35B5" b="82 30 9C 33"/>
+ <a u="35B6" b="82 30 9C 34"/>
+ <a u="35B7" b="82 30 9C 35"/>
+ <a u="35B8" b="82 30 9C 36"/>
+ <a u="35B9" b="82 30 9C 37"/>
+ <a u="35BA" b="82 30 9C 38"/>
+ <a u="35BB" b="82 30 9C 39"/>
+ <a u="35BC" b="82 30 9D 30"/>
+ <a u="35BD" b="82 30 9D 31"/>
+ <a u="35BE" b="82 30 9D 32"/>
+ <a u="35BF" b="82 30 9D 33"/>
+ <a u="35C0" b="82 30 9D 34"/>
+ <a u="35C1" b="82 30 9D 35"/>
+ <a u="35C2" b="82 30 9D 36"/>
+ <a u="35C3" b="82 30 9D 37"/>
+ <a u="35C4" b="82 30 9D 38"/>
+ <a u="35C5" b="82 30 9D 39"/>
+ <a u="35C6" b="82 30 9E 30"/>
+ <a u="35C7" b="82 30 9E 31"/>
+ <a u="35C8" b="82 30 9E 32"/>
+ <a u="35C9" b="82 30 9E 33"/>
+ <a u="35CA" b="82 30 9E 34"/>
+ <a u="35CB" b="82 30 9E 35"/>
+ <a u="35CC" b="82 30 9E 36"/>
+ <a u="35CD" b="82 30 9E 37"/>
+ <a u="35CE" b="82 30 9E 38"/>
+ <a u="35CF" b="82 30 9E 39"/>
+ <a u="35D0" b="82 30 9F 30"/>
+ <a u="35D1" b="82 30 9F 31"/>
+ <a u="35D2" b="82 30 9F 32"/>
+ <a u="35D3" b="82 30 9F 33"/>
+ <a u="35D4" b="82 30 9F 34"/>
+ <a u="35D5" b="82 30 9F 35"/>
+ <a u="35D6" b="82 30 9F 36"/>
+ <a u="35D7" b="82 30 9F 37"/>
+ <a u="35D8" b="82 30 9F 38"/>
+ <a u="35D9" b="82 30 9F 39"/>
+ <a u="35DA" b="82 30 A0 30"/>
+ <a u="35DB" b="82 30 A0 31"/>
+ <a u="35DC" b="82 30 A0 32"/>
+ <a u="35DD" b="82 30 A0 33"/>
+ <a u="35DE" b="82 30 A0 34"/>
+ <a u="35DF" b="82 30 A0 35"/>
+ <a u="35E0" b="82 30 A0 36"/>
+ <a u="35E1" b="82 30 A0 37"/>
+ <a u="35E2" b="82 30 A0 38"/>
+ <a u="35E3" b="82 30 A0 39"/>
+ <a u="35E4" b="82 30 A1 30"/>
+ <a u="35E5" b="82 30 A1 31"/>
+ <a u="35E6" b="82 30 A1 32"/>
+ <a u="35E7" b="82 30 A1 33"/>
+ <a u="35E8" b="82 30 A1 34"/>
+ <a u="35E9" b="82 30 A1 35"/>
+ <a u="35EA" b="82 30 A1 36"/>
+ <a u="35EB" b="82 30 A1 37"/>
+ <a u="35EC" b="82 30 A1 38"/>
+ <a u="35ED" b="82 30 A1 39"/>
+ <a u="35EE" b="82 30 A2 30"/>
+ <a u="35EF" b="82 30 A2 31"/>
+ <a u="35F0" b="82 30 A2 32"/>
+ <a u="35F1" b="82 30 A2 33"/>
+ <a u="35F2" b="82 30 A2 34"/>
+ <a u="35F3" b="82 30 A2 35"/>
+ <a u="35F4" b="82 30 A2 36"/>
+ <a u="35F5" b="82 30 A2 37"/>
+ <a u="35F6" b="82 30 A2 38"/>
+ <a u="35F7" b="82 30 A2 39"/>
+ <a u="35F8" b="82 30 A3 30"/>
+ <a u="35F9" b="82 30 A3 31"/>
+ <a u="35FA" b="82 30 A3 32"/>
+ <a u="35FB" b="82 30 A3 33"/>
+ <a u="35FC" b="82 30 A3 34"/>
+ <a u="35FD" b="82 30 A3 35"/>
+ <a u="35FE" b="82 30 A3 36"/>
+ <a u="35FF" b="82 30 A3 37"/>
+ <a u="3600" b="82 30 A3 38"/>
+ <a u="3601" b="82 30 A3 39"/>
+ <a u="3602" b="82 30 A4 30"/>
+ <a u="3603" b="82 30 A4 31"/>
+ <a u="3604" b="82 30 A4 32"/>
+ <a u="3605" b="82 30 A4 33"/>
+ <a u="3606" b="82 30 A4 34"/>
+ <a u="3607" b="82 30 A4 35"/>
+ <a u="3608" b="82 30 A4 36"/>
+ <a u="3609" b="82 30 A4 37"/>
+ <a u="360A" b="82 30 A4 38"/>
+ <a u="360B" b="82 30 A4 39"/>
+ <a u="360C" b="82 30 A5 30"/>
+ <a u="360D" b="82 30 A5 31"/>
+ <a u="360E" b="FE 5C"/>
+ <a u="360F" b="82 30 A5 32"/>
+ <a u="3610" b="82 30 A5 33"/>
+ <a u="3611" b="82 30 A5 34"/>
+ <a u="3612" b="82 30 A5 35"/>
+ <a u="3613" b="82 30 A5 36"/>
+ <a u="3614" b="82 30 A5 37"/>
+ <a u="3615" b="82 30 A5 38"/>
+ <a u="3616" b="82 30 A5 39"/>
+ <a u="3617" b="82 30 A6 30"/>
+ <a u="3618" b="82 30 A6 31"/>
+ <a u="3619" b="82 30 A6 32"/>
+ <a u="361A" b="FE 5B"/>
+ <a u="3918" b="FE 60"/>
+ <a u="3919" b="82 30 F2 38"/>
+ <a u="391A" b="82 30 F2 39"/>
+ <a u="391B" b="82 30 F3 30"/>
+ <a u="391C" b="82 30 F3 31"/>
+ <a u="391D" b="82 30 F3 32"/>
+ <a u="391E" b="82 30 F3 33"/>
+ <a u="391F" b="82 30 F3 34"/>
+ <a u="3920" b="82 30 F3 35"/>
+ <a u="3921" b="82 30 F3 36"/>
+ <a u="3922" b="82 30 F3 37"/>
+ <a u="3923" b="82 30 F3 38"/>
+ <a u="3924" b="82 30 F3 39"/>
+ <a u="3925" b="82 30 F4 30"/>
+ <a u="3926" b="82 30 F4 31"/>
+ <a u="3927" b="82 30 F4 32"/>
+ <a u="3928" b="82 30 F4 33"/>
+ <a u="3929" b="82 30 F4 34"/>
+ <a u="392A" b="82 30 F4 35"/>
+ <a u="392B" b="82 30 F4 36"/>
+ <a u="392C" b="82 30 F4 37"/>
+ <a u="392D" b="82 30 F4 38"/>
+ <a u="392E" b="82 30 F4 39"/>
+ <a u="392F" b="82 30 F5 30"/>
+ <a u="3930" b="82 30 F5 31"/>
+ <a u="3931" b="82 30 F5 32"/>
+ <a u="3932" b="82 30 F5 33"/>
+ <a u="3933" b="82 30 F5 34"/>
+ <a u="3934" b="82 30 F5 35"/>
+ <a u="3935" b="82 30 F5 36"/>
+ <a u="3936" b="82 30 F5 37"/>
+ <a u="3937" b="82 30 F5 38"/>
+ <a u="3938" b="82 30 F5 39"/>
+ <a u="3939" b="82 30 F6 30"/>
+ <a u="393A" b="82 30 F6 31"/>
+ <a u="393B" b="82 30 F6 32"/>
+ <a u="393C" b="82 30 F6 33"/>
+ <a u="393D" b="82 30 F6 34"/>
+ <a u="393E" b="82 30 F6 35"/>
+ <a u="393F" b="82 30 F6 36"/>
+ <a u="3940" b="82 30 F6 37"/>
+ <a u="3941" b="82 30 F6 38"/>
+ <a u="3942" b="82 30 F6 39"/>
+ <a u="3943" b="82 30 F7 30"/>
+ <a u="3944" b="82 30 F7 31"/>
+ <a u="3945" b="82 30 F7 32"/>
+ <a u="3946" b="82 30 F7 33"/>
+ <a u="3947" b="82 30 F7 34"/>
+ <a u="3948" b="82 30 F7 35"/>
+ <a u="3949" b="82 30 F7 36"/>
+ <a u="394A" b="82 30 F7 37"/>
+ <a u="394B" b="82 30 F7 38"/>
+ <a u="394C" b="82 30 F7 39"/>
+ <a u="394D" b="82 30 F8 30"/>
+ <a u="394E" b="82 30 F8 31"/>
+ <a u="394F" b="82 30 F8 32"/>
+ <a u="3950" b="82 30 F8 33"/>
+ <a u="3951" b="82 30 F8 34"/>
+ <a u="3952" b="82 30 F8 35"/>
+ <a u="3953" b="82 30 F8 36"/>
+ <a u="3954" b="82 30 F8 37"/>
+ <a u="3955" b="82 30 F8 38"/>
+ <a u="3956" b="82 30 F8 39"/>
+ <a u="3957" b="82 30 F9 30"/>
+ <a u="3958" b="82 30 F9 31"/>
+ <a u="3959" b="82 30 F9 32"/>
+ <a u="395A" b="82 30 F9 33"/>
+ <a u="395B" b="82 30 F9 34"/>
+ <a u="395C" b="82 30 F9 35"/>
+ <a u="395D" b="82 30 F9 36"/>
+ <a u="395E" b="82 30 F9 37"/>
+ <a u="395F" b="82 30 F9 38"/>
+ <a u="3960" b="82 30 F9 39"/>
+ <a u="3961" b="82 30 FA 30"/>
+ <a u="3962" b="82 30 FA 31"/>
+ <a u="3963" b="82 30 FA 32"/>
+ <a u="3964" b="82 30 FA 33"/>
+ <a u="3965" b="82 30 FA 34"/>
+ <a u="3966" b="82 30 FA 35"/>
+ <a u="3967" b="82 30 FA 36"/>
+ <a u="3968" b="82 30 FA 37"/>
+ <a u="3969" b="82 30 FA 38"/>
+ <a u="396A" b="82 30 FA 39"/>
+ <a u="396B" b="82 30 FB 30"/>
+ <a u="396C" b="82 30 FB 31"/>
+ <a u="396D" b="82 30 FB 32"/>
+ <a u="396E" b="FE 5F"/>
+ <a u="396F" b="82 30 FB 33"/>
+ <a u="3970" b="82 30 FB 34"/>
+ <a u="3971" b="82 30 FB 35"/>
+ <a u="3972" b="82 30 FB 36"/>
+ <a u="3973" b="82 30 FB 37"/>
+ <a u="3974" b="82 30 FB 38"/>
+ <a u="3975" b="82 30 FB 39"/>
+ <a u="3976" b="82 30 FC 30"/>
+ <a u="3977" b="82 30 FC 31"/>
+ <a u="3978" b="82 30 FC 32"/>
+ <a u="3979" b="82 30 FC 33"/>
+ <a u="397A" b="82 30 FC 34"/>
+ <a u="397B" b="82 30 FC 35"/>
+ <a u="397C" b="82 30 FC 36"/>
+ <a u="397D" b="82 30 FC 37"/>
+ <a u="397E" b="82 30 FC 38"/>
+ <a u="397F" b="82 30 FC 39"/>
+ <a u="3980" b="82 30 FD 30"/>
+ <a u="3981" b="82 30 FD 31"/>
+ <a u="3982" b="82 30 FD 32"/>
+ <a u="3983" b="82 30 FD 33"/>
+ <a u="3984" b="82 30 FD 34"/>
+ <a u="3985" b="82 30 FD 35"/>
+ <a u="3986" b="82 30 FD 36"/>
+ <a u="3987" b="82 30 FD 37"/>
+ <a u="3988" b="82 30 FD 38"/>
+ <a u="3989" b="82 30 FD 39"/>
+ <a u="398A" b="82 30 FE 30"/>
+ <a u="398B" b="82 30 FE 31"/>
+ <a u="398C" b="82 30 FE 32"/>
+ <a u="398D" b="82 30 FE 33"/>
+ <a u="398E" b="82 30 FE 34"/>
+ <a u="398F" b="82 30 FE 35"/>
+ <a u="3990" b="82 30 FE 36"/>
+ <a u="3991" b="82 30 FE 37"/>
+ <a u="3992" b="82 30 FE 38"/>
+ <a u="3993" b="82 30 FE 39"/>
+ <a u="3994" b="82 31 81 30"/>
+ <a u="3995" b="82 31 81 31"/>
+ <a u="3996" b="82 31 81 32"/>
+ <a u="3997" b="82 31 81 33"/>
+ <a u="3998" b="82 31 81 34"/>
+ <a u="3999" b="82 31 81 35"/>
+ <a u="399A" b="82 31 81 36"/>
+ <a u="399B" b="82 31 81 37"/>
+ <a u="399C" b="82 31 81 38"/>
+ <a u="399D" b="82 31 81 39"/>
+ <a u="399E" b="82 31 82 30"/>
+ <a u="399F" b="82 31 82 31"/>
+ <a u="39A0" b="82 31 82 32"/>
+ <a u="39A1" b="82 31 82 33"/>
+ <a u="39A2" b="82 31 82 34"/>
+ <a u="39A3" b="82 31 82 35"/>
+ <a u="39A4" b="82 31 82 36"/>
+ <a u="39A5" b="82 31 82 37"/>
+ <a u="39A6" b="82 31 82 38"/>
+ <a u="39A7" b="82 31 82 39"/>
+ <a u="39A8" b="82 31 83 30"/>
+ <a u="39A9" b="82 31 83 31"/>
+ <a u="39AA" b="82 31 83 32"/>
+ <a u="39AB" b="82 31 83 33"/>
+ <a u="39AC" b="82 31 83 34"/>
+ <a u="39AD" b="82 31 83 35"/>
+ <a u="39AE" b="82 31 83 36"/>
+ <a u="39AF" b="82 31 83 37"/>
+ <a u="39B0" b="82 31 83 38"/>
+ <a u="39B1" b="82 31 83 39"/>
+ <a u="39B2" b="82 31 84 30"/>
+ <a u="39B3" b="82 31 84 31"/>
+ <a u="39B4" b="82 31 84 32"/>
+ <a u="39B5" b="82 31 84 33"/>
+ <a u="39B6" b="82 31 84 34"/>
+ <a u="39B7" b="82 31 84 35"/>
+ <a u="39B8" b="82 31 84 36"/>
+ <a u="39B9" b="82 31 84 37"/>
+ <a u="39BA" b="82 31 84 38"/>
+ <a u="39BB" b="82 31 84 39"/>
+ <a u="39BC" b="82 31 85 30"/>
+ <a u="39BD" b="82 31 85 31"/>
+ <a u="39BE" b="82 31 85 32"/>
+ <a u="39BF" b="82 31 85 33"/>
+ <a u="39C0" b="82 31 85 34"/>
+ <a u="39C1" b="82 31 85 35"/>
+ <a u="39C2" b="82 31 85 36"/>
+ <a u="39C3" b="82 31 85 37"/>
+ <a u="39C4" b="82 31 85 38"/>
+ <a u="39C5" b="82 31 85 39"/>
+ <a u="39C6" b="82 31 86 30"/>
+ <a u="39C7" b="82 31 86 31"/>
+ <a u="39C8" b="82 31 86 32"/>
+ <a u="39C9" b="82 31 86 33"/>
+ <a u="39CA" b="82 31 86 34"/>
+ <a u="39CB" b="82 31 86 35"/>
+ <a u="39CC" b="82 31 86 36"/>
+ <a u="39CD" b="82 31 86 37"/>
+ <a u="39CE" b="82 31 86 38"/>
+ <a u="39CF" b="FE 62"/>
+ <a u="39D0" b="FE 65"/>
+ <a u="39D1" b="82 31 86 39"/>
+ <a u="39D2" b="82 31 87 30"/>
+ <a u="39D3" b="82 31 87 31"/>
+ <a u="39D4" b="82 31 87 32"/>
+ <a u="39D5" b="82 31 87 33"/>
+ <a u="39D6" b="82 31 87 34"/>
+ <a u="39D7" b="82 31 87 35"/>
+ <a u="39D8" b="82 31 87 36"/>
+ <a u="39D9" b="82 31 87 37"/>
+ <a u="39DA" b="82 31 87 38"/>
+ <a u="39DB" b="82 31 87 39"/>
+ <a u="39DC" b="82 31 88 30"/>
+ <a u="39DD" b="82 31 88 31"/>
+ <a u="39DE" b="82 31 88 32"/>
+ <a u="39DF" b="FE 63"/>
+ <a u="39E0" b="82 31 88 33"/>
+ <a u="39E1" b="82 31 88 34"/>
+ <a u="39E2" b="82 31 88 35"/>
+ <a u="39E3" b="82 31 88 36"/>
+ <a u="39E4" b="82 31 88 37"/>
+ <a u="39E5" b="82 31 88 38"/>
+ <a u="39E6" b="82 31 88 39"/>
+ <a u="39E7" b="82 31 89 30"/>
+ <a u="39E8" b="82 31 89 31"/>
+ <a u="39E9" b="82 31 89 32"/>
+ <a u="39EA" b="82 31 89 33"/>
+ <a u="39EB" b="82 31 89 34"/>
+ <a u="39EC" b="82 31 89 35"/>
+ <a u="39ED" b="82 31 89 36"/>
+ <a u="39EE" b="82 31 89 37"/>
+ <a u="39EF" b="82 31 89 38"/>
+ <a u="39F0" b="82 31 89 39"/>
+ <a u="39F1" b="82 31 8A 30"/>
+ <a u="39F2" b="82 31 8A 31"/>
+ <a u="39F3" b="82 31 8A 32"/>
+ <a u="39F4" b="82 31 8A 33"/>
+ <a u="39F5" b="82 31 8A 34"/>
+ <a u="39F6" b="82 31 8A 35"/>
+ <a u="39F7" b="82 31 8A 36"/>
+ <a u="39F8" b="82 31 8A 37"/>
+ <a u="39F9" b="82 31 8A 38"/>
+ <a u="39FA" b="82 31 8A 39"/>
+ <a u="39FB" b="82 31 8B 30"/>
+ <a u="39FC" b="82 31 8B 31"/>
+ <a u="39FD" b="82 31 8B 32"/>
+ <a u="39FE" b="82 31 8B 33"/>
+ <a u="39FF" b="82 31 8B 34"/>
+ <a u="3A00" b="82 31 8B 35"/>
+ <a u="3A01" b="82 31 8B 36"/>
+ <a u="3A02" b="82 31 8B 37"/>
+ <a u="3A03" b="82 31 8B 38"/>
+ <a u="3A04" b="82 31 8B 39"/>
+ <a u="3A05" b="82 31 8C 30"/>
+ <a u="3A06" b="82 31 8C 31"/>
+ <a u="3A07" b="82 31 8C 32"/>
+ <a u="3A08" b="82 31 8C 33"/>
+ <a u="3A09" b="82 31 8C 34"/>
+ <a u="3A0A" b="82 31 8C 35"/>
+ <a u="3A0B" b="82 31 8C 36"/>
+ <a u="3A0C" b="82 31 8C 37"/>
+ <a u="3A0D" b="82 31 8C 38"/>
+ <a u="3A0E" b="82 31 8C 39"/>
+ <a u="3A0F" b="82 31 8D 30"/>
+ <a u="3A10" b="82 31 8D 31"/>
+ <a u="3A11" b="82 31 8D 32"/>
+ <a u="3A12" b="82 31 8D 33"/>
+ <a u="3A13" b="82 31 8D 34"/>
+ <a u="3A14" b="82 31 8D 35"/>
+ <a u="3A15" b="82 31 8D 36"/>
+ <a u="3A16" b="82 31 8D 37"/>
+ <a u="3A17" b="82 31 8D 38"/>
+ <a u="3A18" b="82 31 8D 39"/>
+ <a u="3A19" b="82 31 8E 30"/>
+ <a u="3A1A" b="82 31 8E 31"/>
+ <a u="3A1B" b="82 31 8E 32"/>
+ <a u="3A1C" b="82 31 8E 33"/>
+ <a u="3A1D" b="82 31 8E 34"/>
+ <a u="3A1E" b="82 31 8E 35"/>
+ <a u="3A1F" b="82 31 8E 36"/>
+ <a u="3A20" b="82 31 8E 37"/>
+ <a u="3A21" b="82 31 8E 38"/>
+ <a u="3A22" b="82 31 8E 39"/>
+ <a u="3A23" b="82 31 8F 30"/>
+ <a u="3A24" b="82 31 8F 31"/>
+ <a u="3A25" b="82 31 8F 32"/>
+ <a u="3A26" b="82 31 8F 33"/>
+ <a u="3A27" b="82 31 8F 34"/>
+ <a u="3A28" b="82 31 8F 35"/>
+ <a u="3A29" b="82 31 8F 36"/>
+ <a u="3A2A" b="82 31 8F 37"/>
+ <a u="3A2B" b="82 31 8F 38"/>
+ <a u="3A2C" b="82 31 8F 39"/>
+ <a u="3A2D" b="82 31 90 30"/>
+ <a u="3A2E" b="82 31 90 31"/>
+ <a u="3A2F" b="82 31 90 32"/>
+ <a u="3A30" b="82 31 90 33"/>
+ <a u="3A31" b="82 31 90 34"/>
+ <a u="3A32" b="82 31 90 35"/>
+ <a u="3A33" b="82 31 90 36"/>
+ <a u="3A34" b="82 31 90 37"/>
+ <a u="3A35" b="82 31 90 38"/>
+ <a u="3A36" b="82 31 90 39"/>
+ <a u="3A37" b="82 31 91 30"/>
+ <a u="3A38" b="82 31 91 31"/>
+ <a u="3A39" b="82 31 91 32"/>
+ <a u="3A3A" b="82 31 91 33"/>
+ <a u="3A3B" b="82 31 91 34"/>
+ <a u="3A3C" b="82 31 91 35"/>
+ <a u="3A3D" b="82 31 91 36"/>
+ <a u="3A3E" b="82 31 91 37"/>
+ <a u="3A3F" b="82 31 91 38"/>
+ <a u="3A40" b="82 31 91 39"/>
+ <a u="3A41" b="82 31 92 30"/>
+ <a u="3A42" b="82 31 92 31"/>
+ <a u="3A43" b="82 31 92 32"/>
+ <a u="3A44" b="82 31 92 33"/>
+ <a u="3A45" b="82 31 92 34"/>
+ <a u="3A46" b="82 31 92 35"/>
+ <a u="3A47" b="82 31 92 36"/>
+ <a u="3A48" b="82 31 92 37"/>
+ <a u="3A49" b="82 31 92 38"/>
+ <a u="3A4A" b="82 31 92 39"/>
+ <a u="3A4B" b="82 31 93 30"/>
+ <a u="3A4C" b="82 31 93 31"/>
+ <a u="3A4D" b="82 31 93 32"/>
+ <a u="3A4E" b="82 31 93 33"/>
+ <a u="3A4F" b="82 31 93 34"/>
+ <a u="3A50" b="82 31 93 35"/>
+ <a u="3A51" b="82 31 93 36"/>
+ <a u="3A52" b="82 31 93 37"/>
+ <a u="3A53" b="82 31 93 38"/>
+ <a u="3A54" b="82 31 93 39"/>
+ <a u="3A55" b="82 31 94 30"/>
+ <a u="3A56" b="82 31 94 31"/>
+ <a u="3A57" b="82 31 94 32"/>
+ <a u="3A58" b="82 31 94 33"/>
+ <a u="3A59" b="82 31 94 34"/>
+ <a u="3A5A" b="82 31 94 35"/>
+ <a u="3A5B" b="82 31 94 36"/>
+ <a u="3A5C" b="82 31 94 37"/>
+ <a u="3A5D" b="82 31 94 38"/>
+ <a u="3A5E" b="82 31 94 39"/>
+ <a u="3A5F" b="82 31 95 30"/>
+ <a u="3A60" b="82 31 95 31"/>
+ <a u="3A61" b="82 31 95 32"/>
+ <a u="3A62" b="82 31 95 33"/>
+ <a u="3A63" b="82 31 95 34"/>
+ <a u="3A64" b="82 31 95 35"/>
+ <a u="3A65" b="82 31 95 36"/>
+ <a u="3A66" b="82 31 95 37"/>
+ <a u="3A67" b="82 31 95 38"/>
+ <a u="3A68" b="82 31 95 39"/>
+ <a u="3A69" b="82 31 96 30"/>
+ <a u="3A6A" b="82 31 96 31"/>
+ <a u="3A6B" b="82 31 96 32"/>
+ <a u="3A6C" b="82 31 96 33"/>
+ <a u="3A6D" b="82 31 96 34"/>
+ <a u="3A6E" b="82 31 96 35"/>
+ <a u="3A6F" b="82 31 96 36"/>
+ <a u="3A70" b="82 31 96 37"/>
+ <a u="3A71" b="82 31 96 38"/>
+ <a u="3A72" b="82 31 96 39"/>
+ <a u="3A73" b="FE 64"/>
+ <a u="3A74" b="82 31 97 30"/>
+ <a u="3A75" b="82 31 97 31"/>
+ <a u="3A76" b="82 31 97 32"/>
+ <a u="3A77" b="82 31 97 33"/>
+ <a u="3A78" b="82 31 97 34"/>
+ <a u="3A79" b="82 31 97 35"/>
+ <a u="3A7A" b="82 31 97 36"/>
+ <a u="3A7B" b="82 31 97 37"/>
+ <a u="3A7C" b="82 31 97 38"/>
+ <a u="3A7D" b="82 31 97 39"/>
+ <a u="3A7E" b="82 31 98 30"/>
+ <a u="3A7F" b="82 31 98 31"/>
+ <a u="3A80" b="82 31 98 32"/>
+ <a u="3A81" b="82 31 98 33"/>
+ <a u="3A82" b="82 31 98 34"/>
+ <a u="3A83" b="82 31 98 35"/>
+ <a u="3A84" b="82 31 98 36"/>
+ <a u="3A85" b="82 31 98 37"/>
+ <a u="3A86" b="82 31 98 38"/>
+ <a u="3A87" b="82 31 98 39"/>
+ <a u="3A88" b="82 31 99 30"/>
+ <a u="3A89" b="82 31 99 31"/>
+ <a u="3A8A" b="82 31 99 32"/>
+ <a u="3A8B" b="82 31 99 33"/>
+ <a u="3A8C" b="82 31 99 34"/>
+ <a u="3A8D" b="82 31 99 35"/>
+ <a u="3A8E" b="82 31 99 36"/>
+ <a u="3A8F" b="82 31 99 37"/>
+ <a u="3A90" b="82 31 99 38"/>
+ <a u="3A91" b="82 31 99 39"/>
+ <a u="3A92" b="82 31 9A 30"/>
+ <a u="3A93" b="82 31 9A 31"/>
+ <a u="3A94" b="82 31 9A 32"/>
+ <a u="3A95" b="82 31 9A 33"/>
+ <a u="3A96" b="82 31 9A 34"/>
+ <a u="3A97" b="82 31 9A 35"/>
+ <a u="3A98" b="82 31 9A 36"/>
+ <a u="3A99" b="82 31 9A 37"/>
+ <a u="3A9A" b="82 31 9A 38"/>
+ <a u="3A9B" b="82 31 9A 39"/>
+ <a u="3A9C" b="82 31 9B 30"/>
+ <a u="3A9D" b="82 31 9B 31"/>
+ <a u="3A9E" b="82 31 9B 32"/>
+ <a u="3A9F" b="82 31 9B 33"/>
+ <a u="3AA0" b="82 31 9B 34"/>
+ <a u="3AA1" b="82 31 9B 35"/>
+ <a u="3AA2" b="82 31 9B 36"/>
+ <a u="3AA3" b="82 31 9B 37"/>
+ <a u="3AA4" b="82 31 9B 38"/>
+ <a u="3AA5" b="82 31 9B 39"/>
+ <a u="3AA6" b="82 31 9C 30"/>
+ <a u="3AA7" b="82 31 9C 31"/>
+ <a u="3AA8" b="82 31 9C 32"/>
+ <a u="3AA9" b="82 31 9C 33"/>
+ <a u="3AAA" b="82 31 9C 34"/>
+ <a u="3AAB" b="82 31 9C 35"/>
+ <a u="3AAC" b="82 31 9C 36"/>
+ <a u="3AAD" b="82 31 9C 37"/>
+ <a u="3AAE" b="82 31 9C 38"/>
+ <a u="3AAF" b="82 31 9C 39"/>
+ <a u="3AB0" b="82 31 9D 30"/>
+ <a u="3AB1" b="82 31 9D 31"/>
+ <a u="3AB2" b="82 31 9D 32"/>
+ <a u="3AB3" b="82 31 9D 33"/>
+ <a u="3AB4" b="82 31 9D 34"/>
+ <a u="3AB5" b="82 31 9D 35"/>
+ <a u="3AB6" b="82 31 9D 36"/>
+ <a u="3AB7" b="82 31 9D 37"/>
+ <a u="3AB8" b="82 31 9D 38"/>
+ <a u="3AB9" b="82 31 9D 39"/>
+ <a u="3ABA" b="82 31 9E 30"/>
+ <a u="3ABB" b="82 31 9E 31"/>
+ <a u="3ABC" b="82 31 9E 32"/>
+ <a u="3ABD" b="82 31 9E 33"/>
+ <a u="3ABE" b="82 31 9E 34"/>
+ <a u="3ABF" b="82 31 9E 35"/>
+ <a u="3AC0" b="82 31 9E 36"/>
+ <a u="3AC1" b="82 31 9E 37"/>
+ <a u="3AC2" b="82 31 9E 38"/>
+ <a u="3AC3" b="82 31 9E 39"/>
+ <a u="3AC4" b="82 31 9F 30"/>
+ <a u="3AC5" b="82 31 9F 31"/>
+ <a u="3AC6" b="82 31 9F 32"/>
+ <a u="3AC7" b="82 31 9F 33"/>
+ <a u="3AC8" b="82 31 9F 34"/>
+ <a u="3AC9" b="82 31 9F 35"/>
+ <a u="3ACA" b="82 31 9F 36"/>
+ <a u="3ACB" b="82 31 9F 37"/>
+ <a u="3ACC" b="82 31 9F 38"/>
+ <a u="3ACD" b="82 31 9F 39"/>
+ <a u="3ACE" b="82 31 A0 30"/>
+ <a u="3ACF" b="82 31 A0 31"/>
+ <a u="3AD0" b="82 31 A0 32"/>
+ <a u="3AD1" b="82 31 A0 33"/>
+ <a u="3AD2" b="82 31 A0 34"/>
+ <a u="3AD3" b="82 31 A0 35"/>
+ <a u="3AD4" b="82 31 A0 36"/>
+ <a u="3AD5" b="82 31 A0 37"/>
+ <a u="3AD6" b="82 31 A0 38"/>
+ <a u="3AD7" b="82 31 A0 39"/>
+ <a u="3AD8" b="82 31 A1 30"/>
+ <a u="3AD9" b="82 31 A1 31"/>
+ <a u="3ADA" b="82 31 A1 32"/>
+ <a u="3ADB" b="82 31 A1 33"/>
+ <a u="3ADC" b="82 31 A1 34"/>
+ <a u="3ADD" b="82 31 A1 35"/>
+ <a u="3ADE" b="82 31 A1 36"/>
+ <a u="3ADF" b="82 31 A1 37"/>
+ <a u="3AE0" b="82 31 A1 38"/>
+ <a u="3AE1" b="82 31 A1 39"/>
+ <a u="3AE2" b="82 31 A2 30"/>
+ <a u="3AE3" b="82 31 A2 31"/>
+ <a u="3AE4" b="82 31 A2 32"/>
+ <a u="3AE5" b="82 31 A2 33"/>
+ <a u="3AE6" b="82 31 A2 34"/>
+ <a u="3AE7" b="82 31 A2 35"/>
+ <a u="3AE8" b="82 31 A2 36"/>
+ <a u="3AE9" b="82 31 A2 37"/>
+ <a u="3AEA" b="82 31 A2 38"/>
+ <a u="3AEB" b="82 31 A2 39"/>
+ <a u="3AEC" b="82 31 A3 30"/>
+ <a u="3AED" b="82 31 A3 31"/>
+ <a u="3AEE" b="82 31 A3 32"/>
+ <a u="3AEF" b="82 31 A3 33"/>
+ <a u="3AF0" b="82 31 A3 34"/>
+ <a u="3AF1" b="82 31 A3 35"/>
+ <a u="3AF2" b="82 31 A3 36"/>
+ <a u="3AF3" b="82 31 A3 37"/>
+ <a u="3AF4" b="82 31 A3 38"/>
+ <a u="3AF5" b="82 31 A3 39"/>
+ <a u="3AF6" b="82 31 A4 30"/>
+ <a u="3AF7" b="82 31 A4 31"/>
+ <a u="3AF8" b="82 31 A4 32"/>
+ <a u="3AF9" b="82 31 A4 33"/>
+ <a u="3AFA" b="82 31 A4 34"/>
+ <a u="3AFB" b="82 31 A4 35"/>
+ <a u="3AFC" b="82 31 A4 36"/>
+ <a u="3AFD" b="82 31 A4 37"/>
+ <a u="3AFE" b="82 31 A4 38"/>
+ <a u="3AFF" b="82 31 A4 39"/>
+ <a u="3B00" b="82 31 A5 30"/>
+ <a u="3B01" b="82 31 A5 31"/>
+ <a u="3B02" b="82 31 A5 32"/>
+ <a u="3B03" b="82 31 A5 33"/>
+ <a u="3B04" b="82 31 A5 34"/>
+ <a u="3B05" b="82 31 A5 35"/>
+ <a u="3B06" b="82 31 A5 36"/>
+ <a u="3B07" b="82 31 A5 37"/>
+ <a u="3B08" b="82 31 A5 38"/>
+ <a u="3B09" b="82 31 A5 39"/>
+ <a u="3B0A" b="82 31 A6 30"/>
+ <a u="3B0B" b="82 31 A6 31"/>
+ <a u="3B0C" b="82 31 A6 32"/>
+ <a u="3B0D" b="82 31 A6 33"/>
+ <a u="3B0E" b="82 31 A6 34"/>
+ <a u="3B0F" b="82 31 A6 35"/>
+ <a u="3B10" b="82 31 A6 36"/>
+ <a u="3B11" b="82 31 A6 37"/>
+ <a u="3B12" b="82 31 A6 38"/>
+ <a u="3B13" b="82 31 A6 39"/>
+ <a u="3B14" b="82 31 A7 30"/>
+ <a u="3B15" b="82 31 A7 31"/>
+ <a u="3B16" b="82 31 A7 32"/>
+ <a u="3B17" b="82 31 A7 33"/>
+ <a u="3B18" b="82 31 A7 34"/>
+ <a u="3B19" b="82 31 A7 35"/>
+ <a u="3B1A" b="82 31 A7 36"/>
+ <a u="3B1B" b="82 31 A7 37"/>
+ <a u="3B1C" b="82 31 A7 38"/>
+ <a u="3B1D" b="82 31 A7 39"/>
+ <a u="3B1E" b="82 31 A8 30"/>
+ <a u="3B1F" b="82 31 A8 31"/>
+ <a u="3B20" b="82 31 A8 32"/>
+ <a u="3B21" b="82 31 A8 33"/>
+ <a u="3B22" b="82 31 A8 34"/>
+ <a u="3B23" b="82 31 A8 35"/>
+ <a u="3B24" b="82 31 A8 36"/>
+ <a u="3B25" b="82 31 A8 37"/>
+ <a u="3B26" b="82 31 A8 38"/>
+ <a u="3B27" b="82 31 A8 39"/>
+ <a u="3B28" b="82 31 A9 30"/>
+ <a u="3B29" b="82 31 A9 31"/>
+ <a u="3B2A" b="82 31 A9 32"/>
+ <a u="3B2B" b="82 31 A9 33"/>
+ <a u="3B2C" b="82 31 A9 34"/>
+ <a u="3B2D" b="82 31 A9 35"/>
+ <a u="3B2E" b="82 31 A9 36"/>
+ <a u="3B2F" b="82 31 A9 37"/>
+ <a u="3B30" b="82 31 A9 38"/>
+ <a u="3B31" b="82 31 A9 39"/>
+ <a u="3B32" b="82 31 AA 30"/>
+ <a u="3B33" b="82 31 AA 31"/>
+ <a u="3B34" b="82 31 AA 32"/>
+ <a u="3B35" b="82 31 AA 33"/>
+ <a u="3B36" b="82 31 AA 34"/>
+ <a u="3B37" b="82 31 AA 35"/>
+ <a u="3B38" b="82 31 AA 36"/>
+ <a u="3B39" b="82 31 AA 37"/>
+ <a u="3B3A" b="82 31 AA 38"/>
+ <a u="3B3B" b="82 31 AA 39"/>
+ <a u="3B3C" b="82 31 AB 30"/>
+ <a u="3B3D" b="82 31 AB 31"/>
+ <a u="3B3E" b="82 31 AB 32"/>
+ <a u="3B3F" b="82 31 AB 33"/>
+ <a u="3B40" b="82 31 AB 34"/>
+ <a u="3B41" b="82 31 AB 35"/>
+ <a u="3B42" b="82 31 AB 36"/>
+ <a u="3B43" b="82 31 AB 37"/>
+ <a u="3B44" b="82 31 AB 38"/>
+ <a u="3B45" b="82 31 AB 39"/>
+ <a u="3B46" b="82 31 AC 30"/>
+ <a u="3B47" b="82 31 AC 31"/>
+ <a u="3B48" b="82 31 AC 32"/>
+ <a u="3B49" b="82 31 AC 33"/>
+ <a u="3B4A" b="82 31 AC 34"/>
+ <a u="3B4B" b="82 31 AC 35"/>
+ <a u="3B4C" b="82 31 AC 36"/>
+ <a u="3B4D" b="82 31 AC 37"/>
+ <a u="3B4E" b="FE 68"/>
+ <a u="3B4F" b="82 31 AC 38"/>
+ <a u="3B50" b="82 31 AC 39"/>
+ <a u="3B51" b="82 31 AD 30"/>
+ <a u="3B52" b="82 31 AD 31"/>
+ <a u="3B53" b="82 31 AD 32"/>
+ <a u="3B54" b="82 31 AD 33"/>
+ <a u="3B55" b="82 31 AD 34"/>
+ <a u="3B56" b="82 31 AD 35"/>
+ <a u="3B57" b="82 31 AD 36"/>
+ <a u="3B58" b="82 31 AD 37"/>
+ <a u="3B59" b="82 31 AD 38"/>
+ <a u="3B5A" b="82 31 AD 39"/>
+ <a u="3B5B" b="82 31 AE 30"/>
+ <a u="3B5C" b="82 31 AE 31"/>
+ <a u="3B5D" b="82 31 AE 32"/>
+ <a u="3B5E" b="82 31 AE 33"/>
+ <a u="3B5F" b="82 31 AE 34"/>
+ <a u="3B60" b="82 31 AE 35"/>
+ <a u="3B61" b="82 31 AE 36"/>
+ <a u="3B62" b="82 31 AE 37"/>
+ <a u="3B63" b="82 31 AE 38"/>
+ <a u="3B64" b="82 31 AE 39"/>
+ <a u="3B65" b="82 31 AF 30"/>
+ <a u="3B66" b="82 31 AF 31"/>
+ <a u="3B67" b="82 31 AF 32"/>
+ <a u="3B68" b="82 31 AF 33"/>
+ <a u="3B69" b="82 31 AF 34"/>
+ <a u="3B6A" b="82 31 AF 35"/>
+ <a u="3B6B" b="82 31 AF 36"/>
+ <a u="3B6C" b="82 31 AF 37"/>
+ <a u="3B6D" b="82 31 AF 38"/>
+ <a u="3B6E" b="82 31 AF 39"/>
+ <a u="3B6F" b="82 31 B0 30"/>
+ <a u="3B70" b="82 31 B0 31"/>
+ <a u="3B71" b="82 31 B0 32"/>
+ <a u="3B72" b="82 31 B0 33"/>
+ <a u="3B73" b="82 31 B0 34"/>
+ <a u="3B74" b="82 31 B0 35"/>
+ <a u="3B75" b="82 31 B0 36"/>
+ <a u="3B76" b="82 31 B0 37"/>
+ <a u="3B77" b="82 31 B0 38"/>
+ <a u="3B78" b="82 31 B0 39"/>
+ <a u="3B79" b="82 31 B1 30"/>
+ <a u="3B7A" b="82 31 B1 31"/>
+ <a u="3B7B" b="82 31 B1 32"/>
+ <a u="3B7C" b="82 31 B1 33"/>
+ <a u="3B7D" b="82 31 B1 34"/>
+ <a u="3B7E" b="82 31 B1 35"/>
+ <a u="3B7F" b="82 31 B1 36"/>
+ <a u="3B80" b="82 31 B1 37"/>
+ <a u="3B81" b="82 31 B1 38"/>
+ <a u="3B82" b="82 31 B1 39"/>
+ <a u="3B83" b="82 31 B2 30"/>
+ <a u="3B84" b="82 31 B2 31"/>
+ <a u="3B85" b="82 31 B2 32"/>
+ <a u="3B86" b="82 31 B2 33"/>
+ <a u="3B87" b="82 31 B2 34"/>
+ <a u="3B88" b="82 31 B2 35"/>
+ <a u="3B89" b="82 31 B2 36"/>
+ <a u="3B8A" b="82 31 B2 37"/>
+ <a u="3B8B" b="82 31 B2 38"/>
+ <a u="3B8C" b="82 31 B2 39"/>
+ <a u="3B8D" b="82 31 B3 30"/>
+ <a u="3B8E" b="82 31 B3 31"/>
+ <a u="3B8F" b="82 31 B3 32"/>
+ <a u="3B90" b="82 31 B3 33"/>
+ <a u="3B91" b="82 31 B3 34"/>
+ <a u="3B92" b="82 31 B3 35"/>
+ <a u="3B93" b="82 31 B3 36"/>
+ <a u="3B94" b="82 31 B3 37"/>
+ <a u="3B95" b="82 31 B3 38"/>
+ <a u="3B96" b="82 31 B3 39"/>
+ <a u="3B97" b="82 31 B4 30"/>
+ <a u="3B98" b="82 31 B4 31"/>
+ <a u="3B99" b="82 31 B4 32"/>
+ <a u="3B9A" b="82 31 B4 33"/>
+ <a u="3B9B" b="82 31 B4 34"/>
+ <a u="3B9C" b="82 31 B4 35"/>
+ <a u="3B9D" b="82 31 B4 36"/>
+ <a u="3B9E" b="82 31 B4 37"/>
+ <a u="3B9F" b="82 31 B4 38"/>
+ <a u="3BA0" b="82 31 B4 39"/>
+ <a u="3BA1" b="82 31 B5 30"/>
+ <a u="3BA2" b="82 31 B5 31"/>
+ <a u="3BA3" b="82 31 B5 32"/>
+ <a u="3BA4" b="82 31 B5 33"/>
+ <a u="3BA5" b="82 31 B5 34"/>
+ <a u="3BA6" b="82 31 B5 35"/>
+ <a u="3BA7" b="82 31 B5 36"/>
+ <a u="3BA8" b="82 31 B5 37"/>
+ <a u="3BA9" b="82 31 B5 38"/>
+ <a u="3BAA" b="82 31 B5 39"/>
+ <a u="3BAB" b="82 31 B6 30"/>
+ <a u="3BAC" b="82 31 B6 31"/>
+ <a u="3BAD" b="82 31 B6 32"/>
+ <a u="3BAE" b="82 31 B6 33"/>
+ <a u="3BAF" b="82 31 B6 34"/>
+ <a u="3BB0" b="82 31 B6 35"/>
+ <a u="3BB1" b="82 31 B6 36"/>
+ <a u="3BB2" b="82 31 B6 37"/>
+ <a u="3BB3" b="82 31 B6 38"/>
+ <a u="3BB4" b="82 31 B6 39"/>
+ <a u="3BB5" b="82 31 B7 30"/>
+ <a u="3BB6" b="82 31 B7 31"/>
+ <a u="3BB7" b="82 31 B7 32"/>
+ <a u="3BB8" b="82 31 B7 33"/>
+ <a u="3BB9" b="82 31 B7 34"/>
+ <a u="3BBA" b="82 31 B7 35"/>
+ <a u="3BBB" b="82 31 B7 36"/>
+ <a u="3BBC" b="82 31 B7 37"/>
+ <a u="3BBD" b="82 31 B7 38"/>
+ <a u="3BBE" b="82 31 B7 39"/>
+ <a u="3BBF" b="82 31 B8 30"/>
+ <a u="3BC0" b="82 31 B8 31"/>
+ <a u="3BC1" b="82 31 B8 32"/>
+ <a u="3BC2" b="82 31 B8 33"/>
+ <a u="3BC3" b="82 31 B8 34"/>
+ <a u="3BC4" b="82 31 B8 35"/>
+ <a u="3BC5" b="82 31 B8 36"/>
+ <a u="3BC6" b="82 31 B8 37"/>
+ <a u="3BC7" b="82 31 B8 38"/>
+ <a u="3BC8" b="82 31 B8 39"/>
+ <a u="3BC9" b="82 31 B9 30"/>
+ <a u="3BCA" b="82 31 B9 31"/>
+ <a u="3BCB" b="82 31 B9 32"/>
+ <a u="3BCC" b="82 31 B9 33"/>
+ <a u="3BCD" b="82 31 B9 34"/>
+ <a u="3BCE" b="82 31 B9 35"/>
+ <a u="3BCF" b="82 31 B9 36"/>
+ <a u="3BD0" b="82 31 B9 37"/>
+ <a u="3BD1" b="82 31 B9 38"/>
+ <a u="3BD2" b="82 31 B9 39"/>
+ <a u="3BD3" b="82 31 BA 30"/>
+ <a u="3BD4" b="82 31 BA 31"/>
+ <a u="3BD5" b="82 31 BA 32"/>
+ <a u="3BD6" b="82 31 BA 33"/>
+ <a u="3BD7" b="82 31 BA 34"/>
+ <a u="3BD8" b="82 31 BA 35"/>
+ <a u="3BD9" b="82 31 BA 36"/>
+ <a u="3BDA" b="82 31 BA 37"/>
+ <a u="3BDB" b="82 31 BA 38"/>
+ <a u="3BDC" b="82 31 BA 39"/>
+ <a u="3BDD" b="82 31 BB 30"/>
+ <a u="3BDE" b="82 31 BB 31"/>
+ <a u="3BDF" b="82 31 BB 32"/>
+ <a u="3BE0" b="82 31 BB 33"/>
+ <a u="3BE1" b="82 31 BB 34"/>
+ <a u="3BE2" b="82 31 BB 35"/>
+ <a u="3BE3" b="82 31 BB 36"/>
+ <a u="3BE4" b="82 31 BB 37"/>
+ <a u="3BE5" b="82 31 BB 38"/>
+ <a u="3BE6" b="82 31 BB 39"/>
+ <a u="3BE7" b="82 31 BC 30"/>
+ <a u="3BE8" b="82 31 BC 31"/>
+ <a u="3BE9" b="82 31 BC 32"/>
+ <a u="3BEA" b="82 31 BC 33"/>
+ <a u="3BEB" b="82 31 BC 34"/>
+ <a u="3BEC" b="82 31 BC 35"/>
+ <a u="3BED" b="82 31 BC 36"/>
+ <a u="3BEE" b="82 31 BC 37"/>
+ <a u="3BEF" b="82 31 BC 38"/>
+ <a u="3BF0" b="82 31 BC 39"/>
+ <a u="3BF1" b="82 31 BD 30"/>
+ <a u="3BF2" b="82 31 BD 31"/>
+ <a u="3BF3" b="82 31 BD 32"/>
+ <a u="3BF4" b="82 31 BD 33"/>
+ <a u="3BF5" b="82 31 BD 34"/>
+ <a u="3BF6" b="82 31 BD 35"/>
+ <a u="3BF7" b="82 31 BD 36"/>
+ <a u="3BF8" b="82 31 BD 37"/>
+ <a u="3BF9" b="82 31 BD 38"/>
+ <a u="3BFA" b="82 31 BD 39"/>
+ <a u="3BFB" b="82 31 BE 30"/>
+ <a u="3BFC" b="82 31 BE 31"/>
+ <a u="3BFD" b="82 31 BE 32"/>
+ <a u="3BFE" b="82 31 BE 33"/>
+ <a u="3BFF" b="82 31 BE 34"/>
+ <a u="3C00" b="82 31 BE 35"/>
+ <a u="3C01" b="82 31 BE 36"/>
+ <a u="3C02" b="82 31 BE 37"/>
+ <a u="3C03" b="82 31 BE 38"/>
+ <a u="3C04" b="82 31 BE 39"/>
+ <a u="3C05" b="82 31 BF 30"/>
+ <a u="3C06" b="82 31 BF 31"/>
+ <a u="3C07" b="82 31 BF 32"/>
+ <a u="3C08" b="82 31 BF 33"/>
+ <a u="3C09" b="82 31 BF 34"/>
+ <a u="3C0A" b="82 31 BF 35"/>
+ <a u="3C0B" b="82 31 BF 36"/>
+ <a u="3C0C" b="82 31 BF 37"/>
+ <a u="3C0D" b="82 31 BF 38"/>
+ <a u="3C0E" b="82 31 BF 39"/>
+ <a u="3C0F" b="82 31 C0 30"/>
+ <a u="3C10" b="82 31 C0 31"/>
+ <a u="3C11" b="82 31 C0 32"/>
+ <a u="3C12" b="82 31 C0 33"/>
+ <a u="3C13" b="82 31 C0 34"/>
+ <a u="3C14" b="82 31 C0 35"/>
+ <a u="3C15" b="82 31 C0 36"/>
+ <a u="3C16" b="82 31 C0 37"/>
+ <a u="3C17" b="82 31 C0 38"/>
+ <a u="3C18" b="82 31 C0 39"/>
+ <a u="3C19" b="82 31 C1 30"/>
+ <a u="3C1A" b="82 31 C1 31"/>
+ <a u="3C1B" b="82 31 C1 32"/>
+ <a u="3C1C" b="82 31 C1 33"/>
+ <a u="3C1D" b="82 31 C1 34"/>
+ <a u="3C1E" b="82 31 C1 35"/>
+ <a u="3C1F" b="82 31 C1 36"/>
+ <a u="3C20" b="82 31 C1 37"/>
+ <a u="3C21" b="82 31 C1 38"/>
+ <a u="3C22" b="82 31 C1 39"/>
+ <a u="3C23" b="82 31 C2 30"/>
+ <a u="3C24" b="82 31 C2 31"/>
+ <a u="3C25" b="82 31 C2 32"/>
+ <a u="3C26" b="82 31 C2 33"/>
+ <a u="3C27" b="82 31 C2 34"/>
+ <a u="3C28" b="82 31 C2 35"/>
+ <a u="3C29" b="82 31 C2 36"/>
+ <a u="3C2A" b="82 31 C2 37"/>
+ <a u="3C2B" b="82 31 C2 38"/>
+ <a u="3C2C" b="82 31 C2 39"/>
+ <a u="3C2D" b="82 31 C3 30"/>
+ <a u="3C2E" b="82 31 C3 31"/>
+ <a u="3C2F" b="82 31 C3 32"/>
+ <a u="3C30" b="82 31 C3 33"/>
+ <a u="3C31" b="82 31 C3 34"/>
+ <a u="3C32" b="82 31 C3 35"/>
+ <a u="3C33" b="82 31 C3 36"/>
+ <a u="3C34" b="82 31 C3 37"/>
+ <a u="3C35" b="82 31 C3 38"/>
+ <a u="3C36" b="82 31 C3 39"/>
+ <a u="3C37" b="82 31 C4 30"/>
+ <a u="3C38" b="82 31 C4 31"/>
+ <a u="3C39" b="82 31 C4 32"/>
+ <a u="3C3A" b="82 31 C4 33"/>
+ <a u="3C3B" b="82 31 C4 34"/>
+ <a u="3C3C" b="82 31 C4 35"/>
+ <a u="3C3D" b="82 31 C4 36"/>
+ <a u="3C3E" b="82 31 C4 37"/>
+ <a u="3C3F" b="82 31 C4 38"/>
+ <a u="3C40" b="82 31 C4 39"/>
+ <a u="3C41" b="82 31 C5 30"/>
+ <a u="3C42" b="82 31 C5 31"/>
+ <a u="3C43" b="82 31 C5 32"/>
+ <a u="3C44" b="82 31 C5 33"/>
+ <a u="3C45" b="82 31 C5 34"/>
+ <a u="3C46" b="82 31 C5 35"/>
+ <a u="3C47" b="82 31 C5 36"/>
+ <a u="3C48" b="82 31 C5 37"/>
+ <a u="3C49" b="82 31 C5 38"/>
+ <a u="3C4A" b="82 31 C5 39"/>
+ <a u="3C4B" b="82 31 C6 30"/>
+ <a u="3C4C" b="82 31 C6 31"/>
+ <a u="3C4D" b="82 31 C6 32"/>
+ <a u="3C4E" b="82 31 C6 33"/>
+ <a u="3C4F" b="82 31 C6 34"/>
+ <a u="3C50" b="82 31 C6 35"/>
+ <a u="3C51" b="82 31 C6 36"/>
+ <a u="3C52" b="82 31 C6 37"/>
+ <a u="3C53" b="82 31 C6 38"/>
+ <a u="3C54" b="82 31 C6 39"/>
+ <a u="3C55" b="82 31 C7 30"/>
+ <a u="3C56" b="82 31 C7 31"/>
+ <a u="3C57" b="82 31 C7 32"/>
+ <a u="3C58" b="82 31 C7 33"/>
+ <a u="3C59" b="82 31 C7 34"/>
+ <a u="3C5A" b="82 31 C7 35"/>
+ <a u="3C5B" b="82 31 C7 36"/>
+ <a u="3C5C" b="82 31 C7 37"/>
+ <a u="3C5D" b="82 31 C7 38"/>
+ <a u="3C5E" b="82 31 C7 39"/>
+ <a u="3C5F" b="82 31 C8 30"/>
+ <a u="3C60" b="82 31 C8 31"/>
+ <a u="3C61" b="82 31 C8 32"/>
+ <a u="3C62" b="82 31 C8 33"/>
+ <a u="3C63" b="82 31 C8 34"/>
+ <a u="3C64" b="82 31 C8 35"/>
+ <a u="3C65" b="82 31 C8 36"/>
+ <a u="3C66" b="82 31 C8 37"/>
+ <a u="3C67" b="82 31 C8 38"/>
+ <a u="3C68" b="82 31 C8 39"/>
+ <a u="3C69" b="82 31 C9 30"/>
+ <a u="3C6A" b="82 31 C9 31"/>
+ <a u="3C6B" b="82 31 C9 32"/>
+ <a u="3C6C" b="82 31 C9 33"/>
+ <a u="3C6D" b="82 31 C9 34"/>
+ <a u="3C6E" b="FE 69"/>
+ <a u="3C6F" b="82 31 C9 35"/>
+ <a u="3C70" b="82 31 C9 36"/>
+ <a u="3C71" b="82 31 C9 37"/>
+ <a u="3C72" b="82 31 C9 38"/>
+ <a u="3C73" b="82 31 C9 39"/>
+ <a u="3C74" b="82 31 CA 30"/>
+ <a u="3C75" b="82 31 CA 31"/>
+ <a u="3C76" b="82 31 CA 32"/>
+ <a u="3C77" b="82 31 CA 33"/>
+ <a u="3C78" b="82 31 CA 34"/>
+ <a u="3C79" b="82 31 CA 35"/>
+ <a u="3C7A" b="82 31 CA 36"/>
+ <a u="3C7B" b="82 31 CA 37"/>
+ <a u="3C7C" b="82 31 CA 38"/>
+ <a u="3C7D" b="82 31 CA 39"/>
+ <a u="3C7E" b="82 31 CB 30"/>
+ <a u="3C7F" b="82 31 CB 31"/>
+ <a u="3C80" b="82 31 CB 32"/>
+ <a u="3C81" b="82 31 CB 33"/>
+ <a u="3C82" b="82 31 CB 34"/>
+ <a u="3C83" b="82 31 CB 35"/>
+ <a u="3C84" b="82 31 CB 36"/>
+ <a u="3C85" b="82 31 CB 37"/>
+ <a u="3C86" b="82 31 CB 38"/>
+ <a u="3C87" b="82 31 CB 39"/>
+ <a u="3C88" b="82 31 CC 30"/>
+ <a u="3C89" b="82 31 CC 31"/>
+ <a u="3C8A" b="82 31 CC 32"/>
+ <a u="3C8B" b="82 31 CC 33"/>
+ <a u="3C8C" b="82 31 CC 34"/>
+ <a u="3C8D" b="82 31 CC 35"/>
+ <a u="3C8E" b="82 31 CC 36"/>
+ <a u="3C8F" b="82 31 CC 37"/>
+ <a u="3C90" b="82 31 CC 38"/>
+ <a u="3C91" b="82 31 CC 39"/>
+ <a u="3C92" b="82 31 CD 30"/>
+ <a u="3C93" b="82 31 CD 31"/>
+ <a u="3C94" b="82 31 CD 32"/>
+ <a u="3C95" b="82 31 CD 33"/>
+ <a u="3C96" b="82 31 CD 34"/>
+ <a u="3C97" b="82 31 CD 35"/>
+ <a u="3C98" b="82 31 CD 36"/>
+ <a u="3C99" b="82 31 CD 37"/>
+ <a u="3C9A" b="82 31 CD 38"/>
+ <a u="3C9B" b="82 31 CD 39"/>
+ <a u="3C9C" b="82 31 CE 30"/>
+ <a u="3C9D" b="82 31 CE 31"/>
+ <a u="3C9E" b="82 31 CE 32"/>
+ <a u="3C9F" b="82 31 CE 33"/>
+ <a u="3CA0" b="82 31 CE 34"/>
+ <a u="3CA1" b="82 31 CE 35"/>
+ <a u="3CA2" b="82 31 CE 36"/>
+ <a u="3CA3" b="82 31 CE 37"/>
+ <a u="3CA4" b="82 31 CE 38"/>
+ <a u="3CA5" b="82 31 CE 39"/>
+ <a u="3CA6" b="82 31 CF 30"/>
+ <a u="3CA7" b="82 31 CF 31"/>
+ <a u="3CA8" b="82 31 CF 32"/>
+ <a u="3CA9" b="82 31 CF 33"/>
+ <a u="3CAA" b="82 31 CF 34"/>
+ <a u="3CAB" b="82 31 CF 35"/>
+ <a u="3CAC" b="82 31 CF 36"/>
+ <a u="3CAD" b="82 31 CF 37"/>
+ <a u="3CAE" b="82 31 CF 38"/>
+ <a u="3CAF" b="82 31 CF 39"/>
+ <a u="3CB0" b="82 31 D0 30"/>
+ <a u="3CB1" b="82 31 D0 31"/>
+ <a u="3CB2" b="82 31 D0 32"/>
+ <a u="3CB3" b="82 31 D0 33"/>
+ <a u="3CB4" b="82 31 D0 34"/>
+ <a u="3CB5" b="82 31 D0 35"/>
+ <a u="3CB6" b="82 31 D0 36"/>
+ <a u="3CB7" b="82 31 D0 37"/>
+ <a u="3CB8" b="82 31 D0 38"/>
+ <a u="3CB9" b="82 31 D0 39"/>
+ <a u="3CBA" b="82 31 D1 30"/>
+ <a u="3CBB" b="82 31 D1 31"/>
+ <a u="3CBC" b="82 31 D1 32"/>
+ <a u="3CBD" b="82 31 D1 33"/>
+ <a u="3CBE" b="82 31 D1 34"/>
+ <a u="3CBF" b="82 31 D1 35"/>
+ <a u="3CC0" b="82 31 D1 36"/>
+ <a u="3CC1" b="82 31 D1 37"/>
+ <a u="3CC2" b="82 31 D1 38"/>
+ <a u="3CC3" b="82 31 D1 39"/>
+ <a u="3CC4" b="82 31 D2 30"/>
+ <a u="3CC5" b="82 31 D2 31"/>
+ <a u="3CC6" b="82 31 D2 32"/>
+ <a u="3CC7" b="82 31 D2 33"/>
+ <a u="3CC8" b="82 31 D2 34"/>
+ <a u="3CC9" b="82 31 D2 35"/>
+ <a u="3CCA" b="82 31 D2 36"/>
+ <a u="3CCB" b="82 31 D2 37"/>
+ <a u="3CCC" b="82 31 D2 38"/>
+ <a u="3CCD" b="82 31 D2 39"/>
+ <a u="3CCE" b="82 31 D3 30"/>
+ <a u="3CCF" b="82 31 D3 31"/>
+ <a u="3CD0" b="82 31 D3 32"/>
+ <a u="3CD1" b="82 31 D3 33"/>
+ <a u="3CD2" b="82 31 D3 34"/>
+ <a u="3CD3" b="82 31 D3 35"/>
+ <a u="3CD4" b="82 31 D3 36"/>
+ <a u="3CD5" b="82 31 D3 37"/>
+ <a u="3CD6" b="82 31 D3 38"/>
+ <a u="3CD7" b="82 31 D3 39"/>
+ <a u="3CD8" b="82 31 D4 30"/>
+ <a u="3CD9" b="82 31 D4 31"/>
+ <a u="3CDA" b="82 31 D4 32"/>
+ <a u="3CDB" b="82 31 D4 33"/>
+ <a u="3CDC" b="82 31 D4 34"/>
+ <a u="3CDD" b="82 31 D4 35"/>
+ <a u="3CDE" b="82 31 D4 36"/>
+ <a u="3CDF" b="82 31 D4 37"/>
+ <a u="3CE0" b="FE 6A"/>
+ <a u="4056" b="FE 6F"/>
+ <a u="4057" b="82 32 AF 33"/>
+ <a u="4058" b="82 32 AF 34"/>
+ <a u="4059" b="82 32 AF 35"/>
+ <a u="405A" b="82 32 AF 36"/>
+ <a u="405B" b="82 32 AF 37"/>
+ <a u="405C" b="82 32 AF 38"/>
+ <a u="405D" b="82 32 AF 39"/>
+ <a u="405E" b="82 32 B0 30"/>
+ <a u="405F" b="82 32 B0 31"/>
+ <a u="4060" b="82 32 B0 32"/>
+ <a u="4061" b="82 32 B0 33"/>
+ <a u="4062" b="82 32 B0 34"/>
+ <a u="4063" b="82 32 B0 35"/>
+ <a u="4064" b="82 32 B0 36"/>
+ <a u="4065" b="82 32 B0 37"/>
+ <a u="4066" b="82 32 B0 38"/>
+ <a u="4067" b="82 32 B0 39"/>
+ <a u="4068" b="82 32 B1 30"/>
+ <a u="4069" b="82 32 B1 31"/>
+ <a u="406A" b="82 32 B1 32"/>
+ <a u="406B" b="82 32 B1 33"/>
+ <a u="406C" b="82 32 B1 34"/>
+ <a u="406D" b="82 32 B1 35"/>
+ <a u="406E" b="82 32 B1 36"/>
+ <a u="406F" b="82 32 B1 37"/>
+ <a u="4070" b="82 32 B1 38"/>
+ <a u="4071" b="82 32 B1 39"/>
+ <a u="4072" b="82 32 B2 30"/>
+ <a u="4073" b="82 32 B2 31"/>
+ <a u="4074" b="82 32 B2 32"/>
+ <a u="4075" b="82 32 B2 33"/>
+ <a u="4076" b="82 32 B2 34"/>
+ <a u="4077" b="82 32 B2 35"/>
+ <a u="4078" b="82 32 B2 36"/>
+ <a u="4079" b="82 32 B2 37"/>
+ <a u="407A" b="82 32 B2 38"/>
+ <a u="407B" b="82 32 B2 39"/>
+ <a u="407C" b="82 32 B3 30"/>
+ <a u="407D" b="82 32 B3 31"/>
+ <a u="407E" b="82 32 B3 32"/>
+ <a u="407F" b="82 32 B3 33"/>
+ <a u="4080" b="82 32 B3 34"/>
+ <a u="4081" b="82 32 B3 35"/>
+ <a u="4082" b="82 32 B3 36"/>
+ <a u="4083" b="82 32 B3 37"/>
+ <a u="4084" b="82 32 B3 38"/>
+ <a u="4085" b="82 32 B3 39"/>
+ <a u="4086" b="82 32 B4 30"/>
+ <a u="4087" b="82 32 B4 31"/>
+ <a u="4088" b="82 32 B4 32"/>
+ <a u="4089" b="82 32 B4 33"/>
+ <a u="408A" b="82 32 B4 34"/>
+ <a u="408B" b="82 32 B4 35"/>
+ <a u="408C" b="82 32 B4 36"/>
+ <a u="408D" b="82 32 B4 37"/>
+ <a u="408E" b="82 32 B4 38"/>
+ <a u="408F" b="82 32 B4 39"/>
+ <a u="4090" b="82 32 B5 30"/>
+ <a u="4091" b="82 32 B5 31"/>
+ <a u="4092" b="82 32 B5 32"/>
+ <a u="4093" b="82 32 B5 33"/>
+ <a u="4094" b="82 32 B5 34"/>
+ <a u="4095" b="82 32 B5 35"/>
+ <a u="4096" b="82 32 B5 36"/>
+ <a u="4097" b="82 32 B5 37"/>
+ <a u="4098" b="82 32 B5 38"/>
+ <a u="4099" b="82 32 B5 39"/>
+ <a u="409A" b="82 32 B6 30"/>
+ <a u="409B" b="82 32 B6 31"/>
+ <a u="409C" b="82 32 B6 32"/>
+ <a u="409D" b="82 32 B6 33"/>
+ <a u="409E" b="82 32 B6 34"/>
+ <a u="409F" b="82 32 B6 35"/>
+ <a u="40A0" b="82 32 B6 36"/>
+ <a u="40A1" b="82 32 B6 37"/>
+ <a u="40A2" b="82 32 B6 38"/>
+ <a u="40A3" b="82 32 B6 39"/>
+ <a u="40A4" b="82 32 B7 30"/>
+ <a u="40A5" b="82 32 B7 31"/>
+ <a u="40A6" b="82 32 B7 32"/>
+ <a u="40A7" b="82 32 B7 33"/>
+ <a u="40A8" b="82 32 B7 34"/>
+ <a u="40A9" b="82 32 B7 35"/>
+ <a u="40AA" b="82 32 B7 36"/>
+ <a u="40AB" b="82 32 B7 37"/>
+ <a u="40AC" b="82 32 B7 38"/>
+ <a u="40AD" b="82 32 B7 39"/>
+ <a u="40AE" b="82 32 B8 30"/>
+ <a u="40AF" b="82 32 B8 31"/>
+ <a u="40B0" b="82 32 B8 32"/>
+ <a u="40B1" b="82 32 B8 33"/>
+ <a u="40B2" b="82 32 B8 34"/>
+ <a u="40B3" b="82 32 B8 35"/>
+ <a u="40B4" b="82 32 B8 36"/>
+ <a u="40B5" b="82 32 B8 37"/>
+ <a u="40B6" b="82 32 B8 38"/>
+ <a u="40B7" b="82 32 B8 39"/>
+ <a u="40B8" b="82 32 B9 30"/>
+ <a u="40B9" b="82 32 B9 31"/>
+ <a u="40BA" b="82 32 B9 32"/>
+ <a u="40BB" b="82 32 B9 33"/>
+ <a u="40BC" b="82 32 B9 34"/>
+ <a u="40BD" b="82 32 B9 35"/>
+ <a u="40BE" b="82 32 B9 36"/>
+ <a u="40BF" b="82 32 B9 37"/>
+ <a u="40C0" b="82 32 B9 38"/>
+ <a u="40C1" b="82 32 B9 39"/>
+ <a u="40C2" b="82 32 BA 30"/>
+ <a u="40C3" b="82 32 BA 31"/>
+ <a u="40C4" b="82 32 BA 32"/>
+ <a u="40C5" b="82 32 BA 33"/>
+ <a u="40C6" b="82 32 BA 34"/>
+ <a u="40C7" b="82 32 BA 35"/>
+ <a u="40C8" b="82 32 BA 36"/>
+ <a u="40C9" b="82 32 BA 37"/>
+ <a u="40CA" b="82 32 BA 38"/>
+ <a u="40CB" b="82 32 BA 39"/>
+ <a u="40CC" b="82 32 BB 30"/>
+ <a u="40CD" b="82 32 BB 31"/>
+ <a u="40CE" b="82 32 BB 32"/>
+ <a u="40CF" b="82 32 BB 33"/>
+ <a u="40D0" b="82 32 BB 34"/>
+ <a u="40D1" b="82 32 BB 35"/>
+ <a u="40D2" b="82 32 BB 36"/>
+ <a u="40D3" b="82 32 BB 37"/>
+ <a u="40D4" b="82 32 BB 38"/>
+ <a u="40D5" b="82 32 BB 39"/>
+ <a u="40D6" b="82 32 BC 30"/>
+ <a u="40D7" b="82 32 BC 31"/>
+ <a u="40D8" b="82 32 BC 32"/>
+ <a u="40D9" b="82 32 BC 33"/>
+ <a u="40DA" b="82 32 BC 34"/>
+ <a u="40DB" b="82 32 BC 35"/>
+ <a u="40DC" b="82 32 BC 36"/>
+ <a u="40DD" b="82 32 BC 37"/>
+ <a u="40DE" b="82 32 BC 38"/>
+ <a u="40DF" b="82 32 BC 39"/>
+ <a u="40E0" b="82 32 BD 30"/>
+ <a u="40E1" b="82 32 BD 31"/>
+ <a u="40E2" b="82 32 BD 32"/>
+ <a u="40E3" b="82 32 BD 33"/>
+ <a u="40E4" b="82 32 BD 34"/>
+ <a u="40E5" b="82 32 BD 35"/>
+ <a u="40E6" b="82 32 BD 36"/>
+ <a u="40E7" b="82 32 BD 37"/>
+ <a u="40E8" b="82 32 BD 38"/>
+ <a u="40E9" b="82 32 BD 39"/>
+ <a u="40EA" b="82 32 BE 30"/>
+ <a u="40EB" b="82 32 BE 31"/>
+ <a u="40EC" b="82 32 BE 32"/>
+ <a u="40ED" b="82 32 BE 33"/>
+ <a u="40EE" b="82 32 BE 34"/>
+ <a u="40EF" b="82 32 BE 35"/>
+ <a u="40F0" b="82 32 BE 36"/>
+ <a u="40F1" b="82 32 BE 37"/>
+ <a u="40F2" b="82 32 BE 38"/>
+ <a u="40F3" b="82 32 BE 39"/>
+ <a u="40F4" b="82 32 BF 30"/>
+ <a u="40F5" b="82 32 BF 31"/>
+ <a u="40F6" b="82 32 BF 32"/>
+ <a u="40F7" b="82 32 BF 33"/>
+ <a u="40F8" b="82 32 BF 34"/>
+ <a u="40F9" b="82 32 BF 35"/>
+ <a u="40FA" b="82 32 BF 36"/>
+ <a u="40FB" b="82 32 BF 37"/>
+ <a u="40FC" b="82 32 BF 38"/>
+ <a u="40FD" b="82 32 BF 39"/>
+ <a u="40FE" b="82 32 C0 30"/>
+ <a u="40FF" b="82 32 C0 31"/>
+ <a u="4100" b="82 32 C0 32"/>
+ <a u="4101" b="82 32 C0 33"/>
+ <a u="4102" b="82 32 C0 34"/>
+ <a u="4103" b="82 32 C0 35"/>
+ <a u="4104" b="82 32 C0 36"/>
+ <a u="4105" b="82 32 C0 37"/>
+ <a u="4106" b="82 32 C0 38"/>
+ <a u="4107" b="82 32 C0 39"/>
+ <a u="4108" b="82 32 C1 30"/>
+ <a u="4109" b="82 32 C1 31"/>
+ <a u="410A" b="82 32 C1 32"/>
+ <a u="410B" b="82 32 C1 33"/>
+ <a u="410C" b="82 32 C1 34"/>
+ <a u="410D" b="82 32 C1 35"/>
+ <a u="410E" b="82 32 C1 36"/>
+ <a u="410F" b="82 32 C1 37"/>
+ <a u="4110" b="82 32 C1 38"/>
+ <a u="4111" b="82 32 C1 39"/>
+ <a u="4112" b="82 32 C2 30"/>
+ <a u="4113" b="82 32 C2 31"/>
+ <a u="4114" b="82 32 C2 32"/>
+ <a u="4115" b="82 32 C2 33"/>
+ <a u="4116" b="82 32 C2 34"/>
+ <a u="4117" b="82 32 C2 35"/>
+ <a u="4118" b="82 32 C2 36"/>
+ <a u="4119" b="82 32 C2 37"/>
+ <a u="411A" b="82 32 C2 38"/>
+ <a u="411B" b="82 32 C2 39"/>
+ <a u="411C" b="82 32 C3 30"/>
+ <a u="411D" b="82 32 C3 31"/>
+ <a u="411E" b="82 32 C3 32"/>
+ <a u="411F" b="82 32 C3 33"/>
+ <a u="4120" b="82 32 C3 34"/>
+ <a u="4121" b="82 32 C3 35"/>
+ <a u="4122" b="82 32 C3 36"/>
+ <a u="4123" b="82 32 C3 37"/>
+ <a u="4124" b="82 32 C3 38"/>
+ <a u="4125" b="82 32 C3 39"/>
+ <a u="4126" b="82 32 C4 30"/>
+ <a u="4127" b="82 32 C4 31"/>
+ <a u="4128" b="82 32 C4 32"/>
+ <a u="4129" b="82 32 C4 33"/>
+ <a u="412A" b="82 32 C4 34"/>
+ <a u="412B" b="82 32 C4 35"/>
+ <a u="412C" b="82 32 C4 36"/>
+ <a u="412D" b="82 32 C4 37"/>
+ <a u="412E" b="82 32 C4 38"/>
+ <a u="412F" b="82 32 C4 39"/>
+ <a u="4130" b="82 32 C5 30"/>
+ <a u="4131" b="82 32 C5 31"/>
+ <a u="4132" b="82 32 C5 32"/>
+ <a u="4133" b="82 32 C5 33"/>
+ <a u="4134" b="82 32 C5 34"/>
+ <a u="4135" b="82 32 C5 35"/>
+ <a u="4136" b="82 32 C5 36"/>
+ <a u="4137" b="82 32 C5 37"/>
+ <a u="4138" b="82 32 C5 38"/>
+ <a u="4139" b="82 32 C5 39"/>
+ <a u="413A" b="82 32 C6 30"/>
+ <a u="413B" b="82 32 C6 31"/>
+ <a u="413C" b="82 32 C6 32"/>
+ <a u="413D" b="82 32 C6 33"/>
+ <a u="413E" b="82 32 C6 34"/>
+ <a u="413F" b="82 32 C6 35"/>
+ <a u="4140" b="82 32 C6 36"/>
+ <a u="4141" b="82 32 C6 37"/>
+ <a u="4142" b="82 32 C6 38"/>
+ <a u="4143" b="82 32 C6 39"/>
+ <a u="4144" b="82 32 C7 30"/>
+ <a u="4145" b="82 32 C7 31"/>
+ <a u="4146" b="82 32 C7 32"/>
+ <a u="4147" b="82 32 C7 33"/>
+ <a u="4148" b="82 32 C7 34"/>
+ <a u="4149" b="82 32 C7 35"/>
+ <a u="414A" b="82 32 C7 36"/>
+ <a u="414B" b="82 32 C7 37"/>
+ <a u="414C" b="82 32 C7 38"/>
+ <a u="414D" b="82 32 C7 39"/>
+ <a u="414E" b="82 32 C8 30"/>
+ <a u="414F" b="82 32 C8 31"/>
+ <a u="4150" b="82 32 C8 32"/>
+ <a u="4151" b="82 32 C8 33"/>
+ <a u="4152" b="82 32 C8 34"/>
+ <a u="4153" b="82 32 C8 35"/>
+ <a u="4154" b="82 32 C8 36"/>
+ <a u="4155" b="82 32 C8 37"/>
+ <a u="4156" b="82 32 C8 38"/>
+ <a u="4157" b="82 32 C8 39"/>
+ <a u="4158" b="82 32 C9 30"/>
+ <a u="4159" b="82 32 C9 31"/>
+ <a u="415A" b="82 32 C9 32"/>
+ <a u="415B" b="82 32 C9 33"/>
+ <a u="415C" b="82 32 C9 34"/>
+ <a u="415D" b="82 32 C9 35"/>
+ <a u="415E" b="82 32 C9 36"/>
+ <a u="415F" b="FE 70"/>
+ <a u="4337" b="FE 72"/>
+ <a u="4338" b="82 32 F8 38"/>
+ <a u="4339" b="82 32 F8 39"/>
+ <a u="433A" b="82 32 F9 30"/>
+ <a u="433B" b="82 32 F9 31"/>
+ <a u="433C" b="82 32 F9 32"/>
+ <a u="433D" b="82 32 F9 33"/>
+ <a u="433E" b="82 32 F9 34"/>
+ <a u="433F" b="82 32 F9 35"/>
+ <a u="4340" b="82 32 F9 36"/>
+ <a u="4341" b="82 32 F9 37"/>
+ <a u="4342" b="82 32 F9 38"/>
+ <a u="4343" b="82 32 F9 39"/>
+ <a u="4344" b="82 32 FA 30"/>
+ <a u="4345" b="82 32 FA 31"/>
+ <a u="4346" b="82 32 FA 32"/>
+ <a u="4347" b="82 32 FA 33"/>
+ <a u="4348" b="82 32 FA 34"/>
+ <a u="4349" b="82 32 FA 35"/>
+ <a u="434A" b="82 32 FA 36"/>
+ <a u="434B" b="82 32 FA 37"/>
+ <a u="434C" b="82 32 FA 38"/>
+ <a u="434D" b="82 32 FA 39"/>
+ <a u="434E" b="82 32 FB 30"/>
+ <a u="434F" b="82 32 FB 31"/>
+ <a u="4350" b="82 32 FB 32"/>
+ <a u="4351" b="82 32 FB 33"/>
+ <a u="4352" b="82 32 FB 34"/>
+ <a u="4353" b="82 32 FB 35"/>
+ <a u="4354" b="82 32 FB 36"/>
+ <a u="4355" b="82 32 FB 37"/>
+ <a u="4356" b="82 32 FB 38"/>
+ <a u="4357" b="82 32 FB 39"/>
+ <a u="4358" b="82 32 FC 30"/>
+ <a u="4359" b="82 32 FC 31"/>
+ <a u="435A" b="82 32 FC 32"/>
+ <a u="435B" b="82 32 FC 33"/>
+ <a u="435C" b="82 32 FC 34"/>
+ <a u="435D" b="82 32 FC 35"/>
+ <a u="435E" b="82 32 FC 36"/>
+ <a u="435F" b="82 32 FC 37"/>
+ <a u="4360" b="82 32 FC 38"/>
+ <a u="4361" b="82 32 FC 39"/>
+ <a u="4362" b="82 32 FD 30"/>
+ <a u="4363" b="82 32 FD 31"/>
+ <a u="4364" b="82 32 FD 32"/>
+ <a u="4365" b="82 32 FD 33"/>
+ <a u="4366" b="82 32 FD 34"/>
+ <a u="4367" b="82 32 FD 35"/>
+ <a u="4368" b="82 32 FD 36"/>
+ <a u="4369" b="82 32 FD 37"/>
+ <a u="436A" b="82 32 FD 38"/>
+ <a u="436B" b="82 32 FD 39"/>
+ <a u="436C" b="82 32 FE 30"/>
+ <a u="436D" b="82 32 FE 31"/>
+ <a u="436E" b="82 32 FE 32"/>
+ <a u="436F" b="82 32 FE 33"/>
+ <a u="4370" b="82 32 FE 34"/>
+ <a u="4371" b="82 32 FE 35"/>
+ <a u="4372" b="82 32 FE 36"/>
+ <a u="4373" b="82 32 FE 37"/>
+ <a u="4374" b="82 32 FE 38"/>
+ <a u="4375" b="82 32 FE 39"/>
+ <a u="4376" b="82 33 81 30"/>
+ <a u="4377" b="82 33 81 31"/>
+ <a u="4378" b="82 33 81 32"/>
+ <a u="4379" b="82 33 81 33"/>
+ <a u="437A" b="82 33 81 34"/>
+ <a u="437B" b="82 33 81 35"/>
+ <a u="437C" b="82 33 81 36"/>
+ <a u="437D" b="82 33 81 37"/>
+ <a u="437E" b="82 33 81 38"/>
+ <a u="437F" b="82 33 81 39"/>
+ <a u="4380" b="82 33 82 30"/>
+ <a u="4381" b="82 33 82 31"/>
+ <a u="4382" b="82 33 82 32"/>
+ <a u="4383" b="82 33 82 33"/>
+ <a u="4384" b="82 33 82 34"/>
+ <a u="4385" b="82 33 82 35"/>
+ <a u="4386" b="82 33 82 36"/>
+ <a u="4387" b="82 33 82 37"/>
+ <a u="4388" b="82 33 82 38"/>
+ <a u="4389" b="82 33 82 39"/>
+ <a u="438A" b="82 33 83 30"/>
+ <a u="438B" b="82 33 83 31"/>
+ <a u="438C" b="82 33 83 32"/>
+ <a u="438D" b="82 33 83 33"/>
+ <a u="438E" b="82 33 83 34"/>
+ <a u="438F" b="82 33 83 35"/>
+ <a u="4390" b="82 33 83 36"/>
+ <a u="4391" b="82 33 83 37"/>
+ <a u="4392" b="82 33 83 38"/>
+ <a u="4393" b="82 33 83 39"/>
+ <a u="4394" b="82 33 84 30"/>
+ <a u="4395" b="82 33 84 31"/>
+ <a u="4396" b="82 33 84 32"/>
+ <a u="4397" b="82 33 84 33"/>
+ <a u="4398" b="82 33 84 34"/>
+ <a u="4399" b="82 33 84 35"/>
+ <a u="439A" b="82 33 84 36"/>
+ <a u="439B" b="82 33 84 37"/>
+ <a u="439C" b="82 33 84 38"/>
+ <a u="439D" b="82 33 84 39"/>
+ <a u="439E" b="82 33 85 30"/>
+ <a u="439F" b="82 33 85 31"/>
+ <a u="43A0" b="82 33 85 32"/>
+ <a u="43A1" b="82 33 85 33"/>
+ <a u="43A2" b="82 33 85 34"/>
+ <a u="43A3" b="82 33 85 35"/>
+ <a u="43A4" b="82 33 85 36"/>
+ <a u="43A5" b="82 33 85 37"/>
+ <a u="43A6" b="82 33 85 38"/>
+ <a u="43A7" b="82 33 85 39"/>
+ <a u="43A8" b="82 33 86 30"/>
+ <a u="43A9" b="82 33 86 31"/>
+ <a u="43AA" b="82 33 86 32"/>
+ <a u="43AB" b="82 33 86 33"/>
+ <a u="43AC" b="FE 78"/>
+ <a u="43AD" b="82 33 86 34"/>
+ <a u="43AE" b="82 33 86 35"/>
+ <a u="43AF" b="82 33 86 36"/>
+ <a u="43B0" b="82 33 86 37"/>
+ <a u="43B1" b="FE 77"/>
+ <a u="43B2" b="82 33 86 38"/>
+ <a u="43B3" b="82 33 86 39"/>
+ <a u="43B4" b="82 33 87 30"/>
+ <a u="43B5" b="82 33 87 31"/>
+ <a u="43B6" b="82 33 87 32"/>
+ <a u="43B7" b="82 33 87 33"/>
+ <a u="43B8" b="82 33 87 34"/>
+ <a u="43B9" b="82 33 87 35"/>
+ <a u="43BA" b="82 33 87 36"/>
+ <a u="43BB" b="82 33 87 37"/>
+ <a u="43BC" b="82 33 87 38"/>
+ <a u="43BD" b="82 33 87 39"/>
+ <a u="43BE" b="82 33 88 30"/>
+ <a u="43BF" b="82 33 88 31"/>
+ <a u="43C0" b="82 33 88 32"/>
+ <a u="43C1" b="82 33 88 33"/>
+ <a u="43C2" b="82 33 88 34"/>
+ <a u="43C3" b="82 33 88 35"/>
+ <a u="43C4" b="82 33 88 36"/>
+ <a u="43C5" b="82 33 88 37"/>
+ <a u="43C6" b="82 33 88 38"/>
+ <a u="43C7" b="82 33 88 39"/>
+ <a u="43C8" b="82 33 89 30"/>
+ <a u="43C9" b="82 33 89 31"/>
+ <a u="43CA" b="82 33 89 32"/>
+ <a u="43CB" b="82 33 89 33"/>
+ <a u="43CC" b="82 33 89 34"/>
+ <a u="43CD" b="82 33 89 35"/>
+ <a u="43CE" b="82 33 89 36"/>
+ <a u="43CF" b="82 33 89 37"/>
+ <a u="43D0" b="82 33 89 38"/>
+ <a u="43D1" b="82 33 89 39"/>
+ <a u="43D2" b="82 33 8A 30"/>
+ <a u="43D3" b="82 33 8A 31"/>
+ <a u="43D4" b="82 33 8A 32"/>
+ <a u="43D5" b="82 33 8A 33"/>
+ <a u="43D6" b="82 33 8A 34"/>
+ <a u="43D7" b="82 33 8A 35"/>
+ <a u="43D8" b="82 33 8A 36"/>
+ <a u="43D9" b="82 33 8A 37"/>
+ <a u="43DA" b="82 33 8A 38"/>
+ <a u="43DB" b="82 33 8A 39"/>
+ <a u="43DC" b="82 33 8B 30"/>
+ <a u="43DD" b="FE 7A"/>
+ <a u="43DE" b="82 33 8B 31"/>
+ <a u="43DF" b="82 33 8B 32"/>
+ <a u="43E0" b="82 33 8B 33"/>
+ <a u="43E1" b="82 33 8B 34"/>
+ <a u="43E2" b="82 33 8B 35"/>
+ <a u="43E3" b="82 33 8B 36"/>
+ <a u="43E4" b="82 33 8B 37"/>
+ <a u="43E5" b="82 33 8B 38"/>
+ <a u="43E6" b="82 33 8B 39"/>
+ <a u="43E7" b="82 33 8C 30"/>
+ <a u="43E8" b="82 33 8C 31"/>
+ <a u="43E9" b="82 33 8C 32"/>
+ <a u="43EA" b="82 33 8C 33"/>
+ <a u="43EB" b="82 33 8C 34"/>
+ <a u="43EC" b="82 33 8C 35"/>
+ <a u="43ED" b="82 33 8C 36"/>
+ <a u="43EE" b="82 33 8C 37"/>
+ <a u="43EF" b="82 33 8C 38"/>
+ <a u="43F0" b="82 33 8C 39"/>
+ <a u="43F1" b="82 33 8D 30"/>
+ <a u="43F2" b="82 33 8D 31"/>
+ <a u="43F3" b="82 33 8D 32"/>
+ <a u="43F4" b="82 33 8D 33"/>
+ <a u="43F5" b="82 33 8D 34"/>
+ <a u="43F6" b="82 33 8D 35"/>
+ <a u="43F7" b="82 33 8D 36"/>
+ <a u="43F8" b="82 33 8D 37"/>
+ <a u="43F9" b="82 33 8D 38"/>
+ <a u="43FA" b="82 33 8D 39"/>
+ <a u="43FB" b="82 33 8E 30"/>
+ <a u="43FC" b="82 33 8E 31"/>
+ <a u="43FD" b="82 33 8E 32"/>
+ <a u="43FE" b="82 33 8E 33"/>
+ <a u="43FF" b="82 33 8E 34"/>
+ <a u="4400" b="82 33 8E 35"/>
+ <a u="4401" b="82 33 8E 36"/>
+ <a u="4402" b="82 33 8E 37"/>
+ <a u="4403" b="82 33 8E 38"/>
+ <a u="4404" b="82 33 8E 39"/>
+ <a u="4405" b="82 33 8F 30"/>
+ <a u="4406" b="82 33 8F 31"/>
+ <a u="4407" b="82 33 8F 32"/>
+ <a u="4408" b="82 33 8F 33"/>
+ <a u="4409" b="82 33 8F 34"/>
+ <a u="440A" b="82 33 8F 35"/>
+ <a u="440B" b="82 33 8F 36"/>
+ <a u="440C" b="82 33 8F 37"/>
+ <a u="440D" b="82 33 8F 38"/>
+ <a u="440E" b="82 33 8F 39"/>
+ <a u="440F" b="82 33 90 30"/>
+ <a u="4410" b="82 33 90 31"/>
+ <a u="4411" b="82 33 90 32"/>
+ <a u="4412" b="82 33 90 33"/>
+ <a u="4413" b="82 33 90 34"/>
+ <a u="4414" b="82 33 90 35"/>
+ <a u="4415" b="82 33 90 36"/>
+ <a u="4416" b="82 33 90 37"/>
+ <a u="4417" b="82 33 90 38"/>
+ <a u="4418" b="82 33 90 39"/>
+ <a u="4419" b="82 33 91 30"/>
+ <a u="441A" b="82 33 91 31"/>
+ <a u="441B" b="82 33 91 32"/>
+ <a u="441C" b="82 33 91 33"/>
+ <a u="441D" b="82 33 91 34"/>
+ <a u="441E" b="82 33 91 35"/>
+ <a u="441F" b="82 33 91 36"/>
+ <a u="4420" b="82 33 91 37"/>
+ <a u="4421" b="82 33 91 38"/>
+ <a u="4422" b="82 33 91 39"/>
+ <a u="4423" b="82 33 92 30"/>
+ <a u="4424" b="82 33 92 31"/>
+ <a u="4425" b="82 33 92 32"/>
+ <a u="4426" b="82 33 92 33"/>
+ <a u="4427" b="82 33 92 34"/>
+ <a u="4428" b="82 33 92 35"/>
+ <a u="4429" b="82 33 92 36"/>
+ <a u="442A" b="82 33 92 37"/>
+ <a u="442B" b="82 33 92 38"/>
+ <a u="442C" b="82 33 92 39"/>
+ <a u="442D" b="82 33 93 30"/>
+ <a u="442E" b="82 33 93 31"/>
+ <a u="442F" b="82 33 93 32"/>
+ <a u="4430" b="82 33 93 33"/>
+ <a u="4431" b="82 33 93 34"/>
+ <a u="4432" b="82 33 93 35"/>
+ <a u="4433" b="82 33 93 36"/>
+ <a u="4434" b="82 33 93 37"/>
+ <a u="4435" b="82 33 93 38"/>
+ <a u="4436" b="82 33 93 39"/>
+ <a u="4437" b="82 33 94 30"/>
+ <a u="4438" b="82 33 94 31"/>
+ <a u="4439" b="82 33 94 32"/>
+ <a u="443A" b="82 33 94 33"/>
+ <a u="443B" b="82 33 94 34"/>
+ <a u="443C" b="82 33 94 35"/>
+ <a u="443D" b="82 33 94 36"/>
+ <a u="443E" b="82 33 94 37"/>
+ <a u="443F" b="82 33 94 38"/>
+ <a u="4440" b="82 33 94 39"/>
+ <a u="4441" b="82 33 95 30"/>
+ <a u="4442" b="82 33 95 31"/>
+ <a u="4443" b="82 33 95 32"/>
+ <a u="4444" b="82 33 95 33"/>
+ <a u="4445" b="82 33 95 34"/>
+ <a u="4446" b="82 33 95 35"/>
+ <a u="4447" b="82 33 95 36"/>
+ <a u="4448" b="82 33 95 37"/>
+ <a u="4449" b="82 33 95 38"/>
+ <a u="444A" b="82 33 95 39"/>
+ <a u="444B" b="82 33 96 30"/>
+ <a u="444C" b="82 33 96 31"/>
+ <a u="444D" b="82 33 96 32"/>
+ <a u="444E" b="82 33 96 33"/>
+ <a u="444F" b="82 33 96 34"/>
+ <a u="4450" b="82 33 96 35"/>
+ <a u="4451" b="82 33 96 36"/>
+ <a u="4452" b="82 33 96 37"/>
+ <a u="4453" b="82 33 96 38"/>
+ <a u="4454" b="82 33 96 39"/>
+ <a u="4455" b="82 33 97 30"/>
+ <a u="4456" b="82 33 97 31"/>
+ <a u="4457" b="82 33 97 32"/>
+ <a u="4458" b="82 33 97 33"/>
+ <a u="4459" b="82 33 97 34"/>
+ <a u="445A" b="82 33 97 35"/>
+ <a u="445B" b="82 33 97 36"/>
+ <a u="445C" b="82 33 97 37"/>
+ <a u="445D" b="82 33 97 38"/>
+ <a u="445E" b="82 33 97 39"/>
+ <a u="445F" b="82 33 98 30"/>
+ <a u="4460" b="82 33 98 31"/>
+ <a u="4461" b="82 33 98 32"/>
+ <a u="4462" b="82 33 98 33"/>
+ <a u="4463" b="82 33 98 34"/>
+ <a u="4464" b="82 33 98 35"/>
+ <a u="4465" b="82 33 98 36"/>
+ <a u="4466" b="82 33 98 37"/>
+ <a u="4467" b="82 33 98 38"/>
+ <a u="4468" b="82 33 98 39"/>
+ <a u="4469" b="82 33 99 30"/>
+ <a u="446A" b="82 33 99 31"/>
+ <a u="446B" b="82 33 99 32"/>
+ <a u="446C" b="82 33 99 33"/>
+ <a u="446D" b="82 33 99 34"/>
+ <a u="446E" b="82 33 99 35"/>
+ <a u="446F" b="82 33 99 36"/>
+ <a u="4470" b="82 33 99 37"/>
+ <a u="4471" b="82 33 99 38"/>
+ <a u="4472" b="82 33 99 39"/>
+ <a u="4473" b="82 33 9A 30"/>
+ <a u="4474" b="82 33 9A 31"/>
+ <a u="4475" b="82 33 9A 32"/>
+ <a u="4476" b="82 33 9A 33"/>
+ <a u="4477" b="82 33 9A 34"/>
+ <a u="4478" b="82 33 9A 35"/>
+ <a u="4479" b="82 33 9A 36"/>
+ <a u="447A" b="82 33 9A 37"/>
+ <a u="447B" b="82 33 9A 38"/>
+ <a u="447C" b="82 33 9A 39"/>
+ <a u="447D" b="82 33 9B 30"/>
+ <a u="447E" b="82 33 9B 31"/>
+ <a u="447F" b="82 33 9B 32"/>
+ <a u="4480" b="82 33 9B 33"/>
+ <a u="4481" b="82 33 9B 34"/>
+ <a u="4482" b="82 33 9B 35"/>
+ <a u="4483" b="82 33 9B 36"/>
+ <a u="4484" b="82 33 9B 37"/>
+ <a u="4485" b="82 33 9B 38"/>
+ <a u="4486" b="82 33 9B 39"/>
+ <a u="4487" b="82 33 9C 30"/>
+ <a u="4488" b="82 33 9C 31"/>
+ <a u="4489" b="82 33 9C 32"/>
+ <a u="448A" b="82 33 9C 33"/>
+ <a u="448B" b="82 33 9C 34"/>
+ <a u="448C" b="82 33 9C 35"/>
+ <a u="448D" b="82 33 9C 36"/>
+ <a u="448E" b="82 33 9C 37"/>
+ <a u="448F" b="82 33 9C 38"/>
+ <a u="4490" b="82 33 9C 39"/>
+ <a u="4491" b="82 33 9D 30"/>
+ <a u="4492" b="82 33 9D 31"/>
+ <a u="4493" b="82 33 9D 32"/>
+ <a u="4494" b="82 33 9D 33"/>
+ <a u="4495" b="82 33 9D 34"/>
+ <a u="4496" b="82 33 9D 35"/>
+ <a u="4497" b="82 33 9D 36"/>
+ <a u="4498" b="82 33 9D 37"/>
+ <a u="4499" b="82 33 9D 38"/>
+ <a u="449A" b="82 33 9D 39"/>
+ <a u="449B" b="82 33 9E 30"/>
+ <a u="449C" b="82 33 9E 31"/>
+ <a u="449D" b="82 33 9E 32"/>
+ <a u="449E" b="82 33 9E 33"/>
+ <a u="449F" b="82 33 9E 34"/>
+ <a u="44A0" b="82 33 9E 35"/>
+ <a u="44A1" b="82 33 9E 36"/>
+ <a u="44A2" b="82 33 9E 37"/>
+ <a u="44A3" b="82 33 9E 38"/>
+ <a u="44A4" b="82 33 9E 39"/>
+ <a u="44A5" b="82 33 9F 30"/>
+ <a u="44A6" b="82 33 9F 31"/>
+ <a u="44A7" b="82 33 9F 32"/>
+ <a u="44A8" b="82 33 9F 33"/>
+ <a u="44A9" b="82 33 9F 34"/>
+ <a u="44AA" b="82 33 9F 35"/>
+ <a u="44AB" b="82 33 9F 36"/>
+ <a u="44AC" b="82 33 9F 37"/>
+ <a u="44AD" b="82 33 9F 38"/>
+ <a u="44AE" b="82 33 9F 39"/>
+ <a u="44AF" b="82 33 A0 30"/>
+ <a u="44B0" b="82 33 A0 31"/>
+ <a u="44B1" b="82 33 A0 32"/>
+ <a u="44B2" b="82 33 A0 33"/>
+ <a u="44B3" b="82 33 A0 34"/>
+ <a u="44B4" b="82 33 A0 35"/>
+ <a u="44B5" b="82 33 A0 36"/>
+ <a u="44B6" b="82 33 A0 37"/>
+ <a u="44B7" b="82 33 A0 38"/>
+ <a u="44B8" b="82 33 A0 39"/>
+ <a u="44B9" b="82 33 A1 30"/>
+ <a u="44BA" b="82 33 A1 31"/>
+ <a u="44BB" b="82 33 A1 32"/>
+ <a u="44BC" b="82 33 A1 33"/>
+ <a u="44BD" b="82 33 A1 34"/>
+ <a u="44BE" b="82 33 A1 35"/>
+ <a u="44BF" b="82 33 A1 36"/>
+ <a u="44C0" b="82 33 A1 37"/>
+ <a u="44C1" b="82 33 A1 38"/>
+ <a u="44C2" b="82 33 A1 39"/>
+ <a u="44C3" b="82 33 A2 30"/>
+ <a u="44C4" b="82 33 A2 31"/>
+ <a u="44C5" b="82 33 A2 32"/>
+ <a u="44C6" b="82 33 A2 33"/>
+ <a u="44C7" b="82 33 A2 34"/>
+ <a u="44C8" b="82 33 A2 35"/>
+ <a u="44C9" b="82 33 A2 36"/>
+ <a u="44CA" b="82 33 A2 37"/>
+ <a u="44CB" b="82 33 A2 38"/>
+ <a u="44CC" b="82 33 A2 39"/>
+ <a u="44CD" b="82 33 A3 30"/>
+ <a u="44CE" b="82 33 A3 31"/>
+ <a u="44CF" b="82 33 A3 32"/>
+ <a u="44D0" b="82 33 A3 33"/>
+ <a u="44D1" b="82 33 A3 34"/>
+ <a u="44D2" b="82 33 A3 35"/>
+ <a u="44D3" b="82 33 A3 36"/>
+ <a u="44D4" b="82 33 A3 37"/>
+ <a u="44D5" b="82 33 A3 38"/>
+ <a u="44D6" b="FE 7B"/>
+ <a u="464C" b="FE 7D"/>
+ <a u="464D" b="82 33 C9 32"/>
+ <a u="464E" b="82 33 C9 33"/>
+ <a u="464F" b="82 33 C9 34"/>
+ <a u="4650" b="82 33 C9 35"/>
+ <a u="4651" b="82 33 C9 36"/>
+ <a u="4652" b="82 33 C9 37"/>
+ <a u="4653" b="82 33 C9 38"/>
+ <a u="4654" b="82 33 C9 39"/>
+ <a u="4655" b="82 33 CA 30"/>
+ <a u="4656" b="82 33 CA 31"/>
+ <a u="4657" b="82 33 CA 32"/>
+ <a u="4658" b="82 33 CA 33"/>
+ <a u="4659" b="82 33 CA 34"/>
+ <a u="465A" b="82 33 CA 35"/>
+ <a u="465B" b="82 33 CA 36"/>
+ <a u="465C" b="82 33 CA 37"/>
+ <a u="465D" b="82 33 CA 38"/>
+ <a u="465E" b="82 33 CA 39"/>
+ <a u="465F" b="82 33 CB 30"/>
+ <a u="4660" b="82 33 CB 31"/>
+ <a u="4661" b="FE 7C"/>
+ <a u="4662" b="82 33 CB 32"/>
+ <a u="4663" b="82 33 CB 33"/>
+ <a u="4664" b="82 33 CB 34"/>
+ <a u="4665" b="82 33 CB 35"/>
+ <a u="4666" b="82 33 CB 36"/>
+ <a u="4667" b="82 33 CB 37"/>
+ <a u="4668" b="82 33 CB 38"/>
+ <a u="4669" b="82 33 CB 39"/>
+ <a u="466A" b="82 33 CC 30"/>
+ <a u="466B" b="82 33 CC 31"/>
+ <a u="466C" b="82 33 CC 32"/>
+ <a u="466D" b="82 33 CC 33"/>
+ <a u="466E" b="82 33 CC 34"/>
+ <a u="466F" b="82 33 CC 35"/>
+ <a u="4670" b="82 33 CC 36"/>
+ <a u="4671" b="82 33 CC 37"/>
+ <a u="4672" b="82 33 CC 38"/>
+ <a u="4673" b="82 33 CC 39"/>
+ <a u="4674" b="82 33 CD 30"/>
+ <a u="4675" b="82 33 CD 31"/>
+ <a u="4676" b="82 33 CD 32"/>
+ <a u="4677" b="82 33 CD 33"/>
+ <a u="4678" b="82 33 CD 34"/>
+ <a u="4679" b="82 33 CD 35"/>
+ <a u="467A" b="82 33 CD 36"/>
+ <a u="467B" b="82 33 CD 37"/>
+ <a u="467C" b="82 33 CD 38"/>
+ <a u="467D" b="82 33 CD 39"/>
+ <a u="467E" b="82 33 CE 30"/>
+ <a u="467F" b="82 33 CE 31"/>
+ <a u="4680" b="82 33 CE 32"/>
+ <a u="4681" b="82 33 CE 33"/>
+ <a u="4682" b="82 33 CE 34"/>
+ <a u="4683" b="82 33 CE 35"/>
+ <a u="4684" b="82 33 CE 36"/>
+ <a u="4685" b="82 33 CE 37"/>
+ <a u="4686" b="82 33 CE 38"/>
+ <a u="4687" b="82 33 CE 39"/>
+ <a u="4688" b="82 33 CF 30"/>
+ <a u="4689" b="82 33 CF 31"/>
+ <a u="468A" b="82 33 CF 32"/>
+ <a u="468B" b="82 33 CF 33"/>
+ <a u="468C" b="82 33 CF 34"/>
+ <a u="468D" b="82 33 CF 35"/>
+ <a u="468E" b="82 33 CF 36"/>
+ <a u="468F" b="82 33 CF 37"/>
+ <a u="4690" b="82 33 CF 38"/>
+ <a u="4691" b="82 33 CF 39"/>
+ <a u="4692" b="82 33 D0 30"/>
+ <a u="4693" b="82 33 D0 31"/>
+ <a u="4694" b="82 33 D0 32"/>
+ <a u="4695" b="82 33 D0 33"/>
+ <a u="4696" b="82 33 D0 34"/>
+ <a u="4697" b="82 33 D0 35"/>
+ <a u="4698" b="82 33 D0 36"/>
+ <a u="4699" b="82 33 D0 37"/>
+ <a u="469A" b="82 33 D0 38"/>
+ <a u="469B" b="82 33 D0 39"/>
+ <a u="469C" b="82 33 D1 30"/>
+ <a u="469D" b="82 33 D1 31"/>
+ <a u="469E" b="82 33 D1 32"/>
+ <a u="469F" b="82 33 D1 33"/>
+ <a u="46A0" b="82 33 D1 34"/>
+ <a u="46A1" b="82 33 D1 35"/>
+ <a u="46A2" b="82 33 D1 36"/>
+ <a u="46A3" b="82 33 D1 37"/>
+ <a u="46A4" b="82 33 D1 38"/>
+ <a u="46A5" b="82 33 D1 39"/>
+ <a u="46A6" b="82 33 D2 30"/>
+ <a u="46A7" b="82 33 D2 31"/>
+ <a u="46A8" b="82 33 D2 32"/>
+ <a u="46A9" b="82 33 D2 33"/>
+ <a u="46AA" b="82 33 D2 34"/>
+ <a u="46AB" b="82 33 D2 35"/>
+ <a u="46AC" b="82 33 D2 36"/>
+ <a u="46AD" b="82 33 D2 37"/>
+ <a u="46AE" b="82 33 D2 38"/>
+ <a u="46AF" b="82 33 D2 39"/>
+ <a u="46B0" b="82 33 D3 30"/>
+ <a u="46B1" b="82 33 D3 31"/>
+ <a u="46B2" b="82 33 D3 32"/>
+ <a u="46B3" b="82 33 D3 33"/>
+ <a u="46B4" b="82 33 D3 34"/>
+ <a u="46B5" b="82 33 D3 35"/>
+ <a u="46B6" b="82 33 D3 36"/>
+ <a u="46B7" b="82 33 D3 37"/>
+ <a u="46B8" b="82 33 D3 38"/>
+ <a u="46B9" b="82 33 D3 39"/>
+ <a u="46BA" b="82 33 D4 30"/>
+ <a u="46BB" b="82 33 D4 31"/>
+ <a u="46BC" b="82 33 D4 32"/>
+ <a u="46BD" b="82 33 D4 33"/>
+ <a u="46BE" b="82 33 D4 34"/>
+ <a u="46BF" b="82 33 D4 35"/>
+ <a u="46C0" b="82 33 D4 36"/>
+ <a u="46C1" b="82 33 D4 37"/>
+ <a u="46C2" b="82 33 D4 38"/>
+ <a u="46C3" b="82 33 D4 39"/>
+ <a u="46C4" b="82 33 D5 30"/>
+ <a u="46C5" b="82 33 D5 31"/>
+ <a u="46C6" b="82 33 D5 32"/>
+ <a u="46C7" b="82 33 D5 33"/>
+ <a u="46C8" b="82 33 D5 34"/>
+ <a u="46C9" b="82 33 D5 35"/>
+ <a u="46CA" b="82 33 D5 36"/>
+ <a u="46CB" b="82 33 D5 37"/>
+ <a u="46CC" b="82 33 D5 38"/>
+ <a u="46CD" b="82 33 D5 39"/>
+ <a u="46CE" b="82 33 D6 30"/>
+ <a u="46CF" b="82 33 D6 31"/>
+ <a u="46D0" b="82 33 D6 32"/>
+ <a u="46D1" b="82 33 D6 33"/>
+ <a u="46D2" b="82 33 D6 34"/>
+ <a u="46D3" b="82 33 D6 35"/>
+ <a u="46D4" b="82 33 D6 36"/>
+ <a u="46D5" b="82 33 D6 37"/>
+ <a u="46D6" b="82 33 D6 38"/>
+ <a u="46D7" b="82 33 D6 39"/>
+ <a u="46D8" b="82 33 D7 30"/>
+ <a u="46D9" b="82 33 D7 31"/>
+ <a u="46DA" b="82 33 D7 32"/>
+ <a u="46DB" b="82 33 D7 33"/>
+ <a u="46DC" b="82 33 D7 34"/>
+ <a u="46DD" b="82 33 D7 35"/>
+ <a u="46DE" b="82 33 D7 36"/>
+ <a u="46DF" b="82 33 D7 37"/>
+ <a u="46E0" b="82 33 D7 38"/>
+ <a u="46E1" b="82 33 D7 39"/>
+ <a u="46E2" b="82 33 D8 30"/>
+ <a u="46E3" b="82 33 D8 31"/>
+ <a u="46E4" b="82 33 D8 32"/>
+ <a u="46E5" b="82 33 D8 33"/>
+ <a u="46E6" b="82 33 D8 34"/>
+ <a u="46E7" b="82 33 D8 35"/>
+ <a u="46E8" b="82 33 D8 36"/>
+ <a u="46E9" b="82 33 D8 37"/>
+ <a u="46EA" b="82 33 D8 38"/>
+ <a u="46EB" b="82 33 D8 39"/>
+ <a u="46EC" b="82 33 D9 30"/>
+ <a u="46ED" b="82 33 D9 31"/>
+ <a u="46EE" b="82 33 D9 32"/>
+ <a u="46EF" b="82 33 D9 33"/>
+ <a u="46F0" b="82 33 D9 34"/>
+ <a u="46F1" b="82 33 D9 35"/>
+ <a u="46F2" b="82 33 D9 36"/>
+ <a u="46F3" b="82 33 D9 37"/>
+ <a u="46F4" b="82 33 D9 38"/>
+ <a u="46F5" b="82 33 D9 39"/>
+ <a u="46F6" b="82 33 DA 30"/>
+ <a u="46F7" b="82 33 DA 31"/>
+ <a u="46F8" b="82 33 DA 32"/>
+ <a u="46F9" b="82 33 DA 33"/>
+ <a u="46FA" b="82 33 DA 34"/>
+ <a u="46FB" b="82 33 DA 35"/>
+ <a u="46FC" b="82 33 DA 36"/>
+ <a u="46FD" b="82 33 DA 37"/>
+ <a u="46FE" b="82 33 DA 38"/>
+ <a u="46FF" b="82 33 DA 39"/>
+ <a u="4700" b="82 33 DB 30"/>
+ <a u="4701" b="82 33 DB 31"/>
+ <a u="4702" b="82 33 DB 32"/>
+ <a u="4703" b="82 33 DB 33"/>
+ <a u="4704" b="82 33 DB 34"/>
+ <a u="4705" b="82 33 DB 35"/>
+ <a u="4706" b="82 33 DB 36"/>
+ <a u="4707" b="82 33 DB 37"/>
+ <a u="4708" b="82 33 DB 38"/>
+ <a u="4709" b="82 33 DB 39"/>
+ <a u="470A" b="82 33 DC 30"/>
+ <a u="470B" b="82 33 DC 31"/>
+ <a u="470C" b="82 33 DC 32"/>
+ <a u="470D" b="82 33 DC 33"/>
+ <a u="470E" b="82 33 DC 34"/>
+ <a u="470F" b="82 33 DC 35"/>
+ <a u="4710" b="82 33 DC 36"/>
+ <a u="4711" b="82 33 DC 37"/>
+ <a u="4712" b="82 33 DC 38"/>
+ <a u="4713" b="82 33 DC 39"/>
+ <a u="4714" b="82 33 DD 30"/>
+ <a u="4715" b="82 33 DD 31"/>
+ <a u="4716" b="82 33 DD 32"/>
+ <a u="4717" b="82 33 DD 33"/>
+ <a u="4718" b="82 33 DD 34"/>
+ <a u="4719" b="82 33 DD 35"/>
+ <a u="471A" b="82 33 DD 36"/>
+ <a u="471B" b="82 33 DD 37"/>
+ <a u="471C" b="82 33 DD 38"/>
+ <a u="471D" b="82 33 DD 39"/>
+ <a u="471E" b="82 33 DE 30"/>
+ <a u="471F" b="82 33 DE 31"/>
+ <a u="4720" b="82 33 DE 32"/>
+ <a u="4721" b="82 33 DE 33"/>
+ <a u="4722" b="82 33 DE 34"/>
+ <a u="4723" b="FE 80"/>
+ <a u="4724" b="82 33 DE 35"/>
+ <a u="4725" b="82 33 DE 36"/>
+ <a u="4726" b="82 33 DE 37"/>
+ <a u="4727" b="82 33 DE 38"/>
+ <a u="4728" b="82 33 DE 39"/>
+ <a u="4729" b="FE 81"/>
+ <a u="472A" b="82 33 DF 30"/>
+ <a u="472B" b="82 33 DF 31"/>
+ <a u="472C" b="82 33 DF 32"/>
+ <a u="472D" b="82 33 DF 33"/>
+ <a u="472E" b="82 33 DF 34"/>
+ <a u="472F" b="82 33 DF 35"/>
+ <a u="4730" b="82 33 DF 36"/>
+ <a u="4731" b="82 33 DF 37"/>
+ <a u="4732" b="82 33 DF 38"/>
+ <a u="4733" b="82 33 DF 39"/>
+ <a u="4734" b="82 33 E0 30"/>
+ <a u="4735" b="82 33 E0 31"/>
+ <a u="4736" b="82 33 E0 32"/>
+ <a u="4737" b="82 33 E0 33"/>
+ <a u="4738" b="82 33 E0 34"/>
+ <a u="4739" b="82 33 E0 35"/>
+ <a u="473A" b="82 33 E0 36"/>
+ <a u="473B" b="82 33 E0 37"/>
+ <a u="473C" b="82 33 E0 38"/>
+ <a u="473D" b="82 33 E0 39"/>
+ <a u="473E" b="82 33 E1 30"/>
+ <a u="473F" b="82 33 E1 31"/>
+ <a u="4740" b="82 33 E1 32"/>
+ <a u="4741" b="82 33 E1 33"/>
+ <a u="4742" b="82 33 E1 34"/>
+ <a u="4743" b="82 33 E1 35"/>
+ <a u="4744" b="82 33 E1 36"/>
+ <a u="4745" b="82 33 E1 37"/>
+ <a u="4746" b="82 33 E1 38"/>
+ <a u="4747" b="82 33 E1 39"/>
+ <a u="4748" b="82 33 E2 30"/>
+ <a u="4749" b="82 33 E2 31"/>
+ <a u="474A" b="82 33 E2 32"/>
+ <a u="474B" b="82 33 E2 33"/>
+ <a u="474C" b="82 33 E2 34"/>
+ <a u="474D" b="82 33 E2 35"/>
+ <a u="474E" b="82 33 E2 36"/>
+ <a u="474F" b="82 33 E2 37"/>
+ <a u="4750" b="82 33 E2 38"/>
+ <a u="4751" b="82 33 E2 39"/>
+ <a u="4752" b="82 33 E3 30"/>
+ <a u="4753" b="82 33 E3 31"/>
+ <a u="4754" b="82 33 E3 32"/>
+ <a u="4755" b="82 33 E3 33"/>
+ <a u="4756" b="82 33 E3 34"/>
+ <a u="4757" b="82 33 E3 35"/>
+ <a u="4758" b="82 33 E3 36"/>
+ <a u="4759" b="82 33 E3 37"/>
+ <a u="475A" b="82 33 E3 38"/>
+ <a u="475B" b="82 33 E3 39"/>
+ <a u="475C" b="82 33 E4 30"/>
+ <a u="475D" b="82 33 E4 31"/>
+ <a u="475E" b="82 33 E4 32"/>
+ <a u="475F" b="82 33 E4 33"/>
+ <a u="4760" b="82 33 E4 34"/>
+ <a u="4761" b="82 33 E4 35"/>
+ <a u="4762" b="82 33 E4 36"/>
+ <a u="4763" b="82 33 E4 37"/>
+ <a u="4764" b="82 33 E4 38"/>
+ <a u="4765" b="82 33 E4 39"/>
+ <a u="4766" b="82 33 E5 30"/>
+ <a u="4767" b="82 33 E5 31"/>
+ <a u="4768" b="82 33 E5 32"/>
+ <a u="4769" b="82 33 E5 33"/>
+ <a u="476A" b="82 33 E5 34"/>
+ <a u="476B" b="82 33 E5 35"/>
+ <a u="476C" b="82 33 E5 36"/>
+ <a u="476D" b="82 33 E5 37"/>
+ <a u="476E" b="82 33 E5 38"/>
+ <a u="476F" b="82 33 E5 39"/>
+ <a u="4770" b="82 33 E6 30"/>
+ <a u="4771" b="82 33 E6 31"/>
+ <a u="4772" b="82 33 E6 32"/>
+ <a u="4773" b="82 33 E6 33"/>
+ <a u="4774" b="82 33 E6 34"/>
+ <a u="4775" b="82 33 E6 35"/>
+ <a u="4776" b="82 33 E6 36"/>
+ <a u="4777" b="82 33 E6 37"/>
+ <a u="4778" b="82 33 E6 38"/>
+ <a u="4779" b="82 33 E6 39"/>
+ <a u="477A" b="82 33 E7 30"/>
+ <a u="477B" b="82 33 E7 31"/>
+ <a u="477C" b="FE 82"/>
+ <a u="477D" b="82 33 E7 32"/>
+ <a u="477E" b="82 33 E7 33"/>
+ <a u="477F" b="82 33 E7 34"/>
+ <a u="4780" b="82 33 E7 35"/>
+ <a u="4781" b="82 33 E7 36"/>
+ <a u="4782" b="82 33 E7 37"/>
+ <a u="4783" b="82 33 E7 38"/>
+ <a u="4784" b="82 33 E7 39"/>
+ <a u="4785" b="82 33 E8 30"/>
+ <a u="4786" b="82 33 E8 31"/>
+ <a u="4787" b="82 33 E8 32"/>
+ <a u="4788" b="82 33 E8 33"/>
+ <a u="4789" b="82 33 E8 34"/>
+ <a u="478A" b="82 33 E8 35"/>
+ <a u="478B" b="82 33 E8 36"/>
+ <a u="478C" b="82 33 E8 37"/>
+ <a u="478D" b="FE 83"/>
+ <a u="4947" b="FE 85"/>
+ <a u="4948" b="82 34 96 39"/>
+ <a u="4949" b="82 34 97 30"/>
+ <a u="494A" b="82 34 97 31"/>
+ <a u="494B" b="82 34 97 32"/>
+ <a u="494C" b="82 34 97 33"/>
+ <a u="494D" b="82 34 97 34"/>
+ <a u="494E" b="82 34 97 35"/>
+ <a u="494F" b="82 34 97 36"/>
+ <a u="4950" b="82 34 97 37"/>
+ <a u="4951" b="82 34 97 38"/>
+ <a u="4952" b="82 34 97 39"/>
+ <a u="4953" b="82 34 98 30"/>
+ <a u="4954" b="82 34 98 31"/>
+ <a u="4955" b="82 34 98 32"/>
+ <a u="4956" b="82 34 98 33"/>
+ <a u="4957" b="82 34 98 34"/>
+ <a u="4958" b="82 34 98 35"/>
+ <a u="4959" b="82 34 98 36"/>
+ <a u="495A" b="82 34 98 37"/>
+ <a u="495B" b="82 34 98 38"/>
+ <a u="495C" b="82 34 98 39"/>
+ <a u="495D" b="82 34 99 30"/>
+ <a u="495E" b="82 34 99 31"/>
+ <a u="495F" b="82 34 99 32"/>
+ <a u="4960" b="82 34 99 33"/>
+ <a u="4961" b="82 34 99 34"/>
+ <a u="4962" b="82 34 99 35"/>
+ <a u="4963" b="82 34 99 36"/>
+ <a u="4964" b="82 34 99 37"/>
+ <a u="4965" b="82 34 99 38"/>
+ <a u="4966" b="82 34 99 39"/>
+ <a u="4967" b="82 34 9A 30"/>
+ <a u="4968" b="82 34 9A 31"/>
+ <a u="4969" b="82 34 9A 32"/>
+ <a u="496A" b="82 34 9A 33"/>
+ <a u="496B" b="82 34 9A 34"/>
+ <a u="496C" b="82 34 9A 35"/>
+ <a u="496D" b="82 34 9A 36"/>
+ <a u="496E" b="82 34 9A 37"/>
+ <a u="496F" b="82 34 9A 38"/>
+ <a u="4970" b="82 34 9A 39"/>
+ <a u="4971" b="82 34 9B 30"/>
+ <a u="4972" b="82 34 9B 31"/>
+ <a u="4973" b="82 34 9B 32"/>
+ <a u="4974" b="82 34 9B 33"/>
+ <a u="4975" b="82 34 9B 34"/>
+ <a u="4976" b="82 34 9B 35"/>
+ <a u="4977" b="82 34 9B 36"/>
+ <a u="4978" b="82 34 9B 37"/>
+ <a u="4979" b="82 34 9B 38"/>
+ <a u="497A" b="FE 86"/>
+ <a u="497B" b="82 34 9B 39"/>
+ <a u="497C" b="82 34 9C 30"/>
+ <a u="497D" b="FE 87"/>
+ <a u="497E" b="82 34 9C 31"/>
+ <a u="497F" b="82 34 9C 32"/>
+ <a u="4980" b="82 34 9C 33"/>
+ <a u="4981" b="82 34 9C 34"/>
+ <a u="4982" b="FE 88"/>
+ <a u="4983" b="FE 89"/>
+ <a u="4984" b="82 34 9C 35"/>
+ <a u="4985" b="FE 8A"/>
+ <a u="4986" b="FE 8B"/>
+ <a u="4987" b="82 34 9C 36"/>
+ <a u="4988" b="82 34 9C 37"/>
+ <a u="4989" b="82 34 9C 38"/>
+ <a u="498A" b="82 34 9C 39"/>
+ <a u="498B" b="82 34 9D 30"/>
+ <a u="498C" b="82 34 9D 31"/>
+ <a u="498D" b="82 34 9D 32"/>
+ <a u="498E" b="82 34 9D 33"/>
+ <a u="498F" b="82 34 9D 34"/>
+ <a u="4990" b="82 34 9D 35"/>
+ <a u="4991" b="82 34 9D 36"/>
+ <a u="4992" b="82 34 9D 37"/>
+ <a u="4993" b="82 34 9D 38"/>
+ <a u="4994" b="82 34 9D 39"/>
+ <a u="4995" b="82 34 9E 30"/>
+ <a u="4996" b="82 34 9E 31"/>
+ <a u="4997" b="82 34 9E 32"/>
+ <a u="4998" b="82 34 9E 33"/>
+ <a u="4999" b="82 34 9E 34"/>
+ <a u="499A" b="82 34 9E 35"/>
+ <a u="499B" b="FE 8D"/>
+ <a u="499C" b="82 34 9E 36"/>
+ <a u="499D" b="82 34 9E 37"/>
+ <a u="499E" b="82 34 9E 38"/>
+ <a u="499F" b="FE 8C"/>
+ <a u="49A0" b="82 34 9E 39"/>
+ <a u="49A1" b="82 34 9F 30"/>
+ <a u="49A2" b="82 34 9F 31"/>
+ <a u="49A3" b="82 34 9F 32"/>
+ <a u="49A4" b="82 34 9F 33"/>
+ <a u="49A5" b="82 34 9F 34"/>
+ <a u="49A6" b="82 34 9F 35"/>
+ <a u="49A7" b="82 34 9F 36"/>
+ <a u="49A8" b="82 34 9F 37"/>
+ <a u="49A9" b="82 34 9F 38"/>
+ <a u="49AA" b="82 34 9F 39"/>
+ <a u="49AB" b="82 34 A0 30"/>
+ <a u="49AC" b="82 34 A0 31"/>
+ <a u="49AD" b="82 34 A0 32"/>
+ <a u="49AE" b="82 34 A0 33"/>
+ <a u="49AF" b="82 34 A0 34"/>
+ <a u="49B0" b="82 34 A0 35"/>
+ <a u="49B1" b="82 34 A0 36"/>
+ <a u="49B2" b="82 34 A0 37"/>
+ <a u="49B3" b="82 34 A0 38"/>
+ <a u="49B4" b="82 34 A0 39"/>
+ <a u="49B5" b="82 34 A1 30"/>
+ <a u="49B6" b="FE 8F"/>
+ <a u="49B7" b="FE 8E"/>
+ <a u="4C77" b="FE 96"/>
+ <a u="4C78" b="82 34 E7 34"/>
+ <a u="4C79" b="82 34 E7 35"/>
+ <a u="4C7A" b="82 34 E7 36"/>
+ <a u="4C7B" b="82 34 E7 37"/>
+ <a u="4C7C" b="82 34 E7 38"/>
+ <a u="4C7D" b="82 34 E7 39"/>
+ <a u="4C7E" b="82 34 E8 30"/>
+ <a u="4C7F" b="82 34 E8 31"/>
+ <a u="4C80" b="82 34 E8 32"/>
+ <a u="4C81" b="82 34 E8 33"/>
+ <a u="4C82" b="82 34 E8 34"/>
+ <a u="4C83" b="82 34 E8 35"/>
+ <a u="4C84" b="82 34 E8 36"/>
+ <a u="4C85" b="82 34 E8 37"/>
+ <a u="4C86" b="82 34 E8 38"/>
+ <a u="4C87" b="82 34 E8 39"/>
+ <a u="4C88" b="82 34 E9 30"/>
+ <a u="4C89" b="82 34 E9 31"/>
+ <a u="4C8A" b="82 34 E9 32"/>
+ <a u="4C8B" b="82 34 E9 33"/>
+ <a u="4C8C" b="82 34 E9 34"/>
+ <a u="4C8D" b="82 34 E9 35"/>
+ <a u="4C8E" b="82 34 E9 36"/>
+ <a u="4C8F" b="82 34 E9 37"/>
+ <a u="4C90" b="82 34 E9 38"/>
+ <a u="4C91" b="82 34 E9 39"/>
+ <a u="4C92" b="82 34 EA 30"/>
+ <a u="4C93" b="82 34 EA 31"/>
+ <a u="4C94" b="82 34 EA 32"/>
+ <a u="4C95" b="82 34 EA 33"/>
+ <a u="4C96" b="82 34 EA 34"/>
+ <a u="4C97" b="82 34 EA 35"/>
+ <a u="4C98" b="82 34 EA 36"/>
+ <a u="4C99" b="82 34 EA 37"/>
+ <a u="4C9A" b="82 34 EA 38"/>
+ <a u="4C9B" b="82 34 EA 39"/>
+ <a u="4C9C" b="82 34 EB 30"/>
+ <a u="4C9D" b="82 34 EB 31"/>
+ <a u="4C9E" b="82 34 EB 32"/>
+ <a u="4C9F" b="FE 93"/>
+ <a u="4CA0" b="FE 94"/>
+ <a u="4CA1" b="FE 95"/>
+ <a u="4CA2" b="FE 97"/>
+ <a u="4CA3" b="FE 92"/>
+ <a u="4CA4" b="82 34 EB 33"/>
+ <a u="4CA5" b="82 34 EB 34"/>
+ <a u="4CA6" b="82 34 EB 35"/>
+ <a u="4CA7" b="82 34 EB 36"/>
+ <a u="4CA8" b="82 34 EB 37"/>
+ <a u="4CA9" b="82 34 EB 38"/>
+ <a u="4CAA" b="82 34 EB 39"/>
+ <a u="4CAB" b="82 34 EC 30"/>
+ <a u="4CAC" b="82 34 EC 31"/>
+ <a u="4CAD" b="82 34 EC 32"/>
+ <a u="4CAE" b="82 34 EC 33"/>
+ <a u="4CAF" b="82 34 EC 34"/>
+ <a u="4CB0" b="82 34 EC 35"/>
+ <a u="4CB1" b="82 34 EC 36"/>
+ <a u="4CB2" b="82 34 EC 37"/>
+ <a u="4CB3" b="82 34 EC 38"/>
+ <a u="4CB4" b="82 34 EC 39"/>
+ <a u="4CB5" b="82 34 ED 30"/>
+ <a u="4CB6" b="82 34 ED 31"/>
+ <a u="4CB7" b="82 34 ED 32"/>
+ <a u="4CB8" b="82 34 ED 33"/>
+ <a u="4CB9" b="82 34 ED 34"/>
+ <a u="4CBA" b="82 34 ED 35"/>
+ <a u="4CBB" b="82 34 ED 36"/>
+ <a u="4CBC" b="82 34 ED 37"/>
+ <a u="4CBD" b="82 34 ED 38"/>
+ <a u="4CBE" b="82 34 ED 39"/>
+ <a u="4CBF" b="82 34 EE 30"/>
+ <a u="4CC0" b="82 34 EE 31"/>
+ <a u="4CC1" b="82 34 EE 32"/>
+ <a u="4CC2" b="82 34 EE 33"/>
+ <a u="4CC3" b="82 34 EE 34"/>
+ <a u="4CC4" b="82 34 EE 35"/>
+ <a u="4CC5" b="82 34 EE 36"/>
+ <a u="4CC6" b="82 34 EE 37"/>
+ <a u="4CC7" b="82 34 EE 38"/>
+ <a u="4CC8" b="82 34 EE 39"/>
+ <a u="4CC9" b="82 34 EF 30"/>
+ <a u="4CCA" b="82 34 EF 31"/>
+ <a u="4CCB" b="82 34 EF 32"/>
+ <a u="4CCC" b="82 34 EF 33"/>
+ <a u="4CCD" b="82 34 EF 34"/>
+ <a u="4CCE" b="82 34 EF 35"/>
+ <a u="4CCF" b="82 34 EF 36"/>
+ <a u="4CD0" b="82 34 EF 37"/>
+ <a u="4CD1" b="82 34 EF 38"/>
+ <a u="4CD2" b="82 34 EF 39"/>
+ <a u="4CD3" b="82 34 F0 30"/>
+ <a u="4CD4" b="82 34 F0 31"/>
+ <a u="4CD5" b="82 34 F0 32"/>
+ <a u="4CD6" b="82 34 F0 33"/>
+ <a u="4CD7" b="82 34 F0 34"/>
+ <a u="4CD8" b="82 34 F0 35"/>
+ <a u="4CD9" b="82 34 F0 36"/>
+ <a u="4CDA" b="82 34 F0 37"/>
+ <a u="4CDB" b="82 34 F0 38"/>
+ <a u="4CDC" b="82 34 F0 39"/>
+ <a u="4CDD" b="82 34 F1 30"/>
+ <a u="4CDE" b="82 34 F1 31"/>
+ <a u="4CDF" b="82 34 F1 32"/>
+ <a u="4CE0" b="82 34 F1 33"/>
+ <a u="4CE1" b="82 34 F1 34"/>
+ <a u="4CE2" b="82 34 F1 35"/>
+ <a u="4CE3" b="82 34 F1 36"/>
+ <a u="4CE4" b="82 34 F1 37"/>
+ <a u="4CE5" b="82 34 F1 38"/>
+ <a u="4CE6" b="82 34 F1 39"/>
+ <a u="4CE7" b="82 34 F2 30"/>
+ <a u="4CE8" b="82 34 F2 31"/>
+ <a u="4CE9" b="82 34 F2 32"/>
+ <a u="4CEA" b="82 34 F2 33"/>
+ <a u="4CEB" b="82 34 F2 34"/>
+ <a u="4CEC" b="82 34 F2 35"/>
+ <a u="4CED" b="82 34 F2 36"/>
+ <a u="4CEE" b="82 34 F2 37"/>
+ <a u="4CEF" b="82 34 F2 38"/>
+ <a u="4CF0" b="82 34 F2 39"/>
+ <a u="4CF1" b="82 34 F3 30"/>
+ <a u="4CF2" b="82 34 F3 31"/>
+ <a u="4CF3" b="82 34 F3 32"/>
+ <a u="4CF4" b="82 34 F3 33"/>
+ <a u="4CF5" b="82 34 F3 34"/>
+ <a u="4CF6" b="82 34 F3 35"/>
+ <a u="4CF7" b="82 34 F3 36"/>
+ <a u="4CF8" b="82 34 F3 37"/>
+ <a u="4CF9" b="82 34 F3 38"/>
+ <a u="4CFA" b="82 34 F3 39"/>
+ <a u="4CFB" b="82 34 F4 30"/>
+ <a u="4CFC" b="82 34 F4 31"/>
+ <a u="4CFD" b="82 34 F4 32"/>
+ <a u="4CFE" b="82 34 F4 33"/>
+ <a u="4CFF" b="82 34 F4 34"/>
+ <a u="4D00" b="82 34 F4 35"/>
+ <a u="4D01" b="82 34 F4 36"/>
+ <a u="4D02" b="82 34 F4 37"/>
+ <a u="4D03" b="82 34 F4 38"/>
+ <a u="4D04" b="82 34 F4 39"/>
+ <a u="4D05" b="82 34 F5 30"/>
+ <a u="4D06" b="82 34 F5 31"/>
+ <a u="4D07" b="82 34 F5 32"/>
+ <a u="4D08" b="82 34 F5 33"/>
+ <a u="4D09" b="82 34 F5 34"/>
+ <a u="4D0A" b="82 34 F5 35"/>
+ <a u="4D0B" b="82 34 F5 36"/>
+ <a u="4D0C" b="82 34 F5 37"/>
+ <a u="4D0D" b="82 34 F5 38"/>
+ <a u="4D0E" b="82 34 F5 39"/>
+ <a u="4D0F" b="82 34 F6 30"/>
+ <a u="4D10" b="82 34 F6 31"/>
+ <a u="4D11" b="82 34 F6 32"/>
+ <a u="4D12" b="82 34 F6 33"/>
+ <a u="4D13" b="FE 98"/>
+ <a u="4D14" b="FE 99"/>
+ <a u="4D15" b="FE 9A"/>
+ <a u="4D16" b="FE 9B"/>
+ <a u="4D17" b="FE 9C"/>
+ <a u="4D18" b="FE 9D"/>
+ <a u="4D19" b="FE 9E"/>
+ <a u="4D1A" b="82 34 F6 34"/>
+ <a u="4D1B" b="82 34 F6 35"/>
+ <a u="4D1C" b="82 34 F6 36"/>
+ <a u="4D1D" b="82 34 F6 37"/>
+ <a u="4D1E" b="82 34 F6 38"/>
+ <a u="4D1F" b="82 34 F6 39"/>
+ <a u="4D20" b="82 34 F7 30"/>
+ <a u="4D21" b="82 34 F7 31"/>
+ <a u="4D22" b="82 34 F7 32"/>
+ <a u="4D23" b="82 34 F7 33"/>
+ <a u="4D24" b="82 34 F7 34"/>
+ <a u="4D25" b="82 34 F7 35"/>
+ <a u="4D26" b="82 34 F7 36"/>
+ <a u="4D27" b="82 34 F7 37"/>
+ <a u="4D28" b="82 34 F7 38"/>
+ <a u="4D29" b="82 34 F7 39"/>
+ <a u="4D2A" b="82 34 F8 30"/>
+ <a u="4D2B" b="82 34 F8 31"/>
+ <a u="4D2C" b="82 34 F8 32"/>
+ <a u="4D2D" b="82 34 F8 33"/>
+ <a u="4D2E" b="82 34 F8 34"/>
+ <a u="4D2F" b="82 34 F8 35"/>
+ <a u="4D30" b="82 34 F8 36"/>
+ <a u="4D31" b="82 34 F8 37"/>
+ <a u="4D32" b="82 34 F8 38"/>
+ <a u="4D33" b="82 34 F8 39"/>
+ <a u="4D34" b="82 34 F9 30"/>
+ <a u="4D35" b="82 34 F9 31"/>
+ <a u="4D36" b="82 34 F9 32"/>
+ <a u="4D37" b="82 34 F9 33"/>
+ <a u="4D38" b="82 34 F9 34"/>
+ <a u="4D39" b="82 34 F9 35"/>
+ <a u="4D3A" b="82 34 F9 36"/>
+ <a u="4D3B" b="82 34 F9 37"/>
+ <a u="4D3C" b="82 34 F9 38"/>
+ <a u="4D3D" b="82 34 F9 39"/>
+ <a u="4D3E" b="82 34 FA 30"/>
+ <a u="4D3F" b="82 34 FA 31"/>
+ <a u="4D40" b="82 34 FA 32"/>
+ <a u="4D41" b="82 34 FA 33"/>
+ <a u="4D42" b="82 34 FA 34"/>
+ <a u="4D43" b="82 34 FA 35"/>
+ <a u="4D44" b="82 34 FA 36"/>
+ <a u="4D45" b="82 34 FA 37"/>
+ <a u="4D46" b="82 34 FA 38"/>
+ <a u="4D47" b="82 34 FA 39"/>
+ <a u="4D48" b="82 34 FB 30"/>
+ <a u="4D49" b="82 34 FB 31"/>
+ <a u="4D4A" b="82 34 FB 32"/>
+ <a u="4D4B" b="82 34 FB 33"/>
+ <a u="4D4C" b="82 34 FB 34"/>
+ <a u="4D4D" b="82 34 FB 35"/>
+ <a u="4D4E" b="82 34 FB 36"/>
+ <a u="4D4F" b="82 34 FB 37"/>
+ <a u="4D50" b="82 34 FB 38"/>
+ <a u="4D51" b="82 34 FB 39"/>
+ <a u="4D52" b="82 34 FC 30"/>
+ <a u="4D53" b="82 34 FC 31"/>
+ <a u="4D54" b="82 34 FC 32"/>
+ <a u="4D55" b="82 34 FC 33"/>
+ <a u="4D56" b="82 34 FC 34"/>
+ <a u="4D57" b="82 34 FC 35"/>
+ <a u="4D58" b="82 34 FC 36"/>
+ <a u="4D59" b="82 34 FC 37"/>
+ <a u="4D5A" b="82 34 FC 38"/>
+ <a u="4D5B" b="82 34 FC 39"/>
+ <a u="4D5C" b="82 34 FD 30"/>
+ <a u="4D5D" b="82 34 FD 31"/>
+ <a u="4D5E" b="82 34 FD 32"/>
+ <a u="4D5F" b="82 34 FD 33"/>
+ <a u="4D60" b="82 34 FD 34"/>
+ <a u="4D61" b="82 34 FD 35"/>
+ <a u="4D62" b="82 34 FD 36"/>
+ <a u="4D63" b="82 34 FD 37"/>
+ <a u="4D64" b="82 34 FD 38"/>
+ <a u="4D65" b="82 34 FD 39"/>
+ <a u="4D66" b="82 34 FE 30"/>
+ <a u="4D67" b="82 34 FE 31"/>
+ <a u="4D68" b="82 34 FE 32"/>
+ <a u="4D69" b="82 34 FE 33"/>
+ <a u="4D6A" b="82 34 FE 34"/>
+ <a u="4D6B" b="82 34 FE 35"/>
+ <a u="4D6C" b="82 34 FE 36"/>
+ <a u="4D6D" b="82 34 FE 37"/>
+ <a u="4D6E" b="82 34 FE 38"/>
+ <a u="4D6F" b="82 34 FE 39"/>
+ <a u="4D70" b="82 35 81 30"/>
+ <a u="4D71" b="82 35 81 31"/>
+ <a u="4D72" b="82 35 81 32"/>
+ <a u="4D73" b="82 35 81 33"/>
+ <a u="4D74" b="82 35 81 34"/>
+ <a u="4D75" b="82 35 81 35"/>
+ <a u="4D76" b="82 35 81 36"/>
+ <a u="4D77" b="82 35 81 37"/>
+ <a u="4D78" b="82 35 81 38"/>
+ <a u="4D79" b="82 35 81 39"/>
+ <a u="4D7A" b="82 35 82 30"/>
+ <a u="4D7B" b="82 35 82 31"/>
+ <a u="4D7C" b="82 35 82 32"/>
+ <a u="4D7D" b="82 35 82 33"/>
+ <a u="4D7E" b="82 35 82 34"/>
+ <a u="4D7F" b="82 35 82 35"/>
+ <a u="4D80" b="82 35 82 36"/>
+ <a u="4D81" b="82 35 82 37"/>
+ <a u="4D82" b="82 35 82 38"/>
+ <a u="4D83" b="82 35 82 39"/>
+ <a u="4D84" b="82 35 83 30"/>
+ <a u="4D85" b="82 35 83 31"/>
+ <a u="4D86" b="82 35 83 32"/>
+ <a u="4D87" b="82 35 83 33"/>
+ <a u="4D88" b="82 35 83 34"/>
+ <a u="4D89" b="82 35 83 35"/>
+ <a u="4D8A" b="82 35 83 36"/>
+ <a u="4D8B" b="82 35 83 37"/>
+ <a u="4D8C" b="82 35 83 38"/>
+ <a u="4D8D" b="82 35 83 39"/>
+ <a u="4D8E" b="82 35 84 30"/>
+ <a u="4D8F" b="82 35 84 31"/>
+ <a u="4D90" b="82 35 84 32"/>
+ <a u="4D91" b="82 35 84 33"/>
+ <a u="4D92" b="82 35 84 34"/>
+ <a u="4D93" b="82 35 84 35"/>
+ <a u="4D94" b="82 35 84 36"/>
+ <a u="4D95" b="82 35 84 37"/>
+ <a u="4D96" b="82 35 84 38"/>
+ <a u="4D97" b="82 35 84 39"/>
+ <a u="4D98" b="82 35 85 30"/>
+ <a u="4D99" b="82 35 85 31"/>
+ <a u="4D9A" b="82 35 85 32"/>
+ <a u="4D9B" b="82 35 85 33"/>
+ <a u="4D9C" b="82 35 85 34"/>
+ <a u="4D9D" b="82 35 85 35"/>
+ <a u="4D9E" b="82 35 85 36"/>
+ <a u="4D9F" b="82 35 85 37"/>
+ <a u="4DA0" b="82 35 85 38"/>
+ <a u="4DA1" b="82 35 85 39"/>
+ <a u="4DA2" b="82 35 86 30"/>
+ <a u="4DA3" b="82 35 86 31"/>
+ <a u="4DA4" b="82 35 86 32"/>
+ <a u="4DA5" b="82 35 86 33"/>
+ <a u="4DA6" b="82 35 86 34"/>
+ <a u="4DA7" b="82 35 86 35"/>
+ <a u="4DA8" b="82 35 86 36"/>
+ <a u="4DA9" b="82 35 86 37"/>
+ <a u="4DAA" b="82 35 86 38"/>
+ <a u="4DAB" b="82 35 86 39"/>
+ <a u="4DAC" b="82 35 87 30"/>
+ <a u="4DAD" b="82 35 87 31"/>
+ <a u="4DAE" b="FE 9F"/>
+ <a u="4DAF" b="82 35 87 32"/>
+ <a u="4DB0" b="82 35 87 33"/>
+ <a u="4DB1" b="82 35 87 34"/>
+ <a u="4DB2" b="82 35 87 35"/>
+ <a u="4DB3" b="82 35 87 36"/>
+ <a u="4DB4" b="82 35 87 37"/>
+ <a u="4DB5" b="82 35 87 38"/>
+ <a u="4DB6" b="82 35 87 39"/>
+ <a u="4DB7" b="82 35 88 30"/>
+ <a u="4DB8" b="82 35 88 31"/>
+ <a u="4DB9" b="82 35 88 32"/>
+ <a u="4DBA" b="82 35 88 33"/>
+ <a u="4DBB" b="82 35 88 34"/>
+ <a u="4DBC" b="82 35 88 35"/>
+ <a u="4DBD" b="82 35 88 36"/>
+ <a u="4DBE" b="82 35 88 37"/>
+ <a u="4DBF" b="82 35 88 38"/>
+ <a u="4DC0" b="82 35 88 39"/>
+ <a u="4DC1" b="82 35 89 30"/>
+ <a u="4DC2" b="82 35 89 31"/>
+ <a u="4DC3" b="82 35 89 32"/>
+ <a u="4DC4" b="82 35 89 33"/>
+ <a u="4DC5" b="82 35 89 34"/>
+ <a u="4DC6" b="82 35 89 35"/>
+ <a u="4DC7" b="82 35 89 36"/>
+ <a u="4DC8" b="82 35 89 37"/>
+ <a u="4DC9" b="82 35 89 38"/>
+ <a u="4DCA" b="82 35 89 39"/>
+ <a u="4DCB" b="82 35 8A 30"/>
+ <a u="4DCC" b="82 35 8A 31"/>
+ <a u="4DCD" b="82 35 8A 32"/>
+ <a u="4DCE" b="82 35 8A 33"/>
+ <a u="4DCF" b="82 35 8A 34"/>
+ <a u="4DD0" b="82 35 8A 35"/>
+ <a u="4DD1" b="82 35 8A 36"/>
+ <a u="4DD2" b="82 35 8A 37"/>
+ <a u="4DD3" b="82 35 8A 38"/>
+ <a u="4DD4" b="82 35 8A 39"/>
+ <a u="4DD5" b="82 35 8B 30"/>
+ <a u="4DD6" b="82 35 8B 31"/>
+ <a u="4DD7" b="82 35 8B 32"/>
+ <a u="4DD8" b="82 35 8B 33"/>
+ <a u="4DD9" b="82 35 8B 34"/>
+ <a u="4DDA" b="82 35 8B 35"/>
+ <a u="4DDB" b="82 35 8B 36"/>
+ <a u="4DDC" b="82 35 8B 37"/>
+ <a u="4DDD" b="82 35 8B 38"/>
+ <a u="4DDE" b="82 35 8B 39"/>
+ <a u="4DDF" b="82 35 8C 30"/>
+ <a u="4DE0" b="82 35 8C 31"/>
+ <a u="4DE1" b="82 35 8C 32"/>
+ <a u="4DE2" b="82 35 8C 33"/>
+ <a u="4DE3" b="82 35 8C 34"/>
+ <a u="4DE4" b="82 35 8C 35"/>
+ <a u="4DE5" b="82 35 8C 36"/>
+ <a u="4DE6" b="82 35 8C 37"/>
+ <a u="4DE7" b="82 35 8C 38"/>
+ <a u="4DE8" b="82 35 8C 39"/>
+ <a u="4DE9" b="82 35 8D 30"/>
+ <a u="4DEA" b="82 35 8D 31"/>
+ <a u="4DEB" b="82 35 8D 32"/>
+ <a u="4DEC" b="82 35 8D 33"/>
+ <a u="4DED" b="82 35 8D 34"/>
+ <a u="4DEE" b="82 35 8D 35"/>
+ <a u="4DEF" b="82 35 8D 36"/>
+ <a u="4DF0" b="82 35 8D 37"/>
+ <a u="4DF1" b="82 35 8D 38"/>
+ <a u="4DF2" b="82 35 8D 39"/>
+ <a u="4DF3" b="82 35 8E 30"/>
+ <a u="4DF4" b="82 35 8E 31"/>
+ <a u="4DF5" b="82 35 8E 32"/>
+ <a u="4DF6" b="82 35 8E 33"/>
+ <a u="4DF7" b="82 35 8E 34"/>
+ <a u="4DF8" b="82 35 8E 35"/>
+ <a u="4DF9" b="82 35 8E 36"/>
+ <a u="4DFA" b="82 35 8E 37"/>
+ <a u="4DFB" b="82 35 8E 38"/>
+ <a u="4DFC" b="82 35 8E 39"/>
+ <a u="4DFD" b="82 35 8F 30"/>
+ <a u="4DFE" b="82 35 8F 31"/>
+ <a u="4DFF" b="82 35 8F 32"/>
+ <a u="4E00" b="D2 BB"/>
+ <a u="4E01" b="B6 A1"/>
+ <a u="4E02" b="81 40"/>
+ <a u="4E03" b="C6 DF"/>
+ <a u="4E04" b="81 41"/>
+ <a u="4E05" b="81 42"/>
+ <a u="4E06" b="81 43"/>
+ <a u="4E07" b="CD F2"/>
+ <a u="4E08" b="D5 C9"/>
+ <a u="4E09" b="C8 FD"/>
+ <a u="4E0A" b="C9 CF"/>
+ <a u="4E0B" b="CF C2"/>
+ <a u="4E0C" b="D8 A2"/>
+ <a u="4E0D" b="B2 BB"/>
+ <a u="4E0E" b="D3 EB"/>
+ <a u="4E0F" b="81 44"/>
+ <a u="4E10" b="D8 A4"/>
+ <a u="4E11" b="B3 F3"/>
+ <a u="4E12" b="81 45"/>
+ <a u="4E13" b="D7 A8"/>
+ <a u="4E14" b="C7 D2"/>
+ <a u="4E15" b="D8 A7"/>
+ <a u="4E16" b="CA C0"/>
+ <a u="4E17" b="81 46"/>
+ <a u="4E18" b="C7 F0"/>
+ <a u="4E19" b="B1 FB"/>
+ <a u="4E1A" b="D2 B5"/>
+ <a u="4E1B" b="B4 D4"/>
+ <a u="4E1C" b="B6 AB"/>
+ <a u="4E1D" b="CB BF"/>
+ <a u="4E1E" b="D8 A9"/>
+ <a u="4E1F" b="81 47"/>
+ <a u="4E20" b="81 48"/>
+ <a u="4E21" b="81 49"/>
+ <a u="4E22" b="B6 AA"/>
+ <a u="4E23" b="81 4A"/>
+ <a u="4E24" b="C1 BD"/>
+ <a u="4E25" b="D1 CF"/>
+ <a u="4E26" b="81 4B"/>
+ <a u="4E27" b="C9 A5"/>
+ <a u="4E28" b="D8 AD"/>
+ <a u="4E29" b="81 4C"/>
+ <a u="4E2A" b="B8 F6"/>
+ <a u="4E2B" b="D1 BE"/>
+ <a u="4E2C" b="E3 DC"/>
+ <a u="4E2D" b="D6 D0"/>
+ <a u="4E2E" b="81 4D"/>
+ <a u="4E2F" b="81 4E"/>
+ <a u="4E30" b="B7 E1"/>
+ <a u="4E31" b="81 4F"/>
+ <a u="4E32" b="B4 AE"/>
+ <a u="4E33" b="81 50"/>
+ <a u="4E34" b="C1 D9"/>
+ <a u="4E35" b="81 51"/>
+ <a u="4E36" b="D8 BC"/>
+ <a u="4E37" b="81 52"/>
+ <a u="4E38" b="CD E8"/>
+ <a u="4E39" b="B5 A4"/>
+ <a u="4E3A" b="CE AA"/>
+ <a u="4E3B" b="D6 F7"/>
+ <a u="4E3C" b="81 53"/>
+ <a u="4E3D" b="C0 F6"/>
+ <a u="4E3E" b="BE D9"/>
+ <a u="4E3F" b="D8 AF"/>
+ <a u="4E40" b="81 54"/>
+ <a u="4E41" b="81 55"/>
+ <a u="4E42" b="81 56"/>
+ <a u="4E43" b="C4 CB"/>
+ <a u="4E44" b="81 57"/>
+ <a u="4E45" b="BE C3"/>
+ <a u="4E46" b="81 58"/>
+ <a u="4E47" b="D8 B1"/>
+ <a u="4E48" b="C3 B4"/>
+ <a u="4E49" b="D2 E5"/>
+ <a u="4E4A" b="81 59"/>
+ <a u="4E4B" b="D6 AE"/>
+ <a u="4E4C" b="CE DA"/>
+ <a u="4E4D" b="D5 A7"/>
+ <a u="4E4E" b="BA F5"/>
+ <a u="4E4F" b="B7 A6"/>
+ <a u="4E50" b="C0 D6"/>
+ <a u="4E51" b="81 5A"/>
+ <a u="4E52" b="C6 B9"/>
+ <a u="4E53" b="C5 D2"/>
+ <a u="4E54" b="C7 C7"/>
+ <a u="4E55" b="81 5B"/>
+ <a u="4E56" b="B9 D4"/>
+ <a u="4E57" b="81 5C"/>
+ <a u="4E58" b="B3 CB"/>
+ <a u="4E59" b="D2 D2"/>
+ <a u="4E5A" b="81 5D"/>
+ <a u="4E5B" b="81 5E"/>
+ <a u="4E5C" b="D8 BF"/>
+ <a u="4E5D" b="BE C5"/>
+ <a u="4E5E" b="C6 F2"/>
+ <a u="4E5F" b="D2 B2"/>
+ <a u="4E60" b="CF B0"/>
+ <a u="4E61" b="CF E7"/>
+ <a u="4E62" b="81 5F"/>
+ <a u="4E63" b="81 60"/>
+ <a u="4E64" b="81 61"/>
+ <a u="4E65" b="81 62"/>
+ <a u="4E66" b="CA E9"/>
+ <a u="4E67" b="81 63"/>
+ <a u="4E68" b="81 64"/>
+ <a u="4E69" b="D8 C0"/>
+ <a u="4E6A" b="81 65"/>
+ <a u="4E6B" b="81 66"/>
+ <a u="4E6C" b="81 67"/>
+ <a u="4E6D" b="81 68"/>
+ <a u="4E6E" b="81 69"/>
+ <a u="4E6F" b="81 6A"/>
+ <a u="4E70" b="C2 F2"/>
+ <a u="4E71" b="C2 D2"/>
+ <a u="4E72" b="81 6B"/>
+ <a u="4E73" b="C8 E9"/>
+ <a u="4E74" b="81 6C"/>
+ <a u="4E75" b="81 6D"/>
+ <a u="4E76" b="81 6E"/>
+ <a u="4E77" b="81 6F"/>
+ <a u="4E78" b="81 70"/>
+ <a u="4E79" b="81 71"/>
+ <a u="4E7A" b="81 72"/>
+ <a u="4E7B" b="81 73"/>
+ <a u="4E7C" b="81 74"/>
+ <a u="4E7D" b="81 75"/>
+ <a u="4E7E" b="C7 AC"/>
+ <a u="4E7F" b="81 76"/>
+ <a u="4E80" b="81 77"/>
+ <a u="4E81" b="81 78"/>
+ <a u="4E82" b="81 79"/>
+ <a u="4E83" b="81 7A"/>
+ <a u="4E84" b="81 7B"/>
+ <a u="4E85" b="81 7C"/>
+ <a u="4E86" b="C1 CB"/>
+ <a u="4E87" b="81 7D"/>
+ <a u="4E88" b="D3 E8"/>
+ <a u="4E89" b="D5 F9"/>
+ <a u="4E8A" b="81 7E"/>
+ <a u="4E8B" b="CA C2"/>
+ <a u="4E8C" b="B6 FE"/>
+ <a u="4E8D" b="D8 A1"/>
+ <a u="4E8E" b="D3 DA"/>
+ <a u="4E8F" b="BF F7"/>
+ <a u="4E90" b="81 80"/>
+ <a u="4E91" b="D4 C6"/>
+ <a u="4E92" b="BB A5"/>
+ <a u="4E93" b="D8 C1"/>
+ <a u="4E94" b="CE E5"/>
+ <a u="4E95" b="BE AE"/>
+ <a u="4E96" b="81 81"/>
+ <a u="4E97" b="81 82"/>
+ <a u="4E98" b="D8 A8"/>
+ <a u="4E99" b="81 83"/>
+ <a u="4E9A" b="D1 C7"/>
+ <a u="4E9B" b="D0 A9"/>
+ <a u="4E9C" b="81 84"/>
+ <a u="4E9D" b="81 85"/>
+ <a u="4E9E" b="81 86"/>
+ <a u="4E9F" b="D8 BD"/>
+ <a u="4EA0" b="D9 EF"/>
+ <a u="4EA1" b="CD F6"/>
+ <a u="4EA2" b="BF BA"/>
+ <a u="4EA3" b="81 87"/>
+ <a u="4EA4" b="BD BB"/>
+ <a u="4EA5" b="BA A5"/>
+ <a u="4EA6" b="D2 E0"/>
+ <a u="4EA7" b="B2 FA"/>
+ <a u="4EA8" b="BA E0"/>
+ <a u="4EA9" b="C4 B6"/>
+ <a u="4EAA" b="81 88"/>
+ <a u="4EAB" b="CF ED"/>
+ <a u="4EAC" b="BE A9"/>
+ <a u="4EAD" b="CD A4"/>
+ <a u="4EAE" b="C1 C1"/>
+ <a u="4EAF" b="81 89"/>
+ <a u="4EB0" b="81 8A"/>
+ <a u="4EB1" b="81 8B"/>
+ <a u="4EB2" b="C7 D7"/>
+ <a u="4EB3" b="D9 F1"/>
+ <a u="4EB4" b="81 8C"/>
+ <a u="4EB5" b="D9 F4"/>
+ <a u="4EB6" b="81 8D"/>
+ <a u="4EB7" b="81 8E"/>
+ <a u="4EB8" b="81 8F"/>
+ <a u="4EB9" b="81 90"/>
+ <a u="4EBA" b="C8 CB"/>
+ <a u="4EBB" b="D8 E9"/>
+ <a u="4EBC" b="81 91"/>
+ <a u="4EBD" b="81 92"/>
+ <a u="4EBE" b="81 93"/>
+ <a u="4EBF" b="D2 DA"/>
+ <a u="4EC0" b="CA B2"/>
+ <a u="4EC1" b="C8 CA"/>
+ <a u="4EC2" b="D8 EC"/>
+ <a u="4EC3" b="D8 EA"/>
+ <a u="4EC4" b="D8 C6"/>
+ <a u="4EC5" b="BD F6"/>
+ <a u="4EC6" b="C6 CD"/>
+ <a u="4EC7" b="B3 F0"/>
+ <a u="4EC8" b="81 94"/>
+ <a u="4EC9" b="D8 EB"/>
+ <a u="4ECA" b="BD F1"/>
+ <a u="4ECB" b="BD E9"/>
+ <a u="4ECC" b="81 95"/>
+ <a u="4ECD" b="C8 D4"/>
+ <a u="4ECE" b="B4 D3"/>
+ <a u="4ECF" b="81 96"/>
+ <a u="4ED0" b="81 97"/>
+ <a u="4ED1" b="C2 D8"/>
+ <a u="4ED2" b="81 98"/>
+ <a u="4ED3" b="B2 D6"/>
+ <a u="4ED4" b="D7 D0"/>
+ <a u="4ED5" b="CA CB"/>
+ <a u="4ED6" b="CB FB"/>
+ <a u="4ED7" b="D5 CC"/>
+ <a u="4ED8" b="B8 B6"/>
+ <a u="4ED9" b="CF C9"/>
+ <a u="4EDA" b="81 99"/>
+ <a u="4EDB" b="81 9A"/>
+ <a u="4EDC" b="81 9B"/>
+ <a u="4EDD" b="D9 DA"/>
+ <a u="4EDE" b="D8 F0"/>
+ <a u="4EDF" b="C7 AA"/>
+ <a u="4EE0" b="81 9C"/>
+ <a u="4EE1" b="D8 EE"/>
+ <a u="4EE2" b="81 9D"/>
+ <a u="4EE3" b="B4 FA"/>
+ <a u="4EE4" b="C1 EE"/>
+ <a u="4EE5" b="D2 D4"/>
+ <a u="4EE6" b="81 9E"/>
+ <a u="4EE7" b="81 9F"/>
+ <a u="4EE8" b="D8 ED"/>
+ <a u="4EE9" b="81 A0"/>
+ <a u="4EEA" b="D2 C7"/>
+ <a u="4EEB" b="D8 EF"/>
+ <a u="4EEC" b="C3 C7"/>
+ <a u="4EED" b="81 A1"/>
+ <a u="4EEE" b="81 A2"/>
+ <a u="4EEF" b="81 A3"/>
+ <a u="4EF0" b="D1 F6"/>
+ <a u="4EF1" b="81 A4"/>
+ <a u="4EF2" b="D6 D9"/>
+ <a u="4EF3" b="D8 F2"/>
+ <a u="4EF4" b="81 A5"/>
+ <a u="4EF5" b="D8 F5"/>
+ <a u="4EF6" b="BC FE"/>
+ <a u="4EF7" b="BC DB"/>
+ <a u="4EF8" b="81 A6"/>
+ <a u="4EF9" b="81 A7"/>
+ <a u="4EFA" b="81 A8"/>
+ <a u="4EFB" b="C8 CE"/>
+ <a u="4EFC" b="81 A9"/>
+ <a u="4EFD" b="B7 DD"/>
+ <a u="4EFE" b="81 AA"/>
+ <a u="4EFF" b="B7 C2"/>
+ <a u="4F00" b="81 AB"/>
+ <a u="4F01" b="C6 F3"/>
+ <a u="4F02" b="81 AC"/>
+ <a u="4F03" b="81 AD"/>
+ <a u="4F04" b="81 AE"/>
+ <a u="4F05" b="81 AF"/>
+ <a u="4F06" b="81 B0"/>
+ <a u="4F07" b="81 B1"/>
+ <a u="4F08" b="81 B2"/>
+ <a u="4F09" b="D8 F8"/>
+ <a u="4F0A" b="D2 C1"/>
+ <a u="4F0B" b="81 B3"/>
+ <a u="4F0C" b="81 B4"/>
+ <a u="4F0D" b="CE E9"/>
+ <a u="4F0E" b="BC BF"/>
+ <a u="4F0F" b="B7 FC"/>
+ <a u="4F10" b="B7 A5"/>
+ <a u="4F11" b="D0 DD"/>
+ <a u="4F12" b="81 B5"/>
+ <a u="4F13" b="81 B6"/>
+ <a u="4F14" b="81 B7"/>
+ <a u="4F15" b="81 B8"/>
+ <a u="4F16" b="81 B9"/>
+ <a u="4F17" b="D6 DA"/>
+ <a u="4F18" b="D3 C5"/>
+ <a u="4F19" b="BB EF"/>
+ <a u="4F1A" b="BB E1"/>
+ <a u="4F1B" b="D8 F1"/>
+ <a u="4F1C" b="81 BA"/>
+ <a u="4F1D" b="81 BB"/>
+ <a u="4F1E" b="C9 A1"/>
+ <a u="4F1F" b="CE B0"/>
+ <a u="4F20" b="B4 AB"/>
+ <a u="4F21" b="81 BC"/>
+ <a u="4F22" b="D8 F3"/>
+ <a u="4F23" b="81 BD"/>
+ <a u="4F24" b="C9 CB"/>
+ <a u="4F25" b="D8 F6"/>
+ <a u="4F26" b="C2 D7"/>
+ <a u="4F27" b="D8 F7"/>
+ <a u="4F28" b="81 BE"/>
+ <a u="4F29" b="81 BF"/>
+ <a u="4F2A" b="CE B1"/>
+ <a u="4F2B" b="D8 F9"/>
+ <a u="4F2C" b="81 C0"/>
+ <a u="4F2D" b="81 C1"/>
+ <a u="4F2E" b="81 C2"/>
+ <a u="4F2F" b="B2 AE"/>
+ <a u="4F30" b="B9 C0"/>
+ <a u="4F31" b="81 C3"/>
+ <a u="4F32" b="D9 A3"/>
+ <a u="4F33" b="81 C4"/>
+ <a u="4F34" b="B0 E9"/>
+ <a u="4F35" b="81 C5"/>
+ <a u="4F36" b="C1 E6"/>
+ <a u="4F37" b="81 C6"/>
+ <a u="4F38" b="C9 EC"/>
+ <a u="4F39" b="81 C7"/>
+ <a u="4F3A" b="CB C5"/>
+ <a u="4F3B" b="81 C8"/>
+ <a u="4F3C" b="CB C6"/>
+ <a u="4F3D" b="D9 A4"/>
+ <a u="4F3E" b="81 C9"/>
+ <a u="4F3F" b="81 CA"/>
+ <a u="4F40" b="81 CB"/>
+ <a u="4F41" b="81 CC"/>
+ <a u="4F42" b="81 CD"/>
+ <a u="4F43" b="B5 E8"/>
+ <a u="4F44" b="81 CE"/>
+ <a u="4F45" b="81 CF"/>
+ <a u="4F46" b="B5 AB"/>
+ <a u="4F47" b="81 D0"/>
+ <a u="4F48" b="81 D1"/>
+ <a u="4F49" b="81 D2"/>
+ <a u="4F4A" b="81 D3"/>
+ <a u="4F4B" b="81 D4"/>
+ <a u="4F4C" b="81 D5"/>
+ <a u="4F4D" b="CE BB"/>
+ <a u="4F4E" b="B5 CD"/>
+ <a u="4F4F" b="D7 A1"/>
+ <a u="4F50" b="D7 F4"/>
+ <a u="4F51" b="D3 D3"/>
+ <a u="4F52" b="81 D6"/>
+ <a u="4F53" b="CC E5"/>
+ <a u="4F54" b="81 D7"/>
+ <a u="4F55" b="BA CE"/>
+ <a u="4F56" b="81 D8"/>
+ <a u="4F57" b="D9 A2"/>
+ <a u="4F58" b="D9 DC"/>
+ <a u="4F59" b="D3 E0"/>
+ <a u="4F5A" b="D8 FD"/>
+ <a u="4F5B" b="B7 F0"/>
+ <a u="4F5C" b="D7 F7"/>
+ <a u="4F5D" b="D8 FE"/>
+ <a u="4F5E" b="D8 FA"/>
+ <a u="4F5F" b="D9 A1"/>
+ <a u="4F60" b="C4 E3"/>
+ <a u="4F61" b="81 D9"/>
+ <a u="4F62" b="81 DA"/>
+ <a u="4F63" b="D3 B6"/>
+ <a u="4F64" b="D8 F4"/>
+ <a u="4F65" b="D9 DD"/>
+ <a u="4F66" b="81 DB"/>
+ <a u="4F67" b="D8 FB"/>
+ <a u="4F68" b="81 DC"/>
+ <a u="4F69" b="C5 E5"/>
+ <a u="4F6A" b="81 DD"/>
+ <a u="4F6B" b="81 DE"/>
+ <a u="4F6C" b="C0 D0"/>
+ <a u="4F6D" b="81 DF"/>
+ <a u="4F6E" b="81 E0"/>
+ <a u="4F6F" b="D1 F0"/>
+ <a u="4F70" b="B0 DB"/>
+ <a u="4F71" b="81 E1"/>
+ <a u="4F72" b="81 E2"/>
+ <a u="4F73" b="BC D1"/>
+ <a u="4F74" b="D9 A6"/>
+ <a u="4F75" b="81 E3"/>
+ <a u="4F76" b="D9 A5"/>
+ <a u="4F77" b="81 E4"/>
+ <a u="4F78" b="81 E5"/>
+ <a u="4F79" b="81 E6"/>
+ <a u="4F7A" b="81 E7"/>
+ <a u="4F7B" b="D9 AC"/>
+ <a u="4F7C" b="D9 AE"/>
+ <a u="4F7D" b="81 E8"/>
+ <a u="4F7E" b="D9 AB"/>
+ <a u="4F7F" b="CA B9"/>
+ <a u="4F80" b="81 E9"/>
+ <a u="4F81" b="81 EA"/>
+ <a u="4F82" b="81 EB"/>
+ <a u="4F83" b="D9 A9"/>
+ <a u="4F84" b="D6 B6"/>
+ <a u="4F85" b="81 EC"/>
+ <a u="4F86" b="81 ED"/>
+ <a u="4F87" b="81 EE"/>
+ <a u="4F88" b="B3 DE"/>
+ <a u="4F89" b="D9 A8"/>
+ <a u="4F8A" b="81 EF"/>
+ <a u="4F8B" b="C0 FD"/>
+ <a u="4F8C" b="81 F0"/>
+ <a u="4F8D" b="CA CC"/>
+ <a u="4F8E" b="81 F1"/>
+ <a u="4F8F" b="D9 AA"/>
+ <a u="4F90" b="81 F2"/>
+ <a u="4F91" b="D9 A7"/>
+ <a u="4F92" b="81 F3"/>
+ <a u="4F93" b="81 F4"/>
+ <a u="4F94" b="D9 B0"/>
+ <a u="4F95" b="81 F5"/>
+ <a u="4F96" b="81 F6"/>
+ <a u="4F97" b="B6 B1"/>
+ <a u="4F98" b="81 F7"/>
+ <a u="4F99" b="81 F8"/>
+ <a u="4F9A" b="81 F9"/>
+ <a u="4F9B" b="B9 A9"/>
+ <a u="4F9C" b="81 FA"/>
+ <a u="4F9D" b="D2 C0"/>
+ <a u="4F9E" b="81 FB"/>
+ <a u="4F9F" b="81 FC"/>
+ <a u="4FA0" b="CF C0"/>
+ <a u="4FA1" b="81 FD"/>
+ <a u="4FA2" b="81 FE"/>
+ <a u="4FA3" b="C2 C2"/>
+ <a u="4FA4" b="82 40"/>
+ <a u="4FA5" b="BD C4"/>
+ <a u="4FA6" b="D5 EC"/>
+ <a u="4FA7" b="B2 E0"/>
+ <a u="4FA8" b="C7 C8"/>
+ <a u="4FA9" b="BF EB"/>
+ <a u="4FAA" b="D9 AD"/>
+ <a u="4FAB" b="82 41"/>
+ <a u="4FAC" b="D9 AF"/>
+ <a u="4FAD" b="82 42"/>
+ <a u="4FAE" b="CE EA"/>
+ <a u="4FAF" b="BA EE"/>
+ <a u="4FB0" b="82 43"/>
+ <a u="4FB1" b="82 44"/>
+ <a u="4FB2" b="82 45"/>
+ <a u="4FB3" b="82 46"/>
+ <a u="4FB4" b="82 47"/>
+ <a u="4FB5" b="C7 D6"/>
+ <a u="4FB6" b="82 48"/>
+ <a u="4FB7" b="82 49"/>
+ <a u="4FB8" b="82 4A"/>
+ <a u="4FB9" b="82 4B"/>
+ <a u="4FBA" b="82 4C"/>
+ <a u="4FBB" b="82 4D"/>
+ <a u="4FBC" b="82 4E"/>
+ <a u="4FBD" b="82 4F"/>
+ <a u="4FBE" b="82 50"/>
+ <a u="4FBF" b="B1 E3"/>
+ <a u="4FC0" b="82 51"/>
+ <a u="4FC1" b="82 52"/>
+ <a u="4FC2" b="82 53"/>
+ <a u="4FC3" b="B4 D9"/>
+ <a u="4FC4" b="B6 ED"/>
+ <a u="4FC5" b="D9 B4"/>
+ <a u="4FC6" b="82 54"/>
+ <a u="4FC7" b="82 55"/>
+ <a u="4FC8" b="82 56"/>
+ <a u="4FC9" b="82 57"/>
+ <a u="4FCA" b="BF A1"/>
+ <a u="4FCB" b="82 58"/>
+ <a u="4FCC" b="82 59"/>
+ <a u="4FCD" b="82 5A"/>
+ <a u="4FCE" b="D9 DE"/>
+ <a u="4FCF" b="C7 CE"/>
+ <a u="4FD0" b="C0 FE"/>
+ <a u="4FD1" b="D9 B8"/>
+ <a u="4FD2" b="82 5B"/>
+ <a u="4FD3" b="82 5C"/>
+ <a u="4FD4" b="82 5D"/>
+ <a u="4FD5" b="82 5E"/>
+ <a u="4FD6" b="82 5F"/>
+ <a u="4FD7" b="CB D7"/>
+ <a u="4FD8" b="B7 FD"/>
+ <a u="4FD9" b="82 60"/>
+ <a u="4FDA" b="D9 B5"/>
+ <a u="4FDB" b="82 61"/>
+ <a u="4FDC" b="D9 B7"/>
+ <a u="4FDD" b="B1 A3"/>
+ <a u="4FDE" b="D3 E1"/>
+ <a u="4FDF" b="D9 B9"/>
+ <a u="4FE0" b="82 62"/>
+ <a u="4FE1" b="D0 C5"/>
+ <a u="4FE2" b="82 63"/>
+ <a u="4FE3" b="D9 B6"/>
+ <a u="4FE4" b="82 64"/>
+ <a u="4FE5" b="82 65"/>
+ <a u="4FE6" b="D9 B1"/>
+ <a u="4FE7" b="82 66"/>
+ <a u="4FE8" b="D9 B2"/>
+ <a u="4FE9" b="C1 A9"/>
+ <a u="4FEA" b="D9 B3"/>
+ <a u="4FEB" b="82 67"/>
+ <a u="4FEC" b="82 68"/>
+ <a u="4FED" b="BC F3"/>
+ <a u="4FEE" b="D0 DE"/>
+ <a u="4FEF" b="B8 A9"/>
+ <a u="4FF0" b="82 69"/>
+ <a u="4FF1" b="BE E3"/>
+ <a u="4FF2" b="82 6A"/>
+ <a u="4FF3" b="D9 BD"/>
+ <a u="4FF4" b="82 6B"/>
+ <a u="4FF5" b="82 6C"/>
+ <a u="4FF6" b="82 6D"/>
+ <a u="4FF7" b="82 6E"/>
+ <a u="4FF8" b="D9 BA"/>
+ <a u="4FF9" b="82 6F"/>
+ <a u="4FFA" b="B0 B3"/>
+ <a u="4FFB" b="82 70"/>
+ <a u="4FFC" b="82 71"/>
+ <a u="4FFD" b="82 72"/>
+ <a u="4FFE" b="D9 C2"/>
+ <a u="4FFF" b="82 73"/>
+ <a u="5000" b="82 74"/>
+ <a u="5001" b="82 75"/>
+ <a u="5002" b="82 76"/>
+ <a u="5003" b="82 77"/>
+ <a u="5004" b="82 78"/>
+ <a u="5005" b="82 79"/>
+ <a u="5006" b="82 7A"/>
+ <a u="5007" b="82 7B"/>
+ <a u="5008" b="82 7C"/>
+ <a u="5009" b="82 7D"/>
+ <a u="500A" b="82 7E"/>
+ <a u="500B" b="82 80"/>
+ <a u="500C" b="D9 C4"/>
+ <a u="500D" b="B1 B6"/>
+ <a u="500E" b="82 81"/>
+ <a u="500F" b="D9 BF"/>
+ <a u="5010" b="82 82"/>
+ <a u="5011" b="82 83"/>
+ <a u="5012" b="B5 B9"/>
+ <a u="5013" b="82 84"/>
+ <a u="5014" b="BE F3"/>
+ <a u="5015" b="82 85"/>
+ <a u="5016" b="82 86"/>
+ <a u="5017" b="82 87"/>
+ <a u="5018" b="CC C8"/>
+ <a u="5019" b="BA F2"/>
+ <a u="501A" b="D2 D0"/>
+ <a u="501B" b="82 88"/>
+ <a u="501C" b="D9 C3"/>
+ <a u="501D" b="82 89"/>
+ <a u="501E" b="82 8A"/>
+ <a u="501F" b="BD E8"/>
+ <a u="5020" b="82 8B"/>
+ <a u="5021" b="B3 AB"/>
+ <a u="5022" b="82 8C"/>
+ <a u="5023" b="82 8D"/>
+ <a u="5024" b="82 8E"/>
+ <a u="5025" b="D9 C5"/>
+ <a u="5026" b="BE EB"/>
+ <a u="5027" b="82 8F"/>
+ <a u="5028" b="D9 C6"/>
+ <a u="5029" b="D9 BB"/>
+ <a u="502A" b="C4 DF"/>
+ <a u="502B" b="82 90"/>
+ <a u="502C" b="D9 BE"/>
+ <a u="502D" b="D9 C1"/>
+ <a u="502E" b="D9 C0"/>
+ <a u="502F" b="82 91"/>
+ <a u="5030" b="82 92"/>
+ <a u="5031" b="82 93"/>
+ <a u="5032" b="82 94"/>
+ <a u="5033" b="82 95"/>
+ <a u="5034" b="82 96"/>
+ <a u="5035" b="82 97"/>
+ <a u="5036" b="82 98"/>
+ <a u="5037" b="82 99"/>
+ <a u="5038" b="82 9A"/>
+ <a u="5039" b="82 9B"/>
+ <a u="503A" b="D5 AE"/>
+ <a u="503B" b="82 9C"/>
+ <a u="503C" b="D6 B5"/>
+ <a u="503D" b="82 9D"/>
+ <a u="503E" b="C7 E3"/>
+ <a u="503F" b="82 9E"/>
+ <a u="5040" b="82 9F"/>
+ <a u="5041" b="82 A0"/>
+ <a u="5042" b="82 A1"/>
+ <a u="5043" b="D9 C8"/>
+ <a u="5044" b="82 A2"/>
+ <a u="5045" b="82 A3"/>
+ <a u="5046" b="82 A4"/>
+ <a u="5047" b="BC D9"/>
+ <a u="5048" b="D9 CA"/>
+ <a u="5049" b="82 A5"/>
+ <a u="504A" b="82 A6"/>
+ <a u="504B" b="82 A7"/>
+ <a u="504C" b="D9 BC"/>
+ <a u="504D" b="82 A8"/>
+ <a u="504E" b="D9 CB"/>
+ <a u="504F" b="C6 AB"/>
+ <a u="5050" b="82 A9"/>
+ <a u="5051" b="82 AA"/>
+ <a u="5052" b="82 AB"/>
+ <a u="5053" b="82 AC"/>
+ <a u="5054" b="82 AD"/>
+ <a u="5055" b="D9 C9"/>
+ <a u="5056" b="82 AE"/>
+ <a u="5057" b="82 AF"/>
+ <a u="5058" b="82 B0"/>
+ <a u="5059" b="82 B1"/>
+ <a u="505A" b="D7 F6"/>
+ <a u="505B" b="82 B2"/>
+ <a u="505C" b="CD A3"/>
+ <a u="505D" b="82 B3"/>
+ <a u="505E" b="82 B4"/>
+ <a u="505F" b="82 B5"/>
+ <a u="5060" b="82 B6"/>
+ <a u="5061" b="82 B7"/>
+ <a u="5062" b="82 B8"/>
+ <a u="5063" b="82 B9"/>
+ <a u="5064" b="82 BA"/>
+ <a u="5065" b="BD A1"/>
+ <a u="5066" b="82 BB"/>
+ <a u="5067" b="82 BC"/>
+ <a u="5068" b="82 BD"/>
+ <a u="5069" b="82 BE"/>
+ <a u="506A" b="82 BF"/>
+ <a u="506B" b="82 C0"/>
+ <a u="506C" b="D9 CC"/>
+ <a u="506D" b="82 C1"/>
+ <a u="506E" b="82 C2"/>
+ <a u="506F" b="82 C3"/>
+ <a u="5070" b="82 C4"/>
+ <a u="5071" b="82 C5"/>
+ <a u="5072" b="82 C6"/>
+ <a u="5073" b="82 C7"/>
+ <a u="5074" b="82 C8"/>
+ <a u="5075" b="82 C9"/>
+ <a u="5076" b="C5 BC"/>
+ <a u="5077" b="CD B5"/>
+ <a u="5078" b="82 CA"/>
+ <a u="5079" b="82 CB"/>
+ <a u="507A" b="82 CC"/>
+ <a u="507B" b="D9 CD"/>
+ <a u="507C" b="82 CD"/>
+ <a u="507D" b="82 CE"/>
+ <a u="507E" b="D9 C7"/>
+ <a u="507F" b="B3 A5"/>
+ <a u="5080" b="BF FE"/>
+ <a u="5081" b="82 CF"/>
+ <a u="5082" b="82 D0"/>
+ <a u="5083" b="82 D1"/>
+ <a u="5084" b="82 D2"/>
+ <a u="5085" b="B8 B5"/>
+ <a u="5086" b="82 D3"/>
+ <a u="5087" b="82 D4"/>
+ <a u="5088" b="C0 FC"/>
+ <a u="5089" b="82 D5"/>
+ <a u="508A" b="82 D6"/>
+ <a u="508B" b="82 D7"/>
+ <a u="508C" b="82 D8"/>
+ <a u="508D" b="B0 F8"/>
+ <a u="508E" b="82 D9"/>
+ <a u="508F" b="82 DA"/>
+ <a u="5090" b="82 DB"/>
+ <a u="5091" b="82 DC"/>
+ <a u="5092" b="82 DD"/>
+ <a u="5093" b="82 DE"/>
+ <a u="5094" b="82 DF"/>
+ <a u="5095" b="82 E0"/>
+ <a u="5096" b="82 E1"/>
+ <a u="5097" b="82 E2"/>
+ <a u="5098" b="82 E3"/>
+ <a u="5099" b="82 E4"/>
+ <a u="509A" b="82 E5"/>
+ <a u="509B" b="82 E6"/>
+ <a u="509C" b="82 E7"/>
+ <a u="509D" b="82 E8"/>
+ <a u="509E" b="82 E9"/>
+ <a u="509F" b="82 EA"/>
+ <a u="50A0" b="82 EB"/>
+ <a u="50A1" b="82 EC"/>
+ <a u="50A2" b="82 ED"/>
+ <a u="50A3" b="B4 F6"/>
+ <a u="50A4" b="82 EE"/>
+ <a u="50A5" b="D9 CE"/>
+ <a u="50A6" b="82 EF"/>
+ <a u="50A7" b="D9 CF"/>
+ <a u="50A8" b="B4 A2"/>
+ <a u="50A9" b="D9 D0"/>
+ <a u="50AA" b="82 F0"/>
+ <a u="50AB" b="82 F1"/>
+ <a u="50AC" b="B4 DF"/>
+ <a u="50AD" b="82 F2"/>
+ <a u="50AE" b="82 F3"/>
+ <a u="50AF" b="82 F4"/>
+ <a u="50B0" b="82 F5"/>
+ <a u="50B1" b="82 F6"/>
+ <a u="50B2" b="B0 C1"/>
+ <a u="50B3" b="82 F7"/>
+ <a u="50B4" b="82 F8"/>
+ <a u="50B5" b="82 F9"/>
+ <a u="50B6" b="82 FA"/>
+ <a u="50B7" b="82 FB"/>
+ <a u="50B8" b="82 FC"/>
+ <a u="50B9" b="82 FD"/>
+ <a u="50BA" b="D9 D1"/>
+ <a u="50BB" b="C9 B5"/>
+ <a u="50BC" b="82 FE"/>
+ <a u="50BD" b="83 40"/>
+ <a u="50BE" b="83 41"/>
+ <a u="50BF" b="83 42"/>
+ <a u="50C0" b="83 43"/>
+ <a u="50C1" b="83 44"/>
+ <a u="50C2" b="83 45"/>
+ <a u="50C3" b="83 46"/>
+ <a u="50C4" b="83 47"/>
+ <a u="50C5" b="83 48"/>
+ <a u="50C6" b="83 49"/>
+ <a u="50C7" b="83 4A"/>
+ <a u="50C8" b="83 4B"/>
+ <a u="50C9" b="83 4C"/>
+ <a u="50CA" b="83 4D"/>
+ <a u="50CB" b="83 4E"/>
+ <a u="50CC" b="83 4F"/>
+ <a u="50CD" b="83 50"/>
+ <a u="50CE" b="83 51"/>
+ <a u="50CF" b="CF F1"/>
+ <a u="50D0" b="83 52"/>
+ <a u="50D1" b="83 53"/>
+ <a u="50D2" b="83 54"/>
+ <a u="50D3" b="83 55"/>
+ <a u="50D4" b="83 56"/>
+ <a u="50D5" b="83 57"/>
+ <a u="50D6" b="D9 D2"/>
+ <a u="50D7" b="83 58"/>
+ <a u="50D8" b="83 59"/>
+ <a u="50D9" b="83 5A"/>
+ <a u="50DA" b="C1 C5"/>
+ <a u="50DB" b="83 5B"/>
+ <a u="50DC" b="83 5C"/>
+ <a u="50DD" b="83 5D"/>
+ <a u="50DE" b="83 5E"/>
+ <a u="50DF" b="83 5F"/>
+ <a u="50E0" b="83 60"/>
+ <a u="50E1" b="83 61"/>
+ <a u="50E2" b="83 62"/>
+ <a u="50E3" b="83 63"/>
+ <a u="50E4" b="83 64"/>
+ <a u="50E5" b="83 65"/>
+ <a u="50E6" b="D9 D6"/>
+ <a u="50E7" b="C9 AE"/>
+ <a u="50E8" b="83 66"/>
+ <a u="50E9" b="83 67"/>
+ <a u="50EA" b="83 68"/>
+ <a u="50EB" b="83 69"/>
+ <a u="50EC" b="D9 D5"/>
+ <a u="50ED" b="D9 D4"/>
+ <a u="50EE" b="D9 D7"/>
+ <a u="50EF" b="83 6A"/>
+ <a u="50F0" b="83 6B"/>
+ <a u="50F1" b="83 6C"/>
+ <a u="50F2" b="83 6D"/>
+ <a u="50F3" b="CB DB"/>
+ <a u="50F4" b="83 6E"/>
+ <a u="50F5" b="BD A9"/>
+ <a u="50F6" b="83 6F"/>
+ <a u="50F7" b="83 70"/>
+ <a u="50F8" b="83 71"/>
+ <a u="50F9" b="83 72"/>
+ <a u="50FA" b="83 73"/>
+ <a u="50FB" b="C6 A7"/>
+ <a u="50FC" b="83 74"/>
+ <a u="50FD" b="83 75"/>
+ <a u="50FE" b="83 76"/>
+ <a u="50FF" b="83 77"/>
+ <a u="5100" b="83 78"/>
+ <a u="5101" b="83 79"/>
+ <a u="5102" b="83 7A"/>
+ <a u="5103" b="83 7B"/>
+ <a u="5104" b="83 7C"/>
+ <a u="5105" b="83 7D"/>
+ <a u="5106" b="D9 D3"/>
+ <a u="5107" b="D9 D8"/>
+ <a u="5108" b="83 7E"/>
+ <a u="5109" b="83 80"/>
+ <a u="510A" b="83 81"/>
+ <a u="510B" b="D9 D9"/>
+ <a u="510C" b="83 82"/>
+ <a u="510D" b="83 83"/>
+ <a u="510E" b="83 84"/>
+ <a u="510F" b="83 85"/>
+ <a u="5110" b="83 86"/>
+ <a u="5111" b="83 87"/>
+ <a u="5112" b="C8 E5"/>
+ <a u="5113" b="83 88"/>
+ <a u="5114" b="83 89"/>
+ <a u="5115" b="83 8A"/>
+ <a u="5116" b="83 8B"/>
+ <a u="5117" b="83 8C"/>
+ <a u="5118" b="83 8D"/>
+ <a u="5119" b="83 8E"/>
+ <a u="511A" b="83 8F"/>
+ <a u="511B" b="83 90"/>
+ <a u="511C" b="83 91"/>
+ <a u="511D" b="83 92"/>
+ <a u="511E" b="83 93"/>
+ <a u="511F" b="83 94"/>
+ <a u="5120" b="83 95"/>
+ <a u="5121" b="C0 DC"/>
+ <a u="5122" b="83 96"/>
+ <a u="5123" b="83 97"/>
+ <a u="5124" b="83 98"/>
+ <a u="5125" b="83 99"/>
+ <a u="5126" b="83 9A"/>
+ <a u="5127" b="83 9B"/>
+ <a u="5128" b="83 9C"/>
+ <a u="5129" b="83 9D"/>
+ <a u="512A" b="83 9E"/>
+ <a u="512B" b="83 9F"/>
+ <a u="512C" b="83 A0"/>
+ <a u="512D" b="83 A1"/>
+ <a u="512E" b="83 A2"/>
+ <a u="512F" b="83 A3"/>
+ <a u="5130" b="83 A4"/>
+ <a u="5131" b="83 A5"/>
+ <a u="5132" b="83 A6"/>
+ <a u="5133" b="83 A7"/>
+ <a u="5134" b="83 A8"/>
+ <a u="5135" b="83 A9"/>
+ <a u="5136" b="83 AA"/>
+ <a u="5137" b="83 AB"/>
+ <a u="5138" b="83 AC"/>
+ <a u="5139" b="83 AD"/>
+ <a u="513A" b="83 AE"/>
+ <a u="513B" b="83 AF"/>
+ <a u="513C" b="83 B0"/>
+ <a u="513D" b="83 B1"/>
+ <a u="513E" b="83 B2"/>
+ <a u="513F" b="B6 F9"/>
+ <a u="5140" b="D8 A3"/>
+ <a u="5141" b="D4 CA"/>
+ <a u="5142" b="83 B3"/>
+ <a u="5143" b="D4 AA"/>
+ <a u="5144" b="D0 D6"/>
+ <a u="5145" b="B3 E4"/>
+ <a u="5146" b="D5 D7"/>
+ <a u="5147" b="83 B4"/>
+ <a u="5148" b="CF C8"/>
+ <a u="5149" b="B9 E2"/>
+ <a u="514A" b="83 B5"/>
+ <a u="514B" b="BF CB"/>
+ <a u="514C" b="83 B6"/>
+ <a u="514D" b="C3 E2"/>
+ <a u="514E" b="83 B7"/>
+ <a u="514F" b="83 B8"/>
+ <a u="5150" b="83 B9"/>
+ <a u="5151" b="B6 D2"/>
+ <a u="5152" b="83 BA"/>
+ <a u="5153" b="83 BB"/>
+ <a u="5154" b="CD C3"/>
+ <a u="5155" b="D9 EE"/>
+ <a u="5156" b="D9 F0"/>
+ <a u="5157" b="83 BC"/>
+ <a u="5158" b="83 BD"/>
+ <a u="5159" b="83 BE"/>
+ <a u="515A" b="B5 B3"/>
+ <a u="515B" b="83 BF"/>
+ <a u="515C" b="B6 B5"/>
+ <a u="515D" b="83 C0"/>
+ <a u="515E" b="83 C1"/>
+ <a u="515F" b="83 C2"/>
+ <a u="5160" b="83 C3"/>
+ <a u="5161" b="83 C4"/>
+ <a u="5162" b="BE A4"/>
+ <a u="5163" b="83 C5"/>
+ <a u="5164" b="83 C6"/>
+ <a u="5165" b="C8 EB"/>
+ <a u="5166" b="83 C7"/>
+ <a u="5167" b="83 C8"/>
+ <a u="5168" b="C8 AB"/>
+ <a u="5169" b="83 C9"/>
+ <a u="516A" b="83 CA"/>
+ <a u="516B" b="B0 CB"/>
+ <a u="516C" b="B9 AB"/>
+ <a u="516D" b="C1 F9"/>
+ <a u="516E" b="D9 E2"/>
+ <a u="516F" b="83 CB"/>
+ <a u="5170" b="C0 BC"/>
+ <a u="5171" b="B9 B2"/>
+ <a u="5172" b="83 CC"/>
+ <a u="5173" b="B9 D8"/>
+ <a u="5174" b="D0 CB"/>
+ <a u="5175" b="B1 F8"/>
+ <a u="5176" b="C6 E4"/>
+ <a u="5177" b="BE DF"/>
+ <a u="5178" b="B5 E4"/>
+ <a u="5179" b="D7 C8"/>
+ <a u="517A" b="83 CD"/>
+ <a u="517B" b="D1 F8"/>
+ <a u="517C" b="BC E6"/>
+ <a u="517D" b="CA DE"/>
+ <a u="517E" b="83 CE"/>
+ <a u="517F" b="83 CF"/>
+ <a u="5180" b="BC BD"/>
+ <a u="5181" b="D9 E6"/>
+ <a u="5182" b="D8 E7"/>
+ <a u="5183" b="83 D0"/>
+ <a u="5184" b="83 D1"/>
+ <a u="5185" b="C4 DA"/>
+ <a u="5186" b="83 D2"/>
+ <a u="5187" b="83 D3"/>
+ <a u="5188" b="B8 D4"/>
+ <a u="5189" b="C8 BD"/>
+ <a u="518A" b="83 D4"/>
+ <a u="518B" b="83 D5"/>
+ <a u="518C" b="B2 E1"/>
+ <a u="518D" b="D4 D9"/>
+ <a u="518E" b="83 D6"/>
+ <a u="518F" b="83 D7"/>
+ <a u="5190" b="83 D8"/>
+ <a u="5191" b="83 D9"/>
+ <a u="5192" b="C3 B0"/>
+ <a u="5193" b="83 DA"/>
+ <a u="5194" b="83 DB"/>
+ <a u="5195" b="C3 E1"/>
+ <a u="5196" b="DA A2"/>
+ <a u="5197" b="C8 DF"/>
+ <a u="5198" b="83 DC"/>
+ <a u="5199" b="D0 B4"/>
+ <a u="519A" b="83 DD"/>
+ <a u="519B" b="BE FC"/>
+ <a u="519C" b="C5 A9"/>
+ <a u="519D" b="83 DE"/>
+ <a u="519E" b="83 DF"/>
+ <a u="519F" b="83 E0"/>
+ <a u="51A0" b="B9 DA"/>
+ <a u="51A1" b="83 E1"/>
+ <a u="51A2" b="DA A3"/>
+ <a u="51A3" b="83 E2"/>
+ <a u="51A4" b="D4 A9"/>
+ <a u="51A5" b="DA A4"/>
+ <a u="51A6" b="83 E3"/>
+ <a u="51A7" b="83 E4"/>
+ <a u="51A8" b="83 E5"/>
+ <a u="51A9" b="83 E6"/>
+ <a u="51AA" b="83 E7"/>
+ <a u="51AB" b="D9 FB"/>
+ <a u="51AC" b="B6 AC"/>
+ <a u="51AD" b="83 E8"/>
+ <a u="51AE" b="83 E9"/>
+ <a u="51AF" b="B7 EB"/>
+ <a u="51B0" b="B1 F9"/>
+ <a u="51B1" b="D9 FC"/>
+ <a u="51B2" b="B3 E5"/>
+ <a u="51B3" b="BE F6"/>
+ <a u="51B4" b="83 EA"/>
+ <a u="51B5" b="BF F6"/>
+ <a u="51B6" b="D2 B1"/>
+ <a u="51B7" b="C0 E4"/>
+ <a u="51B8" b="83 EB"/>
+ <a u="51B9" b="83 EC"/>
+ <a u="51BA" b="83 ED"/>
+ <a u="51BB" b="B6 B3"/>
+ <a u="51BC" b="D9 FE"/>
+ <a u="51BD" b="D9 FD"/>
+ <a u="51BE" b="83 EE"/>
+ <a u="51BF" b="83 EF"/>
+ <a u="51C0" b="BE BB"/>
+ <a u="51C1" b="83 F0"/>
+ <a u="51C2" b="83 F1"/>
+ <a u="51C3" b="83 F2"/>
+ <a u="51C4" b="C6 E0"/>
+ <a u="51C5" b="83 F3"/>
+ <a u="51C6" b="D7 BC"/>
+ <a u="51C7" b="DA A1"/>
+ <a u="51C8" b="83 F4"/>
+ <a u="51C9" b="C1 B9"/>
+ <a u="51CA" b="83 F5"/>
+ <a u="51CB" b="B5 F2"/>
+ <a u="51CC" b="C1 E8"/>
+ <a u="51CD" b="83 F6"/>
+ <a u="51CE" b="83 F7"/>
+ <a u="51CF" b="BC F5"/>
+ <a u="51D0" b="83 F8"/>
+ <a u="51D1" b="B4 D5"/>
+ <a u="51D2" b="83 F9"/>
+ <a u="51D3" b="83 FA"/>
+ <a u="51D4" b="83 FB"/>
+ <a u="51D5" b="83 FC"/>
+ <a u="51D6" b="83 FD"/>
+ <a u="51D7" b="83 FE"/>
+ <a u="51D8" b="84 40"/>
+ <a u="51D9" b="84 41"/>
+ <a u="51DA" b="84 42"/>
+ <a u="51DB" b="C1 DD"/>
+ <a u="51DC" b="84 43"/>
+ <a u="51DD" b="C4 FD"/>
+ <a u="51DE" b="84 44"/>
+ <a u="51DF" b="84 45"/>
+ <a u="51E0" b="BC B8"/>
+ <a u="51E1" b="B7 B2"/>
+ <a u="51E2" b="84 46"/>
+ <a u="51E3" b="84 47"/>
+ <a u="51E4" b="B7 EF"/>
+ <a u="51E5" b="84 48"/>
+ <a u="51E6" b="84 49"/>
+ <a u="51E7" b="84 4A"/>
+ <a u="51E8" b="84 4B"/>
+ <a u="51E9" b="84 4C"/>
+ <a u="51EA" b="84 4D"/>
+ <a u="51EB" b="D9 EC"/>
+ <a u="51EC" b="84 4E"/>
+ <a u="51ED" b="C6 BE"/>
+ <a u="51EE" b="84 4F"/>
+ <a u="51EF" b="BF AD"/>
+ <a u="51F0" b="BB CB"/>
+ <a u="51F1" b="84 50"/>
+ <a u="51F2" b="84 51"/>
+ <a u="51F3" b="B5 CA"/>
+ <a u="51F4" b="84 52"/>
+ <a u="51F5" b="DB C9"/>
+ <a u="51F6" b="D0 D7"/>
+ <a u="51F7" b="84 53"/>
+ <a u="51F8" b="CD B9"/>
+ <a u="51F9" b="B0 BC"/>
+ <a u="51FA" b="B3 F6"/>
+ <a u="51FB" b="BB F7"/>
+ <a u="51FC" b="DB CA"/>
+ <a u="51FD" b="BA AF"/>
+ <a u="51FE" b="84 54"/>
+ <a u="51FF" b="D4 E4"/>
+ <a u="5200" b="B5 B6"/>
+ <a u="5201" b="B5 F3"/>
+ <a u="5202" b="D8 D6"/>
+ <a u="5203" b="C8 D0"/>
+ <a u="5204" b="84 55"/>
+ <a u="5205" b="84 56"/>
+ <a u="5206" b="B7 D6"/>
+ <a u="5207" b="C7 D0"/>
+ <a u="5208" b="D8 D7"/>
+ <a u="5209" b="84 57"/>
+ <a u="520A" b="BF AF"/>
+ <a u="520B" b="84 58"/>
+ <a u="520C" b="84 59"/>
+ <a u="520D" b="DB BB"/>
+ <a u="520E" b="D8 D8"/>
+ <a u="520F" b="84 5A"/>
+ <a u="5210" b="84 5B"/>
+ <a u="5211" b="D0 CC"/>
+ <a u="5212" b="BB AE"/>
+ <a u="5213" b="84 5C"/>
+ <a u="5214" b="84 5D"/>
+ <a u="5215" b="84 5E"/>
+ <a u="5216" b="EB BE"/>
+ <a u="5217" b="C1 D0"/>
+ <a u="5218" b="C1 F5"/>
+ <a u="5219" b="D4 F2"/>
+ <a u="521A" b="B8 D5"/>
+ <a u="521B" b="B4 B4"/>
+ <a u="521C" b="84 5F"/>
+ <a u="521D" b="B3 F5"/>
+ <a u="521E" b="84 60"/>
+ <a u="521F" b="84 61"/>
+ <a u="5220" b="C9 BE"/>
+ <a u="5221" b="84 62"/>
+ <a u="5222" b="84 63"/>
+ <a u="5223" b="84 64"/>
+ <a u="5224" b="C5 D0"/>
+ <a u="5225" b="84 65"/>
+ <a u="5226" b="84 66"/>
+ <a u="5227" b="84 67"/>
+ <a u="5228" b="C5 D9"/>
+ <a u="5229" b="C0 FB"/>
+ <a u="522A" b="84 68"/>
+ <a u="522B" b="B1 F0"/>
+ <a u="522C" b="84 69"/>
+ <a u="522D" b="D8 D9"/>
+ <a u="522E" b="B9 CE"/>
+ <a u="522F" b="84 6A"/>
+ <a u="5230" b="B5 BD"/>
+ <a u="5231" b="84 6B"/>
+ <a u="5232" b="84 6C"/>
+ <a u="5233" b="D8 DA"/>
+ <a u="5234" b="84 6D"/>
+ <a u="5235" b="84 6E"/>
+ <a u="5236" b="D6 C6"/>
+ <a u="5237" b="CB A2"/>
+ <a u="5238" b="C8 AF"/>
+ <a u="5239" b="C9 B2"/>
+ <a u="523A" b="B4 CC"/>
+ <a u="523B" b="BF CC"/>
+ <a u="523C" b="84 6F"/>
+ <a u="523D" b="B9 F4"/>
+ <a u="523E" b="84 70"/>
+ <a u="523F" b="D8 DB"/>
+ <a u="5240" b="D8 DC"/>
+ <a u="5241" b="B6 E7"/>
+ <a u="5242" b="BC C1"/>
+ <a u="5243" b="CC EA"/>
+ <a u="5244" b="84 71"/>
+ <a u="5245" b="84 72"/>
+ <a u="5246" b="84 73"/>
+ <a u="5247" b="84 74"/>
+ <a u="5248" b="84 75"/>
+ <a u="5249" b="84 76"/>
+ <a u="524A" b="CF F7"/>
+ <a u="524B" b="84 77"/>
+ <a u="524C" b="D8 DD"/>
+ <a u="524D" b="C7 B0"/>
+ <a u="524E" b="84 78"/>
+ <a u="524F" b="84 79"/>
+ <a u="5250" b="B9 D0"/>
+ <a u="5251" b="BD A3"/>
+ <a u="5252" b="84 7A"/>
+ <a u="5253" b="84 7B"/>
+ <a u="5254" b="CC DE"/>
+ <a u="5255" b="84 7C"/>
+ <a u="5256" b="C6 CA"/>
+ <a u="5257" b="84 7D"/>
+ <a u="5258" b="84 7E"/>
+ <a u="5259" b="84 80"/>
+ <a u="525A" b="84 81"/>
+ <a u="525B" b="84 82"/>
+ <a u="525C" b="D8 E0"/>
+ <a u="525D" b="84 83"/>
+ <a u="525E" b="D8 DE"/>
+ <a u="525F" b="84 84"/>
+ <a u="5260" b="84 85"/>
+ <a u="5261" b="D8 DF"/>
+ <a u="5262" b="84 86"/>
+ <a u="5263" b="84 87"/>
+ <a u="5264" b="84 88"/>
+ <a u="5265" b="B0 FE"/>
+ <a u="5266" b="84 89"/>
+ <a u="5267" b="BE E7"/>
+ <a u="5268" b="84 8A"/>
+ <a u="5269" b="CA A3"/>
+ <a u="526A" b="BC F4"/>
+ <a u="526B" b="84 8B"/>
+ <a u="526C" b="84 8C"/>
+ <a u="526D" b="84 8D"/>
+ <a u="526E" b="84 8E"/>
+ <a u="526F" b="B8 B1"/>
+ <a u="5270" b="84 8F"/>
+ <a u="5271" b="84 90"/>
+ <a u="5272" b="B8 EE"/>
+ <a u="5273" b="84 91"/>
+ <a u="5274" b="84 92"/>
+ <a u="5275" b="84 93"/>
+ <a u="5276" b="84 94"/>
+ <a u="5277" b="84 95"/>
+ <a u="5278" b="84 96"/>
+ <a u="5279" b="84 97"/>
+ <a u="527A" b="84 98"/>
+ <a u="527B" b="84 99"/>
+ <a u="527C" b="84 9A"/>
+ <a u="527D" b="D8 E2"/>
+ <a u="527E" b="84 9B"/>
+ <a u="527F" b="BD CB"/>
+ <a u="5280" b="84 9C"/>
+ <a u="5281" b="D8 E4"/>
+ <a u="5282" b="D8 E3"/>
+ <a u="5283" b="84 9D"/>
+ <a u="5284" b="84 9E"/>
+ <a u="5285" b="84 9F"/>
+ <a u="5286" b="84 A0"/>
+ <a u="5287" b="84 A1"/>
+ <a u="5288" b="C5 FC"/>
+ <a u="5289" b="84 A2"/>
+ <a u="528A" b="84 A3"/>
+ <a u="528B" b="84 A4"/>
+ <a u="528C" b="84 A5"/>
+ <a u="528D" b="84 A6"/>
+ <a u="528E" b="84 A7"/>
+ <a u="528F" b="84 A8"/>
+ <a u="5290" b="D8 E5"/>
+ <a u="5291" b="84 A9"/>
+ <a u="5292" b="84 AA"/>
+ <a u="5293" b="D8 E6"/>
+ <a u="5294" b="84 AB"/>
+ <a u="5295" b="84 AC"/>
+ <a u="5296" b="84 AD"/>
+ <a u="5297" b="84 AE"/>
+ <a u="5298" b="84 AF"/>
+ <a u="5299" b="84 B0"/>
+ <a u="529A" b="84 B1"/>
+ <a u="529B" b="C1 A6"/>
+ <a u="529C" b="84 B2"/>
+ <a u="529D" b="C8 B0"/>
+ <a u="529E" b="B0 EC"/>
+ <a u="529F" b="B9 A6"/>
+ <a u="52A0" b="BC D3"/>
+ <a u="52A1" b="CE F1"/>
+ <a u="52A2" b="DB BD"/>
+ <a u="52A3" b="C1 D3"/>
+ <a u="52A4" b="84 B3"/>
+ <a u="52A5" b="84 B4"/>
+ <a u="52A6" b="84 B5"/>
+ <a u="52A7" b="84 B6"/>
+ <a u="52A8" b="B6 AF"/>
+ <a u="52A9" b="D6 FA"/>
+ <a u="52AA" b="C5 AC"/>
+ <a u="52AB" b="BD D9"/>
+ <a u="52AC" b="DB BE"/>
+ <a u="52AD" b="DB BF"/>
+ <a u="52AE" b="84 B7"/>
+ <a u="52AF" b="84 B8"/>
+ <a u="52B0" b="84 B9"/>
+ <a u="52B1" b="C0 F8"/>
+ <a u="52B2" b="BE A2"/>
+ <a u="52B3" b="C0 CD"/>
+ <a u="52B4" b="84 BA"/>
+ <a u="52B5" b="84 BB"/>
+ <a u="52B6" b="84 BC"/>
+ <a u="52B7" b="84 BD"/>
+ <a u="52B8" b="84 BE"/>
+ <a u="52B9" b="84 BF"/>
+ <a u="52BA" b="84 C0"/>
+ <a u="52BB" b="84 C1"/>
+ <a u="52BC" b="84 C2"/>
+ <a u="52BD" b="84 C3"/>
+ <a u="52BE" b="DB C0"/>
+ <a u="52BF" b="CA C6"/>
+ <a u="52C0" b="84 C4"/>
+ <a u="52C1" b="84 C5"/>
+ <a u="52C2" b="84 C6"/>
+ <a u="52C3" b="B2 AA"/>
+ <a u="52C4" b="84 C7"/>
+ <a u="52C5" b="84 C8"/>
+ <a u="52C6" b="84 C9"/>
+ <a u="52C7" b="D3 C2"/>
+ <a u="52C8" b="84 CA"/>
+ <a u="52C9" b="C3 E3"/>
+ <a u="52CA" b="84 CB"/>
+ <a u="52CB" b="D1 AB"/>
+ <a u="52CC" b="84 CC"/>
+ <a u="52CD" b="84 CD"/>
+ <a u="52CE" b="84 CE"/>
+ <a u="52CF" b="84 CF"/>
+ <a u="52D0" b="DB C2"/>
+ <a u="52D1" b="84 D0"/>
+ <a u="52D2" b="C0 D5"/>
+ <a u="52D3" b="84 D1"/>
+ <a u="52D4" b="84 D2"/>
+ <a u="52D5" b="84 D3"/>
+ <a u="52D6" b="DB C3"/>
+ <a u="52D7" b="84 D4"/>
+ <a u="52D8" b="BF B1"/>
+ <a u="52D9" b="84 D5"/>
+ <a u="52DA" b="84 D6"/>
+ <a u="52DB" b="84 D7"/>
+ <a u="52DC" b="84 D8"/>
+ <a u="52DD" b="84 D9"/>
+ <a u="52DE" b="84 DA"/>
+ <a u="52DF" b="C4 BC"/>
+ <a u="52E0" b="84 DB"/>
+ <a u="52E1" b="84 DC"/>
+ <a u="52E2" b="84 DD"/>
+ <a u="52E3" b="84 DE"/>
+ <a u="52E4" b="C7 DA"/>
+ <a u="52E5" b="84 DF"/>
+ <a u="52E6" b="84 E0"/>
+ <a u="52E7" b="84 E1"/>
+ <a u="52E8" b="84 E2"/>
+ <a u="52E9" b="84 E3"/>
+ <a u="52EA" b="84 E4"/>
+ <a u="52EB" b="84 E5"/>
+ <a u="52EC" b="84 E6"/>
+ <a u="52ED" b="84 E7"/>
+ <a u="52EE" b="84 E8"/>
+ <a u="52EF" b="84 E9"/>
+ <a u="52F0" b="DB C4"/>
+ <a u="52F1" b="84 EA"/>
+ <a u="52F2" b="84 EB"/>
+ <a u="52F3" b="84 EC"/>
+ <a u="52F4" b="84 ED"/>
+ <a u="52F5" b="84 EE"/>
+ <a u="52F6" b="84 EF"/>
+ <a u="52F7" b="84 F0"/>
+ <a u="52F8" b="84 F1"/>
+ <a u="52F9" b="D9 E8"/>
+ <a u="52FA" b="C9 D7"/>
+ <a u="52FB" b="84 F2"/>
+ <a u="52FC" b="84 F3"/>
+ <a u="52FD" b="84 F4"/>
+ <a u="52FE" b="B9 B4"/>
+ <a u="52FF" b="CE F0"/>
+ <a u="5300" b="D4 C8"/>
+ <a u="5301" b="84 F5"/>
+ <a u="5302" b="84 F6"/>
+ <a u="5303" b="84 F7"/>
+ <a u="5304" b="84 F8"/>
+ <a u="5305" b="B0 FC"/>
+ <a u="5306" b="B4 D2"/>
+ <a u="5307" b="84 F9"/>
+ <a u="5308" b="D0 D9"/>
+ <a u="5309" b="84 FA"/>
+ <a u="530A" b="84 FB"/>
+ <a u="530B" b="84 FC"/>
+ <a u="530C" b="84 FD"/>
+ <a u="530D" b="D9 E9"/>
+ <a u="530E" b="84 FE"/>
+ <a u="530F" b="DE CB"/>
+ <a u="5310" b="D9 EB"/>
+ <a u="5311" b="85 40"/>
+ <a u="5312" b="85 41"/>
+ <a u="5313" b="85 42"/>
+ <a u="5314" b="85 43"/>
+ <a u="5315" b="D8 B0"/>
+ <a u="5316" b="BB AF"/>
+ <a u="5317" b="B1 B1"/>
+ <a u="5318" b="85 44"/>
+ <a u="5319" b="B3 D7"/>
+ <a u="531A" b="D8 CE"/>
+ <a u="531B" b="85 45"/>
+ <a u="531C" b="85 46"/>
+ <a u="531D" b="D4 D1"/>
+ <a u="531E" b="85 47"/>
+ <a u="531F" b="85 48"/>
+ <a u="5320" b="BD B3"/>
+ <a u="5321" b="BF EF"/>
+ <a u="5322" b="85 49"/>
+ <a u="5323" b="CF BB"/>
+ <a u="5324" b="85 4A"/>
+ <a u="5325" b="85 4B"/>
+ <a u="5326" b="D8 D0"/>
+ <a u="5327" b="85 4C"/>
+ <a u="5328" b="85 4D"/>
+ <a u="5329" b="85 4E"/>
+ <a u="532A" b="B7 CB"/>
+ <a u="532B" b="85 4F"/>
+ <a u="532C" b="85 50"/>
+ <a u="532D" b="85 51"/>
+ <a u="532E" b="D8 D1"/>
+ <a u="532F" b="85 52"/>
+ <a u="5330" b="85 53"/>
+ <a u="5331" b="85 54"/>
+ <a u="5332" b="85 55"/>
+ <a u="5333" b="85 56"/>
+ <a u="5334" b="85 57"/>
+ <a u="5335" b="85 58"/>
+ <a u="5336" b="85 59"/>
+ <a u="5337" b="85 5A"/>
+ <a u="5338" b="85 5B"/>
+ <a u="5339" b="C6 A5"/>
+ <a u="533A" b="C7 F8"/>
+ <a u="533B" b="D2 BD"/>
+ <a u="533C" b="85 5C"/>
+ <a u="533D" b="85 5D"/>
+ <a u="533E" b="D8 D2"/>
+ <a u="533F" b="C4 E4"/>
+ <a u="5340" b="85 5E"/>
+ <a u="5341" b="CA AE"/>
+ <a u="5342" b="85 5F"/>
+ <a u="5343" b="C7 A7"/>
+ <a u="5344" b="85 60"/>
+ <a u="5345" b="D8 A6"/>
+ <a u="5346" b="85 61"/>
+ <a u="5347" b="C9 FD"/>
+ <a u="5348" b="CE E7"/>
+ <a u="5349" b="BB DC"/>
+ <a u="534A" b="B0 EB"/>
+ <a u="534B" b="85 62"/>
+ <a u="534C" b="85 63"/>
+ <a u="534D" b="85 64"/>
+ <a u="534E" b="BB AA"/>
+ <a u="534F" b="D0 AD"/>
+ <a u="5350" b="85 65"/>
+ <a u="5351" b="B1 B0"/>
+ <a u="5352" b="D7 E4"/>
+ <a u="5353" b="D7 BF"/>
+ <a u="5354" b="85 66"/>
+ <a u="5355" b="B5 A5"/>
+ <a u="5356" b="C2 F4"/>
+ <a u="5357" b="C4 CF"/>
+ <a u="5358" b="85 67"/>
+ <a u="5359" b="85 68"/>
+ <a u="535A" b="B2 A9"/>
+ <a u="535B" b="85 69"/>
+ <a u="535C" b="B2 B7"/>
+ <a u="535D" b="85 6A"/>
+ <a u="535E" b="B1 E5"/>
+ <a u="535F" b="DF B2"/>
+ <a u="5360" b="D5 BC"/>
+ <a u="5361" b="BF A8"/>
+ <a u="5362" b="C2 AC"/>
+ <a u="5363" b="D8 D5"/>
+ <a u="5364" b="C2 B1"/>
+ <a u="5365" b="85 6B"/>
+ <a u="5366" b="D8 D4"/>
+ <a u="5367" b="CE D4"/>
+ <a u="5368" b="85 6C"/>
+ <a u="5369" b="DA E0"/>
+ <a u="536A" b="85 6D"/>
+ <a u="536B" b="CE C0"/>
+ <a u="536C" b="85 6E"/>
+ <a u="536D" b="85 6F"/>
+ <a u="536E" b="D8 B4"/>
+ <a u="536F" b="C3 AE"/>
+ <a u="5370" b="D3 A1"/>
+ <a u="5371" b="CE A3"/>
+ <a u="5372" b="85 70"/>
+ <a u="5373" b="BC B4"/>
+ <a u="5374" b="C8 B4"/>
+ <a u="5375" b="C2 D1"/>
+ <a u="5376" b="85 71"/>
+ <a u="5377" b="BE ED"/>
+ <a u="5378" b="D0 B6"/>
+ <a u="5379" b="85 72"/>
+ <a u="537A" b="DA E1"/>
+ <a u="537B" b="85 73"/>
+ <a u="537C" b="85 74"/>
+ <a u="537D" b="85 75"/>
+ <a u="537E" b="85 76"/>
+ <a u="537F" b="C7 E4"/>
+ <a u="5380" b="85 77"/>
+ <a u="5381" b="85 78"/>
+ <a u="5382" b="B3 A7"/>
+ <a u="5383" b="85 79"/>
+ <a u="5384" b="B6 F2"/>
+ <a u="5385" b="CC FC"/>
+ <a u="5386" b="C0 FA"/>
+ <a u="5387" b="85 7A"/>
+ <a u="5388" b="85 7B"/>
+ <a u="5389" b="C0 F7"/>
+ <a u="538A" b="85 7C"/>
+ <a u="538B" b="D1 B9"/>
+ <a u="538C" b="D1 E1"/>
+ <a u="538D" b="D8 C7"/>
+ <a u="538E" b="85 7D"/>
+ <a u="538F" b="85 7E"/>
+ <a u="5390" b="85 80"/>
+ <a u="5391" b="85 81"/>
+ <a u="5392" b="85 82"/>
+ <a u="5393" b="85 83"/>
+ <a u="5394" b="85 84"/>
+ <a u="5395" b="B2 DE"/>
+ <a u="5396" b="85 85"/>
+ <a u="5397" b="85 86"/>
+ <a u="5398" b="C0 E5"/>
+ <a u="5399" b="85 87"/>
+ <a u="539A" b="BA F1"/>
+ <a u="539B" b="85 88"/>
+ <a u="539C" b="85 89"/>
+ <a u="539D" b="D8 C8"/>
+ <a u="539E" b="85 8A"/>
+ <a u="539F" b="D4 AD"/>
+ <a u="53A0" b="85 8B"/>
+ <a u="53A1" b="85 8C"/>
+ <a u="53A2" b="CF E1"/>
+ <a u="53A3" b="D8 C9"/>
+ <a u="53A4" b="85 8D"/>
+ <a u="53A5" b="D8 CA"/>
+ <a u="53A6" b="CF C3"/>
+ <a u="53A7" b="85 8E"/>
+ <a u="53A8" b="B3 F8"/>
+ <a u="53A9" b="BE C7"/>
+ <a u="53AA" b="85 8F"/>
+ <a u="53AB" b="85 90"/>
+ <a u="53AC" b="85 91"/>
+ <a u="53AD" b="85 92"/>
+ <a u="53AE" b="D8 CB"/>
+ <a u="53AF" b="85 93"/>
+ <a u="53B0" b="85 94"/>
+ <a u="53B1" b="85 95"/>
+ <a u="53B2" b="85 96"/>
+ <a u="53B3" b="85 97"/>
+ <a u="53B4" b="85 98"/>
+ <a u="53B5" b="85 99"/>
+ <a u="53B6" b="DB CC"/>
+ <a u="53B7" b="85 9A"/>
+ <a u="53B8" b="85 9B"/>
+ <a u="53B9" b="85 9C"/>
+ <a u="53BA" b="85 9D"/>
+ <a u="53BB" b="C8 A5"/>
+ <a u="53BC" b="85 9E"/>
+ <a u="53BD" b="85 9F"/>
+ <a u="53BE" b="85 A0"/>
+ <a u="53BF" b="CF D8"/>
+ <a u="53C0" b="85 A1"/>
+ <a u="53C1" b="C8 FE"/>
+ <a u="53C2" b="B2 CE"/>
+ <a u="53C3" b="85 A2"/>
+ <a u="53C4" b="85 A3"/>
+ <a u="53C5" b="85 A4"/>
+ <a u="53C6" b="85 A5"/>
+ <a u="53C7" b="85 A6"/>
+ <a u="53C8" b="D3 D6"/>
+ <a u="53C9" b="B2 E6"/>
+ <a u="53CA" b="BC B0"/>
+ <a u="53CB" b="D3 D1"/>
+ <a u="53CC" b="CB AB"/>
+ <a u="53CD" b="B7 B4"/>
+ <a u="53CE" b="85 A7"/>
+ <a u="53CF" b="85 A8"/>
+ <a u="53D0" b="85 A9"/>
+ <a u="53D1" b="B7 A2"/>
+ <a u="53D2" b="85 AA"/>
+ <a u="53D3" b="85 AB"/>
+ <a u="53D4" b="CA E5"/>
+ <a u="53D5" b="85 AC"/>
+ <a u="53D6" b="C8 A1"/>
+ <a u="53D7" b="CA DC"/>
+ <a u="53D8" b="B1 E4"/>
+ <a u="53D9" b="D0 F0"/>
+ <a u="53DA" b="85 AD"/>
+ <a u="53DB" b="C5 D1"/>
+ <a u="53DC" b="85 AE"/>
+ <a u="53DD" b="85 AF"/>
+ <a u="53DE" b="85 B0"/>
+ <a u="53DF" b="DB C5"/>
+ <a u="53E0" b="B5 FE"/>
+ <a u="53E1" b="85 B1"/>
+ <a u="53E2" b="85 B2"/>
+ <a u="53E3" b="BF DA"/>
+ <a u="53E4" b="B9 C5"/>
+ <a u="53E5" b="BE E4"/>
+ <a u="53E6" b="C1 ED"/>
+ <a u="53E7" b="85 B3"/>
+ <a u="53E8" b="DF B6"/>
+ <a u="53E9" b="DF B5"/>
+ <a u="53EA" b="D6 BB"/>
+ <a u="53EB" b="BD D0"/>
+ <a u="53EC" b="D5 D9"/>
+ <a u="53ED" b="B0 C8"/>
+ <a u="53EE" b="B6 A3"/>
+ <a u="53EF" b="BF C9"/>
+ <a u="53F0" b="CC A8"/>
+ <a u="53F1" b="DF B3"/>
+ <a u="53F2" b="CA B7"/>
+ <a u="53F3" b="D3 D2"/>
+ <a u="53F4" b="85 B4"/>
+ <a u="53F5" b="D8 CF"/>
+ <a u="53F6" b="D2 B6"/>
+ <a u="53F7" b="BA C5"/>
+ <a u="53F8" b="CB BE"/>
+ <a u="53F9" b="CC BE"/>
+ <a u="53FA" b="85 B5"/>
+ <a u="53FB" b="DF B7"/>
+ <a u="53FC" b="B5 F0"/>
+ <a u="53FD" b="DF B4"/>
+ <a u="53FE" b="85 B6"/>
+ <a u="53FF" b="85 B7"/>
+ <a u="5400" b="85 B8"/>
+ <a u="5401" b="D3 F5"/>
+ <a u="5402" b="85 B9"/>
+ <a u="5403" b="B3 D4"/>
+ <a u="5404" b="B8 F7"/>
+ <a u="5405" b="85 BA"/>
+ <a u="5406" b="DF BA"/>
+ <a u="5407" b="85 BB"/>
+ <a u="5408" b="BA CF"/>
+ <a u="5409" b="BC AA"/>
+ <a u="540A" b="B5 F5"/>
+ <a u="540B" b="85 BC"/>
+ <a u="540C" b="CD AC"/>
+ <a u="540D" b="C3 FB"/>
+ <a u="540E" b="BA F3"/>
+ <a u="540F" b="C0 F4"/>
+ <a u="5410" b="CD C2"/>
+ <a u="5411" b="CF F2"/>
+ <a u="5412" b="DF B8"/>
+ <a u="5413" b="CF C5"/>
+ <a u="5414" b="85 BD"/>
+ <a u="5415" b="C2 C0"/>
+ <a u="5416" b="DF B9"/>
+ <a u="5417" b="C2 F0"/>
+ <a u="5418" b="85 BE"/>
+ <a u="5419" b="85 BF"/>
+ <a u="541A" b="85 C0"/>
+ <a u="541B" b="BE FD"/>
+ <a u="541C" b="85 C1"/>
+ <a u="541D" b="C1 DF"/>
+ <a u="541E" b="CD CC"/>
+ <a u="541F" b="D2 F7"/>
+ <a u="5420" b="B7 CD"/>
+ <a u="5421" b="DF C1"/>
+ <a u="5422" b="85 C2"/>
+ <a u="5423" b="DF C4"/>
+ <a u="5424" b="85 C3"/>
+ <a u="5425" b="85 C4"/>
+ <a u="5426" b="B7 F1"/>
+ <a u="5427" b="B0 C9"/>
+ <a u="5428" b="B6 D6"/>
+ <a u="5429" b="B7 D4"/>
+ <a u="542A" b="85 C5"/>
+ <a u="542B" b="BA AC"/>
+ <a u="542C" b="CC FD"/>
+ <a u="542D" b="BF D4"/>
+ <a u="542E" b="CB B1"/>
+ <a u="542F" b="C6 F4"/>
+ <a u="5430" b="85 C6"/>
+ <a u="5431" b="D6 A8"/>
+ <a u="5432" b="DF C5"/>
+ <a u="5433" b="85 C7"/>
+ <a u="5434" b="CE E2"/>
+ <a u="5435" b="B3 B3"/>
+ <a u="5436" b="85 C8"/>
+ <a u="5437" b="85 C9"/>
+ <a u="5438" b="CE FC"/>
+ <a u="5439" b="B4 B5"/>
+ <a u="543A" b="85 CA"/>
+ <a u="543B" b="CE C7"/>
+ <a u="543C" b="BA F0"/>
+ <a u="543D" b="85 CB"/>
+ <a u="543E" b="CE E1"/>
+ <a u="543F" b="85 CC"/>
+ <a u="5440" b="D1 BD"/>
+ <a u="5441" b="85 CD"/>
+ <a u="5442" b="85 CE"/>
+ <a u="5443" b="DF C0"/>
+ <a u="5444" b="85 CF"/>
+ <a u="5445" b="85 D0"/>
+ <a u="5446" b="B4 F4"/>
+ <a u="5447" b="85 D1"/>
+ <a u="5448" b="B3 CA"/>
+ <a u="5449" b="85 D2"/>
+ <a u="544A" b="B8 E6"/>
+ <a u="544B" b="DF BB"/>
+ <a u="544C" b="85 D3"/>
+ <a u="544D" b="85 D4"/>
+ <a u="544E" b="85 D5"/>
+ <a u="544F" b="85 D6"/>
+ <a u="5450" b="C4 C5"/>
+ <a u="5451" b="85 D7"/>
+ <a u="5452" b="DF BC"/>
+ <a u="5453" b="DF BD"/>
+ <a u="5454" b="DF BE"/>
+ <a u="5455" b="C5 BB"/>
+ <a u="5456" b="DF BF"/>
+ <a u="5457" b="DF C2"/>
+ <a u="5458" b="D4 B1"/>
+ <a u="5459" b="DF C3"/>
+ <a u="545A" b="85 D8"/>
+ <a u="545B" b="C7 BA"/>
+ <a u="545C" b="CE D8"/>
+ <a u="545D" b="85 D9"/>
+ <a u="545E" b="85 DA"/>
+ <a u="545F" b="85 DB"/>
+ <a u="5460" b="85 DC"/>
+ <a u="5461" b="85 DD"/>
+ <a u="5462" b="C4 D8"/>
+ <a u="5463" b="85 DE"/>
+ <a u="5464" b="DF CA"/>
+ <a u="5465" b="85 DF"/>
+ <a u="5466" b="DF CF"/>
+ <a u="5467" b="85 E0"/>
+ <a u="5468" b="D6 DC"/>
+ <a u="5469" b="85 E1"/>
+ <a u="546A" b="85 E2"/>
+ <a u="546B" b="85 E3"/>
+ <a u="546C" b="85 E4"/>
+ <a u="546D" b="85 E5"/>
+ <a u="546E" b="85 E6"/>
+ <a u="546F" b="85 E7"/>
+ <a u="5470" b="85 E8"/>
+ <a u="5471" b="DF C9"/>
+ <a u="5472" b="DF DA"/>
+ <a u="5473" b="CE B6"/>
+ <a u="5474" b="85 E9"/>
+ <a u="5475" b="BA C7"/>
+ <a u="5476" b="DF CE"/>
+ <a u="5477" b="DF C8"/>
+ <a u="5478" b="C5 DE"/>
+ <a u="5479" b="85 EA"/>
+ <a u="547A" b="85 EB"/>
+ <a u="547B" b="C9 EB"/>
+ <a u="547C" b="BA F4"/>
+ <a u="547D" b="C3 FC"/>
+ <a u="547E" b="85 EC"/>
+ <a u="547F" b="85 ED"/>
+ <a u="5480" b="BE D7"/>
+ <a u="5481" b="85 EE"/>
+ <a u="5482" b="DF C6"/>
+ <a u="5483" b="85 EF"/>
+ <a u="5484" b="DF CD"/>
+ <a u="5485" b="85 F0"/>
+ <a u="5486" b="C5 D8"/>
+ <a u="5487" b="85 F1"/>
+ <a u="5488" b="85 F2"/>
+ <a u="5489" b="85 F3"/>
+ <a u="548A" b="85 F4"/>
+ <a u="548B" b="D5 A6"/>
+ <a u="548C" b="BA CD"/>
+ <a u="548D" b="85 F5"/>
+ <a u="548E" b="BE CC"/>
+ <a u="548F" b="D3 BD"/>
+ <a u="5490" b="B8 C0"/>
+ <a u="5491" b="85 F6"/>
+ <a u="5492" b="D6 E4"/>
+ <a u="5493" b="85 F7"/>
+ <a u="5494" b="DF C7"/>
+ <a u="5495" b="B9 BE"/>
+ <a u="5496" b="BF A7"/>
+ <a u="5497" b="85 F8"/>
+ <a u="5498" b="85 F9"/>
+ <a u="5499" b="C1 FC"/>
+ <a u="549A" b="DF CB"/>
+ <a u="549B" b="DF CC"/>
+ <a u="549C" b="85 FA"/>
+ <a u="549D" b="DF D0"/>
+ <a u="549E" b="85 FB"/>
+ <a u="549F" b="85 FC"/>
+ <a u="54A0" b="85 FD"/>
+ <a u="54A1" b="85 FE"/>
+ <a u="54A2" b="86 40"/>
+ <a u="54A3" b="DF DB"/>
+ <a u="54A4" b="DF E5"/>
+ <a u="54A5" b="86 41"/>
+ <a u="54A6" b="DF D7"/>
+ <a u="54A7" b="DF D6"/>
+ <a u="54A8" b="D7 C9"/>
+ <a u="54A9" b="DF E3"/>
+ <a u="54AA" b="DF E4"/>
+ <a u="54AB" b="E5 EB"/>
+ <a u="54AC" b="D2 A7"/>
+ <a u="54AD" b="DF D2"/>
+ <a u="54AE" b="86 42"/>
+ <a u="54AF" b="BF A9"/>
+ <a u="54B0" b="86 43"/>
+ <a u="54B1" b="D4 DB"/>
+ <a u="54B2" b="86 44"/>
+ <a u="54B3" b="BF C8"/>
+ <a u="54B4" b="DF D4"/>
+ <a u="54B5" b="86 45"/>
+ <a u="54B6" b="86 46"/>
+ <a u="54B7" b="86 47"/>
+ <a u="54B8" b="CF CC"/>
+ <a u="54B9" b="86 48"/>
+ <a u="54BA" b="86 49"/>
+ <a u="54BB" b="DF DD"/>
+ <a u="54BC" b="86 4A"/>
+ <a u="54BD" b="D1 CA"/>
+ <a u="54BE" b="86 4B"/>
+ <a u="54BF" b="DF DE"/>
+ <a u="54C0" b="B0 A7"/>
+ <a u="54C1" b="C6 B7"/>
+ <a u="54C2" b="DF D3"/>
+ <a u="54C3" b="86 4C"/>
+ <a u="54C4" b="BA E5"/>
+ <a u="54C5" b="86 4D"/>
+ <a u="54C6" b="B6 DF"/>
+ <a u="54C7" b="CD DB"/>
+ <a u="54C8" b="B9 FE"/>
+ <a u="54C9" b="D4 D5"/>
+ <a u="54CA" b="86 4E"/>
+ <a u="54CB" b="86 4F"/>
+ <a u="54CC" b="DF DF"/>
+ <a u="54CD" b="CF EC"/>
+ <a u="54CE" b="B0 A5"/>
+ <a u="54CF" b="DF E7"/>
+ <a u="54D0" b="DF D1"/>
+ <a u="54D1" b="D1 C6"/>
+ <a u="54D2" b="DF D5"/>
+ <a u="54D3" b="DF D8"/>
+ <a u="54D4" b="DF D9"/>
+ <a u="54D5" b="DF DC"/>
+ <a u="54D6" b="86 50"/>
+ <a u="54D7" b="BB A9"/>
+ <a u="54D8" b="86 51"/>
+ <a u="54D9" b="DF E0"/>
+ <a u="54DA" b="DF E1"/>
+ <a u="54DB" b="86 52"/>
+ <a u="54DC" b="DF E2"/>
+ <a u="54DD" b="DF E6"/>
+ <a u="54DE" b="DF E8"/>
+ <a u="54DF" b="D3 B4"/>
+ <a u="54E0" b="86 53"/>
+ <a u="54E1" b="86 54"/>
+ <a u="54E2" b="86 55"/>
+ <a u="54E3" b="86 56"/>
+ <a u="54E4" b="86 57"/>
+ <a u="54E5" b="B8 E7"/>
+ <a u="54E6" b="C5 B6"/>
+ <a u="54E7" b="DF EA"/>
+ <a u="54E8" b="C9 DA"/>
+ <a u="54E9" b="C1 A8"/>
+ <a u="54EA" b="C4 C4"/>
+ <a u="54EB" b="86 58"/>
+ <a u="54EC" b="86 59"/>
+ <a u="54ED" b="BF DE"/>
+ <a u="54EE" b="CF F8"/>
+ <a u="54EF" b="86 5A"/>
+ <a u="54F0" b="86 5B"/>
+ <a u="54F1" b="86 5C"/>
+ <a u="54F2" b="D5 DC"/>
+ <a u="54F3" b="DF EE"/>
+ <a u="54F4" b="86 5D"/>
+ <a u="54F5" b="86 5E"/>
+ <a u="54F6" b="86 5F"/>
+ <a u="54F7" b="86 60"/>
+ <a u="54F8" b="86 61"/>
+ <a u="54F9" b="86 62"/>
+ <a u="54FA" b="B2 B8"/>
+ <a u="54FB" b="86 63"/>
+ <a u="54FC" b="BA DF"/>
+ <a u="54FD" b="DF EC"/>
+ <a u="54FE" b="86 64"/>
+ <a u="54FF" b="DB C1"/>
+ <a u="5500" b="86 65"/>
+ <a u="5501" b="D1 E4"/>
+ <a u="5502" b="86 66"/>
+ <a u="5503" b="86 67"/>
+ <a u="5504" b="86 68"/>
+ <a u="5505" b="86 69"/>
+ <a u="5506" b="CB F4"/>
+ <a u="5507" b="B4 BD"/>
+ <a u="5508" b="86 6A"/>
+ <a u="5509" b="B0 A6"/>
+ <a u="550A" b="86 6B"/>
+ <a u="550B" b="86 6C"/>
+ <a u="550C" b="86 6D"/>
+ <a u="550D" b="86 6E"/>
+ <a u="550E" b="86 6F"/>
+ <a u="550F" b="DF F1"/>
+ <a u="5510" b="CC C6"/>
+ <a u="5511" b="DF F2"/>
+ <a u="5512" b="86 70"/>
+ <a u="5513" b="86 71"/>
+ <a u="5514" b="DF ED"/>
+ <a u="5515" b="86 72"/>
+ <a u="5516" b="86 73"/>
+ <a u="5517" b="86 74"/>
+ <a u="5518" b="86 75"/>
+ <a u="5519" b="86 76"/>
+ <a u="551A" b="86 77"/>
+ <a u="551B" b="DF E9"/>
+ <a u="551C" b="86 78"/>
+ <a u="551D" b="86 79"/>
+ <a u="551E" b="86 7A"/>
+ <a u="551F" b="86 7B"/>
+ <a u="5520" b="DF EB"/>
+ <a u="5521" b="86 7C"/>
+ <a u="5522" b="DF EF"/>
+ <a u="5523" b="DF F0"/>
+ <a u="5524" b="BB BD"/>
+ <a u="5525" b="86 7D"/>
+ <a u="5526" b="86 7E"/>
+ <a u="5527" b="DF F3"/>
+ <a u="5528" b="86 80"/>
+ <a u="5529" b="86 81"/>
+ <a u="552A" b="DF F4"/>
+ <a u="552B" b="86 82"/>
+ <a u="552C" b="BB A3"/>
+ <a u="552D" b="86 83"/>
+ <a u="552E" b="CA DB"/>
+ <a u="552F" b="CE A8"/>
+ <a u="5530" b="E0 A7"/>
+ <a u="5531" b="B3 AA"/>
+ <a u="5532" b="86 84"/>
+ <a u="5533" b="E0 A6"/>
+ <a u="5534" b="86 85"/>
+ <a u="5535" b="86 86"/>
+ <a u="5536" b="86 87"/>
+ <a u="5537" b="E0 A1"/>
+ <a u="5538" b="86 88"/>
+ <a u="5539" b="86 89"/>
+ <a u="553A" b="86 8A"/>
+ <a u="553B" b="86 8B"/>
+ <a u="553C" b="DF FE"/>
+ <a u="553D" b="86 8C"/>
+ <a u="553E" b="CD D9"/>
+ <a u="553F" b="DF FC"/>
+ <a u="5540" b="86 8D"/>
+ <a u="5541" b="DF FA"/>
+ <a u="5542" b="86 8E"/>
+ <a u="5543" b="BF D0"/>
+ <a u="5544" b="D7 C4"/>
+ <a u="5545" b="86 8F"/>
+ <a u="5546" b="C9 CC"/>
+ <a u="5547" b="86 90"/>
+ <a u="5548" b="86 91"/>
+ <a u="5549" b="DF F8"/>
+ <a u="554A" b="B0 A1"/>
+ <a u="554B" b="86 92"/>
+ <a u="554C" b="86 93"/>
+ <a u="554D" b="86 94"/>
+ <a u="554E" b="86 95"/>
+ <a u="554F" b="86 96"/>
+ <a u="5550" b="DF FD"/>
+ <a u="5551" b="86 97"/>
+ <a u="5552" b="86 98"/>
+ <a u="5553" b="86 99"/>
+ <a u="5554" b="86 9A"/>
+ <a u="5555" b="DF FB"/>
+ <a u="5556" b="E0 A2"/>
+ <a u="5557" b="86 9B"/>
+ <a u="5558" b="86 9C"/>
+ <a u="5559" b="86 9D"/>
+ <a u="555A" b="86 9E"/>
+ <a u="555B" b="86 9F"/>
+ <a u="555C" b="E0 A8"/>
+ <a u="555D" b="86 A0"/>
+ <a u="555E" b="86 A1"/>
+ <a u="555F" b="86 A2"/>
+ <a u="5560" b="86 A3"/>
+ <a u="5561" b="B7 C8"/>
+ <a u="5562" b="86 A4"/>
+ <a u="5563" b="86 A5"/>
+ <a u="5564" b="C6 A1"/>
+ <a u="5565" b="C9 B6"/>
+ <a u="5566" b="C0 B2"/>
+ <a u="5567" b="DF F5"/>
+ <a u="5568" b="86 A6"/>
+ <a u="5569" b="86 A7"/>
+ <a u="556A" b="C5 BE"/>
+ <a u="556B" b="86 A8"/>
+ <a u="556C" b="D8 C4"/>
+ <a u="556D" b="DF F9"/>
+ <a u="556E" b="C4 F6"/>
+ <a u="556F" b="86 A9"/>
+ <a u="5570" b="86 AA"/>
+ <a u="5571" b="86 AB"/>
+ <a u="5572" b="86 AC"/>
+ <a u="5573" b="86 AD"/>
+ <a u="5574" b="86 AE"/>
+ <a u="5575" b="E0 A3"/>
+ <a u="5576" b="E0 A4"/>
+ <a u="5577" b="E0 A5"/>
+ <a u="5578" b="D0 A5"/>
+ <a u="5579" b="86 AF"/>
+ <a u="557A" b="86 B0"/>
+ <a u="557B" b="E0 B4"/>
+ <a u="557C" b="CC E4"/>
+ <a u="557D" b="86 B1"/>
+ <a u="557E" b="E0 B1"/>
+ <a u="557F" b="86 B2"/>
+ <a u="5580" b="BF A6"/>
+ <a u="5581" b="E0 AF"/>
+ <a u="5582" b="CE B9"/>
+ <a u="5583" b="E0 AB"/>
+ <a u="5584" b="C9 C6"/>
+ <a u="5585" b="86 B3"/>
+ <a u="5586" b="86 B4"/>
+ <a u="5587" b="C0 AE"/>
+ <a u="5588" b="E0 AE"/>
+ <a u="5589" b="BA ED"/>
+ <a u="558A" b="BA B0"/>
+ <a u="558B" b="E0 A9"/>
+ <a u="558C" b="86 B5"/>
+ <a u="558D" b="86 B6"/>
+ <a u="558E" b="86 B7"/>
+ <a u="558F" b="DF F6"/>
+ <a u="5590" b="86 B8"/>
+ <a u="5591" b="E0 B3"/>
+ <a u="5592" b="86 B9"/>
+ <a u="5593" b="86 BA"/>
+ <a u="5594" b="E0 B8"/>
+ <a u="5595" b="86 BB"/>
+ <a u="5596" b="86 BC"/>
+ <a u="5597" b="86 BD"/>
+ <a u="5598" b="B4 AD"/>
+ <a u="5599" b="E0 B9"/>
+ <a u="559A" b="86 BE"/>
+ <a u="559B" b="86 BF"/>
+ <a u="559C" b="CF B2"/>
+ <a u="559D" b="BA C8"/>
+ <a u="559E" b="86 C0"/>
+ <a u="559F" b="E0 B0"/>
+ <a u="55A0" b="86 C1"/>
+ <a u="55A1" b="86 C2"/>
+ <a u="55A2" b="86 C3"/>
+ <a u="55A3" b="86 C4"/>
+ <a u="55A4" b="86 C5"/>
+ <a u="55A5" b="86 C6"/>
+ <a u="55A6" b="86 C7"/>
+ <a u="55A7" b="D0 FA"/>
+ <a u="55A8" b="86 C8"/>
+ <a u="55A9" b="86 C9"/>
+ <a u="55AA" b="86 CA"/>
+ <a u="55AB" b="86 CB"/>
+ <a u="55AC" b="86 CC"/>
+ <a u="55AD" b="86 CD"/>
+ <a u="55AE" b="86 CE"/>
+ <a u="55AF" b="86 CF"/>
+ <a u="55B0" b="86 D0"/>
+ <a u="55B1" b="E0 AC"/>
+ <a u="55B2" b="86 D1"/>
+ <a u="55B3" b="D4 FB"/>
+ <a u="55B4" b="86 D2"/>
+ <a u="55B5" b="DF F7"/>
+ <a u="55B6" b="86 D3"/>
+ <a u="55B7" b="C5 E7"/>
+ <a u="55B8" b="86 D4"/>
+ <a u="55B9" b="E0 AD"/>
+ <a u="55BA" b="86 D5"/>
+ <a u="55BB" b="D3 F7"/>
+ <a u="55BC" b="86 D6"/>
+ <a u="55BD" b="E0 B6"/>
+ <a u="55BE" b="E0 B7"/>
+ <a u="55BF" b="86 D7"/>
+ <a u="55C0" b="86 D8"/>
+ <a u="55C1" b="86 D9"/>
+ <a u="55C2" b="86 DA"/>
+ <a u="55C3" b="86 DB"/>
+ <a u="55C4" b="E0 C4"/>
+ <a u="55C5" b="D0 E1"/>
+ <a u="55C6" b="86 DC"/>
+ <a u="55C7" b="86 DD"/>
+ <a u="55C8" b="86 DE"/>
+ <a u="55C9" b="E0 BC"/>
+ <a u="55CA" b="86 DF"/>
+ <a u="55CB" b="86 E0"/>
+ <a u="55CC" b="E0 C9"/>
+ <a u="55CD" b="E0 CA"/>
+ <a u="55CE" b="86 E1"/>
+ <a u="55CF" b="86 E2"/>
+ <a u="55D0" b="86 E3"/>
+ <a u="55D1" b="E0 BE"/>
+ <a u="55D2" b="E0 AA"/>
+ <a u="55D3" b="C9 A4"/>
+ <a u="55D4" b="E0 C1"/>
+ <a u="55D5" b="86 E4"/>
+ <a u="55D6" b="E0 B2"/>
+ <a u="55D7" b="86 E5"/>
+ <a u="55D8" b="86 E6"/>
+ <a u="55D9" b="86 E7"/>
+ <a u="55DA" b="86 E8"/>
+ <a u="55DB" b="86 E9"/>
+ <a u="55DC" b="CA C8"/>
+ <a u="55DD" b="E0 C3"/>
+ <a u="55DE" b="86 EA"/>
+ <a u="55DF" b="E0 B5"/>
+ <a u="55E0" b="86 EB"/>
+ <a u="55E1" b="CE CB"/>
+ <a u="55E2" b="86 EC"/>
+ <a u="55E3" b="CB C3"/>
+ <a u="55E4" b="E0 CD"/>
+ <a u="55E5" b="E0 C6"/>
+ <a u="55E6" b="E0 C2"/>
+ <a u="55E7" b="86 ED"/>
+ <a u="55E8" b="E0 CB"/>
+ <a u="55E9" b="86 EE"/>
+ <a u="55EA" b="E0 BA"/>
+ <a u="55EB" b="E0 BF"/>
+ <a u="55EC" b="E0 C0"/>
+ <a u="55ED" b="86 EF"/>
+ <a u="55EE" b="86 F0"/>
+ <a u="55EF" b="E0 C5"/>
+ <a u="55F0" b="86 F1"/>
+ <a u="55F1" b="86 F2"/>
+ <a u="55F2" b="E0 C7"/>
+ <a u="55F3" b="E0 C8"/>
+ <a u="55F4" b="86 F3"/>
+ <a u="55F5" b="E0 CC"/>
+ <a u="55F6" b="86 F4"/>
+ <a u="55F7" b="E0 BB"/>
+ <a u="55F8" b="86 F5"/>
+ <a u="55F9" b="86 F6"/>
+ <a u="55FA" b="86 F7"/>
+ <a u="55FB" b="86 F8"/>
+ <a u="55FC" b="86 F9"/>
+ <a u="55FD" b="CB D4"/>
+ <a u="55FE" b="E0 D5"/>
+ <a u="55FF" b="86 FA"/>
+ <a u="5600" b="E0 D6"/>
+ <a u="5601" b="E0 D2"/>
+ <a u="5602" b="86 FB"/>
+ <a u="5603" b="86 FC"/>
+ <a u="5604" b="86 FD"/>
+ <a u="5605" b="86 FE"/>
+ <a u="5606" b="87 40"/>
+ <a u="5607" b="87 41"/>
+ <a u="5608" b="E0 D0"/>
+ <a u="5609" b="BC CE"/>
+ <a u="560A" b="87 42"/>
+ <a u="560B" b="87 43"/>
+ <a u="560C" b="E0 D1"/>
+ <a u="560D" b="87 44"/>
+ <a u="560E" b="B8 C2"/>
+ <a u="560F" b="D8 C5"/>
+ <a u="5610" b="87 45"/>
+ <a u="5611" b="87 46"/>
+ <a u="5612" b="87 47"/>
+ <a u="5613" b="87 48"/>
+ <a u="5614" b="87 49"/>
+ <a u="5615" b="87 4A"/>
+ <a u="5616" b="87 4B"/>
+ <a u="5617" b="87 4C"/>
+ <a u="5618" b="D0 EA"/>
+ <a u="5619" b="87 4D"/>
+ <a u="561A" b="87 4E"/>
+ <a u="561B" b="C2 EF"/>
+ <a u="561C" b="87 4F"/>
+ <a u="561D" b="87 50"/>
+ <a u="561E" b="E0 CF"/>
+ <a u="561F" b="E0 BD"/>
+ <a u="5620" b="87 51"/>
+ <a u="5621" b="87 52"/>
+ <a u="5622" b="87 53"/>
+ <a u="5623" b="E0 D4"/>
+ <a u="5624" b="E0 D3"/>
+ <a u="5625" b="87 54"/>
+ <a u="5626" b="87 55"/>
+ <a u="5627" b="E0 D7"/>
+ <a u="5628" b="87 56"/>
+ <a u="5629" b="87 57"/>
+ <a u="562A" b="87 58"/>
+ <a u="562B" b="87 59"/>
+ <a u="562C" b="E0 DC"/>
+ <a u="562D" b="E0 D8"/>
+ <a u="562E" b="87 5A"/>
+ <a u="562F" b="87 5B"/>
+ <a u="5630" b="87 5C"/>
+ <a u="5631" b="D6 F6"/>
+ <a u="5632" b="B3 B0"/>
+ <a u="5633" b="87 5D"/>
+ <a u="5634" b="D7 EC"/>
+ <a u="5635" b="87 5E"/>
+ <a u="5636" b="CB BB"/>
+ <a u="5637" b="87 5F"/>
+ <a u="5638" b="87 60"/>
+ <a u="5639" b="E0 DA"/>
+ <a u="563A" b="87 61"/>
+ <a u="563B" b="CE FB"/>
+ <a u="563C" b="87 62"/>
+ <a u="563D" b="87 63"/>
+ <a u="563E" b="87 64"/>
+ <a u="563F" b="BA D9"/>
+ <a u="5640" b="87 65"/>
+ <a u="5641" b="87 66"/>
+ <a u="5642" b="87 67"/>
+ <a u="5643" b="87 68"/>
+ <a u="5644" b="87 69"/>
+ <a u="5645" b="87 6A"/>
+ <a u="5646" b="87 6B"/>
+ <a u="5647" b="87 6C"/>
+ <a u="5648" b="87 6D"/>
+ <a u="5649" b="87 6E"/>
+ <a u="564A" b="87 6F"/>
+ <a u="564B" b="87 70"/>
+ <a u="564C" b="E0 E1"/>
+ <a u="564D" b="E0 DD"/>
+ <a u="564E" b="D2 AD"/>
+ <a u="564F" b="87 71"/>
+ <a u="5650" b="87 72"/>
+ <a u="5651" b="87 73"/>
+ <a u="5652" b="87 74"/>
+ <a u="5653" b="87 75"/>
+ <a u="5654" b="E0 E2"/>
+ <a u="5655" b="87 76"/>
+ <a u="5656" b="87 77"/>
+ <a u="5657" b="E0 DB"/>
+ <a u="5658" b="E0 D9"/>
+ <a u="5659" b="E0 DF"/>
+ <a u="565A" b="87 78"/>
+ <a u="565B" b="87 79"/>
+ <a u="565C" b="E0 E0"/>
+ <a u="565D" b="87 7A"/>
+ <a u="565E" b="87 7B"/>
+ <a u="565F" b="87 7C"/>
+ <a u="5660" b="87 7D"/>
+ <a u="5661" b="87 7E"/>
+ <a u="5662" b="E0 DE"/>
+ <a u="5663" b="87 80"/>
+ <a u="5664" b="E0 E4"/>
+ <a u="5665" b="87 81"/>
+ <a u="5666" b="87 82"/>
+ <a u="5667" b="87 83"/>
+ <a u="5668" b="C6 F7"/>
+ <a u="5669" b="D8 AC"/>
+ <a u="566A" b="D4 EB"/>
+ <a u="566B" b="E0 E6"/>
+ <a u="566C" b="CA C9"/>
+ <a u="566D" b="87 84"/>
+ <a u="566E" b="87 85"/>
+ <a u="566F" b="87 86"/>
+ <a u="5670" b="87 87"/>
+ <a u="5671" b="E0 E5"/>
+ <a u="5672" b="87 88"/>
+ <a u="5673" b="87 89"/>
+ <a u="5674" b="87 8A"/>
+ <a u="5675" b="87 8B"/>
+ <a u="5676" b="B8 C1"/>
+ <a u="5677" b="87 8C"/>
+ <a u="5678" b="87 8D"/>
+ <a u="5679" b="87 8E"/>
+ <a u="567A" b="87 8F"/>
+ <a u="567B" b="E0 E7"/>
+ <a u="567C" b="E0 E8"/>
+ <a u="567D" b="87 90"/>
+ <a u="567E" b="87 91"/>
+ <a u="567F" b="87 92"/>
+ <a u="5680" b="87 93"/>
+ <a u="5681" b="87 94"/>
+ <a u="5682" b="87 95"/>
+ <a u="5683" b="87 96"/>
+ <a u="5684" b="87 97"/>
+ <a u="5685" b="E0 E9"/>
+ <a u="5686" b="E0 E3"/>
+ <a u="5687" b="87 98"/>
+ <a u="5688" b="87 99"/>
+ <a u="5689" b="87 9A"/>
+ <a u="568A" b="87 9B"/>
+ <a u="568B" b="87 9C"/>
+ <a u="568C" b="87 9D"/>
+ <a u="568D" b="87 9E"/>
+ <a u="568E" b="BA BF"/>
+ <a u="568F" b="CC E7"/>
+ <a u="5690" b="87 9F"/>
+ <a u="5691" b="87 A0"/>
+ <a u="5692" b="87 A1"/>
+ <a u="5693" b="E0 EA"/>
+ <a u="5694" b="87 A2"/>
+ <a u="5695" b="87 A3"/>
+ <a u="5696" b="87 A4"/>
+ <a u="5697" b="87 A5"/>
+ <a u="5698" b="87 A6"/>
+ <a u="5699" b="87 A7"/>
+ <a u="569A" b="87 A8"/>
+ <a u="569B" b="87 A9"/>
+ <a u="569C" b="87 AA"/>
+ <a u="569D" b="87 AB"/>
+ <a u="569E" b="87 AC"/>
+ <a u="569F" b="87 AD"/>
+ <a u="56A0" b="87 AE"/>
+ <a u="56A1" b="87 AF"/>
+ <a u="56A2" b="87 B0"/>
+ <a u="56A3" b="CF F9"/>
+ <a u="56A4" b="87 B1"/>
+ <a u="56A5" b="87 B2"/>
+ <a u="56A6" b="87 B3"/>
+ <a u="56A7" b="87 B4"/>
+ <a u="56A8" b="87 B5"/>
+ <a u="56A9" b="87 B6"/>
+ <a u="56AA" b="87 B7"/>
+ <a u="56AB" b="87 B8"/>
+ <a u="56AC" b="87 B9"/>
+ <a u="56AD" b="87 BA"/>
+ <a u="56AE" b="87 BB"/>
+ <a u="56AF" b="E0 EB"/>
+ <a u="56B0" b="87 BC"/>
+ <a u="56B1" b="87 BD"/>
+ <a u="56B2" b="87 BE"/>
+ <a u="56B3" b="87 BF"/>
+ <a u="56B4" b="87 C0"/>
+ <a u="56B5" b="87 C1"/>
+ <a u="56B6" b="87 C2"/>
+ <a u="56B7" b="C8 C2"/>
+ <a u="56B8" b="87 C3"/>
+ <a u="56B9" b="87 C4"/>
+ <a u="56BA" b="87 C5"/>
+ <a u="56BB" b="87 C6"/>
+ <a u="56BC" b="BD C0"/>
+ <a u="56BD" b="87 C7"/>
+ <a u="56BE" b="87 C8"/>
+ <a u="56BF" b="87 C9"/>
+ <a u="56C0" b="87 CA"/>
+ <a u="56C1" b="87 CB"/>
+ <a u="56C2" b="87 CC"/>
+ <a u="56C3" b="87 CD"/>
+ <a u="56C4" b="87 CE"/>
+ <a u="56C5" b="87 CF"/>
+ <a u="56C6" b="87 D0"/>
+ <a u="56C7" b="87 D1"/>
+ <a u="56C8" b="87 D2"/>
+ <a u="56C9" b="87 D3"/>
+ <a u="56CA" b="C4 D2"/>
+ <a u="56CB" b="87 D4"/>
+ <a u="56CC" b="87 D5"/>
+ <a u="56CD" b="87 D6"/>
+ <a u="56CE" b="87 D7"/>
+ <a u="56CF" b="87 D8"/>
+ <a u="56D0" b="87 D9"/>
+ <a u="56D1" b="87 DA"/>
+ <a u="56D2" b="87 DB"/>
+ <a u="56D3" b="87 DC"/>
+ <a u="56D4" b="E0 EC"/>
+ <a u="56D5" b="87 DD"/>
+ <a u="56D6" b="87 DE"/>
+ <a u="56D7" b="E0 ED"/>
+ <a u="56D8" b="87 DF"/>
+ <a u="56D9" b="87 E0"/>
+ <a u="56DA" b="C7 F4"/>
+ <a u="56DB" b="CB C4"/>
+ <a u="56DC" b="87 E1"/>
+ <a u="56DD" b="E0 EE"/>
+ <a u="56DE" b="BB D8"/>
+ <a u="56DF" b="D8 B6"/>
+ <a u="56E0" b="D2 F2"/>
+ <a u="56E1" b="E0 EF"/>
+ <a u="56E2" b="CD C5"/>
+ <a u="56E3" b="87 E2"/>
+ <a u="56E4" b="B6 DA"/>
+ <a u="56E5" b="87 E3"/>
+ <a u="56E6" b="87 E4"/>
+ <a u="56E7" b="87 E5"/>
+ <a u="56E8" b="87 E6"/>
+ <a u="56E9" b="87 E7"/>
+ <a u="56EA" b="87 E8"/>
+ <a u="56EB" b="E0 F1"/>
+ <a u="56EC" b="87 E9"/>
+ <a u="56ED" b="D4 B0"/>
+ <a u="56EE" b="87 EA"/>
+ <a u="56EF" b="87 EB"/>
+ <a u="56F0" b="C0 A7"/>
+ <a u="56F1" b="B4 D1"/>
+ <a u="56F2" b="87 EC"/>
+ <a u="56F3" b="87 ED"/>
+ <a u="56F4" b="CE A7"/>
+ <a u="56F5" b="E0 F0"/>
+ <a u="56F6" b="87 EE"/>
+ <a u="56F7" b="87 EF"/>
+ <a u="56F8" b="87 F0"/>
+ <a u="56F9" b="E0 F2"/>
+ <a u="56FA" b="B9 CC"/>
+ <a u="56FB" b="87 F1"/>
+ <a u="56FC" b="87 F2"/>
+ <a u="56FD" b="B9 FA"/>
+ <a u="56FE" b="CD BC"/>
+ <a u="56FF" b="E0 F3"/>
+ <a u="5700" b="87 F3"/>
+ <a u="5701" b="87 F4"/>
+ <a u="5702" b="87 F5"/>
+ <a u="5703" b="C6 D4"/>
+ <a u="5704" b="E0 F4"/>
+ <a u="5705" b="87 F6"/>
+ <a u="5706" b="D4 B2"/>
+ <a u="5707" b="87 F7"/>
+ <a u="5708" b="C8 A6"/>
+ <a u="5709" b="E0 F6"/>
+ <a u="570A" b="E0 F5"/>
+ <a u="570B" b="87 F8"/>
+ <a u="570C" b="87 F9"/>
+ <a u="570D" b="87 FA"/>
+ <a u="570E" b="87 FB"/>
+ <a u="570F" b="87 FC"/>
+ <a u="5710" b="87 FD"/>
+ <a u="5711" b="87 FE"/>
+ <a u="5712" b="88 40"/>
+ <a u="5713" b="88 41"/>
+ <a u="5714" b="88 42"/>
+ <a u="5715" b="88 43"/>
+ <a u="5716" b="88 44"/>
+ <a u="5717" b="88 45"/>
+ <a u="5718" b="88 46"/>
+ <a u="5719" b="88 47"/>
+ <a u="571A" b="88 48"/>
+ <a u="571B" b="88 49"/>
+ <a u="571C" b="E0 F7"/>
+ <a u="571D" b="88 4A"/>
+ <a u="571E" b="88 4B"/>
+ <a u="571F" b="CD C1"/>
+ <a u="5720" b="88 4C"/>
+ <a u="5721" b="88 4D"/>
+ <a u="5722" b="88 4E"/>
+ <a u="5723" b="CA A5"/>
+ <a u="5724" b="88 4F"/>
+ <a u="5725" b="88 50"/>
+ <a u="5726" b="88 51"/>
+ <a u="5727" b="88 52"/>
+ <a u="5728" b="D4 DA"/>
+ <a u="5729" b="DB D7"/>
+ <a u="572A" b="DB D9"/>
+ <a u="572B" b="88 53"/>
+ <a u="572C" b="DB D8"/>
+ <a u="572D" b="B9 E7"/>
+ <a u="572E" b="DB DC"/>
+ <a u="572F" b="DB DD"/>
+ <a u="5730" b="B5 D8"/>
+ <a u="5731" b="88 54"/>
+ <a u="5732" b="88 55"/>
+ <a u="5733" b="DB DA"/>
+ <a u="5734" b="88 56"/>
+ <a u="5735" b="88 57"/>
+ <a u="5736" b="88 58"/>
+ <a u="5737" b="88 59"/>
+ <a u="5738" b="88 5A"/>
+ <a u="5739" b="DB DB"/>
+ <a u="573A" b="B3 A1"/>
+ <a u="573B" b="DB DF"/>
+ <a u="573C" b="88 5B"/>
+ <a u="573D" b="88 5C"/>
+ <a u="573E" b="BB F8"/>
+ <a u="573F" b="88 5D"/>
+ <a u="5740" b="D6 B7"/>
+ <a u="5741" b="88 5E"/>
+ <a u="5742" b="DB E0"/>
+ <a u="5743" b="88 5F"/>
+ <a u="5744" b="88 60"/>
+ <a u="5745" b="88 61"/>
+ <a u="5746" b="88 62"/>
+ <a u="5747" b="BE F9"/>
+ <a u="5748" b="88 63"/>
+ <a u="5749" b="88 64"/>
+ <a u="574A" b="B7 BB"/>
+ <a u="574B" b="88 65"/>
+ <a u="574C" b="DB D0"/>
+ <a u="574D" b="CC AE"/>
+ <a u="574E" b="BF B2"/>
+ <a u="574F" b="BB B5"/>
+ <a u="5750" b="D7 F8"/>
+ <a u="5751" b="BF D3"/>
+ <a u="5752" b="88 66"/>
+ <a u="5753" b="88 67"/>
+ <a u="5754" b="88 68"/>
+ <a u="5755" b="88 69"/>
+ <a u="5756" b="88 6A"/>
+ <a u="5757" b="BF E9"/>
+ <a u="5758" b="88 6B"/>
+ <a u="5759" b="88 6C"/>
+ <a u="575A" b="BC E1"/>
+ <a u="575B" b="CC B3"/>
+ <a u="575C" b="DB DE"/>
+ <a u="575D" b="B0 D3"/>
+ <a u="575E" b="CE EB"/>
+ <a u="575F" b="B7 D8"/>
+ <a u="5760" b="D7 B9"/>
+ <a u="5761" b="C6 C2"/>
+ <a u="5762" b="88 6D"/>
+ <a u="5763" b="88 6E"/>
+ <a u="5764" b="C0 A4"/>
+ <a u="5765" b="88 6F"/>
+ <a u="5766" b="CC B9"/>
+ <a u="5767" b="88 70"/>
+ <a u="5768" b="DB E7"/>
+ <a u="5769" b="DB E1"/>
+ <a u="576A" b="C6 BA"/>
+ <a u="576B" b="DB E3"/>
+ <a u="576C" b="88 71"/>
+ <a u="576D" b="DB E8"/>
+ <a u="576E" b="88 72"/>
+ <a u="576F" b="C5 F7"/>
+ <a u="5770" b="88 73"/>
+ <a u="5771" b="88 74"/>
+ <a u="5772" b="88 75"/>
+ <a u="5773" b="DB EA"/>
+ <a u="5774" b="88 76"/>
+ <a u="5775" b="88 77"/>
+ <a u="5776" b="DB E9"/>
+ <a u="5777" b="BF C0"/>
+ <a u="5778" b="88 78"/>
+ <a u="5779" b="88 79"/>
+ <a u="577A" b="88 7A"/>
+ <a u="577B" b="DB E6"/>
+ <a u="577C" b="DB E5"/>
+ <a u="577D" b="88 7B"/>
+ <a u="577E" b="88 7C"/>
+ <a u="577F" b="88 7D"/>
+ <a u="5780" b="88 7E"/>
+ <a u="5781" b="88 80"/>
+ <a u="5782" b="B4 B9"/>
+ <a u="5783" b="C0 AC"/>
+ <a u="5784" b="C2 A2"/>
+ <a u="5785" b="DB E2"/>
+ <a u="5786" b="DB E4"/>
+ <a u="5787" b="88 81"/>
+ <a u="5788" b="88 82"/>
+ <a u="5789" b="88 83"/>
+ <a u="578A" b="88 84"/>
+ <a u="578B" b="D0 CD"/>
+ <a u="578C" b="DB ED"/>
+ <a u="578D" b="88 85"/>
+ <a u="578E" b="88 86"/>
+ <a u="578F" b="88 87"/>
+ <a u="5790" b="88 88"/>
+ <a u="5791" b="88 89"/>
+ <a u="5792" b="C0 DD"/>
+ <a u="5793" b="DB F2"/>
+ <a u="5794" b="88 8A"/>
+ <a u="5795" b="88 8B"/>
+ <a u="5796" b="88 8C"/>
+ <a u="5797" b="88 8D"/>
+ <a u="5798" b="88 8E"/>
+ <a u="5799" b="88 8F"/>
+ <a u="579A" b="88 90"/>
+ <a u="579B" b="B6 E2"/>
+ <a u="579C" b="88 91"/>
+ <a u="579D" b="88 92"/>
+ <a u="579E" b="88 93"/>
+ <a u="579F" b="88 94"/>
+ <a u="57A0" b="DB F3"/>
+ <a u="57A1" b="DB D2"/>
+ <a u="57A2" b="B9 B8"/>
+ <a u="57A3" b="D4 AB"/>
+ <a u="57A4" b="DB EC"/>
+ <a u="57A5" b="88 95"/>
+ <a u="57A6" b="BF D1"/>
+ <a u="57A7" b="DB F0"/>
+ <a u="57A8" b="88 96"/>
+ <a u="57A9" b="DB D1"/>
+ <a u="57AA" b="88 97"/>
+ <a u="57AB" b="B5 E6"/>
+ <a u="57AC" b="88 98"/>
+ <a u="57AD" b="DB EB"/>
+ <a u="57AE" b="BF E5"/>
+ <a u="57AF" b="88 99"/>
+ <a u="57B0" b="88 9A"/>
+ <a u="57B1" b="88 9B"/>
+ <a u="57B2" b="DB EE"/>
+ <a u="57B3" b="88 9C"/>
+ <a u="57B4" b="DB F1"/>
+ <a u="57B5" b="88 9D"/>
+ <a u="57B6" b="88 9E"/>
+ <a u="57B7" b="88 9F"/>
+ <a u="57B8" b="DB F9"/>
+ <a u="57B9" b="88 A0"/>
+ <a u="57BA" b="88 A1"/>
+ <a u="57BB" b="88 A2"/>
+ <a u="57BC" b="88 A3"/>
+ <a u="57BD" b="88 A4"/>
+ <a u="57BE" b="88 A5"/>
+ <a u="57BF" b="88 A6"/>
+ <a u="57C0" b="88 A7"/>
+ <a u="57C1" b="88 A8"/>
+ <a u="57C2" b="B9 A1"/>
+ <a u="57C3" b="B0 A3"/>
+ <a u="57C4" b="88 A9"/>
+ <a u="57C5" b="88 AA"/>
+ <a u="57C6" b="88 AB"/>
+ <a u="57C7" b="88 AC"/>
+ <a u="57C8" b="88 AD"/>
+ <a u="57C9" b="88 AE"/>
+ <a u="57CA" b="88 AF"/>
+ <a u="57CB" b="C2 F1"/>
+ <a u="57CC" b="88 B0"/>
+ <a u="57CD" b="88 B1"/>
+ <a u="57CE" b="B3 C7"/>
+ <a u="57CF" b="DB EF"/>
+ <a u="57D0" b="88 B2"/>
+ <a u="57D1" b="88 B3"/>
+ <a u="57D2" b="DB F8"/>
+ <a u="57D3" b="88 B4"/>
+ <a u="57D4" b="C6 D2"/>
+ <a u="57D5" b="DB F4"/>
+ <a u="57D6" b="88 B5"/>
+ <a u="57D7" b="88 B6"/>
+ <a u="57D8" b="DB F5"/>
+ <a u="57D9" b="DB F7"/>
+ <a u="57DA" b="DB F6"/>
+ <a u="57DB" b="88 B7"/>
+ <a u="57DC" b="88 B8"/>
+ <a u="57DD" b="DB FE"/>
+ <a u="57DE" b="88 B9"/>
+ <a u="57DF" b="D3 F2"/>
+ <a u="57E0" b="B2 BA"/>
+ <a u="57E1" b="88 BA"/>
+ <a u="57E2" b="88 BB"/>
+ <a u="57E3" b="88 BC"/>
+ <a u="57E4" b="DB FD"/>
+ <a u="57E5" b="88 BD"/>
+ <a u="57E6" b="88 BE"/>
+ <a u="57E7" b="88 BF"/>
+ <a u="57E8" b="88 C0"/>
+ <a u="57E9" b="88 C1"/>
+ <a u="57EA" b="88 C2"/>
+ <a u="57EB" b="88 C3"/>
+ <a u="57EC" b="88 C4"/>
+ <a u="57ED" b="DC A4"/>
+ <a u="57EE" b="88 C5"/>
+ <a u="57EF" b="DB FB"/>
+ <a u="57F0" b="88 C6"/>
+ <a u="57F1" b="88 C7"/>
+ <a u="57F2" b="88 C8"/>
+ <a u="57F3" b="88 C9"/>
+ <a u="57F4" b="DB FA"/>
+ <a u="57F5" b="88 CA"/>
+ <a u="57F6" b="88 CB"/>
+ <a u="57F7" b="88 CC"/>
+ <a u="57F8" b="DB FC"/>
+ <a u="57F9" b="C5 E0"/>
+ <a u="57FA" b="BB F9"/>
+ <a u="57FB" b="88 CD"/>
+ <a u="57FC" b="88 CE"/>
+ <a u="57FD" b="DC A3"/>
+ <a u="57FE" b="88 CF"/>
+ <a u="57FF" b="88 D0"/>
+ <a u="5800" b="DC A5"/>
+ <a u="5801" b="88 D1"/>
+ <a u="5802" b="CC C3"/>
+ <a u="5803" b="88 D2"/>
+ <a u="5804" b="88 D3"/>
+ <a u="5805" b="88 D4"/>
+ <a u="5806" b="B6 D1"/>
+ <a u="5807" b="DD C0"/>
+ <a u="5808" b="88 D5"/>
+ <a u="5809" b="88 D6"/>
+ <a u="580A" b="88 D7"/>
+ <a u="580B" b="DC A1"/>
+ <a u="580C" b="88 D8"/>
+ <a u="580D" b="DC A2"/>
+ <a u="580E" b="88 D9"/>
+ <a u="580F" b="88 DA"/>
+ <a u="5810" b="88 DB"/>
+ <a u="5811" b="C7 B5"/>
+ <a u="5812" b="88 DC"/>
+ <a u="5813" b="88 DD"/>
+ <a u="5814" b="88 DE"/>
+ <a u="5815" b="B6 E9"/>
+ <a u="5816" b="88 DF"/>
+ <a u="5817" b="88 E0"/>
+ <a u="5818" b="88 E1"/>
+ <a u="5819" b="DC A7"/>
+ <a u="581A" b="88 E2"/>
+ <a u="581B" b="88 E3"/>
+ <a u="581C" b="88 E4"/>
+ <a u="581D" b="88 E5"/>
+ <a u="581E" b="DC A6"/>
+ <a u="581F" b="88 E6"/>
+ <a u="5820" b="DC A9"/>
+ <a u="5821" b="B1 A4"/>
+ <a u="5822" b="88 E7"/>
+ <a u="5823" b="88 E8"/>
+ <a u="5824" b="B5 CC"/>
+ <a u="5825" b="88 E9"/>
+ <a u="5826" b="88 EA"/>
+ <a u="5827" b="88 EB"/>
+ <a u="5828" b="88 EC"/>
+ <a u="5829" b="88 ED"/>
+ <a u="582A" b="BF B0"/>
+ <a u="582B" b="88 EE"/>
+ <a u="582C" b="88 EF"/>
+ <a u="582D" b="88 F0"/>
+ <a u="582E" b="88 F1"/>
+ <a u="582F" b="88 F2"/>
+ <a u="5830" b="D1 DF"/>
+ <a u="5831" b="88 F3"/>
+ <a u="5832" b="88 F4"/>
+ <a u="5833" b="88 F5"/>
+ <a u="5834" b="88 F6"/>
+ <a u="5835" b="B6 C2"/>
+ <a u="5836" b="88 F7"/>
+ <a u="5837" b="88 F8"/>
+ <a u="5838" b="88 F9"/>
+ <a u="5839" b="88 FA"/>
+ <a u="583A" b="88 FB"/>
+ <a u="583B" b="88 FC"/>
+ <a u="583C" b="88 FD"/>
+ <a u="583D" b="88 FE"/>
+ <a u="583E" b="89 40"/>
+ <a u="583F" b="89 41"/>
+ <a u="5840" b="89 42"/>
+ <a u="5841" b="89 43"/>
+ <a u="5842" b="89 44"/>
+ <a u="5843" b="89 45"/>
+ <a u="5844" b="DC A8"/>
+ <a u="5845" b="89 46"/>
+ <a u="5846" b="89 47"/>
+ <a u="5847" b="89 48"/>
+ <a u="5848" b="89 49"/>
+ <a u="5849" b="89 4A"/>
+ <a u="584A" b="89 4B"/>
+ <a u="584B" b="89 4C"/>
+ <a u="584C" b="CB FA"/>
+ <a u="584D" b="EB F3"/>
+ <a u="584E" b="89 4D"/>
+ <a u="584F" b="89 4E"/>
+ <a u="5850" b="89 4F"/>
+ <a u="5851" b="CB DC"/>
+ <a u="5852" b="89 50"/>
+ <a u="5853" b="89 51"/>
+ <a u="5854" b="CB FE"/>
+ <a u="5855" b="89 52"/>
+ <a u="5856" b="89 53"/>
+ <a u="5857" b="89 54"/>
+ <a u="5858" b="CC C1"/>
+ <a u="5859" b="89 55"/>
+ <a u="585A" b="89 56"/>
+ <a u="585B" b="89 57"/>
+ <a u="585C" b="89 58"/>
+ <a u="585D" b="89 59"/>
+ <a u="585E" b="C8 FB"/>
+ <a u="585F" b="89 5A"/>
+ <a u="5860" b="89 5B"/>
+ <a u="5861" b="89 5C"/>
+ <a u="5862" b="89 5D"/>
+ <a u="5863" b="89 5E"/>
+ <a u="5864" b="89 5F"/>
+ <a u="5865" b="DC AA"/>
+ <a u="5866" b="89 60"/>
+ <a u="5867" b="89 61"/>
+ <a u="5868" b="89 62"/>
+ <a u="5869" b="89 63"/>
+ <a u="586A" b="89 64"/>
+ <a u="586B" b="CC EE"/>
+ <a u="586C" b="DC AB"/>
+ <a u="586D" b="89 65"/>
+ <a u="586E" b="89 66"/>
+ <a u="586F" b="89 67"/>
+ <a u="5870" b="89 68"/>
+ <a u="5871" b="89 69"/>
+ <a u="5872" b="89 6A"/>
+ <a u="5873" b="89 6B"/>
+ <a u="5874" b="89 6C"/>
+ <a u="5875" b="89 6D"/>
+ <a u="5876" b="89 6E"/>
+ <a u="5877" b="89 6F"/>
+ <a u="5878" b="89 70"/>
+ <a u="5879" b="89 71"/>
+ <a u="587A" b="89 72"/>
+ <a u="587B" b="89 73"/>
+ <a u="587C" b="89 74"/>
+ <a u="587D" b="89 75"/>
+ <a u="587E" b="DB D3"/>
+ <a u="587F" b="89 76"/>
+ <a u="5880" b="DC AF"/>
+ <a u="5881" b="DC AC"/>
+ <a u="5882" b="89 77"/>
+ <a u="5883" b="BE B3"/>
+ <a u="5884" b="89 78"/>
+ <a u="5885" b="CA FB"/>
+ <a u="5886" b="89 79"/>
+ <a u="5887" b="89 7A"/>
+ <a u="5888" b="89 7B"/>
+ <a u="5889" b="DC AD"/>
+ <a u="588A" b="89 7C"/>
+ <a u="588B" b="89 7D"/>
+ <a u="588C" b="89 7E"/>
+ <a u="588D" b="89 80"/>
+ <a u="588E" b="89 81"/>
+ <a u="588F" b="89 82"/>
+ <a u="5890" b="89 83"/>
+ <a u="5891" b="89 84"/>
+ <a u="5892" b="C9 CA"/>
+ <a u="5893" b="C4 B9"/>
+ <a u="5894" b="89 85"/>
+ <a u="5895" b="89 86"/>
+ <a u="5896" b="89 87"/>
+ <a u="5897" b="89 88"/>
+ <a u="5898" b="89 89"/>
+ <a u="5899" b="C7 BD"/>
+ <a u="589A" b="DC AE"/>
+ <a u="589B" b="89 8A"/>
+ <a u="589C" b="89 8B"/>
+ <a u="589D" b="89 8C"/>
+ <a u="589E" b="D4 F6"/>
+ <a u="589F" b="D0 E6"/>
+ <a u="58A0" b="89 8D"/>
+ <a u="58A1" b="89 8E"/>
+ <a u="58A2" b="89 8F"/>
+ <a u="58A3" b="89 90"/>
+ <a u="58A4" b="89 91"/>
+ <a u="58A5" b="89 92"/>
+ <a u="58A6" b="89 93"/>
+ <a u="58A7" b="89 94"/>
+ <a u="58A8" b="C4 AB"/>
+ <a u="58A9" b="B6 D5"/>
+ <a u="58AA" b="89 95"/>
+ <a u="58AB" b="89 96"/>
+ <a u="58AC" b="89 97"/>
+ <a u="58AD" b="89 98"/>
+ <a u="58AE" b="89 99"/>
+ <a u="58AF" b="89 9A"/>
+ <a u="58B0" b="89 9B"/>
+ <a u="58B1" b="89 9C"/>
+ <a u="58B2" b="89 9D"/>
+ <a u="58B3" b="89 9E"/>
+ <a u="58B4" b="89 9F"/>
+ <a u="58B5" b="89 A0"/>
+ <a u="58B6" b="89 A1"/>
+ <a u="58B7" b="89 A2"/>
+ <a u="58B8" b="89 A3"/>
+ <a u="58B9" b="89 A4"/>
+ <a u="58BA" b="89 A5"/>
+ <a u="58BB" b="89 A6"/>
+ <a u="58BC" b="DB D4"/>
+ <a u="58BD" b="89 A7"/>
+ <a u="58BE" b="89 A8"/>
+ <a u="58BF" b="89 A9"/>
+ <a u="58C0" b="89 AA"/>
+ <a u="58C1" b="B1 DA"/>
+ <a u="58C2" b="89 AB"/>
+ <a u="58C3" b="89 AC"/>
+ <a u="58C4" b="89 AD"/>
+ <a u="58C5" b="DB D5"/>
+ <a u="58C6" b="89 AE"/>
+ <a u="58C7" b="89 AF"/>
+ <a u="58C8" b="89 B0"/>
+ <a u="58C9" b="89 B1"/>
+ <a u="58CA" b="89 B2"/>
+ <a u="58CB" b="89 B3"/>
+ <a u="58CC" b="89 B4"/>
+ <a u="58CD" b="89 B5"/>
+ <a u="58CE" b="89 B6"/>
+ <a u="58CF" b="89 B7"/>
+ <a u="58D0" b="89 B8"/>
+ <a u="58D1" b="DB D6"/>
+ <a u="58D2" b="89 B9"/>
+ <a u="58D3" b="89 BA"/>
+ <a u="58D4" b="89 BB"/>
+ <a u="58D5" b="BA BE"/>
+ <a u="58D6" b="89 BC"/>
+ <a u="58D7" b="89 BD"/>
+ <a u="58D8" b="89 BE"/>
+ <a u="58D9" b="89 BF"/>
+ <a u="58DA" b="89 C0"/>
+ <a u="58DB" b="89 C1"/>
+ <a u="58DC" b="89 C2"/>
+ <a u="58DD" b="89 C3"/>
+ <a u="58DE" b="89 C4"/>
+ <a u="58DF" b="89 C5"/>
+ <a u="58E0" b="89 C6"/>
+ <a u="58E1" b="89 C7"/>
+ <a u="58E2" b="89 C8"/>
+ <a u="58E3" b="89 C9"/>
+ <a u="58E4" b="C8 C0"/>
+ <a u="58E5" b="89 CA"/>
+ <a u="58E6" b="89 CB"/>
+ <a u="58E7" b="89 CC"/>
+ <a u="58E8" b="89 CD"/>
+ <a u="58E9" b="89 CE"/>
+ <a u="58EA" b="89 CF"/>
+ <a u="58EB" b="CA BF"/>
+ <a u="58EC" b="C8 C9"/>
+ <a u="58ED" b="89 D0"/>
+ <a u="58EE" b="D7 B3"/>
+ <a u="58EF" b="89 D1"/>
+ <a u="58F0" b="C9 F9"/>
+ <a u="58F1" b="89 D2"/>
+ <a u="58F2" b="89 D3"/>
+ <a u="58F3" b="BF C7"/>
+ <a u="58F4" b="89 D4"/>
+ <a u="58F5" b="89 D5"/>
+ <a u="58F6" b="BA F8"/>
+ <a u="58F7" b="89 D6"/>
+ <a u="58F8" b="89 D7"/>
+ <a u="58F9" b="D2 BC"/>
+ <a u="58FA" b="89 D8"/>
+ <a u="58FB" b="89 D9"/>
+ <a u="58FC" b="89 DA"/>
+ <a u="58FD" b="89 DB"/>
+ <a u="58FE" b="89 DC"/>
+ <a u="58FF" b="89 DD"/>
+ <a u="5900" b="89 DE"/>
+ <a u="5901" b="89 DF"/>
+ <a u="5902" b="E2 BA"/>
+ <a u="5903" b="89 E0"/>
+ <a u="5904" b="B4 A6"/>
+ <a u="5905" b="89 E1"/>
+ <a u="5906" b="89 E2"/>
+ <a u="5907" b="B1 B8"/>
+ <a u="5908" b="89 E3"/>
+ <a u="5909" b="89 E4"/>
+ <a u="590A" b="89 E5"/>
+ <a u="590B" b="89 E6"/>
+ <a u="590C" b="89 E7"/>
+ <a u="590D" b="B8 B4"/>
+ <a u="590E" b="89 E8"/>
+ <a u="590F" b="CF C4"/>
+ <a u="5910" b="89 E9"/>
+ <a u="5911" b="89 EA"/>
+ <a u="5912" b="89 EB"/>
+ <a u="5913" b="89 EC"/>
+ <a u="5914" b="D9 E7"/>
+ <a u="5915" b="CF A6"/>
+ <a u="5916" b="CD E2"/>
+ <a u="5917" b="89 ED"/>
+ <a u="5918" b="89 EE"/>
+ <a u="5919" b="D9 ED"/>
+ <a u="591A" b="B6 E0"/>
+ <a u="591B" b="89 EF"/>
+ <a u="591C" b="D2 B9"/>
+ <a u="591D" b="89 F0"/>
+ <a u="591E" b="89 F1"/>
+ <a u="591F" b="B9 BB"/>
+ <a u="5920" b="89 F2"/>
+ <a u="5921" b="89 F3"/>
+ <a u="5922" b="89 F4"/>
+ <a u="5923" b="89 F5"/>
+ <a u="5924" b="E2 B9"/>
+ <a u="5925" b="E2 B7"/>
+ <a u="5926" b="89 F6"/>
+ <a u="5927" b="B4 F3"/>
+ <a u="5928" b="89 F7"/>
+ <a u="5929" b="CC EC"/>
+ <a u="592A" b="CC AB"/>
+ <a u="592B" b="B7 F2"/>
+ <a u="592C" b="89 F8"/>
+ <a u="592D" b="D8 B2"/>
+ <a u="592E" b="D1 EB"/>
+ <a u="592F" b="BA BB"/>
+ <a u="5930" b="89 F9"/>
+ <a u="5931" b="CA A7"/>
+ <a u="5932" b="89 FA"/>
+ <a u="5933" b="89 FB"/>
+ <a u="5934" b="CD B7"/>
+ <a u="5935" b="89 FC"/>
+ <a u="5936" b="89 FD"/>
+ <a u="5937" b="D2 C4"/>
+ <a u="5938" b="BF E4"/>
+ <a u="5939" b="BC D0"/>
+ <a u="593A" b="B6 E1"/>
+ <a u="593B" b="89 FE"/>
+ <a u="593C" b="DE C5"/>
+ <a u="593D" b="8A 40"/>
+ <a u="593E" b="8A 41"/>
+ <a u="593F" b="8A 42"/>
+ <a u="5940" b="8A 43"/>
+ <a u="5941" b="DE C6"/>
+ <a u="5942" b="DB BC"/>
+ <a u="5943" b="8A 44"/>
+ <a u="5944" b="D1 D9"/>
+ <a u="5945" b="8A 45"/>
+ <a u="5946" b="8A 46"/>
+ <a u="5947" b="C6 E6"/>
+ <a u="5948" b="C4 CE"/>
+ <a u="5949" b="B7 EE"/>
+ <a u="594A" b="8A 47"/>
+ <a u="594B" b="B7 DC"/>
+ <a u="594C" b="8A 48"/>
+ <a u="594D" b="8A 49"/>
+ <a u="594E" b="BF FC"/>
+ <a u="594F" b="D7 E0"/>
+ <a u="5950" b="8A 4A"/>
+ <a u="5951" b="C6 F5"/>
+ <a u="5952" b="8A 4B"/>
+ <a u="5953" b="8A 4C"/>
+ <a u="5954" b="B1 BC"/>
+ <a u="5955" b="DE C8"/>
+ <a u="5956" b="BD B1"/>
+ <a u="5957" b="CC D7"/>
+ <a u="5958" b="DE CA"/>
+ <a u="5959" b="8A 4D"/>
+ <a u="595A" b="DE C9"/>
+ <a u="595B" b="8A 4E"/>
+ <a u="595C" b="8A 4F"/>
+ <a u="595D" b="8A 50"/>
+ <a u="595E" b="8A 51"/>
+ <a u="595F" b="8A 52"/>
+ <a u="5960" b="B5 EC"/>
+ <a u="5961" b="8A 53"/>
+ <a u="5962" b="C9 DD"/>
+ <a u="5963" b="8A 54"/>
+ <a u="5964" b="8A 55"/>
+ <a u="5965" b="B0 C2"/>
+ <a u="5966" b="8A 56"/>
+ <a u="5967" b="8A 57"/>
+ <a u="5968" b="8A 58"/>
+ <a u="5969" b="8A 59"/>
+ <a u="596A" b="8A 5A"/>
+ <a u="596B" b="8A 5B"/>
+ <a u="596C" b="8A 5C"/>
+ <a u="596D" b="8A 5D"/>
+ <a u="596E" b="8A 5E"/>
+ <a u="596F" b="8A 5F"/>
+ <a u="5970" b="8A 60"/>
+ <a u="5971" b="8A 61"/>
+ <a u="5972" b="8A 62"/>
+ <a u="5973" b="C5 AE"/>
+ <a u="5974" b="C5 AB"/>
+ <a u="5975" b="8A 63"/>
+ <a u="5976" b="C4 CC"/>
+ <a u="5977" b="8A 64"/>
+ <a u="5978" b="BC E9"/>
+ <a u="5979" b="CB FD"/>
+ <a u="597A" b="8A 65"/>
+ <a u="597B" b="8A 66"/>
+ <a u="597C" b="8A 67"/>
+ <a u="597D" b="BA C3"/>
+ <a u="597E" b="8A 68"/>
+ <a u="597F" b="8A 69"/>
+ <a u="5980" b="8A 6A"/>
+ <a u="5981" b="E5 F9"/>
+ <a u="5982" b="C8 E7"/>
+ <a u="5983" b="E5 FA"/>
+ <a u="5984" b="CD FD"/>
+ <a u="5985" b="8A 6B"/>
+ <a u="5986" b="D7 B1"/>
+ <a u="5987" b="B8 BE"/>
+ <a u="5988" b="C2 E8"/>
+ <a u="5989" b="8A 6C"/>
+ <a u="598A" b="C8 D1"/>
+ <a u="598B" b="8A 6D"/>
+ <a u="598C" b="8A 6E"/>
+ <a u="598D" b="E5 FB"/>
+ <a u="598E" b="8A 6F"/>
+ <a u="598F" b="8A 70"/>
+ <a u="5990" b="8A 71"/>
+ <a u="5991" b="8A 72"/>
+ <a u="5992" b="B6 CA"/>
+ <a u="5993" b="BC CB"/>
+ <a u="5994" b="8A 73"/>
+ <a u="5995" b="8A 74"/>
+ <a u="5996" b="D1 FD"/>
+ <a u="5997" b="E6 A1"/>
+ <a u="5998" b="8A 75"/>
+ <a u="5999" b="C3 EE"/>
+ <a u="599A" b="8A 76"/>
+ <a u="599B" b="8A 77"/>
+ <a u="599C" b="8A 78"/>
+ <a u="599D" b="8A 79"/>
+ <a u="599E" b="E6 A4"/>
+ <a u="599F" b="8A 7A"/>
+ <a u="59A0" b="8A 7B"/>
+ <a u="59A1" b="8A 7C"/>
+ <a u="59A2" b="8A 7D"/>
+ <a u="59A3" b="E5 FE"/>
+ <a u="59A4" b="E6 A5"/>
+ <a u="59A5" b="CD D7"/>
+ <a u="59A6" b="8A 7E"/>
+ <a u="59A7" b="8A 80"/>
+ <a u="59A8" b="B7 C1"/>
+ <a u="59A9" b="E5 FC"/>
+ <a u="59AA" b="E5 FD"/>
+ <a u="59AB" b="E6 A3"/>
+ <a u="59AC" b="8A 81"/>
+ <a u="59AD" b="8A 82"/>
+ <a u="59AE" b="C4 DD"/>
+ <a u="59AF" b="E6 A8"/>
+ <a u="59B0" b="8A 83"/>
+ <a u="59B1" b="8A 84"/>
+ <a u="59B2" b="E6 A7"/>
+ <a u="59B3" b="8A 85"/>
+ <a u="59B4" b="8A 86"/>
+ <a u="59B5" b="8A 87"/>
+ <a u="59B6" b="8A 88"/>
+ <a u="59B7" b="8A 89"/>
+ <a u="59B8" b="8A 8A"/>
+ <a u="59B9" b="C3 C3"/>
+ <a u="59BA" b="8A 8B"/>
+ <a u="59BB" b="C6 DE"/>
+ <a u="59BC" b="8A 8C"/>
+ <a u="59BD" b="8A 8D"/>
+ <a u="59BE" b="E6 AA"/>
+ <a u="59BF" b="8A 8E"/>
+ <a u="59C0" b="8A 8F"/>
+ <a u="59C1" b="8A 90"/>
+ <a u="59C2" b="8A 91"/>
+ <a u="59C3" b="8A 92"/>
+ <a u="59C4" b="8A 93"/>
+ <a u="59C5" b="8A 94"/>
+ <a u="59C6" b="C4 B7"/>
+ <a u="59C7" b="8A 95"/>
+ <a u="59C8" b="8A 96"/>
+ <a u="59C9" b="8A 97"/>
+ <a u="59CA" b="E6 A2"/>
+ <a u="59CB" b="CA BC"/>
+ <a u="59CC" b="8A 98"/>
+ <a u="59CD" b="8A 99"/>
+ <a u="59CE" b="8A 9A"/>
+ <a u="59CF" b="8A 9B"/>
+ <a u="59D0" b="BD E3"/>
+ <a u="59D1" b="B9 C3"/>
+ <a u="59D2" b="E6 A6"/>
+ <a u="59D3" b="D0 D5"/>
+ <a u="59D4" b="CE AF"/>
+ <a u="59D5" b="8A 9C"/>
+ <a u="59D6" b="8A 9D"/>
+ <a u="59D7" b="E6 A9"/>
+ <a u="59D8" b="E6 B0"/>
+ <a u="59D9" b="8A 9E"/>
+ <a u="59DA" b="D2 A6"/>
+ <a u="59DB" b="8A 9F"/>
+ <a u="59DC" b="BD AA"/>
+ <a u="59DD" b="E6 AD"/>
+ <a u="59DE" b="8A A0"/>
+ <a u="59DF" b="8A A1"/>
+ <a u="59E0" b="8A A2"/>
+ <a u="59E1" b="8A A3"/>
+ <a u="59E2" b="8A A4"/>
+ <a u="59E3" b="E6 AF"/>
+ <a u="59E4" b="8A A5"/>
+ <a u="59E5" b="C0 D1"/>
+ <a u="59E6" b="8A A6"/>
+ <a u="59E7" b="8A A7"/>
+ <a u="59E8" b="D2 CC"/>
+ <a u="59E9" b="8A A8"/>
+ <a u="59EA" b="8A A9"/>
+ <a u="59EB" b="8A AA"/>
+ <a u="59EC" b="BC A7"/>
+ <a u="59ED" b="8A AB"/>
+ <a u="59EE" b="8A AC"/>
+ <a u="59EF" b="8A AD"/>
+ <a u="59F0" b="8A AE"/>
+ <a u="59F1" b="8A AF"/>
+ <a u="59F2" b="8A B0"/>
+ <a u="59F3" b="8A B1"/>
+ <a u="59F4" b="8A B2"/>
+ <a u="59F5" b="8A B3"/>
+ <a u="59F6" b="8A B4"/>
+ <a u="59F7" b="8A B5"/>
+ <a u="59F8" b="8A B6"/>
+ <a u="59F9" b="E6 B1"/>
+ <a u="59FA" b="8A B7"/>
+ <a u="59FB" b="D2 F6"/>
+ <a u="59FC" b="8A B8"/>
+ <a u="59FD" b="8A B9"/>
+ <a u="59FE" b="8A BA"/>
+ <a u="59FF" b="D7 CB"/>
+ <a u="5A00" b="8A BB"/>
+ <a u="5A01" b="CD FE"/>
+ <a u="5A02" b="8A BC"/>
+ <a u="5A03" b="CD DE"/>
+ <a u="5A04" b="C2 A6"/>
+ <a u="5A05" b="E6 AB"/>
+ <a u="5A06" b="E6 AC"/>
+ <a u="5A07" b="BD BF"/>
+ <a u="5A08" b="E6 AE"/>
+ <a u="5A09" b="E6 B3"/>
+ <a u="5A0A" b="8A BD"/>
+ <a u="5A0B" b="8A BE"/>
+ <a u="5A0C" b="E6 B2"/>
+ <a u="5A0D" b="8A BF"/>
+ <a u="5A0E" b="8A C0"/>
+ <a u="5A0F" b="8A C1"/>
+ <a u="5A10" b="8A C2"/>
+ <a u="5A11" b="E6 B6"/>
+ <a u="5A12" b="8A C3"/>
+ <a u="5A13" b="E6 B8"/>
+ <a u="5A14" b="8A C4"/>
+ <a u="5A15" b="8A C5"/>
+ <a u="5A16" b="8A C6"/>
+ <a u="5A17" b="8A C7"/>
+ <a u="5A18" b="C4 EF"/>
+ <a u="5A19" b="8A C8"/>
+ <a u="5A1A" b="8A C9"/>
+ <a u="5A1B" b="8A CA"/>
+ <a u="5A1C" b="C4 C8"/>
+ <a u="5A1D" b="8A CB"/>
+ <a u="5A1E" b="8A CC"/>
+ <a u="5A1F" b="BE EA"/>
+ <a u="5A20" b="C9 EF"/>
+ <a u="5A21" b="8A CD"/>
+ <a u="5A22" b="8A CE"/>
+ <a u="5A23" b="E6 B7"/>
+ <a u="5A24" b="8A CF"/>
+ <a u="5A25" b="B6 F0"/>
+ <a u="5A26" b="8A D0"/>
+ <a u="5A27" b="8A D1"/>
+ <a u="5A28" b="8A D2"/>
+ <a u="5A29" b="C3 E4"/>
+ <a u="5A2A" b="8A D3"/>
+ <a u="5A2B" b="8A D4"/>
+ <a u="5A2C" b="8A D5"/>
+ <a u="5A2D" b="8A D6"/>
+ <a u="5A2E" b="8A D7"/>
+ <a u="5A2F" b="8A D8"/>
+ <a u="5A30" b="8A D9"/>
+ <a u="5A31" b="D3 E9"/>
+ <a u="5A32" b="E6 B4"/>
+ <a u="5A33" b="8A DA"/>
+ <a u="5A34" b="E6 B5"/>
+ <a u="5A35" b="8A DB"/>
+ <a u="5A36" b="C8 A2"/>
+ <a u="5A37" b="8A DC"/>
+ <a u="5A38" b="8A DD"/>
+ <a u="5A39" b="8A DE"/>
+ <a u="5A3A" b="8A DF"/>
+ <a u="5A3B" b="8A E0"/>
+ <a u="5A3C" b="E6 BD"/>
+ <a u="5A3D" b="8A E1"/>
+ <a u="5A3E" b="8A E2"/>
+ <a u="5A3F" b="8A E3"/>
+ <a u="5A40" b="E6 B9"/>
+ <a u="5A41" b="8A E4"/>
+ <a u="5A42" b="8A E5"/>
+ <a u="5A43" b="8A E6"/>
+ <a u="5A44" b="8A E7"/>
+ <a u="5A45" b="8A E8"/>
+ <a u="5A46" b="C6 C5"/>
+ <a u="5A47" b="8A E9"/>
+ <a u="5A48" b="8A EA"/>
+ <a u="5A49" b="CD F1"/>
+ <a u="5A4A" b="E6 BB"/>
+ <a u="5A4B" b="8A EB"/>
+ <a u="5A4C" b="8A EC"/>
+ <a u="5A4D" b="8A ED"/>
+ <a u="5A4E" b="8A EE"/>
+ <a u="5A4F" b="8A EF"/>
+ <a u="5A50" b="8A F0"/>
+ <a u="5A51" b="8A F1"/>
+ <a u="5A52" b="8A F2"/>
+ <a u="5A53" b="8A F3"/>
+ <a u="5A54" b="8A F4"/>
+ <a u="5A55" b="E6 BC"/>
+ <a u="5A56" b="8A F5"/>
+ <a u="5A57" b="8A F6"/>
+ <a u="5A58" b="8A F7"/>
+ <a u="5A59" b="8A F8"/>
+ <a u="5A5A" b="BB E9"/>
+ <a u="5A5B" b="8A F9"/>
+ <a u="5A5C" b="8A FA"/>
+ <a u="5A5D" b="8A FB"/>
+ <a u="5A5E" b="8A FC"/>
+ <a u="5A5F" b="8A FD"/>
+ <a u="5A60" b="8A FE"/>
+ <a u="5A61" b="8B 40"/>
+ <a u="5A62" b="E6 BE"/>
+ <a u="5A63" b="8B 41"/>
+ <a u="5A64" b="8B 42"/>
+ <a u="5A65" b="8B 43"/>
+ <a u="5A66" b="8B 44"/>
+ <a u="5A67" b="E6 BA"/>
+ <a u="5A68" b="8B 45"/>
+ <a u="5A69" b="8B 46"/>
+ <a u="5A6A" b="C0 B7"/>
+ <a u="5A6B" b="8B 47"/>
+ <a u="5A6C" b="8B 48"/>
+ <a u="5A6D" b="8B 49"/>
+ <a u="5A6E" b="8B 4A"/>
+ <a u="5A6F" b="8B 4B"/>
+ <a u="5A70" b="8B 4C"/>
+ <a u="5A71" b="8B 4D"/>
+ <a u="5A72" b="8B 4E"/>
+ <a u="5A73" b="8B 4F"/>
+ <a u="5A74" b="D3 A4"/>
+ <a u="5A75" b="E6 BF"/>
+ <a u="5A76" b="C9 F4"/>
+ <a u="5A77" b="E6 C3"/>
+ <a u="5A78" b="8B 50"/>
+ <a u="5A79" b="8B 51"/>
+ <a u="5A7A" b="E6 C4"/>
+ <a u="5A7B" b="8B 52"/>
+ <a u="5A7C" b="8B 53"/>
+ <a u="5A7D" b="8B 54"/>
+ <a u="5A7E" b="8B 55"/>
+ <a u="5A7F" b="D0 F6"/>
+ <a u="5A80" b="8B 56"/>
+ <a u="5A81" b="8B 57"/>
+ <a u="5A82" b="8B 58"/>
+ <a u="5A83" b="8B 59"/>
+ <a u="5A84" b="8B 5A"/>
+ <a u="5A85" b="8B 5B"/>
+ <a u="5A86" b="8B 5C"/>
+ <a u="5A87" b="8B 5D"/>
+ <a u="5A88" b="8B 5E"/>
+ <a u="5A89" b="8B 5F"/>
+ <a u="5A8A" b="8B 60"/>
+ <a u="5A8B" b="8B 61"/>
+ <a u="5A8C" b="8B 62"/>
+ <a u="5A8D" b="8B 63"/>
+ <a u="5A8E" b="8B 64"/>
+ <a u="5A8F" b="8B 65"/>
+ <a u="5A90" b="8B 66"/>
+ <a u="5A91" b="8B 67"/>
+ <a u="5A92" b="C3 BD"/>
+ <a u="5A93" b="8B 68"/>
+ <a u="5A94" b="8B 69"/>
+ <a u="5A95" b="8B 6A"/>
+ <a u="5A96" b="8B 6B"/>
+ <a u="5A97" b="8B 6C"/>
+ <a u="5A98" b="8B 6D"/>
+ <a u="5A99" b="8B 6E"/>
+ <a u="5A9A" b="C3 C4"/>
+ <a u="5A9B" b="E6 C2"/>
+ <a u="5A9C" b="8B 6F"/>
+ <a u="5A9D" b="8B 70"/>
+ <a u="5A9E" b="8B 71"/>
+ <a u="5A9F" b="8B 72"/>
+ <a u="5AA0" b="8B 73"/>
+ <a u="5AA1" b="8B 74"/>
+ <a u="5AA2" b="8B 75"/>
+ <a u="5AA3" b="8B 76"/>
+ <a u="5AA4" b="8B 77"/>
+ <a u="5AA5" b="8B 78"/>
+ <a u="5AA6" b="8B 79"/>
+ <a u="5AA7" b="8B 7A"/>
+ <a u="5AA8" b="8B 7B"/>
+ <a u="5AA9" b="8B 7C"/>
+ <a u="5AAA" b="E6 C1"/>
+ <a u="5AAB" b="8B 7D"/>
+ <a u="5AAC" b="8B 7E"/>
+ <a u="5AAD" b="8B 80"/>
+ <a u="5AAE" b="8B 81"/>
+ <a u="5AAF" b="8B 82"/>
+ <a u="5AB0" b="8B 83"/>
+ <a u="5AB1" b="8B 84"/>
+ <a u="5AB2" b="E6 C7"/>
+ <a u="5AB3" b="CF B1"/>
+ <a u="5AB4" b="8B 85"/>
+ <a u="5AB5" b="EB F4"/>
+ <a u="5AB6" b="8B 86"/>
+ <a u="5AB7" b="8B 87"/>
+ <a u="5AB8" b="E6 CA"/>
+ <a u="5AB9" b="8B 88"/>
+ <a u="5ABA" b="8B 89"/>
+ <a u="5ABB" b="8B 8A"/>
+ <a u="5ABC" b="8B 8B"/>
+ <a u="5ABD" b="8B 8C"/>
+ <a u="5ABE" b="E6 C5"/>
+ <a u="5ABF" b="8B 8D"/>
+ <a u="5AC0" b="8B 8E"/>
+ <a u="5AC1" b="BC DE"/>
+ <a u="5AC2" b="C9 A9"/>
+ <a u="5AC3" b="8B 8F"/>
+ <a u="5AC4" b="8B 90"/>
+ <a u="5AC5" b="8B 91"/>
+ <a u="5AC6" b="8B 92"/>
+ <a u="5AC7" b="8B 93"/>
+ <a u="5AC8" b="8B 94"/>
+ <a u="5AC9" b="BC B5"/>
+ <a u="5ACA" b="8B 95"/>
+ <a u="5ACB" b="8B 96"/>
+ <a u="5ACC" b="CF D3"/>
+ <a u="5ACD" b="8B 97"/>
+ <a u="5ACE" b="8B 98"/>
+ <a u="5ACF" b="8B 99"/>
+ <a u="5AD0" b="8B 9A"/>
+ <a u="5AD1" b="8B 9B"/>
+ <a u="5AD2" b="E6 C8"/>
+ <a u="5AD3" b="8B 9C"/>
+ <a u="5AD4" b="E6 C9"/>
+ <a u="5AD5" b="8B 9D"/>
+ <a u="5AD6" b="E6 CE"/>
+ <a u="5AD7" b="8B 9E"/>
+ <a u="5AD8" b="E6 D0"/>
+ <a u="5AD9" b="8B 9F"/>
+ <a u="5ADA" b="8B A0"/>
+ <a u="5ADB" b="8B A1"/>
+ <a u="5ADC" b="E6 D1"/>
+ <a u="5ADD" b="8B A2"/>
+ <a u="5ADE" b="8B A3"/>
+ <a u="5ADF" b="8B A4"/>
+ <a u="5AE0" b="E6 CB"/>
+ <a u="5AE1" b="B5 D5"/>
+ <a u="5AE2" b="8B A5"/>
+ <a u="5AE3" b="E6 CC"/>
+ <a u="5AE4" b="8B A6"/>
+ <a u="5AE5" b="8B A7"/>
+ <a u="5AE6" b="E6 CF"/>
+ <a u="5AE7" b="8B A8"/>
+ <a u="5AE8" b="8B A9"/>
+ <a u="5AE9" b="C4 DB"/>
+ <a u="5AEA" b="8B AA"/>
+ <a u="5AEB" b="E6 C6"/>
+ <a u="5AEC" b="8B AB"/>
+ <a u="5AED" b="8B AC"/>
+ <a u="5AEE" b="8B AD"/>
+ <a u="5AEF" b="8B AE"/>
+ <a u="5AF0" b="8B AF"/>
+ <a u="5AF1" b="E6 CD"/>
+ <a u="5AF2" b="8B B0"/>
+ <a u="5AF3" b="8B B1"/>
+ <a u="5AF4" b="8B B2"/>
+ <a u="5AF5" b="8B B3"/>
+ <a u="5AF6" b="8B B4"/>
+ <a u="5AF7" b="8B B5"/>
+ <a u="5AF8" b="8B B6"/>
+ <a u="5AF9" b="8B B7"/>
+ <a u="5AFA" b="8B B8"/>
+ <a u="5AFB" b="8B B9"/>
+ <a u="5AFC" b="8B BA"/>
+ <a u="5AFD" b="8B BB"/>
+ <a u="5AFE" b="8B BC"/>
+ <a u="5AFF" b="8B BD"/>
+ <a u="5B00" b="8B BE"/>
+ <a u="5B01" b="8B BF"/>
+ <a u="5B02" b="8B C0"/>
+ <a u="5B03" b="8B C1"/>
+ <a u="5B04" b="8B C2"/>
+ <a u="5B05" b="8B C3"/>
+ <a u="5B06" b="8B C4"/>
+ <a u="5B07" b="8B C5"/>
+ <a u="5B08" b="8B C6"/>
+ <a u="5B09" b="E6 D2"/>
+ <a u="5B0A" b="8B C7"/>
+ <a u="5B0B" b="8B C8"/>
+ <a u="5B0C" b="8B C9"/>
+ <a u="5B0D" b="8B CA"/>
+ <a u="5B0E" b="8B CB"/>
+ <a u="5B0F" b="8B CC"/>
+ <a u="5B10" b="8B CD"/>
+ <a u="5B11" b="8B CE"/>
+ <a u="5B12" b="8B CF"/>
+ <a u="5B13" b="8B D0"/>
+ <a u="5B14" b="8B D1"/>
+ <a u="5B15" b="8B D2"/>
+ <a u="5B16" b="E6 D4"/>
+ <a u="5B17" b="E6 D3"/>
+ <a u="5B18" b="8B D3"/>
+ <a u="5B19" b="8B D4"/>
+ <a u="5B1A" b="8B D5"/>
+ <a u="5B1B" b="8B D6"/>
+ <a u="5B1C" b="8B D7"/>
+ <a u="5B1D" b="8B D8"/>
+ <a u="5B1E" b="8B D9"/>
+ <a u="5B1F" b="8B DA"/>
+ <a u="5B20" b="8B DB"/>
+ <a u="5B21" b="8B DC"/>
+ <a u="5B22" b="8B DD"/>
+ <a u="5B23" b="8B DE"/>
+ <a u="5B24" b="8B DF"/>
+ <a u="5B25" b="8B E0"/>
+ <a u="5B26" b="8B E1"/>
+ <a u="5B27" b="8B E2"/>
+ <a u="5B28" b="8B E3"/>
+ <a u="5B29" b="8B E4"/>
+ <a u="5B2A" b="8B E5"/>
+ <a u="5B2B" b="8B E6"/>
+ <a u="5B2C" b="8B E7"/>
+ <a u="5B2D" b="8B E8"/>
+ <a u="5B2E" b="8B E9"/>
+ <a u="5B2F" b="8B EA"/>
+ <a u="5B30" b="8B EB"/>
+ <a u="5B31" b="8B EC"/>
+ <a u="5B32" b="E6 D5"/>
+ <a u="5B33" b="8B ED"/>
+ <a u="5B34" b="D9 F8"/>
+ <a u="5B35" b="8B EE"/>
+ <a u="5B36" b="8B EF"/>
+ <a u="5B37" b="E6 D6"/>
+ <a u="5B38" b="8B F0"/>
+ <a u="5B39" b="8B F1"/>
+ <a u="5B3A" b="8B F2"/>
+ <a u="5B3B" b="8B F3"/>
+ <a u="5B3C" b="8B F4"/>
+ <a u="5B3D" b="8B F5"/>
+ <a u="5B3E" b="8B F6"/>
+ <a u="5B3F" b="8B F7"/>
+ <a u="5B40" b="E6 D7"/>
+ <a u="5B41" b="8B F8"/>
+ <a u="5B42" b="8B F9"/>
+ <a u="5B43" b="8B FA"/>
+ <a u="5B44" b="8B FB"/>
+ <a u="5B45" b="8B FC"/>
+ <a u="5B46" b="8B FD"/>
+ <a u="5B47" b="8B FE"/>
+ <a u="5B48" b="8C 40"/>
+ <a u="5B49" b="8C 41"/>
+ <a u="5B4A" b="8C 42"/>
+ <a u="5B4B" b="8C 43"/>
+ <a u="5B4C" b="8C 44"/>
+ <a u="5B4D" b="8C 45"/>
+ <a u="5B4E" b="8C 46"/>
+ <a u="5B4F" b="8C 47"/>
+ <a u="5B50" b="D7 D3"/>
+ <a u="5B51" b="E6 DD"/>
+ <a u="5B52" b="8C 48"/>
+ <a u="5B53" b="E6 DE"/>
+ <a u="5B54" b="BF D7"/>
+ <a u="5B55" b="D4 D0"/>
+ <a u="5B56" b="8C 49"/>
+ <a u="5B57" b="D7 D6"/>
+ <a u="5B58" b="B4 E6"/>
+ <a u="5B59" b="CB EF"/>
+ <a u="5B5A" b="E6 DA"/>
+ <a u="5B5B" b="D8 C3"/>
+ <a u="5B5C" b="D7 CE"/>
+ <a u="5B5D" b="D0 A2"/>
+ <a u="5B5E" b="8C 4A"/>
+ <a u="5B5F" b="C3 CF"/>
+ <a u="5B60" b="8C 4B"/>
+ <a u="5B61" b="8C 4C"/>
+ <a u="5B62" b="E6 DF"/>
+ <a u="5B63" b="BC BE"/>
+ <a u="5B64" b="B9 C2"/>
+ <a u="5B65" b="E6 DB"/>
+ <a u="5B66" b="D1 A7"/>
+ <a u="5B67" b="8C 4D"/>
+ <a u="5B68" b="8C 4E"/>
+ <a u="5B69" b="BA A2"/>
+ <a u="5B6A" b="C2 CF"/>
+ <a u="5B6B" b="8C 4F"/>
+ <a u="5B6C" b="D8 AB"/>
+ <a u="5B6D" b="8C 50"/>
+ <a u="5B6E" b="8C 51"/>
+ <a u="5B6F" b="8C 52"/>
+ <a u="5B70" b="CA EB"/>
+ <a u="5B71" b="E5 EE"/>
+ <a u="5B72" b="8C 53"/>
+ <a u="5B73" b="E6 DC"/>
+ <a u="5B74" b="8C 54"/>
+ <a u="5B75" b="B7 F5"/>
+ <a u="5B76" b="8C 55"/>
+ <a u="5B77" b="8C 56"/>
+ <a u="5B78" b="8C 57"/>
+ <a u="5B79" b="8C 58"/>
+ <a u="5B7A" b="C8 E6"/>
+ <a u="5B7B" b="8C 59"/>
+ <a u="5B7C" b="8C 5A"/>
+ <a u="5B7D" b="C4 F5"/>
+ <a u="5B7E" b="8C 5B"/>
+ <a u="5B7F" b="8C 5C"/>
+ <a u="5B80" b="E5 B2"/>
+ <a u="5B81" b="C4 FE"/>
+ <a u="5B82" b="8C 5D"/>
+ <a u="5B83" b="CB FC"/>
+ <a u="5B84" b="E5 B3"/>
+ <a u="5B85" b="D5 AC"/>
+ <a u="5B86" b="8C 5E"/>
+ <a u="5B87" b="D3 EE"/>
+ <a u="5B88" b="CA D8"/>
+ <a u="5B89" b="B0 B2"/>
+ <a u="5B8A" b="8C 5F"/>
+ <a u="5B8B" b="CB CE"/>
+ <a u="5B8C" b="CD EA"/>
+ <a u="5B8D" b="8C 60"/>
+ <a u="5B8E" b="8C 61"/>
+ <a u="5B8F" b="BA EA"/>
+ <a u="5B90" b="8C 62"/>
+ <a u="5B91" b="8C 63"/>
+ <a u="5B92" b="8C 64"/>
+ <a u="5B93" b="E5 B5"/>
+ <a u="5B94" b="8C 65"/>
+ <a u="5B95" b="E5 B4"/>
+ <a u="5B96" b="8C 66"/>
+ <a u="5B97" b="D7 DA"/>
+ <a u="5B98" b="B9 D9"/>
+ <a u="5B99" b="D6 E6"/>
+ <a u="5B9A" b="B6 A8"/>
+ <a u="5B9B" b="CD F0"/>
+ <a u="5B9C" b="D2 CB"/>
+ <a u="5B9D" b="B1 A6"/>
+ <a u="5B9E" b="CA B5"/>
+ <a u="5B9F" b="8C 67"/>
+ <a u="5BA0" b="B3 E8"/>
+ <a u="5BA1" b="C9 F3"/>
+ <a u="5BA2" b="BF CD"/>
+ <a u="5BA3" b="D0 FB"/>
+ <a u="5BA4" b="CA D2"/>
+ <a u="5BA5" b="E5 B6"/>
+ <a u="5BA6" b="BB C2"/>
+ <a u="5BA7" b="8C 68"/>
+ <a u="5BA8" b="8C 69"/>
+ <a u="5BA9" b="8C 6A"/>
+ <a u="5BAA" b="CF DC"/>
+ <a u="5BAB" b="B9 AC"/>
+ <a u="5BAC" b="8C 6B"/>
+ <a u="5BAD" b="8C 6C"/>
+ <a u="5BAE" b="8C 6D"/>
+ <a u="5BAF" b="8C 6E"/>
+ <a u="5BB0" b="D4 D7"/>
+ <a u="5BB1" b="8C 6F"/>
+ <a u="5BB2" b="8C 70"/>
+ <a u="5BB3" b="BA A6"/>
+ <a u="5BB4" b="D1 E7"/>
+ <a u="5BB5" b="CF FC"/>
+ <a u="5BB6" b="BC D2"/>
+ <a u="5BB7" b="8C 71"/>
+ <a u="5BB8" b="E5 B7"/>
+ <a u="5BB9" b="C8 DD"/>
+ <a u="5BBA" b="8C 72"/>
+ <a u="5BBB" b="8C 73"/>
+ <a u="5BBC" b="8C 74"/>
+ <a u="5BBD" b="BF ED"/>
+ <a u="5BBE" b="B1 F6"/>
+ <a u="5BBF" b="CB DE"/>
+ <a u="5BC0" b="8C 75"/>
+ <a u="5BC1" b="8C 76"/>
+ <a u="5BC2" b="BC C5"/>
+ <a u="5BC3" b="8C 77"/>
+ <a u="5BC4" b="BC C4"/>
+ <a u="5BC5" b="D2 FA"/>
+ <a u="5BC6" b="C3 DC"/>
+ <a u="5BC7" b="BF DC"/>
+ <a u="5BC8" b="8C 78"/>
+ <a u="5BC9" b="8C 79"/>
+ <a u="5BCA" b="8C 7A"/>
+ <a u="5BCB" b="8C 7B"/>
+ <a u="5BCC" b="B8 BB"/>
+ <a u="5BCD" b="8C 7C"/>
+ <a u="5BCE" b="8C 7D"/>
+ <a u="5BCF" b="8C 7E"/>
+ <a u="5BD0" b="C3 C2"/>
+ <a u="5BD1" b="8C 80"/>
+ <a u="5BD2" b="BA AE"/>
+ <a u="5BD3" b="D4 A2"/>
+ <a u="5BD4" b="8C 81"/>
+ <a u="5BD5" b="8C 82"/>
+ <a u="5BD6" b="8C 83"/>
+ <a u="5BD7" b="8C 84"/>
+ <a u="5BD8" b="8C 85"/>
+ <a u="5BD9" b="8C 86"/>
+ <a u="5BDA" b="8C 87"/>
+ <a u="5BDB" b="8C 88"/>
+ <a u="5BDC" b="8C 89"/>
+ <a u="5BDD" b="C7 DE"/>
+ <a u="5BDE" b="C4 AF"/>
+ <a u="5BDF" b="B2 EC"/>
+ <a u="5BE0" b="8C 8A"/>
+ <a u="5BE1" b="B9 D1"/>
+ <a u="5BE2" b="8C 8B"/>
+ <a u="5BE3" b="8C 8C"/>
+ <a u="5BE4" b="E5 BB"/>
+ <a u="5BE5" b="C1 C8"/>
+ <a u="5BE6" b="8C 8D"/>
+ <a u="5BE7" b="8C 8E"/>
+ <a u="5BE8" b="D5 AF"/>
+ <a u="5BE9" b="8C 8F"/>
+ <a u="5BEA" b="8C 90"/>
+ <a u="5BEB" b="8C 91"/>
+ <a u="5BEC" b="8C 92"/>
+ <a u="5BED" b="8C 93"/>
+ <a u="5BEE" b="E5 BC"/>
+ <a u="5BEF" b="8C 94"/>
+ <a u="5BF0" b="E5 BE"/>
+ <a u="5BF1" b="8C 95"/>
+ <a u="5BF2" b="8C 96"/>
+ <a u="5BF3" b="8C 97"/>
+ <a u="5BF4" b="8C 98"/>
+ <a u="5BF5" b="8C 99"/>
+ <a u="5BF6" b="8C 9A"/>
+ <a u="5BF7" b="8C 9B"/>
+ <a u="5BF8" b="B4 E7"/>
+ <a u="5BF9" b="B6 D4"/>
+ <a u="5BFA" b="CB C2"/>
+ <a u="5BFB" b="D1 B0"/>
+ <a u="5BFC" b="B5 BC"/>
+ <a u="5BFD" b="8C 9C"/>
+ <a u="5BFE" b="8C 9D"/>
+ <a u="5BFF" b="CA D9"/>
+ <a u="5C00" b="8C 9E"/>
+ <a u="5C01" b="B7 E2"/>
+ <a u="5C02" b="8C 9F"/>
+ <a u="5C03" b="8C A0"/>
+ <a u="5C04" b="C9 E4"/>
+ <a u="5C05" b="8C A1"/>
+ <a u="5C06" b="BD AB"/>
+ <a u="5C07" b="8C A2"/>
+ <a u="5C08" b="8C A3"/>
+ <a u="5C09" b="CE BE"/>
+ <a u="5C0A" b="D7 F0"/>
+ <a u="5C0B" b="8C A4"/>
+ <a u="5C0C" b="8C A5"/>
+ <a u="5C0D" b="8C A6"/>
+ <a u="5C0E" b="8C A7"/>
+ <a u="5C0F" b="D0 A1"/>
+ <a u="5C10" b="8C A8"/>
+ <a u="5C11" b="C9 D9"/>
+ <a u="5C12" b="8C A9"/>
+ <a u="5C13" b="8C AA"/>
+ <a u="5C14" b="B6 FB"/>
+ <a u="5C15" b="E6 D8"/>
+ <a u="5C16" b="BC E2"/>
+ <a u="5C17" b="8C AB"/>
+ <a u="5C18" b="B3 BE"/>
+ <a u="5C19" b="8C AC"/>
+ <a u="5C1A" b="C9 D0"/>
+ <a u="5C1B" b="8C AD"/>
+ <a u="5C1C" b="E6 D9"/>
+ <a u="5C1D" b="B3 A2"/>
+ <a u="5C1E" b="8C AE"/>
+ <a u="5C1F" b="8C AF"/>
+ <a u="5C20" b="8C B0"/>
+ <a u="5C21" b="8C B1"/>
+ <a u="5C22" b="DE CC"/>
+ <a u="5C23" b="8C B2"/>
+ <a u="5C24" b="D3 C8"/>
+ <a u="5C25" b="DE CD"/>
+ <a u="5C26" b="8C B3"/>
+ <a u="5C27" b="D2 A2"/>
+ <a u="5C28" b="8C B4"/>
+ <a u="5C29" b="8C B5"/>
+ <a u="5C2A" b="8C B6"/>
+ <a u="5C2B" b="8C B7"/>
+ <a u="5C2C" b="DE CE"/>
+ <a u="5C2D" b="8C B8"/>
+ <a u="5C2E" b="8C B9"/>
+ <a u="5C2F" b="8C BA"/>
+ <a u="5C30" b="8C BB"/>
+ <a u="5C31" b="BE CD"/>
+ <a u="5C32" b="8C BC"/>
+ <a u="5C33" b="8C BD"/>
+ <a u="5C34" b="DE CF"/>
+ <a u="5C35" b="8C BE"/>
+ <a u="5C36" b="8C BF"/>
+ <a u="5C37" b="8C C0"/>
+ <a u="5C38" b="CA AC"/>
+ <a u="5C39" b="D2 FC"/>
+ <a u="5C3A" b="B3 DF"/>
+ <a u="5C3B" b="E5 EA"/>
+ <a u="5C3C" b="C4 E1"/>
+ <a u="5C3D" b="BE A1"/>
+ <a u="5C3E" b="CE B2"/>
+ <a u="5C3F" b="C4 F2"/>
+ <a u="5C40" b="BE D6"/>
+ <a u="5C41" b="C6 A8"/>
+ <a u="5C42" b="B2 E3"/>
+ <a u="5C43" b="8C C1"/>
+ <a u="5C44" b="8C C2"/>
+ <a u="5C45" b="BE D3"/>
+ <a u="5C46" b="8C C3"/>
+ <a u="5C47" b="8C C4"/>
+ <a u="5C48" b="C7 FC"/>
+ <a u="5C49" b="CC EB"/>
+ <a u="5C4A" b="BD EC"/>
+ <a u="5C4B" b="CE DD"/>
+ <a u="5C4C" b="8C C5"/>
+ <a u="5C4D" b="8C C6"/>
+ <a u="5C4E" b="CA BA"/>
+ <a u="5C4F" b="C6 C1"/>
+ <a u="5C50" b="E5 EC"/>
+ <a u="5C51" b="D0 BC"/>
+ <a u="5C52" b="8C C7"/>
+ <a u="5C53" b="8C C8"/>
+ <a u="5C54" b="8C C9"/>
+ <a u="5C55" b="D5 B9"/>
+ <a u="5C56" b="8C CA"/>
+ <a u="5C57" b="8C CB"/>
+ <a u="5C58" b="8C CC"/>
+ <a u="5C59" b="E5 ED"/>
+ <a u="5C5A" b="8C CD"/>
+ <a u="5C5B" b="8C CE"/>
+ <a u="5C5C" b="8C CF"/>
+ <a u="5C5D" b="8C D0"/>
+ <a u="5C5E" b="CA F4"/>
+ <a u="5C5F" b="8C D1"/>
+ <a u="5C60" b="CD C0"/>
+ <a u="5C61" b="C2 C5"/>
+ <a u="5C62" b="8C D2"/>
+ <a u="5C63" b="E5 EF"/>
+ <a u="5C64" b="8C D3"/>
+ <a u="5C65" b="C2 C4"/>
+ <a u="5C66" b="E5 F0"/>
+ <a u="5C67" b="8C D4"/>
+ <a u="5C68" b="8C D5"/>
+ <a u="5C69" b="8C D6"/>
+ <a u="5C6A" b="8C D7"/>
+ <a u="5C6B" b="8C D8"/>
+ <a u="5C6C" b="8C D9"/>
+ <a u="5C6D" b="8C DA"/>
+ <a u="5C6E" b="E5 F8"/>
+ <a u="5C6F" b="CD CD"/>
+ <a u="5C70" b="8C DB"/>
+ <a u="5C71" b="C9 BD"/>
+ <a u="5C72" b="8C DC"/>
+ <a u="5C73" b="8C DD"/>
+ <a u="5C74" b="8C DE"/>
+ <a u="5C75" b="8C DF"/>
+ <a u="5C76" b="8C E0"/>
+ <a u="5C77" b="8C E1"/>
+ <a u="5C78" b="8C E2"/>
+ <a u="5C79" b="D2 D9"/>
+ <a u="5C7A" b="E1 A8"/>
+ <a u="5C7B" b="8C E3"/>
+ <a u="5C7C" b="8C E4"/>
+ <a u="5C7D" b="8C E5"/>
+ <a u="5C7E" b="8C E6"/>
+ <a u="5C7F" b="D3 EC"/>
+ <a u="5C80" b="8C E7"/>
+ <a u="5C81" b="CB EA"/>
+ <a u="5C82" b="C6 F1"/>
+ <a u="5C83" b="8C E8"/>
+ <a u="5C84" b="8C E9"/>
+ <a u="5C85" b="8C EA"/>
+ <a u="5C86" b="8C EB"/>
+ <a u="5C87" b="8C EC"/>
+ <a u="5C88" b="E1 AC"/>
+ <a u="5C89" b="8C ED"/>
+ <a u="5C8A" b="8C EE"/>
+ <a u="5C8B" b="8C EF"/>
+ <a u="5C8C" b="E1 A7"/>
+ <a u="5C8D" b="E1 A9"/>
+ <a u="5C8E" b="8C F0"/>
+ <a u="5C8F" b="8C F1"/>
+ <a u="5C90" b="E1 AA"/>
+ <a u="5C91" b="E1 AF"/>
+ <a u="5C92" b="8C F2"/>
+ <a u="5C93" b="8C F3"/>
+ <a u="5C94" b="B2 ED"/>
+ <a u="5C95" b="8C F4"/>
+ <a u="5C96" b="E1 AB"/>
+ <a u="5C97" b="B8 DA"/>
+ <a u="5C98" b="E1 AD"/>
+ <a u="5C99" b="E1 AE"/>
+ <a u="5C9A" b="E1 B0"/>
+ <a u="5C9B" b="B5 BA"/>
+ <a u="5C9C" b="E1 B1"/>
+ <a u="5C9D" b="8C F5"/>
+ <a u="5C9E" b="8C F6"/>
+ <a u="5C9F" b="8C F7"/>
+ <a u="5CA0" b="8C F8"/>
+ <a u="5CA1" b="8C F9"/>
+ <a u="5CA2" b="E1 B3"/>
+ <a u="5CA3" b="E1 B8"/>
+ <a u="5CA4" b="8C FA"/>
+ <a u="5CA5" b="8C FB"/>
+ <a u="5CA6" b="8C FC"/>
+ <a u="5CA7" b="8C FD"/>
+ <a u="5CA8" b="8C FE"/>
+ <a u="5CA9" b="D1 D2"/>
+ <a u="5CAA" b="8D 40"/>
+ <a u="5CAB" b="E1 B6"/>
+ <a u="5CAC" b="E1 B5"/>
+ <a u="5CAD" b="C1 EB"/>
+ <a u="5CAE" b="8D 41"/>
+ <a u="5CAF" b="8D 42"/>
+ <a u="5CB0" b="8D 43"/>
+ <a u="5CB1" b="E1 B7"/>
+ <a u="5CB2" b="8D 44"/>
+ <a u="5CB3" b="D4 C0"/>
+ <a u="5CB4" b="8D 45"/>
+ <a u="5CB5" b="E1 B2"/>
+ <a u="5CB6" b="8D 46"/>
+ <a u="5CB7" b="E1 BA"/>
+ <a u="5CB8" b="B0 B6"/>
+ <a u="5CB9" b="8D 47"/>
+ <a u="5CBA" b="8D 48"/>
+ <a u="5CBB" b="8D 49"/>
+ <a u="5CBC" b="8D 4A"/>
+ <a u="5CBD" b="E1 B4"/>
+ <a u="5CBE" b="8D 4B"/>
+ <a u="5CBF" b="BF F9"/>
+ <a u="5CC0" b="8D 4C"/>
+ <a u="5CC1" b="E1 B9"/>
+ <a u="5CC2" b="8D 4D"/>
+ <a u="5CC3" b="8D 4E"/>
+ <a u="5CC4" b="E1 BB"/>
+ <a u="5CC5" b="8D 4F"/>
+ <a u="5CC6" b="8D 50"/>
+ <a u="5CC7" b="8D 51"/>
+ <a u="5CC8" b="8D 52"/>
+ <a u="5CC9" b="8D 53"/>
+ <a u="5CCA" b="8D 54"/>
+ <a u="5CCB" b="E1 BE"/>
+ <a u="5CCC" b="8D 55"/>
+ <a u="5CCD" b="8D 56"/>
+ <a u="5CCE" b="8D 57"/>
+ <a u="5CCF" b="8D 58"/>
+ <a u="5CD0" b="8D 59"/>
+ <a u="5CD1" b="8D 5A"/>
+ <a u="5CD2" b="E1 BC"/>
+ <a u="5CD3" b="8D 5B"/>
+ <a u="5CD4" b="8D 5C"/>
+ <a u="5CD5" b="8D 5D"/>
+ <a u="5CD6" b="8D 5E"/>
+ <a u="5CD7" b="8D 5F"/>
+ <a u="5CD8" b="8D 60"/>
+ <a u="5CD9" b="D6 C5"/>
+ <a u="5CDA" b="8D 61"/>
+ <a u="5CDB" b="8D 62"/>
+ <a u="5CDC" b="8D 63"/>
+ <a u="5CDD" b="8D 64"/>
+ <a u="5CDE" b="8D 65"/>
+ <a u="5CDF" b="8D 66"/>
+ <a u="5CE0" b="8D 67"/>
+ <a u="5CE1" b="CF BF"/>
+ <a u="5CE2" b="8D 68"/>
+ <a u="5CE3" b="8D 69"/>
+ <a u="5CE4" b="E1 BD"/>
+ <a u="5CE5" b="E1 BF"/>
+ <a u="5CE6" b="C2 CD"/>
+ <a u="5CE7" b="8D 6A"/>
+ <a u="5CE8" b="B6 EB"/>
+ <a u="5CE9" b="8D 6B"/>
+ <a u="5CEA" b="D3 F8"/>
+ <a u="5CEB" b="8D 6C"/>
+ <a u="5CEC" b="8D 6D"/>
+ <a u="5CED" b="C7 CD"/>
+ <a u="5CEE" b="8D 6E"/>
+ <a u="5CEF" b="8D 6F"/>
+ <a u="5CF0" b="B7 E5"/>
+ <a u="5CF1" b="8D 70"/>
+ <a u="5CF2" b="8D 71"/>
+ <a u="5CF3" b="8D 72"/>
+ <a u="5CF4" b="8D 73"/>
+ <a u="5CF5" b="8D 74"/>
+ <a u="5CF6" b="8D 75"/>
+ <a u="5CF7" b="8D 76"/>
+ <a u="5CF8" b="8D 77"/>
+ <a u="5CF9" b="8D 78"/>
+ <a u="5CFA" b="8D 79"/>
+ <a u="5CFB" b="BE FE"/>
+ <a u="5CFC" b="8D 7A"/>
+ <a u="5CFD" b="8D 7B"/>
+ <a u="5CFE" b="8D 7C"/>
+ <a u="5CFF" b="8D 7D"/>
+ <a u="5D00" b="8D 7E"/>
+ <a u="5D01" b="8D 80"/>
+ <a u="5D02" b="E1 C0"/>
+ <a u="5D03" b="E1 C1"/>
+ <a u="5D04" b="8D 81"/>
+ <a u="5D05" b="8D 82"/>
+ <a u="5D06" b="E1 C7"/>
+ <a u="5D07" b="B3 E7"/>
+ <a u="5D08" b="8D 83"/>
+ <a u="5D09" b="8D 84"/>
+ <a u="5D0A" b="8D 85"/>
+ <a u="5D0B" b="8D 86"/>
+ <a u="5D0C" b="8D 87"/>
+ <a u="5D0D" b="8D 88"/>
+ <a u="5D0E" b="C6 E9"/>
+ <a u="5D0F" b="8D 89"/>
+ <a u="5D10" b="8D 8A"/>
+ <a u="5D11" b="8D 8B"/>
+ <a u="5D12" b="8D 8C"/>
+ <a u="5D13" b="8D 8D"/>
+ <a u="5D14" b="B4 DE"/>
+ <a u="5D15" b="8D 8E"/>
+ <a u="5D16" b="D1 C2"/>
+ <a u="5D17" b="8D 8F"/>
+ <a u="5D18" b="8D 90"/>
+ <a u="5D19" b="8D 91"/>
+ <a u="5D1A" b="8D 92"/>
+ <a u="5D1B" b="E1 C8"/>
+ <a u="5D1C" b="8D 93"/>
+ <a u="5D1D" b="8D 94"/>
+ <a u="5D1E" b="E1 C6"/>
+ <a u="5D1F" b="8D 95"/>
+ <a u="5D20" b="8D 96"/>
+ <a u="5D21" b="8D 97"/>
+ <a u="5D22" b="8D 98"/>
+ <a u="5D23" b="8D 99"/>
+ <a u="5D24" b="E1 C5"/>
+ <a u="5D25" b="8D 9A"/>
+ <a u="5D26" b="E1 C3"/>
+ <a u="5D27" b="E1 C2"/>
+ <a u="5D28" b="8D 9B"/>
+ <a u="5D29" b="B1 C0"/>
+ <a u="5D2A" b="8D 9C"/>
+ <a u="5D2B" b="8D 9D"/>
+ <a u="5D2C" b="8D 9E"/>
+ <a u="5D2D" b="D5 B8"/>
+ <a u="5D2E" b="E1 C4"/>
+ <a u="5D2F" b="8D 9F"/>
+ <a u="5D30" b="8D A0"/>
+ <a u="5D31" b="8D A1"/>
+ <a u="5D32" b="8D A2"/>
+ <a u="5D33" b="8D A3"/>
+ <a u="5D34" b="E1 CB"/>
+ <a u="5D35" b="8D A4"/>
+ <a u="5D36" b="8D A5"/>
+ <a u="5D37" b="8D A6"/>
+ <a u="5D38" b="8D A7"/>
+ <a u="5D39" b="8D A8"/>
+ <a u="5D3A" b="8D A9"/>
+ <a u="5D3B" b="8D AA"/>
+ <a u="5D3C" b="8D AB"/>
+ <a u="5D3D" b="E1 CC"/>
+ <a u="5D3E" b="E1 CA"/>
+ <a u="5D3F" b="8D AC"/>
+ <a u="5D40" b="8D AD"/>
+ <a u="5D41" b="8D AE"/>
+ <a u="5D42" b="8D AF"/>
+ <a u="5D43" b="8D B0"/>
+ <a u="5D44" b="8D B1"/>
+ <a u="5D45" b="8D B2"/>
+ <a u="5D46" b="8D B3"/>
+ <a u="5D47" b="EF FA"/>
+ <a u="5D48" b="8D B4"/>
+ <a u="5D49" b="8D B5"/>
+ <a u="5D4A" b="E1 D3"/>
+ <a u="5D4B" b="E1 D2"/>
+ <a u="5D4C" b="C7 B6"/>
+ <a u="5D4D" b="8D B6"/>
+ <a u="5D4E" b="8D B7"/>
+ <a u="5D4F" b="8D B8"/>
+ <a u="5D50" b="8D B9"/>
+ <a u="5D51" b="8D BA"/>
+ <a u="5D52" b="8D BB"/>
+ <a u="5D53" b="8D BC"/>
+ <a u="5D54" b="8D BD"/>
+ <a u="5D55" b="8D BE"/>
+ <a u="5D56" b="8D BF"/>
+ <a u="5D57" b="8D C0"/>
+ <a u="5D58" b="E1 C9"/>
+ <a u="5D59" b="8D C1"/>
+ <a u="5D5A" b="8D C2"/>
+ <a u="5D5B" b="E1 CE"/>
+ <a u="5D5C" b="8D C3"/>
+ <a u="5D5D" b="E1 D0"/>
+ <a u="5D5E" b="8D C4"/>
+ <a u="5D5F" b="8D C5"/>
+ <a u="5D60" b="8D C6"/>
+ <a u="5D61" b="8D C7"/>
+ <a u="5D62" b="8D C8"/>
+ <a u="5D63" b="8D C9"/>
+ <a u="5D64" b="8D CA"/>
+ <a u="5D65" b="8D CB"/>
+ <a u="5D66" b="8D CC"/>
+ <a u="5D67" b="8D CD"/>
+ <a u="5D68" b="8D CE"/>
+ <a u="5D69" b="E1 D4"/>
+ <a u="5D6A" b="8D CF"/>
+ <a u="5D6B" b="E1 D1"/>
+ <a u="5D6C" b="E1 CD"/>
+ <a u="5D6D" b="8D D0"/>
+ <a u="5D6E" b="8D D1"/>
+ <a u="5D6F" b="E1 CF"/>
+ <a u="5D70" b="8D D2"/>
+ <a u="5D71" b="8D D3"/>
+ <a u="5D72" b="8D D4"/>
+ <a u="5D73" b="8D D5"/>
+ <a u="5D74" b="E1 D5"/>
+ <a u="5D75" b="8D D6"/>
+ <a u="5D76" b="8D D7"/>
+ <a u="5D77" b="8D D8"/>
+ <a u="5D78" b="8D D9"/>
+ <a u="5D79" b="8D DA"/>
+ <a u="5D7A" b="8D DB"/>
+ <a u="5D7B" b="8D DC"/>
+ <a u="5D7C" b="8D DD"/>
+ <a u="5D7D" b="8D DE"/>
+ <a u="5D7E" b="8D DF"/>
+ <a u="5D7F" b="8D E0"/>
+ <a u="5D80" b="8D E1"/>
+ <a u="5D81" b="8D E2"/>
+ <a u="5D82" b="E1 D6"/>
+ <a u="5D83" b="8D E3"/>
+ <a u="5D84" b="8D E4"/>
+ <a u="5D85" b="8D E5"/>
+ <a u="5D86" b="8D E6"/>
+ <a u="5D87" b="8D E7"/>
+ <a u="5D88" b="8D E8"/>
+ <a u="5D89" b="8D E9"/>
+ <a u="5D8A" b="8D EA"/>
+ <a u="5D8B" b="8D EB"/>
+ <a u="5D8C" b="8D EC"/>
+ <a u="5D8D" b="8D ED"/>
+ <a u="5D8E" b="8D EE"/>
+ <a u="5D8F" b="8D EF"/>
+ <a u="5D90" b="8D F0"/>
+ <a u="5D91" b="8D F1"/>
+ <a u="5D92" b="8D F2"/>
+ <a u="5D93" b="8D F3"/>
+ <a u="5D94" b="8D F4"/>
+ <a u="5D95" b="8D F5"/>
+ <a u="5D96" b="8D F6"/>
+ <a u="5D97" b="8D F7"/>
+ <a u="5D98" b="8D F8"/>
+ <a u="5D99" b="E1 D7"/>
+ <a u="5D9A" b="8D F9"/>
+ <a u="5D9B" b="8D FA"/>
+ <a u="5D9C" b="8D FB"/>
+ <a u="5D9D" b="E1 D8"/>
+ <a u="5D9E" b="8D FC"/>
+ <a u="5D9F" b="8D FD"/>
+ <a u="5DA0" b="8D FE"/>
+ <a u="5DA1" b="8E 40"/>
+ <a u="5DA2" b="8E 41"/>
+ <a u="5DA3" b="8E 42"/>
+ <a u="5DA4" b="8E 43"/>
+ <a u="5DA5" b="8E 44"/>
+ <a u="5DA6" b="8E 45"/>
+ <a u="5DA7" b="8E 46"/>
+ <a u="5DA8" b="8E 47"/>
+ <a u="5DA9" b="8E 48"/>
+ <a u="5DAA" b="8E 49"/>
+ <a u="5DAB" b="8E 4A"/>
+ <a u="5DAC" b="8E 4B"/>
+ <a u="5DAD" b="8E 4C"/>
+ <a u="5DAE" b="8E 4D"/>
+ <a u="5DAF" b="8E 4E"/>
+ <a u="5DB0" b="8E 4F"/>
+ <a u="5DB1" b="8E 50"/>
+ <a u="5DB2" b="8E 51"/>
+ <a u="5DB3" b="8E 52"/>
+ <a u="5DB4" b="8E 53"/>
+ <a u="5DB5" b="8E 54"/>
+ <a u="5DB6" b="8E 55"/>
+ <a u="5DB7" b="E1 DA"/>
+ <a u="5DB8" b="8E 56"/>
+ <a u="5DB9" b="8E 57"/>
+ <a u="5DBA" b="8E 58"/>
+ <a u="5DBB" b="8E 59"/>
+ <a u="5DBC" b="8E 5A"/>
+ <a u="5DBD" b="8E 5B"/>
+ <a u="5DBE" b="8E 5C"/>
+ <a u="5DBF" b="8E 5D"/>
+ <a u="5DC0" b="8E 5E"/>
+ <a u="5DC1" b="8E 5F"/>
+ <a u="5DC2" b="8E 60"/>
+ <a u="5DC3" b="8E 61"/>
+ <a u="5DC4" b="8E 62"/>
+ <a u="5DC5" b="E1 DB"/>
+ <a u="5DC6" b="8E 63"/>
+ <a u="5DC7" b="8E 64"/>
+ <a u="5DC8" b="8E 65"/>
+ <a u="5DC9" b="8E 66"/>
+ <a u="5DCA" b="8E 67"/>
+ <a u="5DCB" b="8E 68"/>
+ <a u="5DCC" b="8E 69"/>
+ <a u="5DCD" b="CE A1"/>
+ <a u="5DCE" b="8E 6A"/>
+ <a u="5DCF" b="8E 6B"/>
+ <a u="5DD0" b="8E 6C"/>
+ <a u="5DD1" b="8E 6D"/>
+ <a u="5DD2" b="8E 6E"/>
+ <a u="5DD3" b="8E 6F"/>
+ <a u="5DD4" b="8E 70"/>
+ <a u="5DD5" b="8E 71"/>
+ <a u="5DD6" b="8E 72"/>
+ <a u="5DD7" b="8E 73"/>
+ <a u="5DD8" b="8E 74"/>
+ <a u="5DD9" b="8E 75"/>
+ <a u="5DDA" b="8E 76"/>
+ <a u="5DDB" b="E7 DD"/>
+ <a u="5DDC" b="8E 77"/>
+ <a u="5DDD" b="B4 A8"/>
+ <a u="5DDE" b="D6 DD"/>
+ <a u="5DDF" b="8E 78"/>
+ <a u="5DE0" b="8E 79"/>
+ <a u="5DE1" b="D1 B2"/>
+ <a u="5DE2" b="B3 B2"/>
+ <a u="5DE3" b="8E 7A"/>
+ <a u="5DE4" b="8E 7B"/>
+ <a u="5DE5" b="B9 A4"/>
+ <a u="5DE6" b="D7 F3"/>
+ <a u="5DE7" b="C7 C9"/>
+ <a u="5DE8" b="BE DE"/>
+ <a u="5DE9" b="B9 AE"/>
+ <a u="5DEA" b="8E 7C"/>
+ <a u="5DEB" b="CE D7"/>
+ <a u="5DEC" b="8E 7D"/>
+ <a u="5DED" b="8E 7E"/>
+ <a u="5DEE" b="B2 EE"/>
+ <a u="5DEF" b="DB CF"/>
+ <a u="5DF0" b="8E 80"/>
+ <a u="5DF1" b="BC BA"/>
+ <a u="5DF2" b="D2 D1"/>
+ <a u="5DF3" b="CB C8"/>
+ <a u="5DF4" b="B0 CD"/>
+ <a u="5DF5" b="8E 81"/>
+ <a u="5DF6" b="8E 82"/>
+ <a u="5DF7" b="CF EF"/>
+ <a u="5DF8" b="8E 83"/>
+ <a u="5DF9" b="8E 84"/>
+ <a u="5DFA" b="8E 85"/>
+ <a u="5DFB" b="8E 86"/>
+ <a u="5DFC" b="8E 87"/>
+ <a u="5DFD" b="D9 E3"/>
+ <a u="5DFE" b="BD ED"/>
+ <a u="5DFF" b="8E 88"/>
+ <a u="5E00" b="8E 89"/>
+ <a u="5E01" b="B1 D2"/>
+ <a u="5E02" b="CA D0"/>
+ <a u="5E03" b="B2 BC"/>
+ <a u="5E04" b="8E 8A"/>
+ <a u="5E05" b="CB A7"/>
+ <a u="5E06" b="B7 AB"/>
+ <a u="5E07" b="8E 8B"/>
+ <a u="5E08" b="CA A6"/>
+ <a u="5E09" b="8E 8C"/>
+ <a u="5E0A" b="8E 8D"/>
+ <a u="5E0B" b="8E 8E"/>
+ <a u="5E0C" b="CF A3"/>
+ <a u="5E0D" b="8E 8F"/>
+ <a u="5E0E" b="8E 90"/>
+ <a u="5E0F" b="E0 F8"/>
+ <a u="5E10" b="D5 CA"/>
+ <a u="5E11" b="E0 FB"/>
+ <a u="5E12" b="8E 91"/>
+ <a u="5E13" b="8E 92"/>
+ <a u="5E14" b="E0 FA"/>
+ <a u="5E15" b="C5 C1"/>
+ <a u="5E16" b="CC FB"/>
+ <a u="5E17" b="8E 93"/>
+ <a u="5E18" b="C1 B1"/>
+ <a u="5E19" b="E0 F9"/>
+ <a u="5E1A" b="D6 E3"/>
+ <a u="5E1B" b="B2 AF"/>
+ <a u="5E1C" b="D6 C4"/>
+ <a u="5E1D" b="B5 DB"/>
+ <a u="5E1E" b="8E 94"/>
+ <a u="5E1F" b="8E 95"/>
+ <a u="5E20" b="8E 96"/>
+ <a u="5E21" b="8E 97"/>
+ <a u="5E22" b="8E 98"/>
+ <a u="5E23" b="8E 99"/>
+ <a u="5E24" b="8E 9A"/>
+ <a u="5E25" b="8E 9B"/>
+ <a u="5E26" b="B4 F8"/>
+ <a u="5E27" b="D6 A1"/>
+ <a u="5E28" b="8E 9C"/>
+ <a u="5E29" b="8E 9D"/>
+ <a u="5E2A" b="8E 9E"/>
+ <a u="5E2B" b="8E 9F"/>
+ <a u="5E2C" b="8E A0"/>
+ <a u="5E2D" b="CF AF"/>
+ <a u="5E2E" b="B0 EF"/>
+ <a u="5E2F" b="8E A1"/>
+ <a u="5E30" b="8E A2"/>
+ <a u="5E31" b="E0 FC"/>
+ <a u="5E32" b="8E A3"/>
+ <a u="5E33" b="8E A4"/>
+ <a u="5E34" b="8E A5"/>
+ <a u="5E35" b="8E A6"/>
+ <a u="5E36" b="8E A7"/>
+ <a u="5E37" b="E1 A1"/>
+ <a u="5E38" b="B3 A3"/>
+ <a u="5E39" b="8E A8"/>
+ <a u="5E3A" b="8E A9"/>
+ <a u="5E3B" b="E0 FD"/>
+ <a u="5E3C" b="E0 FE"/>
+ <a u="5E3D" b="C3 B1"/>
+ <a u="5E3E" b="8E AA"/>
+ <a u="5E3F" b="8E AB"/>
+ <a u="5E40" b="8E AC"/>
+ <a u="5E41" b="8E AD"/>
+ <a u="5E42" b="C3 DD"/>
+ <a u="5E43" b="8E AE"/>
+ <a u="5E44" b="E1 A2"/>
+ <a u="5E45" b="B7 F9"/>
+ <a u="5E46" b="8E AF"/>
+ <a u="5E47" b="8E B0"/>
+ <a u="5E48" b="8E B1"/>
+ <a u="5E49" b="8E B2"/>
+ <a u="5E4A" b="8E B3"/>
+ <a u="5E4B" b="8E B4"/>
+ <a u="5E4C" b="BB CF"/>
+ <a u="5E4D" b="8E B5"/>
+ <a u="5E4E" b="8E B6"/>
+ <a u="5E4F" b="8E B7"/>
+ <a u="5E50" b="8E B8"/>
+ <a u="5E51" b="8E B9"/>
+ <a u="5E52" b="8E BA"/>
+ <a u="5E53" b="8E BB"/>
+ <a u="5E54" b="E1 A3"/>
+ <a u="5E55" b="C4 BB"/>
+ <a u="5E56" b="8E BC"/>
+ <a u="5E57" b="8E BD"/>
+ <a u="5E58" b="8E BE"/>
+ <a u="5E59" b="8E BF"/>
+ <a u="5E5A" b="8E C0"/>
+ <a u="5E5B" b="E1 A4"/>
+ <a u="5E5C" b="8E C1"/>
+ <a u="5E5D" b="8E C2"/>
+ <a u="5E5E" b="E1 A5"/>
+ <a u="5E5F" b="8E C3"/>
+ <a u="5E60" b="8E C4"/>
+ <a u="5E61" b="E1 A6"/>
+ <a u="5E62" b="B4 B1"/>
+ <a u="5E63" b="8E C5"/>
+ <a u="5E64" b="8E C6"/>
+ <a u="5E65" b="8E C7"/>
+ <a u="5E66" b="8E C8"/>
+ <a u="5E67" b="8E C9"/>
+ <a u="5E68" b="8E CA"/>
+ <a u="5E69" b="8E CB"/>
+ <a u="5E6A" b="8E CC"/>
+ <a u="5E6B" b="8E CD"/>
+ <a u="5E6C" b="8E CE"/>
+ <a u="5E6D" b="8E CF"/>
+ <a u="5E6E" b="8E D0"/>
+ <a u="5E6F" b="8E D1"/>
+ <a u="5E70" b="8E D2"/>
+ <a u="5E71" b="8E D3"/>
+ <a u="5E72" b="B8 C9"/>
+ <a u="5E73" b="C6 BD"/>
+ <a u="5E74" b="C4 EA"/>
+ <a u="5E75" b="8E D4"/>
+ <a u="5E76" b="B2 A2"/>
+ <a u="5E77" b="8E D5"/>
+ <a u="5E78" b="D0 D2"/>
+ <a u="5E79" b="8E D6"/>
+ <a u="5E7A" b="E7 DB"/>
+ <a u="5E7B" b="BB C3"/>
+ <a u="5E7C" b="D3 D7"/>
+ <a u="5E7D" b="D3 C4"/>
+ <a u="5E7E" b="8E D7"/>
+ <a u="5E7F" b="B9 E3"/>
+ <a u="5E80" b="E2 CF"/>
+ <a u="5E81" b="8E D8"/>
+ <a u="5E82" b="8E D9"/>
+ <a u="5E83" b="8E DA"/>
+ <a u="5E84" b="D7 AF"/>
+ <a u="5E85" b="8E DB"/>
+ <a u="5E86" b="C7 EC"/>
+ <a u="5E87" b="B1 D3"/>
+ <a u="5E88" b="8E DC"/>
+ <a u="5E89" b="8E DD"/>
+ <a u="5E8A" b="B4 B2"/>
+ <a u="5E8B" b="E2 D1"/>
+ <a u="5E8C" b="8E DE"/>
+ <a u="5E8D" b="8E DF"/>
+ <a u="5E8E" b="8E E0"/>
+ <a u="5E8F" b="D0 F2"/>
+ <a u="5E90" b="C2 AE"/>
+ <a u="5E91" b="E2 D0"/>
+ <a u="5E92" b="8E E1"/>
+ <a u="5E93" b="BF E2"/>
+ <a u="5E94" b="D3 A6"/>
+ <a u="5E95" b="B5 D7"/>
+ <a u="5E96" b="E2 D2"/>
+ <a u="5E97" b="B5 EA"/>
+ <a u="5E98" b="8E E2"/>
+ <a u="5E99" b="C3 ED"/>
+ <a u="5E9A" b="B8 FD"/>
+ <a u="5E9B" b="8E E3"/>
+ <a u="5E9C" b="B8 AE"/>
+ <a u="5E9D" b="8E E4"/>
+ <a u="5E9E" b="C5 D3"/>
+ <a u="5E9F" b="B7 CF"/>
+ <a u="5EA0" b="E2 D4"/>
+ <a u="5EA1" b="8E E5"/>
+ <a u="5EA2" b="8E E6"/>
+ <a u="5EA3" b="8E E7"/>
+ <a u="5EA4" b="8E E8"/>
+ <a u="5EA5" b="E2 D3"/>
+ <a u="5EA6" b="B6 C8"/>
+ <a u="5EA7" b="D7 F9"/>
+ <a u="5EA8" b="8E E9"/>
+ <a u="5EA9" b="8E EA"/>
+ <a u="5EAA" b="8E EB"/>
+ <a u="5EAB" b="8E EC"/>
+ <a u="5EAC" b="8E ED"/>
+ <a u="5EAD" b="CD A5"/>
+ <a u="5EAE" b="8E EE"/>
+ <a u="5EAF" b="8E EF"/>
+ <a u="5EB0" b="8E F0"/>
+ <a u="5EB1" b="8E F1"/>
+ <a u="5EB2" b="8E F2"/>
+ <a u="5EB3" b="E2 D8"/>
+ <a u="5EB4" b="8E F3"/>
+ <a u="5EB5" b="E2 D6"/>
+ <a u="5EB6" b="CA FC"/>
+ <a u="5EB7" b="BF B5"/>
+ <a u="5EB8" b="D3 B9"/>
+ <a u="5EB9" b="E2 D5"/>
+ <a u="5EBA" b="8E F4"/>
+ <a u="5EBB" b="8E F5"/>
+ <a u="5EBC" b="8E F6"/>
+ <a u="5EBD" b="8E F7"/>
+ <a u="5EBE" b="E2 D7"/>
+ <a u="5EBF" b="8E F8"/>
+ <a u="5EC0" b="8E F9"/>
+ <a u="5EC1" b="8E FA"/>
+ <a u="5EC2" b="8E FB"/>
+ <a u="5EC3" b="8E FC"/>
+ <a u="5EC4" b="8E FD"/>
+ <a u="5EC5" b="8E FE"/>
+ <a u="5EC6" b="8F 40"/>
+ <a u="5EC7" b="8F 41"/>
+ <a u="5EC8" b="8F 42"/>
+ <a u="5EC9" b="C1 AE"/>
+ <a u="5ECA" b="C0 C8"/>
+ <a u="5ECB" b="8F 43"/>
+ <a u="5ECC" b="8F 44"/>
+ <a u="5ECD" b="8F 45"/>
+ <a u="5ECE" b="8F 46"/>
+ <a u="5ECF" b="8F 47"/>
+ <a u="5ED0" b="8F 48"/>
+ <a u="5ED1" b="E2 DB"/>
+ <a u="5ED2" b="E2 DA"/>
+ <a u="5ED3" b="C0 AA"/>
+ <a u="5ED4" b="8F 49"/>
+ <a u="5ED5" b="8F 4A"/>
+ <a u="5ED6" b="C1 CE"/>
+ <a u="5ED7" b="8F 4B"/>
+ <a u="5ED8" b="8F 4C"/>
+ <a u="5ED9" b="8F 4D"/>
+ <a u="5EDA" b="8F 4E"/>
+ <a u="5EDB" b="E2 DC"/>
+ <a u="5EDC" b="8F 4F"/>
+ <a u="5EDD" b="8F 50"/>
+ <a u="5EDE" b="8F 51"/>
+ <a u="5EDF" b="8F 52"/>
+ <a u="5EE0" b="8F 53"/>
+ <a u="5EE1" b="8F 54"/>
+ <a u="5EE2" b="8F 55"/>
+ <a u="5EE3" b="8F 56"/>
+ <a u="5EE4" b="8F 57"/>
+ <a u="5EE5" b="8F 58"/>
+ <a u="5EE6" b="8F 59"/>
+ <a u="5EE7" b="8F 5A"/>
+ <a u="5EE8" b="E2 DD"/>
+ <a u="5EE9" b="8F 5B"/>
+ <a u="5EEA" b="E2 DE"/>
+ <a u="5EEB" b="8F 5C"/>
+ <a u="5EEC" b="8F 5D"/>
+ <a u="5EED" b="8F 5E"/>
+ <a u="5EEE" b="8F 5F"/>
+ <a u="5EEF" b="8F 60"/>
+ <a u="5EF0" b="8F 61"/>
+ <a u="5EF1" b="8F 62"/>
+ <a u="5EF2" b="8F 63"/>
+ <a u="5EF3" b="8F 64"/>
+ <a u="5EF4" b="DB C8"/>
+ <a u="5EF5" b="8F 65"/>
+ <a u="5EF6" b="D1 D3"/>
+ <a u="5EF7" b="CD A2"/>
+ <a u="5EF8" b="8F 66"/>
+ <a u="5EF9" b="8F 67"/>
+ <a u="5EFA" b="BD A8"/>
+ <a u="5EFB" b="8F 68"/>
+ <a u="5EFC" b="8F 69"/>
+ <a u="5EFD" b="8F 6A"/>
+ <a u="5EFE" b="DE C3"/>
+ <a u="5EFF" b="D8 A5"/>
+ <a u="5F00" b="BF AA"/>
+ <a u="5F01" b="DB CD"/>
+ <a u="5F02" b="D2 EC"/>
+ <a u="5F03" b="C6 FA"/>
+ <a u="5F04" b="C5 AA"/>
+ <a u="5F05" b="8F 6B"/>
+ <a u="5F06" b="8F 6C"/>
+ <a u="5F07" b="8F 6D"/>
+ <a u="5F08" b="DE C4"/>
+ <a u="5F09" b="8F 6E"/>
+ <a u="5F0A" b="B1 D7"/>
+ <a u="5F0B" b="DF AE"/>
+ <a u="5F0C" b="8F 6F"/>
+ <a u="5F0D" b="8F 70"/>
+ <a u="5F0E" b="8F 71"/>
+ <a u="5F0F" b="CA BD"/>
+ <a u="5F10" b="8F 72"/>
+ <a u="5F11" b="DF B1"/>
+ <a u="5F12" b="8F 73"/>
+ <a u="5F13" b="B9 AD"/>
+ <a u="5F14" b="8F 74"/>
+ <a u="5F15" b="D2 FD"/>
+ <a u="5F16" b="8F 75"/>
+ <a u="5F17" b="B8 A5"/>
+ <a u="5F18" b="BA EB"/>
+ <a u="5F19" b="8F 76"/>
+ <a u="5F1A" b="8F 77"/>
+ <a u="5F1B" b="B3 DA"/>
+ <a u="5F1C" b="8F 78"/>
+ <a u="5F1D" b="8F 79"/>
+ <a u="5F1E" b="8F 7A"/>
+ <a u="5F1F" b="B5 DC"/>
+ <a u="5F20" b="D5 C5"/>
+ <a u="5F21" b="8F 7B"/>
+ <a u="5F22" b="8F 7C"/>
+ <a u="5F23" b="8F 7D"/>
+ <a u="5F24" b="8F 7E"/>
+ <a u="5F25" b="C3 D6"/>
+ <a u="5F26" b="CF D2"/>
+ <a u="5F27" b="BB A1"/>
+ <a u="5F28" b="8F 80"/>
+ <a u="5F29" b="E5 F3"/>
+ <a u="5F2A" b="E5 F2"/>
+ <a u="5F2B" b="8F 81"/>
+ <a u="5F2C" b="8F 82"/>
+ <a u="5F2D" b="E5 F4"/>
+ <a u="5F2E" b="8F 83"/>
+ <a u="5F2F" b="CD E4"/>
+ <a u="5F30" b="8F 84"/>
+ <a u="5F31" b="C8 F5"/>
+ <a u="5F32" b="8F 85"/>
+ <a u="5F33" b="8F 86"/>
+ <a u="5F34" b="8F 87"/>
+ <a u="5F35" b="8F 88"/>
+ <a u="5F36" b="8F 89"/>
+ <a u="5F37" b="8F 8A"/>
+ <a u="5F38" b="8F 8B"/>
+ <a u="5F39" b="B5 AF"/>
+ <a u="5F3A" b="C7 BF"/>
+ <a u="5F3B" b="8F 8C"/>
+ <a u="5F3C" b="E5 F6"/>
+ <a u="5F3D" b="8F 8D"/>
+ <a u="5F3E" b="8F 8E"/>
+ <a u="5F3F" b="8F 8F"/>
+ <a u="5F40" b="EC B0"/>
+ <a u="5F41" b="8F 90"/>
+ <a u="5F42" b="8F 91"/>
+ <a u="5F43" b="8F 92"/>
+ <a u="5F44" b="8F 93"/>
+ <a u="5F45" b="8F 94"/>
+ <a u="5F46" b="8F 95"/>
+ <a u="5F47" b="8F 96"/>
+ <a u="5F48" b="8F 97"/>
+ <a u="5F49" b="8F 98"/>
+ <a u="5F4A" b="8F 99"/>
+ <a u="5F4B" b="8F 9A"/>
+ <a u="5F4C" b="8F 9B"/>
+ <a u="5F4D" b="8F 9C"/>
+ <a u="5F4E" b="8F 9D"/>
+ <a u="5F4F" b="8F 9E"/>
+ <a u="5F50" b="E5 E6"/>
+ <a u="5F51" b="8F 9F"/>
+ <a u="5F52" b="B9 E9"/>
+ <a u="5F53" b="B5 B1"/>
+ <a u="5F54" b="8F A0"/>
+ <a u="5F55" b="C2 BC"/>
+ <a u="5F56" b="E5 E8"/>
+ <a u="5F57" b="E5 E7"/>
+ <a u="5F58" b="E5 E9"/>
+ <a u="5F59" b="8F A1"/>
+ <a u="5F5A" b="8F A2"/>
+ <a u="5F5B" b="8F A3"/>
+ <a u="5F5C" b="8F A4"/>
+ <a u="5F5D" b="D2 CD"/>
+ <a u="5F5E" b="8F A5"/>
+ <a u="5F5F" b="8F A6"/>
+ <a u="5F60" b="8F A7"/>
+ <a u="5F61" b="E1 EA"/>
+ <a u="5F62" b="D0 CE"/>
+ <a u="5F63" b="8F A8"/>
+ <a u="5F64" b="CD AE"/>
+ <a u="5F65" b="8F A9"/>
+ <a u="5F66" b="D1 E5"/>
+ <a u="5F67" b="8F AA"/>
+ <a u="5F68" b="8F AB"/>
+ <a u="5F69" b="B2 CA"/>
+ <a u="5F6A" b="B1 EB"/>
+ <a u="5F6B" b="8F AC"/>
+ <a u="5F6C" b="B1 F2"/>
+ <a u="5F6D" b="C5 ED"/>
+ <a u="5F6E" b="8F AD"/>
+ <a u="5F6F" b="8F AE"/>
+ <a u="5F70" b="D5 C3"/>
+ <a u="5F71" b="D3 B0"/>
+ <a u="5F72" b="8F AF"/>
+ <a u="5F73" b="E1 DC"/>
+ <a u="5F74" b="8F B0"/>
+ <a u="5F75" b="8F B1"/>
+ <a u="5F76" b="8F B2"/>
+ <a u="5F77" b="E1 DD"/>
+ <a u="5F78" b="8F B3"/>
+ <a u="5F79" b="D2 DB"/>
+ <a u="5F7A" b="8F B4"/>
+ <a u="5F7B" b="B3 B9"/>
+ <a u="5F7C" b="B1 CB"/>
+ <a u="5F7D" b="8F B5"/>
+ <a u="5F7E" b="8F B6"/>
+ <a u="5F7F" b="8F B7"/>
+ <a u="5F80" b="CD F9"/>
+ <a u="5F81" b="D5 F7"/>
+ <a u="5F82" b="E1 DE"/>
+ <a u="5F83" b="8F B8"/>
+ <a u="5F84" b="BE B6"/>
+ <a u="5F85" b="B4 FD"/>
+ <a u="5F86" b="8F B9"/>
+ <a u="5F87" b="E1 DF"/>
+ <a u="5F88" b="BA DC"/>
+ <a u="5F89" b="E1 E0"/>
+ <a u="5F8A" b="BB B2"/>
+ <a u="5F8B" b="C2 C9"/>
+ <a u="5F8C" b="E1 E1"/>
+ <a u="5F8D" b="8F BA"/>
+ <a u="5F8E" b="8F BB"/>
+ <a u="5F8F" b="8F BC"/>
+ <a u="5F90" b="D0 EC"/>
+ <a u="5F91" b="8F BD"/>
+ <a u="5F92" b="CD BD"/>
+ <a u="5F93" b="8F BE"/>
+ <a u="5F94" b="8F BF"/>
+ <a u="5F95" b="E1 E2"/>
+ <a u="5F96" b="8F C0"/>
+ <a u="5F97" b="B5 C3"/>
+ <a u="5F98" b="C5 C7"/>
+ <a u="5F99" b="E1 E3"/>
+ <a u="5F9A" b="8F C1"/>
+ <a u="5F9B" b="8F C2"/>
+ <a u="5F9C" b="E1 E4"/>
+ <a u="5F9D" b="8F C3"/>
+ <a u="5F9E" b="8F C4"/>
+ <a u="5F9F" b="8F C5"/>
+ <a u="5FA0" b="8F C6"/>
+ <a u="5FA1" b="D3 F9"/>
+ <a u="5FA2" b="8F C7"/>
+ <a u="5FA3" b="8F C8"/>
+ <a u="5FA4" b="8F C9"/>
+ <a u="5FA5" b="8F CA"/>
+ <a u="5FA6" b="8F CB"/>
+ <a u="5FA7" b="8F CC"/>
+ <a u="5FA8" b="E1 E5"/>
+ <a u="5FA9" b="8F CD"/>
+ <a u="5FAA" b="D1 AD"/>
+ <a u="5FAB" b="8F CE"/>
+ <a u="5FAC" b="8F CF"/>
+ <a u="5FAD" b="E1 E6"/>
+ <a u="5FAE" b="CE A2"/>
+ <a u="5FAF" b="8F D0"/>
+ <a u="5FB0" b="8F D1"/>
+ <a u="5FB1" b="8F D2"/>
+ <a u="5FB2" b="8F D3"/>
+ <a u="5FB3" b="8F D4"/>
+ <a u="5FB4" b="8F D5"/>
+ <a u="5FB5" b="E1 E7"/>
+ <a u="5FB6" b="8F D6"/>
+ <a u="5FB7" b="B5 C2"/>
+ <a u="5FB8" b="8F D7"/>
+ <a u="5FB9" b="8F D8"/>
+ <a u="5FBA" b="8F D9"/>
+ <a u="5FBB" b="8F DA"/>
+ <a u="5FBC" b="E1 E8"/>
+ <a u="5FBD" b="BB D5"/>
+ <a u="5FBE" b="8F DB"/>
+ <a u="5FBF" b="8F DC"/>
+ <a u="5FC0" b="8F DD"/>
+ <a u="5FC1" b="8F DE"/>
+ <a u="5FC2" b="8F DF"/>
+ <a u="5FC3" b="D0 C4"/>
+ <a u="5FC4" b="E2 E0"/>
+ <a u="5FC5" b="B1 D8"/>
+ <a u="5FC6" b="D2 E4"/>
+ <a u="5FC7" b="8F E0"/>
+ <a u="5FC8" b="8F E1"/>
+ <a u="5FC9" b="E2 E1"/>
+ <a u="5FCA" b="8F E2"/>
+ <a u="5FCB" b="8F E3"/>
+ <a u="5FCC" b="BC C9"/>
+ <a u="5FCD" b="C8 CC"/>
+ <a u="5FCE" b="8F E4"/>
+ <a u="5FCF" b="E2 E3"/>
+ <a u="5FD0" b="EC FE"/>
+ <a u="5FD1" b="EC FD"/>
+ <a u="5FD2" b="DF AF"/>
+ <a u="5FD3" b="8F E5"/>
+ <a u="5FD4" b="8F E6"/>
+ <a u="5FD5" b="8F E7"/>
+ <a u="5FD6" b="E2 E2"/>
+ <a u="5FD7" b="D6 BE"/>
+ <a u="5FD8" b="CD FC"/>
+ <a u="5FD9" b="C3 A6"/>
+ <a u="5FDA" b="8F E8"/>
+ <a u="5FDB" b="8F E9"/>
+ <a u="5FDC" b="8F EA"/>
+ <a u="5FDD" b="E3 C3"/>
+ <a u="5FDE" b="8F EB"/>
+ <a u="5FDF" b="8F EC"/>
+ <a u="5FE0" b="D6 D2"/>
+ <a u="5FE1" b="E2 E7"/>
+ <a u="5FE2" b="8F ED"/>
+ <a u="5FE3" b="8F EE"/>
+ <a u="5FE4" b="E2 E8"/>
+ <a u="5FE5" b="8F EF"/>
+ <a u="5FE6" b="8F F0"/>
+ <a u="5FE7" b="D3 C7"/>
+ <a u="5FE8" b="8F F1"/>
+ <a u="5FE9" b="8F F2"/>
+ <a u="5FEA" b="E2 EC"/>
+ <a u="5FEB" b="BF EC"/>
+ <a u="5FEC" b="8F F3"/>
+ <a u="5FED" b="E2 ED"/>
+ <a u="5FEE" b="E2 E5"/>
+ <a u="5FEF" b="8F F4"/>
+ <a u="5FF0" b="8F F5"/>
+ <a u="5FF1" b="B3 C0"/>
+ <a u="5FF2" b="8F F6"/>
+ <a u="5FF3" b="8F F7"/>
+ <a u="5FF4" b="8F F8"/>
+ <a u="5FF5" b="C4 EE"/>
+ <a u="5FF6" b="8F F9"/>
+ <a u="5FF7" b="8F FA"/>
+ <a u="5FF8" b="E2 EE"/>
+ <a u="5FF9" b="8F FB"/>
+ <a u="5FFA" b="8F FC"/>
+ <a u="5FFB" b="D0 C3"/>
+ <a u="5FFC" b="8F FD"/>
+ <a u="5FFD" b="BA F6"/>
+ <a u="5FFE" b="E2 E9"/>
+ <a u="5FFF" b="B7 DE"/>
+ <a u="6000" b="BB B3"/>
+ <a u="6001" b="CC AC"/>
+ <a u="6002" b="CB CB"/>
+ <a u="6003" b="E2 E4"/>
+ <a u="6004" b="E2 E6"/>
+ <a u="6005" b="E2 EA"/>
+ <a u="6006" b="E2 EB"/>
+ <a u="6007" b="8F FE"/>
+ <a u="6008" b="90 40"/>
+ <a u="6009" b="90 41"/>
+ <a u="600A" b="E2 F7"/>
+ <a u="600B" b="90 42"/>
+ <a u="600C" b="90 43"/>
+ <a u="600D" b="E2 F4"/>
+ <a u="600E" b="D4 F5"/>
+ <a u="600F" b="E2 F3"/>
+ <a u="6010" b="90 44"/>
+ <a u="6011" b="90 45"/>
+ <a u="6012" b="C5 AD"/>
+ <a u="6013" b="90 46"/>
+ <a u="6014" b="D5 FA"/>
+ <a u="6015" b="C5 C2"/>
+ <a u="6016" b="B2 C0"/>
+ <a u="6017" b="90 47"/>
+ <a u="6018" b="90 48"/>
+ <a u="6019" b="E2 EF"/>
+ <a u="601A" b="90 49"/>
+ <a u="601B" b="E2 F2"/>
+ <a u="601C" b="C1 AF"/>
+ <a u="601D" b="CB BC"/>
+ <a u="601E" b="90 4A"/>
+ <a u="601F" b="90 4B"/>
+ <a u="6020" b="B5 A1"/>
+ <a u="6021" b="E2 F9"/>
+ <a u="6022" b="90 4C"/>
+ <a u="6023" b="90 4D"/>
+ <a u="6024" b="90 4E"/>
+ <a u="6025" b="BC B1"/>
+ <a u="6026" b="E2 F1"/>
+ <a u="6027" b="D0 D4"/>
+ <a u="6028" b="D4 B9"/>
+ <a u="6029" b="E2 F5"/>
+ <a u="602A" b="B9 D6"/>
+ <a u="602B" b="E2 F6"/>
+ <a u="602C" b="90 4F"/>
+ <a u="602D" b="90 50"/>
+ <a u="602E" b="90 51"/>
+ <a u="602F" b="C7 D3"/>
+ <a u="6030" b="90 52"/>
+ <a u="6031" b="90 53"/>
+ <a u="6032" b="90 54"/>
+ <a u="6033" b="90 55"/>
+ <a u="6034" b="90 56"/>
+ <a u="6035" b="E2 F0"/>
+ <a u="6036" b="90 57"/>
+ <a u="6037" b="90 58"/>
+ <a u="6038" b="90 59"/>
+ <a u="6039" b="90 5A"/>
+ <a u="603A" b="90 5B"/>
+ <a u="603B" b="D7 DC"/>
+ <a u="603C" b="ED A1"/>
+ <a u="603D" b="90 5C"/>
+ <a u="603E" b="90 5D"/>
+ <a u="603F" b="E2 F8"/>
+ <a u="6040" b="90 5E"/>
+ <a u="6041" b="ED A5"/>
+ <a u="6042" b="E2 FE"/>
+ <a u="6043" b="CA D1"/>
+ <a u="6044" b="90 5F"/>
+ <a u="6045" b="90 60"/>
+ <a u="6046" b="90 61"/>
+ <a u="6047" b="90 62"/>
+ <a u="6048" b="90 63"/>
+ <a u="6049" b="90 64"/>
+ <a u="604A" b="90 65"/>
+ <a u="604B" b="C1 B5"/>
+ <a u="604C" b="90 66"/>
+ <a u="604D" b="BB D0"/>
+ <a u="604E" b="90 67"/>
+ <a u="604F" b="90 68"/>
+ <a u="6050" b="BF D6"/>
+ <a u="6051" b="90 69"/>
+ <a u="6052" b="BA E3"/>
+ <a u="6053" b="90 6A"/>
+ <a u="6054" b="90 6B"/>
+ <a u="6055" b="CB A1"/>
+ <a u="6056" b="90 6C"/>
+ <a u="6057" b="90 6D"/>
+ <a u="6058" b="90 6E"/>
+ <a u="6059" b="ED A6"/>
+ <a u="605A" b="ED A3"/>
+ <a u="605B" b="90 6F"/>
+ <a u="605C" b="90 70"/>
+ <a u="605D" b="ED A2"/>
+ <a u="605E" b="90 71"/>
+ <a u="605F" b="90 72"/>
+ <a u="6060" b="90 73"/>
+ <a u="6061" b="90 74"/>
+ <a u="6062" b="BB D6"/>
+ <a u="6063" b="ED A7"/>
+ <a u="6064" b="D0 F4"/>
+ <a u="6065" b="90 75"/>
+ <a u="6066" b="90 76"/>
+ <a u="6067" b="ED A4"/>
+ <a u="6068" b="BA DE"/>
+ <a u="6069" b="B6 F7"/>
+ <a u="606A" b="E3 A1"/>
+ <a u="606B" b="B6 B2"/>
+ <a u="606C" b="CC F1"/>
+ <a u="606D" b="B9 A7"/>
+ <a u="606E" b="90 77"/>
+ <a u="606F" b="CF A2"/>
+ <a u="6070" b="C7 A1"/>
+ <a u="6071" b="90 78"/>
+ <a u="6072" b="90 79"/>
+ <a u="6073" b="BF D2"/>
+ <a u="6074" b="90 7A"/>
+ <a u="6075" b="90 7B"/>
+ <a u="6076" b="B6 F1"/>
+ <a u="6077" b="90 7C"/>
+ <a u="6078" b="E2 FA"/>
+ <a u="6079" b="E2 FB"/>
+ <a u="607A" b="E2 FD"/>
+ <a u="607B" b="E2 FC"/>
+ <a u="607C" b="C4 D5"/>
+ <a u="607D" b="E3 A2"/>
+ <a u="607E" b="90 7D"/>
+ <a u="607F" b="D3 C1"/>
+ <a u="6080" b="90 7E"/>
+ <a u="6081" b="90 80"/>
+ <a u="6082" b="90 81"/>
+ <a u="6083" b="E3 A7"/>
+ <a u="6084" b="C7 C4"/>
+ <a u="6085" b="90 82"/>
+ <a u="6086" b="90 83"/>
+ <a u="6087" b="90 84"/>
+ <a u="6088" b="90 85"/>
+ <a u="6089" b="CF A4"/>
+ <a u="608A" b="90 86"/>
+ <a u="608B" b="90 87"/>
+ <a u="608C" b="E3 A9"/>
+ <a u="608D" b="BA B7"/>
+ <a u="608E" b="90 88"/>
+ <a u="608F" b="90 89"/>
+ <a u="6090" b="90 8A"/>
+ <a u="6091" b="90 8B"/>
+ <a u="6092" b="E3 A8"/>
+ <a u="6093" b="90 8C"/>
+ <a u="6094" b="BB DA"/>
+ <a u="6095" b="90 8D"/>
+ <a u="6096" b="E3 A3"/>
+ <a u="6097" b="90 8E"/>
+ <a u="6098" b="90 8F"/>
+ <a u="6099" b="90 90"/>
+ <a u="609A" b="E3 A4"/>
+ <a u="609B" b="E3 AA"/>
+ <a u="609C" b="90 91"/>
+ <a u="609D" b="E3 A6"/>
+ <a u="609E" b="90 92"/>
+ <a u="609F" b="CE F2"/>
+ <a u="60A0" b="D3 C6"/>
+ <a u="60A1" b="90 93"/>
+ <a u="60A2" b="90 94"/>
+ <a u="60A3" b="BB BC"/>
+ <a u="60A4" b="90 95"/>
+ <a u="60A5" b="90 96"/>
+ <a u="60A6" b="D4 C3"/>
+ <a u="60A7" b="90 97"/>
+ <a u="60A8" b="C4 FA"/>
+ <a u="60A9" b="90 98"/>
+ <a u="60AA" b="90 99"/>
+ <a u="60AB" b="ED A8"/>
+ <a u="60AC" b="D0 FC"/>
+ <a u="60AD" b="E3 A5"/>
+ <a u="60AE" b="90 9A"/>
+ <a u="60AF" b="C3 F5"/>
+ <a u="60B0" b="90 9B"/>
+ <a u="60B1" b="E3 AD"/>
+ <a u="60B2" b="B1 AF"/>
+ <a u="60B3" b="90 9C"/>
+ <a u="60B4" b="E3 B2"/>
+ <a u="60B5" b="90 9D"/>
+ <a u="60B6" b="90 9E"/>
+ <a u="60B7" b="90 9F"/>
+ <a u="60B8" b="BC C2"/>
+ <a u="60B9" b="90 A0"/>
+ <a u="60BA" b="90 A1"/>
+ <a u="60BB" b="E3 AC"/>
+ <a u="60BC" b="B5 BF"/>
+ <a u="60BD" b="90 A2"/>
+ <a u="60BE" b="90 A3"/>
+ <a u="60BF" b="90 A4"/>
+ <a u="60C0" b="90 A5"/>
+ <a u="60C1" b="90 A6"/>
+ <a u="60C2" b="90 A7"/>
+ <a u="60C3" b="90 A8"/>
+ <a u="60C4" b="90 A9"/>
+ <a u="60C5" b="C7 E9"/>
+ <a u="60C6" b="E3 B0"/>
+ <a u="60C7" b="90 AA"/>
+ <a u="60C8" b="90 AB"/>
+ <a u="60C9" b="90 AC"/>
+ <a u="60CA" b="BE AA"/>
+ <a u="60CB" b="CD EF"/>
+ <a u="60CC" b="90 AD"/>
+ <a u="60CD" b="90 AE"/>
+ <a u="60CE" b="90 AF"/>
+ <a u="60CF" b="90 B0"/>
+ <a u="60D0" b="90 B1"/>
+ <a u="60D1" b="BB F3"/>
+ <a u="60D2" b="90 B2"/>
+ <a u="60D3" b="90 B3"/>
+ <a u="60D4" b="90 B4"/>
+ <a u="60D5" b="CC E8"/>
+ <a u="60D6" b="90 B5"/>
+ <a u="60D7" b="90 B6"/>
+ <a u="60D8" b="E3 AF"/>
+ <a u="60D9" b="90 B7"/>
+ <a u="60DA" b="E3 B1"/>
+ <a u="60DB" b="90 B8"/>
+ <a u="60DC" b="CF A7"/>
+ <a u="60DD" b="E3 AE"/>
+ <a u="60DE" b="90 B9"/>
+ <a u="60DF" b="CE A9"/>
+ <a u="60E0" b="BB DD"/>
+ <a u="60E1" b="90 BA"/>
+ <a u="60E2" b="90 BB"/>
+ <a u="60E3" b="90 BC"/>
+ <a u="60E4" b="90 BD"/>
+ <a u="60E5" b="90 BE"/>
+ <a u="60E6" b="B5 EB"/>
+ <a u="60E7" b="BE E5"/>
+ <a u="60E8" b="B2 D2"/>
+ <a u="60E9" b="B3 CD"/>
+ <a u="60EA" b="90 BF"/>
+ <a u="60EB" b="B1 B9"/>
+ <a u="60EC" b="E3 AB"/>
+ <a u="60ED" b="B2 D1"/>
+ <a u="60EE" b="B5 AC"/>
+ <a u="60EF" b="B9 DF"/>
+ <a u="60F0" b="B6 E8"/>
+ <a u="60F1" b="90 C0"/>
+ <a u="60F2" b="90 C1"/>
+ <a u="60F3" b="CF EB"/>
+ <a u="60F4" b="E3 B7"/>
+ <a u="60F5" b="90 C2"/>
+ <a u="60F6" b="BB CC"/>
+ <a u="60F7" b="90 C3"/>
+ <a u="60F8" b="90 C4"/>
+ <a u="60F9" b="C8 C7"/>
+ <a u="60FA" b="D0 CA"/>
+ <a u="60FB" b="90 C5"/>
+ <a u="60FC" b="90 C6"/>
+ <a u="60FD" b="90 C7"/>
+ <a u="60FE" b="90 C8"/>
+ <a u="60FF" b="90 C9"/>
+ <a u="6100" b="E3 B8"/>
+ <a u="6101" b="B3 EE"/>
+ <a u="6102" b="90 CA"/>
+ <a u="6103" b="90 CB"/>
+ <a u="6104" b="90 CC"/>
+ <a u="6105" b="90 CD"/>
+ <a u="6106" b="ED A9"/>
+ <a u="6107" b="90 CE"/>
+ <a u="6108" b="D3 FA"/>
+ <a u="6109" b="D3 E4"/>
+ <a u="610A" b="90 CF"/>
+ <a u="610B" b="90 D0"/>
+ <a u="610C" b="90 D1"/>
+ <a u="610D" b="ED AA"/>
+ <a u="610E" b="E3 B9"/>
+ <a u="610F" b="D2 E2"/>
+ <a u="6110" b="90 D2"/>
+ <a u="6111" b="90 D3"/>
+ <a u="6112" b="90 D4"/>
+ <a u="6113" b="90 D5"/>
+ <a u="6114" b="90 D6"/>
+ <a u="6115" b="E3 B5"/>
+ <a u="6116" b="90 D7"/>
+ <a u="6117" b="90 D8"/>
+ <a u="6118" b="90 D9"/>
+ <a u="6119" b="90 DA"/>
+ <a u="611A" b="D3 DE"/>
+ <a u="611B" b="90 DB"/>
+ <a u="611C" b="90 DC"/>
+ <a u="611D" b="90 DD"/>
+ <a u="611E" b="90 DE"/>
+ <a u="611F" b="B8 D0"/>
+ <a u="6120" b="E3 B3"/>
+ <a u="6121" b="90 DF"/>
+ <a u="6122" b="90 E0"/>
+ <a u="6123" b="E3 B6"/>
+ <a u="6124" b="B7 DF"/>
+ <a u="6125" b="90 E1"/>
+ <a u="6126" b="E3 B4"/>
+ <a u="6127" b="C0 A2"/>
+ <a u="6128" b="90 E2"/>
+ <a u="6129" b="90 E3"/>
+ <a u="612A" b="90 E4"/>
+ <a u="612B" b="E3 BA"/>
+ <a u="612C" b="90 E5"/>
+ <a u="612D" b="90 E6"/>
+ <a u="612E" b="90 E7"/>
+ <a u="612F" b="90 E8"/>
+ <a u="6130" b="90 E9"/>
+ <a u="6131" b="90 EA"/>
+ <a u="6132" b="90 EB"/>
+ <a u="6133" b="90 EC"/>
+ <a u="6134" b="90 ED"/>
+ <a u="6135" b="90 EE"/>
+ <a u="6136" b="90 EF"/>
+ <a u="6137" b="90 F0"/>
+ <a u="6138" b="90 F1"/>
+ <a u="6139" b="90 F2"/>
+ <a u="613A" b="90 F3"/>
+ <a u="613B" b="90 F4"/>
+ <a u="613C" b="90 F5"/>
+ <a u="613D" b="90 F6"/>
+ <a u="613E" b="90 F7"/>
+ <a u="613F" b="D4 B8"/>
+ <a u="6140" b="90 F8"/>
+ <a u="6141" b="90 F9"/>
+ <a u="6142" b="90 FA"/>
+ <a u="6143" b="90 FB"/>
+ <a u="6144" b="90 FC"/>
+ <a u="6145" b="90 FD"/>
+ <a u="6146" b="90 FE"/>
+ <a u="6147" b="91 40"/>
+ <a u="6148" b="B4 C8"/>
+ <a u="6149" b="91 41"/>
+ <a u="614A" b="E3 BB"/>
+ <a u="614B" b="91 42"/>
+ <a u="614C" b="BB C5"/>
+ <a u="614D" b="91 43"/>
+ <a u="614E" b="C9 F7"/>
+ <a u="614F" b="91 44"/>
+ <a u="6150" b="91 45"/>
+ <a u="6151" b="C9 E5"/>
+ <a u="6152" b="91 46"/>
+ <a u="6153" b="91 47"/>
+ <a u="6154" b="91 48"/>
+ <a u="6155" b="C4 BD"/>
+ <a u="6156" b="91 49"/>
+ <a u="6157" b="91 4A"/>
+ <a u="6158" b="91 4B"/>
+ <a u="6159" b="91 4C"/>
+ <a u="615A" b="91 4D"/>
+ <a u="615B" b="91 4E"/>
+ <a u="615C" b="91 4F"/>
+ <a u="615D" b="ED AB"/>
+ <a u="615E" b="91 50"/>
+ <a u="615F" b="91 51"/>
+ <a u="6160" b="91 52"/>
+ <a u="6161" b="91 53"/>
+ <a u="6162" b="C2 FD"/>
+ <a u="6163" b="91 54"/>
+ <a u="6164" b="91 55"/>
+ <a u="6165" b="91 56"/>
+ <a u="6166" b="91 57"/>
+ <a u="6167" b="BB DB"/>
+ <a u="6168" b="BF AE"/>
+ <a u="6169" b="91 58"/>
+ <a u="616A" b="91 59"/>
+ <a u="616B" b="91 5A"/>
+ <a u="616C" b="91 5B"/>
+ <a u="616D" b="91 5C"/>
+ <a u="616E" b="91 5D"/>
+ <a u="616F" b="91 5E"/>
+ <a u="6170" b="CE BF"/>
+ <a u="6171" b="91 5F"/>
+ <a u="6172" b="91 60"/>
+ <a u="6173" b="91 61"/>
+ <a u="6174" b="91 62"/>
+ <a u="6175" b="E3 BC"/>
+ <a u="6176" b="91 63"/>
+ <a u="6177" b="BF B6"/>
+ <a u="6178" b="91 64"/>
+ <a u="6179" b="91 65"/>
+ <a u="617A" b="91 66"/>
+ <a u="617B" b="91 67"/>
+ <a u="617C" b="91 68"/>
+ <a u="617D" b="91 69"/>
+ <a u="617E" b="91 6A"/>
+ <a u="617F" b="91 6B"/>
+ <a u="6180" b="91 6C"/>
+ <a u="6181" b="91 6D"/>
+ <a u="6182" b="91 6E"/>
+ <a u="6183" b="91 6F"/>
+ <a u="6184" b="91 70"/>
+ <a u="6185" b="91 71"/>
+ <a u="6186" b="91 72"/>
+ <a u="6187" b="91 73"/>
+ <a u="6188" b="91 74"/>
+ <a u="6189" b="91 75"/>
+ <a u="618A" b="91 76"/>
+ <a u="618B" b="B1 EF"/>
+ <a u="618C" b="91 77"/>
+ <a u="618D" b="91 78"/>
+ <a u="618E" b="D4 F7"/>
+ <a u="618F" b="91 79"/>
+ <a u="6190" b="91 7A"/>
+ <a u="6191" b="91 7B"/>
+ <a u="6192" b="91 7C"/>
+ <a u="6193" b="91 7D"/>
+ <a u="6194" b="E3 BE"/>
+ <a u="6195" b="91 7E"/>
+ <a u="6196" b="91 80"/>
+ <a u="6197" b="91 81"/>
+ <a u="6198" b="91 82"/>
+ <a u="6199" b="91 83"/>
+ <a u="619A" b="91 84"/>
+ <a u="619B" b="91 85"/>
+ <a u="619C" b="91 86"/>
+ <a u="619D" b="ED AD"/>
+ <a u="619E" b="91 87"/>
+ <a u="619F" b="91 88"/>
+ <a u="61A0" b="91 89"/>
+ <a u="61A1" b="91 8A"/>
+ <a u="61A2" b="91 8B"/>
+ <a u="61A3" b="91 8C"/>
+ <a u="61A4" b="91 8D"/>
+ <a u="61A5" b="91 8E"/>
+ <a u="61A6" b="91 8F"/>
+ <a u="61A7" b="E3 BF"/>
+ <a u="61A8" b="BA A9"/>
+ <a u="61A9" b="ED AC"/>
+ <a u="61AA" b="91 90"/>
+ <a u="61AB" b="91 91"/>
+ <a u="61AC" b="E3 BD"/>
+ <a u="61AD" b="91 92"/>
+ <a u="61AE" b="91 93"/>
+ <a u="61AF" b="91 94"/>
+ <a u="61B0" b="91 95"/>
+ <a u="61B1" b="91 96"/>
+ <a u="61B2" b="91 97"/>
+ <a u="61B3" b="91 98"/>
+ <a u="61B4" b="91 99"/>
+ <a u="61B5" b="91 9A"/>
+ <a u="61B6" b="91 9B"/>
+ <a u="61B7" b="E3 C0"/>
+ <a u="61B8" b="91 9C"/>
+ <a u="61B9" b="91 9D"/>
+ <a u="61BA" b="91 9E"/>
+ <a u="61BB" b="91 9F"/>
+ <a u="61BC" b="91 A0"/>
+ <a u="61BD" b="91 A1"/>
+ <a u="61BE" b="BA B6"/>
+ <a u="61BF" b="91 A2"/>
+ <a u="61C0" b="91 A3"/>
+ <a u="61C1" b="91 A4"/>
+ <a u="61C2" b="B6 AE"/>
+ <a u="61C3" b="91 A5"/>
+ <a u="61C4" b="91 A6"/>
+ <a u="61C5" b="91 A7"/>
+ <a u="61C6" b="91 A8"/>
+ <a u="61C7" b="91 A9"/>
+ <a u="61C8" b="D0 B8"/>
+ <a u="61C9" b="91 AA"/>
+ <a u="61CA" b="B0 C3"/>
+ <a u="61CB" b="ED AE"/>
+ <a u="61CC" b="91 AB"/>
+ <a u="61CD" b="91 AC"/>
+ <a u="61CE" b="91 AD"/>
+ <a u="61CF" b="91 AE"/>
+ <a u="61D0" b="91 AF"/>
+ <a u="61D1" b="ED AF"/>
+ <a u="61D2" b="C0 C1"/>
+ <a u="61D3" b="91 B0"/>
+ <a u="61D4" b="E3 C1"/>
+ <a u="61D5" b="91 B1"/>
+ <a u="61D6" b="91 B2"/>
+ <a u="61D7" b="91 B3"/>
+ <a u="61D8" b="91 B4"/>
+ <a u="61D9" b="91 B5"/>
+ <a u="61DA" b="91 B6"/>
+ <a u="61DB" b="91 B7"/>
+ <a u="61DC" b="91 B8"/>
+ <a u="61DD" b="91 B9"/>
+ <a u="61DE" b="91 BA"/>
+ <a u="61DF" b="91 BB"/>
+ <a u="61E0" b="91 BC"/>
+ <a u="61E1" b="91 BD"/>
+ <a u="61E2" b="91 BE"/>
+ <a u="61E3" b="91 BF"/>
+ <a u="61E4" b="91 C0"/>
+ <a u="61E5" b="91 C1"/>
+ <a u="61E6" b="C5 B3"/>
+ <a u="61E7" b="91 C2"/>
+ <a u="61E8" b="91 C3"/>
+ <a u="61E9" b="91 C4"/>
+ <a u="61EA" b="91 C5"/>
+ <a u="61EB" b="91 C6"/>
+ <a u="61EC" b="91 C7"/>
+ <a u="61ED" b="91 C8"/>
+ <a u="61EE" b="91 C9"/>
+ <a u="61EF" b="91 CA"/>
+ <a u="61F0" b="91 CB"/>
+ <a u="61F1" b="91 CC"/>
+ <a u="61F2" b="91 CD"/>
+ <a u="61F3" b="91 CE"/>
+ <a u="61F4" b="91 CF"/>
+ <a u="61F5" b="E3 C2"/>
+ <a u="61F6" b="91 D0"/>
+ <a u="61F7" b="91 D1"/>
+ <a u="61F8" b="91 D2"/>
+ <a u="61F9" b="91 D3"/>
+ <a u="61FA" b="91 D4"/>
+ <a u="61FB" b="91 D5"/>
+ <a u="61FC" b="91 D6"/>
+ <a u="61FD" b="91 D7"/>
+ <a u="61FE" b="91 D8"/>
+ <a u="61FF" b="DC B2"/>
+ <a u="6200" b="91 D9"/>
+ <a u="6201" b="91 DA"/>
+ <a u="6202" b="91 DB"/>
+ <a u="6203" b="91 DC"/>
+ <a u="6204" b="91 DD"/>
+ <a u="6205" b="91 DE"/>
+ <a u="6206" b="ED B0"/>
+ <a u="6207" b="91 DF"/>
+ <a u="6208" b="B8 EA"/>
+ <a u="6209" b="91 E0"/>
+ <a u="620A" b="CE EC"/>
+ <a u="620B" b="EA A7"/>
+ <a u="620C" b="D0 E7"/>
+ <a u="620D" b="CA F9"/>
+ <a u="620E" b="C8 D6"/>
+ <a u="620F" b="CF B7"/>
+ <a u="6210" b="B3 C9"/>
+ <a u="6211" b="CE D2"/>
+ <a u="6212" b="BD E4"/>
+ <a u="6213" b="91 E1"/>
+ <a u="6214" b="91 E2"/>
+ <a u="6215" b="E3 DE"/>
+ <a u="6216" b="BB F2"/>
+ <a u="6217" b="EA A8"/>
+ <a u="6218" b="D5 BD"/>
+ <a u="6219" b="91 E3"/>
+ <a u="621A" b="C6 DD"/>
+ <a u="621B" b="EA A9"/>
+ <a u="621C" b="91 E4"/>
+ <a u="621D" b="91 E5"/>
+ <a u="621E" b="91 E6"/>
+ <a u="621F" b="EA AA"/>
+ <a u="6220" b="91 E7"/>
+ <a u="6221" b="EA AC"/>
+ <a u="6222" b="EA AB"/>
+ <a u="6223" b="91 E8"/>
+ <a u="6224" b="EA AE"/>
+ <a u="6225" b="EA AD"/>
+ <a u="6226" b="91 E9"/>
+ <a u="6227" b="91 EA"/>
+ <a u="6228" b="91 EB"/>
+ <a u="6229" b="91 EC"/>
+ <a u="622A" b="BD D8"/>
+ <a u="622B" b="91 ED"/>
+ <a u="622C" b="EA AF"/>
+ <a u="622D" b="91 EE"/>
+ <a u="622E" b="C2 BE"/>
+ <a u="622F" b="91 EF"/>
+ <a u="6230" b="91 F0"/>
+ <a u="6231" b="91 F1"/>
+ <a u="6232" b="91 F2"/>
+ <a u="6233" b="B4 C1"/>
+ <a u="6234" b="B4 F7"/>
+ <a u="6235" b="91 F3"/>
+ <a u="6236" b="91 F4"/>
+ <a u="6237" b="BB A7"/>
+ <a u="6238" b="91 F5"/>
+ <a u="6239" b="91 F6"/>
+ <a u="623A" b="91 F7"/>
+ <a u="623B" b="91 F8"/>
+ <a u="623C" b="91 F9"/>
+ <a u="623D" b="EC E6"/>
+ <a u="623E" b="EC E5"/>
+ <a u="623F" b="B7 BF"/>
+ <a u="6240" b="CB F9"/>
+ <a u="6241" b="B1 E2"/>
+ <a u="6242" b="91 FA"/>
+ <a u="6243" b="EC E7"/>
+ <a u="6244" b="91 FB"/>
+ <a u="6245" b="91 FC"/>
+ <a u="6246" b="91 FD"/>
+ <a u="6247" b="C9 C8"/>
+ <a u="6248" b="EC E8"/>
+ <a u="6249" b="EC E9"/>
+ <a u="624A" b="91 FE"/>
+ <a u="624B" b="CA D6"/>
+ <a u="624C" b="DE D0"/>
+ <a u="624D" b="B2 C5"/>
+ <a u="624E" b="D4 FA"/>
+ <a u="624F" b="92 40"/>
+ <a u="6250" b="92 41"/>
+ <a u="6251" b="C6 CB"/>
+ <a u="6252" b="B0 C7"/>
+ <a u="6253" b="B4 F2"/>
+ <a u="6254" b="C8 D3"/>
+ <a u="6255" b="92 42"/>
+ <a u="6256" b="92 43"/>
+ <a u="6257" b="92 44"/>
+ <a u="6258" b="CD D0"/>
+ <a u="6259" b="92 45"/>
+ <a u="625A" b="92 46"/>
+ <a u="625B" b="BF B8"/>
+ <a u="625C" b="92 47"/>
+ <a u="625D" b="92 48"/>
+ <a u="625E" b="92 49"/>
+ <a u="625F" b="92 4A"/>
+ <a u="6260" b="92 4B"/>
+ <a u="6261" b="92 4C"/>
+ <a u="6262" b="92 4D"/>
+ <a u="6263" b="BF DB"/>
+ <a u="6264" b="92 4E"/>
+ <a u="6265" b="92 4F"/>
+ <a u="6266" b="C7 A4"/>
+ <a u="6267" b="D6 B4"/>
+ <a u="6268" b="92 50"/>
+ <a u="6269" b="C0 A9"/>
+ <a u="626A" b="DE D1"/>
+ <a u="626B" b="C9 A8"/>
+ <a u="626C" b="D1 EF"/>
+ <a u="626D" b="C5 A4"/>
+ <a u="626E" b="B0 E7"/>
+ <a u="626F" b="B3 B6"/>
+ <a u="6270" b="C8 C5"/>
+ <a u="6271" b="92 51"/>
+ <a u="6272" b="92 52"/>
+ <a u="6273" b="B0 E2"/>
+ <a u="6274" b="92 53"/>
+ <a u="6275" b="92 54"/>
+ <a u="6276" b="B7 F6"/>
+ <a u="6277" b="92 55"/>
+ <a u="6278" b="92 56"/>
+ <a u="6279" b="C5 FA"/>
+ <a u="627A" b="92 57"/>
+ <a u="627B" b="92 58"/>
+ <a u="627C" b="B6 F3"/>
+ <a u="627D" b="92 59"/>
+ <a u="627E" b="D5 D2"/>
+ <a u="627F" b="B3 D0"/>
+ <a u="6280" b="BC BC"/>
+ <a u="6281" b="92 5A"/>
+ <a u="6282" b="92 5B"/>
+ <a u="6283" b="92 5C"/>
+ <a u="6284" b="B3 AD"/>
+ <a u="6285" b="92 5D"/>
+ <a u="6286" b="92 5E"/>
+ <a u="6287" b="92 5F"/>
+ <a u="6288" b="92 60"/>
+ <a u="6289" b="BE F1"/>
+ <a u="628A" b="B0 D1"/>
+ <a u="628B" b="92 61"/>
+ <a u="628C" b="92 62"/>
+ <a u="628D" b="92 63"/>
+ <a u="628E" b="92 64"/>
+ <a u="628F" b="92 65"/>
+ <a u="6290" b="92 66"/>
+ <a u="6291" b="D2 D6"/>
+ <a u="6292" b="CA E3"/>
+ <a u="6293" b="D7 A5"/>
+ <a u="6294" b="92 67"/>
+ <a u="6295" b="CD B6"/>
+ <a u="6296" b="B6 B6"/>
+ <a u="6297" b="BF B9"/>
+ <a u="6298" b="D5 DB"/>
+ <a u="6299" b="92 68"/>
+ <a u="629A" b="B8 A7"/>
+ <a u="629B" b="C5 D7"/>
+ <a u="629C" b="92 69"/>
+ <a u="629D" b="92 6A"/>
+ <a u="629E" b="92 6B"/>
+ <a u="629F" b="DE D2"/>
+ <a u="62A0" b="BF D9"/>
+ <a u="62A1" b="C2 D5"/>
+ <a u="62A2" b="C7 C0"/>
+ <a u="62A3" b="92 6C"/>
+ <a u="62A4" b="BB A4"/>
+ <a u="62A5" b="B1 A8"/>
+ <a u="62A6" b="92 6D"/>
+ <a u="62A7" b="92 6E"/>
+ <a u="62A8" b="C5 EA"/>
+ <a u="62A9" b="92 6F"/>
+ <a u="62AA" b="92 70"/>
+ <a u="62AB" b="C5 FB"/>
+ <a u="62AC" b="CC A7"/>
+ <a u="62AD" b="92 71"/>
+ <a u="62AE" b="92 72"/>
+ <a u="62AF" b="92 73"/>
+ <a u="62B0" b="92 74"/>
+ <a u="62B1" b="B1 A7"/>
+ <a u="62B2" b="92 75"/>
+ <a u="62B3" b="92 76"/>
+ <a u="62B4" b="92 77"/>
+ <a u="62B5" b="B5 D6"/>
+ <a u="62B6" b="92 78"/>
+ <a u="62B7" b="92 79"/>
+ <a u="62B8" b="92 7A"/>
+ <a u="62B9" b="C4 A8"/>
+ <a u="62BA" b="92 7B"/>
+ <a u="62BB" b="DE D3"/>
+ <a u="62BC" b="D1 BA"/>
+ <a u="62BD" b="B3 E9"/>
+ <a u="62BE" b="92 7C"/>
+ <a u="62BF" b="C3 F2"/>
+ <a u="62C0" b="92 7D"/>
+ <a u="62C1" b="92 7E"/>
+ <a u="62C2" b="B7 F7"/>
+ <a u="62C3" b="92 80"/>
+ <a u="62C4" b="D6 F4"/>
+ <a u="62C5" b="B5 A3"/>
+ <a u="62C6" b="B2 F0"/>
+ <a u="62C7" b="C4 B4"/>
+ <a u="62C8" b="C4 E9"/>
+ <a u="62C9" b="C0 AD"/>
+ <a u="62CA" b="DE D4"/>
+ <a u="62CB" b="92 81"/>
+ <a u="62CC" b="B0 E8"/>
+ <a u="62CD" b="C5 C4"/>
+ <a u="62CE" b="C1 E0"/>
+ <a u="62CF" b="92 82"/>
+ <a u="62D0" b="B9 D5"/>
+ <a u="62D1" b="92 83"/>
+ <a u="62D2" b="BE DC"/>
+ <a u="62D3" b="CD D8"/>
+ <a u="62D4" b="B0 CE"/>
+ <a u="62D5" b="92 84"/>
+ <a u="62D6" b="CD CF"/>
+ <a u="62D7" b="DE D6"/>
+ <a u="62D8" b="BE D0"/>
+ <a u="62D9" b="D7 BE"/>
+ <a u="62DA" b="DE D5"/>
+ <a u="62DB" b="D5 D0"/>
+ <a u="62DC" b="B0 DD"/>
+ <a u="62DD" b="92 85"/>
+ <a u="62DE" b="92 86"/>
+ <a u="62DF" b="C4 E2"/>
+ <a u="62E0" b="92 87"/>
+ <a u="62E1" b="92 88"/>
+ <a u="62E2" b="C2 A3"/>
+ <a u="62E3" b="BC F0"/>
+ <a u="62E4" b="92 89"/>
+ <a u="62E5" b="D3 B5"/>
+ <a u="62E6" b="C0 B9"/>
+ <a u="62E7" b="C5 A1"/>
+ <a u="62E8" b="B2 A6"/>
+ <a u="62E9" b="D4 F1"/>
+ <a u="62EA" b="92 8A"/>
+ <a u="62EB" b="92 8B"/>
+ <a u="62EC" b="C0 A8"/>
+ <a u="62ED" b="CA C3"/>
+ <a u="62EE" b="DE D7"/>
+ <a u="62EF" b="D5 FC"/>
+ <a u="62F0" b="92 8C"/>
+ <a u="62F1" b="B9 B0"/>
+ <a u="62F2" b="92 8D"/>
+ <a u="62F3" b="C8 AD"/>
+ <a u="62F4" b="CB A9"/>
+ <a u="62F5" b="92 8E"/>
+ <a u="62F6" b="DE D9"/>
+ <a u="62F7" b="BF BD"/>
+ <a u="62F8" b="92 8F"/>
+ <a u="62F9" b="92 90"/>
+ <a u="62FA" b="92 91"/>
+ <a u="62FB" b="92 92"/>
+ <a u="62FC" b="C6 B4"/>
+ <a u="62FD" b="D7 A7"/>
+ <a u="62FE" b="CA B0"/>
+ <a u="62FF" b="C4 C3"/>
+ <a u="6300" b="92 93"/>
+ <a u="6301" b="B3 D6"/>
+ <a u="6302" b="B9 D2"/>
+ <a u="6303" b="92 94"/>
+ <a u="6304" b="92 95"/>
+ <a u="6305" b="92 96"/>
+ <a u="6306" b="92 97"/>
+ <a u="6307" b="D6 B8"/>
+ <a u="6308" b="EA FC"/>
+ <a u="6309" b="B0 B4"/>
+ <a u="630A" b="92 98"/>
+ <a u="630B" b="92 99"/>
+ <a u="630C" b="92 9A"/>
+ <a u="630D" b="92 9B"/>
+ <a u="630E" b="BF E6"/>
+ <a u="630F" b="92 9C"/>
+ <a u="6310" b="92 9D"/>
+ <a u="6311" b="CC F4"/>
+ <a u="6312" b="92 9E"/>
+ <a u="6313" b="92 9F"/>
+ <a u="6314" b="92 A0"/>
+ <a u="6315" b="92 A1"/>
+ <a u="6316" b="CD DA"/>
+ <a u="6317" b="92 A2"/>
+ <a u="6318" b="92 A3"/>
+ <a u="6319" b="92 A4"/>
+ <a u="631A" b="D6 BF"/>
+ <a u="631B" b="C2 CE"/>
+ <a u="631C" b="92 A5"/>
+ <a u="631D" b="CE CE"/>
+ <a u="631E" b="CC A2"/>
+ <a u="631F" b="D0 AE"/>
+ <a u="6320" b="C4 D3"/>
+ <a u="6321" b="B5 B2"/>
+ <a u="6322" b="DE D8"/>
+ <a u="6323" b="D5 F5"/>
+ <a u="6324" b="BC B7"/>
+ <a u="6325" b="BB D3"/>
+ <a u="6326" b="92 A6"/>
+ <a u="6327" b="92 A7"/>
+ <a u="6328" b="B0 A4"/>
+ <a u="6329" b="92 A8"/>
+ <a u="632A" b="C5 B2"/>
+ <a u="632B" b="B4 EC"/>
+ <a u="632C" b="92 A9"/>
+ <a u="632D" b="92 AA"/>
+ <a u="632E" b="92 AB"/>
+ <a u="632F" b="D5 F1"/>
+ <a u="6330" b="92 AC"/>
+ <a u="6331" b="92 AD"/>
+ <a u="6332" b="EA FD"/>
+ <a u="6333" b="92 AE"/>
+ <a u="6334" b="92 AF"/>
+ <a u="6335" b="92 B0"/>
+ <a u="6336" b="92 B1"/>
+ <a u="6337" b="92 B2"/>
+ <a u="6338" b="92 B3"/>
+ <a u="6339" b="DE DA"/>
+ <a u="633A" b="CD A6"/>
+ <a u="633B" b="92 B4"/>
+ <a u="633C" b="92 B5"/>
+ <a u="633D" b="CD EC"/>
+ <a u="633E" b="92 B6"/>
+ <a u="633F" b="92 B7"/>
+ <a u="6340" b="92 B8"/>
+ <a u="6341" b="92 B9"/>
+ <a u="6342" b="CE E6"/>
+ <a u="6343" b="DE DC"/>
+ <a u="6344" b="92 BA"/>
+ <a u="6345" b="CD B1"/>
+ <a u="6346" b="C0 A6"/>
+ <a u="6347" b="92 BB"/>
+ <a u="6348" b="92 BC"/>
+ <a u="6349" b="D7 BD"/>
+ <a u="634A" b="92 BD"/>
+ <a u="634B" b="DE DB"/>
+ <a u="634C" b="B0 C6"/>
+ <a u="634D" b="BA B4"/>
+ <a u="634E" b="C9 D3"/>
+ <a u="634F" b="C4 F3"/>
+ <a u="6350" b="BE E8"/>
+ <a u="6351" b="92 BE"/>
+ <a u="6352" b="92 BF"/>
+ <a u="6353" b="92 C0"/>
+ <a u="6354" b="92 C1"/>
+ <a u="6355" b="B2 B6"/>
+ <a u="6356" b="92 C2"/>
+ <a u="6357" b="92 C3"/>
+ <a u="6358" b="92 C4"/>
+ <a u="6359" b="92 C5"/>
+ <a u="635A" b="92 C6"/>
+ <a u="635B" b="92 C7"/>
+ <a u="635C" b="92 C8"/>
+ <a u="635D" b="92 C9"/>
+ <a u="635E" b="C0 CC"/>
+ <a u="635F" b="CB F0"/>
+ <a u="6360" b="92 CA"/>
+ <a u="6361" b="BC F1"/>
+ <a u="6362" b="BB BB"/>
+ <a u="6363" b="B5 B7"/>
+ <a u="6364" b="92 CB"/>
+ <a u="6365" b="92 CC"/>
+ <a u="6366" b="92 CD"/>
+ <a u="6367" b="C5 F5"/>
+ <a u="6368" b="92 CE"/>
+ <a u="6369" b="DE E6"/>
+ <a u="636A" b="92 CF"/>
+ <a u="636B" b="92 D0"/>
+ <a u="636C" b="92 D1"/>
+ <a u="636D" b="DE E3"/>
+ <a u="636E" b="BE DD"/>
+ <a u="636F" b="92 D2"/>
+ <a u="6370" b="92 D3"/>
+ <a u="6371" b="DE DF"/>
+ <a u="6372" b="92 D4"/>
+ <a u="6373" b="92 D5"/>
+ <a u="6374" b="92 D6"/>
+ <a u="6375" b="92 D7"/>
+ <a u="6376" b="B4 B7"/>
+ <a u="6377" b="BD DD"/>
+ <a u="6378" b="92 D8"/>
+ <a u="6379" b="92 D9"/>
+ <a u="637A" b="DE E0"/>
+ <a u="637B" b="C4 ED"/>
+ <a u="637C" b="92 DA"/>
+ <a u="637D" b="92 DB"/>
+ <a u="637E" b="92 DC"/>
+ <a u="637F" b="92 DD"/>
+ <a u="6380" b="CF C6"/>
+ <a u="6381" b="92 DE"/>
+ <a u="6382" b="B5 E0"/>
+ <a u="6383" b="92 DF"/>
+ <a u="6384" b="92 E0"/>
+ <a u="6385" b="92 E1"/>
+ <a u="6386" b="92 E2"/>
+ <a u="6387" b="B6 DE"/>
+ <a u="6388" b="CA DA"/>
+ <a u="6389" b="B5 F4"/>
+ <a u="638A" b="DE E5"/>
+ <a u="638B" b="92 E3"/>
+ <a u="638C" b="D5 C6"/>
+ <a u="638D" b="92 E4"/>
+ <a u="638E" b="DE E1"/>
+ <a u="638F" b="CC CD"/>
+ <a u="6390" b="C6 FE"/>
+ <a u="6391" b="92 E5"/>
+ <a u="6392" b="C5 C5"/>
+ <a u="6393" b="92 E6"/>
+ <a u="6394" b="92 E7"/>
+ <a u="6395" b="92 E8"/>
+ <a u="6396" b="D2 B4"/>
+ <a u="6397" b="92 E9"/>
+ <a u="6398" b="BE F2"/>
+ <a u="6399" b="92 EA"/>
+ <a u="639A" b="92 EB"/>
+ <a u="639B" b="92 EC"/>
+ <a u="639C" b="92 ED"/>
+ <a u="639D" b="92 EE"/>
+ <a u="639E" b="92 EF"/>
+ <a u="639F" b="92 F0"/>
+ <a u="63A0" b="C2 D3"/>
+ <a u="63A1" b="92 F1"/>
+ <a u="63A2" b="CC BD"/>
+ <a u="63A3" b="B3 B8"/>
+ <a u="63A4" b="92 F2"/>
+ <a u="63A5" b="BD D3"/>
+ <a u="63A6" b="92 F3"/>
+ <a u="63A7" b="BF D8"/>
+ <a u="63A8" b="CD C6"/>
+ <a u="63A9" b="D1 DA"/>
+ <a u="63AA" b="B4 EB"/>
+ <a u="63AB" b="92 F4"/>
+ <a u="63AC" b="DE E4"/>
+ <a u="63AD" b="DE DD"/>
+ <a u="63AE" b="DE E7"/>
+ <a u="63AF" b="92 F5"/>
+ <a u="63B0" b="EA FE"/>
+ <a u="63B1" b="92 F6"/>
+ <a u="63B2" b="92 F7"/>
+ <a u="63B3" b="C2 B0"/>
+ <a u="63B4" b="DE E2"/>
+ <a u="63B5" b="92 F8"/>
+ <a u="63B6" b="92 F9"/>
+ <a u="63B7" b="D6 C0"/>
+ <a u="63B8" b="B5 A7"/>
+ <a u="63B9" b="92 FA"/>
+ <a u="63BA" b="B2 F4"/>
+ <a u="63BB" b="92 FB"/>
+ <a u="63BC" b="DE E8"/>
+ <a u="63BD" b="92 FC"/>
+ <a u="63BE" b="DE F2"/>
+ <a u="63BF" b="92 FD"/>
+ <a u="63C0" b="92 FE"/>
+ <a u="63C1" b="93 40"/>
+ <a u="63C2" b="93 41"/>
+ <a u="63C3" b="93 42"/>
+ <a u="63C4" b="DE ED"/>
+ <a u="63C5" b="93 43"/>
+ <a u="63C6" b="DE F1"/>
+ <a u="63C7" b="93 44"/>
+ <a u="63C8" b="93 45"/>
+ <a u="63C9" b="C8 E0"/>
+ <a u="63CA" b="93 46"/>
+ <a u="63CB" b="93 47"/>
+ <a u="63CC" b="93 48"/>
+ <a u="63CD" b="D7 E1"/>
+ <a u="63CE" b="DE EF"/>
+ <a u="63CF" b="C3 E8"/>
+ <a u="63D0" b="CC E1"/>
+ <a u="63D1" b="93 49"/>
+ <a u="63D2" b="B2 E5"/>
+ <a u="63D3" b="93 4A"/>
+ <a u="63D4" b="93 4B"/>
+ <a u="63D5" b="93 4C"/>
+ <a u="63D6" b="D2 BE"/>
+ <a u="63D7" b="93 4D"/>
+ <a u="63D8" b="93 4E"/>
+ <a u="63D9" b="93 4F"/>
+ <a u="63DA" b="93 50"/>
+ <a u="63DB" b="93 51"/>
+ <a u="63DC" b="93 52"/>
+ <a u="63DD" b="93 53"/>
+ <a u="63DE" b="DE EE"/>
+ <a u="63DF" b="93 54"/>
+ <a u="63E0" b="DE EB"/>
+ <a u="63E1" b="CE D5"/>
+ <a u="63E2" b="93 55"/>
+ <a u="63E3" b="B4 A7"/>
+ <a u="63E4" b="93 56"/>
+ <a u="63E5" b="93 57"/>
+ <a u="63E6" b="93 58"/>
+ <a u="63E7" b="93 59"/>
+ <a u="63E8" b="93 5A"/>
+ <a u="63E9" b="BF AB"/>
+ <a u="63EA" b="BE BE"/>
+ <a u="63EB" b="93 5B"/>
+ <a u="63EC" b="93 5C"/>
+ <a u="63ED" b="BD D2"/>
+ <a u="63EE" b="93 5D"/>
+ <a u="63EF" b="93 5E"/>
+ <a u="63F0" b="93 5F"/>
+ <a u="63F1" b="93 60"/>
+ <a u="63F2" b="DE E9"/>
+ <a u="63F3" b="93 61"/>
+ <a u="63F4" b="D4 AE"/>
+ <a u="63F5" b="93 62"/>
+ <a u="63F6" b="DE DE"/>
+ <a u="63F7" b="93 63"/>
+ <a u="63F8" b="DE EA"/>
+ <a u="63F9" b="93 64"/>
+ <a u="63FA" b="93 65"/>
+ <a u="63FB" b="93 66"/>
+ <a u="63FC" b="93 67"/>
+ <a u="63FD" b="C0 BF"/>
+ <a u="63FE" b="93 68"/>
+ <a u="63FF" b="DE EC"/>
+ <a u="6400" b="B2 F3"/>
+ <a u="6401" b="B8 E9"/>
+ <a u="6402" b="C2 A7"/>
+ <a u="6403" b="93 69"/>
+ <a u="6404" b="93 6A"/>
+ <a u="6405" b="BD C1"/>
+ <a u="6406" b="93 6B"/>
+ <a u="6407" b="93 6C"/>
+ <a u="6408" b="93 6D"/>
+ <a u="6409" b="93 6E"/>
+ <a u="640A" b="93 6F"/>
+ <a u="640B" b="DE F5"/>
+ <a u="640C" b="DE F8"/>
+ <a u="640D" b="93 70"/>
+ <a u="640E" b="93 71"/>
+ <a u="640F" b="B2 AB"/>
+ <a u="6410" b="B4 A4"/>
+ <a u="6411" b="93 72"/>
+ <a u="6412" b="93 73"/>
+ <a u="6413" b="B4 EA"/>
+ <a u="6414" b="C9 A6"/>
+ <a u="6415" b="93 74"/>
+ <a u="6416" b="93 75"/>
+ <a u="6417" b="93 76"/>
+ <a u="6418" b="93 77"/>
+ <a u="6419" b="93 78"/>
+ <a u="641A" b="93 79"/>
+ <a u="641B" b="DE F6"/>
+ <a u="641C" b="CB D1"/>
+ <a u="641D" b="93 7A"/>
+ <a u="641E" b="B8 E3"/>
+ <a u="641F" b="93 7B"/>
+ <a u="6420" b="DE F7"/>
+ <a u="6421" b="DE FA"/>
+ <a u="6422" b="93 7C"/>
+ <a u="6423" b="93 7D"/>
+ <a u="6424" b="93 7E"/>
+ <a u="6425" b="93 80"/>
+ <a u="6426" b="DE F9"/>
+ <a u="6427" b="93 81"/>
+ <a u="6428" b="93 82"/>
+ <a u="6429" b="93 83"/>
+ <a u="642A" b="CC C2"/>
+ <a u="642B" b="93 84"/>
+ <a u="642C" b="B0 E1"/>
+ <a u="642D" b="B4 EE"/>
+ <a u="642E" b="93 85"/>
+ <a u="642F" b="93 86"/>
+ <a u="6430" b="93 87"/>
+ <a u="6431" b="93 88"/>
+ <a u="6432" b="93 89"/>
+ <a u="6433" b="93 8A"/>
+ <a u="6434" b="E5 BA"/>
+ <a u="6435" b="93 8B"/>
+ <a u="6436" b="93 8C"/>
+ <a u="6437" b="93 8D"/>
+ <a u="6438" b="93 8E"/>
+ <a u="6439" b="93 8F"/>
+ <a u="643A" b="D0 AF"/>
+ <a u="643B" b="93 90"/>
+ <a u="643C" b="93 91"/>
+ <a u="643D" b="B2 EB"/>
+ <a u="643E" b="93 92"/>
+ <a u="643F" b="EB A1"/>
+ <a u="6440" b="93 93"/>
+ <a u="6441" b="DE F4"/>
+ <a u="6442" b="93 94"/>
+ <a u="6443" b="93 95"/>
+ <a u="6444" b="C9 E3"/>
+ <a u="6445" b="DE F3"/>
+ <a u="6446" b="B0 DA"/>
+ <a u="6447" b="D2 A1"/>
+ <a u="6448" b="B1 F7"/>
+ <a u="6449" b="93 96"/>
+ <a u="644A" b="CC AF"/>
+ <a u="644B" b="93 97"/>
+ <a u="644C" b="93 98"/>
+ <a u="644D" b="93 99"/>
+ <a u="644E" b="93 9A"/>
+ <a u="644F" b="93 9B"/>
+ <a u="6450" b="93 9C"/>
+ <a u="6451" b="93 9D"/>
+ <a u="6452" b="DE F0"/>
+ <a u="6453" b="93 9E"/>
+ <a u="6454" b="CB A4"/>
+ <a u="6455" b="93 9F"/>
+ <a u="6456" b="93 A0"/>
+ <a u="6457" b="93 A1"/>
+ <a u="6458" b="D5 AA"/>
+ <a u="6459" b="93 A2"/>
+ <a u="645A" b="93 A3"/>
+ <a u="645B" b="93 A4"/>
+ <a u="645C" b="93 A5"/>
+ <a u="645D" b="93 A6"/>
+ <a u="645E" b="DE FB"/>
+ <a u="645F" b="93 A7"/>
+ <a u="6460" b="93 A8"/>
+ <a u="6461" b="93 A9"/>
+ <a u="6462" b="93 AA"/>
+ <a u="6463" b="93 AB"/>
+ <a u="6464" b="93 AC"/>
+ <a u="6465" b="93 AD"/>
+ <a u="6466" b="93 AE"/>
+ <a u="6467" b="B4 DD"/>
+ <a u="6468" b="93 AF"/>
+ <a u="6469" b="C4 A6"/>
+ <a u="646A" b="93 B0"/>
+ <a u="646B" b="93 B1"/>
+ <a u="646C" b="93 B2"/>
+ <a u="646D" b="DE FD"/>
+ <a u="646E" b="93 B3"/>
+ <a u="646F" b="93 B4"/>
+ <a u="6470" b="93 B5"/>
+ <a u="6471" b="93 B6"/>
+ <a u="6472" b="93 B7"/>
+ <a u="6473" b="93 B8"/>
+ <a u="6474" b="93 B9"/>
+ <a u="6475" b="93 BA"/>
+ <a u="6476" b="93 BB"/>
+ <a u="6477" b="93 BC"/>
+ <a u="6478" b="C3 FE"/>
+ <a u="6479" b="C4 A1"/>
+ <a u="647A" b="DF A1"/>
+ <a u="647B" b="93 BD"/>
+ <a u="647C" b="93 BE"/>
+ <a u="647D" b="93 BF"/>
+ <a u="647E" b="93 C0"/>
+ <a u="647F" b="93 C1"/>
+ <a u="6480" b="93 C2"/>
+ <a u="6481" b="93 C3"/>
+ <a u="6482" b="C1 CC"/>
+ <a u="6483" b="93 C4"/>
+ <a u="6484" b="DE FC"/>
+ <a u="6485" b="BE EF"/>
+ <a u="6486" b="93 C5"/>
+ <a u="6487" b="C6 B2"/>
+ <a u="6488" b="93 C6"/>
+ <a u="6489" b="93 C7"/>
+ <a u="648A" b="93 C8"/>
+ <a u="648B" b="93 C9"/>
+ <a u="648C" b="93 CA"/>
+ <a u="648D" b="93 CB"/>
+ <a u="648E" b="93 CC"/>
+ <a u="648F" b="93 CD"/>
+ <a u="6490" b="93 CE"/>
+ <a u="6491" b="B3 C5"/>
+ <a u="6492" b="C8 F6"/>
+ <a u="6493" b="93 CF"/>
+ <a u="6494" b="93 D0"/>
+ <a u="6495" b="CB BA"/>
+ <a u="6496" b="DE FE"/>
+ <a u="6497" b="93 D1"/>
+ <a u="6498" b="93 D2"/>
+ <a u="6499" b="DF A4"/>
+ <a u="649A" b="93 D3"/>
+ <a u="649B" b="93 D4"/>
+ <a u="649C" b="93 D5"/>
+ <a u="649D" b="93 D6"/>
+ <a u="649E" b="D7 B2"/>
+ <a u="649F" b="93 D7"/>
+ <a u="64A0" b="93 D8"/>
+ <a u="64A1" b="93 D9"/>
+ <a u="64A2" b="93 DA"/>
+ <a u="64A3" b="93 DB"/>
+ <a u="64A4" b="B3 B7"/>
+ <a u="64A5" b="93 DC"/>
+ <a u="64A6" b="93 DD"/>
+ <a u="64A7" b="93 DE"/>
+ <a u="64A8" b="93 DF"/>
+ <a u="64A9" b="C1 C3"/>
+ <a u="64AA" b="93 E0"/>
+ <a u="64AB" b="93 E1"/>
+ <a u="64AC" b="C7 CB"/>
+ <a u="64AD" b="B2 A5"/>
+ <a u="64AE" b="B4 E9"/>
+ <a u="64AF" b="93 E2"/>
+ <a u="64B0" b="D7 AB"/>
+ <a u="64B1" b="93 E3"/>
+ <a u="64B2" b="93 E4"/>
+ <a u="64B3" b="93 E5"/>
+ <a u="64B4" b="93 E6"/>
+ <a u="64B5" b="C4 EC"/>
+ <a u="64B6" b="93 E7"/>
+ <a u="64B7" b="DF A2"/>
+ <a u="64B8" b="DF A3"/>
+ <a u="64B9" b="93 E8"/>
+ <a u="64BA" b="DF A5"/>
+ <a u="64BB" b="93 E9"/>
+ <a u="64BC" b="BA B3"/>
+ <a u="64BD" b="93 EA"/>
+ <a u="64BE" b="93 EB"/>
+ <a u="64BF" b="93 EC"/>
+ <a u="64C0" b="DF A6"/>
+ <a u="64C1" b="93 ED"/>
+ <a u="64C2" b="C0 DE"/>
+ <a u="64C3" b="93 EE"/>
+ <a u="64C4" b="93 EF"/>
+ <a u="64C5" b="C9 C3"/>
+ <a u="64C6" b="93 F0"/>
+ <a u="64C7" b="93 F1"/>
+ <a u="64C8" b="93 F2"/>
+ <a u="64C9" b="93 F3"/>
+ <a u="64CA" b="93 F4"/>
+ <a u="64CB" b="93 F5"/>
+ <a u="64CC" b="93 F6"/>
+ <a u="64CD" b="B2 D9"/>
+ <a u="64CE" b="C7 E6"/>
+ <a u="64CF" b="93 F7"/>
+ <a u="64D0" b="DF A7"/>
+ <a u="64D1" b="93 F8"/>
+ <a u="64D2" b="C7 DC"/>
+ <a u="64D3" b="93 F9"/>
+ <a u="64D4" b="93 FA"/>
+ <a u="64D5" b="93 FB"/>
+ <a u="64D6" b="93 FC"/>
+ <a u="64D7" b="DF A8"/>
+ <a u="64D8" b="EB A2"/>
+ <a u="64D9" b="93 FD"/>
+ <a u="64DA" b="93 FE"/>
+ <a u="64DB" b="94 40"/>
+ <a u="64DC" b="94 41"/>
+ <a u="64DD" b="94 42"/>
+ <a u="64DE" b="CB D3"/>
+ <a u="64DF" b="94 43"/>
+ <a u="64E0" b="94 44"/>
+ <a u="64E1" b="94 45"/>
+ <a u="64E2" b="DF AA"/>
+ <a u="64E3" b="94 46"/>
+ <a u="64E4" b="DF A9"/>
+ <a u="64E5" b="94 47"/>
+ <a u="64E6" b="B2 C1"/>
+ <a u="64E7" b="94 48"/>
+ <a u="64E8" b="94 49"/>
+ <a u="64E9" b="94 4A"/>
+ <a u="64EA" b="94 4B"/>
+ <a u="64EB" b="94 4C"/>
+ <a u="64EC" b="94 4D"/>
+ <a u="64ED" b="94 4E"/>
+ <a u="64EE" b="94 4F"/>
+ <a u="64EF" b="94 50"/>
+ <a u="64F0" b="94 51"/>
+ <a u="64F1" b="94 52"/>
+ <a u="64F2" b="94 53"/>
+ <a u="64F3" b="94 54"/>
+ <a u="64F4" b="94 55"/>
+ <a u="64F5" b="94 56"/>
+ <a u="64F6" b="94 57"/>
+ <a u="64F7" b="94 58"/>
+ <a u="64F8" b="94 59"/>
+ <a u="64F9" b="94 5A"/>
+ <a u="64FA" b="94 5B"/>
+ <a u="64FB" b="94 5C"/>
+ <a u="64FC" b="94 5D"/>
+ <a u="64FD" b="94 5E"/>
+ <a u="64FE" b="94 5F"/>
+ <a u="64FF" b="94 60"/>
+ <a u="6500" b="C5 CA"/>
+ <a u="6501" b="94 61"/>
+ <a u="6502" b="94 62"/>
+ <a u="6503" b="94 63"/>
+ <a u="6504" b="94 64"/>
+ <a u="6505" b="94 65"/>
+ <a u="6506" b="94 66"/>
+ <a u="6507" b="94 67"/>
+ <a u="6508" b="94 68"/>
+ <a u="6509" b="DF AB"/>
+ <a u="650A" b="94 69"/>
+ <a u="650B" b="94 6A"/>
+ <a u="650C" b="94 6B"/>
+ <a u="650D" b="94 6C"/>
+ <a u="650E" b="94 6D"/>
+ <a u="650F" b="94 6E"/>
+ <a u="6510" b="94 6F"/>
+ <a u="6511" b="94 70"/>
+ <a u="6512" b="D4 DC"/>
+ <a u="6513" b="94 71"/>
+ <a u="6514" b="94 72"/>
+ <a u="6515" b="94 73"/>
+ <a u="6516" b="94 74"/>
+ <a u="6517" b="94 75"/>
+ <a u="6518" b="C8 C1"/>
+ <a u="6519" b="94 76"/>
+ <a u="651A" b="94 77"/>
+ <a u="651B" b="94 78"/>
+ <a u="651C" b="94 79"/>
+ <a u="651D" b="94 7A"/>
+ <a u="651E" b="94 7B"/>
+ <a u="651F" b="94 7C"/>
+ <a u="6520" b="94 7D"/>
+ <a u="6521" b="94 7E"/>
+ <a u="6522" b="94 80"/>
+ <a u="6523" b="94 81"/>
+ <a u="6524" b="94 82"/>
+ <a u="6525" b="DF AC"/>
+ <a u="6526" b="94 83"/>
+ <a u="6527" b="94 84"/>
+ <a u="6528" b="94 85"/>
+ <a u="6529" b="94 86"/>
+ <a u="652A" b="94 87"/>
+ <a u="652B" b="BE F0"/>
+ <a u="652C" b="94 88"/>
+ <a u="652D" b="94 89"/>
+ <a u="652E" b="DF AD"/>
+ <a u="652F" b="D6 A7"/>
+ <a u="6530" b="94 8A"/>
+ <a u="6531" b="94 8B"/>
+ <a u="6532" b="94 8C"/>
+ <a u="6533" b="94 8D"/>
+ <a u="6534" b="EA B7"/>
+ <a u="6535" b="EB B6"/>
+ <a u="6536" b="CA D5"/>
+ <a u="6537" b="94 8E"/>
+ <a u="6538" b="D8 FC"/>
+ <a u="6539" b="B8 C4"/>
+ <a u="653A" b="94 8F"/>
+ <a u="653B" b="B9 A5"/>
+ <a u="653C" b="94 90"/>
+ <a u="653D" b="94 91"/>
+ <a u="653E" b="B7 C5"/>
+ <a u="653F" b="D5 FE"/>
+ <a u="6540" b="94 92"/>
+ <a u="6541" b="94 93"/>
+ <a u="6542" b="94 94"/>
+ <a u="6543" b="94 95"/>
+ <a u="6544" b="94 96"/>
+ <a u="6545" b="B9 CA"/>
+ <a u="6546" b="94 97"/>
+ <a u="6547" b="94 98"/>
+ <a u="6548" b="D0 A7"/>
+ <a u="6549" b="F4 CD"/>
+ <a u="654A" b="94 99"/>
+ <a u="654B" b="94 9A"/>
+ <a u="654C" b="B5 D0"/>
+ <a u="654D" b="94 9B"/>
+ <a u="654E" b="94 9C"/>
+ <a u="654F" b="C3 F4"/>
+ <a u="6550" b="94 9D"/>
+ <a u="6551" b="BE C8"/>
+ <a u="6552" b="94 9E"/>
+ <a u="6553" b="94 9F"/>
+ <a u="6554" b="94 A0"/>
+ <a u="6555" b="EB B7"/>
+ <a u="6556" b="B0 BD"/>
+ <a u="6557" b="94 A1"/>
+ <a u="6558" b="94 A2"/>
+ <a u="6559" b="BD CC"/>
+ <a u="655A" b="94 A3"/>
+ <a u="655B" b="C1 B2"/>
+ <a u="655C" b="94 A4"/>
+ <a u="655D" b="B1 D6"/>
+ <a u="655E" b="B3 A8"/>
+ <a u="655F" b="94 A5"/>
+ <a u="6560" b="94 A6"/>
+ <a u="6561" b="94 A7"/>
+ <a u="6562" b="B8 D2"/>
+ <a u="6563" b="C9 A2"/>
+ <a u="6564" b="94 A8"/>
+ <a u="6565" b="94 A9"/>
+ <a u="6566" b="B6 D8"/>
+ <a u="6567" b="94 AA"/>
+ <a u="6568" b="94 AB"/>
+ <a u="6569" b="94 AC"/>
+ <a u="656A" b="94 AD"/>
+ <a u="656B" b="EB B8"/>
+ <a u="656C" b="BE B4"/>
+ <a u="656D" b="94 AE"/>
+ <a u="656E" b="94 AF"/>
+ <a u="656F" b="94 B0"/>
+ <a u="6570" b="CA FD"/>
+ <a u="6571" b="94 B1"/>
+ <a u="6572" b="C7 C3"/>
+ <a u="6573" b="94 B2"/>
+ <a u="6574" b="D5 FB"/>
+ <a u="6575" b="94 B3"/>
+ <a u="6576" b="94 B4"/>
+ <a u="6577" b="B7 F3"/>
+ <a u="6578" b="94 B5"/>
+ <a u="6579" b="94 B6"/>
+ <a u="657A" b="94 B7"/>
+ <a u="657B" b="94 B8"/>
+ <a u="657C" b="94 B9"/>
+ <a u="657D" b="94 BA"/>
+ <a u="657E" b="94 BB"/>
+ <a u="657F" b="94 BC"/>
+ <a u="6580" b="94 BD"/>
+ <a u="6581" b="94 BE"/>
+ <a u="6582" b="94 BF"/>
+ <a u="6583" b="94 C0"/>
+ <a u="6584" b="94 C1"/>
+ <a u="6585" b="94 C2"/>
+ <a u="6586" b="94 C3"/>
+ <a u="6587" b="CE C4"/>
+ <a u="6588" b="94 C4"/>
+ <a u="6589" b="94 C5"/>
+ <a u="658A" b="94 C6"/>
+ <a u="658B" b="D5 AB"/>
+ <a u="658C" b="B1 F3"/>
+ <a u="658D" b="94 C7"/>
+ <a u="658E" b="94 C8"/>
+ <a u="658F" b="94 C9"/>
+ <a u="6590" b="EC B3"/>
+ <a u="6591" b="B0 DF"/>
+ <a u="6592" b="94 CA"/>
+ <a u="6593" b="EC B5"/>
+ <a u="6594" b="94 CB"/>
+ <a u="6595" b="94 CC"/>
+ <a u="6596" b="94 CD"/>
+ <a u="6597" b="B6 B7"/>
+ <a u="6598" b="94 CE"/>
+ <a u="6599" b="C1 CF"/>
+ <a u="659A" b="94 CF"/>
+ <a u="659B" b="F5 FA"/>
+ <a u="659C" b="D0 B1"/>
+ <a u="659D" b="94 D0"/>
+ <a u="659E" b="94 D1"/>
+ <a u="659F" b="D5 E5"/>
+ <a u="65A0" b="94 D2"/>
+ <a u="65A1" b="CE D3"/>
+ <a u="65A2" b="94 D3"/>
+ <a u="65A3" b="94 D4"/>
+ <a u="65A4" b="BD EF"/>
+ <a u="65A5" b="B3 E2"/>
+ <a u="65A6" b="94 D5"/>
+ <a u="65A7" b="B8 AB"/>
+ <a u="65A8" b="94 D6"/>
+ <a u="65A9" b="D5 B6"/>
+ <a u="65AA" b="94 D7"/>
+ <a u="65AB" b="ED BD"/>
+ <a u="65AC" b="94 D8"/>
+ <a u="65AD" b="B6 CF"/>
+ <a u="65AE" b="94 D9"/>
+ <a u="65AF" b="CB B9"/>
+ <a u="65B0" b="D0 C2"/>
+ <a u="65B1" b="94 DA"/>
+ <a u="65B2" b="94 DB"/>
+ <a u="65B3" b="94 DC"/>
+ <a u="65B4" b="94 DD"/>
+ <a u="65B5" b="94 DE"/>
+ <a u="65B6" b="94 DF"/>
+ <a u="65B7" b="94 E0"/>
+ <a u="65B8" b="94 E1"/>
+ <a u="65B9" b="B7 BD"/>
+ <a u="65BA" b="94 E2"/>
+ <a u="65BB" b="94 E3"/>
+ <a u="65BC" b="EC B6"/>
+ <a u="65BD" b="CA A9"/>
+ <a u="65BE" b="94 E4"/>
+ <a u="65BF" b="94 E5"/>
+ <a u="65C0" b="94 E6"/>
+ <a u="65C1" b="C5 D4"/>
+ <a u="65C2" b="94 E7"/>
+ <a u="65C3" b="EC B9"/>
+ <a u="65C4" b="EC B8"/>
+ <a u="65C5" b="C2 C3"/>
+ <a u="65C6" b="EC B7"/>
+ <a u="65C7" b="94 E8"/>
+ <a u="65C8" b="94 E9"/>
+ <a u="65C9" b="94 EA"/>
+ <a u="65CA" b="94 EB"/>
+ <a u="65CB" b="D0 FD"/>
+ <a u="65CC" b="EC BA"/>
+ <a u="65CD" b="94 EC"/>
+ <a u="65CE" b="EC BB"/>
+ <a u="65CF" b="D7 E5"/>
+ <a u="65D0" b="94 ED"/>
+ <a u="65D1" b="94 EE"/>
+ <a u="65D2" b="EC BC"/>
+ <a u="65D3" b="94 EF"/>
+ <a u="65D4" b="94 F0"/>
+ <a u="65D5" b="94 F1"/>
+ <a u="65D6" b="EC BD"/>
+ <a u="65D7" b="C6 EC"/>
+ <a u="65D8" b="94 F2"/>
+ <a u="65D9" b="94 F3"/>
+ <a u="65DA" b="94 F4"/>
+ <a u="65DB" b="94 F5"/>
+ <a u="65DC" b="94 F6"/>
+ <a u="65DD" b="94 F7"/>
+ <a u="65DE" b="94 F8"/>
+ <a u="65DF" b="94 F9"/>
+ <a u="65E0" b="CE DE"/>
+ <a u="65E1" b="94 FA"/>
+ <a u="65E2" b="BC C8"/>
+ <a u="65E3" b="94 FB"/>
+ <a u="65E4" b="94 FC"/>
+ <a u="65E5" b="C8 D5"/>
+ <a u="65E6" b="B5 A9"/>
+ <a u="65E7" b="BE C9"/>
+ <a u="65E8" b="D6 BC"/>
+ <a u="65E9" b="D4 E7"/>
+ <a u="65EA" b="94 FD"/>
+ <a u="65EB" b="94 FE"/>
+ <a u="65EC" b="D1 AE"/>
+ <a u="65ED" b="D0 F1"/>
+ <a u="65EE" b="EA B8"/>
+ <a u="65EF" b="EA B9"/>
+ <a u="65F0" b="EA BA"/>
+ <a u="65F1" b="BA B5"/>
+ <a u="65F2" b="95 40"/>
+ <a u="65F3" b="95 41"/>
+ <a u="65F4" b="95 42"/>
+ <a u="65F5" b="95 43"/>
+ <a u="65F6" b="CA B1"/>
+ <a u="65F7" b="BF F5"/>
+ <a u="65F8" b="95 44"/>
+ <a u="65F9" b="95 45"/>
+ <a u="65FA" b="CD FA"/>
+ <a u="65FB" b="95 46"/>
+ <a u="65FC" b="95 47"/>
+ <a u="65FD" b="95 48"/>
+ <a u="65FE" b="95 49"/>
+ <a u="65FF" b="95 4A"/>
+ <a u="6600" b="EA C0"/>
+ <a u="6601" b="95 4B"/>
+ <a u="6602" b="B0 BA"/>
+ <a u="6603" b="EA BE"/>
+ <a u="6604" b="95 4C"/>
+ <a u="6605" b="95 4D"/>
+ <a u="6606" b="C0 A5"/>
+ <a u="6607" b="95 4E"/>
+ <a u="6608" b="95 4F"/>
+ <a u="6609" b="95 50"/>
+ <a u="660A" b="EA BB"/>
+ <a u="660B" b="95 51"/>
+ <a u="660C" b="B2 FD"/>
+ <a u="660D" b="95 52"/>
+ <a u="660E" b="C3 F7"/>
+ <a u="660F" b="BB E8"/>
+ <a u="6610" b="95 53"/>
+ <a u="6611" b="95 54"/>
+ <a u="6612" b="95 55"/>
+ <a u="6613" b="D2 D7"/>
+ <a u="6614" b="CE F4"/>
+ <a u="6615" b="EA BF"/>
+ <a u="6616" b="95 56"/>
+ <a u="6617" b="95 57"/>
+ <a u="6618" b="95 58"/>
+ <a u="6619" b="EA BC"/>
+ <a u="661A" b="95 59"/>
+ <a u="661B" b="95 5A"/>
+ <a u="661C" b="95 5B"/>
+ <a u="661D" b="EA C3"/>
+ <a u="661E" b="95 5C"/>
+ <a u="661F" b="D0 C7"/>
+ <a u="6620" b="D3 B3"/>
+ <a u="6621" b="95 5D"/>
+ <a u="6622" b="95 5E"/>
+ <a u="6623" b="95 5F"/>
+ <a u="6624" b="95 60"/>
+ <a u="6625" b="B4 BA"/>
+ <a u="6626" b="95 61"/>
+ <a u="6627" b="C3 C1"/>
+ <a u="6628" b="D7 F2"/>
+ <a u="6629" b="95 62"/>
+ <a u="662A" b="95 63"/>
+ <a u="662B" b="95 64"/>
+ <a u="662C" b="95 65"/>
+ <a u="662D" b="D5 D1"/>
+ <a u="662E" b="95 66"/>
+ <a u="662F" b="CA C7"/>
+ <a u="6630" b="95 67"/>
+ <a u="6631" b="EA C5"/>
+ <a u="6632" b="95 68"/>
+ <a u="6633" b="95 69"/>
+ <a u="6634" b="EA C4"/>
+ <a u="6635" b="EA C7"/>
+ <a u="6636" b="EA C6"/>
+ <a u="6637" b="95 6A"/>
+ <a u="6638" b="95 6B"/>
+ <a u="6639" b="95 6C"/>
+ <a u="663A" b="95 6D"/>
+ <a u="663B" b="95 6E"/>
+ <a u="663C" b="D6 E7"/>
+ <a u="663D" b="95 6F"/>
+ <a u="663E" b="CF D4"/>
+ <a u="663F" b="95 70"/>
+ <a u="6640" b="95 71"/>
+ <a u="6641" b="EA CB"/>
+ <a u="6642" b="95 72"/>
+ <a u="6643" b="BB CE"/>
+ <a u="6644" b="95 73"/>
+ <a u="6645" b="95 74"/>
+ <a u="6646" b="95 75"/>
+ <a u="6647" b="95 76"/>
+ <a u="6648" b="95 77"/>
+ <a u="6649" b="95 78"/>
+ <a u="664A" b="95 79"/>
+ <a u="664B" b="BD FA"/>
+ <a u="664C" b="C9 CE"/>
+ <a u="664D" b="95 7A"/>
+ <a u="664E" b="95 7B"/>
+ <a u="664F" b="EA CC"/>
+ <a u="6650" b="95 7C"/>
+ <a u="6651" b="95 7D"/>
+ <a u="6652" b="C9 B9"/>
+ <a u="6653" b="CF FE"/>
+ <a u="6654" b="EA CA"/>
+ <a u="6655" b="D4 CE"/>
+ <a u="6656" b="EA CD"/>
+ <a u="6657" b="EA CF"/>
+ <a u="6658" b="95 7E"/>
+ <a u="6659" b="95 80"/>
+ <a u="665A" b="CD ED"/>
+ <a u="665B" b="95 81"/>
+ <a u="665C" b="95 82"/>
+ <a u="665D" b="95 83"/>
+ <a u="665E" b="95 84"/>
+ <a u="665F" b="EA C9"/>
+ <a u="6660" b="95 85"/>
+ <a u="6661" b="EA CE"/>
+ <a u="6662" b="95 86"/>
+ <a u="6663" b="95 87"/>
+ <a u="6664" b="CE EE"/>
+ <a u="6665" b="95 88"/>
+ <a u="6666" b="BB DE"/>
+ <a u="6667" b="95 89"/>
+ <a u="6668" b="B3 BF"/>
+ <a u="6669" b="95 8A"/>
+ <a u="666A" b="95 8B"/>
+ <a u="666B" b="95 8C"/>
+ <a u="666C" b="95 8D"/>
+ <a u="666D" b="95 8E"/>
+ <a u="666E" b="C6 D5"/>
+ <a u="666F" b="BE B0"/>
+ <a u="6670" b="CE FA"/>
+ <a u="6671" b="95 8F"/>
+ <a u="6672" b="95 90"/>
+ <a u="6673" b="95 91"/>
+ <a u="6674" b="C7 E7"/>
+ <a u="6675" b="95 92"/>
+ <a u="6676" b="BE A7"/>
+ <a u="6677" b="EA D0"/>
+ <a u="6678" b="95 93"/>
+ <a u="6679" b="95 94"/>
+ <a u="667A" b="D6 C7"/>
+ <a u="667B" b="95 95"/>
+ <a u="667C" b="95 96"/>
+ <a u="667D" b="95 97"/>
+ <a u="667E" b="C1 C0"/>
+ <a u="667F" b="95 98"/>
+ <a u="6680" b="95 99"/>
+ <a u="6681" b="95 9A"/>
+ <a u="6682" b="D4 DD"/>
+ <a u="6683" b="95 9B"/>
+ <a u="6684" b="EA D1"/>
+ <a u="6685" b="95 9C"/>
+ <a u="6686" b="95 9D"/>
+ <a u="6687" b="CF BE"/>
+ <a u="6688" b="95 9E"/>
+ <a u="6689" b="95 9F"/>
+ <a u="668A" b="95 A0"/>
+ <a u="668B" b="95 A1"/>
+ <a u="668C" b="EA D2"/>
+ <a u="668D" b="95 A2"/>
+ <a u="668E" b="95 A3"/>
+ <a u="668F" b="95 A4"/>
+ <a u="6690" b="95 A5"/>
+ <a u="6691" b="CA EE"/>
+ <a u="6692" b="95 A6"/>
+ <a u="6693" b="95 A7"/>
+ <a u="6694" b="95 A8"/>
+ <a u="6695" b="95 A9"/>
+ <a u="6696" b="C5 AF"/>
+ <a u="6697" b="B0 B5"/>
+ <a u="6698" b="95 AA"/>
+ <a u="6699" b="95 AB"/>
+ <a u="669A" b="95 AC"/>
+ <a u="669B" b="95 AD"/>
+ <a u="669C" b="95 AE"/>
+ <a u="669D" b="EA D4"/>
+ <a u="669E" b="95 AF"/>
+ <a u="669F" b="95 B0"/>
+ <a u="66A0" b="95 B1"/>
+ <a u="66A1" b="95 B2"/>
+ <a u="66A2" b="95 B3"/>
+ <a u="66A3" b="95 B4"/>
+ <a u="66A4" b="95 B5"/>
+ <a u="66A5" b="95 B6"/>
+ <a u="66A6" b="95 B7"/>
+ <a u="66A7" b="EA D3"/>
+ <a u="66A8" b="F4 DF"/>
+ <a u="66A9" b="95 B8"/>
+ <a u="66AA" b="95 B9"/>
+ <a u="66AB" b="95 BA"/>
+ <a u="66AC" b="95 BB"/>
+ <a u="66AD" b="95 BC"/>
+ <a u="66AE" b="C4 BA"/>
+ <a u="66AF" b="95 BD"/>
+ <a u="66B0" b="95 BE"/>
+ <a u="66B1" b="95 BF"/>
+ <a u="66B2" b="95 C0"/>
+ <a u="66B3" b="95 C1"/>
+ <a u="66B4" b="B1 A9"/>
+ <a u="66B5" b="95 C2"/>
+ <a u="66B6" b="95 C3"/>
+ <a u="66B7" b="95 C4"/>
+ <a u="66B8" b="95 C5"/>
+ <a u="66B9" b="E5 DF"/>
+ <a u="66BA" b="95 C6"/>
+ <a u="66BB" b="95 C7"/>
+ <a u="66BC" b="95 C8"/>
+ <a u="66BD" b="95 C9"/>
+ <a u="66BE" b="EA D5"/>
+ <a u="66BF" b="95 CA"/>
+ <a u="66C0" b="95 CB"/>
+ <a u="66C1" b="95 CC"/>
+ <a u="66C2" b="95 CD"/>
+ <a u="66C3" b="95 CE"/>
+ <a u="66C4" b="95 CF"/>
+ <a u="66C5" b="95 D0"/>
+ <a u="66C6" b="95 D1"/>
+ <a u="66C7" b="95 D2"/>
+ <a u="66C8" b="95 D3"/>
+ <a u="66C9" b="95 D4"/>
+ <a u="66CA" b="95 D5"/>
+ <a u="66CB" b="95 D6"/>
+ <a u="66CC" b="95 D7"/>
+ <a u="66CD" b="95 D8"/>
+ <a u="66CE" b="95 D9"/>
+ <a u="66CF" b="95 DA"/>
+ <a u="66D0" b="95 DB"/>
+ <a u="66D1" b="95 DC"/>
+ <a u="66D2" b="95 DD"/>
+ <a u="66D3" b="95 DE"/>
+ <a u="66D4" b="95 DF"/>
+ <a u="66D5" b="95 E0"/>
+ <a u="66D6" b="95 E1"/>
+ <a u="66D7" b="95 E2"/>
+ <a u="66D8" b="95 E3"/>
+ <a u="66D9" b="CA EF"/>
+ <a u="66DA" b="95 E4"/>
+ <a u="66DB" b="EA D6"/>
+ <a u="66DC" b="EA D7"/>
+ <a u="66DD" b="C6 D8"/>
+ <a u="66DE" b="95 E5"/>
+ <a u="66DF" b="95 E6"/>
+ <a u="66E0" b="95 E7"/>
+ <a u="66E1" b="95 E8"/>
+ <a u="66E2" b="95 E9"/>
+ <a u="66E3" b="95 EA"/>
+ <a u="66E4" b="95 EB"/>
+ <a u="66E5" b="95 EC"/>
+ <a u="66E6" b="EA D8"/>
+ <a u="66E7" b="95 ED"/>
+ <a u="66E8" b="95 EE"/>
+ <a u="66E9" b="EA D9"/>
+ <a u="66EA" b="95 EF"/>
+ <a u="66EB" b="95 F0"/>
+ <a u="66EC" b="95 F1"/>
+ <a u="66ED" b="95 F2"/>
+ <a u="66EE" b="95 F3"/>
+ <a u="66EF" b="95 F4"/>
+ <a u="66F0" b="D4 BB"/>
+ <a u="66F1" b="95 F5"/>
+ <a u="66F2" b="C7 FA"/>
+ <a u="66F3" b="D2 B7"/>
+ <a u="66F4" b="B8 FC"/>
+ <a u="66F5" b="95 F6"/>
+ <a u="66F6" b="95 F7"/>
+ <a u="66F7" b="EA C2"/>
+ <a u="66F8" b="95 F8"/>
+ <a u="66F9" b="B2 DC"/>
+ <a u="66FA" b="95 F9"/>
+ <a u="66FB" b="95 FA"/>
+ <a u="66FC" b="C2 FC"/>
+ <a u="66FD" b="95 FB"/>
+ <a u="66FE" b="D4 F8"/>
+ <a u="66FF" b="CC E6"/>
+ <a u="6700" b="D7 EE"/>
+ <a u="6701" b="95 FC"/>
+ <a u="6702" b="95 FD"/>
+ <a u="6703" b="95 FE"/>
+ <a u="6704" b="96 40"/>
+ <a u="6705" b="96 41"/>
+ <a u="6706" b="96 42"/>
+ <a u="6707" b="96 43"/>
+ <a u="6708" b="D4 C2"/>
+ <a u="6709" b="D3 D0"/>
+ <a u="670A" b="EB C3"/>
+ <a u="670B" b="C5 F3"/>
+ <a u="670C" b="96 44"/>
+ <a u="670D" b="B7 FE"/>
+ <a u="670E" b="96 45"/>
+ <a u="670F" b="96 46"/>
+ <a u="6710" b="EB D4"/>
+ <a u="6711" b="96 47"/>
+ <a u="6712" b="96 48"/>
+ <a u="6713" b="96 49"/>
+ <a u="6714" b="CB B7"/>
+ <a u="6715" b="EB DE"/>
+ <a u="6716" b="96 4A"/>
+ <a u="6717" b="C0 CA"/>
+ <a u="6718" b="96 4B"/>
+ <a u="6719" b="96 4C"/>
+ <a u="671A" b="96 4D"/>
+ <a u="671B" b="CD FB"/>
+ <a u="671C" b="96 4E"/>
+ <a u="671D" b="B3 AF"/>
+ <a u="671E" b="96 4F"/>
+ <a u="671F" b="C6 DA"/>
+ <a u="6720" b="96 50"/>
+ <a u="6721" b="96 51"/>
+ <a u="6722" b="96 52"/>
+ <a u="6723" b="96 53"/>
+ <a u="6724" b="96 54"/>
+ <a u="6725" b="96 55"/>
+ <a u="6726" b="EB FC"/>
+ <a u="6727" b="96 56"/>
+ <a u="6728" b="C4 BE"/>
+ <a u="6729" b="96 57"/>
+ <a u="672A" b="CE B4"/>
+ <a u="672B" b="C4 A9"/>
+ <a u="672C" b="B1 BE"/>
+ <a u="672D" b="D4 FD"/>
+ <a u="672E" b="96 58"/>
+ <a u="672F" b="CA F5"/>
+ <a u="6730" b="96 59"/>
+ <a u="6731" b="D6 EC"/>
+ <a u="6732" b="96 5A"/>
+ <a u="6733" b="96 5B"/>
+ <a u="6734" b="C6 D3"/>
+ <a u="6735" b="B6 E4"/>
+ <a u="6736" b="96 5C"/>
+ <a u="6737" b="96 5D"/>
+ <a u="6738" b="96 5E"/>
+ <a u="6739" b="96 5F"/>
+ <a u="673A" b="BB FA"/>
+ <a u="673B" b="96 60"/>
+ <a u="673C" b="96 61"/>
+ <a u="673D" b="D0 E0"/>
+ <a u="673E" b="96 62"/>
+ <a u="673F" b="96 63"/>
+ <a u="6740" b="C9 B1"/>
+ <a u="6741" b="96 64"/>
+ <a u="6742" b="D4 D3"/>
+ <a u="6743" b="C8 A8"/>
+ <a u="6744" b="96 65"/>
+ <a u="6745" b="96 66"/>
+ <a u="6746" b="B8 CB"/>
+ <a u="6747" b="96 67"/>
+ <a u="6748" b="E8 BE"/>
+ <a u="6749" b="C9 BC"/>
+ <a u="674A" b="96 68"/>
+ <a u="674B" b="96 69"/>
+ <a u="674C" b="E8 BB"/>
+ <a u="674D" b="96 6A"/>
+ <a u="674E" b="C0 EE"/>
+ <a u="674F" b="D0 D3"/>
+ <a u="6750" b="B2 C4"/>
+ <a u="6751" b="B4 E5"/>
+ <a u="6752" b="96 6B"/>
+ <a u="6753" b="E8 BC"/>
+ <a u="6754" b="96 6C"/>
+ <a u="6755" b="96 6D"/>
+ <a u="6756" b="D5 C8"/>
+ <a u="6757" b="96 6E"/>
+ <a u="6758" b="96 6F"/>
+ <a u="6759" b="96 70"/>
+ <a u="675A" b="96 71"/>
+ <a u="675B" b="96 72"/>
+ <a u="675C" b="B6 C5"/>
+ <a u="675D" b="96 73"/>
+ <a u="675E" b="E8 BD"/>
+ <a u="675F" b="CA F8"/>
+ <a u="6760" b="B8 DC"/>
+ <a u="6761" b="CC F5"/>
+ <a u="6762" b="96 74"/>
+ <a u="6763" b="96 75"/>
+ <a u="6764" b="96 76"/>
+ <a u="6765" b="C0 B4"/>
+ <a u="6766" b="96 77"/>
+ <a u="6767" b="96 78"/>
+ <a u="6768" b="D1 EE"/>
+ <a u="6769" b="E8 BF"/>
+ <a u="676A" b="E8 C2"/>
+ <a u="676B" b="96 79"/>
+ <a u="676C" b="96 7A"/>
+ <a u="676D" b="BA BC"/>
+ <a u="676E" b="96 7B"/>
+ <a u="676F" b="B1 AD"/>
+ <a u="6770" b="BD DC"/>
+ <a u="6771" b="96 7C"/>
+ <a u="6772" b="EA BD"/>
+ <a u="6773" b="E8 C3"/>
+ <a u="6774" b="96 7D"/>
+ <a u="6775" b="E8 C6"/>
+ <a u="6776" b="96 7E"/>
+ <a u="6777" b="E8 CB"/>
+ <a u="6778" b="96 80"/>
+ <a u="6779" b="96 81"/>
+ <a u="677A" b="96 82"/>
+ <a u="677B" b="96 83"/>
+ <a u="677C" b="E8 CC"/>
+ <a u="677D" b="96 84"/>
+ <a u="677E" b="CB C9"/>
+ <a u="677F" b="B0 E5"/>
+ <a u="6780" b="96 85"/>
+ <a u="6781" b="BC AB"/>
+ <a u="6782" b="96 86"/>
+ <a u="6783" b="96 87"/>
+ <a u="6784" b="B9 B9"/>
+ <a u="6785" b="96 88"/>
+ <a u="6786" b="96 89"/>
+ <a u="6787" b="E8 C1"/>
+ <a u="6788" b="96 8A"/>
+ <a u="6789" b="CD F7"/>
+ <a u="678A" b="96 8B"/>
+ <a u="678B" b="E8 CA"/>
+ <a u="678C" b="96 8C"/>
+ <a u="678D" b="96 8D"/>
+ <a u="678E" b="96 8E"/>
+ <a u="678F" b="96 8F"/>
+ <a u="6790" b="CE F6"/>
+ <a u="6791" b="96 90"/>
+ <a u="6792" b="96 91"/>
+ <a u="6793" b="96 92"/>
+ <a u="6794" b="96 93"/>
+ <a u="6795" b="D5 ED"/>
+ <a u="6796" b="96 94"/>
+ <a u="6797" b="C1 D6"/>
+ <a u="6798" b="E8 C4"/>
+ <a u="6799" b="96 95"/>
+ <a u="679A" b="C3 B6"/>
+ <a u="679B" b="96 96"/>
+ <a u="679C" b="B9 FB"/>
+ <a u="679D" b="D6 A6"/>
+ <a u="679E" b="E8 C8"/>
+ <a u="679F" b="96 97"/>
+ <a u="67A0" b="96 98"/>
+ <a u="67A1" b="96 99"/>
+ <a u="67A2" b="CA E0"/>
+ <a u="67A3" b="D4 E6"/>
+ <a u="67A4" b="96 9A"/>
+ <a u="67A5" b="E8 C0"/>
+ <a u="67A6" b="96 9B"/>
+ <a u="67A7" b="E8 C5"/>
+ <a u="67A8" b="E8 C7"/>
+ <a u="67A9" b="96 9C"/>
+ <a u="67AA" b="C7 B9"/>
+ <a u="67AB" b="B7 E3"/>
+ <a u="67AC" b="96 9D"/>
+ <a u="67AD" b="E8 C9"/>
+ <a u="67AE" b="96 9E"/>
+ <a u="67AF" b="BF DD"/>
+ <a u="67B0" b="E8 D2"/>
+ <a u="67B1" b="96 9F"/>
+ <a u="67B2" b="96 A0"/>
+ <a u="67B3" b="E8 D7"/>
+ <a u="67B4" b="96 A1"/>
+ <a u="67B5" b="E8 D5"/>
+ <a u="67B6" b="BC DC"/>
+ <a u="67B7" b="BC CF"/>
+ <a u="67B8" b="E8 DB"/>
+ <a u="67B9" b="96 A2"/>
+ <a u="67BA" b="96 A3"/>
+ <a u="67BB" b="96 A4"/>
+ <a u="67BC" b="96 A5"/>
+ <a u="67BD" b="96 A6"/>
+ <a u="67BE" b="96 A7"/>
+ <a u="67BF" b="96 A8"/>
+ <a u="67C0" b="96 A9"/>
+ <a u="67C1" b="E8 DE"/>
+ <a u="67C2" b="96 AA"/>
+ <a u="67C3" b="E8 DA"/>
+ <a u="67C4" b="B1 FA"/>
+ <a u="67C5" b="96 AB"/>
+ <a u="67C6" b="96 AC"/>
+ <a u="67C7" b="96 AD"/>
+ <a u="67C8" b="96 AE"/>
+ <a u="67C9" b="96 AF"/>
+ <a u="67CA" b="96 B0"/>
+ <a u="67CB" b="96 B1"/>
+ <a u="67CC" b="96 B2"/>
+ <a u="67CD" b="96 B3"/>
+ <a u="67CE" b="96 B4"/>
+ <a u="67CF" b="B0 D8"/>
+ <a u="67D0" b="C4 B3"/>
+ <a u="67D1" b="B8 CC"/>
+ <a u="67D2" b="C6 E2"/>
+ <a u="67D3" b="C8 BE"/>
+ <a u="67D4" b="C8 E1"/>
+ <a u="67D5" b="96 B5"/>
+ <a u="67D6" b="96 B6"/>
+ <a u="67D7" b="96 B7"/>
+ <a u="67D8" b="E8 CF"/>
+ <a u="67D9" b="E8 D4"/>
+ <a u="67DA" b="E8 D6"/>
+ <a u="67DB" b="96 B8"/>
+ <a u="67DC" b="B9 F1"/>
+ <a u="67DD" b="E8 D8"/>
+ <a u="67DE" b="D7 F5"/>
+ <a u="67DF" b="96 B9"/>
+ <a u="67E0" b="C4 FB"/>
+ <a u="67E1" b="96 BA"/>
+ <a u="67E2" b="E8 DC"/>
+ <a u="67E3" b="96 BB"/>
+ <a u="67E4" b="96 BC"/>
+ <a u="67E5" b="B2 E9"/>
+ <a u="67E6" b="96 BD"/>
+ <a u="67E7" b="96 BE"/>
+ <a u="67E8" b="96 BF"/>
+ <a u="67E9" b="E8 D1"/>
+ <a u="67EA" b="96 C0"/>
+ <a u="67EB" b="96 C1"/>
+ <a u="67EC" b="BC ED"/>
+ <a u="67ED" b="96 C2"/>
+ <a u="67EE" b="96 C3"/>
+ <a u="67EF" b="BF C2"/>
+ <a u="67F0" b="E8 CD"/>
+ <a u="67F1" b="D6 F9"/>
+ <a u="67F2" b="96 C4"/>
+ <a u="67F3" b="C1 F8"/>
+ <a u="67F4" b="B2 F1"/>
+ <a u="67F5" b="96 C5"/>
+ <a u="67F6" b="96 C6"/>
+ <a u="67F7" b="96 C7"/>
+ <a u="67F8" b="96 C8"/>
+ <a u="67F9" b="96 C9"/>
+ <a u="67FA" b="96 CA"/>
+ <a u="67FB" b="96 CB"/>
+ <a u="67FC" b="96 CC"/>
+ <a u="67FD" b="E8 DF"/>
+ <a u="67FE" b="96 CD"/>
+ <a u="67FF" b="CA C1"/>
+ <a u="6800" b="E8 D9"/>
+ <a u="6801" b="96 CE"/>
+ <a u="6802" b="96 CF"/>
+ <a u="6803" b="96 D0"/>
+ <a u="6804" b="96 D1"/>
+ <a u="6805" b="D5 A4"/>
+ <a u="6806" b="96 D2"/>
+ <a u="6807" b="B1 EA"/>
+ <a u="6808" b="D5 BB"/>
+ <a u="6809" b="E8 CE"/>
+ <a u="680A" b="E8 D0"/>
+ <a u="680B" b="B6 B0"/>
+ <a u="680C" b="E8 D3"/>
+ <a u="680D" b="96 D3"/>
+ <a u="680E" b="E8 DD"/>
+ <a u="680F" b="C0 B8"/>
+ <a u="6810" b="96 D4"/>
+ <a u="6811" b="CA F7"/>
+ <a u="6812" b="96 D5"/>
+ <a u="6813" b="CB A8"/>
+ <a u="6814" b="96 D6"/>
+ <a u="6815" b="96 D7"/>
+ <a u="6816" b="C6 DC"/>
+ <a u="6817" b="C0 F5"/>
+ <a u="6818" b="96 D8"/>
+ <a u="6819" b="96 D9"/>
+ <a u="681A" b="96 DA"/>
+ <a u="681B" b="96 DB"/>
+ <a u="681C" b="96 DC"/>
+ <a u="681D" b="E8 E9"/>
+ <a u="681E" b="96 DD"/>
+ <a u="681F" b="96 DE"/>
+ <a u="6820" b="96 DF"/>
+ <a u="6821" b="D0 A3"/>
+ <a u="6822" b="96 E0"/>
+ <a u="6823" b="96 E1"/>
+ <a u="6824" b="96 E2"/>
+ <a u="6825" b="96 E3"/>
+ <a u="6826" b="96 E4"/>
+ <a u="6827" b="96 E5"/>
+ <a u="6828" b="96 E6"/>
+ <a u="6829" b="E8 F2"/>
+ <a u="682A" b="D6 EA"/>
+ <a u="682B" b="96 E7"/>
+ <a u="682C" b="96 E8"/>
+ <a u="682D" b="96 E9"/>
+ <a u="682E" b="96 EA"/>
+ <a u="682F" b="96 EB"/>
+ <a u="6830" b="96 EC"/>
+ <a u="6831" b="96 ED"/>
+ <a u="6832" b="E8 E0"/>
+ <a u="6833" b="E8 E1"/>
+ <a u="6834" b="96 EE"/>
+ <a u="6835" b="96 EF"/>
+ <a u="6836" b="96 F0"/>
+ <a u="6837" b="D1 F9"/>
+ <a u="6838" b="BA CB"/>
+ <a u="6839" b="B8 F9"/>
+ <a u="683A" b="96 F1"/>
+ <a u="683B" b="96 F2"/>
+ <a u="683C" b="B8 F1"/>
+ <a u="683D" b="D4 D4"/>
+ <a u="683E" b="E8 EF"/>
+ <a u="683F" b="96 F3"/>
+ <a u="6840" b="E8 EE"/>
+ <a u="6841" b="E8 EC"/>
+ <a u="6842" b="B9 F0"/>
+ <a u="6843" b="CC D2"/>
+ <a u="6844" b="E8 E6"/>
+ <a u="6845" b="CE A6"/>
+ <a u="6846" b="BF F2"/>
+ <a u="6847" b="96 F4"/>
+ <a u="6848" b="B0 B8"/>
+ <a u="6849" b="E8 F1"/>
+ <a u="684A" b="E8 F0"/>
+ <a u="684B" b="96 F5"/>
+ <a u="684C" b="D7 C0"/>
+ <a u="684D" b="96 F6"/>
+ <a u="684E" b="E8 E4"/>
+ <a u="684F" b="96 F7"/>
+ <a u="6850" b="CD A9"/>
+ <a u="6851" b="C9 A3"/>
+ <a u="6852" b="96 F8"/>
+ <a u="6853" b="BB B8"/>
+ <a u="6854" b="BD DB"/>
+ <a u="6855" b="E8 EA"/>
+ <a u="6856" b="96 F9"/>
+ <a u="6857" b="96 FA"/>
+ <a u="6858" b="96 FB"/>
+ <a u="6859" b="96 FC"/>
+ <a u="685A" b="96 FD"/>
+ <a u="685B" b="96 FE"/>
+ <a u="685C" b="97 40"/>
+ <a u="685D" b="97 41"/>
+ <a u="685E" b="97 42"/>
+ <a u="685F" b="97 43"/>
+ <a u="6860" b="E8 E2"/>
+ <a u="6861" b="E8 E3"/>
+ <a u="6862" b="E8 E5"/>
+ <a u="6863" b="B5 B5"/>
+ <a u="6864" b="E8 E7"/>
+ <a u="6865" b="C7 C5"/>
+ <a u="6866" b="E8 EB"/>
+ <a u="6867" b="E8 ED"/>
+ <a u="6868" b="BD B0"/>
+ <a u="6869" b="D7 AE"/>
+ <a u="686A" b="97 44"/>
+ <a u="686B" b="E8 F8"/>
+ <a u="686C" b="97 45"/>
+ <a u="686D" b="97 46"/>
+ <a u="686E" b="97 47"/>
+ <a u="686F" b="97 48"/>
+ <a u="6870" b="97 49"/>
+ <a u="6871" b="97 4A"/>
+ <a u="6872" b="97 4B"/>
+ <a u="6873" b="97 4C"/>
+ <a u="6874" b="E8 F5"/>
+ <a u="6875" b="97 4D"/>
+ <a u="6876" b="CD B0"/>
+ <a u="6877" b="E8 F6"/>
+ <a u="6878" b="97 4E"/>
+ <a u="6879" b="97 4F"/>
+ <a u="687A" b="97 50"/>
+ <a u="687B" b="97 51"/>
+ <a u="687C" b="97 52"/>
+ <a u="687D" b="97 53"/>
+ <a u="687E" b="97 54"/>
+ <a u="687F" b="97 55"/>
+ <a u="6880" b="97 56"/>
+ <a u="6881" b="C1 BA"/>
+ <a u="6882" b="97 57"/>
+ <a u="6883" b="E8 E8"/>
+ <a u="6884" b="97 58"/>
+ <a u="6885" b="C3 B7"/>
+ <a u="6886" b="B0 F0"/>
+ <a u="6887" b="97 59"/>
+ <a u="6888" b="97 5A"/>
+ <a u="6889" b="97 5B"/>
+ <a u="688A" b="97 5C"/>
+ <a u="688B" b="97 5D"/>
+ <a u="688C" b="97 5E"/>
+ <a u="688D" b="97 5F"/>
+ <a u="688E" b="97 60"/>
+ <a u="688F" b="E8 F4"/>
+ <a u="6890" b="97 61"/>
+ <a u="6891" b="97 62"/>
+ <a u="6892" b="97 63"/>
+ <a u="6893" b="E8 F7"/>
+ <a u="6894" b="97 64"/>
+ <a u="6895" b="97 65"/>
+ <a u="6896" b="97 66"/>
+ <a u="6897" b="B9 A3"/>
+ <a u="6898" b="97 67"/>
+ <a u="6899" b="97 68"/>
+ <a u="689A" b="97 69"/>
+ <a u="689B" b="97 6A"/>
+ <a u="689C" b="97 6B"/>
+ <a u="689D" b="97 6C"/>
+ <a u="689E" b="97 6D"/>
+ <a u="689F" b="97 6E"/>
+ <a u="68A0" b="97 6F"/>
+ <a u="68A1" b="97 70"/>
+ <a u="68A2" b="C9 D2"/>
+ <a u="68A3" b="97 71"/>
+ <a u="68A4" b="97 72"/>
+ <a u="68A5" b="97 73"/>
+ <a u="68A6" b="C3 CE"/>
+ <a u="68A7" b="CE E0"/>
+ <a u="68A8" b="C0 E6"/>
+ <a u="68A9" b="97 74"/>
+ <a u="68AA" b="97 75"/>
+ <a u="68AB" b="97 76"/>
+ <a u="68AC" b="97 77"/>
+ <a u="68AD" b="CB F3"/>
+ <a u="68AE" b="97 78"/>
+ <a u="68AF" b="CC DD"/>
+ <a u="68B0" b="D0 B5"/>
+ <a u="68B1" b="97 79"/>
+ <a u="68B2" b="97 7A"/>
+ <a u="68B3" b="CA E1"/>
+ <a u="68B4" b="97 7B"/>
+ <a u="68B5" b="E8 F3"/>
+ <a u="68B6" b="97 7C"/>
+ <a u="68B7" b="97 7D"/>
+ <a u="68B8" b="97 7E"/>
+ <a u="68B9" b="97 80"/>
+ <a u="68BA" b="97 81"/>
+ <a u="68BB" b="97 82"/>
+ <a u="68BC" b="97 83"/>
+ <a u="68BD" b="97 84"/>
+ <a u="68BE" b="97 85"/>
+ <a u="68BF" b="97 86"/>
+ <a u="68C0" b="BC EC"/>
+ <a u="68C1" b="97 87"/>
+ <a u="68C2" b="E8 F9"/>
+ <a u="68C3" b="97 88"/>
+ <a u="68C4" b="97 89"/>
+ <a u="68C5" b="97 8A"/>
+ <a u="68C6" b="97 8B"/>
+ <a u="68C7" b="97 8C"/>
+ <a u="68C8" b="97 8D"/>
+ <a u="68C9" b="C3 DE"/>
+ <a u="68CA" b="97 8E"/>
+ <a u="68CB" b="C6 E5"/>
+ <a u="68CC" b="97 8F"/>
+ <a u="68CD" b="B9 F7"/>
+ <a u="68CE" b="97 90"/>
+ <a u="68CF" b="97 91"/>
+ <a u="68D0" b="97 92"/>
+ <a u="68D1" b="97 93"/>
+ <a u="68D2" b="B0 F4"/>
+ <a u="68D3" b="97 94"/>
+ <a u="68D4" b="97 95"/>
+ <a u="68D5" b="D7 D8"/>
+ <a u="68D6" b="97 96"/>
+ <a u="68D7" b="97 97"/>
+ <a u="68D8" b="BC AC"/>
+ <a u="68D9" b="97 98"/>
+ <a u="68DA" b="C5 EF"/>
+ <a u="68DB" b="97 99"/>
+ <a u="68DC" b="97 9A"/>
+ <a u="68DD" b="97 9B"/>
+ <a u="68DE" b="97 9C"/>
+ <a u="68DF" b="97 9D"/>
+ <a u="68E0" b="CC C4"/>
+ <a u="68E1" b="97 9E"/>
+ <a u="68E2" b="97 9F"/>
+ <a u="68E3" b="E9 A6"/>
+ <a u="68E4" b="97 A0"/>
+ <a u="68E5" b="97 A1"/>
+ <a u="68E6" b="97 A2"/>
+ <a u="68E7" b="97 A3"/>
+ <a u="68E8" b="97 A4"/>
+ <a u="68E9" b="97 A5"/>
+ <a u="68EA" b="97 A6"/>
+ <a u="68EB" b="97 A7"/>
+ <a u="68EC" b="97 A8"/>
+ <a u="68ED" b="97 A9"/>
+ <a u="68EE" b="C9 AD"/>
+ <a u="68EF" b="97 AA"/>
+ <a u="68F0" b="E9 A2"/>
+ <a u="68F1" b="C0 E2"/>
+ <a u="68F2" b="97 AB"/>
+ <a u="68F3" b="97 AC"/>
+ <a u="68F4" b="97 AD"/>
+ <a u="68F5" b="BF C3"/>
+ <a u="68F6" b="97 AE"/>
+ <a u="68F7" b="97 AF"/>
+ <a u="68F8" b="97 B0"/>
+ <a u="68F9" b="E8 FE"/>
+ <a u="68FA" b="B9 D7"/>
+ <a u="68FB" b="97 B1"/>
+ <a u="68FC" b="E8 FB"/>
+ <a u="68FD" b="97 B2"/>
+ <a u="68FE" b="97 B3"/>
+ <a u="68FF" b="97 B4"/>
+ <a u="6900" b="97 B5"/>
+ <a u="6901" b="E9 A4"/>
+ <a u="6902" b="97 B6"/>
+ <a u="6903" b="97 B7"/>
+ <a u="6904" b="97 B8"/>
+ <a u="6905" b="D2 CE"/>
+ <a u="6906" b="97 B9"/>
+ <a u="6907" b="97 BA"/>
+ <a u="6908" b="97 BB"/>
+ <a u="6909" b="97 BC"/>
+ <a u="690A" b="97 BD"/>
+ <a u="690B" b="E9 A3"/>
+ <a u="690C" b="97 BE"/>
+ <a u="690D" b="D6 B2"/>
+ <a u="690E" b="D7 B5"/>
+ <a u="690F" b="97 BF"/>
+ <a u="6910" b="E9 A7"/>
+ <a u="6911" b="97 C0"/>
+ <a u="6912" b="BD B7"/>
+ <a u="6913" b="97 C1"/>
+ <a u="6914" b="97 C2"/>
+ <a u="6915" b="97 C3"/>
+ <a u="6916" b="97 C4"/>
+ <a u="6917" b="97 C5"/>
+ <a u="6918" b="97 C6"/>
+ <a u="6919" b="97 C7"/>
+ <a u="691A" b="97 C8"/>
+ <a u="691B" b="97 C9"/>
+ <a u="691C" b="97 CA"/>
+ <a u="691D" b="97 CB"/>
+ <a u="691E" b="97 CC"/>
+ <a u="691F" b="E8 FC"/>
+ <a u="6920" b="E8 FD"/>
+ <a u="6921" b="97 CD"/>
+ <a u="6922" b="97 CE"/>
+ <a u="6923" b="97 CF"/>
+ <a u="6924" b="E9 A1"/>
+ <a u="6925" b="97 D0"/>
+ <a u="6926" b="97 D1"/>
+ <a u="6927" b="97 D2"/>
+ <a u="6928" b="97 D3"/>
+ <a u="6929" b="97 D4"/>
+ <a u="692A" b="97 D5"/>
+ <a u="692B" b="97 D6"/>
+ <a u="692C" b="97 D7"/>
+ <a u="692D" b="CD D6"/>
+ <a u="692E" b="97 D8"/>
+ <a u="692F" b="97 D9"/>
+ <a u="6930" b="D2 AC"/>
+ <a u="6931" b="97 DA"/>
+ <a u="6932" b="97 DB"/>
+ <a u="6933" b="97 DC"/>
+ <a u="6934" b="E9 B2"/>
+ <a u="6935" b="97 DD"/>
+ <a u="6936" b="97 DE"/>
+ <a u="6937" b="97 DF"/>
+ <a u="6938" b="97 E0"/>
+ <a u="6939" b="E9 A9"/>
+ <a u="693A" b="97 E1"/>
+ <a u="693B" b="97 E2"/>
+ <a u="693C" b="97 E3"/>
+ <a u="693D" b="B4 AA"/>
+ <a u="693E" b="97 E4"/>
+ <a u="693F" b="B4 BB"/>
+ <a u="6940" b="97 E5"/>
+ <a u="6941" b="97 E6"/>
+ <a u="6942" b="E9 AB"/>
+ <a u="6943" b="97 E7"/>
+ <a u="6944" b="97 E8"/>
+ <a u="6945" b="97 E9"/>
+ <a u="6946" b="97 EA"/>
+ <a u="6947" b="97 EB"/>
+ <a u="6948" b="97 EC"/>
+ <a u="6949" b="97 ED"/>
+ <a u="694A" b="97 EE"/>
+ <a u="694B" b="97 EF"/>
+ <a u="694C" b="97 F0"/>
+ <a u="694D" b="97 F1"/>
+ <a u="694E" b="97 F2"/>
+ <a u="694F" b="97 F3"/>
+ <a u="6950" b="97 F4"/>
+ <a u="6951" b="97 F5"/>
+ <a u="6952" b="97 F6"/>
+ <a u="6953" b="97 F7"/>
+ <a u="6954" b="D0 A8"/>
+ <a u="6955" b="97 F8"/>
+ <a u="6956" b="97 F9"/>
+ <a u="6957" b="E9 A5"/>
+ <a u="6958" b="97 FA"/>
+ <a u="6959" b="97 FB"/>
+ <a u="695A" b="B3 FE"/>
+ <a u="695B" b="97 FC"/>
+ <a u="695C" b="97 FD"/>
+ <a u="695D" b="E9 AC"/>
+ <a u="695E" b="C0 E3"/>
+ <a u="695F" b="97 FE"/>
+ <a u="6960" b="E9 AA"/>
+ <a u="6961" b="98 40"/>
+ <a u="6962" b="98 41"/>
+ <a u="6963" b="E9 B9"/>
+ <a u="6964" b="98 42"/>
+ <a u="6965" b="98 43"/>
+ <a u="6966" b="E9 B8"/>
+ <a u="6967" b="98 44"/>
+ <a u="6968" b="98 45"/>
+ <a u="6969" b="98 46"/>
+ <a u="696A" b="98 47"/>
+ <a u="696B" b="E9 AE"/>
+ <a u="696C" b="98 48"/>
+ <a u="696D" b="98 49"/>
+ <a u="696E" b="E8 FA"/>
+ <a u="696F" b="98 4A"/>
+ <a u="6970" b="98 4B"/>
+ <a u="6971" b="E9 A8"/>
+ <a u="6972" b="98 4C"/>
+ <a u="6973" b="98 4D"/>
+ <a u="6974" b="98 4E"/>
+ <a u="6975" b="98 4F"/>
+ <a u="6976" b="98 50"/>
+ <a u="6977" b="BF AC"/>
+ <a u="6978" b="E9 B1"/>
+ <a u="6979" b="E9 BA"/>
+ <a u="697A" b="98 51"/>
+ <a u="697B" b="98 52"/>
+ <a u="697C" b="C2 A5"/>
+ <a u="697D" b="98 53"/>
+ <a u="697E" b="98 54"/>
+ <a u="697F" b="98 55"/>
+ <a u="6980" b="E9 AF"/>
+ <a u="6981" b="98 56"/>
+ <a u="6982" b="B8 C5"/>
+ <a u="6983" b="98 57"/>
+ <a u="6984" b="E9 AD"/>
+ <a u="6985" b="98 58"/>
+ <a u="6986" b="D3 DC"/>
+ <a u="6987" b="E9 B4"/>
+ <a u="6988" b="E9 B5"/>
+ <a u="6989" b="E9 B7"/>
+ <a u="698A" b="98 59"/>
+ <a u="698B" b="98 5A"/>
+ <a u="698C" b="98 5B"/>
+ <a u="698D" b="E9 C7"/>
+ <a u="698E" b="98 5C"/>
+ <a u="698F" b="98 5D"/>
+ <a u="6990" b="98 5E"/>
+ <a u="6991" b="98 5F"/>
+ <a u="6992" b="98 60"/>
+ <a u="6993" b="98 61"/>
+ <a u="6994" b="C0 C6"/>
+ <a u="6995" b="E9 C5"/>
+ <a u="6996" b="98 62"/>
+ <a u="6997" b="98 63"/>
+ <a u="6998" b="E9 B0"/>
+ <a u="6999" b="98 64"/>
+ <a u="699A" b="98 65"/>
+ <a u="699B" b="E9 BB"/>
+ <a u="699C" b="B0 F1"/>
+ <a u="699D" b="98 66"/>
+ <a u="699E" b="98 67"/>
+ <a u="699F" b="98 68"/>
+ <a u="69A0" b="98 69"/>
+ <a u="69A1" b="98 6A"/>
+ <a u="69A2" b="98 6B"/>
+ <a u="69A3" b="98 6C"/>
+ <a u="69A4" b="98 6D"/>
+ <a u="69A5" b="98 6E"/>
+ <a u="69A6" b="98 6F"/>
+ <a u="69A7" b="E9 BC"/>
+ <a u="69A8" b="D5 A5"/>
+ <a u="69A9" b="98 70"/>
+ <a u="69AA" b="98 71"/>
+ <a u="69AB" b="E9 BE"/>
+ <a u="69AC" b="98 72"/>
+ <a u="69AD" b="E9 BF"/>
+ <a u="69AE" b="98 73"/>
+ <a u="69AF" b="98 74"/>
+ <a u="69B0" b="98 75"/>
+ <a u="69B1" b="E9 C1"/>
+ <a u="69B2" b="98 76"/>
+ <a u="69B3" b="98 77"/>
+ <a u="69B4" b="C1 F1"/>
+ <a u="69B5" b="98 78"/>
+ <a u="69B6" b="98 79"/>
+ <a u="69B7" b="C8 B6"/>
+ <a u="69B8" b="98 7A"/>
+ <a u="69B9" b="98 7B"/>
+ <a u="69BA" b="98 7C"/>
+ <a u="69BB" b="E9 BD"/>
+ <a u="69BC" b="98 7D"/>
+ <a u="69BD" b="98 7E"/>
+ <a u="69BE" b="98 80"/>
+ <a u="69BF" b="98 81"/>
+ <a u="69C0" b="98 82"/>
+ <a u="69C1" b="E9 C2"/>
+ <a u="69C2" b="98 83"/>
+ <a u="69C3" b="98 84"/>
+ <a u="69C4" b="98 85"/>
+ <a u="69C5" b="98 86"/>
+ <a u="69C6" b="98 87"/>
+ <a u="69C7" b="98 88"/>
+ <a u="69C8" b="98 89"/>
+ <a u="69C9" b="98 8A"/>
+ <a u="69CA" b="E9 C3"/>
+ <a u="69CB" b="98 8B"/>
+ <a u="69CC" b="E9 B3"/>
+ <a u="69CD" b="98 8C"/>
+ <a u="69CE" b="E9 B6"/>
+ <a u="69CF" b="98 8D"/>
+ <a u="69D0" b="BB B1"/>
+ <a u="69D1" b="98 8E"/>
+ <a u="69D2" b="98 8F"/>
+ <a u="69D3" b="98 90"/>
+ <a u="69D4" b="E9 C0"/>
+ <a u="69D5" b="98 91"/>
+ <a u="69D6" b="98 92"/>
+ <a u="69D7" b="98 93"/>
+ <a u="69D8" b="98 94"/>
+ <a u="69D9" b="98 95"/>
+ <a u="69DA" b="98 96"/>
+ <a u="69DB" b="BC F7"/>
+ <a u="69DC" b="98 97"/>
+ <a u="69DD" b="98 98"/>
+ <a u="69DE" b="98 99"/>
+ <a u="69DF" b="E9 C4"/>
+ <a u="69E0" b="E9 C6"/>
+ <a u="69E1" b="98 9A"/>
+ <a u="69E2" b="98 9B"/>
+ <a u="69E3" b="98 9C"/>
+ <a u="69E4" b="98 9D"/>
+ <a u="69E5" b="98 9E"/>
+ <a u="69E6" b="98 9F"/>
+ <a u="69E7" b="98 A0"/>
+ <a u="69E8" b="98 A1"/>
+ <a u="69E9" b="98 A2"/>
+ <a u="69EA" b="98 A3"/>
+ <a u="69EB" b="98 A4"/>
+ <a u="69EC" b="98 A5"/>
+ <a u="69ED" b="E9 CA"/>
+ <a u="69EE" b="98 A6"/>
+ <a u="69EF" b="98 A7"/>
+ <a u="69F0" b="98 A8"/>
+ <a u="69F1" b="98 A9"/>
+ <a u="69F2" b="E9 CE"/>
+ <a u="69F3" b="98 AA"/>
+ <a u="69F4" b="98 AB"/>
+ <a u="69F5" b="98 AC"/>
+ <a u="69F6" b="98 AD"/>
+ <a u="69F7" b="98 AE"/>
+ <a u="69F8" b="98 AF"/>
+ <a u="69F9" b="98 B0"/>
+ <a u="69FA" b="98 B1"/>
+ <a u="69FB" b="98 B2"/>
+ <a u="69FC" b="98 B3"/>
+ <a u="69FD" b="B2 DB"/>
+ <a u="69FE" b="98 B4"/>
+ <a u="69FF" b="E9 C8"/>
+ <a u="6A00" b="98 B5"/>
+ <a u="6A01" b="98 B6"/>
+ <a u="6A02" b="98 B7"/>
+ <a u="6A03" b="98 B8"/>
+ <a u="6A04" b="98 B9"/>
+ <a u="6A05" b="98 BA"/>
+ <a u="6A06" b="98 BB"/>
+ <a u="6A07" b="98 BC"/>
+ <a u="6A08" b="98 BD"/>
+ <a u="6A09" b="98 BE"/>
+ <a u="6A0A" b="B7 AE"/>
+ <a u="6A0B" b="98 BF"/>
+ <a u="6A0C" b="98 C0"/>
+ <a u="6A0D" b="98 C1"/>
+ <a u="6A0E" b="98 C2"/>
+ <a u="6A0F" b="98 C3"/>
+ <a u="6A10" b="98 C4"/>
+ <a u="6A11" b="98 C5"/>
+ <a u="6A12" b="98 C6"/>
+ <a u="6A13" b="98 C7"/>
+ <a u="6A14" b="98 C8"/>
+ <a u="6A15" b="98 C9"/>
+ <a u="6A16" b="98 CA"/>
+ <a u="6A17" b="E9 CB"/>
+ <a u="6A18" b="E9 CC"/>
+ <a u="6A19" b="98 CB"/>
+ <a u="6A1A" b="98 CC"/>
+ <a u="6A1B" b="98 CD"/>
+ <a u="6A1C" b="98 CE"/>
+ <a u="6A1D" b="98 CF"/>
+ <a u="6A1E" b="98 D0"/>
+ <a u="6A1F" b="D5 C1"/>
+ <a u="6A20" b="98 D1"/>
+ <a u="6A21" b="C4 A3"/>
+ <a u="6A22" b="98 D2"/>
+ <a u="6A23" b="98 D3"/>
+ <a u="6A24" b="98 D4"/>
+ <a u="6A25" b="98 D5"/>
+ <a u="6A26" b="98 D6"/>
+ <a u="6A27" b="98 D7"/>
+ <a u="6A28" b="E9 D8"/>
+ <a u="6A29" b="98 D8"/>
+ <a u="6A2A" b="BA E1"/>
+ <a u="6A2B" b="98 D9"/>
+ <a u="6A2C" b="98 DA"/>
+ <a u="6A2D" b="98 DB"/>
+ <a u="6A2E" b="98 DC"/>
+ <a u="6A2F" b="E9 C9"/>
+ <a u="6A30" b="98 DD"/>
+ <a u="6A31" b="D3 A3"/>
+ <a u="6A32" b="98 DE"/>
+ <a u="6A33" b="98 DF"/>
+ <a u="6A34" b="98 E0"/>
+ <a u="6A35" b="E9 D4"/>
+ <a u="6A36" b="98 E1"/>
+ <a u="6A37" b="98 E2"/>
+ <a u="6A38" b="98 E3"/>
+ <a u="6A39" b="98 E4"/>
+ <a u="6A3A" b="98 E5"/>
+ <a u="6A3B" b="98 E6"/>
+ <a u="6A3C" b="98 E7"/>
+ <a u="6A3D" b="E9 D7"/>
+ <a u="6A3E" b="E9 D0"/>
+ <a u="6A3F" b="98 E8"/>
+ <a u="6A40" b="98 E9"/>
+ <a u="6A41" b="98 EA"/>
+ <a u="6A42" b="98 EB"/>
+ <a u="6A43" b="98 EC"/>
+ <a u="6A44" b="E9 CF"/>
+ <a u="6A45" b="98 ED"/>
+ <a u="6A46" b="98 EE"/>
+ <a u="6A47" b="C7 C1"/>
+ <a u="6A48" b="98 EF"/>
+ <a u="6A49" b="98 F0"/>
+ <a u="6A4A" b="98 F1"/>
+ <a u="6A4B" b="98 F2"/>
+ <a u="6A4C" b="98 F3"/>
+ <a u="6A4D" b="98 F4"/>
+ <a u="6A4E" b="98 F5"/>
+ <a u="6A4F" b="98 F6"/>
+ <a u="6A50" b="E9 D2"/>
+ <a u="6A51" b="98 F7"/>
+ <a u="6A52" b="98 F8"/>
+ <a u="6A53" b="98 F9"/>
+ <a u="6A54" b="98 FA"/>
+ <a u="6A55" b="98 FB"/>
+ <a u="6A56" b="98 FC"/>
+ <a u="6A57" b="98 FD"/>
+ <a u="6A58" b="E9 D9"/>
+ <a u="6A59" b="B3 C8"/>
+ <a u="6A5A" b="98 FE"/>
+ <a u="6A5B" b="E9 D3"/>
+ <a u="6A5C" b="99 40"/>
+ <a u="6A5D" b="99 41"/>
+ <a u="6A5E" b="99 42"/>
+ <a u="6A5F" b="99 43"/>
+ <a u="6A60" b="99 44"/>
+ <a u="6A61" b="CF F0"/>
+ <a u="6A62" b="99 45"/>
+ <a u="6A63" b="99 46"/>
+ <a u="6A64" b="99 47"/>
+ <a u="6A65" b="E9 CD"/>
+ <a u="6A66" b="99 48"/>
+ <a u="6A67" b="99 49"/>
+ <a u="6A68" b="99 4A"/>
+ <a u="6A69" b="99 4B"/>
+ <a u="6A6A" b="99 4C"/>
+ <a u="6A6B" b="99 4D"/>
+ <a u="6A6C" b="99 4E"/>
+ <a u="6A6D" b="99 4F"/>
+ <a u="6A6E" b="99 50"/>
+ <a u="6A6F" b="99 51"/>
+ <a u="6A70" b="99 52"/>
+ <a u="6A71" b="B3 F7"/>
+ <a u="6A72" b="99 53"/>
+ <a u="6A73" b="99 54"/>
+ <a u="6A74" b="99 55"/>
+ <a u="6A75" b="99 56"/>
+ <a u="6A76" b="99 57"/>
+ <a u="6A77" b="99 58"/>
+ <a u="6A78" b="99 59"/>
+ <a u="6A79" b="E9 D6"/>
+ <a u="6A7A" b="99 5A"/>
+ <a u="6A7B" b="99 5B"/>
+ <a u="6A7C" b="E9 DA"/>
+ <a u="6A7D" b="99 5C"/>
+ <a u="6A7E" b="99 5D"/>
+ <a u="6A7F" b="99 5E"/>
+ <a u="6A80" b="CC B4"/>
+ <a u="6A81" b="99 5F"/>
+ <a u="6A82" b="99 60"/>
+ <a u="6A83" b="99 61"/>
+ <a u="6A84" b="CF AD"/>
+ <a u="6A85" b="99 62"/>
+ <a u="6A86" b="99 63"/>
+ <a u="6A87" b="99 64"/>
+ <a u="6A88" b="99 65"/>
+ <a u="6A89" b="99 66"/>
+ <a u="6A8A" b="99 67"/>
+ <a u="6A8B" b="99 68"/>
+ <a u="6A8C" b="99 69"/>
+ <a u="6A8D" b="99 6A"/>
+ <a u="6A8E" b="E9 D5"/>
+ <a u="6A8F" b="99 6B"/>
+ <a u="6A90" b="E9 DC"/>
+ <a u="6A91" b="E9 DB"/>
+ <a u="6A92" b="99 6C"/>
+ <a u="6A93" b="99 6D"/>
+ <a u="6A94" b="99 6E"/>
+ <a u="6A95" b="99 6F"/>
+ <a u="6A96" b="99 70"/>
+ <a u="6A97" b="E9 DE"/>
+ <a u="6A98" b="99 71"/>
+ <a u="6A99" b="99 72"/>
+ <a u="6A9A" b="99 73"/>
+ <a u="6A9B" b="99 74"/>
+ <a u="6A9C" b="99 75"/>
+ <a u="6A9D" b="99 76"/>
+ <a u="6A9E" b="99 77"/>
+ <a u="6A9F" b="99 78"/>
+ <a u="6AA0" b="E9 D1"/>
+ <a u="6AA1" b="99 79"/>
+ <a u="6AA2" b="99 7A"/>
+ <a u="6AA3" b="99 7B"/>
+ <a u="6AA4" b="99 7C"/>
+ <a u="6AA5" b="99 7D"/>
+ <a u="6AA6" b="99 7E"/>
+ <a u="6AA7" b="99 80"/>
+ <a u="6AA8" b="99 81"/>
+ <a u="6AA9" b="E9 DD"/>
+ <a u="6AAA" b="99 82"/>
+ <a u="6AAB" b="E9 DF"/>
+ <a u="6AAC" b="C3 CA"/>
+ <a u="6AAD" b="99 83"/>
+ <a u="6AAE" b="99 84"/>
+ <a u="6AAF" b="99 85"/>
+ <a u="6AB0" b="99 86"/>
+ <a u="6AB1" b="99 87"/>
+ <a u="6AB2" b="99 88"/>
+ <a u="6AB3" b="99 89"/>
+ <a u="6AB4" b="99 8A"/>
+ <a u="6AB5" b="99 8B"/>
+ <a u="6AB6" b="99 8C"/>
+ <a u="6AB7" b="99 8D"/>
+ <a u="6AB8" b="99 8E"/>
+ <a u="6AB9" b="99 8F"/>
+ <a u="6ABA" b="99 90"/>
+ <a u="6ABB" b="99 91"/>
+ <a u="6ABC" b="99 92"/>
+ <a u="6ABD" b="99 93"/>
+ <a u="6ABE" b="99 94"/>
+ <a u="6ABF" b="99 95"/>
+ <a u="6AC0" b="99 96"/>
+ <a u="6AC1" b="99 97"/>
+ <a u="6AC2" b="99 98"/>
+ <a u="6AC3" b="99 99"/>
+ <a u="6AC4" b="99 9A"/>
+ <a u="6AC5" b="99 9B"/>
+ <a u="6AC6" b="99 9C"/>
+ <a u="6AC7" b="99 9D"/>
+ <a u="6AC8" b="99 9E"/>
+ <a u="6AC9" b="99 9F"/>
+ <a u="6ACA" b="99 A0"/>
+ <a u="6ACB" b="99 A1"/>
+ <a u="6ACC" b="99 A2"/>
+ <a u="6ACD" b="99 A3"/>
+ <a u="6ACE" b="99 A4"/>
+ <a u="6ACF" b="99 A5"/>
+ <a u="6AD0" b="99 A6"/>
+ <a u="6AD1" b="99 A7"/>
+ <a u="6AD2" b="99 A8"/>
+ <a u="6AD3" b="99 A9"/>
+ <a u="6AD4" b="99 AA"/>
+ <a u="6AD5" b="99 AB"/>
+ <a u="6AD6" b="99 AC"/>
+ <a u="6AD7" b="99 AD"/>
+ <a u="6AD8" b="99 AE"/>
+ <a u="6AD9" b="99 AF"/>
+ <a u="6ADA" b="99 B0"/>
+ <a u="6ADB" b="99 B1"/>
+ <a u="6ADC" b="99 B2"/>
+ <a u="6ADD" b="99 B3"/>
+ <a u="6ADE" b="99 B4"/>
+ <a u="6ADF" b="99 B5"/>
+ <a u="6AE0" b="99 B6"/>
+ <a u="6AE1" b="99 B7"/>
+ <a u="6AE2" b="99 B8"/>
+ <a u="6AE3" b="99 B9"/>
+ <a u="6AE4" b="99 BA"/>
+ <a u="6AE5" b="99 BB"/>
+ <a u="6AE6" b="99 BC"/>
+ <a u="6AE7" b="99 BD"/>
+ <a u="6AE8" b="99 BE"/>
+ <a u="6AE9" b="99 BF"/>
+ <a u="6AEA" b="99 C0"/>
+ <a u="6AEB" b="99 C1"/>
+ <a u="6AEC" b="99 C2"/>
+ <a u="6AED" b="99 C3"/>
+ <a u="6AEE" b="99 C4"/>
+ <a u="6AEF" b="99 C5"/>
+ <a u="6AF0" b="99 C6"/>
+ <a u="6AF1" b="99 C7"/>
+ <a u="6AF2" b="99 C8"/>
+ <a u="6AF3" b="99 C9"/>
+ <a u="6AF4" b="99 CA"/>
+ <a u="6AF5" b="99 CB"/>
+ <a u="6AF6" b="99 CC"/>
+ <a u="6AF7" b="99 CD"/>
+ <a u="6AF8" b="99 CE"/>
+ <a u="6AF9" b="99 CF"/>
+ <a u="6AFA" b="99 D0"/>
+ <a u="6AFB" b="99 D1"/>
+ <a u="6AFC" b="99 D2"/>
+ <a u="6AFD" b="99 D3"/>
+ <a u="6AFE" b="99 D4"/>
+ <a u="6AFF" b="99 D5"/>
+ <a u="6B00" b="99 D6"/>
+ <a u="6B01" b="99 D7"/>
+ <a u="6B02" b="99 D8"/>
+ <a u="6B03" b="99 D9"/>
+ <a u="6B04" b="99 DA"/>
+ <a u="6B05" b="99 DB"/>
+ <a u="6B06" b="99 DC"/>
+ <a u="6B07" b="99 DD"/>
+ <a u="6B08" b="99 DE"/>
+ <a u="6B09" b="99 DF"/>
+ <a u="6B0A" b="99 E0"/>
+ <a u="6B0B" b="99 E1"/>
+ <a u="6B0C" b="99 E2"/>
+ <a u="6B0D" b="99 E3"/>
+ <a u="6B0E" b="99 E4"/>
+ <a u="6B0F" b="99 E5"/>
+ <a u="6B10" b="99 E6"/>
+ <a u="6B11" b="99 E7"/>
+ <a u="6B12" b="99 E8"/>
+ <a u="6B13" b="99 E9"/>
+ <a u="6B14" b="99 EA"/>
+ <a u="6B15" b="99 EB"/>
+ <a u="6B16" b="99 EC"/>
+ <a u="6B17" b="99 ED"/>
+ <a u="6B18" b="99 EE"/>
+ <a u="6B19" b="99 EF"/>
+ <a u="6B1A" b="99 F0"/>
+ <a u="6B1B" b="99 F1"/>
+ <a u="6B1C" b="99 F2"/>
+ <a u="6B1D" b="99 F3"/>
+ <a u="6B1E" b="99 F4"/>
+ <a u="6B1F" b="99 F5"/>
+ <a u="6B20" b="C7 B7"/>
+ <a u="6B21" b="B4 CE"/>
+ <a u="6B22" b="BB B6"/>
+ <a u="6B23" b="D0 C0"/>
+ <a u="6B24" b="EC A3"/>
+ <a u="6B25" b="99 F6"/>
+ <a u="6B26" b="99 F7"/>
+ <a u="6B27" b="C5 B7"/>
+ <a u="6B28" b="99 F8"/>
+ <a u="6B29" b="99 F9"/>
+ <a u="6B2A" b="99 FA"/>
+ <a u="6B2B" b="99 FB"/>
+ <a u="6B2C" b="99 FC"/>
+ <a u="6B2D" b="99 FD"/>
+ <a u="6B2E" b="99 FE"/>
+ <a u="6B2F" b="9A 40"/>
+ <a u="6B30" b="9A 41"/>
+ <a u="6B31" b="9A 42"/>
+ <a u="6B32" b="D3 FB"/>
+ <a u="6B33" b="9A 43"/>
+ <a u="6B34" b="9A 44"/>
+ <a u="6B35" b="9A 45"/>
+ <a u="6B36" b="9A 46"/>
+ <a u="6B37" b="EC A4"/>
+ <a u="6B38" b="9A 47"/>
+ <a u="6B39" b="EC A5"/>
+ <a u="6B3A" b="C6 DB"/>
+ <a u="6B3B" b="9A 48"/>
+ <a u="6B3C" b="9A 49"/>
+ <a u="6B3D" b="9A 4A"/>
+ <a u="6B3E" b="BF EE"/>
+ <a u="6B3F" b="9A 4B"/>
+ <a u="6B40" b="9A 4C"/>
+ <a u="6B41" b="9A 4D"/>
+ <a u="6B42" b="9A 4E"/>
+ <a u="6B43" b="EC A6"/>
+ <a u="6B44" b="9A 4F"/>
+ <a u="6B45" b="9A 50"/>
+ <a u="6B46" b="EC A7"/>
+ <a u="6B47" b="D0 AA"/>
+ <a u="6B48" b="9A 51"/>
+ <a u="6B49" b="C7 B8"/>
+ <a u="6B4A" b="9A 52"/>
+ <a u="6B4B" b="9A 53"/>
+ <a u="6B4C" b="B8 E8"/>
+ <a u="6B4D" b="9A 54"/>
+ <a u="6B4E" b="9A 55"/>
+ <a u="6B4F" b="9A 56"/>
+ <a u="6B50" b="9A 57"/>
+ <a u="6B51" b="9A 58"/>
+ <a u="6B52" b="9A 59"/>
+ <a u="6B53" b="9A 5A"/>
+ <a u="6B54" b="9A 5B"/>
+ <a u="6B55" b="9A 5C"/>
+ <a u="6B56" b="9A 5D"/>
+ <a u="6B57" b="9A 5E"/>
+ <a u="6B58" b="9A 5F"/>
+ <a u="6B59" b="EC A8"/>
+ <a u="6B5A" b="9A 60"/>
+ <a u="6B5B" b="9A 61"/>
+ <a u="6B5C" b="9A 62"/>
+ <a u="6B5D" b="9A 63"/>
+ <a u="6B5E" b="9A 64"/>
+ <a u="6B5F" b="9A 65"/>
+ <a u="6B60" b="9A 66"/>
+ <a u="6B61" b="9A 67"/>
+ <a u="6B62" b="D6 B9"/>
+ <a u="6B63" b="D5 FD"/>
+ <a u="6B64" b="B4 CB"/>
+ <a u="6B65" b="B2 BD"/>
+ <a u="6B66" b="CE E4"/>
+ <a u="6B67" b="C6 E7"/>
+ <a u="6B68" b="9A 68"/>
+ <a u="6B69" b="9A 69"/>
+ <a u="6B6A" b="CD E1"/>
+ <a u="6B6B" b="9A 6A"/>
+ <a u="6B6C" b="9A 6B"/>
+ <a u="6B6D" b="9A 6C"/>
+ <a u="6B6E" b="9A 6D"/>
+ <a u="6B6F" b="9A 6E"/>
+ <a u="6B70" b="9A 6F"/>
+ <a u="6B71" b="9A 70"/>
+ <a u="6B72" b="9A 71"/>
+ <a u="6B73" b="9A 72"/>
+ <a u="6B74" b="9A 73"/>
+ <a u="6B75" b="9A 74"/>
+ <a u="6B76" b="9A 75"/>
+ <a u="6B77" b="9A 76"/>
+ <a u="6B78" b="9A 77"/>
+ <a u="6B79" b="B4 F5"/>
+ <a u="6B7A" b="9A 78"/>
+ <a u="6B7B" b="CB C0"/>
+ <a u="6B7C" b="BC DF"/>
+ <a u="6B7D" b="9A 79"/>
+ <a u="6B7E" b="9A 7A"/>
+ <a u="6B7F" b="9A 7B"/>
+ <a u="6B80" b="9A 7C"/>
+ <a u="6B81" b="E9 E2"/>
+ <a u="6B82" b="E9 E3"/>
+ <a u="6B83" b="D1 EA"/>
+ <a u="6B84" b="E9 E5"/>
+ <a u="6B85" b="9A 7D"/>
+ <a u="6B86" b="B4 F9"/>
+ <a u="6B87" b="E9 E4"/>
+ <a u="6B88" b="9A 7E"/>
+ <a u="6B89" b="D1 B3"/>
+ <a u="6B8A" b="CA E2"/>
+ <a u="6B8B" b="B2 D0"/>
+ <a u="6B8C" b="9A 80"/>
+ <a u="6B8D" b="E9 E8"/>
+ <a u="6B8E" b="9A 81"/>
+ <a u="6B8F" b="9A 82"/>
+ <a u="6B90" b="9A 83"/>
+ <a u="6B91" b="9A 84"/>
+ <a u="6B92" b="E9 E6"/>
+ <a u="6B93" b="E9 E7"/>
+ <a u="6B94" b="9A 85"/>
+ <a u="6B95" b="9A 86"/>
+ <a u="6B96" b="D6 B3"/>
+ <a u="6B97" b="9A 87"/>
+ <a u="6B98" b="9A 88"/>
+ <a u="6B99" b="9A 89"/>
+ <a u="6B9A" b="E9 E9"/>
+ <a u="6B9B" b="E9 EA"/>
+ <a u="6B9C" b="9A 8A"/>
+ <a u="6B9D" b="9A 8B"/>
+ <a u="6B9E" b="9A 8C"/>
+ <a u="6B9F" b="9A 8D"/>
+ <a u="6BA0" b="9A 8E"/>
+ <a u="6BA1" b="E9 EB"/>
+ <a u="6BA2" b="9A 8F"/>
+ <a u="6BA3" b="9A 90"/>
+ <a u="6BA4" b="9A 91"/>
+ <a u="6BA5" b="9A 92"/>
+ <a u="6BA6" b="9A 93"/>
+ <a u="6BA7" b="9A 94"/>
+ <a u="6BA8" b="9A 95"/>
+ <a u="6BA9" b="9A 96"/>
+ <a u="6BAA" b="E9 EC"/>
+ <a u="6BAB" b="9A 97"/>
+ <a u="6BAC" b="9A 98"/>
+ <a u="6BAD" b="9A 99"/>
+ <a u="6BAE" b="9A 9A"/>
+ <a u="6BAF" b="9A 9B"/>
+ <a u="6BB0" b="9A 9C"/>
+ <a u="6BB1" b="9A 9D"/>
+ <a u="6BB2" b="9A 9E"/>
+ <a u="6BB3" b="EC AF"/>
+ <a u="6BB4" b="C5 B9"/>
+ <a u="6BB5" b="B6 CE"/>
+ <a u="6BB6" b="9A 9F"/>
+ <a u="6BB7" b="D2 F3"/>
+ <a u="6BB8" b="9A A0"/>
+ <a u="6BB9" b="9A A1"/>
+ <a u="6BBA" b="9A A2"/>
+ <a u="6BBB" b="9A A3"/>
+ <a u="6BBC" b="9A A4"/>
+ <a u="6BBD" b="9A A5"/>
+ <a u="6BBE" b="9A A6"/>
+ <a u="6BBF" b="B5 EE"/>
+ <a u="6BC0" b="9A A7"/>
+ <a u="6BC1" b="BB D9"/>
+ <a u="6BC2" b="EC B1"/>
+ <a u="6BC3" b="9A A8"/>
+ <a u="6BC4" b="9A A9"/>
+ <a u="6BC5" b="D2 E3"/>
+ <a u="6BC6" b="9A AA"/>
+ <a u="6BC7" b="9A AB"/>
+ <a u="6BC8" b="9A AC"/>
+ <a u="6BC9" b="9A AD"/>
+ <a u="6BCA" b="9A AE"/>
+ <a u="6BCB" b="CE E3"/>
+ <a u="6BCC" b="9A AF"/>
+ <a u="6BCD" b="C4 B8"/>
+ <a u="6BCE" b="9A B0"/>
+ <a u="6BCF" b="C3 BF"/>
+ <a u="6BD0" b="9A B1"/>
+ <a u="6BD1" b="9A B2"/>
+ <a u="6BD2" b="B6 BE"/>
+ <a u="6BD3" b="D8 B9"/>
+ <a u="6BD4" b="B1 C8"/>
+ <a u="6BD5" b="B1 CF"/>
+ <a u="6BD6" b="B1 D1"/>
+ <a u="6BD7" b="C5 FE"/>
+ <a u="6BD8" b="9A B3"/>
+ <a u="6BD9" b="B1 D0"/>
+ <a u="6BDA" b="9A B4"/>
+ <a u="6BDB" b="C3 AB"/>
+ <a u="6BDC" b="9A B5"/>
+ <a u="6BDD" b="9A B6"/>
+ <a u="6BDE" b="9A B7"/>
+ <a u="6BDF" b="9A B8"/>
+ <a u="6BE0" b="9A B9"/>
+ <a u="6BE1" b="D5 B1"/>
+ <a u="6BE2" b="9A BA"/>
+ <a u="6BE3" b="9A BB"/>
+ <a u="6BE4" b="9A BC"/>
+ <a u="6BE5" b="9A BD"/>
+ <a u="6BE6" b="9A BE"/>
+ <a u="6BE7" b="9A BF"/>
+ <a u="6BE8" b="9A C0"/>
+ <a u="6BE9" b="9A C1"/>
+ <a u="6BEA" b="EB A4"/>
+ <a u="6BEB" b="BA C1"/>
+ <a u="6BEC" b="9A C2"/>
+ <a u="6BED" b="9A C3"/>
+ <a u="6BEE" b="9A C4"/>
+ <a u="6BEF" b="CC BA"/>
+ <a u="6BF0" b="9A C5"/>
+ <a u="6BF1" b="9A C6"/>
+ <a u="6BF2" b="9A C7"/>
+ <a u="6BF3" b="EB A5"/>
+ <a u="6BF4" b="9A C8"/>
+ <a u="6BF5" b="EB A7"/>
+ <a u="6BF6" b="9A C9"/>
+ <a u="6BF7" b="9A CA"/>
+ <a u="6BF8" b="9A CB"/>
+ <a u="6BF9" b="EB A8"/>
+ <a u="6BFA" b="9A CC"/>
+ <a u="6BFB" b="9A CD"/>
+ <a u="6BFC" b="9A CE"/>
+ <a u="6BFD" b="EB A6"/>
+ <a u="6BFE" b="9A CF"/>
+ <a u="6BFF" b="9A D0"/>
+ <a u="6C00" b="9A D1"/>
+ <a u="6C01" b="9A D2"/>
+ <a u="6C02" b="9A D3"/>
+ <a u="6C03" b="9A D4"/>
+ <a u="6C04" b="9A D5"/>
+ <a u="6C05" b="EB A9"/>
+ <a u="6C06" b="EB AB"/>
+ <a u="6C07" b="EB AA"/>
+ <a u="6C08" b="9A D6"/>
+ <a u="6C09" b="9A D7"/>
+ <a u="6C0A" b="9A D8"/>
+ <a u="6C0B" b="9A D9"/>
+ <a u="6C0C" b="9A DA"/>
+ <a u="6C0D" b="EB AC"/>
+ <a u="6C0E" b="9A DB"/>
+ <a u="6C0F" b="CA CF"/>
+ <a u="6C10" b="D8 B5"/>
+ <a u="6C11" b="C3 F1"/>
+ <a u="6C12" b="9A DC"/>
+ <a u="6C13" b="C3 A5"/>
+ <a u="6C14" b="C6 F8"/>
+ <a u="6C15" b="EB AD"/>
+ <a u="6C16" b="C4 CA"/>
+ <a u="6C17" b="9A DD"/>
+ <a u="6C18" b="EB AE"/>
+ <a u="6C19" b="EB AF"/>
+ <a u="6C1A" b="EB B0"/>
+ <a u="6C1B" b="B7 D5"/>
+ <a u="6C1C" b="9A DE"/>
+ <a u="6C1D" b="9A DF"/>
+ <a u="6C1E" b="9A E0"/>
+ <a u="6C1F" b="B7 FA"/>
+ <a u="6C20" b="9A E1"/>
+ <a u="6C21" b="EB B1"/>
+ <a u="6C22" b="C7 E2"/>
+ <a u="6C23" b="9A E2"/>
+ <a u="6C24" b="EB B3"/>
+ <a u="6C25" b="9A E3"/>
+ <a u="6C26" b="BA A4"/>
+ <a u="6C27" b="D1 F5"/>
+ <a u="6C28" b="B0 B1"/>
+ <a u="6C29" b="EB B2"/>
+ <a u="6C2A" b="EB B4"/>
+ <a u="6C2B" b="9A E4"/>
+ <a u="6C2C" b="9A E5"/>
+ <a u="6C2D" b="9A E6"/>
+ <a u="6C2E" b="B5 AA"/>
+ <a u="6C2F" b="C2 C8"/>
+ <a u="6C30" b="C7 E8"/>
+ <a u="6C31" b="9A E7"/>
+ <a u="6C32" b="EB B5"/>
+ <a u="6C33" b="9A E8"/>
+ <a u="6C34" b="CB AE"/>
+ <a u="6C35" b="E3 DF"/>
+ <a u="6C36" b="9A E9"/>
+ <a u="6C37" b="9A EA"/>
+ <a u="6C38" b="D3 C0"/>
+ <a u="6C39" b="9A EB"/>
+ <a u="6C3A" b="9A EC"/>
+ <a u="6C3B" b="9A ED"/>
+ <a u="6C3C" b="9A EE"/>
+ <a u="6C3D" b="D9 DB"/>
+ <a u="6C3E" b="9A EF"/>
+ <a u="6C3F" b="9A F0"/>
+ <a u="6C40" b="CD A1"/>
+ <a u="6C41" b="D6 AD"/>
+ <a u="6C42" b="C7 F3"/>
+ <a u="6C43" b="9A F1"/>
+ <a u="6C44" b="9A F2"/>
+ <a u="6C45" b="9A F3"/>
+ <a u="6C46" b="D9 E0"/>
+ <a u="6C47" b="BB E3"/>
+ <a u="6C48" b="9A F4"/>
+ <a u="6C49" b="BA BA"/>
+ <a u="6C4A" b="E3 E2"/>
+ <a u="6C4B" b="9A F5"/>
+ <a u="6C4C" b="9A F6"/>
+ <a u="6C4D" b="9A F7"/>
+ <a u="6C4E" b="9A F8"/>
+ <a u="6C4F" b="9A F9"/>
+ <a u="6C50" b="CF AB"/>
+ <a u="6C51" b="9A FA"/>
+ <a u="6C52" b="9A FB"/>
+ <a u="6C53" b="9A FC"/>
+ <a u="6C54" b="E3 E0"/>
+ <a u="6C55" b="C9 C7"/>
+ <a u="6C56" b="9A FD"/>
+ <a u="6C57" b="BA B9"/>
+ <a u="6C58" b="9A FE"/>
+ <a u="6C59" b="9B 40"/>
+ <a u="6C5A" b="9B 41"/>
+ <a u="6C5B" b="D1 B4"/>
+ <a u="6C5C" b="E3 E1"/>
+ <a u="6C5D" b="C8 EA"/>
+ <a u="6C5E" b="B9 AF"/>
+ <a u="6C5F" b="BD AD"/>
+ <a u="6C60" b="B3 D8"/>
+ <a u="6C61" b="CE DB"/>
+ <a u="6C62" b="9B 42"/>
+ <a u="6C63" b="9B 43"/>
+ <a u="6C64" b="CC C0"/>
+ <a u="6C65" b="9B 44"/>
+ <a u="6C66" b="9B 45"/>
+ <a u="6C67" b="9B 46"/>
+ <a u="6C68" b="E3 E8"/>
+ <a u="6C69" b="E3 E9"/>
+ <a u="6C6A" b="CD F4"/>
+ <a u="6C6B" b="9B 47"/>
+ <a u="6C6C" b="9B 48"/>
+ <a u="6C6D" b="9B 49"/>
+ <a u="6C6E" b="9B 4A"/>
+ <a u="6C6F" b="9B 4B"/>
+ <a u="6C70" b="CC AD"/>
+ <a u="6C71" b="9B 4C"/>
+ <a u="6C72" b="BC B3"/>
+ <a u="6C73" b="9B 4D"/>
+ <a u="6C74" b="E3 EA"/>
+ <a u="6C75" b="9B 4E"/>
+ <a u="6C76" b="E3 EB"/>
+ <a u="6C77" b="9B 4F"/>
+ <a u="6C78" b="9B 50"/>
+ <a u="6C79" b="D0 DA"/>
+ <a u="6C7A" b="9B 51"/>
+ <a u="6C7B" b="9B 52"/>
+ <a u="6C7C" b="9B 53"/>
+ <a u="6C7D" b="C6 FB"/>
+ <a u="6C7E" b="B7 DA"/>
+ <a u="6C7F" b="9B 54"/>
+ <a u="6C80" b="9B 55"/>
+ <a u="6C81" b="C7 DF"/>
+ <a u="6C82" b="D2 CA"/>
+ <a u="6C83" b="CE D6"/>
+ <a u="6C84" b="9B 56"/>
+ <a u="6C85" b="E3 E4"/>
+ <a u="6C86" b="E3 EC"/>
+ <a u="6C87" b="9B 57"/>
+ <a u="6C88" b="C9 F2"/>
+ <a u="6C89" b="B3 C1"/>
+ <a u="6C8A" b="9B 58"/>
+ <a u="6C8B" b="9B 59"/>
+ <a u="6C8C" b="E3 E7"/>
+ <a u="6C8D" b="9B 5A"/>
+ <a u="6C8E" b="9B 5B"/>
+ <a u="6C8F" b="C6 E3"/>
+ <a u="6C90" b="E3 E5"/>
+ <a u="6C91" b="9B 5C"/>
+ <a u="6C92" b="9B 5D"/>
+ <a u="6C93" b="ED B3"/>
+ <a u="6C94" b="E3 E6"/>
+ <a u="6C95" b="9B 5E"/>
+ <a u="6C96" b="9B 5F"/>
+ <a u="6C97" b="9B 60"/>
+ <a u="6C98" b="9B 61"/>
+ <a u="6C99" b="C9 B3"/>
+ <a u="6C9A" b="9B 62"/>
+ <a u="6C9B" b="C5 E6"/>
+ <a u="6C9C" b="9B 63"/>
+ <a u="6C9D" b="9B 64"/>
+ <a u="6C9E" b="9B 65"/>
+ <a u="6C9F" b="B9 B5"/>
+ <a u="6CA0" b="9B 66"/>
+ <a u="6CA1" b="C3 BB"/>
+ <a u="6CA2" b="9B 67"/>
+ <a u="6CA3" b="E3 E3"/>
+ <a u="6CA4" b="C5 BD"/>
+ <a u="6CA5" b="C1 A4"/>
+ <a u="6CA6" b="C2 D9"/>
+ <a u="6CA7" b="B2 D7"/>
+ <a u="6CA8" b="9B 68"/>
+ <a u="6CA9" b="E3 ED"/>
+ <a u="6CAA" b="BB A6"/>
+ <a u="6CAB" b="C4 AD"/>
+ <a u="6CAC" b="9B 69"/>
+ <a u="6CAD" b="E3 F0"/>
+ <a u="6CAE" b="BE DA"/>
+ <a u="6CAF" b="9B 6A"/>
+ <a u="6CB0" b="9B 6B"/>
+ <a u="6CB1" b="E3 FB"/>
+ <a u="6CB2" b="E3 F5"/>
+ <a u="6CB3" b="BA D3"/>
+ <a u="6CB4" b="9B 6C"/>
+ <a u="6CB5" b="9B 6D"/>
+ <a u="6CB6" b="9B 6E"/>
+ <a u="6CB7" b="9B 6F"/>
+ <a u="6CB8" b="B7 D0"/>
+ <a u="6CB9" b="D3 CD"/>
+ <a u="6CBA" b="9B 70"/>
+ <a u="6CBB" b="D6 CE"/>
+ <a u="6CBC" b="D5 D3"/>
+ <a u="6CBD" b="B9 C1"/>
+ <a u="6CBE" b="D5 B4"/>
+ <a u="6CBF" b="D1 D8"/>
+ <a u="6CC0" b="9B 71"/>
+ <a u="6CC1" b="9B 72"/>
+ <a u="6CC2" b="9B 73"/>
+ <a u="6CC3" b="9B 74"/>
+ <a u="6CC4" b="D0 B9"/>
+ <a u="6CC5" b="C7 F6"/>
+ <a u="6CC6" b="9B 75"/>
+ <a u="6CC7" b="9B 76"/>
+ <a u="6CC8" b="9B 77"/>
+ <a u="6CC9" b="C8 AA"/>
+ <a u="6CCA" b="B2 B4"/>
+ <a u="6CCB" b="9B 78"/>
+ <a u="6CCC" b="C3 DA"/>
+ <a u="6CCD" b="9B 79"/>
+ <a u="6CCE" b="9B 7A"/>
+ <a u="6CCF" b="9B 7B"/>
+ <a u="6CD0" b="E3 EE"/>
+ <a u="6CD1" b="9B 7C"/>
+ <a u="6CD2" b="9B 7D"/>
+ <a u="6CD3" b="E3 FC"/>
+ <a u="6CD4" b="E3 EF"/>
+ <a u="6CD5" b="B7 A8"/>
+ <a u="6CD6" b="E3 F7"/>
+ <a u="6CD7" b="E3 F4"/>
+ <a u="6CD8" b="9B 7E"/>
+ <a u="6CD9" b="9B 80"/>
+ <a u="6CDA" b="9B 81"/>
+ <a u="6CDB" b="B7 BA"/>
+ <a u="6CDC" b="9B 82"/>
+ <a u="6CDD" b="9B 83"/>
+ <a u="6CDE" b="C5 A2"/>
+ <a u="6CDF" b="9B 84"/>
+ <a u="6CE0" b="E3 F6"/>
+ <a u="6CE1" b="C5 DD"/>
+ <a u="6CE2" b="B2 A8"/>
+ <a u="6CE3" b="C6 FC"/>
+ <a u="6CE4" b="9B 85"/>
+ <a u="6CE5" b="C4 E0"/>
+ <a u="6CE6" b="9B 86"/>
+ <a u="6CE7" b="9B 87"/>
+ <a u="6CE8" b="D7 A2"/>
+ <a u="6CE9" b="9B 88"/>
+ <a u="6CEA" b="C0 E1"/>
+ <a u="6CEB" b="E3 F9"/>
+ <a u="6CEC" b="9B 89"/>
+ <a u="6CED" b="9B 8A"/>
+ <a u="6CEE" b="E3 FA"/>
+ <a u="6CEF" b="E3 FD"/>
+ <a u="6CF0" b="CC A9"/>
+ <a u="6CF1" b="E3 F3"/>
+ <a u="6CF2" b="9B 8B"/>
+ <a u="6CF3" b="D3 BE"/>
+ <a u="6CF4" b="9B 8C"/>
+ <a u="6CF5" b="B1 C3"/>
+ <a u="6CF6" b="ED B4"/>
+ <a u="6CF7" b="E3 F1"/>
+ <a u="6CF8" b="E3 F2"/>
+ <a u="6CF9" b="9B 8D"/>
+ <a u="6CFA" b="E3 F8"/>
+ <a u="6CFB" b="D0 BA"/>
+ <a u="6CFC" b="C6 C3"/>
+ <a u="6CFD" b="D4 F3"/>
+ <a u="6CFE" b="E3 FE"/>
+ <a u="6CFF" b="9B 8E"/>
+ <a u="6D00" b="9B 8F"/>
+ <a u="6D01" b="BD E0"/>
+ <a u="6D02" b="9B 90"/>
+ <a u="6D03" b="9B 91"/>
+ <a u="6D04" b="E4 A7"/>
+ <a u="6D05" b="9B 92"/>
+ <a u="6D06" b="9B 93"/>
+ <a u="6D07" b="E4 A6"/>
+ <a u="6D08" b="9B 94"/>
+ <a u="6D09" b="9B 95"/>
+ <a u="6D0A" b="9B 96"/>
+ <a u="6D0B" b="D1 F3"/>
+ <a u="6D0C" b="E4 A3"/>
+ <a u="6D0D" b="9B 97"/>
+ <a u="6D0E" b="E4 A9"/>
+ <a u="6D0F" b="9B 98"/>
+ <a u="6D10" b="9B 99"/>
+ <a u="6D11" b="9B 9A"/>
+ <a u="6D12" b="C8 F7"/>
+ <a u="6D13" b="9B 9B"/>
+ <a u="6D14" b="9B 9C"/>
+ <a u="6D15" b="9B 9D"/>
+ <a u="6D16" b="9B 9E"/>
+ <a u="6D17" b="CF B4"/>
+ <a u="6D18" b="9B 9F"/>
+ <a u="6D19" b="E4 A8"/>
+ <a u="6D1A" b="E4 AE"/>
+ <a u="6D1B" b="C2 E5"/>
+ <a u="6D1C" b="9B A0"/>
+ <a u="6D1D" b="9B A1"/>
+ <a u="6D1E" b="B6 B4"/>
+ <a u="6D1F" b="9B A2"/>
+ <a u="6D20" b="9B A3"/>
+ <a u="6D21" b="9B A4"/>
+ <a u="6D22" b="9B A5"/>
+ <a u="6D23" b="9B A6"/>
+ <a u="6D24" b="9B A7"/>
+ <a u="6D25" b="BD F2"/>
+ <a u="6D26" b="9B A8"/>
+ <a u="6D27" b="E4 A2"/>
+ <a u="6D28" b="9B A9"/>
+ <a u="6D29" b="9B AA"/>
+ <a u="6D2A" b="BA E9"/>
+ <a u="6D2B" b="E4 AA"/>
+ <a u="6D2C" b="9B AB"/>
+ <a u="6D2D" b="9B AC"/>
+ <a u="6D2E" b="E4 AC"/>
+ <a u="6D2F" b="9B AD"/>
+ <a u="6D30" b="9B AE"/>
+ <a u="6D31" b="B6 FD"/>
+ <a u="6D32" b="D6 DE"/>
+ <a u="6D33" b="E4 B2"/>
+ <a u="6D34" b="9B AF"/>
+ <a u="6D35" b="E4 AD"/>
+ <a u="6D36" b="9B B0"/>
+ <a u="6D37" b="9B B1"/>
+ <a u="6D38" b="9B B2"/>
+ <a u="6D39" b="E4 A1"/>
+ <a u="6D3A" b="9B B3"/>
+ <a u="6D3B" b="BB EE"/>
+ <a u="6D3C" b="CD DD"/>
+ <a u="6D3D" b="C7 A2"/>
+ <a u="6D3E" b="C5 C9"/>
+ <a u="6D3F" b="9B B4"/>
+ <a u="6D40" b="9B B5"/>
+ <a u="6D41" b="C1 F7"/>
+ <a u="6D42" b="9B B6"/>
+ <a u="6D43" b="E4 A4"/>
+ <a u="6D44" b="9B B7"/>
+ <a u="6D45" b="C7 B3"/>
+ <a u="6D46" b="BD AC"/>
+ <a u="6D47" b="BD BD"/>
+ <a u="6D48" b="E4 A5"/>
+ <a u="6D49" b="9B B8"/>
+ <a u="6D4A" b="D7 C7"/>
+ <a u="6D4B" b="B2 E2"/>
+ <a u="6D4C" b="9B B9"/>
+ <a u="6D4D" b="E4 AB"/>
+ <a u="6D4E" b="BC C3"/>
+ <a u="6D4F" b="E4 AF"/>
+ <a u="6D50" b="9B BA"/>
+ <a u="6D51" b="BB EB"/>
+ <a u="6D52" b="E4 B0"/>
+ <a u="6D53" b="C5 A8"/>
+ <a u="6D54" b="E4 B1"/>
+ <a u="6D55" b="9B BB"/>
+ <a u="6D56" b="9B BC"/>
+ <a u="6D57" b="9B BD"/>
+ <a u="6D58" b="9B BE"/>
+ <a u="6D59" b="D5 E3"/>
+ <a u="6D5A" b="BF A3"/>
+ <a u="6D5B" b="9B BF"/>
+ <a u="6D5C" b="E4 BA"/>
+ <a u="6D5D" b="9B C0"/>
+ <a u="6D5E" b="E4 B7"/>
+ <a u="6D5F" b="9B C1"/>
+ <a u="6D60" b="E4 BB"/>
+ <a u="6D61" b="9B C2"/>
+ <a u="6D62" b="9B C3"/>
+ <a u="6D63" b="E4 BD"/>
+ <a u="6D64" b="9B C4"/>
+ <a u="6D65" b="9B C5"/>
+ <a u="6D66" b="C6 D6"/>
+ <a u="6D67" b="9B C6"/>
+ <a u="6D68" b="9B C7"/>
+ <a u="6D69" b="BA C6"/>
+ <a u="6D6A" b="C0 CB"/>
+ <a u="6D6B" b="9B C8"/>
+ <a u="6D6C" b="9B C9"/>
+ <a u="6D6D" b="9B CA"/>
+ <a u="6D6E" b="B8 A1"/>
+ <a u="6D6F" b="E4 B4"/>
+ <a u="6D70" b="9B CB"/>
+ <a u="6D71" b="9B CC"/>
+ <a u="6D72" b="9B CD"/>
+ <a u="6D73" b="9B CE"/>
+ <a u="6D74" b="D4 A1"/>
+ <a u="6D75" b="9B CF"/>
+ <a u="6D76" b="9B D0"/>
+ <a u="6D77" b="BA A3"/>
+ <a u="6D78" b="BD FE"/>
+ <a u="6D79" b="9B D1"/>
+ <a u="6D7A" b="9B D2"/>
+ <a u="6D7B" b="9B D3"/>
+ <a u="6D7C" b="E4 BC"/>
+ <a u="6D7D" b="9B D4"/>
+ <a u="6D7E" b="9B D5"/>
+ <a u="6D7F" b="9B D6"/>
+ <a u="6D80" b="9B D7"/>
+ <a u="6D81" b="9B D8"/>
+ <a u="6D82" b="CD BF"/>
+ <a u="6D83" b="9B D9"/>
+ <a u="6D84" b="9B DA"/>
+ <a u="6D85" b="C4 F9"/>
+ <a u="6D86" b="9B DB"/>
+ <a u="6D87" b="9B DC"/>
+ <a u="6D88" b="CF FB"/>
+ <a u="6D89" b="C9 E6"/>
+ <a u="6D8A" b="9B DD"/>
+ <a u="6D8B" b="9B DE"/>
+ <a u="6D8C" b="D3 BF"/>
+ <a u="6D8D" b="9B DF"/>
+ <a u="6D8E" b="CF D1"/>
+ <a u="6D8F" b="9B E0"/>
+ <a u="6D90" b="9B E1"/>
+ <a u="6D91" b="E4 B3"/>
+ <a u="6D92" b="9B E2"/>
+ <a u="6D93" b="E4 B8"/>
+ <a u="6D94" b="E4 B9"/>
+ <a u="6D95" b="CC E9"/>
+ <a u="6D96" b="9B E3"/>
+ <a u="6D97" b="9B E4"/>
+ <a u="6D98" b="9B E5"/>
+ <a u="6D99" b="9B E6"/>
+ <a u="6D9A" b="9B E7"/>
+ <a u="6D9B" b="CC CE"/>
+ <a u="6D9C" b="9B E8"/>
+ <a u="6D9D" b="C0 D4"/>
+ <a u="6D9E" b="E4 B5"/>
+ <a u="6D9F" b="C1 B0"/>
+ <a u="6DA0" b="E4 B6"/>
+ <a u="6DA1" b="CE D0"/>
+ <a u="6DA2" b="9B E9"/>
+ <a u="6DA3" b="BB C1"/>
+ <a u="6DA4" b="B5 D3"/>
+ <a u="6DA5" b="9B EA"/>
+ <a u="6DA6" b="C8 F3"/>
+ <a u="6DA7" b="BD A7"/>
+ <a u="6DA8" b="D5 C7"/>
+ <a u="6DA9" b="C9 AC"/>
+ <a u="6DAA" b="B8 A2"/>
+ <a u="6DAB" b="E4 CA"/>
+ <a u="6DAC" b="9B EB"/>
+ <a u="6DAD" b="9B EC"/>
+ <a u="6DAE" b="E4 CC"/>
+ <a u="6DAF" b="D1 C4"/>
+ <a u="6DB0" b="9B ED"/>
+ <a u="6DB1" b="9B EE"/>
+ <a u="6DB2" b="D2 BA"/>
+ <a u="6DB3" b="9B EF"/>
+ <a u="6DB4" b="9B F0"/>
+ <a u="6DB5" b="BA AD"/>
+ <a u="6DB6" b="9B F1"/>
+ <a u="6DB7" b="9B F2"/>
+ <a u="6DB8" b="BA D4"/>
+ <a u="6DB9" b="9B F3"/>
+ <a u="6DBA" b="9B F4"/>
+ <a u="6DBB" b="9B F5"/>
+ <a u="6DBC" b="9B F6"/>
+ <a u="6DBD" b="9B F7"/>
+ <a u="6DBE" b="9B F8"/>
+ <a u="6DBF" b="E4 C3"/>
+ <a u="6DC0" b="B5 ED"/>
+ <a u="6DC1" b="9B F9"/>
+ <a u="6DC2" b="9B FA"/>
+ <a u="6DC3" b="9B FB"/>
+ <a u="6DC4" b="D7 CD"/>
+ <a u="6DC5" b="E4 C0"/>
+ <a u="6DC6" b="CF FD"/>
+ <a u="6DC7" b="E4 BF"/>
+ <a u="6DC8" b="9B FC"/>
+ <a u="6DC9" b="9B FD"/>
+ <a u="6DCA" b="9B FE"/>
+ <a u="6DCB" b="C1 DC"/>
+ <a u="6DCC" b="CC CA"/>
+ <a u="6DCD" b="9C 40"/>
+ <a u="6DCE" b="9C 41"/>
+ <a u="6DCF" b="9C 42"/>
+ <a u="6DD0" b="9C 43"/>
+ <a u="6DD1" b="CA E7"/>
+ <a u="6DD2" b="9C 44"/>
+ <a u="6DD3" b="9C 45"/>
+ <a u="6DD4" b="9C 46"/>
+ <a u="6DD5" b="9C 47"/>
+ <a u="6DD6" b="C4 D7"/>
+ <a u="6DD7" b="9C 48"/>
+ <a u="6DD8" b="CC D4"/>
+ <a u="6DD9" b="E4 C8"/>
+ <a u="6DDA" b="9C 49"/>
+ <a u="6DDB" b="9C 4A"/>
+ <a u="6DDC" b="9C 4B"/>
+ <a u="6DDD" b="E4 C7"/>
+ <a u="6DDE" b="E4 C1"/>
+ <a u="6DDF" b="9C 4C"/>
+ <a u="6DE0" b="E4 C4"/>
+ <a u="6DE1" b="B5 AD"/>
+ <a u="6DE2" b="9C 4D"/>
+ <a u="6DE3" b="9C 4E"/>
+ <a u="6DE4" b="D3 D9"/>
+ <a u="6DE5" b="9C 4F"/>
+ <a u="6DE6" b="E4 C6"/>
+ <a u="6DE7" b="9C 50"/>
+ <a u="6DE8" b="9C 51"/>
+ <a u="6DE9" b="9C 52"/>
+ <a u="6DEA" b="9C 53"/>
+ <a u="6DEB" b="D2 F9"/>
+ <a u="6DEC" b="B4 E3"/>
+ <a u="6DED" b="9C 54"/>
+ <a u="6DEE" b="BB B4"/>
+ <a u="6DEF" b="9C 55"/>
+ <a u="6DF0" b="9C 56"/>
+ <a u="6DF1" b="C9 EE"/>
+ <a u="6DF2" b="9C 57"/>
+ <a u="6DF3" b="B4 BE"/>
+ <a u="6DF4" b="9C 58"/>
+ <a u="6DF5" b="9C 59"/>
+ <a u="6DF6" b="9C 5A"/>
+ <a u="6DF7" b="BB EC"/>
+ <a u="6DF8" b="9C 5B"/>
+ <a u="6DF9" b="D1 CD"/>
+ <a u="6DFA" b="9C 5C"/>
+ <a u="6DFB" b="CC ED"/>
+ <a u="6DFC" b="ED B5"/>
+ <a u="6DFD" b="9C 5D"/>
+ <a u="6DFE" b="9C 5E"/>
+ <a u="6DFF" b="9C 5F"/>
+ <a u="6E00" b="9C 60"/>
+ <a u="6E01" b="9C 61"/>
+ <a u="6E02" b="9C 62"/>
+ <a u="6E03" b="9C 63"/>
+ <a u="6E04" b="9C 64"/>
+ <a u="6E05" b="C7 E5"/>
+ <a u="6E06" b="9C 65"/>
+ <a u="6E07" b="9C 66"/>
+ <a u="6E08" b="9C 67"/>
+ <a u="6E09" b="9C 68"/>
+ <a u="6E0A" b="D4 A8"/>
+ <a u="6E0B" b="9C 69"/>
+ <a u="6E0C" b="E4 CB"/>
+ <a u="6E0D" b="D7 D5"/>
+ <a u="6E0E" b="E4 C2"/>
+ <a u="6E0F" b="9C 6A"/>
+ <a u="6E10" b="BD A5"/>
+ <a u="6E11" b="E4 C5"/>
+ <a u="6E12" b="9C 6B"/>
+ <a u="6E13" b="9C 6C"/>
+ <a u="6E14" b="D3 E6"/>
+ <a u="6E15" b="9C 6D"/>
+ <a u="6E16" b="E4 C9"/>
+ <a u="6E17" b="C9 F8"/>
+ <a u="6E18" b="9C 6E"/>
+ <a u="6E19" b="9C 6F"/>
+ <a u="6E1A" b="E4 BE"/>
+ <a u="6E1B" b="9C 70"/>
+ <a u="6E1C" b="9C 71"/>
+ <a u="6E1D" b="D3 E5"/>
+ <a u="6E1E" b="9C 72"/>
+ <a u="6E1F" b="9C 73"/>
+ <a u="6E20" b="C7 FE"/>
+ <a u="6E21" b="B6 C9"/>
+ <a u="6E22" b="9C 74"/>
+ <a u="6E23" b="D4 FC"/>
+ <a u="6E24" b="B2 B3"/>
+ <a u="6E25" b="E4 D7"/>
+ <a u="6E26" b="9C 75"/>
+ <a u="6E27" b="9C 76"/>
+ <a u="6E28" b="9C 77"/>
+ <a u="6E29" b="CE C2"/>
+ <a u="6E2A" b="9C 78"/>
+ <a u="6E2B" b="E4 CD"/>
+ <a u="6E2C" b="9C 79"/>
+ <a u="6E2D" b="CE BC"/>
+ <a u="6E2E" b="9C 7A"/>
+ <a u="6E2F" b="B8 DB"/>
+ <a u="6E30" b="9C 7B"/>
+ <a u="6E31" b="9C 7C"/>
+ <a u="6E32" b="E4 D6"/>
+ <a u="6E33" b="9C 7D"/>
+ <a u="6E34" b="BF CA"/>
+ <a u="6E35" b="9C 7E"/>
+ <a u="6E36" b="9C 80"/>
+ <a u="6E37" b="9C 81"/>
+ <a u="6E38" b="D3 CE"/>
+ <a u="6E39" b="9C 82"/>
+ <a u="6E3A" b="C3 EC"/>
+ <a u="6E3B" b="9C 83"/>
+ <a u="6E3C" b="9C 84"/>
+ <a u="6E3D" b="9C 85"/>
+ <a u="6E3E" b="9C 86"/>
+ <a u="6E3F" b="9C 87"/>
+ <a u="6E40" b="9C 88"/>
+ <a u="6E41" b="9C 89"/>
+ <a u="6E42" b="9C 8A"/>
+ <a u="6E43" b="C5 C8"/>
+ <a u="6E44" b="E4 D8"/>
+ <a u="6E45" b="9C 8B"/>
+ <a u="6E46" b="9C 8C"/>
+ <a u="6E47" b="9C 8D"/>
+ <a u="6E48" b="9C 8E"/>
+ <a u="6E49" b="9C 8F"/>
+ <a u="6E4A" b="9C 90"/>
+ <a u="6E4B" b="9C 91"/>
+ <a u="6E4C" b="9C 92"/>
+ <a u="6E4D" b="CD C4"/>
+ <a u="6E4E" b="E4 CF"/>
+ <a u="6E4F" b="9C 93"/>
+ <a u="6E50" b="9C 94"/>
+ <a u="6E51" b="9C 95"/>
+ <a u="6E52" b="9C 96"/>
+ <a u="6E53" b="E4 D4"/>
+ <a u="6E54" b="E4 D5"/>
+ <a u="6E55" b="9C 97"/>
+ <a u="6E56" b="BA FE"/>
+ <a u="6E57" b="9C 98"/>
+ <a u="6E58" b="CF E6"/>
+ <a u="6E59" b="9C 99"/>
+ <a u="6E5A" b="9C 9A"/>
+ <a u="6E5B" b="D5 BF"/>
+ <a u="6E5C" b="9C 9B"/>
+ <a u="6E5D" b="9C 9C"/>
+ <a u="6E5E" b="9C 9D"/>
+ <a u="6E5F" b="E4 D2"/>
+ <a u="6E60" b="9C 9E"/>
+ <a u="6E61" b="9C 9F"/>
+ <a u="6E62" b="9C A0"/>
+ <a u="6E63" b="9C A1"/>
+ <a u="6E64" b="9C A2"/>
+ <a u="6E65" b="9C A3"/>
+ <a u="6E66" b="9C A4"/>
+ <a u="6E67" b="9C A5"/>
+ <a u="6E68" b="9C A6"/>
+ <a u="6E69" b="9C A7"/>
+ <a u="6E6A" b="9C A8"/>
+ <a u="6E6B" b="E4 D0"/>
+ <a u="6E6C" b="9C A9"/>
+ <a u="6E6D" b="9C AA"/>
+ <a u="6E6E" b="E4 CE"/>
+ <a u="6E6F" b="9C AB"/>
+ <a u="6E70" b="9C AC"/>
+ <a u="6E71" b="9C AD"/>
+ <a u="6E72" b="9C AE"/>
+ <a u="6E73" b="9C AF"/>
+ <a u="6E74" b="9C B0"/>
+ <a u="6E75" b="9C B1"/>
+ <a u="6E76" b="9C B2"/>
+ <a u="6E77" b="9C B3"/>
+ <a u="6E78" b="9C B4"/>
+ <a u="6E79" b="9C B5"/>
+ <a u="6E7A" b="9C B6"/>
+ <a u="6E7B" b="9C B7"/>
+ <a u="6E7C" b="9C B8"/>
+ <a u="6E7D" b="9C B9"/>
+ <a u="6E7E" b="CD E5"/>
+ <a u="6E7F" b="CA AA"/>
+ <a u="6E80" b="9C BA"/>
+ <a u="6E81" b="9C BB"/>
+ <a u="6E82" b="9C BC"/>
+ <a u="6E83" b="C0 A3"/>
+ <a u="6E84" b="9C BD"/>
+ <a u="6E85" b="BD A6"/>
+ <a u="6E86" b="E4 D3"/>
+ <a u="6E87" b="9C BE"/>
+ <a u="6E88" b="9C BF"/>
+ <a u="6E89" b="B8 C8"/>
+ <a u="6E8A" b="9C C0"/>
+ <a u="6E8B" b="9C C1"/>
+ <a u="6E8C" b="9C C2"/>
+ <a u="6E8D" b="9C C3"/>
+ <a u="6E8E" b="9C C4"/>
+ <a u="6E8F" b="E4 E7"/>
+ <a u="6E90" b="D4 B4"/>
+ <a u="6E91" b="9C C5"/>
+ <a u="6E92" b="9C C6"/>
+ <a u="6E93" b="9C C7"/>
+ <a u="6E94" b="9C C8"/>
+ <a u="6E95" b="9C C9"/>
+ <a u="6E96" b="9C CA"/>
+ <a u="6E97" b="9C CB"/>
+ <a u="6E98" b="E4 DB"/>
+ <a u="6E99" b="9C CC"/>
+ <a u="6E9A" b="9C CD"/>
+ <a u="6E9B" b="9C CE"/>
+ <a u="6E9C" b="C1 EF"/>
+ <a u="6E9D" b="9C CF"/>
+ <a u="6E9E" b="9C D0"/>
+ <a u="6E9F" b="E4 E9"/>
+ <a u="6EA0" b="9C D1"/>
+ <a u="6EA1" b="9C D2"/>
+ <a u="6EA2" b="D2 E7"/>
+ <a u="6EA3" b="9C D3"/>
+ <a u="6EA4" b="9C D4"/>
+ <a u="6EA5" b="E4 DF"/>
+ <a u="6EA6" b="9C D5"/>
+ <a u="6EA7" b="E4 E0"/>
+ <a u="6EA8" b="9C D6"/>
+ <a u="6EA9" b="9C D7"/>
+ <a u="6EAA" b="CF AA"/>
+ <a u="6EAB" b="9C D8"/>
+ <a u="6EAC" b="9C D9"/>
+ <a u="6EAD" b="9C DA"/>
+ <a u="6EAE" b="9C DB"/>
+ <a u="6EAF" b="CB DD"/>
+ <a u="6EB0" b="9C DC"/>
+ <a u="6EB1" b="E4 DA"/>
+ <a u="6EB2" b="E4 D1"/>
+ <a u="6EB3" b="9C DD"/>
+ <a u="6EB4" b="E4 E5"/>
+ <a u="6EB5" b="9C DE"/>
+ <a u="6EB6" b="C8 DC"/>
+ <a u="6EB7" b="E4 E3"/>
+ <a u="6EB8" b="9C DF"/>
+ <a u="6EB9" b="9C E0"/>
+ <a u="6EBA" b="C4 E7"/>
+ <a u="6EBB" b="E4 E2"/>
+ <a u="6EBC" b="9C E1"/>
+ <a u="6EBD" b="E4 E1"/>
+ <a u="6EBE" b="9C E2"/>
+ <a u="6EBF" b="9C E3"/>
+ <a u="6EC0" b="9C E4"/>
+ <a u="6EC1" b="B3 FC"/>
+ <a u="6EC2" b="E4 E8"/>
+ <a u="6EC3" b="9C E5"/>
+ <a u="6EC4" b="9C E6"/>
+ <a u="6EC5" b="9C E7"/>
+ <a u="6EC6" b="9C E8"/>
+ <a u="6EC7" b="B5 E1"/>
+ <a u="6EC8" b="9C E9"/>
+ <a u="6EC9" b="9C EA"/>
+ <a u="6ECA" b="9C EB"/>
+ <a u="6ECB" b="D7 CC"/>
+ <a u="6ECC" b="9C EC"/>
+ <a u="6ECD" b="9C ED"/>
+ <a u="6ECE" b="9C EE"/>
+ <a u="6ECF" b="E4 E6"/>
+ <a u="6ED0" b="9C EF"/>
+ <a u="6ED1" b="BB AC"/>
+ <a u="6ED2" b="9C F0"/>
+ <a u="6ED3" b="D7 D2"/>
+ <a u="6ED4" b="CC CF"/>
+ <a u="6ED5" b="EB F8"/>
+ <a u="6ED6" b="9C F1"/>
+ <a u="6ED7" b="E4 E4"/>
+ <a u="6ED8" b="9C F2"/>
+ <a u="6ED9" b="9C F3"/>
+ <a u="6EDA" b="B9 F6"/>
+ <a u="6EDB" b="9C F4"/>
+ <a u="6EDC" b="9C F5"/>
+ <a u="6EDD" b="9C F6"/>
+ <a u="6EDE" b="D6 CD"/>
+ <a u="6EDF" b="E4 D9"/>
+ <a u="6EE0" b="E4 DC"/>
+ <a u="6EE1" b="C2 FA"/>
+ <a u="6EE2" b="E4 DE"/>
+ <a u="6EE3" b="9C F7"/>
+ <a u="6EE4" b="C2 CB"/>
+ <a u="6EE5" b="C0 C4"/>
+ <a u="6EE6" b="C2 D0"/>
+ <a u="6EE7" b="9C F8"/>
+ <a u="6EE8" b="B1 F5"/>
+ <a u="6EE9" b="CC B2"/>
+ <a u="6EEA" b="9C F9"/>
+ <a u="6EEB" b="9C FA"/>
+ <a u="6EEC" b="9C FB"/>
+ <a u="6EED" b="9C FC"/>
+ <a u="6EEE" b="9C FD"/>
+ <a u="6EEF" b="9C FE"/>
+ <a u="6EF0" b="9D 40"/>
+ <a u="6EF1" b="9D 41"/>
+ <a u="6EF2" b="9D 42"/>
+ <a u="6EF3" b="9D 43"/>
+ <a u="6EF4" b="B5 CE"/>
+ <a u="6EF5" b="9D 44"/>
+ <a u="6EF6" b="9D 45"/>
+ <a u="6EF7" b="9D 46"/>
+ <a u="6EF8" b="9D 47"/>
+ <a u="6EF9" b="E4 EF"/>
+ <a u="6EFA" b="9D 48"/>
+ <a u="6EFB" b="9D 49"/>
+ <a u="6EFC" b="9D 4A"/>
+ <a u="6EFD" b="9D 4B"/>
+ <a u="6EFE" b="9D 4C"/>
+ <a u="6EFF" b="9D 4D"/>
+ <a u="6F00" b="9D 4E"/>
+ <a u="6F01" b="9D 4F"/>
+ <a u="6F02" b="C6 AF"/>
+ <a u="6F03" b="9D 50"/>
+ <a u="6F04" b="9D 51"/>
+ <a u="6F05" b="9D 52"/>
+ <a u="6F06" b="C6 E1"/>
+ <a u="6F07" b="9D 53"/>
+ <a u="6F08" b="9D 54"/>
+ <a u="6F09" b="E4 F5"/>
+ <a u="6F0A" b="9D 55"/>
+ <a u="6F0B" b="9D 56"/>
+ <a u="6F0C" b="9D 57"/>
+ <a u="6F0D" b="9D 58"/>
+ <a u="6F0E" b="9D 59"/>
+ <a u="6F0F" b="C2 A9"/>
+ <a u="6F10" b="9D 5A"/>
+ <a u="6F11" b="9D 5B"/>
+ <a u="6F12" b="9D 5C"/>
+ <a u="6F13" b="C0 EC"/>
+ <a u="6F14" b="D1 DD"/>
+ <a u="6F15" b="E4 EE"/>
+ <a u="6F16" b="9D 5D"/>
+ <a u="6F17" b="9D 5E"/>
+ <a u="6F18" b="9D 5F"/>
+ <a u="6F19" b="9D 60"/>
+ <a u="6F1A" b="9D 61"/>
+ <a u="6F1B" b="9D 62"/>
+ <a u="6F1C" b="9D 63"/>
+ <a u="6F1D" b="9D 64"/>
+ <a u="6F1E" b="9D 65"/>
+ <a u="6F1F" b="9D 66"/>
+ <a u="6F20" b="C4 AE"/>
+ <a u="6F21" b="9D 67"/>
+ <a u="6F22" b="9D 68"/>
+ <a u="6F23" b="9D 69"/>
+ <a u="6F24" b="E4 ED"/>
+ <a u="6F25" b="9D 6A"/>
+ <a u="6F26" b="9D 6B"/>
+ <a u="6F27" b="9D 6C"/>
+ <a u="6F28" b="9D 6D"/>
+ <a u="6F29" b="E4 F6"/>
+ <a u="6F2A" b="E4 F4"/>
+ <a u="6F2B" b="C2 FE"/>
+ <a u="6F2C" b="9D 6E"/>
+ <a u="6F2D" b="E4 DD"/>
+ <a u="6F2E" b="9D 6F"/>
+ <a u="6F2F" b="E4 F0"/>
+ <a u="6F30" b="9D 70"/>
+ <a u="6F31" b="CA FE"/>
+ <a u="6F32" b="9D 71"/>
+ <a u="6F33" b="D5 C4"/>
+ <a u="6F34" b="9D 72"/>
+ <a u="6F35" b="9D 73"/>
+ <a u="6F36" b="E4 F1"/>
+ <a u="6F37" b="9D 74"/>
+ <a u="6F38" b="9D 75"/>
+ <a u="6F39" b="9D 76"/>
+ <a u="6F3A" b="9D 77"/>
+ <a u="6F3B" b="9D 78"/>
+ <a u="6F3C" b="9D 79"/>
+ <a u="6F3D" b="9D 7A"/>
+ <a u="6F3E" b="D1 FA"/>
+ <a u="6F3F" b="9D 7B"/>
+ <a u="6F40" b="9D 7C"/>
+ <a u="6F41" b="9D 7D"/>
+ <a u="6F42" b="9D 7E"/>
+ <a u="6F43" b="9D 80"/>
+ <a u="6F44" b="9D 81"/>
+ <a u="6F45" b="9D 82"/>
+ <a u="6F46" b="E4 EB"/>
+ <a u="6F47" b="E4 EC"/>
+ <a u="6F48" b="9D 83"/>
+ <a u="6F49" b="9D 84"/>
+ <a u="6F4A" b="9D 85"/>
+ <a u="6F4B" b="E4 F2"/>
+ <a u="6F4C" b="9D 86"/>
+ <a u="6F4D" b="CE AB"/>
+ <a u="6F4E" b="9D 87"/>
+ <a u="6F4F" b="9D 88"/>
+ <a u="6F50" b="9D 89"/>
+ <a u="6F51" b="9D 8A"/>
+ <a u="6F52" b="9D 8B"/>
+ <a u="6F53" b="9D 8C"/>
+ <a u="6F54" b="9D 8D"/>
+ <a u="6F55" b="9D 8E"/>
+ <a u="6F56" b="9D 8F"/>
+ <a u="6F57" b="9D 90"/>
+ <a u="6F58" b="C5 CB"/>
+ <a u="6F59" b="9D 91"/>
+ <a u="6F5A" b="9D 92"/>
+ <a u="6F5B" b="9D 93"/>
+ <a u="6F5C" b="C7 B1"/>
+ <a u="6F5D" b="9D 94"/>
+ <a u="6F5E" b="C2 BA"/>
+ <a u="6F5F" b="9D 95"/>
+ <a u="6F60" b="9D 96"/>
+ <a u="6F61" b="9D 97"/>
+ <a u="6F62" b="E4 EA"/>
+ <a u="6F63" b="9D 98"/>
+ <a u="6F64" b="9D 99"/>
+ <a u="6F65" b="9D 9A"/>
+ <a u="6F66" b="C1 CA"/>
+ <a u="6F67" b="9D 9B"/>
+ <a u="6F68" b="9D 9C"/>
+ <a u="6F69" b="9D 9D"/>
+ <a u="6F6A" b="9D 9E"/>
+ <a u="6F6B" b="9D 9F"/>
+ <a u="6F6C" b="9D A0"/>
+ <a u="6F6D" b="CC B6"/>
+ <a u="6F6E" b="B3 B1"/>
+ <a u="6F6F" b="9D A1"/>
+ <a u="6F70" b="9D A2"/>
+ <a u="6F71" b="9D A3"/>
+ <a u="6F72" b="E4 FB"/>
+ <a u="6F73" b="9D A4"/>
+ <a u="6F74" b="E4 F3"/>
+ <a u="6F75" b="9D A5"/>
+ <a u="6F76" b="9D A6"/>
+ <a u="6F77" b="9D A7"/>
+ <a u="6F78" b="E4 FA"/>
+ <a u="6F79" b="9D A8"/>
+ <a u="6F7A" b="E4 FD"/>
+ <a u="6F7B" b="9D A9"/>
+ <a u="6F7C" b="E4 FC"/>
+ <a u="6F7D" b="9D AA"/>
+ <a u="6F7E" b="9D AB"/>
+ <a u="6F7F" b="9D AC"/>
+ <a u="6F80" b="9D AD"/>
+ <a u="6F81" b="9D AE"/>
+ <a u="6F82" b="9D AF"/>
+ <a u="6F83" b="9D B0"/>
+ <a u="6F84" b="B3 CE"/>
+ <a u="6F85" b="9D B1"/>
+ <a u="6F86" b="9D B2"/>
+ <a u="6F87" b="9D B3"/>
+ <a u="6F88" b="B3 BA"/>
+ <a u="6F89" b="E4 F7"/>
+ <a u="6F8A" b="9D B4"/>
+ <a u="6F8B" b="9D B5"/>
+ <a u="6F8C" b="E4 F9"/>
+ <a u="6F8D" b="E4 F8"/>
+ <a u="6F8E" b="C5 EC"/>
+ <a u="6F8F" b="9D B6"/>
+ <a u="6F90" b="9D B7"/>
+ <a u="6F91" b="9D B8"/>
+ <a u="6F92" b="9D B9"/>
+ <a u="6F93" b="9D BA"/>
+ <a u="6F94" b="9D BB"/>
+ <a u="6F95" b="9D BC"/>
+ <a u="6F96" b="9D BD"/>
+ <a u="6F97" b="9D BE"/>
+ <a u="6F98" b="9D BF"/>
+ <a u="6F99" b="9D C0"/>
+ <a u="6F9A" b="9D C1"/>
+ <a u="6F9B" b="9D C2"/>
+ <a u="6F9C" b="C0 BD"/>
+ <a u="6F9D" b="9D C3"/>
+ <a u="6F9E" b="9D C4"/>
+ <a u="6F9F" b="9D C5"/>
+ <a u="6FA0" b="9D C6"/>
+ <a u="6FA1" b="D4 E8"/>
+ <a u="6FA2" b="9D C7"/>
+ <a u="6FA3" b="9D C8"/>
+ <a u="6FA4" b="9D C9"/>
+ <a u="6FA5" b="9D CA"/>
+ <a u="6FA6" b="9D CB"/>
+ <a u="6FA7" b="E5 A2"/>
+ <a u="6FA8" b="9D CC"/>
+ <a u="6FA9" b="9D CD"/>
+ <a u="6FAA" b="9D CE"/>
+ <a u="6FAB" b="9D CF"/>
+ <a u="6FAC" b="9D D0"/>
+ <a u="6FAD" b="9D D1"/>
+ <a u="6FAE" b="9D D2"/>
+ <a u="6FAF" b="9D D3"/>
+ <a u="6FB0" b="9D D4"/>
+ <a u="6FB1" b="9D D5"/>
+ <a u="6FB2" b="9D D6"/>
+ <a u="6FB3" b="B0 C4"/>
+ <a u="6FB4" b="9D D7"/>
+ <a u="6FB5" b="9D D8"/>
+ <a u="6FB6" b="E5 A4"/>
+ <a u="6FB7" b="9D D9"/>
+ <a u="6FB8" b="9D DA"/>
+ <a u="6FB9" b="E5 A3"/>
+ <a u="6FBA" b="9D DB"/>
+ <a u="6FBB" b="9D DC"/>
+ <a u="6FBC" b="9D DD"/>
+ <a u="6FBD" b="9D DE"/>
+ <a u="6FBE" b="9D DF"/>
+ <a u="6FBF" b="9D E0"/>
+ <a u="6FC0" b="BC A4"/>
+ <a u="6FC1" b="9D E1"/>
+ <a u="6FC2" b="E5 A5"/>
+ <a u="6FC3" b="9D E2"/>
+ <a u="6FC4" b="9D E3"/>
+ <a u="6FC5" b="9D E4"/>
+ <a u="6FC6" b="9D E5"/>
+ <a u="6FC7" b="9D E6"/>
+ <a u="6FC8" b="9D E7"/>
+ <a u="6FC9" b="E5 A1"/>
+ <a u="6FCA" b="9D E8"/>
+ <a u="6FCB" b="9D E9"/>
+ <a u="6FCC" b="9D EA"/>
+ <a u="6FCD" b="9D EB"/>
+ <a u="6FCE" b="9D EC"/>
+ <a u="6FCF" b="9D ED"/>
+ <a u="6FD0" b="9D EE"/>
+ <a u="6FD1" b="E4 FE"/>
+ <a u="6FD2" b="B1 F4"/>
+ <a u="6FD3" b="9D EF"/>
+ <a u="6FD4" b="9D F0"/>
+ <a u="6FD5" b="9D F1"/>
+ <a u="6FD6" b="9D F2"/>
+ <a u="6FD7" b="9D F3"/>
+ <a u="6FD8" b="9D F4"/>
+ <a u="6FD9" b="9D F5"/>
+ <a u="6FDA" b="9D F6"/>
+ <a u="6FDB" b="9D F7"/>
+ <a u="6FDC" b="9D F8"/>
+ <a u="6FDD" b="9D F9"/>
+ <a u="6FDE" b="E5 A8"/>
+ <a u="6FDF" b="9D FA"/>
+ <a u="6FE0" b="E5 A9"/>
+ <a u="6FE1" b="E5 A6"/>
+ <a u="6FE2" b="9D FB"/>
+ <a u="6FE3" b="9D FC"/>
+ <a u="6FE4" b="9D FD"/>
+ <a u="6FE5" b="9D FE"/>
+ <a u="6FE6" b="9E 40"/>
+ <a u="6FE7" b="9E 41"/>
+ <a u="6FE8" b="9E 42"/>
+ <a u="6FE9" b="9E 43"/>
+ <a u="6FEA" b="9E 44"/>
+ <a u="6FEB" b="9E 45"/>
+ <a u="6FEC" b="9E 46"/>
+ <a u="6FED" b="9E 47"/>
+ <a u="6FEE" b="E5 A7"/>
+ <a u="6FEF" b="E5 AA"/>
+ <a u="6FF0" b="9E 48"/>
+ <a u="6FF1" b="9E 49"/>
+ <a u="6FF2" b="9E 4A"/>
+ <a u="6FF3" b="9E 4B"/>
+ <a u="6FF4" b="9E 4C"/>
+ <a u="6FF5" b="9E 4D"/>
+ <a u="6FF6" b="9E 4E"/>
+ <a u="6FF7" b="9E 4F"/>
+ <a u="6FF8" b="9E 50"/>
+ <a u="6FF9" b="9E 51"/>
+ <a u="6FFA" b="9E 52"/>
+ <a u="6FFB" b="9E 53"/>
+ <a u="6FFC" b="9E 54"/>
+ <a u="6FFD" b="9E 55"/>
+ <a u="6FFE" b="9E 56"/>
+ <a u="6FFF" b="9E 57"/>
+ <a u="7000" b="9E 58"/>
+ <a u="7001" b="9E 59"/>
+ <a u="7002" b="9E 5A"/>
+ <a u="7003" b="9E 5B"/>
+ <a u="7004" b="9E 5C"/>
+ <a u="7005" b="9E 5D"/>
+ <a u="7006" b="9E 5E"/>
+ <a u="7007" b="9E 5F"/>
+ <a u="7008" b="9E 60"/>
+ <a u="7009" b="9E 61"/>
+ <a u="700A" b="9E 62"/>
+ <a u="700B" b="9E 63"/>
+ <a u="700C" b="9E 64"/>
+ <a u="700D" b="9E 65"/>
+ <a u="700E" b="9E 66"/>
+ <a u="700F" b="9E 67"/>
+ <a u="7010" b="9E 68"/>
+ <a u="7011" b="C6 D9"/>
+ <a u="7012" b="9E 69"/>
+ <a u="7013" b="9E 6A"/>
+ <a u="7014" b="9E 6B"/>
+ <a u="7015" b="9E 6C"/>
+ <a u="7016" b="9E 6D"/>
+ <a u="7017" b="9E 6E"/>
+ <a u="7018" b="9E 6F"/>
+ <a u="7019" b="9E 70"/>
+ <a u="701A" b="E5 AB"/>
+ <a u="701B" b="E5 AD"/>
+ <a u="701C" b="9E 71"/>
+ <a u="701D" b="9E 72"/>
+ <a u="701E" b="9E 73"/>
+ <a u="701F" b="9E 74"/>
+ <a u="7020" b="9E 75"/>
+ <a u="7021" b="9E 76"/>
+ <a u="7022" b="9E 77"/>
+ <a u="7023" b="E5 AC"/>
+ <a u="7024" b="9E 78"/>
+ <a u="7025" b="9E 79"/>
+ <a u="7026" b="9E 7A"/>
+ <a u="7027" b="9E 7B"/>
+ <a u="7028" b="9E 7C"/>
+ <a u="7029" b="9E 7D"/>
+ <a u="702A" b="9E 7E"/>
+ <a u="702B" b="9E 80"/>
+ <a u="702C" b="9E 81"/>
+ <a u="702D" b="9E 82"/>
+ <a u="702E" b="9E 83"/>
+ <a u="702F" b="9E 84"/>
+ <a u="7030" b="9E 85"/>
+ <a u="7031" b="9E 86"/>
+ <a u="7032" b="9E 87"/>
+ <a u="7033" b="9E 88"/>
+ <a u="7034" b="9E 89"/>
+ <a u="7035" b="E5 AF"/>
+ <a u="7036" b="9E 8A"/>
+ <a u="7037" b="9E 8B"/>
+ <a u="7038" b="9E 8C"/>
+ <a u="7039" b="E5 AE"/>
+ <a u="703A" b="9E 8D"/>
+ <a u="703B" b="9E 8E"/>
+ <a u="703C" b="9E 8F"/>
+ <a u="703D" b="9E 90"/>
+ <a u="703E" b="9E 91"/>
+ <a u="703F" b="9E 92"/>
+ <a u="7040" b="9E 93"/>
+ <a u="7041" b="9E 94"/>
+ <a u="7042" b="9E 95"/>
+ <a u="7043" b="9E 96"/>
+ <a u="7044" b="9E 97"/>
+ <a u="7045" b="9E 98"/>
+ <a u="7046" b="9E 99"/>
+ <a u="7047" b="9E 9A"/>
+ <a u="7048" b="9E 9B"/>
+ <a u="7049" b="9E 9C"/>
+ <a u="704A" b="9E 9D"/>
+ <a u="704B" b="9E 9E"/>
+ <a u="704C" b="B9 E0"/>
+ <a u="704D" b="9E 9F"/>
+ <a u="704E" b="9E A0"/>
+ <a u="704F" b="E5 B0"/>
+ <a u="7050" b="9E A1"/>
+ <a u="7051" b="9E A2"/>
+ <a u="7052" b="9E A3"/>
+ <a u="7053" b="9E A4"/>
+ <a u="7054" b="9E A5"/>
+ <a u="7055" b="9E A6"/>
+ <a u="7056" b="9E A7"/>
+ <a u="7057" b="9E A8"/>
+ <a u="7058" b="9E A9"/>
+ <a u="7059" b="9E AA"/>
+ <a u="705A" b="9E AB"/>
+ <a u="705B" b="9E AC"/>
+ <a u="705C" b="9E AD"/>
+ <a u="705D" b="9E AE"/>
+ <a u="705E" b="E5 B1"/>
+ <a u="705F" b="9E AF"/>
+ <a u="7060" b="9E B0"/>
+ <a u="7061" b="9E B1"/>
+ <a u="7062" b="9E B2"/>
+ <a u="7063" b="9E B3"/>
+ <a u="7064" b="9E B4"/>
+ <a u="7065" b="9E B5"/>
+ <a u="7066" b="9E B6"/>
+ <a u="7067" b="9E B7"/>
+ <a u="7068" b="9E B8"/>
+ <a u="7069" b="9E B9"/>
+ <a u="706A" b="9E BA"/>
+ <a u="706B" b="BB F0"/>
+ <a u="706C" b="EC E1"/>
+ <a u="706D" b="C3 F0"/>
+ <a u="706E" b="9E BB"/>
+ <a u="706F" b="B5 C6"/>
+ <a u="7070" b="BB D2"/>
+ <a u="7071" b="9E BC"/>
+ <a u="7072" b="9E BD"/>
+ <a u="7073" b="9E BE"/>
+ <a u="7074" b="9E BF"/>
+ <a u="7075" b="C1 E9"/>
+ <a u="7076" b="D4 EE"/>
+ <a u="7077" b="9E C0"/>
+ <a u="7078" b="BE C4"/>
+ <a u="7079" b="9E C1"/>
+ <a u="707A" b="9E C2"/>
+ <a u="707B" b="9E C3"/>
+ <a u="707C" b="D7 C6"/>
+ <a u="707D" b="9E C4"/>
+ <a u="707E" b="D4 D6"/>
+ <a u="707F" b="B2 D3"/>
+ <a u="7080" b="EC BE"/>
+ <a u="7081" b="9E C5"/>
+ <a u="7082" b="9E C6"/>
+ <a u="7083" b="9E C7"/>
+ <a u="7084" b="9E C8"/>
+ <a u="7085" b="EA C1"/>
+ <a u="7086" b="9E C9"/>
+ <a u="7087" b="9E CA"/>
+ <a u="7088" b="9E CB"/>
+ <a u="7089" b="C2 AF"/>
+ <a u="708A" b="B4 B6"/>
+ <a u="708B" b="9E CC"/>
+ <a u="708C" b="9E CD"/>
+ <a u="708D" b="9E CE"/>
+ <a u="708E" b="D1 D7"/>
+ <a u="708F" b="9E CF"/>
+ <a u="7090" b="9E D0"/>
+ <a u="7091" b="9E D1"/>
+ <a u="7092" b="B3 B4"/>
+ <a u="7093" b="9E D2"/>
+ <a u="7094" b="C8 B2"/>
+ <a u="7095" b="BF BB"/>
+ <a u="7096" b="EC C0"/>
+ <a u="7097" b="9E D3"/>
+ <a u="7098" b="9E D4"/>
+ <a u="7099" b="D6 CB"/>
+ <a u="709A" b="9E D5"/>
+ <a u="709B" b="9E D6"/>
+ <a u="709C" b="EC BF"/>
+ <a u="709D" b="EC C1"/>
+ <a u="709E" b="9E D7"/>
+ <a u="709F" b="9E D8"/>
+ <a u="70A0" b="9E D9"/>
+ <a u="70A1" b="9E DA"/>
+ <a u="70A2" b="9E DB"/>
+ <a u="70A3" b="9E DC"/>
+ <a u="70A4" b="9E DD"/>
+ <a u="70A5" b="9E DE"/>
+ <a u="70A6" b="9E DF"/>
+ <a u="70A7" b="9E E0"/>
+ <a u="70A8" b="9E E1"/>
+ <a u="70A9" b="9E E2"/>
+ <a u="70AA" b="9E E3"/>
+ <a u="70AB" b="EC C5"/>
+ <a u="70AC" b="BE E6"/>
+ <a u="70AD" b="CC BF"/>
+ <a u="70AE" b="C5 DA"/>
+ <a u="70AF" b="BE BC"/>
+ <a u="70B0" b="9E E4"/>
+ <a u="70B1" b="EC C6"/>
+ <a u="70B2" b="9E E5"/>
+ <a u="70B3" b="B1 FE"/>
+ <a u="70B4" b="9E E6"/>
+ <a u="70B5" b="9E E7"/>
+ <a u="70B6" b="9E E8"/>
+ <a u="70B7" b="EC C4"/>
+ <a u="70B8" b="D5 A8"/>
+ <a u="70B9" b="B5 E3"/>
+ <a u="70BA" b="9E E9"/>
+ <a u="70BB" b="EC C2"/>
+ <a u="70BC" b="C1 B6"/>
+ <a u="70BD" b="B3 E3"/>
+ <a u="70BE" b="9E EA"/>
+ <a u="70BF" b="9E EB"/>
+ <a u="70C0" b="EC C3"/>
+ <a u="70C1" b="CB B8"/>
+ <a u="70C2" b="C0 C3"/>
+ <a u="70C3" b="CC FE"/>
+ <a u="70C4" b="9E EC"/>
+ <a u="70C5" b="9E ED"/>
+ <a u="70C6" b="9E EE"/>
+ <a u="70C7" b="9E EF"/>
+ <a u="70C8" b="C1 D2"/>
+ <a u="70C9" b="9E F0"/>
+ <a u="70CA" b="EC C8"/>
+ <a u="70CB" b="9E F1"/>
+ <a u="70CC" b="9E F2"/>
+ <a u="70CD" b="9E F3"/>
+ <a u="70CE" b="9E F4"/>
+ <a u="70CF" b="9E F5"/>
+ <a u="70D0" b="9E F6"/>
+ <a u="70D1" b="9E F7"/>
+ <a u="70D2" b="9E F8"/>
+ <a u="70D3" b="9E F9"/>
+ <a u="70D4" b="9E FA"/>
+ <a u="70D5" b="9E FB"/>
+ <a u="70D6" b="9E FC"/>
+ <a u="70D7" b="9E FD"/>
+ <a u="70D8" b="BA E6"/>
+ <a u="70D9" b="C0 D3"/>
+ <a u="70DA" b="9E FE"/>
+ <a u="70DB" b="D6 F2"/>
+ <a u="70DC" b="9F 40"/>
+ <a u="70DD" b="9F 41"/>
+ <a u="70DE" b="9F 42"/>
+ <a u="70DF" b="D1 CC"/>
+ <a u="70E0" b="9F 43"/>
+ <a u="70E1" b="9F 44"/>
+ <a u="70E2" b="9F 45"/>
+ <a u="70E3" b="9F 46"/>
+ <a u="70E4" b="BF BE"/>
+ <a u="70E5" b="9F 47"/>
+ <a u="70E6" b="B7 B3"/>
+ <a u="70E7" b="C9 D5"/>
+ <a u="70E8" b="EC C7"/>
+ <a u="70E9" b="BB E2"/>
+ <a u="70EA" b="9F 48"/>
+ <a u="70EB" b="CC CC"/>
+ <a u="70EC" b="BD FD"/>
+ <a u="70ED" b="C8 C8"/>
+ <a u="70EE" b="9F 49"/>
+ <a u="70EF" b="CF A9"/>
+ <a u="70F0" b="9F 4A"/>
+ <a u="70F1" b="9F 4B"/>
+ <a u="70F2" b="9F 4C"/>
+ <a u="70F3" b="9F 4D"/>
+ <a u="70F4" b="9F 4E"/>
+ <a u="70F5" b="9F 4F"/>
+ <a u="70F6" b="9F 50"/>
+ <a u="70F7" b="CD E9"/>
+ <a u="70F8" b="9F 51"/>
+ <a u="70F9" b="C5 EB"/>
+ <a u="70FA" b="9F 52"/>
+ <a u="70FB" b="9F 53"/>
+ <a u="70FC" b="9F 54"/>
+ <a u="70FD" b="B7 E9"/>
+ <a u="70FE" b="9F 55"/>
+ <a u="70FF" b="9F 56"/>
+ <a u="7100" b="9F 57"/>
+ <a u="7101" b="9F 58"/>
+ <a u="7102" b="9F 59"/>
+ <a u="7103" b="9F 5A"/>
+ <a u="7104" b="9F 5B"/>
+ <a u="7105" b="9F 5C"/>
+ <a u="7106" b="9F 5D"/>
+ <a u="7107" b="9F 5E"/>
+ <a u="7108" b="9F 5F"/>
+ <a u="7109" b="D1 C9"/>
+ <a u="710A" b="BA B8"/>
+ <a u="710B" b="9F 60"/>
+ <a u="710C" b="9F 61"/>
+ <a u="710D" b="9F 62"/>
+ <a u="710E" b="9F 63"/>
+ <a u="710F" b="9F 64"/>
+ <a u="7110" b="EC C9"/>
+ <a u="7111" b="9F 65"/>
+ <a u="7112" b="9F 66"/>
+ <a u="7113" b="EC CA"/>
+ <a u="7114" b="9F 67"/>
+ <a u="7115" b="BB C0"/>
+ <a u="7116" b="EC CB"/>
+ <a u="7117" b="9F 68"/>
+ <a u="7118" b="EC E2"/>
+ <a u="7119" b="B1 BA"/>
+ <a u="711A" b="B7 D9"/>
+ <a u="711B" b="9F 69"/>
+ <a u="711C" b="9F 6A"/>
+ <a u="711D" b="9F 6B"/>
+ <a u="711E" b="9F 6C"/>
+ <a u="711F" b="9F 6D"/>
+ <a u="7120" b="9F 6E"/>
+ <a u="7121" b="9F 6F"/>
+ <a u="7122" b="9F 70"/>
+ <a u="7123" b="9F 71"/>
+ <a u="7124" b="9F 72"/>
+ <a u="7125" b="9F 73"/>
+ <a u="7126" b="BD B9"/>
+ <a u="7127" b="9F 74"/>
+ <a u="7128" b="9F 75"/>
+ <a u="7129" b="9F 76"/>
+ <a u="712A" b="9F 77"/>
+ <a u="712B" b="9F 78"/>
+ <a u="712C" b="9F 79"/>
+ <a u="712D" b="9F 7A"/>
+ <a u="712E" b="9F 7B"/>
+ <a u="712F" b="EC CC"/>
+ <a u="7130" b="D1 E6"/>
+ <a u="7131" b="EC CD"/>
+ <a u="7132" b="9F 7C"/>
+ <a u="7133" b="9F 7D"/>
+ <a u="7134" b="9F 7E"/>
+ <a u="7135" b="9F 80"/>
+ <a u="7136" b="C8 BB"/>
+ <a u="7137" b="9F 81"/>
+ <a u="7138" b="9F 82"/>
+ <a u="7139" b="9F 83"/>
+ <a u="713A" b="9F 84"/>
+ <a u="713B" b="9F 85"/>
+ <a u="713C" b="9F 86"/>
+ <a u="713D" b="9F 87"/>
+ <a u="713E" b="9F 88"/>
+ <a u="713F" b="9F 89"/>
+ <a u="7140" b="9F 8A"/>
+ <a u="7141" b="9F 8B"/>
+ <a u="7142" b="9F 8C"/>
+ <a u="7143" b="9F 8D"/>
+ <a u="7144" b="9F 8E"/>
+ <a u="7145" b="EC D1"/>
+ <a u="7146" b="9F 8F"/>
+ <a u="7147" b="9F 90"/>
+ <a u="7148" b="9F 91"/>
+ <a u="7149" b="9F 92"/>
+ <a u="714A" b="EC D3"/>
+ <a u="714B" b="9F 93"/>
+ <a u="714C" b="BB CD"/>
+ <a u="714D" b="9F 94"/>
+ <a u="714E" b="BC E5"/>
+ <a u="714F" b="9F 95"/>
+ <a u="7150" b="9F 96"/>
+ <a u="7151" b="9F 97"/>
+ <a u="7152" b="9F 98"/>
+ <a u="7153" b="9F 99"/>
+ <a u="7154" b="9F 9A"/>
+ <a u="7155" b="9F 9B"/>
+ <a u="7156" b="9F 9C"/>
+ <a u="7157" b="9F 9D"/>
+ <a u="7158" b="9F 9E"/>
+ <a u="7159" b="9F 9F"/>
+ <a u="715A" b="9F A0"/>
+ <a u="715B" b="9F A1"/>
+ <a u="715C" b="EC CF"/>
+ <a u="715D" b="9F A2"/>
+ <a u="715E" b="C9 B7"/>
+ <a u="715F" b="9F A3"/>
+ <a u="7160" b="9F A4"/>
+ <a u="7161" b="9F A5"/>
+ <a u="7162" b="9F A6"/>
+ <a u="7163" b="9F A7"/>
+ <a u="7164" b="C3 BA"/>
+ <a u="7165" b="9F A8"/>
+ <a u="7166" b="EC E3"/>
+ <a u="7167" b="D5 D5"/>
+ <a u="7168" b="EC D0"/>
+ <a u="7169" b="9F A9"/>
+ <a u="716A" b="9F AA"/>
+ <a u="716B" b="9F AB"/>
+ <a u="716C" b="9F AC"/>
+ <a u="716D" b="9F AD"/>
+ <a u="716E" b="D6 F3"/>
+ <a u="716F" b="9F AE"/>
+ <a u="7170" b="9F AF"/>
+ <a u="7171" b="9F B0"/>
+ <a u="7172" b="EC D2"/>
+ <a u="7173" b="EC CE"/>
+ <a u="7174" b="9F B1"/>
+ <a u="7175" b="9F B2"/>
+ <a u="7176" b="9F B3"/>
+ <a u="7177" b="9F B4"/>
+ <a u="7178" b="EC D4"/>
+ <a u="7179" b="9F B5"/>
+ <a u="717A" b="EC D5"/>
+ <a u="717B" b="9F B6"/>
+ <a u="717C" b="9F B7"/>
+ <a u="717D" b="C9 BF"/>
+ <a u="717E" b="9F B8"/>
+ <a u="717F" b="9F B9"/>
+ <a u="7180" b="9F BA"/>
+ <a u="7181" b="9F BB"/>
+ <a u="7182" b="9F BC"/>
+ <a u="7183" b="9F BD"/>
+ <a u="7184" b="CF A8"/>
+ <a u="7185" b="9F BE"/>
+ <a u="7186" b="9F BF"/>
+ <a u="7187" b="9F C0"/>
+ <a u="7188" b="9F C1"/>
+ <a u="7189" b="9F C2"/>
+ <a u="718A" b="D0 DC"/>
+ <a u="718B" b="9F C3"/>
+ <a u="718C" b="9F C4"/>
+ <a u="718D" b="9F C5"/>
+ <a u="718E" b="9F C6"/>
+ <a u="718F" b="D1 AC"/>
+ <a u="7190" b="9F C7"/>
+ <a u="7191" b="9F C8"/>
+ <a u="7192" b="9F C9"/>
+ <a u="7193" b="9F CA"/>
+ <a u="7194" b="C8 DB"/>
+ <a u="7195" b="9F CB"/>
+ <a u="7196" b="9F CC"/>
+ <a u="7197" b="9F CD"/>
+ <a u="7198" b="EC D6"/>
+ <a u="7199" b="CE F5"/>
+ <a u="719A" b="9F CE"/>
+ <a u="719B" b="9F CF"/>
+ <a u="719C" b="9F D0"/>
+ <a u="719D" b="9F D1"/>
+ <a u="719E" b="9F D2"/>
+ <a u="719F" b="CA EC"/>
+ <a u="71A0" b="EC DA"/>
+ <a u="71A1" b="9F D3"/>
+ <a u="71A2" b="9F D4"/>
+ <a u="71A3" b="9F D5"/>
+ <a u="71A4" b="9F D6"/>
+ <a u="71A5" b="9F D7"/>
+ <a u="71A6" b="9F D8"/>
+ <a u="71A7" b="9F D9"/>
+ <a u="71A8" b="EC D9"/>
+ <a u="71A9" b="9F DA"/>
+ <a u="71AA" b="9F DB"/>
+ <a u="71AB" b="9F DC"/>
+ <a u="71AC" b="B0 BE"/>
+ <a u="71AD" b="9F DD"/>
+ <a u="71AE" b="9F DE"/>
+ <a u="71AF" b="9F DF"/>
+ <a u="71B0" b="9F E0"/>
+ <a u="71B1" b="9F E1"/>
+ <a u="71B2" b="9F E2"/>
+ <a u="71B3" b="EC D7"/>
+ <a u="71B4" b="9F E3"/>
+ <a u="71B5" b="EC D8"/>
+ <a u="71B6" b="9F E4"/>
+ <a u="71B7" b="9F E5"/>
+ <a u="71B8" b="9F E6"/>
+ <a u="71B9" b="EC E4"/>
+ <a u="71BA" b="9F E7"/>
+ <a u="71BB" b="9F E8"/>
+ <a u="71BC" b="9F E9"/>
+ <a u="71BD" b="9F EA"/>
+ <a u="71BE" b="9F EB"/>
+ <a u="71BF" b="9F EC"/>
+ <a u="71C0" b="9F ED"/>
+ <a u="71C1" b="9F EE"/>
+ <a u="71C2" b="9F EF"/>
+ <a u="71C3" b="C8 BC"/>
+ <a u="71C4" b="9F F0"/>
+ <a u="71C5" b="9F F1"/>
+ <a u="71C6" b="9F F2"/>
+ <a u="71C7" b="9F F3"/>
+ <a u="71C8" b="9F F4"/>
+ <a u="71C9" b="9F F5"/>
+ <a u="71CA" b="9F F6"/>
+ <a u="71CB" b="9F F7"/>
+ <a u="71CC" b="9F F8"/>
+ <a u="71CD" b="9F F9"/>
+ <a u="71CE" b="C1 C7"/>
+ <a u="71CF" b="9F FA"/>
+ <a u="71D0" b="9F FB"/>
+ <a u="71D1" b="9F FC"/>
+ <a u="71D2" b="9F FD"/>
+ <a u="71D3" b="9F FE"/>
+ <a u="71D4" b="EC DC"/>
+ <a u="71D5" b="D1 E0"/>
+ <a u="71D6" b="A0 40"/>
+ <a u="71D7" b="A0 41"/>
+ <a u="71D8" b="A0 42"/>
+ <a u="71D9" b="A0 43"/>
+ <a u="71DA" b="A0 44"/>
+ <a u="71DB" b="A0 45"/>
+ <a u="71DC" b="A0 46"/>
+ <a u="71DD" b="A0 47"/>
+ <a u="71DE" b="A0 48"/>
+ <a u="71DF" b="A0 49"/>
+ <a u="71E0" b="EC DB"/>
+ <a u="71E1" b="A0 4A"/>
+ <a u="71E2" b="A0 4B"/>
+ <a u="71E3" b="A0 4C"/>
+ <a u="71E4" b="A0 4D"/>
+ <a u="71E5" b="D4 EF"/>
+ <a u="71E6" b="A0 4E"/>
+ <a u="71E7" b="EC DD"/>
+ <a u="71E8" b="A0 4F"/>
+ <a u="71E9" b="A0 50"/>
+ <a u="71EA" b="A0 51"/>
+ <a u="71EB" b="A0 52"/>
+ <a u="71EC" b="A0 53"/>
+ <a u="71ED" b="A0 54"/>
+ <a u="71EE" b="DB C6"/>
+ <a u="71EF" b="A0 55"/>
+ <a u="71F0" b="A0 56"/>
+ <a u="71F1" b="A0 57"/>
+ <a u="71F2" b="A0 58"/>
+ <a u="71F3" b="A0 59"/>
+ <a u="71F4" b="A0 5A"/>
+ <a u="71F5" b="A0 5B"/>
+ <a u="71F6" b="A0 5C"/>
+ <a u="71F7" b="A0 5D"/>
+ <a u="71F8" b="A0 5E"/>
+ <a u="71F9" b="EC DE"/>
+ <a u="71FA" b="A0 5F"/>
+ <a u="71FB" b="A0 60"/>
+ <a u="71FC" b="A0 61"/>
+ <a u="71FD" b="A0 62"/>
+ <a u="71FE" b="A0 63"/>
+ <a u="71FF" b="A0 64"/>
+ <a u="7200" b="A0 65"/>
+ <a u="7201" b="A0 66"/>
+ <a u="7202" b="A0 67"/>
+ <a u="7203" b="A0 68"/>
+ <a u="7204" b="A0 69"/>
+ <a u="7205" b="A0 6A"/>
+ <a u="7206" b="B1 AC"/>
+ <a u="7207" b="A0 6B"/>
+ <a u="7208" b="A0 6C"/>
+ <a u="7209" b="A0 6D"/>
+ <a u="720A" b="A0 6E"/>
+ <a u="720B" b="A0 6F"/>
+ <a u="720C" b="A0 70"/>
+ <a u="720D" b="A0 71"/>
+ <a u="720E" b="A0 72"/>
+ <a u="720F" b="A0 73"/>
+ <a u="7210" b="A0 74"/>
+ <a u="7211" b="A0 75"/>
+ <a u="7212" b="A0 76"/>
+ <a u="7213" b="A0 77"/>
+ <a u="7214" b="A0 78"/>
+ <a u="7215" b="A0 79"/>
+ <a u="7216" b="A0 7A"/>
+ <a u="7217" b="A0 7B"/>
+ <a u="7218" b="A0 7C"/>
+ <a u="7219" b="A0 7D"/>
+ <a u="721A" b="A0 7E"/>
+ <a u="721B" b="A0 80"/>
+ <a u="721C" b="A0 81"/>
+ <a u="721D" b="EC DF"/>
+ <a u="721E" b="A0 82"/>
+ <a u="721F" b="A0 83"/>
+ <a u="7220" b="A0 84"/>
+ <a u="7221" b="A0 85"/>
+ <a u="7222" b="A0 86"/>
+ <a u="7223" b="A0 87"/>
+ <a u="7224" b="A0 88"/>
+ <a u="7225" b="A0 89"/>
+ <a u="7226" b="A0 8A"/>
+ <a u="7227" b="A0 8B"/>
+ <a u="7228" b="EC E0"/>
+ <a u="7229" b="A0 8C"/>
+ <a u="722A" b="D7 A6"/>
+ <a u="722B" b="A0 8D"/>
+ <a u="722C" b="C5 C0"/>
+ <a u="722D" b="A0 8E"/>
+ <a u="722E" b="A0 8F"/>
+ <a u="722F" b="A0 90"/>
+ <a u="7230" b="EB BC"/>
+ <a u="7231" b="B0 AE"/>
+ <a u="7232" b="A0 91"/>
+ <a u="7233" b="A0 92"/>
+ <a u="7234" b="A0 93"/>
+ <a u="7235" b="BE F4"/>
+ <a u="7236" b="B8 B8"/>
+ <a u="7237" b="D2 AF"/>
+ <a u="7238" b="B0 D6"/>
+ <a u="7239" b="B5 F9"/>
+ <a u="723A" b="A0 94"/>
+ <a u="723B" b="D8 B3"/>
+ <a u="723C" b="A0 95"/>
+ <a u="723D" b="CB AC"/>
+ <a u="723E" b="A0 96"/>
+ <a u="723F" b="E3 DD"/>
+ <a u="7240" b="A0 97"/>
+ <a u="7241" b="A0 98"/>
+ <a u="7242" b="A0 99"/>
+ <a u="7243" b="A0 9A"/>
+ <a u="7244" b="A0 9B"/>
+ <a u="7245" b="A0 9C"/>
+ <a u="7246" b="A0 9D"/>
+ <a u="7247" b="C6 AC"/>
+ <a u="7248" b="B0 E6"/>
+ <a u="7249" b="A0 9E"/>
+ <a u="724A" b="A0 9F"/>
+ <a u="724B" b="A0 A0"/>
+ <a u="724C" b="C5 C6"/>
+ <a u="724D" b="EB B9"/>
+ <a u="724E" b="A0 A1"/>
+ <a u="724F" b="A0 A2"/>
+ <a u="7250" b="A0 A3"/>
+ <a u="7251" b="A0 A4"/>
+ <a u="7252" b="EB BA"/>
+ <a u="7253" b="A0 A5"/>
+ <a u="7254" b="A0 A6"/>
+ <a u="7255" b="A0 A7"/>
+ <a u="7256" b="EB BB"/>
+ <a u="7257" b="A0 A8"/>
+ <a u="7258" b="A0 A9"/>
+ <a u="7259" b="D1 C0"/>
+ <a u="725A" b="A0 AA"/>
+ <a u="725B" b="C5 A3"/>
+ <a u="725C" b="A0 AB"/>
+ <a u="725D" b="EA F2"/>
+ <a u="725E" b="A0 AC"/>
+ <a u="725F" b="C4 B2"/>
+ <a u="7260" b="A0 AD"/>
+ <a u="7261" b="C4 B5"/>
+ <a u="7262" b="C0 CE"/>
+ <a u="7263" b="A0 AE"/>
+ <a u="7264" b="A0 AF"/>
+ <a u="7265" b="A0 B0"/>
+ <a u="7266" b="EA F3"/>
+ <a u="7267" b="C4 C1"/>
+ <a u="7268" b="A0 B1"/>
+ <a u="7269" b="CE EF"/>
+ <a u="726A" b="A0 B2"/>
+ <a u="726B" b="A0 B3"/>
+ <a u="726C" b="A0 B4"/>
+ <a u="726D" b="A0 B5"/>
+ <a u="726E" b="EA F0"/>
+ <a u="726F" b="EA F4"/>
+ <a u="7270" b="A0 B6"/>
+ <a u="7271" b="A0 B7"/>
+ <a u="7272" b="C9 FC"/>
+ <a u="7273" b="A0 B8"/>
+ <a u="7274" b="A0 B9"/>
+ <a u="7275" b="C7 A3"/>
+ <a u="7276" b="A0 BA"/>
+ <a u="7277" b="A0 BB"/>
+ <a u="7278" b="A0 BC"/>
+ <a u="7279" b="CC D8"/>
+ <a u="727A" b="CE FE"/>
+ <a u="727B" b="A0 BD"/>
+ <a u="727C" b="A0 BE"/>
+ <a u="727D" b="A0 BF"/>
+ <a u="727E" b="EA F5"/>
+ <a u="727F" b="EA F6"/>
+ <a u="7280" b="CF AC"/>
+ <a u="7281" b="C0 E7"/>
+ <a u="7282" b="A0 C0"/>
+ <a u="7283" b="A0 C1"/>
+ <a u="7284" b="EA F7"/>
+ <a u="7285" b="A0 C2"/>
+ <a u="7286" b="A0 C3"/>
+ <a u="7287" b="A0 C4"/>
+ <a u="7288" b="A0 C5"/>
+ <a u="7289" b="A0 C6"/>
+ <a u="728A" b="B6 BF"/>
+ <a u="728B" b="EA F8"/>
+ <a u="728C" b="A0 C7"/>
+ <a u="728D" b="EA F9"/>
+ <a u="728E" b="A0 C8"/>
+ <a u="728F" b="EA FA"/>
+ <a u="7290" b="A0 C9"/>
+ <a u="7291" b="A0 CA"/>
+ <a u="7292" b="EA FB"/>
+ <a u="7293" b="A0 CB"/>
+ <a u="7294" b="A0 CC"/>
+ <a u="7295" b="A0 CD"/>
+ <a u="7296" b="A0 CE"/>
+ <a u="7297" b="A0 CF"/>
+ <a u="7298" b="A0 D0"/>
+ <a u="7299" b="A0 D1"/>
+ <a u="729A" b="A0 D2"/>
+ <a u="729B" b="A0 D3"/>
+ <a u="729C" b="A0 D4"/>
+ <a u="729D" b="A0 D5"/>
+ <a u="729E" b="A0 D6"/>
+ <a u="729F" b="EA F1"/>
+ <a u="72A0" b="A0 D7"/>
+ <a u="72A1" b="A0 D8"/>
+ <a u="72A2" b="A0 D9"/>
+ <a u="72A3" b="A0 DA"/>
+ <a u="72A4" b="A0 DB"/>
+ <a u="72A5" b="A0 DC"/>
+ <a u="72A6" b="A0 DD"/>
+ <a u="72A7" b="A0 DE"/>
+ <a u="72A8" b="A0 DF"/>
+ <a u="72A9" b="A0 E0"/>
+ <a u="72AA" b="A0 E1"/>
+ <a u="72AB" b="A0 E2"/>
+ <a u="72AC" b="C8 AE"/>
+ <a u="72AD" b="E1 EB"/>
+ <a u="72AE" b="A0 E3"/>
+ <a u="72AF" b="B7 B8"/>
+ <a u="72B0" b="E1 EC"/>
+ <a u="72B1" b="A0 E4"/>
+ <a u="72B2" b="A0 E5"/>
+ <a u="72B3" b="A0 E6"/>
+ <a u="72B4" b="E1 ED"/>
+ <a u="72B5" b="A0 E7"/>
+ <a u="72B6" b="D7 B4"/>
+ <a u="72B7" b="E1 EE"/>
+ <a u="72B8" b="E1 EF"/>
+ <a u="72B9" b="D3 CC"/>
+ <a u="72BA" b="A0 E8"/>
+ <a u="72BB" b="A0 E9"/>
+ <a u="72BC" b="A0 EA"/>
+ <a u="72BD" b="A0 EB"/>
+ <a u="72BE" b="A0 EC"/>
+ <a u="72BF" b="A0 ED"/>
+ <a u="72C0" b="A0 EE"/>
+ <a u="72C1" b="E1 F1"/>
+ <a u="72C2" b="BF F1"/>
+ <a u="72C3" b="E1 F0"/>
+ <a u="72C4" b="B5 D2"/>
+ <a u="72C5" b="A0 EF"/>
+ <a u="72C6" b="A0 F0"/>
+ <a u="72C7" b="A0 F1"/>
+ <a u="72C8" b="B1 B7"/>
+ <a u="72C9" b="A0 F2"/>
+ <a u="72CA" b="A0 F3"/>
+ <a u="72CB" b="A0 F4"/>
+ <a u="72CC" b="A0 F5"/>
+ <a u="72CD" b="E1 F3"/>
+ <a u="72CE" b="E1 F2"/>
+ <a u="72CF" b="A0 F6"/>
+ <a u="72D0" b="BA FC"/>
+ <a u="72D1" b="A0 F7"/>
+ <a u="72D2" b="E1 F4"/>
+ <a u="72D3" b="A0 F8"/>
+ <a u="72D4" b="A0 F9"/>
+ <a u="72D5" b="A0 FA"/>
+ <a u="72D6" b="A0 FB"/>
+ <a u="72D7" b="B9 B7"/>
+ <a u="72D8" b="A0 FC"/>
+ <a u="72D9" b="BE D1"/>
+ <a u="72DA" b="A0 FD"/>
+ <a u="72DB" b="A0 FE"/>
+ <a u="72DC" b="AA 40"/>
+ <a u="72DD" b="AA 41"/>
+ <a u="72DE" b="C4 FC"/>
+ <a u="72DF" b="AA 42"/>
+ <a u="72E0" b="BA DD"/>
+ <a u="72E1" b="BD C6"/>
+ <a u="72E2" b="AA 43"/>
+ <a u="72E3" b="AA 44"/>
+ <a u="72E4" b="AA 45"/>
+ <a u="72E5" b="AA 46"/>
+ <a u="72E6" b="AA 47"/>
+ <a u="72E7" b="AA 48"/>
+ <a u="72E8" b="E1 F5"/>
+ <a u="72E9" b="E1 F7"/>
+ <a u="72EA" b="AA 49"/>
+ <a u="72EB" b="AA 4A"/>
+ <a u="72EC" b="B6 C0"/>
+ <a u="72ED" b="CF C1"/>
+ <a u="72EE" b="CA A8"/>
+ <a u="72EF" b="E1 F6"/>
+ <a u="72F0" b="D5 F8"/>
+ <a u="72F1" b="D3 FC"/>
+ <a u="72F2" b="E1 F8"/>
+ <a u="72F3" b="E1 FC"/>
+ <a u="72F4" b="E1 F9"/>
+ <a u="72F5" b="AA 4B"/>
+ <a u="72F6" b="AA 4C"/>
+ <a u="72F7" b="E1 FA"/>
+ <a u="72F8" b="C0 EA"/>
+ <a u="72F9" b="AA 4D"/>
+ <a u="72FA" b="E1 FE"/>
+ <a u="72FB" b="E2 A1"/>
+ <a u="72FC" b="C0 C7"/>
+ <a u="72FD" b="AA 4E"/>
+ <a u="72FE" b="AA 4F"/>
+ <a u="72FF" b="AA 50"/>
+ <a u="7300" b="AA 51"/>
+ <a u="7301" b="E1 FB"/>
+ <a u="7302" b="AA 52"/>
+ <a u="7303" b="E1 FD"/>
+ <a u="7304" b="AA 53"/>
+ <a u="7305" b="AA 54"/>
+ <a u="7306" b="AA 55"/>
+ <a u="7307" b="AA 56"/>
+ <a u="7308" b="AA 57"/>
+ <a u="7309" b="AA 58"/>
+ <a u="730A" b="E2 A5"/>
+ <a u="730B" b="AA 59"/>
+ <a u="730C" b="AA 5A"/>
+ <a u="730D" b="AA 5B"/>
+ <a u="730E" b="C1 D4"/>
+ <a u="730F" b="AA 5C"/>
+ <a u="7310" b="AA 5D"/>
+ <a u="7311" b="AA 5E"/>
+ <a u="7312" b="AA 5F"/>
+ <a u="7313" b="E2 A3"/>
+ <a u="7314" b="AA 60"/>
+ <a u="7315" b="E2 A8"/>
+ <a u="7316" b="B2 FE"/>
+ <a u="7317" b="E2 A2"/>
+ <a u="7318" b="AA 61"/>
+ <a u="7319" b="AA 62"/>
+ <a u="731A" b="AA 63"/>
+ <a u="731B" b="C3 CD"/>
+ <a u="731C" b="B2 C2"/>
+ <a u="731D" b="E2 A7"/>
+ <a u="731E" b="E2 A6"/>
+ <a u="731F" b="AA 64"/>
+ <a u="7320" b="AA 65"/>
+ <a u="7321" b="E2 A4"/>
+ <a u="7322" b="E2 A9"/>
+ <a u="7323" b="AA 66"/>
+ <a u="7324" b="AA 67"/>
+ <a u="7325" b="E2 AB"/>
+ <a u="7326" b="AA 68"/>
+ <a u="7327" b="AA 69"/>
+ <a u="7328" b="AA 6A"/>
+ <a u="7329" b="D0 C9"/>
+ <a u="732A" b="D6 ED"/>
+ <a u="732B" b="C3 A8"/>
+ <a u="732C" b="E2 AC"/>
+ <a u="732D" b="AA 6B"/>
+ <a u="732E" b="CF D7"/>
+ <a u="732F" b="AA 6C"/>
+ <a u="7330" b="AA 6D"/>
+ <a u="7331" b="E2 AE"/>
+ <a u="7332" b="AA 6E"/>
+ <a u="7333" b="AA 6F"/>
+ <a u="7334" b="BA EF"/>
+ <a u="7335" b="AA 70"/>
+ <a u="7336" b="AA 71"/>
+ <a u="7337" b="E9 E0"/>
+ <a u="7338" b="E2 AD"/>
+ <a u="7339" b="E2 AA"/>
+ <a u="733A" b="AA 72"/>
+ <a u="733B" b="AA 73"/>
+ <a u="733C" b="AA 74"/>
+ <a u="733D" b="AA 75"/>
+ <a u="733E" b="BB AB"/>
+ <a u="733F" b="D4 B3"/>
+ <a u="7340" b="AA 76"/>
+ <a u="7341" b="AA 77"/>
+ <a u="7342" b="AA 78"/>
+ <a u="7343" b="AA 79"/>
+ <a u="7344" b="AA 7A"/>
+ <a u="7345" b="AA 7B"/>
+ <a u="7346" b="AA 7C"/>
+ <a u="7347" b="AA 7D"/>
+ <a u="7348" b="AA 7E"/>
+ <a u="7349" b="AA 80"/>
+ <a u="734A" b="AA 81"/>
+ <a u="734B" b="AA 82"/>
+ <a u="734C" b="AA 83"/>
+ <a u="734D" b="E2 B0"/>
+ <a u="734E" b="AA 84"/>
+ <a u="734F" b="AA 85"/>
+ <a u="7350" b="E2 AF"/>
+ <a u="7351" b="AA 86"/>
+ <a u="7352" b="E9 E1"/>
+ <a u="7353" b="AA 87"/>
+ <a u="7354" b="AA 88"/>
+ <a u="7355" b="AA 89"/>
+ <a u="7356" b="AA 8A"/>
+ <a u="7357" b="E2 B1"/>
+ <a u="7358" b="AA 8B"/>
+ <a u="7359" b="AA 8C"/>
+ <a u="735A" b="AA 8D"/>
+ <a u="735B" b="AA 8E"/>
+ <a u="735C" b="AA 8F"/>
+ <a u="735D" b="AA 90"/>
+ <a u="735E" b="AA 91"/>
+ <a u="735F" b="AA 92"/>
+ <a u="7360" b="E2 B2"/>
+ <a u="7361" b="AA 93"/>
+ <a u="7362" b="AA 94"/>
+ <a u="7363" b="AA 95"/>
+ <a u="7364" b="AA 96"/>
+ <a u="7365" b="AA 97"/>
+ <a u="7366" b="AA 98"/>
+ <a u="7367" b="AA 99"/>
+ <a u="7368" b="AA 9A"/>
+ <a u="7369" b="AA 9B"/>
+ <a u="736A" b="AA 9C"/>
+ <a u="736B" b="AA 9D"/>
+ <a u="736C" b="E2 B3"/>
+ <a u="736D" b="CC A1"/>
+ <a u="736E" b="AA 9E"/>
+ <a u="736F" b="E2 B4"/>
+ <a u="7370" b="AA 9F"/>
+ <a u="7371" b="AA A0"/>
+ <a u="7372" b="AB 40"/>
+ <a u="7373" b="AB 41"/>
+ <a u="7374" b="AB 42"/>
+ <a u="7375" b="AB 43"/>
+ <a u="7376" b="AB 44"/>
+ <a u="7377" b="AB 45"/>
+ <a u="7378" b="AB 46"/>
+ <a u="7379" b="AB 47"/>
+ <a u="737A" b="AB 48"/>
+ <a u="737B" b="AB 49"/>
+ <a u="737C" b="AB 4A"/>
+ <a u="737D" b="AB 4B"/>
+ <a u="737E" b="E2 B5"/>
+ <a u="737F" b="AB 4C"/>
+ <a u="7380" b="AB 4D"/>
+ <a u="7381" b="AB 4E"/>
+ <a u="7382" b="AB 4F"/>
+ <a u="7383" b="AB 50"/>
+ <a u="7384" b="D0 FE"/>
+ <a u="7385" b="AB 51"/>
+ <a u="7386" b="AB 52"/>
+ <a u="7387" b="C2 CA"/>
+ <a u="7388" b="AB 53"/>
+ <a u="7389" b="D3 F1"/>
+ <a u="738A" b="AB 54"/>
+ <a u="738B" b="CD F5"/>
+ <a u="738C" b="AB 55"/>
+ <a u="738D" b="AB 56"/>
+ <a u="738E" b="E7 E0"/>
+ <a u="738F" b="AB 57"/>
+ <a u="7390" b="AB 58"/>
+ <a u="7391" b="E7 E1"/>
+ <a u="7392" b="AB 59"/>
+ <a u="7393" b="AB 5A"/>
+ <a u="7394" b="AB 5B"/>
+ <a u="7395" b="AB 5C"/>
+ <a u="7396" b="BE C1"/>
+ <a u="7397" b="AB 5D"/>
+ <a u="7398" b="AB 5E"/>
+ <a u="7399" b="AB 5F"/>
+ <a u="739A" b="AB 60"/>
+ <a u="739B" b="C2 EA"/>
+ <a u="739C" b="AB 61"/>
+ <a u="739D" b="AB 62"/>
+ <a u="739E" b="AB 63"/>
+ <a u="739F" b="E7 E4"/>
+ <a u="73A0" b="AB 64"/>
+ <a u="73A1" b="AB 65"/>
+ <a u="73A2" b="E7 E3"/>
+ <a u="73A3" b="AB 66"/>
+ <a u="73A4" b="AB 67"/>
+ <a u="73A5" b="AB 68"/>
+ <a u="73A6" b="AB 69"/>
+ <a u="73A7" b="AB 6A"/>
+ <a u="73A8" b="AB 6B"/>
+ <a u="73A9" b="CD E6"/>
+ <a u="73AA" b="AB 6C"/>
+ <a u="73AB" b="C3 B5"/>
+ <a u="73AC" b="AB 6D"/>
+ <a u="73AD" b="AB 6E"/>
+ <a u="73AE" b="E7 E2"/>
+ <a u="73AF" b="BB B7"/>
+ <a u="73B0" b="CF D6"/>
+ <a u="73B1" b="AB 6F"/>
+ <a u="73B2" b="C1 E1"/>
+ <a u="73B3" b="E7 E9"/>
+ <a u="73B4" b="AB 70"/>
+ <a u="73B5" b="AB 71"/>
+ <a u="73B6" b="AB 72"/>
+ <a u="73B7" b="E7 E8"/>
+ <a u="73B8" b="AB 73"/>
+ <a u="73B9" b="AB 74"/>
+ <a u="73BA" b="E7 F4"/>
+ <a u="73BB" b="B2 A3"/>
+ <a u="73BC" b="AB 75"/>
+ <a u="73BD" b="AB 76"/>
+ <a u="73BE" b="AB 77"/>
+ <a u="73BF" b="AB 78"/>
+ <a u="73C0" b="E7 EA"/>
+ <a u="73C1" b="AB 79"/>
+ <a u="73C2" b="E7 E6"/>
+ <a u="73C3" b="AB 7A"/>
+ <a u="73C4" b="AB 7B"/>
+ <a u="73C5" b="AB 7C"/>
+ <a u="73C6" b="AB 7D"/>
+ <a u="73C7" b="AB 7E"/>
+ <a u="73C8" b="E7 EC"/>
+ <a u="73C9" b="E7 EB"/>
+ <a u="73CA" b="C9 BA"/>
+ <a u="73CB" b="AB 80"/>
+ <a u="73CC" b="AB 81"/>
+ <a u="73CD" b="D5 E4"/>
+ <a u="73CE" b="AB 82"/>
+ <a u="73CF" b="E7 E5"/>
+ <a u="73D0" b="B7 A9"/>
+ <a u="73D1" b="E7 E7"/>
+ <a u="73D2" b="AB 83"/>
+ <a u="73D3" b="AB 84"/>
+ <a u="73D4" b="AB 85"/>
+ <a u="73D5" b="AB 86"/>
+ <a u="73D6" b="AB 87"/>
+ <a u="73D7" b="AB 88"/>
+ <a u="73D8" b="AB 89"/>
+ <a u="73D9" b="E7 EE"/>
+ <a u="73DA" b="AB 8A"/>
+ <a u="73DB" b="AB 8B"/>
+ <a u="73DC" b="AB 8C"/>
+ <a u="73DD" b="AB 8D"/>
+ <a u="73DE" b="E7 F3"/>
+ <a u="73DF" b="AB 8E"/>
+ <a u="73E0" b="D6 E9"/>
+ <a u="73E1" b="AB 8F"/>
+ <a u="73E2" b="AB 90"/>
+ <a u="73E3" b="AB 91"/>
+ <a u="73E4" b="AB 92"/>
+ <a u="73E5" b="E7 ED"/>
+ <a u="73E6" b="AB 93"/>
+ <a u="73E7" b="E7 F2"/>
+ <a u="73E8" b="AB 94"/>
+ <a u="73E9" b="E7 F1"/>
+ <a u="73EA" b="AB 95"/>
+ <a u="73EB" b="AB 96"/>
+ <a u="73EC" b="AB 97"/>
+ <a u="73ED" b="B0 E0"/>
+ <a u="73EE" b="AB 98"/>
+ <a u="73EF" b="AB 99"/>
+ <a u="73F0" b="AB 9A"/>
+ <a u="73F1" b="AB 9B"/>
+ <a u="73F2" b="E7 F5"/>
+ <a u="73F3" b="AB 9C"/>
+ <a u="73F4" b="AB 9D"/>
+ <a u="73F5" b="AB 9E"/>
+ <a u="73F6" b="AB 9F"/>
+ <a u="73F7" b="AB A0"/>
+ <a u="73F8" b="AC 40"/>
+ <a u="73F9" b="AC 41"/>
+ <a u="73FA" b="AC 42"/>
+ <a u="73FB" b="AC 43"/>
+ <a u="73FC" b="AC 44"/>
+ <a u="73FD" b="AC 45"/>
+ <a u="73FE" b="AC 46"/>
+ <a u="73FF" b="AC 47"/>
+ <a u="7400" b="AC 48"/>
+ <a u="7401" b="AC 49"/>
+ <a u="7402" b="AC 4A"/>
+ <a u="7403" b="C7 F2"/>
+ <a u="7404" b="AC 4B"/>
+ <a u="7405" b="C0 C5"/>
+ <a u="7406" b="C0 ED"/>
+ <a u="7407" b="AC 4C"/>
+ <a u="7408" b="AC 4D"/>
+ <a u="7409" b="C1 F0"/>
+ <a u="740A" b="E7 F0"/>
+ <a u="740B" b="AC 4E"/>
+ <a u="740C" b="AC 4F"/>
+ <a u="740D" b="AC 50"/>
+ <a u="740E" b="AC 51"/>
+ <a u="740F" b="E7 F6"/>
+ <a u="7410" b="CB F6"/>
+ <a u="7411" b="AC 52"/>
+ <a u="7412" b="AC 53"/>
+ <a u="7413" b="AC 54"/>
+ <a u="7414" b="AC 55"/>
+ <a u="7415" b="AC 56"/>
+ <a u="7416" b="AC 57"/>
+ <a u="7417" b="AC 58"/>
+ <a u="7418" b="AC 59"/>
+ <a u="7419" b="AC 5A"/>
+ <a u="741A" b="E8 A2"/>
+ <a u="741B" b="E8 A1"/>
+ <a u="741C" b="AC 5B"/>
+ <a u="741D" b="AC 5C"/>
+ <a u="741E" b="AC 5D"/>
+ <a u="741F" b="AC 5E"/>
+ <a u="7420" b="AC 5F"/>
+ <a u="7421" b="AC 60"/>
+ <a u="7422" b="D7 C1"/>
+ <a u="7423" b="AC 61"/>
+ <a u="7424" b="AC 62"/>
+ <a u="7425" b="E7 FA"/>
+ <a u="7426" b="E7 F9"/>
+ <a u="7427" b="AC 63"/>
+ <a u="7428" b="E7 FB"/>
+ <a u="7429" b="AC 64"/>
+ <a u="742A" b="E7 F7"/>
+ <a u="742B" b="AC 65"/>
+ <a u="742C" b="E7 FE"/>
+ <a u="742D" b="AC 66"/>
+ <a u="742E" b="E7 FD"/>
+ <a u="742F" b="AC 67"/>
+ <a u="7430" b="E7 FC"/>
+ <a u="7431" b="AC 68"/>
+ <a u="7432" b="AC 69"/>
+ <a u="7433" b="C1 D5"/>
+ <a u="7434" b="C7 D9"/>
+ <a u="7435" b="C5 FD"/>
+ <a u="7436" b="C5 C3"/>
+ <a u="7437" b="AC 6A"/>
+ <a u="7438" b="AC 6B"/>
+ <a u="7439" b="AC 6C"/>
+ <a u="743A" b="AC 6D"/>
+ <a u="743B" b="AC 6E"/>
+ <a u="743C" b="C7 ED"/>
+ <a u="743D" b="AC 6F"/>
+ <a u="743E" b="AC 70"/>
+ <a u="743F" b="AC 71"/>
+ <a u="7440" b="AC 72"/>
+ <a u="7441" b="E8 A3"/>
+ <a u="7442" b="AC 73"/>
+ <a u="7443" b="AC 74"/>
+ <a u="7444" b="AC 75"/>
+ <a u="7445" b="AC 76"/>
+ <a u="7446" b="AC 77"/>
+ <a u="7447" b="AC 78"/>
+ <a u="7448" b="AC 79"/>
+ <a u="7449" b="AC 7A"/>
+ <a u="744A" b="AC 7B"/>
+ <a u="744B" b="AC 7C"/>
+ <a u="744C" b="AC 7D"/>
+ <a u="744D" b="AC 7E"/>
+ <a u="744E" b="AC 80"/>
+ <a u="744F" b="AC 81"/>
+ <a u="7450" b="AC 82"/>
+ <a u="7451" b="AC 83"/>
+ <a u="7452" b="AC 84"/>
+ <a u="7453" b="AC 85"/>
+ <a u="7454" b="AC 86"/>
+ <a u="7455" b="E8 A6"/>
+ <a u="7456" b="AC 87"/>
+ <a u="7457" b="E8 A5"/>
+ <a u="7458" b="AC 88"/>
+ <a u="7459" b="E8 A7"/>
+ <a u="745A" b="BA F7"/>
+ <a u="745B" b="E7 F8"/>
+ <a u="745C" b="E8 A4"/>
+ <a u="745D" b="AC 89"/>
+ <a u="745E" b="C8 F0"/>
+ <a u="745F" b="C9 AA"/>
+ <a u="7460" b="AC 8A"/>
+ <a u="7461" b="AC 8B"/>
+ <a u="7462" b="AC 8C"/>
+ <a u="7463" b="AC 8D"/>
+ <a u="7464" b="AC 8E"/>
+ <a u="7465" b="AC 8F"/>
+ <a u="7466" b="AC 90"/>
+ <a u="7467" b="AC 91"/>
+ <a u="7468" b="AC 92"/>
+ <a u="7469" b="AC 93"/>
+ <a u="746A" b="AC 94"/>
+ <a u="746B" b="AC 95"/>
+ <a u="746C" b="AC 96"/>
+ <a u="746D" b="E8 A9"/>
+ <a u="746E" b="AC 97"/>
+ <a u="746F" b="AC 98"/>
+ <a u="7470" b="B9 E5"/>
+ <a u="7471" b="AC 99"/>
+ <a u="7472" b="AC 9A"/>
+ <a u="7473" b="AC 9B"/>
+ <a u="7474" b="AC 9C"/>
+ <a u="7475" b="AC 9D"/>
+ <a u="7476" b="D1 FE"/>
+ <a u="7477" b="E8 A8"/>
+ <a u="7478" b="AC 9E"/>
+ <a u="7479" b="AC 9F"/>
+ <a u="747A" b="AC A0"/>
+ <a u="747B" b="AD 40"/>
+ <a u="747C" b="AD 41"/>
+ <a u="747D" b="AD 42"/>
+ <a u="747E" b="E8 AA"/>
+ <a u="747F" b="AD 43"/>
+ <a u="7480" b="E8 AD"/>
+ <a u="7481" b="E8 AE"/>
+ <a u="7482" b="AD 44"/>
+ <a u="7483" b="C1 A7"/>
+ <a u="7484" b="AD 45"/>
+ <a u="7485" b="AD 46"/>
+ <a u="7486" b="AD 47"/>
+ <a u="7487" b="E8 AF"/>
+ <a u="7488" b="AD 48"/>
+ <a u="7489" b="AD 49"/>
+ <a u="748A" b="AD 4A"/>
+ <a u="748B" b="E8 B0"/>
+ <a u="748C" b="AD 4B"/>
+ <a u="748D" b="AD 4C"/>
+ <a u="748E" b="E8 AC"/>
+ <a u="748F" b="AD 4D"/>
+ <a u="7490" b="E8 B4"/>
+ <a u="7491" b="AD 4E"/>
+ <a u="7492" b="AD 4F"/>
+ <a u="7493" b="AD 50"/>
+ <a u="7494" b="AD 51"/>
+ <a u="7495" b="AD 52"/>
+ <a u="7496" b="AD 53"/>
+ <a u="7497" b="AD 54"/>
+ <a u="7498" b="AD 55"/>
+ <a u="7499" b="AD 56"/>
+ <a u="749A" b="AD 57"/>
+ <a u="749B" b="AD 58"/>
+ <a u="749C" b="E8 AB"/>
+ <a u="749D" b="AD 59"/>
+ <a u="749E" b="E8 B1"/>
+ <a u="749F" b="AD 5A"/>
+ <a u="74A0" b="AD 5B"/>
+ <a u="74A1" b="AD 5C"/>
+ <a u="74A2" b="AD 5D"/>
+ <a u="74A3" b="AD 5E"/>
+ <a u="74A4" b="AD 5F"/>
+ <a u="74A5" b="AD 60"/>
+ <a u="74A6" b="AD 61"/>
+ <a u="74A7" b="E8 B5"/>
+ <a u="74A8" b="E8 B2"/>
+ <a u="74A9" b="E8 B3"/>
+ <a u="74AA" b="AD 62"/>
+ <a u="74AB" b="AD 63"/>
+ <a u="74AC" b="AD 64"/>
+ <a u="74AD" b="AD 65"/>
+ <a u="74AE" b="AD 66"/>
+ <a u="74AF" b="AD 67"/>
+ <a u="74B0" b="AD 68"/>
+ <a u="74B1" b="AD 69"/>
+ <a u="74B2" b="AD 6A"/>
+ <a u="74B3" b="AD 6B"/>
+ <a u="74B4" b="AD 6C"/>
+ <a u="74B5" b="AD 6D"/>
+ <a u="74B6" b="AD 6E"/>
+ <a u="74B7" b="AD 6F"/>
+ <a u="74B8" b="AD 70"/>
+ <a u="74B9" b="AD 71"/>
+ <a u="74BA" b="E8 B7"/>
+ <a u="74BB" b="AD 72"/>
+ <a u="74BC" b="AD 73"/>
+ <a u="74BD" b="AD 74"/>
+ <a u="74BE" b="AD 75"/>
+ <a u="74BF" b="AD 76"/>
+ <a u="74C0" b="AD 77"/>
+ <a u="74C1" b="AD 78"/>
+ <a u="74C2" b="AD 79"/>
+ <a u="74C3" b="AD 7A"/>
+ <a u="74C4" b="AD 7B"/>
+ <a u="74C5" b="AD 7C"/>
+ <a u="74C6" b="AD 7D"/>
+ <a u="74C7" b="AD 7E"/>
+ <a u="74C8" b="AD 80"/>
+ <a u="74C9" b="AD 81"/>
+ <a u="74CA" b="AD 82"/>
+ <a u="74CB" b="AD 83"/>
+ <a u="74CC" b="AD 84"/>
+ <a u="74CD" b="AD 85"/>
+ <a u="74CE" b="AD 86"/>
+ <a u="74CF" b="AD 87"/>
+ <a u="74D0" b="AD 88"/>
+ <a u="74D1" b="AD 89"/>
+ <a u="74D2" b="E8 B6"/>
+ <a u="74D3" b="AD 8A"/>
+ <a u="74D4" b="AD 8B"/>
+ <a u="74D5" b="AD 8C"/>
+ <a u="74D6" b="AD 8D"/>
+ <a u="74D7" b="AD 8E"/>
+ <a u="74D8" b="AD 8F"/>
+ <a u="74D9" b="AD 90"/>
+ <a u="74DA" b="AD 91"/>
+ <a u="74DB" b="AD 92"/>
+ <a u="74DC" b="B9 CF"/>
+ <a u="74DD" b="AD 93"/>
+ <a u="74DE" b="F0 AC"/>
+ <a u="74DF" b="AD 94"/>
+ <a u="74E0" b="F0 AD"/>
+ <a u="74E1" b="AD 95"/>
+ <a u="74E2" b="C6 B0"/>
+ <a u="74E3" b="B0 EA"/>
+ <a u="74E4" b="C8 BF"/>
+ <a u="74E5" b="AD 96"/>
+ <a u="74E6" b="CD DF"/>
+ <a u="74E7" b="AD 97"/>
+ <a u="74E8" b="AD 98"/>
+ <a u="74E9" b="AD 99"/>
+ <a u="74EA" b="AD 9A"/>
+ <a u="74EB" b="AD 9B"/>
+ <a u="74EC" b="AD 9C"/>
+ <a u="74ED" b="AD 9D"/>
+ <a u="74EE" b="CE CD"/>
+ <a u="74EF" b="EA B1"/>
+ <a u="74F0" b="AD 9E"/>
+ <a u="74F1" b="AD 9F"/>
+ <a u="74F2" b="AD A0"/>
+ <a u="74F3" b="AE 40"/>
+ <a u="74F4" b="EA B2"/>
+ <a u="74F5" b="AE 41"/>
+ <a u="74F6" b="C6 BF"/>
+ <a u="74F7" b="B4 C9"/>
+ <a u="74F8" b="AE 42"/>
+ <a u="74F9" b="AE 43"/>
+ <a u="74FA" b="AE 44"/>
+ <a u="74FB" b="AE 45"/>
+ <a u="74FC" b="AE 46"/>
+ <a u="74FD" b="AE 47"/>
+ <a u="74FE" b="AE 48"/>
+ <a u="74FF" b="EA B3"/>
+ <a u="7500" b="AE 49"/>
+ <a u="7501" b="AE 4A"/>
+ <a u="7502" b="AE 4B"/>
+ <a u="7503" b="AE 4C"/>
+ <a u="7504" b="D5 E7"/>
+ <a u="7505" b="AE 4D"/>
+ <a u="7506" b="AE 4E"/>
+ <a u="7507" b="AE 4F"/>
+ <a u="7508" b="AE 50"/>
+ <a u="7509" b="AE 51"/>
+ <a u="750A" b="AE 52"/>
+ <a u="750B" b="AE 53"/>
+ <a u="750C" b="AE 54"/>
+ <a u="750D" b="DD F9"/>
+ <a u="750E" b="AE 55"/>
+ <a u="750F" b="EA B4"/>
+ <a u="7510" b="AE 56"/>
+ <a u="7511" b="EA B5"/>
+ <a u="7512" b="AE 57"/>
+ <a u="7513" b="EA B6"/>
+ <a u="7514" b="AE 58"/>
+ <a u="7515" b="AE 59"/>
+ <a u="7516" b="AE 5A"/>
+ <a u="7517" b="AE 5B"/>
+ <a u="7518" b="B8 CA"/>
+ <a u="7519" b="DF B0"/>
+ <a u="751A" b="C9 F5"/>
+ <a u="751B" b="AE 5C"/>
+ <a u="751C" b="CC F0"/>
+ <a u="751D" b="AE 5D"/>
+ <a u="751E" b="AE 5E"/>
+ <a u="751F" b="C9 FA"/>
+ <a u="7520" b="AE 5F"/>
+ <a u="7521" b="AE 60"/>
+ <a u="7522" b="AE 61"/>
+ <a u="7523" b="AE 62"/>
+ <a u="7524" b="AE 63"/>
+ <a u="7525" b="C9 FB"/>
+ <a u="7526" b="AE 64"/>
+ <a u="7527" b="AE 65"/>
+ <a u="7528" b="D3 C3"/>
+ <a u="7529" b="CB A6"/>
+ <a u="752A" b="AE 66"/>
+ <a u="752B" b="B8 A6"/>
+ <a u="752C" b="F0 AE"/>
+ <a u="752D" b="B1 C2"/>
+ <a u="752E" b="AE 67"/>
+ <a u="752F" b="E5 B8"/>
+ <a u="7530" b="CC EF"/>
+ <a u="7531" b="D3 C9"/>
+ <a u="7532" b="BC D7"/>
+ <a u="7533" b="C9 EA"/>
+ <a u="7534" b="AE 68"/>
+ <a u="7535" b="B5 E7"/>
+ <a u="7536" b="AE 69"/>
+ <a u="7537" b="C4 D0"/>
+ <a u="7538" b="B5 E9"/>
+ <a u="7539" b="AE 6A"/>
+ <a u="753A" b="EE AE"/>
+ <a u="753B" b="BB AD"/>
+ <a u="753C" b="AE 6B"/>
+ <a u="753D" b="AE 6C"/>
+ <a u="753E" b="E7 DE"/>
+ <a u="753F" b="AE 6D"/>
+ <a u="7540" b="EE AF"/>
+ <a u="7541" b="AE 6E"/>
+ <a u="7542" b="AE 6F"/>
+ <a u="7543" b="AE 70"/>
+ <a u="7544" b="AE 71"/>
+ <a u="7545" b="B3 A9"/>
+ <a u="7546" b="AE 72"/>
+ <a u="7547" b="AE 73"/>
+ <a u="7548" b="EE B2"/>
+ <a u="7549" b="AE 74"/>
+ <a u="754A" b="AE 75"/>
+ <a u="754B" b="EE B1"/>
+ <a u="754C" b="BD E7"/>
+ <a u="754D" b="AE 76"/>
+ <a u="754E" b="EE B0"/>
+ <a u="754F" b="CE B7"/>
+ <a u="7550" b="AE 77"/>
+ <a u="7551" b="AE 78"/>
+ <a u="7552" b="AE 79"/>
+ <a u="7553" b="AE 7A"/>
+ <a u="7554" b="C5 CF"/>
+ <a u="7555" b="AE 7B"/>
+ <a u="7556" b="AE 7C"/>
+ <a u="7557" b="AE 7D"/>
+ <a u="7558" b="AE 7E"/>
+ <a u="7559" b="C1 F4"/>
+ <a u="755A" b="DB CE"/>
+ <a u="755B" b="EE B3"/>
+ <a u="755C" b="D0 F3"/>
+ <a u="755D" b="AE 80"/>
+ <a u="755E" b="AE 81"/>
+ <a u="755F" b="AE 82"/>
+ <a u="7560" b="AE 83"/>
+ <a u="7561" b="AE 84"/>
+ <a u="7562" b="AE 85"/>
+ <a u="7563" b="AE 86"/>
+ <a u="7564" b="AE 87"/>
+ <a u="7565" b="C2 D4"/>
+ <a u="7566" b="C6 E8"/>
+ <a u="7567" b="AE 88"/>
+ <a u="7568" b="AE 89"/>
+ <a u="7569" b="AE 8A"/>
+ <a u="756A" b="B7 AC"/>
+ <a u="756B" b="AE 8B"/>
+ <a u="756C" b="AE 8C"/>
+ <a u="756D" b="AE 8D"/>
+ <a u="756E" b="AE 8E"/>
+ <a u="756F" b="AE 8F"/>
+ <a u="7570" b="AE 90"/>
+ <a u="7571" b="AE 91"/>
+ <a u="7572" b="EE B4"/>
+ <a u="7573" b="AE 92"/>
+ <a u="7574" b="B3 EB"/>
+ <a u="7575" b="AE 93"/>
+ <a u="7576" b="AE 94"/>
+ <a u="7577" b="AE 95"/>
+ <a u="7578" b="BB FB"/>
+ <a u="7579" b="EE B5"/>
+ <a u="757A" b="AE 96"/>
+ <a u="757B" b="AE 97"/>
+ <a u="757C" b="AE 98"/>
+ <a u="757D" b="AE 99"/>
+ <a u="757E" b="AE 9A"/>
+ <a u="757F" b="E7 DC"/>
+ <a u="7580" b="AE 9B"/>
+ <a u="7581" b="AE 9C"/>
+ <a u="7582" b="AE 9D"/>
+ <a u="7583" b="EE B6"/>
+ <a u="7584" b="AE 9E"/>
+ <a u="7585" b="AE 9F"/>
+ <a u="7586" b="BD AE"/>
+ <a u="7587" b="AE A0"/>
+ <a u="7588" b="AF 40"/>
+ <a u="7589" b="AF 41"/>
+ <a u="758A" b="AF 42"/>
+ <a u="758B" b="F1 E2"/>
+ <a u="758C" b="AF 43"/>
+ <a u="758D" b="AF 44"/>
+ <a u="758E" b="AF 45"/>
+ <a u="758F" b="CA E8"/>
+ <a u="7590" b="AF 46"/>
+ <a u="7591" b="D2 C9"/>
+ <a u="7592" b="F0 DA"/>
+ <a u="7593" b="AF 47"/>
+ <a u="7594" b="F0 DB"/>
+ <a u="7595" b="AF 48"/>
+ <a u="7596" b="F0 DC"/>
+ <a u="7597" b="C1 C6"/>
+ <a u="7598" b="AF 49"/>
+ <a u="7599" b="B8 ED"/>
+ <a u="759A" b="BE CE"/>
+ <a u="759B" b="AF 4A"/>
+ <a u="759C" b="AF 4B"/>
+ <a u="759D" b="F0 DE"/>
+ <a u="759E" b="AF 4C"/>
+ <a u="759F" b="C5 B1"/>
+ <a u="75A0" b="F0 DD"/>
+ <a u="75A1" b="D1 F1"/>
+ <a u="75A2" b="AF 4D"/>
+ <a u="75A3" b="F0 E0"/>
+ <a u="75A4" b="B0 CC"/>
+ <a u="75A5" b="BD EA"/>
+ <a u="75A6" b="AF 4E"/>
+ <a u="75A7" b="AF 4F"/>
+ <a u="75A8" b="AF 50"/>
+ <a u="75A9" b="AF 51"/>
+ <a u="75AA" b="AF 52"/>
+ <a u="75AB" b="D2 DF"/>
+ <a u="75AC" b="F0 DF"/>
+ <a u="75AD" b="AF 53"/>
+ <a u="75AE" b="B4 AF"/>
+ <a u="75AF" b="B7 E8"/>
+ <a u="75B0" b="F0 E6"/>
+ <a u="75B1" b="F0 E5"/>
+ <a u="75B2" b="C6 A3"/>
+ <a u="75B3" b="F0 E1"/>
+ <a u="75B4" b="F0 E2"/>
+ <a u="75B5" b="B4 C3"/>
+ <a u="75B6" b="AF 54"/>
+ <a u="75B7" b="AF 55"/>
+ <a u="75B8" b="F0 E3"/>
+ <a u="75B9" b="D5 EE"/>
+ <a u="75BA" b="AF 56"/>
+ <a u="75BB" b="AF 57"/>
+ <a u="75BC" b="CC DB"/>
+ <a u="75BD" b="BE D2"/>
+ <a u="75BE" b="BC B2"/>
+ <a u="75BF" b="AF 58"/>
+ <a u="75C0" b="AF 59"/>
+ <a u="75C1" b="AF 5A"/>
+ <a u="75C2" b="F0 E8"/>
+ <a u="75C3" b="F0 E7"/>
+ <a u="75C4" b="F0 E4"/>
+ <a u="75C5" b="B2 A1"/>
+ <a u="75C6" b="AF 5B"/>
+ <a u="75C7" b="D6 A2"/>
+ <a u="75C8" b="D3 B8"/>
+ <a u="75C9" b="BE B7"/>
+ <a u="75CA" b="C8 AC"/>
+ <a u="75CB" b="AF 5C"/>
+ <a u="75CC" b="AF 5D"/>
+ <a u="75CD" b="F0 EA"/>
+ <a u="75CE" b="AF 5E"/>
+ <a u="75CF" b="AF 5F"/>
+ <a u="75D0" b="AF 60"/>
+ <a u="75D1" b="AF 61"/>
+ <a u="75D2" b="D1 F7"/>
+ <a u="75D3" b="AF 62"/>
+ <a u="75D4" b="D6 CC"/>
+ <a u="75D5" b="BA DB"/>
+ <a u="75D6" b="F0 E9"/>
+ <a u="75D7" b="AF 63"/>
+ <a u="75D8" b="B6 BB"/>
+ <a u="75D9" b="AF 64"/>
+ <a u="75DA" b="AF 65"/>
+ <a u="75DB" b="CD B4"/>
+ <a u="75DC" b="AF 66"/>
+ <a u="75DD" b="AF 67"/>
+ <a u="75DE" b="C6 A6"/>
+ <a u="75DF" b="AF 68"/>
+ <a u="75E0" b="AF 69"/>
+ <a u="75E1" b="AF 6A"/>
+ <a u="75E2" b="C1 A1"/>
+ <a u="75E3" b="F0 EB"/>
+ <a u="75E4" b="F0 EE"/>
+ <a u="75E5" b="AF 6B"/>
+ <a u="75E6" b="F0 ED"/>
+ <a u="75E7" b="F0 F0"/>
+ <a u="75E8" b="F0 EC"/>
+ <a u="75E9" b="AF 6C"/>
+ <a u="75EA" b="BB BE"/>
+ <a u="75EB" b="F0 EF"/>
+ <a u="75EC" b="AF 6D"/>
+ <a u="75ED" b="AF 6E"/>
+ <a u="75EE" b="AF 6F"/>
+ <a u="75EF" b="AF 70"/>
+ <a u="75F0" b="CC B5"/>
+ <a u="75F1" b="F0 F2"/>
+ <a u="75F2" b="AF 71"/>
+ <a u="75F3" b="AF 72"/>
+ <a u="75F4" b="B3 D5"/>
+ <a u="75F5" b="AF 73"/>
+ <a u="75F6" b="AF 74"/>
+ <a u="75F7" b="AF 75"/>
+ <a u="75F8" b="AF 76"/>
+ <a u="75F9" b="B1 D4"/>
+ <a u="75FA" b="AF 77"/>
+ <a u="75FB" b="AF 78"/>
+ <a u="75FC" b="F0 F3"/>
+ <a u="75FD" b="AF 79"/>
+ <a u="75FE" b="AF 7A"/>
+ <a u="75FF" b="F0 F4"/>
+ <a u="7600" b="F0 F6"/>
+ <a u="7601" b="B4 E1"/>
+ <a u="7602" b="AF 7B"/>
+ <a u="7603" b="F0 F1"/>
+ <a u="7604" b="AF 7C"/>
+ <a u="7605" b="F0 F7"/>
+ <a u="7606" b="AF 7D"/>
+ <a u="7607" b="AF 7E"/>
+ <a u="7608" b="AF 80"/>
+ <a u="7609" b="AF 81"/>
+ <a u="760A" b="F0 FA"/>
+ <a u="760B" b="AF 82"/>
+ <a u="760C" b="F0 F8"/>
+ <a u="760D" b="AF 83"/>
+ <a u="760E" b="AF 84"/>
+ <a u="760F" b="AF 85"/>
+ <a u="7610" b="F0 F5"/>
+ <a u="7611" b="AF 86"/>
+ <a u="7612" b="AF 87"/>
+ <a u="7613" b="AF 88"/>
+ <a u="7614" b="AF 89"/>
+ <a u="7615" b="F0 FD"/>
+ <a u="7616" b="AF 8A"/>
+ <a u="7617" b="F0 F9"/>
+ <a u="7618" b="F0 FC"/>
+ <a u="7619" b="F0 FE"/>
+ <a u="761A" b="AF 8B"/>
+ <a u="761B" b="F1 A1"/>
+ <a u="761C" b="AF 8C"/>
+ <a u="761D" b="AF 8D"/>
+ <a u="761E" b="AF 8E"/>
+ <a u="761F" b="CE C1"/>
+ <a u="7620" b="F1 A4"/>
+ <a u="7621" b="AF 8F"/>
+ <a u="7622" b="F1 A3"/>
+ <a u="7623" b="AF 90"/>
+ <a u="7624" b="C1 F6"/>
+ <a u="7625" b="F0 FB"/>
+ <a u="7626" b="CA DD"/>
+ <a u="7627" b="AF 91"/>
+ <a u="7628" b="AF 92"/>
+ <a u="7629" b="B4 F1"/>
+ <a u="762A" b="B1 F1"/>
+ <a u="762B" b="CC B1"/>
+ <a u="762C" b="AF 93"/>
+ <a u="762D" b="F1 A6"/>
+ <a u="762E" b="AF 94"/>
+ <a u="762F" b="AF 95"/>
+ <a u="7630" b="F1 A7"/>
+ <a u="7631" b="AF 96"/>
+ <a u="7632" b="AF 97"/>
+ <a u="7633" b="F1 AC"/>
+ <a u="7634" b="D5 CE"/>
+ <a u="7635" b="F1 A9"/>
+ <a u="7636" b="AF 98"/>
+ <a u="7637" b="AF 99"/>
+ <a u="7638" b="C8 B3"/>
+ <a u="7639" b="AF 9A"/>
+ <a u="763A" b="AF 9B"/>
+ <a u="763B" b="AF 9C"/>
+ <a u="763C" b="F1 A2"/>
+ <a u="763D" b="AF 9D"/>
+ <a u="763E" b="F1 AB"/>
+ <a u="763F" b="F1 A8"/>
+ <a u="7640" b="F1 A5"/>
+ <a u="7641" b="AF 9E"/>
+ <a u="7642" b="AF 9F"/>
+ <a u="7643" b="F1 AA"/>
+ <a u="7644" b="AF A0"/>
+ <a u="7645" b="B0 40"/>
+ <a u="7646" b="B0 41"/>
+ <a u="7647" b="B0 42"/>
+ <a u="7648" b="B0 43"/>
+ <a u="7649" b="B0 44"/>
+ <a u="764A" b="B0 45"/>
+ <a u="764B" b="B0 46"/>
+ <a u="764C" b="B0 A9"/>
+ <a u="764D" b="F1 AD"/>
+ <a u="764E" b="B0 47"/>
+ <a u="764F" b="B0 48"/>
+ <a u="7650" b="B0 49"/>
+ <a u="7651" b="B0 4A"/>
+ <a u="7652" b="B0 4B"/>
+ <a u="7653" b="B0 4C"/>
+ <a u="7654" b="F1 AF"/>
+ <a u="7655" b="B0 4D"/>
+ <a u="7656" b="F1 B1"/>
+ <a u="7657" b="B0 4E"/>
+ <a u="7658" b="B0 4F"/>
+ <a u="7659" b="B0 50"/>
+ <a u="765A" b="B0 51"/>
+ <a u="765B" b="B0 52"/>
+ <a u="765C" b="F1 B0"/>
+ <a u="765D" b="B0 53"/>
+ <a u="765E" b="F1 AE"/>
+ <a u="765F" b="B0 54"/>
+ <a u="7660" b="B0 55"/>
+ <a u="7661" b="B0 56"/>
+ <a u="7662" b="B0 57"/>
+ <a u="7663" b="D1 A2"/>
+ <a u="7664" b="B0 58"/>
+ <a u="7665" b="B0 59"/>
+ <a u="7666" b="B0 5A"/>
+ <a u="7667" b="B0 5B"/>
+ <a u="7668" b="B0 5C"/>
+ <a u="7669" b="B0 5D"/>
+ <a u="766A" b="B0 5E"/>
+ <a u="766B" b="F1 B2"/>
+ <a u="766C" b="B0 5F"/>
+ <a u="766D" b="B0 60"/>
+ <a u="766E" b="B0 61"/>
+ <a u="766F" b="F1 B3"/>
+ <a u="7670" b="B0 62"/>
+ <a u="7671" b="B0 63"/>
+ <a u="7672" b="B0 64"/>
+ <a u="7673" b="B0 65"/>
+ <a u="7674" b="B0 66"/>
+ <a u="7675" b="B0 67"/>
+ <a u="7676" b="B0 68"/>
+ <a u="7677" b="B0 69"/>
+ <a u="7678" b="B9 EF"/>
+ <a u="7679" b="B0 6A"/>
+ <a u="767A" b="B0 6B"/>
+ <a u="767B" b="B5 C7"/>
+ <a u="767C" b="B0 6C"/>
+ <a u="767D" b="B0 D7"/>
+ <a u="767E" b="B0 D9"/>
+ <a u="767F" b="B0 6D"/>
+ <a u="7680" b="B0 6E"/>
+ <a u="7681" b="B0 6F"/>
+ <a u="7682" b="D4 ED"/>
+ <a u="7683" b="B0 70"/>
+ <a u="7684" b="B5 C4"/>
+ <a u="7685" b="B0 71"/>
+ <a u="7686" b="BD D4"/>
+ <a u="7687" b="BB CA"/>
+ <a u="7688" b="F0 A7"/>
+ <a u="7689" b="B0 72"/>
+ <a u="768A" b="B0 73"/>
+ <a u="768B" b="B8 DE"/>
+ <a u="768C" b="B0 74"/>
+ <a u="768D" b="B0 75"/>
+ <a u="768E" b="F0 A8"/>
+ <a u="768F" b="B0 76"/>
+ <a u="7690" b="B0 77"/>
+ <a u="7691" b="B0 A8"/>
+ <a u="7692" b="B0 78"/>
+ <a u="7693" b="F0 A9"/>
+ <a u="7694" b="B0 79"/>
+ <a u="7695" b="B0 7A"/>
+ <a u="7696" b="CD EE"/>
+ <a u="7697" b="B0 7B"/>
+ <a u="7698" b="B0 7C"/>
+ <a u="7699" b="F0 AA"/>
+ <a u="769A" b="B0 7D"/>
+ <a u="769B" b="B0 7E"/>
+ <a u="769C" b="B0 80"/>
+ <a u="769D" b="B0 81"/>
+ <a u="769E" b="B0 82"/>
+ <a u="769F" b="B0 83"/>
+ <a u="76A0" b="B0 84"/>
+ <a u="76A1" b="B0 85"/>
+ <a u="76A2" b="B0 86"/>
+ <a u="76A3" b="B0 87"/>
+ <a u="76A4" b="F0 AB"/>
+ <a u="76A5" b="B0 88"/>
+ <a u="76A6" b="B0 89"/>
+ <a u="76A7" b="B0 8A"/>
+ <a u="76A8" b="B0 8B"/>
+ <a u="76A9" b="B0 8C"/>
+ <a u="76AA" b="B0 8D"/>
+ <a u="76AB" b="B0 8E"/>
+ <a u="76AC" b="B0 8F"/>
+ <a u="76AD" b="B0 90"/>
+ <a u="76AE" b="C6 A4"/>
+ <a u="76AF" b="B0 91"/>
+ <a u="76B0" b="B0 92"/>
+ <a u="76B1" b="D6 E5"/>
+ <a u="76B2" b="F1 E4"/>
+ <a u="76B3" b="B0 93"/>
+ <a u="76B4" b="F1 E5"/>
+ <a u="76B5" b="B0 94"/>
+ <a u="76B6" b="B0 95"/>
+ <a u="76B7" b="B0 96"/>
+ <a u="76B8" b="B0 97"/>
+ <a u="76B9" b="B0 98"/>
+ <a u="76BA" b="B0 99"/>
+ <a u="76BB" b="B0 9A"/>
+ <a u="76BC" b="B0 9B"/>
+ <a u="76BD" b="B0 9C"/>
+ <a u="76BE" b="B0 9D"/>
+ <a u="76BF" b="C3 F3"/>
+ <a u="76C0" b="B0 9E"/>
+ <a u="76C1" b="B0 9F"/>
+ <a u="76C2" b="D3 DB"/>
+ <a u="76C3" b="B0 A0"/>
+ <a u="76C4" b="B1 40"/>
+ <a u="76C5" b="D6 D1"/>
+ <a u="76C6" b="C5 E8"/>
+ <a u="76C7" b="B1 41"/>
+ <a u="76C8" b="D3 AF"/>
+ <a u="76C9" b="B1 42"/>
+ <a u="76CA" b="D2 E6"/>
+ <a u="76CB" b="B1 43"/>
+ <a u="76CC" b="B1 44"/>
+ <a u="76CD" b="EE C1"/>
+ <a u="76CE" b="B0 BB"/>
+ <a u="76CF" b="D5 B5"/>
+ <a u="76D0" b="D1 CE"/>
+ <a u="76D1" b="BC E0"/>
+ <a u="76D2" b="BA D0"/>
+ <a u="76D3" b="B1 45"/>
+ <a u="76D4" b="BF F8"/>
+ <a u="76D5" b="B1 46"/>
+ <a u="76D6" b="B8 C7"/>
+ <a u="76D7" b="B5 C1"/>
+ <a u="76D8" b="C5 CC"/>
+ <a u="76D9" b="B1 47"/>
+ <a u="76DA" b="B1 48"/>
+ <a u="76DB" b="CA A2"/>
+ <a u="76DC" b="B1 49"/>
+ <a u="76DD" b="B1 4A"/>
+ <a u="76DE" b="B1 4B"/>
+ <a u="76DF" b="C3 CB"/>
+ <a u="76E0" b="B1 4C"/>
+ <a u="76E1" b="B1 4D"/>
+ <a u="76E2" b="B1 4E"/>
+ <a u="76E3" b="B1 4F"/>
+ <a u="76E4" b="B1 50"/>
+ <a u="76E5" b="EE C2"/>
+ <a u="76E6" b="B1 51"/>
+ <a u="76E7" b="B1 52"/>
+ <a u="76E8" b="B1 53"/>
+ <a u="76E9" b="B1 54"/>
+ <a u="76EA" b="B1 55"/>
+ <a u="76EB" b="B1 56"/>
+ <a u="76EC" b="B1 57"/>
+ <a u="76ED" b="B1 58"/>
+ <a u="76EE" b="C4 BF"/>
+ <a u="76EF" b="B6 A2"/>
+ <a u="76F0" b="B1 59"/>
+ <a u="76F1" b="ED EC"/>
+ <a u="76F2" b="C3 A4"/>
+ <a u="76F3" b="B1 5A"/>
+ <a u="76F4" b="D6 B1"/>
+ <a u="76F5" b="B1 5B"/>
+ <a u="76F6" b="B1 5C"/>
+ <a u="76F7" b="B1 5D"/>
+ <a u="76F8" b="CF E0"/>
+ <a u="76F9" b="ED EF"/>
+ <a u="76FA" b="B1 5E"/>
+ <a u="76FB" b="B1 5F"/>
+ <a u="76FC" b="C5 CE"/>
+ <a u="76FD" b="B1 60"/>
+ <a u="76FE" b="B6 DC"/>
+ <a u="76FF" b="B1 61"/>
+ <a u="7700" b="B1 62"/>
+ <a u="7701" b="CA A1"/>
+ <a u="7702" b="B1 63"/>
+ <a u="7703" b="B1 64"/>
+ <a u="7704" b="ED ED"/>
+ <a u="7705" b="B1 65"/>
+ <a u="7706" b="B1 66"/>
+ <a u="7707" b="ED F0"/>
+ <a u="7708" b="ED F1"/>
+ <a u="7709" b="C3 BC"/>
+ <a u="770A" b="B1 67"/>
+ <a u="770B" b="BF B4"/>
+ <a u="770C" b="B1 68"/>
+ <a u="770D" b="ED EE"/>
+ <a u="770E" b="B1 69"/>
+ <a u="770F" b="B1 6A"/>
+ <a u="7710" b="B1 6B"/>
+ <a u="7711" b="B1 6C"/>
+ <a u="7712" b="B1 6D"/>
+ <a u="7713" b="B1 6E"/>
+ <a u="7714" b="B1 6F"/>
+ <a u="7715" b="B1 70"/>
+ <a u="7716" b="B1 71"/>
+ <a u="7717" b="B1 72"/>
+ <a u="7718" b="B1 73"/>
+ <a u="7719" b="ED F4"/>
+ <a u="771A" b="ED F2"/>
+ <a u="771B" b="B1 74"/>
+ <a u="771C" b="B1 75"/>
+ <a u="771D" b="B1 76"/>
+ <a u="771E" b="B1 77"/>
+ <a u="771F" b="D5 E6"/>
+ <a u="7720" b="C3 DF"/>
+ <a u="7721" b="B1 78"/>
+ <a u="7722" b="ED F3"/>
+ <a u="7723" b="B1 79"/>
+ <a u="7724" b="B1 7A"/>
+ <a u="7725" b="B1 7B"/>
+ <a u="7726" b="ED F6"/>
+ <a u="7727" b="B1 7C"/>
+ <a u="7728" b="D5 A3"/>
+ <a u="7729" b="D1 A3"/>
+ <a u="772A" b="B1 7D"/>
+ <a u="772B" b="B1 7E"/>
+ <a u="772C" b="B1 80"/>
+ <a u="772D" b="ED F5"/>
+ <a u="772E" b="B1 81"/>
+ <a u="772F" b="C3 D0"/>
+ <a u="7730" b="B1 82"/>
+ <a u="7731" b="B1 83"/>
+ <a u="7732" b="B1 84"/>
+ <a u="7733" b="B1 85"/>
+ <a u="7734" b="B1 86"/>
+ <a u="7735" b="ED F7"/>
+ <a u="7736" b="BF F4"/>
+ <a u="7737" b="BE EC"/>
+ <a u="7738" b="ED F8"/>
+ <a u="7739" b="B1 87"/>
+ <a u="773A" b="CC F7"/>
+ <a u="773B" b="B1 88"/>
+ <a u="773C" b="D1 DB"/>
+ <a u="773D" b="B1 89"/>
+ <a u="773E" b="B1 8A"/>
+ <a u="773F" b="B1 8B"/>
+ <a u="7740" b="D7 C5"/>
+ <a u="7741" b="D5 F6"/>
+ <a u="7742" b="B1 8C"/>
+ <a u="7743" b="ED FC"/>
+ <a u="7744" b="B1 8D"/>
+ <a u="7745" b="B1 8E"/>
+ <a u="7746" b="B1 8F"/>
+ <a u="7747" b="ED FB"/>
+ <a u="7748" b="B1 90"/>
+ <a u="7749" b="B1 91"/>
+ <a u="774A" b="B1 92"/>
+ <a u="774B" b="B1 93"/>
+ <a u="774C" b="B1 94"/>
+ <a u="774D" b="B1 95"/>
+ <a u="774E" b="B1 96"/>
+ <a u="774F" b="B1 97"/>
+ <a u="7750" b="ED F9"/>
+ <a u="7751" b="ED FA"/>
+ <a u="7752" b="B1 98"/>
+ <a u="7753" b="B1 99"/>
+ <a u="7754" b="B1 9A"/>
+ <a u="7755" b="B1 9B"/>
+ <a u="7756" b="B1 9C"/>
+ <a u="7757" b="B1 9D"/>
+ <a u="7758" b="B1 9E"/>
+ <a u="7759" b="B1 9F"/>
+ <a u="775A" b="ED FD"/>
+ <a u="775B" b="BE A6"/>
+ <a u="775C" b="B1 A0"/>
+ <a u="775D" b="B2 40"/>
+ <a u="775E" b="B2 41"/>
+ <a u="775F" b="B2 42"/>
+ <a u="7760" b="B2 43"/>
+ <a u="7761" b="CB AF"/>
+ <a u="7762" b="EE A1"/>
+ <a u="7763" b="B6 BD"/>
+ <a u="7764" b="B2 44"/>
+ <a u="7765" b="EE A2"/>
+ <a u="7766" b="C4 C0"/>
+ <a u="7767" b="B2 45"/>
+ <a u="7768" b="ED FE"/>
+ <a u="7769" b="B2 46"/>
+ <a u="776A" b="B2 47"/>
+ <a u="776B" b="BD DE"/>
+ <a u="776C" b="B2 C7"/>
+ <a u="776D" b="B2 48"/>
+ <a u="776E" b="B2 49"/>
+ <a u="776F" b="B2 4A"/>
+ <a u="7770" b="B2 4B"/>
+ <a u="7771" b="B2 4C"/>
+ <a u="7772" b="B2 4D"/>
+ <a u="7773" b="B2 4E"/>
+ <a u="7774" b="B2 4F"/>
+ <a u="7775" b="B2 50"/>
+ <a u="7776" b="B2 51"/>
+ <a u="7777" b="B2 52"/>
+ <a u="7778" b="B2 53"/>
+ <a u="7779" b="B6 C3"/>
+ <a u="777A" b="B2 54"/>
+ <a u="777B" b="B2 55"/>
+ <a u="777C" b="B2 56"/>
+ <a u="777D" b="EE A5"/>
+ <a u="777E" b="D8 BA"/>
+ <a u="777F" b="EE A3"/>
+ <a u="7780" b="EE A6"/>
+ <a u="7781" b="B2 57"/>
+ <a u="7782" b="B2 58"/>
+ <a u="7783" b="B2 59"/>
+ <a u="7784" b="C3 E9"/>
+ <a u="7785" b="B3 F2"/>
+ <a u="7786" b="B2 5A"/>
+ <a u="7787" b="B2 5B"/>
+ <a u="7788" b="B2 5C"/>
+ <a u="7789" b="B2 5D"/>
+ <a u="778A" b="B2 5E"/>
+ <a u="778B" b="B2 5F"/>
+ <a u="778C" b="EE A7"/>
+ <a u="778D" b="EE A4"/>
+ <a u="778E" b="CF B9"/>
+ <a u="778F" b="B2 60"/>
+ <a u="7790" b="B2 61"/>
+ <a u="7791" b="EE A8"/>
+ <a u="7792" b="C2 F7"/>
+ <a u="7793" b="B2 62"/>
+ <a u="7794" b="B2 63"/>
+ <a u="7795" b="B2 64"/>
+ <a u="7796" b="B2 65"/>
+ <a u="7797" b="B2 66"/>
+ <a u="7798" b="B2 67"/>
+ <a u="7799" b="B2 68"/>
+ <a u="779A" b="B2 69"/>
+ <a u="779B" b="B2 6A"/>
+ <a u="779C" b="B2 6B"/>
+ <a u="779D" b="B2 6C"/>
+ <a u="779E" b="B2 6D"/>
+ <a u="779F" b="EE A9"/>
+ <a u="77A0" b="EE AA"/>
+ <a u="77A1" b="B2 6E"/>
+ <a u="77A2" b="DE AB"/>
+ <a u="77A3" b="B2 6F"/>
+ <a u="77A4" b="B2 70"/>
+ <a u="77A5" b="C6 B3"/>
+ <a u="77A6" b="B2 71"/>
+ <a u="77A7" b="C7 C6"/>
+ <a u="77A8" b="B2 72"/>
+ <a u="77A9" b="D6 F5"/>
+ <a u="77AA" b="B5 C9"/>
+ <a u="77AB" b="B2 73"/>
+ <a u="77AC" b="CB B2"/>
+ <a u="77AD" b="B2 74"/>
+ <a u="77AE" b="B2 75"/>
+ <a u="77AF" b="B2 76"/>
+ <a u="77B0" b="EE AB"/>
+ <a u="77B1" b="B2 77"/>
+ <a u="77B2" b="B2 78"/>
+ <a u="77B3" b="CD AB"/>
+ <a u="77B4" b="B2 79"/>
+ <a u="77B5" b="EE AC"/>
+ <a u="77B6" b="B2 7A"/>
+ <a u="77B7" b="B2 7B"/>
+ <a u="77B8" b="B2 7C"/>
+ <a u="77B9" b="B2 7D"/>
+ <a u="77BA" b="B2 7E"/>
+ <a u="77BB" b="D5 B0"/>
+ <a u="77BC" b="B2 80"/>
+ <a u="77BD" b="EE AD"/>
+ <a u="77BE" b="B2 81"/>
+ <a u="77BF" b="F6 C4"/>
+ <a u="77C0" b="B2 82"/>
+ <a u="77C1" b="B2 83"/>
+ <a u="77C2" b="B2 84"/>
+ <a u="77C3" b="B2 85"/>
+ <a u="77C4" b="B2 86"/>
+ <a u="77C5" b="B2 87"/>
+ <a u="77C6" b="B2 88"/>
+ <a u="77C7" b="B2 89"/>
+ <a u="77C8" b="B2 8A"/>
+ <a u="77C9" b="B2 8B"/>
+ <a u="77CA" b="B2 8C"/>
+ <a u="77CB" b="B2 8D"/>
+ <a u="77CC" b="B2 8E"/>
+ <a u="77CD" b="DB C7"/>
+ <a u="77CE" b="B2 8F"/>
+ <a u="77CF" b="B2 90"/>
+ <a u="77D0" b="B2 91"/>
+ <a u="77D1" b="B2 92"/>
+ <a u="77D2" b="B2 93"/>
+ <a u="77D3" b="B2 94"/>
+ <a u="77D4" b="B2 95"/>
+ <a u="77D5" b="B2 96"/>
+ <a u="77D6" b="B2 97"/>
+ <a u="77D7" b="B4 A3"/>
+ <a u="77D8" b="B2 98"/>
+ <a u="77D9" b="B2 99"/>
+ <a u="77DA" b="B2 9A"/>
+ <a u="77DB" b="C3 AC"/>
+ <a u="77DC" b="F1 E6"/>
+ <a u="77DD" b="B2 9B"/>
+ <a u="77DE" b="B2 9C"/>
+ <a u="77DF" b="B2 9D"/>
+ <a u="77E0" b="B2 9E"/>
+ <a u="77E1" b="B2 9F"/>
+ <a u="77E2" b="CA B8"/>
+ <a u="77E3" b="D2 D3"/>
+ <a u="77E4" b="B2 A0"/>
+ <a u="77E5" b="D6 AA"/>
+ <a u="77E6" b="B3 40"/>
+ <a u="77E7" b="EF F2"/>
+ <a u="77E8" b="B3 41"/>
+ <a u="77E9" b="BE D8"/>
+ <a u="77EA" b="B3 42"/>
+ <a u="77EB" b="BD C3"/>
+ <a u="77EC" b="EF F3"/>
+ <a u="77ED" b="B6 CC"/>
+ <a u="77EE" b="B0 AB"/>
+ <a u="77EF" b="B3 43"/>
+ <a u="77F0" b="B3 44"/>
+ <a u="77F1" b="B3 45"/>
+ <a u="77F2" b="B3 46"/>
+ <a u="77F3" b="CA AF"/>
+ <a u="77F4" b="B3 47"/>
+ <a u="77F5" b="B3 48"/>
+ <a u="77F6" b="ED B6"/>
+ <a u="77F7" b="B3 49"/>
+ <a u="77F8" b="ED B7"/>
+ <a u="77F9" b="B3 4A"/>
+ <a u="77FA" b="B3 4B"/>
+ <a u="77FB" b="B3 4C"/>
+ <a u="77FC" b="B3 4D"/>
+ <a u="77FD" b="CE F9"/>
+ <a u="77FE" b="B7 AF"/>
+ <a u="77FF" b="BF F3"/>
+ <a u="7800" b="ED B8"/>
+ <a u="7801" b="C2 EB"/>
+ <a u="7802" b="C9 B0"/>
+ <a u="7803" b="B3 4E"/>
+ <a u="7804" b="B3 4F"/>
+ <a u="7805" b="B3 50"/>
+ <a u="7806" b="B3 51"/>
+ <a u="7807" b="B3 52"/>
+ <a u="7808" b="B3 53"/>
+ <a u="7809" b="ED B9"/>
+ <a u="780A" b="B3 54"/>
+ <a u="780B" b="B3 55"/>
+ <a u="780C" b="C6 F6"/>
+ <a u="780D" b="BF B3"/>
+ <a u="780E" b="B3 56"/>
+ <a u="780F" b="B3 57"/>
+ <a u="7810" b="B3 58"/>
+ <a u="7811" b="ED BC"/>
+ <a u="7812" b="C5 F8"/>
+ <a u="7813" b="B3 59"/>
+ <a u="7814" b="D1 D0"/>
+ <a u="7815" b="B3 5A"/>
+ <a u="7816" b="D7 A9"/>
+ <a u="7817" b="ED BA"/>
+ <a u="7818" b="ED BB"/>
+ <a u="7819" b="B3 5B"/>
+ <a u="781A" b="D1 E2"/>
+ <a u="781B" b="B3 5C"/>
+ <a u="781C" b="ED BF"/>
+ <a u="781D" b="ED C0"/>
+ <a u="781E" b="B3 5D"/>
+ <a u="781F" b="ED C4"/>
+ <a u="7820" b="B3 5E"/>
+ <a u="7821" b="B3 5F"/>
+ <a u="7822" b="B3 60"/>
+ <a u="7823" b="ED C8"/>
+ <a u="7824" b="B3 61"/>
+ <a u="7825" b="ED C6"/>
+ <a u="7826" b="ED CE"/>
+ <a u="7827" b="D5 E8"/>
+ <a u="7828" b="B3 62"/>
+ <a u="7829" b="ED C9"/>
+ <a u="782A" b="B3 63"/>
+ <a u="782B" b="B3 64"/>
+ <a u="782C" b="ED C7"/>
+ <a u="782D" b="ED BE"/>
+ <a u="782E" b="B3 65"/>
+ <a u="782F" b="B3 66"/>
+ <a u="7830" b="C5 E9"/>
+ <a u="7831" b="B3 67"/>
+ <a u="7832" b="B3 68"/>
+ <a u="7833" b="B3 69"/>
+ <a u="7834" b="C6 C6"/>
+ <a u="7835" b="B3 6A"/>
+ <a u="7836" b="B3 6B"/>
+ <a u="7837" b="C9 E9"/>
+ <a u="7838" b="D4 D2"/>
+ <a u="7839" b="ED C1"/>
+ <a u="783A" b="ED C2"/>
+ <a u="783B" b="ED C3"/>
+ <a u="783C" b="ED C5"/>
+ <a u="783D" b="B3 6C"/>
+ <a u="783E" b="C0 F9"/>
+ <a u="783F" b="B3 6D"/>
+ <a u="7840" b="B4 A1"/>
+ <a u="7841" b="B3 6E"/>
+ <a u="7842" b="B3 6F"/>
+ <a u="7843" b="B3 70"/>
+ <a u="7844" b="B3 71"/>
+ <a u="7845" b="B9 E8"/>
+ <a u="7846" b="B3 72"/>
+ <a u="7847" b="ED D0"/>
+ <a u="7848" b="B3 73"/>
+ <a u="7849" b="B3 74"/>
+ <a u="784A" b="B3 75"/>
+ <a u="784B" b="B3 76"/>
+ <a u="784C" b="ED D1"/>
+ <a u="784D" b="B3 77"/>
+ <a u="784E" b="ED CA"/>
+ <a u="784F" b="B3 78"/>
+ <a u="7850" b="ED CF"/>
+ <a u="7851" b="B3 79"/>
+ <a u="7852" b="CE F8"/>
+ <a u="7853" b="B3 7A"/>
+ <a u="7854" b="B3 7B"/>
+ <a u="7855" b="CB B6"/>
+ <a u="7856" b="ED CC"/>
+ <a u="7857" b="ED CD"/>
+ <a u="7858" b="B3 7C"/>
+ <a u="7859" b="B3 7D"/>
+ <a u="785A" b="B3 7E"/>
+ <a u="785B" b="B3 80"/>
+ <a u="785C" b="B3 81"/>
+ <a u="785D" b="CF F5"/>
+ <a u="785E" b="B3 82"/>
+ <a u="785F" b="B3 83"/>
+ <a u="7860" b="B3 84"/>
+ <a u="7861" b="B3 85"/>
+ <a u="7862" b="B3 86"/>
+ <a u="7863" b="B3 87"/>
+ <a u="7864" b="B3 88"/>
+ <a u="7865" b="B3 89"/>
+ <a u="7866" b="B3 8A"/>
+ <a u="7867" b="B3 8B"/>
+ <a u="7868" b="B3 8C"/>
+ <a u="7869" b="B3 8D"/>
+ <a u="786A" b="ED D2"/>
+ <a u="786B" b="C1 F2"/>
+ <a u="786C" b="D3 B2"/>
+ <a u="786D" b="ED CB"/>
+ <a u="786E" b="C8 B7"/>
+ <a u="786F" b="B3 8E"/>
+ <a u="7870" b="B3 8F"/>
+ <a u="7871" b="B3 90"/>
+ <a u="7872" b="B3 91"/>
+ <a u="7873" b="B3 92"/>
+ <a u="7874" b="B3 93"/>
+ <a u="7875" b="B3 94"/>
+ <a u="7876" b="B3 95"/>
+ <a u="7877" b="BC EF"/>
+ <a u="7878" b="B3 96"/>
+ <a u="7879" b="B3 97"/>
+ <a u="787A" b="B3 98"/>
+ <a u="787B" b="B3 99"/>
+ <a u="787C" b="C5 F0"/>
+ <a u="787D" b="B3 9A"/>
+ <a u="787E" b="B3 9B"/>
+ <a u="787F" b="B3 9C"/>
+ <a u="7880" b="B3 9D"/>
+ <a u="7881" b="B3 9E"/>
+ <a u="7882" b="B3 9F"/>
+ <a u="7883" b="B3 A0"/>
+ <a u="7884" b="B4 40"/>
+ <a u="7885" b="B4 41"/>
+ <a u="7886" b="B4 42"/>
+ <a u="7887" b="ED D6"/>
+ <a u="7888" b="B4 43"/>
+ <a u="7889" b="B5 EF"/>
+ <a u="788A" b="B4 44"/>
+ <a u="788B" b="B4 45"/>
+ <a u="788C" b="C2 B5"/>
+ <a u="788D" b="B0 AD"/>
+ <a u="788E" b="CB E9"/>
+ <a u="788F" b="B4 46"/>
+ <a u="7890" b="B4 47"/>
+ <a u="7891" b="B1 AE"/>
+ <a u="7892" b="B4 48"/>
+ <a u="7893" b="ED D4"/>
+ <a u="7894" b="B4 49"/>
+ <a u="7895" b="B4 4A"/>
+ <a u="7896" b="B4 4B"/>
+ <a u="7897" b="CD EB"/>
+ <a u="7898" b="B5 E2"/>
+ <a u="7899" b="B4 4C"/>
+ <a u="789A" b="ED D5"/>
+ <a u="789B" b="ED D3"/>
+ <a u="789C" b="ED D7"/>
+ <a u="789D" b="B4 4D"/>
+ <a u="789E" b="B4 4E"/>
+ <a u="789F" b="B5 FA"/>
+ <a u="78A0" b="B4 4F"/>
+ <a u="78A1" b="ED D8"/>
+ <a u="78A2" b="B4 50"/>
+ <a u="78A3" b="ED D9"/>
+ <a u="78A4" b="B4 51"/>
+ <a u="78A5" b="ED DC"/>
+ <a u="78A6" b="B4 52"/>
+ <a u="78A7" b="B1 CC"/>
+ <a u="78A8" b="B4 53"/>
+ <a u="78A9" b="B4 54"/>
+ <a u="78AA" b="B4 55"/>
+ <a u="78AB" b="B4 56"/>
+ <a u="78AC" b="B4 57"/>
+ <a u="78AD" b="B4 58"/>
+ <a u="78AE" b="B4 59"/>
+ <a u="78AF" b="B4 5A"/>
+ <a u="78B0" b="C5 F6"/>
+ <a u="78B1" b="BC EE"/>
+ <a u="78B2" b="ED DA"/>
+ <a u="78B3" b="CC BC"/>
+ <a u="78B4" b="B2 EA"/>
+ <a u="78B5" b="B4 5B"/>
+ <a u="78B6" b="B4 5C"/>
+ <a u="78B7" b="B4 5D"/>
+ <a u="78B8" b="B4 5E"/>
+ <a u="78B9" b="ED DB"/>
+ <a u="78BA" b="B4 5F"/>
+ <a u="78BB" b="B4 60"/>
+ <a u="78BC" b="B4 61"/>
+ <a u="78BD" b="B4 62"/>
+ <a u="78BE" b="C4 EB"/>
+ <a u="78BF" b="B4 63"/>
+ <a u="78C0" b="B4 64"/>
+ <a u="78C1" b="B4 C5"/>
+ <a u="78C2" b="B4 65"/>
+ <a u="78C3" b="B4 66"/>
+ <a u="78C4" b="B4 67"/>
+ <a u="78C5" b="B0 F5"/>
+ <a u="78C6" b="B4 68"/>
+ <a u="78C7" b="B4 69"/>
+ <a u="78C8" b="B4 6A"/>
+ <a u="78C9" b="ED DF"/>
+ <a u="78CA" b="C0 DA"/>
+ <a u="78CB" b="B4 E8"/>
+ <a u="78CC" b="B4 6B"/>
+ <a u="78CD" b="B4 6C"/>
+ <a u="78CE" b="B4 6D"/>
+ <a u="78CF" b="B4 6E"/>
+ <a u="78D0" b="C5 CD"/>
+ <a u="78D1" b="B4 6F"/>
+ <a u="78D2" b="B4 70"/>
+ <a u="78D3" b="B4 71"/>
+ <a u="78D4" b="ED DD"/>
+ <a u="78D5" b="BF C4"/>
+ <a u="78D6" b="B4 72"/>
+ <a u="78D7" b="B4 73"/>
+ <a u="78D8" b="B4 74"/>
+ <a u="78D9" b="ED DE"/>
+ <a u="78DA" b="B4 75"/>
+ <a u="78DB" b="B4 76"/>
+ <a u="78DC" b="B4 77"/>
+ <a u="78DD" b="B4 78"/>
+ <a u="78DE" b="B4 79"/>
+ <a u="78DF" b="B4 7A"/>
+ <a u="78E0" b="B4 7B"/>
+ <a u="78E1" b="B4 7C"/>
+ <a u="78E2" b="B4 7D"/>
+ <a u="78E3" b="B4 7E"/>
+ <a u="78E4" b="B4 80"/>
+ <a u="78E5" b="B4 81"/>
+ <a u="78E6" b="B4 82"/>
+ <a u="78E7" b="B4 83"/>
+ <a u="78E8" b="C4 A5"/>
+ <a u="78E9" b="B4 84"/>
+ <a u="78EA" b="B4 85"/>
+ <a u="78EB" b="B4 86"/>
+ <a u="78EC" b="ED E0"/>
+ <a u="78ED" b="B4 87"/>
+ <a u="78EE" b="B4 88"/>
+ <a u="78EF" b="B4 89"/>
+ <a u="78F0" b="B4 8A"/>
+ <a u="78F1" b="B4 8B"/>
+ <a u="78F2" b="ED E1"/>
+ <a u="78F3" b="B4 8C"/>
+ <a u="78F4" b="ED E3"/>
+ <a u="78F5" b="B4 8D"/>
+ <a u="78F6" b="B4 8E"/>
+ <a u="78F7" b="C1 D7"/>
+ <a u="78F8" b="B4 8F"/>
+ <a u="78F9" b="B4 90"/>
+ <a u="78FA" b="BB C7"/>
+ <a u="78FB" b="B4 91"/>
+ <a u="78FC" b="B4 92"/>
+ <a u="78FD" b="B4 93"/>
+ <a u="78FE" b="B4 94"/>
+ <a u="78FF" b="B4 95"/>
+ <a u="7900" b="B4 96"/>
+ <a u="7901" b="BD B8"/>
+ <a u="7902" b="B4 97"/>
+ <a u="7903" b="B4 98"/>
+ <a u="7904" b="B4 99"/>
+ <a u="7905" b="ED E2"/>
+ <a u="7906" b="B4 9A"/>
+ <a u="7907" b="B4 9B"/>
+ <a u="7908" b="B4 9C"/>
+ <a u="7909" b="B4 9D"/>
+ <a u="790A" b="B4 9E"/>
+ <a u="790B" b="B4 9F"/>
+ <a u="790C" b="B4 A0"/>
+ <a u="790D" b="B5 40"/>
+ <a u="790E" b="B5 41"/>
+ <a u="790F" b="B5 42"/>
+ <a u="7910" b="B5 43"/>
+ <a u="7911" b="B5 44"/>
+ <a u="7912" b="B5 45"/>
+ <a u="7913" b="ED E4"/>
+ <a u="7914" b="B5 46"/>
+ <a u="7915" b="B5 47"/>
+ <a u="7916" b="B5 48"/>
+ <a u="7917" b="B5 49"/>
+ <a u="7918" b="B5 4A"/>
+ <a u="7919" b="B5 4B"/>
+ <a u="791A" b="B5 4C"/>
+ <a u="791B" b="B5 4D"/>
+ <a u="791C" b="B5 4E"/>
+ <a u="791D" b="B5 4F"/>
+ <a u="791E" b="ED E6"/>
+ <a u="791F" b="B5 50"/>
+ <a u="7920" b="B5 51"/>
+ <a u="7921" b="B5 52"/>
+ <a u="7922" b="B5 53"/>
+ <a u="7923" b="B5 54"/>
+ <a u="7924" b="ED E5"/>
+ <a u="7925" b="B5 55"/>
+ <a u="7926" b="B5 56"/>
+ <a u="7927" b="B5 57"/>
+ <a u="7928" b="B5 58"/>
+ <a u="7929" b="B5 59"/>
+ <a u="792A" b="B5 5A"/>
+ <a u="792B" b="B5 5B"/>
+ <a u="792C" b="B5 5C"/>
+ <a u="792D" b="B5 5D"/>
+ <a u="792E" b="B5 5E"/>
+ <a u="792F" b="B5 5F"/>
+ <a u="7930" b="B5 60"/>
+ <a u="7931" b="B5 61"/>
+ <a u="7932" b="B5 62"/>
+ <a u="7933" b="B5 63"/>
+ <a u="7934" b="ED E7"/>
+ <a u="7935" b="B5 64"/>
+ <a u="7936" b="B5 65"/>
+ <a u="7937" b="B5 66"/>
+ <a u="7938" b="B5 67"/>
+ <a u="7939" b="B5 68"/>
+ <a u="793A" b="CA BE"/>
+ <a u="793B" b="EC EA"/>
+ <a u="793C" b="C0 F1"/>
+ <a u="793D" b="B5 69"/>
+ <a u="793E" b="C9 E7"/>
+ <a u="793F" b="B5 6A"/>
+ <a u="7940" b="EC EB"/>
+ <a u="7941" b="C6 EE"/>
+ <a u="7942" b="B5 6B"/>
+ <a u="7943" b="B5 6C"/>
+ <a u="7944" b="B5 6D"/>
+ <a u="7945" b="B5 6E"/>
+ <a u="7946" b="EC EC"/>
+ <a u="7947" b="B5 6F"/>
+ <a u="7948" b="C6 ED"/>
+ <a u="7949" b="EC ED"/>
+ <a u="794A" b="B5 70"/>
+ <a u="794B" b="B5 71"/>
+ <a u="794C" b="B5 72"/>
+ <a u="794D" b="B5 73"/>
+ <a u="794E" b="B5 74"/>
+ <a u="794F" b="B5 75"/>
+ <a u="7950" b="B5 76"/>
+ <a u="7951" b="B5 77"/>
+ <a u="7952" b="B5 78"/>
+ <a u="7953" b="EC F0"/>
+ <a u="7954" b="B5 79"/>
+ <a u="7955" b="B5 7A"/>
+ <a u="7956" b="D7 E6"/>
+ <a u="7957" b="EC F3"/>
+ <a u="7958" b="B5 7B"/>
+ <a u="7959" b="B5 7C"/>
+ <a u="795A" b="EC F1"/>
+ <a u="795B" b="EC EE"/>
+ <a u="795C" b="EC EF"/>
+ <a u="795D" b="D7 A3"/>
+ <a u="795E" b="C9 F1"/>
+ <a u="795F" b="CB EE"/>
+ <a u="7960" b="EC F4"/>
+ <a u="7961" b="B5 7D"/>
+ <a u="7962" b="EC F2"/>
+ <a u="7963" b="B5 7E"/>
+ <a u="7964" b="B5 80"/>
+ <a u="7965" b="CF E9"/>
+ <a u="7966" b="B5 81"/>
+ <a u="7967" b="EC F6"/>
+ <a u="7968" b="C6 B1"/>
+ <a u="7969" b="B5 82"/>
+ <a u="796A" b="B5 83"/>
+ <a u="796B" b="B5 84"/>
+ <a u="796C" b="B5 85"/>
+ <a u="796D" b="BC C0"/>
+ <a u="796E" b="B5 86"/>
+ <a u="796F" b="EC F5"/>
+ <a u="7970" b="B5 87"/>
+ <a u="7971" b="B5 88"/>
+ <a u="7972" b="B5 89"/>
+ <a u="7973" b="B5 8A"/>
+ <a u="7974" b="B5 8B"/>
+ <a u="7975" b="B5 8C"/>
+ <a u="7976" b="B5 8D"/>
+ <a u="7977" b="B5 BB"/>
+ <a u="7978" b="BB F6"/>
+ <a u="7979" b="B5 8E"/>
+ <a u="797A" b="EC F7"/>
+ <a u="797B" b="B5 8F"/>
+ <a u="797C" b="B5 90"/>
+ <a u="797D" b="B5 91"/>
+ <a u="797E" b="B5 92"/>
+ <a u="797F" b="B5 93"/>
+ <a u="7980" b="D9 F7"/>
+ <a u="7981" b="BD FB"/>
+ <a u="7982" b="B5 94"/>
+ <a u="7983" b="B5 95"/>
+ <a u="7984" b="C2 BB"/>
+ <a u="7985" b="EC F8"/>
+ <a u="7986" b="B5 96"/>
+ <a u="7987" b="B5 97"/>
+ <a u="7988" b="B5 98"/>
+ <a u="7989" b="B5 99"/>
+ <a u="798A" b="EC F9"/>
+ <a u="798B" b="B5 9A"/>
+ <a u="798C" b="B5 9B"/>
+ <a u="798D" b="B5 9C"/>
+ <a u="798E" b="B5 9D"/>
+ <a u="798F" b="B8 A3"/>
+ <a u="7990" b="B5 9E"/>
+ <a u="7991" b="B5 9F"/>
+ <a u="7992" b="B5 A0"/>
+ <a u="7993" b="B6 40"/>
+ <a u="7994" b="B6 41"/>
+ <a u="7995" b="B6 42"/>
+ <a u="7996" b="B6 43"/>
+ <a u="7997" b="B6 44"/>
+ <a u="7998" b="B6 45"/>
+ <a u="7999" b="B6 46"/>
+ <a u="799A" b="EC FA"/>
+ <a u="799B" b="B6 47"/>
+ <a u="799C" b="B6 48"/>
+ <a u="799D" b="B6 49"/>
+ <a u="799E" b="B6 4A"/>
+ <a u="799F" b="B6 4B"/>
+ <a u="79A0" b="B6 4C"/>
+ <a u="79A1" b="B6 4D"/>
+ <a u="79A2" b="B6 4E"/>
+ <a u="79A3" b="B6 4F"/>
+ <a u="79A4" b="B6 50"/>
+ <a u="79A5" b="B6 51"/>
+ <a u="79A6" b="B6 52"/>
+ <a u="79A7" b="EC FB"/>
+ <a u="79A8" b="B6 53"/>
+ <a u="79A9" b="B6 54"/>
+ <a u="79AA" b="B6 55"/>
+ <a u="79AB" b="B6 56"/>
+ <a u="79AC" b="B6 57"/>
+ <a u="79AD" b="B6 58"/>
+ <a u="79AE" b="B6 59"/>
+ <a u="79AF" b="B6 5A"/>
+ <a u="79B0" b="B6 5B"/>
+ <a u="79B1" b="B6 5C"/>
+ <a u="79B2" b="B6 5D"/>
+ <a u="79B3" b="EC FC"/>
+ <a u="79B4" b="B6 5E"/>
+ <a u="79B5" b="B6 5F"/>
+ <a u="79B6" b="B6 60"/>
+ <a u="79B7" b="B6 61"/>
+ <a u="79B8" b="B6 62"/>
+ <a u="79B9" b="D3 ED"/>
+ <a u="79BA" b="D8 AE"/>
+ <a u="79BB" b="C0 EB"/>
+ <a u="79BC" b="B6 63"/>
+ <a u="79BD" b="C7 DD"/>
+ <a u="79BE" b="BA CC"/>
+ <a u="79BF" b="B6 64"/>
+ <a u="79C0" b="D0 E3"/>
+ <a u="79C1" b="CB BD"/>
+ <a u="79C2" b="B6 65"/>
+ <a u="79C3" b="CD BA"/>
+ <a u="79C4" b="B6 66"/>
+ <a u="79C5" b="B6 67"/>
+ <a u="79C6" b="B8 D1"/>
+ <a u="79C7" b="B6 68"/>
+ <a u="79C8" b="B6 69"/>
+ <a u="79C9" b="B1 FC"/>
+ <a u="79CA" b="B6 6A"/>
+ <a u="79CB" b="C7 EF"/>
+ <a u="79CC" b="B6 6B"/>
+ <a u="79CD" b="D6 D6"/>
+ <a u="79CE" b="B6 6C"/>
+ <a u="79CF" b="B6 6D"/>
+ <a u="79D0" b="B6 6E"/>
+ <a u="79D1" b="BF C6"/>
+ <a u="79D2" b="C3 EB"/>
+ <a u="79D3" b="B6 6F"/>
+ <a u="79D4" b="B6 70"/>
+ <a u="79D5" b="EF F5"/>
+ <a u="79D6" b="B6 71"/>
+ <a u="79D7" b="B6 72"/>
+ <a u="79D8" b="C3 D8"/>
+ <a u="79D9" b="B6 73"/>
+ <a u="79DA" b="B6 74"/>
+ <a u="79DB" b="B6 75"/>
+ <a u="79DC" b="B6 76"/>
+ <a u="79DD" b="B6 77"/>
+ <a u="79DE" b="B6 78"/>
+ <a u="79DF" b="D7 E2"/>
+ <a u="79E0" b="B6 79"/>
+ <a u="79E1" b="B6 7A"/>
+ <a u="79E2" b="B6 7B"/>
+ <a u="79E3" b="EF F7"/>
+ <a u="79E4" b="B3 D3"/>
+ <a u="79E5" b="B6 7C"/>
+ <a u="79E6" b="C7 D8"/>
+ <a u="79E7" b="D1 ED"/>
+ <a u="79E8" b="B6 7D"/>
+ <a u="79E9" b="D6 C8"/>
+ <a u="79EA" b="B6 7E"/>
+ <a u="79EB" b="EF F8"/>
+ <a u="79EC" b="B6 80"/>
+ <a u="79ED" b="EF F6"/>
+ <a u="79EE" b="B6 81"/>
+ <a u="79EF" b="BB FD"/>
+ <a u="79F0" b="B3 C6"/>
+ <a u="79F1" b="B6 82"/>
+ <a u="79F2" b="B6 83"/>
+ <a u="79F3" b="B6 84"/>
+ <a u="79F4" b="B6 85"/>
+ <a u="79F5" b="B6 86"/>
+ <a u="79F6" b="B6 87"/>
+ <a u="79F7" b="B6 88"/>
+ <a u="79F8" b="BD D5"/>
+ <a u="79F9" b="B6 89"/>
+ <a u="79FA" b="B6 8A"/>
+ <a u="79FB" b="D2 C6"/>
+ <a u="79FC" b="B6 8B"/>
+ <a u="79FD" b="BB E0"/>
+ <a u="79FE" b="B6 8C"/>
+ <a u="79FF" b="B6 8D"/>
+ <a u="7A00" b="CF A1"/>
+ <a u="7A01" b="B6 8E"/>
+ <a u="7A02" b="EF FC"/>
+ <a u="7A03" b="EF FB"/>
+ <a u="7A04" b="B6 8F"/>
+ <a u="7A05" b="B6 90"/>
+ <a u="7A06" b="EF F9"/>
+ <a u="7A07" b="B6 91"/>
+ <a u="7A08" b="B6 92"/>
+ <a u="7A09" b="B6 93"/>
+ <a u="7A0A" b="B6 94"/>
+ <a u="7A0B" b="B3 CC"/>
+ <a u="7A0C" b="B6 95"/>
+ <a u="7A0D" b="C9 D4"/>
+ <a u="7A0E" b="CB B0"/>
+ <a u="7A0F" b="B6 96"/>
+ <a u="7A10" b="B6 97"/>
+ <a u="7A11" b="B6 98"/>
+ <a u="7A12" b="B6 99"/>
+ <a u="7A13" b="B6 9A"/>
+ <a u="7A14" b="EF FE"/>
+ <a u="7A15" b="B6 9B"/>
+ <a u="7A16" b="B6 9C"/>
+ <a u="7A17" b="B0 DE"/>
+ <a u="7A18" b="B6 9D"/>
+ <a u="7A19" b="B6 9E"/>
+ <a u="7A1A" b="D6 C9"/>
+ <a u="7A1B" b="B6 9F"/>
+ <a u="7A1C" b="B6 A0"/>
+ <a u="7A1D" b="B7 40"/>
+ <a u="7A1E" b="EF FD"/>
+ <a u="7A1F" b="B7 41"/>
+ <a u="7A20" b="B3 ED"/>
+ <a u="7A21" b="B7 42"/>
+ <a u="7A22" b="B7 43"/>
+ <a u="7A23" b="F6 D5"/>
+ <a u="7A24" b="B7 44"/>
+ <a u="7A25" b="B7 45"/>
+ <a u="7A26" b="B7 46"/>
+ <a u="7A27" b="B7 47"/>
+ <a u="7A28" b="B7 48"/>
+ <a u="7A29" b="B7 49"/>
+ <a u="7A2A" b="B7 4A"/>
+ <a u="7A2B" b="B7 4B"/>
+ <a u="7A2C" b="B7 4C"/>
+ <a u="7A2D" b="B7 4D"/>
+ <a u="7A2E" b="B7 4E"/>
+ <a u="7A2F" b="B7 4F"/>
+ <a u="7A30" b="B7 50"/>
+ <a u="7A31" b="B7 51"/>
+ <a u="7A32" b="B7 52"/>
+ <a u="7A33" b="CE C8"/>
+ <a u="7A34" b="B7 53"/>
+ <a u="7A35" b="B7 54"/>
+ <a u="7A36" b="B7 55"/>
+ <a u="7A37" b="F0 A2"/>
+ <a u="7A38" b="B7 56"/>
+ <a u="7A39" b="F0 A1"/>
+ <a u="7A3A" b="B7 57"/>
+ <a u="7A3B" b="B5 BE"/>
+ <a u="7A3C" b="BC DA"/>
+ <a u="7A3D" b="BB FC"/>
+ <a u="7A3E" b="B7 58"/>
+ <a u="7A3F" b="B8 E5"/>
+ <a u="7A40" b="B7 59"/>
+ <a u="7A41" b="B7 5A"/>
+ <a u="7A42" b="B7 5B"/>
+ <a u="7A43" b="B7 5C"/>
+ <a u="7A44" b="B7 5D"/>
+ <a u="7A45" b="B7 5E"/>
+ <a u="7A46" b="C4 C2"/>
+ <a u="7A47" b="B7 5F"/>
+ <a u="7A48" b="B7 60"/>
+ <a u="7A49" b="B7 61"/>
+ <a u="7A4A" b="B7 62"/>
+ <a u="7A4B" b="B7 63"/>
+ <a u="7A4C" b="B7 64"/>
+ <a u="7A4D" b="B7 65"/>
+ <a u="7A4E" b="B7 66"/>
+ <a u="7A4F" b="B7 67"/>
+ <a u="7A50" b="B7 68"/>
+ <a u="7A51" b="F0 A3"/>
+ <a u="7A52" b="B7 69"/>
+ <a u="7A53" b="B7 6A"/>
+ <a u="7A54" b="B7 6B"/>
+ <a u="7A55" b="B7 6C"/>
+ <a u="7A56" b="B7 6D"/>
+ <a u="7A57" b="CB EB"/>
+ <a u="7A58" b="B7 6E"/>
+ <a u="7A59" b="B7 6F"/>
+ <a u="7A5A" b="B7 70"/>
+ <a u="7A5B" b="B7 71"/>
+ <a u="7A5C" b="B7 72"/>
+ <a u="7A5D" b="B7 73"/>
+ <a u="7A5E" b="B7 74"/>
+ <a u="7A5F" b="B7 75"/>
+ <a u="7A60" b="B7 76"/>
+ <a u="7A61" b="B7 77"/>
+ <a u="7A62" b="B7 78"/>
+ <a u="7A63" b="B7 79"/>
+ <a u="7A64" b="B7 7A"/>
+ <a u="7A65" b="B7 7B"/>
+ <a u="7A66" b="B7 7C"/>
+ <a u="7A67" b="B7 7D"/>
+ <a u="7A68" b="B7 7E"/>
+ <a u="7A69" b="B7 80"/>
+ <a u="7A6A" b="B7 81"/>
+ <a u="7A6B" b="B7 82"/>
+ <a u="7A6C" b="B7 83"/>
+ <a u="7A6D" b="B7 84"/>
+ <a u="7A6E" b="B7 85"/>
+ <a u="7A6F" b="B7 86"/>
+ <a u="7A70" b="F0 A6"/>
+ <a u="7A71" b="B7 87"/>
+ <a u="7A72" b="B7 88"/>
+ <a u="7A73" b="B7 89"/>
+ <a u="7A74" b="D1 A8"/>
+ <a u="7A75" b="B7 8A"/>
+ <a u="7A76" b="BE BF"/>
+ <a u="7A77" b="C7 EE"/>
+ <a u="7A78" b="F1 B6"/>
+ <a u="7A79" b="F1 B7"/>
+ <a u="7A7A" b="BF D5"/>
+ <a u="7A7B" b="B7 8B"/>
+ <a u="7A7C" b="B7 8C"/>
+ <a u="7A7D" b="B7 8D"/>
+ <a u="7A7E" b="B7 8E"/>
+ <a u="7A7F" b="B4 A9"/>
+ <a u="7A80" b="F1 B8"/>
+ <a u="7A81" b="CD BB"/>
+ <a u="7A82" b="B7 8F"/>
+ <a u="7A83" b="C7 D4"/>
+ <a u="7A84" b="D5 AD"/>
+ <a u="7A85" b="B7 90"/>
+ <a u="7A86" b="F1 B9"/>
+ <a u="7A87" b="B7 91"/>
+ <a u="7A88" b="F1 BA"/>
+ <a u="7A89" b="B7 92"/>
+ <a u="7A8A" b="B7 93"/>
+ <a u="7A8B" b="B7 94"/>
+ <a u="7A8C" b="B7 95"/>
+ <a u="7A8D" b="C7 CF"/>
+ <a u="7A8E" b="B7 96"/>
+ <a u="7A8F" b="B7 97"/>
+ <a u="7A90" b="B7 98"/>
+ <a u="7A91" b="D2 A4"/>
+ <a u="7A92" b="D6 CF"/>
+ <a u="7A93" b="B7 99"/>
+ <a u="7A94" b="B7 9A"/>
+ <a u="7A95" b="F1 BB"/>
+ <a u="7A96" b="BD D1"/>
+ <a u="7A97" b="B4 B0"/>
+ <a u="7A98" b="BE BD"/>
+ <a u="7A99" b="B7 9B"/>
+ <a u="7A9A" b="B7 9C"/>
+ <a u="7A9B" b="B7 9D"/>
+ <a u="7A9C" b="B4 DC"/>
+ <a u="7A9D" b="CE D1"/>
+ <a u="7A9E" b="B7 9E"/>
+ <a u="7A9F" b="BF DF"/>
+ <a u="7AA0" b="F1 BD"/>
+ <a u="7AA1" b="B7 9F"/>
+ <a u="7AA2" b="B7 A0"/>
+ <a u="7AA3" b="B8 40"/>
+ <a u="7AA4" b="B8 41"/>
+ <a u="7AA5" b="BF FA"/>
+ <a u="7AA6" b="F1 BC"/>
+ <a u="7AA7" b="B8 42"/>
+ <a u="7AA8" b="F1 BF"/>
+ <a u="7AA9" b="B8 43"/>
+ <a u="7AAA" b="B8 44"/>
+ <a u="7AAB" b="B8 45"/>
+ <a u="7AAC" b="F1 BE"/>
+ <a u="7AAD" b="F1 C0"/>
+ <a u="7AAE" b="B8 46"/>
+ <a u="7AAF" b="B8 47"/>
+ <a u="7AB0" b="B8 48"/>
+ <a u="7AB1" b="B8 49"/>
+ <a u="7AB2" b="B8 4A"/>
+ <a u="7AB3" b="F1 C1"/>
+ <a u="7AB4" b="B8 4B"/>
+ <a u="7AB5" b="B8 4C"/>
+ <a u="7AB6" b="B8 4D"/>
+ <a u="7AB7" b="B8 4E"/>
+ <a u="7AB8" b="B8 4F"/>
+ <a u="7AB9" b="B8 50"/>
+ <a u="7ABA" b="B8 51"/>
+ <a u="7ABB" b="B8 52"/>
+ <a u="7ABC" b="B8 53"/>
+ <a u="7ABD" b="B8 54"/>
+ <a u="7ABE" b="B8 55"/>
+ <a u="7ABF" b="C1 FE"/>
+ <a u="7AC0" b="B8 56"/>
+ <a u="7AC1" b="B8 57"/>
+ <a u="7AC2" b="B8 58"/>
+ <a u="7AC3" b="B8 59"/>
+ <a u="7AC4" b="B8 5A"/>
+ <a u="7AC5" b="B8 5B"/>
+ <a u="7AC6" b="B8 5C"/>
+ <a u="7AC7" b="B8 5D"/>
+ <a u="7AC8" b="B8 5E"/>
+ <a u="7AC9" b="B8 5F"/>
+ <a u="7ACA" b="B8 60"/>
+ <a u="7ACB" b="C1 A2"/>
+ <a u="7ACC" b="B8 61"/>
+ <a u="7ACD" b="B8 62"/>
+ <a u="7ACE" b="B8 63"/>
+ <a u="7ACF" b="B8 64"/>
+ <a u="7AD0" b="B8 65"/>
+ <a u="7AD1" b="B8 66"/>
+ <a u="7AD2" b="B8 67"/>
+ <a u="7AD3" b="B8 68"/>
+ <a u="7AD4" b="B8 69"/>
+ <a u="7AD5" b="B8 6A"/>
+ <a u="7AD6" b="CA FA"/>
+ <a u="7AD7" b="B8 6B"/>
+ <a u="7AD8" b="B8 6C"/>
+ <a u="7AD9" b="D5 BE"/>
+ <a u="7ADA" b="B8 6D"/>
+ <a u="7ADB" b="B8 6E"/>
+ <a u="7ADC" b="B8 6F"/>
+ <a u="7ADD" b="B8 70"/>
+ <a u="7ADE" b="BE BA"/>
+ <a u="7ADF" b="BE B9"/>
+ <a u="7AE0" b="D5 C2"/>
+ <a u="7AE1" b="B8 71"/>
+ <a u="7AE2" b="B8 72"/>
+ <a u="7AE3" b="BF A2"/>
+ <a u="7AE4" b="B8 73"/>
+ <a u="7AE5" b="CD AF"/>
+ <a u="7AE6" b="F1 B5"/>
+ <a u="7AE7" b="B8 74"/>
+ <a u="7AE8" b="B8 75"/>
+ <a u="7AE9" b="B8 76"/>
+ <a u="7AEA" b="B8 77"/>
+ <a u="7AEB" b="B8 78"/>
+ <a u="7AEC" b="B8 79"/>
+ <a u="7AED" b="BD DF"/>
+ <a u="7AEE" b="B8 7A"/>
+ <a u="7AEF" b="B6 CB"/>
+ <a u="7AF0" b="B8 7B"/>
+ <a u="7AF1" b="B8 7C"/>
+ <a u="7AF2" b="B8 7D"/>
+ <a u="7AF3" b="B8 7E"/>
+ <a u="7AF4" b="B8 80"/>
+ <a u="7AF5" b="B8 81"/>
+ <a u="7AF6" b="B8 82"/>
+ <a u="7AF7" b="B8 83"/>
+ <a u="7AF8" b="B8 84"/>
+ <a u="7AF9" b="D6 F1"/>
+ <a u="7AFA" b="F3 C3"/>
+ <a u="7AFB" b="B8 85"/>
+ <a u="7AFC" b="B8 86"/>
+ <a u="7AFD" b="F3 C4"/>
+ <a u="7AFE" b="B8 87"/>
+ <a u="7AFF" b="B8 CD"/>
+ <a u="7B00" b="B8 88"/>
+ <a u="7B01" b="B8 89"/>
+ <a u="7B02" b="B8 8A"/>
+ <a u="7B03" b="F3 C6"/>
+ <a u="7B04" b="F3 C7"/>
+ <a u="7B05" b="B8 8B"/>
+ <a u="7B06" b="B0 CA"/>
+ <a u="7B07" b="B8 8C"/>
+ <a u="7B08" b="F3 C5"/>
+ <a u="7B09" b="B8 8D"/>
+ <a u="7B0A" b="F3 C9"/>
+ <a u="7B0B" b="CB F1"/>
+ <a u="7B0C" b="B8 8E"/>
+ <a u="7B0D" b="B8 8F"/>
+ <a u="7B0E" b="B8 90"/>
+ <a u="7B0F" b="F3 CB"/>
+ <a u="7B10" b="B8 91"/>
+ <a u="7B11" b="D0 A6"/>
+ <a u="7B12" b="B8 92"/>
+ <a u="7B13" b="B8 93"/>
+ <a u="7B14" b="B1 CA"/>
+ <a u="7B15" b="F3 C8"/>
+ <a u="7B16" b="B8 94"/>
+ <a u="7B17" b="B8 95"/>
+ <a u="7B18" b="B8 96"/>
+ <a u="7B19" b="F3 CF"/>
+ <a u="7B1A" b="B8 97"/>
+ <a u="7B1B" b="B5 D1"/>
+ <a u="7B1C" b="B8 98"/>
+ <a u="7B1D" b="B8 99"/>
+ <a u="7B1E" b="F3 D7"/>
+ <a u="7B1F" b="B8 9A"/>
+ <a u="7B20" b="F3 D2"/>
+ <a u="7B21" b="B8 9B"/>
+ <a u="7B22" b="B8 9C"/>
+ <a u="7B23" b="B8 9D"/>
+ <a u="7B24" b="F3 D4"/>
+ <a u="7B25" b="F3 D3"/>
+ <a u="7B26" b="B7 FB"/>
+ <a u="7B27" b="B8 9E"/>
+ <a u="7B28" b="B1 BF"/>
+ <a u="7B29" b="B8 9F"/>
+ <a u="7B2A" b="F3 CE"/>
+ <a u="7B2B" b="F3 CA"/>
+ <a u="7B2C" b="B5 DA"/>
+ <a u="7B2D" b="B8 A0"/>
+ <a u="7B2E" b="F3 D0"/>
+ <a u="7B2F" b="B9 40"/>
+ <a u="7B30" b="B9 41"/>
+ <a u="7B31" b="F3 D1"/>
+ <a u="7B32" b="B9 42"/>
+ <a u="7B33" b="F3 D5"/>
+ <a u="7B34" b="B9 43"/>
+ <a u="7B35" b="B9 44"/>
+ <a u="7B36" b="B9 45"/>
+ <a u="7B37" b="B9 46"/>
+ <a u="7B38" b="F3 CD"/>
+ <a u="7B39" b="B9 47"/>
+ <a u="7B3A" b="BC E3"/>
+ <a u="7B3B" b="B9 48"/>
+ <a u="7B3C" b="C1 FD"/>
+ <a u="7B3D" b="B9 49"/>
+ <a u="7B3E" b="F3 D6"/>
+ <a u="7B3F" b="B9 4A"/>
+ <a u="7B40" b="B9 4B"/>
+ <a u="7B41" b="B9 4C"/>
+ <a u="7B42" b="B9 4D"/>
+ <a u="7B43" b="B9 4E"/>
+ <a u="7B44" b="B9 4F"/>
+ <a u="7B45" b="F3 DA"/>
+ <a u="7B46" b="B9 50"/>
+ <a u="7B47" b="F3 CC"/>
+ <a u="7B48" b="B9 51"/>
+ <a u="7B49" b="B5 C8"/>
+ <a u="7B4A" b="B9 52"/>
+ <a u="7B4B" b="BD EE"/>
+ <a u="7B4C" b="F3 DC"/>
+ <a u="7B4D" b="B9 53"/>
+ <a u="7B4E" b="B9 54"/>
+ <a u="7B4F" b="B7 A4"/>
+ <a u="7B50" b="BF F0"/>
+ <a u="7B51" b="D6 FE"/>
+ <a u="7B52" b="CD B2"/>
+ <a u="7B53" b="B9 55"/>
+ <a u="7B54" b="B4 F0"/>
+ <a u="7B55" b="B9 56"/>
+ <a u="7B56" b="B2 DF"/>
+ <a u="7B57" b="B9 57"/>
+ <a u="7B58" b="F3 D8"/>
+ <a u="7B59" b="B9 58"/>
+ <a u="7B5A" b="F3 D9"/>
+ <a u="7B5B" b="C9 B8"/>
+ <a u="7B5C" b="B9 59"/>
+ <a u="7B5D" b="F3 DD"/>
+ <a u="7B5E" b="B9 5A"/>
+ <a u="7B5F" b="B9 5B"/>
+ <a u="7B60" b="F3 DE"/>
+ <a u="7B61" b="B9 5C"/>
+ <a u="7B62" b="F3 E1"/>
+ <a u="7B63" b="B9 5D"/>
+ <a u="7B64" b="B9 5E"/>
+ <a u="7B65" b="B9 5F"/>
+ <a u="7B66" b="B9 60"/>
+ <a u="7B67" b="B9 61"/>
+ <a u="7B68" b="B9 62"/>
+ <a u="7B69" b="B9 63"/>
+ <a u="7B6A" b="B9 64"/>
+ <a u="7B6B" b="B9 65"/>
+ <a u="7B6C" b="B9 66"/>
+ <a u="7B6D" b="B9 67"/>
+ <a u="7B6E" b="F3 DF"/>
+ <a u="7B6F" b="B9 68"/>
+ <a u="7B70" b="B9 69"/>
+ <a u="7B71" b="F3 E3"/>
+ <a u="7B72" b="F3 E2"/>
+ <a u="7B73" b="B9 6A"/>
+ <a u="7B74" b="B9 6B"/>
+ <a u="7B75" b="F3 DB"/>
+ <a u="7B76" b="B9 6C"/>
+ <a u="7B77" b="BF EA"/>
+ <a u="7B78" b="B9 6D"/>
+ <a u="7B79" b="B3 EF"/>
+ <a u="7B7A" b="B9 6E"/>
+ <a u="7B7B" b="F3 E0"/>
+ <a u="7B7C" b="B9 6F"/>
+ <a u="7B7D" b="B9 70"/>
+ <a u="7B7E" b="C7 A9"/>
+ <a u="7B7F" b="B9 71"/>
+ <a u="7B80" b="BC F2"/>
+ <a u="7B81" b="B9 72"/>
+ <a u="7B82" b="B9 73"/>
+ <a u="7B83" b="B9 74"/>
+ <a u="7B84" b="B9 75"/>
+ <a u="7B85" b="F3 EB"/>
+ <a u="7B86" b="B9 76"/>
+ <a u="7B87" b="B9 77"/>
+ <a u="7B88" b="B9 78"/>
+ <a u="7B89" b="B9 79"/>
+ <a u="7B8A" b="B9 7A"/>
+ <a u="7B8B" b="B9 7B"/>
+ <a u="7B8C" b="B9 7C"/>
+ <a u="7B8D" b="B9 BF"/>
+ <a u="7B8E" b="B9 7D"/>
+ <a u="7B8F" b="B9 7E"/>
+ <a u="7B90" b="F3 E4"/>
+ <a u="7B91" b="B9 80"/>
+ <a u="7B92" b="B9 81"/>
+ <a u="7B93" b="B9 82"/>
+ <a u="7B94" b="B2 AD"/>
+ <a u="7B95" b="BB FE"/>
+ <a u="7B96" b="B9 83"/>
+ <a u="7B97" b="CB E3"/>
+ <a u="7B98" b="B9 84"/>
+ <a u="7B99" b="B9 85"/>
+ <a u="7B9A" b="B9 86"/>
+ <a u="7B9B" b="B9 87"/>
+ <a u="7B9C" b="F3 ED"/>
+ <a u="7B9D" b="F3 E9"/>
+ <a u="7B9E" b="B9 88"/>
+ <a u="7B9F" b="B9 89"/>
+ <a u="7BA0" b="B9 8A"/>
+ <a u="7BA1" b="B9 DC"/>
+ <a u="7BA2" b="F3 EE"/>
+ <a u="7BA3" b="B9 8B"/>
+ <a u="7BA4" b="B9 8C"/>
+ <a u="7BA5" b="B9 8D"/>
+ <a u="7BA6" b="F3 E5"/>
+ <a u="7BA7" b="F3 E6"/>
+ <a u="7BA8" b="F3 EA"/>
+ <a u="7BA9" b="C2 E1"/>
+ <a u="7BAA" b="F3 EC"/>
+ <a u="7BAB" b="F3 EF"/>
+ <a u="7BAC" b="F3 E8"/>
+ <a u="7BAD" b="BC FD"/>
+ <a u="7BAE" b="B9 8E"/>
+ <a u="7BAF" b="B9 8F"/>
+ <a u="7BB0" b="B9 90"/>
+ <a u="7BB1" b="CF E4"/>
+ <a u="7BB2" b="B9 91"/>
+ <a u="7BB3" b="B9 92"/>
+ <a u="7BB4" b="F3 F0"/>
+ <a u="7BB5" b="B9 93"/>
+ <a u="7BB6" b="B9 94"/>
+ <a u="7BB7" b="B9 95"/>
+ <a u="7BB8" b="F3 E7"/>
+ <a u="7BB9" b="B9 96"/>
+ <a u="7BBA" b="B9 97"/>
+ <a u="7BBB" b="B9 98"/>
+ <a u="7BBC" b="B9 99"/>
+ <a u="7BBD" b="B9 9A"/>
+ <a u="7BBE" b="B9 9B"/>
+ <a u="7BBF" b="B9 9C"/>
+ <a u="7BC0" b="B9 9D"/>
+ <a u="7BC1" b="F3 F2"/>
+ <a u="7BC2" b="B9 9E"/>
+ <a u="7BC3" b="B9 9F"/>
+ <a u="7BC4" b="B9 A0"/>
+ <a u="7BC5" b="BA 40"/>
+ <a u="7BC6" b="D7 AD"/>
+ <a u="7BC7" b="C6 AA"/>
+ <a u="7BC8" b="BA 41"/>
+ <a u="7BC9" b="BA 42"/>
+ <a u="7BCA" b="BA 43"/>
+ <a u="7BCB" b="BA 44"/>
+ <a u="7BCC" b="F3 F3"/>
+ <a u="7BCD" b="BA 45"/>
+ <a u="7BCE" b="BA 46"/>
+ <a u="7BCF" b="BA 47"/>
+ <a u="7BD0" b="BA 48"/>
+ <a u="7BD1" b="F3 F1"/>
+ <a u="7BD2" b="BA 49"/>
+ <a u="7BD3" b="C2 A8"/>
+ <a u="7BD4" b="BA 4A"/>
+ <a u="7BD5" b="BA 4B"/>
+ <a u="7BD6" b="BA 4C"/>
+ <a u="7BD7" b="BA 4D"/>
+ <a u="7BD8" b="BA 4E"/>
+ <a u="7BD9" b="B8 DD"/>
+ <a u="7BDA" b="F3 F5"/>
+ <a u="7BDB" b="BA 4F"/>
+ <a u="7BDC" b="BA 50"/>
+ <a u="7BDD" b="F3 F4"/>
+ <a u="7BDE" b="BA 51"/>
+ <a u="7BDF" b="BA 52"/>
+ <a u="7BE0" b="BA 53"/>
+ <a u="7BE1" b="B4 DB"/>
+ <a u="7BE2" b="BA 54"/>
+ <a u="7BE3" b="BA 55"/>
+ <a u="7BE4" b="BA 56"/>
+ <a u="7BE5" b="F3 F6"/>
+ <a u="7BE6" b="F3 F7"/>
+ <a u="7BE7" b="BA 57"/>
+ <a u="7BE8" b="BA 58"/>
+ <a u="7BE9" b="BA 59"/>
+ <a u="7BEA" b="F3 F8"/>
+ <a u="7BEB" b="BA 5A"/>
+ <a u="7BEC" b="BA 5B"/>
+ <a u="7BED" b="BA 5C"/>
+ <a u="7BEE" b="C0 BA"/>
+ <a u="7BEF" b="BA 5D"/>
+ <a u="7BF0" b="BA 5E"/>
+ <a u="7BF1" b="C0 E9"/>
+ <a u="7BF2" b="BA 5F"/>
+ <a u="7BF3" b="BA 60"/>
+ <a u="7BF4" b="BA 61"/>
+ <a u="7BF5" b="BA 62"/>
+ <a u="7BF6" b="BA 63"/>
+ <a u="7BF7" b="C5 F1"/>
+ <a u="7BF8" b="BA 64"/>
+ <a u="7BF9" b="BA 65"/>
+ <a u="7BFA" b="BA 66"/>
+ <a u="7BFB" b="BA 67"/>
+ <a u="7BFC" b="F3 FB"/>
+ <a u="7BFD" b="BA 68"/>
+ <a u="7BFE" b="F3 FA"/>
+ <a u="7BFF" b="BA 69"/>
+ <a u="7C00" b="BA 6A"/>
+ <a u="7C01" b="BA 6B"/>
+ <a u="7C02" b="BA 6C"/>
+ <a u="7C03" b="BA 6D"/>
+ <a u="7C04" b="BA 6E"/>
+ <a u="7C05" b="BA 6F"/>
+ <a u="7C06" b="BA 70"/>
+ <a u="7C07" b="B4 D8"/>
+ <a u="7C08" b="BA 71"/>
+ <a u="7C09" b="BA 72"/>
+ <a u="7C0A" b="BA 73"/>
+ <a u="7C0B" b="F3 FE"/>
+ <a u="7C0C" b="F3 F9"/>
+ <a u="7C0D" b="BA 74"/>
+ <a u="7C0E" b="BA 75"/>
+ <a u="7C0F" b="F3 FC"/>
+ <a u="7C10" b="BA 76"/>
+ <a u="7C11" b="BA 77"/>
+ <a u="7C12" b="BA 78"/>
+ <a u="7C13" b="BA 79"/>
+ <a u="7C14" b="BA 7A"/>
+ <a u="7C15" b="BA 7B"/>
+ <a u="7C16" b="F3 FD"/>
+ <a u="7C17" b="BA 7C"/>
+ <a u="7C18" b="BA 7D"/>
+ <a u="7C19" b="BA 7E"/>
+ <a u="7C1A" b="BA 80"/>
+ <a u="7C1B" b="BA 81"/>
+ <a u="7C1C" b="BA 82"/>
+ <a u="7C1D" b="BA 83"/>
+ <a u="7C1E" b="BA 84"/>
+ <a u="7C1F" b="F4 A1"/>
+ <a u="7C20" b="BA 85"/>
+ <a u="7C21" b="BA 86"/>
+ <a u="7C22" b="BA 87"/>
+ <a u="7C23" b="BA 88"/>
+ <a u="7C24" b="BA 89"/>
+ <a u="7C25" b="BA 8A"/>
+ <a u="7C26" b="F4 A3"/>
+ <a u="7C27" b="BB C9"/>
+ <a u="7C28" b="BA 8B"/>
+ <a u="7C29" b="BA 8C"/>
+ <a u="7C2A" b="F4 A2"/>
+ <a u="7C2B" b="BA 8D"/>
+ <a u="7C2C" b="BA 8E"/>
+ <a u="7C2D" b="BA 8F"/>
+ <a u="7C2E" b="BA 90"/>
+ <a u="7C2F" b="BA 91"/>
+ <a u="7C30" b="BA 92"/>
+ <a u="7C31" b="BA 93"/>
+ <a u="7C32" b="BA 94"/>
+ <a u="7C33" b="BA 95"/>
+ <a u="7C34" b="BA 96"/>
+ <a u="7C35" b="BA 97"/>
+ <a u="7C36" b="BA 98"/>
+ <a u="7C37" b="BA 99"/>
+ <a u="7C38" b="F4 A4"/>
+ <a u="7C39" b="BA 9A"/>
+ <a u="7C3A" b="BA 9B"/>
+ <a u="7C3B" b="BA 9C"/>
+ <a u="7C3C" b="BA 9D"/>
+ <a u="7C3D" b="BA 9E"/>
+ <a u="7C3E" b="BA 9F"/>
+ <a u="7C3F" b="B2 BE"/>
+ <a u="7C40" b="F4 A6"/>
+ <a u="7C41" b="F4 A5"/>
+ <a u="7C42" b="BA A0"/>
+ <a u="7C43" b="BB 40"/>
+ <a u="7C44" b="BB 41"/>
+ <a u="7C45" b="BB 42"/>
+ <a u="7C46" b="BB 43"/>
+ <a u="7C47" b="BB 44"/>
+ <a u="7C48" b="BB 45"/>
+ <a u="7C49" b="BB 46"/>
+ <a u="7C4A" b="BB 47"/>
+ <a u="7C4B" b="BB 48"/>
+ <a u="7C4C" b="BB 49"/>
+ <a u="7C4D" b="BC AE"/>
+ <a u="7C4E" b="BB 4A"/>
+ <a u="7C4F" b="BB 4B"/>
+ <a u="7C50" b="BB 4C"/>
+ <a u="7C51" b="BB 4D"/>
+ <a u="7C52" b="BB 4E"/>
+ <a u="7C53" b="BB 4F"/>
+ <a u="7C54" b="BB 50"/>
+ <a u="7C55" b="BB 51"/>
+ <a u="7C56" b="BB 52"/>
+ <a u="7C57" b="BB 53"/>
+ <a u="7C58" b="BB 54"/>
+ <a u="7C59" b="BB 55"/>
+ <a u="7C5A" b="BB 56"/>
+ <a u="7C5B" b="BB 57"/>
+ <a u="7C5C" b="BB 58"/>
+ <a u="7C5D" b="BB 59"/>
+ <a u="7C5E" b="BB 5A"/>
+ <a u="7C5F" b="BB 5B"/>
+ <a u="7C60" b="BB 5C"/>
+ <a u="7C61" b="BB 5D"/>
+ <a u="7C62" b="BB 5E"/>
+ <a u="7C63" b="BB 5F"/>
+ <a u="7C64" b="BB 60"/>
+ <a u="7C65" b="BB 61"/>
+ <a u="7C66" b="BB 62"/>
+ <a u="7C67" b="BB 63"/>
+ <a u="7C68" b="BB 64"/>
+ <a u="7C69" b="BB 65"/>
+ <a u="7C6A" b="BB 66"/>
+ <a u="7C6B" b="BB 67"/>
+ <a u="7C6C" b="BB 68"/>
+ <a u="7C6D" b="BB 69"/>
+ <a u="7C6E" b="BB 6A"/>
+ <a u="7C6F" b="BB 6B"/>
+ <a u="7C70" b="BB 6C"/>
+ <a u="7C71" b="BB 6D"/>
+ <a u="7C72" b="BB 6E"/>
+ <a u="7C73" b="C3 D7"/>
+ <a u="7C74" b="D9 E1"/>
+ <a u="7C75" b="BB 6F"/>
+ <a u="7C76" b="BB 70"/>
+ <a u="7C77" b="BB 71"/>
+ <a u="7C78" b="BB 72"/>
+ <a u="7C79" b="BB 73"/>
+ <a u="7C7A" b="BB 74"/>
+ <a u="7C7B" b="C0 E0"/>
+ <a u="7C7C" b="F4 CC"/>
+ <a u="7C7D" b="D7 D1"/>
+ <a u="7C7E" b="BB 75"/>
+ <a u="7C7F" b="BB 76"/>
+ <a u="7C80" b="BB 77"/>
+ <a u="7C81" b="BB 78"/>
+ <a u="7C82" b="BB 79"/>
+ <a u="7C83" b="BB 7A"/>
+ <a u="7C84" b="BB 7B"/>
+ <a u="7C85" b="BB 7C"/>
+ <a u="7C86" b="BB 7D"/>
+ <a u="7C87" b="BB 7E"/>
+ <a u="7C88" b="BB 80"/>
+ <a u="7C89" b="B7 DB"/>
+ <a u="7C8A" b="BB 81"/>
+ <a u="7C8B" b="BB 82"/>
+ <a u="7C8C" b="BB 83"/>
+ <a u="7C8D" b="BB 84"/>
+ <a u="7C8E" b="BB 85"/>
+ <a u="7C8F" b="BB 86"/>
+ <a u="7C90" b="BB 87"/>
+ <a u="7C91" b="F4 CE"/>
+ <a u="7C92" b="C1 A3"/>
+ <a u="7C93" b="BB 88"/>
+ <a u="7C94" b="BB 89"/>
+ <a u="7C95" b="C6 C9"/>
+ <a u="7C96" b="BB 8A"/>
+ <a u="7C97" b="B4 D6"/>
+ <a u="7C98" b="D5 B3"/>
+ <a u="7C99" b="BB 8B"/>
+ <a u="7C9A" b="BB 8C"/>
+ <a u="7C9B" b="BB 8D"/>
+ <a u="7C9C" b="F4 D0"/>
+ <a u="7C9D" b="F4 CF"/>
+ <a u="7C9E" b="F4 D1"/>
+ <a u="7C9F" b="CB DA"/>
+ <a u="7CA0" b="BB 8E"/>
+ <a u="7CA1" b="BB 8F"/>
+ <a u="7CA2" b="F4 D2"/>
+ <a u="7CA3" b="BB 90"/>
+ <a u="7CA4" b="D4 C1"/>
+ <a u="7CA5" b="D6 E0"/>
+ <a u="7CA6" b="BB 91"/>
+ <a u="7CA7" b="BB 92"/>
+ <a u="7CA8" b="BB 93"/>
+ <a u="7CA9" b="BB 94"/>
+ <a u="7CAA" b="B7 E0"/>
+ <a u="7CAB" b="BB 95"/>
+ <a u="7CAC" b="BB 96"/>
+ <a u="7CAD" b="BB 97"/>
+ <a u="7CAE" b="C1 B8"/>
+ <a u="7CAF" b="BB 98"/>
+ <a u="7CB0" b="BB 99"/>
+ <a u="7CB1" b="C1 BB"/>
+ <a u="7CB2" b="F4 D3"/>
+ <a u="7CB3" b="BE AC"/>
+ <a u="7CB4" b="BB 9A"/>
+ <a u="7CB5" b="BB 9B"/>
+ <a u="7CB6" b="BB 9C"/>
+ <a u="7CB7" b="BB 9D"/>
+ <a u="7CB8" b="BB 9E"/>
+ <a u="7CB9" b="B4 E2"/>
+ <a u="7CBA" b="BB 9F"/>
+ <a u="7CBB" b="BB A0"/>
+ <a u="7CBC" b="F4 D4"/>
+ <a u="7CBD" b="F4 D5"/>
+ <a u="7CBE" b="BE AB"/>
+ <a u="7CBF" b="BC 40"/>
+ <a u="7CC0" b="BC 41"/>
+ <a u="7CC1" b="F4 D6"/>
+ <a u="7CC2" b="BC 42"/>
+ <a u="7CC3" b="BC 43"/>
+ <a u="7CC4" b="BC 44"/>
+ <a u="7CC5" b="F4 DB"/>
+ <a u="7CC6" b="BC 45"/>
+ <a u="7CC7" b="F4 D7"/>
+ <a u="7CC8" b="F4 DA"/>
+ <a u="7CC9" b="BC 46"/>
+ <a u="7CCA" b="BA FD"/>
+ <a u="7CCB" b="BC 47"/>
+ <a u="7CCC" b="F4 D8"/>
+ <a u="7CCD" b="F4 D9"/>
+ <a u="7CCE" b="BC 48"/>
+ <a u="7CCF" b="BC 49"/>
+ <a u="7CD0" b="BC 4A"/>
+ <a u="7CD1" b="BC 4B"/>
+ <a u="7CD2" b="BC 4C"/>
+ <a u="7CD3" b="BC 4D"/>
+ <a u="7CD4" b="BC 4E"/>
+ <a u="7CD5" b="B8 E2"/>
+ <a u="7CD6" b="CC C7"/>
+ <a u="7CD7" b="F4 DC"/>
+ <a u="7CD8" b="BC 4F"/>
+ <a u="7CD9" b="B2 DA"/>
+ <a u="7CDA" b="BC 50"/>
+ <a u="7CDB" b="BC 51"/>
+ <a u="7CDC" b="C3 D3"/>
+ <a u="7CDD" b="BC 52"/>
+ <a u="7CDE" b="BC 53"/>
+ <a u="7CDF" b="D4 E3"/>
+ <a u="7CE0" b="BF B7"/>
+ <a u="7CE1" b="BC 54"/>
+ <a u="7CE2" b="BC 55"/>
+ <a u="7CE3" b="BC 56"/>
+ <a u="7CE4" b="BC 57"/>
+ <a u="7CE5" b="BC 58"/>
+ <a u="7CE6" b="BC 59"/>
+ <a u="7CE7" b="BC 5A"/>
+ <a u="7CE8" b="F4 DD"/>
+ <a u="7CE9" b="BC 5B"/>
+ <a u="7CEA" b="BC 5C"/>
+ <a u="7CEB" b="BC 5D"/>
+ <a u="7CEC" b="BC 5E"/>
+ <a u="7CED" b="BC 5F"/>
+ <a u="7CEE" b="BC 60"/>
+ <a u="7CEF" b="C5 B4"/>
+ <a u="7CF0" b="BC 61"/>
+ <a u="7CF1" b="BC 62"/>
+ <a u="7CF2" b="BC 63"/>
+ <a u="7CF3" b="BC 64"/>
+ <a u="7CF4" b="BC 65"/>
+ <a u="7CF5" b="BC 66"/>
+ <a u="7CF6" b="BC 67"/>
+ <a u="7CF7" b="BC 68"/>
+ <a u="7CF8" b="F4 E9"/>
+ <a u="7CF9" b="BC 69"/>
+ <a u="7CFA" b="BC 6A"/>
+ <a u="7CFB" b="CF B5"/>
+ <a u="7CFC" b="BC 6B"/>
+ <a u="7CFD" b="BC 6C"/>
+ <a u="7CFE" b="BC 6D"/>
+ <a u="7CFF" b="BC 6E"/>
+ <a u="7D00" b="BC 6F"/>
+ <a u="7D01" b="BC 70"/>
+ <a u="7D02" b="BC 71"/>
+ <a u="7D03" b="BC 72"/>
+ <a u="7D04" b="BC 73"/>
+ <a u="7D05" b="BC 74"/>
+ <a u="7D06" b="BC 75"/>
+ <a u="7D07" b="BC 76"/>
+ <a u="7D08" b="BC 77"/>
+ <a u="7D09" b="BC 78"/>
+ <a u="7D0A" b="CE C9"/>
+ <a u="7D0B" b="BC 79"/>
+ <a u="7D0C" b="BC 7A"/>
+ <a u="7D0D" b="BC 7B"/>
+ <a u="7D0E" b="BC 7C"/>
+ <a u="7D0F" b="BC 7D"/>
+ <a u="7D10" b="BC 7E"/>
+ <a u="7D11" b="BC 80"/>
+ <a u="7D12" b="BC 81"/>
+ <a u="7D13" b="BC 82"/>
+ <a u="7D14" b="BC 83"/>
+ <a u="7D15" b="BC 84"/>
+ <a u="7D16" b="BC 85"/>
+ <a u="7D17" b="BC 86"/>
+ <a u="7D18" b="BC 87"/>
+ <a u="7D19" b="BC 88"/>
+ <a u="7D1A" b="BC 89"/>
+ <a u="7D1B" b="BC 8A"/>
+ <a u="7D1C" b="BC 8B"/>
+ <a u="7D1D" b="BC 8C"/>
+ <a u="7D1E" b="BC 8D"/>
+ <a u="7D1F" b="BC 8E"/>
+ <a u="7D20" b="CB D8"/>
+ <a u="7D21" b="BC 8F"/>
+ <a u="7D22" b="CB F7"/>
+ <a u="7D23" b="BC 90"/>
+ <a u="7D24" b="BC 91"/>
+ <a u="7D25" b="BC 92"/>
+ <a u="7D26" b="BC 93"/>
+ <a u="7D27" b="BD F4"/>
+ <a u="7D28" b="BC 94"/>
+ <a u="7D29" b="BC 95"/>
+ <a u="7D2A" b="BC 96"/>
+ <a u="7D2B" b="D7 CF"/>
+ <a u="7D2C" b="BC 97"/>
+ <a u="7D2D" b="BC 98"/>
+ <a u="7D2E" b="BC 99"/>
+ <a u="7D2F" b="C0 DB"/>
+ <a u="7D30" b="BC 9A"/>
+ <a u="7D31" b="BC 9B"/>
+ <a u="7D32" b="BC 9C"/>
+ <a u="7D33" b="BC 9D"/>
+ <a u="7D34" b="BC 9E"/>
+ <a u="7D35" b="BC 9F"/>
+ <a u="7D36" b="BC A0"/>
+ <a u="7D37" b="BD 40"/>
+ <a u="7D38" b="BD 41"/>
+ <a u="7D39" b="BD 42"/>
+ <a u="7D3A" b="BD 43"/>
+ <a u="7D3B" b="BD 44"/>
+ <a u="7D3C" b="BD 45"/>
+ <a u="7D3D" b="BD 46"/>
+ <a u="7D3E" b="BD 47"/>
+ <a u="7D3F" b="BD 48"/>
+ <a u="7D40" b="BD 49"/>
+ <a u="7D41" b="BD 4A"/>
+ <a u="7D42" b="BD 4B"/>
+ <a u="7D43" b="BD 4C"/>
+ <a u="7D44" b="BD 4D"/>
+ <a u="7D45" b="BD 4E"/>
+ <a u="7D46" b="BD 4F"/>
+ <a u="7D47" b="BD 50"/>
+ <a u="7D48" b="BD 51"/>
+ <a u="7D49" b="BD 52"/>
+ <a u="7D4A" b="BD 53"/>
+ <a u="7D4B" b="BD 54"/>
+ <a u="7D4C" b="BD 55"/>
+ <a u="7D4D" b="BD 56"/>
+ <a u="7D4E" b="BD 57"/>
+ <a u="7D4F" b="BD 58"/>
+ <a u="7D50" b="BD 59"/>
+ <a u="7D51" b="BD 5A"/>
+ <a u="7D52" b="BD 5B"/>
+ <a u="7D53" b="BD 5C"/>
+ <a u="7D54" b="BD 5D"/>
+ <a u="7D55" b="BD 5E"/>
+ <a u="7D56" b="BD 5F"/>
+ <a u="7D57" b="BD 60"/>
+ <a u="7D58" b="BD 61"/>
+ <a u="7D59" b="BD 62"/>
+ <a u="7D5A" b="BD 63"/>
+ <a u="7D5B" b="BD 64"/>
+ <a u="7D5C" b="BD 65"/>
+ <a u="7D5D" b="BD 66"/>
+ <a u="7D5E" b="BD 67"/>
+ <a u="7D5F" b="BD 68"/>
+ <a u="7D60" b="BD 69"/>
+ <a u="7D61" b="BD 6A"/>
+ <a u="7D62" b="BD 6B"/>
+ <a u="7D63" b="BD 6C"/>
+ <a u="7D64" b="BD 6D"/>
+ <a u="7D65" b="BD 6E"/>
+ <a u="7D66" b="BD 6F"/>
+ <a u="7D67" b="BD 70"/>
+ <a u="7D68" b="BD 71"/>
+ <a u="7D69" b="BD 72"/>
+ <a u="7D6A" b="BD 73"/>
+ <a u="7D6B" b="BD 74"/>
+ <a u="7D6C" b="BD 75"/>
+ <a u="7D6D" b="BD 76"/>
+ <a u="7D6E" b="D0 F5"/>
+ <a u="7D6F" b="BD 77"/>
+ <a u="7D70" b="BD 78"/>
+ <a u="7D71" b="BD 79"/>
+ <a u="7D72" b="BD 7A"/>
+ <a u="7D73" b="BD 7B"/>
+ <a u="7D74" b="BD 7C"/>
+ <a u="7D75" b="BD 7D"/>
+ <a u="7D76" b="BD 7E"/>
+ <a u="7D77" b="F4 EA"/>
+ <a u="7D78" b="BD 80"/>
+ <a u="7D79" b="BD 81"/>
+ <a u="7D7A" b="BD 82"/>
+ <a u="7D7B" b="BD 83"/>
+ <a u="7D7C" b="BD 84"/>
+ <a u="7D7D" b="BD 85"/>
+ <a u="7D7E" b="BD 86"/>
+ <a u="7D7F" b="BD 87"/>
+ <a u="7D80" b="BD 88"/>
+ <a u="7D81" b="BD 89"/>
+ <a u="7D82" b="BD 8A"/>
+ <a u="7D83" b="BD 8B"/>
+ <a u="7D84" b="BD 8C"/>
+ <a u="7D85" b="BD 8D"/>
+ <a u="7D86" b="BD 8E"/>
+ <a u="7D87" b="BD 8F"/>
+ <a u="7D88" b="BD 90"/>
+ <a u="7D89" b="BD 91"/>
+ <a u="7D8A" b="BD 92"/>
+ <a u="7D8B" b="BD 93"/>
+ <a u="7D8C" b="BD 94"/>
+ <a u="7D8D" b="BD 95"/>
+ <a u="7D8E" b="BD 96"/>
+ <a u="7D8F" b="BD 97"/>
+ <a u="7D90" b="BD 98"/>
+ <a u="7D91" b="BD 99"/>
+ <a u="7D92" b="BD 9A"/>
+ <a u="7D93" b="BD 9B"/>
+ <a u="7D94" b="BD 9C"/>
+ <a u="7D95" b="BD 9D"/>
+ <a u="7D96" b="BD 9E"/>
+ <a u="7D97" b="BD 9F"/>
+ <a u="7D98" b="BD A0"/>
+ <a u="7D99" b="BE 40"/>
+ <a u="7D9A" b="BE 41"/>
+ <a u="7D9B" b="BE 42"/>
+ <a u="7D9C" b="BE 43"/>
+ <a u="7D9D" b="BE 44"/>
+ <a u="7D9E" b="BE 45"/>
+ <a u="7D9F" b="BE 46"/>
+ <a u="7DA0" b="BE 47"/>
+ <a u="7DA1" b="BE 48"/>
+ <a u="7DA2" b="BE 49"/>
+ <a u="7DA3" b="BE 4A"/>
+ <a u="7DA4" b="BE 4B"/>
+ <a u="7DA5" b="BE 4C"/>
+ <a u="7DA6" b="F4 EB"/>
+ <a u="7DA7" b="BE 4D"/>
+ <a u="7DA8" b="BE 4E"/>
+ <a u="7DA9" b="BE 4F"/>
+ <a u="7DAA" b="BE 50"/>
+ <a u="7DAB" b="BE 51"/>
+ <a u="7DAC" b="BE 52"/>
+ <a u="7DAD" b="BE 53"/>
+ <a u="7DAE" b="F4 EC"/>
+ <a u="7DAF" b="BE 54"/>
+ <a u="7DB0" b="BE 55"/>
+ <a u="7DB1" b="BE 56"/>
+ <a u="7DB2" b="BE 57"/>
+ <a u="7DB3" b="BE 58"/>
+ <a u="7DB4" b="BE 59"/>
+ <a u="7DB5" b="BE 5A"/>
+ <a u="7DB6" b="BE 5B"/>
+ <a u="7DB7" b="BE 5C"/>
+ <a u="7DB8" b="BE 5D"/>
+ <a u="7DB9" b="BE 5E"/>
+ <a u="7DBA" b="BE 5F"/>
+ <a u="7DBB" b="BE 60"/>
+ <a u="7DBC" b="BE 61"/>
+ <a u="7DBD" b="BE 62"/>
+ <a u="7DBE" b="BE 63"/>
+ <a u="7DBF" b="BE 64"/>
+ <a u="7DC0" b="BE 65"/>
+ <a u="7DC1" b="BE 66"/>
+ <a u="7DC2" b="BE 67"/>
+ <a u="7DC3" b="BE 68"/>
+ <a u="7DC4" b="BE 69"/>
+ <a u="7DC5" b="BE 6A"/>
+ <a u="7DC6" b="BE 6B"/>
+ <a u="7DC7" b="BE 6C"/>
+ <a u="7DC8" b="BE 6D"/>
+ <a u="7DC9" b="BE 6E"/>
+ <a u="7DCA" b="BE 6F"/>
+ <a u="7DCB" b="BE 70"/>
+ <a u="7DCC" b="BE 71"/>
+ <a u="7DCD" b="BE 72"/>
+ <a u="7DCE" b="BE 73"/>
+ <a u="7DCF" b="BE 74"/>
+ <a u="7DD0" b="BE 75"/>
+ <a u="7DD1" b="BE 76"/>
+ <a u="7DD2" b="BE 77"/>
+ <a u="7DD3" b="BE 78"/>
+ <a u="7DD4" b="BE 79"/>
+ <a u="7DD5" b="BE 7A"/>
+ <a u="7DD6" b="BE 7B"/>
+ <a u="7DD7" b="BE 7C"/>
+ <a u="7DD8" b="BE 7D"/>
+ <a u="7DD9" b="BE 7E"/>
+ <a u="7DDA" b="BE 80"/>
+ <a u="7DDB" b="BE 81"/>
+ <a u="7DDC" b="BE 82"/>
+ <a u="7DDD" b="BE 83"/>
+ <a u="7DDE" b="BE 84"/>
+ <a u="7DDF" b="BE 85"/>
+ <a u="7DE0" b="BE 86"/>
+ <a u="7DE1" b="BE 87"/>
+ <a u="7DE2" b="BE 88"/>
+ <a u="7DE3" b="BE 89"/>
+ <a u="7DE4" b="BE 8A"/>
+ <a u="7DE5" b="BE 8B"/>
+ <a u="7DE6" b="BE 8C"/>
+ <a u="7DE7" b="BE 8D"/>
+ <a u="7DE8" b="BE 8E"/>
+ <a u="7DE9" b="BE 8F"/>
+ <a u="7DEA" b="BE 90"/>
+ <a u="7DEB" b="BE 91"/>
+ <a u="7DEC" b="BE 92"/>
+ <a u="7DED" b="BE 93"/>
+ <a u="7DEE" b="BE 94"/>
+ <a u="7DEF" b="BE 95"/>
+ <a u="7DF0" b="BE 96"/>
+ <a u="7DF1" b="BE 97"/>
+ <a u="7DF2" b="BE 98"/>
+ <a u="7DF3" b="BE 99"/>
+ <a u="7DF4" b="BE 9A"/>
+ <a u="7DF5" b="BE 9B"/>
+ <a u="7DF6" b="BE 9C"/>
+ <a u="7DF7" b="BE 9D"/>
+ <a u="7DF8" b="BE 9E"/>
+ <a u="7DF9" b="BE 9F"/>
+ <a u="7DFA" b="BE A0"/>
+ <a u="7DFB" b="BF 40"/>
+ <a u="7DFC" b="BF 41"/>
+ <a u="7DFD" b="BF 42"/>
+ <a u="7DFE" b="BF 43"/>
+ <a u="7DFF" b="BF 44"/>
+ <a u="7E00" b="BF 45"/>
+ <a u="7E01" b="BF 46"/>
+ <a u="7E02" b="BF 47"/>
+ <a u="7E03" b="BF 48"/>
+ <a u="7E04" b="BF 49"/>
+ <a u="7E05" b="BF 4A"/>
+ <a u="7E06" b="BF 4B"/>
+ <a u="7E07" b="BF 4C"/>
+ <a u="7E08" b="BF 4D"/>
+ <a u="7E09" b="BF 4E"/>
+ <a u="7E0A" b="BF 4F"/>
+ <a u="7E0B" b="BF 50"/>
+ <a u="7E0C" b="BF 51"/>
+ <a u="7E0D" b="BF 52"/>
+ <a u="7E0E" b="BF 53"/>
+ <a u="7E0F" b="BF 54"/>
+ <a u="7E10" b="BF 55"/>
+ <a u="7E11" b="BF 56"/>
+ <a u="7E12" b="BF 57"/>
+ <a u="7E13" b="BF 58"/>
+ <a u="7E14" b="BF 59"/>
+ <a u="7E15" b="BF 5A"/>
+ <a u="7E16" b="BF 5B"/>
+ <a u="7E17" b="BF 5C"/>
+ <a u="7E18" b="BF 5D"/>
+ <a u="7E19" b="BF 5E"/>
+ <a u="7E1A" b="BF 5F"/>
+ <a u="7E1B" b="BF 60"/>
+ <a u="7E1C" b="BF 61"/>
+ <a u="7E1D" b="BF 62"/>
+ <a u="7E1E" b="BF 63"/>
+ <a u="7E1F" b="BF 64"/>
+ <a u="7E20" b="BF 65"/>
+ <a u="7E21" b="BF 66"/>
+ <a u="7E22" b="BF 67"/>
+ <a u="7E23" b="BF 68"/>
+ <a u="7E24" b="BF 69"/>
+ <a u="7E25" b="BF 6A"/>
+ <a u="7E26" b="BF 6B"/>
+ <a u="7E27" b="BF 6C"/>
+ <a u="7E28" b="BF 6D"/>
+ <a u="7E29" b="BF 6E"/>
+ <a u="7E2A" b="BF 6F"/>
+ <a u="7E2B" b="BF 70"/>
+ <a u="7E2C" b="BF 71"/>
+ <a u="7E2D" b="BF 72"/>
+ <a u="7E2E" b="BF 73"/>
+ <a u="7E2F" b="BF 74"/>
+ <a u="7E30" b="BF 75"/>
+ <a u="7E31" b="BF 76"/>
+ <a u="7E32" b="BF 77"/>
+ <a u="7E33" b="BF 78"/>
+ <a u="7E34" b="BF 79"/>
+ <a u="7E35" b="BF 7A"/>
+ <a u="7E36" b="BF 7B"/>
+ <a u="7E37" b="BF 7C"/>
+ <a u="7E38" b="BF 7D"/>
+ <a u="7E39" b="BF 7E"/>
+ <a u="7E3A" b="BF 80"/>
+ <a u="7E3B" b="F7 E3"/>
+ <a u="7E3C" b="BF 81"/>
+ <a u="7E3D" b="BF 82"/>
+ <a u="7E3E" b="BF 83"/>
+ <a u="7E3F" b="BF 84"/>
+ <a u="7E40" b="BF 85"/>
+ <a u="7E41" b="B7 B1"/>
+ <a u="7E42" b="BF 86"/>
+ <a u="7E43" b="BF 87"/>
+ <a u="7E44" b="BF 88"/>
+ <a u="7E45" b="BF 89"/>
+ <a u="7E46" b="BF 8A"/>
+ <a u="7E47" b="F4 ED"/>
+ <a u="7E48" b="BF 8B"/>
+ <a u="7E49" b="BF 8C"/>
+ <a u="7E4A" b="BF 8D"/>
+ <a u="7E4B" b="BF 8E"/>
+ <a u="7E4C" b="BF 8F"/>
+ <a u="7E4D" b="BF 90"/>
+ <a u="7E4E" b="BF 91"/>
+ <a u="7E4F" b="BF 92"/>
+ <a u="7E50" b="BF 93"/>
+ <a u="7E51" b="BF 94"/>
+ <a u="7E52" b="BF 95"/>
+ <a u="7E53" b="BF 96"/>
+ <a u="7E54" b="BF 97"/>
+ <a u="7E55" b="BF 98"/>
+ <a u="7E56" b="BF 99"/>
+ <a u="7E57" b="BF 9A"/>
+ <a u="7E58" b="BF 9B"/>
+ <a u="7E59" b="BF 9C"/>
+ <a u="7E5A" b="BF 9D"/>
+ <a u="7E5B" b="BF 9E"/>
+ <a u="7E5C" b="BF 9F"/>
+ <a u="7E5D" b="BF A0"/>
+ <a u="7E5E" b="C0 40"/>
+ <a u="7E5F" b="C0 41"/>
+ <a u="7E60" b="C0 42"/>
+ <a u="7E61" b="C0 43"/>
+ <a u="7E62" b="C0 44"/>
+ <a u="7E63" b="C0 45"/>
+ <a u="7E64" b="C0 46"/>
+ <a u="7E65" b="C0 47"/>
+ <a u="7E66" b="C0 48"/>
+ <a u="7E67" b="C0 49"/>
+ <a u="7E68" b="C0 4A"/>
+ <a u="7E69" b="C0 4B"/>
+ <a u="7E6A" b="C0 4C"/>
+ <a u="7E6B" b="C0 4D"/>
+ <a u="7E6C" b="C0 4E"/>
+ <a u="7E6D" b="C0 4F"/>
+ <a u="7E6E" b="C0 50"/>
+ <a u="7E6F" b="C0 51"/>
+ <a u="7E70" b="C0 52"/>
+ <a u="7E71" b="C0 53"/>
+ <a u="7E72" b="C0 54"/>
+ <a u="7E73" b="C0 55"/>
+ <a u="7E74" b="C0 56"/>
+ <a u="7E75" b="C0 57"/>
+ <a u="7E76" b="C0 58"/>
+ <a u="7E77" b="C0 59"/>
+ <a u="7E78" b="C0 5A"/>
+ <a u="7E79" b="C0 5B"/>
+ <a u="7E7A" b="C0 5C"/>
+ <a u="7E7B" b="C0 5D"/>
+ <a u="7E7C" b="C0 5E"/>
+ <a u="7E7D" b="C0 5F"/>
+ <a u="7E7E" b="C0 60"/>
+ <a u="7E7F" b="C0 61"/>
+ <a u="7E80" b="C0 62"/>
+ <a u="7E81" b="C0 63"/>
+ <a u="7E82" b="D7 EB"/>
+ <a u="7E83" b="C0 64"/>
+ <a u="7E84" b="C0 65"/>
+ <a u="7E85" b="C0 66"/>
+ <a u="7E86" b="C0 67"/>
+ <a u="7E87" b="C0 68"/>
+ <a u="7E88" b="C0 69"/>
+ <a u="7E89" b="C0 6A"/>
+ <a u="7E8A" b="C0 6B"/>
+ <a u="7E8B" b="C0 6C"/>
+ <a u="7E8C" b="C0 6D"/>
+ <a u="7E8D" b="C0 6E"/>
+ <a u="7E8E" b="C0 6F"/>
+ <a u="7E8F" b="C0 70"/>
+ <a u="7E90" b="C0 71"/>
+ <a u="7E91" b="C0 72"/>
+ <a u="7E92" b="C0 73"/>
+ <a u="7E93" b="C0 74"/>
+ <a u="7E94" b="C0 75"/>
+ <a u="7E95" b="C0 76"/>
+ <a u="7E96" b="C0 77"/>
+ <a u="7E97" b="C0 78"/>
+ <a u="7E98" b="C0 79"/>
+ <a u="7E99" b="C0 7A"/>
+ <a u="7E9A" b="C0 7B"/>
+ <a u="7E9B" b="F4 EE"/>
+ <a u="7E9C" b="C0 7C"/>
+ <a u="7E9D" b="C0 7D"/>
+ <a u="7E9E" b="C0 7E"/>
+ <a u="7E9F" b="E6 F9"/>
+ <a u="7EA0" b="BE C0"/>
+ <a u="7EA1" b="E6 FA"/>
+ <a u="7EA2" b="BA EC"/>
+ <a u="7EA3" b="E6 FB"/>
+ <a u="7EA4" b="CF CB"/>
+ <a u="7EA5" b="E6 FC"/>
+ <a u="7EA6" b="D4 BC"/>
+ <a u="7EA7" b="BC B6"/>
+ <a u="7EA8" b="E6 FD"/>
+ <a u="7EA9" b="E6 FE"/>
+ <a u="7EAA" b="BC CD"/>
+ <a u="7EAB" b="C8 D2"/>
+ <a u="7EAC" b="CE B3"/>
+ <a u="7EAD" b="E7 A1"/>
+ <a u="7EAE" b="C0 80"/>
+ <a u="7EAF" b="B4 BF"/>
+ <a u="7EB0" b="E7 A2"/>
+ <a u="7EB1" b="C9 B4"/>
+ <a u="7EB2" b="B8 D9"/>
+ <a u="7EB3" b="C4 C9"/>
+ <a u="7EB4" b="C0 81"/>
+ <a u="7EB5" b="D7 DD"/>
+ <a u="7EB6" b="C2 DA"/>
+ <a u="7EB7" b="B7 D7"/>
+ <a u="7EB8" b="D6 BD"/>
+ <a u="7EB9" b="CE C6"/>
+ <a u="7EBA" b="B7 C4"/>
+ <a u="7EBB" b="C0 82"/>
+ <a u="7EBC" b="C0 83"/>
+ <a u="7EBD" b="C5 A6"/>
+ <a u="7EBE" b="E7 A3"/>
+ <a u="7EBF" b="CF DF"/>
+ <a u="7EC0" b="E7 A4"/>
+ <a u="7EC1" b="E7 A5"/>
+ <a u="7EC2" b="E7 A6"/>
+ <a u="7EC3" b="C1 B7"/>
+ <a u="7EC4" b="D7 E9"/>
+ <a u="7EC5" b="C9 F0"/>
+ <a u="7EC6" b="CF B8"/>
+ <a u="7EC7" b="D6 AF"/>
+ <a u="7EC8" b="D6 D5"/>
+ <a u="7EC9" b="E7 A7"/>
+ <a u="7ECA" b="B0 ED"/>
+ <a u="7ECB" b="E7 A8"/>
+ <a u="7ECC" b="E7 A9"/>
+ <a u="7ECD" b="C9 DC"/>
+ <a u="7ECE" b="D2 EF"/>
+ <a u="7ECF" b="BE AD"/>
+ <a u="7ED0" b="E7 AA"/>
+ <a u="7ED1" b="B0 F3"/>
+ <a u="7ED2" b="C8 DE"/>
+ <a u="7ED3" b="BD E1"/>
+ <a u="7ED4" b="E7 AB"/>
+ <a u="7ED5" b="C8 C6"/>
+ <a u="7ED6" b="C0 84"/>
+ <a u="7ED7" b="E7 AC"/>
+ <a u="7ED8" b="BB E6"/>
+ <a u="7ED9" b="B8 F8"/>
+ <a u="7EDA" b="D1 A4"/>
+ <a u="7EDB" b="E7 AD"/>
+ <a u="7EDC" b="C2 E7"/>
+ <a u="7EDD" b="BE F8"/>
+ <a u="7EDE" b="BD CA"/>
+ <a u="7EDF" b="CD B3"/>
+ <a u="7EE0" b="E7 AE"/>
+ <a u="7EE1" b="E7 AF"/>
+ <a u="7EE2" b="BE EE"/>
+ <a u="7EE3" b="D0 E5"/>
+ <a u="7EE4" b="C0 85"/>
+ <a u="7EE5" b="CB E7"/>
+ <a u="7EE6" b="CC D0"/>
+ <a u="7EE7" b="BC CC"/>
+ <a u="7EE8" b="E7 B0"/>
+ <a u="7EE9" b="BC A8"/>
+ <a u="7EEA" b="D0 F7"/>
+ <a u="7EEB" b="E7 B1"/>
+ <a u="7EEC" b="C0 86"/>
+ <a u="7EED" b="D0 F8"/>
+ <a u="7EEE" b="E7 B2"/>
+ <a u="7EEF" b="E7 B3"/>
+ <a u="7EF0" b="B4 C2"/>
+ <a u="7EF1" b="E7 B4"/>
+ <a u="7EF2" b="E7 B5"/>
+ <a u="7EF3" b="C9 FE"/>
+ <a u="7EF4" b="CE AC"/>
+ <a u="7EF5" b="C3 E0"/>
+ <a u="7EF6" b="E7 B7"/>
+ <a u="7EF7" b="B1 C1"/>
+ <a u="7EF8" b="B3 F1"/>
+ <a u="7EF9" b="C0 87"/>
+ <a u="7EFA" b="E7 B8"/>
+ <a u="7EFB" b="E7 B9"/>
+ <a u="7EFC" b="D7 DB"/>
+ <a u="7EFD" b="D5 C0"/>
+ <a u="7EFE" b="E7 BA"/>
+ <a u="7EFF" b="C2 CC"/>
+ <a u="7F00" b="D7 BA"/>
+ <a u="7F01" b="E7 BB"/>
+ <a u="7F02" b="E7 BC"/>
+ <a u="7F03" b="E7 BD"/>
+ <a u="7F04" b="BC EA"/>
+ <a u="7F05" b="C3 E5"/>
+ <a u="7F06" b="C0 C2"/>
+ <a u="7F07" b="E7 BE"/>
+ <a u="7F08" b="E7 BF"/>
+ <a u="7F09" b="BC A9"/>
+ <a u="7F0A" b="C0 88"/>
+ <a u="7F0B" b="E7 C0"/>
+ <a u="7F0C" b="E7 C1"/>
+ <a u="7F0D" b="E7 B6"/>
+ <a u="7F0E" b="B6 D0"/>
+ <a u="7F0F" b="E7 C2"/>
+ <a u="7F10" b="C0 89"/>
+ <a u="7F11" b="E7 C3"/>
+ <a u="7F12" b="E7 C4"/>
+ <a u="7F13" b="BB BA"/>
+ <a u="7F14" b="B5 DE"/>
+ <a u="7F15" b="C2 C6"/>
+ <a u="7F16" b="B1 E0"/>
+ <a u="7F17" b="E7 C5"/>
+ <a u="7F18" b="D4 B5"/>
+ <a u="7F19" b="E7 C6"/>
+ <a u="7F1A" b="B8 BF"/>
+ <a u="7F1B" b="E7 C8"/>
+ <a u="7F1C" b="E7 C7"/>
+ <a u="7F1D" b="B7 EC"/>
+ <a u="7F1E" b="C0 8A"/>
+ <a u="7F1F" b="E7 C9"/>
+ <a u="7F20" b="B2 F8"/>
+ <a u="7F21" b="E7 CA"/>
+ <a u="7F22" b="E7 CB"/>
+ <a u="7F23" b="E7 CC"/>
+ <a u="7F24" b="E7 CD"/>
+ <a u="7F25" b="E7 CE"/>
+ <a u="7F26" b="E7 CF"/>
+ <a u="7F27" b="E7 D0"/>
+ <a u="7F28" b="D3 A7"/>
+ <a u="7F29" b="CB F5"/>
+ <a u="7F2A" b="E7 D1"/>
+ <a u="7F2B" b="E7 D2"/>
+ <a u="7F2C" b="E7 D3"/>
+ <a u="7F2D" b="E7 D4"/>
+ <a u="7F2E" b="C9 C9"/>
+ <a u="7F2F" b="E7 D5"/>
+ <a u="7F30" b="E7 D6"/>
+ <a u="7F31" b="E7 D7"/>
+ <a u="7F32" b="E7 D8"/>
+ <a u="7F33" b="E7 D9"/>
+ <a u="7F34" b="BD C9"/>
+ <a u="7F35" b="E7 DA"/>
+ <a u="7F36" b="F3 BE"/>
+ <a u="7F37" b="C0 8B"/>
+ <a u="7F38" b="B8 D7"/>
+ <a u="7F39" b="C0 8C"/>
+ <a u="7F3A" b="C8 B1"/>
+ <a u="7F3B" b="C0 8D"/>
+ <a u="7F3C" b="C0 8E"/>
+ <a u="7F3D" b="C0 8F"/>
+ <a u="7F3E" b="C0 90"/>
+ <a u="7F3F" b="C0 91"/>
+ <a u="7F40" b="C0 92"/>
+ <a u="7F41" b="C0 93"/>
+ <a u="7F42" b="F3 BF"/>
+ <a u="7F43" b="C0 94"/>
+ <a u="7F44" b="F3 C0"/>
+ <a u="7F45" b="F3 C1"/>
+ <a u="7F46" b="C0 95"/>
+ <a u="7F47" b="C0 96"/>
+ <a u="7F48" b="C0 97"/>
+ <a u="7F49" b="C0 98"/>
+ <a u="7F4A" b="C0 99"/>
+ <a u="7F4B" b="C0 9A"/>
+ <a u="7F4C" b="C0 9B"/>
+ <a u="7F4D" b="C0 9C"/>
+ <a u="7F4E" b="C0 9D"/>
+ <a u="7F4F" b="C0 9E"/>
+ <a u="7F50" b="B9 DE"/>
+ <a u="7F51" b="CD F8"/>
+ <a u="7F52" b="C0 9F"/>
+ <a u="7F53" b="C0 A0"/>
+ <a u="7F54" b="D8 E8"/>
+ <a u="7F55" b="BA B1"/>
+ <a u="7F56" b="C1 40"/>
+ <a u="7F57" b="C2 DE"/>
+ <a u="7F58" b="EE B7"/>
+ <a u="7F59" b="C1 41"/>
+ <a u="7F5A" b="B7 A3"/>
+ <a u="7F5B" b="C1 42"/>
+ <a u="7F5C" b="C1 43"/>
+ <a u="7F5D" b="C1 44"/>
+ <a u="7F5E" b="C1 45"/>
+ <a u="7F5F" b="EE B9"/>
+ <a u="7F60" b="C1 46"/>
+ <a u="7F61" b="EE B8"/>
+ <a u="7F62" b="B0 D5"/>
+ <a u="7F63" b="C1 47"/>
+ <a u="7F64" b="C1 48"/>
+ <a u="7F65" b="C1 49"/>
+ <a u="7F66" b="C1 4A"/>
+ <a u="7F67" b="C1 4B"/>
+ <a u="7F68" b="EE BB"/>
+ <a u="7F69" b="D5 D6"/>
+ <a u="7F6A" b="D7 EF"/>
+ <a u="7F6B" b="C1 4C"/>
+ <a u="7F6C" b="C1 4D"/>
+ <a u="7F6D" b="C1 4E"/>
+ <a u="7F6E" b="D6 C3"/>
+ <a u="7F6F" b="C1 4F"/>
+ <a u="7F70" b="C1 50"/>
+ <a u="7F71" b="EE BD"/>
+ <a u="7F72" b="CA F0"/>
+ <a u="7F73" b="C1 51"/>
+ <a u="7F74" b="EE BC"/>
+ <a u="7F75" b="C1 52"/>
+ <a u="7F76" b="C1 53"/>
+ <a u="7F77" b="C1 54"/>
+ <a u="7F78" b="C1 55"/>
+ <a u="7F79" b="EE BE"/>
+ <a u="7F7A" b="C1 56"/>
+ <a u="7F7B" b="C1 57"/>
+ <a u="7F7C" b="C1 58"/>
+ <a u="7F7D" b="C1 59"/>
+ <a u="7F7E" b="EE C0"/>
+ <a u="7F7F" b="C1 5A"/>
+ <a u="7F80" b="C1 5B"/>
+ <a u="7F81" b="EE BF"/>
+ <a u="7F82" b="C1 5C"/>
+ <a u="7F83" b="C1 5D"/>
+ <a u="7F84" b="C1 5E"/>
+ <a u="7F85" b="C1 5F"/>
+ <a u="7F86" b="C1 60"/>
+ <a u="7F87" b="C1 61"/>
+ <a u="7F88" b="C1 62"/>
+ <a u="7F89" b="C1 63"/>
+ <a u="7F8A" b="D1 F2"/>
+ <a u="7F8B" b="C1 64"/>
+ <a u="7F8C" b="C7 BC"/>
+ <a u="7F8D" b="C1 65"/>
+ <a u="7F8E" b="C3 C0"/>
+ <a u="7F8F" b="C1 66"/>
+ <a u="7F90" b="C1 67"/>
+ <a u="7F91" b="C1 68"/>
+ <a u="7F92" b="C1 69"/>
+ <a u="7F93" b="C1 6A"/>
+ <a u="7F94" b="B8 E1"/>
+ <a u="7F95" b="C1 6B"/>
+ <a u="7F96" b="C1 6C"/>
+ <a u="7F97" b="C1 6D"/>
+ <a u="7F98" b="C1 6E"/>
+ <a u="7F99" b="C1 6F"/>
+ <a u="7F9A" b="C1 E7"/>
+ <a u="7F9B" b="C1 70"/>
+ <a u="7F9C" b="C1 71"/>
+ <a u="7F9D" b="F4 C6"/>
+ <a u="7F9E" b="D0 DF"/>
+ <a u="7F9F" b="F4 C7"/>
+ <a u="7FA0" b="C1 72"/>
+ <a u="7FA1" b="CF DB"/>
+ <a u="7FA2" b="C1 73"/>
+ <a u="7FA3" b="C1 74"/>
+ <a u="7FA4" b="C8 BA"/>
+ <a u="7FA5" b="C1 75"/>
+ <a u="7FA6" b="C1 76"/>
+ <a u="7FA7" b="F4 C8"/>
+ <a u="7FA8" b="C1 77"/>
+ <a u="7FA9" b="C1 78"/>
+ <a u="7FAA" b="C1 79"/>
+ <a u="7FAB" b="C1 7A"/>
+ <a u="7FAC" b="C1 7B"/>
+ <a u="7FAD" b="C1 7C"/>
+ <a u="7FAE" b="C1 7D"/>
+ <a u="7FAF" b="F4 C9"/>
+ <a u="7FB0" b="F4 CA"/>
+ <a u="7FB1" b="C1 7E"/>
+ <a u="7FB2" b="F4 CB"/>
+ <a u="7FB3" b="C1 80"/>
+ <a u="7FB4" b="C1 81"/>
+ <a u="7FB5" b="C1 82"/>
+ <a u="7FB6" b="C1 83"/>
+ <a u="7FB7" b="C1 84"/>
+ <a u="7FB8" b="D9 FA"/>
+ <a u="7FB9" b="B8 FE"/>
+ <a u="7FBA" b="C1 85"/>
+ <a u="7FBB" b="C1 86"/>
+ <a u="7FBC" b="E5 F1"/>
+ <a u="7FBD" b="D3 F0"/>
+ <a u="7FBE" b="C1 87"/>
+ <a u="7FBF" b="F4 E0"/>
+ <a u="7FC0" b="C1 88"/>
+ <a u="7FC1" b="CE CC"/>
+ <a u="7FC2" b="C1 89"/>
+ <a u="7FC3" b="C1 8A"/>
+ <a u="7FC4" b="C1 8B"/>
+ <a u="7FC5" b="B3 E1"/>
+ <a u="7FC6" b="C1 8C"/>
+ <a u="7FC7" b="C1 8D"/>
+ <a u="7FC8" b="C1 8E"/>
+ <a u="7FC9" b="C1 8F"/>
+ <a u="7FCA" b="F1 B4"/>
+ <a u="7FCB" b="C1 90"/>
+ <a u="7FCC" b="D2 EE"/>
+ <a u="7FCD" b="C1 91"/>
+ <a u="7FCE" b="F4 E1"/>
+ <a u="7FCF" b="C1 92"/>
+ <a u="7FD0" b="C1 93"/>
+ <a u="7FD1" b="C1 94"/>
+ <a u="7FD2" b="C1 95"/>
+ <a u="7FD3" b="C1 96"/>
+ <a u="7FD4" b="CF E8"/>
+ <a u="7FD5" b="F4 E2"/>
+ <a u="7FD6" b="C1 97"/>
+ <a u="7FD7" b="C1 98"/>
+ <a u="7FD8" b="C7 CC"/>
+ <a u="7FD9" b="C1 99"/>
+ <a u="7FDA" b="C1 9A"/>
+ <a u="7FDB" b="C1 9B"/>
+ <a u="7FDC" b="C1 9C"/>
+ <a u="7FDD" b="C1 9D"/>
+ <a u="7FDE" b="C1 9E"/>
+ <a u="7FDF" b="B5 D4"/>
+ <a u="7FE0" b="B4 E4"/>
+ <a u="7FE1" b="F4 E4"/>
+ <a u="7FE2" b="C1 9F"/>
+ <a u="7FE3" b="C1 A0"/>
+ <a u="7FE4" b="C2 40"/>
+ <a u="7FE5" b="F4 E3"/>
+ <a u="7FE6" b="F4 E5"/>
+ <a u="7FE7" b="C2 41"/>
+ <a u="7FE8" b="C2 42"/>
+ <a u="7FE9" b="F4 E6"/>
+ <a u="7FEA" b="C2 43"/>
+ <a u="7FEB" b="C2 44"/>
+ <a u="7FEC" b="C2 45"/>
+ <a u="7FED" b="C2 46"/>
+ <a u="7FEE" b="F4 E7"/>
+ <a u="7FEF" b="C2 47"/>
+ <a u="7FF0" b="BA B2"/>
+ <a u="7FF1" b="B0 BF"/>
+ <a u="7FF2" b="C2 48"/>
+ <a u="7FF3" b="F4 E8"/>
+ <a u="7FF4" b="C2 49"/>
+ <a u="7FF5" b="C2 4A"/>
+ <a u="7FF6" b="C2 4B"/>
+ <a u="7FF7" b="C2 4C"/>
+ <a u="7FF8" b="C2 4D"/>
+ <a u="7FF9" b="C2 4E"/>
+ <a u="7FFA" b="C2 4F"/>
+ <a u="7FFB" b="B7 AD"/>
+ <a u="7FFC" b="D2 ED"/>
+ <a u="7FFD" b="C2 50"/>
+ <a u="7FFE" b="C2 51"/>
+ <a u="7FFF" b="C2 52"/>
+ <a u="8000" b="D2 AB"/>
+ <a u="8001" b="C0 CF"/>
+ <a u="8002" b="C2 53"/>
+ <a u="8003" b="BF BC"/>
+ <a u="8004" b="EB A3"/>
+ <a u="8005" b="D5 DF"/>
+ <a u="8006" b="EA C8"/>
+ <a u="8007" b="C2 54"/>
+ <a u="8008" b="C2 55"/>
+ <a u="8009" b="C2 56"/>
+ <a u="800A" b="C2 57"/>
+ <a u="800B" b="F1 F3"/>
+ <a u="800C" b="B6 F8"/>
+ <a u="800D" b="CB A3"/>
+ <a u="800E" b="C2 58"/>
+ <a u="800F" b="C2 59"/>
+ <a u="8010" b="C4 CD"/>
+ <a u="8011" b="C2 5A"/>
+ <a u="8012" b="F1 E7"/>
+ <a u="8013" b="C2 5B"/>
+ <a u="8014" b="F1 E8"/>
+ <a u="8015" b="B8 FB"/>
+ <a u="8016" b="F1 E9"/>
+ <a u="8017" b="BA C4"/>
+ <a u="8018" b="D4 C5"/>
+ <a u="8019" b="B0 D2"/>
+ <a u="801A" b="C2 5C"/>
+ <a u="801B" b="C2 5D"/>
+ <a u="801C" b="F1 EA"/>
+ <a u="801D" b="C2 5E"/>
+ <a u="801E" b="C2 5F"/>
+ <a u="801F" b="C2 60"/>
+ <a u="8020" b="F1 EB"/>
+ <a u="8021" b="C2 61"/>
+ <a u="8022" b="F1 EC"/>
+ <a u="8023" b="C2 62"/>
+ <a u="8024" b="C2 63"/>
+ <a u="8025" b="F1 ED"/>
+ <a u="8026" b="F1 EE"/>
+ <a u="8027" b="F1 EF"/>
+ <a u="8028" b="F1 F1"/>
+ <a u="8029" b="F1 F0"/>
+ <a u="802A" b="C5 D5"/>
+ <a u="802B" b="C2 64"/>
+ <a u="802C" b="C2 65"/>
+ <a u="802D" b="C2 66"/>
+ <a u="802E" b="C2 67"/>
+ <a u="802F" b="C2 68"/>
+ <a u="8030" b="C2 69"/>
+ <a u="8031" b="F1 F2"/>
+ <a u="8032" b="C2 6A"/>
+ <a u="8033" b="B6 FA"/>
+ <a u="8034" b="C2 6B"/>
+ <a u="8035" b="F1 F4"/>
+ <a u="8036" b="D2 AE"/>
+ <a u="8037" b="DE C7"/>
+ <a u="8038" b="CB CA"/>
+ <a u="8039" b="C2 6C"/>
+ <a u="803A" b="C2 6D"/>
+ <a u="803B" b="B3 DC"/>
+ <a u="803C" b="C2 6E"/>
+ <a u="803D" b="B5 A2"/>
+ <a u="803E" b="C2 6F"/>
+ <a u="803F" b="B9 A2"/>
+ <a u="8040" b="C2 70"/>
+ <a u="8041" b="C2 71"/>
+ <a u="8042" b="C4 F4"/>
+ <a u="8043" b="F1 F5"/>
+ <a u="8044" b="C2 72"/>
+ <a u="8045" b="C2 73"/>
+ <a u="8046" b="F1 F6"/>
+ <a u="8047" b="C2 74"/>
+ <a u="8048" b="C2 75"/>
+ <a u="8049" b="C2 76"/>
+ <a u="804A" b="C1 C4"/>
+ <a u="804B" b="C1 FB"/>
+ <a u="804C" b="D6 B0"/>
+ <a u="804D" b="F1 F7"/>
+ <a u="804E" b="C2 77"/>
+ <a u="804F" b="C2 78"/>
+ <a u="8050" b="C2 79"/>
+ <a u="8051" b="C2 7A"/>
+ <a u="8052" b="F1 F8"/>
+ <a u="8053" b="C2 7B"/>
+ <a u="8054" b="C1 AA"/>
+ <a u="8055" b="C2 7C"/>
+ <a u="8056" b="C2 7D"/>
+ <a u="8057" b="C2 7E"/>
+ <a u="8058" b="C6 B8"/>
+ <a u="8059" b="C2 80"/>
+ <a u="805A" b="BE DB"/>
+ <a u="805B" b="C2 81"/>
+ <a u="805C" b="C2 82"/>
+ <a u="805D" b="C2 83"/>
+ <a u="805E" b="C2 84"/>
+ <a u="805F" b="C2 85"/>
+ <a u="8060" b="C2 86"/>
+ <a u="8061" b="C2 87"/>
+ <a u="8062" b="C2 88"/>
+ <a u="8063" b="C2 89"/>
+ <a u="8064" b="C2 8A"/>
+ <a u="8065" b="C2 8B"/>
+ <a u="8066" b="C2 8C"/>
+ <a u="8067" b="C2 8D"/>
+ <a u="8068" b="C2 8E"/>
+ <a u="8069" b="F1 F9"/>
+ <a u="806A" b="B4 CF"/>
+ <a u="806B" b="C2 8F"/>
+ <a u="806C" b="C2 90"/>
+ <a u="806D" b="C2 91"/>
+ <a u="806E" b="C2 92"/>
+ <a u="806F" b="C2 93"/>
+ <a u="8070" b="C2 94"/>
+ <a u="8071" b="F1 FA"/>
+ <a u="8072" b="C2 95"/>
+ <a u="8073" b="C2 96"/>
+ <a u="8074" b="C2 97"/>
+ <a u="8075" b="C2 98"/>
+ <a u="8076" b="C2 99"/>
+ <a u="8077" b="C2 9A"/>
+ <a u="8078" b="C2 9B"/>
+ <a u="8079" b="C2 9C"/>
+ <a u="807A" b="C2 9D"/>
+ <a u="807B" b="C2 9E"/>
+ <a u="807C" b="C2 9F"/>
+ <a u="807D" b="C2 A0"/>
+ <a u="807E" b="C3 40"/>
+ <a u="807F" b="ED B2"/>
+ <a u="8080" b="ED B1"/>
+ <a u="8081" b="C3 41"/>
+ <a u="8082" b="C3 42"/>
+ <a u="8083" b="CB E0"/>
+ <a u="8084" b="D2 DE"/>
+ <a u="8085" b="C3 43"/>
+ <a u="8086" b="CB C1"/>
+ <a u="8087" b="D5 D8"/>
+ <a u="8088" b="C3 44"/>
+ <a u="8089" b="C8 E2"/>
+ <a u="808A" b="C3 45"/>
+ <a u="808B" b="C0 DF"/>
+ <a u="808C" b="BC A1"/>
+ <a u="808D" b="C3 46"/>
+ <a u="808E" b="C3 47"/>
+ <a u="808F" b="C3 48"/>
+ <a u="8090" b="C3 49"/>
+ <a u="8091" b="C3 4A"/>
+ <a u="8092" b="C3 4B"/>
+ <a u="8093" b="EB C1"/>
+ <a u="8094" b="C3 4C"/>
+ <a u="8095" b="C3 4D"/>
+ <a u="8096" b="D0 A4"/>
+ <a u="8097" b="C3 4E"/>
+ <a u="8098" b="D6 E2"/>
+ <a u="8099" b="C3 4F"/>
+ <a u="809A" b="B6 C7"/>
+ <a u="809B" b="B8 D8"/>
+ <a u="809C" b="EB C0"/>
+ <a u="809D" b="B8 CE"/>
+ <a u="809E" b="C3 50"/>
+ <a u="809F" b="EB BF"/>
+ <a u="80A0" b="B3 A6"/>
+ <a u="80A1" b="B9 C9"/>
+ <a u="80A2" b="D6 AB"/>
+ <a u="80A3" b="C3 51"/>
+ <a u="80A4" b="B7 F4"/>
+ <a u="80A5" b="B7 CA"/>
+ <a u="80A6" b="C3 52"/>
+ <a u="80A7" b="C3 53"/>
+ <a u="80A8" b="C3 54"/>
+ <a u="80A9" b="BC E7"/>
+ <a u="80AA" b="B7 BE"/>
+ <a u="80AB" b="EB C6"/>
+ <a u="80AC" b="C3 55"/>
+ <a u="80AD" b="EB C7"/>
+ <a u="80AE" b="B0 B9"/>
+ <a u="80AF" b="BF CF"/>
+ <a u="80B0" b="C3 56"/>
+ <a u="80B1" b="EB C5"/>
+ <a u="80B2" b="D3 FD"/>
+ <a u="80B3" b="C3 57"/>
+ <a u="80B4" b="EB C8"/>
+ <a u="80B5" b="C3 58"/>
+ <a u="80B6" b="C3 59"/>
+ <a u="80B7" b="EB C9"/>
+ <a u="80B8" b="C3 5A"/>
+ <a u="80B9" b="C3 5B"/>
+ <a u="80BA" b="B7 CE"/>
+ <a u="80BB" b="C3 5C"/>
+ <a u="80BC" b="EB C2"/>
+ <a u="80BD" b="EB C4"/>
+ <a u="80BE" b="C9 F6"/>
+ <a u="80BF" b="D6 D7"/>
+ <a u="80C0" b="D5 CD"/>
+ <a u="80C1" b="D0 B2"/>
+ <a u="80C2" b="EB CF"/>
+ <a u="80C3" b="CE B8"/>
+ <a u="80C4" b="EB D0"/>
+ <a u="80C5" b="C3 5D"/>
+ <a u="80C6" b="B5 A8"/>
+ <a u="80C7" b="C3 5E"/>
+ <a u="80C8" b="C3 5F"/>
+ <a u="80C9" b="C3 60"/>
+ <a u="80CA" b="C3 61"/>
+ <a u="80CB" b="C3 62"/>
+ <a u="80CC" b="B1 B3"/>
+ <a u="80CD" b="EB D2"/>
+ <a u="80CE" b="CC A5"/>
+ <a u="80CF" b="C3 63"/>
+ <a u="80D0" b="C3 64"/>
+ <a u="80D1" b="C3 65"/>
+ <a u="80D2" b="C3 66"/>
+ <a u="80D3" b="C3 67"/>
+ <a u="80D4" b="C3 68"/>
+ <a u="80D5" b="C3 69"/>
+ <a u="80D6" b="C5 D6"/>
+ <a u="80D7" b="EB D3"/>
+ <a u="80D8" b="C3 6A"/>
+ <a u="80D9" b="EB D1"/>
+ <a u="80DA" b="C5 DF"/>
+ <a u="80DB" b="EB CE"/>
+ <a u="80DC" b="CA A4"/>
+ <a u="80DD" b="EB D5"/>
+ <a u="80DE" b="B0 FB"/>
+ <a u="80DF" b="C3 6B"/>
+ <a u="80E0" b="C3 6C"/>
+ <a u="80E1" b="BA FA"/>
+ <a u="80E2" b="C3 6D"/>
+ <a u="80E3" b="C3 6E"/>
+ <a u="80E4" b="D8 B7"/>
+ <a u="80E5" b="F1 E3"/>
+ <a u="80E6" b="C3 6F"/>
+ <a u="80E7" b="EB CA"/>
+ <a u="80E8" b="EB CB"/>
+ <a u="80E9" b="EB CC"/>
+ <a u="80EA" b="EB CD"/>
+ <a u="80EB" b="EB D6"/>
+ <a u="80EC" b="E6 C0"/>
+ <a u="80ED" b="EB D9"/>
+ <a u="80EE" b="C3 70"/>
+ <a u="80EF" b="BF E8"/>
+ <a u="80F0" b="D2 C8"/>
+ <a u="80F1" b="EB D7"/>
+ <a u="80F2" b="EB DC"/>
+ <a u="80F3" b="B8 EC"/>
+ <a u="80F4" b="EB D8"/>
+ <a u="80F5" b="C3 71"/>
+ <a u="80F6" b="BD BA"/>
+ <a u="80F7" b="C3 72"/>
+ <a u="80F8" b="D0 D8"/>
+ <a u="80F9" b="C3 73"/>
+ <a u="80FA" b="B0 B7"/>
+ <a u="80FB" b="C3 74"/>
+ <a u="80FC" b="EB DD"/>
+ <a u="80FD" b="C4 DC"/>
+ <a u="80FE" b="C3 75"/>
+ <a u="80FF" b="C3 76"/>
+ <a u="8100" b="C3 77"/>
+ <a u="8101" b="C3 78"/>
+ <a u="8102" b="D6 AC"/>
+ <a u="8103" b="C3 79"/>
+ <a u="8104" b="C3 7A"/>
+ <a u="8105" b="C3 7B"/>
+ <a u="8106" b="B4 E0"/>
+ <a u="8107" b="C3 7C"/>
+ <a u="8108" b="C3 7D"/>
+ <a u="8109" b="C2 F6"/>
+ <a u="810A" b="BC B9"/>
+ <a u="810B" b="C3 7E"/>
+ <a u="810C" b="C3 80"/>
+ <a u="810D" b="EB DA"/>
+ <a u="810E" b="EB DB"/>
+ <a u="810F" b="D4 E0"/>
+ <a u="8110" b="C6 EA"/>
+ <a u="8111" b="C4 D4"/>
+ <a u="8112" b="EB DF"/>
+ <a u="8113" b="C5 A7"/>
+ <a u="8114" b="D9 F5"/>
+ <a u="8115" b="C3 81"/>
+ <a u="8116" b="B2 B1"/>
+ <a u="8117" b="C3 82"/>
+ <a u="8118" b="EB E4"/>
+ <a u="8119" b="C3 83"/>
+ <a u="811A" b="BD C5"/>
+ <a u="811B" b="C3 84"/>
+ <a u="811C" b="C3 85"/>
+ <a u="811D" b="C3 86"/>
+ <a u="811E" b="EB E2"/>
+ <a u="811F" b="C3 87"/>
+ <a u="8120" b="C3 88"/>
+ <a u="8121" b="C3 89"/>
+ <a u="8122" b="C3 8A"/>
+ <a u="8123" b="C3 8B"/>
+ <a u="8124" b="C3 8C"/>
+ <a u="8125" b="C3 8D"/>
+ <a u="8126" b="C3 8E"/>
+ <a u="8127" b="C3 8F"/>
+ <a u="8128" b="C3 90"/>
+ <a u="8129" b="C3 91"/>
+ <a u="812A" b="C3 92"/>
+ <a u="812B" b="C3 93"/>
+ <a u="812C" b="EB E3"/>
+ <a u="812D" b="C3 94"/>
+ <a u="812E" b="C3 95"/>
+ <a u="812F" b="B8 AC"/>
+ <a u="8130" b="C3 96"/>
+ <a u="8131" b="CD D1"/>
+ <a u="8132" b="EB E5"/>
+ <a u="8133" b="C3 97"/>
+ <a u="8134" b="C3 98"/>
+ <a u="8135" b="C3 99"/>
+ <a u="8136" b="EB E1"/>
+ <a u="8137" b="C3 9A"/>
+ <a u="8138" b="C1 B3"/>
+ <a u="8139" b="C3 9B"/>
+ <a u="813A" b="C3 9C"/>
+ <a u="813B" b="C3 9D"/>
+ <a u="813C" b="C3 9E"/>
+ <a u="813D" b="C3 9F"/>
+ <a u="813E" b="C6 A2"/>
+ <a u="813F" b="C3 A0"/>
+ <a u="8140" b="C4 40"/>
+ <a u="8141" b="C4 41"/>
+ <a u="8142" b="C4 42"/>
+ <a u="8143" b="C4 43"/>
+ <a u="8144" b="C4 44"/>
+ <a u="8145" b="C4 45"/>
+ <a u="8146" b="CC F3"/>
+ <a u="8147" b="C4 46"/>
+ <a u="8148" b="EB E6"/>
+ <a u="8149" b="C4 47"/>
+ <a u="814A" b="C0 B0"/>
+ <a u="814B" b="D2 B8"/>
+ <a u="814C" b="EB E7"/>
+ <a u="814D" b="C4 48"/>
+ <a u="814E" b="C4 49"/>
+ <a u="814F" b="C4 4A"/>
+ <a u="8150" b="B8 AF"/>
+ <a u="8151" b="B8 AD"/>
+ <a u="8152" b="C4 4B"/>
+ <a u="8153" b="EB E8"/>
+ <a u="8154" b="C7 BB"/>
+ <a u="8155" b="CD F3"/>
+ <a u="8156" b="C4 4C"/>
+ <a u="8157" b="C4 4D"/>
+ <a u="8158" b="C4 4E"/>
+ <a u="8159" b="EB EA"/>
+ <a u="815A" b="EB EB"/>
+ <a u="815B" b="C4 4F"/>
+ <a u="815C" b="C4 50"/>
+ <a u="815D" b="C4 51"/>
+ <a u="815E" b="C4 52"/>
+ <a u="815F" b="C4 53"/>
+ <a u="8160" b="EB ED"/>
+ <a u="8161" b="C4 54"/>
+ <a u="8162" b="C4 55"/>
+ <a u="8163" b="C4 56"/>
+ <a u="8164" b="C4 57"/>
+ <a u="8165" b="D0 C8"/>
+ <a u="8166" b="C4 58"/>
+ <a u="8167" b="EB F2"/>
+ <a u="8168" b="C4 59"/>
+ <a u="8169" b="EB EE"/>
+ <a u="816A" b="C4 5A"/>
+ <a u="816B" b="C4 5B"/>
+ <a u="816C" b="C4 5C"/>
+ <a u="816D" b="EB F1"/>
+ <a u="816E" b="C8 F9"/>
+ <a u="816F" b="C4 5D"/>
+ <a u="8170" b="D1 FC"/>
+ <a u="8171" b="EB EC"/>
+ <a u="8172" b="C4 5E"/>
+ <a u="8173" b="C4 5F"/>
+ <a u="8174" b="EB E9"/>
+ <a u="8175" b="C4 60"/>
+ <a u="8176" b="C4 61"/>
+ <a u="8177" b="C4 62"/>
+ <a u="8178" b="C4 63"/>
+ <a u="8179" b="B8 B9"/>
+ <a u="817A" b="CF D9"/>
+ <a u="817B" b="C4 E5"/>
+ <a u="817C" b="EB EF"/>
+ <a u="817D" b="EB F0"/>
+ <a u="817E" b="CC DA"/>
+ <a u="817F" b="CD C8"/>
+ <a u="8180" b="B0 F2"/>
+ <a u="8181" b="C4 64"/>
+ <a u="8182" b="EB F6"/>
+ <a u="8183" b="C4 65"/>
+ <a u="8184" b="C4 66"/>
+ <a u="8185" b="C4 67"/>
+ <a u="8186" b="C4 68"/>
+ <a u="8187" b="C4 69"/>
+ <a u="8188" b="EB F5"/>
+ <a u="8189" b="C4 6A"/>
+ <a u="818A" b="B2 B2"/>
+ <a u="818B" b="C4 6B"/>
+ <a u="818C" b="C4 6C"/>
+ <a u="818D" b="C4 6D"/>
+ <a u="818E" b="C4 6E"/>
+ <a u="818F" b="B8 E0"/>
+ <a u="8190" b="C4 6F"/>
+ <a u="8191" b="EB F7"/>
+ <a u="8192" b="C4 70"/>
+ <a u="8193" b="C4 71"/>
+ <a u="8194" b="C4 72"/>
+ <a u="8195" b="C4 73"/>
+ <a u="8196" b="C4 74"/>
+ <a u="8197" b="C4 75"/>
+ <a u="8198" b="B1 EC"/>
+ <a u="8199" b="C4 76"/>
+ <a u="819A" b="C4 77"/>
+ <a u="819B" b="CC C5"/>
+ <a u="819C" b="C4 A4"/>
+ <a u="819D" b="CF A5"/>
+ <a u="819E" b="C4 78"/>
+ <a u="819F" b="C4 79"/>
+ <a u="81A0" b="C4 7A"/>
+ <a u="81A1" b="C4 7B"/>
+ <a u="81A2" b="C4 7C"/>
+ <a u="81A3" b="EB F9"/>
+ <a u="81A4" b="C4 7D"/>
+ <a u="81A5" b="C4 7E"/>
+ <a u="81A6" b="EC A2"/>
+ <a u="81A7" b="C4 80"/>
+ <a u="81A8" b="C5 F2"/>
+ <a u="81A9" b="C4 81"/>
+ <a u="81AA" b="EB FA"/>
+ <a u="81AB" b="C4 82"/>
+ <a u="81AC" b="C4 83"/>
+ <a u="81AD" b="C4 84"/>
+ <a u="81AE" b="C4 85"/>
+ <a u="81AF" b="C4 86"/>
+ <a u="81B0" b="C4 87"/>
+ <a u="81B1" b="C4 88"/>
+ <a u="81B2" b="C4 89"/>
+ <a u="81B3" b="C9 C5"/>
+ <a u="81B4" b="C4 8A"/>
+ <a u="81B5" b="C4 8B"/>
+ <a u="81B6" b="C4 8C"/>
+ <a u="81B7" b="C4 8D"/>
+ <a u="81B8" b="C4 8E"/>
+ <a u="81B9" b="C4 8F"/>
+ <a u="81BA" b="E2 DF"/>
+ <a u="81BB" b="EB FE"/>
+ <a u="81BC" b="C4 90"/>
+ <a u="81BD" b="C4 91"/>
+ <a u="81BE" b="C4 92"/>
+ <a u="81BF" b="C4 93"/>
+ <a u="81C0" b="CD CE"/>
+ <a u="81C1" b="EC A1"/>
+ <a u="81C2" b="B1 DB"/>
+ <a u="81C3" b="D3 B7"/>
+ <a u="81C4" b="C4 94"/>
+ <a u="81C5" b="C4 95"/>
+ <a u="81C6" b="D2 DC"/>
+ <a u="81C7" b="C4 96"/>
+ <a u="81C8" b="C4 97"/>
+ <a u="81C9" b="C4 98"/>
+ <a u="81CA" b="EB FD"/>
+ <a u="81CB" b="C4 99"/>
+ <a u="81CC" b="EB FB"/>
+ <a u="81CD" b="C4 9A"/>
+ <a u="81CE" b="C4 9B"/>
+ <a u="81CF" b="C4 9C"/>
+ <a u="81D0" b="C4 9D"/>
+ <a u="81D1" b="C4 9E"/>
+ <a u="81D2" b="C4 9F"/>
+ <a u="81D3" b="C4 A0"/>
+ <a u="81D4" b="C5 40"/>
+ <a u="81D5" b="C5 41"/>
+ <a u="81D6" b="C5 42"/>
+ <a u="81D7" b="C5 43"/>
+ <a u="81D8" b="C5 44"/>
+ <a u="81D9" b="C5 45"/>
+ <a u="81DA" b="C5 46"/>
+ <a u="81DB" b="C5 47"/>
+ <a u="81DC" b="C5 48"/>
+ <a u="81DD" b="C5 49"/>
+ <a u="81DE" b="C5 4A"/>
+ <a u="81DF" b="C5 4B"/>
+ <a u="81E0" b="C5 4C"/>
+ <a u="81E1" b="C5 4D"/>
+ <a u="81E2" b="C5 4E"/>
+ <a u="81E3" b="B3 BC"/>
+ <a u="81E4" b="C5 4F"/>
+ <a u="81E5" b="C5 50"/>
+ <a u="81E6" b="C5 51"/>
+ <a u="81E7" b="EA B0"/>
+ <a u="81E8" b="C5 52"/>
+ <a u="81E9" b="C5 53"/>
+ <a u="81EA" b="D7 D4"/>
+ <a u="81EB" b="C5 54"/>
+ <a u="81EC" b="F4 AB"/>
+ <a u="81ED" b="B3 F4"/>
+ <a u="81EE" b="C5 55"/>
+ <a u="81EF" b="C5 56"/>
+ <a u="81F0" b="C5 57"/>
+ <a u="81F1" b="C5 58"/>
+ <a u="81F2" b="C5 59"/>
+ <a u="81F3" b="D6 C1"/>
+ <a u="81F4" b="D6 C2"/>
+ <a u="81F5" b="C5 5A"/>
+ <a u="81F6" b="C5 5B"/>
+ <a u="81F7" b="C5 5C"/>
+ <a u="81F8" b="C5 5D"/>
+ <a u="81F9" b="C5 5E"/>
+ <a u="81FA" b="C5 5F"/>
+ <a u="81FB" b="D5 E9"/>
+ <a u="81FC" b="BE CA"/>
+ <a u="81FD" b="C5 60"/>
+ <a u="81FE" b="F4 A7"/>
+ <a u="81FF" b="C5 61"/>
+ <a u="8200" b="D2 A8"/>
+ <a u="8201" b="F4 A8"/>
+ <a u="8202" b="F4 A9"/>
+ <a u="8203" b="C5 62"/>
+ <a u="8204" b="F4 AA"/>
+ <a u="8205" b="BE CB"/>
+ <a u="8206" b="D3 DF"/>
+ <a u="8207" b="C5 63"/>
+ <a u="8208" b="C5 64"/>
+ <a u="8209" b="C5 65"/>
+ <a u="820A" b="C5 66"/>
+ <a u="820B" b="C5 67"/>
+ <a u="820C" b="C9 E0"/>
+ <a u="820D" b="C9 E1"/>
+ <a u="820E" b="C5 68"/>
+ <a u="820F" b="C5 69"/>
+ <a u="8210" b="F3 C2"/>
+ <a u="8211" b="C5 6A"/>
+ <a u="8212" b="CA E6"/>
+ <a u="8213" b="C5 6B"/>
+ <a u="8214" b="CC F2"/>
+ <a u="8215" b="C5 6C"/>
+ <a u="8216" b="C5 6D"/>
+ <a u="8217" b="C5 6E"/>
+ <a u="8218" b="C5 6F"/>
+ <a u="8219" b="C5 70"/>
+ <a u="821A" b="C5 71"/>
+ <a u="821B" b="E2 B6"/>
+ <a u="821C" b="CB B4"/>
+ <a u="821D" b="C5 72"/>
+ <a u="821E" b="CE E8"/>
+ <a u="821F" b="D6 DB"/>
+ <a u="8220" b="C5 73"/>
+ <a u="8221" b="F4 AD"/>
+ <a u="8222" b="F4 AE"/>
+ <a u="8223" b="F4 AF"/>
+ <a u="8224" b="C5 74"/>
+ <a u="8225" b="C5 75"/>
+ <a u="8226" b="C5 76"/>
+ <a u="8227" b="C5 77"/>
+ <a u="8228" b="F4 B2"/>
+ <a u="8229" b="C5 78"/>
+ <a u="822A" b="BA BD"/>
+ <a u="822B" b="F4 B3"/>
+ <a u="822C" b="B0 E3"/>
+ <a u="822D" b="F4 B0"/>
+ <a u="822E" b="C5 79"/>
+ <a u="822F" b="F4 B1"/>
+ <a u="8230" b="BD A2"/>
+ <a u="8231" b="B2 D5"/>
+ <a u="8232" b="C5 7A"/>
+ <a u="8233" b="F4 B6"/>
+ <a u="8234" b="F4 B7"/>
+ <a u="8235" b="B6 E6"/>
+ <a u="8236" b="B2 B0"/>
+ <a u="8237" b="CF CF"/>
+ <a u="8238" b="F4 B4"/>
+ <a u="8239" b="B4 AC"/>
+ <a u="823A" b="C5 7B"/>
+ <a u="823B" b="F4 B5"/>
+ <a u="823C" b="C5 7C"/>
+ <a u="823D" b="C5 7D"/>
+ <a u="823E" b="F4 B8"/>
+ <a u="823F" b="C5 7E"/>
+ <a u="8240" b="C5 80"/>
+ <a u="8241" b="C5 81"/>
+ <a u="8242" b="C5 82"/>
+ <a u="8243" b="C5 83"/>
+ <a u="8244" b="F4 B9"/>
+ <a u="8245" b="C5 84"/>
+ <a u="8246" b="C5 85"/>
+ <a u="8247" b="CD A7"/>
+ <a u="8248" b="C5 86"/>
+ <a u="8249" b="F4 BA"/>
+ <a u="824A" b="C5 87"/>
+ <a u="824B" b="F4 BB"/>
+ <a u="824C" b="C5 88"/>
+ <a u="824D" b="C5 89"/>
+ <a u="824E" b="C5 8A"/>
+ <a u="824F" b="F4 BC"/>
+ <a u="8250" b="C5 8B"/>
+ <a u="8251" b="C5 8C"/>
+ <a u="8252" b="C5 8D"/>
+ <a u="8253" b="C5 8E"/>
+ <a u="8254" b="C5 8F"/>
+ <a u="8255" b="C5 90"/>
+ <a u="8256" b="C5 91"/>
+ <a u="8257" b="C5 92"/>
+ <a u="8258" b="CB D2"/>
+ <a u="8259" b="C5 93"/>
+ <a u="825A" b="F4 BD"/>
+ <a u="825B" b="C5 94"/>
+ <a u="825C" b="C5 95"/>
+ <a u="825D" b="C5 96"/>
+ <a u="825E" b="C5 97"/>
+ <a u="825F" b="F4 BE"/>
+ <a u="8260" b="C5 98"/>
+ <a u="8261" b="C5 99"/>
+ <a u="8262" b="C5 9A"/>
+ <a u="8263" b="C5 9B"/>
+ <a u="8264" b="C5 9C"/>
+ <a u="8265" b="C5 9D"/>
+ <a u="8266" b="C5 9E"/>
+ <a u="8267" b="C5 9F"/>
+ <a u="8268" b="F4 BF"/>
+ <a u="8269" b="C5 A0"/>
+ <a u="826A" b="C6 40"/>
+ <a u="826B" b="C6 41"/>
+ <a u="826C" b="C6 42"/>
+ <a u="826D" b="C6 43"/>
+ <a u="826E" b="F4 DE"/>
+ <a u="826F" b="C1 BC"/>
+ <a u="8270" b="BC E8"/>
+ <a u="8271" b="C6 44"/>
+ <a u="8272" b="C9 AB"/>
+ <a u="8273" b="D1 DE"/>
+ <a u="8274" b="E5 F5"/>
+ <a u="8275" b="C6 45"/>
+ <a u="8276" b="C6 46"/>
+ <a u="8277" b="C6 47"/>
+ <a u="8278" b="C6 48"/>
+ <a u="8279" b="DC B3"/>
+ <a u="827A" b="D2 D5"/>
+ <a u="827B" b="C6 49"/>
+ <a u="827C" b="C6 4A"/>
+ <a u="827D" b="DC B4"/>
+ <a u="827E" b="B0 AC"/>
+ <a u="827F" b="DC B5"/>
+ <a u="8280" b="C6 4B"/>
+ <a u="8281" b="C6 4C"/>
+ <a u="8282" b="BD DA"/>
+ <a u="8283" b="C6 4D"/>
+ <a u="8284" b="DC B9"/>
+ <a u="8285" b="C6 4E"/>
+ <a u="8286" b="C6 4F"/>
+ <a u="8287" b="C6 50"/>
+ <a u="8288" b="D8 C2"/>
+ <a u="8289" b="C6 51"/>
+ <a u="828A" b="DC B7"/>
+ <a u="828B" b="D3 F3"/>
+ <a u="828C" b="C6 52"/>
+ <a u="828D" b="C9 D6"/>
+ <a u="828E" b="DC BA"/>
+ <a u="828F" b="DC B6"/>
+ <a u="8290" b="C6 53"/>
+ <a u="8291" b="DC BB"/>
+ <a u="8292" b="C3 A2"/>
+ <a u="8293" b="C6 54"/>
+ <a u="8294" b="C6 55"/>
+ <a u="8295" b="C6 56"/>
+ <a u="8296" b="C6 57"/>
+ <a u="8297" b="DC BC"/>
+ <a u="8298" b="DC C5"/>
+ <a u="8299" b="DC BD"/>
+ <a u="829A" b="C6 58"/>
+ <a u="829B" b="C6 59"/>
+ <a u="829C" b="CE DF"/>
+ <a u="829D" b="D6 A5"/>
+ <a u="829E" b="C6 5A"/>
+ <a u="829F" b="DC CF"/>
+ <a u="82A0" b="C6 5B"/>
+ <a u="82A1" b="DC CD"/>
+ <a u="82A2" b="C6 5C"/>
+ <a u="82A3" b="C6 5D"/>
+ <a u="82A4" b="DC D2"/>
+ <a u="82A5" b="BD E6"/>
+ <a u="82A6" b="C2 AB"/>
+ <a u="82A7" b="C6 5E"/>
+ <a u="82A8" b="DC B8"/>
+ <a u="82A9" b="DC CB"/>
+ <a u="82AA" b="DC CE"/>
+ <a u="82AB" b="DC BE"/>
+ <a u="82AC" b="B7 D2"/>
+ <a u="82AD" b="B0 C5"/>
+ <a u="82AE" b="DC C7"/>
+ <a u="82AF" b="D0 BE"/>
+ <a u="82B0" b="DC C1"/>
+ <a u="82B1" b="BB A8"/>
+ <a u="82B2" b="C6 5F"/>
+ <a u="82B3" b="B7 BC"/>
+ <a u="82B4" b="DC CC"/>
+ <a u="82B5" b="C6 60"/>
+ <a u="82B6" b="C6 61"/>
+ <a u="82B7" b="DC C6"/>
+ <a u="82B8" b="DC BF"/>
+ <a u="82B9" b="C7 DB"/>
+ <a u="82BA" b="C6 62"/>
+ <a u="82BB" b="C6 63"/>
+ <a u="82BC" b="C6 64"/>
+ <a u="82BD" b="D1 BF"/>
+ <a u="82BE" b="DC C0"/>
+ <a u="82BF" b="C6 65"/>
+ <a u="82C0" b="C6 66"/>
+ <a u="82C1" b="DC CA"/>
+ <a u="82C2" b="C6 67"/>
+ <a u="82C3" b="C6 68"/>
+ <a u="82C4" b="DC D0"/>
+ <a u="82C5" b="C6 69"/>
+ <a u="82C6" b="C6 6A"/>
+ <a u="82C7" b="CE AD"/>
+ <a u="82C8" b="DC C2"/>
+ <a u="82C9" b="C6 6B"/>
+ <a u="82CA" b="DC C3"/>
+ <a u="82CB" b="DC C8"/>
+ <a u="82CC" b="DC C9"/>
+ <a u="82CD" b="B2 D4"/>
+ <a u="82CE" b="DC D1"/>
+ <a u="82CF" b="CB D5"/>
+ <a u="82D0" b="C6 6C"/>
+ <a u="82D1" b="D4 B7"/>
+ <a u="82D2" b="DC DB"/>
+ <a u="82D3" b="DC DF"/>
+ <a u="82D4" b="CC A6"/>
+ <a u="82D5" b="DC E6"/>
+ <a u="82D6" b="C6 6D"/>
+ <a u="82D7" b="C3 E7"/>
+ <a u="82D8" b="DC DC"/>
+ <a u="82D9" b="C6 6E"/>
+ <a u="82DA" b="C6 6F"/>
+ <a u="82DB" b="BF C1"/>
+ <a u="82DC" b="DC D9"/>
+ <a u="82DD" b="C6 70"/>
+ <a u="82DE" b="B0 FA"/>
+ <a u="82DF" b="B9 B6"/>
+ <a u="82E0" b="DC E5"/>
+ <a u="82E1" b="DC D3"/>
+ <a u="82E2" b="C6 71"/>
+ <a u="82E3" b="DC C4"/>
+ <a u="82E4" b="DC D6"/>
+ <a u="82E5" b="C8 F4"/>
+ <a u="82E6" b="BF E0"/>
+ <a u="82E7" b="C6 72"/>
+ <a u="82E8" b="C6 73"/>
+ <a u="82E9" b="C6 74"/>
+ <a u="82EA" b="C6 75"/>
+ <a u="82EB" b="C9 BB"/>
+ <a u="82EC" b="C6 76"/>
+ <a u="82ED" b="C6 77"/>
+ <a u="82EE" b="C6 78"/>
+ <a u="82EF" b="B1 BD"/>
+ <a u="82F0" b="C6 79"/>
+ <a u="82F1" b="D3 A2"/>
+ <a u="82F2" b="C6 7A"/>
+ <a u="82F3" b="C6 7B"/>
+ <a u="82F4" b="DC DA"/>
+ <a u="82F5" b="C6 7C"/>
+ <a u="82F6" b="C6 7D"/>
+ <a u="82F7" b="DC D5"/>
+ <a u="82F8" b="C6 7E"/>
+ <a u="82F9" b="C6 BB"/>
+ <a u="82FA" b="C6 80"/>
+ <a u="82FB" b="DC DE"/>
+ <a u="82FC" b="C6 81"/>
+ <a u="82FD" b="C6 82"/>
+ <a u="82FE" b="C6 83"/>
+ <a u="82FF" b="C6 84"/>
+ <a u="8300" b="C6 85"/>
+ <a u="8301" b="D7 C2"/>
+ <a u="8302" b="C3 AF"/>
+ <a u="8303" b="B7 B6"/>
+ <a u="8304" b="C7 D1"/>
+ <a u="8305" b="C3 A9"/>
+ <a u="8306" b="DC E2"/>
+ <a u="8307" b="DC D8"/>
+ <a u="8308" b="DC EB"/>
+ <a u="8309" b="DC D4"/>
+ <a u="830A" b="C6 86"/>
+ <a u="830B" b="C6 87"/>
+ <a u="830C" b="DC DD"/>
+ <a u="830D" b="C6 88"/>
+ <a u="830E" b="BE A5"/>
+ <a u="830F" b="DC D7"/>
+ <a u="8310" b="C6 89"/>
+ <a u="8311" b="DC E0"/>
+ <a u="8312" b="C6 8A"/>
+ <a u="8313" b="C6 8B"/>
+ <a u="8314" b="DC E3"/>
+ <a u="8315" b="DC E4"/>
+ <a u="8316" b="C6 8C"/>
+ <a u="8317" b="DC F8"/>
+ <a u="8318" b="C6 8D"/>
+ <a u="8319" b="C6 8E"/>
+ <a u="831A" b="DC E1"/>
+ <a u="831B" b="DD A2"/>
+ <a u="831C" b="DC E7"/>
+ <a u="831D" b="C6 8F"/>
+ <a u="831E" b="C6 90"/>
+ <a u="831F" b="C6 91"/>
+ <a u="8320" b="C6 92"/>
+ <a u="8321" b="C6 93"/>
+ <a u="8322" b="C6 94"/>
+ <a u="8323" b="C6 95"/>
+ <a u="8324" b="C6 96"/>
+ <a u="8325" b="C6 97"/>
+ <a u="8326" b="C6 98"/>
+ <a u="8327" b="BC EB"/>
+ <a u="8328" b="B4 C4"/>
+ <a u="8329" b="C6 99"/>
+ <a u="832A" b="C6 9A"/>
+ <a u="832B" b="C3 A3"/>
+ <a u="832C" b="B2 E7"/>
+ <a u="832D" b="DC FA"/>
+ <a u="832E" b="C6 9B"/>
+ <a u="832F" b="DC F2"/>
+ <a u="8330" b="C6 9C"/>
+ <a u="8331" b="DC EF"/>
+ <a u="8332" b="C6 9D"/>
+ <a u="8333" b="DC FC"/>
+ <a u="8334" b="DC EE"/>
+ <a u="8335" b="D2 F0"/>
+ <a u="8336" b="B2 E8"/>
+ <a u="8337" b="C6 9E"/>
+ <a u="8338" b="C8 D7"/>
+ <a u="8339" b="C8 E3"/>
+ <a u="833A" b="DC FB"/>
+ <a u="833B" b="C6 9F"/>
+ <a u="833C" b="DC ED"/>
+ <a u="833D" b="C6 A0"/>
+ <a u="833E" b="C7 40"/>
+ <a u="833F" b="C7 41"/>
+ <a u="8340" b="DC F7"/>
+ <a u="8341" b="C7 42"/>
+ <a u="8342" b="C7 43"/>
+ <a u="8343" b="DC F5"/>
+ <a u="8344" b="C7 44"/>
+ <a u="8345" b="C7 45"/>
+ <a u="8346" b="BE A3"/>
+ <a u="8347" b="DC F4"/>
+ <a u="8348" b="C7 46"/>
+ <a u="8349" b="B2 DD"/>
+ <a u="834A" b="C7 47"/>
+ <a u="834B" b="C7 48"/>
+ <a u="834C" b="C7 49"/>
+ <a u="834D" b="C7 4A"/>
+ <a u="834E" b="C7 4B"/>
+ <a u="834F" b="DC F3"/>
+ <a u="8350" b="BC F6"/>
+ <a u="8351" b="DC E8"/>
+ <a u="8352" b="BB C4"/>
+ <a u="8353" b="C7 4C"/>
+ <a u="8354" b="C0 F3"/>
+ <a u="8355" b="C7 4D"/>
+ <a u="8356" b="C7 4E"/>
+ <a u="8357" b="C7 4F"/>
+ <a u="8358" b="C7 50"/>
+ <a u="8359" b="C7 51"/>
+ <a u="835A" b="BC D4"/>
+ <a u="835B" b="DC E9"/>
+ <a u="835C" b="DC EA"/>
+ <a u="835D" b="C7 52"/>
+ <a u="835E" b="DC F1"/>
+ <a u="835F" b="DC F6"/>
+ <a u="8360" b="DC F9"/>
+ <a u="8361" b="B5 B4"/>
+ <a u="8362" b="C7 53"/>
+ <a u="8363" b="C8 D9"/>
+ <a u="8364" b="BB E7"/>
+ <a u="8365" b="DC FE"/>
+ <a u="8366" b="DC FD"/>
+ <a u="8367" b="D3 AB"/>
+ <a u="8368" b="DD A1"/>
+ <a u="8369" b="DD A3"/>
+ <a u="836A" b="DD A5"/>
+ <a u="836B" b="D2 F1"/>
+ <a u="836C" b="DD A4"/>
+ <a u="836D" b="DD A6"/>
+ <a u="836E" b="DD A7"/>
+ <a u="836F" b="D2 A9"/>
+ <a u="8370" b="C7 54"/>
+ <a u="8371" b="C7 55"/>
+ <a u="8372" b="C7 56"/>
+ <a u="8373" b="C7 57"/>
+ <a u="8374" b="C7 58"/>
+ <a u="8375" b="C7 59"/>
+ <a u="8376" b="C7 5A"/>
+ <a u="8377" b="BA C9"/>
+ <a u="8378" b="DD A9"/>
+ <a u="8379" b="C7 5B"/>
+ <a u="837A" b="C7 5C"/>
+ <a u="837B" b="DD B6"/>
+ <a u="837C" b="DD B1"/>
+ <a u="837D" b="DD B4"/>
+ <a u="837E" b="C7 5D"/>
+ <a u="837F" b="C7 5E"/>
+ <a u="8380" b="C7 5F"/>
+ <a u="8381" b="C7 60"/>
+ <a u="8382" b="C7 61"/>
+ <a u="8383" b="C7 62"/>
+ <a u="8384" b="C7 63"/>
+ <a u="8385" b="DD B0"/>
+ <a u="8386" b="C6 CE"/>
+ <a u="8387" b="C7 64"/>
+ <a u="8388" b="C7 65"/>
+ <a u="8389" b="C0 F2"/>
+ <a u="838A" b="C7 66"/>
+ <a u="838B" b="C7 67"/>
+ <a u="838C" b="C7 68"/>
+ <a u="838D" b="C7 69"/>
+ <a u="838E" b="C9 AF"/>
+ <a u="838F" b="C7 6A"/>
+ <a u="8390" b="C7 6B"/>
+ <a u="8391" b="C7 6C"/>
+ <a u="8392" b="DC EC"/>
+ <a u="8393" b="DD AE"/>
+ <a u="8394" b="C7 6D"/>
+ <a u="8395" b="C7 6E"/>
+ <a u="8396" b="C7 6F"/>
+ <a u="8397" b="C7 70"/>
+ <a u="8398" b="DD B7"/>
+ <a u="8399" b="C7 71"/>
+ <a u="839A" b="C7 72"/>
+ <a u="839B" b="DC F0"/>
+ <a u="839C" b="DD AF"/>
+ <a u="839D" b="C7 73"/>
+ <a u="839E" b="DD B8"/>
+ <a u="839F" b="C7 74"/>
+ <a u="83A0" b="DD AC"/>
+ <a u="83A1" b="C7 75"/>
+ <a u="83A2" b="C7 76"/>
+ <a u="83A3" b="C7 77"/>
+ <a u="83A4" b="C7 78"/>
+ <a u="83A5" b="C7 79"/>
+ <a u="83A6" b="C7 7A"/>
+ <a u="83A7" b="C7 7B"/>
+ <a u="83A8" b="DD B9"/>
+ <a u="83A9" b="DD B3"/>
+ <a u="83AA" b="DD AD"/>
+ <a u="83AB" b="C4 AA"/>
+ <a u="83AC" b="C7 7C"/>
+ <a u="83AD" b="C7 7D"/>
+ <a u="83AE" b="C7 7E"/>
+ <a u="83AF" b="C7 80"/>
+ <a u="83B0" b="DD A8"/>
+ <a u="83B1" b="C0 B3"/>
+ <a u="83B2" b="C1 AB"/>
+ <a u="83B3" b="DD AA"/>
+ <a u="83B4" b="DD AB"/>
+ <a u="83B5" b="C7 81"/>
+ <a u="83B6" b="DD B2"/>
+ <a u="83B7" b="BB F1"/>
+ <a u="83B8" b="DD B5"/>
+ <a u="83B9" b="D3 A8"/>
+ <a u="83BA" b="DD BA"/>
+ <a u="83BB" b="C7 82"/>
+ <a u="83BC" b="DD BB"/>
+ <a u="83BD" b="C3 A7"/>
+ <a u="83BE" b="C7 83"/>
+ <a u="83BF" b="C7 84"/>
+ <a u="83C0" b="DD D2"/>
+ <a u="83C1" b="DD BC"/>
+ <a u="83C2" b="C7 85"/>
+ <a u="83C3" b="C7 86"/>
+ <a u="83C4" b="C7 87"/>
+ <a u="83C5" b="DD D1"/>
+ <a u="83C6" b="C7 88"/>
+ <a u="83C7" b="B9 BD"/>
+ <a u="83C8" b="C7 89"/>
+ <a u="83C9" b="C7 8A"/>
+ <a u="83CA" b="BE D5"/>
+ <a u="83CB" b="C7 8B"/>
+ <a u="83CC" b="BE FA"/>
+ <a u="83CD" b="C7 8C"/>
+ <a u="83CE" b="C7 8D"/>
+ <a u="83CF" b="BA CA"/>
+ <a u="83D0" b="C7 8E"/>
+ <a u="83D1" b="C7 8F"/>
+ <a u="83D2" b="C7 90"/>
+ <a u="83D3" b="C7 91"/>
+ <a u="83D4" b="DD CA"/>
+ <a u="83D5" b="C7 92"/>
+ <a u="83D6" b="DD C5"/>
+ <a u="83D7" b="C7 93"/>
+ <a u="83D8" b="DD BF"/>
+ <a u="83D9" b="C7 94"/>
+ <a u="83DA" b="C7 95"/>
+ <a u="83DB" b="C7 96"/>
+ <a u="83DC" b="B2 CB"/>
+ <a u="83DD" b="DD C3"/>
+ <a u="83DE" b="C7 97"/>
+ <a u="83DF" b="DD CB"/>
+ <a u="83E0" b="B2 A4"/>
+ <a u="83E1" b="DD D5"/>
+ <a u="83E2" b="C7 98"/>
+ <a u="83E3" b="C7 99"/>
+ <a u="83E4" b="C7 9A"/>
+ <a u="83E5" b="DD BE"/>
+ <a u="83E6" b="C7 9B"/>
+ <a u="83E7" b="C7 9C"/>
+ <a u="83E8" b="C7 9D"/>
+ <a u="83E9" b="C6 D0"/>
+ <a u="83EA" b="DD D0"/>
+ <a u="83EB" b="C7 9E"/>
+ <a u="83EC" b="C7 9F"/>
+ <a u="83ED" b="C7 A0"/>
+ <a u="83EE" b="C8 40"/>
+ <a u="83EF" b="C8 41"/>
+ <a u="83F0" b="DD D4"/>
+ <a u="83F1" b="C1 E2"/>
+ <a u="83F2" b="B7 C6"/>
+ <a u="83F3" b="C8 42"/>
+ <a u="83F4" b="C8 43"/>
+ <a u="83F5" b="C8 44"/>
+ <a u="83F6" b="C8 45"/>
+ <a u="83F7" b="C8 46"/>
+ <a u="83F8" b="DD CE"/>
+ <a u="83F9" b="DD CF"/>
+ <a u="83FA" b="C8 47"/>
+ <a u="83FB" b="C8 48"/>
+ <a u="83FC" b="C8 49"/>
+ <a u="83FD" b="DD C4"/>
+ <a u="83FE" b="C8 4A"/>
+ <a u="83FF" b="C8 4B"/>
+ <a u="8400" b="C8 4C"/>
+ <a u="8401" b="DD BD"/>
+ <a u="8402" b="C8 4D"/>
+ <a u="8403" b="DD CD"/>
+ <a u="8404" b="CC D1"/>
+ <a u="8405" b="C8 4E"/>
+ <a u="8406" b="DD C9"/>
+ <a u="8407" b="C8 4F"/>
+ <a u="8408" b="C8 50"/>
+ <a u="8409" b="C8 51"/>
+ <a u="840A" b="C8 52"/>
+ <a u="840B" b="DD C2"/>
+ <a u="840C" b="C3 C8"/>
+ <a u="840D" b="C6 BC"/>
+ <a u="840E" b="CE AE"/>
+ <a u="840F" b="DD CC"/>
+ <a u="8410" b="C8 53"/>
+ <a u="8411" b="DD C8"/>
+ <a u="8412" b="C8 54"/>
+ <a u="8413" b="C8 55"/>
+ <a u="8414" b="C8 56"/>
+ <a u="8415" b="C8 57"/>
+ <a u="8416" b="C8 58"/>
+ <a u="8417" b="C8 59"/>
+ <a u="8418" b="DD C1"/>
+ <a u="8419" b="C8 5A"/>
+ <a u="841A" b="C8 5B"/>
+ <a u="841B" b="C8 5C"/>
+ <a u="841C" b="DD C6"/>
+ <a u="841D" b="C2 DC"/>
+ <a u="841E" b="C8 5D"/>
+ <a u="841F" b="C8 5E"/>
+ <a u="8420" b="C8 5F"/>
+ <a u="8421" b="C8 60"/>
+ <a u="8422" b="C8 61"/>
+ <a u="8423" b="C8 62"/>
+ <a u="8424" b="D3 A9"/>
+ <a u="8425" b="D3 AA"/>
+ <a u="8426" b="DD D3"/>
+ <a u="8427" b="CF F4"/>
+ <a u="8428" b="C8 F8"/>
+ <a u="8429" b="C8 63"/>
+ <a u="842A" b="C8 64"/>
+ <a u="842B" b="C8 65"/>
+ <a u="842C" b="C8 66"/>
+ <a u="842D" b="C8 67"/>
+ <a u="842E" b="C8 68"/>
+ <a u="842F" b="C8 69"/>
+ <a u="8430" b="C8 6A"/>
+ <a u="8431" b="DD E6"/>
+ <a u="8432" b="C8 6B"/>
+ <a u="8433" b="C8 6C"/>
+ <a u="8434" b="C8 6D"/>
+ <a u="8435" b="C8 6E"/>
+ <a u="8436" b="C8 6F"/>
+ <a u="8437" b="C8 70"/>
+ <a u="8438" b="DD C7"/>
+ <a u="8439" b="C8 71"/>
+ <a u="843A" b="C8 72"/>
+ <a u="843B" b="C8 73"/>
+ <a u="843C" b="DD E0"/>
+ <a u="843D" b="C2 E4"/>
+ <a u="843E" b="C8 74"/>
+ <a u="843F" b="C8 75"/>
+ <a u="8440" b="C8 76"/>
+ <a u="8441" b="C8 77"/>
+ <a u="8442" b="C8 78"/>
+ <a u="8443" b="C8 79"/>
+ <a u="8444" b="C8 7A"/>
+ <a u="8445" b="C8 7B"/>
+ <a u="8446" b="DD E1"/>
+ <a u="8447" b="C8 7C"/>
+ <a u="8448" b="C8 7D"/>
+ <a u="8449" b="C8 7E"/>
+ <a u="844A" b="C8 80"/>
+ <a u="844B" b="C8 81"/>
+ <a u="844C" b="C8 82"/>
+ <a u="844D" b="C8 83"/>
+ <a u="844E" b="C8 84"/>
+ <a u="844F" b="C8 85"/>
+ <a u="8450" b="C8 86"/>
+ <a u="8451" b="DD D7"/>
+ <a u="8452" b="C8 87"/>
+ <a u="8453" b="C8 88"/>
+ <a u="8454" b="C8 89"/>
+ <a u="8455" b="C8 8A"/>
+ <a u="8456" b="C8 8B"/>
+ <a u="8457" b="D6 F8"/>
+ <a u="8458" b="C8 8C"/>
+ <a u="8459" b="DD D9"/>
+ <a u="845A" b="DD D8"/>
+ <a u="845B" b="B8 F0"/>
+ <a u="845C" b="DD D6"/>
+ <a u="845D" b="C8 8D"/>
+ <a u="845E" b="C8 8E"/>
+ <a u="845F" b="C8 8F"/>
+ <a u="8460" b="C8 90"/>
+ <a u="8461" b="C6 CF"/>
+ <a u="8462" b="C8 91"/>
+ <a u="8463" b="B6 AD"/>
+ <a u="8464" b="C8 92"/>
+ <a u="8465" b="C8 93"/>
+ <a u="8466" b="C8 94"/>
+ <a u="8467" b="C8 95"/>
+ <a u="8468" b="C8 96"/>
+ <a u="8469" b="DD E2"/>
+ <a u="846A" b="C8 97"/>
+ <a u="846B" b="BA F9"/>
+ <a u="846C" b="D4 E1"/>
+ <a u="846D" b="DD E7"/>
+ <a u="846E" b="C8 98"/>
+ <a u="846F" b="C8 99"/>
+ <a u="8470" b="C8 9A"/>
+ <a u="8471" b="B4 D0"/>
+ <a u="8472" b="C8 9B"/>
+ <a u="8473" b="DD DA"/>
+ <a u="8474" b="C8 9C"/>
+ <a u="8475" b="BF FB"/>
+ <a u="8476" b="DD E3"/>
+ <a u="8477" b="C8 9D"/>
+ <a u="8478" b="DD DF"/>
+ <a u="8479" b="C8 9E"/>
+ <a u="847A" b="DD DD"/>
+ <a u="847B" b="C8 9F"/>
+ <a u="847C" b="C8 A0"/>
+ <a u="847D" b="C9 40"/>
+ <a u="847E" b="C9 41"/>
+ <a u="847F" b="C9 42"/>
+ <a u="8480" b="C9 43"/>
+ <a u="8481" b="C9 44"/>
+ <a u="8482" b="B5 D9"/>
+ <a u="8483" b="C9 45"/>
+ <a u="8484" b="C9 46"/>
+ <a u="8485" b="C9 47"/>
+ <a u="8486" b="C9 48"/>
+ <a u="8487" b="DD DB"/>
+ <a u="8488" b="DD DC"/>
+ <a u="8489" b="DD DE"/>
+ <a u="848A" b="C9 49"/>
+ <a u="848B" b="BD AF"/>
+ <a u="848C" b="DD E4"/>
+ <a u="848D" b="C9 4A"/>
+ <a u="848E" b="DD E5"/>
+ <a u="848F" b="C9 4B"/>
+ <a u="8490" b="C9 4C"/>
+ <a u="8491" b="C9 4D"/>
+ <a u="8492" b="C9 4E"/>
+ <a u="8493" b="C9 4F"/>
+ <a u="8494" b="C9 50"/>
+ <a u="8495" b="C9 51"/>
+ <a u="8496" b="C9 52"/>
+ <a u="8497" b="DD F5"/>
+ <a u="8498" b="C9 53"/>
+ <a u="8499" b="C3 C9"/>
+ <a u="849A" b="C9 54"/>
+ <a u="849B" b="C9 55"/>
+ <a u="849C" b="CB E2"/>
+ <a u="849D" b="C9 56"/>
+ <a u="849E" b="C9 57"/>
+ <a u="849F" b="C9 58"/>
+ <a u="84A0" b="C9 59"/>
+ <a u="84A1" b="DD F2"/>
+ <a u="84A2" b="C9 5A"/>
+ <a u="84A3" b="C9 5B"/>
+ <a u="84A4" b="C9 5C"/>
+ <a u="84A5" b="C9 5D"/>
+ <a u="84A6" b="C9 5E"/>
+ <a u="84A7" b="C9 5F"/>
+ <a u="84A8" b="C9 60"/>
+ <a u="84A9" b="C9 61"/>
+ <a u="84AA" b="C9 62"/>
+ <a u="84AB" b="C9 63"/>
+ <a u="84AC" b="C9 64"/>
+ <a u="84AD" b="C9 65"/>
+ <a u="84AE" b="C9 66"/>
+ <a u="84AF" b="D8 E1"/>
+ <a u="84B0" b="C9 67"/>
+ <a u="84B1" b="C9 68"/>
+ <a u="84B2" b="C6 D1"/>
+ <a u="84B3" b="C9 69"/>
+ <a u="84B4" b="DD F4"/>
+ <a u="84B5" b="C9 6A"/>
+ <a u="84B6" b="C9 6B"/>
+ <a u="84B7" b="C9 6C"/>
+ <a u="84B8" b="D5 F4"/>
+ <a u="84B9" b="DD F3"/>
+ <a u="84BA" b="DD F0"/>
+ <a u="84BB" b="C9 6D"/>
+ <a u="84BC" b="C9 6E"/>
+ <a u="84BD" b="DD EC"/>
+ <a u="84BE" b="C9 6F"/>
+ <a u="84BF" b="DD EF"/>
+ <a u="84C0" b="C9 70"/>
+ <a u="84C1" b="DD E8"/>
+ <a u="84C2" b="C9 71"/>
+ <a u="84C3" b="C9 72"/>
+ <a u="84C4" b="D0 EE"/>
+ <a u="84C5" b="C9 73"/>
+ <a u="84C6" b="C9 74"/>
+ <a u="84C7" b="C9 75"/>
+ <a u="84C8" b="C9 76"/>
+ <a u="84C9" b="C8 D8"/>
+ <a u="84CA" b="DD EE"/>
+ <a u="84CB" b="C9 77"/>
+ <a u="84CC" b="C9 78"/>
+ <a u="84CD" b="DD E9"/>
+ <a u="84CE" b="C9 79"/>
+ <a u="84CF" b="C9 7A"/>
+ <a u="84D0" b="DD EA"/>
+ <a u="84D1" b="CB F2"/>
+ <a u="84D2" b="C9 7B"/>
+ <a u="84D3" b="DD ED"/>
+ <a u="84D4" b="C9 7C"/>
+ <a u="84D5" b="C9 7D"/>
+ <a u="84D6" b="B1 CD"/>
+ <a u="84D7" b="C9 7E"/>
+ <a u="84D8" b="C9 80"/>
+ <a u="84D9" b="C9 81"/>
+ <a u="84DA" b="C9 82"/>
+ <a u="84DB" b="C9 83"/>
+ <a u="84DC" b="C9 84"/>
+ <a u="84DD" b="C0 B6"/>
+ <a u="84DE" b="C9 85"/>
+ <a u="84DF" b="BC BB"/>
+ <a u="84E0" b="DD F1"/>
+ <a u="84E1" b="C9 86"/>
+ <a u="84E2" b="C9 87"/>
+ <a u="84E3" b="DD F7"/>
+ <a u="84E4" b="C9 88"/>
+ <a u="84E5" b="DD F6"/>
+ <a u="84E6" b="DD EB"/>
+ <a u="84E7" b="C9 89"/>
+ <a u="84E8" b="C9 8A"/>
+ <a u="84E9" b="C9 8B"/>
+ <a u="84EA" b="C9 8C"/>
+ <a u="84EB" b="C9 8D"/>
+ <a u="84EC" b="C5 EE"/>
+ <a u="84ED" b="C9 8E"/>
+ <a u="84EE" b="C9 8F"/>
+ <a u="84EF" b="C9 90"/>
+ <a u="84F0" b="DD FB"/>
+ <a u="84F1" b="C9 91"/>
+ <a u="84F2" b="C9 92"/>
+ <a u="84F3" b="C9 93"/>
+ <a u="84F4" b="C9 94"/>
+ <a u="84F5" b="C9 95"/>
+ <a u="84F6" b="C9 96"/>
+ <a u="84F7" b="C9 97"/>
+ <a u="84F8" b="C9 98"/>
+ <a u="84F9" b="C9 99"/>
+ <a u="84FA" b="C9 9A"/>
+ <a u="84FB" b="C9 9B"/>
+ <a u="84FC" b="DE A4"/>
+ <a u="84FD" b="C9 9C"/>
+ <a u="84FE" b="C9 9D"/>
+ <a u="84FF" b="DE A3"/>
+ <a u="8500" b="C9 9E"/>
+ <a u="8501" b="C9 9F"/>
+ <a u="8502" b="C9 A0"/>
+ <a u="8503" b="CA 40"/>
+ <a u="8504" b="CA 41"/>
+ <a u="8505" b="CA 42"/>
+ <a u="8506" b="CA 43"/>
+ <a u="8507" b="CA 44"/>
+ <a u="8508" b="CA 45"/>
+ <a u="8509" b="CA 46"/>
+ <a u="850A" b="CA 47"/>
+ <a u="850B" b="CA 48"/>
+ <a u="850C" b="DD F8"/>
+ <a u="850D" b="CA 49"/>
+ <a u="850E" b="CA 4A"/>
+ <a u="850F" b="CA 4B"/>
+ <a u="8510" b="CA 4C"/>
+ <a u="8511" b="C3 EF"/>
+ <a u="8512" b="CA 4D"/>
+ <a u="8513" b="C2 FB"/>
+ <a u="8514" b="CA 4E"/>
+ <a u="8515" b="CA 4F"/>
+ <a u="8516" b="CA 50"/>
+ <a u="8517" b="D5 E1"/>
+ <a u="8518" b="CA 51"/>
+ <a u="8519" b="CA 52"/>
+ <a u="851A" b="CE B5"/>
+ <a u="851B" b="CA 53"/>
+ <a u="851C" b="CA 54"/>
+ <a u="851D" b="CA 55"/>
+ <a u="851E" b="CA 56"/>
+ <a u="851F" b="DD FD"/>
+ <a u="8520" b="CA 57"/>
+ <a u="8521" b="B2 CC"/>
+ <a u="8522" b="CA 58"/>
+ <a u="8523" b="CA 59"/>
+ <a u="8524" b="CA 5A"/>
+ <a u="8525" b="CA 5B"/>
+ <a u="8526" b="CA 5C"/>
+ <a u="8527" b="CA 5D"/>
+ <a u="8528" b="CA 5E"/>
+ <a u="8529" b="CA 5F"/>
+ <a u="852A" b="CA 60"/>
+ <a u="852B" b="C4 E8"/>
+ <a u="852C" b="CA DF"/>
+ <a u="852D" b="CA 61"/>
+ <a u="852E" b="CA 62"/>
+ <a u="852F" b="CA 63"/>
+ <a u="8530" b="CA 64"/>
+ <a u="8531" b="CA 65"/>
+ <a u="8532" b="CA 66"/>
+ <a u="8533" b="CA 67"/>
+ <a u="8534" b="CA 68"/>
+ <a u="8535" b="CA 69"/>
+ <a u="8536" b="CA 6A"/>
+ <a u="8537" b="C7 BE"/>
+ <a u="8538" b="DD FA"/>
+ <a u="8539" b="DD FC"/>
+ <a u="853A" b="DD FE"/>
+ <a u="853B" b="DE A2"/>
+ <a u="853C" b="B0 AA"/>
+ <a u="853D" b="B1 CE"/>
+ <a u="853E" b="CA 6B"/>
+ <a u="853F" b="CA 6C"/>
+ <a u="8540" b="CA 6D"/>
+ <a u="8541" b="CA 6E"/>
+ <a u="8542" b="CA 6F"/>
+ <a u="8543" b="DE AC"/>
+ <a u="8544" b="CA 70"/>
+ <a u="8545" b="CA 71"/>
+ <a u="8546" b="CA 72"/>
+ <a u="8547" b="CA 73"/>
+ <a u="8548" b="DE A6"/>
+ <a u="8549" b="BD B6"/>
+ <a u="854A" b="C8 EF"/>
+ <a u="854B" b="CA 74"/>
+ <a u="854C" b="CA 75"/>
+ <a u="854D" b="CA 76"/>
+ <a u="854E" b="CA 77"/>
+ <a u="854F" b="CA 78"/>
+ <a u="8550" b="CA 79"/>
+ <a u="8551" b="CA 7A"/>
+ <a u="8552" b="CA 7B"/>
+ <a u="8553" b="CA 7C"/>
+ <a u="8554" b="CA 7D"/>
+ <a u="8555" b="CA 7E"/>
+ <a u="8556" b="DE A1"/>
+ <a u="8557" b="CA 80"/>
+ <a u="8558" b="CA 81"/>
+ <a u="8559" b="DE A5"/>
+ <a u="855A" b="CA 82"/>
+ <a u="855B" b="CA 83"/>
+ <a u="855C" b="CA 84"/>
+ <a u="855D" b="CA 85"/>
+ <a u="855E" b="DE A9"/>
+ <a u="855F" b="CA 86"/>
+ <a u="8560" b="CA 87"/>
+ <a u="8561" b="CA 88"/>
+ <a u="8562" b="CA 89"/>
+ <a u="8563" b="CA 8A"/>
+ <a u="8564" b="DE A8"/>
+ <a u="8565" b="CA 8B"/>
+ <a u="8566" b="CA 8C"/>
+ <a u="8567" b="CA 8D"/>
+ <a u="8568" b="DE A7"/>
+ <a u="8569" b="CA 8E"/>
+ <a u="856A" b="CA 8F"/>
+ <a u="856B" b="CA 90"/>
+ <a u="856C" b="CA 91"/>
+ <a u="856D" b="CA 92"/>
+ <a u="856E" b="CA 93"/>
+ <a u="856F" b="CA 94"/>
+ <a u="8570" b="CA 95"/>
+ <a u="8571" b="CA 96"/>
+ <a u="8572" b="DE AD"/>
+ <a u="8573" b="CA 97"/>
+ <a u="8574" b="D4 CC"/>
+ <a u="8575" b="CA 98"/>
+ <a u="8576" b="CA 99"/>
+ <a u="8577" b="CA 9A"/>
+ <a u="8578" b="CA 9B"/>
+ <a u="8579" b="DE B3"/>
+ <a u="857A" b="DE AA"/>
+ <a u="857B" b="DE AE"/>
+ <a u="857C" b="CA 9C"/>
+ <a u="857D" b="CA 9D"/>
+ <a u="857E" b="C0 D9"/>
+ <a u="857F" b="CA 9E"/>
+ <a u="8580" b="CA 9F"/>
+ <a u="8581" b="CA A0"/>
+ <a u="8582" b="CB 40"/>
+ <a u="8583" b="CB 41"/>
+ <a u="8584" b="B1 A1"/>
+ <a u="8585" b="DE B6"/>
+ <a u="8586" b="CB 42"/>
+ <a u="8587" b="DE B1"/>
+ <a u="8588" b="CB 43"/>
+ <a u="8589" b="CB 44"/>
+ <a u="858A" b="CB 45"/>
+ <a u="858B" b="CB 46"/>
+ <a u="858C" b="CB 47"/>
+ <a u="858D" b="CB 48"/>
+ <a u="858E" b="CB 49"/>
+ <a u="858F" b="DE B2"/>
+ <a u="8590" b="CB 4A"/>
+ <a u="8591" b="CB 4B"/>
+ <a u="8592" b="CB 4C"/>
+ <a u="8593" b="CB 4D"/>
+ <a u="8594" b="CB 4E"/>
+ <a u="8595" b="CB 4F"/>
+ <a u="8596" b="CB 50"/>
+ <a u="8597" b="CB 51"/>
+ <a u="8598" b="CB 52"/>
+ <a u="8599" b="CB 53"/>
+ <a u="859A" b="CB 54"/>
+ <a u="859B" b="D1 A6"/>
+ <a u="859C" b="DE B5"/>
+ <a u="859D" b="CB 55"/>
+ <a u="859E" b="CB 56"/>
+ <a u="859F" b="CB 57"/>
+ <a u="85A0" b="CB 58"/>
+ <a u="85A1" b="CB 59"/>
+ <a u="85A2" b="CB 5A"/>
+ <a u="85A3" b="CB 5B"/>
+ <a u="85A4" b="DE AF"/>
+ <a u="85A5" b="CB 5C"/>
+ <a u="85A6" b="CB 5D"/>
+ <a u="85A7" b="CB 5E"/>
+ <a u="85A8" b="DE B0"/>
+ <a u="85A9" b="CB 5F"/>
+ <a u="85AA" b="D0 BD"/>
+ <a u="85AB" b="CB 60"/>
+ <a u="85AC" b="CB 61"/>
+ <a u="85AD" b="CB 62"/>
+ <a u="85AE" b="DE B4"/>
+ <a u="85AF" b="CA ED"/>
+ <a u="85B0" b="DE B9"/>
+ <a u="85B1" b="CB 63"/>
+ <a u="85B2" b="CB 64"/>
+ <a u="85B3" b="CB 65"/>
+ <a u="85B4" b="CB 66"/>
+ <a u="85B5" b="CB 67"/>
+ <a u="85B6" b="CB 68"/>
+ <a u="85B7" b="DE B8"/>
+ <a u="85B8" b="CB 69"/>
+ <a u="85B9" b="DE B7"/>
+ <a u="85BA" b="CB 6A"/>
+ <a u="85BB" b="CB 6B"/>
+ <a u="85BC" b="CB 6C"/>
+ <a u="85BD" b="CB 6D"/>
+ <a u="85BE" b="CB 6E"/>
+ <a u="85BF" b="CB 6F"/>
+ <a u="85C0" b="CB 70"/>
+ <a u="85C1" b="DE BB"/>
+ <a u="85C2" b="CB 71"/>
+ <a u="85C3" b="CB 72"/>
+ <a u="85C4" b="CB 73"/>
+ <a u="85C5" b="CB 74"/>
+ <a u="85C6" b="CB 75"/>
+ <a u="85C7" b="CB 76"/>
+ <a u="85C8" b="CB 77"/>
+ <a u="85C9" b="BD E5"/>
+ <a u="85CA" b="CB 78"/>
+ <a u="85CB" b="CB 79"/>
+ <a u="85CC" b="CB 7A"/>
+ <a u="85CD" b="CB 7B"/>
+ <a u="85CE" b="CB 7C"/>
+ <a u="85CF" b="B2 D8"/>
+ <a u="85D0" b="C3 EA"/>
+ <a u="85D1" b="CB 7D"/>
+ <a u="85D2" b="CB 7E"/>
+ <a u="85D3" b="DE BA"/>
+ <a u="85D4" b="CB 80"/>
+ <a u="85D5" b="C5 BA"/>
+ <a u="85D6" b="CB 81"/>
+ <a u="85D7" b="CB 82"/>
+ <a u="85D8" b="CB 83"/>
+ <a u="85D9" b="CB 84"/>
+ <a u="85DA" b="CB 85"/>
+ <a u="85DB" b="CB 86"/>
+ <a u="85DC" b="DE BC"/>
+ <a u="85DD" b="CB 87"/>
+ <a u="85DE" b="CB 88"/>
+ <a u="85DF" b="CB 89"/>
+ <a u="85E0" b="CB 8A"/>
+ <a u="85E1" b="CB 8B"/>
+ <a u="85E2" b="CB 8C"/>
+ <a u="85E3" b="CB 8D"/>
+ <a u="85E4" b="CC D9"/>
+ <a u="85E5" b="CB 8E"/>
+ <a u="85E6" b="CB 8F"/>
+ <a u="85E7" b="CB 90"/>
+ <a u="85E8" b="CB 91"/>
+ <a u="85E9" b="B7 AA"/>
+ <a u="85EA" b="CB 92"/>
+ <a u="85EB" b="CB 93"/>
+ <a u="85EC" b="CB 94"/>
+ <a u="85ED" b="CB 95"/>
+ <a u="85EE" b="CB 96"/>
+ <a u="85EF" b="CB 97"/>
+ <a u="85F0" b="CB 98"/>
+ <a u="85F1" b="CB 99"/>
+ <a u="85F2" b="CB 9A"/>
+ <a u="85F3" b="CB 9B"/>
+ <a u="85F4" b="CB 9C"/>
+ <a u="85F5" b="CB 9D"/>
+ <a u="85F6" b="CB 9E"/>
+ <a u="85F7" b="CB 9F"/>
+ <a u="85F8" b="CB A0"/>
+ <a u="85F9" b="CC 40"/>
+ <a u="85FA" b="CC 41"/>
+ <a u="85FB" b="D4 E5"/>
+ <a u="85FC" b="CC 42"/>
+ <a u="85FD" b="CC 43"/>
+ <a u="85FE" b="CC 44"/>
+ <a u="85FF" b="DE BD"/>
+ <a u="8600" b="CC 45"/>
+ <a u="8601" b="CC 46"/>
+ <a u="8602" b="CC 47"/>
+ <a u="8603" b="CC 48"/>
+ <a u="8604" b="CC 49"/>
+ <a u="8605" b="DE BF"/>
+ <a u="8606" b="CC 4A"/>
+ <a u="8607" b="CC 4B"/>
+ <a u="8608" b="CC 4C"/>
+ <a u="8609" b="CC 4D"/>
+ <a u="860A" b="CC 4E"/>
+ <a u="860B" b="CC 4F"/>
+ <a u="860C" b="CC 50"/>
+ <a u="860D" b="CC 51"/>
+ <a u="860E" b="CC 52"/>
+ <a u="860F" b="CC 53"/>
+ <a u="8610" b="CC 54"/>
+ <a u="8611" b="C4 A2"/>
+ <a u="8612" b="CC 55"/>
+ <a u="8613" b="CC 56"/>
+ <a u="8614" b="CC 57"/>
+ <a u="8615" b="CC 58"/>
+ <a u="8616" b="DE C1"/>
+ <a u="8617" b="CC 59"/>
+ <a u="8618" b="CC 5A"/>
+ <a u="8619" b="CC 5B"/>
+ <a u="861A" b="CC 5C"/>
+ <a u="861B" b="CC 5D"/>
+ <a u="861C" b="CC 5E"/>
+ <a u="861D" b="CC 5F"/>
+ <a u="861E" b="CC 60"/>
+ <a u="861F" b="CC 61"/>
+ <a u="8620" b="CC 62"/>
+ <a u="8621" b="CC 63"/>
+ <a u="8622" b="CC 64"/>
+ <a u="8623" b="CC 65"/>
+ <a u="8624" b="CC 66"/>
+ <a u="8625" b="CC 67"/>
+ <a u="8626" b="CC 68"/>
+ <a u="8627" b="DE BE"/>
+ <a u="8628" b="CC 69"/>
+ <a u="8629" b="DE C0"/>
+ <a u="862A" b="CC 6A"/>
+ <a u="862B" b="CC 6B"/>
+ <a u="862C" b="CC 6C"/>
+ <a u="862D" b="CC 6D"/>
+ <a u="862E" b="CC 6E"/>
+ <a u="862F" b="CC 6F"/>
+ <a u="8630" b="CC 70"/>
+ <a u="8631" b="CC 71"/>
+ <a u="8632" b="CC 72"/>
+ <a u="8633" b="CC 73"/>
+ <a u="8634" b="CC 74"/>
+ <a u="8635" b="CC 75"/>
+ <a u="8636" b="CC 76"/>
+ <a u="8637" b="CC 77"/>
+ <a u="8638" b="D5 BA"/>
+ <a u="8639" b="CC 78"/>
+ <a u="863A" b="CC 79"/>
+ <a u="863B" b="CC 7A"/>
+ <a u="863C" b="DE C2"/>
+ <a u="863D" b="CC 7B"/>
+ <a u="863E" b="CC 7C"/>
+ <a u="863F" b="CC 7D"/>
+ <a u="8640" b="CC 7E"/>
+ <a u="8641" b="CC 80"/>
+ <a u="8642" b="CC 81"/>
+ <a u="8643" b="CC 82"/>
+ <a u="8644" b="CC 83"/>
+ <a u="8645" b="CC 84"/>
+ <a u="8646" b="CC 85"/>
+ <a u="8647" b="CC 86"/>
+ <a u="8648" b="CC 87"/>
+ <a u="8649" b="CC 88"/>
+ <a u="864A" b="CC 89"/>
+ <a u="864B" b="CC 8A"/>
+ <a u="864C" b="CC 8B"/>
+ <a u="864D" b="F2 AE"/>
+ <a u="864E" b="BB A2"/>
+ <a u="864F" b="C2 B2"/>
+ <a u="8650" b="C5 B0"/>
+ <a u="8651" b="C2 C7"/>
+ <a u="8652" b="CC 8C"/>
+ <a u="8653" b="CC 8D"/>
+ <a u="8654" b="F2 AF"/>
+ <a u="8655" b="CC 8E"/>
+ <a u="8656" b="CC 8F"/>
+ <a u="8657" b="CC 90"/>
+ <a u="8658" b="CC 91"/>
+ <a u="8659" b="CC 92"/>
+ <a u="865A" b="D0 E9"/>
+ <a u="865B" b="CC 93"/>
+ <a u="865C" b="CC 94"/>
+ <a u="865D" b="CC 95"/>
+ <a u="865E" b="D3 DD"/>
+ <a u="865F" b="CC 96"/>
+ <a u="8660" b="CC 97"/>
+ <a u="8661" b="CC 98"/>
+ <a u="8662" b="EB BD"/>
+ <a u="8663" b="CC 99"/>
+ <a u="8664" b="CC 9A"/>
+ <a u="8665" b="CC 9B"/>
+ <a u="8666" b="CC 9C"/>
+ <a u="8667" b="CC 9D"/>
+ <a u="8668" b="CC 9E"/>
+ <a u="8669" b="CC 9F"/>
+ <a u="866A" b="CC A0"/>
+ <a u="866B" b="B3 E6"/>
+ <a u="866C" b="F2 B0"/>
+ <a u="866D" b="CD 40"/>
+ <a u="866E" b="F2 B1"/>
+ <a u="866F" b="CD 41"/>
+ <a u="8670" b="CD 42"/>
+ <a u="8671" b="CA AD"/>
+ <a u="8672" b="CD 43"/>
+ <a u="8673" b="CD 44"/>
+ <a u="8674" b="CD 45"/>
+ <a u="8675" b="CD 46"/>
+ <a u="8676" b="CD 47"/>
+ <a u="8677" b="CD 48"/>
+ <a u="8678" b="CD 49"/>
+ <a u="8679" b="BA E7"/>
+ <a u="867A" b="F2 B3"/>
+ <a u="867B" b="F2 B5"/>
+ <a u="867C" b="F2 B4"/>
+ <a u="867D" b="CB E4"/>
+ <a u="867E" b="CF BA"/>
+ <a u="867F" b="F2 B2"/>
+ <a u="8680" b="CA B4"/>
+ <a u="8681" b="D2 CF"/>
+ <a u="8682" b="C2 EC"/>
+ <a u="8683" b="CD 4A"/>
+ <a u="8684" b="CD 4B"/>
+ <a u="8685" b="CD 4C"/>
+ <a u="8686" b="CD 4D"/>
+ <a u="8687" b="CD 4E"/>
+ <a u="8688" b="CD 4F"/>
+ <a u="8689" b="CD 50"/>
+ <a u="868A" b="CE C3"/>
+ <a u="868B" b="F2 B8"/>
+ <a u="868C" b="B0 F6"/>
+ <a u="868D" b="F2 B7"/>
+ <a u="868E" b="CD 51"/>
+ <a u="868F" b="CD 52"/>
+ <a u="8690" b="CD 53"/>
+ <a u="8691" b="CD 54"/>
+ <a u="8692" b="CD 55"/>
+ <a u="8693" b="F2 BE"/>
+ <a u="8694" b="CD 56"/>
+ <a u="8695" b="B2 CF"/>
+ <a u="8696" b="CD 57"/>
+ <a u="8697" b="CD 58"/>
+ <a u="8698" b="CD 59"/>
+ <a u="8699" b="CD 5A"/>
+ <a u="869A" b="CD 5B"/>
+ <a u="869B" b="CD 5C"/>
+ <a u="869C" b="D1 C1"/>
+ <a u="869D" b="F2 BA"/>
+ <a u="869E" b="CD 5D"/>
+ <a u="869F" b="CD 5E"/>
+ <a u="86A0" b="CD 5F"/>
+ <a u="86A1" b="CD 60"/>
+ <a u="86A2" b="CD 61"/>
+ <a u="86A3" b="F2 BC"/>
+ <a u="86A4" b="D4 E9"/>
+ <a u="86A5" b="CD 62"/>
+ <a u="86A6" b="CD 63"/>
+ <a u="86A7" b="F2 BB"/>
+ <a u="86A8" b="F2 B6"/>
+ <a u="86A9" b="F2 BF"/>
+ <a u="86AA" b="F2 BD"/>
+ <a u="86AB" b="CD 64"/>
+ <a u="86AC" b="F2 B9"/>
+ <a u="86AD" b="CD 65"/>
+ <a u="86AE" b="CD 66"/>
+ <a u="86AF" b="F2 C7"/>
+ <a u="86B0" b="F2 C4"/>
+ <a u="86B1" b="F2 C6"/>
+ <a u="86B2" b="CD 67"/>
+ <a u="86B3" b="CD 68"/>
+ <a u="86B4" b="F2 CA"/>
+ <a u="86B5" b="F2 C2"/>
+ <a u="86B6" b="F2 C0"/>
+ <a u="86B7" b="CD 69"/>
+ <a u="86B8" b="CD 6A"/>
+ <a u="86B9" b="CD 6B"/>
+ <a u="86BA" b="F2 C5"/>
+ <a u="86BB" b="CD 6C"/>
+ <a u="86BC" b="CD 6D"/>
+ <a u="86BD" b="CD 6E"/>
+ <a u="86BE" b="CD 6F"/>
+ <a u="86BF" b="CD 70"/>
+ <a u="86C0" b="D6 FB"/>
+ <a u="86C1" b="CD 71"/>
+ <a u="86C2" b="CD 72"/>
+ <a u="86C3" b="CD 73"/>
+ <a u="86C4" b="F2 C1"/>
+ <a u="86C5" b="CD 74"/>
+ <a u="86C6" b="C7 F9"/>
+ <a u="86C7" b="C9 DF"/>
+ <a u="86C8" b="CD 75"/>
+ <a u="86C9" b="F2 C8"/>
+ <a u="86CA" b="B9 C6"/>
+ <a u="86CB" b="B5 B0"/>
+ <a u="86CC" b="CD 76"/>
+ <a u="86CD" b="CD 77"/>
+ <a u="86CE" b="F2 C3"/>
+ <a u="86CF" b="F2 C9"/>
+ <a u="86D0" b="F2 D0"/>
+ <a u="86D1" b="F2 D6"/>
+ <a u="86D2" b="CD 78"/>
+ <a u="86D3" b="CD 79"/>
+ <a u="86D4" b="BB D7"/>
+ <a u="86D5" b="CD 7A"/>
+ <a u="86D6" b="CD 7B"/>
+ <a u="86D7" b="CD 7C"/>
+ <a u="86D8" b="F2 D5"/>
+ <a u="86D9" b="CD DC"/>
+ <a u="86DA" b="CD 7D"/>
+ <a u="86DB" b="D6 EB"/>
+ <a u="86DC" b="CD 7E"/>
+ <a u="86DD" b="CD 80"/>
+ <a u="86DE" b="F2 D2"/>
+ <a u="86DF" b="F2 D4"/>
+ <a u="86E0" b="CD 81"/>
+ <a u="86E1" b="CD 82"/>
+ <a u="86E2" b="CD 83"/>
+ <a u="86E3" b="CD 84"/>
+ <a u="86E4" b="B8 F2"/>
+ <a u="86E5" b="CD 85"/>
+ <a u="86E6" b="CD 86"/>
+ <a u="86E7" b="CD 87"/>
+ <a u="86E8" b="CD 88"/>
+ <a u="86E9" b="F2 CB"/>
+ <a u="86EA" b="CD 89"/>
+ <a u="86EB" b="CD 8A"/>
+ <a u="86EC" b="CD 8B"/>
+ <a u="86ED" b="F2 CE"/>
+ <a u="86EE" b="C2 F9"/>
+ <a u="86EF" b="CD 8C"/>
+ <a u="86F0" b="D5 DD"/>
+ <a u="86F1" b="F2 CC"/>
+ <a u="86F2" b="F2 CD"/>
+ <a u="86F3" b="F2 CF"/>
+ <a u="86F4" b="F2 D3"/>
+ <a u="86F5" b="CD 8D"/>
+ <a u="86F6" b="CD 8E"/>
+ <a u="86F7" b="CD 8F"/>
+ <a u="86F8" b="F2 D9"/>
+ <a u="86F9" b="D3 BC"/>
+ <a u="86FA" b="CD 90"/>
+ <a u="86FB" b="CD 91"/>
+ <a u="86FC" b="CD 92"/>
+ <a u="86FD" b="CD 93"/>
+ <a u="86FE" b="B6 EA"/>
+ <a u="86FF" b="CD 94"/>
+ <a u="8700" b="CA F1"/>
+ <a u="8701" b="CD 95"/>
+ <a u="8702" b="B7 E4"/>
+ <a u="8703" b="F2 D7"/>
+ <a u="8704" b="CD 96"/>
+ <a u="8705" b="CD 97"/>
+ <a u="8706" b="CD 98"/>
+ <a u="8707" b="F2 D8"/>
+ <a u="8708" b="F2 DA"/>
+ <a u="8709" b="F2 DD"/>
+ <a u="870A" b="F2 DB"/>
+ <a u="870B" b="CD 99"/>
+ <a u="870C" b="CD 9A"/>
+ <a u="870D" b="F2 DC"/>
+ <a u="870E" b="CD 9B"/>
+ <a u="870F" b="CD 9C"/>
+ <a u="8710" b="CD 9D"/>
+ <a u="8711" b="CD 9E"/>
+ <a u="8712" b="D1 D1"/>
+ <a u="8713" b="F2 D1"/>
+ <a u="8714" b="CD 9F"/>
+ <a u="8715" b="CD C9"/>
+ <a u="8716" b="CD A0"/>
+ <a u="8717" b="CE CF"/>
+ <a u="8718" b="D6 A9"/>
+ <a u="8719" b="CE 40"/>
+ <a u="871A" b="F2 E3"/>
+ <a u="871B" b="CE 41"/>
+ <a u="871C" b="C3 DB"/>
+ <a u="871D" b="CE 42"/>
+ <a u="871E" b="F2 E0"/>
+ <a u="871F" b="CE 43"/>
+ <a u="8720" b="CE 44"/>
+ <a u="8721" b="C0 AF"/>
+ <a u="8722" b="F2 EC"/>
+ <a u="8723" b="F2 DE"/>
+ <a u="8724" b="CE 45"/>
+ <a u="8725" b="F2 E1"/>
+ <a u="8726" b="CE 46"/>
+ <a u="8727" b="CE 47"/>
+ <a u="8728" b="CE 48"/>
+ <a u="8729" b="F2 E8"/>
+ <a u="872A" b="CE 49"/>
+ <a u="872B" b="CE 4A"/>
+ <a u="872C" b="CE 4B"/>
+ <a u="872D" b="CE 4C"/>
+ <a u="872E" b="F2 E2"/>
+ <a u="872F" b="CE 4D"/>
+ <a u="8730" b="CE 4E"/>
+ <a u="8731" b="F2 E7"/>
+ <a u="8732" b="CE 4F"/>
+ <a u="8733" b="CE 50"/>
+ <a u="8734" b="F2 E6"/>
+ <a u="8735" b="CE 51"/>
+ <a u="8736" b="CE 52"/>
+ <a u="8737" b="F2 E9"/>
+ <a u="8738" b="CE 53"/>
+ <a u="8739" b="CE 54"/>
+ <a u="873A" b="CE 55"/>
+ <a u="873B" b="F2 DF"/>
+ <a u="873C" b="CE 56"/>
+ <a u="873D" b="CE 57"/>
+ <a u="873E" b="F2 E4"/>
+ <a u="873F" b="F2 EA"/>
+ <a u="8740" b="CE 58"/>
+ <a u="8741" b="CE 59"/>
+ <a u="8742" b="CE 5A"/>
+ <a u="8743" b="CE 5B"/>
+ <a u="8744" b="CE 5C"/>
+ <a u="8745" b="CE 5D"/>
+ <a u="8746" b="CE 5E"/>
+ <a u="8747" b="D3 AC"/>
+ <a u="8748" b="F2 E5"/>
+ <a u="8749" b="B2 F5"/>
+ <a u="874A" b="CE 5F"/>
+ <a u="874B" b="CE 60"/>
+ <a u="874C" b="F2 F2"/>
+ <a u="874D" b="CE 61"/>
+ <a u="874E" b="D0 AB"/>
+ <a u="874F" b="CE 62"/>
+ <a u="8750" b="CE 63"/>
+ <a u="8751" b="CE 64"/>
+ <a u="8752" b="CE 65"/>
+ <a u="8753" b="F2 F5"/>
+ <a u="8754" b="CE 66"/>
+ <a u="8755" b="CE 67"/>
+ <a u="8756" b="CE 68"/>
+ <a u="8757" b="BB C8"/>
+ <a u="8758" b="CE 69"/>
+ <a u="8759" b="F2 F9"/>
+ <a u="875A" b="CE 6A"/>
+ <a u="875B" b="CE 6B"/>
+ <a u="875C" b="CE 6C"/>
+ <a u="875D" b="CE 6D"/>
+ <a u="875E" b="CE 6E"/>
+ <a u="875F" b="CE 6F"/>
+ <a u="8760" b="F2 F0"/>
+ <a u="8761" b="CE 70"/>
+ <a u="8762" b="CE 71"/>
+ <a u="8763" b="F2 F6"/>
+ <a u="8764" b="F2 F8"/>
+ <a u="8765" b="F2 FA"/>
+ <a u="8766" b="CE 72"/>
+ <a u="8767" b="CE 73"/>
+ <a u="8768" b="CE 74"/>
+ <a u="8769" b="CE 75"/>
+ <a u="876A" b="CE 76"/>
+ <a u="876B" b="CE 77"/>
+ <a u="876C" b="CE 78"/>
+ <a u="876D" b="CE 79"/>
+ <a u="876E" b="F2 F3"/>
+ <a u="876F" b="CE 7A"/>
+ <a u="8770" b="F2 F1"/>
+ <a u="8771" b="CE 7B"/>
+ <a u="8772" b="CE 7C"/>
+ <a u="8773" b="CE 7D"/>
+ <a u="8774" b="BA FB"/>
+ <a u="8775" b="CE 7E"/>
+ <a u="8776" b="B5 FB"/>
+ <a u="8777" b="CE 80"/>
+ <a u="8778" b="CE 81"/>
+ <a u="8779" b="CE 82"/>
+ <a u="877A" b="CE 83"/>
+ <a u="877B" b="F2 EF"/>
+ <a u="877C" b="F2 F7"/>
+ <a u="877D" b="F2 ED"/>
+ <a u="877E" b="F2 EE"/>
+ <a u="877F" b="CE 84"/>
+ <a u="8780" b="CE 85"/>
+ <a u="8781" b="CE 86"/>
+ <a u="8782" b="F2 EB"/>
+ <a u="8783" b="F3 A6"/>
+ <a u="8784" b="CE 87"/>
+ <a u="8785" b="F3 A3"/>
+ <a u="8786" b="CE 88"/>
+ <a u="8787" b="CE 89"/>
+ <a u="8788" b="F3 A2"/>
+ <a u="8789" b="CE 8A"/>
+ <a u="878A" b="CE 8B"/>
+ <a u="878B" b="F2 F4"/>
+ <a u="878C" b="CE 8C"/>
+ <a u="878D" b="C8 DA"/>
+ <a u="878E" b="CE 8D"/>
+ <a u="878F" b="CE 8E"/>
+ <a u="8790" b="CE 8F"/>
+ <a u="8791" b="CE 90"/>
+ <a u="8792" b="CE 91"/>
+ <a u="8793" b="F2 FB"/>
+ <a u="8794" b="CE 92"/>
+ <a u="8795" b="CE 93"/>
+ <a u="8796" b="CE 94"/>
+ <a u="8797" b="F3 A5"/>
+ <a u="8798" b="CE 95"/>
+ <a u="8799" b="CE 96"/>
+ <a u="879A" b="CE 97"/>
+ <a u="879B" b="CE 98"/>
+ <a u="879C" b="CE 99"/>
+ <a u="879D" b="CE 9A"/>
+ <a u="879E" b="CE 9B"/>
+ <a u="879F" b="C3 F8"/>
+ <a u="87A0" b="CE 9C"/>
+ <a u="87A1" b="CE 9D"/>
+ <a u="87A2" b="CE 9E"/>
+ <a u="87A3" b="CE 9F"/>
+ <a u="87A4" b="CE A0"/>
+ <a u="87A5" b="CF 40"/>
+ <a u="87A6" b="CF 41"/>
+ <a u="87A7" b="CF 42"/>
+ <a u="87A8" b="F2 FD"/>
+ <a u="87A9" b="CF 43"/>
+ <a u="87AA" b="CF 44"/>
+ <a u="87AB" b="F3 A7"/>
+ <a u="87AC" b="F3 A9"/>
+ <a u="87AD" b="F3 A4"/>
+ <a u="87AE" b="CF 45"/>
+ <a u="87AF" b="F2 FC"/>
+ <a u="87B0" b="CF 46"/>
+ <a u="87B1" b="CF 47"/>
+ <a u="87B2" b="CF 48"/>
+ <a u="87B3" b="F3 AB"/>
+ <a u="87B4" b="CF 49"/>
+ <a u="87B5" b="F3 AA"/>
+ <a u="87B6" b="CF 4A"/>
+ <a u="87B7" b="CF 4B"/>
+ <a u="87B8" b="CF 4C"/>
+ <a u="87B9" b="CF 4D"/>
+ <a u="87BA" b="C2 DD"/>
+ <a u="87BB" b="CF 4E"/>
+ <a u="87BC" b="CF 4F"/>
+ <a u="87BD" b="F3 AE"/>
+ <a u="87BE" b="CF 50"/>
+ <a u="87BF" b="CF 51"/>
+ <a u="87C0" b="F3 B0"/>
+ <a u="87C1" b="CF 52"/>
+ <a u="87C2" b="CF 53"/>
+ <a u="87C3" b="CF 54"/>
+ <a u="87C4" b="CF 55"/>
+ <a u="87C5" b="CF 56"/>
+ <a u="87C6" b="F3 A1"/>
+ <a u="87C7" b="CF 57"/>
+ <a u="87C8" b="CF 58"/>
+ <a u="87C9" b="CF 59"/>
+ <a u="87CA" b="F3 B1"/>
+ <a u="87CB" b="F3 AC"/>
+ <a u="87CC" b="CF 5A"/>
+ <a u="87CD" b="CF 5B"/>
+ <a u="87CE" b="CF 5C"/>
+ <a u="87CF" b="CF 5D"/>
+ <a u="87D0" b="CF 5E"/>
+ <a u="87D1" b="F3 AF"/>
+ <a u="87D2" b="F2 FE"/>
+ <a u="87D3" b="F3 AD"/>
+ <a u="87D4" b="CF 5F"/>
+ <a u="87D5" b="CF 60"/>
+ <a u="87D6" b="CF 61"/>
+ <a u="87D7" b="CF 62"/>
+ <a u="87D8" b="CF 63"/>
+ <a u="87D9" b="CF 64"/>
+ <a u="87DA" b="CF 65"/>
+ <a u="87DB" b="F3 B2"/>
+ <a u="87DC" b="CF 66"/>
+ <a u="87DD" b="CF 67"/>
+ <a u="87DE" b="CF 68"/>
+ <a u="87DF" b="CF 69"/>
+ <a u="87E0" b="F3 B4"/>
+ <a u="87E1" b="CF 6A"/>
+ <a u="87E2" b="CF 6B"/>
+ <a u="87E3" b="CF 6C"/>
+ <a u="87E4" b="CF 6D"/>
+ <a u="87E5" b="F3 A8"/>
+ <a u="87E6" b="CF 6E"/>
+ <a u="87E7" b="CF 6F"/>
+ <a u="87E8" b="CF 70"/>
+ <a u="87E9" b="CF 71"/>
+ <a u="87EA" b="F3 B3"/>
+ <a u="87EB" b="CF 72"/>
+ <a u="87EC" b="CF 73"/>
+ <a u="87ED" b="CF 74"/>
+ <a u="87EE" b="F3 B5"/>
+ <a u="87EF" b="CF 75"/>
+ <a u="87F0" b="CF 76"/>
+ <a u="87F1" b="CF 77"/>
+ <a u="87F2" b="CF 78"/>
+ <a u="87F3" b="CF 79"/>
+ <a u="87F4" b="CF 7A"/>
+ <a u="87F5" b="CF 7B"/>
+ <a u="87F6" b="CF 7C"/>
+ <a u="87F7" b="CF 7D"/>
+ <a u="87F8" b="CF 7E"/>
+ <a u="87F9" b="D0 B7"/>
+ <a u="87FA" b="CF 80"/>
+ <a u="87FB" b="CF 81"/>
+ <a u="87FC" b="CF 82"/>
+ <a u="87FD" b="CF 83"/>
+ <a u="87FE" b="F3 B8"/>
+ <a u="87FF" b="CF 84"/>
+ <a u="8800" b="CF 85"/>
+ <a u="8801" b="CF 86"/>
+ <a u="8802" b="CF 87"/>
+ <a u="8803" b="D9 F9"/>
+ <a u="8804" b="CF 88"/>
+ <a u="8805" b="CF 89"/>
+ <a u="8806" b="CF 8A"/>
+ <a u="8807" b="CF 8B"/>
+ <a u="8808" b="CF 8C"/>
+ <a u="8809" b="CF 8D"/>
+ <a u="880A" b="F3 B9"/>
+ <a u="880B" b="CF 8E"/>
+ <a u="880C" b="CF 8F"/>
+ <a u="880D" b="CF 90"/>
+ <a u="880E" b="CF 91"/>
+ <a u="880F" b="CF 92"/>
+ <a u="8810" b="CF 93"/>
+ <a u="8811" b="CF 94"/>
+ <a u="8812" b="CF 95"/>
+ <a u="8813" b="F3 B7"/>
+ <a u="8814" b="CF 96"/>
+ <a u="8815" b="C8 E4"/>
+ <a u="8816" b="F3 B6"/>
+ <a u="8817" b="CF 97"/>
+ <a u="8818" b="CF 98"/>
+ <a u="8819" b="CF 99"/>
+ <a u="881A" b="CF 9A"/>
+ <a u="881B" b="F3 BA"/>
+ <a u="881C" b="CF 9B"/>
+ <a u="881D" b="CF 9C"/>
+ <a u="881E" b="CF 9D"/>
+ <a u="881F" b="CF 9E"/>
+ <a u="8820" b="CF 9F"/>
+ <a u="8821" b="F3 BB"/>
+ <a u="8822" b="B4 C0"/>
+ <a u="8823" b="CF A0"/>
+ <a u="8824" b="D0 40"/>
+ <a u="8825" b="D0 41"/>
+ <a u="8826" b="D0 42"/>
+ <a u="8827" b="D0 43"/>
+ <a u="8828" b="D0 44"/>
+ <a u="8829" b="D0 45"/>
+ <a u="882A" b="D0 46"/>
+ <a u="882B" b="D0 47"/>
+ <a u="882C" b="D0 48"/>
+ <a u="882D" b="D0 49"/>
+ <a u="882E" b="D0 4A"/>
+ <a u="882F" b="D0 4B"/>
+ <a u="8830" b="D0 4C"/>
+ <a u="8831" b="D0 4D"/>
+ <a u="8832" b="EE C3"/>
+ <a u="8833" b="D0 4E"/>
+ <a u="8834" b="D0 4F"/>
+ <a u="8835" b="D0 50"/>
+ <a u="8836" b="D0 51"/>
+ <a u="8837" b="D0 52"/>
+ <a u="8838" b="D0 53"/>
+ <a u="8839" b="F3 BC"/>
+ <a u="883A" b="D0 54"/>
+ <a u="883B" b="D0 55"/>
+ <a u="883C" b="F3 BD"/>
+ <a u="883D" b="D0 56"/>
+ <a u="883E" b="D0 57"/>
+ <a u="883F" b="D0 58"/>
+ <a u="8840" b="D1 AA"/>
+ <a u="8841" b="D0 59"/>
+ <a u="8842" b="D0 5A"/>
+ <a u="8843" b="D0 5B"/>
+ <a u="8844" b="F4 AC"/>
+ <a u="8845" b="D0 C6"/>
+ <a u="8846" b="D0 5C"/>
+ <a u="8847" b="D0 5D"/>
+ <a u="8848" b="D0 5E"/>
+ <a u="8849" b="D0 5F"/>
+ <a u="884A" b="D0 60"/>
+ <a u="884B" b="D0 61"/>
+ <a u="884C" b="D0 D0"/>
+ <a u="884D" b="D1 DC"/>
+ <a u="884E" b="D0 62"/>
+ <a u="884F" b="D0 63"/>
+ <a u="8850" b="D0 64"/>
+ <a u="8851" b="D0 65"/>
+ <a u="8852" b="D0 66"/>
+ <a u="8853" b="D0 67"/>
+ <a u="8854" b="CF CE"/>
+ <a u="8855" b="D0 68"/>
+ <a u="8856" b="D0 69"/>
+ <a u="8857" b="BD D6"/>
+ <a u="8858" b="D0 6A"/>
+ <a u="8859" b="D1 C3"/>
+ <a u="885A" b="D0 6B"/>
+ <a u="885B" b="D0 6C"/>
+ <a u="885C" b="D0 6D"/>
+ <a u="885D" b="D0 6E"/>
+ <a u="885E" b="D0 6F"/>
+ <a u="885F" b="D0 70"/>
+ <a u="8860" b="D0 71"/>
+ <a u="8861" b="BA E2"/>
+ <a u="8862" b="E1 E9"/>
+ <a u="8863" b="D2 C2"/>
+ <a u="8864" b="F1 C2"/>
+ <a u="8865" b="B2 B9"/>
+ <a u="8866" b="D0 72"/>
+ <a u="8867" b="D0 73"/>
+ <a u="8868" b="B1 ED"/>
+ <a u="8869" b="F1 C3"/>
+ <a u="886A" b="D0 74"/>
+ <a u="886B" b="C9 C0"/>
+ <a u="886C" b="B3 C4"/>
+ <a u="886D" b="D0 75"/>
+ <a u="886E" b="D9 F2"/>
+ <a u="886F" b="D0 76"/>
+ <a u="8870" b="CB A5"/>
+ <a u="8871" b="D0 77"/>
+ <a u="8872" b="F1 C4"/>
+ <a u="8873" b="D0 78"/>
+ <a u="8874" b="D0 79"/>
+ <a u="8875" b="D0 7A"/>
+ <a u="8876" b="D0 7B"/>
+ <a u="8877" b="D6 D4"/>
+ <a u="8878" b="D0 7C"/>
+ <a u="8879" b="D0 7D"/>
+ <a u="887A" b="D0 7E"/>
+ <a u="887B" b="D0 80"/>
+ <a u="887C" b="D0 81"/>
+ <a u="887D" b="F1 C5"/>
+ <a u="887E" b="F4 C0"/>
+ <a u="887F" b="F1 C6"/>
+ <a u="8880" b="D0 82"/>
+ <a u="8881" b="D4 AC"/>
+ <a u="8882" b="F1 C7"/>
+ <a u="8883" b="D0 83"/>
+ <a u="8884" b="B0 C0"/>
+ <a u="8885" b="F4 C1"/>
+ <a u="8886" b="D0 84"/>
+ <a u="8887" b="D0 85"/>
+ <a u="8888" b="F4 C2"/>
+ <a u="8889" b="D0 86"/>
+ <a u="888A" b="D0 87"/>
+ <a u="888B" b="B4 FC"/>
+ <a u="888C" b="D0 88"/>
+ <a u="888D" b="C5 DB"/>
+ <a u="888E" b="D0 89"/>
+ <a u="888F" b="D0 8A"/>
+ <a u="8890" b="D0 8B"/>
+ <a u="8891" b="D0 8C"/>
+ <a u="8892" b="CC BB"/>
+ <a u="8893" b="D0 8D"/>
+ <a u="8894" b="D0 8E"/>
+ <a u="8895" b="D0 8F"/>
+ <a u="8896" b="D0 E4"/>
+ <a u="8897" b="D0 90"/>
+ <a u="8898" b="D0 91"/>
+ <a u="8899" b="D0 92"/>
+ <a u="889A" b="D0 93"/>
+ <a u="889B" b="D0 94"/>
+ <a u="889C" b="CD E0"/>
+ <a u="889D" b="D0 95"/>
+ <a u="889E" b="D0 96"/>
+ <a u="889F" b="D0 97"/>
+ <a u="88A0" b="D0 98"/>
+ <a u="88A1" b="D0 99"/>
+ <a u="88A2" b="F1 C8"/>
+ <a u="88A3" b="D0 9A"/>
+ <a u="88A4" b="D9 F3"/>
+ <a u="88A5" b="D0 9B"/>
+ <a u="88A6" b="D0 9C"/>
+ <a u="88A7" b="D0 9D"/>
+ <a u="88A8" b="D0 9E"/>
+ <a u="88A9" b="D0 9F"/>
+ <a u="88AA" b="D0 A0"/>
+ <a u="88AB" b="B1 BB"/>
+ <a u="88AC" b="D1 40"/>
+ <a u="88AD" b="CF AE"/>
+ <a u="88AE" b="D1 41"/>
+ <a u="88AF" b="D1 42"/>
+ <a u="88B0" b="D1 43"/>
+ <a u="88B1" b="B8 A4"/>
+ <a u="88B2" b="D1 44"/>
+ <a u="88B3" b="D1 45"/>
+ <a u="88B4" b="D1 46"/>
+ <a u="88B5" b="D1 47"/>
+ <a u="88B6" b="D1 48"/>
+ <a u="88B7" b="F1 CA"/>
+ <a u="88B8" b="D1 49"/>
+ <a u="88B9" b="D1 4A"/>
+ <a u="88BA" b="D1 4B"/>
+ <a u="88BB" b="D1 4C"/>
+ <a u="88BC" b="F1 CB"/>
+ <a u="88BD" b="D1 4D"/>
+ <a u="88BE" b="D1 4E"/>
+ <a u="88BF" b="D1 4F"/>
+ <a u="88C0" b="D1 50"/>
+ <a u="88C1" b="B2 C3"/>
+ <a u="88C2" b="C1 D1"/>
+ <a u="88C3" b="D1 51"/>
+ <a u="88C4" b="D1 52"/>
+ <a u="88C5" b="D7 B0"/>
+ <a u="88C6" b="F1 C9"/>
+ <a u="88C7" b="D1 53"/>
+ <a u="88C8" b="D1 54"/>
+ <a u="88C9" b="F1 CC"/>
+ <a u="88CA" b="D1 55"/>
+ <a u="88CB" b="D1 56"/>
+ <a u="88CC" b="D1 57"/>
+ <a u="88CD" b="D1 58"/>
+ <a u="88CE" b="F1 CE"/>
+ <a u="88CF" b="D1 59"/>
+ <a u="88D0" b="D1 5A"/>
+ <a u="88D1" b="D1 5B"/>
+ <a u="88D2" b="D9 F6"/>
+ <a u="88D3" b="D1 5C"/>
+ <a u="88D4" b="D2 E1"/>
+ <a u="88D5" b="D4 A3"/>
+ <a u="88D6" b="D1 5D"/>
+ <a u="88D7" b="D1 5E"/>
+ <a u="88D8" b="F4 C3"/>
+ <a u="88D9" b="C8 B9"/>
+ <a u="88DA" b="D1 5F"/>
+ <a u="88DB" b="D1 60"/>
+ <a u="88DC" b="D1 61"/>
+ <a u="88DD" b="D1 62"/>
+ <a u="88DE" b="D1 63"/>
+ <a u="88DF" b="F4 C4"/>
+ <a u="88E0" b="D1 64"/>
+ <a u="88E1" b="D1 65"/>
+ <a u="88E2" b="F1 CD"/>
+ <a u="88E3" b="F1 CF"/>
+ <a u="88E4" b="BF E3"/>
+ <a u="88E5" b="F1 D0"/>
+ <a u="88E6" b="D1 66"/>
+ <a u="88E7" b="D1 67"/>
+ <a u="88E8" b="F1 D4"/>
+ <a u="88E9" b="D1 68"/>
+ <a u="88EA" b="D1 69"/>
+ <a u="88EB" b="D1 6A"/>
+ <a u="88EC" b="D1 6B"/>
+ <a u="88ED" b="D1 6C"/>
+ <a u="88EE" b="D1 6D"/>
+ <a u="88EF" b="D1 6E"/>
+ <a u="88F0" b="F1 D6"/>
+ <a u="88F1" b="F1 D1"/>
+ <a u="88F2" b="D1 6F"/>
+ <a u="88F3" b="C9 D1"/>
+ <a u="88F4" b="C5 E1"/>
+ <a u="88F5" b="D1 70"/>
+ <a u="88F6" b="D1 71"/>
+ <a u="88F7" b="D1 72"/>
+ <a u="88F8" b="C2 E3"/>
+ <a u="88F9" b="B9 FC"/>
+ <a u="88FA" b="D1 73"/>
+ <a u="88FB" b="D1 74"/>
+ <a u="88FC" b="F1 D3"/>
+ <a u="88FD" b="D1 75"/>
+ <a u="88FE" b="F1 D5"/>
+ <a u="88FF" b="D1 76"/>
+ <a u="8900" b="D1 77"/>
+ <a u="8901" b="D1 78"/>
+ <a u="8902" b="B9 D3"/>
+ <a u="8903" b="D1 79"/>
+ <a u="8904" b="D1 7A"/>
+ <a u="8905" b="D1 7B"/>
+ <a u="8906" b="D1 7C"/>
+ <a u="8907" b="D1 7D"/>
+ <a u="8908" b="D1 7E"/>
+ <a u="8909" b="D1 80"/>
+ <a u="890A" b="F1 DB"/>
+ <a u="890B" b="D1 81"/>
+ <a u="890C" b="D1 82"/>
+ <a u="890D" b="D1 83"/>
+ <a u="890E" b="D1 84"/>
+ <a u="890F" b="D1 85"/>
+ <a u="8910" b="BA D6"/>
+ <a u="8911" b="D1 86"/>
+ <a u="8912" b="B0 FD"/>
+ <a u="8913" b="F1 D9"/>
+ <a u="8914" b="D1 87"/>
+ <a u="8915" b="D1 88"/>
+ <a u="8916" b="D1 89"/>
+ <a u="8917" b="D1 8A"/>
+ <a u="8918" b="D1 8B"/>
+ <a u="8919" b="F1 D8"/>
+ <a u="891A" b="F1 D2"/>
+ <a u="891B" b="F1 DA"/>
+ <a u="891C" b="D1 8C"/>
+ <a u="891D" b="D1 8D"/>
+ <a u="891E" b="D1 8E"/>
+ <a u="891F" b="D1 8F"/>
+ <a u="8920" b="D1 90"/>
+ <a u="8921" b="F1 D7"/>
+ <a u="8922" b="D1 91"/>
+ <a u="8923" b="D1 92"/>
+ <a u="8924" b="D1 93"/>
+ <a u="8925" b="C8 EC"/>
+ <a u="8926" b="D1 94"/>
+ <a u="8927" b="D1 95"/>
+ <a u="8928" b="D1 96"/>
+ <a u="8929" b="D1 97"/>
+ <a u="892A" b="CD CA"/>
+ <a u="892B" b="F1 DD"/>
+ <a u="892C" b="D1 98"/>
+ <a u="892D" b="D1 99"/>
+ <a u="892E" b="D1 9A"/>
+ <a u="892F" b="D1 9B"/>
+ <a u="8930" b="E5 BD"/>
+ <a u="8931" b="D1 9C"/>
+ <a u="8932" b="D1 9D"/>
+ <a u="8933" b="D1 9E"/>
+ <a u="8934" b="F1 DC"/>
+ <a u="8935" b="D1 9F"/>
+ <a u="8936" b="F1 DE"/>
+ <a u="8937" b="D1 A0"/>
+ <a u="8938" b="D2 40"/>
+ <a u="8939" b="D2 41"/>
+ <a u="893A" b="D2 42"/>
+ <a u="893B" b="D2 43"/>
+ <a u="893C" b="D2 44"/>
+ <a u="893D" b="D2 45"/>
+ <a u="893E" b="D2 46"/>
+ <a u="893F" b="D2 47"/>
+ <a u="8940" b="D2 48"/>
+ <a u="8941" b="F1 DF"/>
+ <a u="8942" b="D2 49"/>
+ <a u="8943" b="D2 4A"/>
+ <a u="8944" b="CF E5"/>
+ <a u="8945" b="D2 4B"/>
+ <a u="8946" b="D2 4C"/>
+ <a u="8947" b="D2 4D"/>
+ <a u="8948" b="D2 4E"/>
+ <a u="8949" b="D2 4F"/>
+ <a u="894A" b="D2 50"/>
+ <a u="894B" b="D2 51"/>
+ <a u="894C" b="D2 52"/>
+ <a u="894D" b="D2 53"/>
+ <a u="894E" b="D2 54"/>
+ <a u="894F" b="D2 55"/>
+ <a u="8950" b="D2 56"/>
+ <a u="8951" b="D2 57"/>
+ <a u="8952" b="D2 58"/>
+ <a u="8953" b="D2 59"/>
+ <a u="8954" b="D2 5A"/>
+ <a u="8955" b="D2 5B"/>
+ <a u="8956" b="D2 5C"/>
+ <a u="8957" b="D2 5D"/>
+ <a u="8958" b="D2 5E"/>
+ <a u="8959" b="D2 5F"/>
+ <a u="895A" b="D2 60"/>
+ <a u="895B" b="D2 61"/>
+ <a u="895C" b="D2 62"/>
+ <a u="895D" b="D2 63"/>
+ <a u="895E" b="F4 C5"/>
+ <a u="895F" b="BD F3"/>
+ <a u="8960" b="D2 64"/>
+ <a u="8961" b="D2 65"/>
+ <a u="8962" b="D2 66"/>
+ <a u="8963" b="D2 67"/>
+ <a u="8964" b="D2 68"/>
+ <a u="8965" b="D2 69"/>
+ <a u="8966" b="F1 E0"/>
+ <a u="8967" b="D2 6A"/>
+ <a u="8968" b="D2 6B"/>
+ <a u="8969" b="D2 6C"/>
+ <a u="896A" b="D2 6D"/>
+ <a u="896B" b="D2 6E"/>
+ <a u="896C" b="D2 6F"/>
+ <a u="896D" b="D2 70"/>
+ <a u="896E" b="D2 71"/>
+ <a u="896F" b="D2 72"/>
+ <a u="8970" b="D2 73"/>
+ <a u="8971" b="D2 74"/>
+ <a u="8972" b="D2 75"/>
+ <a u="8973" b="D2 76"/>
+ <a u="8974" b="D2 77"/>
+ <a u="8975" b="D2 78"/>
+ <a u="8976" b="D2 79"/>
+ <a u="8977" b="D2 7A"/>
+ <a u="8978" b="D2 7B"/>
+ <a u="8979" b="D2 7C"/>
+ <a u="897A" b="D2 7D"/>
+ <a u="897B" b="F1 E1"/>
+ <a u="897C" b="D2 7E"/>
+ <a u="897D" b="D2 80"/>
+ <a u="897E" b="D2 81"/>
+ <a u="897F" b="CE F7"/>
+ <a u="8980" b="D2 82"/>
+ <a u="8981" b="D2 AA"/>
+ <a u="8982" b="D2 83"/>
+ <a u="8983" b="F1 FB"/>
+ <a u="8984" b="D2 84"/>
+ <a u="8985" b="D2 85"/>
+ <a u="8986" b="B8 B2"/>
+ <a u="8987" b="D2 86"/>
+ <a u="8988" b="D2 87"/>
+ <a u="8989" b="D2 88"/>
+ <a u="898A" b="D2 89"/>
+ <a u="898B" b="D2 8A"/>
+ <a u="898C" b="D2 8B"/>
+ <a u="898D" b="D2 8C"/>
+ <a u="898E" b="D2 8D"/>
+ <a u="898F" b="D2 8E"/>
+ <a u="8990" b="D2 8F"/>
+ <a u="8991" b="D2 90"/>
+ <a u="8992" b="D2 91"/>
+ <a u="8993" b="D2 92"/>
+ <a u="8994" b="D2 93"/>
+ <a u="8995" b="D2 94"/>
+ <a u="8996" b="D2 95"/>
+ <a u="8997" b="D2 96"/>
+ <a u="8998" b="D2 97"/>
+ <a u="8999" b="D2 98"/>
+ <a u="899A" b="D2 99"/>
+ <a u="899B" b="D2 9A"/>
+ <a u="899C" b="D2 9B"/>
+ <a u="899D" b="D2 9C"/>
+ <a u="899E" b="D2 9D"/>
+ <a u="899F" b="D2 9E"/>
+ <a u="89A0" b="D2 9F"/>
+ <a u="89A1" b="D2 A0"/>
+ <a u="89A2" b="D3 40"/>
+ <a u="89A3" b="D3 41"/>
+ <a u="89A4" b="D3 42"/>
+ <a u="89A5" b="D3 43"/>
+ <a u="89A6" b="D3 44"/>
+ <a u="89A7" b="D3 45"/>
+ <a u="89A8" b="D3 46"/>
+ <a u="89A9" b="D3 47"/>
+ <a u="89AA" b="D3 48"/>
+ <a u="89AB" b="D3 49"/>
+ <a u="89AC" b="D3 4A"/>
+ <a u="89AD" b="D3 4B"/>
+ <a u="89AE" b="D3 4C"/>
+ <a u="89AF" b="D3 4D"/>
+ <a u="89B0" b="D3 4E"/>
+ <a u="89B1" b="D3 4F"/>
+ <a u="89B2" b="D3 50"/>
+ <a u="89B3" b="D3 51"/>
+ <a u="89B4" b="D3 52"/>
+ <a u="89B5" b="D3 53"/>
+ <a u="89B6" b="D3 54"/>
+ <a u="89B7" b="D3 55"/>
+ <a u="89B8" b="D3 56"/>
+ <a u="89B9" b="D3 57"/>
+ <a u="89BA" b="D3 58"/>
+ <a u="89BB" b="D3 59"/>
+ <a u="89BC" b="D3 5A"/>
+ <a u="89BD" b="D3 5B"/>
+ <a u="89BE" b="D3 5C"/>
+ <a u="89BF" b="D3 5D"/>
+ <a u="89C0" b="D3 5E"/>
+ <a u="89C1" b="BC FB"/>
+ <a u="89C2" b="B9 DB"/>
+ <a u="89C3" b="D3 5F"/>
+ <a u="89C4" b="B9 E6"/>
+ <a u="89C5" b="C3 D9"/>
+ <a u="89C6" b="CA D3"/>
+ <a u="89C7" b="EA E8"/>
+ <a u="89C8" b="C0 C0"/>
+ <a u="89C9" b="BE F5"/>
+ <a u="89CA" b="EA E9"/>
+ <a u="89CB" b="EA EA"/>
+ <a u="89CC" b="EA EB"/>
+ <a u="89CD" b="D3 60"/>
+ <a u="89CE" b="EA EC"/>
+ <a u="89CF" b="EA ED"/>
+ <a u="89D0" b="EA EE"/>
+ <a u="89D1" b="EA EF"/>
+ <a u="89D2" b="BD C7"/>
+ <a u="89D3" b="D3 61"/>
+ <a u="89D4" b="D3 62"/>
+ <a u="89D5" b="D3 63"/>
+ <a u="89D6" b="F5 FB"/>
+ <a u="89D7" b="D3 64"/>
+ <a u="89D8" b="D3 65"/>
+ <a u="89D9" b="D3 66"/>
+ <a u="89DA" b="F5 FD"/>
+ <a u="89DB" b="D3 67"/>
+ <a u="89DC" b="F5 FE"/>
+ <a u="89DD" b="D3 68"/>
+ <a u="89DE" b="F5 FC"/>
+ <a u="89DF" b="D3 69"/>
+ <a u="89E0" b="D3 6A"/>
+ <a u="89E1" b="D3 6B"/>
+ <a u="89E2" b="D3 6C"/>
+ <a u="89E3" b="BD E2"/>
+ <a u="89E4" b="D3 6D"/>
+ <a u="89E5" b="F6 A1"/>
+ <a u="89E6" b="B4 A5"/>
+ <a u="89E7" b="D3 6E"/>
+ <a u="89E8" b="D3 6F"/>
+ <a u="89E9" b="D3 70"/>
+ <a u="89EA" b="D3 71"/>
+ <a u="89EB" b="F6 A2"/>
+ <a u="89EC" b="D3 72"/>
+ <a u="89ED" b="D3 73"/>
+ <a u="89EE" b="D3 74"/>
+ <a u="89EF" b="F6 A3"/>
+ <a u="89F0" b="D3 75"/>
+ <a u="89F1" b="D3 76"/>
+ <a u="89F2" b="D3 77"/>
+ <a u="89F3" b="EC B2"/>
+ <a u="89F4" b="D3 78"/>
+ <a u="89F5" b="D3 79"/>
+ <a u="89F6" b="D3 7A"/>
+ <a u="89F7" b="D3 7B"/>
+ <a u="89F8" b="D3 7C"/>
+ <a u="89F9" b="D3 7D"/>
+ <a u="89FA" b="D3 7E"/>
+ <a u="89FB" b="D3 80"/>
+ <a u="89FC" b="D3 81"/>
+ <a u="89FD" b="D3 82"/>
+ <a u="89FE" b="D3 83"/>
+ <a u="89FF" b="D3 84"/>
+ <a u="8A00" b="D1 D4"/>
+ <a u="8A01" b="D3 85"/>
+ <a u="8A02" b="D3 86"/>
+ <a u="8A03" b="D3 87"/>
+ <a u="8A04" b="D3 88"/>
+ <a u="8A05" b="D3 89"/>
+ <a u="8A06" b="D3 8A"/>
+ <a u="8A07" b="D9 EA"/>
+ <a u="8A08" b="D3 8B"/>
+ <a u="8A09" b="D3 8C"/>
+ <a u="8A0A" b="D3 8D"/>
+ <a u="8A0B" b="D3 8E"/>
+ <a u="8A0C" b="D3 8F"/>
+ <a u="8A0D" b="D3 90"/>
+ <a u="8A0E" b="D3 91"/>
+ <a u="8A0F" b="D3 92"/>
+ <a u="8A10" b="D3 93"/>
+ <a u="8A11" b="D3 94"/>
+ <a u="8A12" b="D3 95"/>
+ <a u="8A13" b="D3 96"/>
+ <a u="8A14" b="D3 97"/>
+ <a u="8A15" b="D3 98"/>
+ <a u="8A16" b="D3 99"/>
+ <a u="8A17" b="D3 9A"/>
+ <a u="8A18" b="D3 9B"/>
+ <a u="8A19" b="D3 9C"/>
+ <a u="8A1A" b="D3 9D"/>
+ <a u="8A1B" b="D3 9E"/>
+ <a u="8A1C" b="D3 9F"/>
+ <a u="8A1D" b="D3 A0"/>
+ <a u="8A1E" b="D4 40"/>
+ <a u="8A1F" b="D4 41"/>
+ <a u="8A20" b="D4 42"/>
+ <a u="8A21" b="D4 43"/>
+ <a u="8A22" b="D4 44"/>
+ <a u="8A23" b="D4 45"/>
+ <a u="8A24" b="D4 46"/>
+ <a u="8A25" b="D4 47"/>
+ <a u="8A26" b="D4 48"/>
+ <a u="8A27" b="D4 49"/>
+ <a u="8A28" b="D4 4A"/>
+ <a u="8A29" b="D4 4B"/>
+ <a u="8A2A" b="D4 4C"/>
+ <a u="8A2B" b="D4 4D"/>
+ <a u="8A2C" b="D4 4E"/>
+ <a u="8A2D" b="D4 4F"/>
+ <a u="8A2E" b="D4 50"/>
+ <a u="8A2F" b="D4 51"/>
+ <a u="8A30" b="D4 52"/>
+ <a u="8A31" b="D4 53"/>
+ <a u="8A32" b="D4 54"/>
+ <a u="8A33" b="D4 55"/>
+ <a u="8A34" b="D4 56"/>
+ <a u="8A35" b="D4 57"/>
+ <a u="8A36" b="D4 58"/>
+ <a u="8A37" b="D4 59"/>
+ <a u="8A38" b="D4 5A"/>
+ <a u="8A39" b="D4 5B"/>
+ <a u="8A3A" b="D4 5C"/>
+ <a u="8A3B" b="D4 5D"/>
+ <a u="8A3C" b="D4 5E"/>
+ <a u="8A3D" b="D4 5F"/>
+ <a u="8A3E" b="F6 A4"/>
+ <a u="8A3F" b="D4 60"/>
+ <a u="8A40" b="D4 61"/>
+ <a u="8A41" b="D4 62"/>
+ <a u="8A42" b="D4 63"/>
+ <a u="8A43" b="D4 64"/>
+ <a u="8A44" b="D4 65"/>
+ <a u="8A45" b="D4 66"/>
+ <a u="8A46" b="D4 67"/>
+ <a u="8A47" b="D4 68"/>
+ <a u="8A48" b="EE BA"/>
+ <a u="8A49" b="D4 69"/>
+ <a u="8A4A" b="D4 6A"/>
+ <a u="8A4B" b="D4 6B"/>
+ <a u="8A4C" b="D4 6C"/>
+ <a u="8A4D" b="D4 6D"/>
+ <a u="8A4E" b="D4 6E"/>
+ <a u="8A4F" b="D4 6F"/>
+ <a u="8A50" b="D4 70"/>
+ <a u="8A51" b="D4 71"/>
+ <a u="8A52" b="D4 72"/>
+ <a u="8A53" b="D4 73"/>
+ <a u="8A54" b="D4 74"/>
+ <a u="8A55" b="D4 75"/>
+ <a u="8A56" b="D4 76"/>
+ <a u="8A57" b="D4 77"/>
+ <a u="8A58" b="D4 78"/>
+ <a u="8A59" b="D4 79"/>
+ <a u="8A5A" b="D4 7A"/>
+ <a u="8A5B" b="D4 7B"/>
+ <a u="8A5C" b="D4 7C"/>
+ <a u="8A5D" b="D4 7D"/>
+ <a u="8A5E" b="D4 7E"/>
+ <a u="8A5F" b="D4 80"/>
+ <a u="8A60" b="D4 81"/>
+ <a u="8A61" b="D4 82"/>
+ <a u="8A62" b="D4 83"/>
+ <a u="8A63" b="D4 84"/>
+ <a u="8A64" b="D4 85"/>
+ <a u="8A65" b="D4 86"/>
+ <a u="8A66" b="D4 87"/>
+ <a u="8A67" b="D4 88"/>
+ <a u="8A68" b="D4 89"/>
+ <a u="8A69" b="D4 8A"/>
+ <a u="8A6A" b="D4 8B"/>
+ <a u="8A6B" b="D4 8C"/>
+ <a u="8A6C" b="D4 8D"/>
+ <a u="8A6D" b="D4 8E"/>
+ <a u="8A6E" b="D4 8F"/>
+ <a u="8A6F" b="D4 90"/>
+ <a u="8A70" b="D4 91"/>
+ <a u="8A71" b="D4 92"/>
+ <a u="8A72" b="D4 93"/>
+ <a u="8A73" b="D4 94"/>
+ <a u="8A74" b="D4 95"/>
+ <a u="8A75" b="D4 96"/>
+ <a u="8A76" b="D4 97"/>
+ <a u="8A77" b="D4 98"/>
+ <a u="8A78" b="D4 99"/>
+ <a u="8A79" b="D5 B2"/>
+ <a u="8A7A" b="D4 9A"/>
+ <a u="8A7B" b="D4 9B"/>
+ <a u="8A7C" b="D4 9C"/>
+ <a u="8A7D" b="D4 9D"/>
+ <a u="8A7E" b="D4 9E"/>
+ <a u="8A7F" b="D4 9F"/>
+ <a u="8A80" b="D4 A0"/>
+ <a u="8A81" b="D5 40"/>
+ <a u="8A82" b="D5 41"/>
+ <a u="8A83" b="D5 42"/>
+ <a u="8A84" b="D5 43"/>
+ <a u="8A85" b="D5 44"/>
+ <a u="8A86" b="D5 45"/>
+ <a u="8A87" b="D5 46"/>
+ <a u="8A88" b="D5 47"/>
+ <a u="8A89" b="D3 FE"/>
+ <a u="8A8A" b="CC DC"/>
+ <a u="8A8B" b="D5 48"/>
+ <a u="8A8C" b="D5 49"/>
+ <a u="8A8D" b="D5 4A"/>
+ <a u="8A8E" b="D5 4B"/>
+ <a u="8A8F" b="D5 4C"/>
+ <a u="8A90" b="D5 4D"/>
+ <a u="8A91" b="D5 4E"/>
+ <a u="8A92" b="D5 4F"/>
+ <a u="8A93" b="CA C4"/>
+ <a u="8A94" b="D5 50"/>
+ <a u="8A95" b="D5 51"/>
+ <a u="8A96" b="D5 52"/>
+ <a u="8A97" b="D5 53"/>
+ <a u="8A98" b="D5 54"/>
+ <a u="8A99" b="D5 55"/>
+ <a u="8A9A" b="D5 56"/>
+ <a u="8A9B" b="D5 57"/>
+ <a u="8A9C" b="D5 58"/>
+ <a u="8A9D" b="D5 59"/>
+ <a u="8A9E" b="D5 5A"/>
+ <a u="8A9F" b="D5 5B"/>
+ <a u="8AA0" b="D5 5C"/>
+ <a u="8AA1" b="D5 5D"/>
+ <a u="8AA2" b="D5 5E"/>
+ <a u="8AA3" b="D5 5F"/>
+ <a u="8AA4" b="D5 60"/>
+ <a u="8AA5" b="D5 61"/>
+ <a u="8AA6" b="D5 62"/>
+ <a u="8AA7" b="D5 63"/>
+ <a u="8AA8" b="D5 64"/>
+ <a u="8AA9" b="D5 65"/>
+ <a u="8AAA" b="D5 66"/>
+ <a u="8AAB" b="D5 67"/>
+ <a u="8AAC" b="D5 68"/>
+ <a u="8AAD" b="D5 69"/>
+ <a u="8AAE" b="D5 6A"/>
+ <a u="8AAF" b="D5 6B"/>
+ <a u="8AB0" b="D5 6C"/>
+ <a u="8AB1" b="D5 6D"/>
+ <a u="8AB2" b="D5 6E"/>
+ <a u="8AB3" b="D5 6F"/>
+ <a u="8AB4" b="D5 70"/>
+ <a u="8AB5" b="D5 71"/>
+ <a u="8AB6" b="D5 72"/>
+ <a u="8AB7" b="D5 73"/>
+ <a u="8AB8" b="D5 74"/>
+ <a u="8AB9" b="D5 75"/>
+ <a u="8ABA" b="D5 76"/>
+ <a u="8ABB" b="D5 77"/>
+ <a u="8ABC" b="D5 78"/>
+ <a u="8ABD" b="D5 79"/>
+ <a u="8ABE" b="D5 7A"/>
+ <a u="8ABF" b="D5 7B"/>
+ <a u="8AC0" b="D5 7C"/>
+ <a u="8AC1" b="D5 7D"/>
+ <a u="8AC2" b="D5 7E"/>
+ <a u="8AC3" b="D5 80"/>
+ <a u="8AC4" b="D5 81"/>
+ <a u="8AC5" b="D5 82"/>
+ <a u="8AC6" b="D5 83"/>
+ <a u="8AC7" b="D5 84"/>
+ <a u="8AC8" b="D5 85"/>
+ <a u="8AC9" b="D5 86"/>
+ <a u="8ACA" b="D5 87"/>
+ <a u="8ACB" b="D5 88"/>
+ <a u="8ACC" b="D5 89"/>
+ <a u="8ACD" b="D5 8A"/>
+ <a u="8ACE" b="D5 8B"/>
+ <a u="8ACF" b="D5 8C"/>
+ <a u="8AD0" b="D5 8D"/>
+ <a u="8AD1" b="D5 8E"/>
+ <a u="8AD2" b="D5 8F"/>
+ <a u="8AD3" b="D5 90"/>
+ <a u="8AD4" b="D5 91"/>
+ <a u="8AD5" b="D5 92"/>
+ <a u="8AD6" b="D5 93"/>
+ <a u="8AD7" b="D5 94"/>
+ <a u="8AD8" b="D5 95"/>
+ <a u="8AD9" b="D5 96"/>
+ <a u="8ADA" b="D5 97"/>
+ <a u="8ADB" b="D5 98"/>
+ <a u="8ADC" b="D5 99"/>
+ <a u="8ADD" b="D5 9A"/>
+ <a u="8ADE" b="D5 9B"/>
+ <a u="8ADF" b="D5 9C"/>
+ <a u="8AE0" b="D5 9D"/>
+ <a u="8AE1" b="D5 9E"/>
+ <a u="8AE2" b="D5 9F"/>
+ <a u="8AE3" b="D5 A0"/>
+ <a u="8AE4" b="D6 40"/>
+ <a u="8AE5" b="D6 41"/>
+ <a u="8AE6" b="D6 42"/>
+ <a u="8AE7" b="D6 43"/>
+ <a u="8AE8" b="D6 44"/>
+ <a u="8AE9" b="D6 45"/>
+ <a u="8AEA" b="D6 46"/>
+ <a u="8AEB" b="D6 47"/>
+ <a u="8AEC" b="D6 48"/>
+ <a u="8AED" b="D6 49"/>
+ <a u="8AEE" b="D6 4A"/>
+ <a u="8AEF" b="D6 4B"/>
+ <a u="8AF0" b="D6 4C"/>
+ <a u="8AF1" b="D6 4D"/>
+ <a u="8AF2" b="D6 4E"/>
+ <a u="8AF3" b="D6 4F"/>
+ <a u="8AF4" b="D6 50"/>
+ <a u="8AF5" b="D6 51"/>
+ <a u="8AF6" b="D6 52"/>
+ <a u="8AF7" b="D6 53"/>
+ <a u="8AF8" b="D6 54"/>
+ <a u="8AF9" b="D6 55"/>
+ <a u="8AFA" b="D6 56"/>
+ <a u="8AFB" b="D6 57"/>
+ <a u="8AFC" b="D6 58"/>
+ <a u="8AFD" b="D6 59"/>
+ <a u="8AFE" b="D6 5A"/>
+ <a u="8AFF" b="D6 5B"/>
+ <a u="8B00" b="D6 5C"/>
+ <a u="8B01" b="D6 5D"/>
+ <a u="8B02" b="D6 5E"/>
+ <a u="8B03" b="D6 5F"/>
+ <a u="8B04" b="D6 60"/>
+ <a u="8B05" b="D6 61"/>
+ <a u="8B06" b="D6 62"/>
+ <a u="8B07" b="E5 C0"/>
+ <a u="8B08" b="D6 63"/>
+ <a u="8B09" b="D6 64"/>
+ <a u="8B0A" b="D6 65"/>
+ <a u="8B0B" b="D6 66"/>
+ <a u="8B0C" b="D6 67"/>
+ <a u="8B0D" b="D6 68"/>
+ <a u="8B0E" b="D6 69"/>
+ <a u="8B0F" b="D6 6A"/>
+ <a u="8B10" b="D6 6B"/>
+ <a u="8B11" b="D6 6C"/>
+ <a u="8B12" b="D6 6D"/>
+ <a u="8B13" b="D6 6E"/>
+ <a u="8B14" b="D6 6F"/>
+ <a u="8B15" b="D6 70"/>
+ <a u="8B16" b="D6 71"/>
+ <a u="8B17" b="D6 72"/>
+ <a u="8B18" b="D6 73"/>
+ <a u="8B19" b="D6 74"/>
+ <a u="8B1A" b="D6 75"/>
+ <a u="8B1B" b="D6 76"/>
+ <a u="8B1C" b="D6 77"/>
+ <a u="8B1D" b="D6 78"/>
+ <a u="8B1E" b="D6 79"/>
+ <a u="8B1F" b="D6 7A"/>
+ <a u="8B20" b="D6 7B"/>
+ <a u="8B21" b="D6 7C"/>
+ <a u="8B22" b="D6 7D"/>
+ <a u="8B23" b="D6 7E"/>
+ <a u="8B24" b="D6 80"/>
+ <a u="8B25" b="D6 81"/>
+ <a u="8B26" b="F6 A5"/>
+ <a u="8B27" b="D6 82"/>
+ <a u="8B28" b="D6 83"/>
+ <a u="8B29" b="D6 84"/>
+ <a u="8B2A" b="D6 85"/>
+ <a u="8B2B" b="D6 86"/>
+ <a u="8B2C" b="D6 87"/>
+ <a u="8B2D" b="D6 88"/>
+ <a u="8B2E" b="D6 89"/>
+ <a u="8B2F" b="D6 8A"/>
+ <a u="8B30" b="D6 8B"/>
+ <a u="8B31" b="D6 8C"/>
+ <a u="8B32" b="D6 8D"/>
+ <a u="8B33" b="D6 8E"/>
+ <a u="8B34" b="D6 8F"/>
+ <a u="8B35" b="D6 90"/>
+ <a u="8B36" b="D6 91"/>
+ <a u="8B37" b="D6 92"/>
+ <a u="8B38" b="D6 93"/>
+ <a u="8B39" b="D6 94"/>
+ <a u="8B3A" b="D6 95"/>
+ <a u="8B3B" b="D6 96"/>
+ <a u="8B3C" b="D6 97"/>
+ <a u="8B3D" b="D6 98"/>
+ <a u="8B3E" b="D6 99"/>
+ <a u="8B3F" b="D6 9A"/>
+ <a u="8B40" b="D6 9B"/>
+ <a u="8B41" b="D6 9C"/>
+ <a u="8B42" b="D6 9D"/>
+ <a u="8B43" b="D6 9E"/>
+ <a u="8B44" b="D6 9F"/>
+ <a u="8B45" b="D6 A0"/>
+ <a u="8B46" b="D7 40"/>
+ <a u="8B47" b="D7 41"/>
+ <a u="8B48" b="D7 42"/>
+ <a u="8B49" b="D7 43"/>
+ <a u="8B4A" b="D7 44"/>
+ <a u="8B4B" b="D7 45"/>
+ <a u="8B4C" b="D7 46"/>
+ <a u="8B4D" b="D7 47"/>
+ <a u="8B4E" b="D7 48"/>
+ <a u="8B4F" b="D7 49"/>
+ <a u="8B50" b="D7 4A"/>
+ <a u="8B51" b="D7 4B"/>
+ <a u="8B52" b="D7 4C"/>
+ <a u="8B53" b="D7 4D"/>
+ <a u="8B54" b="D7 4E"/>
+ <a u="8B55" b="D7 4F"/>
+ <a u="8B56" b="D7 50"/>
+ <a u="8B57" b="D7 51"/>
+ <a u="8B58" b="D7 52"/>
+ <a u="8B59" b="D7 53"/>
+ <a u="8B5A" b="D7 54"/>
+ <a u="8B5B" b="D7 55"/>
+ <a u="8B5C" b="D7 56"/>
+ <a u="8B5D" b="D7 57"/>
+ <a u="8B5E" b="D7 58"/>
+ <a u="8B5F" b="D7 59"/>
+ <a u="8B60" b="D7 5A"/>
+ <a u="8B61" b="D7 5B"/>
+ <a u="8B62" b="D7 5C"/>
+ <a u="8B63" b="D7 5D"/>
+ <a u="8B64" b="D7 5E"/>
+ <a u="8B65" b="D7 5F"/>
+ <a u="8B66" b="BE AF"/>
+ <a u="8B67" b="D7 60"/>
+ <a u="8B68" b="D7 61"/>
+ <a u="8B69" b="D7 62"/>
+ <a u="8B6A" b="D7 63"/>
+ <a u="8B6B" b="D7 64"/>
+ <a u="8B6C" b="C6 A9"/>
+ <a u="8B6D" b="D7 65"/>
+ <a u="8B6E" b="D7 66"/>
+ <a u="8B6F" b="D7 67"/>
+ <a u="8B70" b="D7 68"/>
+ <a u="8B71" b="D7 69"/>
+ <a u="8B72" b="D7 6A"/>
+ <a u="8B73" b="D7 6B"/>
+ <a u="8B74" b="D7 6C"/>
+ <a u="8B75" b="D7 6D"/>
+ <a u="8B76" b="D7 6E"/>
+ <a u="8B77" b="D7 6F"/>
+ <a u="8B78" b="D7 70"/>
+ <a u="8B79" b="D7 71"/>
+ <a u="8B7A" b="D7 72"/>
+ <a u="8B7B" b="D7 73"/>
+ <a u="8B7C" b="D7 74"/>
+ <a u="8B7D" b="D7 75"/>
+ <a u="8B7E" b="D7 76"/>
+ <a u="8B7F" b="D7 77"/>
+ <a u="8B80" b="D7 78"/>
+ <a u="8B81" b="D7 79"/>
+ <a u="8B82" b="D7 7A"/>
+ <a u="8B83" b="D7 7B"/>
+ <a u="8B84" b="D7 7C"/>
+ <a u="8B85" b="D7 7D"/>
+ <a u="8B86" b="D7 7E"/>
+ <a u="8B87" b="D7 80"/>
+ <a u="8B88" b="D7 81"/>
+ <a u="8B89" b="D7 82"/>
+ <a u="8B8A" b="D7 83"/>
+ <a u="8B8B" b="D7 84"/>
+ <a u="8B8C" b="D7 85"/>
+ <a u="8B8D" b="D7 86"/>
+ <a u="8B8E" b="D7 87"/>
+ <a u="8B8F" b="D7 88"/>
+ <a u="8B90" b="D7 89"/>
+ <a u="8B91" b="D7 8A"/>
+ <a u="8B92" b="D7 8B"/>
+ <a u="8B93" b="D7 8C"/>
+ <a u="8B94" b="D7 8D"/>
+ <a u="8B95" b="D7 8E"/>
+ <a u="8B96" b="D7 8F"/>
+ <a u="8B97" b="D7 90"/>
+ <a u="8B98" b="D7 91"/>
+ <a u="8B99" b="D7 92"/>
+ <a u="8B9A" b="D7 93"/>
+ <a u="8B9B" b="D7 94"/>
+ <a u="8B9C" b="D7 95"/>
+ <a u="8B9D" b="D7 96"/>
+ <a u="8B9E" b="D7 97"/>
+ <a u="8B9F" b="D7 98"/>
+ <a u="8BA0" b="DA A5"/>
+ <a u="8BA1" b="BC C6"/>
+ <a u="8BA2" b="B6 A9"/>
+ <a u="8BA3" b="B8 BC"/>
+ <a u="8BA4" b="C8 CF"/>
+ <a u="8BA5" b="BC A5"/>
+ <a u="8BA6" b="DA A6"/>
+ <a u="8BA7" b="DA A7"/>
+ <a u="8BA8" b="CC D6"/>
+ <a u="8BA9" b="C8 C3"/>
+ <a u="8BAA" b="DA A8"/>
+ <a u="8BAB" b="C6 FD"/>
+ <a u="8BAC" b="D7 99"/>
+ <a u="8BAD" b="D1 B5"/>
+ <a u="8BAE" b="D2 E9"/>
+ <a u="8BAF" b="D1 B6"/>
+ <a u="8BB0" b="BC C7"/>
+ <a u="8BB1" b="D7 9A"/>
+ <a u="8BB2" b="BD B2"/>
+ <a u="8BB3" b="BB E4"/>
+ <a u="8BB4" b="DA A9"/>
+ <a u="8BB5" b="DA AA"/>
+ <a u="8BB6" b="D1 C8"/>
+ <a u="8BB7" b="DA AB"/>
+ <a u="8BB8" b="D0 ED"/>
+ <a u="8BB9" b="B6 EF"/>
+ <a u="8BBA" b="C2 DB"/>
+ <a u="8BBB" b="D7 9B"/>
+ <a u="8BBC" b="CB CF"/>
+ <a u="8BBD" b="B7 ED"/>
+ <a u="8BBE" b="C9 E8"/>
+ <a u="8BBF" b="B7 C3"/>
+ <a u="8BC0" b="BE F7"/>
+ <a u="8BC1" b="D6 A4"/>
+ <a u="8BC2" b="DA AC"/>
+ <a u="8BC3" b="DA AD"/>
+ <a u="8BC4" b="C6 C0"/>
+ <a u="8BC5" b="D7 E7"/>
+ <a u="8BC6" b="CA B6"/>
+ <a u="8BC7" b="D7 9C"/>
+ <a u="8BC8" b="D5 A9"/>
+ <a u="8BC9" b="CB DF"/>
+ <a u="8BCA" b="D5 EF"/>
+ <a u="8BCB" b="DA AE"/>
+ <a u="8BCC" b="D6 DF"/>
+ <a u="8BCD" b="B4 CA"/>
+ <a u="8BCE" b="DA B0"/>
+ <a u="8BCF" b="DA AF"/>
+ <a u="8BD0" b="D7 9D"/>
+ <a u="8BD1" b="D2 EB"/>
+ <a u="8BD2" b="DA B1"/>
+ <a u="8BD3" b="DA B2"/>
+ <a u="8BD4" b="DA B3"/>
+ <a u="8BD5" b="CA D4"/>
+ <a u="8BD6" b="DA B4"/>
+ <a u="8BD7" b="CA AB"/>
+ <a u="8BD8" b="DA B5"/>
+ <a u="8BD9" b="DA B6"/>
+ <a u="8BDA" b="B3 CF"/>
+ <a u="8BDB" b="D6 EF"/>
+ <a u="8BDC" b="DA B7"/>
+ <a u="8BDD" b="BB B0"/>
+ <a u="8BDE" b="B5 AE"/>
+ <a u="8BDF" b="DA B8"/>
+ <a u="8BE0" b="DA B9"/>
+ <a u="8BE1" b="B9 EE"/>
+ <a u="8BE2" b="D1 AF"/>
+ <a u="8BE3" b="D2 E8"/>
+ <a u="8BE4" b="DA BA"/>
+ <a u="8BE5" b="B8 C3"/>
+ <a u="8BE6" b="CF EA"/>
+ <a u="8BE7" b="B2 EF"/>
+ <a u="8BE8" b="DA BB"/>
+ <a u="8BE9" b="DA BC"/>
+ <a u="8BEA" b="D7 9E"/>
+ <a u="8BEB" b="BD EB"/>
+ <a u="8BEC" b="CE DC"/>
+ <a u="8BED" b="D3 EF"/>
+ <a u="8BEE" b="DA BD"/>
+ <a u="8BEF" b="CE F3"/>
+ <a u="8BF0" b="DA BE"/>
+ <a u="8BF1" b="D3 D5"/>
+ <a u="8BF2" b="BB E5"/>
+ <a u="8BF3" b="DA BF"/>
+ <a u="8BF4" b="CB B5"/>
+ <a u="8BF5" b="CB D0"/>
+ <a u="8BF6" b="DA C0"/>
+ <a u="8BF7" b="C7 EB"/>
+ <a u="8BF8" b="D6 EE"/>
+ <a u="8BF9" b="DA C1"/>
+ <a u="8BFA" b="C5 B5"/>
+ <a u="8BFB" b="B6 C1"/>
+ <a u="8BFC" b="DA C2"/>
+ <a u="8BFD" b="B7 CC"/>
+ <a u="8BFE" b="BF CE"/>
+ <a u="8BFF" b="DA C3"/>
+ <a u="8C00" b="DA C4"/>
+ <a u="8C01" b="CB AD"/>
+ <a u="8C02" b="DA C5"/>
+ <a u="8C03" b="B5 F7"/>
+ <a u="8C04" b="DA C6"/>
+ <a u="8C05" b="C1 C2"/>
+ <a u="8C06" b="D7 BB"/>
+ <a u="8C07" b="DA C7"/>
+ <a u="8C08" b="CC B8"/>
+ <a u="8C09" b="D7 9F"/>
+ <a u="8C0A" b="D2 EA"/>
+ <a u="8C0B" b="C4 B1"/>
+ <a u="8C0C" b="DA C8"/>
+ <a u="8C0D" b="B5 FD"/>
+ <a u="8C0E" b="BB D1"/>
+ <a u="8C0F" b="DA C9"/>
+ <a u="8C10" b="D0 B3"/>
+ <a u="8C11" b="DA CA"/>
+ <a u="8C12" b="DA CB"/>
+ <a u="8C13" b="CE BD"/>
+ <a u="8C14" b="DA CC"/>
+ <a u="8C15" b="DA CD"/>
+ <a u="8C16" b="DA CE"/>
+ <a u="8C17" b="B2 F7"/>
+ <a u="8C18" b="DA D1"/>
+ <a u="8C19" b="DA CF"/>
+ <a u="8C1A" b="D1 E8"/>
+ <a u="8C1B" b="DA D0"/>
+ <a u="8C1C" b="C3 D5"/>
+ <a u="8C1D" b="DA D2"/>
+ <a u="8C1E" b="D7 A0"/>
+ <a u="8C1F" b="DA D3"/>
+ <a u="8C20" b="DA D4"/>
+ <a u="8C21" b="DA D5"/>
+ <a u="8C22" b="D0 BB"/>
+ <a u="8C23" b="D2 A5"/>
+ <a u="8C24" b="B0 F9"/>
+ <a u="8C25" b="DA D6"/>
+ <a u="8C26" b="C7 AB"/>
+ <a u="8C27" b="DA D7"/>
+ <a u="8C28" b="BD F7"/>
+ <a u="8C29" b="C3 A1"/>
+ <a u="8C2A" b="DA D8"/>
+ <a u="8C2B" b="DA D9"/>
+ <a u="8C2C" b="C3 FD"/>
+ <a u="8C2D" b="CC B7"/>
+ <a u="8C2E" b="DA DA"/>
+ <a u="8C2F" b="DA DB"/>
+ <a u="8C30" b="C0 BE"/>
+ <a u="8C31" b="C6 D7"/>
+ <a u="8C32" b="DA DC"/>
+ <a u="8C33" b="DA DD"/>
+ <a u="8C34" b="C7 B4"/>
+ <a u="8C35" b="DA DE"/>
+ <a u="8C36" b="DA DF"/>
+ <a u="8C37" b="B9 C8"/>
+ <a u="8C38" b="D8 40"/>
+ <a u="8C39" b="D8 41"/>
+ <a u="8C3A" b="D8 42"/>
+ <a u="8C3B" b="D8 43"/>
+ <a u="8C3C" b="D8 44"/>
+ <a u="8C3D" b="D8 45"/>
+ <a u="8C3E" b="D8 46"/>
+ <a u="8C3F" b="D8 47"/>
+ <a u="8C40" b="D8 48"/>
+ <a u="8C41" b="BB ED"/>
+ <a u="8C42" b="D8 49"/>
+ <a u="8C43" b="D8 4A"/>
+ <a u="8C44" b="D8 4B"/>
+ <a u="8C45" b="D8 4C"/>
+ <a u="8C46" b="B6 B9"/>
+ <a u="8C47" b="F4 F8"/>
+ <a u="8C48" b="D8 4D"/>
+ <a u="8C49" b="F4 F9"/>
+ <a u="8C4A" b="D8 4E"/>
+ <a u="8C4B" b="D8 4F"/>
+ <a u="8C4C" b="CD E3"/>
+ <a u="8C4D" b="D8 50"/>
+ <a u="8C4E" b="D8 51"/>
+ <a u="8C4F" b="D8 52"/>
+ <a u="8C50" b="D8 53"/>
+ <a u="8C51" b="D8 54"/>
+ <a u="8C52" b="D8 55"/>
+ <a u="8C53" b="D8 56"/>
+ <a u="8C54" b="D8 57"/>
+ <a u="8C55" b="F5 B9"/>
+ <a u="8C56" b="D8 58"/>
+ <a u="8C57" b="D8 59"/>
+ <a u="8C58" b="D8 5A"/>
+ <a u="8C59" b="D8 5B"/>
+ <a u="8C5A" b="EB E0"/>
+ <a u="8C5B" b="D8 5C"/>
+ <a u="8C5C" b="D8 5D"/>
+ <a u="8C5D" b="D8 5E"/>
+ <a u="8C5E" b="D8 5F"/>
+ <a u="8C5F" b="D8 60"/>
+ <a u="8C60" b="D8 61"/>
+ <a u="8C61" b="CF F3"/>
+ <a u="8C62" b="BB BF"/>
+ <a u="8C63" b="D8 62"/>
+ <a u="8C64" b="D8 63"/>
+ <a u="8C65" b="D8 64"/>
+ <a u="8C66" b="D8 65"/>
+ <a u="8C67" b="D8 66"/>
+ <a u="8C68" b="D8 67"/>
+ <a u="8C69" b="D8 68"/>
+ <a u="8C6A" b="BA C0"/>
+ <a u="8C6B" b="D4 A5"/>
+ <a u="8C6C" b="D8 69"/>
+ <a u="8C6D" b="D8 6A"/>
+ <a u="8C6E" b="D8 6B"/>
+ <a u="8C6F" b="D8 6C"/>
+ <a u="8C70" b="D8 6D"/>
+ <a u="8C71" b="D8 6E"/>
+ <a u="8C72" b="D8 6F"/>
+ <a u="8C73" b="E1 D9"/>
+ <a u="8C74" b="D8 70"/>
+ <a u="8C75" b="D8 71"/>
+ <a u="8C76" b="D8 72"/>
+ <a u="8C77" b="D8 73"/>
+ <a u="8C78" b="F5 F4"/>
+ <a u="8C79" b="B1 AA"/>
+ <a u="8C7A" b="B2 F2"/>
+ <a u="8C7B" b="D8 74"/>
+ <a u="8C7C" b="D8 75"/>
+ <a u="8C7D" b="D8 76"/>
+ <a u="8C7E" b="D8 77"/>
+ <a u="8C7F" b="D8 78"/>
+ <a u="8C80" b="D8 79"/>
+ <a u="8C81" b="D8 7A"/>
+ <a u="8C82" b="F5 F5"/>
+ <a u="8C83" b="D8 7B"/>
+ <a u="8C84" b="D8 7C"/>
+ <a u="8C85" b="F5 F7"/>
+ <a u="8C86" b="D8 7D"/>
+ <a u="8C87" b="D8 7E"/>
+ <a u="8C88" b="D8 80"/>
+ <a u="8C89" b="BA D1"/>
+ <a u="8C8A" b="F5 F6"/>
+ <a u="8C8B" b="D8 81"/>
+ <a u="8C8C" b="C3 B2"/>
+ <a u="8C8D" b="D8 82"/>
+ <a u="8C8E" b="D8 83"/>
+ <a u="8C8F" b="D8 84"/>
+ <a u="8C90" b="D8 85"/>
+ <a u="8C91" b="D8 86"/>
+ <a u="8C92" b="D8 87"/>
+ <a u="8C93" b="D8 88"/>
+ <a u="8C94" b="F5 F9"/>
+ <a u="8C95" b="D8 89"/>
+ <a u="8C96" b="D8 8A"/>
+ <a u="8C97" b="D8 8B"/>
+ <a u="8C98" b="F5 F8"/>
+ <a u="8C99" b="D8 8C"/>
+ <a u="8C9A" b="D8 8D"/>
+ <a u="8C9B" b="D8 8E"/>
+ <a u="8C9C" b="D8 8F"/>
+ <a u="8C9D" b="D8 90"/>
+ <a u="8C9E" b="D8 91"/>
+ <a u="8C9F" b="D8 92"/>
+ <a u="8CA0" b="D8 93"/>
+ <a u="8CA1" b="D8 94"/>
+ <a u="8CA2" b="D8 95"/>
+ <a u="8CA3" b="D8 96"/>
+ <a u="8CA4" b="D8 97"/>
+ <a u="8CA5" b="D8 98"/>
+ <a u="8CA6" b="D8 99"/>
+ <a u="8CA7" b="D8 9A"/>
+ <a u="8CA8" b="D8 9B"/>
+ <a u="8CA9" b="D8 9C"/>
+ <a u="8CAA" b="D8 9D"/>
+ <a u="8CAB" b="D8 9E"/>
+ <a u="8CAC" b="D8 9F"/>
+ <a u="8CAD" b="D8 A0"/>
+ <a u="8CAE" b="D9 40"/>
+ <a u="8CAF" b="D9 41"/>
+ <a u="8CB0" b="D9 42"/>
+ <a u="8CB1" b="D9 43"/>
+ <a u="8CB2" b="D9 44"/>
+ <a u="8CB3" b="D9 45"/>
+ <a u="8CB4" b="D9 46"/>
+ <a u="8CB5" b="D9 47"/>
+ <a u="8CB6" b="D9 48"/>
+ <a u="8CB7" b="D9 49"/>
+ <a u="8CB8" b="D9 4A"/>
+ <a u="8CB9" b="D9 4B"/>
+ <a u="8CBA" b="D9 4C"/>
+ <a u="8CBB" b="D9 4D"/>
+ <a u="8CBC" b="D9 4E"/>
+ <a u="8CBD" b="D9 4F"/>
+ <a u="8CBE" b="D9 50"/>
+ <a u="8CBF" b="D9 51"/>
+ <a u="8CC0" b="D9 52"/>
+ <a u="8CC1" b="D9 53"/>
+ <a u="8CC2" b="D9 54"/>
+ <a u="8CC3" b="D9 55"/>
+ <a u="8CC4" b="D9 56"/>
+ <a u="8CC5" b="D9 57"/>
+ <a u="8CC6" b="D9 58"/>
+ <a u="8CC7" b="D9 59"/>
+ <a u="8CC8" b="D9 5A"/>
+ <a u="8CC9" b="D9 5B"/>
+ <a u="8CCA" b="D9 5C"/>
+ <a u="8CCB" b="D9 5D"/>
+ <a u="8CCC" b="D9 5E"/>
+ <a u="8CCD" b="D9 5F"/>
+ <a u="8CCE" b="D9 60"/>
+ <a u="8CCF" b="D9 61"/>
+ <a u="8CD0" b="D9 62"/>
+ <a u="8CD1" b="D9 63"/>
+ <a u="8CD2" b="D9 64"/>
+ <a u="8CD3" b="D9 65"/>
+ <a u="8CD4" b="D9 66"/>
+ <a u="8CD5" b="D9 67"/>
+ <a u="8CD6" b="D9 68"/>
+ <a u="8CD7" b="D9 69"/>
+ <a u="8CD8" b="D9 6A"/>
+ <a u="8CD9" b="D9 6B"/>
+ <a u="8CDA" b="D9 6C"/>
+ <a u="8CDB" b="D9 6D"/>
+ <a u="8CDC" b="D9 6E"/>
+ <a u="8CDD" b="D9 6F"/>
+ <a u="8CDE" b="D9 70"/>
+ <a u="8CDF" b="D9 71"/>
+ <a u="8CE0" b="D9 72"/>
+ <a u="8CE1" b="D9 73"/>
+ <a u="8CE2" b="D9 74"/>
+ <a u="8CE3" b="D9 75"/>
+ <a u="8CE4" b="D9 76"/>
+ <a u="8CE5" b="D9 77"/>
+ <a u="8CE6" b="D9 78"/>
+ <a u="8CE7" b="D9 79"/>
+ <a u="8CE8" b="D9 7A"/>
+ <a u="8CE9" b="D9 7B"/>
+ <a u="8CEA" b="D9 7C"/>
+ <a u="8CEB" b="D9 7D"/>
+ <a u="8CEC" b="D9 7E"/>
+ <a u="8CED" b="D9 80"/>
+ <a u="8CEE" b="D9 81"/>
+ <a u="8CEF" b="D9 82"/>
+ <a u="8CF0" b="D9 83"/>
+ <a u="8CF1" b="D9 84"/>
+ <a u="8CF2" b="D9 85"/>
+ <a u="8CF3" b="D9 86"/>
+ <a u="8CF4" b="D9 87"/>
+ <a u="8CF5" b="D9 88"/>
+ <a u="8CF6" b="D9 89"/>
+ <a u="8CF7" b="D9 8A"/>
+ <a u="8CF8" b="D9 8B"/>
+ <a u="8CF9" b="D9 8C"/>
+ <a u="8CFA" b="D9 8D"/>
+ <a u="8CFB" b="D9 8E"/>
+ <a u="8CFC" b="D9 8F"/>
+ <a u="8CFD" b="D9 90"/>
+ <a u="8CFE" b="D9 91"/>
+ <a u="8CFF" b="D9 92"/>
+ <a u="8D00" b="D9 93"/>
+ <a u="8D01" b="D9 94"/>
+ <a u="8D02" b="D9 95"/>
+ <a u="8D03" b="D9 96"/>
+ <a u="8D04" b="D9 97"/>
+ <a u="8D05" b="D9 98"/>
+ <a u="8D06" b="D9 99"/>
+ <a u="8D07" b="D9 9A"/>
+ <a u="8D08" b="D9 9B"/>
+ <a u="8D09" b="D9 9C"/>
+ <a u="8D0A" b="D9 9D"/>
+ <a u="8D0B" b="D9 9E"/>
+ <a u="8D0C" b="D9 9F"/>
+ <a u="8D0D" b="D9 A0"/>
+ <a u="8D0E" b="DA 40"/>
+ <a u="8D0F" b="DA 41"/>
+ <a u="8D10" b="DA 42"/>
+ <a u="8D11" b="DA 43"/>
+ <a u="8D12" b="DA 44"/>
+ <a u="8D13" b="DA 45"/>
+ <a u="8D14" b="DA 46"/>
+ <a u="8D15" b="DA 47"/>
+ <a u="8D16" b="DA 48"/>
+ <a u="8D17" b="DA 49"/>
+ <a u="8D18" b="DA 4A"/>
+ <a u="8D19" b="DA 4B"/>
+ <a u="8D1A" b="DA 4C"/>
+ <a u="8D1B" b="DA 4D"/>
+ <a u="8D1C" b="DA 4E"/>
+ <a u="8D1D" b="B1 B4"/>
+ <a u="8D1E" b="D5 EA"/>
+ <a u="8D1F" b="B8 BA"/>
+ <a u="8D20" b="DA 4F"/>
+ <a u="8D21" b="B9 B1"/>
+ <a u="8D22" b="B2 C6"/>
+ <a u="8D23" b="D4 F0"/>
+ <a u="8D24" b="CF CD"/>
+ <a u="8D25" b="B0 DC"/>
+ <a u="8D26" b="D5 CB"/>
+ <a u="8D27" b="BB F5"/>
+ <a u="8D28" b="D6 CA"/>
+ <a u="8D29" b="B7 B7"/>
+ <a u="8D2A" b="CC B0"/>
+ <a u="8D2B" b="C6 B6"/>
+ <a u="8D2C" b="B1 E1"/>
+ <a u="8D2D" b="B9 BA"/>
+ <a u="8D2E" b="D6 FC"/>
+ <a u="8D2F" b="B9 E1"/>
+ <a u="8D30" b="B7 A1"/>
+ <a u="8D31" b="BC FA"/>
+ <a u="8D32" b="EA DA"/>
+ <a u="8D33" b="EA DB"/>
+ <a u="8D34" b="CC F9"/>
+ <a u="8D35" b="B9 F3"/>
+ <a u="8D36" b="EA DC"/>
+ <a u="8D37" b="B4 FB"/>
+ <a u="8D38" b="C3 B3"/>
+ <a u="8D39" b="B7 D1"/>
+ <a u="8D3A" b="BA D8"/>
+ <a u="8D3B" b="EA DD"/>
+ <a u="8D3C" b="D4 F4"/>
+ <a u="8D3D" b="EA DE"/>
+ <a u="8D3E" b="BC D6"/>
+ <a u="8D3F" b="BB DF"/>
+ <a u="8D40" b="EA DF"/>
+ <a u="8D41" b="C1 DE"/>
+ <a u="8D42" b="C2 B8"/>
+ <a u="8D43" b="D4 DF"/>
+ <a u="8D44" b="D7 CA"/>
+ <a u="8D45" b="EA E0"/>
+ <a u="8D46" b="EA E1"/>
+ <a u="8D47" b="EA E4"/>
+ <a u="8D48" b="EA E2"/>
+ <a u="8D49" b="EA E3"/>
+ <a u="8D4A" b="C9 DE"/>
+ <a u="8D4B" b="B8 B3"/>
+ <a u="8D4C" b="B6 C4"/>
+ <a u="8D4D" b="EA E5"/>
+ <a u="8D4E" b="CA EA"/>
+ <a u="8D4F" b="C9 CD"/>
+ <a u="8D50" b="B4 CD"/>
+ <a u="8D51" b="DA 50"/>
+ <a u="8D52" b="DA 51"/>
+ <a u="8D53" b="E2 D9"/>
+ <a u="8D54" b="C5 E2"/>
+ <a u="8D55" b="EA E6"/>
+ <a u="8D56" b="C0 B5"/>
+ <a u="8D57" b="DA 52"/>
+ <a u="8D58" b="D7 B8"/>
+ <a u="8D59" b="EA E7"/>
+ <a u="8D5A" b="D7 AC"/>
+ <a u="8D5B" b="C8 FC"/>
+ <a u="8D5C" b="D8 D3"/>
+ <a u="8D5D" b="D8 CD"/>
+ <a u="8D5E" b="D4 DE"/>
+ <a u="8D5F" b="DA 53"/>
+ <a u="8D60" b="D4 F9"/>
+ <a u="8D61" b="C9 C4"/>
+ <a u="8D62" b="D3 AE"/>
+ <a u="8D63" b="B8 D3"/>
+ <a u="8D64" b="B3 E0"/>
+ <a u="8D65" b="DA 54"/>
+ <a u="8D66" b="C9 E2"/>
+ <a u="8D67" b="F4 F6"/>
+ <a u="8D68" b="DA 55"/>
+ <a u="8D69" b="DA 56"/>
+ <a u="8D6A" b="DA 57"/>
+ <a u="8D6B" b="BA D5"/>
+ <a u="8D6C" b="DA 58"/>
+ <a u="8D6D" b="F4 F7"/>
+ <a u="8D6E" b="DA 59"/>
+ <a u="8D6F" b="DA 5A"/>
+ <a u="8D70" b="D7 DF"/>
+ <a u="8D71" b="DA 5B"/>
+ <a u="8D72" b="DA 5C"/>
+ <a u="8D73" b="F4 F1"/>
+ <a u="8D74" b="B8 B0"/>
+ <a u="8D75" b="D5 D4"/>
+ <a u="8D76" b="B8 CF"/>
+ <a u="8D77" b="C6 F0"/>
+ <a u="8D78" b="DA 5D"/>
+ <a u="8D79" b="DA 5E"/>
+ <a u="8D7A" b="DA 5F"/>
+ <a u="8D7B" b="DA 60"/>
+ <a u="8D7C" b="DA 61"/>
+ <a u="8D7D" b="DA 62"/>
+ <a u="8D7E" b="DA 63"/>
+ <a u="8D7F" b="DA 64"/>
+ <a u="8D80" b="DA 65"/>
+ <a u="8D81" b="B3 C3"/>
+ <a u="8D82" b="DA 66"/>
+ <a u="8D83" b="DA 67"/>
+ <a u="8D84" b="F4 F2"/>
+ <a u="8D85" b="B3 AC"/>
+ <a u="8D86" b="DA 68"/>
+ <a u="8D87" b="DA 69"/>
+ <a u="8D88" b="DA 6A"/>
+ <a u="8D89" b="DA 6B"/>
+ <a u="8D8A" b="D4 BD"/>
+ <a u="8D8B" b="C7 F7"/>
+ <a u="8D8C" b="DA 6C"/>
+ <a u="8D8D" b="DA 6D"/>
+ <a u="8D8E" b="DA 6E"/>
+ <a u="8D8F" b="DA 6F"/>
+ <a u="8D90" b="DA 70"/>
+ <a u="8D91" b="F4 F4"/>
+ <a u="8D92" b="DA 71"/>
+ <a u="8D93" b="DA 72"/>
+ <a u="8D94" b="F4 F3"/>
+ <a u="8D95" b="DA 73"/>
+ <a u="8D96" b="DA 74"/>
+ <a u="8D97" b="DA 75"/>
+ <a u="8D98" b="DA 76"/>
+ <a u="8D99" b="DA 77"/>
+ <a u="8D9A" b="DA 78"/>
+ <a u="8D9B" b="DA 79"/>
+ <a u="8D9C" b="DA 7A"/>
+ <a u="8D9D" b="DA 7B"/>
+ <a u="8D9E" b="DA 7C"/>
+ <a u="8D9F" b="CC CB"/>
+ <a u="8DA0" b="DA 7D"/>
+ <a u="8DA1" b="DA 7E"/>
+ <a u="8DA2" b="DA 80"/>
+ <a u="8DA3" b="C8 A4"/>
+ <a u="8DA4" b="DA 81"/>
+ <a u="8DA5" b="DA 82"/>
+ <a u="8DA6" b="DA 83"/>
+ <a u="8DA7" b="DA 84"/>
+ <a u="8DA8" b="DA 85"/>
+ <a u="8DA9" b="DA 86"/>
+ <a u="8DAA" b="DA 87"/>
+ <a u="8DAB" b="DA 88"/>
+ <a u="8DAC" b="DA 89"/>
+ <a u="8DAD" b="DA 8A"/>
+ <a u="8DAE" b="DA 8B"/>
+ <a u="8DAF" b="DA 8C"/>
+ <a u="8DB0" b="DA 8D"/>
+ <a u="8DB1" b="F4 F5"/>
+ <a u="8DB2" b="DA 8E"/>
+ <a u="8DB3" b="D7 E3"/>
+ <a u="8DB4" b="C5 BF"/>
+ <a u="8DB5" b="F5 C0"/>
+ <a u="8DB6" b="DA 8F"/>
+ <a u="8DB7" b="DA 90"/>
+ <a u="8DB8" b="F5 BB"/>
+ <a u="8DB9" b="DA 91"/>
+ <a u="8DBA" b="F5 C3"/>
+ <a u="8DBB" b="DA 92"/>
+ <a u="8DBC" b="F5 C2"/>
+ <a u="8DBD" b="DA 93"/>
+ <a u="8DBE" b="D6 BA"/>
+ <a u="8DBF" b="F5 C1"/>
+ <a u="8DC0" b="DA 94"/>
+ <a u="8DC1" b="DA 95"/>
+ <a u="8DC2" b="DA 96"/>
+ <a u="8DC3" b="D4 BE"/>
+ <a u="8DC4" b="F5 C4"/>
+ <a u="8DC5" b="DA 97"/>
+ <a u="8DC6" b="F5 CC"/>
+ <a u="8DC7" b="DA 98"/>
+ <a u="8DC8" b="DA 99"/>
+ <a u="8DC9" b="DA 9A"/>
+ <a u="8DCA" b="DA 9B"/>
+ <a u="8DCB" b="B0 CF"/>
+ <a u="8DCC" b="B5 F8"/>
+ <a u="8DCD" b="DA 9C"/>
+ <a u="8DCE" b="F5 C9"/>
+ <a u="8DCF" b="F5 CA"/>
+ <a u="8DD0" b="DA 9D"/>
+ <a u="8DD1" b="C5 DC"/>
+ <a u="8DD2" b="DA 9E"/>
+ <a u="8DD3" b="DA 9F"/>
+ <a u="8DD4" b="DA A0"/>
+ <a u="8DD5" b="DB 40"/>
+ <a u="8DD6" b="F5 C5"/>
+ <a u="8DD7" b="F5 C6"/>
+ <a u="8DD8" b="DB 41"/>
+ <a u="8DD9" b="DB 42"/>
+ <a u="8DDA" b="F5 C7"/>
+ <a u="8DDB" b="F5 CB"/>
+ <a u="8DDC" b="DB 43"/>
+ <a u="8DDD" b="BE E0"/>
+ <a u="8DDE" b="F5 C8"/>
+ <a u="8DDF" b="B8 FA"/>
+ <a u="8DE0" b="DB 44"/>
+ <a u="8DE1" b="DB 45"/>
+ <a u="8DE2" b="DB 46"/>
+ <a u="8DE3" b="F5 D0"/>
+ <a u="8DE4" b="F5 D3"/>
+ <a u="8DE5" b="DB 47"/>
+ <a u="8DE6" b="DB 48"/>
+ <a u="8DE7" b="DB 49"/>
+ <a u="8DE8" b="BF E7"/>
+ <a u="8DE9" b="DB 4A"/>
+ <a u="8DEA" b="B9 F2"/>
+ <a u="8DEB" b="F5 BC"/>
+ <a u="8DEC" b="F5 CD"/>
+ <a u="8DED" b="DB 4B"/>
+ <a u="8DEE" b="DB 4C"/>
+ <a u="8DEF" b="C2 B7"/>
+ <a u="8DF0" b="DB 4D"/>
+ <a u="8DF1" b="DB 4E"/>
+ <a u="8DF2" b="DB 4F"/>
+ <a u="8DF3" b="CC F8"/>
+ <a u="8DF4" b="DB 50"/>
+ <a u="8DF5" b="BC F9"/>
+ <a u="8DF6" b="DB 51"/>
+ <a u="8DF7" b="F5 CE"/>
+ <a u="8DF8" b="F5 CF"/>
+ <a u="8DF9" b="F5 D1"/>
+ <a u="8DFA" b="B6 E5"/>
+ <a u="8DFB" b="F5 D2"/>
+ <a u="8DFC" b="DB 52"/>
+ <a u="8DFD" b="F5 D5"/>
+ <a u="8DFE" b="DB 53"/>
+ <a u="8DFF" b="DB 54"/>
+ <a u="8E00" b="DB 55"/>
+ <a u="8E01" b="DB 56"/>
+ <a u="8E02" b="DB 57"/>
+ <a u="8E03" b="DB 58"/>
+ <a u="8E04" b="DB 59"/>
+ <a u="8E05" b="F5 BD"/>
+ <a u="8E06" b="DB 5A"/>
+ <a u="8E07" b="DB 5B"/>
+ <a u="8E08" b="DB 5C"/>
+ <a u="8E09" b="F5 D4"/>
+ <a u="8E0A" b="D3 BB"/>
+ <a u="8E0B" b="DB 5D"/>
+ <a u="8E0C" b="B3 EC"/>
+ <a u="8E0D" b="DB 5E"/>
+ <a u="8E0E" b="DB 5F"/>
+ <a u="8E0F" b="CC A4"/>
+ <a u="8E10" b="DB 60"/>
+ <a u="8E11" b="DB 61"/>
+ <a u="8E12" b="DB 62"/>
+ <a u="8E13" b="DB 63"/>
+ <a u="8E14" b="F5 D6"/>
+ <a u="8E15" b="DB 64"/>
+ <a u="8E16" b="DB 65"/>
+ <a u="8E17" b="DB 66"/>
+ <a u="8E18" b="DB 67"/>
+ <a u="8E19" b="DB 68"/>
+ <a u="8E1A" b="DB 69"/>
+ <a u="8E1B" b="DB 6A"/>
+ <a u="8E1C" b="DB 6B"/>
+ <a u="8E1D" b="F5 D7"/>
+ <a u="8E1E" b="BE E1"/>
+ <a u="8E1F" b="F5 D8"/>
+ <a u="8E20" b="DB 6C"/>
+ <a u="8E21" b="DB 6D"/>
+ <a u="8E22" b="CC DF"/>
+ <a u="8E23" b="F5 DB"/>
+ <a u="8E24" b="DB 6E"/>
+ <a u="8E25" b="DB 6F"/>
+ <a u="8E26" b="DB 70"/>
+ <a u="8E27" b="DB 71"/>
+ <a u="8E28" b="DB 72"/>
+ <a u="8E29" b="B2 C8"/>
+ <a u="8E2A" b="D7 D9"/>
+ <a u="8E2B" b="DB 73"/>
+ <a u="8E2C" b="F5 D9"/>
+ <a u="8E2D" b="DB 74"/>
+ <a u="8E2E" b="F5 DA"/>
+ <a u="8E2F" b="F5 DC"/>
+ <a u="8E30" b="DB 75"/>
+ <a u="8E31" b="F5 E2"/>
+ <a u="8E32" b="DB 76"/>
+ <a u="8E33" b="DB 77"/>
+ <a u="8E34" b="DB 78"/>
+ <a u="8E35" b="F5 E0"/>
+ <a u="8E36" b="DB 79"/>
+ <a u="8E37" b="DB 7A"/>
+ <a u="8E38" b="DB 7B"/>
+ <a u="8E39" b="F5 DF"/>
+ <a u="8E3A" b="F5 DD"/>
+ <a u="8E3B" b="DB 7C"/>
+ <a u="8E3C" b="DB 7D"/>
+ <a u="8E3D" b="F5 E1"/>
+ <a u="8E3E" b="DB 7E"/>
+ <a u="8E3F" b="DB 80"/>
+ <a u="8E40" b="F5 DE"/>
+ <a u="8E41" b="F5 E4"/>
+ <a u="8E42" b="F5 E5"/>
+ <a u="8E43" b="DB 81"/>
+ <a u="8E44" b="CC E3"/>
+ <a u="8E45" b="DB 82"/>
+ <a u="8E46" b="DB 83"/>
+ <a u="8E47" b="E5 BF"/>
+ <a u="8E48" b="B5 B8"/>
+ <a u="8E49" b="F5 E3"/>
+ <a u="8E4A" b="F5 E8"/>
+ <a u="8E4B" b="CC A3"/>
+ <a u="8E4C" b="DB 84"/>
+ <a u="8E4D" b="DB 85"/>
+ <a u="8E4E" b="DB 86"/>
+ <a u="8E4F" b="DB 87"/>
+ <a u="8E50" b="DB 88"/>
+ <a u="8E51" b="F5 E6"/>
+ <a u="8E52" b="F5 E7"/>
+ <a u="8E53" b="DB 89"/>
+ <a u="8E54" b="DB 8A"/>
+ <a u="8E55" b="DB 8B"/>
+ <a u="8E56" b="DB 8C"/>
+ <a u="8E57" b="DB 8D"/>
+ <a u="8E58" b="DB 8E"/>
+ <a u="8E59" b="F5 BE"/>
+ <a u="8E5A" b="DB 8F"/>
+ <a u="8E5B" b="DB 90"/>
+ <a u="8E5C" b="DB 91"/>
+ <a u="8E5D" b="DB 92"/>
+ <a u="8E5E" b="DB 93"/>
+ <a u="8E5F" b="DB 94"/>
+ <a u="8E60" b="DB 95"/>
+ <a u="8E61" b="DB 96"/>
+ <a u="8E62" b="DB 97"/>
+ <a u="8E63" b="DB 98"/>
+ <a u="8E64" b="DB 99"/>
+ <a u="8E65" b="DB 9A"/>
+ <a u="8E66" b="B1 C4"/>
+ <a u="8E67" b="DB 9B"/>
+ <a u="8E68" b="DB 9C"/>
+ <a u="8E69" b="F5 BF"/>
+ <a u="8E6A" b="DB 9D"/>
+ <a u="8E6B" b="DB 9E"/>
+ <a u="8E6C" b="B5 C5"/>
+ <a u="8E6D" b="B2 E4"/>
+ <a u="8E6E" b="DB 9F"/>
+ <a u="8E6F" b="F5 EC"/>
+ <a u="8E70" b="F5 E9"/>
+ <a u="8E71" b="DB A0"/>
+ <a u="8E72" b="B6 D7"/>
+ <a u="8E73" b="DC 40"/>
+ <a u="8E74" b="F5 ED"/>
+ <a u="8E75" b="DC 41"/>
+ <a u="8E76" b="F5 EA"/>
+ <a u="8E77" b="DC 42"/>
+ <a u="8E78" b="DC 43"/>
+ <a u="8E79" b="DC 44"/>
+ <a u="8E7A" b="DC 45"/>
+ <a u="8E7B" b="DC 46"/>
+ <a u="8E7C" b="F5 EB"/>
+ <a u="8E7D" b="DC 47"/>
+ <a u="8E7E" b="DC 48"/>
+ <a u="8E7F" b="B4 DA"/>
+ <a u="8E80" b="DC 49"/>
+ <a u="8E81" b="D4 EA"/>
+ <a u="8E82" b="DC 4A"/>
+ <a u="8E83" b="DC 4B"/>
+ <a u="8E84" b="DC 4C"/>
+ <a u="8E85" b="F5 EE"/>
+ <a u="8E86" b="DC 4D"/>
+ <a u="8E87" b="B3 F9"/>
+ <a u="8E88" b="DC 4E"/>
+ <a u="8E89" b="DC 4F"/>
+ <a u="8E8A" b="DC 50"/>
+ <a u="8E8B" b="DC 51"/>
+ <a u="8E8C" b="DC 52"/>
+ <a u="8E8D" b="DC 53"/>
+ <a u="8E8E" b="DC 54"/>
+ <a u="8E8F" b="F5 EF"/>
+ <a u="8E90" b="F5 F1"/>
+ <a u="8E91" b="DC 55"/>
+ <a u="8E92" b="DC 56"/>
+ <a u="8E93" b="DC 57"/>
+ <a u="8E94" b="F5 F0"/>
+ <a u="8E95" b="DC 58"/>
+ <a u="8E96" b="DC 59"/>
+ <a u="8E97" b="DC 5A"/>
+ <a u="8E98" b="DC 5B"/>
+ <a u="8E99" b="DC 5C"/>
+ <a u="8E9A" b="DC 5D"/>
+ <a u="8E9B" b="DC 5E"/>
+ <a u="8E9C" b="F5 F2"/>
+ <a u="8E9D" b="DC 5F"/>
+ <a u="8E9E" b="F5 F3"/>
+ <a u="8E9F" b="DC 60"/>
+ <a u="8EA0" b="DC 61"/>
+ <a u="8EA1" b="DC 62"/>
+ <a u="8EA2" b="DC 63"/>
+ <a u="8EA3" b="DC 64"/>
+ <a u="8EA4" b="DC 65"/>
+ <a u="8EA5" b="DC 66"/>
+ <a u="8EA6" b="DC 67"/>
+ <a u="8EA7" b="DC 68"/>
+ <a u="8EA8" b="DC 69"/>
+ <a u="8EA9" b="DC 6A"/>
+ <a u="8EAA" b="DC 6B"/>
+ <a u="8EAB" b="C9 ED"/>
+ <a u="8EAC" b="B9 AA"/>
+ <a u="8EAD" b="DC 6C"/>
+ <a u="8EAE" b="DC 6D"/>
+ <a u="8EAF" b="C7 FB"/>
+ <a u="8EB0" b="DC 6E"/>
+ <a u="8EB1" b="DC 6F"/>
+ <a u="8EB2" b="B6 E3"/>
+ <a u="8EB3" b="DC 70"/>
+ <a u="8EB4" b="DC 71"/>
+ <a u="8EB5" b="DC 72"/>
+ <a u="8EB6" b="DC 73"/>
+ <a u="8EB7" b="DC 74"/>
+ <a u="8EB8" b="DC 75"/>
+ <a u="8EB9" b="DC 76"/>
+ <a u="8EBA" b="CC C9"/>
+ <a u="8EBB" b="DC 77"/>
+ <a u="8EBC" b="DC 78"/>
+ <a u="8EBD" b="DC 79"/>
+ <a u="8EBE" b="DC 7A"/>
+ <a u="8EBF" b="DC 7B"/>
+ <a u="8EC0" b="DC 7C"/>
+ <a u="8EC1" b="DC 7D"/>
+ <a u="8EC2" b="DC 7E"/>
+ <a u="8EC3" b="DC 80"/>
+ <a u="8EC4" b="DC 81"/>
+ <a u="8EC5" b="DC 82"/>
+ <a u="8EC6" b="DC 83"/>
+ <a u="8EC7" b="DC 84"/>
+ <a u="8EC8" b="DC 85"/>
+ <a u="8EC9" b="DC 86"/>
+ <a u="8ECA" b="DC 87"/>
+ <a u="8ECB" b="DC 88"/>
+ <a u="8ECC" b="DC 89"/>
+ <a u="8ECD" b="DC 8A"/>
+ <a u="8ECE" b="EA A6"/>
+ <a u="8ECF" b="DC 8B"/>
+ <a u="8ED0" b="DC 8C"/>
+ <a u="8ED1" b="DC 8D"/>
+ <a u="8ED2" b="DC 8E"/>
+ <a u="8ED3" b="DC 8F"/>
+ <a u="8ED4" b="DC 90"/>
+ <a u="8ED5" b="DC 91"/>
+ <a u="8ED6" b="DC 92"/>
+ <a u="8ED7" b="DC 93"/>
+ <a u="8ED8" b="DC 94"/>
+ <a u="8ED9" b="DC 95"/>
+ <a u="8EDA" b="DC 96"/>
+ <a u="8EDB" b="DC 97"/>
+ <a u="8EDC" b="DC 98"/>
+ <a u="8EDD" b="DC 99"/>
+ <a u="8EDE" b="DC 9A"/>
+ <a u="8EDF" b="DC 9B"/>
+ <a u="8EE0" b="DC 9C"/>
+ <a u="8EE1" b="DC 9D"/>
+ <a u="8EE2" b="DC 9E"/>
+ <a u="8EE3" b="DC 9F"/>
+ <a u="8EE4" b="DC A0"/>
+ <a u="8EE5" b="DD 40"/>
+ <a u="8EE6" b="DD 41"/>
+ <a u="8EE7" b="DD 42"/>
+ <a u="8EE8" b="DD 43"/>
+ <a u="8EE9" b="DD 44"/>
+ <a u="8EEA" b="DD 45"/>
+ <a u="8EEB" b="DD 46"/>
+ <a u="8EEC" b="DD 47"/>
+ <a u="8EED" b="DD 48"/>
+ <a u="8EEE" b="DD 49"/>
+ <a u="8EEF" b="DD 4A"/>
+ <a u="8EF0" b="DD 4B"/>
+ <a u="8EF1" b="DD 4C"/>
+ <a u="8EF2" b="DD 4D"/>
+ <a u="8EF3" b="DD 4E"/>
+ <a u="8EF4" b="DD 4F"/>
+ <a u="8EF5" b="DD 50"/>
+ <a u="8EF6" b="DD 51"/>
+ <a u="8EF7" b="DD 52"/>
+ <a u="8EF8" b="DD 53"/>
+ <a u="8EF9" b="DD 54"/>
+ <a u="8EFA" b="DD 55"/>
+ <a u="8EFB" b="DD 56"/>
+ <a u="8EFC" b="DD 57"/>
+ <a u="8EFD" b="DD 58"/>
+ <a u="8EFE" b="DD 59"/>
+ <a u="8EFF" b="DD 5A"/>
+ <a u="8F00" b="DD 5B"/>
+ <a u="8F01" b="DD 5C"/>
+ <a u="8F02" b="DD 5D"/>
+ <a u="8F03" b="DD 5E"/>
+ <a u="8F04" b="DD 5F"/>
+ <a u="8F05" b="DD 60"/>
+ <a u="8F06" b="DD 61"/>
+ <a u="8F07" b="DD 62"/>
+ <a u="8F08" b="DD 63"/>
+ <a u="8F09" b="DD 64"/>
+ <a u="8F0A" b="DD 65"/>
+ <a u="8F0B" b="DD 66"/>
+ <a u="8F0C" b="DD 67"/>
+ <a u="8F0D" b="DD 68"/>
+ <a u="8F0E" b="DD 69"/>
+ <a u="8F0F" b="DD 6A"/>
+ <a u="8F10" b="DD 6B"/>
+ <a u="8F11" b="DD 6C"/>
+ <a u="8F12" b="DD 6D"/>
+ <a u="8F13" b="DD 6E"/>
+ <a u="8F14" b="DD 6F"/>
+ <a u="8F15" b="DD 70"/>
+ <a u="8F16" b="DD 71"/>
+ <a u="8F17" b="DD 72"/>
+ <a u="8F18" b="DD 73"/>
+ <a u="8F19" b="DD 74"/>
+ <a u="8F1A" b="DD 75"/>
+ <a u="8F1B" b="DD 76"/>
+ <a u="8F1C" b="DD 77"/>
+ <a u="8F1D" b="DD 78"/>
+ <a u="8F1E" b="DD 79"/>
+ <a u="8F1F" b="DD 7A"/>
+ <a u="8F20" b="DD 7B"/>
+ <a u="8F21" b="DD 7C"/>
+ <a u="8F22" b="DD 7D"/>
+ <a u="8F23" b="DD 7E"/>
+ <a u="8F24" b="DD 80"/>
+ <a u="8F25" b="DD 81"/>
+ <a u="8F26" b="DD 82"/>
+ <a u="8F27" b="DD 83"/>
+ <a u="8F28" b="DD 84"/>
+ <a u="8F29" b="DD 85"/>
+ <a u="8F2A" b="DD 86"/>
+ <a u="8F2B" b="DD 87"/>
+ <a u="8F2C" b="DD 88"/>
+ <a u="8F2D" b="DD 89"/>
+ <a u="8F2E" b="DD 8A"/>
+ <a u="8F2F" b="DD 8B"/>
+ <a u="8F30" b="DD 8C"/>
+ <a u="8F31" b="DD 8D"/>
+ <a u="8F32" b="DD 8E"/>
+ <a u="8F33" b="DD 8F"/>
+ <a u="8F34" b="DD 90"/>
+ <a u="8F35" b="DD 91"/>
+ <a u="8F36" b="DD 92"/>
+ <a u="8F37" b="DD 93"/>
+ <a u="8F38" b="DD 94"/>
+ <a u="8F39" b="DD 95"/>
+ <a u="8F3A" b="DD 96"/>
+ <a u="8F3B" b="DD 97"/>
+ <a u="8F3C" b="DD 98"/>
+ <a u="8F3D" b="DD 99"/>
+ <a u="8F3E" b="DD 9A"/>
+ <a u="8F3F" b="DD 9B"/>
+ <a u="8F40" b="DD 9C"/>
+ <a u="8F41" b="DD 9D"/>
+ <a u="8F42" b="DD 9E"/>
+ <a u="8F43" b="DD 9F"/>
+ <a u="8F44" b="DD A0"/>
+ <a u="8F45" b="DE 40"/>
+ <a u="8F46" b="DE 41"/>
+ <a u="8F47" b="DE 42"/>
+ <a u="8F48" b="DE 43"/>
+ <a u="8F49" b="DE 44"/>
+ <a u="8F4A" b="DE 45"/>
+ <a u="8F4B" b="DE 46"/>
+ <a u="8F4C" b="DE 47"/>
+ <a u="8F4D" b="DE 48"/>
+ <a u="8F4E" b="DE 49"/>
+ <a u="8F4F" b="DE 4A"/>
+ <a u="8F50" b="DE 4B"/>
+ <a u="8F51" b="DE 4C"/>
+ <a u="8F52" b="DE 4D"/>
+ <a u="8F53" b="DE 4E"/>
+ <a u="8F54" b="DE 4F"/>
+ <a u="8F55" b="DE 50"/>
+ <a u="8F56" b="DE 51"/>
+ <a u="8F57" b="DE 52"/>
+ <a u="8F58" b="DE 53"/>
+ <a u="8F59" b="DE 54"/>
+ <a u="8F5A" b="DE 55"/>
+ <a u="8F5B" b="DE 56"/>
+ <a u="8F5C" b="DE 57"/>
+ <a u="8F5D" b="DE 58"/>
+ <a u="8F5E" b="DE 59"/>
+ <a u="8F5F" b="DE 5A"/>
+ <a u="8F60" b="DE 5B"/>
+ <a u="8F61" b="DE 5C"/>
+ <a u="8F62" b="DE 5D"/>
+ <a u="8F63" b="DE 5E"/>
+ <a u="8F64" b="DE 5F"/>
+ <a u="8F65" b="DE 60"/>
+ <a u="8F66" b="B3 B5"/>
+ <a u="8F67" b="D4 FE"/>
+ <a u="8F68" b="B9 EC"/>
+ <a u="8F69" b="D0 F9"/>
+ <a u="8F6A" b="DE 61"/>
+ <a u="8F6B" b="E9 ED"/>
+ <a u="8F6C" b="D7 AA"/>
+ <a u="8F6D" b="E9 EE"/>
+ <a u="8F6E" b="C2 D6"/>
+ <a u="8F6F" b="C8 ED"/>
+ <a u="8F70" b="BA E4"/>
+ <a u="8F71" b="E9 EF"/>
+ <a u="8F72" b="E9 F0"/>
+ <a u="8F73" b="E9 F1"/>
+ <a u="8F74" b="D6 E1"/>
+ <a u="8F75" b="E9 F2"/>
+ <a u="8F76" b="E9 F3"/>
+ <a u="8F77" b="E9 F5"/>
+ <a u="8F78" b="E9 F4"/>
+ <a u="8F79" b="E9 F6"/>
+ <a u="8F7A" b="E9 F7"/>
+ <a u="8F7B" b="C7 E1"/>
+ <a u="8F7C" b="E9 F8"/>
+ <a u="8F7D" b="D4 D8"/>
+ <a u="8F7E" b="E9 F9"/>
+ <a u="8F7F" b="BD CE"/>
+ <a u="8F80" b="DE 62"/>
+ <a u="8F81" b="E9 FA"/>
+ <a u="8F82" b="E9 FB"/>
+ <a u="8F83" b="BD CF"/>
+ <a u="8F84" b="E9 FC"/>
+ <a u="8F85" b="B8 A8"/>
+ <a u="8F86" b="C1 BE"/>
+ <a u="8F87" b="E9 FD"/>
+ <a u="8F88" b="B1 B2"/>
+ <a u="8F89" b="BB D4"/>
+ <a u="8F8A" b="B9 F5"/>
+ <a u="8F8B" b="E9 FE"/>
+ <a u="8F8C" b="DE 63"/>
+ <a u="8F8D" b="EA A1"/>
+ <a u="8F8E" b="EA A2"/>
+ <a u="8F8F" b="EA A3"/>
+ <a u="8F90" b="B7 F8"/>
+ <a u="8F91" b="BC AD"/>
+ <a u="8F92" b="DE 64"/>
+ <a u="8F93" b="CA E4"/>
+ <a u="8F94" b="E0 CE"/>
+ <a u="8F95" b="D4 AF"/>
+ <a u="8F96" b="CF BD"/>
+ <a u="8F97" b="D5 B7"/>
+ <a u="8F98" b="EA A4"/>
+ <a u="8F99" b="D5 DE"/>
+ <a u="8F9A" b="EA A5"/>
+ <a u="8F9B" b="D0 C1"/>
+ <a u="8F9C" b="B9 BC"/>
+ <a u="8F9D" b="DE 65"/>
+ <a u="8F9E" b="B4 C7"/>
+ <a u="8F9F" b="B1 D9"/>
+ <a u="8FA0" b="DE 66"/>
+ <a u="8FA1" b="DE 67"/>
+ <a u="8FA2" b="DE 68"/>
+ <a u="8FA3" b="C0 B1"/>
+ <a u="8FA4" b="DE 69"/>
+ <a u="8FA5" b="DE 6A"/>
+ <a u="8FA6" b="DE 6B"/>
+ <a u="8FA7" b="DE 6C"/>
+ <a u="8FA8" b="B1 E6"/>
+ <a u="8FA9" b="B1 E7"/>
+ <a u="8FAA" b="DE 6D"/>
+ <a u="8FAB" b="B1 E8"/>
+ <a u="8FAC" b="DE 6E"/>
+ <a u="8FAD" b="DE 6F"/>
+ <a u="8FAE" b="DE 70"/>
+ <a u="8FAF" b="DE 71"/>
+ <a u="8FB0" b="B3 BD"/>
+ <a u="8FB1" b="C8 E8"/>
+ <a u="8FB2" b="DE 72"/>
+ <a u="8FB3" b="DE 73"/>
+ <a u="8FB4" b="DE 74"/>
+ <a u="8FB5" b="DE 75"/>
+ <a u="8FB6" b="E5 C1"/>
+ <a u="8FB7" b="DE 76"/>
+ <a u="8FB8" b="DE 77"/>
+ <a u="8FB9" b="B1 DF"/>
+ <a u="8FBA" b="DE 78"/>
+ <a u="8FBB" b="DE 79"/>
+ <a u="8FBC" b="DE 7A"/>
+ <a u="8FBD" b="C1 C9"/>
+ <a u="8FBE" b="B4 EF"/>
+ <a u="8FBF" b="DE 7B"/>
+ <a u="8FC0" b="DE 7C"/>
+ <a u="8FC1" b="C7 A8"/>
+ <a u="8FC2" b="D3 D8"/>
+ <a u="8FC3" b="DE 7D"/>
+ <a u="8FC4" b="C6 F9"/>
+ <a u="8FC5" b="D1 B8"/>
+ <a u="8FC6" b="DE 7E"/>
+ <a u="8FC7" b="B9 FD"/>
+ <a u="8FC8" b="C2 F5"/>
+ <a u="8FC9" b="DE 80"/>
+ <a u="8FCA" b="DE 81"/>
+ <a u="8FCB" b="DE 82"/>
+ <a u="8FCC" b="DE 83"/>
+ <a u="8FCD" b="DE 84"/>
+ <a u="8FCE" b="D3 AD"/>
+ <a u="8FCF" b="DE 85"/>
+ <a u="8FD0" b="D4 CB"/>
+ <a u="8FD1" b="BD FC"/>
+ <a u="8FD2" b="DE 86"/>
+ <a u="8FD3" b="E5 C2"/>
+ <a u="8FD4" b="B7 B5"/>
+ <a u="8FD5" b="E5 C3"/>
+ <a u="8FD6" b="DE 87"/>
+ <a u="8FD7" b="DE 88"/>
+ <a u="8FD8" b="BB B9"/>
+ <a u="8FD9" b="D5 E2"/>
+ <a u="8FDA" b="DE 89"/>
+ <a u="8FDB" b="BD F8"/>
+ <a u="8FDC" b="D4 B6"/>
+ <a u="8FDD" b="CE A5"/>
+ <a u="8FDE" b="C1 AC"/>
+ <a u="8FDF" b="B3 D9"/>
+ <a u="8FE0" b="DE 8A"/>
+ <a u="8FE1" b="DE 8B"/>
+ <a u="8FE2" b="CC F6"/>
+ <a u="8FE3" b="DE 8C"/>
+ <a u="8FE4" b="E5 C6"/>
+ <a u="8FE5" b="E5 C4"/>
+ <a u="8FE6" b="E5 C8"/>
+ <a u="8FE7" b="DE 8D"/>
+ <a u="8FE8" b="E5 CA"/>
+ <a u="8FE9" b="E5 C7"/>
+ <a u="8FEA" b="B5 CF"/>
+ <a u="8FEB" b="C6 C8"/>
+ <a u="8FEC" b="DE 8E"/>
+ <a u="8FED" b="B5 FC"/>
+ <a u="8FEE" b="E5 C5"/>
+ <a u="8FEF" b="DE 8F"/>
+ <a u="8FF0" b="CA F6"/>
+ <a u="8FF1" b="DE 90"/>
+ <a u="8FF2" b="DE 91"/>
+ <a u="8FF3" b="E5 C9"/>
+ <a u="8FF4" b="DE 92"/>
+ <a u="8FF5" b="DE 93"/>
+ <a u="8FF6" b="DE 94"/>
+ <a u="8FF7" b="C3 D4"/>
+ <a u="8FF8" b="B1 C5"/>
+ <a u="8FF9" b="BC A3"/>
+ <a u="8FFA" b="DE 95"/>
+ <a u="8FFB" b="DE 96"/>
+ <a u="8FFC" b="DE 97"/>
+ <a u="8FFD" b="D7 B7"/>
+ <a u="8FFE" b="DE 98"/>
+ <a u="8FFF" b="DE 99"/>
+ <a u="9000" b="CD CB"/>
+ <a u="9001" b="CB CD"/>
+ <a u="9002" b="CA CA"/>
+ <a u="9003" b="CC D3"/>
+ <a u="9004" b="E5 CC"/>
+ <a u="9005" b="E5 CB"/>
+ <a u="9006" b="C4 E6"/>
+ <a u="9007" b="DE 9A"/>
+ <a u="9008" b="DE 9B"/>
+ <a u="9009" b="D1 A1"/>
+ <a u="900A" b="D1 B7"/>
+ <a u="900B" b="E5 CD"/>
+ <a u="900C" b="DE 9C"/>
+ <a u="900D" b="E5 D0"/>
+ <a u="900E" b="DE 9D"/>
+ <a u="900F" b="CD B8"/>
+ <a u="9010" b="D6 F0"/>
+ <a u="9011" b="E5 CF"/>
+ <a u="9012" b="B5 DD"/>
+ <a u="9013" b="DE 9E"/>
+ <a u="9014" b="CD BE"/>
+ <a u="9015" b="DE 9F"/>
+ <a u="9016" b="E5 D1"/>
+ <a u="9017" b="B6 BA"/>
+ <a u="9018" b="DE A0"/>
+ <a u="9019" b="DF 40"/>
+ <a u="901A" b="CD A8"/>
+ <a u="901B" b="B9 E4"/>
+ <a u="901C" b="DF 41"/>
+ <a u="901D" b="CA C5"/>
+ <a u="901E" b="B3 D1"/>
+ <a u="901F" b="CB D9"/>
+ <a u="9020" b="D4 EC"/>
+ <a u="9021" b="E5 D2"/>
+ <a u="9022" b="B7 EA"/>
+ <a u="9023" b="DF 42"/>
+ <a u="9024" b="DF 43"/>
+ <a u="9025" b="DF 44"/>
+ <a u="9026" b="E5 CE"/>
+ <a u="9027" b="DF 45"/>
+ <a u="9028" b="DF 46"/>
+ <a u="9029" b="DF 47"/>
+ <a u="902A" b="DF 48"/>
+ <a u="902B" b="DF 49"/>
+ <a u="902C" b="DF 4A"/>
+ <a u="902D" b="E5 D5"/>
+ <a u="902E" b="B4 FE"/>
+ <a u="902F" b="E5 D6"/>
+ <a u="9030" b="DF 4B"/>
+ <a u="9031" b="DF 4C"/>
+ <a u="9032" b="DF 4D"/>
+ <a u="9033" b="DF 4E"/>
+ <a u="9034" b="DF 4F"/>
+ <a u="9035" b="E5 D3"/>
+ <a u="9036" b="E5 D4"/>
+ <a u="9037" b="DF 50"/>
+ <a u="9038" b="D2 DD"/>
+ <a u="9039" b="DF 51"/>
+ <a u="903A" b="DF 52"/>
+ <a u="903B" b="C2 DF"/>
+ <a u="903C" b="B1 C6"/>
+ <a u="903D" b="DF 53"/>
+ <a u="903E" b="D3 E2"/>
+ <a u="903F" b="DF 54"/>
+ <a u="9040" b="DF 55"/>
+ <a u="9041" b="B6 DD"/>
+ <a u="9042" b="CB EC"/>
+ <a u="9043" b="DF 56"/>
+ <a u="9044" b="E5 D7"/>
+ <a u="9045" b="DF 57"/>
+ <a u="9046" b="DF 58"/>
+ <a u="9047" b="D3 F6"/>
+ <a u="9048" b="DF 59"/>
+ <a u="9049" b="DF 5A"/>
+ <a u="904A" b="DF 5B"/>
+ <a u="904B" b="DF 5C"/>
+ <a u="904C" b="DF 5D"/>
+ <a u="904D" b="B1 E9"/>
+ <a u="904E" b="DF 5E"/>
+ <a u="904F" b="B6 F4"/>
+ <a u="9050" b="E5 DA"/>
+ <a u="9051" b="E5 D8"/>
+ <a u="9052" b="E5 D9"/>
+ <a u="9053" b="B5 C0"/>
+ <a u="9054" b="DF 5F"/>
+ <a u="9055" b="DF 60"/>
+ <a u="9056" b="DF 61"/>
+ <a u="9057" b="D2 C5"/>
+ <a u="9058" b="E5 DC"/>
+ <a u="9059" b="DF 62"/>
+ <a u="905A" b="DF 63"/>
+ <a u="905B" b="E5 DE"/>
+ <a u="905C" b="DF 64"/>
+ <a u="905D" b="DF 65"/>
+ <a u="905E" b="DF 66"/>
+ <a u="905F" b="DF 67"/>
+ <a u="9060" b="DF 68"/>
+ <a u="9061" b="DF 69"/>
+ <a u="9062" b="E5 DD"/>
+ <a u="9063" b="C7 B2"/>
+ <a u="9064" b="DF 6A"/>
+ <a u="9065" b="D2 A3"/>
+ <a u="9066" b="DF 6B"/>
+ <a u="9067" b="DF 6C"/>
+ <a u="9068" b="E5 DB"/>
+ <a u="9069" b="DF 6D"/>
+ <a u="906A" b="DF 6E"/>
+ <a u="906B" b="DF 6F"/>
+ <a u="906C" b="DF 70"/>
+ <a u="906D" b="D4 E2"/>
+ <a u="906E" b="D5 DA"/>
+ <a u="906F" b="DF 71"/>
+ <a u="9070" b="DF 72"/>
+ <a u="9071" b="DF 73"/>
+ <a u="9072" b="DF 74"/>
+ <a u="9073" b="DF 75"/>
+ <a u="9074" b="E5 E0"/>
+ <a u="9075" b="D7 F1"/>
+ <a u="9076" b="DF 76"/>
+ <a u="9077" b="DF 77"/>
+ <a u="9078" b="DF 78"/>
+ <a u="9079" b="DF 79"/>
+ <a u="907A" b="DF 7A"/>
+ <a u="907B" b="DF 7B"/>
+ <a u="907C" b="DF 7C"/>
+ <a u="907D" b="E5 E1"/>
+ <a u="907E" b="DF 7D"/>
+ <a u="907F" b="B1 DC"/>
+ <a u="9080" b="D1 FB"/>
+ <a u="9081" b="DF 7E"/>
+ <a u="9082" b="E5 E2"/>
+ <a u="9083" b="E5 E4"/>
+ <a u="9084" b="DF 80"/>
+ <a u="9085" b="DF 81"/>
+ <a u="9086" b="DF 82"/>
+ <a u="9087" b="DF 83"/>
+ <a u="9088" b="E5 E3"/>
+ <a u="9089" b="DF 84"/>
+ <a u="908A" b="DF 85"/>
+ <a u="908B" b="E5 E5"/>
+ <a u="908C" b="DF 86"/>
+ <a u="908D" b="DF 87"/>
+ <a u="908E" b="DF 88"/>
+ <a u="908F" b="DF 89"/>
+ <a u="9090" b="DF 8A"/>
+ <a u="9091" b="D2 D8"/>
+ <a u="9092" b="DF 8B"/>
+ <a u="9093" b="B5 CB"/>
+ <a u="9094" b="DF 8C"/>
+ <a u="9095" b="E7 DF"/>
+ <a u="9096" b="DF 8D"/>
+ <a u="9097" b="DA F5"/>
+ <a u="9098" b="DF 8E"/>
+ <a u="9099" b="DA F8"/>
+ <a u="909A" b="DF 8F"/>
+ <a u="909B" b="DA F6"/>
+ <a u="909C" b="DF 90"/>
+ <a u="909D" b="DA F7"/>
+ <a u="909E" b="DF 91"/>
+ <a u="909F" b="DF 92"/>
+ <a u="90A0" b="DF 93"/>
+ <a u="90A1" b="DA FA"/>
+ <a u="90A2" b="D0 CF"/>
+ <a u="90A3" b="C4 C7"/>
+ <a u="90A4" b="DF 94"/>
+ <a u="90A5" b="DF 95"/>
+ <a u="90A6" b="B0 EE"/>
+ <a u="90A7" b="DF 96"/>
+ <a u="90A8" b="DF 97"/>
+ <a u="90A9" b="DF 98"/>
+ <a u="90AA" b="D0 B0"/>
+ <a u="90AB" b="DF 99"/>
+ <a u="90AC" b="DA F9"/>
+ <a u="90AD" b="DF 9A"/>
+ <a u="90AE" b="D3 CA"/>
+ <a u="90AF" b="BA AA"/>
+ <a u="90B0" b="DB A2"/>
+ <a u="90B1" b="C7 F1"/>
+ <a u="90B2" b="DF 9B"/>
+ <a u="90B3" b="DA FC"/>
+ <a u="90B4" b="DA FB"/>
+ <a u="90B5" b="C9 DB"/>
+ <a u="90B6" b="DA FD"/>
+ <a u="90B7" b="DF 9C"/>
+ <a u="90B8" b="DB A1"/>
+ <a u="90B9" b="D7 DE"/>
+ <a u="90BA" b="DA FE"/>
+ <a u="90BB" b="C1 DA"/>
+ <a u="90BC" b="DF 9D"/>
+ <a u="90BD" b="DF 9E"/>
+ <a u="90BE" b="DB A5"/>
+ <a u="90BF" b="DF 9F"/>
+ <a u="90C0" b="DF A0"/>
+ <a u="90C1" b="D3 F4"/>
+ <a u="90C2" b="E0 40"/>
+ <a u="90C3" b="E0 41"/>
+ <a u="90C4" b="DB A7"/>
+ <a u="90C5" b="DB A4"/>
+ <a u="90C6" b="E0 42"/>
+ <a u="90C7" b="DB A8"/>
+ <a u="90C8" b="E0 43"/>
+ <a u="90C9" b="E0 44"/>
+ <a u="90CA" b="BD BC"/>
+ <a u="90CB" b="E0 45"/>
+ <a u="90CC" b="E0 46"/>
+ <a u="90CD" b="E0 47"/>
+ <a u="90CE" b="C0 C9"/>
+ <a u="90CF" b="DB A3"/>
+ <a u="90D0" b="DB A6"/>
+ <a u="90D1" b="D6 A3"/>
+ <a u="90D2" b="E0 48"/>
+ <a u="90D3" b="DB A9"/>
+ <a u="90D4" b="E0 49"/>
+ <a u="90D5" b="E0 4A"/>
+ <a u="90D6" b="E0 4B"/>
+ <a u="90D7" b="DB AD"/>
+ <a u="90D8" b="E0 4C"/>
+ <a u="90D9" b="E0 4D"/>
+ <a u="90DA" b="E0 4E"/>
+ <a u="90DB" b="DB AE"/>
+ <a u="90DC" b="DB AC"/>
+ <a u="90DD" b="BA C2"/>
+ <a u="90DE" b="E0 4F"/>
+ <a u="90DF" b="E0 50"/>
+ <a u="90E0" b="E0 51"/>
+ <a u="90E1" b="BF A4"/>
+ <a u="90E2" b="DB AB"/>
+ <a u="90E3" b="E0 52"/>
+ <a u="90E4" b="E0 53"/>
+ <a u="90E5" b="E0 54"/>
+ <a u="90E6" b="DB AA"/>
+ <a u="90E7" b="D4 C7"/>
+ <a u="90E8" b="B2 BF"/>
+ <a u="90E9" b="E0 55"/>
+ <a u="90EA" b="E0 56"/>
+ <a u="90EB" b="DB AF"/>
+ <a u="90EC" b="E0 57"/>
+ <a u="90ED" b="B9 F9"/>
+ <a u="90EE" b="E0 58"/>
+ <a u="90EF" b="DB B0"/>
+ <a u="90F0" b="E0 59"/>
+ <a u="90F1" b="E0 5A"/>
+ <a u="90F2" b="E0 5B"/>
+ <a u="90F3" b="E0 5C"/>
+ <a u="90F4" b="B3 BB"/>
+ <a u="90F5" b="E0 5D"/>
+ <a u="90F6" b="E0 5E"/>
+ <a u="90F7" b="E0 5F"/>
+ <a u="90F8" b="B5 A6"/>
+ <a u="90F9" b="E0 60"/>
+ <a u="90FA" b="E0 61"/>
+ <a u="90FB" b="E0 62"/>
+ <a u="90FC" b="E0 63"/>
+ <a u="90FD" b="B6 BC"/>
+ <a u="90FE" b="DB B1"/>
+ <a u="90FF" b="E0 64"/>
+ <a u="9100" b="E0 65"/>
+ <a u="9101" b="E0 66"/>
+ <a u="9102" b="B6 F5"/>
+ <a u="9103" b="E0 67"/>
+ <a u="9104" b="DB B2"/>
+ <a u="9105" b="E0 68"/>
+ <a u="9106" b="E0 69"/>
+ <a u="9107" b="E0 6A"/>
+ <a u="9108" b="E0 6B"/>
+ <a u="9109" b="E0 6C"/>
+ <a u="910A" b="E0 6D"/>
+ <a u="910B" b="E0 6E"/>
+ <a u="910C" b="E0 6F"/>
+ <a u="910D" b="E0 70"/>
+ <a u="910E" b="E0 71"/>
+ <a u="910F" b="E0 72"/>
+ <a u="9110" b="E0 73"/>
+ <a u="9111" b="E0 74"/>
+ <a u="9112" b="E0 75"/>
+ <a u="9113" b="E0 76"/>
+ <a u="9114" b="E0 77"/>
+ <a u="9115" b="E0 78"/>
+ <a u="9116" b="E0 79"/>
+ <a u="9117" b="E0 7A"/>
+ <a u="9118" b="E0 7B"/>
+ <a u="9119" b="B1 C9"/>
+ <a u="911A" b="E0 7C"/>
+ <a u="911B" b="E0 7D"/>
+ <a u="911C" b="E0 7E"/>
+ <a u="911D" b="E0 80"/>
+ <a u="911E" b="DB B4"/>
+ <a u="911F" b="E0 81"/>
+ <a u="9120" b="E0 82"/>
+ <a u="9121" b="E0 83"/>
+ <a u="9122" b="DB B3"/>
+ <a u="9123" b="DB B5"/>
+ <a u="9124" b="E0 84"/>
+ <a u="9125" b="E0 85"/>
+ <a u="9126" b="E0 86"/>
+ <a u="9127" b="E0 87"/>
+ <a u="9128" b="E0 88"/>
+ <a u="9129" b="E0 89"/>
+ <a u="912A" b="E0 8A"/>
+ <a u="912B" b="E0 8B"/>
+ <a u="912C" b="E0 8C"/>
+ <a u="912D" b="E0 8D"/>
+ <a u="912E" b="E0 8E"/>
+ <a u="912F" b="DB B7"/>
+ <a u="9130" b="E0 8F"/>
+ <a u="9131" b="DB B6"/>
+ <a u="9132" b="E0 90"/>
+ <a u="9133" b="E0 91"/>
+ <a u="9134" b="E0 92"/>
+ <a u="9135" b="E0 93"/>
+ <a u="9136" b="E0 94"/>
+ <a u="9137" b="E0 95"/>
+ <a u="9138" b="E0 96"/>
+ <a u="9139" b="DB B8"/>
+ <a u="913A" b="E0 97"/>
+ <a u="913B" b="E0 98"/>
+ <a u="913C" b="E0 99"/>
+ <a u="913D" b="E0 9A"/>
+ <a u="913E" b="E0 9B"/>
+ <a u="913F" b="E0 9C"/>
+ <a u="9140" b="E0 9D"/>
+ <a u="9141" b="E0 9E"/>
+ <a u="9142" b="E0 9F"/>
+ <a u="9143" b="DB B9"/>
+ <a u="9144" b="E0 A0"/>
+ <a u="9145" b="E1 40"/>
+ <a u="9146" b="DB BA"/>
+ <a u="9147" b="E1 41"/>
+ <a u="9148" b="E1 42"/>
+ <a u="9149" b="D3 CF"/>
+ <a u="914A" b="F4 FA"/>
+ <a u="914B" b="C7 F5"/>
+ <a u="914C" b="D7 C3"/>
+ <a u="914D" b="C5 E4"/>
+ <a u="914E" b="F4 FC"/>
+ <a u="914F" b="F4 FD"/>
+ <a u="9150" b="F4 FB"/>
+ <a u="9151" b="E1 43"/>
+ <a u="9152" b="BE C6"/>
+ <a u="9153" b="E1 44"/>
+ <a u="9154" b="E1 45"/>
+ <a u="9155" b="E1 46"/>
+ <a u="9156" b="E1 47"/>
+ <a u="9157" b="D0 EF"/>
+ <a u="9158" b="E1 48"/>
+ <a u="9159" b="E1 49"/>
+ <a u="915A" b="B7 D3"/>
+ <a u="915B" b="E1 4A"/>
+ <a u="915C" b="E1 4B"/>
+ <a u="915D" b="D4 CD"/>
+ <a u="915E" b="CC AA"/>
+ <a u="915F" b="E1 4C"/>
+ <a u="9160" b="E1 4D"/>
+ <a u="9161" b="F5 A2"/>
+ <a u="9162" b="F5 A1"/>
+ <a u="9163" b="BA A8"/>
+ <a u="9164" b="F4 FE"/>
+ <a u="9165" b="CB D6"/>
+ <a u="9166" b="E1 4E"/>
+ <a u="9167" b="E1 4F"/>
+ <a u="9168" b="E1 50"/>
+ <a u="9169" b="F5 A4"/>
+ <a u="916A" b="C0 D2"/>
+ <a u="916B" b="E1 51"/>
+ <a u="916C" b="B3 EA"/>
+ <a u="916D" b="E1 52"/>
+ <a u="916E" b="CD AA"/>
+ <a u="916F" b="F5 A5"/>
+ <a u="9170" b="F5 A3"/>
+ <a u="9171" b="BD B4"/>
+ <a u="9172" b="F5 A8"/>
+ <a u="9173" b="E1 53"/>
+ <a u="9174" b="F5 A9"/>
+ <a u="9175" b="BD CD"/>
+ <a u="9176" b="C3 B8"/>
+ <a u="9177" b="BF E1"/>
+ <a u="9178" b="CB E1"/>
+ <a u="9179" b="F5 AA"/>
+ <a u="917A" b="E1 54"/>
+ <a u="917B" b="E1 55"/>
+ <a u="917C" b="E1 56"/>
+ <a u="917D" b="F5 A6"/>
+ <a u="917E" b="F5 A7"/>
+ <a u="917F" b="C4 F0"/>
+ <a u="9180" b="E1 57"/>
+ <a u="9181" b="E1 58"/>
+ <a u="9182" b="E1 59"/>
+ <a u="9183" b="E1 5A"/>
+ <a u="9184" b="E1 5B"/>
+ <a u="9185" b="F5 AC"/>
+ <a u="9186" b="E1 5C"/>
+ <a u="9187" b="B4 BC"/>
+ <a u="9188" b="E1 5D"/>
+ <a u="9189" b="D7 ED"/>
+ <a u="918A" b="E1 5E"/>
+ <a u="918B" b="B4 D7"/>
+ <a u="918C" b="F5 AB"/>
+ <a u="918D" b="F5 AE"/>
+ <a u="918E" b="E1 5F"/>
+ <a u="918F" b="E1 60"/>
+ <a u="9190" b="F5 AD"/>
+ <a u="9191" b="F5 AF"/>
+ <a u="9192" b="D0 D1"/>
+ <a u="9193" b="E1 61"/>
+ <a u="9194" b="E1 62"/>
+ <a u="9195" b="E1 63"/>
+ <a u="9196" b="E1 64"/>
+ <a u="9197" b="E1 65"/>
+ <a u="9198" b="E1 66"/>
+ <a u="9199" b="E1 67"/>
+ <a u="919A" b="C3 D1"/>
+ <a u="919B" b="C8 A9"/>
+ <a u="919C" b="E1 68"/>
+ <a u="919D" b="E1 69"/>
+ <a u="919E" b="E1 6A"/>
+ <a u="919F" b="E1 6B"/>
+ <a u="91A0" b="E1 6C"/>
+ <a u="91A1" b="E1 6D"/>
+ <a u="91A2" b="F5 B0"/>
+ <a u="91A3" b="F5 B1"/>
+ <a u="91A4" b="E1 6E"/>
+ <a u="91A5" b="E1 6F"/>
+ <a u="91A6" b="E1 70"/>
+ <a u="91A7" b="E1 71"/>
+ <a u="91A8" b="E1 72"/>
+ <a u="91A9" b="E1 73"/>
+ <a u="91AA" b="F5 B2"/>
+ <a u="91AB" b="E1 74"/>
+ <a u="91AC" b="E1 75"/>
+ <a u="91AD" b="F5 B3"/>
+ <a u="91AE" b="F5 B4"/>
+ <a u="91AF" b="F5 B5"/>
+ <a u="91B0" b="E1 76"/>
+ <a u="91B1" b="E1 77"/>
+ <a u="91B2" b="E1 78"/>
+ <a u="91B3" b="E1 79"/>
+ <a u="91B4" b="F5 B7"/>
+ <a u="91B5" b="F5 B6"/>
+ <a u="91B6" b="E1 7A"/>
+ <a u="91B7" b="E1 7B"/>
+ <a u="91B8" b="E1 7C"/>
+ <a u="91B9" b="E1 7D"/>
+ <a u="91BA" b="F5 B8"/>
+ <a u="91BB" b="E1 7E"/>
+ <a u="91BC" b="E1 80"/>
+ <a u="91BD" b="E1 81"/>
+ <a u="91BE" b="E1 82"/>
+ <a u="91BF" b="E1 83"/>
+ <a u="91C0" b="E1 84"/>
+ <a u="91C1" b="E1 85"/>
+ <a u="91C2" b="E1 86"/>
+ <a u="91C3" b="E1 87"/>
+ <a u="91C4" b="E1 88"/>
+ <a u="91C5" b="E1 89"/>
+ <a u="91C6" b="E1 8A"/>
+ <a u="91C7" b="B2 C9"/>
+ <a u="91C8" b="E1 8B"/>
+ <a u="91C9" b="D3 D4"/>
+ <a u="91CA" b="CA CD"/>
+ <a u="91CB" b="E1 8C"/>
+ <a u="91CC" b="C0 EF"/>
+ <a u="91CD" b="D6 D8"/>
+ <a u="91CE" b="D2 B0"/>
+ <a u="91CF" b="C1 BF"/>
+ <a u="91D0" b="E1 8D"/>
+ <a u="91D1" b="BD F0"/>
+ <a u="91D2" b="E1 8E"/>
+ <a u="91D3" b="E1 8F"/>
+ <a u="91D4" b="E1 90"/>
+ <a u="91D5" b="E1 91"/>
+ <a u="91D6" b="E1 92"/>
+ <a u="91D7" b="E1 93"/>
+ <a u="91D8" b="E1 94"/>
+ <a u="91D9" b="E1 95"/>
+ <a u="91DA" b="E1 96"/>
+ <a u="91DB" b="E1 97"/>
+ <a u="91DC" b="B8 AA"/>
+ <a u="91DD" b="E1 98"/>
+ <a u="91DE" b="E1 99"/>
+ <a u="91DF" b="E1 9A"/>
+ <a u="91E0" b="E1 9B"/>
+ <a u="91E1" b="E1 9C"/>
+ <a u="91E2" b="E1 9D"/>
+ <a u="91E3" b="E1 9E"/>
+ <a u="91E4" b="E1 9F"/>
+ <a u="91E5" b="E1 A0"/>
+ <a u="91E6" b="E2 40"/>
+ <a u="91E7" b="E2 41"/>
+ <a u="91E8" b="E2 42"/>
+ <a u="91E9" b="E2 43"/>
+ <a u="91EA" b="E2 44"/>
+ <a u="91EB" b="E2 45"/>
+ <a u="91EC" b="E2 46"/>
+ <a u="91ED" b="E2 47"/>
+ <a u="91EE" b="E2 48"/>
+ <a u="91EF" b="E2 49"/>
+ <a u="91F0" b="E2 4A"/>
+ <a u="91F1" b="E2 4B"/>
+ <a u="91F2" b="E2 4C"/>
+ <a u="91F3" b="E2 4D"/>
+ <a u="91F4" b="E2 4E"/>
+ <a u="91F5" b="E2 4F"/>
+ <a u="91F6" b="E2 50"/>
+ <a u="91F7" b="E2 51"/>
+ <a u="91F8" b="E2 52"/>
+ <a u="91F9" b="E2 53"/>
+ <a u="91FA" b="E2 54"/>
+ <a u="91FB" b="E2 55"/>
+ <a u="91FC" b="E2 56"/>
+ <a u="91FD" b="E2 57"/>
+ <a u="91FE" b="E2 58"/>
+ <a u="91FF" b="E2 59"/>
+ <a u="9200" b="E2 5A"/>
+ <a u="9201" b="E2 5B"/>
+ <a u="9202" b="E2 5C"/>
+ <a u="9203" b="E2 5D"/>
+ <a u="9204" b="E2 5E"/>
+ <a u="9205" b="E2 5F"/>
+ <a u="9206" b="E2 60"/>
+ <a u="9207" b="E2 61"/>
+ <a u="9208" b="E2 62"/>
+ <a u="9209" b="E2 63"/>
+ <a u="920A" b="E2 64"/>
+ <a u="920B" b="E2 65"/>
+ <a u="920C" b="E2 66"/>
+ <a u="920D" b="E2 67"/>
+ <a u="920E" b="E2 68"/>
+ <a u="920F" b="E2 69"/>
+ <a u="9210" b="E2 6A"/>
+ <a u="9211" b="E2 6B"/>
+ <a u="9212" b="E2 6C"/>
+ <a u="9213" b="E2 6D"/>
+ <a u="9214" b="E2 6E"/>
+ <a u="9215" b="E2 6F"/>
+ <a u="9216" b="E2 70"/>
+ <a u="9217" b="E2 71"/>
+ <a u="9218" b="E2 72"/>
+ <a u="9219" b="E2 73"/>
+ <a u="921A" b="E2 74"/>
+ <a u="921B" b="E2 75"/>
+ <a u="921C" b="E2 76"/>
+ <a u="921D" b="E2 77"/>
+ <a u="921E" b="E2 78"/>
+ <a u="921F" b="E2 79"/>
+ <a u="9220" b="E2 7A"/>
+ <a u="9221" b="E2 7B"/>
+ <a u="9222" b="E2 7C"/>
+ <a u="9223" b="E2 7D"/>
+ <a u="9224" b="E2 7E"/>
+ <a u="9225" b="E2 80"/>
+ <a u="9226" b="E2 81"/>
+ <a u="9227" b="E2 82"/>
+ <a u="9228" b="E2 83"/>
+ <a u="9229" b="E2 84"/>
+ <a u="922A" b="E2 85"/>
+ <a u="922B" b="E2 86"/>
+ <a u="922C" b="E2 87"/>
+ <a u="922D" b="E2 88"/>
+ <a u="922E" b="E2 89"/>
+ <a u="922F" b="E2 8A"/>
+ <a u="9230" b="E2 8B"/>
+ <a u="9231" b="E2 8C"/>
+ <a u="9232" b="E2 8D"/>
+ <a u="9233" b="E2 8E"/>
+ <a u="9234" b="E2 8F"/>
+ <a u="9235" b="E2 90"/>
+ <a u="9236" b="E2 91"/>
+ <a u="9237" b="E2 92"/>
+ <a u="9238" b="E2 93"/>
+ <a u="9239" b="E2 94"/>
+ <a u="923A" b="E2 95"/>
+ <a u="923B" b="E2 96"/>
+ <a u="923C" b="E2 97"/>
+ <a u="923D" b="E2 98"/>
+ <a u="923E" b="E2 99"/>
+ <a u="923F" b="E2 9A"/>
+ <a u="9240" b="E2 9B"/>
+ <a u="9241" b="E2 9C"/>
+ <a u="9242" b="E2 9D"/>
+ <a u="9243" b="E2 9E"/>
+ <a u="9244" b="E2 9F"/>
+ <a u="9245" b="E2 A0"/>
+ <a u="9246" b="E3 40"/>
+ <a u="9247" b="E3 41"/>
+ <a u="9248" b="E3 42"/>
+ <a u="9249" b="E3 43"/>
+ <a u="924A" b="E3 44"/>
+ <a u="924B" b="E3 45"/>
+ <a u="924C" b="E3 46"/>
+ <a u="924D" b="E3 47"/>
+ <a u="924E" b="E3 48"/>
+ <a u="924F" b="E3 49"/>
+ <a u="9250" b="E3 4A"/>
+ <a u="9251" b="E3 4B"/>
+ <a u="9252" b="E3 4C"/>
+ <a u="9253" b="E3 4D"/>
+ <a u="9254" b="E3 4E"/>
+ <a u="9255" b="E3 4F"/>
+ <a u="9256" b="E3 50"/>
+ <a u="9257" b="E3 51"/>
+ <a u="9258" b="E3 52"/>
+ <a u="9259" b="E3 53"/>
+ <a u="925A" b="E3 54"/>
+ <a u="925B" b="E3 55"/>
+ <a u="925C" b="E3 56"/>
+ <a u="925D" b="E3 57"/>
+ <a u="925E" b="E3 58"/>
+ <a u="925F" b="E3 59"/>
+ <a u="9260" b="E3 5A"/>
+ <a u="9261" b="E3 5B"/>
+ <a u="9262" b="E3 5C"/>
+ <a u="9263" b="E3 5D"/>
+ <a u="9264" b="E3 5E"/>
+ <a u="9265" b="E3 5F"/>
+ <a u="9266" b="E3 60"/>
+ <a u="9267" b="E3 61"/>
+ <a u="9268" b="E3 62"/>
+ <a u="9269" b="E3 63"/>
+ <a u="926A" b="E3 64"/>
+ <a u="926B" b="E3 65"/>
+ <a u="926C" b="E3 66"/>
+ <a u="926D" b="E3 67"/>
+ <a u="926E" b="E3 68"/>
+ <a u="926F" b="E3 69"/>
+ <a u="9270" b="E3 6A"/>
+ <a u="9271" b="E3 6B"/>
+ <a u="9272" b="E3 6C"/>
+ <a u="9273" b="E3 6D"/>
+ <a u="9274" b="BC F8"/>
+ <a u="9275" b="E3 6E"/>
+ <a u="9276" b="E3 6F"/>
+ <a u="9277" b="E3 70"/>
+ <a u="9278" b="E3 71"/>
+ <a u="9279" b="E3 72"/>
+ <a u="927A" b="E3 73"/>
+ <a u="927B" b="E3 74"/>
+ <a u="927C" b="E3 75"/>
+ <a u="927D" b="E3 76"/>
+ <a u="927E" b="E3 77"/>
+ <a u="927F" b="E3 78"/>
+ <a u="9280" b="E3 79"/>
+ <a u="9281" b="E3 7A"/>
+ <a u="9282" b="E3 7B"/>
+ <a u="9283" b="E3 7C"/>
+ <a u="9284" b="E3 7D"/>
+ <a u="9285" b="E3 7E"/>
+ <a u="9286" b="E3 80"/>
+ <a u="9287" b="E3 81"/>
+ <a u="9288" b="E3 82"/>
+ <a u="9289" b="E3 83"/>
+ <a u="928A" b="E3 84"/>
+ <a u="928B" b="E3 85"/>
+ <a u="928C" b="E3 86"/>
+ <a u="928D" b="E3 87"/>
+ <a u="928E" b="F6 C6"/>
+ <a u="928F" b="E3 88"/>
+ <a u="9290" b="E3 89"/>
+ <a u="9291" b="E3 8A"/>
+ <a u="9292" b="E3 8B"/>
+ <a u="9293" b="E3 8C"/>
+ <a u="9294" b="E3 8D"/>
+ <a u="9295" b="E3 8E"/>
+ <a u="9296" b="E3 8F"/>
+ <a u="9297" b="E3 90"/>
+ <a u="9298" b="E3 91"/>
+ <a u="9299" b="E3 92"/>
+ <a u="929A" b="E3 93"/>
+ <a u="929B" b="E3 94"/>
+ <a u="929C" b="E3 95"/>
+ <a u="929D" b="E3 96"/>
+ <a u="929E" b="E3 97"/>
+ <a u="929F" b="E3 98"/>
+ <a u="92A0" b="E3 99"/>
+ <a u="92A1" b="E3 9A"/>
+ <a u="92A2" b="E3 9B"/>
+ <a u="92A3" b="E3 9C"/>
+ <a u="92A4" b="E3 9D"/>
+ <a u="92A5" b="E3 9E"/>
+ <a u="92A6" b="E3 9F"/>
+ <a u="92A7" b="E3 A0"/>
+ <a u="92A8" b="E4 40"/>
+ <a u="92A9" b="E4 41"/>
+ <a u="92AA" b="E4 42"/>
+ <a u="92AB" b="E4 43"/>
+ <a u="92AC" b="E4 44"/>
+ <a u="92AD" b="E4 45"/>
+ <a u="92AE" b="F6 C7"/>
+ <a u="92AF" b="E4 46"/>
+ <a u="92B0" b="E4 47"/>
+ <a u="92B1" b="E4 48"/>
+ <a u="92B2" b="E4 49"/>
+ <a u="92B3" b="E4 4A"/>
+ <a u="92B4" b="E4 4B"/>
+ <a u="92B5" b="E4 4C"/>
+ <a u="92B6" b="E4 4D"/>
+ <a u="92B7" b="E4 4E"/>
+ <a u="92B8" b="E4 4F"/>
+ <a u="92B9" b="E4 50"/>
+ <a u="92BA" b="E4 51"/>
+ <a u="92BB" b="E4 52"/>
+ <a u="92BC" b="E4 53"/>
+ <a u="92BD" b="E4 54"/>
+ <a u="92BE" b="E4 55"/>
+ <a u="92BF" b="E4 56"/>
+ <a u="92C0" b="E4 57"/>
+ <a u="92C1" b="E4 58"/>
+ <a u="92C2" b="E4 59"/>
+ <a u="92C3" b="E4 5A"/>
+ <a u="92C4" b="E4 5B"/>
+ <a u="92C5" b="E4 5C"/>
+ <a u="92C6" b="E4 5D"/>
+ <a u="92C7" b="E4 5E"/>
+ <a u="92C8" b="F6 C8"/>
+ <a u="92C9" b="E4 5F"/>
+ <a u="92CA" b="E4 60"/>
+ <a u="92CB" b="E4 61"/>
+ <a u="92CC" b="E4 62"/>
+ <a u="92CD" b="E4 63"/>
+ <a u="92CE" b="E4 64"/>
+ <a u="92CF" b="E4 65"/>
+ <a u="92D0" b="E4 66"/>
+ <a u="92D1" b="E4 67"/>
+ <a u="92D2" b="E4 68"/>
+ <a u="92D3" b="E4 69"/>
+ <a u="92D4" b="E4 6A"/>
+ <a u="92D5" b="E4 6B"/>
+ <a u="92D6" b="E4 6C"/>
+ <a u="92D7" b="E4 6D"/>
+ <a u="92D8" b="E4 6E"/>
+ <a u="92D9" b="E4 6F"/>
+ <a u="92DA" b="E4 70"/>
+ <a u="92DB" b="E4 71"/>
+ <a u="92DC" b="E4 72"/>
+ <a u="92DD" b="E4 73"/>
+ <a u="92DE" b="E4 74"/>
+ <a u="92DF" b="E4 75"/>
+ <a u="92E0" b="E4 76"/>
+ <a u="92E1" b="E4 77"/>
+ <a u="92E2" b="E4 78"/>
+ <a u="92E3" b="E4 79"/>
+ <a u="92E4" b="E4 7A"/>
+ <a u="92E5" b="E4 7B"/>
+ <a u="92E6" b="E4 7C"/>
+ <a u="92E7" b="E4 7D"/>
+ <a u="92E8" b="E4 7E"/>
+ <a u="92E9" b="E4 80"/>
+ <a u="92EA" b="E4 81"/>
+ <a u="92EB" b="E4 82"/>
+ <a u="92EC" b="E4 83"/>
+ <a u="92ED" b="E4 84"/>
+ <a u="92EE" b="E4 85"/>
+ <a u="92EF" b="E4 86"/>
+ <a u="92F0" b="E4 87"/>
+ <a u="92F1" b="E4 88"/>
+ <a u="92F2" b="E4 89"/>
+ <a u="92F3" b="E4 8A"/>
+ <a u="92F4" b="E4 8B"/>
+ <a u="92F5" b="E4 8C"/>
+ <a u="92F6" b="E4 8D"/>
+ <a u="92F7" b="E4 8E"/>
+ <a u="92F8" b="E4 8F"/>
+ <a u="92F9" b="E4 90"/>
+ <a u="92FA" b="E4 91"/>
+ <a u="92FB" b="E4 92"/>
+ <a u="92FC" b="E4 93"/>
+ <a u="92FD" b="E4 94"/>
+ <a u="92FE" b="E4 95"/>
+ <a u="92FF" b="E4 96"/>
+ <a u="9300" b="E4 97"/>
+ <a u="9301" b="E4 98"/>
+ <a u="9302" b="E4 99"/>
+ <a u="9303" b="E4 9A"/>
+ <a u="9304" b="E4 9B"/>
+ <a u="9305" b="E4 9C"/>
+ <a u="9306" b="E4 9D"/>
+ <a u="9307" b="E4 9E"/>
+ <a u="9308" b="E4 9F"/>
+ <a u="9309" b="E4 A0"/>
+ <a u="930A" b="E5 40"/>
+ <a u="930B" b="E5 41"/>
+ <a u="930C" b="E5 42"/>
+ <a u="930D" b="E5 43"/>
+ <a u="930E" b="E5 44"/>
+ <a u="930F" b="E5 45"/>
+ <a u="9310" b="E5 46"/>
+ <a u="9311" b="E5 47"/>
+ <a u="9312" b="E5 48"/>
+ <a u="9313" b="E5 49"/>
+ <a u="9314" b="E5 4A"/>
+ <a u="9315" b="E5 4B"/>
+ <a u="9316" b="E5 4C"/>
+ <a u="9317" b="E5 4D"/>
+ <a u="9318" b="E5 4E"/>
+ <a u="9319" b="E5 4F"/>
+ <a u="931A" b="E5 50"/>
+ <a u="931B" b="E5 51"/>
+ <a u="931C" b="E5 52"/>
+ <a u="931D" b="E5 53"/>
+ <a u="931E" b="E5 54"/>
+ <a u="931F" b="E5 55"/>
+ <a u="9320" b="E5 56"/>
+ <a u="9321" b="E5 57"/>
+ <a u="9322" b="E5 58"/>
+ <a u="9323" b="E5 59"/>
+ <a u="9324" b="E5 5A"/>
+ <a u="9325" b="E5 5B"/>
+ <a u="9326" b="E5 5C"/>
+ <a u="9327" b="E5 5D"/>
+ <a u="9328" b="E5 5E"/>
+ <a u="9329" b="E5 5F"/>
+ <a u="932A" b="E5 60"/>
+ <a u="932B" b="E5 61"/>
+ <a u="932C" b="E5 62"/>
+ <a u="932D" b="E5 63"/>
+ <a u="932E" b="E5 64"/>
+ <a u="932F" b="E5 65"/>
+ <a u="9330" b="E5 66"/>
+ <a u="9331" b="E5 67"/>
+ <a u="9332" b="E5 68"/>
+ <a u="9333" b="E5 69"/>
+ <a u="9334" b="E5 6A"/>
+ <a u="9335" b="E5 6B"/>
+ <a u="9336" b="E5 6C"/>
+ <a u="9337" b="E5 6D"/>
+ <a u="9338" b="E5 6E"/>
+ <a u="9339" b="E5 6F"/>
+ <a u="933A" b="E5 70"/>
+ <a u="933B" b="E5 71"/>
+ <a u="933C" b="E5 72"/>
+ <a u="933D" b="E5 73"/>
+ <a u="933E" b="F6 C9"/>
+ <a u="933F" b="E5 74"/>
+ <a u="9340" b="E5 75"/>
+ <a u="9341" b="E5 76"/>
+ <a u="9342" b="E5 77"/>
+ <a u="9343" b="E5 78"/>
+ <a u="9344" b="E5 79"/>
+ <a u="9345" b="E5 7A"/>
+ <a u="9346" b="E5 7B"/>
+ <a u="9347" b="E5 7C"/>
+ <a u="9348" b="E5 7D"/>
+ <a u="9349" b="E5 7E"/>
+ <a u="934A" b="E5 80"/>
+ <a u="934B" b="E5 81"/>
+ <a u="934C" b="E5 82"/>
+ <a u="934D" b="E5 83"/>
+ <a u="934E" b="E5 84"/>
+ <a u="934F" b="E5 85"/>
+ <a u="9350" b="E5 86"/>
+ <a u="9351" b="E5 87"/>
+ <a u="9352" b="E5 88"/>
+ <a u="9353" b="E5 89"/>
+ <a u="9354" b="E5 8A"/>
+ <a u="9355" b="E5 8B"/>
+ <a u="9356" b="E5 8C"/>
+ <a u="9357" b="E5 8D"/>
+ <a u="9358" b="E5 8E"/>
+ <a u="9359" b="E5 8F"/>
+ <a u="935A" b="E5 90"/>
+ <a u="935B" b="E5 91"/>
+ <a u="935C" b="E5 92"/>
+ <a u="935D" b="E5 93"/>
+ <a u="935E" b="E5 94"/>
+ <a u="935F" b="E5 95"/>
+ <a u="9360" b="E5 96"/>
+ <a u="9361" b="E5 97"/>
+ <a u="9362" b="E5 98"/>
+ <a u="9363" b="E5 99"/>
+ <a u="9364" b="E5 9A"/>
+ <a u="9365" b="E5 9B"/>
+ <a u="9366" b="E5 9C"/>
+ <a u="9367" b="E5 9D"/>
+ <a u="9368" b="E5 9E"/>
+ <a u="9369" b="E5 9F"/>
+ <a u="936A" b="F6 CA"/>
+ <a u="936B" b="E5 A0"/>
+ <a u="936C" b="E6 40"/>
+ <a u="936D" b="E6 41"/>
+ <a u="936E" b="E6 42"/>
+ <a u="936F" b="E6 43"/>
+ <a u="9370" b="E6 44"/>
+ <a u="9371" b="E6 45"/>
+ <a u="9372" b="E6 46"/>
+ <a u="9373" b="E6 47"/>
+ <a u="9374" b="E6 48"/>
+ <a u="9375" b="E6 49"/>
+ <a u="9376" b="E6 4A"/>
+ <a u="9377" b="E6 4B"/>
+ <a u="9378" b="E6 4C"/>
+ <a u="9379" b="E6 4D"/>
+ <a u="937A" b="E6 4E"/>
+ <a u="937B" b="E6 4F"/>
+ <a u="937C" b="E6 50"/>
+ <a u="937D" b="E6 51"/>
+ <a u="937E" b="E6 52"/>
+ <a u="937F" b="E6 53"/>
+ <a u="9380" b="E6 54"/>
+ <a u="9381" b="E6 55"/>
+ <a u="9382" b="E6 56"/>
+ <a u="9383" b="E6 57"/>
+ <a u="9384" b="E6 58"/>
+ <a u="9385" b="E6 59"/>
+ <a u="9386" b="E6 5A"/>
+ <a u="9387" b="E6 5B"/>
+ <a u="9388" b="E6 5C"/>
+ <a u="9389" b="E6 5D"/>
+ <a u="938A" b="E6 5E"/>
+ <a u="938B" b="E6 5F"/>
+ <a u="938C" b="E6 60"/>
+ <a u="938D" b="E6 61"/>
+ <a u="938E" b="E6 62"/>
+ <a u="938F" b="F6 CC"/>
+ <a u="9390" b="E6 63"/>
+ <a u="9391" b="E6 64"/>
+ <a u="9392" b="E6 65"/>
+ <a u="9393" b="E6 66"/>
+ <a u="9394" b="E6 67"/>
+ <a u="9395" b="E6 68"/>
+ <a u="9396" b="E6 69"/>
+ <a u="9397" b="E6 6A"/>
+ <a u="9398" b="E6 6B"/>
+ <a u="9399" b="E6 6C"/>
+ <a u="939A" b="E6 6D"/>
+ <a u="939B" b="E6 6E"/>
+ <a u="939C" b="E6 6F"/>
+ <a u="939D" b="E6 70"/>
+ <a u="939E" b="E6 71"/>
+ <a u="939F" b="E6 72"/>
+ <a u="93A0" b="E6 73"/>
+ <a u="93A1" b="E6 74"/>
+ <a u="93A2" b="E6 75"/>
+ <a u="93A3" b="E6 76"/>
+ <a u="93A4" b="E6 77"/>
+ <a u="93A5" b="E6 78"/>
+ <a u="93A6" b="E6 79"/>
+ <a u="93A7" b="E6 7A"/>
+ <a u="93A8" b="E6 7B"/>
+ <a u="93A9" b="E6 7C"/>
+ <a u="93AA" b="E6 7D"/>
+ <a u="93AB" b="E6 7E"/>
+ <a u="93AC" b="E6 80"/>
+ <a u="93AD" b="E6 81"/>
+ <a u="93AE" b="E6 82"/>
+ <a u="93AF" b="E6 83"/>
+ <a u="93B0" b="E6 84"/>
+ <a u="93B1" b="E6 85"/>
+ <a u="93B2" b="E6 86"/>
+ <a u="93B3" b="E6 87"/>
+ <a u="93B4" b="E6 88"/>
+ <a u="93B5" b="E6 89"/>
+ <a u="93B6" b="E6 8A"/>
+ <a u="93B7" b="E6 8B"/>
+ <a u="93B8" b="E6 8C"/>
+ <a u="93B9" b="E6 8D"/>
+ <a u="93BA" b="E6 8E"/>
+ <a u="93BB" b="E6 8F"/>
+ <a u="93BC" b="E6 90"/>
+ <a u="93BD" b="E6 91"/>
+ <a u="93BE" b="E6 92"/>
+ <a u="93BF" b="E6 93"/>
+ <a u="93C0" b="E6 94"/>
+ <a u="93C1" b="E6 95"/>
+ <a u="93C2" b="E6 96"/>
+ <a u="93C3" b="E6 97"/>
+ <a u="93C4" b="E6 98"/>
+ <a u="93C5" b="E6 99"/>
+ <a u="93C6" b="E6 9A"/>
+ <a u="93C7" b="E6 9B"/>
+ <a u="93C8" b="E6 9C"/>
+ <a u="93C9" b="E6 9D"/>
+ <a u="93CA" b="F6 CB"/>
+ <a u="93CB" b="E6 9E"/>
+ <a u="93CC" b="E6 9F"/>
+ <a u="93CD" b="E6 A0"/>
+ <a u="93CE" b="E7 40"/>
+ <a u="93CF" b="E7 41"/>
+ <a u="93D0" b="E7 42"/>
+ <a u="93D1" b="E7 43"/>
+ <a u="93D2" b="E7 44"/>
+ <a u="93D3" b="E7 45"/>
+ <a u="93D4" b="E7 46"/>
+ <a u="93D5" b="E7 47"/>
+ <a u="93D6" b="F7 E9"/>
+ <a u="93D7" b="E7 48"/>
+ <a u="93D8" b="E7 49"/>
+ <a u="93D9" b="E7 4A"/>
+ <a u="93DA" b="E7 4B"/>
+ <a u="93DB" b="E7 4C"/>
+ <a u="93DC" b="E7 4D"/>
+ <a u="93DD" b="E7 4E"/>
+ <a u="93DE" b="E7 4F"/>
+ <a u="93DF" b="E7 50"/>
+ <a u="93E0" b="E7 51"/>
+ <a u="93E1" b="E7 52"/>
+ <a u="93E2" b="E7 53"/>
+ <a u="93E3" b="E7 54"/>
+ <a u="93E4" b="E7 55"/>
+ <a u="93E5" b="E7 56"/>
+ <a u="93E6" b="E7 57"/>
+ <a u="93E7" b="E7 58"/>
+ <a u="93E8" b="E7 59"/>
+ <a u="93E9" b="E7 5A"/>
+ <a u="93EA" b="E7 5B"/>
+ <a u="93EB" b="E7 5C"/>
+ <a u="93EC" b="E7 5D"/>
+ <a u="93ED" b="E7 5E"/>
+ <a u="93EE" b="E7 5F"/>
+ <a u="93EF" b="E7 60"/>
+ <a u="93F0" b="E7 61"/>
+ <a u="93F1" b="E7 62"/>
+ <a u="93F2" b="E7 63"/>
+ <a u="93F3" b="E7 64"/>
+ <a u="93F4" b="E7 65"/>
+ <a u="93F5" b="E7 66"/>
+ <a u="93F6" b="E7 67"/>
+ <a u="93F7" b="E7 68"/>
+ <a u="93F8" b="E7 69"/>
+ <a u="93F9" b="E7 6A"/>
+ <a u="93FA" b="E7 6B"/>
+ <a u="93FB" b="E7 6C"/>
+ <a u="93FC" b="E7 6D"/>
+ <a u="93FD" b="E7 6E"/>
+ <a u="93FE" b="E7 6F"/>
+ <a u="93FF" b="E7 70"/>
+ <a u="9400" b="E7 71"/>
+ <a u="9401" b="E7 72"/>
+ <a u="9402" b="E7 73"/>
+ <a u="9403" b="E7 74"/>
+ <a u="9404" b="E7 75"/>
+ <a u="9405" b="E7 76"/>
+ <a u="9406" b="E7 77"/>
+ <a u="9407" b="E7 78"/>
+ <a u="9408" b="E7 79"/>
+ <a u="9409" b="E7 7A"/>
+ <a u="940A" b="E7 7B"/>
+ <a u="940B" b="E7 7C"/>
+ <a u="940C" b="E7 7D"/>
+ <a u="940D" b="E7 7E"/>
+ <a u="940E" b="E7 80"/>
+ <a u="940F" b="E7 81"/>
+ <a u="9410" b="E7 82"/>
+ <a u="9411" b="E7 83"/>
+ <a u="9412" b="E7 84"/>
+ <a u="9413" b="E7 85"/>
+ <a u="9414" b="E7 86"/>
+ <a u="9415" b="E7 87"/>
+ <a u="9416" b="E7 88"/>
+ <a u="9417" b="E7 89"/>
+ <a u="9418" b="E7 8A"/>
+ <a u="9419" b="E7 8B"/>
+ <a u="941A" b="E7 8C"/>
+ <a u="941B" b="E7 8D"/>
+ <a u="941C" b="E7 8E"/>
+ <a u="941D" b="E7 8F"/>
+ <a u="941E" b="E7 90"/>
+ <a u="941F" b="E7 91"/>
+ <a u="9420" b="E7 92"/>
+ <a u="9421" b="E7 93"/>
+ <a u="9422" b="E7 94"/>
+ <a u="9423" b="E7 95"/>
+ <a u="9424" b="E7 96"/>
+ <a u="9425" b="E7 97"/>
+ <a u="9426" b="E7 98"/>
+ <a u="9427" b="E7 99"/>
+ <a u="9428" b="E7 9A"/>
+ <a u="9429" b="E7 9B"/>
+ <a u="942A" b="E7 9C"/>
+ <a u="942B" b="E7 9D"/>
+ <a u="942C" b="E7 9E"/>
+ <a u="942D" b="E7 9F"/>
+ <a u="942E" b="E7 A0"/>
+ <a u="942F" b="E8 40"/>
+ <a u="9430" b="E8 41"/>
+ <a u="9431" b="E8 42"/>
+ <a u="9432" b="E8 43"/>
+ <a u="9433" b="E8 44"/>
+ <a u="9434" b="E8 45"/>
+ <a u="9435" b="E8 46"/>
+ <a u="9436" b="E8 47"/>
+ <a u="9437" b="E8 48"/>
+ <a u="9438" b="E8 49"/>
+ <a u="9439" b="E8 4A"/>
+ <a u="943A" b="E8 4B"/>
+ <a u="943B" b="E8 4C"/>
+ <a u="943C" b="E8 4D"/>
+ <a u="943D" b="E8 4E"/>
+ <a u="943E" b="F6 CD"/>
+ <a u="943F" b="E8 4F"/>
+ <a u="9440" b="E8 50"/>
+ <a u="9441" b="E8 51"/>
+ <a u="9442" b="E8 52"/>
+ <a u="9443" b="E8 53"/>
+ <a u="9444" b="E8 54"/>
+ <a u="9445" b="E8 55"/>
+ <a u="9446" b="E8 56"/>
+ <a u="9447" b="E8 57"/>
+ <a u="9448" b="E8 58"/>
+ <a u="9449" b="E8 59"/>
+ <a u="944A" b="E8 5A"/>
+ <a u="944B" b="E8 5B"/>
+ <a u="944C" b="E8 5C"/>
+ <a u="944D" b="E8 5D"/>
+ <a u="944E" b="E8 5E"/>
+ <a u="944F" b="E8 5F"/>
+ <a u="9450" b="E8 60"/>
+ <a u="9451" b="E8 61"/>
+ <a u="9452" b="E8 62"/>
+ <a u="9453" b="E8 63"/>
+ <a u="9454" b="E8 64"/>
+ <a u="9455" b="E8 65"/>
+ <a u="9456" b="E8 66"/>
+ <a u="9457" b="E8 67"/>
+ <a u="9458" b="E8 68"/>
+ <a u="9459" b="E8 69"/>
+ <a u="945A" b="E8 6A"/>
+ <a u="945B" b="E8 6B"/>
+ <a u="945C" b="E8 6C"/>
+ <a u="945D" b="E8 6D"/>
+ <a u="945E" b="E8 6E"/>
+ <a u="945F" b="E8 6F"/>
+ <a u="9460" b="E8 70"/>
+ <a u="9461" b="E8 71"/>
+ <a u="9462" b="E8 72"/>
+ <a u="9463" b="E8 73"/>
+ <a u="9464" b="E8 74"/>
+ <a u="9465" b="E8 75"/>
+ <a u="9466" b="E8 76"/>
+ <a u="9467" b="E8 77"/>
+ <a u="9468" b="E8 78"/>
+ <a u="9469" b="E8 79"/>
+ <a u="946A" b="E8 7A"/>
+ <a u="946B" b="F6 CE"/>
+ <a u="946C" b="E8 7B"/>
+ <a u="946D" b="E8 7C"/>
+ <a u="946E" b="E8 7D"/>
+ <a u="946F" b="E8 7E"/>
+ <a u="9470" b="E8 80"/>
+ <a u="9471" b="E8 81"/>
+ <a u="9472" b="E8 82"/>
+ <a u="9473" b="E8 83"/>
+ <a u="9474" b="E8 84"/>
+ <a u="9475" b="E8 85"/>
+ <a u="9476" b="E8 86"/>
+ <a u="9477" b="E8 87"/>
+ <a u="9478" b="E8 88"/>
+ <a u="9479" b="E8 89"/>
+ <a u="947A" b="E8 8A"/>
+ <a u="947B" b="E8 8B"/>
+ <a u="947C" b="E8 8C"/>
+ <a u="947D" b="E8 8D"/>
+ <a u="947E" b="E8 8E"/>
+ <a u="947F" b="E8 8F"/>
+ <a u="9480" b="E8 90"/>
+ <a u="9481" b="E8 91"/>
+ <a u="9482" b="E8 92"/>
+ <a u="9483" b="E8 93"/>
+ <a u="9484" b="E8 94"/>
+ <a u="9485" b="EE C4"/>
+ <a u="9486" b="EE C5"/>
+ <a u="9487" b="EE C6"/>
+ <a u="9488" b="D5 EB"/>
+ <a u="9489" b="B6 A4"/>
+ <a u="948A" b="EE C8"/>
+ <a u="948B" b="EE C7"/>
+ <a u="948C" b="EE C9"/>
+ <a u="948D" b="EE CA"/>
+ <a u="948E" b="C7 A5"/>
+ <a u="948F" b="EE CB"/>
+ <a u="9490" b="EE CC"/>
+ <a u="9491" b="E8 95"/>
+ <a u="9492" b="B7 B0"/>
+ <a u="9493" b="B5 F6"/>
+ <a u="9494" b="EE CD"/>
+ <a u="9495" b="EE CF"/>
+ <a u="9496" b="E8 96"/>
+ <a u="9497" b="EE CE"/>
+ <a u="9498" b="E8 97"/>
+ <a u="9499" b="B8 C6"/>
+ <a u="949A" b="EE D0"/>
+ <a u="949B" b="EE D1"/>
+ <a u="949C" b="EE D2"/>
+ <a u="949D" b="B6 DB"/>
+ <a u="949E" b="B3 AE"/>
+ <a u="949F" b="D6 D3"/>
+ <a u="94A0" b="C4 C6"/>
+ <a u="94A1" b="B1 B5"/>
+ <a u="94A2" b="B8 D6"/>
+ <a u="94A3" b="EE D3"/>
+ <a u="94A4" b="EE D4"/>
+ <a u="94A5" b="D4 BF"/>
+ <a u="94A6" b="C7 D5"/>
+ <a u="94A7" b="BE FB"/>
+ <a u="94A8" b="CE D9"/>
+ <a u="94A9" b="B9 B3"/>
+ <a u="94AA" b="EE D6"/>
+ <a u="94AB" b="EE D5"/>
+ <a u="94AC" b="EE D8"/>
+ <a u="94AD" b="EE D7"/>
+ <a u="94AE" b="C5 A5"/>
+ <a u="94AF" b="EE D9"/>
+ <a u="94B0" b="EE DA"/>
+ <a u="94B1" b="C7 AE"/>
+ <a u="94B2" b="EE DB"/>
+ <a u="94B3" b="C7 AF"/>
+ <a u="94B4" b="EE DC"/>
+ <a u="94B5" b="B2 A7"/>
+ <a u="94B6" b="EE DD"/>
+ <a u="94B7" b="EE DE"/>
+ <a u="94B8" b="EE DF"/>
+ <a u="94B9" b="EE E0"/>
+ <a u="94BA" b="EE E1"/>
+ <a u="94BB" b="D7 EA"/>
+ <a u="94BC" b="EE E2"/>
+ <a u="94BD" b="EE E3"/>
+ <a u="94BE" b="BC D8"/>
+ <a u="94BF" b="EE E4"/>
+ <a u="94C0" b="D3 CB"/>
+ <a u="94C1" b="CC FA"/>
+ <a u="94C2" b="B2 AC"/>
+ <a u="94C3" b="C1 E5"/>
+ <a u="94C4" b="EE E5"/>
+ <a u="94C5" b="C7 A6"/>
+ <a u="94C6" b="C3 AD"/>
+ <a u="94C7" b="E8 98"/>
+ <a u="94C8" b="EE E6"/>
+ <a u="94C9" b="EE E7"/>
+ <a u="94CA" b="EE E8"/>
+ <a u="94CB" b="EE E9"/>
+ <a u="94CC" b="EE EA"/>
+ <a u="94CD" b="EE EB"/>
+ <a u="94CE" b="EE EC"/>
+ <a u="94CF" b="E8 99"/>
+ <a u="94D0" b="EE ED"/>
+ <a u="94D1" b="EE EE"/>
+ <a u="94D2" b="EE EF"/>
+ <a u="94D3" b="E8 9A"/>
+ <a u="94D4" b="E8 9B"/>
+ <a u="94D5" b="EE F0"/>
+ <a u="94D6" b="EE F1"/>
+ <a u="94D7" b="EE F2"/>
+ <a u="94D8" b="EE F4"/>
+ <a u="94D9" b="EE F3"/>
+ <a u="94DA" b="E8 9C"/>
+ <a u="94DB" b="EE F5"/>
+ <a u="94DC" b="CD AD"/>
+ <a u="94DD" b="C2 C1"/>
+ <a u="94DE" b="EE F6"/>
+ <a u="94DF" b="EE F7"/>
+ <a u="94E0" b="EE F8"/>
+ <a u="94E1" b="D5 A1"/>
+ <a u="94E2" b="EE F9"/>
+ <a u="94E3" b="CF B3"/>
+ <a u="94E4" b="EE FA"/>
+ <a u="94E5" b="EE FB"/>
+ <a u="94E6" b="E8 9D"/>
+ <a u="94E7" b="EE FC"/>
+ <a u="94E8" b="EE FD"/>
+ <a u="94E9" b="EF A1"/>
+ <a u="94EA" b="EE FE"/>
+ <a u="94EB" b="EF A2"/>
+ <a u="94EC" b="B8 F5"/>
+ <a u="94ED" b="C3 FA"/>
+ <a u="94EE" b="EF A3"/>
+ <a u="94EF" b="EF A4"/>
+ <a u="94F0" b="BD C2"/>
+ <a u="94F1" b="D2 BF"/>
+ <a u="94F2" b="B2 F9"/>
+ <a u="94F3" b="EF A5"/>
+ <a u="94F4" b="EF A6"/>
+ <a u="94F5" b="EF A7"/>
+ <a u="94F6" b="D2 F8"/>
+ <a u="94F7" b="EF A8"/>
+ <a u="94F8" b="D6 FD"/>
+ <a u="94F9" b="EF A9"/>
+ <a u="94FA" b="C6 CC"/>
+ <a u="94FB" b="E8 9E"/>
+ <a u="94FC" b="EF AA"/>
+ <a u="94FD" b="EF AB"/>
+ <a u="94FE" b="C1 B4"/>
+ <a u="94FF" b="EF AC"/>
+ <a u="9500" b="CF FA"/>
+ <a u="9501" b="CB F8"/>
+ <a u="9502" b="EF AE"/>
+ <a u="9503" b="EF AD"/>
+ <a u="9504" b="B3 FA"/>
+ <a u="9505" b="B9 F8"/>
+ <a u="9506" b="EF AF"/>
+ <a u="9507" b="EF B0"/>
+ <a u="9508" b="D0 E2"/>
+ <a u="9509" b="EF B1"/>
+ <a u="950A" b="EF B2"/>
+ <a u="950B" b="B7 E6"/>
+ <a u="950C" b="D0 BF"/>
+ <a u="950D" b="EF B3"/>
+ <a u="950E" b="EF B4"/>
+ <a u="950F" b="EF B5"/>
+ <a u="9510" b="C8 F1"/>
+ <a u="9511" b="CC E0"/>
+ <a u="9512" b="EF B6"/>
+ <a u="9513" b="EF B7"/>
+ <a u="9514" b="EF B8"/>
+ <a u="9515" b="EF B9"/>
+ <a u="9516" b="EF BA"/>
+ <a u="9517" b="D5 E0"/>
+ <a u="9518" b="EF BB"/>
+ <a u="9519" b="B4 ED"/>
+ <a u="951A" b="C3 AA"/>
+ <a u="951B" b="EF BC"/>
+ <a u="951C" b="E8 9F"/>
+ <a u="951D" b="EF BD"/>
+ <a u="951E" b="EF BE"/>
+ <a u="951F" b="EF BF"/>
+ <a u="9520" b="E8 A0"/>
+ <a u="9521" b="CE FD"/>
+ <a u="9522" b="EF C0"/>
+ <a u="9523" b="C2 E0"/>
+ <a u="9524" b="B4 B8"/>
+ <a u="9525" b="D7 B6"/>
+ <a u="9526" b="BD F5"/>
+ <a u="9527" b="E9 40"/>
+ <a u="9528" b="CF C7"/>
+ <a u="9529" b="EF C3"/>
+ <a u="952A" b="EF C1"/>
+ <a u="952B" b="EF C2"/>
+ <a u="952C" b="EF C4"/>
+ <a u="952D" b="B6 A7"/>
+ <a u="952E" b="BC FC"/>
+ <a u="952F" b="BE E2"/>
+ <a u="9530" b="C3 CC"/>
+ <a u="9531" b="EF C5"/>
+ <a u="9532" b="EF C6"/>
+ <a u="9533" b="E9 41"/>
+ <a u="9534" b="EF C7"/>
+ <a u="9535" b="EF CF"/>
+ <a u="9536" b="EF C8"/>
+ <a u="9537" b="EF C9"/>
+ <a u="9538" b="EF CA"/>
+ <a u="9539" b="C7 C2"/>
+ <a u="953A" b="EF F1"/>
+ <a u="953B" b="B6 CD"/>
+ <a u="953C" b="EF CB"/>
+ <a u="953D" b="E9 42"/>
+ <a u="953E" b="EF CC"/>
+ <a u="953F" b="EF CD"/>
+ <a u="9540" b="B6 C6"/>
+ <a u="9541" b="C3 BE"/>
+ <a u="9542" b="EF CE"/>
+ <a u="9543" b="E9 43"/>
+ <a u="9544" b="EF D0"/>
+ <a u="9545" b="EF D1"/>
+ <a u="9546" b="EF D2"/>
+ <a u="9547" b="D5 F2"/>
+ <a u="9548" b="E9 44"/>
+ <a u="9549" b="EF D3"/>
+ <a u="954A" b="C4 F7"/>
+ <a u="954B" b="E9 45"/>
+ <a u="954C" b="EF D4"/>
+ <a u="954D" b="C4 F8"/>
+ <a u="954E" b="EF D5"/>
+ <a u="954F" b="EF D6"/>
+ <a u="9550" b="B8 E4"/>
+ <a u="9551" b="B0 F7"/>
+ <a u="9552" b="EF D7"/>
+ <a u="9553" b="EF D8"/>
+ <a u="9554" b="EF D9"/>
+ <a u="9555" b="E9 46"/>
+ <a u="9556" b="EF DA"/>
+ <a u="9557" b="EF DB"/>
+ <a u="9558" b="EF DC"/>
+ <a u="9559" b="EF DD"/>
+ <a u="955A" b="E9 47"/>
+ <a u="955B" b="EF DE"/>
+ <a u="955C" b="BE B5"/>
+ <a u="955D" b="EF E1"/>
+ <a u="955E" b="EF DF"/>
+ <a u="955F" b="EF E0"/>
+ <a u="9560" b="E9 48"/>
+ <a u="9561" b="EF E2"/>
+ <a u="9562" b="EF E3"/>
+ <a u="9563" b="C1 CD"/>
+ <a u="9564" b="EF E4"/>
+ <a u="9565" b="EF E5"/>
+ <a u="9566" b="EF E6"/>
+ <a u="9567" b="EF E7"/>
+ <a u="9568" b="EF E8"/>
+ <a u="9569" b="EF E9"/>
+ <a u="956A" b="EF EA"/>
+ <a u="956B" b="EF EB"/>
+ <a u="956C" b="EF EC"/>
+ <a u="956D" b="C0 D8"/>
+ <a u="956E" b="E9 49"/>
+ <a u="956F" b="EF ED"/>
+ <a u="9570" b="C1 AD"/>
+ <a u="9571" b="EF EE"/>
+ <a u="9572" b="EF EF"/>
+ <a u="9573" b="EF F0"/>
+ <a u="9574" b="E9 4A"/>
+ <a u="9575" b="E9 4B"/>
+ <a u="9576" b="CF E2"/>
+ <a u="9577" b="E9 4C"/>
+ <a u="9578" b="E9 4D"/>
+ <a u="9579" b="E9 4E"/>
+ <a u="957A" b="E9 4F"/>
+ <a u="957B" b="E9 50"/>
+ <a u="957C" b="E9 51"/>
+ <a u="957D" b="E9 52"/>
+ <a u="957E" b="E9 53"/>
+ <a u="957F" b="B3 A4"/>
+ <a u="9580" b="E9 54"/>
+ <a u="9581" b="E9 55"/>
+ <a u="9582" b="E9 56"/>
+ <a u="9583" b="E9 57"/>
+ <a u="9584" b="E9 58"/>
+ <a u="9585" b="E9 59"/>
+ <a u="9586" b="E9 5A"/>
+ <a u="9587" b="E9 5B"/>
+ <a u="9588" b="E9 5C"/>
+ <a u="9589" b="E9 5D"/>
+ <a u="958A" b="E9 5E"/>
+ <a u="958B" b="E9 5F"/>
+ <a u="958C" b="E9 60"/>
+ <a u="958D" b="E9 61"/>
+ <a u="958E" b="E9 62"/>
+ <a u="958F" b="E9 63"/>
+ <a u="9590" b="E9 64"/>
+ <a u="9591" b="E9 65"/>
+ <a u="9592" b="E9 66"/>
+ <a u="9593" b="E9 67"/>
+ <a u="9594" b="E9 68"/>
+ <a u="9595" b="E9 69"/>
+ <a u="9596" b="E9 6A"/>
+ <a u="9597" b="E9 6B"/>
+ <a u="9598" b="E9 6C"/>
+ <a u="9599" b="E9 6D"/>
+ <a u="959A" b="E9 6E"/>
+ <a u="959B" b="E9 6F"/>
+ <a u="959C" b="E9 70"/>
+ <a u="959D" b="E9 71"/>
+ <a u="959E" b="E9 72"/>
+ <a u="959F" b="E9 73"/>
+ <a u="95A0" b="E9 74"/>
+ <a u="95A1" b="E9 75"/>
+ <a u="95A2" b="E9 76"/>
+ <a u="95A3" b="E9 77"/>
+ <a u="95A4" b="E9 78"/>
+ <a u="95A5" b="E9 79"/>
+ <a u="95A6" b="E9 7A"/>
+ <a u="95A7" b="E9 7B"/>
+ <a u="95A8" b="E9 7C"/>
+ <a u="95A9" b="E9 7D"/>
+ <a u="95AA" b="E9 7E"/>
+ <a u="95AB" b="E9 80"/>
+ <a u="95AC" b="E9 81"/>
+ <a u="95AD" b="E9 82"/>
+ <a u="95AE" b="E9 83"/>
+ <a u="95AF" b="E9 84"/>
+ <a u="95B0" b="E9 85"/>
+ <a u="95B1" b="E9 86"/>
+ <a u="95B2" b="E9 87"/>
+ <a u="95B3" b="E9 88"/>
+ <a u="95B4" b="E9 89"/>
+ <a u="95B5" b="E9 8A"/>
+ <a u="95B6" b="E9 8B"/>
+ <a u="95B7" b="E9 8C"/>
+ <a u="95B8" b="E9 8D"/>
+ <a u="95B9" b="E9 8E"/>
+ <a u="95BA" b="E9 8F"/>
+ <a u="95BB" b="E9 90"/>
+ <a u="95BC" b="E9 91"/>
+ <a u="95BD" b="E9 92"/>
+ <a u="95BE" b="E9 93"/>
+ <a u="95BF" b="E9 94"/>
+ <a u="95C0" b="E9 95"/>
+ <a u="95C1" b="E9 96"/>
+ <a u="95C2" b="E9 97"/>
+ <a u="95C3" b="E9 98"/>
+ <a u="95C4" b="E9 99"/>
+ <a u="95C5" b="E9 9A"/>
+ <a u="95C6" b="E9 9B"/>
+ <a u="95C7" b="E9 9C"/>
+ <a u="95C8" b="E9 9D"/>
+ <a u="95C9" b="E9 9E"/>
+ <a u="95CA" b="E9 9F"/>
+ <a u="95CB" b="E9 A0"/>
+ <a u="95CC" b="EA 40"/>
+ <a u="95CD" b="EA 41"/>
+ <a u="95CE" b="EA 42"/>
+ <a u="95CF" b="EA 43"/>
+ <a u="95D0" b="EA 44"/>
+ <a u="95D1" b="EA 45"/>
+ <a u="95D2" b="EA 46"/>
+ <a u="95D3" b="EA 47"/>
+ <a u="95D4" b="EA 48"/>
+ <a u="95D5" b="EA 49"/>
+ <a u="95D6" b="EA 4A"/>
+ <a u="95D7" b="EA 4B"/>
+ <a u="95D8" b="EA 4C"/>
+ <a u="95D9" b="EA 4D"/>
+ <a u="95DA" b="EA 4E"/>
+ <a u="95DB" b="EA 4F"/>
+ <a u="95DC" b="EA 50"/>
+ <a u="95DD" b="EA 51"/>
+ <a u="95DE" b="EA 52"/>
+ <a u="95DF" b="EA 53"/>
+ <a u="95E0" b="EA 54"/>
+ <a u="95E1" b="EA 55"/>
+ <a u="95E2" b="EA 56"/>
+ <a u="95E3" b="EA 57"/>
+ <a u="95E4" b="EA 58"/>
+ <a u="95E5" b="EA 59"/>
+ <a u="95E6" b="EA 5A"/>
+ <a u="95E7" b="EA 5B"/>
+ <a u="95E8" b="C3 C5"/>
+ <a u="95E9" b="E3 C5"/>
+ <a u="95EA" b="C9 C1"/>
+ <a u="95EB" b="E3 C6"/>
+ <a u="95EC" b="EA 5C"/>
+ <a u="95ED" b="B1 D5"/>
+ <a u="95EE" b="CE CA"/>
+ <a u="95EF" b="B4 B3"/>
+ <a u="95F0" b="C8 F2"/>
+ <a u="95F1" b="E3 C7"/>
+ <a u="95F2" b="CF D0"/>
+ <a u="95F3" b="E3 C8"/>
+ <a u="95F4" b="BC E4"/>
+ <a u="95F5" b="E3 C9"/>
+ <a u="95F6" b="E3 CA"/>
+ <a u="95F7" b="C3 C6"/>
+ <a u="95F8" b="D5 A2"/>
+ <a u="95F9" b="C4 D6"/>
+ <a u="95FA" b="B9 EB"/>
+ <a u="95FB" b="CE C5"/>
+ <a u="95FC" b="E3 CB"/>
+ <a u="95FD" b="C3 F6"/>
+ <a u="95FE" b="E3 CC"/>
+ <a u="95FF" b="EA 5D"/>
+ <a u="9600" b="B7 A7"/>
+ <a u="9601" b="B8 F3"/>
+ <a u="9602" b="BA D2"/>
+ <a u="9603" b="E3 CD"/>
+ <a u="9604" b="E3 CE"/>
+ <a u="9605" b="D4 C4"/>
+ <a u="9606" b="E3 CF"/>
+ <a u="9607" b="EA 5E"/>
+ <a u="9608" b="E3 D0"/>
+ <a u="9609" b="D1 CB"/>
+ <a u="960A" b="E3 D1"/>
+ <a u="960B" b="E3 D2"/>
+ <a u="960C" b="E3 D3"/>
+ <a u="960D" b="E3 D4"/>
+ <a u="960E" b="D1 D6"/>
+ <a u="960F" b="E3 D5"/>
+ <a u="9610" b="B2 FB"/>
+ <a u="9611" b="C0 BB"/>
+ <a u="9612" b="E3 D6"/>
+ <a u="9613" b="EA 5F"/>
+ <a u="9614" b="C0 AB"/>
+ <a u="9615" b="E3 D7"/>
+ <a u="9616" b="E3 D8"/>
+ <a u="9617" b="E3 D9"/>
+ <a u="9618" b="EA 60"/>
+ <a u="9619" b="E3 DA"/>
+ <a u="961A" b="E3 DB"/>
+ <a u="961B" b="EA 61"/>
+ <a u="961C" b="B8 B7"/>
+ <a u="961D" b="DA E2"/>
+ <a u="961E" b="EA 62"/>
+ <a u="961F" b="B6 D3"/>
+ <a u="9620" b="EA 63"/>
+ <a u="9621" b="DA E4"/>
+ <a u="9622" b="DA E3"/>
+ <a u="9623" b="EA 64"/>
+ <a u="9624" b="EA 65"/>
+ <a u="9625" b="EA 66"/>
+ <a u="9626" b="EA 67"/>
+ <a u="9627" b="EA 68"/>
+ <a u="9628" b="EA 69"/>
+ <a u="9629" b="EA 6A"/>
+ <a u="962A" b="DA E6"/>
+ <a u="962B" b="EA 6B"/>
+ <a u="962C" b="EA 6C"/>
+ <a u="962D" b="EA 6D"/>
+ <a u="962E" b="C8 EE"/>
+ <a u="962F" b="EA 6E"/>
+ <a u="9630" b="EA 6F"/>
+ <a u="9631" b="DA E5"/>
+ <a u="9632" b="B7 C0"/>
+ <a u="9633" b="D1 F4"/>
+ <a u="9634" b="D2 F5"/>
+ <a u="9635" b="D5 F3"/>
+ <a u="9636" b="BD D7"/>
+ <a u="9637" b="EA 70"/>
+ <a u="9638" b="EA 71"/>
+ <a u="9639" b="EA 72"/>
+ <a u="963A" b="EA 73"/>
+ <a u="963B" b="D7 E8"/>
+ <a u="963C" b="DA E8"/>
+ <a u="963D" b="DA E7"/>
+ <a u="963E" b="EA 74"/>
+ <a u="963F" b="B0 A2"/>
+ <a u="9640" b="CD D3"/>
+ <a u="9641" b="EA 75"/>
+ <a u="9642" b="DA E9"/>
+ <a u="9643" b="EA 76"/>
+ <a u="9644" b="B8 BD"/>
+ <a u="9645" b="BC CA"/>
+ <a u="9646" b="C2 BD"/>
+ <a u="9647" b="C2 A4"/>
+ <a u="9648" b="B3 C2"/>
+ <a u="9649" b="DA EA"/>
+ <a u="964A" b="EA 77"/>
+ <a u="964B" b="C2 AA"/>
+ <a u="964C" b="C4 B0"/>
+ <a u="964D" b="BD B5"/>
+ <a u="964E" b="EA 78"/>
+ <a u="964F" b="EA 79"/>
+ <a u="9650" b="CF DE"/>
+ <a u="9651" b="EA 7A"/>
+ <a u="9652" b="EA 7B"/>
+ <a u="9653" b="EA 7C"/>
+ <a u="9654" b="DA EB"/>
+ <a u="9655" b="C9 C2"/>
+ <a u="9656" b="EA 7D"/>
+ <a u="9657" b="EA 7E"/>
+ <a u="9658" b="EA 80"/>
+ <a u="9659" b="EA 81"/>
+ <a u="965A" b="EA 82"/>
+ <a u="965B" b="B1 DD"/>
+ <a u="965C" b="EA 83"/>
+ <a u="965D" b="EA 84"/>
+ <a u="965E" b="EA 85"/>
+ <a u="965F" b="DA EC"/>
+ <a u="9660" b="EA 86"/>
+ <a u="9661" b="B6 B8"/>
+ <a u="9662" b="D4 BA"/>
+ <a u="9663" b="EA 87"/>
+ <a u="9664" b="B3 FD"/>
+ <a u="9665" b="EA 88"/>
+ <a u="9666" b="EA 89"/>
+ <a u="9667" b="DA ED"/>
+ <a u="9668" b="D4 C9"/>
+ <a u="9669" b="CF D5"/>
+ <a u="966A" b="C5 E3"/>
+ <a u="966B" b="EA 8A"/>
+ <a u="966C" b="DA EE"/>
+ <a u="966D" b="EA 8B"/>
+ <a u="966E" b="EA 8C"/>
+ <a u="966F" b="EA 8D"/>
+ <a u="9670" b="EA 8E"/>
+ <a u="9671" b="EA 8F"/>
+ <a u="9672" b="DA EF"/>
+ <a u="9673" b="EA 90"/>
+ <a u="9674" b="DA F0"/>
+ <a u="9675" b="C1 EA"/>
+ <a u="9676" b="CC D5"/>
+ <a u="9677" b="CF DD"/>
+ <a u="9678" b="EA 91"/>
+ <a u="9679" b="EA 92"/>
+ <a u="967A" b="EA 93"/>
+ <a u="967B" b="EA 94"/>
+ <a u="967C" b="EA 95"/>
+ <a u="967D" b="EA 96"/>
+ <a u="967E" b="EA 97"/>
+ <a u="967F" b="EA 98"/>
+ <a u="9680" b="EA 99"/>
+ <a u="9681" b="EA 9A"/>
+ <a u="9682" b="EA 9B"/>
+ <a u="9683" b="EA 9C"/>
+ <a u="9684" b="EA 9D"/>
+ <a u="9685" b="D3 E7"/>
+ <a u="9686" b="C2 A1"/>
+ <a u="9687" b="EA 9E"/>
+ <a u="9688" b="DA F1"/>
+ <a u="9689" b="EA 9F"/>
+ <a u="968A" b="EA A0"/>
+ <a u="968B" b="CB E5"/>
+ <a u="968C" b="EB 40"/>
+ <a u="968D" b="DA F2"/>
+ <a u="968E" b="EB 41"/>
+ <a u="968F" b="CB E6"/>
+ <a u="9690" b="D2 FE"/>
+ <a u="9691" b="EB 42"/>
+ <a u="9692" b="EB 43"/>
+ <a u="9693" b="EB 44"/>
+ <a u="9694" b="B8 F4"/>
+ <a u="9695" b="EB 45"/>
+ <a u="9696" b="EB 46"/>
+ <a u="9697" b="DA F3"/>
+ <a u="9698" b="B0 AF"/>
+ <a u="9699" b="CF B6"/>
+ <a u="969A" b="EB 47"/>
+ <a u="969B" b="EB 48"/>
+ <a u="969C" b="D5 CF"/>
+ <a u="969D" b="EB 49"/>
+ <a u="969E" b="EB 4A"/>
+ <a u="969F" b="EB 4B"/>
+ <a u="96A0" b="EB 4C"/>
+ <a u="96A1" b="EB 4D"/>
+ <a u="96A2" b="EB 4E"/>
+ <a u="96A3" b="EB 4F"/>
+ <a u="96A4" b="EB 50"/>
+ <a u="96A5" b="EB 51"/>
+ <a u="96A6" b="EB 52"/>
+ <a u="96A7" b="CB ED"/>
+ <a u="96A8" b="EB 53"/>
+ <a u="96A9" b="EB 54"/>
+ <a u="96AA" b="EB 55"/>
+ <a u="96AB" b="EB 56"/>
+ <a u="96AC" b="EB 57"/>
+ <a u="96AD" b="EB 58"/>
+ <a u="96AE" b="EB 59"/>
+ <a u="96AF" b="EB 5A"/>
+ <a u="96B0" b="DA F4"/>
+ <a u="96B1" b="EB 5B"/>
+ <a u="96B2" b="EB 5C"/>
+ <a u="96B3" b="E3 C4"/>
+ <a u="96B4" b="EB 5D"/>
+ <a u="96B5" b="EB 5E"/>
+ <a u="96B6" b="C1 A5"/>
+ <a u="96B7" b="EB 5F"/>
+ <a u="96B8" b="EB 60"/>
+ <a u="96B9" b="F6 BF"/>
+ <a u="96BA" b="EB 61"/>
+ <a u="96BB" b="EB 62"/>
+ <a u="96BC" b="F6 C0"/>
+ <a u="96BD" b="F6 C1"/>
+ <a u="96BE" b="C4 D1"/>
+ <a u="96BF" b="EB 63"/>
+ <a u="96C0" b="C8 B8"/>
+ <a u="96C1" b="D1 E3"/>
+ <a u="96C2" b="EB 64"/>
+ <a u="96C3" b="EB 65"/>
+ <a u="96C4" b="D0 DB"/>
+ <a u="96C5" b="D1 C5"/>
+ <a u="96C6" b="BC AF"/>
+ <a u="96C7" b="B9 CD"/>
+ <a u="96C8" b="EB 66"/>
+ <a u="96C9" b="EF F4"/>
+ <a u="96CA" b="EB 67"/>
+ <a u="96CB" b="EB 68"/>
+ <a u="96CC" b="B4 C6"/>
+ <a u="96CD" b="D3 BA"/>
+ <a u="96CE" b="F6 C2"/>
+ <a u="96CF" b="B3 FB"/>
+ <a u="96D0" b="EB 69"/>
+ <a u="96D1" b="EB 6A"/>
+ <a u="96D2" b="F6 C3"/>
+ <a u="96D3" b="EB 6B"/>
+ <a u="96D4" b="EB 6C"/>
+ <a u="96D5" b="B5 F1"/>
+ <a u="96D6" b="EB 6D"/>
+ <a u="96D7" b="EB 6E"/>
+ <a u="96D8" b="EB 6F"/>
+ <a u="96D9" b="EB 70"/>
+ <a u="96DA" b="EB 71"/>
+ <a u="96DB" b="EB 72"/>
+ <a u="96DC" b="EB 73"/>
+ <a u="96DD" b="EB 74"/>
+ <a u="96DE" b="EB 75"/>
+ <a u="96DF" b="EB 76"/>
+ <a u="96E0" b="F6 C5"/>
+ <a u="96E1" b="EB 77"/>
+ <a u="96E2" b="EB 78"/>
+ <a u="96E3" b="EB 79"/>
+ <a u="96E4" b="EB 7A"/>
+ <a u="96E5" b="EB 7B"/>
+ <a u="96E6" b="EB 7C"/>
+ <a u="96E7" b="EB 7D"/>
+ <a u="96E8" b="D3 EA"/>
+ <a u="96E9" b="F6 A7"/>
+ <a u="96EA" b="D1 A9"/>
+ <a u="96EB" b="EB 7E"/>
+ <a u="96EC" b="EB 80"/>
+ <a u="96ED" b="EB 81"/>
+ <a u="96EE" b="EB 82"/>
+ <a u="96EF" b="F6 A9"/>
+ <a u="96F0" b="EB 83"/>
+ <a u="96F1" b="EB 84"/>
+ <a u="96F2" b="EB 85"/>
+ <a u="96F3" b="F6 A8"/>
+ <a u="96F4" b="EB 86"/>
+ <a u="96F5" b="EB 87"/>
+ <a u="96F6" b="C1 E3"/>
+ <a u="96F7" b="C0 D7"/>
+ <a u="96F8" b="EB 88"/>
+ <a u="96F9" b="B1 A2"/>
+ <a u="96FA" b="EB 89"/>
+ <a u="96FB" b="EB 8A"/>
+ <a u="96FC" b="EB 8B"/>
+ <a u="96FD" b="EB 8C"/>
+ <a u="96FE" b="CE ED"/>
+ <a u="96FF" b="EB 8D"/>
+ <a u="9700" b="D0 E8"/>
+ <a u="9701" b="F6 AB"/>
+ <a u="9702" b="EB 8E"/>
+ <a u="9703" b="EB 8F"/>
+ <a u="9704" b="CF F6"/>
+ <a u="9705" b="EB 90"/>
+ <a u="9706" b="F6 AA"/>
+ <a u="9707" b="D5 F0"/>
+ <a u="9708" b="F6 AC"/>
+ <a u="9709" b="C3 B9"/>
+ <a u="970A" b="EB 91"/>
+ <a u="970B" b="EB 92"/>
+ <a u="970C" b="EB 93"/>
+ <a u="970D" b="BB F4"/>
+ <a u="970E" b="F6 AE"/>
+ <a u="970F" b="F6 AD"/>
+ <a u="9710" b="EB 94"/>
+ <a u="9711" b="EB 95"/>
+ <a u="9712" b="EB 96"/>
+ <a u="9713" b="C4 DE"/>
+ <a u="9714" b="EB 97"/>
+ <a u="9715" b="EB 98"/>
+ <a u="9716" b="C1 D8"/>
+ <a u="9717" b="EB 99"/>
+ <a u="9718" b="EB 9A"/>
+ <a u="9719" b="EB 9B"/>
+ <a u="971A" b="EB 9C"/>
+ <a u="971B" b="EB 9D"/>
+ <a u="971C" b="CB AA"/>
+ <a u="971D" b="EB 9E"/>
+ <a u="971E" b="CF BC"/>
+ <a u="971F" b="EB 9F"/>
+ <a u="9720" b="EB A0"/>
+ <a u="9721" b="EC 40"/>
+ <a u="9722" b="EC 41"/>
+ <a u="9723" b="EC 42"/>
+ <a u="9724" b="EC 43"/>
+ <a u="9725" b="EC 44"/>
+ <a u="9726" b="EC 45"/>
+ <a u="9727" b="EC 46"/>
+ <a u="9728" b="EC 47"/>
+ <a u="9729" b="EC 48"/>
+ <a u="972A" b="F6 AF"/>
+ <a u="972B" b="EC 49"/>
+ <a u="972C" b="EC 4A"/>
+ <a u="972D" b="F6 B0"/>
+ <a u="972E" b="EC 4B"/>
+ <a u="972F" b="EC 4C"/>
+ <a u="9730" b="F6 B1"/>
+ <a u="9731" b="EC 4D"/>
+ <a u="9732" b="C2 B6"/>
+ <a u="9733" b="EC 4E"/>
+ <a u="9734" b="EC 4F"/>
+ <a u="9735" b="EC 50"/>
+ <a u="9736" b="EC 51"/>
+ <a u="9737" b="EC 52"/>
+ <a u="9738" b="B0 D4"/>
+ <a u="9739" b="C5 F9"/>
+ <a u="973A" b="EC 53"/>
+ <a u="973B" b="EC 54"/>
+ <a u="973C" b="EC 55"/>
+ <a u="973D" b="EC 56"/>
+ <a u="973E" b="F6 B2"/>
+ <a u="973F" b="EC 57"/>
+ <a u="9740" b="EC 58"/>
+ <a u="9741" b="EC 59"/>
+ <a u="9742" b="EC 5A"/>
+ <a u="9743" b="EC 5B"/>
+ <a u="9744" b="EC 5C"/>
+ <a u="9745" b="EC 5D"/>
+ <a u="9746" b="EC 5E"/>
+ <a u="9747" b="EC 5F"/>
+ <a u="9748" b="EC 60"/>
+ <a u="9749" b="EC 61"/>
+ <a u="974A" b="EC 62"/>
+ <a u="974B" b="EC 63"/>
+ <a u="974C" b="EC 64"/>
+ <a u="974D" b="EC 65"/>
+ <a u="974E" b="EC 66"/>
+ <a u="974F" b="EC 67"/>
+ <a u="9750" b="EC 68"/>
+ <a u="9751" b="EC 69"/>
+ <a u="9752" b="C7 E0"/>
+ <a u="9753" b="F6 A6"/>
+ <a u="9754" b="EC 6A"/>
+ <a u="9755" b="EC 6B"/>
+ <a u="9756" b="BE B8"/>
+ <a u="9757" b="EC 6C"/>
+ <a u="9758" b="EC 6D"/>
+ <a u="9759" b="BE B2"/>
+ <a u="975A" b="EC 6E"/>
+ <a u="975B" b="B5 E5"/>
+ <a u="975C" b="EC 6F"/>
+ <a u="975D" b="EC 70"/>
+ <a u="975E" b="B7 C7"/>
+ <a u="975F" b="EC 71"/>
+ <a u="9760" b="BF BF"/>
+ <a u="9761" b="C3 D2"/>
+ <a u="9762" b="C3 E6"/>
+ <a u="9763" b="EC 72"/>
+ <a u="9764" b="EC 73"/>
+ <a u="9765" b="D8 CC"/>
+ <a u="9766" b="EC 74"/>
+ <a u="9767" b="EC 75"/>
+ <a u="9768" b="EC 76"/>
+ <a u="9769" b="B8 EF"/>
+ <a u="976A" b="EC 77"/>
+ <a u="976B" b="EC 78"/>
+ <a u="976C" b="EC 79"/>
+ <a u="976D" b="EC 7A"/>
+ <a u="976E" b="EC 7B"/>
+ <a u="976F" b="EC 7C"/>
+ <a u="9770" b="EC 7D"/>
+ <a u="9771" b="EC 7E"/>
+ <a u="9772" b="EC 80"/>
+ <a u="9773" b="BD F9"/>
+ <a u="9774" b="D1 A5"/>
+ <a u="9775" b="EC 81"/>
+ <a u="9776" b="B0 D0"/>
+ <a u="9777" b="EC 82"/>
+ <a u="9778" b="EC 83"/>
+ <a u="9779" b="EC 84"/>
+ <a u="977A" b="EC 85"/>
+ <a u="977B" b="EC 86"/>
+ <a u="977C" b="F7 B0"/>
+ <a u="977D" b="EC 87"/>
+ <a u="977E" b="EC 88"/>
+ <a u="977F" b="EC 89"/>
+ <a u="9780" b="EC 8A"/>
+ <a u="9781" b="EC 8B"/>
+ <a u="9782" b="EC 8C"/>
+ <a u="9783" b="EC 8D"/>
+ <a u="9784" b="EC 8E"/>
+ <a u="9785" b="F7 B1"/>
+ <a u="9786" b="EC 8F"/>
+ <a u="9787" b="EC 90"/>
+ <a u="9788" b="EC 91"/>
+ <a u="9789" b="EC 92"/>
+ <a u="978A" b="EC 93"/>
+ <a u="978B" b="D0 AC"/>
+ <a u="978C" b="EC 94"/>
+ <a u="978D" b="B0 B0"/>
+ <a u="978E" b="EC 95"/>
+ <a u="978F" b="EC 96"/>
+ <a u="9790" b="EC 97"/>
+ <a u="9791" b="F7 B2"/>
+ <a u="9792" b="F7 B3"/>
+ <a u="9793" b="EC 98"/>
+ <a u="9794" b="F7 B4"/>
+ <a u="9795" b="EC 99"/>
+ <a u="9796" b="EC 9A"/>
+ <a u="9797" b="EC 9B"/>
+ <a u="9798" b="C7 CA"/>
+ <a u="9799" b="EC 9C"/>
+ <a u="979A" b="EC 9D"/>
+ <a u="979B" b="EC 9E"/>
+ <a u="979C" b="EC 9F"/>
+ <a u="979D" b="EC A0"/>
+ <a u="979E" b="ED 40"/>
+ <a u="979F" b="ED 41"/>
+ <a u="97A0" b="BE CF"/>
+ <a u="97A1" b="ED 42"/>
+ <a u="97A2" b="ED 43"/>
+ <a u="97A3" b="F7 B7"/>
+ <a u="97A4" b="ED 44"/>
+ <a u="97A5" b="ED 45"/>
+ <a u="97A6" b="ED 46"/>
+ <a u="97A7" b="ED 47"/>
+ <a u="97A8" b="ED 48"/>
+ <a u="97A9" b="ED 49"/>
+ <a u="97AA" b="ED 4A"/>
+ <a u="97AB" b="F7 B6"/>
+ <a u="97AC" b="ED 4B"/>
+ <a u="97AD" b="B1 DE"/>
+ <a u="97AE" b="ED 4C"/>
+ <a u="97AF" b="F7 B5"/>
+ <a u="97B0" b="ED 4D"/>
+ <a u="97B1" b="ED 4E"/>
+ <a u="97B2" b="F7 B8"/>
+ <a u="97B3" b="ED 4F"/>
+ <a u="97B4" b="F7 B9"/>
+ <a u="97B5" b="ED 50"/>
+ <a u="97B6" b="ED 51"/>
+ <a u="97B7" b="ED 52"/>
+ <a u="97B8" b="ED 53"/>
+ <a u="97B9" b="ED 54"/>
+ <a u="97BA" b="ED 55"/>
+ <a u="97BB" b="ED 56"/>
+ <a u="97BC" b="ED 57"/>
+ <a u="97BD" b="ED 58"/>
+ <a u="97BE" b="ED 59"/>
+ <a u="97BF" b="ED 5A"/>
+ <a u="97C0" b="ED 5B"/>
+ <a u="97C1" b="ED 5C"/>
+ <a u="97C2" b="ED 5D"/>
+ <a u="97C3" b="ED 5E"/>
+ <a u="97C4" b="ED 5F"/>
+ <a u="97C5" b="ED 60"/>
+ <a u="97C6" b="ED 61"/>
+ <a u="97C7" b="ED 62"/>
+ <a u="97C8" b="ED 63"/>
+ <a u="97C9" b="ED 64"/>
+ <a u="97CA" b="ED 65"/>
+ <a u="97CB" b="ED 66"/>
+ <a u="97CC" b="ED 67"/>
+ <a u="97CD" b="ED 68"/>
+ <a u="97CE" b="ED 69"/>
+ <a u="97CF" b="ED 6A"/>
+ <a u="97D0" b="ED 6B"/>
+ <a u="97D1" b="ED 6C"/>
+ <a u="97D2" b="ED 6D"/>
+ <a u="97D3" b="ED 6E"/>
+ <a u="97D4" b="ED 6F"/>
+ <a u="97D5" b="ED 70"/>
+ <a u="97D6" b="ED 71"/>
+ <a u="97D7" b="ED 72"/>
+ <a u="97D8" b="ED 73"/>
+ <a u="97D9" b="ED 74"/>
+ <a u="97DA" b="ED 75"/>
+ <a u="97DB" b="ED 76"/>
+ <a u="97DC" b="ED 77"/>
+ <a u="97DD" b="ED 78"/>
+ <a u="97DE" b="ED 79"/>
+ <a u="97DF" b="ED 7A"/>
+ <a u="97E0" b="ED 7B"/>
+ <a u="97E1" b="ED 7C"/>
+ <a u="97E2" b="ED 7D"/>
+ <a u="97E3" b="ED 7E"/>
+ <a u="97E4" b="ED 80"/>
+ <a u="97E5" b="ED 81"/>
+ <a u="97E6" b="CE A4"/>
+ <a u="97E7" b="C8 CD"/>
+ <a u="97E8" b="ED 82"/>
+ <a u="97E9" b="BA AB"/>
+ <a u="97EA" b="E8 B8"/>
+ <a u="97EB" b="E8 B9"/>
+ <a u="97EC" b="E8 BA"/>
+ <a u="97ED" b="BE C2"/>
+ <a u="97EE" b="ED 83"/>
+ <a u="97EF" b="ED 84"/>
+ <a u="97F0" b="ED 85"/>
+ <a u="97F1" b="ED 86"/>
+ <a u="97F2" b="ED 87"/>
+ <a u="97F3" b="D2 F4"/>
+ <a u="97F4" b="ED 88"/>
+ <a u="97F5" b="D4 CF"/>
+ <a u="97F6" b="C9 D8"/>
+ <a u="97F7" b="ED 89"/>
+ <a u="97F8" b="ED 8A"/>
+ <a u="97F9" b="ED 8B"/>
+ <a u="97FA" b="ED 8C"/>
+ <a u="97FB" b="ED 8D"/>
+ <a u="97FC" b="ED 8E"/>
+ <a u="97FD" b="ED 8F"/>
+ <a u="97FE" b="ED 90"/>
+ <a u="97FF" b="ED 91"/>
+ <a u="9800" b="ED 92"/>
+ <a u="9801" b="ED 93"/>
+ <a u="9802" b="ED 94"/>
+ <a u="9803" b="ED 95"/>
+ <a u="9804" b="ED 96"/>
+ <a u="9805" b="ED 97"/>
+ <a u="9806" b="ED 98"/>
+ <a u="9807" b="ED 99"/>
+ <a u="9808" b="ED 9A"/>
+ <a u="9809" b="ED 9B"/>
+ <a u="980A" b="ED 9C"/>
+ <a u="980B" b="ED 9D"/>
+ <a u="980C" b="ED 9E"/>
+ <a u="980D" b="ED 9F"/>
+ <a u="980E" b="ED A0"/>
+ <a u="980F" b="EE 40"/>
+ <a u="9810" b="EE 41"/>
+ <a u="9811" b="EE 42"/>
+ <a u="9812" b="EE 43"/>
+ <a u="9813" b="EE 44"/>
+ <a u="9814" b="EE 45"/>
+ <a u="9815" b="EE 46"/>
+ <a u="9816" b="EE 47"/>
+ <a u="9817" b="EE 48"/>
+ <a u="9818" b="EE 49"/>
+ <a u="9819" b="EE 4A"/>
+ <a u="981A" b="EE 4B"/>
+ <a u="981B" b="EE 4C"/>
+ <a u="981C" b="EE 4D"/>
+ <a u="981D" b="EE 4E"/>
+ <a u="981E" b="EE 4F"/>
+ <a u="981F" b="EE 50"/>
+ <a u="9820" b="EE 51"/>
+ <a u="9821" b="EE 52"/>
+ <a u="9822" b="EE 53"/>
+ <a u="9823" b="EE 54"/>
+ <a u="9824" b="EE 55"/>
+ <a u="9825" b="EE 56"/>
+ <a u="9826" b="EE 57"/>
+ <a u="9827" b="EE 58"/>
+ <a u="9828" b="EE 59"/>
+ <a u="9829" b="EE 5A"/>
+ <a u="982A" b="EE 5B"/>
+ <a u="982B" b="EE 5C"/>
+ <a u="982C" b="EE 5D"/>
+ <a u="982D" b="EE 5E"/>
+ <a u="982E" b="EE 5F"/>
+ <a u="982F" b="EE 60"/>
+ <a u="9830" b="EE 61"/>
+ <a u="9831" b="EE 62"/>
+ <a u="9832" b="EE 63"/>
+ <a u="9833" b="EE 64"/>
+ <a u="9834" b="EE 65"/>
+ <a u="9835" b="EE 66"/>
+ <a u="9836" b="EE 67"/>
+ <a u="9837" b="EE 68"/>
+ <a u="9838" b="EE 69"/>
+ <a u="9839" b="EE 6A"/>
+ <a u="983A" b="EE 6B"/>
+ <a u="983B" b="EE 6C"/>
+ <a u="983C" b="EE 6D"/>
+ <a u="983D" b="EE 6E"/>
+ <a u="983E" b="EE 6F"/>
+ <a u="983F" b="EE 70"/>
+ <a u="9840" b="EE 71"/>
+ <a u="9841" b="EE 72"/>
+ <a u="9842" b="EE 73"/>
+ <a u="9843" b="EE 74"/>
+ <a u="9844" b="EE 75"/>
+ <a u="9845" b="EE 76"/>
+ <a u="9846" b="EE 77"/>
+ <a u="9847" b="EE 78"/>
+ <a u="9848" b="EE 79"/>
+ <a u="9849" b="EE 7A"/>
+ <a u="984A" b="EE 7B"/>
+ <a u="984B" b="EE 7C"/>
+ <a u="984C" b="EE 7D"/>
+ <a u="984D" b="EE 7E"/>
+ <a u="984E" b="EE 80"/>
+ <a u="984F" b="EE 81"/>
+ <a u="9850" b="EE 82"/>
+ <a u="9851" b="EE 83"/>
+ <a u="9852" b="EE 84"/>
+ <a u="9853" b="EE 85"/>
+ <a u="9854" b="EE 86"/>
+ <a u="9855" b="EE 87"/>
+ <a u="9856" b="EE 88"/>
+ <a u="9857" b="EE 89"/>
+ <a u="9858" b="EE 8A"/>
+ <a u="9859" b="EE 8B"/>
+ <a u="985A" b="EE 8C"/>
+ <a u="985B" b="EE 8D"/>
+ <a u="985C" b="EE 8E"/>
+ <a u="985D" b="EE 8F"/>
+ <a u="985E" b="EE 90"/>
+ <a u="985F" b="EE 91"/>
+ <a u="9860" b="EE 92"/>
+ <a u="9861" b="EE 93"/>
+ <a u="9862" b="EE 94"/>
+ <a u="9863" b="EE 95"/>
+ <a u="9864" b="EE 96"/>
+ <a u="9865" b="EE 97"/>
+ <a u="9866" b="EE 98"/>
+ <a u="9867" b="EE 99"/>
+ <a u="9868" b="EE 9A"/>
+ <a u="9869" b="EE 9B"/>
+ <a u="986A" b="EE 9C"/>
+ <a u="986B" b="EE 9D"/>
+ <a u="986C" b="EE 9E"/>
+ <a u="986D" b="EE 9F"/>
+ <a u="986E" b="EE A0"/>
+ <a u="986F" b="EF 40"/>
+ <a u="9870" b="EF 41"/>
+ <a u="9871" b="EF 42"/>
+ <a u="9872" b="EF 43"/>
+ <a u="9873" b="EF 44"/>
+ <a u="9874" b="EF 45"/>
+ <a u="9875" b="D2 B3"/>
+ <a u="9876" b="B6 A5"/>
+ <a u="9877" b="C7 EA"/>
+ <a u="9878" b="F1 FC"/>
+ <a u="9879" b="CF EE"/>
+ <a u="987A" b="CB B3"/>
+ <a u="987B" b="D0 EB"/>
+ <a u="987C" b="E7 EF"/>
+ <a u="987D" b="CD E7"/>
+ <a u="987E" b="B9 CB"/>
+ <a u="987F" b="B6 D9"/>
+ <a u="9880" b="F1 FD"/>
+ <a u="9881" b="B0 E4"/>
+ <a u="9882" b="CB CC"/>
+ <a u="9883" b="F1 FE"/>
+ <a u="9884" b="D4 A4"/>
+ <a u="9885" b="C2 AD"/>
+ <a u="9886" b="C1 EC"/>
+ <a u="9887" b="C6 C4"/>
+ <a u="9888" b="BE B1"/>
+ <a u="9889" b="F2 A1"/>
+ <a u="988A" b="BC D5"/>
+ <a u="988B" b="EF 46"/>
+ <a u="988C" b="F2 A2"/>
+ <a u="988D" b="F2 A3"/>
+ <a u="988E" b="EF 47"/>
+ <a u="988F" b="F2 A4"/>
+ <a u="9890" b="D2 C3"/>
+ <a u="9891" b="C6 B5"/>
+ <a u="9892" b="EF 48"/>
+ <a u="9893" b="CD C7"/>
+ <a u="9894" b="F2 A5"/>
+ <a u="9895" b="EF 49"/>
+ <a u="9896" b="D3 B1"/>
+ <a u="9897" b="BF C5"/>
+ <a u="9898" b="CC E2"/>
+ <a u="9899" b="EF 4A"/>
+ <a u="989A" b="F2 A6"/>
+ <a u="989B" b="F2 A7"/>
+ <a u="989C" b="D1 D5"/>
+ <a u="989D" b="B6 EE"/>
+ <a u="989E" b="F2 A8"/>
+ <a u="989F" b="F2 A9"/>
+ <a u="98A0" b="B5 DF"/>
+ <a u="98A1" b="F2 AA"/>
+ <a u="98A2" b="F2 AB"/>
+ <a u="98A3" b="EF 4B"/>
+ <a u="98A4" b="B2 FC"/>
+ <a u="98A5" b="F2 AC"/>
+ <a u="98A6" b="F2 AD"/>
+ <a u="98A7" b="C8 A7"/>
+ <a u="98A8" b="EF 4C"/>
+ <a u="98A9" b="EF 4D"/>
+ <a u="98AA" b="EF 4E"/>
+ <a u="98AB" b="EF 4F"/>
+ <a u="98AC" b="EF 50"/>
+ <a u="98AD" b="EF 51"/>
+ <a u="98AE" b="EF 52"/>
+ <a u="98AF" b="EF 53"/>
+ <a u="98B0" b="EF 54"/>
+ <a u="98B1" b="EF 55"/>
+ <a u="98B2" b="EF 56"/>
+ <a u="98B3" b="EF 57"/>
+ <a u="98B4" b="EF 58"/>
+ <a u="98B5" b="EF 59"/>
+ <a u="98B6" b="EF 5A"/>
+ <a u="98B7" b="EF 5B"/>
+ <a u="98B8" b="EF 5C"/>
+ <a u="98B9" b="EF 5D"/>
+ <a u="98BA" b="EF 5E"/>
+ <a u="98BB" b="EF 5F"/>
+ <a u="98BC" b="EF 60"/>
+ <a u="98BD" b="EF 61"/>
+ <a u="98BE" b="EF 62"/>
+ <a u="98BF" b="EF 63"/>
+ <a u="98C0" b="EF 64"/>
+ <a u="98C1" b="EF 65"/>
+ <a u="98C2" b="EF 66"/>
+ <a u="98C3" b="EF 67"/>
+ <a u="98C4" b="EF 68"/>
+ <a u="98C5" b="EF 69"/>
+ <a u="98C6" b="EF 6A"/>
+ <a u="98C7" b="EF 6B"/>
+ <a u="98C8" b="EF 6C"/>
+ <a u="98C9" b="EF 6D"/>
+ <a u="98CA" b="EF 6E"/>
+ <a u="98CB" b="EF 6F"/>
+ <a u="98CC" b="EF 70"/>
+ <a u="98CD" b="EF 71"/>
+ <a u="98CE" b="B7 E7"/>
+ <a u="98CF" b="EF 72"/>
+ <a u="98D0" b="EF 73"/>
+ <a u="98D1" b="EC A9"/>
+ <a u="98D2" b="EC AA"/>
+ <a u="98D3" b="EC AB"/>
+ <a u="98D4" b="EF 74"/>
+ <a u="98D5" b="EC AC"/>
+ <a u="98D6" b="EF 75"/>
+ <a u="98D7" b="EF 76"/>
+ <a u="98D8" b="C6 AE"/>
+ <a u="98D9" b="EC AD"/>
+ <a u="98DA" b="EC AE"/>
+ <a u="98DB" b="EF 77"/>
+ <a u="98DC" b="EF 78"/>
+ <a u="98DD" b="EF 79"/>
+ <a u="98DE" b="B7 C9"/>
+ <a u="98DF" b="CA B3"/>
+ <a u="98E0" b="EF 7A"/>
+ <a u="98E1" b="EF 7B"/>
+ <a u="98E2" b="EF 7C"/>
+ <a u="98E3" b="EF 7D"/>
+ <a u="98E4" b="EF 7E"/>
+ <a u="98E5" b="EF 80"/>
+ <a u="98E6" b="EF 81"/>
+ <a u="98E7" b="E2 B8"/>
+ <a u="98E8" b="F7 CF"/>
+ <a u="98E9" b="EF 82"/>
+ <a u="98EA" b="EF 83"/>
+ <a u="98EB" b="EF 84"/>
+ <a u="98EC" b="EF 85"/>
+ <a u="98ED" b="EF 86"/>
+ <a u="98EE" b="EF 87"/>
+ <a u="98EF" b="EF 88"/>
+ <a u="98F0" b="EF 89"/>
+ <a u="98F1" b="EF 8A"/>
+ <a u="98F2" b="EF 8B"/>
+ <a u="98F3" b="EF 8C"/>
+ <a u="98F4" b="EF 8D"/>
+ <a u="98F5" b="EF 8E"/>
+ <a u="98F6" b="EF 8F"/>
+ <a u="98F7" b="EF 90"/>
+ <a u="98F8" b="EF 91"/>
+ <a u="98F9" b="EF 92"/>
+ <a u="98FA" b="EF 93"/>
+ <a u="98FB" b="EF 94"/>
+ <a u="98FC" b="EF 95"/>
+ <a u="98FD" b="EF 96"/>
+ <a u="98FE" b="EF 97"/>
+ <a u="98FF" b="EF 98"/>
+ <a u="9900" b="EF 99"/>
+ <a u="9901" b="EF 9A"/>
+ <a u="9902" b="EF 9B"/>
+ <a u="9903" b="EF 9C"/>
+ <a u="9904" b="EF 9D"/>
+ <a u="9905" b="EF 9E"/>
+ <a u="9906" b="EF 9F"/>
+ <a u="9907" b="EF A0"/>
+ <a u="9908" b="F0 40"/>
+ <a u="9909" b="F0 41"/>
+ <a u="990A" b="F0 42"/>
+ <a u="990B" b="F0 43"/>
+ <a u="990C" b="F0 44"/>
+ <a u="990D" b="F7 D0"/>
+ <a u="990E" b="F0 45"/>
+ <a u="990F" b="F0 46"/>
+ <a u="9910" b="B2 CD"/>
+ <a u="9911" b="F0 47"/>
+ <a u="9912" b="F0 48"/>
+ <a u="9913" b="F0 49"/>
+ <a u="9914" b="F0 4A"/>
+ <a u="9915" b="F0 4B"/>
+ <a u="9916" b="F0 4C"/>
+ <a u="9917" b="F0 4D"/>
+ <a u="9918" b="F0 4E"/>
+ <a u="9919" b="F0 4F"/>
+ <a u="991A" b="F0 50"/>
+ <a u="991B" b="F0 51"/>
+ <a u="991C" b="F0 52"/>
+ <a u="991D" b="F0 53"/>
+ <a u="991E" b="F0 54"/>
+ <a u="991F" b="F0 55"/>
+ <a u="9920" b="F0 56"/>
+ <a u="9921" b="F0 57"/>
+ <a u="9922" b="F0 58"/>
+ <a u="9923" b="F0 59"/>
+ <a u="9924" b="F0 5A"/>
+ <a u="9925" b="F0 5B"/>
+ <a u="9926" b="F0 5C"/>
+ <a u="9927" b="F0 5D"/>
+ <a u="9928" b="F0 5E"/>
+ <a u="9929" b="F0 5F"/>
+ <a u="992A" b="F0 60"/>
+ <a u="992B" b="F0 61"/>
+ <a u="992C" b="F0 62"/>
+ <a u="992D" b="F0 63"/>
+ <a u="992E" b="F7 D1"/>
+ <a u="992F" b="F0 64"/>
+ <a u="9930" b="F0 65"/>
+ <a u="9931" b="F0 66"/>
+ <a u="9932" b="F0 67"/>
+ <a u="9933" b="F0 68"/>
+ <a u="9934" b="F0 69"/>
+ <a u="9935" b="F0 6A"/>
+ <a u="9936" b="F0 6B"/>
+ <a u="9937" b="F0 6C"/>
+ <a u="9938" b="F0 6D"/>
+ <a u="9939" b="F0 6E"/>
+ <a u="993A" b="F0 6F"/>
+ <a u="993B" b="F0 70"/>
+ <a u="993C" b="F0 71"/>
+ <a u="993D" b="F0 72"/>
+ <a u="993E" b="F0 73"/>
+ <a u="993F" b="F0 74"/>
+ <a u="9940" b="F0 75"/>
+ <a u="9941" b="F0 76"/>
+ <a u="9942" b="F0 77"/>
+ <a u="9943" b="F0 78"/>
+ <a u="9944" b="F0 79"/>
+ <a u="9945" b="F0 7A"/>
+ <a u="9946" b="F0 7B"/>
+ <a u="9947" b="F0 7C"/>
+ <a u="9948" b="F0 7D"/>
+ <a u="9949" b="F0 7E"/>
+ <a u="994A" b="F0 80"/>
+ <a u="994B" b="F0 81"/>
+ <a u="994C" b="F0 82"/>
+ <a u="994D" b="F0 83"/>
+ <a u="994E" b="F0 84"/>
+ <a u="994F" b="F0 85"/>
+ <a u="9950" b="F0 86"/>
+ <a u="9951" b="F0 87"/>
+ <a u="9952" b="F0 88"/>
+ <a u="9953" b="F0 89"/>
+ <a u="9954" b="F7 D3"/>
+ <a u="9955" b="F7 D2"/>
+ <a u="9956" b="F0 8A"/>
+ <a u="9957" b="F0 8B"/>
+ <a u="9958" b="F0 8C"/>
+ <a u="9959" b="F0 8D"/>
+ <a u="995A" b="F0 8E"/>
+ <a u="995B" b="F0 8F"/>
+ <a u="995C" b="F0 90"/>
+ <a u="995D" b="F0 91"/>
+ <a u="995E" b="F0 92"/>
+ <a u="995F" b="F0 93"/>
+ <a u="9960" b="F0 94"/>
+ <a u="9961" b="F0 95"/>
+ <a u="9962" b="F0 96"/>
+ <a u="9963" b="E2 BB"/>
+ <a u="9964" b="F0 97"/>
+ <a u="9965" b="BC A2"/>
+ <a u="9966" b="F0 98"/>
+ <a u="9967" b="E2 BC"/>
+ <a u="9968" b="E2 BD"/>
+ <a u="9969" b="E2 BE"/>
+ <a u="996A" b="E2 BF"/>
+ <a u="996B" b="E2 C0"/>
+ <a u="996C" b="E2 C1"/>
+ <a u="996D" b="B7 B9"/>
+ <a u="996E" b="D2 FB"/>
+ <a u="996F" b="BD A4"/>
+ <a u="9970" b="CA CE"/>
+ <a u="9971" b="B1 A5"/>
+ <a u="9972" b="CB C7"/>
+ <a u="9973" b="F0 99"/>
+ <a u="9974" b="E2 C2"/>
+ <a u="9975" b="B6 FC"/>
+ <a u="9976" b="C8 C4"/>
+ <a u="9977" b="E2 C3"/>
+ <a u="9978" b="F0 9A"/>
+ <a u="9979" b="F0 9B"/>
+ <a u="997A" b="BD C8"/>
+ <a u="997B" b="F0 9C"/>
+ <a u="997C" b="B1 FD"/>
+ <a u="997D" b="E2 C4"/>
+ <a u="997E" b="F0 9D"/>
+ <a u="997F" b="B6 F6"/>
+ <a u="9980" b="E2 C5"/>
+ <a u="9981" b="C4 D9"/>
+ <a u="9982" b="F0 9E"/>
+ <a u="9983" b="F0 9F"/>
+ <a u="9984" b="E2 C6"/>
+ <a u="9985" b="CF DA"/>
+ <a u="9986" b="B9 DD"/>
+ <a u="9987" b="E2 C7"/>
+ <a u="9988" b="C0 A1"/>
+ <a u="9989" b="F0 A0"/>
+ <a u="998A" b="E2 C8"/>
+ <a u="998B" b="B2 F6"/>
+ <a u="998C" b="F1 40"/>
+ <a u="998D" b="E2 C9"/>
+ <a u="998E" b="F1 41"/>
+ <a u="998F" b="C1 F3"/>
+ <a u="9990" b="E2 CA"/>
+ <a u="9991" b="E2 CB"/>
+ <a u="9992" b="C2 F8"/>
+ <a u="9993" b="E2 CC"/>
+ <a u="9994" b="E2 CD"/>
+ <a u="9995" b="E2 CE"/>
+ <a u="9996" b="CA D7"/>
+ <a u="9997" b="D8 B8"/>
+ <a u="9998" b="D9 E5"/>
+ <a u="9999" b="CF E3"/>
+ <a u="999A" b="F1 42"/>
+ <a u="999B" b="F1 43"/>
+ <a u="999C" b="F1 44"/>
+ <a u="999D" b="F1 45"/>
+ <a u="999E" b="F1 46"/>
+ <a u="999F" b="F1 47"/>
+ <a u="99A0" b="F1 48"/>
+ <a u="99A1" b="F1 49"/>
+ <a u="99A2" b="F1 4A"/>
+ <a u="99A3" b="F1 4B"/>
+ <a u="99A4" b="F1 4C"/>
+ <a u="99A5" b="F0 A5"/>
+ <a u="99A6" b="F1 4D"/>
+ <a u="99A7" b="F1 4E"/>
+ <a u="99A8" b="DC B0"/>
+ <a u="99A9" b="F1 4F"/>
+ <a u="99AA" b="F1 50"/>
+ <a u="99AB" b="F1 51"/>
+ <a u="99AC" b="F1 52"/>
+ <a u="99AD" b="F1 53"/>
+ <a u="99AE" b="F1 54"/>
+ <a u="99AF" b="F1 55"/>
+ <a u="99B0" b="F1 56"/>
+ <a u="99B1" b="F1 57"/>
+ <a u="99B2" b="F1 58"/>
+ <a u="99B3" b="F1 59"/>
+ <a u="99B4" b="F1 5A"/>
+ <a u="99B5" b="F1 5B"/>
+ <a u="99B6" b="F1 5C"/>
+ <a u="99B7" b="F1 5D"/>
+ <a u="99B8" b="F1 5E"/>
+ <a u="99B9" b="F1 5F"/>
+ <a u="99BA" b="F1 60"/>
+ <a u="99BB" b="F1 61"/>
+ <a u="99BC" b="F1 62"/>
+ <a u="99BD" b="F1 63"/>
+ <a u="99BE" b="F1 64"/>
+ <a u="99BF" b="F1 65"/>
+ <a u="99C0" b="F1 66"/>
+ <a u="99C1" b="F1 67"/>
+ <a u="99C2" b="F1 68"/>
+ <a u="99C3" b="F1 69"/>
+ <a u="99C4" b="F1 6A"/>
+ <a u="99C5" b="F1 6B"/>
+ <a u="99C6" b="F1 6C"/>
+ <a u="99C7" b="F1 6D"/>
+ <a u="99C8" b="F1 6E"/>
+ <a u="99C9" b="F1 6F"/>
+ <a u="99CA" b="F1 70"/>
+ <a u="99CB" b="F1 71"/>
+ <a u="99CC" b="F1 72"/>
+ <a u="99CD" b="F1 73"/>
+ <a u="99CE" b="F1 74"/>
+ <a u="99CF" b="F1 75"/>
+ <a u="99D0" b="F1 76"/>
+ <a u="99D1" b="F1 77"/>
+ <a u="99D2" b="F1 78"/>
+ <a u="99D3" b="F1 79"/>
+ <a u="99D4" b="F1 7A"/>
+ <a u="99D5" b="F1 7B"/>
+ <a u="99D6" b="F1 7C"/>
+ <a u="99D7" b="F1 7D"/>
+ <a u="99D8" b="F1 7E"/>
+ <a u="99D9" b="F1 80"/>
+ <a u="99DA" b="F1 81"/>
+ <a u="99DB" b="F1 82"/>
+ <a u="99DC" b="F1 83"/>
+ <a u="99DD" b="F1 84"/>
+ <a u="99DE" b="F1 85"/>
+ <a u="99DF" b="F1 86"/>
+ <a u="99E0" b="F1 87"/>
+ <a u="99E1" b="F1 88"/>
+ <a u="99E2" b="F1 89"/>
+ <a u="99E3" b="F1 8A"/>
+ <a u="99E4" b="F1 8B"/>
+ <a u="99E5" b="F1 8C"/>
+ <a u="99E6" b="F1 8D"/>
+ <a u="99E7" b="F1 8E"/>
+ <a u="99E8" b="F1 8F"/>
+ <a u="99E9" b="F1 90"/>
+ <a u="99EA" b="F1 91"/>
+ <a u="99EB" b="F1 92"/>
+ <a u="99EC" b="F1 93"/>
+ <a u="99ED" b="F1 94"/>
+ <a u="99EE" b="F1 95"/>
+ <a u="99EF" b="F1 96"/>
+ <a u="99F0" b="F1 97"/>
+ <a u="99F1" b="F1 98"/>
+ <a u="99F2" b="F1 99"/>
+ <a u="99F3" b="F1 9A"/>
+ <a u="99F4" b="F1 9B"/>
+ <a u="99F5" b="F1 9C"/>
+ <a u="99F6" b="F1 9D"/>
+ <a u="99F7" b="F1 9E"/>
+ <a u="99F8" b="F1 9F"/>
+ <a u="99F9" b="F1 A0"/>
+ <a u="99FA" b="F2 40"/>
+ <a u="99FB" b="F2 41"/>
+ <a u="99FC" b="F2 42"/>
+ <a u="99FD" b="F2 43"/>
+ <a u="99FE" b="F2 44"/>
+ <a u="99FF" b="F2 45"/>
+ <a u="9A00" b="F2 46"/>
+ <a u="9A01" b="F2 47"/>
+ <a u="9A02" b="F2 48"/>
+ <a u="9A03" b="F2 49"/>
+ <a u="9A04" b="F2 4A"/>
+ <a u="9A05" b="F2 4B"/>
+ <a u="9A06" b="F2 4C"/>
+ <a u="9A07" b="F2 4D"/>
+ <a u="9A08" b="F2 4E"/>
+ <a u="9A09" b="F2 4F"/>
+ <a u="9A0A" b="F2 50"/>
+ <a u="9A0B" b="F2 51"/>
+ <a u="9A0C" b="F2 52"/>
+ <a u="9A0D" b="F2 53"/>
+ <a u="9A0E" b="F2 54"/>
+ <a u="9A0F" b="F2 55"/>
+ <a u="9A10" b="F2 56"/>
+ <a u="9A11" b="F2 57"/>
+ <a u="9A12" b="F2 58"/>
+ <a u="9A13" b="F2 59"/>
+ <a u="9A14" b="F2 5A"/>
+ <a u="9A15" b="F2 5B"/>
+ <a u="9A16" b="F2 5C"/>
+ <a u="9A17" b="F2 5D"/>
+ <a u="9A18" b="F2 5E"/>
+ <a u="9A19" b="F2 5F"/>
+ <a u="9A1A" b="F2 60"/>
+ <a u="9A1B" b="F2 61"/>
+ <a u="9A1C" b="F2 62"/>
+ <a u="9A1D" b="F2 63"/>
+ <a u="9A1E" b="F2 64"/>
+ <a u="9A1F" b="F2 65"/>
+ <a u="9A20" b="F2 66"/>
+ <a u="9A21" b="F2 67"/>
+ <a u="9A22" b="F2 68"/>
+ <a u="9A23" b="F2 69"/>
+ <a u="9A24" b="F2 6A"/>
+ <a u="9A25" b="F2 6B"/>
+ <a u="9A26" b="F2 6C"/>
+ <a u="9A27" b="F2 6D"/>
+ <a u="9A28" b="F2 6E"/>
+ <a u="9A29" b="F2 6F"/>
+ <a u="9A2A" b="F2 70"/>
+ <a u="9A2B" b="F2 71"/>
+ <a u="9A2C" b="F2 72"/>
+ <a u="9A2D" b="F2 73"/>
+ <a u="9A2E" b="F2 74"/>
+ <a u="9A2F" b="F2 75"/>
+ <a u="9A30" b="F2 76"/>
+ <a u="9A31" b="F2 77"/>
+ <a u="9A32" b="F2 78"/>
+ <a u="9A33" b="F2 79"/>
+ <a u="9A34" b="F2 7A"/>
+ <a u="9A35" b="F2 7B"/>
+ <a u="9A36" b="F2 7C"/>
+ <a u="9A37" b="F2 7D"/>
+ <a u="9A38" b="F2 7E"/>
+ <a u="9A39" b="F2 80"/>
+ <a u="9A3A" b="F2 81"/>
+ <a u="9A3B" b="F2 82"/>
+ <a u="9A3C" b="F2 83"/>
+ <a u="9A3D" b="F2 84"/>
+ <a u="9A3E" b="F2 85"/>
+ <a u="9A3F" b="F2 86"/>
+ <a u="9A40" b="F2 87"/>
+ <a u="9A41" b="F2 88"/>
+ <a u="9A42" b="F2 89"/>
+ <a u="9A43" b="F2 8A"/>
+ <a u="9A44" b="F2 8B"/>
+ <a u="9A45" b="F2 8C"/>
+ <a u="9A46" b="F2 8D"/>
+ <a u="9A47" b="F2 8E"/>
+ <a u="9A48" b="F2 8F"/>
+ <a u="9A49" b="F2 90"/>
+ <a u="9A4A" b="F2 91"/>
+ <a u="9A4B" b="F2 92"/>
+ <a u="9A4C" b="F2 93"/>
+ <a u="9A4D" b="F2 94"/>
+ <a u="9A4E" b="F2 95"/>
+ <a u="9A4F" b="F2 96"/>
+ <a u="9A50" b="F2 97"/>
+ <a u="9A51" b="F2 98"/>
+ <a u="9A52" b="F2 99"/>
+ <a u="9A53" b="F2 9A"/>
+ <a u="9A54" b="F2 9B"/>
+ <a u="9A55" b="F2 9C"/>
+ <a u="9A56" b="F2 9D"/>
+ <a u="9A57" b="F2 9E"/>
+ <a u="9A58" b="F2 9F"/>
+ <a u="9A59" b="F2 A0"/>
+ <a u="9A5A" b="F3 40"/>
+ <a u="9A5B" b="F3 41"/>
+ <a u="9A5C" b="F3 42"/>
+ <a u="9A5D" b="F3 43"/>
+ <a u="9A5E" b="F3 44"/>
+ <a u="9A5F" b="F3 45"/>
+ <a u="9A60" b="F3 46"/>
+ <a u="9A61" b="F3 47"/>
+ <a u="9A62" b="F3 48"/>
+ <a u="9A63" b="F3 49"/>
+ <a u="9A64" b="F3 4A"/>
+ <a u="9A65" b="F3 4B"/>
+ <a u="9A66" b="F3 4C"/>
+ <a u="9A67" b="F3 4D"/>
+ <a u="9A68" b="F3 4E"/>
+ <a u="9A69" b="F3 4F"/>
+ <a u="9A6A" b="F3 50"/>
+ <a u="9A6B" b="F3 51"/>
+ <a u="9A6C" b="C2 ED"/>
+ <a u="9A6D" b="D4 A6"/>
+ <a u="9A6E" b="CD D4"/>
+ <a u="9A6F" b="D1 B1"/>
+ <a u="9A70" b="B3 DB"/>
+ <a u="9A71" b="C7 FD"/>
+ <a u="9A72" b="F3 52"/>
+ <a u="9A73" b="B2 B5"/>
+ <a u="9A74" b="C2 BF"/>
+ <a u="9A75" b="E6 E0"/>
+ <a u="9A76" b="CA BB"/>
+ <a u="9A77" b="E6 E1"/>
+ <a u="9A78" b="E6 E2"/>
+ <a u="9A79" b="BE D4"/>
+ <a u="9A7A" b="E6 E3"/>
+ <a u="9A7B" b="D7 A4"/>
+ <a u="9A7C" b="CD D5"/>
+ <a u="9A7D" b="E6 E5"/>
+ <a u="9A7E" b="BC DD"/>
+ <a u="9A7F" b="E6 E4"/>
+ <a u="9A80" b="E6 E6"/>
+ <a u="9A81" b="E6 E7"/>
+ <a u="9A82" b="C2 EE"/>
+ <a u="9A83" b="F3 53"/>
+ <a u="9A84" b="BD BE"/>
+ <a u="9A85" b="E6 E8"/>
+ <a u="9A86" b="C2 E6"/>
+ <a u="9A87" b="BA A7"/>
+ <a u="9A88" b="E6 E9"/>
+ <a u="9A89" b="F3 54"/>
+ <a u="9A8A" b="E6 EA"/>
+ <a u="9A8B" b="B3 D2"/>
+ <a u="9A8C" b="D1 E9"/>
+ <a u="9A8D" b="F3 55"/>
+ <a u="9A8E" b="F3 56"/>
+ <a u="9A8F" b="BF A5"/>
+ <a u="9A90" b="E6 EB"/>
+ <a u="9A91" b="C6 EF"/>
+ <a u="9A92" b="E6 EC"/>
+ <a u="9A93" b="E6 ED"/>
+ <a u="9A94" b="F3 57"/>
+ <a u="9A95" b="F3 58"/>
+ <a u="9A96" b="E6 EE"/>
+ <a u="9A97" b="C6 AD"/>
+ <a u="9A98" b="E6 EF"/>
+ <a u="9A99" b="F3 59"/>
+ <a u="9A9A" b="C9 A7"/>
+ <a u="9A9B" b="E6 F0"/>
+ <a u="9A9C" b="E6 F1"/>
+ <a u="9A9D" b="E6 F2"/>
+ <a u="9A9E" b="E5 B9"/>
+ <a u="9A9F" b="E6 F3"/>
+ <a u="9AA0" b="E6 F4"/>
+ <a u="9AA1" b="C2 E2"/>
+ <a u="9AA2" b="E6 F5"/>
+ <a u="9AA3" b="E6 F6"/>
+ <a u="9AA4" b="D6 E8"/>
+ <a u="9AA5" b="E6 F7"/>
+ <a u="9AA6" b="F3 5A"/>
+ <a u="9AA7" b="E6 F8"/>
+ <a u="9AA8" b="B9 C7"/>
+ <a u="9AA9" b="F3 5B"/>
+ <a u="9AAA" b="F3 5C"/>
+ <a u="9AAB" b="F3 5D"/>
+ <a u="9AAC" b="F3 5E"/>
+ <a u="9AAD" b="F3 5F"/>
+ <a u="9AAE" b="F3 60"/>
+ <a u="9AAF" b="F3 61"/>
+ <a u="9AB0" b="F7 BB"/>
+ <a u="9AB1" b="F7 BA"/>
+ <a u="9AB2" b="F3 62"/>
+ <a u="9AB3" b="F3 63"/>
+ <a u="9AB4" b="F3 64"/>
+ <a u="9AB5" b="F3 65"/>
+ <a u="9AB6" b="F7 BE"/>
+ <a u="9AB7" b="F7 BC"/>
+ <a u="9AB8" b="BA A1"/>
+ <a u="9AB9" b="F3 66"/>
+ <a u="9ABA" b="F7 BF"/>
+ <a u="9ABB" b="F3 67"/>
+ <a u="9ABC" b="F7 C0"/>
+ <a u="9ABD" b="F3 68"/>
+ <a u="9ABE" b="F3 69"/>
+ <a u="9ABF" b="F3 6A"/>
+ <a u="9AC0" b="F7 C2"/>
+ <a u="9AC1" b="F7 C1"/>
+ <a u="9AC2" b="F7 C4"/>
+ <a u="9AC3" b="F3 6B"/>
+ <a u="9AC4" b="F3 6C"/>
+ <a u="9AC5" b="F7 C3"/>
+ <a u="9AC6" b="F3 6D"/>
+ <a u="9AC7" b="F3 6E"/>
+ <a u="9AC8" b="F3 6F"/>
+ <a u="9AC9" b="F3 70"/>
+ <a u="9ACA" b="F3 71"/>
+ <a u="9ACB" b="F7 C5"/>
+ <a u="9ACC" b="F7 C6"/>
+ <a u="9ACD" b="F3 72"/>
+ <a u="9ACE" b="F3 73"/>
+ <a u="9ACF" b="F3 74"/>
+ <a u="9AD0" b="F3 75"/>
+ <a u="9AD1" b="F7 C7"/>
+ <a u="9AD2" b="F3 76"/>
+ <a u="9AD3" b="CB E8"/>
+ <a u="9AD4" b="F3 77"/>
+ <a u="9AD5" b="F3 78"/>
+ <a u="9AD6" b="F3 79"/>
+ <a u="9AD7" b="F3 7A"/>
+ <a u="9AD8" b="B8 DF"/>
+ <a u="9AD9" b="F3 7B"/>
+ <a u="9ADA" b="F3 7C"/>
+ <a u="9ADB" b="F3 7D"/>
+ <a u="9ADC" b="F3 7E"/>
+ <a u="9ADD" b="F3 80"/>
+ <a u="9ADE" b="F3 81"/>
+ <a u="9ADF" b="F7 D4"/>
+ <a u="9AE0" b="F3 82"/>
+ <a u="9AE1" b="F7 D5"/>
+ <a u="9AE2" b="F3 83"/>
+ <a u="9AE3" b="F3 84"/>
+ <a u="9AE4" b="F3 85"/>
+ <a u="9AE5" b="F3 86"/>
+ <a u="9AE6" b="F7 D6"/>
+ <a u="9AE7" b="F3 87"/>
+ <a u="9AE8" b="F3 88"/>
+ <a u="9AE9" b="F3 89"/>
+ <a u="9AEA" b="F3 8A"/>
+ <a u="9AEB" b="F7 D8"/>
+ <a u="9AEC" b="F3 8B"/>
+ <a u="9AED" b="F7 DA"/>
+ <a u="9AEE" b="F3 8C"/>
+ <a u="9AEF" b="F7 D7"/>
+ <a u="9AF0" b="F3 8D"/>
+ <a u="9AF1" b="F3 8E"/>
+ <a u="9AF2" b="F3 8F"/>
+ <a u="9AF3" b="F3 90"/>
+ <a u="9AF4" b="F3 91"/>
+ <a u="9AF5" b="F3 92"/>
+ <a u="9AF6" b="F3 93"/>
+ <a u="9AF7" b="F3 94"/>
+ <a u="9AF8" b="F3 95"/>
+ <a u="9AF9" b="F7 DB"/>
+ <a u="9AFA" b="F3 96"/>
+ <a u="9AFB" b="F7 D9"/>
+ <a u="9AFC" b="F3 97"/>
+ <a u="9AFD" b="F3 98"/>
+ <a u="9AFE" b="F3 99"/>
+ <a u="9AFF" b="F3 9A"/>
+ <a u="9B00" b="F3 9B"/>
+ <a u="9B01" b="F3 9C"/>
+ <a u="9B02" b="F3 9D"/>
+ <a u="9B03" b="D7 D7"/>
+ <a u="9B04" b="F3 9E"/>
+ <a u="9B05" b="F3 9F"/>
+ <a u="9B06" b="F3 A0"/>
+ <a u="9B07" b="F4 40"/>
+ <a u="9B08" b="F7 DC"/>
+ <a u="9B09" b="F4 41"/>
+ <a u="9B0A" b="F4 42"/>
+ <a u="9B0B" b="F4 43"/>
+ <a u="9B0C" b="F4 44"/>
+ <a u="9B0D" b="F4 45"/>
+ <a u="9B0E" b="F4 46"/>
+ <a u="9B0F" b="F7 DD"/>
+ <a u="9B10" b="F4 47"/>
+ <a u="9B11" b="F4 48"/>
+ <a u="9B12" b="F4 49"/>
+ <a u="9B13" b="F7 DE"/>
+ <a u="9B14" b="F4 4A"/>
+ <a u="9B15" b="F4 4B"/>
+ <a u="9B16" b="F4 4C"/>
+ <a u="9B17" b="F4 4D"/>
+ <a u="9B18" b="F4 4E"/>
+ <a u="9B19" b="F4 4F"/>
+ <a u="9B1A" b="F4 50"/>
+ <a u="9B1B" b="F4 51"/>
+ <a u="9B1C" b="F4 52"/>
+ <a u="9B1D" b="F4 53"/>
+ <a u="9B1E" b="F4 54"/>
+ <a u="9B1F" b="F7 DF"/>
+ <a u="9B20" b="F4 55"/>
+ <a u="9B21" b="F4 56"/>
+ <a u="9B22" b="F4 57"/>
+ <a u="9B23" b="F7 E0"/>
+ <a u="9B24" b="F4 58"/>
+ <a u="9B25" b="F4 59"/>
+ <a u="9B26" b="F4 5A"/>
+ <a u="9B27" b="F4 5B"/>
+ <a u="9B28" b="F4 5C"/>
+ <a u="9B29" b="F4 5D"/>
+ <a u="9B2A" b="F4 5E"/>
+ <a u="9B2B" b="F4 5F"/>
+ <a u="9B2C" b="F4 60"/>
+ <a u="9B2D" b="F4 61"/>
+ <a u="9B2E" b="F4 62"/>
+ <a u="9B2F" b="DB CB"/>
+ <a u="9B30" b="F4 63"/>
+ <a u="9B31" b="F4 64"/>
+ <a u="9B32" b="D8 AA"/>
+ <a u="9B33" b="F4 65"/>
+ <a u="9B34" b="F4 66"/>
+ <a u="9B35" b="F4 67"/>
+ <a u="9B36" b="F4 68"/>
+ <a u="9B37" b="F4 69"/>
+ <a u="9B38" b="F4 6A"/>
+ <a u="9B39" b="F4 6B"/>
+ <a u="9B3A" b="F4 6C"/>
+ <a u="9B3B" b="E5 F7"/>
+ <a u="9B3C" b="B9 ED"/>
+ <a u="9B3D" b="F4 6D"/>
+ <a u="9B3E" b="F4 6E"/>
+ <a u="9B3F" b="F4 6F"/>
+ <a u="9B40" b="F4 70"/>
+ <a u="9B41" b="BF FD"/>
+ <a u="9B42" b="BB EA"/>
+ <a u="9B43" b="F7 C9"/>
+ <a u="9B44" b="C6 C7"/>
+ <a u="9B45" b="F7 C8"/>
+ <a u="9B46" b="F4 71"/>
+ <a u="9B47" b="F7 CA"/>
+ <a u="9B48" b="F7 CC"/>
+ <a u="9B49" b="F7 CB"/>
+ <a u="9B4A" b="F4 72"/>
+ <a u="9B4B" b="F4 73"/>
+ <a u="9B4C" b="F4 74"/>
+ <a u="9B4D" b="F7 CD"/>
+ <a u="9B4E" b="F4 75"/>
+ <a u="9B4F" b="CE BA"/>
+ <a u="9B50" b="F4 76"/>
+ <a u="9B51" b="F7 CE"/>
+ <a u="9B52" b="F4 77"/>
+ <a u="9B53" b="F4 78"/>
+ <a u="9B54" b="C4 A7"/>
+ <a u="9B55" b="F4 79"/>
+ <a u="9B56" b="F4 7A"/>
+ <a u="9B57" b="F4 7B"/>
+ <a u="9B58" b="F4 7C"/>
+ <a u="9B59" b="F4 7D"/>
+ <a u="9B5A" b="F4 7E"/>
+ <a u="9B5B" b="F4 80"/>
+ <a u="9B5C" b="F4 81"/>
+ <a u="9B5D" b="F4 82"/>
+ <a u="9B5E" b="F4 83"/>
+ <a u="9B5F" b="F4 84"/>
+ <a u="9B60" b="F4 85"/>
+ <a u="9B61" b="F4 86"/>
+ <a u="9B62" b="F4 87"/>
+ <a u="9B63" b="F4 88"/>
+ <a u="9B64" b="F4 89"/>
+ <a u="9B65" b="F4 8A"/>
+ <a u="9B66" b="F4 8B"/>
+ <a u="9B67" b="F4 8C"/>
+ <a u="9B68" b="F4 8D"/>
+ <a u="9B69" b="F4 8E"/>
+ <a u="9B6A" b="F4 8F"/>
+ <a u="9B6B" b="F4 90"/>
+ <a u="9B6C" b="F4 91"/>
+ <a u="9B6D" b="F4 92"/>
+ <a u="9B6E" b="F4 93"/>
+ <a u="9B6F" b="F4 94"/>
+ <a u="9B70" b="F4 95"/>
+ <a u="9B71" b="F4 96"/>
+ <a u="9B72" b="F4 97"/>
+ <a u="9B73" b="F4 98"/>
+ <a u="9B74" b="F4 99"/>
+ <a u="9B75" b="F4 9A"/>
+ <a u="9B76" b="F4 9B"/>
+ <a u="9B77" b="F4 9C"/>
+ <a u="9B78" b="F4 9D"/>
+ <a u="9B79" b="F4 9E"/>
+ <a u="9B7A" b="F4 9F"/>
+ <a u="9B7B" b="F4 A0"/>
+ <a u="9B7C" b="F5 40"/>
+ <a u="9B7D" b="F5 41"/>
+ <a u="9B7E" b="F5 42"/>
+ <a u="9B7F" b="F5 43"/>
+ <a u="9B80" b="F5 44"/>
+ <a u="9B81" b="F5 45"/>
+ <a u="9B82" b="F5 46"/>
+ <a u="9B83" b="F5 47"/>
+ <a u="9B84" b="F5 48"/>
+ <a u="9B85" b="F5 49"/>
+ <a u="9B86" b="F5 4A"/>
+ <a u="9B87" b="F5 4B"/>
+ <a u="9B88" b="F5 4C"/>
+ <a u="9B89" b="F5 4D"/>
+ <a u="9B8A" b="F5 4E"/>
+ <a u="9B8B" b="F5 4F"/>
+ <a u="9B8C" b="F5 50"/>
+ <a u="9B8D" b="F5 51"/>
+ <a u="9B8E" b="F5 52"/>
+ <a u="9B8F" b="F5 53"/>
+ <a u="9B90" b="F5 54"/>
+ <a u="9B91" b="F5 55"/>
+ <a u="9B92" b="F5 56"/>
+ <a u="9B93" b="F5 57"/>
+ <a u="9B94" b="F5 58"/>
+ <a u="9B95" b="F5 59"/>
+ <a u="9B96" b="F5 5A"/>
+ <a u="9B97" b="F5 5B"/>
+ <a u="9B98" b="F5 5C"/>
+ <a u="9B99" b="F5 5D"/>
+ <a u="9B9A" b="F5 5E"/>
+ <a u="9B9B" b="F5 5F"/>
+ <a u="9B9C" b="F5 60"/>
+ <a u="9B9D" b="F5 61"/>
+ <a u="9B9E" b="F5 62"/>
+ <a u="9B9F" b="F5 63"/>
+ <a u="9BA0" b="F5 64"/>
+ <a u="9BA1" b="F5 65"/>
+ <a u="9BA2" b="F5 66"/>
+ <a u="9BA3" b="F5 67"/>
+ <a u="9BA4" b="F5 68"/>
+ <a u="9BA5" b="F5 69"/>
+ <a u="9BA6" b="F5 6A"/>
+ <a u="9BA7" b="F5 6B"/>
+ <a u="9BA8" b="F5 6C"/>
+ <a u="9BA9" b="F5 6D"/>
+ <a u="9BAA" b="F5 6E"/>
+ <a u="9BAB" b="F5 6F"/>
+ <a u="9BAC" b="F5 70"/>
+ <a u="9BAD" b="F5 71"/>
+ <a u="9BAE" b="F5 72"/>
+ <a u="9BAF" b="F5 73"/>
+ <a u="9BB0" b="F5 74"/>
+ <a u="9BB1" b="F5 75"/>
+ <a u="9BB2" b="F5 76"/>
+ <a u="9BB3" b="F5 77"/>
+ <a u="9BB4" b="F5 78"/>
+ <a u="9BB5" b="F5 79"/>
+ <a u="9BB6" b="F5 7A"/>
+ <a u="9BB7" b="F5 7B"/>
+ <a u="9BB8" b="F5 7C"/>
+ <a u="9BB9" b="F5 7D"/>
+ <a u="9BBA" b="F5 7E"/>
+ <a u="9BBB" b="F5 80"/>
+ <a u="9BBC" b="F5 81"/>
+ <a u="9BBD" b="F5 82"/>
+ <a u="9BBE" b="F5 83"/>
+ <a u="9BBF" b="F5 84"/>
+ <a u="9BC0" b="F5 85"/>
+ <a u="9BC1" b="F5 86"/>
+ <a u="9BC2" b="F5 87"/>
+ <a u="9BC3" b="F5 88"/>
+ <a u="9BC4" b="F5 89"/>
+ <a u="9BC5" b="F5 8A"/>
+ <a u="9BC6" b="F5 8B"/>
+ <a u="9BC7" b="F5 8C"/>
+ <a u="9BC8" b="F5 8D"/>
+ <a u="9BC9" b="F5 8E"/>
+ <a u="9BCA" b="F5 8F"/>
+ <a u="9BCB" b="F5 90"/>
+ <a u="9BCC" b="F5 91"/>
+ <a u="9BCD" b="F5 92"/>
+ <a u="9BCE" b="F5 93"/>
+ <a u="9BCF" b="F5 94"/>
+ <a u="9BD0" b="F5 95"/>
+ <a u="9BD1" b="F5 96"/>
+ <a u="9BD2" b="F5 97"/>
+ <a u="9BD3" b="F5 98"/>
+ <a u="9BD4" b="F5 99"/>
+ <a u="9BD5" b="F5 9A"/>
+ <a u="9BD6" b="F5 9B"/>
+ <a u="9BD7" b="F5 9C"/>
+ <a u="9BD8" b="F5 9D"/>
+ <a u="9BD9" b="F5 9E"/>
+ <a u="9BDA" b="F5 9F"/>
+ <a u="9BDB" b="F5 A0"/>
+ <a u="9BDC" b="F6 40"/>
+ <a u="9BDD" b="F6 41"/>
+ <a u="9BDE" b="F6 42"/>
+ <a u="9BDF" b="F6 43"/>
+ <a u="9BE0" b="F6 44"/>
+ <a u="9BE1" b="F6 45"/>
+ <a u="9BE2" b="F6 46"/>
+ <a u="9BE3" b="F6 47"/>
+ <a u="9BE4" b="F6 48"/>
+ <a u="9BE5" b="F6 49"/>
+ <a u="9BE6" b="F6 4A"/>
+ <a u="9BE7" b="F6 4B"/>
+ <a u="9BE8" b="F6 4C"/>
+ <a u="9BE9" b="F6 4D"/>
+ <a u="9BEA" b="F6 4E"/>
+ <a u="9BEB" b="F6 4F"/>
+ <a u="9BEC" b="F6 50"/>
+ <a u="9BED" b="F6 51"/>
+ <a u="9BEE" b="F6 52"/>
+ <a u="9BEF" b="F6 53"/>
+ <a u="9BF0" b="F6 54"/>
+ <a u="9BF1" b="F6 55"/>
+ <a u="9BF2" b="F6 56"/>
+ <a u="9BF3" b="F6 57"/>
+ <a u="9BF4" b="F6 58"/>
+ <a u="9BF5" b="F6 59"/>
+ <a u="9BF6" b="F6 5A"/>
+ <a u="9BF7" b="F6 5B"/>
+ <a u="9BF8" b="F6 5C"/>
+ <a u="9BF9" b="F6 5D"/>
+ <a u="9BFA" b="F6 5E"/>
+ <a u="9BFB" b="F6 5F"/>
+ <a u="9BFC" b="F6 60"/>
+ <a u="9BFD" b="F6 61"/>
+ <a u="9BFE" b="F6 62"/>
+ <a u="9BFF" b="F6 63"/>
+ <a u="9C00" b="F6 64"/>
+ <a u="9C01" b="F6 65"/>
+ <a u="9C02" b="F6 66"/>
+ <a u="9C03" b="F6 67"/>
+ <a u="9C04" b="F6 68"/>
+ <a u="9C05" b="F6 69"/>
+ <a u="9C06" b="F6 6A"/>
+ <a u="9C07" b="F6 6B"/>
+ <a u="9C08" b="F6 6C"/>
+ <a u="9C09" b="F6 6D"/>
+ <a u="9C0A" b="F6 6E"/>
+ <a u="9C0B" b="F6 6F"/>
+ <a u="9C0C" b="F6 70"/>
+ <a u="9C0D" b="F6 71"/>
+ <a u="9C0E" b="F6 72"/>
+ <a u="9C0F" b="F6 73"/>
+ <a u="9C10" b="F6 74"/>
+ <a u="9C11" b="F6 75"/>
+ <a u="9C12" b="F6 76"/>
+ <a u="9C13" b="F6 77"/>
+ <a u="9C14" b="F6 78"/>
+ <a u="9C15" b="F6 79"/>
+ <a u="9C16" b="F6 7A"/>
+ <a u="9C17" b="F6 7B"/>
+ <a u="9C18" b="F6 7C"/>
+ <a u="9C19" b="F6 7D"/>
+ <a u="9C1A" b="F6 7E"/>
+ <a u="9C1B" b="F6 80"/>
+ <a u="9C1C" b="F6 81"/>
+ <a u="9C1D" b="F6 82"/>
+ <a u="9C1E" b="F6 83"/>
+ <a u="9C1F" b="F6 84"/>
+ <a u="9C20" b="F6 85"/>
+ <a u="9C21" b="F6 86"/>
+ <a u="9C22" b="F6 87"/>
+ <a u="9C23" b="F6 88"/>
+ <a u="9C24" b="F6 89"/>
+ <a u="9C25" b="F6 8A"/>
+ <a u="9C26" b="F6 8B"/>
+ <a u="9C27" b="F6 8C"/>
+ <a u="9C28" b="F6 8D"/>
+ <a u="9C29" b="F6 8E"/>
+ <a u="9C2A" b="F6 8F"/>
+ <a u="9C2B" b="F6 90"/>
+ <a u="9C2C" b="F6 91"/>
+ <a u="9C2D" b="F6 92"/>
+ <a u="9C2E" b="F6 93"/>
+ <a u="9C2F" b="F6 94"/>
+ <a u="9C30" b="F6 95"/>
+ <a u="9C31" b="F6 96"/>
+ <a u="9C32" b="F6 97"/>
+ <a u="9C33" b="F6 98"/>
+ <a u="9C34" b="F6 99"/>
+ <a u="9C35" b="F6 9A"/>
+ <a u="9C36" b="F6 9B"/>
+ <a u="9C37" b="F6 9C"/>
+ <a u="9C38" b="F6 9D"/>
+ <a u="9C39" b="F6 9E"/>
+ <a u="9C3A" b="F6 9F"/>
+ <a u="9C3B" b="F6 A0"/>
+ <a u="9C3C" b="F7 40"/>
+ <a u="9C3D" b="F7 41"/>
+ <a u="9C3E" b="F7 42"/>
+ <a u="9C3F" b="F7 43"/>
+ <a u="9C40" b="F7 44"/>
+ <a u="9C41" b="F7 45"/>
+ <a u="9C42" b="F7 46"/>
+ <a u="9C43" b="F7 47"/>
+ <a u="9C44" b="F7 48"/>
+ <a u="9C45" b="F7 49"/>
+ <a u="9C46" b="F7 4A"/>
+ <a u="9C47" b="F7 4B"/>
+ <a u="9C48" b="F7 4C"/>
+ <a u="9C49" b="F7 4D"/>
+ <a u="9C4A" b="F7 4E"/>
+ <a u="9C4B" b="F7 4F"/>
+ <a u="9C4C" b="F7 50"/>
+ <a u="9C4D" b="F7 51"/>
+ <a u="9C4E" b="F7 52"/>
+ <a u="9C4F" b="F7 53"/>
+ <a u="9C50" b="F7 54"/>
+ <a u="9C51" b="F7 55"/>
+ <a u="9C52" b="F7 56"/>
+ <a u="9C53" b="F7 57"/>
+ <a u="9C54" b="F7 58"/>
+ <a u="9C55" b="F7 59"/>
+ <a u="9C56" b="F7 5A"/>
+ <a u="9C57" b="F7 5B"/>
+ <a u="9C58" b="F7 5C"/>
+ <a u="9C59" b="F7 5D"/>
+ <a u="9C5A" b="F7 5E"/>
+ <a u="9C5B" b="F7 5F"/>
+ <a u="9C5C" b="F7 60"/>
+ <a u="9C5D" b="F7 61"/>
+ <a u="9C5E" b="F7 62"/>
+ <a u="9C5F" b="F7 63"/>
+ <a u="9C60" b="F7 64"/>
+ <a u="9C61" b="F7 65"/>
+ <a u="9C62" b="F7 66"/>
+ <a u="9C63" b="F7 67"/>
+ <a u="9C64" b="F7 68"/>
+ <a u="9C65" b="F7 69"/>
+ <a u="9C66" b="F7 6A"/>
+ <a u="9C67" b="F7 6B"/>
+ <a u="9C68" b="F7 6C"/>
+ <a u="9C69" b="F7 6D"/>
+ <a u="9C6A" b="F7 6E"/>
+ <a u="9C6B" b="F7 6F"/>
+ <a u="9C6C" b="F7 70"/>
+ <a u="9C6D" b="F7 71"/>
+ <a u="9C6E" b="F7 72"/>
+ <a u="9C6F" b="F7 73"/>
+ <a u="9C70" b="F7 74"/>
+ <a u="9C71" b="F7 75"/>
+ <a u="9C72" b="F7 76"/>
+ <a u="9C73" b="F7 77"/>
+ <a u="9C74" b="F7 78"/>
+ <a u="9C75" b="F7 79"/>
+ <a u="9C76" b="F7 7A"/>
+ <a u="9C77" b="F7 7B"/>
+ <a u="9C78" b="F7 7C"/>
+ <a u="9C79" b="F7 7D"/>
+ <a u="9C7A" b="F7 7E"/>
+ <a u="9C7B" b="F7 80"/>
+ <a u="9C7C" b="D3 E3"/>
+ <a u="9C7D" b="F7 81"/>
+ <a u="9C7E" b="F7 82"/>
+ <a u="9C7F" b="F6 CF"/>
+ <a u="9C80" b="F7 83"/>
+ <a u="9C81" b="C2 B3"/>
+ <a u="9C82" b="F6 D0"/>
+ <a u="9C83" b="F7 84"/>
+ <a u="9C84" b="F7 85"/>
+ <a u="9C85" b="F6 D1"/>
+ <a u="9C86" b="F6 D2"/>
+ <a u="9C87" b="F6 D3"/>
+ <a u="9C88" b="F6 D4"/>
+ <a u="9C89" b="F7 86"/>
+ <a u="9C8A" b="F7 87"/>
+ <a u="9C8B" b="F6 D6"/>
+ <a u="9C8C" b="F7 88"/>
+ <a u="9C8D" b="B1 AB"/>
+ <a u="9C8E" b="F6 D7"/>
+ <a u="9C8F" b="F7 89"/>
+ <a u="9C90" b="F6 D8"/>
+ <a u="9C91" b="F6 D9"/>
+ <a u="9C92" b="F6 DA"/>
+ <a u="9C93" b="F7 8A"/>
+ <a u="9C94" b="F6 DB"/>
+ <a u="9C95" b="F6 DC"/>
+ <a u="9C96" b="F7 8B"/>
+ <a u="9C97" b="F7 8C"/>
+ <a u="9C98" b="F7 8D"/>
+ <a u="9C99" b="F7 8E"/>
+ <a u="9C9A" b="F6 DD"/>
+ <a u="9C9B" b="F6 DE"/>
+ <a u="9C9C" b="CF CA"/>
+ <a u="9C9D" b="F7 8F"/>
+ <a u="9C9E" b="F6 DF"/>
+ <a u="9C9F" b="F6 E0"/>
+ <a u="9CA0" b="F6 E1"/>
+ <a u="9CA1" b="F6 E2"/>
+ <a u="9CA2" b="F6 E3"/>
+ <a u="9CA3" b="F6 E4"/>
+ <a u="9CA4" b="C0 F0"/>
+ <a u="9CA5" b="F6 E5"/>
+ <a u="9CA6" b="F6 E6"/>
+ <a u="9CA7" b="F6 E7"/>
+ <a u="9CA8" b="F6 E8"/>
+ <a u="9CA9" b="F6 E9"/>
+ <a u="9CAA" b="F7 90"/>
+ <a u="9CAB" b="F6 EA"/>
+ <a u="9CAC" b="F7 91"/>
+ <a u="9CAD" b="F6 EB"/>
+ <a u="9CAE" b="F6 EC"/>
+ <a u="9CAF" b="F7 92"/>
+ <a u="9CB0" b="F6 ED"/>
+ <a u="9CB1" b="F6 EE"/>
+ <a u="9CB2" b="F6 EF"/>
+ <a u="9CB3" b="F6 F0"/>
+ <a u="9CB4" b="F6 F1"/>
+ <a u="9CB5" b="F6 F2"/>
+ <a u="9CB6" b="F6 F3"/>
+ <a u="9CB7" b="F6 F4"/>
+ <a u="9CB8" b="BE A8"/>
+ <a u="9CB9" b="F7 93"/>
+ <a u="9CBA" b="F6 F5"/>
+ <a u="9CBB" b="F6 F6"/>
+ <a u="9CBC" b="F6 F7"/>
+ <a u="9CBD" b="F6 F8"/>
+ <a u="9CBE" b="F7 94"/>
+ <a u="9CBF" b="F7 95"/>
+ <a u="9CC0" b="F7 96"/>
+ <a u="9CC1" b="F7 97"/>
+ <a u="9CC2" b="F7 98"/>
+ <a u="9CC3" b="C8 FA"/>
+ <a u="9CC4" b="F6 F9"/>
+ <a u="9CC5" b="F6 FA"/>
+ <a u="9CC6" b="F6 FB"/>
+ <a u="9CC7" b="F6 FC"/>
+ <a u="9CC8" b="F7 99"/>
+ <a u="9CC9" b="F7 9A"/>
+ <a u="9CCA" b="F6 FD"/>
+ <a u="9CCB" b="F6 FE"/>
+ <a u="9CCC" b="F7 A1"/>
+ <a u="9CCD" b="F7 A2"/>
+ <a u="9CCE" b="F7 A3"/>
+ <a u="9CCF" b="F7 A4"/>
+ <a u="9CD0" b="F7 A5"/>
+ <a u="9CD1" b="F7 9B"/>
+ <a u="9CD2" b="F7 9C"/>
+ <a u="9CD3" b="F7 A6"/>
+ <a u="9CD4" b="F7 A7"/>
+ <a u="9CD5" b="F7 A8"/>
+ <a u="9CD6" b="B1 EE"/>
+ <a u="9CD7" b="F7 A9"/>
+ <a u="9CD8" b="F7 AA"/>
+ <a u="9CD9" b="F7 AB"/>
+ <a u="9CDA" b="F7 9D"/>
+ <a u="9CDB" b="F7 9E"/>
+ <a u="9CDC" b="F7 AC"/>
+ <a u="9CDD" b="F7 AD"/>
+ <a u="9CDE" b="C1 DB"/>
+ <a u="9CDF" b="F7 AE"/>
+ <a u="9CE0" b="F7 9F"/>
+ <a u="9CE1" b="F7 A0"/>
+ <a u="9CE2" b="F7 AF"/>
+ <a u="9CE3" b="F8 40"/>
+ <a u="9CE4" b="F8 41"/>
+ <a u="9CE5" b="F8 42"/>
+ <a u="9CE6" b="F8 43"/>
+ <a u="9CE7" b="F8 44"/>
+ <a u="9CE8" b="F8 45"/>
+ <a u="9CE9" b="F8 46"/>
+ <a u="9CEA" b="F8 47"/>
+ <a u="9CEB" b="F8 48"/>
+ <a u="9CEC" b="F8 49"/>
+ <a u="9CED" b="F8 4A"/>
+ <a u="9CEE" b="F8 4B"/>
+ <a u="9CEF" b="F8 4C"/>
+ <a u="9CF0" b="F8 4D"/>
+ <a u="9CF1" b="F8 4E"/>
+ <a u="9CF2" b="F8 4F"/>
+ <a u="9CF3" b="F8 50"/>
+ <a u="9CF4" b="F8 51"/>
+ <a u="9CF5" b="F8 52"/>
+ <a u="9CF6" b="F8 53"/>
+ <a u="9CF7" b="F8 54"/>
+ <a u="9CF8" b="F8 55"/>
+ <a u="9CF9" b="F8 56"/>
+ <a u="9CFA" b="F8 57"/>
+ <a u="9CFB" b="F8 58"/>
+ <a u="9CFC" b="F8 59"/>
+ <a u="9CFD" b="F8 5A"/>
+ <a u="9CFE" b="F8 5B"/>
+ <a u="9CFF" b="F8 5C"/>
+ <a u="9D00" b="F8 5D"/>
+ <a u="9D01" b="F8 5E"/>
+ <a u="9D02" b="F8 5F"/>
+ <a u="9D03" b="F8 60"/>
+ <a u="9D04" b="F8 61"/>
+ <a u="9D05" b="F8 62"/>
+ <a u="9D06" b="F8 63"/>
+ <a u="9D07" b="F8 64"/>
+ <a u="9D08" b="F8 65"/>
+ <a u="9D09" b="F8 66"/>
+ <a u="9D0A" b="F8 67"/>
+ <a u="9D0B" b="F8 68"/>
+ <a u="9D0C" b="F8 69"/>
+ <a u="9D0D" b="F8 6A"/>
+ <a u="9D0E" b="F8 6B"/>
+ <a u="9D0F" b="F8 6C"/>
+ <a u="9D10" b="F8 6D"/>
+ <a u="9D11" b="F8 6E"/>
+ <a u="9D12" b="F8 6F"/>
+ <a u="9D13" b="F8 70"/>
+ <a u="9D14" b="F8 71"/>
+ <a u="9D15" b="F8 72"/>
+ <a u="9D16" b="F8 73"/>
+ <a u="9D17" b="F8 74"/>
+ <a u="9D18" b="F8 75"/>
+ <a u="9D19" b="F8 76"/>
+ <a u="9D1A" b="F8 77"/>
+ <a u="9D1B" b="F8 78"/>
+ <a u="9D1C" b="F8 79"/>
+ <a u="9D1D" b="F8 7A"/>
+ <a u="9D1E" b="F8 7B"/>
+ <a u="9D1F" b="F8 7C"/>
+ <a u="9D20" b="F8 7D"/>
+ <a u="9D21" b="F8 7E"/>
+ <a u="9D22" b="F8 80"/>
+ <a u="9D23" b="F8 81"/>
+ <a u="9D24" b="F8 82"/>
+ <a u="9D25" b="F8 83"/>
+ <a u="9D26" b="F8 84"/>
+ <a u="9D27" b="F8 85"/>
+ <a u="9D28" b="F8 86"/>
+ <a u="9D29" b="F8 87"/>
+ <a u="9D2A" b="F8 88"/>
+ <a u="9D2B" b="F8 89"/>
+ <a u="9D2C" b="F8 8A"/>
+ <a u="9D2D" b="F8 8B"/>
+ <a u="9D2E" b="F8 8C"/>
+ <a u="9D2F" b="F8 8D"/>
+ <a u="9D30" b="F8 8E"/>
+ <a u="9D31" b="F8 8F"/>
+ <a u="9D32" b="F8 90"/>
+ <a u="9D33" b="F8 91"/>
+ <a u="9D34" b="F8 92"/>
+ <a u="9D35" b="F8 93"/>
+ <a u="9D36" b="F8 94"/>
+ <a u="9D37" b="F8 95"/>
+ <a u="9D38" b="F8 96"/>
+ <a u="9D39" b="F8 97"/>
+ <a u="9D3A" b="F8 98"/>
+ <a u="9D3B" b="F8 99"/>
+ <a u="9D3C" b="F8 9A"/>
+ <a u="9D3D" b="F8 9B"/>
+ <a u="9D3E" b="F8 9C"/>
+ <a u="9D3F" b="F8 9D"/>
+ <a u="9D40" b="F8 9E"/>
+ <a u="9D41" b="F8 9F"/>
+ <a u="9D42" b="F8 A0"/>
+ <a u="9D43" b="F9 40"/>
+ <a u="9D44" b="F9 41"/>
+ <a u="9D45" b="F9 42"/>
+ <a u="9D46" b="F9 43"/>
+ <a u="9D47" b="F9 44"/>
+ <a u="9D48" b="F9 45"/>
+ <a u="9D49" b="F9 46"/>
+ <a u="9D4A" b="F9 47"/>
+ <a u="9D4B" b="F9 48"/>
+ <a u="9D4C" b="F9 49"/>
+ <a u="9D4D" b="F9 4A"/>
+ <a u="9D4E" b="F9 4B"/>
+ <a u="9D4F" b="F9 4C"/>
+ <a u="9D50" b="F9 4D"/>
+ <a u="9D51" b="F9 4E"/>
+ <a u="9D52" b="F9 4F"/>
+ <a u="9D53" b="F9 50"/>
+ <a u="9D54" b="F9 51"/>
+ <a u="9D55" b="F9 52"/>
+ <a u="9D56" b="F9 53"/>
+ <a u="9D57" b="F9 54"/>
+ <a u="9D58" b="F9 55"/>
+ <a u="9D59" b="F9 56"/>
+ <a u="9D5A" b="F9 57"/>
+ <a u="9D5B" b="F9 58"/>
+ <a u="9D5C" b="F9 59"/>
+ <a u="9D5D" b="F9 5A"/>
+ <a u="9D5E" b="F9 5B"/>
+ <a u="9D5F" b="F9 5C"/>
+ <a u="9D60" b="F9 5D"/>
+ <a u="9D61" b="F9 5E"/>
+ <a u="9D62" b="F9 5F"/>
+ <a u="9D63" b="F9 60"/>
+ <a u="9D64" b="F9 61"/>
+ <a u="9D65" b="F9 62"/>
+ <a u="9D66" b="F9 63"/>
+ <a u="9D67" b="F9 64"/>
+ <a u="9D68" b="F9 65"/>
+ <a u="9D69" b="F9 66"/>
+ <a u="9D6A" b="F9 67"/>
+ <a u="9D6B" b="F9 68"/>
+ <a u="9D6C" b="F9 69"/>
+ <a u="9D6D" b="F9 6A"/>
+ <a u="9D6E" b="F9 6B"/>
+ <a u="9D6F" b="F9 6C"/>
+ <a u="9D70" b="F9 6D"/>
+ <a u="9D71" b="F9 6E"/>
+ <a u="9D72" b="F9 6F"/>
+ <a u="9D73" b="F9 70"/>
+ <a u="9D74" b="F9 71"/>
+ <a u="9D75" b="F9 72"/>
+ <a u="9D76" b="F9 73"/>
+ <a u="9D77" b="F9 74"/>
+ <a u="9D78" b="F9 75"/>
+ <a u="9D79" b="F9 76"/>
+ <a u="9D7A" b="F9 77"/>
+ <a u="9D7B" b="F9 78"/>
+ <a u="9D7C" b="F9 79"/>
+ <a u="9D7D" b="F9 7A"/>
+ <a u="9D7E" b="F9 7B"/>
+ <a u="9D7F" b="F9 7C"/>
+ <a u="9D80" b="F9 7D"/>
+ <a u="9D81" b="F9 7E"/>
+ <a u="9D82" b="F9 80"/>
+ <a u="9D83" b="F9 81"/>
+ <a u="9D84" b="F9 82"/>
+ <a u="9D85" b="F9 83"/>
+ <a u="9D86" b="F9 84"/>
+ <a u="9D87" b="F9 85"/>
+ <a u="9D88" b="F9 86"/>
+ <a u="9D89" b="F9 87"/>
+ <a u="9D8A" b="F9 88"/>
+ <a u="9D8B" b="F9 89"/>
+ <a u="9D8C" b="F9 8A"/>
+ <a u="9D8D" b="F9 8B"/>
+ <a u="9D8E" b="F9 8C"/>
+ <a u="9D8F" b="F9 8D"/>
+ <a u="9D90" b="F9 8E"/>
+ <a u="9D91" b="F9 8F"/>
+ <a u="9D92" b="F9 90"/>
+ <a u="9D93" b="F9 91"/>
+ <a u="9D94" b="F9 92"/>
+ <a u="9D95" b="F9 93"/>
+ <a u="9D96" b="F9 94"/>
+ <a u="9D97" b="F9 95"/>
+ <a u="9D98" b="F9 96"/>
+ <a u="9D99" b="F9 97"/>
+ <a u="9D9A" b="F9 98"/>
+ <a u="9D9B" b="F9 99"/>
+ <a u="9D9C" b="F9 9A"/>
+ <a u="9D9D" b="F9 9B"/>
+ <a u="9D9E" b="F9 9C"/>
+ <a u="9D9F" b="F9 9D"/>
+ <a u="9DA0" b="F9 9E"/>
+ <a u="9DA1" b="F9 9F"/>
+ <a u="9DA2" b="F9 A0"/>
+ <a u="9DA3" b="FA 40"/>
+ <a u="9DA4" b="FA 41"/>
+ <a u="9DA5" b="FA 42"/>
+ <a u="9DA6" b="FA 43"/>
+ <a u="9DA7" b="FA 44"/>
+ <a u="9DA8" b="FA 45"/>
+ <a u="9DA9" b="FA 46"/>
+ <a u="9DAA" b="FA 47"/>
+ <a u="9DAB" b="FA 48"/>
+ <a u="9DAC" b="FA 49"/>
+ <a u="9DAD" b="FA 4A"/>
+ <a u="9DAE" b="FA 4B"/>
+ <a u="9DAF" b="FA 4C"/>
+ <a u="9DB0" b="FA 4D"/>
+ <a u="9DB1" b="FA 4E"/>
+ <a u="9DB2" b="FA 4F"/>
+ <a u="9DB3" b="FA 50"/>
+ <a u="9DB4" b="FA 51"/>
+ <a u="9DB5" b="FA 52"/>
+ <a u="9DB6" b="FA 53"/>
+ <a u="9DB7" b="FA 54"/>
+ <a u="9DB8" b="FA 55"/>
+ <a u="9DB9" b="FA 56"/>
+ <a u="9DBA" b="FA 57"/>
+ <a u="9DBB" b="FA 58"/>
+ <a u="9DBC" b="FA 59"/>
+ <a u="9DBD" b="FA 5A"/>
+ <a u="9DBE" b="FA 5B"/>
+ <a u="9DBF" b="FA 5C"/>
+ <a u="9DC0" b="FA 5D"/>
+ <a u="9DC1" b="FA 5E"/>
+ <a u="9DC2" b="FA 5F"/>
+ <a u="9DC3" b="FA 60"/>
+ <a u="9DC4" b="FA 61"/>
+ <a u="9DC5" b="FA 62"/>
+ <a u="9DC6" b="FA 63"/>
+ <a u="9DC7" b="FA 64"/>
+ <a u="9DC8" b="FA 65"/>
+ <a u="9DC9" b="FA 66"/>
+ <a u="9DCA" b="FA 67"/>
+ <a u="9DCB" b="FA 68"/>
+ <a u="9DCC" b="FA 69"/>
+ <a u="9DCD" b="FA 6A"/>
+ <a u="9DCE" b="FA 6B"/>
+ <a u="9DCF" b="FA 6C"/>
+ <a u="9DD0" b="FA 6D"/>
+ <a u="9DD1" b="FA 6E"/>
+ <a u="9DD2" b="FA 6F"/>
+ <a u="9DD3" b="FA 70"/>
+ <a u="9DD4" b="FA 71"/>
+ <a u="9DD5" b="FA 72"/>
+ <a u="9DD6" b="FA 73"/>
+ <a u="9DD7" b="FA 74"/>
+ <a u="9DD8" b="FA 75"/>
+ <a u="9DD9" b="FA 76"/>
+ <a u="9DDA" b="FA 77"/>
+ <a u="9DDB" b="FA 78"/>
+ <a u="9DDC" b="FA 79"/>
+ <a u="9DDD" b="FA 7A"/>
+ <a u="9DDE" b="FA 7B"/>
+ <a u="9DDF" b="FA 7C"/>
+ <a u="9DE0" b="FA 7D"/>
+ <a u="9DE1" b="FA 7E"/>
+ <a u="9DE2" b="FA 80"/>
+ <a u="9DE3" b="FA 81"/>
+ <a u="9DE4" b="FA 82"/>
+ <a u="9DE5" b="FA 83"/>
+ <a u="9DE6" b="FA 84"/>
+ <a u="9DE7" b="FA 85"/>
+ <a u="9DE8" b="FA 86"/>
+ <a u="9DE9" b="FA 87"/>
+ <a u="9DEA" b="FA 88"/>
+ <a u="9DEB" b="FA 89"/>
+ <a u="9DEC" b="FA 8A"/>
+ <a u="9DED" b="FA 8B"/>
+ <a u="9DEE" b="FA 8C"/>
+ <a u="9DEF" b="FA 8D"/>
+ <a u="9DF0" b="FA 8E"/>
+ <a u="9DF1" b="FA 8F"/>
+ <a u="9DF2" b="FA 90"/>
+ <a u="9DF3" b="FA 91"/>
+ <a u="9DF4" b="FA 92"/>
+ <a u="9DF5" b="FA 93"/>
+ <a u="9DF6" b="FA 94"/>
+ <a u="9DF7" b="FA 95"/>
+ <a u="9DF8" b="FA 96"/>
+ <a u="9DF9" b="FA 97"/>
+ <a u="9DFA" b="FA 98"/>
+ <a u="9DFB" b="FA 99"/>
+ <a u="9DFC" b="FA 9A"/>
+ <a u="9DFD" b="FA 9B"/>
+ <a u="9DFE" b="FA 9C"/>
+ <a u="9DFF" b="FA 9D"/>
+ <a u="9E00" b="FA 9E"/>
+ <a u="9E01" b="FA 9F"/>
+ <a u="9E02" b="FA A0"/>
+ <a u="9E03" b="FB 40"/>
+ <a u="9E04" b="FB 41"/>
+ <a u="9E05" b="FB 42"/>
+ <a u="9E06" b="FB 43"/>
+ <a u="9E07" b="FB 44"/>
+ <a u="9E08" b="FB 45"/>
+ <a u="9E09" b="FB 46"/>
+ <a u="9E0A" b="FB 47"/>
+ <a u="9E0B" b="FB 48"/>
+ <a u="9E0C" b="FB 49"/>
+ <a u="9E0D" b="FB 4A"/>
+ <a u="9E0E" b="FB 4B"/>
+ <a u="9E0F" b="FB 4C"/>
+ <a u="9E10" b="FB 4D"/>
+ <a u="9E11" b="FB 4E"/>
+ <a u="9E12" b="FB 4F"/>
+ <a u="9E13" b="FB 50"/>
+ <a u="9E14" b="FB 51"/>
+ <a u="9E15" b="FB 52"/>
+ <a u="9E16" b="FB 53"/>
+ <a u="9E17" b="FB 54"/>
+ <a u="9E18" b="FB 55"/>
+ <a u="9E19" b="FB 56"/>
+ <a u="9E1A" b="FB 57"/>
+ <a u="9E1B" b="FB 58"/>
+ <a u="9E1C" b="FB 59"/>
+ <a u="9E1D" b="FB 5A"/>
+ <a u="9E1E" b="FB 5B"/>
+ <a u="9E1F" b="C4 F1"/>
+ <a u="9E20" b="F0 AF"/>
+ <a u="9E21" b="BC A6"/>
+ <a u="9E22" b="F0 B0"/>
+ <a u="9E23" b="C3 F9"/>
+ <a u="9E24" b="FB 5C"/>
+ <a u="9E25" b="C5 B8"/>
+ <a u="9E26" b="D1 BB"/>
+ <a u="9E27" b="FB 5D"/>
+ <a u="9E28" b="F0 B1"/>
+ <a u="9E29" b="F0 B2"/>
+ <a u="9E2A" b="F0 B3"/>
+ <a u="9E2B" b="F0 B4"/>
+ <a u="9E2C" b="F0 B5"/>
+ <a u="9E2D" b="D1 BC"/>
+ <a u="9E2E" b="FB 5E"/>
+ <a u="9E2F" b="D1 EC"/>
+ <a u="9E30" b="FB 5F"/>
+ <a u="9E31" b="F0 B7"/>
+ <a u="9E32" b="F0 B6"/>
+ <a u="9E33" b="D4 A7"/>
+ <a u="9E34" b="FB 60"/>
+ <a u="9E35" b="CD D2"/>
+ <a u="9E36" b="F0 B8"/>
+ <a u="9E37" b="F0 BA"/>
+ <a u="9E38" b="F0 B9"/>
+ <a u="9E39" b="F0 BB"/>
+ <a u="9E3A" b="F0 BC"/>
+ <a u="9E3B" b="FB 61"/>
+ <a u="9E3C" b="FB 62"/>
+ <a u="9E3D" b="B8 EB"/>
+ <a u="9E3E" b="F0 BD"/>
+ <a u="9E3F" b="BA E8"/>
+ <a u="9E40" b="FB 63"/>
+ <a u="9E41" b="F0 BE"/>
+ <a u="9E42" b="F0 BF"/>
+ <a u="9E43" b="BE E9"/>
+ <a u="9E44" b="F0 C0"/>
+ <a u="9E45" b="B6 EC"/>
+ <a u="9E46" b="F0 C1"/>
+ <a u="9E47" b="F0 C2"/>
+ <a u="9E48" b="F0 C3"/>
+ <a u="9E49" b="F0 C4"/>
+ <a u="9E4A" b="C8 B5"/>
+ <a u="9E4B" b="F0 C5"/>
+ <a u="9E4C" b="F0 C6"/>
+ <a u="9E4D" b="FB 64"/>
+ <a u="9E4E" b="F0 C7"/>
+ <a u="9E4F" b="C5 F4"/>
+ <a u="9E50" b="FB 65"/>
+ <a u="9E51" b="F0 C8"/>
+ <a u="9E52" b="FB 66"/>
+ <a u="9E53" b="FB 67"/>
+ <a u="9E54" b="FB 68"/>
+ <a u="9E55" b="F0 C9"/>
+ <a u="9E56" b="FB 69"/>
+ <a u="9E57" b="F0 CA"/>
+ <a u="9E58" b="F7 BD"/>
+ <a u="9E59" b="FB 6A"/>
+ <a u="9E5A" b="F0 CB"/>
+ <a u="9E5B" b="F0 CC"/>
+ <a u="9E5C" b="F0 CD"/>
+ <a u="9E5D" b="FB 6B"/>
+ <a u="9E5E" b="F0 CE"/>
+ <a u="9E5F" b="FB 6C"/>
+ <a u="9E60" b="FB 6D"/>
+ <a u="9E61" b="FB 6E"/>
+ <a u="9E62" b="FB 6F"/>
+ <a u="9E63" b="F0 CF"/>
+ <a u="9E64" b="BA D7"/>
+ <a u="9E65" b="FB 70"/>
+ <a u="9E66" b="F0 D0"/>
+ <a u="9E67" b="F0 D1"/>
+ <a u="9E68" b="F0 D2"/>
+ <a u="9E69" b="F0 D3"/>
+ <a u="9E6A" b="F0 D4"/>
+ <a u="9E6B" b="F0 D5"/>
+ <a u="9E6C" b="F0 D6"/>
+ <a u="9E6D" b="F0 D8"/>
+ <a u="9E6E" b="FB 71"/>
+ <a u="9E6F" b="FB 72"/>
+ <a u="9E70" b="D3 A5"/>
+ <a u="9E71" b="F0 D7"/>
+ <a u="9E72" b="FB 73"/>
+ <a u="9E73" b="F0 D9"/>
+ <a u="9E74" b="FB 74"/>
+ <a u="9E75" b="FB 75"/>
+ <a u="9E76" b="FB 76"/>
+ <a u="9E77" b="FB 77"/>
+ <a u="9E78" b="FB 78"/>
+ <a u="9E79" b="FB 79"/>
+ <a u="9E7A" b="FB 7A"/>
+ <a u="9E7B" b="FB 7B"/>
+ <a u="9E7C" b="FB 7C"/>
+ <a u="9E7D" b="FB 7D"/>
+ <a u="9E7E" b="F5 BA"/>
+ <a u="9E7F" b="C2 B9"/>
+ <a u="9E80" b="FB 7E"/>
+ <a u="9E81" b="FB 80"/>
+ <a u="9E82" b="F7 E4"/>
+ <a u="9E83" b="FB 81"/>
+ <a u="9E84" b="FB 82"/>
+ <a u="9E85" b="FB 83"/>
+ <a u="9E86" b="FB 84"/>
+ <a u="9E87" b="F7 E5"/>
+ <a u="9E88" b="F7 E6"/>
+ <a u="9E89" b="FB 85"/>
+ <a u="9E8A" b="FB 86"/>
+ <a u="9E8B" b="F7 E7"/>
+ <a u="9E8C" b="FB 87"/>
+ <a u="9E8D" b="FB 88"/>
+ <a u="9E8E" b="FB 89"/>
+ <a u="9E8F" b="FB 8A"/>
+ <a u="9E90" b="FB 8B"/>
+ <a u="9E91" b="FB 8C"/>
+ <a u="9E92" b="F7 E8"/>
+ <a u="9E93" b="C2 B4"/>
+ <a u="9E94" b="FB 8D"/>
+ <a u="9E95" b="FB 8E"/>
+ <a u="9E96" b="FB 8F"/>
+ <a u="9E97" b="FB 90"/>
+ <a u="9E98" b="FB 91"/>
+ <a u="9E99" b="FB 92"/>
+ <a u="9E9A" b="FB 93"/>
+ <a u="9E9B" b="FB 94"/>
+ <a u="9E9C" b="FB 95"/>
+ <a u="9E9D" b="F7 EA"/>
+ <a u="9E9E" b="FB 96"/>
+ <a u="9E9F" b="F7 EB"/>
+ <a u="9EA0" b="FB 97"/>
+ <a u="9EA1" b="FB 98"/>
+ <a u="9EA2" b="FB 99"/>
+ <a u="9EA3" b="FB 9A"/>
+ <a u="9EA4" b="FB 9B"/>
+ <a u="9EA5" b="FB 9C"/>
+ <a u="9EA6" b="C2 F3"/>
+ <a u="9EA7" b="FB 9D"/>
+ <a u="9EA8" b="FB 9E"/>
+ <a u="9EA9" b="FB 9F"/>
+ <a u="9EAA" b="FB A0"/>
+ <a u="9EAB" b="FC 40"/>
+ <a u="9EAC" b="FC 41"/>
+ <a u="9EAD" b="FC 42"/>
+ <a u="9EAE" b="FC 43"/>
+ <a u="9EAF" b="FC 44"/>
+ <a u="9EB0" b="FC 45"/>
+ <a u="9EB1" b="FC 46"/>
+ <a u="9EB2" b="FC 47"/>
+ <a u="9EB3" b="FC 48"/>
+ <a u="9EB4" b="F4 F0"/>
+ <a u="9EB5" b="FC 49"/>
+ <a u="9EB6" b="FC 4A"/>
+ <a u="9EB7" b="FC 4B"/>
+ <a u="9EB8" b="F4 EF"/>
+ <a u="9EB9" b="FC 4C"/>
+ <a u="9EBA" b="FC 4D"/>
+ <a u="9EBB" b="C2 E9"/>
+ <a u="9EBC" b="FC 4E"/>
+ <a u="9EBD" b="F7 E1"/>
+ <a u="9EBE" b="F7 E2"/>
+ <a u="9EBF" b="FC 4F"/>
+ <a u="9EC0" b="FC 50"/>
+ <a u="9EC1" b="FC 51"/>
+ <a u="9EC2" b="FC 52"/>
+ <a u="9EC3" b="FC 53"/>
+ <a u="9EC4" b="BB C6"/>
+ <a u="9EC5" b="FC 54"/>
+ <a u="9EC6" b="FC 55"/>
+ <a u="9EC7" b="FC 56"/>
+ <a u="9EC8" b="FC 57"/>
+ <a u="9EC9" b="D9 E4"/>
+ <a u="9ECA" b="FC 58"/>
+ <a u="9ECB" b="FC 59"/>
+ <a u="9ECC" b="FC 5A"/>
+ <a u="9ECD" b="CA F2"/>
+ <a u="9ECE" b="C0 E8"/>
+ <a u="9ECF" b="F0 A4"/>
+ <a u="9ED0" b="FC 5B"/>
+ <a u="9ED1" b="BA DA"/>
+ <a u="9ED2" b="FC 5C"/>
+ <a u="9ED3" b="FC 5D"/>
+ <a u="9ED4" b="C7 AD"/>
+ <a u="9ED5" b="FC 5E"/>
+ <a u="9ED6" b="FC 5F"/>
+ <a u="9ED7" b="FC 60"/>
+ <a u="9ED8" b="C4 AC"/>
+ <a u="9ED9" b="FC 61"/>
+ <a u="9EDA" b="FC 62"/>
+ <a u="9EDB" b="F7 EC"/>
+ <a u="9EDC" b="F7 ED"/>
+ <a u="9EDD" b="F7 EE"/>
+ <a u="9EDE" b="FC 63"/>
+ <a u="9EDF" b="F7 F0"/>
+ <a u="9EE0" b="F7 EF"/>
+ <a u="9EE1" b="FC 64"/>
+ <a u="9EE2" b="F7 F1"/>
+ <a u="9EE3" b="FC 65"/>
+ <a u="9EE4" b="FC 66"/>
+ <a u="9EE5" b="F7 F4"/>
+ <a u="9EE6" b="FC 67"/>
+ <a u="9EE7" b="F7 F3"/>
+ <a u="9EE8" b="FC 68"/>
+ <a u="9EE9" b="F7 F2"/>
+ <a u="9EEA" b="F7 F5"/>
+ <a u="9EEB" b="FC 69"/>
+ <a u="9EEC" b="FC 6A"/>
+ <a u="9EED" b="FC 6B"/>
+ <a u="9EEE" b="FC 6C"/>
+ <a u="9EEF" b="F7 F6"/>
+ <a u="9EF0" b="FC 6D"/>
+ <a u="9EF1" b="FC 6E"/>
+ <a u="9EF2" b="FC 6F"/>
+ <a u="9EF3" b="FC 70"/>
+ <a u="9EF4" b="FC 71"/>
+ <a u="9EF5" b="FC 72"/>
+ <a u="9EF6" b="FC 73"/>
+ <a u="9EF7" b="FC 74"/>
+ <a u="9EF8" b="FC 75"/>
+ <a u="9EF9" b="ED E9"/>
+ <a u="9EFA" b="FC 76"/>
+ <a u="9EFB" b="ED EA"/>
+ <a u="9EFC" b="ED EB"/>
+ <a u="9EFD" b="FC 77"/>
+ <a u="9EFE" b="F6 BC"/>
+ <a u="9EFF" b="FC 78"/>
+ <a u="9F00" b="FC 79"/>
+ <a u="9F01" b="FC 7A"/>
+ <a u="9F02" b="FC 7B"/>
+ <a u="9F03" b="FC 7C"/>
+ <a u="9F04" b="FC 7D"/>
+ <a u="9F05" b="FC 7E"/>
+ <a u="9F06" b="FC 80"/>
+ <a u="9F07" b="FC 81"/>
+ <a u="9F08" b="FC 82"/>
+ <a u="9F09" b="FC 83"/>
+ <a u="9F0A" b="FC 84"/>
+ <a u="9F0B" b="F6 BD"/>
+ <a u="9F0C" b="FC 85"/>
+ <a u="9F0D" b="F6 BE"/>
+ <a u="9F0E" b="B6 A6"/>
+ <a u="9F0F" b="FC 86"/>
+ <a u="9F10" b="D8 BE"/>
+ <a u="9F11" b="FC 87"/>
+ <a u="9F12" b="FC 88"/>
+ <a u="9F13" b="B9 C4"/>
+ <a u="9F14" b="FC 89"/>
+ <a u="9F15" b="FC 8A"/>
+ <a u="9F16" b="FC 8B"/>
+ <a u="9F17" b="D8 BB"/>
+ <a u="9F18" b="FC 8C"/>
+ <a u="9F19" b="DC B1"/>
+ <a u="9F1A" b="FC 8D"/>
+ <a u="9F1B" b="FC 8E"/>
+ <a u="9F1C" b="FC 8F"/>
+ <a u="9F1D" b="FC 90"/>
+ <a u="9F1E" b="FC 91"/>
+ <a u="9F1F" b="FC 92"/>
+ <a u="9F20" b="CA F3"/>
+ <a u="9F21" b="FC 93"/>
+ <a u="9F22" b="F7 F7"/>
+ <a u="9F23" b="FC 94"/>
+ <a u="9F24" b="FC 95"/>
+ <a u="9F25" b="FC 96"/>
+ <a u="9F26" b="FC 97"/>
+ <a u="9F27" b="FC 98"/>
+ <a u="9F28" b="FC 99"/>
+ <a u="9F29" b="FC 9A"/>
+ <a u="9F2A" b="FC 9B"/>
+ <a u="9F2B" b="FC 9C"/>
+ <a u="9F2C" b="F7 F8"/>
+ <a u="9F2D" b="FC 9D"/>
+ <a u="9F2E" b="FC 9E"/>
+ <a u="9F2F" b="F7 F9"/>
+ <a u="9F30" b="FC 9F"/>
+ <a u="9F31" b="FC A0"/>
+ <a u="9F32" b="FD 40"/>
+ <a u="9F33" b="FD 41"/>
+ <a u="9F34" b="FD 42"/>
+ <a u="9F35" b="FD 43"/>
+ <a u="9F36" b="FD 44"/>
+ <a u="9F37" b="F7 FB"/>
+ <a u="9F38" b="FD 45"/>
+ <a u="9F39" b="F7 FA"/>
+ <a u="9F3A" b="FD 46"/>
+ <a u="9F3B" b="B1 C7"/>
+ <a u="9F3C" b="FD 47"/>
+ <a u="9F3D" b="F7 FC"/>
+ <a u="9F3E" b="F7 FD"/>
+ <a u="9F3F" b="FD 48"/>
+ <a u="9F40" b="FD 49"/>
+ <a u="9F41" b="FD 4A"/>
+ <a u="9F42" b="FD 4B"/>
+ <a u="9F43" b="FD 4C"/>
+ <a u="9F44" b="F7 FE"/>
+ <a u="9F45" b="FD 4D"/>
+ <a u="9F46" b="FD 4E"/>
+ <a u="9F47" b="FD 4F"/>
+ <a u="9F48" b="FD 50"/>
+ <a u="9F49" b="FD 51"/>
+ <a u="9F4A" b="FD 52"/>
+ <a u="9F4B" b="FD 53"/>
+ <a u="9F4C" b="FD 54"/>
+ <a u="9F4D" b="FD 55"/>
+ <a u="9F4E" b="FD 56"/>
+ <a u="9F4F" b="FD 57"/>
+ <a u="9F50" b="C6 EB"/>
+ <a u="9F51" b="EC B4"/>
+ <a u="9F52" b="FD 58"/>
+ <a u="9F53" b="FD 59"/>
+ <a u="9F54" b="FD 5A"/>
+ <a u="9F55" b="FD 5B"/>
+ <a u="9F56" b="FD 5C"/>
+ <a u="9F57" b="FD 5D"/>
+ <a u="9F58" b="FD 5E"/>
+ <a u="9F59" b="FD 5F"/>
+ <a u="9F5A" b="FD 60"/>
+ <a u="9F5B" b="FD 61"/>
+ <a u="9F5C" b="FD 62"/>
+ <a u="9F5D" b="FD 63"/>
+ <a u="9F5E" b="FD 64"/>
+ <a u="9F5F" b="FD 65"/>
+ <a u="9F60" b="FD 66"/>
+ <a u="9F61" b="FD 67"/>
+ <a u="9F62" b="FD 68"/>
+ <a u="9F63" b="FD 69"/>
+ <a u="9F64" b="FD 6A"/>
+ <a u="9F65" b="FD 6B"/>
+ <a u="9F66" b="FD 6C"/>
+ <a u="9F67" b="FD 6D"/>
+ <a u="9F68" b="FD 6E"/>
+ <a u="9F69" b="FD 6F"/>
+ <a u="9F6A" b="FD 70"/>
+ <a u="9F6B" b="FD 71"/>
+ <a u="9F6C" b="FD 72"/>
+ <a u="9F6D" b="FD 73"/>
+ <a u="9F6E" b="FD 74"/>
+ <a u="9F6F" b="FD 75"/>
+ <a u="9F70" b="FD 76"/>
+ <a u="9F71" b="FD 77"/>
+ <a u="9F72" b="FD 78"/>
+ <a u="9F73" b="FD 79"/>
+ <a u="9F74" b="FD 7A"/>
+ <a u="9F75" b="FD 7B"/>
+ <a u="9F76" b="FD 7C"/>
+ <a u="9F77" b="FD 7D"/>
+ <a u="9F78" b="FD 7E"/>
+ <a u="9F79" b="FD 80"/>
+ <a u="9F7A" b="FD 81"/>
+ <a u="9F7B" b="FD 82"/>
+ <a u="9F7C" b="FD 83"/>
+ <a u="9F7D" b="FD 84"/>
+ <a u="9F7E" b="FD 85"/>
+ <a u="9F7F" b="B3 DD"/>
+ <a u="9F80" b="F6 B3"/>
+ <a u="9F81" b="FD 86"/>
+ <a u="9F82" b="FD 87"/>
+ <a u="9F83" b="F6 B4"/>
+ <a u="9F84" b="C1 E4"/>
+ <a u="9F85" b="F6 B5"/>
+ <a u="9F86" b="F6 B6"/>
+ <a u="9F87" b="F6 B7"/>
+ <a u="9F88" b="F6 B8"/>
+ <a u="9F89" b="F6 B9"/>
+ <a u="9F8A" b="F6 BA"/>
+ <a u="9F8B" b="C8 A3"/>
+ <a u="9F8C" b="F6 BB"/>
+ <a u="9F8D" b="FD 88"/>
+ <a u="9F8E" b="FD 89"/>
+ <a u="9F8F" b="FD 8A"/>
+ <a u="9F90" b="FD 8B"/>
+ <a u="9F91" b="FD 8C"/>
+ <a u="9F92" b="FD 8D"/>
+ <a u="9F93" b="FD 8E"/>
+ <a u="9F94" b="FD 8F"/>
+ <a u="9F95" b="FD 90"/>
+ <a u="9F96" b="FD 91"/>
+ <a u="9F97" b="FD 92"/>
+ <a u="9F98" b="FD 93"/>
+ <a u="9F99" b="C1 FA"/>
+ <a u="9F9A" b="B9 A8"/>
+ <a u="9F9B" b="ED E8"/>
+ <a u="9F9C" b="FD 94"/>
+ <a u="9F9D" b="FD 95"/>
+ <a u="9F9E" b="FD 96"/>
+ <a u="9F9F" b="B9 EA"/>
+ <a u="9FA0" b="D9 DF"/>
+ <a u="9FA1" b="FD 97"/>
+ <a u="9FA2" b="FD 98"/>
+ <a u="9FA3" b="FD 99"/>
+ <a u="9FA4" b="FD 9A"/>
+ <a u="9FA5" b="FD 9B"/>
+ <a u="E000" b="AA A1"/>
+ <a u="E001" b="AA A2"/>
+ <a u="E002" b="AA A3"/>
+ <a u="E003" b="AA A4"/>
+ <a u="E004" b="AA A5"/>
+ <a u="E005" b="AA A6"/>
+ <a u="E006" b="AA A7"/>
+ <a u="E007" b="AA A8"/>
+ <a u="E008" b="AA A9"/>
+ <a u="E009" b="AA AA"/>
+ <a u="E00A" b="AA AB"/>
+ <a u="E00B" b="AA AC"/>
+ <a u="E00C" b="AA AD"/>
+ <a u="E00D" b="AA AE"/>
+ <a u="E00E" b="AA AF"/>
+ <a u="E00F" b="AA B0"/>
+ <a u="E010" b="AA B1"/>
+ <a u="E011" b="AA B2"/>
+ <a u="E012" b="AA B3"/>
+ <a u="E013" b="AA B4"/>
+ <a u="E014" b="AA B5"/>
+ <a u="E015" b="AA B6"/>
+ <a u="E016" b="AA B7"/>
+ <a u="E017" b="AA B8"/>
+ <a u="E018" b="AA B9"/>
+ <a u="E019" b="AA BA"/>
+ <a u="E01A" b="AA BB"/>
+ <a u="E01B" b="AA BC"/>
+ <a u="E01C" b="AA BD"/>
+ <a u="E01D" b="AA BE"/>
+ <a u="E01E" b="AA BF"/>
+ <a u="E01F" b="AA C0"/>
+ <a u="E020" b="AA C1"/>
+ <a u="E021" b="AA C2"/>
+ <a u="E022" b="AA C3"/>
+ <a u="E023" b="AA C4"/>
+ <a u="E024" b="AA C5"/>
+ <a u="E025" b="AA C6"/>
+ <a u="E026" b="AA C7"/>
+ <a u="E027" b="AA C8"/>
+ <a u="E028" b="AA C9"/>
+ <a u="E029" b="AA CA"/>
+ <a u="E02A" b="AA CB"/>
+ <a u="E02B" b="AA CC"/>
+ <a u="E02C" b="AA CD"/>
+ <a u="E02D" b="AA CE"/>
+ <a u="E02E" b="AA CF"/>
+ <a u="E02F" b="AA D0"/>
+ <a u="E030" b="AA D1"/>
+ <a u="E031" b="AA D2"/>
+ <a u="E032" b="AA D3"/>
+ <a u="E033" b="AA D4"/>
+ <a u="E034" b="AA D5"/>
+ <a u="E035" b="AA D6"/>
+ <a u="E036" b="AA D7"/>
+ <a u="E037" b="AA D8"/>
+ <a u="E038" b="AA D9"/>
+ <a u="E039" b="AA DA"/>
+ <a u="E03A" b="AA DB"/>
+ <a u="E03B" b="AA DC"/>
+ <a u="E03C" b="AA DD"/>
+ <a u="E03D" b="AA DE"/>
+ <a u="E03E" b="AA DF"/>
+ <a u="E03F" b="AA E0"/>
+ <a u="E040" b="AA E1"/>
+ <a u="E041" b="AA E2"/>
+ <a u="E042" b="AA E3"/>
+ <a u="E043" b="AA E4"/>
+ <a u="E044" b="AA E5"/>
+ <a u="E045" b="AA E6"/>
+ <a u="E046" b="AA E7"/>
+ <a u="E047" b="AA E8"/>
+ <a u="E048" b="AA E9"/>
+ <a u="E049" b="AA EA"/>
+ <a u="E04A" b="AA EB"/>
+ <a u="E04B" b="AA EC"/>
+ <a u="E04C" b="AA ED"/>
+ <a u="E04D" b="AA EE"/>
+ <a u="E04E" b="AA EF"/>
+ <a u="E04F" b="AA F0"/>
+ <a u="E050" b="AA F1"/>
+ <a u="E051" b="AA F2"/>
+ <a u="E052" b="AA F3"/>
+ <a u="E053" b="AA F4"/>
+ <a u="E054" b="AA F5"/>
+ <a u="E055" b="AA F6"/>
+ <a u="E056" b="AA F7"/>
+ <a u="E057" b="AA F8"/>
+ <a u="E058" b="AA F9"/>
+ <a u="E059" b="AA FA"/>
+ <a u="E05A" b="AA FB"/>
+ <a u="E05B" b="AA FC"/>
+ <a u="E05C" b="AA FD"/>
+ <a u="E05D" b="AA FE"/>
+ <a u="E05E" b="AB A1"/>
+ <a u="E05F" b="AB A2"/>
+ <a u="E060" b="AB A3"/>
+ <a u="E061" b="AB A4"/>
+ <a u="E062" b="AB A5"/>
+ <a u="E063" b="AB A6"/>
+ <a u="E064" b="AB A7"/>
+ <a u="E065" b="AB A8"/>
+ <a u="E066" b="AB A9"/>
+ <a u="E067" b="AB AA"/>
+ <a u="E068" b="AB AB"/>
+ <a u="E069" b="AB AC"/>
+ <a u="E06A" b="AB AD"/>
+ <a u="E06B" b="AB AE"/>
+ <a u="E06C" b="AB AF"/>
+ <a u="E06D" b="AB B0"/>
+ <a u="E06E" b="AB B1"/>
+ <a u="E06F" b="AB B2"/>
+ <a u="E070" b="AB B3"/>
+ <a u="E071" b="AB B4"/>
+ <a u="E072" b="AB B5"/>
+ <a u="E073" b="AB B6"/>
+ <a u="E074" b="AB B7"/>
+ <a u="E075" b="AB B8"/>
+ <a u="E076" b="AB B9"/>
+ <a u="E077" b="AB BA"/>
+ <a u="E078" b="AB BB"/>
+ <a u="E079" b="AB BC"/>
+ <a u="E07A" b="AB BD"/>
+ <a u="E07B" b="AB BE"/>
+ <a u="E07C" b="AB BF"/>
+ <a u="E07D" b="AB C0"/>
+ <a u="E07E" b="AB C1"/>
+ <a u="E07F" b="AB C2"/>
+ <a u="E080" b="AB C3"/>
+ <a u="E081" b="AB C4"/>
+ <a u="E082" b="AB C5"/>
+ <a u="E083" b="AB C6"/>
+ <a u="E084" b="AB C7"/>
+ <a u="E085" b="AB C8"/>
+ <a u="E086" b="AB C9"/>
+ <a u="E087" b="AB CA"/>
+ <a u="E088" b="AB CB"/>
+ <a u="E089" b="AB CC"/>
+ <a u="E08A" b="AB CD"/>
+ <a u="E08B" b="AB CE"/>
+ <a u="E08C" b="AB CF"/>
+ <a u="E08D" b="AB D0"/>
+ <a u="E08E" b="AB D1"/>
+ <a u="E08F" b="AB D2"/>
+ <a u="E090" b="AB D3"/>
+ <a u="E091" b="AB D4"/>
+ <a u="E092" b="AB D5"/>
+ <a u="E093" b="AB D6"/>
+ <a u="E094" b="AB D7"/>
+ <a u="E095" b="AB D8"/>
+ <a u="E096" b="AB D9"/>
+ <a u="E097" b="AB DA"/>
+ <a u="E098" b="AB DB"/>
+ <a u="E099" b="AB DC"/>
+ <a u="E09A" b="AB DD"/>
+ <a u="E09B" b="AB DE"/>
+ <a u="E09C" b="AB DF"/>
+ <a u="E09D" b="AB E0"/>
+ <a u="E09E" b="AB E1"/>
+ <a u="E09F" b="AB E2"/>
+ <a u="E0A0" b="AB E3"/>
+ <a u="E0A1" b="AB E4"/>
+ <a u="E0A2" b="AB E5"/>
+ <a u="E0A3" b="AB E6"/>
+ <a u="E0A4" b="AB E7"/>
+ <a u="E0A5" b="AB E8"/>
+ <a u="E0A6" b="AB E9"/>
+ <a u="E0A7" b="AB EA"/>
+ <a u="E0A8" b="AB EB"/>
+ <a u="E0A9" b="AB EC"/>
+ <a u="E0AA" b="AB ED"/>
+ <a u="E0AB" b="AB EE"/>
+ <a u="E0AC" b="AB EF"/>
+ <a u="E0AD" b="AB F0"/>
+ <a u="E0AE" b="AB F1"/>
+ <a u="E0AF" b="AB F2"/>
+ <a u="E0B0" b="AB F3"/>
+ <a u="E0B1" b="AB F4"/>
+ <a u="E0B2" b="AB F5"/>
+ <a u="E0B3" b="AB F6"/>
+ <a u="E0B4" b="AB F7"/>
+ <a u="E0B5" b="AB F8"/>
+ <a u="E0B6" b="AB F9"/>
+ <a u="E0B7" b="AB FA"/>
+ <a u="E0B8" b="AB FB"/>
+ <a u="E0B9" b="AB FC"/>
+ <a u="E0BA" b="AB FD"/>
+ <a u="E0BB" b="AB FE"/>
+ <a u="E0BC" b="AC A1"/>
+ <a u="E0BD" b="AC A2"/>
+ <a u="E0BE" b="AC A3"/>
+ <a u="E0BF" b="AC A4"/>
+ <a u="E0C0" b="AC A5"/>
+ <a u="E0C1" b="AC A6"/>
+ <a u="E0C2" b="AC A7"/>
+ <a u="E0C3" b="AC A8"/>
+ <a u="E0C4" b="AC A9"/>
+ <a u="E0C5" b="AC AA"/>
+ <a u="E0C6" b="AC AB"/>
+ <a u="E0C7" b="AC AC"/>
+ <a u="E0C8" b="AC AD"/>
+ <a u="E0C9" b="AC AE"/>
+ <a u="E0CA" b="AC AF"/>
+ <a u="E0CB" b="AC B0"/>
+ <a u="E0CC" b="AC B1"/>
+ <a u="E0CD" b="AC B2"/>
+ <a u="E0CE" b="AC B3"/>
+ <a u="E0CF" b="AC B4"/>
+ <a u="E0D0" b="AC B5"/>
+ <a u="E0D1" b="AC B6"/>
+ <a u="E0D2" b="AC B7"/>
+ <a u="E0D3" b="AC B8"/>
+ <a u="E0D4" b="AC B9"/>
+ <a u="E0D5" b="AC BA"/>
+ <a u="E0D6" b="AC BB"/>
+ <a u="E0D7" b="AC BC"/>
+ <a u="E0D8" b="AC BD"/>
+ <a u="E0D9" b="AC BE"/>
+ <a u="E0DA" b="AC BF"/>
+ <a u="E0DB" b="AC C0"/>
+ <a u="E0DC" b="AC C1"/>
+ <a u="E0DD" b="AC C2"/>
+ <a u="E0DE" b="AC C3"/>
+ <a u="E0DF" b="AC C4"/>
+ <a u="E0E0" b="AC C5"/>
+ <a u="E0E1" b="AC C6"/>
+ <a u="E0E2" b="AC C7"/>
+ <a u="E0E3" b="AC C8"/>
+ <a u="E0E4" b="AC C9"/>
+ <a u="E0E5" b="AC CA"/>
+ <a u="E0E6" b="AC CB"/>
+ <a u="E0E7" b="AC CC"/>
+ <a u="E0E8" b="AC CD"/>
+ <a u="E0E9" b="AC CE"/>
+ <a u="E0EA" b="AC CF"/>
+ <a u="E0EB" b="AC D0"/>
+ <a u="E0EC" b="AC D1"/>
+ <a u="E0ED" b="AC D2"/>
+ <a u="E0EE" b="AC D3"/>
+ <a u="E0EF" b="AC D4"/>
+ <a u="E0F0" b="AC D5"/>
+ <a u="E0F1" b="AC D6"/>
+ <a u="E0F2" b="AC D7"/>
+ <a u="E0F3" b="AC D8"/>
+ <a u="E0F4" b="AC D9"/>
+ <a u="E0F5" b="AC DA"/>
+ <a u="E0F6" b="AC DB"/>
+ <a u="E0F7" b="AC DC"/>
+ <a u="E0F8" b="AC DD"/>
+ <a u="E0F9" b="AC DE"/>
+ <a u="E0FA" b="AC DF"/>
+ <a u="E0FB" b="AC E0"/>
+ <a u="E0FC" b="AC E1"/>
+ <a u="E0FD" b="AC E2"/>
+ <a u="E0FE" b="AC E3"/>
+ <a u="E0FF" b="AC E4"/>
+ <a u="E100" b="AC E5"/>
+ <a u="E101" b="AC E6"/>
+ <a u="E102" b="AC E7"/>
+ <a u="E103" b="AC E8"/>
+ <a u="E104" b="AC E9"/>
+ <a u="E105" b="AC EA"/>
+ <a u="E106" b="AC EB"/>
+ <a u="E107" b="AC EC"/>
+ <a u="E108" b="AC ED"/>
+ <a u="E109" b="AC EE"/>
+ <a u="E10A" b="AC EF"/>
+ <a u="E10B" b="AC F0"/>
+ <a u="E10C" b="AC F1"/>
+ <a u="E10D" b="AC F2"/>
+ <a u="E10E" b="AC F3"/>
+ <a u="E10F" b="AC F4"/>
+ <a u="E110" b="AC F5"/>
+ <a u="E111" b="AC F6"/>
+ <a u="E112" b="AC F7"/>
+ <a u="E113" b="AC F8"/>
+ <a u="E114" b="AC F9"/>
+ <a u="E115" b="AC FA"/>
+ <a u="E116" b="AC FB"/>
+ <a u="E117" b="AC FC"/>
+ <a u="E118" b="AC FD"/>
+ <a u="E119" b="AC FE"/>
+ <a u="E11A" b="AD A1"/>
+ <a u="E11B" b="AD A2"/>
+ <a u="E11C" b="AD A3"/>
+ <a u="E11D" b="AD A4"/>
+ <a u="E11E" b="AD A5"/>
+ <a u="E11F" b="AD A6"/>
+ <a u="E120" b="AD A7"/>
+ <a u="E121" b="AD A8"/>
+ <a u="E122" b="AD A9"/>
+ <a u="E123" b="AD AA"/>
+ <a u="E124" b="AD AB"/>
+ <a u="E125" b="AD AC"/>
+ <a u="E126" b="AD AD"/>
+ <a u="E127" b="AD AE"/>
+ <a u="E128" b="AD AF"/>
+ <a u="E129" b="AD B0"/>
+ <a u="E12A" b="AD B1"/>
+ <a u="E12B" b="AD B2"/>
+ <a u="E12C" b="AD B3"/>
+ <a u="E12D" b="AD B4"/>
+ <a u="E12E" b="AD B5"/>
+ <a u="E12F" b="AD B6"/>
+ <a u="E130" b="AD B7"/>
+ <a u="E131" b="AD B8"/>
+ <a u="E132" b="AD B9"/>
+ <a u="E133" b="AD BA"/>
+ <a u="E134" b="AD BB"/>
+ <a u="E135" b="AD BC"/>
+ <a u="E136" b="AD BD"/>
+ <a u="E137" b="AD BE"/>
+ <a u="E138" b="AD BF"/>
+ <a u="E139" b="AD C0"/>
+ <a u="E13A" b="AD C1"/>
+ <a u="E13B" b="AD C2"/>
+ <a u="E13C" b="AD C3"/>
+ <a u="E13D" b="AD C4"/>
+ <a u="E13E" b="AD C5"/>
+ <a u="E13F" b="AD C6"/>
+ <a u="E140" b="AD C7"/>
+ <a u="E141" b="AD C8"/>
+ <a u="E142" b="AD C9"/>
+ <a u="E143" b="AD CA"/>
+ <a u="E144" b="AD CB"/>
+ <a u="E145" b="AD CC"/>
+ <a u="E146" b="AD CD"/>
+ <a u="E147" b="AD CE"/>
+ <a u="E148" b="AD CF"/>
+ <a u="E149" b="AD D0"/>
+ <a u="E14A" b="AD D1"/>
+ <a u="E14B" b="AD D2"/>
+ <a u="E14C" b="AD D3"/>
+ <a u="E14D" b="AD D4"/>
+ <a u="E14E" b="AD D5"/>
+ <a u="E14F" b="AD D6"/>
+ <a u="E150" b="AD D7"/>
+ <a u="E151" b="AD D8"/>
+ <a u="E152" b="AD D9"/>
+ <a u="E153" b="AD DA"/>
+ <a u="E154" b="AD DB"/>
+ <a u="E155" b="AD DC"/>
+ <a u="E156" b="AD DD"/>
+ <a u="E157" b="AD DE"/>
+ <a u="E158" b="AD DF"/>
+ <a u="E159" b="AD E0"/>
+ <a u="E15A" b="AD E1"/>
+ <a u="E15B" b="AD E2"/>
+ <a u="E15C" b="AD E3"/>
+ <a u="E15D" b="AD E4"/>
+ <a u="E15E" b="AD E5"/>
+ <a u="E15F" b="AD E6"/>
+ <a u="E160" b="AD E7"/>
+ <a u="E161" b="AD E8"/>
+ <a u="E162" b="AD E9"/>
+ <a u="E163" b="AD EA"/>
+ <a u="E164" b="AD EB"/>
+ <a u="E165" b="AD EC"/>
+ <a u="E166" b="AD ED"/>
+ <a u="E167" b="AD EE"/>
+ <a u="E168" b="AD EF"/>
+ <a u="E169" b="AD F0"/>
+ <a u="E16A" b="AD F1"/>
+ <a u="E16B" b="AD F2"/>
+ <a u="E16C" b="AD F3"/>
+ <a u="E16D" b="AD F4"/>
+ <a u="E16E" b="AD F5"/>
+ <a u="E16F" b="AD F6"/>
+ <a u="E170" b="AD F7"/>
+ <a u="E171" b="AD F8"/>
+ <a u="E172" b="AD F9"/>
+ <a u="E173" b="AD FA"/>
+ <a u="E174" b="AD FB"/>
+ <a u="E175" b="AD FC"/>
+ <a u="E176" b="AD FD"/>
+ <a u="E177" b="AD FE"/>
+ <a u="E178" b="AE A1"/>
+ <a u="E179" b="AE A2"/>
+ <a u="E17A" b="AE A3"/>
+ <a u="E17B" b="AE A4"/>
+ <a u="E17C" b="AE A5"/>
+ <a u="E17D" b="AE A6"/>
+ <a u="E17E" b="AE A7"/>
+ <a u="E17F" b="AE A8"/>
+ <a u="E180" b="AE A9"/>
+ <a u="E181" b="AE AA"/>
+ <a u="E182" b="AE AB"/>
+ <a u="E183" b="AE AC"/>
+ <a u="E184" b="AE AD"/>
+ <a u="E185" b="AE AE"/>
+ <a u="E186" b="AE AF"/>
+ <a u="E187" b="AE B0"/>
+ <a u="E188" b="AE B1"/>
+ <a u="E189" b="AE B2"/>
+ <a u="E18A" b="AE B3"/>
+ <a u="E18B" b="AE B4"/>
+ <a u="E18C" b="AE B5"/>
+ <a u="E18D" b="AE B6"/>
+ <a u="E18E" b="AE B7"/>
+ <a u="E18F" b="AE B8"/>
+ <a u="E190" b="AE B9"/>
+ <a u="E191" b="AE BA"/>
+ <a u="E192" b="AE BB"/>
+ <a u="E193" b="AE BC"/>
+ <a u="E194" b="AE BD"/>
+ <a u="E195" b="AE BE"/>
+ <a u="E196" b="AE BF"/>
+ <a u="E197" b="AE C0"/>
+ <a u="E198" b="AE C1"/>
+ <a u="E199" b="AE C2"/>
+ <a u="E19A" b="AE C3"/>
+ <a u="E19B" b="AE C4"/>
+ <a u="E19C" b="AE C5"/>
+ <a u="E19D" b="AE C6"/>
+ <a u="E19E" b="AE C7"/>
+ <a u="E19F" b="AE C8"/>
+ <a u="E1A0" b="AE C9"/>
+ <a u="E1A1" b="AE CA"/>
+ <a u="E1A2" b="AE CB"/>
+ <a u="E1A3" b="AE CC"/>
+ <a u="E1A4" b="AE CD"/>
+ <a u="E1A5" b="AE CE"/>
+ <a u="E1A6" b="AE CF"/>
+ <a u="E1A7" b="AE D0"/>
+ <a u="E1A8" b="AE D1"/>
+ <a u="E1A9" b="AE D2"/>
+ <a u="E1AA" b="AE D3"/>
+ <a u="E1AB" b="AE D4"/>
+ <a u="E1AC" b="AE D5"/>
+ <a u="E1AD" b="AE D6"/>
+ <a u="E1AE" b="AE D7"/>
+ <a u="E1AF" b="AE D8"/>
+ <a u="E1B0" b="AE D9"/>
+ <a u="E1B1" b="AE DA"/>
+ <a u="E1B2" b="AE DB"/>
+ <a u="E1B3" b="AE DC"/>
+ <a u="E1B4" b="AE DD"/>
+ <a u="E1B5" b="AE DE"/>
+ <a u="E1B6" b="AE DF"/>
+ <a u="E1B7" b="AE E0"/>
+ <a u="E1B8" b="AE E1"/>
+ <a u="E1B9" b="AE E2"/>
+ <a u="E1BA" b="AE E3"/>
+ <a u="E1BB" b="AE E4"/>
+ <a u="E1BC" b="AE E5"/>
+ <a u="E1BD" b="AE E6"/>
+ <a u="E1BE" b="AE E7"/>
+ <a u="E1BF" b="AE E8"/>
+ <a u="E1C0" b="AE E9"/>
+ <a u="E1C1" b="AE EA"/>
+ <a u="E1C2" b="AE EB"/>
+ <a u="E1C3" b="AE EC"/>
+ <a u="E1C4" b="AE ED"/>
+ <a u="E1C5" b="AE EE"/>
+ <a u="E1C6" b="AE EF"/>
+ <a u="E1C7" b="AE F0"/>
+ <a u="E1C8" b="AE F1"/>
+ <a u="E1C9" b="AE F2"/>
+ <a u="E1CA" b="AE F3"/>
+ <a u="E1CB" b="AE F4"/>
+ <a u="E1CC" b="AE F5"/>
+ <a u="E1CD" b="AE F6"/>
+ <a u="E1CE" b="AE F7"/>
+ <a u="E1CF" b="AE F8"/>
+ <a u="E1D0" b="AE F9"/>
+ <a u="E1D1" b="AE FA"/>
+ <a u="E1D2" b="AE FB"/>
+ <a u="E1D3" b="AE FC"/>
+ <a u="E1D4" b="AE FD"/>
+ <a u="E1D5" b="AE FE"/>
+ <a u="E1D6" b="AF A1"/>
+ <a u="E1D7" b="AF A2"/>
+ <a u="E1D8" b="AF A3"/>
+ <a u="E1D9" b="AF A4"/>
+ <a u="E1DA" b="AF A5"/>
+ <a u="E1DB" b="AF A6"/>
+ <a u="E1DC" b="AF A7"/>
+ <a u="E1DD" b="AF A8"/>
+ <a u="E1DE" b="AF A9"/>
+ <a u="E1DF" b="AF AA"/>
+ <a u="E1E0" b="AF AB"/>
+ <a u="E1E1" b="AF AC"/>
+ <a u="E1E2" b="AF AD"/>
+ <a u="E1E3" b="AF AE"/>
+ <a u="E1E4" b="AF AF"/>
+ <a u="E1E5" b="AF B0"/>
+ <a u="E1E6" b="AF B1"/>
+ <a u="E1E7" b="AF B2"/>
+ <a u="E1E8" b="AF B3"/>
+ <a u="E1E9" b="AF B4"/>
+ <a u="E1EA" b="AF B5"/>
+ <a u="E1EB" b="AF B6"/>
+ <a u="E1EC" b="AF B7"/>
+ <a u="E1ED" b="AF B8"/>
+ <a u="E1EE" b="AF B9"/>
+ <a u="E1EF" b="AF BA"/>
+ <a u="E1F0" b="AF BB"/>
+ <a u="E1F1" b="AF BC"/>
+ <a u="E1F2" b="AF BD"/>
+ <a u="E1F3" b="AF BE"/>
+ <a u="E1F4" b="AF BF"/>
+ <a u="E1F5" b="AF C0"/>
+ <a u="E1F6" b="AF C1"/>
+ <a u="E1F7" b="AF C2"/>
+ <a u="E1F8" b="AF C3"/>
+ <a u="E1F9" b="AF C4"/>
+ <a u="E1FA" b="AF C5"/>
+ <a u="E1FB" b="AF C6"/>
+ <a u="E1FC" b="AF C7"/>
+ <a u="E1FD" b="AF C8"/>
+ <a u="E1FE" b="AF C9"/>
+ <a u="E1FF" b="AF CA"/>
+ <a u="E200" b="AF CB"/>
+ <a u="E201" b="AF CC"/>
+ <a u="E202" b="AF CD"/>
+ <a u="E203" b="AF CE"/>
+ <a u="E204" b="AF CF"/>
+ <a u="E205" b="AF D0"/>
+ <a u="E206" b="AF D1"/>
+ <a u="E207" b="AF D2"/>
+ <a u="E208" b="AF D3"/>
+ <a u="E209" b="AF D4"/>
+ <a u="E20A" b="AF D5"/>
+ <a u="E20B" b="AF D6"/>
+ <a u="E20C" b="AF D7"/>
+ <a u="E20D" b="AF D8"/>
+ <a u="E20E" b="AF D9"/>
+ <a u="E20F" b="AF DA"/>
+ <a u="E210" b="AF DB"/>
+ <a u="E211" b="AF DC"/>
+ <a u="E212" b="AF DD"/>
+ <a u="E213" b="AF DE"/>
+ <a u="E214" b="AF DF"/>
+ <a u="E215" b="AF E0"/>
+ <a u="E216" b="AF E1"/>
+ <a u="E217" b="AF E2"/>
+ <a u="E218" b="AF E3"/>
+ <a u="E219" b="AF E4"/>
+ <a u="E21A" b="AF E5"/>
+ <a u="E21B" b="AF E6"/>
+ <a u="E21C" b="AF E7"/>
+ <a u="E21D" b="AF E8"/>
+ <a u="E21E" b="AF E9"/>
+ <a u="E21F" b="AF EA"/>
+ <a u="E220" b="AF EB"/>
+ <a u="E221" b="AF EC"/>
+ <a u="E222" b="AF ED"/>
+ <a u="E223" b="AF EE"/>
+ <a u="E224" b="AF EF"/>
+ <a u="E225" b="AF F0"/>
+ <a u="E226" b="AF F1"/>
+ <a u="E227" b="AF F2"/>
+ <a u="E228" b="AF F3"/>
+ <a u="E229" b="AF F4"/>
+ <a u="E22A" b="AF F5"/>
+ <a u="E22B" b="AF F6"/>
+ <a u="E22C" b="AF F7"/>
+ <a u="E22D" b="AF F8"/>
+ <a u="E22E" b="AF F9"/>
+ <a u="E22F" b="AF FA"/>
+ <a u="E230" b="AF FB"/>
+ <a u="E231" b="AF FC"/>
+ <a u="E232" b="AF FD"/>
+ <a u="E233" b="AF FE"/>
+ <a u="E234" b="F8 A1"/>
+ <a u="E235" b="F8 A2"/>
+ <a u="E236" b="F8 A3"/>
+ <a u="E237" b="F8 A4"/>
+ <a u="E238" b="F8 A5"/>
+ <a u="E239" b="F8 A6"/>
+ <a u="E23A" b="F8 A7"/>
+ <a u="E23B" b="F8 A8"/>
+ <a u="E23C" b="F8 A9"/>
+ <a u="E23D" b="F8 AA"/>
+ <a u="E23E" b="F8 AB"/>
+ <a u="E23F" b="F8 AC"/>
+ <a u="E240" b="F8 AD"/>
+ <a u="E241" b="F8 AE"/>
+ <a u="E242" b="F8 AF"/>
+ <a u="E243" b="F8 B0"/>
+ <a u="E244" b="F8 B1"/>
+ <a u="E245" b="F8 B2"/>
+ <a u="E246" b="F8 B3"/>
+ <a u="E247" b="F8 B4"/>
+ <a u="E248" b="F8 B5"/>
+ <a u="E249" b="F8 B6"/>
+ <a u="E24A" b="F8 B7"/>
+ <a u="E24B" b="F8 B8"/>
+ <a u="E24C" b="F8 B9"/>
+ <a u="E24D" b="F8 BA"/>
+ <a u="E24E" b="F8 BB"/>
+ <a u="E24F" b="F8 BC"/>
+ <a u="E250" b="F8 BD"/>
+ <a u="E251" b="F8 BE"/>
+ <a u="E252" b="F8 BF"/>
+ <a u="E253" b="F8 C0"/>
+ <a u="E254" b="F8 C1"/>
+ <a u="E255" b="F8 C2"/>
+ <a u="E256" b="F8 C3"/>
+ <a u="E257" b="F8 C4"/>
+ <a u="E258" b="F8 C5"/>
+ <a u="E259" b="F8 C6"/>
+ <a u="E25A" b="F8 C7"/>
+ <a u="E25B" b="F8 C8"/>
+ <a u="E25C" b="F8 C9"/>
+ <a u="E25D" b="F8 CA"/>
+ <a u="E25E" b="F8 CB"/>
+ <a u="E25F" b="F8 CC"/>
+ <a u="E260" b="F8 CD"/>
+ <a u="E261" b="F8 CE"/>
+ <a u="E262" b="F8 CF"/>
+ <a u="E263" b="F8 D0"/>
+ <a u="E264" b="F8 D1"/>
+ <a u="E265" b="F8 D2"/>
+ <a u="E266" b="F8 D3"/>
+ <a u="E267" b="F8 D4"/>
+ <a u="E268" b="F8 D5"/>
+ <a u="E269" b="F8 D6"/>
+ <a u="E26A" b="F8 D7"/>
+ <a u="E26B" b="F8 D8"/>
+ <a u="E26C" b="F8 D9"/>
+ <a u="E26D" b="F8 DA"/>
+ <a u="E26E" b="F8 DB"/>
+ <a u="E26F" b="F8 DC"/>
+ <a u="E270" b="F8 DD"/>
+ <a u="E271" b="F8 DE"/>
+ <a u="E272" b="F8 DF"/>
+ <a u="E273" b="F8 E0"/>
+ <a u="E274" b="F8 E1"/>
+ <a u="E275" b="F8 E2"/>
+ <a u="E276" b="F8 E3"/>
+ <a u="E277" b="F8 E4"/>
+ <a u="E278" b="F8 E5"/>
+ <a u="E279" b="F8 E6"/>
+ <a u="E27A" b="F8 E7"/>
+ <a u="E27B" b="F8 E8"/>
+ <a u="E27C" b="F8 E9"/>
+ <a u="E27D" b="F8 EA"/>
+ <a u="E27E" b="F8 EB"/>
+ <a u="E27F" b="F8 EC"/>
+ <a u="E280" b="F8 ED"/>
+ <a u="E281" b="F8 EE"/>
+ <a u="E282" b="F8 EF"/>
+ <a u="E283" b="F8 F0"/>
+ <a u="E284" b="F8 F1"/>
+ <a u="E285" b="F8 F2"/>
+ <a u="E286" b="F8 F3"/>
+ <a u="E287" b="F8 F4"/>
+ <a u="E288" b="F8 F5"/>
+ <a u="E289" b="F8 F6"/>
+ <a u="E28A" b="F8 F7"/>
+ <a u="E28B" b="F8 F8"/>
+ <a u="E28C" b="F8 F9"/>
+ <a u="E28D" b="F8 FA"/>
+ <a u="E28E" b="F8 FB"/>
+ <a u="E28F" b="F8 FC"/>
+ <a u="E290" b="F8 FD"/>
+ <a u="E291" b="F8 FE"/>
+ <a u="E292" b="F9 A1"/>
+ <a u="E293" b="F9 A2"/>
+ <a u="E294" b="F9 A3"/>
+ <a u="E295" b="F9 A4"/>
+ <a u="E296" b="F9 A5"/>
+ <a u="E297" b="F9 A6"/>
+ <a u="E298" b="F9 A7"/>
+ <a u="E299" b="F9 A8"/>
+ <a u="E29A" b="F9 A9"/>
+ <a u="E29B" b="F9 AA"/>
+ <a u="E29C" b="F9 AB"/>
+ <a u="E29D" b="F9 AC"/>
+ <a u="E29E" b="F9 AD"/>
+ <a u="E29F" b="F9 AE"/>
+ <a u="E2A0" b="F9 AF"/>
+ <a u="E2A1" b="F9 B0"/>
+ <a u="E2A2" b="F9 B1"/>
+ <a u="E2A3" b="F9 B2"/>
+ <a u="E2A4" b="F9 B3"/>
+ <a u="E2A5" b="F9 B4"/>
+ <a u="E2A6" b="F9 B5"/>
+ <a u="E2A7" b="F9 B6"/>
+ <a u="E2A8" b="F9 B7"/>
+ <a u="E2A9" b="F9 B8"/>
+ <a u="E2AA" b="F9 B9"/>
+ <a u="E2AB" b="F9 BA"/>
+ <a u="E2AC" b="F9 BB"/>
+ <a u="E2AD" b="F9 BC"/>
+ <a u="E2AE" b="F9 BD"/>
+ <a u="E2AF" b="F9 BE"/>
+ <a u="E2B0" b="F9 BF"/>
+ <a u="E2B1" b="F9 C0"/>
+ <a u="E2B2" b="F9 C1"/>
+ <a u="E2B3" b="F9 C2"/>
+ <a u="E2B4" b="F9 C3"/>
+ <a u="E2B5" b="F9 C4"/>
+ <a u="E2B6" b="F9 C5"/>
+ <a u="E2B7" b="F9 C6"/>
+ <a u="E2B8" b="F9 C7"/>
+ <a u="E2B9" b="F9 C8"/>
+ <a u="E2BA" b="F9 C9"/>
+ <a u="E2BB" b="F9 CA"/>
+ <a u="E2BC" b="F9 CB"/>
+ <a u="E2BD" b="F9 CC"/>
+ <a u="E2BE" b="F9 CD"/>
+ <a u="E2BF" b="F9 CE"/>
+ <a u="E2C0" b="F9 CF"/>
+ <a u="E2C1" b="F9 D0"/>
+ <a u="E2C2" b="F9 D1"/>
+ <a u="E2C3" b="F9 D2"/>
+ <a u="E2C4" b="F9 D3"/>
+ <a u="E2C5" b="F9 D4"/>
+ <a u="E2C6" b="F9 D5"/>
+ <a u="E2C7" b="F9 D6"/>
+ <a u="E2C8" b="F9 D7"/>
+ <a u="E2C9" b="F9 D8"/>
+ <a u="E2CA" b="F9 D9"/>
+ <a u="E2CB" b="F9 DA"/>
+ <a u="E2CC" b="F9 DB"/>
+ <a u="E2CD" b="F9 DC"/>
+ <a u="E2CE" b="F9 DD"/>
+ <a u="E2CF" b="F9 DE"/>
+ <a u="E2D0" b="F9 DF"/>
+ <a u="E2D1" b="F9 E0"/>
+ <a u="E2D2" b="F9 E1"/>
+ <a u="E2D3" b="F9 E2"/>
+ <a u="E2D4" b="F9 E3"/>
+ <a u="E2D5" b="F9 E4"/>
+ <a u="E2D6" b="F9 E5"/>
+ <a u="E2D7" b="F9 E6"/>
+ <a u="E2D8" b="F9 E7"/>
+ <a u="E2D9" b="F9 E8"/>
+ <a u="E2DA" b="F9 E9"/>
+ <a u="E2DB" b="F9 EA"/>
+ <a u="E2DC" b="F9 EB"/>
+ <a u="E2DD" b="F9 EC"/>
+ <a u="E2DE" b="F9 ED"/>
+ <a u="E2DF" b="F9 EE"/>
+ <a u="E2E0" b="F9 EF"/>
+ <a u="E2E1" b="F9 F0"/>
+ <a u="E2E2" b="F9 F1"/>
+ <a u="E2E3" b="F9 F2"/>
+ <a u="E2E4" b="F9 F3"/>
+ <a u="E2E5" b="F9 F4"/>
+ <a u="E2E6" b="F9 F5"/>
+ <a u="E2E7" b="F9 F6"/>
+ <a u="E2E8" b="F9 F7"/>
+ <a u="E2E9" b="F9 F8"/>
+ <a u="E2EA" b="F9 F9"/>
+ <a u="E2EB" b="F9 FA"/>
+ <a u="E2EC" b="F9 FB"/>
+ <a u="E2ED" b="F9 FC"/>
+ <a u="E2EE" b="F9 FD"/>
+ <a u="E2EF" b="F9 FE"/>
+ <a u="E2F0" b="FA A1"/>
+ <a u="E2F1" b="FA A2"/>
+ <a u="E2F2" b="FA A3"/>
+ <a u="E2F3" b="FA A4"/>
+ <a u="E2F4" b="FA A5"/>
+ <a u="E2F5" b="FA A6"/>
+ <a u="E2F6" b="FA A7"/>
+ <a u="E2F7" b="FA A8"/>
+ <a u="E2F8" b="FA A9"/>
+ <a u="E2F9" b="FA AA"/>
+ <a u="E2FA" b="FA AB"/>
+ <a u="E2FB" b="FA AC"/>
+ <a u="E2FC" b="FA AD"/>
+ <a u="E2FD" b="FA AE"/>
+ <a u="E2FE" b="FA AF"/>
+ <a u="E2FF" b="FA B0"/>
+ <a u="E300" b="FA B1"/>
+ <a u="E301" b="FA B2"/>
+ <a u="E302" b="FA B3"/>
+ <a u="E303" b="FA B4"/>
+ <a u="E304" b="FA B5"/>
+ <a u="E305" b="FA B6"/>
+ <a u="E306" b="FA B7"/>
+ <a u="E307" b="FA B8"/>
+ <a u="E308" b="FA B9"/>
+ <a u="E309" b="FA BA"/>
+ <a u="E30A" b="FA BB"/>
+ <a u="E30B" b="FA BC"/>
+ <a u="E30C" b="FA BD"/>
+ <a u="E30D" b="FA BE"/>
+ <a u="E30E" b="FA BF"/>
+ <a u="E30F" b="FA C0"/>
+ <a u="E310" b="FA C1"/>
+ <a u="E311" b="FA C2"/>
+ <a u="E312" b="FA C3"/>
+ <a u="E313" b="FA C4"/>
+ <a u="E314" b="FA C5"/>
+ <a u="E315" b="FA C6"/>
+ <a u="E316" b="FA C7"/>
+ <a u="E317" b="FA C8"/>
+ <a u="E318" b="FA C9"/>
+ <a u="E319" b="FA CA"/>
+ <a u="E31A" b="FA CB"/>
+ <a u="E31B" b="FA CC"/>
+ <a u="E31C" b="FA CD"/>
+ <a u="E31D" b="FA CE"/>
+ <a u="E31E" b="FA CF"/>
+ <a u="E31F" b="FA D0"/>
+ <a u="E320" b="FA D1"/>
+ <a u="E321" b="FA D2"/>
+ <a u="E322" b="FA D3"/>
+ <a u="E323" b="FA D4"/>
+ <a u="E324" b="FA D5"/>
+ <a u="E325" b="FA D6"/>
+ <a u="E326" b="FA D7"/>
+ <a u="E327" b="FA D8"/>
+ <a u="E328" b="FA D9"/>
+ <a u="E329" b="FA DA"/>
+ <a u="E32A" b="FA DB"/>
+ <a u="E32B" b="FA DC"/>
+ <a u="E32C" b="FA DD"/>
+ <a u="E32D" b="FA DE"/>
+ <a u="E32E" b="FA DF"/>
+ <a u="E32F" b="FA E0"/>
+ <a u="E330" b="FA E1"/>
+ <a u="E331" b="FA E2"/>
+ <a u="E332" b="FA E3"/>
+ <a u="E333" b="FA E4"/>
+ <a u="E334" b="FA E5"/>
+ <a u="E335" b="FA E6"/>
+ <a u="E336" b="FA E7"/>
+ <a u="E337" b="FA E8"/>
+ <a u="E338" b="FA E9"/>
+ <a u="E339" b="FA EA"/>
+ <a u="E33A" b="FA EB"/>
+ <a u="E33B" b="FA EC"/>
+ <a u="E33C" b="FA ED"/>
+ <a u="E33D" b="FA EE"/>
+ <a u="E33E" b="FA EF"/>
+ <a u="E33F" b="FA F0"/>
+ <a u="E340" b="FA F1"/>
+ <a u="E341" b="FA F2"/>
+ <a u="E342" b="FA F3"/>
+ <a u="E343" b="FA F4"/>
+ <a u="E344" b="FA F5"/>
+ <a u="E345" b="FA F6"/>
+ <a u="E346" b="FA F7"/>
+ <a u="E347" b="FA F8"/>
+ <a u="E348" b="FA F9"/>
+ <a u="E349" b="FA FA"/>
+ <a u="E34A" b="FA FB"/>
+ <a u="E34B" b="FA FC"/>
+ <a u="E34C" b="FA FD"/>
+ <a u="E34D" b="FA FE"/>
+ <a u="E34E" b="FB A1"/>
+ <a u="E34F" b="FB A2"/>
+ <a u="E350" b="FB A3"/>
+ <a u="E351" b="FB A4"/>
+ <a u="E352" b="FB A5"/>
+ <a u="E353" b="FB A6"/>
+ <a u="E354" b="FB A7"/>
+ <a u="E355" b="FB A8"/>
+ <a u="E356" b="FB A9"/>
+ <a u="E357" b="FB AA"/>
+ <a u="E358" b="FB AB"/>
+ <a u="E359" b="FB AC"/>
+ <a u="E35A" b="FB AD"/>
+ <a u="E35B" b="FB AE"/>
+ <a u="E35C" b="FB AF"/>
+ <a u="E35D" b="FB B0"/>
+ <a u="E35E" b="FB B1"/>
+ <a u="E35F" b="FB B2"/>
+ <a u="E360" b="FB B3"/>
+ <a u="E361" b="FB B4"/>
+ <a u="E362" b="FB B5"/>
+ <a u="E363" b="FB B6"/>
+ <a u="E364" b="FB B7"/>
+ <a u="E365" b="FB B8"/>
+ <a u="E366" b="FB B9"/>
+ <a u="E367" b="FB BA"/>
+ <a u="E368" b="FB BB"/>
+ <a u="E369" b="FB BC"/>
+ <a u="E36A" b="FB BD"/>
+ <a u="E36B" b="FB BE"/>
+ <a u="E36C" b="FB BF"/>
+ <a u="E36D" b="FB C0"/>
+ <a u="E36E" b="FB C1"/>
+ <a u="E36F" b="FB C2"/>
+ <a u="E370" b="FB C3"/>
+ <a u="E371" b="FB C4"/>
+ <a u="E372" b="FB C5"/>
+ <a u="E373" b="FB C6"/>
+ <a u="E374" b="FB C7"/>
+ <a u="E375" b="FB C8"/>
+ <a u="E376" b="FB C9"/>
+ <a u="E377" b="FB CA"/>
+ <a u="E378" b="FB CB"/>
+ <a u="E379" b="FB CC"/>
+ <a u="E37A" b="FB CD"/>
+ <a u="E37B" b="FB CE"/>
+ <a u="E37C" b="FB CF"/>
+ <a u="E37D" b="FB D0"/>
+ <a u="E37E" b="FB D1"/>
+ <a u="E37F" b="FB D2"/>
+ <a u="E380" b="FB D3"/>
+ <a u="E381" b="FB D4"/>
+ <a u="E382" b="FB D5"/>
+ <a u="E383" b="FB D6"/>
+ <a u="E384" b="FB D7"/>
+ <a u="E385" b="FB D8"/>
+ <a u="E386" b="FB D9"/>
+ <a u="E387" b="FB DA"/>
+ <a u="E388" b="FB DB"/>
+ <a u="E389" b="FB DC"/>
+ <a u="E38A" b="FB DD"/>
+ <a u="E38B" b="FB DE"/>
+ <a u="E38C" b="FB DF"/>
+ <a u="E38D" b="FB E0"/>
+ <a u="E38E" b="FB E1"/>
+ <a u="E38F" b="FB E2"/>
+ <a u="E390" b="FB E3"/>
+ <a u="E391" b="FB E4"/>
+ <a u="E392" b="FB E5"/>
+ <a u="E393" b="FB E6"/>
+ <a u="E394" b="FB E7"/>
+ <a u="E395" b="FB E8"/>
+ <a u="E396" b="FB E9"/>
+ <a u="E397" b="FB EA"/>
+ <a u="E398" b="FB EB"/>
+ <a u="E399" b="FB EC"/>
+ <a u="E39A" b="FB ED"/>
+ <a u="E39B" b="FB EE"/>
+ <a u="E39C" b="FB EF"/>
+ <a u="E39D" b="FB F0"/>
+ <a u="E39E" b="FB F1"/>
+ <a u="E39F" b="FB F2"/>
+ <a u="E3A0" b="FB F3"/>
+ <a u="E3A1" b="FB F4"/>
+ <a u="E3A2" b="FB F5"/>
+ <a u="E3A3" b="FB F6"/>
+ <a u="E3A4" b="FB F7"/>
+ <a u="E3A5" b="FB F8"/>
+ <a u="E3A6" b="FB F9"/>
+ <a u="E3A7" b="FB FA"/>
+ <a u="E3A8" b="FB FB"/>
+ <a u="E3A9" b="FB FC"/>
+ <a u="E3AA" b="FB FD"/>
+ <a u="E3AB" b="FB FE"/>
+ <a u="E3AC" b="FC A1"/>
+ <a u="E3AD" b="FC A2"/>
+ <a u="E3AE" b="FC A3"/>
+ <a u="E3AF" b="FC A4"/>
+ <a u="E3B0" b="FC A5"/>
+ <a u="E3B1" b="FC A6"/>
+ <a u="E3B2" b="FC A7"/>
+ <a u="E3B3" b="FC A8"/>
+ <a u="E3B4" b="FC A9"/>
+ <a u="E3B5" b="FC AA"/>
+ <a u="E3B6" b="FC AB"/>
+ <a u="E3B7" b="FC AC"/>
+ <a u="E3B8" b="FC AD"/>
+ <a u="E3B9" b="FC AE"/>
+ <a u="E3BA" b="FC AF"/>
+ <a u="E3BB" b="FC B0"/>
+ <a u="E3BC" b="FC B1"/>
+ <a u="E3BD" b="FC B2"/>
+ <a u="E3BE" b="FC B3"/>
+ <a u="E3BF" b="FC B4"/>
+ <a u="E3C0" b="FC B5"/>
+ <a u="E3C1" b="FC B6"/>
+ <a u="E3C2" b="FC B7"/>
+ <a u="E3C3" b="FC B8"/>
+ <a u="E3C4" b="FC B9"/>
+ <a u="E3C5" b="FC BA"/>
+ <a u="E3C6" b="FC BB"/>
+ <a u="E3C7" b="FC BC"/>
+ <a u="E3C8" b="FC BD"/>
+ <a u="E3C9" b="FC BE"/>
+ <a u="E3CA" b="FC BF"/>
+ <a u="E3CB" b="FC C0"/>
+ <a u="E3CC" b="FC C1"/>
+ <a u="E3CD" b="FC C2"/>
+ <a u="E3CE" b="FC C3"/>
+ <a u="E3CF" b="FC C4"/>
+ <a u="E3D0" b="FC C5"/>
+ <a u="E3D1" b="FC C6"/>
+ <a u="E3D2" b="FC C7"/>
+ <a u="E3D3" b="FC C8"/>
+ <a u="E3D4" b="FC C9"/>
+ <a u="E3D5" b="FC CA"/>
+ <a u="E3D6" b="FC CB"/>
+ <a u="E3D7" b="FC CC"/>
+ <a u="E3D8" b="FC CD"/>
+ <a u="E3D9" b="FC CE"/>
+ <a u="E3DA" b="FC CF"/>
+ <a u="E3DB" b="FC D0"/>
+ <a u="E3DC" b="FC D1"/>
+ <a u="E3DD" b="FC D2"/>
+ <a u="E3DE" b="FC D3"/>
+ <a u="E3DF" b="FC D4"/>
+ <a u="E3E0" b="FC D5"/>
+ <a u="E3E1" b="FC D6"/>
+ <a u="E3E2" b="FC D7"/>
+ <a u="E3E3" b="FC D8"/>
+ <a u="E3E4" b="FC D9"/>
+ <a u="E3E5" b="FC DA"/>
+ <a u="E3E6" b="FC DB"/>
+ <a u="E3E7" b="FC DC"/>
+ <a u="E3E8" b="FC DD"/>
+ <a u="E3E9" b="FC DE"/>
+ <a u="E3EA" b="FC DF"/>
+ <a u="E3EB" b="FC E0"/>
+ <a u="E3EC" b="FC E1"/>
+ <a u="E3ED" b="FC E2"/>
+ <a u="E3EE" b="FC E3"/>
+ <a u="E3EF" b="FC E4"/>
+ <a u="E3F0" b="FC E5"/>
+ <a u="E3F1" b="FC E6"/>
+ <a u="E3F2" b="FC E7"/>
+ <a u="E3F3" b="FC E8"/>
+ <a u="E3F4" b="FC E9"/>
+ <a u="E3F5" b="FC EA"/>
+ <a u="E3F6" b="FC EB"/>
+ <a u="E3F7" b="FC EC"/>
+ <a u="E3F8" b="FC ED"/>
+ <a u="E3F9" b="FC EE"/>
+ <a u="E3FA" b="FC EF"/>
+ <a u="E3FB" b="FC F0"/>
+ <a u="E3FC" b="FC F1"/>
+ <a u="E3FD" b="FC F2"/>
+ <a u="E3FE" b="FC F3"/>
+ <a u="E3FF" b="FC F4"/>
+ <a u="E400" b="FC F5"/>
+ <a u="E401" b="FC F6"/>
+ <a u="E402" b="FC F7"/>
+ <a u="E403" b="FC F8"/>
+ <a u="E404" b="FC F9"/>
+ <a u="E405" b="FC FA"/>
+ <a u="E406" b="FC FB"/>
+ <a u="E407" b="FC FC"/>
+ <a u="E408" b="FC FD"/>
+ <a u="E409" b="FC FE"/>
+ <a u="E40A" b="FD A1"/>
+ <a u="E40B" b="FD A2"/>
+ <a u="E40C" b="FD A3"/>
+ <a u="E40D" b="FD A4"/>
+ <a u="E40E" b="FD A5"/>
+ <a u="E40F" b="FD A6"/>
+ <a u="E410" b="FD A7"/>
+ <a u="E411" b="FD A8"/>
+ <a u="E412" b="FD A9"/>
+ <a u="E413" b="FD AA"/>
+ <a u="E414" b="FD AB"/>
+ <a u="E415" b="FD AC"/>
+ <a u="E416" b="FD AD"/>
+ <a u="E417" b="FD AE"/>
+ <a u="E418" b="FD AF"/>
+ <a u="E419" b="FD B0"/>
+ <a u="E41A" b="FD B1"/>
+ <a u="E41B" b="FD B2"/>
+ <a u="E41C" b="FD B3"/>
+ <a u="E41D" b="FD B4"/>
+ <a u="E41E" b="FD B5"/>
+ <a u="E41F" b="FD B6"/>
+ <a u="E420" b="FD B7"/>
+ <a u="E421" b="FD B8"/>
+ <a u="E422" b="FD B9"/>
+ <a u="E423" b="FD BA"/>
+ <a u="E424" b="FD BB"/>
+ <a u="E425" b="FD BC"/>
+ <a u="E426" b="FD BD"/>
+ <a u="E427" b="FD BE"/>
+ <a u="E428" b="FD BF"/>
+ <a u="E429" b="FD C0"/>
+ <a u="E42A" b="FD C1"/>
+ <a u="E42B" b="FD C2"/>
+ <a u="E42C" b="FD C3"/>
+ <a u="E42D" b="FD C4"/>
+ <a u="E42E" b="FD C5"/>
+ <a u="E42F" b="FD C6"/>
+ <a u="E430" b="FD C7"/>
+ <a u="E431" b="FD C8"/>
+ <a u="E432" b="FD C9"/>
+ <a u="E433" b="FD CA"/>
+ <a u="E434" b="FD CB"/>
+ <a u="E435" b="FD CC"/>
+ <a u="E436" b="FD CD"/>
+ <a u="E437" b="FD CE"/>
+ <a u="E438" b="FD CF"/>
+ <a u="E439" b="FD D0"/>
+ <a u="E43A" b="FD D1"/>
+ <a u="E43B" b="FD D2"/>
+ <a u="E43C" b="FD D3"/>
+ <a u="E43D" b="FD D4"/>
+ <a u="E43E" b="FD D5"/>
+ <a u="E43F" b="FD D6"/>
+ <a u="E440" b="FD D7"/>
+ <a u="E441" b="FD D8"/>
+ <a u="E442" b="FD D9"/>
+ <a u="E443" b="FD DA"/>
+ <a u="E444" b="FD DB"/>
+ <a u="E445" b="FD DC"/>
+ <a u="E446" b="FD DD"/>
+ <a u="E447" b="FD DE"/>
+ <a u="E448" b="FD DF"/>
+ <a u="E449" b="FD E0"/>
+ <a u="E44A" b="FD E1"/>
+ <a u="E44B" b="FD E2"/>
+ <a u="E44C" b="FD E3"/>
+ <a u="E44D" b="FD E4"/>
+ <a u="E44E" b="FD E5"/>
+ <a u="E44F" b="FD E6"/>
+ <a u="E450" b="FD E7"/>
+ <a u="E451" b="FD E8"/>
+ <a u="E452" b="FD E9"/>
+ <a u="E453" b="FD EA"/>
+ <a u="E454" b="FD EB"/>
+ <a u="E455" b="FD EC"/>
+ <a u="E456" b="FD ED"/>
+ <a u="E457" b="FD EE"/>
+ <a u="E458" b="FD EF"/>
+ <a u="E459" b="FD F0"/>
+ <a u="E45A" b="FD F1"/>
+ <a u="E45B" b="FD F2"/>
+ <a u="E45C" b="FD F3"/>
+ <a u="E45D" b="FD F4"/>
+ <a u="E45E" b="FD F5"/>
+ <a u="E45F" b="FD F6"/>
+ <a u="E460" b="FD F7"/>
+ <a u="E461" b="FD F8"/>
+ <a u="E462" b="FD F9"/>
+ <a u="E463" b="FD FA"/>
+ <a u="E464" b="FD FB"/>
+ <a u="E465" b="FD FC"/>
+ <a u="E466" b="FD FD"/>
+ <a u="E467" b="FD FE"/>
+ <a u="E468" b="FE A1"/>
+ <a u="E469" b="FE A2"/>
+ <a u="E46A" b="FE A3"/>
+ <a u="E46B" b="FE A4"/>
+ <a u="E46C" b="FE A5"/>
+ <a u="E46D" b="FE A6"/>
+ <a u="E46E" b="FE A7"/>
+ <a u="E46F" b="FE A8"/>
+ <a u="E470" b="FE A9"/>
+ <a u="E471" b="FE AA"/>
+ <a u="E472" b="FE AB"/>
+ <a u="E473" b="FE AC"/>
+ <a u="E474" b="FE AD"/>
+ <a u="E475" b="FE AE"/>
+ <a u="E476" b="FE AF"/>
+ <a u="E477" b="FE B0"/>
+ <a u="E478" b="FE B1"/>
+ <a u="E479" b="FE B2"/>
+ <a u="E47A" b="FE B3"/>
+ <a u="E47B" b="FE B4"/>
+ <a u="E47C" b="FE B5"/>
+ <a u="E47D" b="FE B6"/>
+ <a u="E47E" b="FE B7"/>
+ <a u="E47F" b="FE B8"/>
+ <a u="E480" b="FE B9"/>
+ <a u="E481" b="FE BA"/>
+ <a u="E482" b="FE BB"/>
+ <a u="E483" b="FE BC"/>
+ <a u="E484" b="FE BD"/>
+ <a u="E485" b="FE BE"/>
+ <a u="E486" b="FE BF"/>
+ <a u="E487" b="FE C0"/>
+ <a u="E488" b="FE C1"/>
+ <a u="E489" b="FE C2"/>
+ <a u="E48A" b="FE C3"/>
+ <a u="E48B" b="FE C4"/>
+ <a u="E48C" b="FE C5"/>
+ <a u="E48D" b="FE C6"/>
+ <a u="E48E" b="FE C7"/>
+ <a u="E48F" b="FE C8"/>
+ <a u="E490" b="FE C9"/>
+ <a u="E491" b="FE CA"/>
+ <a u="E492" b="FE CB"/>
+ <a u="E493" b="FE CC"/>
+ <a u="E494" b="FE CD"/>
+ <a u="E495" b="FE CE"/>
+ <a u="E496" b="FE CF"/>
+ <a u="E497" b="FE D0"/>
+ <a u="E498" b="FE D1"/>
+ <a u="E499" b="FE D2"/>
+ <a u="E49A" b="FE D3"/>
+ <a u="E49B" b="FE D4"/>
+ <a u="E49C" b="FE D5"/>
+ <a u="E49D" b="FE D6"/>
+ <a u="E49E" b="FE D7"/>
+ <a u="E49F" b="FE D8"/>
+ <a u="E4A0" b="FE D9"/>
+ <a u="E4A1" b="FE DA"/>
+ <a u="E4A2" b="FE DB"/>
+ <a u="E4A3" b="FE DC"/>
+ <a u="E4A4" b="FE DD"/>
+ <a u="E4A5" b="FE DE"/>
+ <a u="E4A6" b="FE DF"/>
+ <a u="E4A7" b="FE E0"/>
+ <a u="E4A8" b="FE E1"/>
+ <a u="E4A9" b="FE E2"/>
+ <a u="E4AA" b="FE E3"/>
+ <a u="E4AB" b="FE E4"/>
+ <a u="E4AC" b="FE E5"/>
+ <a u="E4AD" b="FE E6"/>
+ <a u="E4AE" b="FE E7"/>
+ <a u="E4AF" b="FE E8"/>
+ <a u="E4B0" b="FE E9"/>
+ <a u="E4B1" b="FE EA"/>
+ <a u="E4B2" b="FE EB"/>
+ <a u="E4B3" b="FE EC"/>
+ <a u="E4B4" b="FE ED"/>
+ <a u="E4B5" b="FE EE"/>
+ <a u="E4B6" b="FE EF"/>
+ <a u="E4B7" b="FE F0"/>
+ <a u="E4B8" b="FE F1"/>
+ <a u="E4B9" b="FE F2"/>
+ <a u="E4BA" b="FE F3"/>
+ <a u="E4BB" b="FE F4"/>
+ <a u="E4BC" b="FE F5"/>
+ <a u="E4BD" b="FE F6"/>
+ <a u="E4BE" b="FE F7"/>
+ <a u="E4BF" b="FE F8"/>
+ <a u="E4C0" b="FE F9"/>
+ <a u="E4C1" b="FE FA"/>
+ <a u="E4C2" b="FE FB"/>
+ <a u="E4C3" b="FE FC"/>
+ <a u="E4C4" b="FE FD"/>
+ <a u="E4C5" b="FE FE"/>
+ <a u="E4C6" b="A1 40"/>
+ <a u="E4C7" b="A1 41"/>
+ <a u="E4C8" b="A1 42"/>
+ <a u="E4C9" b="A1 43"/>
+ <a u="E4CA" b="A1 44"/>
+ <a u="E4CB" b="A1 45"/>
+ <a u="E4CC" b="A1 46"/>
+ <a u="E4CD" b="A1 47"/>
+ <a u="E4CE" b="A1 48"/>
+ <a u="E4CF" b="A1 49"/>
+ <a u="E4D0" b="A1 4A"/>
+ <a u="E4D1" b="A1 4B"/>
+ <a u="E4D2" b="A1 4C"/>
+ <a u="E4D3" b="A1 4D"/>
+ <a u="E4D4" b="A1 4E"/>
+ <a u="E4D5" b="A1 4F"/>
+ <a u="E4D6" b="A1 50"/>
+ <a u="E4D7" b="A1 51"/>
+ <a u="E4D8" b="A1 52"/>
+ <a u="E4D9" b="A1 53"/>
+ <a u="E4DA" b="A1 54"/>
+ <a u="E4DB" b="A1 55"/>
+ <a u="E4DC" b="A1 56"/>
+ <a u="E4DD" b="A1 57"/>
+ <a u="E4DE" b="A1 58"/>
+ <a u="E4DF" b="A1 59"/>
+ <a u="E4E0" b="A1 5A"/>
+ <a u="E4E1" b="A1 5B"/>
+ <a u="E4E2" b="A1 5C"/>
+ <a u="E4E3" b="A1 5D"/>
+ <a u="E4E4" b="A1 5E"/>
+ <a u="E4E5" b="A1 5F"/>
+ <a u="E4E6" b="A1 60"/>
+ <a u="E4E7" b="A1 61"/>
+ <a u="E4E8" b="A1 62"/>
+ <a u="E4E9" b="A1 63"/>
+ <a u="E4EA" b="A1 64"/>
+ <a u="E4EB" b="A1 65"/>
+ <a u="E4EC" b="A1 66"/>
+ <a u="E4ED" b="A1 67"/>
+ <a u="E4EE" b="A1 68"/>
+ <a u="E4EF" b="A1 69"/>
+ <a u="E4F0" b="A1 6A"/>
+ <a u="E4F1" b="A1 6B"/>
+ <a u="E4F2" b="A1 6C"/>
+ <a u="E4F3" b="A1 6D"/>
+ <a u="E4F4" b="A1 6E"/>
+ <a u="E4F5" b="A1 6F"/>
+ <a u="E4F6" b="A1 70"/>
+ <a u="E4F7" b="A1 71"/>
+ <a u="E4F8" b="A1 72"/>
+ <a u="E4F9" b="A1 73"/>
+ <a u="E4FA" b="A1 74"/>
+ <a u="E4FB" b="A1 75"/>
+ <a u="E4FC" b="A1 76"/>
+ <a u="E4FD" b="A1 77"/>
+ <a u="E4FE" b="A1 78"/>
+ <a u="E4FF" b="A1 79"/>
+ <a u="E500" b="A1 7A"/>
+ <a u="E501" b="A1 7B"/>
+ <a u="E502" b="A1 7C"/>
+ <a u="E503" b="A1 7D"/>
+ <a u="E504" b="A1 7E"/>
+ <a u="E505" b="A1 80"/>
+ <a u="E506" b="A1 81"/>
+ <a u="E507" b="A1 82"/>
+ <a u="E508" b="A1 83"/>
+ <a u="E509" b="A1 84"/>
+ <a u="E50A" b="A1 85"/>
+ <a u="E50B" b="A1 86"/>
+ <a u="E50C" b="A1 87"/>
+ <a u="E50D" b="A1 88"/>
+ <a u="E50E" b="A1 89"/>
+ <a u="E50F" b="A1 8A"/>
+ <a u="E510" b="A1 8B"/>
+ <a u="E511" b="A1 8C"/>
+ <a u="E512" b="A1 8D"/>
+ <a u="E513" b="A1 8E"/>
+ <a u="E514" b="A1 8F"/>
+ <a u="E515" b="A1 90"/>
+ <a u="E516" b="A1 91"/>
+ <a u="E517" b="A1 92"/>
+ <a u="E518" b="A1 93"/>
+ <a u="E519" b="A1 94"/>
+ <a u="E51A" b="A1 95"/>
+ <a u="E51B" b="A1 96"/>
+ <a u="E51C" b="A1 97"/>
+ <a u="E51D" b="A1 98"/>
+ <a u="E51E" b="A1 99"/>
+ <a u="E51F" b="A1 9A"/>
+ <a u="E520" b="A1 9B"/>
+ <a u="E521" b="A1 9C"/>
+ <a u="E522" b="A1 9D"/>
+ <a u="E523" b="A1 9E"/>
+ <a u="E524" b="A1 9F"/>
+ <a u="E525" b="A1 A0"/>
+ <a u="E526" b="A2 40"/>
+ <a u="E527" b="A2 41"/>
+ <a u="E528" b="A2 42"/>
+ <a u="E529" b="A2 43"/>
+ <a u="E52A" b="A2 44"/>
+ <a u="E52B" b="A2 45"/>
+ <a u="E52C" b="A2 46"/>
+ <a u="E52D" b="A2 47"/>
+ <a u="E52E" b="A2 48"/>
+ <a u="E52F" b="A2 49"/>
+ <a u="E530" b="A2 4A"/>
+ <a u="E531" b="A2 4B"/>
+ <a u="E532" b="A2 4C"/>
+ <a u="E533" b="A2 4D"/>
+ <a u="E534" b="A2 4E"/>
+ <a u="E535" b="A2 4F"/>
+ <a u="E536" b="A2 50"/>
+ <a u="E537" b="A2 51"/>
+ <a u="E538" b="A2 52"/>
+ <a u="E539" b="A2 53"/>
+ <a u="E53A" b="A2 54"/>
+ <a u="E53B" b="A2 55"/>
+ <a u="E53C" b="A2 56"/>
+ <a u="E53D" b="A2 57"/>
+ <a u="E53E" b="A2 58"/>
+ <a u="E53F" b="A2 59"/>
+ <a u="E540" b="A2 5A"/>
+ <a u="E541" b="A2 5B"/>
+ <a u="E542" b="A2 5C"/>
+ <a u="E543" b="A2 5D"/>
+ <a u="E544" b="A2 5E"/>
+ <a u="E545" b="A2 5F"/>
+ <a u="E546" b="A2 60"/>
+ <a u="E547" b="A2 61"/>
+ <a u="E548" b="A2 62"/>
+ <a u="E549" b="A2 63"/>
+ <a u="E54A" b="A2 64"/>
+ <a u="E54B" b="A2 65"/>
+ <a u="E54C" b="A2 66"/>
+ <a u="E54D" b="A2 67"/>
+ <a u="E54E" b="A2 68"/>
+ <a u="E54F" b="A2 69"/>
+ <a u="E550" b="A2 6A"/>
+ <a u="E551" b="A2 6B"/>
+ <a u="E552" b="A2 6C"/>
+ <a u="E553" b="A2 6D"/>
+ <a u="E554" b="A2 6E"/>
+ <a u="E555" b="A2 6F"/>
+ <a u="E556" b="A2 70"/>
+ <a u="E557" b="A2 71"/>
+ <a u="E558" b="A2 72"/>
+ <a u="E559" b="A2 73"/>
+ <a u="E55A" b="A2 74"/>
+ <a u="E55B" b="A2 75"/>
+ <a u="E55C" b="A2 76"/>
+ <a u="E55D" b="A2 77"/>
+ <a u="E55E" b="A2 78"/>
+ <a u="E55F" b="A2 79"/>
+ <a u="E560" b="A2 7A"/>
+ <a u="E561" b="A2 7B"/>
+ <a u="E562" b="A2 7C"/>
+ <a u="E563" b="A2 7D"/>
+ <a u="E564" b="A2 7E"/>
+ <a u="E565" b="A2 80"/>
+ <a u="E566" b="A2 81"/>
+ <a u="E567" b="A2 82"/>
+ <a u="E568" b="A2 83"/>
+ <a u="E569" b="A2 84"/>
+ <a u="E56A" b="A2 85"/>
+ <a u="E56B" b="A2 86"/>
+ <a u="E56C" b="A2 87"/>
+ <a u="E56D" b="A2 88"/>
+ <a u="E56E" b="A2 89"/>
+ <a u="E56F" b="A2 8A"/>
+ <a u="E570" b="A2 8B"/>
+ <a u="E571" b="A2 8C"/>
+ <a u="E572" b="A2 8D"/>
+ <a u="E573" b="A2 8E"/>
+ <a u="E574" b="A2 8F"/>
+ <a u="E575" b="A2 90"/>
+ <a u="E576" b="A2 91"/>
+ <a u="E577" b="A2 92"/>
+ <a u="E578" b="A2 93"/>
+ <a u="E579" b="A2 94"/>
+ <a u="E57A" b="A2 95"/>
+ <a u="E57B" b="A2 96"/>
+ <a u="E57C" b="A2 97"/>
+ <a u="E57D" b="A2 98"/>
+ <a u="E57E" b="A2 99"/>
+ <a u="E57F" b="A2 9A"/>
+ <a u="E580" b="A2 9B"/>
+ <a u="E581" b="A2 9C"/>
+ <a u="E582" b="A2 9D"/>
+ <a u="E583" b="A2 9E"/>
+ <a u="E584" b="A2 9F"/>
+ <a u="E585" b="A2 A0"/>
+ <a u="E586" b="A3 40"/>
+ <a u="E587" b="A3 41"/>
+ <a u="E588" b="A3 42"/>
+ <a u="E589" b="A3 43"/>
+ <a u="E58A" b="A3 44"/>
+ <a u="E58B" b="A3 45"/>
+ <a u="E58C" b="A3 46"/>
+ <a u="E58D" b="A3 47"/>
+ <a u="E58E" b="A3 48"/>
+ <a u="E58F" b="A3 49"/>
+ <a u="E590" b="A3 4A"/>
+ <a u="E591" b="A3 4B"/>
+ <a u="E592" b="A3 4C"/>
+ <a u="E593" b="A3 4D"/>
+ <a u="E594" b="A3 4E"/>
+ <a u="E595" b="A3 4F"/>
+ <a u="E596" b="A3 50"/>
+ <a u="E597" b="A3 51"/>
+ <a u="E598" b="A3 52"/>
+ <a u="E599" b="A3 53"/>
+ <a u="E59A" b="A3 54"/>
+ <a u="E59B" b="A3 55"/>
+ <a u="E59C" b="A3 56"/>
+ <a u="E59D" b="A3 57"/>
+ <a u="E59E" b="A3 58"/>
+ <a u="E59F" b="A3 59"/>
+ <a u="E5A0" b="A3 5A"/>
+ <a u="E5A1" b="A3 5B"/>
+ <a u="E5A2" b="A3 5C"/>
+ <a u="E5A3" b="A3 5D"/>
+ <a u="E5A4" b="A3 5E"/>
+ <a u="E5A5" b="A3 5F"/>
+ <a u="E5A6" b="A3 60"/>
+ <a u="E5A7" b="A3 61"/>
+ <a u="E5A8" b="A3 62"/>
+ <a u="E5A9" b="A3 63"/>
+ <a u="E5AA" b="A3 64"/>
+ <a u="E5AB" b="A3 65"/>
+ <a u="E5AC" b="A3 66"/>
+ <a u="E5AD" b="A3 67"/>
+ <a u="E5AE" b="A3 68"/>
+ <a u="E5AF" b="A3 69"/>
+ <a u="E5B0" b="A3 6A"/>
+ <a u="E5B1" b="A3 6B"/>
+ <a u="E5B2" b="A3 6C"/>
+ <a u="E5B3" b="A3 6D"/>
+ <a u="E5B4" b="A3 6E"/>
+ <a u="E5B5" b="A3 6F"/>
+ <a u="E5B6" b="A3 70"/>
+ <a u="E5B7" b="A3 71"/>
+ <a u="E5B8" b="A3 72"/>
+ <a u="E5B9" b="A3 73"/>
+ <a u="E5BA" b="A3 74"/>
+ <a u="E5BB" b="A3 75"/>
+ <a u="E5BC" b="A3 76"/>
+ <a u="E5BD" b="A3 77"/>
+ <a u="E5BE" b="A3 78"/>
+ <a u="E5BF" b="A3 79"/>
+ <a u="E5C0" b="A3 7A"/>
+ <a u="E5C1" b="A3 7B"/>
+ <a u="E5C2" b="A3 7C"/>
+ <a u="E5C3" b="A3 7D"/>
+ <a u="E5C4" b="A3 7E"/>
+ <a u="E5C5" b="A3 80"/>
+ <a u="E5C6" b="A3 81"/>
+ <a u="E5C7" b="A3 82"/>
+ <a u="E5C8" b="A3 83"/>
+ <a u="E5C9" b="A3 84"/>
+ <a u="E5CA" b="A3 85"/>
+ <a u="E5CB" b="A3 86"/>
+ <a u="E5CC" b="A3 87"/>
+ <a u="E5CD" b="A3 88"/>
+ <a u="E5CE" b="A3 89"/>
+ <a u="E5CF" b="A3 8A"/>
+ <a u="E5D0" b="A3 8B"/>
+ <a u="E5D1" b="A3 8C"/>
+ <a u="E5D2" b="A3 8D"/>
+ <a u="E5D3" b="A3 8E"/>
+ <a u="E5D4" b="A3 8F"/>
+ <a u="E5D5" b="A3 90"/>
+ <a u="E5D6" b="A3 91"/>
+ <a u="E5D7" b="A3 92"/>
+ <a u="E5D8" b="A3 93"/>
+ <a u="E5D9" b="A3 94"/>
+ <a u="E5DA" b="A3 95"/>
+ <a u="E5DB" b="A3 96"/>
+ <a u="E5DC" b="A3 97"/>
+ <a u="E5DD" b="A3 98"/>
+ <a u="E5DE" b="A3 99"/>
+ <a u="E5DF" b="A3 9A"/>
+ <a u="E5E0" b="A3 9B"/>
+ <a u="E5E1" b="A3 9C"/>
+ <a u="E5E2" b="A3 9D"/>
+ <a u="E5E3" b="A3 9E"/>
+ <a u="E5E4" b="A3 9F"/>
+ <a u="E5E5" b="A3 A0"/>
+ <a u="E5E6" b="A4 40"/>
+ <a u="E5E7" b="A4 41"/>
+ <a u="E5E8" b="A4 42"/>
+ <a u="E5E9" b="A4 43"/>
+ <a u="E5EA" b="A4 44"/>
+ <a u="E5EB" b="A4 45"/>
+ <a u="E5EC" b="A4 46"/>
+ <a u="E5ED" b="A4 47"/>
+ <a u="E5EE" b="A4 48"/>
+ <a u="E5EF" b="A4 49"/>
+ <a u="E5F0" b="A4 4A"/>
+ <a u="E5F1" b="A4 4B"/>
+ <a u="E5F2" b="A4 4C"/>
+ <a u="E5F3" b="A4 4D"/>
+ <a u="E5F4" b="A4 4E"/>
+ <a u="E5F5" b="A4 4F"/>
+ <a u="E5F6" b="A4 50"/>
+ <a u="E5F7" b="A4 51"/>
+ <a u="E5F8" b="A4 52"/>
+ <a u="E5F9" b="A4 53"/>
+ <a u="E5FA" b="A4 54"/>
+ <a u="E5FB" b="A4 55"/>
+ <a u="E5FC" b="A4 56"/>
+ <a u="E5FD" b="A4 57"/>
+ <a u="E5FE" b="A4 58"/>
+ <a u="E5FF" b="A4 59"/>
+ <a u="E600" b="A4 5A"/>
+ <a u="E601" b="A4 5B"/>
+ <a u="E602" b="A4 5C"/>
+ <a u="E603" b="A4 5D"/>
+ <a u="E604" b="A4 5E"/>
+ <a u="E605" b="A4 5F"/>
+ <a u="E606" b="A4 60"/>
+ <a u="E607" b="A4 61"/>
+ <a u="E608" b="A4 62"/>
+ <a u="E609" b="A4 63"/>
+ <a u="E60A" b="A4 64"/>
+ <a u="E60B" b="A4 65"/>
+ <a u="E60C" b="A4 66"/>
+ <a u="E60D" b="A4 67"/>
+ <a u="E60E" b="A4 68"/>
+ <a u="E60F" b="A4 69"/>
+ <a u="E610" b="A4 6A"/>
+ <a u="E611" b="A4 6B"/>
+ <a u="E612" b="A4 6C"/>
+ <a u="E613" b="A4 6D"/>
+ <a u="E614" b="A4 6E"/>
+ <a u="E615" b="A4 6F"/>
+ <a u="E616" b="A4 70"/>
+ <a u="E617" b="A4 71"/>
+ <a u="E618" b="A4 72"/>
+ <a u="E619" b="A4 73"/>
+ <a u="E61A" b="A4 74"/>
+ <a u="E61B" b="A4 75"/>
+ <a u="E61C" b="A4 76"/>
+ <a u="E61D" b="A4 77"/>
+ <a u="E61E" b="A4 78"/>
+ <a u="E61F" b="A4 79"/>
+ <a u="E620" b="A4 7A"/>
+ <a u="E621" b="A4 7B"/>
+ <a u="E622" b="A4 7C"/>
+ <a u="E623" b="A4 7D"/>
+ <a u="E624" b="A4 7E"/>
+ <a u="E625" b="A4 80"/>
+ <a u="E626" b="A4 81"/>
+ <a u="E627" b="A4 82"/>
+ <a u="E628" b="A4 83"/>
+ <a u="E629" b="A4 84"/>
+ <a u="E62A" b="A4 85"/>
+ <a u="E62B" b="A4 86"/>
+ <a u="E62C" b="A4 87"/>
+ <a u="E62D" b="A4 88"/>
+ <a u="E62E" b="A4 89"/>
+ <a u="E62F" b="A4 8A"/>
+ <a u="E630" b="A4 8B"/>
+ <a u="E631" b="A4 8C"/>
+ <a u="E632" b="A4 8D"/>
+ <a u="E633" b="A4 8E"/>
+ <a u="E634" b="A4 8F"/>
+ <a u="E635" b="A4 90"/>
+ <a u="E636" b="A4 91"/>
+ <a u="E637" b="A4 92"/>
+ <a u="E638" b="A4 93"/>
+ <a u="E639" b="A4 94"/>
+ <a u="E63A" b="A4 95"/>
+ <a u="E63B" b="A4 96"/>
+ <a u="E63C" b="A4 97"/>
+ <a u="E63D" b="A4 98"/>
+ <a u="E63E" b="A4 99"/>
+ <a u="E63F" b="A4 9A"/>
+ <a u="E640" b="A4 9B"/>
+ <a u="E641" b="A4 9C"/>
+ <a u="E642" b="A4 9D"/>
+ <a u="E643" b="A4 9E"/>
+ <a u="E644" b="A4 9F"/>
+ <a u="E645" b="A4 A0"/>
+ <a u="E646" b="A5 40"/>
+ <a u="E647" b="A5 41"/>
+ <a u="E648" b="A5 42"/>
+ <a u="E649" b="A5 43"/>
+ <a u="E64A" b="A5 44"/>
+ <a u="E64B" b="A5 45"/>
+ <a u="E64C" b="A5 46"/>
+ <a u="E64D" b="A5 47"/>
+ <a u="E64E" b="A5 48"/>
+ <a u="E64F" b="A5 49"/>
+ <a u="E650" b="A5 4A"/>
+ <a u="E651" b="A5 4B"/>
+ <a u="E652" b="A5 4C"/>
+ <a u="E653" b="A5 4D"/>
+ <a u="E654" b="A5 4E"/>
+ <a u="E655" b="A5 4F"/>
+ <a u="E656" b="A5 50"/>
+ <a u="E657" b="A5 51"/>
+ <a u="E658" b="A5 52"/>
+ <a u="E659" b="A5 53"/>
+ <a u="E65A" b="A5 54"/>
+ <a u="E65B" b="A5 55"/>
+ <a u="E65C" b="A5 56"/>
+ <a u="E65D" b="A5 57"/>
+ <a u="E65E" b="A5 58"/>
+ <a u="E65F" b="A5 59"/>
+ <a u="E660" b="A5 5A"/>
+ <a u="E661" b="A5 5B"/>
+ <a u="E662" b="A5 5C"/>
+ <a u="E663" b="A5 5D"/>
+ <a u="E664" b="A5 5E"/>
+ <a u="E665" b="A5 5F"/>
+ <a u="E666" b="A5 60"/>
+ <a u="E667" b="A5 61"/>
+ <a u="E668" b="A5 62"/>
+ <a u="E669" b="A5 63"/>
+ <a u="E66A" b="A5 64"/>
+ <a u="E66B" b="A5 65"/>
+ <a u="E66C" b="A5 66"/>
+ <a u="E66D" b="A5 67"/>
+ <a u="E66E" b="A5 68"/>
+ <a u="E66F" b="A5 69"/>
+ <a u="E670" b="A5 6A"/>
+ <a u="E671" b="A5 6B"/>
+ <a u="E672" b="A5 6C"/>
+ <a u="E673" b="A5 6D"/>
+ <a u="E674" b="A5 6E"/>
+ <a u="E675" b="A5 6F"/>
+ <a u="E676" b="A5 70"/>
+ <a u="E677" b="A5 71"/>
+ <a u="E678" b="A5 72"/>
+ <a u="E679" b="A5 73"/>
+ <a u="E67A" b="A5 74"/>
+ <a u="E67B" b="A5 75"/>
+ <a u="E67C" b="A5 76"/>
+ <a u="E67D" b="A5 77"/>
+ <a u="E67E" b="A5 78"/>
+ <a u="E67F" b="A5 79"/>
+ <a u="E680" b="A5 7A"/>
+ <a u="E681" b="A5 7B"/>
+ <a u="E682" b="A5 7C"/>
+ <a u="E683" b="A5 7D"/>
+ <a u="E684" b="A5 7E"/>
+ <a u="E685" b="A5 80"/>
+ <a u="E686" b="A5 81"/>
+ <a u="E687" b="A5 82"/>
+ <a u="E688" b="A5 83"/>
+ <a u="E689" b="A5 84"/>
+ <a u="E68A" b="A5 85"/>
+ <a u="E68B" b="A5 86"/>
+ <a u="E68C" b="A5 87"/>
+ <a u="E68D" b="A5 88"/>
+ <a u="E68E" b="A5 89"/>
+ <a u="E68F" b="A5 8A"/>
+ <a u="E690" b="A5 8B"/>
+ <a u="E691" b="A5 8C"/>
+ <a u="E692" b="A5 8D"/>
+ <a u="E693" b="A5 8E"/>
+ <a u="E694" b="A5 8F"/>
+ <a u="E695" b="A5 90"/>
+ <a u="E696" b="A5 91"/>
+ <a u="E697" b="A5 92"/>
+ <a u="E698" b="A5 93"/>
+ <a u="E699" b="A5 94"/>
+ <a u="E69A" b="A5 95"/>
+ <a u="E69B" b="A5 96"/>
+ <a u="E69C" b="A5 97"/>
+ <a u="E69D" b="A5 98"/>
+ <a u="E69E" b="A5 99"/>
+ <a u="E69F" b="A5 9A"/>
+ <a u="E6A0" b="A5 9B"/>
+ <a u="E6A1" b="A5 9C"/>
+ <a u="E6A2" b="A5 9D"/>
+ <a u="E6A3" b="A5 9E"/>
+ <a u="E6A4" b="A5 9F"/>
+ <a u="E6A5" b="A5 A0"/>
+ <a u="E6A6" b="A6 40"/>
+ <a u="E6A7" b="A6 41"/>
+ <a u="E6A8" b="A6 42"/>
+ <a u="E6A9" b="A6 43"/>
+ <a u="E6AA" b="A6 44"/>
+ <a u="E6AB" b="A6 45"/>
+ <a u="E6AC" b="A6 46"/>
+ <a u="E6AD" b="A6 47"/>
+ <a u="E6AE" b="A6 48"/>
+ <a u="E6AF" b="A6 49"/>
+ <a u="E6B0" b="A6 4A"/>
+ <a u="E6B1" b="A6 4B"/>
+ <a u="E6B2" b="A6 4C"/>
+ <a u="E6B3" b="A6 4D"/>
+ <a u="E6B4" b="A6 4E"/>
+ <a u="E6B5" b="A6 4F"/>
+ <a u="E6B6" b="A6 50"/>
+ <a u="E6B7" b="A6 51"/>
+ <a u="E6B8" b="A6 52"/>
+ <a u="E6B9" b="A6 53"/>
+ <a u="E6BA" b="A6 54"/>
+ <a u="E6BB" b="A6 55"/>
+ <a u="E6BC" b="A6 56"/>
+ <a u="E6BD" b="A6 57"/>
+ <a u="E6BE" b="A6 58"/>
+ <a u="E6BF" b="A6 59"/>
+ <a u="E6C0" b="A6 5A"/>
+ <a u="E6C1" b="A6 5B"/>
+ <a u="E6C2" b="A6 5C"/>
+ <a u="E6C3" b="A6 5D"/>
+ <a u="E6C4" b="A6 5E"/>
+ <a u="E6C5" b="A6 5F"/>
+ <a u="E6C6" b="A6 60"/>
+ <a u="E6C7" b="A6 61"/>
+ <a u="E6C8" b="A6 62"/>
+ <a u="E6C9" b="A6 63"/>
+ <a u="E6CA" b="A6 64"/>
+ <a u="E6CB" b="A6 65"/>
+ <a u="E6CC" b="A6 66"/>
+ <a u="E6CD" b="A6 67"/>
+ <a u="E6CE" b="A6 68"/>
+ <a u="E6CF" b="A6 69"/>
+ <a u="E6D0" b="A6 6A"/>
+ <a u="E6D1" b="A6 6B"/>
+ <a u="E6D2" b="A6 6C"/>
+ <a u="E6D3" b="A6 6D"/>
+ <a u="E6D4" b="A6 6E"/>
+ <a u="E6D5" b="A6 6F"/>
+ <a u="E6D6" b="A6 70"/>
+ <a u="E6D7" b="A6 71"/>
+ <a u="E6D8" b="A6 72"/>
+ <a u="E6D9" b="A6 73"/>
+ <a u="E6DA" b="A6 74"/>
+ <a u="E6DB" b="A6 75"/>
+ <a u="E6DC" b="A6 76"/>
+ <a u="E6DD" b="A6 77"/>
+ <a u="E6DE" b="A6 78"/>
+ <a u="E6DF" b="A6 79"/>
+ <a u="E6E0" b="A6 7A"/>
+ <a u="E6E1" b="A6 7B"/>
+ <a u="E6E2" b="A6 7C"/>
+ <a u="E6E3" b="A6 7D"/>
+ <a u="E6E4" b="A6 7E"/>
+ <a u="E6E5" b="A6 80"/>
+ <a u="E6E6" b="A6 81"/>
+ <a u="E6E7" b="A6 82"/>
+ <a u="E6E8" b="A6 83"/>
+ <a u="E6E9" b="A6 84"/>
+ <a u="E6EA" b="A6 85"/>
+ <a u="E6EB" b="A6 86"/>
+ <a u="E6EC" b="A6 87"/>
+ <a u="E6ED" b="A6 88"/>
+ <a u="E6EE" b="A6 89"/>
+ <a u="E6EF" b="A6 8A"/>
+ <a u="E6F0" b="A6 8B"/>
+ <a u="E6F1" b="A6 8C"/>
+ <a u="E6F2" b="A6 8D"/>
+ <a u="E6F3" b="A6 8E"/>
+ <a u="E6F4" b="A6 8F"/>
+ <a u="E6F5" b="A6 90"/>
+ <a u="E6F6" b="A6 91"/>
+ <a u="E6F7" b="A6 92"/>
+ <a u="E6F8" b="A6 93"/>
+ <a u="E6F9" b="A6 94"/>
+ <a u="E6FA" b="A6 95"/>
+ <a u="E6FB" b="A6 96"/>
+ <a u="E6FC" b="A6 97"/>
+ <a u="E6FD" b="A6 98"/>
+ <a u="E6FE" b="A6 99"/>
+ <a u="E6FF" b="A6 9A"/>
+ <a u="E700" b="A6 9B"/>
+ <a u="E701" b="A6 9C"/>
+ <a u="E702" b="A6 9D"/>
+ <a u="E703" b="A6 9E"/>
+ <a u="E704" b="A6 9F"/>
+ <a u="E705" b="A6 A0"/>
+ <a u="E706" b="A7 40"/>
+ <a u="E707" b="A7 41"/>
+ <a u="E708" b="A7 42"/>
+ <a u="E709" b="A7 43"/>
+ <a u="E70A" b="A7 44"/>
+ <a u="E70B" b="A7 45"/>
+ <a u="E70C" b="A7 46"/>
+ <a u="E70D" b="A7 47"/>
+ <a u="E70E" b="A7 48"/>
+ <a u="E70F" b="A7 49"/>
+ <a u="E710" b="A7 4A"/>
+ <a u="E711" b="A7 4B"/>
+ <a u="E712" b="A7 4C"/>
+ <a u="E713" b="A7 4D"/>
+ <a u="E714" b="A7 4E"/>
+ <a u="E715" b="A7 4F"/>
+ <a u="E716" b="A7 50"/>
+ <a u="E717" b="A7 51"/>
+ <a u="E718" b="A7 52"/>
+ <a u="E719" b="A7 53"/>
+ <a u="E71A" b="A7 54"/>
+ <a u="E71B" b="A7 55"/>
+ <a u="E71C" b="A7 56"/>
+ <a u="E71D" b="A7 57"/>
+ <a u="E71E" b="A7 58"/>
+ <a u="E71F" b="A7 59"/>
+ <a u="E720" b="A7 5A"/>
+ <a u="E721" b="A7 5B"/>
+ <a u="E722" b="A7 5C"/>
+ <a u="E723" b="A7 5D"/>
+ <a u="E724" b="A7 5E"/>
+ <a u="E725" b="A7 5F"/>
+ <a u="E726" b="A7 60"/>
+ <a u="E727" b="A7 61"/>
+ <a u="E728" b="A7 62"/>
+ <a u="E729" b="A7 63"/>
+ <a u="E72A" b="A7 64"/>
+ <a u="E72B" b="A7 65"/>
+ <a u="E72C" b="A7 66"/>
+ <a u="E72D" b="A7 67"/>
+ <a u="E72E" b="A7 68"/>
+ <a u="E72F" b="A7 69"/>
+ <a u="E730" b="A7 6A"/>
+ <a u="E731" b="A7 6B"/>
+ <a u="E732" b="A7 6C"/>
+ <a u="E733" b="A7 6D"/>
+ <a u="E734" b="A7 6E"/>
+ <a u="E735" b="A7 6F"/>
+ <a u="E736" b="A7 70"/>
+ <a u="E737" b="A7 71"/>
+ <a u="E738" b="A7 72"/>
+ <a u="E739" b="A7 73"/>
+ <a u="E73A" b="A7 74"/>
+ <a u="E73B" b="A7 75"/>
+ <a u="E73C" b="A7 76"/>
+ <a u="E73D" b="A7 77"/>
+ <a u="E73E" b="A7 78"/>
+ <a u="E73F" b="A7 79"/>
+ <a u="E740" b="A7 7A"/>
+ <a u="E741" b="A7 7B"/>
+ <a u="E742" b="A7 7C"/>
+ <a u="E743" b="A7 7D"/>
+ <a u="E744" b="A7 7E"/>
+ <a u="E745" b="A7 80"/>
+ <a u="E746" b="A7 81"/>
+ <a u="E747" b="A7 82"/>
+ <a u="E748" b="A7 83"/>
+ <a u="E749" b="A7 84"/>
+ <a u="E74A" b="A7 85"/>
+ <a u="E74B" b="A7 86"/>
+ <a u="E74C" b="A7 87"/>
+ <a u="E74D" b="A7 88"/>
+ <a u="E74E" b="A7 89"/>
+ <a u="E74F" b="A7 8A"/>
+ <a u="E750" b="A7 8B"/>
+ <a u="E751" b="A7 8C"/>
+ <a u="E752" b="A7 8D"/>
+ <a u="E753" b="A7 8E"/>
+ <a u="E754" b="A7 8F"/>
+ <a u="E755" b="A7 90"/>
+ <a u="E756" b="A7 91"/>
+ <a u="E757" b="A7 92"/>
+ <a u="E758" b="A7 93"/>
+ <a u="E759" b="A7 94"/>
+ <a u="E75A" b="A7 95"/>
+ <a u="E75B" b="A7 96"/>
+ <a u="E75C" b="A7 97"/>
+ <a u="E75D" b="A7 98"/>
+ <a u="E75E" b="A7 99"/>
+ <a u="E75F" b="A7 9A"/>
+ <a u="E760" b="A7 9B"/>
+ <a u="E761" b="A7 9C"/>
+ <a u="E762" b="A7 9D"/>
+ <a u="E763" b="A7 9E"/>
+ <a u="E764" b="A7 9F"/>
+ <a u="E765" b="A7 A0"/>
+ <a u="E766" b="A2 AB"/>
+ <a u="E767" b="A2 AC"/>
+ <a u="E768" b="A2 AD"/>
+ <a u="E769" b="A2 AE"/>
+ <a u="E76A" b="A2 AF"/>
+ <a u="E76B" b="A2 B0"/>
+ <a u="E76C" b="83 36 C7 39"/>
+ <a u="E76D" b="A2 E4"/>
+ <a u="E76E" b="A2 EF"/>
+ <a u="E76F" b="A2 F0"/>
+ <a u="E770" b="A2 FD"/>
+ <a u="E771" b="A2 FE"/>
+ <a u="E772" b="A4 F4"/>
+ <a u="E773" b="A4 F5"/>
+ <a u="E774" b="A4 F6"/>
+ <a u="E775" b="A4 F7"/>
+ <a u="E776" b="A4 F8"/>
+ <a u="E777" b="A4 F9"/>
+ <a u="E778" b="A4 FA"/>
+ <a u="E779" b="A4 FB"/>
+ <a u="E77A" b="A4 FC"/>
+ <a u="E77B" b="A4 FD"/>
+ <a u="E77C" b="A4 FE"/>
+ <a u="E77D" b="A5 F7"/>
+ <a u="E77E" b="A5 F8"/>
+ <a u="E77F" b="A5 F9"/>
+ <a u="E780" b="A5 FA"/>
+ <a u="E781" b="A5 FB"/>
+ <a u="E782" b="A5 FC"/>
+ <a u="E783" b="A5 FD"/>
+ <a u="E784" b="A5 FE"/>
+ <a u="E785" b="A6 B9"/>
+ <a u="E786" b="A6 BA"/>
+ <a u="E787" b="A6 BB"/>
+ <a u="E788" b="A6 BC"/>
+ <a u="E789" b="A6 BD"/>
+ <a u="E78A" b="A6 BE"/>
+ <a u="E78B" b="A6 BF"/>
+ <a u="E78C" b="A6 C0"/>
+ <a u="E78D" b="A6 D9"/>
+ <a u="E78E" b="A6 DA"/>
+ <a u="E78F" b="A6 DB"/>
+ <a u="E790" b="A6 DC"/>
+ <a u="E791" b="A6 DD"/>
+ <a u="E792" b="A6 DE"/>
+ <a u="E793" b="A6 DF"/>
+ <a u="E794" b="A6 EC"/>
+ <a u="E795" b="A6 ED"/>
+ <a u="E796" b="A6 F3"/>
+ <a u="E797" b="A6 F6"/>
+ <a u="E798" b="A6 F7"/>
+ <a u="E799" b="A6 F8"/>
+ <a u="E79A" b="A6 F9"/>
+ <a u="E79B" b="A6 FA"/>
+ <a u="E79C" b="A6 FB"/>
+ <a u="E79D" b="A6 FC"/>
+ <a u="E79E" b="A6 FD"/>
+ <a u="E79F" b="A6 FE"/>
+ <a u="E7A0" b="A7 C2"/>
+ <a u="E7A1" b="A7 C3"/>
+ <a u="E7A2" b="A7 C4"/>
+ <a u="E7A3" b="A7 C5"/>
+ <a u="E7A4" b="A7 C6"/>
+ <a u="E7A5" b="A7 C7"/>
+ <a u="E7A6" b="A7 C8"/>
+ <a u="E7A7" b="A7 C9"/>
+ <a u="E7A8" b="A7 CA"/>
+ <a u="E7A9" b="A7 CB"/>
+ <a u="E7AA" b="A7 CC"/>
+ <a u="E7AB" b="A7 CD"/>
+ <a u="E7AC" b="A7 CE"/>
+ <a u="E7AD" b="A7 CF"/>
+ <a u="E7AE" b="A7 D0"/>
+ <a u="E7AF" b="A7 F2"/>
+ <a u="E7B0" b="A7 F3"/>
+ <a u="E7B1" b="A7 F4"/>
+ <a u="E7B2" b="A7 F5"/>
+ <a u="E7B3" b="A7 F6"/>
+ <a u="E7B4" b="A7 F7"/>
+ <a u="E7B5" b="A7 F8"/>
+ <a u="E7B6" b="A7 F9"/>
+ <a u="E7B7" b="A7 FA"/>
+ <a u="E7B8" b="A7 FB"/>
+ <a u="E7B9" b="A7 FC"/>
+ <a u="E7BA" b="A7 FD"/>
+ <a u="E7BB" b="A7 FE"/>
+ <a u="E7BC" b="A8 96"/>
+ <a u="E7BD" b="A8 97"/>
+ <a u="E7BE" b="A8 98"/>
+ <a u="E7BF" b="A8 99"/>
+ <a u="E7C0" b="A8 9A"/>
+ <a u="E7C1" b="A8 9B"/>
+ <a u="E7C2" b="A8 9C"/>
+ <a u="E7C3" b="A8 9D"/>
+ <a u="E7C4" b="A8 9E"/>
+ <a u="E7C5" b="A8 9F"/>
+ <a u="E7C6" b="A8 A0"/>
+ <a u="E7C7" b="A8 BC"/>
+ <a u="E7C8" b="83 36 C8 30"/>
+ <a u="E7C9" b="A8 C1"/>
+ <a u="E7CA" b="A8 C2"/>
+ <a u="E7CB" b="A8 C3"/>
+ <a u="E7CC" b="A8 C4"/>
+ <a u="E7CD" b="A8 EA"/>
+ <a u="E7CE" b="A8 EB"/>
+ <a u="E7CF" b="A8 EC"/>
+ <a u="E7D0" b="A8 ED"/>
+ <a u="E7D1" b="A8 EE"/>
+ <a u="E7D2" b="A8 EF"/>
+ <a u="E7D3" b="A8 F0"/>
+ <a u="E7D4" b="A8 F1"/>
+ <a u="E7D5" b="A8 F2"/>
+ <a u="E7D6" b="A8 F3"/>
+ <a u="E7D7" b="A8 F4"/>
+ <a u="E7D8" b="A8 F5"/>
+ <a u="E7D9" b="A8 F6"/>
+ <a u="E7DA" b="A8 F7"/>
+ <a u="E7DB" b="A8 F8"/>
+ <a u="E7DC" b="A8 F9"/>
+ <a u="E7DD" b="A8 FA"/>
+ <a u="E7DE" b="A8 FB"/>
+ <a u="E7DF" b="A8 FC"/>
+ <a u="E7E0" b="A8 FD"/>
+ <a u="E7E1" b="A8 FE"/>
+ <a u="E7E2" b="A9 58"/>
+ <a u="E7E3" b="A9 5B"/>
+ <a u="E7E4" b="A9 5D"/>
+ <a u="E7E5" b="A9 5E"/>
+ <a u="E7E6" b="A9 5F"/>
+ <a u="E7E7" b="83 36 C8 31"/>
+ <a u="E7E8" b="83 36 C8 32"/>
+ <a u="E7E9" b="83 36 C8 33"/>
+ <a u="E7EA" b="83 36 C8 34"/>
+ <a u="E7EB" b="83 36 C8 35"/>
+ <a u="E7EC" b="83 36 C8 36"/>
+ <a u="E7ED" b="83 36 C8 37"/>
+ <a u="E7EE" b="83 36 C8 38"/>
+ <a u="E7EF" b="83 36 C8 39"/>
+ <a u="E7F0" b="83 36 C9 30"/>
+ <a u="E7F1" b="83 36 C9 31"/>
+ <a u="E7F2" b="83 36 C9 32"/>
+ <a u="E7F3" b="83 36 C9 33"/>
+ <a u="E7F4" b="A9 97"/>
+ <a u="E7F5" b="A9 98"/>
+ <a u="E7F6" b="A9 99"/>
+ <a u="E7F7" b="A9 9A"/>
+ <a u="E7F8" b="A9 9B"/>
+ <a u="E7F9" b="A9 9C"/>
+ <a u="E7FA" b="A9 9D"/>
+ <a u="E7FB" b="A9 9E"/>
+ <a u="E7FC" b="A9 9F"/>
+ <a u="E7FD" b="A9 A0"/>
+ <a u="E7FE" b="A9 A1"/>
+ <a u="E7FF" b="A9 A2"/>
+ <a u="E800" b="A9 A3"/>
+ <a u="E801" b="A9 F0"/>
+ <a u="E802" b="A9 F1"/>
+ <a u="E803" b="A9 F2"/>
+ <a u="E804" b="A9 F3"/>
+ <a u="E805" b="A9 F4"/>
+ <a u="E806" b="A9 F5"/>
+ <a u="E807" b="A9 F6"/>
+ <a u="E808" b="A9 F7"/>
+ <a u="E809" b="A9 F8"/>
+ <a u="E80A" b="A9 F9"/>
+ <a u="E80B" b="A9 FA"/>
+ <a u="E80C" b="A9 FB"/>
+ <a u="E80D" b="A9 FC"/>
+ <a u="E80E" b="A9 FD"/>
+ <a u="E80F" b="A9 FE"/>
+ <a u="E810" b="D7 FA"/>
+ <a u="E811" b="D7 FB"/>
+ <a u="E812" b="D7 FC"/>
+ <a u="E813" b="D7 FD"/>
+ <a u="E814" b="D7 FE"/>
+ <a u="E815" b="83 36 C9 34"/>
+ <a u="E816" b="FE 51"/>
+ <a u="E817" b="FE 52"/>
+ <a u="E818" b="FE 53"/>
+ <a u="E819" b="83 36 C9 35"/>
+ <a u="E81A" b="83 36 C9 36"/>
+ <a u="E81B" b="83 36 C9 37"/>
+ <a u="E81C" b="83 36 C9 38"/>
+ <a u="E81D" b="83 36 C9 39"/>
+ <a u="E81E" b="FE 59"/>
+ <a u="E81F" b="83 36 CA 30"/>
+ <a u="E820" b="83 36 CA 31"/>
+ <a u="E821" b="83 36 CA 32"/>
+ <a u="E822" b="83 36 CA 33"/>
+ <a u="E823" b="83 36 CA 34"/>
+ <a u="E824" b="83 36 CA 35"/>
+ <a u="E825" b="83 36 CA 36"/>
+ <a u="E826" b="FE 61"/>
+ <a u="E827" b="83 36 CA 37"/>
+ <a u="E828" b="83 36 CA 38"/>
+ <a u="E829" b="83 36 CA 39"/>
+ <a u="E82A" b="83 36 CB 30"/>
+ <a u="E82B" b="FE 66"/>
+ <a u="E82C" b="FE 67"/>
+ <a u="E82D" b="83 36 CB 31"/>
+ <a u="E82E" b="83 36 CB 32"/>
+ <a u="E82F" b="83 36 CB 33"/>
+ <a u="E830" b="83 36 CB 34"/>
+ <a u="E831" b="FE 6C"/>
+ <a u="E832" b="FE 6D"/>
+ <a u="E833" b="83 36 CB 35"/>
+ <a u="E834" b="83 36 CB 36"/>
+ <a u="E835" b="83 36 CB 37"/>
+ <a u="E836" b="83 36 CB 38"/>
+ <a u="E837" b="83 36 CB 39"/>
+ <a u="E838" b="83 36 CC 30"/>
+ <a u="E839" b="83 36 CC 31"/>
+ <a u="E83A" b="83 36 CC 32"/>
+ <a u="E83B" b="FE 76"/>
+ <a u="E83C" b="83 36 CC 33"/>
+ <a u="E83D" b="83 36 CC 34"/>
+ <a u="E83E" b="83 36 CC 35"/>
+ <a u="E83F" b="83 36 CC 36"/>
+ <a u="E840" b="83 36 CC 37"/>
+ <a u="E841" b="83 36 CC 38"/>
+ <a u="E842" b="83 36 CC 39"/>
+ <a u="E843" b="FE 7E"/>
+ <a u="E844" b="83 36 CD 30"/>
+ <a u="E845" b="83 36 CD 31"/>
+ <a u="E846" b="83 36 CD 32"/>
+ <a u="E847" b="83 36 CD 33"/>
+ <a u="E848" b="83 36 CD 34"/>
+ <a u="E849" b="83 36 CD 35"/>
+ <a u="E84A" b="83 36 CD 36"/>
+ <a u="E84B" b="83 36 CD 37"/>
+ <a u="E84C" b="83 36 CD 38"/>
+ <a u="E84D" b="83 36 CD 39"/>
+ <a u="E84E" b="83 36 CE 30"/>
+ <a u="E84F" b="83 36 CE 31"/>
+ <a u="E850" b="83 36 CE 32"/>
+ <a u="E851" b="83 36 CE 33"/>
+ <a u="E852" b="83 36 CE 34"/>
+ <a u="E853" b="83 36 CE 35"/>
+ <a u="E854" b="FE 90"/>
+ <a u="E855" b="FE 91"/>
+ <a u="E856" b="83 36 CE 36"/>
+ <a u="E857" b="83 36 CE 37"/>
+ <a u="E858" b="83 36 CE 38"/>
+ <a u="E859" b="83 36 CE 39"/>
+ <a u="E85A" b="83 36 CF 30"/>
+ <a u="E85B" b="83 36 CF 31"/>
+ <a u="E85C" b="83 36 CF 32"/>
+ <a u="E85D" b="83 36 CF 33"/>
+ <a u="E85E" b="83 36 CF 34"/>
+ <a u="E85F" b="83 36 CF 35"/>
+ <a u="E860" b="83 36 CF 36"/>
+ <a u="E861" b="83 36 CF 37"/>
+ <a u="E862" b="83 36 CF 38"/>
+ <a u="E863" b="83 36 CF 39"/>
+ <a u="E864" b="FE A0"/>
+ <a u="F92C" b="FD 9C"/>
+ <a u="F92D" b="84 30 85 35"/>
+ <a u="F92E" b="84 30 85 36"/>
+ <a u="F92F" b="84 30 85 37"/>
+ <a u="F930" b="84 30 85 38"/>
+ <a u="F931" b="84 30 85 39"/>
+ <a u="F932" b="84 30 86 30"/>
+ <a u="F933" b="84 30 86 31"/>
+ <a u="F934" b="84 30 86 32"/>
+ <a u="F935" b="84 30 86 33"/>
+ <a u="F936" b="84 30 86 34"/>
+ <a u="F937" b="84 30 86 35"/>
+ <a u="F938" b="84 30 86 36"/>
+ <a u="F939" b="84 30 86 37"/>
+ <a u="F93A" b="84 30 86 38"/>
+ <a u="F93B" b="84 30 86 39"/>
+ <a u="F93C" b="84 30 87 30"/>
+ <a u="F93D" b="84 30 87 31"/>
+ <a u="F93E" b="84 30 87 32"/>
+ <a u="F93F" b="84 30 87 33"/>
+ <a u="F940" b="84 30 87 34"/>
+ <a u="F941" b="84 30 87 35"/>
+ <a u="F942" b="84 30 87 36"/>
+ <a u="F943" b="84 30 87 37"/>
+ <a u="F944" b="84 30 87 38"/>
+ <a u="F945" b="84 30 87 39"/>
+ <a u="F946" b="84 30 88 30"/>
+ <a u="F947" b="84 30 88 31"/>
+ <a u="F948" b="84 30 88 32"/>
+ <a u="F949" b="84 30 88 33"/>
+ <a u="F94A" b="84 30 88 34"/>
+ <a u="F94B" b="84 30 88 35"/>
+ <a u="F94C" b="84 30 88 36"/>
+ <a u="F94D" b="84 30 88 37"/>
+ <a u="F94E" b="84 30 88 38"/>
+ <a u="F94F" b="84 30 88 39"/>
+ <a u="F950" b="84 30 89 30"/>
+ <a u="F951" b="84 30 89 31"/>
+ <a u="F952" b="84 30 89 32"/>
+ <a u="F953" b="84 30 89 33"/>
+ <a u="F954" b="84 30 89 34"/>
+ <a u="F955" b="84 30 89 35"/>
+ <a u="F956" b="84 30 89 36"/>
+ <a u="F957" b="84 30 89 37"/>
+ <a u="F958" b="84 30 89 38"/>
+ <a u="F959" b="84 30 89 39"/>
+ <a u="F95A" b="84 30 8A 30"/>
+ <a u="F95B" b="84 30 8A 31"/>
+ <a u="F95C" b="84 30 8A 32"/>
+ <a u="F95D" b="84 30 8A 33"/>
+ <a u="F95E" b="84 30 8A 34"/>
+ <a u="F95F" b="84 30 8A 35"/>
+ <a u="F960" b="84 30 8A 36"/>
+ <a u="F961" b="84 30 8A 37"/>
+ <a u="F962" b="84 30 8A 38"/>
+ <a u="F963" b="84 30 8A 39"/>
+ <a u="F964" b="84 30 8B 30"/>
+ <a u="F965" b="84 30 8B 31"/>
+ <a u="F966" b="84 30 8B 32"/>
+ <a u="F967" b="84 30 8B 33"/>
+ <a u="F968" b="84 30 8B 34"/>
+ <a u="F969" b="84 30 8B 35"/>
+ <a u="F96A" b="84 30 8B 36"/>
+ <a u="F96B" b="84 30 8B 37"/>
+ <a u="F96C" b="84 30 8B 38"/>
+ <a u="F96D" b="84 30 8B 39"/>
+ <a u="F96E" b="84 30 8C 30"/>
+ <a u="F96F" b="84 30 8C 31"/>
+ <a u="F970" b="84 30 8C 32"/>
+ <a u="F971" b="84 30 8C 33"/>
+ <a u="F972" b="84 30 8C 34"/>
+ <a u="F973" b="84 30 8C 35"/>
+ <a u="F974" b="84 30 8C 36"/>
+ <a u="F975" b="84 30 8C 37"/>
+ <a u="F976" b="84 30 8C 38"/>
+ <a u="F977" b="84 30 8C 39"/>
+ <a u="F978" b="84 30 8D 30"/>
+ <a u="F979" b="FD 9D"/>
+ <a u="F97A" b="84 30 8D 31"/>
+ <a u="F97B" b="84 30 8D 32"/>
+ <a u="F97C" b="84 30 8D 33"/>
+ <a u="F97D" b="84 30 8D 34"/>
+ <a u="F97E" b="84 30 8D 35"/>
+ <a u="F97F" b="84 30 8D 36"/>
+ <a u="F980" b="84 30 8D 37"/>
+ <a u="F981" b="84 30 8D 38"/>
+ <a u="F982" b="84 30 8D 39"/>
+ <a u="F983" b="84 30 8E 30"/>
+ <a u="F984" b="84 30 8E 31"/>
+ <a u="F985" b="84 30 8E 32"/>
+ <a u="F986" b="84 30 8E 33"/>
+ <a u="F987" b="84 30 8E 34"/>
+ <a u="F988" b="84 30 8E 35"/>
+ <a u="F989" b="84 30 8E 36"/>
+ <a u="F98A" b="84 30 8E 37"/>
+ <a u="F98B" b="84 30 8E 38"/>
+ <a u="F98C" b="84 30 8E 39"/>
+ <a u="F98D" b="84 30 8F 30"/>
+ <a u="F98E" b="84 30 8F 31"/>
+ <a u="F98F" b="84 30 8F 32"/>
+ <a u="F990" b="84 30 8F 33"/>
+ <a u="F991" b="84 30 8F 34"/>
+ <a u="F992" b="84 30 8F 35"/>
+ <a u="F993" b="84 30 8F 36"/>
+ <a u="F994" b="84 30 8F 37"/>
+ <a u="F995" b="FD 9E"/>
+ <a u="F996" b="84 30 8F 38"/>
+ <a u="F997" b="84 30 8F 39"/>
+ <a u="F998" b="84 30 90 30"/>
+ <a u="F999" b="84 30 90 31"/>
+ <a u="F99A" b="84 30 90 32"/>
+ <a u="F99B" b="84 30 90 33"/>
+ <a u="F99C" b="84 30 90 34"/>
+ <a u="F99D" b="84 30 90 35"/>
+ <a u="F99E" b="84 30 90 36"/>
+ <a u="F99F" b="84 30 90 37"/>
+ <a u="F9A0" b="84 30 90 38"/>
+ <a u="F9A1" b="84 30 90 39"/>
+ <a u="F9A2" b="84 30 91 30"/>
+ <a u="F9A3" b="84 30 91 31"/>
+ <a u="F9A4" b="84 30 91 32"/>
+ <a u="F9A5" b="84 30 91 33"/>
+ <a u="F9A6" b="84 30 91 34"/>
+ <a u="F9A7" b="84 30 91 35"/>
+ <a u="F9A8" b="84 30 91 36"/>
+ <a u="F9A9" b="84 30 91 37"/>
+ <a u="F9AA" b="84 30 91 38"/>
+ <a u="F9AB" b="84 30 91 39"/>
+ <a u="F9AC" b="84 30 92 30"/>
+ <a u="F9AD" b="84 30 92 31"/>
+ <a u="F9AE" b="84 30 92 32"/>
+ <a u="F9AF" b="84 30 92 33"/>
+ <a u="F9B0" b="84 30 92 34"/>
+ <a u="F9B1" b="84 30 92 35"/>
+ <a u="F9B2" b="84 30 92 36"/>
+ <a u="F9B3" b="84 30 92 37"/>
+ <a u="F9B4" b="84 30 92 38"/>
+ <a u="F9B5" b="84 30 92 39"/>
+ <a u="F9B6" b="84 30 93 30"/>
+ <a u="F9B7" b="84 30 93 31"/>
+ <a u="F9B8" b="84 30 93 32"/>
+ <a u="F9B9" b="84 30 93 33"/>
+ <a u="F9BA" b="84 30 93 34"/>
+ <a u="F9BB" b="84 30 93 35"/>
+ <a u="F9BC" b="84 30 93 36"/>
+ <a u="F9BD" b="84 30 93 37"/>
+ <a u="F9BE" b="84 30 93 38"/>
+ <a u="F9BF" b="84 30 93 39"/>
+ <a u="F9C0" b="84 30 94 30"/>
+ <a u="F9C1" b="84 30 94 31"/>
+ <a u="F9C2" b="84 30 94 32"/>
+ <a u="F9C3" b="84 30 94 33"/>
+ <a u="F9C4" b="84 30 94 34"/>
+ <a u="F9C5" b="84 30 94 35"/>
+ <a u="F9C6" b="84 30 94 36"/>
+ <a u="F9C7" b="84 30 94 37"/>
+ <a u="F9C8" b="84 30 94 38"/>
+ <a u="F9C9" b="84 30 94 39"/>
+ <a u="F9CA" b="84 30 95 30"/>
+ <a u="F9CB" b="84 30 95 31"/>
+ <a u="F9CC" b="84 30 95 32"/>
+ <a u="F9CD" b="84 30 95 33"/>
+ <a u="F9CE" b="84 30 95 34"/>
+ <a u="F9CF" b="84 30 95 35"/>
+ <a u="F9D0" b="84 30 95 36"/>
+ <a u="F9D1" b="84 30 95 37"/>
+ <a u="F9D2" b="84 30 95 38"/>
+ <a u="F9D3" b="84 30 95 39"/>
+ <a u="F9D4" b="84 30 96 30"/>
+ <a u="F9D5" b="84 30 96 31"/>
+ <a u="F9D6" b="84 30 96 32"/>
+ <a u="F9D7" b="84 30 96 33"/>
+ <a u="F9D8" b="84 30 96 34"/>
+ <a u="F9D9" b="84 30 96 35"/>
+ <a u="F9DA" b="84 30 96 36"/>
+ <a u="F9DB" b="84 30 96 37"/>
+ <a u="F9DC" b="84 30 96 38"/>
+ <a u="F9DD" b="84 30 96 39"/>
+ <a u="F9DE" b="84 30 97 30"/>
+ <a u="F9DF" b="84 30 97 31"/>
+ <a u="F9E0" b="84 30 97 32"/>
+ <a u="F9E1" b="84 30 97 33"/>
+ <a u="F9E2" b="84 30 97 34"/>
+ <a u="F9E3" b="84 30 97 35"/>
+ <a u="F9E4" b="84 30 97 36"/>
+ <a u="F9E5" b="84 30 97 37"/>
+ <a u="F9E6" b="84 30 97 38"/>
+ <a u="F9E7" b="FD 9F"/>
+ <a u="F9E8" b="84 30 97 39"/>
+ <a u="F9E9" b="84 30 98 30"/>
+ <a u="F9EA" b="84 30 98 31"/>
+ <a u="F9EB" b="84 30 98 32"/>
+ <a u="F9EC" b="84 30 98 33"/>
+ <a u="F9ED" b="84 30 98 34"/>
+ <a u="F9EE" b="84 30 98 35"/>
+ <a u="F9EF" b="84 30 98 36"/>
+ <a u="F9F0" b="84 30 98 37"/>
+ <a u="F9F1" b="FD A0"/>
+ <a u="F9F2" b="84 30 98 38"/>
+ <a u="F9F3" b="84 30 98 39"/>
+ <a u="F9F4" b="84 30 99 30"/>
+ <a u="F9F5" b="84 30 99 31"/>
+ <a u="F9F6" b="84 30 99 32"/>
+ <a u="F9F7" b="84 30 99 33"/>
+ <a u="F9F8" b="84 30 99 34"/>
+ <a u="F9F9" b="84 30 99 35"/>
+ <a u="F9FA" b="84 30 99 36"/>
+ <a u="F9FB" b="84 30 99 37"/>
+ <a u="F9FC" b="84 30 99 38"/>
+ <a u="F9FD" b="84 30 99 39"/>
+ <a u="F9FE" b="84 30 9A 30"/>
+ <a u="F9FF" b="84 30 9A 31"/>
+ <a u="FA00" b="84 30 9A 32"/>
+ <a u="FA01" b="84 30 9A 33"/>
+ <a u="FA02" b="84 30 9A 34"/>
+ <a u="FA03" b="84 30 9A 35"/>
+ <a u="FA04" b="84 30 9A 36"/>
+ <a u="FA05" b="84 30 9A 37"/>
+ <a u="FA06" b="84 30 9A 38"/>
+ <a u="FA07" b="84 30 9A 39"/>
+ <a u="FA08" b="84 30 9B 30"/>
+ <a u="FA09" b="84 30 9B 31"/>
+ <a u="FA0A" b="84 30 9B 32"/>
+ <a u="FA0B" b="84 30 9B 33"/>
+ <a u="FA0C" b="FE 40"/>
+ <a u="FA0D" b="FE 41"/>
+ <a u="FA0E" b="FE 42"/>
+ <a u="FA0F" b="FE 43"/>
+ <a u="FA10" b="84 30 9B 34"/>
+ <a u="FA11" b="FE 44"/>
+ <a u="FA12" b="84 30 9B 35"/>
+ <a u="FA13" b="FE 45"/>
+ <a u="FA14" b="FE 46"/>
+ <a u="FA15" b="84 30 9B 36"/>
+ <a u="FA16" b="84 30 9B 37"/>
+ <a u="FA17" b="84 30 9B 38"/>
+ <a u="FA18" b="FE 47"/>
+ <a u="FA19" b="84 30 9B 39"/>
+ <a u="FA1A" b="84 30 9C 30"/>
+ <a u="FA1B" b="84 30 9C 31"/>
+ <a u="FA1C" b="84 30 9C 32"/>
+ <a u="FA1D" b="84 30 9C 33"/>
+ <a u="FA1E" b="84 30 9C 34"/>
+ <a u="FA1F" b="FE 48"/>
+ <a u="FA20" b="FE 49"/>
+ <a u="FA21" b="FE 4A"/>
+ <a u="FA22" b="84 30 9C 35"/>
+ <a u="FA23" b="FE 4B"/>
+ <a u="FA24" b="FE 4C"/>
+ <a u="FA25" b="84 30 9C 36"/>
+ <a u="FA26" b="84 30 9C 37"/>
+ <a u="FA27" b="FE 4D"/>
+ <a u="FA28" b="FE 4E"/>
+ <a u="FA29" b="FE 4F"/>
+ <a u="FE30" b="A9 55"/>
+ <a u="FE31" b="A6 F2"/>
+ <a u="FE32" b="84 31 85 38"/>
+ <a u="FE33" b="A6 F4"/>
+ <a u="FE34" b="A6 F5"/>
+ <a u="FE35" b="A6 E0"/>
+ <a u="FE36" b="A6 E1"/>
+ <a u="FE37" b="A6 F0"/>
+ <a u="FE38" b="A6 F1"/>
+ <a u="FE39" b="A6 E2"/>
+ <a u="FE3A" b="A6 E3"/>
+ <a u="FE3B" b="A6 EE"/>
+ <a u="FE3C" b="A6 EF"/>
+ <a u="FE3D" b="A6 E6"/>
+ <a u="FE3E" b="A6 E7"/>
+ <a u="FE3F" b="A6 E4"/>
+ <a u="FE40" b="A6 E5"/>
+ <a u="FE41" b="A6 E8"/>
+ <a u="FE42" b="A6 E9"/>
+ <a u="FE43" b="A6 EA"/>
+ <a u="FE44" b="A6 EB"/>
+ <a u="FE45" b="84 31 85 39"/>
+ <a u="FE46" b="84 31 86 30"/>
+ <a u="FE47" b="84 31 86 31"/>
+ <a u="FE48" b="84 31 86 32"/>
+ <a u="FE49" b="A9 68"/>
+ <a u="FE4A" b="A9 69"/>
+ <a u="FE4B" b="A9 6A"/>
+ <a u="FE4C" b="A9 6B"/>
+ <a u="FE4D" b="A9 6C"/>
+ <a u="FE4E" b="A9 6D"/>
+ <a u="FE4F" b="A9 6E"/>
+ <a u="FE50" b="A9 6F"/>
+ <a u="FE51" b="A9 70"/>
+ <a u="FE52" b="A9 71"/>
+ <a u="FE53" b="84 31 86 33"/>
+ <a u="FE54" b="A9 72"/>
+ <a u="FE55" b="A9 73"/>
+ <a u="FE56" b="A9 74"/>
+ <a u="FE57" b="A9 75"/>
+ <a u="FE58" b="84 31 86 34"/>
+ <a u="FE59" b="A9 76"/>
+ <a u="FE5A" b="A9 77"/>
+ <a u="FE5B" b="A9 78"/>
+ <a u="FE5C" b="A9 79"/>
+ <a u="FE5D" b="A9 7A"/>
+ <a u="FE5E" b="A9 7B"/>
+ <a u="FE5F" b="A9 7C"/>
+ <a u="FE60" b="A9 7D"/>
+ <a u="FE61" b="A9 7E"/>
+ <a u="FE62" b="A9 80"/>
+ <a u="FE63" b="A9 81"/>
+ <a u="FE64" b="A9 82"/>
+ <a u="FE65" b="A9 83"/>
+ <a u="FE66" b="A9 84"/>
+ <a u="FE67" b="84 31 86 35"/>
+ <a u="FE68" b="A9 85"/>
+ <a u="FE69" b="A9 86"/>
+ <a u="FE6A" b="A9 87"/>
+ <a u="FE6B" b="A9 88"/>
+ <a u="FE6C" b="84 31 86 36"/>
+ <a u="FE6D" b="84 31 86 37"/>
+ <a u="FE6E" b="84 31 86 38"/>
+ <a u="FE6F" b="84 31 86 39"/>
+ <a u="FE70" b="84 31 87 30"/>
+ <a u="FE71" b="84 31 87 31"/>
+ <a u="FE72" b="84 31 87 32"/>
+ <a u="FE73" b="84 31 87 33"/>
+ <a u="FE74" b="84 31 87 34"/>
+ <a u="FE75" b="84 31 87 35"/>
+ <a u="FE76" b="84 31 87 36"/>
+ <a u="FE77" b="84 31 87 37"/>
+ <a u="FE78" b="84 31 87 38"/>
+ <a u="FE79" b="84 31 87 39"/>
+ <a u="FE7A" b="84 31 88 30"/>
+ <a u="FE7B" b="84 31 88 31"/>
+ <a u="FE7C" b="84 31 88 32"/>
+ <a u="FE7D" b="84 31 88 33"/>
+ <a u="FE7E" b="84 31 88 34"/>
+ <a u="FE7F" b="84 31 88 35"/>
+ <a u="FE80" b="84 31 88 36"/>
+ <a u="FE81" b="84 31 88 37"/>
+ <a u="FE82" b="84 31 88 38"/>
+ <a u="FE83" b="84 31 88 39"/>
+ <a u="FE84" b="84 31 89 30"/>
+ <a u="FE85" b="84 31 89 31"/>
+ <a u="FE86" b="84 31 89 32"/>
+ <a u="FE87" b="84 31 89 33"/>
+ <a u="FE88" b="84 31 89 34"/>
+ <a u="FE89" b="84 31 89 35"/>
+ <a u="FE8A" b="84 31 89 36"/>
+ <a u="FE8B" b="84 31 89 37"/>
+ <a u="FE8C" b="84 31 89 38"/>
+ <a u="FE8D" b="84 31 89 39"/>
+ <a u="FE8E" b="84 31 8A 30"/>
+ <a u="FE8F" b="84 31 8A 31"/>
+ <a u="FE90" b="84 31 8A 32"/>
+ <a u="FE91" b="84 31 8A 33"/>
+ <a u="FE92" b="84 31 8A 34"/>
+ <a u="FE93" b="84 31 8A 35"/>
+ <a u="FE94" b="84 31 8A 36"/>
+ <a u="FE95" b="84 31 8A 37"/>
+ <a u="FE96" b="84 31 8A 38"/>
+ <a u="FE97" b="84 31 8A 39"/>
+ <a u="FE98" b="84 31 8B 30"/>
+ <a u="FE99" b="84 31 8B 31"/>
+ <a u="FE9A" b="84 31 8B 32"/>
+ <a u="FE9B" b="84 31 8B 33"/>
+ <a u="FE9C" b="84 31 8B 34"/>
+ <a u="FE9D" b="84 31 8B 35"/>
+ <a u="FE9E" b="84 31 8B 36"/>
+ <a u="FE9F" b="84 31 8B 37"/>
+ <a u="FEA0" b="84 31 8B 38"/>
+ <a u="FEA1" b="84 31 8B 39"/>
+ <a u="FEA2" b="84 31 8C 30"/>
+ <a u="FEA3" b="84 31 8C 31"/>
+ <a u="FEA4" b="84 31 8C 32"/>
+ <a u="FEA5" b="84 31 8C 33"/>
+ <a u="FEA6" b="84 31 8C 34"/>
+ <a u="FEA7" b="84 31 8C 35"/>
+ <a u="FEA8" b="84 31 8C 36"/>
+ <a u="FEA9" b="84 31 8C 37"/>
+ <a u="FEAA" b="84 31 8C 38"/>
+ <a u="FEAB" b="84 31 8C 39"/>
+ <a u="FEAC" b="84 31 8D 30"/>
+ <a u="FEAD" b="84 31 8D 31"/>
+ <a u="FEAE" b="84 31 8D 32"/>
+ <a u="FEAF" b="84 31 8D 33"/>
+ <a u="FEB0" b="84 31 8D 34"/>
+ <a u="FEB1" b="84 31 8D 35"/>
+ <a u="FEB2" b="84 31 8D 36"/>
+ <a u="FEB3" b="84 31 8D 37"/>
+ <a u="FEB4" b="84 31 8D 38"/>
+ <a u="FEB5" b="84 31 8D 39"/>
+ <a u="FEB6" b="84 31 8E 30"/>
+ <a u="FEB7" b="84 31 8E 31"/>
+ <a u="FEB8" b="84 31 8E 32"/>
+ <a u="FEB9" b="84 31 8E 33"/>
+ <a u="FEBA" b="84 31 8E 34"/>
+ <a u="FEBB" b="84 31 8E 35"/>
+ <a u="FEBC" b="84 31 8E 36"/>
+ <a u="FEBD" b="84 31 8E 37"/>
+ <a u="FEBE" b="84 31 8E 38"/>
+ <a u="FEBF" b="84 31 8E 39"/>
+ <a u="FEC0" b="84 31 8F 30"/>
+ <a u="FEC1" b="84 31 8F 31"/>
+ <a u="FEC2" b="84 31 8F 32"/>
+ <a u="FEC3" b="84 31 8F 33"/>
+ <a u="FEC4" b="84 31 8F 34"/>
+ <a u="FEC5" b="84 31 8F 35"/>
+ <a u="FEC6" b="84 31 8F 36"/>
+ <a u="FEC7" b="84 31 8F 37"/>
+ <a u="FEC8" b="84 31 8F 38"/>
+ <a u="FEC9" b="84 31 8F 39"/>
+ <a u="FECA" b="84 31 90 30"/>
+ <a u="FECB" b="84 31 90 31"/>
+ <a u="FECC" b="84 31 90 32"/>
+ <a u="FECD" b="84 31 90 33"/>
+ <a u="FECE" b="84 31 90 34"/>
+ <a u="FECF" b="84 31 90 35"/>
+ <a u="FED0" b="84 31 90 36"/>
+ <a u="FED1" b="84 31 90 37"/>
+ <a u="FED2" b="84 31 90 38"/>
+ <a u="FED3" b="84 31 90 39"/>
+ <a u="FED4" b="84 31 91 30"/>
+ <a u="FED5" b="84 31 91 31"/>
+ <a u="FED6" b="84 31 91 32"/>
+ <a u="FED7" b="84 31 91 33"/>
+ <a u="FED8" b="84 31 91 34"/>
+ <a u="FED9" b="84 31 91 35"/>
+ <a u="FEDA" b="84 31 91 36"/>
+ <a u="FEDB" b="84 31 91 37"/>
+ <a u="FEDC" b="84 31 91 38"/>
+ <a u="FEDD" b="84 31 91 39"/>
+ <a u="FEDE" b="84 31 92 30"/>
+ <a u="FEDF" b="84 31 92 31"/>
+ <a u="FEE0" b="84 31 92 32"/>
+ <a u="FEE1" b="84 31 92 33"/>
+ <a u="FEE2" b="84 31 92 34"/>
+ <a u="FEE3" b="84 31 92 35"/>
+ <a u="FEE4" b="84 31 92 36"/>
+ <a u="FEE5" b="84 31 92 37"/>
+ <a u="FEE6" b="84 31 92 38"/>
+ <a u="FEE7" b="84 31 92 39"/>
+ <a u="FEE8" b="84 31 93 30"/>
+ <a u="FEE9" b="84 31 93 31"/>
+ <a u="FEEA" b="84 31 93 32"/>
+ <a u="FEEB" b="84 31 93 33"/>
+ <a u="FEEC" b="84 31 93 34"/>
+ <a u="FEED" b="84 31 93 35"/>
+ <a u="FEEE" b="84 31 93 36"/>
+ <a u="FEEF" b="84 31 93 37"/>
+ <a u="FEF0" b="84 31 93 38"/>
+ <a u="FEF1" b="84 31 93 39"/>
+ <a u="FEF2" b="84 31 94 30"/>
+ <a u="FEF3" b="84 31 94 31"/>
+ <a u="FEF4" b="84 31 94 32"/>
+ <a u="FEF5" b="84 31 94 33"/>
+ <a u="FEF6" b="84 31 94 34"/>
+ <a u="FEF7" b="84 31 94 35"/>
+ <a u="FEF8" b="84 31 94 36"/>
+ <a u="FEF9" b="84 31 94 37"/>
+ <a u="FEFA" b="84 31 94 38"/>
+ <a u="FEFB" b="84 31 94 39"/>
+ <a u="FEFC" b="84 31 95 30"/>
+ <a u="FEFD" b="84 31 95 31"/>
+ <a u="FEFE" b="84 31 95 32"/>
+ <a u="FEFF" b="84 31 95 33"/>
+ <a u="FF00" b="84 31 95 34"/>
+ <a u="FF01" b="A3 A1"/>
+ <a u="FF02" b="A3 A2"/>
+ <a u="FF03" b="A3 A3"/>
+ <a u="FF04" b="A1 E7"/>
+ <a u="FF05" b="A3 A5"/>
+ <a u="FF06" b="A3 A6"/>
+ <a u="FF07" b="A3 A7"/>
+ <a u="FF08" b="A3 A8"/>
+ <a u="FF09" b="A3 A9"/>
+ <a u="FF0A" b="A3 AA"/>
+ <a u="FF0B" b="A3 AB"/>
+ <a u="FF0C" b="A3 AC"/>
+ <a u="FF0D" b="A3 AD"/>
+ <a u="FF0E" b="A3 AE"/>
+ <a u="FF0F" b="A3 AF"/>
+ <a u="FF10" b="A3 B0"/>
+ <a u="FF11" b="A3 B1"/>
+ <a u="FF12" b="A3 B2"/>
+ <a u="FF13" b="A3 B3"/>
+ <a u="FF14" b="A3 B4"/>
+ <a u="FF15" b="A3 B5"/>
+ <a u="FF16" b="A3 B6"/>
+ <a u="FF17" b="A3 B7"/>
+ <a u="FF18" b="A3 B8"/>
+ <a u="FF19" b="A3 B9"/>
+ <a u="FF1A" b="A3 BA"/>
+ <a u="FF1B" b="A3 BB"/>
+ <a u="FF1C" b="A3 BC"/>
+ <a u="FF1D" b="A3 BD"/>
+ <a u="FF1E" b="A3 BE"/>
+ <a u="FF1F" b="A3 BF"/>
+ <a u="FF20" b="A3 C0"/>
+ <a u="FF21" b="A3 C1"/>
+ <a u="FF22" b="A3 C2"/>
+ <a u="FF23" b="A3 C3"/>
+ <a u="FF24" b="A3 C4"/>
+ <a u="FF25" b="A3 C5"/>
+ <a u="FF26" b="A3 C6"/>
+ <a u="FF27" b="A3 C7"/>
+ <a u="FF28" b="A3 C8"/>
+ <a u="FF29" b="A3 C9"/>
+ <a u="FF2A" b="A3 CA"/>
+ <a u="FF2B" b="A3 CB"/>
+ <a u="FF2C" b="A3 CC"/>
+ <a u="FF2D" b="A3 CD"/>
+ <a u="FF2E" b="A3 CE"/>
+ <a u="FF2F" b="A3 CF"/>
+ <a u="FF30" b="A3 D0"/>
+ <a u="FF31" b="A3 D1"/>
+ <a u="FF32" b="A3 D2"/>
+ <a u="FF33" b="A3 D3"/>
+ <a u="FF34" b="A3 D4"/>
+ <a u="FF35" b="A3 D5"/>
+ <a u="FF36" b="A3 D6"/>
+ <a u="FF37" b="A3 D7"/>
+ <a u="FF38" b="A3 D8"/>
+ <a u="FF39" b="A3 D9"/>
+ <a u="FF3A" b="A3 DA"/>
+ <a u="FF3B" b="A3 DB"/>
+ <a u="FF3C" b="A3 DC"/>
+ <a u="FF3D" b="A3 DD"/>
+ <a u="FF3E" b="A3 DE"/>
+ <a u="FF3F" b="A3 DF"/>
+ <a u="FF40" b="A3 E0"/>
+ <a u="FF41" b="A3 E1"/>
+ <a u="FF42" b="A3 E2"/>
+ <a u="FF43" b="A3 E3"/>
+ <a u="FF44" b="A3 E4"/>
+ <a u="FF45" b="A3 E5"/>
+ <a u="FF46" b="A3 E6"/>
+ <a u="FF47" b="A3 E7"/>
+ <a u="FF48" b="A3 E8"/>
+ <a u="FF49" b="A3 E9"/>
+ <a u="FF4A" b="A3 EA"/>
+ <a u="FF4B" b="A3 EB"/>
+ <a u="FF4C" b="A3 EC"/>
+ <a u="FF4D" b="A3 ED"/>
+ <a u="FF4E" b="A3 EE"/>
+ <a u="FF4F" b="A3 EF"/>
+ <a u="FF50" b="A3 F0"/>
+ <a u="FF51" b="A3 F1"/>
+ <a u="FF52" b="A3 F2"/>
+ <a u="FF53" b="A3 F3"/>
+ <a u="FF54" b="A3 F4"/>
+ <a u="FF55" b="A3 F5"/>
+ <a u="FF56" b="A3 F6"/>
+ <a u="FF57" b="A3 F7"/>
+ <a u="FF58" b="A3 F8"/>
+ <a u="FF59" b="A3 F9"/>
+ <a u="FF5A" b="A3 FA"/>
+ <a u="FF5B" b="A3 FB"/>
+ <a u="FF5C" b="A3 FC"/>
+ <a u="FF5D" b="A3 FD"/>
+ <a u="FF5E" b="A1 AB"/>
+ <a u="FF5F" b="84 31 95 35"/>
+ <a u="FF60" b="84 31 95 36"/>
+ <a u="FF61" b="84 31 95 37"/>
+ <a u="FF62" b="84 31 95 38"/>
+ <a u="FF63" b="84 31 95 39"/>
+ <a u="FF64" b="84 31 96 30"/>
+ <a u="FF65" b="84 31 96 31"/>
+ <a u="FF66" b="84 31 96 32"/>
+ <a u="FF67" b="84 31 96 33"/>
+ <a u="FF68" b="84 31 96 34"/>
+ <a u="FF69" b="84 31 96 35"/>
+ <a u="FF6A" b="84 31 96 36"/>
+ <a u="FF6B" b="84 31 96 37"/>
+ <a u="FF6C" b="84 31 96 38"/>
+ <a u="FF6D" b="84 31 96 39"/>
+ <a u="FF6E" b="84 31 97 30"/>
+ <a u="FF6F" b="84 31 97 31"/>
+ <a u="FF70" b="84 31 97 32"/>
+ <a u="FF71" b="84 31 97 33"/>
+ <a u="FF72" b="84 31 97 34"/>
+ <a u="FF73" b="84 31 97 35"/>
+ <a u="FF74" b="84 31 97 36"/>
+ <a u="FF75" b="84 31 97 37"/>
+ <a u="FF76" b="84 31 97 38"/>
+ <a u="FF77" b="84 31 97 39"/>
+ <a u="FF78" b="84 31 98 30"/>
+ <a u="FF79" b="84 31 98 31"/>
+ <a u="FF7A" b="84 31 98 32"/>
+ <a u="FF7B" b="84 31 98 33"/>
+ <a u="FF7C" b="84 31 98 34"/>
+ <a u="FF7D" b="84 31 98 35"/>
+ <a u="FF7E" b="84 31 98 36"/>
+ <a u="FF7F" b="84 31 98 37"/>
+ <a u="FF80" b="84 31 98 38"/>
+ <a u="FF81" b="84 31 98 39"/>
+ <a u="FF82" b="84 31 99 30"/>
+ <a u="FF83" b="84 31 99 31"/>
+ <a u="FF84" b="84 31 99 32"/>
+ <a u="FF85" b="84 31 99 33"/>
+ <a u="FF86" b="84 31 99 34"/>
+ <a u="FF87" b="84 31 99 35"/>
+ <a u="FF88" b="84 31 99 36"/>
+ <a u="FF89" b="84 31 99 37"/>
+ <a u="FF8A" b="84 31 99 38"/>
+ <a u="FF8B" b="84 31 99 39"/>
+ <a u="FF8C" b="84 31 9A 30"/>
+ <a u="FF8D" b="84 31 9A 31"/>
+ <a u="FF8E" b="84 31 9A 32"/>
+ <a u="FF8F" b="84 31 9A 33"/>
+ <a u="FF90" b="84 31 9A 34"/>
+ <a u="FF91" b="84 31 9A 35"/>
+ <a u="FF92" b="84 31 9A 36"/>
+ <a u="FF93" b="84 31 9A 37"/>
+ <a u="FF94" b="84 31 9A 38"/>
+ <a u="FF95" b="84 31 9A 39"/>
+ <a u="FF96" b="84 31 9B 30"/>
+ <a u="FF97" b="84 31 9B 31"/>
+ <a u="FF98" b="84 31 9B 32"/>
+ <a u="FF99" b="84 31 9B 33"/>
+ <a u="FF9A" b="84 31 9B 34"/>
+ <a u="FF9B" b="84 31 9B 35"/>
+ <a u="FF9C" b="84 31 9B 36"/>
+ <a u="FF9D" b="84 31 9B 37"/>
+ <a u="FF9E" b="84 31 9B 38"/>
+ <a u="FF9F" b="84 31 9B 39"/>
+ <a u="FFA0" b="84 31 9C 30"/>
+ <a u="FFA1" b="84 31 9C 31"/>
+ <a u="FFA2" b="84 31 9C 32"/>
+ <a u="FFA3" b="84 31 9C 33"/>
+ <a u="FFA4" b="84 31 9C 34"/>
+ <a u="FFA5" b="84 31 9C 35"/>
+ <a u="FFA6" b="84 31 9C 36"/>
+ <a u="FFA7" b="84 31 9C 37"/>
+ <a u="FFA8" b="84 31 9C 38"/>
+ <a u="FFA9" b="84 31 9C 39"/>
+ <a u="FFAA" b="84 31 9D 30"/>
+ <a u="FFAB" b="84 31 9D 31"/>
+ <a u="FFAC" b="84 31 9D 32"/>
+ <a u="FFAD" b="84 31 9D 33"/>
+ <a u="FFAE" b="84 31 9D 34"/>
+ <a u="FFAF" b="84 31 9D 35"/>
+ <a u="FFB0" b="84 31 9D 36"/>
+ <a u="FFB1" b="84 31 9D 37"/>
+ <a u="FFB2" b="84 31 9D 38"/>
+ <a u="FFB3" b="84 31 9D 39"/>
+ <a u="FFB4" b="84 31 9E 30"/>
+ <a u="FFB5" b="84 31 9E 31"/>
+ <a u="FFB6" b="84 31 9E 32"/>
+ <a u="FFB7" b="84 31 9E 33"/>
+ <a u="FFB8" b="84 31 9E 34"/>
+ <a u="FFB9" b="84 31 9E 35"/>
+ <a u="FFBA" b="84 31 9E 36"/>
+ <a u="FFBB" b="84 31 9E 37"/>
+ <a u="FFBC" b="84 31 9E 38"/>
+ <a u="FFBD" b="84 31 9E 39"/>
+ <a u="FFBE" b="84 31 9F 30"/>
+ <a u="FFBF" b="84 31 9F 31"/>
+ <a u="FFC0" b="84 31 9F 32"/>
+ <a u="FFC1" b="84 31 9F 33"/>
+ <a u="FFC2" b="84 31 9F 34"/>
+ <a u="FFC3" b="84 31 9F 35"/>
+ <a u="FFC4" b="84 31 9F 36"/>
+ <a u="FFC5" b="84 31 9F 37"/>
+ <a u="FFC6" b="84 31 9F 38"/>
+ <a u="FFC7" b="84 31 9F 39"/>
+ <a u="FFC8" b="84 31 A0 30"/>
+ <a u="FFC9" b="84 31 A0 31"/>
+ <a u="FFCA" b="84 31 A0 32"/>
+ <a u="FFCB" b="84 31 A0 33"/>
+ <a u="FFCC" b="84 31 A0 34"/>
+ <a u="FFCD" b="84 31 A0 35"/>
+ <a u="FFCE" b="84 31 A0 36"/>
+ <a u="FFCF" b="84 31 A0 37"/>
+ <a u="FFD0" b="84 31 A0 38"/>
+ <a u="FFD1" b="84 31 A0 39"/>
+ <a u="FFD2" b="84 31 A1 30"/>
+ <a u="FFD3" b="84 31 A1 31"/>
+ <a u="FFD4" b="84 31 A1 32"/>
+ <a u="FFD5" b="84 31 A1 33"/>
+ <a u="FFD6" b="84 31 A1 34"/>
+ <a u="FFD7" b="84 31 A1 35"/>
+ <a u="FFD8" b="84 31 A1 36"/>
+ <a u="FFD9" b="84 31 A1 37"/>
+ <a u="FFDA" b="84 31 A1 38"/>
+ <a u="FFDB" b="84 31 A1 39"/>
+ <a u="FFDC" b="84 31 A2 30"/>
+ <a u="FFDD" b="84 31 A2 31"/>
+ <a u="FFDE" b="84 31 A2 32"/>
+ <a u="FFDF" b="84 31 A2 33"/>
+ <a u="FFE0" b="A1 E9"/>
+ <a u="FFE1" b="A1 EA"/>
+ <a u="FFE2" b="A9 56"/>
+ <a u="FFE3" b="A3 FE"/>
+ <a u="FFE4" b="A9 57"/>
+ <a u="FFE5" b="A3 A4"/>
+ <!-- Fallback mappings from Unicode to bytes -->
+ <!-- NONE -->
+ <!-- Fallback mappings from bytes to Unicode -->
+ <!-- NONE -->
+ <!-- Roundtrip-mappings that can be enumerated
+ Note that GB 18030 defines roundtrip mappings for all Unicode code points U+0000..U+10ffff.
+ This would require 1.1 million <a> elements.
+ However, most four-byte GB 18030 mappings can be enumerated efficiently within distinct ranges.
+ Therefore, we use <range> elements for all but the 31000 or so assignments above.
+ -->
+ <range uFirst="0452" uLast="200F" bFirst="81 30 D3 30" bLast="81 36 A5 31" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="2643" uLast="2E80" bFirst="81 37 A8 39" bLast="81 38 FD 38" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="361B" uLast="3917" bFirst="82 30 A6 33" bLast="82 30 F2 37" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="3CE1" uLast="4055" bFirst="82 31 D4 38" bLast="82 32 AF 32" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="4160" uLast="4336" bFirst="82 32 C9 37" bLast="82 32 F8 37" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="44D7" uLast="464B" bFirst="82 33 A3 39" bLast="82 33 C9 31" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="478E" uLast="4946" bFirst="82 33 E8 38" bLast="82 34 96 38" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="49B8" uLast="4C76" bFirst="82 34 A1 31" bLast="82 34 E7 33" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="9FA6" uLast="D7FF" bFirst="82 35 8F 33" bLast="83 36 C7 38" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="E865" uLast="F92B" bFirst="83 36 D0 30" bLast="84 30 85 34" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="FA2A" uLast="FE2F" bFirst="84 30 9C 38" bLast="84 31 85 37" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="FFE6" uLast="FFFF" bFirst="84 31 A2 34" bLast="84 31 A4 39" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ <range uFirst="10000" uLast="10FFFF" bFirst="90 30 81 30" bLast="E3 32 9A 35" bMin="81 30 81 30" bMax="FE 39 FE 39"/>
+ </assignments>
+</characterMapping>
diff --git a/src/backend/utils/mb/Unicode/gb18030_to_utf8.map b/src/backend/utils/mb/Unicode/gb18030_to_utf8.map
new file mode 100644
index 0000000..1c90d48
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/gb18030_to_utf8.map
@@ -0,0 +1,11151 @@
+/* src/backend/utils/mb/Unicode/gb18030_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_GB18030.pl */
+
+static const uint32 gb18030_to_unicode_tree_table[32795];
+
+static const pg_mb_radix_tree gb18030_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ gb18030_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x00bf, /* offset of table for 2-byte inputs */
+ 0x81, /* b2_1_lower */
+ 0xfe, /* b2_1_upper */
+ 0x40, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x5f3f, /* offset of table for 4-byte inputs */
+ 0x81, /* b4_1_lower */
+ 0x84, /* b4_1_upper */
+ 0x30, /* b4_2_lower */
+ 0x39, /* b4_2_upper */
+ 0x81, /* b4_3_lower */
+ 0xfe, /* b4_3_upper */
+ 0x30, /* b4_4_lower */
+ 0x39 /* b4_4_upper */
+};
+
+static const uint32 gb18030_to_unicode_tree_table[32795] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x000bf ***/
+
+ /* 81 */ 0x00013d, 0x0001fc, 0x0002bb, 0x00037a,
+ /* 85 */ 0x000439, 0x0004f8, 0x0005b7, 0x000676,
+ /* 89 */ 0x000735, 0x0007f4, 0x0008b3, 0x000972,
+ /* 8d */ 0x000a31, 0x000af0, 0x000baf, 0x000c6e,
+ /* 91 */ 0x000d2d, 0x000dec, 0x000eab, 0x000f6a,
+ /* 95 */ 0x001029, 0x0010e8, 0x0011a7, 0x001266,
+ /* 99 */ 0x001325, 0x0013e4, 0x0014a3, 0x001562,
+ /* 9d */ 0x001621, 0x0016e0, 0x00179f, 0x00185e,
+ /* a1 */ 0x00191d, 0x0019dc, 0x001a9b, 0x001b5a,
+ /* a5 */ 0x001c19, 0x001cd8, 0x001d97, 0x001e56,
+ /* a9 */ 0x001f15, 0x001fd4, 0x002093, 0x002152,
+ /* ad */ 0x002211, 0x0022d0, 0x00238f, 0x00244e,
+ /* b1 */ 0x00250d, 0x0025cc, 0x00268b, 0x00274a,
+ /* b5 */ 0x002809, 0x0028c8, 0x002987, 0x002a46,
+ /* b9 */ 0x002b05, 0x002bc4, 0x002c83, 0x002d42,
+ /* bd */ 0x002e01, 0x002ec0, 0x002f7f, 0x00303e,
+ /* c1 */ 0x0030fd, 0x0031bc, 0x00327b, 0x00333a,
+ /* c5 */ 0x0033f9, 0x0034b8, 0x003577, 0x003636,
+ /* c9 */ 0x0036f5, 0x0037b4, 0x003873, 0x003932,
+ /* cd */ 0x0039f1, 0x003ab0, 0x003b6f, 0x003c2e,
+ /* d1 */ 0x003ced, 0x003dac, 0x003e6b, 0x003f2a,
+ /* d5 */ 0x003fe9, 0x0040a8, 0x004167, 0x004226,
+ /* d9 */ 0x0042e5, 0x0043a4, 0x004463, 0x004522,
+ /* dd */ 0x0045e1, 0x0046a0, 0x00475f, 0x00481e,
+ /* e1 */ 0x0048dd, 0x00499c, 0x004a5b, 0x004b1a,
+ /* e5 */ 0x004bd9, 0x004c98, 0x004d57, 0x004e16,
+ /* e9 */ 0x004ed5, 0x004f94, 0x005053, 0x005112,
+ /* ed */ 0x0051d1, 0x005290, 0x00534f, 0x00540e,
+ /* f1 */ 0x0054cd, 0x00558c, 0x00564b, 0x00570a,
+ /* f5 */ 0x0057c9, 0x005888, 0x005947, 0x005a06,
+ /* f9 */ 0x005ac5, 0x005b84, 0x005c43, 0x005d02,
+ /* fd */ 0x005dc1, 0x005e80,
+
+ /*** Two byte table, leaf: 81xx - offset 0x0013d ***/
+
+ /* 40 */ 0xe4b882, 0xe4b884, 0xe4b885, 0xe4b886,
+ /* 44 */ 0xe4b88f, 0xe4b892, 0xe4b897, 0xe4b89f,
+ /* 48 */ 0xe4b8a0, 0xe4b8a1, 0xe4b8a3, 0xe4b8a6,
+ /* 4c */ 0xe4b8a9, 0xe4b8ae, 0xe4b8af, 0xe4b8b1,
+ /* 50 */ 0xe4b8b3, 0xe4b8b5, 0xe4b8b7, 0xe4b8bc,
+ /* 54 */ 0xe4b980, 0xe4b981, 0xe4b982, 0xe4b984,
+ /* 58 */ 0xe4b986, 0xe4b98a, 0xe4b991, 0xe4b995,
+ /* 5c */ 0xe4b997, 0xe4b99a, 0xe4b99b, 0xe4b9a2,
+ /* 60 */ 0xe4b9a3, 0xe4b9a4, 0xe4b9a5, 0xe4b9a7,
+ /* 64 */ 0xe4b9a8, 0xe4b9aa, 0xe4b9ab, 0xe4b9ac,
+ /* 68 */ 0xe4b9ad, 0xe4b9ae, 0xe4b9af, 0xe4b9b2,
+ /* 6c */ 0xe4b9b4, 0xe4b9b5, 0xe4b9b6, 0xe4b9b7,
+ /* 70 */ 0xe4b9b8, 0xe4b9b9, 0xe4b9ba, 0xe4b9bb,
+ /* 74 */ 0xe4b9bc, 0xe4b9bd, 0xe4b9bf, 0xe4ba80,
+ /* 78 */ 0xe4ba81, 0xe4ba82, 0xe4ba83, 0xe4ba84,
+ /* 7c */ 0xe4ba85, 0xe4ba87, 0xe4ba8a, 0x000000,
+ /* 80 */ 0xe4ba90, 0xe4ba96, 0xe4ba97, 0xe4ba99,
+ /* 84 */ 0xe4ba9c, 0xe4ba9d, 0xe4ba9e, 0xe4baa3,
+ /* 88 */ 0xe4baaa, 0xe4baaf, 0xe4bab0, 0xe4bab1,
+ /* 8c */ 0xe4bab4, 0xe4bab6, 0xe4bab7, 0xe4bab8,
+ /* 90 */ 0xe4bab9, 0xe4babc, 0xe4babd, 0xe4babe,
+ /* 94 */ 0xe4bb88, 0xe4bb8c, 0xe4bb8f, 0xe4bb90,
+ /* 98 */ 0xe4bb92, 0xe4bb9a, 0xe4bb9b, 0xe4bb9c,
+ /* 9c */ 0xe4bba0, 0xe4bba2, 0xe4bba6, 0xe4bba7,
+ /* a0 */ 0xe4bba9, 0xe4bbad, 0xe4bbae, 0xe4bbaf,
+ /* a4 */ 0xe4bbb1, 0xe4bbb4, 0xe4bbb8, 0xe4bbb9,
+ /* a8 */ 0xe4bbba, 0xe4bbbc, 0xe4bbbe, 0xe4bc80,
+ /* ac */ 0xe4bc82, 0xe4bc83, 0xe4bc84, 0xe4bc85,
+ /* b0 */ 0xe4bc86, 0xe4bc87, 0xe4bc88, 0xe4bc8b,
+ /* b4 */ 0xe4bc8c, 0xe4bc92, 0xe4bc93, 0xe4bc94,
+ /* b8 */ 0xe4bc95, 0xe4bc96, 0xe4bc9c, 0xe4bc9d,
+ /* bc */ 0xe4bca1, 0xe4bca3, 0xe4bca8, 0xe4bca9,
+ /* c0 */ 0xe4bcac, 0xe4bcad, 0xe4bcae, 0xe4bcb1,
+ /* c4 */ 0xe4bcb3, 0xe4bcb5, 0xe4bcb7, 0xe4bcb9,
+ /* c8 */ 0xe4bcbb, 0xe4bcbe, 0xe4bcbf, 0xe4bd80,
+ /* cc */ 0xe4bd81, 0xe4bd82, 0xe4bd84, 0xe4bd85,
+ /* d0 */ 0xe4bd87, 0xe4bd88, 0xe4bd89, 0xe4bd8a,
+ /* d4 */ 0xe4bd8b, 0xe4bd8c, 0xe4bd92, 0xe4bd94,
+ /* d8 */ 0xe4bd96, 0xe4bda1, 0xe4bda2, 0xe4bda6,
+ /* dc */ 0xe4bda8, 0xe4bdaa, 0xe4bdab, 0xe4bdad,
+ /* e0 */ 0xe4bdae, 0xe4bdb1, 0xe4bdb2, 0xe4bdb5,
+ /* e4 */ 0xe4bdb7, 0xe4bdb8, 0xe4bdb9, 0xe4bdba,
+ /* e8 */ 0xe4bdbd, 0xe4be80, 0xe4be81, 0xe4be82,
+ /* ec */ 0xe4be85, 0xe4be86, 0xe4be87, 0xe4be8a,
+ /* f0 */ 0xe4be8c, 0xe4be8e, 0xe4be90, 0xe4be92,
+ /* f4 */ 0xe4be93, 0xe4be95, 0xe4be96, 0xe4be98,
+ /* f8 */ 0xe4be99, 0xe4be9a, 0xe4be9c, 0xe4be9e,
+ /* fc */ 0xe4be9f, 0xe4bea1, 0xe4bea2,
+
+ /*** Two byte table, leaf: 82xx - offset 0x001fc ***/
+
+ /* 40 */ 0xe4bea4, 0xe4beab, 0xe4bead, 0xe4beb0,
+ /* 44 */ 0xe4beb1, 0xe4beb2, 0xe4beb3, 0xe4beb4,
+ /* 48 */ 0xe4beb6, 0xe4beb7, 0xe4beb8, 0xe4beb9,
+ /* 4c */ 0xe4beba, 0xe4bebb, 0xe4bebc, 0xe4bebd,
+ /* 50 */ 0xe4bebe, 0xe4bf80, 0xe4bf81, 0xe4bf82,
+ /* 54 */ 0xe4bf86, 0xe4bf87, 0xe4bf88, 0xe4bf89,
+ /* 58 */ 0xe4bf8b, 0xe4bf8c, 0xe4bf8d, 0xe4bf92,
+ /* 5c */ 0xe4bf93, 0xe4bf94, 0xe4bf95, 0xe4bf96,
+ /* 60 */ 0xe4bf99, 0xe4bf9b, 0xe4bfa0, 0xe4bfa2,
+ /* 64 */ 0xe4bfa4, 0xe4bfa5, 0xe4bfa7, 0xe4bfab,
+ /* 68 */ 0xe4bfac, 0xe4bfb0, 0xe4bfb2, 0xe4bfb4,
+ /* 6c */ 0xe4bfb5, 0xe4bfb6, 0xe4bfb7, 0xe4bfb9,
+ /* 70 */ 0xe4bfbb, 0xe4bfbc, 0xe4bfbd, 0xe4bfbf,
+ /* 74 */ 0xe58080, 0xe58081, 0xe58082, 0xe58083,
+ /* 78 */ 0xe58084, 0xe58085, 0xe58086, 0xe58087,
+ /* 7c */ 0xe58088, 0xe58089, 0xe5808a, 0x000000,
+ /* 80 */ 0xe5808b, 0xe5808e, 0xe58090, 0xe58091,
+ /* 84 */ 0xe58093, 0xe58095, 0xe58096, 0xe58097,
+ /* 88 */ 0xe5809b, 0xe5809d, 0xe5809e, 0xe580a0,
+ /* 8c */ 0xe580a2, 0xe580a3, 0xe580a4, 0xe580a7,
+ /* 90 */ 0xe580ab, 0xe580af, 0xe580b0, 0xe580b1,
+ /* 94 */ 0xe580b2, 0xe580b3, 0xe580b4, 0xe580b5,
+ /* 98 */ 0xe580b6, 0xe580b7, 0xe580b8, 0xe580b9,
+ /* 9c */ 0xe580bb, 0xe580bd, 0xe580bf, 0xe58180,
+ /* a0 */ 0xe58181, 0xe58182, 0xe58184, 0xe58185,
+ /* a4 */ 0xe58186, 0xe58189, 0xe5818a, 0xe5818b,
+ /* a8 */ 0xe5818d, 0xe58190, 0xe58191, 0xe58192,
+ /* ac */ 0xe58193, 0xe58194, 0xe58196, 0xe58197,
+ /* b0 */ 0xe58198, 0xe58199, 0xe5819b, 0xe5819d,
+ /* b4 */ 0xe5819e, 0xe5819f, 0xe581a0, 0xe581a1,
+ /* b8 */ 0xe581a2, 0xe581a3, 0xe581a4, 0xe581a6,
+ /* bc */ 0xe581a7, 0xe581a8, 0xe581a9, 0xe581aa,
+ /* c0 */ 0xe581ab, 0xe581ad, 0xe581ae, 0xe581af,
+ /* c4 */ 0xe581b0, 0xe581b1, 0xe581b2, 0xe581b3,
+ /* c8 */ 0xe581b4, 0xe581b5, 0xe581b8, 0xe581b9,
+ /* cc */ 0xe581ba, 0xe581bc, 0xe581bd, 0xe58281,
+ /* d0 */ 0xe58282, 0xe58283, 0xe58284, 0xe58286,
+ /* d4 */ 0xe58287, 0xe58289, 0xe5828a, 0xe5828b,
+ /* d8 */ 0xe5828c, 0xe5828e, 0xe5828f, 0xe58290,
+ /* dc */ 0xe58291, 0xe58292, 0xe58293, 0xe58294,
+ /* e0 */ 0xe58295, 0xe58296, 0xe58297, 0xe58298,
+ /* e4 */ 0xe58299, 0xe5829a, 0xe5829b, 0xe5829c,
+ /* e8 */ 0xe5829d, 0xe5829e, 0xe5829f, 0xe582a0,
+ /* ec */ 0xe582a1, 0xe582a2, 0xe582a4, 0xe582a6,
+ /* f0 */ 0xe582aa, 0xe582ab, 0xe582ad, 0xe582ae,
+ /* f4 */ 0xe582af, 0xe582b0, 0xe582b1, 0xe582b3,
+ /* f8 */ 0xe582b4, 0xe582b5, 0xe582b6, 0xe582b7,
+ /* fc */ 0xe582b8, 0xe582b9, 0xe582bc,
+
+ /*** Two byte table, leaf: 83xx - offset 0x002bb ***/
+
+ /* 40 */ 0xe582bd, 0xe582be, 0xe582bf, 0xe58380,
+ /* 44 */ 0xe58381, 0xe58382, 0xe58383, 0xe58384,
+ /* 48 */ 0xe58385, 0xe58386, 0xe58387, 0xe58388,
+ /* 4c */ 0xe58389, 0xe5838a, 0xe5838b, 0xe5838c,
+ /* 50 */ 0xe5838d, 0xe5838e, 0xe58390, 0xe58391,
+ /* 54 */ 0xe58392, 0xe58393, 0xe58394, 0xe58395,
+ /* 58 */ 0xe58397, 0xe58398, 0xe58399, 0xe5839b,
+ /* 5c */ 0xe5839c, 0xe5839d, 0xe5839e, 0xe5839f,
+ /* 60 */ 0xe583a0, 0xe583a1, 0xe583a2, 0xe583a3,
+ /* 64 */ 0xe583a4, 0xe583a5, 0xe583a8, 0xe583a9,
+ /* 68 */ 0xe583aa, 0xe583ab, 0xe583af, 0xe583b0,
+ /* 6c */ 0xe583b1, 0xe583b2, 0xe583b4, 0xe583b6,
+ /* 70 */ 0xe583b7, 0xe583b8, 0xe583b9, 0xe583ba,
+ /* 74 */ 0xe583bc, 0xe583bd, 0xe583be, 0xe583bf,
+ /* 78 */ 0xe58480, 0xe58481, 0xe58482, 0xe58483,
+ /* 7c */ 0xe58484, 0xe58485, 0xe58488, 0x000000,
+ /* 80 */ 0xe58489, 0xe5848a, 0xe5848c, 0xe5848d,
+ /* 84 */ 0xe5848e, 0xe5848f, 0xe58490, 0xe58491,
+ /* 88 */ 0xe58493, 0xe58494, 0xe58495, 0xe58496,
+ /* 8c */ 0xe58497, 0xe58498, 0xe58499, 0xe5849a,
+ /* 90 */ 0xe5849b, 0xe5849c, 0xe5849d, 0xe5849e,
+ /* 94 */ 0xe5849f, 0xe584a0, 0xe584a2, 0xe584a3,
+ /* 98 */ 0xe584a4, 0xe584a5, 0xe584a6, 0xe584a7,
+ /* 9c */ 0xe584a8, 0xe584a9, 0xe584aa, 0xe584ab,
+ /* a0 */ 0xe584ac, 0xe584ad, 0xe584ae, 0xe584af,
+ /* a4 */ 0xe584b0, 0xe584b1, 0xe584b2, 0xe584b3,
+ /* a8 */ 0xe584b4, 0xe584b5, 0xe584b6, 0xe584b7,
+ /* ac */ 0xe584b8, 0xe584b9, 0xe584ba, 0xe584bb,
+ /* b0 */ 0xe584bc, 0xe584bd, 0xe584be, 0xe58582,
+ /* b4 */ 0xe58587, 0xe5858a, 0xe5858c, 0xe5858e,
+ /* b8 */ 0xe5858f, 0xe58590, 0xe58592, 0xe58593,
+ /* bc */ 0xe58597, 0xe58598, 0xe58599, 0xe5859b,
+ /* c0 */ 0xe5859d, 0xe5859e, 0xe5859f, 0xe585a0,
+ /* c4 */ 0xe585a1, 0xe585a3, 0xe585a4, 0xe585a6,
+ /* c8 */ 0xe585a7, 0xe585a9, 0xe585aa, 0xe585af,
+ /* cc */ 0xe585b2, 0xe585ba, 0xe585be, 0xe585bf,
+ /* d0 */ 0xe58683, 0xe58684, 0xe58686, 0xe58687,
+ /* d4 */ 0xe5868a, 0xe5868b, 0xe5868e, 0xe5868f,
+ /* d8 */ 0xe58690, 0xe58691, 0xe58693, 0xe58694,
+ /* dc */ 0xe58698, 0xe5869a, 0xe5869d, 0xe5869e,
+ /* e0 */ 0xe5869f, 0xe586a1, 0xe586a3, 0xe586a6,
+ /* e4 */ 0xe586a7, 0xe586a8, 0xe586a9, 0xe586aa,
+ /* e8 */ 0xe586ad, 0xe586ae, 0xe586b4, 0xe586b8,
+ /* ec */ 0xe586b9, 0xe586ba, 0xe586be, 0xe586bf,
+ /* f0 */ 0xe58781, 0xe58782, 0xe58783, 0xe58785,
+ /* f4 */ 0xe58788, 0xe5878a, 0xe5878d, 0xe5878e,
+ /* f8 */ 0xe58790, 0xe58792, 0xe58793, 0xe58794,
+ /* fc */ 0xe58795, 0xe58796, 0xe58797,
+
+ /*** Two byte table, leaf: 84xx - offset 0x0037a ***/
+
+ /* 40 */ 0xe58798, 0xe58799, 0xe5879a, 0xe5879c,
+ /* 44 */ 0xe5879e, 0xe5879f, 0xe587a2, 0xe587a3,
+ /* 48 */ 0xe587a5, 0xe587a6, 0xe587a7, 0xe587a8,
+ /* 4c */ 0xe587a9, 0xe587aa, 0xe587ac, 0xe587ae,
+ /* 50 */ 0xe587b1, 0xe587b2, 0xe587b4, 0xe587b7,
+ /* 54 */ 0xe587be, 0xe58884, 0xe58885, 0xe58889,
+ /* 58 */ 0xe5888b, 0xe5888c, 0xe5888f, 0xe58890,
+ /* 5c */ 0xe58893, 0xe58894, 0xe58895, 0xe5889c,
+ /* 60 */ 0xe5889e, 0xe5889f, 0xe588a1, 0xe588a2,
+ /* 64 */ 0xe588a3, 0xe588a5, 0xe588a6, 0xe588a7,
+ /* 68 */ 0xe588aa, 0xe588ac, 0xe588af, 0xe588b1,
+ /* 6c */ 0xe588b2, 0xe588b4, 0xe588b5, 0xe588bc,
+ /* 70 */ 0xe588be, 0xe58984, 0xe58985, 0xe58986,
+ /* 74 */ 0xe58987, 0xe58988, 0xe58989, 0xe5898b,
+ /* 78 */ 0xe5898e, 0xe5898f, 0xe58992, 0xe58993,
+ /* 7c */ 0xe58995, 0xe58997, 0xe58998, 0x000000,
+ /* 80 */ 0xe58999, 0xe5899a, 0xe5899b, 0xe5899d,
+ /* 84 */ 0xe5899f, 0xe589a0, 0xe589a2, 0xe589a3,
+ /* 88 */ 0xe589a4, 0xe589a6, 0xe589a8, 0xe589ab,
+ /* 8c */ 0xe589ac, 0xe589ad, 0xe589ae, 0xe589b0,
+ /* 90 */ 0xe589b1, 0xe589b3, 0xe589b4, 0xe589b5,
+ /* 94 */ 0xe589b6, 0xe589b7, 0xe589b8, 0xe589b9,
+ /* 98 */ 0xe589ba, 0xe589bb, 0xe589bc, 0xe589be,
+ /* 9c */ 0xe58a80, 0xe58a83, 0xe58a84, 0xe58a85,
+ /* a0 */ 0xe58a86, 0xe58a87, 0xe58a89, 0xe58a8a,
+ /* a4 */ 0xe58a8b, 0xe58a8c, 0xe58a8d, 0xe58a8e,
+ /* a8 */ 0xe58a8f, 0xe58a91, 0xe58a92, 0xe58a94,
+ /* ac */ 0xe58a95, 0xe58a96, 0xe58a97, 0xe58a98,
+ /* b0 */ 0xe58a99, 0xe58a9a, 0xe58a9c, 0xe58aa4,
+ /* b4 */ 0xe58aa5, 0xe58aa6, 0xe58aa7, 0xe58aae,
+ /* b8 */ 0xe58aaf, 0xe58ab0, 0xe58ab4, 0xe58ab5,
+ /* bc */ 0xe58ab6, 0xe58ab7, 0xe58ab8, 0xe58ab9,
+ /* c0 */ 0xe58aba, 0xe58abb, 0xe58abc, 0xe58abd,
+ /* c4 */ 0xe58b80, 0xe58b81, 0xe58b82, 0xe58b84,
+ /* c8 */ 0xe58b85, 0xe58b86, 0xe58b88, 0xe58b8a,
+ /* cc */ 0xe58b8c, 0xe58b8d, 0xe58b8e, 0xe58b8f,
+ /* d0 */ 0xe58b91, 0xe58b93, 0xe58b94, 0xe58b95,
+ /* d4 */ 0xe58b97, 0xe58b99, 0xe58b9a, 0xe58b9b,
+ /* d8 */ 0xe58b9c, 0xe58b9d, 0xe58b9e, 0xe58ba0,
+ /* dc */ 0xe58ba1, 0xe58ba2, 0xe58ba3, 0xe58ba5,
+ /* e0 */ 0xe58ba6, 0xe58ba7, 0xe58ba8, 0xe58ba9,
+ /* e4 */ 0xe58baa, 0xe58bab, 0xe58bac, 0xe58bad,
+ /* e8 */ 0xe58bae, 0xe58baf, 0xe58bb1, 0xe58bb2,
+ /* ec */ 0xe58bb3, 0xe58bb4, 0xe58bb5, 0xe58bb6,
+ /* f0 */ 0xe58bb7, 0xe58bb8, 0xe58bbb, 0xe58bbc,
+ /* f4 */ 0xe58bbd, 0xe58c81, 0xe58c82, 0xe58c83,
+ /* f8 */ 0xe58c84, 0xe58c87, 0xe58c89, 0xe58c8a,
+ /* fc */ 0xe58c8b, 0xe58c8c, 0xe58c8e,
+
+ /*** Two byte table, leaf: 85xx - offset 0x00439 ***/
+
+ /* 40 */ 0xe58c91, 0xe58c92, 0xe58c93, 0xe58c94,
+ /* 44 */ 0xe58c98, 0xe58c9b, 0xe58c9c, 0xe58c9e,
+ /* 48 */ 0xe58c9f, 0xe58ca2, 0xe58ca4, 0xe58ca5,
+ /* 4c */ 0xe58ca7, 0xe58ca8, 0xe58ca9, 0xe58cab,
+ /* 50 */ 0xe58cac, 0xe58cad, 0xe58caf, 0xe58cb0,
+ /* 54 */ 0xe58cb1, 0xe58cb2, 0xe58cb3, 0xe58cb4,
+ /* 58 */ 0xe58cb5, 0xe58cb6, 0xe58cb7, 0xe58cb8,
+ /* 5c */ 0xe58cbc, 0xe58cbd, 0xe58d80, 0xe58d82,
+ /* 60 */ 0xe58d84, 0xe58d86, 0xe58d8b, 0xe58d8c,
+ /* 64 */ 0xe58d8d, 0xe58d90, 0xe58d94, 0xe58d98,
+ /* 68 */ 0xe58d99, 0xe58d9b, 0xe58d9d, 0xe58da5,
+ /* 6c */ 0xe58da8, 0xe58daa, 0xe58dac, 0xe58dad,
+ /* 70 */ 0xe58db2, 0xe58db6, 0xe58db9, 0xe58dbb,
+ /* 74 */ 0xe58dbc, 0xe58dbd, 0xe58dbe, 0xe58e80,
+ /* 78 */ 0xe58e81, 0xe58e83, 0xe58e87, 0xe58e88,
+ /* 7c */ 0xe58e8a, 0xe58e8e, 0xe58e8f, 0x000000,
+ /* 80 */ 0xe58e90, 0xe58e91, 0xe58e92, 0xe58e93,
+ /* 84 */ 0xe58e94, 0xe58e96, 0xe58e97, 0xe58e99,
+ /* 88 */ 0xe58e9b, 0xe58e9c, 0xe58e9e, 0xe58ea0,
+ /* 8c */ 0xe58ea1, 0xe58ea4, 0xe58ea7, 0xe58eaa,
+ /* 90 */ 0xe58eab, 0xe58eac, 0xe58ead, 0xe58eaf,
+ /* 94 */ 0xe58eb0, 0xe58eb1, 0xe58eb2, 0xe58eb3,
+ /* 98 */ 0xe58eb4, 0xe58eb5, 0xe58eb7, 0xe58eb8,
+ /* 9c */ 0xe58eb9, 0xe58eba, 0xe58ebc, 0xe58ebd,
+ /* a0 */ 0xe58ebe, 0xe58f80, 0xe58f83, 0xe58f84,
+ /* a4 */ 0xe58f85, 0xe58f86, 0xe58f87, 0xe58f8e,
+ /* a8 */ 0xe58f8f, 0xe58f90, 0xe58f92, 0xe58f93,
+ /* ac */ 0xe58f95, 0xe58f9a, 0xe58f9c, 0xe58f9d,
+ /* b0 */ 0xe58f9e, 0xe58fa1, 0xe58fa2, 0xe58fa7,
+ /* b4 */ 0xe58fb4, 0xe58fba, 0xe58fbe, 0xe58fbf,
+ /* b8 */ 0xe59080, 0xe59082, 0xe59085, 0xe59087,
+ /* bc */ 0xe5908b, 0xe59094, 0xe59098, 0xe59099,
+ /* c0 */ 0xe5909a, 0xe5909c, 0xe590a2, 0xe590a4,
+ /* c4 */ 0xe590a5, 0xe590aa, 0xe590b0, 0xe590b3,
+ /* c8 */ 0xe590b6, 0xe590b7, 0xe590ba, 0xe590bd,
+ /* cc */ 0xe590bf, 0xe59181, 0xe59182, 0xe59184,
+ /* d0 */ 0xe59185, 0xe59187, 0xe59189, 0xe5918c,
+ /* d4 */ 0xe5918d, 0xe5918e, 0xe5918f, 0xe59191,
+ /* d8 */ 0xe5919a, 0xe5919d, 0xe5919e, 0xe5919f,
+ /* dc */ 0xe591a0, 0xe591a1, 0xe591a3, 0xe591a5,
+ /* e0 */ 0xe591a7, 0xe591a9, 0xe591aa, 0xe591ab,
+ /* e4 */ 0xe591ac, 0xe591ad, 0xe591ae, 0xe591af,
+ /* e8 */ 0xe591b0, 0xe591b4, 0xe591b9, 0xe591ba,
+ /* ec */ 0xe591be, 0xe591bf, 0xe59281, 0xe59283,
+ /* f0 */ 0xe59285, 0xe59287, 0xe59288, 0xe59289,
+ /* f4 */ 0xe5928a, 0xe5928d, 0xe59291, 0xe59293,
+ /* f8 */ 0xe59297, 0xe59298, 0xe5929c, 0xe5929e,
+ /* fc */ 0xe5929f, 0xe592a0, 0xe592a1,
+
+ /*** Two byte table, leaf: 86xx - offset 0x004f8 ***/
+
+ /* 40 */ 0xe592a2, 0xe592a5, 0xe592ae, 0xe592b0,
+ /* 44 */ 0xe592b2, 0xe592b5, 0xe592b6, 0xe592b7,
+ /* 48 */ 0xe592b9, 0xe592ba, 0xe592bc, 0xe592be,
+ /* 4c */ 0xe59383, 0xe59385, 0xe5938a, 0xe5938b,
+ /* 50 */ 0xe59396, 0xe59398, 0xe5939b, 0xe593a0,
+ /* 54 */ 0xe593a1, 0xe593a2, 0xe593a3, 0xe593a4,
+ /* 58 */ 0xe593ab, 0xe593ac, 0xe593af, 0xe593b0,
+ /* 5c */ 0xe593b1, 0xe593b4, 0xe593b5, 0xe593b6,
+ /* 60 */ 0xe593b7, 0xe593b8, 0xe593b9, 0xe593bb,
+ /* 64 */ 0xe593be, 0xe59480, 0xe59482, 0xe59483,
+ /* 68 */ 0xe59484, 0xe59485, 0xe59488, 0xe5948a,
+ /* 6c */ 0xe5948b, 0xe5948c, 0xe5948d, 0xe5948e,
+ /* 70 */ 0xe59492, 0xe59493, 0xe59495, 0xe59496,
+ /* 74 */ 0xe59497, 0xe59498, 0xe59499, 0xe5949a,
+ /* 78 */ 0xe5949c, 0xe5949d, 0xe5949e, 0xe5949f,
+ /* 7c */ 0xe594a1, 0xe594a5, 0xe594a6, 0x000000,
+ /* 80 */ 0xe594a8, 0xe594a9, 0xe594ab, 0xe594ad,
+ /* 84 */ 0xe594b2, 0xe594b4, 0xe594b5, 0xe594b6,
+ /* 88 */ 0xe594b8, 0xe594b9, 0xe594ba, 0xe594bb,
+ /* 8c */ 0xe594bd, 0xe59580, 0xe59582, 0xe59585,
+ /* 90 */ 0xe59587, 0xe59588, 0xe5958b, 0xe5958c,
+ /* 94 */ 0xe5958d, 0xe5958e, 0xe5958f, 0xe59591,
+ /* 98 */ 0xe59592, 0xe59593, 0xe59594, 0xe59597,
+ /* 9c */ 0xe59598, 0xe59599, 0xe5959a, 0xe5959b,
+ /* a0 */ 0xe5959d, 0xe5959e, 0xe5959f, 0xe595a0,
+ /* a4 */ 0xe595a2, 0xe595a3, 0xe595a8, 0xe595a9,
+ /* a8 */ 0xe595ab, 0xe595af, 0xe595b0, 0xe595b1,
+ /* ac */ 0xe595b2, 0xe595b3, 0xe595b4, 0xe595b9,
+ /* b0 */ 0xe595ba, 0xe595bd, 0xe595bf, 0xe59685,
+ /* b4 */ 0xe59686, 0xe5968c, 0xe5968d, 0xe5968e,
+ /* b8 */ 0xe59690, 0xe59692, 0xe59693, 0xe59695,
+ /* bc */ 0xe59696, 0xe59697, 0xe5969a, 0xe5969b,
+ /* c0 */ 0xe5969e, 0xe596a0, 0xe596a1, 0xe596a2,
+ /* c4 */ 0xe596a3, 0xe596a4, 0xe596a5, 0xe596a6,
+ /* c8 */ 0xe596a8, 0xe596a9, 0xe596aa, 0xe596ab,
+ /* cc */ 0xe596ac, 0xe596ad, 0xe596ae, 0xe596af,
+ /* d0 */ 0xe596b0, 0xe596b2, 0xe596b4, 0xe596b6,
+ /* d4 */ 0xe596b8, 0xe596ba, 0xe596bc, 0xe596bf,
+ /* d8 */ 0xe59780, 0xe59781, 0xe59782, 0xe59783,
+ /* dc */ 0xe59786, 0xe59787, 0xe59788, 0xe5978a,
+ /* e0 */ 0xe5978b, 0xe5978e, 0xe5978f, 0xe59790,
+ /* e4 */ 0xe59795, 0xe59797, 0xe59798, 0xe59799,
+ /* e8 */ 0xe5979a, 0xe5979b, 0xe5979e, 0xe597a0,
+ /* ec */ 0xe597a2, 0xe597a7, 0xe597a9, 0xe597ad,
+ /* f0 */ 0xe597ae, 0xe597b0, 0xe597b1, 0xe597b4,
+ /* f4 */ 0xe597b6, 0xe597b8, 0xe597b9, 0xe597ba,
+ /* f8 */ 0xe597bb, 0xe597bc, 0xe597bf, 0xe59882,
+ /* fc */ 0xe59883, 0xe59884, 0xe59885,
+
+ /*** Two byte table, leaf: 87xx - offset 0x005b7 ***/
+
+ /* 40 */ 0xe59886, 0xe59887, 0xe5988a, 0xe5988b,
+ /* 44 */ 0xe5988d, 0xe59890, 0xe59891, 0xe59892,
+ /* 48 */ 0xe59893, 0xe59894, 0xe59895, 0xe59896,
+ /* 4c */ 0xe59897, 0xe59899, 0xe5989a, 0xe5989c,
+ /* 50 */ 0xe5989d, 0xe598a0, 0xe598a1, 0xe598a2,
+ /* 54 */ 0xe598a5, 0xe598a6, 0xe598a8, 0xe598a9,
+ /* 58 */ 0xe598aa, 0xe598ab, 0xe598ae, 0xe598af,
+ /* 5c */ 0xe598b0, 0xe598b3, 0xe598b5, 0xe598b7,
+ /* 60 */ 0xe598b8, 0xe598ba, 0xe598bc, 0xe598bd,
+ /* 64 */ 0xe598be, 0xe59980, 0xe59981, 0xe59982,
+ /* 68 */ 0xe59983, 0xe59984, 0xe59985, 0xe59986,
+ /* 6c */ 0xe59987, 0xe59988, 0xe59989, 0xe5998a,
+ /* 70 */ 0xe5998b, 0xe5998f, 0xe59990, 0xe59991,
+ /* 74 */ 0xe59992, 0xe59993, 0xe59995, 0xe59996,
+ /* 78 */ 0xe5999a, 0xe5999b, 0xe5999d, 0xe5999e,
+ /* 7c */ 0xe5999f, 0xe599a0, 0xe599a1, 0x000000,
+ /* 80 */ 0xe599a3, 0xe599a5, 0xe599a6, 0xe599a7,
+ /* 84 */ 0xe599ad, 0xe599ae, 0xe599af, 0xe599b0,
+ /* 88 */ 0xe599b2, 0xe599b3, 0xe599b4, 0xe599b5,
+ /* 8c */ 0xe599b7, 0xe599b8, 0xe599b9, 0xe599ba,
+ /* 90 */ 0xe599bd, 0xe599be, 0xe599bf, 0xe59a80,
+ /* 94 */ 0xe59a81, 0xe59a82, 0xe59a83, 0xe59a84,
+ /* 98 */ 0xe59a87, 0xe59a88, 0xe59a89, 0xe59a8a,
+ /* 9c */ 0xe59a8b, 0xe59a8c, 0xe59a8d, 0xe59a90,
+ /* a0 */ 0xe59a91, 0xe59a92, 0xe59a94, 0xe59a95,
+ /* a4 */ 0xe59a96, 0xe59a97, 0xe59a98, 0xe59a99,
+ /* a8 */ 0xe59a9a, 0xe59a9b, 0xe59a9c, 0xe59a9d,
+ /* ac */ 0xe59a9e, 0xe59a9f, 0xe59aa0, 0xe59aa1,
+ /* b0 */ 0xe59aa2, 0xe59aa4, 0xe59aa5, 0xe59aa6,
+ /* b4 */ 0xe59aa7, 0xe59aa8, 0xe59aa9, 0xe59aaa,
+ /* b8 */ 0xe59aab, 0xe59aac, 0xe59aad, 0xe59aae,
+ /* bc */ 0xe59ab0, 0xe59ab1, 0xe59ab2, 0xe59ab3,
+ /* c0 */ 0xe59ab4, 0xe59ab5, 0xe59ab6, 0xe59ab8,
+ /* c4 */ 0xe59ab9, 0xe59aba, 0xe59abb, 0xe59abd,
+ /* c8 */ 0xe59abe, 0xe59abf, 0xe59b80, 0xe59b81,
+ /* cc */ 0xe59b82, 0xe59b83, 0xe59b84, 0xe59b85,
+ /* d0 */ 0xe59b86, 0xe59b87, 0xe59b88, 0xe59b89,
+ /* d4 */ 0xe59b8b, 0xe59b8c, 0xe59b8d, 0xe59b8e,
+ /* d8 */ 0xe59b8f, 0xe59b90, 0xe59b91, 0xe59b92,
+ /* dc */ 0xe59b93, 0xe59b95, 0xe59b96, 0xe59b98,
+ /* e0 */ 0xe59b99, 0xe59b9c, 0xe59ba3, 0xe59ba5,
+ /* e4 */ 0xe59ba6, 0xe59ba7, 0xe59ba8, 0xe59ba9,
+ /* e8 */ 0xe59baa, 0xe59bac, 0xe59bae, 0xe59baf,
+ /* ec */ 0xe59bb2, 0xe59bb3, 0xe59bb6, 0xe59bb7,
+ /* f0 */ 0xe59bb8, 0xe59bbb, 0xe59bbc, 0xe59c80,
+ /* f4 */ 0xe59c81, 0xe59c82, 0xe59c85, 0xe59c87,
+ /* f8 */ 0xe59c8b, 0xe59c8c, 0xe59c8d, 0xe59c8e,
+ /* fc */ 0xe59c8f, 0xe59c90, 0xe59c91,
+
+ /*** Two byte table, leaf: 88xx - offset 0x00676 ***/
+
+ /* 40 */ 0xe59c92, 0xe59c93, 0xe59c94, 0xe59c95,
+ /* 44 */ 0xe59c96, 0xe59c97, 0xe59c98, 0xe59c99,
+ /* 48 */ 0xe59c9a, 0xe59c9b, 0xe59c9d, 0xe59c9e,
+ /* 4c */ 0xe59ca0, 0xe59ca1, 0xe59ca2, 0xe59ca4,
+ /* 50 */ 0xe59ca5, 0xe59ca6, 0xe59ca7, 0xe59cab,
+ /* 54 */ 0xe59cb1, 0xe59cb2, 0xe59cb4, 0xe59cb5,
+ /* 58 */ 0xe59cb6, 0xe59cb7, 0xe59cb8, 0xe59cbc,
+ /* 5c */ 0xe59cbd, 0xe59cbf, 0xe59d81, 0xe59d83,
+ /* 60 */ 0xe59d84, 0xe59d85, 0xe59d86, 0xe59d88,
+ /* 64 */ 0xe59d89, 0xe59d8b, 0xe59d92, 0xe59d93,
+ /* 68 */ 0xe59d94, 0xe59d95, 0xe59d96, 0xe59d98,
+ /* 6c */ 0xe59d99, 0xe59da2, 0xe59da3, 0xe59da5,
+ /* 70 */ 0xe59da7, 0xe59dac, 0xe59dae, 0xe59db0,
+ /* 74 */ 0xe59db1, 0xe59db2, 0xe59db4, 0xe59db5,
+ /* 78 */ 0xe59db8, 0xe59db9, 0xe59dba, 0xe59dbd,
+ /* 7c */ 0xe59dbe, 0xe59dbf, 0xe59e80, 0x000000,
+ /* 80 */ 0xe59e81, 0xe59e87, 0xe59e88, 0xe59e89,
+ /* 84 */ 0xe59e8a, 0xe59e8d, 0xe59e8e, 0xe59e8f,
+ /* 88 */ 0xe59e90, 0xe59e91, 0xe59e94, 0xe59e95,
+ /* 8c */ 0xe59e96, 0xe59e97, 0xe59e98, 0xe59e99,
+ /* 90 */ 0xe59e9a, 0xe59e9c, 0xe59e9d, 0xe59e9e,
+ /* 94 */ 0xe59e9f, 0xe59ea5, 0xe59ea8, 0xe59eaa,
+ /* 98 */ 0xe59eac, 0xe59eaf, 0xe59eb0, 0xe59eb1,
+ /* 9c */ 0xe59eb3, 0xe59eb5, 0xe59eb6, 0xe59eb7,
+ /* a0 */ 0xe59eb9, 0xe59eba, 0xe59ebb, 0xe59ebc,
+ /* a4 */ 0xe59ebd, 0xe59ebe, 0xe59ebf, 0xe59f80,
+ /* a8 */ 0xe59f81, 0xe59f84, 0xe59f85, 0xe59f86,
+ /* ac */ 0xe59f87, 0xe59f88, 0xe59f89, 0xe59f8a,
+ /* b0 */ 0xe59f8c, 0xe59f8d, 0xe59f90, 0xe59f91,
+ /* b4 */ 0xe59f93, 0xe59f96, 0xe59f97, 0xe59f9b,
+ /* b8 */ 0xe59f9c, 0xe59f9e, 0xe59fa1, 0xe59fa2,
+ /* bc */ 0xe59fa3, 0xe59fa5, 0xe59fa6, 0xe59fa7,
+ /* c0 */ 0xe59fa8, 0xe59fa9, 0xe59faa, 0xe59fab,
+ /* c4 */ 0xe59fac, 0xe59fae, 0xe59fb0, 0xe59fb1,
+ /* c8 */ 0xe59fb2, 0xe59fb3, 0xe59fb5, 0xe59fb6,
+ /* cc */ 0xe59fb7, 0xe59fbb, 0xe59fbc, 0xe59fbe,
+ /* d0 */ 0xe59fbf, 0xe5a081, 0xe5a083, 0xe5a084,
+ /* d4 */ 0xe5a085, 0xe5a088, 0xe5a089, 0xe5a08a,
+ /* d8 */ 0xe5a08c, 0xe5a08e, 0xe5a08f, 0xe5a090,
+ /* dc */ 0xe5a092, 0xe5a093, 0xe5a094, 0xe5a096,
+ /* e0 */ 0xe5a097, 0xe5a098, 0xe5a09a, 0xe5a09b,
+ /* e4 */ 0xe5a09c, 0xe5a09d, 0xe5a09f, 0xe5a0a2,
+ /* e8 */ 0xe5a0a3, 0xe5a0a5, 0xe5a0a6, 0xe5a0a7,
+ /* ec */ 0xe5a0a8, 0xe5a0a9, 0xe5a0ab, 0xe5a0ac,
+ /* f0 */ 0xe5a0ad, 0xe5a0ae, 0xe5a0af, 0xe5a0b1,
+ /* f4 */ 0xe5a0b2, 0xe5a0b3, 0xe5a0b4, 0xe5a0b6,
+ /* f8 */ 0xe5a0b7, 0xe5a0b8, 0xe5a0b9, 0xe5a0ba,
+ /* fc */ 0xe5a0bb, 0xe5a0bc, 0xe5a0bd,
+
+ /*** Two byte table, leaf: 89xx - offset 0x00735 ***/
+
+ /* 40 */ 0xe5a0be, 0xe5a0bf, 0xe5a180, 0xe5a181,
+ /* 44 */ 0xe5a182, 0xe5a183, 0xe5a185, 0xe5a186,
+ /* 48 */ 0xe5a187, 0xe5a188, 0xe5a189, 0xe5a18a,
+ /* 4c */ 0xe5a18b, 0xe5a18e, 0xe5a18f, 0xe5a190,
+ /* 50 */ 0xe5a192, 0xe5a193, 0xe5a195, 0xe5a196,
+ /* 54 */ 0xe5a197, 0xe5a199, 0xe5a19a, 0xe5a19b,
+ /* 58 */ 0xe5a19c, 0xe5a19d, 0xe5a19f, 0xe5a1a0,
+ /* 5c */ 0xe5a1a1, 0xe5a1a2, 0xe5a1a3, 0xe5a1a4,
+ /* 60 */ 0xe5a1a6, 0xe5a1a7, 0xe5a1a8, 0xe5a1a9,
+ /* 64 */ 0xe5a1aa, 0xe5a1ad, 0xe5a1ae, 0xe5a1af,
+ /* 68 */ 0xe5a1b0, 0xe5a1b1, 0xe5a1b2, 0xe5a1b3,
+ /* 6c */ 0xe5a1b4, 0xe5a1b5, 0xe5a1b6, 0xe5a1b7,
+ /* 70 */ 0xe5a1b8, 0xe5a1b9, 0xe5a1ba, 0xe5a1bb,
+ /* 74 */ 0xe5a1bc, 0xe5a1bd, 0xe5a1bf, 0xe5a282,
+ /* 78 */ 0xe5a284, 0xe5a286, 0xe5a287, 0xe5a288,
+ /* 7c */ 0xe5a28a, 0xe5a28b, 0xe5a28c, 0x000000,
+ /* 80 */ 0xe5a28d, 0xe5a28e, 0xe5a28f, 0xe5a290,
+ /* 84 */ 0xe5a291, 0xe5a294, 0xe5a295, 0xe5a296,
+ /* 88 */ 0xe5a297, 0xe5a298, 0xe5a29b, 0xe5a29c,
+ /* 8c */ 0xe5a29d, 0xe5a2a0, 0xe5a2a1, 0xe5a2a2,
+ /* 90 */ 0xe5a2a3, 0xe5a2a4, 0xe5a2a5, 0xe5a2a6,
+ /* 94 */ 0xe5a2a7, 0xe5a2aa, 0xe5a2ab, 0xe5a2ac,
+ /* 98 */ 0xe5a2ad, 0xe5a2ae, 0xe5a2af, 0xe5a2b0,
+ /* 9c */ 0xe5a2b1, 0xe5a2b2, 0xe5a2b3, 0xe5a2b4,
+ /* a0 */ 0xe5a2b5, 0xe5a2b6, 0xe5a2b7, 0xe5a2b8,
+ /* a4 */ 0xe5a2b9, 0xe5a2ba, 0xe5a2bb, 0xe5a2bd,
+ /* a8 */ 0xe5a2be, 0xe5a2bf, 0xe5a380, 0xe5a382,
+ /* ac */ 0xe5a383, 0xe5a384, 0xe5a386, 0xe5a387,
+ /* b0 */ 0xe5a388, 0xe5a389, 0xe5a38a, 0xe5a38b,
+ /* b4 */ 0xe5a38c, 0xe5a38d, 0xe5a38e, 0xe5a38f,
+ /* b8 */ 0xe5a390, 0xe5a392, 0xe5a393, 0xe5a394,
+ /* bc */ 0xe5a396, 0xe5a397, 0xe5a398, 0xe5a399,
+ /* c0 */ 0xe5a39a, 0xe5a39b, 0xe5a39c, 0xe5a39d,
+ /* c4 */ 0xe5a39e, 0xe5a39f, 0xe5a3a0, 0xe5a3a1,
+ /* c8 */ 0xe5a3a2, 0xe5a3a3, 0xe5a3a5, 0xe5a3a6,
+ /* cc */ 0xe5a3a7, 0xe5a3a8, 0xe5a3a9, 0xe5a3aa,
+ /* d0 */ 0xe5a3ad, 0xe5a3af, 0xe5a3b1, 0xe5a3b2,
+ /* d4 */ 0xe5a3b4, 0xe5a3b5, 0xe5a3b7, 0xe5a3b8,
+ /* d8 */ 0xe5a3ba, 0xe5a3bb, 0xe5a3bc, 0xe5a3bd,
+ /* dc */ 0xe5a3be, 0xe5a3bf, 0xe5a480, 0xe5a481,
+ /* e0 */ 0xe5a483, 0xe5a485, 0xe5a486, 0xe5a488,
+ /* e4 */ 0xe5a489, 0xe5a48a, 0xe5a48b, 0xe5a48c,
+ /* e8 */ 0xe5a48e, 0xe5a490, 0xe5a491, 0xe5a492,
+ /* ec */ 0xe5a493, 0xe5a497, 0xe5a498, 0xe5a49b,
+ /* f0 */ 0xe5a49d, 0xe5a49e, 0xe5a4a0, 0xe5a4a1,
+ /* f4 */ 0xe5a4a2, 0xe5a4a3, 0xe5a4a6, 0xe5a4a8,
+ /* f8 */ 0xe5a4ac, 0xe5a4b0, 0xe5a4b2, 0xe5a4b3,
+ /* fc */ 0xe5a4b5, 0xe5a4b6, 0xe5a4bb,
+
+ /*** Two byte table, leaf: 8axx - offset 0x007f4 ***/
+
+ /* 40 */ 0xe5a4bd, 0xe5a4be, 0xe5a4bf, 0xe5a580,
+ /* 44 */ 0xe5a583, 0xe5a585, 0xe5a586, 0xe5a58a,
+ /* 48 */ 0xe5a58c, 0xe5a58d, 0xe5a590, 0xe5a592,
+ /* 4c */ 0xe5a593, 0xe5a599, 0xe5a59b, 0xe5a59c,
+ /* 50 */ 0xe5a59d, 0xe5a59e, 0xe5a59f, 0xe5a5a1,
+ /* 54 */ 0xe5a5a3, 0xe5a5a4, 0xe5a5a6, 0xe5a5a7,
+ /* 58 */ 0xe5a5a8, 0xe5a5a9, 0xe5a5aa, 0xe5a5ab,
+ /* 5c */ 0xe5a5ac, 0xe5a5ad, 0xe5a5ae, 0xe5a5af,
+ /* 60 */ 0xe5a5b0, 0xe5a5b1, 0xe5a5b2, 0xe5a5b5,
+ /* 64 */ 0xe5a5b7, 0xe5a5ba, 0xe5a5bb, 0xe5a5bc,
+ /* 68 */ 0xe5a5be, 0xe5a5bf, 0xe5a680, 0xe5a685,
+ /* 6c */ 0xe5a689, 0xe5a68b, 0xe5a68c, 0xe5a68e,
+ /* 70 */ 0xe5a68f, 0xe5a690, 0xe5a691, 0xe5a694,
+ /* 74 */ 0xe5a695, 0xe5a698, 0xe5a69a, 0xe5a69b,
+ /* 78 */ 0xe5a69c, 0xe5a69d, 0xe5a69f, 0xe5a6a0,
+ /* 7c */ 0xe5a6a1, 0xe5a6a2, 0xe5a6a6, 0x000000,
+ /* 80 */ 0xe5a6a7, 0xe5a6ac, 0xe5a6ad, 0xe5a6b0,
+ /* 84 */ 0xe5a6b1, 0xe5a6b3, 0xe5a6b4, 0xe5a6b5,
+ /* 88 */ 0xe5a6b6, 0xe5a6b7, 0xe5a6b8, 0xe5a6ba,
+ /* 8c */ 0xe5a6bc, 0xe5a6bd, 0xe5a6bf, 0xe5a780,
+ /* 90 */ 0xe5a781, 0xe5a782, 0xe5a783, 0xe5a784,
+ /* 94 */ 0xe5a785, 0xe5a787, 0xe5a788, 0xe5a789,
+ /* 98 */ 0xe5a78c, 0xe5a78d, 0xe5a78e, 0xe5a78f,
+ /* 9c */ 0xe5a795, 0xe5a796, 0xe5a799, 0xe5a79b,
+ /* a0 */ 0xe5a79e, 0xe5a79f, 0xe5a7a0, 0xe5a7a1,
+ /* a4 */ 0xe5a7a2, 0xe5a7a4, 0xe5a7a6, 0xe5a7a7,
+ /* a8 */ 0xe5a7a9, 0xe5a7aa, 0xe5a7ab, 0xe5a7ad,
+ /* ac */ 0xe5a7ae, 0xe5a7af, 0xe5a7b0, 0xe5a7b1,
+ /* b0 */ 0xe5a7b2, 0xe5a7b3, 0xe5a7b4, 0xe5a7b5,
+ /* b4 */ 0xe5a7b6, 0xe5a7b7, 0xe5a7b8, 0xe5a7ba,
+ /* b8 */ 0xe5a7bc, 0xe5a7bd, 0xe5a7be, 0xe5a880,
+ /* bc */ 0xe5a882, 0xe5a88a, 0xe5a88b, 0xe5a88d,
+ /* c0 */ 0xe5a88e, 0xe5a88f, 0xe5a890, 0xe5a892,
+ /* c4 */ 0xe5a894, 0xe5a895, 0xe5a896, 0xe5a897,
+ /* c8 */ 0xe5a899, 0xe5a89a, 0xe5a89b, 0xe5a89d,
+ /* cc */ 0xe5a89e, 0xe5a8a1, 0xe5a8a2, 0xe5a8a4,
+ /* d0 */ 0xe5a8a6, 0xe5a8a7, 0xe5a8a8, 0xe5a8aa,
+ /* d4 */ 0xe5a8ab, 0xe5a8ac, 0xe5a8ad, 0xe5a8ae,
+ /* d8 */ 0xe5a8af, 0xe5a8b0, 0xe5a8b3, 0xe5a8b5,
+ /* dc */ 0xe5a8b7, 0xe5a8b8, 0xe5a8b9, 0xe5a8ba,
+ /* e0 */ 0xe5a8bb, 0xe5a8bd, 0xe5a8be, 0xe5a8bf,
+ /* e4 */ 0xe5a981, 0xe5a982, 0xe5a983, 0xe5a984,
+ /* e8 */ 0xe5a985, 0xe5a987, 0xe5a988, 0xe5a98b,
+ /* ec */ 0xe5a98c, 0xe5a98d, 0xe5a98e, 0xe5a98f,
+ /* f0 */ 0xe5a990, 0xe5a991, 0xe5a992, 0xe5a993,
+ /* f4 */ 0xe5a994, 0xe5a996, 0xe5a997, 0xe5a998,
+ /* f8 */ 0xe5a999, 0xe5a99b, 0xe5a99c, 0xe5a99d,
+ /* fc */ 0xe5a99e, 0xe5a99f, 0xe5a9a0,
+
+ /*** Two byte table, leaf: 8bxx - offset 0x008b3 ***/
+
+ /* 40 */ 0xe5a9a1, 0xe5a9a3, 0xe5a9a4, 0xe5a9a5,
+ /* 44 */ 0xe5a9a6, 0xe5a9a8, 0xe5a9a9, 0xe5a9ab,
+ /* 48 */ 0xe5a9ac, 0xe5a9ad, 0xe5a9ae, 0xe5a9af,
+ /* 4c */ 0xe5a9b0, 0xe5a9b1, 0xe5a9b2, 0xe5a9b3,
+ /* 50 */ 0xe5a9b8, 0xe5a9b9, 0xe5a9bb, 0xe5a9bc,
+ /* 54 */ 0xe5a9bd, 0xe5a9be, 0xe5aa80, 0xe5aa81,
+ /* 58 */ 0xe5aa82, 0xe5aa83, 0xe5aa84, 0xe5aa85,
+ /* 5c */ 0xe5aa86, 0xe5aa87, 0xe5aa88, 0xe5aa89,
+ /* 60 */ 0xe5aa8a, 0xe5aa8b, 0xe5aa8c, 0xe5aa8d,
+ /* 64 */ 0xe5aa8e, 0xe5aa8f, 0xe5aa90, 0xe5aa91,
+ /* 68 */ 0xe5aa93, 0xe5aa94, 0xe5aa95, 0xe5aa96,
+ /* 6c */ 0xe5aa97, 0xe5aa98, 0xe5aa99, 0xe5aa9c,
+ /* 70 */ 0xe5aa9d, 0xe5aa9e, 0xe5aa9f, 0xe5aaa0,
+ /* 74 */ 0xe5aaa1, 0xe5aaa2, 0xe5aaa3, 0xe5aaa4,
+ /* 78 */ 0xe5aaa5, 0xe5aaa6, 0xe5aaa7, 0xe5aaa8,
+ /* 7c */ 0xe5aaa9, 0xe5aaab, 0xe5aaac, 0x000000,
+ /* 80 */ 0xe5aaad, 0xe5aaae, 0xe5aaaf, 0xe5aab0,
+ /* 84 */ 0xe5aab1, 0xe5aab4, 0xe5aab6, 0xe5aab7,
+ /* 88 */ 0xe5aab9, 0xe5aaba, 0xe5aabb, 0xe5aabc,
+ /* 8c */ 0xe5aabd, 0xe5aabf, 0xe5ab80, 0xe5ab83,
+ /* 90 */ 0xe5ab84, 0xe5ab85, 0xe5ab86, 0xe5ab87,
+ /* 94 */ 0xe5ab88, 0xe5ab8a, 0xe5ab8b, 0xe5ab8d,
+ /* 98 */ 0xe5ab8e, 0xe5ab8f, 0xe5ab90, 0xe5ab91,
+ /* 9c */ 0xe5ab93, 0xe5ab95, 0xe5ab97, 0xe5ab99,
+ /* a0 */ 0xe5ab9a, 0xe5ab9b, 0xe5ab9d, 0xe5ab9e,
+ /* a4 */ 0xe5ab9f, 0xe5aba2, 0xe5aba4, 0xe5aba5,
+ /* a8 */ 0xe5aba7, 0xe5aba8, 0xe5abaa, 0xe5abac,
+ /* ac */ 0xe5abad, 0xe5abae, 0xe5abaf, 0xe5abb0,
+ /* b0 */ 0xe5abb2, 0xe5abb3, 0xe5abb4, 0xe5abb5,
+ /* b4 */ 0xe5abb6, 0xe5abb7, 0xe5abb8, 0xe5abb9,
+ /* b8 */ 0xe5abba, 0xe5abbb, 0xe5abbc, 0xe5abbd,
+ /* bc */ 0xe5abbe, 0xe5abbf, 0xe5ac80, 0xe5ac81,
+ /* c0 */ 0xe5ac82, 0xe5ac83, 0xe5ac84, 0xe5ac85,
+ /* c4 */ 0xe5ac86, 0xe5ac87, 0xe5ac88, 0xe5ac8a,
+ /* c8 */ 0xe5ac8b, 0xe5ac8c, 0xe5ac8d, 0xe5ac8e,
+ /* cc */ 0xe5ac8f, 0xe5ac90, 0xe5ac91, 0xe5ac92,
+ /* d0 */ 0xe5ac93, 0xe5ac94, 0xe5ac95, 0xe5ac98,
+ /* d4 */ 0xe5ac99, 0xe5ac9a, 0xe5ac9b, 0xe5ac9c,
+ /* d8 */ 0xe5ac9d, 0xe5ac9e, 0xe5ac9f, 0xe5aca0,
+ /* dc */ 0xe5aca1, 0xe5aca2, 0xe5aca3, 0xe5aca4,
+ /* e0 */ 0xe5aca5, 0xe5aca6, 0xe5aca7, 0xe5aca8,
+ /* e4 */ 0xe5aca9, 0xe5acaa, 0xe5acab, 0xe5acac,
+ /* e8 */ 0xe5acad, 0xe5acae, 0xe5acaf, 0xe5acb0,
+ /* ec */ 0xe5acb1, 0xe5acb3, 0xe5acb5, 0xe5acb6,
+ /* f0 */ 0xe5acb8, 0xe5acb9, 0xe5acba, 0xe5acbb,
+ /* f4 */ 0xe5acbc, 0xe5acbd, 0xe5acbe, 0xe5acbf,
+ /* f8 */ 0xe5ad81, 0xe5ad82, 0xe5ad83, 0xe5ad84,
+ /* fc */ 0xe5ad85, 0xe5ad86, 0xe5ad87,
+
+ /*** Two byte table, leaf: 8cxx - offset 0x00972 ***/
+
+ /* 40 */ 0xe5ad88, 0xe5ad89, 0xe5ad8a, 0xe5ad8b,
+ /* 44 */ 0xe5ad8c, 0xe5ad8d, 0xe5ad8e, 0xe5ad8f,
+ /* 48 */ 0xe5ad92, 0xe5ad96, 0xe5ad9e, 0xe5ada0,
+ /* 4c */ 0xe5ada1, 0xe5ada7, 0xe5ada8, 0xe5adab,
+ /* 50 */ 0xe5adad, 0xe5adae, 0xe5adaf, 0xe5adb2,
+ /* 54 */ 0xe5adb4, 0xe5adb6, 0xe5adb7, 0xe5adb8,
+ /* 58 */ 0xe5adb9, 0xe5adbb, 0xe5adbc, 0xe5adbe,
+ /* 5c */ 0xe5adbf, 0xe5ae82, 0xe5ae86, 0xe5ae8a,
+ /* 60 */ 0xe5ae8d, 0xe5ae8e, 0xe5ae90, 0xe5ae91,
+ /* 64 */ 0xe5ae92, 0xe5ae94, 0xe5ae96, 0xe5ae9f,
+ /* 68 */ 0xe5aea7, 0xe5aea8, 0xe5aea9, 0xe5aeac,
+ /* 6c */ 0xe5aead, 0xe5aeae, 0xe5aeaf, 0xe5aeb1,
+ /* 70 */ 0xe5aeb2, 0xe5aeb7, 0xe5aeba, 0xe5aebb,
+ /* 74 */ 0xe5aebc, 0xe5af80, 0xe5af81, 0xe5af83,
+ /* 78 */ 0xe5af88, 0xe5af89, 0xe5af8a, 0xe5af8b,
+ /* 7c */ 0xe5af8d, 0xe5af8e, 0xe5af8f, 0x000000,
+ /* 80 */ 0xe5af91, 0xe5af94, 0xe5af95, 0xe5af96,
+ /* 84 */ 0xe5af97, 0xe5af98, 0xe5af99, 0xe5af9a,
+ /* 88 */ 0xe5af9b, 0xe5af9c, 0xe5afa0, 0xe5afa2,
+ /* 8c */ 0xe5afa3, 0xe5afa6, 0xe5afa7, 0xe5afa9,
+ /* 90 */ 0xe5afaa, 0xe5afab, 0xe5afac, 0xe5afad,
+ /* 94 */ 0xe5afaf, 0xe5afb1, 0xe5afb2, 0xe5afb3,
+ /* 98 */ 0xe5afb4, 0xe5afb5, 0xe5afb6, 0xe5afb7,
+ /* 9c */ 0xe5afbd, 0xe5afbe, 0xe5b080, 0xe5b082,
+ /* a0 */ 0xe5b083, 0xe5b085, 0xe5b087, 0xe5b088,
+ /* a4 */ 0xe5b08b, 0xe5b08c, 0xe5b08d, 0xe5b08e,
+ /* a8 */ 0xe5b090, 0xe5b092, 0xe5b093, 0xe5b097,
+ /* ac */ 0xe5b099, 0xe5b09b, 0xe5b09e, 0xe5b09f,
+ /* b0 */ 0xe5b0a0, 0xe5b0a1, 0xe5b0a3, 0xe5b0a6,
+ /* b4 */ 0xe5b0a8, 0xe5b0a9, 0xe5b0aa, 0xe5b0ab,
+ /* b8 */ 0xe5b0ad, 0xe5b0ae, 0xe5b0af, 0xe5b0b0,
+ /* bc */ 0xe5b0b2, 0xe5b0b3, 0xe5b0b5, 0xe5b0b6,
+ /* c0 */ 0xe5b0b7, 0xe5b183, 0xe5b184, 0xe5b186,
+ /* c4 */ 0xe5b187, 0xe5b18c, 0xe5b18d, 0xe5b192,
+ /* c8 */ 0xe5b193, 0xe5b194, 0xe5b196, 0xe5b197,
+ /* cc */ 0xe5b198, 0xe5b19a, 0xe5b19b, 0xe5b19c,
+ /* d0 */ 0xe5b19d, 0xe5b19f, 0xe5b1a2, 0xe5b1a4,
+ /* d4 */ 0xe5b1a7, 0xe5b1a8, 0xe5b1a9, 0xe5b1aa,
+ /* d8 */ 0xe5b1ab, 0xe5b1ac, 0xe5b1ad, 0xe5b1b0,
+ /* dc */ 0xe5b1b2, 0xe5b1b3, 0xe5b1b4, 0xe5b1b5,
+ /* e0 */ 0xe5b1b6, 0xe5b1b7, 0xe5b1b8, 0xe5b1bb,
+ /* e4 */ 0xe5b1bc, 0xe5b1bd, 0xe5b1be, 0xe5b280,
+ /* e8 */ 0xe5b283, 0xe5b284, 0xe5b285, 0xe5b286,
+ /* ec */ 0xe5b287, 0xe5b289, 0xe5b28a, 0xe5b28b,
+ /* f0 */ 0xe5b28e, 0xe5b28f, 0xe5b292, 0xe5b293,
+ /* f4 */ 0xe5b295, 0xe5b29d, 0xe5b29e, 0xe5b29f,
+ /* f8 */ 0xe5b2a0, 0xe5b2a1, 0xe5b2a4, 0xe5b2a5,
+ /* fc */ 0xe5b2a6, 0xe5b2a7, 0xe5b2a8,
+
+ /*** Two byte table, leaf: 8dxx - offset 0x00a31 ***/
+
+ /* 40 */ 0xe5b2aa, 0xe5b2ae, 0xe5b2af, 0xe5b2b0,
+ /* 44 */ 0xe5b2b2, 0xe5b2b4, 0xe5b2b6, 0xe5b2b9,
+ /* 48 */ 0xe5b2ba, 0xe5b2bb, 0xe5b2bc, 0xe5b2be,
+ /* 4c */ 0xe5b380, 0xe5b382, 0xe5b383, 0xe5b385,
+ /* 50 */ 0xe5b386, 0xe5b387, 0xe5b388, 0xe5b389,
+ /* 54 */ 0xe5b38a, 0xe5b38c, 0xe5b38d, 0xe5b38e,
+ /* 58 */ 0xe5b38f, 0xe5b390, 0xe5b391, 0xe5b393,
+ /* 5c */ 0xe5b394, 0xe5b395, 0xe5b396, 0xe5b397,
+ /* 60 */ 0xe5b398, 0xe5b39a, 0xe5b39b, 0xe5b39c,
+ /* 64 */ 0xe5b39d, 0xe5b39e, 0xe5b39f, 0xe5b3a0,
+ /* 68 */ 0xe5b3a2, 0xe5b3a3, 0xe5b3a7, 0xe5b3a9,
+ /* 6c */ 0xe5b3ab, 0xe5b3ac, 0xe5b3ae, 0xe5b3af,
+ /* 70 */ 0xe5b3b1, 0xe5b3b2, 0xe5b3b3, 0xe5b3b4,
+ /* 74 */ 0xe5b3b5, 0xe5b3b6, 0xe5b3b7, 0xe5b3b8,
+ /* 78 */ 0xe5b3b9, 0xe5b3ba, 0xe5b3bc, 0xe5b3bd,
+ /* 7c */ 0xe5b3be, 0xe5b3bf, 0xe5b480, 0x000000,
+ /* 80 */ 0xe5b481, 0xe5b484, 0xe5b485, 0xe5b488,
+ /* 84 */ 0xe5b489, 0xe5b48a, 0xe5b48b, 0xe5b48c,
+ /* 88 */ 0xe5b48d, 0xe5b48f, 0xe5b490, 0xe5b491,
+ /* 8c */ 0xe5b492, 0xe5b493, 0xe5b495, 0xe5b497,
+ /* 90 */ 0xe5b498, 0xe5b499, 0xe5b49a, 0xe5b49c,
+ /* 94 */ 0xe5b49d, 0xe5b49f, 0xe5b4a0, 0xe5b4a1,
+ /* 98 */ 0xe5b4a2, 0xe5b4a3, 0xe5b4a5, 0xe5b4a8,
+ /* 9c */ 0xe5b4aa, 0xe5b4ab, 0xe5b4ac, 0xe5b4af,
+ /* a0 */ 0xe5b4b0, 0xe5b4b1, 0xe5b4b2, 0xe5b4b3,
+ /* a4 */ 0xe5b4b5, 0xe5b4b6, 0xe5b4b7, 0xe5b4b8,
+ /* a8 */ 0xe5b4b9, 0xe5b4ba, 0xe5b4bb, 0xe5b4bc,
+ /* ac */ 0xe5b4bf, 0xe5b580, 0xe5b581, 0xe5b582,
+ /* b0 */ 0xe5b583, 0xe5b584, 0xe5b585, 0xe5b586,
+ /* b4 */ 0xe5b588, 0xe5b589, 0xe5b58d, 0xe5b58e,
+ /* b8 */ 0xe5b58f, 0xe5b590, 0xe5b591, 0xe5b592,
+ /* bc */ 0xe5b593, 0xe5b594, 0xe5b595, 0xe5b596,
+ /* c0 */ 0xe5b597, 0xe5b599, 0xe5b59a, 0xe5b59c,
+ /* c4 */ 0xe5b59e, 0xe5b59f, 0xe5b5a0, 0xe5b5a1,
+ /* c8 */ 0xe5b5a2, 0xe5b5a3, 0xe5b5a4, 0xe5b5a5,
+ /* cc */ 0xe5b5a6, 0xe5b5a7, 0xe5b5a8, 0xe5b5aa,
+ /* d0 */ 0xe5b5ad, 0xe5b5ae, 0xe5b5b0, 0xe5b5b1,
+ /* d4 */ 0xe5b5b2, 0xe5b5b3, 0xe5b5b5, 0xe5b5b6,
+ /* d8 */ 0xe5b5b7, 0xe5b5b8, 0xe5b5b9, 0xe5b5ba,
+ /* dc */ 0xe5b5bb, 0xe5b5bc, 0xe5b5bd, 0xe5b5be,
+ /* e0 */ 0xe5b5bf, 0xe5b680, 0xe5b681, 0xe5b683,
+ /* e4 */ 0xe5b684, 0xe5b685, 0xe5b686, 0xe5b687,
+ /* e8 */ 0xe5b688, 0xe5b689, 0xe5b68a, 0xe5b68b,
+ /* ec */ 0xe5b68c, 0xe5b68d, 0xe5b68e, 0xe5b68f,
+ /* f0 */ 0xe5b690, 0xe5b691, 0xe5b692, 0xe5b693,
+ /* f4 */ 0xe5b694, 0xe5b695, 0xe5b696, 0xe5b697,
+ /* f8 */ 0xe5b698, 0xe5b69a, 0xe5b69b, 0xe5b69c,
+ /* fc */ 0xe5b69e, 0xe5b69f, 0xe5b6a0,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00af0 ***/
+
+ /* 40 */ 0xe5b6a1, 0xe5b6a2, 0xe5b6a3, 0xe5b6a4,
+ /* 44 */ 0xe5b6a5, 0xe5b6a6, 0xe5b6a7, 0xe5b6a8,
+ /* 48 */ 0xe5b6a9, 0xe5b6aa, 0xe5b6ab, 0xe5b6ac,
+ /* 4c */ 0xe5b6ad, 0xe5b6ae, 0xe5b6af, 0xe5b6b0,
+ /* 50 */ 0xe5b6b1, 0xe5b6b2, 0xe5b6b3, 0xe5b6b4,
+ /* 54 */ 0xe5b6b5, 0xe5b6b6, 0xe5b6b8, 0xe5b6b9,
+ /* 58 */ 0xe5b6ba, 0xe5b6bb, 0xe5b6bc, 0xe5b6bd,
+ /* 5c */ 0xe5b6be, 0xe5b6bf, 0xe5b780, 0xe5b781,
+ /* 60 */ 0xe5b782, 0xe5b783, 0xe5b784, 0xe5b786,
+ /* 64 */ 0xe5b787, 0xe5b788, 0xe5b789, 0xe5b78a,
+ /* 68 */ 0xe5b78b, 0xe5b78c, 0xe5b78e, 0xe5b78f,
+ /* 6c */ 0xe5b790, 0xe5b791, 0xe5b792, 0xe5b793,
+ /* 70 */ 0xe5b794, 0xe5b795, 0xe5b796, 0xe5b797,
+ /* 74 */ 0xe5b798, 0xe5b799, 0xe5b79a, 0xe5b79c,
+ /* 78 */ 0xe5b79f, 0xe5b7a0, 0xe5b7a3, 0xe5b7a4,
+ /* 7c */ 0xe5b7aa, 0xe5b7ac, 0xe5b7ad, 0x000000,
+ /* 80 */ 0xe5b7b0, 0xe5b7b5, 0xe5b7b6, 0xe5b7b8,
+ /* 84 */ 0xe5b7b9, 0xe5b7ba, 0xe5b7bb, 0xe5b7bc,
+ /* 88 */ 0xe5b7bf, 0xe5b880, 0xe5b884, 0xe5b887,
+ /* 8c */ 0xe5b889, 0xe5b88a, 0xe5b88b, 0xe5b88d,
+ /* 90 */ 0xe5b88e, 0xe5b892, 0xe5b893, 0xe5b897,
+ /* 94 */ 0xe5b89e, 0xe5b89f, 0xe5b8a0, 0xe5b8a1,
+ /* 98 */ 0xe5b8a2, 0xe5b8a3, 0xe5b8a4, 0xe5b8a5,
+ /* 9c */ 0xe5b8a8, 0xe5b8a9, 0xe5b8aa, 0xe5b8ab,
+ /* a0 */ 0xe5b8ac, 0xe5b8af, 0xe5b8b0, 0xe5b8b2,
+ /* a4 */ 0xe5b8b3, 0xe5b8b4, 0xe5b8b5, 0xe5b8b6,
+ /* a8 */ 0xe5b8b9, 0xe5b8ba, 0xe5b8be, 0xe5b8bf,
+ /* ac */ 0xe5b980, 0xe5b981, 0xe5b983, 0xe5b986,
+ /* b0 */ 0xe5b987, 0xe5b988, 0xe5b989, 0xe5b98a,
+ /* b4 */ 0xe5b98b, 0xe5b98d, 0xe5b98e, 0xe5b98f,
+ /* b8 */ 0xe5b990, 0xe5b991, 0xe5b992, 0xe5b993,
+ /* bc */ 0xe5b996, 0xe5b997, 0xe5b998, 0xe5b999,
+ /* c0 */ 0xe5b99a, 0xe5b99c, 0xe5b99d, 0xe5b99f,
+ /* c4 */ 0xe5b9a0, 0xe5b9a3, 0xe5b9a4, 0xe5b9a5,
+ /* c8 */ 0xe5b9a6, 0xe5b9a7, 0xe5b9a8, 0xe5b9a9,
+ /* cc */ 0xe5b9aa, 0xe5b9ab, 0xe5b9ac, 0xe5b9ad,
+ /* d0 */ 0xe5b9ae, 0xe5b9af, 0xe5b9b0, 0xe5b9b1,
+ /* d4 */ 0xe5b9b5, 0xe5b9b7, 0xe5b9b9, 0xe5b9be,
+ /* d8 */ 0xe5ba81, 0xe5ba82, 0xe5ba83, 0xe5ba85,
+ /* dc */ 0xe5ba88, 0xe5ba89, 0xe5ba8c, 0xe5ba8d,
+ /* e0 */ 0xe5ba8e, 0xe5ba92, 0xe5ba98, 0xe5ba9b,
+ /* e4 */ 0xe5ba9d, 0xe5baa1, 0xe5baa2, 0xe5baa3,
+ /* e8 */ 0xe5baa4, 0xe5baa8, 0xe5baa9, 0xe5baaa,
+ /* ec */ 0xe5baab, 0xe5baac, 0xe5baae, 0xe5baaf,
+ /* f0 */ 0xe5bab0, 0xe5bab1, 0xe5bab2, 0xe5bab4,
+ /* f4 */ 0xe5baba, 0xe5babb, 0xe5babc, 0xe5babd,
+ /* f8 */ 0xe5babf, 0xe5bb80, 0xe5bb81, 0xe5bb82,
+ /* fc */ 0xe5bb83, 0xe5bb84, 0xe5bb85,
+
+ /*** Two byte table, leaf: 8fxx - offset 0x00baf ***/
+
+ /* 40 */ 0xe5bb86, 0xe5bb87, 0xe5bb88, 0xe5bb8b,
+ /* 44 */ 0xe5bb8c, 0xe5bb8d, 0xe5bb8e, 0xe5bb8f,
+ /* 48 */ 0xe5bb90, 0xe5bb94, 0xe5bb95, 0xe5bb97,
+ /* 4c */ 0xe5bb98, 0xe5bb99, 0xe5bb9a, 0xe5bb9c,
+ /* 50 */ 0xe5bb9d, 0xe5bb9e, 0xe5bb9f, 0xe5bba0,
+ /* 54 */ 0xe5bba1, 0xe5bba2, 0xe5bba3, 0xe5bba4,
+ /* 58 */ 0xe5bba5, 0xe5bba6, 0xe5bba7, 0xe5bba9,
+ /* 5c */ 0xe5bbab, 0xe5bbac, 0xe5bbad, 0xe5bbae,
+ /* 60 */ 0xe5bbaf, 0xe5bbb0, 0xe5bbb1, 0xe5bbb2,
+ /* 64 */ 0xe5bbb3, 0xe5bbb5, 0xe5bbb8, 0xe5bbb9,
+ /* 68 */ 0xe5bbbb, 0xe5bbbc, 0xe5bbbd, 0xe5bc85,
+ /* 6c */ 0xe5bc86, 0xe5bc87, 0xe5bc89, 0xe5bc8c,
+ /* 70 */ 0xe5bc8d, 0xe5bc8e, 0xe5bc90, 0xe5bc92,
+ /* 74 */ 0xe5bc94, 0xe5bc96, 0xe5bc99, 0xe5bc9a,
+ /* 78 */ 0xe5bc9c, 0xe5bc9d, 0xe5bc9e, 0xe5bca1,
+ /* 7c */ 0xe5bca2, 0xe5bca3, 0xe5bca4, 0x000000,
+ /* 80 */ 0xe5bca8, 0xe5bcab, 0xe5bcac, 0xe5bcae,
+ /* 84 */ 0xe5bcb0, 0xe5bcb2, 0xe5bcb3, 0xe5bcb4,
+ /* 88 */ 0xe5bcb5, 0xe5bcb6, 0xe5bcb7, 0xe5bcb8,
+ /* 8c */ 0xe5bcbb, 0xe5bcbd, 0xe5bcbe, 0xe5bcbf,
+ /* 90 */ 0xe5bd81, 0xe5bd82, 0xe5bd83, 0xe5bd84,
+ /* 94 */ 0xe5bd85, 0xe5bd86, 0xe5bd87, 0xe5bd88,
+ /* 98 */ 0xe5bd89, 0xe5bd8a, 0xe5bd8b, 0xe5bd8c,
+ /* 9c */ 0xe5bd8d, 0xe5bd8e, 0xe5bd8f, 0xe5bd91,
+ /* a0 */ 0xe5bd94, 0xe5bd99, 0xe5bd9a, 0xe5bd9b,
+ /* a4 */ 0xe5bd9c, 0xe5bd9e, 0xe5bd9f, 0xe5bda0,
+ /* a8 */ 0xe5bda3, 0xe5bda5, 0xe5bda7, 0xe5bda8,
+ /* ac */ 0xe5bdab, 0xe5bdae, 0xe5bdaf, 0xe5bdb2,
+ /* b0 */ 0xe5bdb4, 0xe5bdb5, 0xe5bdb6, 0xe5bdb8,
+ /* b4 */ 0xe5bdba, 0xe5bdbd, 0xe5bdbe, 0xe5bdbf,
+ /* b8 */ 0xe5be83, 0xe5be86, 0xe5be8d, 0xe5be8e,
+ /* bc */ 0xe5be8f, 0xe5be91, 0xe5be93, 0xe5be94,
+ /* c0 */ 0xe5be96, 0xe5be9a, 0xe5be9b, 0xe5be9d,
+ /* c4 */ 0xe5be9e, 0xe5be9f, 0xe5bea0, 0xe5bea2,
+ /* c8 */ 0xe5bea3, 0xe5bea4, 0xe5bea5, 0xe5bea6,
+ /* cc */ 0xe5bea7, 0xe5bea9, 0xe5beab, 0xe5beac,
+ /* d0 */ 0xe5beaf, 0xe5beb0, 0xe5beb1, 0xe5beb2,
+ /* d4 */ 0xe5beb3, 0xe5beb4, 0xe5beb6, 0xe5beb8,
+ /* d8 */ 0xe5beb9, 0xe5beba, 0xe5bebb, 0xe5bebe,
+ /* dc */ 0xe5bebf, 0xe5bf80, 0xe5bf81, 0xe5bf82,
+ /* e0 */ 0xe5bf87, 0xe5bf88, 0xe5bf8a, 0xe5bf8b,
+ /* e4 */ 0xe5bf8e, 0xe5bf93, 0xe5bf94, 0xe5bf95,
+ /* e8 */ 0xe5bf9a, 0xe5bf9b, 0xe5bf9c, 0xe5bf9e,
+ /* ec */ 0xe5bf9f, 0xe5bfa2, 0xe5bfa3, 0xe5bfa5,
+ /* f0 */ 0xe5bfa6, 0xe5bfa8, 0xe5bfa9, 0xe5bfac,
+ /* f4 */ 0xe5bfaf, 0xe5bfb0, 0xe5bfb2, 0xe5bfb3,
+ /* f8 */ 0xe5bfb4, 0xe5bfb6, 0xe5bfb7, 0xe5bfb9,
+ /* fc */ 0xe5bfba, 0xe5bfbc, 0xe68087,
+
+ /*** Two byte table, leaf: 90xx - offset 0x00c6e ***/
+
+ /* 40 */ 0xe68088, 0xe68089, 0xe6808b, 0xe6808c,
+ /* 44 */ 0xe68090, 0xe68091, 0xe68093, 0xe68097,
+ /* 48 */ 0xe68098, 0xe6809a, 0xe6809e, 0xe6809f,
+ /* 4c */ 0xe680a2, 0xe680a3, 0xe680a4, 0xe680ac,
+ /* 50 */ 0xe680ad, 0xe680ae, 0xe680b0, 0xe680b1,
+ /* 54 */ 0xe680b2, 0xe680b3, 0xe680b4, 0xe680b6,
+ /* 58 */ 0xe680b7, 0xe680b8, 0xe680b9, 0xe680ba,
+ /* 5c */ 0xe680bd, 0xe680be, 0xe68180, 0xe68184,
+ /* 60 */ 0xe68185, 0xe68186, 0xe68187, 0xe68188,
+ /* 64 */ 0xe68189, 0xe6818a, 0xe6818c, 0xe6818e,
+ /* 68 */ 0xe6818f, 0xe68191, 0xe68193, 0xe68194,
+ /* 6c */ 0xe68196, 0xe68197, 0xe68198, 0xe6819b,
+ /* 70 */ 0xe6819c, 0xe6819e, 0xe6819f, 0xe681a0,
+ /* 74 */ 0xe681a1, 0xe681a5, 0xe681a6, 0xe681ae,
+ /* 78 */ 0xe681b1, 0xe681b2, 0xe681b4, 0xe681b5,
+ /* 7c */ 0xe681b7, 0xe681be, 0xe68280, 0x000000,
+ /* 80 */ 0xe68281, 0xe68282, 0xe68285, 0xe68286,
+ /* 84 */ 0xe68287, 0xe68288, 0xe6828a, 0xe6828b,
+ /* 88 */ 0xe6828e, 0xe6828f, 0xe68290, 0xe68291,
+ /* 8c */ 0xe68293, 0xe68295, 0xe68297, 0xe68298,
+ /* 90 */ 0xe68299, 0xe6829c, 0xe6829e, 0xe682a1,
+ /* 94 */ 0xe682a2, 0xe682a4, 0xe682a5, 0xe682a7,
+ /* 98 */ 0xe682a9, 0xe682aa, 0xe682ae, 0xe682b0,
+ /* 9c */ 0xe682b3, 0xe682b5, 0xe682b6, 0xe682b7,
+ /* a0 */ 0xe682b9, 0xe682ba, 0xe682bd, 0xe682be,
+ /* a4 */ 0xe682bf, 0xe68380, 0xe68381, 0xe68382,
+ /* a8 */ 0xe68383, 0xe68384, 0xe68387, 0xe68388,
+ /* ac */ 0xe68389, 0xe6838c, 0xe6838d, 0xe6838e,
+ /* b0 */ 0xe6838f, 0xe68390, 0xe68392, 0xe68393,
+ /* b4 */ 0xe68394, 0xe68396, 0xe68397, 0xe68399,
+ /* b8 */ 0xe6839b, 0xe6839e, 0xe683a1, 0xe683a2,
+ /* bc */ 0xe683a3, 0xe683a4, 0xe683a5, 0xe683aa,
+ /* c0 */ 0xe683b1, 0xe683b2, 0xe683b5, 0xe683b7,
+ /* c4 */ 0xe683b8, 0xe683bb, 0xe683bc, 0xe683bd,
+ /* c8 */ 0xe683be, 0xe683bf, 0xe68482, 0xe68483,
+ /* cc */ 0xe68484, 0xe68485, 0xe68487, 0xe6848a,
+ /* d0 */ 0xe6848b, 0xe6848c, 0xe68490, 0xe68491,
+ /* d4 */ 0xe68492, 0xe68493, 0xe68494, 0xe68496,
+ /* d8 */ 0xe68497, 0xe68498, 0xe68499, 0xe6849b,
+ /* dc */ 0xe6849c, 0xe6849d, 0xe6849e, 0xe684a1,
+ /* e0 */ 0xe684a2, 0xe684a5, 0xe684a8, 0xe684a9,
+ /* e4 */ 0xe684aa, 0xe684ac, 0xe684ad, 0xe684ae,
+ /* e8 */ 0xe684af, 0xe684b0, 0xe684b1, 0xe684b2,
+ /* ec */ 0xe684b3, 0xe684b4, 0xe684b5, 0xe684b6,
+ /* f0 */ 0xe684b7, 0xe684b8, 0xe684b9, 0xe684ba,
+ /* f4 */ 0xe684bb, 0xe684bc, 0xe684bd, 0xe684be,
+ /* f8 */ 0xe68580, 0xe68581, 0xe68582, 0xe68583,
+ /* fc */ 0xe68584, 0xe68585, 0xe68586,
+
+ /*** Two byte table, leaf: 91xx - offset 0x00d2d ***/
+
+ /* 40 */ 0xe68587, 0xe68589, 0xe6858b, 0xe6858d,
+ /* 44 */ 0xe6858f, 0xe68590, 0xe68592, 0xe68593,
+ /* 48 */ 0xe68594, 0xe68596, 0xe68597, 0xe68598,
+ /* 4c */ 0xe68599, 0xe6859a, 0xe6859b, 0xe6859c,
+ /* 50 */ 0xe6859e, 0xe6859f, 0xe685a0, 0xe685a1,
+ /* 54 */ 0xe685a3, 0xe685a4, 0xe685a5, 0xe685a6,
+ /* 58 */ 0xe685a9, 0xe685aa, 0xe685ab, 0xe685ac,
+ /* 5c */ 0xe685ad, 0xe685ae, 0xe685af, 0xe685b1,
+ /* 60 */ 0xe685b2, 0xe685b3, 0xe685b4, 0xe685b6,
+ /* 64 */ 0xe685b8, 0xe685b9, 0xe685ba, 0xe685bb,
+ /* 68 */ 0xe685bc, 0xe685bd, 0xe685be, 0xe685bf,
+ /* 6c */ 0xe68680, 0xe68681, 0xe68682, 0xe68683,
+ /* 70 */ 0xe68684, 0xe68685, 0xe68686, 0xe68687,
+ /* 74 */ 0xe68688, 0xe68689, 0xe6868a, 0xe6868c,
+ /* 78 */ 0xe6868d, 0xe6868f, 0xe68690, 0xe68691,
+ /* 7c */ 0xe68692, 0xe68693, 0xe68695, 0x000000,
+ /* 80 */ 0xe68696, 0xe68697, 0xe68698, 0xe68699,
+ /* 84 */ 0xe6869a, 0xe6869b, 0xe6869c, 0xe6869e,
+ /* 88 */ 0xe6869f, 0xe686a0, 0xe686a1, 0xe686a2,
+ /* 8c */ 0xe686a3, 0xe686a4, 0xe686a5, 0xe686a6,
+ /* 90 */ 0xe686aa, 0xe686ab, 0xe686ad, 0xe686ae,
+ /* 94 */ 0xe686af, 0xe686b0, 0xe686b1, 0xe686b2,
+ /* 98 */ 0xe686b3, 0xe686b4, 0xe686b5, 0xe686b6,
+ /* 9c */ 0xe686b8, 0xe686b9, 0xe686ba, 0xe686bb,
+ /* a0 */ 0xe686bc, 0xe686bd, 0xe686bf, 0xe68780,
+ /* a4 */ 0xe68781, 0xe68783, 0xe68784, 0xe68785,
+ /* a8 */ 0xe68786, 0xe68787, 0xe68789, 0xe6878c,
+ /* ac */ 0xe6878d, 0xe6878e, 0xe6878f, 0xe68790,
+ /* b0 */ 0xe68793, 0xe68795, 0xe68796, 0xe68797,
+ /* b4 */ 0xe68798, 0xe68799, 0xe6879a, 0xe6879b,
+ /* b8 */ 0xe6879c, 0xe6879d, 0xe6879e, 0xe6879f,
+ /* bc */ 0xe687a0, 0xe687a1, 0xe687a2, 0xe687a3,
+ /* c0 */ 0xe687a4, 0xe687a5, 0xe687a7, 0xe687a8,
+ /* c4 */ 0xe687a9, 0xe687aa, 0xe687ab, 0xe687ac,
+ /* c8 */ 0xe687ad, 0xe687ae, 0xe687af, 0xe687b0,
+ /* cc */ 0xe687b1, 0xe687b2, 0xe687b3, 0xe687b4,
+ /* d0 */ 0xe687b6, 0xe687b7, 0xe687b8, 0xe687b9,
+ /* d4 */ 0xe687ba, 0xe687bb, 0xe687bc, 0xe687bd,
+ /* d8 */ 0xe687be, 0xe68880, 0xe68881, 0xe68882,
+ /* dc */ 0xe68883, 0xe68884, 0xe68885, 0xe68887,
+ /* e0 */ 0xe68889, 0xe68893, 0xe68894, 0xe68899,
+ /* e4 */ 0xe6889c, 0xe6889d, 0xe6889e, 0xe688a0,
+ /* e8 */ 0xe688a3, 0xe688a6, 0xe688a7, 0xe688a8,
+ /* ec */ 0xe688a9, 0xe688ab, 0xe688ad, 0xe688af,
+ /* f0 */ 0xe688b0, 0xe688b1, 0xe688b2, 0xe688b5,
+ /* f4 */ 0xe688b6, 0xe688b8, 0xe688b9, 0xe688ba,
+ /* f8 */ 0xe688bb, 0xe688bc, 0xe68982, 0xe68984,
+ /* fc */ 0xe68985, 0xe68986, 0xe6898a,
+
+ /*** Two byte table, leaf: 92xx - offset 0x00dec ***/
+
+ /* 40 */ 0xe6898f, 0xe68990, 0xe68995, 0xe68996,
+ /* 44 */ 0xe68997, 0xe68999, 0xe6899a, 0xe6899c,
+ /* 48 */ 0xe6899d, 0xe6899e, 0xe6899f, 0xe689a0,
+ /* 4c */ 0xe689a1, 0xe689a2, 0xe689a4, 0xe689a5,
+ /* 50 */ 0xe689a8, 0xe689b1, 0xe689b2, 0xe689b4,
+ /* 54 */ 0xe689b5, 0xe689b7, 0xe689b8, 0xe689ba,
+ /* 58 */ 0xe689bb, 0xe689bd, 0xe68a81, 0xe68a82,
+ /* 5c */ 0xe68a83, 0xe68a85, 0xe68a86, 0xe68a87,
+ /* 60 */ 0xe68a88, 0xe68a8b, 0xe68a8c, 0xe68a8d,
+ /* 64 */ 0xe68a8e, 0xe68a8f, 0xe68a90, 0xe68a94,
+ /* 68 */ 0xe68a99, 0xe68a9c, 0xe68a9d, 0xe68a9e,
+ /* 6c */ 0xe68aa3, 0xe68aa6, 0xe68aa7, 0xe68aa9,
+ /* 70 */ 0xe68aaa, 0xe68aad, 0xe68aae, 0xe68aaf,
+ /* 74 */ 0xe68ab0, 0xe68ab2, 0xe68ab3, 0xe68ab4,
+ /* 78 */ 0xe68ab6, 0xe68ab7, 0xe68ab8, 0xe68aba,
+ /* 7c */ 0xe68abe, 0xe68b80, 0xe68b81, 0x000000,
+ /* 80 */ 0xe68b83, 0xe68b8b, 0xe68b8f, 0xe68b91,
+ /* 84 */ 0xe68b95, 0xe68b9d, 0xe68b9e, 0xe68ba0,
+ /* 88 */ 0xe68ba1, 0xe68ba4, 0xe68baa, 0xe68bab,
+ /* 8c */ 0xe68bb0, 0xe68bb2, 0xe68bb5, 0xe68bb8,
+ /* 90 */ 0xe68bb9, 0xe68bba, 0xe68bbb, 0xe68c80,
+ /* 94 */ 0xe68c83, 0xe68c84, 0xe68c85, 0xe68c86,
+ /* 98 */ 0xe68c8a, 0xe68c8b, 0xe68c8c, 0xe68c8d,
+ /* 9c */ 0xe68c8f, 0xe68c90, 0xe68c92, 0xe68c93,
+ /* a0 */ 0xe68c94, 0xe68c95, 0xe68c97, 0xe68c98,
+ /* a4 */ 0xe68c99, 0xe68c9c, 0xe68ca6, 0xe68ca7,
+ /* a8 */ 0xe68ca9, 0xe68cac, 0xe68cad, 0xe68cae,
+ /* ac */ 0xe68cb0, 0xe68cb1, 0xe68cb3, 0xe68cb4,
+ /* b0 */ 0xe68cb5, 0xe68cb6, 0xe68cb7, 0xe68cb8,
+ /* b4 */ 0xe68cbb, 0xe68cbc, 0xe68cbe, 0xe68cbf,
+ /* b8 */ 0xe68d80, 0xe68d81, 0xe68d84, 0xe68d87,
+ /* bc */ 0xe68d88, 0xe68d8a, 0xe68d91, 0xe68d92,
+ /* c0 */ 0xe68d93, 0xe68d94, 0xe68d96, 0xe68d97,
+ /* c4 */ 0xe68d98, 0xe68d99, 0xe68d9a, 0xe68d9b,
+ /* c8 */ 0xe68d9c, 0xe68d9d, 0xe68da0, 0xe68da4,
+ /* cc */ 0xe68da5, 0xe68da6, 0xe68da8, 0xe68daa,
+ /* d0 */ 0xe68dab, 0xe68dac, 0xe68daf, 0xe68db0,
+ /* d4 */ 0xe68db2, 0xe68db3, 0xe68db4, 0xe68db5,
+ /* d8 */ 0xe68db8, 0xe68db9, 0xe68dbc, 0xe68dbd,
+ /* dc */ 0xe68dbe, 0xe68dbf, 0xe68e81, 0xe68e83,
+ /* e0 */ 0xe68e84, 0xe68e85, 0xe68e86, 0xe68e8b,
+ /* e4 */ 0xe68e8d, 0xe68e91, 0xe68e93, 0xe68e94,
+ /* e8 */ 0xe68e95, 0xe68e97, 0xe68e99, 0xe68e9a,
+ /* ec */ 0xe68e9b, 0xe68e9c, 0xe68e9d, 0xe68e9e,
+ /* f0 */ 0xe68e9f, 0xe68ea1, 0xe68ea4, 0xe68ea6,
+ /* f4 */ 0xe68eab, 0xe68eaf, 0xe68eb1, 0xe68eb2,
+ /* f8 */ 0xe68eb5, 0xe68eb6, 0xe68eb9, 0xe68ebb,
+ /* fc */ 0xe68ebd, 0xe68ebf, 0xe68f80,
+
+ /*** Two byte table, leaf: 93xx - offset 0x00eab ***/
+
+ /* 40 */ 0xe68f81, 0xe68f82, 0xe68f83, 0xe68f85,
+ /* 44 */ 0xe68f87, 0xe68f88, 0xe68f8a, 0xe68f8b,
+ /* 48 */ 0xe68f8c, 0xe68f91, 0xe68f93, 0xe68f94,
+ /* 4c */ 0xe68f95, 0xe68f97, 0xe68f98, 0xe68f99,
+ /* 50 */ 0xe68f9a, 0xe68f9b, 0xe68f9c, 0xe68f9d,
+ /* 54 */ 0xe68f9f, 0xe68fa2, 0xe68fa4, 0xe68fa5,
+ /* 58 */ 0xe68fa6, 0xe68fa7, 0xe68fa8, 0xe68fab,
+ /* 5c */ 0xe68fac, 0xe68fae, 0xe68faf, 0xe68fb0,
+ /* 60 */ 0xe68fb1, 0xe68fb3, 0xe68fb5, 0xe68fb7,
+ /* 64 */ 0xe68fb9, 0xe68fba, 0xe68fbb, 0xe68fbc,
+ /* 68 */ 0xe68fbe, 0xe69083, 0xe69084, 0xe69086,
+ /* 6c */ 0xe69087, 0xe69088, 0xe69089, 0xe6908a,
+ /* 70 */ 0xe6908d, 0xe6908e, 0xe69091, 0xe69092,
+ /* 74 */ 0xe69095, 0xe69096, 0xe69097, 0xe69098,
+ /* 78 */ 0xe69099, 0xe6909a, 0xe6909d, 0xe6909f,
+ /* 7c */ 0xe690a2, 0xe690a3, 0xe690a4, 0x000000,
+ /* 80 */ 0xe690a5, 0xe690a7, 0xe690a8, 0xe690a9,
+ /* 84 */ 0xe690ab, 0xe690ae, 0xe690af, 0xe690b0,
+ /* 88 */ 0xe690b1, 0xe690b2, 0xe690b3, 0xe690b5,
+ /* 8c */ 0xe690b6, 0xe690b7, 0xe690b8, 0xe690b9,
+ /* 90 */ 0xe690bb, 0xe690bc, 0xe690be, 0xe69180,
+ /* 94 */ 0xe69182, 0xe69183, 0xe69189, 0xe6918b,
+ /* 98 */ 0xe6918c, 0xe6918d, 0xe6918e, 0xe6918f,
+ /* 9c */ 0xe69190, 0xe69191, 0xe69193, 0xe69195,
+ /* a0 */ 0xe69196, 0xe69197, 0xe69199, 0xe6919a,
+ /* a4 */ 0xe6919b, 0xe6919c, 0xe6919d, 0xe6919f,
+ /* a8 */ 0xe691a0, 0xe691a1, 0xe691a2, 0xe691a3,
+ /* ac */ 0xe691a4, 0xe691a5, 0xe691a6, 0xe691a8,
+ /* b0 */ 0xe691aa, 0xe691ab, 0xe691ac, 0xe691ae,
+ /* b4 */ 0xe691af, 0xe691b0, 0xe691b1, 0xe691b2,
+ /* b8 */ 0xe691b3, 0xe691b4, 0xe691b5, 0xe691b6,
+ /* bc */ 0xe691b7, 0xe691bb, 0xe691bc, 0xe691bd,
+ /* c0 */ 0xe691be, 0xe691bf, 0xe69280, 0xe69281,
+ /* c4 */ 0xe69283, 0xe69286, 0xe69288, 0xe69289,
+ /* c8 */ 0xe6928a, 0xe6928b, 0xe6928c, 0xe6928d,
+ /* cc */ 0xe6928e, 0xe6928f, 0xe69290, 0xe69293,
+ /* d0 */ 0xe69294, 0xe69297, 0xe69298, 0xe6929a,
+ /* d4 */ 0xe6929b, 0xe6929c, 0xe6929d, 0xe6929f,
+ /* d8 */ 0xe692a0, 0xe692a1, 0xe692a2, 0xe692a3,
+ /* dc */ 0xe692a5, 0xe692a6, 0xe692a7, 0xe692a8,
+ /* e0 */ 0xe692aa, 0xe692ab, 0xe692af, 0xe692b1,
+ /* e4 */ 0xe692b2, 0xe692b3, 0xe692b4, 0xe692b6,
+ /* e8 */ 0xe692b9, 0xe692bb, 0xe692bd, 0xe692be,
+ /* ec */ 0xe692bf, 0xe69381, 0xe69383, 0xe69384,
+ /* f0 */ 0xe69386, 0xe69387, 0xe69388, 0xe69389,
+ /* f4 */ 0xe6938a, 0xe6938b, 0xe6938c, 0xe6938f,
+ /* f8 */ 0xe69391, 0xe69393, 0xe69394, 0xe69395,
+ /* fc */ 0xe69396, 0xe69399, 0xe6939a,
+
+ /*** Two byte table, leaf: 94xx - offset 0x00f6a ***/
+
+ /* 40 */ 0xe6939b, 0xe6939c, 0xe6939d, 0xe6939f,
+ /* 44 */ 0xe693a0, 0xe693a1, 0xe693a3, 0xe693a5,
+ /* 48 */ 0xe693a7, 0xe693a8, 0xe693a9, 0xe693aa,
+ /* 4c */ 0xe693ab, 0xe693ac, 0xe693ad, 0xe693ae,
+ /* 50 */ 0xe693af, 0xe693b0, 0xe693b1, 0xe693b2,
+ /* 54 */ 0xe693b3, 0xe693b4, 0xe693b5, 0xe693b6,
+ /* 58 */ 0xe693b7, 0xe693b8, 0xe693b9, 0xe693ba,
+ /* 5c */ 0xe693bb, 0xe693bc, 0xe693bd, 0xe693be,
+ /* 60 */ 0xe693bf, 0xe69481, 0xe69482, 0xe69483,
+ /* 64 */ 0xe69484, 0xe69485, 0xe69486, 0xe69487,
+ /* 68 */ 0xe69488, 0xe6948a, 0xe6948b, 0xe6948c,
+ /* 6c */ 0xe6948d, 0xe6948e, 0xe6948f, 0xe69490,
+ /* 70 */ 0xe69491, 0xe69493, 0xe69494, 0xe69495,
+ /* 74 */ 0xe69496, 0xe69497, 0xe69499, 0xe6949a,
+ /* 78 */ 0xe6949b, 0xe6949c, 0xe6949d, 0xe6949e,
+ /* 7c */ 0xe6949f, 0xe694a0, 0xe694a1, 0x000000,
+ /* 80 */ 0xe694a2, 0xe694a3, 0xe694a4, 0xe694a6,
+ /* 84 */ 0xe694a7, 0xe694a8, 0xe694a9, 0xe694aa,
+ /* 88 */ 0xe694ac, 0xe694ad, 0xe694b0, 0xe694b1,
+ /* 8c */ 0xe694b2, 0xe694b3, 0xe694b7, 0xe694ba,
+ /* 90 */ 0xe694bc, 0xe694bd, 0xe69580, 0xe69581,
+ /* 94 */ 0xe69582, 0xe69583, 0xe69584, 0xe69586,
+ /* 98 */ 0xe69587, 0xe6958a, 0xe6958b, 0xe6958d,
+ /* 9c */ 0xe6958e, 0xe69590, 0xe69592, 0xe69593,
+ /* a0 */ 0xe69594, 0xe69597, 0xe69598, 0xe6959a,
+ /* a4 */ 0xe6959c, 0xe6959f, 0xe695a0, 0xe695a1,
+ /* a8 */ 0xe695a4, 0xe695a5, 0xe695a7, 0xe695a8,
+ /* ac */ 0xe695a9, 0xe695aa, 0xe695ad, 0xe695ae,
+ /* b0 */ 0xe695af, 0xe695b1, 0xe695b3, 0xe695b5,
+ /* b4 */ 0xe695b6, 0xe695b8, 0xe695b9, 0xe695ba,
+ /* b8 */ 0xe695bb, 0xe695bc, 0xe695bd, 0xe695be,
+ /* bc */ 0xe695bf, 0xe69680, 0xe69681, 0xe69682,
+ /* c0 */ 0xe69683, 0xe69684, 0xe69685, 0xe69686,
+ /* c4 */ 0xe69688, 0xe69689, 0xe6968a, 0xe6968d,
+ /* c8 */ 0xe6968e, 0xe6968f, 0xe69692, 0xe69694,
+ /* cc */ 0xe69695, 0xe69696, 0xe69698, 0xe6969a,
+ /* d0 */ 0xe6969d, 0xe6969e, 0xe696a0, 0xe696a2,
+ /* d4 */ 0xe696a3, 0xe696a6, 0xe696a8, 0xe696aa,
+ /* d8 */ 0xe696ac, 0xe696ae, 0xe696b1, 0xe696b2,
+ /* dc */ 0xe696b3, 0xe696b4, 0xe696b5, 0xe696b6,
+ /* e0 */ 0xe696b7, 0xe696b8, 0xe696ba, 0xe696bb,
+ /* e4 */ 0xe696be, 0xe696bf, 0xe69780, 0xe69782,
+ /* e8 */ 0xe69787, 0xe69788, 0xe69789, 0xe6978a,
+ /* ec */ 0xe6978d, 0xe69790, 0xe69791, 0xe69793,
+ /* f0 */ 0xe69794, 0xe69795, 0xe69798, 0xe69799,
+ /* f4 */ 0xe6979a, 0xe6979b, 0xe6979c, 0xe6979d,
+ /* f8 */ 0xe6979e, 0xe6979f, 0xe697a1, 0xe697a3,
+ /* fc */ 0xe697a4, 0xe697aa, 0xe697ab,
+
+ /*** Two byte table, leaf: 95xx - offset 0x01029 ***/
+
+ /* 40 */ 0xe697b2, 0xe697b3, 0xe697b4, 0xe697b5,
+ /* 44 */ 0xe697b8, 0xe697b9, 0xe697bb, 0xe697bc,
+ /* 48 */ 0xe697bd, 0xe697be, 0xe697bf, 0xe69881,
+ /* 4c */ 0xe69884, 0xe69885, 0xe69887, 0xe69888,
+ /* 50 */ 0xe69889, 0xe6988b, 0xe6988d, 0xe69890,
+ /* 54 */ 0xe69891, 0xe69892, 0xe69896, 0xe69897,
+ /* 58 */ 0xe69898, 0xe6989a, 0xe6989b, 0xe6989c,
+ /* 5c */ 0xe6989e, 0xe698a1, 0xe698a2, 0xe698a3,
+ /* 60 */ 0xe698a4, 0xe698a6, 0xe698a9, 0xe698aa,
+ /* 64 */ 0xe698ab, 0xe698ac, 0xe698ae, 0xe698b0,
+ /* 68 */ 0xe698b2, 0xe698b3, 0xe698b7, 0xe698b8,
+ /* 6c */ 0xe698b9, 0xe698ba, 0xe698bb, 0xe698bd,
+ /* 70 */ 0xe698bf, 0xe69980, 0xe69982, 0xe69984,
+ /* 74 */ 0xe69985, 0xe69986, 0xe69987, 0xe69988,
+ /* 78 */ 0xe69989, 0xe6998a, 0xe6998d, 0xe6998e,
+ /* 7c */ 0xe69990, 0xe69991, 0xe69998, 0x000000,
+ /* 80 */ 0xe69999, 0xe6999b, 0xe6999c, 0xe6999d,
+ /* 84 */ 0xe6999e, 0xe699a0, 0xe699a2, 0xe699a3,
+ /* 88 */ 0xe699a5, 0xe699a7, 0xe699a9, 0xe699aa,
+ /* 8c */ 0xe699ab, 0xe699ac, 0xe699ad, 0xe699b1,
+ /* 90 */ 0xe699b2, 0xe699b3, 0xe699b5, 0xe699b8,
+ /* 94 */ 0xe699b9, 0xe699bb, 0xe699bc, 0xe699bd,
+ /* 98 */ 0xe699bf, 0xe69a80, 0xe69a81, 0xe69a83,
+ /* 9c */ 0xe69a85, 0xe69a86, 0xe69a88, 0xe69a89,
+ /* a0 */ 0xe69a8a, 0xe69a8b, 0xe69a8d, 0xe69a8e,
+ /* a4 */ 0xe69a8f, 0xe69a90, 0xe69a92, 0xe69a93,
+ /* a8 */ 0xe69a94, 0xe69a95, 0xe69a98, 0xe69a99,
+ /* ac */ 0xe69a9a, 0xe69a9b, 0xe69a9c, 0xe69a9e,
+ /* b0 */ 0xe69a9f, 0xe69aa0, 0xe69aa1, 0xe69aa2,
+ /* b4 */ 0xe69aa3, 0xe69aa4, 0xe69aa5, 0xe69aa6,
+ /* b8 */ 0xe69aa9, 0xe69aaa, 0xe69aab, 0xe69aac,
+ /* bc */ 0xe69aad, 0xe69aaf, 0xe69ab0, 0xe69ab1,
+ /* c0 */ 0xe69ab2, 0xe69ab3, 0xe69ab5, 0xe69ab6,
+ /* c4 */ 0xe69ab7, 0xe69ab8, 0xe69aba, 0xe69abb,
+ /* c8 */ 0xe69abc, 0xe69abd, 0xe69abf, 0xe69b80,
+ /* cc */ 0xe69b81, 0xe69b82, 0xe69b83, 0xe69b84,
+ /* d0 */ 0xe69b85, 0xe69b86, 0xe69b87, 0xe69b88,
+ /* d4 */ 0xe69b89, 0xe69b8a, 0xe69b8b, 0xe69b8c,
+ /* d8 */ 0xe69b8d, 0xe69b8e, 0xe69b8f, 0xe69b90,
+ /* dc */ 0xe69b91, 0xe69b92, 0xe69b93, 0xe69b94,
+ /* e0 */ 0xe69b95, 0xe69b96, 0xe69b97, 0xe69b98,
+ /* e4 */ 0xe69b9a, 0xe69b9e, 0xe69b9f, 0xe69ba0,
+ /* e8 */ 0xe69ba1, 0xe69ba2, 0xe69ba3, 0xe69ba4,
+ /* ec */ 0xe69ba5, 0xe69ba7, 0xe69ba8, 0xe69baa,
+ /* f0 */ 0xe69bab, 0xe69bac, 0xe69bad, 0xe69bae,
+ /* f4 */ 0xe69baf, 0xe69bb1, 0xe69bb5, 0xe69bb6,
+ /* f8 */ 0xe69bb8, 0xe69bba, 0xe69bbb, 0xe69bbd,
+ /* fc */ 0xe69c81, 0xe69c82, 0xe69c83,
+
+ /*** Two byte table, leaf: 96xx - offset 0x010e8 ***/
+
+ /* 40 */ 0xe69c84, 0xe69c85, 0xe69c86, 0xe69c87,
+ /* 44 */ 0xe69c8c, 0xe69c8e, 0xe69c8f, 0xe69c91,
+ /* 48 */ 0xe69c92, 0xe69c93, 0xe69c96, 0xe69c98,
+ /* 4c */ 0xe69c99, 0xe69c9a, 0xe69c9c, 0xe69c9e,
+ /* 50 */ 0xe69ca0, 0xe69ca1, 0xe69ca2, 0xe69ca3,
+ /* 54 */ 0xe69ca4, 0xe69ca5, 0xe69ca7, 0xe69ca9,
+ /* 58 */ 0xe69cae, 0xe69cb0, 0xe69cb2, 0xe69cb3,
+ /* 5c */ 0xe69cb6, 0xe69cb7, 0xe69cb8, 0xe69cb9,
+ /* 60 */ 0xe69cbb, 0xe69cbc, 0xe69cbe, 0xe69cbf,
+ /* 64 */ 0xe69d81, 0xe69d84, 0xe69d85, 0xe69d87,
+ /* 68 */ 0xe69d8a, 0xe69d8b, 0xe69d8d, 0xe69d92,
+ /* 6c */ 0xe69d94, 0xe69d95, 0xe69d97, 0xe69d98,
+ /* 70 */ 0xe69d99, 0xe69d9a, 0xe69d9b, 0xe69d9d,
+ /* 74 */ 0xe69da2, 0xe69da3, 0xe69da4, 0xe69da6,
+ /* 78 */ 0xe69da7, 0xe69dab, 0xe69dac, 0xe69dae,
+ /* 7c */ 0xe69db1, 0xe69db4, 0xe69db6, 0x000000,
+ /* 80 */ 0xe69db8, 0xe69db9, 0xe69dba, 0xe69dbb,
+ /* 84 */ 0xe69dbd, 0xe69e80, 0xe69e82, 0xe69e83,
+ /* 88 */ 0xe69e85, 0xe69e86, 0xe69e88, 0xe69e8a,
+ /* 8c */ 0xe69e8c, 0xe69e8d, 0xe69e8e, 0xe69e8f,
+ /* 90 */ 0xe69e91, 0xe69e92, 0xe69e93, 0xe69e94,
+ /* 94 */ 0xe69e96, 0xe69e99, 0xe69e9b, 0xe69e9f,
+ /* 98 */ 0xe69ea0, 0xe69ea1, 0xe69ea4, 0xe69ea6,
+ /* 9c */ 0xe69ea9, 0xe69eac, 0xe69eae, 0xe69eb1,
+ /* a0 */ 0xe69eb2, 0xe69eb4, 0xe69eb9, 0xe69eba,
+ /* a4 */ 0xe69ebb, 0xe69ebc, 0xe69ebd, 0xe69ebe,
+ /* a8 */ 0xe69ebf, 0xe69f80, 0xe69f82, 0xe69f85,
+ /* ac */ 0xe69f86, 0xe69f87, 0xe69f88, 0xe69f89,
+ /* b0 */ 0xe69f8a, 0xe69f8b, 0xe69f8c, 0xe69f8d,
+ /* b4 */ 0xe69f8e, 0xe69f95, 0xe69f96, 0xe69f97,
+ /* b8 */ 0xe69f9b, 0xe69f9f, 0xe69fa1, 0xe69fa3,
+ /* bc */ 0xe69fa4, 0xe69fa6, 0xe69fa7, 0xe69fa8,
+ /* c0 */ 0xe69faa, 0xe69fab, 0xe69fad, 0xe69fae,
+ /* c4 */ 0xe69fb2, 0xe69fb5, 0xe69fb6, 0xe69fb7,
+ /* c8 */ 0xe69fb8, 0xe69fb9, 0xe69fba, 0xe69fbb,
+ /* cc */ 0xe69fbc, 0xe69fbe, 0xe6a081, 0xe6a082,
+ /* d0 */ 0xe6a083, 0xe6a084, 0xe6a086, 0xe6a08d,
+ /* d4 */ 0xe6a090, 0xe6a092, 0xe6a094, 0xe6a095,
+ /* d8 */ 0xe6a098, 0xe6a099, 0xe6a09a, 0xe6a09b,
+ /* dc */ 0xe6a09c, 0xe6a09e, 0xe6a09f, 0xe6a0a0,
+ /* e0 */ 0xe6a0a2, 0xe6a0a3, 0xe6a0a4, 0xe6a0a5,
+ /* e4 */ 0xe6a0a6, 0xe6a0a7, 0xe6a0a8, 0xe6a0ab,
+ /* e8 */ 0xe6a0ac, 0xe6a0ad, 0xe6a0ae, 0xe6a0af,
+ /* ec */ 0xe6a0b0, 0xe6a0b1, 0xe6a0b4, 0xe6a0b5,
+ /* f0 */ 0xe6a0b6, 0xe6a0ba, 0xe6a0bb, 0xe6a0bf,
+ /* f4 */ 0xe6a187, 0xe6a18b, 0xe6a18d, 0xe6a18f,
+ /* f8 */ 0xe6a192, 0xe6a196, 0xe6a197, 0xe6a198,
+ /* fc */ 0xe6a199, 0xe6a19a, 0xe6a19b,
+
+ /*** Two byte table, leaf: 97xx - offset 0x011a7 ***/
+
+ /* 40 */ 0xe6a19c, 0xe6a19d, 0xe6a19e, 0xe6a19f,
+ /* 44 */ 0xe6a1aa, 0xe6a1ac, 0xe6a1ad, 0xe6a1ae,
+ /* 48 */ 0xe6a1af, 0xe6a1b0, 0xe6a1b1, 0xe6a1b2,
+ /* 4c */ 0xe6a1b3, 0xe6a1b5, 0xe6a1b8, 0xe6a1b9,
+ /* 50 */ 0xe6a1ba, 0xe6a1bb, 0xe6a1bc, 0xe6a1bd,
+ /* 54 */ 0xe6a1be, 0xe6a1bf, 0xe6a280, 0xe6a282,
+ /* 58 */ 0xe6a284, 0xe6a287, 0xe6a288, 0xe6a289,
+ /* 5c */ 0xe6a28a, 0xe6a28b, 0xe6a28c, 0xe6a28d,
+ /* 60 */ 0xe6a28e, 0xe6a290, 0xe6a291, 0xe6a292,
+ /* 64 */ 0xe6a294, 0xe6a295, 0xe6a296, 0xe6a298,
+ /* 68 */ 0xe6a299, 0xe6a29a, 0xe6a29b, 0xe6a29c,
+ /* 6c */ 0xe6a29d, 0xe6a29e, 0xe6a29f, 0xe6a2a0,
+ /* 70 */ 0xe6a2a1, 0xe6a2a3, 0xe6a2a4, 0xe6a2a5,
+ /* 74 */ 0xe6a2a9, 0xe6a2aa, 0xe6a2ab, 0xe6a2ac,
+ /* 78 */ 0xe6a2ae, 0xe6a2b1, 0xe6a2b2, 0xe6a2b4,
+ /* 7c */ 0xe6a2b6, 0xe6a2b7, 0xe6a2b8, 0x000000,
+ /* 80 */ 0xe6a2b9, 0xe6a2ba, 0xe6a2bb, 0xe6a2bc,
+ /* 84 */ 0xe6a2bd, 0xe6a2be, 0xe6a2bf, 0xe6a381,
+ /* 88 */ 0xe6a383, 0xe6a384, 0xe6a385, 0xe6a386,
+ /* 8c */ 0xe6a387, 0xe6a388, 0xe6a38a, 0xe6a38c,
+ /* 90 */ 0xe6a38e, 0xe6a38f, 0xe6a390, 0xe6a391,
+ /* 94 */ 0xe6a393, 0xe6a394, 0xe6a396, 0xe6a397,
+ /* 98 */ 0xe6a399, 0xe6a39b, 0xe6a39c, 0xe6a39d,
+ /* 9c */ 0xe6a39e, 0xe6a39f, 0xe6a3a1, 0xe6a3a2,
+ /* a0 */ 0xe6a3a4, 0xe6a3a5, 0xe6a3a6, 0xe6a3a7,
+ /* a4 */ 0xe6a3a8, 0xe6a3a9, 0xe6a3aa, 0xe6a3ab,
+ /* a8 */ 0xe6a3ac, 0xe6a3ad, 0xe6a3af, 0xe6a3b2,
+ /* ac */ 0xe6a3b3, 0xe6a3b4, 0xe6a3b6, 0xe6a3b7,
+ /* b0 */ 0xe6a3b8, 0xe6a3bb, 0xe6a3bd, 0xe6a3be,
+ /* b4 */ 0xe6a3bf, 0xe6a480, 0xe6a482, 0xe6a483,
+ /* b8 */ 0xe6a484, 0xe6a486, 0xe6a487, 0xe6a488,
+ /* bc */ 0xe6a489, 0xe6a48a, 0xe6a48c, 0xe6a48f,
+ /* c0 */ 0xe6a491, 0xe6a493, 0xe6a494, 0xe6a495,
+ /* c4 */ 0xe6a496, 0xe6a497, 0xe6a498, 0xe6a499,
+ /* c8 */ 0xe6a49a, 0xe6a49b, 0xe6a49c, 0xe6a49d,
+ /* cc */ 0xe6a49e, 0xe6a4a1, 0xe6a4a2, 0xe6a4a3,
+ /* d0 */ 0xe6a4a5, 0xe6a4a6, 0xe6a4a7, 0xe6a4a8,
+ /* d4 */ 0xe6a4a9, 0xe6a4aa, 0xe6a4ab, 0xe6a4ac,
+ /* d8 */ 0xe6a4ae, 0xe6a4af, 0xe6a4b1, 0xe6a4b2,
+ /* dc */ 0xe6a4b3, 0xe6a4b5, 0xe6a4b6, 0xe6a4b7,
+ /* e0 */ 0xe6a4b8, 0xe6a4ba, 0xe6a4bb, 0xe6a4bc,
+ /* e4 */ 0xe6a4be, 0xe6a580, 0xe6a581, 0xe6a583,
+ /* e8 */ 0xe6a584, 0xe6a585, 0xe6a586, 0xe6a587,
+ /* ec */ 0xe6a588, 0xe6a589, 0xe6a58a, 0xe6a58b,
+ /* f0 */ 0xe6a58c, 0xe6a58d, 0xe6a58e, 0xe6a58f,
+ /* f4 */ 0xe6a590, 0xe6a591, 0xe6a592, 0xe6a593,
+ /* f8 */ 0xe6a595, 0xe6a596, 0xe6a598, 0xe6a599,
+ /* fc */ 0xe6a59b, 0xe6a59c, 0xe6a59f,
+
+ /*** Two byte table, leaf: 98xx - offset 0x01266 ***/
+
+ /* 40 */ 0xe6a5a1, 0xe6a5a2, 0xe6a5a4, 0xe6a5a5,
+ /* 44 */ 0xe6a5a7, 0xe6a5a8, 0xe6a5a9, 0xe6a5aa,
+ /* 48 */ 0xe6a5ac, 0xe6a5ad, 0xe6a5af, 0xe6a5b0,
+ /* 4c */ 0xe6a5b2, 0xe6a5b3, 0xe6a5b4, 0xe6a5b5,
+ /* 50 */ 0xe6a5b6, 0xe6a5ba, 0xe6a5bb, 0xe6a5bd,
+ /* 54 */ 0xe6a5be, 0xe6a5bf, 0xe6a681, 0xe6a683,
+ /* 58 */ 0xe6a685, 0xe6a68a, 0xe6a68b, 0xe6a68c,
+ /* 5c */ 0xe6a68e, 0xe6a68f, 0xe6a690, 0xe6a691,
+ /* 60 */ 0xe6a692, 0xe6a693, 0xe6a696, 0xe6a697,
+ /* 64 */ 0xe6a699, 0xe6a69a, 0xe6a69d, 0xe6a69e,
+ /* 68 */ 0xe6a69f, 0xe6a6a0, 0xe6a6a1, 0xe6a6a2,
+ /* 6c */ 0xe6a6a3, 0xe6a6a4, 0xe6a6a5, 0xe6a6a6,
+ /* 70 */ 0xe6a6a9, 0xe6a6aa, 0xe6a6ac, 0xe6a6ae,
+ /* 74 */ 0xe6a6af, 0xe6a6b0, 0xe6a6b2, 0xe6a6b3,
+ /* 78 */ 0xe6a6b5, 0xe6a6b6, 0xe6a6b8, 0xe6a6b9,
+ /* 7c */ 0xe6a6ba, 0xe6a6bc, 0xe6a6bd, 0x000000,
+ /* 80 */ 0xe6a6be, 0xe6a6bf, 0xe6a780, 0xe6a782,
+ /* 84 */ 0xe6a783, 0xe6a784, 0xe6a785, 0xe6a786,
+ /* 88 */ 0xe6a787, 0xe6a788, 0xe6a789, 0xe6a78b,
+ /* 8c */ 0xe6a78d, 0xe6a78f, 0xe6a791, 0xe6a792,
+ /* 90 */ 0xe6a793, 0xe6a795, 0xe6a796, 0xe6a797,
+ /* 94 */ 0xe6a798, 0xe6a799, 0xe6a79a, 0xe6a79c,
+ /* 98 */ 0xe6a79d, 0xe6a79e, 0xe6a7a1, 0xe6a7a2,
+ /* 9c */ 0xe6a7a3, 0xe6a7a4, 0xe6a7a5, 0xe6a7a6,
+ /* a0 */ 0xe6a7a7, 0xe6a7a8, 0xe6a7a9, 0xe6a7aa,
+ /* a4 */ 0xe6a7ab, 0xe6a7ac, 0xe6a7ae, 0xe6a7af,
+ /* a8 */ 0xe6a7b0, 0xe6a7b1, 0xe6a7b3, 0xe6a7b4,
+ /* ac */ 0xe6a7b5, 0xe6a7b6, 0xe6a7b7, 0xe6a7b8,
+ /* b0 */ 0xe6a7b9, 0xe6a7ba, 0xe6a7bb, 0xe6a7bc,
+ /* b4 */ 0xe6a7be, 0xe6a880, 0xe6a881, 0xe6a882,
+ /* b8 */ 0xe6a883, 0xe6a884, 0xe6a885, 0xe6a886,
+ /* bc */ 0xe6a887, 0xe6a888, 0xe6a889, 0xe6a88b,
+ /* c0 */ 0xe6a88c, 0xe6a88d, 0xe6a88e, 0xe6a88f,
+ /* c4 */ 0xe6a890, 0xe6a891, 0xe6a892, 0xe6a893,
+ /* c8 */ 0xe6a894, 0xe6a895, 0xe6a896, 0xe6a899,
+ /* cc */ 0xe6a89a, 0xe6a89b, 0xe6a89c, 0xe6a89d,
+ /* d0 */ 0xe6a89e, 0xe6a8a0, 0xe6a8a2, 0xe6a8a3,
+ /* d4 */ 0xe6a8a4, 0xe6a8a5, 0xe6a8a6, 0xe6a8a7,
+ /* d8 */ 0xe6a8a9, 0xe6a8ab, 0xe6a8ac, 0xe6a8ad,
+ /* dc */ 0xe6a8ae, 0xe6a8b0, 0xe6a8b2, 0xe6a8b3,
+ /* e0 */ 0xe6a8b4, 0xe6a8b6, 0xe6a8b7, 0xe6a8b8,
+ /* e4 */ 0xe6a8b9, 0xe6a8ba, 0xe6a8bb, 0xe6a8bc,
+ /* e8 */ 0xe6a8bf, 0xe6a980, 0xe6a981, 0xe6a982,
+ /* ec */ 0xe6a983, 0xe6a985, 0xe6a986, 0xe6a988,
+ /* f0 */ 0xe6a989, 0xe6a98a, 0xe6a98b, 0xe6a98c,
+ /* f4 */ 0xe6a98d, 0xe6a98e, 0xe6a98f, 0xe6a991,
+ /* f8 */ 0xe6a992, 0xe6a993, 0xe6a994, 0xe6a995,
+ /* fc */ 0xe6a996, 0xe6a997, 0xe6a99a,
+
+ /*** Two byte table, leaf: 99xx - offset 0x01325 ***/
+
+ /* 40 */ 0xe6a99c, 0xe6a99d, 0xe6a99e, 0xe6a99f,
+ /* 44 */ 0xe6a9a0, 0xe6a9a2, 0xe6a9a3, 0xe6a9a4,
+ /* 48 */ 0xe6a9a6, 0xe6a9a7, 0xe6a9a8, 0xe6a9a9,
+ /* 4c */ 0xe6a9aa, 0xe6a9ab, 0xe6a9ac, 0xe6a9ad,
+ /* 50 */ 0xe6a9ae, 0xe6a9af, 0xe6a9b0, 0xe6a9b2,
+ /* 54 */ 0xe6a9b3, 0xe6a9b4, 0xe6a9b5, 0xe6a9b6,
+ /* 58 */ 0xe6a9b7, 0xe6a9b8, 0xe6a9ba, 0xe6a9bb,
+ /* 5c */ 0xe6a9bd, 0xe6a9be, 0xe6a9bf, 0xe6aa81,
+ /* 60 */ 0xe6aa82, 0xe6aa83, 0xe6aa85, 0xe6aa86,
+ /* 64 */ 0xe6aa87, 0xe6aa88, 0xe6aa89, 0xe6aa8a,
+ /* 68 */ 0xe6aa8b, 0xe6aa8c, 0xe6aa8d, 0xe6aa8f,
+ /* 6c */ 0xe6aa92, 0xe6aa93, 0xe6aa94, 0xe6aa95,
+ /* 70 */ 0xe6aa96, 0xe6aa98, 0xe6aa99, 0xe6aa9a,
+ /* 74 */ 0xe6aa9b, 0xe6aa9c, 0xe6aa9d, 0xe6aa9e,
+ /* 78 */ 0xe6aa9f, 0xe6aaa1, 0xe6aaa2, 0xe6aaa3,
+ /* 7c */ 0xe6aaa4, 0xe6aaa5, 0xe6aaa6, 0x000000,
+ /* 80 */ 0xe6aaa7, 0xe6aaa8, 0xe6aaaa, 0xe6aaad,
+ /* 84 */ 0xe6aaae, 0xe6aaaf, 0xe6aab0, 0xe6aab1,
+ /* 88 */ 0xe6aab2, 0xe6aab3, 0xe6aab4, 0xe6aab5,
+ /* 8c */ 0xe6aab6, 0xe6aab7, 0xe6aab8, 0xe6aab9,
+ /* 90 */ 0xe6aaba, 0xe6aabb, 0xe6aabc, 0xe6aabd,
+ /* 94 */ 0xe6aabe, 0xe6aabf, 0xe6ab80, 0xe6ab81,
+ /* 98 */ 0xe6ab82, 0xe6ab83, 0xe6ab84, 0xe6ab85,
+ /* 9c */ 0xe6ab86, 0xe6ab87, 0xe6ab88, 0xe6ab89,
+ /* a0 */ 0xe6ab8a, 0xe6ab8b, 0xe6ab8c, 0xe6ab8d,
+ /* a4 */ 0xe6ab8e, 0xe6ab8f, 0xe6ab90, 0xe6ab91,
+ /* a8 */ 0xe6ab92, 0xe6ab93, 0xe6ab94, 0xe6ab95,
+ /* ac */ 0xe6ab96, 0xe6ab97, 0xe6ab98, 0xe6ab99,
+ /* b0 */ 0xe6ab9a, 0xe6ab9b, 0xe6ab9c, 0xe6ab9d,
+ /* b4 */ 0xe6ab9e, 0xe6ab9f, 0xe6aba0, 0xe6aba1,
+ /* b8 */ 0xe6aba2, 0xe6aba3, 0xe6aba4, 0xe6aba5,
+ /* bc */ 0xe6aba6, 0xe6aba7, 0xe6aba8, 0xe6aba9,
+ /* c0 */ 0xe6abaa, 0xe6abab, 0xe6abac, 0xe6abad,
+ /* c4 */ 0xe6abae, 0xe6abaf, 0xe6abb0, 0xe6abb1,
+ /* c8 */ 0xe6abb2, 0xe6abb3, 0xe6abb4, 0xe6abb5,
+ /* cc */ 0xe6abb6, 0xe6abb7, 0xe6abb8, 0xe6abb9,
+ /* d0 */ 0xe6abba, 0xe6abbb, 0xe6abbc, 0xe6abbd,
+ /* d4 */ 0xe6abbe, 0xe6abbf, 0xe6ac80, 0xe6ac81,
+ /* d8 */ 0xe6ac82, 0xe6ac83, 0xe6ac84, 0xe6ac85,
+ /* dc */ 0xe6ac86, 0xe6ac87, 0xe6ac88, 0xe6ac89,
+ /* e0 */ 0xe6ac8a, 0xe6ac8b, 0xe6ac8c, 0xe6ac8d,
+ /* e4 */ 0xe6ac8e, 0xe6ac8f, 0xe6ac90, 0xe6ac91,
+ /* e8 */ 0xe6ac92, 0xe6ac93, 0xe6ac94, 0xe6ac95,
+ /* ec */ 0xe6ac96, 0xe6ac97, 0xe6ac98, 0xe6ac99,
+ /* f0 */ 0xe6ac9a, 0xe6ac9b, 0xe6ac9c, 0xe6ac9d,
+ /* f4 */ 0xe6ac9e, 0xe6ac9f, 0xe6aca5, 0xe6aca6,
+ /* f8 */ 0xe6aca8, 0xe6aca9, 0xe6acaa, 0xe6acab,
+ /* fc */ 0xe6acac, 0xe6acad, 0xe6acae,
+
+ /*** Two byte table, leaf: 9axx - offset 0x013e4 ***/
+
+ /* 40 */ 0xe6acaf, 0xe6acb0, 0xe6acb1, 0xe6acb3,
+ /* 44 */ 0xe6acb4, 0xe6acb5, 0xe6acb6, 0xe6acb8,
+ /* 48 */ 0xe6acbb, 0xe6acbc, 0xe6acbd, 0xe6acbf,
+ /* 4c */ 0xe6ad80, 0xe6ad81, 0xe6ad82, 0xe6ad84,
+ /* 50 */ 0xe6ad85, 0xe6ad88, 0xe6ad8a, 0xe6ad8b,
+ /* 54 */ 0xe6ad8d, 0xe6ad8e, 0xe6ad8f, 0xe6ad90,
+ /* 58 */ 0xe6ad91, 0xe6ad92, 0xe6ad93, 0xe6ad94,
+ /* 5c */ 0xe6ad95, 0xe6ad96, 0xe6ad97, 0xe6ad98,
+ /* 60 */ 0xe6ad9a, 0xe6ad9b, 0xe6ad9c, 0xe6ad9d,
+ /* 64 */ 0xe6ad9e, 0xe6ad9f, 0xe6ada0, 0xe6ada1,
+ /* 68 */ 0xe6ada8, 0xe6ada9, 0xe6adab, 0xe6adac,
+ /* 6c */ 0xe6adad, 0xe6adae, 0xe6adaf, 0xe6adb0,
+ /* 70 */ 0xe6adb1, 0xe6adb2, 0xe6adb3, 0xe6adb4,
+ /* 74 */ 0xe6adb5, 0xe6adb6, 0xe6adb7, 0xe6adb8,
+ /* 78 */ 0xe6adba, 0xe6adbd, 0xe6adbe, 0xe6adbf,
+ /* 7c */ 0xe6ae80, 0xe6ae85, 0xe6ae88, 0x000000,
+ /* 80 */ 0xe6ae8c, 0xe6ae8e, 0xe6ae8f, 0xe6ae90,
+ /* 84 */ 0xe6ae91, 0xe6ae94, 0xe6ae95, 0xe6ae97,
+ /* 88 */ 0xe6ae98, 0xe6ae99, 0xe6ae9c, 0xe6ae9d,
+ /* 8c */ 0xe6ae9e, 0xe6ae9f, 0xe6aea0, 0xe6aea2,
+ /* 90 */ 0xe6aea3, 0xe6aea4, 0xe6aea5, 0xe6aea6,
+ /* 94 */ 0xe6aea7, 0xe6aea8, 0xe6aea9, 0xe6aeab,
+ /* 98 */ 0xe6aeac, 0xe6aead, 0xe6aeae, 0xe6aeaf,
+ /* 9c */ 0xe6aeb0, 0xe6aeb1, 0xe6aeb2, 0xe6aeb6,
+ /* a0 */ 0xe6aeb8, 0xe6aeb9, 0xe6aeba, 0xe6aebb,
+ /* a4 */ 0xe6aebc, 0xe6aebd, 0xe6aebe, 0xe6af80,
+ /* a8 */ 0xe6af83, 0xe6af84, 0xe6af86, 0xe6af87,
+ /* ac */ 0xe6af88, 0xe6af89, 0xe6af8a, 0xe6af8c,
+ /* b0 */ 0xe6af8e, 0xe6af90, 0xe6af91, 0xe6af98,
+ /* b4 */ 0xe6af9a, 0xe6af9c, 0xe6af9d, 0xe6af9e,
+ /* b8 */ 0xe6af9f, 0xe6afa0, 0xe6afa2, 0xe6afa3,
+ /* bc */ 0xe6afa4, 0xe6afa5, 0xe6afa6, 0xe6afa7,
+ /* c0 */ 0xe6afa8, 0xe6afa9, 0xe6afac, 0xe6afad,
+ /* c4 */ 0xe6afae, 0xe6afb0, 0xe6afb1, 0xe6afb2,
+ /* c8 */ 0xe6afb4, 0xe6afb6, 0xe6afb7, 0xe6afb8,
+ /* cc */ 0xe6afba, 0xe6afbb, 0xe6afbc, 0xe6afbe,
+ /* d0 */ 0xe6afbf, 0xe6b080, 0xe6b081, 0xe6b082,
+ /* d4 */ 0xe6b083, 0xe6b084, 0xe6b088, 0xe6b089,
+ /* d8 */ 0xe6b08a, 0xe6b08b, 0xe6b08c, 0xe6b08e,
+ /* dc */ 0xe6b092, 0xe6b097, 0xe6b09c, 0xe6b09d,
+ /* e0 */ 0xe6b09e, 0xe6b0a0, 0xe6b0a3, 0xe6b0a5,
+ /* e4 */ 0xe6b0ab, 0xe6b0ac, 0xe6b0ad, 0xe6b0b1,
+ /* e8 */ 0xe6b0b3, 0xe6b0b6, 0xe6b0b7, 0xe6b0b9,
+ /* ec */ 0xe6b0ba, 0xe6b0bb, 0xe6b0bc, 0xe6b0be,
+ /* f0 */ 0xe6b0bf, 0xe6b183, 0xe6b184, 0xe6b185,
+ /* f4 */ 0xe6b188, 0xe6b18b, 0xe6b18c, 0xe6b18d,
+ /* f8 */ 0xe6b18e, 0xe6b18f, 0xe6b191, 0xe6b192,
+ /* fc */ 0xe6b193, 0xe6b196, 0xe6b198,
+
+ /*** Two byte table, leaf: 9bxx - offset 0x014a3 ***/
+
+ /* 40 */ 0xe6b199, 0xe6b19a, 0xe6b1a2, 0xe6b1a3,
+ /* 44 */ 0xe6b1a5, 0xe6b1a6, 0xe6b1a7, 0xe6b1ab,
+ /* 48 */ 0xe6b1ac, 0xe6b1ad, 0xe6b1ae, 0xe6b1af,
+ /* 4c */ 0xe6b1b1, 0xe6b1b3, 0xe6b1b5, 0xe6b1b7,
+ /* 50 */ 0xe6b1b8, 0xe6b1ba, 0xe6b1bb, 0xe6b1bc,
+ /* 54 */ 0xe6b1bf, 0xe6b280, 0xe6b284, 0xe6b287,
+ /* 58 */ 0xe6b28a, 0xe6b28b, 0xe6b28d, 0xe6b28e,
+ /* 5c */ 0xe6b291, 0xe6b292, 0xe6b295, 0xe6b296,
+ /* 60 */ 0xe6b297, 0xe6b298, 0xe6b29a, 0xe6b29c,
+ /* 64 */ 0xe6b29d, 0xe6b29e, 0xe6b2a0, 0xe6b2a2,
+ /* 68 */ 0xe6b2a8, 0xe6b2ac, 0xe6b2af, 0xe6b2b0,
+ /* 6c */ 0xe6b2b4, 0xe6b2b5, 0xe6b2b6, 0xe6b2b7,
+ /* 70 */ 0xe6b2ba, 0xe6b380, 0xe6b381, 0xe6b382,
+ /* 74 */ 0xe6b383, 0xe6b386, 0xe6b387, 0xe6b388,
+ /* 78 */ 0xe6b38b, 0xe6b38d, 0xe6b38e, 0xe6b38f,
+ /* 7c */ 0xe6b391, 0xe6b392, 0xe6b398, 0x000000,
+ /* 80 */ 0xe6b399, 0xe6b39a, 0xe6b39c, 0xe6b39d,
+ /* 84 */ 0xe6b39f, 0xe6b3a4, 0xe6b3a6, 0xe6b3a7,
+ /* 88 */ 0xe6b3a9, 0xe6b3ac, 0xe6b3ad, 0xe6b3b2,
+ /* 8c */ 0xe6b3b4, 0xe6b3b9, 0xe6b3bf, 0xe6b480,
+ /* 90 */ 0xe6b482, 0xe6b483, 0xe6b485, 0xe6b486,
+ /* 94 */ 0xe6b488, 0xe6b489, 0xe6b48a, 0xe6b48d,
+ /* 98 */ 0xe6b48f, 0xe6b490, 0xe6b491, 0xe6b493,
+ /* 9c */ 0xe6b494, 0xe6b495, 0xe6b496, 0xe6b498,
+ /* a0 */ 0xe6b49c, 0xe6b49d, 0xe6b49f, 0xe6b4a0,
+ /* a4 */ 0xe6b4a1, 0xe6b4a2, 0xe6b4a3, 0xe6b4a4,
+ /* a8 */ 0xe6b4a6, 0xe6b4a8, 0xe6b4a9, 0xe6b4ac,
+ /* ac */ 0xe6b4ad, 0xe6b4af, 0xe6b4b0, 0xe6b4b4,
+ /* b0 */ 0xe6b4b6, 0xe6b4b7, 0xe6b4b8, 0xe6b4ba,
+ /* b4 */ 0xe6b4bf, 0xe6b580, 0xe6b582, 0xe6b584,
+ /* b8 */ 0xe6b589, 0xe6b58c, 0xe6b590, 0xe6b595,
+ /* bc */ 0xe6b596, 0xe6b597, 0xe6b598, 0xe6b59b,
+ /* c0 */ 0xe6b59d, 0xe6b59f, 0xe6b5a1, 0xe6b5a2,
+ /* c4 */ 0xe6b5a4, 0xe6b5a5, 0xe6b5a7, 0xe6b5a8,
+ /* c8 */ 0xe6b5ab, 0xe6b5ac, 0xe6b5ad, 0xe6b5b0,
+ /* cc */ 0xe6b5b1, 0xe6b5b2, 0xe6b5b3, 0xe6b5b5,
+ /* d0 */ 0xe6b5b6, 0xe6b5b9, 0xe6b5ba, 0xe6b5bb,
+ /* d4 */ 0xe6b5bd, 0xe6b5be, 0xe6b5bf, 0xe6b680,
+ /* d8 */ 0xe6b681, 0xe6b683, 0xe6b684, 0xe6b686,
+ /* dc */ 0xe6b687, 0xe6b68a, 0xe6b68b, 0xe6b68d,
+ /* e0 */ 0xe6b68f, 0xe6b690, 0xe6b692, 0xe6b696,
+ /* e4 */ 0xe6b697, 0xe6b698, 0xe6b699, 0xe6b69a,
+ /* e8 */ 0xe6b69c, 0xe6b6a2, 0xe6b6a5, 0xe6b6ac,
+ /* ec */ 0xe6b6ad, 0xe6b6b0, 0xe6b6b1, 0xe6b6b3,
+ /* f0 */ 0xe6b6b4, 0xe6b6b6, 0xe6b6b7, 0xe6b6b9,
+ /* f4 */ 0xe6b6ba, 0xe6b6bb, 0xe6b6bc, 0xe6b6bd,
+ /* f8 */ 0xe6b6be, 0xe6b781, 0xe6b782, 0xe6b783,
+ /* fc */ 0xe6b788, 0xe6b789, 0xe6b78a,
+
+ /*** Two byte table, leaf: 9cxx - offset 0x01562 ***/
+
+ /* 40 */ 0xe6b78d, 0xe6b78e, 0xe6b78f, 0xe6b790,
+ /* 44 */ 0xe6b792, 0xe6b793, 0xe6b794, 0xe6b795,
+ /* 48 */ 0xe6b797, 0xe6b79a, 0xe6b79b, 0xe6b79c,
+ /* 4c */ 0xe6b79f, 0xe6b7a2, 0xe6b7a3, 0xe6b7a5,
+ /* 50 */ 0xe6b7a7, 0xe6b7a8, 0xe6b7a9, 0xe6b7aa,
+ /* 54 */ 0xe6b7ad, 0xe6b7af, 0xe6b7b0, 0xe6b7b2,
+ /* 58 */ 0xe6b7b4, 0xe6b7b5, 0xe6b7b6, 0xe6b7b8,
+ /* 5c */ 0xe6b7ba, 0xe6b7bd, 0xe6b7be, 0xe6b7bf,
+ /* 60 */ 0xe6b880, 0xe6b881, 0xe6b882, 0xe6b883,
+ /* 64 */ 0xe6b884, 0xe6b886, 0xe6b887, 0xe6b888,
+ /* 68 */ 0xe6b889, 0xe6b88b, 0xe6b88f, 0xe6b892,
+ /* 6c */ 0xe6b893, 0xe6b895, 0xe6b898, 0xe6b899,
+ /* 70 */ 0xe6b89b, 0xe6b89c, 0xe6b89e, 0xe6b89f,
+ /* 74 */ 0xe6b8a2, 0xe6b8a6, 0xe6b8a7, 0xe6b8a8,
+ /* 78 */ 0xe6b8aa, 0xe6b8ac, 0xe6b8ae, 0xe6b8b0,
+ /* 7c */ 0xe6b8b1, 0xe6b8b3, 0xe6b8b5, 0x000000,
+ /* 80 */ 0xe6b8b6, 0xe6b8b7, 0xe6b8b9, 0xe6b8bb,
+ /* 84 */ 0xe6b8bc, 0xe6b8bd, 0xe6b8be, 0xe6b8bf,
+ /* 88 */ 0xe6b980, 0xe6b981, 0xe6b982, 0xe6b985,
+ /* 8c */ 0xe6b986, 0xe6b987, 0xe6b988, 0xe6b989,
+ /* 90 */ 0xe6b98a, 0xe6b98b, 0xe6b98c, 0xe6b98f,
+ /* 94 */ 0xe6b990, 0xe6b991, 0xe6b992, 0xe6b995,
+ /* 98 */ 0xe6b997, 0xe6b999, 0xe6b99a, 0xe6b99c,
+ /* 9c */ 0xe6b99d, 0xe6b99e, 0xe6b9a0, 0xe6b9a1,
+ /* a0 */ 0xe6b9a2, 0xe6b9a3, 0xe6b9a4, 0xe6b9a5,
+ /* a4 */ 0xe6b9a6, 0xe6b9a7, 0xe6b9a8, 0xe6b9a9,
+ /* a8 */ 0xe6b9aa, 0xe6b9ac, 0xe6b9ad, 0xe6b9af,
+ /* ac */ 0xe6b9b0, 0xe6b9b1, 0xe6b9b2, 0xe6b9b3,
+ /* b0 */ 0xe6b9b4, 0xe6b9b5, 0xe6b9b6, 0xe6b9b7,
+ /* b4 */ 0xe6b9b8, 0xe6b9b9, 0xe6b9ba, 0xe6b9bb,
+ /* b8 */ 0xe6b9bc, 0xe6b9bd, 0xe6ba80, 0xe6ba81,
+ /* bc */ 0xe6ba82, 0xe6ba84, 0xe6ba87, 0xe6ba88,
+ /* c0 */ 0xe6ba8a, 0xe6ba8b, 0xe6ba8c, 0xe6ba8d,
+ /* c4 */ 0xe6ba8e, 0xe6ba91, 0xe6ba92, 0xe6ba93,
+ /* c8 */ 0xe6ba94, 0xe6ba95, 0xe6ba96, 0xe6ba97,
+ /* cc */ 0xe6ba99, 0xe6ba9a, 0xe6ba9b, 0xe6ba9d,
+ /* d0 */ 0xe6ba9e, 0xe6baa0, 0xe6baa1, 0xe6baa3,
+ /* d4 */ 0xe6baa4, 0xe6baa6, 0xe6baa8, 0xe6baa9,
+ /* d8 */ 0xe6baab, 0xe6baac, 0xe6baad, 0xe6baae,
+ /* dc */ 0xe6bab0, 0xe6bab3, 0xe6bab5, 0xe6bab8,
+ /* e0 */ 0xe6bab9, 0xe6babc, 0xe6babe, 0xe6babf,
+ /* e4 */ 0xe6bb80, 0xe6bb83, 0xe6bb84, 0xe6bb85,
+ /* e8 */ 0xe6bb86, 0xe6bb88, 0xe6bb89, 0xe6bb8a,
+ /* ec */ 0xe6bb8c, 0xe6bb8d, 0xe6bb8e, 0xe6bb90,
+ /* f0 */ 0xe6bb92, 0xe6bb96, 0xe6bb98, 0xe6bb99,
+ /* f4 */ 0xe6bb9b, 0xe6bb9c, 0xe6bb9d, 0xe6bba3,
+ /* f8 */ 0xe6bba7, 0xe6bbaa, 0xe6bbab, 0xe6bbac,
+ /* fc */ 0xe6bbad, 0xe6bbae, 0xe6bbaf,
+
+ /*** Two byte table, leaf: 9dxx - offset 0x01621 ***/
+
+ /* 40 */ 0xe6bbb0, 0xe6bbb1, 0xe6bbb2, 0xe6bbb3,
+ /* 44 */ 0xe6bbb5, 0xe6bbb6, 0xe6bbb7, 0xe6bbb8,
+ /* 48 */ 0xe6bbba, 0xe6bbbb, 0xe6bbbc, 0xe6bbbd,
+ /* 4c */ 0xe6bbbe, 0xe6bbbf, 0xe6bc80, 0xe6bc81,
+ /* 50 */ 0xe6bc83, 0xe6bc84, 0xe6bc85, 0xe6bc87,
+ /* 54 */ 0xe6bc88, 0xe6bc8a, 0xe6bc8b, 0xe6bc8c,
+ /* 58 */ 0xe6bc8d, 0xe6bc8e, 0xe6bc90, 0xe6bc91,
+ /* 5c */ 0xe6bc92, 0xe6bc96, 0xe6bc97, 0xe6bc98,
+ /* 60 */ 0xe6bc99, 0xe6bc9a, 0xe6bc9b, 0xe6bc9c,
+ /* 64 */ 0xe6bc9d, 0xe6bc9e, 0xe6bc9f, 0xe6bca1,
+ /* 68 */ 0xe6bca2, 0xe6bca3, 0xe6bca5, 0xe6bca6,
+ /* 6c */ 0xe6bca7, 0xe6bca8, 0xe6bcac, 0xe6bcae,
+ /* 70 */ 0xe6bcb0, 0xe6bcb2, 0xe6bcb4, 0xe6bcb5,
+ /* 74 */ 0xe6bcb7, 0xe6bcb8, 0xe6bcb9, 0xe6bcba,
+ /* 78 */ 0xe6bcbb, 0xe6bcbc, 0xe6bcbd, 0xe6bcbf,
+ /* 7c */ 0xe6bd80, 0xe6bd81, 0xe6bd82, 0x000000,
+ /* 80 */ 0xe6bd83, 0xe6bd84, 0xe6bd85, 0xe6bd88,
+ /* 84 */ 0xe6bd89, 0xe6bd8a, 0xe6bd8c, 0xe6bd8e,
+ /* 88 */ 0xe6bd8f, 0xe6bd90, 0xe6bd91, 0xe6bd92,
+ /* 8c */ 0xe6bd93, 0xe6bd94, 0xe6bd95, 0xe6bd96,
+ /* 90 */ 0xe6bd97, 0xe6bd99, 0xe6bd9a, 0xe6bd9b,
+ /* 94 */ 0xe6bd9d, 0xe6bd9f, 0xe6bda0, 0xe6bda1,
+ /* 98 */ 0xe6bda3, 0xe6bda4, 0xe6bda5, 0xe6bda7,
+ /* 9c */ 0xe6bda8, 0xe6bda9, 0xe6bdaa, 0xe6bdab,
+ /* a0 */ 0xe6bdac, 0xe6bdaf, 0xe6bdb0, 0xe6bdb1,
+ /* a4 */ 0xe6bdb3, 0xe6bdb5, 0xe6bdb6, 0xe6bdb7,
+ /* a8 */ 0xe6bdb9, 0xe6bdbb, 0xe6bdbd, 0xe6bdbe,
+ /* ac */ 0xe6bdbf, 0xe6be80, 0xe6be81, 0xe6be82,
+ /* b0 */ 0xe6be83, 0xe6be85, 0xe6be86, 0xe6be87,
+ /* b4 */ 0xe6be8a, 0xe6be8b, 0xe6be8f, 0xe6be90,
+ /* b8 */ 0xe6be91, 0xe6be92, 0xe6be93, 0xe6be94,
+ /* bc */ 0xe6be95, 0xe6be96, 0xe6be97, 0xe6be98,
+ /* c0 */ 0xe6be99, 0xe6be9a, 0xe6be9b, 0xe6be9d,
+ /* c4 */ 0xe6be9e, 0xe6be9f, 0xe6bea0, 0xe6bea2,
+ /* c8 */ 0xe6bea3, 0xe6bea4, 0xe6bea5, 0xe6bea6,
+ /* cc */ 0xe6bea8, 0xe6bea9, 0xe6beaa, 0xe6beab,
+ /* d0 */ 0xe6beac, 0xe6bead, 0xe6beae, 0xe6beaf,
+ /* d4 */ 0xe6beb0, 0xe6beb1, 0xe6beb2, 0xe6beb4,
+ /* d8 */ 0xe6beb5, 0xe6beb7, 0xe6beb8, 0xe6beba,
+ /* dc */ 0xe6bebb, 0xe6bebc, 0xe6bebd, 0xe6bebe,
+ /* e0 */ 0xe6bebf, 0xe6bf81, 0xe6bf83, 0xe6bf84,
+ /* e4 */ 0xe6bf85, 0xe6bf86, 0xe6bf87, 0xe6bf88,
+ /* e8 */ 0xe6bf8a, 0xe6bf8b, 0xe6bf8c, 0xe6bf8d,
+ /* ec */ 0xe6bf8e, 0xe6bf8f, 0xe6bf90, 0xe6bf93,
+ /* f0 */ 0xe6bf94, 0xe6bf95, 0xe6bf96, 0xe6bf97,
+ /* f4 */ 0xe6bf98, 0xe6bf99, 0xe6bf9a, 0xe6bf9b,
+ /* f8 */ 0xe6bf9c, 0xe6bf9d, 0xe6bf9f, 0xe6bfa2,
+ /* fc */ 0xe6bfa3, 0xe6bfa4, 0xe6bfa5,
+
+ /*** Two byte table, leaf: 9exx - offset 0x016e0 ***/
+
+ /* 40 */ 0xe6bfa6, 0xe6bfa7, 0xe6bfa8, 0xe6bfa9,
+ /* 44 */ 0xe6bfaa, 0xe6bfab, 0xe6bfac, 0xe6bfad,
+ /* 48 */ 0xe6bfb0, 0xe6bfb1, 0xe6bfb2, 0xe6bfb3,
+ /* 4c */ 0xe6bfb4, 0xe6bfb5, 0xe6bfb6, 0xe6bfb7,
+ /* 50 */ 0xe6bfb8, 0xe6bfb9, 0xe6bfba, 0xe6bfbb,
+ /* 54 */ 0xe6bfbc, 0xe6bfbd, 0xe6bfbe, 0xe6bfbf,
+ /* 58 */ 0xe78080, 0xe78081, 0xe78082, 0xe78083,
+ /* 5c */ 0xe78084, 0xe78085, 0xe78086, 0xe78087,
+ /* 60 */ 0xe78088, 0xe78089, 0xe7808a, 0xe7808b,
+ /* 64 */ 0xe7808c, 0xe7808d, 0xe7808e, 0xe7808f,
+ /* 68 */ 0xe78090, 0xe78092, 0xe78093, 0xe78094,
+ /* 6c */ 0xe78095, 0xe78096, 0xe78097, 0xe78098,
+ /* 70 */ 0xe78099, 0xe7809c, 0xe7809d, 0xe7809e,
+ /* 74 */ 0xe7809f, 0xe780a0, 0xe780a1, 0xe780a2,
+ /* 78 */ 0xe780a4, 0xe780a5, 0xe780a6, 0xe780a7,
+ /* 7c */ 0xe780a8, 0xe780a9, 0xe780aa, 0x000000,
+ /* 80 */ 0xe780ab, 0xe780ac, 0xe780ad, 0xe780ae,
+ /* 84 */ 0xe780af, 0xe780b0, 0xe780b1, 0xe780b2,
+ /* 88 */ 0xe780b3, 0xe780b4, 0xe780b6, 0xe780b7,
+ /* 8c */ 0xe780b8, 0xe780ba, 0xe780bb, 0xe780bc,
+ /* 90 */ 0xe780bd, 0xe780be, 0xe780bf, 0xe78180,
+ /* 94 */ 0xe78181, 0xe78182, 0xe78183, 0xe78184,
+ /* 98 */ 0xe78185, 0xe78186, 0xe78187, 0xe78188,
+ /* 9c */ 0xe78189, 0xe7818a, 0xe7818b, 0xe7818d,
+ /* a0 */ 0xe7818e, 0xe78190, 0xe78191, 0xe78192,
+ /* a4 */ 0xe78193, 0xe78194, 0xe78195, 0xe78196,
+ /* a8 */ 0xe78197, 0xe78198, 0xe78199, 0xe7819a,
+ /* ac */ 0xe7819b, 0xe7819c, 0xe7819d, 0xe7819f,
+ /* b0 */ 0xe781a0, 0xe781a1, 0xe781a2, 0xe781a3,
+ /* b4 */ 0xe781a4, 0xe781a5, 0xe781a6, 0xe781a7,
+ /* b8 */ 0xe781a8, 0xe781a9, 0xe781aa, 0xe781ae,
+ /* bc */ 0xe781b1, 0xe781b2, 0xe781b3, 0xe781b4,
+ /* c0 */ 0xe781b7, 0xe781b9, 0xe781ba, 0xe781bb,
+ /* c4 */ 0xe781bd, 0xe78281, 0xe78282, 0xe78283,
+ /* c8 */ 0xe78284, 0xe78286, 0xe78287, 0xe78288,
+ /* cc */ 0xe7828b, 0xe7828c, 0xe7828d, 0xe7828f,
+ /* d0 */ 0xe78290, 0xe78291, 0xe78293, 0xe78297,
+ /* d4 */ 0xe78298, 0xe7829a, 0xe7829b, 0xe7829e,
+ /* d8 */ 0xe7829f, 0xe782a0, 0xe782a1, 0xe782a2,
+ /* dc */ 0xe782a3, 0xe782a4, 0xe782a5, 0xe782a6,
+ /* e0 */ 0xe782a7, 0xe782a8, 0xe782a9, 0xe782aa,
+ /* e4 */ 0xe782b0, 0xe782b2, 0xe782b4, 0xe782b5,
+ /* e8 */ 0xe782b6, 0xe782ba, 0xe782be, 0xe782bf,
+ /* ec */ 0xe78384, 0xe78385, 0xe78386, 0xe78387,
+ /* f0 */ 0xe78389, 0xe7838b, 0xe7838c, 0xe7838d,
+ /* f4 */ 0xe7838e, 0xe7838f, 0xe78390, 0xe78391,
+ /* f8 */ 0xe78392, 0xe78393, 0xe78394, 0xe78395,
+ /* fc */ 0xe78396, 0xe78397, 0xe7839a,
+
+ /*** Two byte table, leaf: 9fxx - offset 0x0179f ***/
+
+ /* 40 */ 0xe7839c, 0xe7839d, 0xe7839e, 0xe783a0,
+ /* 44 */ 0xe783a1, 0xe783a2, 0xe783a3, 0xe783a5,
+ /* 48 */ 0xe783aa, 0xe783ae, 0xe783b0, 0xe783b1,
+ /* 4c */ 0xe783b2, 0xe783b3, 0xe783b4, 0xe783b5,
+ /* 50 */ 0xe783b6, 0xe783b8, 0xe783ba, 0xe783bb,
+ /* 54 */ 0xe783bc, 0xe783be, 0xe783bf, 0xe78480,
+ /* 58 */ 0xe78481, 0xe78482, 0xe78483, 0xe78484,
+ /* 5c */ 0xe78485, 0xe78486, 0xe78487, 0xe78488,
+ /* 60 */ 0xe7848b, 0xe7848c, 0xe7848d, 0xe7848e,
+ /* 64 */ 0xe7848f, 0xe78491, 0xe78492, 0xe78494,
+ /* 68 */ 0xe78497, 0xe7849b, 0xe7849c, 0xe7849d,
+ /* 6c */ 0xe7849e, 0xe7849f, 0xe784a0, 0xe784a1,
+ /* 70 */ 0xe784a2, 0xe784a3, 0xe784a4, 0xe784a5,
+ /* 74 */ 0xe784a7, 0xe784a8, 0xe784a9, 0xe784aa,
+ /* 78 */ 0xe784ab, 0xe784ac, 0xe784ad, 0xe784ae,
+ /* 7c */ 0xe784b2, 0xe784b3, 0xe784b4, 0x000000,
+ /* 80 */ 0xe784b5, 0xe784b7, 0xe784b8, 0xe784b9,
+ /* 84 */ 0xe784ba, 0xe784bb, 0xe784bc, 0xe784bd,
+ /* 88 */ 0xe784be, 0xe784bf, 0xe78580, 0xe78581,
+ /* 8c */ 0xe78582, 0xe78583, 0xe78584, 0xe78586,
+ /* 90 */ 0xe78587, 0xe78588, 0xe78589, 0xe7858b,
+ /* 94 */ 0xe7858d, 0xe7858f, 0xe78590, 0xe78591,
+ /* 98 */ 0xe78592, 0xe78593, 0xe78594, 0xe78595,
+ /* 9c */ 0xe78596, 0xe78597, 0xe78598, 0xe78599,
+ /* a0 */ 0xe7859a, 0xe7859b, 0xe7859d, 0xe7859f,
+ /* a4 */ 0xe785a0, 0xe785a1, 0xe785a2, 0xe785a3,
+ /* a8 */ 0xe785a5, 0xe785a9, 0xe785aa, 0xe785ab,
+ /* ac */ 0xe785ac, 0xe785ad, 0xe785af, 0xe785b0,
+ /* b0 */ 0xe785b1, 0xe785b4, 0xe785b5, 0xe785b6,
+ /* b4 */ 0xe785b7, 0xe785b9, 0xe785bb, 0xe785bc,
+ /* b8 */ 0xe785be, 0xe785bf, 0xe78680, 0xe78681,
+ /* bc */ 0xe78682, 0xe78683, 0xe78685, 0xe78686,
+ /* c0 */ 0xe78687, 0xe78688, 0xe78689, 0xe7868b,
+ /* c4 */ 0xe7868c, 0xe7868d, 0xe7868e, 0xe78690,
+ /* c8 */ 0xe78691, 0xe78692, 0xe78693, 0xe78695,
+ /* cc */ 0xe78696, 0xe78697, 0xe7869a, 0xe7869b,
+ /* d0 */ 0xe7869c, 0xe7869d, 0xe7869e, 0xe786a1,
+ /* d4 */ 0xe786a2, 0xe786a3, 0xe786a4, 0xe786a5,
+ /* d8 */ 0xe786a6, 0xe786a7, 0xe786a9, 0xe786aa,
+ /* dc */ 0xe786ab, 0xe786ad, 0xe786ae, 0xe786af,
+ /* e0 */ 0xe786b0, 0xe786b1, 0xe786b2, 0xe786b4,
+ /* e4 */ 0xe786b6, 0xe786b7, 0xe786b8, 0xe786ba,
+ /* e8 */ 0xe786bb, 0xe786bc, 0xe786bd, 0xe786be,
+ /* ec */ 0xe786bf, 0xe78780, 0xe78781, 0xe78782,
+ /* f0 */ 0xe78784, 0xe78785, 0xe78786, 0xe78787,
+ /* f4 */ 0xe78788, 0xe78789, 0xe7878a, 0xe7878b,
+ /* f8 */ 0xe7878c, 0xe7878d, 0xe7878f, 0xe78790,
+ /* fc */ 0xe78791, 0xe78792, 0xe78793,
+
+ /*** Two byte table, leaf: a0xx - offset 0x0185e ***/
+
+ /* 40 */ 0xe78796, 0xe78797, 0xe78798, 0xe78799,
+ /* 44 */ 0xe7879a, 0xe7879b, 0xe7879c, 0xe7879d,
+ /* 48 */ 0xe7879e, 0xe7879f, 0xe787a1, 0xe787a2,
+ /* 4c */ 0xe787a3, 0xe787a4, 0xe787a6, 0xe787a8,
+ /* 50 */ 0xe787a9, 0xe787aa, 0xe787ab, 0xe787ac,
+ /* 54 */ 0xe787ad, 0xe787af, 0xe787b0, 0xe787b1,
+ /* 58 */ 0xe787b2, 0xe787b3, 0xe787b4, 0xe787b5,
+ /* 5c */ 0xe787b6, 0xe787b7, 0xe787b8, 0xe787ba,
+ /* 60 */ 0xe787bb, 0xe787bc, 0xe787bd, 0xe787be,
+ /* 64 */ 0xe787bf, 0xe78880, 0xe78881, 0xe78882,
+ /* 68 */ 0xe78883, 0xe78884, 0xe78885, 0xe78887,
+ /* 6c */ 0xe78888, 0xe78889, 0xe7888a, 0xe7888b,
+ /* 70 */ 0xe7888c, 0xe7888d, 0xe7888e, 0xe7888f,
+ /* 74 */ 0xe78890, 0xe78891, 0xe78892, 0xe78893,
+ /* 78 */ 0xe78894, 0xe78895, 0xe78896, 0xe78897,
+ /* 7c */ 0xe78898, 0xe78899, 0xe7889a, 0x000000,
+ /* 80 */ 0xe7889b, 0xe7889c, 0xe7889e, 0xe7889f,
+ /* 84 */ 0xe788a0, 0xe788a1, 0xe788a2, 0xe788a3,
+ /* 88 */ 0xe788a4, 0xe788a5, 0xe788a6, 0xe788a7,
+ /* 8c */ 0xe788a9, 0xe788ab, 0xe788ad, 0xe788ae,
+ /* 90 */ 0xe788af, 0xe788b2, 0xe788b3, 0xe788b4,
+ /* 94 */ 0xe788ba, 0xe788bc, 0xe788be, 0xe78980,
+ /* 98 */ 0xe78981, 0xe78982, 0xe78983, 0xe78984,
+ /* 9c */ 0xe78985, 0xe78986, 0xe78989, 0xe7898a,
+ /* a0 */ 0xe7898b, 0xe7898e, 0xe7898f, 0xe78990,
+ /* a4 */ 0xe78991, 0xe78993, 0xe78994, 0xe78995,
+ /* a8 */ 0xe78997, 0xe78998, 0xe7899a, 0xe7899c,
+ /* ac */ 0xe7899e, 0xe789a0, 0xe789a3, 0xe789a4,
+ /* b0 */ 0xe789a5, 0xe789a8, 0xe789aa, 0xe789ab,
+ /* b4 */ 0xe789ac, 0xe789ad, 0xe789b0, 0xe789b1,
+ /* b8 */ 0xe789b3, 0xe789b4, 0xe789b6, 0xe789b7,
+ /* bc */ 0xe789b8, 0xe789bb, 0xe789bc, 0xe789bd,
+ /* c0 */ 0xe78a82, 0xe78a83, 0xe78a85, 0xe78a86,
+ /* c4 */ 0xe78a87, 0xe78a88, 0xe78a89, 0xe78a8c,
+ /* c8 */ 0xe78a8e, 0xe78a90, 0xe78a91, 0xe78a93,
+ /* cc */ 0xe78a94, 0xe78a95, 0xe78a96, 0xe78a97,
+ /* d0 */ 0xe78a98, 0xe78a99, 0xe78a9a, 0xe78a9b,
+ /* d4 */ 0xe78a9c, 0xe78a9d, 0xe78a9e, 0xe78aa0,
+ /* d8 */ 0xe78aa1, 0xe78aa2, 0xe78aa3, 0xe78aa4,
+ /* dc */ 0xe78aa5, 0xe78aa6, 0xe78aa7, 0xe78aa8,
+ /* e0 */ 0xe78aa9, 0xe78aaa, 0xe78aab, 0xe78aae,
+ /* e4 */ 0xe78ab1, 0xe78ab2, 0xe78ab3, 0xe78ab5,
+ /* e8 */ 0xe78aba, 0xe78abb, 0xe78abc, 0xe78abd,
+ /* ec */ 0xe78abe, 0xe78abf, 0xe78b80, 0xe78b85,
+ /* f0 */ 0xe78b86, 0xe78b87, 0xe78b89, 0xe78b8a,
+ /* f4 */ 0xe78b8b, 0xe78b8c, 0xe78b8f, 0xe78b91,
+ /* f8 */ 0xe78b93, 0xe78b94, 0xe78b95, 0xe78b96,
+ /* fc */ 0xe78b98, 0xe78b9a, 0xe78b9b,
+
+ /*** Two byte table, leaf: a1xx - offset 0x0191d ***/
+
+ /* 40 */ 0xee9386, 0xee9387, 0xee9388, 0xee9389,
+ /* 44 */ 0xee938a, 0xee938b, 0xee938c, 0xee938d,
+ /* 48 */ 0xee938e, 0xee938f, 0xee9390, 0xee9391,
+ /* 4c */ 0xee9392, 0xee9393, 0xee9394, 0xee9395,
+ /* 50 */ 0xee9396, 0xee9397, 0xee9398, 0xee9399,
+ /* 54 */ 0xee939a, 0xee939b, 0xee939c, 0xee939d,
+ /* 58 */ 0xee939e, 0xee939f, 0xee93a0, 0xee93a1,
+ /* 5c */ 0xee93a2, 0xee93a3, 0xee93a4, 0xee93a5,
+ /* 60 */ 0xee93a6, 0xee93a7, 0xee93a8, 0xee93a9,
+ /* 64 */ 0xee93aa, 0xee93ab, 0xee93ac, 0xee93ad,
+ /* 68 */ 0xee93ae, 0xee93af, 0xee93b0, 0xee93b1,
+ /* 6c */ 0xee93b2, 0xee93b3, 0xee93b4, 0xee93b5,
+ /* 70 */ 0xee93b6, 0xee93b7, 0xee93b8, 0xee93b9,
+ /* 74 */ 0xee93ba, 0xee93bb, 0xee93bc, 0xee93bd,
+ /* 78 */ 0xee93be, 0xee93bf, 0xee9480, 0xee9481,
+ /* 7c */ 0xee9482, 0xee9483, 0xee9484, 0x000000,
+ /* 80 */ 0xee9485, 0xee9486, 0xee9487, 0xee9488,
+ /* 84 */ 0xee9489, 0xee948a, 0xee948b, 0xee948c,
+ /* 88 */ 0xee948d, 0xee948e, 0xee948f, 0xee9490,
+ /* 8c */ 0xee9491, 0xee9492, 0xee9493, 0xee9494,
+ /* 90 */ 0xee9495, 0xee9496, 0xee9497, 0xee9498,
+ /* 94 */ 0xee9499, 0xee949a, 0xee949b, 0xee949c,
+ /* 98 */ 0xee949d, 0xee949e, 0xee949f, 0xee94a0,
+ /* 9c */ 0xee94a1, 0xee94a2, 0xee94a3, 0xee94a4,
+ /* a0 */ 0xee94a5, 0xe38080, 0xe38081, 0xe38082,
+ /* a4 */ 0x00c2b7, 0x00cb89, 0x00cb87, 0x00c2a8,
+ /* a8 */ 0xe38083, 0xe38085, 0xe28094, 0xefbd9e,
+ /* ac */ 0xe28096, 0xe280a6, 0xe28098, 0xe28099,
+ /* b0 */ 0xe2809c, 0xe2809d, 0xe38094, 0xe38095,
+ /* b4 */ 0xe38088, 0xe38089, 0xe3808a, 0xe3808b,
+ /* b8 */ 0xe3808c, 0xe3808d, 0xe3808e, 0xe3808f,
+ /* bc */ 0xe38096, 0xe38097, 0xe38090, 0xe38091,
+ /* c0 */ 0x00c2b1, 0x00c397, 0x00c3b7, 0xe288b6,
+ /* c4 */ 0xe288a7, 0xe288a8, 0xe28891, 0xe2888f,
+ /* c8 */ 0xe288aa, 0xe288a9, 0xe28888, 0xe288b7,
+ /* cc */ 0xe2889a, 0xe28aa5, 0xe288a5, 0xe288a0,
+ /* d0 */ 0xe28c92, 0xe28a99, 0xe288ab, 0xe288ae,
+ /* d4 */ 0xe289a1, 0xe2898c, 0xe28988, 0xe288bd,
+ /* d8 */ 0xe2889d, 0xe289a0, 0xe289ae, 0xe289af,
+ /* dc */ 0xe289a4, 0xe289a5, 0xe2889e, 0xe288b5,
+ /* e0 */ 0xe288b4, 0xe29982, 0xe29980, 0x00c2b0,
+ /* e4 */ 0xe280b2, 0xe280b3, 0xe28483, 0xefbc84,
+ /* e8 */ 0x00c2a4, 0xefbfa0, 0xefbfa1, 0xe280b0,
+ /* ec */ 0x00c2a7, 0xe28496, 0xe29886, 0xe29885,
+ /* f0 */ 0xe2978b, 0xe2978f, 0xe2978e, 0xe29787,
+ /* f4 */ 0xe29786, 0xe296a1, 0xe296a0, 0xe296b3,
+ /* f8 */ 0xe296b2, 0xe280bb, 0xe28692, 0xe28690,
+ /* fc */ 0xe28691, 0xe28693, 0xe38093,
+
+ /*** Two byte table, leaf: a2xx - offset 0x019dc ***/
+
+ /* 40 */ 0xee94a6, 0xee94a7, 0xee94a8, 0xee94a9,
+ /* 44 */ 0xee94aa, 0xee94ab, 0xee94ac, 0xee94ad,
+ /* 48 */ 0xee94ae, 0xee94af, 0xee94b0, 0xee94b1,
+ /* 4c */ 0xee94b2, 0xee94b3, 0xee94b4, 0xee94b5,
+ /* 50 */ 0xee94b6, 0xee94b7, 0xee94b8, 0xee94b9,
+ /* 54 */ 0xee94ba, 0xee94bb, 0xee94bc, 0xee94bd,
+ /* 58 */ 0xee94be, 0xee94bf, 0xee9580, 0xee9581,
+ /* 5c */ 0xee9582, 0xee9583, 0xee9584, 0xee9585,
+ /* 60 */ 0xee9586, 0xee9587, 0xee9588, 0xee9589,
+ /* 64 */ 0xee958a, 0xee958b, 0xee958c, 0xee958d,
+ /* 68 */ 0xee958e, 0xee958f, 0xee9590, 0xee9591,
+ /* 6c */ 0xee9592, 0xee9593, 0xee9594, 0xee9595,
+ /* 70 */ 0xee9596, 0xee9597, 0xee9598, 0xee9599,
+ /* 74 */ 0xee959a, 0xee959b, 0xee959c, 0xee959d,
+ /* 78 */ 0xee959e, 0xee959f, 0xee95a0, 0xee95a1,
+ /* 7c */ 0xee95a2, 0xee95a3, 0xee95a4, 0x000000,
+ /* 80 */ 0xee95a5, 0xee95a6, 0xee95a7, 0xee95a8,
+ /* 84 */ 0xee95a9, 0xee95aa, 0xee95ab, 0xee95ac,
+ /* 88 */ 0xee95ad, 0xee95ae, 0xee95af, 0xee95b0,
+ /* 8c */ 0xee95b1, 0xee95b2, 0xee95b3, 0xee95b4,
+ /* 90 */ 0xee95b5, 0xee95b6, 0xee95b7, 0xee95b8,
+ /* 94 */ 0xee95b9, 0xee95ba, 0xee95bb, 0xee95bc,
+ /* 98 */ 0xee95bd, 0xee95be, 0xee95bf, 0xee9680,
+ /* 9c */ 0xee9681, 0xee9682, 0xee9683, 0xee9684,
+ /* a0 */ 0xee9685, 0xe285b0, 0xe285b1, 0xe285b2,
+ /* a4 */ 0xe285b3, 0xe285b4, 0xe285b5, 0xe285b6,
+ /* a8 */ 0xe285b7, 0xe285b8, 0xe285b9, 0xee9da6,
+ /* ac */ 0xee9da7, 0xee9da8, 0xee9da9, 0xee9daa,
+ /* b0 */ 0xee9dab, 0xe29288, 0xe29289, 0xe2928a,
+ /* b4 */ 0xe2928b, 0xe2928c, 0xe2928d, 0xe2928e,
+ /* b8 */ 0xe2928f, 0xe29290, 0xe29291, 0xe29292,
+ /* bc */ 0xe29293, 0xe29294, 0xe29295, 0xe29296,
+ /* c0 */ 0xe29297, 0xe29298, 0xe29299, 0xe2929a,
+ /* c4 */ 0xe2929b, 0xe291b4, 0xe291b5, 0xe291b6,
+ /* c8 */ 0xe291b7, 0xe291b8, 0xe291b9, 0xe291ba,
+ /* cc */ 0xe291bb, 0xe291bc, 0xe291bd, 0xe291be,
+ /* d0 */ 0xe291bf, 0xe29280, 0xe29281, 0xe29282,
+ /* d4 */ 0xe29283, 0xe29284, 0xe29285, 0xe29286,
+ /* d8 */ 0xe29287, 0xe291a0, 0xe291a1, 0xe291a2,
+ /* dc */ 0xe291a3, 0xe291a4, 0xe291a5, 0xe291a6,
+ /* e0 */ 0xe291a7, 0xe291a8, 0xe291a9, 0xe282ac,
+ /* e4 */ 0xee9dad, 0xe388a0, 0xe388a1, 0xe388a2,
+ /* e8 */ 0xe388a3, 0xe388a4, 0xe388a5, 0xe388a6,
+ /* ec */ 0xe388a7, 0xe388a8, 0xe388a9, 0xee9dae,
+ /* f0 */ 0xee9daf, 0xe285a0, 0xe285a1, 0xe285a2,
+ /* f4 */ 0xe285a3, 0xe285a4, 0xe285a5, 0xe285a6,
+ /* f8 */ 0xe285a7, 0xe285a8, 0xe285a9, 0xe285aa,
+ /* fc */ 0xe285ab, 0xee9db0, 0xee9db1,
+
+ /*** Two byte table, leaf: a3xx - offset 0x01a9b ***/
+
+ /* 40 */ 0xee9686, 0xee9687, 0xee9688, 0xee9689,
+ /* 44 */ 0xee968a, 0xee968b, 0xee968c, 0xee968d,
+ /* 48 */ 0xee968e, 0xee968f, 0xee9690, 0xee9691,
+ /* 4c */ 0xee9692, 0xee9693, 0xee9694, 0xee9695,
+ /* 50 */ 0xee9696, 0xee9697, 0xee9698, 0xee9699,
+ /* 54 */ 0xee969a, 0xee969b, 0xee969c, 0xee969d,
+ /* 58 */ 0xee969e, 0xee969f, 0xee96a0, 0xee96a1,
+ /* 5c */ 0xee96a2, 0xee96a3, 0xee96a4, 0xee96a5,
+ /* 60 */ 0xee96a6, 0xee96a7, 0xee96a8, 0xee96a9,
+ /* 64 */ 0xee96aa, 0xee96ab, 0xee96ac, 0xee96ad,
+ /* 68 */ 0xee96ae, 0xee96af, 0xee96b0, 0xee96b1,
+ /* 6c */ 0xee96b2, 0xee96b3, 0xee96b4, 0xee96b5,
+ /* 70 */ 0xee96b6, 0xee96b7, 0xee96b8, 0xee96b9,
+ /* 74 */ 0xee96ba, 0xee96bb, 0xee96bc, 0xee96bd,
+ /* 78 */ 0xee96be, 0xee96bf, 0xee9780, 0xee9781,
+ /* 7c */ 0xee9782, 0xee9783, 0xee9784, 0x000000,
+ /* 80 */ 0xee9785, 0xee9786, 0xee9787, 0xee9788,
+ /* 84 */ 0xee9789, 0xee978a, 0xee978b, 0xee978c,
+ /* 88 */ 0xee978d, 0xee978e, 0xee978f, 0xee9790,
+ /* 8c */ 0xee9791, 0xee9792, 0xee9793, 0xee9794,
+ /* 90 */ 0xee9795, 0xee9796, 0xee9797, 0xee9798,
+ /* 94 */ 0xee9799, 0xee979a, 0xee979b, 0xee979c,
+ /* 98 */ 0xee979d, 0xee979e, 0xee979f, 0xee97a0,
+ /* 9c */ 0xee97a1, 0xee97a2, 0xee97a3, 0xee97a4,
+ /* a0 */ 0xee97a5, 0xefbc81, 0xefbc82, 0xefbc83,
+ /* a4 */ 0xefbfa5, 0xefbc85, 0xefbc86, 0xefbc87,
+ /* a8 */ 0xefbc88, 0xefbc89, 0xefbc8a, 0xefbc8b,
+ /* ac */ 0xefbc8c, 0xefbc8d, 0xefbc8e, 0xefbc8f,
+ /* b0 */ 0xefbc90, 0xefbc91, 0xefbc92, 0xefbc93,
+ /* b4 */ 0xefbc94, 0xefbc95, 0xefbc96, 0xefbc97,
+ /* b8 */ 0xefbc98, 0xefbc99, 0xefbc9a, 0xefbc9b,
+ /* bc */ 0xefbc9c, 0xefbc9d, 0xefbc9e, 0xefbc9f,
+ /* c0 */ 0xefbca0, 0xefbca1, 0xefbca2, 0xefbca3,
+ /* c4 */ 0xefbca4, 0xefbca5, 0xefbca6, 0xefbca7,
+ /* c8 */ 0xefbca8, 0xefbca9, 0xefbcaa, 0xefbcab,
+ /* cc */ 0xefbcac, 0xefbcad, 0xefbcae, 0xefbcaf,
+ /* d0 */ 0xefbcb0, 0xefbcb1, 0xefbcb2, 0xefbcb3,
+ /* d4 */ 0xefbcb4, 0xefbcb5, 0xefbcb6, 0xefbcb7,
+ /* d8 */ 0xefbcb8, 0xefbcb9, 0xefbcba, 0xefbcbb,
+ /* dc */ 0xefbcbc, 0xefbcbd, 0xefbcbe, 0xefbcbf,
+ /* e0 */ 0xefbd80, 0xefbd81, 0xefbd82, 0xefbd83,
+ /* e4 */ 0xefbd84, 0xefbd85, 0xefbd86, 0xefbd87,
+ /* e8 */ 0xefbd88, 0xefbd89, 0xefbd8a, 0xefbd8b,
+ /* ec */ 0xefbd8c, 0xefbd8d, 0xefbd8e, 0xefbd8f,
+ /* f0 */ 0xefbd90, 0xefbd91, 0xefbd92, 0xefbd93,
+ /* f4 */ 0xefbd94, 0xefbd95, 0xefbd96, 0xefbd97,
+ /* f8 */ 0xefbd98, 0xefbd99, 0xefbd9a, 0xefbd9b,
+ /* fc */ 0xefbd9c, 0xefbd9d, 0xefbfa3,
+
+ /*** Two byte table, leaf: a4xx - offset 0x01b5a ***/
+
+ /* 40 */ 0xee97a6, 0xee97a7, 0xee97a8, 0xee97a9,
+ /* 44 */ 0xee97aa, 0xee97ab, 0xee97ac, 0xee97ad,
+ /* 48 */ 0xee97ae, 0xee97af, 0xee97b0, 0xee97b1,
+ /* 4c */ 0xee97b2, 0xee97b3, 0xee97b4, 0xee97b5,
+ /* 50 */ 0xee97b6, 0xee97b7, 0xee97b8, 0xee97b9,
+ /* 54 */ 0xee97ba, 0xee97bb, 0xee97bc, 0xee97bd,
+ /* 58 */ 0xee97be, 0xee97bf, 0xee9880, 0xee9881,
+ /* 5c */ 0xee9882, 0xee9883, 0xee9884, 0xee9885,
+ /* 60 */ 0xee9886, 0xee9887, 0xee9888, 0xee9889,
+ /* 64 */ 0xee988a, 0xee988b, 0xee988c, 0xee988d,
+ /* 68 */ 0xee988e, 0xee988f, 0xee9890, 0xee9891,
+ /* 6c */ 0xee9892, 0xee9893, 0xee9894, 0xee9895,
+ /* 70 */ 0xee9896, 0xee9897, 0xee9898, 0xee9899,
+ /* 74 */ 0xee989a, 0xee989b, 0xee989c, 0xee989d,
+ /* 78 */ 0xee989e, 0xee989f, 0xee98a0, 0xee98a1,
+ /* 7c */ 0xee98a2, 0xee98a3, 0xee98a4, 0x000000,
+ /* 80 */ 0xee98a5, 0xee98a6, 0xee98a7, 0xee98a8,
+ /* 84 */ 0xee98a9, 0xee98aa, 0xee98ab, 0xee98ac,
+ /* 88 */ 0xee98ad, 0xee98ae, 0xee98af, 0xee98b0,
+ /* 8c */ 0xee98b1, 0xee98b2, 0xee98b3, 0xee98b4,
+ /* 90 */ 0xee98b5, 0xee98b6, 0xee98b7, 0xee98b8,
+ /* 94 */ 0xee98b9, 0xee98ba, 0xee98bb, 0xee98bc,
+ /* 98 */ 0xee98bd, 0xee98be, 0xee98bf, 0xee9980,
+ /* 9c */ 0xee9981, 0xee9982, 0xee9983, 0xee9984,
+ /* a0 */ 0xee9985, 0xe38181, 0xe38182, 0xe38183,
+ /* a4 */ 0xe38184, 0xe38185, 0xe38186, 0xe38187,
+ /* a8 */ 0xe38188, 0xe38189, 0xe3818a, 0xe3818b,
+ /* ac */ 0xe3818c, 0xe3818d, 0xe3818e, 0xe3818f,
+ /* b0 */ 0xe38190, 0xe38191, 0xe38192, 0xe38193,
+ /* b4 */ 0xe38194, 0xe38195, 0xe38196, 0xe38197,
+ /* b8 */ 0xe38198, 0xe38199, 0xe3819a, 0xe3819b,
+ /* bc */ 0xe3819c, 0xe3819d, 0xe3819e, 0xe3819f,
+ /* c0 */ 0xe381a0, 0xe381a1, 0xe381a2, 0xe381a3,
+ /* c4 */ 0xe381a4, 0xe381a5, 0xe381a6, 0xe381a7,
+ /* c8 */ 0xe381a8, 0xe381a9, 0xe381aa, 0xe381ab,
+ /* cc */ 0xe381ac, 0xe381ad, 0xe381ae, 0xe381af,
+ /* d0 */ 0xe381b0, 0xe381b1, 0xe381b2, 0xe381b3,
+ /* d4 */ 0xe381b4, 0xe381b5, 0xe381b6, 0xe381b7,
+ /* d8 */ 0xe381b8, 0xe381b9, 0xe381ba, 0xe381bb,
+ /* dc */ 0xe381bc, 0xe381bd, 0xe381be, 0xe381bf,
+ /* e0 */ 0xe38280, 0xe38281, 0xe38282, 0xe38283,
+ /* e4 */ 0xe38284, 0xe38285, 0xe38286, 0xe38287,
+ /* e8 */ 0xe38288, 0xe38289, 0xe3828a, 0xe3828b,
+ /* ec */ 0xe3828c, 0xe3828d, 0xe3828e, 0xe3828f,
+ /* f0 */ 0xe38290, 0xe38291, 0xe38292, 0xe38293,
+ /* f4 */ 0xee9db2, 0xee9db3, 0xee9db4, 0xee9db5,
+ /* f8 */ 0xee9db6, 0xee9db7, 0xee9db8, 0xee9db9,
+ /* fc */ 0xee9dba, 0xee9dbb, 0xee9dbc,
+
+ /*** Two byte table, leaf: a5xx - offset 0x01c19 ***/
+
+ /* 40 */ 0xee9986, 0xee9987, 0xee9988, 0xee9989,
+ /* 44 */ 0xee998a, 0xee998b, 0xee998c, 0xee998d,
+ /* 48 */ 0xee998e, 0xee998f, 0xee9990, 0xee9991,
+ /* 4c */ 0xee9992, 0xee9993, 0xee9994, 0xee9995,
+ /* 50 */ 0xee9996, 0xee9997, 0xee9998, 0xee9999,
+ /* 54 */ 0xee999a, 0xee999b, 0xee999c, 0xee999d,
+ /* 58 */ 0xee999e, 0xee999f, 0xee99a0, 0xee99a1,
+ /* 5c */ 0xee99a2, 0xee99a3, 0xee99a4, 0xee99a5,
+ /* 60 */ 0xee99a6, 0xee99a7, 0xee99a8, 0xee99a9,
+ /* 64 */ 0xee99aa, 0xee99ab, 0xee99ac, 0xee99ad,
+ /* 68 */ 0xee99ae, 0xee99af, 0xee99b0, 0xee99b1,
+ /* 6c */ 0xee99b2, 0xee99b3, 0xee99b4, 0xee99b5,
+ /* 70 */ 0xee99b6, 0xee99b7, 0xee99b8, 0xee99b9,
+ /* 74 */ 0xee99ba, 0xee99bb, 0xee99bc, 0xee99bd,
+ /* 78 */ 0xee99be, 0xee99bf, 0xee9a80, 0xee9a81,
+ /* 7c */ 0xee9a82, 0xee9a83, 0xee9a84, 0x000000,
+ /* 80 */ 0xee9a85, 0xee9a86, 0xee9a87, 0xee9a88,
+ /* 84 */ 0xee9a89, 0xee9a8a, 0xee9a8b, 0xee9a8c,
+ /* 88 */ 0xee9a8d, 0xee9a8e, 0xee9a8f, 0xee9a90,
+ /* 8c */ 0xee9a91, 0xee9a92, 0xee9a93, 0xee9a94,
+ /* 90 */ 0xee9a95, 0xee9a96, 0xee9a97, 0xee9a98,
+ /* 94 */ 0xee9a99, 0xee9a9a, 0xee9a9b, 0xee9a9c,
+ /* 98 */ 0xee9a9d, 0xee9a9e, 0xee9a9f, 0xee9aa0,
+ /* 9c */ 0xee9aa1, 0xee9aa2, 0xee9aa3, 0xee9aa4,
+ /* a0 */ 0xee9aa5, 0xe382a1, 0xe382a2, 0xe382a3,
+ /* a4 */ 0xe382a4, 0xe382a5, 0xe382a6, 0xe382a7,
+ /* a8 */ 0xe382a8, 0xe382a9, 0xe382aa, 0xe382ab,
+ /* ac */ 0xe382ac, 0xe382ad, 0xe382ae, 0xe382af,
+ /* b0 */ 0xe382b0, 0xe382b1, 0xe382b2, 0xe382b3,
+ /* b4 */ 0xe382b4, 0xe382b5, 0xe382b6, 0xe382b7,
+ /* b8 */ 0xe382b8, 0xe382b9, 0xe382ba, 0xe382bb,
+ /* bc */ 0xe382bc, 0xe382bd, 0xe382be, 0xe382bf,
+ /* c0 */ 0xe38380, 0xe38381, 0xe38382, 0xe38383,
+ /* c4 */ 0xe38384, 0xe38385, 0xe38386, 0xe38387,
+ /* c8 */ 0xe38388, 0xe38389, 0xe3838a, 0xe3838b,
+ /* cc */ 0xe3838c, 0xe3838d, 0xe3838e, 0xe3838f,
+ /* d0 */ 0xe38390, 0xe38391, 0xe38392, 0xe38393,
+ /* d4 */ 0xe38394, 0xe38395, 0xe38396, 0xe38397,
+ /* d8 */ 0xe38398, 0xe38399, 0xe3839a, 0xe3839b,
+ /* dc */ 0xe3839c, 0xe3839d, 0xe3839e, 0xe3839f,
+ /* e0 */ 0xe383a0, 0xe383a1, 0xe383a2, 0xe383a3,
+ /* e4 */ 0xe383a4, 0xe383a5, 0xe383a6, 0xe383a7,
+ /* e8 */ 0xe383a8, 0xe383a9, 0xe383aa, 0xe383ab,
+ /* ec */ 0xe383ac, 0xe383ad, 0xe383ae, 0xe383af,
+ /* f0 */ 0xe383b0, 0xe383b1, 0xe383b2, 0xe383b3,
+ /* f4 */ 0xe383b4, 0xe383b5, 0xe383b6, 0xee9dbd,
+ /* f8 */ 0xee9dbe, 0xee9dbf, 0xee9e80, 0xee9e81,
+ /* fc */ 0xee9e82, 0xee9e83, 0xee9e84,
+
+ /*** Two byte table, leaf: a6xx - offset 0x01cd8 ***/
+
+ /* 40 */ 0xee9aa6, 0xee9aa7, 0xee9aa8, 0xee9aa9,
+ /* 44 */ 0xee9aaa, 0xee9aab, 0xee9aac, 0xee9aad,
+ /* 48 */ 0xee9aae, 0xee9aaf, 0xee9ab0, 0xee9ab1,
+ /* 4c */ 0xee9ab2, 0xee9ab3, 0xee9ab4, 0xee9ab5,
+ /* 50 */ 0xee9ab6, 0xee9ab7, 0xee9ab8, 0xee9ab9,
+ /* 54 */ 0xee9aba, 0xee9abb, 0xee9abc, 0xee9abd,
+ /* 58 */ 0xee9abe, 0xee9abf, 0xee9b80, 0xee9b81,
+ /* 5c */ 0xee9b82, 0xee9b83, 0xee9b84, 0xee9b85,
+ /* 60 */ 0xee9b86, 0xee9b87, 0xee9b88, 0xee9b89,
+ /* 64 */ 0xee9b8a, 0xee9b8b, 0xee9b8c, 0xee9b8d,
+ /* 68 */ 0xee9b8e, 0xee9b8f, 0xee9b90, 0xee9b91,
+ /* 6c */ 0xee9b92, 0xee9b93, 0xee9b94, 0xee9b95,
+ /* 70 */ 0xee9b96, 0xee9b97, 0xee9b98, 0xee9b99,
+ /* 74 */ 0xee9b9a, 0xee9b9b, 0xee9b9c, 0xee9b9d,
+ /* 78 */ 0xee9b9e, 0xee9b9f, 0xee9ba0, 0xee9ba1,
+ /* 7c */ 0xee9ba2, 0xee9ba3, 0xee9ba4, 0x000000,
+ /* 80 */ 0xee9ba5, 0xee9ba6, 0xee9ba7, 0xee9ba8,
+ /* 84 */ 0xee9ba9, 0xee9baa, 0xee9bab, 0xee9bac,
+ /* 88 */ 0xee9bad, 0xee9bae, 0xee9baf, 0xee9bb0,
+ /* 8c */ 0xee9bb1, 0xee9bb2, 0xee9bb3, 0xee9bb4,
+ /* 90 */ 0xee9bb5, 0xee9bb6, 0xee9bb7, 0xee9bb8,
+ /* 94 */ 0xee9bb9, 0xee9bba, 0xee9bbb, 0xee9bbc,
+ /* 98 */ 0xee9bbd, 0xee9bbe, 0xee9bbf, 0xee9c80,
+ /* 9c */ 0xee9c81, 0xee9c82, 0xee9c83, 0xee9c84,
+ /* a0 */ 0xee9c85, 0x00ce91, 0x00ce92, 0x00ce93,
+ /* a4 */ 0x00ce94, 0x00ce95, 0x00ce96, 0x00ce97,
+ /* a8 */ 0x00ce98, 0x00ce99, 0x00ce9a, 0x00ce9b,
+ /* ac */ 0x00ce9c, 0x00ce9d, 0x00ce9e, 0x00ce9f,
+ /* b0 */ 0x00cea0, 0x00cea1, 0x00cea3, 0x00cea4,
+ /* b4 */ 0x00cea5, 0x00cea6, 0x00cea7, 0x00cea8,
+ /* b8 */ 0x00cea9, 0xee9e85, 0xee9e86, 0xee9e87,
+ /* bc */ 0xee9e88, 0xee9e89, 0xee9e8a, 0xee9e8b,
+ /* c0 */ 0xee9e8c, 0x00ceb1, 0x00ceb2, 0x00ceb3,
+ /* c4 */ 0x00ceb4, 0x00ceb5, 0x00ceb6, 0x00ceb7,
+ /* c8 */ 0x00ceb8, 0x00ceb9, 0x00ceba, 0x00cebb,
+ /* cc */ 0x00cebc, 0x00cebd, 0x00cebe, 0x00cebf,
+ /* d0 */ 0x00cf80, 0x00cf81, 0x00cf83, 0x00cf84,
+ /* d4 */ 0x00cf85, 0x00cf86, 0x00cf87, 0x00cf88,
+ /* d8 */ 0x00cf89, 0xee9e8d, 0xee9e8e, 0xee9e8f,
+ /* dc */ 0xee9e90, 0xee9e91, 0xee9e92, 0xee9e93,
+ /* e0 */ 0xefb8b5, 0xefb8b6, 0xefb8b9, 0xefb8ba,
+ /* e4 */ 0xefb8bf, 0xefb980, 0xefb8bd, 0xefb8be,
+ /* e8 */ 0xefb981, 0xefb982, 0xefb983, 0xefb984,
+ /* ec */ 0xee9e94, 0xee9e95, 0xefb8bb, 0xefb8bc,
+ /* f0 */ 0xefb8b7, 0xefb8b8, 0xefb8b1, 0xee9e96,
+ /* f4 */ 0xefb8b3, 0xefb8b4, 0xee9e97, 0xee9e98,
+ /* f8 */ 0xee9e99, 0xee9e9a, 0xee9e9b, 0xee9e9c,
+ /* fc */ 0xee9e9d, 0xee9e9e, 0xee9e9f,
+
+ /*** Two byte table, leaf: a7xx - offset 0x01d97 ***/
+
+ /* 40 */ 0xee9c86, 0xee9c87, 0xee9c88, 0xee9c89,
+ /* 44 */ 0xee9c8a, 0xee9c8b, 0xee9c8c, 0xee9c8d,
+ /* 48 */ 0xee9c8e, 0xee9c8f, 0xee9c90, 0xee9c91,
+ /* 4c */ 0xee9c92, 0xee9c93, 0xee9c94, 0xee9c95,
+ /* 50 */ 0xee9c96, 0xee9c97, 0xee9c98, 0xee9c99,
+ /* 54 */ 0xee9c9a, 0xee9c9b, 0xee9c9c, 0xee9c9d,
+ /* 58 */ 0xee9c9e, 0xee9c9f, 0xee9ca0, 0xee9ca1,
+ /* 5c */ 0xee9ca2, 0xee9ca3, 0xee9ca4, 0xee9ca5,
+ /* 60 */ 0xee9ca6, 0xee9ca7, 0xee9ca8, 0xee9ca9,
+ /* 64 */ 0xee9caa, 0xee9cab, 0xee9cac, 0xee9cad,
+ /* 68 */ 0xee9cae, 0xee9caf, 0xee9cb0, 0xee9cb1,
+ /* 6c */ 0xee9cb2, 0xee9cb3, 0xee9cb4, 0xee9cb5,
+ /* 70 */ 0xee9cb6, 0xee9cb7, 0xee9cb8, 0xee9cb9,
+ /* 74 */ 0xee9cba, 0xee9cbb, 0xee9cbc, 0xee9cbd,
+ /* 78 */ 0xee9cbe, 0xee9cbf, 0xee9d80, 0xee9d81,
+ /* 7c */ 0xee9d82, 0xee9d83, 0xee9d84, 0x000000,
+ /* 80 */ 0xee9d85, 0xee9d86, 0xee9d87, 0xee9d88,
+ /* 84 */ 0xee9d89, 0xee9d8a, 0xee9d8b, 0xee9d8c,
+ /* 88 */ 0xee9d8d, 0xee9d8e, 0xee9d8f, 0xee9d90,
+ /* 8c */ 0xee9d91, 0xee9d92, 0xee9d93, 0xee9d94,
+ /* 90 */ 0xee9d95, 0xee9d96, 0xee9d97, 0xee9d98,
+ /* 94 */ 0xee9d99, 0xee9d9a, 0xee9d9b, 0xee9d9c,
+ /* 98 */ 0xee9d9d, 0xee9d9e, 0xee9d9f, 0xee9da0,
+ /* 9c */ 0xee9da1, 0xee9da2, 0xee9da3, 0xee9da4,
+ /* a0 */ 0xee9da5, 0x00d090, 0x00d091, 0x00d092,
+ /* a4 */ 0x00d093, 0x00d094, 0x00d095, 0x00d081,
+ /* a8 */ 0x00d096, 0x00d097, 0x00d098, 0x00d099,
+ /* ac */ 0x00d09a, 0x00d09b, 0x00d09c, 0x00d09d,
+ /* b0 */ 0x00d09e, 0x00d09f, 0x00d0a0, 0x00d0a1,
+ /* b4 */ 0x00d0a2, 0x00d0a3, 0x00d0a4, 0x00d0a5,
+ /* b8 */ 0x00d0a6, 0x00d0a7, 0x00d0a8, 0x00d0a9,
+ /* bc */ 0x00d0aa, 0x00d0ab, 0x00d0ac, 0x00d0ad,
+ /* c0 */ 0x00d0ae, 0x00d0af, 0xee9ea0, 0xee9ea1,
+ /* c4 */ 0xee9ea2, 0xee9ea3, 0xee9ea4, 0xee9ea5,
+ /* c8 */ 0xee9ea6, 0xee9ea7, 0xee9ea8, 0xee9ea9,
+ /* cc */ 0xee9eaa, 0xee9eab, 0xee9eac, 0xee9ead,
+ /* d0 */ 0xee9eae, 0x00d0b0, 0x00d0b1, 0x00d0b2,
+ /* d4 */ 0x00d0b3, 0x00d0b4, 0x00d0b5, 0x00d191,
+ /* d8 */ 0x00d0b6, 0x00d0b7, 0x00d0b8, 0x00d0b9,
+ /* dc */ 0x00d0ba, 0x00d0bb, 0x00d0bc, 0x00d0bd,
+ /* e0 */ 0x00d0be, 0x00d0bf, 0x00d180, 0x00d181,
+ /* e4 */ 0x00d182, 0x00d183, 0x00d184, 0x00d185,
+ /* e8 */ 0x00d186, 0x00d187, 0x00d188, 0x00d189,
+ /* ec */ 0x00d18a, 0x00d18b, 0x00d18c, 0x00d18d,
+ /* f0 */ 0x00d18e, 0x00d18f, 0xee9eaf, 0xee9eb0,
+ /* f4 */ 0xee9eb1, 0xee9eb2, 0xee9eb3, 0xee9eb4,
+ /* f8 */ 0xee9eb5, 0xee9eb6, 0xee9eb7, 0xee9eb8,
+ /* fc */ 0xee9eb9, 0xee9eba, 0xee9ebb,
+
+ /*** Two byte table, leaf: a8xx - offset 0x01e56 ***/
+
+ /* 40 */ 0x00cb8a, 0x00cb8b, 0x00cb99, 0xe28093,
+ /* 44 */ 0xe28095, 0xe280a5, 0xe280b5, 0xe28485,
+ /* 48 */ 0xe28489, 0xe28696, 0xe28697, 0xe28698,
+ /* 4c */ 0xe28699, 0xe28895, 0xe2889f, 0xe288a3,
+ /* 50 */ 0xe28992, 0xe289a6, 0xe289a7, 0xe28abf,
+ /* 54 */ 0xe29590, 0xe29591, 0xe29592, 0xe29593,
+ /* 58 */ 0xe29594, 0xe29595, 0xe29596, 0xe29597,
+ /* 5c */ 0xe29598, 0xe29599, 0xe2959a, 0xe2959b,
+ /* 60 */ 0xe2959c, 0xe2959d, 0xe2959e, 0xe2959f,
+ /* 64 */ 0xe295a0, 0xe295a1, 0xe295a2, 0xe295a3,
+ /* 68 */ 0xe295a4, 0xe295a5, 0xe295a6, 0xe295a7,
+ /* 6c */ 0xe295a8, 0xe295a9, 0xe295aa, 0xe295ab,
+ /* 70 */ 0xe295ac, 0xe295ad, 0xe295ae, 0xe295af,
+ /* 74 */ 0xe295b0, 0xe295b1, 0xe295b2, 0xe295b3,
+ /* 78 */ 0xe29681, 0xe29682, 0xe29683, 0xe29684,
+ /* 7c */ 0xe29685, 0xe29686, 0xe29687, 0x000000,
+ /* 80 */ 0xe29688, 0xe29689, 0xe2968a, 0xe2968b,
+ /* 84 */ 0xe2968c, 0xe2968d, 0xe2968e, 0xe2968f,
+ /* 88 */ 0xe29693, 0xe29694, 0xe29695, 0xe296bc,
+ /* 8c */ 0xe296bd, 0xe297a2, 0xe297a3, 0xe297a4,
+ /* 90 */ 0xe297a5, 0xe29889, 0xe28a95, 0xe38092,
+ /* 94 */ 0xe3809d, 0xe3809e, 0xee9ebc, 0xee9ebd,
+ /* 98 */ 0xee9ebe, 0xee9ebf, 0xee9f80, 0xee9f81,
+ /* 9c */ 0xee9f82, 0xee9f83, 0xee9f84, 0xee9f85,
+ /* a0 */ 0xee9f86, 0x00c481, 0x00c3a1, 0x00c78e,
+ /* a4 */ 0x00c3a0, 0x00c493, 0x00c3a9, 0x00c49b,
+ /* a8 */ 0x00c3a8, 0x00c4ab, 0x00c3ad, 0x00c790,
+ /* ac */ 0x00c3ac, 0x00c58d, 0x00c3b3, 0x00c792,
+ /* b0 */ 0x00c3b2, 0x00c5ab, 0x00c3ba, 0x00c794,
+ /* b4 */ 0x00c3b9, 0x00c796, 0x00c798, 0x00c79a,
+ /* b8 */ 0x00c79c, 0x00c3bc, 0x00c3aa, 0x00c991,
+ /* bc */ 0xee9f87, 0x00c584, 0x00c588, 0x00c7b9,
+ /* c0 */ 0x00c9a1, 0xee9f89, 0xee9f8a, 0xee9f8b,
+ /* c4 */ 0xee9f8c, 0xe38485, 0xe38486, 0xe38487,
+ /* c8 */ 0xe38488, 0xe38489, 0xe3848a, 0xe3848b,
+ /* cc */ 0xe3848c, 0xe3848d, 0xe3848e, 0xe3848f,
+ /* d0 */ 0xe38490, 0xe38491, 0xe38492, 0xe38493,
+ /* d4 */ 0xe38494, 0xe38495, 0xe38496, 0xe38497,
+ /* d8 */ 0xe38498, 0xe38499, 0xe3849a, 0xe3849b,
+ /* dc */ 0xe3849c, 0xe3849d, 0xe3849e, 0xe3849f,
+ /* e0 */ 0xe384a0, 0xe384a1, 0xe384a2, 0xe384a3,
+ /* e4 */ 0xe384a4, 0xe384a5, 0xe384a6, 0xe384a7,
+ /* e8 */ 0xe384a8, 0xe384a9, 0xee9f8d, 0xee9f8e,
+ /* ec */ 0xee9f8f, 0xee9f90, 0xee9f91, 0xee9f92,
+ /* f0 */ 0xee9f93, 0xee9f94, 0xee9f95, 0xee9f96,
+ /* f4 */ 0xee9f97, 0xee9f98, 0xee9f99, 0xee9f9a,
+ /* f8 */ 0xee9f9b, 0xee9f9c, 0xee9f9d, 0xee9f9e,
+ /* fc */ 0xee9f9f, 0xee9fa0, 0xee9fa1,
+
+ /*** Two byte table, leaf: a9xx - offset 0x01f15 ***/
+
+ /* 40 */ 0xe380a1, 0xe380a2, 0xe380a3, 0xe380a4,
+ /* 44 */ 0xe380a5, 0xe380a6, 0xe380a7, 0xe380a8,
+ /* 48 */ 0xe380a9, 0xe38aa3, 0xe38e8e, 0xe38e8f,
+ /* 4c */ 0xe38e9c, 0xe38e9d, 0xe38e9e, 0xe38ea1,
+ /* 50 */ 0xe38f84, 0xe38f8e, 0xe38f91, 0xe38f92,
+ /* 54 */ 0xe38f95, 0xefb8b0, 0xefbfa2, 0xefbfa4,
+ /* 58 */ 0xee9fa2, 0xe284a1, 0xe388b1, 0xee9fa3,
+ /* 5c */ 0xe28090, 0xee9fa4, 0xee9fa5, 0xee9fa6,
+ /* 60 */ 0xe383bc, 0xe3829b, 0xe3829c, 0xe383bd,
+ /* 64 */ 0xe383be, 0xe38086, 0xe3829d, 0xe3829e,
+ /* 68 */ 0xefb989, 0xefb98a, 0xefb98b, 0xefb98c,
+ /* 6c */ 0xefb98d, 0xefb98e, 0xefb98f, 0xefb990,
+ /* 70 */ 0xefb991, 0xefb992, 0xefb994, 0xefb995,
+ /* 74 */ 0xefb996, 0xefb997, 0xefb999, 0xefb99a,
+ /* 78 */ 0xefb99b, 0xefb99c, 0xefb99d, 0xefb99e,
+ /* 7c */ 0xefb99f, 0xefb9a0, 0xefb9a1, 0x000000,
+ /* 80 */ 0xefb9a2, 0xefb9a3, 0xefb9a4, 0xefb9a5,
+ /* 84 */ 0xefb9a6, 0xefb9a8, 0xefb9a9, 0xefb9aa,
+ /* 88 */ 0xefb9ab, 0xe380be, 0xe2bfb0, 0xe2bfb1,
+ /* 8c */ 0xe2bfb2, 0xe2bfb3, 0xe2bfb4, 0xe2bfb5,
+ /* 90 */ 0xe2bfb6, 0xe2bfb7, 0xe2bfb8, 0xe2bfb9,
+ /* 94 */ 0xe2bfba, 0xe2bfbb, 0xe38087, 0xee9fb4,
+ /* 98 */ 0xee9fb5, 0xee9fb6, 0xee9fb7, 0xee9fb8,
+ /* 9c */ 0xee9fb9, 0xee9fba, 0xee9fbb, 0xee9fbc,
+ /* a0 */ 0xee9fbd, 0xee9fbe, 0xee9fbf, 0xeea080,
+ /* a4 */ 0xe29480, 0xe29481, 0xe29482, 0xe29483,
+ /* a8 */ 0xe29484, 0xe29485, 0xe29486, 0xe29487,
+ /* ac */ 0xe29488, 0xe29489, 0xe2948a, 0xe2948b,
+ /* b0 */ 0xe2948c, 0xe2948d, 0xe2948e, 0xe2948f,
+ /* b4 */ 0xe29490, 0xe29491, 0xe29492, 0xe29493,
+ /* b8 */ 0xe29494, 0xe29495, 0xe29496, 0xe29497,
+ /* bc */ 0xe29498, 0xe29499, 0xe2949a, 0xe2949b,
+ /* c0 */ 0xe2949c, 0xe2949d, 0xe2949e, 0xe2949f,
+ /* c4 */ 0xe294a0, 0xe294a1, 0xe294a2, 0xe294a3,
+ /* c8 */ 0xe294a4, 0xe294a5, 0xe294a6, 0xe294a7,
+ /* cc */ 0xe294a8, 0xe294a9, 0xe294aa, 0xe294ab,
+ /* d0 */ 0xe294ac, 0xe294ad, 0xe294ae, 0xe294af,
+ /* d4 */ 0xe294b0, 0xe294b1, 0xe294b2, 0xe294b3,
+ /* d8 */ 0xe294b4, 0xe294b5, 0xe294b6, 0xe294b7,
+ /* dc */ 0xe294b8, 0xe294b9, 0xe294ba, 0xe294bb,
+ /* e0 */ 0xe294bc, 0xe294bd, 0xe294be, 0xe294bf,
+ /* e4 */ 0xe29580, 0xe29581, 0xe29582, 0xe29583,
+ /* e8 */ 0xe29584, 0xe29585, 0xe29586, 0xe29587,
+ /* ec */ 0xe29588, 0xe29589, 0xe2958a, 0xe2958b,
+ /* f0 */ 0xeea081, 0xeea082, 0xeea083, 0xeea084,
+ /* f4 */ 0xeea085, 0xeea086, 0xeea087, 0xeea088,
+ /* f8 */ 0xeea089, 0xeea08a, 0xeea08b, 0xeea08c,
+ /* fc */ 0xeea08d, 0xeea08e, 0xeea08f,
+
+ /*** Two byte table, leaf: aaxx - offset 0x01fd4 ***/
+
+ /* 40 */ 0xe78b9c, 0xe78b9d, 0xe78b9f, 0xe78ba2,
+ /* 44 */ 0xe78ba3, 0xe78ba4, 0xe78ba5, 0xe78ba6,
+ /* 48 */ 0xe78ba7, 0xe78baa, 0xe78bab, 0xe78bb5,
+ /* 4c */ 0xe78bb6, 0xe78bb9, 0xe78bbd, 0xe78bbe,
+ /* 50 */ 0xe78bbf, 0xe78c80, 0xe78c82, 0xe78c84,
+ /* 54 */ 0xe78c85, 0xe78c86, 0xe78c87, 0xe78c88,
+ /* 58 */ 0xe78c89, 0xe78c8b, 0xe78c8c, 0xe78c8d,
+ /* 5c */ 0xe78c8f, 0xe78c90, 0xe78c91, 0xe78c92,
+ /* 60 */ 0xe78c94, 0xe78c98, 0xe78c99, 0xe78c9a,
+ /* 64 */ 0xe78c9f, 0xe78ca0, 0xe78ca3, 0xe78ca4,
+ /* 68 */ 0xe78ca6, 0xe78ca7, 0xe78ca8, 0xe78cad,
+ /* 6c */ 0xe78caf, 0xe78cb0, 0xe78cb2, 0xe78cb3,
+ /* 70 */ 0xe78cb5, 0xe78cb6, 0xe78cba, 0xe78cbb,
+ /* 74 */ 0xe78cbc, 0xe78cbd, 0xe78d80, 0xe78d81,
+ /* 78 */ 0xe78d82, 0xe78d83, 0xe78d84, 0xe78d85,
+ /* 7c */ 0xe78d86, 0xe78d87, 0xe78d88, 0x000000,
+ /* 80 */ 0xe78d89, 0xe78d8a, 0xe78d8b, 0xe78d8c,
+ /* 84 */ 0xe78d8e, 0xe78d8f, 0xe78d91, 0xe78d93,
+ /* 88 */ 0xe78d94, 0xe78d95, 0xe78d96, 0xe78d98,
+ /* 8c */ 0xe78d99, 0xe78d9a, 0xe78d9b, 0xe78d9c,
+ /* 90 */ 0xe78d9d, 0xe78d9e, 0xe78d9f, 0xe78da1,
+ /* 94 */ 0xe78da2, 0xe78da3, 0xe78da4, 0xe78da5,
+ /* 98 */ 0xe78da6, 0xe78da7, 0xe78da8, 0xe78da9,
+ /* 9c */ 0xe78daa, 0xe78dab, 0xe78dae, 0xe78db0,
+ /* a0 */ 0xe78db1, 0xee8080, 0xee8081, 0xee8082,
+ /* a4 */ 0xee8083, 0xee8084, 0xee8085, 0xee8086,
+ /* a8 */ 0xee8087, 0xee8088, 0xee8089, 0xee808a,
+ /* ac */ 0xee808b, 0xee808c, 0xee808d, 0xee808e,
+ /* b0 */ 0xee808f, 0xee8090, 0xee8091, 0xee8092,
+ /* b4 */ 0xee8093, 0xee8094, 0xee8095, 0xee8096,
+ /* b8 */ 0xee8097, 0xee8098, 0xee8099, 0xee809a,
+ /* bc */ 0xee809b, 0xee809c, 0xee809d, 0xee809e,
+ /* c0 */ 0xee809f, 0xee80a0, 0xee80a1, 0xee80a2,
+ /* c4 */ 0xee80a3, 0xee80a4, 0xee80a5, 0xee80a6,
+ /* c8 */ 0xee80a7, 0xee80a8, 0xee80a9, 0xee80aa,
+ /* cc */ 0xee80ab, 0xee80ac, 0xee80ad, 0xee80ae,
+ /* d0 */ 0xee80af, 0xee80b0, 0xee80b1, 0xee80b2,
+ /* d4 */ 0xee80b3, 0xee80b4, 0xee80b5, 0xee80b6,
+ /* d8 */ 0xee80b7, 0xee80b8, 0xee80b9, 0xee80ba,
+ /* dc */ 0xee80bb, 0xee80bc, 0xee80bd, 0xee80be,
+ /* e0 */ 0xee80bf, 0xee8180, 0xee8181, 0xee8182,
+ /* e4 */ 0xee8183, 0xee8184, 0xee8185, 0xee8186,
+ /* e8 */ 0xee8187, 0xee8188, 0xee8189, 0xee818a,
+ /* ec */ 0xee818b, 0xee818c, 0xee818d, 0xee818e,
+ /* f0 */ 0xee818f, 0xee8190, 0xee8191, 0xee8192,
+ /* f4 */ 0xee8193, 0xee8194, 0xee8195, 0xee8196,
+ /* f8 */ 0xee8197, 0xee8198, 0xee8199, 0xee819a,
+ /* fc */ 0xee819b, 0xee819c, 0xee819d,
+
+ /*** Two byte table, leaf: abxx - offset 0x02093 ***/
+
+ /* 40 */ 0xe78db2, 0xe78db3, 0xe78db4, 0xe78db5,
+ /* 44 */ 0xe78db6, 0xe78db7, 0xe78db8, 0xe78db9,
+ /* 48 */ 0xe78dba, 0xe78dbb, 0xe78dbc, 0xe78dbd,
+ /* 4c */ 0xe78dbf, 0xe78e80, 0xe78e81, 0xe78e82,
+ /* 50 */ 0xe78e83, 0xe78e85, 0xe78e86, 0xe78e88,
+ /* 54 */ 0xe78e8a, 0xe78e8c, 0xe78e8d, 0xe78e8f,
+ /* 58 */ 0xe78e90, 0xe78e92, 0xe78e93, 0xe78e94,
+ /* 5c */ 0xe78e95, 0xe78e97, 0xe78e98, 0xe78e99,
+ /* 60 */ 0xe78e9a, 0xe78e9c, 0xe78e9d, 0xe78e9e,
+ /* 64 */ 0xe78ea0, 0xe78ea1, 0xe78ea3, 0xe78ea4,
+ /* 68 */ 0xe78ea5, 0xe78ea6, 0xe78ea7, 0xe78ea8,
+ /* 6c */ 0xe78eaa, 0xe78eac, 0xe78ead, 0xe78eb1,
+ /* 70 */ 0xe78eb4, 0xe78eb5, 0xe78eb6, 0xe78eb8,
+ /* 74 */ 0xe78eb9, 0xe78ebc, 0xe78ebd, 0xe78ebe,
+ /* 78 */ 0xe78ebf, 0xe78f81, 0xe78f83, 0xe78f84,
+ /* 7c */ 0xe78f85, 0xe78f86, 0xe78f87, 0x000000,
+ /* 80 */ 0xe78f8b, 0xe78f8c, 0xe78f8e, 0xe78f92,
+ /* 84 */ 0xe78f93, 0xe78f94, 0xe78f95, 0xe78f96,
+ /* 88 */ 0xe78f97, 0xe78f98, 0xe78f9a, 0xe78f9b,
+ /* 8c */ 0xe78f9c, 0xe78f9d, 0xe78f9f, 0xe78fa1,
+ /* 90 */ 0xe78fa2, 0xe78fa3, 0xe78fa4, 0xe78fa6,
+ /* 94 */ 0xe78fa8, 0xe78faa, 0xe78fab, 0xe78fac,
+ /* 98 */ 0xe78fae, 0xe78faf, 0xe78fb0, 0xe78fb1,
+ /* 9c */ 0xe78fb3, 0xe78fb4, 0xe78fb5, 0xe78fb6,
+ /* a0 */ 0xe78fb7, 0xee819e, 0xee819f, 0xee81a0,
+ /* a4 */ 0xee81a1, 0xee81a2, 0xee81a3, 0xee81a4,
+ /* a8 */ 0xee81a5, 0xee81a6, 0xee81a7, 0xee81a8,
+ /* ac */ 0xee81a9, 0xee81aa, 0xee81ab, 0xee81ac,
+ /* b0 */ 0xee81ad, 0xee81ae, 0xee81af, 0xee81b0,
+ /* b4 */ 0xee81b1, 0xee81b2, 0xee81b3, 0xee81b4,
+ /* b8 */ 0xee81b5, 0xee81b6, 0xee81b7, 0xee81b8,
+ /* bc */ 0xee81b9, 0xee81ba, 0xee81bb, 0xee81bc,
+ /* c0 */ 0xee81bd, 0xee81be, 0xee81bf, 0xee8280,
+ /* c4 */ 0xee8281, 0xee8282, 0xee8283, 0xee8284,
+ /* c8 */ 0xee8285, 0xee8286, 0xee8287, 0xee8288,
+ /* cc */ 0xee8289, 0xee828a, 0xee828b, 0xee828c,
+ /* d0 */ 0xee828d, 0xee828e, 0xee828f, 0xee8290,
+ /* d4 */ 0xee8291, 0xee8292, 0xee8293, 0xee8294,
+ /* d8 */ 0xee8295, 0xee8296, 0xee8297, 0xee8298,
+ /* dc */ 0xee8299, 0xee829a, 0xee829b, 0xee829c,
+ /* e0 */ 0xee829d, 0xee829e, 0xee829f, 0xee82a0,
+ /* e4 */ 0xee82a1, 0xee82a2, 0xee82a3, 0xee82a4,
+ /* e8 */ 0xee82a5, 0xee82a6, 0xee82a7, 0xee82a8,
+ /* ec */ 0xee82a9, 0xee82aa, 0xee82ab, 0xee82ac,
+ /* f0 */ 0xee82ad, 0xee82ae, 0xee82af, 0xee82b0,
+ /* f4 */ 0xee82b1, 0xee82b2, 0xee82b3, 0xee82b4,
+ /* f8 */ 0xee82b5, 0xee82b6, 0xee82b7, 0xee82b8,
+ /* fc */ 0xee82b9, 0xee82ba, 0xee82bb,
+
+ /*** Two byte table, leaf: acxx - offset 0x02152 ***/
+
+ /* 40 */ 0xe78fb8, 0xe78fb9, 0xe78fba, 0xe78fbb,
+ /* 44 */ 0xe78fbc, 0xe78fbd, 0xe78fbe, 0xe78fbf,
+ /* 48 */ 0xe79080, 0xe79081, 0xe79082, 0xe79084,
+ /* 4c */ 0xe79087, 0xe79088, 0xe7908b, 0xe7908c,
+ /* 50 */ 0xe7908d, 0xe7908e, 0xe79091, 0xe79092,
+ /* 54 */ 0xe79093, 0xe79094, 0xe79095, 0xe79096,
+ /* 58 */ 0xe79097, 0xe79098, 0xe79099, 0xe7909c,
+ /* 5c */ 0xe7909d, 0xe7909e, 0xe7909f, 0xe790a0,
+ /* 60 */ 0xe790a1, 0xe790a3, 0xe790a4, 0xe790a7,
+ /* 64 */ 0xe790a9, 0xe790ab, 0xe790ad, 0xe790af,
+ /* 68 */ 0xe790b1, 0xe790b2, 0xe790b7, 0xe790b8,
+ /* 6c */ 0xe790b9, 0xe790ba, 0xe790bb, 0xe790bd,
+ /* 70 */ 0xe790be, 0xe790bf, 0xe79180, 0xe79182,
+ /* 74 */ 0xe79183, 0xe79184, 0xe79185, 0xe79186,
+ /* 78 */ 0xe79187, 0xe79188, 0xe79189, 0xe7918a,
+ /* 7c */ 0xe7918b, 0xe7918c, 0xe7918d, 0x000000,
+ /* 80 */ 0xe7918e, 0xe7918f, 0xe79190, 0xe79191,
+ /* 84 */ 0xe79192, 0xe79193, 0xe79194, 0xe79196,
+ /* 88 */ 0xe79198, 0xe7919d, 0xe791a0, 0xe791a1,
+ /* 8c */ 0xe791a2, 0xe791a3, 0xe791a4, 0xe791a5,
+ /* 90 */ 0xe791a6, 0xe791a7, 0xe791a8, 0xe791a9,
+ /* 94 */ 0xe791aa, 0xe791ab, 0xe791ac, 0xe791ae,
+ /* 98 */ 0xe791af, 0xe791b1, 0xe791b2, 0xe791b3,
+ /* 9c */ 0xe791b4, 0xe791b5, 0xe791b8, 0xe791b9,
+ /* a0 */ 0xe791ba, 0xee82bc, 0xee82bd, 0xee82be,
+ /* a4 */ 0xee82bf, 0xee8380, 0xee8381, 0xee8382,
+ /* a8 */ 0xee8383, 0xee8384, 0xee8385, 0xee8386,
+ /* ac */ 0xee8387, 0xee8388, 0xee8389, 0xee838a,
+ /* b0 */ 0xee838b, 0xee838c, 0xee838d, 0xee838e,
+ /* b4 */ 0xee838f, 0xee8390, 0xee8391, 0xee8392,
+ /* b8 */ 0xee8393, 0xee8394, 0xee8395, 0xee8396,
+ /* bc */ 0xee8397, 0xee8398, 0xee8399, 0xee839a,
+ /* c0 */ 0xee839b, 0xee839c, 0xee839d, 0xee839e,
+ /* c4 */ 0xee839f, 0xee83a0, 0xee83a1, 0xee83a2,
+ /* c8 */ 0xee83a3, 0xee83a4, 0xee83a5, 0xee83a6,
+ /* cc */ 0xee83a7, 0xee83a8, 0xee83a9, 0xee83aa,
+ /* d0 */ 0xee83ab, 0xee83ac, 0xee83ad, 0xee83ae,
+ /* d4 */ 0xee83af, 0xee83b0, 0xee83b1, 0xee83b2,
+ /* d8 */ 0xee83b3, 0xee83b4, 0xee83b5, 0xee83b6,
+ /* dc */ 0xee83b7, 0xee83b8, 0xee83b9, 0xee83ba,
+ /* e0 */ 0xee83bb, 0xee83bc, 0xee83bd, 0xee83be,
+ /* e4 */ 0xee83bf, 0xee8480, 0xee8481, 0xee8482,
+ /* e8 */ 0xee8483, 0xee8484, 0xee8485, 0xee8486,
+ /* ec */ 0xee8487, 0xee8488, 0xee8489, 0xee848a,
+ /* f0 */ 0xee848b, 0xee848c, 0xee848d, 0xee848e,
+ /* f4 */ 0xee848f, 0xee8490, 0xee8491, 0xee8492,
+ /* f8 */ 0xee8493, 0xee8494, 0xee8495, 0xee8496,
+ /* fc */ 0xee8497, 0xee8498, 0xee8499,
+
+ /*** Two byte table, leaf: adxx - offset 0x02211 ***/
+
+ /* 40 */ 0xe791bb, 0xe791bc, 0xe791bd, 0xe791bf,
+ /* 44 */ 0xe79282, 0xe79284, 0xe79285, 0xe79286,
+ /* 48 */ 0xe79288, 0xe79289, 0xe7928a, 0xe7928c,
+ /* 4c */ 0xe7928d, 0xe7928f, 0xe79291, 0xe79292,
+ /* 50 */ 0xe79293, 0xe79294, 0xe79295, 0xe79296,
+ /* 54 */ 0xe79297, 0xe79298, 0xe79299, 0xe7929a,
+ /* 58 */ 0xe7929b, 0xe7929d, 0xe7929f, 0xe792a0,
+ /* 5c */ 0xe792a1, 0xe792a2, 0xe792a3, 0xe792a4,
+ /* 60 */ 0xe792a5, 0xe792a6, 0xe792aa, 0xe792ab,
+ /* 64 */ 0xe792ac, 0xe792ad, 0xe792ae, 0xe792af,
+ /* 68 */ 0xe792b0, 0xe792b1, 0xe792b2, 0xe792b3,
+ /* 6c */ 0xe792b4, 0xe792b5, 0xe792b6, 0xe792b7,
+ /* 70 */ 0xe792b8, 0xe792b9, 0xe792bb, 0xe792bc,
+ /* 74 */ 0xe792bd, 0xe792be, 0xe792bf, 0xe79380,
+ /* 78 */ 0xe79381, 0xe79382, 0xe79383, 0xe79384,
+ /* 7c */ 0xe79385, 0xe79386, 0xe79387, 0x000000,
+ /* 80 */ 0xe79388, 0xe79389, 0xe7938a, 0xe7938b,
+ /* 84 */ 0xe7938c, 0xe7938d, 0xe7938e, 0xe7938f,
+ /* 88 */ 0xe79390, 0xe79391, 0xe79393, 0xe79394,
+ /* 8c */ 0xe79395, 0xe79396, 0xe79397, 0xe79398,
+ /* 90 */ 0xe79399, 0xe7939a, 0xe7939b, 0xe7939d,
+ /* 94 */ 0xe7939f, 0xe793a1, 0xe793a5, 0xe793a7,
+ /* 98 */ 0xe793a8, 0xe793a9, 0xe793aa, 0xe793ab,
+ /* 9c */ 0xe793ac, 0xe793ad, 0xe793b0, 0xe793b1,
+ /* a0 */ 0xe793b2, 0xee849a, 0xee849b, 0xee849c,
+ /* a4 */ 0xee849d, 0xee849e, 0xee849f, 0xee84a0,
+ /* a8 */ 0xee84a1, 0xee84a2, 0xee84a3, 0xee84a4,
+ /* ac */ 0xee84a5, 0xee84a6, 0xee84a7, 0xee84a8,
+ /* b0 */ 0xee84a9, 0xee84aa, 0xee84ab, 0xee84ac,
+ /* b4 */ 0xee84ad, 0xee84ae, 0xee84af, 0xee84b0,
+ /* b8 */ 0xee84b1, 0xee84b2, 0xee84b3, 0xee84b4,
+ /* bc */ 0xee84b5, 0xee84b6, 0xee84b7, 0xee84b8,
+ /* c0 */ 0xee84b9, 0xee84ba, 0xee84bb, 0xee84bc,
+ /* c4 */ 0xee84bd, 0xee84be, 0xee84bf, 0xee8580,
+ /* c8 */ 0xee8581, 0xee8582, 0xee8583, 0xee8584,
+ /* cc */ 0xee8585, 0xee8586, 0xee8587, 0xee8588,
+ /* d0 */ 0xee8589, 0xee858a, 0xee858b, 0xee858c,
+ /* d4 */ 0xee858d, 0xee858e, 0xee858f, 0xee8590,
+ /* d8 */ 0xee8591, 0xee8592, 0xee8593, 0xee8594,
+ /* dc */ 0xee8595, 0xee8596, 0xee8597, 0xee8598,
+ /* e0 */ 0xee8599, 0xee859a, 0xee859b, 0xee859c,
+ /* e4 */ 0xee859d, 0xee859e, 0xee859f, 0xee85a0,
+ /* e8 */ 0xee85a1, 0xee85a2, 0xee85a3, 0xee85a4,
+ /* ec */ 0xee85a5, 0xee85a6, 0xee85a7, 0xee85a8,
+ /* f0 */ 0xee85a9, 0xee85aa, 0xee85ab, 0xee85ac,
+ /* f4 */ 0xee85ad, 0xee85ae, 0xee85af, 0xee85b0,
+ /* f8 */ 0xee85b1, 0xee85b2, 0xee85b3, 0xee85b4,
+ /* fc */ 0xee85b5, 0xee85b6, 0xee85b7,
+
+ /*** Two byte table, leaf: aexx - offset 0x022d0 ***/
+
+ /* 40 */ 0xe793b3, 0xe793b5, 0xe793b8, 0xe793b9,
+ /* 44 */ 0xe793ba, 0xe793bb, 0xe793bc, 0xe793bd,
+ /* 48 */ 0xe793be, 0xe79480, 0xe79481, 0xe79482,
+ /* 4c */ 0xe79483, 0xe79485, 0xe79486, 0xe79487,
+ /* 50 */ 0xe79488, 0xe79489, 0xe7948a, 0xe7948b,
+ /* 54 */ 0xe7948c, 0xe7948e, 0xe79490, 0xe79492,
+ /* 58 */ 0xe79494, 0xe79495, 0xe79496, 0xe79497,
+ /* 5c */ 0xe7949b, 0xe7949d, 0xe7949e, 0xe794a0,
+ /* 60 */ 0xe794a1, 0xe794a2, 0xe794a3, 0xe794a4,
+ /* 64 */ 0xe794a6, 0xe794a7, 0xe794aa, 0xe794ae,
+ /* 68 */ 0xe794b4, 0xe794b6, 0xe794b9, 0xe794bc,
+ /* 6c */ 0xe794bd, 0xe794bf, 0xe79581, 0xe79582,
+ /* 70 */ 0xe79583, 0xe79584, 0xe79586, 0xe79587,
+ /* 74 */ 0xe79589, 0xe7958a, 0xe7958d, 0xe79590,
+ /* 78 */ 0xe79591, 0xe79592, 0xe79593, 0xe79595,
+ /* 7c */ 0xe79596, 0xe79597, 0xe79598, 0x000000,
+ /* 80 */ 0xe7959d, 0xe7959e, 0xe7959f, 0xe795a0,
+ /* 84 */ 0xe795a1, 0xe795a2, 0xe795a3, 0xe795a4,
+ /* 88 */ 0xe795a7, 0xe795a8, 0xe795a9, 0xe795ab,
+ /* 8c */ 0xe795ac, 0xe795ad, 0xe795ae, 0xe795af,
+ /* 90 */ 0xe795b0, 0xe795b1, 0xe795b3, 0xe795b5,
+ /* 94 */ 0xe795b6, 0xe795b7, 0xe795ba, 0xe795bb,
+ /* 98 */ 0xe795bc, 0xe795bd, 0xe795be, 0xe79680,
+ /* 9c */ 0xe79681, 0xe79682, 0xe79684, 0xe79685,
+ /* a0 */ 0xe79687, 0xee85b8, 0xee85b9, 0xee85ba,
+ /* a4 */ 0xee85bb, 0xee85bc, 0xee85bd, 0xee85be,
+ /* a8 */ 0xee85bf, 0xee8680, 0xee8681, 0xee8682,
+ /* ac */ 0xee8683, 0xee8684, 0xee8685, 0xee8686,
+ /* b0 */ 0xee8687, 0xee8688, 0xee8689, 0xee868a,
+ /* b4 */ 0xee868b, 0xee868c, 0xee868d, 0xee868e,
+ /* b8 */ 0xee868f, 0xee8690, 0xee8691, 0xee8692,
+ /* bc */ 0xee8693, 0xee8694, 0xee8695, 0xee8696,
+ /* c0 */ 0xee8697, 0xee8698, 0xee8699, 0xee869a,
+ /* c4 */ 0xee869b, 0xee869c, 0xee869d, 0xee869e,
+ /* c8 */ 0xee869f, 0xee86a0, 0xee86a1, 0xee86a2,
+ /* cc */ 0xee86a3, 0xee86a4, 0xee86a5, 0xee86a6,
+ /* d0 */ 0xee86a7, 0xee86a8, 0xee86a9, 0xee86aa,
+ /* d4 */ 0xee86ab, 0xee86ac, 0xee86ad, 0xee86ae,
+ /* d8 */ 0xee86af, 0xee86b0, 0xee86b1, 0xee86b2,
+ /* dc */ 0xee86b3, 0xee86b4, 0xee86b5, 0xee86b6,
+ /* e0 */ 0xee86b7, 0xee86b8, 0xee86b9, 0xee86ba,
+ /* e4 */ 0xee86bb, 0xee86bc, 0xee86bd, 0xee86be,
+ /* e8 */ 0xee86bf, 0xee8780, 0xee8781, 0xee8782,
+ /* ec */ 0xee8783, 0xee8784, 0xee8785, 0xee8786,
+ /* f0 */ 0xee8787, 0xee8788, 0xee8789, 0xee878a,
+ /* f4 */ 0xee878b, 0xee878c, 0xee878d, 0xee878e,
+ /* f8 */ 0xee878f, 0xee8790, 0xee8791, 0xee8792,
+ /* fc */ 0xee8793, 0xee8794, 0xee8795,
+
+ /*** Two byte table, leaf: afxx - offset 0x0238f ***/
+
+ /* 40 */ 0xe79688, 0xe79689, 0xe7968a, 0xe7968c,
+ /* 44 */ 0xe7968d, 0xe7968e, 0xe79690, 0xe79693,
+ /* 48 */ 0xe79695, 0xe79698, 0xe7969b, 0xe7969c,
+ /* 4c */ 0xe7969e, 0xe796a2, 0xe796a6, 0xe796a7,
+ /* 50 */ 0xe796a8, 0xe796a9, 0xe796aa, 0xe796ad,
+ /* 54 */ 0xe796b6, 0xe796b7, 0xe796ba, 0xe796bb,
+ /* 58 */ 0xe796bf, 0xe79780, 0xe79781, 0xe79786,
+ /* 5c */ 0xe7978b, 0xe7978c, 0xe7978e, 0xe7978f,
+ /* 60 */ 0xe79790, 0xe79791, 0xe79793, 0xe79797,
+ /* 64 */ 0xe79799, 0xe7979a, 0xe7979c, 0xe7979d,
+ /* 68 */ 0xe7979f, 0xe797a0, 0xe797a1, 0xe797a5,
+ /* 6c */ 0xe797a9, 0xe797ac, 0xe797ad, 0xe797ae,
+ /* 70 */ 0xe797af, 0xe797b2, 0xe797b3, 0xe797b5,
+ /* 74 */ 0xe797b6, 0xe797b7, 0xe797b8, 0xe797ba,
+ /* 78 */ 0xe797bb, 0xe797bd, 0xe797be, 0xe79882,
+ /* 7c */ 0xe79884, 0xe79886, 0xe79887, 0x000000,
+ /* 80 */ 0xe79888, 0xe79889, 0xe7988b, 0xe7988d,
+ /* 84 */ 0xe7988e, 0xe7988f, 0xe79891, 0xe79892,
+ /* 88 */ 0xe79893, 0xe79894, 0xe79896, 0xe7989a,
+ /* 8c */ 0xe7989c, 0xe7989d, 0xe7989e, 0xe798a1,
+ /* 90 */ 0xe798a3, 0xe798a7, 0xe798a8, 0xe798ac,
+ /* 94 */ 0xe798ae, 0xe798af, 0xe798b1, 0xe798b2,
+ /* 98 */ 0xe798b6, 0xe798b7, 0xe798b9, 0xe798ba,
+ /* 9c */ 0xe798bb, 0xe798bd, 0xe79981, 0xe79982,
+ /* a0 */ 0xe79984, 0xee8796, 0xee8797, 0xee8798,
+ /* a4 */ 0xee8799, 0xee879a, 0xee879b, 0xee879c,
+ /* a8 */ 0xee879d, 0xee879e, 0xee879f, 0xee87a0,
+ /* ac */ 0xee87a1, 0xee87a2, 0xee87a3, 0xee87a4,
+ /* b0 */ 0xee87a5, 0xee87a6, 0xee87a7, 0xee87a8,
+ /* b4 */ 0xee87a9, 0xee87aa, 0xee87ab, 0xee87ac,
+ /* b8 */ 0xee87ad, 0xee87ae, 0xee87af, 0xee87b0,
+ /* bc */ 0xee87b1, 0xee87b2, 0xee87b3, 0xee87b4,
+ /* c0 */ 0xee87b5, 0xee87b6, 0xee87b7, 0xee87b8,
+ /* c4 */ 0xee87b9, 0xee87ba, 0xee87bb, 0xee87bc,
+ /* c8 */ 0xee87bd, 0xee87be, 0xee87bf, 0xee8880,
+ /* cc */ 0xee8881, 0xee8882, 0xee8883, 0xee8884,
+ /* d0 */ 0xee8885, 0xee8886, 0xee8887, 0xee8888,
+ /* d4 */ 0xee8889, 0xee888a, 0xee888b, 0xee888c,
+ /* d8 */ 0xee888d, 0xee888e, 0xee888f, 0xee8890,
+ /* dc */ 0xee8891, 0xee8892, 0xee8893, 0xee8894,
+ /* e0 */ 0xee8895, 0xee8896, 0xee8897, 0xee8898,
+ /* e4 */ 0xee8899, 0xee889a, 0xee889b, 0xee889c,
+ /* e8 */ 0xee889d, 0xee889e, 0xee889f, 0xee88a0,
+ /* ec */ 0xee88a1, 0xee88a2, 0xee88a3, 0xee88a4,
+ /* f0 */ 0xee88a5, 0xee88a6, 0xee88a7, 0xee88a8,
+ /* f4 */ 0xee88a9, 0xee88aa, 0xee88ab, 0xee88ac,
+ /* f8 */ 0xee88ad, 0xee88ae, 0xee88af, 0xee88b0,
+ /* fc */ 0xee88b1, 0xee88b2, 0xee88b3,
+
+ /*** Two byte table, leaf: b0xx - offset 0x0244e ***/
+
+ /* 40 */ 0xe79985, 0xe79986, 0xe79987, 0xe79988,
+ /* 44 */ 0xe79989, 0xe7998a, 0xe7998b, 0xe7998e,
+ /* 48 */ 0xe7998f, 0xe79990, 0xe79991, 0xe79992,
+ /* 4c */ 0xe79993, 0xe79995, 0xe79997, 0xe79998,
+ /* 50 */ 0xe79999, 0xe7999a, 0xe7999b, 0xe7999d,
+ /* 54 */ 0xe7999f, 0xe799a0, 0xe799a1, 0xe799a2,
+ /* 58 */ 0xe799a4, 0xe799a5, 0xe799a6, 0xe799a7,
+ /* 5c */ 0xe799a8, 0xe799a9, 0xe799aa, 0xe799ac,
+ /* 60 */ 0xe799ad, 0xe799ae, 0xe799b0, 0xe799b1,
+ /* 64 */ 0xe799b2, 0xe799b3, 0xe799b4, 0xe799b5,
+ /* 68 */ 0xe799b6, 0xe799b7, 0xe799b9, 0xe799ba,
+ /* 6c */ 0xe799bc, 0xe799bf, 0xe79a80, 0xe79a81,
+ /* 70 */ 0xe79a83, 0xe79a85, 0xe79a89, 0xe79a8a,
+ /* 74 */ 0xe79a8c, 0xe79a8d, 0xe79a8f, 0xe79a90,
+ /* 78 */ 0xe79a92, 0xe79a94, 0xe79a95, 0xe79a97,
+ /* 7c */ 0xe79a98, 0xe79a9a, 0xe79a9b, 0x000000,
+ /* 80 */ 0xe79a9c, 0xe79a9d, 0xe79a9e, 0xe79a9f,
+ /* 84 */ 0xe79aa0, 0xe79aa1, 0xe79aa2, 0xe79aa3,
+ /* 88 */ 0xe79aa5, 0xe79aa6, 0xe79aa7, 0xe79aa8,
+ /* 8c */ 0xe79aa9, 0xe79aaa, 0xe79aab, 0xe79aac,
+ /* 90 */ 0xe79aad, 0xe79aaf, 0xe79ab0, 0xe79ab3,
+ /* 94 */ 0xe79ab5, 0xe79ab6, 0xe79ab7, 0xe79ab8,
+ /* 98 */ 0xe79ab9, 0xe79aba, 0xe79abb, 0xe79abc,
+ /* 9c */ 0xe79abd, 0xe79abe, 0xe79b80, 0xe79b81,
+ /* a0 */ 0xe79b83, 0xe5958a, 0xe998bf, 0xe59f83,
+ /* a4 */ 0xe68ca8, 0xe5938e, 0xe59489, 0xe59380,
+ /* a8 */ 0xe79a91, 0xe7998c, 0xe894bc, 0xe79fae,
+ /* ac */ 0xe889be, 0xe7a28d, 0xe788b1, 0xe99a98,
+ /* b0 */ 0xe99e8d, 0xe6b0a8, 0xe5ae89, 0xe4bfba,
+ /* b4 */ 0xe68c89, 0xe69a97, 0xe5b2b8, 0xe883ba,
+ /* b8 */ 0xe6a188, 0xe882ae, 0xe69882, 0xe79b8e,
+ /* bc */ 0xe587b9, 0xe69596, 0xe786ac, 0xe7bfb1,
+ /* c0 */ 0xe8a284, 0xe582b2, 0xe5a5a5, 0xe6878a,
+ /* c4 */ 0xe6beb3, 0xe88aad, 0xe68d8c, 0xe68992,
+ /* c8 */ 0xe58fad, 0xe590a7, 0xe7ac86, 0xe585ab,
+ /* cc */ 0xe796a4, 0xe5b7b4, 0xe68b94, 0xe8b78b,
+ /* d0 */ 0xe99db6, 0xe68a8a, 0xe88099, 0xe59d9d,
+ /* d4 */ 0xe99cb8, 0xe7bda2, 0xe788b8, 0xe799bd,
+ /* d8 */ 0xe69f8f, 0xe799be, 0xe69186, 0xe4bdb0,
+ /* dc */ 0xe8b4a5, 0xe68b9c, 0xe7a897, 0xe69691,
+ /* e0 */ 0xe78fad, 0xe690ac, 0xe689b3, 0xe888ac,
+ /* e4 */ 0xe9a281, 0xe69dbf, 0xe78988, 0xe689ae,
+ /* e8 */ 0xe68b8c, 0xe4bcb4, 0xe793a3, 0xe58d8a,
+ /* ec */ 0xe58a9e, 0xe7bb8a, 0xe982a6, 0xe5b8ae,
+ /* f0 */ 0xe6a286, 0xe6a69c, 0xe88680, 0xe7bb91,
+ /* f4 */ 0xe6a392, 0xe7a385, 0xe89a8c, 0xe99591,
+ /* f8 */ 0xe5828d, 0xe8b0a4, 0xe88b9e, 0xe8839e,
+ /* fc */ 0xe58c85, 0xe8a492, 0xe589a5,
+
+ /*** Two byte table, leaf: b1xx - offset 0x0250d ***/
+
+ /* 40 */ 0xe79b84, 0xe79b87, 0xe79b89, 0xe79b8b,
+ /* 44 */ 0xe79b8c, 0xe79b93, 0xe79b95, 0xe79b99,
+ /* 48 */ 0xe79b9a, 0xe79b9c, 0xe79b9d, 0xe79b9e,
+ /* 4c */ 0xe79ba0, 0xe79ba1, 0xe79ba2, 0xe79ba3,
+ /* 50 */ 0xe79ba4, 0xe79ba6, 0xe79ba7, 0xe79ba8,
+ /* 54 */ 0xe79ba9, 0xe79baa, 0xe79bab, 0xe79bac,
+ /* 58 */ 0xe79bad, 0xe79bb0, 0xe79bb3, 0xe79bb5,
+ /* 5c */ 0xe79bb6, 0xe79bb7, 0xe79bba, 0xe79bbb,
+ /* 60 */ 0xe79bbd, 0xe79bbf, 0xe79c80, 0xe79c82,
+ /* 64 */ 0xe79c83, 0xe79c85, 0xe79c86, 0xe79c8a,
+ /* 68 */ 0xe79c8c, 0xe79c8e, 0xe79c8f, 0xe79c90,
+ /* 6c */ 0xe79c91, 0xe79c92, 0xe79c93, 0xe79c94,
+ /* 70 */ 0xe79c95, 0xe79c96, 0xe79c97, 0xe79c98,
+ /* 74 */ 0xe79c9b, 0xe79c9c, 0xe79c9d, 0xe79c9e,
+ /* 78 */ 0xe79ca1, 0xe79ca3, 0xe79ca4, 0xe79ca5,
+ /* 7c */ 0xe79ca7, 0xe79caa, 0xe79cab, 0x000000,
+ /* 80 */ 0xe79cac, 0xe79cae, 0xe79cb0, 0xe79cb1,
+ /* 84 */ 0xe79cb2, 0xe79cb3, 0xe79cb4, 0xe79cb9,
+ /* 88 */ 0xe79cbb, 0xe79cbd, 0xe79cbe, 0xe79cbf,
+ /* 8c */ 0xe79d82, 0xe79d84, 0xe79d85, 0xe79d86,
+ /* 90 */ 0xe79d88, 0xe79d89, 0xe79d8a, 0xe79d8b,
+ /* 94 */ 0xe79d8c, 0xe79d8d, 0xe79d8e, 0xe79d8f,
+ /* 98 */ 0xe79d92, 0xe79d93, 0xe79d94, 0xe79d95,
+ /* 9c */ 0xe79d96, 0xe79d97, 0xe79d98, 0xe79d99,
+ /* a0 */ 0xe79d9c, 0xe89684, 0xe99bb9, 0xe4bf9d,
+ /* a4 */ 0xe5a0a1, 0xe9a5b1, 0xe5ae9d, 0xe68ab1,
+ /* a8 */ 0xe68aa5, 0xe69ab4, 0xe8b1b9, 0xe9b28d,
+ /* ac */ 0xe78886, 0xe69daf, 0xe7a291, 0xe682b2,
+ /* b0 */ 0xe58d91, 0xe58c97, 0xe8be88, 0xe8838c,
+ /* b4 */ 0xe8b49d, 0xe992a1, 0xe5808d, 0xe78b88,
+ /* b8 */ 0xe5a487, 0xe683ab, 0xe78499, 0xe8a2ab,
+ /* bc */ 0xe5a594, 0xe88baf, 0xe69cac, 0xe7aca8,
+ /* c0 */ 0xe5b4a9, 0xe7bbb7, 0xe794ad, 0xe6b3b5,
+ /* c4 */ 0xe8b9a6, 0xe8bfb8, 0xe980bc, 0xe9bcbb,
+ /* c8 */ 0xe6af94, 0xe98499, 0xe7ac94, 0xe5bdbc,
+ /* cc */ 0xe7a2a7, 0xe89396, 0xe894bd, 0xe6af95,
+ /* d0 */ 0xe6af99, 0xe6af96, 0xe5b881, 0xe5ba87,
+ /* d4 */ 0xe797b9, 0xe997ad, 0xe6959d, 0xe5bc8a,
+ /* d8 */ 0xe5bf85, 0xe8be9f, 0xe5a381, 0xe88782,
+ /* dc */ 0xe981bf, 0xe9999b, 0xe99ead, 0xe8beb9,
+ /* e0 */ 0xe7bc96, 0xe8b4ac, 0xe68981, 0xe4bebf,
+ /* e4 */ 0xe58f98, 0xe58d9e, 0xe8bea8, 0xe8bea9,
+ /* e8 */ 0xe8beab, 0xe9818d, 0xe6a087, 0xe5bdaa,
+ /* ec */ 0xe88698, 0xe8a1a8, 0xe9b396, 0xe6868b,
+ /* f0 */ 0xe588ab, 0xe798aa, 0xe5bdac, 0xe6968c,
+ /* f4 */ 0xe6bf92, 0xe6bba8, 0xe5aebe, 0xe69188,
+ /* f8 */ 0xe585b5, 0xe586b0, 0xe69f84, 0xe4b899,
+ /* fc */ 0xe7a789, 0xe9a5bc, 0xe782b3,
+
+ /*** Two byte table, leaf: b2xx - offset 0x025cc ***/
+
+ /* 40 */ 0xe79d9d, 0xe79d9e, 0xe79d9f, 0xe79da0,
+ /* 44 */ 0xe79da4, 0xe79da7, 0xe79da9, 0xe79daa,
+ /* 48 */ 0xe79dad, 0xe79dae, 0xe79daf, 0xe79db0,
+ /* 4c */ 0xe79db1, 0xe79db2, 0xe79db3, 0xe79db4,
+ /* 50 */ 0xe79db5, 0xe79db6, 0xe79db7, 0xe79db8,
+ /* 54 */ 0xe79dba, 0xe79dbb, 0xe79dbc, 0xe79e81,
+ /* 58 */ 0xe79e82, 0xe79e83, 0xe79e86, 0xe79e87,
+ /* 5c */ 0xe79e88, 0xe79e89, 0xe79e8a, 0xe79e8b,
+ /* 60 */ 0xe79e8f, 0xe79e90, 0xe79e93, 0xe79e94,
+ /* 64 */ 0xe79e95, 0xe79e96, 0xe79e97, 0xe79e98,
+ /* 68 */ 0xe79e99, 0xe79e9a, 0xe79e9b, 0xe79e9c,
+ /* 6c */ 0xe79e9d, 0xe79e9e, 0xe79ea1, 0xe79ea3,
+ /* 70 */ 0xe79ea4, 0xe79ea6, 0xe79ea8, 0xe79eab,
+ /* 74 */ 0xe79ead, 0xe79eae, 0xe79eaf, 0xe79eb1,
+ /* 78 */ 0xe79eb2, 0xe79eb4, 0xe79eb6, 0xe79eb7,
+ /* 7c */ 0xe79eb8, 0xe79eb9, 0xe79eba, 0x000000,
+ /* 80 */ 0xe79ebc, 0xe79ebe, 0xe79f80, 0xe79f81,
+ /* 84 */ 0xe79f82, 0xe79f83, 0xe79f84, 0xe79f85,
+ /* 88 */ 0xe79f86, 0xe79f87, 0xe79f88, 0xe79f89,
+ /* 8c */ 0xe79f8a, 0xe79f8b, 0xe79f8c, 0xe79f8e,
+ /* 90 */ 0xe79f8f, 0xe79f90, 0xe79f91, 0xe79f92,
+ /* 94 */ 0xe79f93, 0xe79f94, 0xe79f95, 0xe79f96,
+ /* 98 */ 0xe79f98, 0xe79f99, 0xe79f9a, 0xe79f9d,
+ /* 9c */ 0xe79f9e, 0xe79f9f, 0xe79fa0, 0xe79fa1,
+ /* a0 */ 0xe79fa4, 0xe79785, 0xe5b9b6, 0xe78ebb,
+ /* a4 */ 0xe88fa0, 0xe692ad, 0xe68ba8, 0xe992b5,
+ /* a8 */ 0xe6b3a2, 0xe58d9a, 0xe58b83, 0xe6908f,
+ /* ac */ 0xe99382, 0xe7ae94, 0xe4bcaf, 0xe5b89b,
+ /* b0 */ 0xe888b6, 0xe88496, 0xe8868a, 0xe6b8a4,
+ /* b4 */ 0xe6b38a, 0xe9a9b3, 0xe68d95, 0xe58d9c,
+ /* b8 */ 0xe593ba, 0xe8a1a5, 0xe59fa0, 0xe4b88d,
+ /* bc */ 0xe5b883, 0xe6ada5, 0xe7b0bf, 0xe983a8,
+ /* c0 */ 0xe68096, 0xe693a6, 0xe78c9c, 0xe8a381,
+ /* c4 */ 0xe69d90, 0xe6898d, 0xe8b4a2, 0xe79dac,
+ /* c8 */ 0xe8b8a9, 0xe98787, 0xe5bda9, 0xe88f9c,
+ /* cc */ 0xe894a1, 0xe9a490, 0xe58f82, 0xe89a95,
+ /* d0 */ 0xe6ae8b, 0xe683ad, 0xe683a8, 0xe781bf,
+ /* d4 */ 0xe88b8d, 0xe888b1, 0xe4bb93, 0xe6b2a7,
+ /* d8 */ 0xe8978f, 0xe6938d, 0xe7b399, 0xe6a7bd,
+ /* dc */ 0xe69bb9, 0xe88d89, 0xe58e95, 0xe7ad96,
+ /* e0 */ 0xe4bea7, 0xe5868c, 0xe6b58b, 0xe5b182,
+ /* e4 */ 0xe8b9ad, 0xe68f92, 0xe58f89, 0xe88cac,
+ /* e8 */ 0xe88cb6, 0xe69fa5, 0xe7a2b4, 0xe690bd,
+ /* ec */ 0xe5af9f, 0xe5b294, 0xe5b7ae, 0xe8afa7,
+ /* f0 */ 0xe68b86, 0xe69fb4, 0xe8b1ba, 0xe69080,
+ /* f4 */ 0xe68eba, 0xe89d89, 0xe9a68b, 0xe8b097,
+ /* f8 */ 0xe7bca0, 0xe993b2, 0xe4baa7, 0xe99890,
+ /* fc */ 0xe9a2a4, 0xe6988c, 0xe78c96,
+
+ /*** Two byte table, leaf: b3xx - offset 0x0268b ***/
+
+ /* 40 */ 0xe79fa6, 0xe79fa8, 0xe79faa, 0xe79faf,
+ /* 44 */ 0xe79fb0, 0xe79fb1, 0xe79fb2, 0xe79fb4,
+ /* 48 */ 0xe79fb5, 0xe79fb7, 0xe79fb9, 0xe79fba,
+ /* 4c */ 0xe79fbb, 0xe79fbc, 0xe7a083, 0xe7a084,
+ /* 50 */ 0xe7a085, 0xe7a086, 0xe7a087, 0xe7a088,
+ /* 54 */ 0xe7a08a, 0xe7a08b, 0xe7a08e, 0xe7a08f,
+ /* 58 */ 0xe7a090, 0xe7a093, 0xe7a095, 0xe7a099,
+ /* 5c */ 0xe7a09b, 0xe7a09e, 0xe7a0a0, 0xe7a0a1,
+ /* 60 */ 0xe7a0a2, 0xe7a0a4, 0xe7a0a8, 0xe7a0aa,
+ /* 64 */ 0xe7a0ab, 0xe7a0ae, 0xe7a0af, 0xe7a0b1,
+ /* 68 */ 0xe7a0b2, 0xe7a0b3, 0xe7a0b5, 0xe7a0b6,
+ /* 6c */ 0xe7a0bd, 0xe7a0bf, 0xe7a181, 0xe7a182,
+ /* 70 */ 0xe7a183, 0xe7a184, 0xe7a186, 0xe7a188,
+ /* 74 */ 0xe7a189, 0xe7a18a, 0xe7a18b, 0xe7a18d,
+ /* 78 */ 0xe7a18f, 0xe7a191, 0xe7a193, 0xe7a194,
+ /* 7c */ 0xe7a198, 0xe7a199, 0xe7a19a, 0x000000,
+ /* 80 */ 0xe7a19b, 0xe7a19c, 0xe7a19e, 0xe7a19f,
+ /* 84 */ 0xe7a1a0, 0xe7a1a1, 0xe7a1a2, 0xe7a1a3,
+ /* 88 */ 0xe7a1a4, 0xe7a1a5, 0xe7a1a6, 0xe7a1a7,
+ /* 8c */ 0xe7a1a8, 0xe7a1a9, 0xe7a1af, 0xe7a1b0,
+ /* 90 */ 0xe7a1b1, 0xe7a1b2, 0xe7a1b3, 0xe7a1b4,
+ /* 94 */ 0xe7a1b5, 0xe7a1b6, 0xe7a1b8, 0xe7a1b9,
+ /* 98 */ 0xe7a1ba, 0xe7a1bb, 0xe7a1bd, 0xe7a1be,
+ /* 9c */ 0xe7a1bf, 0xe7a280, 0xe7a281, 0xe7a282,
+ /* a0 */ 0xe7a283, 0xe59cba, 0xe5b09d, 0xe5b8b8,
+ /* a4 */ 0xe995bf, 0xe581bf, 0xe882a0, 0xe58e82,
+ /* a8 */ 0xe6959e, 0xe79585, 0xe594b1, 0xe580a1,
+ /* ac */ 0xe8b685, 0xe68a84, 0xe9929e, 0xe69c9d,
+ /* b0 */ 0xe598b2, 0xe6bdae, 0xe5b7a2, 0xe590b5,
+ /* b4 */ 0xe78292, 0xe8bda6, 0xe689af, 0xe692a4,
+ /* b8 */ 0xe68ea3, 0xe5bdbb, 0xe6be88, 0xe983b4,
+ /* bc */ 0xe887a3, 0xe8beb0, 0xe5b098, 0xe699a8,
+ /* c0 */ 0xe5bfb1, 0xe6b289, 0xe99988, 0xe8b681,
+ /* c4 */ 0xe8a1ac, 0xe69291, 0xe7a7b0, 0xe59f8e,
+ /* c8 */ 0xe6a999, 0xe68890, 0xe59188, 0xe4b998,
+ /* cc */ 0xe7a88b, 0xe683a9, 0xe6be84, 0xe8af9a,
+ /* d0 */ 0xe689bf, 0xe9809e, 0xe9aa8b, 0xe7a7a4,
+ /* d4 */ 0xe59083, 0xe797b4, 0xe68c81, 0xe58c99,
+ /* d8 */ 0xe6b1a0, 0xe8bf9f, 0xe5bc9b, 0xe9a9b0,
+ /* dc */ 0xe880bb, 0xe9bdbf, 0xe4be88, 0xe5b0ba,
+ /* e0 */ 0xe8b5a4, 0xe7bf85, 0xe696a5, 0xe782bd,
+ /* e4 */ 0xe58585, 0xe586b2, 0xe899ab, 0xe5b487,
+ /* e8 */ 0xe5aea0, 0xe68abd, 0xe985ac, 0xe795b4,
+ /* ec */ 0xe8b88c, 0xe7a8a0, 0xe68481, 0xe7adb9,
+ /* f0 */ 0xe4bb87, 0xe7bbb8, 0xe79e85, 0xe4b891,
+ /* f4 */ 0xe887ad, 0xe5889d, 0xe587ba, 0xe6a9b1,
+ /* f8 */ 0xe58ea8, 0xe8ba87, 0xe99484, 0xe99b8f,
+ /* fc */ 0xe6bb81, 0xe999a4, 0xe6a59a,
+
+ /*** Two byte table, leaf: b4xx - offset 0x0274a ***/
+
+ /* 40 */ 0xe7a284, 0xe7a285, 0xe7a286, 0xe7a288,
+ /* 44 */ 0xe7a28a, 0xe7a28b, 0xe7a28f, 0xe7a290,
+ /* 48 */ 0xe7a292, 0xe7a294, 0xe7a295, 0xe7a296,
+ /* 4c */ 0xe7a299, 0xe7a29d, 0xe7a29e, 0xe7a2a0,
+ /* 50 */ 0xe7a2a2, 0xe7a2a4, 0xe7a2a6, 0xe7a2a8,
+ /* 54 */ 0xe7a2a9, 0xe7a2aa, 0xe7a2ab, 0xe7a2ac,
+ /* 58 */ 0xe7a2ad, 0xe7a2ae, 0xe7a2af, 0xe7a2b5,
+ /* 5c */ 0xe7a2b6, 0xe7a2b7, 0xe7a2b8, 0xe7a2ba,
+ /* 60 */ 0xe7a2bb, 0xe7a2bc, 0xe7a2bd, 0xe7a2bf,
+ /* 64 */ 0xe7a380, 0xe7a382, 0xe7a383, 0xe7a384,
+ /* 68 */ 0xe7a386, 0xe7a387, 0xe7a388, 0xe7a38c,
+ /* 6c */ 0xe7a38d, 0xe7a38e, 0xe7a38f, 0xe7a391,
+ /* 70 */ 0xe7a392, 0xe7a393, 0xe7a396, 0xe7a397,
+ /* 74 */ 0xe7a398, 0xe7a39a, 0xe7a39b, 0xe7a39c,
+ /* 78 */ 0xe7a39d, 0xe7a39e, 0xe7a39f, 0xe7a3a0,
+ /* 7c */ 0xe7a3a1, 0xe7a3a2, 0xe7a3a3, 0x000000,
+ /* 80 */ 0xe7a3a4, 0xe7a3a5, 0xe7a3a6, 0xe7a3a7,
+ /* 84 */ 0xe7a3a9, 0xe7a3aa, 0xe7a3ab, 0xe7a3ad,
+ /* 88 */ 0xe7a3ae, 0xe7a3af, 0xe7a3b0, 0xe7a3b1,
+ /* 8c */ 0xe7a3b3, 0xe7a3b5, 0xe7a3b6, 0xe7a3b8,
+ /* 90 */ 0xe7a3b9, 0xe7a3bb, 0xe7a3bc, 0xe7a3bd,
+ /* 94 */ 0xe7a3be, 0xe7a3bf, 0xe7a480, 0xe7a482,
+ /* 98 */ 0xe7a483, 0xe7a484, 0xe7a486, 0xe7a487,
+ /* 9c */ 0xe7a488, 0xe7a489, 0xe7a48a, 0xe7a48b,
+ /* a0 */ 0xe7a48c, 0xe7a180, 0xe582a8, 0xe79f97,
+ /* a4 */ 0xe69090, 0xe8a7a6, 0xe5a484, 0xe68fa3,
+ /* a8 */ 0xe5b79d, 0xe7a9bf, 0xe6a4bd, 0xe4bca0,
+ /* ac */ 0xe888b9, 0xe59698, 0xe4b8b2, 0xe796ae,
+ /* b0 */ 0xe7aa97, 0xe5b9a2, 0xe5ba8a, 0xe997af,
+ /* b4 */ 0xe5889b, 0xe590b9, 0xe7828a, 0xe68db6,
+ /* b8 */ 0xe994a4, 0xe59e82, 0xe698a5, 0xe6a4bf,
+ /* bc */ 0xe98687, 0xe59487, 0xe6b7b3, 0xe7baaf,
+ /* c0 */ 0xe8a0a2, 0xe688b3, 0xe7bbb0, 0xe796b5,
+ /* c4 */ 0xe88ca8, 0xe7a381, 0xe99b8c, 0xe8be9e,
+ /* c8 */ 0xe68588, 0xe793b7, 0xe8af8d, 0xe6ada4,
+ /* cc */ 0xe588ba, 0xe8b590, 0xe6aca1, 0xe881aa,
+ /* d0 */ 0xe891b1, 0xe59bb1, 0xe58c86, 0xe4bb8e,
+ /* d4 */ 0xe4b89b, 0xe58791, 0xe7b297, 0xe9868b,
+ /* d8 */ 0xe7b087, 0xe4bf83, 0xe8b9bf, 0xe7afa1,
+ /* dc */ 0xe7aa9c, 0xe691a7, 0xe5b494, 0xe582ac,
+ /* e0 */ 0xe88486, 0xe79881, 0xe7b2b9, 0xe6b7ac,
+ /* e4 */ 0xe7bfa0, 0xe69d91, 0xe5ad98, 0xe5afb8,
+ /* e8 */ 0xe7a38b, 0xe692ae, 0xe69093, 0xe68eaa,
+ /* ec */ 0xe68cab, 0xe99499, 0xe690ad, 0xe8bebe,
+ /* f0 */ 0xe7ad94, 0xe798a9, 0xe68993, 0xe5a4a7,
+ /* f4 */ 0xe59186, 0xe6adb9, 0xe582a3, 0xe688b4,
+ /* f8 */ 0xe5b8a6, 0xe6ae86, 0xe4bba3, 0xe8b4b7,
+ /* fc */ 0xe8a28b, 0xe5be85, 0xe980ae,
+
+ /*** Two byte table, leaf: b5xx - offset 0x02809 ***/
+
+ /* 40 */ 0xe7a48d, 0xe7a48e, 0xe7a48f, 0xe7a490,
+ /* 44 */ 0xe7a491, 0xe7a492, 0xe7a494, 0xe7a495,
+ /* 48 */ 0xe7a496, 0xe7a497, 0xe7a498, 0xe7a499,
+ /* 4c */ 0xe7a49a, 0xe7a49b, 0xe7a49c, 0xe7a49d,
+ /* 50 */ 0xe7a49f, 0xe7a4a0, 0xe7a4a1, 0xe7a4a2,
+ /* 54 */ 0xe7a4a3, 0xe7a4a5, 0xe7a4a6, 0xe7a4a7,
+ /* 58 */ 0xe7a4a8, 0xe7a4a9, 0xe7a4aa, 0xe7a4ab,
+ /* 5c */ 0xe7a4ac, 0xe7a4ad, 0xe7a4ae, 0xe7a4af,
+ /* 60 */ 0xe7a4b0, 0xe7a4b1, 0xe7a4b2, 0xe7a4b3,
+ /* 64 */ 0xe7a4b5, 0xe7a4b6, 0xe7a4b7, 0xe7a4b8,
+ /* 68 */ 0xe7a4b9, 0xe7a4bd, 0xe7a4bf, 0xe7a582,
+ /* 6c */ 0xe7a583, 0xe7a584, 0xe7a585, 0xe7a587,
+ /* 70 */ 0xe7a58a, 0xe7a58b, 0xe7a58c, 0xe7a58d,
+ /* 74 */ 0xe7a58e, 0xe7a58f, 0xe7a590, 0xe7a591,
+ /* 78 */ 0xe7a592, 0xe7a594, 0xe7a595, 0xe7a598,
+ /* 7c */ 0xe7a599, 0xe7a5a1, 0xe7a5a3, 0x000000,
+ /* 80 */ 0xe7a5a4, 0xe7a5a6, 0xe7a5a9, 0xe7a5aa,
+ /* 84 */ 0xe7a5ab, 0xe7a5ac, 0xe7a5ae, 0xe7a5b0,
+ /* 88 */ 0xe7a5b1, 0xe7a5b2, 0xe7a5b3, 0xe7a5b4,
+ /* 8c */ 0xe7a5b5, 0xe7a5b6, 0xe7a5b9, 0xe7a5bb,
+ /* 90 */ 0xe7a5bc, 0xe7a5bd, 0xe7a5be, 0xe7a5bf,
+ /* 94 */ 0xe7a682, 0xe7a683, 0xe7a686, 0xe7a687,
+ /* 98 */ 0xe7a688, 0xe7a689, 0xe7a68b, 0xe7a68c,
+ /* 9c */ 0xe7a68d, 0xe7a68e, 0xe7a690, 0xe7a691,
+ /* a0 */ 0xe7a692, 0xe680a0, 0xe880bd, 0xe68b85,
+ /* a4 */ 0xe4b8b9, 0xe58d95, 0xe983b8, 0xe68eb8,
+ /* a8 */ 0xe88386, 0xe697a6, 0xe6b0ae, 0xe4bd86,
+ /* ac */ 0xe683ae, 0xe6b7a1, 0xe8af9e, 0xe5bcb9,
+ /* b0 */ 0xe89b8b, 0xe5bd93, 0xe68ca1, 0xe5859a,
+ /* b4 */ 0xe88da1, 0xe6a1a3, 0xe58880, 0xe68da3,
+ /* b8 */ 0xe8b988, 0xe58092, 0xe5b29b, 0xe7a5b7,
+ /* bc */ 0xe5afbc, 0xe588b0, 0xe7a8bb, 0xe682bc,
+ /* c0 */ 0xe98193, 0xe79b97, 0xe5beb7, 0xe5be97,
+ /* c4 */ 0xe79a84, 0xe8b9ac, 0xe781af, 0xe799bb,
+ /* c8 */ 0xe7ad89, 0xe79eaa, 0xe587b3, 0xe98293,
+ /* cc */ 0xe5a0a4, 0xe4bd8e, 0xe6bbb4, 0xe8bfaa,
+ /* d0 */ 0xe6958c, 0xe7ac9b, 0xe78b84, 0xe6b6a4,
+ /* d4 */ 0xe7bf9f, 0xe5aba1, 0xe68ab5, 0xe5ba95,
+ /* d8 */ 0xe59cb0, 0xe89282, 0xe7acac, 0xe5b89d,
+ /* dc */ 0xe5bc9f, 0xe98092, 0xe7bc94, 0xe9a2a0,
+ /* e0 */ 0xe68e82, 0xe6bb87, 0xe7a298, 0xe782b9,
+ /* e4 */ 0xe585b8, 0xe99d9b, 0xe59eab, 0xe794b5,
+ /* e8 */ 0xe4bd83, 0xe794b8, 0xe5ba97, 0xe683a6,
+ /* ec */ 0xe5a5a0, 0xe6b780, 0xe6aebf, 0xe7a289,
+ /* f0 */ 0xe58fbc, 0xe99b95, 0xe5878b, 0xe58881,
+ /* f4 */ 0xe68e89, 0xe5908a, 0xe99293, 0xe8b083,
+ /* f8 */ 0xe8b78c, 0xe788b9, 0xe7a29f, 0xe89db6,
+ /* fc */ 0xe8bfad, 0xe8b08d, 0xe58fa0,
+
+ /*** Two byte table, leaf: b6xx - offset 0x028c8 ***/
+
+ /* 40 */ 0xe7a693, 0xe7a694, 0xe7a695, 0xe7a696,
+ /* 44 */ 0xe7a697, 0xe7a698, 0xe7a699, 0xe7a69b,
+ /* 48 */ 0xe7a69c, 0xe7a69d, 0xe7a69e, 0xe7a69f,
+ /* 4c */ 0xe7a6a0, 0xe7a6a1, 0xe7a6a2, 0xe7a6a3,
+ /* 50 */ 0xe7a6a4, 0xe7a6a5, 0xe7a6a6, 0xe7a6a8,
+ /* 54 */ 0xe7a6a9, 0xe7a6aa, 0xe7a6ab, 0xe7a6ac,
+ /* 58 */ 0xe7a6ad, 0xe7a6ae, 0xe7a6af, 0xe7a6b0,
+ /* 5c */ 0xe7a6b1, 0xe7a6b2, 0xe7a6b4, 0xe7a6b5,
+ /* 60 */ 0xe7a6b6, 0xe7a6b7, 0xe7a6b8, 0xe7a6bc,
+ /* 64 */ 0xe7a6bf, 0xe7a782, 0xe7a784, 0xe7a785,
+ /* 68 */ 0xe7a787, 0xe7a788, 0xe7a78a, 0xe7a78c,
+ /* 6c */ 0xe7a78e, 0xe7a78f, 0xe7a790, 0xe7a793,
+ /* 70 */ 0xe7a794, 0xe7a796, 0xe7a797, 0xe7a799,
+ /* 74 */ 0xe7a79a, 0xe7a79b, 0xe7a79c, 0xe7a79d,
+ /* 78 */ 0xe7a79e, 0xe7a7a0, 0xe7a7a1, 0xe7a7a2,
+ /* 7c */ 0xe7a7a5, 0xe7a7a8, 0xe7a7aa, 0x000000,
+ /* 80 */ 0xe7a7ac, 0xe7a7ae, 0xe7a7b1, 0xe7a7b2,
+ /* 84 */ 0xe7a7b3, 0xe7a7b4, 0xe7a7b5, 0xe7a7b6,
+ /* 88 */ 0xe7a7b7, 0xe7a7b9, 0xe7a7ba, 0xe7a7bc,
+ /* 8c */ 0xe7a7be, 0xe7a7bf, 0xe7a881, 0xe7a884,
+ /* 90 */ 0xe7a885, 0xe7a887, 0xe7a888, 0xe7a889,
+ /* 94 */ 0xe7a88a, 0xe7a88c, 0xe7a88f, 0xe7a890,
+ /* 98 */ 0xe7a891, 0xe7a892, 0xe7a893, 0xe7a895,
+ /* 9c */ 0xe7a896, 0xe7a898, 0xe7a899, 0xe7a89b,
+ /* a0 */ 0xe7a89c, 0xe4b881, 0xe79baf, 0xe58fae,
+ /* a4 */ 0xe99289, 0xe9a1b6, 0xe9bc8e, 0xe994ad,
+ /* a8 */ 0xe5ae9a, 0xe8aea2, 0xe4b8a2, 0xe4b89c,
+ /* ac */ 0xe586ac, 0xe891a3, 0xe68782, 0xe58aa8,
+ /* b0 */ 0xe6a08b, 0xe4be97, 0xe681ab, 0xe586bb,
+ /* b4 */ 0xe6b49e, 0xe5859c, 0xe68a96, 0xe69697,
+ /* b8 */ 0xe999a1, 0xe8b186, 0xe98097, 0xe79798,
+ /* bc */ 0xe983bd, 0xe79da3, 0xe6af92, 0xe78a8a,
+ /* c0 */ 0xe78bac, 0xe8afbb, 0xe5a0b5, 0xe79db9,
+ /* c4 */ 0xe8b58c, 0xe69d9c, 0xe99580, 0xe8829a,
+ /* c8 */ 0xe5baa6, 0xe6b8a1, 0xe5a692, 0xe7abaf,
+ /* cc */ 0xe79fad, 0xe994bb, 0xe6aeb5, 0xe696ad,
+ /* d0 */ 0xe7bc8e, 0xe5a086, 0xe58591, 0xe9989f,
+ /* d4 */ 0xe5afb9, 0xe5a2a9, 0xe590a8, 0xe8b9b2,
+ /* d8 */ 0xe695a6, 0xe9a1bf, 0xe59ba4, 0xe9929d,
+ /* dc */ 0xe79bbe, 0xe98181, 0xe68e87, 0xe59386,
+ /* e0 */ 0xe5a49a, 0xe5a4ba, 0xe59e9b, 0xe8bab2,
+ /* e4 */ 0xe69cb5, 0xe8b7ba, 0xe888b5, 0xe58981,
+ /* e8 */ 0xe683b0, 0xe5a095, 0xe89bbe, 0xe5b3a8,
+ /* ec */ 0xe9b985, 0xe4bf84, 0xe9a29d, 0xe8aeb9,
+ /* f0 */ 0xe5a8a5, 0xe681b6, 0xe58e84, 0xe689bc,
+ /* f4 */ 0xe9818f, 0xe98482, 0xe9a5bf, 0xe681a9,
+ /* f8 */ 0xe8808c, 0xe584bf, 0xe880b3, 0xe5b094,
+ /* fc */ 0xe9a5b5, 0xe6b4b1, 0xe4ba8c,
+
+ /*** Two byte table, leaf: b7xx - offset 0x02987 ***/
+
+ /* 40 */ 0xe7a89d, 0xe7a89f, 0xe7a8a1, 0xe7a8a2,
+ /* 44 */ 0xe7a8a4, 0xe7a8a5, 0xe7a8a6, 0xe7a8a7,
+ /* 48 */ 0xe7a8a8, 0xe7a8a9, 0xe7a8aa, 0xe7a8ab,
+ /* 4c */ 0xe7a8ac, 0xe7a8ad, 0xe7a8ae, 0xe7a8af,
+ /* 50 */ 0xe7a8b0, 0xe7a8b1, 0xe7a8b2, 0xe7a8b4,
+ /* 54 */ 0xe7a8b5, 0xe7a8b6, 0xe7a8b8, 0xe7a8ba,
+ /* 58 */ 0xe7a8be, 0xe7a980, 0xe7a981, 0xe7a982,
+ /* 5c */ 0xe7a983, 0xe7a984, 0xe7a985, 0xe7a987,
+ /* 60 */ 0xe7a988, 0xe7a989, 0xe7a98a, 0xe7a98b,
+ /* 64 */ 0xe7a98c, 0xe7a98d, 0xe7a98e, 0xe7a98f,
+ /* 68 */ 0xe7a990, 0xe7a992, 0xe7a993, 0xe7a994,
+ /* 6c */ 0xe7a995, 0xe7a996, 0xe7a998, 0xe7a999,
+ /* 70 */ 0xe7a99a, 0xe7a99b, 0xe7a99c, 0xe7a99d,
+ /* 74 */ 0xe7a99e, 0xe7a99f, 0xe7a9a0, 0xe7a9a1,
+ /* 78 */ 0xe7a9a2, 0xe7a9a3, 0xe7a9a4, 0xe7a9a5,
+ /* 7c */ 0xe7a9a6, 0xe7a9a7, 0xe7a9a8, 0x000000,
+ /* 80 */ 0xe7a9a9, 0xe7a9aa, 0xe7a9ab, 0xe7a9ac,
+ /* 84 */ 0xe7a9ad, 0xe7a9ae, 0xe7a9af, 0xe7a9b1,
+ /* 88 */ 0xe7a9b2, 0xe7a9b3, 0xe7a9b5, 0xe7a9bb,
+ /* 8c */ 0xe7a9bc, 0xe7a9bd, 0xe7a9be, 0xe7aa82,
+ /* 90 */ 0xe7aa85, 0xe7aa87, 0xe7aa89, 0xe7aa8a,
+ /* 94 */ 0xe7aa8b, 0xe7aa8c, 0xe7aa8e, 0xe7aa8f,
+ /* 98 */ 0xe7aa90, 0xe7aa93, 0xe7aa94, 0xe7aa99,
+ /* 9c */ 0xe7aa9a, 0xe7aa9b, 0xe7aa9e, 0xe7aaa1,
+ /* a0 */ 0xe7aaa2, 0xe8b4b0, 0xe58f91, 0xe7bd9a,
+ /* a4 */ 0xe7ad8f, 0xe4bc90, 0xe4b98f, 0xe99880,
+ /* a8 */ 0xe6b395, 0xe78f90, 0xe897a9, 0xe5b886,
+ /* ac */ 0xe795aa, 0xe7bfbb, 0xe6a88a, 0xe79fbe,
+ /* b0 */ 0xe99292, 0xe7b981, 0xe587a1, 0xe783a6,
+ /* b4 */ 0xe58f8d, 0xe8bf94, 0xe88c83, 0xe8b4a9,
+ /* b8 */ 0xe78aaf, 0xe9a5ad, 0xe6b39b, 0xe59d8a,
+ /* bc */ 0xe88ab3, 0xe696b9, 0xe882aa, 0xe688bf,
+ /* c0 */ 0xe998b2, 0xe5a6a8, 0xe4bbbf, 0xe8aebf,
+ /* c4 */ 0xe7baba, 0xe694be, 0xe88fb2, 0xe99d9e,
+ /* c8 */ 0xe595a1, 0xe9a39e, 0xe882a5, 0xe58caa,
+ /* cc */ 0xe8afbd, 0xe590a0, 0xe882ba, 0xe5ba9f,
+ /* d0 */ 0xe6b2b8, 0xe8b4b9, 0xe88aac, 0xe9859a,
+ /* d4 */ 0xe590a9, 0xe6b09b, 0xe58886, 0xe7bab7,
+ /* d8 */ 0xe59d9f, 0xe7849a, 0xe6b1be, 0xe7b289,
+ /* dc */ 0xe5a58b, 0xe4bbbd, 0xe5bfbf, 0xe684a4,
+ /* e0 */ 0xe7b2aa, 0xe4b8b0, 0xe5b081, 0xe69eab,
+ /* e4 */ 0xe89c82, 0xe5b3b0, 0xe9948b, 0xe9a38e,
+ /* e8 */ 0xe796af, 0xe783bd, 0xe980a2, 0xe586af,
+ /* ec */ 0xe7bc9d, 0xe8aebd, 0xe5a589, 0xe587a4,
+ /* f0 */ 0xe4bd9b, 0xe590a6, 0xe5a4ab, 0xe695b7,
+ /* f4 */ 0xe882a4, 0xe5adb5, 0xe689b6, 0xe68b82,
+ /* f8 */ 0xe8be90, 0xe5b985, 0xe6b09f, 0xe7aca6,
+ /* fc */ 0xe4bc8f, 0xe4bf98, 0xe69c8d,
+
+ /*** Two byte table, leaf: b8xx - offset 0x02a46 ***/
+
+ /* 40 */ 0xe7aaa3, 0xe7aaa4, 0xe7aaa7, 0xe7aaa9,
+ /* 44 */ 0xe7aaaa, 0xe7aaab, 0xe7aaae, 0xe7aaaf,
+ /* 48 */ 0xe7aab0, 0xe7aab1, 0xe7aab2, 0xe7aab4,
+ /* 4c */ 0xe7aab5, 0xe7aab6, 0xe7aab7, 0xe7aab8,
+ /* 50 */ 0xe7aab9, 0xe7aaba, 0xe7aabb, 0xe7aabc,
+ /* 54 */ 0xe7aabd, 0xe7aabe, 0xe7ab80, 0xe7ab81,
+ /* 58 */ 0xe7ab82, 0xe7ab83, 0xe7ab84, 0xe7ab85,
+ /* 5c */ 0xe7ab86, 0xe7ab87, 0xe7ab88, 0xe7ab89,
+ /* 60 */ 0xe7ab8a, 0xe7ab8c, 0xe7ab8d, 0xe7ab8e,
+ /* 64 */ 0xe7ab8f, 0xe7ab90, 0xe7ab91, 0xe7ab92,
+ /* 68 */ 0xe7ab93, 0xe7ab94, 0xe7ab95, 0xe7ab97,
+ /* 6c */ 0xe7ab98, 0xe7ab9a, 0xe7ab9b, 0xe7ab9c,
+ /* 70 */ 0xe7ab9d, 0xe7aba1, 0xe7aba2, 0xe7aba4,
+ /* 74 */ 0xe7aba7, 0xe7aba8, 0xe7aba9, 0xe7abaa,
+ /* 78 */ 0xe7abab, 0xe7abac, 0xe7abae, 0xe7abb0,
+ /* 7c */ 0xe7abb1, 0xe7abb2, 0xe7abb3, 0x000000,
+ /* 80 */ 0xe7abb4, 0xe7abb5, 0xe7abb6, 0xe7abb7,
+ /* 84 */ 0xe7abb8, 0xe7abbb, 0xe7abbc, 0xe7abbe,
+ /* 88 */ 0xe7ac80, 0xe7ac81, 0xe7ac82, 0xe7ac85,
+ /* 8c */ 0xe7ac87, 0xe7ac89, 0xe7ac8c, 0xe7ac8d,
+ /* 90 */ 0xe7ac8e, 0xe7ac90, 0xe7ac92, 0xe7ac93,
+ /* 94 */ 0xe7ac96, 0xe7ac97, 0xe7ac98, 0xe7ac9a,
+ /* 98 */ 0xe7ac9c, 0xe7ac9d, 0xe7ac9f, 0xe7aca1,
+ /* 9c */ 0xe7aca2, 0xe7aca3, 0xe7aca7, 0xe7aca9,
+ /* a0 */ 0xe7acad, 0xe6b5ae, 0xe6b6aa, 0xe7a68f,
+ /* a4 */ 0xe8a2b1, 0xe5bc97, 0xe794ab, 0xe68a9a,
+ /* a8 */ 0xe8be85, 0xe4bfaf, 0xe9879c, 0xe696a7,
+ /* ac */ 0xe884af, 0xe88591, 0xe5ba9c, 0xe88590,
+ /* b0 */ 0xe8b5b4, 0xe589af, 0xe8a686, 0xe8b58b,
+ /* b4 */ 0xe5a48d, 0xe58285, 0xe4bb98, 0xe9989c,
+ /* b8 */ 0xe788b6, 0xe885b9, 0xe8b49f, 0xe5af8c,
+ /* bc */ 0xe8aea3, 0xe99984, 0xe5a687, 0xe7bc9a,
+ /* c0 */ 0xe59290, 0xe599b6, 0xe5988e, 0xe8afa5,
+ /* c4 */ 0xe694b9, 0xe6a682, 0xe99299, 0xe79b96,
+ /* c8 */ 0xe6ba89, 0xe5b9b2, 0xe79498, 0xe69d86,
+ /* cc */ 0xe69f91, 0xe7abbf, 0xe8829d, 0xe8b5b6,
+ /* d0 */ 0xe6849f, 0xe7a786, 0xe695a2, 0xe8b5a3,
+ /* d4 */ 0xe58688, 0xe5889a, 0xe992a2, 0xe7bcb8,
+ /* d8 */ 0xe8829b, 0xe7bab2, 0xe5b297, 0xe6b8af,
+ /* dc */ 0xe69da0, 0xe7af99, 0xe79a8b, 0xe9ab98,
+ /* e0 */ 0xe8868f, 0xe7be94, 0xe7b395, 0xe6909e,
+ /* e4 */ 0xe99590, 0xe7a8bf, 0xe5918a, 0xe593a5,
+ /* e8 */ 0xe6ad8c, 0xe69081, 0xe68888, 0xe9b8bd,
+ /* ec */ 0xe883b3, 0xe79699, 0xe589b2, 0xe99da9,
+ /* f0 */ 0xe8919b, 0xe6a0bc, 0xe89ba4, 0xe99881,
+ /* f4 */ 0xe99a94, 0xe993ac, 0xe4b8aa, 0xe59084,
+ /* f8 */ 0xe7bb99, 0xe6a0b9, 0xe8b79f, 0xe88095,
+ /* fc */ 0xe69bb4, 0xe5ba9a, 0xe7beb9,
+
+ /*** Two byte table, leaf: b9xx - offset 0x02b05 ***/
+
+ /* 40 */ 0xe7acaf, 0xe7acb0, 0xe7acb2, 0xe7acb4,
+ /* 44 */ 0xe7acb5, 0xe7acb6, 0xe7acb7, 0xe7acb9,
+ /* 48 */ 0xe7acbb, 0xe7acbd, 0xe7acbf, 0xe7ad80,
+ /* 4c */ 0xe7ad81, 0xe7ad82, 0xe7ad83, 0xe7ad84,
+ /* 50 */ 0xe7ad86, 0xe7ad88, 0xe7ad8a, 0xe7ad8d,
+ /* 54 */ 0xe7ad8e, 0xe7ad93, 0xe7ad95, 0xe7ad97,
+ /* 58 */ 0xe7ad99, 0xe7ad9c, 0xe7ad9e, 0xe7ad9f,
+ /* 5c */ 0xe7ada1, 0xe7ada3, 0xe7ada4, 0xe7ada5,
+ /* 60 */ 0xe7ada6, 0xe7ada7, 0xe7ada8, 0xe7ada9,
+ /* 64 */ 0xe7adaa, 0xe7adab, 0xe7adac, 0xe7adad,
+ /* 68 */ 0xe7adaf, 0xe7adb0, 0xe7adb3, 0xe7adb4,
+ /* 6c */ 0xe7adb6, 0xe7adb8, 0xe7adba, 0xe7adbc,
+ /* 70 */ 0xe7adbd, 0xe7adbf, 0xe7ae81, 0xe7ae82,
+ /* 74 */ 0xe7ae83, 0xe7ae84, 0xe7ae86, 0xe7ae87,
+ /* 78 */ 0xe7ae88, 0xe7ae89, 0xe7ae8a, 0xe7ae8b,
+ /* 7c */ 0xe7ae8c, 0xe7ae8e, 0xe7ae8f, 0x000000,
+ /* 80 */ 0xe7ae91, 0xe7ae92, 0xe7ae93, 0xe7ae96,
+ /* 84 */ 0xe7ae98, 0xe7ae99, 0xe7ae9a, 0xe7ae9b,
+ /* 88 */ 0xe7ae9e, 0xe7ae9f, 0xe7aea0, 0xe7aea3,
+ /* 8c */ 0xe7aea4, 0xe7aea5, 0xe7aeae, 0xe7aeaf,
+ /* 90 */ 0xe7aeb0, 0xe7aeb2, 0xe7aeb3, 0xe7aeb5,
+ /* 94 */ 0xe7aeb6, 0xe7aeb7, 0xe7aeb9, 0xe7aeba,
+ /* 98 */ 0xe7aebb, 0xe7aebc, 0xe7aebd, 0xe7aebe,
+ /* 9c */ 0xe7aebf, 0xe7af80, 0xe7af82, 0xe7af83,
+ /* a0 */ 0xe7af84, 0xe59f82, 0xe880bf, 0xe6a297,
+ /* a4 */ 0xe5b7a5, 0xe694bb, 0xe58a9f, 0xe681ad,
+ /* a8 */ 0xe9be9a, 0xe4be9b, 0xe8baac, 0xe585ac,
+ /* ac */ 0xe5aeab, 0xe5bc93, 0xe5b7a9, 0xe6b19e,
+ /* b0 */ 0xe68bb1, 0xe8b4a1, 0xe585b1, 0xe992a9,
+ /* b4 */ 0xe58bbe, 0xe6b29f, 0xe88b9f, 0xe78b97,
+ /* b8 */ 0xe59ea2, 0xe69e84, 0xe8b4ad, 0xe5a49f,
+ /* bc */ 0xe8be9c, 0xe88f87, 0xe59295, 0xe7ae8d,
+ /* c0 */ 0xe4bcb0, 0xe6b2bd, 0xe5ada4, 0xe5a791,
+ /* c4 */ 0xe9bc93, 0xe58fa4, 0xe89b8a, 0xe9aaa8,
+ /* c8 */ 0xe8b0b7, 0xe882a1, 0xe69585, 0xe9a1be,
+ /* cc */ 0xe59bba, 0xe99b87, 0xe588ae, 0xe7939c,
+ /* d0 */ 0xe58990, 0xe5afa1, 0xe68c82, 0xe8a482,
+ /* d4 */ 0xe4b996, 0xe68b90, 0xe680aa, 0xe6a3ba,
+ /* d8 */ 0xe585b3, 0xe5ae98, 0xe586a0, 0xe8a782,
+ /* dc */ 0xe7aea1, 0xe9a686, 0xe7bd90, 0xe683af,
+ /* e0 */ 0xe7818c, 0xe8b4af, 0xe58589, 0xe5b9bf,
+ /* e4 */ 0xe9809b, 0xe791b0, 0xe8a784, 0xe59cad,
+ /* e8 */ 0xe7a185, 0xe5bd92, 0xe9be9f, 0xe997ba,
+ /* ec */ 0xe8bda8, 0xe9acbc, 0xe8afa1, 0xe799b8,
+ /* f0 */ 0xe6a182, 0xe69f9c, 0xe8b7aa, 0xe8b4b5,
+ /* f4 */ 0xe588bd, 0xe8be8a, 0xe6bb9a, 0xe6a38d,
+ /* f8 */ 0xe99485, 0xe983ad, 0xe59bbd, 0xe69e9c,
+ /* fc */ 0xe8a3b9, 0xe8bf87, 0xe59388,
+
+ /*** Two byte table, leaf: baxx - offset 0x02bc4 ***/
+
+ /* 40 */ 0xe7af85, 0xe7af88, 0xe7af89, 0xe7af8a,
+ /* 44 */ 0xe7af8b, 0xe7af8d, 0xe7af8e, 0xe7af8f,
+ /* 48 */ 0xe7af90, 0xe7af92, 0xe7af94, 0xe7af95,
+ /* 4c */ 0xe7af96, 0xe7af97, 0xe7af98, 0xe7af9b,
+ /* 50 */ 0xe7af9c, 0xe7af9e, 0xe7af9f, 0xe7afa0,
+ /* 54 */ 0xe7afa2, 0xe7afa3, 0xe7afa4, 0xe7afa7,
+ /* 58 */ 0xe7afa8, 0xe7afa9, 0xe7afab, 0xe7afac,
+ /* 5c */ 0xe7afad, 0xe7afaf, 0xe7afb0, 0xe7afb2,
+ /* 60 */ 0xe7afb3, 0xe7afb4, 0xe7afb5, 0xe7afb6,
+ /* 64 */ 0xe7afb8, 0xe7afb9, 0xe7afba, 0xe7afbb,
+ /* 68 */ 0xe7afbd, 0xe7afbf, 0xe7b080, 0xe7b081,
+ /* 6c */ 0xe7b082, 0xe7b083, 0xe7b084, 0xe7b085,
+ /* 70 */ 0xe7b086, 0xe7b088, 0xe7b089, 0xe7b08a,
+ /* 74 */ 0xe7b08d, 0xe7b08e, 0xe7b090, 0xe7b091,
+ /* 78 */ 0xe7b092, 0xe7b093, 0xe7b094, 0xe7b095,
+ /* 7c */ 0xe7b097, 0xe7b098, 0xe7b099, 0x000000,
+ /* 80 */ 0xe7b09a, 0xe7b09b, 0xe7b09c, 0xe7b09d,
+ /* 84 */ 0xe7b09e, 0xe7b0a0, 0xe7b0a1, 0xe7b0a2,
+ /* 88 */ 0xe7b0a3, 0xe7b0a4, 0xe7b0a5, 0xe7b0a8,
+ /* 8c */ 0xe7b0a9, 0xe7b0ab, 0xe7b0ac, 0xe7b0ad,
+ /* 90 */ 0xe7b0ae, 0xe7b0af, 0xe7b0b0, 0xe7b0b1,
+ /* 94 */ 0xe7b0b2, 0xe7b0b3, 0xe7b0b4, 0xe7b0b5,
+ /* 98 */ 0xe7b0b6, 0xe7b0b7, 0xe7b0b9, 0xe7b0ba,
+ /* 9c */ 0xe7b0bb, 0xe7b0bc, 0xe7b0bd, 0xe7b0be,
+ /* a0 */ 0xe7b182, 0xe9aab8, 0xe5ada9, 0xe6b5b7,
+ /* a4 */ 0xe6b0a6, 0xe4baa5, 0xe5aeb3, 0xe9aa87,
+ /* a8 */ 0xe985a3, 0xe686a8, 0xe982af, 0xe99fa9,
+ /* ac */ 0xe590ab, 0xe6b6b5, 0xe5af92, 0xe587bd,
+ /* b0 */ 0xe5968a, 0xe7bd95, 0xe7bfb0, 0xe692bc,
+ /* b4 */ 0xe68d8d, 0xe697b1, 0xe686be, 0xe6828d,
+ /* b8 */ 0xe7848a, 0xe6b197, 0xe6b189, 0xe5a4af,
+ /* bc */ 0xe69dad, 0xe888aa, 0xe5a395, 0xe59a8e,
+ /* c0 */ 0xe8b1aa, 0xe6afab, 0xe9839d, 0xe5a5bd,
+ /* c4 */ 0xe88097, 0xe58fb7, 0xe6b5a9, 0xe591b5,
+ /* c8 */ 0xe5969d, 0xe88db7, 0xe88f8f, 0xe6a0b8,
+ /* cc */ 0xe7a6be, 0xe5928c, 0xe4bd95, 0xe59088,
+ /* d0 */ 0xe79b92, 0xe8b289, 0xe99882, 0xe6b2b3,
+ /* d4 */ 0xe6b6b8, 0xe8b5ab, 0xe8a490, 0xe9b9a4,
+ /* d8 */ 0xe8b4ba, 0xe598bf, 0xe9bb91, 0xe79795,
+ /* dc */ 0xe5be88, 0xe78ba0, 0xe681a8, 0xe593bc,
+ /* e0 */ 0xe4baa8, 0xe6a8aa, 0xe8a1a1, 0xe68192,
+ /* e4 */ 0xe8bdb0, 0xe59384, 0xe78398, 0xe899b9,
+ /* e8 */ 0xe9b8bf, 0xe6b4aa, 0xe5ae8f, 0xe5bc98,
+ /* ec */ 0xe7baa2, 0xe59689, 0xe4beaf, 0xe78cb4,
+ /* f0 */ 0xe590bc, 0xe58e9a, 0xe58099, 0xe5908e,
+ /* f4 */ 0xe591bc, 0xe4b98e, 0xe5bfbd, 0xe7919a,
+ /* f8 */ 0xe5a3b6, 0xe891ab, 0xe883a1, 0xe89db4,
+ /* fc */ 0xe78b90, 0xe7b38a, 0xe6b996,
+
+ /*** Two byte table, leaf: bbxx - offset 0x02c83 ***/
+
+ /* 40 */ 0xe7b183, 0xe7b184, 0xe7b185, 0xe7b186,
+ /* 44 */ 0xe7b187, 0xe7b188, 0xe7b189, 0xe7b18a,
+ /* 48 */ 0xe7b18b, 0xe7b18c, 0xe7b18e, 0xe7b18f,
+ /* 4c */ 0xe7b190, 0xe7b191, 0xe7b192, 0xe7b193,
+ /* 50 */ 0xe7b194, 0xe7b195, 0xe7b196, 0xe7b197,
+ /* 54 */ 0xe7b198, 0xe7b199, 0xe7b19a, 0xe7b19b,
+ /* 58 */ 0xe7b19c, 0xe7b19d, 0xe7b19e, 0xe7b19f,
+ /* 5c */ 0xe7b1a0, 0xe7b1a1, 0xe7b1a2, 0xe7b1a3,
+ /* 60 */ 0xe7b1a4, 0xe7b1a5, 0xe7b1a6, 0xe7b1a7,
+ /* 64 */ 0xe7b1a8, 0xe7b1a9, 0xe7b1aa, 0xe7b1ab,
+ /* 68 */ 0xe7b1ac, 0xe7b1ad, 0xe7b1ae, 0xe7b1af,
+ /* 6c */ 0xe7b1b0, 0xe7b1b1, 0xe7b1b2, 0xe7b1b5,
+ /* 70 */ 0xe7b1b6, 0xe7b1b7, 0xe7b1b8, 0xe7b1b9,
+ /* 74 */ 0xe7b1ba, 0xe7b1be, 0xe7b1bf, 0xe7b280,
+ /* 78 */ 0xe7b281, 0xe7b282, 0xe7b283, 0xe7b284,
+ /* 7c */ 0xe7b285, 0xe7b286, 0xe7b287, 0x000000,
+ /* 80 */ 0xe7b288, 0xe7b28a, 0xe7b28b, 0xe7b28c,
+ /* 84 */ 0xe7b28d, 0xe7b28e, 0xe7b28f, 0xe7b290,
+ /* 88 */ 0xe7b293, 0xe7b294, 0xe7b296, 0xe7b299,
+ /* 8c */ 0xe7b29a, 0xe7b29b, 0xe7b2a0, 0xe7b2a1,
+ /* 90 */ 0xe7b2a3, 0xe7b2a6, 0xe7b2a7, 0xe7b2a8,
+ /* 94 */ 0xe7b2a9, 0xe7b2ab, 0xe7b2ac, 0xe7b2ad,
+ /* 98 */ 0xe7b2af, 0xe7b2b0, 0xe7b2b4, 0xe7b2b5,
+ /* 9c */ 0xe7b2b6, 0xe7b2b7, 0xe7b2b8, 0xe7b2ba,
+ /* a0 */ 0xe7b2bb, 0xe5bca7, 0xe8998e, 0xe594ac,
+ /* a4 */ 0xe68aa4, 0xe4ba92, 0xe6b2aa, 0xe688b7,
+ /* a8 */ 0xe88ab1, 0xe59397, 0xe58d8e, 0xe78cbe,
+ /* ac */ 0xe6bb91, 0xe794bb, 0xe58892, 0xe58c96,
+ /* b0 */ 0xe8af9d, 0xe6a790, 0xe5be8a, 0xe68080,
+ /* b4 */ 0xe6b7ae, 0xe59d8f, 0xe6aca2, 0xe78eaf,
+ /* b8 */ 0xe6a193, 0xe8bf98, 0xe7bc93, 0xe68da2,
+ /* bc */ 0xe682a3, 0xe594a4, 0xe797aa, 0xe8b1a2,
+ /* c0 */ 0xe78495, 0xe6b6a3, 0xe5aea6, 0xe5b9bb,
+ /* c4 */ 0xe88d92, 0xe6858c, 0xe9bb84, 0xe7a3ba,
+ /* c8 */ 0xe89d97, 0xe7b0a7, 0xe79a87, 0xe587b0,
+ /* cc */ 0xe683b6, 0xe7858c, 0xe69983, 0xe5b98c,
+ /* d0 */ 0xe6818d, 0xe8b08e, 0xe781b0, 0xe68ca5,
+ /* d4 */ 0xe8be89, 0xe5bebd, 0xe681a2, 0xe89b94,
+ /* d8 */ 0xe59b9e, 0xe6af81, 0xe68294, 0xe685a7,
+ /* dc */ 0xe58d89, 0xe683a0, 0xe699a6, 0xe8b4bf,
+ /* e0 */ 0xe7a7bd, 0xe4bc9a, 0xe783a9, 0xe6b187,
+ /* e4 */ 0xe8aeb3, 0xe8afb2, 0xe7bb98, 0xe88da4,
+ /* e8 */ 0xe6988f, 0xe5a99a, 0xe9ad82, 0xe6b591,
+ /* ec */ 0xe6b7b7, 0xe8b181, 0xe6b4bb, 0xe4bc99,
+ /* f0 */ 0xe781ab, 0xe88eb7, 0xe68896, 0xe68391,
+ /* f4 */ 0xe99c8d, 0xe8b4a7, 0xe7a5b8, 0xe587bb,
+ /* f8 */ 0xe59cbe, 0xe59fba, 0xe69cba, 0xe795b8,
+ /* fc */ 0xe7a8bd, 0xe7a7af, 0xe7ae95,
+
+ /*** Two byte table, leaf: bcxx - offset 0x02d42 ***/
+
+ /* 40 */ 0xe7b2bf, 0xe7b380, 0xe7b382, 0xe7b383,
+ /* 44 */ 0xe7b384, 0xe7b386, 0xe7b389, 0xe7b38b,
+ /* 48 */ 0xe7b38e, 0xe7b38f, 0xe7b390, 0xe7b391,
+ /* 4c */ 0xe7b392, 0xe7b393, 0xe7b394, 0xe7b398,
+ /* 50 */ 0xe7b39a, 0xe7b39b, 0xe7b39d, 0xe7b39e,
+ /* 54 */ 0xe7b3a1, 0xe7b3a2, 0xe7b3a3, 0xe7b3a4,
+ /* 58 */ 0xe7b3a5, 0xe7b3a6, 0xe7b3a7, 0xe7b3a9,
+ /* 5c */ 0xe7b3aa, 0xe7b3ab, 0xe7b3ac, 0xe7b3ad,
+ /* 60 */ 0xe7b3ae, 0xe7b3b0, 0xe7b3b1, 0xe7b3b2,
+ /* 64 */ 0xe7b3b3, 0xe7b3b4, 0xe7b3b5, 0xe7b3b6,
+ /* 68 */ 0xe7b3b7, 0xe7b3b9, 0xe7b3ba, 0xe7b3bc,
+ /* 6c */ 0xe7b3bd, 0xe7b3be, 0xe7b3bf, 0xe7b480,
+ /* 70 */ 0xe7b481, 0xe7b482, 0xe7b483, 0xe7b484,
+ /* 74 */ 0xe7b485, 0xe7b486, 0xe7b487, 0xe7b488,
+ /* 78 */ 0xe7b489, 0xe7b48b, 0xe7b48c, 0xe7b48d,
+ /* 7c */ 0xe7b48e, 0xe7b48f, 0xe7b490, 0x000000,
+ /* 80 */ 0xe7b491, 0xe7b492, 0xe7b493, 0xe7b494,
+ /* 84 */ 0xe7b495, 0xe7b496, 0xe7b497, 0xe7b498,
+ /* 88 */ 0xe7b499, 0xe7b49a, 0xe7b49b, 0xe7b49c,
+ /* 8c */ 0xe7b49d, 0xe7b49e, 0xe7b49f, 0xe7b4a1,
+ /* 90 */ 0xe7b4a3, 0xe7b4a4, 0xe7b4a5, 0xe7b4a6,
+ /* 94 */ 0xe7b4a8, 0xe7b4a9, 0xe7b4aa, 0xe7b4ac,
+ /* 98 */ 0xe7b4ad, 0xe7b4ae, 0xe7b4b0, 0xe7b4b1,
+ /* 9c */ 0xe7b4b2, 0xe7b4b3, 0xe7b4b4, 0xe7b4b5,
+ /* a0 */ 0xe7b4b6, 0xe8828c, 0xe9a5a5, 0xe8bfb9,
+ /* a4 */ 0xe6bf80, 0xe8aea5, 0xe9b8a1, 0xe5a7ac,
+ /* a8 */ 0xe7bba9, 0xe7bc89, 0xe59089, 0xe69e81,
+ /* ac */ 0xe6a398, 0xe8be91, 0xe7b18d, 0xe99b86,
+ /* b0 */ 0xe58f8a, 0xe680a5, 0xe796be, 0xe6b1b2,
+ /* b4 */ 0xe58db3, 0xe5ab89, 0xe7baa7, 0xe68ca4,
+ /* b8 */ 0xe587a0, 0xe8848a, 0xe5b7b1, 0xe8939f,
+ /* bc */ 0xe68a80, 0xe58680, 0xe5ada3, 0xe4bc8e,
+ /* c0 */ 0xe7a5ad, 0xe58982, 0xe682b8, 0xe6b58e,
+ /* c4 */ 0xe5af84, 0xe5af82, 0xe8aea1, 0xe8aeb0,
+ /* c8 */ 0xe697a2, 0xe5bf8c, 0xe99985, 0xe5a693,
+ /* cc */ 0xe7bba7, 0xe7baaa, 0xe59889, 0xe69eb7,
+ /* d0 */ 0xe5a4b9, 0xe4bdb3, 0xe5aeb6, 0xe58aa0,
+ /* d4 */ 0xe88d9a, 0xe9a28a, 0xe8b4be, 0xe794b2,
+ /* d8 */ 0xe992be, 0xe58187, 0xe7a8bc, 0xe4bbb7,
+ /* dc */ 0xe69eb6, 0xe9a9be, 0xe5ab81, 0xe6adbc,
+ /* e0 */ 0xe79b91, 0xe59d9a, 0xe5b096, 0xe7acba,
+ /* e4 */ 0xe997b4, 0xe7858e, 0xe585bc, 0xe882a9,
+ /* e8 */ 0xe889b0, 0xe5a5b8, 0xe7bc84, 0xe88ca7,
+ /* ec */ 0xe6a380, 0xe69fac, 0xe7a2b1, 0xe7a1b7,
+ /* f0 */ 0xe68ba3, 0xe68da1, 0xe7ae80, 0xe4bfad,
+ /* f4 */ 0xe589aa, 0xe5878f, 0xe88d90, 0xe6a79b,
+ /* f8 */ 0xe989b4, 0xe8b7b5, 0xe8b4b1, 0xe8a781,
+ /* fc */ 0xe994ae, 0xe7aead, 0xe4bbb6,
+
+ /*** Two byte table, leaf: bdxx - offset 0x02e01 ***/
+
+ /* 40 */ 0xe7b4b7, 0xe7b4b8, 0xe7b4b9, 0xe7b4ba,
+ /* 44 */ 0xe7b4bb, 0xe7b4bc, 0xe7b4bd, 0xe7b4be,
+ /* 48 */ 0xe7b4bf, 0xe7b580, 0xe7b581, 0xe7b582,
+ /* 4c */ 0xe7b583, 0xe7b584, 0xe7b585, 0xe7b586,
+ /* 50 */ 0xe7b587, 0xe7b588, 0xe7b589, 0xe7b58a,
+ /* 54 */ 0xe7b58b, 0xe7b58c, 0xe7b58d, 0xe7b58e,
+ /* 58 */ 0xe7b58f, 0xe7b590, 0xe7b591, 0xe7b592,
+ /* 5c */ 0xe7b593, 0xe7b594, 0xe7b595, 0xe7b596,
+ /* 60 */ 0xe7b597, 0xe7b598, 0xe7b599, 0xe7b59a,
+ /* 64 */ 0xe7b59b, 0xe7b59c, 0xe7b59d, 0xe7b59e,
+ /* 68 */ 0xe7b59f, 0xe7b5a0, 0xe7b5a1, 0xe7b5a2,
+ /* 6c */ 0xe7b5a3, 0xe7b5a4, 0xe7b5a5, 0xe7b5a6,
+ /* 70 */ 0xe7b5a7, 0xe7b5a8, 0xe7b5a9, 0xe7b5aa,
+ /* 74 */ 0xe7b5ab, 0xe7b5ac, 0xe7b5ad, 0xe7b5af,
+ /* 78 */ 0xe7b5b0, 0xe7b5b1, 0xe7b5b2, 0xe7b5b3,
+ /* 7c */ 0xe7b5b4, 0xe7b5b5, 0xe7b5b6, 0x000000,
+ /* 80 */ 0xe7b5b8, 0xe7b5b9, 0xe7b5ba, 0xe7b5bb,
+ /* 84 */ 0xe7b5bc, 0xe7b5bd, 0xe7b5be, 0xe7b5bf,
+ /* 88 */ 0xe7b680, 0xe7b681, 0xe7b682, 0xe7b683,
+ /* 8c */ 0xe7b684, 0xe7b685, 0xe7b686, 0xe7b687,
+ /* 90 */ 0xe7b688, 0xe7b689, 0xe7b68a, 0xe7b68b,
+ /* 94 */ 0xe7b68c, 0xe7b68d, 0xe7b68e, 0xe7b68f,
+ /* 98 */ 0xe7b690, 0xe7b691, 0xe7b692, 0xe7b693,
+ /* 9c */ 0xe7b694, 0xe7b695, 0xe7b696, 0xe7b697,
+ /* a0 */ 0xe7b698, 0xe581a5, 0xe888b0, 0xe58991,
+ /* a4 */ 0xe9a5af, 0xe6b890, 0xe6ba85, 0xe6b6a7,
+ /* a8 */ 0xe5bbba, 0xe583b5, 0xe5a79c, 0xe5b086,
+ /* ac */ 0xe6b586, 0xe6b19f, 0xe79686, 0xe8928b,
+ /* b0 */ 0xe6a1a8, 0xe5a596, 0xe8aeb2, 0xe58ca0,
+ /* b4 */ 0xe985b1, 0xe9998d, 0xe89589, 0xe6a492,
+ /* b8 */ 0xe7a481, 0xe784a6, 0xe883b6, 0xe4baa4,
+ /* bc */ 0xe9838a, 0xe6b587, 0xe9aa84, 0xe5a887,
+ /* c0 */ 0xe59abc, 0xe69085, 0xe993b0, 0xe79fab,
+ /* c4 */ 0xe4bea5, 0xe8849a, 0xe78ba1, 0xe8a792,
+ /* c8 */ 0xe9a5ba, 0xe7bcb4, 0xe7bb9e, 0xe589bf,
+ /* cc */ 0xe69599, 0xe985b5, 0xe8bdbf, 0xe8be83,
+ /* d0 */ 0xe58fab, 0xe7aa96, 0xe68fad, 0xe68ea5,
+ /* d4 */ 0xe79a86, 0xe7a7b8, 0xe8a197, 0xe998b6,
+ /* d8 */ 0xe688aa, 0xe58aab, 0xe88a82, 0xe6a194,
+ /* dc */ 0xe69db0, 0xe68db7, 0xe79dab, 0xe7abad,
+ /* e0 */ 0xe6b481, 0xe7bb93, 0xe8a7a3, 0xe5a790,
+ /* e4 */ 0xe68892, 0xe89789, 0xe88aa5, 0xe7958c,
+ /* e8 */ 0xe5809f, 0xe4bb8b, 0xe796a5, 0xe8afab,
+ /* ec */ 0xe5b18a, 0xe5b7be, 0xe7ad8b, 0xe696a4,
+ /* f0 */ 0xe98791, 0xe4bb8a, 0xe6b4a5, 0xe8a59f,
+ /* f4 */ 0xe7b4a7, 0xe994a6, 0xe4bb85, 0xe8b0a8,
+ /* f8 */ 0xe8bf9b, 0xe99db3, 0xe6998b, 0xe7a681,
+ /* fc */ 0xe8bf91, 0xe783ac, 0xe6b5b8,
+
+ /*** Two byte table, leaf: bexx - offset 0x02ec0 ***/
+
+ /* 40 */ 0xe7b699, 0xe7b69a, 0xe7b69b, 0xe7b69c,
+ /* 44 */ 0xe7b69d, 0xe7b69e, 0xe7b69f, 0xe7b6a0,
+ /* 48 */ 0xe7b6a1, 0xe7b6a2, 0xe7b6a3, 0xe7b6a4,
+ /* 4c */ 0xe7b6a5, 0xe7b6a7, 0xe7b6a8, 0xe7b6a9,
+ /* 50 */ 0xe7b6aa, 0xe7b6ab, 0xe7b6ac, 0xe7b6ad,
+ /* 54 */ 0xe7b6af, 0xe7b6b0, 0xe7b6b1, 0xe7b6b2,
+ /* 58 */ 0xe7b6b3, 0xe7b6b4, 0xe7b6b5, 0xe7b6b6,
+ /* 5c */ 0xe7b6b7, 0xe7b6b8, 0xe7b6b9, 0xe7b6ba,
+ /* 60 */ 0xe7b6bb, 0xe7b6bc, 0xe7b6bd, 0xe7b6be,
+ /* 64 */ 0xe7b6bf, 0xe7b780, 0xe7b781, 0xe7b782,
+ /* 68 */ 0xe7b783, 0xe7b784, 0xe7b785, 0xe7b786,
+ /* 6c */ 0xe7b787, 0xe7b788, 0xe7b789, 0xe7b78a,
+ /* 70 */ 0xe7b78b, 0xe7b78c, 0xe7b78d, 0xe7b78e,
+ /* 74 */ 0xe7b78f, 0xe7b790, 0xe7b791, 0xe7b792,
+ /* 78 */ 0xe7b793, 0xe7b794, 0xe7b795, 0xe7b796,
+ /* 7c */ 0xe7b797, 0xe7b798, 0xe7b799, 0x000000,
+ /* 80 */ 0xe7b79a, 0xe7b79b, 0xe7b79c, 0xe7b79d,
+ /* 84 */ 0xe7b79e, 0xe7b79f, 0xe7b7a0, 0xe7b7a1,
+ /* 88 */ 0xe7b7a2, 0xe7b7a3, 0xe7b7a4, 0xe7b7a5,
+ /* 8c */ 0xe7b7a6, 0xe7b7a7, 0xe7b7a8, 0xe7b7a9,
+ /* 90 */ 0xe7b7aa, 0xe7b7ab, 0xe7b7ac, 0xe7b7ad,
+ /* 94 */ 0xe7b7ae, 0xe7b7af, 0xe7b7b0, 0xe7b7b1,
+ /* 98 */ 0xe7b7b2, 0xe7b7b3, 0xe7b7b4, 0xe7b7b5,
+ /* 9c */ 0xe7b7b6, 0xe7b7b7, 0xe7b7b8, 0xe7b7b9,
+ /* a0 */ 0xe7b7ba, 0xe5b0bd, 0xe58ab2, 0xe88d86,
+ /* a4 */ 0xe585a2, 0xe88c8e, 0xe79d9b, 0xe699b6,
+ /* a8 */ 0xe9b2b8, 0xe4baac, 0xe6838a, 0xe7b2be,
+ /* ac */ 0xe7b2b3, 0xe7bb8f, 0xe4ba95, 0xe8ada6,
+ /* b0 */ 0xe699af, 0xe9a288, 0xe99d99, 0xe5a283,
+ /* b4 */ 0xe695ac, 0xe9959c, 0xe5be84, 0xe79789,
+ /* b8 */ 0xe99d96, 0xe7ab9f, 0xe7ab9e, 0xe58780,
+ /* bc */ 0xe782af, 0xe7aa98, 0xe68faa, 0xe7a9b6,
+ /* c0 */ 0xe7baa0, 0xe78e96, 0xe99fad, 0xe4b985,
+ /* c4 */ 0xe781b8, 0xe4b99d, 0xe98592, 0xe58ea9,
+ /* c8 */ 0xe69591, 0xe697a7, 0xe887bc, 0xe88885,
+ /* cc */ 0xe5928e, 0xe5b0b1, 0xe7969a, 0xe99ea0,
+ /* d0 */ 0xe68b98, 0xe78b99, 0xe796bd, 0xe5b185,
+ /* d4 */ 0xe9a9b9, 0xe88f8a, 0xe5b180, 0xe59280,
+ /* d8 */ 0xe79fa9, 0xe4b8be, 0xe6b2ae, 0xe8819a,
+ /* dc */ 0xe68b92, 0xe68dae, 0xe5b7a8, 0xe585b7,
+ /* e0 */ 0xe8b79d, 0xe8b89e, 0xe994af, 0xe4bfb1,
+ /* e4 */ 0xe58fa5, 0xe683a7, 0xe782ac, 0xe589a7,
+ /* e8 */ 0xe68d90, 0xe9b983, 0xe5a89f, 0xe580a6,
+ /* ec */ 0xe79cb7, 0xe58db7, 0xe7bba2, 0xe69285,
+ /* f0 */ 0xe694ab, 0xe68a89, 0xe68e98, 0xe58094,
+ /* f4 */ 0xe788b5, 0xe8a789, 0xe586b3, 0xe8af80,
+ /* f8 */ 0xe7bb9d, 0xe59d87, 0xe88f8c, 0xe992a7,
+ /* fc */ 0xe5869b, 0xe5909b, 0xe5b3bb,
+
+ /*** Two byte table, leaf: bfxx - offset 0x02f7f ***/
+
+ /* 40 */ 0xe7b7bb, 0xe7b7bc, 0xe7b7bd, 0xe7b7be,
+ /* 44 */ 0xe7b7bf, 0xe7b880, 0xe7b881, 0xe7b882,
+ /* 48 */ 0xe7b883, 0xe7b884, 0xe7b885, 0xe7b886,
+ /* 4c */ 0xe7b887, 0xe7b888, 0xe7b889, 0xe7b88a,
+ /* 50 */ 0xe7b88b, 0xe7b88c, 0xe7b88d, 0xe7b88e,
+ /* 54 */ 0xe7b88f, 0xe7b890, 0xe7b891, 0xe7b892,
+ /* 58 */ 0xe7b893, 0xe7b894, 0xe7b895, 0xe7b896,
+ /* 5c */ 0xe7b897, 0xe7b898, 0xe7b899, 0xe7b89a,
+ /* 60 */ 0xe7b89b, 0xe7b89c, 0xe7b89d, 0xe7b89e,
+ /* 64 */ 0xe7b89f, 0xe7b8a0, 0xe7b8a1, 0xe7b8a2,
+ /* 68 */ 0xe7b8a3, 0xe7b8a4, 0xe7b8a5, 0xe7b8a6,
+ /* 6c */ 0xe7b8a7, 0xe7b8a8, 0xe7b8a9, 0xe7b8aa,
+ /* 70 */ 0xe7b8ab, 0xe7b8ac, 0xe7b8ad, 0xe7b8ae,
+ /* 74 */ 0xe7b8af, 0xe7b8b0, 0xe7b8b1, 0xe7b8b2,
+ /* 78 */ 0xe7b8b3, 0xe7b8b4, 0xe7b8b5, 0xe7b8b6,
+ /* 7c */ 0xe7b8b7, 0xe7b8b8, 0xe7b8b9, 0x000000,
+ /* 80 */ 0xe7b8ba, 0xe7b8bc, 0xe7b8bd, 0xe7b8be,
+ /* 84 */ 0xe7b8bf, 0xe7b980, 0xe7b982, 0xe7b983,
+ /* 88 */ 0xe7b984, 0xe7b985, 0xe7b986, 0xe7b988,
+ /* 8c */ 0xe7b989, 0xe7b98a, 0xe7b98b, 0xe7b98c,
+ /* 90 */ 0xe7b98d, 0xe7b98e, 0xe7b98f, 0xe7b990,
+ /* 94 */ 0xe7b991, 0xe7b992, 0xe7b993, 0xe7b994,
+ /* 98 */ 0xe7b995, 0xe7b996, 0xe7b997, 0xe7b998,
+ /* 9c */ 0xe7b999, 0xe7b99a, 0xe7b99b, 0xe7b99c,
+ /* a0 */ 0xe7b99d, 0xe4bf8a, 0xe7aba3, 0xe6b59a,
+ /* a4 */ 0xe983a1, 0xe9aa8f, 0xe59680, 0xe59296,
+ /* a8 */ 0xe58da1, 0xe592af, 0xe5bc80, 0xe68fa9,
+ /* ac */ 0xe6a5b7, 0xe587af, 0xe685a8, 0xe5888a,
+ /* b0 */ 0xe5a0aa, 0xe58b98, 0xe59d8e, 0xe7a08d,
+ /* b4 */ 0xe79c8b, 0xe5bab7, 0xe685b7, 0xe7b3a0,
+ /* b8 */ 0xe6899b, 0xe68a97, 0xe4baa2, 0xe78295,
+ /* bc */ 0xe88083, 0xe68bb7, 0xe783a4, 0xe99da0,
+ /* c0 */ 0xe59db7, 0xe88b9b, 0xe69faf, 0xe6a3b5,
+ /* c4 */ 0xe7a395, 0xe9a297, 0xe7a791, 0xe5a3b3,
+ /* c8 */ 0xe592b3, 0xe58faf, 0xe6b8b4, 0xe5858b,
+ /* cc */ 0xe588bb, 0xe5aea2, 0xe8afbe, 0xe882af,
+ /* d0 */ 0xe59583, 0xe59ea6, 0xe681b3, 0xe59d91,
+ /* d4 */ 0xe590ad, 0xe7a9ba, 0xe68190, 0xe5ad94,
+ /* d8 */ 0xe68ea7, 0xe68aa0, 0xe58fa3, 0xe689a3,
+ /* dc */ 0xe5af87, 0xe69eaf, 0xe593ad, 0xe7aa9f,
+ /* e0 */ 0xe88ba6, 0xe985b7, 0xe5ba93, 0xe8a3a4,
+ /* e4 */ 0xe5a4b8, 0xe59eae, 0xe68c8e, 0xe8b7a8,
+ /* e8 */ 0xe883af, 0xe59d97, 0xe7adb7, 0xe4bea9,
+ /* ec */ 0xe5bfab, 0xe5aebd, 0xe6acbe, 0xe58ca1,
+ /* f0 */ 0xe7ad90, 0xe78b82, 0xe6a186, 0xe79fbf,
+ /* f4 */ 0xe79cb6, 0xe697b7, 0xe586b5, 0xe4ba8f,
+ /* f8 */ 0xe79b94, 0xe5b2bf, 0xe7aaa5, 0xe891b5,
+ /* fc */ 0xe5a58e, 0xe9ad81, 0xe58280,
+
+ /*** Two byte table, leaf: c0xx - offset 0x0303e ***/
+
+ /* 40 */ 0xe7b99e, 0xe7b99f, 0xe7b9a0, 0xe7b9a1,
+ /* 44 */ 0xe7b9a2, 0xe7b9a3, 0xe7b9a4, 0xe7b9a5,
+ /* 48 */ 0xe7b9a6, 0xe7b9a7, 0xe7b9a8, 0xe7b9a9,
+ /* 4c */ 0xe7b9aa, 0xe7b9ab, 0xe7b9ac, 0xe7b9ad,
+ /* 50 */ 0xe7b9ae, 0xe7b9af, 0xe7b9b0, 0xe7b9b1,
+ /* 54 */ 0xe7b9b2, 0xe7b9b3, 0xe7b9b4, 0xe7b9b5,
+ /* 58 */ 0xe7b9b6, 0xe7b9b7, 0xe7b9b8, 0xe7b9b9,
+ /* 5c */ 0xe7b9ba, 0xe7b9bb, 0xe7b9bc, 0xe7b9bd,
+ /* 60 */ 0xe7b9be, 0xe7b9bf, 0xe7ba80, 0xe7ba81,
+ /* 64 */ 0xe7ba83, 0xe7ba84, 0xe7ba85, 0xe7ba86,
+ /* 68 */ 0xe7ba87, 0xe7ba88, 0xe7ba89, 0xe7ba8a,
+ /* 6c */ 0xe7ba8b, 0xe7ba8c, 0xe7ba8d, 0xe7ba8e,
+ /* 70 */ 0xe7ba8f, 0xe7ba90, 0xe7ba91, 0xe7ba92,
+ /* 74 */ 0xe7ba93, 0xe7ba94, 0xe7ba95, 0xe7ba96,
+ /* 78 */ 0xe7ba97, 0xe7ba98, 0xe7ba99, 0xe7ba9a,
+ /* 7c */ 0xe7ba9c, 0xe7ba9d, 0xe7ba9e, 0x000000,
+ /* 80 */ 0xe7baae, 0xe7bab4, 0xe7babb, 0xe7babc,
+ /* 84 */ 0xe7bb96, 0xe7bba4, 0xe7bbac, 0xe7bbb9,
+ /* 88 */ 0xe7bc8a, 0xe7bc90, 0xe7bc9e, 0xe7bcb7,
+ /* 8c */ 0xe7bcb9, 0xe7bcbb, 0xe7bcbc, 0xe7bcbd,
+ /* 90 */ 0xe7bcbe, 0xe7bcbf, 0xe7bd80, 0xe7bd81,
+ /* 94 */ 0xe7bd83, 0xe7bd86, 0xe7bd87, 0xe7bd88,
+ /* 98 */ 0xe7bd89, 0xe7bd8a, 0xe7bd8b, 0xe7bd8c,
+ /* 9c */ 0xe7bd8d, 0xe7bd8e, 0xe7bd8f, 0xe7bd92,
+ /* a0 */ 0xe7bd93, 0xe9a688, 0xe684a7, 0xe6ba83,
+ /* a4 */ 0xe59da4, 0xe69886, 0xe68d86, 0xe59bb0,
+ /* a8 */ 0xe68bac, 0xe689a9, 0xe5bb93, 0xe99894,
+ /* ac */ 0xe59e83, 0xe68b89, 0xe59687, 0xe89ca1,
+ /* b0 */ 0xe8858a, 0xe8bea3, 0xe595a6, 0xe88eb1,
+ /* b4 */ 0xe69da5, 0xe8b596, 0xe8939d, 0xe5a9aa,
+ /* b8 */ 0xe6a08f, 0xe68ba6, 0xe7afae, 0xe99891,
+ /* bc */ 0xe585b0, 0xe6be9c, 0xe8b0b0, 0xe68fbd,
+ /* c0 */ 0xe8a788, 0xe68792, 0xe7bc86, 0xe78382,
+ /* c4 */ 0xe6bba5, 0xe79085, 0xe6a694, 0xe78bbc,
+ /* c8 */ 0xe5bb8a, 0xe9838e, 0xe69c97, 0xe6b5aa,
+ /* cc */ 0xe68d9e, 0xe58ab3, 0xe789a2, 0xe88081,
+ /* d0 */ 0xe4bdac, 0xe5a7a5, 0xe985aa, 0xe78399,
+ /* d4 */ 0xe6b69d, 0xe58b92, 0xe4b990, 0xe99bb7,
+ /* d8 */ 0xe995ad, 0xe895be, 0xe7a38a, 0xe7b4af,
+ /* dc */ 0xe584a1, 0xe59e92, 0xe69382, 0xe8828b,
+ /* e0 */ 0xe7b1bb, 0xe6b3aa, 0xe6a3b1, 0xe6a59e,
+ /* e4 */ 0xe586b7, 0xe58e98, 0xe6a2a8, 0xe78a81,
+ /* e8 */ 0xe9bb8e, 0xe7afb1, 0xe78bb8, 0xe7a6bb,
+ /* ec */ 0xe6bc93, 0xe79086, 0xe69d8e, 0xe9878c,
+ /* f0 */ 0xe9b2a4, 0xe7a4bc, 0xe88e89, 0xe88d94,
+ /* f4 */ 0xe5908f, 0xe6a097, 0xe4b8bd, 0xe58e89,
+ /* f8 */ 0xe58ab1, 0xe7a0be, 0xe58e86, 0xe588a9,
+ /* fc */ 0xe58288, 0xe4be8b, 0xe4bf90,
+
+ /*** Two byte table, leaf: c1xx - offset 0x030fd ***/
+
+ /* 40 */ 0xe7bd96, 0xe7bd99, 0xe7bd9b, 0xe7bd9c,
+ /* 44 */ 0xe7bd9d, 0xe7bd9e, 0xe7bda0, 0xe7bda3,
+ /* 48 */ 0xe7bda4, 0xe7bda5, 0xe7bda6, 0xe7bda7,
+ /* 4c */ 0xe7bdab, 0xe7bdac, 0xe7bdad, 0xe7bdaf,
+ /* 50 */ 0xe7bdb0, 0xe7bdb3, 0xe7bdb5, 0xe7bdb6,
+ /* 54 */ 0xe7bdb7, 0xe7bdb8, 0xe7bdba, 0xe7bdbb,
+ /* 58 */ 0xe7bdbc, 0xe7bdbd, 0xe7bdbf, 0xe7be80,
+ /* 5c */ 0xe7be82, 0xe7be83, 0xe7be84, 0xe7be85,
+ /* 60 */ 0xe7be86, 0xe7be87, 0xe7be88, 0xe7be89,
+ /* 64 */ 0xe7be8b, 0xe7be8d, 0xe7be8f, 0xe7be90,
+ /* 68 */ 0xe7be91, 0xe7be92, 0xe7be93, 0xe7be95,
+ /* 6c */ 0xe7be96, 0xe7be97, 0xe7be98, 0xe7be99,
+ /* 70 */ 0xe7be9b, 0xe7be9c, 0xe7bea0, 0xe7bea2,
+ /* 74 */ 0xe7bea3, 0xe7bea5, 0xe7bea6, 0xe7bea8,
+ /* 78 */ 0xe7bea9, 0xe7beaa, 0xe7beab, 0xe7beac,
+ /* 7c */ 0xe7bead, 0xe7beae, 0xe7beb1, 0x000000,
+ /* 80 */ 0xe7beb3, 0xe7beb4, 0xe7beb5, 0xe7beb6,
+ /* 84 */ 0xe7beb7, 0xe7beba, 0xe7bebb, 0xe7bebe,
+ /* 88 */ 0xe7bf80, 0xe7bf82, 0xe7bf83, 0xe7bf84,
+ /* 8c */ 0xe7bf86, 0xe7bf87, 0xe7bf88, 0xe7bf89,
+ /* 90 */ 0xe7bf8b, 0xe7bf8d, 0xe7bf8f, 0xe7bf90,
+ /* 94 */ 0xe7bf91, 0xe7bf92, 0xe7bf93, 0xe7bf96,
+ /* 98 */ 0xe7bf97, 0xe7bf99, 0xe7bf9a, 0xe7bf9b,
+ /* 9c */ 0xe7bf9c, 0xe7bf9d, 0xe7bf9e, 0xe7bfa2,
+ /* a0 */ 0xe7bfa3, 0xe797a2, 0xe7ab8b, 0xe7b292,
+ /* a4 */ 0xe6b2a5, 0xe99ab6, 0xe58a9b, 0xe79283,
+ /* a8 */ 0xe593a9, 0xe4bfa9, 0xe88194, 0xe88eb2,
+ /* ac */ 0xe8bf9e, 0xe995b0, 0xe5bb89, 0xe6809c,
+ /* b0 */ 0xe6b69f, 0xe5b898, 0xe6959b, 0xe884b8,
+ /* b4 */ 0xe993be, 0xe6818b, 0xe782bc, 0xe7bb83,
+ /* b8 */ 0xe7b2ae, 0xe58789, 0xe6a281, 0xe7b2b1,
+ /* bc */ 0xe889af, 0xe4b8a4, 0xe8be86, 0xe9878f,
+ /* c0 */ 0xe699be, 0xe4baae, 0xe8b085, 0xe692a9,
+ /* c4 */ 0xe8818a, 0xe5839a, 0xe79697, 0xe7878e,
+ /* c8 */ 0xe5afa5, 0xe8bebd, 0xe6bda6, 0xe4ba86,
+ /* cc */ 0xe69282, 0xe995a3, 0xe5bb96, 0xe69699,
+ /* d0 */ 0xe58897, 0xe8a382, 0xe78388, 0xe58aa3,
+ /* d4 */ 0xe78c8e, 0xe790b3, 0xe69e97, 0xe7a3b7,
+ /* d8 */ 0xe99c96, 0xe4b8b4, 0xe982bb, 0xe9b39e,
+ /* dc */ 0xe6b78b, 0xe5879b, 0xe8b581, 0xe5909d,
+ /* e0 */ 0xe68b8e, 0xe78eb2, 0xe88fb1, 0xe99bb6,
+ /* e4 */ 0xe9be84, 0xe99383, 0xe4bcb6, 0xe7be9a,
+ /* e8 */ 0xe5878c, 0xe781b5, 0xe999b5, 0xe5b2ad,
+ /* ec */ 0xe9a286, 0xe58fa6, 0xe4bba4, 0xe6ba9c,
+ /* f0 */ 0xe79089, 0xe6a6b4, 0xe7a1ab, 0xe9a68f,
+ /* f4 */ 0xe79599, 0xe58898, 0xe798a4, 0xe6b581,
+ /* f8 */ 0xe69fb3, 0xe585ad, 0xe9be99, 0xe8818b,
+ /* fc */ 0xe59299, 0xe7acbc, 0xe7aabf,
+
+ /*** Two byte table, leaf: c2xx - offset 0x031bc ***/
+
+ /* 40 */ 0xe7bfa4, 0xe7bfa7, 0xe7bfa8, 0xe7bfaa,
+ /* 44 */ 0xe7bfab, 0xe7bfac, 0xe7bfad, 0xe7bfaf,
+ /* 48 */ 0xe7bfb2, 0xe7bfb4, 0xe7bfb5, 0xe7bfb6,
+ /* 4c */ 0xe7bfb7, 0xe7bfb8, 0xe7bfb9, 0xe7bfba,
+ /* 50 */ 0xe7bfbd, 0xe7bfbe, 0xe7bfbf, 0xe88082,
+ /* 54 */ 0xe88087, 0xe88088, 0xe88089, 0xe8808a,
+ /* 58 */ 0xe8808e, 0xe8808f, 0xe88091, 0xe88093,
+ /* 5c */ 0xe8809a, 0xe8809b, 0xe8809d, 0xe8809e,
+ /* 60 */ 0xe8809f, 0xe880a1, 0xe880a3, 0xe880a4,
+ /* 64 */ 0xe880ab, 0xe880ac, 0xe880ad, 0xe880ae,
+ /* 68 */ 0xe880af, 0xe880b0, 0xe880b2, 0xe880b4,
+ /* 6c */ 0xe880b9, 0xe880ba, 0xe880bc, 0xe880be,
+ /* 70 */ 0xe88180, 0xe88181, 0xe88184, 0xe88185,
+ /* 74 */ 0xe88187, 0xe88188, 0xe88189, 0xe8818e,
+ /* 78 */ 0xe8818f, 0xe88190, 0xe88191, 0xe88193,
+ /* 7c */ 0xe88195, 0xe88196, 0xe88197, 0x000000,
+ /* 80 */ 0xe88199, 0xe8819b, 0xe8819c, 0xe8819d,
+ /* 84 */ 0xe8819e, 0xe8819f, 0xe881a0, 0xe881a1,
+ /* 88 */ 0xe881a2, 0xe881a3, 0xe881a4, 0xe881a5,
+ /* 8c */ 0xe881a6, 0xe881a7, 0xe881a8, 0xe881ab,
+ /* 90 */ 0xe881ac, 0xe881ad, 0xe881ae, 0xe881af,
+ /* 94 */ 0xe881b0, 0xe881b2, 0xe881b3, 0xe881b4,
+ /* 98 */ 0xe881b5, 0xe881b6, 0xe881b7, 0xe881b8,
+ /* 9c */ 0xe881b9, 0xe881ba, 0xe881bb, 0xe881bc,
+ /* a0 */ 0xe881bd, 0xe99a86, 0xe59e84, 0xe68ba2,
+ /* a4 */ 0xe99987, 0xe6a5bc, 0xe5a884, 0xe69082,
+ /* a8 */ 0xe7af93, 0xe6bc8f, 0xe9998b, 0xe88aa6,
+ /* ac */ 0xe58da2, 0xe9a285, 0xe5ba90, 0xe78289,
+ /* b0 */ 0xe68eb3, 0xe58da4, 0xe8998f, 0xe9b281,
+ /* b4 */ 0xe9ba93, 0xe7a28c, 0xe99cb2, 0xe8b7af,
+ /* b8 */ 0xe8b582, 0xe9b9bf, 0xe6bd9e, 0xe7a684,
+ /* bc */ 0xe5bd95, 0xe99986, 0xe688ae, 0xe9a9b4,
+ /* c0 */ 0xe59095, 0xe9939d, 0xe4bea3, 0xe69785,
+ /* c4 */ 0xe5b1a5, 0xe5b1a1, 0xe7bc95, 0xe89991,
+ /* c8 */ 0xe6b0af, 0xe5be8b, 0xe78e87, 0xe6bba4,
+ /* cc */ 0xe7bbbf, 0xe5b3a6, 0xe68c9b, 0xe5adaa,
+ /* d0 */ 0xe6bba6, 0xe58db5, 0xe4b9b1, 0xe68ea0,
+ /* d4 */ 0xe795a5, 0xe68aa1, 0xe8bdae, 0xe4bca6,
+ /* d8 */ 0xe4bb91, 0xe6b2a6, 0xe7bab6, 0xe8aeba,
+ /* dc */ 0xe8909d, 0xe89eba, 0xe7bd97, 0xe980bb,
+ /* e0 */ 0xe994a3, 0xe7aea9, 0xe9aaa1, 0xe8a3b8,
+ /* e4 */ 0xe890bd, 0xe6b49b, 0xe9aa86, 0xe7bb9c,
+ /* e8 */ 0xe5a688, 0xe9babb, 0xe78e9b, 0xe7a081,
+ /* ec */ 0xe89a82, 0xe9a9ac, 0xe9aa82, 0xe5989b,
+ /* f0 */ 0xe59097, 0xe59f8b, 0xe4b9b0, 0xe9baa6,
+ /* f4 */ 0xe58d96, 0xe8bf88, 0xe88489, 0xe79e92,
+ /* f8 */ 0xe9a692, 0xe89bae, 0xe6bba1, 0xe89493,
+ /* fc */ 0xe69bbc, 0xe685a2, 0xe6bcab,
+
+ /*** Two byte table, leaf: c3xx - offset 0x0327b ***/
+
+ /* 40 */ 0xe881be, 0xe88281, 0xe88282, 0xe88285,
+ /* 44 */ 0xe88288, 0xe8828a, 0xe8828d, 0xe8828e,
+ /* 48 */ 0xe8828f, 0xe88290, 0xe88291, 0xe88292,
+ /* 4c */ 0xe88294, 0xe88295, 0xe88297, 0xe88299,
+ /* 50 */ 0xe8829e, 0xe882a3, 0xe882a6, 0xe882a7,
+ /* 54 */ 0xe882a8, 0xe882ac, 0xe882b0, 0xe882b3,
+ /* 58 */ 0xe882b5, 0xe882b6, 0xe882b8, 0xe882b9,
+ /* 5c */ 0xe882bb, 0xe88385, 0xe88387, 0xe88388,
+ /* 60 */ 0xe88389, 0xe8838a, 0xe8838b, 0xe8838f,
+ /* 64 */ 0xe88390, 0xe88391, 0xe88392, 0xe88393,
+ /* 68 */ 0xe88394, 0xe88395, 0xe88398, 0xe8839f,
+ /* 6c */ 0xe883a0, 0xe883a2, 0xe883a3, 0xe883a6,
+ /* 70 */ 0xe883ae, 0xe883b5, 0xe883b7, 0xe883b9,
+ /* 74 */ 0xe883bb, 0xe883be, 0xe883bf, 0xe88480,
+ /* 78 */ 0xe88481, 0xe88483, 0xe88484, 0xe88485,
+ /* 7c */ 0xe88487, 0xe88488, 0xe8848b, 0x000000,
+ /* 80 */ 0xe8848c, 0xe88495, 0xe88497, 0xe88499,
+ /* 84 */ 0xe8849b, 0xe8849c, 0xe8849d, 0xe8849f,
+ /* 88 */ 0xe884a0, 0xe884a1, 0xe884a2, 0xe884a3,
+ /* 8c */ 0xe884a4, 0xe884a5, 0xe884a6, 0xe884a7,
+ /* 90 */ 0xe884a8, 0xe884a9, 0xe884aa, 0xe884ab,
+ /* 94 */ 0xe884ad, 0xe884ae, 0xe884b0, 0xe884b3,
+ /* 98 */ 0xe884b4, 0xe884b5, 0xe884b7, 0xe884b9,
+ /* 9c */ 0xe884ba, 0xe884bb, 0xe884bc, 0xe884bd,
+ /* a0 */ 0xe884bf, 0xe8b0a9, 0xe88a92, 0xe88cab,
+ /* a4 */ 0xe79bb2, 0xe6b093, 0xe5bf99, 0xe88ebd,
+ /* a8 */ 0xe78cab, 0xe88c85, 0xe9949a, 0xe6af9b,
+ /* ac */ 0xe79f9b, 0xe99386, 0xe58daf, 0xe88c82,
+ /* b0 */ 0xe58692, 0xe5b8bd, 0xe8b28c, 0xe8b4b8,
+ /* b4 */ 0xe4b988, 0xe78eab, 0xe69e9a, 0xe6a285,
+ /* b8 */ 0xe985b6, 0xe99c89, 0xe785a4, 0xe6b2a1,
+ /* bc */ 0xe79c89, 0xe5aa92, 0xe99581, 0xe6af8f,
+ /* c0 */ 0xe7be8e, 0xe698a7, 0xe5af90, 0xe5a6b9,
+ /* c4 */ 0xe5aa9a, 0xe997a8, 0xe997b7, 0xe4bbac,
+ /* c8 */ 0xe8908c, 0xe89299, 0xe6aaac, 0xe79b9f,
+ /* cc */ 0xe994b0, 0xe78c9b, 0xe6a2a6, 0xe5ad9f,
+ /* d0 */ 0xe79caf, 0xe9869a, 0xe99da1, 0xe7b39c,
+ /* d4 */ 0xe8bfb7, 0xe8b09c, 0xe5bca5, 0xe7b1b3,
+ /* d8 */ 0xe7a798, 0xe8a785, 0xe6b38c, 0xe89c9c,
+ /* dc */ 0xe5af86, 0xe5b982, 0xe6a389, 0xe79ca0,
+ /* e0 */ 0xe7bbb5, 0xe58695, 0xe5858d, 0xe58b89,
+ /* e4 */ 0xe5a8a9, 0xe7bc85, 0xe99da2, 0xe88b97,
+ /* e8 */ 0xe68f8f, 0xe79e84, 0xe89790, 0xe7a792,
+ /* ec */ 0xe6b8ba, 0xe5ba99, 0xe5a699, 0xe89491,
+ /* f0 */ 0xe781ad, 0xe6b091, 0xe68abf, 0xe79abf,
+ /* f4 */ 0xe6958f, 0xe682af, 0xe997bd, 0xe6988e,
+ /* f8 */ 0xe89e9f, 0xe9b8a3, 0xe993ad, 0xe5908d,
+ /* fc */ 0xe591bd, 0xe8b0ac, 0xe691b8,
+
+ /*** Two byte table, leaf: c4xx - offset 0x0333a ***/
+
+ /* 40 */ 0xe88580, 0xe88581, 0xe88582, 0xe88583,
+ /* 44 */ 0xe88584, 0xe88585, 0xe88587, 0xe88589,
+ /* 48 */ 0xe8858d, 0xe8858e, 0xe8858f, 0xe88592,
+ /* 4c */ 0xe88596, 0xe88597, 0xe88598, 0xe8859b,
+ /* 50 */ 0xe8859c, 0xe8859d, 0xe8859e, 0xe8859f,
+ /* 54 */ 0xe885a1, 0xe885a2, 0xe885a3, 0xe885a4,
+ /* 58 */ 0xe885a6, 0xe885a8, 0xe885aa, 0xe885ab,
+ /* 5c */ 0xe885ac, 0xe885af, 0xe885b2, 0xe885b3,
+ /* 60 */ 0xe885b5, 0xe885b6, 0xe885b7, 0xe885b8,
+ /* 64 */ 0xe88681, 0xe88683, 0xe88684, 0xe88685,
+ /* 68 */ 0xe88686, 0xe88687, 0xe88689, 0xe8868b,
+ /* 6c */ 0xe8868c, 0xe8868d, 0xe8868e, 0xe88690,
+ /* 70 */ 0xe88692, 0xe88693, 0xe88694, 0xe88695,
+ /* 74 */ 0xe88696, 0xe88697, 0xe88699, 0xe8869a,
+ /* 78 */ 0xe8869e, 0xe8869f, 0xe886a0, 0xe886a1,
+ /* 7c */ 0xe886a2, 0xe886a4, 0xe886a5, 0x000000,
+ /* 80 */ 0xe886a7, 0xe886a9, 0xe886ab, 0xe886ac,
+ /* 84 */ 0xe886ad, 0xe886ae, 0xe886af, 0xe886b0,
+ /* 88 */ 0xe886b1, 0xe886b2, 0xe886b4, 0xe886b5,
+ /* 8c */ 0xe886b6, 0xe886b7, 0xe886b8, 0xe886b9,
+ /* 90 */ 0xe886bc, 0xe886bd, 0xe886be, 0xe886bf,
+ /* 94 */ 0xe88784, 0xe88785, 0xe88787, 0xe88788,
+ /* 98 */ 0xe88789, 0xe8878b, 0xe8878d, 0xe8878e,
+ /* 9c */ 0xe8878f, 0xe88790, 0xe88791, 0xe88792,
+ /* a0 */ 0xe88793, 0xe691b9, 0xe89891, 0xe6a8a1,
+ /* a4 */ 0xe8869c, 0xe7a3a8, 0xe691a9, 0xe9ad94,
+ /* a8 */ 0xe68ab9, 0xe69cab, 0xe88eab, 0xe5a2a8,
+ /* ac */ 0xe9bb98, 0xe6b2ab, 0xe6bca0, 0xe5af9e,
+ /* b0 */ 0xe9998c, 0xe8b08b, 0xe7899f, 0xe69f90,
+ /* b4 */ 0xe68b87, 0xe789a1, 0xe4baa9, 0xe5a786,
+ /* b8 */ 0xe6af8d, 0xe5a293, 0xe69aae, 0xe5b995,
+ /* bc */ 0xe58b9f, 0xe68595, 0xe69ca8, 0xe79bae,
+ /* c0 */ 0xe79da6, 0xe789a7, 0xe7a986, 0xe68bbf,
+ /* c4 */ 0xe593aa, 0xe59190, 0xe992a0, 0xe982a3,
+ /* c8 */ 0xe5a89c, 0xe7bab3, 0xe6b096, 0xe4b983,
+ /* cc */ 0xe5a5b6, 0xe88090, 0xe5a588, 0xe58d97,
+ /* d0 */ 0xe794b7, 0xe99abe, 0xe59b8a, 0xe68ca0,
+ /* d4 */ 0xe88491, 0xe681bc, 0xe997b9, 0xe6b796,
+ /* d8 */ 0xe591a2, 0xe9a681, 0xe58685, 0xe5aba9,
+ /* dc */ 0xe883bd, 0xe5a6ae, 0xe99c93, 0xe580aa,
+ /* e0 */ 0xe6b3a5, 0xe5b0bc, 0xe68b9f, 0xe4bda0,
+ /* e4 */ 0xe58cbf, 0xe885bb, 0xe98086, 0xe6baba,
+ /* e8 */ 0xe894ab, 0xe68b88, 0xe5b9b4, 0xe7a2be,
+ /* ec */ 0xe692b5, 0xe68dbb, 0xe5bfb5, 0xe5a898,
+ /* f0 */ 0xe985bf, 0xe9b89f, 0xe5b0bf, 0xe68d8f,
+ /* f4 */ 0xe88182, 0xe5adbd, 0xe595ae, 0xe9958a,
+ /* f8 */ 0xe9958d, 0xe6b685, 0xe682a8, 0xe69fa0,
+ /* fc */ 0xe78b9e, 0xe5879d, 0xe5ae81,
+
+ /*** Two byte table, leaf: c5xx - offset 0x033f9 ***/
+
+ /* 40 */ 0xe88794, 0xe88795, 0xe88796, 0xe88797,
+ /* 44 */ 0xe88798, 0xe88799, 0xe8879a, 0xe8879b,
+ /* 48 */ 0xe8879c, 0xe8879d, 0xe8879e, 0xe8879f,
+ /* 4c */ 0xe887a0, 0xe887a1, 0xe887a2, 0xe887a4,
+ /* 50 */ 0xe887a5, 0xe887a6, 0xe887a8, 0xe887a9,
+ /* 54 */ 0xe887ab, 0xe887ae, 0xe887af, 0xe887b0,
+ /* 58 */ 0xe887b1, 0xe887b2, 0xe887b5, 0xe887b6,
+ /* 5c */ 0xe887b7, 0xe887b8, 0xe887b9, 0xe887ba,
+ /* 60 */ 0xe887bd, 0xe887bf, 0xe88883, 0xe88887,
+ /* 64 */ 0xe88888, 0xe88889, 0xe8888a, 0xe8888b,
+ /* 68 */ 0xe8888e, 0xe8888f, 0xe88891, 0xe88893,
+ /* 6c */ 0xe88895, 0xe88896, 0xe88897, 0xe88898,
+ /* 70 */ 0xe88899, 0xe8889a, 0xe8889d, 0xe888a0,
+ /* 74 */ 0xe888a4, 0xe888a5, 0xe888a6, 0xe888a7,
+ /* 78 */ 0xe888a9, 0xe888ae, 0xe888b2, 0xe888ba,
+ /* 7c */ 0xe888bc, 0xe888bd, 0xe888bf, 0x000000,
+ /* 80 */ 0xe88980, 0xe88981, 0xe88982, 0xe88983,
+ /* 84 */ 0xe88985, 0xe88986, 0xe88988, 0xe8898a,
+ /* 88 */ 0xe8898c, 0xe8898d, 0xe8898e, 0xe88990,
+ /* 8c */ 0xe88991, 0xe88992, 0xe88993, 0xe88994,
+ /* 90 */ 0xe88995, 0xe88996, 0xe88997, 0xe88999,
+ /* 94 */ 0xe8899b, 0xe8899c, 0xe8899d, 0xe8899e,
+ /* 98 */ 0xe889a0, 0xe889a1, 0xe889a2, 0xe889a3,
+ /* 9c */ 0xe889a4, 0xe889a5, 0xe889a6, 0xe889a7,
+ /* a0 */ 0xe889a9, 0xe68ba7, 0xe6b39e, 0xe7899b,
+ /* a4 */ 0xe689ad, 0xe992ae, 0xe7babd, 0xe88493,
+ /* a8 */ 0xe6b593, 0xe5869c, 0xe5bc84, 0xe5a5b4,
+ /* ac */ 0xe58aaa, 0xe68092, 0xe5a5b3, 0xe69a96,
+ /* b0 */ 0xe89990, 0xe7969f, 0xe68caa, 0xe687a6,
+ /* b4 */ 0xe7b3af, 0xe8afba, 0xe593a6, 0xe6aca7,
+ /* b8 */ 0xe9b8a5, 0xe6aeb4, 0xe89795, 0xe59195,
+ /* bc */ 0xe581b6, 0xe6b2a4, 0xe595aa, 0xe8b6b4,
+ /* c0 */ 0xe788ac, 0xe5b895, 0xe68095, 0xe790b6,
+ /* c4 */ 0xe68b8d, 0xe68e92, 0xe7898c, 0xe5be98,
+ /* c8 */ 0xe6b983, 0xe6b4be, 0xe69480, 0xe6bd98,
+ /* cc */ 0xe79b98, 0xe7a390, 0xe79bbc, 0xe79594,
+ /* d0 */ 0xe588a4, 0xe58f9b, 0xe4b993, 0xe5ba9e,
+ /* d4 */ 0xe69781, 0xe880aa, 0xe88396, 0xe68a9b,
+ /* d8 */ 0xe59286, 0xe588a8, 0xe782ae, 0xe8a28d,
+ /* dc */ 0xe8b791, 0xe6b3a1, 0xe591b8, 0xe8839a,
+ /* e0 */ 0xe59fb9, 0xe8a3b4, 0xe8b594, 0xe999aa,
+ /* e4 */ 0xe9858d, 0xe4bda9, 0xe6b29b, 0xe596b7,
+ /* e8 */ 0xe79b86, 0xe7a0b0, 0xe68aa8, 0xe783b9,
+ /* ec */ 0xe6be8e, 0xe5bdad, 0xe893ac, 0xe6a39a,
+ /* f0 */ 0xe7a1bc, 0xe7afb7, 0xe886a8, 0xe69c8b,
+ /* f4 */ 0xe9b98f, 0xe68da7, 0xe7a2b0, 0xe59daf,
+ /* f8 */ 0xe7a092, 0xe99cb9, 0xe689b9, 0xe68aab,
+ /* fc */ 0xe58a88, 0xe790b5, 0xe6af97,
+
+ /*** Two byte table, leaf: c6xx - offset 0x034b8 ***/
+
+ /* 40 */ 0xe889aa, 0xe889ab, 0xe889ac, 0xe889ad,
+ /* 44 */ 0xe889b1, 0xe889b5, 0xe889b6, 0xe889b7,
+ /* 48 */ 0xe889b8, 0xe889bb, 0xe889bc, 0xe88a80,
+ /* 4c */ 0xe88a81, 0xe88a83, 0xe88a85, 0xe88a86,
+ /* 50 */ 0xe88a87, 0xe88a89, 0xe88a8c, 0xe88a90,
+ /* 54 */ 0xe88a93, 0xe88a94, 0xe88a95, 0xe88a96,
+ /* 58 */ 0xe88a9a, 0xe88a9b, 0xe88a9e, 0xe88aa0,
+ /* 5c */ 0xe88aa2, 0xe88aa3, 0xe88aa7, 0xe88ab2,
+ /* 60 */ 0xe88ab5, 0xe88ab6, 0xe88aba, 0xe88abb,
+ /* 64 */ 0xe88abc, 0xe88abf, 0xe88b80, 0xe88b82,
+ /* 68 */ 0xe88b83, 0xe88b85, 0xe88b86, 0xe88b89,
+ /* 6c */ 0xe88b90, 0xe88b96, 0xe88b99, 0xe88b9a,
+ /* 70 */ 0xe88b9d, 0xe88ba2, 0xe88ba7, 0xe88ba8,
+ /* 74 */ 0xe88ba9, 0xe88baa, 0xe88bac, 0xe88bad,
+ /* 78 */ 0xe88bae, 0xe88bb0, 0xe88bb2, 0xe88bb3,
+ /* 7c */ 0xe88bb5, 0xe88bb6, 0xe88bb8, 0x000000,
+ /* 80 */ 0xe88bba, 0xe88bbc, 0xe88bbd, 0xe88bbe,
+ /* 84 */ 0xe88bbf, 0xe88c80, 0xe88c8a, 0xe88c8b,
+ /* 88 */ 0xe88c8d, 0xe88c90, 0xe88c92, 0xe88c93,
+ /* 8c */ 0xe88c96, 0xe88c98, 0xe88c99, 0xe88c9d,
+ /* 90 */ 0xe88c9e, 0xe88c9f, 0xe88ca0, 0xe88ca1,
+ /* 94 */ 0xe88ca2, 0xe88ca3, 0xe88ca4, 0xe88ca5,
+ /* 98 */ 0xe88ca6, 0xe88ca9, 0xe88caa, 0xe88cae,
+ /* 9c */ 0xe88cb0, 0xe88cb2, 0xe88cb7, 0xe88cbb,
+ /* a0 */ 0xe88cbd, 0xe595a4, 0xe884be, 0xe796b2,
+ /* a4 */ 0xe79aae, 0xe58cb9, 0xe7979e, 0xe583bb,
+ /* a8 */ 0xe5b181, 0xe8adac, 0xe7af87, 0xe5818f,
+ /* ac */ 0xe78987, 0xe9aa97, 0xe9a398, 0xe6bc82,
+ /* b0 */ 0xe793a2, 0xe7a5a8, 0xe69287, 0xe79ea5,
+ /* b4 */ 0xe68bbc, 0xe9a291, 0xe8b4ab, 0xe59381,
+ /* b8 */ 0xe88198, 0xe4b992, 0xe59daa, 0xe88bb9,
+ /* bc */ 0xe8908d, 0xe5b9b3, 0xe587ad, 0xe793b6,
+ /* c0 */ 0xe8af84, 0xe5b18f, 0xe59da1, 0xe6b3bc,
+ /* c4 */ 0xe9a287, 0xe5a986, 0xe7a0b4, 0xe9ad84,
+ /* c8 */ 0xe8bfab, 0xe7b295, 0xe58996, 0xe68991,
+ /* cc */ 0xe993ba, 0xe4bb86, 0xe88e86, 0xe891a1,
+ /* d0 */ 0xe88fa9, 0xe892b2, 0xe59f94, 0xe69cb4,
+ /* d4 */ 0xe59c83, 0xe699ae, 0xe6b5a6, 0xe8b0b1,
+ /* d8 */ 0xe69b9d, 0xe78091, 0xe69c9f, 0xe6acba,
+ /* dc */ 0xe6a096, 0xe6889a, 0xe5a6bb, 0xe4b883,
+ /* e0 */ 0xe58784, 0xe6bc86, 0xe69f92, 0xe6b28f,
+ /* e4 */ 0xe585b6, 0xe6a38b, 0xe5a587, 0xe6ada7,
+ /* e8 */ 0xe795a6, 0xe5b48e, 0xe88490, 0xe9bd90,
+ /* ec */ 0xe69797, 0xe7a588, 0xe7a581, 0xe9aa91,
+ /* f0 */ 0xe8b5b7, 0xe5b282, 0xe4b99e, 0xe4bc81,
+ /* f4 */ 0xe590af, 0xe5a591, 0xe7a08c, 0xe599a8,
+ /* f8 */ 0xe6b094, 0xe8bf84, 0xe5bc83, 0xe6b1bd,
+ /* fc */ 0xe6b3a3, 0xe8aeab, 0xe68e90,
+
+ /*** Two byte table, leaf: c7xx - offset 0x03577 ***/
+
+ /* 40 */ 0xe88cbe, 0xe88cbf, 0xe88d81, 0xe88d82,
+ /* 44 */ 0xe88d84, 0xe88d85, 0xe88d88, 0xe88d8a,
+ /* 48 */ 0xe88d8b, 0xe88d8c, 0xe88d8d, 0xe88d8e,
+ /* 4c */ 0xe88d93, 0xe88d95, 0xe88d96, 0xe88d97,
+ /* 50 */ 0xe88d98, 0xe88d99, 0xe88d9d, 0xe88da2,
+ /* 54 */ 0xe88db0, 0xe88db1, 0xe88db2, 0xe88db3,
+ /* 58 */ 0xe88db4, 0xe88db5, 0xe88db6, 0xe88db9,
+ /* 5c */ 0xe88dba, 0xe88dbe, 0xe88dbf, 0xe88e80,
+ /* 60 */ 0xe88e81, 0xe88e82, 0xe88e83, 0xe88e84,
+ /* 64 */ 0xe88e87, 0xe88e88, 0xe88e8a, 0xe88e8b,
+ /* 68 */ 0xe88e8c, 0xe88e8d, 0xe88e8f, 0xe88e90,
+ /* 6c */ 0xe88e91, 0xe88e94, 0xe88e95, 0xe88e96,
+ /* 70 */ 0xe88e97, 0xe88e99, 0xe88e9a, 0xe88e9d,
+ /* 74 */ 0xe88e9f, 0xe88ea1, 0xe88ea2, 0xe88ea3,
+ /* 78 */ 0xe88ea4, 0xe88ea5, 0xe88ea6, 0xe88ea7,
+ /* 7c */ 0xe88eac, 0xe88ead, 0xe88eae, 0x000000,
+ /* 80 */ 0xe88eaf, 0xe88eb5, 0xe88ebb, 0xe88ebe,
+ /* 84 */ 0xe88ebf, 0xe88f82, 0xe88f83, 0xe88f84,
+ /* 88 */ 0xe88f86, 0xe88f88, 0xe88f89, 0xe88f8b,
+ /* 8c */ 0xe88f8d, 0xe88f8e, 0xe88f90, 0xe88f91,
+ /* 90 */ 0xe88f92, 0xe88f93, 0xe88f95, 0xe88f97,
+ /* 94 */ 0xe88f99, 0xe88f9a, 0xe88f9b, 0xe88f9e,
+ /* 98 */ 0xe88fa2, 0xe88fa3, 0xe88fa4, 0xe88fa6,
+ /* 9c */ 0xe88fa7, 0xe88fa8, 0xe88fab, 0xe88fac,
+ /* a0 */ 0xe88fad, 0xe681b0, 0xe6b4bd, 0xe789b5,
+ /* a4 */ 0xe689a6, 0xe9928e, 0xe99385, 0xe58d83,
+ /* a8 */ 0xe8bf81, 0xe7adbe, 0xe4bb9f, 0xe8b0a6,
+ /* ac */ 0xe4b9be, 0xe9bb94, 0xe992b1, 0xe992b3,
+ /* b0 */ 0xe5898d, 0xe6bd9c, 0xe981a3, 0xe6b585,
+ /* b4 */ 0xe8b0b4, 0xe5a091, 0xe5b58c, 0xe6aca0,
+ /* b8 */ 0xe6ad89, 0xe69eaa, 0xe5919b, 0xe88594,
+ /* bc */ 0xe7be8c, 0xe5a299, 0xe894b7, 0xe5bcba,
+ /* c0 */ 0xe68aa2, 0xe6a987, 0xe994b9, 0xe695b2,
+ /* c4 */ 0xe68284, 0xe6a1a5, 0xe79ea7, 0xe4b994,
+ /* c8 */ 0xe4bea8, 0xe5b7a7, 0xe99e98, 0xe692ac,
+ /* cc */ 0xe7bf98, 0xe5b3ad, 0xe4bf8f, 0xe7aa8d,
+ /* d0 */ 0xe58887, 0xe88c84, 0xe4b894, 0xe680af,
+ /* d4 */ 0xe7aa83, 0xe992a6, 0xe4beb5, 0xe4bab2,
+ /* d8 */ 0xe7a7a6, 0xe790b4, 0xe58ba4, 0xe88ab9,
+ /* dc */ 0xe69392, 0xe7a6bd, 0xe5af9d, 0xe6b281,
+ /* e0 */ 0xe99d92, 0xe8bdbb, 0xe6b0a2, 0xe580be,
+ /* e4 */ 0xe58dbf, 0xe6b885, 0xe6938e, 0xe699b4,
+ /* e8 */ 0xe6b0b0, 0xe68385, 0xe9a1b7, 0xe8afb7,
+ /* ec */ 0xe5ba86, 0xe790bc, 0xe7a9b7, 0xe7a78b,
+ /* f0 */ 0xe4b898, 0xe982b1, 0xe79083, 0xe6b182,
+ /* f4 */ 0xe59b9a, 0xe9858b, 0xe6b385, 0xe8b68b,
+ /* f8 */ 0xe58cba, 0xe89b86, 0xe69bb2, 0xe8baaf,
+ /* fc */ 0xe5b188, 0xe9a9b1, 0xe6b8a0,
+
+ /*** Two byte table, leaf: c8xx - offset 0x03636 ***/
+
+ /* 40 */ 0xe88fae, 0xe88faf, 0xe88fb3, 0xe88fb4,
+ /* 44 */ 0xe88fb5, 0xe88fb6, 0xe88fb7, 0xe88fba,
+ /* 48 */ 0xe88fbb, 0xe88fbc, 0xe88fbe, 0xe88fbf,
+ /* 4c */ 0xe89080, 0xe89082, 0xe89085, 0xe89087,
+ /* 50 */ 0xe89088, 0xe89089, 0xe8908a, 0xe89090,
+ /* 54 */ 0xe89092, 0xe89093, 0xe89094, 0xe89095,
+ /* 58 */ 0xe89096, 0xe89097, 0xe89099, 0xe8909a,
+ /* 5c */ 0xe8909b, 0xe8909e, 0xe8909f, 0xe890a0,
+ /* 60 */ 0xe890a1, 0xe890a2, 0xe890a3, 0xe890a9,
+ /* 64 */ 0xe890aa, 0xe890ab, 0xe890ac, 0xe890ad,
+ /* 68 */ 0xe890ae, 0xe890af, 0xe890b0, 0xe890b2,
+ /* 6c */ 0xe890b3, 0xe890b4, 0xe890b5, 0xe890b6,
+ /* 70 */ 0xe890b7, 0xe890b9, 0xe890ba, 0xe890bb,
+ /* 74 */ 0xe890be, 0xe890bf, 0xe89180, 0xe89181,
+ /* 78 */ 0xe89182, 0xe89183, 0xe89184, 0xe89185,
+ /* 7c */ 0xe89187, 0xe89188, 0xe89189, 0x000000,
+ /* 80 */ 0xe8918a, 0xe8918b, 0xe8918c, 0xe8918d,
+ /* 84 */ 0xe8918e, 0xe8918f, 0xe89190, 0xe89192,
+ /* 88 */ 0xe89193, 0xe89194, 0xe89195, 0xe89196,
+ /* 8c */ 0xe89198, 0xe8919d, 0xe8919e, 0xe8919f,
+ /* 90 */ 0xe891a0, 0xe891a2, 0xe891a4, 0xe891a5,
+ /* 94 */ 0xe891a6, 0xe891a7, 0xe891a8, 0xe891aa,
+ /* 98 */ 0xe891ae, 0xe891af, 0xe891b0, 0xe891b2,
+ /* 9c */ 0xe891b4, 0xe891b7, 0xe891b9, 0xe891bb,
+ /* a0 */ 0xe891bc, 0xe58f96, 0xe5a8b6, 0xe9be8b,
+ /* a4 */ 0xe8b6a3, 0xe58ebb, 0xe59c88, 0xe9a2a7,
+ /* a8 */ 0xe69d83, 0xe9869b, 0xe6b389, 0xe585a8,
+ /* ac */ 0xe7978a, 0xe68bb3, 0xe78aac, 0xe588b8,
+ /* b0 */ 0xe58a9d, 0xe7bcba, 0xe78294, 0xe798b8,
+ /* b4 */ 0xe58db4, 0xe9b98a, 0xe6a6b7, 0xe7a1ae,
+ /* b8 */ 0xe99b80, 0xe8a399, 0xe7bea4, 0xe784b6,
+ /* bc */ 0xe78783, 0xe58689, 0xe69f93, 0xe793a4,
+ /* c0 */ 0xe5a3a4, 0xe69498, 0xe59ab7, 0xe8aea9,
+ /* c4 */ 0xe9a5b6, 0xe689b0, 0xe7bb95, 0xe683b9,
+ /* c8 */ 0xe783ad, 0xe5a3ac, 0xe4bb81, 0xe4baba,
+ /* cc */ 0xe5bf8d, 0xe99fa7, 0xe4bbbb, 0xe8aea4,
+ /* d0 */ 0xe58883, 0xe5a68a, 0xe7baab, 0xe68994,
+ /* d4 */ 0xe4bb8d, 0xe697a5, 0xe6888e, 0xe88cb8,
+ /* d8 */ 0xe89389, 0xe88da3, 0xe89e8d, 0xe78694,
+ /* dc */ 0xe6bab6, 0xe5aeb9, 0xe7bb92, 0xe58697,
+ /* e0 */ 0xe68f89, 0xe69f94, 0xe88289, 0xe88cb9,
+ /* e4 */ 0xe8a095, 0xe58492, 0xe5adba, 0xe5a682,
+ /* e8 */ 0xe8beb1, 0xe4b9b3, 0xe6b19d, 0xe585a5,
+ /* ec */ 0xe8a4a5, 0xe8bdaf, 0xe998ae, 0xe8958a,
+ /* f0 */ 0xe7919e, 0xe99490, 0xe997b0, 0xe6b6a6,
+ /* f4 */ 0xe88ba5, 0xe5bcb1, 0xe69292, 0xe6b492,
+ /* f8 */ 0xe890a8, 0xe885ae, 0xe9b383, 0xe5a19e,
+ /* fc */ 0xe8b59b, 0xe4b889, 0xe58f81,
+
+ /*** Two byte table, leaf: c9xx - offset 0x036f5 ***/
+
+ /* 40 */ 0xe891bd, 0xe891be, 0xe891bf, 0xe89280,
+ /* 44 */ 0xe89281, 0xe89283, 0xe89284, 0xe89285,
+ /* 48 */ 0xe89286, 0xe8928a, 0xe8928d, 0xe8928f,
+ /* 4c */ 0xe89290, 0xe89291, 0xe89292, 0xe89293,
+ /* 50 */ 0xe89294, 0xe89295, 0xe89296, 0xe89298,
+ /* 54 */ 0xe8929a, 0xe8929b, 0xe8929d, 0xe8929e,
+ /* 58 */ 0xe8929f, 0xe892a0, 0xe892a2, 0xe892a3,
+ /* 5c */ 0xe892a4, 0xe892a5, 0xe892a6, 0xe892a7,
+ /* 60 */ 0xe892a8, 0xe892a9, 0xe892aa, 0xe892ab,
+ /* 64 */ 0xe892ac, 0xe892ad, 0xe892ae, 0xe892b0,
+ /* 68 */ 0xe892b1, 0xe892b3, 0xe892b5, 0xe892b6,
+ /* 6c */ 0xe892b7, 0xe892bb, 0xe892bc, 0xe892be,
+ /* 70 */ 0xe89380, 0xe89382, 0xe89383, 0xe89385,
+ /* 74 */ 0xe89386, 0xe89387, 0xe89388, 0xe8938b,
+ /* 78 */ 0xe8938c, 0xe8938e, 0xe8938f, 0xe89392,
+ /* 7c */ 0xe89394, 0xe89395, 0xe89397, 0x000000,
+ /* 80 */ 0xe89398, 0xe89399, 0xe8939a, 0xe8939b,
+ /* 84 */ 0xe8939c, 0xe8939e, 0xe893a1, 0xe893a2,
+ /* 88 */ 0xe893a4, 0xe893a7, 0xe893a8, 0xe893a9,
+ /* 8c */ 0xe893aa, 0xe893ab, 0xe893ad, 0xe893ae,
+ /* 90 */ 0xe893af, 0xe893b1, 0xe893b2, 0xe893b3,
+ /* 94 */ 0xe893b4, 0xe893b5, 0xe893b6, 0xe893b7,
+ /* 98 */ 0xe893b8, 0xe893b9, 0xe893ba, 0xe893bb,
+ /* 9c */ 0xe893bd, 0xe893be, 0xe89480, 0xe89481,
+ /* a0 */ 0xe89482, 0xe4bc9e, 0xe695a3, 0xe6a191,
+ /* a4 */ 0xe59793, 0xe4b8a7, 0xe69094, 0xe9aa9a,
+ /* a8 */ 0xe689ab, 0xe5ab82, 0xe7919f, 0xe889b2,
+ /* ac */ 0xe6b6a9, 0xe6a3ae, 0xe583a7, 0xe88e8e,
+ /* b0 */ 0xe7a082, 0xe69d80, 0xe588b9, 0xe6b299,
+ /* b4 */ 0xe7bab1, 0xe582bb, 0xe595a5, 0xe7859e,
+ /* b8 */ 0xe7ad9b, 0xe69992, 0xe78f8a, 0xe88bab,
+ /* bc */ 0xe69d89, 0xe5b1b1, 0xe588a0, 0xe785bd,
+ /* c0 */ 0xe8a1ab, 0xe997aa, 0xe99995, 0xe69385,
+ /* c4 */ 0xe8b5a1, 0xe886b3, 0xe59684, 0xe6b195,
+ /* c8 */ 0xe68987, 0xe7bcae, 0xe5a292, 0xe4bca4,
+ /* cc */ 0xe59586, 0xe8b58f, 0xe6998c, 0xe4b88a,
+ /* d0 */ 0xe5b09a, 0xe8a3b3, 0xe6a2a2, 0xe68d8e,
+ /* d4 */ 0xe7a88d, 0xe783a7, 0xe88a8d, 0xe58bba,
+ /* d8 */ 0xe99fb6, 0xe5b091, 0xe593a8, 0xe982b5,
+ /* dc */ 0xe7bb8d, 0xe5a5a2, 0xe8b58a, 0xe89b87,
+ /* e0 */ 0xe8888c, 0xe8888d, 0xe8b5a6, 0xe69184,
+ /* e4 */ 0xe5b084, 0xe68591, 0xe6b689, 0xe7a4be,
+ /* e8 */ 0xe8aebe, 0xe7a0b7, 0xe794b3, 0xe591bb,
+ /* ec */ 0xe4bcb8, 0xe8baab, 0xe6b7b1, 0xe5a8a0,
+ /* f0 */ 0xe7bb85, 0xe7a59e, 0xe6b288, 0xe5aea1,
+ /* f4 */ 0xe5a9b6, 0xe7949a, 0xe882be, 0xe6858e,
+ /* f8 */ 0xe6b897, 0xe5a3b0, 0xe7949f, 0xe794a5,
+ /* fc */ 0xe789b2, 0xe58d87, 0xe7bbb3,
+
+ /*** Two byte table, leaf: caxx - offset 0x037b4 ***/
+
+ /* 40 */ 0xe89483, 0xe89484, 0xe89485, 0xe89486,
+ /* 44 */ 0xe89487, 0xe89488, 0xe89489, 0xe8948a,
+ /* 48 */ 0xe8948b, 0xe8948d, 0xe8948e, 0xe8948f,
+ /* 4c */ 0xe89490, 0xe89492, 0xe89494, 0xe89495,
+ /* 50 */ 0xe89496, 0xe89498, 0xe89499, 0xe8949b,
+ /* 54 */ 0xe8949c, 0xe8949d, 0xe8949e, 0xe894a0,
+ /* 58 */ 0xe894a2, 0xe894a3, 0xe894a4, 0xe894a5,
+ /* 5c */ 0xe894a6, 0xe894a7, 0xe894a8, 0xe894a9,
+ /* 60 */ 0xe894aa, 0xe894ad, 0xe894ae, 0xe894af,
+ /* 64 */ 0xe894b0, 0xe894b1, 0xe894b2, 0xe894b3,
+ /* 68 */ 0xe894b4, 0xe894b5, 0xe894b6, 0xe894be,
+ /* 6c */ 0xe894bf, 0xe89580, 0xe89581, 0xe89582,
+ /* 70 */ 0xe89584, 0xe89585, 0xe89586, 0xe89587,
+ /* 74 */ 0xe8958b, 0xe8958c, 0xe8958d, 0xe8958e,
+ /* 78 */ 0xe8958f, 0xe89590, 0xe89591, 0xe89592,
+ /* 7c */ 0xe89593, 0xe89594, 0xe89595, 0x000000,
+ /* 80 */ 0xe89597, 0xe89598, 0xe8959a, 0xe8959b,
+ /* 84 */ 0xe8959c, 0xe8959d, 0xe8959f, 0xe895a0,
+ /* 88 */ 0xe895a1, 0xe895a2, 0xe895a3, 0xe895a5,
+ /* 8c */ 0xe895a6, 0xe895a7, 0xe895a9, 0xe895aa,
+ /* 90 */ 0xe895ab, 0xe895ac, 0xe895ad, 0xe895ae,
+ /* 94 */ 0xe895af, 0xe895b0, 0xe895b1, 0xe895b3,
+ /* 98 */ 0xe895b5, 0xe895b6, 0xe895b7, 0xe895b8,
+ /* 9c */ 0xe895bc, 0xe895bd, 0xe895bf, 0xe89680,
+ /* a0 */ 0xe89681, 0xe79c81, 0xe79b9b, 0xe589a9,
+ /* a4 */ 0xe8839c, 0xe59ca3, 0xe5b888, 0xe5a4b1,
+ /* a8 */ 0xe78bae, 0xe696bd, 0xe6b9bf, 0xe8af97,
+ /* ac */ 0xe5b0b8, 0xe899b1, 0xe58d81, 0xe79fb3,
+ /* b0 */ 0xe68bbe, 0xe697b6, 0xe4bb80, 0xe9a39f,
+ /* b4 */ 0xe89a80, 0xe5ae9e, 0xe8af86, 0xe58fb2,
+ /* b8 */ 0xe79fa2, 0xe4bdbf, 0xe5b18e, 0xe9a9b6,
+ /* bc */ 0xe5a78b, 0xe5bc8f, 0xe7a4ba, 0xe5a3ab,
+ /* c0 */ 0xe4b896, 0xe69fbf, 0xe4ba8b, 0xe68bad,
+ /* c4 */ 0xe8aa93, 0xe9809d, 0xe58abf, 0xe698af,
+ /* c8 */ 0xe5979c, 0xe599ac, 0xe98082, 0xe4bb95,
+ /* cc */ 0xe4be8d, 0xe9878a, 0xe9a5b0, 0xe6b08f,
+ /* d0 */ 0xe5b882, 0xe68183, 0xe5aea4, 0xe8a786,
+ /* d4 */ 0xe8af95, 0xe694b6, 0xe6898b, 0xe9a696,
+ /* d8 */ 0xe5ae88, 0xe5afbf, 0xe68e88, 0xe594ae,
+ /* dc */ 0xe58f97, 0xe798a6, 0xe585bd, 0xe894ac,
+ /* e0 */ 0xe69ea2, 0xe6a2b3, 0xe6ae8a, 0xe68a92,
+ /* e4 */ 0xe8be93, 0xe58f94, 0xe88892, 0xe6b791,
+ /* e8 */ 0xe7968f, 0xe4b9a6, 0xe8b58e, 0xe5adb0,
+ /* ec */ 0xe7869f, 0xe896af, 0xe69a91, 0xe69b99,
+ /* f0 */ 0xe7bdb2, 0xe89c80, 0xe9bb8d, 0xe9bca0,
+ /* f4 */ 0xe5b19e, 0xe69caf, 0xe8bfb0, 0xe6a091,
+ /* f8 */ 0xe69d9f, 0xe6888d, 0xe7ab96, 0xe5a285,
+ /* fc */ 0xe5bab6, 0xe695b0, 0xe6bcb1,
+
+ /*** Two byte table, leaf: cbxx - offset 0x03873 ***/
+
+ /* 40 */ 0xe89682, 0xe89683, 0xe89686, 0xe89688,
+ /* 44 */ 0xe89689, 0xe8968a, 0xe8968b, 0xe8968c,
+ /* 48 */ 0xe8968d, 0xe8968e, 0xe89690, 0xe89691,
+ /* 4c */ 0xe89692, 0xe89693, 0xe89694, 0xe89695,
+ /* 50 */ 0xe89696, 0xe89697, 0xe89698, 0xe89699,
+ /* 54 */ 0xe8969a, 0xe8969d, 0xe8969e, 0xe8969f,
+ /* 58 */ 0xe896a0, 0xe896a1, 0xe896a2, 0xe896a3,
+ /* 5c */ 0xe896a5, 0xe896a6, 0xe896a7, 0xe896a9,
+ /* 60 */ 0xe896ab, 0xe896ac, 0xe896ad, 0xe896b1,
+ /* 64 */ 0xe896b2, 0xe896b3, 0xe896b4, 0xe896b5,
+ /* 68 */ 0xe896b6, 0xe896b8, 0xe896ba, 0xe896bb,
+ /* 6c */ 0xe896bc, 0xe896bd, 0xe896be, 0xe896bf,
+ /* 70 */ 0xe89780, 0xe89782, 0xe89783, 0xe89784,
+ /* 74 */ 0xe89785, 0xe89786, 0xe89787, 0xe89788,
+ /* 78 */ 0xe8978a, 0xe8978b, 0xe8978c, 0xe8978d,
+ /* 7c */ 0xe8978e, 0xe89791, 0xe89792, 0x000000,
+ /* 80 */ 0xe89794, 0xe89796, 0xe89797, 0xe89798,
+ /* 84 */ 0xe89799, 0xe8979a, 0xe8979b, 0xe8979d,
+ /* 88 */ 0xe8979e, 0xe8979f, 0xe897a0, 0xe897a1,
+ /* 8c */ 0xe897a2, 0xe897a3, 0xe897a5, 0xe897a6,
+ /* 90 */ 0xe897a7, 0xe897a8, 0xe897aa, 0xe897ab,
+ /* 94 */ 0xe897ac, 0xe897ad, 0xe897ae, 0xe897af,
+ /* 98 */ 0xe897b0, 0xe897b1, 0xe897b2, 0xe897b3,
+ /* 9c */ 0xe897b4, 0xe897b5, 0xe897b6, 0xe897b7,
+ /* a0 */ 0xe897b8, 0xe68195, 0xe588b7, 0xe8808d,
+ /* a4 */ 0xe69194, 0xe8a1b0, 0xe794a9, 0xe5b885,
+ /* a8 */ 0xe6a093, 0xe68bb4, 0xe99c9c, 0xe58f8c,
+ /* ac */ 0xe788bd, 0xe8b081, 0xe6b0b4, 0xe79da1,
+ /* b0 */ 0xe7a88e, 0xe590ae, 0xe79eac, 0xe9a1ba,
+ /* b4 */ 0xe8889c, 0xe8afb4, 0xe7a195, 0xe69c94,
+ /* b8 */ 0xe78381, 0xe696af, 0xe69295, 0xe598b6,
+ /* bc */ 0xe6809d, 0xe7a781, 0xe58fb8, 0xe4b89d,
+ /* c0 */ 0xe6adbb, 0xe88286, 0xe5afba, 0xe597a3,
+ /* c4 */ 0xe59b9b, 0xe4bcba, 0xe4bcbc, 0xe9a5b2,
+ /* c8 */ 0xe5b7b3, 0xe69dbe, 0xe880b8, 0xe68082,
+ /* cc */ 0xe9a282, 0xe98081, 0xe5ae8b, 0xe8aebc,
+ /* d0 */ 0xe8afb5, 0xe6909c, 0xe88998, 0xe6939e,
+ /* d4 */ 0xe597bd, 0xe88b8f, 0xe985a5, 0xe4bf97,
+ /* d8 */ 0xe7b4a0, 0xe9809f, 0xe7b29f, 0xe583b3,
+ /* dc */ 0xe5a191, 0xe6baaf, 0xe5aebf, 0xe8af89,
+ /* e0 */ 0xe88283, 0xe985b8, 0xe8929c, 0xe7ae97,
+ /* e4 */ 0xe899bd, 0xe99a8b, 0xe99a8f, 0xe7bba5,
+ /* e8 */ 0xe9ab93, 0xe7a28e, 0xe5b281, 0xe7a997,
+ /* ec */ 0xe98182, 0xe99aa7, 0xe7a59f, 0xe5ad99,
+ /* f0 */ 0xe68d9f, 0xe7ac8b, 0xe89391, 0xe6a2ad,
+ /* f4 */ 0xe59486, 0xe7bca9, 0xe79090, 0xe7b4a2,
+ /* f8 */ 0xe99481, 0xe68980, 0xe5a18c, 0xe4bb96,
+ /* fc */ 0xe5ae83, 0xe5a5b9, 0xe5a194,
+
+ /*** Two byte table, leaf: ccxx - offset 0x03932 ***/
+
+ /* 40 */ 0xe897b9, 0xe897ba, 0xe897bc, 0xe897bd,
+ /* 44 */ 0xe897be, 0xe89880, 0xe89881, 0xe89882,
+ /* 48 */ 0xe89883, 0xe89884, 0xe89886, 0xe89887,
+ /* 4c */ 0xe89888, 0xe89889, 0xe8988a, 0xe8988b,
+ /* 50 */ 0xe8988c, 0xe8988d, 0xe8988e, 0xe8988f,
+ /* 54 */ 0xe89890, 0xe89892, 0xe89893, 0xe89894,
+ /* 58 */ 0xe89895, 0xe89897, 0xe89898, 0xe89899,
+ /* 5c */ 0xe8989a, 0xe8989b, 0xe8989c, 0xe8989d,
+ /* 60 */ 0xe8989e, 0xe8989f, 0xe898a0, 0xe898a1,
+ /* 64 */ 0xe898a2, 0xe898a3, 0xe898a4, 0xe898a5,
+ /* 68 */ 0xe898a6, 0xe898a8, 0xe898aa, 0xe898ab,
+ /* 6c */ 0xe898ac, 0xe898ad, 0xe898ae, 0xe898af,
+ /* 70 */ 0xe898b0, 0xe898b1, 0xe898b2, 0xe898b3,
+ /* 74 */ 0xe898b4, 0xe898b5, 0xe898b6, 0xe898b7,
+ /* 78 */ 0xe898b9, 0xe898ba, 0xe898bb, 0xe898bd,
+ /* 7c */ 0xe898be, 0xe898bf, 0xe89980, 0x000000,
+ /* 80 */ 0xe89981, 0xe89982, 0xe89983, 0xe89984,
+ /* 84 */ 0xe89985, 0xe89986, 0xe89987, 0xe89988,
+ /* 88 */ 0xe89989, 0xe8998a, 0xe8998b, 0xe8998c,
+ /* 8c */ 0xe89992, 0xe89993, 0xe89995, 0xe89996,
+ /* 90 */ 0xe89997, 0xe89998, 0xe89999, 0xe8999b,
+ /* 94 */ 0xe8999c, 0xe8999d, 0xe8999f, 0xe899a0,
+ /* 98 */ 0xe899a1, 0xe899a3, 0xe899a4, 0xe899a5,
+ /* 9c */ 0xe899a6, 0xe899a7, 0xe899a8, 0xe899a9,
+ /* a0 */ 0xe899aa, 0xe78dad, 0xe68c9e, 0xe8b98b,
+ /* a4 */ 0xe8b88f, 0xe8838e, 0xe88b94, 0xe68aac,
+ /* a8 */ 0xe58fb0, 0xe6b3b0, 0xe9859e, 0xe5a4aa,
+ /* ac */ 0xe68081, 0xe6b1b0, 0xe59d8d, 0xe6918a,
+ /* b0 */ 0xe8b4aa, 0xe798ab, 0xe6bba9, 0xe59d9b,
+ /* b4 */ 0xe6aa80, 0xe797b0, 0xe6bdad, 0xe8b0ad,
+ /* b8 */ 0xe8b088, 0xe59da6, 0xe6afaf, 0xe8a292,
+ /* bc */ 0xe7a2b3, 0xe68ea2, 0xe58fb9, 0xe782ad,
+ /* c0 */ 0xe6b1a4, 0xe5a198, 0xe690aa, 0xe5a082,
+ /* c4 */ 0xe6a3a0, 0xe8869b, 0xe59490, 0xe7b396,
+ /* c8 */ 0xe58098, 0xe8baba, 0xe6b78c, 0xe8b69f,
+ /* cc */ 0xe783ab, 0xe68e8f, 0xe6b69b, 0xe6bb94,
+ /* d0 */ 0xe7bba6, 0xe89084, 0xe6a183, 0xe98083,
+ /* d4 */ 0xe6b798, 0xe999b6, 0xe8aea8, 0xe5a597,
+ /* d8 */ 0xe789b9, 0xe897a4, 0xe885be, 0xe796bc,
+ /* dc */ 0xe8aa8a, 0xe6a2af, 0xe58994, 0xe8b8a2,
+ /* e0 */ 0xe99491, 0xe68f90, 0xe9a298, 0xe8b984,
+ /* e4 */ 0xe595bc, 0xe4bd93, 0xe69bbf, 0xe59a8f,
+ /* e8 */ 0xe68395, 0xe6b695, 0xe58983, 0xe5b189,
+ /* ec */ 0xe5a4a9, 0xe6b7bb, 0xe5a1ab, 0xe794b0,
+ /* f0 */ 0xe7949c, 0xe681ac, 0xe88894, 0xe88586,
+ /* f4 */ 0xe68c91, 0xe69da1, 0xe8bfa2, 0xe79cba,
+ /* f8 */ 0xe8b7b3, 0xe8b4b4, 0xe99381, 0xe5b896,
+ /* fc */ 0xe58e85, 0xe590ac, 0xe78383,
+
+ /*** Two byte table, leaf: cdxx - offset 0x039f1 ***/
+
+ /* 40 */ 0xe899ad, 0xe899af, 0xe899b0, 0xe899b2,
+ /* 44 */ 0xe899b3, 0xe899b4, 0xe899b5, 0xe899b6,
+ /* 48 */ 0xe899b7, 0xe899b8, 0xe89a83, 0xe89a84,
+ /* 4c */ 0xe89a85, 0xe89a86, 0xe89a87, 0xe89a88,
+ /* 50 */ 0xe89a89, 0xe89a8e, 0xe89a8f, 0xe89a90,
+ /* 54 */ 0xe89a91, 0xe89a92, 0xe89a94, 0xe89a96,
+ /* 58 */ 0xe89a97, 0xe89a98, 0xe89a99, 0xe89a9a,
+ /* 5c */ 0xe89a9b, 0xe89a9e, 0xe89a9f, 0xe89aa0,
+ /* 60 */ 0xe89aa1, 0xe89aa2, 0xe89aa5, 0xe89aa6,
+ /* 64 */ 0xe89aab, 0xe89aad, 0xe89aae, 0xe89ab2,
+ /* 68 */ 0xe89ab3, 0xe89ab7, 0xe89ab8, 0xe89ab9,
+ /* 6c */ 0xe89abb, 0xe89abc, 0xe89abd, 0xe89abe,
+ /* 70 */ 0xe89abf, 0xe89b81, 0xe89b82, 0xe89b83,
+ /* 74 */ 0xe89b85, 0xe89b88, 0xe89b8c, 0xe89b8d,
+ /* 78 */ 0xe89b92, 0xe89b93, 0xe89b95, 0xe89b96,
+ /* 7c */ 0xe89b97, 0xe89b9a, 0xe89b9c, 0x000000,
+ /* 80 */ 0xe89b9d, 0xe89ba0, 0xe89ba1, 0xe89ba2,
+ /* 84 */ 0xe89ba3, 0xe89ba5, 0xe89ba6, 0xe89ba7,
+ /* 88 */ 0xe89ba8, 0xe89baa, 0xe89bab, 0xe89bac,
+ /* 8c */ 0xe89baf, 0xe89bb5, 0xe89bb6, 0xe89bb7,
+ /* 90 */ 0xe89bba, 0xe89bbb, 0xe89bbc, 0xe89bbd,
+ /* 94 */ 0xe89bbf, 0xe89c81, 0xe89c84, 0xe89c85,
+ /* 98 */ 0xe89c86, 0xe89c8b, 0xe89c8c, 0xe89c8e,
+ /* 9c */ 0xe89c8f, 0xe89c90, 0xe89c91, 0xe89c94,
+ /* a0 */ 0xe89c96, 0xe6b180, 0xe5bbb7, 0xe5819c,
+ /* a4 */ 0xe4baad, 0xe5baad, 0xe68cba, 0xe88987,
+ /* a8 */ 0xe9809a, 0xe6a190, 0xe985ae, 0xe79eb3,
+ /* ac */ 0xe5908c, 0xe9939c, 0xe5bda4, 0xe7aba5,
+ /* b0 */ 0xe6a1b6, 0xe68d85, 0xe7ad92, 0xe7bb9f,
+ /* b4 */ 0xe7979b, 0xe581b7, 0xe68a95, 0xe5a4b4,
+ /* b8 */ 0xe9808f, 0xe587b8, 0xe7a783, 0xe7aa81,
+ /* bc */ 0xe59bbe, 0xe5be92, 0xe98094, 0xe6b682,
+ /* c0 */ 0xe5b1a0, 0xe59c9f, 0xe59090, 0xe58594,
+ /* c4 */ 0xe6b98d, 0xe59ba2, 0xe68ea8, 0xe9a293,
+ /* c8 */ 0xe885bf, 0xe89c95, 0xe8a4aa, 0xe98080,
+ /* cc */ 0xe5909e, 0xe5b1af, 0xe88780, 0xe68b96,
+ /* d0 */ 0xe68998, 0xe884b1, 0xe9b8b5, 0xe99980,
+ /* d4 */ 0xe9a9ae, 0xe9a9bc, 0xe6a4ad, 0xe5a6a5,
+ /* d8 */ 0xe68b93, 0xe594be, 0xe68c96, 0xe59387,
+ /* dc */ 0xe89b99, 0xe6b4bc, 0xe5a883, 0xe793a6,
+ /* e0 */ 0xe8a29c, 0xe6adaa, 0xe5a496, 0xe8b18c,
+ /* e4 */ 0xe5bcaf, 0xe6b9be, 0xe78ea9, 0xe9a1bd,
+ /* e8 */ 0xe4b8b8, 0xe783b7, 0xe5ae8c, 0xe7a297,
+ /* ec */ 0xe68cbd, 0xe6999a, 0xe79a96, 0xe6838b,
+ /* f0 */ 0xe5ae9b, 0xe5a989, 0xe4b887, 0xe88595,
+ /* f4 */ 0xe6b1aa, 0xe78e8b, 0xe4baa1, 0xe69e89,
+ /* f8 */ 0xe7bd91, 0xe5be80, 0xe697ba, 0xe69c9b,
+ /* fc */ 0xe5bf98, 0xe5a684, 0xe5a881,
+
+ /*** Two byte table, leaf: cexx - offset 0x03ab0 ***/
+
+ /* 40 */ 0xe89c99, 0xe89c9b, 0xe89c9d, 0xe89c9f,
+ /* 44 */ 0xe89ca0, 0xe89ca4, 0xe89ca6, 0xe89ca7,
+ /* 48 */ 0xe89ca8, 0xe89caa, 0xe89cab, 0xe89cac,
+ /* 4c */ 0xe89cad, 0xe89caf, 0xe89cb0, 0xe89cb2,
+ /* 50 */ 0xe89cb3, 0xe89cb5, 0xe89cb6, 0xe89cb8,
+ /* 54 */ 0xe89cb9, 0xe89cba, 0xe89cbc, 0xe89cbd,
+ /* 58 */ 0xe89d80, 0xe89d81, 0xe89d82, 0xe89d83,
+ /* 5c */ 0xe89d84, 0xe89d85, 0xe89d86, 0xe89d8a,
+ /* 60 */ 0xe89d8b, 0xe89d8d, 0xe89d8f, 0xe89d90,
+ /* 64 */ 0xe89d91, 0xe89d92, 0xe89d94, 0xe89d95,
+ /* 68 */ 0xe89d96, 0xe89d98, 0xe89d9a, 0xe89d9b,
+ /* 6c */ 0xe89d9c, 0xe89d9d, 0xe89d9e, 0xe89d9f,
+ /* 70 */ 0xe89da1, 0xe89da2, 0xe89da6, 0xe89da7,
+ /* 74 */ 0xe89da8, 0xe89da9, 0xe89daa, 0xe89dab,
+ /* 78 */ 0xe89dac, 0xe89dad, 0xe89daf, 0xe89db1,
+ /* 7c */ 0xe89db2, 0xe89db3, 0xe89db5, 0x000000,
+ /* 80 */ 0xe89db7, 0xe89db8, 0xe89db9, 0xe89dba,
+ /* 84 */ 0xe89dbf, 0xe89e80, 0xe89e81, 0xe89e84,
+ /* 88 */ 0xe89e86, 0xe89e87, 0xe89e89, 0xe89e8a,
+ /* 8c */ 0xe89e8c, 0xe89e8e, 0xe89e8f, 0xe89e90,
+ /* 90 */ 0xe89e91, 0xe89e92, 0xe89e94, 0xe89e95,
+ /* 94 */ 0xe89e96, 0xe89e98, 0xe89e99, 0xe89e9a,
+ /* 98 */ 0xe89e9b, 0xe89e9c, 0xe89e9d, 0xe89e9e,
+ /* 9c */ 0xe89ea0, 0xe89ea1, 0xe89ea2, 0xe89ea3,
+ /* a0 */ 0xe89ea4, 0xe5b78d, 0xe5beae, 0xe58db1,
+ /* a4 */ 0xe99fa6, 0xe8bf9d, 0xe6a185, 0xe59bb4,
+ /* a8 */ 0xe594af, 0xe6839f, 0xe4b8ba, 0xe6bd8d,
+ /* ac */ 0xe7bbb4, 0xe88b87, 0xe8908e, 0xe5a794,
+ /* b0 */ 0xe4bc9f, 0xe4bcaa, 0xe5b0be, 0xe7baac,
+ /* b4 */ 0xe69caa, 0xe8949a, 0xe591b3, 0xe7958f,
+ /* b8 */ 0xe88383, 0xe59682, 0xe9ad8f, 0xe4bd8d,
+ /* bc */ 0xe6b8ad, 0xe8b093, 0xe5b089, 0xe685b0,
+ /* c0 */ 0xe58dab, 0xe7989f, 0xe6b8a9, 0xe89a8a,
+ /* c4 */ 0xe69687, 0xe997bb, 0xe7bab9, 0xe590bb,
+ /* c8 */ 0xe7a8b3, 0xe7b48a, 0xe997ae, 0xe597a1,
+ /* cc */ 0xe7bf81, 0xe793ae, 0xe68c9d, 0xe89c97,
+ /* d0 */ 0xe6b6a1, 0xe7aa9d, 0xe68891, 0xe696a1,
+ /* d4 */ 0xe58da7, 0xe68fa1, 0xe6b283, 0xe5b7ab,
+ /* d8 */ 0xe5919c, 0xe992a8, 0xe4b98c, 0xe6b1a1,
+ /* dc */ 0xe8afac, 0xe5b18b, 0xe697a0, 0xe88a9c,
+ /* e0 */ 0xe6a2a7, 0xe590be, 0xe590b4, 0xe6af8b,
+ /* e4 */ 0xe6ada6, 0xe4ba94, 0xe68d82, 0xe58d88,
+ /* e8 */ 0xe8889e, 0xe4bc8d, 0xe4beae, 0xe59d9e,
+ /* ec */ 0xe6888a, 0xe99bbe, 0xe699a4, 0xe789a9,
+ /* f0 */ 0xe58bbf, 0xe58aa1, 0xe6829f, 0xe8afaf,
+ /* f4 */ 0xe69894, 0xe78699, 0xe69e90, 0xe8a5bf,
+ /* f8 */ 0xe7a192, 0xe79fbd, 0xe699b0, 0xe598bb,
+ /* fc */ 0xe590b8, 0xe994a1, 0xe789ba,
+
+ /*** Two byte table, leaf: cfxx - offset 0x03b6f ***/
+
+ /* 40 */ 0xe89ea5, 0xe89ea6, 0xe89ea7, 0xe89ea9,
+ /* 44 */ 0xe89eaa, 0xe89eae, 0xe89eb0, 0xe89eb1,
+ /* 48 */ 0xe89eb2, 0xe89eb4, 0xe89eb6, 0xe89eb7,
+ /* 4c */ 0xe89eb8, 0xe89eb9, 0xe89ebb, 0xe89ebc,
+ /* 50 */ 0xe89ebe, 0xe89ebf, 0xe89f81, 0xe89f82,
+ /* 54 */ 0xe89f83, 0xe89f84, 0xe89f85, 0xe89f87,
+ /* 58 */ 0xe89f88, 0xe89f89, 0xe89f8c, 0xe89f8d,
+ /* 5c */ 0xe89f8e, 0xe89f8f, 0xe89f90, 0xe89f94,
+ /* 60 */ 0xe89f95, 0xe89f96, 0xe89f97, 0xe89f98,
+ /* 64 */ 0xe89f99, 0xe89f9a, 0xe89f9c, 0xe89f9d,
+ /* 68 */ 0xe89f9e, 0xe89f9f, 0xe89fa1, 0xe89fa2,
+ /* 6c */ 0xe89fa3, 0xe89fa4, 0xe89fa6, 0xe89fa7,
+ /* 70 */ 0xe89fa8, 0xe89fa9, 0xe89fab, 0xe89fac,
+ /* 74 */ 0xe89fad, 0xe89faf, 0xe89fb0, 0xe89fb1,
+ /* 78 */ 0xe89fb2, 0xe89fb3, 0xe89fb4, 0xe89fb5,
+ /* 7c */ 0xe89fb6, 0xe89fb7, 0xe89fb8, 0x000000,
+ /* 80 */ 0xe89fba, 0xe89fbb, 0xe89fbc, 0xe89fbd,
+ /* 84 */ 0xe89fbf, 0xe8a080, 0xe8a081, 0xe8a082,
+ /* 88 */ 0xe8a084, 0xe8a085, 0xe8a086, 0xe8a087,
+ /* 8c */ 0xe8a088, 0xe8a089, 0xe8a08b, 0xe8a08c,
+ /* 90 */ 0xe8a08d, 0xe8a08e, 0xe8a08f, 0xe8a090,
+ /* 94 */ 0xe8a091, 0xe8a092, 0xe8a094, 0xe8a097,
+ /* 98 */ 0xe8a098, 0xe8a099, 0xe8a09a, 0xe8a09c,
+ /* 9c */ 0xe8a09d, 0xe8a09e, 0xe8a09f, 0xe8a0a0,
+ /* a0 */ 0xe8a0a3, 0xe7a880, 0xe681af, 0xe5b88c,
+ /* a4 */ 0xe68289, 0xe8869d, 0xe5a495, 0xe6839c,
+ /* a8 */ 0xe78684, 0xe783af, 0xe6baaa, 0xe6b190,
+ /* ac */ 0xe78a80, 0xe6aa84, 0xe8a2ad, 0xe5b8ad,
+ /* b0 */ 0xe4b9a0, 0xe5aab3, 0xe5969c, 0xe993a3,
+ /* b4 */ 0xe6b497, 0xe7b3bb, 0xe99a99, 0xe6888f,
+ /* b8 */ 0xe7bb86, 0xe79e8e, 0xe899be, 0xe58ca3,
+ /* bc */ 0xe99c9e, 0xe8be96, 0xe69a87, 0xe5b3a1,
+ /* c0 */ 0xe4bea0, 0xe78bad, 0xe4b88b, 0xe58ea6,
+ /* c4 */ 0xe5a48f, 0xe59093, 0xe68e80, 0xe994a8,
+ /* c8 */ 0xe58588, 0xe4bb99, 0xe9b29c, 0xe7baa4,
+ /* cc */ 0xe592b8, 0xe8b4a4, 0xe8a194, 0xe888b7,
+ /* d0 */ 0xe997b2, 0xe6b68e, 0xe5bca6, 0xe5ab8c,
+ /* d4 */ 0xe698be, 0xe999a9, 0xe78eb0, 0xe78cae,
+ /* d8 */ 0xe58ebf, 0xe885ba, 0xe9a685, 0xe7bea1,
+ /* dc */ 0xe5aeaa, 0xe999b7, 0xe99990, 0xe7babf,
+ /* e0 */ 0xe79bb8, 0xe58ea2, 0xe995b6, 0xe9a699,
+ /* e4 */ 0xe7aeb1, 0xe8a584, 0xe6b998, 0xe4b9a1,
+ /* e8 */ 0xe7bf94, 0xe7a5a5, 0xe8afa6, 0xe683b3,
+ /* ec */ 0xe5938d, 0xe4baab, 0xe9a1b9, 0xe5b7b7,
+ /* f0 */ 0xe6a9a1, 0xe5838f, 0xe59091, 0xe8b1a1,
+ /* f4 */ 0xe890a7, 0xe7a19d, 0xe99c84, 0xe5898a,
+ /* f8 */ 0xe593ae, 0xe59aa3, 0xe99480, 0xe6b688,
+ /* fc */ 0xe5aeb5, 0xe6b786, 0xe69993,
+
+ /*** Two byte table, leaf: d0xx - offset 0x03c2e ***/
+
+ /* 40 */ 0xe8a0a4, 0xe8a0a5, 0xe8a0a6, 0xe8a0a7,
+ /* 44 */ 0xe8a0a8, 0xe8a0a9, 0xe8a0aa, 0xe8a0ab,
+ /* 48 */ 0xe8a0ac, 0xe8a0ad, 0xe8a0ae, 0xe8a0af,
+ /* 4c */ 0xe8a0b0, 0xe8a0b1, 0xe8a0b3, 0xe8a0b4,
+ /* 50 */ 0xe8a0b5, 0xe8a0b6, 0xe8a0b7, 0xe8a0b8,
+ /* 54 */ 0xe8a0ba, 0xe8a0bb, 0xe8a0bd, 0xe8a0be,
+ /* 58 */ 0xe8a0bf, 0xe8a181, 0xe8a182, 0xe8a183,
+ /* 5c */ 0xe8a186, 0xe8a187, 0xe8a188, 0xe8a189,
+ /* 60 */ 0xe8a18a, 0xe8a18b, 0xe8a18e, 0xe8a18f,
+ /* 64 */ 0xe8a190, 0xe8a191, 0xe8a192, 0xe8a193,
+ /* 68 */ 0xe8a195, 0xe8a196, 0xe8a198, 0xe8a19a,
+ /* 6c */ 0xe8a19b, 0xe8a19c, 0xe8a19d, 0xe8a19e,
+ /* 70 */ 0xe8a19f, 0xe8a1a0, 0xe8a1a6, 0xe8a1a7,
+ /* 74 */ 0xe8a1aa, 0xe8a1ad, 0xe8a1af, 0xe8a1b1,
+ /* 78 */ 0xe8a1b3, 0xe8a1b4, 0xe8a1b5, 0xe8a1b6,
+ /* 7c */ 0xe8a1b8, 0xe8a1b9, 0xe8a1ba, 0x000000,
+ /* 80 */ 0xe8a1bb, 0xe8a1bc, 0xe8a280, 0xe8a283,
+ /* 84 */ 0xe8a286, 0xe8a287, 0xe8a289, 0xe8a28a,
+ /* 88 */ 0xe8a28c, 0xe8a28e, 0xe8a28f, 0xe8a290,
+ /* 8c */ 0xe8a291, 0xe8a293, 0xe8a294, 0xe8a295,
+ /* 90 */ 0xe8a297, 0xe8a298, 0xe8a299, 0xe8a29a,
+ /* 94 */ 0xe8a29b, 0xe8a29d, 0xe8a29e, 0xe8a29f,
+ /* 98 */ 0xe8a2a0, 0xe8a2a1, 0xe8a2a3, 0xe8a2a5,
+ /* 9c */ 0xe8a2a6, 0xe8a2a7, 0xe8a2a8, 0xe8a2a9,
+ /* a0 */ 0xe8a2aa, 0xe5b08f, 0xe5ad9d, 0xe6a0a1,
+ /* a4 */ 0xe88296, 0xe595b8, 0xe7ac91, 0xe69588,
+ /* a8 */ 0xe6a594, 0xe4ba9b, 0xe6ad87, 0xe89d8e,
+ /* ac */ 0xe99e8b, 0xe58d8f, 0xe68c9f, 0xe690ba,
+ /* b0 */ 0xe982aa, 0xe6969c, 0xe88381, 0xe8b090,
+ /* b4 */ 0xe58699, 0xe6a2b0, 0xe58db8, 0xe89fb9,
+ /* b8 */ 0xe68788, 0xe6b384, 0xe6b3bb, 0xe8b0a2,
+ /* bc */ 0xe5b191, 0xe896aa, 0xe88aaf, 0xe9948c,
+ /* c0 */ 0xe6aca3, 0xe8be9b, 0xe696b0, 0xe5bfbb,
+ /* c4 */ 0xe5bf83, 0xe4bfa1, 0xe8a185, 0xe6989f,
+ /* c8 */ 0xe885a5, 0xe78ca9, 0xe683ba, 0xe585b4,
+ /* cc */ 0xe58891, 0xe59e8b, 0xe5bda2, 0xe982a2,
+ /* d0 */ 0xe8a18c, 0xe98692, 0xe5b9b8, 0xe69d8f,
+ /* d4 */ 0xe680a7, 0xe5a793, 0xe58584, 0xe587b6,
+ /* d8 */ 0xe883b8, 0xe58c88, 0xe6b1b9, 0xe99b84,
+ /* dc */ 0xe7868a, 0xe4bc91, 0xe4bfae, 0xe7be9e,
+ /* e0 */ 0xe69cbd, 0xe59785, 0xe99488, 0xe7a780,
+ /* e4 */ 0xe8a296, 0xe7bba3, 0xe5a29f, 0xe6888c,
+ /* e8 */ 0xe99c80, 0xe8999a, 0xe59898, 0xe9a1bb,
+ /* ec */ 0xe5be90, 0xe8aeb8, 0xe89384, 0xe98597,
+ /* f0 */ 0xe58f99, 0xe697ad, 0xe5ba8f, 0xe7959c,
+ /* f4 */ 0xe681a4, 0xe7b5ae, 0xe5a9bf, 0xe7bbaa,
+ /* f8 */ 0xe7bbad, 0xe8bda9, 0xe596a7, 0xe5aea3,
+ /* fc */ 0xe682ac, 0xe6978b, 0xe78e84,
+
+ /*** Two byte table, leaf: d1xx - offset 0x03ced ***/
+
+ /* 40 */ 0xe8a2ac, 0xe8a2ae, 0xe8a2af, 0xe8a2b0,
+ /* 44 */ 0xe8a2b2, 0xe8a2b3, 0xe8a2b4, 0xe8a2b5,
+ /* 48 */ 0xe8a2b6, 0xe8a2b8, 0xe8a2b9, 0xe8a2ba,
+ /* 4c */ 0xe8a2bb, 0xe8a2bd, 0xe8a2be, 0xe8a2bf,
+ /* 50 */ 0xe8a380, 0xe8a383, 0xe8a384, 0xe8a387,
+ /* 54 */ 0xe8a388, 0xe8a38a, 0xe8a38b, 0xe8a38c,
+ /* 58 */ 0xe8a38d, 0xe8a38f, 0xe8a390, 0xe8a391,
+ /* 5c */ 0xe8a393, 0xe8a396, 0xe8a397, 0xe8a39a,
+ /* 60 */ 0xe8a39b, 0xe8a39c, 0xe8a39d, 0xe8a39e,
+ /* 64 */ 0xe8a3a0, 0xe8a3a1, 0xe8a3a6, 0xe8a3a7,
+ /* 68 */ 0xe8a3a9, 0xe8a3aa, 0xe8a3ab, 0xe8a3ac,
+ /* 6c */ 0xe8a3ad, 0xe8a3ae, 0xe8a3af, 0xe8a3b2,
+ /* 70 */ 0xe8a3b5, 0xe8a3b6, 0xe8a3b7, 0xe8a3ba,
+ /* 74 */ 0xe8a3bb, 0xe8a3bd, 0xe8a3bf, 0xe8a480,
+ /* 78 */ 0xe8a481, 0xe8a483, 0xe8a484, 0xe8a485,
+ /* 7c */ 0xe8a486, 0xe8a487, 0xe8a488, 0x000000,
+ /* 80 */ 0xe8a489, 0xe8a48b, 0xe8a48c, 0xe8a48d,
+ /* 84 */ 0xe8a48e, 0xe8a48f, 0xe8a491, 0xe8a494,
+ /* 88 */ 0xe8a495, 0xe8a496, 0xe8a497, 0xe8a498,
+ /* 8c */ 0xe8a49c, 0xe8a49d, 0xe8a49e, 0xe8a49f,
+ /* 90 */ 0xe8a4a0, 0xe8a4a2, 0xe8a4a3, 0xe8a4a4,
+ /* 94 */ 0xe8a4a6, 0xe8a4a7, 0xe8a4a8, 0xe8a4a9,
+ /* 98 */ 0xe8a4ac, 0xe8a4ad, 0xe8a4ae, 0xe8a4af,
+ /* 9c */ 0xe8a4b1, 0xe8a4b2, 0xe8a4b3, 0xe8a4b5,
+ /* a0 */ 0xe8a4b7, 0xe98089, 0xe799a3, 0xe79ca9,
+ /* a4 */ 0xe7bb9a, 0xe99db4, 0xe8969b, 0xe5ada6,
+ /* a8 */ 0xe7a9b4, 0xe99baa, 0xe8a180, 0xe58b8b,
+ /* ac */ 0xe7868f, 0xe5beaa, 0xe697ac, 0xe8afa2,
+ /* b0 */ 0xe5afbb, 0xe9a9af, 0xe5b7a1, 0xe6ae89,
+ /* b4 */ 0xe6b19b, 0xe8aead, 0xe8aeaf, 0xe9808a,
+ /* b8 */ 0xe8bf85, 0xe58e8b, 0xe68abc, 0xe9b8a6,
+ /* bc */ 0xe9b8ad, 0xe59180, 0xe4b8ab, 0xe88abd,
+ /* c0 */ 0xe78999, 0xe89a9c, 0xe5b496, 0xe8a199,
+ /* c4 */ 0xe6b6af, 0xe99b85, 0xe59391, 0xe4ba9a,
+ /* c8 */ 0xe8aeb6, 0xe78489, 0xe592bd, 0xe99889,
+ /* cc */ 0xe7839f, 0xe6b7b9, 0xe79b90, 0xe4b8a5,
+ /* d0 */ 0xe7a094, 0xe89c92, 0xe5b2a9, 0xe5bbb6,
+ /* d4 */ 0xe8a880, 0xe9a29c, 0xe9988e, 0xe7828e,
+ /* d8 */ 0xe6b2bf, 0xe5a584, 0xe68ea9, 0xe79cbc,
+ /* dc */ 0xe8a18d, 0xe6bc94, 0xe889b3, 0xe5a0b0,
+ /* e0 */ 0xe78795, 0xe58e8c, 0xe7a09a, 0xe99b81,
+ /* e4 */ 0xe59481, 0xe5bda6, 0xe784b0, 0xe5aeb4,
+ /* e8 */ 0xe8b09a, 0xe9aa8c, 0xe6ae83, 0xe5a4ae,
+ /* ec */ 0xe9b8af, 0xe7a7a7, 0xe69da8, 0xe689ac,
+ /* f0 */ 0xe4bdaf, 0xe796a1, 0xe7be8a, 0xe6b48b,
+ /* f4 */ 0xe998b3, 0xe6b0a7, 0xe4bbb0, 0xe79792,
+ /* f8 */ 0xe585bb, 0xe6a0b7, 0xe6bcbe, 0xe98280,
+ /* fc */ 0xe885b0, 0xe5a696, 0xe791b6,
+
+ /*** Two byte table, leaf: d2xx - offset 0x03dac ***/
+
+ /* 40 */ 0xe8a4b8, 0xe8a4b9, 0xe8a4ba, 0xe8a4bb,
+ /* 44 */ 0xe8a4bc, 0xe8a4bd, 0xe8a4be, 0xe8a4bf,
+ /* 48 */ 0xe8a580, 0xe8a582, 0xe8a583, 0xe8a585,
+ /* 4c */ 0xe8a586, 0xe8a587, 0xe8a588, 0xe8a589,
+ /* 50 */ 0xe8a58a, 0xe8a58b, 0xe8a58c, 0xe8a58d,
+ /* 54 */ 0xe8a58e, 0xe8a58f, 0xe8a590, 0xe8a591,
+ /* 58 */ 0xe8a592, 0xe8a593, 0xe8a594, 0xe8a595,
+ /* 5c */ 0xe8a596, 0xe8a597, 0xe8a598, 0xe8a599,
+ /* 60 */ 0xe8a59a, 0xe8a59b, 0xe8a59c, 0xe8a59d,
+ /* 64 */ 0xe8a5a0, 0xe8a5a1, 0xe8a5a2, 0xe8a5a3,
+ /* 68 */ 0xe8a5a4, 0xe8a5a5, 0xe8a5a7, 0xe8a5a8,
+ /* 6c */ 0xe8a5a9, 0xe8a5aa, 0xe8a5ab, 0xe8a5ac,
+ /* 70 */ 0xe8a5ad, 0xe8a5ae, 0xe8a5af, 0xe8a5b0,
+ /* 74 */ 0xe8a5b1, 0xe8a5b2, 0xe8a5b3, 0xe8a5b4,
+ /* 78 */ 0xe8a5b5, 0xe8a5b6, 0xe8a5b7, 0xe8a5b8,
+ /* 7c */ 0xe8a5b9, 0xe8a5ba, 0xe8a5bc, 0x000000,
+ /* 80 */ 0xe8a5bd, 0xe8a5be, 0xe8a680, 0xe8a682,
+ /* 84 */ 0xe8a684, 0xe8a685, 0xe8a687, 0xe8a688,
+ /* 88 */ 0xe8a689, 0xe8a68a, 0xe8a68b, 0xe8a68c,
+ /* 8c */ 0xe8a68d, 0xe8a68e, 0xe8a68f, 0xe8a690,
+ /* 90 */ 0xe8a691, 0xe8a692, 0xe8a693, 0xe8a694,
+ /* 94 */ 0xe8a695, 0xe8a696, 0xe8a697, 0xe8a698,
+ /* 98 */ 0xe8a699, 0xe8a69a, 0xe8a69b, 0xe8a69c,
+ /* 9c */ 0xe8a69d, 0xe8a69e, 0xe8a69f, 0xe8a6a0,
+ /* a0 */ 0xe8a6a1, 0xe69187, 0xe5b0a7, 0xe981a5,
+ /* a4 */ 0xe7aa91, 0xe8b0a3, 0xe5a79a, 0xe592ac,
+ /* a8 */ 0xe88880, 0xe88daf, 0xe8a681, 0xe88080,
+ /* ac */ 0xe6a4b0, 0xe5998e, 0xe880b6, 0xe788b7,
+ /* b0 */ 0xe9878e, 0xe586b6, 0xe4b99f, 0xe9a1b5,
+ /* b4 */ 0xe68e96, 0xe4b89a, 0xe58fb6, 0xe69bb3,
+ /* b8 */ 0xe8858b, 0xe5a49c, 0xe6b6b2, 0xe4b880,
+ /* bc */ 0xe5a3b9, 0xe58cbb, 0xe68f96, 0xe993b1,
+ /* c0 */ 0xe4be9d, 0xe4bc8a, 0xe8a1a3, 0xe9a290,
+ /* c4 */ 0xe5a4b7, 0xe98197, 0xe7a7bb, 0xe4bbaa,
+ /* c8 */ 0xe883b0, 0xe79691, 0xe6b282, 0xe5ae9c,
+ /* cc */ 0xe5a7a8, 0xe5bd9d, 0xe6a485, 0xe89a81,
+ /* d0 */ 0xe5809a, 0xe5b7b2, 0xe4b999, 0xe79fa3,
+ /* d4 */ 0xe4bba5, 0xe889ba, 0xe68a91, 0xe69893,
+ /* d8 */ 0xe98291, 0xe5b1b9, 0xe4babf, 0xe5bdb9,
+ /* dc */ 0xe88786, 0xe980b8, 0xe88284, 0xe796ab,
+ /* e0 */ 0xe4baa6, 0xe8a394, 0xe6848f, 0xe6af85,
+ /* e4 */ 0xe5bf86, 0xe4b989, 0xe79b8a, 0xe6baa2,
+ /* e8 */ 0xe8afa3, 0xe8aeae, 0xe8b08a, 0xe8af91,
+ /* ec */ 0xe5bc82, 0xe7bfbc, 0xe7bf8c, 0xe7bb8e,
+ /* f0 */ 0xe88cb5, 0xe88dab, 0xe59ba0, 0xe6aeb7,
+ /* f4 */ 0xe99fb3, 0xe998b4, 0xe5a7bb, 0xe5909f,
+ /* f8 */ 0xe993b6, 0xe6b7ab, 0xe5af85, 0xe9a5ae,
+ /* fc */ 0xe5b0b9, 0xe5bc95, 0xe99a90,
+
+ /*** Two byte table, leaf: d3xx - offset 0x03e6b ***/
+
+ /* 40 */ 0xe8a6a2, 0xe8a6a3, 0xe8a6a4, 0xe8a6a5,
+ /* 44 */ 0xe8a6a6, 0xe8a6a7, 0xe8a6a8, 0xe8a6a9,
+ /* 48 */ 0xe8a6aa, 0xe8a6ab, 0xe8a6ac, 0xe8a6ad,
+ /* 4c */ 0xe8a6ae, 0xe8a6af, 0xe8a6b0, 0xe8a6b1,
+ /* 50 */ 0xe8a6b2, 0xe8a6b3, 0xe8a6b4, 0xe8a6b5,
+ /* 54 */ 0xe8a6b6, 0xe8a6b7, 0xe8a6b8, 0xe8a6b9,
+ /* 58 */ 0xe8a6ba, 0xe8a6bb, 0xe8a6bc, 0xe8a6bd,
+ /* 5c */ 0xe8a6be, 0xe8a6bf, 0xe8a780, 0xe8a783,
+ /* 60 */ 0xe8a78d, 0xe8a793, 0xe8a794, 0xe8a795,
+ /* 64 */ 0xe8a797, 0xe8a798, 0xe8a799, 0xe8a79b,
+ /* 68 */ 0xe8a79d, 0xe8a79f, 0xe8a7a0, 0xe8a7a1,
+ /* 6c */ 0xe8a7a2, 0xe8a7a4, 0xe8a7a7, 0xe8a7a8,
+ /* 70 */ 0xe8a7a9, 0xe8a7aa, 0xe8a7ac, 0xe8a7ad,
+ /* 74 */ 0xe8a7ae, 0xe8a7b0, 0xe8a7b1, 0xe8a7b2,
+ /* 78 */ 0xe8a7b4, 0xe8a7b5, 0xe8a7b6, 0xe8a7b7,
+ /* 7c */ 0xe8a7b8, 0xe8a7b9, 0xe8a7ba, 0x000000,
+ /* 80 */ 0xe8a7bb, 0xe8a7bc, 0xe8a7bd, 0xe8a7be,
+ /* 84 */ 0xe8a7bf, 0xe8a881, 0xe8a882, 0xe8a883,
+ /* 88 */ 0xe8a884, 0xe8a885, 0xe8a886, 0xe8a888,
+ /* 8c */ 0xe8a889, 0xe8a88a, 0xe8a88b, 0xe8a88c,
+ /* 90 */ 0xe8a88d, 0xe8a88e, 0xe8a88f, 0xe8a890,
+ /* 94 */ 0xe8a891, 0xe8a892, 0xe8a893, 0xe8a894,
+ /* 98 */ 0xe8a895, 0xe8a896, 0xe8a897, 0xe8a898,
+ /* 9c */ 0xe8a899, 0xe8a89a, 0xe8a89b, 0xe8a89c,
+ /* a0 */ 0xe8a89d, 0xe58db0, 0xe88bb1, 0xe6a8b1,
+ /* a4 */ 0xe5a9b4, 0xe9b9b0, 0xe5ba94, 0xe7bca8,
+ /* a8 */ 0xe88eb9, 0xe890a4, 0xe890a5, 0xe88da7,
+ /* ac */ 0xe89d87, 0xe8bf8e, 0xe8b5a2, 0xe79b88,
+ /* b0 */ 0xe5bdb1, 0xe9a296, 0xe7a1ac, 0xe698a0,
+ /* b4 */ 0xe5939f, 0xe68ba5, 0xe4bda3, 0xe88783,
+ /* b8 */ 0xe79788, 0xe5bab8, 0xe99b8d, 0xe8b88a,
+ /* bc */ 0xe89bb9, 0xe5928f, 0xe6b3b3, 0xe6b68c,
+ /* c0 */ 0xe6b0b8, 0xe681bf, 0xe58b87, 0xe794a8,
+ /* c4 */ 0xe5b9bd, 0xe4bc98, 0xe682a0, 0xe5bfa7,
+ /* c8 */ 0xe5b0a4, 0xe794b1, 0xe982ae, 0xe99380,
+ /* cc */ 0xe78ab9, 0xe6b2b9, 0xe6b8b8, 0xe98589,
+ /* d0 */ 0xe69c89, 0xe58f8b, 0xe58fb3, 0xe4bd91,
+ /* d4 */ 0xe98789, 0xe8afb1, 0xe58f88, 0xe5b9bc,
+ /* d8 */ 0xe8bf82, 0xe6b7a4, 0xe4ba8e, 0xe79b82,
+ /* dc */ 0xe6a686, 0xe8999e, 0xe6849a, 0xe88886,
+ /* e0 */ 0xe4bd99, 0xe4bf9e, 0xe980be, 0xe9b1bc,
+ /* e4 */ 0xe68489, 0xe6b89d, 0xe6b894, 0xe99a85,
+ /* e8 */ 0xe4ba88, 0xe5a8b1, 0xe99ba8, 0xe4b88e,
+ /* ec */ 0xe5b1bf, 0xe7a6b9, 0xe5ae87, 0xe8afad,
+ /* f0 */ 0xe7bebd, 0xe78e89, 0xe59f9f, 0xe88a8b,
+ /* f4 */ 0xe98381, 0xe59081, 0xe98187, 0xe596bb,
+ /* f8 */ 0xe5b3aa, 0xe5bea1, 0xe68488, 0xe6acb2,
+ /* fc */ 0xe78bb1, 0xe882b2, 0xe8aa89,
+
+ /*** Two byte table, leaf: d4xx - offset 0x03f2a ***/
+
+ /* 40 */ 0xe8a89e, 0xe8a89f, 0xe8a8a0, 0xe8a8a1,
+ /* 44 */ 0xe8a8a2, 0xe8a8a3, 0xe8a8a4, 0xe8a8a5,
+ /* 48 */ 0xe8a8a6, 0xe8a8a7, 0xe8a8a8, 0xe8a8a9,
+ /* 4c */ 0xe8a8aa, 0xe8a8ab, 0xe8a8ac, 0xe8a8ad,
+ /* 50 */ 0xe8a8ae, 0xe8a8af, 0xe8a8b0, 0xe8a8b1,
+ /* 54 */ 0xe8a8b2, 0xe8a8b3, 0xe8a8b4, 0xe8a8b5,
+ /* 58 */ 0xe8a8b6, 0xe8a8b7, 0xe8a8b8, 0xe8a8b9,
+ /* 5c */ 0xe8a8ba, 0xe8a8bb, 0xe8a8bc, 0xe8a8bd,
+ /* 60 */ 0xe8a8bf, 0xe8a980, 0xe8a981, 0xe8a982,
+ /* 64 */ 0xe8a983, 0xe8a984, 0xe8a985, 0xe8a986,
+ /* 68 */ 0xe8a987, 0xe8a989, 0xe8a98a, 0xe8a98b,
+ /* 6c */ 0xe8a98c, 0xe8a98d, 0xe8a98e, 0xe8a98f,
+ /* 70 */ 0xe8a990, 0xe8a991, 0xe8a992, 0xe8a993,
+ /* 74 */ 0xe8a994, 0xe8a995, 0xe8a996, 0xe8a997,
+ /* 78 */ 0xe8a998, 0xe8a999, 0xe8a99a, 0xe8a99b,
+ /* 7c */ 0xe8a99c, 0xe8a99d, 0xe8a99e, 0x000000,
+ /* 80 */ 0xe8a99f, 0xe8a9a0, 0xe8a9a1, 0xe8a9a2,
+ /* 84 */ 0xe8a9a3, 0xe8a9a4, 0xe8a9a5, 0xe8a9a6,
+ /* 88 */ 0xe8a9a7, 0xe8a9a8, 0xe8a9a9, 0xe8a9aa,
+ /* 8c */ 0xe8a9ab, 0xe8a9ac, 0xe8a9ad, 0xe8a9ae,
+ /* 90 */ 0xe8a9af, 0xe8a9b0, 0xe8a9b1, 0xe8a9b2,
+ /* 94 */ 0xe8a9b3, 0xe8a9b4, 0xe8a9b5, 0xe8a9b6,
+ /* 98 */ 0xe8a9b7, 0xe8a9b8, 0xe8a9ba, 0xe8a9bb,
+ /* 9c */ 0xe8a9bc, 0xe8a9bd, 0xe8a9be, 0xe8a9bf,
+ /* a0 */ 0xe8aa80, 0xe6b5b4, 0xe5af93, 0xe8a395,
+ /* a4 */ 0xe9a284, 0xe8b1ab, 0xe9a9ad, 0xe9b8b3,
+ /* a8 */ 0xe6b88a, 0xe586a4, 0xe58583, 0xe59ea3,
+ /* ac */ 0xe8a281, 0xe58e9f, 0xe68fb4, 0xe8be95,
+ /* b0 */ 0xe59bad, 0xe59198, 0xe59c86, 0xe78cbf,
+ /* b4 */ 0xe6ba90, 0xe7bc98, 0xe8bf9c, 0xe88b91,
+ /* b8 */ 0xe684bf, 0xe680a8, 0xe999a2, 0xe69bb0,
+ /* bc */ 0xe7baa6, 0xe8b68a, 0xe8b783, 0xe992a5,
+ /* c0 */ 0xe5b2b3, 0xe7b2a4, 0xe69c88, 0xe682a6,
+ /* c4 */ 0xe99885, 0xe88098, 0xe4ba91, 0xe983a7,
+ /* c8 */ 0xe58c80, 0xe999a8, 0xe58581, 0xe8bf90,
+ /* cc */ 0xe895b4, 0xe9859d, 0xe69995, 0xe99fb5,
+ /* d0 */ 0xe5ad95, 0xe58c9d, 0xe7a0b8, 0xe69d82,
+ /* d4 */ 0xe6a0bd, 0xe59389, 0xe781be, 0xe5aeb0,
+ /* d8 */ 0xe8bdbd, 0xe5868d, 0xe59ca8, 0xe592b1,
+ /* dc */ 0xe69492, 0xe69a82, 0xe8b59e, 0xe8b583,
+ /* e0 */ 0xe8848f, 0xe891ac, 0xe981ad, 0xe7b39f,
+ /* e4 */ 0xe587bf, 0xe897bb, 0xe69ea3, 0xe697a9,
+ /* e8 */ 0xe6bea1, 0xe89aa4, 0xe8ba81, 0xe599aa,
+ /* ec */ 0xe980a0, 0xe79a82, 0xe781b6, 0xe787a5,
+ /* f0 */ 0xe8b4a3, 0xe68ba9, 0xe58899, 0xe6b3bd,
+ /* f4 */ 0xe8b4bc, 0xe6808e, 0xe5a29e, 0xe6868e,
+ /* f8 */ 0xe69bbe, 0xe8b5a0, 0xe6898e, 0xe596b3,
+ /* fc */ 0xe6b8a3, 0xe69cad, 0xe8bda7,
+
+ /*** Two byte table, leaf: d5xx - offset 0x03fe9 ***/
+
+ /* 40 */ 0xe8aa81, 0xe8aa82, 0xe8aa83, 0xe8aa84,
+ /* 44 */ 0xe8aa85, 0xe8aa86, 0xe8aa87, 0xe8aa88,
+ /* 48 */ 0xe8aa8b, 0xe8aa8c, 0xe8aa8d, 0xe8aa8e,
+ /* 4c */ 0xe8aa8f, 0xe8aa90, 0xe8aa91, 0xe8aa92,
+ /* 50 */ 0xe8aa94, 0xe8aa95, 0xe8aa96, 0xe8aa97,
+ /* 54 */ 0xe8aa98, 0xe8aa99, 0xe8aa9a, 0xe8aa9b,
+ /* 58 */ 0xe8aa9c, 0xe8aa9d, 0xe8aa9e, 0xe8aa9f,
+ /* 5c */ 0xe8aaa0, 0xe8aaa1, 0xe8aaa2, 0xe8aaa3,
+ /* 60 */ 0xe8aaa4, 0xe8aaa5, 0xe8aaa6, 0xe8aaa7,
+ /* 64 */ 0xe8aaa8, 0xe8aaa9, 0xe8aaaa, 0xe8aaab,
+ /* 68 */ 0xe8aaac, 0xe8aaad, 0xe8aaae, 0xe8aaaf,
+ /* 6c */ 0xe8aab0, 0xe8aab1, 0xe8aab2, 0xe8aab3,
+ /* 70 */ 0xe8aab4, 0xe8aab5, 0xe8aab6, 0xe8aab7,
+ /* 74 */ 0xe8aab8, 0xe8aab9, 0xe8aaba, 0xe8aabb,
+ /* 78 */ 0xe8aabc, 0xe8aabd, 0xe8aabe, 0xe8aabf,
+ /* 7c */ 0xe8ab80, 0xe8ab81, 0xe8ab82, 0x000000,
+ /* 80 */ 0xe8ab83, 0xe8ab84, 0xe8ab85, 0xe8ab86,
+ /* 84 */ 0xe8ab87, 0xe8ab88, 0xe8ab89, 0xe8ab8a,
+ /* 88 */ 0xe8ab8b, 0xe8ab8c, 0xe8ab8d, 0xe8ab8e,
+ /* 8c */ 0xe8ab8f, 0xe8ab90, 0xe8ab91, 0xe8ab92,
+ /* 90 */ 0xe8ab93, 0xe8ab94, 0xe8ab95, 0xe8ab96,
+ /* 94 */ 0xe8ab97, 0xe8ab98, 0xe8ab99, 0xe8ab9a,
+ /* 98 */ 0xe8ab9b, 0xe8ab9c, 0xe8ab9d, 0xe8ab9e,
+ /* 9c */ 0xe8ab9f, 0xe8aba0, 0xe8aba1, 0xe8aba2,
+ /* a0 */ 0xe8aba3, 0xe993a1, 0xe997b8, 0xe79ca8,
+ /* a4 */ 0xe6a085, 0xe6a6a8, 0xe5928b, 0xe4b98d,
+ /* a8 */ 0xe782b8, 0xe8af88, 0xe69198, 0xe6968b,
+ /* ac */ 0xe5ae85, 0xe7aa84, 0xe580ba, 0xe5afa8,
+ /* b0 */ 0xe79ebb, 0xe6afa1, 0xe8a9b9, 0xe7b298,
+ /* b4 */ 0xe6b2be, 0xe79b8f, 0xe696a9, 0xe8be97,
+ /* b8 */ 0xe5b4ad, 0xe5b195, 0xe898b8, 0xe6a088,
+ /* bc */ 0xe58da0, 0xe68898, 0xe7ab99, 0xe6b99b,
+ /* c0 */ 0xe7bbbd, 0xe6a89f, 0xe7aba0, 0xe5bdb0,
+ /* c4 */ 0xe6bcb3, 0xe5bca0, 0xe68e8c, 0xe6b6a8,
+ /* c8 */ 0xe69d96, 0xe4b888, 0xe5b890, 0xe8b4a6,
+ /* cc */ 0xe4bb97, 0xe88380, 0xe798b4, 0xe99a9c,
+ /* d0 */ 0xe68b9b, 0xe698ad, 0xe689be, 0xe6b2bc,
+ /* d4 */ 0xe8b5b5, 0xe785a7, 0xe7bda9, 0xe58586,
+ /* d8 */ 0xe88287, 0xe58fac, 0xe981ae, 0xe68a98,
+ /* dc */ 0xe593b2, 0xe89bb0, 0xe8be99, 0xe88085,
+ /* e0 */ 0xe99497, 0xe89497, 0xe8bf99, 0xe6b599,
+ /* e4 */ 0xe78f8d, 0xe6969f, 0xe79c9f, 0xe79484,
+ /* e8 */ 0xe7a0a7, 0xe887bb, 0xe8b49e, 0xe99288,
+ /* ec */ 0xe4bea6, 0xe69e95, 0xe796b9, 0xe8af8a,
+ /* f0 */ 0xe99c87, 0xe68caf, 0xe99587, 0xe998b5,
+ /* f4 */ 0xe892b8, 0xe68ca3, 0xe79d81, 0xe5be81,
+ /* f8 */ 0xe78bb0, 0xe4ba89, 0xe68094, 0xe695b4,
+ /* fc */ 0xe68baf, 0xe6ada3, 0xe694bf,
+
+ /*** Two byte table, leaf: d6xx - offset 0x040a8 ***/
+
+ /* 40 */ 0xe8aba4, 0xe8aba5, 0xe8aba6, 0xe8aba7,
+ /* 44 */ 0xe8aba8, 0xe8aba9, 0xe8abaa, 0xe8abab,
+ /* 48 */ 0xe8abac, 0xe8abad, 0xe8abae, 0xe8abaf,
+ /* 4c */ 0xe8abb0, 0xe8abb1, 0xe8abb2, 0xe8abb3,
+ /* 50 */ 0xe8abb4, 0xe8abb5, 0xe8abb6, 0xe8abb7,
+ /* 54 */ 0xe8abb8, 0xe8abb9, 0xe8abba, 0xe8abbb,
+ /* 58 */ 0xe8abbc, 0xe8abbd, 0xe8abbe, 0xe8abbf,
+ /* 5c */ 0xe8ac80, 0xe8ac81, 0xe8ac82, 0xe8ac83,
+ /* 60 */ 0xe8ac84, 0xe8ac85, 0xe8ac86, 0xe8ac88,
+ /* 64 */ 0xe8ac89, 0xe8ac8a, 0xe8ac8b, 0xe8ac8c,
+ /* 68 */ 0xe8ac8d, 0xe8ac8e, 0xe8ac8f, 0xe8ac90,
+ /* 6c */ 0xe8ac91, 0xe8ac92, 0xe8ac93, 0xe8ac94,
+ /* 70 */ 0xe8ac95, 0xe8ac96, 0xe8ac97, 0xe8ac98,
+ /* 74 */ 0xe8ac99, 0xe8ac9a, 0xe8ac9b, 0xe8ac9c,
+ /* 78 */ 0xe8ac9d, 0xe8ac9e, 0xe8ac9f, 0xe8aca0,
+ /* 7c */ 0xe8aca1, 0xe8aca2, 0xe8aca3, 0x000000,
+ /* 80 */ 0xe8aca4, 0xe8aca5, 0xe8aca7, 0xe8aca8,
+ /* 84 */ 0xe8aca9, 0xe8acaa, 0xe8acab, 0xe8acac,
+ /* 88 */ 0xe8acad, 0xe8acae, 0xe8acaf, 0xe8acb0,
+ /* 8c */ 0xe8acb1, 0xe8acb2, 0xe8acb3, 0xe8acb4,
+ /* 90 */ 0xe8acb5, 0xe8acb6, 0xe8acb7, 0xe8acb8,
+ /* 94 */ 0xe8acb9, 0xe8acba, 0xe8acbb, 0xe8acbc,
+ /* 98 */ 0xe8acbd, 0xe8acbe, 0xe8acbf, 0xe8ad80,
+ /* 9c */ 0xe8ad81, 0xe8ad82, 0xe8ad83, 0xe8ad84,
+ /* a0 */ 0xe8ad85, 0xe5b8a7, 0xe79787, 0xe98391,
+ /* a4 */ 0xe8af81, 0xe88a9d, 0xe69e9d, 0xe694af,
+ /* a8 */ 0xe590b1, 0xe89c98, 0xe79fa5, 0xe882a2,
+ /* ac */ 0xe88482, 0xe6b181, 0xe4b98b, 0xe7bb87,
+ /* b0 */ 0xe8818c, 0xe79bb4, 0xe6a48d, 0xe6ae96,
+ /* b4 */ 0xe689a7, 0xe580bc, 0xe4be84, 0xe59d80,
+ /* b8 */ 0xe68c87, 0xe6ada2, 0xe8b6be, 0xe58faa,
+ /* bc */ 0xe697a8, 0xe7bab8, 0xe5bf97, 0xe68c9a,
+ /* c0 */ 0xe68eb7, 0xe887b3, 0xe887b4, 0xe7bdae,
+ /* c4 */ 0xe5b89c, 0xe5b399, 0xe588b6, 0xe699ba,
+ /* c8 */ 0xe7a7a9, 0xe7a89a, 0xe8b4a8, 0xe78299,
+ /* cc */ 0xe79794, 0xe6bb9e, 0xe6b2bb, 0xe7aa92,
+ /* d0 */ 0xe4b8ad, 0xe79b85, 0xe5bfa0, 0xe9929f,
+ /* d4 */ 0xe8a1b7, 0xe7bb88, 0xe7a78d, 0xe882bf,
+ /* d8 */ 0xe9878d, 0xe4bbb2, 0xe4bc97, 0xe8889f,
+ /* dc */ 0xe591a8, 0xe5b79e, 0xe6b4b2, 0xe8af8c,
+ /* e0 */ 0xe7b2a5, 0xe8bdb4, 0xe88298, 0xe5b89a,
+ /* e4 */ 0xe59292, 0xe79ab1, 0xe5ae99, 0xe698bc,
+ /* e8 */ 0xe9aaa4, 0xe78fa0, 0xe6a0aa, 0xe89b9b,
+ /* ec */ 0xe69cb1, 0xe78caa, 0xe8afb8, 0xe8af9b,
+ /* f0 */ 0xe98090, 0xe7abb9, 0xe7839b, 0xe785ae,
+ /* f4 */ 0xe68b84, 0xe79ea9, 0xe598b1, 0xe4b8bb,
+ /* f8 */ 0xe89197, 0xe69fb1, 0xe58aa9, 0xe89b80,
+ /* fc */ 0xe8b4ae, 0xe993b8, 0xe7ad91,
+
+ /*** Two byte table, leaf: d7xx - offset 0x04167 ***/
+
+ /* 40 */ 0xe8ad86, 0xe8ad87, 0xe8ad88, 0xe8ad89,
+ /* 44 */ 0xe8ad8a, 0xe8ad8b, 0xe8ad8c, 0xe8ad8d,
+ /* 48 */ 0xe8ad8e, 0xe8ad8f, 0xe8ad90, 0xe8ad91,
+ /* 4c */ 0xe8ad92, 0xe8ad93, 0xe8ad94, 0xe8ad95,
+ /* 50 */ 0xe8ad96, 0xe8ad97, 0xe8ad98, 0xe8ad99,
+ /* 54 */ 0xe8ad9a, 0xe8ad9b, 0xe8ad9c, 0xe8ad9d,
+ /* 58 */ 0xe8ad9e, 0xe8ad9f, 0xe8ada0, 0xe8ada1,
+ /* 5c */ 0xe8ada2, 0xe8ada3, 0xe8ada4, 0xe8ada5,
+ /* 60 */ 0xe8ada7, 0xe8ada8, 0xe8ada9, 0xe8adaa,
+ /* 64 */ 0xe8adab, 0xe8adad, 0xe8adae, 0xe8adaf,
+ /* 68 */ 0xe8adb0, 0xe8adb1, 0xe8adb2, 0xe8adb3,
+ /* 6c */ 0xe8adb4, 0xe8adb5, 0xe8adb6, 0xe8adb7,
+ /* 70 */ 0xe8adb8, 0xe8adb9, 0xe8adba, 0xe8adbb,
+ /* 74 */ 0xe8adbc, 0xe8adbd, 0xe8adbe, 0xe8adbf,
+ /* 78 */ 0xe8ae80, 0xe8ae81, 0xe8ae82, 0xe8ae83,
+ /* 7c */ 0xe8ae84, 0xe8ae85, 0xe8ae86, 0x000000,
+ /* 80 */ 0xe8ae87, 0xe8ae88, 0xe8ae89, 0xe8ae8a,
+ /* 84 */ 0xe8ae8b, 0xe8ae8c, 0xe8ae8d, 0xe8ae8e,
+ /* 88 */ 0xe8ae8f, 0xe8ae90, 0xe8ae91, 0xe8ae92,
+ /* 8c */ 0xe8ae93, 0xe8ae94, 0xe8ae95, 0xe8ae96,
+ /* 90 */ 0xe8ae97, 0xe8ae98, 0xe8ae99, 0xe8ae9a,
+ /* 94 */ 0xe8ae9b, 0xe8ae9c, 0xe8ae9d, 0xe8ae9e,
+ /* 98 */ 0xe8ae9f, 0xe8aeac, 0xe8aeb1, 0xe8aebb,
+ /* 9c */ 0xe8af87, 0xe8af90, 0xe8afaa, 0xe8b089,
+ /* a0 */ 0xe8b09e, 0xe4bd8f, 0xe6b3a8, 0xe7a59d,
+ /* a4 */ 0xe9a9bb, 0xe68a93, 0xe788aa, 0xe68bbd,
+ /* a8 */ 0xe4b893, 0xe7a096, 0xe8bdac, 0xe692b0,
+ /* ac */ 0xe8b59a, 0xe7af86, 0xe6a1a9, 0xe5ba84,
+ /* b0 */ 0xe8a385, 0xe5a686, 0xe6929e, 0xe5a3ae,
+ /* b4 */ 0xe78ab6, 0xe6a48e, 0xe994a5, 0xe8bfbd,
+ /* b8 */ 0xe8b598, 0xe59da0, 0xe7bc80, 0xe8b086,
+ /* bc */ 0xe58786, 0xe68d89, 0xe68b99, 0xe58d93,
+ /* c0 */ 0xe6a18c, 0xe790a2, 0xe88c81, 0xe9858c,
+ /* c4 */ 0xe59584, 0xe79d80, 0xe781bc, 0xe6b58a,
+ /* c8 */ 0xe585b9, 0xe592a8, 0xe8b584, 0xe5a7bf,
+ /* cc */ 0xe6bb8b, 0xe6b784, 0xe5ad9c, 0xe7b4ab,
+ /* d0 */ 0xe4bb94, 0xe7b1bd, 0xe6bb93, 0xe5ad90,
+ /* d4 */ 0xe887aa, 0xe6b88d, 0xe5ad97, 0xe9ac83,
+ /* d8 */ 0xe6a395, 0xe8b8aa, 0xe5ae97, 0xe7bbbc,
+ /* dc */ 0xe680bb, 0xe7bab5, 0xe982b9, 0xe8b5b0,
+ /* e0 */ 0xe5a58f, 0xe68f8d, 0xe7a79f, 0xe8b6b3,
+ /* e4 */ 0xe58d92, 0xe6978f, 0xe7a596, 0xe8af85,
+ /* e8 */ 0xe998bb, 0xe7bb84, 0xe992bb, 0xe7ba82,
+ /* ec */ 0xe598b4, 0xe98689, 0xe69c80, 0xe7bdaa,
+ /* f0 */ 0xe5b08a, 0xe981b5, 0xe698a8, 0xe5b7a6,
+ /* f4 */ 0xe4bd90, 0xe69f9e, 0xe5819a, 0xe4bd9c,
+ /* f8 */ 0xe59d90, 0xe5baa7, 0xeea090, 0xeea091,
+ /* fc */ 0xeea092, 0xeea093, 0xeea094,
+
+ /*** Two byte table, leaf: d8xx - offset 0x04226 ***/
+
+ /* 40 */ 0xe8b0b8, 0xe8b0b9, 0xe8b0ba, 0xe8b0bb,
+ /* 44 */ 0xe8b0bc, 0xe8b0bd, 0xe8b0be, 0xe8b0bf,
+ /* 48 */ 0xe8b180, 0xe8b182, 0xe8b183, 0xe8b184,
+ /* 4c */ 0xe8b185, 0xe8b188, 0xe8b18a, 0xe8b18b,
+ /* 50 */ 0xe8b18d, 0xe8b18e, 0xe8b18f, 0xe8b190,
+ /* 54 */ 0xe8b191, 0xe8b192, 0xe8b193, 0xe8b194,
+ /* 58 */ 0xe8b196, 0xe8b197, 0xe8b198, 0xe8b199,
+ /* 5c */ 0xe8b19b, 0xe8b19c, 0xe8b19d, 0xe8b19e,
+ /* 60 */ 0xe8b19f, 0xe8b1a0, 0xe8b1a3, 0xe8b1a4,
+ /* 64 */ 0xe8b1a5, 0xe8b1a6, 0xe8b1a7, 0xe8b1a8,
+ /* 68 */ 0xe8b1a9, 0xe8b1ac, 0xe8b1ad, 0xe8b1ae,
+ /* 6c */ 0xe8b1af, 0xe8b1b0, 0xe8b1b1, 0xe8b1b2,
+ /* 70 */ 0xe8b1b4, 0xe8b1b5, 0xe8b1b6, 0xe8b1b7,
+ /* 74 */ 0xe8b1bb, 0xe8b1bc, 0xe8b1bd, 0xe8b1be,
+ /* 78 */ 0xe8b1bf, 0xe8b280, 0xe8b281, 0xe8b283,
+ /* 7c */ 0xe8b284, 0xe8b286, 0xe8b287, 0x000000,
+ /* 80 */ 0xe8b288, 0xe8b28b, 0xe8b28d, 0xe8b28e,
+ /* 84 */ 0xe8b28f, 0xe8b290, 0xe8b291, 0xe8b292,
+ /* 88 */ 0xe8b293, 0xe8b295, 0xe8b296, 0xe8b297,
+ /* 8c */ 0xe8b299, 0xe8b29a, 0xe8b29b, 0xe8b29c,
+ /* 90 */ 0xe8b29d, 0xe8b29e, 0xe8b29f, 0xe8b2a0,
+ /* 94 */ 0xe8b2a1, 0xe8b2a2, 0xe8b2a3, 0xe8b2a4,
+ /* 98 */ 0xe8b2a5, 0xe8b2a6, 0xe8b2a7, 0xe8b2a8,
+ /* 9c */ 0xe8b2a9, 0xe8b2aa, 0xe8b2ab, 0xe8b2ac,
+ /* a0 */ 0xe8b2ad, 0xe4ba8d, 0xe4b88c, 0xe58580,
+ /* a4 */ 0xe4b890, 0xe5bbbf, 0xe58d85, 0xe4b895,
+ /* a8 */ 0xe4ba98, 0xe4b89e, 0xe9acb2, 0xe5adac,
+ /* ac */ 0xe599a9, 0xe4b8a8, 0xe7a6ba, 0xe4b8bf,
+ /* b0 */ 0xe58c95, 0xe4b987, 0xe5a4ad, 0xe788bb,
+ /* b4 */ 0xe58dae, 0xe6b090, 0xe59b9f, 0xe883a4,
+ /* b8 */ 0xe9a697, 0xe6af93, 0xe79dbe, 0xe9bc97,
+ /* bc */ 0xe4b8b6, 0xe4ba9f, 0xe9bc90, 0xe4b99c,
+ /* c0 */ 0xe4b9a9, 0xe4ba93, 0xe88a88, 0xe5ad9b,
+ /* c4 */ 0xe595ac, 0xe5988f, 0xe4bb84, 0xe58e8d,
+ /* c8 */ 0xe58e9d, 0xe58ea3, 0xe58ea5, 0xe58eae,
+ /* cc */ 0xe99da5, 0xe8b59d, 0xe58c9a, 0xe58fb5,
+ /* d0 */ 0xe58ca6, 0xe58cae, 0xe58cbe, 0xe8b59c,
+ /* d4 */ 0xe58da6, 0xe58da3, 0xe58882, 0xe58888,
+ /* d8 */ 0xe5888e, 0xe588ad, 0xe588b3, 0xe588bf,
+ /* dc */ 0xe58980, 0xe5898c, 0xe5899e, 0xe589a1,
+ /* e0 */ 0xe5899c, 0xe892af, 0xe589bd, 0xe58a82,
+ /* e4 */ 0xe58a81, 0xe58a90, 0xe58a93, 0xe58682,
+ /* e8 */ 0xe7bd94, 0xe4babb, 0xe4bb83, 0xe4bb89,
+ /* ec */ 0xe4bb82, 0xe4bba8, 0xe4bba1, 0xe4bbab,
+ /* f0 */ 0xe4bb9e, 0xe4bc9b, 0xe4bbb3, 0xe4bca2,
+ /* f4 */ 0xe4bda4, 0xe4bbb5, 0xe4bca5, 0xe4bca7,
+ /* f8 */ 0xe4bc89, 0xe4bcab, 0xe4bd9e, 0xe4bda7,
+ /* fc */ 0xe694b8, 0xe4bd9a, 0xe4bd9d,
+
+ /*** Two byte table, leaf: d9xx - offset 0x042e5 ***/
+
+ /* 40 */ 0xe8b2ae, 0xe8b2af, 0xe8b2b0, 0xe8b2b1,
+ /* 44 */ 0xe8b2b2, 0xe8b2b3, 0xe8b2b4, 0xe8b2b5,
+ /* 48 */ 0xe8b2b6, 0xe8b2b7, 0xe8b2b8, 0xe8b2b9,
+ /* 4c */ 0xe8b2ba, 0xe8b2bb, 0xe8b2bc, 0xe8b2bd,
+ /* 50 */ 0xe8b2be, 0xe8b2bf, 0xe8b380, 0xe8b381,
+ /* 54 */ 0xe8b382, 0xe8b383, 0xe8b384, 0xe8b385,
+ /* 58 */ 0xe8b386, 0xe8b387, 0xe8b388, 0xe8b389,
+ /* 5c */ 0xe8b38a, 0xe8b38b, 0xe8b38c, 0xe8b38d,
+ /* 60 */ 0xe8b38e, 0xe8b38f, 0xe8b390, 0xe8b391,
+ /* 64 */ 0xe8b392, 0xe8b393, 0xe8b394, 0xe8b395,
+ /* 68 */ 0xe8b396, 0xe8b397, 0xe8b398, 0xe8b399,
+ /* 6c */ 0xe8b39a, 0xe8b39b, 0xe8b39c, 0xe8b39d,
+ /* 70 */ 0xe8b39e, 0xe8b39f, 0xe8b3a0, 0xe8b3a1,
+ /* 74 */ 0xe8b3a2, 0xe8b3a3, 0xe8b3a4, 0xe8b3a5,
+ /* 78 */ 0xe8b3a6, 0xe8b3a7, 0xe8b3a8, 0xe8b3a9,
+ /* 7c */ 0xe8b3aa, 0xe8b3ab, 0xe8b3ac, 0x000000,
+ /* 80 */ 0xe8b3ad, 0xe8b3ae, 0xe8b3af, 0xe8b3b0,
+ /* 84 */ 0xe8b3b1, 0xe8b3b2, 0xe8b3b3, 0xe8b3b4,
+ /* 88 */ 0xe8b3b5, 0xe8b3b6, 0xe8b3b7, 0xe8b3b8,
+ /* 8c */ 0xe8b3b9, 0xe8b3ba, 0xe8b3bb, 0xe8b3bc,
+ /* 90 */ 0xe8b3bd, 0xe8b3be, 0xe8b3bf, 0xe8b480,
+ /* 94 */ 0xe8b481, 0xe8b482, 0xe8b483, 0xe8b484,
+ /* 98 */ 0xe8b485, 0xe8b486, 0xe8b487, 0xe8b488,
+ /* 9c */ 0xe8b489, 0xe8b48a, 0xe8b48b, 0xe8b48c,
+ /* a0 */ 0xe8b48d, 0xe4bd9f, 0xe4bd97, 0xe4bcb2,
+ /* a4 */ 0xe4bcbd, 0xe4bdb6, 0xe4bdb4, 0xe4be91,
+ /* a8 */ 0xe4be89, 0xe4be83, 0xe4be8f, 0xe4bdbe,
+ /* ac */ 0xe4bdbb, 0xe4beaa, 0xe4bdbc, 0xe4beac,
+ /* b0 */ 0xe4be94, 0xe4bfa6, 0xe4bfa8, 0xe4bfaa,
+ /* b4 */ 0xe4bf85, 0xe4bf9a, 0xe4bfa3, 0xe4bf9c,
+ /* b8 */ 0xe4bf91, 0xe4bf9f, 0xe4bfb8, 0xe580a9,
+ /* bc */ 0xe5818c, 0xe4bfb3, 0xe580ac, 0xe5808f,
+ /* c0 */ 0xe580ae, 0xe580ad, 0xe4bfbe, 0xe5809c,
+ /* c4 */ 0xe5808c, 0xe580a5, 0xe580a8, 0xe581be,
+ /* c8 */ 0xe58183, 0xe58195, 0xe58188, 0xe5818e,
+ /* cc */ 0xe581ac, 0xe581bb, 0xe582a5, 0xe582a7,
+ /* d0 */ 0xe582a9, 0xe582ba, 0xe58396, 0xe58486,
+ /* d4 */ 0xe583ad, 0xe583ac, 0xe583a6, 0xe583ae,
+ /* d8 */ 0xe58487, 0xe5848b, 0xe4bb9d, 0xe6b0bd,
+ /* dc */ 0xe4bd98, 0xe4bda5, 0xe4bf8e, 0xe9bea0,
+ /* e0 */ 0xe6b186, 0xe7b1b4, 0xe585ae, 0xe5b7bd,
+ /* e4 */ 0xe9bb89, 0xe9a698, 0xe58681, 0xe5a494,
+ /* e8 */ 0xe58bb9, 0xe58c8d, 0xe8a887, 0xe58c90,
+ /* ec */ 0xe587ab, 0xe5a499, 0xe58595, 0xe4baa0,
+ /* f0 */ 0xe58596, 0xe4bab3, 0xe8a1ae, 0xe8a2a4,
+ /* f4 */ 0xe4bab5, 0xe88494, 0xe8a392, 0xe7a680,
+ /* f8 */ 0xe5acb4, 0xe8a083, 0xe7beb8, 0xe586ab,
+ /* fc */ 0xe586b1, 0xe586bd, 0xe586bc,
+
+ /*** Two byte table, leaf: daxx - offset 0x043a4 ***/
+
+ /* 40 */ 0xe8b48e, 0xe8b48f, 0xe8b490, 0xe8b491,
+ /* 44 */ 0xe8b492, 0xe8b493, 0xe8b494, 0xe8b495,
+ /* 48 */ 0xe8b496, 0xe8b497, 0xe8b498, 0xe8b499,
+ /* 4c */ 0xe8b49a, 0xe8b49b, 0xe8b49c, 0xe8b4a0,
+ /* 50 */ 0xe8b591, 0xe8b592, 0xe8b597, 0xe8b59f,
+ /* 54 */ 0xe8b5a5, 0xe8b5a8, 0xe8b5a9, 0xe8b5aa,
+ /* 58 */ 0xe8b5ac, 0xe8b5ae, 0xe8b5af, 0xe8b5b1,
+ /* 5c */ 0xe8b5b2, 0xe8b5b8, 0xe8b5b9, 0xe8b5ba,
+ /* 60 */ 0xe8b5bb, 0xe8b5bc, 0xe8b5bd, 0xe8b5be,
+ /* 64 */ 0xe8b5bf, 0xe8b680, 0xe8b682, 0xe8b683,
+ /* 68 */ 0xe8b686, 0xe8b687, 0xe8b688, 0xe8b689,
+ /* 6c */ 0xe8b68c, 0xe8b68d, 0xe8b68e, 0xe8b68f,
+ /* 70 */ 0xe8b690, 0xe8b692, 0xe8b693, 0xe8b695,
+ /* 74 */ 0xe8b696, 0xe8b697, 0xe8b698, 0xe8b699,
+ /* 78 */ 0xe8b69a, 0xe8b69b, 0xe8b69c, 0xe8b69d,
+ /* 7c */ 0xe8b69e, 0xe8b6a0, 0xe8b6a1, 0x000000,
+ /* 80 */ 0xe8b6a2, 0xe8b6a4, 0xe8b6a5, 0xe8b6a6,
+ /* 84 */ 0xe8b6a7, 0xe8b6a8, 0xe8b6a9, 0xe8b6aa,
+ /* 88 */ 0xe8b6ab, 0xe8b6ac, 0xe8b6ad, 0xe8b6ae,
+ /* 8c */ 0xe8b6af, 0xe8b6b0, 0xe8b6b2, 0xe8b6b6,
+ /* 90 */ 0xe8b6b7, 0xe8b6b9, 0xe8b6bb, 0xe8b6bd,
+ /* 94 */ 0xe8b780, 0xe8b781, 0xe8b782, 0xe8b785,
+ /* 98 */ 0xe8b787, 0xe8b788, 0xe8b789, 0xe8b78a,
+ /* 9c */ 0xe8b78d, 0xe8b790, 0xe8b792, 0xe8b793,
+ /* a0 */ 0xe8b794, 0xe58787, 0xe58696, 0xe586a2,
+ /* a4 */ 0xe586a5, 0xe8aea0, 0xe8aea6, 0xe8aea7,
+ /* a8 */ 0xe8aeaa, 0xe8aeb4, 0xe8aeb5, 0xe8aeb7,
+ /* ac */ 0xe8af82, 0xe8af83, 0xe8af8b, 0xe8af8f,
+ /* b0 */ 0xe8af8e, 0xe8af92, 0xe8af93, 0xe8af94,
+ /* b4 */ 0xe8af96, 0xe8af98, 0xe8af99, 0xe8af9c,
+ /* b8 */ 0xe8af9f, 0xe8afa0, 0xe8afa4, 0xe8afa8,
+ /* bc */ 0xe8afa9, 0xe8afae, 0xe8afb0, 0xe8afb3,
+ /* c0 */ 0xe8afb6, 0xe8afb9, 0xe8afbc, 0xe8afbf,
+ /* c4 */ 0xe8b080, 0xe8b082, 0xe8b084, 0xe8b087,
+ /* c8 */ 0xe8b08c, 0xe8b08f, 0xe8b091, 0xe8b092,
+ /* cc */ 0xe8b094, 0xe8b095, 0xe8b096, 0xe8b099,
+ /* d0 */ 0xe8b09b, 0xe8b098, 0xe8b09d, 0xe8b09f,
+ /* d4 */ 0xe8b0a0, 0xe8b0a1, 0xe8b0a5, 0xe8b0a7,
+ /* d8 */ 0xe8b0aa, 0xe8b0ab, 0xe8b0ae, 0xe8b0af,
+ /* dc */ 0xe8b0b2, 0xe8b0b3, 0xe8b0b5, 0xe8b0b6,
+ /* e0 */ 0xe58da9, 0xe58dba, 0xe9989d, 0xe998a2,
+ /* e4 */ 0xe998a1, 0xe998b1, 0xe998aa, 0xe998bd,
+ /* e8 */ 0xe998bc, 0xe99982, 0xe99989, 0xe99994,
+ /* ec */ 0xe9999f, 0xe999a7, 0xe999ac, 0xe999b2,
+ /* f0 */ 0xe999b4, 0xe99a88, 0xe99a8d, 0xe99a97,
+ /* f4 */ 0xe99ab0, 0xe98297, 0xe9829b, 0xe9829d,
+ /* f8 */ 0xe98299, 0xe982ac, 0xe982a1, 0xe982b4,
+ /* fc */ 0xe982b3, 0xe982b6, 0xe982ba,
+
+ /*** Two byte table, leaf: dbxx - offset 0x04463 ***/
+
+ /* 40 */ 0xe8b795, 0xe8b798, 0xe8b799, 0xe8b79c,
+ /* 44 */ 0xe8b7a0, 0xe8b7a1, 0xe8b7a2, 0xe8b7a5,
+ /* 48 */ 0xe8b7a6, 0xe8b7a7, 0xe8b7a9, 0xe8b7ad,
+ /* 4c */ 0xe8b7ae, 0xe8b7b0, 0xe8b7b1, 0xe8b7b2,
+ /* 50 */ 0xe8b7b4, 0xe8b7b6, 0xe8b7bc, 0xe8b7be,
+ /* 54 */ 0xe8b7bf, 0xe8b880, 0xe8b881, 0xe8b882,
+ /* 58 */ 0xe8b883, 0xe8b884, 0xe8b886, 0xe8b887,
+ /* 5c */ 0xe8b888, 0xe8b88b, 0xe8b88d, 0xe8b88e,
+ /* 60 */ 0xe8b890, 0xe8b891, 0xe8b892, 0xe8b893,
+ /* 64 */ 0xe8b895, 0xe8b896, 0xe8b897, 0xe8b898,
+ /* 68 */ 0xe8b899, 0xe8b89a, 0xe8b89b, 0xe8b89c,
+ /* 6c */ 0xe8b8a0, 0xe8b8a1, 0xe8b8a4, 0xe8b8a5,
+ /* 70 */ 0xe8b8a6, 0xe8b8a7, 0xe8b8a8, 0xe8b8ab,
+ /* 74 */ 0xe8b8ad, 0xe8b8b0, 0xe8b8b2, 0xe8b8b3,
+ /* 78 */ 0xe8b8b4, 0xe8b8b6, 0xe8b8b7, 0xe8b8b8,
+ /* 7c */ 0xe8b8bb, 0xe8b8bc, 0xe8b8be, 0x000000,
+ /* 80 */ 0xe8b8bf, 0xe8b983, 0xe8b985, 0xe8b986,
+ /* 84 */ 0xe8b98c, 0xe8b98d, 0xe8b98e, 0xe8b98f,
+ /* 88 */ 0xe8b990, 0xe8b993, 0xe8b994, 0xe8b995,
+ /* 8c */ 0xe8b996, 0xe8b997, 0xe8b998, 0xe8b99a,
+ /* 90 */ 0xe8b99b, 0xe8b99c, 0xe8b99d, 0xe8b99e,
+ /* 94 */ 0xe8b99f, 0xe8b9a0, 0xe8b9a1, 0xe8b9a2,
+ /* 98 */ 0xe8b9a3, 0xe8b9a4, 0xe8b9a5, 0xe8b9a7,
+ /* 9c */ 0xe8b9a8, 0xe8b9aa, 0xe8b9ab, 0xe8b9ae,
+ /* a0 */ 0xe8b9b1, 0xe982b8, 0xe982b0, 0xe9838f,
+ /* a4 */ 0xe98385, 0xe982be, 0xe98390, 0xe98384,
+ /* a8 */ 0xe98387, 0xe98393, 0xe983a6, 0xe983a2,
+ /* ac */ 0xe9839c, 0xe98397, 0xe9839b, 0xe983ab,
+ /* b0 */ 0xe983af, 0xe983be, 0xe98484, 0xe984a2,
+ /* b4 */ 0xe9849e, 0xe984a3, 0xe984b1, 0xe984af,
+ /* b8 */ 0xe984b9, 0xe98583, 0xe98586, 0xe5888d,
+ /* bc */ 0xe5a582, 0xe58aa2, 0xe58aac, 0xe58aad,
+ /* c0 */ 0xe58abe, 0xe593bf, 0xe58b90, 0xe58b96,
+ /* c4 */ 0xe58bb0, 0xe58f9f, 0xe787ae, 0xe79f8d,
+ /* c8 */ 0xe5bbb4, 0xe587b5, 0xe587bc, 0xe9acaf,
+ /* cc */ 0xe58eb6, 0xe5bc81, 0xe7959a, 0xe5b7af,
+ /* d0 */ 0xe59d8c, 0xe59ea9, 0xe59ea1, 0xe5a1be,
+ /* d4 */ 0xe5a2bc, 0xe5a385, 0xe5a391, 0xe59ca9,
+ /* d8 */ 0xe59cac, 0xe59caa, 0xe59cb3, 0xe59cb9,
+ /* dc */ 0xe59cae, 0xe59caf, 0xe59d9c, 0xe59cbb,
+ /* e0 */ 0xe59d82, 0xe59da9, 0xe59e85, 0xe59dab,
+ /* e4 */ 0xe59e86, 0xe59dbc, 0xe59dbb, 0xe59da8,
+ /* e8 */ 0xe59dad, 0xe59db6, 0xe59db3, 0xe59ead,
+ /* ec */ 0xe59ea4, 0xe59e8c, 0xe59eb2, 0xe59f8f,
+ /* f0 */ 0xe59ea7, 0xe59eb4, 0xe59e93, 0xe59ea0,
+ /* f4 */ 0xe59f95, 0xe59f98, 0xe59f9a, 0xe59f99,
+ /* f8 */ 0xe59f92, 0xe59eb8, 0xe59fb4, 0xe59faf,
+ /* fc */ 0xe59fb8, 0xe59fa4, 0xe59f9d,
+
+ /*** Two byte table, leaf: dcxx - offset 0x04522 ***/
+
+ /* 40 */ 0xe8b9b3, 0xe8b9b5, 0xe8b9b7, 0xe8b9b8,
+ /* 44 */ 0xe8b9b9, 0xe8b9ba, 0xe8b9bb, 0xe8b9bd,
+ /* 48 */ 0xe8b9be, 0xe8ba80, 0xe8ba82, 0xe8ba83,
+ /* 4c */ 0xe8ba84, 0xe8ba86, 0xe8ba88, 0xe8ba89,
+ /* 50 */ 0xe8ba8a, 0xe8ba8b, 0xe8ba8c, 0xe8ba8d,
+ /* 54 */ 0xe8ba8e, 0xe8ba91, 0xe8ba92, 0xe8ba93,
+ /* 58 */ 0xe8ba95, 0xe8ba96, 0xe8ba97, 0xe8ba98,
+ /* 5c */ 0xe8ba99, 0xe8ba9a, 0xe8ba9b, 0xe8ba9d,
+ /* 60 */ 0xe8ba9f, 0xe8baa0, 0xe8baa1, 0xe8baa2,
+ /* 64 */ 0xe8baa3, 0xe8baa4, 0xe8baa5, 0xe8baa6,
+ /* 68 */ 0xe8baa7, 0xe8baa8, 0xe8baa9, 0xe8baaa,
+ /* 6c */ 0xe8baad, 0xe8baae, 0xe8bab0, 0xe8bab1,
+ /* 70 */ 0xe8bab3, 0xe8bab4, 0xe8bab5, 0xe8bab6,
+ /* 74 */ 0xe8bab7, 0xe8bab8, 0xe8bab9, 0xe8babb,
+ /* 78 */ 0xe8babc, 0xe8babd, 0xe8babe, 0xe8babf,
+ /* 7c */ 0xe8bb80, 0xe8bb81, 0xe8bb82, 0x000000,
+ /* 80 */ 0xe8bb83, 0xe8bb84, 0xe8bb85, 0xe8bb86,
+ /* 84 */ 0xe8bb87, 0xe8bb88, 0xe8bb89, 0xe8bb8a,
+ /* 88 */ 0xe8bb8b, 0xe8bb8c, 0xe8bb8d, 0xe8bb8f,
+ /* 8c */ 0xe8bb90, 0xe8bb91, 0xe8bb92, 0xe8bb93,
+ /* 90 */ 0xe8bb94, 0xe8bb95, 0xe8bb96, 0xe8bb97,
+ /* 94 */ 0xe8bb98, 0xe8bb99, 0xe8bb9a, 0xe8bb9b,
+ /* 98 */ 0xe8bb9c, 0xe8bb9d, 0xe8bb9e, 0xe8bb9f,
+ /* 9c */ 0xe8bba0, 0xe8bba1, 0xe8bba2, 0xe8bba3,
+ /* a0 */ 0xe8bba4, 0xe5a08b, 0xe5a08d, 0xe59fbd,
+ /* a4 */ 0xe59fad, 0xe5a080, 0xe5a09e, 0xe5a099,
+ /* a8 */ 0xe5a184, 0xe5a0a0, 0xe5a1a5, 0xe5a1ac,
+ /* ac */ 0xe5a281, 0xe5a289, 0xe5a29a, 0xe5a280,
+ /* b0 */ 0xe9a6a8, 0xe9bc99, 0xe687bf, 0xe889b9,
+ /* b4 */ 0xe889bd, 0xe889bf, 0xe88a8f, 0xe88a8a,
+ /* b8 */ 0xe88aa8, 0xe88a84, 0xe88a8e, 0xe88a91,
+ /* bc */ 0xe88a97, 0xe88a99, 0xe88aab, 0xe88ab8,
+ /* c0 */ 0xe88abe, 0xe88ab0, 0xe88b88, 0xe88b8a,
+ /* c4 */ 0xe88ba3, 0xe88a98, 0xe88ab7, 0xe88aae,
+ /* c8 */ 0xe88b8b, 0xe88b8c, 0xe88b81, 0xe88aa9,
+ /* cc */ 0xe88ab4, 0xe88aa1, 0xe88aaa, 0xe88a9f,
+ /* d0 */ 0xe88b84, 0xe88b8e, 0xe88aa4, 0xe88ba1,
+ /* d4 */ 0xe88c89, 0xe88bb7, 0xe88ba4, 0xe88c8f,
+ /* d8 */ 0xe88c87, 0xe88b9c, 0xe88bb4, 0xe88b92,
+ /* dc */ 0xe88b98, 0xe88c8c, 0xe88bbb, 0xe88b93,
+ /* e0 */ 0xe88c91, 0xe88c9a, 0xe88c86, 0xe88c94,
+ /* e4 */ 0xe88c95, 0xe88ba0, 0xe88b95, 0xe88c9c,
+ /* e8 */ 0xe88d91, 0xe88d9b, 0xe88d9c, 0xe88c88,
+ /* ec */ 0xe88e92, 0xe88cbc, 0xe88cb4, 0xe88cb1,
+ /* f0 */ 0xe88e9b, 0xe88d9e, 0xe88caf, 0xe88d8f,
+ /* f4 */ 0xe88d87, 0xe88d83, 0xe88d9f, 0xe88d80,
+ /* f8 */ 0xe88c97, 0xe88da0, 0xe88cad, 0xe88cba,
+ /* fc */ 0xe88cb3, 0xe88da6, 0xe88da5,
+
+ /*** Two byte table, leaf: ddxx - offset 0x045e1 ***/
+
+ /* 40 */ 0xe8bba5, 0xe8bba6, 0xe8bba7, 0xe8bba8,
+ /* 44 */ 0xe8bba9, 0xe8bbaa, 0xe8bbab, 0xe8bbac,
+ /* 48 */ 0xe8bbad, 0xe8bbae, 0xe8bbaf, 0xe8bbb0,
+ /* 4c */ 0xe8bbb1, 0xe8bbb2, 0xe8bbb3, 0xe8bbb4,
+ /* 50 */ 0xe8bbb5, 0xe8bbb6, 0xe8bbb7, 0xe8bbb8,
+ /* 54 */ 0xe8bbb9, 0xe8bbba, 0xe8bbbb, 0xe8bbbc,
+ /* 58 */ 0xe8bbbd, 0xe8bbbe, 0xe8bbbf, 0xe8bc80,
+ /* 5c */ 0xe8bc81, 0xe8bc82, 0xe8bc83, 0xe8bc84,
+ /* 60 */ 0xe8bc85, 0xe8bc86, 0xe8bc87, 0xe8bc88,
+ /* 64 */ 0xe8bc89, 0xe8bc8a, 0xe8bc8b, 0xe8bc8c,
+ /* 68 */ 0xe8bc8d, 0xe8bc8e, 0xe8bc8f, 0xe8bc90,
+ /* 6c */ 0xe8bc91, 0xe8bc92, 0xe8bc93, 0xe8bc94,
+ /* 70 */ 0xe8bc95, 0xe8bc96, 0xe8bc97, 0xe8bc98,
+ /* 74 */ 0xe8bc99, 0xe8bc9a, 0xe8bc9b, 0xe8bc9c,
+ /* 78 */ 0xe8bc9d, 0xe8bc9e, 0xe8bc9f, 0xe8bca0,
+ /* 7c */ 0xe8bca1, 0xe8bca2, 0xe8bca3, 0x000000,
+ /* 80 */ 0xe8bca4, 0xe8bca5, 0xe8bca6, 0xe8bca7,
+ /* 84 */ 0xe8bca8, 0xe8bca9, 0xe8bcaa, 0xe8bcab,
+ /* 88 */ 0xe8bcac, 0xe8bcad, 0xe8bcae, 0xe8bcaf,
+ /* 8c */ 0xe8bcb0, 0xe8bcb1, 0xe8bcb2, 0xe8bcb3,
+ /* 90 */ 0xe8bcb4, 0xe8bcb5, 0xe8bcb6, 0xe8bcb7,
+ /* 94 */ 0xe8bcb8, 0xe8bcb9, 0xe8bcba, 0xe8bcbb,
+ /* 98 */ 0xe8bcbc, 0xe8bcbd, 0xe8bcbe, 0xe8bcbf,
+ /* 9c */ 0xe8bd80, 0xe8bd81, 0xe8bd82, 0xe8bd83,
+ /* a0 */ 0xe8bd84, 0xe88da8, 0xe88c9b, 0xe88da9,
+ /* a4 */ 0xe88dac, 0xe88daa, 0xe88dad, 0xe88dae,
+ /* a8 */ 0xe88eb0, 0xe88db8, 0xe88eb3, 0xe88eb4,
+ /* ac */ 0xe88ea0, 0xe88eaa, 0xe88e93, 0xe88e9c,
+ /* b0 */ 0xe88e85, 0xe88dbc, 0xe88eb6, 0xe88ea9,
+ /* b4 */ 0xe88dbd, 0xe88eb8, 0xe88dbb, 0xe88e98,
+ /* b8 */ 0xe88e9e, 0xe88ea8, 0xe88eba, 0xe88ebc,
+ /* bc */ 0xe88f81, 0xe89081, 0xe88fa5, 0xe88f98,
+ /* c0 */ 0xe5a087, 0xe89098, 0xe8908b, 0xe88f9d,
+ /* c4 */ 0xe88fbd, 0xe88f96, 0xe8909c, 0xe890b8,
+ /* c8 */ 0xe89091, 0xe89086, 0xe88f94, 0xe88f9f,
+ /* cc */ 0xe8908f, 0xe89083, 0xe88fb8, 0xe88fb9,
+ /* d0 */ 0xe88faa, 0xe88f85, 0xe88f80, 0xe890a6,
+ /* d4 */ 0xe88fb0, 0xe88fa1, 0xe8919c, 0xe89191,
+ /* d8 */ 0xe8919a, 0xe89199, 0xe891b3, 0xe89287,
+ /* dc */ 0xe89288, 0xe891ba, 0xe89289, 0xe891b8,
+ /* e0 */ 0xe890bc, 0xe89186, 0xe891a9, 0xe891b6,
+ /* e4 */ 0xe8928c, 0xe8928e, 0xe890b1, 0xe891ad,
+ /* e8 */ 0xe89381, 0xe8938d, 0xe89390, 0xe893a6,
+ /* ec */ 0xe892bd, 0xe89393, 0xe8938a, 0xe892bf,
+ /* f0 */ 0xe892ba, 0xe893a0, 0xe892a1, 0xe892b9,
+ /* f4 */ 0xe892b4, 0xe89297, 0xe893a5, 0xe893a3,
+ /* f8 */ 0xe8948c, 0xe7948d, 0xe894b8, 0xe893b0,
+ /* fc */ 0xe894b9, 0xe8949f, 0xe894ba,
+
+ /*** Two byte table, leaf: dexx - offset 0x046a0 ***/
+
+ /* 40 */ 0xe8bd85, 0xe8bd86, 0xe8bd87, 0xe8bd88,
+ /* 44 */ 0xe8bd89, 0xe8bd8a, 0xe8bd8b, 0xe8bd8c,
+ /* 48 */ 0xe8bd8d, 0xe8bd8e, 0xe8bd8f, 0xe8bd90,
+ /* 4c */ 0xe8bd91, 0xe8bd92, 0xe8bd93, 0xe8bd94,
+ /* 50 */ 0xe8bd95, 0xe8bd96, 0xe8bd97, 0xe8bd98,
+ /* 54 */ 0xe8bd99, 0xe8bd9a, 0xe8bd9b, 0xe8bd9c,
+ /* 58 */ 0xe8bd9d, 0xe8bd9e, 0xe8bd9f, 0xe8bda0,
+ /* 5c */ 0xe8bda1, 0xe8bda2, 0xe8bda3, 0xe8bda4,
+ /* 60 */ 0xe8bda5, 0xe8bdaa, 0xe8be80, 0xe8be8c,
+ /* 64 */ 0xe8be92, 0xe8be9d, 0xe8bea0, 0xe8bea1,
+ /* 68 */ 0xe8bea2, 0xe8bea4, 0xe8bea5, 0xe8bea6,
+ /* 6c */ 0xe8bea7, 0xe8beaa, 0xe8beac, 0xe8bead,
+ /* 70 */ 0xe8beae, 0xe8beaf, 0xe8beb2, 0xe8beb3,
+ /* 74 */ 0xe8beb4, 0xe8beb5, 0xe8beb7, 0xe8beb8,
+ /* 78 */ 0xe8beba, 0xe8bebb, 0xe8bebc, 0xe8bebf,
+ /* 7c */ 0xe8bf80, 0xe8bf83, 0xe8bf86, 0x000000,
+ /* 80 */ 0xe8bf89, 0xe8bf8a, 0xe8bf8b, 0xe8bf8c,
+ /* 84 */ 0xe8bf8d, 0xe8bf8f, 0xe8bf92, 0xe8bf96,
+ /* 88 */ 0xe8bf97, 0xe8bf9a, 0xe8bfa0, 0xe8bfa1,
+ /* 8c */ 0xe8bfa3, 0xe8bfa7, 0xe8bfac, 0xe8bfaf,
+ /* 90 */ 0xe8bfb1, 0xe8bfb2, 0xe8bfb4, 0xe8bfb5,
+ /* 94 */ 0xe8bfb6, 0xe8bfba, 0xe8bfbb, 0xe8bfbc,
+ /* 98 */ 0xe8bfbe, 0xe8bfbf, 0xe98087, 0xe98088,
+ /* 9c */ 0xe9808c, 0xe9808e, 0xe98093, 0xe98095,
+ /* a0 */ 0xe98098, 0xe89596, 0xe894bb, 0xe893bf,
+ /* a4 */ 0xe893bc, 0xe89599, 0xe89588, 0xe895a8,
+ /* a8 */ 0xe895a4, 0xe8959e, 0xe895ba, 0xe79ea2,
+ /* ac */ 0xe89583, 0xe895b2, 0xe895bb, 0xe896a4,
+ /* b0 */ 0xe896a8, 0xe89687, 0xe8968f, 0xe895b9,
+ /* b4 */ 0xe896ae, 0xe8969c, 0xe89685, 0xe896b9,
+ /* b8 */ 0xe896b7, 0xe896b0, 0xe89793, 0xe89781,
+ /* bc */ 0xe8979c, 0xe897bf, 0xe898a7, 0xe89885,
+ /* c0 */ 0xe898a9, 0xe89896, 0xe898bc, 0xe5bbbe,
+ /* c4 */ 0xe5bc88, 0xe5a4bc, 0xe5a581, 0xe880b7,
+ /* c8 */ 0xe5a595, 0xe5a59a, 0xe5a598, 0xe58c8f,
+ /* cc */ 0xe5b0a2, 0xe5b0a5, 0xe5b0ac, 0xe5b0b4,
+ /* d0 */ 0xe6898c, 0xe689aa, 0xe68a9f, 0xe68abb,
+ /* d4 */ 0xe68b8a, 0xe68b9a, 0xe68b97, 0xe68bae,
+ /* d8 */ 0xe68ca2, 0xe68bb6, 0xe68cb9, 0xe68d8b,
+ /* dc */ 0xe68d83, 0xe68ead, 0xe68fb6, 0xe68db1,
+ /* e0 */ 0xe68dba, 0xe68e8e, 0xe68eb4, 0xe68dad,
+ /* e4 */ 0xe68eac, 0xe68e8a, 0xe68da9, 0xe68eae,
+ /* e8 */ 0xe68ebc, 0xe68fb2, 0xe68fb8, 0xe68fa0,
+ /* ec */ 0xe68fbf, 0xe68f84, 0xe68f9e, 0xe68f8e,
+ /* f0 */ 0xe69192, 0xe68f86, 0xe68ebe, 0xe69185,
+ /* f4 */ 0xe69181, 0xe6908b, 0xe6909b, 0xe690a0,
+ /* f8 */ 0xe6908c, 0xe690a6, 0xe690a1, 0xe6919e,
+ /* fc */ 0xe69284, 0xe691ad, 0xe69296,
+
+ /*** Two byte table, leaf: dfxx - offset 0x0475f ***/
+
+ /* 40 */ 0xe98099, 0xe9809c, 0xe980a3, 0xe980a4,
+ /* 44 */ 0xe980a5, 0xe980a7, 0xe980a8, 0xe980a9,
+ /* 48 */ 0xe980aa, 0xe980ab, 0xe980ac, 0xe980b0,
+ /* 4c */ 0xe980b1, 0xe980b2, 0xe980b3, 0xe980b4,
+ /* 50 */ 0xe980b7, 0xe980b9, 0xe980ba, 0xe980bd,
+ /* 54 */ 0xe980bf, 0xe98180, 0xe98183, 0xe98185,
+ /* 58 */ 0xe98186, 0xe98188, 0xe98189, 0xe9818a,
+ /* 5c */ 0xe9818b, 0xe9818c, 0xe9818e, 0xe98194,
+ /* 60 */ 0xe98195, 0xe98196, 0xe98199, 0xe9819a,
+ /* 64 */ 0xe9819c, 0xe9819d, 0xe9819e, 0xe9819f,
+ /* 68 */ 0xe981a0, 0xe981a1, 0xe981a4, 0xe981a6,
+ /* 6c */ 0xe981a7, 0xe981a9, 0xe981aa, 0xe981ab,
+ /* 70 */ 0xe981ac, 0xe981af, 0xe981b0, 0xe981b1,
+ /* 74 */ 0xe981b2, 0xe981b3, 0xe981b6, 0xe981b7,
+ /* 78 */ 0xe981b8, 0xe981b9, 0xe981ba, 0xe981bb,
+ /* 7c */ 0xe981bc, 0xe981be, 0xe98281, 0x000000,
+ /* 80 */ 0xe98284, 0xe98285, 0xe98286, 0xe98287,
+ /* 84 */ 0xe98289, 0xe9828a, 0xe9828c, 0xe9828d,
+ /* 88 */ 0xe9828e, 0xe9828f, 0xe98290, 0xe98292,
+ /* 8c */ 0xe98294, 0xe98296, 0xe98298, 0xe9829a,
+ /* 90 */ 0xe9829c, 0xe9829e, 0xe9829f, 0xe982a0,
+ /* 94 */ 0xe982a4, 0xe982a5, 0xe982a7, 0xe982a8,
+ /* 98 */ 0xe982a9, 0xe982ab, 0xe982ad, 0xe982b2,
+ /* 9c */ 0xe982b7, 0xe982bc, 0xe982bd, 0xe982bf,
+ /* a0 */ 0xe98380, 0xe691ba, 0xe692b7, 0xe692b8,
+ /* a4 */ 0xe69299, 0xe692ba, 0xe69380, 0xe69390,
+ /* a8 */ 0xe69397, 0xe693a4, 0xe693a2, 0xe69489,
+ /* ac */ 0xe694a5, 0xe694ae, 0xe5bc8b, 0xe5bf92,
+ /* b0 */ 0xe79499, 0xe5bc91, 0xe58d9f, 0xe58fb1,
+ /* b4 */ 0xe58fbd, 0xe58fa9, 0xe58fa8, 0xe58fbb,
+ /* b8 */ 0xe59092, 0xe59096, 0xe59086, 0xe5918b,
+ /* bc */ 0xe59192, 0xe59193, 0xe59194, 0xe59196,
+ /* c0 */ 0xe59183, 0xe590a1, 0xe59197, 0xe59199,
+ /* c4 */ 0xe590a3, 0xe590b2, 0xe59282, 0xe59294,
+ /* c8 */ 0xe591b7, 0xe591b1, 0xe591a4, 0xe5929a,
+ /* cc */ 0xe5929b, 0xe59284, 0xe591b6, 0xe591a6,
+ /* d0 */ 0xe5929d, 0xe59390, 0xe592ad, 0xe59382,
+ /* d4 */ 0xe592b4, 0xe59392, 0xe592a7, 0xe592a6,
+ /* d8 */ 0xe59393, 0xe59394, 0xe591b2, 0xe592a3,
+ /* dc */ 0xe59395, 0xe592bb, 0xe592bf, 0xe5938c,
+ /* e0 */ 0xe59399, 0xe5939a, 0xe5939c, 0xe592a9,
+ /* e4 */ 0xe592aa, 0xe592a4, 0xe5939d, 0xe5938f,
+ /* e8 */ 0xe5939e, 0xe5949b, 0xe593a7, 0xe594a0,
+ /* ec */ 0xe593bd, 0xe59494, 0xe593b3, 0xe594a2,
+ /* f0 */ 0xe594a3, 0xe5948f, 0xe59491, 0xe594a7,
+ /* f4 */ 0xe594aa, 0xe595a7, 0xe5968f, 0xe596b5,
+ /* f8 */ 0xe59589, 0xe595ad, 0xe59581, 0xe59595,
+ /* fc */ 0xe594bf, 0xe59590, 0xe594bc,
+
+ /*** Two byte table, leaf: e0xx - offset 0x0481e ***/
+
+ /* 40 */ 0xe98382, 0xe98383, 0xe98386, 0xe98388,
+ /* 44 */ 0xe98389, 0xe9838b, 0xe9838c, 0xe9838d,
+ /* 48 */ 0xe98392, 0xe98394, 0xe98395, 0xe98396,
+ /* 4c */ 0xe98398, 0xe98399, 0xe9839a, 0xe9839e,
+ /* 50 */ 0xe9839f, 0xe983a0, 0xe983a3, 0xe983a4,
+ /* 54 */ 0xe983a5, 0xe983a9, 0xe983aa, 0xe983ac,
+ /* 58 */ 0xe983ae, 0xe983b0, 0xe983b1, 0xe983b2,
+ /* 5c */ 0xe983b3, 0xe983b5, 0xe983b6, 0xe983b7,
+ /* 60 */ 0xe983b9, 0xe983ba, 0xe983bb, 0xe983bc,
+ /* 64 */ 0xe983bf, 0xe98480, 0xe98481, 0xe98483,
+ /* 68 */ 0xe98485, 0xe98486, 0xe98487, 0xe98488,
+ /* 6c */ 0xe98489, 0xe9848a, 0xe9848b, 0xe9848c,
+ /* 70 */ 0xe9848d, 0xe9848e, 0xe9848f, 0xe98490,
+ /* 74 */ 0xe98491, 0xe98492, 0xe98493, 0xe98494,
+ /* 78 */ 0xe98495, 0xe98496, 0xe98497, 0xe98498,
+ /* 7c */ 0xe9849a, 0xe9849b, 0xe9849c, 0x000000,
+ /* 80 */ 0xe9849d, 0xe9849f, 0xe984a0, 0xe984a1,
+ /* 84 */ 0xe984a4, 0xe984a5, 0xe984a6, 0xe984a7,
+ /* 88 */ 0xe984a8, 0xe984a9, 0xe984aa, 0xe984ab,
+ /* 8c */ 0xe984ac, 0xe984ad, 0xe984ae, 0xe984b0,
+ /* 90 */ 0xe984b2, 0xe984b3, 0xe984b4, 0xe984b5,
+ /* 94 */ 0xe984b6, 0xe984b7, 0xe984b8, 0xe984ba,
+ /* 98 */ 0xe984bb, 0xe984bc, 0xe984bd, 0xe984be,
+ /* 9c */ 0xe984bf, 0xe98580, 0xe98581, 0xe98582,
+ /* a0 */ 0xe98584, 0xe594b7, 0xe59596, 0xe595b5,
+ /* a4 */ 0xe595b6, 0xe595b7, 0xe594b3, 0xe594b0,
+ /* a8 */ 0xe5959c, 0xe5968b, 0xe59792, 0xe59683,
+ /* ac */ 0xe596b1, 0xe596b9, 0xe59688, 0xe59681,
+ /* b0 */ 0xe5969f, 0xe595be, 0xe59796, 0xe59691,
+ /* b4 */ 0xe595bb, 0xe5979f, 0xe596bd, 0xe596be,
+ /* b8 */ 0xe59694, 0xe59699, 0xe597aa, 0xe597b7,
+ /* bc */ 0xe59789, 0xe5989f, 0xe59791, 0xe597ab,
+ /* c0 */ 0xe597ac, 0xe59794, 0xe597a6, 0xe5979d,
+ /* c4 */ 0xe59784, 0xe597af, 0xe597a5, 0xe597b2,
+ /* c8 */ 0xe597b3, 0xe5978c, 0xe5978d, 0xe597a8,
+ /* cc */ 0xe597b5, 0xe597a4, 0xe8be94, 0xe5989e,
+ /* d0 */ 0xe59888, 0xe5988c, 0xe59881, 0xe598a4,
+ /* d4 */ 0xe598a3, 0xe597be, 0xe59880, 0xe598a7,
+ /* d8 */ 0xe598ad, 0xe59998, 0xe598b9, 0xe59997,
+ /* dc */ 0xe598ac, 0xe5998d, 0xe599a2, 0xe59999,
+ /* e0 */ 0xe5999c, 0xe5998c, 0xe59994, 0xe59a86,
+ /* e4 */ 0xe599a4, 0xe599b1, 0xe599ab, 0xe599bb,
+ /* e8 */ 0xe599bc, 0xe59a85, 0xe59a93, 0xe59aaf,
+ /* ec */ 0xe59b94, 0xe59b97, 0xe59b9d, 0xe59ba1,
+ /* f0 */ 0xe59bb5, 0xe59bab, 0xe59bb9, 0xe59bbf,
+ /* f4 */ 0xe59c84, 0xe59c8a, 0xe59c89, 0xe59c9c,
+ /* f8 */ 0xe5b88f, 0xe5b899, 0xe5b894, 0xe5b891,
+ /* fc */ 0xe5b8b1, 0xe5b8bb, 0xe5b8bc,
+
+ /*** Two byte table, leaf: e1xx - offset 0x048dd ***/
+
+ /* 40 */ 0xe98585, 0xe98587, 0xe98588, 0xe98591,
+ /* 44 */ 0xe98593, 0xe98594, 0xe98595, 0xe98596,
+ /* 48 */ 0xe98598, 0xe98599, 0xe9859b, 0xe9859c,
+ /* 4c */ 0xe9859f, 0xe985a0, 0xe985a6, 0xe985a7,
+ /* 50 */ 0xe985a8, 0xe985ab, 0xe985ad, 0xe985b3,
+ /* 54 */ 0xe985ba, 0xe985bb, 0xe985bc, 0xe98680,
+ /* 58 */ 0xe98681, 0xe98682, 0xe98683, 0xe98684,
+ /* 5c */ 0xe98686, 0xe98688, 0xe9868a, 0xe9868e,
+ /* 60 */ 0xe9868f, 0xe98693, 0xe98694, 0xe98695,
+ /* 64 */ 0xe98696, 0xe98697, 0xe98698, 0xe98699,
+ /* 68 */ 0xe9869c, 0xe9869d, 0xe9869e, 0xe9869f,
+ /* 6c */ 0xe986a0, 0xe986a1, 0xe986a4, 0xe986a5,
+ /* 70 */ 0xe986a6, 0xe986a7, 0xe986a8, 0xe986a9,
+ /* 74 */ 0xe986ab, 0xe986ac, 0xe986b0, 0xe986b1,
+ /* 78 */ 0xe986b2, 0xe986b3, 0xe986b6, 0xe986b7,
+ /* 7c */ 0xe986b8, 0xe986b9, 0xe986bb, 0x000000,
+ /* 80 */ 0xe986bc, 0xe986bd, 0xe986be, 0xe986bf,
+ /* 84 */ 0xe98780, 0xe98781, 0xe98782, 0xe98783,
+ /* 88 */ 0xe98784, 0xe98785, 0xe98786, 0xe98788,
+ /* 8c */ 0xe9878b, 0xe98790, 0xe98792, 0xe98793,
+ /* 90 */ 0xe98794, 0xe98795, 0xe98796, 0xe98797,
+ /* 94 */ 0xe98798, 0xe98799, 0xe9879a, 0xe9879b,
+ /* 98 */ 0xe9879d, 0xe9879e, 0xe9879f, 0xe987a0,
+ /* 9c */ 0xe987a1, 0xe987a2, 0xe987a3, 0xe987a4,
+ /* a0 */ 0xe987a5, 0xe5b8b7, 0xe5b984, 0xe5b994,
+ /* a4 */ 0xe5b99b, 0xe5b99e, 0xe5b9a1, 0xe5b28c,
+ /* a8 */ 0xe5b1ba, 0xe5b28d, 0xe5b290, 0xe5b296,
+ /* ac */ 0xe5b288, 0xe5b298, 0xe5b299, 0xe5b291,
+ /* b0 */ 0xe5b29a, 0xe5b29c, 0xe5b2b5, 0xe5b2a2,
+ /* b4 */ 0xe5b2bd, 0xe5b2ac, 0xe5b2ab, 0xe5b2b1,
+ /* b8 */ 0xe5b2a3, 0xe5b381, 0xe5b2b7, 0xe5b384,
+ /* bc */ 0xe5b392, 0xe5b3a4, 0xe5b38b, 0xe5b3a5,
+ /* c0 */ 0xe5b482, 0xe5b483, 0xe5b4a7, 0xe5b4a6,
+ /* c4 */ 0xe5b4ae, 0xe5b4a4, 0xe5b49e, 0xe5b486,
+ /* c8 */ 0xe5b49b, 0xe5b598, 0xe5b4be, 0xe5b4b4,
+ /* cc */ 0xe5b4bd, 0xe5b5ac, 0xe5b59b, 0xe5b5af,
+ /* d0 */ 0xe5b59d, 0xe5b5ab, 0xe5b58b, 0xe5b58a,
+ /* d4 */ 0xe5b5a9, 0xe5b5b4, 0xe5b682, 0xe5b699,
+ /* d8 */ 0xe5b69d, 0xe8b1b3, 0xe5b6b7, 0xe5b785,
+ /* dc */ 0xe5bdb3, 0xe5bdb7, 0xe5be82, 0xe5be87,
+ /* e0 */ 0xe5be89, 0xe5be8c, 0xe5be95, 0xe5be99,
+ /* e4 */ 0xe5be9c, 0xe5bea8, 0xe5bead, 0xe5beb5,
+ /* e8 */ 0xe5bebc, 0xe8a1a2, 0xe5bda1, 0xe78aad,
+ /* ec */ 0xe78ab0, 0xe78ab4, 0xe78ab7, 0xe78ab8,
+ /* f0 */ 0xe78b83, 0xe78b81, 0xe78b8e, 0xe78b8d,
+ /* f4 */ 0xe78b92, 0xe78ba8, 0xe78baf, 0xe78ba9,
+ /* f8 */ 0xe78bb2, 0xe78bb4, 0xe78bb7, 0xe78c81,
+ /* fc */ 0xe78bb3, 0xe78c83, 0xe78bba,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0499c ***/
+
+ /* 40 */ 0xe987a6, 0xe987a7, 0xe987a8, 0xe987a9,
+ /* 44 */ 0xe987aa, 0xe987ab, 0xe987ac, 0xe987ad,
+ /* 48 */ 0xe987ae, 0xe987af, 0xe987b0, 0xe987b1,
+ /* 4c */ 0xe987b2, 0xe987b3, 0xe987b4, 0xe987b5,
+ /* 50 */ 0xe987b6, 0xe987b7, 0xe987b8, 0xe987b9,
+ /* 54 */ 0xe987ba, 0xe987bb, 0xe987bc, 0xe987bd,
+ /* 58 */ 0xe987be, 0xe987bf, 0xe98880, 0xe98881,
+ /* 5c */ 0xe98882, 0xe98883, 0xe98884, 0xe98885,
+ /* 60 */ 0xe98886, 0xe98887, 0xe98888, 0xe98889,
+ /* 64 */ 0xe9888a, 0xe9888b, 0xe9888c, 0xe9888d,
+ /* 68 */ 0xe9888e, 0xe9888f, 0xe98890, 0xe98891,
+ /* 6c */ 0xe98892, 0xe98893, 0xe98894, 0xe98895,
+ /* 70 */ 0xe98896, 0xe98897, 0xe98898, 0xe98899,
+ /* 74 */ 0xe9889a, 0xe9889b, 0xe9889c, 0xe9889d,
+ /* 78 */ 0xe9889e, 0xe9889f, 0xe988a0, 0xe988a1,
+ /* 7c */ 0xe988a2, 0xe988a3, 0xe988a4, 0x000000,
+ /* 80 */ 0xe988a5, 0xe988a6, 0xe988a7, 0xe988a8,
+ /* 84 */ 0xe988a9, 0xe988aa, 0xe988ab, 0xe988ac,
+ /* 88 */ 0xe988ad, 0xe988ae, 0xe988af, 0xe988b0,
+ /* 8c */ 0xe988b1, 0xe988b2, 0xe988b3, 0xe988b4,
+ /* 90 */ 0xe988b5, 0xe988b6, 0xe988b7, 0xe988b8,
+ /* 94 */ 0xe988b9, 0xe988ba, 0xe988bb, 0xe988bc,
+ /* 98 */ 0xe988bd, 0xe988be, 0xe988bf, 0xe98980,
+ /* 9c */ 0xe98981, 0xe98982, 0xe98983, 0xe98984,
+ /* a0 */ 0xe98985, 0xe78bbb, 0xe78c97, 0xe78c93,
+ /* a4 */ 0xe78ca1, 0xe78c8a, 0xe78c9e, 0xe78c9d,
+ /* a8 */ 0xe78c95, 0xe78ca2, 0xe78cb9, 0xe78ca5,
+ /* ac */ 0xe78cac, 0xe78cb8, 0xe78cb1, 0xe78d90,
+ /* b0 */ 0xe78d8d, 0xe78d97, 0xe78da0, 0xe78dac,
+ /* b4 */ 0xe78daf, 0xe78dbe, 0xe8889b, 0xe5a4a5,
+ /* b8 */ 0xe9a3a7, 0xe5a4a4, 0xe5a482, 0xe9a5a3,
+ /* bc */ 0xe9a5a7, 0xe9a5a8, 0xe9a5a9, 0xe9a5aa,
+ /* c0 */ 0xe9a5ab, 0xe9a5ac, 0xe9a5b4, 0xe9a5b7,
+ /* c4 */ 0xe9a5bd, 0xe9a680, 0xe9a684, 0xe9a687,
+ /* c8 */ 0xe9a68a, 0xe9a68d, 0xe9a690, 0xe9a691,
+ /* cc */ 0xe9a693, 0xe9a694, 0xe9a695, 0xe5ba80,
+ /* d0 */ 0xe5ba91, 0xe5ba8b, 0xe5ba96, 0xe5baa5,
+ /* d4 */ 0xe5baa0, 0xe5bab9, 0xe5bab5, 0xe5babe,
+ /* d8 */ 0xe5bab3, 0xe8b593, 0xe5bb92, 0xe5bb91,
+ /* dc */ 0xe5bb9b, 0xe5bba8, 0xe5bbaa, 0xe886ba,
+ /* e0 */ 0xe5bf84, 0xe5bf89, 0xe5bf96, 0xe5bf8f,
+ /* e4 */ 0xe68083, 0xe5bfae, 0xe68084, 0xe5bfa1,
+ /* e8 */ 0xe5bfa4, 0xe5bfbe, 0xe68085, 0xe68086,
+ /* ec */ 0xe5bfaa, 0xe5bfad, 0xe5bfb8, 0xe68099,
+ /* f0 */ 0xe680b5, 0xe680a6, 0xe6809b, 0xe6808f,
+ /* f4 */ 0xe6808d, 0xe680a9, 0xe680ab, 0xe6808a,
+ /* f8 */ 0xe680bf, 0xe680a1, 0xe681b8, 0xe681b9,
+ /* fc */ 0xe681bb, 0xe681ba, 0xe68182,
+
+ /*** Two byte table, leaf: e3xx - offset 0x04a5b ***/
+
+ /* 40 */ 0xe98986, 0xe98987, 0xe98988, 0xe98989,
+ /* 44 */ 0xe9898a, 0xe9898b, 0xe9898c, 0xe9898d,
+ /* 48 */ 0xe9898e, 0xe9898f, 0xe98990, 0xe98991,
+ /* 4c */ 0xe98992, 0xe98993, 0xe98994, 0xe98995,
+ /* 50 */ 0xe98996, 0xe98997, 0xe98998, 0xe98999,
+ /* 54 */ 0xe9899a, 0xe9899b, 0xe9899c, 0xe9899d,
+ /* 58 */ 0xe9899e, 0xe9899f, 0xe989a0, 0xe989a1,
+ /* 5c */ 0xe989a2, 0xe989a3, 0xe989a4, 0xe989a5,
+ /* 60 */ 0xe989a6, 0xe989a7, 0xe989a8, 0xe989a9,
+ /* 64 */ 0xe989aa, 0xe989ab, 0xe989ac, 0xe989ad,
+ /* 68 */ 0xe989ae, 0xe989af, 0xe989b0, 0xe989b1,
+ /* 6c */ 0xe989b2, 0xe989b3, 0xe989b5, 0xe989b6,
+ /* 70 */ 0xe989b7, 0xe989b8, 0xe989b9, 0xe989ba,
+ /* 74 */ 0xe989bb, 0xe989bc, 0xe989bd, 0xe989be,
+ /* 78 */ 0xe989bf, 0xe98a80, 0xe98a81, 0xe98a82,
+ /* 7c */ 0xe98a83, 0xe98a84, 0xe98a85, 0x000000,
+ /* 80 */ 0xe98a86, 0xe98a87, 0xe98a88, 0xe98a89,
+ /* 84 */ 0xe98a8a, 0xe98a8b, 0xe98a8c, 0xe98a8d,
+ /* 88 */ 0xe98a8f, 0xe98a90, 0xe98a91, 0xe98a92,
+ /* 8c */ 0xe98a93, 0xe98a94, 0xe98a95, 0xe98a96,
+ /* 90 */ 0xe98a97, 0xe98a98, 0xe98a99, 0xe98a9a,
+ /* 94 */ 0xe98a9b, 0xe98a9c, 0xe98a9d, 0xe98a9e,
+ /* 98 */ 0xe98a9f, 0xe98aa0, 0xe98aa1, 0xe98aa2,
+ /* 9c */ 0xe98aa3, 0xe98aa4, 0xe98aa5, 0xe98aa6,
+ /* a0 */ 0xe98aa7, 0xe681aa, 0xe681bd, 0xe68296,
+ /* a4 */ 0xe6829a, 0xe682ad, 0xe6829d, 0xe68283,
+ /* a8 */ 0xe68292, 0xe6828c, 0xe6829b, 0xe683ac,
+ /* ac */ 0xe682bb, 0xe682b1, 0xe6839d, 0xe68398,
+ /* b0 */ 0xe68386, 0xe6839a, 0xe682b4, 0xe684a0,
+ /* b4 */ 0xe684a6, 0xe68495, 0xe684a3, 0xe683b4,
+ /* b8 */ 0xe68480, 0xe6848e, 0xe684ab, 0xe6858a,
+ /* bc */ 0xe685b5, 0xe686ac, 0xe68694, 0xe686a7,
+ /* c0 */ 0xe686b7, 0xe68794, 0xe687b5, 0xe5bf9d,
+ /* c4 */ 0xe99ab3, 0xe997a9, 0xe997ab, 0xe997b1,
+ /* c8 */ 0xe997b3, 0xe997b5, 0xe997b6, 0xe997bc,
+ /* cc */ 0xe997be, 0xe99883, 0xe99884, 0xe99886,
+ /* d0 */ 0xe99888, 0xe9988a, 0xe9988b, 0xe9988c,
+ /* d4 */ 0xe9988d, 0xe9988f, 0xe99892, 0xe99895,
+ /* d8 */ 0xe99896, 0xe99897, 0xe99899, 0xe9989a,
+ /* dc */ 0xe4b8ac, 0xe788bf, 0xe68895, 0xe6b0b5,
+ /* e0 */ 0xe6b194, 0xe6b19c, 0xe6b18a, 0xe6b2a3,
+ /* e4 */ 0xe6b285, 0xe6b290, 0xe6b294, 0xe6b28c,
+ /* e8 */ 0xe6b1a8, 0xe6b1a9, 0xe6b1b4, 0xe6b1b6,
+ /* ec */ 0xe6b286, 0xe6b2a9, 0xe6b390, 0xe6b394,
+ /* f0 */ 0xe6b2ad, 0xe6b3b7, 0xe6b3b8, 0xe6b3b1,
+ /* f4 */ 0xe6b397, 0xe6b2b2, 0xe6b3a0, 0xe6b396,
+ /* f8 */ 0xe6b3ba, 0xe6b3ab, 0xe6b3ae, 0xe6b2b1,
+ /* fc */ 0xe6b393, 0xe6b3af, 0xe6b3be,
+
+ /*** Two byte table, leaf: e4xx - offset 0x04b1a ***/
+
+ /* 40 */ 0xe98aa8, 0xe98aa9, 0xe98aaa, 0xe98aab,
+ /* 44 */ 0xe98aac, 0xe98aad, 0xe98aaf, 0xe98ab0,
+ /* 48 */ 0xe98ab1, 0xe98ab2, 0xe98ab3, 0xe98ab4,
+ /* 4c */ 0xe98ab5, 0xe98ab6, 0xe98ab7, 0xe98ab8,
+ /* 50 */ 0xe98ab9, 0xe98aba, 0xe98abb, 0xe98abc,
+ /* 54 */ 0xe98abd, 0xe98abe, 0xe98abf, 0xe98b80,
+ /* 58 */ 0xe98b81, 0xe98b82, 0xe98b83, 0xe98b84,
+ /* 5c */ 0xe98b85, 0xe98b86, 0xe98b87, 0xe98b89,
+ /* 60 */ 0xe98b8a, 0xe98b8b, 0xe98b8c, 0xe98b8d,
+ /* 64 */ 0xe98b8e, 0xe98b8f, 0xe98b90, 0xe98b91,
+ /* 68 */ 0xe98b92, 0xe98b93, 0xe98b94, 0xe98b95,
+ /* 6c */ 0xe98b96, 0xe98b97, 0xe98b98, 0xe98b99,
+ /* 70 */ 0xe98b9a, 0xe98b9b, 0xe98b9c, 0xe98b9d,
+ /* 74 */ 0xe98b9e, 0xe98b9f, 0xe98ba0, 0xe98ba1,
+ /* 78 */ 0xe98ba2, 0xe98ba3, 0xe98ba4, 0xe98ba5,
+ /* 7c */ 0xe98ba6, 0xe98ba7, 0xe98ba8, 0x000000,
+ /* 80 */ 0xe98ba9, 0xe98baa, 0xe98bab, 0xe98bac,
+ /* 84 */ 0xe98bad, 0xe98bae, 0xe98baf, 0xe98bb0,
+ /* 88 */ 0xe98bb1, 0xe98bb2, 0xe98bb3, 0xe98bb4,
+ /* 8c */ 0xe98bb5, 0xe98bb6, 0xe98bb7, 0xe98bb8,
+ /* 90 */ 0xe98bb9, 0xe98bba, 0xe98bbb, 0xe98bbc,
+ /* 94 */ 0xe98bbd, 0xe98bbe, 0xe98bbf, 0xe98c80,
+ /* 98 */ 0xe98c81, 0xe98c82, 0xe98c83, 0xe98c84,
+ /* 9c */ 0xe98c85, 0xe98c86, 0xe98c87, 0xe98c88,
+ /* a0 */ 0xe98c89, 0xe6b4b9, 0xe6b4a7, 0xe6b48c,
+ /* a4 */ 0xe6b583, 0xe6b588, 0xe6b487, 0xe6b484,
+ /* a8 */ 0xe6b499, 0xe6b48e, 0xe6b4ab, 0xe6b58d,
+ /* ac */ 0xe6b4ae, 0xe6b4b5, 0xe6b49a, 0xe6b58f,
+ /* b0 */ 0xe6b592, 0xe6b594, 0xe6b4b3, 0xe6b691,
+ /* b4 */ 0xe6b5af, 0xe6b69e, 0xe6b6a0, 0xe6b59e,
+ /* b8 */ 0xe6b693, 0xe6b694, 0xe6b59c, 0xe6b5a0,
+ /* bc */ 0xe6b5bc, 0xe6b5a3, 0xe6b89a, 0xe6b787,
+ /* c0 */ 0xe6b785, 0xe6b79e, 0xe6b88e, 0xe6b6bf,
+ /* c4 */ 0xe6b7a0, 0xe6b891, 0xe6b7a6, 0xe6b79d,
+ /* c8 */ 0xe6b799, 0xe6b896, 0xe6b6ab, 0xe6b88c,
+ /* cc */ 0xe6b6ae, 0xe6b8ab, 0xe6b9ae, 0xe6b98e,
+ /* d0 */ 0xe6b9ab, 0xe6bab2, 0xe6b99f, 0xe6ba86,
+ /* d4 */ 0xe6b993, 0xe6b994, 0xe6b8b2, 0xe6b8a5,
+ /* d8 */ 0xe6b984, 0xe6bb9f, 0xe6bab1, 0xe6ba98,
+ /* dc */ 0xe6bba0, 0xe6bcad, 0xe6bba2, 0xe6baa5,
+ /* e0 */ 0xe6baa7, 0xe6babd, 0xe6babb, 0xe6bab7,
+ /* e4 */ 0xe6bb97, 0xe6bab4, 0xe6bb8f, 0xe6ba8f,
+ /* e8 */ 0xe6bb82, 0xe6ba9f, 0xe6bda2, 0xe6bd86,
+ /* ec */ 0xe6bd87, 0xe6bca4, 0xe6bc95, 0xe6bbb9,
+ /* f0 */ 0xe6bcaf, 0xe6bcb6, 0xe6bd8b, 0xe6bdb4,
+ /* f4 */ 0xe6bcaa, 0xe6bc89, 0xe6bca9, 0xe6be89,
+ /* f8 */ 0xe6be8d, 0xe6be8c, 0xe6bdb8, 0xe6bdb2,
+ /* fc */ 0xe6bdbc, 0xe6bdba, 0xe6bf91,
+
+ /*** Two byte table, leaf: e5xx - offset 0x04bd9 ***/
+
+ /* 40 */ 0xe98c8a, 0xe98c8b, 0xe98c8c, 0xe98c8d,
+ /* 44 */ 0xe98c8e, 0xe98c8f, 0xe98c90, 0xe98c91,
+ /* 48 */ 0xe98c92, 0xe98c93, 0xe98c94, 0xe98c95,
+ /* 4c */ 0xe98c96, 0xe98c97, 0xe98c98, 0xe98c99,
+ /* 50 */ 0xe98c9a, 0xe98c9b, 0xe98c9c, 0xe98c9d,
+ /* 54 */ 0xe98c9e, 0xe98c9f, 0xe98ca0, 0xe98ca1,
+ /* 58 */ 0xe98ca2, 0xe98ca3, 0xe98ca4, 0xe98ca5,
+ /* 5c */ 0xe98ca6, 0xe98ca7, 0xe98ca8, 0xe98ca9,
+ /* 60 */ 0xe98caa, 0xe98cab, 0xe98cac, 0xe98cad,
+ /* 64 */ 0xe98cae, 0xe98caf, 0xe98cb0, 0xe98cb1,
+ /* 68 */ 0xe98cb2, 0xe98cb3, 0xe98cb4, 0xe98cb5,
+ /* 6c */ 0xe98cb6, 0xe98cb7, 0xe98cb8, 0xe98cb9,
+ /* 70 */ 0xe98cba, 0xe98cbb, 0xe98cbc, 0xe98cbd,
+ /* 74 */ 0xe98cbf, 0xe98d80, 0xe98d81, 0xe98d82,
+ /* 78 */ 0xe98d83, 0xe98d84, 0xe98d85, 0xe98d86,
+ /* 7c */ 0xe98d87, 0xe98d88, 0xe98d89, 0x000000,
+ /* 80 */ 0xe98d8a, 0xe98d8b, 0xe98d8c, 0xe98d8d,
+ /* 84 */ 0xe98d8e, 0xe98d8f, 0xe98d90, 0xe98d91,
+ /* 88 */ 0xe98d92, 0xe98d93, 0xe98d94, 0xe98d95,
+ /* 8c */ 0xe98d96, 0xe98d97, 0xe98d98, 0xe98d99,
+ /* 90 */ 0xe98d9a, 0xe98d9b, 0xe98d9c, 0xe98d9d,
+ /* 94 */ 0xe98d9e, 0xe98d9f, 0xe98da0, 0xe98da1,
+ /* 98 */ 0xe98da2, 0xe98da3, 0xe98da4, 0xe98da5,
+ /* 9c */ 0xe98da6, 0xe98da7, 0xe98da8, 0xe98da9,
+ /* a0 */ 0xe98dab, 0xe6bf89, 0xe6bea7, 0xe6beb9,
+ /* a4 */ 0xe6beb6, 0xe6bf82, 0xe6bfa1, 0xe6bfae,
+ /* a8 */ 0xe6bf9e, 0xe6bfa0, 0xe6bfaf, 0xe7809a,
+ /* ac */ 0xe780a3, 0xe7809b, 0xe780b9, 0xe780b5,
+ /* b0 */ 0xe7818f, 0xe7819e, 0xe5ae80, 0xe5ae84,
+ /* b4 */ 0xe5ae95, 0xe5ae93, 0xe5aea5, 0xe5aeb8,
+ /* b8 */ 0xe794af, 0xe9aa9e, 0xe690b4, 0xe5afa4,
+ /* bc */ 0xe5afae, 0xe8a4b0, 0xe5afb0, 0xe8b987,
+ /* c0 */ 0xe8ac87, 0xe8beb6, 0xe8bf93, 0xe8bf95,
+ /* c4 */ 0xe8bfa5, 0xe8bfae, 0xe8bfa4, 0xe8bfa9,
+ /* c8 */ 0xe8bfa6, 0xe8bfb3, 0xe8bfa8, 0xe98085,
+ /* cc */ 0xe98084, 0xe9808b, 0xe980a6, 0xe98091,
+ /* d0 */ 0xe9808d, 0xe98096, 0xe980a1, 0xe980b5,
+ /* d4 */ 0xe980b6, 0xe980ad, 0xe980af, 0xe98184,
+ /* d8 */ 0xe98191, 0xe98192, 0xe98190, 0xe981a8,
+ /* dc */ 0xe98198, 0xe981a2, 0xe9819b, 0xe69ab9,
+ /* e0 */ 0xe981b4, 0xe981bd, 0xe98282, 0xe98288,
+ /* e4 */ 0xe98283, 0xe9828b, 0xe5bd90, 0xe5bd97,
+ /* e8 */ 0xe5bd96, 0xe5bd98, 0xe5b0bb, 0xe592ab,
+ /* ec */ 0xe5b190, 0xe5b199, 0xe5adb1, 0xe5b1a3,
+ /* f0 */ 0xe5b1a6, 0xe7bebc, 0xe5bcaa, 0xe5bca9,
+ /* f4 */ 0xe5bcad, 0xe889b4, 0xe5bcbc, 0xe9acbb,
+ /* f8 */ 0xe5b1ae, 0xe5a681, 0xe5a683, 0xe5a68d,
+ /* fc */ 0xe5a6a9, 0xe5a6aa, 0xe5a6a3,
+
+ /*** Two byte table, leaf: e6xx - offset 0x04c98 ***/
+
+ /* 40 */ 0xe98dac, 0xe98dad, 0xe98dae, 0xe98daf,
+ /* 44 */ 0xe98db0, 0xe98db1, 0xe98db2, 0xe98db3,
+ /* 48 */ 0xe98db4, 0xe98db5, 0xe98db6, 0xe98db7,
+ /* 4c */ 0xe98db8, 0xe98db9, 0xe98dba, 0xe98dbb,
+ /* 50 */ 0xe98dbc, 0xe98dbd, 0xe98dbe, 0xe98dbf,
+ /* 54 */ 0xe98e80, 0xe98e81, 0xe98e82, 0xe98e83,
+ /* 58 */ 0xe98e84, 0xe98e85, 0xe98e86, 0xe98e87,
+ /* 5c */ 0xe98e88, 0xe98e89, 0xe98e8a, 0xe98e8b,
+ /* 60 */ 0xe98e8c, 0xe98e8d, 0xe98e8e, 0xe98e90,
+ /* 64 */ 0xe98e91, 0xe98e92, 0xe98e93, 0xe98e94,
+ /* 68 */ 0xe98e95, 0xe98e96, 0xe98e97, 0xe98e98,
+ /* 6c */ 0xe98e99, 0xe98e9a, 0xe98e9b, 0xe98e9c,
+ /* 70 */ 0xe98e9d, 0xe98e9e, 0xe98e9f, 0xe98ea0,
+ /* 74 */ 0xe98ea1, 0xe98ea2, 0xe98ea3, 0xe98ea4,
+ /* 78 */ 0xe98ea5, 0xe98ea6, 0xe98ea7, 0xe98ea8,
+ /* 7c */ 0xe98ea9, 0xe98eaa, 0xe98eab, 0x000000,
+ /* 80 */ 0xe98eac, 0xe98ead, 0xe98eae, 0xe98eaf,
+ /* 84 */ 0xe98eb0, 0xe98eb1, 0xe98eb2, 0xe98eb3,
+ /* 88 */ 0xe98eb4, 0xe98eb5, 0xe98eb6, 0xe98eb7,
+ /* 8c */ 0xe98eb8, 0xe98eb9, 0xe98eba, 0xe98ebb,
+ /* 90 */ 0xe98ebc, 0xe98ebd, 0xe98ebe, 0xe98ebf,
+ /* 94 */ 0xe98f80, 0xe98f81, 0xe98f82, 0xe98f83,
+ /* 98 */ 0xe98f84, 0xe98f85, 0xe98f86, 0xe98f87,
+ /* 9c */ 0xe98f88, 0xe98f89, 0xe98f8b, 0xe98f8c,
+ /* a0 */ 0xe98f8d, 0xe5a697, 0xe5a78a, 0xe5a6ab,
+ /* a4 */ 0xe5a69e, 0xe5a6a4, 0xe5a792, 0xe5a6b2,
+ /* a8 */ 0xe5a6af, 0xe5a797, 0xe5a6be, 0xe5a885,
+ /* ac */ 0xe5a886, 0xe5a79d, 0xe5a888, 0xe5a7a3,
+ /* b0 */ 0xe5a798, 0xe5a7b9, 0xe5a88c, 0xe5a889,
+ /* b4 */ 0xe5a8b2, 0xe5a8b4, 0xe5a891, 0xe5a8a3,
+ /* b8 */ 0xe5a893, 0xe5a980, 0xe5a9a7, 0xe5a98a,
+ /* bc */ 0xe5a995, 0xe5a8bc, 0xe5a9a2, 0xe5a9b5,
+ /* c0 */ 0xe883ac, 0xe5aaaa, 0xe5aa9b, 0xe5a9b7,
+ /* c4 */ 0xe5a9ba, 0xe5aabe, 0xe5abab, 0xe5aab2,
+ /* c8 */ 0xe5ab92, 0xe5ab94, 0xe5aab8, 0xe5aba0,
+ /* cc */ 0xe5aba3, 0xe5abb1, 0xe5ab96, 0xe5aba6,
+ /* d0 */ 0xe5ab98, 0xe5ab9c, 0xe5ac89, 0xe5ac97,
+ /* d4 */ 0xe5ac96, 0xe5acb2, 0xe5acb7, 0xe5ad80,
+ /* d8 */ 0xe5b095, 0xe5b09c, 0xe5ad9a, 0xe5ada5,
+ /* dc */ 0xe5adb3, 0xe5ad91, 0xe5ad93, 0xe5ada2,
+ /* e0 */ 0xe9a9b5, 0xe9a9b7, 0xe9a9b8, 0xe9a9ba,
+ /* e4 */ 0xe9a9bf, 0xe9a9bd, 0xe9aa80, 0xe9aa81,
+ /* e8 */ 0xe9aa85, 0xe9aa88, 0xe9aa8a, 0xe9aa90,
+ /* ec */ 0xe9aa92, 0xe9aa93, 0xe9aa96, 0xe9aa98,
+ /* f0 */ 0xe9aa9b, 0xe9aa9c, 0xe9aa9d, 0xe9aa9f,
+ /* f4 */ 0xe9aaa0, 0xe9aaa2, 0xe9aaa3, 0xe9aaa5,
+ /* f8 */ 0xe9aaa7, 0xe7ba9f, 0xe7baa1, 0xe7baa3,
+ /* fc */ 0xe7baa5, 0xe7baa8, 0xe7baa9,
+
+ /*** Two byte table, leaf: e7xx - offset 0x04d57 ***/
+
+ /* 40 */ 0xe98f8e, 0xe98f8f, 0xe98f90, 0xe98f91,
+ /* 44 */ 0xe98f92, 0xe98f93, 0xe98f94, 0xe98f95,
+ /* 48 */ 0xe98f97, 0xe98f98, 0xe98f99, 0xe98f9a,
+ /* 4c */ 0xe98f9b, 0xe98f9c, 0xe98f9d, 0xe98f9e,
+ /* 50 */ 0xe98f9f, 0xe98fa0, 0xe98fa1, 0xe98fa2,
+ /* 54 */ 0xe98fa3, 0xe98fa4, 0xe98fa5, 0xe98fa6,
+ /* 58 */ 0xe98fa7, 0xe98fa8, 0xe98fa9, 0xe98faa,
+ /* 5c */ 0xe98fab, 0xe98fac, 0xe98fad, 0xe98fae,
+ /* 60 */ 0xe98faf, 0xe98fb0, 0xe98fb1, 0xe98fb2,
+ /* 64 */ 0xe98fb3, 0xe98fb4, 0xe98fb5, 0xe98fb6,
+ /* 68 */ 0xe98fb7, 0xe98fb8, 0xe98fb9, 0xe98fba,
+ /* 6c */ 0xe98fbb, 0xe98fbc, 0xe98fbd, 0xe98fbe,
+ /* 70 */ 0xe98fbf, 0xe99080, 0xe99081, 0xe99082,
+ /* 74 */ 0xe99083, 0xe99084, 0xe99085, 0xe99086,
+ /* 78 */ 0xe99087, 0xe99088, 0xe99089, 0xe9908a,
+ /* 7c */ 0xe9908b, 0xe9908c, 0xe9908d, 0x000000,
+ /* 80 */ 0xe9908e, 0xe9908f, 0xe99090, 0xe99091,
+ /* 84 */ 0xe99092, 0xe99093, 0xe99094, 0xe99095,
+ /* 88 */ 0xe99096, 0xe99097, 0xe99098, 0xe99099,
+ /* 8c */ 0xe9909a, 0xe9909b, 0xe9909c, 0xe9909d,
+ /* 90 */ 0xe9909e, 0xe9909f, 0xe990a0, 0xe990a1,
+ /* 94 */ 0xe990a2, 0xe990a3, 0xe990a4, 0xe990a5,
+ /* 98 */ 0xe990a6, 0xe990a7, 0xe990a8, 0xe990a9,
+ /* 9c */ 0xe990aa, 0xe990ab, 0xe990ac, 0xe990ad,
+ /* a0 */ 0xe990ae, 0xe7baad, 0xe7bab0, 0xe7babe,
+ /* a4 */ 0xe7bb80, 0xe7bb81, 0xe7bb82, 0xe7bb89,
+ /* a8 */ 0xe7bb8b, 0xe7bb8c, 0xe7bb90, 0xe7bb94,
+ /* ac */ 0xe7bb97, 0xe7bb9b, 0xe7bba0, 0xe7bba1,
+ /* b0 */ 0xe7bba8, 0xe7bbab, 0xe7bbae, 0xe7bbaf,
+ /* b4 */ 0xe7bbb1, 0xe7bbb2, 0xe7bc8d, 0xe7bbb6,
+ /* b8 */ 0xe7bbba, 0xe7bbbb, 0xe7bbbe, 0xe7bc81,
+ /* bc */ 0xe7bc82, 0xe7bc83, 0xe7bc87, 0xe7bc88,
+ /* c0 */ 0xe7bc8b, 0xe7bc8c, 0xe7bc8f, 0xe7bc91,
+ /* c4 */ 0xe7bc92, 0xe7bc97, 0xe7bc99, 0xe7bc9c,
+ /* c8 */ 0xe7bc9b, 0xe7bc9f, 0xe7bca1, 0xe7bca2,
+ /* cc */ 0xe7bca3, 0xe7bca4, 0xe7bca5, 0xe7bca6,
+ /* d0 */ 0xe7bca7, 0xe7bcaa, 0xe7bcab, 0xe7bcac,
+ /* d4 */ 0xe7bcad, 0xe7bcaf, 0xe7bcb0, 0xe7bcb1,
+ /* d8 */ 0xe7bcb2, 0xe7bcb3, 0xe7bcb5, 0xe5b9ba,
+ /* dc */ 0xe795bf, 0xe5b79b, 0xe794be, 0xe98295,
+ /* e0 */ 0xe78e8e, 0xe78e91, 0xe78eae, 0xe78ea2,
+ /* e4 */ 0xe78e9f, 0xe78f8f, 0xe78f82, 0xe78f91,
+ /* e8 */ 0xe78eb7, 0xe78eb3, 0xe78f80, 0xe78f89,
+ /* ec */ 0xe78f88, 0xe78fa5, 0xe78f99, 0xe9a1bc,
+ /* f0 */ 0xe7908a, 0xe78fa9, 0xe78fa7, 0xe78f9e,
+ /* f4 */ 0xe78eba, 0xe78fb2, 0xe7908f, 0xe790aa,
+ /* f8 */ 0xe7919b, 0xe790a6, 0xe790a5, 0xe790a8,
+ /* fc */ 0xe790b0, 0xe790ae, 0xe790ac,
+
+ /*** Two byte table, leaf: e8xx - offset 0x04e16 ***/
+
+ /* 40 */ 0xe990af, 0xe990b0, 0xe990b1, 0xe990b2,
+ /* 44 */ 0xe990b3, 0xe990b4, 0xe990b5, 0xe990b6,
+ /* 48 */ 0xe990b7, 0xe990b8, 0xe990b9, 0xe990ba,
+ /* 4c */ 0xe990bb, 0xe990bc, 0xe990bd, 0xe990bf,
+ /* 50 */ 0xe99180, 0xe99181, 0xe99182, 0xe99183,
+ /* 54 */ 0xe99184, 0xe99185, 0xe99186, 0xe99187,
+ /* 58 */ 0xe99188, 0xe99189, 0xe9918a, 0xe9918b,
+ /* 5c */ 0xe9918c, 0xe9918d, 0xe9918e, 0xe9918f,
+ /* 60 */ 0xe99190, 0xe99191, 0xe99192, 0xe99193,
+ /* 64 */ 0xe99194, 0xe99195, 0xe99196, 0xe99197,
+ /* 68 */ 0xe99198, 0xe99199, 0xe9919a, 0xe9919b,
+ /* 6c */ 0xe9919c, 0xe9919d, 0xe9919e, 0xe9919f,
+ /* 70 */ 0xe991a0, 0xe991a1, 0xe991a2, 0xe991a3,
+ /* 74 */ 0xe991a4, 0xe991a5, 0xe991a6, 0xe991a7,
+ /* 78 */ 0xe991a8, 0xe991a9, 0xe991aa, 0xe991ac,
+ /* 7c */ 0xe991ad, 0xe991ae, 0xe991af, 0x000000,
+ /* 80 */ 0xe991b0, 0xe991b1, 0xe991b2, 0xe991b3,
+ /* 84 */ 0xe991b4, 0xe991b5, 0xe991b6, 0xe991b7,
+ /* 88 */ 0xe991b8, 0xe991b9, 0xe991ba, 0xe991bb,
+ /* 8c */ 0xe991bc, 0xe991bd, 0xe991be, 0xe991bf,
+ /* 90 */ 0xe99280, 0xe99281, 0xe99282, 0xe99283,
+ /* 94 */ 0xe99284, 0xe99291, 0xe99296, 0xe99298,
+ /* 98 */ 0xe99387, 0xe9938f, 0xe99393, 0xe99394,
+ /* 9c */ 0xe9939a, 0xe993a6, 0xe993bb, 0xe9949c,
+ /* a0 */ 0xe994a0, 0xe7909b, 0xe7909a, 0xe79181,
+ /* a4 */ 0xe7919c, 0xe79197, 0xe79195, 0xe79199,
+ /* a8 */ 0xe791b7, 0xe791ad, 0xe791be, 0xe7929c,
+ /* ac */ 0xe7928e, 0xe79280, 0xe79281, 0xe79287,
+ /* b0 */ 0xe7928b, 0xe7929e, 0xe792a8, 0xe792a9,
+ /* b4 */ 0xe79290, 0xe792a7, 0xe79392, 0xe792ba,
+ /* b8 */ 0xe99faa, 0xe99fab, 0xe99fac, 0xe69d8c,
+ /* bc */ 0xe69d93, 0xe69d9e, 0xe69d88, 0xe69da9,
+ /* c0 */ 0xe69ea5, 0xe69e87, 0xe69daa, 0xe69db3,
+ /* c4 */ 0xe69e98, 0xe69ea7, 0xe69db5, 0xe69ea8,
+ /* c8 */ 0xe69e9e, 0xe69ead, 0xe69e8b, 0xe69db7,
+ /* cc */ 0xe69dbc, 0xe69fb0, 0xe6a089, 0xe69f98,
+ /* d0 */ 0xe6a08a, 0xe69fa9, 0xe69eb0, 0xe6a08c,
+ /* d4 */ 0xe69f99, 0xe69eb5, 0xe69f9a, 0xe69eb3,
+ /* d8 */ 0xe69f9d, 0xe6a080, 0xe69f83, 0xe69eb8,
+ /* dc */ 0xe69fa2, 0xe6a08e, 0xe69f81, 0xe69fbd,
+ /* e0 */ 0xe6a0b2, 0xe6a0b3, 0xe6a1a0, 0xe6a1a1,
+ /* e4 */ 0xe6a18e, 0xe6a1a2, 0xe6a184, 0xe6a1a4,
+ /* e8 */ 0xe6a283, 0xe6a09d, 0xe6a195, 0xe6a1a6,
+ /* ec */ 0xe6a181, 0xe6a1a7, 0xe6a180, 0xe6a0be,
+ /* f0 */ 0xe6a18a, 0xe6a189, 0xe6a0a9, 0xe6a2b5,
+ /* f4 */ 0xe6a28f, 0xe6a1b4, 0xe6a1b7, 0xe6a293,
+ /* f8 */ 0xe6a1ab, 0xe6a382, 0xe6a5ae, 0xe6a3bc,
+ /* fc */ 0xe6a49f, 0xe6a4a0, 0xe6a3b9,
+
+ /*** Two byte table, leaf: e9xx - offset 0x04ed5 ***/
+
+ /* 40 */ 0xe994a7, 0xe994b3, 0xe994bd, 0xe99583,
+ /* 44 */ 0xe99588, 0xe9958b, 0xe99595, 0xe9959a,
+ /* 48 */ 0xe995a0, 0xe995ae, 0xe995b4, 0xe995b5,
+ /* 4c */ 0xe995b7, 0xe995b8, 0xe995b9, 0xe995ba,
+ /* 50 */ 0xe995bb, 0xe995bc, 0xe995bd, 0xe995be,
+ /* 54 */ 0xe99680, 0xe99681, 0xe99682, 0xe99683,
+ /* 58 */ 0xe99684, 0xe99685, 0xe99686, 0xe99687,
+ /* 5c */ 0xe99688, 0xe99689, 0xe9968a, 0xe9968b,
+ /* 60 */ 0xe9968c, 0xe9968d, 0xe9968e, 0xe9968f,
+ /* 64 */ 0xe99690, 0xe99691, 0xe99692, 0xe99693,
+ /* 68 */ 0xe99694, 0xe99695, 0xe99696, 0xe99697,
+ /* 6c */ 0xe99698, 0xe99699, 0xe9969a, 0xe9969b,
+ /* 70 */ 0xe9969c, 0xe9969d, 0xe9969e, 0xe9969f,
+ /* 74 */ 0xe996a0, 0xe996a1, 0xe996a2, 0xe996a3,
+ /* 78 */ 0xe996a4, 0xe996a5, 0xe996a6, 0xe996a7,
+ /* 7c */ 0xe996a8, 0xe996a9, 0xe996aa, 0x000000,
+ /* 80 */ 0xe996ab, 0xe996ac, 0xe996ad, 0xe996ae,
+ /* 84 */ 0xe996af, 0xe996b0, 0xe996b1, 0xe996b2,
+ /* 88 */ 0xe996b3, 0xe996b4, 0xe996b5, 0xe996b6,
+ /* 8c */ 0xe996b7, 0xe996b8, 0xe996b9, 0xe996ba,
+ /* 90 */ 0xe996bb, 0xe996bc, 0xe996bd, 0xe996be,
+ /* 94 */ 0xe996bf, 0xe99780, 0xe99781, 0xe99782,
+ /* 98 */ 0xe99783, 0xe99784, 0xe99785, 0xe99786,
+ /* 9c */ 0xe99787, 0xe99788, 0xe99789, 0xe9978a,
+ /* a0 */ 0xe9978b, 0xe6a4a4, 0xe6a3b0, 0xe6a48b,
+ /* a4 */ 0xe6a481, 0xe6a597, 0xe6a3a3, 0xe6a490,
+ /* a8 */ 0xe6a5b1, 0xe6a4b9, 0xe6a5a0, 0xe6a582,
+ /* ac */ 0xe6a59d, 0xe6a684, 0xe6a5ab, 0xe6a680,
+ /* b0 */ 0xe6a698, 0xe6a5b8, 0xe6a4b4, 0xe6a78c,
+ /* b4 */ 0xe6a687, 0xe6a688, 0xe6a78e, 0xe6a689,
+ /* b8 */ 0xe6a5a6, 0xe6a5a3, 0xe6a5b9, 0xe6a69b,
+ /* bc */ 0xe6a6a7, 0xe6a6bb, 0xe6a6ab, 0xe6a6ad,
+ /* c0 */ 0xe6a794, 0xe6a6b1, 0xe6a781, 0xe6a78a,
+ /* c4 */ 0xe6a79f, 0xe6a695, 0xe6a7a0, 0xe6a68d,
+ /* c8 */ 0xe6a7bf, 0xe6a8af, 0xe6a7ad, 0xe6a897,
+ /* cc */ 0xe6a898, 0xe6a9a5, 0xe6a7b2, 0xe6a984,
+ /* d0 */ 0xe6a8be, 0xe6aaa0, 0xe6a990, 0xe6a99b,
+ /* d4 */ 0xe6a8b5, 0xe6aa8e, 0xe6a9b9, 0xe6a8bd,
+ /* d8 */ 0xe6a8a8, 0xe6a998, 0xe6a9bc, 0xe6aa91,
+ /* dc */ 0xe6aa90, 0xe6aaa9, 0xe6aa97, 0xe6aaab,
+ /* e0 */ 0xe78cb7, 0xe78d92, 0xe6ae81, 0xe6ae82,
+ /* e4 */ 0xe6ae87, 0xe6ae84, 0xe6ae92, 0xe6ae93,
+ /* e8 */ 0xe6ae8d, 0xe6ae9a, 0xe6ae9b, 0xe6aea1,
+ /* ec */ 0xe6aeaa, 0xe8bdab, 0xe8bdad, 0xe8bdb1,
+ /* f0 */ 0xe8bdb2, 0xe8bdb3, 0xe8bdb5, 0xe8bdb6,
+ /* f4 */ 0xe8bdb8, 0xe8bdb7, 0xe8bdb9, 0xe8bdba,
+ /* f8 */ 0xe8bdbc, 0xe8bdbe, 0xe8be81, 0xe8be82,
+ /* fc */ 0xe8be84, 0xe8be87, 0xe8be8b,
+
+ /*** Two byte table, leaf: eaxx - offset 0x04f94 ***/
+
+ /* 40 */ 0xe9978c, 0xe9978d, 0xe9978e, 0xe9978f,
+ /* 44 */ 0xe99790, 0xe99791, 0xe99792, 0xe99793,
+ /* 48 */ 0xe99794, 0xe99795, 0xe99796, 0xe99797,
+ /* 4c */ 0xe99798, 0xe99799, 0xe9979a, 0xe9979b,
+ /* 50 */ 0xe9979c, 0xe9979d, 0xe9979e, 0xe9979f,
+ /* 54 */ 0xe997a0, 0xe997a1, 0xe997a2, 0xe997a3,
+ /* 58 */ 0xe997a4, 0xe997a5, 0xe997a6, 0xe997a7,
+ /* 5c */ 0xe997ac, 0xe997bf, 0xe99887, 0xe99893,
+ /* 60 */ 0xe99898, 0xe9989b, 0xe9989e, 0xe998a0,
+ /* 64 */ 0xe998a3, 0xe998a4, 0xe998a5, 0xe998a6,
+ /* 68 */ 0xe998a7, 0xe998a8, 0xe998a9, 0xe998ab,
+ /* 6c */ 0xe998ac, 0xe998ad, 0xe998af, 0xe998b0,
+ /* 70 */ 0xe998b7, 0xe998b8, 0xe998b9, 0xe998ba,
+ /* 74 */ 0xe998be, 0xe99981, 0xe99983, 0xe9998a,
+ /* 78 */ 0xe9998e, 0xe9998f, 0xe99991, 0xe99992,
+ /* 7c */ 0xe99993, 0xe99996, 0xe99997, 0x000000,
+ /* 80 */ 0xe99998, 0xe99999, 0xe9999a, 0xe9999c,
+ /* 84 */ 0xe9999d, 0xe9999e, 0xe999a0, 0xe999a3,
+ /* 88 */ 0xe999a5, 0xe999a6, 0xe999ab, 0xe999ad,
+ /* 8c */ 0xe999ae, 0xe999af, 0xe999b0, 0xe999b1,
+ /* 90 */ 0xe999b3, 0xe999b8, 0xe999b9, 0xe999ba,
+ /* 94 */ 0xe999bb, 0xe999bc, 0xe999bd, 0xe999be,
+ /* 98 */ 0xe999bf, 0xe99a80, 0xe99a81, 0xe99a82,
+ /* 9c */ 0xe99a83, 0xe99a84, 0xe99a87, 0xe99a89,
+ /* a0 */ 0xe99a8a, 0xe8be8d, 0xe8be8e, 0xe8be8f,
+ /* a4 */ 0xe8be98, 0xe8be9a, 0xe8bb8e, 0xe6888b,
+ /* a8 */ 0xe68897, 0xe6889b, 0xe6889f, 0xe688a2,
+ /* ac */ 0xe688a1, 0xe688a5, 0xe688a4, 0xe688ac,
+ /* b0 */ 0xe887a7, 0xe793af, 0xe793b4, 0xe793bf,
+ /* b4 */ 0xe7948f, 0xe79491, 0xe79493, 0xe694b4,
+ /* b8 */ 0xe697ae, 0xe697af, 0xe697b0, 0xe6988a,
+ /* bc */ 0xe69899, 0xe69db2, 0xe69883, 0xe69895,
+ /* c0 */ 0xe69880, 0xe78285, 0xe69bb7, 0xe6989d,
+ /* c4 */ 0xe698b4, 0xe698b1, 0xe698b6, 0xe698b5,
+ /* c8 */ 0xe88086, 0xe6999f, 0xe69994, 0xe69981,
+ /* cc */ 0xe6998f, 0xe69996, 0xe699a1, 0xe69997,
+ /* d0 */ 0xe699b7, 0xe69a84, 0xe69a8c, 0xe69aa7,
+ /* d4 */ 0xe69a9d, 0xe69abe, 0xe69b9b, 0xe69b9c,
+ /* d8 */ 0xe69ba6, 0xe69ba9, 0xe8b4b2, 0xe8b4b3,
+ /* dc */ 0xe8b4b6, 0xe8b4bb, 0xe8b4bd, 0xe8b580,
+ /* e0 */ 0xe8b585, 0xe8b586, 0xe8b588, 0xe8b589,
+ /* e4 */ 0xe8b587, 0xe8b58d, 0xe8b595, 0xe8b599,
+ /* e8 */ 0xe8a787, 0xe8a78a, 0xe8a78b, 0xe8a78c,
+ /* ec */ 0xe8a78e, 0xe8a78f, 0xe8a790, 0xe8a791,
+ /* f0 */ 0xe789ae, 0xe78a9f, 0xe7899d, 0xe789a6,
+ /* f4 */ 0xe789af, 0xe789be, 0xe789bf, 0xe78a84,
+ /* f8 */ 0xe78a8b, 0xe78a8d, 0xe78a8f, 0xe78a92,
+ /* fc */ 0xe68c88, 0xe68cb2, 0xe68eb0,
+
+ /*** Two byte table, leaf: ebxx - offset 0x05053 ***/
+
+ /* 40 */ 0xe99a8c, 0xe99a8e, 0xe99a91, 0xe99a92,
+ /* 44 */ 0xe99a93, 0xe99a95, 0xe99a96, 0xe99a9a,
+ /* 48 */ 0xe99a9b, 0xe99a9d, 0xe99a9e, 0xe99a9f,
+ /* 4c */ 0xe99aa0, 0xe99aa1, 0xe99aa2, 0xe99aa3,
+ /* 50 */ 0xe99aa4, 0xe99aa5, 0xe99aa6, 0xe99aa8,
+ /* 54 */ 0xe99aa9, 0xe99aaa, 0xe99aab, 0xe99aac,
+ /* 58 */ 0xe99aad, 0xe99aae, 0xe99aaf, 0xe99ab1,
+ /* 5c */ 0xe99ab2, 0xe99ab4, 0xe99ab5, 0xe99ab7,
+ /* 60 */ 0xe99ab8, 0xe99aba, 0xe99abb, 0xe99abf,
+ /* 64 */ 0xe99b82, 0xe99b83, 0xe99b88, 0xe99b8a,
+ /* 68 */ 0xe99b8b, 0xe99b90, 0xe99b91, 0xe99b93,
+ /* 6c */ 0xe99b94, 0xe99b96, 0xe99b97, 0xe99b98,
+ /* 70 */ 0xe99b99, 0xe99b9a, 0xe99b9b, 0xe99b9c,
+ /* 74 */ 0xe99b9d, 0xe99b9e, 0xe99b9f, 0xe99ba1,
+ /* 78 */ 0xe99ba2, 0xe99ba3, 0xe99ba4, 0xe99ba5,
+ /* 7c */ 0xe99ba6, 0xe99ba7, 0xe99bab, 0x000000,
+ /* 80 */ 0xe99bac, 0xe99bad, 0xe99bae, 0xe99bb0,
+ /* 84 */ 0xe99bb1, 0xe99bb2, 0xe99bb4, 0xe99bb5,
+ /* 88 */ 0xe99bb8, 0xe99bba, 0xe99bbb, 0xe99bbc,
+ /* 8c */ 0xe99bbd, 0xe99bbf, 0xe99c82, 0xe99c83,
+ /* 90 */ 0xe99c85, 0xe99c8a, 0xe99c8b, 0xe99c8c,
+ /* 94 */ 0xe99c90, 0xe99c91, 0xe99c92, 0xe99c94,
+ /* 98 */ 0xe99c95, 0xe99c97, 0xe99c98, 0xe99c99,
+ /* 9c */ 0xe99c9a, 0xe99c9b, 0xe99c9d, 0xe99c9f,
+ /* a0 */ 0xe99ca0, 0xe690bf, 0xe69398, 0xe88084,
+ /* a4 */ 0xe6afaa, 0xe6afb3, 0xe6afbd, 0xe6afb5,
+ /* a8 */ 0xe6afb9, 0xe6b085, 0xe6b087, 0xe6b086,
+ /* ac */ 0xe6b08d, 0xe6b095, 0xe6b098, 0xe6b099,
+ /* b0 */ 0xe6b09a, 0xe6b0a1, 0xe6b0a9, 0xe6b0a4,
+ /* b4 */ 0xe6b0aa, 0xe6b0b2, 0xe694b5, 0xe69595,
+ /* b8 */ 0xe695ab, 0xe7898d, 0xe78992, 0xe78996,
+ /* bc */ 0xe788b0, 0xe899a2, 0xe58896, 0xe8829f,
+ /* c0 */ 0xe8829c, 0xe88293, 0xe882bc, 0xe69c8a,
+ /* c4 */ 0xe882bd, 0xe882b1, 0xe882ab, 0xe882ad,
+ /* c8 */ 0xe882b4, 0xe882b7, 0xe883a7, 0xe883a8,
+ /* cc */ 0xe883a9, 0xe883aa, 0xe8839b, 0xe88382,
+ /* d0 */ 0xe88384, 0xe88399, 0xe8838d, 0xe88397,
+ /* d4 */ 0xe69c90, 0xe8839d, 0xe883ab, 0xe883b1,
+ /* d8 */ 0xe883b4, 0xe883ad, 0xe8848d, 0xe8848e,
+ /* dc */ 0xe883b2, 0xe883bc, 0xe69c95, 0xe88492,
+ /* e0 */ 0xe8b19a, 0xe884b6, 0xe8849e, 0xe884ac,
+ /* e4 */ 0xe88498, 0xe884b2, 0xe88588, 0xe8858c,
+ /* e8 */ 0xe88593, 0xe885b4, 0xe88599, 0xe8859a,
+ /* ec */ 0xe885b1, 0xe885a0, 0xe885a9, 0xe885bc,
+ /* f0 */ 0xe885bd, 0xe885ad, 0xe885a7, 0xe5a18d,
+ /* f4 */ 0xe5aab5, 0xe88688, 0xe88682, 0xe88691,
+ /* f8 */ 0xe6bb95, 0xe886a3, 0xe886aa, 0xe8878c,
+ /* fc */ 0xe69ca6, 0xe8878a, 0xe886bb,
+
+ /*** Two byte table, leaf: ecxx - offset 0x05112 ***/
+
+ /* 40 */ 0xe99ca1, 0xe99ca2, 0xe99ca3, 0xe99ca4,
+ /* 44 */ 0xe99ca5, 0xe99ca6, 0xe99ca7, 0xe99ca8,
+ /* 48 */ 0xe99ca9, 0xe99cab, 0xe99cac, 0xe99cae,
+ /* 4c */ 0xe99caf, 0xe99cb1, 0xe99cb3, 0xe99cb4,
+ /* 50 */ 0xe99cb5, 0xe99cb6, 0xe99cb7, 0xe99cba,
+ /* 54 */ 0xe99cbb, 0xe99cbc, 0xe99cbd, 0xe99cbf,
+ /* 58 */ 0xe99d80, 0xe99d81, 0xe99d82, 0xe99d83,
+ /* 5c */ 0xe99d84, 0xe99d85, 0xe99d86, 0xe99d87,
+ /* 60 */ 0xe99d88, 0xe99d89, 0xe99d8a, 0xe99d8b,
+ /* 64 */ 0xe99d8c, 0xe99d8d, 0xe99d8e, 0xe99d8f,
+ /* 68 */ 0xe99d90, 0xe99d91, 0xe99d94, 0xe99d95,
+ /* 6c */ 0xe99d97, 0xe99d98, 0xe99d9a, 0xe99d9c,
+ /* 70 */ 0xe99d9d, 0xe99d9f, 0xe99da3, 0xe99da4,
+ /* 74 */ 0xe99da6, 0xe99da7, 0xe99da8, 0xe99daa,
+ /* 78 */ 0xe99dab, 0xe99dac, 0xe99dad, 0xe99dae,
+ /* 7c */ 0xe99daf, 0xe99db0, 0xe99db1, 0x000000,
+ /* 80 */ 0xe99db2, 0xe99db5, 0xe99db7, 0xe99db8,
+ /* 84 */ 0xe99db9, 0xe99dba, 0xe99dbb, 0xe99dbd,
+ /* 88 */ 0xe99dbe, 0xe99dbf, 0xe99e80, 0xe99e81,
+ /* 8c */ 0xe99e82, 0xe99e83, 0xe99e84, 0xe99e86,
+ /* 90 */ 0xe99e87, 0xe99e88, 0xe99e89, 0xe99e8a,
+ /* 94 */ 0xe99e8c, 0xe99e8e, 0xe99e8f, 0xe99e90,
+ /* 98 */ 0xe99e93, 0xe99e95, 0xe99e96, 0xe99e97,
+ /* 9c */ 0xe99e99, 0xe99e9a, 0xe99e9b, 0xe99e9c,
+ /* a0 */ 0xe99e9d, 0xe88781, 0xe886a6, 0xe6aca4,
+ /* a4 */ 0xe6acb7, 0xe6acb9, 0xe6ad83, 0xe6ad86,
+ /* a8 */ 0xe6ad99, 0xe9a391, 0xe9a392, 0xe9a393,
+ /* ac */ 0xe9a395, 0xe9a399, 0xe9a39a, 0xe6aeb3,
+ /* b0 */ 0xe5bd80, 0xe6af82, 0xe8a7b3, 0xe69690,
+ /* b4 */ 0xe9bd91, 0xe69693, 0xe696bc, 0xe69786,
+ /* b8 */ 0xe69784, 0xe69783, 0xe6978c, 0xe6978e,
+ /* bc */ 0xe69792, 0xe69796, 0xe78280, 0xe7829c,
+ /* c0 */ 0xe78296, 0xe7829d, 0xe782bb, 0xe78380,
+ /* c4 */ 0xe782b7, 0xe782ab, 0xe782b1, 0xe783a8,
+ /* c8 */ 0xe7838a, 0xe78490, 0xe78493, 0xe78496,
+ /* cc */ 0xe784af, 0xe784b1, 0xe785b3, 0xe7859c,
+ /* d0 */ 0xe785a8, 0xe78585, 0xe785b2, 0xe7858a,
+ /* d4 */ 0xe785b8, 0xe785ba, 0xe78698, 0xe786b3,
+ /* d8 */ 0xe786b5, 0xe786a8, 0xe786a0, 0xe787a0,
+ /* dc */ 0xe78794, 0xe787a7, 0xe787b9, 0xe7889d,
+ /* e0 */ 0xe788a8, 0xe781ac, 0xe78498, 0xe785a6,
+ /* e4 */ 0xe786b9, 0xe688be, 0xe688bd, 0xe68983,
+ /* e8 */ 0xe68988, 0xe68989, 0xe7a4bb, 0xe7a580,
+ /* ec */ 0xe7a586, 0xe7a589, 0xe7a59b, 0xe7a59c,
+ /* f0 */ 0xe7a593, 0xe7a59a, 0xe7a5a2, 0xe7a597,
+ /* f4 */ 0xe7a5a0, 0xe7a5af, 0xe7a5a7, 0xe7a5ba,
+ /* f8 */ 0xe7a685, 0xe7a68a, 0xe7a69a, 0xe7a6a7,
+ /* fc */ 0xe7a6b3, 0xe5bf91, 0xe5bf90,
+
+ /*** Two byte table, leaf: edxx - offset 0x051d1 ***/
+
+ /* 40 */ 0xe99e9e, 0xe99e9f, 0xe99ea1, 0xe99ea2,
+ /* 44 */ 0xe99ea4, 0xe99ea5, 0xe99ea6, 0xe99ea7,
+ /* 48 */ 0xe99ea8, 0xe99ea9, 0xe99eaa, 0xe99eac,
+ /* 4c */ 0xe99eae, 0xe99eb0, 0xe99eb1, 0xe99eb3,
+ /* 50 */ 0xe99eb5, 0xe99eb6, 0xe99eb7, 0xe99eb8,
+ /* 54 */ 0xe99eb9, 0xe99eba, 0xe99ebb, 0xe99ebc,
+ /* 58 */ 0xe99ebd, 0xe99ebe, 0xe99ebf, 0xe99f80,
+ /* 5c */ 0xe99f81, 0xe99f82, 0xe99f83, 0xe99f84,
+ /* 60 */ 0xe99f85, 0xe99f86, 0xe99f87, 0xe99f88,
+ /* 64 */ 0xe99f89, 0xe99f8a, 0xe99f8b, 0xe99f8c,
+ /* 68 */ 0xe99f8d, 0xe99f8e, 0xe99f8f, 0xe99f90,
+ /* 6c */ 0xe99f91, 0xe99f92, 0xe99f93, 0xe99f94,
+ /* 70 */ 0xe99f95, 0xe99f96, 0xe99f97, 0xe99f98,
+ /* 74 */ 0xe99f99, 0xe99f9a, 0xe99f9b, 0xe99f9c,
+ /* 78 */ 0xe99f9d, 0xe99f9e, 0xe99f9f, 0xe99fa0,
+ /* 7c */ 0xe99fa1, 0xe99fa2, 0xe99fa3, 0x000000,
+ /* 80 */ 0xe99fa4, 0xe99fa5, 0xe99fa8, 0xe99fae,
+ /* 84 */ 0xe99faf, 0xe99fb0, 0xe99fb1, 0xe99fb2,
+ /* 88 */ 0xe99fb4, 0xe99fb7, 0xe99fb8, 0xe99fb9,
+ /* 8c */ 0xe99fba, 0xe99fbb, 0xe99fbc, 0xe99fbd,
+ /* 90 */ 0xe99fbe, 0xe99fbf, 0xe9a080, 0xe9a081,
+ /* 94 */ 0xe9a082, 0xe9a083, 0xe9a084, 0xe9a085,
+ /* 98 */ 0xe9a086, 0xe9a087, 0xe9a088, 0xe9a089,
+ /* 9c */ 0xe9a08a, 0xe9a08b, 0xe9a08c, 0xe9a08d,
+ /* a0 */ 0xe9a08e, 0xe680bc, 0xe6819d, 0xe6819a,
+ /* a4 */ 0xe681a7, 0xe68181, 0xe68199, 0xe681a3,
+ /* a8 */ 0xe682ab, 0xe68486, 0xe6848d, 0xe6859d,
+ /* ac */ 0xe686a9, 0xe6869d, 0xe6878b, 0xe68791,
+ /* b0 */ 0xe68886, 0xe88280, 0xe881bf, 0xe6b293,
+ /* b4 */ 0xe6b3b6, 0xe6b7bc, 0xe79fb6, 0xe79fb8,
+ /* b8 */ 0xe7a080, 0xe7a089, 0xe7a097, 0xe7a098,
+ /* bc */ 0xe7a091, 0xe696ab, 0xe7a0ad, 0xe7a09c,
+ /* c0 */ 0xe7a09d, 0xe7a0b9, 0xe7a0ba, 0xe7a0bb,
+ /* c4 */ 0xe7a09f, 0xe7a0bc, 0xe7a0a5, 0xe7a0ac,
+ /* c8 */ 0xe7a0a3, 0xe7a0a9, 0xe7a18e, 0xe7a1ad,
+ /* cc */ 0xe7a196, 0xe7a197, 0xe7a0a6, 0xe7a190,
+ /* d0 */ 0xe7a187, 0xe7a18c, 0xe7a1aa, 0xe7a29b,
+ /* d4 */ 0xe7a293, 0xe7a29a, 0xe7a287, 0xe7a29c,
+ /* d8 */ 0xe7a2a1, 0xe7a2a3, 0xe7a2b2, 0xe7a2b9,
+ /* dc */ 0xe7a2a5, 0xe7a394, 0xe7a399, 0xe7a389,
+ /* e0 */ 0xe7a3ac, 0xe7a3b2, 0xe7a485, 0xe7a3b4,
+ /* e4 */ 0xe7a493, 0xe7a4a4, 0xe7a49e, 0xe7a4b4,
+ /* e8 */ 0xe9be9b, 0xe9bbb9, 0xe9bbbb, 0xe9bbbc,
+ /* ec */ 0xe79bb1, 0xe79c84, 0xe79c8d, 0xe79bb9,
+ /* f0 */ 0xe79c87, 0xe79c88, 0xe79c9a, 0xe79ca2,
+ /* f4 */ 0xe79c99, 0xe79cad, 0xe79ca6, 0xe79cb5,
+ /* f8 */ 0xe79cb8, 0xe79d90, 0xe79d91, 0xe79d87,
+ /* fc */ 0xe79d83, 0xe79d9a, 0xe79da8,
+
+ /*** Two byte table, leaf: eexx - offset 0x05290 ***/
+
+ /* 40 */ 0xe9a08f, 0xe9a090, 0xe9a091, 0xe9a092,
+ /* 44 */ 0xe9a093, 0xe9a094, 0xe9a095, 0xe9a096,
+ /* 48 */ 0xe9a097, 0xe9a098, 0xe9a099, 0xe9a09a,
+ /* 4c */ 0xe9a09b, 0xe9a09c, 0xe9a09d, 0xe9a09e,
+ /* 50 */ 0xe9a09f, 0xe9a0a0, 0xe9a0a1, 0xe9a0a2,
+ /* 54 */ 0xe9a0a3, 0xe9a0a4, 0xe9a0a5, 0xe9a0a6,
+ /* 58 */ 0xe9a0a7, 0xe9a0a8, 0xe9a0a9, 0xe9a0aa,
+ /* 5c */ 0xe9a0ab, 0xe9a0ac, 0xe9a0ad, 0xe9a0ae,
+ /* 60 */ 0xe9a0af, 0xe9a0b0, 0xe9a0b1, 0xe9a0b2,
+ /* 64 */ 0xe9a0b3, 0xe9a0b4, 0xe9a0b5, 0xe9a0b6,
+ /* 68 */ 0xe9a0b7, 0xe9a0b8, 0xe9a0b9, 0xe9a0ba,
+ /* 6c */ 0xe9a0bb, 0xe9a0bc, 0xe9a0bd, 0xe9a0be,
+ /* 70 */ 0xe9a0bf, 0xe9a180, 0xe9a181, 0xe9a182,
+ /* 74 */ 0xe9a183, 0xe9a184, 0xe9a185, 0xe9a186,
+ /* 78 */ 0xe9a187, 0xe9a188, 0xe9a189, 0xe9a18a,
+ /* 7c */ 0xe9a18b, 0xe9a18c, 0xe9a18d, 0x000000,
+ /* 80 */ 0xe9a18e, 0xe9a18f, 0xe9a190, 0xe9a191,
+ /* 84 */ 0xe9a192, 0xe9a193, 0xe9a194, 0xe9a195,
+ /* 88 */ 0xe9a196, 0xe9a197, 0xe9a198, 0xe9a199,
+ /* 8c */ 0xe9a19a, 0xe9a19b, 0xe9a19c, 0xe9a19d,
+ /* 90 */ 0xe9a19e, 0xe9a19f, 0xe9a1a0, 0xe9a1a1,
+ /* 94 */ 0xe9a1a2, 0xe9a1a3, 0xe9a1a4, 0xe9a1a5,
+ /* 98 */ 0xe9a1a6, 0xe9a1a7, 0xe9a1a8, 0xe9a1a9,
+ /* 9c */ 0xe9a1aa, 0xe9a1ab, 0xe9a1ac, 0xe9a1ad,
+ /* a0 */ 0xe9a1ae, 0xe79da2, 0xe79da5, 0xe79dbf,
+ /* a4 */ 0xe79e8d, 0xe79dbd, 0xe79e80, 0xe79e8c,
+ /* a8 */ 0xe79e91, 0xe79e9f, 0xe79ea0, 0xe79eb0,
+ /* ac */ 0xe79eb5, 0xe79ebd, 0xe794ba, 0xe79580,
+ /* b0 */ 0xe7958e, 0xe7958b, 0xe79588, 0xe7959b,
+ /* b4 */ 0xe795b2, 0xe795b9, 0xe79683, 0xe7bd98,
+ /* b8 */ 0xe7bda1, 0xe7bd9f, 0xe8a988, 0xe7bda8,
+ /* bc */ 0xe7bdb4, 0xe7bdb1, 0xe7bdb9, 0xe7be81,
+ /* c0 */ 0xe7bdbe, 0xe79b8d, 0xe79ba5, 0xe8a0b2,
+ /* c4 */ 0xe99285, 0xe99286, 0xe99287, 0xe9928b,
+ /* c8 */ 0xe9928a, 0xe9928c, 0xe9928d, 0xe9928f,
+ /* cc */ 0xe99290, 0xe99294, 0xe99297, 0xe99295,
+ /* d0 */ 0xe9929a, 0xe9929b, 0xe9929c, 0xe992a3,
+ /* d4 */ 0xe992a4, 0xe992ab, 0xe992aa, 0xe992ad,
+ /* d8 */ 0xe992ac, 0xe992af, 0xe992b0, 0xe992b2,
+ /* dc */ 0xe992b4, 0xe992b6, 0xe992b7, 0xe992b8,
+ /* e0 */ 0xe992b9, 0xe992ba, 0xe992bc, 0xe992bd,
+ /* e4 */ 0xe992bf, 0xe99384, 0xe99388, 0xe99389,
+ /* e8 */ 0xe9938a, 0xe9938b, 0xe9938c, 0xe9938d,
+ /* ec */ 0xe9938e, 0xe99390, 0xe99391, 0xe99392,
+ /* f0 */ 0xe99395, 0xe99396, 0xe99397, 0xe99399,
+ /* f4 */ 0xe99398, 0xe9939b, 0xe9939e, 0xe9939f,
+ /* f8 */ 0xe993a0, 0xe993a2, 0xe993a4, 0xe993a5,
+ /* fc */ 0xe993a7, 0xe993a8, 0xe993aa,
+
+ /*** Two byte table, leaf: efxx - offset 0x0534f ***/
+
+ /* 40 */ 0xe9a1af, 0xe9a1b0, 0xe9a1b1, 0xe9a1b2,
+ /* 44 */ 0xe9a1b3, 0xe9a1b4, 0xe9a28b, 0xe9a28e,
+ /* 48 */ 0xe9a292, 0xe9a295, 0xe9a299, 0xe9a2a3,
+ /* 4c */ 0xe9a2a8, 0xe9a2a9, 0xe9a2aa, 0xe9a2ab,
+ /* 50 */ 0xe9a2ac, 0xe9a2ad, 0xe9a2ae, 0xe9a2af,
+ /* 54 */ 0xe9a2b0, 0xe9a2b1, 0xe9a2b2, 0xe9a2b3,
+ /* 58 */ 0xe9a2b4, 0xe9a2b5, 0xe9a2b6, 0xe9a2b7,
+ /* 5c */ 0xe9a2b8, 0xe9a2b9, 0xe9a2ba, 0xe9a2bb,
+ /* 60 */ 0xe9a2bc, 0xe9a2bd, 0xe9a2be, 0xe9a2bf,
+ /* 64 */ 0xe9a380, 0xe9a381, 0xe9a382, 0xe9a383,
+ /* 68 */ 0xe9a384, 0xe9a385, 0xe9a386, 0xe9a387,
+ /* 6c */ 0xe9a388, 0xe9a389, 0xe9a38a, 0xe9a38b,
+ /* 70 */ 0xe9a38c, 0xe9a38d, 0xe9a38f, 0xe9a390,
+ /* 74 */ 0xe9a394, 0xe9a396, 0xe9a397, 0xe9a39b,
+ /* 78 */ 0xe9a39c, 0xe9a39d, 0xe9a3a0, 0xe9a3a1,
+ /* 7c */ 0xe9a3a2, 0xe9a3a3, 0xe9a3a4, 0x000000,
+ /* 80 */ 0xe9a3a5, 0xe9a3a6, 0xe9a3a9, 0xe9a3aa,
+ /* 84 */ 0xe9a3ab, 0xe9a3ac, 0xe9a3ad, 0xe9a3ae,
+ /* 88 */ 0xe9a3af, 0xe9a3b0, 0xe9a3b1, 0xe9a3b2,
+ /* 8c */ 0xe9a3b3, 0xe9a3b4, 0xe9a3b5, 0xe9a3b6,
+ /* 90 */ 0xe9a3b7, 0xe9a3b8, 0xe9a3b9, 0xe9a3ba,
+ /* 94 */ 0xe9a3bb, 0xe9a3bc, 0xe9a3bd, 0xe9a3be,
+ /* 98 */ 0xe9a3bf, 0xe9a480, 0xe9a481, 0xe9a482,
+ /* 9c */ 0xe9a483, 0xe9a484, 0xe9a485, 0xe9a486,
+ /* a0 */ 0xe9a487, 0xe993a9, 0xe993ab, 0xe993ae,
+ /* a4 */ 0xe993af, 0xe993b3, 0xe993b4, 0xe993b5,
+ /* a8 */ 0xe993b7, 0xe993b9, 0xe993bc, 0xe993bd,
+ /* ac */ 0xe993bf, 0xe99483, 0xe99482, 0xe99486,
+ /* b0 */ 0xe99487, 0xe99489, 0xe9948a, 0xe9948d,
+ /* b4 */ 0xe9948e, 0xe9948f, 0xe99492, 0xe99493,
+ /* b8 */ 0xe99494, 0xe99495, 0xe99496, 0xe99498,
+ /* bc */ 0xe9949b, 0xe9949d, 0xe9949e, 0xe9949f,
+ /* c0 */ 0xe994a2, 0xe994aa, 0xe994ab, 0xe994a9,
+ /* c4 */ 0xe994ac, 0xe994b1, 0xe994b2, 0xe994b4,
+ /* c8 */ 0xe994b6, 0xe994b7, 0xe994b8, 0xe994bc,
+ /* cc */ 0xe994be, 0xe994bf, 0xe99582, 0xe994b5,
+ /* d0 */ 0xe99584, 0xe99585, 0xe99586, 0xe99589,
+ /* d4 */ 0xe9958c, 0xe9958e, 0xe9958f, 0xe99592,
+ /* d8 */ 0xe99593, 0xe99594, 0xe99596, 0xe99597,
+ /* dc */ 0xe99598, 0xe99599, 0xe9959b, 0xe9959e,
+ /* e0 */ 0xe9959f, 0xe9959d, 0xe995a1, 0xe995a2,
+ /* e4 */ 0xe995a4, 0xe995a5, 0xe995a6, 0xe995a7,
+ /* e8 */ 0xe995a8, 0xe995a9, 0xe995aa, 0xe995ab,
+ /* ec */ 0xe995ac, 0xe995af, 0xe995b1, 0xe995b2,
+ /* f0 */ 0xe995b3, 0xe994ba, 0xe79fa7, 0xe79fac,
+ /* f4 */ 0xe99b89, 0xe7a795, 0xe7a7ad, 0xe7a7a3,
+ /* f8 */ 0xe7a7ab, 0xe7a886, 0xe5b587, 0xe7a883,
+ /* fc */ 0xe7a882, 0xe7a89e, 0xe7a894,
+
+ /*** Two byte table, leaf: f0xx - offset 0x0540e ***/
+
+ /* 40 */ 0xe9a488, 0xe9a489, 0xe9a48a, 0xe9a48b,
+ /* 44 */ 0xe9a48c, 0xe9a48e, 0xe9a48f, 0xe9a491,
+ /* 48 */ 0xe9a492, 0xe9a493, 0xe9a494, 0xe9a495,
+ /* 4c */ 0xe9a496, 0xe9a497, 0xe9a498, 0xe9a499,
+ /* 50 */ 0xe9a49a, 0xe9a49b, 0xe9a49c, 0xe9a49d,
+ /* 54 */ 0xe9a49e, 0xe9a49f, 0xe9a4a0, 0xe9a4a1,
+ /* 58 */ 0xe9a4a2, 0xe9a4a3, 0xe9a4a4, 0xe9a4a5,
+ /* 5c */ 0xe9a4a6, 0xe9a4a7, 0xe9a4a8, 0xe9a4a9,
+ /* 60 */ 0xe9a4aa, 0xe9a4ab, 0xe9a4ac, 0xe9a4ad,
+ /* 64 */ 0xe9a4af, 0xe9a4b0, 0xe9a4b1, 0xe9a4b2,
+ /* 68 */ 0xe9a4b3, 0xe9a4b4, 0xe9a4b5, 0xe9a4b6,
+ /* 6c */ 0xe9a4b7, 0xe9a4b8, 0xe9a4b9, 0xe9a4ba,
+ /* 70 */ 0xe9a4bb, 0xe9a4bc, 0xe9a4bd, 0xe9a4be,
+ /* 74 */ 0xe9a4bf, 0xe9a580, 0xe9a581, 0xe9a582,
+ /* 78 */ 0xe9a583, 0xe9a584, 0xe9a585, 0xe9a586,
+ /* 7c */ 0xe9a587, 0xe9a588, 0xe9a589, 0x000000,
+ /* 80 */ 0xe9a58a, 0xe9a58b, 0xe9a58c, 0xe9a58d,
+ /* 84 */ 0xe9a58e, 0xe9a58f, 0xe9a590, 0xe9a591,
+ /* 88 */ 0xe9a592, 0xe9a593, 0xe9a596, 0xe9a597,
+ /* 8c */ 0xe9a598, 0xe9a599, 0xe9a59a, 0xe9a59b,
+ /* 90 */ 0xe9a59c, 0xe9a59d, 0xe9a59e, 0xe9a59f,
+ /* 94 */ 0xe9a5a0, 0xe9a5a1, 0xe9a5a2, 0xe9a5a4,
+ /* 98 */ 0xe9a5a6, 0xe9a5b3, 0xe9a5b8, 0xe9a5b9,
+ /* 9c */ 0xe9a5bb, 0xe9a5be, 0xe9a682, 0xe9a683,
+ /* a0 */ 0xe9a689, 0xe7a8b9, 0xe7a8b7, 0xe7a991,
+ /* a4 */ 0xe9bb8f, 0xe9a6a5, 0xe7a9b0, 0xe79a88,
+ /* a8 */ 0xe79a8e, 0xe79a93, 0xe79a99, 0xe79aa4,
+ /* ac */ 0xe7939e, 0xe793a0, 0xe794ac, 0xe9b8a0,
+ /* b0 */ 0xe9b8a2, 0xe9b8a8, 0xe9b8a9, 0xe9b8aa,
+ /* b4 */ 0xe9b8ab, 0xe9b8ac, 0xe9b8b2, 0xe9b8b1,
+ /* b8 */ 0xe9b8b6, 0xe9b8b8, 0xe9b8b7, 0xe9b8b9,
+ /* bc */ 0xe9b8ba, 0xe9b8be, 0xe9b981, 0xe9b982,
+ /* c0 */ 0xe9b984, 0xe9b986, 0xe9b987, 0xe9b988,
+ /* c4 */ 0xe9b989, 0xe9b98b, 0xe9b98c, 0xe9b98e,
+ /* c8 */ 0xe9b991, 0xe9b995, 0xe9b997, 0xe9b99a,
+ /* cc */ 0xe9b99b, 0xe9b99c, 0xe9b99e, 0xe9b9a3,
+ /* d0 */ 0xe9b9a6, 0xe9b9a7, 0xe9b9a8, 0xe9b9a9,
+ /* d4 */ 0xe9b9aa, 0xe9b9ab, 0xe9b9ac, 0xe9b9b1,
+ /* d8 */ 0xe9b9ad, 0xe9b9b3, 0xe79692, 0xe79694,
+ /* dc */ 0xe79696, 0xe796a0, 0xe7969d, 0xe796ac,
+ /* e0 */ 0xe796a3, 0xe796b3, 0xe796b4, 0xe796b8,
+ /* e4 */ 0xe79784, 0xe796b1, 0xe796b0, 0xe79783,
+ /* e8 */ 0xe79782, 0xe79796, 0xe7978d, 0xe797a3,
+ /* ec */ 0xe797a8, 0xe797a6, 0xe797a4, 0xe797ab,
+ /* f0 */ 0xe797a7, 0xe79883, 0xe797b1, 0xe797bc,
+ /* f4 */ 0xe797bf, 0xe79890, 0xe79880, 0xe79885,
+ /* f8 */ 0xe7988c, 0xe79897, 0xe7988a, 0xe798a5,
+ /* fc */ 0xe79898, 0xe79895, 0xe79899,
+
+ /*** Two byte table, leaf: f1xx - offset 0x054cd ***/
+
+ /* 40 */ 0xe9a68c, 0xe9a68e, 0xe9a69a, 0xe9a69b,
+ /* 44 */ 0xe9a69c, 0xe9a69d, 0xe9a69e, 0xe9a69f,
+ /* 48 */ 0xe9a6a0, 0xe9a6a1, 0xe9a6a2, 0xe9a6a3,
+ /* 4c */ 0xe9a6a4, 0xe9a6a6, 0xe9a6a7, 0xe9a6a9,
+ /* 50 */ 0xe9a6aa, 0xe9a6ab, 0xe9a6ac, 0xe9a6ad,
+ /* 54 */ 0xe9a6ae, 0xe9a6af, 0xe9a6b0, 0xe9a6b1,
+ /* 58 */ 0xe9a6b2, 0xe9a6b3, 0xe9a6b4, 0xe9a6b5,
+ /* 5c */ 0xe9a6b6, 0xe9a6b7, 0xe9a6b8, 0xe9a6b9,
+ /* 60 */ 0xe9a6ba, 0xe9a6bb, 0xe9a6bc, 0xe9a6bd,
+ /* 64 */ 0xe9a6be, 0xe9a6bf, 0xe9a780, 0xe9a781,
+ /* 68 */ 0xe9a782, 0xe9a783, 0xe9a784, 0xe9a785,
+ /* 6c */ 0xe9a786, 0xe9a787, 0xe9a788, 0xe9a789,
+ /* 70 */ 0xe9a78a, 0xe9a78b, 0xe9a78c, 0xe9a78d,
+ /* 74 */ 0xe9a78e, 0xe9a78f, 0xe9a790, 0xe9a791,
+ /* 78 */ 0xe9a792, 0xe9a793, 0xe9a794, 0xe9a795,
+ /* 7c */ 0xe9a796, 0xe9a797, 0xe9a798, 0x000000,
+ /* 80 */ 0xe9a799, 0xe9a79a, 0xe9a79b, 0xe9a79c,
+ /* 84 */ 0xe9a79d, 0xe9a79e, 0xe9a79f, 0xe9a7a0,
+ /* 88 */ 0xe9a7a1, 0xe9a7a2, 0xe9a7a3, 0xe9a7a4,
+ /* 8c */ 0xe9a7a5, 0xe9a7a6, 0xe9a7a7, 0xe9a7a8,
+ /* 90 */ 0xe9a7a9, 0xe9a7aa, 0xe9a7ab, 0xe9a7ac,
+ /* 94 */ 0xe9a7ad, 0xe9a7ae, 0xe9a7af, 0xe9a7b0,
+ /* 98 */ 0xe9a7b1, 0xe9a7b2, 0xe9a7b3, 0xe9a7b4,
+ /* 9c */ 0xe9a7b5, 0xe9a7b6, 0xe9a7b7, 0xe9a7b8,
+ /* a0 */ 0xe9a7b9, 0xe7989b, 0xe798bc, 0xe798a2,
+ /* a4 */ 0xe798a0, 0xe79980, 0xe798ad, 0xe798b0,
+ /* a8 */ 0xe798bf, 0xe798b5, 0xe79983, 0xe798be,
+ /* ac */ 0xe798b3, 0xe7998d, 0xe7999e, 0xe79994,
+ /* b0 */ 0xe7999c, 0xe79996, 0xe799ab, 0xe799af,
+ /* b4 */ 0xe7bf8a, 0xe7aba6, 0xe7a9b8, 0xe7a9b9,
+ /* b8 */ 0xe7aa80, 0xe7aa86, 0xe7aa88, 0xe7aa95,
+ /* bc */ 0xe7aaa6, 0xe7aaa0, 0xe7aaac, 0xe7aaa8,
+ /* c0 */ 0xe7aaad, 0xe7aab3, 0xe8a1a4, 0xe8a1a9,
+ /* c4 */ 0xe8a1b2, 0xe8a1bd, 0xe8a1bf, 0xe8a282,
+ /* c8 */ 0xe8a2a2, 0xe8a386, 0xe8a2b7, 0xe8a2bc,
+ /* cc */ 0xe8a389, 0xe8a3a2, 0xe8a38e, 0xe8a3a3,
+ /* d0 */ 0xe8a3a5, 0xe8a3b1, 0xe8a49a, 0xe8a3bc,
+ /* d4 */ 0xe8a3a8, 0xe8a3be, 0xe8a3b0, 0xe8a4a1,
+ /* d8 */ 0xe8a499, 0xe8a493, 0xe8a49b, 0xe8a48a,
+ /* dc */ 0xe8a4b4, 0xe8a4ab, 0xe8a4b6, 0xe8a581,
+ /* e0 */ 0xe8a5a6, 0xe8a5bb, 0xe7968b, 0xe883a5,
+ /* e4 */ 0xe79ab2, 0xe79ab4, 0xe79f9c, 0xe88092,
+ /* e8 */ 0xe88094, 0xe88096, 0xe8809c, 0xe880a0,
+ /* ec */ 0xe880a2, 0xe880a5, 0xe880a6, 0xe880a7,
+ /* f0 */ 0xe880a9, 0xe880a8, 0xe880b1, 0xe8808b,
+ /* f4 */ 0xe880b5, 0xe88183, 0xe88186, 0xe8818d,
+ /* f8 */ 0xe88192, 0xe881a9, 0xe881b1, 0xe8a683,
+ /* fc */ 0xe9a1b8, 0xe9a280, 0xe9a283,
+
+ /*** Two byte table, leaf: f2xx - offset 0x0558c ***/
+
+ /* 40 */ 0xe9a7ba, 0xe9a7bb, 0xe9a7bc, 0xe9a7bd,
+ /* 44 */ 0xe9a7be, 0xe9a7bf, 0xe9a880, 0xe9a881,
+ /* 48 */ 0xe9a882, 0xe9a883, 0xe9a884, 0xe9a885,
+ /* 4c */ 0xe9a886, 0xe9a887, 0xe9a888, 0xe9a889,
+ /* 50 */ 0xe9a88a, 0xe9a88b, 0xe9a88c, 0xe9a88d,
+ /* 54 */ 0xe9a88e, 0xe9a88f, 0xe9a890, 0xe9a891,
+ /* 58 */ 0xe9a892, 0xe9a893, 0xe9a894, 0xe9a895,
+ /* 5c */ 0xe9a896, 0xe9a897, 0xe9a898, 0xe9a899,
+ /* 60 */ 0xe9a89a, 0xe9a89b, 0xe9a89c, 0xe9a89d,
+ /* 64 */ 0xe9a89e, 0xe9a89f, 0xe9a8a0, 0xe9a8a1,
+ /* 68 */ 0xe9a8a2, 0xe9a8a3, 0xe9a8a4, 0xe9a8a5,
+ /* 6c */ 0xe9a8a6, 0xe9a8a7, 0xe9a8a8, 0xe9a8a9,
+ /* 70 */ 0xe9a8aa, 0xe9a8ab, 0xe9a8ac, 0xe9a8ad,
+ /* 74 */ 0xe9a8ae, 0xe9a8af, 0xe9a8b0, 0xe9a8b1,
+ /* 78 */ 0xe9a8b2, 0xe9a8b3, 0xe9a8b4, 0xe9a8b5,
+ /* 7c */ 0xe9a8b6, 0xe9a8b7, 0xe9a8b8, 0x000000,
+ /* 80 */ 0xe9a8b9, 0xe9a8ba, 0xe9a8bb, 0xe9a8bc,
+ /* 84 */ 0xe9a8bd, 0xe9a8be, 0xe9a8bf, 0xe9a980,
+ /* 88 */ 0xe9a981, 0xe9a982, 0xe9a983, 0xe9a984,
+ /* 8c */ 0xe9a985, 0xe9a986, 0xe9a987, 0xe9a988,
+ /* 90 */ 0xe9a989, 0xe9a98a, 0xe9a98b, 0xe9a98c,
+ /* 94 */ 0xe9a98d, 0xe9a98e, 0xe9a98f, 0xe9a990,
+ /* 98 */ 0xe9a991, 0xe9a992, 0xe9a993, 0xe9a994,
+ /* 9c */ 0xe9a995, 0xe9a996, 0xe9a997, 0xe9a998,
+ /* a0 */ 0xe9a999, 0xe9a289, 0xe9a28c, 0xe9a28d,
+ /* a4 */ 0xe9a28f, 0xe9a294, 0xe9a29a, 0xe9a29b,
+ /* a8 */ 0xe9a29e, 0xe9a29f, 0xe9a2a1, 0xe9a2a2,
+ /* ac */ 0xe9a2a5, 0xe9a2a6, 0xe8998d, 0xe89994,
+ /* b0 */ 0xe899ac, 0xe899ae, 0xe899bf, 0xe899ba,
+ /* b4 */ 0xe899bc, 0xe899bb, 0xe89aa8, 0xe89a8d,
+ /* b8 */ 0xe89a8b, 0xe89aac, 0xe89a9d, 0xe89aa7,
+ /* bc */ 0xe89aa3, 0xe89aaa, 0xe89a93, 0xe89aa9,
+ /* c0 */ 0xe89ab6, 0xe89b84, 0xe89ab5, 0xe89b8e,
+ /* c4 */ 0xe89ab0, 0xe89aba, 0xe89ab1, 0xe89aaf,
+ /* c8 */ 0xe89b89, 0xe89b8f, 0xe89ab4, 0xe89ba9,
+ /* cc */ 0xe89bb1, 0xe89bb2, 0xe89bad, 0xe89bb3,
+ /* d0 */ 0xe89b90, 0xe89c93, 0xe89b9e, 0xe89bb4,
+ /* d4 */ 0xe89b9f, 0xe89b98, 0xe89b91, 0xe89c83,
+ /* d8 */ 0xe89c87, 0xe89bb8, 0xe89c88, 0xe89c8a,
+ /* dc */ 0xe89c8d, 0xe89c89, 0xe89ca3, 0xe89cbb,
+ /* e0 */ 0xe89c9e, 0xe89ca5, 0xe89cae, 0xe89c9a,
+ /* e4 */ 0xe89cbe, 0xe89d88, 0xe89cb4, 0xe89cb1,
+ /* e8 */ 0xe89ca9, 0xe89cb7, 0xe89cbf, 0xe89e82,
+ /* ec */ 0xe89ca2, 0xe89dbd, 0xe89dbe, 0xe89dbb,
+ /* f0 */ 0xe89da0, 0xe89db0, 0xe89d8c, 0xe89dae,
+ /* f4 */ 0xe89e8b, 0xe89d93, 0xe89da3, 0xe89dbc,
+ /* f8 */ 0xe89da4, 0xe89d99, 0xe89da5, 0xe89e93,
+ /* fc */ 0xe89eaf, 0xe89ea8, 0xe89f92,
+
+ /*** Two byte table, leaf: f3xx - offset 0x0564b ***/
+
+ /* 40 */ 0xe9a99a, 0xe9a99b, 0xe9a99c, 0xe9a99d,
+ /* 44 */ 0xe9a99e, 0xe9a99f, 0xe9a9a0, 0xe9a9a1,
+ /* 48 */ 0xe9a9a2, 0xe9a9a3, 0xe9a9a4, 0xe9a9a5,
+ /* 4c */ 0xe9a9a6, 0xe9a9a7, 0xe9a9a8, 0xe9a9a9,
+ /* 50 */ 0xe9a9aa, 0xe9a9ab, 0xe9a9b2, 0xe9aa83,
+ /* 54 */ 0xe9aa89, 0xe9aa8d, 0xe9aa8e, 0xe9aa94,
+ /* 58 */ 0xe9aa95, 0xe9aa99, 0xe9aaa6, 0xe9aaa9,
+ /* 5c */ 0xe9aaaa, 0xe9aaab, 0xe9aaac, 0xe9aaad,
+ /* 60 */ 0xe9aaae, 0xe9aaaf, 0xe9aab2, 0xe9aab3,
+ /* 64 */ 0xe9aab4, 0xe9aab5, 0xe9aab9, 0xe9aabb,
+ /* 68 */ 0xe9aabd, 0xe9aabe, 0xe9aabf, 0xe9ab83,
+ /* 6c */ 0xe9ab84, 0xe9ab86, 0xe9ab87, 0xe9ab88,
+ /* 70 */ 0xe9ab89, 0xe9ab8a, 0xe9ab8d, 0xe9ab8e,
+ /* 74 */ 0xe9ab8f, 0xe9ab90, 0xe9ab92, 0xe9ab94,
+ /* 78 */ 0xe9ab95, 0xe9ab96, 0xe9ab97, 0xe9ab99,
+ /* 7c */ 0xe9ab9a, 0xe9ab9b, 0xe9ab9c, 0x000000,
+ /* 80 */ 0xe9ab9d, 0xe9ab9e, 0xe9aba0, 0xe9aba2,
+ /* 84 */ 0xe9aba3, 0xe9aba4, 0xe9aba5, 0xe9aba7,
+ /* 88 */ 0xe9aba8, 0xe9aba9, 0xe9abaa, 0xe9abac,
+ /* 8c */ 0xe9abae, 0xe9abb0, 0xe9abb1, 0xe9abb2,
+ /* 90 */ 0xe9abb3, 0xe9abb4, 0xe9abb5, 0xe9abb6,
+ /* 94 */ 0xe9abb7, 0xe9abb8, 0xe9abba, 0xe9abbc,
+ /* 98 */ 0xe9abbd, 0xe9abbe, 0xe9abbf, 0xe9ac80,
+ /* 9c */ 0xe9ac81, 0xe9ac82, 0xe9ac84, 0xe9ac85,
+ /* a0 */ 0xe9ac86, 0xe89f86, 0xe89e88, 0xe89e85,
+ /* a4 */ 0xe89ead, 0xe89e97, 0xe89e83, 0xe89eab,
+ /* a8 */ 0xe89fa5, 0xe89eac, 0xe89eb5, 0xe89eb3,
+ /* ac */ 0xe89f8b, 0xe89f93, 0xe89ebd, 0xe89f91,
+ /* b0 */ 0xe89f80, 0xe89f8a, 0xe89f9b, 0xe89faa,
+ /* b4 */ 0xe89fa0, 0xe89fae, 0xe8a096, 0xe8a093,
+ /* b8 */ 0xe89fbe, 0xe8a08a, 0xe8a09b, 0xe8a0a1,
+ /* bc */ 0xe8a0b9, 0xe8a0bc, 0xe7bcb6, 0xe7bd82,
+ /* c0 */ 0xe7bd84, 0xe7bd85, 0xe88890, 0xe7abba,
+ /* c4 */ 0xe7abbd, 0xe7ac88, 0xe7ac83, 0xe7ac84,
+ /* c8 */ 0xe7ac95, 0xe7ac8a, 0xe7acab, 0xe7ac8f,
+ /* cc */ 0xe7ad87, 0xe7acb8, 0xe7acaa, 0xe7ac99,
+ /* d0 */ 0xe7acae, 0xe7acb1, 0xe7aca0, 0xe7aca5,
+ /* d4 */ 0xe7aca4, 0xe7acb3, 0xe7acbe, 0xe7ac9e,
+ /* d8 */ 0xe7ad98, 0xe7ad9a, 0xe7ad85, 0xe7adb5,
+ /* dc */ 0xe7ad8c, 0xe7ad9d, 0xe7ada0, 0xe7adae,
+ /* e0 */ 0xe7adbb, 0xe7ada2, 0xe7adb2, 0xe7adb1,
+ /* e4 */ 0xe7ae90, 0xe7aea6, 0xe7aea7, 0xe7aeb8,
+ /* e8 */ 0xe7aeac, 0xe7ae9d, 0xe7aea8, 0xe7ae85,
+ /* ec */ 0xe7aeaa, 0xe7ae9c, 0xe7aea2, 0xe7aeab,
+ /* f0 */ 0xe7aeb4, 0xe7af91, 0xe7af81, 0xe7af8c,
+ /* f4 */ 0xe7af9d, 0xe7af9a, 0xe7afa5, 0xe7afa6,
+ /* f8 */ 0xe7afaa, 0xe7b08c, 0xe7afbe, 0xe7afbc,
+ /* fc */ 0xe7b08f, 0xe7b096, 0xe7b08b,
+
+ /*** Two byte table, leaf: f4xx - offset 0x0570a ***/
+
+ /* 40 */ 0xe9ac87, 0xe9ac89, 0xe9ac8a, 0xe9ac8b,
+ /* 44 */ 0xe9ac8c, 0xe9ac8d, 0xe9ac8e, 0xe9ac90,
+ /* 48 */ 0xe9ac91, 0xe9ac92, 0xe9ac94, 0xe9ac95,
+ /* 4c */ 0xe9ac96, 0xe9ac97, 0xe9ac98, 0xe9ac99,
+ /* 50 */ 0xe9ac9a, 0xe9ac9b, 0xe9ac9c, 0xe9ac9d,
+ /* 54 */ 0xe9ac9e, 0xe9aca0, 0xe9aca1, 0xe9aca2,
+ /* 58 */ 0xe9aca4, 0xe9aca5, 0xe9aca6, 0xe9aca7,
+ /* 5c */ 0xe9aca8, 0xe9aca9, 0xe9acaa, 0xe9acab,
+ /* 60 */ 0xe9acac, 0xe9acad, 0xe9acae, 0xe9acb0,
+ /* 64 */ 0xe9acb1, 0xe9acb3, 0xe9acb4, 0xe9acb5,
+ /* 68 */ 0xe9acb6, 0xe9acb7, 0xe9acb8, 0xe9acb9,
+ /* 6c */ 0xe9acba, 0xe9acbd, 0xe9acbe, 0xe9acbf,
+ /* 70 */ 0xe9ad80, 0xe9ad86, 0xe9ad8a, 0xe9ad8b,
+ /* 74 */ 0xe9ad8c, 0xe9ad8e, 0xe9ad90, 0xe9ad92,
+ /* 78 */ 0xe9ad93, 0xe9ad95, 0xe9ad96, 0xe9ad97,
+ /* 7c */ 0xe9ad98, 0xe9ad99, 0xe9ad9a, 0x000000,
+ /* 80 */ 0xe9ad9b, 0xe9ad9c, 0xe9ad9d, 0xe9ad9e,
+ /* 84 */ 0xe9ad9f, 0xe9ada0, 0xe9ada1, 0xe9ada2,
+ /* 88 */ 0xe9ada3, 0xe9ada4, 0xe9ada5, 0xe9ada6,
+ /* 8c */ 0xe9ada7, 0xe9ada8, 0xe9ada9, 0xe9adaa,
+ /* 90 */ 0xe9adab, 0xe9adac, 0xe9adad, 0xe9adae,
+ /* 94 */ 0xe9adaf, 0xe9adb0, 0xe9adb1, 0xe9adb2,
+ /* 98 */ 0xe9adb3, 0xe9adb4, 0xe9adb5, 0xe9adb6,
+ /* 9c */ 0xe9adb7, 0xe9adb8, 0xe9adb9, 0xe9adba,
+ /* a0 */ 0xe9adbb, 0xe7b09f, 0xe7b0aa, 0xe7b0a6,
+ /* a4 */ 0xe7b0b8, 0xe7b181, 0xe7b180, 0xe887be,
+ /* a8 */ 0xe88881, 0xe88882, 0xe88884, 0xe887ac,
+ /* ac */ 0xe8a184, 0xe888a1, 0xe888a2, 0xe888a3,
+ /* b0 */ 0xe888ad, 0xe888af, 0xe888a8, 0xe888ab,
+ /* b4 */ 0xe888b8, 0xe888bb, 0xe888b3, 0xe888b4,
+ /* b8 */ 0xe888be, 0xe88984, 0xe88989, 0xe8898b,
+ /* bc */ 0xe8898f, 0xe8899a, 0xe8899f, 0xe889a8,
+ /* c0 */ 0xe8a1be, 0xe8a285, 0xe8a288, 0xe8a398,
+ /* c4 */ 0xe8a39f, 0xe8a59e, 0xe7be9d, 0xe7be9f,
+ /* c8 */ 0xe7bea7, 0xe7beaf, 0xe7beb0, 0xe7beb2,
+ /* cc */ 0xe7b1bc, 0xe69589, 0xe7b291, 0xe7b29d,
+ /* d0 */ 0xe7b29c, 0xe7b29e, 0xe7b2a2, 0xe7b2b2,
+ /* d4 */ 0xe7b2bc, 0xe7b2bd, 0xe7b381, 0xe7b387,
+ /* d8 */ 0xe7b38c, 0xe7b38d, 0xe7b388, 0xe7b385,
+ /* dc */ 0xe7b397, 0xe7b3a8, 0xe889ae, 0xe69aa8,
+ /* e0 */ 0xe7bebf, 0xe7bf8e, 0xe7bf95, 0xe7bfa5,
+ /* e4 */ 0xe7bfa1, 0xe7bfa6, 0xe7bfa9, 0xe7bfae,
+ /* e8 */ 0xe7bfb3, 0xe7b3b8, 0xe7b5b7, 0xe7b6a6,
+ /* ec */ 0xe7b6ae, 0xe7b987, 0xe7ba9b, 0xe9bab8,
+ /* f0 */ 0xe9bab4, 0xe8b5b3, 0xe8b684, 0xe8b694,
+ /* f4 */ 0xe8b691, 0xe8b6b1, 0xe8b5a7, 0xe8b5ad,
+ /* f8 */ 0xe8b187, 0xe8b189, 0xe9858a, 0xe98590,
+ /* fc */ 0xe9858e, 0xe9858f, 0xe985a4,
+
+ /*** Two byte table, leaf: f5xx - offset 0x057c9 ***/
+
+ /* 40 */ 0xe9adbc, 0xe9adbd, 0xe9adbe, 0xe9adbf,
+ /* 44 */ 0xe9ae80, 0xe9ae81, 0xe9ae82, 0xe9ae83,
+ /* 48 */ 0xe9ae84, 0xe9ae85, 0xe9ae86, 0xe9ae87,
+ /* 4c */ 0xe9ae88, 0xe9ae89, 0xe9ae8a, 0xe9ae8b,
+ /* 50 */ 0xe9ae8c, 0xe9ae8d, 0xe9ae8e, 0xe9ae8f,
+ /* 54 */ 0xe9ae90, 0xe9ae91, 0xe9ae92, 0xe9ae93,
+ /* 58 */ 0xe9ae94, 0xe9ae95, 0xe9ae96, 0xe9ae97,
+ /* 5c */ 0xe9ae98, 0xe9ae99, 0xe9ae9a, 0xe9ae9b,
+ /* 60 */ 0xe9ae9c, 0xe9ae9d, 0xe9ae9e, 0xe9ae9f,
+ /* 64 */ 0xe9aea0, 0xe9aea1, 0xe9aea2, 0xe9aea3,
+ /* 68 */ 0xe9aea4, 0xe9aea5, 0xe9aea6, 0xe9aea7,
+ /* 6c */ 0xe9aea8, 0xe9aea9, 0xe9aeaa, 0xe9aeab,
+ /* 70 */ 0xe9aeac, 0xe9aead, 0xe9aeae, 0xe9aeaf,
+ /* 74 */ 0xe9aeb0, 0xe9aeb1, 0xe9aeb2, 0xe9aeb3,
+ /* 78 */ 0xe9aeb4, 0xe9aeb5, 0xe9aeb6, 0xe9aeb7,
+ /* 7c */ 0xe9aeb8, 0xe9aeb9, 0xe9aeba, 0x000000,
+ /* 80 */ 0xe9aebb, 0xe9aebc, 0xe9aebd, 0xe9aebe,
+ /* 84 */ 0xe9aebf, 0xe9af80, 0xe9af81, 0xe9af82,
+ /* 88 */ 0xe9af83, 0xe9af84, 0xe9af85, 0xe9af86,
+ /* 8c */ 0xe9af87, 0xe9af88, 0xe9af89, 0xe9af8a,
+ /* 90 */ 0xe9af8b, 0xe9af8c, 0xe9af8d, 0xe9af8e,
+ /* 94 */ 0xe9af8f, 0xe9af90, 0xe9af91, 0xe9af92,
+ /* 98 */ 0xe9af93, 0xe9af94, 0xe9af95, 0xe9af96,
+ /* 9c */ 0xe9af97, 0xe9af98, 0xe9af99, 0xe9af9a,
+ /* a0 */ 0xe9af9b, 0xe985a2, 0xe985a1, 0xe985b0,
+ /* a4 */ 0xe985a9, 0xe985af, 0xe985bd, 0xe985be,
+ /* a8 */ 0xe985b2, 0xe985b4, 0xe985b9, 0xe9868c,
+ /* ac */ 0xe98685, 0xe98690, 0xe9868d, 0xe98691,
+ /* b0 */ 0xe986a2, 0xe986a3, 0xe986aa, 0xe986ad,
+ /* b4 */ 0xe986ae, 0xe986af, 0xe986b5, 0xe986b4,
+ /* b8 */ 0xe986ba, 0xe8b195, 0xe9b9be, 0xe8b6b8,
+ /* bc */ 0xe8b7ab, 0xe8b885, 0xe8b999, 0xe8b9a9,
+ /* c0 */ 0xe8b6b5, 0xe8b6bf, 0xe8b6bc, 0xe8b6ba,
+ /* c4 */ 0xe8b784, 0xe8b796, 0xe8b797, 0xe8b79a,
+ /* c8 */ 0xe8b79e, 0xe8b78e, 0xe8b78f, 0xe8b79b,
+ /* cc */ 0xe8b786, 0xe8b7ac, 0xe8b7b7, 0xe8b7b8,
+ /* d0 */ 0xe8b7a3, 0xe8b7b9, 0xe8b7bb, 0xe8b7a4,
+ /* d4 */ 0xe8b889, 0xe8b7bd, 0xe8b894, 0xe8b89d,
+ /* d8 */ 0xe8b89f, 0xe8b8ac, 0xe8b8ae, 0xe8b8a3,
+ /* dc */ 0xe8b8af, 0xe8b8ba, 0xe8b980, 0xe8b8b9,
+ /* e0 */ 0xe8b8b5, 0xe8b8bd, 0xe8b8b1, 0xe8b989,
+ /* e4 */ 0xe8b981, 0xe8b982, 0xe8b991, 0xe8b992,
+ /* e8 */ 0xe8b98a, 0xe8b9b0, 0xe8b9b6, 0xe8b9bc,
+ /* ec */ 0xe8b9af, 0xe8b9b4, 0xe8ba85, 0xe8ba8f,
+ /* f0 */ 0xe8ba94, 0xe8ba90, 0xe8ba9c, 0xe8ba9e,
+ /* f4 */ 0xe8b1b8, 0xe8b282, 0xe8b28a, 0xe8b285,
+ /* f8 */ 0xe8b298, 0xe8b294, 0xe6969b, 0xe8a796,
+ /* fc */ 0xe8a79e, 0xe8a79a, 0xe8a79c,
+
+ /*** Two byte table, leaf: f6xx - offset 0x05888 ***/
+
+ /* 40 */ 0xe9af9c, 0xe9af9d, 0xe9af9e, 0xe9af9f,
+ /* 44 */ 0xe9afa0, 0xe9afa1, 0xe9afa2, 0xe9afa3,
+ /* 48 */ 0xe9afa4, 0xe9afa5, 0xe9afa6, 0xe9afa7,
+ /* 4c */ 0xe9afa8, 0xe9afa9, 0xe9afaa, 0xe9afab,
+ /* 50 */ 0xe9afac, 0xe9afad, 0xe9afae, 0xe9afaf,
+ /* 54 */ 0xe9afb0, 0xe9afb1, 0xe9afb2, 0xe9afb3,
+ /* 58 */ 0xe9afb4, 0xe9afb5, 0xe9afb6, 0xe9afb7,
+ /* 5c */ 0xe9afb8, 0xe9afb9, 0xe9afba, 0xe9afbb,
+ /* 60 */ 0xe9afbc, 0xe9afbd, 0xe9afbe, 0xe9afbf,
+ /* 64 */ 0xe9b080, 0xe9b081, 0xe9b082, 0xe9b083,
+ /* 68 */ 0xe9b084, 0xe9b085, 0xe9b086, 0xe9b087,
+ /* 6c */ 0xe9b088, 0xe9b089, 0xe9b08a, 0xe9b08b,
+ /* 70 */ 0xe9b08c, 0xe9b08d, 0xe9b08e, 0xe9b08f,
+ /* 74 */ 0xe9b090, 0xe9b091, 0xe9b092, 0xe9b093,
+ /* 78 */ 0xe9b094, 0xe9b095, 0xe9b096, 0xe9b097,
+ /* 7c */ 0xe9b098, 0xe9b099, 0xe9b09a, 0x000000,
+ /* 80 */ 0xe9b09b, 0xe9b09c, 0xe9b09d, 0xe9b09e,
+ /* 84 */ 0xe9b09f, 0xe9b0a0, 0xe9b0a1, 0xe9b0a2,
+ /* 88 */ 0xe9b0a3, 0xe9b0a4, 0xe9b0a5, 0xe9b0a6,
+ /* 8c */ 0xe9b0a7, 0xe9b0a8, 0xe9b0a9, 0xe9b0aa,
+ /* 90 */ 0xe9b0ab, 0xe9b0ac, 0xe9b0ad, 0xe9b0ae,
+ /* 94 */ 0xe9b0af, 0xe9b0b0, 0xe9b0b1, 0xe9b0b2,
+ /* 98 */ 0xe9b0b3, 0xe9b0b4, 0xe9b0b5, 0xe9b0b6,
+ /* 9c */ 0xe9b0b7, 0xe9b0b8, 0xe9b0b9, 0xe9b0ba,
+ /* a0 */ 0xe9b0bb, 0xe8a7a5, 0xe8a7ab, 0xe8a7af,
+ /* a4 */ 0xe8a8be, 0xe8aca6, 0xe99d93, 0xe99ba9,
+ /* a8 */ 0xe99bb3, 0xe99baf, 0xe99c86, 0xe99c81,
+ /* ac */ 0xe99c88, 0xe99c8f, 0xe99c8e, 0xe99caa,
+ /* b0 */ 0xe99cad, 0xe99cb0, 0xe99cbe, 0xe9be80,
+ /* b4 */ 0xe9be83, 0xe9be85, 0xe9be86, 0xe9be87,
+ /* b8 */ 0xe9be88, 0xe9be89, 0xe9be8a, 0xe9be8c,
+ /* bc */ 0xe9bbbe, 0xe9bc8b, 0xe9bc8d, 0xe99ab9,
+ /* c0 */ 0xe99abc, 0xe99abd, 0xe99b8e, 0xe99b92,
+ /* c4 */ 0xe79ebf, 0xe99ba0, 0xe98a8e, 0xe98aae,
+ /* c8 */ 0xe98b88, 0xe98cbe, 0xe98daa, 0xe98f8a,
+ /* cc */ 0xe98e8f, 0xe990be, 0xe991ab, 0xe9b1bf,
+ /* d0 */ 0xe9b282, 0xe9b285, 0xe9b286, 0xe9b287,
+ /* d4 */ 0xe9b288, 0xe7a8a3, 0xe9b28b, 0xe9b28e,
+ /* d8 */ 0xe9b290, 0xe9b291, 0xe9b292, 0xe9b294,
+ /* dc */ 0xe9b295, 0xe9b29a, 0xe9b29b, 0xe9b29e,
+ /* e0 */ 0xe9b29f, 0xe9b2a0, 0xe9b2a1, 0xe9b2a2,
+ /* e4 */ 0xe9b2a3, 0xe9b2a5, 0xe9b2a6, 0xe9b2a7,
+ /* e8 */ 0xe9b2a8, 0xe9b2a9, 0xe9b2ab, 0xe9b2ad,
+ /* ec */ 0xe9b2ae, 0xe9b2b0, 0xe9b2b1, 0xe9b2b2,
+ /* f0 */ 0xe9b2b3, 0xe9b2b4, 0xe9b2b5, 0xe9b2b6,
+ /* f4 */ 0xe9b2b7, 0xe9b2ba, 0xe9b2bb, 0xe9b2bc,
+ /* f8 */ 0xe9b2bd, 0xe9b384, 0xe9b385, 0xe9b386,
+ /* fc */ 0xe9b387, 0xe9b38a, 0xe9b38b,
+
+ /*** Two byte table, leaf: f7xx - offset 0x05947 ***/
+
+ /* 40 */ 0xe9b0bc, 0xe9b0bd, 0xe9b0be, 0xe9b0bf,
+ /* 44 */ 0xe9b180, 0xe9b181, 0xe9b182, 0xe9b183,
+ /* 48 */ 0xe9b184, 0xe9b185, 0xe9b186, 0xe9b187,
+ /* 4c */ 0xe9b188, 0xe9b189, 0xe9b18a, 0xe9b18b,
+ /* 50 */ 0xe9b18c, 0xe9b18d, 0xe9b18e, 0xe9b18f,
+ /* 54 */ 0xe9b190, 0xe9b191, 0xe9b192, 0xe9b193,
+ /* 58 */ 0xe9b194, 0xe9b195, 0xe9b196, 0xe9b197,
+ /* 5c */ 0xe9b198, 0xe9b199, 0xe9b19a, 0xe9b19b,
+ /* 60 */ 0xe9b19c, 0xe9b19d, 0xe9b19e, 0xe9b19f,
+ /* 64 */ 0xe9b1a0, 0xe9b1a1, 0xe9b1a2, 0xe9b1a3,
+ /* 68 */ 0xe9b1a4, 0xe9b1a5, 0xe9b1a6, 0xe9b1a7,
+ /* 6c */ 0xe9b1a8, 0xe9b1a9, 0xe9b1aa, 0xe9b1ab,
+ /* 70 */ 0xe9b1ac, 0xe9b1ad, 0xe9b1ae, 0xe9b1af,
+ /* 74 */ 0xe9b1b0, 0xe9b1b1, 0xe9b1b2, 0xe9b1b3,
+ /* 78 */ 0xe9b1b4, 0xe9b1b5, 0xe9b1b6, 0xe9b1b7,
+ /* 7c */ 0xe9b1b8, 0xe9b1b9, 0xe9b1ba, 0x000000,
+ /* 80 */ 0xe9b1bb, 0xe9b1bd, 0xe9b1be, 0xe9b280,
+ /* 84 */ 0xe9b283, 0xe9b284, 0xe9b289, 0xe9b28a,
+ /* 88 */ 0xe9b28c, 0xe9b28f, 0xe9b293, 0xe9b296,
+ /* 8c */ 0xe9b297, 0xe9b298, 0xe9b299, 0xe9b29d,
+ /* 90 */ 0xe9b2aa, 0xe9b2ac, 0xe9b2af, 0xe9b2b9,
+ /* 94 */ 0xe9b2be, 0xe9b2bf, 0xe9b380, 0xe9b381,
+ /* 98 */ 0xe9b382, 0xe9b388, 0xe9b389, 0xe9b391,
+ /* 9c */ 0xe9b392, 0xe9b39a, 0xe9b39b, 0xe9b3a0,
+ /* a0 */ 0xe9b3a1, 0xe9b38c, 0xe9b38d, 0xe9b38e,
+ /* a4 */ 0xe9b38f, 0xe9b390, 0xe9b393, 0xe9b394,
+ /* a8 */ 0xe9b395, 0xe9b397, 0xe9b398, 0xe9b399,
+ /* ac */ 0xe9b39c, 0xe9b39d, 0xe9b39f, 0xe9b3a2,
+ /* b0 */ 0xe99dbc, 0xe99e85, 0xe99e91, 0xe99e92,
+ /* b4 */ 0xe99e94, 0xe99eaf, 0xe99eab, 0xe99ea3,
+ /* b8 */ 0xe99eb2, 0xe99eb4, 0xe9aab1, 0xe9aab0,
+ /* bc */ 0xe9aab7, 0xe9b998, 0xe9aab6, 0xe9aaba,
+ /* c0 */ 0xe9aabc, 0xe9ab81, 0xe9ab80, 0xe9ab85,
+ /* c4 */ 0xe9ab82, 0xe9ab8b, 0xe9ab8c, 0xe9ab91,
+ /* c8 */ 0xe9ad85, 0xe9ad83, 0xe9ad87, 0xe9ad89,
+ /* cc */ 0xe9ad88, 0xe9ad8d, 0xe9ad91, 0xe9a3a8,
+ /* d0 */ 0xe9a48d, 0xe9a4ae, 0xe9a595, 0xe9a594,
+ /* d4 */ 0xe9ab9f, 0xe9aba1, 0xe9aba6, 0xe9abaf,
+ /* d8 */ 0xe9abab, 0xe9abbb, 0xe9abad, 0xe9abb9,
+ /* dc */ 0xe9ac88, 0xe9ac8f, 0xe9ac93, 0xe9ac9f,
+ /* e0 */ 0xe9aca3, 0xe9babd, 0xe9babe, 0xe7b8bb,
+ /* e4 */ 0xe9ba82, 0xe9ba87, 0xe9ba88, 0xe9ba8b,
+ /* e8 */ 0xe9ba92, 0xe98f96, 0xe9ba9d, 0xe9ba9f,
+ /* ec */ 0xe9bb9b, 0xe9bb9c, 0xe9bb9d, 0xe9bba0,
+ /* f0 */ 0xe9bb9f, 0xe9bba2, 0xe9bba9, 0xe9bba7,
+ /* f4 */ 0xe9bba5, 0xe9bbaa, 0xe9bbaf, 0xe9bca2,
+ /* f8 */ 0xe9bcac, 0xe9bcaf, 0xe9bcb9, 0xe9bcb7,
+ /* fc */ 0xe9bcbd, 0xe9bcbe, 0xe9bd84,
+
+ /*** Two byte table, leaf: f8xx - offset 0x05a06 ***/
+
+ /* 40 */ 0xe9b3a3, 0xe9b3a4, 0xe9b3a5, 0xe9b3a6,
+ /* 44 */ 0xe9b3a7, 0xe9b3a8, 0xe9b3a9, 0xe9b3aa,
+ /* 48 */ 0xe9b3ab, 0xe9b3ac, 0xe9b3ad, 0xe9b3ae,
+ /* 4c */ 0xe9b3af, 0xe9b3b0, 0xe9b3b1, 0xe9b3b2,
+ /* 50 */ 0xe9b3b3, 0xe9b3b4, 0xe9b3b5, 0xe9b3b6,
+ /* 54 */ 0xe9b3b7, 0xe9b3b8, 0xe9b3b9, 0xe9b3ba,
+ /* 58 */ 0xe9b3bb, 0xe9b3bc, 0xe9b3bd, 0xe9b3be,
+ /* 5c */ 0xe9b3bf, 0xe9b480, 0xe9b481, 0xe9b482,
+ /* 60 */ 0xe9b483, 0xe9b484, 0xe9b485, 0xe9b486,
+ /* 64 */ 0xe9b487, 0xe9b488, 0xe9b489, 0xe9b48a,
+ /* 68 */ 0xe9b48b, 0xe9b48c, 0xe9b48d, 0xe9b48e,
+ /* 6c */ 0xe9b48f, 0xe9b490, 0xe9b491, 0xe9b492,
+ /* 70 */ 0xe9b493, 0xe9b494, 0xe9b495, 0xe9b496,
+ /* 74 */ 0xe9b497, 0xe9b498, 0xe9b499, 0xe9b49a,
+ /* 78 */ 0xe9b49b, 0xe9b49c, 0xe9b49d, 0xe9b49e,
+ /* 7c */ 0xe9b49f, 0xe9b4a0, 0xe9b4a1, 0x000000,
+ /* 80 */ 0xe9b4a2, 0xe9b4a3, 0xe9b4a4, 0xe9b4a5,
+ /* 84 */ 0xe9b4a6, 0xe9b4a7, 0xe9b4a8, 0xe9b4a9,
+ /* 88 */ 0xe9b4aa, 0xe9b4ab, 0xe9b4ac, 0xe9b4ad,
+ /* 8c */ 0xe9b4ae, 0xe9b4af, 0xe9b4b0, 0xe9b4b1,
+ /* 90 */ 0xe9b4b2, 0xe9b4b3, 0xe9b4b4, 0xe9b4b5,
+ /* 94 */ 0xe9b4b6, 0xe9b4b7, 0xe9b4b8, 0xe9b4b9,
+ /* 98 */ 0xe9b4ba, 0xe9b4bb, 0xe9b4bc, 0xe9b4bd,
+ /* 9c */ 0xe9b4be, 0xe9b4bf, 0xe9b580, 0xe9b581,
+ /* a0 */ 0xe9b582, 0xee88b4, 0xee88b5, 0xee88b6,
+ /* a4 */ 0xee88b7, 0xee88b8, 0xee88b9, 0xee88ba,
+ /* a8 */ 0xee88bb, 0xee88bc, 0xee88bd, 0xee88be,
+ /* ac */ 0xee88bf, 0xee8980, 0xee8981, 0xee8982,
+ /* b0 */ 0xee8983, 0xee8984, 0xee8985, 0xee8986,
+ /* b4 */ 0xee8987, 0xee8988, 0xee8989, 0xee898a,
+ /* b8 */ 0xee898b, 0xee898c, 0xee898d, 0xee898e,
+ /* bc */ 0xee898f, 0xee8990, 0xee8991, 0xee8992,
+ /* c0 */ 0xee8993, 0xee8994, 0xee8995, 0xee8996,
+ /* c4 */ 0xee8997, 0xee8998, 0xee8999, 0xee899a,
+ /* c8 */ 0xee899b, 0xee899c, 0xee899d, 0xee899e,
+ /* cc */ 0xee899f, 0xee89a0, 0xee89a1, 0xee89a2,
+ /* d0 */ 0xee89a3, 0xee89a4, 0xee89a5, 0xee89a6,
+ /* d4 */ 0xee89a7, 0xee89a8, 0xee89a9, 0xee89aa,
+ /* d8 */ 0xee89ab, 0xee89ac, 0xee89ad, 0xee89ae,
+ /* dc */ 0xee89af, 0xee89b0, 0xee89b1, 0xee89b2,
+ /* e0 */ 0xee89b3, 0xee89b4, 0xee89b5, 0xee89b6,
+ /* e4 */ 0xee89b7, 0xee89b8, 0xee89b9, 0xee89ba,
+ /* e8 */ 0xee89bb, 0xee89bc, 0xee89bd, 0xee89be,
+ /* ec */ 0xee89bf, 0xee8a80, 0xee8a81, 0xee8a82,
+ /* f0 */ 0xee8a83, 0xee8a84, 0xee8a85, 0xee8a86,
+ /* f4 */ 0xee8a87, 0xee8a88, 0xee8a89, 0xee8a8a,
+ /* f8 */ 0xee8a8b, 0xee8a8c, 0xee8a8d, 0xee8a8e,
+ /* fc */ 0xee8a8f, 0xee8a90, 0xee8a91,
+
+ /*** Two byte table, leaf: f9xx - offset 0x05ac5 ***/
+
+ /* 40 */ 0xe9b583, 0xe9b584, 0xe9b585, 0xe9b586,
+ /* 44 */ 0xe9b587, 0xe9b588, 0xe9b589, 0xe9b58a,
+ /* 48 */ 0xe9b58b, 0xe9b58c, 0xe9b58d, 0xe9b58e,
+ /* 4c */ 0xe9b58f, 0xe9b590, 0xe9b591, 0xe9b592,
+ /* 50 */ 0xe9b593, 0xe9b594, 0xe9b595, 0xe9b596,
+ /* 54 */ 0xe9b597, 0xe9b598, 0xe9b599, 0xe9b59a,
+ /* 58 */ 0xe9b59b, 0xe9b59c, 0xe9b59d, 0xe9b59e,
+ /* 5c */ 0xe9b59f, 0xe9b5a0, 0xe9b5a1, 0xe9b5a2,
+ /* 60 */ 0xe9b5a3, 0xe9b5a4, 0xe9b5a5, 0xe9b5a6,
+ /* 64 */ 0xe9b5a7, 0xe9b5a8, 0xe9b5a9, 0xe9b5aa,
+ /* 68 */ 0xe9b5ab, 0xe9b5ac, 0xe9b5ad, 0xe9b5ae,
+ /* 6c */ 0xe9b5af, 0xe9b5b0, 0xe9b5b1, 0xe9b5b2,
+ /* 70 */ 0xe9b5b3, 0xe9b5b4, 0xe9b5b5, 0xe9b5b6,
+ /* 74 */ 0xe9b5b7, 0xe9b5b8, 0xe9b5b9, 0xe9b5ba,
+ /* 78 */ 0xe9b5bb, 0xe9b5bc, 0xe9b5bd, 0xe9b5be,
+ /* 7c */ 0xe9b5bf, 0xe9b680, 0xe9b681, 0x000000,
+ /* 80 */ 0xe9b682, 0xe9b683, 0xe9b684, 0xe9b685,
+ /* 84 */ 0xe9b686, 0xe9b687, 0xe9b688, 0xe9b689,
+ /* 88 */ 0xe9b68a, 0xe9b68b, 0xe9b68c, 0xe9b68d,
+ /* 8c */ 0xe9b68e, 0xe9b68f, 0xe9b690, 0xe9b691,
+ /* 90 */ 0xe9b692, 0xe9b693, 0xe9b694, 0xe9b695,
+ /* 94 */ 0xe9b696, 0xe9b697, 0xe9b698, 0xe9b699,
+ /* 98 */ 0xe9b69a, 0xe9b69b, 0xe9b69c, 0xe9b69d,
+ /* 9c */ 0xe9b69e, 0xe9b69f, 0xe9b6a0, 0xe9b6a1,
+ /* a0 */ 0xe9b6a2, 0xee8a92, 0xee8a93, 0xee8a94,
+ /* a4 */ 0xee8a95, 0xee8a96, 0xee8a97, 0xee8a98,
+ /* a8 */ 0xee8a99, 0xee8a9a, 0xee8a9b, 0xee8a9c,
+ /* ac */ 0xee8a9d, 0xee8a9e, 0xee8a9f, 0xee8aa0,
+ /* b0 */ 0xee8aa1, 0xee8aa2, 0xee8aa3, 0xee8aa4,
+ /* b4 */ 0xee8aa5, 0xee8aa6, 0xee8aa7, 0xee8aa8,
+ /* b8 */ 0xee8aa9, 0xee8aaa, 0xee8aab, 0xee8aac,
+ /* bc */ 0xee8aad, 0xee8aae, 0xee8aaf, 0xee8ab0,
+ /* c0 */ 0xee8ab1, 0xee8ab2, 0xee8ab3, 0xee8ab4,
+ /* c4 */ 0xee8ab5, 0xee8ab6, 0xee8ab7, 0xee8ab8,
+ /* c8 */ 0xee8ab9, 0xee8aba, 0xee8abb, 0xee8abc,
+ /* cc */ 0xee8abd, 0xee8abe, 0xee8abf, 0xee8b80,
+ /* d0 */ 0xee8b81, 0xee8b82, 0xee8b83, 0xee8b84,
+ /* d4 */ 0xee8b85, 0xee8b86, 0xee8b87, 0xee8b88,
+ /* d8 */ 0xee8b89, 0xee8b8a, 0xee8b8b, 0xee8b8c,
+ /* dc */ 0xee8b8d, 0xee8b8e, 0xee8b8f, 0xee8b90,
+ /* e0 */ 0xee8b91, 0xee8b92, 0xee8b93, 0xee8b94,
+ /* e4 */ 0xee8b95, 0xee8b96, 0xee8b97, 0xee8b98,
+ /* e8 */ 0xee8b99, 0xee8b9a, 0xee8b9b, 0xee8b9c,
+ /* ec */ 0xee8b9d, 0xee8b9e, 0xee8b9f, 0xee8ba0,
+ /* f0 */ 0xee8ba1, 0xee8ba2, 0xee8ba3, 0xee8ba4,
+ /* f4 */ 0xee8ba5, 0xee8ba6, 0xee8ba7, 0xee8ba8,
+ /* f8 */ 0xee8ba9, 0xee8baa, 0xee8bab, 0xee8bac,
+ /* fc */ 0xee8bad, 0xee8bae, 0xee8baf,
+
+ /*** Two byte table, leaf: faxx - offset 0x05b84 ***/
+
+ /* 40 */ 0xe9b6a3, 0xe9b6a4, 0xe9b6a5, 0xe9b6a6,
+ /* 44 */ 0xe9b6a7, 0xe9b6a8, 0xe9b6a9, 0xe9b6aa,
+ /* 48 */ 0xe9b6ab, 0xe9b6ac, 0xe9b6ad, 0xe9b6ae,
+ /* 4c */ 0xe9b6af, 0xe9b6b0, 0xe9b6b1, 0xe9b6b2,
+ /* 50 */ 0xe9b6b3, 0xe9b6b4, 0xe9b6b5, 0xe9b6b6,
+ /* 54 */ 0xe9b6b7, 0xe9b6b8, 0xe9b6b9, 0xe9b6ba,
+ /* 58 */ 0xe9b6bb, 0xe9b6bc, 0xe9b6bd, 0xe9b6be,
+ /* 5c */ 0xe9b6bf, 0xe9b780, 0xe9b781, 0xe9b782,
+ /* 60 */ 0xe9b783, 0xe9b784, 0xe9b785, 0xe9b786,
+ /* 64 */ 0xe9b787, 0xe9b788, 0xe9b789, 0xe9b78a,
+ /* 68 */ 0xe9b78b, 0xe9b78c, 0xe9b78d, 0xe9b78e,
+ /* 6c */ 0xe9b78f, 0xe9b790, 0xe9b791, 0xe9b792,
+ /* 70 */ 0xe9b793, 0xe9b794, 0xe9b795, 0xe9b796,
+ /* 74 */ 0xe9b797, 0xe9b798, 0xe9b799, 0xe9b79a,
+ /* 78 */ 0xe9b79b, 0xe9b79c, 0xe9b79d, 0xe9b79e,
+ /* 7c */ 0xe9b79f, 0xe9b7a0, 0xe9b7a1, 0x000000,
+ /* 80 */ 0xe9b7a2, 0xe9b7a3, 0xe9b7a4, 0xe9b7a5,
+ /* 84 */ 0xe9b7a6, 0xe9b7a7, 0xe9b7a8, 0xe9b7a9,
+ /* 88 */ 0xe9b7aa, 0xe9b7ab, 0xe9b7ac, 0xe9b7ad,
+ /* 8c */ 0xe9b7ae, 0xe9b7af, 0xe9b7b0, 0xe9b7b1,
+ /* 90 */ 0xe9b7b2, 0xe9b7b3, 0xe9b7b4, 0xe9b7b5,
+ /* 94 */ 0xe9b7b6, 0xe9b7b7, 0xe9b7b8, 0xe9b7b9,
+ /* 98 */ 0xe9b7ba, 0xe9b7bb, 0xe9b7bc, 0xe9b7bd,
+ /* 9c */ 0xe9b7be, 0xe9b7bf, 0xe9b880, 0xe9b881,
+ /* a0 */ 0xe9b882, 0xee8bb0, 0xee8bb1, 0xee8bb2,
+ /* a4 */ 0xee8bb3, 0xee8bb4, 0xee8bb5, 0xee8bb6,
+ /* a8 */ 0xee8bb7, 0xee8bb8, 0xee8bb9, 0xee8bba,
+ /* ac */ 0xee8bbb, 0xee8bbc, 0xee8bbd, 0xee8bbe,
+ /* b0 */ 0xee8bbf, 0xee8c80, 0xee8c81, 0xee8c82,
+ /* b4 */ 0xee8c83, 0xee8c84, 0xee8c85, 0xee8c86,
+ /* b8 */ 0xee8c87, 0xee8c88, 0xee8c89, 0xee8c8a,
+ /* bc */ 0xee8c8b, 0xee8c8c, 0xee8c8d, 0xee8c8e,
+ /* c0 */ 0xee8c8f, 0xee8c90, 0xee8c91, 0xee8c92,
+ /* c4 */ 0xee8c93, 0xee8c94, 0xee8c95, 0xee8c96,
+ /* c8 */ 0xee8c97, 0xee8c98, 0xee8c99, 0xee8c9a,
+ /* cc */ 0xee8c9b, 0xee8c9c, 0xee8c9d, 0xee8c9e,
+ /* d0 */ 0xee8c9f, 0xee8ca0, 0xee8ca1, 0xee8ca2,
+ /* d4 */ 0xee8ca3, 0xee8ca4, 0xee8ca5, 0xee8ca6,
+ /* d8 */ 0xee8ca7, 0xee8ca8, 0xee8ca9, 0xee8caa,
+ /* dc */ 0xee8cab, 0xee8cac, 0xee8cad, 0xee8cae,
+ /* e0 */ 0xee8caf, 0xee8cb0, 0xee8cb1, 0xee8cb2,
+ /* e4 */ 0xee8cb3, 0xee8cb4, 0xee8cb5, 0xee8cb6,
+ /* e8 */ 0xee8cb7, 0xee8cb8, 0xee8cb9, 0xee8cba,
+ /* ec */ 0xee8cbb, 0xee8cbc, 0xee8cbd, 0xee8cbe,
+ /* f0 */ 0xee8cbf, 0xee8d80, 0xee8d81, 0xee8d82,
+ /* f4 */ 0xee8d83, 0xee8d84, 0xee8d85, 0xee8d86,
+ /* f8 */ 0xee8d87, 0xee8d88, 0xee8d89, 0xee8d8a,
+ /* fc */ 0xee8d8b, 0xee8d8c, 0xee8d8d,
+
+ /*** Two byte table, leaf: fbxx - offset 0x05c43 ***/
+
+ /* 40 */ 0xe9b883, 0xe9b884, 0xe9b885, 0xe9b886,
+ /* 44 */ 0xe9b887, 0xe9b888, 0xe9b889, 0xe9b88a,
+ /* 48 */ 0xe9b88b, 0xe9b88c, 0xe9b88d, 0xe9b88e,
+ /* 4c */ 0xe9b88f, 0xe9b890, 0xe9b891, 0xe9b892,
+ /* 50 */ 0xe9b893, 0xe9b894, 0xe9b895, 0xe9b896,
+ /* 54 */ 0xe9b897, 0xe9b898, 0xe9b899, 0xe9b89a,
+ /* 58 */ 0xe9b89b, 0xe9b89c, 0xe9b89d, 0xe9b89e,
+ /* 5c */ 0xe9b8a4, 0xe9b8a7, 0xe9b8ae, 0xe9b8b0,
+ /* 60 */ 0xe9b8b4, 0xe9b8bb, 0xe9b8bc, 0xe9b980,
+ /* 64 */ 0xe9b98d, 0xe9b990, 0xe9b992, 0xe9b993,
+ /* 68 */ 0xe9b994, 0xe9b996, 0xe9b999, 0xe9b99d,
+ /* 6c */ 0xe9b99f, 0xe9b9a0, 0xe9b9a1, 0xe9b9a2,
+ /* 70 */ 0xe9b9a5, 0xe9b9ae, 0xe9b9af, 0xe9b9b2,
+ /* 74 */ 0xe9b9b4, 0xe9b9b5, 0xe9b9b6, 0xe9b9b7,
+ /* 78 */ 0xe9b9b8, 0xe9b9b9, 0xe9b9ba, 0xe9b9bb,
+ /* 7c */ 0xe9b9bc, 0xe9b9bd, 0xe9ba80, 0x000000,
+ /* 80 */ 0xe9ba81, 0xe9ba83, 0xe9ba84, 0xe9ba85,
+ /* 84 */ 0xe9ba86, 0xe9ba89, 0xe9ba8a, 0xe9ba8c,
+ /* 88 */ 0xe9ba8d, 0xe9ba8e, 0xe9ba8f, 0xe9ba90,
+ /* 8c */ 0xe9ba91, 0xe9ba94, 0xe9ba95, 0xe9ba96,
+ /* 90 */ 0xe9ba97, 0xe9ba98, 0xe9ba99, 0xe9ba9a,
+ /* 94 */ 0xe9ba9b, 0xe9ba9c, 0xe9ba9e, 0xe9baa0,
+ /* 98 */ 0xe9baa1, 0xe9baa2, 0xe9baa3, 0xe9baa4,
+ /* 9c */ 0xe9baa5, 0xe9baa7, 0xe9baa8, 0xe9baa9,
+ /* a0 */ 0xe9baaa, 0xee8d8e, 0xee8d8f, 0xee8d90,
+ /* a4 */ 0xee8d91, 0xee8d92, 0xee8d93, 0xee8d94,
+ /* a8 */ 0xee8d95, 0xee8d96, 0xee8d97, 0xee8d98,
+ /* ac */ 0xee8d99, 0xee8d9a, 0xee8d9b, 0xee8d9c,
+ /* b0 */ 0xee8d9d, 0xee8d9e, 0xee8d9f, 0xee8da0,
+ /* b4 */ 0xee8da1, 0xee8da2, 0xee8da3, 0xee8da4,
+ /* b8 */ 0xee8da5, 0xee8da6, 0xee8da7, 0xee8da8,
+ /* bc */ 0xee8da9, 0xee8daa, 0xee8dab, 0xee8dac,
+ /* c0 */ 0xee8dad, 0xee8dae, 0xee8daf, 0xee8db0,
+ /* c4 */ 0xee8db1, 0xee8db2, 0xee8db3, 0xee8db4,
+ /* c8 */ 0xee8db5, 0xee8db6, 0xee8db7, 0xee8db8,
+ /* cc */ 0xee8db9, 0xee8dba, 0xee8dbb, 0xee8dbc,
+ /* d0 */ 0xee8dbd, 0xee8dbe, 0xee8dbf, 0xee8e80,
+ /* d4 */ 0xee8e81, 0xee8e82, 0xee8e83, 0xee8e84,
+ /* d8 */ 0xee8e85, 0xee8e86, 0xee8e87, 0xee8e88,
+ /* dc */ 0xee8e89, 0xee8e8a, 0xee8e8b, 0xee8e8c,
+ /* e0 */ 0xee8e8d, 0xee8e8e, 0xee8e8f, 0xee8e90,
+ /* e4 */ 0xee8e91, 0xee8e92, 0xee8e93, 0xee8e94,
+ /* e8 */ 0xee8e95, 0xee8e96, 0xee8e97, 0xee8e98,
+ /* ec */ 0xee8e99, 0xee8e9a, 0xee8e9b, 0xee8e9c,
+ /* f0 */ 0xee8e9d, 0xee8e9e, 0xee8e9f, 0xee8ea0,
+ /* f4 */ 0xee8ea1, 0xee8ea2, 0xee8ea3, 0xee8ea4,
+ /* f8 */ 0xee8ea5, 0xee8ea6, 0xee8ea7, 0xee8ea8,
+ /* fc */ 0xee8ea9, 0xee8eaa, 0xee8eab,
+
+ /*** Two byte table, leaf: fcxx - offset 0x05d02 ***/
+
+ /* 40 */ 0xe9baab, 0xe9baac, 0xe9baad, 0xe9baae,
+ /* 44 */ 0xe9baaf, 0xe9bab0, 0xe9bab1, 0xe9bab2,
+ /* 48 */ 0xe9bab3, 0xe9bab5, 0xe9bab6, 0xe9bab7,
+ /* 4c */ 0xe9bab9, 0xe9baba, 0xe9babc, 0xe9babf,
+ /* 50 */ 0xe9bb80, 0xe9bb81, 0xe9bb82, 0xe9bb83,
+ /* 54 */ 0xe9bb85, 0xe9bb86, 0xe9bb87, 0xe9bb88,
+ /* 58 */ 0xe9bb8a, 0xe9bb8b, 0xe9bb8c, 0xe9bb90,
+ /* 5c */ 0xe9bb92, 0xe9bb93, 0xe9bb95, 0xe9bb96,
+ /* 60 */ 0xe9bb97, 0xe9bb99, 0xe9bb9a, 0xe9bb9e,
+ /* 64 */ 0xe9bba1, 0xe9bba3, 0xe9bba4, 0xe9bba6,
+ /* 68 */ 0xe9bba8, 0xe9bbab, 0xe9bbac, 0xe9bbad,
+ /* 6c */ 0xe9bbae, 0xe9bbb0, 0xe9bbb1, 0xe9bbb2,
+ /* 70 */ 0xe9bbb3, 0xe9bbb4, 0xe9bbb5, 0xe9bbb6,
+ /* 74 */ 0xe9bbb7, 0xe9bbb8, 0xe9bbba, 0xe9bbbd,
+ /* 78 */ 0xe9bbbf, 0xe9bc80, 0xe9bc81, 0xe9bc82,
+ /* 7c */ 0xe9bc83, 0xe9bc84, 0xe9bc85, 0x000000,
+ /* 80 */ 0xe9bc86, 0xe9bc87, 0xe9bc88, 0xe9bc89,
+ /* 84 */ 0xe9bc8a, 0xe9bc8c, 0xe9bc8f, 0xe9bc91,
+ /* 88 */ 0xe9bc92, 0xe9bc94, 0xe9bc95, 0xe9bc96,
+ /* 8c */ 0xe9bc98, 0xe9bc9a, 0xe9bc9b, 0xe9bc9c,
+ /* 90 */ 0xe9bc9d, 0xe9bc9e, 0xe9bc9f, 0xe9bca1,
+ /* 94 */ 0xe9bca3, 0xe9bca4, 0xe9bca5, 0xe9bca6,
+ /* 98 */ 0xe9bca7, 0xe9bca8, 0xe9bca9, 0xe9bcaa,
+ /* 9c */ 0xe9bcab, 0xe9bcad, 0xe9bcae, 0xe9bcb0,
+ /* a0 */ 0xe9bcb1, 0xee8eac, 0xee8ead, 0xee8eae,
+ /* a4 */ 0xee8eaf, 0xee8eb0, 0xee8eb1, 0xee8eb2,
+ /* a8 */ 0xee8eb3, 0xee8eb4, 0xee8eb5, 0xee8eb6,
+ /* ac */ 0xee8eb7, 0xee8eb8, 0xee8eb9, 0xee8eba,
+ /* b0 */ 0xee8ebb, 0xee8ebc, 0xee8ebd, 0xee8ebe,
+ /* b4 */ 0xee8ebf, 0xee8f80, 0xee8f81, 0xee8f82,
+ /* b8 */ 0xee8f83, 0xee8f84, 0xee8f85, 0xee8f86,
+ /* bc */ 0xee8f87, 0xee8f88, 0xee8f89, 0xee8f8a,
+ /* c0 */ 0xee8f8b, 0xee8f8c, 0xee8f8d, 0xee8f8e,
+ /* c4 */ 0xee8f8f, 0xee8f90, 0xee8f91, 0xee8f92,
+ /* c8 */ 0xee8f93, 0xee8f94, 0xee8f95, 0xee8f96,
+ /* cc */ 0xee8f97, 0xee8f98, 0xee8f99, 0xee8f9a,
+ /* d0 */ 0xee8f9b, 0xee8f9c, 0xee8f9d, 0xee8f9e,
+ /* d4 */ 0xee8f9f, 0xee8fa0, 0xee8fa1, 0xee8fa2,
+ /* d8 */ 0xee8fa3, 0xee8fa4, 0xee8fa5, 0xee8fa6,
+ /* dc */ 0xee8fa7, 0xee8fa8, 0xee8fa9, 0xee8faa,
+ /* e0 */ 0xee8fab, 0xee8fac, 0xee8fad, 0xee8fae,
+ /* e4 */ 0xee8faf, 0xee8fb0, 0xee8fb1, 0xee8fb2,
+ /* e8 */ 0xee8fb3, 0xee8fb4, 0xee8fb5, 0xee8fb6,
+ /* ec */ 0xee8fb7, 0xee8fb8, 0xee8fb9, 0xee8fba,
+ /* f0 */ 0xee8fbb, 0xee8fbc, 0xee8fbd, 0xee8fbe,
+ /* f4 */ 0xee8fbf, 0xee9080, 0xee9081, 0xee9082,
+ /* f8 */ 0xee9083, 0xee9084, 0xee9085, 0xee9086,
+ /* fc */ 0xee9087, 0xee9088, 0xee9089,
+
+ /*** Two byte table, leaf: fdxx - offset 0x05dc1 ***/
+
+ /* 40 */ 0xe9bcb2, 0xe9bcb3, 0xe9bcb4, 0xe9bcb5,
+ /* 44 */ 0xe9bcb6, 0xe9bcb8, 0xe9bcba, 0xe9bcbc,
+ /* 48 */ 0xe9bcbf, 0xe9bd80, 0xe9bd81, 0xe9bd82,
+ /* 4c */ 0xe9bd83, 0xe9bd85, 0xe9bd86, 0xe9bd87,
+ /* 50 */ 0xe9bd88, 0xe9bd89, 0xe9bd8a, 0xe9bd8b,
+ /* 54 */ 0xe9bd8c, 0xe9bd8d, 0xe9bd8e, 0xe9bd8f,
+ /* 58 */ 0xe9bd92, 0xe9bd93, 0xe9bd94, 0xe9bd95,
+ /* 5c */ 0xe9bd96, 0xe9bd97, 0xe9bd98, 0xe9bd99,
+ /* 60 */ 0xe9bd9a, 0xe9bd9b, 0xe9bd9c, 0xe9bd9d,
+ /* 64 */ 0xe9bd9e, 0xe9bd9f, 0xe9bda0, 0xe9bda1,
+ /* 68 */ 0xe9bda2, 0xe9bda3, 0xe9bda4, 0xe9bda5,
+ /* 6c */ 0xe9bda6, 0xe9bda7, 0xe9bda8, 0xe9bda9,
+ /* 70 */ 0xe9bdaa, 0xe9bdab, 0xe9bdac, 0xe9bdad,
+ /* 74 */ 0xe9bdae, 0xe9bdaf, 0xe9bdb0, 0xe9bdb1,
+ /* 78 */ 0xe9bdb2, 0xe9bdb3, 0xe9bdb4, 0xe9bdb5,
+ /* 7c */ 0xe9bdb6, 0xe9bdb7, 0xe9bdb8, 0x000000,
+ /* 80 */ 0xe9bdb9, 0xe9bdba, 0xe9bdbb, 0xe9bdbc,
+ /* 84 */ 0xe9bdbd, 0xe9bdbe, 0xe9be81, 0xe9be82,
+ /* 88 */ 0xe9be8d, 0xe9be8e, 0xe9be8f, 0xe9be90,
+ /* 8c */ 0xe9be91, 0xe9be92, 0xe9be93, 0xe9be94,
+ /* 90 */ 0xe9be95, 0xe9be96, 0xe9be97, 0xe9be98,
+ /* 94 */ 0xe9be9c, 0xe9be9d, 0xe9be9e, 0xe9bea1,
+ /* 98 */ 0xe9bea2, 0xe9bea3, 0xe9bea4, 0xe9bea5,
+ /* 9c */ 0xefa4ac, 0xefa5b9, 0xefa695, 0xefa7a7,
+ /* a0 */ 0xefa7b1, 0xee908a, 0xee908b, 0xee908c,
+ /* a4 */ 0xee908d, 0xee908e, 0xee908f, 0xee9090,
+ /* a8 */ 0xee9091, 0xee9092, 0xee9093, 0xee9094,
+ /* ac */ 0xee9095, 0xee9096, 0xee9097, 0xee9098,
+ /* b0 */ 0xee9099, 0xee909a, 0xee909b, 0xee909c,
+ /* b4 */ 0xee909d, 0xee909e, 0xee909f, 0xee90a0,
+ /* b8 */ 0xee90a1, 0xee90a2, 0xee90a3, 0xee90a4,
+ /* bc */ 0xee90a5, 0xee90a6, 0xee90a7, 0xee90a8,
+ /* c0 */ 0xee90a9, 0xee90aa, 0xee90ab, 0xee90ac,
+ /* c4 */ 0xee90ad, 0xee90ae, 0xee90af, 0xee90b0,
+ /* c8 */ 0xee90b1, 0xee90b2, 0xee90b3, 0xee90b4,
+ /* cc */ 0xee90b5, 0xee90b6, 0xee90b7, 0xee90b8,
+ /* d0 */ 0xee90b9, 0xee90ba, 0xee90bb, 0xee90bc,
+ /* d4 */ 0xee90bd, 0xee90be, 0xee90bf, 0xee9180,
+ /* d8 */ 0xee9181, 0xee9182, 0xee9183, 0xee9184,
+ /* dc */ 0xee9185, 0xee9186, 0xee9187, 0xee9188,
+ /* e0 */ 0xee9189, 0xee918a, 0xee918b, 0xee918c,
+ /* e4 */ 0xee918d, 0xee918e, 0xee918f, 0xee9190,
+ /* e8 */ 0xee9191, 0xee9192, 0xee9193, 0xee9194,
+ /* ec */ 0xee9195, 0xee9196, 0xee9197, 0xee9198,
+ /* f0 */ 0xee9199, 0xee919a, 0xee919b, 0xee919c,
+ /* f4 */ 0xee919d, 0xee919e, 0xee919f, 0xee91a0,
+ /* f8 */ 0xee91a1, 0xee91a2, 0xee91a3, 0xee91a4,
+ /* fc */ 0xee91a5, 0xee91a6, 0xee91a7,
+
+ /*** Two byte table, leaf: fexx - offset 0x05e80 ***/
+
+ /* 40 */ 0xefa88c, 0xefa88d, 0xefa88e, 0xefa88f,
+ /* 44 */ 0xefa891, 0xefa893, 0xefa894, 0xefa898,
+ /* 48 */ 0xefa89f, 0xefa8a0, 0xefa8a1, 0xefa8a3,
+ /* 4c */ 0xefa8a4, 0xefa8a7, 0xefa8a8, 0xefa8a9,
+ /* 50 */ 0xe2ba81, 0xeea096, 0xeea097, 0xeea098,
+ /* 54 */ 0xe2ba84, 0xe391b3, 0xe39187, 0xe2ba88,
+ /* 58 */ 0xe2ba8b, 0xeea09e, 0xe3969e, 0xe3989a,
+ /* 5c */ 0xe3988e, 0xe2ba8c, 0xe2ba97, 0xe3a5ae,
+ /* 60 */ 0xe3a498, 0xeea0a6, 0xe3a78f, 0xe3a79f,
+ /* 64 */ 0xe3a9b3, 0xe3a790, 0xeea0ab, 0xeea0ac,
+ /* 68 */ 0xe3ad8e, 0xe3b1ae, 0xe3b3a0, 0xe2baa7,
+ /* 6c */ 0xeea0b1, 0xeea0b2, 0xe2baaa, 0xe48196,
+ /* 70 */ 0xe4859f, 0xe2baae, 0xe48cb7, 0xe2bab3,
+ /* 74 */ 0xe2bab6, 0xe2bab7, 0xeea0bb, 0xe48eb1,
+ /* 78 */ 0xe48eac, 0xe2babb, 0xe48f9d, 0xe49396,
+ /* 7c */ 0xe499a1, 0xe4998c, 0xeea183, 0x000000,
+ /* 80 */ 0xe49ca3, 0xe49ca9, 0xe49dbc, 0xe49e8d,
+ /* 84 */ 0xe2bb8a, 0xe4a587, 0xe4a5ba, 0xe4a5bd,
+ /* 88 */ 0xe4a682, 0xe4a683, 0xe4a685, 0xe4a686,
+ /* 8c */ 0xe4a69f, 0xe4a69b, 0xe4a6b7, 0xe4a6b6,
+ /* 90 */ 0xeea194, 0xeea195, 0xe4b2a3, 0xe4b29f,
+ /* 94 */ 0xe4b2a0, 0xe4b2a1, 0xe4b1b7, 0xe4b2a2,
+ /* 98 */ 0xe4b493, 0xe4b494, 0xe4b495, 0xe4b496,
+ /* 9c */ 0xe4b497, 0xe4b498, 0xe4b499, 0xe4b6ae,
+ /* a0 */ 0xeea1a4, 0xee91a8, 0xee91a9, 0xee91aa,
+ /* a4 */ 0xee91ab, 0xee91ac, 0xee91ad, 0xee91ae,
+ /* a8 */ 0xee91af, 0xee91b0, 0xee91b1, 0xee91b2,
+ /* ac */ 0xee91b3, 0xee91b4, 0xee91b5, 0xee91b6,
+ /* b0 */ 0xee91b7, 0xee91b8, 0xee91b9, 0xee91ba,
+ /* b4 */ 0xee91bb, 0xee91bc, 0xee91bd, 0xee91be,
+ /* b8 */ 0xee91bf, 0xee9280, 0xee9281, 0xee9282,
+ /* bc */ 0xee9283, 0xee9284, 0xee9285, 0xee9286,
+ /* c0 */ 0xee9287, 0xee9288, 0xee9289, 0xee928a,
+ /* c4 */ 0xee928b, 0xee928c, 0xee928d, 0xee928e,
+ /* c8 */ 0xee928f, 0xee9290, 0xee9291, 0xee9292,
+ /* cc */ 0xee9293, 0xee9294, 0xee9295, 0xee9296,
+ /* d0 */ 0xee9297, 0xee9298, 0xee9299, 0xee929a,
+ /* d4 */ 0xee929b, 0xee929c, 0xee929d, 0xee929e,
+ /* d8 */ 0xee929f, 0xee92a0, 0xee92a1, 0xee92a2,
+ /* dc */ 0xee92a3, 0xee92a4, 0xee92a5, 0xee92a6,
+ /* e0 */ 0xee92a7, 0xee92a8, 0xee92a9, 0xee92aa,
+ /* e4 */ 0xee92ab, 0xee92ac, 0xee92ad, 0xee92ae,
+ /* e8 */ 0xee92af, 0xee92b0, 0xee92b1, 0xee92b2,
+ /* ec */ 0xee92b3, 0xee92b4, 0xee92b5, 0xee92b6,
+ /* f0 */ 0xee92b7, 0xee92b8, 0xee92b9, 0xee92ba,
+ /* f4 */ 0xee92bb, 0xee92bc, 0xee92bd, 0xee92be,
+ /* f8 */ 0xee92bf, 0xee9380, 0xee9381, 0xee9382,
+ /* fc */ 0xee9383, 0xee9384, 0xee9385,
+
+ /*** Four byte table, byte #1: xx - offset 0x05f3f ***/
+
+ /* 81 */ 0x005f43, 0x005f4d, 0x005f53, 0x005f5d,
+
+ /*** Four byte table, byte #2: 81xx - offset 0x05f43 ***/
+
+ /* 30 */ 0x005f67, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x005fc1, 0x00603f,
+ /* 38 */ 0x006067, 0x0060e5,
+
+ /*** Four byte table, byte #2: 82xx - offset 0x05f4d ***/
+
+ /* 30 */ 0x006163, 0x0061e1, 0x006235, 0x0062b3,
+ /* 34 */ 0x00631c, 0x00639a,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #2: 83xx - offset 0x05f53 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x0063d2, 0x000000,
+ /* 38 */ 0x000000, 0x000000,
+
+ /*** Four byte table, byte #2: 84xx - offset 0x05f5d ***/
+
+ /* 30 */ 0x00644c, 0x0064c6, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000,
+
+ /*** Four byte table, byte #3: 8130xx - offset 0x05f67 ***/
+
+ /* 81 */ 0x006544, 0x00654e, 0x006558, 0x006562,
+ /* 85 */ 0x00656c, 0x006576, 0x006580, 0x00658a,
+ /* 89 */ 0x006594, 0x00659e, 0x0065a8, 0x0065b2,
+ /* 8d */ 0x0065bc, 0x0065c6, 0x0065d0, 0x0065da,
+ /* 91 */ 0x0065e4, 0x0065ee, 0x0065f8, 0x006602,
+ /* 95 */ 0x00660c, 0x006616, 0x006620, 0x00662a,
+ /* 99 */ 0x006634, 0x00663e, 0x006648, 0x006652,
+ /* 9d */ 0x00665c, 0x006666, 0x006670, 0x00667a,
+ /* a1 */ 0x006684, 0x00668e, 0x006698, 0x0066a2,
+ /* a5 */ 0x0066ac, 0x0066b6, 0x0066c0, 0x0066ca,
+ /* a9 */ 0x0066d4, 0x0066de, 0x0066e8, 0x0066f2,
+ /* ad */ 0x0066fc, 0x006706, 0x006710, 0x00671a,
+ /* b1 */ 0x006724, 0x00672e, 0x006738, 0x006742,
+ /* b5 */ 0x00674c, 0x006756, 0x006760, 0x00676a,
+ /* b9 */ 0x006774, 0x00677e, 0x006788, 0x006792,
+ /* bd */ 0x00679c, 0x0067a6, 0x0067b0, 0x0067ba,
+ /* c1 */ 0x0067c4, 0x0067ce, 0x0067d8, 0x0067e2,
+ /* c5 */ 0x0067ec, 0x0067f6, 0x006800, 0x00680a,
+ /* c9 */ 0x006814, 0x00681e, 0x006828, 0x006832,
+ /* cd */ 0x00683c, 0x006846, 0x006850, 0x00685a,
+ /* d1 */ 0x006864, 0x00686e, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8136xx - offset 0x05fc1 ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x006878, 0x006882, 0x00688c, 0x006896,
+ /* a9 */ 0x0068a0, 0x0068aa, 0x0068b4, 0x0068be,
+ /* ad */ 0x0068c8, 0x0068d2, 0x0068dc, 0x0068e6,
+ /* b1 */ 0x0068f0, 0x0068fa, 0x006904, 0x00690e,
+ /* b5 */ 0x006918, 0x006922, 0x00692c, 0x006936,
+ /* b9 */ 0x006940, 0x00694a, 0x006954, 0x00695e,
+ /* bd */ 0x006968, 0x006972, 0x00697c, 0x006986,
+ /* c1 */ 0x006990, 0x00699a, 0x0069a4, 0x0069ae,
+ /* c5 */ 0x0069b8, 0x0069c2, 0x0069cc, 0x0069d6,
+ /* c9 */ 0x0069e0, 0x0069ea, 0x0069f4, 0x0069fe,
+ /* cd */ 0x006a08, 0x006a12, 0x006a1c, 0x006a26,
+ /* d1 */ 0x006a30, 0x006a3a, 0x006a44, 0x006a4e,
+ /* d5 */ 0x006a58, 0x006a62, 0x006a6c, 0x006a76,
+ /* d9 */ 0x006a80, 0x006a8a, 0x006a94, 0x006a9e,
+ /* dd */ 0x006aa8, 0x006ab2, 0x006abc, 0x006ac6,
+ /* e1 */ 0x006ad0, 0x006ada, 0x006ae4, 0x006aee,
+ /* e5 */ 0x006af8, 0x006b02, 0x006b0c, 0x006b16,
+ /* e9 */ 0x006b20, 0x006b2a, 0x006b34, 0x006b3e,
+ /* ed */ 0x006b48, 0x006b52, 0x006b5c, 0x006b66,
+ /* f1 */ 0x006b70, 0x006b7a, 0x006b84, 0x006b8e,
+ /* f5 */ 0x006b98, 0x006ba2, 0x006bac, 0x006bb6,
+ /* f9 */ 0x006bc0, 0x006bca, 0x006bd4, 0x006bde,
+ /* fd */ 0x006be8, 0x006bf2,
+
+ /*** Four byte table, byte #3: 8137xx - offset 0x0603f ***/
+
+ /* 81 */ 0x006bfc, 0x006c06, 0x006c10, 0x006c1a,
+ /* 85 */ 0x006c24, 0x006c2e, 0x006c38, 0x006c42,
+ /* 89 */ 0x006c4c, 0x006c56, 0x006c60, 0x006c6a,
+ /* 8d */ 0x006c74, 0x006c7e, 0x006c88, 0x006c92,
+ /* 91 */ 0x006c9c, 0x006ca6, 0x006cb0, 0x006cba,
+ /* 95 */ 0x006cc4, 0x006cce, 0x006cd8, 0x006ce2,
+ /* 99 */ 0x006cec, 0x006cf6, 0x006d00, 0x006d0a,
+ /* 9d */ 0x006d14, 0x006d1e, 0x006d28, 0x006d32,
+ /* a1 */ 0x006d3c, 0x006d46, 0x006d50, 0x006d5a,
+ /* a5 */ 0x006d64, 0x006d6e, 0x006d78, 0x006d82,
+ /* 86 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8138xx - offset 0x06067 ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x006d8b, 0x006d95,
+
+ /*** Four byte table, byte #3: 8139xx - offset 0x060e5 ***/
+
+ /* 81 */ 0x006d9f, 0x006da9, 0x006db3, 0x006dbd,
+ /* 85 */ 0x006dc7, 0x006dd1, 0x006ddb, 0x006de5,
+ /* 89 */ 0x006def, 0x006df9, 0x006e03, 0x006e0d,
+ /* 8d */ 0x006e17, 0x006e21, 0x006e2b, 0x006e35,
+ /* 91 */ 0x006e3f, 0x006e49, 0x006e53, 0x006e5d,
+ /* 95 */ 0x006e67, 0x006e71, 0x006e7b, 0x006e85,
+ /* 99 */ 0x006e8f, 0x006e99, 0x006ea3, 0x006ead,
+ /* 9d */ 0x006eb7, 0x006ec1, 0x006ecb, 0x006ed5,
+ /* a1 */ 0x006edf, 0x006ee9, 0x006ef3, 0x006efd,
+ /* a5 */ 0x006f07, 0x006f11, 0x006f1b, 0x006f25,
+ /* a9 */ 0x006f2f, 0x006f39, 0x006f43, 0x006f4d,
+ /* ad */ 0x006f57, 0x006f61, 0x006f6b, 0x006f75,
+ /* b1 */ 0x006f7f, 0x006f89, 0x006f93, 0x006f9d,
+ /* b5 */ 0x006fa7, 0x006fb1, 0x006fbb, 0x006fc5,
+ /* b9 */ 0x006fcf, 0x006fd9, 0x006fe3, 0x006fed,
+ /* bd */ 0x006ff7, 0x007001, 0x00700b, 0x007015,
+ /* c1 */ 0x00701f, 0x007029, 0x007033, 0x00703d,
+ /* c5 */ 0x007047, 0x007051, 0x00705b, 0x007065,
+ /* c9 */ 0x00706f, 0x007079, 0x007083, 0x00708d,
+ /* cd */ 0x007097, 0x0070a1, 0x0070ab, 0x0070b5,
+ /* d1 */ 0x0070bf, 0x0070c9, 0x0070d3, 0x0070dd,
+ /* d5 */ 0x0070e7, 0x0070f1, 0x0070fb, 0x007105,
+ /* d9 */ 0x00710f, 0x007119, 0x007123, 0x00712d,
+ /* dd */ 0x007137, 0x007141, 0x00714b, 0x007155,
+ /* e1 */ 0x00715f, 0x007169, 0x007173, 0x00717d,
+ /* e5 */ 0x007187, 0x007191, 0x00719b, 0x0071a5,
+ /* e9 */ 0x0071af, 0x0071b9, 0x0071c3, 0x0071cd,
+ /* ed */ 0x0071d7, 0x0071e1, 0x0071eb, 0x0071f5,
+ /* f1 */ 0x0071ff, 0x007209, 0x007213, 0x00721d,
+ /* f5 */ 0x007227, 0x007231, 0x00723b, 0x007245,
+ /* f9 */ 0x00724f, 0x007259, 0x007263, 0x00726d,
+ /* fd */ 0x007277, 0x007281,
+
+ /*** Four byte table, byte #3: 8230xx - offset 0x06163 ***/
+
+ /* 81 */ 0x00728b, 0x007295, 0x00729f, 0x0072a9,
+ /* 85 */ 0x0072b3, 0x0072bd, 0x0072c7, 0x0072d1,
+ /* 89 */ 0x0072db, 0x0072e5, 0x0072ef, 0x0072f9,
+ /* 8d */ 0x007303, 0x00730d, 0x007317, 0x007321,
+ /* 91 */ 0x00732b, 0x007335, 0x00733f, 0x007349,
+ /* 95 */ 0x007353, 0x00735d, 0x007367, 0x007371,
+ /* 99 */ 0x00737b, 0x007385, 0x00738f, 0x007399,
+ /* 9d */ 0x0073a3, 0x0073ad, 0x0073b7, 0x0073c1,
+ /* a1 */ 0x0073cb, 0x0073d5, 0x0073df, 0x0073e9,
+ /* a5 */ 0x0073f3, 0x0073fd, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x007400, 0x00740a, 0x007414,
+ /* f5 */ 0x00741e, 0x007428, 0x007432, 0x00743c,
+ /* f9 */ 0x007446, 0x007450, 0x00745a, 0x007464,
+ /* fd */ 0x00746e, 0x007478,
+
+ /*** Four byte table, byte #3: 8231xx - offset 0x061e1 ***/
+
+ /* 81 */ 0x007482, 0x00748c, 0x007496, 0x0074a0,
+ /* 85 */ 0x0074aa, 0x0074b4, 0x0074be, 0x0074c8,
+ /* 89 */ 0x0074d2, 0x0074dc, 0x0074e6, 0x0074f0,
+ /* 8d */ 0x0074fa, 0x007504, 0x00750e, 0x007518,
+ /* 91 */ 0x007522, 0x00752c, 0x007536, 0x007540,
+ /* 95 */ 0x00754a, 0x007554, 0x00755e, 0x007568,
+ /* 99 */ 0x007572, 0x00757c, 0x007586, 0x007590,
+ /* 9d */ 0x00759a, 0x0075a4, 0x0075ae, 0x0075b8,
+ /* a1 */ 0x0075c2, 0x0075cc, 0x0075d6, 0x0075e0,
+ /* a5 */ 0x0075ea, 0x0075f4, 0x0075fe, 0x007608,
+ /* a9 */ 0x007612, 0x00761c, 0x007626, 0x007630,
+ /* ad */ 0x00763a, 0x007644, 0x00764e, 0x007658,
+ /* b1 */ 0x007662, 0x00766c, 0x007676, 0x007680,
+ /* b5 */ 0x00768a, 0x007694, 0x00769e, 0x0076a8,
+ /* b9 */ 0x0076b2, 0x0076bc, 0x0076c6, 0x0076d0,
+ /* bd */ 0x0076da, 0x0076e4, 0x0076ee, 0x0076f8,
+ /* c1 */ 0x007702, 0x00770c, 0x007716, 0x007720,
+ /* c5 */ 0x00772a, 0x007734, 0x00773e, 0x007748,
+ /* c9 */ 0x007752, 0x00775c, 0x007766, 0x007770,
+ /* cd */ 0x00777a, 0x007784, 0x00778e, 0x007798,
+ /* d1 */ 0x0077a2, 0x0077ac, 0x0077b6, 0x0077c0,
+ /* 42 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8232xx - offset 0x06235 ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x0077c8, 0x0077d2,
+ /* b1 */ 0x0077dc, 0x0077e6, 0x0077f0, 0x0077fa,
+ /* b5 */ 0x007804, 0x00780e, 0x007818, 0x007822,
+ /* b9 */ 0x00782c, 0x007836, 0x007840, 0x00784a,
+ /* bd */ 0x007854, 0x00785e, 0x007868, 0x007872,
+ /* c1 */ 0x00787c, 0x007886, 0x007890, 0x00789a,
+ /* c5 */ 0x0078a4, 0x0078ae, 0x0078b8, 0x0078c2,
+ /* c9 */ 0x0078cc, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x0078d3,
+ /* f9 */ 0x0078dd, 0x0078e7, 0x0078f1, 0x0078fb,
+ /* fd */ 0x007905, 0x00790f,
+
+ /*** Four byte table, byte #3: 8233xx - offset 0x062b3 ***/
+
+ /* 81 */ 0x007919, 0x007923, 0x00792d, 0x007937,
+ /* 85 */ 0x007941, 0x00794b, 0x007955, 0x00795f,
+ /* 89 */ 0x007969, 0x007973, 0x00797d, 0x007987,
+ /* 8d */ 0x007991, 0x00799b, 0x0079a5, 0x0079af,
+ /* 91 */ 0x0079b9, 0x0079c3, 0x0079cd, 0x0079d7,
+ /* 95 */ 0x0079e1, 0x0079eb, 0x0079f5, 0x0079ff,
+ /* 99 */ 0x007a09, 0x007a13, 0x007a1d, 0x007a27,
+ /* 9d */ 0x007a31, 0x007a3b, 0x007a45, 0x007a4f,
+ /* a1 */ 0x007a59, 0x007a63, 0x007a6d, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x007a76, 0x007a80, 0x007a8a, 0x007a94,
+ /* cd */ 0x007a9e, 0x007aa8, 0x007ab2, 0x007abc,
+ /* d1 */ 0x007ac6, 0x007ad0, 0x007ada, 0x007ae4,
+ /* d5 */ 0x007aee, 0x007af8, 0x007b02, 0x007b0c,
+ /* d9 */ 0x007b16, 0x007b20, 0x007b2a, 0x007b34,
+ /* dd */ 0x007b3e, 0x007b48, 0x007b52, 0x007b5c,
+ /* e1 */ 0x007b66, 0x007b70, 0x007b7a, 0x007b84,
+ /* e5 */ 0x007b8e, 0x007b98, 0x007ba2, 0x007bac,
+ /* e9 */ 0x000000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8234xx - offset 0x0631c ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x007bb4, 0x007bbe, 0x007bc8,
+ /* 99 */ 0x007bd2, 0x007bdc, 0x007be6, 0x007bf0,
+ /* 9d */ 0x007bfa, 0x007c04, 0x007c0e, 0x007c18,
+ /* a1 */ 0x007c22, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x007c28, 0x007c32,
+ /* e9 */ 0x007c3c, 0x007c46, 0x007c50, 0x007c5a,
+ /* ed */ 0x007c64, 0x007c6e, 0x007c78, 0x007c82,
+ /* f1 */ 0x007c8c, 0x007c96, 0x007ca0, 0x007caa,
+ /* f5 */ 0x007cb4, 0x007cbe, 0x007cc8, 0x007cd2,
+ /* f9 */ 0x007cdc, 0x007ce6, 0x007cf0, 0x007cfa,
+ /* fd */ 0x007d04, 0x007d0e,
+
+ /*** Four byte table, byte #3: 8235xx - offset 0x0639a ***/
+
+ /* 81 */ 0x007d18, 0x007d22, 0x007d2c, 0x007d36,
+ /* 85 */ 0x007d40, 0x007d4a, 0x007d54, 0x007d5e,
+ /* 89 */ 0x007d68, 0x007d72, 0x007d7c, 0x007d86,
+ /* 8d */ 0x007d90, 0x007d9a, 0x007da4, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8336xx - offset 0x063d2 ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x007da7, 0x007db1,
+ /* c9 */ 0x007dbb, 0x007dc5, 0x007dcf, 0x007dd9,
+ /* cd */ 0x007de3, 0x007ded, 0x007df7, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8430xx - offset 0x0644c ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x007e01, 0x007e0b, 0x007e15, 0x007e1f,
+ /* 89 */ 0x007e29, 0x007e33, 0x007e3d, 0x007e47,
+ /* 8d */ 0x007e51, 0x007e5b, 0x007e65, 0x007e6f,
+ /* 91 */ 0x007e79, 0x007e83, 0x007e8d, 0x007e97,
+ /* 95 */ 0x007ea1, 0x007eab, 0x007eb5, 0x007ebf,
+ /* 99 */ 0x007ec9, 0x007ed3, 0x007edd, 0x007ee7,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: 8431xx - offset 0x064c6 ***/
+
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x007eef, 0x007ef9, 0x007f03, 0x007f0d,
+ /* 89 */ 0x007f17, 0x007f21, 0x007f2b, 0x007f35,
+ /* 8d */ 0x007f3f, 0x007f49, 0x007f53, 0x007f5d,
+ /* 91 */ 0x007f67, 0x007f71, 0x007f7b, 0x007f85,
+ /* 95 */ 0x007f8f, 0x007f99, 0x007fa3, 0x007fad,
+ /* 99 */ 0x007fb7, 0x007fc1, 0x007fcb, 0x007fd5,
+ /* 9d */ 0x007fdf, 0x007fe9, 0x007ff3, 0x007ffd,
+ /* a1 */ 0x008007, 0x008011, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: 813081xx - offset 0x06544 ***/
+
+ /* 30 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 34 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 38 */ 0x00c288, 0x00c289,
+
+ /*** Four byte table, leaf: 813082xx - offset 0x0654e ***/
+
+ /* 30 */ 0x00c28a, 0x00c28b, 0x00c28c, 0x00c28d,
+ /* 34 */ 0x00c28e, 0x00c28f, 0x00c290, 0x00c291,
+ /* 38 */ 0x00c292, 0x00c293,
+
+ /*** Four byte table, leaf: 813083xx - offset 0x06558 ***/
+
+ /* 30 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 34 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 38 */ 0x00c29c, 0x00c29d,
+
+ /*** Four byte table, leaf: 813084xx - offset 0x06562 ***/
+
+ /* 30 */ 0x00c29e, 0x00c29f, 0x00c2a0, 0x00c2a1,
+ /* 34 */ 0x00c2a2, 0x00c2a3, 0x00c2a5, 0x00c2a6,
+ /* 38 */ 0x00c2a9, 0x00c2aa,
+
+ /*** Four byte table, leaf: 813085xx - offset 0x0656c ***/
+
+ /* 30 */ 0x00c2ab, 0x00c2ac, 0x00c2ad, 0x00c2ae,
+ /* 34 */ 0x00c2af, 0x00c2b2, 0x00c2b3, 0x00c2b4,
+ /* 38 */ 0x00c2b5, 0x00c2b6,
+
+ /*** Four byte table, leaf: 813086xx - offset 0x06576 ***/
+
+ /* 30 */ 0x00c2b8, 0x00c2b9, 0x00c2ba, 0x00c2bb,
+ /* 34 */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c2bf,
+ /* 38 */ 0x00c380, 0x00c381,
+
+ /*** Four byte table, leaf: 813087xx - offset 0x06580 ***/
+
+ /* 30 */ 0x00c382, 0x00c383, 0x00c384, 0x00c385,
+ /* 34 */ 0x00c386, 0x00c387, 0x00c388, 0x00c389,
+ /* 38 */ 0x00c38a, 0x00c38b,
+
+ /*** Four byte table, leaf: 813088xx - offset 0x0658a ***/
+
+ /* 30 */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* 34 */ 0x00c390, 0x00c391, 0x00c392, 0x00c393,
+ /* 38 */ 0x00c394, 0x00c395,
+
+ /*** Four byte table, leaf: 813089xx - offset 0x06594 ***/
+
+ /* 30 */ 0x00c396, 0x00c398, 0x00c399, 0x00c39a,
+ /* 34 */ 0x00c39b, 0x00c39c, 0x00c39d, 0x00c39e,
+ /* 38 */ 0x00c39f, 0x00c3a2,
+
+ /*** Four byte table, leaf: 81308axx - offset 0x0659e ***/
+
+ /* 30 */ 0x00c3a3, 0x00c3a4, 0x00c3a5, 0x00c3a6,
+ /* 34 */ 0x00c3a7, 0x00c3ab, 0x00c3ae, 0x00c3af,
+ /* 38 */ 0x00c3b0, 0x00c3b1,
+
+ /*** Four byte table, leaf: 81308bxx - offset 0x065a8 ***/
+
+ /* 30 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0x00c3b8,
+ /* 34 */ 0x00c3bb, 0x00c3bd, 0x00c3be, 0x00c3bf,
+ /* 38 */ 0x00c480, 0x00c482,
+
+ /*** Four byte table, leaf: 81308cxx - offset 0x065b2 ***/
+
+ /* 30 */ 0x00c483, 0x00c484, 0x00c485, 0x00c486,
+ /* 34 */ 0x00c487, 0x00c488, 0x00c489, 0x00c48a,
+ /* 38 */ 0x00c48b, 0x00c48c,
+
+ /*** Four byte table, leaf: 81308dxx - offset 0x065bc ***/
+
+ /* 30 */ 0x00c48d, 0x00c48e, 0x00c48f, 0x00c490,
+ /* 34 */ 0x00c491, 0x00c492, 0x00c494, 0x00c495,
+ /* 38 */ 0x00c496, 0x00c497,
+
+ /*** Four byte table, leaf: 81308exx - offset 0x065c6 ***/
+
+ /* 30 */ 0x00c498, 0x00c499, 0x00c49a, 0x00c49c,
+ /* 34 */ 0x00c49d, 0x00c49e, 0x00c49f, 0x00c4a0,
+ /* 38 */ 0x00c4a1, 0x00c4a2,
+
+ /*** Four byte table, leaf: 81308fxx - offset 0x065d0 ***/
+
+ /* 30 */ 0x00c4a3, 0x00c4a4, 0x00c4a5, 0x00c4a6,
+ /* 34 */ 0x00c4a7, 0x00c4a8, 0x00c4a9, 0x00c4aa,
+ /* 38 */ 0x00c4ac, 0x00c4ad,
+
+ /*** Four byte table, leaf: 813090xx - offset 0x065da ***/
+
+ /* 30 */ 0x00c4ae, 0x00c4af, 0x00c4b0, 0x00c4b1,
+ /* 34 */ 0x00c4b2, 0x00c4b3, 0x00c4b4, 0x00c4b5,
+ /* 38 */ 0x00c4b6, 0x00c4b7,
+
+ /*** Four byte table, leaf: 813091xx - offset 0x065e4 ***/
+
+ /* 30 */ 0x00c4b8, 0x00c4b9, 0x00c4ba, 0x00c4bb,
+ /* 34 */ 0x00c4bc, 0x00c4bd, 0x00c4be, 0x00c4bf,
+ /* 38 */ 0x00c580, 0x00c581,
+
+ /*** Four byte table, leaf: 813092xx - offset 0x065ee ***/
+
+ /* 30 */ 0x00c582, 0x00c583, 0x00c585, 0x00c586,
+ /* 34 */ 0x00c587, 0x00c589, 0x00c58a, 0x00c58b,
+ /* 38 */ 0x00c58c, 0x00c58e,
+
+ /*** Four byte table, leaf: 813093xx - offset 0x065f8 ***/
+
+ /* 30 */ 0x00c58f, 0x00c590, 0x00c591, 0x00c592,
+ /* 34 */ 0x00c593, 0x00c594, 0x00c595, 0x00c596,
+ /* 38 */ 0x00c597, 0x00c598,
+
+ /*** Four byte table, leaf: 813094xx - offset 0x06602 ***/
+
+ /* 30 */ 0x00c599, 0x00c59a, 0x00c59b, 0x00c59c,
+ /* 34 */ 0x00c59d, 0x00c59e, 0x00c59f, 0x00c5a0,
+ /* 38 */ 0x00c5a1, 0x00c5a2,
+
+ /*** Four byte table, leaf: 813095xx - offset 0x0660c ***/
+
+ /* 30 */ 0x00c5a3, 0x00c5a4, 0x00c5a5, 0x00c5a6,
+ /* 34 */ 0x00c5a7, 0x00c5a8, 0x00c5a9, 0x00c5aa,
+ /* 38 */ 0x00c5ac, 0x00c5ad,
+
+ /*** Four byte table, leaf: 813096xx - offset 0x06616 ***/
+
+ /* 30 */ 0x00c5ae, 0x00c5af, 0x00c5b0, 0x00c5b1,
+ /* 34 */ 0x00c5b2, 0x00c5b3, 0x00c5b4, 0x00c5b5,
+ /* 38 */ 0x00c5b6, 0x00c5b7,
+
+ /*** Four byte table, leaf: 813097xx - offset 0x06620 ***/
+
+ /* 30 */ 0x00c5b8, 0x00c5b9, 0x00c5ba, 0x00c5bb,
+ /* 34 */ 0x00c5bc, 0x00c5bd, 0x00c5be, 0x00c5bf,
+ /* 38 */ 0x00c680, 0x00c681,
+
+ /*** Four byte table, leaf: 813098xx - offset 0x0662a ***/
+
+ /* 30 */ 0x00c682, 0x00c683, 0x00c684, 0x00c685,
+ /* 34 */ 0x00c686, 0x00c687, 0x00c688, 0x00c689,
+ /* 38 */ 0x00c68a, 0x00c68b,
+
+ /*** Four byte table, leaf: 813099xx - offset 0x06634 ***/
+
+ /* 30 */ 0x00c68c, 0x00c68d, 0x00c68e, 0x00c68f,
+ /* 34 */ 0x00c690, 0x00c691, 0x00c692, 0x00c693,
+ /* 38 */ 0x00c694, 0x00c695,
+
+ /*** Four byte table, leaf: 81309axx - offset 0x0663e ***/
+
+ /* 30 */ 0x00c696, 0x00c697, 0x00c698, 0x00c699,
+ /* 34 */ 0x00c69a, 0x00c69b, 0x00c69c, 0x00c69d,
+ /* 38 */ 0x00c69e, 0x00c69f,
+
+ /*** Four byte table, leaf: 81309bxx - offset 0x06648 ***/
+
+ /* 30 */ 0x00c6a0, 0x00c6a1, 0x00c6a2, 0x00c6a3,
+ /* 34 */ 0x00c6a4, 0x00c6a5, 0x00c6a6, 0x00c6a7,
+ /* 38 */ 0x00c6a8, 0x00c6a9,
+
+ /*** Four byte table, leaf: 81309cxx - offset 0x06652 ***/
+
+ /* 30 */ 0x00c6aa, 0x00c6ab, 0x00c6ac, 0x00c6ad,
+ /* 34 */ 0x00c6ae, 0x00c6af, 0x00c6b0, 0x00c6b1,
+ /* 38 */ 0x00c6b2, 0x00c6b3,
+
+ /*** Four byte table, leaf: 81309dxx - offset 0x0665c ***/
+
+ /* 30 */ 0x00c6b4, 0x00c6b5, 0x00c6b6, 0x00c6b7,
+ /* 34 */ 0x00c6b8, 0x00c6b9, 0x00c6ba, 0x00c6bb,
+ /* 38 */ 0x00c6bc, 0x00c6bd,
+
+ /*** Four byte table, leaf: 81309exx - offset 0x06666 ***/
+
+ /* 30 */ 0x00c6be, 0x00c6bf, 0x00c780, 0x00c781,
+ /* 34 */ 0x00c782, 0x00c783, 0x00c784, 0x00c785,
+ /* 38 */ 0x00c786, 0x00c787,
+
+ /*** Four byte table, leaf: 81309fxx - offset 0x06670 ***/
+
+ /* 30 */ 0x00c788, 0x00c789, 0x00c78a, 0x00c78b,
+ /* 34 */ 0x00c78c, 0x00c78d, 0x00c78f, 0x00c791,
+ /* 38 */ 0x00c793, 0x00c795,
+
+ /*** Four byte table, leaf: 8130a0xx - offset 0x0667a ***/
+
+ /* 30 */ 0x00c797, 0x00c799, 0x00c79b, 0x00c79d,
+ /* 34 */ 0x00c79e, 0x00c79f, 0x00c7a0, 0x00c7a1,
+ /* 38 */ 0x00c7a2, 0x00c7a3,
+
+ /*** Four byte table, leaf: 8130a1xx - offset 0x06684 ***/
+
+ /* 30 */ 0x00c7a4, 0x00c7a5, 0x00c7a6, 0x00c7a7,
+ /* 34 */ 0x00c7a8, 0x00c7a9, 0x00c7aa, 0x00c7ab,
+ /* 38 */ 0x00c7ac, 0x00c7ad,
+
+ /*** Four byte table, leaf: 8130a2xx - offset 0x0668e ***/
+
+ /* 30 */ 0x00c7ae, 0x00c7af, 0x00c7b0, 0x00c7b1,
+ /* 34 */ 0x00c7b2, 0x00c7b3, 0x00c7b4, 0x00c7b5,
+ /* 38 */ 0x00c7b6, 0x00c7b7,
+
+ /*** Four byte table, leaf: 8130a3xx - offset 0x06698 ***/
+
+ /* 30 */ 0x00c7b8, 0x00c7ba, 0x00c7bb, 0x00c7bc,
+ /* 34 */ 0x00c7bd, 0x00c7be, 0x00c7bf, 0x00c880,
+ /* 38 */ 0x00c881, 0x00c882,
+
+ /*** Four byte table, leaf: 8130a4xx - offset 0x066a2 ***/
+
+ /* 30 */ 0x00c883, 0x00c884, 0x00c885, 0x00c886,
+ /* 34 */ 0x00c887, 0x00c888, 0x00c889, 0x00c88a,
+ /* 38 */ 0x00c88b, 0x00c88c,
+
+ /*** Four byte table, leaf: 8130a5xx - offset 0x066ac ***/
+
+ /* 30 */ 0x00c88d, 0x00c88e, 0x00c88f, 0x00c890,
+ /* 34 */ 0x00c891, 0x00c892, 0x00c893, 0x00c894,
+ /* 38 */ 0x00c895, 0x00c896,
+
+ /*** Four byte table, leaf: 8130a6xx - offset 0x066b6 ***/
+
+ /* 30 */ 0x00c897, 0x00c898, 0x00c899, 0x00c89a,
+ /* 34 */ 0x00c89b, 0x00c89c, 0x00c89d, 0x00c89e,
+ /* 38 */ 0x00c89f, 0x00c8a0,
+
+ /*** Four byte table, leaf: 8130a7xx - offset 0x066c0 ***/
+
+ /* 30 */ 0x00c8a1, 0x00c8a2, 0x00c8a3, 0x00c8a4,
+ /* 34 */ 0x00c8a5, 0x00c8a6, 0x00c8a7, 0x00c8a8,
+ /* 38 */ 0x00c8a9, 0x00c8aa,
+
+ /*** Four byte table, leaf: 8130a8xx - offset 0x066ca ***/
+
+ /* 30 */ 0x00c8ab, 0x00c8ac, 0x00c8ad, 0x00c8ae,
+ /* 34 */ 0x00c8af, 0x00c8b0, 0x00c8b1, 0x00c8b2,
+ /* 38 */ 0x00c8b3, 0x00c8b4,
+
+ /*** Four byte table, leaf: 8130a9xx - offset 0x066d4 ***/
+
+ /* 30 */ 0x00c8b5, 0x00c8b6, 0x00c8b7, 0x00c8b8,
+ /* 34 */ 0x00c8b9, 0x00c8ba, 0x00c8bb, 0x00c8bc,
+ /* 38 */ 0x00c8bd, 0x00c8be,
+
+ /*** Four byte table, leaf: 8130aaxx - offset 0x066de ***/
+
+ /* 30 */ 0x00c8bf, 0x00c980, 0x00c981, 0x00c982,
+ /* 34 */ 0x00c983, 0x00c984, 0x00c985, 0x00c986,
+ /* 38 */ 0x00c987, 0x00c988,
+
+ /*** Four byte table, leaf: 8130abxx - offset 0x066e8 ***/
+
+ /* 30 */ 0x00c989, 0x00c98a, 0x00c98b, 0x00c98c,
+ /* 34 */ 0x00c98d, 0x00c98e, 0x00c98f, 0x00c990,
+ /* 38 */ 0x00c992, 0x00c993,
+
+ /*** Four byte table, leaf: 8130acxx - offset 0x066f2 ***/
+
+ /* 30 */ 0x00c994, 0x00c995, 0x00c996, 0x00c997,
+ /* 34 */ 0x00c998, 0x00c999, 0x00c99a, 0x00c99b,
+ /* 38 */ 0x00c99c, 0x00c99d,
+
+ /*** Four byte table, leaf: 8130adxx - offset 0x066fc ***/
+
+ /* 30 */ 0x00c99e, 0x00c99f, 0x00c9a0, 0x00c9a2,
+ /* 34 */ 0x00c9a3, 0x00c9a4, 0x00c9a5, 0x00c9a6,
+ /* 38 */ 0x00c9a7, 0x00c9a8,
+
+ /*** Four byte table, leaf: 8130aexx - offset 0x06706 ***/
+
+ /* 30 */ 0x00c9a9, 0x00c9aa, 0x00c9ab, 0x00c9ac,
+ /* 34 */ 0x00c9ad, 0x00c9ae, 0x00c9af, 0x00c9b0,
+ /* 38 */ 0x00c9b1, 0x00c9b2,
+
+ /*** Four byte table, leaf: 8130afxx - offset 0x06710 ***/
+
+ /* 30 */ 0x00c9b3, 0x00c9b4, 0x00c9b5, 0x00c9b6,
+ /* 34 */ 0x00c9b7, 0x00c9b8, 0x00c9b9, 0x00c9ba,
+ /* 38 */ 0x00c9bb, 0x00c9bc,
+
+ /*** Four byte table, leaf: 8130b0xx - offset 0x0671a ***/
+
+ /* 30 */ 0x00c9bd, 0x00c9be, 0x00c9bf, 0x00ca80,
+ /* 34 */ 0x00ca81, 0x00ca82, 0x00ca83, 0x00ca84,
+ /* 38 */ 0x00ca85, 0x00ca86,
+
+ /*** Four byte table, leaf: 8130b1xx - offset 0x06724 ***/
+
+ /* 30 */ 0x00ca87, 0x00ca88, 0x00ca89, 0x00ca8a,
+ /* 34 */ 0x00ca8b, 0x00ca8c, 0x00ca8d, 0x00ca8e,
+ /* 38 */ 0x00ca8f, 0x00ca90,
+
+ /*** Four byte table, leaf: 8130b2xx - offset 0x0672e ***/
+
+ /* 30 */ 0x00ca91, 0x00ca92, 0x00ca93, 0x00ca94,
+ /* 34 */ 0x00ca95, 0x00ca96, 0x00ca97, 0x00ca98,
+ /* 38 */ 0x00ca99, 0x00ca9a,
+
+ /*** Four byte table, leaf: 8130b3xx - offset 0x06738 ***/
+
+ /* 30 */ 0x00ca9b, 0x00ca9c, 0x00ca9d, 0x00ca9e,
+ /* 34 */ 0x00ca9f, 0x00caa0, 0x00caa1, 0x00caa2,
+ /* 38 */ 0x00caa3, 0x00caa4,
+
+ /*** Four byte table, leaf: 8130b4xx - offset 0x06742 ***/
+
+ /* 30 */ 0x00caa5, 0x00caa6, 0x00caa7, 0x00caa8,
+ /* 34 */ 0x00caa9, 0x00caaa, 0x00caab, 0x00caac,
+ /* 38 */ 0x00caad, 0x00caae,
+
+ /*** Four byte table, leaf: 8130b5xx - offset 0x0674c ***/
+
+ /* 30 */ 0x00caaf, 0x00cab0, 0x00cab1, 0x00cab2,
+ /* 34 */ 0x00cab3, 0x00cab4, 0x00cab5, 0x00cab6,
+ /* 38 */ 0x00cab7, 0x00cab8,
+
+ /*** Four byte table, leaf: 8130b6xx - offset 0x06756 ***/
+
+ /* 30 */ 0x00cab9, 0x00caba, 0x00cabb, 0x00cabc,
+ /* 34 */ 0x00cabd, 0x00cabe, 0x00cabf, 0x00cb80,
+ /* 38 */ 0x00cb81, 0x00cb82,
+
+ /*** Four byte table, leaf: 8130b7xx - offset 0x06760 ***/
+
+ /* 30 */ 0x00cb83, 0x00cb84, 0x00cb85, 0x00cb86,
+ /* 34 */ 0x00cb88, 0x00cb8c, 0x00cb8d, 0x00cb8e,
+ /* 38 */ 0x00cb8f, 0x00cb90,
+
+ /*** Four byte table, leaf: 8130b8xx - offset 0x0676a ***/
+
+ /* 30 */ 0x00cb91, 0x00cb92, 0x00cb93, 0x00cb94,
+ /* 34 */ 0x00cb95, 0x00cb96, 0x00cb97, 0x00cb98,
+ /* 38 */ 0x00cb9a, 0x00cb9b,
+
+ /*** Four byte table, leaf: 8130b9xx - offset 0x06774 ***/
+
+ /* 30 */ 0x00cb9c, 0x00cb9d, 0x00cb9e, 0x00cb9f,
+ /* 34 */ 0x00cba0, 0x00cba1, 0x00cba2, 0x00cba3,
+ /* 38 */ 0x00cba4, 0x00cba5,
+
+ /*** Four byte table, leaf: 8130baxx - offset 0x0677e ***/
+
+ /* 30 */ 0x00cba6, 0x00cba7, 0x00cba8, 0x00cba9,
+ /* 34 */ 0x00cbaa, 0x00cbab, 0x00cbac, 0x00cbad,
+ /* 38 */ 0x00cbae, 0x00cbaf,
+
+ /*** Four byte table, leaf: 8130bbxx - offset 0x06788 ***/
+
+ /* 30 */ 0x00cbb0, 0x00cbb1, 0x00cbb2, 0x00cbb3,
+ /* 34 */ 0x00cbb4, 0x00cbb5, 0x00cbb6, 0x00cbb7,
+ /* 38 */ 0x00cbb8, 0x00cbb9,
+
+ /*** Four byte table, leaf: 8130bcxx - offset 0x06792 ***/
+
+ /* 30 */ 0x00cbba, 0x00cbbb, 0x00cbbc, 0x00cbbd,
+ /* 34 */ 0x00cbbe, 0x00cbbf, 0x00cc80, 0x00cc81,
+ /* 38 */ 0x00cc82, 0x00cc83,
+
+ /*** Four byte table, leaf: 8130bdxx - offset 0x0679c ***/
+
+ /* 30 */ 0x00cc84, 0x00cc85, 0x00cc86, 0x00cc87,
+ /* 34 */ 0x00cc88, 0x00cc89, 0x00cc8a, 0x00cc8b,
+ /* 38 */ 0x00cc8c, 0x00cc8d,
+
+ /*** Four byte table, leaf: 8130bexx - offset 0x067a6 ***/
+
+ /* 30 */ 0x00cc8e, 0x00cc8f, 0x00cc90, 0x00cc91,
+ /* 34 */ 0x00cc92, 0x00cc93, 0x00cc94, 0x00cc95,
+ /* 38 */ 0x00cc96, 0x00cc97,
+
+ /*** Four byte table, leaf: 8130bfxx - offset 0x067b0 ***/
+
+ /* 30 */ 0x00cc98, 0x00cc99, 0x00cc9a, 0x00cc9b,
+ /* 34 */ 0x00cc9c, 0x00cc9d, 0x00cc9e, 0x00cc9f,
+ /* 38 */ 0x00cca0, 0x00cca1,
+
+ /*** Four byte table, leaf: 8130c0xx - offset 0x067ba ***/
+
+ /* 30 */ 0x00cca2, 0x00cca3, 0x00cca4, 0x00cca5,
+ /* 34 */ 0x00cca6, 0x00cca7, 0x00cca8, 0x00cca9,
+ /* 38 */ 0x00ccaa, 0x00ccab,
+
+ /*** Four byte table, leaf: 8130c1xx - offset 0x067c4 ***/
+
+ /* 30 */ 0x00ccac, 0x00ccad, 0x00ccae, 0x00ccaf,
+ /* 34 */ 0x00ccb0, 0x00ccb1, 0x00ccb2, 0x00ccb3,
+ /* 38 */ 0x00ccb4, 0x00ccb5,
+
+ /*** Four byte table, leaf: 8130c2xx - offset 0x067ce ***/
+
+ /* 30 */ 0x00ccb6, 0x00ccb7, 0x00ccb8, 0x00ccb9,
+ /* 34 */ 0x00ccba, 0x00ccbb, 0x00ccbc, 0x00ccbd,
+ /* 38 */ 0x00ccbe, 0x00ccbf,
+
+ /*** Four byte table, leaf: 8130c3xx - offset 0x067d8 ***/
+
+ /* 30 */ 0x00cd80, 0x00cd81, 0x00cd82, 0x00cd83,
+ /* 34 */ 0x00cd84, 0x00cd85, 0x00cd86, 0x00cd87,
+ /* 38 */ 0x00cd88, 0x00cd89,
+
+ /*** Four byte table, leaf: 8130c4xx - offset 0x067e2 ***/
+
+ /* 30 */ 0x00cd8a, 0x00cd8b, 0x00cd8c, 0x00cd8d,
+ /* 34 */ 0x00cd8e, 0x00cd8f, 0x00cd90, 0x00cd91,
+ /* 38 */ 0x00cd92, 0x00cd93,
+
+ /*** Four byte table, leaf: 8130c5xx - offset 0x067ec ***/
+
+ /* 30 */ 0x00cd94, 0x00cd95, 0x00cd96, 0x00cd97,
+ /* 34 */ 0x00cd98, 0x00cd99, 0x00cd9a, 0x00cd9b,
+ /* 38 */ 0x00cd9c, 0x00cd9d,
+
+ /*** Four byte table, leaf: 8130c6xx - offset 0x067f6 ***/
+
+ /* 30 */ 0x00cd9e, 0x00cd9f, 0x00cda0, 0x00cda1,
+ /* 34 */ 0x00cda2, 0x00cda3, 0x00cda4, 0x00cda5,
+ /* 38 */ 0x00cda6, 0x00cda7,
+
+ /*** Four byte table, leaf: 8130c7xx - offset 0x06800 ***/
+
+ /* 30 */ 0x00cda8, 0x00cda9, 0x00cdaa, 0x00cdab,
+ /* 34 */ 0x00cdac, 0x00cdad, 0x00cdae, 0x00cdaf,
+ /* 38 */ 0x00cdb0, 0x00cdb1,
+
+ /*** Four byte table, leaf: 8130c8xx - offset 0x0680a ***/
+
+ /* 30 */ 0x00cdb2, 0x00cdb3, 0x00cdb4, 0x00cdb5,
+ /* 34 */ 0x00cdb6, 0x00cdb7, 0x00cdb8, 0x00cdb9,
+ /* 38 */ 0x00cdba, 0x00cdbb,
+
+ /*** Four byte table, leaf: 8130c9xx - offset 0x06814 ***/
+
+ /* 30 */ 0x00cdbc, 0x00cdbd, 0x00cdbe, 0x00cdbf,
+ /* 34 */ 0x00ce80, 0x00ce81, 0x00ce82, 0x00ce83,
+ /* 38 */ 0x00ce84, 0x00ce85,
+
+ /*** Four byte table, leaf: 8130caxx - offset 0x0681e ***/
+
+ /* 30 */ 0x00ce86, 0x00ce87, 0x00ce88, 0x00ce89,
+ /* 34 */ 0x00ce8a, 0x00ce8b, 0x00ce8c, 0x00ce8d,
+ /* 38 */ 0x00ce8e, 0x00ce8f,
+
+ /*** Four byte table, leaf: 8130cbxx - offset 0x06828 ***/
+
+ /* 30 */ 0x00ce90, 0x00cea2, 0x00ceaa, 0x00ceab,
+ /* 34 */ 0x00ceac, 0x00cead, 0x00ceae, 0x00ceaf,
+ /* 38 */ 0x00ceb0, 0x00cf82,
+
+ /*** Four byte table, leaf: 8130ccxx - offset 0x06832 ***/
+
+ /* 30 */ 0x00cf8a, 0x00cf8b, 0x00cf8c, 0x00cf8d,
+ /* 34 */ 0x00cf8e, 0x00cf8f, 0x00cf90, 0x00cf91,
+ /* 38 */ 0x00cf92, 0x00cf93,
+
+ /*** Four byte table, leaf: 8130cdxx - offset 0x0683c ***/
+
+ /* 30 */ 0x00cf94, 0x00cf95, 0x00cf96, 0x00cf97,
+ /* 34 */ 0x00cf98, 0x00cf99, 0x00cf9a, 0x00cf9b,
+ /* 38 */ 0x00cf9c, 0x00cf9d,
+
+ /*** Four byte table, leaf: 8130cexx - offset 0x06846 ***/
+
+ /* 30 */ 0x00cf9e, 0x00cf9f, 0x00cfa0, 0x00cfa1,
+ /* 34 */ 0x00cfa2, 0x00cfa3, 0x00cfa4, 0x00cfa5,
+ /* 38 */ 0x00cfa6, 0x00cfa7,
+
+ /*** Four byte table, leaf: 8130cfxx - offset 0x06850 ***/
+
+ /* 30 */ 0x00cfa8, 0x00cfa9, 0x00cfaa, 0x00cfab,
+ /* 34 */ 0x00cfac, 0x00cfad, 0x00cfae, 0x00cfaf,
+ /* 38 */ 0x00cfb0, 0x00cfb1,
+
+ /*** Four byte table, leaf: 8130d0xx - offset 0x0685a ***/
+
+ /* 30 */ 0x00cfb2, 0x00cfb3, 0x00cfb4, 0x00cfb5,
+ /* 34 */ 0x00cfb6, 0x00cfb7, 0x00cfb8, 0x00cfb9,
+ /* 38 */ 0x00cfba, 0x00cfbb,
+
+ /*** Four byte table, leaf: 8130d1xx - offset 0x06864 ***/
+
+ /* 30 */ 0x00cfbc, 0x00cfbd, 0x00cfbe, 0x00cfbf,
+ /* 34 */ 0x00d080, 0x00d082, 0x00d083, 0x00d084,
+ /* 38 */ 0x00d085, 0x00d086,
+
+ /*** Four byte table, leaf: 8130d2xx - offset 0x0686e ***/
+
+ /* 30 */ 0x00d087, 0x00d088, 0x00d089, 0x00d08a,
+ /* 34 */ 0x00d08b, 0x00d08c, 0x00d08d, 0x00d08e,
+ /* 38 */ 0x00d08f, 0x00d190,
+
+ /*** Four byte table, leaf: 8136a5xx - offset 0x06878 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0xe28091, 0xe28092,
+ /* 34 */ 0xe28097, 0xe2809a, 0xe2809b, 0xe2809e,
+ /* 38 */ 0xe2809f, 0xe280a0,
+
+ /*** Four byte table, leaf: 8136a6xx - offset 0x06882 ***/
+
+ /* 30 */ 0xe280a1, 0xe280a2, 0xe280a3, 0xe280a4,
+ /* 34 */ 0xe280a7, 0xe280a8, 0xe280a9, 0xe280aa,
+ /* 38 */ 0xe280ab, 0xe280ac,
+
+ /*** Four byte table, leaf: 8136a7xx - offset 0x0688c ***/
+
+ /* 30 */ 0xe280ad, 0xe280ae, 0xe280af, 0xe280b1,
+ /* 34 */ 0xe280b4, 0xe280b6, 0xe280b7, 0xe280b8,
+ /* 38 */ 0xe280b9, 0xe280ba,
+
+ /*** Four byte table, leaf: 8136a8xx - offset 0x06896 ***/
+
+ /* 30 */ 0xe280bc, 0xe280bd, 0xe280be, 0xe280bf,
+ /* 34 */ 0xe28180, 0xe28181, 0xe28182, 0xe28183,
+ /* 38 */ 0xe28184, 0xe28185,
+
+ /*** Four byte table, leaf: 8136a9xx - offset 0x068a0 ***/
+
+ /* 30 */ 0xe28186, 0xe28187, 0xe28188, 0xe28189,
+ /* 34 */ 0xe2818a, 0xe2818b, 0xe2818c, 0xe2818d,
+ /* 38 */ 0xe2818e, 0xe2818f,
+
+ /*** Four byte table, leaf: 8136aaxx - offset 0x068aa ***/
+
+ /* 30 */ 0xe28190, 0xe28191, 0xe28192, 0xe28193,
+ /* 34 */ 0xe28194, 0xe28195, 0xe28196, 0xe28197,
+ /* 38 */ 0xe28198, 0xe28199,
+
+ /*** Four byte table, leaf: 8136abxx - offset 0x068b4 ***/
+
+ /* 30 */ 0xe2819a, 0xe2819b, 0xe2819c, 0xe2819d,
+ /* 34 */ 0xe2819e, 0xe2819f, 0xe281a0, 0xe281a1,
+ /* 38 */ 0xe281a2, 0xe281a3,
+
+ /*** Four byte table, leaf: 8136acxx - offset 0x068be ***/
+
+ /* 30 */ 0xe281a4, 0xe281a5, 0xe281a6, 0xe281a7,
+ /* 34 */ 0xe281a8, 0xe281a9, 0xe281aa, 0xe281ab,
+ /* 38 */ 0xe281ac, 0xe281ad,
+
+ /*** Four byte table, leaf: 8136adxx - offset 0x068c8 ***/
+
+ /* 30 */ 0xe281ae, 0xe281af, 0xe281b0, 0xe281b1,
+ /* 34 */ 0xe281b2, 0xe281b3, 0xe281b4, 0xe281b5,
+ /* 38 */ 0xe281b6, 0xe281b7,
+
+ /*** Four byte table, leaf: 8136aexx - offset 0x068d2 ***/
+
+ /* 30 */ 0xe281b8, 0xe281b9, 0xe281ba, 0xe281bb,
+ /* 34 */ 0xe281bc, 0xe281bd, 0xe281be, 0xe281bf,
+ /* 38 */ 0xe28280, 0xe28281,
+
+ /*** Four byte table, leaf: 8136afxx - offset 0x068dc ***/
+
+ /* 30 */ 0xe28282, 0xe28283, 0xe28284, 0xe28285,
+ /* 34 */ 0xe28286, 0xe28287, 0xe28288, 0xe28289,
+ /* 38 */ 0xe2828a, 0xe2828b,
+
+ /*** Four byte table, leaf: 8136b0xx - offset 0x068e6 ***/
+
+ /* 30 */ 0xe2828c, 0xe2828d, 0xe2828e, 0xe2828f,
+ /* 34 */ 0xe28290, 0xe28291, 0xe28292, 0xe28293,
+ /* 38 */ 0xe28294, 0xe28295,
+
+ /*** Four byte table, leaf: 8136b1xx - offset 0x068f0 ***/
+
+ /* 30 */ 0xe28296, 0xe28297, 0xe28298, 0xe28299,
+ /* 34 */ 0xe2829a, 0xe2829b, 0xe2829c, 0xe2829d,
+ /* 38 */ 0xe2829e, 0xe2829f,
+
+ /*** Four byte table, leaf: 8136b2xx - offset 0x068fa ***/
+
+ /* 30 */ 0xe282a0, 0xe282a1, 0xe282a2, 0xe282a3,
+ /* 34 */ 0xe282a4, 0xe282a5, 0xe282a6, 0xe282a7,
+ /* 38 */ 0xe282a8, 0xe282a9,
+
+ /*** Four byte table, leaf: 8136b3xx - offset 0x06904 ***/
+
+ /* 30 */ 0xe282aa, 0xe282ab, 0xe282ad, 0xe282ae,
+ /* 34 */ 0xe282af, 0xe282b0, 0xe282b1, 0xe282b2,
+ /* 38 */ 0xe282b3, 0xe282b4,
+
+ /*** Four byte table, leaf: 8136b4xx - offset 0x0690e ***/
+
+ /* 30 */ 0xe282b5, 0xe282b6, 0xe282b7, 0xe282b8,
+ /* 34 */ 0xe282b9, 0xe282ba, 0xe282bb, 0xe282bc,
+ /* 38 */ 0xe282bd, 0xe282be,
+
+ /*** Four byte table, leaf: 8136b5xx - offset 0x06918 ***/
+
+ /* 30 */ 0xe282bf, 0xe28380, 0xe28381, 0xe28382,
+ /* 34 */ 0xe28383, 0xe28384, 0xe28385, 0xe28386,
+ /* 38 */ 0xe28387, 0xe28388,
+
+ /*** Four byte table, leaf: 8136b6xx - offset 0x06922 ***/
+
+ /* 30 */ 0xe28389, 0xe2838a, 0xe2838b, 0xe2838c,
+ /* 34 */ 0xe2838d, 0xe2838e, 0xe2838f, 0xe28390,
+ /* 38 */ 0xe28391, 0xe28392,
+
+ /*** Four byte table, leaf: 8136b7xx - offset 0x0692c ***/
+
+ /* 30 */ 0xe28393, 0xe28394, 0xe28395, 0xe28396,
+ /* 34 */ 0xe28397, 0xe28398, 0xe28399, 0xe2839a,
+ /* 38 */ 0xe2839b, 0xe2839c,
+
+ /*** Four byte table, leaf: 8136b8xx - offset 0x06936 ***/
+
+ /* 30 */ 0xe2839d, 0xe2839e, 0xe2839f, 0xe283a0,
+ /* 34 */ 0xe283a1, 0xe283a2, 0xe283a3, 0xe283a4,
+ /* 38 */ 0xe283a5, 0xe283a6,
+
+ /*** Four byte table, leaf: 8136b9xx - offset 0x06940 ***/
+
+ /* 30 */ 0xe283a7, 0xe283a8, 0xe283a9, 0xe283aa,
+ /* 34 */ 0xe283ab, 0xe283ac, 0xe283ad, 0xe283ae,
+ /* 38 */ 0xe283af, 0xe283b0,
+
+ /*** Four byte table, leaf: 8136baxx - offset 0x0694a ***/
+
+ /* 30 */ 0xe283b1, 0xe283b2, 0xe283b3, 0xe283b4,
+ /* 34 */ 0xe283b5, 0xe283b6, 0xe283b7, 0xe283b8,
+ /* 38 */ 0xe283b9, 0xe283ba,
+
+ /*** Four byte table, leaf: 8136bbxx - offset 0x06954 ***/
+
+ /* 30 */ 0xe283bb, 0xe283bc, 0xe283bd, 0xe283be,
+ /* 34 */ 0xe283bf, 0xe28480, 0xe28481, 0xe28482,
+ /* 38 */ 0xe28484, 0xe28486,
+
+ /*** Four byte table, leaf: 8136bcxx - offset 0x0695e ***/
+
+ /* 30 */ 0xe28487, 0xe28488, 0xe2848a, 0xe2848b,
+ /* 34 */ 0xe2848c, 0xe2848d, 0xe2848e, 0xe2848f,
+ /* 38 */ 0xe28490, 0xe28491,
+
+ /*** Four byte table, leaf: 8136bdxx - offset 0x06968 ***/
+
+ /* 30 */ 0xe28492, 0xe28493, 0xe28494, 0xe28495,
+ /* 34 */ 0xe28497, 0xe28498, 0xe28499, 0xe2849a,
+ /* 38 */ 0xe2849b, 0xe2849c,
+
+ /*** Four byte table, leaf: 8136bexx - offset 0x06972 ***/
+
+ /* 30 */ 0xe2849d, 0xe2849e, 0xe2849f, 0xe284a0,
+ /* 34 */ 0xe284a2, 0xe284a3, 0xe284a4, 0xe284a5,
+ /* 38 */ 0xe284a6, 0xe284a7,
+
+ /*** Four byte table, leaf: 8136bfxx - offset 0x0697c ***/
+
+ /* 30 */ 0xe284a8, 0xe284a9, 0xe284aa, 0xe284ab,
+ /* 34 */ 0xe284ac, 0xe284ad, 0xe284ae, 0xe284af,
+ /* 38 */ 0xe284b0, 0xe284b1,
+
+ /*** Four byte table, leaf: 8136c0xx - offset 0x06986 ***/
+
+ /* 30 */ 0xe284b2, 0xe284b3, 0xe284b4, 0xe284b5,
+ /* 34 */ 0xe284b6, 0xe284b7, 0xe284b8, 0xe284b9,
+ /* 38 */ 0xe284ba, 0xe284bb,
+
+ /*** Four byte table, leaf: 8136c1xx - offset 0x06990 ***/
+
+ /* 30 */ 0xe284bc, 0xe284bd, 0xe284be, 0xe284bf,
+ /* 34 */ 0xe28580, 0xe28581, 0xe28582, 0xe28583,
+ /* 38 */ 0xe28584, 0xe28585,
+
+ /*** Four byte table, leaf: 8136c2xx - offset 0x0699a ***/
+
+ /* 30 */ 0xe28586, 0xe28587, 0xe28588, 0xe28589,
+ /* 34 */ 0xe2858a, 0xe2858b, 0xe2858c, 0xe2858d,
+ /* 38 */ 0xe2858e, 0xe2858f,
+
+ /*** Four byte table, leaf: 8136c3xx - offset 0x069a4 ***/
+
+ /* 30 */ 0xe28590, 0xe28591, 0xe28592, 0xe28593,
+ /* 34 */ 0xe28594, 0xe28595, 0xe28596, 0xe28597,
+ /* 38 */ 0xe28598, 0xe28599,
+
+ /*** Four byte table, leaf: 8136c4xx - offset 0x069ae ***/
+
+ /* 30 */ 0xe2859a, 0xe2859b, 0xe2859c, 0xe2859d,
+ /* 34 */ 0xe2859e, 0xe2859f, 0xe285ac, 0xe285ad,
+ /* 38 */ 0xe285ae, 0xe285af,
+
+ /*** Four byte table, leaf: 8136c5xx - offset 0x069b8 ***/
+
+ /* 30 */ 0xe285ba, 0xe285bb, 0xe285bc, 0xe285bd,
+ /* 34 */ 0xe285be, 0xe285bf, 0xe28680, 0xe28681,
+ /* 38 */ 0xe28682, 0xe28683,
+
+ /*** Four byte table, leaf: 8136c6xx - offset 0x069c2 ***/
+
+ /* 30 */ 0xe28684, 0xe28685, 0xe28686, 0xe28687,
+ /* 34 */ 0xe28688, 0xe28689, 0xe2868a, 0xe2868b,
+ /* 38 */ 0xe2868c, 0xe2868d,
+
+ /*** Four byte table, leaf: 8136c7xx - offset 0x069cc ***/
+
+ /* 30 */ 0xe2868e, 0xe2868f, 0xe28694, 0xe28695,
+ /* 34 */ 0xe2869a, 0xe2869b, 0xe2869c, 0xe2869d,
+ /* 38 */ 0xe2869e, 0xe2869f,
+
+ /*** Four byte table, leaf: 8136c8xx - offset 0x069d6 ***/
+
+ /* 30 */ 0xe286a0, 0xe286a1, 0xe286a2, 0xe286a3,
+ /* 34 */ 0xe286a4, 0xe286a5, 0xe286a6, 0xe286a7,
+ /* 38 */ 0xe286a8, 0xe286a9,
+
+ /*** Four byte table, leaf: 8136c9xx - offset 0x069e0 ***/
+
+ /* 30 */ 0xe286aa, 0xe286ab, 0xe286ac, 0xe286ad,
+ /* 34 */ 0xe286ae, 0xe286af, 0xe286b0, 0xe286b1,
+ /* 38 */ 0xe286b2, 0xe286b3,
+
+ /*** Four byte table, leaf: 8136caxx - offset 0x069ea ***/
+
+ /* 30 */ 0xe286b4, 0xe286b5, 0xe286b6, 0xe286b7,
+ /* 34 */ 0xe286b8, 0xe286b9, 0xe286ba, 0xe286bb,
+ /* 38 */ 0xe286bc, 0xe286bd,
+
+ /*** Four byte table, leaf: 8136cbxx - offset 0x069f4 ***/
+
+ /* 30 */ 0xe286be, 0xe286bf, 0xe28780, 0xe28781,
+ /* 34 */ 0xe28782, 0xe28783, 0xe28784, 0xe28785,
+ /* 38 */ 0xe28786, 0xe28787,
+
+ /*** Four byte table, leaf: 8136ccxx - offset 0x069fe ***/
+
+ /* 30 */ 0xe28788, 0xe28789, 0xe2878a, 0xe2878b,
+ /* 34 */ 0xe2878c, 0xe2878d, 0xe2878e, 0xe2878f,
+ /* 38 */ 0xe28790, 0xe28791,
+
+ /*** Four byte table, leaf: 8136cdxx - offset 0x06a08 ***/
+
+ /* 30 */ 0xe28792, 0xe28793, 0xe28794, 0xe28795,
+ /* 34 */ 0xe28796, 0xe28797, 0xe28798, 0xe28799,
+ /* 38 */ 0xe2879a, 0xe2879b,
+
+ /*** Four byte table, leaf: 8136cexx - offset 0x06a12 ***/
+
+ /* 30 */ 0xe2879c, 0xe2879d, 0xe2879e, 0xe2879f,
+ /* 34 */ 0xe287a0, 0xe287a1, 0xe287a2, 0xe287a3,
+ /* 38 */ 0xe287a4, 0xe287a5,
+
+ /*** Four byte table, leaf: 8136cfxx - offset 0x06a1c ***/
+
+ /* 30 */ 0xe287a6, 0xe287a7, 0xe287a8, 0xe287a9,
+ /* 34 */ 0xe287aa, 0xe287ab, 0xe287ac, 0xe287ad,
+ /* 38 */ 0xe287ae, 0xe287af,
+
+ /*** Four byte table, leaf: 8136d0xx - offset 0x06a26 ***/
+
+ /* 30 */ 0xe287b0, 0xe287b1, 0xe287b2, 0xe287b3,
+ /* 34 */ 0xe287b4, 0xe287b5, 0xe287b6, 0xe287b7,
+ /* 38 */ 0xe287b8, 0xe287b9,
+
+ /*** Four byte table, leaf: 8136d1xx - offset 0x06a30 ***/
+
+ /* 30 */ 0xe287ba, 0xe287bb, 0xe287bc, 0xe287bd,
+ /* 34 */ 0xe287be, 0xe287bf, 0xe28880, 0xe28881,
+ /* 38 */ 0xe28882, 0xe28883,
+
+ /*** Four byte table, leaf: 8136d2xx - offset 0x06a3a ***/
+
+ /* 30 */ 0xe28884, 0xe28885, 0xe28886, 0xe28887,
+ /* 34 */ 0xe28889, 0xe2888a, 0xe2888b, 0xe2888c,
+ /* 38 */ 0xe2888d, 0xe2888e,
+
+ /*** Four byte table, leaf: 8136d3xx - offset 0x06a44 ***/
+
+ /* 30 */ 0xe28890, 0xe28892, 0xe28893, 0xe28894,
+ /* 34 */ 0xe28896, 0xe28897, 0xe28898, 0xe28899,
+ /* 38 */ 0xe2889b, 0xe2889c,
+
+ /*** Four byte table, leaf: 8136d4xx - offset 0x06a4e ***/
+
+ /* 30 */ 0xe288a1, 0xe288a2, 0xe288a4, 0xe288a6,
+ /* 34 */ 0xe288ac, 0xe288ad, 0xe288af, 0xe288b0,
+ /* 38 */ 0xe288b1, 0xe288b2,
+
+ /*** Four byte table, leaf: 8136d5xx - offset 0x06a58 ***/
+
+ /* 30 */ 0xe288b3, 0xe288b8, 0xe288b9, 0xe288ba,
+ /* 34 */ 0xe288bb, 0xe288bc, 0xe288be, 0xe288bf,
+ /* 38 */ 0xe28980, 0xe28981,
+
+ /*** Four byte table, leaf: 8136d6xx - offset 0x06a62 ***/
+
+ /* 30 */ 0xe28982, 0xe28983, 0xe28984, 0xe28985,
+ /* 34 */ 0xe28986, 0xe28987, 0xe28989, 0xe2898a,
+ /* 38 */ 0xe2898b, 0xe2898d,
+
+ /*** Four byte table, leaf: 8136d7xx - offset 0x06a6c ***/
+
+ /* 30 */ 0xe2898e, 0xe2898f, 0xe28990, 0xe28991,
+ /* 34 */ 0xe28993, 0xe28994, 0xe28995, 0xe28996,
+ /* 38 */ 0xe28997, 0xe28998,
+
+ /*** Four byte table, leaf: 8136d8xx - offset 0x06a76 ***/
+
+ /* 30 */ 0xe28999, 0xe2899a, 0xe2899b, 0xe2899c,
+ /* 34 */ 0xe2899d, 0xe2899e, 0xe2899f, 0xe289a2,
+ /* 38 */ 0xe289a3, 0xe289a8,
+
+ /*** Four byte table, leaf: 8136d9xx - offset 0x06a80 ***/
+
+ /* 30 */ 0xe289a9, 0xe289aa, 0xe289ab, 0xe289ac,
+ /* 34 */ 0xe289ad, 0xe289b0, 0xe289b1, 0xe289b2,
+ /* 38 */ 0xe289b3, 0xe289b4,
+
+ /*** Four byte table, leaf: 8136daxx - offset 0x06a8a ***/
+
+ /* 30 */ 0xe289b5, 0xe289b6, 0xe289b7, 0xe289b8,
+ /* 34 */ 0xe289b9, 0xe289ba, 0xe289bb, 0xe289bc,
+ /* 38 */ 0xe289bd, 0xe289be,
+
+ /*** Four byte table, leaf: 8136dbxx - offset 0x06a94 ***/
+
+ /* 30 */ 0xe289bf, 0xe28a80, 0xe28a81, 0xe28a82,
+ /* 34 */ 0xe28a83, 0xe28a84, 0xe28a85, 0xe28a86,
+ /* 38 */ 0xe28a87, 0xe28a88,
+
+ /*** Four byte table, leaf: 8136dcxx - offset 0x06a9e ***/
+
+ /* 30 */ 0xe28a89, 0xe28a8a, 0xe28a8b, 0xe28a8c,
+ /* 34 */ 0xe28a8d, 0xe28a8e, 0xe28a8f, 0xe28a90,
+ /* 38 */ 0xe28a91, 0xe28a92,
+
+ /*** Four byte table, leaf: 8136ddxx - offset 0x06aa8 ***/
+
+ /* 30 */ 0xe28a93, 0xe28a94, 0xe28a96, 0xe28a97,
+ /* 34 */ 0xe28a98, 0xe28a9a, 0xe28a9b, 0xe28a9c,
+ /* 38 */ 0xe28a9d, 0xe28a9e,
+
+ /*** Four byte table, leaf: 8136dexx - offset 0x06ab2 ***/
+
+ /* 30 */ 0xe28a9f, 0xe28aa0, 0xe28aa1, 0xe28aa2,
+ /* 34 */ 0xe28aa3, 0xe28aa4, 0xe28aa6, 0xe28aa7,
+ /* 38 */ 0xe28aa8, 0xe28aa9,
+
+ /*** Four byte table, leaf: 8136dfxx - offset 0x06abc ***/
+
+ /* 30 */ 0xe28aaa, 0xe28aab, 0xe28aac, 0xe28aad,
+ /* 34 */ 0xe28aae, 0xe28aaf, 0xe28ab0, 0xe28ab1,
+ /* 38 */ 0xe28ab2, 0xe28ab3,
+
+ /*** Four byte table, leaf: 8136e0xx - offset 0x06ac6 ***/
+
+ /* 30 */ 0xe28ab4, 0xe28ab5, 0xe28ab6, 0xe28ab7,
+ /* 34 */ 0xe28ab8, 0xe28ab9, 0xe28aba, 0xe28abb,
+ /* 38 */ 0xe28abc, 0xe28abd,
+
+ /*** Four byte table, leaf: 8136e1xx - offset 0x06ad0 ***/
+
+ /* 30 */ 0xe28abe, 0xe28b80, 0xe28b81, 0xe28b82,
+ /* 34 */ 0xe28b83, 0xe28b84, 0xe28b85, 0xe28b86,
+ /* 38 */ 0xe28b87, 0xe28b88,
+
+ /*** Four byte table, leaf: 8136e2xx - offset 0x06ada ***/
+
+ /* 30 */ 0xe28b89, 0xe28b8a, 0xe28b8b, 0xe28b8c,
+ /* 34 */ 0xe28b8d, 0xe28b8e, 0xe28b8f, 0xe28b90,
+ /* 38 */ 0xe28b91, 0xe28b92,
+
+ /*** Four byte table, leaf: 8136e3xx - offset 0x06ae4 ***/
+
+ /* 30 */ 0xe28b93, 0xe28b94, 0xe28b95, 0xe28b96,
+ /* 34 */ 0xe28b97, 0xe28b98, 0xe28b99, 0xe28b9a,
+ /* 38 */ 0xe28b9b, 0xe28b9c,
+
+ /*** Four byte table, leaf: 8136e4xx - offset 0x06aee ***/
+
+ /* 30 */ 0xe28b9d, 0xe28b9e, 0xe28b9f, 0xe28ba0,
+ /* 34 */ 0xe28ba1, 0xe28ba2, 0xe28ba3, 0xe28ba4,
+ /* 38 */ 0xe28ba5, 0xe28ba6,
+
+ /*** Four byte table, leaf: 8136e5xx - offset 0x06af8 ***/
+
+ /* 30 */ 0xe28ba7, 0xe28ba8, 0xe28ba9, 0xe28baa,
+ /* 34 */ 0xe28bab, 0xe28bac, 0xe28bad, 0xe28bae,
+ /* 38 */ 0xe28baf, 0xe28bb0,
+
+ /*** Four byte table, leaf: 8136e6xx - offset 0x06b02 ***/
+
+ /* 30 */ 0xe28bb1, 0xe28bb2, 0xe28bb3, 0xe28bb4,
+ /* 34 */ 0xe28bb5, 0xe28bb6, 0xe28bb7, 0xe28bb8,
+ /* 38 */ 0xe28bb9, 0xe28bba,
+
+ /*** Four byte table, leaf: 8136e7xx - offset 0x06b0c ***/
+
+ /* 30 */ 0xe28bbb, 0xe28bbc, 0xe28bbd, 0xe28bbe,
+ /* 34 */ 0xe28bbf, 0xe28c80, 0xe28c81, 0xe28c82,
+ /* 38 */ 0xe28c83, 0xe28c84,
+
+ /*** Four byte table, leaf: 8136e8xx - offset 0x06b16 ***/
+
+ /* 30 */ 0xe28c85, 0xe28c86, 0xe28c87, 0xe28c88,
+ /* 34 */ 0xe28c89, 0xe28c8a, 0xe28c8b, 0xe28c8c,
+ /* 38 */ 0xe28c8d, 0xe28c8e,
+
+ /*** Four byte table, leaf: 8136e9xx - offset 0x06b20 ***/
+
+ /* 30 */ 0xe28c8f, 0xe28c90, 0xe28c91, 0xe28c93,
+ /* 34 */ 0xe28c94, 0xe28c95, 0xe28c96, 0xe28c97,
+ /* 38 */ 0xe28c98, 0xe28c99,
+
+ /*** Four byte table, leaf: 8136eaxx - offset 0x06b2a ***/
+
+ /* 30 */ 0xe28c9a, 0xe28c9b, 0xe28c9c, 0xe28c9d,
+ /* 34 */ 0xe28c9e, 0xe28c9f, 0xe28ca0, 0xe28ca1,
+ /* 38 */ 0xe28ca2, 0xe28ca3,
+
+ /*** Four byte table, leaf: 8136ebxx - offset 0x06b34 ***/
+
+ /* 30 */ 0xe28ca4, 0xe28ca5, 0xe28ca6, 0xe28ca7,
+ /* 34 */ 0xe28ca8, 0xe28ca9, 0xe28caa, 0xe28cab,
+ /* 38 */ 0xe28cac, 0xe28cad,
+
+ /*** Four byte table, leaf: 8136ecxx - offset 0x06b3e ***/
+
+ /* 30 */ 0xe28cae, 0xe28caf, 0xe28cb0, 0xe28cb1,
+ /* 34 */ 0xe28cb2, 0xe28cb3, 0xe28cb4, 0xe28cb5,
+ /* 38 */ 0xe28cb6, 0xe28cb7,
+
+ /*** Four byte table, leaf: 8136edxx - offset 0x06b48 ***/
+
+ /* 30 */ 0xe28cb8, 0xe28cb9, 0xe28cba, 0xe28cbb,
+ /* 34 */ 0xe28cbc, 0xe28cbd, 0xe28cbe, 0xe28cbf,
+ /* 38 */ 0xe28d80, 0xe28d81,
+
+ /*** Four byte table, leaf: 8136eexx - offset 0x06b52 ***/
+
+ /* 30 */ 0xe28d82, 0xe28d83, 0xe28d84, 0xe28d85,
+ /* 34 */ 0xe28d86, 0xe28d87, 0xe28d88, 0xe28d89,
+ /* 38 */ 0xe28d8a, 0xe28d8b,
+
+ /*** Four byte table, leaf: 8136efxx - offset 0x06b5c ***/
+
+ /* 30 */ 0xe28d8c, 0xe28d8d, 0xe28d8e, 0xe28d8f,
+ /* 34 */ 0xe28d90, 0xe28d91, 0xe28d92, 0xe28d93,
+ /* 38 */ 0xe28d94, 0xe28d95,
+
+ /*** Four byte table, leaf: 8136f0xx - offset 0x06b66 ***/
+
+ /* 30 */ 0xe28d96, 0xe28d97, 0xe28d98, 0xe28d99,
+ /* 34 */ 0xe28d9a, 0xe28d9b, 0xe28d9c, 0xe28d9d,
+ /* 38 */ 0xe28d9e, 0xe28d9f,
+
+ /*** Four byte table, leaf: 8136f1xx - offset 0x06b70 ***/
+
+ /* 30 */ 0xe28da0, 0xe28da1, 0xe28da2, 0xe28da3,
+ /* 34 */ 0xe28da4, 0xe28da5, 0xe28da6, 0xe28da7,
+ /* 38 */ 0xe28da8, 0xe28da9,
+
+ /*** Four byte table, leaf: 8136f2xx - offset 0x06b7a ***/
+
+ /* 30 */ 0xe28daa, 0xe28dab, 0xe28dac, 0xe28dad,
+ /* 34 */ 0xe28dae, 0xe28daf, 0xe28db0, 0xe28db1,
+ /* 38 */ 0xe28db2, 0xe28db3,
+
+ /*** Four byte table, leaf: 8136f3xx - offset 0x06b84 ***/
+
+ /* 30 */ 0xe28db4, 0xe28db5, 0xe28db6, 0xe28db7,
+ /* 34 */ 0xe28db8, 0xe28db9, 0xe28dba, 0xe28dbb,
+ /* 38 */ 0xe28dbc, 0xe28dbd,
+
+ /*** Four byte table, leaf: 8136f4xx - offset 0x06b8e ***/
+
+ /* 30 */ 0xe28dbe, 0xe28dbf, 0xe28e80, 0xe28e81,
+ /* 34 */ 0xe28e82, 0xe28e83, 0xe28e84, 0xe28e85,
+ /* 38 */ 0xe28e86, 0xe28e87,
+
+ /*** Four byte table, leaf: 8136f5xx - offset 0x06b98 ***/
+
+ /* 30 */ 0xe28e88, 0xe28e89, 0xe28e8a, 0xe28e8b,
+ /* 34 */ 0xe28e8c, 0xe28e8d, 0xe28e8e, 0xe28e8f,
+ /* 38 */ 0xe28e90, 0xe28e91,
+
+ /*** Four byte table, leaf: 8136f6xx - offset 0x06ba2 ***/
+
+ /* 30 */ 0xe28e92, 0xe28e93, 0xe28e94, 0xe28e95,
+ /* 34 */ 0xe28e96, 0xe28e97, 0xe28e98, 0xe28e99,
+ /* 38 */ 0xe28e9a, 0xe28e9b,
+
+ /*** Four byte table, leaf: 8136f7xx - offset 0x06bac ***/
+
+ /* 30 */ 0xe28e9c, 0xe28e9d, 0xe28e9e, 0xe28e9f,
+ /* 34 */ 0xe28ea0, 0xe28ea1, 0xe28ea2, 0xe28ea3,
+ /* 38 */ 0xe28ea4, 0xe28ea5,
+
+ /*** Four byte table, leaf: 8136f8xx - offset 0x06bb6 ***/
+
+ /* 30 */ 0xe28ea6, 0xe28ea7, 0xe28ea8, 0xe28ea9,
+ /* 34 */ 0xe28eaa, 0xe28eab, 0xe28eac, 0xe28ead,
+ /* 38 */ 0xe28eae, 0xe28eaf,
+
+ /*** Four byte table, leaf: 8136f9xx - offset 0x06bc0 ***/
+
+ /* 30 */ 0xe28eb0, 0xe28eb1, 0xe28eb2, 0xe28eb3,
+ /* 34 */ 0xe28eb4, 0xe28eb5, 0xe28eb6, 0xe28eb7,
+ /* 38 */ 0xe28eb8, 0xe28eb9,
+
+ /*** Four byte table, leaf: 8136faxx - offset 0x06bca ***/
+
+ /* 30 */ 0xe28eba, 0xe28ebb, 0xe28ebc, 0xe28ebd,
+ /* 34 */ 0xe28ebe, 0xe28ebf, 0xe28f80, 0xe28f81,
+ /* 38 */ 0xe28f82, 0xe28f83,
+
+ /*** Four byte table, leaf: 8136fbxx - offset 0x06bd4 ***/
+
+ /* 30 */ 0xe28f84, 0xe28f85, 0xe28f86, 0xe28f87,
+ /* 34 */ 0xe28f88, 0xe28f89, 0xe28f8a, 0xe28f8b,
+ /* 38 */ 0xe28f8c, 0xe28f8d,
+
+ /*** Four byte table, leaf: 8136fcxx - offset 0x06bde ***/
+
+ /* 30 */ 0xe28f8e, 0xe28f8f, 0xe28f90, 0xe28f91,
+ /* 34 */ 0xe28f92, 0xe28f93, 0xe28f94, 0xe28f95,
+ /* 38 */ 0xe28f96, 0xe28f97,
+
+ /*** Four byte table, leaf: 8136fdxx - offset 0x06be8 ***/
+
+ /* 30 */ 0xe28f98, 0xe28f99, 0xe28f9a, 0xe28f9b,
+ /* 34 */ 0xe28f9c, 0xe28f9d, 0xe28f9e, 0xe28f9f,
+ /* 38 */ 0xe28fa0, 0xe28fa1,
+
+ /*** Four byte table, leaf: 8136fexx - offset 0x06bf2 ***/
+
+ /* 30 */ 0xe28fa2, 0xe28fa3, 0xe28fa4, 0xe28fa5,
+ /* 34 */ 0xe28fa6, 0xe28fa7, 0xe28fa8, 0xe28fa9,
+ /* 38 */ 0xe28faa, 0xe28fab,
+
+ /*** Four byte table, leaf: 813781xx - offset 0x06bfc ***/
+
+ /* 30 */ 0xe28fac, 0xe28fad, 0xe28fae, 0xe28faf,
+ /* 34 */ 0xe28fb0, 0xe28fb1, 0xe28fb2, 0xe28fb3,
+ /* 38 */ 0xe28fb4, 0xe28fb5,
+
+ /*** Four byte table, leaf: 813782xx - offset 0x06c06 ***/
+
+ /* 30 */ 0xe28fb6, 0xe28fb7, 0xe28fb8, 0xe28fb9,
+ /* 34 */ 0xe28fba, 0xe28fbb, 0xe28fbc, 0xe28fbd,
+ /* 38 */ 0xe28fbe, 0xe28fbf,
+
+ /*** Four byte table, leaf: 813783xx - offset 0x06c10 ***/
+
+ /* 30 */ 0xe29080, 0xe29081, 0xe29082, 0xe29083,
+ /* 34 */ 0xe29084, 0xe29085, 0xe29086, 0xe29087,
+ /* 38 */ 0xe29088, 0xe29089,
+
+ /*** Four byte table, leaf: 813784xx - offset 0x06c1a ***/
+
+ /* 30 */ 0xe2908a, 0xe2908b, 0xe2908c, 0xe2908d,
+ /* 34 */ 0xe2908e, 0xe2908f, 0xe29090, 0xe29091,
+ /* 38 */ 0xe29092, 0xe29093,
+
+ /*** Four byte table, leaf: 813785xx - offset 0x06c24 ***/
+
+ /* 30 */ 0xe29094, 0xe29095, 0xe29096, 0xe29097,
+ /* 34 */ 0xe29098, 0xe29099, 0xe2909a, 0xe2909b,
+ /* 38 */ 0xe2909c, 0xe2909d,
+
+ /*** Four byte table, leaf: 813786xx - offset 0x06c2e ***/
+
+ /* 30 */ 0xe2909e, 0xe2909f, 0xe290a0, 0xe290a1,
+ /* 34 */ 0xe290a2, 0xe290a3, 0xe290a4, 0xe290a5,
+ /* 38 */ 0xe290a6, 0xe290a7,
+
+ /*** Four byte table, leaf: 813787xx - offset 0x06c38 ***/
+
+ /* 30 */ 0xe290a8, 0xe290a9, 0xe290aa, 0xe290ab,
+ /* 34 */ 0xe290ac, 0xe290ad, 0xe290ae, 0xe290af,
+ /* 38 */ 0xe290b0, 0xe290b1,
+
+ /*** Four byte table, leaf: 813788xx - offset 0x06c42 ***/
+
+ /* 30 */ 0xe290b2, 0xe290b3, 0xe290b4, 0xe290b5,
+ /* 34 */ 0xe290b6, 0xe290b7, 0xe290b8, 0xe290b9,
+ /* 38 */ 0xe290ba, 0xe290bb,
+
+ /*** Four byte table, leaf: 813789xx - offset 0x06c4c ***/
+
+ /* 30 */ 0xe290bc, 0xe290bd, 0xe290be, 0xe290bf,
+ /* 34 */ 0xe29180, 0xe29181, 0xe29182, 0xe29183,
+ /* 38 */ 0xe29184, 0xe29185,
+
+ /*** Four byte table, leaf: 81378axx - offset 0x06c56 ***/
+
+ /* 30 */ 0xe29186, 0xe29187, 0xe29188, 0xe29189,
+ /* 34 */ 0xe2918a, 0xe2918b, 0xe2918c, 0xe2918d,
+ /* 38 */ 0xe2918e, 0xe2918f,
+
+ /*** Four byte table, leaf: 81378bxx - offset 0x06c60 ***/
+
+ /* 30 */ 0xe29190, 0xe29191, 0xe29192, 0xe29193,
+ /* 34 */ 0xe29194, 0xe29195, 0xe29196, 0xe29197,
+ /* 38 */ 0xe29198, 0xe29199,
+
+ /*** Four byte table, leaf: 81378cxx - offset 0x06c6a ***/
+
+ /* 30 */ 0xe2919a, 0xe2919b, 0xe2919c, 0xe2919d,
+ /* 34 */ 0xe2919e, 0xe2919f, 0xe291aa, 0xe291ab,
+ /* 38 */ 0xe291ac, 0xe291ad,
+
+ /*** Four byte table, leaf: 81378dxx - offset 0x06c74 ***/
+
+ /* 30 */ 0xe291ae, 0xe291af, 0xe291b0, 0xe291b1,
+ /* 34 */ 0xe291b2, 0xe291b3, 0xe2929c, 0xe2929d,
+ /* 38 */ 0xe2929e, 0xe2929f,
+
+ /*** Four byte table, leaf: 81378exx - offset 0x06c7e ***/
+
+ /* 30 */ 0xe292a0, 0xe292a1, 0xe292a2, 0xe292a3,
+ /* 34 */ 0xe292a4, 0xe292a5, 0xe292a6, 0xe292a7,
+ /* 38 */ 0xe292a8, 0xe292a9,
+
+ /*** Four byte table, leaf: 81378fxx - offset 0x06c88 ***/
+
+ /* 30 */ 0xe292aa, 0xe292ab, 0xe292ac, 0xe292ad,
+ /* 34 */ 0xe292ae, 0xe292af, 0xe292b0, 0xe292b1,
+ /* 38 */ 0xe292b2, 0xe292b3,
+
+ /*** Four byte table, leaf: 813790xx - offset 0x06c92 ***/
+
+ /* 30 */ 0xe292b4, 0xe292b5, 0xe292b6, 0xe292b7,
+ /* 34 */ 0xe292b8, 0xe292b9, 0xe292ba, 0xe292bb,
+ /* 38 */ 0xe292bc, 0xe292bd,
+
+ /*** Four byte table, leaf: 813791xx - offset 0x06c9c ***/
+
+ /* 30 */ 0xe292be, 0xe292bf, 0xe29380, 0xe29381,
+ /* 34 */ 0xe29382, 0xe29383, 0xe29384, 0xe29385,
+ /* 38 */ 0xe29386, 0xe29387,
+
+ /*** Four byte table, leaf: 813792xx - offset 0x06ca6 ***/
+
+ /* 30 */ 0xe29388, 0xe29389, 0xe2938a, 0xe2938b,
+ /* 34 */ 0xe2938c, 0xe2938d, 0xe2938e, 0xe2938f,
+ /* 38 */ 0xe29390, 0xe29391,
+
+ /*** Four byte table, leaf: 813793xx - offset 0x06cb0 ***/
+
+ /* 30 */ 0xe29392, 0xe29393, 0xe29394, 0xe29395,
+ /* 34 */ 0xe29396, 0xe29397, 0xe29398, 0xe29399,
+ /* 38 */ 0xe2939a, 0xe2939b,
+
+ /*** Four byte table, leaf: 813794xx - offset 0x06cba ***/
+
+ /* 30 */ 0xe2939c, 0xe2939d, 0xe2939e, 0xe2939f,
+ /* 34 */ 0xe293a0, 0xe293a1, 0xe293a2, 0xe293a3,
+ /* 38 */ 0xe293a4, 0xe293a5,
+
+ /*** Four byte table, leaf: 813795xx - offset 0x06cc4 ***/
+
+ /* 30 */ 0xe293a6, 0xe293a7, 0xe293a8, 0xe293a9,
+ /* 34 */ 0xe293aa, 0xe293ab, 0xe293ac, 0xe293ad,
+ /* 38 */ 0xe293ae, 0xe293af,
+
+ /*** Four byte table, leaf: 813796xx - offset 0x06cce ***/
+
+ /* 30 */ 0xe293b0, 0xe293b1, 0xe293b2, 0xe293b3,
+ /* 34 */ 0xe293b4, 0xe293b5, 0xe293b6, 0xe293b7,
+ /* 38 */ 0xe293b8, 0xe293b9,
+
+ /*** Four byte table, leaf: 813797xx - offset 0x06cd8 ***/
+
+ /* 30 */ 0xe293ba, 0xe293bb, 0xe293bc, 0xe293bd,
+ /* 34 */ 0xe293be, 0xe293bf, 0xe2958c, 0xe2958d,
+ /* 38 */ 0xe2958e, 0xe2958f,
+
+ /*** Four byte table, leaf: 813798xx - offset 0x06ce2 ***/
+
+ /* 30 */ 0xe295b4, 0xe295b5, 0xe295b6, 0xe295b7,
+ /* 34 */ 0xe295b8, 0xe295b9, 0xe295ba, 0xe295bb,
+ /* 38 */ 0xe295bc, 0xe295bd,
+
+ /*** Four byte table, leaf: 813799xx - offset 0x06cec ***/
+
+ /* 30 */ 0xe295be, 0xe295bf, 0xe29680, 0xe29690,
+ /* 34 */ 0xe29691, 0xe29692, 0xe29696, 0xe29697,
+ /* 38 */ 0xe29698, 0xe29699,
+
+ /*** Four byte table, leaf: 81379axx - offset 0x06cf6 ***/
+
+ /* 30 */ 0xe2969a, 0xe2969b, 0xe2969c, 0xe2969d,
+ /* 34 */ 0xe2969e, 0xe2969f, 0xe296a2, 0xe296a3,
+ /* 38 */ 0xe296a4, 0xe296a5,
+
+ /*** Four byte table, leaf: 81379bxx - offset 0x06d00 ***/
+
+ /* 30 */ 0xe296a6, 0xe296a7, 0xe296a8, 0xe296a9,
+ /* 34 */ 0xe296aa, 0xe296ab, 0xe296ac, 0xe296ad,
+ /* 38 */ 0xe296ae, 0xe296af,
+
+ /*** Four byte table, leaf: 81379cxx - offset 0x06d0a ***/
+
+ /* 30 */ 0xe296b0, 0xe296b1, 0xe296b4, 0xe296b5,
+ /* 34 */ 0xe296b6, 0xe296b7, 0xe296b8, 0xe296b9,
+ /* 38 */ 0xe296ba, 0xe296bb,
+
+ /*** Four byte table, leaf: 81379dxx - offset 0x06d14 ***/
+
+ /* 30 */ 0xe296be, 0xe296bf, 0xe29780, 0xe29781,
+ /* 34 */ 0xe29782, 0xe29783, 0xe29784, 0xe29785,
+ /* 38 */ 0xe29788, 0xe29789,
+
+ /*** Four byte table, leaf: 81379exx - offset 0x06d1e ***/
+
+ /* 30 */ 0xe2978a, 0xe2978c, 0xe2978d, 0xe29790,
+ /* 34 */ 0xe29791, 0xe29792, 0xe29793, 0xe29794,
+ /* 38 */ 0xe29795, 0xe29796,
+
+ /*** Four byte table, leaf: 81379fxx - offset 0x06d28 ***/
+
+ /* 30 */ 0xe29797, 0xe29798, 0xe29799, 0xe2979a,
+ /* 34 */ 0xe2979b, 0xe2979c, 0xe2979d, 0xe2979e,
+ /* 38 */ 0xe2979f, 0xe297a0,
+
+ /*** Four byte table, leaf: 8137a0xx - offset 0x06d32 ***/
+
+ /* 30 */ 0xe297a1, 0xe297a6, 0xe297a7, 0xe297a8,
+ /* 34 */ 0xe297a9, 0xe297aa, 0xe297ab, 0xe297ac,
+ /* 38 */ 0xe297ad, 0xe297ae,
+
+ /*** Four byte table, leaf: 8137a1xx - offset 0x06d3c ***/
+
+ /* 30 */ 0xe297af, 0xe297b0, 0xe297b1, 0xe297b2,
+ /* 34 */ 0xe297b3, 0xe297b4, 0xe297b5, 0xe297b6,
+ /* 38 */ 0xe297b7, 0xe297b8,
+
+ /*** Four byte table, leaf: 8137a2xx - offset 0x06d46 ***/
+
+ /* 30 */ 0xe297b9, 0xe297ba, 0xe297bb, 0xe297bc,
+ /* 34 */ 0xe297bd, 0xe297be, 0xe297bf, 0xe29880,
+ /* 38 */ 0xe29881, 0xe29882,
+
+ /*** Four byte table, leaf: 8137a3xx - offset 0x06d50 ***/
+
+ /* 30 */ 0xe29883, 0xe29884, 0xe29887, 0xe29888,
+ /* 34 */ 0xe2988a, 0xe2988b, 0xe2988c, 0xe2988d,
+ /* 38 */ 0xe2988e, 0xe2988f,
+
+ /*** Four byte table, leaf: 8137a4xx - offset 0x06d5a ***/
+
+ /* 30 */ 0xe29890, 0xe29891, 0xe29892, 0xe29893,
+ /* 34 */ 0xe29894, 0xe29895, 0xe29896, 0xe29897,
+ /* 38 */ 0xe29898, 0xe29899,
+
+ /*** Four byte table, leaf: 8137a5xx - offset 0x06d64 ***/
+
+ /* 30 */ 0xe2989a, 0xe2989b, 0xe2989c, 0xe2989d,
+ /* 34 */ 0xe2989e, 0xe2989f, 0xe298a0, 0xe298a1,
+ /* 38 */ 0xe298a2, 0xe298a3,
+
+ /*** Four byte table, leaf: 8137a6xx - offset 0x06d6e ***/
+
+ /* 30 */ 0xe298a4, 0xe298a5, 0xe298a6, 0xe298a7,
+ /* 34 */ 0xe298a8, 0xe298a9, 0xe298aa, 0xe298ab,
+ /* 38 */ 0xe298ac, 0xe298ad,
+
+ /*** Four byte table, leaf: 8137a7xx - offset 0x06d78 ***/
+
+ /* 30 */ 0xe298ae, 0xe298af, 0xe298b0, 0xe298b1,
+ /* 34 */ 0xe298b2, 0xe298b3, 0xe298b4, 0xe298b5,
+ /* 38 */ 0xe298b6, 0xe298b7,
+
+ /*** Four byte table, leaf: 8137a8xx - offset 0x06d82 ***/
+
+ /* 30 */ 0xe298b8, 0xe298b9, 0xe298ba, 0xe298bb,
+ /* 34 */ 0xe298bc, 0xe298bd, 0xe298be, 0xe298bf,
+ /* 38 */ 0xe29981,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8138fdxx - offset 0x06d8b ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0xe2ba82,
+
+ /*** Four byte table, leaf: 8138fexx - offset 0x06d95 ***/
+
+ /* 30 */ 0xe2ba83, 0xe2ba85, 0xe2ba86, 0xe2ba87,
+ /* 34 */ 0xe2ba89, 0xe2ba8a, 0xe2ba8d, 0xe2ba8e,
+ /* 38 */ 0xe2ba8f, 0xe2ba90,
+
+ /*** Four byte table, leaf: 813981xx - offset 0x06d9f ***/
+
+ /* 30 */ 0xe2ba91, 0xe2ba92, 0xe2ba93, 0xe2ba94,
+ /* 34 */ 0xe2ba95, 0xe2ba96, 0xe2ba98, 0xe2ba99,
+ /* 38 */ 0xe2ba9a, 0xe2ba9b,
+
+ /*** Four byte table, leaf: 813982xx - offset 0x06da9 ***/
+
+ /* 30 */ 0xe2ba9c, 0xe2ba9d, 0xe2ba9e, 0xe2ba9f,
+ /* 34 */ 0xe2baa0, 0xe2baa1, 0xe2baa2, 0xe2baa3,
+ /* 38 */ 0xe2baa4, 0xe2baa5,
+
+ /*** Four byte table, leaf: 813983xx - offset 0x06db3 ***/
+
+ /* 30 */ 0xe2baa6, 0xe2baa8, 0xe2baa9, 0xe2baab,
+ /* 34 */ 0xe2baac, 0xe2baad, 0xe2baaf, 0xe2bab0,
+ /* 38 */ 0xe2bab1, 0xe2bab2,
+
+ /*** Four byte table, leaf: 813984xx - offset 0x06dbd ***/
+
+ /* 30 */ 0xe2bab4, 0xe2bab5, 0xe2bab8, 0xe2bab9,
+ /* 34 */ 0xe2baba, 0xe2babc, 0xe2babd, 0xe2babe,
+ /* 38 */ 0xe2babf, 0xe2bb80,
+
+ /*** Four byte table, leaf: 813985xx - offset 0x06dc7 ***/
+
+ /* 30 */ 0xe2bb81, 0xe2bb82, 0xe2bb83, 0xe2bb84,
+ /* 34 */ 0xe2bb85, 0xe2bb86, 0xe2bb87, 0xe2bb88,
+ /* 38 */ 0xe2bb89, 0xe2bb8b,
+
+ /*** Four byte table, leaf: 813986xx - offset 0x06dd1 ***/
+
+ /* 30 */ 0xe2bb8c, 0xe2bb8d, 0xe2bb8e, 0xe2bb8f,
+ /* 34 */ 0xe2bb90, 0xe2bb91, 0xe2bb92, 0xe2bb93,
+ /* 38 */ 0xe2bb94, 0xe2bb95,
+
+ /*** Four byte table, leaf: 813987xx - offset 0x06ddb ***/
+
+ /* 30 */ 0xe2bb96, 0xe2bb97, 0xe2bb98, 0xe2bb99,
+ /* 34 */ 0xe2bb9a, 0xe2bb9b, 0xe2bb9c, 0xe2bb9d,
+ /* 38 */ 0xe2bb9e, 0xe2bb9f,
+
+ /*** Four byte table, leaf: 813988xx - offset 0x06de5 ***/
+
+ /* 30 */ 0xe2bba0, 0xe2bba1, 0xe2bba2, 0xe2bba3,
+ /* 34 */ 0xe2bba4, 0xe2bba5, 0xe2bba6, 0xe2bba7,
+ /* 38 */ 0xe2bba8, 0xe2bba9,
+
+ /*** Four byte table, leaf: 813989xx - offset 0x06def ***/
+
+ /* 30 */ 0xe2bbaa, 0xe2bbab, 0xe2bbac, 0xe2bbad,
+ /* 34 */ 0xe2bbae, 0xe2bbaf, 0xe2bbb0, 0xe2bbb1,
+ /* 38 */ 0xe2bbb2, 0xe2bbb3,
+
+ /*** Four byte table, leaf: 81398axx - offset 0x06df9 ***/
+
+ /* 30 */ 0xe2bbb4, 0xe2bbb5, 0xe2bbb6, 0xe2bbb7,
+ /* 34 */ 0xe2bbb8, 0xe2bbb9, 0xe2bbba, 0xe2bbbb,
+ /* 38 */ 0xe2bbbc, 0xe2bbbd,
+
+ /*** Four byte table, leaf: 81398bxx - offset 0x06e03 ***/
+
+ /* 30 */ 0xe2bbbe, 0xe2bbbf, 0xe2bc80, 0xe2bc81,
+ /* 34 */ 0xe2bc82, 0xe2bc83, 0xe2bc84, 0xe2bc85,
+ /* 38 */ 0xe2bc86, 0xe2bc87,
+
+ /*** Four byte table, leaf: 81398cxx - offset 0x06e0d ***/
+
+ /* 30 */ 0xe2bc88, 0xe2bc89, 0xe2bc8a, 0xe2bc8b,
+ /* 34 */ 0xe2bc8c, 0xe2bc8d, 0xe2bc8e, 0xe2bc8f,
+ /* 38 */ 0xe2bc90, 0xe2bc91,
+
+ /*** Four byte table, leaf: 81398dxx - offset 0x06e17 ***/
+
+ /* 30 */ 0xe2bc92, 0xe2bc93, 0xe2bc94, 0xe2bc95,
+ /* 34 */ 0xe2bc96, 0xe2bc97, 0xe2bc98, 0xe2bc99,
+ /* 38 */ 0xe2bc9a, 0xe2bc9b,
+
+ /*** Four byte table, leaf: 81398exx - offset 0x06e21 ***/
+
+ /* 30 */ 0xe2bc9c, 0xe2bc9d, 0xe2bc9e, 0xe2bc9f,
+ /* 34 */ 0xe2bca0, 0xe2bca1, 0xe2bca2, 0xe2bca3,
+ /* 38 */ 0xe2bca4, 0xe2bca5,
+
+ /*** Four byte table, leaf: 81398fxx - offset 0x06e2b ***/
+
+ /* 30 */ 0xe2bca6, 0xe2bca7, 0xe2bca8, 0xe2bca9,
+ /* 34 */ 0xe2bcaa, 0xe2bcab, 0xe2bcac, 0xe2bcad,
+ /* 38 */ 0xe2bcae, 0xe2bcaf,
+
+ /*** Four byte table, leaf: 813990xx - offset 0x06e35 ***/
+
+ /* 30 */ 0xe2bcb0, 0xe2bcb1, 0xe2bcb2, 0xe2bcb3,
+ /* 34 */ 0xe2bcb4, 0xe2bcb5, 0xe2bcb6, 0xe2bcb7,
+ /* 38 */ 0xe2bcb8, 0xe2bcb9,
+
+ /*** Four byte table, leaf: 813991xx - offset 0x06e3f ***/
+
+ /* 30 */ 0xe2bcba, 0xe2bcbb, 0xe2bcbc, 0xe2bcbd,
+ /* 34 */ 0xe2bcbe, 0xe2bcbf, 0xe2bd80, 0xe2bd81,
+ /* 38 */ 0xe2bd82, 0xe2bd83,
+
+ /*** Four byte table, leaf: 813992xx - offset 0x06e49 ***/
+
+ /* 30 */ 0xe2bd84, 0xe2bd85, 0xe2bd86, 0xe2bd87,
+ /* 34 */ 0xe2bd88, 0xe2bd89, 0xe2bd8a, 0xe2bd8b,
+ /* 38 */ 0xe2bd8c, 0xe2bd8d,
+
+ /*** Four byte table, leaf: 813993xx - offset 0x06e53 ***/
+
+ /* 30 */ 0xe2bd8e, 0xe2bd8f, 0xe2bd90, 0xe2bd91,
+ /* 34 */ 0xe2bd92, 0xe2bd93, 0xe2bd94, 0xe2bd95,
+ /* 38 */ 0xe2bd96, 0xe2bd97,
+
+ /*** Four byte table, leaf: 813994xx - offset 0x06e5d ***/
+
+ /* 30 */ 0xe2bd98, 0xe2bd99, 0xe2bd9a, 0xe2bd9b,
+ /* 34 */ 0xe2bd9c, 0xe2bd9d, 0xe2bd9e, 0xe2bd9f,
+ /* 38 */ 0xe2bda0, 0xe2bda1,
+
+ /*** Four byte table, leaf: 813995xx - offset 0x06e67 ***/
+
+ /* 30 */ 0xe2bda2, 0xe2bda3, 0xe2bda4, 0xe2bda5,
+ /* 34 */ 0xe2bda6, 0xe2bda7, 0xe2bda8, 0xe2bda9,
+ /* 38 */ 0xe2bdaa, 0xe2bdab,
+
+ /*** Four byte table, leaf: 813996xx - offset 0x06e71 ***/
+
+ /* 30 */ 0xe2bdac, 0xe2bdad, 0xe2bdae, 0xe2bdaf,
+ /* 34 */ 0xe2bdb0, 0xe2bdb1, 0xe2bdb2, 0xe2bdb3,
+ /* 38 */ 0xe2bdb4, 0xe2bdb5,
+
+ /*** Four byte table, leaf: 813997xx - offset 0x06e7b ***/
+
+ /* 30 */ 0xe2bdb6, 0xe2bdb7, 0xe2bdb8, 0xe2bdb9,
+ /* 34 */ 0xe2bdba, 0xe2bdbb, 0xe2bdbc, 0xe2bdbd,
+ /* 38 */ 0xe2bdbe, 0xe2bdbf,
+
+ /*** Four byte table, leaf: 813998xx - offset 0x06e85 ***/
+
+ /* 30 */ 0xe2be80, 0xe2be81, 0xe2be82, 0xe2be83,
+ /* 34 */ 0xe2be84, 0xe2be85, 0xe2be86, 0xe2be87,
+ /* 38 */ 0xe2be88, 0xe2be89,
+
+ /*** Four byte table, leaf: 813999xx - offset 0x06e8f ***/
+
+ /* 30 */ 0xe2be8a, 0xe2be8b, 0xe2be8c, 0xe2be8d,
+ /* 34 */ 0xe2be8e, 0xe2be8f, 0xe2be90, 0xe2be91,
+ /* 38 */ 0xe2be92, 0xe2be93,
+
+ /*** Four byte table, leaf: 81399axx - offset 0x06e99 ***/
+
+ /* 30 */ 0xe2be94, 0xe2be95, 0xe2be96, 0xe2be97,
+ /* 34 */ 0xe2be98, 0xe2be99, 0xe2be9a, 0xe2be9b,
+ /* 38 */ 0xe2be9c, 0xe2be9d,
+
+ /*** Four byte table, leaf: 81399bxx - offset 0x06ea3 ***/
+
+ /* 30 */ 0xe2be9e, 0xe2be9f, 0xe2bea0, 0xe2bea1,
+ /* 34 */ 0xe2bea2, 0xe2bea3, 0xe2bea4, 0xe2bea5,
+ /* 38 */ 0xe2bea6, 0xe2bea7,
+
+ /*** Four byte table, leaf: 81399cxx - offset 0x06ead ***/
+
+ /* 30 */ 0xe2bea8, 0xe2bea9, 0xe2beaa, 0xe2beab,
+ /* 34 */ 0xe2beac, 0xe2bead, 0xe2beae, 0xe2beaf,
+ /* 38 */ 0xe2beb0, 0xe2beb1,
+
+ /*** Four byte table, leaf: 81399dxx - offset 0x06eb7 ***/
+
+ /* 30 */ 0xe2beb2, 0xe2beb3, 0xe2beb4, 0xe2beb5,
+ /* 34 */ 0xe2beb6, 0xe2beb7, 0xe2beb8, 0xe2beb9,
+ /* 38 */ 0xe2beba, 0xe2bebb,
+
+ /*** Four byte table, leaf: 81399exx - offset 0x06ec1 ***/
+
+ /* 30 */ 0xe2bebc, 0xe2bebd, 0xe2bebe, 0xe2bebf,
+ /* 34 */ 0xe2bf80, 0xe2bf81, 0xe2bf82, 0xe2bf83,
+ /* 38 */ 0xe2bf84, 0xe2bf85,
+
+ /*** Four byte table, leaf: 81399fxx - offset 0x06ecb ***/
+
+ /* 30 */ 0xe2bf86, 0xe2bf87, 0xe2bf88, 0xe2bf89,
+ /* 34 */ 0xe2bf8a, 0xe2bf8b, 0xe2bf8c, 0xe2bf8d,
+ /* 38 */ 0xe2bf8e, 0xe2bf8f,
+
+ /*** Four byte table, leaf: 8139a0xx - offset 0x06ed5 ***/
+
+ /* 30 */ 0xe2bf90, 0xe2bf91, 0xe2bf92, 0xe2bf93,
+ /* 34 */ 0xe2bf94, 0xe2bf95, 0xe2bf96, 0xe2bf97,
+ /* 38 */ 0xe2bf98, 0xe2bf99,
+
+ /*** Four byte table, leaf: 8139a1xx - offset 0x06edf ***/
+
+ /* 30 */ 0xe2bf9a, 0xe2bf9b, 0xe2bf9c, 0xe2bf9d,
+ /* 34 */ 0xe2bf9e, 0xe2bf9f, 0xe2bfa0, 0xe2bfa1,
+ /* 38 */ 0xe2bfa2, 0xe2bfa3,
+
+ /*** Four byte table, leaf: 8139a2xx - offset 0x06ee9 ***/
+
+ /* 30 */ 0xe2bfa4, 0xe2bfa5, 0xe2bfa6, 0xe2bfa7,
+ /* 34 */ 0xe2bfa8, 0xe2bfa9, 0xe2bfaa, 0xe2bfab,
+ /* 38 */ 0xe2bfac, 0xe2bfad,
+
+ /*** Four byte table, leaf: 8139a3xx - offset 0x06ef3 ***/
+
+ /* 30 */ 0xe2bfae, 0xe2bfaf, 0xe2bfbc, 0xe2bfbd,
+ /* 34 */ 0xe2bfbe, 0xe2bfbf, 0xe38084, 0xe38098,
+ /* 38 */ 0xe38099, 0xe3809a,
+
+ /*** Four byte table, leaf: 8139a4xx - offset 0x06efd ***/
+
+ /* 30 */ 0xe3809b, 0xe3809c, 0xe3809f, 0xe380a0,
+ /* 34 */ 0xe380aa, 0xe380ab, 0xe380ac, 0xe380ad,
+ /* 38 */ 0xe380ae, 0xe380af,
+
+ /*** Four byte table, leaf: 8139a5xx - offset 0x06f07 ***/
+
+ /* 30 */ 0xe380b0, 0xe380b1, 0xe380b2, 0xe380b3,
+ /* 34 */ 0xe380b4, 0xe380b5, 0xe380b6, 0xe380b7,
+ /* 38 */ 0xe380b8, 0xe380b9,
+
+ /*** Four byte table, leaf: 8139a6xx - offset 0x06f11 ***/
+
+ /* 30 */ 0xe380ba, 0xe380bb, 0xe380bc, 0xe380bd,
+ /* 34 */ 0xe380bf, 0xe38180, 0xe38294, 0xe38295,
+ /* 38 */ 0xe38296, 0xe38297,
+
+ /*** Four byte table, leaf: 8139a7xx - offset 0x06f1b ***/
+
+ /* 30 */ 0xe38298, 0xe38299, 0xe3829a, 0xe3829f,
+ /* 34 */ 0xe382a0, 0xe383b7, 0xe383b8, 0xe383b9,
+ /* 38 */ 0xe383ba, 0xe383bb,
+
+ /*** Four byte table, leaf: 8139a8xx - offset 0x06f25 ***/
+
+ /* 30 */ 0xe383bf, 0xe38480, 0xe38481, 0xe38482,
+ /* 34 */ 0xe38483, 0xe38484, 0xe384aa, 0xe384ab,
+ /* 38 */ 0xe384ac, 0xe384ad,
+
+ /*** Four byte table, leaf: 8139a9xx - offset 0x06f2f ***/
+
+ /* 30 */ 0xe384ae, 0xe384af, 0xe384b0, 0xe384b1,
+ /* 34 */ 0xe384b2, 0xe384b3, 0xe384b4, 0xe384b5,
+ /* 38 */ 0xe384b6, 0xe384b7,
+
+ /*** Four byte table, leaf: 8139aaxx - offset 0x06f39 ***/
+
+ /* 30 */ 0xe384b8, 0xe384b9, 0xe384ba, 0xe384bb,
+ /* 34 */ 0xe384bc, 0xe384bd, 0xe384be, 0xe384bf,
+ /* 38 */ 0xe38580, 0xe38581,
+
+ /*** Four byte table, leaf: 8139abxx - offset 0x06f43 ***/
+
+ /* 30 */ 0xe38582, 0xe38583, 0xe38584, 0xe38585,
+ /* 34 */ 0xe38586, 0xe38587, 0xe38588, 0xe38589,
+ /* 38 */ 0xe3858a, 0xe3858b,
+
+ /*** Four byte table, leaf: 8139acxx - offset 0x06f4d ***/
+
+ /* 30 */ 0xe3858c, 0xe3858d, 0xe3858e, 0xe3858f,
+ /* 34 */ 0xe38590, 0xe38591, 0xe38592, 0xe38593,
+ /* 38 */ 0xe38594, 0xe38595,
+
+ /*** Four byte table, leaf: 8139adxx - offset 0x06f57 ***/
+
+ /* 30 */ 0xe38596, 0xe38597, 0xe38598, 0xe38599,
+ /* 34 */ 0xe3859a, 0xe3859b, 0xe3859c, 0xe3859d,
+ /* 38 */ 0xe3859e, 0xe3859f,
+
+ /*** Four byte table, leaf: 8139aexx - offset 0x06f61 ***/
+
+ /* 30 */ 0xe385a0, 0xe385a1, 0xe385a2, 0xe385a3,
+ /* 34 */ 0xe385a4, 0xe385a5, 0xe385a6, 0xe385a7,
+ /* 38 */ 0xe385a8, 0xe385a9,
+
+ /*** Four byte table, leaf: 8139afxx - offset 0x06f6b ***/
+
+ /* 30 */ 0xe385aa, 0xe385ab, 0xe385ac, 0xe385ad,
+ /* 34 */ 0xe385ae, 0xe385af, 0xe385b0, 0xe385b1,
+ /* 38 */ 0xe385b2, 0xe385b3,
+
+ /*** Four byte table, leaf: 8139b0xx - offset 0x06f75 ***/
+
+ /* 30 */ 0xe385b4, 0xe385b5, 0xe385b6, 0xe385b7,
+ /* 34 */ 0xe385b8, 0xe385b9, 0xe385ba, 0xe385bb,
+ /* 38 */ 0xe385bc, 0xe385bd,
+
+ /*** Four byte table, leaf: 8139b1xx - offset 0x06f7f ***/
+
+ /* 30 */ 0xe385be, 0xe385bf, 0xe38680, 0xe38681,
+ /* 34 */ 0xe38682, 0xe38683, 0xe38684, 0xe38685,
+ /* 38 */ 0xe38686, 0xe38687,
+
+ /*** Four byte table, leaf: 8139b2xx - offset 0x06f89 ***/
+
+ /* 30 */ 0xe38688, 0xe38689, 0xe3868a, 0xe3868b,
+ /* 34 */ 0xe3868c, 0xe3868d, 0xe3868e, 0xe3868f,
+ /* 38 */ 0xe38690, 0xe38691,
+
+ /*** Four byte table, leaf: 8139b3xx - offset 0x06f93 ***/
+
+ /* 30 */ 0xe38692, 0xe38693, 0xe38694, 0xe38695,
+ /* 34 */ 0xe38696, 0xe38697, 0xe38698, 0xe38699,
+ /* 38 */ 0xe3869a, 0xe3869b,
+
+ /*** Four byte table, leaf: 8139b4xx - offset 0x06f9d ***/
+
+ /* 30 */ 0xe3869c, 0xe3869d, 0xe3869e, 0xe3869f,
+ /* 34 */ 0xe386a0, 0xe386a1, 0xe386a2, 0xe386a3,
+ /* 38 */ 0xe386a4, 0xe386a5,
+
+ /*** Four byte table, leaf: 8139b5xx - offset 0x06fa7 ***/
+
+ /* 30 */ 0xe386a6, 0xe386a7, 0xe386a8, 0xe386a9,
+ /* 34 */ 0xe386aa, 0xe386ab, 0xe386ac, 0xe386ad,
+ /* 38 */ 0xe386ae, 0xe386af,
+
+ /*** Four byte table, leaf: 8139b6xx - offset 0x06fb1 ***/
+
+ /* 30 */ 0xe386b0, 0xe386b1, 0xe386b2, 0xe386b3,
+ /* 34 */ 0xe386b4, 0xe386b5, 0xe386b6, 0xe386b7,
+ /* 38 */ 0xe386b8, 0xe386b9,
+
+ /*** Four byte table, leaf: 8139b7xx - offset 0x06fbb ***/
+
+ /* 30 */ 0xe386ba, 0xe386bb, 0xe386bc, 0xe386bd,
+ /* 34 */ 0xe386be, 0xe386bf, 0xe38780, 0xe38781,
+ /* 38 */ 0xe38782, 0xe38783,
+
+ /*** Four byte table, leaf: 8139b8xx - offset 0x06fc5 ***/
+
+ /* 30 */ 0xe38784, 0xe38785, 0xe38786, 0xe38787,
+ /* 34 */ 0xe38788, 0xe38789, 0xe3878a, 0xe3878b,
+ /* 38 */ 0xe3878c, 0xe3878d,
+
+ /*** Four byte table, leaf: 8139b9xx - offset 0x06fcf ***/
+
+ /* 30 */ 0xe3878e, 0xe3878f, 0xe38790, 0xe38791,
+ /* 34 */ 0xe38792, 0xe38793, 0xe38794, 0xe38795,
+ /* 38 */ 0xe38796, 0xe38797,
+
+ /*** Four byte table, leaf: 8139baxx - offset 0x06fd9 ***/
+
+ /* 30 */ 0xe38798, 0xe38799, 0xe3879a, 0xe3879b,
+ /* 34 */ 0xe3879c, 0xe3879d, 0xe3879e, 0xe3879f,
+ /* 38 */ 0xe387a0, 0xe387a1,
+
+ /*** Four byte table, leaf: 8139bbxx - offset 0x06fe3 ***/
+
+ /* 30 */ 0xe387a2, 0xe387a3, 0xe387a4, 0xe387a5,
+ /* 34 */ 0xe387a6, 0xe387a7, 0xe387a8, 0xe387a9,
+ /* 38 */ 0xe387aa, 0xe387ab,
+
+ /*** Four byte table, leaf: 8139bcxx - offset 0x06fed ***/
+
+ /* 30 */ 0xe387ac, 0xe387ad, 0xe387ae, 0xe387af,
+ /* 34 */ 0xe387b0, 0xe387b1, 0xe387b2, 0xe387b3,
+ /* 38 */ 0xe387b4, 0xe387b5,
+
+ /*** Four byte table, leaf: 8139bdxx - offset 0x06ff7 ***/
+
+ /* 30 */ 0xe387b6, 0xe387b7, 0xe387b8, 0xe387b9,
+ /* 34 */ 0xe387ba, 0xe387bb, 0xe387bc, 0xe387bd,
+ /* 38 */ 0xe387be, 0xe387bf,
+
+ /*** Four byte table, leaf: 8139bexx - offset 0x07001 ***/
+
+ /* 30 */ 0xe38880, 0xe38881, 0xe38882, 0xe38883,
+ /* 34 */ 0xe38884, 0xe38885, 0xe38886, 0xe38887,
+ /* 38 */ 0xe38888, 0xe38889,
+
+ /*** Four byte table, leaf: 8139bfxx - offset 0x0700b ***/
+
+ /* 30 */ 0xe3888a, 0xe3888b, 0xe3888c, 0xe3888d,
+ /* 34 */ 0xe3888e, 0xe3888f, 0xe38890, 0xe38891,
+ /* 38 */ 0xe38892, 0xe38893,
+
+ /*** Four byte table, leaf: 8139c0xx - offset 0x07015 ***/
+
+ /* 30 */ 0xe38894, 0xe38895, 0xe38896, 0xe38897,
+ /* 34 */ 0xe38898, 0xe38899, 0xe3889a, 0xe3889b,
+ /* 38 */ 0xe3889c, 0xe3889d,
+
+ /*** Four byte table, leaf: 8139c1xx - offset 0x0701f ***/
+
+ /* 30 */ 0xe3889e, 0xe3889f, 0xe388aa, 0xe388ab,
+ /* 34 */ 0xe388ac, 0xe388ad, 0xe388ae, 0xe388af,
+ /* 38 */ 0xe388b0, 0xe388b2,
+
+ /*** Four byte table, leaf: 8139c2xx - offset 0x07029 ***/
+
+ /* 30 */ 0xe388b3, 0xe388b4, 0xe388b5, 0xe388b6,
+ /* 34 */ 0xe388b7, 0xe388b8, 0xe388b9, 0xe388ba,
+ /* 38 */ 0xe388bb, 0xe388bc,
+
+ /*** Four byte table, leaf: 8139c3xx - offset 0x07033 ***/
+
+ /* 30 */ 0xe388bd, 0xe388be, 0xe388bf, 0xe38980,
+ /* 34 */ 0xe38981, 0xe38982, 0xe38983, 0xe38984,
+ /* 38 */ 0xe38985, 0xe38986,
+
+ /*** Four byte table, leaf: 8139c4xx - offset 0x0703d ***/
+
+ /* 30 */ 0xe38987, 0xe38988, 0xe38989, 0xe3898a,
+ /* 34 */ 0xe3898b, 0xe3898c, 0xe3898d, 0xe3898e,
+ /* 38 */ 0xe3898f, 0xe38990,
+
+ /*** Four byte table, leaf: 8139c5xx - offset 0x07047 ***/
+
+ /* 30 */ 0xe38991, 0xe38992, 0xe38993, 0xe38994,
+ /* 34 */ 0xe38995, 0xe38996, 0xe38997, 0xe38998,
+ /* 38 */ 0xe38999, 0xe3899a,
+
+ /*** Four byte table, leaf: 8139c6xx - offset 0x07051 ***/
+
+ /* 30 */ 0xe3899b, 0xe3899c, 0xe3899d, 0xe3899e,
+ /* 34 */ 0xe3899f, 0xe389a0, 0xe389a1, 0xe389a2,
+ /* 38 */ 0xe389a3, 0xe389a4,
+
+ /*** Four byte table, leaf: 8139c7xx - offset 0x0705b ***/
+
+ /* 30 */ 0xe389a5, 0xe389a6, 0xe389a7, 0xe389a8,
+ /* 34 */ 0xe389a9, 0xe389aa, 0xe389ab, 0xe389ac,
+ /* 38 */ 0xe389ad, 0xe389ae,
+
+ /*** Four byte table, leaf: 8139c8xx - offset 0x07065 ***/
+
+ /* 30 */ 0xe389af, 0xe389b0, 0xe389b1, 0xe389b2,
+ /* 34 */ 0xe389b3, 0xe389b4, 0xe389b5, 0xe389b6,
+ /* 38 */ 0xe389b7, 0xe389b8,
+
+ /*** Four byte table, leaf: 8139c9xx - offset 0x0706f ***/
+
+ /* 30 */ 0xe389b9, 0xe389ba, 0xe389bb, 0xe389bc,
+ /* 34 */ 0xe389bd, 0xe389be, 0xe389bf, 0xe38a80,
+ /* 38 */ 0xe38a81, 0xe38a82,
+
+ /*** Four byte table, leaf: 8139caxx - offset 0x07079 ***/
+
+ /* 30 */ 0xe38a83, 0xe38a84, 0xe38a85, 0xe38a86,
+ /* 34 */ 0xe38a87, 0xe38a88, 0xe38a89, 0xe38a8a,
+ /* 38 */ 0xe38a8b, 0xe38a8c,
+
+ /*** Four byte table, leaf: 8139cbxx - offset 0x07083 ***/
+
+ /* 30 */ 0xe38a8d, 0xe38a8e, 0xe38a8f, 0xe38a90,
+ /* 34 */ 0xe38a91, 0xe38a92, 0xe38a93, 0xe38a94,
+ /* 38 */ 0xe38a95, 0xe38a96,
+
+ /*** Four byte table, leaf: 8139ccxx - offset 0x0708d ***/
+
+ /* 30 */ 0xe38a97, 0xe38a98, 0xe38a99, 0xe38a9a,
+ /* 34 */ 0xe38a9b, 0xe38a9c, 0xe38a9d, 0xe38a9e,
+ /* 38 */ 0xe38a9f, 0xe38aa0,
+
+ /*** Four byte table, leaf: 8139cdxx - offset 0x07097 ***/
+
+ /* 30 */ 0xe38aa1, 0xe38aa2, 0xe38aa4, 0xe38aa5,
+ /* 34 */ 0xe38aa6, 0xe38aa7, 0xe38aa8, 0xe38aa9,
+ /* 38 */ 0xe38aaa, 0xe38aab,
+
+ /*** Four byte table, leaf: 8139cexx - offset 0x070a1 ***/
+
+ /* 30 */ 0xe38aac, 0xe38aad, 0xe38aae, 0xe38aaf,
+ /* 34 */ 0xe38ab0, 0xe38ab1, 0xe38ab2, 0xe38ab3,
+ /* 38 */ 0xe38ab4, 0xe38ab5,
+
+ /*** Four byte table, leaf: 8139cfxx - offset 0x070ab ***/
+
+ /* 30 */ 0xe38ab6, 0xe38ab7, 0xe38ab8, 0xe38ab9,
+ /* 34 */ 0xe38aba, 0xe38abb, 0xe38abc, 0xe38abd,
+ /* 38 */ 0xe38abe, 0xe38abf,
+
+ /*** Four byte table, leaf: 8139d0xx - offset 0x070b5 ***/
+
+ /* 30 */ 0xe38b80, 0xe38b81, 0xe38b82, 0xe38b83,
+ /* 34 */ 0xe38b84, 0xe38b85, 0xe38b86, 0xe38b87,
+ /* 38 */ 0xe38b88, 0xe38b89,
+
+ /*** Four byte table, leaf: 8139d1xx - offset 0x070bf ***/
+
+ /* 30 */ 0xe38b8a, 0xe38b8b, 0xe38b8c, 0xe38b8d,
+ /* 34 */ 0xe38b8e, 0xe38b8f, 0xe38b90, 0xe38b91,
+ /* 38 */ 0xe38b92, 0xe38b93,
+
+ /*** Four byte table, leaf: 8139d2xx - offset 0x070c9 ***/
+
+ /* 30 */ 0xe38b94, 0xe38b95, 0xe38b96, 0xe38b97,
+ /* 34 */ 0xe38b98, 0xe38b99, 0xe38b9a, 0xe38b9b,
+ /* 38 */ 0xe38b9c, 0xe38b9d,
+
+ /*** Four byte table, leaf: 8139d3xx - offset 0x070d3 ***/
+
+ /* 30 */ 0xe38b9e, 0xe38b9f, 0xe38ba0, 0xe38ba1,
+ /* 34 */ 0xe38ba2, 0xe38ba3, 0xe38ba4, 0xe38ba5,
+ /* 38 */ 0xe38ba6, 0xe38ba7,
+
+ /*** Four byte table, leaf: 8139d4xx - offset 0x070dd ***/
+
+ /* 30 */ 0xe38ba8, 0xe38ba9, 0xe38baa, 0xe38bab,
+ /* 34 */ 0xe38bac, 0xe38bad, 0xe38bae, 0xe38baf,
+ /* 38 */ 0xe38bb0, 0xe38bb1,
+
+ /*** Four byte table, leaf: 8139d5xx - offset 0x070e7 ***/
+
+ /* 30 */ 0xe38bb2, 0xe38bb3, 0xe38bb4, 0xe38bb5,
+ /* 34 */ 0xe38bb6, 0xe38bb7, 0xe38bb8, 0xe38bb9,
+ /* 38 */ 0xe38bba, 0xe38bbb,
+
+ /*** Four byte table, leaf: 8139d6xx - offset 0x070f1 ***/
+
+ /* 30 */ 0xe38bbc, 0xe38bbd, 0xe38bbe, 0xe38bbf,
+ /* 34 */ 0xe38c80, 0xe38c81, 0xe38c82, 0xe38c83,
+ /* 38 */ 0xe38c84, 0xe38c85,
+
+ /*** Four byte table, leaf: 8139d7xx - offset 0x070fb ***/
+
+ /* 30 */ 0xe38c86, 0xe38c87, 0xe38c88, 0xe38c89,
+ /* 34 */ 0xe38c8a, 0xe38c8b, 0xe38c8c, 0xe38c8d,
+ /* 38 */ 0xe38c8e, 0xe38c8f,
+
+ /*** Four byte table, leaf: 8139d8xx - offset 0x07105 ***/
+
+ /* 30 */ 0xe38c90, 0xe38c91, 0xe38c92, 0xe38c93,
+ /* 34 */ 0xe38c94, 0xe38c95, 0xe38c96, 0xe38c97,
+ /* 38 */ 0xe38c98, 0xe38c99,
+
+ /*** Four byte table, leaf: 8139d9xx - offset 0x0710f ***/
+
+ /* 30 */ 0xe38c9a, 0xe38c9b, 0xe38c9c, 0xe38c9d,
+ /* 34 */ 0xe38c9e, 0xe38c9f, 0xe38ca0, 0xe38ca1,
+ /* 38 */ 0xe38ca2, 0xe38ca3,
+
+ /*** Four byte table, leaf: 8139daxx - offset 0x07119 ***/
+
+ /* 30 */ 0xe38ca4, 0xe38ca5, 0xe38ca6, 0xe38ca7,
+ /* 34 */ 0xe38ca8, 0xe38ca9, 0xe38caa, 0xe38cab,
+ /* 38 */ 0xe38cac, 0xe38cad,
+
+ /*** Four byte table, leaf: 8139dbxx - offset 0x07123 ***/
+
+ /* 30 */ 0xe38cae, 0xe38caf, 0xe38cb0, 0xe38cb1,
+ /* 34 */ 0xe38cb2, 0xe38cb3, 0xe38cb4, 0xe38cb5,
+ /* 38 */ 0xe38cb6, 0xe38cb7,
+
+ /*** Four byte table, leaf: 8139dcxx - offset 0x0712d ***/
+
+ /* 30 */ 0xe38cb8, 0xe38cb9, 0xe38cba, 0xe38cbb,
+ /* 34 */ 0xe38cbc, 0xe38cbd, 0xe38cbe, 0xe38cbf,
+ /* 38 */ 0xe38d80, 0xe38d81,
+
+ /*** Four byte table, leaf: 8139ddxx - offset 0x07137 ***/
+
+ /* 30 */ 0xe38d82, 0xe38d83, 0xe38d84, 0xe38d85,
+ /* 34 */ 0xe38d86, 0xe38d87, 0xe38d88, 0xe38d89,
+ /* 38 */ 0xe38d8a, 0xe38d8b,
+
+ /*** Four byte table, leaf: 8139dexx - offset 0x07141 ***/
+
+ /* 30 */ 0xe38d8c, 0xe38d8d, 0xe38d8e, 0xe38d8f,
+ /* 34 */ 0xe38d90, 0xe38d91, 0xe38d92, 0xe38d93,
+ /* 38 */ 0xe38d94, 0xe38d95,
+
+ /*** Four byte table, leaf: 8139dfxx - offset 0x0714b ***/
+
+ /* 30 */ 0xe38d96, 0xe38d97, 0xe38d98, 0xe38d99,
+ /* 34 */ 0xe38d9a, 0xe38d9b, 0xe38d9c, 0xe38d9d,
+ /* 38 */ 0xe38d9e, 0xe38d9f,
+
+ /*** Four byte table, leaf: 8139e0xx - offset 0x07155 ***/
+
+ /* 30 */ 0xe38da0, 0xe38da1, 0xe38da2, 0xe38da3,
+ /* 34 */ 0xe38da4, 0xe38da5, 0xe38da6, 0xe38da7,
+ /* 38 */ 0xe38da8, 0xe38da9,
+
+ /*** Four byte table, leaf: 8139e1xx - offset 0x0715f ***/
+
+ /* 30 */ 0xe38daa, 0xe38dab, 0xe38dac, 0xe38dad,
+ /* 34 */ 0xe38dae, 0xe38daf, 0xe38db0, 0xe38db1,
+ /* 38 */ 0xe38db2, 0xe38db3,
+
+ /*** Four byte table, leaf: 8139e2xx - offset 0x07169 ***/
+
+ /* 30 */ 0xe38db4, 0xe38db5, 0xe38db6, 0xe38db7,
+ /* 34 */ 0xe38db8, 0xe38db9, 0xe38dba, 0xe38dbb,
+ /* 38 */ 0xe38dbc, 0xe38dbd,
+
+ /*** Four byte table, leaf: 8139e3xx - offset 0x07173 ***/
+
+ /* 30 */ 0xe38dbe, 0xe38dbf, 0xe38e80, 0xe38e81,
+ /* 34 */ 0xe38e82, 0xe38e83, 0xe38e84, 0xe38e85,
+ /* 38 */ 0xe38e86, 0xe38e87,
+
+ /*** Four byte table, leaf: 8139e4xx - offset 0x0717d ***/
+
+ /* 30 */ 0xe38e88, 0xe38e89, 0xe38e8a, 0xe38e8b,
+ /* 34 */ 0xe38e8c, 0xe38e8d, 0xe38e90, 0xe38e91,
+ /* 38 */ 0xe38e92, 0xe38e93,
+
+ /*** Four byte table, leaf: 8139e5xx - offset 0x07187 ***/
+
+ /* 30 */ 0xe38e94, 0xe38e95, 0xe38e96, 0xe38e97,
+ /* 34 */ 0xe38e98, 0xe38e99, 0xe38e9a, 0xe38e9b,
+ /* 38 */ 0xe38e9f, 0xe38ea0,
+
+ /*** Four byte table, leaf: 8139e6xx - offset 0x07191 ***/
+
+ /* 30 */ 0xe38ea2, 0xe38ea3, 0xe38ea4, 0xe38ea5,
+ /* 34 */ 0xe38ea6, 0xe38ea7, 0xe38ea8, 0xe38ea9,
+ /* 38 */ 0xe38eaa, 0xe38eab,
+
+ /*** Four byte table, leaf: 8139e7xx - offset 0x0719b ***/
+
+ /* 30 */ 0xe38eac, 0xe38ead, 0xe38eae, 0xe38eaf,
+ /* 34 */ 0xe38eb0, 0xe38eb1, 0xe38eb2, 0xe38eb3,
+ /* 38 */ 0xe38eb4, 0xe38eb5,
+
+ /*** Four byte table, leaf: 8139e8xx - offset 0x071a5 ***/
+
+ /* 30 */ 0xe38eb6, 0xe38eb7, 0xe38eb8, 0xe38eb9,
+ /* 34 */ 0xe38eba, 0xe38ebb, 0xe38ebc, 0xe38ebd,
+ /* 38 */ 0xe38ebe, 0xe38ebf,
+
+ /*** Four byte table, leaf: 8139e9xx - offset 0x071af ***/
+
+ /* 30 */ 0xe38f80, 0xe38f81, 0xe38f82, 0xe38f83,
+ /* 34 */ 0xe38f85, 0xe38f86, 0xe38f87, 0xe38f88,
+ /* 38 */ 0xe38f89, 0xe38f8a,
+
+ /*** Four byte table, leaf: 8139eaxx - offset 0x071b9 ***/
+
+ /* 30 */ 0xe38f8b, 0xe38f8c, 0xe38f8d, 0xe38f8f,
+ /* 34 */ 0xe38f90, 0xe38f93, 0xe38f94, 0xe38f96,
+ /* 38 */ 0xe38f97, 0xe38f98,
+
+ /*** Four byte table, leaf: 8139ebxx - offset 0x071c3 ***/
+
+ /* 30 */ 0xe38f99, 0xe38f9a, 0xe38f9b, 0xe38f9c,
+ /* 34 */ 0xe38f9d, 0xe38f9e, 0xe38f9f, 0xe38fa0,
+ /* 38 */ 0xe38fa1, 0xe38fa2,
+
+ /*** Four byte table, leaf: 8139ecxx - offset 0x071cd ***/
+
+ /* 30 */ 0xe38fa3, 0xe38fa4, 0xe38fa5, 0xe38fa6,
+ /* 34 */ 0xe38fa7, 0xe38fa8, 0xe38fa9, 0xe38faa,
+ /* 38 */ 0xe38fab, 0xe38fac,
+
+ /*** Four byte table, leaf: 8139edxx - offset 0x071d7 ***/
+
+ /* 30 */ 0xe38fad, 0xe38fae, 0xe38faf, 0xe38fb0,
+ /* 34 */ 0xe38fb1, 0xe38fb2, 0xe38fb3, 0xe38fb4,
+ /* 38 */ 0xe38fb5, 0xe38fb6,
+
+ /*** Four byte table, leaf: 8139eexx - offset 0x071e1 ***/
+
+ /* 30 */ 0xe38fb7, 0xe38fb8, 0xe38fb9, 0xe38fba,
+ /* 34 */ 0xe38fbb, 0xe38fbc, 0xe38fbd, 0xe38fbe,
+ /* 38 */ 0xe38fbf, 0xe39080,
+
+ /*** Four byte table, leaf: 8139efxx - offset 0x071eb ***/
+
+ /* 30 */ 0xe39081, 0xe39082, 0xe39083, 0xe39084,
+ /* 34 */ 0xe39085, 0xe39086, 0xe39087, 0xe39088,
+ /* 38 */ 0xe39089, 0xe3908a,
+
+ /*** Four byte table, leaf: 8139f0xx - offset 0x071f5 ***/
+
+ /* 30 */ 0xe3908b, 0xe3908c, 0xe3908d, 0xe3908e,
+ /* 34 */ 0xe3908f, 0xe39090, 0xe39091, 0xe39092,
+ /* 38 */ 0xe39093, 0xe39094,
+
+ /*** Four byte table, leaf: 8139f1xx - offset 0x071ff ***/
+
+ /* 30 */ 0xe39095, 0xe39096, 0xe39097, 0xe39098,
+ /* 34 */ 0xe39099, 0xe3909a, 0xe3909b, 0xe3909c,
+ /* 38 */ 0xe3909d, 0xe3909e,
+
+ /*** Four byte table, leaf: 8139f2xx - offset 0x07209 ***/
+
+ /* 30 */ 0xe3909f, 0xe390a0, 0xe390a1, 0xe390a2,
+ /* 34 */ 0xe390a3, 0xe390a4, 0xe390a5, 0xe390a6,
+ /* 38 */ 0xe390a7, 0xe390a8,
+
+ /*** Four byte table, leaf: 8139f3xx - offset 0x07213 ***/
+
+ /* 30 */ 0xe390a9, 0xe390aa, 0xe390ab, 0xe390ac,
+ /* 34 */ 0xe390ad, 0xe390ae, 0xe390af, 0xe390b0,
+ /* 38 */ 0xe390b1, 0xe390b2,
+
+ /*** Four byte table, leaf: 8139f4xx - offset 0x0721d ***/
+
+ /* 30 */ 0xe390b3, 0xe390b4, 0xe390b5, 0xe390b6,
+ /* 34 */ 0xe390b7, 0xe390b8, 0xe390b9, 0xe390ba,
+ /* 38 */ 0xe390bb, 0xe390bc,
+
+ /*** Four byte table, leaf: 8139f5xx - offset 0x07227 ***/
+
+ /* 30 */ 0xe390bd, 0xe390be, 0xe390bf, 0xe39180,
+ /* 34 */ 0xe39181, 0xe39182, 0xe39183, 0xe39184,
+ /* 38 */ 0xe39185, 0xe39186,
+
+ /*** Four byte table, leaf: 8139f6xx - offset 0x07231 ***/
+
+ /* 30 */ 0xe39188, 0xe39189, 0xe3918a, 0xe3918b,
+ /* 34 */ 0xe3918c, 0xe3918d, 0xe3918e, 0xe3918f,
+ /* 38 */ 0xe39190, 0xe39191,
+
+ /*** Four byte table, leaf: 8139f7xx - offset 0x0723b ***/
+
+ /* 30 */ 0xe39192, 0xe39193, 0xe39194, 0xe39195,
+ /* 34 */ 0xe39196, 0xe39197, 0xe39198, 0xe39199,
+ /* 38 */ 0xe3919a, 0xe3919b,
+
+ /*** Four byte table, leaf: 8139f8xx - offset 0x07245 ***/
+
+ /* 30 */ 0xe3919c, 0xe3919d, 0xe3919e, 0xe3919f,
+ /* 34 */ 0xe391a0, 0xe391a1, 0xe391a2, 0xe391a3,
+ /* 38 */ 0xe391a4, 0xe391a5,
+
+ /*** Four byte table, leaf: 8139f9xx - offset 0x0724f ***/
+
+ /* 30 */ 0xe391a6, 0xe391a7, 0xe391a8, 0xe391a9,
+ /* 34 */ 0xe391aa, 0xe391ab, 0xe391ac, 0xe391ad,
+ /* 38 */ 0xe391ae, 0xe391af,
+
+ /*** Four byte table, leaf: 8139faxx - offset 0x07259 ***/
+
+ /* 30 */ 0xe391b0, 0xe391b1, 0xe391b2, 0xe391b4,
+ /* 34 */ 0xe391b5, 0xe391b6, 0xe391b7, 0xe391b8,
+ /* 38 */ 0xe391b9, 0xe391ba,
+
+ /*** Four byte table, leaf: 8139fbxx - offset 0x07263 ***/
+
+ /* 30 */ 0xe391bb, 0xe391bc, 0xe391bd, 0xe391be,
+ /* 34 */ 0xe391bf, 0xe39280, 0xe39281, 0xe39282,
+ /* 38 */ 0xe39283, 0xe39284,
+
+ /*** Four byte table, leaf: 8139fcxx - offset 0x0726d ***/
+
+ /* 30 */ 0xe39285, 0xe39286, 0xe39287, 0xe39288,
+ /* 34 */ 0xe39289, 0xe3928a, 0xe3928b, 0xe3928c,
+ /* 38 */ 0xe3928d, 0xe3928e,
+
+ /*** Four byte table, leaf: 8139fdxx - offset 0x07277 ***/
+
+ /* 30 */ 0xe3928f, 0xe39290, 0xe39291, 0xe39292,
+ /* 34 */ 0xe39293, 0xe39294, 0xe39295, 0xe39296,
+ /* 38 */ 0xe39297, 0xe39298,
+
+ /*** Four byte table, leaf: 8139fexx - offset 0x07281 ***/
+
+ /* 30 */ 0xe39299, 0xe3929a, 0xe3929b, 0xe3929c,
+ /* 34 */ 0xe3929d, 0xe3929e, 0xe3929f, 0xe392a0,
+ /* 38 */ 0xe392a1, 0xe392a2,
+
+ /*** Four byte table, leaf: 823081xx - offset 0x0728b ***/
+
+ /* 30 */ 0xe392a3, 0xe392a4, 0xe392a5, 0xe392a6,
+ /* 34 */ 0xe392a7, 0xe392a8, 0xe392a9, 0xe392aa,
+ /* 38 */ 0xe392ab, 0xe392ac,
+
+ /*** Four byte table, leaf: 823082xx - offset 0x07295 ***/
+
+ /* 30 */ 0xe392ad, 0xe392ae, 0xe392af, 0xe392b0,
+ /* 34 */ 0xe392b1, 0xe392b2, 0xe392b3, 0xe392b4,
+ /* 38 */ 0xe392b5, 0xe392b6,
+
+ /*** Four byte table, leaf: 823083xx - offset 0x0729f ***/
+
+ /* 30 */ 0xe392b7, 0xe392b8, 0xe392b9, 0xe392ba,
+ /* 34 */ 0xe392bb, 0xe392bc, 0xe392bd, 0xe392be,
+ /* 38 */ 0xe392bf, 0xe39380,
+
+ /*** Four byte table, leaf: 823084xx - offset 0x072a9 ***/
+
+ /* 30 */ 0xe39381, 0xe39382, 0xe39383, 0xe39384,
+ /* 34 */ 0xe39385, 0xe39386, 0xe39387, 0xe39388,
+ /* 38 */ 0xe39389, 0xe3938a,
+
+ /*** Four byte table, leaf: 823085xx - offset 0x072b3 ***/
+
+ /* 30 */ 0xe3938b, 0xe3938c, 0xe3938d, 0xe3938e,
+ /* 34 */ 0xe3938f, 0xe39390, 0xe39391, 0xe39392,
+ /* 38 */ 0xe39393, 0xe39394,
+
+ /*** Four byte table, leaf: 823086xx - offset 0x072bd ***/
+
+ /* 30 */ 0xe39395, 0xe39396, 0xe39397, 0xe39398,
+ /* 34 */ 0xe39399, 0xe3939a, 0xe3939b, 0xe3939c,
+ /* 38 */ 0xe3939d, 0xe3939e,
+
+ /*** Four byte table, leaf: 823087xx - offset 0x072c7 ***/
+
+ /* 30 */ 0xe3939f, 0xe393a0, 0xe393a1, 0xe393a2,
+ /* 34 */ 0xe393a3, 0xe393a4, 0xe393a5, 0xe393a6,
+ /* 38 */ 0xe393a7, 0xe393a8,
+
+ /*** Four byte table, leaf: 823088xx - offset 0x072d1 ***/
+
+ /* 30 */ 0xe393a9, 0xe393aa, 0xe393ab, 0xe393ac,
+ /* 34 */ 0xe393ad, 0xe393ae, 0xe393af, 0xe393b0,
+ /* 38 */ 0xe393b1, 0xe393b2,
+
+ /*** Four byte table, leaf: 823089xx - offset 0x072db ***/
+
+ /* 30 */ 0xe393b3, 0xe393b4, 0xe393b5, 0xe393b6,
+ /* 34 */ 0xe393b7, 0xe393b8, 0xe393b9, 0xe393ba,
+ /* 38 */ 0xe393bb, 0xe393bc,
+
+ /*** Four byte table, leaf: 82308axx - offset 0x072e5 ***/
+
+ /* 30 */ 0xe393bd, 0xe393be, 0xe393bf, 0xe39480,
+ /* 34 */ 0xe39481, 0xe39482, 0xe39483, 0xe39484,
+ /* 38 */ 0xe39485, 0xe39486,
+
+ /*** Four byte table, leaf: 82308bxx - offset 0x072ef ***/
+
+ /* 30 */ 0xe39487, 0xe39488, 0xe39489, 0xe3948a,
+ /* 34 */ 0xe3948b, 0xe3948c, 0xe3948d, 0xe3948e,
+ /* 38 */ 0xe3948f, 0xe39490,
+
+ /*** Four byte table, leaf: 82308cxx - offset 0x072f9 ***/
+
+ /* 30 */ 0xe39491, 0xe39492, 0xe39493, 0xe39494,
+ /* 34 */ 0xe39495, 0xe39496, 0xe39497, 0xe39498,
+ /* 38 */ 0xe39499, 0xe3949a,
+
+ /*** Four byte table, leaf: 82308dxx - offset 0x07303 ***/
+
+ /* 30 */ 0xe3949b, 0xe3949c, 0xe3949d, 0xe3949e,
+ /* 34 */ 0xe3949f, 0xe394a0, 0xe394a1, 0xe394a2,
+ /* 38 */ 0xe394a3, 0xe394a4,
+
+ /*** Four byte table, leaf: 82308exx - offset 0x0730d ***/
+
+ /* 30 */ 0xe394a5, 0xe394a6, 0xe394a7, 0xe394a8,
+ /* 34 */ 0xe394a9, 0xe394aa, 0xe394ab, 0xe394ac,
+ /* 38 */ 0xe394ad, 0xe394ae,
+
+ /*** Four byte table, leaf: 82308fxx - offset 0x07317 ***/
+
+ /* 30 */ 0xe394af, 0xe394b0, 0xe394b1, 0xe394b2,
+ /* 34 */ 0xe394b3, 0xe394b4, 0xe394b5, 0xe394b6,
+ /* 38 */ 0xe394b7, 0xe394b8,
+
+ /*** Four byte table, leaf: 823090xx - offset 0x07321 ***/
+
+ /* 30 */ 0xe394b9, 0xe394ba, 0xe394bb, 0xe394bc,
+ /* 34 */ 0xe394bd, 0xe394be, 0xe394bf, 0xe39580,
+ /* 38 */ 0xe39581, 0xe39582,
+
+ /*** Four byte table, leaf: 823091xx - offset 0x0732b ***/
+
+ /* 30 */ 0xe39583, 0xe39584, 0xe39585, 0xe39586,
+ /* 34 */ 0xe39587, 0xe39588, 0xe39589, 0xe3958a,
+ /* 38 */ 0xe3958b, 0xe3958c,
+
+ /*** Four byte table, leaf: 823092xx - offset 0x07335 ***/
+
+ /* 30 */ 0xe3958d, 0xe3958e, 0xe3958f, 0xe39590,
+ /* 34 */ 0xe39591, 0xe39592, 0xe39593, 0xe39594,
+ /* 38 */ 0xe39595, 0xe39596,
+
+ /*** Four byte table, leaf: 823093xx - offset 0x0733f ***/
+
+ /* 30 */ 0xe39597, 0xe39598, 0xe39599, 0xe3959a,
+ /* 34 */ 0xe3959b, 0xe3959c, 0xe3959d, 0xe3959e,
+ /* 38 */ 0xe3959f, 0xe395a0,
+
+ /*** Four byte table, leaf: 823094xx - offset 0x07349 ***/
+
+ /* 30 */ 0xe395a1, 0xe395a2, 0xe395a3, 0xe395a4,
+ /* 34 */ 0xe395a5, 0xe395a6, 0xe395a7, 0xe395a8,
+ /* 38 */ 0xe395a9, 0xe395aa,
+
+ /*** Four byte table, leaf: 823095xx - offset 0x07353 ***/
+
+ /* 30 */ 0xe395ab, 0xe395ac, 0xe395ad, 0xe395ae,
+ /* 34 */ 0xe395af, 0xe395b0, 0xe395b1, 0xe395b2,
+ /* 38 */ 0xe395b3, 0xe395b4,
+
+ /*** Four byte table, leaf: 823096xx - offset 0x0735d ***/
+
+ /* 30 */ 0xe395b5, 0xe395b6, 0xe395b7, 0xe395b8,
+ /* 34 */ 0xe395b9, 0xe395ba, 0xe395bb, 0xe395bc,
+ /* 38 */ 0xe395bd, 0xe395be,
+
+ /*** Four byte table, leaf: 823097xx - offset 0x07367 ***/
+
+ /* 30 */ 0xe395bf, 0xe39680, 0xe39681, 0xe39682,
+ /* 34 */ 0xe39683, 0xe39684, 0xe39685, 0xe39686,
+ /* 38 */ 0xe39687, 0xe39688,
+
+ /*** Four byte table, leaf: 823098xx - offset 0x07371 ***/
+
+ /* 30 */ 0xe39689, 0xe3968a, 0xe3968b, 0xe3968c,
+ /* 34 */ 0xe3968d, 0xe3968e, 0xe3968f, 0xe39690,
+ /* 38 */ 0xe39691, 0xe39692,
+
+ /*** Four byte table, leaf: 823099xx - offset 0x0737b ***/
+
+ /* 30 */ 0xe39693, 0xe39694, 0xe39695, 0xe39696,
+ /* 34 */ 0xe39697, 0xe39698, 0xe39699, 0xe3969a,
+ /* 38 */ 0xe3969b, 0xe3969c,
+
+ /*** Four byte table, leaf: 82309axx - offset 0x07385 ***/
+
+ /* 30 */ 0xe3969d, 0xe3969f, 0xe396a0, 0xe396a1,
+ /* 34 */ 0xe396a2, 0xe396a3, 0xe396a4, 0xe396a5,
+ /* 38 */ 0xe396a6, 0xe396a7,
+
+ /*** Four byte table, leaf: 82309bxx - offset 0x0738f ***/
+
+ /* 30 */ 0xe396a8, 0xe396a9, 0xe396aa, 0xe396ab,
+ /* 34 */ 0xe396ac, 0xe396ad, 0xe396ae, 0xe396af,
+ /* 38 */ 0xe396b0, 0xe396b1,
+
+ /*** Four byte table, leaf: 82309cxx - offset 0x07399 ***/
+
+ /* 30 */ 0xe396b2, 0xe396b3, 0xe396b4, 0xe396b5,
+ /* 34 */ 0xe396b6, 0xe396b7, 0xe396b8, 0xe396b9,
+ /* 38 */ 0xe396ba, 0xe396bb,
+
+ /*** Four byte table, leaf: 82309dxx - offset 0x073a3 ***/
+
+ /* 30 */ 0xe396bc, 0xe396bd, 0xe396be, 0xe396bf,
+ /* 34 */ 0xe39780, 0xe39781, 0xe39782, 0xe39783,
+ /* 38 */ 0xe39784, 0xe39785,
+
+ /*** Four byte table, leaf: 82309exx - offset 0x073ad ***/
+
+ /* 30 */ 0xe39786, 0xe39787, 0xe39788, 0xe39789,
+ /* 34 */ 0xe3978a, 0xe3978b, 0xe3978c, 0xe3978d,
+ /* 38 */ 0xe3978e, 0xe3978f,
+
+ /*** Four byte table, leaf: 82309fxx - offset 0x073b7 ***/
+
+ /* 30 */ 0xe39790, 0xe39791, 0xe39792, 0xe39793,
+ /* 34 */ 0xe39794, 0xe39795, 0xe39796, 0xe39797,
+ /* 38 */ 0xe39798, 0xe39799,
+
+ /*** Four byte table, leaf: 8230a0xx - offset 0x073c1 ***/
+
+ /* 30 */ 0xe3979a, 0xe3979b, 0xe3979c, 0xe3979d,
+ /* 34 */ 0xe3979e, 0xe3979f, 0xe397a0, 0xe397a1,
+ /* 38 */ 0xe397a2, 0xe397a3,
+
+ /*** Four byte table, leaf: 8230a1xx - offset 0x073cb ***/
+
+ /* 30 */ 0xe397a4, 0xe397a5, 0xe397a6, 0xe397a7,
+ /* 34 */ 0xe397a8, 0xe397a9, 0xe397aa, 0xe397ab,
+ /* 38 */ 0xe397ac, 0xe397ad,
+
+ /*** Four byte table, leaf: 8230a2xx - offset 0x073d5 ***/
+
+ /* 30 */ 0xe397ae, 0xe397af, 0xe397b0, 0xe397b1,
+ /* 34 */ 0xe397b2, 0xe397b3, 0xe397b4, 0xe397b5,
+ /* 38 */ 0xe397b6, 0xe397b7,
+
+ /*** Four byte table, leaf: 8230a3xx - offset 0x073df ***/
+
+ /* 30 */ 0xe397b8, 0xe397b9, 0xe397ba, 0xe397bb,
+ /* 34 */ 0xe397bc, 0xe397bd, 0xe397be, 0xe397bf,
+ /* 38 */ 0xe39880, 0xe39881,
+
+ /*** Four byte table, leaf: 8230a4xx - offset 0x073e9 ***/
+
+ /* 30 */ 0xe39882, 0xe39883, 0xe39884, 0xe39885,
+ /* 34 */ 0xe39886, 0xe39887, 0xe39888, 0xe39889,
+ /* 38 */ 0xe3988a, 0xe3988b,
+
+ /*** Four byte table, leaf: 8230a5xx - offset 0x073f3 ***/
+
+ /* 30 */ 0xe3988c, 0xe3988d, 0xe3988f, 0xe39890,
+ /* 34 */ 0xe39891, 0xe39892, 0xe39893, 0xe39894,
+ /* 38 */ 0xe39895, 0xe39896,
+
+ /*** Four byte table, leaf: 8230a6xx - offset 0x073fd ***/
+
+ /* 30 */ 0xe39897, 0xe39898, 0xe39899,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8230f2xx - offset 0x07400 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0xe3a499, 0xe3a49a,
+
+ /*** Four byte table, leaf: 8230f3xx - offset 0x0740a ***/
+
+ /* 30 */ 0xe3a49b, 0xe3a49c, 0xe3a49d, 0xe3a49e,
+ /* 34 */ 0xe3a49f, 0xe3a4a0, 0xe3a4a1, 0xe3a4a2,
+ /* 38 */ 0xe3a4a3, 0xe3a4a4,
+
+ /*** Four byte table, leaf: 8230f4xx - offset 0x07414 ***/
+
+ /* 30 */ 0xe3a4a5, 0xe3a4a6, 0xe3a4a7, 0xe3a4a8,
+ /* 34 */ 0xe3a4a9, 0xe3a4aa, 0xe3a4ab, 0xe3a4ac,
+ /* 38 */ 0xe3a4ad, 0xe3a4ae,
+
+ /*** Four byte table, leaf: 8230f5xx - offset 0x0741e ***/
+
+ /* 30 */ 0xe3a4af, 0xe3a4b0, 0xe3a4b1, 0xe3a4b2,
+ /* 34 */ 0xe3a4b3, 0xe3a4b4, 0xe3a4b5, 0xe3a4b6,
+ /* 38 */ 0xe3a4b7, 0xe3a4b8,
+
+ /*** Four byte table, leaf: 8230f6xx - offset 0x07428 ***/
+
+ /* 30 */ 0xe3a4b9, 0xe3a4ba, 0xe3a4bb, 0xe3a4bc,
+ /* 34 */ 0xe3a4bd, 0xe3a4be, 0xe3a4bf, 0xe3a580,
+ /* 38 */ 0xe3a581, 0xe3a582,
+
+ /*** Four byte table, leaf: 8230f7xx - offset 0x07432 ***/
+
+ /* 30 */ 0xe3a583, 0xe3a584, 0xe3a585, 0xe3a586,
+ /* 34 */ 0xe3a587, 0xe3a588, 0xe3a589, 0xe3a58a,
+ /* 38 */ 0xe3a58b, 0xe3a58c,
+
+ /*** Four byte table, leaf: 8230f8xx - offset 0x0743c ***/
+
+ /* 30 */ 0xe3a58d, 0xe3a58e, 0xe3a58f, 0xe3a590,
+ /* 34 */ 0xe3a591, 0xe3a592, 0xe3a593, 0xe3a594,
+ /* 38 */ 0xe3a595, 0xe3a596,
+
+ /*** Four byte table, leaf: 8230f9xx - offset 0x07446 ***/
+
+ /* 30 */ 0xe3a597, 0xe3a598, 0xe3a599, 0xe3a59a,
+ /* 34 */ 0xe3a59b, 0xe3a59c, 0xe3a59d, 0xe3a59e,
+ /* 38 */ 0xe3a59f, 0xe3a5a0,
+
+ /*** Four byte table, leaf: 8230faxx - offset 0x07450 ***/
+
+ /* 30 */ 0xe3a5a1, 0xe3a5a2, 0xe3a5a3, 0xe3a5a4,
+ /* 34 */ 0xe3a5a5, 0xe3a5a6, 0xe3a5a7, 0xe3a5a8,
+ /* 38 */ 0xe3a5a9, 0xe3a5aa,
+
+ /*** Four byte table, leaf: 8230fbxx - offset 0x0745a ***/
+
+ /* 30 */ 0xe3a5ab, 0xe3a5ac, 0xe3a5ad, 0xe3a5af,
+ /* 34 */ 0xe3a5b0, 0xe3a5b1, 0xe3a5b2, 0xe3a5b3,
+ /* 38 */ 0xe3a5b4, 0xe3a5b5,
+
+ /*** Four byte table, leaf: 8230fcxx - offset 0x07464 ***/
+
+ /* 30 */ 0xe3a5b6, 0xe3a5b7, 0xe3a5b8, 0xe3a5b9,
+ /* 34 */ 0xe3a5ba, 0xe3a5bb, 0xe3a5bc, 0xe3a5bd,
+ /* 38 */ 0xe3a5be, 0xe3a5bf,
+
+ /*** Four byte table, leaf: 8230fdxx - offset 0x0746e ***/
+
+ /* 30 */ 0xe3a680, 0xe3a681, 0xe3a682, 0xe3a683,
+ /* 34 */ 0xe3a684, 0xe3a685, 0xe3a686, 0xe3a687,
+ /* 38 */ 0xe3a688, 0xe3a689,
+
+ /*** Four byte table, leaf: 8230fexx - offset 0x07478 ***/
+
+ /* 30 */ 0xe3a68a, 0xe3a68b, 0xe3a68c, 0xe3a68d,
+ /* 34 */ 0xe3a68e, 0xe3a68f, 0xe3a690, 0xe3a691,
+ /* 38 */ 0xe3a692, 0xe3a693,
+
+ /*** Four byte table, leaf: 823181xx - offset 0x07482 ***/
+
+ /* 30 */ 0xe3a694, 0xe3a695, 0xe3a696, 0xe3a697,
+ /* 34 */ 0xe3a698, 0xe3a699, 0xe3a69a, 0xe3a69b,
+ /* 38 */ 0xe3a69c, 0xe3a69d,
+
+ /*** Four byte table, leaf: 823182xx - offset 0x0748c ***/
+
+ /* 30 */ 0xe3a69e, 0xe3a69f, 0xe3a6a0, 0xe3a6a1,
+ /* 34 */ 0xe3a6a2, 0xe3a6a3, 0xe3a6a4, 0xe3a6a5,
+ /* 38 */ 0xe3a6a6, 0xe3a6a7,
+
+ /*** Four byte table, leaf: 823183xx - offset 0x07496 ***/
+
+ /* 30 */ 0xe3a6a8, 0xe3a6a9, 0xe3a6aa, 0xe3a6ab,
+ /* 34 */ 0xe3a6ac, 0xe3a6ad, 0xe3a6ae, 0xe3a6af,
+ /* 38 */ 0xe3a6b0, 0xe3a6b1,
+
+ /*** Four byte table, leaf: 823184xx - offset 0x074a0 ***/
+
+ /* 30 */ 0xe3a6b2, 0xe3a6b3, 0xe3a6b4, 0xe3a6b5,
+ /* 34 */ 0xe3a6b6, 0xe3a6b7, 0xe3a6b8, 0xe3a6b9,
+ /* 38 */ 0xe3a6ba, 0xe3a6bb,
+
+ /*** Four byte table, leaf: 823185xx - offset 0x074aa ***/
+
+ /* 30 */ 0xe3a6bc, 0xe3a6bd, 0xe3a6be, 0xe3a6bf,
+ /* 34 */ 0xe3a780, 0xe3a781, 0xe3a782, 0xe3a783,
+ /* 38 */ 0xe3a784, 0xe3a785,
+
+ /*** Four byte table, leaf: 823186xx - offset 0x074b4 ***/
+
+ /* 30 */ 0xe3a786, 0xe3a787, 0xe3a788, 0xe3a789,
+ /* 34 */ 0xe3a78a, 0xe3a78b, 0xe3a78c, 0xe3a78d,
+ /* 38 */ 0xe3a78e, 0xe3a791,
+
+ /*** Four byte table, leaf: 823187xx - offset 0x074be ***/
+
+ /* 30 */ 0xe3a792, 0xe3a793, 0xe3a794, 0xe3a795,
+ /* 34 */ 0xe3a796, 0xe3a797, 0xe3a798, 0xe3a799,
+ /* 38 */ 0xe3a79a, 0xe3a79b,
+
+ /*** Four byte table, leaf: 823188xx - offset 0x074c8 ***/
+
+ /* 30 */ 0xe3a79c, 0xe3a79d, 0xe3a79e, 0xe3a7a0,
+ /* 34 */ 0xe3a7a1, 0xe3a7a2, 0xe3a7a3, 0xe3a7a4,
+ /* 38 */ 0xe3a7a5, 0xe3a7a6,
+
+ /*** Four byte table, leaf: 823189xx - offset 0x074d2 ***/
+
+ /* 30 */ 0xe3a7a7, 0xe3a7a8, 0xe3a7a9, 0xe3a7aa,
+ /* 34 */ 0xe3a7ab, 0xe3a7ac, 0xe3a7ad, 0xe3a7ae,
+ /* 38 */ 0xe3a7af, 0xe3a7b0,
+
+ /*** Four byte table, leaf: 82318axx - offset 0x074dc ***/
+
+ /* 30 */ 0xe3a7b1, 0xe3a7b2, 0xe3a7b3, 0xe3a7b4,
+ /* 34 */ 0xe3a7b5, 0xe3a7b6, 0xe3a7b7, 0xe3a7b8,
+ /* 38 */ 0xe3a7b9, 0xe3a7ba,
+
+ /*** Four byte table, leaf: 82318bxx - offset 0x074e6 ***/
+
+ /* 30 */ 0xe3a7bb, 0xe3a7bc, 0xe3a7bd, 0xe3a7be,
+ /* 34 */ 0xe3a7bf, 0xe3a880, 0xe3a881, 0xe3a882,
+ /* 38 */ 0xe3a883, 0xe3a884,
+
+ /*** Four byte table, leaf: 82318cxx - offset 0x074f0 ***/
+
+ /* 30 */ 0xe3a885, 0xe3a886, 0xe3a887, 0xe3a888,
+ /* 34 */ 0xe3a889, 0xe3a88a, 0xe3a88b, 0xe3a88c,
+ /* 38 */ 0xe3a88d, 0xe3a88e,
+
+ /*** Four byte table, leaf: 82318dxx - offset 0x074fa ***/
+
+ /* 30 */ 0xe3a88f, 0xe3a890, 0xe3a891, 0xe3a892,
+ /* 34 */ 0xe3a893, 0xe3a894, 0xe3a895, 0xe3a896,
+ /* 38 */ 0xe3a897, 0xe3a898,
+
+ /*** Four byte table, leaf: 82318exx - offset 0x07504 ***/
+
+ /* 30 */ 0xe3a899, 0xe3a89a, 0xe3a89b, 0xe3a89c,
+ /* 34 */ 0xe3a89d, 0xe3a89e, 0xe3a89f, 0xe3a8a0,
+ /* 38 */ 0xe3a8a1, 0xe3a8a2,
+
+ /*** Four byte table, leaf: 82318fxx - offset 0x0750e ***/
+
+ /* 30 */ 0xe3a8a3, 0xe3a8a4, 0xe3a8a5, 0xe3a8a6,
+ /* 34 */ 0xe3a8a7, 0xe3a8a8, 0xe3a8a9, 0xe3a8aa,
+ /* 38 */ 0xe3a8ab, 0xe3a8ac,
+
+ /*** Four byte table, leaf: 823190xx - offset 0x07518 ***/
+
+ /* 30 */ 0xe3a8ad, 0xe3a8ae, 0xe3a8af, 0xe3a8b0,
+ /* 34 */ 0xe3a8b1, 0xe3a8b2, 0xe3a8b3, 0xe3a8b4,
+ /* 38 */ 0xe3a8b5, 0xe3a8b6,
+
+ /*** Four byte table, leaf: 823191xx - offset 0x07522 ***/
+
+ /* 30 */ 0xe3a8b7, 0xe3a8b8, 0xe3a8b9, 0xe3a8ba,
+ /* 34 */ 0xe3a8bb, 0xe3a8bc, 0xe3a8bd, 0xe3a8be,
+ /* 38 */ 0xe3a8bf, 0xe3a980,
+
+ /*** Four byte table, leaf: 823192xx - offset 0x0752c ***/
+
+ /* 30 */ 0xe3a981, 0xe3a982, 0xe3a983, 0xe3a984,
+ /* 34 */ 0xe3a985, 0xe3a986, 0xe3a987, 0xe3a988,
+ /* 38 */ 0xe3a989, 0xe3a98a,
+
+ /*** Four byte table, leaf: 823193xx - offset 0x07536 ***/
+
+ /* 30 */ 0xe3a98b, 0xe3a98c, 0xe3a98d, 0xe3a98e,
+ /* 34 */ 0xe3a98f, 0xe3a990, 0xe3a991, 0xe3a992,
+ /* 38 */ 0xe3a993, 0xe3a994,
+
+ /*** Four byte table, leaf: 823194xx - offset 0x07540 ***/
+
+ /* 30 */ 0xe3a995, 0xe3a996, 0xe3a997, 0xe3a998,
+ /* 34 */ 0xe3a999, 0xe3a99a, 0xe3a99b, 0xe3a99c,
+ /* 38 */ 0xe3a99d, 0xe3a99e,
+
+ /*** Four byte table, leaf: 823195xx - offset 0x0754a ***/
+
+ /* 30 */ 0xe3a99f, 0xe3a9a0, 0xe3a9a1, 0xe3a9a2,
+ /* 34 */ 0xe3a9a3, 0xe3a9a4, 0xe3a9a5, 0xe3a9a6,
+ /* 38 */ 0xe3a9a7, 0xe3a9a8,
+
+ /*** Four byte table, leaf: 823196xx - offset 0x07554 ***/
+
+ /* 30 */ 0xe3a9a9, 0xe3a9aa, 0xe3a9ab, 0xe3a9ac,
+ /* 34 */ 0xe3a9ad, 0xe3a9ae, 0xe3a9af, 0xe3a9b0,
+ /* 38 */ 0xe3a9b1, 0xe3a9b2,
+
+ /*** Four byte table, leaf: 823197xx - offset 0x0755e ***/
+
+ /* 30 */ 0xe3a9b4, 0xe3a9b5, 0xe3a9b6, 0xe3a9b7,
+ /* 34 */ 0xe3a9b8, 0xe3a9b9, 0xe3a9ba, 0xe3a9bb,
+ /* 38 */ 0xe3a9bc, 0xe3a9bd,
+
+ /*** Four byte table, leaf: 823198xx - offset 0x07568 ***/
+
+ /* 30 */ 0xe3a9be, 0xe3a9bf, 0xe3aa80, 0xe3aa81,
+ /* 34 */ 0xe3aa82, 0xe3aa83, 0xe3aa84, 0xe3aa85,
+ /* 38 */ 0xe3aa86, 0xe3aa87,
+
+ /*** Four byte table, leaf: 823199xx - offset 0x07572 ***/
+
+ /* 30 */ 0xe3aa88, 0xe3aa89, 0xe3aa8a, 0xe3aa8b,
+ /* 34 */ 0xe3aa8c, 0xe3aa8d, 0xe3aa8e, 0xe3aa8f,
+ /* 38 */ 0xe3aa90, 0xe3aa91,
+
+ /*** Four byte table, leaf: 82319axx - offset 0x0757c ***/
+
+ /* 30 */ 0xe3aa92, 0xe3aa93, 0xe3aa94, 0xe3aa95,
+ /* 34 */ 0xe3aa96, 0xe3aa97, 0xe3aa98, 0xe3aa99,
+ /* 38 */ 0xe3aa9a, 0xe3aa9b,
+
+ /*** Four byte table, leaf: 82319bxx - offset 0x07586 ***/
+
+ /* 30 */ 0xe3aa9c, 0xe3aa9d, 0xe3aa9e, 0xe3aa9f,
+ /* 34 */ 0xe3aaa0, 0xe3aaa1, 0xe3aaa2, 0xe3aaa3,
+ /* 38 */ 0xe3aaa4, 0xe3aaa5,
+
+ /*** Four byte table, leaf: 82319cxx - offset 0x07590 ***/
+
+ /* 30 */ 0xe3aaa6, 0xe3aaa7, 0xe3aaa8, 0xe3aaa9,
+ /* 34 */ 0xe3aaaa, 0xe3aaab, 0xe3aaac, 0xe3aaad,
+ /* 38 */ 0xe3aaae, 0xe3aaaf,
+
+ /*** Four byte table, leaf: 82319dxx - offset 0x0759a ***/
+
+ /* 30 */ 0xe3aab0, 0xe3aab1, 0xe3aab2, 0xe3aab3,
+ /* 34 */ 0xe3aab4, 0xe3aab5, 0xe3aab6, 0xe3aab7,
+ /* 38 */ 0xe3aab8, 0xe3aab9,
+
+ /*** Four byte table, leaf: 82319exx - offset 0x075a4 ***/
+
+ /* 30 */ 0xe3aaba, 0xe3aabb, 0xe3aabc, 0xe3aabd,
+ /* 34 */ 0xe3aabe, 0xe3aabf, 0xe3ab80, 0xe3ab81,
+ /* 38 */ 0xe3ab82, 0xe3ab83,
+
+ /*** Four byte table, leaf: 82319fxx - offset 0x075ae ***/
+
+ /* 30 */ 0xe3ab84, 0xe3ab85, 0xe3ab86, 0xe3ab87,
+ /* 34 */ 0xe3ab88, 0xe3ab89, 0xe3ab8a, 0xe3ab8b,
+ /* 38 */ 0xe3ab8c, 0xe3ab8d,
+
+ /*** Four byte table, leaf: 8231a0xx - offset 0x075b8 ***/
+
+ /* 30 */ 0xe3ab8e, 0xe3ab8f, 0xe3ab90, 0xe3ab91,
+ /* 34 */ 0xe3ab92, 0xe3ab93, 0xe3ab94, 0xe3ab95,
+ /* 38 */ 0xe3ab96, 0xe3ab97,
+
+ /*** Four byte table, leaf: 8231a1xx - offset 0x075c2 ***/
+
+ /* 30 */ 0xe3ab98, 0xe3ab99, 0xe3ab9a, 0xe3ab9b,
+ /* 34 */ 0xe3ab9c, 0xe3ab9d, 0xe3ab9e, 0xe3ab9f,
+ /* 38 */ 0xe3aba0, 0xe3aba1,
+
+ /*** Four byte table, leaf: 8231a2xx - offset 0x075cc ***/
+
+ /* 30 */ 0xe3aba2, 0xe3aba3, 0xe3aba4, 0xe3aba5,
+ /* 34 */ 0xe3aba6, 0xe3aba7, 0xe3aba8, 0xe3aba9,
+ /* 38 */ 0xe3abaa, 0xe3abab,
+
+ /*** Four byte table, leaf: 8231a3xx - offset 0x075d6 ***/
+
+ /* 30 */ 0xe3abac, 0xe3abad, 0xe3abae, 0xe3abaf,
+ /* 34 */ 0xe3abb0, 0xe3abb1, 0xe3abb2, 0xe3abb3,
+ /* 38 */ 0xe3abb4, 0xe3abb5,
+
+ /*** Four byte table, leaf: 8231a4xx - offset 0x075e0 ***/
+
+ /* 30 */ 0xe3abb6, 0xe3abb7, 0xe3abb8, 0xe3abb9,
+ /* 34 */ 0xe3abba, 0xe3abbb, 0xe3abbc, 0xe3abbd,
+ /* 38 */ 0xe3abbe, 0xe3abbf,
+
+ /*** Four byte table, leaf: 8231a5xx - offset 0x075ea ***/
+
+ /* 30 */ 0xe3ac80, 0xe3ac81, 0xe3ac82, 0xe3ac83,
+ /* 34 */ 0xe3ac84, 0xe3ac85, 0xe3ac86, 0xe3ac87,
+ /* 38 */ 0xe3ac88, 0xe3ac89,
+
+ /*** Four byte table, leaf: 8231a6xx - offset 0x075f4 ***/
+
+ /* 30 */ 0xe3ac8a, 0xe3ac8b, 0xe3ac8c, 0xe3ac8d,
+ /* 34 */ 0xe3ac8e, 0xe3ac8f, 0xe3ac90, 0xe3ac91,
+ /* 38 */ 0xe3ac92, 0xe3ac93,
+
+ /*** Four byte table, leaf: 8231a7xx - offset 0x075fe ***/
+
+ /* 30 */ 0xe3ac94, 0xe3ac95, 0xe3ac96, 0xe3ac97,
+ /* 34 */ 0xe3ac98, 0xe3ac99, 0xe3ac9a, 0xe3ac9b,
+ /* 38 */ 0xe3ac9c, 0xe3ac9d,
+
+ /*** Four byte table, leaf: 8231a8xx - offset 0x07608 ***/
+
+ /* 30 */ 0xe3ac9e, 0xe3ac9f, 0xe3aca0, 0xe3aca1,
+ /* 34 */ 0xe3aca2, 0xe3aca3, 0xe3aca4, 0xe3aca5,
+ /* 38 */ 0xe3aca6, 0xe3aca7,
+
+ /*** Four byte table, leaf: 8231a9xx - offset 0x07612 ***/
+
+ /* 30 */ 0xe3aca8, 0xe3aca9, 0xe3acaa, 0xe3acab,
+ /* 34 */ 0xe3acac, 0xe3acad, 0xe3acae, 0xe3acaf,
+ /* 38 */ 0xe3acb0, 0xe3acb1,
+
+ /*** Four byte table, leaf: 8231aaxx - offset 0x0761c ***/
+
+ /* 30 */ 0xe3acb2, 0xe3acb3, 0xe3acb4, 0xe3acb5,
+ /* 34 */ 0xe3acb6, 0xe3acb7, 0xe3acb8, 0xe3acb9,
+ /* 38 */ 0xe3acba, 0xe3acbb,
+
+ /*** Four byte table, leaf: 8231abxx - offset 0x07626 ***/
+
+ /* 30 */ 0xe3acbc, 0xe3acbd, 0xe3acbe, 0xe3acbf,
+ /* 34 */ 0xe3ad80, 0xe3ad81, 0xe3ad82, 0xe3ad83,
+ /* 38 */ 0xe3ad84, 0xe3ad85,
+
+ /*** Four byte table, leaf: 8231acxx - offset 0x07630 ***/
+
+ /* 30 */ 0xe3ad86, 0xe3ad87, 0xe3ad88, 0xe3ad89,
+ /* 34 */ 0xe3ad8a, 0xe3ad8b, 0xe3ad8c, 0xe3ad8d,
+ /* 38 */ 0xe3ad8f, 0xe3ad90,
+
+ /*** Four byte table, leaf: 8231adxx - offset 0x0763a ***/
+
+ /* 30 */ 0xe3ad91, 0xe3ad92, 0xe3ad93, 0xe3ad94,
+ /* 34 */ 0xe3ad95, 0xe3ad96, 0xe3ad97, 0xe3ad98,
+ /* 38 */ 0xe3ad99, 0xe3ad9a,
+
+ /*** Four byte table, leaf: 8231aexx - offset 0x07644 ***/
+
+ /* 30 */ 0xe3ad9b, 0xe3ad9c, 0xe3ad9d, 0xe3ad9e,
+ /* 34 */ 0xe3ad9f, 0xe3ada0, 0xe3ada1, 0xe3ada2,
+ /* 38 */ 0xe3ada3, 0xe3ada4,
+
+ /*** Four byte table, leaf: 8231afxx - offset 0x0764e ***/
+
+ /* 30 */ 0xe3ada5, 0xe3ada6, 0xe3ada7, 0xe3ada8,
+ /* 34 */ 0xe3ada9, 0xe3adaa, 0xe3adab, 0xe3adac,
+ /* 38 */ 0xe3adad, 0xe3adae,
+
+ /*** Four byte table, leaf: 8231b0xx - offset 0x07658 ***/
+
+ /* 30 */ 0xe3adaf, 0xe3adb0, 0xe3adb1, 0xe3adb2,
+ /* 34 */ 0xe3adb3, 0xe3adb4, 0xe3adb5, 0xe3adb6,
+ /* 38 */ 0xe3adb7, 0xe3adb8,
+
+ /*** Four byte table, leaf: 8231b1xx - offset 0x07662 ***/
+
+ /* 30 */ 0xe3adb9, 0xe3adba, 0xe3adbb, 0xe3adbc,
+ /* 34 */ 0xe3adbd, 0xe3adbe, 0xe3adbf, 0xe3ae80,
+ /* 38 */ 0xe3ae81, 0xe3ae82,
+
+ /*** Four byte table, leaf: 8231b2xx - offset 0x0766c ***/
+
+ /* 30 */ 0xe3ae83, 0xe3ae84, 0xe3ae85, 0xe3ae86,
+ /* 34 */ 0xe3ae87, 0xe3ae88, 0xe3ae89, 0xe3ae8a,
+ /* 38 */ 0xe3ae8b, 0xe3ae8c,
+
+ /*** Four byte table, leaf: 8231b3xx - offset 0x07676 ***/
+
+ /* 30 */ 0xe3ae8d, 0xe3ae8e, 0xe3ae8f, 0xe3ae90,
+ /* 34 */ 0xe3ae91, 0xe3ae92, 0xe3ae93, 0xe3ae94,
+ /* 38 */ 0xe3ae95, 0xe3ae96,
+
+ /*** Four byte table, leaf: 8231b4xx - offset 0x07680 ***/
+
+ /* 30 */ 0xe3ae97, 0xe3ae98, 0xe3ae99, 0xe3ae9a,
+ /* 34 */ 0xe3ae9b, 0xe3ae9c, 0xe3ae9d, 0xe3ae9e,
+ /* 38 */ 0xe3ae9f, 0xe3aea0,
+
+ /*** Four byte table, leaf: 8231b5xx - offset 0x0768a ***/
+
+ /* 30 */ 0xe3aea1, 0xe3aea2, 0xe3aea3, 0xe3aea4,
+ /* 34 */ 0xe3aea5, 0xe3aea6, 0xe3aea7, 0xe3aea8,
+ /* 38 */ 0xe3aea9, 0xe3aeaa,
+
+ /*** Four byte table, leaf: 8231b6xx - offset 0x07694 ***/
+
+ /* 30 */ 0xe3aeab, 0xe3aeac, 0xe3aead, 0xe3aeae,
+ /* 34 */ 0xe3aeaf, 0xe3aeb0, 0xe3aeb1, 0xe3aeb2,
+ /* 38 */ 0xe3aeb3, 0xe3aeb4,
+
+ /*** Four byte table, leaf: 8231b7xx - offset 0x0769e ***/
+
+ /* 30 */ 0xe3aeb5, 0xe3aeb6, 0xe3aeb7, 0xe3aeb8,
+ /* 34 */ 0xe3aeb9, 0xe3aeba, 0xe3aebb, 0xe3aebc,
+ /* 38 */ 0xe3aebd, 0xe3aebe,
+
+ /*** Four byte table, leaf: 8231b8xx - offset 0x076a8 ***/
+
+ /* 30 */ 0xe3aebf, 0xe3af80, 0xe3af81, 0xe3af82,
+ /* 34 */ 0xe3af83, 0xe3af84, 0xe3af85, 0xe3af86,
+ /* 38 */ 0xe3af87, 0xe3af88,
+
+ /*** Four byte table, leaf: 8231b9xx - offset 0x076b2 ***/
+
+ /* 30 */ 0xe3af89, 0xe3af8a, 0xe3af8b, 0xe3af8c,
+ /* 34 */ 0xe3af8d, 0xe3af8e, 0xe3af8f, 0xe3af90,
+ /* 38 */ 0xe3af91, 0xe3af92,
+
+ /*** Four byte table, leaf: 8231baxx - offset 0x076bc ***/
+
+ /* 30 */ 0xe3af93, 0xe3af94, 0xe3af95, 0xe3af96,
+ /* 34 */ 0xe3af97, 0xe3af98, 0xe3af99, 0xe3af9a,
+ /* 38 */ 0xe3af9b, 0xe3af9c,
+
+ /*** Four byte table, leaf: 8231bbxx - offset 0x076c6 ***/
+
+ /* 30 */ 0xe3af9d, 0xe3af9e, 0xe3af9f, 0xe3afa0,
+ /* 34 */ 0xe3afa1, 0xe3afa2, 0xe3afa3, 0xe3afa4,
+ /* 38 */ 0xe3afa5, 0xe3afa6,
+
+ /*** Four byte table, leaf: 8231bcxx - offset 0x076d0 ***/
+
+ /* 30 */ 0xe3afa7, 0xe3afa8, 0xe3afa9, 0xe3afaa,
+ /* 34 */ 0xe3afab, 0xe3afac, 0xe3afad, 0xe3afae,
+ /* 38 */ 0xe3afaf, 0xe3afb0,
+
+ /*** Four byte table, leaf: 8231bdxx - offset 0x076da ***/
+
+ /* 30 */ 0xe3afb1, 0xe3afb2, 0xe3afb3, 0xe3afb4,
+ /* 34 */ 0xe3afb5, 0xe3afb6, 0xe3afb7, 0xe3afb8,
+ /* 38 */ 0xe3afb9, 0xe3afba,
+
+ /*** Four byte table, leaf: 8231bexx - offset 0x076e4 ***/
+
+ /* 30 */ 0xe3afbb, 0xe3afbc, 0xe3afbd, 0xe3afbe,
+ /* 34 */ 0xe3afbf, 0xe3b080, 0xe3b081, 0xe3b082,
+ /* 38 */ 0xe3b083, 0xe3b084,
+
+ /*** Four byte table, leaf: 8231bfxx - offset 0x076ee ***/
+
+ /* 30 */ 0xe3b085, 0xe3b086, 0xe3b087, 0xe3b088,
+ /* 34 */ 0xe3b089, 0xe3b08a, 0xe3b08b, 0xe3b08c,
+ /* 38 */ 0xe3b08d, 0xe3b08e,
+
+ /*** Four byte table, leaf: 8231c0xx - offset 0x076f8 ***/
+
+ /* 30 */ 0xe3b08f, 0xe3b090, 0xe3b091, 0xe3b092,
+ /* 34 */ 0xe3b093, 0xe3b094, 0xe3b095, 0xe3b096,
+ /* 38 */ 0xe3b097, 0xe3b098,
+
+ /*** Four byte table, leaf: 8231c1xx - offset 0x07702 ***/
+
+ /* 30 */ 0xe3b099, 0xe3b09a, 0xe3b09b, 0xe3b09c,
+ /* 34 */ 0xe3b09d, 0xe3b09e, 0xe3b09f, 0xe3b0a0,
+ /* 38 */ 0xe3b0a1, 0xe3b0a2,
+
+ /*** Four byte table, leaf: 8231c2xx - offset 0x0770c ***/
+
+ /* 30 */ 0xe3b0a3, 0xe3b0a4, 0xe3b0a5, 0xe3b0a6,
+ /* 34 */ 0xe3b0a7, 0xe3b0a8, 0xe3b0a9, 0xe3b0aa,
+ /* 38 */ 0xe3b0ab, 0xe3b0ac,
+
+ /*** Four byte table, leaf: 8231c3xx - offset 0x07716 ***/
+
+ /* 30 */ 0xe3b0ad, 0xe3b0ae, 0xe3b0af, 0xe3b0b0,
+ /* 34 */ 0xe3b0b1, 0xe3b0b2, 0xe3b0b3, 0xe3b0b4,
+ /* 38 */ 0xe3b0b5, 0xe3b0b6,
+
+ /*** Four byte table, leaf: 8231c4xx - offset 0x07720 ***/
+
+ /* 30 */ 0xe3b0b7, 0xe3b0b8, 0xe3b0b9, 0xe3b0ba,
+ /* 34 */ 0xe3b0bb, 0xe3b0bc, 0xe3b0bd, 0xe3b0be,
+ /* 38 */ 0xe3b0bf, 0xe3b180,
+
+ /*** Four byte table, leaf: 8231c5xx - offset 0x0772a ***/
+
+ /* 30 */ 0xe3b181, 0xe3b182, 0xe3b183, 0xe3b184,
+ /* 34 */ 0xe3b185, 0xe3b186, 0xe3b187, 0xe3b188,
+ /* 38 */ 0xe3b189, 0xe3b18a,
+
+ /*** Four byte table, leaf: 8231c6xx - offset 0x07734 ***/
+
+ /* 30 */ 0xe3b18b, 0xe3b18c, 0xe3b18d, 0xe3b18e,
+ /* 34 */ 0xe3b18f, 0xe3b190, 0xe3b191, 0xe3b192,
+ /* 38 */ 0xe3b193, 0xe3b194,
+
+ /*** Four byte table, leaf: 8231c7xx - offset 0x0773e ***/
+
+ /* 30 */ 0xe3b195, 0xe3b196, 0xe3b197, 0xe3b198,
+ /* 34 */ 0xe3b199, 0xe3b19a, 0xe3b19b, 0xe3b19c,
+ /* 38 */ 0xe3b19d, 0xe3b19e,
+
+ /*** Four byte table, leaf: 8231c8xx - offset 0x07748 ***/
+
+ /* 30 */ 0xe3b19f, 0xe3b1a0, 0xe3b1a1, 0xe3b1a2,
+ /* 34 */ 0xe3b1a3, 0xe3b1a4, 0xe3b1a5, 0xe3b1a6,
+ /* 38 */ 0xe3b1a7, 0xe3b1a8,
+
+ /*** Four byte table, leaf: 8231c9xx - offset 0x07752 ***/
+
+ /* 30 */ 0xe3b1a9, 0xe3b1aa, 0xe3b1ab, 0xe3b1ac,
+ /* 34 */ 0xe3b1ad, 0xe3b1af, 0xe3b1b0, 0xe3b1b1,
+ /* 38 */ 0xe3b1b2, 0xe3b1b3,
+
+ /*** Four byte table, leaf: 8231caxx - offset 0x0775c ***/
+
+ /* 30 */ 0xe3b1b4, 0xe3b1b5, 0xe3b1b6, 0xe3b1b7,
+ /* 34 */ 0xe3b1b8, 0xe3b1b9, 0xe3b1ba, 0xe3b1bb,
+ /* 38 */ 0xe3b1bc, 0xe3b1bd,
+
+ /*** Four byte table, leaf: 8231cbxx - offset 0x07766 ***/
+
+ /* 30 */ 0xe3b1be, 0xe3b1bf, 0xe3b280, 0xe3b281,
+ /* 34 */ 0xe3b282, 0xe3b283, 0xe3b284, 0xe3b285,
+ /* 38 */ 0xe3b286, 0xe3b287,
+
+ /*** Four byte table, leaf: 8231ccxx - offset 0x07770 ***/
+
+ /* 30 */ 0xe3b288, 0xe3b289, 0xe3b28a, 0xe3b28b,
+ /* 34 */ 0xe3b28c, 0xe3b28d, 0xe3b28e, 0xe3b28f,
+ /* 38 */ 0xe3b290, 0xe3b291,
+
+ /*** Four byte table, leaf: 8231cdxx - offset 0x0777a ***/
+
+ /* 30 */ 0xe3b292, 0xe3b293, 0xe3b294, 0xe3b295,
+ /* 34 */ 0xe3b296, 0xe3b297, 0xe3b298, 0xe3b299,
+ /* 38 */ 0xe3b29a, 0xe3b29b,
+
+ /*** Four byte table, leaf: 8231cexx - offset 0x07784 ***/
+
+ /* 30 */ 0xe3b29c, 0xe3b29d, 0xe3b29e, 0xe3b29f,
+ /* 34 */ 0xe3b2a0, 0xe3b2a1, 0xe3b2a2, 0xe3b2a3,
+ /* 38 */ 0xe3b2a4, 0xe3b2a5,
+
+ /*** Four byte table, leaf: 8231cfxx - offset 0x0778e ***/
+
+ /* 30 */ 0xe3b2a6, 0xe3b2a7, 0xe3b2a8, 0xe3b2a9,
+ /* 34 */ 0xe3b2aa, 0xe3b2ab, 0xe3b2ac, 0xe3b2ad,
+ /* 38 */ 0xe3b2ae, 0xe3b2af,
+
+ /*** Four byte table, leaf: 8231d0xx - offset 0x07798 ***/
+
+ /* 30 */ 0xe3b2b0, 0xe3b2b1, 0xe3b2b2, 0xe3b2b3,
+ /* 34 */ 0xe3b2b4, 0xe3b2b5, 0xe3b2b6, 0xe3b2b7,
+ /* 38 */ 0xe3b2b8, 0xe3b2b9,
+
+ /*** Four byte table, leaf: 8231d1xx - offset 0x077a2 ***/
+
+ /* 30 */ 0xe3b2ba, 0xe3b2bb, 0xe3b2bc, 0xe3b2bd,
+ /* 34 */ 0xe3b2be, 0xe3b2bf, 0xe3b380, 0xe3b381,
+ /* 38 */ 0xe3b382, 0xe3b383,
+
+ /*** Four byte table, leaf: 8231d2xx - offset 0x077ac ***/
+
+ /* 30 */ 0xe3b384, 0xe3b385, 0xe3b386, 0xe3b387,
+ /* 34 */ 0xe3b388, 0xe3b389, 0xe3b38a, 0xe3b38b,
+ /* 38 */ 0xe3b38c, 0xe3b38d,
+
+ /*** Four byte table, leaf: 8231d3xx - offset 0x077b6 ***/
+
+ /* 30 */ 0xe3b38e, 0xe3b38f, 0xe3b390, 0xe3b391,
+ /* 34 */ 0xe3b392, 0xe3b393, 0xe3b394, 0xe3b395,
+ /* 38 */ 0xe3b396, 0xe3b397,
+
+ /*** Four byte table, leaf: 8231d4xx - offset 0x077c0 ***/
+
+ /* 30 */ 0xe3b398, 0xe3b399, 0xe3b39a, 0xe3b39b,
+ /* 34 */ 0xe3b39c, 0xe3b39d, 0xe3b39e, 0xe3b39f,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8232afxx - offset 0x077c8 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0xe48197,
+ /* 34 */ 0xe48198, 0xe48199, 0xe4819a, 0xe4819b,
+ /* 38 */ 0xe4819c, 0xe4819d,
+
+ /*** Four byte table, leaf: 8232b0xx - offset 0x077d2 ***/
+
+ /* 30 */ 0xe4819e, 0xe4819f, 0xe481a0, 0xe481a1,
+ /* 34 */ 0xe481a2, 0xe481a3, 0xe481a4, 0xe481a5,
+ /* 38 */ 0xe481a6, 0xe481a7,
+
+ /*** Four byte table, leaf: 8232b1xx - offset 0x077dc ***/
+
+ /* 30 */ 0xe481a8, 0xe481a9, 0xe481aa, 0xe481ab,
+ /* 34 */ 0xe481ac, 0xe481ad, 0xe481ae, 0xe481af,
+ /* 38 */ 0xe481b0, 0xe481b1,
+
+ /*** Four byte table, leaf: 8232b2xx - offset 0x077e6 ***/
+
+ /* 30 */ 0xe481b2, 0xe481b3, 0xe481b4, 0xe481b5,
+ /* 34 */ 0xe481b6, 0xe481b7, 0xe481b8, 0xe481b9,
+ /* 38 */ 0xe481ba, 0xe481bb,
+
+ /*** Four byte table, leaf: 8232b3xx - offset 0x077f0 ***/
+
+ /* 30 */ 0xe481bc, 0xe481bd, 0xe481be, 0xe481bf,
+ /* 34 */ 0xe48280, 0xe48281, 0xe48282, 0xe48283,
+ /* 38 */ 0xe48284, 0xe48285,
+
+ /*** Four byte table, leaf: 8232b4xx - offset 0x077fa ***/
+
+ /* 30 */ 0xe48286, 0xe48287, 0xe48288, 0xe48289,
+ /* 34 */ 0xe4828a, 0xe4828b, 0xe4828c, 0xe4828d,
+ /* 38 */ 0xe4828e, 0xe4828f,
+
+ /*** Four byte table, leaf: 8232b5xx - offset 0x07804 ***/
+
+ /* 30 */ 0xe48290, 0xe48291, 0xe48292, 0xe48293,
+ /* 34 */ 0xe48294, 0xe48295, 0xe48296, 0xe48297,
+ /* 38 */ 0xe48298, 0xe48299,
+
+ /*** Four byte table, leaf: 8232b6xx - offset 0x0780e ***/
+
+ /* 30 */ 0xe4829a, 0xe4829b, 0xe4829c, 0xe4829d,
+ /* 34 */ 0xe4829e, 0xe4829f, 0xe482a0, 0xe482a1,
+ /* 38 */ 0xe482a2, 0xe482a3,
+
+ /*** Four byte table, leaf: 8232b7xx - offset 0x07818 ***/
+
+ /* 30 */ 0xe482a4, 0xe482a5, 0xe482a6, 0xe482a7,
+ /* 34 */ 0xe482a8, 0xe482a9, 0xe482aa, 0xe482ab,
+ /* 38 */ 0xe482ac, 0xe482ad,
+
+ /*** Four byte table, leaf: 8232b8xx - offset 0x07822 ***/
+
+ /* 30 */ 0xe482ae, 0xe482af, 0xe482b0, 0xe482b1,
+ /* 34 */ 0xe482b2, 0xe482b3, 0xe482b4, 0xe482b5,
+ /* 38 */ 0xe482b6, 0xe482b7,
+
+ /*** Four byte table, leaf: 8232b9xx - offset 0x0782c ***/
+
+ /* 30 */ 0xe482b8, 0xe482b9, 0xe482ba, 0xe482bb,
+ /* 34 */ 0xe482bc, 0xe482bd, 0xe482be, 0xe482bf,
+ /* 38 */ 0xe48380, 0xe48381,
+
+ /*** Four byte table, leaf: 8232baxx - offset 0x07836 ***/
+
+ /* 30 */ 0xe48382, 0xe48383, 0xe48384, 0xe48385,
+ /* 34 */ 0xe48386, 0xe48387, 0xe48388, 0xe48389,
+ /* 38 */ 0xe4838a, 0xe4838b,
+
+ /*** Four byte table, leaf: 8232bbxx - offset 0x07840 ***/
+
+ /* 30 */ 0xe4838c, 0xe4838d, 0xe4838e, 0xe4838f,
+ /* 34 */ 0xe48390, 0xe48391, 0xe48392, 0xe48393,
+ /* 38 */ 0xe48394, 0xe48395,
+
+ /*** Four byte table, leaf: 8232bcxx - offset 0x0784a ***/
+
+ /* 30 */ 0xe48396, 0xe48397, 0xe48398, 0xe48399,
+ /* 34 */ 0xe4839a, 0xe4839b, 0xe4839c, 0xe4839d,
+ /* 38 */ 0xe4839e, 0xe4839f,
+
+ /*** Four byte table, leaf: 8232bdxx - offset 0x07854 ***/
+
+ /* 30 */ 0xe483a0, 0xe483a1, 0xe483a2, 0xe483a3,
+ /* 34 */ 0xe483a4, 0xe483a5, 0xe483a6, 0xe483a7,
+ /* 38 */ 0xe483a8, 0xe483a9,
+
+ /*** Four byte table, leaf: 8232bexx - offset 0x0785e ***/
+
+ /* 30 */ 0xe483aa, 0xe483ab, 0xe483ac, 0xe483ad,
+ /* 34 */ 0xe483ae, 0xe483af, 0xe483b0, 0xe483b1,
+ /* 38 */ 0xe483b2, 0xe483b3,
+
+ /*** Four byte table, leaf: 8232bfxx - offset 0x07868 ***/
+
+ /* 30 */ 0xe483b4, 0xe483b5, 0xe483b6, 0xe483b7,
+ /* 34 */ 0xe483b8, 0xe483b9, 0xe483ba, 0xe483bb,
+ /* 38 */ 0xe483bc, 0xe483bd,
+
+ /*** Four byte table, leaf: 8232c0xx - offset 0x07872 ***/
+
+ /* 30 */ 0xe483be, 0xe483bf, 0xe48480, 0xe48481,
+ /* 34 */ 0xe48482, 0xe48483, 0xe48484, 0xe48485,
+ /* 38 */ 0xe48486, 0xe48487,
+
+ /*** Four byte table, leaf: 8232c1xx - offset 0x0787c ***/
+
+ /* 30 */ 0xe48488, 0xe48489, 0xe4848a, 0xe4848b,
+ /* 34 */ 0xe4848c, 0xe4848d, 0xe4848e, 0xe4848f,
+ /* 38 */ 0xe48490, 0xe48491,
+
+ /*** Four byte table, leaf: 8232c2xx - offset 0x07886 ***/
+
+ /* 30 */ 0xe48492, 0xe48493, 0xe48494, 0xe48495,
+ /* 34 */ 0xe48496, 0xe48497, 0xe48498, 0xe48499,
+ /* 38 */ 0xe4849a, 0xe4849b,
+
+ /*** Four byte table, leaf: 8232c3xx - offset 0x07890 ***/
+
+ /* 30 */ 0xe4849c, 0xe4849d, 0xe4849e, 0xe4849f,
+ /* 34 */ 0xe484a0, 0xe484a1, 0xe484a2, 0xe484a3,
+ /* 38 */ 0xe484a4, 0xe484a5,
+
+ /*** Four byte table, leaf: 8232c4xx - offset 0x0789a ***/
+
+ /* 30 */ 0xe484a6, 0xe484a7, 0xe484a8, 0xe484a9,
+ /* 34 */ 0xe484aa, 0xe484ab, 0xe484ac, 0xe484ad,
+ /* 38 */ 0xe484ae, 0xe484af,
+
+ /*** Four byte table, leaf: 8232c5xx - offset 0x078a4 ***/
+
+ /* 30 */ 0xe484b0, 0xe484b1, 0xe484b2, 0xe484b3,
+ /* 34 */ 0xe484b4, 0xe484b5, 0xe484b6, 0xe484b7,
+ /* 38 */ 0xe484b8, 0xe484b9,
+
+ /*** Four byte table, leaf: 8232c6xx - offset 0x078ae ***/
+
+ /* 30 */ 0xe484ba, 0xe484bb, 0xe484bc, 0xe484bd,
+ /* 34 */ 0xe484be, 0xe484bf, 0xe48580, 0xe48581,
+ /* 38 */ 0xe48582, 0xe48583,
+
+ /*** Four byte table, leaf: 8232c7xx - offset 0x078b8 ***/
+
+ /* 30 */ 0xe48584, 0xe48585, 0xe48586, 0xe48587,
+ /* 34 */ 0xe48588, 0xe48589, 0xe4858a, 0xe4858b,
+ /* 38 */ 0xe4858c, 0xe4858d,
+
+ /*** Four byte table, leaf: 8232c8xx - offset 0x078c2 ***/
+
+ /* 30 */ 0xe4858e, 0xe4858f, 0xe48590, 0xe48591,
+ /* 34 */ 0xe48592, 0xe48593, 0xe48594, 0xe48595,
+ /* 38 */ 0xe48596, 0xe48597,
+
+ /*** Four byte table, leaf: 8232c9xx - offset 0x078cc ***/
+
+ /* 30 */ 0xe48598, 0xe48599, 0xe4859a, 0xe4859b,
+ /* 34 */ 0xe4859c, 0xe4859d, 0xe4859e,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8232f8xx - offset 0x078d3 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0xe48cb8, 0xe48cb9,
+
+ /*** Four byte table, leaf: 8232f9xx - offset 0x078dd ***/
+
+ /* 30 */ 0xe48cba, 0xe48cbb, 0xe48cbc, 0xe48cbd,
+ /* 34 */ 0xe48cbe, 0xe48cbf, 0xe48d80, 0xe48d81,
+ /* 38 */ 0xe48d82, 0xe48d83,
+
+ /*** Four byte table, leaf: 8232faxx - offset 0x078e7 ***/
+
+ /* 30 */ 0xe48d84, 0xe48d85, 0xe48d86, 0xe48d87,
+ /* 34 */ 0xe48d88, 0xe48d89, 0xe48d8a, 0xe48d8b,
+ /* 38 */ 0xe48d8c, 0xe48d8d,
+
+ /*** Four byte table, leaf: 8232fbxx - offset 0x078f1 ***/
+
+ /* 30 */ 0xe48d8e, 0xe48d8f, 0xe48d90, 0xe48d91,
+ /* 34 */ 0xe48d92, 0xe48d93, 0xe48d94, 0xe48d95,
+ /* 38 */ 0xe48d96, 0xe48d97,
+
+ /*** Four byte table, leaf: 8232fcxx - offset 0x078fb ***/
+
+ /* 30 */ 0xe48d98, 0xe48d99, 0xe48d9a, 0xe48d9b,
+ /* 34 */ 0xe48d9c, 0xe48d9d, 0xe48d9e, 0xe48d9f,
+ /* 38 */ 0xe48da0, 0xe48da1,
+
+ /*** Four byte table, leaf: 8232fdxx - offset 0x07905 ***/
+
+ /* 30 */ 0xe48da2, 0xe48da3, 0xe48da4, 0xe48da5,
+ /* 34 */ 0xe48da6, 0xe48da7, 0xe48da8, 0xe48da9,
+ /* 38 */ 0xe48daa, 0xe48dab,
+
+ /*** Four byte table, leaf: 8232fexx - offset 0x0790f ***/
+
+ /* 30 */ 0xe48dac, 0xe48dad, 0xe48dae, 0xe48daf,
+ /* 34 */ 0xe48db0, 0xe48db1, 0xe48db2, 0xe48db3,
+ /* 38 */ 0xe48db4, 0xe48db5,
+
+ /*** Four byte table, leaf: 823381xx - offset 0x07919 ***/
+
+ /* 30 */ 0xe48db6, 0xe48db7, 0xe48db8, 0xe48db9,
+ /* 34 */ 0xe48dba, 0xe48dbb, 0xe48dbc, 0xe48dbd,
+ /* 38 */ 0xe48dbe, 0xe48dbf,
+
+ /*** Four byte table, leaf: 823382xx - offset 0x07923 ***/
+
+ /* 30 */ 0xe48e80, 0xe48e81, 0xe48e82, 0xe48e83,
+ /* 34 */ 0xe48e84, 0xe48e85, 0xe48e86, 0xe48e87,
+ /* 38 */ 0xe48e88, 0xe48e89,
+
+ /*** Four byte table, leaf: 823383xx - offset 0x0792d ***/
+
+ /* 30 */ 0xe48e8a, 0xe48e8b, 0xe48e8c, 0xe48e8d,
+ /* 34 */ 0xe48e8e, 0xe48e8f, 0xe48e90, 0xe48e91,
+ /* 38 */ 0xe48e92, 0xe48e93,
+
+ /*** Four byte table, leaf: 823384xx - offset 0x07937 ***/
+
+ /* 30 */ 0xe48e94, 0xe48e95, 0xe48e96, 0xe48e97,
+ /* 34 */ 0xe48e98, 0xe48e99, 0xe48e9a, 0xe48e9b,
+ /* 38 */ 0xe48e9c, 0xe48e9d,
+
+ /*** Four byte table, leaf: 823385xx - offset 0x07941 ***/
+
+ /* 30 */ 0xe48e9e, 0xe48e9f, 0xe48ea0, 0xe48ea1,
+ /* 34 */ 0xe48ea2, 0xe48ea3, 0xe48ea4, 0xe48ea5,
+ /* 38 */ 0xe48ea6, 0xe48ea7,
+
+ /*** Four byte table, leaf: 823386xx - offset 0x0794b ***/
+
+ /* 30 */ 0xe48ea8, 0xe48ea9, 0xe48eaa, 0xe48eab,
+ /* 34 */ 0xe48ead, 0xe48eae, 0xe48eaf, 0xe48eb0,
+ /* 38 */ 0xe48eb2, 0xe48eb3,
+
+ /*** Four byte table, leaf: 823387xx - offset 0x07955 ***/
+
+ /* 30 */ 0xe48eb4, 0xe48eb5, 0xe48eb6, 0xe48eb7,
+ /* 34 */ 0xe48eb8, 0xe48eb9, 0xe48eba, 0xe48ebb,
+ /* 38 */ 0xe48ebc, 0xe48ebd,
+
+ /*** Four byte table, leaf: 823388xx - offset 0x0795f ***/
+
+ /* 30 */ 0xe48ebe, 0xe48ebf, 0xe48f80, 0xe48f81,
+ /* 34 */ 0xe48f82, 0xe48f83, 0xe48f84, 0xe48f85,
+ /* 38 */ 0xe48f86, 0xe48f87,
+
+ /*** Four byte table, leaf: 823389xx - offset 0x07969 ***/
+
+ /* 30 */ 0xe48f88, 0xe48f89, 0xe48f8a, 0xe48f8b,
+ /* 34 */ 0xe48f8c, 0xe48f8d, 0xe48f8e, 0xe48f8f,
+ /* 38 */ 0xe48f90, 0xe48f91,
+
+ /*** Four byte table, leaf: 82338axx - offset 0x07973 ***/
+
+ /* 30 */ 0xe48f92, 0xe48f93, 0xe48f94, 0xe48f95,
+ /* 34 */ 0xe48f96, 0xe48f97, 0xe48f98, 0xe48f99,
+ /* 38 */ 0xe48f9a, 0xe48f9b,
+
+ /*** Four byte table, leaf: 82338bxx - offset 0x0797d ***/
+
+ /* 30 */ 0xe48f9c, 0xe48f9e, 0xe48f9f, 0xe48fa0,
+ /* 34 */ 0xe48fa1, 0xe48fa2, 0xe48fa3, 0xe48fa4,
+ /* 38 */ 0xe48fa5, 0xe48fa6,
+
+ /*** Four byte table, leaf: 82338cxx - offset 0x07987 ***/
+
+ /* 30 */ 0xe48fa7, 0xe48fa8, 0xe48fa9, 0xe48faa,
+ /* 34 */ 0xe48fab, 0xe48fac, 0xe48fad, 0xe48fae,
+ /* 38 */ 0xe48faf, 0xe48fb0,
+
+ /*** Four byte table, leaf: 82338dxx - offset 0x07991 ***/
+
+ /* 30 */ 0xe48fb1, 0xe48fb2, 0xe48fb3, 0xe48fb4,
+ /* 34 */ 0xe48fb5, 0xe48fb6, 0xe48fb7, 0xe48fb8,
+ /* 38 */ 0xe48fb9, 0xe48fba,
+
+ /*** Four byte table, leaf: 82338exx - offset 0x0799b ***/
+
+ /* 30 */ 0xe48fbb, 0xe48fbc, 0xe48fbd, 0xe48fbe,
+ /* 34 */ 0xe48fbf, 0xe49080, 0xe49081, 0xe49082,
+ /* 38 */ 0xe49083, 0xe49084,
+
+ /*** Four byte table, leaf: 82338fxx - offset 0x079a5 ***/
+
+ /* 30 */ 0xe49085, 0xe49086, 0xe49087, 0xe49088,
+ /* 34 */ 0xe49089, 0xe4908a, 0xe4908b, 0xe4908c,
+ /* 38 */ 0xe4908d, 0xe4908e,
+
+ /*** Four byte table, leaf: 823390xx - offset 0x079af ***/
+
+ /* 30 */ 0xe4908f, 0xe49090, 0xe49091, 0xe49092,
+ /* 34 */ 0xe49093, 0xe49094, 0xe49095, 0xe49096,
+ /* 38 */ 0xe49097, 0xe49098,
+
+ /*** Four byte table, leaf: 823391xx - offset 0x079b9 ***/
+
+ /* 30 */ 0xe49099, 0xe4909a, 0xe4909b, 0xe4909c,
+ /* 34 */ 0xe4909d, 0xe4909e, 0xe4909f, 0xe490a0,
+ /* 38 */ 0xe490a1, 0xe490a2,
+
+ /*** Four byte table, leaf: 823392xx - offset 0x079c3 ***/
+
+ /* 30 */ 0xe490a3, 0xe490a4, 0xe490a5, 0xe490a6,
+ /* 34 */ 0xe490a7, 0xe490a8, 0xe490a9, 0xe490aa,
+ /* 38 */ 0xe490ab, 0xe490ac,
+
+ /*** Four byte table, leaf: 823393xx - offset 0x079cd ***/
+
+ /* 30 */ 0xe490ad, 0xe490ae, 0xe490af, 0xe490b0,
+ /* 34 */ 0xe490b1, 0xe490b2, 0xe490b3, 0xe490b4,
+ /* 38 */ 0xe490b5, 0xe490b6,
+
+ /*** Four byte table, leaf: 823394xx - offset 0x079d7 ***/
+
+ /* 30 */ 0xe490b7, 0xe490b8, 0xe490b9, 0xe490ba,
+ /* 34 */ 0xe490bb, 0xe490bc, 0xe490bd, 0xe490be,
+ /* 38 */ 0xe490bf, 0xe49180,
+
+ /*** Four byte table, leaf: 823395xx - offset 0x079e1 ***/
+
+ /* 30 */ 0xe49181, 0xe49182, 0xe49183, 0xe49184,
+ /* 34 */ 0xe49185, 0xe49186, 0xe49187, 0xe49188,
+ /* 38 */ 0xe49189, 0xe4918a,
+
+ /*** Four byte table, leaf: 823396xx - offset 0x079eb ***/
+
+ /* 30 */ 0xe4918b, 0xe4918c, 0xe4918d, 0xe4918e,
+ /* 34 */ 0xe4918f, 0xe49190, 0xe49191, 0xe49192,
+ /* 38 */ 0xe49193, 0xe49194,
+
+ /*** Four byte table, leaf: 823397xx - offset 0x079f5 ***/
+
+ /* 30 */ 0xe49195, 0xe49196, 0xe49197, 0xe49198,
+ /* 34 */ 0xe49199, 0xe4919a, 0xe4919b, 0xe4919c,
+ /* 38 */ 0xe4919d, 0xe4919e,
+
+ /*** Four byte table, leaf: 823398xx - offset 0x079ff ***/
+
+ /* 30 */ 0xe4919f, 0xe491a0, 0xe491a1, 0xe491a2,
+ /* 34 */ 0xe491a3, 0xe491a4, 0xe491a5, 0xe491a6,
+ /* 38 */ 0xe491a7, 0xe491a8,
+
+ /*** Four byte table, leaf: 823399xx - offset 0x07a09 ***/
+
+ /* 30 */ 0xe491a9, 0xe491aa, 0xe491ab, 0xe491ac,
+ /* 34 */ 0xe491ad, 0xe491ae, 0xe491af, 0xe491b0,
+ /* 38 */ 0xe491b1, 0xe491b2,
+
+ /*** Four byte table, leaf: 82339axx - offset 0x07a13 ***/
+
+ /* 30 */ 0xe491b3, 0xe491b4, 0xe491b5, 0xe491b6,
+ /* 34 */ 0xe491b7, 0xe491b8, 0xe491b9, 0xe491ba,
+ /* 38 */ 0xe491bb, 0xe491bc,
+
+ /*** Four byte table, leaf: 82339bxx - offset 0x07a1d ***/
+
+ /* 30 */ 0xe491bd, 0xe491be, 0xe491bf, 0xe49280,
+ /* 34 */ 0xe49281, 0xe49282, 0xe49283, 0xe49284,
+ /* 38 */ 0xe49285, 0xe49286,
+
+ /*** Four byte table, leaf: 82339cxx - offset 0x07a27 ***/
+
+ /* 30 */ 0xe49287, 0xe49288, 0xe49289, 0xe4928a,
+ /* 34 */ 0xe4928b, 0xe4928c, 0xe4928d, 0xe4928e,
+ /* 38 */ 0xe4928f, 0xe49290,
+
+ /*** Four byte table, leaf: 82339dxx - offset 0x07a31 ***/
+
+ /* 30 */ 0xe49291, 0xe49292, 0xe49293, 0xe49294,
+ /* 34 */ 0xe49295, 0xe49296, 0xe49297, 0xe49298,
+ /* 38 */ 0xe49299, 0xe4929a,
+
+ /*** Four byte table, leaf: 82339exx - offset 0x07a3b ***/
+
+ /* 30 */ 0xe4929b, 0xe4929c, 0xe4929d, 0xe4929e,
+ /* 34 */ 0xe4929f, 0xe492a0, 0xe492a1, 0xe492a2,
+ /* 38 */ 0xe492a3, 0xe492a4,
+
+ /*** Four byte table, leaf: 82339fxx - offset 0x07a45 ***/
+
+ /* 30 */ 0xe492a5, 0xe492a6, 0xe492a7, 0xe492a8,
+ /* 34 */ 0xe492a9, 0xe492aa, 0xe492ab, 0xe492ac,
+ /* 38 */ 0xe492ad, 0xe492ae,
+
+ /*** Four byte table, leaf: 8233a0xx - offset 0x07a4f ***/
+
+ /* 30 */ 0xe492af, 0xe492b0, 0xe492b1, 0xe492b2,
+ /* 34 */ 0xe492b3, 0xe492b4, 0xe492b5, 0xe492b6,
+ /* 38 */ 0xe492b7, 0xe492b8,
+
+ /*** Four byte table, leaf: 8233a1xx - offset 0x07a59 ***/
+
+ /* 30 */ 0xe492b9, 0xe492ba, 0xe492bb, 0xe492bc,
+ /* 34 */ 0xe492bd, 0xe492be, 0xe492bf, 0xe49380,
+ /* 38 */ 0xe49381, 0xe49382,
+
+ /*** Four byte table, leaf: 8233a2xx - offset 0x07a63 ***/
+
+ /* 30 */ 0xe49383, 0xe49384, 0xe49385, 0xe49386,
+ /* 34 */ 0xe49387, 0xe49388, 0xe49389, 0xe4938a,
+ /* 38 */ 0xe4938b, 0xe4938c,
+
+ /*** Four byte table, leaf: 8233a3xx - offset 0x07a6d ***/
+
+ /* 30 */ 0xe4938d, 0xe4938e, 0xe4938f, 0xe49390,
+ /* 34 */ 0xe49391, 0xe49392, 0xe49393, 0xe49394,
+ /* 38 */ 0xe49395,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8233c9xx - offset 0x07a76 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0xe4998d, 0xe4998e,
+ /* 34 */ 0xe4998f, 0xe49990, 0xe49991, 0xe49992,
+ /* 38 */ 0xe49993, 0xe49994,
+
+ /*** Four byte table, leaf: 8233caxx - offset 0x07a80 ***/
+
+ /* 30 */ 0xe49995, 0xe49996, 0xe49997, 0xe49998,
+ /* 34 */ 0xe49999, 0xe4999a, 0xe4999b, 0xe4999c,
+ /* 38 */ 0xe4999d, 0xe4999e,
+
+ /*** Four byte table, leaf: 8233cbxx - offset 0x07a8a ***/
+
+ /* 30 */ 0xe4999f, 0xe499a0, 0xe499a2, 0xe499a3,
+ /* 34 */ 0xe499a4, 0xe499a5, 0xe499a6, 0xe499a7,
+ /* 38 */ 0xe499a8, 0xe499a9,
+
+ /*** Four byte table, leaf: 8233ccxx - offset 0x07a94 ***/
+
+ /* 30 */ 0xe499aa, 0xe499ab, 0xe499ac, 0xe499ad,
+ /* 34 */ 0xe499ae, 0xe499af, 0xe499b0, 0xe499b1,
+ /* 38 */ 0xe499b2, 0xe499b3,
+
+ /*** Four byte table, leaf: 8233cdxx - offset 0x07a9e ***/
+
+ /* 30 */ 0xe499b4, 0xe499b5, 0xe499b6, 0xe499b7,
+ /* 34 */ 0xe499b8, 0xe499b9, 0xe499ba, 0xe499bb,
+ /* 38 */ 0xe499bc, 0xe499bd,
+
+ /*** Four byte table, leaf: 8233cexx - offset 0x07aa8 ***/
+
+ /* 30 */ 0xe499be, 0xe499bf, 0xe49a80, 0xe49a81,
+ /* 34 */ 0xe49a82, 0xe49a83, 0xe49a84, 0xe49a85,
+ /* 38 */ 0xe49a86, 0xe49a87,
+
+ /*** Four byte table, leaf: 8233cfxx - offset 0x07ab2 ***/
+
+ /* 30 */ 0xe49a88, 0xe49a89, 0xe49a8a, 0xe49a8b,
+ /* 34 */ 0xe49a8c, 0xe49a8d, 0xe49a8e, 0xe49a8f,
+ /* 38 */ 0xe49a90, 0xe49a91,
+
+ /*** Four byte table, leaf: 8233d0xx - offset 0x07abc ***/
+
+ /* 30 */ 0xe49a92, 0xe49a93, 0xe49a94, 0xe49a95,
+ /* 34 */ 0xe49a96, 0xe49a97, 0xe49a98, 0xe49a99,
+ /* 38 */ 0xe49a9a, 0xe49a9b,
+
+ /*** Four byte table, leaf: 8233d1xx - offset 0x07ac6 ***/
+
+ /* 30 */ 0xe49a9c, 0xe49a9d, 0xe49a9e, 0xe49a9f,
+ /* 34 */ 0xe49aa0, 0xe49aa1, 0xe49aa2, 0xe49aa3,
+ /* 38 */ 0xe49aa4, 0xe49aa5,
+
+ /*** Four byte table, leaf: 8233d2xx - offset 0x07ad0 ***/
+
+ /* 30 */ 0xe49aa6, 0xe49aa7, 0xe49aa8, 0xe49aa9,
+ /* 34 */ 0xe49aaa, 0xe49aab, 0xe49aac, 0xe49aad,
+ /* 38 */ 0xe49aae, 0xe49aaf,
+
+ /*** Four byte table, leaf: 8233d3xx - offset 0x07ada ***/
+
+ /* 30 */ 0xe49ab0, 0xe49ab1, 0xe49ab2, 0xe49ab3,
+ /* 34 */ 0xe49ab4, 0xe49ab5, 0xe49ab6, 0xe49ab7,
+ /* 38 */ 0xe49ab8, 0xe49ab9,
+
+ /*** Four byte table, leaf: 8233d4xx - offset 0x07ae4 ***/
+
+ /* 30 */ 0xe49aba, 0xe49abb, 0xe49abc, 0xe49abd,
+ /* 34 */ 0xe49abe, 0xe49abf, 0xe49b80, 0xe49b81,
+ /* 38 */ 0xe49b82, 0xe49b83,
+
+ /*** Four byte table, leaf: 8233d5xx - offset 0x07aee ***/
+
+ /* 30 */ 0xe49b84, 0xe49b85, 0xe49b86, 0xe49b87,
+ /* 34 */ 0xe49b88, 0xe49b89, 0xe49b8a, 0xe49b8b,
+ /* 38 */ 0xe49b8c, 0xe49b8d,
+
+ /*** Four byte table, leaf: 8233d6xx - offset 0x07af8 ***/
+
+ /* 30 */ 0xe49b8e, 0xe49b8f, 0xe49b90, 0xe49b91,
+ /* 34 */ 0xe49b92, 0xe49b93, 0xe49b94, 0xe49b95,
+ /* 38 */ 0xe49b96, 0xe49b97,
+
+ /*** Four byte table, leaf: 8233d7xx - offset 0x07b02 ***/
+
+ /* 30 */ 0xe49b98, 0xe49b99, 0xe49b9a, 0xe49b9b,
+ /* 34 */ 0xe49b9c, 0xe49b9d, 0xe49b9e, 0xe49b9f,
+ /* 38 */ 0xe49ba0, 0xe49ba1,
+
+ /*** Four byte table, leaf: 8233d8xx - offset 0x07b0c ***/
+
+ /* 30 */ 0xe49ba2, 0xe49ba3, 0xe49ba4, 0xe49ba5,
+ /* 34 */ 0xe49ba6, 0xe49ba7, 0xe49ba8, 0xe49ba9,
+ /* 38 */ 0xe49baa, 0xe49bab,
+
+ /*** Four byte table, leaf: 8233d9xx - offset 0x07b16 ***/
+
+ /* 30 */ 0xe49bac, 0xe49bad, 0xe49bae, 0xe49baf,
+ /* 34 */ 0xe49bb0, 0xe49bb1, 0xe49bb2, 0xe49bb3,
+ /* 38 */ 0xe49bb4, 0xe49bb5,
+
+ /*** Four byte table, leaf: 8233daxx - offset 0x07b20 ***/
+
+ /* 30 */ 0xe49bb6, 0xe49bb7, 0xe49bb8, 0xe49bb9,
+ /* 34 */ 0xe49bba, 0xe49bbb, 0xe49bbc, 0xe49bbd,
+ /* 38 */ 0xe49bbe, 0xe49bbf,
+
+ /*** Four byte table, leaf: 8233dbxx - offset 0x07b2a ***/
+
+ /* 30 */ 0xe49c80, 0xe49c81, 0xe49c82, 0xe49c83,
+ /* 34 */ 0xe49c84, 0xe49c85, 0xe49c86, 0xe49c87,
+ /* 38 */ 0xe49c88, 0xe49c89,
+
+ /*** Four byte table, leaf: 8233dcxx - offset 0x07b34 ***/
+
+ /* 30 */ 0xe49c8a, 0xe49c8b, 0xe49c8c, 0xe49c8d,
+ /* 34 */ 0xe49c8e, 0xe49c8f, 0xe49c90, 0xe49c91,
+ /* 38 */ 0xe49c92, 0xe49c93,
+
+ /*** Four byte table, leaf: 8233ddxx - offset 0x07b3e ***/
+
+ /* 30 */ 0xe49c94, 0xe49c95, 0xe49c96, 0xe49c97,
+ /* 34 */ 0xe49c98, 0xe49c99, 0xe49c9a, 0xe49c9b,
+ /* 38 */ 0xe49c9c, 0xe49c9d,
+
+ /*** Four byte table, leaf: 8233dexx - offset 0x07b48 ***/
+
+ /* 30 */ 0xe49c9e, 0xe49c9f, 0xe49ca0, 0xe49ca1,
+ /* 34 */ 0xe49ca2, 0xe49ca4, 0xe49ca5, 0xe49ca6,
+ /* 38 */ 0xe49ca7, 0xe49ca8,
+
+ /*** Four byte table, leaf: 8233dfxx - offset 0x07b52 ***/
+
+ /* 30 */ 0xe49caa, 0xe49cab, 0xe49cac, 0xe49cad,
+ /* 34 */ 0xe49cae, 0xe49caf, 0xe49cb0, 0xe49cb1,
+ /* 38 */ 0xe49cb2, 0xe49cb3,
+
+ /*** Four byte table, leaf: 8233e0xx - offset 0x07b5c ***/
+
+ /* 30 */ 0xe49cb4, 0xe49cb5, 0xe49cb6, 0xe49cb7,
+ /* 34 */ 0xe49cb8, 0xe49cb9, 0xe49cba, 0xe49cbb,
+ /* 38 */ 0xe49cbc, 0xe49cbd,
+
+ /*** Four byte table, leaf: 8233e1xx - offset 0x07b66 ***/
+
+ /* 30 */ 0xe49cbe, 0xe49cbf, 0xe49d80, 0xe49d81,
+ /* 34 */ 0xe49d82, 0xe49d83, 0xe49d84, 0xe49d85,
+ /* 38 */ 0xe49d86, 0xe49d87,
+
+ /*** Four byte table, leaf: 8233e2xx - offset 0x07b70 ***/
+
+ /* 30 */ 0xe49d88, 0xe49d89, 0xe49d8a, 0xe49d8b,
+ /* 34 */ 0xe49d8c, 0xe49d8d, 0xe49d8e, 0xe49d8f,
+ /* 38 */ 0xe49d90, 0xe49d91,
+
+ /*** Four byte table, leaf: 8233e3xx - offset 0x07b7a ***/
+
+ /* 30 */ 0xe49d92, 0xe49d93, 0xe49d94, 0xe49d95,
+ /* 34 */ 0xe49d96, 0xe49d97, 0xe49d98, 0xe49d99,
+ /* 38 */ 0xe49d9a, 0xe49d9b,
+
+ /*** Four byte table, leaf: 8233e4xx - offset 0x07b84 ***/
+
+ /* 30 */ 0xe49d9c, 0xe49d9d, 0xe49d9e, 0xe49d9f,
+ /* 34 */ 0xe49da0, 0xe49da1, 0xe49da2, 0xe49da3,
+ /* 38 */ 0xe49da4, 0xe49da5,
+
+ /*** Four byte table, leaf: 8233e5xx - offset 0x07b8e ***/
+
+ /* 30 */ 0xe49da6, 0xe49da7, 0xe49da8, 0xe49da9,
+ /* 34 */ 0xe49daa, 0xe49dab, 0xe49dac, 0xe49dad,
+ /* 38 */ 0xe49dae, 0xe49daf,
+
+ /*** Four byte table, leaf: 8233e6xx - offset 0x07b98 ***/
+
+ /* 30 */ 0xe49db0, 0xe49db1, 0xe49db2, 0xe49db3,
+ /* 34 */ 0xe49db4, 0xe49db5, 0xe49db6, 0xe49db7,
+ /* 38 */ 0xe49db8, 0xe49db9,
+
+ /*** Four byte table, leaf: 8233e7xx - offset 0x07ba2 ***/
+
+ /* 30 */ 0xe49dba, 0xe49dbb, 0xe49dbd, 0xe49dbe,
+ /* 34 */ 0xe49dbf, 0xe49e80, 0xe49e81, 0xe49e82,
+ /* 38 */ 0xe49e83, 0xe49e84,
+
+ /*** Four byte table, leaf: 8233e8xx - offset 0x07bac ***/
+
+ /* 30 */ 0xe49e85, 0xe49e86, 0xe49e87, 0xe49e88,
+ /* 34 */ 0xe49e89, 0xe49e8a, 0xe49e8b, 0xe49e8c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 823496xx - offset 0x07bb4 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0xe4a588,
+
+ /*** Four byte table, leaf: 823497xx - offset 0x07bbe ***/
+
+ /* 30 */ 0xe4a589, 0xe4a58a, 0xe4a58b, 0xe4a58c,
+ /* 34 */ 0xe4a58d, 0xe4a58e, 0xe4a58f, 0xe4a590,
+ /* 38 */ 0xe4a591, 0xe4a592,
+
+ /*** Four byte table, leaf: 823498xx - offset 0x07bc8 ***/
+
+ /* 30 */ 0xe4a593, 0xe4a594, 0xe4a595, 0xe4a596,
+ /* 34 */ 0xe4a597, 0xe4a598, 0xe4a599, 0xe4a59a,
+ /* 38 */ 0xe4a59b, 0xe4a59c,
+
+ /*** Four byte table, leaf: 823499xx - offset 0x07bd2 ***/
+
+ /* 30 */ 0xe4a59d, 0xe4a59e, 0xe4a59f, 0xe4a5a0,
+ /* 34 */ 0xe4a5a1, 0xe4a5a2, 0xe4a5a3, 0xe4a5a4,
+ /* 38 */ 0xe4a5a5, 0xe4a5a6,
+
+ /*** Four byte table, leaf: 82349axx - offset 0x07bdc ***/
+
+ /* 30 */ 0xe4a5a7, 0xe4a5a8, 0xe4a5a9, 0xe4a5aa,
+ /* 34 */ 0xe4a5ab, 0xe4a5ac, 0xe4a5ad, 0xe4a5ae,
+ /* 38 */ 0xe4a5af, 0xe4a5b0,
+
+ /*** Four byte table, leaf: 82349bxx - offset 0x07be6 ***/
+
+ /* 30 */ 0xe4a5b1, 0xe4a5b2, 0xe4a5b3, 0xe4a5b4,
+ /* 34 */ 0xe4a5b5, 0xe4a5b6, 0xe4a5b7, 0xe4a5b8,
+ /* 38 */ 0xe4a5b9, 0xe4a5bb,
+
+ /*** Four byte table, leaf: 82349cxx - offset 0x07bf0 ***/
+
+ /* 30 */ 0xe4a5bc, 0xe4a5be, 0xe4a5bf, 0xe4a680,
+ /* 34 */ 0xe4a681, 0xe4a684, 0xe4a687, 0xe4a688,
+ /* 38 */ 0xe4a689, 0xe4a68a,
+
+ /*** Four byte table, leaf: 82349dxx - offset 0x07bfa ***/
+
+ /* 30 */ 0xe4a68b, 0xe4a68c, 0xe4a68d, 0xe4a68e,
+ /* 34 */ 0xe4a68f, 0xe4a690, 0xe4a691, 0xe4a692,
+ /* 38 */ 0xe4a693, 0xe4a694,
+
+ /*** Four byte table, leaf: 82349exx - offset 0x07c04 ***/
+
+ /* 30 */ 0xe4a695, 0xe4a696, 0xe4a697, 0xe4a698,
+ /* 34 */ 0xe4a699, 0xe4a69a, 0xe4a69c, 0xe4a69d,
+ /* 38 */ 0xe4a69e, 0xe4a6a0,
+
+ /*** Four byte table, leaf: 82349fxx - offset 0x07c0e ***/
+
+ /* 30 */ 0xe4a6a1, 0xe4a6a2, 0xe4a6a3, 0xe4a6a4,
+ /* 34 */ 0xe4a6a5, 0xe4a6a6, 0xe4a6a7, 0xe4a6a8,
+ /* 38 */ 0xe4a6a9, 0xe4a6aa,
+
+ /*** Four byte table, leaf: 8234a0xx - offset 0x07c18 ***/
+
+ /* 30 */ 0xe4a6ab, 0xe4a6ac, 0xe4a6ad, 0xe4a6ae,
+ /* 34 */ 0xe4a6af, 0xe4a6b0, 0xe4a6b1, 0xe4a6b2,
+ /* 38 */ 0xe4a6b3, 0xe4a6b4,
+
+ /*** Four byte table, leaf: 8234a1xx - offset 0x07c22 ***/
+
+ /* 30 */ 0xe4a6b5, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8234e7xx - offset 0x07c28 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0xe4b1b8, 0xe4b1b9, 0xe4b1ba, 0xe4b1bb,
+ /* 38 */ 0xe4b1bc, 0xe4b1bd,
+
+ /*** Four byte table, leaf: 8234e8xx - offset 0x07c32 ***/
+
+ /* 30 */ 0xe4b1be, 0xe4b1bf, 0xe4b280, 0xe4b281,
+ /* 34 */ 0xe4b282, 0xe4b283, 0xe4b284, 0xe4b285,
+ /* 38 */ 0xe4b286, 0xe4b287,
+
+ /*** Four byte table, leaf: 8234e9xx - offset 0x07c3c ***/
+
+ /* 30 */ 0xe4b288, 0xe4b289, 0xe4b28a, 0xe4b28b,
+ /* 34 */ 0xe4b28c, 0xe4b28d, 0xe4b28e, 0xe4b28f,
+ /* 38 */ 0xe4b290, 0xe4b291,
+
+ /*** Four byte table, leaf: 8234eaxx - offset 0x07c46 ***/
+
+ /* 30 */ 0xe4b292, 0xe4b293, 0xe4b294, 0xe4b295,
+ /* 34 */ 0xe4b296, 0xe4b297, 0xe4b298, 0xe4b299,
+ /* 38 */ 0xe4b29a, 0xe4b29b,
+
+ /*** Four byte table, leaf: 8234ebxx - offset 0x07c50 ***/
+
+ /* 30 */ 0xe4b29c, 0xe4b29d, 0xe4b29e, 0xe4b2a4,
+ /* 34 */ 0xe4b2a5, 0xe4b2a6, 0xe4b2a7, 0xe4b2a8,
+ /* 38 */ 0xe4b2a9, 0xe4b2aa,
+
+ /*** Four byte table, leaf: 8234ecxx - offset 0x07c5a ***/
+
+ /* 30 */ 0xe4b2ab, 0xe4b2ac, 0xe4b2ad, 0xe4b2ae,
+ /* 34 */ 0xe4b2af, 0xe4b2b0, 0xe4b2b1, 0xe4b2b2,
+ /* 38 */ 0xe4b2b3, 0xe4b2b4,
+
+ /*** Four byte table, leaf: 8234edxx - offset 0x07c64 ***/
+
+ /* 30 */ 0xe4b2b5, 0xe4b2b6, 0xe4b2b7, 0xe4b2b8,
+ /* 34 */ 0xe4b2b9, 0xe4b2ba, 0xe4b2bb, 0xe4b2bc,
+ /* 38 */ 0xe4b2bd, 0xe4b2be,
+
+ /*** Four byte table, leaf: 8234eexx - offset 0x07c6e ***/
+
+ /* 30 */ 0xe4b2bf, 0xe4b380, 0xe4b381, 0xe4b382,
+ /* 34 */ 0xe4b383, 0xe4b384, 0xe4b385, 0xe4b386,
+ /* 38 */ 0xe4b387, 0xe4b388,
+
+ /*** Four byte table, leaf: 8234efxx - offset 0x07c78 ***/
+
+ /* 30 */ 0xe4b389, 0xe4b38a, 0xe4b38b, 0xe4b38c,
+ /* 34 */ 0xe4b38d, 0xe4b38e, 0xe4b38f, 0xe4b390,
+ /* 38 */ 0xe4b391, 0xe4b392,
+
+ /*** Four byte table, leaf: 8234f0xx - offset 0x07c82 ***/
+
+ /* 30 */ 0xe4b393, 0xe4b394, 0xe4b395, 0xe4b396,
+ /* 34 */ 0xe4b397, 0xe4b398, 0xe4b399, 0xe4b39a,
+ /* 38 */ 0xe4b39b, 0xe4b39c,
+
+ /*** Four byte table, leaf: 8234f1xx - offset 0x07c8c ***/
+
+ /* 30 */ 0xe4b39d, 0xe4b39e, 0xe4b39f, 0xe4b3a0,
+ /* 34 */ 0xe4b3a1, 0xe4b3a2, 0xe4b3a3, 0xe4b3a4,
+ /* 38 */ 0xe4b3a5, 0xe4b3a6,
+
+ /*** Four byte table, leaf: 8234f2xx - offset 0x07c96 ***/
+
+ /* 30 */ 0xe4b3a7, 0xe4b3a8, 0xe4b3a9, 0xe4b3aa,
+ /* 34 */ 0xe4b3ab, 0xe4b3ac, 0xe4b3ad, 0xe4b3ae,
+ /* 38 */ 0xe4b3af, 0xe4b3b0,
+
+ /*** Four byte table, leaf: 8234f3xx - offset 0x07ca0 ***/
+
+ /* 30 */ 0xe4b3b1, 0xe4b3b2, 0xe4b3b3, 0xe4b3b4,
+ /* 34 */ 0xe4b3b5, 0xe4b3b6, 0xe4b3b7, 0xe4b3b8,
+ /* 38 */ 0xe4b3b9, 0xe4b3ba,
+
+ /*** Four byte table, leaf: 8234f4xx - offset 0x07caa ***/
+
+ /* 30 */ 0xe4b3bb, 0xe4b3bc, 0xe4b3bd, 0xe4b3be,
+ /* 34 */ 0xe4b3bf, 0xe4b480, 0xe4b481, 0xe4b482,
+ /* 38 */ 0xe4b483, 0xe4b484,
+
+ /*** Four byte table, leaf: 8234f5xx - offset 0x07cb4 ***/
+
+ /* 30 */ 0xe4b485, 0xe4b486, 0xe4b487, 0xe4b488,
+ /* 34 */ 0xe4b489, 0xe4b48a, 0xe4b48b, 0xe4b48c,
+ /* 38 */ 0xe4b48d, 0xe4b48e,
+
+ /*** Four byte table, leaf: 8234f6xx - offset 0x07cbe ***/
+
+ /* 30 */ 0xe4b48f, 0xe4b490, 0xe4b491, 0xe4b492,
+ /* 34 */ 0xe4b49a, 0xe4b49b, 0xe4b49c, 0xe4b49d,
+ /* 38 */ 0xe4b49e, 0xe4b49f,
+
+ /*** Four byte table, leaf: 8234f7xx - offset 0x07cc8 ***/
+
+ /* 30 */ 0xe4b4a0, 0xe4b4a1, 0xe4b4a2, 0xe4b4a3,
+ /* 34 */ 0xe4b4a4, 0xe4b4a5, 0xe4b4a6, 0xe4b4a7,
+ /* 38 */ 0xe4b4a8, 0xe4b4a9,
+
+ /*** Four byte table, leaf: 8234f8xx - offset 0x07cd2 ***/
+
+ /* 30 */ 0xe4b4aa, 0xe4b4ab, 0xe4b4ac, 0xe4b4ad,
+ /* 34 */ 0xe4b4ae, 0xe4b4af, 0xe4b4b0, 0xe4b4b1,
+ /* 38 */ 0xe4b4b2, 0xe4b4b3,
+
+ /*** Four byte table, leaf: 8234f9xx - offset 0x07cdc ***/
+
+ /* 30 */ 0xe4b4b4, 0xe4b4b5, 0xe4b4b6, 0xe4b4b7,
+ /* 34 */ 0xe4b4b8, 0xe4b4b9, 0xe4b4ba, 0xe4b4bb,
+ /* 38 */ 0xe4b4bc, 0xe4b4bd,
+
+ /*** Four byte table, leaf: 8234faxx - offset 0x07ce6 ***/
+
+ /* 30 */ 0xe4b4be, 0xe4b4bf, 0xe4b580, 0xe4b581,
+ /* 34 */ 0xe4b582, 0xe4b583, 0xe4b584, 0xe4b585,
+ /* 38 */ 0xe4b586, 0xe4b587,
+
+ /*** Four byte table, leaf: 8234fbxx - offset 0x07cf0 ***/
+
+ /* 30 */ 0xe4b588, 0xe4b589, 0xe4b58a, 0xe4b58b,
+ /* 34 */ 0xe4b58c, 0xe4b58d, 0xe4b58e, 0xe4b58f,
+ /* 38 */ 0xe4b590, 0xe4b591,
+
+ /*** Four byte table, leaf: 8234fcxx - offset 0x07cfa ***/
+
+ /* 30 */ 0xe4b592, 0xe4b593, 0xe4b594, 0xe4b595,
+ /* 34 */ 0xe4b596, 0xe4b597, 0xe4b598, 0xe4b599,
+ /* 38 */ 0xe4b59a, 0xe4b59b,
+
+ /*** Four byte table, leaf: 8234fdxx - offset 0x07d04 ***/
+
+ /* 30 */ 0xe4b59c, 0xe4b59d, 0xe4b59e, 0xe4b59f,
+ /* 34 */ 0xe4b5a0, 0xe4b5a1, 0xe4b5a2, 0xe4b5a3,
+ /* 38 */ 0xe4b5a4, 0xe4b5a5,
+
+ /*** Four byte table, leaf: 8234fexx - offset 0x07d0e ***/
+
+ /* 30 */ 0xe4b5a6, 0xe4b5a7, 0xe4b5a8, 0xe4b5a9,
+ /* 34 */ 0xe4b5aa, 0xe4b5ab, 0xe4b5ac, 0xe4b5ad,
+ /* 38 */ 0xe4b5ae, 0xe4b5af,
+
+ /*** Four byte table, leaf: 823581xx - offset 0x07d18 ***/
+
+ /* 30 */ 0xe4b5b0, 0xe4b5b1, 0xe4b5b2, 0xe4b5b3,
+ /* 34 */ 0xe4b5b4, 0xe4b5b5, 0xe4b5b6, 0xe4b5b7,
+ /* 38 */ 0xe4b5b8, 0xe4b5b9,
+
+ /*** Four byte table, leaf: 823582xx - offset 0x07d22 ***/
+
+ /* 30 */ 0xe4b5ba, 0xe4b5bb, 0xe4b5bc, 0xe4b5bd,
+ /* 34 */ 0xe4b5be, 0xe4b5bf, 0xe4b680, 0xe4b681,
+ /* 38 */ 0xe4b682, 0xe4b683,
+
+ /*** Four byte table, leaf: 823583xx - offset 0x07d2c ***/
+
+ /* 30 */ 0xe4b684, 0xe4b685, 0xe4b686, 0xe4b687,
+ /* 34 */ 0xe4b688, 0xe4b689, 0xe4b68a, 0xe4b68b,
+ /* 38 */ 0xe4b68c, 0xe4b68d,
+
+ /*** Four byte table, leaf: 823584xx - offset 0x07d36 ***/
+
+ /* 30 */ 0xe4b68e, 0xe4b68f, 0xe4b690, 0xe4b691,
+ /* 34 */ 0xe4b692, 0xe4b693, 0xe4b694, 0xe4b695,
+ /* 38 */ 0xe4b696, 0xe4b697,
+
+ /*** Four byte table, leaf: 823585xx - offset 0x07d40 ***/
+
+ /* 30 */ 0xe4b698, 0xe4b699, 0xe4b69a, 0xe4b69b,
+ /* 34 */ 0xe4b69c, 0xe4b69d, 0xe4b69e, 0xe4b69f,
+ /* 38 */ 0xe4b6a0, 0xe4b6a1,
+
+ /*** Four byte table, leaf: 823586xx - offset 0x07d4a ***/
+
+ /* 30 */ 0xe4b6a2, 0xe4b6a3, 0xe4b6a4, 0xe4b6a5,
+ /* 34 */ 0xe4b6a6, 0xe4b6a7, 0xe4b6a8, 0xe4b6a9,
+ /* 38 */ 0xe4b6aa, 0xe4b6ab,
+
+ /*** Four byte table, leaf: 823587xx - offset 0x07d54 ***/
+
+ /* 30 */ 0xe4b6ac, 0xe4b6ad, 0xe4b6af, 0xe4b6b0,
+ /* 34 */ 0xe4b6b1, 0xe4b6b2, 0xe4b6b3, 0xe4b6b4,
+ /* 38 */ 0xe4b6b5, 0xe4b6b6,
+
+ /*** Four byte table, leaf: 823588xx - offset 0x07d5e ***/
+
+ /* 30 */ 0xe4b6b7, 0xe4b6b8, 0xe4b6b9, 0xe4b6ba,
+ /* 34 */ 0xe4b6bb, 0xe4b6bc, 0xe4b6bd, 0xe4b6be,
+ /* 38 */ 0xe4b6bf, 0xe4b780,
+
+ /*** Four byte table, leaf: 823589xx - offset 0x07d68 ***/
+
+ /* 30 */ 0xe4b781, 0xe4b782, 0xe4b783, 0xe4b784,
+ /* 34 */ 0xe4b785, 0xe4b786, 0xe4b787, 0xe4b788,
+ /* 38 */ 0xe4b789, 0xe4b78a,
+
+ /*** Four byte table, leaf: 82358axx - offset 0x07d72 ***/
+
+ /* 30 */ 0xe4b78b, 0xe4b78c, 0xe4b78d, 0xe4b78e,
+ /* 34 */ 0xe4b78f, 0xe4b790, 0xe4b791, 0xe4b792,
+ /* 38 */ 0xe4b793, 0xe4b794,
+
+ /*** Four byte table, leaf: 82358bxx - offset 0x07d7c ***/
+
+ /* 30 */ 0xe4b795, 0xe4b796, 0xe4b797, 0xe4b798,
+ /* 34 */ 0xe4b799, 0xe4b79a, 0xe4b79b, 0xe4b79c,
+ /* 38 */ 0xe4b79d, 0xe4b79e,
+
+ /*** Four byte table, leaf: 82358cxx - offset 0x07d86 ***/
+
+ /* 30 */ 0xe4b79f, 0xe4b7a0, 0xe4b7a1, 0xe4b7a2,
+ /* 34 */ 0xe4b7a3, 0xe4b7a4, 0xe4b7a5, 0xe4b7a6,
+ /* 38 */ 0xe4b7a7, 0xe4b7a8,
+
+ /*** Four byte table, leaf: 82358dxx - offset 0x07d90 ***/
+
+ /* 30 */ 0xe4b7a9, 0xe4b7aa, 0xe4b7ab, 0xe4b7ac,
+ /* 34 */ 0xe4b7ad, 0xe4b7ae, 0xe4b7af, 0xe4b7b0,
+ /* 38 */ 0xe4b7b1, 0xe4b7b2,
+
+ /*** Four byte table, leaf: 82358exx - offset 0x07d9a ***/
+
+ /* 30 */ 0xe4b7b3, 0xe4b7b4, 0xe4b7b5, 0xe4b7b6,
+ /* 34 */ 0xe4b7b7, 0xe4b7b8, 0xe4b7b9, 0xe4b7ba,
+ /* 38 */ 0xe4b7bb, 0xe4b7bc,
+
+ /*** Four byte table, leaf: 82358fxx - offset 0x07da4 ***/
+
+ /* 30 */ 0xe4b7bd, 0xe4b7be, 0xe4b7bf,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 8336c7xx - offset 0x07da7 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0xee9dac,
+
+ /*** Four byte table, leaf: 8336c8xx - offset 0x07db1 ***/
+
+ /* 30 */ 0xee9f88, 0xee9fa7, 0xee9fa8, 0xee9fa9,
+ /* 34 */ 0xee9faa, 0xee9fab, 0xee9fac, 0xee9fad,
+ /* 38 */ 0xee9fae, 0xee9faf,
+
+ /*** Four byte table, leaf: 8336c9xx - offset 0x07dbb ***/
+
+ /* 30 */ 0xee9fb0, 0xee9fb1, 0xee9fb2, 0xee9fb3,
+ /* 34 */ 0xeea095, 0xeea099, 0xeea09a, 0xeea09b,
+ /* 38 */ 0xeea09c, 0xeea09d,
+
+ /*** Four byte table, leaf: 8336caxx - offset 0x07dc5 ***/
+
+ /* 30 */ 0xeea09f, 0xeea0a0, 0xeea0a1, 0xeea0a2,
+ /* 34 */ 0xeea0a3, 0xeea0a4, 0xeea0a5, 0xeea0a7,
+ /* 38 */ 0xeea0a8, 0xeea0a9,
+
+ /*** Four byte table, leaf: 8336cbxx - offset 0x07dcf ***/
+
+ /* 30 */ 0xeea0aa, 0xeea0ad, 0xeea0ae, 0xeea0af,
+ /* 34 */ 0xeea0b0, 0xeea0b3, 0xeea0b4, 0xeea0b5,
+ /* 38 */ 0xeea0b6, 0xeea0b7,
+
+ /*** Four byte table, leaf: 8336ccxx - offset 0x07dd9 ***/
+
+ /* 30 */ 0xeea0b8, 0xeea0b9, 0xeea0ba, 0xeea0bc,
+ /* 34 */ 0xeea0bd, 0xeea0be, 0xeea0bf, 0xeea180,
+ /* 38 */ 0xeea181, 0xeea182,
+
+ /*** Four byte table, leaf: 8336cdxx - offset 0x07de3 ***/
+
+ /* 30 */ 0xeea184, 0xeea185, 0xeea186, 0xeea187,
+ /* 34 */ 0xeea188, 0xeea189, 0xeea18a, 0xeea18b,
+ /* 38 */ 0xeea18c, 0xeea18d,
+
+ /*** Four byte table, leaf: 8336cexx - offset 0x07ded ***/
+
+ /* 30 */ 0xeea18e, 0xeea18f, 0xeea190, 0xeea191,
+ /* 34 */ 0xeea192, 0xeea193, 0xeea196, 0xeea197,
+ /* 38 */ 0xeea198, 0xeea199,
+
+ /*** Four byte table, leaf: 8336cfxx - offset 0x07df7 ***/
+
+ /* 30 */ 0xeea19a, 0xeea19b, 0xeea19c, 0xeea19d,
+ /* 34 */ 0xeea19e, 0xeea19f, 0xeea1a0, 0xeea1a1,
+ /* 38 */ 0xeea1a2, 0xeea1a3,
+
+ /*** Four byte table, leaf: 843085xx - offset 0x07e01 ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0xefa4ad, 0xefa4ae, 0xefa4af,
+ /* 38 */ 0xefa4b0, 0xefa4b1,
+
+ /*** Four byte table, leaf: 843086xx - offset 0x07e0b ***/
+
+ /* 30 */ 0xefa4b2, 0xefa4b3, 0xefa4b4, 0xefa4b5,
+ /* 34 */ 0xefa4b6, 0xefa4b7, 0xefa4b8, 0xefa4b9,
+ /* 38 */ 0xefa4ba, 0xefa4bb,
+
+ /*** Four byte table, leaf: 843087xx - offset 0x07e15 ***/
+
+ /* 30 */ 0xefa4bc, 0xefa4bd, 0xefa4be, 0xefa4bf,
+ /* 34 */ 0xefa580, 0xefa581, 0xefa582, 0xefa583,
+ /* 38 */ 0xefa584, 0xefa585,
+
+ /*** Four byte table, leaf: 843088xx - offset 0x07e1f ***/
+
+ /* 30 */ 0xefa586, 0xefa587, 0xefa588, 0xefa589,
+ /* 34 */ 0xefa58a, 0xefa58b, 0xefa58c, 0xefa58d,
+ /* 38 */ 0xefa58e, 0xefa58f,
+
+ /*** Four byte table, leaf: 843089xx - offset 0x07e29 ***/
+
+ /* 30 */ 0xefa590, 0xefa591, 0xefa592, 0xefa593,
+ /* 34 */ 0xefa594, 0xefa595, 0xefa596, 0xefa597,
+ /* 38 */ 0xefa598, 0xefa599,
+
+ /*** Four byte table, leaf: 84308axx - offset 0x07e33 ***/
+
+ /* 30 */ 0xefa59a, 0xefa59b, 0xefa59c, 0xefa59d,
+ /* 34 */ 0xefa59e, 0xefa59f, 0xefa5a0, 0xefa5a1,
+ /* 38 */ 0xefa5a2, 0xefa5a3,
+
+ /*** Four byte table, leaf: 84308bxx - offset 0x07e3d ***/
+
+ /* 30 */ 0xefa5a4, 0xefa5a5, 0xefa5a6, 0xefa5a7,
+ /* 34 */ 0xefa5a8, 0xefa5a9, 0xefa5aa, 0xefa5ab,
+ /* 38 */ 0xefa5ac, 0xefa5ad,
+
+ /*** Four byte table, leaf: 84308cxx - offset 0x07e47 ***/
+
+ /* 30 */ 0xefa5ae, 0xefa5af, 0xefa5b0, 0xefa5b1,
+ /* 34 */ 0xefa5b2, 0xefa5b3, 0xefa5b4, 0xefa5b5,
+ /* 38 */ 0xefa5b6, 0xefa5b7,
+
+ /*** Four byte table, leaf: 84308dxx - offset 0x07e51 ***/
+
+ /* 30 */ 0xefa5b8, 0xefa5ba, 0xefa5bb, 0xefa5bc,
+ /* 34 */ 0xefa5bd, 0xefa5be, 0xefa5bf, 0xefa680,
+ /* 38 */ 0xefa681, 0xefa682,
+
+ /*** Four byte table, leaf: 84308exx - offset 0x07e5b ***/
+
+ /* 30 */ 0xefa683, 0xefa684, 0xefa685, 0xefa686,
+ /* 34 */ 0xefa687, 0xefa688, 0xefa689, 0xefa68a,
+ /* 38 */ 0xefa68b, 0xefa68c,
+
+ /*** Four byte table, leaf: 84308fxx - offset 0x07e65 ***/
+
+ /* 30 */ 0xefa68d, 0xefa68e, 0xefa68f, 0xefa690,
+ /* 34 */ 0xefa691, 0xefa692, 0xefa693, 0xefa694,
+ /* 38 */ 0xefa696, 0xefa697,
+
+ /*** Four byte table, leaf: 843090xx - offset 0x07e6f ***/
+
+ /* 30 */ 0xefa698, 0xefa699, 0xefa69a, 0xefa69b,
+ /* 34 */ 0xefa69c, 0xefa69d, 0xefa69e, 0xefa69f,
+ /* 38 */ 0xefa6a0, 0xefa6a1,
+
+ /*** Four byte table, leaf: 843091xx - offset 0x07e79 ***/
+
+ /* 30 */ 0xefa6a2, 0xefa6a3, 0xefa6a4, 0xefa6a5,
+ /* 34 */ 0xefa6a6, 0xefa6a7, 0xefa6a8, 0xefa6a9,
+ /* 38 */ 0xefa6aa, 0xefa6ab,
+
+ /*** Four byte table, leaf: 843092xx - offset 0x07e83 ***/
+
+ /* 30 */ 0xefa6ac, 0xefa6ad, 0xefa6ae, 0xefa6af,
+ /* 34 */ 0xefa6b0, 0xefa6b1, 0xefa6b2, 0xefa6b3,
+ /* 38 */ 0xefa6b4, 0xefa6b5,
+
+ /*** Four byte table, leaf: 843093xx - offset 0x07e8d ***/
+
+ /* 30 */ 0xefa6b6, 0xefa6b7, 0xefa6b8, 0xefa6b9,
+ /* 34 */ 0xefa6ba, 0xefa6bb, 0xefa6bc, 0xefa6bd,
+ /* 38 */ 0xefa6be, 0xefa6bf,
+
+ /*** Four byte table, leaf: 843094xx - offset 0x07e97 ***/
+
+ /* 30 */ 0xefa780, 0xefa781, 0xefa782, 0xefa783,
+ /* 34 */ 0xefa784, 0xefa785, 0xefa786, 0xefa787,
+ /* 38 */ 0xefa788, 0xefa789,
+
+ /*** Four byte table, leaf: 843095xx - offset 0x07ea1 ***/
+
+ /* 30 */ 0xefa78a, 0xefa78b, 0xefa78c, 0xefa78d,
+ /* 34 */ 0xefa78e, 0xefa78f, 0xefa790, 0xefa791,
+ /* 38 */ 0xefa792, 0xefa793,
+
+ /*** Four byte table, leaf: 843096xx - offset 0x07eab ***/
+
+ /* 30 */ 0xefa794, 0xefa795, 0xefa796, 0xefa797,
+ /* 34 */ 0xefa798, 0xefa799, 0xefa79a, 0xefa79b,
+ /* 38 */ 0xefa79c, 0xefa79d,
+
+ /*** Four byte table, leaf: 843097xx - offset 0x07eb5 ***/
+
+ /* 30 */ 0xefa79e, 0xefa79f, 0xefa7a0, 0xefa7a1,
+ /* 34 */ 0xefa7a2, 0xefa7a3, 0xefa7a4, 0xefa7a5,
+ /* 38 */ 0xefa7a6, 0xefa7a8,
+
+ /*** Four byte table, leaf: 843098xx - offset 0x07ebf ***/
+
+ /* 30 */ 0xefa7a9, 0xefa7aa, 0xefa7ab, 0xefa7ac,
+ /* 34 */ 0xefa7ad, 0xefa7ae, 0xefa7af, 0xefa7b0,
+ /* 38 */ 0xefa7b2, 0xefa7b3,
+
+ /*** Four byte table, leaf: 843099xx - offset 0x07ec9 ***/
+
+ /* 30 */ 0xefa7b4, 0xefa7b5, 0xefa7b6, 0xefa7b7,
+ /* 34 */ 0xefa7b8, 0xefa7b9, 0xefa7ba, 0xefa7bb,
+ /* 38 */ 0xefa7bc, 0xefa7bd,
+
+ /*** Four byte table, leaf: 84309axx - offset 0x07ed3 ***/
+
+ /* 30 */ 0xefa7be, 0xefa7bf, 0xefa880, 0xefa881,
+ /* 34 */ 0xefa882, 0xefa883, 0xefa884, 0xefa885,
+ /* 38 */ 0xefa886, 0xefa887,
+
+ /*** Four byte table, leaf: 84309bxx - offset 0x07edd ***/
+
+ /* 30 */ 0xefa888, 0xefa889, 0xefa88a, 0xefa88b,
+ /* 34 */ 0xefa890, 0xefa892, 0xefa895, 0xefa896,
+ /* 38 */ 0xefa897, 0xefa899,
+
+ /*** Four byte table, leaf: 84309cxx - offset 0x07ee7 ***/
+
+ /* 30 */ 0xefa89a, 0xefa89b, 0xefa89c, 0xefa89d,
+ /* 34 */ 0xefa89e, 0xefa8a2, 0xefa8a5, 0xefa8a6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: 843185xx - offset 0x07eef ***/
+
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0xefb8b2, 0xefb985,
+
+ /*** Four byte table, leaf: 843186xx - offset 0x07ef9 ***/
+
+ /* 30 */ 0xefb986, 0xefb987, 0xefb988, 0xefb993,
+ /* 34 */ 0xefb998, 0xefb9a7, 0xefb9ac, 0xefb9ad,
+ /* 38 */ 0xefb9ae, 0xefb9af,
+
+ /*** Four byte table, leaf: 843187xx - offset 0x07f03 ***/
+
+ /* 30 */ 0xefb9b0, 0xefb9b1, 0xefb9b2, 0xefb9b3,
+ /* 34 */ 0xefb9b4, 0xefb9b5, 0xefb9b6, 0xefb9b7,
+ /* 38 */ 0xefb9b8, 0xefb9b9,
+
+ /*** Four byte table, leaf: 843188xx - offset 0x07f0d ***/
+
+ /* 30 */ 0xefb9ba, 0xefb9bb, 0xefb9bc, 0xefb9bd,
+ /* 34 */ 0xefb9be, 0xefb9bf, 0xefba80, 0xefba81,
+ /* 38 */ 0xefba82, 0xefba83,
+
+ /*** Four byte table, leaf: 843189xx - offset 0x07f17 ***/
+
+ /* 30 */ 0xefba84, 0xefba85, 0xefba86, 0xefba87,
+ /* 34 */ 0xefba88, 0xefba89, 0xefba8a, 0xefba8b,
+ /* 38 */ 0xefba8c, 0xefba8d,
+
+ /*** Four byte table, leaf: 84318axx - offset 0x07f21 ***/
+
+ /* 30 */ 0xefba8e, 0xefba8f, 0xefba90, 0xefba91,
+ /* 34 */ 0xefba92, 0xefba93, 0xefba94, 0xefba95,
+ /* 38 */ 0xefba96, 0xefba97,
+
+ /*** Four byte table, leaf: 84318bxx - offset 0x07f2b ***/
+
+ /* 30 */ 0xefba98, 0xefba99, 0xefba9a, 0xefba9b,
+ /* 34 */ 0xefba9c, 0xefba9d, 0xefba9e, 0xefba9f,
+ /* 38 */ 0xefbaa0, 0xefbaa1,
+
+ /*** Four byte table, leaf: 84318cxx - offset 0x07f35 ***/
+
+ /* 30 */ 0xefbaa2, 0xefbaa3, 0xefbaa4, 0xefbaa5,
+ /* 34 */ 0xefbaa6, 0xefbaa7, 0xefbaa8, 0xefbaa9,
+ /* 38 */ 0xefbaaa, 0xefbaab,
+
+ /*** Four byte table, leaf: 84318dxx - offset 0x07f3f ***/
+
+ /* 30 */ 0xefbaac, 0xefbaad, 0xefbaae, 0xefbaaf,
+ /* 34 */ 0xefbab0, 0xefbab1, 0xefbab2, 0xefbab3,
+ /* 38 */ 0xefbab4, 0xefbab5,
+
+ /*** Four byte table, leaf: 84318exx - offset 0x07f49 ***/
+
+ /* 30 */ 0xefbab6, 0xefbab7, 0xefbab8, 0xefbab9,
+ /* 34 */ 0xefbaba, 0xefbabb, 0xefbabc, 0xefbabd,
+ /* 38 */ 0xefbabe, 0xefbabf,
+
+ /*** Four byte table, leaf: 84318fxx - offset 0x07f53 ***/
+
+ /* 30 */ 0xefbb80, 0xefbb81, 0xefbb82, 0xefbb83,
+ /* 34 */ 0xefbb84, 0xefbb85, 0xefbb86, 0xefbb87,
+ /* 38 */ 0xefbb88, 0xefbb89,
+
+ /*** Four byte table, leaf: 843190xx - offset 0x07f5d ***/
+
+ /* 30 */ 0xefbb8a, 0xefbb8b, 0xefbb8c, 0xefbb8d,
+ /* 34 */ 0xefbb8e, 0xefbb8f, 0xefbb90, 0xefbb91,
+ /* 38 */ 0xefbb92, 0xefbb93,
+
+ /*** Four byte table, leaf: 843191xx - offset 0x07f67 ***/
+
+ /* 30 */ 0xefbb94, 0xefbb95, 0xefbb96, 0xefbb97,
+ /* 34 */ 0xefbb98, 0xefbb99, 0xefbb9a, 0xefbb9b,
+ /* 38 */ 0xefbb9c, 0xefbb9d,
+
+ /*** Four byte table, leaf: 843192xx - offset 0x07f71 ***/
+
+ /* 30 */ 0xefbb9e, 0xefbb9f, 0xefbba0, 0xefbba1,
+ /* 34 */ 0xefbba2, 0xefbba3, 0xefbba4, 0xefbba5,
+ /* 38 */ 0xefbba6, 0xefbba7,
+
+ /*** Four byte table, leaf: 843193xx - offset 0x07f7b ***/
+
+ /* 30 */ 0xefbba8, 0xefbba9, 0xefbbaa, 0xefbbab,
+ /* 34 */ 0xefbbac, 0xefbbad, 0xefbbae, 0xefbbaf,
+ /* 38 */ 0xefbbb0, 0xefbbb1,
+
+ /*** Four byte table, leaf: 843194xx - offset 0x07f85 ***/
+
+ /* 30 */ 0xefbbb2, 0xefbbb3, 0xefbbb4, 0xefbbb5,
+ /* 34 */ 0xefbbb6, 0xefbbb7, 0xefbbb8, 0xefbbb9,
+ /* 38 */ 0xefbbba, 0xefbbbb,
+
+ /*** Four byte table, leaf: 843195xx - offset 0x07f8f ***/
+
+ /* 30 */ 0xefbbbc, 0xefbbbd, 0xefbbbe, 0xefbbbf,
+ /* 34 */ 0xefbc80, 0xefbd9f, 0xefbda0, 0xefbda1,
+ /* 38 */ 0xefbda2, 0xefbda3,
+
+ /*** Four byte table, leaf: 843196xx - offset 0x07f99 ***/
+
+ /* 30 */ 0xefbda4, 0xefbda5, 0xefbda6, 0xefbda7,
+ /* 34 */ 0xefbda8, 0xefbda9, 0xefbdaa, 0xefbdab,
+ /* 38 */ 0xefbdac, 0xefbdad,
+
+ /*** Four byte table, leaf: 843197xx - offset 0x07fa3 ***/
+
+ /* 30 */ 0xefbdae, 0xefbdaf, 0xefbdb0, 0xefbdb1,
+ /* 34 */ 0xefbdb2, 0xefbdb3, 0xefbdb4, 0xefbdb5,
+ /* 38 */ 0xefbdb6, 0xefbdb7,
+
+ /*** Four byte table, leaf: 843198xx - offset 0x07fad ***/
+
+ /* 30 */ 0xefbdb8, 0xefbdb9, 0xefbdba, 0xefbdbb,
+ /* 34 */ 0xefbdbc, 0xefbdbd, 0xefbdbe, 0xefbdbf,
+ /* 38 */ 0xefbe80, 0xefbe81,
+
+ /*** Four byte table, leaf: 843199xx - offset 0x07fb7 ***/
+
+ /* 30 */ 0xefbe82, 0xefbe83, 0xefbe84, 0xefbe85,
+ /* 34 */ 0xefbe86, 0xefbe87, 0xefbe88, 0xefbe89,
+ /* 38 */ 0xefbe8a, 0xefbe8b,
+
+ /*** Four byte table, leaf: 84319axx - offset 0x07fc1 ***/
+
+ /* 30 */ 0xefbe8c, 0xefbe8d, 0xefbe8e, 0xefbe8f,
+ /* 34 */ 0xefbe90, 0xefbe91, 0xefbe92, 0xefbe93,
+ /* 38 */ 0xefbe94, 0xefbe95,
+
+ /*** Four byte table, leaf: 84319bxx - offset 0x07fcb ***/
+
+ /* 30 */ 0xefbe96, 0xefbe97, 0xefbe98, 0xefbe99,
+ /* 34 */ 0xefbe9a, 0xefbe9b, 0xefbe9c, 0xefbe9d,
+ /* 38 */ 0xefbe9e, 0xefbe9f,
+
+ /*** Four byte table, leaf: 84319cxx - offset 0x07fd5 ***/
+
+ /* 30 */ 0xefbea0, 0xefbea1, 0xefbea2, 0xefbea3,
+ /* 34 */ 0xefbea4, 0xefbea5, 0xefbea6, 0xefbea7,
+ /* 38 */ 0xefbea8, 0xefbea9,
+
+ /*** Four byte table, leaf: 84319dxx - offset 0x07fdf ***/
+
+ /* 30 */ 0xefbeaa, 0xefbeab, 0xefbeac, 0xefbead,
+ /* 34 */ 0xefbeae, 0xefbeaf, 0xefbeb0, 0xefbeb1,
+ /* 38 */ 0xefbeb2, 0xefbeb3,
+
+ /*** Four byte table, leaf: 84319exx - offset 0x07fe9 ***/
+
+ /* 30 */ 0xefbeb4, 0xefbeb5, 0xefbeb6, 0xefbeb7,
+ /* 34 */ 0xefbeb8, 0xefbeb9, 0xefbeba, 0xefbebb,
+ /* 38 */ 0xefbebc, 0xefbebd,
+
+ /*** Four byte table, leaf: 84319fxx - offset 0x07ff3 ***/
+
+ /* 30 */ 0xefbebe, 0xefbebf, 0xefbf80, 0xefbf81,
+ /* 34 */ 0xefbf82, 0xefbf83, 0xefbf84, 0xefbf85,
+ /* 38 */ 0xefbf86, 0xefbf87,
+
+ /*** Four byte table, leaf: 8431a0xx - offset 0x07ffd ***/
+
+ /* 30 */ 0xefbf88, 0xefbf89, 0xefbf8a, 0xefbf8b,
+ /* 34 */ 0xefbf8c, 0xefbf8d, 0xefbf8e, 0xefbf8f,
+ /* 38 */ 0xefbf90, 0xefbf91,
+
+ /*** Four byte table, leaf: 8431a1xx - offset 0x08007 ***/
+
+ /* 30 */ 0xefbf92, 0xefbf93, 0xefbf94, 0xefbf95,
+ /* 34 */ 0xefbf96, 0xefbf97, 0xefbf98, 0xefbf99,
+ /* 38 */ 0xefbf9a, 0xefbf9b,
+
+ /*** Four byte table, leaf: 8431a2xx - offset 0x08011 ***/
+
+ /* 30 */ 0xefbf9c, 0xefbf9d, 0xefbf9e, 0xefbf9f,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/gbk_to_utf8.map b/src/backend/utils/mb/Unicode/gbk_to_utf8.map
new file mode 100644
index 0000000..df5de79
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/gbk_to_utf8.map
@@ -0,0 +1,6554 @@
+/* src/backend/utils/mb/Unicode/gbk_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 gbk_to_unicode_tree_table[24354];
+
+static const pg_mb_radix_tree gbk_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ gbk_to_unicode_tree_table,
+
+ 0x00bf, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0x80, /* b1_upper */
+
+ 0x00c0, /* offset of table for 2-byte inputs */
+ 0x81, /* b2_1_lower */
+ 0xfe, /* b2_1_upper */
+ 0x40, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 gbk_to_unicode_tree_table[24354] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x000bf ***/
+
+ /* 80 */ 0xe282ac,
+
+ /*** Two byte table, byte #1: xx - offset 0x000c0 ***/
+
+ /* 81 */ 0x00013e, 0x0001fd, 0x0002bc, 0x00037b,
+ /* 85 */ 0x00043a, 0x0004f9, 0x0005b8, 0x000677,
+ /* 89 */ 0x000736, 0x0007f5, 0x0008b4, 0x000973,
+ /* 8d */ 0x000a32, 0x000af1, 0x000bb0, 0x000c6f,
+ /* 91 */ 0x000d2e, 0x000ded, 0x000eac, 0x000f6b,
+ /* 95 */ 0x00102a, 0x0010e9, 0x0011a8, 0x001267,
+ /* 99 */ 0x001326, 0x0013e5, 0x0014a4, 0x001563,
+ /* 9d */ 0x001622, 0x0016e1, 0x0017a0, 0x00185f,
+ /* a1 */ 0x00191e, 0x0019dd, 0x001a9a, 0x001b59,
+ /* a5 */ 0x001c0d, 0x001cc4, 0x001d7a, 0x001e39,
+ /* a9 */ 0x001ef8, 0x001fb7, 0x002076, 0x002135,
+ /* ad */ 0x0021f4, 0x0022b3, 0x002372, 0x002431,
+ /* b1 */ 0x0024f0, 0x0025af, 0x00266e, 0x00272d,
+ /* b5 */ 0x0027ec, 0x0028ab, 0x00296a, 0x002a29,
+ /* b9 */ 0x002ae8, 0x002ba7, 0x002c66, 0x002d25,
+ /* bd */ 0x002de4, 0x002ea3, 0x002f62, 0x003021,
+ /* c1 */ 0x0030e0, 0x00319f, 0x00325e, 0x00331d,
+ /* c5 */ 0x0033dc, 0x00349b, 0x00355a, 0x003619,
+ /* c9 */ 0x0036d8, 0x003797, 0x003856, 0x003915,
+ /* cd */ 0x0039d4, 0x003a93, 0x003b52, 0x003c11,
+ /* d1 */ 0x003cd0, 0x003d8f, 0x003e4e, 0x003f0d,
+ /* d5 */ 0x003fcc, 0x00408b, 0x00414a, 0x004209,
+ /* d9 */ 0x0042c8, 0x004387, 0x004446, 0x004505,
+ /* dd */ 0x0045c4, 0x004683, 0x004742, 0x004801,
+ /* e1 */ 0x0048c0, 0x00497f, 0x004a3e, 0x004afd,
+ /* e5 */ 0x004bbc, 0x004c7b, 0x004d3a, 0x004df9,
+ /* e9 */ 0x004eb8, 0x004f77, 0x005036, 0x0050f5,
+ /* ed */ 0x0051b4, 0x005273, 0x005332, 0x0053f1,
+ /* f1 */ 0x0054b0, 0x00556f, 0x00562e, 0x0056ed,
+ /* f5 */ 0x0057ac, 0x00586b, 0x00592a, 0x0059e9,
+ /* f9 */ 0x005aa8, 0x005b67, 0x005c26, 0x005ce5,
+ /* fd */ 0x005da4, 0x005e63,
+
+ /*** Two byte table, leaf: 81xx - offset 0x0013e ***/
+
+ /* 40 */ 0xe4b882, 0xe4b884, 0xe4b885, 0xe4b886,
+ /* 44 */ 0xe4b88f, 0xe4b892, 0xe4b897, 0xe4b89f,
+ /* 48 */ 0xe4b8a0, 0xe4b8a1, 0xe4b8a3, 0xe4b8a6,
+ /* 4c */ 0xe4b8a9, 0xe4b8ae, 0xe4b8af, 0xe4b8b1,
+ /* 50 */ 0xe4b8b3, 0xe4b8b5, 0xe4b8b7, 0xe4b8bc,
+ /* 54 */ 0xe4b980, 0xe4b981, 0xe4b982, 0xe4b984,
+ /* 58 */ 0xe4b986, 0xe4b98a, 0xe4b991, 0xe4b995,
+ /* 5c */ 0xe4b997, 0xe4b99a, 0xe4b99b, 0xe4b9a2,
+ /* 60 */ 0xe4b9a3, 0xe4b9a4, 0xe4b9a5, 0xe4b9a7,
+ /* 64 */ 0xe4b9a8, 0xe4b9aa, 0xe4b9ab, 0xe4b9ac,
+ /* 68 */ 0xe4b9ad, 0xe4b9ae, 0xe4b9af, 0xe4b9b2,
+ /* 6c */ 0xe4b9b4, 0xe4b9b5, 0xe4b9b6, 0xe4b9b7,
+ /* 70 */ 0xe4b9b8, 0xe4b9b9, 0xe4b9ba, 0xe4b9bb,
+ /* 74 */ 0xe4b9bc, 0xe4b9bd, 0xe4b9bf, 0xe4ba80,
+ /* 78 */ 0xe4ba81, 0xe4ba82, 0xe4ba83, 0xe4ba84,
+ /* 7c */ 0xe4ba85, 0xe4ba87, 0xe4ba8a, 0x000000,
+ /* 80 */ 0xe4ba90, 0xe4ba96, 0xe4ba97, 0xe4ba99,
+ /* 84 */ 0xe4ba9c, 0xe4ba9d, 0xe4ba9e, 0xe4baa3,
+ /* 88 */ 0xe4baaa, 0xe4baaf, 0xe4bab0, 0xe4bab1,
+ /* 8c */ 0xe4bab4, 0xe4bab6, 0xe4bab7, 0xe4bab8,
+ /* 90 */ 0xe4bab9, 0xe4babc, 0xe4babd, 0xe4babe,
+ /* 94 */ 0xe4bb88, 0xe4bb8c, 0xe4bb8f, 0xe4bb90,
+ /* 98 */ 0xe4bb92, 0xe4bb9a, 0xe4bb9b, 0xe4bb9c,
+ /* 9c */ 0xe4bba0, 0xe4bba2, 0xe4bba6, 0xe4bba7,
+ /* a0 */ 0xe4bba9, 0xe4bbad, 0xe4bbae, 0xe4bbaf,
+ /* a4 */ 0xe4bbb1, 0xe4bbb4, 0xe4bbb8, 0xe4bbb9,
+ /* a8 */ 0xe4bbba, 0xe4bbbc, 0xe4bbbe, 0xe4bc80,
+ /* ac */ 0xe4bc82, 0xe4bc83, 0xe4bc84, 0xe4bc85,
+ /* b0 */ 0xe4bc86, 0xe4bc87, 0xe4bc88, 0xe4bc8b,
+ /* b4 */ 0xe4bc8c, 0xe4bc92, 0xe4bc93, 0xe4bc94,
+ /* b8 */ 0xe4bc95, 0xe4bc96, 0xe4bc9c, 0xe4bc9d,
+ /* bc */ 0xe4bca1, 0xe4bca3, 0xe4bca8, 0xe4bca9,
+ /* c0 */ 0xe4bcac, 0xe4bcad, 0xe4bcae, 0xe4bcb1,
+ /* c4 */ 0xe4bcb3, 0xe4bcb5, 0xe4bcb7, 0xe4bcb9,
+ /* c8 */ 0xe4bcbb, 0xe4bcbe, 0xe4bcbf, 0xe4bd80,
+ /* cc */ 0xe4bd81, 0xe4bd82, 0xe4bd84, 0xe4bd85,
+ /* d0 */ 0xe4bd87, 0xe4bd88, 0xe4bd89, 0xe4bd8a,
+ /* d4 */ 0xe4bd8b, 0xe4bd8c, 0xe4bd92, 0xe4bd94,
+ /* d8 */ 0xe4bd96, 0xe4bda1, 0xe4bda2, 0xe4bda6,
+ /* dc */ 0xe4bda8, 0xe4bdaa, 0xe4bdab, 0xe4bdad,
+ /* e0 */ 0xe4bdae, 0xe4bdb1, 0xe4bdb2, 0xe4bdb5,
+ /* e4 */ 0xe4bdb7, 0xe4bdb8, 0xe4bdb9, 0xe4bdba,
+ /* e8 */ 0xe4bdbd, 0xe4be80, 0xe4be81, 0xe4be82,
+ /* ec */ 0xe4be85, 0xe4be86, 0xe4be87, 0xe4be8a,
+ /* f0 */ 0xe4be8c, 0xe4be8e, 0xe4be90, 0xe4be92,
+ /* f4 */ 0xe4be93, 0xe4be95, 0xe4be96, 0xe4be98,
+ /* f8 */ 0xe4be99, 0xe4be9a, 0xe4be9c, 0xe4be9e,
+ /* fc */ 0xe4be9f, 0xe4bea1, 0xe4bea2,
+
+ /*** Two byte table, leaf: 82xx - offset 0x001fd ***/
+
+ /* 40 */ 0xe4bea4, 0xe4beab, 0xe4bead, 0xe4beb0,
+ /* 44 */ 0xe4beb1, 0xe4beb2, 0xe4beb3, 0xe4beb4,
+ /* 48 */ 0xe4beb6, 0xe4beb7, 0xe4beb8, 0xe4beb9,
+ /* 4c */ 0xe4beba, 0xe4bebb, 0xe4bebc, 0xe4bebd,
+ /* 50 */ 0xe4bebe, 0xe4bf80, 0xe4bf81, 0xe4bf82,
+ /* 54 */ 0xe4bf86, 0xe4bf87, 0xe4bf88, 0xe4bf89,
+ /* 58 */ 0xe4bf8b, 0xe4bf8c, 0xe4bf8d, 0xe4bf92,
+ /* 5c */ 0xe4bf93, 0xe4bf94, 0xe4bf95, 0xe4bf96,
+ /* 60 */ 0xe4bf99, 0xe4bf9b, 0xe4bfa0, 0xe4bfa2,
+ /* 64 */ 0xe4bfa4, 0xe4bfa5, 0xe4bfa7, 0xe4bfab,
+ /* 68 */ 0xe4bfac, 0xe4bfb0, 0xe4bfb2, 0xe4bfb4,
+ /* 6c */ 0xe4bfb5, 0xe4bfb6, 0xe4bfb7, 0xe4bfb9,
+ /* 70 */ 0xe4bfbb, 0xe4bfbc, 0xe4bfbd, 0xe4bfbf,
+ /* 74 */ 0xe58080, 0xe58081, 0xe58082, 0xe58083,
+ /* 78 */ 0xe58084, 0xe58085, 0xe58086, 0xe58087,
+ /* 7c */ 0xe58088, 0xe58089, 0xe5808a, 0x000000,
+ /* 80 */ 0xe5808b, 0xe5808e, 0xe58090, 0xe58091,
+ /* 84 */ 0xe58093, 0xe58095, 0xe58096, 0xe58097,
+ /* 88 */ 0xe5809b, 0xe5809d, 0xe5809e, 0xe580a0,
+ /* 8c */ 0xe580a2, 0xe580a3, 0xe580a4, 0xe580a7,
+ /* 90 */ 0xe580ab, 0xe580af, 0xe580b0, 0xe580b1,
+ /* 94 */ 0xe580b2, 0xe580b3, 0xe580b4, 0xe580b5,
+ /* 98 */ 0xe580b6, 0xe580b7, 0xe580b8, 0xe580b9,
+ /* 9c */ 0xe580bb, 0xe580bd, 0xe580bf, 0xe58180,
+ /* a0 */ 0xe58181, 0xe58182, 0xe58184, 0xe58185,
+ /* a4 */ 0xe58186, 0xe58189, 0xe5818a, 0xe5818b,
+ /* a8 */ 0xe5818d, 0xe58190, 0xe58191, 0xe58192,
+ /* ac */ 0xe58193, 0xe58194, 0xe58196, 0xe58197,
+ /* b0 */ 0xe58198, 0xe58199, 0xe5819b, 0xe5819d,
+ /* b4 */ 0xe5819e, 0xe5819f, 0xe581a0, 0xe581a1,
+ /* b8 */ 0xe581a2, 0xe581a3, 0xe581a4, 0xe581a6,
+ /* bc */ 0xe581a7, 0xe581a8, 0xe581a9, 0xe581aa,
+ /* c0 */ 0xe581ab, 0xe581ad, 0xe581ae, 0xe581af,
+ /* c4 */ 0xe581b0, 0xe581b1, 0xe581b2, 0xe581b3,
+ /* c8 */ 0xe581b4, 0xe581b5, 0xe581b8, 0xe581b9,
+ /* cc */ 0xe581ba, 0xe581bc, 0xe581bd, 0xe58281,
+ /* d0 */ 0xe58282, 0xe58283, 0xe58284, 0xe58286,
+ /* d4 */ 0xe58287, 0xe58289, 0xe5828a, 0xe5828b,
+ /* d8 */ 0xe5828c, 0xe5828e, 0xe5828f, 0xe58290,
+ /* dc */ 0xe58291, 0xe58292, 0xe58293, 0xe58294,
+ /* e0 */ 0xe58295, 0xe58296, 0xe58297, 0xe58298,
+ /* e4 */ 0xe58299, 0xe5829a, 0xe5829b, 0xe5829c,
+ /* e8 */ 0xe5829d, 0xe5829e, 0xe5829f, 0xe582a0,
+ /* ec */ 0xe582a1, 0xe582a2, 0xe582a4, 0xe582a6,
+ /* f0 */ 0xe582aa, 0xe582ab, 0xe582ad, 0xe582ae,
+ /* f4 */ 0xe582af, 0xe582b0, 0xe582b1, 0xe582b3,
+ /* f8 */ 0xe582b4, 0xe582b5, 0xe582b6, 0xe582b7,
+ /* fc */ 0xe582b8, 0xe582b9, 0xe582bc,
+
+ /*** Two byte table, leaf: 83xx - offset 0x002bc ***/
+
+ /* 40 */ 0xe582bd, 0xe582be, 0xe582bf, 0xe58380,
+ /* 44 */ 0xe58381, 0xe58382, 0xe58383, 0xe58384,
+ /* 48 */ 0xe58385, 0xe58386, 0xe58387, 0xe58388,
+ /* 4c */ 0xe58389, 0xe5838a, 0xe5838b, 0xe5838c,
+ /* 50 */ 0xe5838d, 0xe5838e, 0xe58390, 0xe58391,
+ /* 54 */ 0xe58392, 0xe58393, 0xe58394, 0xe58395,
+ /* 58 */ 0xe58397, 0xe58398, 0xe58399, 0xe5839b,
+ /* 5c */ 0xe5839c, 0xe5839d, 0xe5839e, 0xe5839f,
+ /* 60 */ 0xe583a0, 0xe583a1, 0xe583a2, 0xe583a3,
+ /* 64 */ 0xe583a4, 0xe583a5, 0xe583a8, 0xe583a9,
+ /* 68 */ 0xe583aa, 0xe583ab, 0xe583af, 0xe583b0,
+ /* 6c */ 0xe583b1, 0xe583b2, 0xe583b4, 0xe583b6,
+ /* 70 */ 0xe583b7, 0xe583b8, 0xe583b9, 0xe583ba,
+ /* 74 */ 0xe583bc, 0xe583bd, 0xe583be, 0xe583bf,
+ /* 78 */ 0xe58480, 0xe58481, 0xe58482, 0xe58483,
+ /* 7c */ 0xe58484, 0xe58485, 0xe58488, 0x000000,
+ /* 80 */ 0xe58489, 0xe5848a, 0xe5848c, 0xe5848d,
+ /* 84 */ 0xe5848e, 0xe5848f, 0xe58490, 0xe58491,
+ /* 88 */ 0xe58493, 0xe58494, 0xe58495, 0xe58496,
+ /* 8c */ 0xe58497, 0xe58498, 0xe58499, 0xe5849a,
+ /* 90 */ 0xe5849b, 0xe5849c, 0xe5849d, 0xe5849e,
+ /* 94 */ 0xe5849f, 0xe584a0, 0xe584a2, 0xe584a3,
+ /* 98 */ 0xe584a4, 0xe584a5, 0xe584a6, 0xe584a7,
+ /* 9c */ 0xe584a8, 0xe584a9, 0xe584aa, 0xe584ab,
+ /* a0 */ 0xe584ac, 0xe584ad, 0xe584ae, 0xe584af,
+ /* a4 */ 0xe584b0, 0xe584b1, 0xe584b2, 0xe584b3,
+ /* a8 */ 0xe584b4, 0xe584b5, 0xe584b6, 0xe584b7,
+ /* ac */ 0xe584b8, 0xe584b9, 0xe584ba, 0xe584bb,
+ /* b0 */ 0xe584bc, 0xe584bd, 0xe584be, 0xe58582,
+ /* b4 */ 0xe58587, 0xe5858a, 0xe5858c, 0xe5858e,
+ /* b8 */ 0xe5858f, 0xe58590, 0xe58592, 0xe58593,
+ /* bc */ 0xe58597, 0xe58598, 0xe58599, 0xe5859b,
+ /* c0 */ 0xe5859d, 0xe5859e, 0xe5859f, 0xe585a0,
+ /* c4 */ 0xe585a1, 0xe585a3, 0xe585a4, 0xe585a6,
+ /* c8 */ 0xe585a7, 0xe585a9, 0xe585aa, 0xe585af,
+ /* cc */ 0xe585b2, 0xe585ba, 0xe585be, 0xe585bf,
+ /* d0 */ 0xe58683, 0xe58684, 0xe58686, 0xe58687,
+ /* d4 */ 0xe5868a, 0xe5868b, 0xe5868e, 0xe5868f,
+ /* d8 */ 0xe58690, 0xe58691, 0xe58693, 0xe58694,
+ /* dc */ 0xe58698, 0xe5869a, 0xe5869d, 0xe5869e,
+ /* e0 */ 0xe5869f, 0xe586a1, 0xe586a3, 0xe586a6,
+ /* e4 */ 0xe586a7, 0xe586a8, 0xe586a9, 0xe586aa,
+ /* e8 */ 0xe586ad, 0xe586ae, 0xe586b4, 0xe586b8,
+ /* ec */ 0xe586b9, 0xe586ba, 0xe586be, 0xe586bf,
+ /* f0 */ 0xe58781, 0xe58782, 0xe58783, 0xe58785,
+ /* f4 */ 0xe58788, 0xe5878a, 0xe5878d, 0xe5878e,
+ /* f8 */ 0xe58790, 0xe58792, 0xe58793, 0xe58794,
+ /* fc */ 0xe58795, 0xe58796, 0xe58797,
+
+ /*** Two byte table, leaf: 84xx - offset 0x0037b ***/
+
+ /* 40 */ 0xe58798, 0xe58799, 0xe5879a, 0xe5879c,
+ /* 44 */ 0xe5879e, 0xe5879f, 0xe587a2, 0xe587a3,
+ /* 48 */ 0xe587a5, 0xe587a6, 0xe587a7, 0xe587a8,
+ /* 4c */ 0xe587a9, 0xe587aa, 0xe587ac, 0xe587ae,
+ /* 50 */ 0xe587b1, 0xe587b2, 0xe587b4, 0xe587b7,
+ /* 54 */ 0xe587be, 0xe58884, 0xe58885, 0xe58889,
+ /* 58 */ 0xe5888b, 0xe5888c, 0xe5888f, 0xe58890,
+ /* 5c */ 0xe58893, 0xe58894, 0xe58895, 0xe5889c,
+ /* 60 */ 0xe5889e, 0xe5889f, 0xe588a1, 0xe588a2,
+ /* 64 */ 0xe588a3, 0xe588a5, 0xe588a6, 0xe588a7,
+ /* 68 */ 0xe588aa, 0xe588ac, 0xe588af, 0xe588b1,
+ /* 6c */ 0xe588b2, 0xe588b4, 0xe588b5, 0xe588bc,
+ /* 70 */ 0xe588be, 0xe58984, 0xe58985, 0xe58986,
+ /* 74 */ 0xe58987, 0xe58988, 0xe58989, 0xe5898b,
+ /* 78 */ 0xe5898e, 0xe5898f, 0xe58992, 0xe58993,
+ /* 7c */ 0xe58995, 0xe58997, 0xe58998, 0x000000,
+ /* 80 */ 0xe58999, 0xe5899a, 0xe5899b, 0xe5899d,
+ /* 84 */ 0xe5899f, 0xe589a0, 0xe589a2, 0xe589a3,
+ /* 88 */ 0xe589a4, 0xe589a6, 0xe589a8, 0xe589ab,
+ /* 8c */ 0xe589ac, 0xe589ad, 0xe589ae, 0xe589b0,
+ /* 90 */ 0xe589b1, 0xe589b3, 0xe589b4, 0xe589b5,
+ /* 94 */ 0xe589b6, 0xe589b7, 0xe589b8, 0xe589b9,
+ /* 98 */ 0xe589ba, 0xe589bb, 0xe589bc, 0xe589be,
+ /* 9c */ 0xe58a80, 0xe58a83, 0xe58a84, 0xe58a85,
+ /* a0 */ 0xe58a86, 0xe58a87, 0xe58a89, 0xe58a8a,
+ /* a4 */ 0xe58a8b, 0xe58a8c, 0xe58a8d, 0xe58a8e,
+ /* a8 */ 0xe58a8f, 0xe58a91, 0xe58a92, 0xe58a94,
+ /* ac */ 0xe58a95, 0xe58a96, 0xe58a97, 0xe58a98,
+ /* b0 */ 0xe58a99, 0xe58a9a, 0xe58a9c, 0xe58aa4,
+ /* b4 */ 0xe58aa5, 0xe58aa6, 0xe58aa7, 0xe58aae,
+ /* b8 */ 0xe58aaf, 0xe58ab0, 0xe58ab4, 0xe58ab5,
+ /* bc */ 0xe58ab6, 0xe58ab7, 0xe58ab8, 0xe58ab9,
+ /* c0 */ 0xe58aba, 0xe58abb, 0xe58abc, 0xe58abd,
+ /* c4 */ 0xe58b80, 0xe58b81, 0xe58b82, 0xe58b84,
+ /* c8 */ 0xe58b85, 0xe58b86, 0xe58b88, 0xe58b8a,
+ /* cc */ 0xe58b8c, 0xe58b8d, 0xe58b8e, 0xe58b8f,
+ /* d0 */ 0xe58b91, 0xe58b93, 0xe58b94, 0xe58b95,
+ /* d4 */ 0xe58b97, 0xe58b99, 0xe58b9a, 0xe58b9b,
+ /* d8 */ 0xe58b9c, 0xe58b9d, 0xe58b9e, 0xe58ba0,
+ /* dc */ 0xe58ba1, 0xe58ba2, 0xe58ba3, 0xe58ba5,
+ /* e0 */ 0xe58ba6, 0xe58ba7, 0xe58ba8, 0xe58ba9,
+ /* e4 */ 0xe58baa, 0xe58bab, 0xe58bac, 0xe58bad,
+ /* e8 */ 0xe58bae, 0xe58baf, 0xe58bb1, 0xe58bb2,
+ /* ec */ 0xe58bb3, 0xe58bb4, 0xe58bb5, 0xe58bb6,
+ /* f0 */ 0xe58bb7, 0xe58bb8, 0xe58bbb, 0xe58bbc,
+ /* f4 */ 0xe58bbd, 0xe58c81, 0xe58c82, 0xe58c83,
+ /* f8 */ 0xe58c84, 0xe58c87, 0xe58c89, 0xe58c8a,
+ /* fc */ 0xe58c8b, 0xe58c8c, 0xe58c8e,
+
+ /*** Two byte table, leaf: 85xx - offset 0x0043a ***/
+
+ /* 40 */ 0xe58c91, 0xe58c92, 0xe58c93, 0xe58c94,
+ /* 44 */ 0xe58c98, 0xe58c9b, 0xe58c9c, 0xe58c9e,
+ /* 48 */ 0xe58c9f, 0xe58ca2, 0xe58ca4, 0xe58ca5,
+ /* 4c */ 0xe58ca7, 0xe58ca8, 0xe58ca9, 0xe58cab,
+ /* 50 */ 0xe58cac, 0xe58cad, 0xe58caf, 0xe58cb0,
+ /* 54 */ 0xe58cb1, 0xe58cb2, 0xe58cb3, 0xe58cb4,
+ /* 58 */ 0xe58cb5, 0xe58cb6, 0xe58cb7, 0xe58cb8,
+ /* 5c */ 0xe58cbc, 0xe58cbd, 0xe58d80, 0xe58d82,
+ /* 60 */ 0xe58d84, 0xe58d86, 0xe58d8b, 0xe58d8c,
+ /* 64 */ 0xe58d8d, 0xe58d90, 0xe58d94, 0xe58d98,
+ /* 68 */ 0xe58d99, 0xe58d9b, 0xe58d9d, 0xe58da5,
+ /* 6c */ 0xe58da8, 0xe58daa, 0xe58dac, 0xe58dad,
+ /* 70 */ 0xe58db2, 0xe58db6, 0xe58db9, 0xe58dbb,
+ /* 74 */ 0xe58dbc, 0xe58dbd, 0xe58dbe, 0xe58e80,
+ /* 78 */ 0xe58e81, 0xe58e83, 0xe58e87, 0xe58e88,
+ /* 7c */ 0xe58e8a, 0xe58e8e, 0xe58e8f, 0x000000,
+ /* 80 */ 0xe58e90, 0xe58e91, 0xe58e92, 0xe58e93,
+ /* 84 */ 0xe58e94, 0xe58e96, 0xe58e97, 0xe58e99,
+ /* 88 */ 0xe58e9b, 0xe58e9c, 0xe58e9e, 0xe58ea0,
+ /* 8c */ 0xe58ea1, 0xe58ea4, 0xe58ea7, 0xe58eaa,
+ /* 90 */ 0xe58eab, 0xe58eac, 0xe58ead, 0xe58eaf,
+ /* 94 */ 0xe58eb0, 0xe58eb1, 0xe58eb2, 0xe58eb3,
+ /* 98 */ 0xe58eb4, 0xe58eb5, 0xe58eb7, 0xe58eb8,
+ /* 9c */ 0xe58eb9, 0xe58eba, 0xe58ebc, 0xe58ebd,
+ /* a0 */ 0xe58ebe, 0xe58f80, 0xe58f83, 0xe58f84,
+ /* a4 */ 0xe58f85, 0xe58f86, 0xe58f87, 0xe58f8e,
+ /* a8 */ 0xe58f8f, 0xe58f90, 0xe58f92, 0xe58f93,
+ /* ac */ 0xe58f95, 0xe58f9a, 0xe58f9c, 0xe58f9d,
+ /* b0 */ 0xe58f9e, 0xe58fa1, 0xe58fa2, 0xe58fa7,
+ /* b4 */ 0xe58fb4, 0xe58fba, 0xe58fbe, 0xe58fbf,
+ /* b8 */ 0xe59080, 0xe59082, 0xe59085, 0xe59087,
+ /* bc */ 0xe5908b, 0xe59094, 0xe59098, 0xe59099,
+ /* c0 */ 0xe5909a, 0xe5909c, 0xe590a2, 0xe590a4,
+ /* c4 */ 0xe590a5, 0xe590aa, 0xe590b0, 0xe590b3,
+ /* c8 */ 0xe590b6, 0xe590b7, 0xe590ba, 0xe590bd,
+ /* cc */ 0xe590bf, 0xe59181, 0xe59182, 0xe59184,
+ /* d0 */ 0xe59185, 0xe59187, 0xe59189, 0xe5918c,
+ /* d4 */ 0xe5918d, 0xe5918e, 0xe5918f, 0xe59191,
+ /* d8 */ 0xe5919a, 0xe5919d, 0xe5919e, 0xe5919f,
+ /* dc */ 0xe591a0, 0xe591a1, 0xe591a3, 0xe591a5,
+ /* e0 */ 0xe591a7, 0xe591a9, 0xe591aa, 0xe591ab,
+ /* e4 */ 0xe591ac, 0xe591ad, 0xe591ae, 0xe591af,
+ /* e8 */ 0xe591b0, 0xe591b4, 0xe591b9, 0xe591ba,
+ /* ec */ 0xe591be, 0xe591bf, 0xe59281, 0xe59283,
+ /* f0 */ 0xe59285, 0xe59287, 0xe59288, 0xe59289,
+ /* f4 */ 0xe5928a, 0xe5928d, 0xe59291, 0xe59293,
+ /* f8 */ 0xe59297, 0xe59298, 0xe5929c, 0xe5929e,
+ /* fc */ 0xe5929f, 0xe592a0, 0xe592a1,
+
+ /*** Two byte table, leaf: 86xx - offset 0x004f9 ***/
+
+ /* 40 */ 0xe592a2, 0xe592a5, 0xe592ae, 0xe592b0,
+ /* 44 */ 0xe592b2, 0xe592b5, 0xe592b6, 0xe592b7,
+ /* 48 */ 0xe592b9, 0xe592ba, 0xe592bc, 0xe592be,
+ /* 4c */ 0xe59383, 0xe59385, 0xe5938a, 0xe5938b,
+ /* 50 */ 0xe59396, 0xe59398, 0xe5939b, 0xe593a0,
+ /* 54 */ 0xe593a1, 0xe593a2, 0xe593a3, 0xe593a4,
+ /* 58 */ 0xe593ab, 0xe593ac, 0xe593af, 0xe593b0,
+ /* 5c */ 0xe593b1, 0xe593b4, 0xe593b5, 0xe593b6,
+ /* 60 */ 0xe593b7, 0xe593b8, 0xe593b9, 0xe593bb,
+ /* 64 */ 0xe593be, 0xe59480, 0xe59482, 0xe59483,
+ /* 68 */ 0xe59484, 0xe59485, 0xe59488, 0xe5948a,
+ /* 6c */ 0xe5948b, 0xe5948c, 0xe5948d, 0xe5948e,
+ /* 70 */ 0xe59492, 0xe59493, 0xe59495, 0xe59496,
+ /* 74 */ 0xe59497, 0xe59498, 0xe59499, 0xe5949a,
+ /* 78 */ 0xe5949c, 0xe5949d, 0xe5949e, 0xe5949f,
+ /* 7c */ 0xe594a1, 0xe594a5, 0xe594a6, 0x000000,
+ /* 80 */ 0xe594a8, 0xe594a9, 0xe594ab, 0xe594ad,
+ /* 84 */ 0xe594b2, 0xe594b4, 0xe594b5, 0xe594b6,
+ /* 88 */ 0xe594b8, 0xe594b9, 0xe594ba, 0xe594bb,
+ /* 8c */ 0xe594bd, 0xe59580, 0xe59582, 0xe59585,
+ /* 90 */ 0xe59587, 0xe59588, 0xe5958b, 0xe5958c,
+ /* 94 */ 0xe5958d, 0xe5958e, 0xe5958f, 0xe59591,
+ /* 98 */ 0xe59592, 0xe59593, 0xe59594, 0xe59597,
+ /* 9c */ 0xe59598, 0xe59599, 0xe5959a, 0xe5959b,
+ /* a0 */ 0xe5959d, 0xe5959e, 0xe5959f, 0xe595a0,
+ /* a4 */ 0xe595a2, 0xe595a3, 0xe595a8, 0xe595a9,
+ /* a8 */ 0xe595ab, 0xe595af, 0xe595b0, 0xe595b1,
+ /* ac */ 0xe595b2, 0xe595b3, 0xe595b4, 0xe595b9,
+ /* b0 */ 0xe595ba, 0xe595bd, 0xe595bf, 0xe59685,
+ /* b4 */ 0xe59686, 0xe5968c, 0xe5968d, 0xe5968e,
+ /* b8 */ 0xe59690, 0xe59692, 0xe59693, 0xe59695,
+ /* bc */ 0xe59696, 0xe59697, 0xe5969a, 0xe5969b,
+ /* c0 */ 0xe5969e, 0xe596a0, 0xe596a1, 0xe596a2,
+ /* c4 */ 0xe596a3, 0xe596a4, 0xe596a5, 0xe596a6,
+ /* c8 */ 0xe596a8, 0xe596a9, 0xe596aa, 0xe596ab,
+ /* cc */ 0xe596ac, 0xe596ad, 0xe596ae, 0xe596af,
+ /* d0 */ 0xe596b0, 0xe596b2, 0xe596b4, 0xe596b6,
+ /* d4 */ 0xe596b8, 0xe596ba, 0xe596bc, 0xe596bf,
+ /* d8 */ 0xe59780, 0xe59781, 0xe59782, 0xe59783,
+ /* dc */ 0xe59786, 0xe59787, 0xe59788, 0xe5978a,
+ /* e0 */ 0xe5978b, 0xe5978e, 0xe5978f, 0xe59790,
+ /* e4 */ 0xe59795, 0xe59797, 0xe59798, 0xe59799,
+ /* e8 */ 0xe5979a, 0xe5979b, 0xe5979e, 0xe597a0,
+ /* ec */ 0xe597a2, 0xe597a7, 0xe597a9, 0xe597ad,
+ /* f0 */ 0xe597ae, 0xe597b0, 0xe597b1, 0xe597b4,
+ /* f4 */ 0xe597b6, 0xe597b8, 0xe597b9, 0xe597ba,
+ /* f8 */ 0xe597bb, 0xe597bc, 0xe597bf, 0xe59882,
+ /* fc */ 0xe59883, 0xe59884, 0xe59885,
+
+ /*** Two byte table, leaf: 87xx - offset 0x005b8 ***/
+
+ /* 40 */ 0xe59886, 0xe59887, 0xe5988a, 0xe5988b,
+ /* 44 */ 0xe5988d, 0xe59890, 0xe59891, 0xe59892,
+ /* 48 */ 0xe59893, 0xe59894, 0xe59895, 0xe59896,
+ /* 4c */ 0xe59897, 0xe59899, 0xe5989a, 0xe5989c,
+ /* 50 */ 0xe5989d, 0xe598a0, 0xe598a1, 0xe598a2,
+ /* 54 */ 0xe598a5, 0xe598a6, 0xe598a8, 0xe598a9,
+ /* 58 */ 0xe598aa, 0xe598ab, 0xe598ae, 0xe598af,
+ /* 5c */ 0xe598b0, 0xe598b3, 0xe598b5, 0xe598b7,
+ /* 60 */ 0xe598b8, 0xe598ba, 0xe598bc, 0xe598bd,
+ /* 64 */ 0xe598be, 0xe59980, 0xe59981, 0xe59982,
+ /* 68 */ 0xe59983, 0xe59984, 0xe59985, 0xe59986,
+ /* 6c */ 0xe59987, 0xe59988, 0xe59989, 0xe5998a,
+ /* 70 */ 0xe5998b, 0xe5998f, 0xe59990, 0xe59991,
+ /* 74 */ 0xe59992, 0xe59993, 0xe59995, 0xe59996,
+ /* 78 */ 0xe5999a, 0xe5999b, 0xe5999d, 0xe5999e,
+ /* 7c */ 0xe5999f, 0xe599a0, 0xe599a1, 0x000000,
+ /* 80 */ 0xe599a3, 0xe599a5, 0xe599a6, 0xe599a7,
+ /* 84 */ 0xe599ad, 0xe599ae, 0xe599af, 0xe599b0,
+ /* 88 */ 0xe599b2, 0xe599b3, 0xe599b4, 0xe599b5,
+ /* 8c */ 0xe599b7, 0xe599b8, 0xe599b9, 0xe599ba,
+ /* 90 */ 0xe599bd, 0xe599be, 0xe599bf, 0xe59a80,
+ /* 94 */ 0xe59a81, 0xe59a82, 0xe59a83, 0xe59a84,
+ /* 98 */ 0xe59a87, 0xe59a88, 0xe59a89, 0xe59a8a,
+ /* 9c */ 0xe59a8b, 0xe59a8c, 0xe59a8d, 0xe59a90,
+ /* a0 */ 0xe59a91, 0xe59a92, 0xe59a94, 0xe59a95,
+ /* a4 */ 0xe59a96, 0xe59a97, 0xe59a98, 0xe59a99,
+ /* a8 */ 0xe59a9a, 0xe59a9b, 0xe59a9c, 0xe59a9d,
+ /* ac */ 0xe59a9e, 0xe59a9f, 0xe59aa0, 0xe59aa1,
+ /* b0 */ 0xe59aa2, 0xe59aa4, 0xe59aa5, 0xe59aa6,
+ /* b4 */ 0xe59aa7, 0xe59aa8, 0xe59aa9, 0xe59aaa,
+ /* b8 */ 0xe59aab, 0xe59aac, 0xe59aad, 0xe59aae,
+ /* bc */ 0xe59ab0, 0xe59ab1, 0xe59ab2, 0xe59ab3,
+ /* c0 */ 0xe59ab4, 0xe59ab5, 0xe59ab6, 0xe59ab8,
+ /* c4 */ 0xe59ab9, 0xe59aba, 0xe59abb, 0xe59abd,
+ /* c8 */ 0xe59abe, 0xe59abf, 0xe59b80, 0xe59b81,
+ /* cc */ 0xe59b82, 0xe59b83, 0xe59b84, 0xe59b85,
+ /* d0 */ 0xe59b86, 0xe59b87, 0xe59b88, 0xe59b89,
+ /* d4 */ 0xe59b8b, 0xe59b8c, 0xe59b8d, 0xe59b8e,
+ /* d8 */ 0xe59b8f, 0xe59b90, 0xe59b91, 0xe59b92,
+ /* dc */ 0xe59b93, 0xe59b95, 0xe59b96, 0xe59b98,
+ /* e0 */ 0xe59b99, 0xe59b9c, 0xe59ba3, 0xe59ba5,
+ /* e4 */ 0xe59ba6, 0xe59ba7, 0xe59ba8, 0xe59ba9,
+ /* e8 */ 0xe59baa, 0xe59bac, 0xe59bae, 0xe59baf,
+ /* ec */ 0xe59bb2, 0xe59bb3, 0xe59bb6, 0xe59bb7,
+ /* f0 */ 0xe59bb8, 0xe59bbb, 0xe59bbc, 0xe59c80,
+ /* f4 */ 0xe59c81, 0xe59c82, 0xe59c85, 0xe59c87,
+ /* f8 */ 0xe59c8b, 0xe59c8c, 0xe59c8d, 0xe59c8e,
+ /* fc */ 0xe59c8f, 0xe59c90, 0xe59c91,
+
+ /*** Two byte table, leaf: 88xx - offset 0x00677 ***/
+
+ /* 40 */ 0xe59c92, 0xe59c93, 0xe59c94, 0xe59c95,
+ /* 44 */ 0xe59c96, 0xe59c97, 0xe59c98, 0xe59c99,
+ /* 48 */ 0xe59c9a, 0xe59c9b, 0xe59c9d, 0xe59c9e,
+ /* 4c */ 0xe59ca0, 0xe59ca1, 0xe59ca2, 0xe59ca4,
+ /* 50 */ 0xe59ca5, 0xe59ca6, 0xe59ca7, 0xe59cab,
+ /* 54 */ 0xe59cb1, 0xe59cb2, 0xe59cb4, 0xe59cb5,
+ /* 58 */ 0xe59cb6, 0xe59cb7, 0xe59cb8, 0xe59cbc,
+ /* 5c */ 0xe59cbd, 0xe59cbf, 0xe59d81, 0xe59d83,
+ /* 60 */ 0xe59d84, 0xe59d85, 0xe59d86, 0xe59d88,
+ /* 64 */ 0xe59d89, 0xe59d8b, 0xe59d92, 0xe59d93,
+ /* 68 */ 0xe59d94, 0xe59d95, 0xe59d96, 0xe59d98,
+ /* 6c */ 0xe59d99, 0xe59da2, 0xe59da3, 0xe59da5,
+ /* 70 */ 0xe59da7, 0xe59dac, 0xe59dae, 0xe59db0,
+ /* 74 */ 0xe59db1, 0xe59db2, 0xe59db4, 0xe59db5,
+ /* 78 */ 0xe59db8, 0xe59db9, 0xe59dba, 0xe59dbd,
+ /* 7c */ 0xe59dbe, 0xe59dbf, 0xe59e80, 0x000000,
+ /* 80 */ 0xe59e81, 0xe59e87, 0xe59e88, 0xe59e89,
+ /* 84 */ 0xe59e8a, 0xe59e8d, 0xe59e8e, 0xe59e8f,
+ /* 88 */ 0xe59e90, 0xe59e91, 0xe59e94, 0xe59e95,
+ /* 8c */ 0xe59e96, 0xe59e97, 0xe59e98, 0xe59e99,
+ /* 90 */ 0xe59e9a, 0xe59e9c, 0xe59e9d, 0xe59e9e,
+ /* 94 */ 0xe59e9f, 0xe59ea5, 0xe59ea8, 0xe59eaa,
+ /* 98 */ 0xe59eac, 0xe59eaf, 0xe59eb0, 0xe59eb1,
+ /* 9c */ 0xe59eb3, 0xe59eb5, 0xe59eb6, 0xe59eb7,
+ /* a0 */ 0xe59eb9, 0xe59eba, 0xe59ebb, 0xe59ebc,
+ /* a4 */ 0xe59ebd, 0xe59ebe, 0xe59ebf, 0xe59f80,
+ /* a8 */ 0xe59f81, 0xe59f84, 0xe59f85, 0xe59f86,
+ /* ac */ 0xe59f87, 0xe59f88, 0xe59f89, 0xe59f8a,
+ /* b0 */ 0xe59f8c, 0xe59f8d, 0xe59f90, 0xe59f91,
+ /* b4 */ 0xe59f93, 0xe59f96, 0xe59f97, 0xe59f9b,
+ /* b8 */ 0xe59f9c, 0xe59f9e, 0xe59fa1, 0xe59fa2,
+ /* bc */ 0xe59fa3, 0xe59fa5, 0xe59fa6, 0xe59fa7,
+ /* c0 */ 0xe59fa8, 0xe59fa9, 0xe59faa, 0xe59fab,
+ /* c4 */ 0xe59fac, 0xe59fae, 0xe59fb0, 0xe59fb1,
+ /* c8 */ 0xe59fb2, 0xe59fb3, 0xe59fb5, 0xe59fb6,
+ /* cc */ 0xe59fb7, 0xe59fbb, 0xe59fbc, 0xe59fbe,
+ /* d0 */ 0xe59fbf, 0xe5a081, 0xe5a083, 0xe5a084,
+ /* d4 */ 0xe5a085, 0xe5a088, 0xe5a089, 0xe5a08a,
+ /* d8 */ 0xe5a08c, 0xe5a08e, 0xe5a08f, 0xe5a090,
+ /* dc */ 0xe5a092, 0xe5a093, 0xe5a094, 0xe5a096,
+ /* e0 */ 0xe5a097, 0xe5a098, 0xe5a09a, 0xe5a09b,
+ /* e4 */ 0xe5a09c, 0xe5a09d, 0xe5a09f, 0xe5a0a2,
+ /* e8 */ 0xe5a0a3, 0xe5a0a5, 0xe5a0a6, 0xe5a0a7,
+ /* ec */ 0xe5a0a8, 0xe5a0a9, 0xe5a0ab, 0xe5a0ac,
+ /* f0 */ 0xe5a0ad, 0xe5a0ae, 0xe5a0af, 0xe5a0b1,
+ /* f4 */ 0xe5a0b2, 0xe5a0b3, 0xe5a0b4, 0xe5a0b6,
+ /* f8 */ 0xe5a0b7, 0xe5a0b8, 0xe5a0b9, 0xe5a0ba,
+ /* fc */ 0xe5a0bb, 0xe5a0bc, 0xe5a0bd,
+
+ /*** Two byte table, leaf: 89xx - offset 0x00736 ***/
+
+ /* 40 */ 0xe5a0be, 0xe5a0bf, 0xe5a180, 0xe5a181,
+ /* 44 */ 0xe5a182, 0xe5a183, 0xe5a185, 0xe5a186,
+ /* 48 */ 0xe5a187, 0xe5a188, 0xe5a189, 0xe5a18a,
+ /* 4c */ 0xe5a18b, 0xe5a18e, 0xe5a18f, 0xe5a190,
+ /* 50 */ 0xe5a192, 0xe5a193, 0xe5a195, 0xe5a196,
+ /* 54 */ 0xe5a197, 0xe5a199, 0xe5a19a, 0xe5a19b,
+ /* 58 */ 0xe5a19c, 0xe5a19d, 0xe5a19f, 0xe5a1a0,
+ /* 5c */ 0xe5a1a1, 0xe5a1a2, 0xe5a1a3, 0xe5a1a4,
+ /* 60 */ 0xe5a1a6, 0xe5a1a7, 0xe5a1a8, 0xe5a1a9,
+ /* 64 */ 0xe5a1aa, 0xe5a1ad, 0xe5a1ae, 0xe5a1af,
+ /* 68 */ 0xe5a1b0, 0xe5a1b1, 0xe5a1b2, 0xe5a1b3,
+ /* 6c */ 0xe5a1b4, 0xe5a1b5, 0xe5a1b6, 0xe5a1b7,
+ /* 70 */ 0xe5a1b8, 0xe5a1b9, 0xe5a1ba, 0xe5a1bb,
+ /* 74 */ 0xe5a1bc, 0xe5a1bd, 0xe5a1bf, 0xe5a282,
+ /* 78 */ 0xe5a284, 0xe5a286, 0xe5a287, 0xe5a288,
+ /* 7c */ 0xe5a28a, 0xe5a28b, 0xe5a28c, 0x000000,
+ /* 80 */ 0xe5a28d, 0xe5a28e, 0xe5a28f, 0xe5a290,
+ /* 84 */ 0xe5a291, 0xe5a294, 0xe5a295, 0xe5a296,
+ /* 88 */ 0xe5a297, 0xe5a298, 0xe5a29b, 0xe5a29c,
+ /* 8c */ 0xe5a29d, 0xe5a2a0, 0xe5a2a1, 0xe5a2a2,
+ /* 90 */ 0xe5a2a3, 0xe5a2a4, 0xe5a2a5, 0xe5a2a6,
+ /* 94 */ 0xe5a2a7, 0xe5a2aa, 0xe5a2ab, 0xe5a2ac,
+ /* 98 */ 0xe5a2ad, 0xe5a2ae, 0xe5a2af, 0xe5a2b0,
+ /* 9c */ 0xe5a2b1, 0xe5a2b2, 0xe5a2b3, 0xe5a2b4,
+ /* a0 */ 0xe5a2b5, 0xe5a2b6, 0xe5a2b7, 0xe5a2b8,
+ /* a4 */ 0xe5a2b9, 0xe5a2ba, 0xe5a2bb, 0xe5a2bd,
+ /* a8 */ 0xe5a2be, 0xe5a2bf, 0xe5a380, 0xe5a382,
+ /* ac */ 0xe5a383, 0xe5a384, 0xe5a386, 0xe5a387,
+ /* b0 */ 0xe5a388, 0xe5a389, 0xe5a38a, 0xe5a38b,
+ /* b4 */ 0xe5a38c, 0xe5a38d, 0xe5a38e, 0xe5a38f,
+ /* b8 */ 0xe5a390, 0xe5a392, 0xe5a393, 0xe5a394,
+ /* bc */ 0xe5a396, 0xe5a397, 0xe5a398, 0xe5a399,
+ /* c0 */ 0xe5a39a, 0xe5a39b, 0xe5a39c, 0xe5a39d,
+ /* c4 */ 0xe5a39e, 0xe5a39f, 0xe5a3a0, 0xe5a3a1,
+ /* c8 */ 0xe5a3a2, 0xe5a3a3, 0xe5a3a5, 0xe5a3a6,
+ /* cc */ 0xe5a3a7, 0xe5a3a8, 0xe5a3a9, 0xe5a3aa,
+ /* d0 */ 0xe5a3ad, 0xe5a3af, 0xe5a3b1, 0xe5a3b2,
+ /* d4 */ 0xe5a3b4, 0xe5a3b5, 0xe5a3b7, 0xe5a3b8,
+ /* d8 */ 0xe5a3ba, 0xe5a3bb, 0xe5a3bc, 0xe5a3bd,
+ /* dc */ 0xe5a3be, 0xe5a3bf, 0xe5a480, 0xe5a481,
+ /* e0 */ 0xe5a483, 0xe5a485, 0xe5a486, 0xe5a488,
+ /* e4 */ 0xe5a489, 0xe5a48a, 0xe5a48b, 0xe5a48c,
+ /* e8 */ 0xe5a48e, 0xe5a490, 0xe5a491, 0xe5a492,
+ /* ec */ 0xe5a493, 0xe5a497, 0xe5a498, 0xe5a49b,
+ /* f0 */ 0xe5a49d, 0xe5a49e, 0xe5a4a0, 0xe5a4a1,
+ /* f4 */ 0xe5a4a2, 0xe5a4a3, 0xe5a4a6, 0xe5a4a8,
+ /* f8 */ 0xe5a4ac, 0xe5a4b0, 0xe5a4b2, 0xe5a4b3,
+ /* fc */ 0xe5a4b5, 0xe5a4b6, 0xe5a4bb,
+
+ /*** Two byte table, leaf: 8axx - offset 0x007f5 ***/
+
+ /* 40 */ 0xe5a4bd, 0xe5a4be, 0xe5a4bf, 0xe5a580,
+ /* 44 */ 0xe5a583, 0xe5a585, 0xe5a586, 0xe5a58a,
+ /* 48 */ 0xe5a58c, 0xe5a58d, 0xe5a590, 0xe5a592,
+ /* 4c */ 0xe5a593, 0xe5a599, 0xe5a59b, 0xe5a59c,
+ /* 50 */ 0xe5a59d, 0xe5a59e, 0xe5a59f, 0xe5a5a1,
+ /* 54 */ 0xe5a5a3, 0xe5a5a4, 0xe5a5a6, 0xe5a5a7,
+ /* 58 */ 0xe5a5a8, 0xe5a5a9, 0xe5a5aa, 0xe5a5ab,
+ /* 5c */ 0xe5a5ac, 0xe5a5ad, 0xe5a5ae, 0xe5a5af,
+ /* 60 */ 0xe5a5b0, 0xe5a5b1, 0xe5a5b2, 0xe5a5b5,
+ /* 64 */ 0xe5a5b7, 0xe5a5ba, 0xe5a5bb, 0xe5a5bc,
+ /* 68 */ 0xe5a5be, 0xe5a5bf, 0xe5a680, 0xe5a685,
+ /* 6c */ 0xe5a689, 0xe5a68b, 0xe5a68c, 0xe5a68e,
+ /* 70 */ 0xe5a68f, 0xe5a690, 0xe5a691, 0xe5a694,
+ /* 74 */ 0xe5a695, 0xe5a698, 0xe5a69a, 0xe5a69b,
+ /* 78 */ 0xe5a69c, 0xe5a69d, 0xe5a69f, 0xe5a6a0,
+ /* 7c */ 0xe5a6a1, 0xe5a6a2, 0xe5a6a6, 0x000000,
+ /* 80 */ 0xe5a6a7, 0xe5a6ac, 0xe5a6ad, 0xe5a6b0,
+ /* 84 */ 0xe5a6b1, 0xe5a6b3, 0xe5a6b4, 0xe5a6b5,
+ /* 88 */ 0xe5a6b6, 0xe5a6b7, 0xe5a6b8, 0xe5a6ba,
+ /* 8c */ 0xe5a6bc, 0xe5a6bd, 0xe5a6bf, 0xe5a780,
+ /* 90 */ 0xe5a781, 0xe5a782, 0xe5a783, 0xe5a784,
+ /* 94 */ 0xe5a785, 0xe5a787, 0xe5a788, 0xe5a789,
+ /* 98 */ 0xe5a78c, 0xe5a78d, 0xe5a78e, 0xe5a78f,
+ /* 9c */ 0xe5a795, 0xe5a796, 0xe5a799, 0xe5a79b,
+ /* a0 */ 0xe5a79e, 0xe5a79f, 0xe5a7a0, 0xe5a7a1,
+ /* a4 */ 0xe5a7a2, 0xe5a7a4, 0xe5a7a6, 0xe5a7a7,
+ /* a8 */ 0xe5a7a9, 0xe5a7aa, 0xe5a7ab, 0xe5a7ad,
+ /* ac */ 0xe5a7ae, 0xe5a7af, 0xe5a7b0, 0xe5a7b1,
+ /* b0 */ 0xe5a7b2, 0xe5a7b3, 0xe5a7b4, 0xe5a7b5,
+ /* b4 */ 0xe5a7b6, 0xe5a7b7, 0xe5a7b8, 0xe5a7ba,
+ /* b8 */ 0xe5a7bc, 0xe5a7bd, 0xe5a7be, 0xe5a880,
+ /* bc */ 0xe5a882, 0xe5a88a, 0xe5a88b, 0xe5a88d,
+ /* c0 */ 0xe5a88e, 0xe5a88f, 0xe5a890, 0xe5a892,
+ /* c4 */ 0xe5a894, 0xe5a895, 0xe5a896, 0xe5a897,
+ /* c8 */ 0xe5a899, 0xe5a89a, 0xe5a89b, 0xe5a89d,
+ /* cc */ 0xe5a89e, 0xe5a8a1, 0xe5a8a2, 0xe5a8a4,
+ /* d0 */ 0xe5a8a6, 0xe5a8a7, 0xe5a8a8, 0xe5a8aa,
+ /* d4 */ 0xe5a8ab, 0xe5a8ac, 0xe5a8ad, 0xe5a8ae,
+ /* d8 */ 0xe5a8af, 0xe5a8b0, 0xe5a8b3, 0xe5a8b5,
+ /* dc */ 0xe5a8b7, 0xe5a8b8, 0xe5a8b9, 0xe5a8ba,
+ /* e0 */ 0xe5a8bb, 0xe5a8bd, 0xe5a8be, 0xe5a8bf,
+ /* e4 */ 0xe5a981, 0xe5a982, 0xe5a983, 0xe5a984,
+ /* e8 */ 0xe5a985, 0xe5a987, 0xe5a988, 0xe5a98b,
+ /* ec */ 0xe5a98c, 0xe5a98d, 0xe5a98e, 0xe5a98f,
+ /* f0 */ 0xe5a990, 0xe5a991, 0xe5a992, 0xe5a993,
+ /* f4 */ 0xe5a994, 0xe5a996, 0xe5a997, 0xe5a998,
+ /* f8 */ 0xe5a999, 0xe5a99b, 0xe5a99c, 0xe5a99d,
+ /* fc */ 0xe5a99e, 0xe5a99f, 0xe5a9a0,
+
+ /*** Two byte table, leaf: 8bxx - offset 0x008b4 ***/
+
+ /* 40 */ 0xe5a9a1, 0xe5a9a3, 0xe5a9a4, 0xe5a9a5,
+ /* 44 */ 0xe5a9a6, 0xe5a9a8, 0xe5a9a9, 0xe5a9ab,
+ /* 48 */ 0xe5a9ac, 0xe5a9ad, 0xe5a9ae, 0xe5a9af,
+ /* 4c */ 0xe5a9b0, 0xe5a9b1, 0xe5a9b2, 0xe5a9b3,
+ /* 50 */ 0xe5a9b8, 0xe5a9b9, 0xe5a9bb, 0xe5a9bc,
+ /* 54 */ 0xe5a9bd, 0xe5a9be, 0xe5aa80, 0xe5aa81,
+ /* 58 */ 0xe5aa82, 0xe5aa83, 0xe5aa84, 0xe5aa85,
+ /* 5c */ 0xe5aa86, 0xe5aa87, 0xe5aa88, 0xe5aa89,
+ /* 60 */ 0xe5aa8a, 0xe5aa8b, 0xe5aa8c, 0xe5aa8d,
+ /* 64 */ 0xe5aa8e, 0xe5aa8f, 0xe5aa90, 0xe5aa91,
+ /* 68 */ 0xe5aa93, 0xe5aa94, 0xe5aa95, 0xe5aa96,
+ /* 6c */ 0xe5aa97, 0xe5aa98, 0xe5aa99, 0xe5aa9c,
+ /* 70 */ 0xe5aa9d, 0xe5aa9e, 0xe5aa9f, 0xe5aaa0,
+ /* 74 */ 0xe5aaa1, 0xe5aaa2, 0xe5aaa3, 0xe5aaa4,
+ /* 78 */ 0xe5aaa5, 0xe5aaa6, 0xe5aaa7, 0xe5aaa8,
+ /* 7c */ 0xe5aaa9, 0xe5aaab, 0xe5aaac, 0x000000,
+ /* 80 */ 0xe5aaad, 0xe5aaae, 0xe5aaaf, 0xe5aab0,
+ /* 84 */ 0xe5aab1, 0xe5aab4, 0xe5aab6, 0xe5aab7,
+ /* 88 */ 0xe5aab9, 0xe5aaba, 0xe5aabb, 0xe5aabc,
+ /* 8c */ 0xe5aabd, 0xe5aabf, 0xe5ab80, 0xe5ab83,
+ /* 90 */ 0xe5ab84, 0xe5ab85, 0xe5ab86, 0xe5ab87,
+ /* 94 */ 0xe5ab88, 0xe5ab8a, 0xe5ab8b, 0xe5ab8d,
+ /* 98 */ 0xe5ab8e, 0xe5ab8f, 0xe5ab90, 0xe5ab91,
+ /* 9c */ 0xe5ab93, 0xe5ab95, 0xe5ab97, 0xe5ab99,
+ /* a0 */ 0xe5ab9a, 0xe5ab9b, 0xe5ab9d, 0xe5ab9e,
+ /* a4 */ 0xe5ab9f, 0xe5aba2, 0xe5aba4, 0xe5aba5,
+ /* a8 */ 0xe5aba7, 0xe5aba8, 0xe5abaa, 0xe5abac,
+ /* ac */ 0xe5abad, 0xe5abae, 0xe5abaf, 0xe5abb0,
+ /* b0 */ 0xe5abb2, 0xe5abb3, 0xe5abb4, 0xe5abb5,
+ /* b4 */ 0xe5abb6, 0xe5abb7, 0xe5abb8, 0xe5abb9,
+ /* b8 */ 0xe5abba, 0xe5abbb, 0xe5abbc, 0xe5abbd,
+ /* bc */ 0xe5abbe, 0xe5abbf, 0xe5ac80, 0xe5ac81,
+ /* c0 */ 0xe5ac82, 0xe5ac83, 0xe5ac84, 0xe5ac85,
+ /* c4 */ 0xe5ac86, 0xe5ac87, 0xe5ac88, 0xe5ac8a,
+ /* c8 */ 0xe5ac8b, 0xe5ac8c, 0xe5ac8d, 0xe5ac8e,
+ /* cc */ 0xe5ac8f, 0xe5ac90, 0xe5ac91, 0xe5ac92,
+ /* d0 */ 0xe5ac93, 0xe5ac94, 0xe5ac95, 0xe5ac98,
+ /* d4 */ 0xe5ac99, 0xe5ac9a, 0xe5ac9b, 0xe5ac9c,
+ /* d8 */ 0xe5ac9d, 0xe5ac9e, 0xe5ac9f, 0xe5aca0,
+ /* dc */ 0xe5aca1, 0xe5aca2, 0xe5aca3, 0xe5aca4,
+ /* e0 */ 0xe5aca5, 0xe5aca6, 0xe5aca7, 0xe5aca8,
+ /* e4 */ 0xe5aca9, 0xe5acaa, 0xe5acab, 0xe5acac,
+ /* e8 */ 0xe5acad, 0xe5acae, 0xe5acaf, 0xe5acb0,
+ /* ec */ 0xe5acb1, 0xe5acb3, 0xe5acb5, 0xe5acb6,
+ /* f0 */ 0xe5acb8, 0xe5acb9, 0xe5acba, 0xe5acbb,
+ /* f4 */ 0xe5acbc, 0xe5acbd, 0xe5acbe, 0xe5acbf,
+ /* f8 */ 0xe5ad81, 0xe5ad82, 0xe5ad83, 0xe5ad84,
+ /* fc */ 0xe5ad85, 0xe5ad86, 0xe5ad87,
+
+ /*** Two byte table, leaf: 8cxx - offset 0x00973 ***/
+
+ /* 40 */ 0xe5ad88, 0xe5ad89, 0xe5ad8a, 0xe5ad8b,
+ /* 44 */ 0xe5ad8c, 0xe5ad8d, 0xe5ad8e, 0xe5ad8f,
+ /* 48 */ 0xe5ad92, 0xe5ad96, 0xe5ad9e, 0xe5ada0,
+ /* 4c */ 0xe5ada1, 0xe5ada7, 0xe5ada8, 0xe5adab,
+ /* 50 */ 0xe5adad, 0xe5adae, 0xe5adaf, 0xe5adb2,
+ /* 54 */ 0xe5adb4, 0xe5adb6, 0xe5adb7, 0xe5adb8,
+ /* 58 */ 0xe5adb9, 0xe5adbb, 0xe5adbc, 0xe5adbe,
+ /* 5c */ 0xe5adbf, 0xe5ae82, 0xe5ae86, 0xe5ae8a,
+ /* 60 */ 0xe5ae8d, 0xe5ae8e, 0xe5ae90, 0xe5ae91,
+ /* 64 */ 0xe5ae92, 0xe5ae94, 0xe5ae96, 0xe5ae9f,
+ /* 68 */ 0xe5aea7, 0xe5aea8, 0xe5aea9, 0xe5aeac,
+ /* 6c */ 0xe5aead, 0xe5aeae, 0xe5aeaf, 0xe5aeb1,
+ /* 70 */ 0xe5aeb2, 0xe5aeb7, 0xe5aeba, 0xe5aebb,
+ /* 74 */ 0xe5aebc, 0xe5af80, 0xe5af81, 0xe5af83,
+ /* 78 */ 0xe5af88, 0xe5af89, 0xe5af8a, 0xe5af8b,
+ /* 7c */ 0xe5af8d, 0xe5af8e, 0xe5af8f, 0x000000,
+ /* 80 */ 0xe5af91, 0xe5af94, 0xe5af95, 0xe5af96,
+ /* 84 */ 0xe5af97, 0xe5af98, 0xe5af99, 0xe5af9a,
+ /* 88 */ 0xe5af9b, 0xe5af9c, 0xe5afa0, 0xe5afa2,
+ /* 8c */ 0xe5afa3, 0xe5afa6, 0xe5afa7, 0xe5afa9,
+ /* 90 */ 0xe5afaa, 0xe5afab, 0xe5afac, 0xe5afad,
+ /* 94 */ 0xe5afaf, 0xe5afb1, 0xe5afb2, 0xe5afb3,
+ /* 98 */ 0xe5afb4, 0xe5afb5, 0xe5afb6, 0xe5afb7,
+ /* 9c */ 0xe5afbd, 0xe5afbe, 0xe5b080, 0xe5b082,
+ /* a0 */ 0xe5b083, 0xe5b085, 0xe5b087, 0xe5b088,
+ /* a4 */ 0xe5b08b, 0xe5b08c, 0xe5b08d, 0xe5b08e,
+ /* a8 */ 0xe5b090, 0xe5b092, 0xe5b093, 0xe5b097,
+ /* ac */ 0xe5b099, 0xe5b09b, 0xe5b09e, 0xe5b09f,
+ /* b0 */ 0xe5b0a0, 0xe5b0a1, 0xe5b0a3, 0xe5b0a6,
+ /* b4 */ 0xe5b0a8, 0xe5b0a9, 0xe5b0aa, 0xe5b0ab,
+ /* b8 */ 0xe5b0ad, 0xe5b0ae, 0xe5b0af, 0xe5b0b0,
+ /* bc */ 0xe5b0b2, 0xe5b0b3, 0xe5b0b5, 0xe5b0b6,
+ /* c0 */ 0xe5b0b7, 0xe5b183, 0xe5b184, 0xe5b186,
+ /* c4 */ 0xe5b187, 0xe5b18c, 0xe5b18d, 0xe5b192,
+ /* c8 */ 0xe5b193, 0xe5b194, 0xe5b196, 0xe5b197,
+ /* cc */ 0xe5b198, 0xe5b19a, 0xe5b19b, 0xe5b19c,
+ /* d0 */ 0xe5b19d, 0xe5b19f, 0xe5b1a2, 0xe5b1a4,
+ /* d4 */ 0xe5b1a7, 0xe5b1a8, 0xe5b1a9, 0xe5b1aa,
+ /* d8 */ 0xe5b1ab, 0xe5b1ac, 0xe5b1ad, 0xe5b1b0,
+ /* dc */ 0xe5b1b2, 0xe5b1b3, 0xe5b1b4, 0xe5b1b5,
+ /* e0 */ 0xe5b1b6, 0xe5b1b7, 0xe5b1b8, 0xe5b1bb,
+ /* e4 */ 0xe5b1bc, 0xe5b1bd, 0xe5b1be, 0xe5b280,
+ /* e8 */ 0xe5b283, 0xe5b284, 0xe5b285, 0xe5b286,
+ /* ec */ 0xe5b287, 0xe5b289, 0xe5b28a, 0xe5b28b,
+ /* f0 */ 0xe5b28e, 0xe5b28f, 0xe5b292, 0xe5b293,
+ /* f4 */ 0xe5b295, 0xe5b29d, 0xe5b29e, 0xe5b29f,
+ /* f8 */ 0xe5b2a0, 0xe5b2a1, 0xe5b2a4, 0xe5b2a5,
+ /* fc */ 0xe5b2a6, 0xe5b2a7, 0xe5b2a8,
+
+ /*** Two byte table, leaf: 8dxx - offset 0x00a32 ***/
+
+ /* 40 */ 0xe5b2aa, 0xe5b2ae, 0xe5b2af, 0xe5b2b0,
+ /* 44 */ 0xe5b2b2, 0xe5b2b4, 0xe5b2b6, 0xe5b2b9,
+ /* 48 */ 0xe5b2ba, 0xe5b2bb, 0xe5b2bc, 0xe5b2be,
+ /* 4c */ 0xe5b380, 0xe5b382, 0xe5b383, 0xe5b385,
+ /* 50 */ 0xe5b386, 0xe5b387, 0xe5b388, 0xe5b389,
+ /* 54 */ 0xe5b38a, 0xe5b38c, 0xe5b38d, 0xe5b38e,
+ /* 58 */ 0xe5b38f, 0xe5b390, 0xe5b391, 0xe5b393,
+ /* 5c */ 0xe5b394, 0xe5b395, 0xe5b396, 0xe5b397,
+ /* 60 */ 0xe5b398, 0xe5b39a, 0xe5b39b, 0xe5b39c,
+ /* 64 */ 0xe5b39d, 0xe5b39e, 0xe5b39f, 0xe5b3a0,
+ /* 68 */ 0xe5b3a2, 0xe5b3a3, 0xe5b3a7, 0xe5b3a9,
+ /* 6c */ 0xe5b3ab, 0xe5b3ac, 0xe5b3ae, 0xe5b3af,
+ /* 70 */ 0xe5b3b1, 0xe5b3b2, 0xe5b3b3, 0xe5b3b4,
+ /* 74 */ 0xe5b3b5, 0xe5b3b6, 0xe5b3b7, 0xe5b3b8,
+ /* 78 */ 0xe5b3b9, 0xe5b3ba, 0xe5b3bc, 0xe5b3bd,
+ /* 7c */ 0xe5b3be, 0xe5b3bf, 0xe5b480, 0x000000,
+ /* 80 */ 0xe5b481, 0xe5b484, 0xe5b485, 0xe5b488,
+ /* 84 */ 0xe5b489, 0xe5b48a, 0xe5b48b, 0xe5b48c,
+ /* 88 */ 0xe5b48d, 0xe5b48f, 0xe5b490, 0xe5b491,
+ /* 8c */ 0xe5b492, 0xe5b493, 0xe5b495, 0xe5b497,
+ /* 90 */ 0xe5b498, 0xe5b499, 0xe5b49a, 0xe5b49c,
+ /* 94 */ 0xe5b49d, 0xe5b49f, 0xe5b4a0, 0xe5b4a1,
+ /* 98 */ 0xe5b4a2, 0xe5b4a3, 0xe5b4a5, 0xe5b4a8,
+ /* 9c */ 0xe5b4aa, 0xe5b4ab, 0xe5b4ac, 0xe5b4af,
+ /* a0 */ 0xe5b4b0, 0xe5b4b1, 0xe5b4b2, 0xe5b4b3,
+ /* a4 */ 0xe5b4b5, 0xe5b4b6, 0xe5b4b7, 0xe5b4b8,
+ /* a8 */ 0xe5b4b9, 0xe5b4ba, 0xe5b4bb, 0xe5b4bc,
+ /* ac */ 0xe5b4bf, 0xe5b580, 0xe5b581, 0xe5b582,
+ /* b0 */ 0xe5b583, 0xe5b584, 0xe5b585, 0xe5b586,
+ /* b4 */ 0xe5b588, 0xe5b589, 0xe5b58d, 0xe5b58e,
+ /* b8 */ 0xe5b58f, 0xe5b590, 0xe5b591, 0xe5b592,
+ /* bc */ 0xe5b593, 0xe5b594, 0xe5b595, 0xe5b596,
+ /* c0 */ 0xe5b597, 0xe5b599, 0xe5b59a, 0xe5b59c,
+ /* c4 */ 0xe5b59e, 0xe5b59f, 0xe5b5a0, 0xe5b5a1,
+ /* c8 */ 0xe5b5a2, 0xe5b5a3, 0xe5b5a4, 0xe5b5a5,
+ /* cc */ 0xe5b5a6, 0xe5b5a7, 0xe5b5a8, 0xe5b5aa,
+ /* d0 */ 0xe5b5ad, 0xe5b5ae, 0xe5b5b0, 0xe5b5b1,
+ /* d4 */ 0xe5b5b2, 0xe5b5b3, 0xe5b5b5, 0xe5b5b6,
+ /* d8 */ 0xe5b5b7, 0xe5b5b8, 0xe5b5b9, 0xe5b5ba,
+ /* dc */ 0xe5b5bb, 0xe5b5bc, 0xe5b5bd, 0xe5b5be,
+ /* e0 */ 0xe5b5bf, 0xe5b680, 0xe5b681, 0xe5b683,
+ /* e4 */ 0xe5b684, 0xe5b685, 0xe5b686, 0xe5b687,
+ /* e8 */ 0xe5b688, 0xe5b689, 0xe5b68a, 0xe5b68b,
+ /* ec */ 0xe5b68c, 0xe5b68d, 0xe5b68e, 0xe5b68f,
+ /* f0 */ 0xe5b690, 0xe5b691, 0xe5b692, 0xe5b693,
+ /* f4 */ 0xe5b694, 0xe5b695, 0xe5b696, 0xe5b697,
+ /* f8 */ 0xe5b698, 0xe5b69a, 0xe5b69b, 0xe5b69c,
+ /* fc */ 0xe5b69e, 0xe5b69f, 0xe5b6a0,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00af1 ***/
+
+ /* 40 */ 0xe5b6a1, 0xe5b6a2, 0xe5b6a3, 0xe5b6a4,
+ /* 44 */ 0xe5b6a5, 0xe5b6a6, 0xe5b6a7, 0xe5b6a8,
+ /* 48 */ 0xe5b6a9, 0xe5b6aa, 0xe5b6ab, 0xe5b6ac,
+ /* 4c */ 0xe5b6ad, 0xe5b6ae, 0xe5b6af, 0xe5b6b0,
+ /* 50 */ 0xe5b6b1, 0xe5b6b2, 0xe5b6b3, 0xe5b6b4,
+ /* 54 */ 0xe5b6b5, 0xe5b6b6, 0xe5b6b8, 0xe5b6b9,
+ /* 58 */ 0xe5b6ba, 0xe5b6bb, 0xe5b6bc, 0xe5b6bd,
+ /* 5c */ 0xe5b6be, 0xe5b6bf, 0xe5b780, 0xe5b781,
+ /* 60 */ 0xe5b782, 0xe5b783, 0xe5b784, 0xe5b786,
+ /* 64 */ 0xe5b787, 0xe5b788, 0xe5b789, 0xe5b78a,
+ /* 68 */ 0xe5b78b, 0xe5b78c, 0xe5b78e, 0xe5b78f,
+ /* 6c */ 0xe5b790, 0xe5b791, 0xe5b792, 0xe5b793,
+ /* 70 */ 0xe5b794, 0xe5b795, 0xe5b796, 0xe5b797,
+ /* 74 */ 0xe5b798, 0xe5b799, 0xe5b79a, 0xe5b79c,
+ /* 78 */ 0xe5b79f, 0xe5b7a0, 0xe5b7a3, 0xe5b7a4,
+ /* 7c */ 0xe5b7aa, 0xe5b7ac, 0xe5b7ad, 0x000000,
+ /* 80 */ 0xe5b7b0, 0xe5b7b5, 0xe5b7b6, 0xe5b7b8,
+ /* 84 */ 0xe5b7b9, 0xe5b7ba, 0xe5b7bb, 0xe5b7bc,
+ /* 88 */ 0xe5b7bf, 0xe5b880, 0xe5b884, 0xe5b887,
+ /* 8c */ 0xe5b889, 0xe5b88a, 0xe5b88b, 0xe5b88d,
+ /* 90 */ 0xe5b88e, 0xe5b892, 0xe5b893, 0xe5b897,
+ /* 94 */ 0xe5b89e, 0xe5b89f, 0xe5b8a0, 0xe5b8a1,
+ /* 98 */ 0xe5b8a2, 0xe5b8a3, 0xe5b8a4, 0xe5b8a5,
+ /* 9c */ 0xe5b8a8, 0xe5b8a9, 0xe5b8aa, 0xe5b8ab,
+ /* a0 */ 0xe5b8ac, 0xe5b8af, 0xe5b8b0, 0xe5b8b2,
+ /* a4 */ 0xe5b8b3, 0xe5b8b4, 0xe5b8b5, 0xe5b8b6,
+ /* a8 */ 0xe5b8b9, 0xe5b8ba, 0xe5b8be, 0xe5b8bf,
+ /* ac */ 0xe5b980, 0xe5b981, 0xe5b983, 0xe5b986,
+ /* b0 */ 0xe5b987, 0xe5b988, 0xe5b989, 0xe5b98a,
+ /* b4 */ 0xe5b98b, 0xe5b98d, 0xe5b98e, 0xe5b98f,
+ /* b8 */ 0xe5b990, 0xe5b991, 0xe5b992, 0xe5b993,
+ /* bc */ 0xe5b996, 0xe5b997, 0xe5b998, 0xe5b999,
+ /* c0 */ 0xe5b99a, 0xe5b99c, 0xe5b99d, 0xe5b99f,
+ /* c4 */ 0xe5b9a0, 0xe5b9a3, 0xe5b9a4, 0xe5b9a5,
+ /* c8 */ 0xe5b9a6, 0xe5b9a7, 0xe5b9a8, 0xe5b9a9,
+ /* cc */ 0xe5b9aa, 0xe5b9ab, 0xe5b9ac, 0xe5b9ad,
+ /* d0 */ 0xe5b9ae, 0xe5b9af, 0xe5b9b0, 0xe5b9b1,
+ /* d4 */ 0xe5b9b5, 0xe5b9b7, 0xe5b9b9, 0xe5b9be,
+ /* d8 */ 0xe5ba81, 0xe5ba82, 0xe5ba83, 0xe5ba85,
+ /* dc */ 0xe5ba88, 0xe5ba89, 0xe5ba8c, 0xe5ba8d,
+ /* e0 */ 0xe5ba8e, 0xe5ba92, 0xe5ba98, 0xe5ba9b,
+ /* e4 */ 0xe5ba9d, 0xe5baa1, 0xe5baa2, 0xe5baa3,
+ /* e8 */ 0xe5baa4, 0xe5baa8, 0xe5baa9, 0xe5baaa,
+ /* ec */ 0xe5baab, 0xe5baac, 0xe5baae, 0xe5baaf,
+ /* f0 */ 0xe5bab0, 0xe5bab1, 0xe5bab2, 0xe5bab4,
+ /* f4 */ 0xe5baba, 0xe5babb, 0xe5babc, 0xe5babd,
+ /* f8 */ 0xe5babf, 0xe5bb80, 0xe5bb81, 0xe5bb82,
+ /* fc */ 0xe5bb83, 0xe5bb84, 0xe5bb85,
+
+ /*** Two byte table, leaf: 8fxx - offset 0x00bb0 ***/
+
+ /* 40 */ 0xe5bb86, 0xe5bb87, 0xe5bb88, 0xe5bb8b,
+ /* 44 */ 0xe5bb8c, 0xe5bb8d, 0xe5bb8e, 0xe5bb8f,
+ /* 48 */ 0xe5bb90, 0xe5bb94, 0xe5bb95, 0xe5bb97,
+ /* 4c */ 0xe5bb98, 0xe5bb99, 0xe5bb9a, 0xe5bb9c,
+ /* 50 */ 0xe5bb9d, 0xe5bb9e, 0xe5bb9f, 0xe5bba0,
+ /* 54 */ 0xe5bba1, 0xe5bba2, 0xe5bba3, 0xe5bba4,
+ /* 58 */ 0xe5bba5, 0xe5bba6, 0xe5bba7, 0xe5bba9,
+ /* 5c */ 0xe5bbab, 0xe5bbac, 0xe5bbad, 0xe5bbae,
+ /* 60 */ 0xe5bbaf, 0xe5bbb0, 0xe5bbb1, 0xe5bbb2,
+ /* 64 */ 0xe5bbb3, 0xe5bbb5, 0xe5bbb8, 0xe5bbb9,
+ /* 68 */ 0xe5bbbb, 0xe5bbbc, 0xe5bbbd, 0xe5bc85,
+ /* 6c */ 0xe5bc86, 0xe5bc87, 0xe5bc89, 0xe5bc8c,
+ /* 70 */ 0xe5bc8d, 0xe5bc8e, 0xe5bc90, 0xe5bc92,
+ /* 74 */ 0xe5bc94, 0xe5bc96, 0xe5bc99, 0xe5bc9a,
+ /* 78 */ 0xe5bc9c, 0xe5bc9d, 0xe5bc9e, 0xe5bca1,
+ /* 7c */ 0xe5bca2, 0xe5bca3, 0xe5bca4, 0x000000,
+ /* 80 */ 0xe5bca8, 0xe5bcab, 0xe5bcac, 0xe5bcae,
+ /* 84 */ 0xe5bcb0, 0xe5bcb2, 0xe5bcb3, 0xe5bcb4,
+ /* 88 */ 0xe5bcb5, 0xe5bcb6, 0xe5bcb7, 0xe5bcb8,
+ /* 8c */ 0xe5bcbb, 0xe5bcbd, 0xe5bcbe, 0xe5bcbf,
+ /* 90 */ 0xe5bd81, 0xe5bd82, 0xe5bd83, 0xe5bd84,
+ /* 94 */ 0xe5bd85, 0xe5bd86, 0xe5bd87, 0xe5bd88,
+ /* 98 */ 0xe5bd89, 0xe5bd8a, 0xe5bd8b, 0xe5bd8c,
+ /* 9c */ 0xe5bd8d, 0xe5bd8e, 0xe5bd8f, 0xe5bd91,
+ /* a0 */ 0xe5bd94, 0xe5bd99, 0xe5bd9a, 0xe5bd9b,
+ /* a4 */ 0xe5bd9c, 0xe5bd9e, 0xe5bd9f, 0xe5bda0,
+ /* a8 */ 0xe5bda3, 0xe5bda5, 0xe5bda7, 0xe5bda8,
+ /* ac */ 0xe5bdab, 0xe5bdae, 0xe5bdaf, 0xe5bdb2,
+ /* b0 */ 0xe5bdb4, 0xe5bdb5, 0xe5bdb6, 0xe5bdb8,
+ /* b4 */ 0xe5bdba, 0xe5bdbd, 0xe5bdbe, 0xe5bdbf,
+ /* b8 */ 0xe5be83, 0xe5be86, 0xe5be8d, 0xe5be8e,
+ /* bc */ 0xe5be8f, 0xe5be91, 0xe5be93, 0xe5be94,
+ /* c0 */ 0xe5be96, 0xe5be9a, 0xe5be9b, 0xe5be9d,
+ /* c4 */ 0xe5be9e, 0xe5be9f, 0xe5bea0, 0xe5bea2,
+ /* c8 */ 0xe5bea3, 0xe5bea4, 0xe5bea5, 0xe5bea6,
+ /* cc */ 0xe5bea7, 0xe5bea9, 0xe5beab, 0xe5beac,
+ /* d0 */ 0xe5beaf, 0xe5beb0, 0xe5beb1, 0xe5beb2,
+ /* d4 */ 0xe5beb3, 0xe5beb4, 0xe5beb6, 0xe5beb8,
+ /* d8 */ 0xe5beb9, 0xe5beba, 0xe5bebb, 0xe5bebe,
+ /* dc */ 0xe5bebf, 0xe5bf80, 0xe5bf81, 0xe5bf82,
+ /* e0 */ 0xe5bf87, 0xe5bf88, 0xe5bf8a, 0xe5bf8b,
+ /* e4 */ 0xe5bf8e, 0xe5bf93, 0xe5bf94, 0xe5bf95,
+ /* e8 */ 0xe5bf9a, 0xe5bf9b, 0xe5bf9c, 0xe5bf9e,
+ /* ec */ 0xe5bf9f, 0xe5bfa2, 0xe5bfa3, 0xe5bfa5,
+ /* f0 */ 0xe5bfa6, 0xe5bfa8, 0xe5bfa9, 0xe5bfac,
+ /* f4 */ 0xe5bfaf, 0xe5bfb0, 0xe5bfb2, 0xe5bfb3,
+ /* f8 */ 0xe5bfb4, 0xe5bfb6, 0xe5bfb7, 0xe5bfb9,
+ /* fc */ 0xe5bfba, 0xe5bfbc, 0xe68087,
+
+ /*** Two byte table, leaf: 90xx - offset 0x00c6f ***/
+
+ /* 40 */ 0xe68088, 0xe68089, 0xe6808b, 0xe6808c,
+ /* 44 */ 0xe68090, 0xe68091, 0xe68093, 0xe68097,
+ /* 48 */ 0xe68098, 0xe6809a, 0xe6809e, 0xe6809f,
+ /* 4c */ 0xe680a2, 0xe680a3, 0xe680a4, 0xe680ac,
+ /* 50 */ 0xe680ad, 0xe680ae, 0xe680b0, 0xe680b1,
+ /* 54 */ 0xe680b2, 0xe680b3, 0xe680b4, 0xe680b6,
+ /* 58 */ 0xe680b7, 0xe680b8, 0xe680b9, 0xe680ba,
+ /* 5c */ 0xe680bd, 0xe680be, 0xe68180, 0xe68184,
+ /* 60 */ 0xe68185, 0xe68186, 0xe68187, 0xe68188,
+ /* 64 */ 0xe68189, 0xe6818a, 0xe6818c, 0xe6818e,
+ /* 68 */ 0xe6818f, 0xe68191, 0xe68193, 0xe68194,
+ /* 6c */ 0xe68196, 0xe68197, 0xe68198, 0xe6819b,
+ /* 70 */ 0xe6819c, 0xe6819e, 0xe6819f, 0xe681a0,
+ /* 74 */ 0xe681a1, 0xe681a5, 0xe681a6, 0xe681ae,
+ /* 78 */ 0xe681b1, 0xe681b2, 0xe681b4, 0xe681b5,
+ /* 7c */ 0xe681b7, 0xe681be, 0xe68280, 0x000000,
+ /* 80 */ 0xe68281, 0xe68282, 0xe68285, 0xe68286,
+ /* 84 */ 0xe68287, 0xe68288, 0xe6828a, 0xe6828b,
+ /* 88 */ 0xe6828e, 0xe6828f, 0xe68290, 0xe68291,
+ /* 8c */ 0xe68293, 0xe68295, 0xe68297, 0xe68298,
+ /* 90 */ 0xe68299, 0xe6829c, 0xe6829e, 0xe682a1,
+ /* 94 */ 0xe682a2, 0xe682a4, 0xe682a5, 0xe682a7,
+ /* 98 */ 0xe682a9, 0xe682aa, 0xe682ae, 0xe682b0,
+ /* 9c */ 0xe682b3, 0xe682b5, 0xe682b6, 0xe682b7,
+ /* a0 */ 0xe682b9, 0xe682ba, 0xe682bd, 0xe682be,
+ /* a4 */ 0xe682bf, 0xe68380, 0xe68381, 0xe68382,
+ /* a8 */ 0xe68383, 0xe68384, 0xe68387, 0xe68388,
+ /* ac */ 0xe68389, 0xe6838c, 0xe6838d, 0xe6838e,
+ /* b0 */ 0xe6838f, 0xe68390, 0xe68392, 0xe68393,
+ /* b4 */ 0xe68394, 0xe68396, 0xe68397, 0xe68399,
+ /* b8 */ 0xe6839b, 0xe6839e, 0xe683a1, 0xe683a2,
+ /* bc */ 0xe683a3, 0xe683a4, 0xe683a5, 0xe683aa,
+ /* c0 */ 0xe683b1, 0xe683b2, 0xe683b5, 0xe683b7,
+ /* c4 */ 0xe683b8, 0xe683bb, 0xe683bc, 0xe683bd,
+ /* c8 */ 0xe683be, 0xe683bf, 0xe68482, 0xe68483,
+ /* cc */ 0xe68484, 0xe68485, 0xe68487, 0xe6848a,
+ /* d0 */ 0xe6848b, 0xe6848c, 0xe68490, 0xe68491,
+ /* d4 */ 0xe68492, 0xe68493, 0xe68494, 0xe68496,
+ /* d8 */ 0xe68497, 0xe68498, 0xe68499, 0xe6849b,
+ /* dc */ 0xe6849c, 0xe6849d, 0xe6849e, 0xe684a1,
+ /* e0 */ 0xe684a2, 0xe684a5, 0xe684a8, 0xe684a9,
+ /* e4 */ 0xe684aa, 0xe684ac, 0xe684ad, 0xe684ae,
+ /* e8 */ 0xe684af, 0xe684b0, 0xe684b1, 0xe684b2,
+ /* ec */ 0xe684b3, 0xe684b4, 0xe684b5, 0xe684b6,
+ /* f0 */ 0xe684b7, 0xe684b8, 0xe684b9, 0xe684ba,
+ /* f4 */ 0xe684bb, 0xe684bc, 0xe684bd, 0xe684be,
+ /* f8 */ 0xe68580, 0xe68581, 0xe68582, 0xe68583,
+ /* fc */ 0xe68584, 0xe68585, 0xe68586,
+
+ /*** Two byte table, leaf: 91xx - offset 0x00d2e ***/
+
+ /* 40 */ 0xe68587, 0xe68589, 0xe6858b, 0xe6858d,
+ /* 44 */ 0xe6858f, 0xe68590, 0xe68592, 0xe68593,
+ /* 48 */ 0xe68594, 0xe68596, 0xe68597, 0xe68598,
+ /* 4c */ 0xe68599, 0xe6859a, 0xe6859b, 0xe6859c,
+ /* 50 */ 0xe6859e, 0xe6859f, 0xe685a0, 0xe685a1,
+ /* 54 */ 0xe685a3, 0xe685a4, 0xe685a5, 0xe685a6,
+ /* 58 */ 0xe685a9, 0xe685aa, 0xe685ab, 0xe685ac,
+ /* 5c */ 0xe685ad, 0xe685ae, 0xe685af, 0xe685b1,
+ /* 60 */ 0xe685b2, 0xe685b3, 0xe685b4, 0xe685b6,
+ /* 64 */ 0xe685b8, 0xe685b9, 0xe685ba, 0xe685bb,
+ /* 68 */ 0xe685bc, 0xe685bd, 0xe685be, 0xe685bf,
+ /* 6c */ 0xe68680, 0xe68681, 0xe68682, 0xe68683,
+ /* 70 */ 0xe68684, 0xe68685, 0xe68686, 0xe68687,
+ /* 74 */ 0xe68688, 0xe68689, 0xe6868a, 0xe6868c,
+ /* 78 */ 0xe6868d, 0xe6868f, 0xe68690, 0xe68691,
+ /* 7c */ 0xe68692, 0xe68693, 0xe68695, 0x000000,
+ /* 80 */ 0xe68696, 0xe68697, 0xe68698, 0xe68699,
+ /* 84 */ 0xe6869a, 0xe6869b, 0xe6869c, 0xe6869e,
+ /* 88 */ 0xe6869f, 0xe686a0, 0xe686a1, 0xe686a2,
+ /* 8c */ 0xe686a3, 0xe686a4, 0xe686a5, 0xe686a6,
+ /* 90 */ 0xe686aa, 0xe686ab, 0xe686ad, 0xe686ae,
+ /* 94 */ 0xe686af, 0xe686b0, 0xe686b1, 0xe686b2,
+ /* 98 */ 0xe686b3, 0xe686b4, 0xe686b5, 0xe686b6,
+ /* 9c */ 0xe686b8, 0xe686b9, 0xe686ba, 0xe686bb,
+ /* a0 */ 0xe686bc, 0xe686bd, 0xe686bf, 0xe68780,
+ /* a4 */ 0xe68781, 0xe68783, 0xe68784, 0xe68785,
+ /* a8 */ 0xe68786, 0xe68787, 0xe68789, 0xe6878c,
+ /* ac */ 0xe6878d, 0xe6878e, 0xe6878f, 0xe68790,
+ /* b0 */ 0xe68793, 0xe68795, 0xe68796, 0xe68797,
+ /* b4 */ 0xe68798, 0xe68799, 0xe6879a, 0xe6879b,
+ /* b8 */ 0xe6879c, 0xe6879d, 0xe6879e, 0xe6879f,
+ /* bc */ 0xe687a0, 0xe687a1, 0xe687a2, 0xe687a3,
+ /* c0 */ 0xe687a4, 0xe687a5, 0xe687a7, 0xe687a8,
+ /* c4 */ 0xe687a9, 0xe687aa, 0xe687ab, 0xe687ac,
+ /* c8 */ 0xe687ad, 0xe687ae, 0xe687af, 0xe687b0,
+ /* cc */ 0xe687b1, 0xe687b2, 0xe687b3, 0xe687b4,
+ /* d0 */ 0xe687b6, 0xe687b7, 0xe687b8, 0xe687b9,
+ /* d4 */ 0xe687ba, 0xe687bb, 0xe687bc, 0xe687bd,
+ /* d8 */ 0xe687be, 0xe68880, 0xe68881, 0xe68882,
+ /* dc */ 0xe68883, 0xe68884, 0xe68885, 0xe68887,
+ /* e0 */ 0xe68889, 0xe68893, 0xe68894, 0xe68899,
+ /* e4 */ 0xe6889c, 0xe6889d, 0xe6889e, 0xe688a0,
+ /* e8 */ 0xe688a3, 0xe688a6, 0xe688a7, 0xe688a8,
+ /* ec */ 0xe688a9, 0xe688ab, 0xe688ad, 0xe688af,
+ /* f0 */ 0xe688b0, 0xe688b1, 0xe688b2, 0xe688b5,
+ /* f4 */ 0xe688b6, 0xe688b8, 0xe688b9, 0xe688ba,
+ /* f8 */ 0xe688bb, 0xe688bc, 0xe68982, 0xe68984,
+ /* fc */ 0xe68985, 0xe68986, 0xe6898a,
+
+ /*** Two byte table, leaf: 92xx - offset 0x00ded ***/
+
+ /* 40 */ 0xe6898f, 0xe68990, 0xe68995, 0xe68996,
+ /* 44 */ 0xe68997, 0xe68999, 0xe6899a, 0xe6899c,
+ /* 48 */ 0xe6899d, 0xe6899e, 0xe6899f, 0xe689a0,
+ /* 4c */ 0xe689a1, 0xe689a2, 0xe689a4, 0xe689a5,
+ /* 50 */ 0xe689a8, 0xe689b1, 0xe689b2, 0xe689b4,
+ /* 54 */ 0xe689b5, 0xe689b7, 0xe689b8, 0xe689ba,
+ /* 58 */ 0xe689bb, 0xe689bd, 0xe68a81, 0xe68a82,
+ /* 5c */ 0xe68a83, 0xe68a85, 0xe68a86, 0xe68a87,
+ /* 60 */ 0xe68a88, 0xe68a8b, 0xe68a8c, 0xe68a8d,
+ /* 64 */ 0xe68a8e, 0xe68a8f, 0xe68a90, 0xe68a94,
+ /* 68 */ 0xe68a99, 0xe68a9c, 0xe68a9d, 0xe68a9e,
+ /* 6c */ 0xe68aa3, 0xe68aa6, 0xe68aa7, 0xe68aa9,
+ /* 70 */ 0xe68aaa, 0xe68aad, 0xe68aae, 0xe68aaf,
+ /* 74 */ 0xe68ab0, 0xe68ab2, 0xe68ab3, 0xe68ab4,
+ /* 78 */ 0xe68ab6, 0xe68ab7, 0xe68ab8, 0xe68aba,
+ /* 7c */ 0xe68abe, 0xe68b80, 0xe68b81, 0x000000,
+ /* 80 */ 0xe68b83, 0xe68b8b, 0xe68b8f, 0xe68b91,
+ /* 84 */ 0xe68b95, 0xe68b9d, 0xe68b9e, 0xe68ba0,
+ /* 88 */ 0xe68ba1, 0xe68ba4, 0xe68baa, 0xe68bab,
+ /* 8c */ 0xe68bb0, 0xe68bb2, 0xe68bb5, 0xe68bb8,
+ /* 90 */ 0xe68bb9, 0xe68bba, 0xe68bbb, 0xe68c80,
+ /* 94 */ 0xe68c83, 0xe68c84, 0xe68c85, 0xe68c86,
+ /* 98 */ 0xe68c8a, 0xe68c8b, 0xe68c8c, 0xe68c8d,
+ /* 9c */ 0xe68c8f, 0xe68c90, 0xe68c92, 0xe68c93,
+ /* a0 */ 0xe68c94, 0xe68c95, 0xe68c97, 0xe68c98,
+ /* a4 */ 0xe68c99, 0xe68c9c, 0xe68ca6, 0xe68ca7,
+ /* a8 */ 0xe68ca9, 0xe68cac, 0xe68cad, 0xe68cae,
+ /* ac */ 0xe68cb0, 0xe68cb1, 0xe68cb3, 0xe68cb4,
+ /* b0 */ 0xe68cb5, 0xe68cb6, 0xe68cb7, 0xe68cb8,
+ /* b4 */ 0xe68cbb, 0xe68cbc, 0xe68cbe, 0xe68cbf,
+ /* b8 */ 0xe68d80, 0xe68d81, 0xe68d84, 0xe68d87,
+ /* bc */ 0xe68d88, 0xe68d8a, 0xe68d91, 0xe68d92,
+ /* c0 */ 0xe68d93, 0xe68d94, 0xe68d96, 0xe68d97,
+ /* c4 */ 0xe68d98, 0xe68d99, 0xe68d9a, 0xe68d9b,
+ /* c8 */ 0xe68d9c, 0xe68d9d, 0xe68da0, 0xe68da4,
+ /* cc */ 0xe68da5, 0xe68da6, 0xe68da8, 0xe68daa,
+ /* d0 */ 0xe68dab, 0xe68dac, 0xe68daf, 0xe68db0,
+ /* d4 */ 0xe68db2, 0xe68db3, 0xe68db4, 0xe68db5,
+ /* d8 */ 0xe68db8, 0xe68db9, 0xe68dbc, 0xe68dbd,
+ /* dc */ 0xe68dbe, 0xe68dbf, 0xe68e81, 0xe68e83,
+ /* e0 */ 0xe68e84, 0xe68e85, 0xe68e86, 0xe68e8b,
+ /* e4 */ 0xe68e8d, 0xe68e91, 0xe68e93, 0xe68e94,
+ /* e8 */ 0xe68e95, 0xe68e97, 0xe68e99, 0xe68e9a,
+ /* ec */ 0xe68e9b, 0xe68e9c, 0xe68e9d, 0xe68e9e,
+ /* f0 */ 0xe68e9f, 0xe68ea1, 0xe68ea4, 0xe68ea6,
+ /* f4 */ 0xe68eab, 0xe68eaf, 0xe68eb1, 0xe68eb2,
+ /* f8 */ 0xe68eb5, 0xe68eb6, 0xe68eb9, 0xe68ebb,
+ /* fc */ 0xe68ebd, 0xe68ebf, 0xe68f80,
+
+ /*** Two byte table, leaf: 93xx - offset 0x00eac ***/
+
+ /* 40 */ 0xe68f81, 0xe68f82, 0xe68f83, 0xe68f85,
+ /* 44 */ 0xe68f87, 0xe68f88, 0xe68f8a, 0xe68f8b,
+ /* 48 */ 0xe68f8c, 0xe68f91, 0xe68f93, 0xe68f94,
+ /* 4c */ 0xe68f95, 0xe68f97, 0xe68f98, 0xe68f99,
+ /* 50 */ 0xe68f9a, 0xe68f9b, 0xe68f9c, 0xe68f9d,
+ /* 54 */ 0xe68f9f, 0xe68fa2, 0xe68fa4, 0xe68fa5,
+ /* 58 */ 0xe68fa6, 0xe68fa7, 0xe68fa8, 0xe68fab,
+ /* 5c */ 0xe68fac, 0xe68fae, 0xe68faf, 0xe68fb0,
+ /* 60 */ 0xe68fb1, 0xe68fb3, 0xe68fb5, 0xe68fb7,
+ /* 64 */ 0xe68fb9, 0xe68fba, 0xe68fbb, 0xe68fbc,
+ /* 68 */ 0xe68fbe, 0xe69083, 0xe69084, 0xe69086,
+ /* 6c */ 0xe69087, 0xe69088, 0xe69089, 0xe6908a,
+ /* 70 */ 0xe6908d, 0xe6908e, 0xe69091, 0xe69092,
+ /* 74 */ 0xe69095, 0xe69096, 0xe69097, 0xe69098,
+ /* 78 */ 0xe69099, 0xe6909a, 0xe6909d, 0xe6909f,
+ /* 7c */ 0xe690a2, 0xe690a3, 0xe690a4, 0x000000,
+ /* 80 */ 0xe690a5, 0xe690a7, 0xe690a8, 0xe690a9,
+ /* 84 */ 0xe690ab, 0xe690ae, 0xe690af, 0xe690b0,
+ /* 88 */ 0xe690b1, 0xe690b2, 0xe690b3, 0xe690b5,
+ /* 8c */ 0xe690b6, 0xe690b7, 0xe690b8, 0xe690b9,
+ /* 90 */ 0xe690bb, 0xe690bc, 0xe690be, 0xe69180,
+ /* 94 */ 0xe69182, 0xe69183, 0xe69189, 0xe6918b,
+ /* 98 */ 0xe6918c, 0xe6918d, 0xe6918e, 0xe6918f,
+ /* 9c */ 0xe69190, 0xe69191, 0xe69193, 0xe69195,
+ /* a0 */ 0xe69196, 0xe69197, 0xe69199, 0xe6919a,
+ /* a4 */ 0xe6919b, 0xe6919c, 0xe6919d, 0xe6919f,
+ /* a8 */ 0xe691a0, 0xe691a1, 0xe691a2, 0xe691a3,
+ /* ac */ 0xe691a4, 0xe691a5, 0xe691a6, 0xe691a8,
+ /* b0 */ 0xe691aa, 0xe691ab, 0xe691ac, 0xe691ae,
+ /* b4 */ 0xe691af, 0xe691b0, 0xe691b1, 0xe691b2,
+ /* b8 */ 0xe691b3, 0xe691b4, 0xe691b5, 0xe691b6,
+ /* bc */ 0xe691b7, 0xe691bb, 0xe691bc, 0xe691bd,
+ /* c0 */ 0xe691be, 0xe691bf, 0xe69280, 0xe69281,
+ /* c4 */ 0xe69283, 0xe69286, 0xe69288, 0xe69289,
+ /* c8 */ 0xe6928a, 0xe6928b, 0xe6928c, 0xe6928d,
+ /* cc */ 0xe6928e, 0xe6928f, 0xe69290, 0xe69293,
+ /* d0 */ 0xe69294, 0xe69297, 0xe69298, 0xe6929a,
+ /* d4 */ 0xe6929b, 0xe6929c, 0xe6929d, 0xe6929f,
+ /* d8 */ 0xe692a0, 0xe692a1, 0xe692a2, 0xe692a3,
+ /* dc */ 0xe692a5, 0xe692a6, 0xe692a7, 0xe692a8,
+ /* e0 */ 0xe692aa, 0xe692ab, 0xe692af, 0xe692b1,
+ /* e4 */ 0xe692b2, 0xe692b3, 0xe692b4, 0xe692b6,
+ /* e8 */ 0xe692b9, 0xe692bb, 0xe692bd, 0xe692be,
+ /* ec */ 0xe692bf, 0xe69381, 0xe69383, 0xe69384,
+ /* f0 */ 0xe69386, 0xe69387, 0xe69388, 0xe69389,
+ /* f4 */ 0xe6938a, 0xe6938b, 0xe6938c, 0xe6938f,
+ /* f8 */ 0xe69391, 0xe69393, 0xe69394, 0xe69395,
+ /* fc */ 0xe69396, 0xe69399, 0xe6939a,
+
+ /*** Two byte table, leaf: 94xx - offset 0x00f6b ***/
+
+ /* 40 */ 0xe6939b, 0xe6939c, 0xe6939d, 0xe6939f,
+ /* 44 */ 0xe693a0, 0xe693a1, 0xe693a3, 0xe693a5,
+ /* 48 */ 0xe693a7, 0xe693a8, 0xe693a9, 0xe693aa,
+ /* 4c */ 0xe693ab, 0xe693ac, 0xe693ad, 0xe693ae,
+ /* 50 */ 0xe693af, 0xe693b0, 0xe693b1, 0xe693b2,
+ /* 54 */ 0xe693b3, 0xe693b4, 0xe693b5, 0xe693b6,
+ /* 58 */ 0xe693b7, 0xe693b8, 0xe693b9, 0xe693ba,
+ /* 5c */ 0xe693bb, 0xe693bc, 0xe693bd, 0xe693be,
+ /* 60 */ 0xe693bf, 0xe69481, 0xe69482, 0xe69483,
+ /* 64 */ 0xe69484, 0xe69485, 0xe69486, 0xe69487,
+ /* 68 */ 0xe69488, 0xe6948a, 0xe6948b, 0xe6948c,
+ /* 6c */ 0xe6948d, 0xe6948e, 0xe6948f, 0xe69490,
+ /* 70 */ 0xe69491, 0xe69493, 0xe69494, 0xe69495,
+ /* 74 */ 0xe69496, 0xe69497, 0xe69499, 0xe6949a,
+ /* 78 */ 0xe6949b, 0xe6949c, 0xe6949d, 0xe6949e,
+ /* 7c */ 0xe6949f, 0xe694a0, 0xe694a1, 0x000000,
+ /* 80 */ 0xe694a2, 0xe694a3, 0xe694a4, 0xe694a6,
+ /* 84 */ 0xe694a7, 0xe694a8, 0xe694a9, 0xe694aa,
+ /* 88 */ 0xe694ac, 0xe694ad, 0xe694b0, 0xe694b1,
+ /* 8c */ 0xe694b2, 0xe694b3, 0xe694b7, 0xe694ba,
+ /* 90 */ 0xe694bc, 0xe694bd, 0xe69580, 0xe69581,
+ /* 94 */ 0xe69582, 0xe69583, 0xe69584, 0xe69586,
+ /* 98 */ 0xe69587, 0xe6958a, 0xe6958b, 0xe6958d,
+ /* 9c */ 0xe6958e, 0xe69590, 0xe69592, 0xe69593,
+ /* a0 */ 0xe69594, 0xe69597, 0xe69598, 0xe6959a,
+ /* a4 */ 0xe6959c, 0xe6959f, 0xe695a0, 0xe695a1,
+ /* a8 */ 0xe695a4, 0xe695a5, 0xe695a7, 0xe695a8,
+ /* ac */ 0xe695a9, 0xe695aa, 0xe695ad, 0xe695ae,
+ /* b0 */ 0xe695af, 0xe695b1, 0xe695b3, 0xe695b5,
+ /* b4 */ 0xe695b6, 0xe695b8, 0xe695b9, 0xe695ba,
+ /* b8 */ 0xe695bb, 0xe695bc, 0xe695bd, 0xe695be,
+ /* bc */ 0xe695bf, 0xe69680, 0xe69681, 0xe69682,
+ /* c0 */ 0xe69683, 0xe69684, 0xe69685, 0xe69686,
+ /* c4 */ 0xe69688, 0xe69689, 0xe6968a, 0xe6968d,
+ /* c8 */ 0xe6968e, 0xe6968f, 0xe69692, 0xe69694,
+ /* cc */ 0xe69695, 0xe69696, 0xe69698, 0xe6969a,
+ /* d0 */ 0xe6969d, 0xe6969e, 0xe696a0, 0xe696a2,
+ /* d4 */ 0xe696a3, 0xe696a6, 0xe696a8, 0xe696aa,
+ /* d8 */ 0xe696ac, 0xe696ae, 0xe696b1, 0xe696b2,
+ /* dc */ 0xe696b3, 0xe696b4, 0xe696b5, 0xe696b6,
+ /* e0 */ 0xe696b7, 0xe696b8, 0xe696ba, 0xe696bb,
+ /* e4 */ 0xe696be, 0xe696bf, 0xe69780, 0xe69782,
+ /* e8 */ 0xe69787, 0xe69788, 0xe69789, 0xe6978a,
+ /* ec */ 0xe6978d, 0xe69790, 0xe69791, 0xe69793,
+ /* f0 */ 0xe69794, 0xe69795, 0xe69798, 0xe69799,
+ /* f4 */ 0xe6979a, 0xe6979b, 0xe6979c, 0xe6979d,
+ /* f8 */ 0xe6979e, 0xe6979f, 0xe697a1, 0xe697a3,
+ /* fc */ 0xe697a4, 0xe697aa, 0xe697ab,
+
+ /*** Two byte table, leaf: 95xx - offset 0x0102a ***/
+
+ /* 40 */ 0xe697b2, 0xe697b3, 0xe697b4, 0xe697b5,
+ /* 44 */ 0xe697b8, 0xe697b9, 0xe697bb, 0xe697bc,
+ /* 48 */ 0xe697bd, 0xe697be, 0xe697bf, 0xe69881,
+ /* 4c */ 0xe69884, 0xe69885, 0xe69887, 0xe69888,
+ /* 50 */ 0xe69889, 0xe6988b, 0xe6988d, 0xe69890,
+ /* 54 */ 0xe69891, 0xe69892, 0xe69896, 0xe69897,
+ /* 58 */ 0xe69898, 0xe6989a, 0xe6989b, 0xe6989c,
+ /* 5c */ 0xe6989e, 0xe698a1, 0xe698a2, 0xe698a3,
+ /* 60 */ 0xe698a4, 0xe698a6, 0xe698a9, 0xe698aa,
+ /* 64 */ 0xe698ab, 0xe698ac, 0xe698ae, 0xe698b0,
+ /* 68 */ 0xe698b2, 0xe698b3, 0xe698b7, 0xe698b8,
+ /* 6c */ 0xe698b9, 0xe698ba, 0xe698bb, 0xe698bd,
+ /* 70 */ 0xe698bf, 0xe69980, 0xe69982, 0xe69984,
+ /* 74 */ 0xe69985, 0xe69986, 0xe69987, 0xe69988,
+ /* 78 */ 0xe69989, 0xe6998a, 0xe6998d, 0xe6998e,
+ /* 7c */ 0xe69990, 0xe69991, 0xe69998, 0x000000,
+ /* 80 */ 0xe69999, 0xe6999b, 0xe6999c, 0xe6999d,
+ /* 84 */ 0xe6999e, 0xe699a0, 0xe699a2, 0xe699a3,
+ /* 88 */ 0xe699a5, 0xe699a7, 0xe699a9, 0xe699aa,
+ /* 8c */ 0xe699ab, 0xe699ac, 0xe699ad, 0xe699b1,
+ /* 90 */ 0xe699b2, 0xe699b3, 0xe699b5, 0xe699b8,
+ /* 94 */ 0xe699b9, 0xe699bb, 0xe699bc, 0xe699bd,
+ /* 98 */ 0xe699bf, 0xe69a80, 0xe69a81, 0xe69a83,
+ /* 9c */ 0xe69a85, 0xe69a86, 0xe69a88, 0xe69a89,
+ /* a0 */ 0xe69a8a, 0xe69a8b, 0xe69a8d, 0xe69a8e,
+ /* a4 */ 0xe69a8f, 0xe69a90, 0xe69a92, 0xe69a93,
+ /* a8 */ 0xe69a94, 0xe69a95, 0xe69a98, 0xe69a99,
+ /* ac */ 0xe69a9a, 0xe69a9b, 0xe69a9c, 0xe69a9e,
+ /* b0 */ 0xe69a9f, 0xe69aa0, 0xe69aa1, 0xe69aa2,
+ /* b4 */ 0xe69aa3, 0xe69aa4, 0xe69aa5, 0xe69aa6,
+ /* b8 */ 0xe69aa9, 0xe69aaa, 0xe69aab, 0xe69aac,
+ /* bc */ 0xe69aad, 0xe69aaf, 0xe69ab0, 0xe69ab1,
+ /* c0 */ 0xe69ab2, 0xe69ab3, 0xe69ab5, 0xe69ab6,
+ /* c4 */ 0xe69ab7, 0xe69ab8, 0xe69aba, 0xe69abb,
+ /* c8 */ 0xe69abc, 0xe69abd, 0xe69abf, 0xe69b80,
+ /* cc */ 0xe69b81, 0xe69b82, 0xe69b83, 0xe69b84,
+ /* d0 */ 0xe69b85, 0xe69b86, 0xe69b87, 0xe69b88,
+ /* d4 */ 0xe69b89, 0xe69b8a, 0xe69b8b, 0xe69b8c,
+ /* d8 */ 0xe69b8d, 0xe69b8e, 0xe69b8f, 0xe69b90,
+ /* dc */ 0xe69b91, 0xe69b92, 0xe69b93, 0xe69b94,
+ /* e0 */ 0xe69b95, 0xe69b96, 0xe69b97, 0xe69b98,
+ /* e4 */ 0xe69b9a, 0xe69b9e, 0xe69b9f, 0xe69ba0,
+ /* e8 */ 0xe69ba1, 0xe69ba2, 0xe69ba3, 0xe69ba4,
+ /* ec */ 0xe69ba5, 0xe69ba7, 0xe69ba8, 0xe69baa,
+ /* f0 */ 0xe69bab, 0xe69bac, 0xe69bad, 0xe69bae,
+ /* f4 */ 0xe69baf, 0xe69bb1, 0xe69bb5, 0xe69bb6,
+ /* f8 */ 0xe69bb8, 0xe69bba, 0xe69bbb, 0xe69bbd,
+ /* fc */ 0xe69c81, 0xe69c82, 0xe69c83,
+
+ /*** Two byte table, leaf: 96xx - offset 0x010e9 ***/
+
+ /* 40 */ 0xe69c84, 0xe69c85, 0xe69c86, 0xe69c87,
+ /* 44 */ 0xe69c8c, 0xe69c8e, 0xe69c8f, 0xe69c91,
+ /* 48 */ 0xe69c92, 0xe69c93, 0xe69c96, 0xe69c98,
+ /* 4c */ 0xe69c99, 0xe69c9a, 0xe69c9c, 0xe69c9e,
+ /* 50 */ 0xe69ca0, 0xe69ca1, 0xe69ca2, 0xe69ca3,
+ /* 54 */ 0xe69ca4, 0xe69ca5, 0xe69ca7, 0xe69ca9,
+ /* 58 */ 0xe69cae, 0xe69cb0, 0xe69cb2, 0xe69cb3,
+ /* 5c */ 0xe69cb6, 0xe69cb7, 0xe69cb8, 0xe69cb9,
+ /* 60 */ 0xe69cbb, 0xe69cbc, 0xe69cbe, 0xe69cbf,
+ /* 64 */ 0xe69d81, 0xe69d84, 0xe69d85, 0xe69d87,
+ /* 68 */ 0xe69d8a, 0xe69d8b, 0xe69d8d, 0xe69d92,
+ /* 6c */ 0xe69d94, 0xe69d95, 0xe69d97, 0xe69d98,
+ /* 70 */ 0xe69d99, 0xe69d9a, 0xe69d9b, 0xe69d9d,
+ /* 74 */ 0xe69da2, 0xe69da3, 0xe69da4, 0xe69da6,
+ /* 78 */ 0xe69da7, 0xe69dab, 0xe69dac, 0xe69dae,
+ /* 7c */ 0xe69db1, 0xe69db4, 0xe69db6, 0x000000,
+ /* 80 */ 0xe69db8, 0xe69db9, 0xe69dba, 0xe69dbb,
+ /* 84 */ 0xe69dbd, 0xe69e80, 0xe69e82, 0xe69e83,
+ /* 88 */ 0xe69e85, 0xe69e86, 0xe69e88, 0xe69e8a,
+ /* 8c */ 0xe69e8c, 0xe69e8d, 0xe69e8e, 0xe69e8f,
+ /* 90 */ 0xe69e91, 0xe69e92, 0xe69e93, 0xe69e94,
+ /* 94 */ 0xe69e96, 0xe69e99, 0xe69e9b, 0xe69e9f,
+ /* 98 */ 0xe69ea0, 0xe69ea1, 0xe69ea4, 0xe69ea6,
+ /* 9c */ 0xe69ea9, 0xe69eac, 0xe69eae, 0xe69eb1,
+ /* a0 */ 0xe69eb2, 0xe69eb4, 0xe69eb9, 0xe69eba,
+ /* a4 */ 0xe69ebb, 0xe69ebc, 0xe69ebd, 0xe69ebe,
+ /* a8 */ 0xe69ebf, 0xe69f80, 0xe69f82, 0xe69f85,
+ /* ac */ 0xe69f86, 0xe69f87, 0xe69f88, 0xe69f89,
+ /* b0 */ 0xe69f8a, 0xe69f8b, 0xe69f8c, 0xe69f8d,
+ /* b4 */ 0xe69f8e, 0xe69f95, 0xe69f96, 0xe69f97,
+ /* b8 */ 0xe69f9b, 0xe69f9f, 0xe69fa1, 0xe69fa3,
+ /* bc */ 0xe69fa4, 0xe69fa6, 0xe69fa7, 0xe69fa8,
+ /* c0 */ 0xe69faa, 0xe69fab, 0xe69fad, 0xe69fae,
+ /* c4 */ 0xe69fb2, 0xe69fb5, 0xe69fb6, 0xe69fb7,
+ /* c8 */ 0xe69fb8, 0xe69fb9, 0xe69fba, 0xe69fbb,
+ /* cc */ 0xe69fbc, 0xe69fbe, 0xe6a081, 0xe6a082,
+ /* d0 */ 0xe6a083, 0xe6a084, 0xe6a086, 0xe6a08d,
+ /* d4 */ 0xe6a090, 0xe6a092, 0xe6a094, 0xe6a095,
+ /* d8 */ 0xe6a098, 0xe6a099, 0xe6a09a, 0xe6a09b,
+ /* dc */ 0xe6a09c, 0xe6a09e, 0xe6a09f, 0xe6a0a0,
+ /* e0 */ 0xe6a0a2, 0xe6a0a3, 0xe6a0a4, 0xe6a0a5,
+ /* e4 */ 0xe6a0a6, 0xe6a0a7, 0xe6a0a8, 0xe6a0ab,
+ /* e8 */ 0xe6a0ac, 0xe6a0ad, 0xe6a0ae, 0xe6a0af,
+ /* ec */ 0xe6a0b0, 0xe6a0b1, 0xe6a0b4, 0xe6a0b5,
+ /* f0 */ 0xe6a0b6, 0xe6a0ba, 0xe6a0bb, 0xe6a0bf,
+ /* f4 */ 0xe6a187, 0xe6a18b, 0xe6a18d, 0xe6a18f,
+ /* f8 */ 0xe6a192, 0xe6a196, 0xe6a197, 0xe6a198,
+ /* fc */ 0xe6a199, 0xe6a19a, 0xe6a19b,
+
+ /*** Two byte table, leaf: 97xx - offset 0x011a8 ***/
+
+ /* 40 */ 0xe6a19c, 0xe6a19d, 0xe6a19e, 0xe6a19f,
+ /* 44 */ 0xe6a1aa, 0xe6a1ac, 0xe6a1ad, 0xe6a1ae,
+ /* 48 */ 0xe6a1af, 0xe6a1b0, 0xe6a1b1, 0xe6a1b2,
+ /* 4c */ 0xe6a1b3, 0xe6a1b5, 0xe6a1b8, 0xe6a1b9,
+ /* 50 */ 0xe6a1ba, 0xe6a1bb, 0xe6a1bc, 0xe6a1bd,
+ /* 54 */ 0xe6a1be, 0xe6a1bf, 0xe6a280, 0xe6a282,
+ /* 58 */ 0xe6a284, 0xe6a287, 0xe6a288, 0xe6a289,
+ /* 5c */ 0xe6a28a, 0xe6a28b, 0xe6a28c, 0xe6a28d,
+ /* 60 */ 0xe6a28e, 0xe6a290, 0xe6a291, 0xe6a292,
+ /* 64 */ 0xe6a294, 0xe6a295, 0xe6a296, 0xe6a298,
+ /* 68 */ 0xe6a299, 0xe6a29a, 0xe6a29b, 0xe6a29c,
+ /* 6c */ 0xe6a29d, 0xe6a29e, 0xe6a29f, 0xe6a2a0,
+ /* 70 */ 0xe6a2a1, 0xe6a2a3, 0xe6a2a4, 0xe6a2a5,
+ /* 74 */ 0xe6a2a9, 0xe6a2aa, 0xe6a2ab, 0xe6a2ac,
+ /* 78 */ 0xe6a2ae, 0xe6a2b1, 0xe6a2b2, 0xe6a2b4,
+ /* 7c */ 0xe6a2b6, 0xe6a2b7, 0xe6a2b8, 0x000000,
+ /* 80 */ 0xe6a2b9, 0xe6a2ba, 0xe6a2bb, 0xe6a2bc,
+ /* 84 */ 0xe6a2bd, 0xe6a2be, 0xe6a2bf, 0xe6a381,
+ /* 88 */ 0xe6a383, 0xe6a384, 0xe6a385, 0xe6a386,
+ /* 8c */ 0xe6a387, 0xe6a388, 0xe6a38a, 0xe6a38c,
+ /* 90 */ 0xe6a38e, 0xe6a38f, 0xe6a390, 0xe6a391,
+ /* 94 */ 0xe6a393, 0xe6a394, 0xe6a396, 0xe6a397,
+ /* 98 */ 0xe6a399, 0xe6a39b, 0xe6a39c, 0xe6a39d,
+ /* 9c */ 0xe6a39e, 0xe6a39f, 0xe6a3a1, 0xe6a3a2,
+ /* a0 */ 0xe6a3a4, 0xe6a3a5, 0xe6a3a6, 0xe6a3a7,
+ /* a4 */ 0xe6a3a8, 0xe6a3a9, 0xe6a3aa, 0xe6a3ab,
+ /* a8 */ 0xe6a3ac, 0xe6a3ad, 0xe6a3af, 0xe6a3b2,
+ /* ac */ 0xe6a3b3, 0xe6a3b4, 0xe6a3b6, 0xe6a3b7,
+ /* b0 */ 0xe6a3b8, 0xe6a3bb, 0xe6a3bd, 0xe6a3be,
+ /* b4 */ 0xe6a3bf, 0xe6a480, 0xe6a482, 0xe6a483,
+ /* b8 */ 0xe6a484, 0xe6a486, 0xe6a487, 0xe6a488,
+ /* bc */ 0xe6a489, 0xe6a48a, 0xe6a48c, 0xe6a48f,
+ /* c0 */ 0xe6a491, 0xe6a493, 0xe6a494, 0xe6a495,
+ /* c4 */ 0xe6a496, 0xe6a497, 0xe6a498, 0xe6a499,
+ /* c8 */ 0xe6a49a, 0xe6a49b, 0xe6a49c, 0xe6a49d,
+ /* cc */ 0xe6a49e, 0xe6a4a1, 0xe6a4a2, 0xe6a4a3,
+ /* d0 */ 0xe6a4a5, 0xe6a4a6, 0xe6a4a7, 0xe6a4a8,
+ /* d4 */ 0xe6a4a9, 0xe6a4aa, 0xe6a4ab, 0xe6a4ac,
+ /* d8 */ 0xe6a4ae, 0xe6a4af, 0xe6a4b1, 0xe6a4b2,
+ /* dc */ 0xe6a4b3, 0xe6a4b5, 0xe6a4b6, 0xe6a4b7,
+ /* e0 */ 0xe6a4b8, 0xe6a4ba, 0xe6a4bb, 0xe6a4bc,
+ /* e4 */ 0xe6a4be, 0xe6a580, 0xe6a581, 0xe6a583,
+ /* e8 */ 0xe6a584, 0xe6a585, 0xe6a586, 0xe6a587,
+ /* ec */ 0xe6a588, 0xe6a589, 0xe6a58a, 0xe6a58b,
+ /* f0 */ 0xe6a58c, 0xe6a58d, 0xe6a58e, 0xe6a58f,
+ /* f4 */ 0xe6a590, 0xe6a591, 0xe6a592, 0xe6a593,
+ /* f8 */ 0xe6a595, 0xe6a596, 0xe6a598, 0xe6a599,
+ /* fc */ 0xe6a59b, 0xe6a59c, 0xe6a59f,
+
+ /*** Two byte table, leaf: 98xx - offset 0x01267 ***/
+
+ /* 40 */ 0xe6a5a1, 0xe6a5a2, 0xe6a5a4, 0xe6a5a5,
+ /* 44 */ 0xe6a5a7, 0xe6a5a8, 0xe6a5a9, 0xe6a5aa,
+ /* 48 */ 0xe6a5ac, 0xe6a5ad, 0xe6a5af, 0xe6a5b0,
+ /* 4c */ 0xe6a5b2, 0xe6a5b3, 0xe6a5b4, 0xe6a5b5,
+ /* 50 */ 0xe6a5b6, 0xe6a5ba, 0xe6a5bb, 0xe6a5bd,
+ /* 54 */ 0xe6a5be, 0xe6a5bf, 0xe6a681, 0xe6a683,
+ /* 58 */ 0xe6a685, 0xe6a68a, 0xe6a68b, 0xe6a68c,
+ /* 5c */ 0xe6a68e, 0xe6a68f, 0xe6a690, 0xe6a691,
+ /* 60 */ 0xe6a692, 0xe6a693, 0xe6a696, 0xe6a697,
+ /* 64 */ 0xe6a699, 0xe6a69a, 0xe6a69d, 0xe6a69e,
+ /* 68 */ 0xe6a69f, 0xe6a6a0, 0xe6a6a1, 0xe6a6a2,
+ /* 6c */ 0xe6a6a3, 0xe6a6a4, 0xe6a6a5, 0xe6a6a6,
+ /* 70 */ 0xe6a6a9, 0xe6a6aa, 0xe6a6ac, 0xe6a6ae,
+ /* 74 */ 0xe6a6af, 0xe6a6b0, 0xe6a6b2, 0xe6a6b3,
+ /* 78 */ 0xe6a6b5, 0xe6a6b6, 0xe6a6b8, 0xe6a6b9,
+ /* 7c */ 0xe6a6ba, 0xe6a6bc, 0xe6a6bd, 0x000000,
+ /* 80 */ 0xe6a6be, 0xe6a6bf, 0xe6a780, 0xe6a782,
+ /* 84 */ 0xe6a783, 0xe6a784, 0xe6a785, 0xe6a786,
+ /* 88 */ 0xe6a787, 0xe6a788, 0xe6a789, 0xe6a78b,
+ /* 8c */ 0xe6a78d, 0xe6a78f, 0xe6a791, 0xe6a792,
+ /* 90 */ 0xe6a793, 0xe6a795, 0xe6a796, 0xe6a797,
+ /* 94 */ 0xe6a798, 0xe6a799, 0xe6a79a, 0xe6a79c,
+ /* 98 */ 0xe6a79d, 0xe6a79e, 0xe6a7a1, 0xe6a7a2,
+ /* 9c */ 0xe6a7a3, 0xe6a7a4, 0xe6a7a5, 0xe6a7a6,
+ /* a0 */ 0xe6a7a7, 0xe6a7a8, 0xe6a7a9, 0xe6a7aa,
+ /* a4 */ 0xe6a7ab, 0xe6a7ac, 0xe6a7ae, 0xe6a7af,
+ /* a8 */ 0xe6a7b0, 0xe6a7b1, 0xe6a7b3, 0xe6a7b4,
+ /* ac */ 0xe6a7b5, 0xe6a7b6, 0xe6a7b7, 0xe6a7b8,
+ /* b0 */ 0xe6a7b9, 0xe6a7ba, 0xe6a7bb, 0xe6a7bc,
+ /* b4 */ 0xe6a7be, 0xe6a880, 0xe6a881, 0xe6a882,
+ /* b8 */ 0xe6a883, 0xe6a884, 0xe6a885, 0xe6a886,
+ /* bc */ 0xe6a887, 0xe6a888, 0xe6a889, 0xe6a88b,
+ /* c0 */ 0xe6a88c, 0xe6a88d, 0xe6a88e, 0xe6a88f,
+ /* c4 */ 0xe6a890, 0xe6a891, 0xe6a892, 0xe6a893,
+ /* c8 */ 0xe6a894, 0xe6a895, 0xe6a896, 0xe6a899,
+ /* cc */ 0xe6a89a, 0xe6a89b, 0xe6a89c, 0xe6a89d,
+ /* d0 */ 0xe6a89e, 0xe6a8a0, 0xe6a8a2, 0xe6a8a3,
+ /* d4 */ 0xe6a8a4, 0xe6a8a5, 0xe6a8a6, 0xe6a8a7,
+ /* d8 */ 0xe6a8a9, 0xe6a8ab, 0xe6a8ac, 0xe6a8ad,
+ /* dc */ 0xe6a8ae, 0xe6a8b0, 0xe6a8b2, 0xe6a8b3,
+ /* e0 */ 0xe6a8b4, 0xe6a8b6, 0xe6a8b7, 0xe6a8b8,
+ /* e4 */ 0xe6a8b9, 0xe6a8ba, 0xe6a8bb, 0xe6a8bc,
+ /* e8 */ 0xe6a8bf, 0xe6a980, 0xe6a981, 0xe6a982,
+ /* ec */ 0xe6a983, 0xe6a985, 0xe6a986, 0xe6a988,
+ /* f0 */ 0xe6a989, 0xe6a98a, 0xe6a98b, 0xe6a98c,
+ /* f4 */ 0xe6a98d, 0xe6a98e, 0xe6a98f, 0xe6a991,
+ /* f8 */ 0xe6a992, 0xe6a993, 0xe6a994, 0xe6a995,
+ /* fc */ 0xe6a996, 0xe6a997, 0xe6a99a,
+
+ /*** Two byte table, leaf: 99xx - offset 0x01326 ***/
+
+ /* 40 */ 0xe6a99c, 0xe6a99d, 0xe6a99e, 0xe6a99f,
+ /* 44 */ 0xe6a9a0, 0xe6a9a2, 0xe6a9a3, 0xe6a9a4,
+ /* 48 */ 0xe6a9a6, 0xe6a9a7, 0xe6a9a8, 0xe6a9a9,
+ /* 4c */ 0xe6a9aa, 0xe6a9ab, 0xe6a9ac, 0xe6a9ad,
+ /* 50 */ 0xe6a9ae, 0xe6a9af, 0xe6a9b0, 0xe6a9b2,
+ /* 54 */ 0xe6a9b3, 0xe6a9b4, 0xe6a9b5, 0xe6a9b6,
+ /* 58 */ 0xe6a9b7, 0xe6a9b8, 0xe6a9ba, 0xe6a9bb,
+ /* 5c */ 0xe6a9bd, 0xe6a9be, 0xe6a9bf, 0xe6aa81,
+ /* 60 */ 0xe6aa82, 0xe6aa83, 0xe6aa85, 0xe6aa86,
+ /* 64 */ 0xe6aa87, 0xe6aa88, 0xe6aa89, 0xe6aa8a,
+ /* 68 */ 0xe6aa8b, 0xe6aa8c, 0xe6aa8d, 0xe6aa8f,
+ /* 6c */ 0xe6aa92, 0xe6aa93, 0xe6aa94, 0xe6aa95,
+ /* 70 */ 0xe6aa96, 0xe6aa98, 0xe6aa99, 0xe6aa9a,
+ /* 74 */ 0xe6aa9b, 0xe6aa9c, 0xe6aa9d, 0xe6aa9e,
+ /* 78 */ 0xe6aa9f, 0xe6aaa1, 0xe6aaa2, 0xe6aaa3,
+ /* 7c */ 0xe6aaa4, 0xe6aaa5, 0xe6aaa6, 0x000000,
+ /* 80 */ 0xe6aaa7, 0xe6aaa8, 0xe6aaaa, 0xe6aaad,
+ /* 84 */ 0xe6aaae, 0xe6aaaf, 0xe6aab0, 0xe6aab1,
+ /* 88 */ 0xe6aab2, 0xe6aab3, 0xe6aab4, 0xe6aab5,
+ /* 8c */ 0xe6aab6, 0xe6aab7, 0xe6aab8, 0xe6aab9,
+ /* 90 */ 0xe6aaba, 0xe6aabb, 0xe6aabc, 0xe6aabd,
+ /* 94 */ 0xe6aabe, 0xe6aabf, 0xe6ab80, 0xe6ab81,
+ /* 98 */ 0xe6ab82, 0xe6ab83, 0xe6ab84, 0xe6ab85,
+ /* 9c */ 0xe6ab86, 0xe6ab87, 0xe6ab88, 0xe6ab89,
+ /* a0 */ 0xe6ab8a, 0xe6ab8b, 0xe6ab8c, 0xe6ab8d,
+ /* a4 */ 0xe6ab8e, 0xe6ab8f, 0xe6ab90, 0xe6ab91,
+ /* a8 */ 0xe6ab92, 0xe6ab93, 0xe6ab94, 0xe6ab95,
+ /* ac */ 0xe6ab96, 0xe6ab97, 0xe6ab98, 0xe6ab99,
+ /* b0 */ 0xe6ab9a, 0xe6ab9b, 0xe6ab9c, 0xe6ab9d,
+ /* b4 */ 0xe6ab9e, 0xe6ab9f, 0xe6aba0, 0xe6aba1,
+ /* b8 */ 0xe6aba2, 0xe6aba3, 0xe6aba4, 0xe6aba5,
+ /* bc */ 0xe6aba6, 0xe6aba7, 0xe6aba8, 0xe6aba9,
+ /* c0 */ 0xe6abaa, 0xe6abab, 0xe6abac, 0xe6abad,
+ /* c4 */ 0xe6abae, 0xe6abaf, 0xe6abb0, 0xe6abb1,
+ /* c8 */ 0xe6abb2, 0xe6abb3, 0xe6abb4, 0xe6abb5,
+ /* cc */ 0xe6abb6, 0xe6abb7, 0xe6abb8, 0xe6abb9,
+ /* d0 */ 0xe6abba, 0xe6abbb, 0xe6abbc, 0xe6abbd,
+ /* d4 */ 0xe6abbe, 0xe6abbf, 0xe6ac80, 0xe6ac81,
+ /* d8 */ 0xe6ac82, 0xe6ac83, 0xe6ac84, 0xe6ac85,
+ /* dc */ 0xe6ac86, 0xe6ac87, 0xe6ac88, 0xe6ac89,
+ /* e0 */ 0xe6ac8a, 0xe6ac8b, 0xe6ac8c, 0xe6ac8d,
+ /* e4 */ 0xe6ac8e, 0xe6ac8f, 0xe6ac90, 0xe6ac91,
+ /* e8 */ 0xe6ac92, 0xe6ac93, 0xe6ac94, 0xe6ac95,
+ /* ec */ 0xe6ac96, 0xe6ac97, 0xe6ac98, 0xe6ac99,
+ /* f0 */ 0xe6ac9a, 0xe6ac9b, 0xe6ac9c, 0xe6ac9d,
+ /* f4 */ 0xe6ac9e, 0xe6ac9f, 0xe6aca5, 0xe6aca6,
+ /* f8 */ 0xe6aca8, 0xe6aca9, 0xe6acaa, 0xe6acab,
+ /* fc */ 0xe6acac, 0xe6acad, 0xe6acae,
+
+ /*** Two byte table, leaf: 9axx - offset 0x013e5 ***/
+
+ /* 40 */ 0xe6acaf, 0xe6acb0, 0xe6acb1, 0xe6acb3,
+ /* 44 */ 0xe6acb4, 0xe6acb5, 0xe6acb6, 0xe6acb8,
+ /* 48 */ 0xe6acbb, 0xe6acbc, 0xe6acbd, 0xe6acbf,
+ /* 4c */ 0xe6ad80, 0xe6ad81, 0xe6ad82, 0xe6ad84,
+ /* 50 */ 0xe6ad85, 0xe6ad88, 0xe6ad8a, 0xe6ad8b,
+ /* 54 */ 0xe6ad8d, 0xe6ad8e, 0xe6ad8f, 0xe6ad90,
+ /* 58 */ 0xe6ad91, 0xe6ad92, 0xe6ad93, 0xe6ad94,
+ /* 5c */ 0xe6ad95, 0xe6ad96, 0xe6ad97, 0xe6ad98,
+ /* 60 */ 0xe6ad9a, 0xe6ad9b, 0xe6ad9c, 0xe6ad9d,
+ /* 64 */ 0xe6ad9e, 0xe6ad9f, 0xe6ada0, 0xe6ada1,
+ /* 68 */ 0xe6ada8, 0xe6ada9, 0xe6adab, 0xe6adac,
+ /* 6c */ 0xe6adad, 0xe6adae, 0xe6adaf, 0xe6adb0,
+ /* 70 */ 0xe6adb1, 0xe6adb2, 0xe6adb3, 0xe6adb4,
+ /* 74 */ 0xe6adb5, 0xe6adb6, 0xe6adb7, 0xe6adb8,
+ /* 78 */ 0xe6adba, 0xe6adbd, 0xe6adbe, 0xe6adbf,
+ /* 7c */ 0xe6ae80, 0xe6ae85, 0xe6ae88, 0x000000,
+ /* 80 */ 0xe6ae8c, 0xe6ae8e, 0xe6ae8f, 0xe6ae90,
+ /* 84 */ 0xe6ae91, 0xe6ae94, 0xe6ae95, 0xe6ae97,
+ /* 88 */ 0xe6ae98, 0xe6ae99, 0xe6ae9c, 0xe6ae9d,
+ /* 8c */ 0xe6ae9e, 0xe6ae9f, 0xe6aea0, 0xe6aea2,
+ /* 90 */ 0xe6aea3, 0xe6aea4, 0xe6aea5, 0xe6aea6,
+ /* 94 */ 0xe6aea7, 0xe6aea8, 0xe6aea9, 0xe6aeab,
+ /* 98 */ 0xe6aeac, 0xe6aead, 0xe6aeae, 0xe6aeaf,
+ /* 9c */ 0xe6aeb0, 0xe6aeb1, 0xe6aeb2, 0xe6aeb6,
+ /* a0 */ 0xe6aeb8, 0xe6aeb9, 0xe6aeba, 0xe6aebb,
+ /* a4 */ 0xe6aebc, 0xe6aebd, 0xe6aebe, 0xe6af80,
+ /* a8 */ 0xe6af83, 0xe6af84, 0xe6af86, 0xe6af87,
+ /* ac */ 0xe6af88, 0xe6af89, 0xe6af8a, 0xe6af8c,
+ /* b0 */ 0xe6af8e, 0xe6af90, 0xe6af91, 0xe6af98,
+ /* b4 */ 0xe6af9a, 0xe6af9c, 0xe6af9d, 0xe6af9e,
+ /* b8 */ 0xe6af9f, 0xe6afa0, 0xe6afa2, 0xe6afa3,
+ /* bc */ 0xe6afa4, 0xe6afa5, 0xe6afa6, 0xe6afa7,
+ /* c0 */ 0xe6afa8, 0xe6afa9, 0xe6afac, 0xe6afad,
+ /* c4 */ 0xe6afae, 0xe6afb0, 0xe6afb1, 0xe6afb2,
+ /* c8 */ 0xe6afb4, 0xe6afb6, 0xe6afb7, 0xe6afb8,
+ /* cc */ 0xe6afba, 0xe6afbb, 0xe6afbc, 0xe6afbe,
+ /* d0 */ 0xe6afbf, 0xe6b080, 0xe6b081, 0xe6b082,
+ /* d4 */ 0xe6b083, 0xe6b084, 0xe6b088, 0xe6b089,
+ /* d8 */ 0xe6b08a, 0xe6b08b, 0xe6b08c, 0xe6b08e,
+ /* dc */ 0xe6b092, 0xe6b097, 0xe6b09c, 0xe6b09d,
+ /* e0 */ 0xe6b09e, 0xe6b0a0, 0xe6b0a3, 0xe6b0a5,
+ /* e4 */ 0xe6b0ab, 0xe6b0ac, 0xe6b0ad, 0xe6b0b1,
+ /* e8 */ 0xe6b0b3, 0xe6b0b6, 0xe6b0b7, 0xe6b0b9,
+ /* ec */ 0xe6b0ba, 0xe6b0bb, 0xe6b0bc, 0xe6b0be,
+ /* f0 */ 0xe6b0bf, 0xe6b183, 0xe6b184, 0xe6b185,
+ /* f4 */ 0xe6b188, 0xe6b18b, 0xe6b18c, 0xe6b18d,
+ /* f8 */ 0xe6b18e, 0xe6b18f, 0xe6b191, 0xe6b192,
+ /* fc */ 0xe6b193, 0xe6b196, 0xe6b198,
+
+ /*** Two byte table, leaf: 9bxx - offset 0x014a4 ***/
+
+ /* 40 */ 0xe6b199, 0xe6b19a, 0xe6b1a2, 0xe6b1a3,
+ /* 44 */ 0xe6b1a5, 0xe6b1a6, 0xe6b1a7, 0xe6b1ab,
+ /* 48 */ 0xe6b1ac, 0xe6b1ad, 0xe6b1ae, 0xe6b1af,
+ /* 4c */ 0xe6b1b1, 0xe6b1b3, 0xe6b1b5, 0xe6b1b7,
+ /* 50 */ 0xe6b1b8, 0xe6b1ba, 0xe6b1bb, 0xe6b1bc,
+ /* 54 */ 0xe6b1bf, 0xe6b280, 0xe6b284, 0xe6b287,
+ /* 58 */ 0xe6b28a, 0xe6b28b, 0xe6b28d, 0xe6b28e,
+ /* 5c */ 0xe6b291, 0xe6b292, 0xe6b295, 0xe6b296,
+ /* 60 */ 0xe6b297, 0xe6b298, 0xe6b29a, 0xe6b29c,
+ /* 64 */ 0xe6b29d, 0xe6b29e, 0xe6b2a0, 0xe6b2a2,
+ /* 68 */ 0xe6b2a8, 0xe6b2ac, 0xe6b2af, 0xe6b2b0,
+ /* 6c */ 0xe6b2b4, 0xe6b2b5, 0xe6b2b6, 0xe6b2b7,
+ /* 70 */ 0xe6b2ba, 0xe6b380, 0xe6b381, 0xe6b382,
+ /* 74 */ 0xe6b383, 0xe6b386, 0xe6b387, 0xe6b388,
+ /* 78 */ 0xe6b38b, 0xe6b38d, 0xe6b38e, 0xe6b38f,
+ /* 7c */ 0xe6b391, 0xe6b392, 0xe6b398, 0x000000,
+ /* 80 */ 0xe6b399, 0xe6b39a, 0xe6b39c, 0xe6b39d,
+ /* 84 */ 0xe6b39f, 0xe6b3a4, 0xe6b3a6, 0xe6b3a7,
+ /* 88 */ 0xe6b3a9, 0xe6b3ac, 0xe6b3ad, 0xe6b3b2,
+ /* 8c */ 0xe6b3b4, 0xe6b3b9, 0xe6b3bf, 0xe6b480,
+ /* 90 */ 0xe6b482, 0xe6b483, 0xe6b485, 0xe6b486,
+ /* 94 */ 0xe6b488, 0xe6b489, 0xe6b48a, 0xe6b48d,
+ /* 98 */ 0xe6b48f, 0xe6b490, 0xe6b491, 0xe6b493,
+ /* 9c */ 0xe6b494, 0xe6b495, 0xe6b496, 0xe6b498,
+ /* a0 */ 0xe6b49c, 0xe6b49d, 0xe6b49f, 0xe6b4a0,
+ /* a4 */ 0xe6b4a1, 0xe6b4a2, 0xe6b4a3, 0xe6b4a4,
+ /* a8 */ 0xe6b4a6, 0xe6b4a8, 0xe6b4a9, 0xe6b4ac,
+ /* ac */ 0xe6b4ad, 0xe6b4af, 0xe6b4b0, 0xe6b4b4,
+ /* b0 */ 0xe6b4b6, 0xe6b4b7, 0xe6b4b8, 0xe6b4ba,
+ /* b4 */ 0xe6b4bf, 0xe6b580, 0xe6b582, 0xe6b584,
+ /* b8 */ 0xe6b589, 0xe6b58c, 0xe6b590, 0xe6b595,
+ /* bc */ 0xe6b596, 0xe6b597, 0xe6b598, 0xe6b59b,
+ /* c0 */ 0xe6b59d, 0xe6b59f, 0xe6b5a1, 0xe6b5a2,
+ /* c4 */ 0xe6b5a4, 0xe6b5a5, 0xe6b5a7, 0xe6b5a8,
+ /* c8 */ 0xe6b5ab, 0xe6b5ac, 0xe6b5ad, 0xe6b5b0,
+ /* cc */ 0xe6b5b1, 0xe6b5b2, 0xe6b5b3, 0xe6b5b5,
+ /* d0 */ 0xe6b5b6, 0xe6b5b9, 0xe6b5ba, 0xe6b5bb,
+ /* d4 */ 0xe6b5bd, 0xe6b5be, 0xe6b5bf, 0xe6b680,
+ /* d8 */ 0xe6b681, 0xe6b683, 0xe6b684, 0xe6b686,
+ /* dc */ 0xe6b687, 0xe6b68a, 0xe6b68b, 0xe6b68d,
+ /* e0 */ 0xe6b68f, 0xe6b690, 0xe6b692, 0xe6b696,
+ /* e4 */ 0xe6b697, 0xe6b698, 0xe6b699, 0xe6b69a,
+ /* e8 */ 0xe6b69c, 0xe6b6a2, 0xe6b6a5, 0xe6b6ac,
+ /* ec */ 0xe6b6ad, 0xe6b6b0, 0xe6b6b1, 0xe6b6b3,
+ /* f0 */ 0xe6b6b4, 0xe6b6b6, 0xe6b6b7, 0xe6b6b9,
+ /* f4 */ 0xe6b6ba, 0xe6b6bb, 0xe6b6bc, 0xe6b6bd,
+ /* f8 */ 0xe6b6be, 0xe6b781, 0xe6b782, 0xe6b783,
+ /* fc */ 0xe6b788, 0xe6b789, 0xe6b78a,
+
+ /*** Two byte table, leaf: 9cxx - offset 0x01563 ***/
+
+ /* 40 */ 0xe6b78d, 0xe6b78e, 0xe6b78f, 0xe6b790,
+ /* 44 */ 0xe6b792, 0xe6b793, 0xe6b794, 0xe6b795,
+ /* 48 */ 0xe6b797, 0xe6b79a, 0xe6b79b, 0xe6b79c,
+ /* 4c */ 0xe6b79f, 0xe6b7a2, 0xe6b7a3, 0xe6b7a5,
+ /* 50 */ 0xe6b7a7, 0xe6b7a8, 0xe6b7a9, 0xe6b7aa,
+ /* 54 */ 0xe6b7ad, 0xe6b7af, 0xe6b7b0, 0xe6b7b2,
+ /* 58 */ 0xe6b7b4, 0xe6b7b5, 0xe6b7b6, 0xe6b7b8,
+ /* 5c */ 0xe6b7ba, 0xe6b7bd, 0xe6b7be, 0xe6b7bf,
+ /* 60 */ 0xe6b880, 0xe6b881, 0xe6b882, 0xe6b883,
+ /* 64 */ 0xe6b884, 0xe6b886, 0xe6b887, 0xe6b888,
+ /* 68 */ 0xe6b889, 0xe6b88b, 0xe6b88f, 0xe6b892,
+ /* 6c */ 0xe6b893, 0xe6b895, 0xe6b898, 0xe6b899,
+ /* 70 */ 0xe6b89b, 0xe6b89c, 0xe6b89e, 0xe6b89f,
+ /* 74 */ 0xe6b8a2, 0xe6b8a6, 0xe6b8a7, 0xe6b8a8,
+ /* 78 */ 0xe6b8aa, 0xe6b8ac, 0xe6b8ae, 0xe6b8b0,
+ /* 7c */ 0xe6b8b1, 0xe6b8b3, 0xe6b8b5, 0x000000,
+ /* 80 */ 0xe6b8b6, 0xe6b8b7, 0xe6b8b9, 0xe6b8bb,
+ /* 84 */ 0xe6b8bc, 0xe6b8bd, 0xe6b8be, 0xe6b8bf,
+ /* 88 */ 0xe6b980, 0xe6b981, 0xe6b982, 0xe6b985,
+ /* 8c */ 0xe6b986, 0xe6b987, 0xe6b988, 0xe6b989,
+ /* 90 */ 0xe6b98a, 0xe6b98b, 0xe6b98c, 0xe6b98f,
+ /* 94 */ 0xe6b990, 0xe6b991, 0xe6b992, 0xe6b995,
+ /* 98 */ 0xe6b997, 0xe6b999, 0xe6b99a, 0xe6b99c,
+ /* 9c */ 0xe6b99d, 0xe6b99e, 0xe6b9a0, 0xe6b9a1,
+ /* a0 */ 0xe6b9a2, 0xe6b9a3, 0xe6b9a4, 0xe6b9a5,
+ /* a4 */ 0xe6b9a6, 0xe6b9a7, 0xe6b9a8, 0xe6b9a9,
+ /* a8 */ 0xe6b9aa, 0xe6b9ac, 0xe6b9ad, 0xe6b9af,
+ /* ac */ 0xe6b9b0, 0xe6b9b1, 0xe6b9b2, 0xe6b9b3,
+ /* b0 */ 0xe6b9b4, 0xe6b9b5, 0xe6b9b6, 0xe6b9b7,
+ /* b4 */ 0xe6b9b8, 0xe6b9b9, 0xe6b9ba, 0xe6b9bb,
+ /* b8 */ 0xe6b9bc, 0xe6b9bd, 0xe6ba80, 0xe6ba81,
+ /* bc */ 0xe6ba82, 0xe6ba84, 0xe6ba87, 0xe6ba88,
+ /* c0 */ 0xe6ba8a, 0xe6ba8b, 0xe6ba8c, 0xe6ba8d,
+ /* c4 */ 0xe6ba8e, 0xe6ba91, 0xe6ba92, 0xe6ba93,
+ /* c8 */ 0xe6ba94, 0xe6ba95, 0xe6ba96, 0xe6ba97,
+ /* cc */ 0xe6ba99, 0xe6ba9a, 0xe6ba9b, 0xe6ba9d,
+ /* d0 */ 0xe6ba9e, 0xe6baa0, 0xe6baa1, 0xe6baa3,
+ /* d4 */ 0xe6baa4, 0xe6baa6, 0xe6baa8, 0xe6baa9,
+ /* d8 */ 0xe6baab, 0xe6baac, 0xe6baad, 0xe6baae,
+ /* dc */ 0xe6bab0, 0xe6bab3, 0xe6bab5, 0xe6bab8,
+ /* e0 */ 0xe6bab9, 0xe6babc, 0xe6babe, 0xe6babf,
+ /* e4 */ 0xe6bb80, 0xe6bb83, 0xe6bb84, 0xe6bb85,
+ /* e8 */ 0xe6bb86, 0xe6bb88, 0xe6bb89, 0xe6bb8a,
+ /* ec */ 0xe6bb8c, 0xe6bb8d, 0xe6bb8e, 0xe6bb90,
+ /* f0 */ 0xe6bb92, 0xe6bb96, 0xe6bb98, 0xe6bb99,
+ /* f4 */ 0xe6bb9b, 0xe6bb9c, 0xe6bb9d, 0xe6bba3,
+ /* f8 */ 0xe6bba7, 0xe6bbaa, 0xe6bbab, 0xe6bbac,
+ /* fc */ 0xe6bbad, 0xe6bbae, 0xe6bbaf,
+
+ /*** Two byte table, leaf: 9dxx - offset 0x01622 ***/
+
+ /* 40 */ 0xe6bbb0, 0xe6bbb1, 0xe6bbb2, 0xe6bbb3,
+ /* 44 */ 0xe6bbb5, 0xe6bbb6, 0xe6bbb7, 0xe6bbb8,
+ /* 48 */ 0xe6bbba, 0xe6bbbb, 0xe6bbbc, 0xe6bbbd,
+ /* 4c */ 0xe6bbbe, 0xe6bbbf, 0xe6bc80, 0xe6bc81,
+ /* 50 */ 0xe6bc83, 0xe6bc84, 0xe6bc85, 0xe6bc87,
+ /* 54 */ 0xe6bc88, 0xe6bc8a, 0xe6bc8b, 0xe6bc8c,
+ /* 58 */ 0xe6bc8d, 0xe6bc8e, 0xe6bc90, 0xe6bc91,
+ /* 5c */ 0xe6bc92, 0xe6bc96, 0xe6bc97, 0xe6bc98,
+ /* 60 */ 0xe6bc99, 0xe6bc9a, 0xe6bc9b, 0xe6bc9c,
+ /* 64 */ 0xe6bc9d, 0xe6bc9e, 0xe6bc9f, 0xe6bca1,
+ /* 68 */ 0xe6bca2, 0xe6bca3, 0xe6bca5, 0xe6bca6,
+ /* 6c */ 0xe6bca7, 0xe6bca8, 0xe6bcac, 0xe6bcae,
+ /* 70 */ 0xe6bcb0, 0xe6bcb2, 0xe6bcb4, 0xe6bcb5,
+ /* 74 */ 0xe6bcb7, 0xe6bcb8, 0xe6bcb9, 0xe6bcba,
+ /* 78 */ 0xe6bcbb, 0xe6bcbc, 0xe6bcbd, 0xe6bcbf,
+ /* 7c */ 0xe6bd80, 0xe6bd81, 0xe6bd82, 0x000000,
+ /* 80 */ 0xe6bd83, 0xe6bd84, 0xe6bd85, 0xe6bd88,
+ /* 84 */ 0xe6bd89, 0xe6bd8a, 0xe6bd8c, 0xe6bd8e,
+ /* 88 */ 0xe6bd8f, 0xe6bd90, 0xe6bd91, 0xe6bd92,
+ /* 8c */ 0xe6bd93, 0xe6bd94, 0xe6bd95, 0xe6bd96,
+ /* 90 */ 0xe6bd97, 0xe6bd99, 0xe6bd9a, 0xe6bd9b,
+ /* 94 */ 0xe6bd9d, 0xe6bd9f, 0xe6bda0, 0xe6bda1,
+ /* 98 */ 0xe6bda3, 0xe6bda4, 0xe6bda5, 0xe6bda7,
+ /* 9c */ 0xe6bda8, 0xe6bda9, 0xe6bdaa, 0xe6bdab,
+ /* a0 */ 0xe6bdac, 0xe6bdaf, 0xe6bdb0, 0xe6bdb1,
+ /* a4 */ 0xe6bdb3, 0xe6bdb5, 0xe6bdb6, 0xe6bdb7,
+ /* a8 */ 0xe6bdb9, 0xe6bdbb, 0xe6bdbd, 0xe6bdbe,
+ /* ac */ 0xe6bdbf, 0xe6be80, 0xe6be81, 0xe6be82,
+ /* b0 */ 0xe6be83, 0xe6be85, 0xe6be86, 0xe6be87,
+ /* b4 */ 0xe6be8a, 0xe6be8b, 0xe6be8f, 0xe6be90,
+ /* b8 */ 0xe6be91, 0xe6be92, 0xe6be93, 0xe6be94,
+ /* bc */ 0xe6be95, 0xe6be96, 0xe6be97, 0xe6be98,
+ /* c0 */ 0xe6be99, 0xe6be9a, 0xe6be9b, 0xe6be9d,
+ /* c4 */ 0xe6be9e, 0xe6be9f, 0xe6bea0, 0xe6bea2,
+ /* c8 */ 0xe6bea3, 0xe6bea4, 0xe6bea5, 0xe6bea6,
+ /* cc */ 0xe6bea8, 0xe6bea9, 0xe6beaa, 0xe6beab,
+ /* d0 */ 0xe6beac, 0xe6bead, 0xe6beae, 0xe6beaf,
+ /* d4 */ 0xe6beb0, 0xe6beb1, 0xe6beb2, 0xe6beb4,
+ /* d8 */ 0xe6beb5, 0xe6beb7, 0xe6beb8, 0xe6beba,
+ /* dc */ 0xe6bebb, 0xe6bebc, 0xe6bebd, 0xe6bebe,
+ /* e0 */ 0xe6bebf, 0xe6bf81, 0xe6bf83, 0xe6bf84,
+ /* e4 */ 0xe6bf85, 0xe6bf86, 0xe6bf87, 0xe6bf88,
+ /* e8 */ 0xe6bf8a, 0xe6bf8b, 0xe6bf8c, 0xe6bf8d,
+ /* ec */ 0xe6bf8e, 0xe6bf8f, 0xe6bf90, 0xe6bf93,
+ /* f0 */ 0xe6bf94, 0xe6bf95, 0xe6bf96, 0xe6bf97,
+ /* f4 */ 0xe6bf98, 0xe6bf99, 0xe6bf9a, 0xe6bf9b,
+ /* f8 */ 0xe6bf9c, 0xe6bf9d, 0xe6bf9f, 0xe6bfa2,
+ /* fc */ 0xe6bfa3, 0xe6bfa4, 0xe6bfa5,
+
+ /*** Two byte table, leaf: 9exx - offset 0x016e1 ***/
+
+ /* 40 */ 0xe6bfa6, 0xe6bfa7, 0xe6bfa8, 0xe6bfa9,
+ /* 44 */ 0xe6bfaa, 0xe6bfab, 0xe6bfac, 0xe6bfad,
+ /* 48 */ 0xe6bfb0, 0xe6bfb1, 0xe6bfb2, 0xe6bfb3,
+ /* 4c */ 0xe6bfb4, 0xe6bfb5, 0xe6bfb6, 0xe6bfb7,
+ /* 50 */ 0xe6bfb8, 0xe6bfb9, 0xe6bfba, 0xe6bfbb,
+ /* 54 */ 0xe6bfbc, 0xe6bfbd, 0xe6bfbe, 0xe6bfbf,
+ /* 58 */ 0xe78080, 0xe78081, 0xe78082, 0xe78083,
+ /* 5c */ 0xe78084, 0xe78085, 0xe78086, 0xe78087,
+ /* 60 */ 0xe78088, 0xe78089, 0xe7808a, 0xe7808b,
+ /* 64 */ 0xe7808c, 0xe7808d, 0xe7808e, 0xe7808f,
+ /* 68 */ 0xe78090, 0xe78092, 0xe78093, 0xe78094,
+ /* 6c */ 0xe78095, 0xe78096, 0xe78097, 0xe78098,
+ /* 70 */ 0xe78099, 0xe7809c, 0xe7809d, 0xe7809e,
+ /* 74 */ 0xe7809f, 0xe780a0, 0xe780a1, 0xe780a2,
+ /* 78 */ 0xe780a4, 0xe780a5, 0xe780a6, 0xe780a7,
+ /* 7c */ 0xe780a8, 0xe780a9, 0xe780aa, 0x000000,
+ /* 80 */ 0xe780ab, 0xe780ac, 0xe780ad, 0xe780ae,
+ /* 84 */ 0xe780af, 0xe780b0, 0xe780b1, 0xe780b2,
+ /* 88 */ 0xe780b3, 0xe780b4, 0xe780b6, 0xe780b7,
+ /* 8c */ 0xe780b8, 0xe780ba, 0xe780bb, 0xe780bc,
+ /* 90 */ 0xe780bd, 0xe780be, 0xe780bf, 0xe78180,
+ /* 94 */ 0xe78181, 0xe78182, 0xe78183, 0xe78184,
+ /* 98 */ 0xe78185, 0xe78186, 0xe78187, 0xe78188,
+ /* 9c */ 0xe78189, 0xe7818a, 0xe7818b, 0xe7818d,
+ /* a0 */ 0xe7818e, 0xe78190, 0xe78191, 0xe78192,
+ /* a4 */ 0xe78193, 0xe78194, 0xe78195, 0xe78196,
+ /* a8 */ 0xe78197, 0xe78198, 0xe78199, 0xe7819a,
+ /* ac */ 0xe7819b, 0xe7819c, 0xe7819d, 0xe7819f,
+ /* b0 */ 0xe781a0, 0xe781a1, 0xe781a2, 0xe781a3,
+ /* b4 */ 0xe781a4, 0xe781a5, 0xe781a6, 0xe781a7,
+ /* b8 */ 0xe781a8, 0xe781a9, 0xe781aa, 0xe781ae,
+ /* bc */ 0xe781b1, 0xe781b2, 0xe781b3, 0xe781b4,
+ /* c0 */ 0xe781b7, 0xe781b9, 0xe781ba, 0xe781bb,
+ /* c4 */ 0xe781bd, 0xe78281, 0xe78282, 0xe78283,
+ /* c8 */ 0xe78284, 0xe78286, 0xe78287, 0xe78288,
+ /* cc */ 0xe7828b, 0xe7828c, 0xe7828d, 0xe7828f,
+ /* d0 */ 0xe78290, 0xe78291, 0xe78293, 0xe78297,
+ /* d4 */ 0xe78298, 0xe7829a, 0xe7829b, 0xe7829e,
+ /* d8 */ 0xe7829f, 0xe782a0, 0xe782a1, 0xe782a2,
+ /* dc */ 0xe782a3, 0xe782a4, 0xe782a5, 0xe782a6,
+ /* e0 */ 0xe782a7, 0xe782a8, 0xe782a9, 0xe782aa,
+ /* e4 */ 0xe782b0, 0xe782b2, 0xe782b4, 0xe782b5,
+ /* e8 */ 0xe782b6, 0xe782ba, 0xe782be, 0xe782bf,
+ /* ec */ 0xe78384, 0xe78385, 0xe78386, 0xe78387,
+ /* f0 */ 0xe78389, 0xe7838b, 0xe7838c, 0xe7838d,
+ /* f4 */ 0xe7838e, 0xe7838f, 0xe78390, 0xe78391,
+ /* f8 */ 0xe78392, 0xe78393, 0xe78394, 0xe78395,
+ /* fc */ 0xe78396, 0xe78397, 0xe7839a,
+
+ /*** Two byte table, leaf: 9fxx - offset 0x017a0 ***/
+
+ /* 40 */ 0xe7839c, 0xe7839d, 0xe7839e, 0xe783a0,
+ /* 44 */ 0xe783a1, 0xe783a2, 0xe783a3, 0xe783a5,
+ /* 48 */ 0xe783aa, 0xe783ae, 0xe783b0, 0xe783b1,
+ /* 4c */ 0xe783b2, 0xe783b3, 0xe783b4, 0xe783b5,
+ /* 50 */ 0xe783b6, 0xe783b8, 0xe783ba, 0xe783bb,
+ /* 54 */ 0xe783bc, 0xe783be, 0xe783bf, 0xe78480,
+ /* 58 */ 0xe78481, 0xe78482, 0xe78483, 0xe78484,
+ /* 5c */ 0xe78485, 0xe78486, 0xe78487, 0xe78488,
+ /* 60 */ 0xe7848b, 0xe7848c, 0xe7848d, 0xe7848e,
+ /* 64 */ 0xe7848f, 0xe78491, 0xe78492, 0xe78494,
+ /* 68 */ 0xe78497, 0xe7849b, 0xe7849c, 0xe7849d,
+ /* 6c */ 0xe7849e, 0xe7849f, 0xe784a0, 0xe784a1,
+ /* 70 */ 0xe784a2, 0xe784a3, 0xe784a4, 0xe784a5,
+ /* 74 */ 0xe784a7, 0xe784a8, 0xe784a9, 0xe784aa,
+ /* 78 */ 0xe784ab, 0xe784ac, 0xe784ad, 0xe784ae,
+ /* 7c */ 0xe784b2, 0xe784b3, 0xe784b4, 0x000000,
+ /* 80 */ 0xe784b5, 0xe784b7, 0xe784b8, 0xe784b9,
+ /* 84 */ 0xe784ba, 0xe784bb, 0xe784bc, 0xe784bd,
+ /* 88 */ 0xe784be, 0xe784bf, 0xe78580, 0xe78581,
+ /* 8c */ 0xe78582, 0xe78583, 0xe78584, 0xe78586,
+ /* 90 */ 0xe78587, 0xe78588, 0xe78589, 0xe7858b,
+ /* 94 */ 0xe7858d, 0xe7858f, 0xe78590, 0xe78591,
+ /* 98 */ 0xe78592, 0xe78593, 0xe78594, 0xe78595,
+ /* 9c */ 0xe78596, 0xe78597, 0xe78598, 0xe78599,
+ /* a0 */ 0xe7859a, 0xe7859b, 0xe7859d, 0xe7859f,
+ /* a4 */ 0xe785a0, 0xe785a1, 0xe785a2, 0xe785a3,
+ /* a8 */ 0xe785a5, 0xe785a9, 0xe785aa, 0xe785ab,
+ /* ac */ 0xe785ac, 0xe785ad, 0xe785af, 0xe785b0,
+ /* b0 */ 0xe785b1, 0xe785b4, 0xe785b5, 0xe785b6,
+ /* b4 */ 0xe785b7, 0xe785b9, 0xe785bb, 0xe785bc,
+ /* b8 */ 0xe785be, 0xe785bf, 0xe78680, 0xe78681,
+ /* bc */ 0xe78682, 0xe78683, 0xe78685, 0xe78686,
+ /* c0 */ 0xe78687, 0xe78688, 0xe78689, 0xe7868b,
+ /* c4 */ 0xe7868c, 0xe7868d, 0xe7868e, 0xe78690,
+ /* c8 */ 0xe78691, 0xe78692, 0xe78693, 0xe78695,
+ /* cc */ 0xe78696, 0xe78697, 0xe7869a, 0xe7869b,
+ /* d0 */ 0xe7869c, 0xe7869d, 0xe7869e, 0xe786a1,
+ /* d4 */ 0xe786a2, 0xe786a3, 0xe786a4, 0xe786a5,
+ /* d8 */ 0xe786a6, 0xe786a7, 0xe786a9, 0xe786aa,
+ /* dc */ 0xe786ab, 0xe786ad, 0xe786ae, 0xe786af,
+ /* e0 */ 0xe786b0, 0xe786b1, 0xe786b2, 0xe786b4,
+ /* e4 */ 0xe786b6, 0xe786b7, 0xe786b8, 0xe786ba,
+ /* e8 */ 0xe786bb, 0xe786bc, 0xe786bd, 0xe786be,
+ /* ec */ 0xe786bf, 0xe78780, 0xe78781, 0xe78782,
+ /* f0 */ 0xe78784, 0xe78785, 0xe78786, 0xe78787,
+ /* f4 */ 0xe78788, 0xe78789, 0xe7878a, 0xe7878b,
+ /* f8 */ 0xe7878c, 0xe7878d, 0xe7878f, 0xe78790,
+ /* fc */ 0xe78791, 0xe78792, 0xe78793,
+
+ /*** Two byte table, leaf: a0xx - offset 0x0185f ***/
+
+ /* 40 */ 0xe78796, 0xe78797, 0xe78798, 0xe78799,
+ /* 44 */ 0xe7879a, 0xe7879b, 0xe7879c, 0xe7879d,
+ /* 48 */ 0xe7879e, 0xe7879f, 0xe787a1, 0xe787a2,
+ /* 4c */ 0xe787a3, 0xe787a4, 0xe787a6, 0xe787a8,
+ /* 50 */ 0xe787a9, 0xe787aa, 0xe787ab, 0xe787ac,
+ /* 54 */ 0xe787ad, 0xe787af, 0xe787b0, 0xe787b1,
+ /* 58 */ 0xe787b2, 0xe787b3, 0xe787b4, 0xe787b5,
+ /* 5c */ 0xe787b6, 0xe787b7, 0xe787b8, 0xe787ba,
+ /* 60 */ 0xe787bb, 0xe787bc, 0xe787bd, 0xe787be,
+ /* 64 */ 0xe787bf, 0xe78880, 0xe78881, 0xe78882,
+ /* 68 */ 0xe78883, 0xe78884, 0xe78885, 0xe78887,
+ /* 6c */ 0xe78888, 0xe78889, 0xe7888a, 0xe7888b,
+ /* 70 */ 0xe7888c, 0xe7888d, 0xe7888e, 0xe7888f,
+ /* 74 */ 0xe78890, 0xe78891, 0xe78892, 0xe78893,
+ /* 78 */ 0xe78894, 0xe78895, 0xe78896, 0xe78897,
+ /* 7c */ 0xe78898, 0xe78899, 0xe7889a, 0x000000,
+ /* 80 */ 0xe7889b, 0xe7889c, 0xe7889e, 0xe7889f,
+ /* 84 */ 0xe788a0, 0xe788a1, 0xe788a2, 0xe788a3,
+ /* 88 */ 0xe788a4, 0xe788a5, 0xe788a6, 0xe788a7,
+ /* 8c */ 0xe788a9, 0xe788ab, 0xe788ad, 0xe788ae,
+ /* 90 */ 0xe788af, 0xe788b2, 0xe788b3, 0xe788b4,
+ /* 94 */ 0xe788ba, 0xe788bc, 0xe788be, 0xe78980,
+ /* 98 */ 0xe78981, 0xe78982, 0xe78983, 0xe78984,
+ /* 9c */ 0xe78985, 0xe78986, 0xe78989, 0xe7898a,
+ /* a0 */ 0xe7898b, 0xe7898e, 0xe7898f, 0xe78990,
+ /* a4 */ 0xe78991, 0xe78993, 0xe78994, 0xe78995,
+ /* a8 */ 0xe78997, 0xe78998, 0xe7899a, 0xe7899c,
+ /* ac */ 0xe7899e, 0xe789a0, 0xe789a3, 0xe789a4,
+ /* b0 */ 0xe789a5, 0xe789a8, 0xe789aa, 0xe789ab,
+ /* b4 */ 0xe789ac, 0xe789ad, 0xe789b0, 0xe789b1,
+ /* b8 */ 0xe789b3, 0xe789b4, 0xe789b6, 0xe789b7,
+ /* bc */ 0xe789b8, 0xe789bb, 0xe789bc, 0xe789bd,
+ /* c0 */ 0xe78a82, 0xe78a83, 0xe78a85, 0xe78a86,
+ /* c4 */ 0xe78a87, 0xe78a88, 0xe78a89, 0xe78a8c,
+ /* c8 */ 0xe78a8e, 0xe78a90, 0xe78a91, 0xe78a93,
+ /* cc */ 0xe78a94, 0xe78a95, 0xe78a96, 0xe78a97,
+ /* d0 */ 0xe78a98, 0xe78a99, 0xe78a9a, 0xe78a9b,
+ /* d4 */ 0xe78a9c, 0xe78a9d, 0xe78a9e, 0xe78aa0,
+ /* d8 */ 0xe78aa1, 0xe78aa2, 0xe78aa3, 0xe78aa4,
+ /* dc */ 0xe78aa5, 0xe78aa6, 0xe78aa7, 0xe78aa8,
+ /* e0 */ 0xe78aa9, 0xe78aaa, 0xe78aab, 0xe78aae,
+ /* e4 */ 0xe78ab1, 0xe78ab2, 0xe78ab3, 0xe78ab5,
+ /* e8 */ 0xe78aba, 0xe78abb, 0xe78abc, 0xe78abd,
+ /* ec */ 0xe78abe, 0xe78abf, 0xe78b80, 0xe78b85,
+ /* f0 */ 0xe78b86, 0xe78b87, 0xe78b89, 0xe78b8a,
+ /* f4 */ 0xe78b8b, 0xe78b8c, 0xe78b8f, 0xe78b91,
+ /* f8 */ 0xe78b93, 0xe78b94, 0xe78b95, 0xe78b96,
+ /* fc */ 0xe78b98, 0xe78b9a, 0xe78b9b,
+
+ /*** Two byte table, leaf: a1xx - offset 0x0191e ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe38080, 0xe38081, 0xe38082,
+ /* a4 */ 0x00c2b7, 0x00cb89, 0x00cb87, 0x00c2a8,
+ /* a8 */ 0xe38083, 0xe38085, 0xe28094, 0xefbd9e,
+ /* ac */ 0xe28096, 0xe280a6, 0xe28098, 0xe28099,
+ /* b0 */ 0xe2809c, 0xe2809d, 0xe38094, 0xe38095,
+ /* b4 */ 0xe38088, 0xe38089, 0xe3808a, 0xe3808b,
+ /* b8 */ 0xe3808c, 0xe3808d, 0xe3808e, 0xe3808f,
+ /* bc */ 0xe38096, 0xe38097, 0xe38090, 0xe38091,
+ /* c0 */ 0x00c2b1, 0x00c397, 0x00c3b7, 0xe288b6,
+ /* c4 */ 0xe288a7, 0xe288a8, 0xe28891, 0xe2888f,
+ /* c8 */ 0xe288aa, 0xe288a9, 0xe28888, 0xe288b7,
+ /* cc */ 0xe2889a, 0xe28aa5, 0xe288a5, 0xe288a0,
+ /* d0 */ 0xe28c92, 0xe28a99, 0xe288ab, 0xe288ae,
+ /* d4 */ 0xe289a1, 0xe2898c, 0xe28988, 0xe288bd,
+ /* d8 */ 0xe2889d, 0xe289a0, 0xe289ae, 0xe289af,
+ /* dc */ 0xe289a4, 0xe289a5, 0xe2889e, 0xe288b5,
+ /* e0 */ 0xe288b4, 0xe29982, 0xe29980, 0x00c2b0,
+ /* e4 */ 0xe280b2, 0xe280b3, 0xe28483, 0xefbc84,
+ /* e8 */ 0x00c2a4, 0xefbfa0, 0xefbfa1, 0xe280b0,
+ /* ec */ 0x00c2a7, 0xe28496, 0xe29886, 0xe29885,
+ /* f0 */ 0xe2978b, 0xe2978f, 0xe2978e, 0xe29787,
+ /* f4 */ 0xe29786, 0xe296a1, 0xe296a0, 0xe296b3,
+ /* f8 */ 0xe296b2, 0xe280bb, 0xe28692, 0xe28690,
+ /* fc */ 0xe28691, 0xe28693, 0xe38093,
+
+ /*** Two byte table, leaf: a2xx - offset 0x019dd ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe285b0, 0xe285b1, 0xe285b2,
+ /* a4 */ 0xe285b3, 0xe285b4, 0xe285b5, 0xe285b6,
+ /* a8 */ 0xe285b7, 0xe285b8, 0xe285b9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0xe29288, 0xe29289, 0xe2928a,
+ /* b4 */ 0xe2928b, 0xe2928c, 0xe2928d, 0xe2928e,
+ /* b8 */ 0xe2928f, 0xe29290, 0xe29291, 0xe29292,
+ /* bc */ 0xe29293, 0xe29294, 0xe29295, 0xe29296,
+ /* c0 */ 0xe29297, 0xe29298, 0xe29299, 0xe2929a,
+ /* c4 */ 0xe2929b, 0xe291b4, 0xe291b5, 0xe291b6,
+ /* c8 */ 0xe291b7, 0xe291b8, 0xe291b9, 0xe291ba,
+ /* cc */ 0xe291bb, 0xe291bc, 0xe291bd, 0xe291be,
+ /* d0 */ 0xe291bf, 0xe29280, 0xe29281, 0xe29282,
+ /* d4 */ 0xe29283, 0xe29284, 0xe29285, 0xe29286,
+ /* d8 */ 0xe29287, 0xe291a0, 0xe291a1, 0xe291a2,
+ /* dc */ 0xe291a3, 0xe291a4, 0xe291a5, 0xe291a6,
+ /* e0 */ 0xe291a7, 0xe291a8, 0xe291a9, 0x000000,
+ /* e4 */ 0x000000, 0xe388a0, 0xe388a1, 0xe388a2,
+ /* e8 */ 0xe388a3, 0xe388a4, 0xe388a5, 0xe388a6,
+ /* ec */ 0xe388a7, 0xe388a8, 0xe388a9, 0x000000,
+ /* f0 */ 0x000000, 0xe285a0, 0xe285a1, 0xe285a2,
+ /* f4 */ 0xe285a3, 0xe285a4, 0xe285a5, 0xe285a6,
+ /* f8 */ 0xe285a7, 0xe285a8, 0xe285a9, 0xe285aa,
+ /* fc */ 0xe285ab,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a3xx - offset 0x01a9a ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xefbc81, 0xefbc82, 0xefbc83,
+ /* a4 */ 0xefbfa5, 0xefbc85, 0xefbc86, 0xefbc87,
+ /* a8 */ 0xefbc88, 0xefbc89, 0xefbc8a, 0xefbc8b,
+ /* ac */ 0xefbc8c, 0xefbc8d, 0xefbc8e, 0xefbc8f,
+ /* b0 */ 0xefbc90, 0xefbc91, 0xefbc92, 0xefbc93,
+ /* b4 */ 0xefbc94, 0xefbc95, 0xefbc96, 0xefbc97,
+ /* b8 */ 0xefbc98, 0xefbc99, 0xefbc9a, 0xefbc9b,
+ /* bc */ 0xefbc9c, 0xefbc9d, 0xefbc9e, 0xefbc9f,
+ /* c0 */ 0xefbca0, 0xefbca1, 0xefbca2, 0xefbca3,
+ /* c4 */ 0xefbca4, 0xefbca5, 0xefbca6, 0xefbca7,
+ /* c8 */ 0xefbca8, 0xefbca9, 0xefbcaa, 0xefbcab,
+ /* cc */ 0xefbcac, 0xefbcad, 0xefbcae, 0xefbcaf,
+ /* d0 */ 0xefbcb0, 0xefbcb1, 0xefbcb2, 0xefbcb3,
+ /* d4 */ 0xefbcb4, 0xefbcb5, 0xefbcb6, 0xefbcb7,
+ /* d8 */ 0xefbcb8, 0xefbcb9, 0xefbcba, 0xefbcbb,
+ /* dc */ 0xefbcbc, 0xefbcbd, 0xefbcbe, 0xefbcbf,
+ /* e0 */ 0xefbd80, 0xefbd81, 0xefbd82, 0xefbd83,
+ /* e4 */ 0xefbd84, 0xefbd85, 0xefbd86, 0xefbd87,
+ /* e8 */ 0xefbd88, 0xefbd89, 0xefbd8a, 0xefbd8b,
+ /* ec */ 0xefbd8c, 0xefbd8d, 0xefbd8e, 0xefbd8f,
+ /* f0 */ 0xefbd90, 0xefbd91, 0xefbd92, 0xefbd93,
+ /* f4 */ 0xefbd94, 0xefbd95, 0xefbd96, 0xefbd97,
+ /* f8 */ 0xefbd98, 0xefbd99, 0xefbd9a, 0xefbd9b,
+ /* fc */ 0xefbd9c, 0xefbd9d, 0xefbfa3,
+
+ /*** Two byte table, leaf: a4xx - offset 0x01b59 ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe38181, 0xe38182, 0xe38183,
+ /* a4 */ 0xe38184, 0xe38185, 0xe38186, 0xe38187,
+ /* a8 */ 0xe38188, 0xe38189, 0xe3818a, 0xe3818b,
+ /* ac */ 0xe3818c, 0xe3818d, 0xe3818e, 0xe3818f,
+ /* b0 */ 0xe38190, 0xe38191, 0xe38192, 0xe38193,
+ /* b4 */ 0xe38194, 0xe38195, 0xe38196, 0xe38197,
+ /* b8 */ 0xe38198, 0xe38199, 0xe3819a, 0xe3819b,
+ /* bc */ 0xe3819c, 0xe3819d, 0xe3819e, 0xe3819f,
+ /* c0 */ 0xe381a0, 0xe381a1, 0xe381a2, 0xe381a3,
+ /* c4 */ 0xe381a4, 0xe381a5, 0xe381a6, 0xe381a7,
+ /* c8 */ 0xe381a8, 0xe381a9, 0xe381aa, 0xe381ab,
+ /* cc */ 0xe381ac, 0xe381ad, 0xe381ae, 0xe381af,
+ /* d0 */ 0xe381b0, 0xe381b1, 0xe381b2, 0xe381b3,
+ /* d4 */ 0xe381b4, 0xe381b5, 0xe381b6, 0xe381b7,
+ /* d8 */ 0xe381b8, 0xe381b9, 0xe381ba, 0xe381bb,
+ /* dc */ 0xe381bc, 0xe381bd, 0xe381be, 0xe381bf,
+ /* e0 */ 0xe38280, 0xe38281, 0xe38282, 0xe38283,
+ /* e4 */ 0xe38284, 0xe38285, 0xe38286, 0xe38287,
+ /* e8 */ 0xe38288, 0xe38289, 0xe3828a, 0xe3828b,
+ /* ec */ 0xe3828c, 0xe3828d, 0xe3828e, 0xe3828f,
+ /* f0 */ 0xe38290, 0xe38291, 0xe38292, 0xe38293,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a5xx - offset 0x01c0d ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0xe382a1, 0xe382a2, 0xe382a3,
+ /* a4 */ 0xe382a4, 0xe382a5, 0xe382a6, 0xe382a7,
+ /* a8 */ 0xe382a8, 0xe382a9, 0xe382aa, 0xe382ab,
+ /* ac */ 0xe382ac, 0xe382ad, 0xe382ae, 0xe382af,
+ /* b0 */ 0xe382b0, 0xe382b1, 0xe382b2, 0xe382b3,
+ /* b4 */ 0xe382b4, 0xe382b5, 0xe382b6, 0xe382b7,
+ /* b8 */ 0xe382b8, 0xe382b9, 0xe382ba, 0xe382bb,
+ /* bc */ 0xe382bc, 0xe382bd, 0xe382be, 0xe382bf,
+ /* c0 */ 0xe38380, 0xe38381, 0xe38382, 0xe38383,
+ /* c4 */ 0xe38384, 0xe38385, 0xe38386, 0xe38387,
+ /* c8 */ 0xe38388, 0xe38389, 0xe3838a, 0xe3838b,
+ /* cc */ 0xe3838c, 0xe3838d, 0xe3838e, 0xe3838f,
+ /* d0 */ 0xe38390, 0xe38391, 0xe38392, 0xe38393,
+ /* d4 */ 0xe38394, 0xe38395, 0xe38396, 0xe38397,
+ /* d8 */ 0xe38398, 0xe38399, 0xe3839a, 0xe3839b,
+ /* dc */ 0xe3839c, 0xe3839d, 0xe3839e, 0xe3839f,
+ /* e0 */ 0xe383a0, 0xe383a1, 0xe383a2, 0xe383a3,
+ /* e4 */ 0xe383a4, 0xe383a5, 0xe383a6, 0xe383a7,
+ /* e8 */ 0xe383a8, 0xe383a9, 0xe383aa, 0xe383ab,
+ /* ec */ 0xe383ac, 0xe383ad, 0xe383ae, 0xe383af,
+ /* f0 */ 0xe383b0, 0xe383b1, 0xe383b2, 0xe383b3,
+ /* f4 */ 0xe383b4, 0xe383b5, 0xe383b6,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a6xx - offset 0x01cc4 ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00ce91, 0x00ce92, 0x00ce93,
+ /* a4 */ 0x00ce94, 0x00ce95, 0x00ce96, 0x00ce97,
+ /* a8 */ 0x00ce98, 0x00ce99, 0x00ce9a, 0x00ce9b,
+ /* ac */ 0x00ce9c, 0x00ce9d, 0x00ce9e, 0x00ce9f,
+ /* b0 */ 0x00cea0, 0x00cea1, 0x00cea3, 0x00cea4,
+ /* b4 */ 0x00cea5, 0x00cea6, 0x00cea7, 0x00cea8,
+ /* b8 */ 0x00cea9, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x00ceb1, 0x00ceb2, 0x00ceb3,
+ /* c4 */ 0x00ceb4, 0x00ceb5, 0x00ceb6, 0x00ceb7,
+ /* c8 */ 0x00ceb8, 0x00ceb9, 0x00ceba, 0x00cebb,
+ /* cc */ 0x00cebc, 0x00cebd, 0x00cebe, 0x00cebf,
+ /* d0 */ 0x00cf80, 0x00cf81, 0x00cf83, 0x00cf84,
+ /* d4 */ 0x00cf85, 0x00cf86, 0x00cf87, 0x00cf88,
+ /* d8 */ 0x00cf89, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0xefb8b5, 0xefb8b6, 0xefb8b9, 0xefb8ba,
+ /* e4 */ 0xefb8bf, 0xefb980, 0xefb8bd, 0xefb8be,
+ /* e8 */ 0xefb981, 0xefb982, 0xefb983, 0xefb984,
+ /* ec */ 0x000000, 0x000000, 0xefb8bb, 0xefb8bc,
+ /* f0 */ 0xefb8b7, 0xefb8b8, 0xefb8b1, 0x000000,
+ /* f4 */ 0xefb8b3, 0xefb8b4,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a7xx - offset 0x01d7a ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00d090, 0x00d091, 0x00d092,
+ /* a4 */ 0x00d093, 0x00d094, 0x00d095, 0x00d081,
+ /* a8 */ 0x00d096, 0x00d097, 0x00d098, 0x00d099,
+ /* ac */ 0x00d09a, 0x00d09b, 0x00d09c, 0x00d09d,
+ /* b0 */ 0x00d09e, 0x00d09f, 0x00d0a0, 0x00d0a1,
+ /* b4 */ 0x00d0a2, 0x00d0a3, 0x00d0a4, 0x00d0a5,
+ /* b8 */ 0x00d0a6, 0x00d0a7, 0x00d0a8, 0x00d0a9,
+ /* bc */ 0x00d0aa, 0x00d0ab, 0x00d0ac, 0x00d0ad,
+ /* c0 */ 0x00d0ae, 0x00d0af, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x00d0b0, 0x00d0b1, 0x00d0b2,
+ /* d4 */ 0x00d0b3, 0x00d0b4, 0x00d0b5, 0x00d191,
+ /* d8 */ 0x00d0b6, 0x00d0b7, 0x00d0b8, 0x00d0b9,
+ /* dc */ 0x00d0ba, 0x00d0bb, 0x00d0bc, 0x00d0bd,
+ /* e0 */ 0x00d0be, 0x00d0bf, 0x00d180, 0x00d181,
+ /* e4 */ 0x00d182, 0x00d183, 0x00d184, 0x00d185,
+ /* e8 */ 0x00d186, 0x00d187, 0x00d188, 0x00d189,
+ /* ec */ 0x00d18a, 0x00d18b, 0x00d18c, 0x00d18d,
+ /* f0 */ 0x00d18e, 0x00d18f, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a8xx - offset 0x01e39 ***/
+
+ /* 40 */ 0x00cb8a, 0x00cb8b, 0x00cb99, 0xe28093,
+ /* 44 */ 0xe28095, 0xe280a5, 0xe280b5, 0xe28485,
+ /* 48 */ 0xe28489, 0xe28696, 0xe28697, 0xe28698,
+ /* 4c */ 0xe28699, 0xe28895, 0xe2889f, 0xe288a3,
+ /* 50 */ 0xe28992, 0xe289a6, 0xe289a7, 0xe28abf,
+ /* 54 */ 0xe29590, 0xe29591, 0xe29592, 0xe29593,
+ /* 58 */ 0xe29594, 0xe29595, 0xe29596, 0xe29597,
+ /* 5c */ 0xe29598, 0xe29599, 0xe2959a, 0xe2959b,
+ /* 60 */ 0xe2959c, 0xe2959d, 0xe2959e, 0xe2959f,
+ /* 64 */ 0xe295a0, 0xe295a1, 0xe295a2, 0xe295a3,
+ /* 68 */ 0xe295a4, 0xe295a5, 0xe295a6, 0xe295a7,
+ /* 6c */ 0xe295a8, 0xe295a9, 0xe295aa, 0xe295ab,
+ /* 70 */ 0xe295ac, 0xe295ad, 0xe295ae, 0xe295af,
+ /* 74 */ 0xe295b0, 0xe295b1, 0xe295b2, 0xe295b3,
+ /* 78 */ 0xe29681, 0xe29682, 0xe29683, 0xe29684,
+ /* 7c */ 0xe29685, 0xe29686, 0xe29687, 0x000000,
+ /* 80 */ 0xe29688, 0xe29689, 0xe2968a, 0xe2968b,
+ /* 84 */ 0xe2968c, 0xe2968d, 0xe2968e, 0xe2968f,
+ /* 88 */ 0xe29693, 0xe29694, 0xe29695, 0xe296bc,
+ /* 8c */ 0xe296bd, 0xe297a2, 0xe297a3, 0xe297a4,
+ /* 90 */ 0xe297a5, 0xe29889, 0xe28a95, 0xe38092,
+ /* 94 */ 0xe3809d, 0xe3809e, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00c481, 0x00c3a1, 0x00c78e,
+ /* a4 */ 0x00c3a0, 0x00c493, 0x00c3a9, 0x00c49b,
+ /* a8 */ 0x00c3a8, 0x00c4ab, 0x00c3ad, 0x00c790,
+ /* ac */ 0x00c3ac, 0x00c58d, 0x00c3b3, 0x00c792,
+ /* b0 */ 0x00c3b2, 0x00c5ab, 0x00c3ba, 0x00c794,
+ /* b4 */ 0x00c3b9, 0x00c796, 0x00c798, 0x00c79a,
+ /* b8 */ 0x00c79c, 0x00c3bc, 0x00c3aa, 0x00c991,
+ /* bc */ 0x000000, 0x00c584, 0x00c588, 0x000000,
+ /* c0 */ 0x00c9a1, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0xe38485, 0xe38486, 0xe38487,
+ /* c8 */ 0xe38488, 0xe38489, 0xe3848a, 0xe3848b,
+ /* cc */ 0xe3848c, 0xe3848d, 0xe3848e, 0xe3848f,
+ /* d0 */ 0xe38490, 0xe38491, 0xe38492, 0xe38493,
+ /* d4 */ 0xe38494, 0xe38495, 0xe38496, 0xe38497,
+ /* d8 */ 0xe38498, 0xe38499, 0xe3849a, 0xe3849b,
+ /* dc */ 0xe3849c, 0xe3849d, 0xe3849e, 0xe3849f,
+ /* e0 */ 0xe384a0, 0xe384a1, 0xe384a2, 0xe384a3,
+ /* e4 */ 0xe384a4, 0xe384a5, 0xe384a6, 0xe384a7,
+ /* e8 */ 0xe384a8, 0xe384a9, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a9xx - offset 0x01ef8 ***/
+
+ /* 40 */ 0xe380a1, 0xe380a2, 0xe380a3, 0xe380a4,
+ /* 44 */ 0xe380a5, 0xe380a6, 0xe380a7, 0xe380a8,
+ /* 48 */ 0xe380a9, 0xe38aa3, 0xe38e8e, 0xe38e8f,
+ /* 4c */ 0xe38e9c, 0xe38e9d, 0xe38e9e, 0xe38ea1,
+ /* 50 */ 0xe38f84, 0xe38f8e, 0xe38f91, 0xe38f92,
+ /* 54 */ 0xe38f95, 0xefb8b0, 0xefbfa2, 0xefbfa4,
+ /* 58 */ 0x000000, 0xe284a1, 0xe388b1, 0x000000,
+ /* 5c */ 0xe28090, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0xe383bc, 0xe3829b, 0xe3829c, 0xe383bd,
+ /* 64 */ 0xe383be, 0xe38086, 0xe3829d, 0xe3829e,
+ /* 68 */ 0xefb989, 0xefb98a, 0xefb98b, 0xefb98c,
+ /* 6c */ 0xefb98d, 0xefb98e, 0xefb98f, 0xefb990,
+ /* 70 */ 0xefb991, 0xefb992, 0xefb994, 0xefb995,
+ /* 74 */ 0xefb996, 0xefb997, 0xefb999, 0xefb99a,
+ /* 78 */ 0xefb99b, 0xefb99c, 0xefb99d, 0xefb99e,
+ /* 7c */ 0xefb99f, 0xefb9a0, 0xefb9a1, 0x000000,
+ /* 80 */ 0xefb9a2, 0xefb9a3, 0xefb9a4, 0xefb9a5,
+ /* 84 */ 0xefb9a6, 0xefb9a8, 0xefb9a9, 0xefb9aa,
+ /* 88 */ 0xefb9ab, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0xe38087, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0xe29480, 0xe29481, 0xe29482, 0xe29483,
+ /* a8 */ 0xe29484, 0xe29485, 0xe29486, 0xe29487,
+ /* ac */ 0xe29488, 0xe29489, 0xe2948a, 0xe2948b,
+ /* b0 */ 0xe2948c, 0xe2948d, 0xe2948e, 0xe2948f,
+ /* b4 */ 0xe29490, 0xe29491, 0xe29492, 0xe29493,
+ /* b8 */ 0xe29494, 0xe29495, 0xe29496, 0xe29497,
+ /* bc */ 0xe29498, 0xe29499, 0xe2949a, 0xe2949b,
+ /* c0 */ 0xe2949c, 0xe2949d, 0xe2949e, 0xe2949f,
+ /* c4 */ 0xe294a0, 0xe294a1, 0xe294a2, 0xe294a3,
+ /* c8 */ 0xe294a4, 0xe294a5, 0xe294a6, 0xe294a7,
+ /* cc */ 0xe294a8, 0xe294a9, 0xe294aa, 0xe294ab,
+ /* d0 */ 0xe294ac, 0xe294ad, 0xe294ae, 0xe294af,
+ /* d4 */ 0xe294b0, 0xe294b1, 0xe294b2, 0xe294b3,
+ /* d8 */ 0xe294b4, 0xe294b5, 0xe294b6, 0xe294b7,
+ /* dc */ 0xe294b8, 0xe294b9, 0xe294ba, 0xe294bb,
+ /* e0 */ 0xe294bc, 0xe294bd, 0xe294be, 0xe294bf,
+ /* e4 */ 0xe29580, 0xe29581, 0xe29582, 0xe29583,
+ /* e8 */ 0xe29584, 0xe29585, 0xe29586, 0xe29587,
+ /* ec */ 0xe29588, 0xe29589, 0xe2958a, 0xe2958b,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: aaxx - offset 0x01fb7 ***/
+
+ /* 40 */ 0xe78b9c, 0xe78b9d, 0xe78b9f, 0xe78ba2,
+ /* 44 */ 0xe78ba3, 0xe78ba4, 0xe78ba5, 0xe78ba6,
+ /* 48 */ 0xe78ba7, 0xe78baa, 0xe78bab, 0xe78bb5,
+ /* 4c */ 0xe78bb6, 0xe78bb9, 0xe78bbd, 0xe78bbe,
+ /* 50 */ 0xe78bbf, 0xe78c80, 0xe78c82, 0xe78c84,
+ /* 54 */ 0xe78c85, 0xe78c86, 0xe78c87, 0xe78c88,
+ /* 58 */ 0xe78c89, 0xe78c8b, 0xe78c8c, 0xe78c8d,
+ /* 5c */ 0xe78c8f, 0xe78c90, 0xe78c91, 0xe78c92,
+ /* 60 */ 0xe78c94, 0xe78c98, 0xe78c99, 0xe78c9a,
+ /* 64 */ 0xe78c9f, 0xe78ca0, 0xe78ca3, 0xe78ca4,
+ /* 68 */ 0xe78ca6, 0xe78ca7, 0xe78ca8, 0xe78cad,
+ /* 6c */ 0xe78caf, 0xe78cb0, 0xe78cb2, 0xe78cb3,
+ /* 70 */ 0xe78cb5, 0xe78cb6, 0xe78cba, 0xe78cbb,
+ /* 74 */ 0xe78cbc, 0xe78cbd, 0xe78d80, 0xe78d81,
+ /* 78 */ 0xe78d82, 0xe78d83, 0xe78d84, 0xe78d85,
+ /* 7c */ 0xe78d86, 0xe78d87, 0xe78d88, 0x000000,
+ /* 80 */ 0xe78d89, 0xe78d8a, 0xe78d8b, 0xe78d8c,
+ /* 84 */ 0xe78d8e, 0xe78d8f, 0xe78d91, 0xe78d93,
+ /* 88 */ 0xe78d94, 0xe78d95, 0xe78d96, 0xe78d98,
+ /* 8c */ 0xe78d99, 0xe78d9a, 0xe78d9b, 0xe78d9c,
+ /* 90 */ 0xe78d9d, 0xe78d9e, 0xe78d9f, 0xe78da1,
+ /* 94 */ 0xe78da2, 0xe78da3, 0xe78da4, 0xe78da5,
+ /* 98 */ 0xe78da6, 0xe78da7, 0xe78da8, 0xe78da9,
+ /* 9c */ 0xe78daa, 0xe78dab, 0xe78dae, 0xe78db0,
+ /* a0 */ 0xe78db1, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: abxx - offset 0x02076 ***/
+
+ /* 40 */ 0xe78db2, 0xe78db3, 0xe78db4, 0xe78db5,
+ /* 44 */ 0xe78db6, 0xe78db7, 0xe78db8, 0xe78db9,
+ /* 48 */ 0xe78dba, 0xe78dbb, 0xe78dbc, 0xe78dbd,
+ /* 4c */ 0xe78dbf, 0xe78e80, 0xe78e81, 0xe78e82,
+ /* 50 */ 0xe78e83, 0xe78e85, 0xe78e86, 0xe78e88,
+ /* 54 */ 0xe78e8a, 0xe78e8c, 0xe78e8d, 0xe78e8f,
+ /* 58 */ 0xe78e90, 0xe78e92, 0xe78e93, 0xe78e94,
+ /* 5c */ 0xe78e95, 0xe78e97, 0xe78e98, 0xe78e99,
+ /* 60 */ 0xe78e9a, 0xe78e9c, 0xe78e9d, 0xe78e9e,
+ /* 64 */ 0xe78ea0, 0xe78ea1, 0xe78ea3, 0xe78ea4,
+ /* 68 */ 0xe78ea5, 0xe78ea6, 0xe78ea7, 0xe78ea8,
+ /* 6c */ 0xe78eaa, 0xe78eac, 0xe78ead, 0xe78eb1,
+ /* 70 */ 0xe78eb4, 0xe78eb5, 0xe78eb6, 0xe78eb8,
+ /* 74 */ 0xe78eb9, 0xe78ebc, 0xe78ebd, 0xe78ebe,
+ /* 78 */ 0xe78ebf, 0xe78f81, 0xe78f83, 0xe78f84,
+ /* 7c */ 0xe78f85, 0xe78f86, 0xe78f87, 0x000000,
+ /* 80 */ 0xe78f8b, 0xe78f8c, 0xe78f8e, 0xe78f92,
+ /* 84 */ 0xe78f93, 0xe78f94, 0xe78f95, 0xe78f96,
+ /* 88 */ 0xe78f97, 0xe78f98, 0xe78f9a, 0xe78f9b,
+ /* 8c */ 0xe78f9c, 0xe78f9d, 0xe78f9f, 0xe78fa1,
+ /* 90 */ 0xe78fa2, 0xe78fa3, 0xe78fa4, 0xe78fa6,
+ /* 94 */ 0xe78fa8, 0xe78faa, 0xe78fab, 0xe78fac,
+ /* 98 */ 0xe78fae, 0xe78faf, 0xe78fb0, 0xe78fb1,
+ /* 9c */ 0xe78fb3, 0xe78fb4, 0xe78fb5, 0xe78fb6,
+ /* a0 */ 0xe78fb7, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: acxx - offset 0x02135 ***/
+
+ /* 40 */ 0xe78fb8, 0xe78fb9, 0xe78fba, 0xe78fbb,
+ /* 44 */ 0xe78fbc, 0xe78fbd, 0xe78fbe, 0xe78fbf,
+ /* 48 */ 0xe79080, 0xe79081, 0xe79082, 0xe79084,
+ /* 4c */ 0xe79087, 0xe79088, 0xe7908b, 0xe7908c,
+ /* 50 */ 0xe7908d, 0xe7908e, 0xe79091, 0xe79092,
+ /* 54 */ 0xe79093, 0xe79094, 0xe79095, 0xe79096,
+ /* 58 */ 0xe79097, 0xe79098, 0xe79099, 0xe7909c,
+ /* 5c */ 0xe7909d, 0xe7909e, 0xe7909f, 0xe790a0,
+ /* 60 */ 0xe790a1, 0xe790a3, 0xe790a4, 0xe790a7,
+ /* 64 */ 0xe790a9, 0xe790ab, 0xe790ad, 0xe790af,
+ /* 68 */ 0xe790b1, 0xe790b2, 0xe790b7, 0xe790b8,
+ /* 6c */ 0xe790b9, 0xe790ba, 0xe790bb, 0xe790bd,
+ /* 70 */ 0xe790be, 0xe790bf, 0xe79180, 0xe79182,
+ /* 74 */ 0xe79183, 0xe79184, 0xe79185, 0xe79186,
+ /* 78 */ 0xe79187, 0xe79188, 0xe79189, 0xe7918a,
+ /* 7c */ 0xe7918b, 0xe7918c, 0xe7918d, 0x000000,
+ /* 80 */ 0xe7918e, 0xe7918f, 0xe79190, 0xe79191,
+ /* 84 */ 0xe79192, 0xe79193, 0xe79194, 0xe79196,
+ /* 88 */ 0xe79198, 0xe7919d, 0xe791a0, 0xe791a1,
+ /* 8c */ 0xe791a2, 0xe791a3, 0xe791a4, 0xe791a5,
+ /* 90 */ 0xe791a6, 0xe791a7, 0xe791a8, 0xe791a9,
+ /* 94 */ 0xe791aa, 0xe791ab, 0xe791ac, 0xe791ae,
+ /* 98 */ 0xe791af, 0xe791b1, 0xe791b2, 0xe791b3,
+ /* 9c */ 0xe791b4, 0xe791b5, 0xe791b8, 0xe791b9,
+ /* a0 */ 0xe791ba, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: adxx - offset 0x021f4 ***/
+
+ /* 40 */ 0xe791bb, 0xe791bc, 0xe791bd, 0xe791bf,
+ /* 44 */ 0xe79282, 0xe79284, 0xe79285, 0xe79286,
+ /* 48 */ 0xe79288, 0xe79289, 0xe7928a, 0xe7928c,
+ /* 4c */ 0xe7928d, 0xe7928f, 0xe79291, 0xe79292,
+ /* 50 */ 0xe79293, 0xe79294, 0xe79295, 0xe79296,
+ /* 54 */ 0xe79297, 0xe79298, 0xe79299, 0xe7929a,
+ /* 58 */ 0xe7929b, 0xe7929d, 0xe7929f, 0xe792a0,
+ /* 5c */ 0xe792a1, 0xe792a2, 0xe792a3, 0xe792a4,
+ /* 60 */ 0xe792a5, 0xe792a6, 0xe792aa, 0xe792ab,
+ /* 64 */ 0xe792ac, 0xe792ad, 0xe792ae, 0xe792af,
+ /* 68 */ 0xe792b0, 0xe792b1, 0xe792b2, 0xe792b3,
+ /* 6c */ 0xe792b4, 0xe792b5, 0xe792b6, 0xe792b7,
+ /* 70 */ 0xe792b8, 0xe792b9, 0xe792bb, 0xe792bc,
+ /* 74 */ 0xe792bd, 0xe792be, 0xe792bf, 0xe79380,
+ /* 78 */ 0xe79381, 0xe79382, 0xe79383, 0xe79384,
+ /* 7c */ 0xe79385, 0xe79386, 0xe79387, 0x000000,
+ /* 80 */ 0xe79388, 0xe79389, 0xe7938a, 0xe7938b,
+ /* 84 */ 0xe7938c, 0xe7938d, 0xe7938e, 0xe7938f,
+ /* 88 */ 0xe79390, 0xe79391, 0xe79393, 0xe79394,
+ /* 8c */ 0xe79395, 0xe79396, 0xe79397, 0xe79398,
+ /* 90 */ 0xe79399, 0xe7939a, 0xe7939b, 0xe7939d,
+ /* 94 */ 0xe7939f, 0xe793a1, 0xe793a5, 0xe793a7,
+ /* 98 */ 0xe793a8, 0xe793a9, 0xe793aa, 0xe793ab,
+ /* 9c */ 0xe793ac, 0xe793ad, 0xe793b0, 0xe793b1,
+ /* a0 */ 0xe793b2, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: aexx - offset 0x022b3 ***/
+
+ /* 40 */ 0xe793b3, 0xe793b5, 0xe793b8, 0xe793b9,
+ /* 44 */ 0xe793ba, 0xe793bb, 0xe793bc, 0xe793bd,
+ /* 48 */ 0xe793be, 0xe79480, 0xe79481, 0xe79482,
+ /* 4c */ 0xe79483, 0xe79485, 0xe79486, 0xe79487,
+ /* 50 */ 0xe79488, 0xe79489, 0xe7948a, 0xe7948b,
+ /* 54 */ 0xe7948c, 0xe7948e, 0xe79490, 0xe79492,
+ /* 58 */ 0xe79494, 0xe79495, 0xe79496, 0xe79497,
+ /* 5c */ 0xe7949b, 0xe7949d, 0xe7949e, 0xe794a0,
+ /* 60 */ 0xe794a1, 0xe794a2, 0xe794a3, 0xe794a4,
+ /* 64 */ 0xe794a6, 0xe794a7, 0xe794aa, 0xe794ae,
+ /* 68 */ 0xe794b4, 0xe794b6, 0xe794b9, 0xe794bc,
+ /* 6c */ 0xe794bd, 0xe794bf, 0xe79581, 0xe79582,
+ /* 70 */ 0xe79583, 0xe79584, 0xe79586, 0xe79587,
+ /* 74 */ 0xe79589, 0xe7958a, 0xe7958d, 0xe79590,
+ /* 78 */ 0xe79591, 0xe79592, 0xe79593, 0xe79595,
+ /* 7c */ 0xe79596, 0xe79597, 0xe79598, 0x000000,
+ /* 80 */ 0xe7959d, 0xe7959e, 0xe7959f, 0xe795a0,
+ /* 84 */ 0xe795a1, 0xe795a2, 0xe795a3, 0xe795a4,
+ /* 88 */ 0xe795a7, 0xe795a8, 0xe795a9, 0xe795ab,
+ /* 8c */ 0xe795ac, 0xe795ad, 0xe795ae, 0xe795af,
+ /* 90 */ 0xe795b0, 0xe795b1, 0xe795b3, 0xe795b5,
+ /* 94 */ 0xe795b6, 0xe795b7, 0xe795ba, 0xe795bb,
+ /* 98 */ 0xe795bc, 0xe795bd, 0xe795be, 0xe79680,
+ /* 9c */ 0xe79681, 0xe79682, 0xe79684, 0xe79685,
+ /* a0 */ 0xe79687, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: afxx - offset 0x02372 ***/
+
+ /* 40 */ 0xe79688, 0xe79689, 0xe7968a, 0xe7968c,
+ /* 44 */ 0xe7968d, 0xe7968e, 0xe79690, 0xe79693,
+ /* 48 */ 0xe79695, 0xe79698, 0xe7969b, 0xe7969c,
+ /* 4c */ 0xe7969e, 0xe796a2, 0xe796a6, 0xe796a7,
+ /* 50 */ 0xe796a8, 0xe796a9, 0xe796aa, 0xe796ad,
+ /* 54 */ 0xe796b6, 0xe796b7, 0xe796ba, 0xe796bb,
+ /* 58 */ 0xe796bf, 0xe79780, 0xe79781, 0xe79786,
+ /* 5c */ 0xe7978b, 0xe7978c, 0xe7978e, 0xe7978f,
+ /* 60 */ 0xe79790, 0xe79791, 0xe79793, 0xe79797,
+ /* 64 */ 0xe79799, 0xe7979a, 0xe7979c, 0xe7979d,
+ /* 68 */ 0xe7979f, 0xe797a0, 0xe797a1, 0xe797a5,
+ /* 6c */ 0xe797a9, 0xe797ac, 0xe797ad, 0xe797ae,
+ /* 70 */ 0xe797af, 0xe797b2, 0xe797b3, 0xe797b5,
+ /* 74 */ 0xe797b6, 0xe797b7, 0xe797b8, 0xe797ba,
+ /* 78 */ 0xe797bb, 0xe797bd, 0xe797be, 0xe79882,
+ /* 7c */ 0xe79884, 0xe79886, 0xe79887, 0x000000,
+ /* 80 */ 0xe79888, 0xe79889, 0xe7988b, 0xe7988d,
+ /* 84 */ 0xe7988e, 0xe7988f, 0xe79891, 0xe79892,
+ /* 88 */ 0xe79893, 0xe79894, 0xe79896, 0xe7989a,
+ /* 8c */ 0xe7989c, 0xe7989d, 0xe7989e, 0xe798a1,
+ /* 90 */ 0xe798a3, 0xe798a7, 0xe798a8, 0xe798ac,
+ /* 94 */ 0xe798ae, 0xe798af, 0xe798b1, 0xe798b2,
+ /* 98 */ 0xe798b6, 0xe798b7, 0xe798b9, 0xe798ba,
+ /* 9c */ 0xe798bb, 0xe798bd, 0xe79981, 0xe79982,
+ /* a0 */ 0xe79984, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: b0xx - offset 0x02431 ***/
+
+ /* 40 */ 0xe79985, 0xe79986, 0xe79987, 0xe79988,
+ /* 44 */ 0xe79989, 0xe7998a, 0xe7998b, 0xe7998e,
+ /* 48 */ 0xe7998f, 0xe79990, 0xe79991, 0xe79992,
+ /* 4c */ 0xe79993, 0xe79995, 0xe79997, 0xe79998,
+ /* 50 */ 0xe79999, 0xe7999a, 0xe7999b, 0xe7999d,
+ /* 54 */ 0xe7999f, 0xe799a0, 0xe799a1, 0xe799a2,
+ /* 58 */ 0xe799a4, 0xe799a5, 0xe799a6, 0xe799a7,
+ /* 5c */ 0xe799a8, 0xe799a9, 0xe799aa, 0xe799ac,
+ /* 60 */ 0xe799ad, 0xe799ae, 0xe799b0, 0xe799b1,
+ /* 64 */ 0xe799b2, 0xe799b3, 0xe799b4, 0xe799b5,
+ /* 68 */ 0xe799b6, 0xe799b7, 0xe799b9, 0xe799ba,
+ /* 6c */ 0xe799bc, 0xe799bf, 0xe79a80, 0xe79a81,
+ /* 70 */ 0xe79a83, 0xe79a85, 0xe79a89, 0xe79a8a,
+ /* 74 */ 0xe79a8c, 0xe79a8d, 0xe79a8f, 0xe79a90,
+ /* 78 */ 0xe79a92, 0xe79a94, 0xe79a95, 0xe79a97,
+ /* 7c */ 0xe79a98, 0xe79a9a, 0xe79a9b, 0x000000,
+ /* 80 */ 0xe79a9c, 0xe79a9d, 0xe79a9e, 0xe79a9f,
+ /* 84 */ 0xe79aa0, 0xe79aa1, 0xe79aa2, 0xe79aa3,
+ /* 88 */ 0xe79aa5, 0xe79aa6, 0xe79aa7, 0xe79aa8,
+ /* 8c */ 0xe79aa9, 0xe79aaa, 0xe79aab, 0xe79aac,
+ /* 90 */ 0xe79aad, 0xe79aaf, 0xe79ab0, 0xe79ab3,
+ /* 94 */ 0xe79ab5, 0xe79ab6, 0xe79ab7, 0xe79ab8,
+ /* 98 */ 0xe79ab9, 0xe79aba, 0xe79abb, 0xe79abc,
+ /* 9c */ 0xe79abd, 0xe79abe, 0xe79b80, 0xe79b81,
+ /* a0 */ 0xe79b83, 0xe5958a, 0xe998bf, 0xe59f83,
+ /* a4 */ 0xe68ca8, 0xe5938e, 0xe59489, 0xe59380,
+ /* a8 */ 0xe79a91, 0xe7998c, 0xe894bc, 0xe79fae,
+ /* ac */ 0xe889be, 0xe7a28d, 0xe788b1, 0xe99a98,
+ /* b0 */ 0xe99e8d, 0xe6b0a8, 0xe5ae89, 0xe4bfba,
+ /* b4 */ 0xe68c89, 0xe69a97, 0xe5b2b8, 0xe883ba,
+ /* b8 */ 0xe6a188, 0xe882ae, 0xe69882, 0xe79b8e,
+ /* bc */ 0xe587b9, 0xe69596, 0xe786ac, 0xe7bfb1,
+ /* c0 */ 0xe8a284, 0xe582b2, 0xe5a5a5, 0xe6878a,
+ /* c4 */ 0xe6beb3, 0xe88aad, 0xe68d8c, 0xe68992,
+ /* c8 */ 0xe58fad, 0xe590a7, 0xe7ac86, 0xe585ab,
+ /* cc */ 0xe796a4, 0xe5b7b4, 0xe68b94, 0xe8b78b,
+ /* d0 */ 0xe99db6, 0xe68a8a, 0xe88099, 0xe59d9d,
+ /* d4 */ 0xe99cb8, 0xe7bda2, 0xe788b8, 0xe799bd,
+ /* d8 */ 0xe69f8f, 0xe799be, 0xe69186, 0xe4bdb0,
+ /* dc */ 0xe8b4a5, 0xe68b9c, 0xe7a897, 0xe69691,
+ /* e0 */ 0xe78fad, 0xe690ac, 0xe689b3, 0xe888ac,
+ /* e4 */ 0xe9a281, 0xe69dbf, 0xe78988, 0xe689ae,
+ /* e8 */ 0xe68b8c, 0xe4bcb4, 0xe793a3, 0xe58d8a,
+ /* ec */ 0xe58a9e, 0xe7bb8a, 0xe982a6, 0xe5b8ae,
+ /* f0 */ 0xe6a286, 0xe6a69c, 0xe88680, 0xe7bb91,
+ /* f4 */ 0xe6a392, 0xe7a385, 0xe89a8c, 0xe99591,
+ /* f8 */ 0xe5828d, 0xe8b0a4, 0xe88b9e, 0xe8839e,
+ /* fc */ 0xe58c85, 0xe8a492, 0xe589a5,
+
+ /*** Two byte table, leaf: b1xx - offset 0x024f0 ***/
+
+ /* 40 */ 0xe79b84, 0xe79b87, 0xe79b89, 0xe79b8b,
+ /* 44 */ 0xe79b8c, 0xe79b93, 0xe79b95, 0xe79b99,
+ /* 48 */ 0xe79b9a, 0xe79b9c, 0xe79b9d, 0xe79b9e,
+ /* 4c */ 0xe79ba0, 0xe79ba1, 0xe79ba2, 0xe79ba3,
+ /* 50 */ 0xe79ba4, 0xe79ba6, 0xe79ba7, 0xe79ba8,
+ /* 54 */ 0xe79ba9, 0xe79baa, 0xe79bab, 0xe79bac,
+ /* 58 */ 0xe79bad, 0xe79bb0, 0xe79bb3, 0xe79bb5,
+ /* 5c */ 0xe79bb6, 0xe79bb7, 0xe79bba, 0xe79bbb,
+ /* 60 */ 0xe79bbd, 0xe79bbf, 0xe79c80, 0xe79c82,
+ /* 64 */ 0xe79c83, 0xe79c85, 0xe79c86, 0xe79c8a,
+ /* 68 */ 0xe79c8c, 0xe79c8e, 0xe79c8f, 0xe79c90,
+ /* 6c */ 0xe79c91, 0xe79c92, 0xe79c93, 0xe79c94,
+ /* 70 */ 0xe79c95, 0xe79c96, 0xe79c97, 0xe79c98,
+ /* 74 */ 0xe79c9b, 0xe79c9c, 0xe79c9d, 0xe79c9e,
+ /* 78 */ 0xe79ca1, 0xe79ca3, 0xe79ca4, 0xe79ca5,
+ /* 7c */ 0xe79ca7, 0xe79caa, 0xe79cab, 0x000000,
+ /* 80 */ 0xe79cac, 0xe79cae, 0xe79cb0, 0xe79cb1,
+ /* 84 */ 0xe79cb2, 0xe79cb3, 0xe79cb4, 0xe79cb9,
+ /* 88 */ 0xe79cbb, 0xe79cbd, 0xe79cbe, 0xe79cbf,
+ /* 8c */ 0xe79d82, 0xe79d84, 0xe79d85, 0xe79d86,
+ /* 90 */ 0xe79d88, 0xe79d89, 0xe79d8a, 0xe79d8b,
+ /* 94 */ 0xe79d8c, 0xe79d8d, 0xe79d8e, 0xe79d8f,
+ /* 98 */ 0xe79d92, 0xe79d93, 0xe79d94, 0xe79d95,
+ /* 9c */ 0xe79d96, 0xe79d97, 0xe79d98, 0xe79d99,
+ /* a0 */ 0xe79d9c, 0xe89684, 0xe99bb9, 0xe4bf9d,
+ /* a4 */ 0xe5a0a1, 0xe9a5b1, 0xe5ae9d, 0xe68ab1,
+ /* a8 */ 0xe68aa5, 0xe69ab4, 0xe8b1b9, 0xe9b28d,
+ /* ac */ 0xe78886, 0xe69daf, 0xe7a291, 0xe682b2,
+ /* b0 */ 0xe58d91, 0xe58c97, 0xe8be88, 0xe8838c,
+ /* b4 */ 0xe8b49d, 0xe992a1, 0xe5808d, 0xe78b88,
+ /* b8 */ 0xe5a487, 0xe683ab, 0xe78499, 0xe8a2ab,
+ /* bc */ 0xe5a594, 0xe88baf, 0xe69cac, 0xe7aca8,
+ /* c0 */ 0xe5b4a9, 0xe7bbb7, 0xe794ad, 0xe6b3b5,
+ /* c4 */ 0xe8b9a6, 0xe8bfb8, 0xe980bc, 0xe9bcbb,
+ /* c8 */ 0xe6af94, 0xe98499, 0xe7ac94, 0xe5bdbc,
+ /* cc */ 0xe7a2a7, 0xe89396, 0xe894bd, 0xe6af95,
+ /* d0 */ 0xe6af99, 0xe6af96, 0xe5b881, 0xe5ba87,
+ /* d4 */ 0xe797b9, 0xe997ad, 0xe6959d, 0xe5bc8a,
+ /* d8 */ 0xe5bf85, 0xe8be9f, 0xe5a381, 0xe88782,
+ /* dc */ 0xe981bf, 0xe9999b, 0xe99ead, 0xe8beb9,
+ /* e0 */ 0xe7bc96, 0xe8b4ac, 0xe68981, 0xe4bebf,
+ /* e4 */ 0xe58f98, 0xe58d9e, 0xe8bea8, 0xe8bea9,
+ /* e8 */ 0xe8beab, 0xe9818d, 0xe6a087, 0xe5bdaa,
+ /* ec */ 0xe88698, 0xe8a1a8, 0xe9b396, 0xe6868b,
+ /* f0 */ 0xe588ab, 0xe798aa, 0xe5bdac, 0xe6968c,
+ /* f4 */ 0xe6bf92, 0xe6bba8, 0xe5aebe, 0xe69188,
+ /* f8 */ 0xe585b5, 0xe586b0, 0xe69f84, 0xe4b899,
+ /* fc */ 0xe7a789, 0xe9a5bc, 0xe782b3,
+
+ /*** Two byte table, leaf: b2xx - offset 0x025af ***/
+
+ /* 40 */ 0xe79d9d, 0xe79d9e, 0xe79d9f, 0xe79da0,
+ /* 44 */ 0xe79da4, 0xe79da7, 0xe79da9, 0xe79daa,
+ /* 48 */ 0xe79dad, 0xe79dae, 0xe79daf, 0xe79db0,
+ /* 4c */ 0xe79db1, 0xe79db2, 0xe79db3, 0xe79db4,
+ /* 50 */ 0xe79db5, 0xe79db6, 0xe79db7, 0xe79db8,
+ /* 54 */ 0xe79dba, 0xe79dbb, 0xe79dbc, 0xe79e81,
+ /* 58 */ 0xe79e82, 0xe79e83, 0xe79e86, 0xe79e87,
+ /* 5c */ 0xe79e88, 0xe79e89, 0xe79e8a, 0xe79e8b,
+ /* 60 */ 0xe79e8f, 0xe79e90, 0xe79e93, 0xe79e94,
+ /* 64 */ 0xe79e95, 0xe79e96, 0xe79e97, 0xe79e98,
+ /* 68 */ 0xe79e99, 0xe79e9a, 0xe79e9b, 0xe79e9c,
+ /* 6c */ 0xe79e9d, 0xe79e9e, 0xe79ea1, 0xe79ea3,
+ /* 70 */ 0xe79ea4, 0xe79ea6, 0xe79ea8, 0xe79eab,
+ /* 74 */ 0xe79ead, 0xe79eae, 0xe79eaf, 0xe79eb1,
+ /* 78 */ 0xe79eb2, 0xe79eb4, 0xe79eb6, 0xe79eb7,
+ /* 7c */ 0xe79eb8, 0xe79eb9, 0xe79eba, 0x000000,
+ /* 80 */ 0xe79ebc, 0xe79ebe, 0xe79f80, 0xe79f81,
+ /* 84 */ 0xe79f82, 0xe79f83, 0xe79f84, 0xe79f85,
+ /* 88 */ 0xe79f86, 0xe79f87, 0xe79f88, 0xe79f89,
+ /* 8c */ 0xe79f8a, 0xe79f8b, 0xe79f8c, 0xe79f8e,
+ /* 90 */ 0xe79f8f, 0xe79f90, 0xe79f91, 0xe79f92,
+ /* 94 */ 0xe79f93, 0xe79f94, 0xe79f95, 0xe79f96,
+ /* 98 */ 0xe79f98, 0xe79f99, 0xe79f9a, 0xe79f9d,
+ /* 9c */ 0xe79f9e, 0xe79f9f, 0xe79fa0, 0xe79fa1,
+ /* a0 */ 0xe79fa4, 0xe79785, 0xe5b9b6, 0xe78ebb,
+ /* a4 */ 0xe88fa0, 0xe692ad, 0xe68ba8, 0xe992b5,
+ /* a8 */ 0xe6b3a2, 0xe58d9a, 0xe58b83, 0xe6908f,
+ /* ac */ 0xe99382, 0xe7ae94, 0xe4bcaf, 0xe5b89b,
+ /* b0 */ 0xe888b6, 0xe88496, 0xe8868a, 0xe6b8a4,
+ /* b4 */ 0xe6b38a, 0xe9a9b3, 0xe68d95, 0xe58d9c,
+ /* b8 */ 0xe593ba, 0xe8a1a5, 0xe59fa0, 0xe4b88d,
+ /* bc */ 0xe5b883, 0xe6ada5, 0xe7b0bf, 0xe983a8,
+ /* c0 */ 0xe68096, 0xe693a6, 0xe78c9c, 0xe8a381,
+ /* c4 */ 0xe69d90, 0xe6898d, 0xe8b4a2, 0xe79dac,
+ /* c8 */ 0xe8b8a9, 0xe98787, 0xe5bda9, 0xe88f9c,
+ /* cc */ 0xe894a1, 0xe9a490, 0xe58f82, 0xe89a95,
+ /* d0 */ 0xe6ae8b, 0xe683ad, 0xe683a8, 0xe781bf,
+ /* d4 */ 0xe88b8d, 0xe888b1, 0xe4bb93, 0xe6b2a7,
+ /* d8 */ 0xe8978f, 0xe6938d, 0xe7b399, 0xe6a7bd,
+ /* dc */ 0xe69bb9, 0xe88d89, 0xe58e95, 0xe7ad96,
+ /* e0 */ 0xe4bea7, 0xe5868c, 0xe6b58b, 0xe5b182,
+ /* e4 */ 0xe8b9ad, 0xe68f92, 0xe58f89, 0xe88cac,
+ /* e8 */ 0xe88cb6, 0xe69fa5, 0xe7a2b4, 0xe690bd,
+ /* ec */ 0xe5af9f, 0xe5b294, 0xe5b7ae, 0xe8afa7,
+ /* f0 */ 0xe68b86, 0xe69fb4, 0xe8b1ba, 0xe69080,
+ /* f4 */ 0xe68eba, 0xe89d89, 0xe9a68b, 0xe8b097,
+ /* f8 */ 0xe7bca0, 0xe993b2, 0xe4baa7, 0xe99890,
+ /* fc */ 0xe9a2a4, 0xe6988c, 0xe78c96,
+
+ /*** Two byte table, leaf: b3xx - offset 0x0266e ***/
+
+ /* 40 */ 0xe79fa6, 0xe79fa8, 0xe79faa, 0xe79faf,
+ /* 44 */ 0xe79fb0, 0xe79fb1, 0xe79fb2, 0xe79fb4,
+ /* 48 */ 0xe79fb5, 0xe79fb7, 0xe79fb9, 0xe79fba,
+ /* 4c */ 0xe79fbb, 0xe79fbc, 0xe7a083, 0xe7a084,
+ /* 50 */ 0xe7a085, 0xe7a086, 0xe7a087, 0xe7a088,
+ /* 54 */ 0xe7a08a, 0xe7a08b, 0xe7a08e, 0xe7a08f,
+ /* 58 */ 0xe7a090, 0xe7a093, 0xe7a095, 0xe7a099,
+ /* 5c */ 0xe7a09b, 0xe7a09e, 0xe7a0a0, 0xe7a0a1,
+ /* 60 */ 0xe7a0a2, 0xe7a0a4, 0xe7a0a8, 0xe7a0aa,
+ /* 64 */ 0xe7a0ab, 0xe7a0ae, 0xe7a0af, 0xe7a0b1,
+ /* 68 */ 0xe7a0b2, 0xe7a0b3, 0xe7a0b5, 0xe7a0b6,
+ /* 6c */ 0xe7a0bd, 0xe7a0bf, 0xe7a181, 0xe7a182,
+ /* 70 */ 0xe7a183, 0xe7a184, 0xe7a186, 0xe7a188,
+ /* 74 */ 0xe7a189, 0xe7a18a, 0xe7a18b, 0xe7a18d,
+ /* 78 */ 0xe7a18f, 0xe7a191, 0xe7a193, 0xe7a194,
+ /* 7c */ 0xe7a198, 0xe7a199, 0xe7a19a, 0x000000,
+ /* 80 */ 0xe7a19b, 0xe7a19c, 0xe7a19e, 0xe7a19f,
+ /* 84 */ 0xe7a1a0, 0xe7a1a1, 0xe7a1a2, 0xe7a1a3,
+ /* 88 */ 0xe7a1a4, 0xe7a1a5, 0xe7a1a6, 0xe7a1a7,
+ /* 8c */ 0xe7a1a8, 0xe7a1a9, 0xe7a1af, 0xe7a1b0,
+ /* 90 */ 0xe7a1b1, 0xe7a1b2, 0xe7a1b3, 0xe7a1b4,
+ /* 94 */ 0xe7a1b5, 0xe7a1b6, 0xe7a1b8, 0xe7a1b9,
+ /* 98 */ 0xe7a1ba, 0xe7a1bb, 0xe7a1bd, 0xe7a1be,
+ /* 9c */ 0xe7a1bf, 0xe7a280, 0xe7a281, 0xe7a282,
+ /* a0 */ 0xe7a283, 0xe59cba, 0xe5b09d, 0xe5b8b8,
+ /* a4 */ 0xe995bf, 0xe581bf, 0xe882a0, 0xe58e82,
+ /* a8 */ 0xe6959e, 0xe79585, 0xe594b1, 0xe580a1,
+ /* ac */ 0xe8b685, 0xe68a84, 0xe9929e, 0xe69c9d,
+ /* b0 */ 0xe598b2, 0xe6bdae, 0xe5b7a2, 0xe590b5,
+ /* b4 */ 0xe78292, 0xe8bda6, 0xe689af, 0xe692a4,
+ /* b8 */ 0xe68ea3, 0xe5bdbb, 0xe6be88, 0xe983b4,
+ /* bc */ 0xe887a3, 0xe8beb0, 0xe5b098, 0xe699a8,
+ /* c0 */ 0xe5bfb1, 0xe6b289, 0xe99988, 0xe8b681,
+ /* c4 */ 0xe8a1ac, 0xe69291, 0xe7a7b0, 0xe59f8e,
+ /* c8 */ 0xe6a999, 0xe68890, 0xe59188, 0xe4b998,
+ /* cc */ 0xe7a88b, 0xe683a9, 0xe6be84, 0xe8af9a,
+ /* d0 */ 0xe689bf, 0xe9809e, 0xe9aa8b, 0xe7a7a4,
+ /* d4 */ 0xe59083, 0xe797b4, 0xe68c81, 0xe58c99,
+ /* d8 */ 0xe6b1a0, 0xe8bf9f, 0xe5bc9b, 0xe9a9b0,
+ /* dc */ 0xe880bb, 0xe9bdbf, 0xe4be88, 0xe5b0ba,
+ /* e0 */ 0xe8b5a4, 0xe7bf85, 0xe696a5, 0xe782bd,
+ /* e4 */ 0xe58585, 0xe586b2, 0xe899ab, 0xe5b487,
+ /* e8 */ 0xe5aea0, 0xe68abd, 0xe985ac, 0xe795b4,
+ /* ec */ 0xe8b88c, 0xe7a8a0, 0xe68481, 0xe7adb9,
+ /* f0 */ 0xe4bb87, 0xe7bbb8, 0xe79e85, 0xe4b891,
+ /* f4 */ 0xe887ad, 0xe5889d, 0xe587ba, 0xe6a9b1,
+ /* f8 */ 0xe58ea8, 0xe8ba87, 0xe99484, 0xe99b8f,
+ /* fc */ 0xe6bb81, 0xe999a4, 0xe6a59a,
+
+ /*** Two byte table, leaf: b4xx - offset 0x0272d ***/
+
+ /* 40 */ 0xe7a284, 0xe7a285, 0xe7a286, 0xe7a288,
+ /* 44 */ 0xe7a28a, 0xe7a28b, 0xe7a28f, 0xe7a290,
+ /* 48 */ 0xe7a292, 0xe7a294, 0xe7a295, 0xe7a296,
+ /* 4c */ 0xe7a299, 0xe7a29d, 0xe7a29e, 0xe7a2a0,
+ /* 50 */ 0xe7a2a2, 0xe7a2a4, 0xe7a2a6, 0xe7a2a8,
+ /* 54 */ 0xe7a2a9, 0xe7a2aa, 0xe7a2ab, 0xe7a2ac,
+ /* 58 */ 0xe7a2ad, 0xe7a2ae, 0xe7a2af, 0xe7a2b5,
+ /* 5c */ 0xe7a2b6, 0xe7a2b7, 0xe7a2b8, 0xe7a2ba,
+ /* 60 */ 0xe7a2bb, 0xe7a2bc, 0xe7a2bd, 0xe7a2bf,
+ /* 64 */ 0xe7a380, 0xe7a382, 0xe7a383, 0xe7a384,
+ /* 68 */ 0xe7a386, 0xe7a387, 0xe7a388, 0xe7a38c,
+ /* 6c */ 0xe7a38d, 0xe7a38e, 0xe7a38f, 0xe7a391,
+ /* 70 */ 0xe7a392, 0xe7a393, 0xe7a396, 0xe7a397,
+ /* 74 */ 0xe7a398, 0xe7a39a, 0xe7a39b, 0xe7a39c,
+ /* 78 */ 0xe7a39d, 0xe7a39e, 0xe7a39f, 0xe7a3a0,
+ /* 7c */ 0xe7a3a1, 0xe7a3a2, 0xe7a3a3, 0x000000,
+ /* 80 */ 0xe7a3a4, 0xe7a3a5, 0xe7a3a6, 0xe7a3a7,
+ /* 84 */ 0xe7a3a9, 0xe7a3aa, 0xe7a3ab, 0xe7a3ad,
+ /* 88 */ 0xe7a3ae, 0xe7a3af, 0xe7a3b0, 0xe7a3b1,
+ /* 8c */ 0xe7a3b3, 0xe7a3b5, 0xe7a3b6, 0xe7a3b8,
+ /* 90 */ 0xe7a3b9, 0xe7a3bb, 0xe7a3bc, 0xe7a3bd,
+ /* 94 */ 0xe7a3be, 0xe7a3bf, 0xe7a480, 0xe7a482,
+ /* 98 */ 0xe7a483, 0xe7a484, 0xe7a486, 0xe7a487,
+ /* 9c */ 0xe7a488, 0xe7a489, 0xe7a48a, 0xe7a48b,
+ /* a0 */ 0xe7a48c, 0xe7a180, 0xe582a8, 0xe79f97,
+ /* a4 */ 0xe69090, 0xe8a7a6, 0xe5a484, 0xe68fa3,
+ /* a8 */ 0xe5b79d, 0xe7a9bf, 0xe6a4bd, 0xe4bca0,
+ /* ac */ 0xe888b9, 0xe59698, 0xe4b8b2, 0xe796ae,
+ /* b0 */ 0xe7aa97, 0xe5b9a2, 0xe5ba8a, 0xe997af,
+ /* b4 */ 0xe5889b, 0xe590b9, 0xe7828a, 0xe68db6,
+ /* b8 */ 0xe994a4, 0xe59e82, 0xe698a5, 0xe6a4bf,
+ /* bc */ 0xe98687, 0xe59487, 0xe6b7b3, 0xe7baaf,
+ /* c0 */ 0xe8a0a2, 0xe688b3, 0xe7bbb0, 0xe796b5,
+ /* c4 */ 0xe88ca8, 0xe7a381, 0xe99b8c, 0xe8be9e,
+ /* c8 */ 0xe68588, 0xe793b7, 0xe8af8d, 0xe6ada4,
+ /* cc */ 0xe588ba, 0xe8b590, 0xe6aca1, 0xe881aa,
+ /* d0 */ 0xe891b1, 0xe59bb1, 0xe58c86, 0xe4bb8e,
+ /* d4 */ 0xe4b89b, 0xe58791, 0xe7b297, 0xe9868b,
+ /* d8 */ 0xe7b087, 0xe4bf83, 0xe8b9bf, 0xe7afa1,
+ /* dc */ 0xe7aa9c, 0xe691a7, 0xe5b494, 0xe582ac,
+ /* e0 */ 0xe88486, 0xe79881, 0xe7b2b9, 0xe6b7ac,
+ /* e4 */ 0xe7bfa0, 0xe69d91, 0xe5ad98, 0xe5afb8,
+ /* e8 */ 0xe7a38b, 0xe692ae, 0xe69093, 0xe68eaa,
+ /* ec */ 0xe68cab, 0xe99499, 0xe690ad, 0xe8bebe,
+ /* f0 */ 0xe7ad94, 0xe798a9, 0xe68993, 0xe5a4a7,
+ /* f4 */ 0xe59186, 0xe6adb9, 0xe582a3, 0xe688b4,
+ /* f8 */ 0xe5b8a6, 0xe6ae86, 0xe4bba3, 0xe8b4b7,
+ /* fc */ 0xe8a28b, 0xe5be85, 0xe980ae,
+
+ /*** Two byte table, leaf: b5xx - offset 0x027ec ***/
+
+ /* 40 */ 0xe7a48d, 0xe7a48e, 0xe7a48f, 0xe7a490,
+ /* 44 */ 0xe7a491, 0xe7a492, 0xe7a494, 0xe7a495,
+ /* 48 */ 0xe7a496, 0xe7a497, 0xe7a498, 0xe7a499,
+ /* 4c */ 0xe7a49a, 0xe7a49b, 0xe7a49c, 0xe7a49d,
+ /* 50 */ 0xe7a49f, 0xe7a4a0, 0xe7a4a1, 0xe7a4a2,
+ /* 54 */ 0xe7a4a3, 0xe7a4a5, 0xe7a4a6, 0xe7a4a7,
+ /* 58 */ 0xe7a4a8, 0xe7a4a9, 0xe7a4aa, 0xe7a4ab,
+ /* 5c */ 0xe7a4ac, 0xe7a4ad, 0xe7a4ae, 0xe7a4af,
+ /* 60 */ 0xe7a4b0, 0xe7a4b1, 0xe7a4b2, 0xe7a4b3,
+ /* 64 */ 0xe7a4b5, 0xe7a4b6, 0xe7a4b7, 0xe7a4b8,
+ /* 68 */ 0xe7a4b9, 0xe7a4bd, 0xe7a4bf, 0xe7a582,
+ /* 6c */ 0xe7a583, 0xe7a584, 0xe7a585, 0xe7a587,
+ /* 70 */ 0xe7a58a, 0xe7a58b, 0xe7a58c, 0xe7a58d,
+ /* 74 */ 0xe7a58e, 0xe7a58f, 0xe7a590, 0xe7a591,
+ /* 78 */ 0xe7a592, 0xe7a594, 0xe7a595, 0xe7a598,
+ /* 7c */ 0xe7a599, 0xe7a5a1, 0xe7a5a3, 0x000000,
+ /* 80 */ 0xe7a5a4, 0xe7a5a6, 0xe7a5a9, 0xe7a5aa,
+ /* 84 */ 0xe7a5ab, 0xe7a5ac, 0xe7a5ae, 0xe7a5b0,
+ /* 88 */ 0xe7a5b1, 0xe7a5b2, 0xe7a5b3, 0xe7a5b4,
+ /* 8c */ 0xe7a5b5, 0xe7a5b6, 0xe7a5b9, 0xe7a5bb,
+ /* 90 */ 0xe7a5bc, 0xe7a5bd, 0xe7a5be, 0xe7a5bf,
+ /* 94 */ 0xe7a682, 0xe7a683, 0xe7a686, 0xe7a687,
+ /* 98 */ 0xe7a688, 0xe7a689, 0xe7a68b, 0xe7a68c,
+ /* 9c */ 0xe7a68d, 0xe7a68e, 0xe7a690, 0xe7a691,
+ /* a0 */ 0xe7a692, 0xe680a0, 0xe880bd, 0xe68b85,
+ /* a4 */ 0xe4b8b9, 0xe58d95, 0xe983b8, 0xe68eb8,
+ /* a8 */ 0xe88386, 0xe697a6, 0xe6b0ae, 0xe4bd86,
+ /* ac */ 0xe683ae, 0xe6b7a1, 0xe8af9e, 0xe5bcb9,
+ /* b0 */ 0xe89b8b, 0xe5bd93, 0xe68ca1, 0xe5859a,
+ /* b4 */ 0xe88da1, 0xe6a1a3, 0xe58880, 0xe68da3,
+ /* b8 */ 0xe8b988, 0xe58092, 0xe5b29b, 0xe7a5b7,
+ /* bc */ 0xe5afbc, 0xe588b0, 0xe7a8bb, 0xe682bc,
+ /* c0 */ 0xe98193, 0xe79b97, 0xe5beb7, 0xe5be97,
+ /* c4 */ 0xe79a84, 0xe8b9ac, 0xe781af, 0xe799bb,
+ /* c8 */ 0xe7ad89, 0xe79eaa, 0xe587b3, 0xe98293,
+ /* cc */ 0xe5a0a4, 0xe4bd8e, 0xe6bbb4, 0xe8bfaa,
+ /* d0 */ 0xe6958c, 0xe7ac9b, 0xe78b84, 0xe6b6a4,
+ /* d4 */ 0xe7bf9f, 0xe5aba1, 0xe68ab5, 0xe5ba95,
+ /* d8 */ 0xe59cb0, 0xe89282, 0xe7acac, 0xe5b89d,
+ /* dc */ 0xe5bc9f, 0xe98092, 0xe7bc94, 0xe9a2a0,
+ /* e0 */ 0xe68e82, 0xe6bb87, 0xe7a298, 0xe782b9,
+ /* e4 */ 0xe585b8, 0xe99d9b, 0xe59eab, 0xe794b5,
+ /* e8 */ 0xe4bd83, 0xe794b8, 0xe5ba97, 0xe683a6,
+ /* ec */ 0xe5a5a0, 0xe6b780, 0xe6aebf, 0xe7a289,
+ /* f0 */ 0xe58fbc, 0xe99b95, 0xe5878b, 0xe58881,
+ /* f4 */ 0xe68e89, 0xe5908a, 0xe99293, 0xe8b083,
+ /* f8 */ 0xe8b78c, 0xe788b9, 0xe7a29f, 0xe89db6,
+ /* fc */ 0xe8bfad, 0xe8b08d, 0xe58fa0,
+
+ /*** Two byte table, leaf: b6xx - offset 0x028ab ***/
+
+ /* 40 */ 0xe7a693, 0xe7a694, 0xe7a695, 0xe7a696,
+ /* 44 */ 0xe7a697, 0xe7a698, 0xe7a699, 0xe7a69b,
+ /* 48 */ 0xe7a69c, 0xe7a69d, 0xe7a69e, 0xe7a69f,
+ /* 4c */ 0xe7a6a0, 0xe7a6a1, 0xe7a6a2, 0xe7a6a3,
+ /* 50 */ 0xe7a6a4, 0xe7a6a5, 0xe7a6a6, 0xe7a6a8,
+ /* 54 */ 0xe7a6a9, 0xe7a6aa, 0xe7a6ab, 0xe7a6ac,
+ /* 58 */ 0xe7a6ad, 0xe7a6ae, 0xe7a6af, 0xe7a6b0,
+ /* 5c */ 0xe7a6b1, 0xe7a6b2, 0xe7a6b4, 0xe7a6b5,
+ /* 60 */ 0xe7a6b6, 0xe7a6b7, 0xe7a6b8, 0xe7a6bc,
+ /* 64 */ 0xe7a6bf, 0xe7a782, 0xe7a784, 0xe7a785,
+ /* 68 */ 0xe7a787, 0xe7a788, 0xe7a78a, 0xe7a78c,
+ /* 6c */ 0xe7a78e, 0xe7a78f, 0xe7a790, 0xe7a793,
+ /* 70 */ 0xe7a794, 0xe7a796, 0xe7a797, 0xe7a799,
+ /* 74 */ 0xe7a79a, 0xe7a79b, 0xe7a79c, 0xe7a79d,
+ /* 78 */ 0xe7a79e, 0xe7a7a0, 0xe7a7a1, 0xe7a7a2,
+ /* 7c */ 0xe7a7a5, 0xe7a7a8, 0xe7a7aa, 0x000000,
+ /* 80 */ 0xe7a7ac, 0xe7a7ae, 0xe7a7b1, 0xe7a7b2,
+ /* 84 */ 0xe7a7b3, 0xe7a7b4, 0xe7a7b5, 0xe7a7b6,
+ /* 88 */ 0xe7a7b7, 0xe7a7b9, 0xe7a7ba, 0xe7a7bc,
+ /* 8c */ 0xe7a7be, 0xe7a7bf, 0xe7a881, 0xe7a884,
+ /* 90 */ 0xe7a885, 0xe7a887, 0xe7a888, 0xe7a889,
+ /* 94 */ 0xe7a88a, 0xe7a88c, 0xe7a88f, 0xe7a890,
+ /* 98 */ 0xe7a891, 0xe7a892, 0xe7a893, 0xe7a895,
+ /* 9c */ 0xe7a896, 0xe7a898, 0xe7a899, 0xe7a89b,
+ /* a0 */ 0xe7a89c, 0xe4b881, 0xe79baf, 0xe58fae,
+ /* a4 */ 0xe99289, 0xe9a1b6, 0xe9bc8e, 0xe994ad,
+ /* a8 */ 0xe5ae9a, 0xe8aea2, 0xe4b8a2, 0xe4b89c,
+ /* ac */ 0xe586ac, 0xe891a3, 0xe68782, 0xe58aa8,
+ /* b0 */ 0xe6a08b, 0xe4be97, 0xe681ab, 0xe586bb,
+ /* b4 */ 0xe6b49e, 0xe5859c, 0xe68a96, 0xe69697,
+ /* b8 */ 0xe999a1, 0xe8b186, 0xe98097, 0xe79798,
+ /* bc */ 0xe983bd, 0xe79da3, 0xe6af92, 0xe78a8a,
+ /* c0 */ 0xe78bac, 0xe8afbb, 0xe5a0b5, 0xe79db9,
+ /* c4 */ 0xe8b58c, 0xe69d9c, 0xe99580, 0xe8829a,
+ /* c8 */ 0xe5baa6, 0xe6b8a1, 0xe5a692, 0xe7abaf,
+ /* cc */ 0xe79fad, 0xe994bb, 0xe6aeb5, 0xe696ad,
+ /* d0 */ 0xe7bc8e, 0xe5a086, 0xe58591, 0xe9989f,
+ /* d4 */ 0xe5afb9, 0xe5a2a9, 0xe590a8, 0xe8b9b2,
+ /* d8 */ 0xe695a6, 0xe9a1bf, 0xe59ba4, 0xe9929d,
+ /* dc */ 0xe79bbe, 0xe98181, 0xe68e87, 0xe59386,
+ /* e0 */ 0xe5a49a, 0xe5a4ba, 0xe59e9b, 0xe8bab2,
+ /* e4 */ 0xe69cb5, 0xe8b7ba, 0xe888b5, 0xe58981,
+ /* e8 */ 0xe683b0, 0xe5a095, 0xe89bbe, 0xe5b3a8,
+ /* ec */ 0xe9b985, 0xe4bf84, 0xe9a29d, 0xe8aeb9,
+ /* f0 */ 0xe5a8a5, 0xe681b6, 0xe58e84, 0xe689bc,
+ /* f4 */ 0xe9818f, 0xe98482, 0xe9a5bf, 0xe681a9,
+ /* f8 */ 0xe8808c, 0xe584bf, 0xe880b3, 0xe5b094,
+ /* fc */ 0xe9a5b5, 0xe6b4b1, 0xe4ba8c,
+
+ /*** Two byte table, leaf: b7xx - offset 0x0296a ***/
+
+ /* 40 */ 0xe7a89d, 0xe7a89f, 0xe7a8a1, 0xe7a8a2,
+ /* 44 */ 0xe7a8a4, 0xe7a8a5, 0xe7a8a6, 0xe7a8a7,
+ /* 48 */ 0xe7a8a8, 0xe7a8a9, 0xe7a8aa, 0xe7a8ab,
+ /* 4c */ 0xe7a8ac, 0xe7a8ad, 0xe7a8ae, 0xe7a8af,
+ /* 50 */ 0xe7a8b0, 0xe7a8b1, 0xe7a8b2, 0xe7a8b4,
+ /* 54 */ 0xe7a8b5, 0xe7a8b6, 0xe7a8b8, 0xe7a8ba,
+ /* 58 */ 0xe7a8be, 0xe7a980, 0xe7a981, 0xe7a982,
+ /* 5c */ 0xe7a983, 0xe7a984, 0xe7a985, 0xe7a987,
+ /* 60 */ 0xe7a988, 0xe7a989, 0xe7a98a, 0xe7a98b,
+ /* 64 */ 0xe7a98c, 0xe7a98d, 0xe7a98e, 0xe7a98f,
+ /* 68 */ 0xe7a990, 0xe7a992, 0xe7a993, 0xe7a994,
+ /* 6c */ 0xe7a995, 0xe7a996, 0xe7a998, 0xe7a999,
+ /* 70 */ 0xe7a99a, 0xe7a99b, 0xe7a99c, 0xe7a99d,
+ /* 74 */ 0xe7a99e, 0xe7a99f, 0xe7a9a0, 0xe7a9a1,
+ /* 78 */ 0xe7a9a2, 0xe7a9a3, 0xe7a9a4, 0xe7a9a5,
+ /* 7c */ 0xe7a9a6, 0xe7a9a7, 0xe7a9a8, 0x000000,
+ /* 80 */ 0xe7a9a9, 0xe7a9aa, 0xe7a9ab, 0xe7a9ac,
+ /* 84 */ 0xe7a9ad, 0xe7a9ae, 0xe7a9af, 0xe7a9b1,
+ /* 88 */ 0xe7a9b2, 0xe7a9b3, 0xe7a9b5, 0xe7a9bb,
+ /* 8c */ 0xe7a9bc, 0xe7a9bd, 0xe7a9be, 0xe7aa82,
+ /* 90 */ 0xe7aa85, 0xe7aa87, 0xe7aa89, 0xe7aa8a,
+ /* 94 */ 0xe7aa8b, 0xe7aa8c, 0xe7aa8e, 0xe7aa8f,
+ /* 98 */ 0xe7aa90, 0xe7aa93, 0xe7aa94, 0xe7aa99,
+ /* 9c */ 0xe7aa9a, 0xe7aa9b, 0xe7aa9e, 0xe7aaa1,
+ /* a0 */ 0xe7aaa2, 0xe8b4b0, 0xe58f91, 0xe7bd9a,
+ /* a4 */ 0xe7ad8f, 0xe4bc90, 0xe4b98f, 0xe99880,
+ /* a8 */ 0xe6b395, 0xe78f90, 0xe897a9, 0xe5b886,
+ /* ac */ 0xe795aa, 0xe7bfbb, 0xe6a88a, 0xe79fbe,
+ /* b0 */ 0xe99292, 0xe7b981, 0xe587a1, 0xe783a6,
+ /* b4 */ 0xe58f8d, 0xe8bf94, 0xe88c83, 0xe8b4a9,
+ /* b8 */ 0xe78aaf, 0xe9a5ad, 0xe6b39b, 0xe59d8a,
+ /* bc */ 0xe88ab3, 0xe696b9, 0xe882aa, 0xe688bf,
+ /* c0 */ 0xe998b2, 0xe5a6a8, 0xe4bbbf, 0xe8aebf,
+ /* c4 */ 0xe7baba, 0xe694be, 0xe88fb2, 0xe99d9e,
+ /* c8 */ 0xe595a1, 0xe9a39e, 0xe882a5, 0xe58caa,
+ /* cc */ 0xe8afbd, 0xe590a0, 0xe882ba, 0xe5ba9f,
+ /* d0 */ 0xe6b2b8, 0xe8b4b9, 0xe88aac, 0xe9859a,
+ /* d4 */ 0xe590a9, 0xe6b09b, 0xe58886, 0xe7bab7,
+ /* d8 */ 0xe59d9f, 0xe7849a, 0xe6b1be, 0xe7b289,
+ /* dc */ 0xe5a58b, 0xe4bbbd, 0xe5bfbf, 0xe684a4,
+ /* e0 */ 0xe7b2aa, 0xe4b8b0, 0xe5b081, 0xe69eab,
+ /* e4 */ 0xe89c82, 0xe5b3b0, 0xe9948b, 0xe9a38e,
+ /* e8 */ 0xe796af, 0xe783bd, 0xe980a2, 0xe586af,
+ /* ec */ 0xe7bc9d, 0xe8aebd, 0xe5a589, 0xe587a4,
+ /* f0 */ 0xe4bd9b, 0xe590a6, 0xe5a4ab, 0xe695b7,
+ /* f4 */ 0xe882a4, 0xe5adb5, 0xe689b6, 0xe68b82,
+ /* f8 */ 0xe8be90, 0xe5b985, 0xe6b09f, 0xe7aca6,
+ /* fc */ 0xe4bc8f, 0xe4bf98, 0xe69c8d,
+
+ /*** Two byte table, leaf: b8xx - offset 0x02a29 ***/
+
+ /* 40 */ 0xe7aaa3, 0xe7aaa4, 0xe7aaa7, 0xe7aaa9,
+ /* 44 */ 0xe7aaaa, 0xe7aaab, 0xe7aaae, 0xe7aaaf,
+ /* 48 */ 0xe7aab0, 0xe7aab1, 0xe7aab2, 0xe7aab4,
+ /* 4c */ 0xe7aab5, 0xe7aab6, 0xe7aab7, 0xe7aab8,
+ /* 50 */ 0xe7aab9, 0xe7aaba, 0xe7aabb, 0xe7aabc,
+ /* 54 */ 0xe7aabd, 0xe7aabe, 0xe7ab80, 0xe7ab81,
+ /* 58 */ 0xe7ab82, 0xe7ab83, 0xe7ab84, 0xe7ab85,
+ /* 5c */ 0xe7ab86, 0xe7ab87, 0xe7ab88, 0xe7ab89,
+ /* 60 */ 0xe7ab8a, 0xe7ab8c, 0xe7ab8d, 0xe7ab8e,
+ /* 64 */ 0xe7ab8f, 0xe7ab90, 0xe7ab91, 0xe7ab92,
+ /* 68 */ 0xe7ab93, 0xe7ab94, 0xe7ab95, 0xe7ab97,
+ /* 6c */ 0xe7ab98, 0xe7ab9a, 0xe7ab9b, 0xe7ab9c,
+ /* 70 */ 0xe7ab9d, 0xe7aba1, 0xe7aba2, 0xe7aba4,
+ /* 74 */ 0xe7aba7, 0xe7aba8, 0xe7aba9, 0xe7abaa,
+ /* 78 */ 0xe7abab, 0xe7abac, 0xe7abae, 0xe7abb0,
+ /* 7c */ 0xe7abb1, 0xe7abb2, 0xe7abb3, 0x000000,
+ /* 80 */ 0xe7abb4, 0xe7abb5, 0xe7abb6, 0xe7abb7,
+ /* 84 */ 0xe7abb8, 0xe7abbb, 0xe7abbc, 0xe7abbe,
+ /* 88 */ 0xe7ac80, 0xe7ac81, 0xe7ac82, 0xe7ac85,
+ /* 8c */ 0xe7ac87, 0xe7ac89, 0xe7ac8c, 0xe7ac8d,
+ /* 90 */ 0xe7ac8e, 0xe7ac90, 0xe7ac92, 0xe7ac93,
+ /* 94 */ 0xe7ac96, 0xe7ac97, 0xe7ac98, 0xe7ac9a,
+ /* 98 */ 0xe7ac9c, 0xe7ac9d, 0xe7ac9f, 0xe7aca1,
+ /* 9c */ 0xe7aca2, 0xe7aca3, 0xe7aca7, 0xe7aca9,
+ /* a0 */ 0xe7acad, 0xe6b5ae, 0xe6b6aa, 0xe7a68f,
+ /* a4 */ 0xe8a2b1, 0xe5bc97, 0xe794ab, 0xe68a9a,
+ /* a8 */ 0xe8be85, 0xe4bfaf, 0xe9879c, 0xe696a7,
+ /* ac */ 0xe884af, 0xe88591, 0xe5ba9c, 0xe88590,
+ /* b0 */ 0xe8b5b4, 0xe589af, 0xe8a686, 0xe8b58b,
+ /* b4 */ 0xe5a48d, 0xe58285, 0xe4bb98, 0xe9989c,
+ /* b8 */ 0xe788b6, 0xe885b9, 0xe8b49f, 0xe5af8c,
+ /* bc */ 0xe8aea3, 0xe99984, 0xe5a687, 0xe7bc9a,
+ /* c0 */ 0xe59290, 0xe599b6, 0xe5988e, 0xe8afa5,
+ /* c4 */ 0xe694b9, 0xe6a682, 0xe99299, 0xe79b96,
+ /* c8 */ 0xe6ba89, 0xe5b9b2, 0xe79498, 0xe69d86,
+ /* cc */ 0xe69f91, 0xe7abbf, 0xe8829d, 0xe8b5b6,
+ /* d0 */ 0xe6849f, 0xe7a786, 0xe695a2, 0xe8b5a3,
+ /* d4 */ 0xe58688, 0xe5889a, 0xe992a2, 0xe7bcb8,
+ /* d8 */ 0xe8829b, 0xe7bab2, 0xe5b297, 0xe6b8af,
+ /* dc */ 0xe69da0, 0xe7af99, 0xe79a8b, 0xe9ab98,
+ /* e0 */ 0xe8868f, 0xe7be94, 0xe7b395, 0xe6909e,
+ /* e4 */ 0xe99590, 0xe7a8bf, 0xe5918a, 0xe593a5,
+ /* e8 */ 0xe6ad8c, 0xe69081, 0xe68888, 0xe9b8bd,
+ /* ec */ 0xe883b3, 0xe79699, 0xe589b2, 0xe99da9,
+ /* f0 */ 0xe8919b, 0xe6a0bc, 0xe89ba4, 0xe99881,
+ /* f4 */ 0xe99a94, 0xe993ac, 0xe4b8aa, 0xe59084,
+ /* f8 */ 0xe7bb99, 0xe6a0b9, 0xe8b79f, 0xe88095,
+ /* fc */ 0xe69bb4, 0xe5ba9a, 0xe7beb9,
+
+ /*** Two byte table, leaf: b9xx - offset 0x02ae8 ***/
+
+ /* 40 */ 0xe7acaf, 0xe7acb0, 0xe7acb2, 0xe7acb4,
+ /* 44 */ 0xe7acb5, 0xe7acb6, 0xe7acb7, 0xe7acb9,
+ /* 48 */ 0xe7acbb, 0xe7acbd, 0xe7acbf, 0xe7ad80,
+ /* 4c */ 0xe7ad81, 0xe7ad82, 0xe7ad83, 0xe7ad84,
+ /* 50 */ 0xe7ad86, 0xe7ad88, 0xe7ad8a, 0xe7ad8d,
+ /* 54 */ 0xe7ad8e, 0xe7ad93, 0xe7ad95, 0xe7ad97,
+ /* 58 */ 0xe7ad99, 0xe7ad9c, 0xe7ad9e, 0xe7ad9f,
+ /* 5c */ 0xe7ada1, 0xe7ada3, 0xe7ada4, 0xe7ada5,
+ /* 60 */ 0xe7ada6, 0xe7ada7, 0xe7ada8, 0xe7ada9,
+ /* 64 */ 0xe7adaa, 0xe7adab, 0xe7adac, 0xe7adad,
+ /* 68 */ 0xe7adaf, 0xe7adb0, 0xe7adb3, 0xe7adb4,
+ /* 6c */ 0xe7adb6, 0xe7adb8, 0xe7adba, 0xe7adbc,
+ /* 70 */ 0xe7adbd, 0xe7adbf, 0xe7ae81, 0xe7ae82,
+ /* 74 */ 0xe7ae83, 0xe7ae84, 0xe7ae86, 0xe7ae87,
+ /* 78 */ 0xe7ae88, 0xe7ae89, 0xe7ae8a, 0xe7ae8b,
+ /* 7c */ 0xe7ae8c, 0xe7ae8e, 0xe7ae8f, 0x000000,
+ /* 80 */ 0xe7ae91, 0xe7ae92, 0xe7ae93, 0xe7ae96,
+ /* 84 */ 0xe7ae98, 0xe7ae99, 0xe7ae9a, 0xe7ae9b,
+ /* 88 */ 0xe7ae9e, 0xe7ae9f, 0xe7aea0, 0xe7aea3,
+ /* 8c */ 0xe7aea4, 0xe7aea5, 0xe7aeae, 0xe7aeaf,
+ /* 90 */ 0xe7aeb0, 0xe7aeb2, 0xe7aeb3, 0xe7aeb5,
+ /* 94 */ 0xe7aeb6, 0xe7aeb7, 0xe7aeb9, 0xe7aeba,
+ /* 98 */ 0xe7aebb, 0xe7aebc, 0xe7aebd, 0xe7aebe,
+ /* 9c */ 0xe7aebf, 0xe7af80, 0xe7af82, 0xe7af83,
+ /* a0 */ 0xe7af84, 0xe59f82, 0xe880bf, 0xe6a297,
+ /* a4 */ 0xe5b7a5, 0xe694bb, 0xe58a9f, 0xe681ad,
+ /* a8 */ 0xe9be9a, 0xe4be9b, 0xe8baac, 0xe585ac,
+ /* ac */ 0xe5aeab, 0xe5bc93, 0xe5b7a9, 0xe6b19e,
+ /* b0 */ 0xe68bb1, 0xe8b4a1, 0xe585b1, 0xe992a9,
+ /* b4 */ 0xe58bbe, 0xe6b29f, 0xe88b9f, 0xe78b97,
+ /* b8 */ 0xe59ea2, 0xe69e84, 0xe8b4ad, 0xe5a49f,
+ /* bc */ 0xe8be9c, 0xe88f87, 0xe59295, 0xe7ae8d,
+ /* c0 */ 0xe4bcb0, 0xe6b2bd, 0xe5ada4, 0xe5a791,
+ /* c4 */ 0xe9bc93, 0xe58fa4, 0xe89b8a, 0xe9aaa8,
+ /* c8 */ 0xe8b0b7, 0xe882a1, 0xe69585, 0xe9a1be,
+ /* cc */ 0xe59bba, 0xe99b87, 0xe588ae, 0xe7939c,
+ /* d0 */ 0xe58990, 0xe5afa1, 0xe68c82, 0xe8a482,
+ /* d4 */ 0xe4b996, 0xe68b90, 0xe680aa, 0xe6a3ba,
+ /* d8 */ 0xe585b3, 0xe5ae98, 0xe586a0, 0xe8a782,
+ /* dc */ 0xe7aea1, 0xe9a686, 0xe7bd90, 0xe683af,
+ /* e0 */ 0xe7818c, 0xe8b4af, 0xe58589, 0xe5b9bf,
+ /* e4 */ 0xe9809b, 0xe791b0, 0xe8a784, 0xe59cad,
+ /* e8 */ 0xe7a185, 0xe5bd92, 0xe9be9f, 0xe997ba,
+ /* ec */ 0xe8bda8, 0xe9acbc, 0xe8afa1, 0xe799b8,
+ /* f0 */ 0xe6a182, 0xe69f9c, 0xe8b7aa, 0xe8b4b5,
+ /* f4 */ 0xe588bd, 0xe8be8a, 0xe6bb9a, 0xe6a38d,
+ /* f8 */ 0xe99485, 0xe983ad, 0xe59bbd, 0xe69e9c,
+ /* fc */ 0xe8a3b9, 0xe8bf87, 0xe59388,
+
+ /*** Two byte table, leaf: baxx - offset 0x02ba7 ***/
+
+ /* 40 */ 0xe7af85, 0xe7af88, 0xe7af89, 0xe7af8a,
+ /* 44 */ 0xe7af8b, 0xe7af8d, 0xe7af8e, 0xe7af8f,
+ /* 48 */ 0xe7af90, 0xe7af92, 0xe7af94, 0xe7af95,
+ /* 4c */ 0xe7af96, 0xe7af97, 0xe7af98, 0xe7af9b,
+ /* 50 */ 0xe7af9c, 0xe7af9e, 0xe7af9f, 0xe7afa0,
+ /* 54 */ 0xe7afa2, 0xe7afa3, 0xe7afa4, 0xe7afa7,
+ /* 58 */ 0xe7afa8, 0xe7afa9, 0xe7afab, 0xe7afac,
+ /* 5c */ 0xe7afad, 0xe7afaf, 0xe7afb0, 0xe7afb2,
+ /* 60 */ 0xe7afb3, 0xe7afb4, 0xe7afb5, 0xe7afb6,
+ /* 64 */ 0xe7afb8, 0xe7afb9, 0xe7afba, 0xe7afbb,
+ /* 68 */ 0xe7afbd, 0xe7afbf, 0xe7b080, 0xe7b081,
+ /* 6c */ 0xe7b082, 0xe7b083, 0xe7b084, 0xe7b085,
+ /* 70 */ 0xe7b086, 0xe7b088, 0xe7b089, 0xe7b08a,
+ /* 74 */ 0xe7b08d, 0xe7b08e, 0xe7b090, 0xe7b091,
+ /* 78 */ 0xe7b092, 0xe7b093, 0xe7b094, 0xe7b095,
+ /* 7c */ 0xe7b097, 0xe7b098, 0xe7b099, 0x000000,
+ /* 80 */ 0xe7b09a, 0xe7b09b, 0xe7b09c, 0xe7b09d,
+ /* 84 */ 0xe7b09e, 0xe7b0a0, 0xe7b0a1, 0xe7b0a2,
+ /* 88 */ 0xe7b0a3, 0xe7b0a4, 0xe7b0a5, 0xe7b0a8,
+ /* 8c */ 0xe7b0a9, 0xe7b0ab, 0xe7b0ac, 0xe7b0ad,
+ /* 90 */ 0xe7b0ae, 0xe7b0af, 0xe7b0b0, 0xe7b0b1,
+ /* 94 */ 0xe7b0b2, 0xe7b0b3, 0xe7b0b4, 0xe7b0b5,
+ /* 98 */ 0xe7b0b6, 0xe7b0b7, 0xe7b0b9, 0xe7b0ba,
+ /* 9c */ 0xe7b0bb, 0xe7b0bc, 0xe7b0bd, 0xe7b0be,
+ /* a0 */ 0xe7b182, 0xe9aab8, 0xe5ada9, 0xe6b5b7,
+ /* a4 */ 0xe6b0a6, 0xe4baa5, 0xe5aeb3, 0xe9aa87,
+ /* a8 */ 0xe985a3, 0xe686a8, 0xe982af, 0xe99fa9,
+ /* ac */ 0xe590ab, 0xe6b6b5, 0xe5af92, 0xe587bd,
+ /* b0 */ 0xe5968a, 0xe7bd95, 0xe7bfb0, 0xe692bc,
+ /* b4 */ 0xe68d8d, 0xe697b1, 0xe686be, 0xe6828d,
+ /* b8 */ 0xe7848a, 0xe6b197, 0xe6b189, 0xe5a4af,
+ /* bc */ 0xe69dad, 0xe888aa, 0xe5a395, 0xe59a8e,
+ /* c0 */ 0xe8b1aa, 0xe6afab, 0xe9839d, 0xe5a5bd,
+ /* c4 */ 0xe88097, 0xe58fb7, 0xe6b5a9, 0xe591b5,
+ /* c8 */ 0xe5969d, 0xe88db7, 0xe88f8f, 0xe6a0b8,
+ /* cc */ 0xe7a6be, 0xe5928c, 0xe4bd95, 0xe59088,
+ /* d0 */ 0xe79b92, 0xe8b289, 0xe99882, 0xe6b2b3,
+ /* d4 */ 0xe6b6b8, 0xe8b5ab, 0xe8a490, 0xe9b9a4,
+ /* d8 */ 0xe8b4ba, 0xe598bf, 0xe9bb91, 0xe79795,
+ /* dc */ 0xe5be88, 0xe78ba0, 0xe681a8, 0xe593bc,
+ /* e0 */ 0xe4baa8, 0xe6a8aa, 0xe8a1a1, 0xe68192,
+ /* e4 */ 0xe8bdb0, 0xe59384, 0xe78398, 0xe899b9,
+ /* e8 */ 0xe9b8bf, 0xe6b4aa, 0xe5ae8f, 0xe5bc98,
+ /* ec */ 0xe7baa2, 0xe59689, 0xe4beaf, 0xe78cb4,
+ /* f0 */ 0xe590bc, 0xe58e9a, 0xe58099, 0xe5908e,
+ /* f4 */ 0xe591bc, 0xe4b98e, 0xe5bfbd, 0xe7919a,
+ /* f8 */ 0xe5a3b6, 0xe891ab, 0xe883a1, 0xe89db4,
+ /* fc */ 0xe78b90, 0xe7b38a, 0xe6b996,
+
+ /*** Two byte table, leaf: bbxx - offset 0x02c66 ***/
+
+ /* 40 */ 0xe7b183, 0xe7b184, 0xe7b185, 0xe7b186,
+ /* 44 */ 0xe7b187, 0xe7b188, 0xe7b189, 0xe7b18a,
+ /* 48 */ 0xe7b18b, 0xe7b18c, 0xe7b18e, 0xe7b18f,
+ /* 4c */ 0xe7b190, 0xe7b191, 0xe7b192, 0xe7b193,
+ /* 50 */ 0xe7b194, 0xe7b195, 0xe7b196, 0xe7b197,
+ /* 54 */ 0xe7b198, 0xe7b199, 0xe7b19a, 0xe7b19b,
+ /* 58 */ 0xe7b19c, 0xe7b19d, 0xe7b19e, 0xe7b19f,
+ /* 5c */ 0xe7b1a0, 0xe7b1a1, 0xe7b1a2, 0xe7b1a3,
+ /* 60 */ 0xe7b1a4, 0xe7b1a5, 0xe7b1a6, 0xe7b1a7,
+ /* 64 */ 0xe7b1a8, 0xe7b1a9, 0xe7b1aa, 0xe7b1ab,
+ /* 68 */ 0xe7b1ac, 0xe7b1ad, 0xe7b1ae, 0xe7b1af,
+ /* 6c */ 0xe7b1b0, 0xe7b1b1, 0xe7b1b2, 0xe7b1b5,
+ /* 70 */ 0xe7b1b6, 0xe7b1b7, 0xe7b1b8, 0xe7b1b9,
+ /* 74 */ 0xe7b1ba, 0xe7b1be, 0xe7b1bf, 0xe7b280,
+ /* 78 */ 0xe7b281, 0xe7b282, 0xe7b283, 0xe7b284,
+ /* 7c */ 0xe7b285, 0xe7b286, 0xe7b287, 0x000000,
+ /* 80 */ 0xe7b288, 0xe7b28a, 0xe7b28b, 0xe7b28c,
+ /* 84 */ 0xe7b28d, 0xe7b28e, 0xe7b28f, 0xe7b290,
+ /* 88 */ 0xe7b293, 0xe7b294, 0xe7b296, 0xe7b299,
+ /* 8c */ 0xe7b29a, 0xe7b29b, 0xe7b2a0, 0xe7b2a1,
+ /* 90 */ 0xe7b2a3, 0xe7b2a6, 0xe7b2a7, 0xe7b2a8,
+ /* 94 */ 0xe7b2a9, 0xe7b2ab, 0xe7b2ac, 0xe7b2ad,
+ /* 98 */ 0xe7b2af, 0xe7b2b0, 0xe7b2b4, 0xe7b2b5,
+ /* 9c */ 0xe7b2b6, 0xe7b2b7, 0xe7b2b8, 0xe7b2ba,
+ /* a0 */ 0xe7b2bb, 0xe5bca7, 0xe8998e, 0xe594ac,
+ /* a4 */ 0xe68aa4, 0xe4ba92, 0xe6b2aa, 0xe688b7,
+ /* a8 */ 0xe88ab1, 0xe59397, 0xe58d8e, 0xe78cbe,
+ /* ac */ 0xe6bb91, 0xe794bb, 0xe58892, 0xe58c96,
+ /* b0 */ 0xe8af9d, 0xe6a790, 0xe5be8a, 0xe68080,
+ /* b4 */ 0xe6b7ae, 0xe59d8f, 0xe6aca2, 0xe78eaf,
+ /* b8 */ 0xe6a193, 0xe8bf98, 0xe7bc93, 0xe68da2,
+ /* bc */ 0xe682a3, 0xe594a4, 0xe797aa, 0xe8b1a2,
+ /* c0 */ 0xe78495, 0xe6b6a3, 0xe5aea6, 0xe5b9bb,
+ /* c4 */ 0xe88d92, 0xe6858c, 0xe9bb84, 0xe7a3ba,
+ /* c8 */ 0xe89d97, 0xe7b0a7, 0xe79a87, 0xe587b0,
+ /* cc */ 0xe683b6, 0xe7858c, 0xe69983, 0xe5b98c,
+ /* d0 */ 0xe6818d, 0xe8b08e, 0xe781b0, 0xe68ca5,
+ /* d4 */ 0xe8be89, 0xe5bebd, 0xe681a2, 0xe89b94,
+ /* d8 */ 0xe59b9e, 0xe6af81, 0xe68294, 0xe685a7,
+ /* dc */ 0xe58d89, 0xe683a0, 0xe699a6, 0xe8b4bf,
+ /* e0 */ 0xe7a7bd, 0xe4bc9a, 0xe783a9, 0xe6b187,
+ /* e4 */ 0xe8aeb3, 0xe8afb2, 0xe7bb98, 0xe88da4,
+ /* e8 */ 0xe6988f, 0xe5a99a, 0xe9ad82, 0xe6b591,
+ /* ec */ 0xe6b7b7, 0xe8b181, 0xe6b4bb, 0xe4bc99,
+ /* f0 */ 0xe781ab, 0xe88eb7, 0xe68896, 0xe68391,
+ /* f4 */ 0xe99c8d, 0xe8b4a7, 0xe7a5b8, 0xe587bb,
+ /* f8 */ 0xe59cbe, 0xe59fba, 0xe69cba, 0xe795b8,
+ /* fc */ 0xe7a8bd, 0xe7a7af, 0xe7ae95,
+
+ /*** Two byte table, leaf: bcxx - offset 0x02d25 ***/
+
+ /* 40 */ 0xe7b2bf, 0xe7b380, 0xe7b382, 0xe7b383,
+ /* 44 */ 0xe7b384, 0xe7b386, 0xe7b389, 0xe7b38b,
+ /* 48 */ 0xe7b38e, 0xe7b38f, 0xe7b390, 0xe7b391,
+ /* 4c */ 0xe7b392, 0xe7b393, 0xe7b394, 0xe7b398,
+ /* 50 */ 0xe7b39a, 0xe7b39b, 0xe7b39d, 0xe7b39e,
+ /* 54 */ 0xe7b3a1, 0xe7b3a2, 0xe7b3a3, 0xe7b3a4,
+ /* 58 */ 0xe7b3a5, 0xe7b3a6, 0xe7b3a7, 0xe7b3a9,
+ /* 5c */ 0xe7b3aa, 0xe7b3ab, 0xe7b3ac, 0xe7b3ad,
+ /* 60 */ 0xe7b3ae, 0xe7b3b0, 0xe7b3b1, 0xe7b3b2,
+ /* 64 */ 0xe7b3b3, 0xe7b3b4, 0xe7b3b5, 0xe7b3b6,
+ /* 68 */ 0xe7b3b7, 0xe7b3b9, 0xe7b3ba, 0xe7b3bc,
+ /* 6c */ 0xe7b3bd, 0xe7b3be, 0xe7b3bf, 0xe7b480,
+ /* 70 */ 0xe7b481, 0xe7b482, 0xe7b483, 0xe7b484,
+ /* 74 */ 0xe7b485, 0xe7b486, 0xe7b487, 0xe7b488,
+ /* 78 */ 0xe7b489, 0xe7b48b, 0xe7b48c, 0xe7b48d,
+ /* 7c */ 0xe7b48e, 0xe7b48f, 0xe7b490, 0x000000,
+ /* 80 */ 0xe7b491, 0xe7b492, 0xe7b493, 0xe7b494,
+ /* 84 */ 0xe7b495, 0xe7b496, 0xe7b497, 0xe7b498,
+ /* 88 */ 0xe7b499, 0xe7b49a, 0xe7b49b, 0xe7b49c,
+ /* 8c */ 0xe7b49d, 0xe7b49e, 0xe7b49f, 0xe7b4a1,
+ /* 90 */ 0xe7b4a3, 0xe7b4a4, 0xe7b4a5, 0xe7b4a6,
+ /* 94 */ 0xe7b4a8, 0xe7b4a9, 0xe7b4aa, 0xe7b4ac,
+ /* 98 */ 0xe7b4ad, 0xe7b4ae, 0xe7b4b0, 0xe7b4b1,
+ /* 9c */ 0xe7b4b2, 0xe7b4b3, 0xe7b4b4, 0xe7b4b5,
+ /* a0 */ 0xe7b4b6, 0xe8828c, 0xe9a5a5, 0xe8bfb9,
+ /* a4 */ 0xe6bf80, 0xe8aea5, 0xe9b8a1, 0xe5a7ac,
+ /* a8 */ 0xe7bba9, 0xe7bc89, 0xe59089, 0xe69e81,
+ /* ac */ 0xe6a398, 0xe8be91, 0xe7b18d, 0xe99b86,
+ /* b0 */ 0xe58f8a, 0xe680a5, 0xe796be, 0xe6b1b2,
+ /* b4 */ 0xe58db3, 0xe5ab89, 0xe7baa7, 0xe68ca4,
+ /* b8 */ 0xe587a0, 0xe8848a, 0xe5b7b1, 0xe8939f,
+ /* bc */ 0xe68a80, 0xe58680, 0xe5ada3, 0xe4bc8e,
+ /* c0 */ 0xe7a5ad, 0xe58982, 0xe682b8, 0xe6b58e,
+ /* c4 */ 0xe5af84, 0xe5af82, 0xe8aea1, 0xe8aeb0,
+ /* c8 */ 0xe697a2, 0xe5bf8c, 0xe99985, 0xe5a693,
+ /* cc */ 0xe7bba7, 0xe7baaa, 0xe59889, 0xe69eb7,
+ /* d0 */ 0xe5a4b9, 0xe4bdb3, 0xe5aeb6, 0xe58aa0,
+ /* d4 */ 0xe88d9a, 0xe9a28a, 0xe8b4be, 0xe794b2,
+ /* d8 */ 0xe992be, 0xe58187, 0xe7a8bc, 0xe4bbb7,
+ /* dc */ 0xe69eb6, 0xe9a9be, 0xe5ab81, 0xe6adbc,
+ /* e0 */ 0xe79b91, 0xe59d9a, 0xe5b096, 0xe7acba,
+ /* e4 */ 0xe997b4, 0xe7858e, 0xe585bc, 0xe882a9,
+ /* e8 */ 0xe889b0, 0xe5a5b8, 0xe7bc84, 0xe88ca7,
+ /* ec */ 0xe6a380, 0xe69fac, 0xe7a2b1, 0xe7a1b7,
+ /* f0 */ 0xe68ba3, 0xe68da1, 0xe7ae80, 0xe4bfad,
+ /* f4 */ 0xe589aa, 0xe5878f, 0xe88d90, 0xe6a79b,
+ /* f8 */ 0xe989b4, 0xe8b7b5, 0xe8b4b1, 0xe8a781,
+ /* fc */ 0xe994ae, 0xe7aead, 0xe4bbb6,
+
+ /*** Two byte table, leaf: bdxx - offset 0x02de4 ***/
+
+ /* 40 */ 0xe7b4b7, 0xe7b4b8, 0xe7b4b9, 0xe7b4ba,
+ /* 44 */ 0xe7b4bb, 0xe7b4bc, 0xe7b4bd, 0xe7b4be,
+ /* 48 */ 0xe7b4bf, 0xe7b580, 0xe7b581, 0xe7b582,
+ /* 4c */ 0xe7b583, 0xe7b584, 0xe7b585, 0xe7b586,
+ /* 50 */ 0xe7b587, 0xe7b588, 0xe7b589, 0xe7b58a,
+ /* 54 */ 0xe7b58b, 0xe7b58c, 0xe7b58d, 0xe7b58e,
+ /* 58 */ 0xe7b58f, 0xe7b590, 0xe7b591, 0xe7b592,
+ /* 5c */ 0xe7b593, 0xe7b594, 0xe7b595, 0xe7b596,
+ /* 60 */ 0xe7b597, 0xe7b598, 0xe7b599, 0xe7b59a,
+ /* 64 */ 0xe7b59b, 0xe7b59c, 0xe7b59d, 0xe7b59e,
+ /* 68 */ 0xe7b59f, 0xe7b5a0, 0xe7b5a1, 0xe7b5a2,
+ /* 6c */ 0xe7b5a3, 0xe7b5a4, 0xe7b5a5, 0xe7b5a6,
+ /* 70 */ 0xe7b5a7, 0xe7b5a8, 0xe7b5a9, 0xe7b5aa,
+ /* 74 */ 0xe7b5ab, 0xe7b5ac, 0xe7b5ad, 0xe7b5af,
+ /* 78 */ 0xe7b5b0, 0xe7b5b1, 0xe7b5b2, 0xe7b5b3,
+ /* 7c */ 0xe7b5b4, 0xe7b5b5, 0xe7b5b6, 0x000000,
+ /* 80 */ 0xe7b5b8, 0xe7b5b9, 0xe7b5ba, 0xe7b5bb,
+ /* 84 */ 0xe7b5bc, 0xe7b5bd, 0xe7b5be, 0xe7b5bf,
+ /* 88 */ 0xe7b680, 0xe7b681, 0xe7b682, 0xe7b683,
+ /* 8c */ 0xe7b684, 0xe7b685, 0xe7b686, 0xe7b687,
+ /* 90 */ 0xe7b688, 0xe7b689, 0xe7b68a, 0xe7b68b,
+ /* 94 */ 0xe7b68c, 0xe7b68d, 0xe7b68e, 0xe7b68f,
+ /* 98 */ 0xe7b690, 0xe7b691, 0xe7b692, 0xe7b693,
+ /* 9c */ 0xe7b694, 0xe7b695, 0xe7b696, 0xe7b697,
+ /* a0 */ 0xe7b698, 0xe581a5, 0xe888b0, 0xe58991,
+ /* a4 */ 0xe9a5af, 0xe6b890, 0xe6ba85, 0xe6b6a7,
+ /* a8 */ 0xe5bbba, 0xe583b5, 0xe5a79c, 0xe5b086,
+ /* ac */ 0xe6b586, 0xe6b19f, 0xe79686, 0xe8928b,
+ /* b0 */ 0xe6a1a8, 0xe5a596, 0xe8aeb2, 0xe58ca0,
+ /* b4 */ 0xe985b1, 0xe9998d, 0xe89589, 0xe6a492,
+ /* b8 */ 0xe7a481, 0xe784a6, 0xe883b6, 0xe4baa4,
+ /* bc */ 0xe9838a, 0xe6b587, 0xe9aa84, 0xe5a887,
+ /* c0 */ 0xe59abc, 0xe69085, 0xe993b0, 0xe79fab,
+ /* c4 */ 0xe4bea5, 0xe8849a, 0xe78ba1, 0xe8a792,
+ /* c8 */ 0xe9a5ba, 0xe7bcb4, 0xe7bb9e, 0xe589bf,
+ /* cc */ 0xe69599, 0xe985b5, 0xe8bdbf, 0xe8be83,
+ /* d0 */ 0xe58fab, 0xe7aa96, 0xe68fad, 0xe68ea5,
+ /* d4 */ 0xe79a86, 0xe7a7b8, 0xe8a197, 0xe998b6,
+ /* d8 */ 0xe688aa, 0xe58aab, 0xe88a82, 0xe6a194,
+ /* dc */ 0xe69db0, 0xe68db7, 0xe79dab, 0xe7abad,
+ /* e0 */ 0xe6b481, 0xe7bb93, 0xe8a7a3, 0xe5a790,
+ /* e4 */ 0xe68892, 0xe89789, 0xe88aa5, 0xe7958c,
+ /* e8 */ 0xe5809f, 0xe4bb8b, 0xe796a5, 0xe8afab,
+ /* ec */ 0xe5b18a, 0xe5b7be, 0xe7ad8b, 0xe696a4,
+ /* f0 */ 0xe98791, 0xe4bb8a, 0xe6b4a5, 0xe8a59f,
+ /* f4 */ 0xe7b4a7, 0xe994a6, 0xe4bb85, 0xe8b0a8,
+ /* f8 */ 0xe8bf9b, 0xe99db3, 0xe6998b, 0xe7a681,
+ /* fc */ 0xe8bf91, 0xe783ac, 0xe6b5b8,
+
+ /*** Two byte table, leaf: bexx - offset 0x02ea3 ***/
+
+ /* 40 */ 0xe7b699, 0xe7b69a, 0xe7b69b, 0xe7b69c,
+ /* 44 */ 0xe7b69d, 0xe7b69e, 0xe7b69f, 0xe7b6a0,
+ /* 48 */ 0xe7b6a1, 0xe7b6a2, 0xe7b6a3, 0xe7b6a4,
+ /* 4c */ 0xe7b6a5, 0xe7b6a7, 0xe7b6a8, 0xe7b6a9,
+ /* 50 */ 0xe7b6aa, 0xe7b6ab, 0xe7b6ac, 0xe7b6ad,
+ /* 54 */ 0xe7b6af, 0xe7b6b0, 0xe7b6b1, 0xe7b6b2,
+ /* 58 */ 0xe7b6b3, 0xe7b6b4, 0xe7b6b5, 0xe7b6b6,
+ /* 5c */ 0xe7b6b7, 0xe7b6b8, 0xe7b6b9, 0xe7b6ba,
+ /* 60 */ 0xe7b6bb, 0xe7b6bc, 0xe7b6bd, 0xe7b6be,
+ /* 64 */ 0xe7b6bf, 0xe7b780, 0xe7b781, 0xe7b782,
+ /* 68 */ 0xe7b783, 0xe7b784, 0xe7b785, 0xe7b786,
+ /* 6c */ 0xe7b787, 0xe7b788, 0xe7b789, 0xe7b78a,
+ /* 70 */ 0xe7b78b, 0xe7b78c, 0xe7b78d, 0xe7b78e,
+ /* 74 */ 0xe7b78f, 0xe7b790, 0xe7b791, 0xe7b792,
+ /* 78 */ 0xe7b793, 0xe7b794, 0xe7b795, 0xe7b796,
+ /* 7c */ 0xe7b797, 0xe7b798, 0xe7b799, 0x000000,
+ /* 80 */ 0xe7b79a, 0xe7b79b, 0xe7b79c, 0xe7b79d,
+ /* 84 */ 0xe7b79e, 0xe7b79f, 0xe7b7a0, 0xe7b7a1,
+ /* 88 */ 0xe7b7a2, 0xe7b7a3, 0xe7b7a4, 0xe7b7a5,
+ /* 8c */ 0xe7b7a6, 0xe7b7a7, 0xe7b7a8, 0xe7b7a9,
+ /* 90 */ 0xe7b7aa, 0xe7b7ab, 0xe7b7ac, 0xe7b7ad,
+ /* 94 */ 0xe7b7ae, 0xe7b7af, 0xe7b7b0, 0xe7b7b1,
+ /* 98 */ 0xe7b7b2, 0xe7b7b3, 0xe7b7b4, 0xe7b7b5,
+ /* 9c */ 0xe7b7b6, 0xe7b7b7, 0xe7b7b8, 0xe7b7b9,
+ /* a0 */ 0xe7b7ba, 0xe5b0bd, 0xe58ab2, 0xe88d86,
+ /* a4 */ 0xe585a2, 0xe88c8e, 0xe79d9b, 0xe699b6,
+ /* a8 */ 0xe9b2b8, 0xe4baac, 0xe6838a, 0xe7b2be,
+ /* ac */ 0xe7b2b3, 0xe7bb8f, 0xe4ba95, 0xe8ada6,
+ /* b0 */ 0xe699af, 0xe9a288, 0xe99d99, 0xe5a283,
+ /* b4 */ 0xe695ac, 0xe9959c, 0xe5be84, 0xe79789,
+ /* b8 */ 0xe99d96, 0xe7ab9f, 0xe7ab9e, 0xe58780,
+ /* bc */ 0xe782af, 0xe7aa98, 0xe68faa, 0xe7a9b6,
+ /* c0 */ 0xe7baa0, 0xe78e96, 0xe99fad, 0xe4b985,
+ /* c4 */ 0xe781b8, 0xe4b99d, 0xe98592, 0xe58ea9,
+ /* c8 */ 0xe69591, 0xe697a7, 0xe887bc, 0xe88885,
+ /* cc */ 0xe5928e, 0xe5b0b1, 0xe7969a, 0xe99ea0,
+ /* d0 */ 0xe68b98, 0xe78b99, 0xe796bd, 0xe5b185,
+ /* d4 */ 0xe9a9b9, 0xe88f8a, 0xe5b180, 0xe59280,
+ /* d8 */ 0xe79fa9, 0xe4b8be, 0xe6b2ae, 0xe8819a,
+ /* dc */ 0xe68b92, 0xe68dae, 0xe5b7a8, 0xe585b7,
+ /* e0 */ 0xe8b79d, 0xe8b89e, 0xe994af, 0xe4bfb1,
+ /* e4 */ 0xe58fa5, 0xe683a7, 0xe782ac, 0xe589a7,
+ /* e8 */ 0xe68d90, 0xe9b983, 0xe5a89f, 0xe580a6,
+ /* ec */ 0xe79cb7, 0xe58db7, 0xe7bba2, 0xe69285,
+ /* f0 */ 0xe694ab, 0xe68a89, 0xe68e98, 0xe58094,
+ /* f4 */ 0xe788b5, 0xe8a789, 0xe586b3, 0xe8af80,
+ /* f8 */ 0xe7bb9d, 0xe59d87, 0xe88f8c, 0xe992a7,
+ /* fc */ 0xe5869b, 0xe5909b, 0xe5b3bb,
+
+ /*** Two byte table, leaf: bfxx - offset 0x02f62 ***/
+
+ /* 40 */ 0xe7b7bb, 0xe7b7bc, 0xe7b7bd, 0xe7b7be,
+ /* 44 */ 0xe7b7bf, 0xe7b880, 0xe7b881, 0xe7b882,
+ /* 48 */ 0xe7b883, 0xe7b884, 0xe7b885, 0xe7b886,
+ /* 4c */ 0xe7b887, 0xe7b888, 0xe7b889, 0xe7b88a,
+ /* 50 */ 0xe7b88b, 0xe7b88c, 0xe7b88d, 0xe7b88e,
+ /* 54 */ 0xe7b88f, 0xe7b890, 0xe7b891, 0xe7b892,
+ /* 58 */ 0xe7b893, 0xe7b894, 0xe7b895, 0xe7b896,
+ /* 5c */ 0xe7b897, 0xe7b898, 0xe7b899, 0xe7b89a,
+ /* 60 */ 0xe7b89b, 0xe7b89c, 0xe7b89d, 0xe7b89e,
+ /* 64 */ 0xe7b89f, 0xe7b8a0, 0xe7b8a1, 0xe7b8a2,
+ /* 68 */ 0xe7b8a3, 0xe7b8a4, 0xe7b8a5, 0xe7b8a6,
+ /* 6c */ 0xe7b8a7, 0xe7b8a8, 0xe7b8a9, 0xe7b8aa,
+ /* 70 */ 0xe7b8ab, 0xe7b8ac, 0xe7b8ad, 0xe7b8ae,
+ /* 74 */ 0xe7b8af, 0xe7b8b0, 0xe7b8b1, 0xe7b8b2,
+ /* 78 */ 0xe7b8b3, 0xe7b8b4, 0xe7b8b5, 0xe7b8b6,
+ /* 7c */ 0xe7b8b7, 0xe7b8b8, 0xe7b8b9, 0x000000,
+ /* 80 */ 0xe7b8ba, 0xe7b8bc, 0xe7b8bd, 0xe7b8be,
+ /* 84 */ 0xe7b8bf, 0xe7b980, 0xe7b982, 0xe7b983,
+ /* 88 */ 0xe7b984, 0xe7b985, 0xe7b986, 0xe7b988,
+ /* 8c */ 0xe7b989, 0xe7b98a, 0xe7b98b, 0xe7b98c,
+ /* 90 */ 0xe7b98d, 0xe7b98e, 0xe7b98f, 0xe7b990,
+ /* 94 */ 0xe7b991, 0xe7b992, 0xe7b993, 0xe7b994,
+ /* 98 */ 0xe7b995, 0xe7b996, 0xe7b997, 0xe7b998,
+ /* 9c */ 0xe7b999, 0xe7b99a, 0xe7b99b, 0xe7b99c,
+ /* a0 */ 0xe7b99d, 0xe4bf8a, 0xe7aba3, 0xe6b59a,
+ /* a4 */ 0xe983a1, 0xe9aa8f, 0xe59680, 0xe59296,
+ /* a8 */ 0xe58da1, 0xe592af, 0xe5bc80, 0xe68fa9,
+ /* ac */ 0xe6a5b7, 0xe587af, 0xe685a8, 0xe5888a,
+ /* b0 */ 0xe5a0aa, 0xe58b98, 0xe59d8e, 0xe7a08d,
+ /* b4 */ 0xe79c8b, 0xe5bab7, 0xe685b7, 0xe7b3a0,
+ /* b8 */ 0xe6899b, 0xe68a97, 0xe4baa2, 0xe78295,
+ /* bc */ 0xe88083, 0xe68bb7, 0xe783a4, 0xe99da0,
+ /* c0 */ 0xe59db7, 0xe88b9b, 0xe69faf, 0xe6a3b5,
+ /* c4 */ 0xe7a395, 0xe9a297, 0xe7a791, 0xe5a3b3,
+ /* c8 */ 0xe592b3, 0xe58faf, 0xe6b8b4, 0xe5858b,
+ /* cc */ 0xe588bb, 0xe5aea2, 0xe8afbe, 0xe882af,
+ /* d0 */ 0xe59583, 0xe59ea6, 0xe681b3, 0xe59d91,
+ /* d4 */ 0xe590ad, 0xe7a9ba, 0xe68190, 0xe5ad94,
+ /* d8 */ 0xe68ea7, 0xe68aa0, 0xe58fa3, 0xe689a3,
+ /* dc */ 0xe5af87, 0xe69eaf, 0xe593ad, 0xe7aa9f,
+ /* e0 */ 0xe88ba6, 0xe985b7, 0xe5ba93, 0xe8a3a4,
+ /* e4 */ 0xe5a4b8, 0xe59eae, 0xe68c8e, 0xe8b7a8,
+ /* e8 */ 0xe883af, 0xe59d97, 0xe7adb7, 0xe4bea9,
+ /* ec */ 0xe5bfab, 0xe5aebd, 0xe6acbe, 0xe58ca1,
+ /* f0 */ 0xe7ad90, 0xe78b82, 0xe6a186, 0xe79fbf,
+ /* f4 */ 0xe79cb6, 0xe697b7, 0xe586b5, 0xe4ba8f,
+ /* f8 */ 0xe79b94, 0xe5b2bf, 0xe7aaa5, 0xe891b5,
+ /* fc */ 0xe5a58e, 0xe9ad81, 0xe58280,
+
+ /*** Two byte table, leaf: c0xx - offset 0x03021 ***/
+
+ /* 40 */ 0xe7b99e, 0xe7b99f, 0xe7b9a0, 0xe7b9a1,
+ /* 44 */ 0xe7b9a2, 0xe7b9a3, 0xe7b9a4, 0xe7b9a5,
+ /* 48 */ 0xe7b9a6, 0xe7b9a7, 0xe7b9a8, 0xe7b9a9,
+ /* 4c */ 0xe7b9aa, 0xe7b9ab, 0xe7b9ac, 0xe7b9ad,
+ /* 50 */ 0xe7b9ae, 0xe7b9af, 0xe7b9b0, 0xe7b9b1,
+ /* 54 */ 0xe7b9b2, 0xe7b9b3, 0xe7b9b4, 0xe7b9b5,
+ /* 58 */ 0xe7b9b6, 0xe7b9b7, 0xe7b9b8, 0xe7b9b9,
+ /* 5c */ 0xe7b9ba, 0xe7b9bb, 0xe7b9bc, 0xe7b9bd,
+ /* 60 */ 0xe7b9be, 0xe7b9bf, 0xe7ba80, 0xe7ba81,
+ /* 64 */ 0xe7ba83, 0xe7ba84, 0xe7ba85, 0xe7ba86,
+ /* 68 */ 0xe7ba87, 0xe7ba88, 0xe7ba89, 0xe7ba8a,
+ /* 6c */ 0xe7ba8b, 0xe7ba8c, 0xe7ba8d, 0xe7ba8e,
+ /* 70 */ 0xe7ba8f, 0xe7ba90, 0xe7ba91, 0xe7ba92,
+ /* 74 */ 0xe7ba93, 0xe7ba94, 0xe7ba95, 0xe7ba96,
+ /* 78 */ 0xe7ba97, 0xe7ba98, 0xe7ba99, 0xe7ba9a,
+ /* 7c */ 0xe7ba9c, 0xe7ba9d, 0xe7ba9e, 0x000000,
+ /* 80 */ 0xe7baae, 0xe7bab4, 0xe7babb, 0xe7babc,
+ /* 84 */ 0xe7bb96, 0xe7bba4, 0xe7bbac, 0xe7bbb9,
+ /* 88 */ 0xe7bc8a, 0xe7bc90, 0xe7bc9e, 0xe7bcb7,
+ /* 8c */ 0xe7bcb9, 0xe7bcbb, 0xe7bcbc, 0xe7bcbd,
+ /* 90 */ 0xe7bcbe, 0xe7bcbf, 0xe7bd80, 0xe7bd81,
+ /* 94 */ 0xe7bd83, 0xe7bd86, 0xe7bd87, 0xe7bd88,
+ /* 98 */ 0xe7bd89, 0xe7bd8a, 0xe7bd8b, 0xe7bd8c,
+ /* 9c */ 0xe7bd8d, 0xe7bd8e, 0xe7bd8f, 0xe7bd92,
+ /* a0 */ 0xe7bd93, 0xe9a688, 0xe684a7, 0xe6ba83,
+ /* a4 */ 0xe59da4, 0xe69886, 0xe68d86, 0xe59bb0,
+ /* a8 */ 0xe68bac, 0xe689a9, 0xe5bb93, 0xe99894,
+ /* ac */ 0xe59e83, 0xe68b89, 0xe59687, 0xe89ca1,
+ /* b0 */ 0xe8858a, 0xe8bea3, 0xe595a6, 0xe88eb1,
+ /* b4 */ 0xe69da5, 0xe8b596, 0xe8939d, 0xe5a9aa,
+ /* b8 */ 0xe6a08f, 0xe68ba6, 0xe7afae, 0xe99891,
+ /* bc */ 0xe585b0, 0xe6be9c, 0xe8b0b0, 0xe68fbd,
+ /* c0 */ 0xe8a788, 0xe68792, 0xe7bc86, 0xe78382,
+ /* c4 */ 0xe6bba5, 0xe79085, 0xe6a694, 0xe78bbc,
+ /* c8 */ 0xe5bb8a, 0xe9838e, 0xe69c97, 0xe6b5aa,
+ /* cc */ 0xe68d9e, 0xe58ab3, 0xe789a2, 0xe88081,
+ /* d0 */ 0xe4bdac, 0xe5a7a5, 0xe985aa, 0xe78399,
+ /* d4 */ 0xe6b69d, 0xe58b92, 0xe4b990, 0xe99bb7,
+ /* d8 */ 0xe995ad, 0xe895be, 0xe7a38a, 0xe7b4af,
+ /* dc */ 0xe584a1, 0xe59e92, 0xe69382, 0xe8828b,
+ /* e0 */ 0xe7b1bb, 0xe6b3aa, 0xe6a3b1, 0xe6a59e,
+ /* e4 */ 0xe586b7, 0xe58e98, 0xe6a2a8, 0xe78a81,
+ /* e8 */ 0xe9bb8e, 0xe7afb1, 0xe78bb8, 0xe7a6bb,
+ /* ec */ 0xe6bc93, 0xe79086, 0xe69d8e, 0xe9878c,
+ /* f0 */ 0xe9b2a4, 0xe7a4bc, 0xe88e89, 0xe88d94,
+ /* f4 */ 0xe5908f, 0xe6a097, 0xe4b8bd, 0xe58e89,
+ /* f8 */ 0xe58ab1, 0xe7a0be, 0xe58e86, 0xe588a9,
+ /* fc */ 0xe58288, 0xe4be8b, 0xe4bf90,
+
+ /*** Two byte table, leaf: c1xx - offset 0x030e0 ***/
+
+ /* 40 */ 0xe7bd96, 0xe7bd99, 0xe7bd9b, 0xe7bd9c,
+ /* 44 */ 0xe7bd9d, 0xe7bd9e, 0xe7bda0, 0xe7bda3,
+ /* 48 */ 0xe7bda4, 0xe7bda5, 0xe7bda6, 0xe7bda7,
+ /* 4c */ 0xe7bdab, 0xe7bdac, 0xe7bdad, 0xe7bdaf,
+ /* 50 */ 0xe7bdb0, 0xe7bdb3, 0xe7bdb5, 0xe7bdb6,
+ /* 54 */ 0xe7bdb7, 0xe7bdb8, 0xe7bdba, 0xe7bdbb,
+ /* 58 */ 0xe7bdbc, 0xe7bdbd, 0xe7bdbf, 0xe7be80,
+ /* 5c */ 0xe7be82, 0xe7be83, 0xe7be84, 0xe7be85,
+ /* 60 */ 0xe7be86, 0xe7be87, 0xe7be88, 0xe7be89,
+ /* 64 */ 0xe7be8b, 0xe7be8d, 0xe7be8f, 0xe7be90,
+ /* 68 */ 0xe7be91, 0xe7be92, 0xe7be93, 0xe7be95,
+ /* 6c */ 0xe7be96, 0xe7be97, 0xe7be98, 0xe7be99,
+ /* 70 */ 0xe7be9b, 0xe7be9c, 0xe7bea0, 0xe7bea2,
+ /* 74 */ 0xe7bea3, 0xe7bea5, 0xe7bea6, 0xe7bea8,
+ /* 78 */ 0xe7bea9, 0xe7beaa, 0xe7beab, 0xe7beac,
+ /* 7c */ 0xe7bead, 0xe7beae, 0xe7beb1, 0x000000,
+ /* 80 */ 0xe7beb3, 0xe7beb4, 0xe7beb5, 0xe7beb6,
+ /* 84 */ 0xe7beb7, 0xe7beba, 0xe7bebb, 0xe7bebe,
+ /* 88 */ 0xe7bf80, 0xe7bf82, 0xe7bf83, 0xe7bf84,
+ /* 8c */ 0xe7bf86, 0xe7bf87, 0xe7bf88, 0xe7bf89,
+ /* 90 */ 0xe7bf8b, 0xe7bf8d, 0xe7bf8f, 0xe7bf90,
+ /* 94 */ 0xe7bf91, 0xe7bf92, 0xe7bf93, 0xe7bf96,
+ /* 98 */ 0xe7bf97, 0xe7bf99, 0xe7bf9a, 0xe7bf9b,
+ /* 9c */ 0xe7bf9c, 0xe7bf9d, 0xe7bf9e, 0xe7bfa2,
+ /* a0 */ 0xe7bfa3, 0xe797a2, 0xe7ab8b, 0xe7b292,
+ /* a4 */ 0xe6b2a5, 0xe99ab6, 0xe58a9b, 0xe79283,
+ /* a8 */ 0xe593a9, 0xe4bfa9, 0xe88194, 0xe88eb2,
+ /* ac */ 0xe8bf9e, 0xe995b0, 0xe5bb89, 0xe6809c,
+ /* b0 */ 0xe6b69f, 0xe5b898, 0xe6959b, 0xe884b8,
+ /* b4 */ 0xe993be, 0xe6818b, 0xe782bc, 0xe7bb83,
+ /* b8 */ 0xe7b2ae, 0xe58789, 0xe6a281, 0xe7b2b1,
+ /* bc */ 0xe889af, 0xe4b8a4, 0xe8be86, 0xe9878f,
+ /* c0 */ 0xe699be, 0xe4baae, 0xe8b085, 0xe692a9,
+ /* c4 */ 0xe8818a, 0xe5839a, 0xe79697, 0xe7878e,
+ /* c8 */ 0xe5afa5, 0xe8bebd, 0xe6bda6, 0xe4ba86,
+ /* cc */ 0xe69282, 0xe995a3, 0xe5bb96, 0xe69699,
+ /* d0 */ 0xe58897, 0xe8a382, 0xe78388, 0xe58aa3,
+ /* d4 */ 0xe78c8e, 0xe790b3, 0xe69e97, 0xe7a3b7,
+ /* d8 */ 0xe99c96, 0xe4b8b4, 0xe982bb, 0xe9b39e,
+ /* dc */ 0xe6b78b, 0xe5879b, 0xe8b581, 0xe5909d,
+ /* e0 */ 0xe68b8e, 0xe78eb2, 0xe88fb1, 0xe99bb6,
+ /* e4 */ 0xe9be84, 0xe99383, 0xe4bcb6, 0xe7be9a,
+ /* e8 */ 0xe5878c, 0xe781b5, 0xe999b5, 0xe5b2ad,
+ /* ec */ 0xe9a286, 0xe58fa6, 0xe4bba4, 0xe6ba9c,
+ /* f0 */ 0xe79089, 0xe6a6b4, 0xe7a1ab, 0xe9a68f,
+ /* f4 */ 0xe79599, 0xe58898, 0xe798a4, 0xe6b581,
+ /* f8 */ 0xe69fb3, 0xe585ad, 0xe9be99, 0xe8818b,
+ /* fc */ 0xe59299, 0xe7acbc, 0xe7aabf,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0319f ***/
+
+ /* 40 */ 0xe7bfa4, 0xe7bfa7, 0xe7bfa8, 0xe7bfaa,
+ /* 44 */ 0xe7bfab, 0xe7bfac, 0xe7bfad, 0xe7bfaf,
+ /* 48 */ 0xe7bfb2, 0xe7bfb4, 0xe7bfb5, 0xe7bfb6,
+ /* 4c */ 0xe7bfb7, 0xe7bfb8, 0xe7bfb9, 0xe7bfba,
+ /* 50 */ 0xe7bfbd, 0xe7bfbe, 0xe7bfbf, 0xe88082,
+ /* 54 */ 0xe88087, 0xe88088, 0xe88089, 0xe8808a,
+ /* 58 */ 0xe8808e, 0xe8808f, 0xe88091, 0xe88093,
+ /* 5c */ 0xe8809a, 0xe8809b, 0xe8809d, 0xe8809e,
+ /* 60 */ 0xe8809f, 0xe880a1, 0xe880a3, 0xe880a4,
+ /* 64 */ 0xe880ab, 0xe880ac, 0xe880ad, 0xe880ae,
+ /* 68 */ 0xe880af, 0xe880b0, 0xe880b2, 0xe880b4,
+ /* 6c */ 0xe880b9, 0xe880ba, 0xe880bc, 0xe880be,
+ /* 70 */ 0xe88180, 0xe88181, 0xe88184, 0xe88185,
+ /* 74 */ 0xe88187, 0xe88188, 0xe88189, 0xe8818e,
+ /* 78 */ 0xe8818f, 0xe88190, 0xe88191, 0xe88193,
+ /* 7c */ 0xe88195, 0xe88196, 0xe88197, 0x000000,
+ /* 80 */ 0xe88199, 0xe8819b, 0xe8819c, 0xe8819d,
+ /* 84 */ 0xe8819e, 0xe8819f, 0xe881a0, 0xe881a1,
+ /* 88 */ 0xe881a2, 0xe881a3, 0xe881a4, 0xe881a5,
+ /* 8c */ 0xe881a6, 0xe881a7, 0xe881a8, 0xe881ab,
+ /* 90 */ 0xe881ac, 0xe881ad, 0xe881ae, 0xe881af,
+ /* 94 */ 0xe881b0, 0xe881b2, 0xe881b3, 0xe881b4,
+ /* 98 */ 0xe881b5, 0xe881b6, 0xe881b7, 0xe881b8,
+ /* 9c */ 0xe881b9, 0xe881ba, 0xe881bb, 0xe881bc,
+ /* a0 */ 0xe881bd, 0xe99a86, 0xe59e84, 0xe68ba2,
+ /* a4 */ 0xe99987, 0xe6a5bc, 0xe5a884, 0xe69082,
+ /* a8 */ 0xe7af93, 0xe6bc8f, 0xe9998b, 0xe88aa6,
+ /* ac */ 0xe58da2, 0xe9a285, 0xe5ba90, 0xe78289,
+ /* b0 */ 0xe68eb3, 0xe58da4, 0xe8998f, 0xe9b281,
+ /* b4 */ 0xe9ba93, 0xe7a28c, 0xe99cb2, 0xe8b7af,
+ /* b8 */ 0xe8b582, 0xe9b9bf, 0xe6bd9e, 0xe7a684,
+ /* bc */ 0xe5bd95, 0xe99986, 0xe688ae, 0xe9a9b4,
+ /* c0 */ 0xe59095, 0xe9939d, 0xe4bea3, 0xe69785,
+ /* c4 */ 0xe5b1a5, 0xe5b1a1, 0xe7bc95, 0xe89991,
+ /* c8 */ 0xe6b0af, 0xe5be8b, 0xe78e87, 0xe6bba4,
+ /* cc */ 0xe7bbbf, 0xe5b3a6, 0xe68c9b, 0xe5adaa,
+ /* d0 */ 0xe6bba6, 0xe58db5, 0xe4b9b1, 0xe68ea0,
+ /* d4 */ 0xe795a5, 0xe68aa1, 0xe8bdae, 0xe4bca6,
+ /* d8 */ 0xe4bb91, 0xe6b2a6, 0xe7bab6, 0xe8aeba,
+ /* dc */ 0xe8909d, 0xe89eba, 0xe7bd97, 0xe980bb,
+ /* e0 */ 0xe994a3, 0xe7aea9, 0xe9aaa1, 0xe8a3b8,
+ /* e4 */ 0xe890bd, 0xe6b49b, 0xe9aa86, 0xe7bb9c,
+ /* e8 */ 0xe5a688, 0xe9babb, 0xe78e9b, 0xe7a081,
+ /* ec */ 0xe89a82, 0xe9a9ac, 0xe9aa82, 0xe5989b,
+ /* f0 */ 0xe59097, 0xe59f8b, 0xe4b9b0, 0xe9baa6,
+ /* f4 */ 0xe58d96, 0xe8bf88, 0xe88489, 0xe79e92,
+ /* f8 */ 0xe9a692, 0xe89bae, 0xe6bba1, 0xe89493,
+ /* fc */ 0xe69bbc, 0xe685a2, 0xe6bcab,
+
+ /*** Two byte table, leaf: c3xx - offset 0x0325e ***/
+
+ /* 40 */ 0xe881be, 0xe88281, 0xe88282, 0xe88285,
+ /* 44 */ 0xe88288, 0xe8828a, 0xe8828d, 0xe8828e,
+ /* 48 */ 0xe8828f, 0xe88290, 0xe88291, 0xe88292,
+ /* 4c */ 0xe88294, 0xe88295, 0xe88297, 0xe88299,
+ /* 50 */ 0xe8829e, 0xe882a3, 0xe882a6, 0xe882a7,
+ /* 54 */ 0xe882a8, 0xe882ac, 0xe882b0, 0xe882b3,
+ /* 58 */ 0xe882b5, 0xe882b6, 0xe882b8, 0xe882b9,
+ /* 5c */ 0xe882bb, 0xe88385, 0xe88387, 0xe88388,
+ /* 60 */ 0xe88389, 0xe8838a, 0xe8838b, 0xe8838f,
+ /* 64 */ 0xe88390, 0xe88391, 0xe88392, 0xe88393,
+ /* 68 */ 0xe88394, 0xe88395, 0xe88398, 0xe8839f,
+ /* 6c */ 0xe883a0, 0xe883a2, 0xe883a3, 0xe883a6,
+ /* 70 */ 0xe883ae, 0xe883b5, 0xe883b7, 0xe883b9,
+ /* 74 */ 0xe883bb, 0xe883be, 0xe883bf, 0xe88480,
+ /* 78 */ 0xe88481, 0xe88483, 0xe88484, 0xe88485,
+ /* 7c */ 0xe88487, 0xe88488, 0xe8848b, 0x000000,
+ /* 80 */ 0xe8848c, 0xe88495, 0xe88497, 0xe88499,
+ /* 84 */ 0xe8849b, 0xe8849c, 0xe8849d, 0xe8849f,
+ /* 88 */ 0xe884a0, 0xe884a1, 0xe884a2, 0xe884a3,
+ /* 8c */ 0xe884a4, 0xe884a5, 0xe884a6, 0xe884a7,
+ /* 90 */ 0xe884a8, 0xe884a9, 0xe884aa, 0xe884ab,
+ /* 94 */ 0xe884ad, 0xe884ae, 0xe884b0, 0xe884b3,
+ /* 98 */ 0xe884b4, 0xe884b5, 0xe884b7, 0xe884b9,
+ /* 9c */ 0xe884ba, 0xe884bb, 0xe884bc, 0xe884bd,
+ /* a0 */ 0xe884bf, 0xe8b0a9, 0xe88a92, 0xe88cab,
+ /* a4 */ 0xe79bb2, 0xe6b093, 0xe5bf99, 0xe88ebd,
+ /* a8 */ 0xe78cab, 0xe88c85, 0xe9949a, 0xe6af9b,
+ /* ac */ 0xe79f9b, 0xe99386, 0xe58daf, 0xe88c82,
+ /* b0 */ 0xe58692, 0xe5b8bd, 0xe8b28c, 0xe8b4b8,
+ /* b4 */ 0xe4b988, 0xe78eab, 0xe69e9a, 0xe6a285,
+ /* b8 */ 0xe985b6, 0xe99c89, 0xe785a4, 0xe6b2a1,
+ /* bc */ 0xe79c89, 0xe5aa92, 0xe99581, 0xe6af8f,
+ /* c0 */ 0xe7be8e, 0xe698a7, 0xe5af90, 0xe5a6b9,
+ /* c4 */ 0xe5aa9a, 0xe997a8, 0xe997b7, 0xe4bbac,
+ /* c8 */ 0xe8908c, 0xe89299, 0xe6aaac, 0xe79b9f,
+ /* cc */ 0xe994b0, 0xe78c9b, 0xe6a2a6, 0xe5ad9f,
+ /* d0 */ 0xe79caf, 0xe9869a, 0xe99da1, 0xe7b39c,
+ /* d4 */ 0xe8bfb7, 0xe8b09c, 0xe5bca5, 0xe7b1b3,
+ /* d8 */ 0xe7a798, 0xe8a785, 0xe6b38c, 0xe89c9c,
+ /* dc */ 0xe5af86, 0xe5b982, 0xe6a389, 0xe79ca0,
+ /* e0 */ 0xe7bbb5, 0xe58695, 0xe5858d, 0xe58b89,
+ /* e4 */ 0xe5a8a9, 0xe7bc85, 0xe99da2, 0xe88b97,
+ /* e8 */ 0xe68f8f, 0xe79e84, 0xe89790, 0xe7a792,
+ /* ec */ 0xe6b8ba, 0xe5ba99, 0xe5a699, 0xe89491,
+ /* f0 */ 0xe781ad, 0xe6b091, 0xe68abf, 0xe79abf,
+ /* f4 */ 0xe6958f, 0xe682af, 0xe997bd, 0xe6988e,
+ /* f8 */ 0xe89e9f, 0xe9b8a3, 0xe993ad, 0xe5908d,
+ /* fc */ 0xe591bd, 0xe8b0ac, 0xe691b8,
+
+ /*** Two byte table, leaf: c4xx - offset 0x0331d ***/
+
+ /* 40 */ 0xe88580, 0xe88581, 0xe88582, 0xe88583,
+ /* 44 */ 0xe88584, 0xe88585, 0xe88587, 0xe88589,
+ /* 48 */ 0xe8858d, 0xe8858e, 0xe8858f, 0xe88592,
+ /* 4c */ 0xe88596, 0xe88597, 0xe88598, 0xe8859b,
+ /* 50 */ 0xe8859c, 0xe8859d, 0xe8859e, 0xe8859f,
+ /* 54 */ 0xe885a1, 0xe885a2, 0xe885a3, 0xe885a4,
+ /* 58 */ 0xe885a6, 0xe885a8, 0xe885aa, 0xe885ab,
+ /* 5c */ 0xe885ac, 0xe885af, 0xe885b2, 0xe885b3,
+ /* 60 */ 0xe885b5, 0xe885b6, 0xe885b7, 0xe885b8,
+ /* 64 */ 0xe88681, 0xe88683, 0xe88684, 0xe88685,
+ /* 68 */ 0xe88686, 0xe88687, 0xe88689, 0xe8868b,
+ /* 6c */ 0xe8868c, 0xe8868d, 0xe8868e, 0xe88690,
+ /* 70 */ 0xe88692, 0xe88693, 0xe88694, 0xe88695,
+ /* 74 */ 0xe88696, 0xe88697, 0xe88699, 0xe8869a,
+ /* 78 */ 0xe8869e, 0xe8869f, 0xe886a0, 0xe886a1,
+ /* 7c */ 0xe886a2, 0xe886a4, 0xe886a5, 0x000000,
+ /* 80 */ 0xe886a7, 0xe886a9, 0xe886ab, 0xe886ac,
+ /* 84 */ 0xe886ad, 0xe886ae, 0xe886af, 0xe886b0,
+ /* 88 */ 0xe886b1, 0xe886b2, 0xe886b4, 0xe886b5,
+ /* 8c */ 0xe886b6, 0xe886b7, 0xe886b8, 0xe886b9,
+ /* 90 */ 0xe886bc, 0xe886bd, 0xe886be, 0xe886bf,
+ /* 94 */ 0xe88784, 0xe88785, 0xe88787, 0xe88788,
+ /* 98 */ 0xe88789, 0xe8878b, 0xe8878d, 0xe8878e,
+ /* 9c */ 0xe8878f, 0xe88790, 0xe88791, 0xe88792,
+ /* a0 */ 0xe88793, 0xe691b9, 0xe89891, 0xe6a8a1,
+ /* a4 */ 0xe8869c, 0xe7a3a8, 0xe691a9, 0xe9ad94,
+ /* a8 */ 0xe68ab9, 0xe69cab, 0xe88eab, 0xe5a2a8,
+ /* ac */ 0xe9bb98, 0xe6b2ab, 0xe6bca0, 0xe5af9e,
+ /* b0 */ 0xe9998c, 0xe8b08b, 0xe7899f, 0xe69f90,
+ /* b4 */ 0xe68b87, 0xe789a1, 0xe4baa9, 0xe5a786,
+ /* b8 */ 0xe6af8d, 0xe5a293, 0xe69aae, 0xe5b995,
+ /* bc */ 0xe58b9f, 0xe68595, 0xe69ca8, 0xe79bae,
+ /* c0 */ 0xe79da6, 0xe789a7, 0xe7a986, 0xe68bbf,
+ /* c4 */ 0xe593aa, 0xe59190, 0xe992a0, 0xe982a3,
+ /* c8 */ 0xe5a89c, 0xe7bab3, 0xe6b096, 0xe4b983,
+ /* cc */ 0xe5a5b6, 0xe88090, 0xe5a588, 0xe58d97,
+ /* d0 */ 0xe794b7, 0xe99abe, 0xe59b8a, 0xe68ca0,
+ /* d4 */ 0xe88491, 0xe681bc, 0xe997b9, 0xe6b796,
+ /* d8 */ 0xe591a2, 0xe9a681, 0xe58685, 0xe5aba9,
+ /* dc */ 0xe883bd, 0xe5a6ae, 0xe99c93, 0xe580aa,
+ /* e0 */ 0xe6b3a5, 0xe5b0bc, 0xe68b9f, 0xe4bda0,
+ /* e4 */ 0xe58cbf, 0xe885bb, 0xe98086, 0xe6baba,
+ /* e8 */ 0xe894ab, 0xe68b88, 0xe5b9b4, 0xe7a2be,
+ /* ec */ 0xe692b5, 0xe68dbb, 0xe5bfb5, 0xe5a898,
+ /* f0 */ 0xe985bf, 0xe9b89f, 0xe5b0bf, 0xe68d8f,
+ /* f4 */ 0xe88182, 0xe5adbd, 0xe595ae, 0xe9958a,
+ /* f8 */ 0xe9958d, 0xe6b685, 0xe682a8, 0xe69fa0,
+ /* fc */ 0xe78b9e, 0xe5879d, 0xe5ae81,
+
+ /*** Two byte table, leaf: c5xx - offset 0x033dc ***/
+
+ /* 40 */ 0xe88794, 0xe88795, 0xe88796, 0xe88797,
+ /* 44 */ 0xe88798, 0xe88799, 0xe8879a, 0xe8879b,
+ /* 48 */ 0xe8879c, 0xe8879d, 0xe8879e, 0xe8879f,
+ /* 4c */ 0xe887a0, 0xe887a1, 0xe887a2, 0xe887a4,
+ /* 50 */ 0xe887a5, 0xe887a6, 0xe887a8, 0xe887a9,
+ /* 54 */ 0xe887ab, 0xe887ae, 0xe887af, 0xe887b0,
+ /* 58 */ 0xe887b1, 0xe887b2, 0xe887b5, 0xe887b6,
+ /* 5c */ 0xe887b7, 0xe887b8, 0xe887b9, 0xe887ba,
+ /* 60 */ 0xe887bd, 0xe887bf, 0xe88883, 0xe88887,
+ /* 64 */ 0xe88888, 0xe88889, 0xe8888a, 0xe8888b,
+ /* 68 */ 0xe8888e, 0xe8888f, 0xe88891, 0xe88893,
+ /* 6c */ 0xe88895, 0xe88896, 0xe88897, 0xe88898,
+ /* 70 */ 0xe88899, 0xe8889a, 0xe8889d, 0xe888a0,
+ /* 74 */ 0xe888a4, 0xe888a5, 0xe888a6, 0xe888a7,
+ /* 78 */ 0xe888a9, 0xe888ae, 0xe888b2, 0xe888ba,
+ /* 7c */ 0xe888bc, 0xe888bd, 0xe888bf, 0x000000,
+ /* 80 */ 0xe88980, 0xe88981, 0xe88982, 0xe88983,
+ /* 84 */ 0xe88985, 0xe88986, 0xe88988, 0xe8898a,
+ /* 88 */ 0xe8898c, 0xe8898d, 0xe8898e, 0xe88990,
+ /* 8c */ 0xe88991, 0xe88992, 0xe88993, 0xe88994,
+ /* 90 */ 0xe88995, 0xe88996, 0xe88997, 0xe88999,
+ /* 94 */ 0xe8899b, 0xe8899c, 0xe8899d, 0xe8899e,
+ /* 98 */ 0xe889a0, 0xe889a1, 0xe889a2, 0xe889a3,
+ /* 9c */ 0xe889a4, 0xe889a5, 0xe889a6, 0xe889a7,
+ /* a0 */ 0xe889a9, 0xe68ba7, 0xe6b39e, 0xe7899b,
+ /* a4 */ 0xe689ad, 0xe992ae, 0xe7babd, 0xe88493,
+ /* a8 */ 0xe6b593, 0xe5869c, 0xe5bc84, 0xe5a5b4,
+ /* ac */ 0xe58aaa, 0xe68092, 0xe5a5b3, 0xe69a96,
+ /* b0 */ 0xe89990, 0xe7969f, 0xe68caa, 0xe687a6,
+ /* b4 */ 0xe7b3af, 0xe8afba, 0xe593a6, 0xe6aca7,
+ /* b8 */ 0xe9b8a5, 0xe6aeb4, 0xe89795, 0xe59195,
+ /* bc */ 0xe581b6, 0xe6b2a4, 0xe595aa, 0xe8b6b4,
+ /* c0 */ 0xe788ac, 0xe5b895, 0xe68095, 0xe790b6,
+ /* c4 */ 0xe68b8d, 0xe68e92, 0xe7898c, 0xe5be98,
+ /* c8 */ 0xe6b983, 0xe6b4be, 0xe69480, 0xe6bd98,
+ /* cc */ 0xe79b98, 0xe7a390, 0xe79bbc, 0xe79594,
+ /* d0 */ 0xe588a4, 0xe58f9b, 0xe4b993, 0xe5ba9e,
+ /* d4 */ 0xe69781, 0xe880aa, 0xe88396, 0xe68a9b,
+ /* d8 */ 0xe59286, 0xe588a8, 0xe782ae, 0xe8a28d,
+ /* dc */ 0xe8b791, 0xe6b3a1, 0xe591b8, 0xe8839a,
+ /* e0 */ 0xe59fb9, 0xe8a3b4, 0xe8b594, 0xe999aa,
+ /* e4 */ 0xe9858d, 0xe4bda9, 0xe6b29b, 0xe596b7,
+ /* e8 */ 0xe79b86, 0xe7a0b0, 0xe68aa8, 0xe783b9,
+ /* ec */ 0xe6be8e, 0xe5bdad, 0xe893ac, 0xe6a39a,
+ /* f0 */ 0xe7a1bc, 0xe7afb7, 0xe886a8, 0xe69c8b,
+ /* f4 */ 0xe9b98f, 0xe68da7, 0xe7a2b0, 0xe59daf,
+ /* f8 */ 0xe7a092, 0xe99cb9, 0xe689b9, 0xe68aab,
+ /* fc */ 0xe58a88, 0xe790b5, 0xe6af97,
+
+ /*** Two byte table, leaf: c6xx - offset 0x0349b ***/
+
+ /* 40 */ 0xe889aa, 0xe889ab, 0xe889ac, 0xe889ad,
+ /* 44 */ 0xe889b1, 0xe889b5, 0xe889b6, 0xe889b7,
+ /* 48 */ 0xe889b8, 0xe889bb, 0xe889bc, 0xe88a80,
+ /* 4c */ 0xe88a81, 0xe88a83, 0xe88a85, 0xe88a86,
+ /* 50 */ 0xe88a87, 0xe88a89, 0xe88a8c, 0xe88a90,
+ /* 54 */ 0xe88a93, 0xe88a94, 0xe88a95, 0xe88a96,
+ /* 58 */ 0xe88a9a, 0xe88a9b, 0xe88a9e, 0xe88aa0,
+ /* 5c */ 0xe88aa2, 0xe88aa3, 0xe88aa7, 0xe88ab2,
+ /* 60 */ 0xe88ab5, 0xe88ab6, 0xe88aba, 0xe88abb,
+ /* 64 */ 0xe88abc, 0xe88abf, 0xe88b80, 0xe88b82,
+ /* 68 */ 0xe88b83, 0xe88b85, 0xe88b86, 0xe88b89,
+ /* 6c */ 0xe88b90, 0xe88b96, 0xe88b99, 0xe88b9a,
+ /* 70 */ 0xe88b9d, 0xe88ba2, 0xe88ba7, 0xe88ba8,
+ /* 74 */ 0xe88ba9, 0xe88baa, 0xe88bac, 0xe88bad,
+ /* 78 */ 0xe88bae, 0xe88bb0, 0xe88bb2, 0xe88bb3,
+ /* 7c */ 0xe88bb5, 0xe88bb6, 0xe88bb8, 0x000000,
+ /* 80 */ 0xe88bba, 0xe88bbc, 0xe88bbd, 0xe88bbe,
+ /* 84 */ 0xe88bbf, 0xe88c80, 0xe88c8a, 0xe88c8b,
+ /* 88 */ 0xe88c8d, 0xe88c90, 0xe88c92, 0xe88c93,
+ /* 8c */ 0xe88c96, 0xe88c98, 0xe88c99, 0xe88c9d,
+ /* 90 */ 0xe88c9e, 0xe88c9f, 0xe88ca0, 0xe88ca1,
+ /* 94 */ 0xe88ca2, 0xe88ca3, 0xe88ca4, 0xe88ca5,
+ /* 98 */ 0xe88ca6, 0xe88ca9, 0xe88caa, 0xe88cae,
+ /* 9c */ 0xe88cb0, 0xe88cb2, 0xe88cb7, 0xe88cbb,
+ /* a0 */ 0xe88cbd, 0xe595a4, 0xe884be, 0xe796b2,
+ /* a4 */ 0xe79aae, 0xe58cb9, 0xe7979e, 0xe583bb,
+ /* a8 */ 0xe5b181, 0xe8adac, 0xe7af87, 0xe5818f,
+ /* ac */ 0xe78987, 0xe9aa97, 0xe9a398, 0xe6bc82,
+ /* b0 */ 0xe793a2, 0xe7a5a8, 0xe69287, 0xe79ea5,
+ /* b4 */ 0xe68bbc, 0xe9a291, 0xe8b4ab, 0xe59381,
+ /* b8 */ 0xe88198, 0xe4b992, 0xe59daa, 0xe88bb9,
+ /* bc */ 0xe8908d, 0xe5b9b3, 0xe587ad, 0xe793b6,
+ /* c0 */ 0xe8af84, 0xe5b18f, 0xe59da1, 0xe6b3bc,
+ /* c4 */ 0xe9a287, 0xe5a986, 0xe7a0b4, 0xe9ad84,
+ /* c8 */ 0xe8bfab, 0xe7b295, 0xe58996, 0xe68991,
+ /* cc */ 0xe993ba, 0xe4bb86, 0xe88e86, 0xe891a1,
+ /* d0 */ 0xe88fa9, 0xe892b2, 0xe59f94, 0xe69cb4,
+ /* d4 */ 0xe59c83, 0xe699ae, 0xe6b5a6, 0xe8b0b1,
+ /* d8 */ 0xe69b9d, 0xe78091, 0xe69c9f, 0xe6acba,
+ /* dc */ 0xe6a096, 0xe6889a, 0xe5a6bb, 0xe4b883,
+ /* e0 */ 0xe58784, 0xe6bc86, 0xe69f92, 0xe6b28f,
+ /* e4 */ 0xe585b6, 0xe6a38b, 0xe5a587, 0xe6ada7,
+ /* e8 */ 0xe795a6, 0xe5b48e, 0xe88490, 0xe9bd90,
+ /* ec */ 0xe69797, 0xe7a588, 0xe7a581, 0xe9aa91,
+ /* f0 */ 0xe8b5b7, 0xe5b282, 0xe4b99e, 0xe4bc81,
+ /* f4 */ 0xe590af, 0xe5a591, 0xe7a08c, 0xe599a8,
+ /* f8 */ 0xe6b094, 0xe8bf84, 0xe5bc83, 0xe6b1bd,
+ /* fc */ 0xe6b3a3, 0xe8aeab, 0xe68e90,
+
+ /*** Two byte table, leaf: c7xx - offset 0x0355a ***/
+
+ /* 40 */ 0xe88cbe, 0xe88cbf, 0xe88d81, 0xe88d82,
+ /* 44 */ 0xe88d84, 0xe88d85, 0xe88d88, 0xe88d8a,
+ /* 48 */ 0xe88d8b, 0xe88d8c, 0xe88d8d, 0xe88d8e,
+ /* 4c */ 0xe88d93, 0xe88d95, 0xe88d96, 0xe88d97,
+ /* 50 */ 0xe88d98, 0xe88d99, 0xe88d9d, 0xe88da2,
+ /* 54 */ 0xe88db0, 0xe88db1, 0xe88db2, 0xe88db3,
+ /* 58 */ 0xe88db4, 0xe88db5, 0xe88db6, 0xe88db9,
+ /* 5c */ 0xe88dba, 0xe88dbe, 0xe88dbf, 0xe88e80,
+ /* 60 */ 0xe88e81, 0xe88e82, 0xe88e83, 0xe88e84,
+ /* 64 */ 0xe88e87, 0xe88e88, 0xe88e8a, 0xe88e8b,
+ /* 68 */ 0xe88e8c, 0xe88e8d, 0xe88e8f, 0xe88e90,
+ /* 6c */ 0xe88e91, 0xe88e94, 0xe88e95, 0xe88e96,
+ /* 70 */ 0xe88e97, 0xe88e99, 0xe88e9a, 0xe88e9d,
+ /* 74 */ 0xe88e9f, 0xe88ea1, 0xe88ea2, 0xe88ea3,
+ /* 78 */ 0xe88ea4, 0xe88ea5, 0xe88ea6, 0xe88ea7,
+ /* 7c */ 0xe88eac, 0xe88ead, 0xe88eae, 0x000000,
+ /* 80 */ 0xe88eaf, 0xe88eb5, 0xe88ebb, 0xe88ebe,
+ /* 84 */ 0xe88ebf, 0xe88f82, 0xe88f83, 0xe88f84,
+ /* 88 */ 0xe88f86, 0xe88f88, 0xe88f89, 0xe88f8b,
+ /* 8c */ 0xe88f8d, 0xe88f8e, 0xe88f90, 0xe88f91,
+ /* 90 */ 0xe88f92, 0xe88f93, 0xe88f95, 0xe88f97,
+ /* 94 */ 0xe88f99, 0xe88f9a, 0xe88f9b, 0xe88f9e,
+ /* 98 */ 0xe88fa2, 0xe88fa3, 0xe88fa4, 0xe88fa6,
+ /* 9c */ 0xe88fa7, 0xe88fa8, 0xe88fab, 0xe88fac,
+ /* a0 */ 0xe88fad, 0xe681b0, 0xe6b4bd, 0xe789b5,
+ /* a4 */ 0xe689a6, 0xe9928e, 0xe99385, 0xe58d83,
+ /* a8 */ 0xe8bf81, 0xe7adbe, 0xe4bb9f, 0xe8b0a6,
+ /* ac */ 0xe4b9be, 0xe9bb94, 0xe992b1, 0xe992b3,
+ /* b0 */ 0xe5898d, 0xe6bd9c, 0xe981a3, 0xe6b585,
+ /* b4 */ 0xe8b0b4, 0xe5a091, 0xe5b58c, 0xe6aca0,
+ /* b8 */ 0xe6ad89, 0xe69eaa, 0xe5919b, 0xe88594,
+ /* bc */ 0xe7be8c, 0xe5a299, 0xe894b7, 0xe5bcba,
+ /* c0 */ 0xe68aa2, 0xe6a987, 0xe994b9, 0xe695b2,
+ /* c4 */ 0xe68284, 0xe6a1a5, 0xe79ea7, 0xe4b994,
+ /* c8 */ 0xe4bea8, 0xe5b7a7, 0xe99e98, 0xe692ac,
+ /* cc */ 0xe7bf98, 0xe5b3ad, 0xe4bf8f, 0xe7aa8d,
+ /* d0 */ 0xe58887, 0xe88c84, 0xe4b894, 0xe680af,
+ /* d4 */ 0xe7aa83, 0xe992a6, 0xe4beb5, 0xe4bab2,
+ /* d8 */ 0xe7a7a6, 0xe790b4, 0xe58ba4, 0xe88ab9,
+ /* dc */ 0xe69392, 0xe7a6bd, 0xe5af9d, 0xe6b281,
+ /* e0 */ 0xe99d92, 0xe8bdbb, 0xe6b0a2, 0xe580be,
+ /* e4 */ 0xe58dbf, 0xe6b885, 0xe6938e, 0xe699b4,
+ /* e8 */ 0xe6b0b0, 0xe68385, 0xe9a1b7, 0xe8afb7,
+ /* ec */ 0xe5ba86, 0xe790bc, 0xe7a9b7, 0xe7a78b,
+ /* f0 */ 0xe4b898, 0xe982b1, 0xe79083, 0xe6b182,
+ /* f4 */ 0xe59b9a, 0xe9858b, 0xe6b385, 0xe8b68b,
+ /* f8 */ 0xe58cba, 0xe89b86, 0xe69bb2, 0xe8baaf,
+ /* fc */ 0xe5b188, 0xe9a9b1, 0xe6b8a0,
+
+ /*** Two byte table, leaf: c8xx - offset 0x03619 ***/
+
+ /* 40 */ 0xe88fae, 0xe88faf, 0xe88fb3, 0xe88fb4,
+ /* 44 */ 0xe88fb5, 0xe88fb6, 0xe88fb7, 0xe88fba,
+ /* 48 */ 0xe88fbb, 0xe88fbc, 0xe88fbe, 0xe88fbf,
+ /* 4c */ 0xe89080, 0xe89082, 0xe89085, 0xe89087,
+ /* 50 */ 0xe89088, 0xe89089, 0xe8908a, 0xe89090,
+ /* 54 */ 0xe89092, 0xe89093, 0xe89094, 0xe89095,
+ /* 58 */ 0xe89096, 0xe89097, 0xe89099, 0xe8909a,
+ /* 5c */ 0xe8909b, 0xe8909e, 0xe8909f, 0xe890a0,
+ /* 60 */ 0xe890a1, 0xe890a2, 0xe890a3, 0xe890a9,
+ /* 64 */ 0xe890aa, 0xe890ab, 0xe890ac, 0xe890ad,
+ /* 68 */ 0xe890ae, 0xe890af, 0xe890b0, 0xe890b2,
+ /* 6c */ 0xe890b3, 0xe890b4, 0xe890b5, 0xe890b6,
+ /* 70 */ 0xe890b7, 0xe890b9, 0xe890ba, 0xe890bb,
+ /* 74 */ 0xe890be, 0xe890bf, 0xe89180, 0xe89181,
+ /* 78 */ 0xe89182, 0xe89183, 0xe89184, 0xe89185,
+ /* 7c */ 0xe89187, 0xe89188, 0xe89189, 0x000000,
+ /* 80 */ 0xe8918a, 0xe8918b, 0xe8918c, 0xe8918d,
+ /* 84 */ 0xe8918e, 0xe8918f, 0xe89190, 0xe89192,
+ /* 88 */ 0xe89193, 0xe89194, 0xe89195, 0xe89196,
+ /* 8c */ 0xe89198, 0xe8919d, 0xe8919e, 0xe8919f,
+ /* 90 */ 0xe891a0, 0xe891a2, 0xe891a4, 0xe891a5,
+ /* 94 */ 0xe891a6, 0xe891a7, 0xe891a8, 0xe891aa,
+ /* 98 */ 0xe891ae, 0xe891af, 0xe891b0, 0xe891b2,
+ /* 9c */ 0xe891b4, 0xe891b7, 0xe891b9, 0xe891bb,
+ /* a0 */ 0xe891bc, 0xe58f96, 0xe5a8b6, 0xe9be8b,
+ /* a4 */ 0xe8b6a3, 0xe58ebb, 0xe59c88, 0xe9a2a7,
+ /* a8 */ 0xe69d83, 0xe9869b, 0xe6b389, 0xe585a8,
+ /* ac */ 0xe7978a, 0xe68bb3, 0xe78aac, 0xe588b8,
+ /* b0 */ 0xe58a9d, 0xe7bcba, 0xe78294, 0xe798b8,
+ /* b4 */ 0xe58db4, 0xe9b98a, 0xe6a6b7, 0xe7a1ae,
+ /* b8 */ 0xe99b80, 0xe8a399, 0xe7bea4, 0xe784b6,
+ /* bc */ 0xe78783, 0xe58689, 0xe69f93, 0xe793a4,
+ /* c0 */ 0xe5a3a4, 0xe69498, 0xe59ab7, 0xe8aea9,
+ /* c4 */ 0xe9a5b6, 0xe689b0, 0xe7bb95, 0xe683b9,
+ /* c8 */ 0xe783ad, 0xe5a3ac, 0xe4bb81, 0xe4baba,
+ /* cc */ 0xe5bf8d, 0xe99fa7, 0xe4bbbb, 0xe8aea4,
+ /* d0 */ 0xe58883, 0xe5a68a, 0xe7baab, 0xe68994,
+ /* d4 */ 0xe4bb8d, 0xe697a5, 0xe6888e, 0xe88cb8,
+ /* d8 */ 0xe89389, 0xe88da3, 0xe89e8d, 0xe78694,
+ /* dc */ 0xe6bab6, 0xe5aeb9, 0xe7bb92, 0xe58697,
+ /* e0 */ 0xe68f89, 0xe69f94, 0xe88289, 0xe88cb9,
+ /* e4 */ 0xe8a095, 0xe58492, 0xe5adba, 0xe5a682,
+ /* e8 */ 0xe8beb1, 0xe4b9b3, 0xe6b19d, 0xe585a5,
+ /* ec */ 0xe8a4a5, 0xe8bdaf, 0xe998ae, 0xe8958a,
+ /* f0 */ 0xe7919e, 0xe99490, 0xe997b0, 0xe6b6a6,
+ /* f4 */ 0xe88ba5, 0xe5bcb1, 0xe69292, 0xe6b492,
+ /* f8 */ 0xe890a8, 0xe885ae, 0xe9b383, 0xe5a19e,
+ /* fc */ 0xe8b59b, 0xe4b889, 0xe58f81,
+
+ /*** Two byte table, leaf: c9xx - offset 0x036d8 ***/
+
+ /* 40 */ 0xe891bd, 0xe891be, 0xe891bf, 0xe89280,
+ /* 44 */ 0xe89281, 0xe89283, 0xe89284, 0xe89285,
+ /* 48 */ 0xe89286, 0xe8928a, 0xe8928d, 0xe8928f,
+ /* 4c */ 0xe89290, 0xe89291, 0xe89292, 0xe89293,
+ /* 50 */ 0xe89294, 0xe89295, 0xe89296, 0xe89298,
+ /* 54 */ 0xe8929a, 0xe8929b, 0xe8929d, 0xe8929e,
+ /* 58 */ 0xe8929f, 0xe892a0, 0xe892a2, 0xe892a3,
+ /* 5c */ 0xe892a4, 0xe892a5, 0xe892a6, 0xe892a7,
+ /* 60 */ 0xe892a8, 0xe892a9, 0xe892aa, 0xe892ab,
+ /* 64 */ 0xe892ac, 0xe892ad, 0xe892ae, 0xe892b0,
+ /* 68 */ 0xe892b1, 0xe892b3, 0xe892b5, 0xe892b6,
+ /* 6c */ 0xe892b7, 0xe892bb, 0xe892bc, 0xe892be,
+ /* 70 */ 0xe89380, 0xe89382, 0xe89383, 0xe89385,
+ /* 74 */ 0xe89386, 0xe89387, 0xe89388, 0xe8938b,
+ /* 78 */ 0xe8938c, 0xe8938e, 0xe8938f, 0xe89392,
+ /* 7c */ 0xe89394, 0xe89395, 0xe89397, 0x000000,
+ /* 80 */ 0xe89398, 0xe89399, 0xe8939a, 0xe8939b,
+ /* 84 */ 0xe8939c, 0xe8939e, 0xe893a1, 0xe893a2,
+ /* 88 */ 0xe893a4, 0xe893a7, 0xe893a8, 0xe893a9,
+ /* 8c */ 0xe893aa, 0xe893ab, 0xe893ad, 0xe893ae,
+ /* 90 */ 0xe893af, 0xe893b1, 0xe893b2, 0xe893b3,
+ /* 94 */ 0xe893b4, 0xe893b5, 0xe893b6, 0xe893b7,
+ /* 98 */ 0xe893b8, 0xe893b9, 0xe893ba, 0xe893bb,
+ /* 9c */ 0xe893bd, 0xe893be, 0xe89480, 0xe89481,
+ /* a0 */ 0xe89482, 0xe4bc9e, 0xe695a3, 0xe6a191,
+ /* a4 */ 0xe59793, 0xe4b8a7, 0xe69094, 0xe9aa9a,
+ /* a8 */ 0xe689ab, 0xe5ab82, 0xe7919f, 0xe889b2,
+ /* ac */ 0xe6b6a9, 0xe6a3ae, 0xe583a7, 0xe88e8e,
+ /* b0 */ 0xe7a082, 0xe69d80, 0xe588b9, 0xe6b299,
+ /* b4 */ 0xe7bab1, 0xe582bb, 0xe595a5, 0xe7859e,
+ /* b8 */ 0xe7ad9b, 0xe69992, 0xe78f8a, 0xe88bab,
+ /* bc */ 0xe69d89, 0xe5b1b1, 0xe588a0, 0xe785bd,
+ /* c0 */ 0xe8a1ab, 0xe997aa, 0xe99995, 0xe69385,
+ /* c4 */ 0xe8b5a1, 0xe886b3, 0xe59684, 0xe6b195,
+ /* c8 */ 0xe68987, 0xe7bcae, 0xe5a292, 0xe4bca4,
+ /* cc */ 0xe59586, 0xe8b58f, 0xe6998c, 0xe4b88a,
+ /* d0 */ 0xe5b09a, 0xe8a3b3, 0xe6a2a2, 0xe68d8e,
+ /* d4 */ 0xe7a88d, 0xe783a7, 0xe88a8d, 0xe58bba,
+ /* d8 */ 0xe99fb6, 0xe5b091, 0xe593a8, 0xe982b5,
+ /* dc */ 0xe7bb8d, 0xe5a5a2, 0xe8b58a, 0xe89b87,
+ /* e0 */ 0xe8888c, 0xe8888d, 0xe8b5a6, 0xe69184,
+ /* e4 */ 0xe5b084, 0xe68591, 0xe6b689, 0xe7a4be,
+ /* e8 */ 0xe8aebe, 0xe7a0b7, 0xe794b3, 0xe591bb,
+ /* ec */ 0xe4bcb8, 0xe8baab, 0xe6b7b1, 0xe5a8a0,
+ /* f0 */ 0xe7bb85, 0xe7a59e, 0xe6b288, 0xe5aea1,
+ /* f4 */ 0xe5a9b6, 0xe7949a, 0xe882be, 0xe6858e,
+ /* f8 */ 0xe6b897, 0xe5a3b0, 0xe7949f, 0xe794a5,
+ /* fc */ 0xe789b2, 0xe58d87, 0xe7bbb3,
+
+ /*** Two byte table, leaf: caxx - offset 0x03797 ***/
+
+ /* 40 */ 0xe89483, 0xe89484, 0xe89485, 0xe89486,
+ /* 44 */ 0xe89487, 0xe89488, 0xe89489, 0xe8948a,
+ /* 48 */ 0xe8948b, 0xe8948d, 0xe8948e, 0xe8948f,
+ /* 4c */ 0xe89490, 0xe89492, 0xe89494, 0xe89495,
+ /* 50 */ 0xe89496, 0xe89498, 0xe89499, 0xe8949b,
+ /* 54 */ 0xe8949c, 0xe8949d, 0xe8949e, 0xe894a0,
+ /* 58 */ 0xe894a2, 0xe894a3, 0xe894a4, 0xe894a5,
+ /* 5c */ 0xe894a6, 0xe894a7, 0xe894a8, 0xe894a9,
+ /* 60 */ 0xe894aa, 0xe894ad, 0xe894ae, 0xe894af,
+ /* 64 */ 0xe894b0, 0xe894b1, 0xe894b2, 0xe894b3,
+ /* 68 */ 0xe894b4, 0xe894b5, 0xe894b6, 0xe894be,
+ /* 6c */ 0xe894bf, 0xe89580, 0xe89581, 0xe89582,
+ /* 70 */ 0xe89584, 0xe89585, 0xe89586, 0xe89587,
+ /* 74 */ 0xe8958b, 0xe8958c, 0xe8958d, 0xe8958e,
+ /* 78 */ 0xe8958f, 0xe89590, 0xe89591, 0xe89592,
+ /* 7c */ 0xe89593, 0xe89594, 0xe89595, 0x000000,
+ /* 80 */ 0xe89597, 0xe89598, 0xe8959a, 0xe8959b,
+ /* 84 */ 0xe8959c, 0xe8959d, 0xe8959f, 0xe895a0,
+ /* 88 */ 0xe895a1, 0xe895a2, 0xe895a3, 0xe895a5,
+ /* 8c */ 0xe895a6, 0xe895a7, 0xe895a9, 0xe895aa,
+ /* 90 */ 0xe895ab, 0xe895ac, 0xe895ad, 0xe895ae,
+ /* 94 */ 0xe895af, 0xe895b0, 0xe895b1, 0xe895b3,
+ /* 98 */ 0xe895b5, 0xe895b6, 0xe895b7, 0xe895b8,
+ /* 9c */ 0xe895bc, 0xe895bd, 0xe895bf, 0xe89680,
+ /* a0 */ 0xe89681, 0xe79c81, 0xe79b9b, 0xe589a9,
+ /* a4 */ 0xe8839c, 0xe59ca3, 0xe5b888, 0xe5a4b1,
+ /* a8 */ 0xe78bae, 0xe696bd, 0xe6b9bf, 0xe8af97,
+ /* ac */ 0xe5b0b8, 0xe899b1, 0xe58d81, 0xe79fb3,
+ /* b0 */ 0xe68bbe, 0xe697b6, 0xe4bb80, 0xe9a39f,
+ /* b4 */ 0xe89a80, 0xe5ae9e, 0xe8af86, 0xe58fb2,
+ /* b8 */ 0xe79fa2, 0xe4bdbf, 0xe5b18e, 0xe9a9b6,
+ /* bc */ 0xe5a78b, 0xe5bc8f, 0xe7a4ba, 0xe5a3ab,
+ /* c0 */ 0xe4b896, 0xe69fbf, 0xe4ba8b, 0xe68bad,
+ /* c4 */ 0xe8aa93, 0xe9809d, 0xe58abf, 0xe698af,
+ /* c8 */ 0xe5979c, 0xe599ac, 0xe98082, 0xe4bb95,
+ /* cc */ 0xe4be8d, 0xe9878a, 0xe9a5b0, 0xe6b08f,
+ /* d0 */ 0xe5b882, 0xe68183, 0xe5aea4, 0xe8a786,
+ /* d4 */ 0xe8af95, 0xe694b6, 0xe6898b, 0xe9a696,
+ /* d8 */ 0xe5ae88, 0xe5afbf, 0xe68e88, 0xe594ae,
+ /* dc */ 0xe58f97, 0xe798a6, 0xe585bd, 0xe894ac,
+ /* e0 */ 0xe69ea2, 0xe6a2b3, 0xe6ae8a, 0xe68a92,
+ /* e4 */ 0xe8be93, 0xe58f94, 0xe88892, 0xe6b791,
+ /* e8 */ 0xe7968f, 0xe4b9a6, 0xe8b58e, 0xe5adb0,
+ /* ec */ 0xe7869f, 0xe896af, 0xe69a91, 0xe69b99,
+ /* f0 */ 0xe7bdb2, 0xe89c80, 0xe9bb8d, 0xe9bca0,
+ /* f4 */ 0xe5b19e, 0xe69caf, 0xe8bfb0, 0xe6a091,
+ /* f8 */ 0xe69d9f, 0xe6888d, 0xe7ab96, 0xe5a285,
+ /* fc */ 0xe5bab6, 0xe695b0, 0xe6bcb1,
+
+ /*** Two byte table, leaf: cbxx - offset 0x03856 ***/
+
+ /* 40 */ 0xe89682, 0xe89683, 0xe89686, 0xe89688,
+ /* 44 */ 0xe89689, 0xe8968a, 0xe8968b, 0xe8968c,
+ /* 48 */ 0xe8968d, 0xe8968e, 0xe89690, 0xe89691,
+ /* 4c */ 0xe89692, 0xe89693, 0xe89694, 0xe89695,
+ /* 50 */ 0xe89696, 0xe89697, 0xe89698, 0xe89699,
+ /* 54 */ 0xe8969a, 0xe8969d, 0xe8969e, 0xe8969f,
+ /* 58 */ 0xe896a0, 0xe896a1, 0xe896a2, 0xe896a3,
+ /* 5c */ 0xe896a5, 0xe896a6, 0xe896a7, 0xe896a9,
+ /* 60 */ 0xe896ab, 0xe896ac, 0xe896ad, 0xe896b1,
+ /* 64 */ 0xe896b2, 0xe896b3, 0xe896b4, 0xe896b5,
+ /* 68 */ 0xe896b6, 0xe896b8, 0xe896ba, 0xe896bb,
+ /* 6c */ 0xe896bc, 0xe896bd, 0xe896be, 0xe896bf,
+ /* 70 */ 0xe89780, 0xe89782, 0xe89783, 0xe89784,
+ /* 74 */ 0xe89785, 0xe89786, 0xe89787, 0xe89788,
+ /* 78 */ 0xe8978a, 0xe8978b, 0xe8978c, 0xe8978d,
+ /* 7c */ 0xe8978e, 0xe89791, 0xe89792, 0x000000,
+ /* 80 */ 0xe89794, 0xe89796, 0xe89797, 0xe89798,
+ /* 84 */ 0xe89799, 0xe8979a, 0xe8979b, 0xe8979d,
+ /* 88 */ 0xe8979e, 0xe8979f, 0xe897a0, 0xe897a1,
+ /* 8c */ 0xe897a2, 0xe897a3, 0xe897a5, 0xe897a6,
+ /* 90 */ 0xe897a7, 0xe897a8, 0xe897aa, 0xe897ab,
+ /* 94 */ 0xe897ac, 0xe897ad, 0xe897ae, 0xe897af,
+ /* 98 */ 0xe897b0, 0xe897b1, 0xe897b2, 0xe897b3,
+ /* 9c */ 0xe897b4, 0xe897b5, 0xe897b6, 0xe897b7,
+ /* a0 */ 0xe897b8, 0xe68195, 0xe588b7, 0xe8808d,
+ /* a4 */ 0xe69194, 0xe8a1b0, 0xe794a9, 0xe5b885,
+ /* a8 */ 0xe6a093, 0xe68bb4, 0xe99c9c, 0xe58f8c,
+ /* ac */ 0xe788bd, 0xe8b081, 0xe6b0b4, 0xe79da1,
+ /* b0 */ 0xe7a88e, 0xe590ae, 0xe79eac, 0xe9a1ba,
+ /* b4 */ 0xe8889c, 0xe8afb4, 0xe7a195, 0xe69c94,
+ /* b8 */ 0xe78381, 0xe696af, 0xe69295, 0xe598b6,
+ /* bc */ 0xe6809d, 0xe7a781, 0xe58fb8, 0xe4b89d,
+ /* c0 */ 0xe6adbb, 0xe88286, 0xe5afba, 0xe597a3,
+ /* c4 */ 0xe59b9b, 0xe4bcba, 0xe4bcbc, 0xe9a5b2,
+ /* c8 */ 0xe5b7b3, 0xe69dbe, 0xe880b8, 0xe68082,
+ /* cc */ 0xe9a282, 0xe98081, 0xe5ae8b, 0xe8aebc,
+ /* d0 */ 0xe8afb5, 0xe6909c, 0xe88998, 0xe6939e,
+ /* d4 */ 0xe597bd, 0xe88b8f, 0xe985a5, 0xe4bf97,
+ /* d8 */ 0xe7b4a0, 0xe9809f, 0xe7b29f, 0xe583b3,
+ /* dc */ 0xe5a191, 0xe6baaf, 0xe5aebf, 0xe8af89,
+ /* e0 */ 0xe88283, 0xe985b8, 0xe8929c, 0xe7ae97,
+ /* e4 */ 0xe899bd, 0xe99a8b, 0xe99a8f, 0xe7bba5,
+ /* e8 */ 0xe9ab93, 0xe7a28e, 0xe5b281, 0xe7a997,
+ /* ec */ 0xe98182, 0xe99aa7, 0xe7a59f, 0xe5ad99,
+ /* f0 */ 0xe68d9f, 0xe7ac8b, 0xe89391, 0xe6a2ad,
+ /* f4 */ 0xe59486, 0xe7bca9, 0xe79090, 0xe7b4a2,
+ /* f8 */ 0xe99481, 0xe68980, 0xe5a18c, 0xe4bb96,
+ /* fc */ 0xe5ae83, 0xe5a5b9, 0xe5a194,
+
+ /*** Two byte table, leaf: ccxx - offset 0x03915 ***/
+
+ /* 40 */ 0xe897b9, 0xe897ba, 0xe897bc, 0xe897bd,
+ /* 44 */ 0xe897be, 0xe89880, 0xe89881, 0xe89882,
+ /* 48 */ 0xe89883, 0xe89884, 0xe89886, 0xe89887,
+ /* 4c */ 0xe89888, 0xe89889, 0xe8988a, 0xe8988b,
+ /* 50 */ 0xe8988c, 0xe8988d, 0xe8988e, 0xe8988f,
+ /* 54 */ 0xe89890, 0xe89892, 0xe89893, 0xe89894,
+ /* 58 */ 0xe89895, 0xe89897, 0xe89898, 0xe89899,
+ /* 5c */ 0xe8989a, 0xe8989b, 0xe8989c, 0xe8989d,
+ /* 60 */ 0xe8989e, 0xe8989f, 0xe898a0, 0xe898a1,
+ /* 64 */ 0xe898a2, 0xe898a3, 0xe898a4, 0xe898a5,
+ /* 68 */ 0xe898a6, 0xe898a8, 0xe898aa, 0xe898ab,
+ /* 6c */ 0xe898ac, 0xe898ad, 0xe898ae, 0xe898af,
+ /* 70 */ 0xe898b0, 0xe898b1, 0xe898b2, 0xe898b3,
+ /* 74 */ 0xe898b4, 0xe898b5, 0xe898b6, 0xe898b7,
+ /* 78 */ 0xe898b9, 0xe898ba, 0xe898bb, 0xe898bd,
+ /* 7c */ 0xe898be, 0xe898bf, 0xe89980, 0x000000,
+ /* 80 */ 0xe89981, 0xe89982, 0xe89983, 0xe89984,
+ /* 84 */ 0xe89985, 0xe89986, 0xe89987, 0xe89988,
+ /* 88 */ 0xe89989, 0xe8998a, 0xe8998b, 0xe8998c,
+ /* 8c */ 0xe89992, 0xe89993, 0xe89995, 0xe89996,
+ /* 90 */ 0xe89997, 0xe89998, 0xe89999, 0xe8999b,
+ /* 94 */ 0xe8999c, 0xe8999d, 0xe8999f, 0xe899a0,
+ /* 98 */ 0xe899a1, 0xe899a3, 0xe899a4, 0xe899a5,
+ /* 9c */ 0xe899a6, 0xe899a7, 0xe899a8, 0xe899a9,
+ /* a0 */ 0xe899aa, 0xe78dad, 0xe68c9e, 0xe8b98b,
+ /* a4 */ 0xe8b88f, 0xe8838e, 0xe88b94, 0xe68aac,
+ /* a8 */ 0xe58fb0, 0xe6b3b0, 0xe9859e, 0xe5a4aa,
+ /* ac */ 0xe68081, 0xe6b1b0, 0xe59d8d, 0xe6918a,
+ /* b0 */ 0xe8b4aa, 0xe798ab, 0xe6bba9, 0xe59d9b,
+ /* b4 */ 0xe6aa80, 0xe797b0, 0xe6bdad, 0xe8b0ad,
+ /* b8 */ 0xe8b088, 0xe59da6, 0xe6afaf, 0xe8a292,
+ /* bc */ 0xe7a2b3, 0xe68ea2, 0xe58fb9, 0xe782ad,
+ /* c0 */ 0xe6b1a4, 0xe5a198, 0xe690aa, 0xe5a082,
+ /* c4 */ 0xe6a3a0, 0xe8869b, 0xe59490, 0xe7b396,
+ /* c8 */ 0xe58098, 0xe8baba, 0xe6b78c, 0xe8b69f,
+ /* cc */ 0xe783ab, 0xe68e8f, 0xe6b69b, 0xe6bb94,
+ /* d0 */ 0xe7bba6, 0xe89084, 0xe6a183, 0xe98083,
+ /* d4 */ 0xe6b798, 0xe999b6, 0xe8aea8, 0xe5a597,
+ /* d8 */ 0xe789b9, 0xe897a4, 0xe885be, 0xe796bc,
+ /* dc */ 0xe8aa8a, 0xe6a2af, 0xe58994, 0xe8b8a2,
+ /* e0 */ 0xe99491, 0xe68f90, 0xe9a298, 0xe8b984,
+ /* e4 */ 0xe595bc, 0xe4bd93, 0xe69bbf, 0xe59a8f,
+ /* e8 */ 0xe68395, 0xe6b695, 0xe58983, 0xe5b189,
+ /* ec */ 0xe5a4a9, 0xe6b7bb, 0xe5a1ab, 0xe794b0,
+ /* f0 */ 0xe7949c, 0xe681ac, 0xe88894, 0xe88586,
+ /* f4 */ 0xe68c91, 0xe69da1, 0xe8bfa2, 0xe79cba,
+ /* f8 */ 0xe8b7b3, 0xe8b4b4, 0xe99381, 0xe5b896,
+ /* fc */ 0xe58e85, 0xe590ac, 0xe78383,
+
+ /*** Two byte table, leaf: cdxx - offset 0x039d4 ***/
+
+ /* 40 */ 0xe899ad, 0xe899af, 0xe899b0, 0xe899b2,
+ /* 44 */ 0xe899b3, 0xe899b4, 0xe899b5, 0xe899b6,
+ /* 48 */ 0xe899b7, 0xe899b8, 0xe89a83, 0xe89a84,
+ /* 4c */ 0xe89a85, 0xe89a86, 0xe89a87, 0xe89a88,
+ /* 50 */ 0xe89a89, 0xe89a8e, 0xe89a8f, 0xe89a90,
+ /* 54 */ 0xe89a91, 0xe89a92, 0xe89a94, 0xe89a96,
+ /* 58 */ 0xe89a97, 0xe89a98, 0xe89a99, 0xe89a9a,
+ /* 5c */ 0xe89a9b, 0xe89a9e, 0xe89a9f, 0xe89aa0,
+ /* 60 */ 0xe89aa1, 0xe89aa2, 0xe89aa5, 0xe89aa6,
+ /* 64 */ 0xe89aab, 0xe89aad, 0xe89aae, 0xe89ab2,
+ /* 68 */ 0xe89ab3, 0xe89ab7, 0xe89ab8, 0xe89ab9,
+ /* 6c */ 0xe89abb, 0xe89abc, 0xe89abd, 0xe89abe,
+ /* 70 */ 0xe89abf, 0xe89b81, 0xe89b82, 0xe89b83,
+ /* 74 */ 0xe89b85, 0xe89b88, 0xe89b8c, 0xe89b8d,
+ /* 78 */ 0xe89b92, 0xe89b93, 0xe89b95, 0xe89b96,
+ /* 7c */ 0xe89b97, 0xe89b9a, 0xe89b9c, 0x000000,
+ /* 80 */ 0xe89b9d, 0xe89ba0, 0xe89ba1, 0xe89ba2,
+ /* 84 */ 0xe89ba3, 0xe89ba5, 0xe89ba6, 0xe89ba7,
+ /* 88 */ 0xe89ba8, 0xe89baa, 0xe89bab, 0xe89bac,
+ /* 8c */ 0xe89baf, 0xe89bb5, 0xe89bb6, 0xe89bb7,
+ /* 90 */ 0xe89bba, 0xe89bbb, 0xe89bbc, 0xe89bbd,
+ /* 94 */ 0xe89bbf, 0xe89c81, 0xe89c84, 0xe89c85,
+ /* 98 */ 0xe89c86, 0xe89c8b, 0xe89c8c, 0xe89c8e,
+ /* 9c */ 0xe89c8f, 0xe89c90, 0xe89c91, 0xe89c94,
+ /* a0 */ 0xe89c96, 0xe6b180, 0xe5bbb7, 0xe5819c,
+ /* a4 */ 0xe4baad, 0xe5baad, 0xe68cba, 0xe88987,
+ /* a8 */ 0xe9809a, 0xe6a190, 0xe985ae, 0xe79eb3,
+ /* ac */ 0xe5908c, 0xe9939c, 0xe5bda4, 0xe7aba5,
+ /* b0 */ 0xe6a1b6, 0xe68d85, 0xe7ad92, 0xe7bb9f,
+ /* b4 */ 0xe7979b, 0xe581b7, 0xe68a95, 0xe5a4b4,
+ /* b8 */ 0xe9808f, 0xe587b8, 0xe7a783, 0xe7aa81,
+ /* bc */ 0xe59bbe, 0xe5be92, 0xe98094, 0xe6b682,
+ /* c0 */ 0xe5b1a0, 0xe59c9f, 0xe59090, 0xe58594,
+ /* c4 */ 0xe6b98d, 0xe59ba2, 0xe68ea8, 0xe9a293,
+ /* c8 */ 0xe885bf, 0xe89c95, 0xe8a4aa, 0xe98080,
+ /* cc */ 0xe5909e, 0xe5b1af, 0xe88780, 0xe68b96,
+ /* d0 */ 0xe68998, 0xe884b1, 0xe9b8b5, 0xe99980,
+ /* d4 */ 0xe9a9ae, 0xe9a9bc, 0xe6a4ad, 0xe5a6a5,
+ /* d8 */ 0xe68b93, 0xe594be, 0xe68c96, 0xe59387,
+ /* dc */ 0xe89b99, 0xe6b4bc, 0xe5a883, 0xe793a6,
+ /* e0 */ 0xe8a29c, 0xe6adaa, 0xe5a496, 0xe8b18c,
+ /* e4 */ 0xe5bcaf, 0xe6b9be, 0xe78ea9, 0xe9a1bd,
+ /* e8 */ 0xe4b8b8, 0xe783b7, 0xe5ae8c, 0xe7a297,
+ /* ec */ 0xe68cbd, 0xe6999a, 0xe79a96, 0xe6838b,
+ /* f0 */ 0xe5ae9b, 0xe5a989, 0xe4b887, 0xe88595,
+ /* f4 */ 0xe6b1aa, 0xe78e8b, 0xe4baa1, 0xe69e89,
+ /* f8 */ 0xe7bd91, 0xe5be80, 0xe697ba, 0xe69c9b,
+ /* fc */ 0xe5bf98, 0xe5a684, 0xe5a881,
+
+ /*** Two byte table, leaf: cexx - offset 0x03a93 ***/
+
+ /* 40 */ 0xe89c99, 0xe89c9b, 0xe89c9d, 0xe89c9f,
+ /* 44 */ 0xe89ca0, 0xe89ca4, 0xe89ca6, 0xe89ca7,
+ /* 48 */ 0xe89ca8, 0xe89caa, 0xe89cab, 0xe89cac,
+ /* 4c */ 0xe89cad, 0xe89caf, 0xe89cb0, 0xe89cb2,
+ /* 50 */ 0xe89cb3, 0xe89cb5, 0xe89cb6, 0xe89cb8,
+ /* 54 */ 0xe89cb9, 0xe89cba, 0xe89cbc, 0xe89cbd,
+ /* 58 */ 0xe89d80, 0xe89d81, 0xe89d82, 0xe89d83,
+ /* 5c */ 0xe89d84, 0xe89d85, 0xe89d86, 0xe89d8a,
+ /* 60 */ 0xe89d8b, 0xe89d8d, 0xe89d8f, 0xe89d90,
+ /* 64 */ 0xe89d91, 0xe89d92, 0xe89d94, 0xe89d95,
+ /* 68 */ 0xe89d96, 0xe89d98, 0xe89d9a, 0xe89d9b,
+ /* 6c */ 0xe89d9c, 0xe89d9d, 0xe89d9e, 0xe89d9f,
+ /* 70 */ 0xe89da1, 0xe89da2, 0xe89da6, 0xe89da7,
+ /* 74 */ 0xe89da8, 0xe89da9, 0xe89daa, 0xe89dab,
+ /* 78 */ 0xe89dac, 0xe89dad, 0xe89daf, 0xe89db1,
+ /* 7c */ 0xe89db2, 0xe89db3, 0xe89db5, 0x000000,
+ /* 80 */ 0xe89db7, 0xe89db8, 0xe89db9, 0xe89dba,
+ /* 84 */ 0xe89dbf, 0xe89e80, 0xe89e81, 0xe89e84,
+ /* 88 */ 0xe89e86, 0xe89e87, 0xe89e89, 0xe89e8a,
+ /* 8c */ 0xe89e8c, 0xe89e8e, 0xe89e8f, 0xe89e90,
+ /* 90 */ 0xe89e91, 0xe89e92, 0xe89e94, 0xe89e95,
+ /* 94 */ 0xe89e96, 0xe89e98, 0xe89e99, 0xe89e9a,
+ /* 98 */ 0xe89e9b, 0xe89e9c, 0xe89e9d, 0xe89e9e,
+ /* 9c */ 0xe89ea0, 0xe89ea1, 0xe89ea2, 0xe89ea3,
+ /* a0 */ 0xe89ea4, 0xe5b78d, 0xe5beae, 0xe58db1,
+ /* a4 */ 0xe99fa6, 0xe8bf9d, 0xe6a185, 0xe59bb4,
+ /* a8 */ 0xe594af, 0xe6839f, 0xe4b8ba, 0xe6bd8d,
+ /* ac */ 0xe7bbb4, 0xe88b87, 0xe8908e, 0xe5a794,
+ /* b0 */ 0xe4bc9f, 0xe4bcaa, 0xe5b0be, 0xe7baac,
+ /* b4 */ 0xe69caa, 0xe8949a, 0xe591b3, 0xe7958f,
+ /* b8 */ 0xe88383, 0xe59682, 0xe9ad8f, 0xe4bd8d,
+ /* bc */ 0xe6b8ad, 0xe8b093, 0xe5b089, 0xe685b0,
+ /* c0 */ 0xe58dab, 0xe7989f, 0xe6b8a9, 0xe89a8a,
+ /* c4 */ 0xe69687, 0xe997bb, 0xe7bab9, 0xe590bb,
+ /* c8 */ 0xe7a8b3, 0xe7b48a, 0xe997ae, 0xe597a1,
+ /* cc */ 0xe7bf81, 0xe793ae, 0xe68c9d, 0xe89c97,
+ /* d0 */ 0xe6b6a1, 0xe7aa9d, 0xe68891, 0xe696a1,
+ /* d4 */ 0xe58da7, 0xe68fa1, 0xe6b283, 0xe5b7ab,
+ /* d8 */ 0xe5919c, 0xe992a8, 0xe4b98c, 0xe6b1a1,
+ /* dc */ 0xe8afac, 0xe5b18b, 0xe697a0, 0xe88a9c,
+ /* e0 */ 0xe6a2a7, 0xe590be, 0xe590b4, 0xe6af8b,
+ /* e4 */ 0xe6ada6, 0xe4ba94, 0xe68d82, 0xe58d88,
+ /* e8 */ 0xe8889e, 0xe4bc8d, 0xe4beae, 0xe59d9e,
+ /* ec */ 0xe6888a, 0xe99bbe, 0xe699a4, 0xe789a9,
+ /* f0 */ 0xe58bbf, 0xe58aa1, 0xe6829f, 0xe8afaf,
+ /* f4 */ 0xe69894, 0xe78699, 0xe69e90, 0xe8a5bf,
+ /* f8 */ 0xe7a192, 0xe79fbd, 0xe699b0, 0xe598bb,
+ /* fc */ 0xe590b8, 0xe994a1, 0xe789ba,
+
+ /*** Two byte table, leaf: cfxx - offset 0x03b52 ***/
+
+ /* 40 */ 0xe89ea5, 0xe89ea6, 0xe89ea7, 0xe89ea9,
+ /* 44 */ 0xe89eaa, 0xe89eae, 0xe89eb0, 0xe89eb1,
+ /* 48 */ 0xe89eb2, 0xe89eb4, 0xe89eb6, 0xe89eb7,
+ /* 4c */ 0xe89eb8, 0xe89eb9, 0xe89ebb, 0xe89ebc,
+ /* 50 */ 0xe89ebe, 0xe89ebf, 0xe89f81, 0xe89f82,
+ /* 54 */ 0xe89f83, 0xe89f84, 0xe89f85, 0xe89f87,
+ /* 58 */ 0xe89f88, 0xe89f89, 0xe89f8c, 0xe89f8d,
+ /* 5c */ 0xe89f8e, 0xe89f8f, 0xe89f90, 0xe89f94,
+ /* 60 */ 0xe89f95, 0xe89f96, 0xe89f97, 0xe89f98,
+ /* 64 */ 0xe89f99, 0xe89f9a, 0xe89f9c, 0xe89f9d,
+ /* 68 */ 0xe89f9e, 0xe89f9f, 0xe89fa1, 0xe89fa2,
+ /* 6c */ 0xe89fa3, 0xe89fa4, 0xe89fa6, 0xe89fa7,
+ /* 70 */ 0xe89fa8, 0xe89fa9, 0xe89fab, 0xe89fac,
+ /* 74 */ 0xe89fad, 0xe89faf, 0xe89fb0, 0xe89fb1,
+ /* 78 */ 0xe89fb2, 0xe89fb3, 0xe89fb4, 0xe89fb5,
+ /* 7c */ 0xe89fb6, 0xe89fb7, 0xe89fb8, 0x000000,
+ /* 80 */ 0xe89fba, 0xe89fbb, 0xe89fbc, 0xe89fbd,
+ /* 84 */ 0xe89fbf, 0xe8a080, 0xe8a081, 0xe8a082,
+ /* 88 */ 0xe8a084, 0xe8a085, 0xe8a086, 0xe8a087,
+ /* 8c */ 0xe8a088, 0xe8a089, 0xe8a08b, 0xe8a08c,
+ /* 90 */ 0xe8a08d, 0xe8a08e, 0xe8a08f, 0xe8a090,
+ /* 94 */ 0xe8a091, 0xe8a092, 0xe8a094, 0xe8a097,
+ /* 98 */ 0xe8a098, 0xe8a099, 0xe8a09a, 0xe8a09c,
+ /* 9c */ 0xe8a09d, 0xe8a09e, 0xe8a09f, 0xe8a0a0,
+ /* a0 */ 0xe8a0a3, 0xe7a880, 0xe681af, 0xe5b88c,
+ /* a4 */ 0xe68289, 0xe8869d, 0xe5a495, 0xe6839c,
+ /* a8 */ 0xe78684, 0xe783af, 0xe6baaa, 0xe6b190,
+ /* ac */ 0xe78a80, 0xe6aa84, 0xe8a2ad, 0xe5b8ad,
+ /* b0 */ 0xe4b9a0, 0xe5aab3, 0xe5969c, 0xe993a3,
+ /* b4 */ 0xe6b497, 0xe7b3bb, 0xe99a99, 0xe6888f,
+ /* b8 */ 0xe7bb86, 0xe79e8e, 0xe899be, 0xe58ca3,
+ /* bc */ 0xe99c9e, 0xe8be96, 0xe69a87, 0xe5b3a1,
+ /* c0 */ 0xe4bea0, 0xe78bad, 0xe4b88b, 0xe58ea6,
+ /* c4 */ 0xe5a48f, 0xe59093, 0xe68e80, 0xe994a8,
+ /* c8 */ 0xe58588, 0xe4bb99, 0xe9b29c, 0xe7baa4,
+ /* cc */ 0xe592b8, 0xe8b4a4, 0xe8a194, 0xe888b7,
+ /* d0 */ 0xe997b2, 0xe6b68e, 0xe5bca6, 0xe5ab8c,
+ /* d4 */ 0xe698be, 0xe999a9, 0xe78eb0, 0xe78cae,
+ /* d8 */ 0xe58ebf, 0xe885ba, 0xe9a685, 0xe7bea1,
+ /* dc */ 0xe5aeaa, 0xe999b7, 0xe99990, 0xe7babf,
+ /* e0 */ 0xe79bb8, 0xe58ea2, 0xe995b6, 0xe9a699,
+ /* e4 */ 0xe7aeb1, 0xe8a584, 0xe6b998, 0xe4b9a1,
+ /* e8 */ 0xe7bf94, 0xe7a5a5, 0xe8afa6, 0xe683b3,
+ /* ec */ 0xe5938d, 0xe4baab, 0xe9a1b9, 0xe5b7b7,
+ /* f0 */ 0xe6a9a1, 0xe5838f, 0xe59091, 0xe8b1a1,
+ /* f4 */ 0xe890a7, 0xe7a19d, 0xe99c84, 0xe5898a,
+ /* f8 */ 0xe593ae, 0xe59aa3, 0xe99480, 0xe6b688,
+ /* fc */ 0xe5aeb5, 0xe6b786, 0xe69993,
+
+ /*** Two byte table, leaf: d0xx - offset 0x03c11 ***/
+
+ /* 40 */ 0xe8a0a4, 0xe8a0a5, 0xe8a0a6, 0xe8a0a7,
+ /* 44 */ 0xe8a0a8, 0xe8a0a9, 0xe8a0aa, 0xe8a0ab,
+ /* 48 */ 0xe8a0ac, 0xe8a0ad, 0xe8a0ae, 0xe8a0af,
+ /* 4c */ 0xe8a0b0, 0xe8a0b1, 0xe8a0b3, 0xe8a0b4,
+ /* 50 */ 0xe8a0b5, 0xe8a0b6, 0xe8a0b7, 0xe8a0b8,
+ /* 54 */ 0xe8a0ba, 0xe8a0bb, 0xe8a0bd, 0xe8a0be,
+ /* 58 */ 0xe8a0bf, 0xe8a181, 0xe8a182, 0xe8a183,
+ /* 5c */ 0xe8a186, 0xe8a187, 0xe8a188, 0xe8a189,
+ /* 60 */ 0xe8a18a, 0xe8a18b, 0xe8a18e, 0xe8a18f,
+ /* 64 */ 0xe8a190, 0xe8a191, 0xe8a192, 0xe8a193,
+ /* 68 */ 0xe8a195, 0xe8a196, 0xe8a198, 0xe8a19a,
+ /* 6c */ 0xe8a19b, 0xe8a19c, 0xe8a19d, 0xe8a19e,
+ /* 70 */ 0xe8a19f, 0xe8a1a0, 0xe8a1a6, 0xe8a1a7,
+ /* 74 */ 0xe8a1aa, 0xe8a1ad, 0xe8a1af, 0xe8a1b1,
+ /* 78 */ 0xe8a1b3, 0xe8a1b4, 0xe8a1b5, 0xe8a1b6,
+ /* 7c */ 0xe8a1b8, 0xe8a1b9, 0xe8a1ba, 0x000000,
+ /* 80 */ 0xe8a1bb, 0xe8a1bc, 0xe8a280, 0xe8a283,
+ /* 84 */ 0xe8a286, 0xe8a287, 0xe8a289, 0xe8a28a,
+ /* 88 */ 0xe8a28c, 0xe8a28e, 0xe8a28f, 0xe8a290,
+ /* 8c */ 0xe8a291, 0xe8a293, 0xe8a294, 0xe8a295,
+ /* 90 */ 0xe8a297, 0xe8a298, 0xe8a299, 0xe8a29a,
+ /* 94 */ 0xe8a29b, 0xe8a29d, 0xe8a29e, 0xe8a29f,
+ /* 98 */ 0xe8a2a0, 0xe8a2a1, 0xe8a2a3, 0xe8a2a5,
+ /* 9c */ 0xe8a2a6, 0xe8a2a7, 0xe8a2a8, 0xe8a2a9,
+ /* a0 */ 0xe8a2aa, 0xe5b08f, 0xe5ad9d, 0xe6a0a1,
+ /* a4 */ 0xe88296, 0xe595b8, 0xe7ac91, 0xe69588,
+ /* a8 */ 0xe6a594, 0xe4ba9b, 0xe6ad87, 0xe89d8e,
+ /* ac */ 0xe99e8b, 0xe58d8f, 0xe68c9f, 0xe690ba,
+ /* b0 */ 0xe982aa, 0xe6969c, 0xe88381, 0xe8b090,
+ /* b4 */ 0xe58699, 0xe6a2b0, 0xe58db8, 0xe89fb9,
+ /* b8 */ 0xe68788, 0xe6b384, 0xe6b3bb, 0xe8b0a2,
+ /* bc */ 0xe5b191, 0xe896aa, 0xe88aaf, 0xe9948c,
+ /* c0 */ 0xe6aca3, 0xe8be9b, 0xe696b0, 0xe5bfbb,
+ /* c4 */ 0xe5bf83, 0xe4bfa1, 0xe8a185, 0xe6989f,
+ /* c8 */ 0xe885a5, 0xe78ca9, 0xe683ba, 0xe585b4,
+ /* cc */ 0xe58891, 0xe59e8b, 0xe5bda2, 0xe982a2,
+ /* d0 */ 0xe8a18c, 0xe98692, 0xe5b9b8, 0xe69d8f,
+ /* d4 */ 0xe680a7, 0xe5a793, 0xe58584, 0xe587b6,
+ /* d8 */ 0xe883b8, 0xe58c88, 0xe6b1b9, 0xe99b84,
+ /* dc */ 0xe7868a, 0xe4bc91, 0xe4bfae, 0xe7be9e,
+ /* e0 */ 0xe69cbd, 0xe59785, 0xe99488, 0xe7a780,
+ /* e4 */ 0xe8a296, 0xe7bba3, 0xe5a29f, 0xe6888c,
+ /* e8 */ 0xe99c80, 0xe8999a, 0xe59898, 0xe9a1bb,
+ /* ec */ 0xe5be90, 0xe8aeb8, 0xe89384, 0xe98597,
+ /* f0 */ 0xe58f99, 0xe697ad, 0xe5ba8f, 0xe7959c,
+ /* f4 */ 0xe681a4, 0xe7b5ae, 0xe5a9bf, 0xe7bbaa,
+ /* f8 */ 0xe7bbad, 0xe8bda9, 0xe596a7, 0xe5aea3,
+ /* fc */ 0xe682ac, 0xe6978b, 0xe78e84,
+
+ /*** Two byte table, leaf: d1xx - offset 0x03cd0 ***/
+
+ /* 40 */ 0xe8a2ac, 0xe8a2ae, 0xe8a2af, 0xe8a2b0,
+ /* 44 */ 0xe8a2b2, 0xe8a2b3, 0xe8a2b4, 0xe8a2b5,
+ /* 48 */ 0xe8a2b6, 0xe8a2b8, 0xe8a2b9, 0xe8a2ba,
+ /* 4c */ 0xe8a2bb, 0xe8a2bd, 0xe8a2be, 0xe8a2bf,
+ /* 50 */ 0xe8a380, 0xe8a383, 0xe8a384, 0xe8a387,
+ /* 54 */ 0xe8a388, 0xe8a38a, 0xe8a38b, 0xe8a38c,
+ /* 58 */ 0xe8a38d, 0xe8a38f, 0xe8a390, 0xe8a391,
+ /* 5c */ 0xe8a393, 0xe8a396, 0xe8a397, 0xe8a39a,
+ /* 60 */ 0xe8a39b, 0xe8a39c, 0xe8a39d, 0xe8a39e,
+ /* 64 */ 0xe8a3a0, 0xe8a3a1, 0xe8a3a6, 0xe8a3a7,
+ /* 68 */ 0xe8a3a9, 0xe8a3aa, 0xe8a3ab, 0xe8a3ac,
+ /* 6c */ 0xe8a3ad, 0xe8a3ae, 0xe8a3af, 0xe8a3b2,
+ /* 70 */ 0xe8a3b5, 0xe8a3b6, 0xe8a3b7, 0xe8a3ba,
+ /* 74 */ 0xe8a3bb, 0xe8a3bd, 0xe8a3bf, 0xe8a480,
+ /* 78 */ 0xe8a481, 0xe8a483, 0xe8a484, 0xe8a485,
+ /* 7c */ 0xe8a486, 0xe8a487, 0xe8a488, 0x000000,
+ /* 80 */ 0xe8a489, 0xe8a48b, 0xe8a48c, 0xe8a48d,
+ /* 84 */ 0xe8a48e, 0xe8a48f, 0xe8a491, 0xe8a494,
+ /* 88 */ 0xe8a495, 0xe8a496, 0xe8a497, 0xe8a498,
+ /* 8c */ 0xe8a49c, 0xe8a49d, 0xe8a49e, 0xe8a49f,
+ /* 90 */ 0xe8a4a0, 0xe8a4a2, 0xe8a4a3, 0xe8a4a4,
+ /* 94 */ 0xe8a4a6, 0xe8a4a7, 0xe8a4a8, 0xe8a4a9,
+ /* 98 */ 0xe8a4ac, 0xe8a4ad, 0xe8a4ae, 0xe8a4af,
+ /* 9c */ 0xe8a4b1, 0xe8a4b2, 0xe8a4b3, 0xe8a4b5,
+ /* a0 */ 0xe8a4b7, 0xe98089, 0xe799a3, 0xe79ca9,
+ /* a4 */ 0xe7bb9a, 0xe99db4, 0xe8969b, 0xe5ada6,
+ /* a8 */ 0xe7a9b4, 0xe99baa, 0xe8a180, 0xe58b8b,
+ /* ac */ 0xe7868f, 0xe5beaa, 0xe697ac, 0xe8afa2,
+ /* b0 */ 0xe5afbb, 0xe9a9af, 0xe5b7a1, 0xe6ae89,
+ /* b4 */ 0xe6b19b, 0xe8aead, 0xe8aeaf, 0xe9808a,
+ /* b8 */ 0xe8bf85, 0xe58e8b, 0xe68abc, 0xe9b8a6,
+ /* bc */ 0xe9b8ad, 0xe59180, 0xe4b8ab, 0xe88abd,
+ /* c0 */ 0xe78999, 0xe89a9c, 0xe5b496, 0xe8a199,
+ /* c4 */ 0xe6b6af, 0xe99b85, 0xe59391, 0xe4ba9a,
+ /* c8 */ 0xe8aeb6, 0xe78489, 0xe592bd, 0xe99889,
+ /* cc */ 0xe7839f, 0xe6b7b9, 0xe79b90, 0xe4b8a5,
+ /* d0 */ 0xe7a094, 0xe89c92, 0xe5b2a9, 0xe5bbb6,
+ /* d4 */ 0xe8a880, 0xe9a29c, 0xe9988e, 0xe7828e,
+ /* d8 */ 0xe6b2bf, 0xe5a584, 0xe68ea9, 0xe79cbc,
+ /* dc */ 0xe8a18d, 0xe6bc94, 0xe889b3, 0xe5a0b0,
+ /* e0 */ 0xe78795, 0xe58e8c, 0xe7a09a, 0xe99b81,
+ /* e4 */ 0xe59481, 0xe5bda6, 0xe784b0, 0xe5aeb4,
+ /* e8 */ 0xe8b09a, 0xe9aa8c, 0xe6ae83, 0xe5a4ae,
+ /* ec */ 0xe9b8af, 0xe7a7a7, 0xe69da8, 0xe689ac,
+ /* f0 */ 0xe4bdaf, 0xe796a1, 0xe7be8a, 0xe6b48b,
+ /* f4 */ 0xe998b3, 0xe6b0a7, 0xe4bbb0, 0xe79792,
+ /* f8 */ 0xe585bb, 0xe6a0b7, 0xe6bcbe, 0xe98280,
+ /* fc */ 0xe885b0, 0xe5a696, 0xe791b6,
+
+ /*** Two byte table, leaf: d2xx - offset 0x03d8f ***/
+
+ /* 40 */ 0xe8a4b8, 0xe8a4b9, 0xe8a4ba, 0xe8a4bb,
+ /* 44 */ 0xe8a4bc, 0xe8a4bd, 0xe8a4be, 0xe8a4bf,
+ /* 48 */ 0xe8a580, 0xe8a582, 0xe8a583, 0xe8a585,
+ /* 4c */ 0xe8a586, 0xe8a587, 0xe8a588, 0xe8a589,
+ /* 50 */ 0xe8a58a, 0xe8a58b, 0xe8a58c, 0xe8a58d,
+ /* 54 */ 0xe8a58e, 0xe8a58f, 0xe8a590, 0xe8a591,
+ /* 58 */ 0xe8a592, 0xe8a593, 0xe8a594, 0xe8a595,
+ /* 5c */ 0xe8a596, 0xe8a597, 0xe8a598, 0xe8a599,
+ /* 60 */ 0xe8a59a, 0xe8a59b, 0xe8a59c, 0xe8a59d,
+ /* 64 */ 0xe8a5a0, 0xe8a5a1, 0xe8a5a2, 0xe8a5a3,
+ /* 68 */ 0xe8a5a4, 0xe8a5a5, 0xe8a5a7, 0xe8a5a8,
+ /* 6c */ 0xe8a5a9, 0xe8a5aa, 0xe8a5ab, 0xe8a5ac,
+ /* 70 */ 0xe8a5ad, 0xe8a5ae, 0xe8a5af, 0xe8a5b0,
+ /* 74 */ 0xe8a5b1, 0xe8a5b2, 0xe8a5b3, 0xe8a5b4,
+ /* 78 */ 0xe8a5b5, 0xe8a5b6, 0xe8a5b7, 0xe8a5b8,
+ /* 7c */ 0xe8a5b9, 0xe8a5ba, 0xe8a5bc, 0x000000,
+ /* 80 */ 0xe8a5bd, 0xe8a5be, 0xe8a680, 0xe8a682,
+ /* 84 */ 0xe8a684, 0xe8a685, 0xe8a687, 0xe8a688,
+ /* 88 */ 0xe8a689, 0xe8a68a, 0xe8a68b, 0xe8a68c,
+ /* 8c */ 0xe8a68d, 0xe8a68e, 0xe8a68f, 0xe8a690,
+ /* 90 */ 0xe8a691, 0xe8a692, 0xe8a693, 0xe8a694,
+ /* 94 */ 0xe8a695, 0xe8a696, 0xe8a697, 0xe8a698,
+ /* 98 */ 0xe8a699, 0xe8a69a, 0xe8a69b, 0xe8a69c,
+ /* 9c */ 0xe8a69d, 0xe8a69e, 0xe8a69f, 0xe8a6a0,
+ /* a0 */ 0xe8a6a1, 0xe69187, 0xe5b0a7, 0xe981a5,
+ /* a4 */ 0xe7aa91, 0xe8b0a3, 0xe5a79a, 0xe592ac,
+ /* a8 */ 0xe88880, 0xe88daf, 0xe8a681, 0xe88080,
+ /* ac */ 0xe6a4b0, 0xe5998e, 0xe880b6, 0xe788b7,
+ /* b0 */ 0xe9878e, 0xe586b6, 0xe4b99f, 0xe9a1b5,
+ /* b4 */ 0xe68e96, 0xe4b89a, 0xe58fb6, 0xe69bb3,
+ /* b8 */ 0xe8858b, 0xe5a49c, 0xe6b6b2, 0xe4b880,
+ /* bc */ 0xe5a3b9, 0xe58cbb, 0xe68f96, 0xe993b1,
+ /* c0 */ 0xe4be9d, 0xe4bc8a, 0xe8a1a3, 0xe9a290,
+ /* c4 */ 0xe5a4b7, 0xe98197, 0xe7a7bb, 0xe4bbaa,
+ /* c8 */ 0xe883b0, 0xe79691, 0xe6b282, 0xe5ae9c,
+ /* cc */ 0xe5a7a8, 0xe5bd9d, 0xe6a485, 0xe89a81,
+ /* d0 */ 0xe5809a, 0xe5b7b2, 0xe4b999, 0xe79fa3,
+ /* d4 */ 0xe4bba5, 0xe889ba, 0xe68a91, 0xe69893,
+ /* d8 */ 0xe98291, 0xe5b1b9, 0xe4babf, 0xe5bdb9,
+ /* dc */ 0xe88786, 0xe980b8, 0xe88284, 0xe796ab,
+ /* e0 */ 0xe4baa6, 0xe8a394, 0xe6848f, 0xe6af85,
+ /* e4 */ 0xe5bf86, 0xe4b989, 0xe79b8a, 0xe6baa2,
+ /* e8 */ 0xe8afa3, 0xe8aeae, 0xe8b08a, 0xe8af91,
+ /* ec */ 0xe5bc82, 0xe7bfbc, 0xe7bf8c, 0xe7bb8e,
+ /* f0 */ 0xe88cb5, 0xe88dab, 0xe59ba0, 0xe6aeb7,
+ /* f4 */ 0xe99fb3, 0xe998b4, 0xe5a7bb, 0xe5909f,
+ /* f8 */ 0xe993b6, 0xe6b7ab, 0xe5af85, 0xe9a5ae,
+ /* fc */ 0xe5b0b9, 0xe5bc95, 0xe99a90,
+
+ /*** Two byte table, leaf: d3xx - offset 0x03e4e ***/
+
+ /* 40 */ 0xe8a6a2, 0xe8a6a3, 0xe8a6a4, 0xe8a6a5,
+ /* 44 */ 0xe8a6a6, 0xe8a6a7, 0xe8a6a8, 0xe8a6a9,
+ /* 48 */ 0xe8a6aa, 0xe8a6ab, 0xe8a6ac, 0xe8a6ad,
+ /* 4c */ 0xe8a6ae, 0xe8a6af, 0xe8a6b0, 0xe8a6b1,
+ /* 50 */ 0xe8a6b2, 0xe8a6b3, 0xe8a6b4, 0xe8a6b5,
+ /* 54 */ 0xe8a6b6, 0xe8a6b7, 0xe8a6b8, 0xe8a6b9,
+ /* 58 */ 0xe8a6ba, 0xe8a6bb, 0xe8a6bc, 0xe8a6bd,
+ /* 5c */ 0xe8a6be, 0xe8a6bf, 0xe8a780, 0xe8a783,
+ /* 60 */ 0xe8a78d, 0xe8a793, 0xe8a794, 0xe8a795,
+ /* 64 */ 0xe8a797, 0xe8a798, 0xe8a799, 0xe8a79b,
+ /* 68 */ 0xe8a79d, 0xe8a79f, 0xe8a7a0, 0xe8a7a1,
+ /* 6c */ 0xe8a7a2, 0xe8a7a4, 0xe8a7a7, 0xe8a7a8,
+ /* 70 */ 0xe8a7a9, 0xe8a7aa, 0xe8a7ac, 0xe8a7ad,
+ /* 74 */ 0xe8a7ae, 0xe8a7b0, 0xe8a7b1, 0xe8a7b2,
+ /* 78 */ 0xe8a7b4, 0xe8a7b5, 0xe8a7b6, 0xe8a7b7,
+ /* 7c */ 0xe8a7b8, 0xe8a7b9, 0xe8a7ba, 0x000000,
+ /* 80 */ 0xe8a7bb, 0xe8a7bc, 0xe8a7bd, 0xe8a7be,
+ /* 84 */ 0xe8a7bf, 0xe8a881, 0xe8a882, 0xe8a883,
+ /* 88 */ 0xe8a884, 0xe8a885, 0xe8a886, 0xe8a888,
+ /* 8c */ 0xe8a889, 0xe8a88a, 0xe8a88b, 0xe8a88c,
+ /* 90 */ 0xe8a88d, 0xe8a88e, 0xe8a88f, 0xe8a890,
+ /* 94 */ 0xe8a891, 0xe8a892, 0xe8a893, 0xe8a894,
+ /* 98 */ 0xe8a895, 0xe8a896, 0xe8a897, 0xe8a898,
+ /* 9c */ 0xe8a899, 0xe8a89a, 0xe8a89b, 0xe8a89c,
+ /* a0 */ 0xe8a89d, 0xe58db0, 0xe88bb1, 0xe6a8b1,
+ /* a4 */ 0xe5a9b4, 0xe9b9b0, 0xe5ba94, 0xe7bca8,
+ /* a8 */ 0xe88eb9, 0xe890a4, 0xe890a5, 0xe88da7,
+ /* ac */ 0xe89d87, 0xe8bf8e, 0xe8b5a2, 0xe79b88,
+ /* b0 */ 0xe5bdb1, 0xe9a296, 0xe7a1ac, 0xe698a0,
+ /* b4 */ 0xe5939f, 0xe68ba5, 0xe4bda3, 0xe88783,
+ /* b8 */ 0xe79788, 0xe5bab8, 0xe99b8d, 0xe8b88a,
+ /* bc */ 0xe89bb9, 0xe5928f, 0xe6b3b3, 0xe6b68c,
+ /* c0 */ 0xe6b0b8, 0xe681bf, 0xe58b87, 0xe794a8,
+ /* c4 */ 0xe5b9bd, 0xe4bc98, 0xe682a0, 0xe5bfa7,
+ /* c8 */ 0xe5b0a4, 0xe794b1, 0xe982ae, 0xe99380,
+ /* cc */ 0xe78ab9, 0xe6b2b9, 0xe6b8b8, 0xe98589,
+ /* d0 */ 0xe69c89, 0xe58f8b, 0xe58fb3, 0xe4bd91,
+ /* d4 */ 0xe98789, 0xe8afb1, 0xe58f88, 0xe5b9bc,
+ /* d8 */ 0xe8bf82, 0xe6b7a4, 0xe4ba8e, 0xe79b82,
+ /* dc */ 0xe6a686, 0xe8999e, 0xe6849a, 0xe88886,
+ /* e0 */ 0xe4bd99, 0xe4bf9e, 0xe980be, 0xe9b1bc,
+ /* e4 */ 0xe68489, 0xe6b89d, 0xe6b894, 0xe99a85,
+ /* e8 */ 0xe4ba88, 0xe5a8b1, 0xe99ba8, 0xe4b88e,
+ /* ec */ 0xe5b1bf, 0xe7a6b9, 0xe5ae87, 0xe8afad,
+ /* f0 */ 0xe7bebd, 0xe78e89, 0xe59f9f, 0xe88a8b,
+ /* f4 */ 0xe98381, 0xe59081, 0xe98187, 0xe596bb,
+ /* f8 */ 0xe5b3aa, 0xe5bea1, 0xe68488, 0xe6acb2,
+ /* fc */ 0xe78bb1, 0xe882b2, 0xe8aa89,
+
+ /*** Two byte table, leaf: d4xx - offset 0x03f0d ***/
+
+ /* 40 */ 0xe8a89e, 0xe8a89f, 0xe8a8a0, 0xe8a8a1,
+ /* 44 */ 0xe8a8a2, 0xe8a8a3, 0xe8a8a4, 0xe8a8a5,
+ /* 48 */ 0xe8a8a6, 0xe8a8a7, 0xe8a8a8, 0xe8a8a9,
+ /* 4c */ 0xe8a8aa, 0xe8a8ab, 0xe8a8ac, 0xe8a8ad,
+ /* 50 */ 0xe8a8ae, 0xe8a8af, 0xe8a8b0, 0xe8a8b1,
+ /* 54 */ 0xe8a8b2, 0xe8a8b3, 0xe8a8b4, 0xe8a8b5,
+ /* 58 */ 0xe8a8b6, 0xe8a8b7, 0xe8a8b8, 0xe8a8b9,
+ /* 5c */ 0xe8a8ba, 0xe8a8bb, 0xe8a8bc, 0xe8a8bd,
+ /* 60 */ 0xe8a8bf, 0xe8a980, 0xe8a981, 0xe8a982,
+ /* 64 */ 0xe8a983, 0xe8a984, 0xe8a985, 0xe8a986,
+ /* 68 */ 0xe8a987, 0xe8a989, 0xe8a98a, 0xe8a98b,
+ /* 6c */ 0xe8a98c, 0xe8a98d, 0xe8a98e, 0xe8a98f,
+ /* 70 */ 0xe8a990, 0xe8a991, 0xe8a992, 0xe8a993,
+ /* 74 */ 0xe8a994, 0xe8a995, 0xe8a996, 0xe8a997,
+ /* 78 */ 0xe8a998, 0xe8a999, 0xe8a99a, 0xe8a99b,
+ /* 7c */ 0xe8a99c, 0xe8a99d, 0xe8a99e, 0x000000,
+ /* 80 */ 0xe8a99f, 0xe8a9a0, 0xe8a9a1, 0xe8a9a2,
+ /* 84 */ 0xe8a9a3, 0xe8a9a4, 0xe8a9a5, 0xe8a9a6,
+ /* 88 */ 0xe8a9a7, 0xe8a9a8, 0xe8a9a9, 0xe8a9aa,
+ /* 8c */ 0xe8a9ab, 0xe8a9ac, 0xe8a9ad, 0xe8a9ae,
+ /* 90 */ 0xe8a9af, 0xe8a9b0, 0xe8a9b1, 0xe8a9b2,
+ /* 94 */ 0xe8a9b3, 0xe8a9b4, 0xe8a9b5, 0xe8a9b6,
+ /* 98 */ 0xe8a9b7, 0xe8a9b8, 0xe8a9ba, 0xe8a9bb,
+ /* 9c */ 0xe8a9bc, 0xe8a9bd, 0xe8a9be, 0xe8a9bf,
+ /* a0 */ 0xe8aa80, 0xe6b5b4, 0xe5af93, 0xe8a395,
+ /* a4 */ 0xe9a284, 0xe8b1ab, 0xe9a9ad, 0xe9b8b3,
+ /* a8 */ 0xe6b88a, 0xe586a4, 0xe58583, 0xe59ea3,
+ /* ac */ 0xe8a281, 0xe58e9f, 0xe68fb4, 0xe8be95,
+ /* b0 */ 0xe59bad, 0xe59198, 0xe59c86, 0xe78cbf,
+ /* b4 */ 0xe6ba90, 0xe7bc98, 0xe8bf9c, 0xe88b91,
+ /* b8 */ 0xe684bf, 0xe680a8, 0xe999a2, 0xe69bb0,
+ /* bc */ 0xe7baa6, 0xe8b68a, 0xe8b783, 0xe992a5,
+ /* c0 */ 0xe5b2b3, 0xe7b2a4, 0xe69c88, 0xe682a6,
+ /* c4 */ 0xe99885, 0xe88098, 0xe4ba91, 0xe983a7,
+ /* c8 */ 0xe58c80, 0xe999a8, 0xe58581, 0xe8bf90,
+ /* cc */ 0xe895b4, 0xe9859d, 0xe69995, 0xe99fb5,
+ /* d0 */ 0xe5ad95, 0xe58c9d, 0xe7a0b8, 0xe69d82,
+ /* d4 */ 0xe6a0bd, 0xe59389, 0xe781be, 0xe5aeb0,
+ /* d8 */ 0xe8bdbd, 0xe5868d, 0xe59ca8, 0xe592b1,
+ /* dc */ 0xe69492, 0xe69a82, 0xe8b59e, 0xe8b583,
+ /* e0 */ 0xe8848f, 0xe891ac, 0xe981ad, 0xe7b39f,
+ /* e4 */ 0xe587bf, 0xe897bb, 0xe69ea3, 0xe697a9,
+ /* e8 */ 0xe6bea1, 0xe89aa4, 0xe8ba81, 0xe599aa,
+ /* ec */ 0xe980a0, 0xe79a82, 0xe781b6, 0xe787a5,
+ /* f0 */ 0xe8b4a3, 0xe68ba9, 0xe58899, 0xe6b3bd,
+ /* f4 */ 0xe8b4bc, 0xe6808e, 0xe5a29e, 0xe6868e,
+ /* f8 */ 0xe69bbe, 0xe8b5a0, 0xe6898e, 0xe596b3,
+ /* fc */ 0xe6b8a3, 0xe69cad, 0xe8bda7,
+
+ /*** Two byte table, leaf: d5xx - offset 0x03fcc ***/
+
+ /* 40 */ 0xe8aa81, 0xe8aa82, 0xe8aa83, 0xe8aa84,
+ /* 44 */ 0xe8aa85, 0xe8aa86, 0xe8aa87, 0xe8aa88,
+ /* 48 */ 0xe8aa8b, 0xe8aa8c, 0xe8aa8d, 0xe8aa8e,
+ /* 4c */ 0xe8aa8f, 0xe8aa90, 0xe8aa91, 0xe8aa92,
+ /* 50 */ 0xe8aa94, 0xe8aa95, 0xe8aa96, 0xe8aa97,
+ /* 54 */ 0xe8aa98, 0xe8aa99, 0xe8aa9a, 0xe8aa9b,
+ /* 58 */ 0xe8aa9c, 0xe8aa9d, 0xe8aa9e, 0xe8aa9f,
+ /* 5c */ 0xe8aaa0, 0xe8aaa1, 0xe8aaa2, 0xe8aaa3,
+ /* 60 */ 0xe8aaa4, 0xe8aaa5, 0xe8aaa6, 0xe8aaa7,
+ /* 64 */ 0xe8aaa8, 0xe8aaa9, 0xe8aaaa, 0xe8aaab,
+ /* 68 */ 0xe8aaac, 0xe8aaad, 0xe8aaae, 0xe8aaaf,
+ /* 6c */ 0xe8aab0, 0xe8aab1, 0xe8aab2, 0xe8aab3,
+ /* 70 */ 0xe8aab4, 0xe8aab5, 0xe8aab6, 0xe8aab7,
+ /* 74 */ 0xe8aab8, 0xe8aab9, 0xe8aaba, 0xe8aabb,
+ /* 78 */ 0xe8aabc, 0xe8aabd, 0xe8aabe, 0xe8aabf,
+ /* 7c */ 0xe8ab80, 0xe8ab81, 0xe8ab82, 0x000000,
+ /* 80 */ 0xe8ab83, 0xe8ab84, 0xe8ab85, 0xe8ab86,
+ /* 84 */ 0xe8ab87, 0xe8ab88, 0xe8ab89, 0xe8ab8a,
+ /* 88 */ 0xe8ab8b, 0xe8ab8c, 0xe8ab8d, 0xe8ab8e,
+ /* 8c */ 0xe8ab8f, 0xe8ab90, 0xe8ab91, 0xe8ab92,
+ /* 90 */ 0xe8ab93, 0xe8ab94, 0xe8ab95, 0xe8ab96,
+ /* 94 */ 0xe8ab97, 0xe8ab98, 0xe8ab99, 0xe8ab9a,
+ /* 98 */ 0xe8ab9b, 0xe8ab9c, 0xe8ab9d, 0xe8ab9e,
+ /* 9c */ 0xe8ab9f, 0xe8aba0, 0xe8aba1, 0xe8aba2,
+ /* a0 */ 0xe8aba3, 0xe993a1, 0xe997b8, 0xe79ca8,
+ /* a4 */ 0xe6a085, 0xe6a6a8, 0xe5928b, 0xe4b98d,
+ /* a8 */ 0xe782b8, 0xe8af88, 0xe69198, 0xe6968b,
+ /* ac */ 0xe5ae85, 0xe7aa84, 0xe580ba, 0xe5afa8,
+ /* b0 */ 0xe79ebb, 0xe6afa1, 0xe8a9b9, 0xe7b298,
+ /* b4 */ 0xe6b2be, 0xe79b8f, 0xe696a9, 0xe8be97,
+ /* b8 */ 0xe5b4ad, 0xe5b195, 0xe898b8, 0xe6a088,
+ /* bc */ 0xe58da0, 0xe68898, 0xe7ab99, 0xe6b99b,
+ /* c0 */ 0xe7bbbd, 0xe6a89f, 0xe7aba0, 0xe5bdb0,
+ /* c4 */ 0xe6bcb3, 0xe5bca0, 0xe68e8c, 0xe6b6a8,
+ /* c8 */ 0xe69d96, 0xe4b888, 0xe5b890, 0xe8b4a6,
+ /* cc */ 0xe4bb97, 0xe88380, 0xe798b4, 0xe99a9c,
+ /* d0 */ 0xe68b9b, 0xe698ad, 0xe689be, 0xe6b2bc,
+ /* d4 */ 0xe8b5b5, 0xe785a7, 0xe7bda9, 0xe58586,
+ /* d8 */ 0xe88287, 0xe58fac, 0xe981ae, 0xe68a98,
+ /* dc */ 0xe593b2, 0xe89bb0, 0xe8be99, 0xe88085,
+ /* e0 */ 0xe99497, 0xe89497, 0xe8bf99, 0xe6b599,
+ /* e4 */ 0xe78f8d, 0xe6969f, 0xe79c9f, 0xe79484,
+ /* e8 */ 0xe7a0a7, 0xe887bb, 0xe8b49e, 0xe99288,
+ /* ec */ 0xe4bea6, 0xe69e95, 0xe796b9, 0xe8af8a,
+ /* f0 */ 0xe99c87, 0xe68caf, 0xe99587, 0xe998b5,
+ /* f4 */ 0xe892b8, 0xe68ca3, 0xe79d81, 0xe5be81,
+ /* f8 */ 0xe78bb0, 0xe4ba89, 0xe68094, 0xe695b4,
+ /* fc */ 0xe68baf, 0xe6ada3, 0xe694bf,
+
+ /*** Two byte table, leaf: d6xx - offset 0x0408b ***/
+
+ /* 40 */ 0xe8aba4, 0xe8aba5, 0xe8aba6, 0xe8aba7,
+ /* 44 */ 0xe8aba8, 0xe8aba9, 0xe8abaa, 0xe8abab,
+ /* 48 */ 0xe8abac, 0xe8abad, 0xe8abae, 0xe8abaf,
+ /* 4c */ 0xe8abb0, 0xe8abb1, 0xe8abb2, 0xe8abb3,
+ /* 50 */ 0xe8abb4, 0xe8abb5, 0xe8abb6, 0xe8abb7,
+ /* 54 */ 0xe8abb8, 0xe8abb9, 0xe8abba, 0xe8abbb,
+ /* 58 */ 0xe8abbc, 0xe8abbd, 0xe8abbe, 0xe8abbf,
+ /* 5c */ 0xe8ac80, 0xe8ac81, 0xe8ac82, 0xe8ac83,
+ /* 60 */ 0xe8ac84, 0xe8ac85, 0xe8ac86, 0xe8ac88,
+ /* 64 */ 0xe8ac89, 0xe8ac8a, 0xe8ac8b, 0xe8ac8c,
+ /* 68 */ 0xe8ac8d, 0xe8ac8e, 0xe8ac8f, 0xe8ac90,
+ /* 6c */ 0xe8ac91, 0xe8ac92, 0xe8ac93, 0xe8ac94,
+ /* 70 */ 0xe8ac95, 0xe8ac96, 0xe8ac97, 0xe8ac98,
+ /* 74 */ 0xe8ac99, 0xe8ac9a, 0xe8ac9b, 0xe8ac9c,
+ /* 78 */ 0xe8ac9d, 0xe8ac9e, 0xe8ac9f, 0xe8aca0,
+ /* 7c */ 0xe8aca1, 0xe8aca2, 0xe8aca3, 0x000000,
+ /* 80 */ 0xe8aca4, 0xe8aca5, 0xe8aca7, 0xe8aca8,
+ /* 84 */ 0xe8aca9, 0xe8acaa, 0xe8acab, 0xe8acac,
+ /* 88 */ 0xe8acad, 0xe8acae, 0xe8acaf, 0xe8acb0,
+ /* 8c */ 0xe8acb1, 0xe8acb2, 0xe8acb3, 0xe8acb4,
+ /* 90 */ 0xe8acb5, 0xe8acb6, 0xe8acb7, 0xe8acb8,
+ /* 94 */ 0xe8acb9, 0xe8acba, 0xe8acbb, 0xe8acbc,
+ /* 98 */ 0xe8acbd, 0xe8acbe, 0xe8acbf, 0xe8ad80,
+ /* 9c */ 0xe8ad81, 0xe8ad82, 0xe8ad83, 0xe8ad84,
+ /* a0 */ 0xe8ad85, 0xe5b8a7, 0xe79787, 0xe98391,
+ /* a4 */ 0xe8af81, 0xe88a9d, 0xe69e9d, 0xe694af,
+ /* a8 */ 0xe590b1, 0xe89c98, 0xe79fa5, 0xe882a2,
+ /* ac */ 0xe88482, 0xe6b181, 0xe4b98b, 0xe7bb87,
+ /* b0 */ 0xe8818c, 0xe79bb4, 0xe6a48d, 0xe6ae96,
+ /* b4 */ 0xe689a7, 0xe580bc, 0xe4be84, 0xe59d80,
+ /* b8 */ 0xe68c87, 0xe6ada2, 0xe8b6be, 0xe58faa,
+ /* bc */ 0xe697a8, 0xe7bab8, 0xe5bf97, 0xe68c9a,
+ /* c0 */ 0xe68eb7, 0xe887b3, 0xe887b4, 0xe7bdae,
+ /* c4 */ 0xe5b89c, 0xe5b399, 0xe588b6, 0xe699ba,
+ /* c8 */ 0xe7a7a9, 0xe7a89a, 0xe8b4a8, 0xe78299,
+ /* cc */ 0xe79794, 0xe6bb9e, 0xe6b2bb, 0xe7aa92,
+ /* d0 */ 0xe4b8ad, 0xe79b85, 0xe5bfa0, 0xe9929f,
+ /* d4 */ 0xe8a1b7, 0xe7bb88, 0xe7a78d, 0xe882bf,
+ /* d8 */ 0xe9878d, 0xe4bbb2, 0xe4bc97, 0xe8889f,
+ /* dc */ 0xe591a8, 0xe5b79e, 0xe6b4b2, 0xe8af8c,
+ /* e0 */ 0xe7b2a5, 0xe8bdb4, 0xe88298, 0xe5b89a,
+ /* e4 */ 0xe59292, 0xe79ab1, 0xe5ae99, 0xe698bc,
+ /* e8 */ 0xe9aaa4, 0xe78fa0, 0xe6a0aa, 0xe89b9b,
+ /* ec */ 0xe69cb1, 0xe78caa, 0xe8afb8, 0xe8af9b,
+ /* f0 */ 0xe98090, 0xe7abb9, 0xe7839b, 0xe785ae,
+ /* f4 */ 0xe68b84, 0xe79ea9, 0xe598b1, 0xe4b8bb,
+ /* f8 */ 0xe89197, 0xe69fb1, 0xe58aa9, 0xe89b80,
+ /* fc */ 0xe8b4ae, 0xe993b8, 0xe7ad91,
+
+ /*** Two byte table, leaf: d7xx - offset 0x0414a ***/
+
+ /* 40 */ 0xe8ad86, 0xe8ad87, 0xe8ad88, 0xe8ad89,
+ /* 44 */ 0xe8ad8a, 0xe8ad8b, 0xe8ad8c, 0xe8ad8d,
+ /* 48 */ 0xe8ad8e, 0xe8ad8f, 0xe8ad90, 0xe8ad91,
+ /* 4c */ 0xe8ad92, 0xe8ad93, 0xe8ad94, 0xe8ad95,
+ /* 50 */ 0xe8ad96, 0xe8ad97, 0xe8ad98, 0xe8ad99,
+ /* 54 */ 0xe8ad9a, 0xe8ad9b, 0xe8ad9c, 0xe8ad9d,
+ /* 58 */ 0xe8ad9e, 0xe8ad9f, 0xe8ada0, 0xe8ada1,
+ /* 5c */ 0xe8ada2, 0xe8ada3, 0xe8ada4, 0xe8ada5,
+ /* 60 */ 0xe8ada7, 0xe8ada8, 0xe8ada9, 0xe8adaa,
+ /* 64 */ 0xe8adab, 0xe8adad, 0xe8adae, 0xe8adaf,
+ /* 68 */ 0xe8adb0, 0xe8adb1, 0xe8adb2, 0xe8adb3,
+ /* 6c */ 0xe8adb4, 0xe8adb5, 0xe8adb6, 0xe8adb7,
+ /* 70 */ 0xe8adb8, 0xe8adb9, 0xe8adba, 0xe8adbb,
+ /* 74 */ 0xe8adbc, 0xe8adbd, 0xe8adbe, 0xe8adbf,
+ /* 78 */ 0xe8ae80, 0xe8ae81, 0xe8ae82, 0xe8ae83,
+ /* 7c */ 0xe8ae84, 0xe8ae85, 0xe8ae86, 0x000000,
+ /* 80 */ 0xe8ae87, 0xe8ae88, 0xe8ae89, 0xe8ae8a,
+ /* 84 */ 0xe8ae8b, 0xe8ae8c, 0xe8ae8d, 0xe8ae8e,
+ /* 88 */ 0xe8ae8f, 0xe8ae90, 0xe8ae91, 0xe8ae92,
+ /* 8c */ 0xe8ae93, 0xe8ae94, 0xe8ae95, 0xe8ae96,
+ /* 90 */ 0xe8ae97, 0xe8ae98, 0xe8ae99, 0xe8ae9a,
+ /* 94 */ 0xe8ae9b, 0xe8ae9c, 0xe8ae9d, 0xe8ae9e,
+ /* 98 */ 0xe8ae9f, 0xe8aeac, 0xe8aeb1, 0xe8aebb,
+ /* 9c */ 0xe8af87, 0xe8af90, 0xe8afaa, 0xe8b089,
+ /* a0 */ 0xe8b09e, 0xe4bd8f, 0xe6b3a8, 0xe7a59d,
+ /* a4 */ 0xe9a9bb, 0xe68a93, 0xe788aa, 0xe68bbd,
+ /* a8 */ 0xe4b893, 0xe7a096, 0xe8bdac, 0xe692b0,
+ /* ac */ 0xe8b59a, 0xe7af86, 0xe6a1a9, 0xe5ba84,
+ /* b0 */ 0xe8a385, 0xe5a686, 0xe6929e, 0xe5a3ae,
+ /* b4 */ 0xe78ab6, 0xe6a48e, 0xe994a5, 0xe8bfbd,
+ /* b8 */ 0xe8b598, 0xe59da0, 0xe7bc80, 0xe8b086,
+ /* bc */ 0xe58786, 0xe68d89, 0xe68b99, 0xe58d93,
+ /* c0 */ 0xe6a18c, 0xe790a2, 0xe88c81, 0xe9858c,
+ /* c4 */ 0xe59584, 0xe79d80, 0xe781bc, 0xe6b58a,
+ /* c8 */ 0xe585b9, 0xe592a8, 0xe8b584, 0xe5a7bf,
+ /* cc */ 0xe6bb8b, 0xe6b784, 0xe5ad9c, 0xe7b4ab,
+ /* d0 */ 0xe4bb94, 0xe7b1bd, 0xe6bb93, 0xe5ad90,
+ /* d4 */ 0xe887aa, 0xe6b88d, 0xe5ad97, 0xe9ac83,
+ /* d8 */ 0xe6a395, 0xe8b8aa, 0xe5ae97, 0xe7bbbc,
+ /* dc */ 0xe680bb, 0xe7bab5, 0xe982b9, 0xe8b5b0,
+ /* e0 */ 0xe5a58f, 0xe68f8d, 0xe7a79f, 0xe8b6b3,
+ /* e4 */ 0xe58d92, 0xe6978f, 0xe7a596, 0xe8af85,
+ /* e8 */ 0xe998bb, 0xe7bb84, 0xe992bb, 0xe7ba82,
+ /* ec */ 0xe598b4, 0xe98689, 0xe69c80, 0xe7bdaa,
+ /* f0 */ 0xe5b08a, 0xe981b5, 0xe698a8, 0xe5b7a6,
+ /* f4 */ 0xe4bd90, 0xe69f9e, 0xe5819a, 0xe4bd9c,
+ /* f8 */ 0xe59d90, 0xe5baa7, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: d8xx - offset 0x04209 ***/
+
+ /* 40 */ 0xe8b0b8, 0xe8b0b9, 0xe8b0ba, 0xe8b0bb,
+ /* 44 */ 0xe8b0bc, 0xe8b0bd, 0xe8b0be, 0xe8b0bf,
+ /* 48 */ 0xe8b180, 0xe8b182, 0xe8b183, 0xe8b184,
+ /* 4c */ 0xe8b185, 0xe8b188, 0xe8b18a, 0xe8b18b,
+ /* 50 */ 0xe8b18d, 0xe8b18e, 0xe8b18f, 0xe8b190,
+ /* 54 */ 0xe8b191, 0xe8b192, 0xe8b193, 0xe8b194,
+ /* 58 */ 0xe8b196, 0xe8b197, 0xe8b198, 0xe8b199,
+ /* 5c */ 0xe8b19b, 0xe8b19c, 0xe8b19d, 0xe8b19e,
+ /* 60 */ 0xe8b19f, 0xe8b1a0, 0xe8b1a3, 0xe8b1a4,
+ /* 64 */ 0xe8b1a5, 0xe8b1a6, 0xe8b1a7, 0xe8b1a8,
+ /* 68 */ 0xe8b1a9, 0xe8b1ac, 0xe8b1ad, 0xe8b1ae,
+ /* 6c */ 0xe8b1af, 0xe8b1b0, 0xe8b1b1, 0xe8b1b2,
+ /* 70 */ 0xe8b1b4, 0xe8b1b5, 0xe8b1b6, 0xe8b1b7,
+ /* 74 */ 0xe8b1bb, 0xe8b1bc, 0xe8b1bd, 0xe8b1be,
+ /* 78 */ 0xe8b1bf, 0xe8b280, 0xe8b281, 0xe8b283,
+ /* 7c */ 0xe8b284, 0xe8b286, 0xe8b287, 0x000000,
+ /* 80 */ 0xe8b288, 0xe8b28b, 0xe8b28d, 0xe8b28e,
+ /* 84 */ 0xe8b28f, 0xe8b290, 0xe8b291, 0xe8b292,
+ /* 88 */ 0xe8b293, 0xe8b295, 0xe8b296, 0xe8b297,
+ /* 8c */ 0xe8b299, 0xe8b29a, 0xe8b29b, 0xe8b29c,
+ /* 90 */ 0xe8b29d, 0xe8b29e, 0xe8b29f, 0xe8b2a0,
+ /* 94 */ 0xe8b2a1, 0xe8b2a2, 0xe8b2a3, 0xe8b2a4,
+ /* 98 */ 0xe8b2a5, 0xe8b2a6, 0xe8b2a7, 0xe8b2a8,
+ /* 9c */ 0xe8b2a9, 0xe8b2aa, 0xe8b2ab, 0xe8b2ac,
+ /* a0 */ 0xe8b2ad, 0xe4ba8d, 0xe4b88c, 0xe58580,
+ /* a4 */ 0xe4b890, 0xe5bbbf, 0xe58d85, 0xe4b895,
+ /* a8 */ 0xe4ba98, 0xe4b89e, 0xe9acb2, 0xe5adac,
+ /* ac */ 0xe599a9, 0xe4b8a8, 0xe7a6ba, 0xe4b8bf,
+ /* b0 */ 0xe58c95, 0xe4b987, 0xe5a4ad, 0xe788bb,
+ /* b4 */ 0xe58dae, 0xe6b090, 0xe59b9f, 0xe883a4,
+ /* b8 */ 0xe9a697, 0xe6af93, 0xe79dbe, 0xe9bc97,
+ /* bc */ 0xe4b8b6, 0xe4ba9f, 0xe9bc90, 0xe4b99c,
+ /* c0 */ 0xe4b9a9, 0xe4ba93, 0xe88a88, 0xe5ad9b,
+ /* c4 */ 0xe595ac, 0xe5988f, 0xe4bb84, 0xe58e8d,
+ /* c8 */ 0xe58e9d, 0xe58ea3, 0xe58ea5, 0xe58eae,
+ /* cc */ 0xe99da5, 0xe8b59d, 0xe58c9a, 0xe58fb5,
+ /* d0 */ 0xe58ca6, 0xe58cae, 0xe58cbe, 0xe8b59c,
+ /* d4 */ 0xe58da6, 0xe58da3, 0xe58882, 0xe58888,
+ /* d8 */ 0xe5888e, 0xe588ad, 0xe588b3, 0xe588bf,
+ /* dc */ 0xe58980, 0xe5898c, 0xe5899e, 0xe589a1,
+ /* e0 */ 0xe5899c, 0xe892af, 0xe589bd, 0xe58a82,
+ /* e4 */ 0xe58a81, 0xe58a90, 0xe58a93, 0xe58682,
+ /* e8 */ 0xe7bd94, 0xe4babb, 0xe4bb83, 0xe4bb89,
+ /* ec */ 0xe4bb82, 0xe4bba8, 0xe4bba1, 0xe4bbab,
+ /* f0 */ 0xe4bb9e, 0xe4bc9b, 0xe4bbb3, 0xe4bca2,
+ /* f4 */ 0xe4bda4, 0xe4bbb5, 0xe4bca5, 0xe4bca7,
+ /* f8 */ 0xe4bc89, 0xe4bcab, 0xe4bd9e, 0xe4bda7,
+ /* fc */ 0xe694b8, 0xe4bd9a, 0xe4bd9d,
+
+ /*** Two byte table, leaf: d9xx - offset 0x042c8 ***/
+
+ /* 40 */ 0xe8b2ae, 0xe8b2af, 0xe8b2b0, 0xe8b2b1,
+ /* 44 */ 0xe8b2b2, 0xe8b2b3, 0xe8b2b4, 0xe8b2b5,
+ /* 48 */ 0xe8b2b6, 0xe8b2b7, 0xe8b2b8, 0xe8b2b9,
+ /* 4c */ 0xe8b2ba, 0xe8b2bb, 0xe8b2bc, 0xe8b2bd,
+ /* 50 */ 0xe8b2be, 0xe8b2bf, 0xe8b380, 0xe8b381,
+ /* 54 */ 0xe8b382, 0xe8b383, 0xe8b384, 0xe8b385,
+ /* 58 */ 0xe8b386, 0xe8b387, 0xe8b388, 0xe8b389,
+ /* 5c */ 0xe8b38a, 0xe8b38b, 0xe8b38c, 0xe8b38d,
+ /* 60 */ 0xe8b38e, 0xe8b38f, 0xe8b390, 0xe8b391,
+ /* 64 */ 0xe8b392, 0xe8b393, 0xe8b394, 0xe8b395,
+ /* 68 */ 0xe8b396, 0xe8b397, 0xe8b398, 0xe8b399,
+ /* 6c */ 0xe8b39a, 0xe8b39b, 0xe8b39c, 0xe8b39d,
+ /* 70 */ 0xe8b39e, 0xe8b39f, 0xe8b3a0, 0xe8b3a1,
+ /* 74 */ 0xe8b3a2, 0xe8b3a3, 0xe8b3a4, 0xe8b3a5,
+ /* 78 */ 0xe8b3a6, 0xe8b3a7, 0xe8b3a8, 0xe8b3a9,
+ /* 7c */ 0xe8b3aa, 0xe8b3ab, 0xe8b3ac, 0x000000,
+ /* 80 */ 0xe8b3ad, 0xe8b3ae, 0xe8b3af, 0xe8b3b0,
+ /* 84 */ 0xe8b3b1, 0xe8b3b2, 0xe8b3b3, 0xe8b3b4,
+ /* 88 */ 0xe8b3b5, 0xe8b3b6, 0xe8b3b7, 0xe8b3b8,
+ /* 8c */ 0xe8b3b9, 0xe8b3ba, 0xe8b3bb, 0xe8b3bc,
+ /* 90 */ 0xe8b3bd, 0xe8b3be, 0xe8b3bf, 0xe8b480,
+ /* 94 */ 0xe8b481, 0xe8b482, 0xe8b483, 0xe8b484,
+ /* 98 */ 0xe8b485, 0xe8b486, 0xe8b487, 0xe8b488,
+ /* 9c */ 0xe8b489, 0xe8b48a, 0xe8b48b, 0xe8b48c,
+ /* a0 */ 0xe8b48d, 0xe4bd9f, 0xe4bd97, 0xe4bcb2,
+ /* a4 */ 0xe4bcbd, 0xe4bdb6, 0xe4bdb4, 0xe4be91,
+ /* a8 */ 0xe4be89, 0xe4be83, 0xe4be8f, 0xe4bdbe,
+ /* ac */ 0xe4bdbb, 0xe4beaa, 0xe4bdbc, 0xe4beac,
+ /* b0 */ 0xe4be94, 0xe4bfa6, 0xe4bfa8, 0xe4bfaa,
+ /* b4 */ 0xe4bf85, 0xe4bf9a, 0xe4bfa3, 0xe4bf9c,
+ /* b8 */ 0xe4bf91, 0xe4bf9f, 0xe4bfb8, 0xe580a9,
+ /* bc */ 0xe5818c, 0xe4bfb3, 0xe580ac, 0xe5808f,
+ /* c0 */ 0xe580ae, 0xe580ad, 0xe4bfbe, 0xe5809c,
+ /* c4 */ 0xe5808c, 0xe580a5, 0xe580a8, 0xe581be,
+ /* c8 */ 0xe58183, 0xe58195, 0xe58188, 0xe5818e,
+ /* cc */ 0xe581ac, 0xe581bb, 0xe582a5, 0xe582a7,
+ /* d0 */ 0xe582a9, 0xe582ba, 0xe58396, 0xe58486,
+ /* d4 */ 0xe583ad, 0xe583ac, 0xe583a6, 0xe583ae,
+ /* d8 */ 0xe58487, 0xe5848b, 0xe4bb9d, 0xe6b0bd,
+ /* dc */ 0xe4bd98, 0xe4bda5, 0xe4bf8e, 0xe9bea0,
+ /* e0 */ 0xe6b186, 0xe7b1b4, 0xe585ae, 0xe5b7bd,
+ /* e4 */ 0xe9bb89, 0xe9a698, 0xe58681, 0xe5a494,
+ /* e8 */ 0xe58bb9, 0xe58c8d, 0xe8a887, 0xe58c90,
+ /* ec */ 0xe587ab, 0xe5a499, 0xe58595, 0xe4baa0,
+ /* f0 */ 0xe58596, 0xe4bab3, 0xe8a1ae, 0xe8a2a4,
+ /* f4 */ 0xe4bab5, 0xe88494, 0xe8a392, 0xe7a680,
+ /* f8 */ 0xe5acb4, 0xe8a083, 0xe7beb8, 0xe586ab,
+ /* fc */ 0xe586b1, 0xe586bd, 0xe586bc,
+
+ /*** Two byte table, leaf: daxx - offset 0x04387 ***/
+
+ /* 40 */ 0xe8b48e, 0xe8b48f, 0xe8b490, 0xe8b491,
+ /* 44 */ 0xe8b492, 0xe8b493, 0xe8b494, 0xe8b495,
+ /* 48 */ 0xe8b496, 0xe8b497, 0xe8b498, 0xe8b499,
+ /* 4c */ 0xe8b49a, 0xe8b49b, 0xe8b49c, 0xe8b4a0,
+ /* 50 */ 0xe8b591, 0xe8b592, 0xe8b597, 0xe8b59f,
+ /* 54 */ 0xe8b5a5, 0xe8b5a8, 0xe8b5a9, 0xe8b5aa,
+ /* 58 */ 0xe8b5ac, 0xe8b5ae, 0xe8b5af, 0xe8b5b1,
+ /* 5c */ 0xe8b5b2, 0xe8b5b8, 0xe8b5b9, 0xe8b5ba,
+ /* 60 */ 0xe8b5bb, 0xe8b5bc, 0xe8b5bd, 0xe8b5be,
+ /* 64 */ 0xe8b5bf, 0xe8b680, 0xe8b682, 0xe8b683,
+ /* 68 */ 0xe8b686, 0xe8b687, 0xe8b688, 0xe8b689,
+ /* 6c */ 0xe8b68c, 0xe8b68d, 0xe8b68e, 0xe8b68f,
+ /* 70 */ 0xe8b690, 0xe8b692, 0xe8b693, 0xe8b695,
+ /* 74 */ 0xe8b696, 0xe8b697, 0xe8b698, 0xe8b699,
+ /* 78 */ 0xe8b69a, 0xe8b69b, 0xe8b69c, 0xe8b69d,
+ /* 7c */ 0xe8b69e, 0xe8b6a0, 0xe8b6a1, 0x000000,
+ /* 80 */ 0xe8b6a2, 0xe8b6a4, 0xe8b6a5, 0xe8b6a6,
+ /* 84 */ 0xe8b6a7, 0xe8b6a8, 0xe8b6a9, 0xe8b6aa,
+ /* 88 */ 0xe8b6ab, 0xe8b6ac, 0xe8b6ad, 0xe8b6ae,
+ /* 8c */ 0xe8b6af, 0xe8b6b0, 0xe8b6b2, 0xe8b6b6,
+ /* 90 */ 0xe8b6b7, 0xe8b6b9, 0xe8b6bb, 0xe8b6bd,
+ /* 94 */ 0xe8b780, 0xe8b781, 0xe8b782, 0xe8b785,
+ /* 98 */ 0xe8b787, 0xe8b788, 0xe8b789, 0xe8b78a,
+ /* 9c */ 0xe8b78d, 0xe8b790, 0xe8b792, 0xe8b793,
+ /* a0 */ 0xe8b794, 0xe58787, 0xe58696, 0xe586a2,
+ /* a4 */ 0xe586a5, 0xe8aea0, 0xe8aea6, 0xe8aea7,
+ /* a8 */ 0xe8aeaa, 0xe8aeb4, 0xe8aeb5, 0xe8aeb7,
+ /* ac */ 0xe8af82, 0xe8af83, 0xe8af8b, 0xe8af8f,
+ /* b0 */ 0xe8af8e, 0xe8af92, 0xe8af93, 0xe8af94,
+ /* b4 */ 0xe8af96, 0xe8af98, 0xe8af99, 0xe8af9c,
+ /* b8 */ 0xe8af9f, 0xe8afa0, 0xe8afa4, 0xe8afa8,
+ /* bc */ 0xe8afa9, 0xe8afae, 0xe8afb0, 0xe8afb3,
+ /* c0 */ 0xe8afb6, 0xe8afb9, 0xe8afbc, 0xe8afbf,
+ /* c4 */ 0xe8b080, 0xe8b082, 0xe8b084, 0xe8b087,
+ /* c8 */ 0xe8b08c, 0xe8b08f, 0xe8b091, 0xe8b092,
+ /* cc */ 0xe8b094, 0xe8b095, 0xe8b096, 0xe8b099,
+ /* d0 */ 0xe8b09b, 0xe8b098, 0xe8b09d, 0xe8b09f,
+ /* d4 */ 0xe8b0a0, 0xe8b0a1, 0xe8b0a5, 0xe8b0a7,
+ /* d8 */ 0xe8b0aa, 0xe8b0ab, 0xe8b0ae, 0xe8b0af,
+ /* dc */ 0xe8b0b2, 0xe8b0b3, 0xe8b0b5, 0xe8b0b6,
+ /* e0 */ 0xe58da9, 0xe58dba, 0xe9989d, 0xe998a2,
+ /* e4 */ 0xe998a1, 0xe998b1, 0xe998aa, 0xe998bd,
+ /* e8 */ 0xe998bc, 0xe99982, 0xe99989, 0xe99994,
+ /* ec */ 0xe9999f, 0xe999a7, 0xe999ac, 0xe999b2,
+ /* f0 */ 0xe999b4, 0xe99a88, 0xe99a8d, 0xe99a97,
+ /* f4 */ 0xe99ab0, 0xe98297, 0xe9829b, 0xe9829d,
+ /* f8 */ 0xe98299, 0xe982ac, 0xe982a1, 0xe982b4,
+ /* fc */ 0xe982b3, 0xe982b6, 0xe982ba,
+
+ /*** Two byte table, leaf: dbxx - offset 0x04446 ***/
+
+ /* 40 */ 0xe8b795, 0xe8b798, 0xe8b799, 0xe8b79c,
+ /* 44 */ 0xe8b7a0, 0xe8b7a1, 0xe8b7a2, 0xe8b7a5,
+ /* 48 */ 0xe8b7a6, 0xe8b7a7, 0xe8b7a9, 0xe8b7ad,
+ /* 4c */ 0xe8b7ae, 0xe8b7b0, 0xe8b7b1, 0xe8b7b2,
+ /* 50 */ 0xe8b7b4, 0xe8b7b6, 0xe8b7bc, 0xe8b7be,
+ /* 54 */ 0xe8b7bf, 0xe8b880, 0xe8b881, 0xe8b882,
+ /* 58 */ 0xe8b883, 0xe8b884, 0xe8b886, 0xe8b887,
+ /* 5c */ 0xe8b888, 0xe8b88b, 0xe8b88d, 0xe8b88e,
+ /* 60 */ 0xe8b890, 0xe8b891, 0xe8b892, 0xe8b893,
+ /* 64 */ 0xe8b895, 0xe8b896, 0xe8b897, 0xe8b898,
+ /* 68 */ 0xe8b899, 0xe8b89a, 0xe8b89b, 0xe8b89c,
+ /* 6c */ 0xe8b8a0, 0xe8b8a1, 0xe8b8a4, 0xe8b8a5,
+ /* 70 */ 0xe8b8a6, 0xe8b8a7, 0xe8b8a8, 0xe8b8ab,
+ /* 74 */ 0xe8b8ad, 0xe8b8b0, 0xe8b8b2, 0xe8b8b3,
+ /* 78 */ 0xe8b8b4, 0xe8b8b6, 0xe8b8b7, 0xe8b8b8,
+ /* 7c */ 0xe8b8bb, 0xe8b8bc, 0xe8b8be, 0x000000,
+ /* 80 */ 0xe8b8bf, 0xe8b983, 0xe8b985, 0xe8b986,
+ /* 84 */ 0xe8b98c, 0xe8b98d, 0xe8b98e, 0xe8b98f,
+ /* 88 */ 0xe8b990, 0xe8b993, 0xe8b994, 0xe8b995,
+ /* 8c */ 0xe8b996, 0xe8b997, 0xe8b998, 0xe8b99a,
+ /* 90 */ 0xe8b99b, 0xe8b99c, 0xe8b99d, 0xe8b99e,
+ /* 94 */ 0xe8b99f, 0xe8b9a0, 0xe8b9a1, 0xe8b9a2,
+ /* 98 */ 0xe8b9a3, 0xe8b9a4, 0xe8b9a5, 0xe8b9a7,
+ /* 9c */ 0xe8b9a8, 0xe8b9aa, 0xe8b9ab, 0xe8b9ae,
+ /* a0 */ 0xe8b9b1, 0xe982b8, 0xe982b0, 0xe9838f,
+ /* a4 */ 0xe98385, 0xe982be, 0xe98390, 0xe98384,
+ /* a8 */ 0xe98387, 0xe98393, 0xe983a6, 0xe983a2,
+ /* ac */ 0xe9839c, 0xe98397, 0xe9839b, 0xe983ab,
+ /* b0 */ 0xe983af, 0xe983be, 0xe98484, 0xe984a2,
+ /* b4 */ 0xe9849e, 0xe984a3, 0xe984b1, 0xe984af,
+ /* b8 */ 0xe984b9, 0xe98583, 0xe98586, 0xe5888d,
+ /* bc */ 0xe5a582, 0xe58aa2, 0xe58aac, 0xe58aad,
+ /* c0 */ 0xe58abe, 0xe593bf, 0xe58b90, 0xe58b96,
+ /* c4 */ 0xe58bb0, 0xe58f9f, 0xe787ae, 0xe79f8d,
+ /* c8 */ 0xe5bbb4, 0xe587b5, 0xe587bc, 0xe9acaf,
+ /* cc */ 0xe58eb6, 0xe5bc81, 0xe7959a, 0xe5b7af,
+ /* d0 */ 0xe59d8c, 0xe59ea9, 0xe59ea1, 0xe5a1be,
+ /* d4 */ 0xe5a2bc, 0xe5a385, 0xe5a391, 0xe59ca9,
+ /* d8 */ 0xe59cac, 0xe59caa, 0xe59cb3, 0xe59cb9,
+ /* dc */ 0xe59cae, 0xe59caf, 0xe59d9c, 0xe59cbb,
+ /* e0 */ 0xe59d82, 0xe59da9, 0xe59e85, 0xe59dab,
+ /* e4 */ 0xe59e86, 0xe59dbc, 0xe59dbb, 0xe59da8,
+ /* e8 */ 0xe59dad, 0xe59db6, 0xe59db3, 0xe59ead,
+ /* ec */ 0xe59ea4, 0xe59e8c, 0xe59eb2, 0xe59f8f,
+ /* f0 */ 0xe59ea7, 0xe59eb4, 0xe59e93, 0xe59ea0,
+ /* f4 */ 0xe59f95, 0xe59f98, 0xe59f9a, 0xe59f99,
+ /* f8 */ 0xe59f92, 0xe59eb8, 0xe59fb4, 0xe59faf,
+ /* fc */ 0xe59fb8, 0xe59fa4, 0xe59f9d,
+
+ /*** Two byte table, leaf: dcxx - offset 0x04505 ***/
+
+ /* 40 */ 0xe8b9b3, 0xe8b9b5, 0xe8b9b7, 0xe8b9b8,
+ /* 44 */ 0xe8b9b9, 0xe8b9ba, 0xe8b9bb, 0xe8b9bd,
+ /* 48 */ 0xe8b9be, 0xe8ba80, 0xe8ba82, 0xe8ba83,
+ /* 4c */ 0xe8ba84, 0xe8ba86, 0xe8ba88, 0xe8ba89,
+ /* 50 */ 0xe8ba8a, 0xe8ba8b, 0xe8ba8c, 0xe8ba8d,
+ /* 54 */ 0xe8ba8e, 0xe8ba91, 0xe8ba92, 0xe8ba93,
+ /* 58 */ 0xe8ba95, 0xe8ba96, 0xe8ba97, 0xe8ba98,
+ /* 5c */ 0xe8ba99, 0xe8ba9a, 0xe8ba9b, 0xe8ba9d,
+ /* 60 */ 0xe8ba9f, 0xe8baa0, 0xe8baa1, 0xe8baa2,
+ /* 64 */ 0xe8baa3, 0xe8baa4, 0xe8baa5, 0xe8baa6,
+ /* 68 */ 0xe8baa7, 0xe8baa8, 0xe8baa9, 0xe8baaa,
+ /* 6c */ 0xe8baad, 0xe8baae, 0xe8bab0, 0xe8bab1,
+ /* 70 */ 0xe8bab3, 0xe8bab4, 0xe8bab5, 0xe8bab6,
+ /* 74 */ 0xe8bab7, 0xe8bab8, 0xe8bab9, 0xe8babb,
+ /* 78 */ 0xe8babc, 0xe8babd, 0xe8babe, 0xe8babf,
+ /* 7c */ 0xe8bb80, 0xe8bb81, 0xe8bb82, 0x000000,
+ /* 80 */ 0xe8bb83, 0xe8bb84, 0xe8bb85, 0xe8bb86,
+ /* 84 */ 0xe8bb87, 0xe8bb88, 0xe8bb89, 0xe8bb8a,
+ /* 88 */ 0xe8bb8b, 0xe8bb8c, 0xe8bb8d, 0xe8bb8f,
+ /* 8c */ 0xe8bb90, 0xe8bb91, 0xe8bb92, 0xe8bb93,
+ /* 90 */ 0xe8bb94, 0xe8bb95, 0xe8bb96, 0xe8bb97,
+ /* 94 */ 0xe8bb98, 0xe8bb99, 0xe8bb9a, 0xe8bb9b,
+ /* 98 */ 0xe8bb9c, 0xe8bb9d, 0xe8bb9e, 0xe8bb9f,
+ /* 9c */ 0xe8bba0, 0xe8bba1, 0xe8bba2, 0xe8bba3,
+ /* a0 */ 0xe8bba4, 0xe5a08b, 0xe5a08d, 0xe59fbd,
+ /* a4 */ 0xe59fad, 0xe5a080, 0xe5a09e, 0xe5a099,
+ /* a8 */ 0xe5a184, 0xe5a0a0, 0xe5a1a5, 0xe5a1ac,
+ /* ac */ 0xe5a281, 0xe5a289, 0xe5a29a, 0xe5a280,
+ /* b0 */ 0xe9a6a8, 0xe9bc99, 0xe687bf, 0xe889b9,
+ /* b4 */ 0xe889bd, 0xe889bf, 0xe88a8f, 0xe88a8a,
+ /* b8 */ 0xe88aa8, 0xe88a84, 0xe88a8e, 0xe88a91,
+ /* bc */ 0xe88a97, 0xe88a99, 0xe88aab, 0xe88ab8,
+ /* c0 */ 0xe88abe, 0xe88ab0, 0xe88b88, 0xe88b8a,
+ /* c4 */ 0xe88ba3, 0xe88a98, 0xe88ab7, 0xe88aae,
+ /* c8 */ 0xe88b8b, 0xe88b8c, 0xe88b81, 0xe88aa9,
+ /* cc */ 0xe88ab4, 0xe88aa1, 0xe88aaa, 0xe88a9f,
+ /* d0 */ 0xe88b84, 0xe88b8e, 0xe88aa4, 0xe88ba1,
+ /* d4 */ 0xe88c89, 0xe88bb7, 0xe88ba4, 0xe88c8f,
+ /* d8 */ 0xe88c87, 0xe88b9c, 0xe88bb4, 0xe88b92,
+ /* dc */ 0xe88b98, 0xe88c8c, 0xe88bbb, 0xe88b93,
+ /* e0 */ 0xe88c91, 0xe88c9a, 0xe88c86, 0xe88c94,
+ /* e4 */ 0xe88c95, 0xe88ba0, 0xe88b95, 0xe88c9c,
+ /* e8 */ 0xe88d91, 0xe88d9b, 0xe88d9c, 0xe88c88,
+ /* ec */ 0xe88e92, 0xe88cbc, 0xe88cb4, 0xe88cb1,
+ /* f0 */ 0xe88e9b, 0xe88d9e, 0xe88caf, 0xe88d8f,
+ /* f4 */ 0xe88d87, 0xe88d83, 0xe88d9f, 0xe88d80,
+ /* f8 */ 0xe88c97, 0xe88da0, 0xe88cad, 0xe88cba,
+ /* fc */ 0xe88cb3, 0xe88da6, 0xe88da5,
+
+ /*** Two byte table, leaf: ddxx - offset 0x045c4 ***/
+
+ /* 40 */ 0xe8bba5, 0xe8bba6, 0xe8bba7, 0xe8bba8,
+ /* 44 */ 0xe8bba9, 0xe8bbaa, 0xe8bbab, 0xe8bbac,
+ /* 48 */ 0xe8bbad, 0xe8bbae, 0xe8bbaf, 0xe8bbb0,
+ /* 4c */ 0xe8bbb1, 0xe8bbb2, 0xe8bbb3, 0xe8bbb4,
+ /* 50 */ 0xe8bbb5, 0xe8bbb6, 0xe8bbb7, 0xe8bbb8,
+ /* 54 */ 0xe8bbb9, 0xe8bbba, 0xe8bbbb, 0xe8bbbc,
+ /* 58 */ 0xe8bbbd, 0xe8bbbe, 0xe8bbbf, 0xe8bc80,
+ /* 5c */ 0xe8bc81, 0xe8bc82, 0xe8bc83, 0xe8bc84,
+ /* 60 */ 0xe8bc85, 0xe8bc86, 0xe8bc87, 0xe8bc88,
+ /* 64 */ 0xe8bc89, 0xe8bc8a, 0xe8bc8b, 0xe8bc8c,
+ /* 68 */ 0xe8bc8d, 0xe8bc8e, 0xe8bc8f, 0xe8bc90,
+ /* 6c */ 0xe8bc91, 0xe8bc92, 0xe8bc93, 0xe8bc94,
+ /* 70 */ 0xe8bc95, 0xe8bc96, 0xe8bc97, 0xe8bc98,
+ /* 74 */ 0xe8bc99, 0xe8bc9a, 0xe8bc9b, 0xe8bc9c,
+ /* 78 */ 0xe8bc9d, 0xe8bc9e, 0xe8bc9f, 0xe8bca0,
+ /* 7c */ 0xe8bca1, 0xe8bca2, 0xe8bca3, 0x000000,
+ /* 80 */ 0xe8bca4, 0xe8bca5, 0xe8bca6, 0xe8bca7,
+ /* 84 */ 0xe8bca8, 0xe8bca9, 0xe8bcaa, 0xe8bcab,
+ /* 88 */ 0xe8bcac, 0xe8bcad, 0xe8bcae, 0xe8bcaf,
+ /* 8c */ 0xe8bcb0, 0xe8bcb1, 0xe8bcb2, 0xe8bcb3,
+ /* 90 */ 0xe8bcb4, 0xe8bcb5, 0xe8bcb6, 0xe8bcb7,
+ /* 94 */ 0xe8bcb8, 0xe8bcb9, 0xe8bcba, 0xe8bcbb,
+ /* 98 */ 0xe8bcbc, 0xe8bcbd, 0xe8bcbe, 0xe8bcbf,
+ /* 9c */ 0xe8bd80, 0xe8bd81, 0xe8bd82, 0xe8bd83,
+ /* a0 */ 0xe8bd84, 0xe88da8, 0xe88c9b, 0xe88da9,
+ /* a4 */ 0xe88dac, 0xe88daa, 0xe88dad, 0xe88dae,
+ /* a8 */ 0xe88eb0, 0xe88db8, 0xe88eb3, 0xe88eb4,
+ /* ac */ 0xe88ea0, 0xe88eaa, 0xe88e93, 0xe88e9c,
+ /* b0 */ 0xe88e85, 0xe88dbc, 0xe88eb6, 0xe88ea9,
+ /* b4 */ 0xe88dbd, 0xe88eb8, 0xe88dbb, 0xe88e98,
+ /* b8 */ 0xe88e9e, 0xe88ea8, 0xe88eba, 0xe88ebc,
+ /* bc */ 0xe88f81, 0xe89081, 0xe88fa5, 0xe88f98,
+ /* c0 */ 0xe5a087, 0xe89098, 0xe8908b, 0xe88f9d,
+ /* c4 */ 0xe88fbd, 0xe88f96, 0xe8909c, 0xe890b8,
+ /* c8 */ 0xe89091, 0xe89086, 0xe88f94, 0xe88f9f,
+ /* cc */ 0xe8908f, 0xe89083, 0xe88fb8, 0xe88fb9,
+ /* d0 */ 0xe88faa, 0xe88f85, 0xe88f80, 0xe890a6,
+ /* d4 */ 0xe88fb0, 0xe88fa1, 0xe8919c, 0xe89191,
+ /* d8 */ 0xe8919a, 0xe89199, 0xe891b3, 0xe89287,
+ /* dc */ 0xe89288, 0xe891ba, 0xe89289, 0xe891b8,
+ /* e0 */ 0xe890bc, 0xe89186, 0xe891a9, 0xe891b6,
+ /* e4 */ 0xe8928c, 0xe8928e, 0xe890b1, 0xe891ad,
+ /* e8 */ 0xe89381, 0xe8938d, 0xe89390, 0xe893a6,
+ /* ec */ 0xe892bd, 0xe89393, 0xe8938a, 0xe892bf,
+ /* f0 */ 0xe892ba, 0xe893a0, 0xe892a1, 0xe892b9,
+ /* f4 */ 0xe892b4, 0xe89297, 0xe893a5, 0xe893a3,
+ /* f8 */ 0xe8948c, 0xe7948d, 0xe894b8, 0xe893b0,
+ /* fc */ 0xe894b9, 0xe8949f, 0xe894ba,
+
+ /*** Two byte table, leaf: dexx - offset 0x04683 ***/
+
+ /* 40 */ 0xe8bd85, 0xe8bd86, 0xe8bd87, 0xe8bd88,
+ /* 44 */ 0xe8bd89, 0xe8bd8a, 0xe8bd8b, 0xe8bd8c,
+ /* 48 */ 0xe8bd8d, 0xe8bd8e, 0xe8bd8f, 0xe8bd90,
+ /* 4c */ 0xe8bd91, 0xe8bd92, 0xe8bd93, 0xe8bd94,
+ /* 50 */ 0xe8bd95, 0xe8bd96, 0xe8bd97, 0xe8bd98,
+ /* 54 */ 0xe8bd99, 0xe8bd9a, 0xe8bd9b, 0xe8bd9c,
+ /* 58 */ 0xe8bd9d, 0xe8bd9e, 0xe8bd9f, 0xe8bda0,
+ /* 5c */ 0xe8bda1, 0xe8bda2, 0xe8bda3, 0xe8bda4,
+ /* 60 */ 0xe8bda5, 0xe8bdaa, 0xe8be80, 0xe8be8c,
+ /* 64 */ 0xe8be92, 0xe8be9d, 0xe8bea0, 0xe8bea1,
+ /* 68 */ 0xe8bea2, 0xe8bea4, 0xe8bea5, 0xe8bea6,
+ /* 6c */ 0xe8bea7, 0xe8beaa, 0xe8beac, 0xe8bead,
+ /* 70 */ 0xe8beae, 0xe8beaf, 0xe8beb2, 0xe8beb3,
+ /* 74 */ 0xe8beb4, 0xe8beb5, 0xe8beb7, 0xe8beb8,
+ /* 78 */ 0xe8beba, 0xe8bebb, 0xe8bebc, 0xe8bebf,
+ /* 7c */ 0xe8bf80, 0xe8bf83, 0xe8bf86, 0x000000,
+ /* 80 */ 0xe8bf89, 0xe8bf8a, 0xe8bf8b, 0xe8bf8c,
+ /* 84 */ 0xe8bf8d, 0xe8bf8f, 0xe8bf92, 0xe8bf96,
+ /* 88 */ 0xe8bf97, 0xe8bf9a, 0xe8bfa0, 0xe8bfa1,
+ /* 8c */ 0xe8bfa3, 0xe8bfa7, 0xe8bfac, 0xe8bfaf,
+ /* 90 */ 0xe8bfb1, 0xe8bfb2, 0xe8bfb4, 0xe8bfb5,
+ /* 94 */ 0xe8bfb6, 0xe8bfba, 0xe8bfbb, 0xe8bfbc,
+ /* 98 */ 0xe8bfbe, 0xe8bfbf, 0xe98087, 0xe98088,
+ /* 9c */ 0xe9808c, 0xe9808e, 0xe98093, 0xe98095,
+ /* a0 */ 0xe98098, 0xe89596, 0xe894bb, 0xe893bf,
+ /* a4 */ 0xe893bc, 0xe89599, 0xe89588, 0xe895a8,
+ /* a8 */ 0xe895a4, 0xe8959e, 0xe895ba, 0xe79ea2,
+ /* ac */ 0xe89583, 0xe895b2, 0xe895bb, 0xe896a4,
+ /* b0 */ 0xe896a8, 0xe89687, 0xe8968f, 0xe895b9,
+ /* b4 */ 0xe896ae, 0xe8969c, 0xe89685, 0xe896b9,
+ /* b8 */ 0xe896b7, 0xe896b0, 0xe89793, 0xe89781,
+ /* bc */ 0xe8979c, 0xe897bf, 0xe898a7, 0xe89885,
+ /* c0 */ 0xe898a9, 0xe89896, 0xe898bc, 0xe5bbbe,
+ /* c4 */ 0xe5bc88, 0xe5a4bc, 0xe5a581, 0xe880b7,
+ /* c8 */ 0xe5a595, 0xe5a59a, 0xe5a598, 0xe58c8f,
+ /* cc */ 0xe5b0a2, 0xe5b0a5, 0xe5b0ac, 0xe5b0b4,
+ /* d0 */ 0xe6898c, 0xe689aa, 0xe68a9f, 0xe68abb,
+ /* d4 */ 0xe68b8a, 0xe68b9a, 0xe68b97, 0xe68bae,
+ /* d8 */ 0xe68ca2, 0xe68bb6, 0xe68cb9, 0xe68d8b,
+ /* dc */ 0xe68d83, 0xe68ead, 0xe68fb6, 0xe68db1,
+ /* e0 */ 0xe68dba, 0xe68e8e, 0xe68eb4, 0xe68dad,
+ /* e4 */ 0xe68eac, 0xe68e8a, 0xe68da9, 0xe68eae,
+ /* e8 */ 0xe68ebc, 0xe68fb2, 0xe68fb8, 0xe68fa0,
+ /* ec */ 0xe68fbf, 0xe68f84, 0xe68f9e, 0xe68f8e,
+ /* f0 */ 0xe69192, 0xe68f86, 0xe68ebe, 0xe69185,
+ /* f4 */ 0xe69181, 0xe6908b, 0xe6909b, 0xe690a0,
+ /* f8 */ 0xe6908c, 0xe690a6, 0xe690a1, 0xe6919e,
+ /* fc */ 0xe69284, 0xe691ad, 0xe69296,
+
+ /*** Two byte table, leaf: dfxx - offset 0x04742 ***/
+
+ /* 40 */ 0xe98099, 0xe9809c, 0xe980a3, 0xe980a4,
+ /* 44 */ 0xe980a5, 0xe980a7, 0xe980a8, 0xe980a9,
+ /* 48 */ 0xe980aa, 0xe980ab, 0xe980ac, 0xe980b0,
+ /* 4c */ 0xe980b1, 0xe980b2, 0xe980b3, 0xe980b4,
+ /* 50 */ 0xe980b7, 0xe980b9, 0xe980ba, 0xe980bd,
+ /* 54 */ 0xe980bf, 0xe98180, 0xe98183, 0xe98185,
+ /* 58 */ 0xe98186, 0xe98188, 0xe98189, 0xe9818a,
+ /* 5c */ 0xe9818b, 0xe9818c, 0xe9818e, 0xe98194,
+ /* 60 */ 0xe98195, 0xe98196, 0xe98199, 0xe9819a,
+ /* 64 */ 0xe9819c, 0xe9819d, 0xe9819e, 0xe9819f,
+ /* 68 */ 0xe981a0, 0xe981a1, 0xe981a4, 0xe981a6,
+ /* 6c */ 0xe981a7, 0xe981a9, 0xe981aa, 0xe981ab,
+ /* 70 */ 0xe981ac, 0xe981af, 0xe981b0, 0xe981b1,
+ /* 74 */ 0xe981b2, 0xe981b3, 0xe981b6, 0xe981b7,
+ /* 78 */ 0xe981b8, 0xe981b9, 0xe981ba, 0xe981bb,
+ /* 7c */ 0xe981bc, 0xe981be, 0xe98281, 0x000000,
+ /* 80 */ 0xe98284, 0xe98285, 0xe98286, 0xe98287,
+ /* 84 */ 0xe98289, 0xe9828a, 0xe9828c, 0xe9828d,
+ /* 88 */ 0xe9828e, 0xe9828f, 0xe98290, 0xe98292,
+ /* 8c */ 0xe98294, 0xe98296, 0xe98298, 0xe9829a,
+ /* 90 */ 0xe9829c, 0xe9829e, 0xe9829f, 0xe982a0,
+ /* 94 */ 0xe982a4, 0xe982a5, 0xe982a7, 0xe982a8,
+ /* 98 */ 0xe982a9, 0xe982ab, 0xe982ad, 0xe982b2,
+ /* 9c */ 0xe982b7, 0xe982bc, 0xe982bd, 0xe982bf,
+ /* a0 */ 0xe98380, 0xe691ba, 0xe692b7, 0xe692b8,
+ /* a4 */ 0xe69299, 0xe692ba, 0xe69380, 0xe69390,
+ /* a8 */ 0xe69397, 0xe693a4, 0xe693a2, 0xe69489,
+ /* ac */ 0xe694a5, 0xe694ae, 0xe5bc8b, 0xe5bf92,
+ /* b0 */ 0xe79499, 0xe5bc91, 0xe58d9f, 0xe58fb1,
+ /* b4 */ 0xe58fbd, 0xe58fa9, 0xe58fa8, 0xe58fbb,
+ /* b8 */ 0xe59092, 0xe59096, 0xe59086, 0xe5918b,
+ /* bc */ 0xe59192, 0xe59193, 0xe59194, 0xe59196,
+ /* c0 */ 0xe59183, 0xe590a1, 0xe59197, 0xe59199,
+ /* c4 */ 0xe590a3, 0xe590b2, 0xe59282, 0xe59294,
+ /* c8 */ 0xe591b7, 0xe591b1, 0xe591a4, 0xe5929a,
+ /* cc */ 0xe5929b, 0xe59284, 0xe591b6, 0xe591a6,
+ /* d0 */ 0xe5929d, 0xe59390, 0xe592ad, 0xe59382,
+ /* d4 */ 0xe592b4, 0xe59392, 0xe592a7, 0xe592a6,
+ /* d8 */ 0xe59393, 0xe59394, 0xe591b2, 0xe592a3,
+ /* dc */ 0xe59395, 0xe592bb, 0xe592bf, 0xe5938c,
+ /* e0 */ 0xe59399, 0xe5939a, 0xe5939c, 0xe592a9,
+ /* e4 */ 0xe592aa, 0xe592a4, 0xe5939d, 0xe5938f,
+ /* e8 */ 0xe5939e, 0xe5949b, 0xe593a7, 0xe594a0,
+ /* ec */ 0xe593bd, 0xe59494, 0xe593b3, 0xe594a2,
+ /* f0 */ 0xe594a3, 0xe5948f, 0xe59491, 0xe594a7,
+ /* f4 */ 0xe594aa, 0xe595a7, 0xe5968f, 0xe596b5,
+ /* f8 */ 0xe59589, 0xe595ad, 0xe59581, 0xe59595,
+ /* fc */ 0xe594bf, 0xe59590, 0xe594bc,
+
+ /*** Two byte table, leaf: e0xx - offset 0x04801 ***/
+
+ /* 40 */ 0xe98382, 0xe98383, 0xe98386, 0xe98388,
+ /* 44 */ 0xe98389, 0xe9838b, 0xe9838c, 0xe9838d,
+ /* 48 */ 0xe98392, 0xe98394, 0xe98395, 0xe98396,
+ /* 4c */ 0xe98398, 0xe98399, 0xe9839a, 0xe9839e,
+ /* 50 */ 0xe9839f, 0xe983a0, 0xe983a3, 0xe983a4,
+ /* 54 */ 0xe983a5, 0xe983a9, 0xe983aa, 0xe983ac,
+ /* 58 */ 0xe983ae, 0xe983b0, 0xe983b1, 0xe983b2,
+ /* 5c */ 0xe983b3, 0xe983b5, 0xe983b6, 0xe983b7,
+ /* 60 */ 0xe983b9, 0xe983ba, 0xe983bb, 0xe983bc,
+ /* 64 */ 0xe983bf, 0xe98480, 0xe98481, 0xe98483,
+ /* 68 */ 0xe98485, 0xe98486, 0xe98487, 0xe98488,
+ /* 6c */ 0xe98489, 0xe9848a, 0xe9848b, 0xe9848c,
+ /* 70 */ 0xe9848d, 0xe9848e, 0xe9848f, 0xe98490,
+ /* 74 */ 0xe98491, 0xe98492, 0xe98493, 0xe98494,
+ /* 78 */ 0xe98495, 0xe98496, 0xe98497, 0xe98498,
+ /* 7c */ 0xe9849a, 0xe9849b, 0xe9849c, 0x000000,
+ /* 80 */ 0xe9849d, 0xe9849f, 0xe984a0, 0xe984a1,
+ /* 84 */ 0xe984a4, 0xe984a5, 0xe984a6, 0xe984a7,
+ /* 88 */ 0xe984a8, 0xe984a9, 0xe984aa, 0xe984ab,
+ /* 8c */ 0xe984ac, 0xe984ad, 0xe984ae, 0xe984b0,
+ /* 90 */ 0xe984b2, 0xe984b3, 0xe984b4, 0xe984b5,
+ /* 94 */ 0xe984b6, 0xe984b7, 0xe984b8, 0xe984ba,
+ /* 98 */ 0xe984bb, 0xe984bc, 0xe984bd, 0xe984be,
+ /* 9c */ 0xe984bf, 0xe98580, 0xe98581, 0xe98582,
+ /* a0 */ 0xe98584, 0xe594b7, 0xe59596, 0xe595b5,
+ /* a4 */ 0xe595b6, 0xe595b7, 0xe594b3, 0xe594b0,
+ /* a8 */ 0xe5959c, 0xe5968b, 0xe59792, 0xe59683,
+ /* ac */ 0xe596b1, 0xe596b9, 0xe59688, 0xe59681,
+ /* b0 */ 0xe5969f, 0xe595be, 0xe59796, 0xe59691,
+ /* b4 */ 0xe595bb, 0xe5979f, 0xe596bd, 0xe596be,
+ /* b8 */ 0xe59694, 0xe59699, 0xe597aa, 0xe597b7,
+ /* bc */ 0xe59789, 0xe5989f, 0xe59791, 0xe597ab,
+ /* c0 */ 0xe597ac, 0xe59794, 0xe597a6, 0xe5979d,
+ /* c4 */ 0xe59784, 0xe597af, 0xe597a5, 0xe597b2,
+ /* c8 */ 0xe597b3, 0xe5978c, 0xe5978d, 0xe597a8,
+ /* cc */ 0xe597b5, 0xe597a4, 0xe8be94, 0xe5989e,
+ /* d0 */ 0xe59888, 0xe5988c, 0xe59881, 0xe598a4,
+ /* d4 */ 0xe598a3, 0xe597be, 0xe59880, 0xe598a7,
+ /* d8 */ 0xe598ad, 0xe59998, 0xe598b9, 0xe59997,
+ /* dc */ 0xe598ac, 0xe5998d, 0xe599a2, 0xe59999,
+ /* e0 */ 0xe5999c, 0xe5998c, 0xe59994, 0xe59a86,
+ /* e4 */ 0xe599a4, 0xe599b1, 0xe599ab, 0xe599bb,
+ /* e8 */ 0xe599bc, 0xe59a85, 0xe59a93, 0xe59aaf,
+ /* ec */ 0xe59b94, 0xe59b97, 0xe59b9d, 0xe59ba1,
+ /* f0 */ 0xe59bb5, 0xe59bab, 0xe59bb9, 0xe59bbf,
+ /* f4 */ 0xe59c84, 0xe59c8a, 0xe59c89, 0xe59c9c,
+ /* f8 */ 0xe5b88f, 0xe5b899, 0xe5b894, 0xe5b891,
+ /* fc */ 0xe5b8b1, 0xe5b8bb, 0xe5b8bc,
+
+ /*** Two byte table, leaf: e1xx - offset 0x048c0 ***/
+
+ /* 40 */ 0xe98585, 0xe98587, 0xe98588, 0xe98591,
+ /* 44 */ 0xe98593, 0xe98594, 0xe98595, 0xe98596,
+ /* 48 */ 0xe98598, 0xe98599, 0xe9859b, 0xe9859c,
+ /* 4c */ 0xe9859f, 0xe985a0, 0xe985a6, 0xe985a7,
+ /* 50 */ 0xe985a8, 0xe985ab, 0xe985ad, 0xe985b3,
+ /* 54 */ 0xe985ba, 0xe985bb, 0xe985bc, 0xe98680,
+ /* 58 */ 0xe98681, 0xe98682, 0xe98683, 0xe98684,
+ /* 5c */ 0xe98686, 0xe98688, 0xe9868a, 0xe9868e,
+ /* 60 */ 0xe9868f, 0xe98693, 0xe98694, 0xe98695,
+ /* 64 */ 0xe98696, 0xe98697, 0xe98698, 0xe98699,
+ /* 68 */ 0xe9869c, 0xe9869d, 0xe9869e, 0xe9869f,
+ /* 6c */ 0xe986a0, 0xe986a1, 0xe986a4, 0xe986a5,
+ /* 70 */ 0xe986a6, 0xe986a7, 0xe986a8, 0xe986a9,
+ /* 74 */ 0xe986ab, 0xe986ac, 0xe986b0, 0xe986b1,
+ /* 78 */ 0xe986b2, 0xe986b3, 0xe986b6, 0xe986b7,
+ /* 7c */ 0xe986b8, 0xe986b9, 0xe986bb, 0x000000,
+ /* 80 */ 0xe986bc, 0xe986bd, 0xe986be, 0xe986bf,
+ /* 84 */ 0xe98780, 0xe98781, 0xe98782, 0xe98783,
+ /* 88 */ 0xe98784, 0xe98785, 0xe98786, 0xe98788,
+ /* 8c */ 0xe9878b, 0xe98790, 0xe98792, 0xe98793,
+ /* 90 */ 0xe98794, 0xe98795, 0xe98796, 0xe98797,
+ /* 94 */ 0xe98798, 0xe98799, 0xe9879a, 0xe9879b,
+ /* 98 */ 0xe9879d, 0xe9879e, 0xe9879f, 0xe987a0,
+ /* 9c */ 0xe987a1, 0xe987a2, 0xe987a3, 0xe987a4,
+ /* a0 */ 0xe987a5, 0xe5b8b7, 0xe5b984, 0xe5b994,
+ /* a4 */ 0xe5b99b, 0xe5b99e, 0xe5b9a1, 0xe5b28c,
+ /* a8 */ 0xe5b1ba, 0xe5b28d, 0xe5b290, 0xe5b296,
+ /* ac */ 0xe5b288, 0xe5b298, 0xe5b299, 0xe5b291,
+ /* b0 */ 0xe5b29a, 0xe5b29c, 0xe5b2b5, 0xe5b2a2,
+ /* b4 */ 0xe5b2bd, 0xe5b2ac, 0xe5b2ab, 0xe5b2b1,
+ /* b8 */ 0xe5b2a3, 0xe5b381, 0xe5b2b7, 0xe5b384,
+ /* bc */ 0xe5b392, 0xe5b3a4, 0xe5b38b, 0xe5b3a5,
+ /* c0 */ 0xe5b482, 0xe5b483, 0xe5b4a7, 0xe5b4a6,
+ /* c4 */ 0xe5b4ae, 0xe5b4a4, 0xe5b49e, 0xe5b486,
+ /* c8 */ 0xe5b49b, 0xe5b598, 0xe5b4be, 0xe5b4b4,
+ /* cc */ 0xe5b4bd, 0xe5b5ac, 0xe5b59b, 0xe5b5af,
+ /* d0 */ 0xe5b59d, 0xe5b5ab, 0xe5b58b, 0xe5b58a,
+ /* d4 */ 0xe5b5a9, 0xe5b5b4, 0xe5b682, 0xe5b699,
+ /* d8 */ 0xe5b69d, 0xe8b1b3, 0xe5b6b7, 0xe5b785,
+ /* dc */ 0xe5bdb3, 0xe5bdb7, 0xe5be82, 0xe5be87,
+ /* e0 */ 0xe5be89, 0xe5be8c, 0xe5be95, 0xe5be99,
+ /* e4 */ 0xe5be9c, 0xe5bea8, 0xe5bead, 0xe5beb5,
+ /* e8 */ 0xe5bebc, 0xe8a1a2, 0xe5bda1, 0xe78aad,
+ /* ec */ 0xe78ab0, 0xe78ab4, 0xe78ab7, 0xe78ab8,
+ /* f0 */ 0xe78b83, 0xe78b81, 0xe78b8e, 0xe78b8d,
+ /* f4 */ 0xe78b92, 0xe78ba8, 0xe78baf, 0xe78ba9,
+ /* f8 */ 0xe78bb2, 0xe78bb4, 0xe78bb7, 0xe78c81,
+ /* fc */ 0xe78bb3, 0xe78c83, 0xe78bba,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0497f ***/
+
+ /* 40 */ 0xe987a6, 0xe987a7, 0xe987a8, 0xe987a9,
+ /* 44 */ 0xe987aa, 0xe987ab, 0xe987ac, 0xe987ad,
+ /* 48 */ 0xe987ae, 0xe987af, 0xe987b0, 0xe987b1,
+ /* 4c */ 0xe987b2, 0xe987b3, 0xe987b4, 0xe987b5,
+ /* 50 */ 0xe987b6, 0xe987b7, 0xe987b8, 0xe987b9,
+ /* 54 */ 0xe987ba, 0xe987bb, 0xe987bc, 0xe987bd,
+ /* 58 */ 0xe987be, 0xe987bf, 0xe98880, 0xe98881,
+ /* 5c */ 0xe98882, 0xe98883, 0xe98884, 0xe98885,
+ /* 60 */ 0xe98886, 0xe98887, 0xe98888, 0xe98889,
+ /* 64 */ 0xe9888a, 0xe9888b, 0xe9888c, 0xe9888d,
+ /* 68 */ 0xe9888e, 0xe9888f, 0xe98890, 0xe98891,
+ /* 6c */ 0xe98892, 0xe98893, 0xe98894, 0xe98895,
+ /* 70 */ 0xe98896, 0xe98897, 0xe98898, 0xe98899,
+ /* 74 */ 0xe9889a, 0xe9889b, 0xe9889c, 0xe9889d,
+ /* 78 */ 0xe9889e, 0xe9889f, 0xe988a0, 0xe988a1,
+ /* 7c */ 0xe988a2, 0xe988a3, 0xe988a4, 0x000000,
+ /* 80 */ 0xe988a5, 0xe988a6, 0xe988a7, 0xe988a8,
+ /* 84 */ 0xe988a9, 0xe988aa, 0xe988ab, 0xe988ac,
+ /* 88 */ 0xe988ad, 0xe988ae, 0xe988af, 0xe988b0,
+ /* 8c */ 0xe988b1, 0xe988b2, 0xe988b3, 0xe988b4,
+ /* 90 */ 0xe988b5, 0xe988b6, 0xe988b7, 0xe988b8,
+ /* 94 */ 0xe988b9, 0xe988ba, 0xe988bb, 0xe988bc,
+ /* 98 */ 0xe988bd, 0xe988be, 0xe988bf, 0xe98980,
+ /* 9c */ 0xe98981, 0xe98982, 0xe98983, 0xe98984,
+ /* a0 */ 0xe98985, 0xe78bbb, 0xe78c97, 0xe78c93,
+ /* a4 */ 0xe78ca1, 0xe78c8a, 0xe78c9e, 0xe78c9d,
+ /* a8 */ 0xe78c95, 0xe78ca2, 0xe78cb9, 0xe78ca5,
+ /* ac */ 0xe78cac, 0xe78cb8, 0xe78cb1, 0xe78d90,
+ /* b0 */ 0xe78d8d, 0xe78d97, 0xe78da0, 0xe78dac,
+ /* b4 */ 0xe78daf, 0xe78dbe, 0xe8889b, 0xe5a4a5,
+ /* b8 */ 0xe9a3a7, 0xe5a4a4, 0xe5a482, 0xe9a5a3,
+ /* bc */ 0xe9a5a7, 0xe9a5a8, 0xe9a5a9, 0xe9a5aa,
+ /* c0 */ 0xe9a5ab, 0xe9a5ac, 0xe9a5b4, 0xe9a5b7,
+ /* c4 */ 0xe9a5bd, 0xe9a680, 0xe9a684, 0xe9a687,
+ /* c8 */ 0xe9a68a, 0xe9a68d, 0xe9a690, 0xe9a691,
+ /* cc */ 0xe9a693, 0xe9a694, 0xe9a695, 0xe5ba80,
+ /* d0 */ 0xe5ba91, 0xe5ba8b, 0xe5ba96, 0xe5baa5,
+ /* d4 */ 0xe5baa0, 0xe5bab9, 0xe5bab5, 0xe5babe,
+ /* d8 */ 0xe5bab3, 0xe8b593, 0xe5bb92, 0xe5bb91,
+ /* dc */ 0xe5bb9b, 0xe5bba8, 0xe5bbaa, 0xe886ba,
+ /* e0 */ 0xe5bf84, 0xe5bf89, 0xe5bf96, 0xe5bf8f,
+ /* e4 */ 0xe68083, 0xe5bfae, 0xe68084, 0xe5bfa1,
+ /* e8 */ 0xe5bfa4, 0xe5bfbe, 0xe68085, 0xe68086,
+ /* ec */ 0xe5bfaa, 0xe5bfad, 0xe5bfb8, 0xe68099,
+ /* f0 */ 0xe680b5, 0xe680a6, 0xe6809b, 0xe6808f,
+ /* f4 */ 0xe6808d, 0xe680a9, 0xe680ab, 0xe6808a,
+ /* f8 */ 0xe680bf, 0xe680a1, 0xe681b8, 0xe681b9,
+ /* fc */ 0xe681bb, 0xe681ba, 0xe68182,
+
+ /*** Two byte table, leaf: e3xx - offset 0x04a3e ***/
+
+ /* 40 */ 0xe98986, 0xe98987, 0xe98988, 0xe98989,
+ /* 44 */ 0xe9898a, 0xe9898b, 0xe9898c, 0xe9898d,
+ /* 48 */ 0xe9898e, 0xe9898f, 0xe98990, 0xe98991,
+ /* 4c */ 0xe98992, 0xe98993, 0xe98994, 0xe98995,
+ /* 50 */ 0xe98996, 0xe98997, 0xe98998, 0xe98999,
+ /* 54 */ 0xe9899a, 0xe9899b, 0xe9899c, 0xe9899d,
+ /* 58 */ 0xe9899e, 0xe9899f, 0xe989a0, 0xe989a1,
+ /* 5c */ 0xe989a2, 0xe989a3, 0xe989a4, 0xe989a5,
+ /* 60 */ 0xe989a6, 0xe989a7, 0xe989a8, 0xe989a9,
+ /* 64 */ 0xe989aa, 0xe989ab, 0xe989ac, 0xe989ad,
+ /* 68 */ 0xe989ae, 0xe989af, 0xe989b0, 0xe989b1,
+ /* 6c */ 0xe989b2, 0xe989b3, 0xe989b5, 0xe989b6,
+ /* 70 */ 0xe989b7, 0xe989b8, 0xe989b9, 0xe989ba,
+ /* 74 */ 0xe989bb, 0xe989bc, 0xe989bd, 0xe989be,
+ /* 78 */ 0xe989bf, 0xe98a80, 0xe98a81, 0xe98a82,
+ /* 7c */ 0xe98a83, 0xe98a84, 0xe98a85, 0x000000,
+ /* 80 */ 0xe98a86, 0xe98a87, 0xe98a88, 0xe98a89,
+ /* 84 */ 0xe98a8a, 0xe98a8b, 0xe98a8c, 0xe98a8d,
+ /* 88 */ 0xe98a8f, 0xe98a90, 0xe98a91, 0xe98a92,
+ /* 8c */ 0xe98a93, 0xe98a94, 0xe98a95, 0xe98a96,
+ /* 90 */ 0xe98a97, 0xe98a98, 0xe98a99, 0xe98a9a,
+ /* 94 */ 0xe98a9b, 0xe98a9c, 0xe98a9d, 0xe98a9e,
+ /* 98 */ 0xe98a9f, 0xe98aa0, 0xe98aa1, 0xe98aa2,
+ /* 9c */ 0xe98aa3, 0xe98aa4, 0xe98aa5, 0xe98aa6,
+ /* a0 */ 0xe98aa7, 0xe681aa, 0xe681bd, 0xe68296,
+ /* a4 */ 0xe6829a, 0xe682ad, 0xe6829d, 0xe68283,
+ /* a8 */ 0xe68292, 0xe6828c, 0xe6829b, 0xe683ac,
+ /* ac */ 0xe682bb, 0xe682b1, 0xe6839d, 0xe68398,
+ /* b0 */ 0xe68386, 0xe6839a, 0xe682b4, 0xe684a0,
+ /* b4 */ 0xe684a6, 0xe68495, 0xe684a3, 0xe683b4,
+ /* b8 */ 0xe68480, 0xe6848e, 0xe684ab, 0xe6858a,
+ /* bc */ 0xe685b5, 0xe686ac, 0xe68694, 0xe686a7,
+ /* c0 */ 0xe686b7, 0xe68794, 0xe687b5, 0xe5bf9d,
+ /* c4 */ 0xe99ab3, 0xe997a9, 0xe997ab, 0xe997b1,
+ /* c8 */ 0xe997b3, 0xe997b5, 0xe997b6, 0xe997bc,
+ /* cc */ 0xe997be, 0xe99883, 0xe99884, 0xe99886,
+ /* d0 */ 0xe99888, 0xe9988a, 0xe9988b, 0xe9988c,
+ /* d4 */ 0xe9988d, 0xe9988f, 0xe99892, 0xe99895,
+ /* d8 */ 0xe99896, 0xe99897, 0xe99899, 0xe9989a,
+ /* dc */ 0xe4b8ac, 0xe788bf, 0xe68895, 0xe6b0b5,
+ /* e0 */ 0xe6b194, 0xe6b19c, 0xe6b18a, 0xe6b2a3,
+ /* e4 */ 0xe6b285, 0xe6b290, 0xe6b294, 0xe6b28c,
+ /* e8 */ 0xe6b1a8, 0xe6b1a9, 0xe6b1b4, 0xe6b1b6,
+ /* ec */ 0xe6b286, 0xe6b2a9, 0xe6b390, 0xe6b394,
+ /* f0 */ 0xe6b2ad, 0xe6b3b7, 0xe6b3b8, 0xe6b3b1,
+ /* f4 */ 0xe6b397, 0xe6b2b2, 0xe6b3a0, 0xe6b396,
+ /* f8 */ 0xe6b3ba, 0xe6b3ab, 0xe6b3ae, 0xe6b2b1,
+ /* fc */ 0xe6b393, 0xe6b3af, 0xe6b3be,
+
+ /*** Two byte table, leaf: e4xx - offset 0x04afd ***/
+
+ /* 40 */ 0xe98aa8, 0xe98aa9, 0xe98aaa, 0xe98aab,
+ /* 44 */ 0xe98aac, 0xe98aad, 0xe98aaf, 0xe98ab0,
+ /* 48 */ 0xe98ab1, 0xe98ab2, 0xe98ab3, 0xe98ab4,
+ /* 4c */ 0xe98ab5, 0xe98ab6, 0xe98ab7, 0xe98ab8,
+ /* 50 */ 0xe98ab9, 0xe98aba, 0xe98abb, 0xe98abc,
+ /* 54 */ 0xe98abd, 0xe98abe, 0xe98abf, 0xe98b80,
+ /* 58 */ 0xe98b81, 0xe98b82, 0xe98b83, 0xe98b84,
+ /* 5c */ 0xe98b85, 0xe98b86, 0xe98b87, 0xe98b89,
+ /* 60 */ 0xe98b8a, 0xe98b8b, 0xe98b8c, 0xe98b8d,
+ /* 64 */ 0xe98b8e, 0xe98b8f, 0xe98b90, 0xe98b91,
+ /* 68 */ 0xe98b92, 0xe98b93, 0xe98b94, 0xe98b95,
+ /* 6c */ 0xe98b96, 0xe98b97, 0xe98b98, 0xe98b99,
+ /* 70 */ 0xe98b9a, 0xe98b9b, 0xe98b9c, 0xe98b9d,
+ /* 74 */ 0xe98b9e, 0xe98b9f, 0xe98ba0, 0xe98ba1,
+ /* 78 */ 0xe98ba2, 0xe98ba3, 0xe98ba4, 0xe98ba5,
+ /* 7c */ 0xe98ba6, 0xe98ba7, 0xe98ba8, 0x000000,
+ /* 80 */ 0xe98ba9, 0xe98baa, 0xe98bab, 0xe98bac,
+ /* 84 */ 0xe98bad, 0xe98bae, 0xe98baf, 0xe98bb0,
+ /* 88 */ 0xe98bb1, 0xe98bb2, 0xe98bb3, 0xe98bb4,
+ /* 8c */ 0xe98bb5, 0xe98bb6, 0xe98bb7, 0xe98bb8,
+ /* 90 */ 0xe98bb9, 0xe98bba, 0xe98bbb, 0xe98bbc,
+ /* 94 */ 0xe98bbd, 0xe98bbe, 0xe98bbf, 0xe98c80,
+ /* 98 */ 0xe98c81, 0xe98c82, 0xe98c83, 0xe98c84,
+ /* 9c */ 0xe98c85, 0xe98c86, 0xe98c87, 0xe98c88,
+ /* a0 */ 0xe98c89, 0xe6b4b9, 0xe6b4a7, 0xe6b48c,
+ /* a4 */ 0xe6b583, 0xe6b588, 0xe6b487, 0xe6b484,
+ /* a8 */ 0xe6b499, 0xe6b48e, 0xe6b4ab, 0xe6b58d,
+ /* ac */ 0xe6b4ae, 0xe6b4b5, 0xe6b49a, 0xe6b58f,
+ /* b0 */ 0xe6b592, 0xe6b594, 0xe6b4b3, 0xe6b691,
+ /* b4 */ 0xe6b5af, 0xe6b69e, 0xe6b6a0, 0xe6b59e,
+ /* b8 */ 0xe6b693, 0xe6b694, 0xe6b59c, 0xe6b5a0,
+ /* bc */ 0xe6b5bc, 0xe6b5a3, 0xe6b89a, 0xe6b787,
+ /* c0 */ 0xe6b785, 0xe6b79e, 0xe6b88e, 0xe6b6bf,
+ /* c4 */ 0xe6b7a0, 0xe6b891, 0xe6b7a6, 0xe6b79d,
+ /* c8 */ 0xe6b799, 0xe6b896, 0xe6b6ab, 0xe6b88c,
+ /* cc */ 0xe6b6ae, 0xe6b8ab, 0xe6b9ae, 0xe6b98e,
+ /* d0 */ 0xe6b9ab, 0xe6bab2, 0xe6b99f, 0xe6ba86,
+ /* d4 */ 0xe6b993, 0xe6b994, 0xe6b8b2, 0xe6b8a5,
+ /* d8 */ 0xe6b984, 0xe6bb9f, 0xe6bab1, 0xe6ba98,
+ /* dc */ 0xe6bba0, 0xe6bcad, 0xe6bba2, 0xe6baa5,
+ /* e0 */ 0xe6baa7, 0xe6babd, 0xe6babb, 0xe6bab7,
+ /* e4 */ 0xe6bb97, 0xe6bab4, 0xe6bb8f, 0xe6ba8f,
+ /* e8 */ 0xe6bb82, 0xe6ba9f, 0xe6bda2, 0xe6bd86,
+ /* ec */ 0xe6bd87, 0xe6bca4, 0xe6bc95, 0xe6bbb9,
+ /* f0 */ 0xe6bcaf, 0xe6bcb6, 0xe6bd8b, 0xe6bdb4,
+ /* f4 */ 0xe6bcaa, 0xe6bc89, 0xe6bca9, 0xe6be89,
+ /* f8 */ 0xe6be8d, 0xe6be8c, 0xe6bdb8, 0xe6bdb2,
+ /* fc */ 0xe6bdbc, 0xe6bdba, 0xe6bf91,
+
+ /*** Two byte table, leaf: e5xx - offset 0x04bbc ***/
+
+ /* 40 */ 0xe98c8a, 0xe98c8b, 0xe98c8c, 0xe98c8d,
+ /* 44 */ 0xe98c8e, 0xe98c8f, 0xe98c90, 0xe98c91,
+ /* 48 */ 0xe98c92, 0xe98c93, 0xe98c94, 0xe98c95,
+ /* 4c */ 0xe98c96, 0xe98c97, 0xe98c98, 0xe98c99,
+ /* 50 */ 0xe98c9a, 0xe98c9b, 0xe98c9c, 0xe98c9d,
+ /* 54 */ 0xe98c9e, 0xe98c9f, 0xe98ca0, 0xe98ca1,
+ /* 58 */ 0xe98ca2, 0xe98ca3, 0xe98ca4, 0xe98ca5,
+ /* 5c */ 0xe98ca6, 0xe98ca7, 0xe98ca8, 0xe98ca9,
+ /* 60 */ 0xe98caa, 0xe98cab, 0xe98cac, 0xe98cad,
+ /* 64 */ 0xe98cae, 0xe98caf, 0xe98cb0, 0xe98cb1,
+ /* 68 */ 0xe98cb2, 0xe98cb3, 0xe98cb4, 0xe98cb5,
+ /* 6c */ 0xe98cb6, 0xe98cb7, 0xe98cb8, 0xe98cb9,
+ /* 70 */ 0xe98cba, 0xe98cbb, 0xe98cbc, 0xe98cbd,
+ /* 74 */ 0xe98cbf, 0xe98d80, 0xe98d81, 0xe98d82,
+ /* 78 */ 0xe98d83, 0xe98d84, 0xe98d85, 0xe98d86,
+ /* 7c */ 0xe98d87, 0xe98d88, 0xe98d89, 0x000000,
+ /* 80 */ 0xe98d8a, 0xe98d8b, 0xe98d8c, 0xe98d8d,
+ /* 84 */ 0xe98d8e, 0xe98d8f, 0xe98d90, 0xe98d91,
+ /* 88 */ 0xe98d92, 0xe98d93, 0xe98d94, 0xe98d95,
+ /* 8c */ 0xe98d96, 0xe98d97, 0xe98d98, 0xe98d99,
+ /* 90 */ 0xe98d9a, 0xe98d9b, 0xe98d9c, 0xe98d9d,
+ /* 94 */ 0xe98d9e, 0xe98d9f, 0xe98da0, 0xe98da1,
+ /* 98 */ 0xe98da2, 0xe98da3, 0xe98da4, 0xe98da5,
+ /* 9c */ 0xe98da6, 0xe98da7, 0xe98da8, 0xe98da9,
+ /* a0 */ 0xe98dab, 0xe6bf89, 0xe6bea7, 0xe6beb9,
+ /* a4 */ 0xe6beb6, 0xe6bf82, 0xe6bfa1, 0xe6bfae,
+ /* a8 */ 0xe6bf9e, 0xe6bfa0, 0xe6bfaf, 0xe7809a,
+ /* ac */ 0xe780a3, 0xe7809b, 0xe780b9, 0xe780b5,
+ /* b0 */ 0xe7818f, 0xe7819e, 0xe5ae80, 0xe5ae84,
+ /* b4 */ 0xe5ae95, 0xe5ae93, 0xe5aea5, 0xe5aeb8,
+ /* b8 */ 0xe794af, 0xe9aa9e, 0xe690b4, 0xe5afa4,
+ /* bc */ 0xe5afae, 0xe8a4b0, 0xe5afb0, 0xe8b987,
+ /* c0 */ 0xe8ac87, 0xe8beb6, 0xe8bf93, 0xe8bf95,
+ /* c4 */ 0xe8bfa5, 0xe8bfae, 0xe8bfa4, 0xe8bfa9,
+ /* c8 */ 0xe8bfa6, 0xe8bfb3, 0xe8bfa8, 0xe98085,
+ /* cc */ 0xe98084, 0xe9808b, 0xe980a6, 0xe98091,
+ /* d0 */ 0xe9808d, 0xe98096, 0xe980a1, 0xe980b5,
+ /* d4 */ 0xe980b6, 0xe980ad, 0xe980af, 0xe98184,
+ /* d8 */ 0xe98191, 0xe98192, 0xe98190, 0xe981a8,
+ /* dc */ 0xe98198, 0xe981a2, 0xe9819b, 0xe69ab9,
+ /* e0 */ 0xe981b4, 0xe981bd, 0xe98282, 0xe98288,
+ /* e4 */ 0xe98283, 0xe9828b, 0xe5bd90, 0xe5bd97,
+ /* e8 */ 0xe5bd96, 0xe5bd98, 0xe5b0bb, 0xe592ab,
+ /* ec */ 0xe5b190, 0xe5b199, 0xe5adb1, 0xe5b1a3,
+ /* f0 */ 0xe5b1a6, 0xe7bebc, 0xe5bcaa, 0xe5bca9,
+ /* f4 */ 0xe5bcad, 0xe889b4, 0xe5bcbc, 0xe9acbb,
+ /* f8 */ 0xe5b1ae, 0xe5a681, 0xe5a683, 0xe5a68d,
+ /* fc */ 0xe5a6a9, 0xe5a6aa, 0xe5a6a3,
+
+ /*** Two byte table, leaf: e6xx - offset 0x04c7b ***/
+
+ /* 40 */ 0xe98dac, 0xe98dad, 0xe98dae, 0xe98daf,
+ /* 44 */ 0xe98db0, 0xe98db1, 0xe98db2, 0xe98db3,
+ /* 48 */ 0xe98db4, 0xe98db5, 0xe98db6, 0xe98db7,
+ /* 4c */ 0xe98db8, 0xe98db9, 0xe98dba, 0xe98dbb,
+ /* 50 */ 0xe98dbc, 0xe98dbd, 0xe98dbe, 0xe98dbf,
+ /* 54 */ 0xe98e80, 0xe98e81, 0xe98e82, 0xe98e83,
+ /* 58 */ 0xe98e84, 0xe98e85, 0xe98e86, 0xe98e87,
+ /* 5c */ 0xe98e88, 0xe98e89, 0xe98e8a, 0xe98e8b,
+ /* 60 */ 0xe98e8c, 0xe98e8d, 0xe98e8e, 0xe98e90,
+ /* 64 */ 0xe98e91, 0xe98e92, 0xe98e93, 0xe98e94,
+ /* 68 */ 0xe98e95, 0xe98e96, 0xe98e97, 0xe98e98,
+ /* 6c */ 0xe98e99, 0xe98e9a, 0xe98e9b, 0xe98e9c,
+ /* 70 */ 0xe98e9d, 0xe98e9e, 0xe98e9f, 0xe98ea0,
+ /* 74 */ 0xe98ea1, 0xe98ea2, 0xe98ea3, 0xe98ea4,
+ /* 78 */ 0xe98ea5, 0xe98ea6, 0xe98ea7, 0xe98ea8,
+ /* 7c */ 0xe98ea9, 0xe98eaa, 0xe98eab, 0x000000,
+ /* 80 */ 0xe98eac, 0xe98ead, 0xe98eae, 0xe98eaf,
+ /* 84 */ 0xe98eb0, 0xe98eb1, 0xe98eb2, 0xe98eb3,
+ /* 88 */ 0xe98eb4, 0xe98eb5, 0xe98eb6, 0xe98eb7,
+ /* 8c */ 0xe98eb8, 0xe98eb9, 0xe98eba, 0xe98ebb,
+ /* 90 */ 0xe98ebc, 0xe98ebd, 0xe98ebe, 0xe98ebf,
+ /* 94 */ 0xe98f80, 0xe98f81, 0xe98f82, 0xe98f83,
+ /* 98 */ 0xe98f84, 0xe98f85, 0xe98f86, 0xe98f87,
+ /* 9c */ 0xe98f88, 0xe98f89, 0xe98f8b, 0xe98f8c,
+ /* a0 */ 0xe98f8d, 0xe5a697, 0xe5a78a, 0xe5a6ab,
+ /* a4 */ 0xe5a69e, 0xe5a6a4, 0xe5a792, 0xe5a6b2,
+ /* a8 */ 0xe5a6af, 0xe5a797, 0xe5a6be, 0xe5a885,
+ /* ac */ 0xe5a886, 0xe5a79d, 0xe5a888, 0xe5a7a3,
+ /* b0 */ 0xe5a798, 0xe5a7b9, 0xe5a88c, 0xe5a889,
+ /* b4 */ 0xe5a8b2, 0xe5a8b4, 0xe5a891, 0xe5a8a3,
+ /* b8 */ 0xe5a893, 0xe5a980, 0xe5a9a7, 0xe5a98a,
+ /* bc */ 0xe5a995, 0xe5a8bc, 0xe5a9a2, 0xe5a9b5,
+ /* c0 */ 0xe883ac, 0xe5aaaa, 0xe5aa9b, 0xe5a9b7,
+ /* c4 */ 0xe5a9ba, 0xe5aabe, 0xe5abab, 0xe5aab2,
+ /* c8 */ 0xe5ab92, 0xe5ab94, 0xe5aab8, 0xe5aba0,
+ /* cc */ 0xe5aba3, 0xe5abb1, 0xe5ab96, 0xe5aba6,
+ /* d0 */ 0xe5ab98, 0xe5ab9c, 0xe5ac89, 0xe5ac97,
+ /* d4 */ 0xe5ac96, 0xe5acb2, 0xe5acb7, 0xe5ad80,
+ /* d8 */ 0xe5b095, 0xe5b09c, 0xe5ad9a, 0xe5ada5,
+ /* dc */ 0xe5adb3, 0xe5ad91, 0xe5ad93, 0xe5ada2,
+ /* e0 */ 0xe9a9b5, 0xe9a9b7, 0xe9a9b8, 0xe9a9ba,
+ /* e4 */ 0xe9a9bf, 0xe9a9bd, 0xe9aa80, 0xe9aa81,
+ /* e8 */ 0xe9aa85, 0xe9aa88, 0xe9aa8a, 0xe9aa90,
+ /* ec */ 0xe9aa92, 0xe9aa93, 0xe9aa96, 0xe9aa98,
+ /* f0 */ 0xe9aa9b, 0xe9aa9c, 0xe9aa9d, 0xe9aa9f,
+ /* f4 */ 0xe9aaa0, 0xe9aaa2, 0xe9aaa3, 0xe9aaa5,
+ /* f8 */ 0xe9aaa7, 0xe7ba9f, 0xe7baa1, 0xe7baa3,
+ /* fc */ 0xe7baa5, 0xe7baa8, 0xe7baa9,
+
+ /*** Two byte table, leaf: e7xx - offset 0x04d3a ***/
+
+ /* 40 */ 0xe98f8e, 0xe98f8f, 0xe98f90, 0xe98f91,
+ /* 44 */ 0xe98f92, 0xe98f93, 0xe98f94, 0xe98f95,
+ /* 48 */ 0xe98f97, 0xe98f98, 0xe98f99, 0xe98f9a,
+ /* 4c */ 0xe98f9b, 0xe98f9c, 0xe98f9d, 0xe98f9e,
+ /* 50 */ 0xe98f9f, 0xe98fa0, 0xe98fa1, 0xe98fa2,
+ /* 54 */ 0xe98fa3, 0xe98fa4, 0xe98fa5, 0xe98fa6,
+ /* 58 */ 0xe98fa7, 0xe98fa8, 0xe98fa9, 0xe98faa,
+ /* 5c */ 0xe98fab, 0xe98fac, 0xe98fad, 0xe98fae,
+ /* 60 */ 0xe98faf, 0xe98fb0, 0xe98fb1, 0xe98fb2,
+ /* 64 */ 0xe98fb3, 0xe98fb4, 0xe98fb5, 0xe98fb6,
+ /* 68 */ 0xe98fb7, 0xe98fb8, 0xe98fb9, 0xe98fba,
+ /* 6c */ 0xe98fbb, 0xe98fbc, 0xe98fbd, 0xe98fbe,
+ /* 70 */ 0xe98fbf, 0xe99080, 0xe99081, 0xe99082,
+ /* 74 */ 0xe99083, 0xe99084, 0xe99085, 0xe99086,
+ /* 78 */ 0xe99087, 0xe99088, 0xe99089, 0xe9908a,
+ /* 7c */ 0xe9908b, 0xe9908c, 0xe9908d, 0x000000,
+ /* 80 */ 0xe9908e, 0xe9908f, 0xe99090, 0xe99091,
+ /* 84 */ 0xe99092, 0xe99093, 0xe99094, 0xe99095,
+ /* 88 */ 0xe99096, 0xe99097, 0xe99098, 0xe99099,
+ /* 8c */ 0xe9909a, 0xe9909b, 0xe9909c, 0xe9909d,
+ /* 90 */ 0xe9909e, 0xe9909f, 0xe990a0, 0xe990a1,
+ /* 94 */ 0xe990a2, 0xe990a3, 0xe990a4, 0xe990a5,
+ /* 98 */ 0xe990a6, 0xe990a7, 0xe990a8, 0xe990a9,
+ /* 9c */ 0xe990aa, 0xe990ab, 0xe990ac, 0xe990ad,
+ /* a0 */ 0xe990ae, 0xe7baad, 0xe7bab0, 0xe7babe,
+ /* a4 */ 0xe7bb80, 0xe7bb81, 0xe7bb82, 0xe7bb89,
+ /* a8 */ 0xe7bb8b, 0xe7bb8c, 0xe7bb90, 0xe7bb94,
+ /* ac */ 0xe7bb97, 0xe7bb9b, 0xe7bba0, 0xe7bba1,
+ /* b0 */ 0xe7bba8, 0xe7bbab, 0xe7bbae, 0xe7bbaf,
+ /* b4 */ 0xe7bbb1, 0xe7bbb2, 0xe7bc8d, 0xe7bbb6,
+ /* b8 */ 0xe7bbba, 0xe7bbbb, 0xe7bbbe, 0xe7bc81,
+ /* bc */ 0xe7bc82, 0xe7bc83, 0xe7bc87, 0xe7bc88,
+ /* c0 */ 0xe7bc8b, 0xe7bc8c, 0xe7bc8f, 0xe7bc91,
+ /* c4 */ 0xe7bc92, 0xe7bc97, 0xe7bc99, 0xe7bc9c,
+ /* c8 */ 0xe7bc9b, 0xe7bc9f, 0xe7bca1, 0xe7bca2,
+ /* cc */ 0xe7bca3, 0xe7bca4, 0xe7bca5, 0xe7bca6,
+ /* d0 */ 0xe7bca7, 0xe7bcaa, 0xe7bcab, 0xe7bcac,
+ /* d4 */ 0xe7bcad, 0xe7bcaf, 0xe7bcb0, 0xe7bcb1,
+ /* d8 */ 0xe7bcb2, 0xe7bcb3, 0xe7bcb5, 0xe5b9ba,
+ /* dc */ 0xe795bf, 0xe5b79b, 0xe794be, 0xe98295,
+ /* e0 */ 0xe78e8e, 0xe78e91, 0xe78eae, 0xe78ea2,
+ /* e4 */ 0xe78e9f, 0xe78f8f, 0xe78f82, 0xe78f91,
+ /* e8 */ 0xe78eb7, 0xe78eb3, 0xe78f80, 0xe78f89,
+ /* ec */ 0xe78f88, 0xe78fa5, 0xe78f99, 0xe9a1bc,
+ /* f0 */ 0xe7908a, 0xe78fa9, 0xe78fa7, 0xe78f9e,
+ /* f4 */ 0xe78eba, 0xe78fb2, 0xe7908f, 0xe790aa,
+ /* f8 */ 0xe7919b, 0xe790a6, 0xe790a5, 0xe790a8,
+ /* fc */ 0xe790b0, 0xe790ae, 0xe790ac,
+
+ /*** Two byte table, leaf: e8xx - offset 0x04df9 ***/
+
+ /* 40 */ 0xe990af, 0xe990b0, 0xe990b1, 0xe990b2,
+ /* 44 */ 0xe990b3, 0xe990b4, 0xe990b5, 0xe990b6,
+ /* 48 */ 0xe990b7, 0xe990b8, 0xe990b9, 0xe990ba,
+ /* 4c */ 0xe990bb, 0xe990bc, 0xe990bd, 0xe990bf,
+ /* 50 */ 0xe99180, 0xe99181, 0xe99182, 0xe99183,
+ /* 54 */ 0xe99184, 0xe99185, 0xe99186, 0xe99187,
+ /* 58 */ 0xe99188, 0xe99189, 0xe9918a, 0xe9918b,
+ /* 5c */ 0xe9918c, 0xe9918d, 0xe9918e, 0xe9918f,
+ /* 60 */ 0xe99190, 0xe99191, 0xe99192, 0xe99193,
+ /* 64 */ 0xe99194, 0xe99195, 0xe99196, 0xe99197,
+ /* 68 */ 0xe99198, 0xe99199, 0xe9919a, 0xe9919b,
+ /* 6c */ 0xe9919c, 0xe9919d, 0xe9919e, 0xe9919f,
+ /* 70 */ 0xe991a0, 0xe991a1, 0xe991a2, 0xe991a3,
+ /* 74 */ 0xe991a4, 0xe991a5, 0xe991a6, 0xe991a7,
+ /* 78 */ 0xe991a8, 0xe991a9, 0xe991aa, 0xe991ac,
+ /* 7c */ 0xe991ad, 0xe991ae, 0xe991af, 0x000000,
+ /* 80 */ 0xe991b0, 0xe991b1, 0xe991b2, 0xe991b3,
+ /* 84 */ 0xe991b4, 0xe991b5, 0xe991b6, 0xe991b7,
+ /* 88 */ 0xe991b8, 0xe991b9, 0xe991ba, 0xe991bb,
+ /* 8c */ 0xe991bc, 0xe991bd, 0xe991be, 0xe991bf,
+ /* 90 */ 0xe99280, 0xe99281, 0xe99282, 0xe99283,
+ /* 94 */ 0xe99284, 0xe99291, 0xe99296, 0xe99298,
+ /* 98 */ 0xe99387, 0xe9938f, 0xe99393, 0xe99394,
+ /* 9c */ 0xe9939a, 0xe993a6, 0xe993bb, 0xe9949c,
+ /* a0 */ 0xe994a0, 0xe7909b, 0xe7909a, 0xe79181,
+ /* a4 */ 0xe7919c, 0xe79197, 0xe79195, 0xe79199,
+ /* a8 */ 0xe791b7, 0xe791ad, 0xe791be, 0xe7929c,
+ /* ac */ 0xe7928e, 0xe79280, 0xe79281, 0xe79287,
+ /* b0 */ 0xe7928b, 0xe7929e, 0xe792a8, 0xe792a9,
+ /* b4 */ 0xe79290, 0xe792a7, 0xe79392, 0xe792ba,
+ /* b8 */ 0xe99faa, 0xe99fab, 0xe99fac, 0xe69d8c,
+ /* bc */ 0xe69d93, 0xe69d9e, 0xe69d88, 0xe69da9,
+ /* c0 */ 0xe69ea5, 0xe69e87, 0xe69daa, 0xe69db3,
+ /* c4 */ 0xe69e98, 0xe69ea7, 0xe69db5, 0xe69ea8,
+ /* c8 */ 0xe69e9e, 0xe69ead, 0xe69e8b, 0xe69db7,
+ /* cc */ 0xe69dbc, 0xe69fb0, 0xe6a089, 0xe69f98,
+ /* d0 */ 0xe6a08a, 0xe69fa9, 0xe69eb0, 0xe6a08c,
+ /* d4 */ 0xe69f99, 0xe69eb5, 0xe69f9a, 0xe69eb3,
+ /* d8 */ 0xe69f9d, 0xe6a080, 0xe69f83, 0xe69eb8,
+ /* dc */ 0xe69fa2, 0xe6a08e, 0xe69f81, 0xe69fbd,
+ /* e0 */ 0xe6a0b2, 0xe6a0b3, 0xe6a1a0, 0xe6a1a1,
+ /* e4 */ 0xe6a18e, 0xe6a1a2, 0xe6a184, 0xe6a1a4,
+ /* e8 */ 0xe6a283, 0xe6a09d, 0xe6a195, 0xe6a1a6,
+ /* ec */ 0xe6a181, 0xe6a1a7, 0xe6a180, 0xe6a0be,
+ /* f0 */ 0xe6a18a, 0xe6a189, 0xe6a0a9, 0xe6a2b5,
+ /* f4 */ 0xe6a28f, 0xe6a1b4, 0xe6a1b7, 0xe6a293,
+ /* f8 */ 0xe6a1ab, 0xe6a382, 0xe6a5ae, 0xe6a3bc,
+ /* fc */ 0xe6a49f, 0xe6a4a0, 0xe6a3b9,
+
+ /*** Two byte table, leaf: e9xx - offset 0x04eb8 ***/
+
+ /* 40 */ 0xe994a7, 0xe994b3, 0xe994bd, 0xe99583,
+ /* 44 */ 0xe99588, 0xe9958b, 0xe99595, 0xe9959a,
+ /* 48 */ 0xe995a0, 0xe995ae, 0xe995b4, 0xe995b5,
+ /* 4c */ 0xe995b7, 0xe995b8, 0xe995b9, 0xe995ba,
+ /* 50 */ 0xe995bb, 0xe995bc, 0xe995bd, 0xe995be,
+ /* 54 */ 0xe99680, 0xe99681, 0xe99682, 0xe99683,
+ /* 58 */ 0xe99684, 0xe99685, 0xe99686, 0xe99687,
+ /* 5c */ 0xe99688, 0xe99689, 0xe9968a, 0xe9968b,
+ /* 60 */ 0xe9968c, 0xe9968d, 0xe9968e, 0xe9968f,
+ /* 64 */ 0xe99690, 0xe99691, 0xe99692, 0xe99693,
+ /* 68 */ 0xe99694, 0xe99695, 0xe99696, 0xe99697,
+ /* 6c */ 0xe99698, 0xe99699, 0xe9969a, 0xe9969b,
+ /* 70 */ 0xe9969c, 0xe9969d, 0xe9969e, 0xe9969f,
+ /* 74 */ 0xe996a0, 0xe996a1, 0xe996a2, 0xe996a3,
+ /* 78 */ 0xe996a4, 0xe996a5, 0xe996a6, 0xe996a7,
+ /* 7c */ 0xe996a8, 0xe996a9, 0xe996aa, 0x000000,
+ /* 80 */ 0xe996ab, 0xe996ac, 0xe996ad, 0xe996ae,
+ /* 84 */ 0xe996af, 0xe996b0, 0xe996b1, 0xe996b2,
+ /* 88 */ 0xe996b3, 0xe996b4, 0xe996b5, 0xe996b6,
+ /* 8c */ 0xe996b7, 0xe996b8, 0xe996b9, 0xe996ba,
+ /* 90 */ 0xe996bb, 0xe996bc, 0xe996bd, 0xe996be,
+ /* 94 */ 0xe996bf, 0xe99780, 0xe99781, 0xe99782,
+ /* 98 */ 0xe99783, 0xe99784, 0xe99785, 0xe99786,
+ /* 9c */ 0xe99787, 0xe99788, 0xe99789, 0xe9978a,
+ /* a0 */ 0xe9978b, 0xe6a4a4, 0xe6a3b0, 0xe6a48b,
+ /* a4 */ 0xe6a481, 0xe6a597, 0xe6a3a3, 0xe6a490,
+ /* a8 */ 0xe6a5b1, 0xe6a4b9, 0xe6a5a0, 0xe6a582,
+ /* ac */ 0xe6a59d, 0xe6a684, 0xe6a5ab, 0xe6a680,
+ /* b0 */ 0xe6a698, 0xe6a5b8, 0xe6a4b4, 0xe6a78c,
+ /* b4 */ 0xe6a687, 0xe6a688, 0xe6a78e, 0xe6a689,
+ /* b8 */ 0xe6a5a6, 0xe6a5a3, 0xe6a5b9, 0xe6a69b,
+ /* bc */ 0xe6a6a7, 0xe6a6bb, 0xe6a6ab, 0xe6a6ad,
+ /* c0 */ 0xe6a794, 0xe6a6b1, 0xe6a781, 0xe6a78a,
+ /* c4 */ 0xe6a79f, 0xe6a695, 0xe6a7a0, 0xe6a68d,
+ /* c8 */ 0xe6a7bf, 0xe6a8af, 0xe6a7ad, 0xe6a897,
+ /* cc */ 0xe6a898, 0xe6a9a5, 0xe6a7b2, 0xe6a984,
+ /* d0 */ 0xe6a8be, 0xe6aaa0, 0xe6a990, 0xe6a99b,
+ /* d4 */ 0xe6a8b5, 0xe6aa8e, 0xe6a9b9, 0xe6a8bd,
+ /* d8 */ 0xe6a8a8, 0xe6a998, 0xe6a9bc, 0xe6aa91,
+ /* dc */ 0xe6aa90, 0xe6aaa9, 0xe6aa97, 0xe6aaab,
+ /* e0 */ 0xe78cb7, 0xe78d92, 0xe6ae81, 0xe6ae82,
+ /* e4 */ 0xe6ae87, 0xe6ae84, 0xe6ae92, 0xe6ae93,
+ /* e8 */ 0xe6ae8d, 0xe6ae9a, 0xe6ae9b, 0xe6aea1,
+ /* ec */ 0xe6aeaa, 0xe8bdab, 0xe8bdad, 0xe8bdb1,
+ /* f0 */ 0xe8bdb2, 0xe8bdb3, 0xe8bdb5, 0xe8bdb6,
+ /* f4 */ 0xe8bdb8, 0xe8bdb7, 0xe8bdb9, 0xe8bdba,
+ /* f8 */ 0xe8bdbc, 0xe8bdbe, 0xe8be81, 0xe8be82,
+ /* fc */ 0xe8be84, 0xe8be87, 0xe8be8b,
+
+ /*** Two byte table, leaf: eaxx - offset 0x04f77 ***/
+
+ /* 40 */ 0xe9978c, 0xe9978d, 0xe9978e, 0xe9978f,
+ /* 44 */ 0xe99790, 0xe99791, 0xe99792, 0xe99793,
+ /* 48 */ 0xe99794, 0xe99795, 0xe99796, 0xe99797,
+ /* 4c */ 0xe99798, 0xe99799, 0xe9979a, 0xe9979b,
+ /* 50 */ 0xe9979c, 0xe9979d, 0xe9979e, 0xe9979f,
+ /* 54 */ 0xe997a0, 0xe997a1, 0xe997a2, 0xe997a3,
+ /* 58 */ 0xe997a4, 0xe997a5, 0xe997a6, 0xe997a7,
+ /* 5c */ 0xe997ac, 0xe997bf, 0xe99887, 0xe99893,
+ /* 60 */ 0xe99898, 0xe9989b, 0xe9989e, 0xe998a0,
+ /* 64 */ 0xe998a3, 0xe998a4, 0xe998a5, 0xe998a6,
+ /* 68 */ 0xe998a7, 0xe998a8, 0xe998a9, 0xe998ab,
+ /* 6c */ 0xe998ac, 0xe998ad, 0xe998af, 0xe998b0,
+ /* 70 */ 0xe998b7, 0xe998b8, 0xe998b9, 0xe998ba,
+ /* 74 */ 0xe998be, 0xe99981, 0xe99983, 0xe9998a,
+ /* 78 */ 0xe9998e, 0xe9998f, 0xe99991, 0xe99992,
+ /* 7c */ 0xe99993, 0xe99996, 0xe99997, 0x000000,
+ /* 80 */ 0xe99998, 0xe99999, 0xe9999a, 0xe9999c,
+ /* 84 */ 0xe9999d, 0xe9999e, 0xe999a0, 0xe999a3,
+ /* 88 */ 0xe999a5, 0xe999a6, 0xe999ab, 0xe999ad,
+ /* 8c */ 0xe999ae, 0xe999af, 0xe999b0, 0xe999b1,
+ /* 90 */ 0xe999b3, 0xe999b8, 0xe999b9, 0xe999ba,
+ /* 94 */ 0xe999bb, 0xe999bc, 0xe999bd, 0xe999be,
+ /* 98 */ 0xe999bf, 0xe99a80, 0xe99a81, 0xe99a82,
+ /* 9c */ 0xe99a83, 0xe99a84, 0xe99a87, 0xe99a89,
+ /* a0 */ 0xe99a8a, 0xe8be8d, 0xe8be8e, 0xe8be8f,
+ /* a4 */ 0xe8be98, 0xe8be9a, 0xe8bb8e, 0xe6888b,
+ /* a8 */ 0xe68897, 0xe6889b, 0xe6889f, 0xe688a2,
+ /* ac */ 0xe688a1, 0xe688a5, 0xe688a4, 0xe688ac,
+ /* b0 */ 0xe887a7, 0xe793af, 0xe793b4, 0xe793bf,
+ /* b4 */ 0xe7948f, 0xe79491, 0xe79493, 0xe694b4,
+ /* b8 */ 0xe697ae, 0xe697af, 0xe697b0, 0xe6988a,
+ /* bc */ 0xe69899, 0xe69db2, 0xe69883, 0xe69895,
+ /* c0 */ 0xe69880, 0xe78285, 0xe69bb7, 0xe6989d,
+ /* c4 */ 0xe698b4, 0xe698b1, 0xe698b6, 0xe698b5,
+ /* c8 */ 0xe88086, 0xe6999f, 0xe69994, 0xe69981,
+ /* cc */ 0xe6998f, 0xe69996, 0xe699a1, 0xe69997,
+ /* d0 */ 0xe699b7, 0xe69a84, 0xe69a8c, 0xe69aa7,
+ /* d4 */ 0xe69a9d, 0xe69abe, 0xe69b9b, 0xe69b9c,
+ /* d8 */ 0xe69ba6, 0xe69ba9, 0xe8b4b2, 0xe8b4b3,
+ /* dc */ 0xe8b4b6, 0xe8b4bb, 0xe8b4bd, 0xe8b580,
+ /* e0 */ 0xe8b585, 0xe8b586, 0xe8b588, 0xe8b589,
+ /* e4 */ 0xe8b587, 0xe8b58d, 0xe8b595, 0xe8b599,
+ /* e8 */ 0xe8a787, 0xe8a78a, 0xe8a78b, 0xe8a78c,
+ /* ec */ 0xe8a78e, 0xe8a78f, 0xe8a790, 0xe8a791,
+ /* f0 */ 0xe789ae, 0xe78a9f, 0xe7899d, 0xe789a6,
+ /* f4 */ 0xe789af, 0xe789be, 0xe789bf, 0xe78a84,
+ /* f8 */ 0xe78a8b, 0xe78a8d, 0xe78a8f, 0xe78a92,
+ /* fc */ 0xe68c88, 0xe68cb2, 0xe68eb0,
+
+ /*** Two byte table, leaf: ebxx - offset 0x05036 ***/
+
+ /* 40 */ 0xe99a8c, 0xe99a8e, 0xe99a91, 0xe99a92,
+ /* 44 */ 0xe99a93, 0xe99a95, 0xe99a96, 0xe99a9a,
+ /* 48 */ 0xe99a9b, 0xe99a9d, 0xe99a9e, 0xe99a9f,
+ /* 4c */ 0xe99aa0, 0xe99aa1, 0xe99aa2, 0xe99aa3,
+ /* 50 */ 0xe99aa4, 0xe99aa5, 0xe99aa6, 0xe99aa8,
+ /* 54 */ 0xe99aa9, 0xe99aaa, 0xe99aab, 0xe99aac,
+ /* 58 */ 0xe99aad, 0xe99aae, 0xe99aaf, 0xe99ab1,
+ /* 5c */ 0xe99ab2, 0xe99ab4, 0xe99ab5, 0xe99ab7,
+ /* 60 */ 0xe99ab8, 0xe99aba, 0xe99abb, 0xe99abf,
+ /* 64 */ 0xe99b82, 0xe99b83, 0xe99b88, 0xe99b8a,
+ /* 68 */ 0xe99b8b, 0xe99b90, 0xe99b91, 0xe99b93,
+ /* 6c */ 0xe99b94, 0xe99b96, 0xe99b97, 0xe99b98,
+ /* 70 */ 0xe99b99, 0xe99b9a, 0xe99b9b, 0xe99b9c,
+ /* 74 */ 0xe99b9d, 0xe99b9e, 0xe99b9f, 0xe99ba1,
+ /* 78 */ 0xe99ba2, 0xe99ba3, 0xe99ba4, 0xe99ba5,
+ /* 7c */ 0xe99ba6, 0xe99ba7, 0xe99bab, 0x000000,
+ /* 80 */ 0xe99bac, 0xe99bad, 0xe99bae, 0xe99bb0,
+ /* 84 */ 0xe99bb1, 0xe99bb2, 0xe99bb4, 0xe99bb5,
+ /* 88 */ 0xe99bb8, 0xe99bba, 0xe99bbb, 0xe99bbc,
+ /* 8c */ 0xe99bbd, 0xe99bbf, 0xe99c82, 0xe99c83,
+ /* 90 */ 0xe99c85, 0xe99c8a, 0xe99c8b, 0xe99c8c,
+ /* 94 */ 0xe99c90, 0xe99c91, 0xe99c92, 0xe99c94,
+ /* 98 */ 0xe99c95, 0xe99c97, 0xe99c98, 0xe99c99,
+ /* 9c */ 0xe99c9a, 0xe99c9b, 0xe99c9d, 0xe99c9f,
+ /* a0 */ 0xe99ca0, 0xe690bf, 0xe69398, 0xe88084,
+ /* a4 */ 0xe6afaa, 0xe6afb3, 0xe6afbd, 0xe6afb5,
+ /* a8 */ 0xe6afb9, 0xe6b085, 0xe6b087, 0xe6b086,
+ /* ac */ 0xe6b08d, 0xe6b095, 0xe6b098, 0xe6b099,
+ /* b0 */ 0xe6b09a, 0xe6b0a1, 0xe6b0a9, 0xe6b0a4,
+ /* b4 */ 0xe6b0aa, 0xe6b0b2, 0xe694b5, 0xe69595,
+ /* b8 */ 0xe695ab, 0xe7898d, 0xe78992, 0xe78996,
+ /* bc */ 0xe788b0, 0xe899a2, 0xe58896, 0xe8829f,
+ /* c0 */ 0xe8829c, 0xe88293, 0xe882bc, 0xe69c8a,
+ /* c4 */ 0xe882bd, 0xe882b1, 0xe882ab, 0xe882ad,
+ /* c8 */ 0xe882b4, 0xe882b7, 0xe883a7, 0xe883a8,
+ /* cc */ 0xe883a9, 0xe883aa, 0xe8839b, 0xe88382,
+ /* d0 */ 0xe88384, 0xe88399, 0xe8838d, 0xe88397,
+ /* d4 */ 0xe69c90, 0xe8839d, 0xe883ab, 0xe883b1,
+ /* d8 */ 0xe883b4, 0xe883ad, 0xe8848d, 0xe8848e,
+ /* dc */ 0xe883b2, 0xe883bc, 0xe69c95, 0xe88492,
+ /* e0 */ 0xe8b19a, 0xe884b6, 0xe8849e, 0xe884ac,
+ /* e4 */ 0xe88498, 0xe884b2, 0xe88588, 0xe8858c,
+ /* e8 */ 0xe88593, 0xe885b4, 0xe88599, 0xe8859a,
+ /* ec */ 0xe885b1, 0xe885a0, 0xe885a9, 0xe885bc,
+ /* f0 */ 0xe885bd, 0xe885ad, 0xe885a7, 0xe5a18d,
+ /* f4 */ 0xe5aab5, 0xe88688, 0xe88682, 0xe88691,
+ /* f8 */ 0xe6bb95, 0xe886a3, 0xe886aa, 0xe8878c,
+ /* fc */ 0xe69ca6, 0xe8878a, 0xe886bb,
+
+ /*** Two byte table, leaf: ecxx - offset 0x050f5 ***/
+
+ /* 40 */ 0xe99ca1, 0xe99ca2, 0xe99ca3, 0xe99ca4,
+ /* 44 */ 0xe99ca5, 0xe99ca6, 0xe99ca7, 0xe99ca8,
+ /* 48 */ 0xe99ca9, 0xe99cab, 0xe99cac, 0xe99cae,
+ /* 4c */ 0xe99caf, 0xe99cb1, 0xe99cb3, 0xe99cb4,
+ /* 50 */ 0xe99cb5, 0xe99cb6, 0xe99cb7, 0xe99cba,
+ /* 54 */ 0xe99cbb, 0xe99cbc, 0xe99cbd, 0xe99cbf,
+ /* 58 */ 0xe99d80, 0xe99d81, 0xe99d82, 0xe99d83,
+ /* 5c */ 0xe99d84, 0xe99d85, 0xe99d86, 0xe99d87,
+ /* 60 */ 0xe99d88, 0xe99d89, 0xe99d8a, 0xe99d8b,
+ /* 64 */ 0xe99d8c, 0xe99d8d, 0xe99d8e, 0xe99d8f,
+ /* 68 */ 0xe99d90, 0xe99d91, 0xe99d94, 0xe99d95,
+ /* 6c */ 0xe99d97, 0xe99d98, 0xe99d9a, 0xe99d9c,
+ /* 70 */ 0xe99d9d, 0xe99d9f, 0xe99da3, 0xe99da4,
+ /* 74 */ 0xe99da6, 0xe99da7, 0xe99da8, 0xe99daa,
+ /* 78 */ 0xe99dab, 0xe99dac, 0xe99dad, 0xe99dae,
+ /* 7c */ 0xe99daf, 0xe99db0, 0xe99db1, 0x000000,
+ /* 80 */ 0xe99db2, 0xe99db5, 0xe99db7, 0xe99db8,
+ /* 84 */ 0xe99db9, 0xe99dba, 0xe99dbb, 0xe99dbd,
+ /* 88 */ 0xe99dbe, 0xe99dbf, 0xe99e80, 0xe99e81,
+ /* 8c */ 0xe99e82, 0xe99e83, 0xe99e84, 0xe99e86,
+ /* 90 */ 0xe99e87, 0xe99e88, 0xe99e89, 0xe99e8a,
+ /* 94 */ 0xe99e8c, 0xe99e8e, 0xe99e8f, 0xe99e90,
+ /* 98 */ 0xe99e93, 0xe99e95, 0xe99e96, 0xe99e97,
+ /* 9c */ 0xe99e99, 0xe99e9a, 0xe99e9b, 0xe99e9c,
+ /* a0 */ 0xe99e9d, 0xe88781, 0xe886a6, 0xe6aca4,
+ /* a4 */ 0xe6acb7, 0xe6acb9, 0xe6ad83, 0xe6ad86,
+ /* a8 */ 0xe6ad99, 0xe9a391, 0xe9a392, 0xe9a393,
+ /* ac */ 0xe9a395, 0xe9a399, 0xe9a39a, 0xe6aeb3,
+ /* b0 */ 0xe5bd80, 0xe6af82, 0xe8a7b3, 0xe69690,
+ /* b4 */ 0xe9bd91, 0xe69693, 0xe696bc, 0xe69786,
+ /* b8 */ 0xe69784, 0xe69783, 0xe6978c, 0xe6978e,
+ /* bc */ 0xe69792, 0xe69796, 0xe78280, 0xe7829c,
+ /* c0 */ 0xe78296, 0xe7829d, 0xe782bb, 0xe78380,
+ /* c4 */ 0xe782b7, 0xe782ab, 0xe782b1, 0xe783a8,
+ /* c8 */ 0xe7838a, 0xe78490, 0xe78493, 0xe78496,
+ /* cc */ 0xe784af, 0xe784b1, 0xe785b3, 0xe7859c,
+ /* d0 */ 0xe785a8, 0xe78585, 0xe785b2, 0xe7858a,
+ /* d4 */ 0xe785b8, 0xe785ba, 0xe78698, 0xe786b3,
+ /* d8 */ 0xe786b5, 0xe786a8, 0xe786a0, 0xe787a0,
+ /* dc */ 0xe78794, 0xe787a7, 0xe787b9, 0xe7889d,
+ /* e0 */ 0xe788a8, 0xe781ac, 0xe78498, 0xe785a6,
+ /* e4 */ 0xe786b9, 0xe688be, 0xe688bd, 0xe68983,
+ /* e8 */ 0xe68988, 0xe68989, 0xe7a4bb, 0xe7a580,
+ /* ec */ 0xe7a586, 0xe7a589, 0xe7a59b, 0xe7a59c,
+ /* f0 */ 0xe7a593, 0xe7a59a, 0xe7a5a2, 0xe7a597,
+ /* f4 */ 0xe7a5a0, 0xe7a5af, 0xe7a5a7, 0xe7a5ba,
+ /* f8 */ 0xe7a685, 0xe7a68a, 0xe7a69a, 0xe7a6a7,
+ /* fc */ 0xe7a6b3, 0xe5bf91, 0xe5bf90,
+
+ /*** Two byte table, leaf: edxx - offset 0x051b4 ***/
+
+ /* 40 */ 0xe99e9e, 0xe99e9f, 0xe99ea1, 0xe99ea2,
+ /* 44 */ 0xe99ea4, 0xe99ea5, 0xe99ea6, 0xe99ea7,
+ /* 48 */ 0xe99ea8, 0xe99ea9, 0xe99eaa, 0xe99eac,
+ /* 4c */ 0xe99eae, 0xe99eb0, 0xe99eb1, 0xe99eb3,
+ /* 50 */ 0xe99eb5, 0xe99eb6, 0xe99eb7, 0xe99eb8,
+ /* 54 */ 0xe99eb9, 0xe99eba, 0xe99ebb, 0xe99ebc,
+ /* 58 */ 0xe99ebd, 0xe99ebe, 0xe99ebf, 0xe99f80,
+ /* 5c */ 0xe99f81, 0xe99f82, 0xe99f83, 0xe99f84,
+ /* 60 */ 0xe99f85, 0xe99f86, 0xe99f87, 0xe99f88,
+ /* 64 */ 0xe99f89, 0xe99f8a, 0xe99f8b, 0xe99f8c,
+ /* 68 */ 0xe99f8d, 0xe99f8e, 0xe99f8f, 0xe99f90,
+ /* 6c */ 0xe99f91, 0xe99f92, 0xe99f93, 0xe99f94,
+ /* 70 */ 0xe99f95, 0xe99f96, 0xe99f97, 0xe99f98,
+ /* 74 */ 0xe99f99, 0xe99f9a, 0xe99f9b, 0xe99f9c,
+ /* 78 */ 0xe99f9d, 0xe99f9e, 0xe99f9f, 0xe99fa0,
+ /* 7c */ 0xe99fa1, 0xe99fa2, 0xe99fa3, 0x000000,
+ /* 80 */ 0xe99fa4, 0xe99fa5, 0xe99fa8, 0xe99fae,
+ /* 84 */ 0xe99faf, 0xe99fb0, 0xe99fb1, 0xe99fb2,
+ /* 88 */ 0xe99fb4, 0xe99fb7, 0xe99fb8, 0xe99fb9,
+ /* 8c */ 0xe99fba, 0xe99fbb, 0xe99fbc, 0xe99fbd,
+ /* 90 */ 0xe99fbe, 0xe99fbf, 0xe9a080, 0xe9a081,
+ /* 94 */ 0xe9a082, 0xe9a083, 0xe9a084, 0xe9a085,
+ /* 98 */ 0xe9a086, 0xe9a087, 0xe9a088, 0xe9a089,
+ /* 9c */ 0xe9a08a, 0xe9a08b, 0xe9a08c, 0xe9a08d,
+ /* a0 */ 0xe9a08e, 0xe680bc, 0xe6819d, 0xe6819a,
+ /* a4 */ 0xe681a7, 0xe68181, 0xe68199, 0xe681a3,
+ /* a8 */ 0xe682ab, 0xe68486, 0xe6848d, 0xe6859d,
+ /* ac */ 0xe686a9, 0xe6869d, 0xe6878b, 0xe68791,
+ /* b0 */ 0xe68886, 0xe88280, 0xe881bf, 0xe6b293,
+ /* b4 */ 0xe6b3b6, 0xe6b7bc, 0xe79fb6, 0xe79fb8,
+ /* b8 */ 0xe7a080, 0xe7a089, 0xe7a097, 0xe7a098,
+ /* bc */ 0xe7a091, 0xe696ab, 0xe7a0ad, 0xe7a09c,
+ /* c0 */ 0xe7a09d, 0xe7a0b9, 0xe7a0ba, 0xe7a0bb,
+ /* c4 */ 0xe7a09f, 0xe7a0bc, 0xe7a0a5, 0xe7a0ac,
+ /* c8 */ 0xe7a0a3, 0xe7a0a9, 0xe7a18e, 0xe7a1ad,
+ /* cc */ 0xe7a196, 0xe7a197, 0xe7a0a6, 0xe7a190,
+ /* d0 */ 0xe7a187, 0xe7a18c, 0xe7a1aa, 0xe7a29b,
+ /* d4 */ 0xe7a293, 0xe7a29a, 0xe7a287, 0xe7a29c,
+ /* d8 */ 0xe7a2a1, 0xe7a2a3, 0xe7a2b2, 0xe7a2b9,
+ /* dc */ 0xe7a2a5, 0xe7a394, 0xe7a399, 0xe7a389,
+ /* e0 */ 0xe7a3ac, 0xe7a3b2, 0xe7a485, 0xe7a3b4,
+ /* e4 */ 0xe7a493, 0xe7a4a4, 0xe7a49e, 0xe7a4b4,
+ /* e8 */ 0xe9be9b, 0xe9bbb9, 0xe9bbbb, 0xe9bbbc,
+ /* ec */ 0xe79bb1, 0xe79c84, 0xe79c8d, 0xe79bb9,
+ /* f0 */ 0xe79c87, 0xe79c88, 0xe79c9a, 0xe79ca2,
+ /* f4 */ 0xe79c99, 0xe79cad, 0xe79ca6, 0xe79cb5,
+ /* f8 */ 0xe79cb8, 0xe79d90, 0xe79d91, 0xe79d87,
+ /* fc */ 0xe79d83, 0xe79d9a, 0xe79da8,
+
+ /*** Two byte table, leaf: eexx - offset 0x05273 ***/
+
+ /* 40 */ 0xe9a08f, 0xe9a090, 0xe9a091, 0xe9a092,
+ /* 44 */ 0xe9a093, 0xe9a094, 0xe9a095, 0xe9a096,
+ /* 48 */ 0xe9a097, 0xe9a098, 0xe9a099, 0xe9a09a,
+ /* 4c */ 0xe9a09b, 0xe9a09c, 0xe9a09d, 0xe9a09e,
+ /* 50 */ 0xe9a09f, 0xe9a0a0, 0xe9a0a1, 0xe9a0a2,
+ /* 54 */ 0xe9a0a3, 0xe9a0a4, 0xe9a0a5, 0xe9a0a6,
+ /* 58 */ 0xe9a0a7, 0xe9a0a8, 0xe9a0a9, 0xe9a0aa,
+ /* 5c */ 0xe9a0ab, 0xe9a0ac, 0xe9a0ad, 0xe9a0ae,
+ /* 60 */ 0xe9a0af, 0xe9a0b0, 0xe9a0b1, 0xe9a0b2,
+ /* 64 */ 0xe9a0b3, 0xe9a0b4, 0xe9a0b5, 0xe9a0b6,
+ /* 68 */ 0xe9a0b7, 0xe9a0b8, 0xe9a0b9, 0xe9a0ba,
+ /* 6c */ 0xe9a0bb, 0xe9a0bc, 0xe9a0bd, 0xe9a0be,
+ /* 70 */ 0xe9a0bf, 0xe9a180, 0xe9a181, 0xe9a182,
+ /* 74 */ 0xe9a183, 0xe9a184, 0xe9a185, 0xe9a186,
+ /* 78 */ 0xe9a187, 0xe9a188, 0xe9a189, 0xe9a18a,
+ /* 7c */ 0xe9a18b, 0xe9a18c, 0xe9a18d, 0x000000,
+ /* 80 */ 0xe9a18e, 0xe9a18f, 0xe9a190, 0xe9a191,
+ /* 84 */ 0xe9a192, 0xe9a193, 0xe9a194, 0xe9a195,
+ /* 88 */ 0xe9a196, 0xe9a197, 0xe9a198, 0xe9a199,
+ /* 8c */ 0xe9a19a, 0xe9a19b, 0xe9a19c, 0xe9a19d,
+ /* 90 */ 0xe9a19e, 0xe9a19f, 0xe9a1a0, 0xe9a1a1,
+ /* 94 */ 0xe9a1a2, 0xe9a1a3, 0xe9a1a4, 0xe9a1a5,
+ /* 98 */ 0xe9a1a6, 0xe9a1a7, 0xe9a1a8, 0xe9a1a9,
+ /* 9c */ 0xe9a1aa, 0xe9a1ab, 0xe9a1ac, 0xe9a1ad,
+ /* a0 */ 0xe9a1ae, 0xe79da2, 0xe79da5, 0xe79dbf,
+ /* a4 */ 0xe79e8d, 0xe79dbd, 0xe79e80, 0xe79e8c,
+ /* a8 */ 0xe79e91, 0xe79e9f, 0xe79ea0, 0xe79eb0,
+ /* ac */ 0xe79eb5, 0xe79ebd, 0xe794ba, 0xe79580,
+ /* b0 */ 0xe7958e, 0xe7958b, 0xe79588, 0xe7959b,
+ /* b4 */ 0xe795b2, 0xe795b9, 0xe79683, 0xe7bd98,
+ /* b8 */ 0xe7bda1, 0xe7bd9f, 0xe8a988, 0xe7bda8,
+ /* bc */ 0xe7bdb4, 0xe7bdb1, 0xe7bdb9, 0xe7be81,
+ /* c0 */ 0xe7bdbe, 0xe79b8d, 0xe79ba5, 0xe8a0b2,
+ /* c4 */ 0xe99285, 0xe99286, 0xe99287, 0xe9928b,
+ /* c8 */ 0xe9928a, 0xe9928c, 0xe9928d, 0xe9928f,
+ /* cc */ 0xe99290, 0xe99294, 0xe99297, 0xe99295,
+ /* d0 */ 0xe9929a, 0xe9929b, 0xe9929c, 0xe992a3,
+ /* d4 */ 0xe992a4, 0xe992ab, 0xe992aa, 0xe992ad,
+ /* d8 */ 0xe992ac, 0xe992af, 0xe992b0, 0xe992b2,
+ /* dc */ 0xe992b4, 0xe992b6, 0xe992b7, 0xe992b8,
+ /* e0 */ 0xe992b9, 0xe992ba, 0xe992bc, 0xe992bd,
+ /* e4 */ 0xe992bf, 0xe99384, 0xe99388, 0xe99389,
+ /* e8 */ 0xe9938a, 0xe9938b, 0xe9938c, 0xe9938d,
+ /* ec */ 0xe9938e, 0xe99390, 0xe99391, 0xe99392,
+ /* f0 */ 0xe99395, 0xe99396, 0xe99397, 0xe99399,
+ /* f4 */ 0xe99398, 0xe9939b, 0xe9939e, 0xe9939f,
+ /* f8 */ 0xe993a0, 0xe993a2, 0xe993a4, 0xe993a5,
+ /* fc */ 0xe993a7, 0xe993a8, 0xe993aa,
+
+ /*** Two byte table, leaf: efxx - offset 0x05332 ***/
+
+ /* 40 */ 0xe9a1af, 0xe9a1b0, 0xe9a1b1, 0xe9a1b2,
+ /* 44 */ 0xe9a1b3, 0xe9a1b4, 0xe9a28b, 0xe9a28e,
+ /* 48 */ 0xe9a292, 0xe9a295, 0xe9a299, 0xe9a2a3,
+ /* 4c */ 0xe9a2a8, 0xe9a2a9, 0xe9a2aa, 0xe9a2ab,
+ /* 50 */ 0xe9a2ac, 0xe9a2ad, 0xe9a2ae, 0xe9a2af,
+ /* 54 */ 0xe9a2b0, 0xe9a2b1, 0xe9a2b2, 0xe9a2b3,
+ /* 58 */ 0xe9a2b4, 0xe9a2b5, 0xe9a2b6, 0xe9a2b7,
+ /* 5c */ 0xe9a2b8, 0xe9a2b9, 0xe9a2ba, 0xe9a2bb,
+ /* 60 */ 0xe9a2bc, 0xe9a2bd, 0xe9a2be, 0xe9a2bf,
+ /* 64 */ 0xe9a380, 0xe9a381, 0xe9a382, 0xe9a383,
+ /* 68 */ 0xe9a384, 0xe9a385, 0xe9a386, 0xe9a387,
+ /* 6c */ 0xe9a388, 0xe9a389, 0xe9a38a, 0xe9a38b,
+ /* 70 */ 0xe9a38c, 0xe9a38d, 0xe9a38f, 0xe9a390,
+ /* 74 */ 0xe9a394, 0xe9a396, 0xe9a397, 0xe9a39b,
+ /* 78 */ 0xe9a39c, 0xe9a39d, 0xe9a3a0, 0xe9a3a1,
+ /* 7c */ 0xe9a3a2, 0xe9a3a3, 0xe9a3a4, 0x000000,
+ /* 80 */ 0xe9a3a5, 0xe9a3a6, 0xe9a3a9, 0xe9a3aa,
+ /* 84 */ 0xe9a3ab, 0xe9a3ac, 0xe9a3ad, 0xe9a3ae,
+ /* 88 */ 0xe9a3af, 0xe9a3b0, 0xe9a3b1, 0xe9a3b2,
+ /* 8c */ 0xe9a3b3, 0xe9a3b4, 0xe9a3b5, 0xe9a3b6,
+ /* 90 */ 0xe9a3b7, 0xe9a3b8, 0xe9a3b9, 0xe9a3ba,
+ /* 94 */ 0xe9a3bb, 0xe9a3bc, 0xe9a3bd, 0xe9a3be,
+ /* 98 */ 0xe9a3bf, 0xe9a480, 0xe9a481, 0xe9a482,
+ /* 9c */ 0xe9a483, 0xe9a484, 0xe9a485, 0xe9a486,
+ /* a0 */ 0xe9a487, 0xe993a9, 0xe993ab, 0xe993ae,
+ /* a4 */ 0xe993af, 0xe993b3, 0xe993b4, 0xe993b5,
+ /* a8 */ 0xe993b7, 0xe993b9, 0xe993bc, 0xe993bd,
+ /* ac */ 0xe993bf, 0xe99483, 0xe99482, 0xe99486,
+ /* b0 */ 0xe99487, 0xe99489, 0xe9948a, 0xe9948d,
+ /* b4 */ 0xe9948e, 0xe9948f, 0xe99492, 0xe99493,
+ /* b8 */ 0xe99494, 0xe99495, 0xe99496, 0xe99498,
+ /* bc */ 0xe9949b, 0xe9949d, 0xe9949e, 0xe9949f,
+ /* c0 */ 0xe994a2, 0xe994aa, 0xe994ab, 0xe994a9,
+ /* c4 */ 0xe994ac, 0xe994b1, 0xe994b2, 0xe994b4,
+ /* c8 */ 0xe994b6, 0xe994b7, 0xe994b8, 0xe994bc,
+ /* cc */ 0xe994be, 0xe994bf, 0xe99582, 0xe994b5,
+ /* d0 */ 0xe99584, 0xe99585, 0xe99586, 0xe99589,
+ /* d4 */ 0xe9958c, 0xe9958e, 0xe9958f, 0xe99592,
+ /* d8 */ 0xe99593, 0xe99594, 0xe99596, 0xe99597,
+ /* dc */ 0xe99598, 0xe99599, 0xe9959b, 0xe9959e,
+ /* e0 */ 0xe9959f, 0xe9959d, 0xe995a1, 0xe995a2,
+ /* e4 */ 0xe995a4, 0xe995a5, 0xe995a6, 0xe995a7,
+ /* e8 */ 0xe995a8, 0xe995a9, 0xe995aa, 0xe995ab,
+ /* ec */ 0xe995ac, 0xe995af, 0xe995b1, 0xe995b2,
+ /* f0 */ 0xe995b3, 0xe994ba, 0xe79fa7, 0xe79fac,
+ /* f4 */ 0xe99b89, 0xe7a795, 0xe7a7ad, 0xe7a7a3,
+ /* f8 */ 0xe7a7ab, 0xe7a886, 0xe5b587, 0xe7a883,
+ /* fc */ 0xe7a882, 0xe7a89e, 0xe7a894,
+
+ /*** Two byte table, leaf: f0xx - offset 0x053f1 ***/
+
+ /* 40 */ 0xe9a488, 0xe9a489, 0xe9a48a, 0xe9a48b,
+ /* 44 */ 0xe9a48c, 0xe9a48e, 0xe9a48f, 0xe9a491,
+ /* 48 */ 0xe9a492, 0xe9a493, 0xe9a494, 0xe9a495,
+ /* 4c */ 0xe9a496, 0xe9a497, 0xe9a498, 0xe9a499,
+ /* 50 */ 0xe9a49a, 0xe9a49b, 0xe9a49c, 0xe9a49d,
+ /* 54 */ 0xe9a49e, 0xe9a49f, 0xe9a4a0, 0xe9a4a1,
+ /* 58 */ 0xe9a4a2, 0xe9a4a3, 0xe9a4a4, 0xe9a4a5,
+ /* 5c */ 0xe9a4a6, 0xe9a4a7, 0xe9a4a8, 0xe9a4a9,
+ /* 60 */ 0xe9a4aa, 0xe9a4ab, 0xe9a4ac, 0xe9a4ad,
+ /* 64 */ 0xe9a4af, 0xe9a4b0, 0xe9a4b1, 0xe9a4b2,
+ /* 68 */ 0xe9a4b3, 0xe9a4b4, 0xe9a4b5, 0xe9a4b6,
+ /* 6c */ 0xe9a4b7, 0xe9a4b8, 0xe9a4b9, 0xe9a4ba,
+ /* 70 */ 0xe9a4bb, 0xe9a4bc, 0xe9a4bd, 0xe9a4be,
+ /* 74 */ 0xe9a4bf, 0xe9a580, 0xe9a581, 0xe9a582,
+ /* 78 */ 0xe9a583, 0xe9a584, 0xe9a585, 0xe9a586,
+ /* 7c */ 0xe9a587, 0xe9a588, 0xe9a589, 0x000000,
+ /* 80 */ 0xe9a58a, 0xe9a58b, 0xe9a58c, 0xe9a58d,
+ /* 84 */ 0xe9a58e, 0xe9a58f, 0xe9a590, 0xe9a591,
+ /* 88 */ 0xe9a592, 0xe9a593, 0xe9a596, 0xe9a597,
+ /* 8c */ 0xe9a598, 0xe9a599, 0xe9a59a, 0xe9a59b,
+ /* 90 */ 0xe9a59c, 0xe9a59d, 0xe9a59e, 0xe9a59f,
+ /* 94 */ 0xe9a5a0, 0xe9a5a1, 0xe9a5a2, 0xe9a5a4,
+ /* 98 */ 0xe9a5a6, 0xe9a5b3, 0xe9a5b8, 0xe9a5b9,
+ /* 9c */ 0xe9a5bb, 0xe9a5be, 0xe9a682, 0xe9a683,
+ /* a0 */ 0xe9a689, 0xe7a8b9, 0xe7a8b7, 0xe7a991,
+ /* a4 */ 0xe9bb8f, 0xe9a6a5, 0xe7a9b0, 0xe79a88,
+ /* a8 */ 0xe79a8e, 0xe79a93, 0xe79a99, 0xe79aa4,
+ /* ac */ 0xe7939e, 0xe793a0, 0xe794ac, 0xe9b8a0,
+ /* b0 */ 0xe9b8a2, 0xe9b8a8, 0xe9b8a9, 0xe9b8aa,
+ /* b4 */ 0xe9b8ab, 0xe9b8ac, 0xe9b8b2, 0xe9b8b1,
+ /* b8 */ 0xe9b8b6, 0xe9b8b8, 0xe9b8b7, 0xe9b8b9,
+ /* bc */ 0xe9b8ba, 0xe9b8be, 0xe9b981, 0xe9b982,
+ /* c0 */ 0xe9b984, 0xe9b986, 0xe9b987, 0xe9b988,
+ /* c4 */ 0xe9b989, 0xe9b98b, 0xe9b98c, 0xe9b98e,
+ /* c8 */ 0xe9b991, 0xe9b995, 0xe9b997, 0xe9b99a,
+ /* cc */ 0xe9b99b, 0xe9b99c, 0xe9b99e, 0xe9b9a3,
+ /* d0 */ 0xe9b9a6, 0xe9b9a7, 0xe9b9a8, 0xe9b9a9,
+ /* d4 */ 0xe9b9aa, 0xe9b9ab, 0xe9b9ac, 0xe9b9b1,
+ /* d8 */ 0xe9b9ad, 0xe9b9b3, 0xe79692, 0xe79694,
+ /* dc */ 0xe79696, 0xe796a0, 0xe7969d, 0xe796ac,
+ /* e0 */ 0xe796a3, 0xe796b3, 0xe796b4, 0xe796b8,
+ /* e4 */ 0xe79784, 0xe796b1, 0xe796b0, 0xe79783,
+ /* e8 */ 0xe79782, 0xe79796, 0xe7978d, 0xe797a3,
+ /* ec */ 0xe797a8, 0xe797a6, 0xe797a4, 0xe797ab,
+ /* f0 */ 0xe797a7, 0xe79883, 0xe797b1, 0xe797bc,
+ /* f4 */ 0xe797bf, 0xe79890, 0xe79880, 0xe79885,
+ /* f8 */ 0xe7988c, 0xe79897, 0xe7988a, 0xe798a5,
+ /* fc */ 0xe79898, 0xe79895, 0xe79899,
+
+ /*** Two byte table, leaf: f1xx - offset 0x054b0 ***/
+
+ /* 40 */ 0xe9a68c, 0xe9a68e, 0xe9a69a, 0xe9a69b,
+ /* 44 */ 0xe9a69c, 0xe9a69d, 0xe9a69e, 0xe9a69f,
+ /* 48 */ 0xe9a6a0, 0xe9a6a1, 0xe9a6a2, 0xe9a6a3,
+ /* 4c */ 0xe9a6a4, 0xe9a6a6, 0xe9a6a7, 0xe9a6a9,
+ /* 50 */ 0xe9a6aa, 0xe9a6ab, 0xe9a6ac, 0xe9a6ad,
+ /* 54 */ 0xe9a6ae, 0xe9a6af, 0xe9a6b0, 0xe9a6b1,
+ /* 58 */ 0xe9a6b2, 0xe9a6b3, 0xe9a6b4, 0xe9a6b5,
+ /* 5c */ 0xe9a6b6, 0xe9a6b7, 0xe9a6b8, 0xe9a6b9,
+ /* 60 */ 0xe9a6ba, 0xe9a6bb, 0xe9a6bc, 0xe9a6bd,
+ /* 64 */ 0xe9a6be, 0xe9a6bf, 0xe9a780, 0xe9a781,
+ /* 68 */ 0xe9a782, 0xe9a783, 0xe9a784, 0xe9a785,
+ /* 6c */ 0xe9a786, 0xe9a787, 0xe9a788, 0xe9a789,
+ /* 70 */ 0xe9a78a, 0xe9a78b, 0xe9a78c, 0xe9a78d,
+ /* 74 */ 0xe9a78e, 0xe9a78f, 0xe9a790, 0xe9a791,
+ /* 78 */ 0xe9a792, 0xe9a793, 0xe9a794, 0xe9a795,
+ /* 7c */ 0xe9a796, 0xe9a797, 0xe9a798, 0x000000,
+ /* 80 */ 0xe9a799, 0xe9a79a, 0xe9a79b, 0xe9a79c,
+ /* 84 */ 0xe9a79d, 0xe9a79e, 0xe9a79f, 0xe9a7a0,
+ /* 88 */ 0xe9a7a1, 0xe9a7a2, 0xe9a7a3, 0xe9a7a4,
+ /* 8c */ 0xe9a7a5, 0xe9a7a6, 0xe9a7a7, 0xe9a7a8,
+ /* 90 */ 0xe9a7a9, 0xe9a7aa, 0xe9a7ab, 0xe9a7ac,
+ /* 94 */ 0xe9a7ad, 0xe9a7ae, 0xe9a7af, 0xe9a7b0,
+ /* 98 */ 0xe9a7b1, 0xe9a7b2, 0xe9a7b3, 0xe9a7b4,
+ /* 9c */ 0xe9a7b5, 0xe9a7b6, 0xe9a7b7, 0xe9a7b8,
+ /* a0 */ 0xe9a7b9, 0xe7989b, 0xe798bc, 0xe798a2,
+ /* a4 */ 0xe798a0, 0xe79980, 0xe798ad, 0xe798b0,
+ /* a8 */ 0xe798bf, 0xe798b5, 0xe79983, 0xe798be,
+ /* ac */ 0xe798b3, 0xe7998d, 0xe7999e, 0xe79994,
+ /* b0 */ 0xe7999c, 0xe79996, 0xe799ab, 0xe799af,
+ /* b4 */ 0xe7bf8a, 0xe7aba6, 0xe7a9b8, 0xe7a9b9,
+ /* b8 */ 0xe7aa80, 0xe7aa86, 0xe7aa88, 0xe7aa95,
+ /* bc */ 0xe7aaa6, 0xe7aaa0, 0xe7aaac, 0xe7aaa8,
+ /* c0 */ 0xe7aaad, 0xe7aab3, 0xe8a1a4, 0xe8a1a9,
+ /* c4 */ 0xe8a1b2, 0xe8a1bd, 0xe8a1bf, 0xe8a282,
+ /* c8 */ 0xe8a2a2, 0xe8a386, 0xe8a2b7, 0xe8a2bc,
+ /* cc */ 0xe8a389, 0xe8a3a2, 0xe8a38e, 0xe8a3a3,
+ /* d0 */ 0xe8a3a5, 0xe8a3b1, 0xe8a49a, 0xe8a3bc,
+ /* d4 */ 0xe8a3a8, 0xe8a3be, 0xe8a3b0, 0xe8a4a1,
+ /* d8 */ 0xe8a499, 0xe8a493, 0xe8a49b, 0xe8a48a,
+ /* dc */ 0xe8a4b4, 0xe8a4ab, 0xe8a4b6, 0xe8a581,
+ /* e0 */ 0xe8a5a6, 0xe8a5bb, 0xe7968b, 0xe883a5,
+ /* e4 */ 0xe79ab2, 0xe79ab4, 0xe79f9c, 0xe88092,
+ /* e8 */ 0xe88094, 0xe88096, 0xe8809c, 0xe880a0,
+ /* ec */ 0xe880a2, 0xe880a5, 0xe880a6, 0xe880a7,
+ /* f0 */ 0xe880a9, 0xe880a8, 0xe880b1, 0xe8808b,
+ /* f4 */ 0xe880b5, 0xe88183, 0xe88186, 0xe8818d,
+ /* f8 */ 0xe88192, 0xe881a9, 0xe881b1, 0xe8a683,
+ /* fc */ 0xe9a1b8, 0xe9a280, 0xe9a283,
+
+ /*** Two byte table, leaf: f2xx - offset 0x0556f ***/
+
+ /* 40 */ 0xe9a7ba, 0xe9a7bb, 0xe9a7bc, 0xe9a7bd,
+ /* 44 */ 0xe9a7be, 0xe9a7bf, 0xe9a880, 0xe9a881,
+ /* 48 */ 0xe9a882, 0xe9a883, 0xe9a884, 0xe9a885,
+ /* 4c */ 0xe9a886, 0xe9a887, 0xe9a888, 0xe9a889,
+ /* 50 */ 0xe9a88a, 0xe9a88b, 0xe9a88c, 0xe9a88d,
+ /* 54 */ 0xe9a88e, 0xe9a88f, 0xe9a890, 0xe9a891,
+ /* 58 */ 0xe9a892, 0xe9a893, 0xe9a894, 0xe9a895,
+ /* 5c */ 0xe9a896, 0xe9a897, 0xe9a898, 0xe9a899,
+ /* 60 */ 0xe9a89a, 0xe9a89b, 0xe9a89c, 0xe9a89d,
+ /* 64 */ 0xe9a89e, 0xe9a89f, 0xe9a8a0, 0xe9a8a1,
+ /* 68 */ 0xe9a8a2, 0xe9a8a3, 0xe9a8a4, 0xe9a8a5,
+ /* 6c */ 0xe9a8a6, 0xe9a8a7, 0xe9a8a8, 0xe9a8a9,
+ /* 70 */ 0xe9a8aa, 0xe9a8ab, 0xe9a8ac, 0xe9a8ad,
+ /* 74 */ 0xe9a8ae, 0xe9a8af, 0xe9a8b0, 0xe9a8b1,
+ /* 78 */ 0xe9a8b2, 0xe9a8b3, 0xe9a8b4, 0xe9a8b5,
+ /* 7c */ 0xe9a8b6, 0xe9a8b7, 0xe9a8b8, 0x000000,
+ /* 80 */ 0xe9a8b9, 0xe9a8ba, 0xe9a8bb, 0xe9a8bc,
+ /* 84 */ 0xe9a8bd, 0xe9a8be, 0xe9a8bf, 0xe9a980,
+ /* 88 */ 0xe9a981, 0xe9a982, 0xe9a983, 0xe9a984,
+ /* 8c */ 0xe9a985, 0xe9a986, 0xe9a987, 0xe9a988,
+ /* 90 */ 0xe9a989, 0xe9a98a, 0xe9a98b, 0xe9a98c,
+ /* 94 */ 0xe9a98d, 0xe9a98e, 0xe9a98f, 0xe9a990,
+ /* 98 */ 0xe9a991, 0xe9a992, 0xe9a993, 0xe9a994,
+ /* 9c */ 0xe9a995, 0xe9a996, 0xe9a997, 0xe9a998,
+ /* a0 */ 0xe9a999, 0xe9a289, 0xe9a28c, 0xe9a28d,
+ /* a4 */ 0xe9a28f, 0xe9a294, 0xe9a29a, 0xe9a29b,
+ /* a8 */ 0xe9a29e, 0xe9a29f, 0xe9a2a1, 0xe9a2a2,
+ /* ac */ 0xe9a2a5, 0xe9a2a6, 0xe8998d, 0xe89994,
+ /* b0 */ 0xe899ac, 0xe899ae, 0xe899bf, 0xe899ba,
+ /* b4 */ 0xe899bc, 0xe899bb, 0xe89aa8, 0xe89a8d,
+ /* b8 */ 0xe89a8b, 0xe89aac, 0xe89a9d, 0xe89aa7,
+ /* bc */ 0xe89aa3, 0xe89aaa, 0xe89a93, 0xe89aa9,
+ /* c0 */ 0xe89ab6, 0xe89b84, 0xe89ab5, 0xe89b8e,
+ /* c4 */ 0xe89ab0, 0xe89aba, 0xe89ab1, 0xe89aaf,
+ /* c8 */ 0xe89b89, 0xe89b8f, 0xe89ab4, 0xe89ba9,
+ /* cc */ 0xe89bb1, 0xe89bb2, 0xe89bad, 0xe89bb3,
+ /* d0 */ 0xe89b90, 0xe89c93, 0xe89b9e, 0xe89bb4,
+ /* d4 */ 0xe89b9f, 0xe89b98, 0xe89b91, 0xe89c83,
+ /* d8 */ 0xe89c87, 0xe89bb8, 0xe89c88, 0xe89c8a,
+ /* dc */ 0xe89c8d, 0xe89c89, 0xe89ca3, 0xe89cbb,
+ /* e0 */ 0xe89c9e, 0xe89ca5, 0xe89cae, 0xe89c9a,
+ /* e4 */ 0xe89cbe, 0xe89d88, 0xe89cb4, 0xe89cb1,
+ /* e8 */ 0xe89ca9, 0xe89cb7, 0xe89cbf, 0xe89e82,
+ /* ec */ 0xe89ca2, 0xe89dbd, 0xe89dbe, 0xe89dbb,
+ /* f0 */ 0xe89da0, 0xe89db0, 0xe89d8c, 0xe89dae,
+ /* f4 */ 0xe89e8b, 0xe89d93, 0xe89da3, 0xe89dbc,
+ /* f8 */ 0xe89da4, 0xe89d99, 0xe89da5, 0xe89e93,
+ /* fc */ 0xe89eaf, 0xe89ea8, 0xe89f92,
+
+ /*** Two byte table, leaf: f3xx - offset 0x0562e ***/
+
+ /* 40 */ 0xe9a99a, 0xe9a99b, 0xe9a99c, 0xe9a99d,
+ /* 44 */ 0xe9a99e, 0xe9a99f, 0xe9a9a0, 0xe9a9a1,
+ /* 48 */ 0xe9a9a2, 0xe9a9a3, 0xe9a9a4, 0xe9a9a5,
+ /* 4c */ 0xe9a9a6, 0xe9a9a7, 0xe9a9a8, 0xe9a9a9,
+ /* 50 */ 0xe9a9aa, 0xe9a9ab, 0xe9a9b2, 0xe9aa83,
+ /* 54 */ 0xe9aa89, 0xe9aa8d, 0xe9aa8e, 0xe9aa94,
+ /* 58 */ 0xe9aa95, 0xe9aa99, 0xe9aaa6, 0xe9aaa9,
+ /* 5c */ 0xe9aaaa, 0xe9aaab, 0xe9aaac, 0xe9aaad,
+ /* 60 */ 0xe9aaae, 0xe9aaaf, 0xe9aab2, 0xe9aab3,
+ /* 64 */ 0xe9aab4, 0xe9aab5, 0xe9aab9, 0xe9aabb,
+ /* 68 */ 0xe9aabd, 0xe9aabe, 0xe9aabf, 0xe9ab83,
+ /* 6c */ 0xe9ab84, 0xe9ab86, 0xe9ab87, 0xe9ab88,
+ /* 70 */ 0xe9ab89, 0xe9ab8a, 0xe9ab8d, 0xe9ab8e,
+ /* 74 */ 0xe9ab8f, 0xe9ab90, 0xe9ab92, 0xe9ab94,
+ /* 78 */ 0xe9ab95, 0xe9ab96, 0xe9ab97, 0xe9ab99,
+ /* 7c */ 0xe9ab9a, 0xe9ab9b, 0xe9ab9c, 0x000000,
+ /* 80 */ 0xe9ab9d, 0xe9ab9e, 0xe9aba0, 0xe9aba2,
+ /* 84 */ 0xe9aba3, 0xe9aba4, 0xe9aba5, 0xe9aba7,
+ /* 88 */ 0xe9aba8, 0xe9aba9, 0xe9abaa, 0xe9abac,
+ /* 8c */ 0xe9abae, 0xe9abb0, 0xe9abb1, 0xe9abb2,
+ /* 90 */ 0xe9abb3, 0xe9abb4, 0xe9abb5, 0xe9abb6,
+ /* 94 */ 0xe9abb7, 0xe9abb8, 0xe9abba, 0xe9abbc,
+ /* 98 */ 0xe9abbd, 0xe9abbe, 0xe9abbf, 0xe9ac80,
+ /* 9c */ 0xe9ac81, 0xe9ac82, 0xe9ac84, 0xe9ac85,
+ /* a0 */ 0xe9ac86, 0xe89f86, 0xe89e88, 0xe89e85,
+ /* a4 */ 0xe89ead, 0xe89e97, 0xe89e83, 0xe89eab,
+ /* a8 */ 0xe89fa5, 0xe89eac, 0xe89eb5, 0xe89eb3,
+ /* ac */ 0xe89f8b, 0xe89f93, 0xe89ebd, 0xe89f91,
+ /* b0 */ 0xe89f80, 0xe89f8a, 0xe89f9b, 0xe89faa,
+ /* b4 */ 0xe89fa0, 0xe89fae, 0xe8a096, 0xe8a093,
+ /* b8 */ 0xe89fbe, 0xe8a08a, 0xe8a09b, 0xe8a0a1,
+ /* bc */ 0xe8a0b9, 0xe8a0bc, 0xe7bcb6, 0xe7bd82,
+ /* c0 */ 0xe7bd84, 0xe7bd85, 0xe88890, 0xe7abba,
+ /* c4 */ 0xe7abbd, 0xe7ac88, 0xe7ac83, 0xe7ac84,
+ /* c8 */ 0xe7ac95, 0xe7ac8a, 0xe7acab, 0xe7ac8f,
+ /* cc */ 0xe7ad87, 0xe7acb8, 0xe7acaa, 0xe7ac99,
+ /* d0 */ 0xe7acae, 0xe7acb1, 0xe7aca0, 0xe7aca5,
+ /* d4 */ 0xe7aca4, 0xe7acb3, 0xe7acbe, 0xe7ac9e,
+ /* d8 */ 0xe7ad98, 0xe7ad9a, 0xe7ad85, 0xe7adb5,
+ /* dc */ 0xe7ad8c, 0xe7ad9d, 0xe7ada0, 0xe7adae,
+ /* e0 */ 0xe7adbb, 0xe7ada2, 0xe7adb2, 0xe7adb1,
+ /* e4 */ 0xe7ae90, 0xe7aea6, 0xe7aea7, 0xe7aeb8,
+ /* e8 */ 0xe7aeac, 0xe7ae9d, 0xe7aea8, 0xe7ae85,
+ /* ec */ 0xe7aeaa, 0xe7ae9c, 0xe7aea2, 0xe7aeab,
+ /* f0 */ 0xe7aeb4, 0xe7af91, 0xe7af81, 0xe7af8c,
+ /* f4 */ 0xe7af9d, 0xe7af9a, 0xe7afa5, 0xe7afa6,
+ /* f8 */ 0xe7afaa, 0xe7b08c, 0xe7afbe, 0xe7afbc,
+ /* fc */ 0xe7b08f, 0xe7b096, 0xe7b08b,
+
+ /*** Two byte table, leaf: f4xx - offset 0x056ed ***/
+
+ /* 40 */ 0xe9ac87, 0xe9ac89, 0xe9ac8a, 0xe9ac8b,
+ /* 44 */ 0xe9ac8c, 0xe9ac8d, 0xe9ac8e, 0xe9ac90,
+ /* 48 */ 0xe9ac91, 0xe9ac92, 0xe9ac94, 0xe9ac95,
+ /* 4c */ 0xe9ac96, 0xe9ac97, 0xe9ac98, 0xe9ac99,
+ /* 50 */ 0xe9ac9a, 0xe9ac9b, 0xe9ac9c, 0xe9ac9d,
+ /* 54 */ 0xe9ac9e, 0xe9aca0, 0xe9aca1, 0xe9aca2,
+ /* 58 */ 0xe9aca4, 0xe9aca5, 0xe9aca6, 0xe9aca7,
+ /* 5c */ 0xe9aca8, 0xe9aca9, 0xe9acaa, 0xe9acab,
+ /* 60 */ 0xe9acac, 0xe9acad, 0xe9acae, 0xe9acb0,
+ /* 64 */ 0xe9acb1, 0xe9acb3, 0xe9acb4, 0xe9acb5,
+ /* 68 */ 0xe9acb6, 0xe9acb7, 0xe9acb8, 0xe9acb9,
+ /* 6c */ 0xe9acba, 0xe9acbd, 0xe9acbe, 0xe9acbf,
+ /* 70 */ 0xe9ad80, 0xe9ad86, 0xe9ad8a, 0xe9ad8b,
+ /* 74 */ 0xe9ad8c, 0xe9ad8e, 0xe9ad90, 0xe9ad92,
+ /* 78 */ 0xe9ad93, 0xe9ad95, 0xe9ad96, 0xe9ad97,
+ /* 7c */ 0xe9ad98, 0xe9ad99, 0xe9ad9a, 0x000000,
+ /* 80 */ 0xe9ad9b, 0xe9ad9c, 0xe9ad9d, 0xe9ad9e,
+ /* 84 */ 0xe9ad9f, 0xe9ada0, 0xe9ada1, 0xe9ada2,
+ /* 88 */ 0xe9ada3, 0xe9ada4, 0xe9ada5, 0xe9ada6,
+ /* 8c */ 0xe9ada7, 0xe9ada8, 0xe9ada9, 0xe9adaa,
+ /* 90 */ 0xe9adab, 0xe9adac, 0xe9adad, 0xe9adae,
+ /* 94 */ 0xe9adaf, 0xe9adb0, 0xe9adb1, 0xe9adb2,
+ /* 98 */ 0xe9adb3, 0xe9adb4, 0xe9adb5, 0xe9adb6,
+ /* 9c */ 0xe9adb7, 0xe9adb8, 0xe9adb9, 0xe9adba,
+ /* a0 */ 0xe9adbb, 0xe7b09f, 0xe7b0aa, 0xe7b0a6,
+ /* a4 */ 0xe7b0b8, 0xe7b181, 0xe7b180, 0xe887be,
+ /* a8 */ 0xe88881, 0xe88882, 0xe88884, 0xe887ac,
+ /* ac */ 0xe8a184, 0xe888a1, 0xe888a2, 0xe888a3,
+ /* b0 */ 0xe888ad, 0xe888af, 0xe888a8, 0xe888ab,
+ /* b4 */ 0xe888b8, 0xe888bb, 0xe888b3, 0xe888b4,
+ /* b8 */ 0xe888be, 0xe88984, 0xe88989, 0xe8898b,
+ /* bc */ 0xe8898f, 0xe8899a, 0xe8899f, 0xe889a8,
+ /* c0 */ 0xe8a1be, 0xe8a285, 0xe8a288, 0xe8a398,
+ /* c4 */ 0xe8a39f, 0xe8a59e, 0xe7be9d, 0xe7be9f,
+ /* c8 */ 0xe7bea7, 0xe7beaf, 0xe7beb0, 0xe7beb2,
+ /* cc */ 0xe7b1bc, 0xe69589, 0xe7b291, 0xe7b29d,
+ /* d0 */ 0xe7b29c, 0xe7b29e, 0xe7b2a2, 0xe7b2b2,
+ /* d4 */ 0xe7b2bc, 0xe7b2bd, 0xe7b381, 0xe7b387,
+ /* d8 */ 0xe7b38c, 0xe7b38d, 0xe7b388, 0xe7b385,
+ /* dc */ 0xe7b397, 0xe7b3a8, 0xe889ae, 0xe69aa8,
+ /* e0 */ 0xe7bebf, 0xe7bf8e, 0xe7bf95, 0xe7bfa5,
+ /* e4 */ 0xe7bfa1, 0xe7bfa6, 0xe7bfa9, 0xe7bfae,
+ /* e8 */ 0xe7bfb3, 0xe7b3b8, 0xe7b5b7, 0xe7b6a6,
+ /* ec */ 0xe7b6ae, 0xe7b987, 0xe7ba9b, 0xe9bab8,
+ /* f0 */ 0xe9bab4, 0xe8b5b3, 0xe8b684, 0xe8b694,
+ /* f4 */ 0xe8b691, 0xe8b6b1, 0xe8b5a7, 0xe8b5ad,
+ /* f8 */ 0xe8b187, 0xe8b189, 0xe9858a, 0xe98590,
+ /* fc */ 0xe9858e, 0xe9858f, 0xe985a4,
+
+ /*** Two byte table, leaf: f5xx - offset 0x057ac ***/
+
+ /* 40 */ 0xe9adbc, 0xe9adbd, 0xe9adbe, 0xe9adbf,
+ /* 44 */ 0xe9ae80, 0xe9ae81, 0xe9ae82, 0xe9ae83,
+ /* 48 */ 0xe9ae84, 0xe9ae85, 0xe9ae86, 0xe9ae87,
+ /* 4c */ 0xe9ae88, 0xe9ae89, 0xe9ae8a, 0xe9ae8b,
+ /* 50 */ 0xe9ae8c, 0xe9ae8d, 0xe9ae8e, 0xe9ae8f,
+ /* 54 */ 0xe9ae90, 0xe9ae91, 0xe9ae92, 0xe9ae93,
+ /* 58 */ 0xe9ae94, 0xe9ae95, 0xe9ae96, 0xe9ae97,
+ /* 5c */ 0xe9ae98, 0xe9ae99, 0xe9ae9a, 0xe9ae9b,
+ /* 60 */ 0xe9ae9c, 0xe9ae9d, 0xe9ae9e, 0xe9ae9f,
+ /* 64 */ 0xe9aea0, 0xe9aea1, 0xe9aea2, 0xe9aea3,
+ /* 68 */ 0xe9aea4, 0xe9aea5, 0xe9aea6, 0xe9aea7,
+ /* 6c */ 0xe9aea8, 0xe9aea9, 0xe9aeaa, 0xe9aeab,
+ /* 70 */ 0xe9aeac, 0xe9aead, 0xe9aeae, 0xe9aeaf,
+ /* 74 */ 0xe9aeb0, 0xe9aeb1, 0xe9aeb2, 0xe9aeb3,
+ /* 78 */ 0xe9aeb4, 0xe9aeb5, 0xe9aeb6, 0xe9aeb7,
+ /* 7c */ 0xe9aeb8, 0xe9aeb9, 0xe9aeba, 0x000000,
+ /* 80 */ 0xe9aebb, 0xe9aebc, 0xe9aebd, 0xe9aebe,
+ /* 84 */ 0xe9aebf, 0xe9af80, 0xe9af81, 0xe9af82,
+ /* 88 */ 0xe9af83, 0xe9af84, 0xe9af85, 0xe9af86,
+ /* 8c */ 0xe9af87, 0xe9af88, 0xe9af89, 0xe9af8a,
+ /* 90 */ 0xe9af8b, 0xe9af8c, 0xe9af8d, 0xe9af8e,
+ /* 94 */ 0xe9af8f, 0xe9af90, 0xe9af91, 0xe9af92,
+ /* 98 */ 0xe9af93, 0xe9af94, 0xe9af95, 0xe9af96,
+ /* 9c */ 0xe9af97, 0xe9af98, 0xe9af99, 0xe9af9a,
+ /* a0 */ 0xe9af9b, 0xe985a2, 0xe985a1, 0xe985b0,
+ /* a4 */ 0xe985a9, 0xe985af, 0xe985bd, 0xe985be,
+ /* a8 */ 0xe985b2, 0xe985b4, 0xe985b9, 0xe9868c,
+ /* ac */ 0xe98685, 0xe98690, 0xe9868d, 0xe98691,
+ /* b0 */ 0xe986a2, 0xe986a3, 0xe986aa, 0xe986ad,
+ /* b4 */ 0xe986ae, 0xe986af, 0xe986b5, 0xe986b4,
+ /* b8 */ 0xe986ba, 0xe8b195, 0xe9b9be, 0xe8b6b8,
+ /* bc */ 0xe8b7ab, 0xe8b885, 0xe8b999, 0xe8b9a9,
+ /* c0 */ 0xe8b6b5, 0xe8b6bf, 0xe8b6bc, 0xe8b6ba,
+ /* c4 */ 0xe8b784, 0xe8b796, 0xe8b797, 0xe8b79a,
+ /* c8 */ 0xe8b79e, 0xe8b78e, 0xe8b78f, 0xe8b79b,
+ /* cc */ 0xe8b786, 0xe8b7ac, 0xe8b7b7, 0xe8b7b8,
+ /* d0 */ 0xe8b7a3, 0xe8b7b9, 0xe8b7bb, 0xe8b7a4,
+ /* d4 */ 0xe8b889, 0xe8b7bd, 0xe8b894, 0xe8b89d,
+ /* d8 */ 0xe8b89f, 0xe8b8ac, 0xe8b8ae, 0xe8b8a3,
+ /* dc */ 0xe8b8af, 0xe8b8ba, 0xe8b980, 0xe8b8b9,
+ /* e0 */ 0xe8b8b5, 0xe8b8bd, 0xe8b8b1, 0xe8b989,
+ /* e4 */ 0xe8b981, 0xe8b982, 0xe8b991, 0xe8b992,
+ /* e8 */ 0xe8b98a, 0xe8b9b0, 0xe8b9b6, 0xe8b9bc,
+ /* ec */ 0xe8b9af, 0xe8b9b4, 0xe8ba85, 0xe8ba8f,
+ /* f0 */ 0xe8ba94, 0xe8ba90, 0xe8ba9c, 0xe8ba9e,
+ /* f4 */ 0xe8b1b8, 0xe8b282, 0xe8b28a, 0xe8b285,
+ /* f8 */ 0xe8b298, 0xe8b294, 0xe6969b, 0xe8a796,
+ /* fc */ 0xe8a79e, 0xe8a79a, 0xe8a79c,
+
+ /*** Two byte table, leaf: f6xx - offset 0x0586b ***/
+
+ /* 40 */ 0xe9af9c, 0xe9af9d, 0xe9af9e, 0xe9af9f,
+ /* 44 */ 0xe9afa0, 0xe9afa1, 0xe9afa2, 0xe9afa3,
+ /* 48 */ 0xe9afa4, 0xe9afa5, 0xe9afa6, 0xe9afa7,
+ /* 4c */ 0xe9afa8, 0xe9afa9, 0xe9afaa, 0xe9afab,
+ /* 50 */ 0xe9afac, 0xe9afad, 0xe9afae, 0xe9afaf,
+ /* 54 */ 0xe9afb0, 0xe9afb1, 0xe9afb2, 0xe9afb3,
+ /* 58 */ 0xe9afb4, 0xe9afb5, 0xe9afb6, 0xe9afb7,
+ /* 5c */ 0xe9afb8, 0xe9afb9, 0xe9afba, 0xe9afbb,
+ /* 60 */ 0xe9afbc, 0xe9afbd, 0xe9afbe, 0xe9afbf,
+ /* 64 */ 0xe9b080, 0xe9b081, 0xe9b082, 0xe9b083,
+ /* 68 */ 0xe9b084, 0xe9b085, 0xe9b086, 0xe9b087,
+ /* 6c */ 0xe9b088, 0xe9b089, 0xe9b08a, 0xe9b08b,
+ /* 70 */ 0xe9b08c, 0xe9b08d, 0xe9b08e, 0xe9b08f,
+ /* 74 */ 0xe9b090, 0xe9b091, 0xe9b092, 0xe9b093,
+ /* 78 */ 0xe9b094, 0xe9b095, 0xe9b096, 0xe9b097,
+ /* 7c */ 0xe9b098, 0xe9b099, 0xe9b09a, 0x000000,
+ /* 80 */ 0xe9b09b, 0xe9b09c, 0xe9b09d, 0xe9b09e,
+ /* 84 */ 0xe9b09f, 0xe9b0a0, 0xe9b0a1, 0xe9b0a2,
+ /* 88 */ 0xe9b0a3, 0xe9b0a4, 0xe9b0a5, 0xe9b0a6,
+ /* 8c */ 0xe9b0a7, 0xe9b0a8, 0xe9b0a9, 0xe9b0aa,
+ /* 90 */ 0xe9b0ab, 0xe9b0ac, 0xe9b0ad, 0xe9b0ae,
+ /* 94 */ 0xe9b0af, 0xe9b0b0, 0xe9b0b1, 0xe9b0b2,
+ /* 98 */ 0xe9b0b3, 0xe9b0b4, 0xe9b0b5, 0xe9b0b6,
+ /* 9c */ 0xe9b0b7, 0xe9b0b8, 0xe9b0b9, 0xe9b0ba,
+ /* a0 */ 0xe9b0bb, 0xe8a7a5, 0xe8a7ab, 0xe8a7af,
+ /* a4 */ 0xe8a8be, 0xe8aca6, 0xe99d93, 0xe99ba9,
+ /* a8 */ 0xe99bb3, 0xe99baf, 0xe99c86, 0xe99c81,
+ /* ac */ 0xe99c88, 0xe99c8f, 0xe99c8e, 0xe99caa,
+ /* b0 */ 0xe99cad, 0xe99cb0, 0xe99cbe, 0xe9be80,
+ /* b4 */ 0xe9be83, 0xe9be85, 0xe9be86, 0xe9be87,
+ /* b8 */ 0xe9be88, 0xe9be89, 0xe9be8a, 0xe9be8c,
+ /* bc */ 0xe9bbbe, 0xe9bc8b, 0xe9bc8d, 0xe99ab9,
+ /* c0 */ 0xe99abc, 0xe99abd, 0xe99b8e, 0xe99b92,
+ /* c4 */ 0xe79ebf, 0xe99ba0, 0xe98a8e, 0xe98aae,
+ /* c8 */ 0xe98b88, 0xe98cbe, 0xe98daa, 0xe98f8a,
+ /* cc */ 0xe98e8f, 0xe990be, 0xe991ab, 0xe9b1bf,
+ /* d0 */ 0xe9b282, 0xe9b285, 0xe9b286, 0xe9b287,
+ /* d4 */ 0xe9b288, 0xe7a8a3, 0xe9b28b, 0xe9b28e,
+ /* d8 */ 0xe9b290, 0xe9b291, 0xe9b292, 0xe9b294,
+ /* dc */ 0xe9b295, 0xe9b29a, 0xe9b29b, 0xe9b29e,
+ /* e0 */ 0xe9b29f, 0xe9b2a0, 0xe9b2a1, 0xe9b2a2,
+ /* e4 */ 0xe9b2a3, 0xe9b2a5, 0xe9b2a6, 0xe9b2a7,
+ /* e8 */ 0xe9b2a8, 0xe9b2a9, 0xe9b2ab, 0xe9b2ad,
+ /* ec */ 0xe9b2ae, 0xe9b2b0, 0xe9b2b1, 0xe9b2b2,
+ /* f0 */ 0xe9b2b3, 0xe9b2b4, 0xe9b2b5, 0xe9b2b6,
+ /* f4 */ 0xe9b2b7, 0xe9b2ba, 0xe9b2bb, 0xe9b2bc,
+ /* f8 */ 0xe9b2bd, 0xe9b384, 0xe9b385, 0xe9b386,
+ /* fc */ 0xe9b387, 0xe9b38a, 0xe9b38b,
+
+ /*** Two byte table, leaf: f7xx - offset 0x0592a ***/
+
+ /* 40 */ 0xe9b0bc, 0xe9b0bd, 0xe9b0be, 0xe9b0bf,
+ /* 44 */ 0xe9b180, 0xe9b181, 0xe9b182, 0xe9b183,
+ /* 48 */ 0xe9b184, 0xe9b185, 0xe9b186, 0xe9b187,
+ /* 4c */ 0xe9b188, 0xe9b189, 0xe9b18a, 0xe9b18b,
+ /* 50 */ 0xe9b18c, 0xe9b18d, 0xe9b18e, 0xe9b18f,
+ /* 54 */ 0xe9b190, 0xe9b191, 0xe9b192, 0xe9b193,
+ /* 58 */ 0xe9b194, 0xe9b195, 0xe9b196, 0xe9b197,
+ /* 5c */ 0xe9b198, 0xe9b199, 0xe9b19a, 0xe9b19b,
+ /* 60 */ 0xe9b19c, 0xe9b19d, 0xe9b19e, 0xe9b19f,
+ /* 64 */ 0xe9b1a0, 0xe9b1a1, 0xe9b1a2, 0xe9b1a3,
+ /* 68 */ 0xe9b1a4, 0xe9b1a5, 0xe9b1a6, 0xe9b1a7,
+ /* 6c */ 0xe9b1a8, 0xe9b1a9, 0xe9b1aa, 0xe9b1ab,
+ /* 70 */ 0xe9b1ac, 0xe9b1ad, 0xe9b1ae, 0xe9b1af,
+ /* 74 */ 0xe9b1b0, 0xe9b1b1, 0xe9b1b2, 0xe9b1b3,
+ /* 78 */ 0xe9b1b4, 0xe9b1b5, 0xe9b1b6, 0xe9b1b7,
+ /* 7c */ 0xe9b1b8, 0xe9b1b9, 0xe9b1ba, 0x000000,
+ /* 80 */ 0xe9b1bb, 0xe9b1bd, 0xe9b1be, 0xe9b280,
+ /* 84 */ 0xe9b283, 0xe9b284, 0xe9b289, 0xe9b28a,
+ /* 88 */ 0xe9b28c, 0xe9b28f, 0xe9b293, 0xe9b296,
+ /* 8c */ 0xe9b297, 0xe9b298, 0xe9b299, 0xe9b29d,
+ /* 90 */ 0xe9b2aa, 0xe9b2ac, 0xe9b2af, 0xe9b2b9,
+ /* 94 */ 0xe9b2be, 0xe9b2bf, 0xe9b380, 0xe9b381,
+ /* 98 */ 0xe9b382, 0xe9b388, 0xe9b389, 0xe9b391,
+ /* 9c */ 0xe9b392, 0xe9b39a, 0xe9b39b, 0xe9b3a0,
+ /* a0 */ 0xe9b3a1, 0xe9b38c, 0xe9b38d, 0xe9b38e,
+ /* a4 */ 0xe9b38f, 0xe9b390, 0xe9b393, 0xe9b394,
+ /* a8 */ 0xe9b395, 0xe9b397, 0xe9b398, 0xe9b399,
+ /* ac */ 0xe9b39c, 0xe9b39d, 0xe9b39f, 0xe9b3a2,
+ /* b0 */ 0xe99dbc, 0xe99e85, 0xe99e91, 0xe99e92,
+ /* b4 */ 0xe99e94, 0xe99eaf, 0xe99eab, 0xe99ea3,
+ /* b8 */ 0xe99eb2, 0xe99eb4, 0xe9aab1, 0xe9aab0,
+ /* bc */ 0xe9aab7, 0xe9b998, 0xe9aab6, 0xe9aaba,
+ /* c0 */ 0xe9aabc, 0xe9ab81, 0xe9ab80, 0xe9ab85,
+ /* c4 */ 0xe9ab82, 0xe9ab8b, 0xe9ab8c, 0xe9ab91,
+ /* c8 */ 0xe9ad85, 0xe9ad83, 0xe9ad87, 0xe9ad89,
+ /* cc */ 0xe9ad88, 0xe9ad8d, 0xe9ad91, 0xe9a3a8,
+ /* d0 */ 0xe9a48d, 0xe9a4ae, 0xe9a595, 0xe9a594,
+ /* d4 */ 0xe9ab9f, 0xe9aba1, 0xe9aba6, 0xe9abaf,
+ /* d8 */ 0xe9abab, 0xe9abbb, 0xe9abad, 0xe9abb9,
+ /* dc */ 0xe9ac88, 0xe9ac8f, 0xe9ac93, 0xe9ac9f,
+ /* e0 */ 0xe9aca3, 0xe9babd, 0xe9babe, 0xe7b8bb,
+ /* e4 */ 0xe9ba82, 0xe9ba87, 0xe9ba88, 0xe9ba8b,
+ /* e8 */ 0xe9ba92, 0xe98f96, 0xe9ba9d, 0xe9ba9f,
+ /* ec */ 0xe9bb9b, 0xe9bb9c, 0xe9bb9d, 0xe9bba0,
+ /* f0 */ 0xe9bb9f, 0xe9bba2, 0xe9bba9, 0xe9bba7,
+ /* f4 */ 0xe9bba5, 0xe9bbaa, 0xe9bbaf, 0xe9bca2,
+ /* f8 */ 0xe9bcac, 0xe9bcaf, 0xe9bcb9, 0xe9bcb7,
+ /* fc */ 0xe9bcbd, 0xe9bcbe, 0xe9bd84,
+
+ /*** Two byte table, leaf: f8xx - offset 0x059e9 ***/
+
+ /* 40 */ 0xe9b3a3, 0xe9b3a4, 0xe9b3a5, 0xe9b3a6,
+ /* 44 */ 0xe9b3a7, 0xe9b3a8, 0xe9b3a9, 0xe9b3aa,
+ /* 48 */ 0xe9b3ab, 0xe9b3ac, 0xe9b3ad, 0xe9b3ae,
+ /* 4c */ 0xe9b3af, 0xe9b3b0, 0xe9b3b1, 0xe9b3b2,
+ /* 50 */ 0xe9b3b3, 0xe9b3b4, 0xe9b3b5, 0xe9b3b6,
+ /* 54 */ 0xe9b3b7, 0xe9b3b8, 0xe9b3b9, 0xe9b3ba,
+ /* 58 */ 0xe9b3bb, 0xe9b3bc, 0xe9b3bd, 0xe9b3be,
+ /* 5c */ 0xe9b3bf, 0xe9b480, 0xe9b481, 0xe9b482,
+ /* 60 */ 0xe9b483, 0xe9b484, 0xe9b485, 0xe9b486,
+ /* 64 */ 0xe9b487, 0xe9b488, 0xe9b489, 0xe9b48a,
+ /* 68 */ 0xe9b48b, 0xe9b48c, 0xe9b48d, 0xe9b48e,
+ /* 6c */ 0xe9b48f, 0xe9b490, 0xe9b491, 0xe9b492,
+ /* 70 */ 0xe9b493, 0xe9b494, 0xe9b495, 0xe9b496,
+ /* 74 */ 0xe9b497, 0xe9b498, 0xe9b499, 0xe9b49a,
+ /* 78 */ 0xe9b49b, 0xe9b49c, 0xe9b49d, 0xe9b49e,
+ /* 7c */ 0xe9b49f, 0xe9b4a0, 0xe9b4a1, 0x000000,
+ /* 80 */ 0xe9b4a2, 0xe9b4a3, 0xe9b4a4, 0xe9b4a5,
+ /* 84 */ 0xe9b4a6, 0xe9b4a7, 0xe9b4a8, 0xe9b4a9,
+ /* 88 */ 0xe9b4aa, 0xe9b4ab, 0xe9b4ac, 0xe9b4ad,
+ /* 8c */ 0xe9b4ae, 0xe9b4af, 0xe9b4b0, 0xe9b4b1,
+ /* 90 */ 0xe9b4b2, 0xe9b4b3, 0xe9b4b4, 0xe9b4b5,
+ /* 94 */ 0xe9b4b6, 0xe9b4b7, 0xe9b4b8, 0xe9b4b9,
+ /* 98 */ 0xe9b4ba, 0xe9b4bb, 0xe9b4bc, 0xe9b4bd,
+ /* 9c */ 0xe9b4be, 0xe9b4bf, 0xe9b580, 0xe9b581,
+ /* a0 */ 0xe9b582, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: f9xx - offset 0x05aa8 ***/
+
+ /* 40 */ 0xe9b583, 0xe9b584, 0xe9b585, 0xe9b586,
+ /* 44 */ 0xe9b587, 0xe9b588, 0xe9b589, 0xe9b58a,
+ /* 48 */ 0xe9b58b, 0xe9b58c, 0xe9b58d, 0xe9b58e,
+ /* 4c */ 0xe9b58f, 0xe9b590, 0xe9b591, 0xe9b592,
+ /* 50 */ 0xe9b593, 0xe9b594, 0xe9b595, 0xe9b596,
+ /* 54 */ 0xe9b597, 0xe9b598, 0xe9b599, 0xe9b59a,
+ /* 58 */ 0xe9b59b, 0xe9b59c, 0xe9b59d, 0xe9b59e,
+ /* 5c */ 0xe9b59f, 0xe9b5a0, 0xe9b5a1, 0xe9b5a2,
+ /* 60 */ 0xe9b5a3, 0xe9b5a4, 0xe9b5a5, 0xe9b5a6,
+ /* 64 */ 0xe9b5a7, 0xe9b5a8, 0xe9b5a9, 0xe9b5aa,
+ /* 68 */ 0xe9b5ab, 0xe9b5ac, 0xe9b5ad, 0xe9b5ae,
+ /* 6c */ 0xe9b5af, 0xe9b5b0, 0xe9b5b1, 0xe9b5b2,
+ /* 70 */ 0xe9b5b3, 0xe9b5b4, 0xe9b5b5, 0xe9b5b6,
+ /* 74 */ 0xe9b5b7, 0xe9b5b8, 0xe9b5b9, 0xe9b5ba,
+ /* 78 */ 0xe9b5bb, 0xe9b5bc, 0xe9b5bd, 0xe9b5be,
+ /* 7c */ 0xe9b5bf, 0xe9b680, 0xe9b681, 0x000000,
+ /* 80 */ 0xe9b682, 0xe9b683, 0xe9b684, 0xe9b685,
+ /* 84 */ 0xe9b686, 0xe9b687, 0xe9b688, 0xe9b689,
+ /* 88 */ 0xe9b68a, 0xe9b68b, 0xe9b68c, 0xe9b68d,
+ /* 8c */ 0xe9b68e, 0xe9b68f, 0xe9b690, 0xe9b691,
+ /* 90 */ 0xe9b692, 0xe9b693, 0xe9b694, 0xe9b695,
+ /* 94 */ 0xe9b696, 0xe9b697, 0xe9b698, 0xe9b699,
+ /* 98 */ 0xe9b69a, 0xe9b69b, 0xe9b69c, 0xe9b69d,
+ /* 9c */ 0xe9b69e, 0xe9b69f, 0xe9b6a0, 0xe9b6a1,
+ /* a0 */ 0xe9b6a2, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: faxx - offset 0x05b67 ***/
+
+ /* 40 */ 0xe9b6a3, 0xe9b6a4, 0xe9b6a5, 0xe9b6a6,
+ /* 44 */ 0xe9b6a7, 0xe9b6a8, 0xe9b6a9, 0xe9b6aa,
+ /* 48 */ 0xe9b6ab, 0xe9b6ac, 0xe9b6ad, 0xe9b6ae,
+ /* 4c */ 0xe9b6af, 0xe9b6b0, 0xe9b6b1, 0xe9b6b2,
+ /* 50 */ 0xe9b6b3, 0xe9b6b4, 0xe9b6b5, 0xe9b6b6,
+ /* 54 */ 0xe9b6b7, 0xe9b6b8, 0xe9b6b9, 0xe9b6ba,
+ /* 58 */ 0xe9b6bb, 0xe9b6bc, 0xe9b6bd, 0xe9b6be,
+ /* 5c */ 0xe9b6bf, 0xe9b780, 0xe9b781, 0xe9b782,
+ /* 60 */ 0xe9b783, 0xe9b784, 0xe9b785, 0xe9b786,
+ /* 64 */ 0xe9b787, 0xe9b788, 0xe9b789, 0xe9b78a,
+ /* 68 */ 0xe9b78b, 0xe9b78c, 0xe9b78d, 0xe9b78e,
+ /* 6c */ 0xe9b78f, 0xe9b790, 0xe9b791, 0xe9b792,
+ /* 70 */ 0xe9b793, 0xe9b794, 0xe9b795, 0xe9b796,
+ /* 74 */ 0xe9b797, 0xe9b798, 0xe9b799, 0xe9b79a,
+ /* 78 */ 0xe9b79b, 0xe9b79c, 0xe9b79d, 0xe9b79e,
+ /* 7c */ 0xe9b79f, 0xe9b7a0, 0xe9b7a1, 0x000000,
+ /* 80 */ 0xe9b7a2, 0xe9b7a3, 0xe9b7a4, 0xe9b7a5,
+ /* 84 */ 0xe9b7a6, 0xe9b7a7, 0xe9b7a8, 0xe9b7a9,
+ /* 88 */ 0xe9b7aa, 0xe9b7ab, 0xe9b7ac, 0xe9b7ad,
+ /* 8c */ 0xe9b7ae, 0xe9b7af, 0xe9b7b0, 0xe9b7b1,
+ /* 90 */ 0xe9b7b2, 0xe9b7b3, 0xe9b7b4, 0xe9b7b5,
+ /* 94 */ 0xe9b7b6, 0xe9b7b7, 0xe9b7b8, 0xe9b7b9,
+ /* 98 */ 0xe9b7ba, 0xe9b7bb, 0xe9b7bc, 0xe9b7bd,
+ /* 9c */ 0xe9b7be, 0xe9b7bf, 0xe9b880, 0xe9b881,
+ /* a0 */ 0xe9b882, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: fbxx - offset 0x05c26 ***/
+
+ /* 40 */ 0xe9b883, 0xe9b884, 0xe9b885, 0xe9b886,
+ /* 44 */ 0xe9b887, 0xe9b888, 0xe9b889, 0xe9b88a,
+ /* 48 */ 0xe9b88b, 0xe9b88c, 0xe9b88d, 0xe9b88e,
+ /* 4c */ 0xe9b88f, 0xe9b890, 0xe9b891, 0xe9b892,
+ /* 50 */ 0xe9b893, 0xe9b894, 0xe9b895, 0xe9b896,
+ /* 54 */ 0xe9b897, 0xe9b898, 0xe9b899, 0xe9b89a,
+ /* 58 */ 0xe9b89b, 0xe9b89c, 0xe9b89d, 0xe9b89e,
+ /* 5c */ 0xe9b8a4, 0xe9b8a7, 0xe9b8ae, 0xe9b8b0,
+ /* 60 */ 0xe9b8b4, 0xe9b8bb, 0xe9b8bc, 0xe9b980,
+ /* 64 */ 0xe9b98d, 0xe9b990, 0xe9b992, 0xe9b993,
+ /* 68 */ 0xe9b994, 0xe9b996, 0xe9b999, 0xe9b99d,
+ /* 6c */ 0xe9b99f, 0xe9b9a0, 0xe9b9a1, 0xe9b9a2,
+ /* 70 */ 0xe9b9a5, 0xe9b9ae, 0xe9b9af, 0xe9b9b2,
+ /* 74 */ 0xe9b9b4, 0xe9b9b5, 0xe9b9b6, 0xe9b9b7,
+ /* 78 */ 0xe9b9b8, 0xe9b9b9, 0xe9b9ba, 0xe9b9bb,
+ /* 7c */ 0xe9b9bc, 0xe9b9bd, 0xe9ba80, 0x000000,
+ /* 80 */ 0xe9ba81, 0xe9ba83, 0xe9ba84, 0xe9ba85,
+ /* 84 */ 0xe9ba86, 0xe9ba89, 0xe9ba8a, 0xe9ba8c,
+ /* 88 */ 0xe9ba8d, 0xe9ba8e, 0xe9ba8f, 0xe9ba90,
+ /* 8c */ 0xe9ba91, 0xe9ba94, 0xe9ba95, 0xe9ba96,
+ /* 90 */ 0xe9ba97, 0xe9ba98, 0xe9ba99, 0xe9ba9a,
+ /* 94 */ 0xe9ba9b, 0xe9ba9c, 0xe9ba9e, 0xe9baa0,
+ /* 98 */ 0xe9baa1, 0xe9baa2, 0xe9baa3, 0xe9baa4,
+ /* 9c */ 0xe9baa5, 0xe9baa7, 0xe9baa8, 0xe9baa9,
+ /* a0 */ 0xe9baaa, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: fcxx - offset 0x05ce5 ***/
+
+ /* 40 */ 0xe9baab, 0xe9baac, 0xe9baad, 0xe9baae,
+ /* 44 */ 0xe9baaf, 0xe9bab0, 0xe9bab1, 0xe9bab2,
+ /* 48 */ 0xe9bab3, 0xe9bab5, 0xe9bab6, 0xe9bab7,
+ /* 4c */ 0xe9bab9, 0xe9baba, 0xe9babc, 0xe9babf,
+ /* 50 */ 0xe9bb80, 0xe9bb81, 0xe9bb82, 0xe9bb83,
+ /* 54 */ 0xe9bb85, 0xe9bb86, 0xe9bb87, 0xe9bb88,
+ /* 58 */ 0xe9bb8a, 0xe9bb8b, 0xe9bb8c, 0xe9bb90,
+ /* 5c */ 0xe9bb92, 0xe9bb93, 0xe9bb95, 0xe9bb96,
+ /* 60 */ 0xe9bb97, 0xe9bb99, 0xe9bb9a, 0xe9bb9e,
+ /* 64 */ 0xe9bba1, 0xe9bba3, 0xe9bba4, 0xe9bba6,
+ /* 68 */ 0xe9bba8, 0xe9bbab, 0xe9bbac, 0xe9bbad,
+ /* 6c */ 0xe9bbae, 0xe9bbb0, 0xe9bbb1, 0xe9bbb2,
+ /* 70 */ 0xe9bbb3, 0xe9bbb4, 0xe9bbb5, 0xe9bbb6,
+ /* 74 */ 0xe9bbb7, 0xe9bbb8, 0xe9bbba, 0xe9bbbd,
+ /* 78 */ 0xe9bbbf, 0xe9bc80, 0xe9bc81, 0xe9bc82,
+ /* 7c */ 0xe9bc83, 0xe9bc84, 0xe9bc85, 0x000000,
+ /* 80 */ 0xe9bc86, 0xe9bc87, 0xe9bc88, 0xe9bc89,
+ /* 84 */ 0xe9bc8a, 0xe9bc8c, 0xe9bc8f, 0xe9bc91,
+ /* 88 */ 0xe9bc92, 0xe9bc94, 0xe9bc95, 0xe9bc96,
+ /* 8c */ 0xe9bc98, 0xe9bc9a, 0xe9bc9b, 0xe9bc9c,
+ /* 90 */ 0xe9bc9d, 0xe9bc9e, 0xe9bc9f, 0xe9bca1,
+ /* 94 */ 0xe9bca3, 0xe9bca4, 0xe9bca5, 0xe9bca6,
+ /* 98 */ 0xe9bca7, 0xe9bca8, 0xe9bca9, 0xe9bcaa,
+ /* 9c */ 0xe9bcab, 0xe9bcad, 0xe9bcae, 0xe9bcb0,
+ /* a0 */ 0xe9bcb1, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: fdxx - offset 0x05da4 ***/
+
+ /* 40 */ 0xe9bcb2, 0xe9bcb3, 0xe9bcb4, 0xe9bcb5,
+ /* 44 */ 0xe9bcb6, 0xe9bcb8, 0xe9bcba, 0xe9bcbc,
+ /* 48 */ 0xe9bcbf, 0xe9bd80, 0xe9bd81, 0xe9bd82,
+ /* 4c */ 0xe9bd83, 0xe9bd85, 0xe9bd86, 0xe9bd87,
+ /* 50 */ 0xe9bd88, 0xe9bd89, 0xe9bd8a, 0xe9bd8b,
+ /* 54 */ 0xe9bd8c, 0xe9bd8d, 0xe9bd8e, 0xe9bd8f,
+ /* 58 */ 0xe9bd92, 0xe9bd93, 0xe9bd94, 0xe9bd95,
+ /* 5c */ 0xe9bd96, 0xe9bd97, 0xe9bd98, 0xe9bd99,
+ /* 60 */ 0xe9bd9a, 0xe9bd9b, 0xe9bd9c, 0xe9bd9d,
+ /* 64 */ 0xe9bd9e, 0xe9bd9f, 0xe9bda0, 0xe9bda1,
+ /* 68 */ 0xe9bda2, 0xe9bda3, 0xe9bda4, 0xe9bda5,
+ /* 6c */ 0xe9bda6, 0xe9bda7, 0xe9bda8, 0xe9bda9,
+ /* 70 */ 0xe9bdaa, 0xe9bdab, 0xe9bdac, 0xe9bdad,
+ /* 74 */ 0xe9bdae, 0xe9bdaf, 0xe9bdb0, 0xe9bdb1,
+ /* 78 */ 0xe9bdb2, 0xe9bdb3, 0xe9bdb4, 0xe9bdb5,
+ /* 7c */ 0xe9bdb6, 0xe9bdb7, 0xe9bdb8, 0x000000,
+ /* 80 */ 0xe9bdb9, 0xe9bdba, 0xe9bdbb, 0xe9bdbc,
+ /* 84 */ 0xe9bdbd, 0xe9bdbe, 0xe9be81, 0xe9be82,
+ /* 88 */ 0xe9be8d, 0xe9be8e, 0xe9be8f, 0xe9be90,
+ /* 8c */ 0xe9be91, 0xe9be92, 0xe9be93, 0xe9be94,
+ /* 90 */ 0xe9be95, 0xe9be96, 0xe9be97, 0xe9be98,
+ /* 94 */ 0xe9be9c, 0xe9be9d, 0xe9be9e, 0xe9bea1,
+ /* 98 */ 0xe9bea2, 0xe9bea3, 0xe9bea4, 0xe9bea5,
+ /* 9c */ 0xefa4ac, 0xefa5b9, 0xefa695, 0xefa7a7,
+ /* a0 */ 0xefa7b1, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: fexx - offset 0x05e63 ***/
+
+ /* 40 */ 0xefa88c, 0xefa88d, 0xefa88e, 0xefa88f,
+ /* 44 */ 0xefa891, 0xefa893, 0xefa894, 0xefa898,
+ /* 48 */ 0xefa89f, 0xefa8a0, 0xefa8a1, 0xefa8a3,
+ /* 4c */ 0xefa8a4, 0xefa8a7, 0xefa8a8, 0xefa8a9,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000, 0x000000, 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_10_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_10_to_utf8.map
new file mode 100644
index 0000000..3360484
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_10_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_10_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_10_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_10_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_10_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_10_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0x00c484, 0x00c492, 0x00c4a2,
+ /* a4 */ 0x00c4aa, 0x00c4a8, 0x00c4b6, 0x00c2a7,
+ /* a8 */ 0x00c4bb, 0x00c490, 0x00c5a0, 0x00c5a6,
+ /* ac */ 0x00c5bd, 0x00c2ad, 0x00c5aa, 0x00c58a,
+ /* b0 */ 0x00c2b0, 0x00c485, 0x00c493, 0x00c4a3,
+ /* b4 */ 0x00c4ab, 0x00c4a9, 0x00c4b7, 0x00c2b7,
+ /* b8 */ 0x00c4bc, 0x00c491, 0x00c5a1, 0x00c5a7,
+ /* bc */ 0x00c5be, 0xe28095, 0x00c5ab, 0x00c58b,
+ /* c0 */ 0x00c480, 0x00c381, 0x00c382, 0x00c383,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c4ae,
+ /* c8 */ 0x00c48c, 0x00c389, 0x00c498, 0x00c38b,
+ /* cc */ 0x00c496, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c390, 0x00c585, 0x00c58c, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c395, 0x00c396, 0x00c5a8,
+ /* d8 */ 0x00c398, 0x00c5b2, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c39d, 0x00c39e, 0x00c39f,
+ /* e0 */ 0x00c481, 0x00c3a1, 0x00c3a2, 0x00c3a3,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c4af,
+ /* e8 */ 0x00c48d, 0x00c3a9, 0x00c499, 0x00c3ab,
+ /* ec */ 0x00c497, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c3b0, 0x00c586, 0x00c58d, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0x00c5a9,
+ /* f8 */ 0x00c3b8, 0x00c5b3, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c3bd, 0x00c3be, 0x00c4b8
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_13_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_13_to_utf8.map
new file mode 100644
index 0000000..462f142
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_13_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_13_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_13_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_13_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_13_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_13_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0xe2809d, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0xe2809e, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c398, 0x00c2a9, 0x00c596, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c386,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0xe2809c, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c3b8, 0x00c2b9, 0x00c597, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c3a6,
+ /* c0 */ 0x00c484, 0x00c4ae, 0x00c480, 0x00c486,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c498, 0x00c492,
+ /* c8 */ 0x00c48c, 0x00c389, 0x00c5b9, 0x00c496,
+ /* cc */ 0x00c4a2, 0x00c4b6, 0x00c4aa, 0x00c4bb,
+ /* d0 */ 0x00c5a0, 0x00c583, 0x00c585, 0x00c393,
+ /* d4 */ 0x00c58c, 0x00c395, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c5b2, 0x00c581, 0x00c59a, 0x00c5aa,
+ /* dc */ 0x00c39c, 0x00c5bb, 0x00c5bd, 0x00c39f,
+ /* e0 */ 0x00c485, 0x00c4af, 0x00c481, 0x00c487,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c499, 0x00c493,
+ /* e8 */ 0x00c48d, 0x00c3a9, 0x00c5ba, 0x00c497,
+ /* ec */ 0x00c4a3, 0x00c4b7, 0x00c4ab, 0x00c4bc,
+ /* f0 */ 0x00c5a1, 0x00c584, 0x00c586, 0x00c3b3,
+ /* f4 */ 0x00c58d, 0x00c3b5, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c5b3, 0x00c582, 0x00c59b, 0x00c5ab,
+ /* fc */ 0x00c3bc, 0x00c5bc, 0x00c5be, 0xe28099
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_14_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_14_to_utf8.map
new file mode 100644
index 0000000..177227d
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_14_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_14_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_14_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_14_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_14_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_14_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0xe1b882, 0xe1b883, 0x00c2a3,
+ /* a4 */ 0x00c48a, 0x00c48b, 0xe1b88a, 0x00c2a7,
+ /* a8 */ 0xe1ba80, 0x00c2a9, 0xe1ba82, 0xe1b88b,
+ /* ac */ 0xe1bbb2, 0x00c2ad, 0x00c2ae, 0x00c5b8,
+ /* b0 */ 0xe1b89e, 0xe1b89f, 0x00c4a0, 0x00c4a1,
+ /* b4 */ 0xe1b980, 0xe1b981, 0x00c2b6, 0xe1b996,
+ /* b8 */ 0xe1ba81, 0xe1b997, 0xe1ba83, 0xe1b9a0,
+ /* bc */ 0xe1bbb3, 0xe1ba84, 0xe1ba85, 0xe1b9a1,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c383,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c5b4, 0x00c391, 0x00c392, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c395, 0x00c396, 0xe1b9aa,
+ /* d8 */ 0x00c398, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c39d, 0x00c5b6, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c3a3,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00c3ac, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c5b5, 0x00c3b1, 0x00c3b2, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0xe1b9ab,
+ /* f8 */ 0x00c3b8, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c3bd, 0x00c5b7, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_15_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_15_to_utf8.map
new file mode 100644
index 0000000..f78caa3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_15_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_15_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_15_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_15_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_15_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_15_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0x00c2a1, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0xe282ac, 0x00c2a5, 0x00c5a0, 0x00c2a7,
+ /* a8 */ 0x00c5a1, 0x00c2a9, 0x00c2aa, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c5bd, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c5be, 0x00c2b9, 0x00c2ba, 0x00c2bb,
+ /* bc */ 0x00c592, 0x00c593, 0x00c5b8, 0x00c2bf,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c383,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c390, 0x00c391, 0x00c392, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c395, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c398, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c39d, 0x00c39e, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c3a3,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00c3ac, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c3b0, 0x00c3b1, 0x00c3b2, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c3b8, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c3bd, 0x00c3be, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_16_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_16_to_utf8.map
new file mode 100644
index 0000000..c45bb61
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_16_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_16_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_16_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_16_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_16_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_16_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0x00c484, 0x00c485, 0x00c581,
+ /* a4 */ 0xe282ac, 0xe2809e, 0x00c5a0, 0x00c2a7,
+ /* a8 */ 0x00c5a1, 0x00c2a9, 0x00c898, 0x00c2ab,
+ /* ac */ 0x00c5b9, 0x00c2ad, 0x00c5ba, 0x00c5bb,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c48c, 0x00c582,
+ /* b4 */ 0x00c5bd, 0xe2809d, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c5be, 0x00c48d, 0x00c899, 0x00c2bb,
+ /* bc */ 0x00c592, 0x00c593, 0x00c5b8, 0x00c5bc,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c482,
+ /* c4 */ 0x00c384, 0x00c486, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c490, 0x00c583, 0x00c392, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c590, 0x00c396, 0x00c59a,
+ /* d8 */ 0x00c5b0, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c498, 0x00c89a, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c483,
+ /* e4 */ 0x00c3a4, 0x00c487, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00c3ac, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c491, 0x00c584, 0x00c3b2, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c591, 0x00c3b6, 0x00c59b,
+ /* f8 */ 0x00c5b1, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c499, 0x00c89b, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_2_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_2_to_utf8.map
new file mode 100644
index 0000000..bf86cb4
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_2_to_utf8.map
@@ -0,0 +1,79 @@
+/* src/backend/utils/mb/Unicode/iso8859_2_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_2_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_2_to_unicode_tree =
+{
+ iso8859_2_to_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_2_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287,
+ /* 88 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f,
+ /* 90 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297,
+ /* 98 */ 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f,
+ /* a0 */ 0xc2a0, 0xc484, 0xcb98, 0xc581, 0xc2a4, 0xc4bd, 0xc59a, 0xc2a7,
+ /* a8 */ 0xc2a8, 0xc5a0, 0xc59e, 0xc5a4, 0xc5b9, 0xc2ad, 0xc5bd, 0xc5bb,
+ /* b0 */ 0xc2b0, 0xc485, 0xcb9b, 0xc582, 0xc2b4, 0xc4be, 0xc59b, 0xcb87,
+ /* b8 */ 0xc2b8, 0xc5a1, 0xc59f, 0xc5a5, 0xc5ba, 0xcb9d, 0xc5be, 0xc5bc,
+ /* c0 */ 0xc594, 0xc381, 0xc382, 0xc482, 0xc384, 0xc4b9, 0xc486, 0xc387,
+ /* c8 */ 0xc48c, 0xc389, 0xc498, 0xc38b, 0xc49a, 0xc38d, 0xc38e, 0xc48e,
+ /* d0 */ 0xc490, 0xc583, 0xc587, 0xc393, 0xc394, 0xc590, 0xc396, 0xc397,
+ /* d8 */ 0xc598, 0xc5ae, 0xc39a, 0xc5b0, 0xc39c, 0xc39d, 0xc5a2, 0xc39f,
+ /* e0 */ 0xc595, 0xc3a1, 0xc3a2, 0xc483, 0xc3a4, 0xc4ba, 0xc487, 0xc3a7,
+ /* e8 */ 0xc48d, 0xc3a9, 0xc499, 0xc3ab, 0xc49b, 0xc3ad, 0xc3ae, 0xc48f,
+ /* f0 */ 0xc491, 0xc584, 0xc588, 0xc3b3, 0xc3b4, 0xc591, 0xc3b6, 0xc3b7,
+ /* f8 */ 0xc599, 0xc5af, 0xc3ba, 0xc5b1, 0xc3bc, 0xc3bd, 0xc5a3, 0xcb99
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_3_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_3_to_utf8.map
new file mode 100644
index 0000000..5f7a1b0
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_3_to_utf8.map
@@ -0,0 +1,79 @@
+/* src/backend/utils/mb/Unicode/iso8859_3_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_3_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_3_to_unicode_tree =
+{
+ iso8859_3_to_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_3_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287,
+ /* 88 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f,
+ /* 90 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297,
+ /* 98 */ 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f,
+ /* a0 */ 0xc2a0, 0xc4a6, 0xcb98, 0xc2a3, 0xc2a4, 0x0000, 0xc4a4, 0xc2a7,
+ /* a8 */ 0xc2a8, 0xc4b0, 0xc59e, 0xc49e, 0xc4b4, 0xc2ad, 0x0000, 0xc5bb,
+ /* b0 */ 0xc2b0, 0xc4a7, 0xc2b2, 0xc2b3, 0xc2b4, 0xc2b5, 0xc4a5, 0xc2b7,
+ /* b8 */ 0xc2b8, 0xc4b1, 0xc59f, 0xc49f, 0xc4b5, 0xc2bd, 0x0000, 0xc5bc,
+ /* c0 */ 0xc380, 0xc381, 0xc382, 0x0000, 0xc384, 0xc48a, 0xc488, 0xc387,
+ /* c8 */ 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f,
+ /* d0 */ 0x0000, 0xc391, 0xc392, 0xc393, 0xc394, 0xc4a0, 0xc396, 0xc397,
+ /* d8 */ 0xc49c, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc5ac, 0xc59c, 0xc39f,
+ /* e0 */ 0xc3a0, 0xc3a1, 0xc3a2, 0x0000, 0xc3a4, 0xc48b, 0xc489, 0xc3a7,
+ /* e8 */ 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af,
+ /* f0 */ 0x0000, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc4a1, 0xc3b6, 0xc3b7,
+ /* f8 */ 0xc49d, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc5ad, 0xc59d, 0xcb99
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_4_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_4_to_utf8.map
new file mode 100644
index 0000000..4222a60
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_4_to_utf8.map
@@ -0,0 +1,79 @@
+/* src/backend/utils/mb/Unicode/iso8859_4_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_4_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_4_to_unicode_tree =
+{
+ iso8859_4_to_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_4_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287,
+ /* 88 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f,
+ /* 90 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297,
+ /* 98 */ 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f,
+ /* a0 */ 0xc2a0, 0xc484, 0xc4b8, 0xc596, 0xc2a4, 0xc4a8, 0xc4bb, 0xc2a7,
+ /* a8 */ 0xc2a8, 0xc5a0, 0xc492, 0xc4a2, 0xc5a6, 0xc2ad, 0xc5bd, 0xc2af,
+ /* b0 */ 0xc2b0, 0xc485, 0xcb9b, 0xc597, 0xc2b4, 0xc4a9, 0xc4bc, 0xcb87,
+ /* b8 */ 0xc2b8, 0xc5a1, 0xc493, 0xc4a3, 0xc5a7, 0xc58a, 0xc5be, 0xc58b,
+ /* c0 */ 0xc480, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc4ae,
+ /* c8 */ 0xc48c, 0xc389, 0xc498, 0xc38b, 0xc496, 0xc38d, 0xc38e, 0xc4aa,
+ /* d0 */ 0xc490, 0xc585, 0xc58c, 0xc4b6, 0xc394, 0xc395, 0xc396, 0xc397,
+ /* d8 */ 0xc398, 0xc5b2, 0xc39a, 0xc39b, 0xc39c, 0xc5a8, 0xc5aa, 0xc39f,
+ /* e0 */ 0xc481, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc4af,
+ /* e8 */ 0xc48d, 0xc3a9, 0xc499, 0xc3ab, 0xc497, 0xc3ad, 0xc3ae, 0xc4ab,
+ /* f0 */ 0xc491, 0xc586, 0xc58d, 0xc4b7, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7,
+ /* f8 */ 0xc3b8, 0xc5b3, 0xc3ba, 0xc3bb, 0xc3bc, 0xc5a9, 0xc5ab, 0xcb99
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_5_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_5_to_utf8.map
new file mode 100644
index 0000000..dd4987e
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_5_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_5_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_5_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_5_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_5_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_5_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0x00d081, 0x00d082, 0x00d083,
+ /* a4 */ 0x00d084, 0x00d085, 0x00d086, 0x00d087,
+ /* a8 */ 0x00d088, 0x00d089, 0x00d08a, 0x00d08b,
+ /* ac */ 0x00d08c, 0x00c2ad, 0x00d08e, 0x00d08f,
+ /* b0 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* b4 */ 0x00d094, 0x00d095, 0x00d096, 0x00d097,
+ /* b8 */ 0x00d098, 0x00d099, 0x00d09a, 0x00d09b,
+ /* bc */ 0x00d09c, 0x00d09d, 0x00d09e, 0x00d09f,
+ /* c0 */ 0x00d0a0, 0x00d0a1, 0x00d0a2, 0x00d0a3,
+ /* c4 */ 0x00d0a4, 0x00d0a5, 0x00d0a6, 0x00d0a7,
+ /* c8 */ 0x00d0a8, 0x00d0a9, 0x00d0aa, 0x00d0ab,
+ /* cc */ 0x00d0ac, 0x00d0ad, 0x00d0ae, 0x00d0af,
+ /* d0 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d4 */ 0x00d0b4, 0x00d0b5, 0x00d0b6, 0x00d0b7,
+ /* d8 */ 0x00d0b8, 0x00d0b9, 0x00d0ba, 0x00d0bb,
+ /* dc */ 0x00d0bc, 0x00d0bd, 0x00d0be, 0x00d0bf,
+ /* e0 */ 0x00d180, 0x00d181, 0x00d182, 0x00d183,
+ /* e4 */ 0x00d184, 0x00d185, 0x00d186, 0x00d187,
+ /* e8 */ 0x00d188, 0x00d189, 0x00d18a, 0x00d18b,
+ /* ec */ 0x00d18c, 0x00d18d, 0x00d18e, 0x00d18f,
+ /* f0 */ 0xe28496, 0x00d191, 0x00d192, 0x00d193,
+ /* f4 */ 0x00d194, 0x00d195, 0x00d196, 0x00d197,
+ /* f8 */ 0x00d198, 0x00d199, 0x00d19a, 0x00d19b,
+ /* fc */ 0x00d19c, 0x00c2a7, 0x00d19e, 0x00d19f
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_6_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_6_to_utf8.map
new file mode 100644
index 0000000..c47f30f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_6_to_utf8.map
@@ -0,0 +1,77 @@
+/* src/backend/utils/mb/Unicode/iso8859_6_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_6_to_unicode_tree_table[230];
+
+static const pg_mb_radix_tree iso8859_6_to_unicode_tree =
+{
+ iso8859_6_to_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0073, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xf2, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_6_to_unicode_tree_table[230] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 70 */ 0x0000, 0x0000, 0x0000,
+
+ /*** Single byte table, leaf: xx - offset 0x00073 ***/
+
+ /* 80 */ 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287,
+ /* 88 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f,
+ /* 90 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297,
+ /* 98 */ 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f,
+ /* a0 */ 0xc2a0, 0x0000, 0x0000, 0x0000, 0xc2a4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd88c, 0xc2ad, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd89b, 0x0000, 0x0000, 0x0000, 0xd89f,
+ /* c0 */ 0x0000, 0xd8a1, 0xd8a2, 0xd8a3, 0xd8a4, 0xd8a5, 0xd8a6, 0xd8a7,
+ /* c8 */ 0xd8a8, 0xd8a9, 0xd8aa, 0xd8ab, 0xd8ac, 0xd8ad, 0xd8ae, 0xd8af,
+ /* d0 */ 0xd8b0, 0xd8b1, 0xd8b2, 0xd8b3, 0xd8b4, 0xd8b5, 0xd8b6, 0xd8b7,
+ /* d8 */ 0xd8b8, 0xd8b9, 0xd8ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* e0 */ 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987,
+ /* e8 */ 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f,
+ /* f0 */ 0xd990, 0xd991, 0xd992
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_7_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_7_to_utf8.map
new file mode 100644
index 0000000..6b26060
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_7_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_7_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_7_to_unicode_tree_table[254];
+
+static const pg_mb_radix_tree iso8859_7_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_7_to_unicode_tree_table,
+
+ 0x007f, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xfe, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_7_to_unicode_tree_table[254] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x0007f ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0xe28098, 0xe28099, 0x00c2a3,
+ /* a4 */ 0xe282ac, 0xe282af, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00cdba, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x000000, 0xe28095,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00ce84, 0x00ce85, 0x00ce86, 0x00c2b7,
+ /* b8 */ 0x00ce88, 0x00ce89, 0x00ce8a, 0x00c2bb,
+ /* bc */ 0x00ce8c, 0x00c2bd, 0x00ce8e, 0x00ce8f,
+ /* c0 */ 0x00ce90, 0x00ce91, 0x00ce92, 0x00ce93,
+ /* c4 */ 0x00ce94, 0x00ce95, 0x00ce96, 0x00ce97,
+ /* c8 */ 0x00ce98, 0x00ce99, 0x00ce9a, 0x00ce9b,
+ /* cc */ 0x00ce9c, 0x00ce9d, 0x00ce9e, 0x00ce9f,
+ /* d0 */ 0x00cea0, 0x00cea1, 0x000000, 0x00cea3,
+ /* d4 */ 0x00cea4, 0x00cea5, 0x00cea6, 0x00cea7,
+ /* d8 */ 0x00cea8, 0x00cea9, 0x00ceaa, 0x00ceab,
+ /* dc */ 0x00ceac, 0x00cead, 0x00ceae, 0x00ceaf,
+ /* e0 */ 0x00ceb0, 0x00ceb1, 0x00ceb2, 0x00ceb3,
+ /* e4 */ 0x00ceb4, 0x00ceb5, 0x00ceb6, 0x00ceb7,
+ /* e8 */ 0x00ceb8, 0x00ceb9, 0x00ceba, 0x00cebb,
+ /* ec */ 0x00cebc, 0x00cebd, 0x00cebe, 0x00cebf,
+ /* f0 */ 0x00cf80, 0x00cf81, 0x00cf82, 0x00cf83,
+ /* f4 */ 0x00cf84, 0x00cf85, 0x00cf86, 0x00cf87,
+ /* f8 */ 0x00cf88, 0x00cf89, 0x00cf8a, 0x00cf8b,
+ /* fc */ 0x00cf8c, 0x00cf8d, 0x00cf8e
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_8_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_8_to_utf8.map
new file mode 100644
index 0000000..393788f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_8_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/iso8859_8_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 iso8859_8_to_unicode_tree_table[254];
+
+static const pg_mb_radix_tree iso8859_8_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ iso8859_8_to_unicode_tree_table,
+
+ 0x007f, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xfe, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 iso8859_8_to_unicode_tree_table[254] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x0007f ***/
+
+ /* 80 */ 0x00c280, 0x00c281, 0x00c282, 0x00c283,
+ /* 84 */ 0x00c284, 0x00c285, 0x00c286, 0x00c287,
+ /* 88 */ 0x00c288, 0x00c289, 0x00c28a, 0x00c28b,
+ /* 8c */ 0x00c28c, 0x00c28d, 0x00c28e, 0x00c28f,
+ /* 90 */ 0x00c290, 0x00c291, 0x00c292, 0x00c293,
+ /* 94 */ 0x00c294, 0x00c295, 0x00c296, 0x00c297,
+ /* 98 */ 0x00c298, 0x00c299, 0x00c29a, 0x00c29b,
+ /* 9c */ 0x00c29c, 0x00c29d, 0x00c29e, 0x00c29f,
+ /* a0 */ 0x00c2a0, 0x000000, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c397, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00c3b7, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0xe28097,
+ /* e0 */ 0x00d790, 0x00d791, 0x00d792, 0x00d793,
+ /* e4 */ 0x00d794, 0x00d795, 0x00d796, 0x00d797,
+ /* e8 */ 0x00d798, 0x00d799, 0x00d79a, 0x00d79b,
+ /* ec */ 0x00d79c, 0x00d79d, 0x00d79e, 0x00d79f,
+ /* f0 */ 0x00d7a0, 0x00d7a1, 0x00d7a2, 0x00d7a3,
+ /* f4 */ 0x00d7a4, 0x00d7a5, 0x00d7a6, 0x00d7a7,
+ /* f8 */ 0x00d7a8, 0x00d7a9, 0x00d7aa, 0x000000,
+ /* fc */ 0x000000, 0xe2808e, 0xe2808f
+};
diff --git a/src/backend/utils/mb/Unicode/iso8859_9_to_utf8.map b/src/backend/utils/mb/Unicode/iso8859_9_to_utf8.map
new file mode 100644
index 0000000..fced425
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/iso8859_9_to_utf8.map
@@ -0,0 +1,79 @@
+/* src/backend/utils/mb/Unicode/iso8859_9_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_9_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree iso8859_9_to_unicode_tree =
+{
+ iso8859_9_to_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_9_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 48 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 58 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 60 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 68 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 78 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287,
+ /* 88 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f,
+ /* 90 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297,
+ /* 98 */ 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f,
+ /* a0 */ 0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a4, 0xc2a5, 0xc2a6, 0xc2a7,
+ /* a8 */ 0xc2a8, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ac, 0xc2ad, 0xc2ae, 0xc2af,
+ /* b0 */ 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3, 0xc2b4, 0xc2b5, 0xc2b6, 0xc2b7,
+ /* b8 */ 0xc2b8, 0xc2b9, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf,
+ /* c0 */ 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387,
+ /* c8 */ 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f,
+ /* d0 */ 0xc49e, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397,
+ /* d8 */ 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc4b0, 0xc59e, 0xc39f,
+ /* e0 */ 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7,
+ /* e8 */ 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af,
+ /* f0 */ 0xc49f, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7,
+ /* f8 */ 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc4b1, 0xc59f, 0xc3bf
+};
diff --git a/src/backend/utils/mb/Unicode/johab_to_utf8.map b/src/backend/utils/mb/Unicode/johab_to_utf8.map
new file mode 100644
index 0000000..bfc2834
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/johab_to_utf8.map
@@ -0,0 +1,6280 @@
+/* src/backend/utils/mb/Unicode/johab_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl */
+
+static const uint32 johab_to_unicode_tree_table[22987];
+
+static const pg_mb_radix_tree johab_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ johab_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x00ce, /* offset of table for 2-byte inputs */
+ 0x84, /* b2_1_lower */
+ 0xf9, /* b2_1_upper */
+ 0x31, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 johab_to_unicode_tree_table[22987] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x000ce ***/
+
+ /* 84 */ 0x000144, 0x000202, 0x0002c0, 0x00037e,
+ /* 88 */ 0x00043c, 0x000509, 0x0005d6, 0x0006a3,
+ /* 8c */ 0x000761, 0x00082e, 0x0008fb, 0x0009c8,
+ /* 90 */ 0x000a86, 0x000b53, 0x000c20, 0x000ced,
+ /* 94 */ 0x000dab, 0x000e78, 0x000f45, 0x001012,
+ /* 98 */ 0x0010d0, 0x00119d, 0x00126a, 0x001337,
+ /* 9c */ 0x0013f5, 0x0014c2, 0x00158f, 0x00165c,
+ /* a0 */ 0x00171a, 0x0017e7, 0x0018b4, 0x001981,
+ /* a4 */ 0x001a3f, 0x001b0c, 0x001bd9, 0x001ca6,
+ /* a8 */ 0x001d64, 0x001e31, 0x001efe, 0x001fcb,
+ /* ac */ 0x002089, 0x002156, 0x002223, 0x0022f0,
+ /* b0 */ 0x0023ae, 0x00247b, 0x002548, 0x002615,
+ /* b4 */ 0x0026d3, 0x0027a0, 0x00286d, 0x00293a,
+ /* b8 */ 0x0029f8, 0x002ac5, 0x002b92, 0x002c5f,
+ /* bc */ 0x002d1d, 0x002dea, 0x002eb7, 0x002f84,
+ /* c0 */ 0x003042, 0x00310f, 0x0031dc, 0x0032a9,
+ /* c4 */ 0x003367, 0x003434, 0x003501, 0x0035ce,
+ /* c8 */ 0x00368c, 0x003759, 0x003826, 0x0038f3,
+ /* cc */ 0x0039b1, 0x003a7e, 0x003b4b, 0x003c18,
+ /* d0 */ 0x003cd6, 0x003da3, 0x003e70, 0x003f3d,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x00400b, 0x0040d9, 0x0041a7,
+ /* dc */ 0x004275, 0x004343, 0x004411, 0x000000,
+ /* e0 */ 0x0044df, 0x0045ad, 0x00467b, 0x004749,
+ /* e4 */ 0x004817, 0x0048e5, 0x0049b3, 0x004a81,
+ /* e8 */ 0x004b4f, 0x004c1d, 0x004ceb, 0x004db9,
+ /* ec */ 0x004e87, 0x004f55, 0x005023, 0x0050f1,
+ /* f0 */ 0x0051bf, 0x00528d, 0x00535b, 0x005429,
+ /* f4 */ 0x0054f7, 0x0055c5, 0x005693, 0x005761,
+ /* f8 */ 0x00582f, 0x0058fd,
+
+ /*** Two byte table, leaf: 84xx - offset 0x00144 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0xe384b3,
+ /* 45 */ 0x000000, 0xe384b5, 0xe384b6, 0x000000,
+ /* 49 */ 0x000000, 0xe384ba, 0xe384bb, 0xe384bc,
+ /* 4d */ 0xe384bd, 0xe384be, 0xe384bf, 0xe38580,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0xe38584,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xe3858f, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xe38590, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe38591, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xe38592, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe38593, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 85xx - offset 0x00202 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38594, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xe38595, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xe38596, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe38597, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xe38598, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe38599, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 86xx - offset 0x002c0 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3859a, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xe3859b, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xe3859c, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe3859d, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xe3859e, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xe3859f, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 87xx - offset 0x0037e ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe385a0, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xe385a1, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xe385a2, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe385a3, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 88xx - offset 0x0043c ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b1, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab080, 0xeab081, 0xeab082, 0xeab083,
+ /* 65 */ 0xeab084, 0xeab085, 0xeab086, 0xeab087,
+ /* 69 */ 0xeab088, 0xeab089, 0xeab08a, 0xeab08b,
+ /* 6d */ 0xeab08c, 0xeab08d, 0xeab08e, 0xeab08f,
+ /* 71 */ 0xeab090, 0x000000, 0xeab091, 0xeab092,
+ /* 75 */ 0xeab093, 0xeab094, 0xeab095, 0xeab096,
+ /* 79 */ 0xeab097, 0xeab098, 0xeab099, 0xeab09a,
+ /* 7d */ 0xeab09b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab09c, 0xeab09d, 0xeab09e, 0xeab09f,
+ /* 85 */ 0xeab0a0, 0xeab0a1, 0xeab0a2, 0xeab0a3,
+ /* 89 */ 0xeab0a4, 0xeab0a5, 0xeab0a6, 0xeab0a7,
+ /* 8d */ 0xeab0a8, 0xeab0a9, 0xeab0aa, 0xeab0ab,
+ /* 91 */ 0xeab0ac, 0x000000, 0xeab0ad, 0xeab0ae,
+ /* 95 */ 0xeab0af, 0xeab0b0, 0xeab0b1, 0xeab0b2,
+ /* 99 */ 0xeab0b3, 0xeab0b4, 0xeab0b5, 0xeab0b6,
+ /* 9d */ 0xeab0b7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeab0b8, 0xeab0b9, 0xeab0ba, 0xeab0bb,
+ /* a5 */ 0xeab0bc, 0xeab0bd, 0xeab0be, 0xeab0bf,
+ /* a9 */ 0xeab180, 0xeab181, 0xeab182, 0xeab183,
+ /* ad */ 0xeab184, 0xeab185, 0xeab186, 0xeab187,
+ /* b1 */ 0xeab188, 0x000000, 0xeab189, 0xeab18a,
+ /* b5 */ 0xeab18b, 0xeab18c, 0xeab18d, 0xeab18e,
+ /* b9 */ 0xeab18f, 0xeab190, 0xeab191, 0xeab192,
+ /* bd */ 0xeab193, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeab194, 0xeab195, 0xeab196, 0xeab197,
+ /* c5 */ 0xeab198, 0xeab199, 0xeab19a, 0xeab19b,
+ /* c9 */ 0xeab19c, 0xeab19d, 0xeab19e, 0xeab19f,
+ /* cd */ 0xeab1a0, 0xeab1a1, 0xeab1a2, 0xeab1a3,
+ /* d1 */ 0xeab1a4, 0x000000, 0xeab1a5, 0xeab1a6,
+ /* d5 */ 0xeab1a7, 0xeab1a8, 0xeab1a9, 0xeab1aa,
+ /* d9 */ 0xeab1ab, 0xeab1ac, 0xeab1ad, 0xeab1ae,
+ /* dd */ 0xeab1af, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeab1b0, 0xeab1b1, 0xeab1b2, 0xeab1b3,
+ /* e5 */ 0xeab1b4, 0xeab1b5, 0xeab1b6, 0xeab1b7,
+ /* e9 */ 0xeab1b8, 0xeab1b9, 0xeab1ba, 0xeab1bb,
+ /* ed */ 0xeab1bc, 0xeab1bd, 0xeab1be, 0xeab1bf,
+ /* f1 */ 0xeab280, 0x000000, 0xeab281, 0xeab282,
+ /* f5 */ 0xeab283, 0xeab284, 0xeab285, 0xeab286,
+ /* f9 */ 0xeab287, 0xeab288, 0xeab289, 0xeab28a,
+ /* fd */ 0xeab28b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 89xx - offset 0x00509 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeab28c, 0xeab28d, 0xeab28e, 0xeab28f,
+ /* 45 */ 0xeab290, 0xeab291, 0xeab292, 0xeab293,
+ /* 49 */ 0xeab294, 0xeab295, 0xeab296, 0xeab297,
+ /* 4d */ 0xeab298, 0xeab299, 0xeab29a, 0xeab29b,
+ /* 51 */ 0xeab29c, 0x000000, 0xeab29d, 0xeab29e,
+ /* 55 */ 0xeab29f, 0xeab2a0, 0xeab2a1, 0xeab2a2,
+ /* 59 */ 0xeab2a3, 0xeab2a4, 0xeab2a5, 0xeab2a6,
+ /* 5d */ 0xeab2a7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab2a8, 0xeab2a9, 0xeab2aa, 0xeab2ab,
+ /* 65 */ 0xeab2ac, 0xeab2ad, 0xeab2ae, 0xeab2af,
+ /* 69 */ 0xeab2b0, 0xeab2b1, 0xeab2b2, 0xeab2b3,
+ /* 6d */ 0xeab2b4, 0xeab2b5, 0xeab2b6, 0xeab2b7,
+ /* 71 */ 0xeab2b8, 0x000000, 0xeab2b9, 0xeab2ba,
+ /* 75 */ 0xeab2bb, 0xeab2bc, 0xeab2bd, 0xeab2be,
+ /* 79 */ 0xeab2bf, 0xeab380, 0xeab381, 0xeab382,
+ /* 7d */ 0xeab383, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab384, 0xeab385, 0xeab386, 0xeab387,
+ /* 85 */ 0xeab388, 0xeab389, 0xeab38a, 0xeab38b,
+ /* 89 */ 0xeab38c, 0xeab38d, 0xeab38e, 0xeab38f,
+ /* 8d */ 0xeab390, 0xeab391, 0xeab392, 0xeab393,
+ /* 91 */ 0xeab394, 0x000000, 0xeab395, 0xeab396,
+ /* 95 */ 0xeab397, 0xeab398, 0xeab399, 0xeab39a,
+ /* 99 */ 0xeab39b, 0xeab39c, 0xeab39d, 0xeab39e,
+ /* 9d */ 0xeab39f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeab3a0, 0xeab3a1, 0xeab3a2, 0xeab3a3,
+ /* a5 */ 0xeab3a4, 0xeab3a5, 0xeab3a6, 0xeab3a7,
+ /* a9 */ 0xeab3a8, 0xeab3a9, 0xeab3aa, 0xeab3ab,
+ /* ad */ 0xeab3ac, 0xeab3ad, 0xeab3ae, 0xeab3af,
+ /* b1 */ 0xeab3b0, 0x000000, 0xeab3b1, 0xeab3b2,
+ /* b5 */ 0xeab3b3, 0xeab3b4, 0xeab3b5, 0xeab3b6,
+ /* b9 */ 0xeab3b7, 0xeab3b8, 0xeab3b9, 0xeab3ba,
+ /* bd */ 0xeab3bb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeab3bc, 0xeab3bd, 0xeab3be, 0xeab3bf,
+ /* c5 */ 0xeab480, 0xeab481, 0xeab482, 0xeab483,
+ /* c9 */ 0xeab484, 0xeab485, 0xeab486, 0xeab487,
+ /* cd */ 0xeab488, 0xeab489, 0xeab48a, 0xeab48b,
+ /* d1 */ 0xeab48c, 0x000000, 0xeab48d, 0xeab48e,
+ /* d5 */ 0xeab48f, 0xeab490, 0xeab491, 0xeab492,
+ /* d9 */ 0xeab493, 0xeab494, 0xeab495, 0xeab496,
+ /* dd */ 0xeab497, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeab498, 0xeab499, 0xeab49a, 0xeab49b,
+ /* e5 */ 0xeab49c, 0xeab49d, 0xeab49e, 0xeab49f,
+ /* e9 */ 0xeab4a0, 0xeab4a1, 0xeab4a2, 0xeab4a3,
+ /* ed */ 0xeab4a4, 0xeab4a5, 0xeab4a6, 0xeab4a7,
+ /* f1 */ 0xeab4a8, 0x000000, 0xeab4a9, 0xeab4aa,
+ /* f5 */ 0xeab4ab, 0xeab4ac, 0xeab4ad, 0xeab4ae,
+ /* f9 */ 0xeab4af, 0xeab4b0, 0xeab4b1, 0xeab4b2,
+ /* fd */ 0xeab4b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8axx - offset 0x005d6 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeab4b4, 0xeab4b5, 0xeab4b6, 0xeab4b7,
+ /* 45 */ 0xeab4b8, 0xeab4b9, 0xeab4ba, 0xeab4bb,
+ /* 49 */ 0xeab4bc, 0xeab4bd, 0xeab4be, 0xeab4bf,
+ /* 4d */ 0xeab580, 0xeab581, 0xeab582, 0xeab583,
+ /* 51 */ 0xeab584, 0x000000, 0xeab585, 0xeab586,
+ /* 55 */ 0xeab587, 0xeab588, 0xeab589, 0xeab58a,
+ /* 59 */ 0xeab58b, 0xeab58c, 0xeab58d, 0xeab58e,
+ /* 5d */ 0xeab58f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab590, 0xeab591, 0xeab592, 0xeab593,
+ /* 65 */ 0xeab594, 0xeab595, 0xeab596, 0xeab597,
+ /* 69 */ 0xeab598, 0xeab599, 0xeab59a, 0xeab59b,
+ /* 6d */ 0xeab59c, 0xeab59d, 0xeab59e, 0xeab59f,
+ /* 71 */ 0xeab5a0, 0x000000, 0xeab5a1, 0xeab5a2,
+ /* 75 */ 0xeab5a3, 0xeab5a4, 0xeab5a5, 0xeab5a6,
+ /* 79 */ 0xeab5a7, 0xeab5a8, 0xeab5a9, 0xeab5aa,
+ /* 7d */ 0xeab5ab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab5ac, 0xeab5ad, 0xeab5ae, 0xeab5af,
+ /* 85 */ 0xeab5b0, 0xeab5b1, 0xeab5b2, 0xeab5b3,
+ /* 89 */ 0xeab5b4, 0xeab5b5, 0xeab5b6, 0xeab5b7,
+ /* 8d */ 0xeab5b8, 0xeab5b9, 0xeab5ba, 0xeab5bb,
+ /* 91 */ 0xeab5bc, 0x000000, 0xeab5bd, 0xeab5be,
+ /* 95 */ 0xeab5bf, 0xeab680, 0xeab681, 0xeab682,
+ /* 99 */ 0xeab683, 0xeab684, 0xeab685, 0xeab686,
+ /* 9d */ 0xeab687, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeab688, 0xeab689, 0xeab68a, 0xeab68b,
+ /* a5 */ 0xeab68c, 0xeab68d, 0xeab68e, 0xeab68f,
+ /* a9 */ 0xeab690, 0xeab691, 0xeab692, 0xeab693,
+ /* ad */ 0xeab694, 0xeab695, 0xeab696, 0xeab697,
+ /* b1 */ 0xeab698, 0x000000, 0xeab699, 0xeab69a,
+ /* b5 */ 0xeab69b, 0xeab69c, 0xeab69d, 0xeab69e,
+ /* b9 */ 0xeab69f, 0xeab6a0, 0xeab6a1, 0xeab6a2,
+ /* bd */ 0xeab6a3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeab6a4, 0xeab6a5, 0xeab6a6, 0xeab6a7,
+ /* c5 */ 0xeab6a8, 0xeab6a9, 0xeab6aa, 0xeab6ab,
+ /* c9 */ 0xeab6ac, 0xeab6ad, 0xeab6ae, 0xeab6af,
+ /* cd */ 0xeab6b0, 0xeab6b1, 0xeab6b2, 0xeab6b3,
+ /* d1 */ 0xeab6b4, 0x000000, 0xeab6b5, 0xeab6b6,
+ /* d5 */ 0xeab6b7, 0xeab6b8, 0xeab6b9, 0xeab6ba,
+ /* d9 */ 0xeab6bb, 0xeab6bc, 0xeab6bd, 0xeab6be,
+ /* dd */ 0xeab6bf, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeab780, 0xeab781, 0xeab782, 0xeab783,
+ /* e5 */ 0xeab784, 0xeab785, 0xeab786, 0xeab787,
+ /* e9 */ 0xeab788, 0xeab789, 0xeab78a, 0xeab78b,
+ /* ed */ 0xeab78c, 0xeab78d, 0xeab78e, 0xeab78f,
+ /* f1 */ 0xeab790, 0x000000, 0xeab791, 0xeab792,
+ /* f5 */ 0xeab793, 0xeab794, 0xeab795, 0xeab796,
+ /* f9 */ 0xeab797, 0xeab798, 0xeab799, 0xeab79a,
+ /* fd */ 0xeab79b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8bxx - offset 0x006a3 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeab79c, 0xeab79d, 0xeab79e, 0xeab79f,
+ /* 45 */ 0xeab7a0, 0xeab7a1, 0xeab7a2, 0xeab7a3,
+ /* 49 */ 0xeab7a4, 0xeab7a5, 0xeab7a6, 0xeab7a7,
+ /* 4d */ 0xeab7a8, 0xeab7a9, 0xeab7aa, 0xeab7ab,
+ /* 51 */ 0xeab7ac, 0x000000, 0xeab7ad, 0xeab7ae,
+ /* 55 */ 0xeab7af, 0xeab7b0, 0xeab7b1, 0xeab7b2,
+ /* 59 */ 0xeab7b3, 0xeab7b4, 0xeab7b5, 0xeab7b6,
+ /* 5d */ 0xeab7b7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab7b8, 0xeab7b9, 0xeab7ba, 0xeab7bb,
+ /* 65 */ 0xeab7bc, 0xeab7bd, 0xeab7be, 0xeab7bf,
+ /* 69 */ 0xeab880, 0xeab881, 0xeab882, 0xeab883,
+ /* 6d */ 0xeab884, 0xeab885, 0xeab886, 0xeab887,
+ /* 71 */ 0xeab888, 0x000000, 0xeab889, 0xeab88a,
+ /* 75 */ 0xeab88b, 0xeab88c, 0xeab88d, 0xeab88e,
+ /* 79 */ 0xeab88f, 0xeab890, 0xeab891, 0xeab892,
+ /* 7d */ 0xeab893, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab894, 0xeab895, 0xeab896, 0xeab897,
+ /* 85 */ 0xeab898, 0xeab899, 0xeab89a, 0xeab89b,
+ /* 89 */ 0xeab89c, 0xeab89d, 0xeab89e, 0xeab89f,
+ /* 8d */ 0xeab8a0, 0xeab8a1, 0xeab8a2, 0xeab8a3,
+ /* 91 */ 0xeab8a4, 0x000000, 0xeab8a5, 0xeab8a6,
+ /* 95 */ 0xeab8a7, 0xeab8a8, 0xeab8a9, 0xeab8aa,
+ /* 99 */ 0xeab8ab, 0xeab8ac, 0xeab8ad, 0xeab8ae,
+ /* 9d */ 0xeab8af, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeab8b0, 0xeab8b1, 0xeab8b2, 0xeab8b3,
+ /* a5 */ 0xeab8b4, 0xeab8b5, 0xeab8b6, 0xeab8b7,
+ /* a9 */ 0xeab8b8, 0xeab8b9, 0xeab8ba, 0xeab8bb,
+ /* ad */ 0xeab8bc, 0xeab8bd, 0xeab8be, 0xeab8bf,
+ /* b1 */ 0xeab980, 0x000000, 0xeab981, 0xeab982,
+ /* b5 */ 0xeab983, 0xeab984, 0xeab985, 0xeab986,
+ /* b9 */ 0xeab987, 0xeab988, 0xeab989, 0xeab98a,
+ /* bd */ 0xeab98b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8cxx - offset 0x00761 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b2, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab98c, 0xeab98d, 0xeab98e, 0xeab98f,
+ /* 65 */ 0xeab990, 0xeab991, 0xeab992, 0xeab993,
+ /* 69 */ 0xeab994, 0xeab995, 0xeab996, 0xeab997,
+ /* 6d */ 0xeab998, 0xeab999, 0xeab99a, 0xeab99b,
+ /* 71 */ 0xeab99c, 0x000000, 0xeab99d, 0xeab99e,
+ /* 75 */ 0xeab99f, 0xeab9a0, 0xeab9a1, 0xeab9a2,
+ /* 79 */ 0xeab9a3, 0xeab9a4, 0xeab9a5, 0xeab9a6,
+ /* 7d */ 0xeab9a7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab9a8, 0xeab9a9, 0xeab9aa, 0xeab9ab,
+ /* 85 */ 0xeab9ac, 0xeab9ad, 0xeab9ae, 0xeab9af,
+ /* 89 */ 0xeab9b0, 0xeab9b1, 0xeab9b2, 0xeab9b3,
+ /* 8d */ 0xeab9b4, 0xeab9b5, 0xeab9b6, 0xeab9b7,
+ /* 91 */ 0xeab9b8, 0x000000, 0xeab9b9, 0xeab9ba,
+ /* 95 */ 0xeab9bb, 0xeab9bc, 0xeab9bd, 0xeab9be,
+ /* 99 */ 0xeab9bf, 0xeaba80, 0xeaba81, 0xeaba82,
+ /* 9d */ 0xeaba83, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeaba84, 0xeaba85, 0xeaba86, 0xeaba87,
+ /* a5 */ 0xeaba88, 0xeaba89, 0xeaba8a, 0xeaba8b,
+ /* a9 */ 0xeaba8c, 0xeaba8d, 0xeaba8e, 0xeaba8f,
+ /* ad */ 0xeaba90, 0xeaba91, 0xeaba92, 0xeaba93,
+ /* b1 */ 0xeaba94, 0x000000, 0xeaba95, 0xeaba96,
+ /* b5 */ 0xeaba97, 0xeaba98, 0xeaba99, 0xeaba9a,
+ /* b9 */ 0xeaba9b, 0xeaba9c, 0xeaba9d, 0xeaba9e,
+ /* bd */ 0xeaba9f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeabaa0, 0xeabaa1, 0xeabaa2, 0xeabaa3,
+ /* c5 */ 0xeabaa4, 0xeabaa5, 0xeabaa6, 0xeabaa7,
+ /* c9 */ 0xeabaa8, 0xeabaa9, 0xeabaaa, 0xeabaab,
+ /* cd */ 0xeabaac, 0xeabaad, 0xeabaae, 0xeabaaf,
+ /* d1 */ 0xeabab0, 0x000000, 0xeabab1, 0xeabab2,
+ /* d5 */ 0xeabab3, 0xeabab4, 0xeabab5, 0xeabab6,
+ /* d9 */ 0xeabab7, 0xeabab8, 0xeabab9, 0xeababa,
+ /* dd */ 0xeababb, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeababc, 0xeababd, 0xeababe, 0xeababf,
+ /* e5 */ 0xeabb80, 0xeabb81, 0xeabb82, 0xeabb83,
+ /* e9 */ 0xeabb84, 0xeabb85, 0xeabb86, 0xeabb87,
+ /* ed */ 0xeabb88, 0xeabb89, 0xeabb8a, 0xeabb8b,
+ /* f1 */ 0xeabb8c, 0x000000, 0xeabb8d, 0xeabb8e,
+ /* f5 */ 0xeabb8f, 0xeabb90, 0xeabb91, 0xeabb92,
+ /* f9 */ 0xeabb93, 0xeabb94, 0xeabb95, 0xeabb96,
+ /* fd */ 0xeabb97,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8dxx - offset 0x0082e ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeabb98, 0xeabb99, 0xeabb9a, 0xeabb9b,
+ /* 45 */ 0xeabb9c, 0xeabb9d, 0xeabb9e, 0xeabb9f,
+ /* 49 */ 0xeabba0, 0xeabba1, 0xeabba2, 0xeabba3,
+ /* 4d */ 0xeabba4, 0xeabba5, 0xeabba6, 0xeabba7,
+ /* 51 */ 0xeabba8, 0x000000, 0xeabba9, 0xeabbaa,
+ /* 55 */ 0xeabbab, 0xeabbac, 0xeabbad, 0xeabbae,
+ /* 59 */ 0xeabbaf, 0xeabbb0, 0xeabbb1, 0xeabbb2,
+ /* 5d */ 0xeabbb3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeabbb4, 0xeabbb5, 0xeabbb6, 0xeabbb7,
+ /* 65 */ 0xeabbb8, 0xeabbb9, 0xeabbba, 0xeabbbb,
+ /* 69 */ 0xeabbbc, 0xeabbbd, 0xeabbbe, 0xeabbbf,
+ /* 6d */ 0xeabc80, 0xeabc81, 0xeabc82, 0xeabc83,
+ /* 71 */ 0xeabc84, 0x000000, 0xeabc85, 0xeabc86,
+ /* 75 */ 0xeabc87, 0xeabc88, 0xeabc89, 0xeabc8a,
+ /* 79 */ 0xeabc8b, 0xeabc8c, 0xeabc8d, 0xeabc8e,
+ /* 7d */ 0xeabc8f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeabc90, 0xeabc91, 0xeabc92, 0xeabc93,
+ /* 85 */ 0xeabc94, 0xeabc95, 0xeabc96, 0xeabc97,
+ /* 89 */ 0xeabc98, 0xeabc99, 0xeabc9a, 0xeabc9b,
+ /* 8d */ 0xeabc9c, 0xeabc9d, 0xeabc9e, 0xeabc9f,
+ /* 91 */ 0xeabca0, 0x000000, 0xeabca1, 0xeabca2,
+ /* 95 */ 0xeabca3, 0xeabca4, 0xeabca5, 0xeabca6,
+ /* 99 */ 0xeabca7, 0xeabca8, 0xeabca9, 0xeabcaa,
+ /* 9d */ 0xeabcab, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeabcac, 0xeabcad, 0xeabcae, 0xeabcaf,
+ /* a5 */ 0xeabcb0, 0xeabcb1, 0xeabcb2, 0xeabcb3,
+ /* a9 */ 0xeabcb4, 0xeabcb5, 0xeabcb6, 0xeabcb7,
+ /* ad */ 0xeabcb8, 0xeabcb9, 0xeabcba, 0xeabcbb,
+ /* b1 */ 0xeabcbc, 0x000000, 0xeabcbd, 0xeabcbe,
+ /* b5 */ 0xeabcbf, 0xeabd80, 0xeabd81, 0xeabd82,
+ /* b9 */ 0xeabd83, 0xeabd84, 0xeabd85, 0xeabd86,
+ /* bd */ 0xeabd87, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeabd88, 0xeabd89, 0xeabd8a, 0xeabd8b,
+ /* c5 */ 0xeabd8c, 0xeabd8d, 0xeabd8e, 0xeabd8f,
+ /* c9 */ 0xeabd90, 0xeabd91, 0xeabd92, 0xeabd93,
+ /* cd */ 0xeabd94, 0xeabd95, 0xeabd96, 0xeabd97,
+ /* d1 */ 0xeabd98, 0x000000, 0xeabd99, 0xeabd9a,
+ /* d5 */ 0xeabd9b, 0xeabd9c, 0xeabd9d, 0xeabd9e,
+ /* d9 */ 0xeabd9f, 0xeabda0, 0xeabda1, 0xeabda2,
+ /* dd */ 0xeabda3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeabda4, 0xeabda5, 0xeabda6, 0xeabda7,
+ /* e5 */ 0xeabda8, 0xeabda9, 0xeabdaa, 0xeabdab,
+ /* e9 */ 0xeabdac, 0xeabdad, 0xeabdae, 0xeabdaf,
+ /* ed */ 0xeabdb0, 0xeabdb1, 0xeabdb2, 0xeabdb3,
+ /* f1 */ 0xeabdb4, 0x000000, 0xeabdb5, 0xeabdb6,
+ /* f5 */ 0xeabdb7, 0xeabdb8, 0xeabdb9, 0xeabdba,
+ /* f9 */ 0xeabdbb, 0xeabdbc, 0xeabdbd, 0xeabdbe,
+ /* fd */ 0xeabdbf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8exx - offset 0x008fb ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeabe80, 0xeabe81, 0xeabe82, 0xeabe83,
+ /* 45 */ 0xeabe84, 0xeabe85, 0xeabe86, 0xeabe87,
+ /* 49 */ 0xeabe88, 0xeabe89, 0xeabe8a, 0xeabe8b,
+ /* 4d */ 0xeabe8c, 0xeabe8d, 0xeabe8e, 0xeabe8f,
+ /* 51 */ 0xeabe90, 0x000000, 0xeabe91, 0xeabe92,
+ /* 55 */ 0xeabe93, 0xeabe94, 0xeabe95, 0xeabe96,
+ /* 59 */ 0xeabe97, 0xeabe98, 0xeabe99, 0xeabe9a,
+ /* 5d */ 0xeabe9b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeabe9c, 0xeabe9d, 0xeabe9e, 0xeabe9f,
+ /* 65 */ 0xeabea0, 0xeabea1, 0xeabea2, 0xeabea3,
+ /* 69 */ 0xeabea4, 0xeabea5, 0xeabea6, 0xeabea7,
+ /* 6d */ 0xeabea8, 0xeabea9, 0xeabeaa, 0xeabeab,
+ /* 71 */ 0xeabeac, 0x000000, 0xeabead, 0xeabeae,
+ /* 75 */ 0xeabeaf, 0xeabeb0, 0xeabeb1, 0xeabeb2,
+ /* 79 */ 0xeabeb3, 0xeabeb4, 0xeabeb5, 0xeabeb6,
+ /* 7d */ 0xeabeb7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeabeb8, 0xeabeb9, 0xeabeba, 0xeabebb,
+ /* 85 */ 0xeabebc, 0xeabebd, 0xeabebe, 0xeabebf,
+ /* 89 */ 0xeabf80, 0xeabf81, 0xeabf82, 0xeabf83,
+ /* 8d */ 0xeabf84, 0xeabf85, 0xeabf86, 0xeabf87,
+ /* 91 */ 0xeabf88, 0x000000, 0xeabf89, 0xeabf8a,
+ /* 95 */ 0xeabf8b, 0xeabf8c, 0xeabf8d, 0xeabf8e,
+ /* 99 */ 0xeabf8f, 0xeabf90, 0xeabf91, 0xeabf92,
+ /* 9d */ 0xeabf93, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeabf94, 0xeabf95, 0xeabf96, 0xeabf97,
+ /* a5 */ 0xeabf98, 0xeabf99, 0xeabf9a, 0xeabf9b,
+ /* a9 */ 0xeabf9c, 0xeabf9d, 0xeabf9e, 0xeabf9f,
+ /* ad */ 0xeabfa0, 0xeabfa1, 0xeabfa2, 0xeabfa3,
+ /* b1 */ 0xeabfa4, 0x000000, 0xeabfa5, 0xeabfa6,
+ /* b5 */ 0xeabfa7, 0xeabfa8, 0xeabfa9, 0xeabfaa,
+ /* b9 */ 0xeabfab, 0xeabfac, 0xeabfad, 0xeabfae,
+ /* bd */ 0xeabfaf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeabfb0, 0xeabfb1, 0xeabfb2, 0xeabfb3,
+ /* c5 */ 0xeabfb4, 0xeabfb5, 0xeabfb6, 0xeabfb7,
+ /* c9 */ 0xeabfb8, 0xeabfb9, 0xeabfba, 0xeabfbb,
+ /* cd */ 0xeabfbc, 0xeabfbd, 0xeabfbe, 0xeabfbf,
+ /* d1 */ 0xeb8080, 0x000000, 0xeb8081, 0xeb8082,
+ /* d5 */ 0xeb8083, 0xeb8084, 0xeb8085, 0xeb8086,
+ /* d9 */ 0xeb8087, 0xeb8088, 0xeb8089, 0xeb808a,
+ /* dd */ 0xeb808b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb808c, 0xeb808d, 0xeb808e, 0xeb808f,
+ /* e5 */ 0xeb8090, 0xeb8091, 0xeb8092, 0xeb8093,
+ /* e9 */ 0xeb8094, 0xeb8095, 0xeb8096, 0xeb8097,
+ /* ed */ 0xeb8098, 0xeb8099, 0xeb809a, 0xeb809b,
+ /* f1 */ 0xeb809c, 0x000000, 0xeb809d, 0xeb809e,
+ /* f5 */ 0xeb809f, 0xeb80a0, 0xeb80a1, 0xeb80a2,
+ /* f9 */ 0xeb80a3, 0xeb80a4, 0xeb80a5, 0xeb80a6,
+ /* fd */ 0xeb80a7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 8fxx - offset 0x009c8 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb80a8, 0xeb80a9, 0xeb80aa, 0xeb80ab,
+ /* 45 */ 0xeb80ac, 0xeb80ad, 0xeb80ae, 0xeb80af,
+ /* 49 */ 0xeb80b0, 0xeb80b1, 0xeb80b2, 0xeb80b3,
+ /* 4d */ 0xeb80b4, 0xeb80b5, 0xeb80b6, 0xeb80b7,
+ /* 51 */ 0xeb80b8, 0x000000, 0xeb80b9, 0xeb80ba,
+ /* 55 */ 0xeb80bb, 0xeb80bc, 0xeb80bd, 0xeb80be,
+ /* 59 */ 0xeb80bf, 0xeb8180, 0xeb8181, 0xeb8182,
+ /* 5d */ 0xeb8183, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8184, 0xeb8185, 0xeb8186, 0xeb8187,
+ /* 65 */ 0xeb8188, 0xeb8189, 0xeb818a, 0xeb818b,
+ /* 69 */ 0xeb818c, 0xeb818d, 0xeb818e, 0xeb818f,
+ /* 6d */ 0xeb8190, 0xeb8191, 0xeb8192, 0xeb8193,
+ /* 71 */ 0xeb8194, 0x000000, 0xeb8195, 0xeb8196,
+ /* 75 */ 0xeb8197, 0xeb8198, 0xeb8199, 0xeb819a,
+ /* 79 */ 0xeb819b, 0xeb819c, 0xeb819d, 0xeb819e,
+ /* 7d */ 0xeb819f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb81a0, 0xeb81a1, 0xeb81a2, 0xeb81a3,
+ /* 85 */ 0xeb81a4, 0xeb81a5, 0xeb81a6, 0xeb81a7,
+ /* 89 */ 0xeb81a8, 0xeb81a9, 0xeb81aa, 0xeb81ab,
+ /* 8d */ 0xeb81ac, 0xeb81ad, 0xeb81ae, 0xeb81af,
+ /* 91 */ 0xeb81b0, 0x000000, 0xeb81b1, 0xeb81b2,
+ /* 95 */ 0xeb81b3, 0xeb81b4, 0xeb81b5, 0xeb81b6,
+ /* 99 */ 0xeb81b7, 0xeb81b8, 0xeb81b9, 0xeb81ba,
+ /* 9d */ 0xeb81bb, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb81bc, 0xeb81bd, 0xeb81be, 0xeb81bf,
+ /* a5 */ 0xeb8280, 0xeb8281, 0xeb8282, 0xeb8283,
+ /* a9 */ 0xeb8284, 0xeb8285, 0xeb8286, 0xeb8287,
+ /* ad */ 0xeb8288, 0xeb8289, 0xeb828a, 0xeb828b,
+ /* b1 */ 0xeb828c, 0x000000, 0xeb828d, 0xeb828e,
+ /* b5 */ 0xeb828f, 0xeb8290, 0xeb8291, 0xeb8292,
+ /* b9 */ 0xeb8293, 0xeb8294, 0xeb8295, 0xeb8296,
+ /* bd */ 0xeb8297, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 90xx - offset 0x00a86 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b4, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8298, 0xeb8299, 0xeb829a, 0xeb829b,
+ /* 65 */ 0xeb829c, 0xeb829d, 0xeb829e, 0xeb829f,
+ /* 69 */ 0xeb82a0, 0xeb82a1, 0xeb82a2, 0xeb82a3,
+ /* 6d */ 0xeb82a4, 0xeb82a5, 0xeb82a6, 0xeb82a7,
+ /* 71 */ 0xeb82a8, 0x000000, 0xeb82a9, 0xeb82aa,
+ /* 75 */ 0xeb82ab, 0xeb82ac, 0xeb82ad, 0xeb82ae,
+ /* 79 */ 0xeb82af, 0xeb82b0, 0xeb82b1, 0xeb82b2,
+ /* 7d */ 0xeb82b3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb82b4, 0xeb82b5, 0xeb82b6, 0xeb82b7,
+ /* 85 */ 0xeb82b8, 0xeb82b9, 0xeb82ba, 0xeb82bb,
+ /* 89 */ 0xeb82bc, 0xeb82bd, 0xeb82be, 0xeb82bf,
+ /* 8d */ 0xeb8380, 0xeb8381, 0xeb8382, 0xeb8383,
+ /* 91 */ 0xeb8384, 0x000000, 0xeb8385, 0xeb8386,
+ /* 95 */ 0xeb8387, 0xeb8388, 0xeb8389, 0xeb838a,
+ /* 99 */ 0xeb838b, 0xeb838c, 0xeb838d, 0xeb838e,
+ /* 9d */ 0xeb838f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb8390, 0xeb8391, 0xeb8392, 0xeb8393,
+ /* a5 */ 0xeb8394, 0xeb8395, 0xeb8396, 0xeb8397,
+ /* a9 */ 0xeb8398, 0xeb8399, 0xeb839a, 0xeb839b,
+ /* ad */ 0xeb839c, 0xeb839d, 0xeb839e, 0xeb839f,
+ /* b1 */ 0xeb83a0, 0x000000, 0xeb83a1, 0xeb83a2,
+ /* b5 */ 0xeb83a3, 0xeb83a4, 0xeb83a5, 0xeb83a6,
+ /* b9 */ 0xeb83a7, 0xeb83a8, 0xeb83a9, 0xeb83aa,
+ /* bd */ 0xeb83ab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb83ac, 0xeb83ad, 0xeb83ae, 0xeb83af,
+ /* c5 */ 0xeb83b0, 0xeb83b1, 0xeb83b2, 0xeb83b3,
+ /* c9 */ 0xeb83b4, 0xeb83b5, 0xeb83b6, 0xeb83b7,
+ /* cd */ 0xeb83b8, 0xeb83b9, 0xeb83ba, 0xeb83bb,
+ /* d1 */ 0xeb83bc, 0x000000, 0xeb83bd, 0xeb83be,
+ /* d5 */ 0xeb83bf, 0xeb8480, 0xeb8481, 0xeb8482,
+ /* d9 */ 0xeb8483, 0xeb8484, 0xeb8485, 0xeb8486,
+ /* dd */ 0xeb8487, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb8488, 0xeb8489, 0xeb848a, 0xeb848b,
+ /* e5 */ 0xeb848c, 0xeb848d, 0xeb848e, 0xeb848f,
+ /* e9 */ 0xeb8490, 0xeb8491, 0xeb8492, 0xeb8493,
+ /* ed */ 0xeb8494, 0xeb8495, 0xeb8496, 0xeb8497,
+ /* f1 */ 0xeb8498, 0x000000, 0xeb8499, 0xeb849a,
+ /* f5 */ 0xeb849b, 0xeb849c, 0xeb849d, 0xeb849e,
+ /* f9 */ 0xeb849f, 0xeb84a0, 0xeb84a1, 0xeb84a2,
+ /* fd */ 0xeb84a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 91xx - offset 0x00b53 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb84a4, 0xeb84a5, 0xeb84a6, 0xeb84a7,
+ /* 45 */ 0xeb84a8, 0xeb84a9, 0xeb84aa, 0xeb84ab,
+ /* 49 */ 0xeb84ac, 0xeb84ad, 0xeb84ae, 0xeb84af,
+ /* 4d */ 0xeb84b0, 0xeb84b1, 0xeb84b2, 0xeb84b3,
+ /* 51 */ 0xeb84b4, 0x000000, 0xeb84b5, 0xeb84b6,
+ /* 55 */ 0xeb84b7, 0xeb84b8, 0xeb84b9, 0xeb84ba,
+ /* 59 */ 0xeb84bb, 0xeb84bc, 0xeb84bd, 0xeb84be,
+ /* 5d */ 0xeb84bf, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8580, 0xeb8581, 0xeb8582, 0xeb8583,
+ /* 65 */ 0xeb8584, 0xeb8585, 0xeb8586, 0xeb8587,
+ /* 69 */ 0xeb8588, 0xeb8589, 0xeb858a, 0xeb858b,
+ /* 6d */ 0xeb858c, 0xeb858d, 0xeb858e, 0xeb858f,
+ /* 71 */ 0xeb8590, 0x000000, 0xeb8591, 0xeb8592,
+ /* 75 */ 0xeb8593, 0xeb8594, 0xeb8595, 0xeb8596,
+ /* 79 */ 0xeb8597, 0xeb8598, 0xeb8599, 0xeb859a,
+ /* 7d */ 0xeb859b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb859c, 0xeb859d, 0xeb859e, 0xeb859f,
+ /* 85 */ 0xeb85a0, 0xeb85a1, 0xeb85a2, 0xeb85a3,
+ /* 89 */ 0xeb85a4, 0xeb85a5, 0xeb85a6, 0xeb85a7,
+ /* 8d */ 0xeb85a8, 0xeb85a9, 0xeb85aa, 0xeb85ab,
+ /* 91 */ 0xeb85ac, 0x000000, 0xeb85ad, 0xeb85ae,
+ /* 95 */ 0xeb85af, 0xeb85b0, 0xeb85b1, 0xeb85b2,
+ /* 99 */ 0xeb85b3, 0xeb85b4, 0xeb85b5, 0xeb85b6,
+ /* 9d */ 0xeb85b7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb85b8, 0xeb85b9, 0xeb85ba, 0xeb85bb,
+ /* a5 */ 0xeb85bc, 0xeb85bd, 0xeb85be, 0xeb85bf,
+ /* a9 */ 0xeb8680, 0xeb8681, 0xeb8682, 0xeb8683,
+ /* ad */ 0xeb8684, 0xeb8685, 0xeb8686, 0xeb8687,
+ /* b1 */ 0xeb8688, 0x000000, 0xeb8689, 0xeb868a,
+ /* b5 */ 0xeb868b, 0xeb868c, 0xeb868d, 0xeb868e,
+ /* b9 */ 0xeb868f, 0xeb8690, 0xeb8691, 0xeb8692,
+ /* bd */ 0xeb8693, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb8694, 0xeb8695, 0xeb8696, 0xeb8697,
+ /* c5 */ 0xeb8698, 0xeb8699, 0xeb869a, 0xeb869b,
+ /* c9 */ 0xeb869c, 0xeb869d, 0xeb869e, 0xeb869f,
+ /* cd */ 0xeb86a0, 0xeb86a1, 0xeb86a2, 0xeb86a3,
+ /* d1 */ 0xeb86a4, 0x000000, 0xeb86a5, 0xeb86a6,
+ /* d5 */ 0xeb86a7, 0xeb86a8, 0xeb86a9, 0xeb86aa,
+ /* d9 */ 0xeb86ab, 0xeb86ac, 0xeb86ad, 0xeb86ae,
+ /* dd */ 0xeb86af, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb86b0, 0xeb86b1, 0xeb86b2, 0xeb86b3,
+ /* e5 */ 0xeb86b4, 0xeb86b5, 0xeb86b6, 0xeb86b7,
+ /* e9 */ 0xeb86b8, 0xeb86b9, 0xeb86ba, 0xeb86bb,
+ /* ed */ 0xeb86bc, 0xeb86bd, 0xeb86be, 0xeb86bf,
+ /* f1 */ 0xeb8780, 0x000000, 0xeb8781, 0xeb8782,
+ /* f5 */ 0xeb8783, 0xeb8784, 0xeb8785, 0xeb8786,
+ /* f9 */ 0xeb8787, 0xeb8788, 0xeb8789, 0xeb878a,
+ /* fd */ 0xeb878b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 92xx - offset 0x00c20 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb878c, 0xeb878d, 0xeb878e, 0xeb878f,
+ /* 45 */ 0xeb8790, 0xeb8791, 0xeb8792, 0xeb8793,
+ /* 49 */ 0xeb8794, 0xeb8795, 0xeb8796, 0xeb8797,
+ /* 4d */ 0xeb8798, 0xeb8799, 0xeb879a, 0xeb879b,
+ /* 51 */ 0xeb879c, 0x000000, 0xeb879d, 0xeb879e,
+ /* 55 */ 0xeb879f, 0xeb87a0, 0xeb87a1, 0xeb87a2,
+ /* 59 */ 0xeb87a3, 0xeb87a4, 0xeb87a5, 0xeb87a6,
+ /* 5d */ 0xeb87a7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb87a8, 0xeb87a9, 0xeb87aa, 0xeb87ab,
+ /* 65 */ 0xeb87ac, 0xeb87ad, 0xeb87ae, 0xeb87af,
+ /* 69 */ 0xeb87b0, 0xeb87b1, 0xeb87b2, 0xeb87b3,
+ /* 6d */ 0xeb87b4, 0xeb87b5, 0xeb87b6, 0xeb87b7,
+ /* 71 */ 0xeb87b8, 0x000000, 0xeb87b9, 0xeb87ba,
+ /* 75 */ 0xeb87bb, 0xeb87bc, 0xeb87bd, 0xeb87be,
+ /* 79 */ 0xeb87bf, 0xeb8880, 0xeb8881, 0xeb8882,
+ /* 7d */ 0xeb8883, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8884, 0xeb8885, 0xeb8886, 0xeb8887,
+ /* 85 */ 0xeb8888, 0xeb8889, 0xeb888a, 0xeb888b,
+ /* 89 */ 0xeb888c, 0xeb888d, 0xeb888e, 0xeb888f,
+ /* 8d */ 0xeb8890, 0xeb8891, 0xeb8892, 0xeb8893,
+ /* 91 */ 0xeb8894, 0x000000, 0xeb8895, 0xeb8896,
+ /* 95 */ 0xeb8897, 0xeb8898, 0xeb8899, 0xeb889a,
+ /* 99 */ 0xeb889b, 0xeb889c, 0xeb889d, 0xeb889e,
+ /* 9d */ 0xeb889f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb88a0, 0xeb88a1, 0xeb88a2, 0xeb88a3,
+ /* a5 */ 0xeb88a4, 0xeb88a5, 0xeb88a6, 0xeb88a7,
+ /* a9 */ 0xeb88a8, 0xeb88a9, 0xeb88aa, 0xeb88ab,
+ /* ad */ 0xeb88ac, 0xeb88ad, 0xeb88ae, 0xeb88af,
+ /* b1 */ 0xeb88b0, 0x000000, 0xeb88b1, 0xeb88b2,
+ /* b5 */ 0xeb88b3, 0xeb88b4, 0xeb88b5, 0xeb88b6,
+ /* b9 */ 0xeb88b7, 0xeb88b8, 0xeb88b9, 0xeb88ba,
+ /* bd */ 0xeb88bb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb88bc, 0xeb88bd, 0xeb88be, 0xeb88bf,
+ /* c5 */ 0xeb8980, 0xeb8981, 0xeb8982, 0xeb8983,
+ /* c9 */ 0xeb8984, 0xeb8985, 0xeb8986, 0xeb8987,
+ /* cd */ 0xeb8988, 0xeb8989, 0xeb898a, 0xeb898b,
+ /* d1 */ 0xeb898c, 0x000000, 0xeb898d, 0xeb898e,
+ /* d5 */ 0xeb898f, 0xeb8990, 0xeb8991, 0xeb8992,
+ /* d9 */ 0xeb8993, 0xeb8994, 0xeb8995, 0xeb8996,
+ /* dd */ 0xeb8997, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb8998, 0xeb8999, 0xeb899a, 0xeb899b,
+ /* e5 */ 0xeb899c, 0xeb899d, 0xeb899e, 0xeb899f,
+ /* e9 */ 0xeb89a0, 0xeb89a1, 0xeb89a2, 0xeb89a3,
+ /* ed */ 0xeb89a4, 0xeb89a5, 0xeb89a6, 0xeb89a7,
+ /* f1 */ 0xeb89a8, 0x000000, 0xeb89a9, 0xeb89aa,
+ /* f5 */ 0xeb89ab, 0xeb89ac, 0xeb89ad, 0xeb89ae,
+ /* f9 */ 0xeb89af, 0xeb89b0, 0xeb89b1, 0xeb89b2,
+ /* fd */ 0xeb89b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 93xx - offset 0x00ced ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb89b4, 0xeb89b5, 0xeb89b6, 0xeb89b7,
+ /* 45 */ 0xeb89b8, 0xeb89b9, 0xeb89ba, 0xeb89bb,
+ /* 49 */ 0xeb89bc, 0xeb89bd, 0xeb89be, 0xeb89bf,
+ /* 4d */ 0xeb8a80, 0xeb8a81, 0xeb8a82, 0xeb8a83,
+ /* 51 */ 0xeb8a84, 0x000000, 0xeb8a85, 0xeb8a86,
+ /* 55 */ 0xeb8a87, 0xeb8a88, 0xeb8a89, 0xeb8a8a,
+ /* 59 */ 0xeb8a8b, 0xeb8a8c, 0xeb8a8d, 0xeb8a8e,
+ /* 5d */ 0xeb8a8f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8a90, 0xeb8a91, 0xeb8a92, 0xeb8a93,
+ /* 65 */ 0xeb8a94, 0xeb8a95, 0xeb8a96, 0xeb8a97,
+ /* 69 */ 0xeb8a98, 0xeb8a99, 0xeb8a9a, 0xeb8a9b,
+ /* 6d */ 0xeb8a9c, 0xeb8a9d, 0xeb8a9e, 0xeb8a9f,
+ /* 71 */ 0xeb8aa0, 0x000000, 0xeb8aa1, 0xeb8aa2,
+ /* 75 */ 0xeb8aa3, 0xeb8aa4, 0xeb8aa5, 0xeb8aa6,
+ /* 79 */ 0xeb8aa7, 0xeb8aa8, 0xeb8aa9, 0xeb8aaa,
+ /* 7d */ 0xeb8aab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8aac, 0xeb8aad, 0xeb8aae, 0xeb8aaf,
+ /* 85 */ 0xeb8ab0, 0xeb8ab1, 0xeb8ab2, 0xeb8ab3,
+ /* 89 */ 0xeb8ab4, 0xeb8ab5, 0xeb8ab6, 0xeb8ab7,
+ /* 8d */ 0xeb8ab8, 0xeb8ab9, 0xeb8aba, 0xeb8abb,
+ /* 91 */ 0xeb8abc, 0x000000, 0xeb8abd, 0xeb8abe,
+ /* 95 */ 0xeb8abf, 0xeb8b80, 0xeb8b81, 0xeb8b82,
+ /* 99 */ 0xeb8b83, 0xeb8b84, 0xeb8b85, 0xeb8b86,
+ /* 9d */ 0xeb8b87, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb8b88, 0xeb8b89, 0xeb8b8a, 0xeb8b8b,
+ /* a5 */ 0xeb8b8c, 0xeb8b8d, 0xeb8b8e, 0xeb8b8f,
+ /* a9 */ 0xeb8b90, 0xeb8b91, 0xeb8b92, 0xeb8b93,
+ /* ad */ 0xeb8b94, 0xeb8b95, 0xeb8b96, 0xeb8b97,
+ /* b1 */ 0xeb8b98, 0x000000, 0xeb8b99, 0xeb8b9a,
+ /* b5 */ 0xeb8b9b, 0xeb8b9c, 0xeb8b9d, 0xeb8b9e,
+ /* b9 */ 0xeb8b9f, 0xeb8ba0, 0xeb8ba1, 0xeb8ba2,
+ /* bd */ 0xeb8ba3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 94xx - offset 0x00dab ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b7, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8ba4, 0xeb8ba5, 0xeb8ba6, 0xeb8ba7,
+ /* 65 */ 0xeb8ba8, 0xeb8ba9, 0xeb8baa, 0xeb8bab,
+ /* 69 */ 0xeb8bac, 0xeb8bad, 0xeb8bae, 0xeb8baf,
+ /* 6d */ 0xeb8bb0, 0xeb8bb1, 0xeb8bb2, 0xeb8bb3,
+ /* 71 */ 0xeb8bb4, 0x000000, 0xeb8bb5, 0xeb8bb6,
+ /* 75 */ 0xeb8bb7, 0xeb8bb8, 0xeb8bb9, 0xeb8bba,
+ /* 79 */ 0xeb8bbb, 0xeb8bbc, 0xeb8bbd, 0xeb8bbe,
+ /* 7d */ 0xeb8bbf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8c80, 0xeb8c81, 0xeb8c82, 0xeb8c83,
+ /* 85 */ 0xeb8c84, 0xeb8c85, 0xeb8c86, 0xeb8c87,
+ /* 89 */ 0xeb8c88, 0xeb8c89, 0xeb8c8a, 0xeb8c8b,
+ /* 8d */ 0xeb8c8c, 0xeb8c8d, 0xeb8c8e, 0xeb8c8f,
+ /* 91 */ 0xeb8c90, 0x000000, 0xeb8c91, 0xeb8c92,
+ /* 95 */ 0xeb8c93, 0xeb8c94, 0xeb8c95, 0xeb8c96,
+ /* 99 */ 0xeb8c97, 0xeb8c98, 0xeb8c99, 0xeb8c9a,
+ /* 9d */ 0xeb8c9b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb8c9c, 0xeb8c9d, 0xeb8c9e, 0xeb8c9f,
+ /* a5 */ 0xeb8ca0, 0xeb8ca1, 0xeb8ca2, 0xeb8ca3,
+ /* a9 */ 0xeb8ca4, 0xeb8ca5, 0xeb8ca6, 0xeb8ca7,
+ /* ad */ 0xeb8ca8, 0xeb8ca9, 0xeb8caa, 0xeb8cab,
+ /* b1 */ 0xeb8cac, 0x000000, 0xeb8cad, 0xeb8cae,
+ /* b5 */ 0xeb8caf, 0xeb8cb0, 0xeb8cb1, 0xeb8cb2,
+ /* b9 */ 0xeb8cb3, 0xeb8cb4, 0xeb8cb5, 0xeb8cb6,
+ /* bd */ 0xeb8cb7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb8cb8, 0xeb8cb9, 0xeb8cba, 0xeb8cbb,
+ /* c5 */ 0xeb8cbc, 0xeb8cbd, 0xeb8cbe, 0xeb8cbf,
+ /* c9 */ 0xeb8d80, 0xeb8d81, 0xeb8d82, 0xeb8d83,
+ /* cd */ 0xeb8d84, 0xeb8d85, 0xeb8d86, 0xeb8d87,
+ /* d1 */ 0xeb8d88, 0x000000, 0xeb8d89, 0xeb8d8a,
+ /* d5 */ 0xeb8d8b, 0xeb8d8c, 0xeb8d8d, 0xeb8d8e,
+ /* d9 */ 0xeb8d8f, 0xeb8d90, 0xeb8d91, 0xeb8d92,
+ /* dd */ 0xeb8d93, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb8d94, 0xeb8d95, 0xeb8d96, 0xeb8d97,
+ /* e5 */ 0xeb8d98, 0xeb8d99, 0xeb8d9a, 0xeb8d9b,
+ /* e9 */ 0xeb8d9c, 0xeb8d9d, 0xeb8d9e, 0xeb8d9f,
+ /* ed */ 0xeb8da0, 0xeb8da1, 0xeb8da2, 0xeb8da3,
+ /* f1 */ 0xeb8da4, 0x000000, 0xeb8da5, 0xeb8da6,
+ /* f5 */ 0xeb8da7, 0xeb8da8, 0xeb8da9, 0xeb8daa,
+ /* f9 */ 0xeb8dab, 0xeb8dac, 0xeb8dad, 0xeb8dae,
+ /* fd */ 0xeb8daf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 95xx - offset 0x00e78 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb8db0, 0xeb8db1, 0xeb8db2, 0xeb8db3,
+ /* 45 */ 0xeb8db4, 0xeb8db5, 0xeb8db6, 0xeb8db7,
+ /* 49 */ 0xeb8db8, 0xeb8db9, 0xeb8dba, 0xeb8dbb,
+ /* 4d */ 0xeb8dbc, 0xeb8dbd, 0xeb8dbe, 0xeb8dbf,
+ /* 51 */ 0xeb8e80, 0x000000, 0xeb8e81, 0xeb8e82,
+ /* 55 */ 0xeb8e83, 0xeb8e84, 0xeb8e85, 0xeb8e86,
+ /* 59 */ 0xeb8e87, 0xeb8e88, 0xeb8e89, 0xeb8e8a,
+ /* 5d */ 0xeb8e8b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8e8c, 0xeb8e8d, 0xeb8e8e, 0xeb8e8f,
+ /* 65 */ 0xeb8e90, 0xeb8e91, 0xeb8e92, 0xeb8e93,
+ /* 69 */ 0xeb8e94, 0xeb8e95, 0xeb8e96, 0xeb8e97,
+ /* 6d */ 0xeb8e98, 0xeb8e99, 0xeb8e9a, 0xeb8e9b,
+ /* 71 */ 0xeb8e9c, 0x000000, 0xeb8e9d, 0xeb8e9e,
+ /* 75 */ 0xeb8e9f, 0xeb8ea0, 0xeb8ea1, 0xeb8ea2,
+ /* 79 */ 0xeb8ea3, 0xeb8ea4, 0xeb8ea5, 0xeb8ea6,
+ /* 7d */ 0xeb8ea7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8ea8, 0xeb8ea9, 0xeb8eaa, 0xeb8eab,
+ /* 85 */ 0xeb8eac, 0xeb8ead, 0xeb8eae, 0xeb8eaf,
+ /* 89 */ 0xeb8eb0, 0xeb8eb1, 0xeb8eb2, 0xeb8eb3,
+ /* 8d */ 0xeb8eb4, 0xeb8eb5, 0xeb8eb6, 0xeb8eb7,
+ /* 91 */ 0xeb8eb8, 0x000000, 0xeb8eb9, 0xeb8eba,
+ /* 95 */ 0xeb8ebb, 0xeb8ebc, 0xeb8ebd, 0xeb8ebe,
+ /* 99 */ 0xeb8ebf, 0xeb8f80, 0xeb8f81, 0xeb8f82,
+ /* 9d */ 0xeb8f83, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb8f84, 0xeb8f85, 0xeb8f86, 0xeb8f87,
+ /* a5 */ 0xeb8f88, 0xeb8f89, 0xeb8f8a, 0xeb8f8b,
+ /* a9 */ 0xeb8f8c, 0xeb8f8d, 0xeb8f8e, 0xeb8f8f,
+ /* ad */ 0xeb8f90, 0xeb8f91, 0xeb8f92, 0xeb8f93,
+ /* b1 */ 0xeb8f94, 0x000000, 0xeb8f95, 0xeb8f96,
+ /* b5 */ 0xeb8f97, 0xeb8f98, 0xeb8f99, 0xeb8f9a,
+ /* b9 */ 0xeb8f9b, 0xeb8f9c, 0xeb8f9d, 0xeb8f9e,
+ /* bd */ 0xeb8f9f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb8fa0, 0xeb8fa1, 0xeb8fa2, 0xeb8fa3,
+ /* c5 */ 0xeb8fa4, 0xeb8fa5, 0xeb8fa6, 0xeb8fa7,
+ /* c9 */ 0xeb8fa8, 0xeb8fa9, 0xeb8faa, 0xeb8fab,
+ /* cd */ 0xeb8fac, 0xeb8fad, 0xeb8fae, 0xeb8faf,
+ /* d1 */ 0xeb8fb0, 0x000000, 0xeb8fb1, 0xeb8fb2,
+ /* d5 */ 0xeb8fb3, 0xeb8fb4, 0xeb8fb5, 0xeb8fb6,
+ /* d9 */ 0xeb8fb7, 0xeb8fb8, 0xeb8fb9, 0xeb8fba,
+ /* dd */ 0xeb8fbb, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb8fbc, 0xeb8fbd, 0xeb8fbe, 0xeb8fbf,
+ /* e5 */ 0xeb9080, 0xeb9081, 0xeb9082, 0xeb9083,
+ /* e9 */ 0xeb9084, 0xeb9085, 0xeb9086, 0xeb9087,
+ /* ed */ 0xeb9088, 0xeb9089, 0xeb908a, 0xeb908b,
+ /* f1 */ 0xeb908c, 0x000000, 0xeb908d, 0xeb908e,
+ /* f5 */ 0xeb908f, 0xeb9090, 0xeb9091, 0xeb9092,
+ /* f9 */ 0xeb9093, 0xeb9094, 0xeb9095, 0xeb9096,
+ /* fd */ 0xeb9097,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 96xx - offset 0x00f45 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb9098, 0xeb9099, 0xeb909a, 0xeb909b,
+ /* 45 */ 0xeb909c, 0xeb909d, 0xeb909e, 0xeb909f,
+ /* 49 */ 0xeb90a0, 0xeb90a1, 0xeb90a2, 0xeb90a3,
+ /* 4d */ 0xeb90a4, 0xeb90a5, 0xeb90a6, 0xeb90a7,
+ /* 51 */ 0xeb90a8, 0x000000, 0xeb90a9, 0xeb90aa,
+ /* 55 */ 0xeb90ab, 0xeb90ac, 0xeb90ad, 0xeb90ae,
+ /* 59 */ 0xeb90af, 0xeb90b0, 0xeb90b1, 0xeb90b2,
+ /* 5d */ 0xeb90b3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb90b4, 0xeb90b5, 0xeb90b6, 0xeb90b7,
+ /* 65 */ 0xeb90b8, 0xeb90b9, 0xeb90ba, 0xeb90bb,
+ /* 69 */ 0xeb90bc, 0xeb90bd, 0xeb90be, 0xeb90bf,
+ /* 6d */ 0xeb9180, 0xeb9181, 0xeb9182, 0xeb9183,
+ /* 71 */ 0xeb9184, 0x000000, 0xeb9185, 0xeb9186,
+ /* 75 */ 0xeb9187, 0xeb9188, 0xeb9189, 0xeb918a,
+ /* 79 */ 0xeb918b, 0xeb918c, 0xeb918d, 0xeb918e,
+ /* 7d */ 0xeb918f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9190, 0xeb9191, 0xeb9192, 0xeb9193,
+ /* 85 */ 0xeb9194, 0xeb9195, 0xeb9196, 0xeb9197,
+ /* 89 */ 0xeb9198, 0xeb9199, 0xeb919a, 0xeb919b,
+ /* 8d */ 0xeb919c, 0xeb919d, 0xeb919e, 0xeb919f,
+ /* 91 */ 0xeb91a0, 0x000000, 0xeb91a1, 0xeb91a2,
+ /* 95 */ 0xeb91a3, 0xeb91a4, 0xeb91a5, 0xeb91a6,
+ /* 99 */ 0xeb91a7, 0xeb91a8, 0xeb91a9, 0xeb91aa,
+ /* 9d */ 0xeb91ab, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb91ac, 0xeb91ad, 0xeb91ae, 0xeb91af,
+ /* a5 */ 0xeb91b0, 0xeb91b1, 0xeb91b2, 0xeb91b3,
+ /* a9 */ 0xeb91b4, 0xeb91b5, 0xeb91b6, 0xeb91b7,
+ /* ad */ 0xeb91b8, 0xeb91b9, 0xeb91ba, 0xeb91bb,
+ /* b1 */ 0xeb91bc, 0x000000, 0xeb91bd, 0xeb91be,
+ /* b5 */ 0xeb91bf, 0xeb9280, 0xeb9281, 0xeb9282,
+ /* b9 */ 0xeb9283, 0xeb9284, 0xeb9285, 0xeb9286,
+ /* bd */ 0xeb9287, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb9288, 0xeb9289, 0xeb928a, 0xeb928b,
+ /* c5 */ 0xeb928c, 0xeb928d, 0xeb928e, 0xeb928f,
+ /* c9 */ 0xeb9290, 0xeb9291, 0xeb9292, 0xeb9293,
+ /* cd */ 0xeb9294, 0xeb9295, 0xeb9296, 0xeb9297,
+ /* d1 */ 0xeb9298, 0x000000, 0xeb9299, 0xeb929a,
+ /* d5 */ 0xeb929b, 0xeb929c, 0xeb929d, 0xeb929e,
+ /* d9 */ 0xeb929f, 0xeb92a0, 0xeb92a1, 0xeb92a2,
+ /* dd */ 0xeb92a3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb92a4, 0xeb92a5, 0xeb92a6, 0xeb92a7,
+ /* e5 */ 0xeb92a8, 0xeb92a9, 0xeb92aa, 0xeb92ab,
+ /* e9 */ 0xeb92ac, 0xeb92ad, 0xeb92ae, 0xeb92af,
+ /* ed */ 0xeb92b0, 0xeb92b1, 0xeb92b2, 0xeb92b3,
+ /* f1 */ 0xeb92b4, 0x000000, 0xeb92b5, 0xeb92b6,
+ /* f5 */ 0xeb92b7, 0xeb92b8, 0xeb92b9, 0xeb92ba,
+ /* f9 */ 0xeb92bb, 0xeb92bc, 0xeb92bd, 0xeb92be,
+ /* fd */ 0xeb92bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 97xx - offset 0x01012 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb9380, 0xeb9381, 0xeb9382, 0xeb9383,
+ /* 45 */ 0xeb9384, 0xeb9385, 0xeb9386, 0xeb9387,
+ /* 49 */ 0xeb9388, 0xeb9389, 0xeb938a, 0xeb938b,
+ /* 4d */ 0xeb938c, 0xeb938d, 0xeb938e, 0xeb938f,
+ /* 51 */ 0xeb9390, 0x000000, 0xeb9391, 0xeb9392,
+ /* 55 */ 0xeb9393, 0xeb9394, 0xeb9395, 0xeb9396,
+ /* 59 */ 0xeb9397, 0xeb9398, 0xeb9399, 0xeb939a,
+ /* 5d */ 0xeb939b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb939c, 0xeb939d, 0xeb939e, 0xeb939f,
+ /* 65 */ 0xeb93a0, 0xeb93a1, 0xeb93a2, 0xeb93a3,
+ /* 69 */ 0xeb93a4, 0xeb93a5, 0xeb93a6, 0xeb93a7,
+ /* 6d */ 0xeb93a8, 0xeb93a9, 0xeb93aa, 0xeb93ab,
+ /* 71 */ 0xeb93ac, 0x000000, 0xeb93ad, 0xeb93ae,
+ /* 75 */ 0xeb93af, 0xeb93b0, 0xeb93b1, 0xeb93b2,
+ /* 79 */ 0xeb93b3, 0xeb93b4, 0xeb93b5, 0xeb93b6,
+ /* 7d */ 0xeb93b7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb93b8, 0xeb93b9, 0xeb93ba, 0xeb93bb,
+ /* 85 */ 0xeb93bc, 0xeb93bd, 0xeb93be, 0xeb93bf,
+ /* 89 */ 0xeb9480, 0xeb9481, 0xeb9482, 0xeb9483,
+ /* 8d */ 0xeb9484, 0xeb9485, 0xeb9486, 0xeb9487,
+ /* 91 */ 0xeb9488, 0x000000, 0xeb9489, 0xeb948a,
+ /* 95 */ 0xeb948b, 0xeb948c, 0xeb948d, 0xeb948e,
+ /* 99 */ 0xeb948f, 0xeb9490, 0xeb9491, 0xeb9492,
+ /* 9d */ 0xeb9493, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb9494, 0xeb9495, 0xeb9496, 0xeb9497,
+ /* a5 */ 0xeb9498, 0xeb9499, 0xeb949a, 0xeb949b,
+ /* a9 */ 0xeb949c, 0xeb949d, 0xeb949e, 0xeb949f,
+ /* ad */ 0xeb94a0, 0xeb94a1, 0xeb94a2, 0xeb94a3,
+ /* b1 */ 0xeb94a4, 0x000000, 0xeb94a5, 0xeb94a6,
+ /* b5 */ 0xeb94a7, 0xeb94a8, 0xeb94a9, 0xeb94aa,
+ /* b9 */ 0xeb94ab, 0xeb94ac, 0xeb94ad, 0xeb94ae,
+ /* bd */ 0xeb94af, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 98xx - offset 0x010d0 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b8, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb94b0, 0xeb94b1, 0xeb94b2, 0xeb94b3,
+ /* 65 */ 0xeb94b4, 0xeb94b5, 0xeb94b6, 0xeb94b7,
+ /* 69 */ 0xeb94b8, 0xeb94b9, 0xeb94ba, 0xeb94bb,
+ /* 6d */ 0xeb94bc, 0xeb94bd, 0xeb94be, 0xeb94bf,
+ /* 71 */ 0xeb9580, 0x000000, 0xeb9581, 0xeb9582,
+ /* 75 */ 0xeb9583, 0xeb9584, 0xeb9585, 0xeb9586,
+ /* 79 */ 0xeb9587, 0xeb9588, 0xeb9589, 0xeb958a,
+ /* 7d */ 0xeb958b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb958c, 0xeb958d, 0xeb958e, 0xeb958f,
+ /* 85 */ 0xeb9590, 0xeb9591, 0xeb9592, 0xeb9593,
+ /* 89 */ 0xeb9594, 0xeb9595, 0xeb9596, 0xeb9597,
+ /* 8d */ 0xeb9598, 0xeb9599, 0xeb959a, 0xeb959b,
+ /* 91 */ 0xeb959c, 0x000000, 0xeb959d, 0xeb959e,
+ /* 95 */ 0xeb959f, 0xeb95a0, 0xeb95a1, 0xeb95a2,
+ /* 99 */ 0xeb95a3, 0xeb95a4, 0xeb95a5, 0xeb95a6,
+ /* 9d */ 0xeb95a7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb95a8, 0xeb95a9, 0xeb95aa, 0xeb95ab,
+ /* a5 */ 0xeb95ac, 0xeb95ad, 0xeb95ae, 0xeb95af,
+ /* a9 */ 0xeb95b0, 0xeb95b1, 0xeb95b2, 0xeb95b3,
+ /* ad */ 0xeb95b4, 0xeb95b5, 0xeb95b6, 0xeb95b7,
+ /* b1 */ 0xeb95b8, 0x000000, 0xeb95b9, 0xeb95ba,
+ /* b5 */ 0xeb95bb, 0xeb95bc, 0xeb95bd, 0xeb95be,
+ /* b9 */ 0xeb95bf, 0xeb9680, 0xeb9681, 0xeb9682,
+ /* bd */ 0xeb9683, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb9684, 0xeb9685, 0xeb9686, 0xeb9687,
+ /* c5 */ 0xeb9688, 0xeb9689, 0xeb968a, 0xeb968b,
+ /* c9 */ 0xeb968c, 0xeb968d, 0xeb968e, 0xeb968f,
+ /* cd */ 0xeb9690, 0xeb9691, 0xeb9692, 0xeb9693,
+ /* d1 */ 0xeb9694, 0x000000, 0xeb9695, 0xeb9696,
+ /* d5 */ 0xeb9697, 0xeb9698, 0xeb9699, 0xeb969a,
+ /* d9 */ 0xeb969b, 0xeb969c, 0xeb969d, 0xeb969e,
+ /* dd */ 0xeb969f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb96a0, 0xeb96a1, 0xeb96a2, 0xeb96a3,
+ /* e5 */ 0xeb96a4, 0xeb96a5, 0xeb96a6, 0xeb96a7,
+ /* e9 */ 0xeb96a8, 0xeb96a9, 0xeb96aa, 0xeb96ab,
+ /* ed */ 0xeb96ac, 0xeb96ad, 0xeb96ae, 0xeb96af,
+ /* f1 */ 0xeb96b0, 0x000000, 0xeb96b1, 0xeb96b2,
+ /* f5 */ 0xeb96b3, 0xeb96b4, 0xeb96b5, 0xeb96b6,
+ /* f9 */ 0xeb96b7, 0xeb96b8, 0xeb96b9, 0xeb96ba,
+ /* fd */ 0xeb96bb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 99xx - offset 0x0119d ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb96bc, 0xeb96bd, 0xeb96be, 0xeb96bf,
+ /* 45 */ 0xeb9780, 0xeb9781, 0xeb9782, 0xeb9783,
+ /* 49 */ 0xeb9784, 0xeb9785, 0xeb9786, 0xeb9787,
+ /* 4d */ 0xeb9788, 0xeb9789, 0xeb978a, 0xeb978b,
+ /* 51 */ 0xeb978c, 0x000000, 0xeb978d, 0xeb978e,
+ /* 55 */ 0xeb978f, 0xeb9790, 0xeb9791, 0xeb9792,
+ /* 59 */ 0xeb9793, 0xeb9794, 0xeb9795, 0xeb9796,
+ /* 5d */ 0xeb9797, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9798, 0xeb9799, 0xeb979a, 0xeb979b,
+ /* 65 */ 0xeb979c, 0xeb979d, 0xeb979e, 0xeb979f,
+ /* 69 */ 0xeb97a0, 0xeb97a1, 0xeb97a2, 0xeb97a3,
+ /* 6d */ 0xeb97a4, 0xeb97a5, 0xeb97a6, 0xeb97a7,
+ /* 71 */ 0xeb97a8, 0x000000, 0xeb97a9, 0xeb97aa,
+ /* 75 */ 0xeb97ab, 0xeb97ac, 0xeb97ad, 0xeb97ae,
+ /* 79 */ 0xeb97af, 0xeb97b0, 0xeb97b1, 0xeb97b2,
+ /* 7d */ 0xeb97b3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb97b4, 0xeb97b5, 0xeb97b6, 0xeb97b7,
+ /* 85 */ 0xeb97b8, 0xeb97b9, 0xeb97ba, 0xeb97bb,
+ /* 89 */ 0xeb97bc, 0xeb97bd, 0xeb97be, 0xeb97bf,
+ /* 8d */ 0xeb9880, 0xeb9881, 0xeb9882, 0xeb9883,
+ /* 91 */ 0xeb9884, 0x000000, 0xeb9885, 0xeb9886,
+ /* 95 */ 0xeb9887, 0xeb9888, 0xeb9889, 0xeb988a,
+ /* 99 */ 0xeb988b, 0xeb988c, 0xeb988d, 0xeb988e,
+ /* 9d */ 0xeb988f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb9890, 0xeb9891, 0xeb9892, 0xeb9893,
+ /* a5 */ 0xeb9894, 0xeb9895, 0xeb9896, 0xeb9897,
+ /* a9 */ 0xeb9898, 0xeb9899, 0xeb989a, 0xeb989b,
+ /* ad */ 0xeb989c, 0xeb989d, 0xeb989e, 0xeb989f,
+ /* b1 */ 0xeb98a0, 0x000000, 0xeb98a1, 0xeb98a2,
+ /* b5 */ 0xeb98a3, 0xeb98a4, 0xeb98a5, 0xeb98a6,
+ /* b9 */ 0xeb98a7, 0xeb98a8, 0xeb98a9, 0xeb98aa,
+ /* bd */ 0xeb98ab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb98ac, 0xeb98ad, 0xeb98ae, 0xeb98af,
+ /* c5 */ 0xeb98b0, 0xeb98b1, 0xeb98b2, 0xeb98b3,
+ /* c9 */ 0xeb98b4, 0xeb98b5, 0xeb98b6, 0xeb98b7,
+ /* cd */ 0xeb98b8, 0xeb98b9, 0xeb98ba, 0xeb98bb,
+ /* d1 */ 0xeb98bc, 0x000000, 0xeb98bd, 0xeb98be,
+ /* d5 */ 0xeb98bf, 0xeb9980, 0xeb9981, 0xeb9982,
+ /* d9 */ 0xeb9983, 0xeb9984, 0xeb9985, 0xeb9986,
+ /* dd */ 0xeb9987, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb9988, 0xeb9989, 0xeb998a, 0xeb998b,
+ /* e5 */ 0xeb998c, 0xeb998d, 0xeb998e, 0xeb998f,
+ /* e9 */ 0xeb9990, 0xeb9991, 0xeb9992, 0xeb9993,
+ /* ed */ 0xeb9994, 0xeb9995, 0xeb9996, 0xeb9997,
+ /* f1 */ 0xeb9998, 0x000000, 0xeb9999, 0xeb999a,
+ /* f5 */ 0xeb999b, 0xeb999c, 0xeb999d, 0xeb999e,
+ /* f9 */ 0xeb999f, 0xeb99a0, 0xeb99a1, 0xeb99a2,
+ /* fd */ 0xeb99a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9axx - offset 0x0126a ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb99a4, 0xeb99a5, 0xeb99a6, 0xeb99a7,
+ /* 45 */ 0xeb99a8, 0xeb99a9, 0xeb99aa, 0xeb99ab,
+ /* 49 */ 0xeb99ac, 0xeb99ad, 0xeb99ae, 0xeb99af,
+ /* 4d */ 0xeb99b0, 0xeb99b1, 0xeb99b2, 0xeb99b3,
+ /* 51 */ 0xeb99b4, 0x000000, 0xeb99b5, 0xeb99b6,
+ /* 55 */ 0xeb99b7, 0xeb99b8, 0xeb99b9, 0xeb99ba,
+ /* 59 */ 0xeb99bb, 0xeb99bc, 0xeb99bd, 0xeb99be,
+ /* 5d */ 0xeb99bf, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9a80, 0xeb9a81, 0xeb9a82, 0xeb9a83,
+ /* 65 */ 0xeb9a84, 0xeb9a85, 0xeb9a86, 0xeb9a87,
+ /* 69 */ 0xeb9a88, 0xeb9a89, 0xeb9a8a, 0xeb9a8b,
+ /* 6d */ 0xeb9a8c, 0xeb9a8d, 0xeb9a8e, 0xeb9a8f,
+ /* 71 */ 0xeb9a90, 0x000000, 0xeb9a91, 0xeb9a92,
+ /* 75 */ 0xeb9a93, 0xeb9a94, 0xeb9a95, 0xeb9a96,
+ /* 79 */ 0xeb9a97, 0xeb9a98, 0xeb9a99, 0xeb9a9a,
+ /* 7d */ 0xeb9a9b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9a9c, 0xeb9a9d, 0xeb9a9e, 0xeb9a9f,
+ /* 85 */ 0xeb9aa0, 0xeb9aa1, 0xeb9aa2, 0xeb9aa3,
+ /* 89 */ 0xeb9aa4, 0xeb9aa5, 0xeb9aa6, 0xeb9aa7,
+ /* 8d */ 0xeb9aa8, 0xeb9aa9, 0xeb9aaa, 0xeb9aab,
+ /* 91 */ 0xeb9aac, 0x000000, 0xeb9aad, 0xeb9aae,
+ /* 95 */ 0xeb9aaf, 0xeb9ab0, 0xeb9ab1, 0xeb9ab2,
+ /* 99 */ 0xeb9ab3, 0xeb9ab4, 0xeb9ab5, 0xeb9ab6,
+ /* 9d */ 0xeb9ab7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb9ab8, 0xeb9ab9, 0xeb9aba, 0xeb9abb,
+ /* a5 */ 0xeb9abc, 0xeb9abd, 0xeb9abe, 0xeb9abf,
+ /* a9 */ 0xeb9b80, 0xeb9b81, 0xeb9b82, 0xeb9b83,
+ /* ad */ 0xeb9b84, 0xeb9b85, 0xeb9b86, 0xeb9b87,
+ /* b1 */ 0xeb9b88, 0x000000, 0xeb9b89, 0xeb9b8a,
+ /* b5 */ 0xeb9b8b, 0xeb9b8c, 0xeb9b8d, 0xeb9b8e,
+ /* b9 */ 0xeb9b8f, 0xeb9b90, 0xeb9b91, 0xeb9b92,
+ /* bd */ 0xeb9b93, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb9b94, 0xeb9b95, 0xeb9b96, 0xeb9b97,
+ /* c5 */ 0xeb9b98, 0xeb9b99, 0xeb9b9a, 0xeb9b9b,
+ /* c9 */ 0xeb9b9c, 0xeb9b9d, 0xeb9b9e, 0xeb9b9f,
+ /* cd */ 0xeb9ba0, 0xeb9ba1, 0xeb9ba2, 0xeb9ba3,
+ /* d1 */ 0xeb9ba4, 0x000000, 0xeb9ba5, 0xeb9ba6,
+ /* d5 */ 0xeb9ba7, 0xeb9ba8, 0xeb9ba9, 0xeb9baa,
+ /* d9 */ 0xeb9bab, 0xeb9bac, 0xeb9bad, 0xeb9bae,
+ /* dd */ 0xeb9baf, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb9bb0, 0xeb9bb1, 0xeb9bb2, 0xeb9bb3,
+ /* e5 */ 0xeb9bb4, 0xeb9bb5, 0xeb9bb6, 0xeb9bb7,
+ /* e9 */ 0xeb9bb8, 0xeb9bb9, 0xeb9bba, 0xeb9bbb,
+ /* ed */ 0xeb9bbc, 0xeb9bbd, 0xeb9bbe, 0xeb9bbf,
+ /* f1 */ 0xeb9c80, 0x000000, 0xeb9c81, 0xeb9c82,
+ /* f5 */ 0xeb9c83, 0xeb9c84, 0xeb9c85, 0xeb9c86,
+ /* f9 */ 0xeb9c87, 0xeb9c88, 0xeb9c89, 0xeb9c8a,
+ /* fd */ 0xeb9c8b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9bxx - offset 0x01337 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeb9c8c, 0xeb9c8d, 0xeb9c8e, 0xeb9c8f,
+ /* 45 */ 0xeb9c90, 0xeb9c91, 0xeb9c92, 0xeb9c93,
+ /* 49 */ 0xeb9c94, 0xeb9c95, 0xeb9c96, 0xeb9c97,
+ /* 4d */ 0xeb9c98, 0xeb9c99, 0xeb9c9a, 0xeb9c9b,
+ /* 51 */ 0xeb9c9c, 0x000000, 0xeb9c9d, 0xeb9c9e,
+ /* 55 */ 0xeb9c9f, 0xeb9ca0, 0xeb9ca1, 0xeb9ca2,
+ /* 59 */ 0xeb9ca3, 0xeb9ca4, 0xeb9ca5, 0xeb9ca6,
+ /* 5d */ 0xeb9ca7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9ca8, 0xeb9ca9, 0xeb9caa, 0xeb9cab,
+ /* 65 */ 0xeb9cac, 0xeb9cad, 0xeb9cae, 0xeb9caf,
+ /* 69 */ 0xeb9cb0, 0xeb9cb1, 0xeb9cb2, 0xeb9cb3,
+ /* 6d */ 0xeb9cb4, 0xeb9cb5, 0xeb9cb6, 0xeb9cb7,
+ /* 71 */ 0xeb9cb8, 0x000000, 0xeb9cb9, 0xeb9cba,
+ /* 75 */ 0xeb9cbb, 0xeb9cbc, 0xeb9cbd, 0xeb9cbe,
+ /* 79 */ 0xeb9cbf, 0xeb9d80, 0xeb9d81, 0xeb9d82,
+ /* 7d */ 0xeb9d83, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9d84, 0xeb9d85, 0xeb9d86, 0xeb9d87,
+ /* 85 */ 0xeb9d88, 0xeb9d89, 0xeb9d8a, 0xeb9d8b,
+ /* 89 */ 0xeb9d8c, 0xeb9d8d, 0xeb9d8e, 0xeb9d8f,
+ /* 8d */ 0xeb9d90, 0xeb9d91, 0xeb9d92, 0xeb9d93,
+ /* 91 */ 0xeb9d94, 0x000000, 0xeb9d95, 0xeb9d96,
+ /* 95 */ 0xeb9d97, 0xeb9d98, 0xeb9d99, 0xeb9d9a,
+ /* 99 */ 0xeb9d9b, 0xeb9d9c, 0xeb9d9d, 0xeb9d9e,
+ /* 9d */ 0xeb9d9f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb9da0, 0xeb9da1, 0xeb9da2, 0xeb9da3,
+ /* a5 */ 0xeb9da4, 0xeb9da5, 0xeb9da6, 0xeb9da7,
+ /* a9 */ 0xeb9da8, 0xeb9da9, 0xeb9daa, 0xeb9dab,
+ /* ad */ 0xeb9dac, 0xeb9dad, 0xeb9dae, 0xeb9daf,
+ /* b1 */ 0xeb9db0, 0x000000, 0xeb9db1, 0xeb9db2,
+ /* b5 */ 0xeb9db3, 0xeb9db4, 0xeb9db5, 0xeb9db6,
+ /* b9 */ 0xeb9db7, 0xeb9db8, 0xeb9db9, 0xeb9dba,
+ /* bd */ 0xeb9dbb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9cxx - offset 0x013f5 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe384b9, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9dbc, 0xeb9dbd, 0xeb9dbe, 0xeb9dbf,
+ /* 65 */ 0xeb9e80, 0xeb9e81, 0xeb9e82, 0xeb9e83,
+ /* 69 */ 0xeb9e84, 0xeb9e85, 0xeb9e86, 0xeb9e87,
+ /* 6d */ 0xeb9e88, 0xeb9e89, 0xeb9e8a, 0xeb9e8b,
+ /* 71 */ 0xeb9e8c, 0x000000, 0xeb9e8d, 0xeb9e8e,
+ /* 75 */ 0xeb9e8f, 0xeb9e90, 0xeb9e91, 0xeb9e92,
+ /* 79 */ 0xeb9e93, 0xeb9e94, 0xeb9e95, 0xeb9e96,
+ /* 7d */ 0xeb9e97, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9e98, 0xeb9e99, 0xeb9e9a, 0xeb9e9b,
+ /* 85 */ 0xeb9e9c, 0xeb9e9d, 0xeb9e9e, 0xeb9e9f,
+ /* 89 */ 0xeb9ea0, 0xeb9ea1, 0xeb9ea2, 0xeb9ea3,
+ /* 8d */ 0xeb9ea4, 0xeb9ea5, 0xeb9ea6, 0xeb9ea7,
+ /* 91 */ 0xeb9ea8, 0x000000, 0xeb9ea9, 0xeb9eaa,
+ /* 95 */ 0xeb9eab, 0xeb9eac, 0xeb9ead, 0xeb9eae,
+ /* 99 */ 0xeb9eaf, 0xeb9eb0, 0xeb9eb1, 0xeb9eb2,
+ /* 9d */ 0xeb9eb3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeb9eb4, 0xeb9eb5, 0xeb9eb6, 0xeb9eb7,
+ /* a5 */ 0xeb9eb8, 0xeb9eb9, 0xeb9eba, 0xeb9ebb,
+ /* a9 */ 0xeb9ebc, 0xeb9ebd, 0xeb9ebe, 0xeb9ebf,
+ /* ad */ 0xeb9f80, 0xeb9f81, 0xeb9f82, 0xeb9f83,
+ /* b1 */ 0xeb9f84, 0x000000, 0xeb9f85, 0xeb9f86,
+ /* b5 */ 0xeb9f87, 0xeb9f88, 0xeb9f89, 0xeb9f8a,
+ /* b9 */ 0xeb9f8b, 0xeb9f8c, 0xeb9f8d, 0xeb9f8e,
+ /* bd */ 0xeb9f8f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeb9f90, 0xeb9f91, 0xeb9f92, 0xeb9f93,
+ /* c5 */ 0xeb9f94, 0xeb9f95, 0xeb9f96, 0xeb9f97,
+ /* c9 */ 0xeb9f98, 0xeb9f99, 0xeb9f9a, 0xeb9f9b,
+ /* cd */ 0xeb9f9c, 0xeb9f9d, 0xeb9f9e, 0xeb9f9f,
+ /* d1 */ 0xeb9fa0, 0x000000, 0xeb9fa1, 0xeb9fa2,
+ /* d5 */ 0xeb9fa3, 0xeb9fa4, 0xeb9fa5, 0xeb9fa6,
+ /* d9 */ 0xeb9fa7, 0xeb9fa8, 0xeb9fa9, 0xeb9faa,
+ /* dd */ 0xeb9fab, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeb9fac, 0xeb9fad, 0xeb9fae, 0xeb9faf,
+ /* e5 */ 0xeb9fb0, 0xeb9fb1, 0xeb9fb2, 0xeb9fb3,
+ /* e9 */ 0xeb9fb4, 0xeb9fb5, 0xeb9fb6, 0xeb9fb7,
+ /* ed */ 0xeb9fb8, 0xeb9fb9, 0xeb9fba, 0xeb9fbb,
+ /* f1 */ 0xeb9fbc, 0x000000, 0xeb9fbd, 0xeb9fbe,
+ /* f5 */ 0xeb9fbf, 0xeba080, 0xeba081, 0xeba082,
+ /* f9 */ 0xeba083, 0xeba084, 0xeba085, 0xeba086,
+ /* fd */ 0xeba087,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9dxx - offset 0x014c2 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeba088, 0xeba089, 0xeba08a, 0xeba08b,
+ /* 45 */ 0xeba08c, 0xeba08d, 0xeba08e, 0xeba08f,
+ /* 49 */ 0xeba090, 0xeba091, 0xeba092, 0xeba093,
+ /* 4d */ 0xeba094, 0xeba095, 0xeba096, 0xeba097,
+ /* 51 */ 0xeba098, 0x000000, 0xeba099, 0xeba09a,
+ /* 55 */ 0xeba09b, 0xeba09c, 0xeba09d, 0xeba09e,
+ /* 59 */ 0xeba09f, 0xeba0a0, 0xeba0a1, 0xeba0a2,
+ /* 5d */ 0xeba0a3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba0a4, 0xeba0a5, 0xeba0a6, 0xeba0a7,
+ /* 65 */ 0xeba0a8, 0xeba0a9, 0xeba0aa, 0xeba0ab,
+ /* 69 */ 0xeba0ac, 0xeba0ad, 0xeba0ae, 0xeba0af,
+ /* 6d */ 0xeba0b0, 0xeba0b1, 0xeba0b2, 0xeba0b3,
+ /* 71 */ 0xeba0b4, 0x000000, 0xeba0b5, 0xeba0b6,
+ /* 75 */ 0xeba0b7, 0xeba0b8, 0xeba0b9, 0xeba0ba,
+ /* 79 */ 0xeba0bb, 0xeba0bc, 0xeba0bd, 0xeba0be,
+ /* 7d */ 0xeba0bf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba180, 0xeba181, 0xeba182, 0xeba183,
+ /* 85 */ 0xeba184, 0xeba185, 0xeba186, 0xeba187,
+ /* 89 */ 0xeba188, 0xeba189, 0xeba18a, 0xeba18b,
+ /* 8d */ 0xeba18c, 0xeba18d, 0xeba18e, 0xeba18f,
+ /* 91 */ 0xeba190, 0x000000, 0xeba191, 0xeba192,
+ /* 95 */ 0xeba193, 0xeba194, 0xeba195, 0xeba196,
+ /* 99 */ 0xeba197, 0xeba198, 0xeba199, 0xeba19a,
+ /* 9d */ 0xeba19b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeba19c, 0xeba19d, 0xeba19e, 0xeba19f,
+ /* a5 */ 0xeba1a0, 0xeba1a1, 0xeba1a2, 0xeba1a3,
+ /* a9 */ 0xeba1a4, 0xeba1a5, 0xeba1a6, 0xeba1a7,
+ /* ad */ 0xeba1a8, 0xeba1a9, 0xeba1aa, 0xeba1ab,
+ /* b1 */ 0xeba1ac, 0x000000, 0xeba1ad, 0xeba1ae,
+ /* b5 */ 0xeba1af, 0xeba1b0, 0xeba1b1, 0xeba1b2,
+ /* b9 */ 0xeba1b3, 0xeba1b4, 0xeba1b5, 0xeba1b6,
+ /* bd */ 0xeba1b7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeba1b8, 0xeba1b9, 0xeba1ba, 0xeba1bb,
+ /* c5 */ 0xeba1bc, 0xeba1bd, 0xeba1be, 0xeba1bf,
+ /* c9 */ 0xeba280, 0xeba281, 0xeba282, 0xeba283,
+ /* cd */ 0xeba284, 0xeba285, 0xeba286, 0xeba287,
+ /* d1 */ 0xeba288, 0x000000, 0xeba289, 0xeba28a,
+ /* d5 */ 0xeba28b, 0xeba28c, 0xeba28d, 0xeba28e,
+ /* d9 */ 0xeba28f, 0xeba290, 0xeba291, 0xeba292,
+ /* dd */ 0xeba293, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeba294, 0xeba295, 0xeba296, 0xeba297,
+ /* e5 */ 0xeba298, 0xeba299, 0xeba29a, 0xeba29b,
+ /* e9 */ 0xeba29c, 0xeba29d, 0xeba29e, 0xeba29f,
+ /* ed */ 0xeba2a0, 0xeba2a1, 0xeba2a2, 0xeba2a3,
+ /* f1 */ 0xeba2a4, 0x000000, 0xeba2a5, 0xeba2a6,
+ /* f5 */ 0xeba2a7, 0xeba2a8, 0xeba2a9, 0xeba2aa,
+ /* f9 */ 0xeba2ab, 0xeba2ac, 0xeba2ad, 0xeba2ae,
+ /* fd */ 0xeba2af,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9exx - offset 0x0158f ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeba2b0, 0xeba2b1, 0xeba2b2, 0xeba2b3,
+ /* 45 */ 0xeba2b4, 0xeba2b5, 0xeba2b6, 0xeba2b7,
+ /* 49 */ 0xeba2b8, 0xeba2b9, 0xeba2ba, 0xeba2bb,
+ /* 4d */ 0xeba2bc, 0xeba2bd, 0xeba2be, 0xeba2bf,
+ /* 51 */ 0xeba380, 0x000000, 0xeba381, 0xeba382,
+ /* 55 */ 0xeba383, 0xeba384, 0xeba385, 0xeba386,
+ /* 59 */ 0xeba387, 0xeba388, 0xeba389, 0xeba38a,
+ /* 5d */ 0xeba38b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba38c, 0xeba38d, 0xeba38e, 0xeba38f,
+ /* 65 */ 0xeba390, 0xeba391, 0xeba392, 0xeba393,
+ /* 69 */ 0xeba394, 0xeba395, 0xeba396, 0xeba397,
+ /* 6d */ 0xeba398, 0xeba399, 0xeba39a, 0xeba39b,
+ /* 71 */ 0xeba39c, 0x000000, 0xeba39d, 0xeba39e,
+ /* 75 */ 0xeba39f, 0xeba3a0, 0xeba3a1, 0xeba3a2,
+ /* 79 */ 0xeba3a3, 0xeba3a4, 0xeba3a5, 0xeba3a6,
+ /* 7d */ 0xeba3a7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba3a8, 0xeba3a9, 0xeba3aa, 0xeba3ab,
+ /* 85 */ 0xeba3ac, 0xeba3ad, 0xeba3ae, 0xeba3af,
+ /* 89 */ 0xeba3b0, 0xeba3b1, 0xeba3b2, 0xeba3b3,
+ /* 8d */ 0xeba3b4, 0xeba3b5, 0xeba3b6, 0xeba3b7,
+ /* 91 */ 0xeba3b8, 0x000000, 0xeba3b9, 0xeba3ba,
+ /* 95 */ 0xeba3bb, 0xeba3bc, 0xeba3bd, 0xeba3be,
+ /* 99 */ 0xeba3bf, 0xeba480, 0xeba481, 0xeba482,
+ /* 9d */ 0xeba483, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeba484, 0xeba485, 0xeba486, 0xeba487,
+ /* a5 */ 0xeba488, 0xeba489, 0xeba48a, 0xeba48b,
+ /* a9 */ 0xeba48c, 0xeba48d, 0xeba48e, 0xeba48f,
+ /* ad */ 0xeba490, 0xeba491, 0xeba492, 0xeba493,
+ /* b1 */ 0xeba494, 0x000000, 0xeba495, 0xeba496,
+ /* b5 */ 0xeba497, 0xeba498, 0xeba499, 0xeba49a,
+ /* b9 */ 0xeba49b, 0xeba49c, 0xeba49d, 0xeba49e,
+ /* bd */ 0xeba49f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeba4a0, 0xeba4a1, 0xeba4a2, 0xeba4a3,
+ /* c5 */ 0xeba4a4, 0xeba4a5, 0xeba4a6, 0xeba4a7,
+ /* c9 */ 0xeba4a8, 0xeba4a9, 0xeba4aa, 0xeba4ab,
+ /* cd */ 0xeba4ac, 0xeba4ad, 0xeba4ae, 0xeba4af,
+ /* d1 */ 0xeba4b0, 0x000000, 0xeba4b1, 0xeba4b2,
+ /* d5 */ 0xeba4b3, 0xeba4b4, 0xeba4b5, 0xeba4b6,
+ /* d9 */ 0xeba4b7, 0xeba4b8, 0xeba4b9, 0xeba4ba,
+ /* dd */ 0xeba4bb, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeba4bc, 0xeba4bd, 0xeba4be, 0xeba4bf,
+ /* e5 */ 0xeba580, 0xeba581, 0xeba582, 0xeba583,
+ /* e9 */ 0xeba584, 0xeba585, 0xeba586, 0xeba587,
+ /* ed */ 0xeba588, 0xeba589, 0xeba58a, 0xeba58b,
+ /* f1 */ 0xeba58c, 0x000000, 0xeba58d, 0xeba58e,
+ /* f5 */ 0xeba58f, 0xeba590, 0xeba591, 0xeba592,
+ /* f9 */ 0xeba593, 0xeba594, 0xeba595, 0xeba596,
+ /* fd */ 0xeba597,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 9fxx - offset 0x0165c ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeba598, 0xeba599, 0xeba59a, 0xeba59b,
+ /* 45 */ 0xeba59c, 0xeba59d, 0xeba59e, 0xeba59f,
+ /* 49 */ 0xeba5a0, 0xeba5a1, 0xeba5a2, 0xeba5a3,
+ /* 4d */ 0xeba5a4, 0xeba5a5, 0xeba5a6, 0xeba5a7,
+ /* 51 */ 0xeba5a8, 0x000000, 0xeba5a9, 0xeba5aa,
+ /* 55 */ 0xeba5ab, 0xeba5ac, 0xeba5ad, 0xeba5ae,
+ /* 59 */ 0xeba5af, 0xeba5b0, 0xeba5b1, 0xeba5b2,
+ /* 5d */ 0xeba5b3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba5b4, 0xeba5b5, 0xeba5b6, 0xeba5b7,
+ /* 65 */ 0xeba5b8, 0xeba5b9, 0xeba5ba, 0xeba5bb,
+ /* 69 */ 0xeba5bc, 0xeba5bd, 0xeba5be, 0xeba5bf,
+ /* 6d */ 0xeba680, 0xeba681, 0xeba682, 0xeba683,
+ /* 71 */ 0xeba684, 0x000000, 0xeba685, 0xeba686,
+ /* 75 */ 0xeba687, 0xeba688, 0xeba689, 0xeba68a,
+ /* 79 */ 0xeba68b, 0xeba68c, 0xeba68d, 0xeba68e,
+ /* 7d */ 0xeba68f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba690, 0xeba691, 0xeba692, 0xeba693,
+ /* 85 */ 0xeba694, 0xeba695, 0xeba696, 0xeba697,
+ /* 89 */ 0xeba698, 0xeba699, 0xeba69a, 0xeba69b,
+ /* 8d */ 0xeba69c, 0xeba69d, 0xeba69e, 0xeba69f,
+ /* 91 */ 0xeba6a0, 0x000000, 0xeba6a1, 0xeba6a2,
+ /* 95 */ 0xeba6a3, 0xeba6a4, 0xeba6a5, 0xeba6a6,
+ /* 99 */ 0xeba6a7, 0xeba6a8, 0xeba6a9, 0xeba6aa,
+ /* 9d */ 0xeba6ab, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeba6ac, 0xeba6ad, 0xeba6ae, 0xeba6af,
+ /* a5 */ 0xeba6b0, 0xeba6b1, 0xeba6b2, 0xeba6b3,
+ /* a9 */ 0xeba6b4, 0xeba6b5, 0xeba6b6, 0xeba6b7,
+ /* ad */ 0xeba6b8, 0xeba6b9, 0xeba6ba, 0xeba6bb,
+ /* b1 */ 0xeba6bc, 0x000000, 0xeba6bd, 0xeba6be,
+ /* b5 */ 0xeba6bf, 0xeba780, 0xeba781, 0xeba782,
+ /* b9 */ 0xeba783, 0xeba784, 0xeba785, 0xeba786,
+ /* bd */ 0xeba787, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a0xx - offset 0x0171a ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38581, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba788, 0xeba789, 0xeba78a, 0xeba78b,
+ /* 65 */ 0xeba78c, 0xeba78d, 0xeba78e, 0xeba78f,
+ /* 69 */ 0xeba790, 0xeba791, 0xeba792, 0xeba793,
+ /* 6d */ 0xeba794, 0xeba795, 0xeba796, 0xeba797,
+ /* 71 */ 0xeba798, 0x000000, 0xeba799, 0xeba79a,
+ /* 75 */ 0xeba79b, 0xeba79c, 0xeba79d, 0xeba79e,
+ /* 79 */ 0xeba79f, 0xeba7a0, 0xeba7a1, 0xeba7a2,
+ /* 7d */ 0xeba7a3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba7a4, 0xeba7a5, 0xeba7a6, 0xeba7a7,
+ /* 85 */ 0xeba7a8, 0xeba7a9, 0xeba7aa, 0xeba7ab,
+ /* 89 */ 0xeba7ac, 0xeba7ad, 0xeba7ae, 0xeba7af,
+ /* 8d */ 0xeba7b0, 0xeba7b1, 0xeba7b2, 0xeba7b3,
+ /* 91 */ 0xeba7b4, 0x000000, 0xeba7b5, 0xeba7b6,
+ /* 95 */ 0xeba7b7, 0xeba7b8, 0xeba7b9, 0xeba7ba,
+ /* 99 */ 0xeba7bb, 0xeba7bc, 0xeba7bd, 0xeba7be,
+ /* 9d */ 0xeba7bf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeba880, 0xeba881, 0xeba882, 0xeba883,
+ /* a5 */ 0xeba884, 0xeba885, 0xeba886, 0xeba887,
+ /* a9 */ 0xeba888, 0xeba889, 0xeba88a, 0xeba88b,
+ /* ad */ 0xeba88c, 0xeba88d, 0xeba88e, 0xeba88f,
+ /* b1 */ 0xeba890, 0x000000, 0xeba891, 0xeba892,
+ /* b5 */ 0xeba893, 0xeba894, 0xeba895, 0xeba896,
+ /* b9 */ 0xeba897, 0xeba898, 0xeba899, 0xeba89a,
+ /* bd */ 0xeba89b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeba89c, 0xeba89d, 0xeba89e, 0xeba89f,
+ /* c5 */ 0xeba8a0, 0xeba8a1, 0xeba8a2, 0xeba8a3,
+ /* c9 */ 0xeba8a4, 0xeba8a5, 0xeba8a6, 0xeba8a7,
+ /* cd */ 0xeba8a8, 0xeba8a9, 0xeba8aa, 0xeba8ab,
+ /* d1 */ 0xeba8ac, 0x000000, 0xeba8ad, 0xeba8ae,
+ /* d5 */ 0xeba8af, 0xeba8b0, 0xeba8b1, 0xeba8b2,
+ /* d9 */ 0xeba8b3, 0xeba8b4, 0xeba8b5, 0xeba8b6,
+ /* dd */ 0xeba8b7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeba8b8, 0xeba8b9, 0xeba8ba, 0xeba8bb,
+ /* e5 */ 0xeba8bc, 0xeba8bd, 0xeba8be, 0xeba8bf,
+ /* e9 */ 0xeba980, 0xeba981, 0xeba982, 0xeba983,
+ /* ed */ 0xeba984, 0xeba985, 0xeba986, 0xeba987,
+ /* f1 */ 0xeba988, 0x000000, 0xeba989, 0xeba98a,
+ /* f5 */ 0xeba98b, 0xeba98c, 0xeba98d, 0xeba98e,
+ /* f9 */ 0xeba98f, 0xeba990, 0xeba991, 0xeba992,
+ /* fd */ 0xeba993,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a1xx - offset 0x017e7 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeba994, 0xeba995, 0xeba996, 0xeba997,
+ /* 45 */ 0xeba998, 0xeba999, 0xeba99a, 0xeba99b,
+ /* 49 */ 0xeba99c, 0xeba99d, 0xeba99e, 0xeba99f,
+ /* 4d */ 0xeba9a0, 0xeba9a1, 0xeba9a2, 0xeba9a3,
+ /* 51 */ 0xeba9a4, 0x000000, 0xeba9a5, 0xeba9a6,
+ /* 55 */ 0xeba9a7, 0xeba9a8, 0xeba9a9, 0xeba9aa,
+ /* 59 */ 0xeba9ab, 0xeba9ac, 0xeba9ad, 0xeba9ae,
+ /* 5d */ 0xeba9af, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba9b0, 0xeba9b1, 0xeba9b2, 0xeba9b3,
+ /* 65 */ 0xeba9b4, 0xeba9b5, 0xeba9b6, 0xeba9b7,
+ /* 69 */ 0xeba9b8, 0xeba9b9, 0xeba9ba, 0xeba9bb,
+ /* 6d */ 0xeba9bc, 0xeba9bd, 0xeba9be, 0xeba9bf,
+ /* 71 */ 0xebaa80, 0x000000, 0xebaa81, 0xebaa82,
+ /* 75 */ 0xebaa83, 0xebaa84, 0xebaa85, 0xebaa86,
+ /* 79 */ 0xebaa87, 0xebaa88, 0xebaa89, 0xebaa8a,
+ /* 7d */ 0xebaa8b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebaa8c, 0xebaa8d, 0xebaa8e, 0xebaa8f,
+ /* 85 */ 0xebaa90, 0xebaa91, 0xebaa92, 0xebaa93,
+ /* 89 */ 0xebaa94, 0xebaa95, 0xebaa96, 0xebaa97,
+ /* 8d */ 0xebaa98, 0xebaa99, 0xebaa9a, 0xebaa9b,
+ /* 91 */ 0xebaa9c, 0x000000, 0xebaa9d, 0xebaa9e,
+ /* 95 */ 0xebaa9f, 0xebaaa0, 0xebaaa1, 0xebaaa2,
+ /* 99 */ 0xebaaa3, 0xebaaa4, 0xebaaa5, 0xebaaa6,
+ /* 9d */ 0xebaaa7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebaaa8, 0xebaaa9, 0xebaaaa, 0xebaaab,
+ /* a5 */ 0xebaaac, 0xebaaad, 0xebaaae, 0xebaaaf,
+ /* a9 */ 0xebaab0, 0xebaab1, 0xebaab2, 0xebaab3,
+ /* ad */ 0xebaab4, 0xebaab5, 0xebaab6, 0xebaab7,
+ /* b1 */ 0xebaab8, 0x000000, 0xebaab9, 0xebaaba,
+ /* b5 */ 0xebaabb, 0xebaabc, 0xebaabd, 0xebaabe,
+ /* b9 */ 0xebaabf, 0xebab80, 0xebab81, 0xebab82,
+ /* bd */ 0xebab83, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebab84, 0xebab85, 0xebab86, 0xebab87,
+ /* c5 */ 0xebab88, 0xebab89, 0xebab8a, 0xebab8b,
+ /* c9 */ 0xebab8c, 0xebab8d, 0xebab8e, 0xebab8f,
+ /* cd */ 0xebab90, 0xebab91, 0xebab92, 0xebab93,
+ /* d1 */ 0xebab94, 0x000000, 0xebab95, 0xebab96,
+ /* d5 */ 0xebab97, 0xebab98, 0xebab99, 0xebab9a,
+ /* d9 */ 0xebab9b, 0xebab9c, 0xebab9d, 0xebab9e,
+ /* dd */ 0xebab9f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebaba0, 0xebaba1, 0xebaba2, 0xebaba3,
+ /* e5 */ 0xebaba4, 0xebaba5, 0xebaba6, 0xebaba7,
+ /* e9 */ 0xebaba8, 0xebaba9, 0xebabaa, 0xebabab,
+ /* ed */ 0xebabac, 0xebabad, 0xebabae, 0xebabaf,
+ /* f1 */ 0xebabb0, 0x000000, 0xebabb1, 0xebabb2,
+ /* f5 */ 0xebabb3, 0xebabb4, 0xebabb5, 0xebabb6,
+ /* f9 */ 0xebabb7, 0xebabb8, 0xebabb9, 0xebabba,
+ /* fd */ 0xebabbb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a2xx - offset 0x018b4 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebabbc, 0xebabbd, 0xebabbe, 0xebabbf,
+ /* 45 */ 0xebac80, 0xebac81, 0xebac82, 0xebac83,
+ /* 49 */ 0xebac84, 0xebac85, 0xebac86, 0xebac87,
+ /* 4d */ 0xebac88, 0xebac89, 0xebac8a, 0xebac8b,
+ /* 51 */ 0xebac8c, 0x000000, 0xebac8d, 0xebac8e,
+ /* 55 */ 0xebac8f, 0xebac90, 0xebac91, 0xebac92,
+ /* 59 */ 0xebac93, 0xebac94, 0xebac95, 0xebac96,
+ /* 5d */ 0xebac97, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebac98, 0xebac99, 0xebac9a, 0xebac9b,
+ /* 65 */ 0xebac9c, 0xebac9d, 0xebac9e, 0xebac9f,
+ /* 69 */ 0xebaca0, 0xebaca1, 0xebaca2, 0xebaca3,
+ /* 6d */ 0xebaca4, 0xebaca5, 0xebaca6, 0xebaca7,
+ /* 71 */ 0xebaca8, 0x000000, 0xebaca9, 0xebacaa,
+ /* 75 */ 0xebacab, 0xebacac, 0xebacad, 0xebacae,
+ /* 79 */ 0xebacaf, 0xebacb0, 0xebacb1, 0xebacb2,
+ /* 7d */ 0xebacb3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebacb4, 0xebacb5, 0xebacb6, 0xebacb7,
+ /* 85 */ 0xebacb8, 0xebacb9, 0xebacba, 0xebacbb,
+ /* 89 */ 0xebacbc, 0xebacbd, 0xebacbe, 0xebacbf,
+ /* 8d */ 0xebad80, 0xebad81, 0xebad82, 0xebad83,
+ /* 91 */ 0xebad84, 0x000000, 0xebad85, 0xebad86,
+ /* 95 */ 0xebad87, 0xebad88, 0xebad89, 0xebad8a,
+ /* 99 */ 0xebad8b, 0xebad8c, 0xebad8d, 0xebad8e,
+ /* 9d */ 0xebad8f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebad90, 0xebad91, 0xebad92, 0xebad93,
+ /* a5 */ 0xebad94, 0xebad95, 0xebad96, 0xebad97,
+ /* a9 */ 0xebad98, 0xebad99, 0xebad9a, 0xebad9b,
+ /* ad */ 0xebad9c, 0xebad9d, 0xebad9e, 0xebad9f,
+ /* b1 */ 0xebada0, 0x000000, 0xebada1, 0xebada2,
+ /* b5 */ 0xebada3, 0xebada4, 0xebada5, 0xebada6,
+ /* b9 */ 0xebada7, 0xebada8, 0xebada9, 0xebadaa,
+ /* bd */ 0xebadab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebadac, 0xebadad, 0xebadae, 0xebadaf,
+ /* c5 */ 0xebadb0, 0xebadb1, 0xebadb2, 0xebadb3,
+ /* c9 */ 0xebadb4, 0xebadb5, 0xebadb6, 0xebadb7,
+ /* cd */ 0xebadb8, 0xebadb9, 0xebadba, 0xebadbb,
+ /* d1 */ 0xebadbc, 0x000000, 0xebadbd, 0xebadbe,
+ /* d5 */ 0xebadbf, 0xebae80, 0xebae81, 0xebae82,
+ /* d9 */ 0xebae83, 0xebae84, 0xebae85, 0xebae86,
+ /* dd */ 0xebae87, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebae88, 0xebae89, 0xebae8a, 0xebae8b,
+ /* e5 */ 0xebae8c, 0xebae8d, 0xebae8e, 0xebae8f,
+ /* e9 */ 0xebae90, 0xebae91, 0xebae92, 0xebae93,
+ /* ed */ 0xebae94, 0xebae95, 0xebae96, 0xebae97,
+ /* f1 */ 0xebae98, 0x000000, 0xebae99, 0xebae9a,
+ /* f5 */ 0xebae9b, 0xebae9c, 0xebae9d, 0xebae9e,
+ /* f9 */ 0xebae9f, 0xebaea0, 0xebaea1, 0xebaea2,
+ /* fd */ 0xebaea3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a3xx - offset 0x01981 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebaea4, 0xebaea5, 0xebaea6, 0xebaea7,
+ /* 45 */ 0xebaea8, 0xebaea9, 0xebaeaa, 0xebaeab,
+ /* 49 */ 0xebaeac, 0xebaead, 0xebaeae, 0xebaeaf,
+ /* 4d */ 0xebaeb0, 0xebaeb1, 0xebaeb2, 0xebaeb3,
+ /* 51 */ 0xebaeb4, 0x000000, 0xebaeb5, 0xebaeb6,
+ /* 55 */ 0xebaeb7, 0xebaeb8, 0xebaeb9, 0xebaeba,
+ /* 59 */ 0xebaebb, 0xebaebc, 0xebaebd, 0xebaebe,
+ /* 5d */ 0xebaebf, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebaf80, 0xebaf81, 0xebaf82, 0xebaf83,
+ /* 65 */ 0xebaf84, 0xebaf85, 0xebaf86, 0xebaf87,
+ /* 69 */ 0xebaf88, 0xebaf89, 0xebaf8a, 0xebaf8b,
+ /* 6d */ 0xebaf8c, 0xebaf8d, 0xebaf8e, 0xebaf8f,
+ /* 71 */ 0xebaf90, 0x000000, 0xebaf91, 0xebaf92,
+ /* 75 */ 0xebaf93, 0xebaf94, 0xebaf95, 0xebaf96,
+ /* 79 */ 0xebaf97, 0xebaf98, 0xebaf99, 0xebaf9a,
+ /* 7d */ 0xebaf9b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebaf9c, 0xebaf9d, 0xebaf9e, 0xebaf9f,
+ /* 85 */ 0xebafa0, 0xebafa1, 0xebafa2, 0xebafa3,
+ /* 89 */ 0xebafa4, 0xebafa5, 0xebafa6, 0xebafa7,
+ /* 8d */ 0xebafa8, 0xebafa9, 0xebafaa, 0xebafab,
+ /* 91 */ 0xebafac, 0x000000, 0xebafad, 0xebafae,
+ /* 95 */ 0xebafaf, 0xebafb0, 0xebafb1, 0xebafb2,
+ /* 99 */ 0xebafb3, 0xebafb4, 0xebafb5, 0xebafb6,
+ /* 9d */ 0xebafb7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebafb8, 0xebafb9, 0xebafba, 0xebafbb,
+ /* a5 */ 0xebafbc, 0xebafbd, 0xebafbe, 0xebafbf,
+ /* a9 */ 0xebb080, 0xebb081, 0xebb082, 0xebb083,
+ /* ad */ 0xebb084, 0xebb085, 0xebb086, 0xebb087,
+ /* b1 */ 0xebb088, 0x000000, 0xebb089, 0xebb08a,
+ /* b5 */ 0xebb08b, 0xebb08c, 0xebb08d, 0xebb08e,
+ /* b9 */ 0xebb08f, 0xebb090, 0xebb091, 0xebb092,
+ /* bd */ 0xebb093, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a4xx - offset 0x01a3f ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38582, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb094, 0xebb095, 0xebb096, 0xebb097,
+ /* 65 */ 0xebb098, 0xebb099, 0xebb09a, 0xebb09b,
+ /* 69 */ 0xebb09c, 0xebb09d, 0xebb09e, 0xebb09f,
+ /* 6d */ 0xebb0a0, 0xebb0a1, 0xebb0a2, 0xebb0a3,
+ /* 71 */ 0xebb0a4, 0x000000, 0xebb0a5, 0xebb0a6,
+ /* 75 */ 0xebb0a7, 0xebb0a8, 0xebb0a9, 0xebb0aa,
+ /* 79 */ 0xebb0ab, 0xebb0ac, 0xebb0ad, 0xebb0ae,
+ /* 7d */ 0xebb0af, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb0b0, 0xebb0b1, 0xebb0b2, 0xebb0b3,
+ /* 85 */ 0xebb0b4, 0xebb0b5, 0xebb0b6, 0xebb0b7,
+ /* 89 */ 0xebb0b8, 0xebb0b9, 0xebb0ba, 0xebb0bb,
+ /* 8d */ 0xebb0bc, 0xebb0bd, 0xebb0be, 0xebb0bf,
+ /* 91 */ 0xebb180, 0x000000, 0xebb181, 0xebb182,
+ /* 95 */ 0xebb183, 0xebb184, 0xebb185, 0xebb186,
+ /* 99 */ 0xebb187, 0xebb188, 0xebb189, 0xebb18a,
+ /* 9d */ 0xebb18b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebb18c, 0xebb18d, 0xebb18e, 0xebb18f,
+ /* a5 */ 0xebb190, 0xebb191, 0xebb192, 0xebb193,
+ /* a9 */ 0xebb194, 0xebb195, 0xebb196, 0xebb197,
+ /* ad */ 0xebb198, 0xebb199, 0xebb19a, 0xebb19b,
+ /* b1 */ 0xebb19c, 0x000000, 0xebb19d, 0xebb19e,
+ /* b5 */ 0xebb19f, 0xebb1a0, 0xebb1a1, 0xebb1a2,
+ /* b9 */ 0xebb1a3, 0xebb1a4, 0xebb1a5, 0xebb1a6,
+ /* bd */ 0xebb1a7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebb1a8, 0xebb1a9, 0xebb1aa, 0xebb1ab,
+ /* c5 */ 0xebb1ac, 0xebb1ad, 0xebb1ae, 0xebb1af,
+ /* c9 */ 0xebb1b0, 0xebb1b1, 0xebb1b2, 0xebb1b3,
+ /* cd */ 0xebb1b4, 0xebb1b5, 0xebb1b6, 0xebb1b7,
+ /* d1 */ 0xebb1b8, 0x000000, 0xebb1b9, 0xebb1ba,
+ /* d5 */ 0xebb1bb, 0xebb1bc, 0xebb1bd, 0xebb1be,
+ /* d9 */ 0xebb1bf, 0xebb280, 0xebb281, 0xebb282,
+ /* dd */ 0xebb283, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebb284, 0xebb285, 0xebb286, 0xebb287,
+ /* e5 */ 0xebb288, 0xebb289, 0xebb28a, 0xebb28b,
+ /* e9 */ 0xebb28c, 0xebb28d, 0xebb28e, 0xebb28f,
+ /* ed */ 0xebb290, 0xebb291, 0xebb292, 0xebb293,
+ /* f1 */ 0xebb294, 0x000000, 0xebb295, 0xebb296,
+ /* f5 */ 0xebb297, 0xebb298, 0xebb299, 0xebb29a,
+ /* f9 */ 0xebb29b, 0xebb29c, 0xebb29d, 0xebb29e,
+ /* fd */ 0xebb29f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a5xx - offset 0x01b0c ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebb2a0, 0xebb2a1, 0xebb2a2, 0xebb2a3,
+ /* 45 */ 0xebb2a4, 0xebb2a5, 0xebb2a6, 0xebb2a7,
+ /* 49 */ 0xebb2a8, 0xebb2a9, 0xebb2aa, 0xebb2ab,
+ /* 4d */ 0xebb2ac, 0xebb2ad, 0xebb2ae, 0xebb2af,
+ /* 51 */ 0xebb2b0, 0x000000, 0xebb2b1, 0xebb2b2,
+ /* 55 */ 0xebb2b3, 0xebb2b4, 0xebb2b5, 0xebb2b6,
+ /* 59 */ 0xebb2b7, 0xebb2b8, 0xebb2b9, 0xebb2ba,
+ /* 5d */ 0xebb2bb, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb2bc, 0xebb2bd, 0xebb2be, 0xebb2bf,
+ /* 65 */ 0xebb380, 0xebb381, 0xebb382, 0xebb383,
+ /* 69 */ 0xebb384, 0xebb385, 0xebb386, 0xebb387,
+ /* 6d */ 0xebb388, 0xebb389, 0xebb38a, 0xebb38b,
+ /* 71 */ 0xebb38c, 0x000000, 0xebb38d, 0xebb38e,
+ /* 75 */ 0xebb38f, 0xebb390, 0xebb391, 0xebb392,
+ /* 79 */ 0xebb393, 0xebb394, 0xebb395, 0xebb396,
+ /* 7d */ 0xebb397, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb398, 0xebb399, 0xebb39a, 0xebb39b,
+ /* 85 */ 0xebb39c, 0xebb39d, 0xebb39e, 0xebb39f,
+ /* 89 */ 0xebb3a0, 0xebb3a1, 0xebb3a2, 0xebb3a3,
+ /* 8d */ 0xebb3a4, 0xebb3a5, 0xebb3a6, 0xebb3a7,
+ /* 91 */ 0xebb3a8, 0x000000, 0xebb3a9, 0xebb3aa,
+ /* 95 */ 0xebb3ab, 0xebb3ac, 0xebb3ad, 0xebb3ae,
+ /* 99 */ 0xebb3af, 0xebb3b0, 0xebb3b1, 0xebb3b2,
+ /* 9d */ 0xebb3b3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebb3b4, 0xebb3b5, 0xebb3b6, 0xebb3b7,
+ /* a5 */ 0xebb3b8, 0xebb3b9, 0xebb3ba, 0xebb3bb,
+ /* a9 */ 0xebb3bc, 0xebb3bd, 0xebb3be, 0xebb3bf,
+ /* ad */ 0xebb480, 0xebb481, 0xebb482, 0xebb483,
+ /* b1 */ 0xebb484, 0x000000, 0xebb485, 0xebb486,
+ /* b5 */ 0xebb487, 0xebb488, 0xebb489, 0xebb48a,
+ /* b9 */ 0xebb48b, 0xebb48c, 0xebb48d, 0xebb48e,
+ /* bd */ 0xebb48f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebb490, 0xebb491, 0xebb492, 0xebb493,
+ /* c5 */ 0xebb494, 0xebb495, 0xebb496, 0xebb497,
+ /* c9 */ 0xebb498, 0xebb499, 0xebb49a, 0xebb49b,
+ /* cd */ 0xebb49c, 0xebb49d, 0xebb49e, 0xebb49f,
+ /* d1 */ 0xebb4a0, 0x000000, 0xebb4a1, 0xebb4a2,
+ /* d5 */ 0xebb4a3, 0xebb4a4, 0xebb4a5, 0xebb4a6,
+ /* d9 */ 0xebb4a7, 0xebb4a8, 0xebb4a9, 0xebb4aa,
+ /* dd */ 0xebb4ab, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebb4ac, 0xebb4ad, 0xebb4ae, 0xebb4af,
+ /* e5 */ 0xebb4b0, 0xebb4b1, 0xebb4b2, 0xebb4b3,
+ /* e9 */ 0xebb4b4, 0xebb4b5, 0xebb4b6, 0xebb4b7,
+ /* ed */ 0xebb4b8, 0xebb4b9, 0xebb4ba, 0xebb4bb,
+ /* f1 */ 0xebb4bc, 0x000000, 0xebb4bd, 0xebb4be,
+ /* f5 */ 0xebb4bf, 0xebb580, 0xebb581, 0xebb582,
+ /* f9 */ 0xebb583, 0xebb584, 0xebb585, 0xebb586,
+ /* fd */ 0xebb587,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a6xx - offset 0x01bd9 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebb588, 0xebb589, 0xebb58a, 0xebb58b,
+ /* 45 */ 0xebb58c, 0xebb58d, 0xebb58e, 0xebb58f,
+ /* 49 */ 0xebb590, 0xebb591, 0xebb592, 0xebb593,
+ /* 4d */ 0xebb594, 0xebb595, 0xebb596, 0xebb597,
+ /* 51 */ 0xebb598, 0x000000, 0xebb599, 0xebb59a,
+ /* 55 */ 0xebb59b, 0xebb59c, 0xebb59d, 0xebb59e,
+ /* 59 */ 0xebb59f, 0xebb5a0, 0xebb5a1, 0xebb5a2,
+ /* 5d */ 0xebb5a3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb5a4, 0xebb5a5, 0xebb5a6, 0xebb5a7,
+ /* 65 */ 0xebb5a8, 0xebb5a9, 0xebb5aa, 0xebb5ab,
+ /* 69 */ 0xebb5ac, 0xebb5ad, 0xebb5ae, 0xebb5af,
+ /* 6d */ 0xebb5b0, 0xebb5b1, 0xebb5b2, 0xebb5b3,
+ /* 71 */ 0xebb5b4, 0x000000, 0xebb5b5, 0xebb5b6,
+ /* 75 */ 0xebb5b7, 0xebb5b8, 0xebb5b9, 0xebb5ba,
+ /* 79 */ 0xebb5bb, 0xebb5bc, 0xebb5bd, 0xebb5be,
+ /* 7d */ 0xebb5bf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb680, 0xebb681, 0xebb682, 0xebb683,
+ /* 85 */ 0xebb684, 0xebb685, 0xebb686, 0xebb687,
+ /* 89 */ 0xebb688, 0xebb689, 0xebb68a, 0xebb68b,
+ /* 8d */ 0xebb68c, 0xebb68d, 0xebb68e, 0xebb68f,
+ /* 91 */ 0xebb690, 0x000000, 0xebb691, 0xebb692,
+ /* 95 */ 0xebb693, 0xebb694, 0xebb695, 0xebb696,
+ /* 99 */ 0xebb697, 0xebb698, 0xebb699, 0xebb69a,
+ /* 9d */ 0xebb69b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebb69c, 0xebb69d, 0xebb69e, 0xebb69f,
+ /* a5 */ 0xebb6a0, 0xebb6a1, 0xebb6a2, 0xebb6a3,
+ /* a9 */ 0xebb6a4, 0xebb6a5, 0xebb6a6, 0xebb6a7,
+ /* ad */ 0xebb6a8, 0xebb6a9, 0xebb6aa, 0xebb6ab,
+ /* b1 */ 0xebb6ac, 0x000000, 0xebb6ad, 0xebb6ae,
+ /* b5 */ 0xebb6af, 0xebb6b0, 0xebb6b1, 0xebb6b2,
+ /* b9 */ 0xebb6b3, 0xebb6b4, 0xebb6b5, 0xebb6b6,
+ /* bd */ 0xebb6b7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebb6b8, 0xebb6b9, 0xebb6ba, 0xebb6bb,
+ /* c5 */ 0xebb6bc, 0xebb6bd, 0xebb6be, 0xebb6bf,
+ /* c9 */ 0xebb780, 0xebb781, 0xebb782, 0xebb783,
+ /* cd */ 0xebb784, 0xebb785, 0xebb786, 0xebb787,
+ /* d1 */ 0xebb788, 0x000000, 0xebb789, 0xebb78a,
+ /* d5 */ 0xebb78b, 0xebb78c, 0xebb78d, 0xebb78e,
+ /* d9 */ 0xebb78f, 0xebb790, 0xebb791, 0xebb792,
+ /* dd */ 0xebb793, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebb794, 0xebb795, 0xebb796, 0xebb797,
+ /* e5 */ 0xebb798, 0xebb799, 0xebb79a, 0xebb79b,
+ /* e9 */ 0xebb79c, 0xebb79d, 0xebb79e, 0xebb79f,
+ /* ed */ 0xebb7a0, 0xebb7a1, 0xebb7a2, 0xebb7a3,
+ /* f1 */ 0xebb7a4, 0x000000, 0xebb7a5, 0xebb7a6,
+ /* f5 */ 0xebb7a7, 0xebb7a8, 0xebb7a9, 0xebb7aa,
+ /* f9 */ 0xebb7ab, 0xebb7ac, 0xebb7ad, 0xebb7ae,
+ /* fd */ 0xebb7af,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a7xx - offset 0x01ca6 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebb7b0, 0xebb7b1, 0xebb7b2, 0xebb7b3,
+ /* 45 */ 0xebb7b4, 0xebb7b5, 0xebb7b6, 0xebb7b7,
+ /* 49 */ 0xebb7b8, 0xebb7b9, 0xebb7ba, 0xebb7bb,
+ /* 4d */ 0xebb7bc, 0xebb7bd, 0xebb7be, 0xebb7bf,
+ /* 51 */ 0xebb880, 0x000000, 0xebb881, 0xebb882,
+ /* 55 */ 0xebb883, 0xebb884, 0xebb885, 0xebb886,
+ /* 59 */ 0xebb887, 0xebb888, 0xebb889, 0xebb88a,
+ /* 5d */ 0xebb88b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb88c, 0xebb88d, 0xebb88e, 0xebb88f,
+ /* 65 */ 0xebb890, 0xebb891, 0xebb892, 0xebb893,
+ /* 69 */ 0xebb894, 0xebb895, 0xebb896, 0xebb897,
+ /* 6d */ 0xebb898, 0xebb899, 0xebb89a, 0xebb89b,
+ /* 71 */ 0xebb89c, 0x000000, 0xebb89d, 0xebb89e,
+ /* 75 */ 0xebb89f, 0xebb8a0, 0xebb8a1, 0xebb8a2,
+ /* 79 */ 0xebb8a3, 0xebb8a4, 0xebb8a5, 0xebb8a6,
+ /* 7d */ 0xebb8a7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb8a8, 0xebb8a9, 0xebb8aa, 0xebb8ab,
+ /* 85 */ 0xebb8ac, 0xebb8ad, 0xebb8ae, 0xebb8af,
+ /* 89 */ 0xebb8b0, 0xebb8b1, 0xebb8b2, 0xebb8b3,
+ /* 8d */ 0xebb8b4, 0xebb8b5, 0xebb8b6, 0xebb8b7,
+ /* 91 */ 0xebb8b8, 0x000000, 0xebb8b9, 0xebb8ba,
+ /* 95 */ 0xebb8bb, 0xebb8bc, 0xebb8bd, 0xebb8be,
+ /* 99 */ 0xebb8bf, 0xebb980, 0xebb981, 0xebb982,
+ /* 9d */ 0xebb983, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebb984, 0xebb985, 0xebb986, 0xebb987,
+ /* a5 */ 0xebb988, 0xebb989, 0xebb98a, 0xebb98b,
+ /* a9 */ 0xebb98c, 0xebb98d, 0xebb98e, 0xebb98f,
+ /* ad */ 0xebb990, 0xebb991, 0xebb992, 0xebb993,
+ /* b1 */ 0xebb994, 0x000000, 0xebb995, 0xebb996,
+ /* b5 */ 0xebb997, 0xebb998, 0xebb999, 0xebb99a,
+ /* b9 */ 0xebb99b, 0xebb99c, 0xebb99d, 0xebb99e,
+ /* bd */ 0xebb99f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a8xx - offset 0x01d64 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38583, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb9a0, 0xebb9a1, 0xebb9a2, 0xebb9a3,
+ /* 65 */ 0xebb9a4, 0xebb9a5, 0xebb9a6, 0xebb9a7,
+ /* 69 */ 0xebb9a8, 0xebb9a9, 0xebb9aa, 0xebb9ab,
+ /* 6d */ 0xebb9ac, 0xebb9ad, 0xebb9ae, 0xebb9af,
+ /* 71 */ 0xebb9b0, 0x000000, 0xebb9b1, 0xebb9b2,
+ /* 75 */ 0xebb9b3, 0xebb9b4, 0xebb9b5, 0xebb9b6,
+ /* 79 */ 0xebb9b7, 0xebb9b8, 0xebb9b9, 0xebb9ba,
+ /* 7d */ 0xebb9bb, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb9bc, 0xebb9bd, 0xebb9be, 0xebb9bf,
+ /* 85 */ 0xebba80, 0xebba81, 0xebba82, 0xebba83,
+ /* 89 */ 0xebba84, 0xebba85, 0xebba86, 0xebba87,
+ /* 8d */ 0xebba88, 0xebba89, 0xebba8a, 0xebba8b,
+ /* 91 */ 0xebba8c, 0x000000, 0xebba8d, 0xebba8e,
+ /* 95 */ 0xebba8f, 0xebba90, 0xebba91, 0xebba92,
+ /* 99 */ 0xebba93, 0xebba94, 0xebba95, 0xebba96,
+ /* 9d */ 0xebba97, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebba98, 0xebba99, 0xebba9a, 0xebba9b,
+ /* a5 */ 0xebba9c, 0xebba9d, 0xebba9e, 0xebba9f,
+ /* a9 */ 0xebbaa0, 0xebbaa1, 0xebbaa2, 0xebbaa3,
+ /* ad */ 0xebbaa4, 0xebbaa5, 0xebbaa6, 0xebbaa7,
+ /* b1 */ 0xebbaa8, 0x000000, 0xebbaa9, 0xebbaaa,
+ /* b5 */ 0xebbaab, 0xebbaac, 0xebbaad, 0xebbaae,
+ /* b9 */ 0xebbaaf, 0xebbab0, 0xebbab1, 0xebbab2,
+ /* bd */ 0xebbab3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebbab4, 0xebbab5, 0xebbab6, 0xebbab7,
+ /* c5 */ 0xebbab8, 0xebbab9, 0xebbaba, 0xebbabb,
+ /* c9 */ 0xebbabc, 0xebbabd, 0xebbabe, 0xebbabf,
+ /* cd */ 0xebbb80, 0xebbb81, 0xebbb82, 0xebbb83,
+ /* d1 */ 0xebbb84, 0x000000, 0xebbb85, 0xebbb86,
+ /* d5 */ 0xebbb87, 0xebbb88, 0xebbb89, 0xebbb8a,
+ /* d9 */ 0xebbb8b, 0xebbb8c, 0xebbb8d, 0xebbb8e,
+ /* dd */ 0xebbb8f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebbb90, 0xebbb91, 0xebbb92, 0xebbb93,
+ /* e5 */ 0xebbb94, 0xebbb95, 0xebbb96, 0xebbb97,
+ /* e9 */ 0xebbb98, 0xebbb99, 0xebbb9a, 0xebbb9b,
+ /* ed */ 0xebbb9c, 0xebbb9d, 0xebbb9e, 0xebbb9f,
+ /* f1 */ 0xebbba0, 0x000000, 0xebbba1, 0xebbba2,
+ /* f5 */ 0xebbba3, 0xebbba4, 0xebbba5, 0xebbba6,
+ /* f9 */ 0xebbba7, 0xebbba8, 0xebbba9, 0xebbbaa,
+ /* fd */ 0xebbbab,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: a9xx - offset 0x01e31 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebbbac, 0xebbbad, 0xebbbae, 0xebbbaf,
+ /* 45 */ 0xebbbb0, 0xebbbb1, 0xebbbb2, 0xebbbb3,
+ /* 49 */ 0xebbbb4, 0xebbbb5, 0xebbbb6, 0xebbbb7,
+ /* 4d */ 0xebbbb8, 0xebbbb9, 0xebbbba, 0xebbbbb,
+ /* 51 */ 0xebbbbc, 0x000000, 0xebbbbd, 0xebbbbe,
+ /* 55 */ 0xebbbbf, 0xebbc80, 0xebbc81, 0xebbc82,
+ /* 59 */ 0xebbc83, 0xebbc84, 0xebbc85, 0xebbc86,
+ /* 5d */ 0xebbc87, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebbc88, 0xebbc89, 0xebbc8a, 0xebbc8b,
+ /* 65 */ 0xebbc8c, 0xebbc8d, 0xebbc8e, 0xebbc8f,
+ /* 69 */ 0xebbc90, 0xebbc91, 0xebbc92, 0xebbc93,
+ /* 6d */ 0xebbc94, 0xebbc95, 0xebbc96, 0xebbc97,
+ /* 71 */ 0xebbc98, 0x000000, 0xebbc99, 0xebbc9a,
+ /* 75 */ 0xebbc9b, 0xebbc9c, 0xebbc9d, 0xebbc9e,
+ /* 79 */ 0xebbc9f, 0xebbca0, 0xebbca1, 0xebbca2,
+ /* 7d */ 0xebbca3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebbca4, 0xebbca5, 0xebbca6, 0xebbca7,
+ /* 85 */ 0xebbca8, 0xebbca9, 0xebbcaa, 0xebbcab,
+ /* 89 */ 0xebbcac, 0xebbcad, 0xebbcae, 0xebbcaf,
+ /* 8d */ 0xebbcb0, 0xebbcb1, 0xebbcb2, 0xebbcb3,
+ /* 91 */ 0xebbcb4, 0x000000, 0xebbcb5, 0xebbcb6,
+ /* 95 */ 0xebbcb7, 0xebbcb8, 0xebbcb9, 0xebbcba,
+ /* 99 */ 0xebbcbb, 0xebbcbc, 0xebbcbd, 0xebbcbe,
+ /* 9d */ 0xebbcbf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebbd80, 0xebbd81, 0xebbd82, 0xebbd83,
+ /* a5 */ 0xebbd84, 0xebbd85, 0xebbd86, 0xebbd87,
+ /* a9 */ 0xebbd88, 0xebbd89, 0xebbd8a, 0xebbd8b,
+ /* ad */ 0xebbd8c, 0xebbd8d, 0xebbd8e, 0xebbd8f,
+ /* b1 */ 0xebbd90, 0x000000, 0xebbd91, 0xebbd92,
+ /* b5 */ 0xebbd93, 0xebbd94, 0xebbd95, 0xebbd96,
+ /* b9 */ 0xebbd97, 0xebbd98, 0xebbd99, 0xebbd9a,
+ /* bd */ 0xebbd9b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xebbd9c, 0xebbd9d, 0xebbd9e, 0xebbd9f,
+ /* c5 */ 0xebbda0, 0xebbda1, 0xebbda2, 0xebbda3,
+ /* c9 */ 0xebbda4, 0xebbda5, 0xebbda6, 0xebbda7,
+ /* cd */ 0xebbda8, 0xebbda9, 0xebbdaa, 0xebbdab,
+ /* d1 */ 0xebbdac, 0x000000, 0xebbdad, 0xebbdae,
+ /* d5 */ 0xebbdaf, 0xebbdb0, 0xebbdb1, 0xebbdb2,
+ /* d9 */ 0xebbdb3, 0xebbdb4, 0xebbdb5, 0xebbdb6,
+ /* dd */ 0xebbdb7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xebbdb8, 0xebbdb9, 0xebbdba, 0xebbdbb,
+ /* e5 */ 0xebbdbc, 0xebbdbd, 0xebbdbe, 0xebbdbf,
+ /* e9 */ 0xebbe80, 0xebbe81, 0xebbe82, 0xebbe83,
+ /* ed */ 0xebbe84, 0xebbe85, 0xebbe86, 0xebbe87,
+ /* f1 */ 0xebbe88, 0x000000, 0xebbe89, 0xebbe8a,
+ /* f5 */ 0xebbe8b, 0xebbe8c, 0xebbe8d, 0xebbe8e,
+ /* f9 */ 0xebbe8f, 0xebbe90, 0xebbe91, 0xebbe92,
+ /* fd */ 0xebbe93,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: aaxx - offset 0x01efe ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xebbe94, 0xebbe95, 0xebbe96, 0xebbe97,
+ /* 45 */ 0xebbe98, 0xebbe99, 0xebbe9a, 0xebbe9b,
+ /* 49 */ 0xebbe9c, 0xebbe9d, 0xebbe9e, 0xebbe9f,
+ /* 4d */ 0xebbea0, 0xebbea1, 0xebbea2, 0xebbea3,
+ /* 51 */ 0xebbea4, 0x000000, 0xebbea5, 0xebbea6,
+ /* 55 */ 0xebbea7, 0xebbea8, 0xebbea9, 0xebbeaa,
+ /* 59 */ 0xebbeab, 0xebbeac, 0xebbead, 0xebbeae,
+ /* 5d */ 0xebbeaf, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebbeb0, 0xebbeb1, 0xebbeb2, 0xebbeb3,
+ /* 65 */ 0xebbeb4, 0xebbeb5, 0xebbeb6, 0xebbeb7,
+ /* 69 */ 0xebbeb8, 0xebbeb9, 0xebbeba, 0xebbebb,
+ /* 6d */ 0xebbebc, 0xebbebd, 0xebbebe, 0xebbebf,
+ /* 71 */ 0xebbf80, 0x000000, 0xebbf81, 0xebbf82,
+ /* 75 */ 0xebbf83, 0xebbf84, 0xebbf85, 0xebbf86,
+ /* 79 */ 0xebbf87, 0xebbf88, 0xebbf89, 0xebbf8a,
+ /* 7d */ 0xebbf8b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebbf8c, 0xebbf8d, 0xebbf8e, 0xebbf8f,
+ /* 85 */ 0xebbf90, 0xebbf91, 0xebbf92, 0xebbf93,
+ /* 89 */ 0xebbf94, 0xebbf95, 0xebbf96, 0xebbf97,
+ /* 8d */ 0xebbf98, 0xebbf99, 0xebbf9a, 0xebbf9b,
+ /* 91 */ 0xebbf9c, 0x000000, 0xebbf9d, 0xebbf9e,
+ /* 95 */ 0xebbf9f, 0xebbfa0, 0xebbfa1, 0xebbfa2,
+ /* 99 */ 0xebbfa3, 0xebbfa4, 0xebbfa5, 0xebbfa6,
+ /* 9d */ 0xebbfa7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xebbfa8, 0xebbfa9, 0xebbfaa, 0xebbfab,
+ /* a5 */ 0xebbfac, 0xebbfad, 0xebbfae, 0xebbfaf,
+ /* a9 */ 0xebbfb0, 0xebbfb1, 0xebbfb2, 0xebbfb3,
+ /* ad */ 0xebbfb4, 0xebbfb5, 0xebbfb6, 0xebbfb7,
+ /* b1 */ 0xebbfb8, 0x000000, 0xebbfb9, 0xebbfba,
+ /* b5 */ 0xebbfbb, 0xebbfbc, 0xebbfbd, 0xebbfbe,
+ /* b9 */ 0xebbfbf, 0xec8080, 0xec8081, 0xec8082,
+ /* bd */ 0xec8083, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec8084, 0xec8085, 0xec8086, 0xec8087,
+ /* c5 */ 0xec8088, 0xec8089, 0xec808a, 0xec808b,
+ /* c9 */ 0xec808c, 0xec808d, 0xec808e, 0xec808f,
+ /* cd */ 0xec8090, 0xec8091, 0xec8092, 0xec8093,
+ /* d1 */ 0xec8094, 0x000000, 0xec8095, 0xec8096,
+ /* d5 */ 0xec8097, 0xec8098, 0xec8099, 0xec809a,
+ /* d9 */ 0xec809b, 0xec809c, 0xec809d, 0xec809e,
+ /* dd */ 0xec809f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec80a0, 0xec80a1, 0xec80a2, 0xec80a3,
+ /* e5 */ 0xec80a4, 0xec80a5, 0xec80a6, 0xec80a7,
+ /* e9 */ 0xec80a8, 0xec80a9, 0xec80aa, 0xec80ab,
+ /* ed */ 0xec80ac, 0xec80ad, 0xec80ae, 0xec80af,
+ /* f1 */ 0xec80b0, 0x000000, 0xec80b1, 0xec80b2,
+ /* f5 */ 0xec80b3, 0xec80b4, 0xec80b5, 0xec80b6,
+ /* f9 */ 0xec80b7, 0xec80b8, 0xec80b9, 0xec80ba,
+ /* fd */ 0xec80bb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: abxx - offset 0x01fcb ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec80bc, 0xec80bd, 0xec80be, 0xec80bf,
+ /* 45 */ 0xec8180, 0xec8181, 0xec8182, 0xec8183,
+ /* 49 */ 0xec8184, 0xec8185, 0xec8186, 0xec8187,
+ /* 4d */ 0xec8188, 0xec8189, 0xec818a, 0xec818b,
+ /* 51 */ 0xec818c, 0x000000, 0xec818d, 0xec818e,
+ /* 55 */ 0xec818f, 0xec8190, 0xec8191, 0xec8192,
+ /* 59 */ 0xec8193, 0xec8194, 0xec8195, 0xec8196,
+ /* 5d */ 0xec8197, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8198, 0xec8199, 0xec819a, 0xec819b,
+ /* 65 */ 0xec819c, 0xec819d, 0xec819e, 0xec819f,
+ /* 69 */ 0xec81a0, 0xec81a1, 0xec81a2, 0xec81a3,
+ /* 6d */ 0xec81a4, 0xec81a5, 0xec81a6, 0xec81a7,
+ /* 71 */ 0xec81a8, 0x000000, 0xec81a9, 0xec81aa,
+ /* 75 */ 0xec81ab, 0xec81ac, 0xec81ad, 0xec81ae,
+ /* 79 */ 0xec81af, 0xec81b0, 0xec81b1, 0xec81b2,
+ /* 7d */ 0xec81b3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec81b4, 0xec81b5, 0xec81b6, 0xec81b7,
+ /* 85 */ 0xec81b8, 0xec81b9, 0xec81ba, 0xec81bb,
+ /* 89 */ 0xec81bc, 0xec81bd, 0xec81be, 0xec81bf,
+ /* 8d */ 0xec8280, 0xec8281, 0xec8282, 0xec8283,
+ /* 91 */ 0xec8284, 0x000000, 0xec8285, 0xec8286,
+ /* 95 */ 0xec8287, 0xec8288, 0xec8289, 0xec828a,
+ /* 99 */ 0xec828b, 0xec828c, 0xec828d, 0xec828e,
+ /* 9d */ 0xec828f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec8290, 0xec8291, 0xec8292, 0xec8293,
+ /* a5 */ 0xec8294, 0xec8295, 0xec8296, 0xec8297,
+ /* a9 */ 0xec8298, 0xec8299, 0xec829a, 0xec829b,
+ /* ad */ 0xec829c, 0xec829d, 0xec829e, 0xec829f,
+ /* b1 */ 0xec82a0, 0x000000, 0xec82a1, 0xec82a2,
+ /* b5 */ 0xec82a3, 0xec82a4, 0xec82a5, 0xec82a6,
+ /* b9 */ 0xec82a7, 0xec82a8, 0xec82a9, 0xec82aa,
+ /* bd */ 0xec82ab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: acxx - offset 0x02089 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38585, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec82ac, 0xec82ad, 0xec82ae, 0xec82af,
+ /* 65 */ 0xec82b0, 0xec82b1, 0xec82b2, 0xec82b3,
+ /* 69 */ 0xec82b4, 0xec82b5, 0xec82b6, 0xec82b7,
+ /* 6d */ 0xec82b8, 0xec82b9, 0xec82ba, 0xec82bb,
+ /* 71 */ 0xec82bc, 0x000000, 0xec82bd, 0xec82be,
+ /* 75 */ 0xec82bf, 0xec8380, 0xec8381, 0xec8382,
+ /* 79 */ 0xec8383, 0xec8384, 0xec8385, 0xec8386,
+ /* 7d */ 0xec8387, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8388, 0xec8389, 0xec838a, 0xec838b,
+ /* 85 */ 0xec838c, 0xec838d, 0xec838e, 0xec838f,
+ /* 89 */ 0xec8390, 0xec8391, 0xec8392, 0xec8393,
+ /* 8d */ 0xec8394, 0xec8395, 0xec8396, 0xec8397,
+ /* 91 */ 0xec8398, 0x000000, 0xec8399, 0xec839a,
+ /* 95 */ 0xec839b, 0xec839c, 0xec839d, 0xec839e,
+ /* 99 */ 0xec839f, 0xec83a0, 0xec83a1, 0xec83a2,
+ /* 9d */ 0xec83a3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec83a4, 0xec83a5, 0xec83a6, 0xec83a7,
+ /* a5 */ 0xec83a8, 0xec83a9, 0xec83aa, 0xec83ab,
+ /* a9 */ 0xec83ac, 0xec83ad, 0xec83ae, 0xec83af,
+ /* ad */ 0xec83b0, 0xec83b1, 0xec83b2, 0xec83b3,
+ /* b1 */ 0xec83b4, 0x000000, 0xec83b5, 0xec83b6,
+ /* b5 */ 0xec83b7, 0xec83b8, 0xec83b9, 0xec83ba,
+ /* b9 */ 0xec83bb, 0xec83bc, 0xec83bd, 0xec83be,
+ /* bd */ 0xec83bf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec8480, 0xec8481, 0xec8482, 0xec8483,
+ /* c5 */ 0xec8484, 0xec8485, 0xec8486, 0xec8487,
+ /* c9 */ 0xec8488, 0xec8489, 0xec848a, 0xec848b,
+ /* cd */ 0xec848c, 0xec848d, 0xec848e, 0xec848f,
+ /* d1 */ 0xec8490, 0x000000, 0xec8491, 0xec8492,
+ /* d5 */ 0xec8493, 0xec8494, 0xec8495, 0xec8496,
+ /* d9 */ 0xec8497, 0xec8498, 0xec8499, 0xec849a,
+ /* dd */ 0xec849b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec849c, 0xec849d, 0xec849e, 0xec849f,
+ /* e5 */ 0xec84a0, 0xec84a1, 0xec84a2, 0xec84a3,
+ /* e9 */ 0xec84a4, 0xec84a5, 0xec84a6, 0xec84a7,
+ /* ed */ 0xec84a8, 0xec84a9, 0xec84aa, 0xec84ab,
+ /* f1 */ 0xec84ac, 0x000000, 0xec84ad, 0xec84ae,
+ /* f5 */ 0xec84af, 0xec84b0, 0xec84b1, 0xec84b2,
+ /* f9 */ 0xec84b3, 0xec84b4, 0xec84b5, 0xec84b6,
+ /* fd */ 0xec84b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: adxx - offset 0x02156 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec84b8, 0xec84b9, 0xec84ba, 0xec84bb,
+ /* 45 */ 0xec84bc, 0xec84bd, 0xec84be, 0xec84bf,
+ /* 49 */ 0xec8580, 0xec8581, 0xec8582, 0xec8583,
+ /* 4d */ 0xec8584, 0xec8585, 0xec8586, 0xec8587,
+ /* 51 */ 0xec8588, 0x000000, 0xec8589, 0xec858a,
+ /* 55 */ 0xec858b, 0xec858c, 0xec858d, 0xec858e,
+ /* 59 */ 0xec858f, 0xec8590, 0xec8591, 0xec8592,
+ /* 5d */ 0xec8593, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8594, 0xec8595, 0xec8596, 0xec8597,
+ /* 65 */ 0xec8598, 0xec8599, 0xec859a, 0xec859b,
+ /* 69 */ 0xec859c, 0xec859d, 0xec859e, 0xec859f,
+ /* 6d */ 0xec85a0, 0xec85a1, 0xec85a2, 0xec85a3,
+ /* 71 */ 0xec85a4, 0x000000, 0xec85a5, 0xec85a6,
+ /* 75 */ 0xec85a7, 0xec85a8, 0xec85a9, 0xec85aa,
+ /* 79 */ 0xec85ab, 0xec85ac, 0xec85ad, 0xec85ae,
+ /* 7d */ 0xec85af, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec85b0, 0xec85b1, 0xec85b2, 0xec85b3,
+ /* 85 */ 0xec85b4, 0xec85b5, 0xec85b6, 0xec85b7,
+ /* 89 */ 0xec85b8, 0xec85b9, 0xec85ba, 0xec85bb,
+ /* 8d */ 0xec85bc, 0xec85bd, 0xec85be, 0xec85bf,
+ /* 91 */ 0xec8680, 0x000000, 0xec8681, 0xec8682,
+ /* 95 */ 0xec8683, 0xec8684, 0xec8685, 0xec8686,
+ /* 99 */ 0xec8687, 0xec8688, 0xec8689, 0xec868a,
+ /* 9d */ 0xec868b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec868c, 0xec868d, 0xec868e, 0xec868f,
+ /* a5 */ 0xec8690, 0xec8691, 0xec8692, 0xec8693,
+ /* a9 */ 0xec8694, 0xec8695, 0xec8696, 0xec8697,
+ /* ad */ 0xec8698, 0xec8699, 0xec869a, 0xec869b,
+ /* b1 */ 0xec869c, 0x000000, 0xec869d, 0xec869e,
+ /* b5 */ 0xec869f, 0xec86a0, 0xec86a1, 0xec86a2,
+ /* b9 */ 0xec86a3, 0xec86a4, 0xec86a5, 0xec86a6,
+ /* bd */ 0xec86a7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec86a8, 0xec86a9, 0xec86aa, 0xec86ab,
+ /* c5 */ 0xec86ac, 0xec86ad, 0xec86ae, 0xec86af,
+ /* c9 */ 0xec86b0, 0xec86b1, 0xec86b2, 0xec86b3,
+ /* cd */ 0xec86b4, 0xec86b5, 0xec86b6, 0xec86b7,
+ /* d1 */ 0xec86b8, 0x000000, 0xec86b9, 0xec86ba,
+ /* d5 */ 0xec86bb, 0xec86bc, 0xec86bd, 0xec86be,
+ /* d9 */ 0xec86bf, 0xec8780, 0xec8781, 0xec8782,
+ /* dd */ 0xec8783, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec8784, 0xec8785, 0xec8786, 0xec8787,
+ /* e5 */ 0xec8788, 0xec8789, 0xec878a, 0xec878b,
+ /* e9 */ 0xec878c, 0xec878d, 0xec878e, 0xec878f,
+ /* ed */ 0xec8790, 0xec8791, 0xec8792, 0xec8793,
+ /* f1 */ 0xec8794, 0x000000, 0xec8795, 0xec8796,
+ /* f5 */ 0xec8797, 0xec8798, 0xec8799, 0xec879a,
+ /* f9 */ 0xec879b, 0xec879c, 0xec879d, 0xec879e,
+ /* fd */ 0xec879f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: aexx - offset 0x02223 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec87a0, 0xec87a1, 0xec87a2, 0xec87a3,
+ /* 45 */ 0xec87a4, 0xec87a5, 0xec87a6, 0xec87a7,
+ /* 49 */ 0xec87a8, 0xec87a9, 0xec87aa, 0xec87ab,
+ /* 4d */ 0xec87ac, 0xec87ad, 0xec87ae, 0xec87af,
+ /* 51 */ 0xec87b0, 0x000000, 0xec87b1, 0xec87b2,
+ /* 55 */ 0xec87b3, 0xec87b4, 0xec87b5, 0xec87b6,
+ /* 59 */ 0xec87b7, 0xec87b8, 0xec87b9, 0xec87ba,
+ /* 5d */ 0xec87bb, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec87bc, 0xec87bd, 0xec87be, 0xec87bf,
+ /* 65 */ 0xec8880, 0xec8881, 0xec8882, 0xec8883,
+ /* 69 */ 0xec8884, 0xec8885, 0xec8886, 0xec8887,
+ /* 6d */ 0xec8888, 0xec8889, 0xec888a, 0xec888b,
+ /* 71 */ 0xec888c, 0x000000, 0xec888d, 0xec888e,
+ /* 75 */ 0xec888f, 0xec8890, 0xec8891, 0xec8892,
+ /* 79 */ 0xec8893, 0xec8894, 0xec8895, 0xec8896,
+ /* 7d */ 0xec8897, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8898, 0xec8899, 0xec889a, 0xec889b,
+ /* 85 */ 0xec889c, 0xec889d, 0xec889e, 0xec889f,
+ /* 89 */ 0xec88a0, 0xec88a1, 0xec88a2, 0xec88a3,
+ /* 8d */ 0xec88a4, 0xec88a5, 0xec88a6, 0xec88a7,
+ /* 91 */ 0xec88a8, 0x000000, 0xec88a9, 0xec88aa,
+ /* 95 */ 0xec88ab, 0xec88ac, 0xec88ad, 0xec88ae,
+ /* 99 */ 0xec88af, 0xec88b0, 0xec88b1, 0xec88b2,
+ /* 9d */ 0xec88b3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec88b4, 0xec88b5, 0xec88b6, 0xec88b7,
+ /* a5 */ 0xec88b8, 0xec88b9, 0xec88ba, 0xec88bb,
+ /* a9 */ 0xec88bc, 0xec88bd, 0xec88be, 0xec88bf,
+ /* ad */ 0xec8980, 0xec8981, 0xec8982, 0xec8983,
+ /* b1 */ 0xec8984, 0x000000, 0xec8985, 0xec8986,
+ /* b5 */ 0xec8987, 0xec8988, 0xec8989, 0xec898a,
+ /* b9 */ 0xec898b, 0xec898c, 0xec898d, 0xec898e,
+ /* bd */ 0xec898f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec8990, 0xec8991, 0xec8992, 0xec8993,
+ /* c5 */ 0xec8994, 0xec8995, 0xec8996, 0xec8997,
+ /* c9 */ 0xec8998, 0xec8999, 0xec899a, 0xec899b,
+ /* cd */ 0xec899c, 0xec899d, 0xec899e, 0xec899f,
+ /* d1 */ 0xec89a0, 0x000000, 0xec89a1, 0xec89a2,
+ /* d5 */ 0xec89a3, 0xec89a4, 0xec89a5, 0xec89a6,
+ /* d9 */ 0xec89a7, 0xec89a8, 0xec89a9, 0xec89aa,
+ /* dd */ 0xec89ab, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec89ac, 0xec89ad, 0xec89ae, 0xec89af,
+ /* e5 */ 0xec89b0, 0xec89b1, 0xec89b2, 0xec89b3,
+ /* e9 */ 0xec89b4, 0xec89b5, 0xec89b6, 0xec89b7,
+ /* ed */ 0xec89b8, 0xec89b9, 0xec89ba, 0xec89bb,
+ /* f1 */ 0xec89bc, 0x000000, 0xec89bd, 0xec89be,
+ /* f5 */ 0xec89bf, 0xec8a80, 0xec8a81, 0xec8a82,
+ /* f9 */ 0xec8a83, 0xec8a84, 0xec8a85, 0xec8a86,
+ /* fd */ 0xec8a87,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: afxx - offset 0x022f0 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec8a88, 0xec8a89, 0xec8a8a, 0xec8a8b,
+ /* 45 */ 0xec8a8c, 0xec8a8d, 0xec8a8e, 0xec8a8f,
+ /* 49 */ 0xec8a90, 0xec8a91, 0xec8a92, 0xec8a93,
+ /* 4d */ 0xec8a94, 0xec8a95, 0xec8a96, 0xec8a97,
+ /* 51 */ 0xec8a98, 0x000000, 0xec8a99, 0xec8a9a,
+ /* 55 */ 0xec8a9b, 0xec8a9c, 0xec8a9d, 0xec8a9e,
+ /* 59 */ 0xec8a9f, 0xec8aa0, 0xec8aa1, 0xec8aa2,
+ /* 5d */ 0xec8aa3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8aa4, 0xec8aa5, 0xec8aa6, 0xec8aa7,
+ /* 65 */ 0xec8aa8, 0xec8aa9, 0xec8aaa, 0xec8aab,
+ /* 69 */ 0xec8aac, 0xec8aad, 0xec8aae, 0xec8aaf,
+ /* 6d */ 0xec8ab0, 0xec8ab1, 0xec8ab2, 0xec8ab3,
+ /* 71 */ 0xec8ab4, 0x000000, 0xec8ab5, 0xec8ab6,
+ /* 75 */ 0xec8ab7, 0xec8ab8, 0xec8ab9, 0xec8aba,
+ /* 79 */ 0xec8abb, 0xec8abc, 0xec8abd, 0xec8abe,
+ /* 7d */ 0xec8abf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8b80, 0xec8b81, 0xec8b82, 0xec8b83,
+ /* 85 */ 0xec8b84, 0xec8b85, 0xec8b86, 0xec8b87,
+ /* 89 */ 0xec8b88, 0xec8b89, 0xec8b8a, 0xec8b8b,
+ /* 8d */ 0xec8b8c, 0xec8b8d, 0xec8b8e, 0xec8b8f,
+ /* 91 */ 0xec8b90, 0x000000, 0xec8b91, 0xec8b92,
+ /* 95 */ 0xec8b93, 0xec8b94, 0xec8b95, 0xec8b96,
+ /* 99 */ 0xec8b97, 0xec8b98, 0xec8b99, 0xec8b9a,
+ /* 9d */ 0xec8b9b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec8b9c, 0xec8b9d, 0xec8b9e, 0xec8b9f,
+ /* a5 */ 0xec8ba0, 0xec8ba1, 0xec8ba2, 0xec8ba3,
+ /* a9 */ 0xec8ba4, 0xec8ba5, 0xec8ba6, 0xec8ba7,
+ /* ad */ 0xec8ba8, 0xec8ba9, 0xec8baa, 0xec8bab,
+ /* b1 */ 0xec8bac, 0x000000, 0xec8bad, 0xec8bae,
+ /* b5 */ 0xec8baf, 0xec8bb0, 0xec8bb1, 0xec8bb2,
+ /* b9 */ 0xec8bb3, 0xec8bb4, 0xec8bb5, 0xec8bb6,
+ /* bd */ 0xec8bb7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b0xx - offset 0x023ae ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38586, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8bb8, 0xec8bb9, 0xec8bba, 0xec8bbb,
+ /* 65 */ 0xec8bbc, 0xec8bbd, 0xec8bbe, 0xec8bbf,
+ /* 69 */ 0xec8c80, 0xec8c81, 0xec8c82, 0xec8c83,
+ /* 6d */ 0xec8c84, 0xec8c85, 0xec8c86, 0xec8c87,
+ /* 71 */ 0xec8c88, 0x000000, 0xec8c89, 0xec8c8a,
+ /* 75 */ 0xec8c8b, 0xec8c8c, 0xec8c8d, 0xec8c8e,
+ /* 79 */ 0xec8c8f, 0xec8c90, 0xec8c91, 0xec8c92,
+ /* 7d */ 0xec8c93, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8c94, 0xec8c95, 0xec8c96, 0xec8c97,
+ /* 85 */ 0xec8c98, 0xec8c99, 0xec8c9a, 0xec8c9b,
+ /* 89 */ 0xec8c9c, 0xec8c9d, 0xec8c9e, 0xec8c9f,
+ /* 8d */ 0xec8ca0, 0xec8ca1, 0xec8ca2, 0xec8ca3,
+ /* 91 */ 0xec8ca4, 0x000000, 0xec8ca5, 0xec8ca6,
+ /* 95 */ 0xec8ca7, 0xec8ca8, 0xec8ca9, 0xec8caa,
+ /* 99 */ 0xec8cab, 0xec8cac, 0xec8cad, 0xec8cae,
+ /* 9d */ 0xec8caf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec8cb0, 0xec8cb1, 0xec8cb2, 0xec8cb3,
+ /* a5 */ 0xec8cb4, 0xec8cb5, 0xec8cb6, 0xec8cb7,
+ /* a9 */ 0xec8cb8, 0xec8cb9, 0xec8cba, 0xec8cbb,
+ /* ad */ 0xec8cbc, 0xec8cbd, 0xec8cbe, 0xec8cbf,
+ /* b1 */ 0xec8d80, 0x000000, 0xec8d81, 0xec8d82,
+ /* b5 */ 0xec8d83, 0xec8d84, 0xec8d85, 0xec8d86,
+ /* b9 */ 0xec8d87, 0xec8d88, 0xec8d89, 0xec8d8a,
+ /* bd */ 0xec8d8b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec8d8c, 0xec8d8d, 0xec8d8e, 0xec8d8f,
+ /* c5 */ 0xec8d90, 0xec8d91, 0xec8d92, 0xec8d93,
+ /* c9 */ 0xec8d94, 0xec8d95, 0xec8d96, 0xec8d97,
+ /* cd */ 0xec8d98, 0xec8d99, 0xec8d9a, 0xec8d9b,
+ /* d1 */ 0xec8d9c, 0x000000, 0xec8d9d, 0xec8d9e,
+ /* d5 */ 0xec8d9f, 0xec8da0, 0xec8da1, 0xec8da2,
+ /* d9 */ 0xec8da3, 0xec8da4, 0xec8da5, 0xec8da6,
+ /* dd */ 0xec8da7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec8da8, 0xec8da9, 0xec8daa, 0xec8dab,
+ /* e5 */ 0xec8dac, 0xec8dad, 0xec8dae, 0xec8daf,
+ /* e9 */ 0xec8db0, 0xec8db1, 0xec8db2, 0xec8db3,
+ /* ed */ 0xec8db4, 0xec8db5, 0xec8db6, 0xec8db7,
+ /* f1 */ 0xec8db8, 0x000000, 0xec8db9, 0xec8dba,
+ /* f5 */ 0xec8dbb, 0xec8dbc, 0xec8dbd, 0xec8dbe,
+ /* f9 */ 0xec8dbf, 0xec8e80, 0xec8e81, 0xec8e82,
+ /* fd */ 0xec8e83,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b1xx - offset 0x0247b ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec8e84, 0xec8e85, 0xec8e86, 0xec8e87,
+ /* 45 */ 0xec8e88, 0xec8e89, 0xec8e8a, 0xec8e8b,
+ /* 49 */ 0xec8e8c, 0xec8e8d, 0xec8e8e, 0xec8e8f,
+ /* 4d */ 0xec8e90, 0xec8e91, 0xec8e92, 0xec8e93,
+ /* 51 */ 0xec8e94, 0x000000, 0xec8e95, 0xec8e96,
+ /* 55 */ 0xec8e97, 0xec8e98, 0xec8e99, 0xec8e9a,
+ /* 59 */ 0xec8e9b, 0xec8e9c, 0xec8e9d, 0xec8e9e,
+ /* 5d */ 0xec8e9f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8ea0, 0xec8ea1, 0xec8ea2, 0xec8ea3,
+ /* 65 */ 0xec8ea4, 0xec8ea5, 0xec8ea6, 0xec8ea7,
+ /* 69 */ 0xec8ea8, 0xec8ea9, 0xec8eaa, 0xec8eab,
+ /* 6d */ 0xec8eac, 0xec8ead, 0xec8eae, 0xec8eaf,
+ /* 71 */ 0xec8eb0, 0x000000, 0xec8eb1, 0xec8eb2,
+ /* 75 */ 0xec8eb3, 0xec8eb4, 0xec8eb5, 0xec8eb6,
+ /* 79 */ 0xec8eb7, 0xec8eb8, 0xec8eb9, 0xec8eba,
+ /* 7d */ 0xec8ebb, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8ebc, 0xec8ebd, 0xec8ebe, 0xec8ebf,
+ /* 85 */ 0xec8f80, 0xec8f81, 0xec8f82, 0xec8f83,
+ /* 89 */ 0xec8f84, 0xec8f85, 0xec8f86, 0xec8f87,
+ /* 8d */ 0xec8f88, 0xec8f89, 0xec8f8a, 0xec8f8b,
+ /* 91 */ 0xec8f8c, 0x000000, 0xec8f8d, 0xec8f8e,
+ /* 95 */ 0xec8f8f, 0xec8f90, 0xec8f91, 0xec8f92,
+ /* 99 */ 0xec8f93, 0xec8f94, 0xec8f95, 0xec8f96,
+ /* 9d */ 0xec8f97, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec8f98, 0xec8f99, 0xec8f9a, 0xec8f9b,
+ /* a5 */ 0xec8f9c, 0xec8f9d, 0xec8f9e, 0xec8f9f,
+ /* a9 */ 0xec8fa0, 0xec8fa1, 0xec8fa2, 0xec8fa3,
+ /* ad */ 0xec8fa4, 0xec8fa5, 0xec8fa6, 0xec8fa7,
+ /* b1 */ 0xec8fa8, 0x000000, 0xec8fa9, 0xec8faa,
+ /* b5 */ 0xec8fab, 0xec8fac, 0xec8fad, 0xec8fae,
+ /* b9 */ 0xec8faf, 0xec8fb0, 0xec8fb1, 0xec8fb2,
+ /* bd */ 0xec8fb3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec8fb4, 0xec8fb5, 0xec8fb6, 0xec8fb7,
+ /* c5 */ 0xec8fb8, 0xec8fb9, 0xec8fba, 0xec8fbb,
+ /* c9 */ 0xec8fbc, 0xec8fbd, 0xec8fbe, 0xec8fbf,
+ /* cd */ 0xec9080, 0xec9081, 0xec9082, 0xec9083,
+ /* d1 */ 0xec9084, 0x000000, 0xec9085, 0xec9086,
+ /* d5 */ 0xec9087, 0xec9088, 0xec9089, 0xec908a,
+ /* d9 */ 0xec908b, 0xec908c, 0xec908d, 0xec908e,
+ /* dd */ 0xec908f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec9090, 0xec9091, 0xec9092, 0xec9093,
+ /* e5 */ 0xec9094, 0xec9095, 0xec9096, 0xec9097,
+ /* e9 */ 0xec9098, 0xec9099, 0xec909a, 0xec909b,
+ /* ed */ 0xec909c, 0xec909d, 0xec909e, 0xec909f,
+ /* f1 */ 0xec90a0, 0x000000, 0xec90a1, 0xec90a2,
+ /* f5 */ 0xec90a3, 0xec90a4, 0xec90a5, 0xec90a6,
+ /* f9 */ 0xec90a7, 0xec90a8, 0xec90a9, 0xec90aa,
+ /* fd */ 0xec90ab,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b2xx - offset 0x02548 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec90ac, 0xec90ad, 0xec90ae, 0xec90af,
+ /* 45 */ 0xec90b0, 0xec90b1, 0xec90b2, 0xec90b3,
+ /* 49 */ 0xec90b4, 0xec90b5, 0xec90b6, 0xec90b7,
+ /* 4d */ 0xec90b8, 0xec90b9, 0xec90ba, 0xec90bb,
+ /* 51 */ 0xec90bc, 0x000000, 0xec90bd, 0xec90be,
+ /* 55 */ 0xec90bf, 0xec9180, 0xec9181, 0xec9182,
+ /* 59 */ 0xec9183, 0xec9184, 0xec9185, 0xec9186,
+ /* 5d */ 0xec9187, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9188, 0xec9189, 0xec918a, 0xec918b,
+ /* 65 */ 0xec918c, 0xec918d, 0xec918e, 0xec918f,
+ /* 69 */ 0xec9190, 0xec9191, 0xec9192, 0xec9193,
+ /* 6d */ 0xec9194, 0xec9195, 0xec9196, 0xec9197,
+ /* 71 */ 0xec9198, 0x000000, 0xec9199, 0xec919a,
+ /* 75 */ 0xec919b, 0xec919c, 0xec919d, 0xec919e,
+ /* 79 */ 0xec919f, 0xec91a0, 0xec91a1, 0xec91a2,
+ /* 7d */ 0xec91a3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec91a4, 0xec91a5, 0xec91a6, 0xec91a7,
+ /* 85 */ 0xec91a8, 0xec91a9, 0xec91aa, 0xec91ab,
+ /* 89 */ 0xec91ac, 0xec91ad, 0xec91ae, 0xec91af,
+ /* 8d */ 0xec91b0, 0xec91b1, 0xec91b2, 0xec91b3,
+ /* 91 */ 0xec91b4, 0x000000, 0xec91b5, 0xec91b6,
+ /* 95 */ 0xec91b7, 0xec91b8, 0xec91b9, 0xec91ba,
+ /* 99 */ 0xec91bb, 0xec91bc, 0xec91bd, 0xec91be,
+ /* 9d */ 0xec91bf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec9280, 0xec9281, 0xec9282, 0xec9283,
+ /* a5 */ 0xec9284, 0xec9285, 0xec9286, 0xec9287,
+ /* a9 */ 0xec9288, 0xec9289, 0xec928a, 0xec928b,
+ /* ad */ 0xec928c, 0xec928d, 0xec928e, 0xec928f,
+ /* b1 */ 0xec9290, 0x000000, 0xec9291, 0xec9292,
+ /* b5 */ 0xec9293, 0xec9294, 0xec9295, 0xec9296,
+ /* b9 */ 0xec9297, 0xec9298, 0xec9299, 0xec929a,
+ /* bd */ 0xec929b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec929c, 0xec929d, 0xec929e, 0xec929f,
+ /* c5 */ 0xec92a0, 0xec92a1, 0xec92a2, 0xec92a3,
+ /* c9 */ 0xec92a4, 0xec92a5, 0xec92a6, 0xec92a7,
+ /* cd */ 0xec92a8, 0xec92a9, 0xec92aa, 0xec92ab,
+ /* d1 */ 0xec92ac, 0x000000, 0xec92ad, 0xec92ae,
+ /* d5 */ 0xec92af, 0xec92b0, 0xec92b1, 0xec92b2,
+ /* d9 */ 0xec92b3, 0xec92b4, 0xec92b5, 0xec92b6,
+ /* dd */ 0xec92b7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec92b8, 0xec92b9, 0xec92ba, 0xec92bb,
+ /* e5 */ 0xec92bc, 0xec92bd, 0xec92be, 0xec92bf,
+ /* e9 */ 0xec9380, 0xec9381, 0xec9382, 0xec9383,
+ /* ed */ 0xec9384, 0xec9385, 0xec9386, 0xec9387,
+ /* f1 */ 0xec9388, 0x000000, 0xec9389, 0xec938a,
+ /* f5 */ 0xec938b, 0xec938c, 0xec938d, 0xec938e,
+ /* f9 */ 0xec938f, 0xec9390, 0xec9391, 0xec9392,
+ /* fd */ 0xec9393,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b3xx - offset 0x02615 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec9394, 0xec9395, 0xec9396, 0xec9397,
+ /* 45 */ 0xec9398, 0xec9399, 0xec939a, 0xec939b,
+ /* 49 */ 0xec939c, 0xec939d, 0xec939e, 0xec939f,
+ /* 4d */ 0xec93a0, 0xec93a1, 0xec93a2, 0xec93a3,
+ /* 51 */ 0xec93a4, 0x000000, 0xec93a5, 0xec93a6,
+ /* 55 */ 0xec93a7, 0xec93a8, 0xec93a9, 0xec93aa,
+ /* 59 */ 0xec93ab, 0xec93ac, 0xec93ad, 0xec93ae,
+ /* 5d */ 0xec93af, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec93b0, 0xec93b1, 0xec93b2, 0xec93b3,
+ /* 65 */ 0xec93b4, 0xec93b5, 0xec93b6, 0xec93b7,
+ /* 69 */ 0xec93b8, 0xec93b9, 0xec93ba, 0xec93bb,
+ /* 6d */ 0xec93bc, 0xec93bd, 0xec93be, 0xec93bf,
+ /* 71 */ 0xec9480, 0x000000, 0xec9481, 0xec9482,
+ /* 75 */ 0xec9483, 0xec9484, 0xec9485, 0xec9486,
+ /* 79 */ 0xec9487, 0xec9488, 0xec9489, 0xec948a,
+ /* 7d */ 0xec948b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec948c, 0xec948d, 0xec948e, 0xec948f,
+ /* 85 */ 0xec9490, 0xec9491, 0xec9492, 0xec9493,
+ /* 89 */ 0xec9494, 0xec9495, 0xec9496, 0xec9497,
+ /* 8d */ 0xec9498, 0xec9499, 0xec949a, 0xec949b,
+ /* 91 */ 0xec949c, 0x000000, 0xec949d, 0xec949e,
+ /* 95 */ 0xec949f, 0xec94a0, 0xec94a1, 0xec94a2,
+ /* 99 */ 0xec94a3, 0xec94a4, 0xec94a5, 0xec94a6,
+ /* 9d */ 0xec94a7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec94a8, 0xec94a9, 0xec94aa, 0xec94ab,
+ /* a5 */ 0xec94ac, 0xec94ad, 0xec94ae, 0xec94af,
+ /* a9 */ 0xec94b0, 0xec94b1, 0xec94b2, 0xec94b3,
+ /* ad */ 0xec94b4, 0xec94b5, 0xec94b6, 0xec94b7,
+ /* b1 */ 0xec94b8, 0x000000, 0xec94b9, 0xec94ba,
+ /* b5 */ 0xec94bb, 0xec94bc, 0xec94bd, 0xec94be,
+ /* b9 */ 0xec94bf, 0xec9580, 0xec9581, 0xec9582,
+ /* bd */ 0xec9583, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b4xx - offset 0x026d3 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38587, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9584, 0xec9585, 0xec9586, 0xec9587,
+ /* 65 */ 0xec9588, 0xec9589, 0xec958a, 0xec958b,
+ /* 69 */ 0xec958c, 0xec958d, 0xec958e, 0xec958f,
+ /* 6d */ 0xec9590, 0xec9591, 0xec9592, 0xec9593,
+ /* 71 */ 0xec9594, 0x000000, 0xec9595, 0xec9596,
+ /* 75 */ 0xec9597, 0xec9598, 0xec9599, 0xec959a,
+ /* 79 */ 0xec959b, 0xec959c, 0xec959d, 0xec959e,
+ /* 7d */ 0xec959f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec95a0, 0xec95a1, 0xec95a2, 0xec95a3,
+ /* 85 */ 0xec95a4, 0xec95a5, 0xec95a6, 0xec95a7,
+ /* 89 */ 0xec95a8, 0xec95a9, 0xec95aa, 0xec95ab,
+ /* 8d */ 0xec95ac, 0xec95ad, 0xec95ae, 0xec95af,
+ /* 91 */ 0xec95b0, 0x000000, 0xec95b1, 0xec95b2,
+ /* 95 */ 0xec95b3, 0xec95b4, 0xec95b5, 0xec95b6,
+ /* 99 */ 0xec95b7, 0xec95b8, 0xec95b9, 0xec95ba,
+ /* 9d */ 0xec95bb, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec95bc, 0xec95bd, 0xec95be, 0xec95bf,
+ /* a5 */ 0xec9680, 0xec9681, 0xec9682, 0xec9683,
+ /* a9 */ 0xec9684, 0xec9685, 0xec9686, 0xec9687,
+ /* ad */ 0xec9688, 0xec9689, 0xec968a, 0xec968b,
+ /* b1 */ 0xec968c, 0x000000, 0xec968d, 0xec968e,
+ /* b5 */ 0xec968f, 0xec9690, 0xec9691, 0xec9692,
+ /* b9 */ 0xec9693, 0xec9694, 0xec9695, 0xec9696,
+ /* bd */ 0xec9697, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec9698, 0xec9699, 0xec969a, 0xec969b,
+ /* c5 */ 0xec969c, 0xec969d, 0xec969e, 0xec969f,
+ /* c9 */ 0xec96a0, 0xec96a1, 0xec96a2, 0xec96a3,
+ /* cd */ 0xec96a4, 0xec96a5, 0xec96a6, 0xec96a7,
+ /* d1 */ 0xec96a8, 0x000000, 0xec96a9, 0xec96aa,
+ /* d5 */ 0xec96ab, 0xec96ac, 0xec96ad, 0xec96ae,
+ /* d9 */ 0xec96af, 0xec96b0, 0xec96b1, 0xec96b2,
+ /* dd */ 0xec96b3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec96b4, 0xec96b5, 0xec96b6, 0xec96b7,
+ /* e5 */ 0xec96b8, 0xec96b9, 0xec96ba, 0xec96bb,
+ /* e9 */ 0xec96bc, 0xec96bd, 0xec96be, 0xec96bf,
+ /* ed */ 0xec9780, 0xec9781, 0xec9782, 0xec9783,
+ /* f1 */ 0xec9784, 0x000000, 0xec9785, 0xec9786,
+ /* f5 */ 0xec9787, 0xec9788, 0xec9789, 0xec978a,
+ /* f9 */ 0xec978b, 0xec978c, 0xec978d, 0xec978e,
+ /* fd */ 0xec978f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b5xx - offset 0x027a0 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec9790, 0xec9791, 0xec9792, 0xec9793,
+ /* 45 */ 0xec9794, 0xec9795, 0xec9796, 0xec9797,
+ /* 49 */ 0xec9798, 0xec9799, 0xec979a, 0xec979b,
+ /* 4d */ 0xec979c, 0xec979d, 0xec979e, 0xec979f,
+ /* 51 */ 0xec97a0, 0x000000, 0xec97a1, 0xec97a2,
+ /* 55 */ 0xec97a3, 0xec97a4, 0xec97a5, 0xec97a6,
+ /* 59 */ 0xec97a7, 0xec97a8, 0xec97a9, 0xec97aa,
+ /* 5d */ 0xec97ab, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec97ac, 0xec97ad, 0xec97ae, 0xec97af,
+ /* 65 */ 0xec97b0, 0xec97b1, 0xec97b2, 0xec97b3,
+ /* 69 */ 0xec97b4, 0xec97b5, 0xec97b6, 0xec97b7,
+ /* 6d */ 0xec97b8, 0xec97b9, 0xec97ba, 0xec97bb,
+ /* 71 */ 0xec97bc, 0x000000, 0xec97bd, 0xec97be,
+ /* 75 */ 0xec97bf, 0xec9880, 0xec9881, 0xec9882,
+ /* 79 */ 0xec9883, 0xec9884, 0xec9885, 0xec9886,
+ /* 7d */ 0xec9887, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9888, 0xec9889, 0xec988a, 0xec988b,
+ /* 85 */ 0xec988c, 0xec988d, 0xec988e, 0xec988f,
+ /* 89 */ 0xec9890, 0xec9891, 0xec9892, 0xec9893,
+ /* 8d */ 0xec9894, 0xec9895, 0xec9896, 0xec9897,
+ /* 91 */ 0xec9898, 0x000000, 0xec9899, 0xec989a,
+ /* 95 */ 0xec989b, 0xec989c, 0xec989d, 0xec989e,
+ /* 99 */ 0xec989f, 0xec98a0, 0xec98a1, 0xec98a2,
+ /* 9d */ 0xec98a3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec98a4, 0xec98a5, 0xec98a6, 0xec98a7,
+ /* a5 */ 0xec98a8, 0xec98a9, 0xec98aa, 0xec98ab,
+ /* a9 */ 0xec98ac, 0xec98ad, 0xec98ae, 0xec98af,
+ /* ad */ 0xec98b0, 0xec98b1, 0xec98b2, 0xec98b3,
+ /* b1 */ 0xec98b4, 0x000000, 0xec98b5, 0xec98b6,
+ /* b5 */ 0xec98b7, 0xec98b8, 0xec98b9, 0xec98ba,
+ /* b9 */ 0xec98bb, 0xec98bc, 0xec98bd, 0xec98be,
+ /* bd */ 0xec98bf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec9980, 0xec9981, 0xec9982, 0xec9983,
+ /* c5 */ 0xec9984, 0xec9985, 0xec9986, 0xec9987,
+ /* c9 */ 0xec9988, 0xec9989, 0xec998a, 0xec998b,
+ /* cd */ 0xec998c, 0xec998d, 0xec998e, 0xec998f,
+ /* d1 */ 0xec9990, 0x000000, 0xec9991, 0xec9992,
+ /* d5 */ 0xec9993, 0xec9994, 0xec9995, 0xec9996,
+ /* d9 */ 0xec9997, 0xec9998, 0xec9999, 0xec999a,
+ /* dd */ 0xec999b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec999c, 0xec999d, 0xec999e, 0xec999f,
+ /* e5 */ 0xec99a0, 0xec99a1, 0xec99a2, 0xec99a3,
+ /* e9 */ 0xec99a4, 0xec99a5, 0xec99a6, 0xec99a7,
+ /* ed */ 0xec99a8, 0xec99a9, 0xec99aa, 0xec99ab,
+ /* f1 */ 0xec99ac, 0x000000, 0xec99ad, 0xec99ae,
+ /* f5 */ 0xec99af, 0xec99b0, 0xec99b1, 0xec99b2,
+ /* f9 */ 0xec99b3, 0xec99b4, 0xec99b5, 0xec99b6,
+ /* fd */ 0xec99b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b6xx - offset 0x0286d ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec99b8, 0xec99b9, 0xec99ba, 0xec99bb,
+ /* 45 */ 0xec99bc, 0xec99bd, 0xec99be, 0xec99bf,
+ /* 49 */ 0xec9a80, 0xec9a81, 0xec9a82, 0xec9a83,
+ /* 4d */ 0xec9a84, 0xec9a85, 0xec9a86, 0xec9a87,
+ /* 51 */ 0xec9a88, 0x000000, 0xec9a89, 0xec9a8a,
+ /* 55 */ 0xec9a8b, 0xec9a8c, 0xec9a8d, 0xec9a8e,
+ /* 59 */ 0xec9a8f, 0xec9a90, 0xec9a91, 0xec9a92,
+ /* 5d */ 0xec9a93, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9a94, 0xec9a95, 0xec9a96, 0xec9a97,
+ /* 65 */ 0xec9a98, 0xec9a99, 0xec9a9a, 0xec9a9b,
+ /* 69 */ 0xec9a9c, 0xec9a9d, 0xec9a9e, 0xec9a9f,
+ /* 6d */ 0xec9aa0, 0xec9aa1, 0xec9aa2, 0xec9aa3,
+ /* 71 */ 0xec9aa4, 0x000000, 0xec9aa5, 0xec9aa6,
+ /* 75 */ 0xec9aa7, 0xec9aa8, 0xec9aa9, 0xec9aaa,
+ /* 79 */ 0xec9aab, 0xec9aac, 0xec9aad, 0xec9aae,
+ /* 7d */ 0xec9aaf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9ab0, 0xec9ab1, 0xec9ab2, 0xec9ab3,
+ /* 85 */ 0xec9ab4, 0xec9ab5, 0xec9ab6, 0xec9ab7,
+ /* 89 */ 0xec9ab8, 0xec9ab9, 0xec9aba, 0xec9abb,
+ /* 8d */ 0xec9abc, 0xec9abd, 0xec9abe, 0xec9abf,
+ /* 91 */ 0xec9b80, 0x000000, 0xec9b81, 0xec9b82,
+ /* 95 */ 0xec9b83, 0xec9b84, 0xec9b85, 0xec9b86,
+ /* 99 */ 0xec9b87, 0xec9b88, 0xec9b89, 0xec9b8a,
+ /* 9d */ 0xec9b8b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec9b8c, 0xec9b8d, 0xec9b8e, 0xec9b8f,
+ /* a5 */ 0xec9b90, 0xec9b91, 0xec9b92, 0xec9b93,
+ /* a9 */ 0xec9b94, 0xec9b95, 0xec9b96, 0xec9b97,
+ /* ad */ 0xec9b98, 0xec9b99, 0xec9b9a, 0xec9b9b,
+ /* b1 */ 0xec9b9c, 0x000000, 0xec9b9d, 0xec9b9e,
+ /* b5 */ 0xec9b9f, 0xec9ba0, 0xec9ba1, 0xec9ba2,
+ /* b9 */ 0xec9ba3, 0xec9ba4, 0xec9ba5, 0xec9ba6,
+ /* bd */ 0xec9ba7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec9ba8, 0xec9ba9, 0xec9baa, 0xec9bab,
+ /* c5 */ 0xec9bac, 0xec9bad, 0xec9bae, 0xec9baf,
+ /* c9 */ 0xec9bb0, 0xec9bb1, 0xec9bb2, 0xec9bb3,
+ /* cd */ 0xec9bb4, 0xec9bb5, 0xec9bb6, 0xec9bb7,
+ /* d1 */ 0xec9bb8, 0x000000, 0xec9bb9, 0xec9bba,
+ /* d5 */ 0xec9bbb, 0xec9bbc, 0xec9bbd, 0xec9bbe,
+ /* d9 */ 0xec9bbf, 0xec9c80, 0xec9c81, 0xec9c82,
+ /* dd */ 0xec9c83, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xec9c84, 0xec9c85, 0xec9c86, 0xec9c87,
+ /* e5 */ 0xec9c88, 0xec9c89, 0xec9c8a, 0xec9c8b,
+ /* e9 */ 0xec9c8c, 0xec9c8d, 0xec9c8e, 0xec9c8f,
+ /* ed */ 0xec9c90, 0xec9c91, 0xec9c92, 0xec9c93,
+ /* f1 */ 0xec9c94, 0x000000, 0xec9c95, 0xec9c96,
+ /* f5 */ 0xec9c97, 0xec9c98, 0xec9c99, 0xec9c9a,
+ /* f9 */ 0xec9c9b, 0xec9c9c, 0xec9c9d, 0xec9c9e,
+ /* fd */ 0xec9c9f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b7xx - offset 0x0293a ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xec9ca0, 0xec9ca1, 0xec9ca2, 0xec9ca3,
+ /* 45 */ 0xec9ca4, 0xec9ca5, 0xec9ca6, 0xec9ca7,
+ /* 49 */ 0xec9ca8, 0xec9ca9, 0xec9caa, 0xec9cab,
+ /* 4d */ 0xec9cac, 0xec9cad, 0xec9cae, 0xec9caf,
+ /* 51 */ 0xec9cb0, 0x000000, 0xec9cb1, 0xec9cb2,
+ /* 55 */ 0xec9cb3, 0xec9cb4, 0xec9cb5, 0xec9cb6,
+ /* 59 */ 0xec9cb7, 0xec9cb8, 0xec9cb9, 0xec9cba,
+ /* 5d */ 0xec9cbb, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9cbc, 0xec9cbd, 0xec9cbe, 0xec9cbf,
+ /* 65 */ 0xec9d80, 0xec9d81, 0xec9d82, 0xec9d83,
+ /* 69 */ 0xec9d84, 0xec9d85, 0xec9d86, 0xec9d87,
+ /* 6d */ 0xec9d88, 0xec9d89, 0xec9d8a, 0xec9d8b,
+ /* 71 */ 0xec9d8c, 0x000000, 0xec9d8d, 0xec9d8e,
+ /* 75 */ 0xec9d8f, 0xec9d90, 0xec9d91, 0xec9d92,
+ /* 79 */ 0xec9d93, 0xec9d94, 0xec9d95, 0xec9d96,
+ /* 7d */ 0xec9d97, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9d98, 0xec9d99, 0xec9d9a, 0xec9d9b,
+ /* 85 */ 0xec9d9c, 0xec9d9d, 0xec9d9e, 0xec9d9f,
+ /* 89 */ 0xec9da0, 0xec9da1, 0xec9da2, 0xec9da3,
+ /* 8d */ 0xec9da4, 0xec9da5, 0xec9da6, 0xec9da7,
+ /* 91 */ 0xec9da8, 0x000000, 0xec9da9, 0xec9daa,
+ /* 95 */ 0xec9dab, 0xec9dac, 0xec9dad, 0xec9dae,
+ /* 99 */ 0xec9daf, 0xec9db0, 0xec9db1, 0xec9db2,
+ /* 9d */ 0xec9db3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec9db4, 0xec9db5, 0xec9db6, 0xec9db7,
+ /* a5 */ 0xec9db8, 0xec9db9, 0xec9dba, 0xec9dbb,
+ /* a9 */ 0xec9dbc, 0xec9dbd, 0xec9dbe, 0xec9dbf,
+ /* ad */ 0xec9e80, 0xec9e81, 0xec9e82, 0xec9e83,
+ /* b1 */ 0xec9e84, 0x000000, 0xec9e85, 0xec9e86,
+ /* b5 */ 0xec9e87, 0xec9e88, 0xec9e89, 0xec9e8a,
+ /* b9 */ 0xec9e8b, 0xec9e8c, 0xec9e8d, 0xec9e8e,
+ /* bd */ 0xec9e8f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b8xx - offset 0x029f8 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38588, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9e90, 0xec9e91, 0xec9e92, 0xec9e93,
+ /* 65 */ 0xec9e94, 0xec9e95, 0xec9e96, 0xec9e97,
+ /* 69 */ 0xec9e98, 0xec9e99, 0xec9e9a, 0xec9e9b,
+ /* 6d */ 0xec9e9c, 0xec9e9d, 0xec9e9e, 0xec9e9f,
+ /* 71 */ 0xec9ea0, 0x000000, 0xec9ea1, 0xec9ea2,
+ /* 75 */ 0xec9ea3, 0xec9ea4, 0xec9ea5, 0xec9ea6,
+ /* 79 */ 0xec9ea7, 0xec9ea8, 0xec9ea9, 0xec9eaa,
+ /* 7d */ 0xec9eab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9eac, 0xec9ead, 0xec9eae, 0xec9eaf,
+ /* 85 */ 0xec9eb0, 0xec9eb1, 0xec9eb2, 0xec9eb3,
+ /* 89 */ 0xec9eb4, 0xec9eb5, 0xec9eb6, 0xec9eb7,
+ /* 8d */ 0xec9eb8, 0xec9eb9, 0xec9eba, 0xec9ebb,
+ /* 91 */ 0xec9ebc, 0x000000, 0xec9ebd, 0xec9ebe,
+ /* 95 */ 0xec9ebf, 0xec9f80, 0xec9f81, 0xec9f82,
+ /* 99 */ 0xec9f83, 0xec9f84, 0xec9f85, 0xec9f86,
+ /* 9d */ 0xec9f87, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xec9f88, 0xec9f89, 0xec9f8a, 0xec9f8b,
+ /* a5 */ 0xec9f8c, 0xec9f8d, 0xec9f8e, 0xec9f8f,
+ /* a9 */ 0xec9f90, 0xec9f91, 0xec9f92, 0xec9f93,
+ /* ad */ 0xec9f94, 0xec9f95, 0xec9f96, 0xec9f97,
+ /* b1 */ 0xec9f98, 0x000000, 0xec9f99, 0xec9f9a,
+ /* b5 */ 0xec9f9b, 0xec9f9c, 0xec9f9d, 0xec9f9e,
+ /* b9 */ 0xec9f9f, 0xec9fa0, 0xec9fa1, 0xec9fa2,
+ /* bd */ 0xec9fa3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xec9fa4, 0xec9fa5, 0xec9fa6, 0xec9fa7,
+ /* c5 */ 0xec9fa8, 0xec9fa9, 0xec9faa, 0xec9fab,
+ /* c9 */ 0xec9fac, 0xec9fad, 0xec9fae, 0xec9faf,
+ /* cd */ 0xec9fb0, 0xec9fb1, 0xec9fb2, 0xec9fb3,
+ /* d1 */ 0xec9fb4, 0x000000, 0xec9fb5, 0xec9fb6,
+ /* d5 */ 0xec9fb7, 0xec9fb8, 0xec9fb9, 0xec9fba,
+ /* d9 */ 0xec9fbb, 0xec9fbc, 0xec9fbd, 0xec9fbe,
+ /* dd */ 0xec9fbf, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeca080, 0xeca081, 0xeca082, 0xeca083,
+ /* e5 */ 0xeca084, 0xeca085, 0xeca086, 0xeca087,
+ /* e9 */ 0xeca088, 0xeca089, 0xeca08a, 0xeca08b,
+ /* ed */ 0xeca08c, 0xeca08d, 0xeca08e, 0xeca08f,
+ /* f1 */ 0xeca090, 0x000000, 0xeca091, 0xeca092,
+ /* f5 */ 0xeca093, 0xeca094, 0xeca095, 0xeca096,
+ /* f9 */ 0xeca097, 0xeca098, 0xeca099, 0xeca09a,
+ /* fd */ 0xeca09b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: b9xx - offset 0x02ac5 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeca09c, 0xeca09d, 0xeca09e, 0xeca09f,
+ /* 45 */ 0xeca0a0, 0xeca0a1, 0xeca0a2, 0xeca0a3,
+ /* 49 */ 0xeca0a4, 0xeca0a5, 0xeca0a6, 0xeca0a7,
+ /* 4d */ 0xeca0a8, 0xeca0a9, 0xeca0aa, 0xeca0ab,
+ /* 51 */ 0xeca0ac, 0x000000, 0xeca0ad, 0xeca0ae,
+ /* 55 */ 0xeca0af, 0xeca0b0, 0xeca0b1, 0xeca0b2,
+ /* 59 */ 0xeca0b3, 0xeca0b4, 0xeca0b5, 0xeca0b6,
+ /* 5d */ 0xeca0b7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca0b8, 0xeca0b9, 0xeca0ba, 0xeca0bb,
+ /* 65 */ 0xeca0bc, 0xeca0bd, 0xeca0be, 0xeca0bf,
+ /* 69 */ 0xeca180, 0xeca181, 0xeca182, 0xeca183,
+ /* 6d */ 0xeca184, 0xeca185, 0xeca186, 0xeca187,
+ /* 71 */ 0xeca188, 0x000000, 0xeca189, 0xeca18a,
+ /* 75 */ 0xeca18b, 0xeca18c, 0xeca18d, 0xeca18e,
+ /* 79 */ 0xeca18f, 0xeca190, 0xeca191, 0xeca192,
+ /* 7d */ 0xeca193, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca194, 0xeca195, 0xeca196, 0xeca197,
+ /* 85 */ 0xeca198, 0xeca199, 0xeca19a, 0xeca19b,
+ /* 89 */ 0xeca19c, 0xeca19d, 0xeca19e, 0xeca19f,
+ /* 8d */ 0xeca1a0, 0xeca1a1, 0xeca1a2, 0xeca1a3,
+ /* 91 */ 0xeca1a4, 0x000000, 0xeca1a5, 0xeca1a6,
+ /* 95 */ 0xeca1a7, 0xeca1a8, 0xeca1a9, 0xeca1aa,
+ /* 99 */ 0xeca1ab, 0xeca1ac, 0xeca1ad, 0xeca1ae,
+ /* 9d */ 0xeca1af, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeca1b0, 0xeca1b1, 0xeca1b2, 0xeca1b3,
+ /* a5 */ 0xeca1b4, 0xeca1b5, 0xeca1b6, 0xeca1b7,
+ /* a9 */ 0xeca1b8, 0xeca1b9, 0xeca1ba, 0xeca1bb,
+ /* ad */ 0xeca1bc, 0xeca1bd, 0xeca1be, 0xeca1bf,
+ /* b1 */ 0xeca280, 0x000000, 0xeca281, 0xeca282,
+ /* b5 */ 0xeca283, 0xeca284, 0xeca285, 0xeca286,
+ /* b9 */ 0xeca287, 0xeca288, 0xeca289, 0xeca28a,
+ /* bd */ 0xeca28b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeca28c, 0xeca28d, 0xeca28e, 0xeca28f,
+ /* c5 */ 0xeca290, 0xeca291, 0xeca292, 0xeca293,
+ /* c9 */ 0xeca294, 0xeca295, 0xeca296, 0xeca297,
+ /* cd */ 0xeca298, 0xeca299, 0xeca29a, 0xeca29b,
+ /* d1 */ 0xeca29c, 0x000000, 0xeca29d, 0xeca29e,
+ /* d5 */ 0xeca29f, 0xeca2a0, 0xeca2a1, 0xeca2a2,
+ /* d9 */ 0xeca2a3, 0xeca2a4, 0xeca2a5, 0xeca2a6,
+ /* dd */ 0xeca2a7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeca2a8, 0xeca2a9, 0xeca2aa, 0xeca2ab,
+ /* e5 */ 0xeca2ac, 0xeca2ad, 0xeca2ae, 0xeca2af,
+ /* e9 */ 0xeca2b0, 0xeca2b1, 0xeca2b2, 0xeca2b3,
+ /* ed */ 0xeca2b4, 0xeca2b5, 0xeca2b6, 0xeca2b7,
+ /* f1 */ 0xeca2b8, 0x000000, 0xeca2b9, 0xeca2ba,
+ /* f5 */ 0xeca2bb, 0xeca2bc, 0xeca2bd, 0xeca2be,
+ /* f9 */ 0xeca2bf, 0xeca380, 0xeca381, 0xeca382,
+ /* fd */ 0xeca383,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: baxx - offset 0x02b92 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeca384, 0xeca385, 0xeca386, 0xeca387,
+ /* 45 */ 0xeca388, 0xeca389, 0xeca38a, 0xeca38b,
+ /* 49 */ 0xeca38c, 0xeca38d, 0xeca38e, 0xeca38f,
+ /* 4d */ 0xeca390, 0xeca391, 0xeca392, 0xeca393,
+ /* 51 */ 0xeca394, 0x000000, 0xeca395, 0xeca396,
+ /* 55 */ 0xeca397, 0xeca398, 0xeca399, 0xeca39a,
+ /* 59 */ 0xeca39b, 0xeca39c, 0xeca39d, 0xeca39e,
+ /* 5d */ 0xeca39f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca3a0, 0xeca3a1, 0xeca3a2, 0xeca3a3,
+ /* 65 */ 0xeca3a4, 0xeca3a5, 0xeca3a6, 0xeca3a7,
+ /* 69 */ 0xeca3a8, 0xeca3a9, 0xeca3aa, 0xeca3ab,
+ /* 6d */ 0xeca3ac, 0xeca3ad, 0xeca3ae, 0xeca3af,
+ /* 71 */ 0xeca3b0, 0x000000, 0xeca3b1, 0xeca3b2,
+ /* 75 */ 0xeca3b3, 0xeca3b4, 0xeca3b5, 0xeca3b6,
+ /* 79 */ 0xeca3b7, 0xeca3b8, 0xeca3b9, 0xeca3ba,
+ /* 7d */ 0xeca3bb, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca3bc, 0xeca3bd, 0xeca3be, 0xeca3bf,
+ /* 85 */ 0xeca480, 0xeca481, 0xeca482, 0xeca483,
+ /* 89 */ 0xeca484, 0xeca485, 0xeca486, 0xeca487,
+ /* 8d */ 0xeca488, 0xeca489, 0xeca48a, 0xeca48b,
+ /* 91 */ 0xeca48c, 0x000000, 0xeca48d, 0xeca48e,
+ /* 95 */ 0xeca48f, 0xeca490, 0xeca491, 0xeca492,
+ /* 99 */ 0xeca493, 0xeca494, 0xeca495, 0xeca496,
+ /* 9d */ 0xeca497, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeca498, 0xeca499, 0xeca49a, 0xeca49b,
+ /* a5 */ 0xeca49c, 0xeca49d, 0xeca49e, 0xeca49f,
+ /* a9 */ 0xeca4a0, 0xeca4a1, 0xeca4a2, 0xeca4a3,
+ /* ad */ 0xeca4a4, 0xeca4a5, 0xeca4a6, 0xeca4a7,
+ /* b1 */ 0xeca4a8, 0x000000, 0xeca4a9, 0xeca4aa,
+ /* b5 */ 0xeca4ab, 0xeca4ac, 0xeca4ad, 0xeca4ae,
+ /* b9 */ 0xeca4af, 0xeca4b0, 0xeca4b1, 0xeca4b2,
+ /* bd */ 0xeca4b3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeca4b4, 0xeca4b5, 0xeca4b6, 0xeca4b7,
+ /* c5 */ 0xeca4b8, 0xeca4b9, 0xeca4ba, 0xeca4bb,
+ /* c9 */ 0xeca4bc, 0xeca4bd, 0xeca4be, 0xeca4bf,
+ /* cd */ 0xeca580, 0xeca581, 0xeca582, 0xeca583,
+ /* d1 */ 0xeca584, 0x000000, 0xeca585, 0xeca586,
+ /* d5 */ 0xeca587, 0xeca588, 0xeca589, 0xeca58a,
+ /* d9 */ 0xeca58b, 0xeca58c, 0xeca58d, 0xeca58e,
+ /* dd */ 0xeca58f, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeca590, 0xeca591, 0xeca592, 0xeca593,
+ /* e5 */ 0xeca594, 0xeca595, 0xeca596, 0xeca597,
+ /* e9 */ 0xeca598, 0xeca599, 0xeca59a, 0xeca59b,
+ /* ed */ 0xeca59c, 0xeca59d, 0xeca59e, 0xeca59f,
+ /* f1 */ 0xeca5a0, 0x000000, 0xeca5a1, 0xeca5a2,
+ /* f5 */ 0xeca5a3, 0xeca5a4, 0xeca5a5, 0xeca5a6,
+ /* f9 */ 0xeca5a7, 0xeca5a8, 0xeca5a9, 0xeca5aa,
+ /* fd */ 0xeca5ab,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: bbxx - offset 0x02c5f ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeca5ac, 0xeca5ad, 0xeca5ae, 0xeca5af,
+ /* 45 */ 0xeca5b0, 0xeca5b1, 0xeca5b2, 0xeca5b3,
+ /* 49 */ 0xeca5b4, 0xeca5b5, 0xeca5b6, 0xeca5b7,
+ /* 4d */ 0xeca5b8, 0xeca5b9, 0xeca5ba, 0xeca5bb,
+ /* 51 */ 0xeca5bc, 0x000000, 0xeca5bd, 0xeca5be,
+ /* 55 */ 0xeca5bf, 0xeca680, 0xeca681, 0xeca682,
+ /* 59 */ 0xeca683, 0xeca684, 0xeca685, 0xeca686,
+ /* 5d */ 0xeca687, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca688, 0xeca689, 0xeca68a, 0xeca68b,
+ /* 65 */ 0xeca68c, 0xeca68d, 0xeca68e, 0xeca68f,
+ /* 69 */ 0xeca690, 0xeca691, 0xeca692, 0xeca693,
+ /* 6d */ 0xeca694, 0xeca695, 0xeca696, 0xeca697,
+ /* 71 */ 0xeca698, 0x000000, 0xeca699, 0xeca69a,
+ /* 75 */ 0xeca69b, 0xeca69c, 0xeca69d, 0xeca69e,
+ /* 79 */ 0xeca69f, 0xeca6a0, 0xeca6a1, 0xeca6a2,
+ /* 7d */ 0xeca6a3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca6a4, 0xeca6a5, 0xeca6a6, 0xeca6a7,
+ /* 85 */ 0xeca6a8, 0xeca6a9, 0xeca6aa, 0xeca6ab,
+ /* 89 */ 0xeca6ac, 0xeca6ad, 0xeca6ae, 0xeca6af,
+ /* 8d */ 0xeca6b0, 0xeca6b1, 0xeca6b2, 0xeca6b3,
+ /* 91 */ 0xeca6b4, 0x000000, 0xeca6b5, 0xeca6b6,
+ /* 95 */ 0xeca6b7, 0xeca6b8, 0xeca6b9, 0xeca6ba,
+ /* 99 */ 0xeca6bb, 0xeca6bc, 0xeca6bd, 0xeca6be,
+ /* 9d */ 0xeca6bf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeca780, 0xeca781, 0xeca782, 0xeca783,
+ /* a5 */ 0xeca784, 0xeca785, 0xeca786, 0xeca787,
+ /* a9 */ 0xeca788, 0xeca789, 0xeca78a, 0xeca78b,
+ /* ad */ 0xeca78c, 0xeca78d, 0xeca78e, 0xeca78f,
+ /* b1 */ 0xeca790, 0x000000, 0xeca791, 0xeca792,
+ /* b5 */ 0xeca793, 0xeca794, 0xeca795, 0xeca796,
+ /* b9 */ 0xeca797, 0xeca798, 0xeca799, 0xeca79a,
+ /* bd */ 0xeca79b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: bcxx - offset 0x02d1d ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe38589, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca79c, 0xeca79d, 0xeca79e, 0xeca79f,
+ /* 65 */ 0xeca7a0, 0xeca7a1, 0xeca7a2, 0xeca7a3,
+ /* 69 */ 0xeca7a4, 0xeca7a5, 0xeca7a6, 0xeca7a7,
+ /* 6d */ 0xeca7a8, 0xeca7a9, 0xeca7aa, 0xeca7ab,
+ /* 71 */ 0xeca7ac, 0x000000, 0xeca7ad, 0xeca7ae,
+ /* 75 */ 0xeca7af, 0xeca7b0, 0xeca7b1, 0xeca7b2,
+ /* 79 */ 0xeca7b3, 0xeca7b4, 0xeca7b5, 0xeca7b6,
+ /* 7d */ 0xeca7b7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca7b8, 0xeca7b9, 0xeca7ba, 0xeca7bb,
+ /* 85 */ 0xeca7bc, 0xeca7bd, 0xeca7be, 0xeca7bf,
+ /* 89 */ 0xeca880, 0xeca881, 0xeca882, 0xeca883,
+ /* 8d */ 0xeca884, 0xeca885, 0xeca886, 0xeca887,
+ /* 91 */ 0xeca888, 0x000000, 0xeca889, 0xeca88a,
+ /* 95 */ 0xeca88b, 0xeca88c, 0xeca88d, 0xeca88e,
+ /* 99 */ 0xeca88f, 0xeca890, 0xeca891, 0xeca892,
+ /* 9d */ 0xeca893, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xeca894, 0xeca895, 0xeca896, 0xeca897,
+ /* a5 */ 0xeca898, 0xeca899, 0xeca89a, 0xeca89b,
+ /* a9 */ 0xeca89c, 0xeca89d, 0xeca89e, 0xeca89f,
+ /* ad */ 0xeca8a0, 0xeca8a1, 0xeca8a2, 0xeca8a3,
+ /* b1 */ 0xeca8a4, 0x000000, 0xeca8a5, 0xeca8a6,
+ /* b5 */ 0xeca8a7, 0xeca8a8, 0xeca8a9, 0xeca8aa,
+ /* b9 */ 0xeca8ab, 0xeca8ac, 0xeca8ad, 0xeca8ae,
+ /* bd */ 0xeca8af, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xeca8b0, 0xeca8b1, 0xeca8b2, 0xeca8b3,
+ /* c5 */ 0xeca8b4, 0xeca8b5, 0xeca8b6, 0xeca8b7,
+ /* c9 */ 0xeca8b8, 0xeca8b9, 0xeca8ba, 0xeca8bb,
+ /* cd */ 0xeca8bc, 0xeca8bd, 0xeca8be, 0xeca8bf,
+ /* d1 */ 0xeca980, 0x000000, 0xeca981, 0xeca982,
+ /* d5 */ 0xeca983, 0xeca984, 0xeca985, 0xeca986,
+ /* d9 */ 0xeca987, 0xeca988, 0xeca989, 0xeca98a,
+ /* dd */ 0xeca98b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xeca98c, 0xeca98d, 0xeca98e, 0xeca98f,
+ /* e5 */ 0xeca990, 0xeca991, 0xeca992, 0xeca993,
+ /* e9 */ 0xeca994, 0xeca995, 0xeca996, 0xeca997,
+ /* ed */ 0xeca998, 0xeca999, 0xeca99a, 0xeca99b,
+ /* f1 */ 0xeca99c, 0x000000, 0xeca99d, 0xeca99e,
+ /* f5 */ 0xeca99f, 0xeca9a0, 0xeca9a1, 0xeca9a2,
+ /* f9 */ 0xeca9a3, 0xeca9a4, 0xeca9a5, 0xeca9a6,
+ /* fd */ 0xeca9a7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: bdxx - offset 0x02dea ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xeca9a8, 0xeca9a9, 0xeca9aa, 0xeca9ab,
+ /* 45 */ 0xeca9ac, 0xeca9ad, 0xeca9ae, 0xeca9af,
+ /* 49 */ 0xeca9b0, 0xeca9b1, 0xeca9b2, 0xeca9b3,
+ /* 4d */ 0xeca9b4, 0xeca9b5, 0xeca9b6, 0xeca9b7,
+ /* 51 */ 0xeca9b8, 0x000000, 0xeca9b9, 0xeca9ba,
+ /* 55 */ 0xeca9bb, 0xeca9bc, 0xeca9bd, 0xeca9be,
+ /* 59 */ 0xeca9bf, 0xecaa80, 0xecaa81, 0xecaa82,
+ /* 5d */ 0xecaa83, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecaa84, 0xecaa85, 0xecaa86, 0xecaa87,
+ /* 65 */ 0xecaa88, 0xecaa89, 0xecaa8a, 0xecaa8b,
+ /* 69 */ 0xecaa8c, 0xecaa8d, 0xecaa8e, 0xecaa8f,
+ /* 6d */ 0xecaa90, 0xecaa91, 0xecaa92, 0xecaa93,
+ /* 71 */ 0xecaa94, 0x000000, 0xecaa95, 0xecaa96,
+ /* 75 */ 0xecaa97, 0xecaa98, 0xecaa99, 0xecaa9a,
+ /* 79 */ 0xecaa9b, 0xecaa9c, 0xecaa9d, 0xecaa9e,
+ /* 7d */ 0xecaa9f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecaaa0, 0xecaaa1, 0xecaaa2, 0xecaaa3,
+ /* 85 */ 0xecaaa4, 0xecaaa5, 0xecaaa6, 0xecaaa7,
+ /* 89 */ 0xecaaa8, 0xecaaa9, 0xecaaaa, 0xecaaab,
+ /* 8d */ 0xecaaac, 0xecaaad, 0xecaaae, 0xecaaaf,
+ /* 91 */ 0xecaab0, 0x000000, 0xecaab1, 0xecaab2,
+ /* 95 */ 0xecaab3, 0xecaab4, 0xecaab5, 0xecaab6,
+ /* 99 */ 0xecaab7, 0xecaab8, 0xecaab9, 0xecaaba,
+ /* 9d */ 0xecaabb, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecaabc, 0xecaabd, 0xecaabe, 0xecaabf,
+ /* a5 */ 0xecab80, 0xecab81, 0xecab82, 0xecab83,
+ /* a9 */ 0xecab84, 0xecab85, 0xecab86, 0xecab87,
+ /* ad */ 0xecab88, 0xecab89, 0xecab8a, 0xecab8b,
+ /* b1 */ 0xecab8c, 0x000000, 0xecab8d, 0xecab8e,
+ /* b5 */ 0xecab8f, 0xecab90, 0xecab91, 0xecab92,
+ /* b9 */ 0xecab93, 0xecab94, 0xecab95, 0xecab96,
+ /* bd */ 0xecab97, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecab98, 0xecab99, 0xecab9a, 0xecab9b,
+ /* c5 */ 0xecab9c, 0xecab9d, 0xecab9e, 0xecab9f,
+ /* c9 */ 0xecaba0, 0xecaba1, 0xecaba2, 0xecaba3,
+ /* cd */ 0xecaba4, 0xecaba5, 0xecaba6, 0xecaba7,
+ /* d1 */ 0xecaba8, 0x000000, 0xecaba9, 0xecabaa,
+ /* d5 */ 0xecabab, 0xecabac, 0xecabad, 0xecabae,
+ /* d9 */ 0xecabaf, 0xecabb0, 0xecabb1, 0xecabb2,
+ /* dd */ 0xecabb3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecabb4, 0xecabb5, 0xecabb6, 0xecabb7,
+ /* e5 */ 0xecabb8, 0xecabb9, 0xecabba, 0xecabbb,
+ /* e9 */ 0xecabbc, 0xecabbd, 0xecabbe, 0xecabbf,
+ /* ed */ 0xecac80, 0xecac81, 0xecac82, 0xecac83,
+ /* f1 */ 0xecac84, 0x000000, 0xecac85, 0xecac86,
+ /* f5 */ 0xecac87, 0xecac88, 0xecac89, 0xecac8a,
+ /* f9 */ 0xecac8b, 0xecac8c, 0xecac8d, 0xecac8e,
+ /* fd */ 0xecac8f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: bexx - offset 0x02eb7 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecac90, 0xecac91, 0xecac92, 0xecac93,
+ /* 45 */ 0xecac94, 0xecac95, 0xecac96, 0xecac97,
+ /* 49 */ 0xecac98, 0xecac99, 0xecac9a, 0xecac9b,
+ /* 4d */ 0xecac9c, 0xecac9d, 0xecac9e, 0xecac9f,
+ /* 51 */ 0xecaca0, 0x000000, 0xecaca1, 0xecaca2,
+ /* 55 */ 0xecaca3, 0xecaca4, 0xecaca5, 0xecaca6,
+ /* 59 */ 0xecaca7, 0xecaca8, 0xecaca9, 0xecacaa,
+ /* 5d */ 0xecacab, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecacac, 0xecacad, 0xecacae, 0xecacaf,
+ /* 65 */ 0xecacb0, 0xecacb1, 0xecacb2, 0xecacb3,
+ /* 69 */ 0xecacb4, 0xecacb5, 0xecacb6, 0xecacb7,
+ /* 6d */ 0xecacb8, 0xecacb9, 0xecacba, 0xecacbb,
+ /* 71 */ 0xecacbc, 0x000000, 0xecacbd, 0xecacbe,
+ /* 75 */ 0xecacbf, 0xecad80, 0xecad81, 0xecad82,
+ /* 79 */ 0xecad83, 0xecad84, 0xecad85, 0xecad86,
+ /* 7d */ 0xecad87, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecad88, 0xecad89, 0xecad8a, 0xecad8b,
+ /* 85 */ 0xecad8c, 0xecad8d, 0xecad8e, 0xecad8f,
+ /* 89 */ 0xecad90, 0xecad91, 0xecad92, 0xecad93,
+ /* 8d */ 0xecad94, 0xecad95, 0xecad96, 0xecad97,
+ /* 91 */ 0xecad98, 0x000000, 0xecad99, 0xecad9a,
+ /* 95 */ 0xecad9b, 0xecad9c, 0xecad9d, 0xecad9e,
+ /* 99 */ 0xecad9f, 0xecada0, 0xecada1, 0xecada2,
+ /* 9d */ 0xecada3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecada4, 0xecada5, 0xecada6, 0xecada7,
+ /* a5 */ 0xecada8, 0xecada9, 0xecadaa, 0xecadab,
+ /* a9 */ 0xecadac, 0xecadad, 0xecadae, 0xecadaf,
+ /* ad */ 0xecadb0, 0xecadb1, 0xecadb2, 0xecadb3,
+ /* b1 */ 0xecadb4, 0x000000, 0xecadb5, 0xecadb6,
+ /* b5 */ 0xecadb7, 0xecadb8, 0xecadb9, 0xecadba,
+ /* b9 */ 0xecadbb, 0xecadbc, 0xecadbd, 0xecadbe,
+ /* bd */ 0xecadbf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecae80, 0xecae81, 0xecae82, 0xecae83,
+ /* c5 */ 0xecae84, 0xecae85, 0xecae86, 0xecae87,
+ /* c9 */ 0xecae88, 0xecae89, 0xecae8a, 0xecae8b,
+ /* cd */ 0xecae8c, 0xecae8d, 0xecae8e, 0xecae8f,
+ /* d1 */ 0xecae90, 0x000000, 0xecae91, 0xecae92,
+ /* d5 */ 0xecae93, 0xecae94, 0xecae95, 0xecae96,
+ /* d9 */ 0xecae97, 0xecae98, 0xecae99, 0xecae9a,
+ /* dd */ 0xecae9b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecae9c, 0xecae9d, 0xecae9e, 0xecae9f,
+ /* e5 */ 0xecaea0, 0xecaea1, 0xecaea2, 0xecaea3,
+ /* e9 */ 0xecaea4, 0xecaea5, 0xecaea6, 0xecaea7,
+ /* ed */ 0xecaea8, 0xecaea9, 0xecaeaa, 0xecaeab,
+ /* f1 */ 0xecaeac, 0x000000, 0xecaead, 0xecaeae,
+ /* f5 */ 0xecaeaf, 0xecaeb0, 0xecaeb1, 0xecaeb2,
+ /* f9 */ 0xecaeb3, 0xecaeb4, 0xecaeb5, 0xecaeb6,
+ /* fd */ 0xecaeb7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: bfxx - offset 0x02f84 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecaeb8, 0xecaeb9, 0xecaeba, 0xecaebb,
+ /* 45 */ 0xecaebc, 0xecaebd, 0xecaebe, 0xecaebf,
+ /* 49 */ 0xecaf80, 0xecaf81, 0xecaf82, 0xecaf83,
+ /* 4d */ 0xecaf84, 0xecaf85, 0xecaf86, 0xecaf87,
+ /* 51 */ 0xecaf88, 0x000000, 0xecaf89, 0xecaf8a,
+ /* 55 */ 0xecaf8b, 0xecaf8c, 0xecaf8d, 0xecaf8e,
+ /* 59 */ 0xecaf8f, 0xecaf90, 0xecaf91, 0xecaf92,
+ /* 5d */ 0xecaf93, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecaf94, 0xecaf95, 0xecaf96, 0xecaf97,
+ /* 65 */ 0xecaf98, 0xecaf99, 0xecaf9a, 0xecaf9b,
+ /* 69 */ 0xecaf9c, 0xecaf9d, 0xecaf9e, 0xecaf9f,
+ /* 6d */ 0xecafa0, 0xecafa1, 0xecafa2, 0xecafa3,
+ /* 71 */ 0xecafa4, 0x000000, 0xecafa5, 0xecafa6,
+ /* 75 */ 0xecafa7, 0xecafa8, 0xecafa9, 0xecafaa,
+ /* 79 */ 0xecafab, 0xecafac, 0xecafad, 0xecafae,
+ /* 7d */ 0xecafaf, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecafb0, 0xecafb1, 0xecafb2, 0xecafb3,
+ /* 85 */ 0xecafb4, 0xecafb5, 0xecafb6, 0xecafb7,
+ /* 89 */ 0xecafb8, 0xecafb9, 0xecafba, 0xecafbb,
+ /* 8d */ 0xecafbc, 0xecafbd, 0xecafbe, 0xecafbf,
+ /* 91 */ 0xecb080, 0x000000, 0xecb081, 0xecb082,
+ /* 95 */ 0xecb083, 0xecb084, 0xecb085, 0xecb086,
+ /* 99 */ 0xecb087, 0xecb088, 0xecb089, 0xecb08a,
+ /* 9d */ 0xecb08b, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecb08c, 0xecb08d, 0xecb08e, 0xecb08f,
+ /* a5 */ 0xecb090, 0xecb091, 0xecb092, 0xecb093,
+ /* a9 */ 0xecb094, 0xecb095, 0xecb096, 0xecb097,
+ /* ad */ 0xecb098, 0xecb099, 0xecb09a, 0xecb09b,
+ /* b1 */ 0xecb09c, 0x000000, 0xecb09d, 0xecb09e,
+ /* b5 */ 0xecb09f, 0xecb0a0, 0xecb0a1, 0xecb0a2,
+ /* b9 */ 0xecb0a3, 0xecb0a4, 0xecb0a5, 0xecb0a6,
+ /* bd */ 0xecb0a7, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c0xx - offset 0x03042 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3858a, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb0a8, 0xecb0a9, 0xecb0aa, 0xecb0ab,
+ /* 65 */ 0xecb0ac, 0xecb0ad, 0xecb0ae, 0xecb0af,
+ /* 69 */ 0xecb0b0, 0xecb0b1, 0xecb0b2, 0xecb0b3,
+ /* 6d */ 0xecb0b4, 0xecb0b5, 0xecb0b6, 0xecb0b7,
+ /* 71 */ 0xecb0b8, 0x000000, 0xecb0b9, 0xecb0ba,
+ /* 75 */ 0xecb0bb, 0xecb0bc, 0xecb0bd, 0xecb0be,
+ /* 79 */ 0xecb0bf, 0xecb180, 0xecb181, 0xecb182,
+ /* 7d */ 0xecb183, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb184, 0xecb185, 0xecb186, 0xecb187,
+ /* 85 */ 0xecb188, 0xecb189, 0xecb18a, 0xecb18b,
+ /* 89 */ 0xecb18c, 0xecb18d, 0xecb18e, 0xecb18f,
+ /* 8d */ 0xecb190, 0xecb191, 0xecb192, 0xecb193,
+ /* 91 */ 0xecb194, 0x000000, 0xecb195, 0xecb196,
+ /* 95 */ 0xecb197, 0xecb198, 0xecb199, 0xecb19a,
+ /* 99 */ 0xecb19b, 0xecb19c, 0xecb19d, 0xecb19e,
+ /* 9d */ 0xecb19f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecb1a0, 0xecb1a1, 0xecb1a2, 0xecb1a3,
+ /* a5 */ 0xecb1a4, 0xecb1a5, 0xecb1a6, 0xecb1a7,
+ /* a9 */ 0xecb1a8, 0xecb1a9, 0xecb1aa, 0xecb1ab,
+ /* ad */ 0xecb1ac, 0xecb1ad, 0xecb1ae, 0xecb1af,
+ /* b1 */ 0xecb1b0, 0x000000, 0xecb1b1, 0xecb1b2,
+ /* b5 */ 0xecb1b3, 0xecb1b4, 0xecb1b5, 0xecb1b6,
+ /* b9 */ 0xecb1b7, 0xecb1b8, 0xecb1b9, 0xecb1ba,
+ /* bd */ 0xecb1bb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecb1bc, 0xecb1bd, 0xecb1be, 0xecb1bf,
+ /* c5 */ 0xecb280, 0xecb281, 0xecb282, 0xecb283,
+ /* c9 */ 0xecb284, 0xecb285, 0xecb286, 0xecb287,
+ /* cd */ 0xecb288, 0xecb289, 0xecb28a, 0xecb28b,
+ /* d1 */ 0xecb28c, 0x000000, 0xecb28d, 0xecb28e,
+ /* d5 */ 0xecb28f, 0xecb290, 0xecb291, 0xecb292,
+ /* d9 */ 0xecb293, 0xecb294, 0xecb295, 0xecb296,
+ /* dd */ 0xecb297, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecb298, 0xecb299, 0xecb29a, 0xecb29b,
+ /* e5 */ 0xecb29c, 0xecb29d, 0xecb29e, 0xecb29f,
+ /* e9 */ 0xecb2a0, 0xecb2a1, 0xecb2a2, 0xecb2a3,
+ /* ed */ 0xecb2a4, 0xecb2a5, 0xecb2a6, 0xecb2a7,
+ /* f1 */ 0xecb2a8, 0x000000, 0xecb2a9, 0xecb2aa,
+ /* f5 */ 0xecb2ab, 0xecb2ac, 0xecb2ad, 0xecb2ae,
+ /* f9 */ 0xecb2af, 0xecb2b0, 0xecb2b1, 0xecb2b2,
+ /* fd */ 0xecb2b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c1xx - offset 0x0310f ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecb2b4, 0xecb2b5, 0xecb2b6, 0xecb2b7,
+ /* 45 */ 0xecb2b8, 0xecb2b9, 0xecb2ba, 0xecb2bb,
+ /* 49 */ 0xecb2bc, 0xecb2bd, 0xecb2be, 0xecb2bf,
+ /* 4d */ 0xecb380, 0xecb381, 0xecb382, 0xecb383,
+ /* 51 */ 0xecb384, 0x000000, 0xecb385, 0xecb386,
+ /* 55 */ 0xecb387, 0xecb388, 0xecb389, 0xecb38a,
+ /* 59 */ 0xecb38b, 0xecb38c, 0xecb38d, 0xecb38e,
+ /* 5d */ 0xecb38f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb390, 0xecb391, 0xecb392, 0xecb393,
+ /* 65 */ 0xecb394, 0xecb395, 0xecb396, 0xecb397,
+ /* 69 */ 0xecb398, 0xecb399, 0xecb39a, 0xecb39b,
+ /* 6d */ 0xecb39c, 0xecb39d, 0xecb39e, 0xecb39f,
+ /* 71 */ 0xecb3a0, 0x000000, 0xecb3a1, 0xecb3a2,
+ /* 75 */ 0xecb3a3, 0xecb3a4, 0xecb3a5, 0xecb3a6,
+ /* 79 */ 0xecb3a7, 0xecb3a8, 0xecb3a9, 0xecb3aa,
+ /* 7d */ 0xecb3ab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb3ac, 0xecb3ad, 0xecb3ae, 0xecb3af,
+ /* 85 */ 0xecb3b0, 0xecb3b1, 0xecb3b2, 0xecb3b3,
+ /* 89 */ 0xecb3b4, 0xecb3b5, 0xecb3b6, 0xecb3b7,
+ /* 8d */ 0xecb3b8, 0xecb3b9, 0xecb3ba, 0xecb3bb,
+ /* 91 */ 0xecb3bc, 0x000000, 0xecb3bd, 0xecb3be,
+ /* 95 */ 0xecb3bf, 0xecb480, 0xecb481, 0xecb482,
+ /* 99 */ 0xecb483, 0xecb484, 0xecb485, 0xecb486,
+ /* 9d */ 0xecb487, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecb488, 0xecb489, 0xecb48a, 0xecb48b,
+ /* a5 */ 0xecb48c, 0xecb48d, 0xecb48e, 0xecb48f,
+ /* a9 */ 0xecb490, 0xecb491, 0xecb492, 0xecb493,
+ /* ad */ 0xecb494, 0xecb495, 0xecb496, 0xecb497,
+ /* b1 */ 0xecb498, 0x000000, 0xecb499, 0xecb49a,
+ /* b5 */ 0xecb49b, 0xecb49c, 0xecb49d, 0xecb49e,
+ /* b9 */ 0xecb49f, 0xecb4a0, 0xecb4a1, 0xecb4a2,
+ /* bd */ 0xecb4a3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecb4a4, 0xecb4a5, 0xecb4a6, 0xecb4a7,
+ /* c5 */ 0xecb4a8, 0xecb4a9, 0xecb4aa, 0xecb4ab,
+ /* c9 */ 0xecb4ac, 0xecb4ad, 0xecb4ae, 0xecb4af,
+ /* cd */ 0xecb4b0, 0xecb4b1, 0xecb4b2, 0xecb4b3,
+ /* d1 */ 0xecb4b4, 0x000000, 0xecb4b5, 0xecb4b6,
+ /* d5 */ 0xecb4b7, 0xecb4b8, 0xecb4b9, 0xecb4ba,
+ /* d9 */ 0xecb4bb, 0xecb4bc, 0xecb4bd, 0xecb4be,
+ /* dd */ 0xecb4bf, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecb580, 0xecb581, 0xecb582, 0xecb583,
+ /* e5 */ 0xecb584, 0xecb585, 0xecb586, 0xecb587,
+ /* e9 */ 0xecb588, 0xecb589, 0xecb58a, 0xecb58b,
+ /* ed */ 0xecb58c, 0xecb58d, 0xecb58e, 0xecb58f,
+ /* f1 */ 0xecb590, 0x000000, 0xecb591, 0xecb592,
+ /* f5 */ 0xecb593, 0xecb594, 0xecb595, 0xecb596,
+ /* f9 */ 0xecb597, 0xecb598, 0xecb599, 0xecb59a,
+ /* fd */ 0xecb59b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c2xx - offset 0x031dc ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecb59c, 0xecb59d, 0xecb59e, 0xecb59f,
+ /* 45 */ 0xecb5a0, 0xecb5a1, 0xecb5a2, 0xecb5a3,
+ /* 49 */ 0xecb5a4, 0xecb5a5, 0xecb5a6, 0xecb5a7,
+ /* 4d */ 0xecb5a8, 0xecb5a9, 0xecb5aa, 0xecb5ab,
+ /* 51 */ 0xecb5ac, 0x000000, 0xecb5ad, 0xecb5ae,
+ /* 55 */ 0xecb5af, 0xecb5b0, 0xecb5b1, 0xecb5b2,
+ /* 59 */ 0xecb5b3, 0xecb5b4, 0xecb5b5, 0xecb5b6,
+ /* 5d */ 0xecb5b7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb5b8, 0xecb5b9, 0xecb5ba, 0xecb5bb,
+ /* 65 */ 0xecb5bc, 0xecb5bd, 0xecb5be, 0xecb5bf,
+ /* 69 */ 0xecb680, 0xecb681, 0xecb682, 0xecb683,
+ /* 6d */ 0xecb684, 0xecb685, 0xecb686, 0xecb687,
+ /* 71 */ 0xecb688, 0x000000, 0xecb689, 0xecb68a,
+ /* 75 */ 0xecb68b, 0xecb68c, 0xecb68d, 0xecb68e,
+ /* 79 */ 0xecb68f, 0xecb690, 0xecb691, 0xecb692,
+ /* 7d */ 0xecb693, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb694, 0xecb695, 0xecb696, 0xecb697,
+ /* 85 */ 0xecb698, 0xecb699, 0xecb69a, 0xecb69b,
+ /* 89 */ 0xecb69c, 0xecb69d, 0xecb69e, 0xecb69f,
+ /* 8d */ 0xecb6a0, 0xecb6a1, 0xecb6a2, 0xecb6a3,
+ /* 91 */ 0xecb6a4, 0x000000, 0xecb6a5, 0xecb6a6,
+ /* 95 */ 0xecb6a7, 0xecb6a8, 0xecb6a9, 0xecb6aa,
+ /* 99 */ 0xecb6ab, 0xecb6ac, 0xecb6ad, 0xecb6ae,
+ /* 9d */ 0xecb6af, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecb6b0, 0xecb6b1, 0xecb6b2, 0xecb6b3,
+ /* a5 */ 0xecb6b4, 0xecb6b5, 0xecb6b6, 0xecb6b7,
+ /* a9 */ 0xecb6b8, 0xecb6b9, 0xecb6ba, 0xecb6bb,
+ /* ad */ 0xecb6bc, 0xecb6bd, 0xecb6be, 0xecb6bf,
+ /* b1 */ 0xecb780, 0x000000, 0xecb781, 0xecb782,
+ /* b5 */ 0xecb783, 0xecb784, 0xecb785, 0xecb786,
+ /* b9 */ 0xecb787, 0xecb788, 0xecb789, 0xecb78a,
+ /* bd */ 0xecb78b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecb78c, 0xecb78d, 0xecb78e, 0xecb78f,
+ /* c5 */ 0xecb790, 0xecb791, 0xecb792, 0xecb793,
+ /* c9 */ 0xecb794, 0xecb795, 0xecb796, 0xecb797,
+ /* cd */ 0xecb798, 0xecb799, 0xecb79a, 0xecb79b,
+ /* d1 */ 0xecb79c, 0x000000, 0xecb79d, 0xecb79e,
+ /* d5 */ 0xecb79f, 0xecb7a0, 0xecb7a1, 0xecb7a2,
+ /* d9 */ 0xecb7a3, 0xecb7a4, 0xecb7a5, 0xecb7a6,
+ /* dd */ 0xecb7a7, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecb7a8, 0xecb7a9, 0xecb7aa, 0xecb7ab,
+ /* e5 */ 0xecb7ac, 0xecb7ad, 0xecb7ae, 0xecb7af,
+ /* e9 */ 0xecb7b0, 0xecb7b1, 0xecb7b2, 0xecb7b3,
+ /* ed */ 0xecb7b4, 0xecb7b5, 0xecb7b6, 0xecb7b7,
+ /* f1 */ 0xecb7b8, 0x000000, 0xecb7b9, 0xecb7ba,
+ /* f5 */ 0xecb7bb, 0xecb7bc, 0xecb7bd, 0xecb7be,
+ /* f9 */ 0xecb7bf, 0xecb880, 0xecb881, 0xecb882,
+ /* fd */ 0xecb883,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x032a9 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecb884, 0xecb885, 0xecb886, 0xecb887,
+ /* 45 */ 0xecb888, 0xecb889, 0xecb88a, 0xecb88b,
+ /* 49 */ 0xecb88c, 0xecb88d, 0xecb88e, 0xecb88f,
+ /* 4d */ 0xecb890, 0xecb891, 0xecb892, 0xecb893,
+ /* 51 */ 0xecb894, 0x000000, 0xecb895, 0xecb896,
+ /* 55 */ 0xecb897, 0xecb898, 0xecb899, 0xecb89a,
+ /* 59 */ 0xecb89b, 0xecb89c, 0xecb89d, 0xecb89e,
+ /* 5d */ 0xecb89f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb8a0, 0xecb8a1, 0xecb8a2, 0xecb8a3,
+ /* 65 */ 0xecb8a4, 0xecb8a5, 0xecb8a6, 0xecb8a7,
+ /* 69 */ 0xecb8a8, 0xecb8a9, 0xecb8aa, 0xecb8ab,
+ /* 6d */ 0xecb8ac, 0xecb8ad, 0xecb8ae, 0xecb8af,
+ /* 71 */ 0xecb8b0, 0x000000, 0xecb8b1, 0xecb8b2,
+ /* 75 */ 0xecb8b3, 0xecb8b4, 0xecb8b5, 0xecb8b6,
+ /* 79 */ 0xecb8b7, 0xecb8b8, 0xecb8b9, 0xecb8ba,
+ /* 7d */ 0xecb8bb, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb8bc, 0xecb8bd, 0xecb8be, 0xecb8bf,
+ /* 85 */ 0xecb980, 0xecb981, 0xecb982, 0xecb983,
+ /* 89 */ 0xecb984, 0xecb985, 0xecb986, 0xecb987,
+ /* 8d */ 0xecb988, 0xecb989, 0xecb98a, 0xecb98b,
+ /* 91 */ 0xecb98c, 0x000000, 0xecb98d, 0xecb98e,
+ /* 95 */ 0xecb98f, 0xecb990, 0xecb991, 0xecb992,
+ /* 99 */ 0xecb993, 0xecb994, 0xecb995, 0xecb996,
+ /* 9d */ 0xecb997, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecb998, 0xecb999, 0xecb99a, 0xecb99b,
+ /* a5 */ 0xecb99c, 0xecb99d, 0xecb99e, 0xecb99f,
+ /* a9 */ 0xecb9a0, 0xecb9a1, 0xecb9a2, 0xecb9a3,
+ /* ad */ 0xecb9a4, 0xecb9a5, 0xecb9a6, 0xecb9a7,
+ /* b1 */ 0xecb9a8, 0x000000, 0xecb9a9, 0xecb9aa,
+ /* b5 */ 0xecb9ab, 0xecb9ac, 0xecb9ad, 0xecb9ae,
+ /* b9 */ 0xecb9af, 0xecb9b0, 0xecb9b1, 0xecb9b2,
+ /* bd */ 0xecb9b3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x03367 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3858b, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb9b4, 0xecb9b5, 0xecb9b6, 0xecb9b7,
+ /* 65 */ 0xecb9b8, 0xecb9b9, 0xecb9ba, 0xecb9bb,
+ /* 69 */ 0xecb9bc, 0xecb9bd, 0xecb9be, 0xecb9bf,
+ /* 6d */ 0xecba80, 0xecba81, 0xecba82, 0xecba83,
+ /* 71 */ 0xecba84, 0x000000, 0xecba85, 0xecba86,
+ /* 75 */ 0xecba87, 0xecba88, 0xecba89, 0xecba8a,
+ /* 79 */ 0xecba8b, 0xecba8c, 0xecba8d, 0xecba8e,
+ /* 7d */ 0xecba8f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecba90, 0xecba91, 0xecba92, 0xecba93,
+ /* 85 */ 0xecba94, 0xecba95, 0xecba96, 0xecba97,
+ /* 89 */ 0xecba98, 0xecba99, 0xecba9a, 0xecba9b,
+ /* 8d */ 0xecba9c, 0xecba9d, 0xecba9e, 0xecba9f,
+ /* 91 */ 0xecbaa0, 0x000000, 0xecbaa1, 0xecbaa2,
+ /* 95 */ 0xecbaa3, 0xecbaa4, 0xecbaa5, 0xecbaa6,
+ /* 99 */ 0xecbaa7, 0xecbaa8, 0xecbaa9, 0xecbaaa,
+ /* 9d */ 0xecbaab, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecbaac, 0xecbaad, 0xecbaae, 0xecbaaf,
+ /* a5 */ 0xecbab0, 0xecbab1, 0xecbab2, 0xecbab3,
+ /* a9 */ 0xecbab4, 0xecbab5, 0xecbab6, 0xecbab7,
+ /* ad */ 0xecbab8, 0xecbab9, 0xecbaba, 0xecbabb,
+ /* b1 */ 0xecbabc, 0x000000, 0xecbabd, 0xecbabe,
+ /* b5 */ 0xecbabf, 0xecbb80, 0xecbb81, 0xecbb82,
+ /* b9 */ 0xecbb83, 0xecbb84, 0xecbb85, 0xecbb86,
+ /* bd */ 0xecbb87, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecbb88, 0xecbb89, 0xecbb8a, 0xecbb8b,
+ /* c5 */ 0xecbb8c, 0xecbb8d, 0xecbb8e, 0xecbb8f,
+ /* c9 */ 0xecbb90, 0xecbb91, 0xecbb92, 0xecbb93,
+ /* cd */ 0xecbb94, 0xecbb95, 0xecbb96, 0xecbb97,
+ /* d1 */ 0xecbb98, 0x000000, 0xecbb99, 0xecbb9a,
+ /* d5 */ 0xecbb9b, 0xecbb9c, 0xecbb9d, 0xecbb9e,
+ /* d9 */ 0xecbb9f, 0xecbba0, 0xecbba1, 0xecbba2,
+ /* dd */ 0xecbba3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecbba4, 0xecbba5, 0xecbba6, 0xecbba7,
+ /* e5 */ 0xecbba8, 0xecbba9, 0xecbbaa, 0xecbbab,
+ /* e9 */ 0xecbbac, 0xecbbad, 0xecbbae, 0xecbbaf,
+ /* ed */ 0xecbbb0, 0xecbbb1, 0xecbbb2, 0xecbbb3,
+ /* f1 */ 0xecbbb4, 0x000000, 0xecbbb5, 0xecbbb6,
+ /* f5 */ 0xecbbb7, 0xecbbb8, 0xecbbb9, 0xecbbba,
+ /* f9 */ 0xecbbbb, 0xecbbbc, 0xecbbbd, 0xecbbbe,
+ /* fd */ 0xecbbbf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x03434 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecbc80, 0xecbc81, 0xecbc82, 0xecbc83,
+ /* 45 */ 0xecbc84, 0xecbc85, 0xecbc86, 0xecbc87,
+ /* 49 */ 0xecbc88, 0xecbc89, 0xecbc8a, 0xecbc8b,
+ /* 4d */ 0xecbc8c, 0xecbc8d, 0xecbc8e, 0xecbc8f,
+ /* 51 */ 0xecbc90, 0x000000, 0xecbc91, 0xecbc92,
+ /* 55 */ 0xecbc93, 0xecbc94, 0xecbc95, 0xecbc96,
+ /* 59 */ 0xecbc97, 0xecbc98, 0xecbc99, 0xecbc9a,
+ /* 5d */ 0xecbc9b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbc9c, 0xecbc9d, 0xecbc9e, 0xecbc9f,
+ /* 65 */ 0xecbca0, 0xecbca1, 0xecbca2, 0xecbca3,
+ /* 69 */ 0xecbca4, 0xecbca5, 0xecbca6, 0xecbca7,
+ /* 6d */ 0xecbca8, 0xecbca9, 0xecbcaa, 0xecbcab,
+ /* 71 */ 0xecbcac, 0x000000, 0xecbcad, 0xecbcae,
+ /* 75 */ 0xecbcaf, 0xecbcb0, 0xecbcb1, 0xecbcb2,
+ /* 79 */ 0xecbcb3, 0xecbcb4, 0xecbcb5, 0xecbcb6,
+ /* 7d */ 0xecbcb7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecbcb8, 0xecbcb9, 0xecbcba, 0xecbcbb,
+ /* 85 */ 0xecbcbc, 0xecbcbd, 0xecbcbe, 0xecbcbf,
+ /* 89 */ 0xecbd80, 0xecbd81, 0xecbd82, 0xecbd83,
+ /* 8d */ 0xecbd84, 0xecbd85, 0xecbd86, 0xecbd87,
+ /* 91 */ 0xecbd88, 0x000000, 0xecbd89, 0xecbd8a,
+ /* 95 */ 0xecbd8b, 0xecbd8c, 0xecbd8d, 0xecbd8e,
+ /* 99 */ 0xecbd8f, 0xecbd90, 0xecbd91, 0xecbd92,
+ /* 9d */ 0xecbd93, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecbd94, 0xecbd95, 0xecbd96, 0xecbd97,
+ /* a5 */ 0xecbd98, 0xecbd99, 0xecbd9a, 0xecbd9b,
+ /* a9 */ 0xecbd9c, 0xecbd9d, 0xecbd9e, 0xecbd9f,
+ /* ad */ 0xecbda0, 0xecbda1, 0xecbda2, 0xecbda3,
+ /* b1 */ 0xecbda4, 0x000000, 0xecbda5, 0xecbda6,
+ /* b5 */ 0xecbda7, 0xecbda8, 0xecbda9, 0xecbdaa,
+ /* b9 */ 0xecbdab, 0xecbdac, 0xecbdad, 0xecbdae,
+ /* bd */ 0xecbdaf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xecbdb0, 0xecbdb1, 0xecbdb2, 0xecbdb3,
+ /* c5 */ 0xecbdb4, 0xecbdb5, 0xecbdb6, 0xecbdb7,
+ /* c9 */ 0xecbdb8, 0xecbdb9, 0xecbdba, 0xecbdbb,
+ /* cd */ 0xecbdbc, 0xecbdbd, 0xecbdbe, 0xecbdbf,
+ /* d1 */ 0xecbe80, 0x000000, 0xecbe81, 0xecbe82,
+ /* d5 */ 0xecbe83, 0xecbe84, 0xecbe85, 0xecbe86,
+ /* d9 */ 0xecbe87, 0xecbe88, 0xecbe89, 0xecbe8a,
+ /* dd */ 0xecbe8b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xecbe8c, 0xecbe8d, 0xecbe8e, 0xecbe8f,
+ /* e5 */ 0xecbe90, 0xecbe91, 0xecbe92, 0xecbe93,
+ /* e9 */ 0xecbe94, 0xecbe95, 0xecbe96, 0xecbe97,
+ /* ed */ 0xecbe98, 0xecbe99, 0xecbe9a, 0xecbe9b,
+ /* f1 */ 0xecbe9c, 0x000000, 0xecbe9d, 0xecbe9e,
+ /* f5 */ 0xecbe9f, 0xecbea0, 0xecbea1, 0xecbea2,
+ /* f9 */ 0xecbea3, 0xecbea4, 0xecbea5, 0xecbea6,
+ /* fd */ 0xecbea7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x03501 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xecbea8, 0xecbea9, 0xecbeaa, 0xecbeab,
+ /* 45 */ 0xecbeac, 0xecbead, 0xecbeae, 0xecbeaf,
+ /* 49 */ 0xecbeb0, 0xecbeb1, 0xecbeb2, 0xecbeb3,
+ /* 4d */ 0xecbeb4, 0xecbeb5, 0xecbeb6, 0xecbeb7,
+ /* 51 */ 0xecbeb8, 0x000000, 0xecbeb9, 0xecbeba,
+ /* 55 */ 0xecbebb, 0xecbebc, 0xecbebd, 0xecbebe,
+ /* 59 */ 0xecbebf, 0xecbf80, 0xecbf81, 0xecbf82,
+ /* 5d */ 0xecbf83, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbf84, 0xecbf85, 0xecbf86, 0xecbf87,
+ /* 65 */ 0xecbf88, 0xecbf89, 0xecbf8a, 0xecbf8b,
+ /* 69 */ 0xecbf8c, 0xecbf8d, 0xecbf8e, 0xecbf8f,
+ /* 6d */ 0xecbf90, 0xecbf91, 0xecbf92, 0xecbf93,
+ /* 71 */ 0xecbf94, 0x000000, 0xecbf95, 0xecbf96,
+ /* 75 */ 0xecbf97, 0xecbf98, 0xecbf99, 0xecbf9a,
+ /* 79 */ 0xecbf9b, 0xecbf9c, 0xecbf9d, 0xecbf9e,
+ /* 7d */ 0xecbf9f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecbfa0, 0xecbfa1, 0xecbfa2, 0xecbfa3,
+ /* 85 */ 0xecbfa4, 0xecbfa5, 0xecbfa6, 0xecbfa7,
+ /* 89 */ 0xecbfa8, 0xecbfa9, 0xecbfaa, 0xecbfab,
+ /* 8d */ 0xecbfac, 0xecbfad, 0xecbfae, 0xecbfaf,
+ /* 91 */ 0xecbfb0, 0x000000, 0xecbfb1, 0xecbfb2,
+ /* 95 */ 0xecbfb3, 0xecbfb4, 0xecbfb5, 0xecbfb6,
+ /* 99 */ 0xecbfb7, 0xecbfb8, 0xecbfb9, 0xecbfba,
+ /* 9d */ 0xecbfbb, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xecbfbc, 0xecbfbd, 0xecbfbe, 0xecbfbf,
+ /* a5 */ 0xed8080, 0xed8081, 0xed8082, 0xed8083,
+ /* a9 */ 0xed8084, 0xed8085, 0xed8086, 0xed8087,
+ /* ad */ 0xed8088, 0xed8089, 0xed808a, 0xed808b,
+ /* b1 */ 0xed808c, 0x000000, 0xed808d, 0xed808e,
+ /* b5 */ 0xed808f, 0xed8090, 0xed8091, 0xed8092,
+ /* b9 */ 0xed8093, 0xed8094, 0xed8095, 0xed8096,
+ /* bd */ 0xed8097, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed8098, 0xed8099, 0xed809a, 0xed809b,
+ /* c5 */ 0xed809c, 0xed809d, 0xed809e, 0xed809f,
+ /* c9 */ 0xed80a0, 0xed80a1, 0xed80a2, 0xed80a3,
+ /* cd */ 0xed80a4, 0xed80a5, 0xed80a6, 0xed80a7,
+ /* d1 */ 0xed80a8, 0x000000, 0xed80a9, 0xed80aa,
+ /* d5 */ 0xed80ab, 0xed80ac, 0xed80ad, 0xed80ae,
+ /* d9 */ 0xed80af, 0xed80b0, 0xed80b1, 0xed80b2,
+ /* dd */ 0xed80b3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed80b4, 0xed80b5, 0xed80b6, 0xed80b7,
+ /* e5 */ 0xed80b8, 0xed80b9, 0xed80ba, 0xed80bb,
+ /* e9 */ 0xed80bc, 0xed80bd, 0xed80be, 0xed80bf,
+ /* ed */ 0xed8180, 0xed8181, 0xed8182, 0xed8183,
+ /* f1 */ 0xed8184, 0x000000, 0xed8185, 0xed8186,
+ /* f5 */ 0xed8187, 0xed8188, 0xed8189, 0xed818a,
+ /* f9 */ 0xed818b, 0xed818c, 0xed818d, 0xed818e,
+ /* fd */ 0xed818f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x035ce ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed8190, 0xed8191, 0xed8192, 0xed8193,
+ /* 45 */ 0xed8194, 0xed8195, 0xed8196, 0xed8197,
+ /* 49 */ 0xed8198, 0xed8199, 0xed819a, 0xed819b,
+ /* 4d */ 0xed819c, 0xed819d, 0xed819e, 0xed819f,
+ /* 51 */ 0xed81a0, 0x000000, 0xed81a1, 0xed81a2,
+ /* 55 */ 0xed81a3, 0xed81a4, 0xed81a5, 0xed81a6,
+ /* 59 */ 0xed81a7, 0xed81a8, 0xed81a9, 0xed81aa,
+ /* 5d */ 0xed81ab, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed81ac, 0xed81ad, 0xed81ae, 0xed81af,
+ /* 65 */ 0xed81b0, 0xed81b1, 0xed81b2, 0xed81b3,
+ /* 69 */ 0xed81b4, 0xed81b5, 0xed81b6, 0xed81b7,
+ /* 6d */ 0xed81b8, 0xed81b9, 0xed81ba, 0xed81bb,
+ /* 71 */ 0xed81bc, 0x000000, 0xed81bd, 0xed81be,
+ /* 75 */ 0xed81bf, 0xed8280, 0xed8281, 0xed8282,
+ /* 79 */ 0xed8283, 0xed8284, 0xed8285, 0xed8286,
+ /* 7d */ 0xed8287, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8288, 0xed8289, 0xed828a, 0xed828b,
+ /* 85 */ 0xed828c, 0xed828d, 0xed828e, 0xed828f,
+ /* 89 */ 0xed8290, 0xed8291, 0xed8292, 0xed8293,
+ /* 8d */ 0xed8294, 0xed8295, 0xed8296, 0xed8297,
+ /* 91 */ 0xed8298, 0x000000, 0xed8299, 0xed829a,
+ /* 95 */ 0xed829b, 0xed829c, 0xed829d, 0xed829e,
+ /* 99 */ 0xed829f, 0xed82a0, 0xed82a1, 0xed82a2,
+ /* 9d */ 0xed82a3, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed82a4, 0xed82a5, 0xed82a6, 0xed82a7,
+ /* a5 */ 0xed82a8, 0xed82a9, 0xed82aa, 0xed82ab,
+ /* a9 */ 0xed82ac, 0xed82ad, 0xed82ae, 0xed82af,
+ /* ad */ 0xed82b0, 0xed82b1, 0xed82b2, 0xed82b3,
+ /* b1 */ 0xed82b4, 0x000000, 0xed82b5, 0xed82b6,
+ /* b5 */ 0xed82b7, 0xed82b8, 0xed82b9, 0xed82ba,
+ /* b9 */ 0xed82bb, 0xed82bc, 0xed82bd, 0xed82be,
+ /* bd */ 0xed82bf, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c8xx - offset 0x0368c ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3858c, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8380, 0xed8381, 0xed8382, 0xed8383,
+ /* 65 */ 0xed8384, 0xed8385, 0xed8386, 0xed8387,
+ /* 69 */ 0xed8388, 0xed8389, 0xed838a, 0xed838b,
+ /* 6d */ 0xed838c, 0xed838d, 0xed838e, 0xed838f,
+ /* 71 */ 0xed8390, 0x000000, 0xed8391, 0xed8392,
+ /* 75 */ 0xed8393, 0xed8394, 0xed8395, 0xed8396,
+ /* 79 */ 0xed8397, 0xed8398, 0xed8399, 0xed839a,
+ /* 7d */ 0xed839b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed839c, 0xed839d, 0xed839e, 0xed839f,
+ /* 85 */ 0xed83a0, 0xed83a1, 0xed83a2, 0xed83a3,
+ /* 89 */ 0xed83a4, 0xed83a5, 0xed83a6, 0xed83a7,
+ /* 8d */ 0xed83a8, 0xed83a9, 0xed83aa, 0xed83ab,
+ /* 91 */ 0xed83ac, 0x000000, 0xed83ad, 0xed83ae,
+ /* 95 */ 0xed83af, 0xed83b0, 0xed83b1, 0xed83b2,
+ /* 99 */ 0xed83b3, 0xed83b4, 0xed83b5, 0xed83b6,
+ /* 9d */ 0xed83b7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed83b8, 0xed83b9, 0xed83ba, 0xed83bb,
+ /* a5 */ 0xed83bc, 0xed83bd, 0xed83be, 0xed83bf,
+ /* a9 */ 0xed8480, 0xed8481, 0xed8482, 0xed8483,
+ /* ad */ 0xed8484, 0xed8485, 0xed8486, 0xed8487,
+ /* b1 */ 0xed8488, 0x000000, 0xed8489, 0xed848a,
+ /* b5 */ 0xed848b, 0xed848c, 0xed848d, 0xed848e,
+ /* b9 */ 0xed848f, 0xed8490, 0xed8491, 0xed8492,
+ /* bd */ 0xed8493, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed8494, 0xed8495, 0xed8496, 0xed8497,
+ /* c5 */ 0xed8498, 0xed8499, 0xed849a, 0xed849b,
+ /* c9 */ 0xed849c, 0xed849d, 0xed849e, 0xed849f,
+ /* cd */ 0xed84a0, 0xed84a1, 0xed84a2, 0xed84a3,
+ /* d1 */ 0xed84a4, 0x000000, 0xed84a5, 0xed84a6,
+ /* d5 */ 0xed84a7, 0xed84a8, 0xed84a9, 0xed84aa,
+ /* d9 */ 0xed84ab, 0xed84ac, 0xed84ad, 0xed84ae,
+ /* dd */ 0xed84af, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed84b0, 0xed84b1, 0xed84b2, 0xed84b3,
+ /* e5 */ 0xed84b4, 0xed84b5, 0xed84b6, 0xed84b7,
+ /* e9 */ 0xed84b8, 0xed84b9, 0xed84ba, 0xed84bb,
+ /* ed */ 0xed84bc, 0xed84bd, 0xed84be, 0xed84bf,
+ /* f1 */ 0xed8580, 0x000000, 0xed8581, 0xed8582,
+ /* f5 */ 0xed8583, 0xed8584, 0xed8585, 0xed8586,
+ /* f9 */ 0xed8587, 0xed8588, 0xed8589, 0xed858a,
+ /* fd */ 0xed858b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c9xx - offset 0x03759 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed858c, 0xed858d, 0xed858e, 0xed858f,
+ /* 45 */ 0xed8590, 0xed8591, 0xed8592, 0xed8593,
+ /* 49 */ 0xed8594, 0xed8595, 0xed8596, 0xed8597,
+ /* 4d */ 0xed8598, 0xed8599, 0xed859a, 0xed859b,
+ /* 51 */ 0xed859c, 0x000000, 0xed859d, 0xed859e,
+ /* 55 */ 0xed859f, 0xed85a0, 0xed85a1, 0xed85a2,
+ /* 59 */ 0xed85a3, 0xed85a4, 0xed85a5, 0xed85a6,
+ /* 5d */ 0xed85a7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed85a8, 0xed85a9, 0xed85aa, 0xed85ab,
+ /* 65 */ 0xed85ac, 0xed85ad, 0xed85ae, 0xed85af,
+ /* 69 */ 0xed85b0, 0xed85b1, 0xed85b2, 0xed85b3,
+ /* 6d */ 0xed85b4, 0xed85b5, 0xed85b6, 0xed85b7,
+ /* 71 */ 0xed85b8, 0x000000, 0xed85b9, 0xed85ba,
+ /* 75 */ 0xed85bb, 0xed85bc, 0xed85bd, 0xed85be,
+ /* 79 */ 0xed85bf, 0xed8680, 0xed8681, 0xed8682,
+ /* 7d */ 0xed8683, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8684, 0xed8685, 0xed8686, 0xed8687,
+ /* 85 */ 0xed8688, 0xed8689, 0xed868a, 0xed868b,
+ /* 89 */ 0xed868c, 0xed868d, 0xed868e, 0xed868f,
+ /* 8d */ 0xed8690, 0xed8691, 0xed8692, 0xed8693,
+ /* 91 */ 0xed8694, 0x000000, 0xed8695, 0xed8696,
+ /* 95 */ 0xed8697, 0xed8698, 0xed8699, 0xed869a,
+ /* 99 */ 0xed869b, 0xed869c, 0xed869d, 0xed869e,
+ /* 9d */ 0xed869f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed86a0, 0xed86a1, 0xed86a2, 0xed86a3,
+ /* a5 */ 0xed86a4, 0xed86a5, 0xed86a6, 0xed86a7,
+ /* a9 */ 0xed86a8, 0xed86a9, 0xed86aa, 0xed86ab,
+ /* ad */ 0xed86ac, 0xed86ad, 0xed86ae, 0xed86af,
+ /* b1 */ 0xed86b0, 0x000000, 0xed86b1, 0xed86b2,
+ /* b5 */ 0xed86b3, 0xed86b4, 0xed86b5, 0xed86b6,
+ /* b9 */ 0xed86b7, 0xed86b8, 0xed86b9, 0xed86ba,
+ /* bd */ 0xed86bb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed86bc, 0xed86bd, 0xed86be, 0xed86bf,
+ /* c5 */ 0xed8780, 0xed8781, 0xed8782, 0xed8783,
+ /* c9 */ 0xed8784, 0xed8785, 0xed8786, 0xed8787,
+ /* cd */ 0xed8788, 0xed8789, 0xed878a, 0xed878b,
+ /* d1 */ 0xed878c, 0x000000, 0xed878d, 0xed878e,
+ /* d5 */ 0xed878f, 0xed8790, 0xed8791, 0xed8792,
+ /* d9 */ 0xed8793, 0xed8794, 0xed8795, 0xed8796,
+ /* dd */ 0xed8797, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed8798, 0xed8799, 0xed879a, 0xed879b,
+ /* e5 */ 0xed879c, 0xed879d, 0xed879e, 0xed879f,
+ /* e9 */ 0xed87a0, 0xed87a1, 0xed87a2, 0xed87a3,
+ /* ed */ 0xed87a4, 0xed87a5, 0xed87a6, 0xed87a7,
+ /* f1 */ 0xed87a8, 0x000000, 0xed87a9, 0xed87aa,
+ /* f5 */ 0xed87ab, 0xed87ac, 0xed87ad, 0xed87ae,
+ /* f9 */ 0xed87af, 0xed87b0, 0xed87b1, 0xed87b2,
+ /* fd */ 0xed87b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: caxx - offset 0x03826 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed87b4, 0xed87b5, 0xed87b6, 0xed87b7,
+ /* 45 */ 0xed87b8, 0xed87b9, 0xed87ba, 0xed87bb,
+ /* 49 */ 0xed87bc, 0xed87bd, 0xed87be, 0xed87bf,
+ /* 4d */ 0xed8880, 0xed8881, 0xed8882, 0xed8883,
+ /* 51 */ 0xed8884, 0x000000, 0xed8885, 0xed8886,
+ /* 55 */ 0xed8887, 0xed8888, 0xed8889, 0xed888a,
+ /* 59 */ 0xed888b, 0xed888c, 0xed888d, 0xed888e,
+ /* 5d */ 0xed888f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8890, 0xed8891, 0xed8892, 0xed8893,
+ /* 65 */ 0xed8894, 0xed8895, 0xed8896, 0xed8897,
+ /* 69 */ 0xed8898, 0xed8899, 0xed889a, 0xed889b,
+ /* 6d */ 0xed889c, 0xed889d, 0xed889e, 0xed889f,
+ /* 71 */ 0xed88a0, 0x000000, 0xed88a1, 0xed88a2,
+ /* 75 */ 0xed88a3, 0xed88a4, 0xed88a5, 0xed88a6,
+ /* 79 */ 0xed88a7, 0xed88a8, 0xed88a9, 0xed88aa,
+ /* 7d */ 0xed88ab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed88ac, 0xed88ad, 0xed88ae, 0xed88af,
+ /* 85 */ 0xed88b0, 0xed88b1, 0xed88b2, 0xed88b3,
+ /* 89 */ 0xed88b4, 0xed88b5, 0xed88b6, 0xed88b7,
+ /* 8d */ 0xed88b8, 0xed88b9, 0xed88ba, 0xed88bb,
+ /* 91 */ 0xed88bc, 0x000000, 0xed88bd, 0xed88be,
+ /* 95 */ 0xed88bf, 0xed8980, 0xed8981, 0xed8982,
+ /* 99 */ 0xed8983, 0xed8984, 0xed8985, 0xed8986,
+ /* 9d */ 0xed8987, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed8988, 0xed8989, 0xed898a, 0xed898b,
+ /* a5 */ 0xed898c, 0xed898d, 0xed898e, 0xed898f,
+ /* a9 */ 0xed8990, 0xed8991, 0xed8992, 0xed8993,
+ /* ad */ 0xed8994, 0xed8995, 0xed8996, 0xed8997,
+ /* b1 */ 0xed8998, 0x000000, 0xed8999, 0xed899a,
+ /* b5 */ 0xed899b, 0xed899c, 0xed899d, 0xed899e,
+ /* b9 */ 0xed899f, 0xed89a0, 0xed89a1, 0xed89a2,
+ /* bd */ 0xed89a3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed89a4, 0xed89a5, 0xed89a6, 0xed89a7,
+ /* c5 */ 0xed89a8, 0xed89a9, 0xed89aa, 0xed89ab,
+ /* c9 */ 0xed89ac, 0xed89ad, 0xed89ae, 0xed89af,
+ /* cd */ 0xed89b0, 0xed89b1, 0xed89b2, 0xed89b3,
+ /* d1 */ 0xed89b4, 0x000000, 0xed89b5, 0xed89b6,
+ /* d5 */ 0xed89b7, 0xed89b8, 0xed89b9, 0xed89ba,
+ /* d9 */ 0xed89bb, 0xed89bc, 0xed89bd, 0xed89be,
+ /* dd */ 0xed89bf, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed8a80, 0xed8a81, 0xed8a82, 0xed8a83,
+ /* e5 */ 0xed8a84, 0xed8a85, 0xed8a86, 0xed8a87,
+ /* e9 */ 0xed8a88, 0xed8a89, 0xed8a8a, 0xed8a8b,
+ /* ed */ 0xed8a8c, 0xed8a8d, 0xed8a8e, 0xed8a8f,
+ /* f1 */ 0xed8a90, 0x000000, 0xed8a91, 0xed8a92,
+ /* f5 */ 0xed8a93, 0xed8a94, 0xed8a95, 0xed8a96,
+ /* f9 */ 0xed8a97, 0xed8a98, 0xed8a99, 0xed8a9a,
+ /* fd */ 0xed8a9b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x038f3 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed8a9c, 0xed8a9d, 0xed8a9e, 0xed8a9f,
+ /* 45 */ 0xed8aa0, 0xed8aa1, 0xed8aa2, 0xed8aa3,
+ /* 49 */ 0xed8aa4, 0xed8aa5, 0xed8aa6, 0xed8aa7,
+ /* 4d */ 0xed8aa8, 0xed8aa9, 0xed8aaa, 0xed8aab,
+ /* 51 */ 0xed8aac, 0x000000, 0xed8aad, 0xed8aae,
+ /* 55 */ 0xed8aaf, 0xed8ab0, 0xed8ab1, 0xed8ab2,
+ /* 59 */ 0xed8ab3, 0xed8ab4, 0xed8ab5, 0xed8ab6,
+ /* 5d */ 0xed8ab7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8ab8, 0xed8ab9, 0xed8aba, 0xed8abb,
+ /* 65 */ 0xed8abc, 0xed8abd, 0xed8abe, 0xed8abf,
+ /* 69 */ 0xed8b80, 0xed8b81, 0xed8b82, 0xed8b83,
+ /* 6d */ 0xed8b84, 0xed8b85, 0xed8b86, 0xed8b87,
+ /* 71 */ 0xed8b88, 0x000000, 0xed8b89, 0xed8b8a,
+ /* 75 */ 0xed8b8b, 0xed8b8c, 0xed8b8d, 0xed8b8e,
+ /* 79 */ 0xed8b8f, 0xed8b90, 0xed8b91, 0xed8b92,
+ /* 7d */ 0xed8b93, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8b94, 0xed8b95, 0xed8b96, 0xed8b97,
+ /* 85 */ 0xed8b98, 0xed8b99, 0xed8b9a, 0xed8b9b,
+ /* 89 */ 0xed8b9c, 0xed8b9d, 0xed8b9e, 0xed8b9f,
+ /* 8d */ 0xed8ba0, 0xed8ba1, 0xed8ba2, 0xed8ba3,
+ /* 91 */ 0xed8ba4, 0x000000, 0xed8ba5, 0xed8ba6,
+ /* 95 */ 0xed8ba7, 0xed8ba8, 0xed8ba9, 0xed8baa,
+ /* 99 */ 0xed8bab, 0xed8bac, 0xed8bad, 0xed8bae,
+ /* 9d */ 0xed8baf, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed8bb0, 0xed8bb1, 0xed8bb2, 0xed8bb3,
+ /* a5 */ 0xed8bb4, 0xed8bb5, 0xed8bb6, 0xed8bb7,
+ /* a9 */ 0xed8bb8, 0xed8bb9, 0xed8bba, 0xed8bbb,
+ /* ad */ 0xed8bbc, 0xed8bbd, 0xed8bbe, 0xed8bbf,
+ /* b1 */ 0xed8c80, 0x000000, 0xed8c81, 0xed8c82,
+ /* b5 */ 0xed8c83, 0xed8c84, 0xed8c85, 0xed8c86,
+ /* b9 */ 0xed8c87, 0xed8c88, 0xed8c89, 0xed8c8a,
+ /* bd */ 0xed8c8b, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: ccxx - offset 0x039b1 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3858d, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8c8c, 0xed8c8d, 0xed8c8e, 0xed8c8f,
+ /* 65 */ 0xed8c90, 0xed8c91, 0xed8c92, 0xed8c93,
+ /* 69 */ 0xed8c94, 0xed8c95, 0xed8c96, 0xed8c97,
+ /* 6d */ 0xed8c98, 0xed8c99, 0xed8c9a, 0xed8c9b,
+ /* 71 */ 0xed8c9c, 0x000000, 0xed8c9d, 0xed8c9e,
+ /* 75 */ 0xed8c9f, 0xed8ca0, 0xed8ca1, 0xed8ca2,
+ /* 79 */ 0xed8ca3, 0xed8ca4, 0xed8ca5, 0xed8ca6,
+ /* 7d */ 0xed8ca7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8ca8, 0xed8ca9, 0xed8caa, 0xed8cab,
+ /* 85 */ 0xed8cac, 0xed8cad, 0xed8cae, 0xed8caf,
+ /* 89 */ 0xed8cb0, 0xed8cb1, 0xed8cb2, 0xed8cb3,
+ /* 8d */ 0xed8cb4, 0xed8cb5, 0xed8cb6, 0xed8cb7,
+ /* 91 */ 0xed8cb8, 0x000000, 0xed8cb9, 0xed8cba,
+ /* 95 */ 0xed8cbb, 0xed8cbc, 0xed8cbd, 0xed8cbe,
+ /* 99 */ 0xed8cbf, 0xed8d80, 0xed8d81, 0xed8d82,
+ /* 9d */ 0xed8d83, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed8d84, 0xed8d85, 0xed8d86, 0xed8d87,
+ /* a5 */ 0xed8d88, 0xed8d89, 0xed8d8a, 0xed8d8b,
+ /* a9 */ 0xed8d8c, 0xed8d8d, 0xed8d8e, 0xed8d8f,
+ /* ad */ 0xed8d90, 0xed8d91, 0xed8d92, 0xed8d93,
+ /* b1 */ 0xed8d94, 0x000000, 0xed8d95, 0xed8d96,
+ /* b5 */ 0xed8d97, 0xed8d98, 0xed8d99, 0xed8d9a,
+ /* b9 */ 0xed8d9b, 0xed8d9c, 0xed8d9d, 0xed8d9e,
+ /* bd */ 0xed8d9f, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed8da0, 0xed8da1, 0xed8da2, 0xed8da3,
+ /* c5 */ 0xed8da4, 0xed8da5, 0xed8da6, 0xed8da7,
+ /* c9 */ 0xed8da8, 0xed8da9, 0xed8daa, 0xed8dab,
+ /* cd */ 0xed8dac, 0xed8dad, 0xed8dae, 0xed8daf,
+ /* d1 */ 0xed8db0, 0x000000, 0xed8db1, 0xed8db2,
+ /* d5 */ 0xed8db3, 0xed8db4, 0xed8db5, 0xed8db6,
+ /* d9 */ 0xed8db7, 0xed8db8, 0xed8db9, 0xed8dba,
+ /* dd */ 0xed8dbb, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed8dbc, 0xed8dbd, 0xed8dbe, 0xed8dbf,
+ /* e5 */ 0xed8e80, 0xed8e81, 0xed8e82, 0xed8e83,
+ /* e9 */ 0xed8e84, 0xed8e85, 0xed8e86, 0xed8e87,
+ /* ed */ 0xed8e88, 0xed8e89, 0xed8e8a, 0xed8e8b,
+ /* f1 */ 0xed8e8c, 0x000000, 0xed8e8d, 0xed8e8e,
+ /* f5 */ 0xed8e8f, 0xed8e90, 0xed8e91, 0xed8e92,
+ /* f9 */ 0xed8e93, 0xed8e94, 0xed8e95, 0xed8e96,
+ /* fd */ 0xed8e97,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cdxx - offset 0x03a7e ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed8e98, 0xed8e99, 0xed8e9a, 0xed8e9b,
+ /* 45 */ 0xed8e9c, 0xed8e9d, 0xed8e9e, 0xed8e9f,
+ /* 49 */ 0xed8ea0, 0xed8ea1, 0xed8ea2, 0xed8ea3,
+ /* 4d */ 0xed8ea4, 0xed8ea5, 0xed8ea6, 0xed8ea7,
+ /* 51 */ 0xed8ea8, 0x000000, 0xed8ea9, 0xed8eaa,
+ /* 55 */ 0xed8eab, 0xed8eac, 0xed8ead, 0xed8eae,
+ /* 59 */ 0xed8eaf, 0xed8eb0, 0xed8eb1, 0xed8eb2,
+ /* 5d */ 0xed8eb3, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8eb4, 0xed8eb5, 0xed8eb6, 0xed8eb7,
+ /* 65 */ 0xed8eb8, 0xed8eb9, 0xed8eba, 0xed8ebb,
+ /* 69 */ 0xed8ebc, 0xed8ebd, 0xed8ebe, 0xed8ebf,
+ /* 6d */ 0xed8f80, 0xed8f81, 0xed8f82, 0xed8f83,
+ /* 71 */ 0xed8f84, 0x000000, 0xed8f85, 0xed8f86,
+ /* 75 */ 0xed8f87, 0xed8f88, 0xed8f89, 0xed8f8a,
+ /* 79 */ 0xed8f8b, 0xed8f8c, 0xed8f8d, 0xed8f8e,
+ /* 7d */ 0xed8f8f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8f90, 0xed8f91, 0xed8f92, 0xed8f93,
+ /* 85 */ 0xed8f94, 0xed8f95, 0xed8f96, 0xed8f97,
+ /* 89 */ 0xed8f98, 0xed8f99, 0xed8f9a, 0xed8f9b,
+ /* 8d */ 0xed8f9c, 0xed8f9d, 0xed8f9e, 0xed8f9f,
+ /* 91 */ 0xed8fa0, 0x000000, 0xed8fa1, 0xed8fa2,
+ /* 95 */ 0xed8fa3, 0xed8fa4, 0xed8fa5, 0xed8fa6,
+ /* 99 */ 0xed8fa7, 0xed8fa8, 0xed8fa9, 0xed8faa,
+ /* 9d */ 0xed8fab, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed8fac, 0xed8fad, 0xed8fae, 0xed8faf,
+ /* a5 */ 0xed8fb0, 0xed8fb1, 0xed8fb2, 0xed8fb3,
+ /* a9 */ 0xed8fb4, 0xed8fb5, 0xed8fb6, 0xed8fb7,
+ /* ad */ 0xed8fb8, 0xed8fb9, 0xed8fba, 0xed8fbb,
+ /* b1 */ 0xed8fbc, 0x000000, 0xed8fbd, 0xed8fbe,
+ /* b5 */ 0xed8fbf, 0xed9080, 0xed9081, 0xed9082,
+ /* b9 */ 0xed9083, 0xed9084, 0xed9085, 0xed9086,
+ /* bd */ 0xed9087, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed9088, 0xed9089, 0xed908a, 0xed908b,
+ /* c5 */ 0xed908c, 0xed908d, 0xed908e, 0xed908f,
+ /* c9 */ 0xed9090, 0xed9091, 0xed9092, 0xed9093,
+ /* cd */ 0xed9094, 0xed9095, 0xed9096, 0xed9097,
+ /* d1 */ 0xed9098, 0x000000, 0xed9099, 0xed909a,
+ /* d5 */ 0xed909b, 0xed909c, 0xed909d, 0xed909e,
+ /* d9 */ 0xed909f, 0xed90a0, 0xed90a1, 0xed90a2,
+ /* dd */ 0xed90a3, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed90a4, 0xed90a5, 0xed90a6, 0xed90a7,
+ /* e5 */ 0xed90a8, 0xed90a9, 0xed90aa, 0xed90ab,
+ /* e9 */ 0xed90ac, 0xed90ad, 0xed90ae, 0xed90af,
+ /* ed */ 0xed90b0, 0xed90b1, 0xed90b2, 0xed90b3,
+ /* f1 */ 0xed90b4, 0x000000, 0xed90b5, 0xed90b6,
+ /* f5 */ 0xed90b7, 0xed90b8, 0xed90b9, 0xed90ba,
+ /* f9 */ 0xed90bb, 0xed90bc, 0xed90bd, 0xed90be,
+ /* fd */ 0xed90bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x03b4b ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed9180, 0xed9181, 0xed9182, 0xed9183,
+ /* 45 */ 0xed9184, 0xed9185, 0xed9186, 0xed9187,
+ /* 49 */ 0xed9188, 0xed9189, 0xed918a, 0xed918b,
+ /* 4d */ 0xed918c, 0xed918d, 0xed918e, 0xed918f,
+ /* 51 */ 0xed9190, 0x000000, 0xed9191, 0xed9192,
+ /* 55 */ 0xed9193, 0xed9194, 0xed9195, 0xed9196,
+ /* 59 */ 0xed9197, 0xed9198, 0xed9199, 0xed919a,
+ /* 5d */ 0xed919b, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed919c, 0xed919d, 0xed919e, 0xed919f,
+ /* 65 */ 0xed91a0, 0xed91a1, 0xed91a2, 0xed91a3,
+ /* 69 */ 0xed91a4, 0xed91a5, 0xed91a6, 0xed91a7,
+ /* 6d */ 0xed91a8, 0xed91a9, 0xed91aa, 0xed91ab,
+ /* 71 */ 0xed91ac, 0x000000, 0xed91ad, 0xed91ae,
+ /* 75 */ 0xed91af, 0xed91b0, 0xed91b1, 0xed91b2,
+ /* 79 */ 0xed91b3, 0xed91b4, 0xed91b5, 0xed91b6,
+ /* 7d */ 0xed91b7, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed91b8, 0xed91b9, 0xed91ba, 0xed91bb,
+ /* 85 */ 0xed91bc, 0xed91bd, 0xed91be, 0xed91bf,
+ /* 89 */ 0xed9280, 0xed9281, 0xed9282, 0xed9283,
+ /* 8d */ 0xed9284, 0xed9285, 0xed9286, 0xed9287,
+ /* 91 */ 0xed9288, 0x000000, 0xed9289, 0xed928a,
+ /* 95 */ 0xed928b, 0xed928c, 0xed928d, 0xed928e,
+ /* 99 */ 0xed928f, 0xed9290, 0xed9291, 0xed9292,
+ /* 9d */ 0xed9293, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed9294, 0xed9295, 0xed9296, 0xed9297,
+ /* a5 */ 0xed9298, 0xed9299, 0xed929a, 0xed929b,
+ /* a9 */ 0xed929c, 0xed929d, 0xed929e, 0xed929f,
+ /* ad */ 0xed92a0, 0xed92a1, 0xed92a2, 0xed92a3,
+ /* b1 */ 0xed92a4, 0x000000, 0xed92a5, 0xed92a6,
+ /* b5 */ 0xed92a7, 0xed92a8, 0xed92a9, 0xed92aa,
+ /* b9 */ 0xed92ab, 0xed92ac, 0xed92ad, 0xed92ae,
+ /* bd */ 0xed92af, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed92b0, 0xed92b1, 0xed92b2, 0xed92b3,
+ /* c5 */ 0xed92b4, 0xed92b5, 0xed92b6, 0xed92b7,
+ /* c9 */ 0xed92b8, 0xed92b9, 0xed92ba, 0xed92bb,
+ /* cd */ 0xed92bc, 0xed92bd, 0xed92be, 0xed92bf,
+ /* d1 */ 0xed9380, 0x000000, 0xed9381, 0xed9382,
+ /* d5 */ 0xed9383, 0xed9384, 0xed9385, 0xed9386,
+ /* d9 */ 0xed9387, 0xed9388, 0xed9389, 0xed938a,
+ /* dd */ 0xed938b, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed938c, 0xed938d, 0xed938e, 0xed938f,
+ /* e5 */ 0xed9390, 0xed9391, 0xed9392, 0xed9393,
+ /* e9 */ 0xed9394, 0xed9395, 0xed9396, 0xed9397,
+ /* ed */ 0xed9398, 0xed9399, 0xed939a, 0xed939b,
+ /* f1 */ 0xed939c, 0x000000, 0xed939d, 0xed939e,
+ /* f5 */ 0xed939f, 0xed93a0, 0xed93a1, 0xed93a2,
+ /* f9 */ 0xed93a3, 0xed93a4, 0xed93a5, 0xed93a6,
+ /* fd */ 0xed93a7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cfxx - offset 0x03c18 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed93a8, 0xed93a9, 0xed93aa, 0xed93ab,
+ /* 45 */ 0xed93ac, 0xed93ad, 0xed93ae, 0xed93af,
+ /* 49 */ 0xed93b0, 0xed93b1, 0xed93b2, 0xed93b3,
+ /* 4d */ 0xed93b4, 0xed93b5, 0xed93b6, 0xed93b7,
+ /* 51 */ 0xed93b8, 0x000000, 0xed93b9, 0xed93ba,
+ /* 55 */ 0xed93bb, 0xed93bc, 0xed93bd, 0xed93be,
+ /* 59 */ 0xed93bf, 0xed9480, 0xed9481, 0xed9482,
+ /* 5d */ 0xed9483, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9484, 0xed9485, 0xed9486, 0xed9487,
+ /* 65 */ 0xed9488, 0xed9489, 0xed948a, 0xed948b,
+ /* 69 */ 0xed948c, 0xed948d, 0xed948e, 0xed948f,
+ /* 6d */ 0xed9490, 0xed9491, 0xed9492, 0xed9493,
+ /* 71 */ 0xed9494, 0x000000, 0xed9495, 0xed9496,
+ /* 75 */ 0xed9497, 0xed9498, 0xed9499, 0xed949a,
+ /* 79 */ 0xed949b, 0xed949c, 0xed949d, 0xed949e,
+ /* 7d */ 0xed949f, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed94a0, 0xed94a1, 0xed94a2, 0xed94a3,
+ /* 85 */ 0xed94a4, 0xed94a5, 0xed94a6, 0xed94a7,
+ /* 89 */ 0xed94a8, 0xed94a9, 0xed94aa, 0xed94ab,
+ /* 8d */ 0xed94ac, 0xed94ad, 0xed94ae, 0xed94af,
+ /* 91 */ 0xed94b0, 0x000000, 0xed94b1, 0xed94b2,
+ /* 95 */ 0xed94b3, 0xed94b4, 0xed94b5, 0xed94b6,
+ /* 99 */ 0xed94b7, 0xed94b8, 0xed94b9, 0xed94ba,
+ /* 9d */ 0xed94bb, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed94bc, 0xed94bd, 0xed94be, 0xed94bf,
+ /* a5 */ 0xed9580, 0xed9581, 0xed9582, 0xed9583,
+ /* a9 */ 0xed9584, 0xed9585, 0xed9586, 0xed9587,
+ /* ad */ 0xed9588, 0xed9589, 0xed958a, 0xed958b,
+ /* b1 */ 0xed958c, 0x000000, 0xed958d, 0xed958e,
+ /* b5 */ 0xed958f, 0xed9590, 0xed9591, 0xed9592,
+ /* b9 */ 0xed9593, 0xed9594, 0xed9595, 0xed9596,
+ /* bd */ 0xed9597, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x03cd6 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xe3858e, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9598, 0xed9599, 0xed959a, 0xed959b,
+ /* 65 */ 0xed959c, 0xed959d, 0xed959e, 0xed959f,
+ /* 69 */ 0xed95a0, 0xed95a1, 0xed95a2, 0xed95a3,
+ /* 6d */ 0xed95a4, 0xed95a5, 0xed95a6, 0xed95a7,
+ /* 71 */ 0xed95a8, 0x000000, 0xed95a9, 0xed95aa,
+ /* 75 */ 0xed95ab, 0xed95ac, 0xed95ad, 0xed95ae,
+ /* 79 */ 0xed95af, 0xed95b0, 0xed95b1, 0xed95b2,
+ /* 7d */ 0xed95b3, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed95b4, 0xed95b5, 0xed95b6, 0xed95b7,
+ /* 85 */ 0xed95b8, 0xed95b9, 0xed95ba, 0xed95bb,
+ /* 89 */ 0xed95bc, 0xed95bd, 0xed95be, 0xed95bf,
+ /* 8d */ 0xed9680, 0xed9681, 0xed9682, 0xed9683,
+ /* 91 */ 0xed9684, 0x000000, 0xed9685, 0xed9686,
+ /* 95 */ 0xed9687, 0xed9688, 0xed9689, 0xed968a,
+ /* 99 */ 0xed968b, 0xed968c, 0xed968d, 0xed968e,
+ /* 9d */ 0xed968f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed9690, 0xed9691, 0xed9692, 0xed9693,
+ /* a5 */ 0xed9694, 0xed9695, 0xed9696, 0xed9697,
+ /* a9 */ 0xed9698, 0xed9699, 0xed969a, 0xed969b,
+ /* ad */ 0xed969c, 0xed969d, 0xed969e, 0xed969f,
+ /* b1 */ 0xed96a0, 0x000000, 0xed96a1, 0xed96a2,
+ /* b5 */ 0xed96a3, 0xed96a4, 0xed96a5, 0xed96a6,
+ /* b9 */ 0xed96a7, 0xed96a8, 0xed96a9, 0xed96aa,
+ /* bd */ 0xed96ab, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed96ac, 0xed96ad, 0xed96ae, 0xed96af,
+ /* c5 */ 0xed96b0, 0xed96b1, 0xed96b2, 0xed96b3,
+ /* c9 */ 0xed96b4, 0xed96b5, 0xed96b6, 0xed96b7,
+ /* cd */ 0xed96b8, 0xed96b9, 0xed96ba, 0xed96bb,
+ /* d1 */ 0xed96bc, 0x000000, 0xed96bd, 0xed96be,
+ /* d5 */ 0xed96bf, 0xed9780, 0xed9781, 0xed9782,
+ /* d9 */ 0xed9783, 0xed9784, 0xed9785, 0xed9786,
+ /* dd */ 0xed9787, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed9788, 0xed9789, 0xed978a, 0xed978b,
+ /* e5 */ 0xed978c, 0xed978d, 0xed978e, 0xed978f,
+ /* e9 */ 0xed9790, 0xed9791, 0xed9792, 0xed9793,
+ /* ed */ 0xed9794, 0xed9795, 0xed9796, 0xed9797,
+ /* f1 */ 0xed9798, 0x000000, 0xed9799, 0xed979a,
+ /* f5 */ 0xed979b, 0xed979c, 0xed979d, 0xed979e,
+ /* f9 */ 0xed979f, 0xed97a0, 0xed97a1, 0xed97a2,
+ /* fd */ 0xed97a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d1xx - offset 0x03da3 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed97a4, 0xed97a5, 0xed97a6, 0xed97a7,
+ /* 45 */ 0xed97a8, 0xed97a9, 0xed97aa, 0xed97ab,
+ /* 49 */ 0xed97ac, 0xed97ad, 0xed97ae, 0xed97af,
+ /* 4d */ 0xed97b0, 0xed97b1, 0xed97b2, 0xed97b3,
+ /* 51 */ 0xed97b4, 0x000000, 0xed97b5, 0xed97b6,
+ /* 55 */ 0xed97b7, 0xed97b8, 0xed97b9, 0xed97ba,
+ /* 59 */ 0xed97bb, 0xed97bc, 0xed97bd, 0xed97be,
+ /* 5d */ 0xed97bf, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9880, 0xed9881, 0xed9882, 0xed9883,
+ /* 65 */ 0xed9884, 0xed9885, 0xed9886, 0xed9887,
+ /* 69 */ 0xed9888, 0xed9889, 0xed988a, 0xed988b,
+ /* 6d */ 0xed988c, 0xed988d, 0xed988e, 0xed988f,
+ /* 71 */ 0xed9890, 0x000000, 0xed9891, 0xed9892,
+ /* 75 */ 0xed9893, 0xed9894, 0xed9895, 0xed9896,
+ /* 79 */ 0xed9897, 0xed9898, 0xed9899, 0xed989a,
+ /* 7d */ 0xed989b, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed989c, 0xed989d, 0xed989e, 0xed989f,
+ /* 85 */ 0xed98a0, 0xed98a1, 0xed98a2, 0xed98a3,
+ /* 89 */ 0xed98a4, 0xed98a5, 0xed98a6, 0xed98a7,
+ /* 8d */ 0xed98a8, 0xed98a9, 0xed98aa, 0xed98ab,
+ /* 91 */ 0xed98ac, 0x000000, 0xed98ad, 0xed98ae,
+ /* 95 */ 0xed98af, 0xed98b0, 0xed98b1, 0xed98b2,
+ /* 99 */ 0xed98b3, 0xed98b4, 0xed98b5, 0xed98b6,
+ /* 9d */ 0xed98b7, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed98b8, 0xed98b9, 0xed98ba, 0xed98bb,
+ /* a5 */ 0xed98bc, 0xed98bd, 0xed98be, 0xed98bf,
+ /* a9 */ 0xed9980, 0xed9981, 0xed9982, 0xed9983,
+ /* ad */ 0xed9984, 0xed9985, 0xed9986, 0xed9987,
+ /* b1 */ 0xed9988, 0x000000, 0xed9989, 0xed998a,
+ /* b5 */ 0xed998b, 0xed998c, 0xed998d, 0xed998e,
+ /* b9 */ 0xed998f, 0xed9990, 0xed9991, 0xed9992,
+ /* bd */ 0xed9993, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed9994, 0xed9995, 0xed9996, 0xed9997,
+ /* c5 */ 0xed9998, 0xed9999, 0xed999a, 0xed999b,
+ /* c9 */ 0xed999c, 0xed999d, 0xed999e, 0xed999f,
+ /* cd */ 0xed99a0, 0xed99a1, 0xed99a2, 0xed99a3,
+ /* d1 */ 0xed99a4, 0x000000, 0xed99a5, 0xed99a6,
+ /* d5 */ 0xed99a7, 0xed99a8, 0xed99a9, 0xed99aa,
+ /* d9 */ 0xed99ab, 0xed99ac, 0xed99ad, 0xed99ae,
+ /* dd */ 0xed99af, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed99b0, 0xed99b1, 0xed99b2, 0xed99b3,
+ /* e5 */ 0xed99b4, 0xed99b5, 0xed99b6, 0xed99b7,
+ /* e9 */ 0xed99b8, 0xed99b9, 0xed99ba, 0xed99bb,
+ /* ed */ 0xed99bc, 0xed99bd, 0xed99be, 0xed99bf,
+ /* f1 */ 0xed9a80, 0x000000, 0xed9a81, 0xed9a82,
+ /* f5 */ 0xed9a83, 0xed9a84, 0xed9a85, 0xed9a86,
+ /* f9 */ 0xed9a87, 0xed9a88, 0xed9a89, 0xed9a8a,
+ /* fd */ 0xed9a8b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d2xx - offset 0x03e70 ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed9a8c, 0xed9a8d, 0xed9a8e, 0xed9a8f,
+ /* 45 */ 0xed9a90, 0xed9a91, 0xed9a92, 0xed9a93,
+ /* 49 */ 0xed9a94, 0xed9a95, 0xed9a96, 0xed9a97,
+ /* 4d */ 0xed9a98, 0xed9a99, 0xed9a9a, 0xed9a9b,
+ /* 51 */ 0xed9a9c, 0x000000, 0xed9a9d, 0xed9a9e,
+ /* 55 */ 0xed9a9f, 0xed9aa0, 0xed9aa1, 0xed9aa2,
+ /* 59 */ 0xed9aa3, 0xed9aa4, 0xed9aa5, 0xed9aa6,
+ /* 5d */ 0xed9aa7, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9aa8, 0xed9aa9, 0xed9aaa, 0xed9aab,
+ /* 65 */ 0xed9aac, 0xed9aad, 0xed9aae, 0xed9aaf,
+ /* 69 */ 0xed9ab0, 0xed9ab1, 0xed9ab2, 0xed9ab3,
+ /* 6d */ 0xed9ab4, 0xed9ab5, 0xed9ab6, 0xed9ab7,
+ /* 71 */ 0xed9ab8, 0x000000, 0xed9ab9, 0xed9aba,
+ /* 75 */ 0xed9abb, 0xed9abc, 0xed9abd, 0xed9abe,
+ /* 79 */ 0xed9abf, 0xed9b80, 0xed9b81, 0xed9b82,
+ /* 7d */ 0xed9b83, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9b84, 0xed9b85, 0xed9b86, 0xed9b87,
+ /* 85 */ 0xed9b88, 0xed9b89, 0xed9b8a, 0xed9b8b,
+ /* 89 */ 0xed9b8c, 0xed9b8d, 0xed9b8e, 0xed9b8f,
+ /* 8d */ 0xed9b90, 0xed9b91, 0xed9b92, 0xed9b93,
+ /* 91 */ 0xed9b94, 0x000000, 0xed9b95, 0xed9b96,
+ /* 95 */ 0xed9b97, 0xed9b98, 0xed9b99, 0xed9b9a,
+ /* 99 */ 0xed9b9b, 0xed9b9c, 0xed9b9d, 0xed9b9e,
+ /* 9d */ 0xed9b9f, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed9ba0, 0xed9ba1, 0xed9ba2, 0xed9ba3,
+ /* a5 */ 0xed9ba4, 0xed9ba5, 0xed9ba6, 0xed9ba7,
+ /* a9 */ 0xed9ba8, 0xed9ba9, 0xed9baa, 0xed9bab,
+ /* ad */ 0xed9bac, 0xed9bad, 0xed9bae, 0xed9baf,
+ /* b1 */ 0xed9bb0, 0x000000, 0xed9bb1, 0xed9bb2,
+ /* b5 */ 0xed9bb3, 0xed9bb4, 0xed9bb5, 0xed9bb6,
+ /* b9 */ 0xed9bb7, 0xed9bb8, 0xed9bb9, 0xed9bba,
+ /* bd */ 0xed9bbb, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0xed9bbc, 0xed9bbd, 0xed9bbe, 0xed9bbf,
+ /* c5 */ 0xed9c80, 0xed9c81, 0xed9c82, 0xed9c83,
+ /* c9 */ 0xed9c84, 0xed9c85, 0xed9c86, 0xed9c87,
+ /* cd */ 0xed9c88, 0xed9c89, 0xed9c8a, 0xed9c8b,
+ /* d1 */ 0xed9c8c, 0x000000, 0xed9c8d, 0xed9c8e,
+ /* d5 */ 0xed9c8f, 0xed9c90, 0xed9c91, 0xed9c92,
+ /* d9 */ 0xed9c93, 0xed9c94, 0xed9c95, 0xed9c96,
+ /* dd */ 0xed9c97, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0xed9c98, 0xed9c99, 0xed9c9a, 0xed9c9b,
+ /* e5 */ 0xed9c9c, 0xed9c9d, 0xed9c9e, 0xed9c9f,
+ /* e9 */ 0xed9ca0, 0xed9ca1, 0xed9ca2, 0xed9ca3,
+ /* ed */ 0xed9ca4, 0xed9ca5, 0xed9ca6, 0xed9ca7,
+ /* f1 */ 0xed9ca8, 0x000000, 0xed9ca9, 0xed9caa,
+ /* f5 */ 0xed9cab, 0xed9cac, 0xed9cad, 0xed9cae,
+ /* f9 */ 0xed9caf, 0xed9cb0, 0xed9cb1, 0xed9cb2,
+ /* fd */ 0xed9cb3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d3xx - offset 0x03f3d ***/
+
+ /* 31 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 35 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 39 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 41 */ 0xed9cb4, 0xed9cb5, 0xed9cb6, 0xed9cb7,
+ /* 45 */ 0xed9cb8, 0xed9cb9, 0xed9cba, 0xed9cbb,
+ /* 49 */ 0xed9cbc, 0xed9cbd, 0xed9cbe, 0xed9cbf,
+ /* 4d */ 0xed9d80, 0xed9d81, 0xed9d82, 0xed9d83,
+ /* 51 */ 0xed9d84, 0x000000, 0xed9d85, 0xed9d86,
+ /* 55 */ 0xed9d87, 0xed9d88, 0xed9d89, 0xed9d8a,
+ /* 59 */ 0xed9d8b, 0xed9d8c, 0xed9d8d, 0xed9d8e,
+ /* 5d */ 0xed9d8f, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9d90, 0xed9d91, 0xed9d92, 0xed9d93,
+ /* 65 */ 0xed9d94, 0xed9d95, 0xed9d96, 0xed9d97,
+ /* 69 */ 0xed9d98, 0xed9d99, 0xed9d9a, 0xed9d9b,
+ /* 6d */ 0xed9d9c, 0xed9d9d, 0xed9d9e, 0xed9d9f,
+ /* 71 */ 0xed9da0, 0x000000, 0xed9da1, 0xed9da2,
+ /* 75 */ 0xed9da3, 0xed9da4, 0xed9da5, 0xed9da6,
+ /* 79 */ 0xed9da7, 0xed9da8, 0xed9da9, 0xed9daa,
+ /* 7d */ 0xed9dab, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9dac, 0xed9dad, 0xed9dae, 0xed9daf,
+ /* 85 */ 0xed9db0, 0xed9db1, 0xed9db2, 0xed9db3,
+ /* 89 */ 0xed9db4, 0xed9db5, 0xed9db6, 0xed9db7,
+ /* 8d */ 0xed9db8, 0xed9db9, 0xed9dba, 0xed9dbb,
+ /* 91 */ 0xed9dbc, 0x000000, 0xed9dbd, 0xed9dbe,
+ /* 95 */ 0xed9dbf, 0xed9e80, 0xed9e81, 0xed9e82,
+ /* 99 */ 0xed9e83, 0xed9e84, 0xed9e85, 0xed9e86,
+ /* 9d */ 0xed9e87, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed9e88, 0xed9e89, 0xed9e8a, 0xed9e8b,
+ /* a5 */ 0xed9e8c, 0xed9e8d, 0xed9e8e, 0xed9e8f,
+ /* a9 */ 0xed9e90, 0xed9e91, 0xed9e92, 0xed9e93,
+ /* ad */ 0xed9e94, 0xed9e95, 0xed9e96, 0xed9e97,
+ /* b1 */ 0xed9e98, 0x000000, 0xed9e99, 0xed9e9a,
+ /* b5 */ 0xed9e9b, 0xed9e9c, 0xed9e9d, 0xed9e9e,
+ /* b9 */ 0xed9e9f, 0xed9ea0, 0xed9ea1, 0xed9ea2,
+ /* bd */ 0xed9ea3, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: d9xx - offset 0x0400b ***/
+
+ /* 31 */ 0xe38080, 0xe38081, 0xe38082, 0x00c2b7,
+ /* 35 */ 0xe280a5, 0xe280a6, 0x00c2a8, 0xe38083,
+ /* 39 */ 0x00c2ad, 0xe28095, 0xe288a5, 0xefbcbc,
+ /* 3d */ 0xe288bc, 0xe28098, 0xe28099, 0xe2809c,
+ /* 41 */ 0xe2809d, 0xe38094, 0xe38095, 0xe38088,
+ /* 45 */ 0xe38089, 0xe3808a, 0xe3808b, 0xe3808c,
+ /* 49 */ 0xe3808d, 0xe3808e, 0xe3808f, 0xe38090,
+ /* 4d */ 0xe38091, 0x00c2b1, 0x00c397, 0x00c3b7,
+ /* 51 */ 0xe289a0, 0xe289a4, 0xe289a5, 0xe2889e,
+ /* 55 */ 0xe288b4, 0x00c2b0, 0xe280b2, 0xe280b3,
+ /* 59 */ 0xe28483, 0xe284ab, 0xefbfa0, 0xefbfa1,
+ /* 5d */ 0xefbfa5, 0xe29982, 0xe29980, 0xe288a0,
+ /* 61 */ 0xe28aa5, 0xe28c92, 0xe28882, 0xe28887,
+ /* 65 */ 0xe289a1, 0xe28992, 0x00c2a7, 0xe280bb,
+ /* 69 */ 0xe29886, 0xe29885, 0xe2978b, 0xe2978f,
+ /* 6d */ 0xe2978e, 0xe29787, 0xe29786, 0xe296a1,
+ /* 71 */ 0xe296a0, 0xe296b3, 0xe296b2, 0xe296bd,
+ /* 75 */ 0xe296bc, 0xe28692, 0xe28690, 0xe28691,
+ /* 79 */ 0xe28693, 0xe28694, 0xe38093, 0xe289aa,
+ /* 7d */ 0xe289ab, 0xe2889a, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe288bd, 0xe2889d, 0xe288b5, 0xe288ab,
+ /* 95 */ 0xe288ac, 0xe28888, 0xe2888b, 0xe28a86,
+ /* 99 */ 0xe28a87, 0xe28a82, 0xe28a83, 0xe288aa,
+ /* 9d */ 0xe288a9, 0xe288a7, 0xe288a8, 0xefbfa2,
+ /* a1 */ 0xe28792, 0xe28794, 0xe28880, 0xe28883,
+ /* a5 */ 0x00c2b4, 0xefbd9e, 0x00cb87, 0x00cb98,
+ /* a9 */ 0x00cb9d, 0x00cb9a, 0x00cb99, 0x00c2b8,
+ /* ad */ 0x00cb9b, 0x00c2a1, 0x00c2bf, 0x00cb90,
+ /* b1 */ 0xe288ae, 0xe28891, 0xe2888f, 0x00c2a4,
+ /* b5 */ 0xe28489, 0xe280b0, 0xe29781, 0xe29780,
+ /* b9 */ 0xe296b7, 0xe296b6, 0xe299a4, 0xe299a0,
+ /* bd */ 0xe299a1, 0xe299a5, 0xe299a7, 0xe299a3,
+ /* c1 */ 0xe28a99, 0xe29788, 0xe296a3, 0xe29790,
+ /* c5 */ 0xe29791, 0xe29692, 0xe296a4, 0xe296a5,
+ /* c9 */ 0xe296a8, 0xe296a7, 0xe296a6, 0xe296a9,
+ /* cd */ 0xe299a8, 0xe2988f, 0xe2988e, 0xe2989c,
+ /* d1 */ 0xe2989e, 0x00c2b6, 0xe280a0, 0xe280a1,
+ /* d5 */ 0xe28695, 0xe28697, 0xe28699, 0xe28696,
+ /* d9 */ 0xe28698, 0xe299ad, 0xe299a9, 0xe299aa,
+ /* dd */ 0xe299ac, 0xe389bf, 0xe3889c, 0xe28496,
+ /* e1 */ 0xe38f87, 0xe284a2, 0xe38f82, 0xe38f98,
+ /* e5 */ 0xe284a1, 0xe282ac, 0x00c2ae, 0xe389be,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: daxx - offset 0x040d9 ***/
+
+ /* 31 */ 0xefbc81, 0xefbc82, 0xefbc83, 0xefbc84,
+ /* 35 */ 0xefbc85, 0xefbc86, 0xefbc87, 0xefbc88,
+ /* 39 */ 0xefbc89, 0xefbc8a, 0xefbc8b, 0xefbc8c,
+ /* 3d */ 0xefbc8d, 0xefbc8e, 0xefbc8f, 0xefbc90,
+ /* 41 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* 45 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* 49 */ 0xefbc99, 0xefbc9a, 0xefbc9b, 0xefbc9c,
+ /* 4d */ 0xefbc9d, 0xefbc9e, 0xefbc9f, 0xefbca0,
+ /* 51 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* 55 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* 59 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* 5d */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* 61 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* 65 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* 69 */ 0xefbcb9, 0xefbcba, 0xefbcbb, 0xefbfa6,
+ /* 6d */ 0xefbcbd, 0xefbcbe, 0xefbcbf, 0xefbd80,
+ /* 71 */ 0xefbd81, 0xefbd82, 0xefbd83, 0xefbd84,
+ /* 75 */ 0xefbd85, 0xefbd86, 0xefbd87, 0xefbd88,
+ /* 79 */ 0xefbd89, 0xefbd8a, 0xefbd8b, 0xefbd8c,
+ /* 7d */ 0xefbd8d, 0xefbd8e, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xefbd8f, 0xefbd90, 0xefbd91, 0xefbd92,
+ /* 95 */ 0xefbd93, 0xefbd94, 0xefbd95, 0xefbd96,
+ /* 99 */ 0xefbd97, 0xefbd98, 0xefbd99, 0xefbd9a,
+ /* 9d */ 0xefbd9b, 0xefbd9c, 0xefbd9d, 0xefbfa3,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0xe385a4,
+ /* d5 */ 0xe385a5, 0xe385a6, 0xe385a7, 0xe385a8,
+ /* d9 */ 0xe385a9, 0xe385aa, 0xe385ab, 0xe385ac,
+ /* dd */ 0xe385ad, 0xe385ae, 0xe385af, 0xe385b0,
+ /* e1 */ 0xe385b1, 0xe385b2, 0xe385b3, 0xe385b4,
+ /* e5 */ 0xe385b5, 0xe385b6, 0xe385b7, 0xe385b8,
+ /* e9 */ 0xe385b9, 0xe385ba, 0xe385bb, 0xe385bc,
+ /* ed */ 0xe385bd, 0xe385be, 0xe385bf, 0xe38680,
+ /* f1 */ 0xe38681, 0xe38682, 0xe38683, 0xe38684,
+ /* f5 */ 0xe38685, 0xe38686, 0xe38687, 0xe38688,
+ /* f9 */ 0xe38689, 0xe3868a, 0xe3868b, 0xe3868c,
+ /* fd */ 0xe3868d, 0xe3868e,
+
+ /*** Two byte table, leaf: dbxx - offset 0x041a7 ***/
+
+ /* 31 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* 35 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* 39 */ 0xe285b8, 0xe285b9, 0x000000, 0x000000,
+ /* 3d */ 0x000000, 0x000000, 0x000000, 0xe285a0,
+ /* 41 */ 0xe285a1, 0xe285a2, 0xe285a3, 0xe285a4,
+ /* 45 */ 0xe285a5, 0xe285a6, 0xe285a7, 0xe285a8,
+ /* 49 */ 0xe285a9, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* 55 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* 59 */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* 5d */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* 61 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* 65 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* 75 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* 79 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* 7d */ 0x00cebd, 0x00cebe, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x00cebf, 0x00cf80, 0x00cf81, 0x00cf83,
+ /* 95 */ 0x00cf84, 0x00cf85, 0x00cf86, 0x00cf87,
+ /* 99 */ 0x00cf88, 0x00cf89, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* a5 */ 0xe29498, 0xe29494, 0xe2949c, 0xe294ac,
+ /* a9 */ 0xe294a4, 0xe294b4, 0xe294bc, 0xe29481,
+ /* ad */ 0xe29483, 0xe2948f, 0xe29493, 0xe2949b,
+ /* b1 */ 0xe29497, 0xe294a3, 0xe294b3, 0xe294ab,
+ /* b5 */ 0xe294bb, 0xe2958b, 0xe294a0, 0xe294af,
+ /* b9 */ 0xe294a8, 0xe294b7, 0xe294bf, 0xe2949d,
+ /* bd */ 0xe294b0, 0xe294a5, 0xe294b8, 0xe29582,
+ /* c1 */ 0xe29492, 0xe29491, 0xe2949a, 0xe29499,
+ /* c5 */ 0xe29496, 0xe29495, 0xe2948e, 0xe2948d,
+ /* c9 */ 0xe2949e, 0xe2949f, 0xe294a1, 0xe294a2,
+ /* cd */ 0xe294a6, 0xe294a7, 0xe294a9, 0xe294aa,
+ /* d1 */ 0xe294ad, 0xe294ae, 0xe294b1, 0xe294b2,
+ /* d5 */ 0xe294b5, 0xe294b6, 0xe294b9, 0xe294ba,
+ /* d9 */ 0xe294bd, 0xe294be, 0xe29580, 0xe29581,
+ /* dd */ 0xe29583, 0xe29584, 0xe29585, 0xe29586,
+ /* e1 */ 0xe29587, 0xe29588, 0xe29589, 0xe2958a,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: dcxx - offset 0x04275 ***/
+
+ /* 31 */ 0xe38e95, 0xe38e96, 0xe38e97, 0xe28493,
+ /* 35 */ 0xe38e98, 0xe38f84, 0xe38ea3, 0xe38ea4,
+ /* 39 */ 0xe38ea5, 0xe38ea6, 0xe38e99, 0xe38e9a,
+ /* 3d */ 0xe38e9b, 0xe38e9c, 0xe38e9d, 0xe38e9e,
+ /* 41 */ 0xe38e9f, 0xe38ea0, 0xe38ea1, 0xe38ea2,
+ /* 45 */ 0xe38f8a, 0xe38e8d, 0xe38e8e, 0xe38e8f,
+ /* 49 */ 0xe38f8f, 0xe38e88, 0xe38e89, 0xe38f88,
+ /* 4d */ 0xe38ea7, 0xe38ea8, 0xe38eb0, 0xe38eb1,
+ /* 51 */ 0xe38eb2, 0xe38eb3, 0xe38eb4, 0xe38eb5,
+ /* 55 */ 0xe38eb6, 0xe38eb7, 0xe38eb8, 0xe38eb9,
+ /* 59 */ 0xe38e80, 0xe38e81, 0xe38e82, 0xe38e83,
+ /* 5d */ 0xe38e84, 0xe38eba, 0xe38ebb, 0xe38ebc,
+ /* 61 */ 0xe38ebd, 0xe38ebe, 0xe38ebf, 0xe38e90,
+ /* 65 */ 0xe38e91, 0xe38e92, 0xe38e93, 0xe38e94,
+ /* 69 */ 0xe284a6, 0xe38f80, 0xe38f81, 0xe38e8a,
+ /* 6d */ 0xe38e8b, 0xe38e8c, 0xe38f96, 0xe38f85,
+ /* 71 */ 0xe38ead, 0xe38eae, 0xe38eaf, 0xe38f9b,
+ /* 75 */ 0xe38ea9, 0xe38eaa, 0xe38eab, 0xe38eac,
+ /* 79 */ 0xe38f9d, 0xe38f90, 0xe38f93, 0xe38f83,
+ /* 7d */ 0xe38f89, 0xe38f9c, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe38f86, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x00c386, 0x00c390, 0x00c2aa, 0x00c4a6,
+ /* a5 */ 0x000000, 0x00c4b2, 0x000000, 0x00c4bf,
+ /* a9 */ 0x00c581, 0x00c398, 0x00c592, 0x00c2ba,
+ /* ad */ 0x00c39e, 0x00c5a6, 0x00c58a, 0x000000,
+ /* b1 */ 0xe389a0, 0xe389a1, 0xe389a2, 0xe389a3,
+ /* b5 */ 0xe389a4, 0xe389a5, 0xe389a6, 0xe389a7,
+ /* b9 */ 0xe389a8, 0xe389a9, 0xe389aa, 0xe389ab,
+ /* bd */ 0xe389ac, 0xe389ad, 0xe389ae, 0xe389af,
+ /* c1 */ 0xe389b0, 0xe389b1, 0xe389b2, 0xe389b3,
+ /* c5 */ 0xe389b4, 0xe389b5, 0xe389b6, 0xe389b7,
+ /* c9 */ 0xe389b8, 0xe389b9, 0xe389ba, 0xe389bb,
+ /* cd */ 0xe29390, 0xe29391, 0xe29392, 0xe29393,
+ /* d1 */ 0xe29394, 0xe29395, 0xe29396, 0xe29397,
+ /* d5 */ 0xe29398, 0xe29399, 0xe2939a, 0xe2939b,
+ /* d9 */ 0xe2939c, 0xe2939d, 0xe2939e, 0xe2939f,
+ /* dd */ 0xe293a0, 0xe293a1, 0xe293a2, 0xe293a3,
+ /* e1 */ 0xe293a4, 0xe293a5, 0xe293a6, 0xe293a7,
+ /* e5 */ 0xe293a8, 0xe293a9, 0xe291a0, 0xe291a1,
+ /* e9 */ 0xe291a2, 0xe291a3, 0xe291a4, 0xe291a5,
+ /* ed */ 0xe291a6, 0xe291a7, 0xe291a8, 0xe291a9,
+ /* f1 */ 0xe291aa, 0xe291ab, 0xe291ac, 0xe291ad,
+ /* f5 */ 0xe291ae, 0x00c2bd, 0xe28593, 0xe28594,
+ /* f9 */ 0x00c2bc, 0x00c2be, 0xe2859b, 0xe2859c,
+ /* fd */ 0xe2859d, 0xe2859e,
+
+ /*** Two byte table, leaf: ddxx - offset 0x04343 ***/
+
+ /* 31 */ 0x00c3a6, 0x00c491, 0x00c3b0, 0x00c4a7,
+ /* 35 */ 0x00c4b1, 0x00c4b3, 0x00c4b8, 0x00c580,
+ /* 39 */ 0x00c582, 0x00c3b8, 0x00c593, 0x00c39f,
+ /* 3d */ 0x00c3be, 0x00c5a7, 0x00c58b, 0x00c589,
+ /* 41 */ 0xe38880, 0xe38881, 0xe38882, 0xe38883,
+ /* 45 */ 0xe38884, 0xe38885, 0xe38886, 0xe38887,
+ /* 49 */ 0xe38888, 0xe38889, 0xe3888a, 0xe3888b,
+ /* 4d */ 0xe3888c, 0xe3888d, 0xe3888e, 0xe3888f,
+ /* 51 */ 0xe38890, 0xe38891, 0xe38892, 0xe38893,
+ /* 55 */ 0xe38894, 0xe38895, 0xe38896, 0xe38897,
+ /* 59 */ 0xe38898, 0xe38899, 0xe3889a, 0xe3889b,
+ /* 5d */ 0xe2929c, 0xe2929d, 0xe2929e, 0xe2929f,
+ /* 61 */ 0xe292a0, 0xe292a1, 0xe292a2, 0xe292a3,
+ /* 65 */ 0xe292a4, 0xe292a5, 0xe292a6, 0xe292a7,
+ /* 69 */ 0xe292a8, 0xe292a9, 0xe292aa, 0xe292ab,
+ /* 6d */ 0xe292ac, 0xe292ad, 0xe292ae, 0xe292af,
+ /* 71 */ 0xe292b0, 0xe292b1, 0xe292b2, 0xe292b3,
+ /* 75 */ 0xe292b4, 0xe292b5, 0xe291b4, 0xe291b5,
+ /* 79 */ 0xe291b6, 0xe291b7, 0xe291b8, 0xe291b9,
+ /* 7d */ 0xe291ba, 0xe291bb, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe291bc, 0xe291bd, 0xe291be, 0xe291bf,
+ /* 95 */ 0xe29280, 0xe29281, 0xe29282, 0x00c2b9,
+ /* 99 */ 0x00c2b2, 0x00c2b3, 0xe281b4, 0xe281bf,
+ /* 9d */ 0xe28281, 0xe28282, 0xe28283, 0xe28284,
+ /* a1 */ 0xe38181, 0xe38182, 0xe38183, 0xe38184,
+ /* a5 */ 0xe38185, 0xe38186, 0xe38187, 0xe38188,
+ /* a9 */ 0xe38189, 0xe3818a, 0xe3818b, 0xe3818c,
+ /* ad */ 0xe3818d, 0xe3818e, 0xe3818f, 0xe38190,
+ /* b1 */ 0xe38191, 0xe38192, 0xe38193, 0xe38194,
+ /* b5 */ 0xe38195, 0xe38196, 0xe38197, 0xe38198,
+ /* b9 */ 0xe38199, 0xe3819a, 0xe3819b, 0xe3819c,
+ /* bd */ 0xe3819d, 0xe3819e, 0xe3819f, 0xe381a0,
+ /* c1 */ 0xe381a1, 0xe381a2, 0xe381a3, 0xe381a4,
+ /* c5 */ 0xe381a5, 0xe381a6, 0xe381a7, 0xe381a8,
+ /* c9 */ 0xe381a9, 0xe381aa, 0xe381ab, 0xe381ac,
+ /* cd */ 0xe381ad, 0xe381ae, 0xe381af, 0xe381b0,
+ /* d1 */ 0xe381b1, 0xe381b2, 0xe381b3, 0xe381b4,
+ /* d5 */ 0xe381b5, 0xe381b6, 0xe381b7, 0xe381b8,
+ /* d9 */ 0xe381b9, 0xe381ba, 0xe381bb, 0xe381bc,
+ /* dd */ 0xe381bd, 0xe381be, 0xe381bf, 0xe38280,
+ /* e1 */ 0xe38281, 0xe38282, 0xe38283, 0xe38284,
+ /* e5 */ 0xe38285, 0xe38286, 0xe38287, 0xe38288,
+ /* e9 */ 0xe38289, 0xe3828a, 0xe3828b, 0xe3828c,
+ /* ed */ 0xe3828d, 0xe3828e, 0xe3828f, 0xe38290,
+ /* f1 */ 0xe38291, 0xe38292, 0xe38293, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: dexx - offset 0x04411 ***/
+
+ /* 31 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* 35 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* 39 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* 3d */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* 41 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* 45 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* 49 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* 4d */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* 51 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* 55 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* 59 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* 5d */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* 61 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* 65 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* 69 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* 6d */ 0xe3839d, 0xe3839e, 0xe3839f, 0xe383a0,
+ /* 71 */ 0xe383a1, 0xe383a2, 0xe383a3, 0xe383a4,
+ /* 75 */ 0xe383a5, 0xe383a6, 0xe383a7, 0xe383a8,
+ /* 79 */ 0xe383a9, 0xe383aa, 0xe383ab, 0xe383ac,
+ /* 7d */ 0xe383ad, 0xe383ae, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe383af, 0xe383b0, 0xe383b1, 0xe383b2,
+ /* 95 */ 0xe383b3, 0xe383b4, 0xe383b5, 0xe383b6,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* a5 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* a9 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* ad */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* b1 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* b5 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* b9 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* bd */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* c1 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d5 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d9 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* dd */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* e1 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* e5 */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e9 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* ed */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* f1 */ 0x00d18f, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: e0xx - offset 0x044df ***/
+
+ /* 31 */ 0xe4bcbd, 0xe4bdb3, 0xe58187, 0xe583b9,
+ /* 35 */ 0xe58aa0, 0xe58faf, 0xe591b5, 0xe593a5,
+ /* 39 */ 0xe59889, 0xe5ab81, 0xe5aeb6, 0xe69a87,
+ /* 3d */ 0xe69eb6, 0xe69eb7, 0xe69faf, 0xe6ad8c,
+ /* 41 */ 0xe78f82, 0xe79782, 0xe7a8bc, 0xe88b9b,
+ /* 45 */ 0xe88c84, 0xe8a197, 0xe8a288, 0xe8a8b6,
+ /* 49 */ 0xe8b388, 0xe8b78f, 0xe8bbbb, 0xe8bfa6,
+ /* 4d */ 0xe9a795, 0xe588bb, 0xe58db4, 0xe59084,
+ /* 51 */ 0xe681aa, 0xe685a4, 0xe6aebc, 0xe78f8f,
+ /* 55 */ 0xe8849a, 0xe8a6ba, 0xe8a792, 0xe996a3,
+ /* 59 */ 0xe4be83, 0xe5888a, 0xe5a2be, 0xe5a5b8,
+ /* 5d */ 0xe5a7a6, 0xe5b9b2, 0xe5b9b9, 0xe68787,
+ /* 61 */ 0xe68f80, 0xe69d86, 0xe69fac, 0xe6a1bf,
+ /* 65 */ 0xe6be97, 0xe7998e, 0xe79c8b, 0xe7a3b5,
+ /* 69 */ 0xe7a888, 0xe7abbf, 0xe7b0a1, 0xe8829d,
+ /* 6d */ 0xe889ae, 0xe889b1, 0xe8abab, 0xe99693,
+ /* 71 */ 0xe4b9ab, 0xe5969d, 0xe69bb7, 0xe6b8b4,
+ /* 75 */ 0xe7a2a3, 0xe7abad, 0xe8919b, 0xe8a490,
+ /* 79 */ 0xe89d8e, 0xe99ea8, 0xe58b98, 0xe59d8e,
+ /* 7d */ 0xe5a0aa, 0xe5b58c, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe6849f, 0xe686be, 0xe688a1, 0xe695a2,
+ /* 95 */ 0xe69f91, 0xe6a984, 0xe6b89b, 0xe79498,
+ /* 99 */ 0xe796b3, 0xe79ba3, 0xe79eb0, 0xe7b4ba,
+ /* 9d */ 0xe982af, 0xe99191, 0xe99192, 0xe9be95,
+ /* a1 */ 0xe58ca3, 0xe5b2ac, 0xe794b2, 0xe8839b,
+ /* a5 */ 0xe98980, 0xe99698, 0xe5899b, 0xe5a088,
+ /* a9 */ 0xe5a79c, 0xe5b2a1, 0xe5b497, 0xe5bab7,
+ /* ad */ 0xe5bcba, 0xe5bd8a, 0xe685b7, 0xe6b19f,
+ /* b1 */ 0xe795ba, 0xe79686, 0xe7b3a0, 0xe7b5b3,
+ /* b5 */ 0xe7b6b1, 0xe7be8c, 0xe88594, 0xe888a1,
+ /* b9 */ 0xe89691, 0xe8a581, 0xe8ac9b, 0xe98bbc,
+ /* bd */ 0xe9998d, 0xe9b187, 0xe4bb8b, 0xe4bbb7,
+ /* c1 */ 0xe5808b, 0xe587b1, 0xe5a18f, 0xe684b7,
+ /* c5 */ 0xe684be, 0xe685a8, 0xe694b9, 0xe6a7aa,
+ /* c9 */ 0xe6bc91, 0xe796a5, 0xe79a86, 0xe79b96,
+ /* cd */ 0xe7ae87, 0xe88aa5, 0xe8938b, 0xefa480,
+ /* d1 */ 0xe98ea7, 0xe9968b, 0xe59680, 0xe5aea2,
+ /* d5 */ 0xe59d91, 0xefa481, 0xe7b2b3, 0xe7beb9,
+ /* d9 */ 0xe986b5, 0xe580a8, 0xe58ebb, 0xe5b185,
+ /* dd */ 0xe5b7a8, 0xe68b92, 0xe68dae, 0xe6939a,
+ /* e1 */ 0xe693a7, 0xe6b8a0, 0xe782ac, 0xe7a59b,
+ /* e5 */ 0xe8b79d, 0xe8b89e, 0xefa482, 0xe981bd,
+ /* e9 */ 0xe98985, 0xe98bb8, 0xe4b9be, 0xe4bbb6,
+ /* ed */ 0xe581a5, 0xe5b7be, 0xe5bbba, 0xe68486,
+ /* f1 */ 0xe6a597, 0xe885b1, 0xe89994, 0xe8b987,
+ /* f5 */ 0xe98db5, 0xe9a8ab, 0xe4b99e, 0xe58291,
+ /* f9 */ 0xe69db0, 0xe6a180, 0xe58489, 0xe58a8d,
+ /* fd */ 0xe58a92, 0xe6aaa2,
+
+ /*** Two byte table, leaf: e1xx - offset 0x045ad ***/
+
+ /* 31 */ 0xe79ebc, 0xe98890, 0xe9bb94, 0xe58aab,
+ /* 35 */ 0xe680af, 0xe8bfb2, 0xe58188, 0xe686a9,
+ /* 39 */ 0xe68fad, 0xe6938a, 0xe6a0bc, 0xe6aa84,
+ /* 3d */ 0xe6bf80, 0xe88688, 0xe8a6a1, 0xe99a94,
+ /* 41 */ 0xe5a085, 0xe789bd, 0xe78aac, 0xe79484,
+ /* 45 */ 0xe7b5b9, 0xe7b9ad, 0xe882a9, 0xe8a68b,
+ /* 49 */ 0xe8adb4, 0xe981a3, 0xe9b591, 0xe68a89,
+ /* 4d */ 0xe6b1ba, 0xe6bd94, 0xe7b590, 0xe7bcba,
+ /* 51 */ 0xe8a8a3, 0xe585bc, 0xe6858a, 0xe7ae9d,
+ /* 55 */ 0xe8ac99, 0xe98997, 0xe98e8c, 0xe4baac,
+ /* 59 */ 0xe4bf93, 0xe5809e, 0xe582be, 0xe58486,
+ /* 5d */ 0xe58b81, 0xe58b8d, 0xe58dbf, 0xe59db0,
+ /* 61 */ 0xe5a283, 0xe5ba9a, 0xe5be91, 0xe685b6,
+ /* 65 */ 0xe686ac, 0xe6938e, 0xe695ac, 0xe699af,
+ /* 69 */ 0xe69abb, 0xe69bb4, 0xe6a297, 0xe6b687,
+ /* 6d */ 0xe78285, 0xe783b1, 0xe7929f, 0xe792a5,
+ /* 71 */ 0xe7938a, 0xe79799, 0xe7a1ac, 0xe7a3ac,
+ /* 75 */ 0xe7ab9f, 0xe7abb6, 0xe7b585, 0xe7b693,
+ /* 79 */ 0xe88095, 0xe880bf, 0xe8849b, 0xe88e96,
+ /* 7d */ 0xe8ada6, 0xe8bc95, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe98095, 0xe98fa1, 0xe9a083, 0xe9a0b8,
+ /* 95 */ 0xe9a99a, 0xe9afa8, 0xe4bf82, 0xe59593,
+ /* 99 */ 0xe5a0ba, 0xe5a591, 0xe5ada3, 0xe5b186,
+ /* 9d */ 0xe682b8, 0xe68892, 0xe6a182, 0xe6a2b0,
+ /* a1 */ 0xe6a3a8, 0xe6baaa, 0xe7958c, 0xe799b8,
+ /* a5 */ 0xe7a38e, 0xe7a8bd, 0xe7b3bb, 0xe7b9ab,
+ /* a9 */ 0xe7b9bc, 0xe8a888, 0xe8aaa1, 0xe8b0bf,
+ /* ad */ 0xe99a8e, 0xe9b784, 0xe58fa4, 0xe58fa9,
+ /* b1 */ 0xe5918a, 0xe591b1, 0xe59bba, 0xe5a791,
+ /* b5 */ 0xe5ada4, 0xe5b0bb, 0xe5baab, 0xe68bb7,
+ /* b9 */ 0xe694b7, 0xe69585, 0xe695b2, 0xe69aa0,
+ /* bd */ 0xe69eaf, 0xe6a781, 0xe6b2bd, 0xe797bc,
+ /* c1 */ 0xe79a90, 0xe79dbe, 0xe7a8bf, 0xe7be94,
+ /* c5 */ 0xe88083, 0xe882a1, 0xe8868f, 0xe88ba6,
+ /* c9 */ 0xe88bbd, 0xe88fb0, 0xe89781, 0xe8a0b1,
+ /* cd */ 0xe8a2b4, 0xe8aaa5, 0xefa483, 0xe8be9c,
+ /* d1 */ 0xe98cae, 0xe99b87, 0xe9a1a7, 0xe9ab98,
+ /* d5 */ 0xe9bc93, 0xe593ad, 0xe6969b, 0xe69bb2,
+ /* d9 */ 0xe6a28f, 0xe7a980, 0xe8b0b7, 0xe9b5a0,
+ /* dd */ 0xe59bb0, 0xe59da4, 0xe5b491, 0xe69886,
+ /* e1 */ 0xe6a2b1, 0xe6a38d, 0xe6bbbe, 0xe790a8,
+ /* e5 */ 0xe8a29e, 0xe9afa4, 0xe6b1a8, 0xefa484,
+ /* e9 */ 0xe9aaa8, 0xe4be9b, 0xe585ac, 0xe585b1,
+ /* ed */ 0xe58a9f, 0xe5ad94, 0xe5b7a5, 0xe68190,
+ /* f1 */ 0xe681ad, 0xe68bb1, 0xe68ea7, 0xe694bb,
+ /* f5 */ 0xe78f99, 0xe7a9ba, 0xe89aa3, 0xe8b2a2,
+ /* f9 */ 0xe99e8f, 0xe4b8b2, 0xe5afa1, 0xe68888,
+ /* fd */ 0xe69e9c, 0xe7939c,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0467b ***/
+
+ /* 31 */ 0xe7a791, 0xe88f93, 0xe8aa87, 0xe8aab2,
+ /* 35 */ 0xe8b7a8, 0xe9818e, 0xe98d8b, 0xe9a186,
+ /* 39 */ 0xe5bb93, 0xe6a7a8, 0xe897bf, 0xe983ad,
+ /* 3d */ 0xefa485, 0xe586a0, 0xe5ae98, 0xe5afac,
+ /* 41 */ 0xe685a3, 0xe6a3ba, 0xe6acbe, 0xe7818c,
+ /* 45 */ 0xe790af, 0xe79398, 0xe7aea1, 0xe7bd90,
+ /* 49 */ 0xe88f85, 0xe8a780, 0xe8b2ab, 0xe9979c,
+ /* 4d */ 0xe9a4a8, 0xe588ae, 0xe6819d, 0xe68bac,
+ /* 51 */ 0xe98082, 0xe4be8a, 0xe58589, 0xe58ca1,
+ /* 55 */ 0xe5a399, 0xe5bba3, 0xe69ba0, 0xe6b4b8,
+ /* 59 */ 0xe7829a, 0xe78b82, 0xe78f96, 0xe7ad90,
+ /* 5d */ 0xe883b1, 0xe9919b, 0xe58da6, 0xe68e9b,
+ /* 61 */ 0xe7bdab, 0xe4b996, 0xe58280, 0xe5a18a,
+ /* 65 */ 0xe5a39e, 0xe680aa, 0xe684a7, 0xe68b90,
+ /* 69 */ 0xe6a790, 0xe9ad81, 0xe5ae8f, 0xe7b498,
+ /* 6d */ 0xe882b1, 0xe8bd9f, 0xe4baa4, 0xe58391,
+ /* 71 */ 0xe592ac, 0xe596ac, 0xe5ac8c, 0xe5b6a0,
+ /* 75 */ 0xe5b7a7, 0xe694aa, 0xe6958e, 0xe6a0a1,
+ /* 79 */ 0xe6a98b, 0xe78ba1, 0xe79a8e, 0xe79faf,
+ /* 7d */ 0xe7b59e, 0xe7bfb9, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe886a0, 0xe8958e, 0xe89b9f, 0xe8bc83,
+ /* 95 */ 0xe8bd8e, 0xe9838a, 0xe9a483, 0xe9a995,
+ /* 99 */ 0xe9aeab, 0xe4b898, 0xe4b985, 0xe4b99d,
+ /* 9d */ 0xe4bb87, 0xe4bfb1, 0xe585b7, 0xe58bbe,
+ /* a1 */ 0xe58d80, 0xe58fa3, 0xe58fa5, 0xe5928e,
+ /* a5 */ 0xe59894, 0xe59db5, 0xe59ea2, 0xe5af87,
+ /* a9 */ 0xe5b687, 0xe5bb90, 0xe687bc, 0xe68b98,
+ /* ad */ 0xe69591, 0xe69eb8, 0xe69fa9, 0xe6a78b,
+ /* b1 */ 0xe6ad90, 0xe6af86, 0xe6afac, 0xe6b182,
+ /* b5 */ 0xe6ba9d, 0xe781b8, 0xe78b97, 0xe78e96,
+ /* b9 */ 0xe79083, 0xe79ebf, 0xe79fa9, 0xe7a9b6,
+ /* bd */ 0xe7b5bf, 0xe88089, 0xe887bc, 0xe88885,
+ /* c1 */ 0xe8888a, 0xe88b9f, 0xe8a1a2, 0xe8acb3,
+ /* c5 */ 0xe8b3bc, 0xe8bb80, 0xe98091, 0xe982b1,
+ /* c9 */ 0xe989a4, 0xe98ab6, 0xe9a792, 0xe9a985,
+ /* cd */ 0xe9b3a9, 0xe9b797, 0xe9be9c, 0xe59c8b,
+ /* d1 */ 0xe5b180, 0xe88f8a, 0xe99ea0, 0xe99eab,
+ /* d5 */ 0xe9bab4, 0xe5909b, 0xe7aa98, 0xe7bea4,
+ /* d9 */ 0xe8a399, 0xe8bb8d, 0xe983a1, 0xe5a080,
+ /* dd */ 0xe5b188, 0xe68e98, 0xe7aa9f, 0xe5aeae,
+ /* e1 */ 0xe5bc93, 0xe7a9b9, 0xe7aaae, 0xe88a8e,
+ /* e5 */ 0xe8baac, 0xe580a6, 0xe588b8, 0xe58bb8,
+ /* e9 */ 0xe58db7, 0xe59c88, 0xe68bb3, 0xe68db2,
+ /* ed */ 0xe6ac8a, 0xe6b783, 0xe79cb7, 0xe58ea5,
+ /* f1 */ 0xe78d97, 0xe895a8, 0xe8b9b6, 0xe99795,
+ /* f5 */ 0xe69cba, 0xe6ab83, 0xe6bdb0, 0xe8a9ad,
+ /* f9 */ 0xe8bb8c, 0xe9a58b, 0xefa486, 0xe699b7,
+ /* fd */ 0xe6adb8, 0xe8b2b4,
+
+ /*** Two byte table, leaf: e3xx - offset 0x04749 ***/
+
+ /* 31 */ 0xe9acbc, 0xefa487, 0xe58fab, 0xe59cad,
+ /* 35 */ 0xe5a58e, 0xe68f86, 0xe6a7bb, 0xe78faa,
+ /* 39 */ 0xe7a185, 0xe7aaba, 0xe7ab85, 0xe7b3be,
+ /* 3d */ 0xe891b5, 0xe8a68f, 0xe8b5b3, 0xe980b5,
+ /* 41 */ 0xe996a8, 0xe58bbb, 0xe59d87, 0xe79587,
+ /* 45 */ 0xe7ada0, 0xe88f8c, 0xe9889e, 0xefa488,
+ /* 49 */ 0xe6a998, 0xe5858b, 0xe5898b, 0xe58a87,
+ /* 4d */ 0xe6889f, 0xe6a398, 0xe6a5b5, 0xe99a99,
+ /* 51 */ 0xe58385, 0xe58aa4, 0xe58ba4, 0xe68783,
+ /* 55 */ 0xe696a4, 0xe6a0b9, 0xe6a7bf, 0xe791be,
+ /* 59 */ 0xe7ad8b, 0xe88ab9, 0xe88fab, 0xe8a6b2,
+ /* 5d */ 0xe8acb9, 0xe8bf91, 0xe9a589, 0xefa489,
+ /* 61 */ 0xe4bb8a, 0xe5a697, 0xe69392, 0xe69891,
+ /* 65 */ 0xe6aa8e, 0xe790b4, 0xe7a681, 0xe7a6bd,
+ /* 69 */ 0xe88aa9, 0xe8a1be, 0xe8a1bf, 0xe8a59f,
+ /* 6d */ 0xefa48a, 0xe98ca6, 0xe4bc8b, 0xe58f8a,
+ /* 71 */ 0xe680a5, 0xe689b1, 0xe6b1b2, 0xe7b49a,
+ /* 75 */ 0xe7b5a6, 0xe4ba98, 0xe585a2, 0xe79f9c,
+ /* 79 */ 0xe882af, 0xe4bc81, 0xe4bc8e, 0xe585b6,
+ /* 7d */ 0xe58680, 0xe5979c, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe599a8, 0xe59cbb, 0xe59fba, 0xe59fbc,
+ /* 95 */ 0xe5a494, 0xe5a587, 0xe5a693, 0xe5af84,
+ /* 99 */ 0xe5b290, 0xe5b48e, 0xe5b7b1, 0xe5b9be,
+ /* 9d */ 0xe5bf8c, 0xe68a80, 0xe69797, 0xe697a3,
+ /* a1 */ 0xe69c9e, 0xe69c9f, 0xe69d9e, 0xe6a38b,
+ /* a5 */ 0xe6a384, 0xe6a99f, 0xe6acba, 0xe6b0a3,
+ /* a9 */ 0xe6b1bd, 0xe6b282, 0xe6b787, 0xe78e98,
+ /* ad */ 0xe790a6, 0xe790aa, 0xe79282, 0xe792a3,
+ /* b1 */ 0xe795b8, 0xe795bf, 0xe7a281, 0xe7a3af,
+ /* b5 */ 0xe7a581, 0xe7a587, 0xe7a588, 0xe7a5ba,
+ /* b9 */ 0xe7ae95, 0xe7b480, 0xe7b6ba, 0xe7be88,
+ /* bd */ 0xe88086, 0xe880ad, 0xe8828c, 0xe8a898,
+ /* c1 */ 0xe8ad8f, 0xe8b188, 0xe8b5b7, 0xe98ca1,
+ /* c5 */ 0xe98ca4, 0xe9a3a2, 0xe9a591, 0xe9a88e,
+ /* c9 */ 0xe9a88f, 0xe9a9a5, 0xe9ba92, 0xe7b78a,
+ /* cd */ 0xe4bdb6, 0xe59089, 0xe68bae, 0xe6a194,
+ /* d1 */ 0xe98791, 0xe596ab, 0xe584ba, 0xefa48b,
+ /* d5 */ 0xefa48c, 0xe5a89c, 0xe687a6, 0xefa48d,
+ /* d9 */ 0xe68b8f, 0xe68bbf, 0xefa48e, 0xefa48f,
+ /* dd */ 0xefa490, 0xefa491, 0xefa492, 0xefa493,
+ /* e1 */ 0xe982a3, 0xefa494, 0xefa495, 0xefa496,
+ /* e5 */ 0xefa497, 0xefa498, 0xe8abbe, 0xefa499,
+ /* e9 */ 0xefa49a, 0xefa49b, 0xefa49c, 0xe69a96,
+ /* ed */ 0xefa49d, 0xe78596, 0xefa49e, 0xefa49f,
+ /* f1 */ 0xe99ba3, 0xefa4a0, 0xe68d8f, 0xe68dba,
+ /* f5 */ 0xe58d97, 0xefa4a1, 0xe69e8f, 0xe6a5a0,
+ /* f9 */ 0xe6b9b3, 0xefa4a2, 0xe794b7, 0xefa4a3,
+ /* fd */ 0xefa4a4, 0xefa4a5,
+
+ /*** Two byte table, leaf: e4xx - offset 0x04817 ***/
+
+ /* 31 */ 0xe7b48d, 0xefa4a6, 0xefa4a7, 0xe8a1b2,
+ /* 35 */ 0xe59b8a, 0xe5a898, 0xefa4a8, 0xefa4a9,
+ /* 39 */ 0xefa4aa, 0xefa4ab, 0xefa4ac, 0xe4b983,
+ /* 3d */ 0xefa4ad, 0xe585a7, 0xe5a588, 0xe69fb0,
+ /* 41 */ 0xe88090, 0xefa4ae, 0xe5a5b3, 0xe5b9b4,
+ /* 45 */ 0xe6929a, 0xe7a78a, 0xe5bfb5, 0xe681ac,
+ /* 49 */ 0xe68b88, 0xe68dbb, 0xe5afa7, 0xe5af97,
+ /* 4d */ 0xe58aaa, 0xefa4af, 0xe5a5b4, 0xe5bca9,
+ /* 51 */ 0xe68092, 0xefa4b0, 0xefa4b1, 0xefa4b2,
+ /* 55 */ 0xe79199, 0xefa4b3, 0xefa4b4, 0xefa4b5,
+ /* 59 */ 0xefa4b6, 0xefa4b7, 0xefa4b8, 0xe9a791,
+ /* 5d */ 0xefa4b9, 0xefa4ba, 0xefa4bb, 0xefa4bc,
+ /* 61 */ 0xefa4bd, 0xefa4be, 0xefa4bf, 0xefa580,
+ /* 65 */ 0xefa581, 0xefa582, 0xefa583, 0xe6bf83,
+ /* 69 */ 0xefa584, 0xefa585, 0xe886bf, 0xe8beb2,
+ /* 6d */ 0xe683b1, 0xefa586, 0xefa587, 0xe885a6,
+ /* 71 */ 0xefa588, 0xefa589, 0xe5b0bf, 0xefa58a,
+ /* 75 */ 0xefa58b, 0xefa58c, 0xefa58d, 0xefa58e,
+ /* 79 */ 0xefa58f, 0xefa590, 0xefa591, 0xe5aba9,
+ /* 7d */ 0xe8a8a5, 0xe69dbb, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe7b490, 0xefa592, 0xefa593, 0xefa594,
+ /* 95 */ 0xefa595, 0xefa596, 0xefa597, 0xe883bd,
+ /* 99 */ 0xefa598, 0xefa599, 0xe5b0bc, 0xe6b3a5,
+ /* 9d */ 0xe58cbf, 0xe6baba, 0xe5a49a, 0xe88cb6,
+ /* a1 */ 0xe4b8b9, 0xe4bab6, 0xe4bd86, 0xe596ae,
+ /* a5 */ 0xe59c98, 0xe5a387, 0xe5bd96, 0xe696b7,
+ /* a9 */ 0xe697a6, 0xe6aa80, 0xe6aeb5, 0xe6b98d,
+ /* ad */ 0xe79fad, 0xe7abaf, 0xe7b09e, 0xe7b79e,
+ /* b1 */ 0xe89b8b, 0xe8a292, 0xe984b2, 0xe98d9b,
+ /* b5 */ 0xe692bb, 0xe6bebe, 0xe78dba, 0xe796b8,
+ /* b9 */ 0xe98194, 0xe59596, 0xe59d8d, 0xe686ba,
+ /* bd */ 0xe69394, 0xe69b87, 0xe6b7a1, 0xe6b99b,
+ /* c1 */ 0xe6bdad, 0xe6beb9, 0xe797b0, 0xe88183,
+ /* c5 */ 0xe886bd, 0xe89581, 0xe8a683, 0xe8ab87,
+ /* c9 */ 0xe8ad9a, 0xe98c9f, 0xe6b293, 0xe79593,
+ /* cd */ 0xe7ad94, 0xe8b88f, 0xe9819d, 0xe59490,
+ /* d1 */ 0xe5a082, 0xe5a198, 0xe5b9a2, 0xe68887,
+ /* d5 */ 0xe6929e, 0xe6a3a0, 0xe795b6, 0xe7b396,
+ /* d9 */ 0xe89eb3, 0xe9bba8, 0xe4bba3, 0xe59e88,
+ /* dd */ 0xe59dae, 0xe5a4a7, 0xe5b08d, 0xe5b2b1,
+ /* e1 */ 0xe5b8b6, 0xe5be85, 0xe688b4, 0xe693a1,
+ /* e5 */ 0xe78eb3, 0xe887ba, 0xe8a28b, 0xe8b2b8,
+ /* e9 */ 0xe99a8a, 0xe9bb9b, 0xe5ae85, 0xe5beb7,
+ /* ed */ 0xe682b3, 0xe58092, 0xe58880, 0xe588b0,
+ /* f1 */ 0xe59c96, 0xe5a0b5, 0xe5a197, 0xe5b08e,
+ /* f5 */ 0xe5b1a0, 0xe5b3b6, 0xe5b68b, 0xe5baa6,
+ /* f9 */ 0xe5be92, 0xe682bc, 0xe68c91, 0xe68e89,
+ /* fd */ 0xe69097, 0xe6a183,
+
+ /*** Two byte table, leaf: e5xx - offset 0x048e5 ***/
+
+ /* 31 */ 0xe6a3b9, 0xe6ab82, 0xe6b798, 0xe6b8a1,
+ /* 35 */ 0xe6bb94, 0xe6bfa4, 0xe787be, 0xe79b9c,
+ /* 39 */ 0xe79db9, 0xe7a6b1, 0xe7a8bb, 0xe89084,
+ /* 3d */ 0xe8a6a9, 0xe8b3ad, 0xe8b7b3, 0xe8b988,
+ /* 41 */ 0xe98083, 0xe98094, 0xe98193, 0xe983bd,
+ /* 45 */ 0xe98d8d, 0xe999b6, 0xe99f9c, 0xe6af92,
+ /* 49 */ 0xe78086, 0xe78998, 0xe78aa2, 0xe78da8,
+ /* 4d */ 0xe79da3, 0xe7a6bf, 0xe7afa4, 0xe7ba9b,
+ /* 51 */ 0xe8ae80, 0xe5a2a9, 0xe68387, 0xe695a6,
+ /* 55 */ 0xe697bd, 0xe69abe, 0xe6b28c, 0xe7849e,
+ /* 59 */ 0xe78789, 0xe8b19a, 0xe9a093, 0xe4b9ad,
+ /* 5d */ 0xe7aa81, 0xe4bb9d, 0xe586ac, 0xe5878d,
+ /* 61 */ 0xe58b95, 0xe5908c, 0xe686a7, 0xe69db1,
+ /* 65 */ 0xe6a190, 0xe6a39f, 0xe6b49e, 0xe6bdbc,
+ /* 69 */ 0xe796bc, 0xe79eb3, 0xe7aba5, 0xe883b4,
+ /* 6d */ 0xe891a3, 0xe98a85, 0xe5859c, 0xe69697,
+ /* 71 */ 0xe69d9c, 0xe69e93, 0xe79798, 0xe7ab87,
+ /* 75 */ 0xe88db3, 0xefa59a, 0xe8b186, 0xe98097,
+ /* 79 */ 0xe9a0ad, 0xe5b1af, 0xe88780, 0xe88a9a,
+ /* 7d */ 0xe98181, 0xe981af, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe9888d, 0xe5be97, 0xe5b69d, 0xe6a999,
+ /* 95 */ 0xe78788, 0xe799bb, 0xe7ad89, 0xe897a4,
+ /* 99 */ 0xe8ac84, 0xe984a7, 0xe9a8b0, 0xe59687,
+ /* 9d */ 0xe687b6, 0xefa59b, 0xe799a9, 0xe7be85,
+ /* a1 */ 0xe898bf, 0xe89eba, 0xe8a3b8, 0xe9828f,
+ /* a5 */ 0xefa59c, 0xe6b49b, 0xe78399, 0xe78f9e,
+ /* a9 */ 0xe7b5a1, 0xe890bd, 0xefa59d, 0xe985aa,
+ /* ad */ 0xe9a7b1, 0xefa59e, 0xe4ba82, 0xe58db5,
+ /* b1 */ 0xe6ac84, 0xe6ac92, 0xe780be, 0xe7889b,
+ /* b5 */ 0xe898ad, 0xe9b89e, 0xe5898c, 0xe8bea3,
+ /* b9 */ 0xe5b590, 0xe693a5, 0xe694ac, 0xe6ac96,
+ /* bd */ 0xe6bfab, 0xe7b183, 0xe7ba9c, 0xe8978d,
+ /* c1 */ 0xe8a5a4, 0xe8a6bd, 0xe68b89, 0xe88798,
+ /* c5 */ 0xe8a09f, 0xe5bb8a, 0xe69c97, 0xe6b5aa,
+ /* c9 */ 0xe78bbc, 0xe79085, 0xe791af, 0xe89e82,
+ /* cd */ 0xe9839e, 0xe4be86, 0xe5b48d, 0xe5bea0,
+ /* d1 */ 0xe8908a, 0xe586b7, 0xe68ea0, 0xe795a5,
+ /* d5 */ 0xe4baae, 0xe58086, 0xe585a9, 0xe58789,
+ /* d9 */ 0xe6a281, 0xe6a891, 0xe7b2ae, 0xe7b2b1,
+ /* dd */ 0xe7b3a7, 0xe889af, 0xe8ab92, 0xe8bc9b,
+ /* e1 */ 0xe9878f, 0xe4beb6, 0xe584b7, 0xe58bb5,
+ /* e5 */ 0xe59182, 0xe5bbac, 0xe685ae, 0xe688be,
+ /* e9 */ 0xe69785, 0xe6ab9a, 0xe6bfbe, 0xe7a4aa,
+ /* ed */ 0xe8979c, 0xe8a0a3, 0xe996ad, 0xe9a9a2,
+ /* f1 */ 0xe9a9aa, 0xe9ba97, 0xe9bb8e, 0xe58a9b,
+ /* f5 */ 0xe69b86, 0xe6adb7, 0xe7809d, 0xe7a4ab,
+ /* f9 */ 0xe8bda2, 0xe99d82, 0xe68690, 0xe68880,
+ /* fd */ 0xe694a3, 0xe6bca3,
+
+ /*** Two byte table, leaf: e6xx - offset 0x049b3 ***/
+
+ /* 31 */ 0xe78589, 0xe79289, 0xe7b7b4, 0xe881af,
+ /* 35 */ 0xe893ae, 0xe8bca6, 0xe980a3, 0xe98d8a,
+ /* 39 */ 0xe586bd, 0xe58897, 0xe58aa3, 0xe6b48c,
+ /* 3d */ 0xe78388, 0xe8a382, 0xe5bb89, 0xe69682,
+ /* 41 */ 0xe6aeae, 0xe6bf82, 0xe7b0be, 0xe78db5,
+ /* 45 */ 0xe4bba4, 0xe4bcb6, 0xe59bb9, 0xefa59f,
+ /* 49 */ 0xe5b2ba, 0xe5b6ba, 0xe6809c, 0xe78eb2,
+ /* 4d */ 0xe7acad, 0xe7be9a, 0xe7bf8e, 0xe88186,
+ /* 51 */ 0xe9809e, 0xe988b4, 0xe99bb6, 0xe99d88,
+ /* 55 */ 0xe9a098, 0xe9bda1, 0xe4be8b, 0xe6bea7,
+ /* 59 */ 0xe7a6ae, 0xe986b4, 0xe99ab7, 0xe58b9e,
+ /* 5d */ 0xefa5a0, 0xe69288, 0xe69384, 0xe6ab93,
+ /* 61 */ 0xe6bd9e, 0xe78098, 0xe78890, 0xe79ba7,
+ /* 65 */ 0xe88081, 0xe89886, 0xe8999c, 0xe8b7af,
+ /* 69 */ 0xe8bc85, 0xe99cb2, 0xe9adaf, 0xe9b7ba,
+ /* 6d */ 0xe9b9b5, 0xe7a28c, 0xe7a5bf, 0xe7b6a0,
+ /* 71 */ 0xe88f89, 0xe98c84, 0xe9b9bf, 0xe9ba93,
+ /* 75 */ 0xe8ab96, 0xe5a39f, 0xe5bc84, 0xe69ca7,
+ /* 79 */ 0xe780a7, 0xe7938f, 0xe7b1a0, 0xe881be,
+ /* 7d */ 0xe584a1, 0xe780a8, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe789a2, 0xe7a38a, 0xe8b382, 0xe8b39a,
+ /* 95 */ 0xe8b3b4, 0xe99bb7, 0xe4ba86, 0xe5839a,
+ /* 99 */ 0xe5afae, 0xe5bb96, 0xe69699, 0xe7878e,
+ /* 9d */ 0xe79982, 0xe79ead, 0xe8818a, 0xe893bc,
+ /* a1 */ 0xe981bc, 0xe9aca7, 0xe9be8d, 0xe5a398,
+ /* a5 */ 0xe5a981, 0xe5b1a2, 0xe6a893, 0xe6b79a,
+ /* a9 */ 0xe6bc8f, 0xe798bb, 0xe7b4af, 0xe7b8b7,
+ /* ad */ 0xe8949e, 0xe8a4b8, 0xe98fa4, 0xe9998b,
+ /* b1 */ 0xe58a89, 0xe69792, 0xe69fb3, 0xe6a6b4,
+ /* b5 */ 0xe6b581, 0xe6ba9c, 0xe7808f, 0xe79089,
+ /* b9 */ 0xe791a0, 0xe79599, 0xe798a4, 0xe7a1ab,
+ /* bd */ 0xe8acac, 0xe9a19e, 0xe585ad, 0xe688ae,
+ /* c1 */ 0xe999b8, 0xe4be96, 0xe580ab, 0xe5b499,
+ /* c5 */ 0xe6b7aa, 0xe7b6b8, 0xe8bcaa, 0xe5be8b,
+ /* c9 */ 0xe68584, 0xe6a097, 0xefa5a1, 0xe99a86,
+ /* cd */ 0xe58b92, 0xe8828b, 0xe5879c, 0xe5878c,
+ /* d1 */ 0xe6a59e, 0xe7a89c, 0xe7b6be, 0xe88fb1,
+ /* d5 */ 0xe999b5, 0xe4bf9a, 0xe588a9, 0xe58e98,
+ /* d9 */ 0xe5908f, 0xe5948e, 0xe5b1a5, 0xe682a7,
+ /* dd */ 0xe69d8e, 0xe6a2a8, 0xe6b5ac, 0xe78a81,
+ /* e1 */ 0xe78bb8, 0xe79086, 0xe79283, 0xefa5a2,
+ /* e5 */ 0xe797a2, 0xe7b1ac, 0xe7bdb9, 0xe7beb8,
+ /* e9 */ 0xe88e89, 0xe8a38f, 0xe8a3a1, 0xe9878c,
+ /* ed */ 0xe98790, 0xe99ba2, 0xe9af89, 0xe5909d,
+ /* f1 */ 0xe6bdbe, 0xe78790, 0xe79298, 0xe897ba,
+ /* f5 */ 0xe8baaa, 0xe99aa3, 0xe9b197, 0xe9ba9f,
+ /* f9 */ 0xe69e97, 0xe6b78b, 0xe790b3, 0xe887a8,
+ /* fd */ 0xe99c96, 0xe7a0ac,
+
+ /*** Two byte table, leaf: e7xx - offset 0x04a81 ***/
+
+ /* 31 */ 0xe7ab8b, 0xe7aca0, 0xe7b292, 0xe691a9,
+ /* 35 */ 0xe791aa, 0xe797b2, 0xe7a2bc, 0xe7a3a8,
+ /* 39 */ 0xe9a6ac, 0xe9ad94, 0xe9babb, 0xe5af9e,
+ /* 3d */ 0xe5b995, 0xe6bca0, 0xe8869c, 0xe88eab,
+ /* 41 */ 0xe98288, 0xe4b887, 0xe58d8d, 0xe5a8a9,
+ /* 45 */ 0xe5b792, 0xe5bd8e, 0xe685a2, 0xe68cbd,
+ /* 49 */ 0xe699a9, 0xe69bbc, 0xe6bbbf, 0xe6bcab,
+ /* 4d */ 0xe781a3, 0xe79e9e, 0xe890ac, 0xe89493,
+ /* 51 */ 0xe8a0bb, 0xe8bc93, 0xe9a585, 0xe9b0bb,
+ /* 55 */ 0xe5949c, 0xe68ab9, 0xe69cab, 0xe6b2ab,
+ /* 59 */ 0xe88c89, 0xe8a5aa, 0xe99dba, 0xe4baa1,
+ /* 5d */ 0xe5a684, 0xe5bf98, 0xe5bf99, 0xe69c9b,
+ /* 61 */ 0xe7b6b2, 0xe7bd94, 0xe88a92, 0xe88cab,
+ /* 65 */ 0xe88ebd, 0xe8bc9e, 0xe98299, 0xe59f8b,
+ /* 69 */ 0xe5a6b9, 0xe5aa92, 0xe5af90, 0xe698a7,
+ /* 6d */ 0xe69e9a, 0xe6a285, 0xe6af8f, 0xe785a4,
+ /* 71 */ 0xe7bdb5, 0xe8b2b7, 0xe8b3a3, 0xe98281,
+ /* 75 */ 0xe9ad85, 0xe88488, 0xe8b28a, 0xe9998c,
+ /* 79 */ 0xe9a980, 0xe9baa5, 0xe5ad9f, 0xe6b093,
+ /* 7d */ 0xe78c9b, 0xe79bb2, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe79b9f, 0xe8908c, 0xe586aa, 0xe8a693,
+ /* 95 */ 0xe5858d, 0xe58695, 0xe58b89, 0xe6a389,
+ /* 99 */ 0xe6b294, 0xe79c84, 0xe79ca0, 0xe7b6bf,
+ /* 9d */ 0xe7b7ac, 0xe99da2, 0xe9bab5, 0xe6bb85,
+ /* a1 */ 0xe89491, 0xe586a5, 0xe5908d, 0xe591bd,
+ /* a5 */ 0xe6988e, 0xe69a9d, 0xe6a4a7, 0xe6ba9f,
+ /* a9 */ 0xe79abf, 0xe79e91, 0xe88c97, 0xe89382,
+ /* ad */ 0xe89e9f, 0xe985a9, 0xe98a98, 0xe9b3b4,
+ /* b1 */ 0xe8a282, 0xe4beae, 0xe58692, 0xe58b9f,
+ /* b5 */ 0xe5a786, 0xe5b8bd, 0xe68595, 0xe691b8,
+ /* b9 */ 0xe691b9, 0xe69aae, 0xe69f90, 0xe6a8a1,
+ /* bd */ 0xe6af8d, 0xe6af9b, 0xe7899f, 0xe789a1,
+ /* c1 */ 0xe79181, 0xe79cb8, 0xe79f9b, 0xe88097,
+ /* c5 */ 0xe88abc, 0xe88c85, 0xe8ac80, 0xe8aca8,
+ /* c9 */ 0xe8b28c, 0xe69ca8, 0xe6b290, 0xe789a7,
+ /* cd */ 0xe79bae, 0xe79da6, 0xe7a986, 0xe9b6a9,
+ /* d1 */ 0xe6adbf, 0xe6b292, 0xe5a4a2, 0xe69ca6,
+ /* d5 */ 0xe89299, 0xe58daf, 0xe5a293, 0xe5a699,
+ /* d9 */ 0xe5bb9f, 0xe68f8f, 0xe698b4, 0xe69db3,
+ /* dd */ 0xe6b8ba, 0xe78cab, 0xe7ab97, 0xe88b97,
+ /* e1 */ 0xe98ca8, 0xe58b99, 0xe5b7ab, 0xe686ae,
+ /* e5 */ 0xe6878b, 0xe6888a, 0xe68b87, 0xe692ab,
+ /* e9 */ 0xe697a0, 0xe6a599, 0xe6ada6, 0xe6af8b,
+ /* ed */ 0xe784a1, 0xe78fb7, 0xe7959d, 0xe7b986,
+ /* f1 */ 0xe8889e, 0xe88c82, 0xe895aa, 0xe8aaa3,
+ /* f5 */ 0xe8b2bf, 0xe99ca7, 0xe9b5a1, 0xe5a2a8,
+ /* f9 */ 0xe9bb98, 0xe58091, 0xe5888e, 0xe590bb,
+ /* fd */ 0xe5958f, 0xe69687,
+
+ /*** Two byte table, leaf: e8xx - offset 0x04b4f ***/
+
+ /* 31 */ 0xe6b1b6, 0xe7b48a, 0xe7b48b, 0xe8819e,
+ /* 35 */ 0xe89a8a, 0xe99680, 0xe99baf, 0xe58bbf,
+ /* 39 */ 0xe6b295, 0xe789a9, 0xe591b3, 0xe5aa9a,
+ /* 3d */ 0xe5b0be, 0xe5b58b, 0xe5bd8c, 0xe5beae,
+ /* 41 */ 0xe69caa, 0xe6a2b6, 0xe6a5a3, 0xe6b8bc,
+ /* 45 */ 0xe6b984, 0xe79c89, 0xe7b1b3, 0xe7be8e,
+ /* 49 */ 0xe89687, 0xe8ac8e, 0xe8bfb7, 0xe99da1,
+ /* 4d */ 0xe9bbb4, 0xe5b2b7, 0xe682b6, 0xe6848d,
+ /* 51 */ 0xe686ab, 0xe6958f, 0xe697bb, 0xe697bc,
+ /* 55 */ 0xe6b091, 0xe6b3af, 0xe78e9f, 0xe78f89,
+ /* 59 */ 0xe7b7a1, 0xe99694, 0xe5af86, 0xe89c9c,
+ /* 5d */ 0xe8ac90, 0xe5899d, 0xe58d9a, 0xe68b8d,
+ /* 61 */ 0xe6908f, 0xe692b2, 0xe69cb4, 0xe6a8b8,
+ /* 65 */ 0xe6b38a, 0xe78f80, 0xe7929e, 0xe7ae94,
+ /* 69 */ 0xe7b295, 0xe7b89b, 0xe8868a, 0xe888b6,
+ /* 6d */ 0xe89684, 0xe8bfab, 0xe99bb9, 0xe9a781,
+ /* 71 */ 0xe4bcb4, 0xe58d8a, 0xe58f8d, 0xe58f9b,
+ /* 75 */ 0xe68b8c, 0xe690ac, 0xe69480, 0xe69691,
+ /* 79 */ 0xe6a783, 0xe6b3ae, 0xe6bd98, 0xe78fad,
+ /* 7d */ 0xe79594, 0xe798a2, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe79ba4, 0xe79bbc, 0xe7a390, 0xe7a3bb,
+ /* 95 */ 0xe7a4ac, 0xe7b586, 0xe888ac, 0xe89fa0,
+ /* 99 */ 0xe8bf94, 0xe9a092, 0xe9a3af, 0xe58b83,
+ /* 9d */ 0xe68b94, 0xe692a5, 0xe6b8a4, 0xe6bd91,
+ /* a1 */ 0xe799bc, 0xe8b78b, 0xe986b1, 0xe989a2,
+ /* a5 */ 0xe9abae, 0xe9ad83, 0xe580a3, 0xe5828d,
+ /* a9 */ 0xe59d8a, 0xe5a6a8, 0xe5b0a8, 0xe5b987,
+ /* ad */ 0xe5bdb7, 0xe688bf, 0xe694be, 0xe696b9,
+ /* b1 */ 0xe69781, 0xe69889, 0xe69e8b, 0xe6a69c,
+ /* b5 */ 0xe6bb82, 0xe7a385, 0xe7b4a1, 0xe882aa,
+ /* b9 */ 0xe88680, 0xe888ab, 0xe88ab3, 0xe892a1,
+ /* bd */ 0xe89a8c, 0xe8a8aa, 0xe8ac97, 0xe982a6,
+ /* c1 */ 0xe998b2, 0xe9be90, 0xe5808d, 0xe4bfb3,
+ /* c5 */ 0xefa5a3, 0xe59fb9, 0xe5be98, 0xe68b9c,
+ /* c9 */ 0xe68e92, 0xe69daf, 0xe6b983, 0xe78499,
+ /* cd */ 0xe79b83, 0xe8838c, 0xe8839a, 0xe8a3b4,
+ /* d1 */ 0xe8a3b5, 0xe8a499, 0xe8b3a0, 0xe8bca9,
+ /* d5 */ 0xe9858d, 0xe999aa, 0xe4bcaf, 0xe4bdb0,
+ /* d9 */ 0xe5b89b, 0xe69f8f, 0xe6a0a2, 0xe799bd,
+ /* dd */ 0xe799be, 0xe9ad84, 0xe5b9a1, 0xe6a88a,
+ /* e1 */ 0xe785a9, 0xe78794, 0xe795aa, 0xefa5a4,
+ /* e5 */ 0xe7b981, 0xe89583, 0xe897a9, 0xe9a39c,
+ /* e9 */ 0xe4bc90, 0xe7ad8f, 0xe7bdb0, 0xe996a5,
+ /* ed */ 0xe587a1, 0xe5b886, 0xe6a2b5, 0xe6b0be,
+ /* f1 */ 0xe6b18e, 0xe6b39b, 0xe78aaf, 0xe7af84,
+ /* f5 */ 0xe88c83, 0xe6b395, 0xe790ba, 0xe583bb,
+ /* f9 */ 0xe58a88, 0xe5a381, 0xe69398, 0xe6aa97,
+ /* fd */ 0xe792a7, 0xe79996,
+
+ /*** Two byte table, leaf: e9xx - offset 0x04c1d ***/
+
+ /* 31 */ 0xe7a2a7, 0xe89897, 0xe997a2, 0xe99cb9,
+ /* 35 */ 0xefa5a5, 0xe58d9e, 0xe5bc81, 0xe8ae8a,
+ /* 39 */ 0xe8bea8, 0xe8beaf, 0xe9828a, 0xe588a5,
+ /* 3d */ 0xe79ea5, 0xe9b189, 0xe9bc88, 0xe4b899,
+ /* 41 */ 0xe58082, 0xe585b5, 0xe5b19b, 0xe5b9b7,
+ /* 45 */ 0xe6989e, 0xe698ba, 0xe69f84, 0xe6a385,
+ /* 49 */ 0xe782b3, 0xe79481, 0xe79785, 0xe7a789,
+ /* 4d */ 0xe7ab9d, 0xe8bca7, 0xe9a4a0, 0xe9a888,
+ /* 51 */ 0xe4bf9d, 0xe5a0a1, 0xe5a0b1, 0xe5afb6,
+ /* 55 */ 0xe699ae, 0xe6ada5, 0xe6b491, 0xe6b9ba,
+ /* 59 */ 0xe6bdbd, 0xe78fa4, 0xe794ab, 0xe88fa9,
+ /* 5d */ 0xe8a39c, 0xe8a493, 0xe8ad9c, 0xe8bc94,
+ /* 61 */ 0xe4bc8f, 0xe58395, 0xe58c90, 0xe58d9c,
+ /* 65 */ 0xe5ae93, 0xe5bea9, 0xe69c8d, 0xe7a68f,
+ /* 69 */ 0xe885b9, 0xe88caf, 0xe89494, 0xe8a487,
+ /* 6d */ 0xe8a686, 0xe8bcb9, 0xe8bcbb, 0xe9a6a5,
+ /* 71 */ 0xe9b092, 0xe69cac, 0xe4b9b6, 0xe4bfb8,
+ /* 75 */ 0xe5a589, 0xe5b081, 0xe5b3af, 0xe5b3b0,
+ /* 79 */ 0xe68da7, 0xe6a392, 0xe783bd, 0xe786a2,
+ /* 7d */ 0xe790ab, 0xe7b8ab, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe893ac, 0xe89c82, 0xe980a2, 0xe98b92,
+ /* 95 */ 0xe9b3b3, 0xe4b88d, 0xe4bb98, 0xe4bfaf,
+ /* 99 */ 0xe58285, 0xe58996, 0xe589af, 0xe590a6,
+ /* 9d */ 0xe59290, 0xe59fa0, 0xe5a4ab, 0xe5a9a6,
+ /* a1 */ 0xe5ad9a, 0xe5adb5, 0xe5af8c, 0xe5ba9c,
+ /* a5 */ 0xefa5a6, 0xe689b6, 0xe695b7, 0xe696a7,
+ /* a9 */ 0xe6b5ae, 0xe6baa5, 0xe788b6, 0xe7aca6,
+ /* ad */ 0xe7b0bf, 0xe7bcb6, 0xe88590, 0xe88591,
+ /* b1 */ 0xe8869a, 0xe88980, 0xe88a99, 0xe88ea9,
+ /* b5 */ 0xe8a883, 0xe8b2a0, 0xe8b3a6, 0xe8b3bb,
+ /* b9 */ 0xe8b5b4, 0xe8b6ba, 0xe983a8, 0xe9879c,
+ /* bd */ 0xe9989c, 0xe99984, 0xe9a799, 0xe9b3a7,
+ /* c1 */ 0xe58c97, 0xe58886, 0xe590a9, 0xe599b4,
+ /* c5 */ 0xe5a2b3, 0xe5a594, 0xe5a5ae, 0xe5bfbf,
+ /* c9 */ 0xe686a4, 0xe689ae, 0xe69890, 0xe6b1be,
+ /* cd */ 0xe7849a, 0xe79b86, 0xe7b289, 0xe7b39e,
+ /* d1 */ 0xe7b49b, 0xe88aac, 0xe8b381, 0xe99bb0,
+ /* d5 */ 0xefa5a7, 0xe4bd9b, 0xe5bc97, 0xe5bdbf,
+ /* d9 */ 0xe68b82, 0xe5b4a9, 0xe69c8b, 0xe6a39a,
+ /* dd */ 0xe7a1bc, 0xe7b983, 0xe9b5ac, 0xe4b895,
+ /* e1 */ 0xe58299, 0xe58c95, 0xe58caa, 0xe58d91,
+ /* e5 */ 0xe5a683, 0xe5a9a2, 0xe5ba87, 0xe682b2,
+ /* e9 */ 0xe6868a, 0xe68989, 0xe689b9, 0xe69690,
+ /* ed */ 0xe69e87, 0xe6a6a7, 0xe6af94, 0xe6af96,
+ /* f1 */ 0xe6af97, 0xe6af98, 0xe6b2b8, 0xefa5a8,
+ /* f5 */ 0xe790b5, 0xe797ba, 0xe7a092, 0xe7a291,
+ /* f9 */ 0xe7a795, 0xe7a798, 0xe7b283, 0xe7b78b,
+ /* fd */ 0xe7bfa1, 0xe882a5,
+
+ /*** Two byte table, leaf: eaxx - offset 0x04ceb ***/
+
+ /* 31 */ 0xe884be, 0xe88782, 0xe88fb2, 0xe89c9a,
+ /* 35 */ 0xe8a3a8, 0xe8aab9, 0xe8adac, 0xe8b2bb,
+ /* 39 */ 0xe98499, 0xe99d9e, 0xe9a39b, 0xe9bcbb,
+ /* 3d */ 0xe59aac, 0xe5acaa, 0xe5bdac, 0xe6968c,
+ /* 41 */ 0xe6aab3, 0xe6aeaf, 0xe6b59c, 0xe6bfb1,
+ /* 45 */ 0xe78095, 0xe7899d, 0xe78ead, 0xe8b2a7,
+ /* 49 */ 0xe8b393, 0xe9a0bb, 0xe68691, 0xe6b0b7,
+ /* 4d */ 0xe88198, 0xe9a881, 0xe4b98d, 0xe4ba8b,
+ /* 51 */ 0xe4ba9b, 0xe4bb95, 0xe4bcba, 0xe4bcbc,
+ /* 55 */ 0xe4bdbf, 0xe4bf9f, 0xe583bf, 0xe58fb2,
+ /* 59 */ 0xe58fb8, 0xe59486, 0xe597a3, 0xe59b9b,
+ /* 5d */ 0xe5a3ab, 0xe5a5a2, 0xe5a891, 0xe5afab,
+ /* 61 */ 0xe5afba, 0xe5b084, 0xe5b7b3, 0xe5b8ab,
+ /* 65 */ 0xe5be99, 0xe6809d, 0xe68da8, 0xe6969c,
+ /* 69 */ 0xe696af, 0xe69fb6, 0xe69fbb, 0xe6a2ad,
+ /* 6d */ 0xe6adbb, 0xe6b299, 0xe6b397, 0xe6b8a3,
+ /* 71 */ 0xe78089, 0xe78d85, 0xe7a082, 0xe7a4be,
+ /* 75 */ 0xe7a580, 0xe7a5a0, 0xe7a781, 0xe7afa9,
+ /* 79 */ 0xe7b497, 0xe7b5b2, 0xe88286, 0xe8888d,
+ /* 7d */ 0xe88e8e, 0xe89391, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe89b87, 0xe8a39f, 0xe8a990, 0xe8a99e,
+ /* 95 */ 0xe8ac9d, 0xe8b39c, 0xe8b5a6, 0xe8bead,
+ /* 99 */ 0xe982aa, 0xe9a3bc, 0xe9a79f, 0xe9ba9d,
+ /* 9d */ 0xe5898a, 0xefa5a9, 0xe69c94, 0xefa5aa,
+ /* a1 */ 0xe58298, 0xe588aa, 0xe5b1b1, 0xe695a3,
+ /* a5 */ 0xe6b195, 0xe78f8a, 0xe794a3, 0xe7969d,
+ /* a9 */ 0xe7ae97, 0xe8929c, 0xe985b8, 0xe99cb0,
+ /* ad */ 0xe4b9b7, 0xe69292, 0xe6aeba, 0xe7859e,
+ /* b1 */ 0xe896a9, 0xe4b889, 0xefa5ab, 0xe69d89,
+ /* b5 */ 0xe6a3ae, 0xe6b897, 0xe88a9f, 0xe89498,
+ /* b9 */ 0xe8a1ab, 0xe68fb7, 0xe6be81, 0xe98892,
+ /* bd */ 0xe9a2af, 0xe4b88a, 0xe582b7, 0xe5838f,
+ /* c1 */ 0xe5849f, 0xe59586, 0xe596aa, 0xe59897,
+ /* c5 */ 0xe5ad80, 0xe5b099, 0xe5b3a0, 0xe5b8b8,
+ /* c9 */ 0xe5ba8a, 0xe5baa0, 0xe5bb82, 0xe683b3,
+ /* cd */ 0xe6a191, 0xe6a9a1, 0xe6b998, 0xe788bd,
+ /* d1 */ 0xe78980, 0xe78b80, 0xe79bb8, 0xe7a5a5,
+ /* d5 */ 0xe7aeb1, 0xe7bf94, 0xe8a3b3, 0xe8a7b4,
+ /* d9 */ 0xe8a9b3, 0xe8b1a1, 0xe8b39e, 0xe99c9c,
+ /* dd */ 0xe5a19e, 0xe792bd, 0xe8b3bd, 0xe59787,
+ /* e1 */ 0xefa5ac, 0xe7a9a1, 0xe7b4a2, 0xe889b2,
+ /* e5 */ 0xe789b2, 0xe7949f, 0xe794a5, 0xefa5ad,
+ /* e9 */ 0xe7ac99, 0xe5a285, 0xe5a3bb, 0xe5b6bc,
+ /* ed */ 0xe5ba8f, 0xe5bab6, 0xe5be90, 0xe68195,
+ /* f1 */ 0xe68a92, 0xe68dbf, 0xe6958d, 0xe69a91,
+ /* f5 */ 0xe69b99, 0xe69bb8, 0xe6a096, 0xe6a3b2,
+ /* f9 */ 0xe78a80, 0xe7919e, 0xe7adae, 0xe7b5ae,
+ /* fd */ 0xe7b796, 0xe7bdb2,
+
+ /*** Two byte table, leaf: ebxx - offset 0x04db9 ***/
+
+ /* 31 */ 0xe883a5, 0xe88892, 0xe896af, 0xe8a5bf,
+ /* 35 */ 0xe8aa93, 0xe9809d, 0xe98ba4, 0xe9bb8d,
+ /* 39 */ 0xe9bca0, 0xe5a495, 0xe5a5ad, 0xe5b8ad,
+ /* 3d */ 0xe6839c, 0xe69894, 0xe699b3, 0xe69e90,
+ /* 41 */ 0xe6b190, 0xe6b785, 0xe6bd9f, 0xe79fb3,
+ /* 45 */ 0xe7a2a9, 0xe89386, 0xe9878b, 0xe98cab,
+ /* 49 */ 0xe4bb99, 0xe5838a, 0xe58588, 0xe59684,
+ /* 4d */ 0xe5ac8b, 0xe5aea3, 0xe68987, 0xe695be,
+ /* 51 */ 0xe6978b, 0xe6b8b2, 0xe785bd, 0xe79081,
+ /* 55 */ 0xe79184, 0xe79287, 0xe792bf, 0xe799ac,
+ /* 59 */ 0xe7a6aa, 0xe7b79a, 0xe7b995, 0xe7bea8,
+ /* 5d */ 0xe885ba, 0xe886b3, 0xe888b9, 0xe8989a,
+ /* 61 */ 0xe89fac, 0xe8a9b5, 0xe8b7a3, 0xe981b8,
+ /* 65 */ 0xe98a91, 0xe990a5, 0xe9a58d, 0xe9aeae,
+ /* 69 */ 0xe58da8, 0xe5b191, 0xe6a594, 0xe6b384,
+ /* 6d */ 0xe6b4a9, 0xe6b8ab, 0xe8888c, 0xe8969b,
+ /* 71 */ 0xe8a4bb, 0xe8a8ad, 0xe8aaaa, 0xe99baa,
+ /* 75 */ 0xe9bda7, 0xe589a1, 0xe69ab9, 0xe6aeb2,
+ /* 79 */ 0xe7ba96, 0xe89fbe, 0xe8b48d, 0xe99683,
+ /* 7d */ 0xe9999d, 0xe6949d, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe6b689, 0xe787ae, 0xefa5ae, 0xe59f8e,
+ /* 95 */ 0xe5a793, 0xe5aeac, 0xe680a7, 0xe683ba,
+ /* 99 */ 0xe68890, 0xe6989f, 0xe6999f, 0xe78ca9,
+ /* 9d */ 0xe78fb9, 0xe79b9b, 0xe79c81, 0xe7adac,
+ /* a1 */ 0xe88196, 0xe881b2, 0xe885a5, 0xe8aaa0,
+ /* a5 */ 0xe98692, 0xe4b896, 0xe58ba2, 0xe6adb2,
+ /* a9 */ 0xe6b497, 0xe7a885, 0xe7acb9, 0xe7b4b0,
+ /* ad */ 0xefa5af, 0xe8b2b0, 0xe58fac, 0xe598af,
+ /* b1 */ 0xe5a191, 0xe5aeb5, 0xe5b08f, 0xe5b091,
+ /* b5 */ 0xe5b7a2, 0xe68980, 0xe68e83, 0xe69094,
+ /* b9 */ 0xe698ad, 0xe6a2b3, 0xe6b2bc, 0xe6b688,
+ /* bd */ 0xe6baaf, 0xe7809f, 0xe782a4, 0xe78792,
+ /* c1 */ 0xe794a6, 0xe7968f, 0xe7968e, 0xe79899,
+ /* c5 */ 0xe7ac91, 0xe7afa0, 0xe7b0ab, 0xe7b4a0,
+ /* c9 */ 0xe7b4b9, 0xe894ac, 0xe895ad, 0xe89887,
+ /* cd */ 0xe8a8b4, 0xe9808d, 0xe981a1, 0xe982b5,
+ /* d1 */ 0xe98ab7, 0xe99fb6, 0xe9a8b7, 0xe4bf97,
+ /* d5 */ 0xe5b1ac, 0xe69d9f, 0xe6b691, 0xe7b29f,
+ /* d9 */ 0xe7ba8c, 0xe8ac96, 0xe8b496, 0xe9809f,
+ /* dd */ 0xe5adab, 0xe5b7bd, 0xe6908d, 0xe89380,
+ /* e1 */ 0xe9819c, 0xe9a3a1, 0xe78e87, 0xe5ae8b,
+ /* e5 */ 0xe6829a, 0xe69dbe, 0xe6b79e, 0xe8a89f,
+ /* e9 */ 0xe8aaa6, 0xe98081, 0xe9a08c, 0xe588b7,
+ /* ed */ 0xefa5b0, 0xe78191, 0xe7a28e, 0xe98e96,
+ /* f1 */ 0xe8a1b0, 0xe98797, 0xe4bfae, 0xe58f97,
+ /* f5 */ 0xe597bd, 0xe59b9a, 0xe59e82, 0xe5a3bd,
+ /* f9 */ 0xe5ab82, 0xe5ae88, 0xe5b2ab, 0xe5b380,
+ /* fd */ 0xe5b8a5, 0xe68481,
+
+ /*** Two byte table, leaf: ecxx - offset 0x04e87 ***/
+
+ /* 31 */ 0xe6888d, 0xe6898b, 0xe68e88, 0xe6909c,
+ /* 35 */ 0xe694b6, 0xe695b8, 0xe6a8b9, 0xe6ae8a,
+ /* 39 */ 0xe6b0b4, 0xe6b499, 0xe6bcb1, 0xe787a7,
+ /* 3d */ 0xe78ba9, 0xe78db8, 0xe79087, 0xe792b2,
+ /* 41 */ 0xe798a6, 0xe79da1, 0xe7a780, 0xe7a997,
+ /* 45 */ 0xe7abaa, 0xe7b2b9, 0xe7b68f, 0xe7b6ac,
+ /* 49 */ 0xe7b9a1, 0xe7be9e, 0xe884a9, 0xe88cb1,
+ /* 4d */ 0xe89290, 0xe8939a, 0xe897aa, 0xe8a296,
+ /* 51 */ 0xe8aab0, 0xe8ae90, 0xe8bcb8, 0xe98182,
+ /* 55 */ 0xe98283, 0xe985ac, 0xe98a96, 0xe98ab9,
+ /* 59 */ 0xe99a8b, 0xe99aa7, 0xe99aa8, 0xe99b96,
+ /* 5d */ 0xe99c80, 0xe9a088, 0xe9a696, 0xe9ab93,
+ /* 61 */ 0xe9ac9a, 0xe58f94, 0xe5a1be, 0xe5a499,
+ /* 65 */ 0xe5adb0, 0xe5aebf, 0xe6b791, 0xe6bd9a,
+ /* 69 */ 0xe7869f, 0xe790a1, 0xe792b9, 0xe88285,
+ /* 6d */ 0xe88fbd, 0xe5b7a1, 0xe5be87, 0xe5beaa,
+ /* 71 */ 0xe68182, 0xe697ac, 0xe6a092, 0xe6a5af,
+ /* 75 */ 0xe6a993, 0xe6ae89, 0xe6b4b5, 0xe6b7b3,
+ /* 79 */ 0xe78fa3, 0xe79bbe, 0xe79eac, 0xe7ad8d,
+ /* 7d */ 0xe7b494, 0xe884a3, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe8889c, 0xe88d80, 0xe893b4, 0xe895a3,
+ /* 95 */ 0xe8a9a2, 0xe8ab84, 0xe98687, 0xe98c9e,
+ /* 99 */ 0xe9a086, 0xe9a6b4, 0xe6888c, 0xe8a193,
+ /* 9d */ 0xe8bfb0, 0xe989a5, 0xe5b487, 0xe5b4a7,
+ /* a1 */ 0xe5b5a9, 0xe7919f, 0xe8869d, 0xe89da8,
+ /* a5 */ 0xe6bf95, 0xe68bbe, 0xe7bf92, 0xe8a4b6,
+ /* a9 */ 0xe8a5b2, 0xe4b89e, 0xe4b998, 0xe583a7,
+ /* ad */ 0xe58b9d, 0xe58d87, 0xe689bf, 0xe69887,
+ /* b1 */ 0xe7b9a9, 0xe8a085, 0xe9999e, 0xe4be8d,
+ /* b5 */ 0xe58c99, 0xe598b6, 0xe5a78b, 0xe5aaa4,
+ /* b9 */ 0xe5b0b8, 0xe5b18e, 0xe5b18d, 0xe5b882,
+ /* bd */ 0xe5bc91, 0xe68183, 0xe696bd, 0xe698af,
+ /* c1 */ 0xe69982, 0xe69ebe, 0xe69fb4, 0xe78c9c,
+ /* c5 */ 0xe79fa2, 0xe7a4ba, 0xe7bf85, 0xe89294,
+ /* c9 */ 0xe8938d, 0xe8a696, 0xe8a9a6, 0xe8a9a9,
+ /* cd */ 0xe8aba1, 0xe8b195, 0xe8b1ba, 0xe59fb4,
+ /* d1 */ 0xe5af94, 0xe5bc8f, 0xe681af, 0xe68bad,
+ /* d5 */ 0xe6a48d, 0xe6ae96, 0xe6b99c, 0xe78684,
+ /* d9 */ 0xe7af92, 0xe89d95, 0xe8ad98, 0xe8bbbe,
+ /* dd */ 0xe9a39f, 0xe9a3be, 0xe4bcb8, 0xe4be81,
+ /* e1 */ 0xe4bfa1, 0xe591bb, 0xe5a8a0, 0xe5aeb8,
+ /* e5 */ 0xe684bc, 0xe696b0, 0xe699a8, 0xe787bc,
+ /* e9 */ 0xe794b3, 0xe7a59e, 0xe7b4b3, 0xe8858e,
+ /* ed */ 0xe887a3, 0xe88e98, 0xe896aa, 0xe8978e,
+ /* f1 */ 0xe89c83, 0xe8a88a, 0xe8baab, 0xe8be9b,
+ /* f5 */ 0xefa5b1, 0xe8bf85, 0xe5a4b1, 0xe5aea4,
+ /* f9 */ 0xe5afa6, 0xe68289, 0xe5afa9, 0xe5b08b,
+ /* fd */ 0xe5bf83, 0xe6b281,
+
+ /*** Two byte table, leaf: edxx - offset 0x04f55 ***/
+
+ /* 31 */ 0xefa5b2, 0xe6b7b1, 0xe7808b, 0xe7949a,
+ /* 35 */ 0xe88aaf, 0xe8abb6, 0xe4bb80, 0xe58d81,
+ /* 39 */ 0xefa5b3, 0xe99b99, 0xe6b08f, 0xe4ba9e,
+ /* 3d */ 0xe4bf84, 0xe58592, 0xe5959e, 0xe5a8a5,
+ /* 41 */ 0xe5b3a8, 0xe68891, 0xe78999, 0xe88abd,
+ /* 45 */ 0xe88eaa, 0xe89bbe, 0xe8a199, 0xe8a89d,
+ /* 49 */ 0xe998bf, 0xe99b85, 0xe9a493, 0xe9b489,
+ /* 4d */ 0xe9b59d, 0xe5a08a, 0xe5b2b3, 0xe5b6bd,
+ /* 51 */ 0xe5b984, 0xe683a1, 0xe68495, 0xe68fa1,
+ /* 55 */ 0xe6a882, 0xe6b8a5, 0xe98482, 0xe98d94,
+ /* 59 */ 0xe9a18e, 0xe9b090, 0xe9bdb7, 0xe5ae89,
+ /* 5d */ 0xe5b2b8, 0xe68c89, 0xe6998f, 0xe6a188,
+ /* 61 */ 0xe79cbc, 0xe99b81, 0xe99e8d, 0xe9a194,
+ /* 65 */ 0xe9ae9f, 0xe696a1, 0xe8ac81, 0xe8bb8b,
+ /* 69 */ 0xe996bc, 0xe594b5, 0xe5b2a9, 0xe5b796,
+ /* 6d */ 0xe5bab5, 0xe69a97, 0xe7998c, 0xe88fb4,
+ /* 71 */ 0xe99787, 0xe5a393, 0xe68abc, 0xe78b8e,
+ /* 75 */ 0xe9b4a8, 0xe4bbb0, 0xe5a4ae, 0xe6808f,
+ /* 79 */ 0xe698bb, 0xe6ae83, 0xe7a7a7, 0xe9b4a6,
+ /* 7d */ 0xe58e93, 0xe59380, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe59f83, 0xe5b496, 0xe6849b, 0xe69b96,
+ /* 95 */ 0xe6b6af, 0xe7a28d, 0xe889be, 0xe99a98,
+ /* 99 */ 0xe99d84, 0xe58e84, 0xe689bc, 0xe68e96,
+ /* 9d */ 0xe6b6b2, 0xe7b88a, 0xe8858b, 0xe9a18d,
+ /* a1 */ 0xe6abbb, 0xe7bd8c, 0xe9b6af, 0xe9b89a,
+ /* a5 */ 0xe4b99f, 0xe580bb, 0xe586b6, 0xe5a49c,
+ /* a9 */ 0xe683b9, 0xe68fb6, 0xe6a4b0, 0xe788ba,
+ /* ad */ 0xe880b6, 0xefa5b4, 0xe9878e, 0xe5bcb1,
+ /* b1 */ 0xefa5b5, 0xefa5b6, 0xe7b484, 0xe88ba5,
+ /* b5 */ 0xe891af, 0xe892bb, 0xe897a5, 0xe8ba8d,
+ /* b9 */ 0xefa5b7, 0xe4bdaf, 0xefa5b8, 0xefa5b9,
+ /* bd */ 0xe5a3a4, 0xe5ad83, 0xe68199, 0xe68f9a,
+ /* c1 */ 0xe69498, 0xe695ad, 0xe69a98, 0xefa5ba,
+ /* c5 */ 0xe6a58a, 0xe6a8a3, 0xe6b48b, 0xe78081,
+ /* c9 */ 0xe785ac, 0xe79792, 0xe7988d, 0xe7a6b3,
+ /* cd */ 0xe7a9b0, 0xefa5bb, 0xe7be8a, 0xefa5bc,
+ /* d1 */ 0xe8a584, 0xefa5bd, 0xe8ae93, 0xe98780,
+ /* d5 */ 0xe999bd, 0xefa5be, 0xe9a48a, 0xe59c84,
+ /* d9 */ 0xe5bea1, 0xe696bc, 0xe6bc81, 0xe79880,
+ /* dd */ 0xe7a6a6, 0xe8aa9e, 0xe9a6ad, 0xe9ad9a,
+ /* e1 */ 0xe9bdac, 0xe58484, 0xe686b6, 0xe68a91,
+ /* e5 */ 0xe6aa8d, 0xe88786, 0xe58183, 0xe5a0b0,
+ /* e9 */ 0xe5bda6, 0xe78489, 0xe8a880, 0xe8abba,
+ /* ed */ 0xe5adbc, 0xe89896, 0xe4bfba, 0xe584bc,
+ /* f1 */ 0xe59ab4, 0xe5a584, 0xe68ea9, 0xe6b7b9,
+ /* f5 */ 0xe5b6aa, 0xe6a5ad, 0xe58686, 0xe4ba88,
+ /* f9 */ 0xe4bd99, 0xefa5bf, 0xefa680, 0xefa681,
+ /* fd */ 0xe5a682, 0xefa682,
+
+ /*** Two byte table, leaf: eexx - offset 0x05023 ***/
+
+ /* 31 */ 0xefa683, 0xe6ad9f, 0xe6b19d, 0xefa684,
+ /* 35 */ 0xe792b5, 0xe7a496, 0xefa685, 0xe88887,
+ /* 39 */ 0xe88985, 0xe88cb9, 0xe8bcbf, 0xe8bd9d,
+ /* 3d */ 0xefa686, 0xe9a498, 0xefa687, 0xefa688,
+ /* 41 */ 0xefa689, 0xe4baa6, 0xefa68a, 0xe59f9f,
+ /* 45 */ 0xe5bdb9, 0xe69893, 0xefa68b, 0xefa68c,
+ /* 49 */ 0xe796ab, 0xe7b9b9, 0xe8adaf, 0xefa68d,
+ /* 4d */ 0xe98086, 0xe9a99b, 0xe59aa5, 0xe5a0a7,
+ /* 51 */ 0xe5a7b8, 0xe5a89f, 0xe5aeb4, 0xefa68e,
+ /* 55 */ 0xe5bbb6, 0xefa68f, 0xefa690, 0xe68d90,
+ /* 59 */ 0xe68cbb, 0xefa691, 0xe6a4bd, 0xe6b287,
+ /* 5d */ 0xe6b2bf, 0xe6b68e, 0xe6b693, 0xe6b7b5,
+ /* 61 */ 0xe6bc94, 0xefa692, 0xe7839f, 0xe784b6,
+ /* 65 */ 0xe78599, 0xefa693, 0xe78783, 0xe78795,
+ /* 69 */ 0xefa694, 0xe7a18f, 0xe7a1af, 0xefa695,
+ /* 6d */ 0xe7adb5, 0xe7b7a3, 0xefa696, 0xe7b8af,
+ /* 71 */ 0xefa697, 0xe8a18d, 0xe8bb9f, 0xefa698,
+ /* 75 */ 0xefa699, 0xefa69a, 0xe9899b, 0xefa69b,
+ /* 79 */ 0xe9b3b6, 0xefa69c, 0xefa69d, 0xefa69e,
+ /* 7d */ 0xe68285, 0xe6b685, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xefa69f, 0xe786b1, 0xefa6a0, 0xefa6a1,
+ /* 95 */ 0xe996b1, 0xe58ead, 0xefa6a2, 0xefa6a3,
+ /* 99 */ 0xefa6a4, 0xe69f93, 0xefa6a5, 0xe7828e,
+ /* 9d */ 0xe784b0, 0xe790b0, 0xe889b6, 0xe88b92,
+ /* a1 */ 0xefa6a6, 0xe996bb, 0xe9aba5, 0xe9b9bd,
+ /* a5 */ 0xe69b84, 0xefa6a7, 0xe78781, 0xe89189,
+ /* a9 */ 0xefa6a8, 0xefa6a9, 0xe5a18b, 0xefa6aa,
+ /* ad */ 0xefa6ab, 0xe5b6b8, 0xe5bdb1, 0xefa6ac,
+ /* b1 */ 0xe698a0, 0xe69a8e, 0xe6a5b9, 0xe6a6ae,
+ /* b5 */ 0xe6b0b8, 0xe6b3b3, 0xe6b8b6, 0xe6bd81,
+ /* b9 */ 0xe6bf9a, 0xe7809b, 0xe780af, 0xe78590,
+ /* bd */ 0xe7879f, 0xe78db0, 0xefa6ad, 0xe7919b,
+ /* c1 */ 0xefa6ae, 0xe79394, 0xe79b88, 0xe7a98e,
+ /* c5 */ 0xe7ba93, 0xefa6af, 0xefa6b0, 0xe88bb1,
+ /* c9 */ 0xe8a9a0, 0xe8bf8e, 0xefa6b1, 0xe98d88,
+ /* cd */ 0xefa6b2, 0xe99c99, 0xefa6b3, 0xefa6b4,
+ /* d1 */ 0xe4b982, 0xe580aa, 0xefa6b5, 0xe58888,
+ /* d5 */ 0xe58fa1, 0xe69bb3, 0xe6b1ad, 0xe6bf8a,
+ /* d9 */ 0xe78c8a, 0xe79dbf, 0xe7a9a2, 0xe88aae,
+ /* dd */ 0xe8979d, 0xe89882, 0xefa6b6, 0xe8a394,
+ /* e1 */ 0xe8a9a3, 0xe8adbd, 0xe8b1ab, 0xefa6b7,
+ /* e5 */ 0xe98ab3, 0xefa6b8, 0xe99c93, 0xe9a090,
+ /* e9 */ 0xe4ba94, 0xe4bc8d, 0xe4bf89, 0xe582b2,
+ /* ed */ 0xe58d88, 0xe590be, 0xe590b3, 0xe5979a,
+ /* f1 */ 0xe5a1a2, 0xe5a2ba, 0xe5a5a7, 0xe5a89b,
+ /* f5 */ 0xe5afa4, 0xe6829f, 0xefa6b9, 0xe6878a,
+ /* f9 */ 0xe69596, 0xe697bf, 0xe699a4, 0xe6a2a7,
+ /* fd */ 0xe6b19a, 0xe6beb3,
+
+ /*** Two byte table, leaf: efxx - offset 0x050f1 ***/
+
+ /* 31 */ 0xe7838f, 0xe786ac, 0xe78d92, 0xe7adbd,
+ /* 35 */ 0xe89c88, 0xe8aaa4, 0xe9b0b2, 0xe9bc87,
+ /* 39 */ 0xe5b18b, 0xe6b283, 0xe78d84, 0xe78e89,
+ /* 3d */ 0xe988ba, 0xe6baab, 0xe791a5, 0xe7989f,
+ /* 41 */ 0xe7a9a9, 0xe7b895, 0xe8988a, 0xe58580,
+ /* 45 */ 0xe5a385, 0xe69381, 0xe793ae, 0xe79495,
+ /* 49 */ 0xe799b0, 0xe7bf81, 0xe98295, 0xe99b8d,
+ /* 4d */ 0xe9a594, 0xe6b8a6, 0xe793a6, 0xe7aaa9,
+ /* 51 */ 0xe7aaaa, 0xe887a5, 0xe89b99, 0xe89db8,
+ /* 55 */ 0xe8a89b, 0xe5a989, 0xe5ae8c, 0xe5ae9b,
+ /* 59 */ 0xe6a2a1, 0xe6a480, 0xe6b5a3, 0xe78ea9,
+ /* 5d */ 0xe79093, 0xe790ac, 0xe7a297, 0xe7b7a9,
+ /* 61 */ 0xe7bfab, 0xe88498, 0xe88595, 0xe88e9e,
+ /* 65 */ 0xe8b18c, 0xe998ae, 0xe9a091, 0xe69bb0,
+ /* 69 */ 0xe5be80, 0xe697ba, 0xe69e89, 0xe6b1aa,
+ /* 6d */ 0xe78e8b, 0xe580ad, 0xe5a883, 0xe6adaa,
+ /* 71 */ 0xe79fae, 0xe5a496, 0xe5b5ac, 0xe5b78d,
+ /* 75 */ 0xe78ca5, 0xe7958f, 0xefa6ba, 0xefa6bb,
+ /* 79 */ 0xe583a5, 0xe587b9, 0xe5a0af, 0xe5a4ad,
+ /* 7d */ 0xe5a696, 0xe5a79a, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe5afa5, 0xefa6bc, 0xefa6bd, 0xe5b6a2,
+ /* 95 */ 0xe68b97, 0xe69096, 0xe69293, 0xe693be,
+ /* 99 */ 0xefa6be, 0xe69b9c, 0xefa6bf, 0xe6a988,
+ /* 9d */ 0xefa780, 0xe787bf, 0xe791a4, 0xefa781,
+ /* a1 */ 0xe7aa88, 0xe7aaaf, 0xe7b987, 0xe7b99e,
+ /* a5 */ 0xe88080, 0xe885b0, 0xefa782, 0xe89faf,
+ /* a9 */ 0xe8a681, 0xe8aca0, 0xe98199, 0xefa783,
+ /* ad */ 0xe98280, 0xe9a592, 0xe685be, 0xe6acb2,
+ /* b1 */ 0xe6b5b4, 0xe7b89f, 0xe8a4a5, 0xe8beb1,
+ /* b5 */ 0xe4bf91, 0xe582ad, 0xe58697, 0xe58b87,
+ /* b9 */ 0xe59f87, 0xe5a289, 0xe5aeb9, 0xe5bab8,
+ /* bd */ 0xe68582, 0xe6a695, 0xe6b68c, 0xe6b9a7,
+ /* c1 */ 0xe6bab6, 0xe78694, 0xe791a2, 0xe794a8,
+ /* c5 */ 0xe794ac, 0xe881b3, 0xe88cb8, 0xe89389,
+ /* c9 */ 0xe8b88a, 0xe98e94, 0xe98f9e, 0xefa784,
+ /* cd */ 0xe4ba8e, 0xe4bd91, 0xe581b6, 0xe584aa,
+ /* d1 */ 0xe58f88, 0xe58f8b, 0xe58fb3, 0xe5ae87,
+ /* d5 */ 0xe5af93, 0xe5b0a4, 0xe6849a, 0xe68682,
+ /* d9 */ 0xe697b4, 0xe7899b, 0xe78e97, 0xe79180,
+ /* dd */ 0xe79b82, 0xe7a590, 0xe7a691, 0xe7a6b9,
+ /* e1 */ 0xe7b486, 0xe7bebd, 0xe88a8b, 0xe89795,
+ /* e5 */ 0xe8999e, 0xe8bf82, 0xe98187, 0xe983b5,
+ /* e9 */ 0xe987aa, 0xe99a85, 0xe99ba8, 0xe99ba9,
+ /* ed */ 0xe58b96, 0xe5bda7, 0xe697ad, 0xe698b1,
+ /* f1 */ 0xe6a0af, 0xe7859c, 0xe7a8b6, 0xe98381,
+ /* f5 */ 0xe9a08a, 0xe4ba91, 0xefa785, 0xe6a992,
+ /* f9 */ 0xe6ae9e, 0xe6be90, 0xe78689, 0xe88098,
+ /* fd */ 0xe88ab8, 0xe89593,
+
+ /*** Two byte table, leaf: f0xx - offset 0x051bf ***/
+
+ /* 31 */ 0xe9818b, 0xe99a95, 0xe99bb2, 0xe99fbb,
+ /* 35 */ 0xe8949a, 0xe9acb1, 0xe4ba90, 0xe7868a,
+ /* 39 */ 0xe99b84, 0xe58583, 0xe58e9f, 0xe593a1,
+ /* 3d */ 0xe59c93, 0xe59c92, 0xe59ea3, 0xe5aa9b,
+ /* 41 */ 0xe5ab84, 0xe5af83, 0xe680a8, 0xe684bf,
+ /* 45 */ 0xe68fb4, 0xe6b285, 0xe6b4b9, 0xe6b9b2,
+ /* 49 */ 0xe6ba90, 0xe788b0, 0xe78cbf, 0xe79197,
+ /* 4d */ 0xe88b91, 0xe8a281, 0xe8bd85, 0xe981a0,
+ /* 51 */ 0xefa786, 0xe999a2, 0xe9a198, 0xe9b49b,
+ /* 55 */ 0xe69c88, 0xe8b68a, 0xe9899e, 0xe4bd8d,
+ /* 59 */ 0xe58189, 0xe5839e, 0xe58db1, 0xe59c8d,
+ /* 5d */ 0xe5a794, 0xe5a881, 0xe5b089, 0xe685b0,
+ /* 61 */ 0xe69a90, 0xe6b8ad, 0xe788b2, 0xe7918b,
+ /* 65 */ 0xe7b7af, 0xe88383, 0xe8908e, 0xe891a6,
+ /* 69 */ 0xe894bf, 0xe89d9f, 0xe8a19b, 0xe8a498,
+ /* 6d */ 0xe8ac82, 0xe98195, 0xe99f8b, 0xe9ad8f,
+ /* 71 */ 0xe4b9b3, 0xe4be91, 0xe58492, 0xe585aa,
+ /* 75 */ 0xefa787, 0xe594af, 0xe596a9, 0xe5adba,
+ /* 79 */ 0xe5aea5, 0xe5b9bc, 0xe5b9bd, 0xe5babe,
+ /* 7d */ 0xe682a0, 0xe6839f, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe68488, 0xe68489, 0xe68f84, 0xe694b8,
+ /* 95 */ 0xe69c89, 0xefa788, 0xe69f94, 0xe69f9a,
+ /* 99 */ 0xefa789, 0xe6a5a1, 0xe6a5a2, 0xe6b2b9,
+ /* 9d */ 0xe6b4a7, 0xefa78a, 0xe6b8b8, 0xefa78b,
+ /* a1 */ 0xe6bfa1, 0xe78cb6, 0xe78cb7, 0xefa78c,
+ /* a5 */ 0xe7919c, 0xe794b1, 0xefa78d, 0xe79992,
+ /* a9 */ 0xefa78e, 0xefa78f, 0xe7b6ad, 0xe887be,
+ /* ad */ 0xe890b8, 0xe8a395, 0xe8aa98, 0xe8ab9b,
+ /* b1 */ 0xe8abad, 0xe8b8b0, 0xe8b982, 0xe9818a,
+ /* b5 */ 0xe980be, 0xe981ba, 0xe98589, 0xe98789,
+ /* b9 */ 0xe98dae, 0xefa790, 0xefa791, 0xe5a089,
+ /* bd */ 0xefa792, 0xe6af93, 0xe88289, 0xe882b2,
+ /* c1 */ 0xefa793, 0xefa794, 0xe58581, 0xe5a5ab,
+ /* c5 */ 0xe5b0b9, 0xefa795, 0xefa796, 0xe6bda4,
+ /* c9 */ 0xe78ea7, 0xe883a4, 0xe8b487, 0xefa797,
+ /* cd */ 0xe98897, 0xe9968f, 0xefa798, 0xefa799,
+ /* d1 */ 0xefa79a, 0xefa79b, 0xe881bf, 0xe6888e,
+ /* d5 */ 0xe7809c, 0xe7b5a8, 0xe89e8d, 0xefa79c,
+ /* d9 */ 0xe59ea0, 0xe681a9, 0xe68587, 0xe6aeb7,
+ /* dd */ 0xe8aabe, 0xe98a80, 0xe99ab1, 0xe4b999,
+ /* e1 */ 0xe5909f, 0xe6b7ab, 0xe894ad, 0xe999b0,
+ /* e5 */ 0xe99fb3, 0xe9a3ae, 0xe68f96, 0xe6b3a3,
+ /* e9 */ 0xe98291, 0xe5879d, 0xe68789, 0xe886ba,
+ /* ed */ 0xe9b7b9, 0xe4be9d, 0xe5809a, 0xe58480,
+ /* f1 */ 0xe5ae9c, 0xe6848f, 0xe687bf, 0xe693ac,
+ /* f5 */ 0xe6a485, 0xe6af85, 0xe79691, 0xe79fa3,
+ /* f9 */ 0xe7bea9, 0xe889a4, 0xe8968f, 0xe89fbb,
+ /* fd */ 0xe8a1a3, 0xe8aabc,
+
+ /*** Two byte table, leaf: f1xx - offset 0x0528d ***/
+
+ /* 31 */ 0xe8adb0, 0xe986ab, 0xe4ba8c, 0xe4bba5,
+ /* 35 */ 0xe4bc8a, 0xefa79d, 0xefa79e, 0xe5a4b7,
+ /* 39 */ 0xe5a7a8, 0xefa79f, 0xe5b7b2, 0xe5bc9b,
+ /* 3d */ 0xe5bd9b, 0xe680a1, 0xefa7a0, 0xefa7a1,
+ /* 41 */ 0xefa7a2, 0xefa7a3, 0xe788be, 0xe78fa5,
+ /* 45 */ 0xefa7a4, 0xe795b0, 0xe7978d, 0xefa7a5,
+ /* 49 */ 0xe7a7bb, 0xefa7a6, 0xe8808c, 0xe880b3,
+ /* 4d */ 0xe88284, 0xe88ba1, 0xe88d91, 0xefa7a7,
+ /* 51 */ 0xefa7a8, 0xe8b2bd, 0xe8b2b3, 0xe98287,
+ /* 55 */ 0xefa7a9, 0xefa7aa, 0xe9a3b4, 0xe9a48c,
+ /* 59 */ 0xefa7ab, 0xefa7ac, 0xe780b7, 0xe79b8a,
+ /* 5d */ 0xe7bf8a, 0xe7bf8c, 0xe7bfbc, 0xe8ac9a,
+ /* 61 */ 0xe4baba, 0xe4bb81, 0xe58883, 0xe58db0,
+ /* 65 */ 0xefa7ad, 0xe592bd, 0xe59ba0, 0xe5a7bb,
+ /* 69 */ 0xe5af85, 0xe5bc95, 0xe5bf8d, 0xe6b9ae,
+ /* 6d */ 0xefa7ae, 0xefa7af, 0xe7b5aa, 0xe88cb5,
+ /* 71 */ 0xefa7b0, 0xe89a93, 0xe8aa8d, 0xefa7b1,
+ /* 75 */ 0xe99dad, 0xe99db7, 0xefa7b2, 0xefa7b3,
+ /* 79 */ 0xe4b880, 0xe4bd9a, 0xe4bdbe, 0xe5a3b9,
+ /* 7d */ 0xe697a5, 0xe6baa2, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe980b8, 0xe98eb0, 0xe9a6b9, 0xe4bbbb,
+ /* 95 */ 0xe5a3ac, 0xe5a68a, 0xe5a799, 0xe68181,
+ /* 99 */ 0xefa7b4, 0xefa7b5, 0xe7a894, 0xefa7b6,
+ /* 9d */ 0xe88d8f, 0xe8b383, 0xe585a5, 0xe58d84,
+ /* a1 */ 0xefa7b7, 0xefa7b8, 0xefa7b9, 0xe4bb8d,
+ /* a5 */ 0xe589a9, 0xe5ad95, 0xe88abf, 0xe4bb94,
+ /* a9 */ 0xe588ba, 0xe592a8, 0xe5a789, 0xe5a7bf,
+ /* ad */ 0xe5ad90, 0xe5ad97, 0xe5ad9c, 0xe681a3,
+ /* b1 */ 0xe68588, 0xe6bb8b, 0xe78299, 0xe785ae,
+ /* b5 */ 0xe78e86, 0xe793b7, 0xe796b5, 0xe7a381,
+ /* b9 */ 0xe7b4ab, 0xe88085, 0xe887aa, 0xe88ca8,
+ /* bd */ 0xe89497, 0xe89789, 0xe8abae, 0xe8b387,
+ /* c1 */ 0xe99b8c, 0xe4bd9c, 0xe58bba, 0xe59abc,
+ /* c5 */ 0xe696ab, 0xe698a8, 0xe781bc, 0xe782b8,
+ /* c9 */ 0xe788b5, 0xe7b6bd, 0xe88a8d, 0xe9858c,
+ /* cd */ 0xe99b80, 0xe9b5b2, 0xe5adb1, 0xe6a3a7,
+ /* d1 */ 0xe6ae98, 0xe6bdba, 0xe79b9e, 0xe5b291,
+ /* d5 */ 0xe69aab, 0xe6bd9b, 0xe7aeb4, 0xe7b0aa,
+ /* d9 */ 0xe8a0b6, 0xe99b9c, 0xe4b888, 0xe4bb97,
+ /* dd */ 0xe58ca0, 0xe5a0b4, 0xe5a2bb, 0xe5a3af,
+ /* e1 */ 0xe5a5ac, 0xe5b087, 0xe5b8b3, 0xe5ba84,
+ /* e5 */ 0xe5bcb5, 0xe68e8c, 0xe69ab2, 0xe69d96,
+ /* e9 */ 0xe6a89f, 0xe6aaa3, 0xe6ac8c, 0xe6bcbf,
+ /* ed */ 0xe78986, 0xefa7ba, 0xe78d90, 0xe7928b,
+ /* f1 */ 0xe7aba0, 0xe7b2a7, 0xe885b8, 0xe8879f,
+ /* f5 */ 0xe887a7, 0xe88e8a, 0xe891ac, 0xe894a3,
+ /* f9 */ 0xe89694, 0xe8978f, 0xe8a39d, 0xe8b493,
+ /* fd */ 0xe986ac, 0xe995b7,
+
+ /*** Two byte table, leaf: f2xx - offset 0x0535b ***/
+
+ /* 31 */ 0xe99a9c, 0xe5868d, 0xe59389, 0xe59ca8,
+ /* 35 */ 0xe5aeb0, 0xe6898d, 0xe69d90, 0xe6a0bd,
+ /* 39 */ 0xe6a293, 0xe6b8bd, 0xe6bb93, 0xe781bd,
+ /* 3d */ 0xe7b8a1, 0xe8a381, 0xe8b2a1, 0xe8bc89,
+ /* 41 */ 0xe9bd8b, 0xe9bd8e, 0xe788ad, 0xe7ae8f,
+ /* 45 */ 0xe8ab8d, 0xe98c9a, 0xe4bd87, 0xe4bd8e,
+ /* 49 */ 0xe584b2, 0xe59280, 0xe5a790, 0xe5ba95,
+ /* 4d */ 0xe68ab5, 0xe69db5, 0xe6a5ae, 0xe6a897,
+ /* 51 */ 0xe6b2ae, 0xe6b89a, 0xe78b99, 0xe78caa,
+ /* 55 */ 0xe796bd, 0xe7aeb8, 0xe7b4b5, 0xe88ba7,
+ /* 59 */ 0xe88fb9, 0xe89197, 0xe897b7, 0xe8a99b,
+ /* 5d */ 0xe8b2af, 0xe8ba87, 0xe98099, 0xe982b8,
+ /* 61 */ 0xe99b8e, 0xe9bd9f, 0xe58ba3, 0xe5908a,
+ /* 65 */ 0xe5aba1, 0xe5af82, 0xe69198, 0xe695b5,
+ /* 69 */ 0xe6bbb4, 0xe78b84, 0xefa7bb, 0xe79a84,
+ /* 6d */ 0xe7a98d, 0xe7ac9b, 0xe7b18d, 0xe7b8be,
+ /* 71 */ 0xe7bf9f, 0xe88dbb, 0xe8acab, 0xe8b38a,
+ /* 75 */ 0xe8b5a4, 0xe8b7a1, 0xe8b99f, 0xe8bfaa,
+ /* 79 */ 0xe8bfb9, 0xe981a9, 0xe98f91, 0xe4bd83,
+ /* 7d */ 0xe4bdba, 0xe582b3, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe585a8, 0xe585b8, 0xe5898d, 0xe589aa,
+ /* 95 */ 0xe5a1a1, 0xe5a1bc, 0xe5a5a0, 0xe5b088,
+ /* 99 */ 0xe5b195, 0xe5bb9b, 0xe6829b, 0xe688b0,
+ /* 9d */ 0xe6a093, 0xe6aebf, 0xe6b088, 0xe6beb1,
+ /* a1 */ 0xe7858e, 0xe790a0, 0xe794b0, 0xe794b8,
+ /* a5 */ 0xe79591, 0xe799b2, 0xe7ad8c, 0xe7ae8b,
+ /* a9 */ 0xe7aead, 0xe7af86, 0xe7ba8f, 0xe8a9ae,
+ /* ad */ 0xe8bcbe, 0xe8bd89, 0xe988bf, 0xe98a93,
+ /* b1 */ 0xe98ca2, 0xe990ab, 0xe99bbb, 0xe9a19a,
+ /* b5 */ 0xe9a1ab, 0xe9a49e, 0xe58887, 0xe688aa,
+ /* b9 */ 0xe68a98, 0xe6b599, 0xe799a4, 0xe7ab8a,
+ /* bd */ 0xe7af80, 0xe7b5b6, 0xe58da0, 0xe5b2be,
+ /* c1 */ 0xe5ba97, 0xe6bcb8, 0xe782b9, 0xe7b298,
+ /* c5 */ 0xe99c91, 0xe9ae8e, 0xe9bb9e, 0xe68ea5,
+ /* c9 */ 0xe691ba, 0xe89db6, 0xe4b881, 0xe4ba95,
+ /* cd */ 0xe4baad, 0xe5819c, 0xe581b5, 0xe59188,
+ /* d1 */ 0xe5a783, 0xe5ae9a, 0xe5b980, 0xe5baad,
+ /* d5 */ 0xe5bbb7, 0xe5be81, 0xe68385, 0xe68cba,
+ /* d9 */ 0xe694bf, 0xe695b4, 0xe6978c, 0xe699b6,
+ /* dd */ 0xe699b8, 0xe69fbe, 0xe6a5a8, 0xe6aa89,
+ /* e1 */ 0xe6ada3, 0xe6b180, 0xe6b780, 0xe6b7a8,
+ /* e5 */ 0xe6b89f, 0xe6b99e, 0xe7809e, 0xe782a1,
+ /* e9 */ 0xe78e8e, 0xe78fbd, 0xe794ba, 0xe79d9b,
+ /* ed */ 0xe7a287, 0xe7a68e, 0xe7a88b, 0xe7a9bd,
+ /* f1 */ 0xe7b2be, 0xe7b68e, 0xe88987, 0xe8a882,
+ /* f5 */ 0xe8abaa, 0xe8b29e, 0xe984ad, 0xe9858a,
+ /* f9 */ 0xe98798, 0xe989a6, 0xe98b8c, 0xe98ca0,
+ /* fd */ 0xe99c86, 0xe99d96,
+
+ /*** Two byte table, leaf: f3xx - offset 0x05429 ***/
+
+ /* 31 */ 0xe99d9c, 0xe9a082, 0xe9bc8e, 0xe588b6,
+ /* 35 */ 0xe58a91, 0xe595bc, 0xe5a0a4, 0xe5b89d,
+ /* 39 */ 0xe5bc9f, 0xe6828c, 0xe68f90, 0xe6a2af,
+ /* 3d */ 0xe6bf9f, 0xe7a5ad, 0xe7acac, 0xe8878d,
+ /* 41 */ 0xe896ba, 0xe8a3bd, 0xe8abb8, 0xe8b984,
+ /* 45 */ 0xe9868d, 0xe999a4, 0xe99a9b, 0xe99cbd,
+ /* 49 */ 0xe9a18c, 0xe9bd8a, 0xe4bf8e, 0xe58586,
+ /* 4d */ 0xe5878b, 0xe58aa9, 0xe598b2, 0xe5bc94,
+ /* 51 */ 0xe5bdab, 0xe68eaa, 0xe6938d, 0xe697a9,
+ /* 55 */ 0xe69981, 0xe69bba, 0xe69bb9, 0xe69c9d,
+ /* 59 */ 0xe6a29d, 0xe6a397, 0xe6a7bd, 0xe6bc95,
+ /* 5d */ 0xe6bdae, 0xe785a7, 0xe787a5, 0xe788aa,
+ /* 61 */ 0xe792aa, 0xe79cba, 0xe7a596, 0xe7a59a,
+ /* 65 */ 0xe7a79f, 0xe7a8a0, 0xe7aa95, 0xe7b297,
+ /* 69 */ 0xe7b39f, 0xe7b584, 0xe7b9b0, 0xe88287,
+ /* 6d */ 0xe897bb, 0xe89aa4, 0xe8a994, 0xe8aabf,
+ /* 71 */ 0xe8b699, 0xe8ba81, 0xe980a0, 0xe981ad,
+ /* 75 */ 0xe987a3, 0xe998bb, 0xe99b95, 0xe9b3a5,
+ /* 79 */ 0xe6978f, 0xe7b087, 0xe8b6b3, 0xe98f83,
+ /* 7d */ 0xe5ad98, 0xe5b08a, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe58d92, 0xe68b99, 0xe78c9d, 0xe580a7,
+ /* 95 */ 0xe5ae97, 0xe5be9e, 0xe682b0, 0xe685ab,
+ /* 99 */ 0xe6a395, 0xe6b799, 0xe790ae, 0xe7a8ae,
+ /* 9d */ 0xe7b582, 0xe7b69c, 0xe7b8b1, 0xe885ab,
+ /* a1 */ 0xe8b8aa, 0xe8b8b5, 0xe98dbe, 0xe99098,
+ /* a5 */ 0xe4bd90, 0xe59d90, 0xe5b7a6, 0xe5baa7,
+ /* a9 */ 0xe68cab, 0xe7bdaa, 0xe4b8bb, 0xe4bd8f,
+ /* ad */ 0xe4be8f, 0xe5819a, 0xe5a79d, 0xe88384,
+ /* b1 */ 0xe591aa, 0xe591a8, 0xe597be, 0xe5a58f,
+ /* b5 */ 0xe5ae99, 0xe5b79e, 0xe5bb9a, 0xe6999d,
+ /* b9 */ 0xe69cb1, 0xe69fb1, 0xe6a0aa, 0xe6b3a8,
+ /* bd */ 0xe6b4b2, 0xe6b98a, 0xe6be8d, 0xe782b7,
+ /* c1 */ 0xe78fa0, 0xe79687, 0xe7b18c, 0xe7b482,
+ /* c5 */ 0xe7b4ac, 0xe7b6a2, 0xe8889f, 0xe89b9b,
+ /* c9 */ 0xe8a8bb, 0xe8aa85, 0xe8b5b0, 0xe8ba8a,
+ /* cd */ 0xe8bcb3, 0xe980b1, 0xe9858e, 0xe98592,
+ /* d1 */ 0xe99184, 0xe9a790, 0xe7abb9, 0xe7b2a5,
+ /* d5 */ 0xe4bf8a, 0xe58481, 0xe58786, 0xe59f88,
+ /* d9 */ 0xe5afaf, 0xe5b3bb, 0xe69999, 0xe6a8bd,
+ /* dd */ 0xe6b59a, 0xe6ba96, 0xe6bfac, 0xe7848c,
+ /* e1 */ 0xe795af, 0xe7aba3, 0xe8a0a2, 0xe980a1,
+ /* e5 */ 0xe981b5, 0xe99b8b, 0xe9a7bf, 0xe88c81,
+ /* e9 */ 0xe4b8ad, 0xe4bbb2, 0xe8a186, 0xe9878d,
+ /* ed */ 0xe58dbd, 0xe6ab9b, 0xe6a5ab, 0xe6b181,
+ /* f1 */ 0xe891ba, 0xe5a29e, 0xe6868e, 0xe69bbe,
+ /* f5 */ 0xe68baf, 0xe7839d, 0xe79491, 0xe79787,
+ /* f9 */ 0xe7b992, 0xe892b8, 0xe8ad89, 0xe8b488,
+ /* fd */ 0xe4b98b, 0xe58faa,
+
+ /*** Two byte table, leaf: f4xx - offset 0x054f7 ***/
+
+ /* 31 */ 0xe592ab, 0xe59cb0, 0xe59d80, 0xe5bf97,
+ /* 35 */ 0xe68c81, 0xe68c87, 0xe691af, 0xe694af,
+ /* 39 */ 0xe697a8, 0xe699ba, 0xe69e9d, 0xe69eb3,
+ /* 3d */ 0xe6ada2, 0xe6b1a0, 0xe6b29a, 0xe6bcac,
+ /* 41 */ 0xe79fa5, 0xe7a0a5, 0xe7a589, 0xe7a597,
+ /* 45 */ 0xe7b499, 0xe882a2, 0xe88482, 0xe887b3,
+ /* 49 */ 0xe88a9d, 0xe88ab7, 0xe89c98, 0xe8aa8c,
+ /* 4d */ 0xefa7bc, 0xe8b484, 0xe8b6be, 0xe981b2,
+ /* 51 */ 0xe79bb4, 0xe7a899, 0xe7a8b7, 0xe7b994,
+ /* 55 */ 0xe881b7, 0xe59487, 0xe59794, 0xe5a1b5,
+ /* 59 */ 0xe68caf, 0xe690a2, 0xe69989, 0xe6998b,
+ /* 5d */ 0xe6a1ad, 0xe6a69b, 0xe6ae84, 0xe6b4a5,
+ /* 61 */ 0xe6bab1, 0xe78f8d, 0xe791a8, 0xe792a1,
+ /* 65 */ 0xe7959b, 0xe796b9, 0xe79ba1, 0xe79c9e,
+ /* 69 */ 0xe79e8b, 0xe7a7a6, 0xe7b889, 0xe7b89d,
+ /* 6d */ 0xe887bb, 0xe894af, 0xe8a297, 0xe8a8ba,
+ /* 71 */ 0xe8b391, 0xe8bbab, 0xe8beb0, 0xe980b2,
+ /* 75 */ 0xe98ead, 0xe999a3, 0xe999b3, 0xe99c87,
+ /* 79 */ 0xe4be84, 0xe58fb1, 0xe5a7aa, 0xe5ab89,
+ /* 7d */ 0xe5b899, 0xe6a18e, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe79386, 0xe796be, 0xe7a7a9, 0xe7aa92,
+ /* 95 */ 0xe886a3, 0xe89bad, 0xe8b3aa, 0xe8b78c,
+ /* 99 */ 0xe8bfad, 0xe6969f, 0xe69c95, 0xefa7bd,
+ /* 9d */ 0xe59fb7, 0xe6bd97, 0xe7b79d, 0xe8bcaf,
+ /* a1 */ 0xe98fb6, 0xe99b86, 0xe5beb5, 0xe687b2,
+ /* a5 */ 0xe6be84, 0xe4b894, 0xe4be98, 0xe5809f,
+ /* a9 */ 0xe58f89, 0xe5979f, 0xe5b5af, 0xe5b7ae,
+ /* ad */ 0xe6aca1, 0xe6ada4, 0xe7a38b, 0xe7ae9a,
+ /* b1 */ 0xefa7be, 0xe8b989, 0xe8bb8a, 0xe981ae,
+ /* b5 */ 0xe68d89, 0xe690be, 0xe79d80, 0xe7aa84,
+ /* b9 */ 0xe98caf, 0xe991bf, 0xe9bdaa, 0xe692b0,
+ /* bd */ 0xe6beaf, 0xe787a6, 0xe792a8, 0xe7939a,
+ /* c1 */ 0xe7ab84, 0xe7b092, 0xe7ba82, 0xe7b2b2,
+ /* c5 */ 0xe7ba98, 0xe8ae9a, 0xe8b48a, 0xe991bd,
+ /* c9 */ 0xe9a490, 0xe9a58c, 0xe588b9, 0xe5af9f,
+ /* cd */ 0xe693a6, 0xe69cad, 0xe7b4ae, 0xe583ad,
+ /* d1 */ 0xe58f83, 0xe5a1b9, 0xe68598, 0xe68599,
+ /* d5 */ 0xe687ba, 0xe696ac, 0xe7ab99, 0xe8ae92,
+ /* d9 */ 0xe8ae96, 0xe58089, 0xe580a1, 0xe589b5,
+ /* dd */ 0xe594b1, 0xe5a8bc, 0xe5bba0, 0xe5bdb0,
+ /* e1 */ 0xe684b4, 0xe6959e, 0xe6988c, 0xe698b6,
+ /* e5 */ 0xe69aa2, 0xe6a78d, 0xe6bb84, 0xe6bcb2,
+ /* e9 */ 0xe78c96, 0xe798a1, 0xe7aa93, 0xe884b9,
+ /* ed */ 0xe88999, 0xe88f96, 0xe892bc, 0xe582b5,
+ /* f1 */ 0xe59fb0, 0xe5af80, 0xe5afa8, 0xe5bda9,
+ /* f5 */ 0xe68ea1, 0xe7a0a6, 0xe7b6b5, 0xe88f9c,
+ /* f9 */ 0xe894a1, 0xe98787, 0xe987b5, 0xe5868a,
+ /* fd */ 0xe69fb5, 0xe7ad96,
+
+ /*** Two byte table, leaf: f5xx - offset 0x055c5 ***/
+
+ /* 31 */ 0xe8b2ac, 0xe58784, 0xe5a6bb, 0xe682bd,
+ /* 35 */ 0xe89995, 0xe5809c, 0xefa7bf, 0xe58994,
+ /* 39 */ 0xe5b0ba, 0xe685bd, 0xe6889a, 0xe68b93,
+ /* 3d */ 0xe693b2, 0xe696a5, 0xe6bb8c, 0xe798a0,
+ /* 41 */ 0xe8848a, 0xe8b9a0, 0xe9999f, 0xe99abb,
+ /* 45 */ 0xe4bb9f, 0xe58d83, 0xe59698, 0xe5a4a9,
+ /* 49 */ 0xe5b79d, 0xe69385, 0xe6b389, 0xe6b7ba,
+ /* 4d */ 0xe78e94, 0xe7a9bf, 0xe8889b, 0xe896a6,
+ /* 51 */ 0xe8b3a4, 0xe8b890, 0xe981b7, 0xe987a7,
+ /* 55 */ 0xe997a1, 0xe998a1, 0xe99f86, 0xe587b8,
+ /* 59 */ 0xe593b2, 0xe59686, 0xe5beb9, 0xe692a4,
+ /* 5d */ 0xe6be88, 0xe7b6b4, 0xe8bc9f, 0xe8bd8d,
+ /* 61 */ 0xe990b5, 0xe58389, 0xe5b096, 0xe6b2be,
+ /* 65 */ 0xe6b7bb, 0xe7949b, 0xe79ebb, 0xe7b0bd,
+ /* 69 */ 0xe7b1a4, 0xe8a9b9, 0xe8ab82, 0xe5a09e,
+ /* 6d */ 0xe5a6be, 0xe5b896, 0xe68db7, 0xe78992,
+ /* 71 */ 0xe7968a, 0xe79dab, 0xe8ab9c, 0xe8b2bc,
+ /* 75 */ 0xe8bc92, 0xe5bbb3, 0xe699b4, 0xe6b7b8,
+ /* 79 */ 0xe881bd, 0xe88f81, 0xe8ab8b, 0xe99d91,
+ /* 7d */ 0xe9af96, 0xefa880, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe58983, 0xe69bbf, 0xe6b695, 0xe6bbaf,
+ /* 95 */ 0xe7b7a0, 0xe8aba6, 0xe980ae, 0xe9819e,
+ /* 99 */ 0xe9ab94, 0xe5889d, 0xe589bf, 0xe593a8,
+ /* 9d */ 0xe68694, 0xe68a84, 0xe68b9b, 0xe6a2a2,
+ /* a1 */ 0xe6a492, 0xe6a59a, 0xe6a8b5, 0xe78292,
+ /* a5 */ 0xe784a6, 0xe7a19d, 0xe7a481, 0xe7a48e,
+ /* a9 */ 0xe7a792, 0xe7a88d, 0xe88296, 0xe889b8,
+ /* ad */ 0xe88b95, 0xe88d89, 0xe89589, 0xe8b282,
+ /* b1 */ 0xe8b685, 0xe985a2, 0xe9868b, 0xe986ae,
+ /* b5 */ 0xe4bf83, 0xe59b91, 0xe787ad, 0xe79f97,
+ /* b9 */ 0xe89c80, 0xe8a7b8, 0xe5afb8, 0xe5bf96,
+ /* bd */ 0xe69d91, 0xe982a8, 0xe58fa2, 0xe5a19a,
+ /* c1 */ 0xe5afb5, 0xe682a4, 0xe68681, 0xe691a0,
+ /* c5 */ 0xe7b8bd, 0xe881b0, 0xe894a5, 0xe98a83,
+ /* c9 */ 0xe692ae, 0xe582ac, 0xe5b494, 0xe69c80,
+ /* cd */ 0xe5a29c, 0xe68abd, 0xe68ea8, 0xe6a48e,
+ /* d1 */ 0xe6a5b8, 0xe6a89e, 0xe6b9ab, 0xe79aba,
+ /* d5 */ 0xe7a78b, 0xe88abb, 0xe890a9, 0xe8ab8f,
+ /* d9 */ 0xe8b6a8, 0xe8bfbd, 0xe98492, 0xe9858b,
+ /* dd */ 0xe9869c, 0xe98c90, 0xe98c98, 0xe98e9a,
+ /* e1 */ 0xe99b9b, 0xe9a8b6, 0xe9b08d, 0xe4b891,
+ /* e5 */ 0xe7959c, 0xe7a59d, 0xe7abba, 0xe7ad91,
+ /* e9 */ 0xe7af89, 0xe7b8ae, 0xe89384, 0xe8b999,
+ /* ed */ 0xe8b9b4, 0xe8bbb8, 0xe98090, 0xe698a5,
+ /* f1 */ 0xe6a4bf, 0xe79183, 0xe587ba, 0xe69cae,
+ /* f5 */ 0xe9bb9c, 0xe58585, 0xe5bfa0, 0xe6b296,
+ /* f9 */ 0xe89fb2, 0xe8a19d, 0xe8a1b7, 0xe682b4,
+ /* fd */ 0xe886b5, 0xe89083,
+
+ /*** Two byte table, leaf: f6xx - offset 0x05693 ***/
+
+ /* 31 */ 0xe8b485, 0xe58f96, 0xe590b9, 0xe598b4,
+ /* 35 */ 0xe5a8b6, 0xe5b0b1, 0xe7828a, 0xe7bfa0,
+ /* 39 */ 0xe8819a, 0xe88486, 0xe887ad, 0xe8b6a3,
+ /* 3d */ 0xe98689, 0xe9a99f, 0xe9b7b2, 0xe581b4,
+ /* 41 */ 0xe4bb84, 0xe58ea0, 0xe683bb, 0xe6b8ac,
+ /* 45 */ 0xe5b1a4, 0xe4be88, 0xe580a4, 0xe597a4,
+ /* 49 */ 0xe5b399, 0xe5b99f, 0xe681a5, 0xe6a294,
+ /* 4d */ 0xe6b2bb, 0xe6b784, 0xe786be, 0xe79794,
+ /* 51 */ 0xe797b4, 0xe799a1, 0xe7a89a, 0xe7a989,
+ /* 55 */ 0xe7b787, 0xe7b7bb, 0xe7bdae, 0xe887b4,
+ /* 59 */ 0xe89aa9, 0xe8bc9c, 0xe99b89, 0xe9a6b3,
+ /* 5d */ 0xe9bd92, 0xe58987, 0xe58b85, 0xe9a3ad,
+ /* 61 */ 0xe8a6aa, 0xe4b883, 0xe69f92, 0xe6bc86,
+ /* 65 */ 0xe4beb5, 0xe5afa2, 0xe69e95, 0xe6b288,
+ /* 69 */ 0xe6b5b8, 0xe7909b, 0xe7a0a7, 0xe9879d,
+ /* 6d */ 0xe98dbc, 0xe89f84, 0xe7a7a4, 0xe7a8b1,
+ /* 71 */ 0xe5bfab, 0xe4bb96, 0xe592a4, 0xe594be,
+ /* 75 */ 0xe5a2ae, 0xe5a6a5, 0xe683b0, 0xe68993,
+ /* 79 */ 0xe68b96, 0xe69cb6, 0xe6a595, 0xe888b5,
+ /* 7d */ 0xe99980, 0xe9a6b1, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe9a79d, 0xe580ac, 0xe58d93, 0xe59584,
+ /* 95 */ 0xe59dbc, 0xefa881, 0xe68998, 0xefa882,
+ /* 99 */ 0xe693a2, 0xe699ab, 0xe69f9d, 0xe6bf81,
+ /* 9d */ 0xe6bfaf, 0xe790a2, 0xe790b8, 0xe8a897,
+ /* a1 */ 0xe990b8, 0xe59191, 0xe59886, 0xe59da6,
+ /* a5 */ 0xe5bd88, 0xe6869a, 0xe6ad8e, 0xe78198,
+ /* a9 */ 0xe782ad, 0xe7b6bb, 0xe8aa95, 0xe5a5aa,
+ /* ad */ 0xe884ab, 0xe68ea2, 0xe79c88, 0xe880bd,
+ /* b1 */ 0xe8b2aa, 0xe5a194, 0xe690ad, 0xe6a6bb,
+ /* b5 */ 0xe5ae95, 0xe5b891, 0xe6b9af, 0xefa883,
+ /* b9 */ 0xe895a9, 0xe5858c, 0xe58fb0, 0xe5a4aa,
+ /* bd */ 0xe680a0, 0xe6858b, 0xe6ae86, 0xe6b1b0,
+ /* c1 */ 0xe6b3b0, 0xe7ac9e, 0xe8838e, 0xe88b94,
+ /* c5 */ 0xe8b786, 0xe982b0, 0xe9a2b1, 0xefa884,
+ /* c9 */ 0xe69387, 0xe6bea4, 0xe69291, 0xe69484,
+ /* cd */ 0xe5858e, 0xe59090, 0xe59c9f, 0xe8a88e,
+ /* d1 */ 0xe6859f, 0xe6a1b6, 0xefa885, 0xe7979b,
+ /* d5 */ 0xe7ad92, 0xe7b5b1, 0xe9809a, 0xe5a086,
+ /* d9 */ 0xe6a78c, 0xe885bf, 0xe8a4aa, 0xe98080,
+ /* dd */ 0xe9a0b9, 0xe581b8, 0xe5a597, 0xe5a6ac,
+ /* e1 */ 0xe68a95, 0xe9808f, 0xe9acaa, 0xe6859d,
+ /* e5 */ 0xe789b9, 0xe99796, 0xe59da1, 0xe5a986,
+ /* e9 */ 0xe5b7b4, 0xe68a8a, 0xe692ad, 0xe693ba,
+ /* ed */ 0xe69db7, 0xe6b3a2, 0xe6b4be, 0xe788ac,
+ /* f1 */ 0xe790b6, 0xe7a0b4, 0xe7bdb7, 0xe88aad,
+ /* f5 */ 0xe8b79b, 0xe9a097, 0xe588a4, 0xe59d82,
+ /* f9 */ 0xe69dbf, 0xe78988, 0xe793a3, 0xe8b2a9,
+ /* fd */ 0xe8bea6, 0xe98891,
+
+ /*** Two byte table, leaf: f7xx - offset 0x05761 ***/
+
+ /* 31 */ 0xe998aa, 0xe585ab, 0xe58fad, 0xe68d8c,
+ /* 35 */ 0xe4bda9, 0xe59484, 0xe68296, 0xe69597,
+ /* 39 */ 0xe6b29b, 0xe6b5bf, 0xe7898c, 0xe78bbd,
+ /* 3d */ 0xe7a897, 0xe8a687, 0xe8b29d, 0xe5bdad,
+ /* 41 */ 0xe6be8e, 0xe783b9, 0xe886a8, 0xe6848e,
+ /* 45 */ 0xe4bebf, 0xe5818f, 0xe68981, 0xe78987,
+ /* 49 */ 0xe7af87, 0xe7b7a8, 0xe7bfa9, 0xe9818d,
+ /* 4d */ 0xe99ead, 0xe9a899, 0xe8b2b6, 0xe59daa,
+ /* 51 */ 0xe5b9b3, 0xe69eb0, 0xe8908d, 0xe8a995,
+ /* 55 */ 0xe590a0, 0xe5ac96, 0xe5b9a3, 0xe5bba2,
+ /* 59 */ 0xe5bc8a, 0xe69683, 0xe882ba, 0xe894bd,
+ /* 5d */ 0xe99689, 0xe9999b, 0xe4bd88, 0xe58c85,
+ /* 61 */ 0xe58c8d, 0xe58c8f, 0xe59286, 0xe593ba,
+ /* 65 */ 0xe59c83, 0xe5b883, 0xe68096, 0xe68a9b,
+ /* 69 */ 0xe68ab1, 0xe68d95, 0xefa886, 0xe6b3a1,
+ /* 6d */ 0xe6b5a6, 0xe796b1, 0xe7a0b2, 0xe8839e,
+ /* 71 */ 0xe884af, 0xe88b9e, 0xe891a1, 0xe892b2,
+ /* 75 */ 0xe8a28d, 0xe8a492, 0xe9808b, 0xe98baa,
+ /* 79 */ 0xe9a3bd, 0xe9ae91, 0xe5b985, 0xe69ab4,
+ /* 7d */ 0xe69b9d, 0xe78091, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe78886, 0xefa887, 0xe4bfb5, 0xe589bd,
+ /* 95 */ 0xe5bdaa, 0xe68593, 0xe69d93, 0xe6a899,
+ /* 99 */ 0xe6bc82, 0xe793a2, 0xe7a5a8, 0xe8a1a8,
+ /* 9d */ 0xe8b1b9, 0xe9a387, 0xe9a384, 0xe9a983,
+ /* a1 */ 0xe59381, 0xe7a89f, 0xe6a593, 0xe8abb7,
+ /* a5 */ 0xe8b18a, 0xe9a2a8, 0xe9a6ae, 0xe5bdbc,
+ /* a9 */ 0xe68aab, 0xe796b2, 0xe79aae, 0xe8a2ab,
+ /* ad */ 0xe981bf, 0xe99982, 0xe58cb9, 0xe5bcbc,
+ /* b1 */ 0xe5bf85, 0xe6b38c, 0xe78f8c, 0xe795a2,
+ /* b5 */ 0xe7968b, 0xe7ad86, 0xe88bbe, 0xe9a69d,
+ /* b9 */ 0xe4b98f, 0xe980bc, 0xe4b88b, 0xe4bd95,
+ /* bd */ 0xe58ea6, 0xe5a48f, 0xe5bb88, 0xe698b0,
+ /* c1 */ 0xe6b2b3, 0xe79195, 0xe88db7, 0xe89da6,
+ /* c5 */ 0xe8b380, 0xe98190, 0xe99c9e, 0xe9b095,
+ /* c9 */ 0xe5a391, 0xe5adb8, 0xe89990, 0xe8ac94,
+ /* cd */ 0xe9b6b4, 0xe5af92, 0xe681a8, 0xe6828d,
+ /* d1 */ 0xe697b1, 0xe6b197, 0xe6bca2, 0xe6bea3,
+ /* d5 */ 0xe7809a, 0xe7bd95, 0xe7bfb0, 0xe99691,
+ /* d9 */ 0xe99692, 0xe99990, 0xe99f93, 0xe589b2,
+ /* dd */ 0xe8bd84, 0xe587bd, 0xe590ab, 0xe592b8,
+ /* e1 */ 0xe595a3, 0xe5968a, 0xe6aabb, 0xe6b6b5,
+ /* e5 */ 0xe7b798, 0xe889a6, 0xe98a9c, 0xe999b7,
+ /* e9 */ 0xe9b9b9, 0xe59088, 0xe59388, 0xe79b92,
+ /* ed */ 0xe89ba4, 0xe996a4, 0xe99794, 0xe9999c,
+ /* f1 */ 0xe4baa2, 0xe4bc89, 0xe5a7ae, 0xe5aba6,
+ /* f5 */ 0xe5b7b7, 0xe68192, 0xe68a97, 0xe69dad,
+ /* f9 */ 0xe6a181, 0xe6b286, 0xe6b8af, 0xe7bcb8,
+ /* fd */ 0xe8829b, 0xe888aa,
+
+ /*** Two byte table, leaf: f8xx - offset 0x0582f ***/
+
+ /* 31 */ 0xefa888, 0xefa889, 0xe9a085, 0xe4baa5,
+ /* 35 */ 0xe58195, 0xe592b3, 0xe59e93, 0xe5a59a,
+ /* 39 */ 0xe5ada9, 0xe5aeb3, 0xe68788, 0xe6a5b7,
+ /* 3d */ 0xe6b5b7, 0xe780a3, 0xe89fb9, 0xe8a7a3,
+ /* 41 */ 0xe8a9b2, 0xe8aba7, 0xe98282, 0xe9a7ad,
+ /* 45 */ 0xe9aab8, 0xe58abe, 0xe6a0b8, 0xe58096,
+ /* 49 */ 0xe5b9b8, 0xe69d8f, 0xe88d87, 0xe8a18c,
+ /* 4d */ 0xe4baab, 0xe59091, 0xe59aae, 0xe78fa6,
+ /* 51 */ 0xe98495, 0xe99fbf, 0xe9a489, 0xe9a597,
+ /* 55 */ 0xe9a699, 0xe59993, 0xe5a29f, 0xe8999b,
+ /* 59 */ 0xe8a8b1, 0xe686b2, 0xe6abb6, 0xe78dbb,
+ /* 5d */ 0xe8bb92, 0xe6ad87, 0xe99aaa, 0xe9a997,
+ /* 61 */ 0xe5a595, 0xe78880, 0xe8b5ab, 0xe99da9,
+ /* 65 */ 0xe4bf94, 0xe5b3b4, 0xe5bca6, 0xe687b8,
+ /* 69 */ 0xe6999b, 0xe6b3ab, 0xe782ab, 0xe78e84,
+ /* 6d */ 0xe78eb9, 0xe78fbe, 0xe79ca9, 0xe79d8d,
+ /* 71 */ 0xe7b583, 0xe7b5a2, 0xe7b8a3, 0xe888b7,
+ /* 75 */ 0xe8a192, 0xefa88a, 0xe8b3a2, 0xe98989,
+ /* 79 */ 0xe9a1af, 0xe5ad91, 0xe7a9b4, 0xe8a180,
+ /* 7d */ 0xe9a081, 0xe5ab8c, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe4bfa0, 0xe58d94, 0xe5a4be, 0xe5b3bd,
+ /* 95 */ 0xe68cbe, 0xe6b5b9, 0xe78bb9, 0xe88485,
+ /* 99 */ 0xe88487, 0xe88ea2, 0xe98b8f, 0xe9a0b0,
+ /* 9d */ 0xe4baa8, 0xe58584, 0xe58891, 0xe59e8b,
+ /* a1 */ 0xe5bda2, 0xe6b382, 0xe6bb8e, 0xe78085,
+ /* a5 */ 0xe78190, 0xe782af, 0xe78692, 0xe78fa9,
+ /* a9 */ 0xe791a9, 0xe88d8a, 0xe89ea2, 0xe8a1a1,
+ /* ad */ 0xe98088, 0xe982a2, 0xe98ea3, 0xe9a6a8,
+ /* b1 */ 0xe585ae, 0xe5bd97, 0xe683a0, 0xe685a7,
+ /* b5 */ 0xe69ab3, 0xe89599, 0xe8b98a, 0xe986af,
+ /* b9 */ 0xe99e8b, 0xe4b98e, 0xe4ba92, 0xe591bc,
+ /* bd */ 0xe5a395, 0xe5a3ba, 0xe5a5bd, 0xe5b2b5,
+ /* c1 */ 0xe5bca7, 0xe688b6, 0xe68988, 0xe6988a,
+ /* c5 */ 0xe699a7, 0xe6afab, 0xe6b5a9, 0xe6b78f,
+ /* c9 */ 0xe6b996, 0xe6bbb8, 0xe6be94, 0xe6bfa0,
+ /* cd */ 0xe6bfa9, 0xe7819d, 0xe78b90, 0xe790a5,
+ /* d1 */ 0xe7919a, 0xe793a0, 0xe79a93, 0xe7a59c,
+ /* d5 */ 0xe7b38a, 0xe7b89e, 0xe883a1, 0xe88aa6,
+ /* d9 */ 0xe891ab, 0xe892bf, 0xe8998e, 0xe8999f,
+ /* dd */ 0xe89db4, 0xe8adb7, 0xe8b1aa, 0xe98eac,
+ /* e1 */ 0xe9a080, 0xe9a1a5, 0xe68391, 0xe68896,
+ /* e5 */ 0xe985b7, 0xe5a99a, 0xe6988f, 0xe6b7b7,
+ /* e9 */ 0xe6b8be, 0xe790bf, 0xe9ad82, 0xe5bfbd,
+ /* ed */ 0xe6839a, 0xe7ac8f, 0xe59384, 0xe5bc98,
+ /* f1 */ 0xe6b19e, 0xe6b393, 0xe6b4aa, 0xe78398,
+ /* f5 */ 0xe7b485, 0xe899b9, 0xe8a88c, 0xe9b4bb,
+ /* f9 */ 0xe58c96, 0xe5928c, 0xe5ac85, 0xe6a8ba,
+ /* fd */ 0xe781ab, 0xe795b5,
+
+ /*** Two byte table, leaf: f9xx - offset 0x058fd ***/
+
+ /* 31 */ 0xe7a68d, 0xe7a6be, 0xe88ab1, 0xe88faf,
+ /* 35 */ 0xe8a9b1, 0xe8ad81, 0xe8b2a8, 0xe99db4,
+ /* 39 */ 0xefa88b, 0xe693b4, 0xe694ab, 0xe7a2ba,
+ /* 3d */ 0xe7a2bb, 0xe7a9ab, 0xe4b8b8, 0xe5969a,
+ /* 41 */ 0xe5a590, 0xe5aea6, 0xe5b9bb, 0xe682a3,
+ /* 45 */ 0xe68f9b, 0xe6ada1, 0xe699a5, 0xe6a193,
+ /* 49 */ 0xe6b899, 0xe785a5, 0xe792b0, 0xe7b488,
+ /* 4d */ 0xe98284, 0xe9a9a9, 0xe9b0a5, 0xe6b4bb,
+ /* 51 */ 0xe6bb91, 0xe78cbe, 0xe8b181, 0xe9978a,
+ /* 55 */ 0xe587b0, 0xe5b98c, 0xe5bea8, 0xe6818d,
+ /* 59 */ 0xe683b6, 0xe684b0, 0xe6858c, 0xe69983,
+ /* 5d */ 0xe69984, 0xe6a6a5, 0xe6b381, 0xe6b99f,
+ /* 61 */ 0xe6bb89, 0xe6bda2, 0xe7858c, 0xe7929c,
+ /* 65 */ 0xe79a87, 0xe7af81, 0xe7b0a7, 0xe88d92,
+ /* 69 */ 0xe89d97, 0xe98191, 0xe99a8d, 0xe9bb83,
+ /* 6d */ 0xe58caf, 0xe59b9e, 0xe5bbbb, 0xe5be8a,
+ /* 71 */ 0xe681a2, 0xe68294, 0xe687b7, 0xe699a6,
+ /* 75 */ 0xe69c83, 0xe6aa9c, 0xe6b7ae, 0xe6beae,
+ /* 79 */ 0xe781b0, 0xe78daa, 0xe7b9aa, 0xe886be,
+ /* 7d */ 0xe88cb4, 0xe89b94, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0xe8aaa8, 0xe8b384, 0xe58a83, 0xe78db2,
+ /* 95 */ 0xe5ae96, 0xe6a9ab, 0xe99084, 0xe593ae,
+ /* 99 */ 0xe59a86, 0xe5ad9d, 0xe69588, 0xe69685,
+ /* 9d */ 0xe69b89, 0xe6a29f, 0xe6b68d, 0xe6b786,
+ /* a1 */ 0xe788bb, 0xe882b4, 0xe985b5, 0xe9a98d,
+ /* a5 */ 0xe4beaf, 0xe58099, 0xe58e9a, 0xe5908e,
+ /* a9 */ 0xe590bc, 0xe59689, 0xe59785, 0xe5b8bf,
+ /* ad */ 0xe5be8c, 0xe69cbd, 0xe785a6, 0xe78f9d,
+ /* b1 */ 0xe98085, 0xe58b9b, 0xe58bb3, 0xe5a1a4,
+ /* b5 */ 0xe5a38e, 0xe78484, 0xe7868f, 0xe787bb,
+ /* b9 */ 0xe896b0, 0xe8a893, 0xe69a88, 0xe896a8,
+ /* bd */ 0xe596a7, 0xe69a84, 0xe7858a, 0xe890b1,
+ /* c1 */ 0xe58d89, 0xe59699, 0xe6af81, 0xe5bd99,
+ /* c5 */ 0xe5bebd, 0xe68fae, 0xe69a89, 0xe78587,
+ /* c9 */ 0xe8abb1, 0xe8bc9d, 0xe9babe, 0xe4bc91,
+ /* cd */ 0xe690ba, 0xe7838b, 0xe795a6, 0xe899a7,
+ /* d1 */ 0xe681a4, 0xe8ad8e, 0xe9b7b8, 0xe58587,
+ /* d5 */ 0xe587b6, 0xe58c88, 0xe6b4b6, 0xe883b8,
+ /* d9 */ 0xe9bb91, 0xe69895, 0xe6aca3, 0xe78298,
+ /* dd */ 0xe79795, 0xe59083, 0xe5b1b9, 0xe7b487,
+ /* e1 */ 0xe8a896, 0xe6aca0, 0xe6acbd, 0xe6ad86,
+ /* e5 */ 0xe590b8, 0xe681b0, 0xe6b4bd, 0xe7bf95,
+ /* e9 */ 0xe88888, 0xe58396, 0xe5879e, 0xe5969c,
+ /* ed */ 0xe599ab, 0xe59b8d, 0xe5a7ac, 0xe5ac89,
+ /* f1 */ 0xe5b88c, 0xe68699, 0xe68698, 0xe688b1,
+ /* f5 */ 0xe6999e, 0xe69ba6, 0xe78699, 0xe786b9,
+ /* f9 */ 0xe786ba, 0xe78aa7, 0xe7a6a7, 0xe7a880,
+ /* fd */ 0xe7beb2, 0xe8a9b0
+};
diff --git a/src/backend/utils/mb/Unicode/koi8r_to_utf8.map b/src/backend/utils/mb/Unicode/koi8r_to_utf8.map
new file mode 100644
index 0000000..2631c3a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/koi8r_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/koi8r_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 koi8r_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree koi8r_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ koi8r_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 koi8r_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* 84 */ 0xe29494, 0xe29498, 0xe2949c, 0xe294a4,
+ /* 88 */ 0xe294ac, 0xe294b4, 0xe294bc, 0xe29680,
+ /* 8c */ 0xe29684, 0xe29688, 0xe2968c, 0xe29690,
+ /* 90 */ 0xe29691, 0xe29692, 0xe29693, 0xe28ca0,
+ /* 94 */ 0xe296a0, 0xe28899, 0xe2889a, 0xe28988,
+ /* 98 */ 0xe289a4, 0xe289a5, 0x00c2a0, 0xe28ca1,
+ /* 9c */ 0x00c2b0, 0x00c2b2, 0x00c2b7, 0x00c3b7,
+ /* a0 */ 0xe29590, 0xe29591, 0xe29592, 0x00d191,
+ /* a4 */ 0xe29593, 0xe29594, 0xe29595, 0xe29596,
+ /* a8 */ 0xe29597, 0xe29598, 0xe29599, 0xe2959a,
+ /* ac */ 0xe2959b, 0xe2959c, 0xe2959d, 0xe2959e,
+ /* b0 */ 0xe2959f, 0xe295a0, 0xe295a1, 0x00d081,
+ /* b4 */ 0xe295a2, 0xe295a3, 0xe295a4, 0xe295a5,
+ /* b8 */ 0xe295a6, 0xe295a7, 0xe295a8, 0xe295a9,
+ /* bc */ 0xe295aa, 0xe295ab, 0xe295ac, 0x00c2a9,
+ /* c0 */ 0x00d18e, 0x00d0b0, 0x00d0b1, 0x00d186,
+ /* c4 */ 0x00d0b4, 0x00d0b5, 0x00d184, 0x00d0b3,
+ /* c8 */ 0x00d185, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* cc */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* d0 */ 0x00d0bf, 0x00d18f, 0x00d180, 0x00d181,
+ /* d4 */ 0x00d182, 0x00d183, 0x00d0b6, 0x00d0b2,
+ /* d8 */ 0x00d18c, 0x00d18b, 0x00d0b7, 0x00d188,
+ /* dc */ 0x00d18d, 0x00d189, 0x00d187, 0x00d18a,
+ /* e0 */ 0x00d0ae, 0x00d090, 0x00d091, 0x00d0a6,
+ /* e4 */ 0x00d094, 0x00d095, 0x00d0a4, 0x00d093,
+ /* e8 */ 0x00d0a5, 0x00d098, 0x00d099, 0x00d09a,
+ /* ec */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* f0 */ 0x00d09f, 0x00d0af, 0x00d0a0, 0x00d0a1,
+ /* f4 */ 0x00d0a2, 0x00d0a3, 0x00d096, 0x00d092,
+ /* f8 */ 0x00d0ac, 0x00d0ab, 0x00d097, 0x00d0a8,
+ /* fc */ 0x00d0ad, 0x00d0a9, 0x00d0a7, 0x00d0aa
+};
diff --git a/src/backend/utils/mb/Unicode/koi8u_to_utf8.map b/src/backend/utils/mb/Unicode/koi8u_to_utf8.map
new file mode 100644
index 0000000..61265f4
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/koi8u_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/koi8u_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 koi8u_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree koi8u_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ koi8u_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 koi8u_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* 84 */ 0xe29494, 0xe29498, 0xe2949c, 0xe294a4,
+ /* 88 */ 0xe294ac, 0xe294b4, 0xe294bc, 0xe29680,
+ /* 8c */ 0xe29684, 0xe29688, 0xe2968c, 0xe29690,
+ /* 90 */ 0xe29691, 0xe29692, 0xe29693, 0xe28ca0,
+ /* 94 */ 0xe296a0, 0xe28899, 0xe2889a, 0xe28988,
+ /* 98 */ 0xe289a4, 0xe289a5, 0x00c2a0, 0xe28ca1,
+ /* 9c */ 0x00c2b0, 0x00c2b2, 0x00c2b7, 0x00c3b7,
+ /* a0 */ 0xe29590, 0xe29591, 0xe29592, 0x00d191,
+ /* a4 */ 0x00d194, 0xe29594, 0x00d196, 0x00d197,
+ /* a8 */ 0xe29597, 0xe29598, 0xe29599, 0xe2959a,
+ /* ac */ 0xe2959b, 0x00d291, 0xe2959d, 0xe2959e,
+ /* b0 */ 0xe2959f, 0xe295a0, 0xe295a1, 0x00d081,
+ /* b4 */ 0x00d084, 0xe295a3, 0x00d086, 0x00d087,
+ /* b8 */ 0xe295a6, 0xe295a7, 0xe295a8, 0xe295a9,
+ /* bc */ 0xe295aa, 0x00d290, 0xe295ac, 0x00c2a9,
+ /* c0 */ 0x00d18e, 0x00d0b0, 0x00d0b1, 0x00d186,
+ /* c4 */ 0x00d0b4, 0x00d0b5, 0x00d184, 0x00d0b3,
+ /* c8 */ 0x00d185, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* cc */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* d0 */ 0x00d0bf, 0x00d18f, 0x00d180, 0x00d181,
+ /* d4 */ 0x00d182, 0x00d183, 0x00d0b6, 0x00d0b2,
+ /* d8 */ 0x00d18c, 0x00d18b, 0x00d0b7, 0x00d188,
+ /* dc */ 0x00d18d, 0x00d189, 0x00d187, 0x00d18a,
+ /* e0 */ 0x00d0ae, 0x00d090, 0x00d091, 0x00d0a6,
+ /* e4 */ 0x00d094, 0x00d095, 0x00d0a4, 0x00d093,
+ /* e8 */ 0x00d0a5, 0x00d098, 0x00d099, 0x00d09a,
+ /* ec */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* f0 */ 0x00d09f, 0x00d0af, 0x00d0a0, 0x00d0a1,
+ /* f4 */ 0x00d0a2, 0x00d0a3, 0x00d096, 0x00d092,
+ /* f8 */ 0x00d0ac, 0x00d0ab, 0x00d097, 0x00d0a8,
+ /* fc */ 0x00d0ad, 0x00d0a9, 0x00d0a7, 0x00d0aa
+};
diff --git a/src/backend/utils/mb/Unicode/shift_jis_2004_to_utf8.map b/src/backend/utils/mb/Unicode/shift_jis_2004_to_utf8.map
new file mode 100644
index 0000000..e4ba059
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/shift_jis_2004_to_utf8.map
@@ -0,0 +1,3234 @@
+/* src/backend/utils/mb/Unicode/shift_jis_2004_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl */
+
+static const uint32 shift_jis_2004_to_unicode_tree_table[11716];
+
+static const pg_mb_radix_tree shift_jis_2004_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ shift_jis_2004_to_unicode_tree_table,
+
+ 0x00bd, /* offset of table for 1-byte inputs */
+ 0xa1, /* b1_lower */
+ 0xdf, /* b1_upper */
+
+ 0x00fc, /* offset of table for 2-byte inputs */
+ 0x81, /* b2_1_lower */
+ 0xfc, /* b2_1_upper */
+ 0x40, /* b2_2_lower */
+ 0xfc, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 shift_jis_2004_to_unicode_tree_table[11716] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 04 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 08 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 0c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 10 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 14 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 18 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 1c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 20 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 24 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 28 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 2c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 30 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 34 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 38 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 3c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 44 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 48 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 4c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 50 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 54 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 58 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 5c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 60 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 64 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 68 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 6c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 70 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 74 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 78 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 7c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000,
+
+ /*** Single byte table, leaf: xx - offset 0x000bd ***/
+
+ /* a1 */ 0x00efbda1, 0x00efbda2, 0x00efbda3, 0x00efbda4,
+ /* a5 */ 0x00efbda5, 0x00efbda6, 0x00efbda7, 0x00efbda8,
+ /* a9 */ 0x00efbda9, 0x00efbdaa, 0x00efbdab, 0x00efbdac,
+ /* ad */ 0x00efbdad, 0x00efbdae, 0x00efbdaf, 0x00efbdb0,
+ /* b1 */ 0x00efbdb1, 0x00efbdb2, 0x00efbdb3, 0x00efbdb4,
+ /* b5 */ 0x00efbdb5, 0x00efbdb6, 0x00efbdb7, 0x00efbdb8,
+ /* b9 */ 0x00efbdb9, 0x00efbdba, 0x00efbdbb, 0x00efbdbc,
+ /* bd */ 0x00efbdbd, 0x00efbdbe, 0x00efbdbf, 0x00efbe80,
+ /* c1 */ 0x00efbe81, 0x00efbe82, 0x00efbe83, 0x00efbe84,
+ /* c5 */ 0x00efbe85, 0x00efbe86, 0x00efbe87, 0x00efbe88,
+ /* c9 */ 0x00efbe89, 0x00efbe8a, 0x00efbe8b, 0x00efbe8c,
+ /* cd */ 0x00efbe8d, 0x00efbe8e, 0x00efbe8f, 0x00efbe90,
+ /* d1 */ 0x00efbe91, 0x00efbe92, 0x00efbe93, 0x00efbe94,
+ /* d5 */ 0x00efbe95, 0x00efbe96, 0x00efbe97, 0x00efbe98,
+ /* d9 */ 0x00efbe99, 0x00efbe9a, 0x00efbe9b, 0x00efbe9c,
+ /* dd */ 0x00efbe9d, 0x00efbe9e, 0x00efbe9f,
+
+ /*** Two byte table, byte #1: xx - offset 0x000fc ***/
+
+ /* 81 */ 0x00000178, 0x00000235, 0x000002f2, 0x000003af,
+ /* 85 */ 0x0000046c, 0x00000529, 0x000005e6, 0x000006a3,
+ /* 89 */ 0x00000760, 0x0000081d, 0x000008da, 0x00000997,
+ /* 8d */ 0x00000a54, 0x00000b11, 0x00000bce, 0x00000c8b,
+ /* 91 */ 0x00000d48, 0x00000e05, 0x00000ec2, 0x00000f7f,
+ /* 95 */ 0x0000103c, 0x000010f9, 0x000011b6, 0x00001273,
+ /* 99 */ 0x00001330, 0x000013ed, 0x000014aa, 0x00001567,
+ /* 9d */ 0x00001624, 0x000016e1, 0x0000179e, 0x00000000,
+ /* a1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ad */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bd */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* c9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* cd */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d1 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d5 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* d9 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* dd */ 0x00000000, 0x00000000, 0x00000000, 0x0000185b,
+ /* e1 */ 0x00001918, 0x000019d5, 0x00001a92, 0x00001b4f,
+ /* e5 */ 0x00001c0c, 0x00001cc9, 0x00001d86, 0x00001e43,
+ /* e9 */ 0x00001f00, 0x00001fbd, 0x0000207a, 0x00002137,
+ /* ed */ 0x000021f4, 0x000022b1, 0x0000236e, 0x0000242b,
+ /* f1 */ 0x000024e8, 0x000025a5, 0x00002662, 0x0000271f,
+ /* f5 */ 0x000027dc, 0x00002899, 0x00002956, 0x00002a13,
+ /* f9 */ 0x00002ad0, 0x00002b8d, 0x00002c4a, 0x00002d07,
+
+ /*** Two byte table, leaf: 81xx - offset 0x00178 ***/
+
+ /* 40 */ 0x00e38080, 0x00e38081, 0x00e38082, 0x00efbc8c,
+ /* 44 */ 0x00efbc8e, 0x00e383bb, 0x00efbc9a, 0x00efbc9b,
+ /* 48 */ 0x00efbc9f, 0x00efbc81, 0x00e3829b, 0x00e3829c,
+ /* 4c */ 0x0000c2b4, 0x00efbd80, 0x0000c2a8, 0x00efbcbe,
+ /* 50 */ 0x00efbfa3, 0x00efbcbf, 0x00e383bd, 0x00e383be,
+ /* 54 */ 0x00e3829d, 0x00e3829e, 0x00e38083, 0x00e4bb9d,
+ /* 58 */ 0x00e38085, 0x00e38086, 0x00e38087, 0x00e383bc,
+ /* 5c */ 0x00e28094, 0x00e28090, 0x00efbc8f, 0x0000005c,
+ /* 60 */ 0x00e3809c, 0x00e28096, 0x00efbd9c, 0x00e280a6,
+ /* 64 */ 0x00e280a5, 0x00e28098, 0x00e28099, 0x00e2809c,
+ /* 68 */ 0x00e2809d, 0x00efbc88, 0x00efbc89, 0x00e38094,
+ /* 6c */ 0x00e38095, 0x00efbcbb, 0x00efbcbd, 0x00efbd9b,
+ /* 70 */ 0x00efbd9d, 0x00e38088, 0x00e38089, 0x00e3808a,
+ /* 74 */ 0x00e3808b, 0x00e3808c, 0x00e3808d, 0x00e3808e,
+ /* 78 */ 0x00e3808f, 0x00e38090, 0x00e38091, 0x00efbc8b,
+ /* 7c */ 0x00e28892, 0x0000c2b1, 0x0000c397, 0x00000000,
+ /* 80 */ 0x0000c3b7, 0x00efbc9d, 0x00e289a0, 0x00efbc9c,
+ /* 84 */ 0x00efbc9e, 0x00e289a6, 0x00e289a7, 0x00e2889e,
+ /* 88 */ 0x00e288b4, 0x00e29982, 0x00e29980, 0x0000c2b0,
+ /* 8c */ 0x00e280b2, 0x00e280b3, 0x00e28483, 0x00efbfa5,
+ /* 90 */ 0x00efbc84, 0x0000c2a2, 0x0000c2a3, 0x00efbc85,
+ /* 94 */ 0x00efbc83, 0x00efbc86, 0x00efbc8a, 0x00efbca0,
+ /* 98 */ 0x0000c2a7, 0x00e29886, 0x00e29885, 0x00e2978b,
+ /* 9c */ 0x00e2978f, 0x00e2978e, 0x00e29787, 0x00e29786,
+ /* a0 */ 0x00e296a1, 0x00e296a0, 0x00e296b3, 0x00e296b2,
+ /* a4 */ 0x00e296bd, 0x00e296bc, 0x00e280bb, 0x00e38092,
+ /* a8 */ 0x00e28692, 0x00e28690, 0x00e28691, 0x00e28693,
+ /* ac */ 0x00e38093, 0x00efbc87, 0x00efbc82, 0x00efbc8d,
+ /* b0 */ 0x0000007e, 0x00e380b3, 0x00e380b4, 0x00e380b5,
+ /* b4 */ 0x00e380bb, 0x00e380bc, 0x00e383bf, 0x00e3829f,
+ /* b8 */ 0x00e28888, 0x00e2888b, 0x00e28a86, 0x00e28a87,
+ /* bc */ 0x00e28a82, 0x00e28a83, 0x00e288aa, 0x00e288a9,
+ /* c0 */ 0x00e28a84, 0x00e28a85, 0x00e28a8a, 0x00e28a8b,
+ /* c4 */ 0x00e28889, 0x00e28885, 0x00e28c85, 0x00e28c86,
+ /* c8 */ 0x00e288a7, 0x00e288a8, 0x0000c2ac, 0x00e28792,
+ /* cc */ 0x00e28794, 0x00e28880, 0x00e28883, 0x00e28a95,
+ /* d0 */ 0x00e28a96, 0x00e28a97, 0x00e288a5, 0x00e288a6,
+ /* d4 */ 0x00efbd9f, 0x00efbda0, 0x00e38098, 0x00e38099,
+ /* d8 */ 0x00e38096, 0x00e38097, 0x00e288a0, 0x00e28aa5,
+ /* dc */ 0x00e28c92, 0x00e28882, 0x00e28887, 0x00e289a1,
+ /* e0 */ 0x00e28992, 0x00e289aa, 0x00e289ab, 0x00e2889a,
+ /* e4 */ 0x00e288bd, 0x00e2889d, 0x00e288b5, 0x00e288ab,
+ /* e8 */ 0x00e288ac, 0x00e289a2, 0x00e28983, 0x00e28985,
+ /* ec */ 0x00e28988, 0x00e289b6, 0x00e289b7, 0x00e28694,
+ /* f0 */ 0x00e284ab, 0x00e280b0, 0x00e299af, 0x00e299ad,
+ /* f4 */ 0x00e299aa, 0x00e280a0, 0x00e280a1, 0x0000c2b6,
+ /* f8 */ 0x00e299ae, 0x00e299ab, 0x00e299ac, 0x00e299a9,
+ /* fc */ 0x00e297af,
+
+ /*** Two byte table, leaf: 82xx - offset 0x00235 ***/
+
+ /* 40 */ 0x00e296b7, 0x00e296b6, 0x00e29781, 0x00e29780,
+ /* 44 */ 0x00e28697, 0x00e28698, 0x00e28696, 0x00e28699,
+ /* 48 */ 0x00e28784, 0x00e287a8, 0x00e287a6, 0x00e287a7,
+ /* 4c */ 0x00e287a9, 0x00e2a4b4, 0x00e2a4b5, 0x00efbc90,
+ /* 50 */ 0x00efbc91, 0x00efbc92, 0x00efbc93, 0x00efbc94,
+ /* 54 */ 0x00efbc95, 0x00efbc96, 0x00efbc97, 0x00efbc98,
+ /* 58 */ 0x00efbc99, 0x00e2a6bf, 0x00e29789, 0x00e380bd,
+ /* 5c */ 0x00efb986, 0x00efb985, 0x00e297a6, 0x00e280a2,
+ /* 60 */ 0x00efbca1, 0x00efbca2, 0x00efbca3, 0x00efbca4,
+ /* 64 */ 0x00efbca5, 0x00efbca6, 0x00efbca7, 0x00efbca8,
+ /* 68 */ 0x00efbca9, 0x00efbcaa, 0x00efbcab, 0x00efbcac,
+ /* 6c */ 0x00efbcad, 0x00efbcae, 0x00efbcaf, 0x00efbcb0,
+ /* 70 */ 0x00efbcb1, 0x00efbcb2, 0x00efbcb3, 0x00efbcb4,
+ /* 74 */ 0x00efbcb5, 0x00efbcb6, 0x00efbcb7, 0x00efbcb8,
+ /* 78 */ 0x00efbcb9, 0x00efbcba, 0x00e28893, 0x00e284b5,
+ /* 7c */ 0x00e2848f, 0x00e38f8b, 0x00e28493, 0x00000000,
+ /* 80 */ 0x00e284a7, 0x00efbd81, 0x00efbd82, 0x00efbd83,
+ /* 84 */ 0x00efbd84, 0x00efbd85, 0x00efbd86, 0x00efbd87,
+ /* 88 */ 0x00efbd88, 0x00efbd89, 0x00efbd8a, 0x00efbd8b,
+ /* 8c */ 0x00efbd8c, 0x00efbd8d, 0x00efbd8e, 0x00efbd8f,
+ /* 90 */ 0x00efbd90, 0x00efbd91, 0x00efbd92, 0x00efbd93,
+ /* 94 */ 0x00efbd94, 0x00efbd95, 0x00efbd96, 0x00efbd97,
+ /* 98 */ 0x00efbd98, 0x00efbd99, 0x00efbd9a, 0x00e382a0,
+ /* 9c */ 0x00e28093, 0x00e2a7ba, 0x00e2a7bb, 0x00e38181,
+ /* a0 */ 0x00e38182, 0x00e38183, 0x00e38184, 0x00e38185,
+ /* a4 */ 0x00e38186, 0x00e38187, 0x00e38188, 0x00e38189,
+ /* a8 */ 0x00e3818a, 0x00e3818b, 0x00e3818c, 0x00e3818d,
+ /* ac */ 0x00e3818e, 0x00e3818f, 0x00e38190, 0x00e38191,
+ /* b0 */ 0x00e38192, 0x00e38193, 0x00e38194, 0x00e38195,
+ /* b4 */ 0x00e38196, 0x00e38197, 0x00e38198, 0x00e38199,
+ /* b8 */ 0x00e3819a, 0x00e3819b, 0x00e3819c, 0x00e3819d,
+ /* bc */ 0x00e3819e, 0x00e3819f, 0x00e381a0, 0x00e381a1,
+ /* c0 */ 0x00e381a2, 0x00e381a3, 0x00e381a4, 0x00e381a5,
+ /* c4 */ 0x00e381a6, 0x00e381a7, 0x00e381a8, 0x00e381a9,
+ /* c8 */ 0x00e381aa, 0x00e381ab, 0x00e381ac, 0x00e381ad,
+ /* cc */ 0x00e381ae, 0x00e381af, 0x00e381b0, 0x00e381b1,
+ /* d0 */ 0x00e381b2, 0x00e381b3, 0x00e381b4, 0x00e381b5,
+ /* d4 */ 0x00e381b6, 0x00e381b7, 0x00e381b8, 0x00e381b9,
+ /* d8 */ 0x00e381ba, 0x00e381bb, 0x00e381bc, 0x00e381bd,
+ /* dc */ 0x00e381be, 0x00e381bf, 0x00e38280, 0x00e38281,
+ /* e0 */ 0x00e38282, 0x00e38283, 0x00e38284, 0x00e38285,
+ /* e4 */ 0x00e38286, 0x00e38287, 0x00e38288, 0x00e38289,
+ /* e8 */ 0x00e3828a, 0x00e3828b, 0x00e3828c, 0x00e3828d,
+ /* ec */ 0x00e3828e, 0x00e3828f, 0x00e38290, 0x00e38291,
+ /* f0 */ 0x00e38292, 0x00e38293, 0x00e38294, 0x00e38295,
+ /* f4 */ 0x00e38296, 0x00000000, 0x00000000, 0x00000000,
+ /* f8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fc */ 0x00000000,
+
+ /*** Two byte table, leaf: 83xx - offset 0x002f2 ***/
+
+ /* 40 */ 0x00e382a1, 0x00e382a2, 0x00e382a3, 0x00e382a4,
+ /* 44 */ 0x00e382a5, 0x00e382a6, 0x00e382a7, 0x00e382a8,
+ /* 48 */ 0x00e382a9, 0x00e382aa, 0x00e382ab, 0x00e382ac,
+ /* 4c */ 0x00e382ad, 0x00e382ae, 0x00e382af, 0x00e382b0,
+ /* 50 */ 0x00e382b1, 0x00e382b2, 0x00e382b3, 0x00e382b4,
+ /* 54 */ 0x00e382b5, 0x00e382b6, 0x00e382b7, 0x00e382b8,
+ /* 58 */ 0x00e382b9, 0x00e382ba, 0x00e382bb, 0x00e382bc,
+ /* 5c */ 0x00e382bd, 0x00e382be, 0x00e382bf, 0x00e38380,
+ /* 60 */ 0x00e38381, 0x00e38382, 0x00e38383, 0x00e38384,
+ /* 64 */ 0x00e38385, 0x00e38386, 0x00e38387, 0x00e38388,
+ /* 68 */ 0x00e38389, 0x00e3838a, 0x00e3838b, 0x00e3838c,
+ /* 6c */ 0x00e3838d, 0x00e3838e, 0x00e3838f, 0x00e38390,
+ /* 70 */ 0x00e38391, 0x00e38392, 0x00e38393, 0x00e38394,
+ /* 74 */ 0x00e38395, 0x00e38396, 0x00e38397, 0x00e38398,
+ /* 78 */ 0x00e38399, 0x00e3839a, 0x00e3839b, 0x00e3839c,
+ /* 7c */ 0x00e3839d, 0x00e3839e, 0x00e3839f, 0x00000000,
+ /* 80 */ 0x00e383a0, 0x00e383a1, 0x00e383a2, 0x00e383a3,
+ /* 84 */ 0x00e383a4, 0x00e383a5, 0x00e383a6, 0x00e383a7,
+ /* 88 */ 0x00e383a8, 0x00e383a9, 0x00e383aa, 0x00e383ab,
+ /* 8c */ 0x00e383ac, 0x00e383ad, 0x00e383ae, 0x00e383af,
+ /* 90 */ 0x00e383b0, 0x00e383b1, 0x00e383b2, 0x00e383b3,
+ /* 94 */ 0x00e383b4, 0x00e383b5, 0x00e383b6, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x0000ce91,
+ /* a0 */ 0x0000ce92, 0x0000ce93, 0x0000ce94, 0x0000ce95,
+ /* a4 */ 0x0000ce96, 0x0000ce97, 0x0000ce98, 0x0000ce99,
+ /* a8 */ 0x0000ce9a, 0x0000ce9b, 0x0000ce9c, 0x0000ce9d,
+ /* ac */ 0x0000ce9e, 0x0000ce9f, 0x0000cea0, 0x0000cea1,
+ /* b0 */ 0x0000cea3, 0x0000cea4, 0x0000cea5, 0x0000cea6,
+ /* b4 */ 0x0000cea7, 0x0000cea8, 0x0000cea9, 0x00e299a4,
+ /* b8 */ 0x00e299a0, 0x00e299a2, 0x00e299a6, 0x00e299a1,
+ /* bc */ 0x00e299a5, 0x00e299a7, 0x00e299a3, 0x0000ceb1,
+ /* c0 */ 0x0000ceb2, 0x0000ceb3, 0x0000ceb4, 0x0000ceb5,
+ /* c4 */ 0x0000ceb6, 0x0000ceb7, 0x0000ceb8, 0x0000ceb9,
+ /* c8 */ 0x0000ceba, 0x0000cebb, 0x0000cebc, 0x0000cebd,
+ /* cc */ 0x0000cebe, 0x0000cebf, 0x0000cf80, 0x0000cf81,
+ /* d0 */ 0x0000cf83, 0x0000cf84, 0x0000cf85, 0x0000cf86,
+ /* d4 */ 0x0000cf87, 0x0000cf88, 0x0000cf89, 0x0000cf82,
+ /* d8 */ 0x00e293b5, 0x00e293b6, 0x00e293b7, 0x00e293b8,
+ /* dc */ 0x00e293b9, 0x00e293ba, 0x00e293bb, 0x00e293bc,
+ /* e0 */ 0x00e293bd, 0x00e293be, 0x00e29896, 0x00e29897,
+ /* e4 */ 0x00e380a0, 0x00e2988e, 0x00e29880, 0x00e29881,
+ /* e8 */ 0x00e29882, 0x00e29883, 0x00e299a8, 0x00e296b1,
+ /* ec */ 0x00e387b0, 0x00e387b1, 0x00e387b2, 0x00e387b3,
+ /* f0 */ 0x00e387b4, 0x00e387b5, 0x00e387b6, 0x00e387b7,
+ /* f4 */ 0x00e387b8, 0x00e387b9, 0x00000000, 0x00e387ba,
+ /* f8 */ 0x00e387bb, 0x00e387bc, 0x00e387bd, 0x00e387be,
+ /* fc */ 0x00e387bf,
+
+ /*** Two byte table, leaf: 84xx - offset 0x003af ***/
+
+ /* 40 */ 0x0000d090, 0x0000d091, 0x0000d092, 0x0000d093,
+ /* 44 */ 0x0000d094, 0x0000d095, 0x0000d081, 0x0000d096,
+ /* 48 */ 0x0000d097, 0x0000d098, 0x0000d099, 0x0000d09a,
+ /* 4c */ 0x0000d09b, 0x0000d09c, 0x0000d09d, 0x0000d09e,
+ /* 50 */ 0x0000d09f, 0x0000d0a0, 0x0000d0a1, 0x0000d0a2,
+ /* 54 */ 0x0000d0a3, 0x0000d0a4, 0x0000d0a5, 0x0000d0a6,
+ /* 58 */ 0x0000d0a7, 0x0000d0a8, 0x0000d0a9, 0x0000d0aa,
+ /* 5c */ 0x0000d0ab, 0x0000d0ac, 0x0000d0ad, 0x0000d0ae,
+ /* 60 */ 0x0000d0af, 0x00e28ebe, 0x00e28ebf, 0x00e28f80,
+ /* 64 */ 0x00e28f81, 0x00e28f82, 0x00e28f83, 0x00e28f84,
+ /* 68 */ 0x00e28f85, 0x00e28f86, 0x00e28f87, 0x00e28f88,
+ /* 6c */ 0x00e28f89, 0x00e28f8a, 0x00e28f8b, 0x00e28f8c,
+ /* 70 */ 0x0000d0b0, 0x0000d0b1, 0x0000d0b2, 0x0000d0b3,
+ /* 74 */ 0x0000d0b4, 0x0000d0b5, 0x0000d191, 0x0000d0b6,
+ /* 78 */ 0x0000d0b7, 0x0000d0b8, 0x0000d0b9, 0x0000d0ba,
+ /* 7c */ 0x0000d0bb, 0x0000d0bc, 0x0000d0bd, 0x00000000,
+ /* 80 */ 0x0000d0be, 0x0000d0bf, 0x0000d180, 0x0000d181,
+ /* 84 */ 0x0000d182, 0x0000d183, 0x0000d184, 0x0000d185,
+ /* 88 */ 0x0000d186, 0x0000d187, 0x0000d188, 0x0000d189,
+ /* 8c */ 0x0000d18a, 0x0000d18b, 0x0000d18c, 0x0000d18d,
+ /* 90 */ 0x0000d18e, 0x0000d18f, 0x00e383b7, 0x00e383b8,
+ /* 94 */ 0x00e383b9, 0x00e383ba, 0x00e28b9a, 0x00e28b9b,
+ /* 98 */ 0x00e28593, 0x00e28594, 0x00e28595, 0x00e29c93,
+ /* 9c */ 0x00e28c98, 0x00e290a3, 0x00e28f8e, 0x00e29480,
+ /* a0 */ 0x00e29482, 0x00e2948c, 0x00e29490, 0x00e29498,
+ /* a4 */ 0x00e29494, 0x00e2949c, 0x00e294ac, 0x00e294a4,
+ /* a8 */ 0x00e294b4, 0x00e294bc, 0x00e29481, 0x00e29483,
+ /* ac */ 0x00e2948f, 0x00e29493, 0x00e2949b, 0x00e29497,
+ /* b0 */ 0x00e294a3, 0x00e294b3, 0x00e294ab, 0x00e294bb,
+ /* b4 */ 0x00e2958b, 0x00e294a0, 0x00e294af, 0x00e294a8,
+ /* b8 */ 0x00e294b7, 0x00e294bf, 0x00e2949d, 0x00e294b0,
+ /* bc */ 0x00e294a5, 0x00e294b8, 0x00e29582, 0x00e38991,
+ /* c0 */ 0x00e38992, 0x00e38993, 0x00e38994, 0x00e38995,
+ /* c4 */ 0x00e38996, 0x00e38997, 0x00e38998, 0x00e38999,
+ /* c8 */ 0x00e3899a, 0x00e3899b, 0x00e3899c, 0x00e3899d,
+ /* cc */ 0x00e3899e, 0x00e3899f, 0x00e38ab1, 0x00e38ab2,
+ /* d0 */ 0x00e38ab3, 0x00e38ab4, 0x00e38ab5, 0x00e38ab6,
+ /* d4 */ 0x00e38ab7, 0x00e38ab8, 0x00e38ab9, 0x00e38aba,
+ /* d8 */ 0x00e38abb, 0x00e38abc, 0x00e38abd, 0x00e38abe,
+ /* dc */ 0x00e38abf, 0x00000000, 0x00000000, 0x00000000,
+ /* e0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* e4 */ 0x00000000, 0x00e29790, 0x00e29791, 0x00e29792,
+ /* e8 */ 0x00e29793, 0x00e280bc, 0x00e28187, 0x00e28188,
+ /* ec */ 0x00e28189, 0x0000c78d, 0x0000c78e, 0x0000c790,
+ /* f0 */ 0x00e1b8be, 0x00e1b8bf, 0x0000c7b8, 0x0000c7b9,
+ /* f4 */ 0x0000c791, 0x0000c792, 0x0000c794, 0x0000c796,
+ /* f8 */ 0x0000c798, 0x0000c79a, 0x0000c79c, 0x00000000,
+ /* fc */ 0x00000000,
+
+ /*** Two byte table, leaf: 85xx - offset 0x0046c ***/
+
+ /* 40 */ 0x00e282ac, 0x0000c2a0, 0x0000c2a1, 0x0000c2a4,
+ /* 44 */ 0x0000c2a6, 0x0000c2a9, 0x0000c2aa, 0x0000c2ab,
+ /* 48 */ 0x0000c2ad, 0x0000c2ae, 0x0000c2af, 0x0000c2b2,
+ /* 4c */ 0x0000c2b3, 0x0000c2b7, 0x0000c2b8, 0x0000c2b9,
+ /* 50 */ 0x0000c2ba, 0x0000c2bb, 0x0000c2bc, 0x0000c2bd,
+ /* 54 */ 0x0000c2be, 0x0000c2bf, 0x0000c380, 0x0000c381,
+ /* 58 */ 0x0000c382, 0x0000c383, 0x0000c384, 0x0000c385,
+ /* 5c */ 0x0000c386, 0x0000c387, 0x0000c388, 0x0000c389,
+ /* 60 */ 0x0000c38a, 0x0000c38b, 0x0000c38c, 0x0000c38d,
+ /* 64 */ 0x0000c38e, 0x0000c38f, 0x0000c390, 0x0000c391,
+ /* 68 */ 0x0000c392, 0x0000c393, 0x0000c394, 0x0000c395,
+ /* 6c */ 0x0000c396, 0x0000c398, 0x0000c399, 0x0000c39a,
+ /* 70 */ 0x0000c39b, 0x0000c39c, 0x0000c39d, 0x0000c39e,
+ /* 74 */ 0x0000c39f, 0x0000c3a0, 0x0000c3a1, 0x0000c3a2,
+ /* 78 */ 0x0000c3a3, 0x0000c3a4, 0x0000c3a5, 0x0000c3a6,
+ /* 7c */ 0x0000c3a7, 0x0000c3a8, 0x0000c3a9, 0x00000000,
+ /* 80 */ 0x0000c3aa, 0x0000c3ab, 0x0000c3ac, 0x0000c3ad,
+ /* 84 */ 0x0000c3ae, 0x0000c3af, 0x0000c3b0, 0x0000c3b1,
+ /* 88 */ 0x0000c3b2, 0x0000c3b3, 0x0000c3b4, 0x0000c3b5,
+ /* 8c */ 0x0000c3b6, 0x0000c3b8, 0x0000c3b9, 0x0000c3ba,
+ /* 90 */ 0x0000c3bb, 0x0000c3bc, 0x0000c3bd, 0x0000c3be,
+ /* 94 */ 0x0000c3bf, 0x0000c480, 0x0000c4aa, 0x0000c5aa,
+ /* 98 */ 0x0000c492, 0x0000c58c, 0x0000c481, 0x0000c4ab,
+ /* 9c */ 0x0000c5ab, 0x0000c493, 0x0000c58d, 0x0000c484,
+ /* a0 */ 0x0000cb98, 0x0000c581, 0x0000c4bd, 0x0000c59a,
+ /* a4 */ 0x0000c5a0, 0x0000c59e, 0x0000c5a4, 0x0000c5b9,
+ /* a8 */ 0x0000c5bd, 0x0000c5bb, 0x0000c485, 0x0000cb9b,
+ /* ac */ 0x0000c582, 0x0000c4be, 0x0000c59b, 0x0000cb87,
+ /* b0 */ 0x0000c5a1, 0x0000c59f, 0x0000c5a5, 0x0000c5ba,
+ /* b4 */ 0x0000cb9d, 0x0000c5be, 0x0000c5bc, 0x0000c594,
+ /* b8 */ 0x0000c482, 0x0000c4b9, 0x0000c486, 0x0000c48c,
+ /* bc */ 0x0000c498, 0x0000c49a, 0x0000c48e, 0x0000c583,
+ /* c0 */ 0x0000c587, 0x0000c590, 0x0000c598, 0x0000c5ae,
+ /* c4 */ 0x0000c5b0, 0x0000c5a2, 0x0000c595, 0x0000c483,
+ /* c8 */ 0x0000c4ba, 0x0000c487, 0x0000c48d, 0x0000c499,
+ /* cc */ 0x0000c49b, 0x0000c48f, 0x0000c491, 0x0000c584,
+ /* d0 */ 0x0000c588, 0x0000c591, 0x0000c599, 0x0000c5af,
+ /* d4 */ 0x0000c5b1, 0x0000c5a3, 0x0000cb99, 0x0000c488,
+ /* d8 */ 0x0000c49c, 0x0000c4a4, 0x0000c4b4, 0x0000c59c,
+ /* dc */ 0x0000c5ac, 0x0000c489, 0x0000c49d, 0x0000c4a5,
+ /* e0 */ 0x0000c4b5, 0x0000c59d, 0x0000c5ad, 0x0000c9b1,
+ /* e4 */ 0x0000ca8b, 0x0000c9be, 0x0000ca83, 0x0000ca92,
+ /* e8 */ 0x0000c9ac, 0x0000c9ae, 0x0000c9b9, 0x0000ca88,
+ /* ec */ 0x0000c996, 0x0000c9b3, 0x0000c9bd, 0x0000ca82,
+ /* f0 */ 0x0000ca90, 0x0000c9bb, 0x0000c9ad, 0x0000c99f,
+ /* f4 */ 0x0000c9b2, 0x0000ca9d, 0x0000ca8e, 0x0000c9a1,
+ /* f8 */ 0x0000c58b, 0x0000c9b0, 0x0000ca81, 0x0000c4a7,
+ /* fc */ 0x0000ca95,
+
+ /*** Two byte table, leaf: 86xx - offset 0x00529 ***/
+
+ /* 40 */ 0x0000ca94, 0x0000c9a6, 0x0000ca98, 0x0000c782,
+ /* 44 */ 0x0000c993, 0x0000c997, 0x0000ca84, 0x0000c9a0,
+ /* 48 */ 0x0000c693, 0x0000c593, 0x0000c592, 0x0000c9a8,
+ /* 4c */ 0x0000ca89, 0x0000c998, 0x0000c9b5, 0x0000c999,
+ /* 50 */ 0x0000c99c, 0x0000c99e, 0x0000c990, 0x0000c9af,
+ /* 54 */ 0x0000ca8a, 0x0000c9a4, 0x0000ca8c, 0x0000c994,
+ /* 58 */ 0x0000c991, 0x0000c992, 0x0000ca8d, 0x0000c9a5,
+ /* 5c */ 0x0000caa2, 0x0000caa1, 0x0000c995, 0x0000ca91,
+ /* 60 */ 0x0000c9ba, 0x0000c9a7, 0x0000c99a, 0x00000000,
+ /* 64 */ 0x0000c7bd, 0x00e1bdb0, 0x00e1bdb1, 0x00000000,
+ /* 68 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 6c */ 0x00000000, 0x00000000, 0x00000000, 0x00e1bdb2,
+ /* 70 */ 0x00e1bdb3, 0x0000cda1, 0x0000cb88, 0x0000cb8c,
+ /* 74 */ 0x0000cb90, 0x0000cb91, 0x0000cc86, 0x00e280bf,
+ /* 78 */ 0x0000cc8b, 0x0000cc81, 0x0000cc84, 0x0000cc80,
+ /* 7c */ 0x0000cc8f, 0x0000cc8c, 0x0000cc82, 0x00000000,
+ /* 80 */ 0x0000cba5, 0x0000cba6, 0x0000cba7, 0x0000cba8,
+ /* 84 */ 0x0000cba9, 0x00000000, 0x00000000, 0x0000cca5,
+ /* 88 */ 0x0000ccac, 0x0000ccb9, 0x0000cc9c, 0x0000cc9f,
+ /* 8c */ 0x0000cca0, 0x0000cc88, 0x0000ccbd, 0x0000cca9,
+ /* 90 */ 0x0000ccaf, 0x0000cb9e, 0x0000cca4, 0x0000ccb0,
+ /* 94 */ 0x0000ccbc, 0x0000ccb4, 0x0000cc9d, 0x0000cc9e,
+ /* 98 */ 0x0000cc98, 0x0000cc99, 0x0000ccaa, 0x0000ccba,
+ /* 9c */ 0x0000ccbb, 0x0000cc83, 0x0000cc9a, 0x00e29db6,
+ /* a0 */ 0x00e29db7, 0x00e29db8, 0x00e29db9, 0x00e29dba,
+ /* a4 */ 0x00e29dbb, 0x00e29dbc, 0x00e29dbd, 0x00e29dbe,
+ /* a8 */ 0x00e29dbf, 0x00e293ab, 0x00e293ac, 0x00e293ad,
+ /* ac */ 0x00e293ae, 0x00e293af, 0x00e293b0, 0x00e293b1,
+ /* b0 */ 0x00e293b2, 0x00e293b3, 0x00e293b4, 0x00e285b0,
+ /* b4 */ 0x00e285b1, 0x00e285b2, 0x00e285b3, 0x00e285b4,
+ /* b8 */ 0x00e285b5, 0x00e285b6, 0x00e285b7, 0x00e285b8,
+ /* bc */ 0x00e285b9, 0x00e285ba, 0x00e285bb, 0x00e29390,
+ /* c0 */ 0x00e29391, 0x00e29392, 0x00e29393, 0x00e29394,
+ /* c4 */ 0x00e29395, 0x00e29396, 0x00e29397, 0x00e29398,
+ /* c8 */ 0x00e29399, 0x00e2939a, 0x00e2939b, 0x00e2939c,
+ /* cc */ 0x00e2939d, 0x00e2939e, 0x00e2939f, 0x00e293a0,
+ /* d0 */ 0x00e293a1, 0x00e293a2, 0x00e293a3, 0x00e293a4,
+ /* d4 */ 0x00e293a5, 0x00e293a6, 0x00e293a7, 0x00e293a8,
+ /* d8 */ 0x00e293a9, 0x00e38b90, 0x00e38b91, 0x00e38b92,
+ /* dc */ 0x00e38b93, 0x00e38b94, 0x00e38b95, 0x00e38b96,
+ /* e0 */ 0x00e38b97, 0x00e38b98, 0x00e38b99, 0x00e38b9a,
+ /* e4 */ 0x00e38b9b, 0x00e38b9c, 0x00e38b9d, 0x00e38b9e,
+ /* e8 */ 0x00e38b9f, 0x00e38ba0, 0x00e38ba1, 0x00e38ba2,
+ /* ec */ 0x00e38ba3, 0x00e38bba, 0x00e38ba9, 0x00e38ba5,
+ /* f0 */ 0x00e38bad, 0x00e38bac, 0x00000000, 0x00000000,
+ /* f4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* f8 */ 0x00000000, 0x00000000, 0x00000000, 0x00e28191,
+ /* fc */ 0x00e28182,
+
+ /*** Two byte table, leaf: 87xx - offset 0x005e6 ***/
+
+ /* 40 */ 0x00e291a0, 0x00e291a1, 0x00e291a2, 0x00e291a3,
+ /* 44 */ 0x00e291a4, 0x00e291a5, 0x00e291a6, 0x00e291a7,
+ /* 48 */ 0x00e291a8, 0x00e291a9, 0x00e291aa, 0x00e291ab,
+ /* 4c */ 0x00e291ac, 0x00e291ad, 0x00e291ae, 0x00e291af,
+ /* 50 */ 0x00e291b0, 0x00e291b1, 0x00e291b2, 0x00e291b3,
+ /* 54 */ 0x00e285a0, 0x00e285a1, 0x00e285a2, 0x00e285a3,
+ /* 58 */ 0x00e285a4, 0x00e285a5, 0x00e285a6, 0x00e285a7,
+ /* 5c */ 0x00e285a8, 0x00e285a9, 0x00e285aa, 0x00e38d89,
+ /* 60 */ 0x00e38c94, 0x00e38ca2, 0x00e38d8d, 0x00e38c98,
+ /* 64 */ 0x00e38ca7, 0x00e38c83, 0x00e38cb6, 0x00e38d91,
+ /* 68 */ 0x00e38d97, 0x00e38c8d, 0x00e38ca6, 0x00e38ca3,
+ /* 6c */ 0x00e38cab, 0x00e38d8a, 0x00e38cbb, 0x00e38e9c,
+ /* 70 */ 0x00e38e9d, 0x00e38e9e, 0x00e38e8e, 0x00e38e8f,
+ /* 74 */ 0x00e38f84, 0x00e38ea1, 0x00e285ab, 0x00000000,
+ /* 78 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 7c */ 0x00000000, 0x00000000, 0x00e38dbb, 0x00000000,
+ /* 80 */ 0x00e3809d, 0x00e3809f, 0x00e28496, 0x00e38f8d,
+ /* 84 */ 0x00e284a1, 0x00e38aa4, 0x00e38aa5, 0x00e38aa6,
+ /* 88 */ 0x00e38aa7, 0x00e38aa8, 0x00e388b1, 0x00e388b2,
+ /* 8c */ 0x00e388b9, 0x00e38dbe, 0x00e38dbd, 0x00e38dbc,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00e288ae,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00e2889f, 0x00e28abf, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00e29d96, 0x00e2989e, 0x00e4bfb1,
+ /* a0 */ 0xf0a0808b, 0x00e39082, 0x00e4b8a8, 0x00e4b8af,
+ /* a4 */ 0x00e4b8b0, 0x00e4ba8d, 0x00e4bba1, 0x00e4bbbd,
+ /* a8 */ 0x00e4bbbf, 0x00e4bc83, 0x00e4bc8b, 0x00e4bda0,
+ /* ac */ 0x00e4bd88, 0x00e4bd89, 0x00e4bd96, 0x00e4bd9f,
+ /* b0 */ 0x00e4bdaa, 0x00e4bdac, 0x00e4bdbe, 0x00e4be8a,
+ /* b4 */ 0x00e4be94, 0x00e4be97, 0x00efa8b0, 0x00e4bf89,
+ /* b8 */ 0x00e4bfa0, 0x00e58081, 0x00e58082, 0x00e5808e,
+ /* bc */ 0x00e58098, 0x00e580a7, 0x00e580ae, 0x00e58180,
+ /* c0 */ 0x00e580bb, 0x00e58181, 0x00e58294, 0x00e5838c,
+ /* c4 */ 0x00e583b2, 0x00e58390, 0x00e583a6, 0x00efa8b1,
+ /* c8 */ 0x00e58486, 0x00e58483, 0x00e5848b, 0x00e5849e,
+ /* cc */ 0x00e584b5, 0x00e5858a, 0x00efa8b2, 0x00e58595,
+ /* d0 */ 0x00e58597, 0x00e392b5, 0x00e5869d, 0x00e58783,
+ /* d4 */ 0x00e5878a, 0x00e5879e, 0x00e587a2, 0x00e587ae,
+ /* d8 */ 0x00e58881, 0x00e3939b, 0x00e58893, 0x00e58895,
+ /* dc */ 0x00e58989, 0x00e58997, 0x00e589a1, 0x00e58a93,
+ /* e0 */ 0x00e58b88, 0x00efa8b3, 0x00e58b8c, 0x00e58b90,
+ /* e4 */ 0x00e58b96, 0x00e58b9b, 0x00efa8b4, 0x00e58bb0,
+ /* e8 */ 0x00e58bbb, 0x00e58c80, 0x00e58c87, 0x00e58c9c,
+ /* ec */ 0x00efa8b5, 0x00e58da1, 0x00e58da3, 0x00e58dbd,
+ /* f0 */ 0x00e58e93, 0x00e58e9d, 0x00e58eb2, 0x00e59092,
+ /* f4 */ 0x00e590a7, 0x00e5918d, 0x00e5929c, 0x00e591ab,
+ /* f8 */ 0x00e591b4, 0x00e591bf, 0x00e59288, 0x00e59296,
+ /* fc */ 0x00e592a1,
+
+ /*** Two byte table, leaf: 88xx - offset 0x006a3 ***/
+
+ /* 40 */ 0x00e592a9, 0x00e59386, 0x00e593bf, 0x00e5948e,
+ /* 44 */ 0x00e594ab, 0x00e594b5, 0x00e59590, 0x00e5959e,
+ /* 48 */ 0x00e59681, 0x00e59686, 0x00e5968e, 0x00efa8b6,
+ /* 4c */ 0x00e596ad, 0x00e5978e, 0x00efa8b7, 0x00e59888,
+ /* 50 */ 0x00e5988e, 0x00e598bb, 0x00e59989, 0x00e599b6,
+ /* 54 */ 0x00e599a6, 0x00efa8b8, 0x00e599af, 0x00e599b1,
+ /* 58 */ 0x00e599b2, 0x00e59a99, 0x00e59a9e, 0x00e59aa9,
+ /* 5c */ 0x00e59aac, 0x00e59ab3, 0x00e59b89, 0x00e59b8a,
+ /* 60 */ 0x00e59c8a, 0xf0a188bd, 0x00e59ca1, 0x00e59caf,
+ /* 64 */ 0x00e59cb3, 0x00e59cb4, 0x00e59db0, 0x00e59db7,
+ /* 68 */ 0x00e59dbc, 0x00e59e9c, 0x00efa88f, 0xf0a18c9b,
+ /* 6c */ 0x00e59eb8, 0x00e59f87, 0x00e59f88, 0x00e59f8f,
+ /* 70 */ 0x00e59fa4, 0x00e59fad, 0x00e59fb5, 0x00e59fb6,
+ /* 74 */ 0x00e59fbf, 0x00e5a089, 0x00efa890, 0x00e5a1a1,
+ /* 78 */ 0x00e5a1a4, 0x00efa8b9, 0x00e5a1bc, 0x00e5a289,
+ /* 7c */ 0x00e5a29e, 0x00efa8ba, 0x00e5a2a9, 0x00000000,
+ /* 80 */ 0xf0a191ae, 0x00e5a392, 0x00e5a38e, 0x00e5a394,
+ /* 84 */ 0x00e5a39a, 0x00e5a3a0, 0x00e5a3a9, 0x00e5a48c,
+ /* 88 */ 0x00e89981, 0x00e5a59d, 0x00e5a5ad, 0x00e5a68b,
+ /* 8c */ 0x00e5a692, 0x00e5a6a4, 0x00e5a783, 0x00e5a792,
+ /* 90 */ 0x00e5a79d, 0x00e5a893, 0x00e5a8a3, 0x00e5a9a7,
+ /* 94 */ 0x00e5a9ad, 0x00e5a9b7, 0x00e5a9be, 0x00e5aa84,
+ /* 98 */ 0x00e5aa9e, 0x00e5aaa7, 0x00e5ab84, 0xf0a1a2bd,
+ /* 9c */ 0x00e5ac99, 0x00e5aca5, 0x00e5899d, 0x00e4ba9c,
+ /* a0 */ 0x00e59496, 0x00e5a883, 0x00e998bf, 0x00e59380,
+ /* a4 */ 0x00e6849b, 0x00e68ca8, 0x00e5a7b6, 0x00e980a2,
+ /* a8 */ 0x00e891b5, 0x00e88c9c, 0x00e7a990, 0x00e682aa,
+ /* ac */ 0x00e68fa1, 0x00e6b8a5, 0x00e697ad, 0x00e891a6,
+ /* b0 */ 0x00e88aa6, 0x00e9afb5, 0x00e6a293, 0x00e59ca7,
+ /* b4 */ 0x00e696a1, 0x00e689b1, 0x00e5ae9b, 0x00e5a790,
+ /* b8 */ 0x00e899bb, 0x00e9a3b4, 0x00e7b5a2, 0x00e7b6be,
+ /* bc */ 0x00e9ae8e, 0x00e68896, 0x00e7b29f, 0x00e8a2b7,
+ /* c0 */ 0x00e5ae89, 0x00e5bab5, 0x00e68c89, 0x00e69a97,
+ /* c4 */ 0x00e6a188, 0x00e99787, 0x00e99e8d, 0x00e69d8f,
+ /* c8 */ 0x00e4bba5, 0x00e4bc8a, 0x00e4bd8d, 0x00e4be9d,
+ /* cc */ 0x00e58189, 0x00e59bb2, 0x00e5a4b7, 0x00e5a794,
+ /* d0 */ 0x00e5a881, 0x00e5b089, 0x00e6839f, 0x00e6848f,
+ /* d4 */ 0x00e685b0, 0x00e69893, 0x00e6a485, 0x00e782ba,
+ /* d8 */ 0x00e7958f, 0x00e795b0, 0x00e7a7bb, 0x00e7b6ad,
+ /* dc */ 0x00e7b7af, 0x00e88383, 0x00e8908e, 0x00e8a1a3,
+ /* e0 */ 0x00e8ac82, 0x00e98195, 0x00e981ba, 0x00e58cbb,
+ /* e4 */ 0x00e4ba95, 0x00e4baa5, 0x00e59f9f, 0x00e882b2,
+ /* e8 */ 0x00e98381, 0x00e7a3af, 0x00e4b880, 0x00e5a3b1,
+ /* ec */ 0x00e6baa2, 0x00e980b8, 0x00e7a8b2, 0x00e88ca8,
+ /* f0 */ 0x00e88a8b, 0x00e9b0af, 0x00e58581, 0x00e58db0,
+ /* f4 */ 0x00e592bd, 0x00e593a1, 0x00e59ba0, 0x00e5a7bb,
+ /* f8 */ 0x00e5bc95, 0x00e9a3b2, 0x00e6b7ab, 0x00e883a4,
+ /* fc */ 0x00e894ad,
+
+ /*** Two byte table, leaf: 89xx - offset 0x00760 ***/
+
+ /* 40 */ 0x00e999a2, 0x00e999b0, 0x00e99aa0, 0x00e99fbb,
+ /* 44 */ 0x00e5908b, 0x00e58fb3, 0x00e5ae87, 0x00e7838f,
+ /* 48 */ 0x00e7bebd, 0x00e8bf82, 0x00e99ba8, 0x00e58daf,
+ /* 4c */ 0x00e9b59c, 0x00e7aaba, 0x00e4b891, 0x00e7a293,
+ /* 50 */ 0x00e887bc, 0x00e6b8a6, 0x00e59898, 0x00e59484,
+ /* 54 */ 0x00e6ac9d, 0x00e8949a, 0x00e9b0bb, 0x00e5a7a5,
+ /* 58 */ 0x00e58ea9, 0x00e6b5a6, 0x00e7939c, 0x00e9968f,
+ /* 5c */ 0x00e59982, 0x00e4ba91, 0x00e9818b, 0x00e99bb2,
+ /* 60 */ 0x00e88d8f, 0x00e9a48c, 0x00e58fa1, 0x00e596b6,
+ /* 64 */ 0x00e5acb0, 0x00e5bdb1, 0x00e698a0, 0x00e69bb3,
+ /* 68 */ 0x00e6a084, 0x00e6b0b8, 0x00e6b3b3, 0x00e6b4a9,
+ /* 6c */ 0x00e7919b, 0x00e79b88, 0x00e7a98e, 0x00e9a0b4,
+ /* 70 */ 0x00e88bb1, 0x00e8a19b, 0x00e8a9a0, 0x00e98bad,
+ /* 74 */ 0x00e6b6b2, 0x00e796ab, 0x00e79b8a, 0x00e9a785,
+ /* 78 */ 0x00e682a6, 0x00e8ac81, 0x00e8b68a, 0x00e996b2,
+ /* 7c */ 0x00e6a68e, 0x00e58ead, 0x00e58686, 0x00000000,
+ /* 80 */ 0x00e59c92, 0x00e5a0b0, 0x00e5a584, 0x00e5aeb4,
+ /* 84 */ 0x00e5bbb6, 0x00e680a8, 0x00e68ea9, 0x00e68fb4,
+ /* 88 */ 0x00e6b2bf, 0x00e6bc94, 0x00e7828e, 0x00e78494,
+ /* 8c */ 0x00e78599, 0x00e78795, 0x00e78cbf, 0x00e7b881,
+ /* 90 */ 0x00e889b6, 0x00e88b91, 0x00e89697, 0x00e981a0,
+ /* 94 */ 0x00e9899b, 0x00e9b49b, 0x00e5a1a9, 0x00e696bc,
+ /* 98 */ 0x00e6b19a, 0x00e794a5, 0x00e587b9, 0x00e5a4ae,
+ /* 9c */ 0x00e5a5a5, 0x00e5be80, 0x00e5bf9c, 0x00e68abc,
+ /* a0 */ 0x00e697ba, 0x00e6a8aa, 0x00e6aca7, 0x00e6aeb4,
+ /* a4 */ 0x00e78e8b, 0x00e7bf81, 0x00e8a596, 0x00e9b4ac,
+ /* a8 */ 0x00e9b48e, 0x00e9bb84, 0x00e5b2a1, 0x00e6b296,
+ /* ac */ 0x00e88dbb, 0x00e58484, 0x00e5b18b, 0x00e686b6,
+ /* b0 */ 0x00e88786, 0x00e6a1b6, 0x00e789a1, 0x00e4b999,
+ /* b4 */ 0x00e4bfba, 0x00e58db8, 0x00e681a9, 0x00e6b8a9,
+ /* b8 */ 0x00e7a98f, 0x00e99fb3, 0x00e4b88b, 0x00e58c96,
+ /* bc */ 0x00e4bbae, 0x00e4bd95, 0x00e4bcbd, 0x00e4bea1,
+ /* c0 */ 0x00e4bdb3, 0x00e58aa0, 0x00e58faf, 0x00e59889,
+ /* c4 */ 0x00e5a48f, 0x00e5ab81, 0x00e5aeb6, 0x00e5afa1,
+ /* c8 */ 0x00e7a791, 0x00e69a87, 0x00e69e9c, 0x00e69eb6,
+ /* cc */ 0x00e6ad8c, 0x00e6b2b3, 0x00e781ab, 0x00e78f82,
+ /* d0 */ 0x00e7a68d, 0x00e7a6be, 0x00e7a8bc, 0x00e7ae87,
+ /* d4 */ 0x00e88ab1, 0x00e88b9b, 0x00e88c84, 0x00e88db7,
+ /* d8 */ 0x00e88faf, 0x00e88f93, 0x00e89da6, 0x00e8aab2,
+ /* dc */ 0x00e598a9, 0x00e8b2a8, 0x00e8bfa6, 0x00e9818e,
+ /* e0 */ 0x00e99c9e, 0x00e89a8a, 0x00e4bf84, 0x00e5b3a8,
+ /* e4 */ 0x00e68891, 0x00e78999, 0x00e794bb, 0x00e887a5,
+ /* e8 */ 0x00e88abd, 0x00e89bbe, 0x00e8b380, 0x00e99b85,
+ /* ec */ 0x00e9a493, 0x00e9a795, 0x00e4bb8b, 0x00e4bc9a,
+ /* f0 */ 0x00e8a7a3, 0x00e59b9e, 0x00e5a18a, 0x00e5a38a,
+ /* f4 */ 0x00e5bbbb, 0x00e5bfab, 0x00e680aa, 0x00e68294,
+ /* f8 */ 0x00e681a2, 0x00e68790, 0x00e68892, 0x00e68b90,
+ /* fc */ 0x00e694b9,
+
+ /*** Two byte table, leaf: 8axx - offset 0x0081d ***/
+
+ /* 40 */ 0x00e9ad81, 0x00e699a6, 0x00e6a2b0, 0x00e6b5b7,
+ /* 44 */ 0x00e781b0, 0x00e7958c, 0x00e79a86, 0x00e7b5b5,
+ /* 48 */ 0x00e88aa5, 0x00e89fb9, 0x00e9968b, 0x00e99a8e,
+ /* 4c */ 0x00e8b29d, 0x00e587b1, 0x00e58abe, 0x00e5a496,
+ /* 50 */ 0x00e592b3, 0x00e5aeb3, 0x00e5b496, 0x00e685a8,
+ /* 54 */ 0x00e6a682, 0x00e6b6af, 0x00e7a28d, 0x00e8938b,
+ /* 58 */ 0x00e8a197, 0x00e8a9b2, 0x00e98ea7, 0x00e9aab8,
+ /* 5c */ 0x00e6b5ac, 0x00e9a6a8, 0x00e89b99, 0x00e59ea3,
+ /* 60 */ 0x00e69fbf, 0x00e89b8e, 0x00e9888e, 0x00e58a83,
+ /* 64 */ 0x00e59a87, 0x00e59084, 0x00e5bb93, 0x00e68ba1,
+ /* 68 */ 0x00e692b9, 0x00e6a0bc, 0x00e6a0b8, 0x00e6aebb,
+ /* 6c */ 0x00e78db2, 0x00e7a2ba, 0x00e7a9ab, 0x00e8a69a,
+ /* 70 */ 0x00e8a792, 0x00e8b5ab, 0x00e8bc83, 0x00e983ad,
+ /* 74 */ 0x00e996a3, 0x00e99a94, 0x00e99da9, 0x00e5ada6,
+ /* 78 */ 0x00e5b2b3, 0x00e6a5bd, 0x00e9a18d, 0x00e9a18e,
+ /* 7c */ 0x00e68e9b, 0x00e7aca0, 0x00e6a8ab, 0x00000000,
+ /* 80 */ 0x00e6a9bf, 0x00e6a2b6, 0x00e9b08d, 0x00e6bd9f,
+ /* 84 */ 0x00e589b2, 0x00e5969d, 0x00e681b0, 0x00e68bac,
+ /* 88 */ 0x00e6b4bb, 0x00e6b887, 0x00e6bb91, 0x00e8919b,
+ /* 8c */ 0x00e8a490, 0x00e8bd84, 0x00e4b894, 0x00e9b0b9,
+ /* 90 */ 0x00e58fb6, 0x00e6a49b, 0x00e6a8ba, 0x00e99e84,
+ /* 94 */ 0x00e6a0aa, 0x00e5859c, 0x00e7ab83, 0x00e892b2,
+ /* 98 */ 0x00e9879c, 0x00e98e8c, 0x00e5999b, 0x00e9b4a8,
+ /* 9c */ 0x00e6a0a2, 0x00e88c85, 0x00e890b1, 0x00e7b2a5,
+ /* a0 */ 0x00e58888, 0x00e88b85, 0x00e793a6, 0x00e4b9be,
+ /* a4 */ 0x00e4be83, 0x00e586a0, 0x00e5af92, 0x00e5888a,
+ /* a8 */ 0x00e58b98, 0x00e58ba7, 0x00e5b7bb, 0x00e5969a,
+ /* ac */ 0x00e5a0aa, 0x00e5a7a6, 0x00e5ae8c, 0x00e5ae98,
+ /* b0 */ 0x00e5af9b, 0x00e5b9b2, 0x00e5b9b9, 0x00e682a3,
+ /* b4 */ 0x00e6849f, 0x00e685a3, 0x00e686be, 0x00e68f9b,
+ /* b8 */ 0x00e695a2, 0x00e69f91, 0x00e6a193, 0x00e6a3ba,
+ /* bc */ 0x00e6acbe, 0x00e6ad93, 0x00e6b197, 0x00e6bca2,
+ /* c0 */ 0x00e6be97, 0x00e6bd85, 0x00e792b0, 0x00e79498,
+ /* c4 */ 0x00e79ba3, 0x00e79c8b, 0x00e7abbf, 0x00e7aea1,
+ /* c8 */ 0x00e7b0a1, 0x00e7b7a9, 0x00e7bcb6, 0x00e7bfb0,
+ /* cc */ 0x00e8829d, 0x00e889a6, 0x00e88e9e, 0x00e8a6b3,
+ /* d0 */ 0x00e8ab8c, 0x00e8b2ab, 0x00e98284, 0x00e99191,
+ /* d4 */ 0x00e99693, 0x00e99691, 0x00e996a2, 0x00e999a5,
+ /* d8 */ 0x00e99f93, 0x00e9a4a8, 0x00e88898, 0x00e4b8b8,
+ /* dc */ 0x00e590ab, 0x00e5b2b8, 0x00e5b78c, 0x00e78ea9,
+ /* e0 */ 0x00e7998c, 0x00e79cbc, 0x00e5b2a9, 0x00e7bfab,
+ /* e4 */ 0x00e8b48b, 0x00e99b81, 0x00e9a091, 0x00e9a194,
+ /* e8 */ 0x00e9a198, 0x00e4bc81, 0x00e4bc8e, 0x00e58db1,
+ /* ec */ 0x00e5969c, 0x00e599a8, 0x00e59fba, 0x00e5a587,
+ /* f0 */ 0x00e5ac89, 0x00e5af84, 0x00e5b290, 0x00e5b88c,
+ /* f4 */ 0x00e5b9be, 0x00e5bf8c, 0x00e68fae, 0x00e69cba,
+ /* f8 */ 0x00e69797, 0x00e697a2, 0x00e69c9f, 0x00e6a38b,
+ /* fc */ 0x00e6a384,
+
+ /*** Two byte table, leaf: 8bxx - offset 0x008da ***/
+
+ /* 40 */ 0x00e6a99f, 0x00e5b8b0, 0x00e6af85, 0x00e6b097,
+ /* 44 */ 0x00e6b1bd, 0x00e795bf, 0x00e7a588, 0x00e5ada3,
+ /* 48 */ 0x00e7a880, 0x00e7b480, 0x00e5bebd, 0x00e8a68f,
+ /* 4c */ 0x00e8a898, 0x00e8b2b4, 0x00e8b5b7, 0x00e8bb8c,
+ /* 50 */ 0x00e8bc9d, 0x00e9a3a2, 0x00e9a88e, 0x00e9acbc,
+ /* 54 */ 0x00e4ba80, 0x00e581bd, 0x00e58480, 0x00e5a693,
+ /* 58 */ 0x00e5ae9c, 0x00e688af, 0x00e68a80, 0x00e693ac,
+ /* 5c */ 0x00e6acba, 0x00e78aa0, 0x00e79691, 0x00e7a587,
+ /* 60 */ 0x00e7bea9, 0x00e89fbb, 0x00e8aabc, 0x00e8adb0,
+ /* 64 */ 0x00e68eac, 0x00e88f8a, 0x00e99ea0, 0x00e59089,
+ /* 68 */ 0x00e59083, 0x00e596ab, 0x00e6a194, 0x00e6a998,
+ /* 6c */ 0x00e8a9b0, 0x00e7a0a7, 0x00e69db5, 0x00e9bb8d,
+ /* 70 */ 0x00e58db4, 0x00e5aea2, 0x00e8849a, 0x00e89990,
+ /* 74 */ 0x00e98086, 0x00e4b898, 0x00e4b985, 0x00e4bb87,
+ /* 78 */ 0x00e4bc91, 0x00e58f8a, 0x00e590b8, 0x00e5aeae,
+ /* 7c */ 0x00e5bc93, 0x00e680a5, 0x00e69591, 0x00000000,
+ /* 80 */ 0x00e69cbd, 0x00e6b182, 0x00e6b1b2, 0x00e6b3a3,
+ /* 84 */ 0x00e781b8, 0x00e79083, 0x00e7a9b6, 0x00e7aaae,
+ /* 88 */ 0x00e7ac88, 0x00e7b49a, 0x00e7b3be, 0x00e7b5a6,
+ /* 8c */ 0x00e697a7, 0x00e7899b, 0x00e58ebb, 0x00e5b185,
+ /* 90 */ 0x00e5b7a8, 0x00e68b92, 0x00e68ba0, 0x00e68c99,
+ /* 94 */ 0x00e6b8a0, 0x00e8999a, 0x00e8a8b1, 0x00e8b79d,
+ /* 98 */ 0x00e98bb8, 0x00e6bc81, 0x00e7a6a6, 0x00e9ad9a,
+ /* 9c */ 0x00e4baa8, 0x00e4baab, 0x00e4baac, 0x00e4be9b,
+ /* a0 */ 0x00e4bea0, 0x00e58391, 0x00e58587, 0x00e7abb6,
+ /* a4 */ 0x00e585b1, 0x00e587b6, 0x00e58d94, 0x00e58ca1,
+ /* a8 */ 0x00e58dbf, 0x00e58fab, 0x00e596ac, 0x00e5a283,
+ /* ac */ 0x00e5b3a1, 0x00e5bcb7, 0x00e5bd8a, 0x00e680af,
+ /* b0 */ 0x00e68190, 0x00e681ad, 0x00e68c9f, 0x00e69599,
+ /* b4 */ 0x00e6a98b, 0x00e6b381, 0x00e78b82, 0x00e78bad,
+ /* b8 */ 0x00e79faf, 0x00e883b8, 0x00e88485, 0x00e88888,
+ /* bc */ 0x00e8958e, 0x00e983b7, 0x00e98fa1, 0x00e99fbf,
+ /* c0 */ 0x00e9a597, 0x00e9a99a, 0x00e4bbb0, 0x00e5879d,
+ /* c4 */ 0x00e5b0ad, 0x00e69a81, 0x00e6a5ad, 0x00e5b180,
+ /* c8 */ 0x00e69bb2, 0x00e6a5b5, 0x00e78e89, 0x00e6a190,
+ /* cc */ 0x00e7b281, 0x00e58385, 0x00e58ba4, 0x00e59d87,
+ /* d0 */ 0x00e5b7be, 0x00e98ca6, 0x00e696a4, 0x00e6aca3,
+ /* d4 */ 0x00e6acbd, 0x00e790b4, 0x00e7a681, 0x00e7a6bd,
+ /* d8 */ 0x00e7ad8b, 0x00e7b78a, 0x00e88ab9, 0x00e88f8c,
+ /* dc */ 0x00e8a1bf, 0x00e8a59f, 0x00e8acb9, 0x00e8bf91,
+ /* e0 */ 0x00e98791, 0x00e5909f, 0x00e98a80, 0x00e4b99d,
+ /* e4 */ 0x00e580b6, 0x00e58fa5, 0x00e58cba, 0x00e78b97,
+ /* e8 */ 0x00e78e96, 0x00e79fa9, 0x00e88ba6, 0x00e8baaf,
+ /* ec */ 0x00e9a786, 0x00e9a788, 0x00e9a792, 0x00e585b7,
+ /* f0 */ 0x00e6849a, 0x00e8999e, 0x00e596b0, 0x00e7a9ba,
+ /* f4 */ 0x00e581b6, 0x00e5af93, 0x00e98187, 0x00e99a85,
+ /* f8 */ 0x00e4b8b2, 0x00e6ab9b, 0x00e987a7, 0x00e5b191,
+ /* fc */ 0x00e5b188,
+
+ /*** Two byte table, leaf: 8cxx - offset 0x00997 ***/
+
+ /* 40 */ 0x00e68e98, 0x00e7aa9f, 0x00e6b293, 0x00e99db4,
+ /* 44 */ 0x00e8bda1, 0x00e7aaaa, 0x00e7868a, 0x00e99a88,
+ /* 48 */ 0x00e7b282, 0x00e6a097, 0x00e7b9b0, 0x00e6a191,
+ /* 4c */ 0x00e98dac, 0x00e58bb2, 0x00e5909b, 0x00e896ab,
+ /* 50 */ 0x00e8a893, 0x00e7bea4, 0x00e8bb8d, 0x00e983a1,
+ /* 54 */ 0x00e58da6, 0x00e8a288, 0x00e7a581, 0x00e4bf82,
+ /* 58 */ 0x00e582be, 0x00e58891, 0x00e58584, 0x00e59593,
+ /* 5c */ 0x00e59cad, 0x00e78faa, 0x00e59e8b, 0x00e5a591,
+ /* 60 */ 0x00e5bda2, 0x00e5be84, 0x00e681b5, 0x00e685b6,
+ /* 64 */ 0x00e685a7, 0x00e686a9, 0x00e68eb2, 0x00e690ba,
+ /* 68 */ 0x00e695ac, 0x00e699af, 0x00e6a182, 0x00e6b893,
+ /* 6c */ 0x00e795a6, 0x00e7a8bd, 0x00e7b3bb, 0x00e7b58c,
+ /* 70 */ 0x00e7b699, 0x00e7b98b, 0x00e7bdab, 0x00e88c8e,
+ /* 74 */ 0x00e88d8a, 0x00e89b8d, 0x00e8a888, 0x00e8a9a3,
+ /* 78 */ 0x00e8ada6, 0x00e8bbbd, 0x00e9a09a, 0x00e9b68f,
+ /* 7c */ 0x00e88ab8, 0x00e8bf8e, 0x00e9afa8, 0x00000000,
+ /* 80 */ 0x00e58a87, 0x00e6889f, 0x00e69283, 0x00e6bf80,
+ /* 84 */ 0x00e99a99, 0x00e6a181, 0x00e58291, 0x00e6aca0,
+ /* 88 */ 0x00e6b1ba, 0x00e6bd94, 0x00e7a9b4, 0x00e7b590,
+ /* 8c */ 0x00e8a180, 0x00e8a8a3, 0x00e69c88, 0x00e4bbb6,
+ /* 90 */ 0x00e580b9, 0x00e580a6, 0x00e581a5, 0x00e585bc,
+ /* 94 */ 0x00e588b8, 0x00e589a3, 0x00e596a7, 0x00e59c8f,
+ /* 98 */ 0x00e5a085, 0x00e5ab8c, 0x00e5bbba, 0x00e686b2,
+ /* 9c */ 0x00e687b8, 0x00e68bb3, 0x00e68db2, 0x00e6a49c,
+ /* a0 */ 0x00e6a8a9, 0x00e789bd, 0x00e78aac, 0x00e78cae,
+ /* a4 */ 0x00e7a094, 0x00e7a1af, 0x00e7b5b9, 0x00e79c8c,
+ /* a8 */ 0x00e882a9, 0x00e8a68b, 0x00e8ac99, 0x00e8b3a2,
+ /* ac */ 0x00e8bb92, 0x00e981a3, 0x00e98db5, 0x00e999ba,
+ /* b0 */ 0x00e9a195, 0x00e9a893, 0x00e9b9b8, 0x00e58583,
+ /* b4 */ 0x00e58e9f, 0x00e58eb3, 0x00e5b9bb, 0x00e5bca6,
+ /* b8 */ 0x00e6b89b, 0x00e6ba90, 0x00e78e84, 0x00e78fbe,
+ /* bc */ 0x00e7b583, 0x00e888b7, 0x00e8a880, 0x00e8abba,
+ /* c0 */ 0x00e99990, 0x00e4b98e, 0x00e5808b, 0x00e58fa4,
+ /* c4 */ 0x00e591bc, 0x00e59bba, 0x00e5a791, 0x00e5ada4,
+ /* c8 */ 0x00e5b7b1, 0x00e5baab, 0x00e5bca7, 0x00e688b8,
+ /* cc */ 0x00e69585, 0x00e69eaf, 0x00e6b996, 0x00e78b90,
+ /* d0 */ 0x00e7b38a, 0x00e8a2b4, 0x00e882a1, 0x00e883a1,
+ /* d4 */ 0x00e88fb0, 0x00e8998e, 0x00e8aa87, 0x00e8b7a8,
+ /* d8 */ 0x00e988b7, 0x00e99b87, 0x00e9a1a7, 0x00e9bc93,
+ /* dc */ 0x00e4ba94, 0x00e4ba92, 0x00e4bc8d, 0x00e58d88,
+ /* e0 */ 0x00e59189, 0x00e590be, 0x00e5a8af, 0x00e5be8c,
+ /* e4 */ 0x00e5bea1, 0x00e6829f, 0x00e6a2a7, 0x00e6aa8e,
+ /* e8 */ 0x00e7919a, 0x00e7a281, 0x00e8aa9e, 0x00e8aaa4,
+ /* ec */ 0x00e8adb7, 0x00e98690, 0x00e4b99e, 0x00e9af89,
+ /* f0 */ 0x00e4baa4, 0x00e4bdbc, 0x00e4beaf, 0x00e58099,
+ /* f4 */ 0x00e58096, 0x00e58589, 0x00e585ac, 0x00e58a9f,
+ /* f8 */ 0x00e58ab9, 0x00e58bbe, 0x00e58e9a, 0x00e58fa3,
+ /* fc */ 0x00e59091,
+
+ /*** Two byte table, leaf: 8dxx - offset 0x00a54 ***/
+
+ /* 40 */ 0x00e5908e, 0x00e59689, 0x00e59d91, 0x00e59ea2,
+ /* 44 */ 0x00e5a5bd, 0x00e5ad94, 0x00e5ad9d, 0x00e5ae8f,
+ /* 48 */ 0x00e5b7a5, 0x00e5b7a7, 0x00e5b7b7, 0x00e5b9b8,
+ /* 4c */ 0x00e5ba83, 0x00e5ba9a, 0x00e5bab7, 0x00e5bc98,
+ /* 50 */ 0x00e68192, 0x00e6858c, 0x00e68a97, 0x00e68b98,
+ /* 54 */ 0x00e68ea7, 0x00e694bb, 0x00e69882, 0x00e69983,
+ /* 58 */ 0x00e69bb4, 0x00e69dad, 0x00e6a0a1, 0x00e6a297,
+ /* 5c */ 0x00e6a78b, 0x00e6b19f, 0x00e6b4aa, 0x00e6b5a9,
+ /* 60 */ 0x00e6b8af, 0x00e6ba9d, 0x00e794b2, 0x00e79a87,
+ /* 64 */ 0x00e7a1ac, 0x00e7a8bf, 0x00e7b3a0, 0x00e7b485,
+ /* 68 */ 0x00e7b498, 0x00e7b59e, 0x00e7b6b1, 0x00e88095,
+ /* 6c */ 0x00e88083, 0x00e882af, 0x00e882b1, 0x00e88594,
+ /* 70 */ 0x00e8868f, 0x00e888aa, 0x00e88d92, 0x00e8a18c,
+ /* 74 */ 0x00e8a1a1, 0x00e8ac9b, 0x00e8b2a2, 0x00e8b3bc,
+ /* 78 */ 0x00e9838a, 0x00e985b5, 0x00e989b1, 0x00e7a0bf,
+ /* 7c */ 0x00e98bbc, 0x00e996a4, 0x00e9998d, 0x00000000,
+ /* 80 */ 0x00e9a085, 0x00e9a699, 0x00e9ab98, 0x00e9b4bb,
+ /* 84 */ 0x00e5899b, 0x00e58aab, 0x00e58fb7, 0x00e59088,
+ /* 88 */ 0x00e5a395, 0x00e68bb7, 0x00e6bfa0, 0x00e8b1aa,
+ /* 8c */ 0x00e8bd9f, 0x00e9bab9, 0x00e5858b, 0x00e588bb,
+ /* 90 */ 0x00e5918a, 0x00e59bbd, 0x00e7a980, 0x00e985b7,
+ /* 94 */ 0x00e9b5a0, 0x00e9bb92, 0x00e78d84, 0x00e6bc89,
+ /* 98 */ 0x00e885b0, 0x00e79491, 0x00e5bfbd, 0x00e6839a,
+ /* 9c */ 0x00e9aaa8, 0x00e78b9b, 0x00e8bebc, 0x00e6ada4,
+ /* a0 */ 0x00e9a083, 0x00e4bb8a, 0x00e59bb0, 0x00e59da4,
+ /* a4 */ 0x00e5a2be, 0x00e5a99a, 0x00e681a8, 0x00e68787,
+ /* a8 */ 0x00e6988f, 0x00e69886, 0x00e6a0b9, 0x00e6a2b1,
+ /* ac */ 0x00e6b7b7, 0x00e79795, 0x00e7b4ba, 0x00e889ae,
+ /* b0 */ 0x00e9ad82, 0x00e4ba9b, 0x00e4bd90, 0x00e58f89,
+ /* b4 */ 0x00e59486, 0x00e5b5af, 0x00e5b7a6, 0x00e5b7ae,
+ /* b8 */ 0x00e69fbb, 0x00e6b299, 0x00e791b3, 0x00e7a082,
+ /* bc */ 0x00e8a990, 0x00e98e96, 0x00e8a39f, 0x00e59d90,
+ /* c0 */ 0x00e5baa7, 0x00e68cab, 0x00e582b5, 0x00e582ac,
+ /* c4 */ 0x00e5868d, 0x00e69c80, 0x00e59389, 0x00e5a19e,
+ /* c8 */ 0x00e5a6bb, 0x00e5aeb0, 0x00e5bda9, 0x00e6898d,
+ /* cc */ 0x00e68ea1, 0x00e6a0bd, 0x00e6adb3, 0x00e6b888,
+ /* d0 */ 0x00e781bd, 0x00e98787, 0x00e78a80, 0x00e7a095,
+ /* d4 */ 0x00e7a0a6, 0x00e7a5ad, 0x00e6968e, 0x00e7b4b0,
+ /* d8 */ 0x00e88f9c, 0x00e8a381, 0x00e8bc89, 0x00e99a9b,
+ /* dc */ 0x00e589a4, 0x00e59ca8, 0x00e69d90, 0x00e7bdaa,
+ /* e0 */ 0x00e8b2a1, 0x00e586b4, 0x00e59d82, 0x00e998aa,
+ /* e4 */ 0x00e5a0ba, 0x00e6a68a, 0x00e882b4, 0x00e592b2,
+ /* e8 */ 0x00e5b48e, 0x00e59fbc, 0x00e7a295, 0x00e9b7ba,
+ /* ec */ 0x00e4bd9c, 0x00e5898a, 0x00e5928b, 0x00e690be,
+ /* f0 */ 0x00e698a8, 0x00e69c94, 0x00e69fb5, 0x00e7aa84,
+ /* f4 */ 0x00e7ad96, 0x00e7b4a2, 0x00e98caf, 0x00e6a19c,
+ /* f8 */ 0x00e9aead, 0x00e7acb9, 0x00e58c99, 0x00e5868a,
+ /* fc */ 0x00e588b7,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00b11 ***/
+
+ /* 40 */ 0x00e5af9f, 0x00e68bb6, 0x00e692ae, 0x00e693a6,
+ /* 44 */ 0x00e69cad, 0x00e6aeba, 0x00e896a9, 0x00e99b91,
+ /* 48 */ 0x00e79a90, 0x00e9af96, 0x00e68d8c, 0x00e98c86,
+ /* 4c */ 0x00e9aeab, 0x00e79abf, 0x00e69992, 0x00e4b889,
+ /* 50 */ 0x00e58298, 0x00e58f82, 0x00e5b1b1, 0x00e683a8,
+ /* 54 */ 0x00e69292, 0x00e695a3, 0x00e6a19f, 0x00e787a6,
+ /* 58 */ 0x00e78f8a, 0x00e794a3, 0x00e7ae97, 0x00e7ba82,
+ /* 5c */ 0x00e89a95, 0x00e8ae83, 0x00e8b39b, 0x00e985b8,
+ /* 60 */ 0x00e9a490, 0x00e696ac, 0x00e69aab, 0x00e6ae8b,
+ /* 64 */ 0x00e4bb95, 0x00e4bb94, 0x00e4bcba, 0x00e4bdbf,
+ /* 68 */ 0x00e588ba, 0x00e58fb8, 0x00e58fb2, 0x00e597a3,
+ /* 6c */ 0x00e59b9b, 0x00e5a3ab, 0x00e5a78b, 0x00e5a789,
+ /* 70 */ 0x00e5a7bf, 0x00e5ad90, 0x00e5b18d, 0x00e5b882,
+ /* 74 */ 0x00e5b8ab, 0x00e5bf97, 0x00e6809d, 0x00e68c87,
+ /* 78 */ 0x00e694af, 0x00e5ad9c, 0x00e696af, 0x00e696bd,
+ /* 7c */ 0x00e697a8, 0x00e69e9d, 0x00e6ada2, 0x00000000,
+ /* 80 */ 0x00e6adbb, 0x00e6b08f, 0x00e78d85, 0x00e7a589,
+ /* 84 */ 0x00e7a781, 0x00e7b3b8, 0x00e7b499, 0x00e7b4ab,
+ /* 88 */ 0x00e882a2, 0x00e88482, 0x00e887b3, 0x00e8a696,
+ /* 8c */ 0x00e8a99e, 0x00e8a9a9, 0x00e8a9a6, 0x00e8aa8c,
+ /* 90 */ 0x00e8abae, 0x00e8b387, 0x00e8b39c, 0x00e99b8c,
+ /* 94 */ 0x00e9a3bc, 0x00e6adaf, 0x00e4ba8b, 0x00e4bcbc,
+ /* 98 */ 0x00e4be8d, 0x00e58590, 0x00e5ad97, 0x00e5afba,
+ /* 9c */ 0x00e68588, 0x00e68c81, 0x00e69982, 0x00e6aca1,
+ /* a0 */ 0x00e6bb8b, 0x00e6b2bb, 0x00e788be, 0x00e792bd,
+ /* a4 */ 0x00e79794, 0x00e7a381, 0x00e7a4ba, 0x00e8808c,
+ /* a8 */ 0x00e880b3, 0x00e887aa, 0x00e89294, 0x00e8be9e,
+ /* ac */ 0x00e6b190, 0x00e9b9bf, 0x00e5bc8f, 0x00e8ad98,
+ /* b0 */ 0x00e9b4ab, 0x00e7abba, 0x00e8bbb8, 0x00e5ae8d,
+ /* b4 */ 0x00e99bab, 0x00e4b883, 0x00e58fb1, 0x00e59fb7,
+ /* b8 */ 0x00e5a4b1, 0x00e5ab89, 0x00e5aea4, 0x00e68289,
+ /* bc */ 0x00e6b9bf, 0x00e6bc86, 0x00e796be, 0x00e8b3aa,
+ /* c0 */ 0x00e5ae9f, 0x00e89480, 0x00e7afa0, 0x00e581b2,
+ /* c4 */ 0x00e69fb4, 0x00e88a9d, 0x00e5b1a1, 0x00e8958a,
+ /* c8 */ 0x00e7b89e, 0x00e8888e, 0x00e58699, 0x00e5b084,
+ /* cc */ 0x00e68da8, 0x00e8b5a6, 0x00e6969c, 0x00e785ae,
+ /* d0 */ 0x00e7a4be, 0x00e7b497, 0x00e88085, 0x00e8ac9d,
+ /* d4 */ 0x00e8bb8a, 0x00e981ae, 0x00e89b87, 0x00e982aa,
+ /* d8 */ 0x00e5809f, 0x00e58bba, 0x00e5b0ba, 0x00e69d93,
+ /* dc */ 0x00e781bc, 0x00e788b5, 0x00e9858c, 0x00e98788,
+ /* e0 */ 0x00e98cab, 0x00e88ba5, 0x00e5af82, 0x00e5bcb1,
+ /* e4 */ 0x00e683b9, 0x00e4b8bb, 0x00e58f96, 0x00e5ae88,
+ /* e8 */ 0x00e6898b, 0x00e69cb1, 0x00e6ae8a, 0x00e78ba9,
+ /* ec */ 0x00e78fa0, 0x00e7a8ae, 0x00e885ab, 0x00e8b6a3,
+ /* f0 */ 0x00e98592, 0x00e9a696, 0x00e58492, 0x00e58f97,
+ /* f4 */ 0x00e591aa, 0x00e5afbf, 0x00e68e88, 0x00e6a8b9,
+ /* f8 */ 0x00e7b6ac, 0x00e99c80, 0x00e59b9a, 0x00e58f8e,
+ /* fc */ 0x00e591a8,
+
+ /*** Two byte table, leaf: 8fxx - offset 0x00bce ***/
+
+ /* 40 */ 0x00e5ae97, 0x00e5b0b1, 0x00e5b79e, 0x00e4bfae,
+ /* 44 */ 0x00e68481, 0x00e68bbe, 0x00e6b4b2, 0x00e7a780,
+ /* 48 */ 0x00e7a78b, 0x00e7b582, 0x00e7b98d, 0x00e7bf92,
+ /* 4c */ 0x00e887ad, 0x00e8889f, 0x00e89290, 0x00e8a186,
+ /* 50 */ 0x00e8a5b2, 0x00e8ae90, 0x00e8b9b4, 0x00e8bcaf,
+ /* 54 */ 0x00e980b1, 0x00e9858b, 0x00e985ac, 0x00e99b86,
+ /* 58 */ 0x00e9869c, 0x00e4bb80, 0x00e4bd8f, 0x00e58585,
+ /* 5c */ 0x00e58d81, 0x00e5be93, 0x00e6888e, 0x00e69f94,
+ /* 60 */ 0x00e6b181, 0x00e6b88b, 0x00e78da3, 0x00e7b8a6,
+ /* 64 */ 0x00e9878d, 0x00e98a83, 0x00e58f94, 0x00e5a499,
+ /* 68 */ 0x00e5aebf, 0x00e6b791, 0x00e7a59d, 0x00e7b8ae,
+ /* 6c */ 0x00e7b29b, 0x00e5a1be, 0x00e7869f, 0x00e587ba,
+ /* 70 */ 0x00e8a193, 0x00e8bfb0, 0x00e4bf8a, 0x00e5b3bb,
+ /* 74 */ 0x00e698a5, 0x00e79eac, 0x00e7aba3, 0x00e8889c,
+ /* 78 */ 0x00e9a7bf, 0x00e58786, 0x00e5beaa, 0x00e697ac,
+ /* 7c */ 0x00e6a5af, 0x00e6ae89, 0x00e6b7b3, 0x00000000,
+ /* 80 */ 0x00e6ba96, 0x00e6bda4, 0x00e79bbe, 0x00e7b494,
+ /* 84 */ 0x00e5b7a1, 0x00e981b5, 0x00e98687, 0x00e9a086,
+ /* 88 */ 0x00e587a6, 0x00e5889d, 0x00e68980, 0x00e69a91,
+ /* 8c */ 0x00e69b99, 0x00e6b89a, 0x00e5bab6, 0x00e7b792,
+ /* 90 */ 0x00e7bdb2, 0x00e69bb8, 0x00e896af, 0x00e897b7,
+ /* 94 */ 0x00e8abb8, 0x00e58aa9, 0x00e58f99, 0x00e5a5b3,
+ /* 98 */ 0x00e5ba8f, 0x00e5be90, 0x00e68195, 0x00e98ba4,
+ /* 9c */ 0x00e999a4, 0x00e582b7, 0x00e5849f, 0x00e58b9d,
+ /* a0 */ 0x00e58ca0, 0x00e58d87, 0x00e58fac, 0x00e593a8,
+ /* a4 */ 0x00e59586, 0x00e594b1, 0x00e59897, 0x00e5a5a8,
+ /* a8 */ 0x00e5a6be, 0x00e5a8bc, 0x00e5aeb5, 0x00e5b086,
+ /* ac */ 0x00e5b08f, 0x00e5b091, 0x00e5b09a, 0x00e5ba84,
+ /* b0 */ 0x00e5ba8a, 0x00e5bba0, 0x00e5bdb0, 0x00e689bf,
+ /* b4 */ 0x00e68a84, 0x00e68b9b, 0x00e68e8c, 0x00e68db7,
+ /* b8 */ 0x00e69887, 0x00e6988c, 0x00e698ad, 0x00e699b6,
+ /* bc */ 0x00e69dbe, 0x00e6a2a2, 0x00e6a89f, 0x00e6a8b5,
+ /* c0 */ 0x00e6b2bc, 0x00e6b688, 0x00e6b889, 0x00e6b998,
+ /* c4 */ 0x00e784bc, 0x00e784a6, 0x00e785a7, 0x00e79787,
+ /* c8 */ 0x00e79c81, 0x00e7a19d, 0x00e7a481, 0x00e7a5a5,
+ /* cc */ 0x00e7a7b0, 0x00e7aba0, 0x00e7ac91, 0x00e7b2a7,
+ /* d0 */ 0x00e7b4b9, 0x00e88296, 0x00e88f96, 0x00e8928b,
+ /* d4 */ 0x00e89589, 0x00e8a19d, 0x00e8a3b3, 0x00e8a89f,
+ /* d8 */ 0x00e8a8bc, 0x00e8a994, 0x00e8a9b3, 0x00e8b1a1,
+ /* dc */ 0x00e8b39e, 0x00e986a4, 0x00e989a6, 0x00e98dbe,
+ /* e0 */ 0x00e99098, 0x00e99a9c, 0x00e99e98, 0x00e4b88a,
+ /* e4 */ 0x00e4b888, 0x00e4b89e, 0x00e4b997, 0x00e58697,
+ /* e8 */ 0x00e589b0, 0x00e59f8e, 0x00e5a0b4, 0x00e5a38c,
+ /* ec */ 0x00e5aca2, 0x00e5b8b8, 0x00e68385, 0x00e693be,
+ /* f0 */ 0x00e69da1, 0x00e69d96, 0x00e6b584, 0x00e78ab6,
+ /* f4 */ 0x00e795b3, 0x00e7a9a3, 0x00e892b8, 0x00e8adb2,
+ /* f8 */ 0x00e986b8, 0x00e98ca0, 0x00e598b1, 0x00e59fb4,
+ /* fc */ 0x00e9a3be,
+
+ /*** Two byte table, leaf: 90xx - offset 0x00c8b ***/
+
+ /* 40 */ 0x00e68bad, 0x00e6a48d, 0x00e6ae96, 0x00e787ad,
+ /* 44 */ 0x00e7b994, 0x00e881b7, 0x00e889b2, 0x00e8a7a6,
+ /* 48 */ 0x00e9a39f, 0x00e89d95, 0x00e8beb1, 0x00e5b0bb,
+ /* 4c */ 0x00e4bcb8, 0x00e4bfa1, 0x00e4beb5, 0x00e59487,
+ /* 50 */ 0x00e5a8a0, 0x00e5af9d, 0x00e5afa9, 0x00e5bf83,
+ /* 54 */ 0x00e6858e, 0x00e68caf, 0x00e696b0, 0x00e6998b,
+ /* 58 */ 0x00e6a3ae, 0x00e6a69b, 0x00e6b5b8, 0x00e6b7b1,
+ /* 5c */ 0x00e794b3, 0x00e796b9, 0x00e79c9f, 0x00e7a59e,
+ /* 60 */ 0x00e7a7a6, 0x00e7b4b3, 0x00e887a3, 0x00e88aaf,
+ /* 64 */ 0x00e896aa, 0x00e8a6aa, 0x00e8a8ba, 0x00e8baab,
+ /* 68 */ 0x00e8be9b, 0x00e980b2, 0x00e9879d, 0x00e99c87,
+ /* 6c */ 0x00e4baba, 0x00e4bb81, 0x00e58883, 0x00e5a1b5,
+ /* 70 */ 0x00e5a3ac, 0x00e5b08b, 0x00e7949a, 0x00e5b0bd,
+ /* 74 */ 0x00e8858e, 0x00e8a88a, 0x00e8bf85, 0x00e999a3,
+ /* 78 */ 0x00e99dad, 0x00e7aca5, 0x00e8ab8f, 0x00e9a088,
+ /* 7c */ 0x00e985a2, 0x00e59bb3, 0x00e58ea8, 0x00000000,
+ /* 80 */ 0x00e98097, 0x00e590b9, 0x00e59e82, 0x00e5b8a5,
+ /* 84 */ 0x00e68ea8, 0x00e6b0b4, 0x00e7828a, 0x00e79da1,
+ /* 88 */ 0x00e7b28b, 0x00e7bfa0, 0x00e8a1b0, 0x00e98182,
+ /* 8c */ 0x00e98594, 0x00e98c90, 0x00e98c98, 0x00e99a8f,
+ /* 90 */ 0x00e7919e, 0x00e9ab84, 0x00e5b487, 0x00e5b5a9,
+ /* 94 */ 0x00e695b0, 0x00e69ea2, 0x00e8b6a8, 0x00e99b9b,
+ /* 98 */ 0x00e68dae, 0x00e69d89, 0x00e6a499, 0x00e88f85,
+ /* 9c */ 0x00e9a097, 0x00e99b80, 0x00e8a3be, 0x00e6be84,
+ /* a0 */ 0x00e691ba, 0x00e5afb8, 0x00e4b896, 0x00e780ac,
+ /* a4 */ 0x00e7959d, 0x00e698af, 0x00e58784, 0x00e588b6,
+ /* a8 */ 0x00e58ba2, 0x00e5a793, 0x00e5be81, 0x00e680a7,
+ /* ac */ 0x00e68890, 0x00e694bf, 0x00e695b4, 0x00e6989f,
+ /* b0 */ 0x00e699b4, 0x00e6a3b2, 0x00e6a096, 0x00e6ada3,
+ /* b4 */ 0x00e6b885, 0x00e789b2, 0x00e7949f, 0x00e79b9b,
+ /* b8 */ 0x00e7b2be, 0x00e88196, 0x00e5a3b0, 0x00e8a3bd,
+ /* bc */ 0x00e8a5bf, 0x00e8aaa0, 0x00e8aa93, 0x00e8ab8b,
+ /* c0 */ 0x00e9809d, 0x00e98692, 0x00e99d92, 0x00e99d99,
+ /* c4 */ 0x00e69689, 0x00e7a88e, 0x00e88486, 0x00e99abb,
+ /* c8 */ 0x00e5b8ad, 0x00e6839c, 0x00e6889a, 0x00e696a5,
+ /* cc */ 0x00e69894, 0x00e69e90, 0x00e79fb3, 0x00e7a98d,
+ /* d0 */ 0x00e7b18d, 0x00e7b8be, 0x00e8848a, 0x00e8b2ac,
+ /* d4 */ 0x00e8b5a4, 0x00e8b7a1, 0x00e8b99f, 0x00e7a2a9,
+ /* d8 */ 0x00e58887, 0x00e68b99, 0x00e68ea5, 0x00e69182,
+ /* dc */ 0x00e68a98, 0x00e8a8ad, 0x00e7aa83, 0x00e7af80,
+ /* e0 */ 0x00e8aaac, 0x00e99baa, 0x00e7b5b6, 0x00e8888c,
+ /* e4 */ 0x00e89d89, 0x00e4bb99, 0x00e58588, 0x00e58d83,
+ /* e8 */ 0x00e58da0, 0x00e5aea3, 0x00e5b082, 0x00e5b096,
+ /* ec */ 0x00e5b79d, 0x00e688a6, 0x00e68987, 0x00e692b0,
+ /* f0 */ 0x00e6a093, 0x00e6a0b4, 0x00e6b389, 0x00e6b585,
+ /* f4 */ 0x00e6b497, 0x00e69f93, 0x00e6bd9c, 0x00e7858e,
+ /* f8 */ 0x00e785bd, 0x00e6978b, 0x00e7a9bf, 0x00e7aead,
+ /* fc */ 0x00e7b79a,
+
+ /*** Two byte table, leaf: 91xx - offset 0x00d48 ***/
+
+ /* 40 */ 0x00e7b98a, 0x00e7bea8, 0x00e885ba, 0x00e8889b,
+ /* 44 */ 0x00e888b9, 0x00e896a6, 0x00e8a9ae, 0x00e8b38e,
+ /* 48 */ 0x00e8b7b5, 0x00e981b8, 0x00e981b7, 0x00e98aad,
+ /* 4c */ 0x00e98a91, 0x00e99683, 0x00e9aeae, 0x00e5898d,
+ /* 50 */ 0x00e59684, 0x00e6bcb8, 0x00e784b6, 0x00e585a8,
+ /* 54 */ 0x00e7a685, 0x00e7b995, 0x00e886b3, 0x00e7b38e,
+ /* 58 */ 0x00e5998c, 0x00e5a191, 0x00e5b2a8, 0x00e68eaa,
+ /* 5c */ 0x00e69bbe, 0x00e69bbd, 0x00e6a59a, 0x00e78b99,
+ /* 60 */ 0x00e7968f, 0x00e7968e, 0x00e7a48e, 0x00e7a596,
+ /* 64 */ 0x00e7a79f, 0x00e7b297, 0x00e7b4a0, 0x00e7b584,
+ /* 68 */ 0x00e89887, 0x00e8a8b4, 0x00e998bb, 0x00e981a1,
+ /* 6c */ 0x00e9bca0, 0x00e583a7, 0x00e589b5, 0x00e58f8c,
+ /* 70 */ 0x00e58fa2, 0x00e58089, 0x00e596aa, 0x00e5a3ae,
+ /* 74 */ 0x00e5a58f, 0x00e788bd, 0x00e5ae8b, 0x00e5b1a4,
+ /* 78 */ 0x00e58c9d, 0x00e683a3, 0x00e683b3, 0x00e68d9c,
+ /* 7c */ 0x00e68e83, 0x00e68cbf, 0x00e68ebb, 0x00000000,
+ /* 80 */ 0x00e6938d, 0x00e697a9, 0x00e69bb9, 0x00e5b7a3,
+ /* 84 */ 0x00e6a78d, 0x00e6a7bd, 0x00e6bc95, 0x00e787a5,
+ /* 88 */ 0x00e4ba89, 0x00e797a9, 0x00e79bb8, 0x00e7aa93,
+ /* 8c */ 0x00e7b39f, 0x00e7b78f, 0x00e7b69c, 0x00e881a1,
+ /* 90 */ 0x00e88d89, 0x00e88d98, 0x00e891ac, 0x00e892bc,
+ /* 94 */ 0x00e897bb, 0x00e8a385, 0x00e8b5b0, 0x00e98081,
+ /* 98 */ 0x00e981ad, 0x00e98e97, 0x00e99c9c, 0x00e9a892,
+ /* 9c */ 0x00e5838f, 0x00e5a297, 0x00e6868e, 0x00e88793,
+ /* a0 */ 0x00e894b5, 0x00e8b488, 0x00e980a0, 0x00e4bf83,
+ /* a4 */ 0x00e581b4, 0x00e58987, 0x00e58db3, 0x00e681af,
+ /* a8 */ 0x00e68d89, 0x00e69d9f, 0x00e6b8ac, 0x00e8b6b3,
+ /* ac */ 0x00e9809f, 0x00e4bf97, 0x00e5b19e, 0x00e8b38a,
+ /* b0 */ 0x00e6978f, 0x00e7b69a, 0x00e58d92, 0x00e8a296,
+ /* b4 */ 0x00e585b6, 0x00e68f83, 0x00e5ad98, 0x00e5adab,
+ /* b8 */ 0x00e5b08a, 0x00e6908d, 0x00e69d91, 0x00e9819c,
+ /* bc */ 0x00e4bb96, 0x00e5a49a, 0x00e5a4aa, 0x00e6b1b0,
+ /* c0 */ 0x00e8a991, 0x00e594be, 0x00e5a095, 0x00e5a6a5,
+ /* c4 */ 0x00e683b0, 0x00e68993, 0x00e69f81, 0x00e888b5,
+ /* c8 */ 0x00e6a595, 0x00e99980, 0x00e9a784, 0x00e9a8a8,
+ /* cc */ 0x00e4bd93, 0x00e5a086, 0x00e5afbe, 0x00e88090,
+ /* d0 */ 0x00e5b2b1, 0x00e5b8af, 0x00e5be85, 0x00e680a0,
+ /* d4 */ 0x00e6858b, 0x00e688b4, 0x00e69bbf, 0x00e6b3b0,
+ /* d8 */ 0x00e6bb9e, 0x00e8838e, 0x00e885bf, 0x00e88b94,
+ /* dc */ 0x00e8a28b, 0x00e8b2b8, 0x00e98080, 0x00e980ae,
+ /* e0 */ 0x00e99a8a, 0x00e9bb9b, 0x00e9af9b, 0x00e4bba3,
+ /* e4 */ 0x00e58fb0, 0x00e5a4a7, 0x00e7acac, 0x00e9868d,
+ /* e8 */ 0x00e9a18c, 0x00e9b7b9, 0x00e6bb9d, 0x00e780a7,
+ /* ec */ 0x00e58d93, 0x00e59584, 0x00e5ae85, 0x00e68998,
+ /* f0 */ 0x00e68a9e, 0x00e68b93, 0x00e6b2a2, 0x00e6bfaf,
+ /* f4 */ 0x00e790a2, 0x00e8a897, 0x00e990b8, 0x00e6bf81,
+ /* f8 */ 0x00e8abbe, 0x00e88cb8, 0x00e587a7, 0x00e89bb8,
+ /* fc */ 0x00e58faa,
+
+ /*** Two byte table, leaf: 92xx - offset 0x00e05 ***/
+
+ /* 40 */ 0x00e58fa9, 0x00e4bd86, 0x00e98194, 0x00e8beb0,
+ /* 44 */ 0x00e5a5aa, 0x00e884b1, 0x00e5b7bd, 0x00e7abaa,
+ /* 48 */ 0x00e8bebf, 0x00e6a39a, 0x00e8b0b7, 0x00e78bb8,
+ /* 4c */ 0x00e9b188, 0x00e6a8bd, 0x00e8aab0, 0x00e4b8b9,
+ /* 50 */ 0x00e58d98, 0x00e59886, 0x00e59da6, 0x00e68b85,
+ /* 54 */ 0x00e68ea2, 0x00e697a6, 0x00e6ad8e, 0x00e6b7a1,
+ /* 58 */ 0x00e6b99b, 0x00e782ad, 0x00e79fad, 0x00e7abaf,
+ /* 5c */ 0x00e7aeaa, 0x00e7b6bb, 0x00e880bd, 0x00e88386,
+ /* 60 */ 0x00e89b8b, 0x00e8aa95, 0x00e98d9b, 0x00e59ba3,
+ /* 64 */ 0x00e5a387, 0x00e5bcbe, 0x00e696ad, 0x00e69a96,
+ /* 68 */ 0x00e6aa80, 0x00e6aeb5, 0x00e794b7, 0x00e8ab87,
+ /* 6c */ 0x00e580a4, 0x00e79fa5, 0x00e59cb0, 0x00e5bc9b,
+ /* 70 */ 0x00e681a5, 0x00e699ba, 0x00e6b1a0, 0x00e797b4,
+ /* 74 */ 0x00e7a89a, 0x00e7bdae, 0x00e887b4, 0x00e89c98,
+ /* 78 */ 0x00e98185, 0x00e9a6b3, 0x00e7af89, 0x00e7959c,
+ /* 7c */ 0x00e7abb9, 0x00e7ad91, 0x00e89384, 0x00000000,
+ /* 80 */ 0x00e98090, 0x00e7a7a9, 0x00e7aa92, 0x00e88cb6,
+ /* 84 */ 0x00e5aba1, 0x00e79d80, 0x00e4b8ad, 0x00e4bbb2,
+ /* 88 */ 0x00e5ae99, 0x00e5bfa0, 0x00e68abd, 0x00e698bc,
+ /* 8c */ 0x00e69fb1, 0x00e6b3a8, 0x00e899ab, 0x00e8a1b7,
+ /* 90 */ 0x00e8a8bb, 0x00e9858e, 0x00e98bb3, 0x00e9a790,
+ /* 94 */ 0x00e6a897, 0x00e780a6, 0x00e78caa, 0x00e88ba7,
+ /* 98 */ 0x00e89197, 0x00e8b2af, 0x00e4b881, 0x00e58586,
+ /* 9c */ 0x00e5878b, 0x00e5968b, 0x00e5afb5, 0x00e5b896,
+ /* a0 */ 0x00e5b8b3, 0x00e5ba81, 0x00e5bc94, 0x00e5bcb5,
+ /* a4 */ 0x00e5bdab, 0x00e5beb4, 0x00e687b2, 0x00e68c91,
+ /* a8 */ 0x00e69aa2, 0x00e69c9d, 0x00e6bdae, 0x00e78992,
+ /* ac */ 0x00e794ba, 0x00e79cba, 0x00e881b4, 0x00e884b9,
+ /* b0 */ 0x00e885b8, 0x00e89db6, 0x00e8aabf, 0x00e8ab9c,
+ /* b4 */ 0x00e8b685, 0x00e8b7b3, 0x00e98a9a, 0x00e995b7,
+ /* b8 */ 0x00e9a082, 0x00e9b3a5, 0x00e58b85, 0x00e68d97,
+ /* bc */ 0x00e79bb4, 0x00e69c95, 0x00e6b288, 0x00e78f8d,
+ /* c0 */ 0x00e8b383, 0x00e98eae, 0x00e999b3, 0x00e6b4a5,
+ /* c4 */ 0x00e5a29c, 0x00e6a48e, 0x00e6a78c, 0x00e8bfbd,
+ /* c8 */ 0x00e98e9a, 0x00e7979b, 0x00e9809a, 0x00e5a19a,
+ /* cc */ 0x00e6a082, 0x00e68eb4, 0x00e6a7bb, 0x00e4bd83,
+ /* d0 */ 0x00e6bcac, 0x00e69f98, 0x00e8bebb, 0x00e894a6,
+ /* d4 */ 0x00e7b6b4, 0x00e98d94, 0x00e6a4bf, 0x00e6bdb0,
+ /* d8 */ 0x00e59daa, 0x00e5a3b7, 0x00e5acac, 0x00e7b4ac,
+ /* dc */ 0x00e788aa, 0x00e5908a, 0x00e987a3, 0x00e9b6b4,
+ /* e0 */ 0x00e4baad, 0x00e4bd8e, 0x00e5819c, 0x00e581b5,
+ /* e4 */ 0x00e58983, 0x00e8b29e, 0x00e59188, 0x00e5a0a4,
+ /* e8 */ 0x00e5ae9a, 0x00e5b89d, 0x00e5ba95, 0x00e5baad,
+ /* ec */ 0x00e5bbb7, 0x00e5bc9f, 0x00e6828c, 0x00e68ab5,
+ /* f0 */ 0x00e68cba, 0x00e68f90, 0x00e6a2af, 0x00e6b180,
+ /* f4 */ 0x00e7a287, 0x00e7a68e, 0x00e7a88b, 0x00e7b7a0,
+ /* f8 */ 0x00e88987, 0x00e8a882, 0x00e8aba6, 0x00e8b984,
+ /* fc */ 0x00e98093,
+
+ /*** Two byte table, leaf: 93xx - offset 0x00ec2 ***/
+
+ /* 40 */ 0x00e982b8, 0x00e984ad, 0x00e98798, 0x00e9bc8e,
+ /* 44 */ 0x00e6b3a5, 0x00e69198, 0x00e693a2, 0x00e695b5,
+ /* 48 */ 0x00e6bbb4, 0x00e79a84, 0x00e7ac9b, 0x00e981a9,
+ /* 4c */ 0x00e98f91, 0x00e6baba, 0x00e593b2, 0x00e5beb9,
+ /* 50 */ 0x00e692a4, 0x00e8bd8d, 0x00e8bfad, 0x00e98984,
+ /* 54 */ 0x00e585b8, 0x00e5a1ab, 0x00e5a4a9, 0x00e5b195,
+ /* 58 */ 0x00e5ba97, 0x00e6b7bb, 0x00e7ba8f, 0x00e7949c,
+ /* 5c */ 0x00e8b2bc, 0x00e8bba2, 0x00e9a19b, 0x00e782b9,
+ /* 60 */ 0x00e4bc9d, 0x00e6aebf, 0x00e6beb1, 0x00e794b0,
+ /* 64 */ 0x00e99bbb, 0x00e5858e, 0x00e59090, 0x00e5a0b5,
+ /* 68 */ 0x00e5a197, 0x00e5a6ac, 0x00e5b1a0, 0x00e5be92,
+ /* 6c */ 0x00e69697, 0x00e69d9c, 0x00e6b8a1, 0x00e799bb,
+ /* 70 */ 0x00e88f9f, 0x00e8b3ad, 0x00e98094, 0x00e983bd,
+ /* 74 */ 0x00e98d8d, 0x00e7a0a5, 0x00e7a0ba, 0x00e58aaa,
+ /* 78 */ 0x00e5baa6, 0x00e59c9f, 0x00e5a5b4, 0x00e68092,
+ /* 7c */ 0x00e58092, 0x00e5859a, 0x00e586ac, 0x00000000,
+ /* 80 */ 0x00e5878d, 0x00e58880, 0x00e59490, 0x00e5a194,
+ /* 84 */ 0x00e5a198, 0x00e5a597, 0x00e5ae95, 0x00e5b3b6,
+ /* 88 */ 0x00e5b68b, 0x00e682bc, 0x00e68a95, 0x00e690ad,
+ /* 8c */ 0x00e69db1, 0x00e6a183, 0x00e6a2bc, 0x00e6a39f,
+ /* 90 */ 0x00e79b97, 0x00e6b798, 0x00e6b9af, 0x00e6b69b,
+ /* 94 */ 0x00e781af, 0x00e78788, 0x00e5bd93, 0x00e79798,
+ /* 98 */ 0x00e7a5b7, 0x00e7ad89, 0x00e7ad94, 0x00e7ad92,
+ /* 9c */ 0x00e7b396, 0x00e7b5b1, 0x00e588b0, 0x00e891a3,
+ /* a0 */ 0x00e895a9, 0x00e897a4, 0x00e8a88e, 0x00e8ac84,
+ /* a4 */ 0x00e8b186, 0x00e8b88f, 0x00e98083, 0x00e9808f,
+ /* a8 */ 0x00e99099, 0x00e999b6, 0x00e9a0ad, 0x00e9a8b0,
+ /* ac */ 0x00e99798, 0x00e5838d, 0x00e58b95, 0x00e5908c,
+ /* b0 */ 0x00e5a082, 0x00e5b08e, 0x00e686a7, 0x00e6929e,
+ /* b4 */ 0x00e6b49e, 0x00e79eb3, 0x00e7aba5, 0x00e883b4,
+ /* b8 */ 0x00e89084, 0x00e98193, 0x00e98a85, 0x00e5b3a0,
+ /* bc */ 0x00e9b487, 0x00e58cbf, 0x00e5be97, 0x00e5beb3,
+ /* c0 */ 0x00e6b69c, 0x00e789b9, 0x00e79da3, 0x00e7a6bf,
+ /* c4 */ 0x00e7afa4, 0x00e6af92, 0x00e78bac, 0x00e8aaad,
+ /* c8 */ 0x00e6a083, 0x00e6a9a1, 0x00e587b8, 0x00e7aa81,
+ /* cc */ 0x00e6a4b4, 0x00e5b18a, 0x00e9b3b6, 0x00e88bab,
+ /* d0 */ 0x00e5af85, 0x00e98589, 0x00e7809e, 0x00e599b8,
+ /* d4 */ 0x00e5b1af, 0x00e68387, 0x00e695a6, 0x00e6b28c,
+ /* d8 */ 0x00e8b19a, 0x00e98181, 0x00e9a093, 0x00e59191,
+ /* dc */ 0x00e69b87, 0x00e9888d, 0x00e5a588, 0x00e982a3,
+ /* e0 */ 0x00e58685, 0x00e4b98d, 0x00e587aa, 0x00e89699,
+ /* e4 */ 0x00e8ac8e, 0x00e78198, 0x00e68dba, 0x00e98d8b,
+ /* e8 */ 0x00e6a5a2, 0x00e9a6b4, 0x00e7b884, 0x00e795b7,
+ /* ec */ 0x00e58d97, 0x00e6a5a0, 0x00e8bb9f, 0x00e99ba3,
+ /* f0 */ 0x00e6b19d, 0x00e4ba8c, 0x00e5b0bc, 0x00e5bc90,
+ /* f4 */ 0x00e8bfa9, 0x00e58c82, 0x00e8b391, 0x00e88289,
+ /* f8 */ 0x00e899b9, 0x00e5bbbf, 0x00e697a5, 0x00e4b9b3,
+ /* fc */ 0x00e585a5,
+
+ /*** Two byte table, leaf: 94xx - offset 0x00f7f ***/
+
+ /* 40 */ 0x00e5a682, 0x00e5b0bf, 0x00e99fae, 0x00e4bbbb,
+ /* 44 */ 0x00e5a68a, 0x00e5bf8d, 0x00e8aa8d, 0x00e6bfa1,
+ /* 48 */ 0x00e7a6b0, 0x00e7a5a2, 0x00e5afa7, 0x00e891b1,
+ /* 4c */ 0x00e78cab, 0x00e786b1, 0x00e5b9b4, 0x00e5bfb5,
+ /* 50 */ 0x00e68dbb, 0x00e6929a, 0x00e78783, 0x00e7b298,
+ /* 54 */ 0x00e4b983, 0x00e5bbbc, 0x00e4b98b, 0x00e59f9c,
+ /* 58 */ 0x00e59aa2, 0x00e682a9, 0x00e6bf83, 0x00e7b48d,
+ /* 5c */ 0x00e883bd, 0x00e884b3, 0x00e886bf, 0x00e8beb2,
+ /* 60 */ 0x00e8a697, 0x00e89aa4, 0x00e5b7b4, 0x00e68a8a,
+ /* 64 */ 0x00e692ad, 0x00e8a687, 0x00e69db7, 0x00e6b3a2,
+ /* 68 */ 0x00e6b4be, 0x00e790b6, 0x00e7a0b4, 0x00e5a986,
+ /* 6c */ 0x00e7bdb5, 0x00e88aad, 0x00e9a6ac, 0x00e4bfb3,
+ /* 70 */ 0x00e5bb83, 0x00e68b9d, 0x00e68e92, 0x00e69597,
+ /* 74 */ 0x00e69daf, 0x00e79b83, 0x00e7898c, 0x00e8838c,
+ /* 78 */ 0x00e882ba, 0x00e8bca9, 0x00e9858d, 0x00e5808d,
+ /* 7c */ 0x00e59fb9, 0x00e5aa92, 0x00e6a285, 0x00000000,
+ /* 80 */ 0x00e6a5b3, 0x00e785a4, 0x00e78bbd, 0x00e8b2b7,
+ /* 84 */ 0x00e5a3b2, 0x00e8b3a0, 0x00e999aa, 0x00e98099,
+ /* 88 */ 0x00e89dbf, 0x00e7a7a4, 0x00e79fa7, 0x00e890a9,
+ /* 8c */ 0x00e4bcaf, 0x00e589a5, 0x00e58d9a, 0x00e68b8d,
+ /* 90 */ 0x00e69f8f, 0x00e6b38a, 0x00e799bd, 0x00e7ae94,
+ /* 94 */ 0x00e7b295, 0x00e888b6, 0x00e89684, 0x00e8bfab,
+ /* 98 */ 0x00e69b9d, 0x00e6bca0, 0x00e78886, 0x00e7b89b,
+ /* 9c */ 0x00e88eab, 0x00e9a781, 0x00e9baa6, 0x00e587bd,
+ /* a0 */ 0x00e7aeb1, 0x00e7a1b2, 0x00e7aeb8, 0x00e88287,
+ /* a4 */ 0x00e7ad88, 0x00e6aba8, 0x00e5b9a1, 0x00e8828c,
+ /* a8 */ 0x00e79591, 0x00e795a0, 0x00e585ab, 0x00e989a2,
+ /* ac */ 0x00e6ba8c, 0x00e799ba, 0x00e98697, 0x00e9abaa,
+ /* b0 */ 0x00e4bc90, 0x00e7bdb0, 0x00e68a9c, 0x00e7ad8f,
+ /* b4 */ 0x00e996a5, 0x00e9b3a9, 0x00e599ba, 0x00e5a199,
+ /* b8 */ 0x00e89ba4, 0x00e99abc, 0x00e4bcb4, 0x00e588a4,
+ /* bc */ 0x00e58d8a, 0x00e58f8d, 0x00e58f9b, 0x00e5b886,
+ /* c0 */ 0x00e690ac, 0x00e69691, 0x00e69dbf, 0x00e6b0be,
+ /* c4 */ 0x00e6b18e, 0x00e78988, 0x00e78aaf, 0x00e78fad,
+ /* c8 */ 0x00e79594, 0x00e7b981, 0x00e888ac, 0x00e897a9,
+ /* cc */ 0x00e8b2a9, 0x00e7af84, 0x00e98786, 0x00e785a9,
+ /* d0 */ 0x00e9a092, 0x00e9a3af, 0x00e68cbd, 0x00e699a9,
+ /* d4 */ 0x00e795aa, 0x00e79ba4, 0x00e7a390, 0x00e89583,
+ /* d8 */ 0x00e89bae, 0x00e58caa, 0x00e58d91, 0x00e590a6,
+ /* dc */ 0x00e5a683, 0x00e5ba87, 0x00e5bdbc, 0x00e682b2,
+ /* e0 */ 0x00e68989, 0x00e689b9, 0x00e68aab, 0x00e69690,
+ /* e4 */ 0x00e6af94, 0x00e6b38c, 0x00e796b2, 0x00e79aae,
+ /* e8 */ 0x00e7a291, 0x00e7a798, 0x00e7b78b, 0x00e7bdb7,
+ /* ec */ 0x00e882a5, 0x00e8a2ab, 0x00e8aab9, 0x00e8b2bb,
+ /* f0 */ 0x00e981bf, 0x00e99d9e, 0x00e9a39b, 0x00e6a88b,
+ /* f4 */ 0x00e7b0b8, 0x00e58299, 0x00e5b0be, 0x00e5beae,
+ /* f8 */ 0x00e69e87, 0x00e6af98, 0x00e790b5, 0x00e79c89,
+ /* fc */ 0x00e7be8e,
+
+ /*** Two byte table, leaf: 95xx - offset 0x0103c ***/
+
+ /* 40 */ 0x00e9bcbb, 0x00e69f8a, 0x00e7a897, 0x00e58cb9,
+ /* 44 */ 0x00e7968b, 0x00e9abad, 0x00e5bda6, 0x00e8869d,
+ /* 48 */ 0x00e88fb1, 0x00e88298, 0x00e5bcbc, 0x00e5bf85,
+ /* 4c */ 0x00e795a2, 0x00e7ad86, 0x00e980bc, 0x00e6a1a7,
+ /* 50 */ 0x00e5a7ab, 0x00e5aa9b, 0x00e7b490, 0x00e799be,
+ /* 54 */ 0x00e8acac, 0x00e4bfb5, 0x00e5bdaa, 0x00e6a899,
+ /* 58 */ 0x00e6b0b7, 0x00e6bc82, 0x00e793a2, 0x00e7a5a8,
+ /* 5c */ 0x00e8a1a8, 0x00e8a995, 0x00e8b1b9, 0x00e5bb9f,
+ /* 60 */ 0x00e68f8f, 0x00e79785, 0x00e7a792, 0x00e88b97,
+ /* 64 */ 0x00e98ca8, 0x00e98bb2, 0x00e8929c, 0x00e89bad,
+ /* 68 */ 0x00e9b0ad, 0x00e59381, 0x00e5bdac, 0x00e6968c,
+ /* 6c */ 0x00e6b59c, 0x00e78095, 0x00e8b2a7, 0x00e8b393,
+ /* 70 */ 0x00e9a0bb, 0x00e6958f, 0x00e793b6, 0x00e4b88d,
+ /* 74 */ 0x00e4bb98, 0x00e59fa0, 0x00e5a4ab, 0x00e5a9a6,
+ /* 78 */ 0x00e5af8c, 0x00e586a8, 0x00e5b883, 0x00e5ba9c,
+ /* 7c */ 0x00e68096, 0x00e689b6, 0x00e695b7, 0x00000000,
+ /* 80 */ 0x00e696a7, 0x00e699ae, 0x00e6b5ae, 0x00e788b6,
+ /* 84 */ 0x00e7aca6, 0x00e88590, 0x00e8869a, 0x00e88a99,
+ /* 88 */ 0x00e8ad9c, 0x00e8b2a0, 0x00e8b3a6, 0x00e8b5b4,
+ /* 8c */ 0x00e9989c, 0x00e99984, 0x00e4beae, 0x00e692ab,
+ /* 90 */ 0x00e6ada6, 0x00e8889e, 0x00e891a1, 0x00e895aa,
+ /* 94 */ 0x00e983a8, 0x00e5b081, 0x00e6a593, 0x00e9a2a8,
+ /* 98 */ 0x00e891ba, 0x00e89597, 0x00e4bc8f, 0x00e589af,
+ /* 9c */ 0x00e5bea9, 0x00e5b985, 0x00e69c8d, 0x00e7a68f,
+ /* a0 */ 0x00e885b9, 0x00e8a487, 0x00e8a686, 0x00e6b7b5,
+ /* a4 */ 0x00e5bc97, 0x00e68995, 0x00e6b2b8, 0x00e4bb8f,
+ /* a8 */ 0x00e789a9, 0x00e9ae92, 0x00e58886, 0x00e590bb,
+ /* ac */ 0x00e599b4, 0x00e5a2b3, 0x00e686a4, 0x00e689ae,
+ /* b0 */ 0x00e7849a, 0x00e5a5ae, 0x00e7b289, 0x00e7b39e,
+ /* b4 */ 0x00e7b49b, 0x00e99bb0, 0x00e69687, 0x00e8819e,
+ /* b8 */ 0x00e4b899, 0x00e4bdb5, 0x00e585b5, 0x00e5a180,
+ /* bc */ 0x00e5b9a3, 0x00e5b9b3, 0x00e5bc8a, 0x00e69f84,
+ /* c0 */ 0x00e4b8a6, 0x00e894bd, 0x00e99689, 0x00e9999b,
+ /* c4 */ 0x00e7b1b3, 0x00e9a081, 0x00e583bb, 0x00e5a381,
+ /* c8 */ 0x00e79996, 0x00e7a2a7, 0x00e588a5, 0x00e79ea5,
+ /* cc */ 0x00e89491, 0x00e7ae86, 0x00e5818f, 0x00e5a489,
+ /* d0 */ 0x00e78987, 0x00e7af87, 0x00e7b7a8, 0x00e8beba,
+ /* d4 */ 0x00e8bf94, 0x00e9818d, 0x00e4bebf, 0x00e58b89,
+ /* d8 */ 0x00e5a8a9, 0x00e5bc81, 0x00e99ead, 0x00e4bf9d,
+ /* dc */ 0x00e88897, 0x00e98baa, 0x00e59c83, 0x00e68d95,
+ /* e0 */ 0x00e6ada9, 0x00e794ab, 0x00e8a39c, 0x00e8bc94,
+ /* e4 */ 0x00e7a982, 0x00e58b9f, 0x00e5a293, 0x00e68595,
+ /* e8 */ 0x00e6888a, 0x00e69aae, 0x00e6af8d, 0x00e7b0bf,
+ /* ec */ 0x00e88fa9, 0x00e580a3, 0x00e4bfb8, 0x00e58c85,
+ /* f0 */ 0x00e59186, 0x00e5a0b1, 0x00e5a589, 0x00e5ae9d,
+ /* f4 */ 0x00e5b3b0, 0x00e5b3af, 0x00e5b4a9, 0x00e5ba96,
+ /* f8 */ 0x00e68ab1, 0x00e68da7, 0x00e694be, 0x00e696b9,
+ /* fc */ 0x00e69c8b,
+
+ /*** Two byte table, leaf: 96xx - offset 0x010f9 ***/
+
+ /* 40 */ 0x00e6b395, 0x00e6b3a1, 0x00e783b9, 0x00e7a0b2,
+ /* 44 */ 0x00e7b8ab, 0x00e8839e, 0x00e88ab3, 0x00e8908c,
+ /* 48 */ 0x00e893ac, 0x00e89c82, 0x00e8a492, 0x00e8a8aa,
+ /* 4c */ 0x00e8b18a, 0x00e982a6, 0x00e98b92, 0x00e9a3bd,
+ /* 50 */ 0x00e9b3b3, 0x00e9b5ac, 0x00e4b98f, 0x00e4baa1,
+ /* 54 */ 0x00e5828d, 0x00e58996, 0x00e59d8a, 0x00e5a6a8,
+ /* 58 */ 0x00e5b8bd, 0x00e5bf98, 0x00e5bf99, 0x00e688bf,
+ /* 5c */ 0x00e69ab4, 0x00e69c9b, 0x00e69f90, 0x00e6a392,
+ /* 60 */ 0x00e58692, 0x00e7b4a1, 0x00e882aa, 0x00e886a8,
+ /* 64 */ 0x00e8ac80, 0x00e8b28c, 0x00e8b2bf, 0x00e989be,
+ /* 68 */ 0x00e998b2, 0x00e590a0, 0x00e9a0ac, 0x00e58c97,
+ /* 6c */ 0x00e58395, 0x00e58d9c, 0x00e5a2a8, 0x00e692b2,
+ /* 70 */ 0x00e69cb4, 0x00e789a7, 0x00e79da6, 0x00e7a986,
+ /* 74 */ 0x00e987a6, 0x00e58b83, 0x00e6b2a1, 0x00e6ae86,
+ /* 78 */ 0x00e5a080, 0x00e5b98c, 0x00e5a594, 0x00e69cac,
+ /* 7c */ 0x00e7bfbb, 0x00e587a1, 0x00e79b86, 0x00000000,
+ /* 80 */ 0x00e691a9, 0x00e7a3a8, 0x00e9ad94, 0x00e9babb,
+ /* 84 */ 0x00e59f8b, 0x00e5a6b9, 0x00e698a7, 0x00e69e9a,
+ /* 88 */ 0x00e6af8e, 0x00e593a9, 0x00e6a799, 0x00e5b995,
+ /* 8c */ 0x00e8869c, 0x00e69e95, 0x00e9aeaa, 0x00e69fbe,
+ /* 90 */ 0x00e9b192, 0x00e6a19d, 0x00e4baa6, 0x00e4bfa3,
+ /* 94 */ 0x00e58f88, 0x00e68ab9, 0x00e69cab, 0x00e6b2ab,
+ /* 98 */ 0x00e8bf84, 0x00e4bead, 0x00e7b9ad, 0x00e9babf,
+ /* 9c */ 0x00e4b887, 0x00e685a2, 0x00e6ba80, 0x00e6bcab,
+ /* a0 */ 0x00e89493, 0x00e591b3, 0x00e69caa, 0x00e9ad85,
+ /* a4 */ 0x00e5b7b3, 0x00e7ae95, 0x00e5b2ac, 0x00e5af86,
+ /* a8 */ 0x00e89c9c, 0x00e6b98a, 0x00e89391, 0x00e7a894,
+ /* ac */ 0x00e88488, 0x00e5a699, 0x00e7b28d, 0x00e6b091,
+ /* b0 */ 0x00e79ca0, 0x00e58b99, 0x00e5a4a2, 0x00e784a1,
+ /* b4 */ 0x00e7899f, 0x00e79f9b, 0x00e99ca7, 0x00e9b5a1,
+ /* b8 */ 0x00e6a48b, 0x00e5a9bf, 0x00e5a898, 0x00e586a5,
+ /* bc */ 0x00e5908d, 0x00e591bd, 0x00e6988e, 0x00e79b9f,
+ /* c0 */ 0x00e8bfb7, 0x00e98a98, 0x00e9b3b4, 0x00e5a7aa,
+ /* c4 */ 0x00e7899d, 0x00e6bb85, 0x00e5858d, 0x00e6a389,
+ /* c8 */ 0x00e7b6bf, 0x00e7b7ac, 0x00e99da2, 0x00e9baba,
+ /* cc */ 0x00e691b8, 0x00e6a8a1, 0x00e88c82, 0x00e5a684,
+ /* d0 */ 0x00e5ad9f, 0x00e6af9b, 0x00e78c9b, 0x00e79bb2,
+ /* d4 */ 0x00e7b6b2, 0x00e88097, 0x00e89299, 0x00e584b2,
+ /* d8 */ 0x00e69ca8, 0x00e9bb99, 0x00e79bae, 0x00e69da2,
+ /* dc */ 0x00e58bbf, 0x00e9a485, 0x00e5b0a4, 0x00e688bb,
+ /* e0 */ 0x00e7b1be, 0x00e8b2b0, 0x00e5958f, 0x00e682b6,
+ /* e4 */ 0x00e7b48b, 0x00e99680, 0x00e58c81, 0x00e4b99f,
+ /* e8 */ 0x00e586b6, 0x00e5a49c, 0x00e788ba, 0x00e880b6,
+ /* ec */ 0x00e9878e, 0x00e5bca5, 0x00e79fa2, 0x00e58e84,
+ /* f0 */ 0x00e5bdb9, 0x00e7b484, 0x00e896ac, 0x00e8a8b3,
+ /* f4 */ 0x00e8ba8d, 0x00e99d96, 0x00e69fb3, 0x00e896ae,
+ /* f8 */ 0x00e99193, 0x00e68489, 0x00e68488, 0x00e6b2b9,
+ /* fc */ 0x00e79992,
+
+ /*** Two byte table, leaf: 97xx - offset 0x011b6 ***/
+
+ /* 40 */ 0x00e8abad, 0x00e8bcb8, 0x00e594af, 0x00e4bd91,
+ /* 44 */ 0x00e584aa, 0x00e58b87, 0x00e58f8b, 0x00e5aea5,
+ /* 48 */ 0x00e5b9bd, 0x00e682a0, 0x00e68682, 0x00e68f96,
+ /* 4c */ 0x00e69c89, 0x00e69f9a, 0x00e6b9a7, 0x00e6b68c,
+ /* 50 */ 0x00e78cb6, 0x00e78cb7, 0x00e794b1, 0x00e7a590,
+ /* 54 */ 0x00e8a395, 0x00e8aa98, 0x00e9818a, 0x00e98291,
+ /* 58 */ 0x00e983b5, 0x00e99b84, 0x00e89e8d, 0x00e5a495,
+ /* 5c */ 0x00e4ba88, 0x00e4bd99, 0x00e4b88e, 0x00e8aa89,
+ /* 60 */ 0x00e8bcbf, 0x00e9a090, 0x00e582ad, 0x00e5b9bc,
+ /* 64 */ 0x00e5a696, 0x00e5aeb9, 0x00e5bab8, 0x00e68f9a,
+ /* 68 */ 0x00e68fba, 0x00e69381, 0x00e69b9c, 0x00e6a58a,
+ /* 6c */ 0x00e6a798, 0x00e6b48b, 0x00e6bab6, 0x00e78694,
+ /* 70 */ 0x00e794a8, 0x00e7aaaf, 0x00e7be8a, 0x00e88080,
+ /* 74 */ 0x00e89189, 0x00e89389, 0x00e8a681, 0x00e8aca1,
+ /* 78 */ 0x00e8b88a, 0x00e981a5, 0x00e999bd, 0x00e9a48a,
+ /* 7c */ 0x00e685be, 0x00e68a91, 0x00e6acb2, 0x00000000,
+ /* 80 */ 0x00e6b283, 0x00e6b5b4, 0x00e7bf8c, 0x00e7bfbc,
+ /* 84 */ 0x00e6b780, 0x00e7be85, 0x00e89eba, 0x00e8a3b8,
+ /* 88 */ 0x00e69da5, 0x00e88eb1, 0x00e9a0bc, 0x00e99bb7,
+ /* 8c */ 0x00e6b49b, 0x00e7b5a1, 0x00e890bd, 0x00e985aa,
+ /* 90 */ 0x00e4b9b1, 0x00e58db5, 0x00e5b590, 0x00e6ac84,
+ /* 94 */ 0x00e6bfab, 0x00e8978d, 0x00e898ad, 0x00e8a6a7,
+ /* 98 */ 0x00e588a9, 0x00e5908f, 0x00e5b1a5, 0x00e69d8e,
+ /* 9c */ 0x00e6a2a8, 0x00e79086, 0x00e79283, 0x00e797a2,
+ /* a0 */ 0x00e8a38f, 0x00e8a3a1, 0x00e9878c, 0x00e99ba2,
+ /* a4 */ 0x00e999b8, 0x00e5be8b, 0x00e78e87, 0x00e7ab8b,
+ /* a8 */ 0x00e8918e, 0x00e68ea0, 0x00e795a5, 0x00e58a89,
+ /* ac */ 0x00e6b581, 0x00e6ba9c, 0x00e79089, 0x00e79599,
+ /* b0 */ 0x00e7a1ab, 0x00e7b292, 0x00e99a86, 0x00e7ab9c,
+ /* b4 */ 0x00e9be8d, 0x00e4beb6, 0x00e685ae, 0x00e69785,
+ /* b8 */ 0x00e8999c, 0x00e4ba86, 0x00e4baae, 0x00e5839a,
+ /* bc */ 0x00e4b8a1, 0x00e5878c, 0x00e5afae, 0x00e69699,
+ /* c0 */ 0x00e6a281, 0x00e6b6bc, 0x00e78c9f, 0x00e79982,
+ /* c4 */ 0x00e79ead, 0x00e7a89c, 0x00e7b3a7, 0x00e889af,
+ /* c8 */ 0x00e8ab92, 0x00e981bc, 0x00e9878f, 0x00e999b5,
+ /* cc */ 0x00e9a098, 0x00e58a9b, 0x00e7b791, 0x00e580ab,
+ /* d0 */ 0x00e58e98, 0x00e69e97, 0x00e6b78b, 0x00e78790,
+ /* d4 */ 0x00e790b3, 0x00e887a8, 0x00e8bcaa, 0x00e99aa3,
+ /* d8 */ 0x00e9b197, 0x00e9ba9f, 0x00e791a0, 0x00e5a181,
+ /* dc */ 0x00e6b699, 0x00e7b4af, 0x00e9a19e, 0x00e4bba4,
+ /* e0 */ 0x00e4bcb6, 0x00e4be8b, 0x00e586b7, 0x00e58ab1,
+ /* e4 */ 0x00e5b6ba, 0x00e6809c, 0x00e78eb2, 0x00e7a4bc,
+ /* e8 */ 0x00e88b93, 0x00e988b4, 0x00e99ab7, 0x00e99bb6,
+ /* ec */ 0x00e99c8a, 0x00e9ba97, 0x00e9bda2, 0x00e69aa6,
+ /* f0 */ 0x00e6adb4, 0x00e58897, 0x00e58aa3, 0x00e78388,
+ /* f4 */ 0x00e8a382, 0x00e5bb89, 0x00e6818b, 0x00e68690,
+ /* f8 */ 0x00e6bca3, 0x00e78589, 0x00e7b0be, 0x00e7b7b4,
+ /* fc */ 0x00e881af,
+
+ /*** Two byte table, leaf: 98xx - offset 0x01273 ***/
+
+ /* 40 */ 0x00e893ae, 0x00e980a3, 0x00e98cac, 0x00e59182,
+ /* 44 */ 0x00e9adaf, 0x00e6ab93, 0x00e78289, 0x00e8b382,
+ /* 48 */ 0x00e8b7af, 0x00e99cb2, 0x00e58ab4, 0x00e5a981,
+ /* 4c */ 0x00e5bb8a, 0x00e5bc84, 0x00e69c97, 0x00e6a5bc,
+ /* 50 */ 0x00e6a694, 0x00e6b5aa, 0x00e6bc8f, 0x00e789a2,
+ /* 54 */ 0x00e78bbc, 0x00e7afad, 0x00e88081, 0x00e881be,
+ /* 58 */ 0x00e89d8b, 0x00e9838e, 0x00e585ad, 0x00e9ba93,
+ /* 5c */ 0x00e7a684, 0x00e8828b, 0x00e98cb2, 0x00e8ab96,
+ /* 60 */ 0x00e580ad, 0x00e5928c, 0x00e8a9b1, 0x00e6adaa,
+ /* 64 */ 0x00e8b384, 0x00e88487, 0x00e68391, 0x00e69ea0,
+ /* 68 */ 0x00e9b7b2, 0x00e4ba99, 0x00e4ba98, 0x00e9b090,
+ /* 6c */ 0x00e8a9ab, 0x00e89781, 0x00e895a8, 0x00e6a480,
+ /* 70 */ 0x00e6b9be, 0x00e7a297, 0x00e88595, 0xf0a0ae9f,
+ /* 74 */ 0x00e5ad81, 0x00e5ad96, 0x00e5adbd, 0x00e5ae93,
+ /* 78 */ 0x00e5af98, 0x00e5afac, 0x00e5b092, 0x00e5b09e,
+ /* 7c */ 0x00e5b0a3, 0x00e5b0ab, 0x00e39e8d, 0x00000000,
+ /* 80 */ 0x00e5b1a2, 0x00efa8bb, 0x00efa8bc, 0xf0a19ab4,
+ /* 84 */ 0x00e5b1ba, 0x00e5b28f, 0x00e5b29f, 0x00e5b2a3,
+ /* 88 */ 0x00e5b2aa, 0x00e5b2ba, 0x00e5b38b, 0x00e5b390,
+ /* 8c */ 0x00e5b392, 0x00e5b3b4, 0xf0a1b8b4, 0x00e39fa2,
+ /* 90 */ 0x00e5b48d, 0x00e5b4a7, 0x00efa891, 0x00e5b586,
+ /* 94 */ 0x00e5b587, 0x00e5b593, 0x00e5b58a, 0x00e5b5ad,
+ /* 98 */ 0x00e5b681, 0x00e5b6a0, 0x00e5b6a4, 0x00e5b6a7,
+ /* 9c */ 0x00e5b6b8, 0x00e5b78b, 0x00e5909e, 0x00e5bc8c,
+ /* a0 */ 0x00e4b890, 0x00e4b895, 0x00e4b8aa, 0x00e4b8b1,
+ /* a4 */ 0x00e4b8b6, 0x00e4b8bc, 0x00e4b8bf, 0x00e4b982,
+ /* a8 */ 0x00e4b996, 0x00e4b998, 0x00e4ba82, 0x00e4ba85,
+ /* ac */ 0x00e8b1ab, 0x00e4ba8a, 0x00e88892, 0x00e5bc8d,
+ /* b0 */ 0x00e4ba8e, 0x00e4ba9e, 0x00e4ba9f, 0x00e4baa0,
+ /* b4 */ 0x00e4baa2, 0x00e4bab0, 0x00e4bab3, 0x00e4bab6,
+ /* b8 */ 0x00e4bb8e, 0x00e4bb8d, 0x00e4bb84, 0x00e4bb86,
+ /* bc */ 0x00e4bb82, 0x00e4bb97, 0x00e4bb9e, 0x00e4bbad,
+ /* c0 */ 0x00e4bb9f, 0x00e4bbb7, 0x00e4bc89, 0x00e4bd9a,
+ /* c4 */ 0x00e4bcb0, 0x00e4bd9b, 0x00e4bd9d, 0x00e4bd97,
+ /* c8 */ 0x00e4bd87, 0x00e4bdb6, 0x00e4be88, 0x00e4be8f,
+ /* cc */ 0x00e4be98, 0x00e4bdbb, 0x00e4bda9, 0x00e4bdb0,
+ /* d0 */ 0x00e4be91, 0x00e4bdaf, 0x00e4be86, 0x00e4be96,
+ /* d4 */ 0x00e58498, 0x00e4bf94, 0x00e4bf9f, 0x00e4bf8e,
+ /* d8 */ 0x00e4bf98, 0x00e4bf9b, 0x00e4bf91, 0x00e4bf9a,
+ /* dc */ 0x00e4bf90, 0x00e4bfa4, 0x00e4bfa5, 0x00e5809a,
+ /* e0 */ 0x00e580a8, 0x00e58094, 0x00e580aa, 0x00e580a5,
+ /* e4 */ 0x00e58085, 0x00e4bc9c, 0x00e4bfb6, 0x00e580a1,
+ /* e8 */ 0x00e580a9, 0x00e580ac, 0x00e4bfbe, 0x00e4bfaf,
+ /* ec */ 0x00e58091, 0x00e58086, 0x00e58183, 0x00e58187,
+ /* f0 */ 0x00e69c83, 0x00e58195, 0x00e58190, 0x00e58188,
+ /* f4 */ 0x00e5819a, 0x00e58196, 0x00e581ac, 0x00e581b8,
+ /* f8 */ 0x00e58280, 0x00e5829a, 0x00e58285, 0x00e582b4,
+ /* fc */ 0x00e582b2,
+
+ /*** Two byte table, leaf: 99xx - offset 0x01330 ***/
+
+ /* 40 */ 0x00e58389, 0x00e5838a, 0x00e582b3, 0x00e58382,
+ /* 44 */ 0x00e58396, 0x00e5839e, 0x00e583a5, 0x00e583ad,
+ /* 48 */ 0x00e583a3, 0x00e583ae, 0x00e583b9, 0x00e583b5,
+ /* 4c */ 0x00e58489, 0x00e58481, 0x00e58482, 0x00e58496,
+ /* 50 */ 0x00e58495, 0x00e58494, 0x00e5849a, 0x00e584a1,
+ /* 54 */ 0x00e584ba, 0x00e584b7, 0x00e584bc, 0x00e584bb,
+ /* 58 */ 0x00e584bf, 0x00e58580, 0x00e58592, 0x00e5858c,
+ /* 5c */ 0x00e58594, 0x00e585a2, 0x00e7abb8, 0x00e585a9,
+ /* 60 */ 0x00e585aa, 0x00e585ae, 0x00e58680, 0x00e58682,
+ /* 64 */ 0x00e59b98, 0x00e5868c, 0x00e58689, 0x00e5868f,
+ /* 68 */ 0x00e58691, 0x00e58693, 0x00e58695, 0x00e58696,
+ /* 6c */ 0x00e586a4, 0x00e586a6, 0x00e586a2, 0x00e586a9,
+ /* 70 */ 0x00e586aa, 0x00e586ab, 0x00e586b3, 0x00e586b1,
+ /* 74 */ 0x00e586b2, 0x00e586b0, 0x00e586b5, 0x00e586bd,
+ /* 78 */ 0x00e58785, 0x00e58789, 0x00e5879b, 0x00e587a0,
+ /* 7c */ 0x00e89995, 0x00e587a9, 0x00e587ad, 0x00000000,
+ /* 80 */ 0x00e587b0, 0x00e587b5, 0x00e587be, 0x00e58884,
+ /* 84 */ 0x00e5888b, 0x00e58894, 0x00e5888e, 0x00e588a7,
+ /* 88 */ 0x00e588aa, 0x00e588ae, 0x00e588b3, 0x00e588b9,
+ /* 8c */ 0x00e5898f, 0x00e58984, 0x00e5898b, 0x00e5898c,
+ /* 90 */ 0x00e5899e, 0x00e58994, 0x00e589aa, 0x00e589b4,
+ /* 94 */ 0x00e589a9, 0x00e589b3, 0x00e589bf, 0x00e589bd,
+ /* 98 */ 0x00e58a8d, 0x00e58a94, 0x00e58a92, 0x00e589b1,
+ /* 9c */ 0x00e58a88, 0x00e58a91, 0x00e8bea8, 0x00e8bea7,
+ /* a0 */ 0x00e58aac, 0x00e58aad, 0x00e58abc, 0x00e58ab5,
+ /* a4 */ 0x00e58b81, 0x00e58b8d, 0x00e58b97, 0x00e58b9e,
+ /* a8 */ 0x00e58ba3, 0x00e58ba6, 0x00e9a3ad, 0x00e58ba0,
+ /* ac */ 0x00e58bb3, 0x00e58bb5, 0x00e58bb8, 0x00e58bb9,
+ /* b0 */ 0x00e58c86, 0x00e58c88, 0x00e794b8, 0x00e58c8d,
+ /* b4 */ 0x00e58c90, 0x00e58c8f, 0x00e58c95, 0x00e58c9a,
+ /* b8 */ 0x00e58ca3, 0x00e58caf, 0x00e58cb1, 0x00e58cb3,
+ /* bc */ 0x00e58cb8, 0x00e58d80, 0x00e58d86, 0x00e58d85,
+ /* c0 */ 0x00e4b897, 0x00e58d89, 0x00e58d8d, 0x00e58796,
+ /* c4 */ 0x00e58d9e, 0x00e58da9, 0x00e58dae, 0x00e5a498,
+ /* c8 */ 0x00e58dbb, 0x00e58db7, 0x00e58e82, 0x00e58e96,
+ /* cc */ 0x00e58ea0, 0x00e58ea6, 0x00e58ea5, 0x00e58eae,
+ /* d0 */ 0x00e58eb0, 0x00e58eb6, 0x00e58f83, 0x00e7b092,
+ /* d4 */ 0x00e99b99, 0x00e58f9f, 0x00e69bbc, 0x00e787ae,
+ /* d8 */ 0x00e58fae, 0x00e58fa8, 0x00e58fad, 0x00e58fba,
+ /* dc */ 0x00e59081, 0x00e590bd, 0x00e59180, 0x00e590ac,
+ /* e0 */ 0x00e590ad, 0x00e590bc, 0x00e590ae, 0x00e590b6,
+ /* e4 */ 0x00e590a9, 0x00e5909d, 0x00e5918e, 0x00e5928f,
+ /* e8 */ 0x00e591b5, 0x00e5928e, 0x00e5919f, 0x00e591b1,
+ /* ec */ 0x00e591b7, 0x00e591b0, 0x00e59292, 0x00e591bb,
+ /* f0 */ 0x00e59280, 0x00e591b6, 0x00e59284, 0x00e59290,
+ /* f4 */ 0x00e59286, 0x00e59387, 0x00e592a2, 0x00e592b8,
+ /* f8 */ 0x00e592a5, 0x00e592ac, 0x00e59384, 0x00e59388,
+ /* fc */ 0x00e592a8,
+
+ /*** Two byte table, leaf: 9axx - offset 0x013ed ***/
+
+ /* 40 */ 0x00e592ab, 0x00e59382, 0x00e592a4, 0x00e592be,
+ /* 44 */ 0x00e592bc, 0x00e59398, 0x00e593a5, 0x00e593a6,
+ /* 48 */ 0x00e5948f, 0x00e59494, 0x00e593bd, 0x00e593ae,
+ /* 4c */ 0x00e593ad, 0x00e593ba, 0x00e593a2, 0x00e594b9,
+ /* 50 */ 0x00e59580, 0x00e595a3, 0x00e5958c, 0x00e594ae,
+ /* 54 */ 0x00e5959c, 0x00e59585, 0x00e59596, 0x00e59597,
+ /* 58 */ 0x00e594b8, 0x00e594b3, 0x00e5959d, 0x00e59699,
+ /* 5c */ 0x00e59680, 0x00e592af, 0x00e5968a, 0x00e5969f,
+ /* 60 */ 0x00e595bb, 0x00e595be, 0x00e59698, 0x00e5969e,
+ /* 64 */ 0x00e596ae, 0x00e595bc, 0x00e59683, 0x00e596a9,
+ /* 68 */ 0x00e59687, 0x00e596a8, 0x00e5979a, 0x00e59785,
+ /* 6c */ 0x00e5979f, 0x00e59784, 0x00e5979c, 0x00e597a4,
+ /* 70 */ 0x00e59794, 0x00e59894, 0x00e597b7, 0x00e59896,
+ /* 74 */ 0x00e597be, 0x00e597bd, 0x00e5989b, 0x00e597b9,
+ /* 78 */ 0x00e5998e, 0x00e59990, 0x00e7879f, 0x00e598b4,
+ /* 7c */ 0x00e598b6, 0x00e598b2, 0x00e598b8, 0x00000000,
+ /* 80 */ 0x00e599ab, 0x00e599a4, 0x00e598af, 0x00e599ac,
+ /* 84 */ 0x00e599aa, 0x00e59a86, 0x00e59a80, 0x00e59a8a,
+ /* 88 */ 0x00e59aa0, 0x00e59a94, 0x00e59a8f, 0x00e59aa5,
+ /* 8c */ 0x00e59aae, 0x00e59ab6, 0x00e59ab4, 0x00e59b82,
+ /* 90 */ 0x00e59abc, 0x00e59b81, 0x00e59b83, 0x00e59b80,
+ /* 94 */ 0x00e59b88, 0x00e59b8e, 0x00e59b91, 0x00e59b93,
+ /* 98 */ 0x00e59b97, 0x00e59bae, 0x00e59bb9, 0x00e59c80,
+ /* 9c */ 0x00e59bbf, 0x00e59c84, 0x00e59c89, 0x00e59c88,
+ /* a0 */ 0x00e59c8b, 0x00e59c8d, 0x00e59c93, 0x00e59c98,
+ /* a4 */ 0x00e59c96, 0x00e59787, 0x00e59c9c, 0x00e59ca6,
+ /* a8 */ 0x00e59cb7, 0x00e59cb8, 0x00e59d8e, 0x00e59cbb,
+ /* ac */ 0x00e59d80, 0x00e59d8f, 0x00e59da9, 0x00e59f80,
+ /* b0 */ 0x00e59e88, 0x00e59da1, 0x00e59dbf, 0x00e59e89,
+ /* b4 */ 0x00e59e93, 0x00e59ea0, 0x00e59eb3, 0x00e59ea4,
+ /* b8 */ 0x00e59eaa, 0x00e59eb0, 0x00e59f83, 0x00e59f86,
+ /* bc */ 0x00e59f94, 0x00e59f92, 0x00e59f93, 0x00e5a08a,
+ /* c0 */ 0x00e59f96, 0x00e59fa3, 0x00e5a08b, 0x00e5a099,
+ /* c4 */ 0x00e5a09d, 0x00e5a1b2, 0x00e5a0a1, 0x00e5a1a2,
+ /* c8 */ 0x00e5a18b, 0x00e5a1b0, 0x00e6af80, 0x00e5a192,
+ /* cc */ 0x00e5a0bd, 0x00e5a1b9, 0x00e5a285, 0x00e5a2b9,
+ /* d0 */ 0x00e5a29f, 0x00e5a2ab, 0x00e5a2ba, 0x00e5a39e,
+ /* d4 */ 0x00e5a2bb, 0x00e5a2b8, 0x00e5a2ae, 0x00e5a385,
+ /* d8 */ 0x00e5a393, 0x00e5a391, 0x00e5a397, 0x00e5a399,
+ /* dc */ 0x00e5a398, 0x00e5a3a5, 0x00e5a39c, 0x00e5a3a4,
+ /* e0 */ 0x00e5a39f, 0x00e5a3af, 0x00e5a3ba, 0x00e5a3b9,
+ /* e4 */ 0x00e5a3bb, 0x00e5a3bc, 0x00e5a3bd, 0x00e5a482,
+ /* e8 */ 0x00e5a48a, 0x00e5a490, 0x00e5a49b, 0x00e6a2a6,
+ /* ec */ 0x00e5a4a5, 0x00e5a4ac, 0x00e5a4ad, 0x00e5a4b2,
+ /* f0 */ 0x00e5a4b8, 0x00e5a4be, 0x00e7ab92, 0x00e5a595,
+ /* f4 */ 0x00e5a590, 0x00e5a58e, 0x00e5a59a, 0x00e5a598,
+ /* f8 */ 0x00e5a5a2, 0x00e5a5a0, 0x00e5a5a7, 0x00e5a5ac,
+ /* fc */ 0x00e5a5a9,
+
+ /*** Two byte table, leaf: 9bxx - offset 0x014aa ***/
+
+ /* 40 */ 0x00e5a5b8, 0x00e5a681, 0x00e5a69d, 0x00e4bd9e,
+ /* 44 */ 0x00e4beab, 0x00e5a6a3, 0x00e5a6b2, 0x00e5a786,
+ /* 48 */ 0x00e5a7a8, 0x00e5a79c, 0x00e5a68d, 0x00e5a799,
+ /* 4c */ 0x00e5a79a, 0x00e5a8a5, 0x00e5a89f, 0x00e5a891,
+ /* 50 */ 0x00e5a89c, 0x00e5a889, 0x00e5a89a, 0x00e5a980,
+ /* 54 */ 0x00e5a9ac, 0x00e5a989, 0x00e5a8b5, 0x00e5a8b6,
+ /* 58 */ 0x00e5a9a2, 0x00e5a9aa, 0x00e5aa9a, 0x00e5aabc,
+ /* 5c */ 0x00e5aabe, 0x00e5ab8b, 0x00e5ab82, 0x00e5aabd,
+ /* 60 */ 0x00e5aba3, 0x00e5ab97, 0x00e5aba6, 0x00e5aba9,
+ /* 64 */ 0x00e5ab96, 0x00e5abba, 0x00e5abbb, 0x00e5ac8c,
+ /* 68 */ 0x00e5ac8b, 0x00e5ac96, 0x00e5acb2, 0x00e5ab90,
+ /* 6c */ 0x00e5acaa, 0x00e5acb6, 0x00e5acbe, 0x00e5ad83,
+ /* 70 */ 0x00e5ad85, 0x00e5ad80, 0x00e5ad91, 0x00e5ad95,
+ /* 74 */ 0x00e5ad9a, 0x00e5ad9b, 0x00e5ada5, 0x00e5ada9,
+ /* 78 */ 0x00e5adb0, 0x00e5adb3, 0x00e5adb5, 0x00e5adb8,
+ /* 7c */ 0x00e69688, 0x00e5adba, 0x00e5ae80, 0x00000000,
+ /* 80 */ 0x00e5ae83, 0x00e5aea6, 0x00e5aeb8, 0x00e5af83,
+ /* 84 */ 0x00e5af87, 0x00e5af89, 0x00e5af94, 0x00e5af90,
+ /* 88 */ 0x00e5afa4, 0x00e5afa6, 0x00e5afa2, 0x00e5af9e,
+ /* 8c */ 0x00e5afa5, 0x00e5afab, 0x00e5afb0, 0x00e5afb6,
+ /* 90 */ 0x00e5afb3, 0x00e5b085, 0x00e5b087, 0x00e5b088,
+ /* 94 */ 0x00e5b08d, 0x00e5b093, 0x00e5b0a0, 0x00e5b0a2,
+ /* 98 */ 0x00e5b0a8, 0x00e5b0b8, 0x00e5b0b9, 0x00e5b181,
+ /* 9c */ 0x00e5b186, 0x00e5b18e, 0x00e5b193, 0x00e5b190,
+ /* a0 */ 0x00e5b18f, 0x00e5adb1, 0x00e5b1ac, 0x00e5b1ae,
+ /* a4 */ 0x00e4b9a2, 0x00e5b1b6, 0x00e5b1b9, 0x00e5b28c,
+ /* a8 */ 0x00e5b291, 0x00e5b294, 0x00e5a69b, 0x00e5b2ab,
+ /* ac */ 0x00e5b2bb, 0x00e5b2b6, 0x00e5b2bc, 0x00e5b2b7,
+ /* b0 */ 0x00e5b385, 0x00e5b2be, 0x00e5b387, 0x00e5b399,
+ /* b4 */ 0x00e5b3a9, 0x00e5b3bd, 0x00e5b3ba, 0x00e5b3ad,
+ /* b8 */ 0x00e5b68c, 0x00e5b3aa, 0x00e5b48b, 0x00e5b495,
+ /* bc */ 0x00e5b497, 0x00e5b59c, 0x00e5b49f, 0x00e5b49b,
+ /* c0 */ 0x00e5b491, 0x00e5b494, 0x00e5b4a2, 0x00e5b49a,
+ /* c4 */ 0x00e5b499, 0x00e5b498, 0x00e5b58c, 0x00e5b592,
+ /* c8 */ 0x00e5b58e, 0x00e5b58b, 0x00e5b5ac, 0x00e5b5b3,
+ /* cc */ 0x00e5b5b6, 0x00e5b687, 0x00e5b684, 0x00e5b682,
+ /* d0 */ 0x00e5b6a2, 0x00e5b69d, 0x00e5b6ac, 0x00e5b6ae,
+ /* d4 */ 0x00e5b6bd, 0x00e5b690, 0x00e5b6b7, 0x00e5b6bc,
+ /* d8 */ 0x00e5b789, 0x00e5b78d, 0x00e5b793, 0x00e5b792,
+ /* dc */ 0x00e5b796, 0x00e5b79b, 0x00e5b7ab, 0x00e5b7b2,
+ /* e0 */ 0x00e5b7b5, 0x00e5b88b, 0x00e5b89a, 0x00e5b899,
+ /* e4 */ 0x00e5b891, 0x00e5b89b, 0x00e5b8b6, 0x00e5b8b7,
+ /* e8 */ 0x00e5b984, 0x00e5b983, 0x00e5b980, 0x00e5b98e,
+ /* ec */ 0x00e5b997, 0x00e5b994, 0x00e5b99f, 0x00e5b9a2,
+ /* f0 */ 0x00e5b9a4, 0x00e5b987, 0x00e5b9b5, 0x00e5b9b6,
+ /* f4 */ 0x00e5b9ba, 0x00e9babc, 0x00e5b9bf, 0x00e5baa0,
+ /* f8 */ 0x00e5bb81, 0x00e5bb82, 0x00e5bb88, 0x00e5bb90,
+ /* fc */ 0x00e5bb8f,
+
+ /*** Two byte table, leaf: 9cxx - offset 0x01567 ***/
+
+ /* 40 */ 0x00e5bb96, 0x00e5bba3, 0x00e5bb9d, 0x00e5bb9a,
+ /* 44 */ 0x00e5bb9b, 0x00e5bba2, 0x00e5bba1, 0x00e5bba8,
+ /* 48 */ 0x00e5bba9, 0x00e5bbac, 0x00e5bbb1, 0x00e5bbb3,
+ /* 4c */ 0x00e5bbb0, 0x00e5bbb4, 0x00e5bbb8, 0x00e5bbbe,
+ /* 50 */ 0x00e5bc83, 0x00e5bc89, 0x00e5bd9d, 0x00e5bd9c,
+ /* 54 */ 0x00e5bc8b, 0x00e5bc91, 0x00e5bc96, 0x00e5bca9,
+ /* 58 */ 0x00e5bcad, 0x00e5bcb8, 0x00e5bd81, 0x00e5bd88,
+ /* 5c */ 0x00e5bd8c, 0x00e5bd8e, 0x00e5bcaf, 0x00e5bd91,
+ /* 60 */ 0x00e5bd96, 0x00e5bd97, 0x00e5bd99, 0x00e5bda1,
+ /* 64 */ 0x00e5bdad, 0x00e5bdb3, 0x00e5bdb7, 0x00e5be83,
+ /* 68 */ 0x00e5be82, 0x00e5bdbf, 0x00e5be8a, 0x00e5be88,
+ /* 6c */ 0x00e5be91, 0x00e5be87, 0x00e5be9e, 0x00e5be99,
+ /* 70 */ 0x00e5be98, 0x00e5bea0, 0x00e5bea8, 0x00e5bead,
+ /* 74 */ 0x00e5bebc, 0x00e5bf96, 0x00e5bfbb, 0x00e5bfa4,
+ /* 78 */ 0x00e5bfb8, 0x00e5bfb1, 0x00e5bf9d, 0x00e682b3,
+ /* 7c */ 0x00e5bfbf, 0x00e680a1, 0x00e681a0, 0x00000000,
+ /* 80 */ 0x00e68099, 0x00e68090, 0x00e680a9, 0x00e6808e,
+ /* 84 */ 0x00e680b1, 0x00e6809b, 0x00e68095, 0x00e680ab,
+ /* 88 */ 0x00e680a6, 0x00e6808f, 0x00e680ba, 0x00e6819a,
+ /* 8c */ 0x00e68181, 0x00e681aa, 0x00e681b7, 0x00e6819f,
+ /* 90 */ 0x00e6818a, 0x00e68186, 0x00e6818d, 0x00e681a3,
+ /* 94 */ 0x00e68183, 0x00e681a4, 0x00e68182, 0x00e681ac,
+ /* 98 */ 0x00e681ab, 0x00e68199, 0x00e68281, 0x00e6828d,
+ /* 9c */ 0x00e683a7, 0x00e68283, 0x00e6829a, 0x00e68284,
+ /* a0 */ 0x00e6829b, 0x00e68296, 0x00e68297, 0x00e68292,
+ /* a4 */ 0x00e682a7, 0x00e6828b, 0x00e683a1, 0x00e682b8,
+ /* a8 */ 0x00e683a0, 0x00e68393, 0x00e682b4, 0x00e5bfb0,
+ /* ac */ 0x00e682bd, 0x00e68386, 0x00e682b5, 0x00e68398,
+ /* b0 */ 0x00e6858d, 0x00e68495, 0x00e68486, 0x00e683b6,
+ /* b4 */ 0x00e683b7, 0x00e68480, 0x00e683b4, 0x00e683ba,
+ /* b8 */ 0x00e68483, 0x00e684a1, 0x00e683bb, 0x00e683b1,
+ /* bc */ 0x00e6848d, 0x00e6848e, 0x00e68587, 0x00e684be,
+ /* c0 */ 0x00e684a8, 0x00e684a7, 0x00e6858a, 0x00e684bf,
+ /* c4 */ 0x00e684bc, 0x00e684ac, 0x00e684b4, 0x00e684bd,
+ /* c8 */ 0x00e68582, 0x00e68584, 0x00e685b3, 0x00e685b7,
+ /* cc */ 0x00e68598, 0x00e68599, 0x00e6859a, 0x00e685ab,
+ /* d0 */ 0x00e685b4, 0x00e685af, 0x00e685a5, 0x00e685b1,
+ /* d4 */ 0x00e6859f, 0x00e6859d, 0x00e68593, 0x00e685b5,
+ /* d8 */ 0x00e68699, 0x00e68696, 0x00e68687, 0x00e686ac,
+ /* dc */ 0x00e68694, 0x00e6869a, 0x00e6868a, 0x00e68691,
+ /* e0 */ 0x00e686ab, 0x00e686ae, 0x00e6878c, 0x00e6878a,
+ /* e4 */ 0x00e68789, 0x00e687b7, 0x00e68788, 0x00e68783,
+ /* e8 */ 0x00e68786, 0x00e686ba, 0x00e6878b, 0x00e7bdb9,
+ /* ec */ 0x00e6878d, 0x00e687a6, 0x00e687a3, 0x00e687b6,
+ /* f0 */ 0x00e687ba, 0x00e687b4, 0x00e687bf, 0x00e687bd,
+ /* f4 */ 0x00e687bc, 0x00e687be, 0x00e68880, 0x00e68888,
+ /* f8 */ 0x00e68889, 0x00e6888d, 0x00e6888c, 0x00e68894,
+ /* fc */ 0x00e6889b,
+
+ /*** Two byte table, leaf: 9dxx - offset 0x01624 ***/
+
+ /* 40 */ 0x00e6889e, 0x00e688a1, 0x00e688aa, 0x00e688ae,
+ /* 44 */ 0x00e688b0, 0x00e688b2, 0x00e688b3, 0x00e68981,
+ /* 48 */ 0x00e6898e, 0x00e6899e, 0x00e689a3, 0x00e6899b,
+ /* 4c */ 0x00e689a0, 0x00e689a8, 0x00e689bc, 0x00e68a82,
+ /* 50 */ 0x00e68a89, 0x00e689be, 0x00e68a92, 0x00e68a93,
+ /* 54 */ 0x00e68a96, 0x00e68b94, 0x00e68a83, 0x00e68a94,
+ /* 58 */ 0x00e68b97, 0x00e68b91, 0x00e68abb, 0x00e68b8f,
+ /* 5c */ 0x00e68bbf, 0x00e68b86, 0x00e69394, 0x00e68b88,
+ /* 60 */ 0x00e68b9c, 0x00e68b8c, 0x00e68b8a, 0x00e68b82,
+ /* 64 */ 0x00e68b87, 0x00e68a9b, 0x00e68b89, 0x00e68c8c,
+ /* 68 */ 0x00e68bae, 0x00e68bb1, 0x00e68ca7, 0x00e68c82,
+ /* 6c */ 0x00e68c88, 0x00e68baf, 0x00e68bb5, 0x00e68d90,
+ /* 70 */ 0x00e68cbe, 0x00e68d8d, 0x00e6909c, 0x00e68d8f,
+ /* 74 */ 0x00e68e96, 0x00e68e8e, 0x00e68e80, 0x00e68eab,
+ /* 78 */ 0x00e68db6, 0x00e68ea3, 0x00e68e8f, 0x00e68e89,
+ /* 7c */ 0x00e68e9f, 0x00e68eb5, 0x00e68dab, 0x00000000,
+ /* 80 */ 0x00e68da9, 0x00e68ebe, 0x00e68fa9, 0x00e68f80,
+ /* 84 */ 0x00e68f86, 0x00e68fa3, 0x00e68f89, 0x00e68f92,
+ /* 88 */ 0x00e68fb6, 0x00e68f84, 0x00e69096, 0x00e690b4,
+ /* 8c */ 0x00e69086, 0x00e69093, 0x00e690a6, 0x00e690b6,
+ /* 90 */ 0x00e6949d, 0x00e69097, 0x00e690a8, 0x00e6908f,
+ /* 94 */ 0x00e691a7, 0x00e691af, 0x00e691b6, 0x00e6918e,
+ /* 98 */ 0x00e694aa, 0x00e69295, 0x00e69293, 0x00e692a5,
+ /* 9c */ 0x00e692a9, 0x00e69288, 0x00e692bc, 0x00e6939a,
+ /* a0 */ 0x00e69392, 0x00e69385, 0x00e69387, 0x00e692bb,
+ /* a4 */ 0x00e69398, 0x00e69382, 0x00e693b1, 0x00e693a7,
+ /* a8 */ 0x00e88889, 0x00e693a0, 0x00e693a1, 0x00e68aac,
+ /* ac */ 0x00e693a3, 0x00e693af, 0x00e694ac, 0x00e693b6,
+ /* b0 */ 0x00e693b4, 0x00e693b2, 0x00e693ba, 0x00e69480,
+ /* b4 */ 0x00e693bd, 0x00e69498, 0x00e6949c, 0x00e69485,
+ /* b8 */ 0x00e694a4, 0x00e694a3, 0x00e694ab, 0x00e694b4,
+ /* bc */ 0x00e694b5, 0x00e694b7, 0x00e694b6, 0x00e694b8,
+ /* c0 */ 0x00e7958b, 0x00e69588, 0x00e69596, 0x00e69595,
+ /* c4 */ 0x00e6958d, 0x00e69598, 0x00e6959e, 0x00e6959d,
+ /* c8 */ 0x00e695b2, 0x00e695b8, 0x00e69682, 0x00e69683,
+ /* cc */ 0x00e8ae8a, 0x00e6969b, 0x00e6969f, 0x00e696ab,
+ /* d0 */ 0x00e696b7, 0x00e69783, 0x00e69786, 0x00e69781,
+ /* d4 */ 0x00e69784, 0x00e6978c, 0x00e69792, 0x00e6979b,
+ /* d8 */ 0x00e69799, 0x00e697a0, 0x00e697a1, 0x00e697b1,
+ /* dc */ 0x00e69db2, 0x00e6988a, 0x00e69883, 0x00e697bb,
+ /* e0 */ 0x00e69db3, 0x00e698b5, 0x00e698b6, 0x00e698b4,
+ /* e4 */ 0x00e6989c, 0x00e6998f, 0x00e69984, 0x00e69989,
+ /* e8 */ 0x00e69981, 0x00e6999e, 0x00e6999d, 0x00e699a4,
+ /* ec */ 0x00e699a7, 0x00e699a8, 0x00e6999f, 0x00e699a2,
+ /* f0 */ 0x00e699b0, 0x00e69a83, 0x00e69a88, 0x00e69a8e,
+ /* f4 */ 0x00e69a89, 0x00e69a84, 0x00e69a98, 0x00e69a9d,
+ /* f8 */ 0x00e69b81, 0x00e69ab9, 0x00e69b89, 0x00e69abe,
+ /* fc */ 0x00e69abc,
+
+ /*** Two byte table, leaf: 9exx - offset 0x016e1 ***/
+
+ /* 40 */ 0x00e69b84, 0x00e69ab8, 0x00e69b96, 0x00e69b9a,
+ /* 44 */ 0x00e69ba0, 0x00e698bf, 0x00e69ba6, 0x00e69ba9,
+ /* 48 */ 0x00e69bb0, 0x00e69bb5, 0x00e69bb7, 0x00e69c8f,
+ /* 4c */ 0x00e69c96, 0x00e69c9e, 0x00e69ca6, 0x00e69ca7,
+ /* 50 */ 0x00e99cb8, 0x00e69cae, 0x00e69cbf, 0x00e69cb6,
+ /* 54 */ 0x00e69d81, 0x00e69cb8, 0x00e69cb7, 0x00e69d86,
+ /* 58 */ 0x00e69d9e, 0x00e69da0, 0x00e69d99, 0x00e69da3,
+ /* 5c */ 0x00e69da4, 0x00e69e89, 0x00e69db0, 0x00e69ea9,
+ /* 60 */ 0x00e69dbc, 0x00e69daa, 0x00e69e8c, 0x00e69e8b,
+ /* 64 */ 0x00e69ea6, 0x00e69ea1, 0x00e69e85, 0x00e69eb7,
+ /* 68 */ 0x00e69faf, 0x00e69eb4, 0x00e69fac, 0x00e69eb3,
+ /* 6c */ 0x00e69fa9, 0x00e69eb8, 0x00e69fa4, 0x00e69f9e,
+ /* 70 */ 0x00e69f9d, 0x00e69fa2, 0x00e69fae, 0x00e69eb9,
+ /* 74 */ 0x00e69f8e, 0x00e69f86, 0x00e69fa7, 0x00e6aa9c,
+ /* 78 */ 0x00e6a09e, 0x00e6a186, 0x00e6a0a9, 0x00e6a180,
+ /* 7c */ 0x00e6a18d, 0x00e6a0b2, 0x00e6a18e, 0x00000000,
+ /* 80 */ 0x00e6a2b3, 0x00e6a0ab, 0x00e6a199, 0x00e6a1a3,
+ /* 84 */ 0x00e6a1b7, 0x00e6a1bf, 0x00e6a29f, 0x00e6a28f,
+ /* 88 */ 0x00e6a2ad, 0x00e6a294, 0x00e6a29d, 0x00e6a29b,
+ /* 8c */ 0x00e6a283, 0x00e6aaae, 0x00e6a2b9, 0x00e6a1b4,
+ /* 90 */ 0x00e6a2b5, 0x00e6a2a0, 0x00e6a2ba, 0x00e6a48f,
+ /* 94 */ 0x00e6a28d, 0x00e6a1be, 0x00e6a481, 0x00e6a38a,
+ /* 98 */ 0x00e6a488, 0x00e6a398, 0x00e6a4a2, 0x00e6a4a6,
+ /* 9c */ 0x00e6a3a1, 0x00e6a48c, 0x00e6a38d, 0x00e6a394,
+ /* a0 */ 0x00e6a3a7, 0x00e6a395, 0x00e6a4b6, 0x00e6a492,
+ /* a4 */ 0x00e6a484, 0x00e6a397, 0x00e6a3a3, 0x00e6a4a5,
+ /* a8 */ 0x00e6a3b9, 0x00e6a3a0, 0x00e6a3af, 0x00e6a4a8,
+ /* ac */ 0x00e6a4aa, 0x00e6a49a, 0x00e6a4a3, 0x00e6a4a1,
+ /* b0 */ 0x00e6a386, 0x00e6a5b9, 0x00e6a5b7, 0x00e6a59c,
+ /* b4 */ 0x00e6a5b8, 0x00e6a5ab, 0x00e6a594, 0x00e6a5be,
+ /* b8 */ 0x00e6a5ae, 0x00e6a4b9, 0x00e6a5b4, 0x00e6a4bd,
+ /* bc */ 0x00e6a599, 0x00e6a4b0, 0x00e6a5a1, 0x00e6a59e,
+ /* c0 */ 0x00e6a59d, 0x00e6a681, 0x00e6a5aa, 0x00e6a6b2,
+ /* c4 */ 0x00e6a6ae, 0x00e6a790, 0x00e6a6bf, 0x00e6a781,
+ /* c8 */ 0x00e6a793, 0x00e6a6be, 0x00e6a78e, 0x00e5afa8,
+ /* cc */ 0x00e6a78a, 0x00e6a79d, 0x00e6a6bb, 0x00e6a783,
+ /* d0 */ 0x00e6a6a7, 0x00e6a8ae, 0x00e6a691, 0x00e6a6a0,
+ /* d4 */ 0x00e6a69c, 0x00e6a695, 0x00e6a6b4, 0x00e6a79e,
+ /* d8 */ 0x00e6a7a8, 0x00e6a882, 0x00e6a89b, 0x00e6a7bf,
+ /* dc */ 0x00e6ac8a, 0x00e6a7b9, 0x00e6a7b2, 0x00e6a7a7,
+ /* e0 */ 0x00e6a885, 0x00e6a6b1, 0x00e6a89e, 0x00e6a7ad,
+ /* e4 */ 0x00e6a894, 0x00e6a7ab, 0x00e6a88a, 0x00e6a892,
+ /* e8 */ 0x00e6ab81, 0x00e6a8a3, 0x00e6a893, 0x00e6a984,
+ /* ec */ 0x00e6a88c, 0x00e6a9b2, 0x00e6a8b6, 0x00e6a9b8,
+ /* f0 */ 0x00e6a987, 0x00e6a9a2, 0x00e6a999, 0x00e6a9a6,
+ /* f4 */ 0x00e6a988, 0x00e6a8b8, 0x00e6a8a2, 0x00e6aa90,
+ /* f8 */ 0x00e6aa8d, 0x00e6aaa0, 0x00e6aa84, 0x00e6aaa2,
+ /* fc */ 0x00e6aaa3,
+
+ /*** Two byte table, leaf: 9fxx - offset 0x0179e ***/
+
+ /* 40 */ 0x00e6aa97, 0x00e89897, 0x00e6aabb, 0x00e6ab83,
+ /* 44 */ 0x00e6ab82, 0x00e6aab8, 0x00e6aab3, 0x00e6aaac,
+ /* 48 */ 0x00e6ab9e, 0x00e6ab91, 0x00e6ab9f, 0x00e6aaaa,
+ /* 4c */ 0x00e6ab9a, 0x00e6abaa, 0x00e6abbb, 0x00e6ac85,
+ /* 50 */ 0x00e89896, 0x00e6abba, 0x00e6ac92, 0x00e6ac96,
+ /* 54 */ 0x00e9acb1, 0x00e6ac9f, 0x00e6acb8, 0x00e6acb7,
+ /* 58 */ 0x00e79b9c, 0x00e6acb9, 0x00e9a3ae, 0x00e6ad87,
+ /* 5c */ 0x00e6ad83, 0x00e6ad89, 0x00e6ad90, 0x00e6ad99,
+ /* 60 */ 0x00e6ad94, 0x00e6ad9b, 0x00e6ad9f, 0x00e6ada1,
+ /* 64 */ 0x00e6adb8, 0x00e6adb9, 0x00e6adbf, 0x00e6ae80,
+ /* 68 */ 0x00e6ae84, 0x00e6ae83, 0x00e6ae8d, 0x00e6ae98,
+ /* 6c */ 0x00e6ae95, 0x00e6ae9e, 0x00e6aea4, 0x00e6aeaa,
+ /* 70 */ 0x00e6aeab, 0x00e6aeaf, 0x00e6aeb2, 0x00e6aeb1,
+ /* 74 */ 0x00e6aeb3, 0x00e6aeb7, 0x00e6aebc, 0x00e6af86,
+ /* 78 */ 0x00e6af8b, 0x00e6af93, 0x00e6af9f, 0x00e6afac,
+ /* 7c */ 0x00e6afab, 0x00e6afb3, 0x00e6afaf, 0x00000000,
+ /* 80 */ 0x00e9babe, 0x00e6b088, 0x00e6b093, 0x00e6b094,
+ /* 84 */ 0x00e6b09b, 0x00e6b0a4, 0x00e6b0a3, 0x00e6b19e,
+ /* 88 */ 0x00e6b195, 0x00e6b1a2, 0x00e6b1aa, 0x00e6b282,
+ /* 8c */ 0x00e6b28d, 0x00e6b29a, 0x00e6b281, 0x00e6b29b,
+ /* 90 */ 0x00e6b1be, 0x00e6b1a8, 0x00e6b1b3, 0x00e6b292,
+ /* 94 */ 0x00e6b290, 0x00e6b384, 0x00e6b3b1, 0x00e6b393,
+ /* 98 */ 0x00e6b2bd, 0x00e6b397, 0x00e6b385, 0x00e6b39d,
+ /* 9c */ 0x00e6b2ae, 0x00e6b2b1, 0x00e6b2be, 0x00e6b2ba,
+ /* a0 */ 0x00e6b39b, 0x00e6b3af, 0x00e6b399, 0x00e6b3aa,
+ /* a4 */ 0x00e6b49f, 0x00e8a18d, 0x00e6b4b6, 0x00e6b4ab,
+ /* a8 */ 0x00e6b4bd, 0x00e6b4b8, 0x00e6b499, 0x00e6b4b5,
+ /* ac */ 0x00e6b4b3, 0x00e6b492, 0x00e6b48c, 0x00e6b5a3,
+ /* b0 */ 0x00e6b693, 0x00e6b5a4, 0x00e6b59a, 0x00e6b5b9,
+ /* b4 */ 0x00e6b599, 0x00e6b68e, 0x00e6b695, 0x00e6bfa4,
+ /* b8 */ 0x00e6b685, 0x00e6b7b9, 0x00e6b895, 0x00e6b88a,
+ /* bc */ 0x00e6b6b5, 0x00e6b787, 0x00e6b7a6, 0x00e6b6b8,
+ /* c0 */ 0x00e6b786, 0x00e6b7ac, 0x00e6b79e, 0x00e6b78c,
+ /* c4 */ 0x00e6b7a8, 0x00e6b792, 0x00e6b785, 0x00e6b7ba,
+ /* c8 */ 0x00e6b799, 0x00e6b7a4, 0x00e6b795, 0x00e6b7aa,
+ /* cc */ 0x00e6b7ae, 0x00e6b8ad, 0x00e6b9ae, 0x00e6b8ae,
+ /* d0 */ 0x00e6b899, 0x00e6b9b2, 0x00e6b99f, 0x00e6b8be,
+ /* d4 */ 0x00e6b8a3, 0x00e6b9ab, 0x00e6b8ab, 0x00e6b9b6,
+ /* d8 */ 0x00e6b98d, 0x00e6b89f, 0x00e6b983, 0x00e6b8ba,
+ /* dc */ 0x00e6b98e, 0x00e6b8a4, 0x00e6bbbf, 0x00e6b89d,
+ /* e0 */ 0x00e6b8b8, 0x00e6ba82, 0x00e6baaa, 0x00e6ba98,
+ /* e4 */ 0x00e6bb89, 0x00e6bab7, 0x00e6bb93, 0x00e6babd,
+ /* e8 */ 0x00e6baaf, 0x00e6bb84, 0x00e6bab2, 0x00e6bb94,
+ /* ec */ 0x00e6bb95, 0x00e6ba8f, 0x00e6baa5, 0x00e6bb82,
+ /* f0 */ 0x00e6ba9f, 0x00e6bd81, 0x00e6bc91, 0x00e7818c,
+ /* f4 */ 0x00e6bbac, 0x00e6bbb8, 0x00e6bbbe, 0x00e6bcbf,
+ /* f8 */ 0x00e6bbb2, 0x00e6bcb1, 0x00e6bbaf, 0x00e6bcb2,
+ /* fc */ 0x00e6bb8c,
+
+ /*** Two byte table, leaf: e0xx - offset 0x0185b ***/
+
+ /* 40 */ 0x00e6bcbe, 0x00e6bc93, 0x00e6bbb7, 0x00e6be86,
+ /* 44 */ 0x00e6bdba, 0x00e6bdb8, 0x00e6be81, 0x00e6be80,
+ /* 48 */ 0x00e6bdaf, 0x00e6bd9b, 0x00e6bfb3, 0x00e6bdad,
+ /* 4c */ 0x00e6be82, 0x00e6bdbc, 0x00e6bd98, 0x00e6be8e,
+ /* 50 */ 0x00e6be91, 0x00e6bf82, 0x00e6bda6, 0x00e6beb3,
+ /* 54 */ 0x00e6bea3, 0x00e6bea1, 0x00e6bea4, 0x00e6beb9,
+ /* 58 */ 0x00e6bf86, 0x00e6beaa, 0x00e6bf9f, 0x00e6bf95,
+ /* 5c */ 0x00e6bfac, 0x00e6bf94, 0x00e6bf98, 0x00e6bfb1,
+ /* 60 */ 0x00e6bfae, 0x00e6bf9b, 0x00e78089, 0x00e7808b,
+ /* 64 */ 0x00e6bfba, 0x00e78091, 0x00e78081, 0x00e7808f,
+ /* 68 */ 0x00e6bfbe, 0x00e7809b, 0x00e7809a, 0x00e6bdb4,
+ /* 6c */ 0x00e7809d, 0x00e78098, 0x00e7809f, 0x00e780b0,
+ /* 70 */ 0x00e780be, 0x00e780b2, 0x00e78191, 0x00e781a3,
+ /* 74 */ 0x00e78299, 0x00e78292, 0x00e782af, 0x00e783b1,
+ /* 78 */ 0x00e782ac, 0x00e782b8, 0x00e782b3, 0x00e782ae,
+ /* 7c */ 0x00e7839f, 0x00e7838b, 0x00e7839d, 0x00000000,
+ /* 80 */ 0x00e78399, 0x00e78489, 0x00e783bd, 0x00e7849c,
+ /* 84 */ 0x00e78499, 0x00e785a5, 0x00e78595, 0x00e78688,
+ /* 88 */ 0x00e785a6, 0x00e785a2, 0x00e7858c, 0x00e78596,
+ /* 8c */ 0x00e785ac, 0x00e7868f, 0x00e787bb, 0x00e78684,
+ /* 90 */ 0x00e78695, 0x00e786a8, 0x00e786ac, 0x00e78797,
+ /* 94 */ 0x00e786b9, 0x00e786be, 0x00e78792, 0x00e78789,
+ /* 98 */ 0x00e78794, 0x00e7878e, 0x00e787a0, 0x00e787ac,
+ /* 9c */ 0x00e787a7, 0x00e787b5, 0x00e787bc, 0x00e787b9,
+ /* a0 */ 0x00e787bf, 0x00e7888d, 0x00e78890, 0x00e7889b,
+ /* a4 */ 0x00e788a8, 0x00e788ad, 0x00e788ac, 0x00e788b0,
+ /* a8 */ 0x00e788b2, 0x00e788bb, 0x00e788bc, 0x00e788bf,
+ /* ac */ 0x00e78980, 0x00e78986, 0x00e7898b, 0x00e78998,
+ /* b0 */ 0x00e789b4, 0x00e789be, 0x00e78a82, 0x00e78a81,
+ /* b4 */ 0x00e78a87, 0x00e78a92, 0x00e78a96, 0x00e78aa2,
+ /* b8 */ 0x00e78aa7, 0x00e78ab9, 0x00e78ab2, 0x00e78b83,
+ /* bc */ 0x00e78b86, 0x00e78b84, 0x00e78b8e, 0x00e78b92,
+ /* c0 */ 0x00e78ba2, 0x00e78ba0, 0x00e78ba1, 0x00e78bb9,
+ /* c4 */ 0x00e78bb7, 0x00e5808f, 0x00e78c97, 0x00e78c8a,
+ /* c8 */ 0x00e78c9c, 0x00e78c96, 0x00e78c9d, 0x00e78cb4,
+ /* cc */ 0x00e78caf, 0x00e78ca9, 0x00e78ca5, 0x00e78cbe,
+ /* d0 */ 0x00e78d8e, 0x00e78d8f, 0x00e9bb98, 0x00e78d97,
+ /* d4 */ 0x00e78daa, 0x00e78da8, 0x00e78db0, 0x00e78db8,
+ /* d8 */ 0x00e78db5, 0x00e78dbb, 0x00e78dba, 0x00e78f88,
+ /* dc */ 0x00e78eb3, 0x00e78f8e, 0x00e78ebb, 0x00e78f80,
+ /* e0 */ 0x00e78fa5, 0x00e78fae, 0x00e78f9e, 0x00e792a2,
+ /* e4 */ 0x00e79085, 0x00e791af, 0x00e790a5, 0x00e78fb8,
+ /* e8 */ 0x00e790b2, 0x00e790ba, 0x00e79195, 0x00e790bf,
+ /* ec */ 0x00e7919f, 0x00e79199, 0x00e79181, 0x00e7919c,
+ /* f0 */ 0x00e791a9, 0x00e791b0, 0x00e791a3, 0x00e791aa,
+ /* f4 */ 0x00e791b6, 0x00e791be, 0x00e7928b, 0x00e7929e,
+ /* f8 */ 0x00e792a7, 0x00e7938a, 0x00e7938f, 0x00e79394,
+ /* fc */ 0x00e78fb1,
+
+ /*** Two byte table, leaf: e1xx - offset 0x01918 ***/
+
+ /* 40 */ 0x00e793a0, 0x00e793a3, 0x00e793a7, 0x00e793a9,
+ /* 44 */ 0x00e793ae, 0x00e793b2, 0x00e793b0, 0x00e793b1,
+ /* 48 */ 0x00e793b8, 0x00e793b7, 0x00e79484, 0x00e79483,
+ /* 4c */ 0x00e79485, 0x00e7948c, 0x00e7948e, 0x00e7948d,
+ /* 50 */ 0x00e79495, 0x00e79493, 0x00e7949e, 0x00e794a6,
+ /* 54 */ 0x00e794ac, 0x00e794bc, 0x00e79584, 0x00e7958d,
+ /* 58 */ 0x00e7958a, 0x00e79589, 0x00e7959b, 0x00e79586,
+ /* 5c */ 0x00e7959a, 0x00e795a9, 0x00e795a4, 0x00e795a7,
+ /* 60 */ 0x00e795ab, 0x00e795ad, 0x00e795b8, 0x00e795b6,
+ /* 64 */ 0x00e79686, 0x00e79687, 0x00e795b4, 0x00e7968a,
+ /* 68 */ 0x00e79689, 0x00e79682, 0x00e79694, 0x00e7969a,
+ /* 6c */ 0x00e7969d, 0x00e796a5, 0x00e796a3, 0x00e79782,
+ /* 70 */ 0x00e796b3, 0x00e79783, 0x00e796b5, 0x00e796bd,
+ /* 74 */ 0x00e796b8, 0x00e796bc, 0x00e796b1, 0x00e7978d,
+ /* 78 */ 0x00e7978a, 0x00e79792, 0x00e79799, 0x00e797a3,
+ /* 7c */ 0x00e7979e, 0x00e797be, 0x00e797bf, 0x00000000,
+ /* 80 */ 0x00e797bc, 0x00e79881, 0x00e797b0, 0x00e797ba,
+ /* 84 */ 0x00e797b2, 0x00e797b3, 0x00e7988b, 0x00e7988d,
+ /* 88 */ 0x00e79889, 0x00e7989f, 0x00e798a7, 0x00e798a0,
+ /* 8c */ 0x00e798a1, 0x00e798a2, 0x00e798a4, 0x00e798b4,
+ /* 90 */ 0x00e798b0, 0x00e798bb, 0x00e79987, 0x00e79988,
+ /* 94 */ 0x00e79986, 0x00e7999c, 0x00e79998, 0x00e799a1,
+ /* 98 */ 0x00e799a2, 0x00e799a8, 0x00e799a9, 0x00e799aa,
+ /* 9c */ 0x00e799a7, 0x00e799ac, 0x00e799b0, 0x00e799b2,
+ /* a0 */ 0x00e799b6, 0x00e799b8, 0x00e799bc, 0x00e79a80,
+ /* a4 */ 0x00e79a83, 0x00e79a88, 0x00e79a8b, 0x00e79a8e,
+ /* a8 */ 0x00e79a96, 0x00e79a93, 0x00e79a99, 0x00e79a9a,
+ /* ac */ 0x00e79ab0, 0x00e79ab4, 0x00e79ab8, 0x00e79ab9,
+ /* b0 */ 0x00e79aba, 0x00e79b82, 0x00e79b8d, 0x00e79b96,
+ /* b4 */ 0x00e79b92, 0x00e79b9e, 0x00e79ba1, 0x00e79ba5,
+ /* b8 */ 0x00e79ba7, 0x00e79baa, 0x00e898af, 0x00e79bbb,
+ /* bc */ 0x00e79c88, 0x00e79c87, 0x00e79c84, 0x00e79ca9,
+ /* c0 */ 0x00e79ca4, 0x00e79c9e, 0x00e79ca5, 0x00e79ca6,
+ /* c4 */ 0x00e79c9b, 0x00e79cb7, 0x00e79cb8, 0x00e79d87,
+ /* c8 */ 0x00e79d9a, 0x00e79da8, 0x00e79dab, 0x00e79d9b,
+ /* cc */ 0x00e79da5, 0x00e79dbf, 0x00e79dbe, 0x00e79db9,
+ /* d0 */ 0x00e79e8e, 0x00e79e8b, 0x00e79e91, 0x00e79ea0,
+ /* d4 */ 0x00e79e9e, 0x00e79eb0, 0x00e79eb6, 0x00e79eb9,
+ /* d8 */ 0x00e79ebf, 0x00e79ebc, 0x00e79ebd, 0x00e79ebb,
+ /* dc */ 0x00e79f87, 0x00e79f8d, 0x00e79f97, 0x00e79f9a,
+ /* e0 */ 0x00e79f9c, 0x00e79fa3, 0x00e79fae, 0x00e79fbc,
+ /* e4 */ 0x00e7a08c, 0x00e7a092, 0x00e7a4a6, 0x00e7a0a0,
+ /* e8 */ 0x00e7a4aa, 0x00e7a185, 0x00e7a28e, 0x00e7a1b4,
+ /* ec */ 0x00e7a286, 0x00e7a1bc, 0x00e7a29a, 0x00e7a28c,
+ /* f0 */ 0x00e7a2a3, 0x00e7a2b5, 0x00e7a2aa, 0x00e7a2af,
+ /* f4 */ 0x00e7a391, 0x00e7a386, 0x00e7a38b, 0x00e7a394,
+ /* f8 */ 0x00e7a2be, 0x00e7a2bc, 0x00e7a385, 0x00e7a38a,
+ /* fc */ 0x00e7a3ac,
+
+ /*** Two byte table, leaf: e2xx - offset 0x019d5 ***/
+
+ /* 40 */ 0x00e7a3a7, 0x00e7a39a, 0x00e7a3bd, 0x00e7a3b4,
+ /* 44 */ 0x00e7a487, 0x00e7a492, 0x00e7a491, 0x00e7a499,
+ /* 48 */ 0x00e7a4ac, 0x00e7a4ab, 0x00e7a580, 0x00e7a5a0,
+ /* 4c */ 0x00e7a597, 0x00e7a59f, 0x00e7a59a, 0x00e7a595,
+ /* 50 */ 0x00e7a593, 0x00e7a5ba, 0x00e7a5bf, 0x00e7a68a,
+ /* 54 */ 0x00e7a69d, 0x00e7a6a7, 0x00e9bd8b, 0x00e7a6aa,
+ /* 58 */ 0x00e7a6ae, 0x00e7a6b3, 0x00e7a6b9, 0x00e7a6ba,
+ /* 5c */ 0x00e7a789, 0x00e7a795, 0x00e7a7a7, 0x00e7a7ac,
+ /* 60 */ 0x00e7a7a1, 0x00e7a7a3, 0x00e7a888, 0x00e7a88d,
+ /* 64 */ 0x00e7a898, 0x00e7a899, 0x00e7a8a0, 0x00e7a89f,
+ /* 68 */ 0x00e7a680, 0x00e7a8b1, 0x00e7a8bb, 0x00e7a8be,
+ /* 6c */ 0x00e7a8b7, 0x00e7a983, 0x00e7a997, 0x00e7a989,
+ /* 70 */ 0x00e7a9a1, 0x00e7a9a2, 0x00e7a9a9, 0x00e9be9d,
+ /* 74 */ 0x00e7a9b0, 0x00e7a9b9, 0x00e7a9bd, 0x00e7aa88,
+ /* 78 */ 0x00e7aa97, 0x00e7aa95, 0x00e7aa98, 0x00e7aa96,
+ /* 7c */ 0x00e7aaa9, 0x00e7ab88, 0x00e7aab0, 0x00000000,
+ /* 80 */ 0x00e7aab6, 0x00e7ab85, 0x00e7ab84, 0x00e7aabf,
+ /* 84 */ 0x00e98283, 0x00e7ab87, 0x00e7ab8a, 0x00e7ab8d,
+ /* 88 */ 0x00e7ab8f, 0x00e7ab95, 0x00e7ab93, 0x00e7ab99,
+ /* 8c */ 0x00e7ab9a, 0x00e7ab9d, 0x00e7aba1, 0x00e7aba2,
+ /* 90 */ 0x00e7aba6, 0x00e7abad, 0x00e7abb0, 0x00e7ac82,
+ /* 94 */ 0x00e7ac8f, 0x00e7ac8a, 0x00e7ac86, 0x00e7acb3,
+ /* 98 */ 0x00e7ac98, 0x00e7ac99, 0x00e7ac9e, 0x00e7acb5,
+ /* 9c */ 0x00e7aca8, 0x00e7acb6, 0x00e7ad90, 0x00e7adba,
+ /* a0 */ 0x00e7ac84, 0x00e7ad8d, 0x00e7ac8b, 0x00e7ad8c,
+ /* a4 */ 0x00e7ad85, 0x00e7adb5, 0x00e7ada5, 0x00e7adb4,
+ /* a8 */ 0x00e7ada7, 0x00e7adb0, 0x00e7adb1, 0x00e7adac,
+ /* ac */ 0x00e7adae, 0x00e7ae9d, 0x00e7ae98, 0x00e7ae9f,
+ /* b0 */ 0x00e7ae8d, 0x00e7ae9c, 0x00e7ae9a, 0x00e7ae8b,
+ /* b4 */ 0x00e7ae92, 0x00e7ae8f, 0x00e7ad9d, 0x00e7ae99,
+ /* b8 */ 0x00e7af8b, 0x00e7af81, 0x00e7af8c, 0x00e7af8f,
+ /* bc */ 0x00e7aeb4, 0x00e7af86, 0x00e7af9d, 0x00e7afa9,
+ /* c0 */ 0x00e7b091, 0x00e7b094, 0x00e7afa6, 0x00e7afa5,
+ /* c4 */ 0x00e7b1a0, 0x00e7b080, 0x00e7b087, 0x00e7b093,
+ /* c8 */ 0x00e7afb3, 0x00e7afb7, 0x00e7b097, 0x00e7b08d,
+ /* cc */ 0x00e7afb6, 0x00e7b0a3, 0x00e7b0a7, 0x00e7b0aa,
+ /* d0 */ 0x00e7b09f, 0x00e7b0b7, 0x00e7b0ab, 0x00e7b0bd,
+ /* d4 */ 0x00e7b18c, 0x00e7b183, 0x00e7b194, 0x00e7b18f,
+ /* d8 */ 0x00e7b180, 0x00e7b190, 0x00e7b198, 0x00e7b19f,
+ /* dc */ 0x00e7b1a4, 0x00e7b196, 0x00e7b1a5, 0x00e7b1ac,
+ /* e0 */ 0x00e7b1b5, 0x00e7b283, 0x00e7b290, 0x00e7b2a4,
+ /* e4 */ 0x00e7b2ad, 0x00e7b2a2, 0x00e7b2ab, 0x00e7b2a1,
+ /* e8 */ 0x00e7b2a8, 0x00e7b2b3, 0x00e7b2b2, 0x00e7b2b1,
+ /* ec */ 0x00e7b2ae, 0x00e7b2b9, 0x00e7b2bd, 0x00e7b380,
+ /* f0 */ 0x00e7b385, 0x00e7b382, 0x00e7b398, 0x00e7b392,
+ /* f4 */ 0x00e7b39c, 0x00e7b3a2, 0x00e9acbb, 0x00e7b3af,
+ /* f8 */ 0x00e7b3b2, 0x00e7b3b4, 0x00e7b3b6, 0x00e7b3ba,
+ /* fc */ 0x00e7b486,
+
+ /*** Two byte table, leaf: e3xx - offset 0x01a92 ***/
+
+ /* 40 */ 0x00e7b482, 0x00e7b49c, 0x00e7b495, 0x00e7b48a,
+ /* 44 */ 0x00e7b585, 0x00e7b58b, 0x00e7b4ae, 0x00e7b4b2,
+ /* 48 */ 0x00e7b4bf, 0x00e7b4b5, 0x00e7b586, 0x00e7b5b3,
+ /* 4c */ 0x00e7b596, 0x00e7b58e, 0x00e7b5b2, 0x00e7b5a8,
+ /* 50 */ 0x00e7b5ae, 0x00e7b58f, 0x00e7b5a3, 0x00e7b693,
+ /* 54 */ 0x00e7b689, 0x00e7b59b, 0x00e7b68f, 0x00e7b5bd,
+ /* 58 */ 0x00e7b69b, 0x00e7b6ba, 0x00e7b6ae, 0x00e7b6a3,
+ /* 5c */ 0x00e7b6b5, 0x00e7b787, 0x00e7b6bd, 0x00e7b6ab,
+ /* 60 */ 0x00e7b8bd, 0x00e7b6a2, 0x00e7b6af, 0x00e7b79c,
+ /* 64 */ 0x00e7b6b8, 0x00e7b69f, 0x00e7b6b0, 0x00e7b798,
+ /* 68 */ 0x00e7b79d, 0x00e7b7a4, 0x00e7b79e, 0x00e7b7bb,
+ /* 6c */ 0x00e7b7b2, 0x00e7b7a1, 0x00e7b885, 0x00e7b88a,
+ /* 70 */ 0x00e7b8a3, 0x00e7b8a1, 0x00e7b892, 0x00e7b8b1,
+ /* 74 */ 0x00e7b89f, 0x00e7b889, 0x00e7b88b, 0x00e7b8a2,
+ /* 78 */ 0x00e7b986, 0x00e7b9a6, 0x00e7b8bb, 0x00e7b8b5,
+ /* 7c */ 0x00e7b8b9, 0x00e7b983, 0x00e7b8b7, 0x00000000,
+ /* 80 */ 0x00e7b8b2, 0x00e7b8ba, 0x00e7b9a7, 0x00e7b99d,
+ /* 84 */ 0x00e7b996, 0x00e7b99e, 0x00e7b999, 0x00e7b99a,
+ /* 88 */ 0x00e7b9b9, 0x00e7b9aa, 0x00e7b9a9, 0x00e7b9bc,
+ /* 8c */ 0x00e7b9bb, 0x00e7ba83, 0x00e7b795, 0x00e7b9bd,
+ /* 90 */ 0x00e8beae, 0x00e7b9bf, 0x00e7ba88, 0x00e7ba89,
+ /* 94 */ 0x00e7ba8c, 0x00e7ba92, 0x00e7ba90, 0x00e7ba93,
+ /* 98 */ 0x00e7ba94, 0x00e7ba96, 0x00e7ba8e, 0x00e7ba9b,
+ /* 9c */ 0x00e7ba9c, 0x00e7bcb8, 0x00e7bcba, 0x00e7bd85,
+ /* a0 */ 0x00e7bd8c, 0x00e7bd8d, 0x00e7bd8e, 0x00e7bd90,
+ /* a4 */ 0x00e7bd91, 0x00e7bd95, 0x00e7bd94, 0x00e7bd98,
+ /* a8 */ 0x00e7bd9f, 0x00e7bda0, 0x00e7bda8, 0x00e7bda9,
+ /* ac */ 0x00e7bda7, 0x00e7bdb8, 0x00e7be82, 0x00e7be86,
+ /* b0 */ 0x00e7be83, 0x00e7be88, 0x00e7be87, 0x00e7be8c,
+ /* b4 */ 0x00e7be94, 0x00e7be9e, 0x00e7be9d, 0x00e7be9a,
+ /* b8 */ 0x00e7bea3, 0x00e7beaf, 0x00e7beb2, 0x00e7beb9,
+ /* bc */ 0x00e7beae, 0x00e7beb6, 0x00e7beb8, 0x00e8adb1,
+ /* c0 */ 0x00e7bf85, 0x00e7bf86, 0x00e7bf8a, 0x00e7bf95,
+ /* c4 */ 0x00e7bf94, 0x00e7bfa1, 0x00e7bfa6, 0x00e7bfa9,
+ /* c8 */ 0x00e7bfb3, 0x00e7bfb9, 0x00e9a39c, 0x00e88086,
+ /* cc */ 0x00e88084, 0x00e8808b, 0x00e88092, 0x00e88098,
+ /* d0 */ 0x00e88099, 0x00e8809c, 0x00e880a1, 0x00e880a8,
+ /* d4 */ 0x00e880bf, 0x00e880bb, 0x00e8818a, 0x00e88186,
+ /* d8 */ 0x00e88192, 0x00e88198, 0x00e8819a, 0x00e8819f,
+ /* dc */ 0x00e881a2, 0x00e881a8, 0x00e881b3, 0x00e881b2,
+ /* e0 */ 0x00e881b0, 0x00e881b6, 0x00e881b9, 0x00e881bd,
+ /* e4 */ 0x00e881bf, 0x00e88284, 0x00e88286, 0x00e88285,
+ /* e8 */ 0x00e8829b, 0x00e88293, 0x00e8829a, 0x00e882ad,
+ /* ec */ 0x00e58690, 0x00e882ac, 0x00e8839b, 0x00e883a5,
+ /* f0 */ 0x00e88399, 0x00e8839d, 0x00e88384, 0x00e8839a,
+ /* f4 */ 0x00e88396, 0x00e88489, 0x00e883af, 0x00e883b1,
+ /* f8 */ 0x00e8849b, 0x00e884a9, 0x00e884a3, 0x00e884af,
+ /* fc */ 0x00e8858b,
+
+ /*** Two byte table, leaf: e4xx - offset 0x01b4f ***/
+
+ /* 40 */ 0x00e99a8b, 0x00e88586, 0x00e884be, 0x00e88593,
+ /* 44 */ 0x00e88591, 0x00e883bc, 0x00e885b1, 0x00e885ae,
+ /* 48 */ 0x00e885a5, 0x00e885a6, 0x00e885b4, 0x00e88683,
+ /* 4c */ 0x00e88688, 0x00e8868a, 0x00e88680, 0x00e88682,
+ /* 50 */ 0x00e886a0, 0x00e88695, 0x00e886a4, 0x00e886a3,
+ /* 54 */ 0x00e8859f, 0x00e88693, 0x00e886a9, 0x00e886b0,
+ /* 58 */ 0x00e886b5, 0x00e886be, 0x00e886b8, 0x00e886bd,
+ /* 5c */ 0x00e88780, 0x00e88782, 0x00e886ba, 0x00e88789,
+ /* 60 */ 0x00e8878d, 0x00e88791, 0x00e88799, 0x00e88798,
+ /* 64 */ 0x00e88788, 0x00e8879a, 0x00e8879f, 0x00e887a0,
+ /* 68 */ 0x00e887a7, 0x00e887ba, 0x00e887bb, 0x00e887be,
+ /* 6c */ 0x00e88881, 0x00e88882, 0x00e88885, 0x00e88887,
+ /* 70 */ 0x00e8888a, 0x00e8888d, 0x00e88890, 0x00e88896,
+ /* 74 */ 0x00e888a9, 0x00e888ab, 0x00e888b8, 0x00e888b3,
+ /* 78 */ 0x00e88980, 0x00e88999, 0x00e88998, 0x00e8899d,
+ /* 7c */ 0x00e8899a, 0x00e8899f, 0x00e889a4, 0x00000000,
+ /* 80 */ 0x00e889a2, 0x00e889a8, 0x00e889aa, 0x00e889ab,
+ /* 84 */ 0x00e888ae, 0x00e889b1, 0x00e889b7, 0x00e889b8,
+ /* 88 */ 0x00e889be, 0x00e88a8d, 0x00e88a92, 0x00e88aab,
+ /* 8c */ 0x00e88a9f, 0x00e88abb, 0x00e88aac, 0x00e88ba1,
+ /* 90 */ 0x00e88ba3, 0x00e88b9f, 0x00e88b92, 0x00e88bb4,
+ /* 94 */ 0x00e88bb3, 0x00e88bba, 0x00e88e93, 0x00e88c83,
+ /* 98 */ 0x00e88bbb, 0x00e88bb9, 0x00e88b9e, 0x00e88c86,
+ /* 9c */ 0x00e88b9c, 0x00e88c89, 0x00e88b99, 0x00e88cb5,
+ /* a0 */ 0x00e88cb4, 0x00e88c96, 0x00e88cb2, 0x00e88cb1,
+ /* a4 */ 0x00e88d80, 0x00e88cb9, 0x00e88d90, 0x00e88d85,
+ /* a8 */ 0x00e88caf, 0x00e88cab, 0x00e88c97, 0x00e88c98,
+ /* ac */ 0x00e88e85, 0x00e88e9a, 0x00e88eaa, 0x00e88e9f,
+ /* b0 */ 0x00e88ea2, 0x00e88e96, 0x00e88ca3, 0x00e88e8e,
+ /* b4 */ 0x00e88e87, 0x00e88e8a, 0x00e88dbc, 0x00e88eb5,
+ /* b8 */ 0x00e88db3, 0x00e88db5, 0x00e88ea0, 0x00e88e89,
+ /* bc */ 0x00e88ea8, 0x00e88fb4, 0x00e89093, 0x00e88fab,
+ /* c0 */ 0x00e88f8e, 0x00e88fbd, 0x00e89083, 0x00e88f98,
+ /* c4 */ 0x00e8908b, 0x00e88f81, 0x00e88fb7, 0x00e89087,
+ /* c8 */ 0x00e88fa0, 0x00e88fb2, 0x00e8908d, 0x00e890a2,
+ /* cc */ 0x00e890a0, 0x00e88ebd, 0x00e890b8, 0x00e89486,
+ /* d0 */ 0x00e88fbb, 0x00e891ad, 0x00e890aa, 0x00e890bc,
+ /* d4 */ 0x00e8959a, 0x00e89284, 0x00e891b7, 0x00e891ab,
+ /* d8 */ 0x00e892ad, 0x00e891ae, 0x00e89282, 0x00e891a9,
+ /* dc */ 0x00e89186, 0x00e890ac, 0x00e891af, 0x00e891b9,
+ /* e0 */ 0x00e890b5, 0x00e8938a, 0x00e891a2, 0x00e892b9,
+ /* e4 */ 0x00e892bf, 0x00e8929f, 0x00e89399, 0x00e8938d,
+ /* e8 */ 0x00e892bb, 0x00e8939a, 0x00e89390, 0x00e89381,
+ /* ec */ 0x00e89386, 0x00e89396, 0x00e892a1, 0x00e894a1,
+ /* f0 */ 0x00e893bf, 0x00e893b4, 0x00e89497, 0x00e89498,
+ /* f4 */ 0x00e894ac, 0x00e8949f, 0x00e89495, 0x00e89494,
+ /* f8 */ 0x00e893bc, 0x00e89580, 0x00e895a3, 0x00e89598,
+ /* fc */ 0x00e89588,
+
+ /*** Two byte table, leaf: e5xx - offset 0x01c0c ***/
+
+ /* 40 */ 0x00e89581, 0x00e89882, 0x00e8958b, 0x00e89595,
+ /* 44 */ 0x00e89680, 0x00e896a4, 0x00e89688, 0x00e89691,
+ /* 48 */ 0x00e8968a, 0x00e896a8, 0x00e895ad, 0x00e89694,
+ /* 4c */ 0x00e8969b, 0x00e897aa, 0x00e89687, 0x00e8969c,
+ /* 50 */ 0x00e895b7, 0x00e895be, 0x00e89690, 0x00e89789,
+ /* 54 */ 0x00e896ba, 0x00e8978f, 0x00e896b9, 0x00e89790,
+ /* 58 */ 0x00e89795, 0x00e8979d, 0x00e897a5, 0x00e8979c,
+ /* 5c */ 0x00e897b9, 0x00e8988a, 0x00e89893, 0x00e8988b,
+ /* 60 */ 0x00e897be, 0x00e897ba, 0x00e89886, 0x00e898a2,
+ /* 64 */ 0x00e8989a, 0x00e898b0, 0x00e898bf, 0x00e8998d,
+ /* 68 */ 0x00e4b995, 0x00e89994, 0x00e8999f, 0x00e899a7,
+ /* 6c */ 0x00e899b1, 0x00e89a93, 0x00e89aa3, 0x00e89aa9,
+ /* 70 */ 0x00e89aaa, 0x00e89a8b, 0x00e89a8c, 0x00e89ab6,
+ /* 74 */ 0x00e89aaf, 0x00e89b84, 0x00e89b86, 0x00e89ab0,
+ /* 78 */ 0x00e89b89, 0x00e8a0a3, 0x00e89aab, 0x00e89b94,
+ /* 7c */ 0x00e89b9e, 0x00e89ba9, 0x00e89bac, 0x00000000,
+ /* 80 */ 0x00e89b9f, 0x00e89b9b, 0x00e89baf, 0x00e89c92,
+ /* 84 */ 0x00e89c86, 0x00e89c88, 0x00e89c80, 0x00e89c83,
+ /* 88 */ 0x00e89bbb, 0x00e89c91, 0x00e89c89, 0x00e89c8d,
+ /* 8c */ 0x00e89bb9, 0x00e89c8a, 0x00e89cb4, 0x00e89cbf,
+ /* 90 */ 0x00e89cb7, 0x00e89cbb, 0x00e89ca5, 0x00e89ca9,
+ /* 94 */ 0x00e89c9a, 0x00e89da0, 0x00e89d9f, 0x00e89db8,
+ /* 98 */ 0x00e89d8c, 0x00e89d8e, 0x00e89db4, 0x00e89d97,
+ /* 9c */ 0x00e89da8, 0x00e89dae, 0x00e89d99, 0x00e89d93,
+ /* a0 */ 0x00e89da3, 0x00e89daa, 0x00e8a085, 0x00e89ea2,
+ /* a4 */ 0x00e89e9f, 0x00e89e82, 0x00e89eaf, 0x00e89f8b,
+ /* a8 */ 0x00e89ebd, 0x00e89f80, 0x00e89f90, 0x00e99b96,
+ /* ac */ 0x00e89eab, 0x00e89f84, 0x00e89eb3, 0x00e89f87,
+ /* b0 */ 0x00e89f86, 0x00e89ebb, 0x00e89faf, 0x00e89fb2,
+ /* b4 */ 0x00e89fa0, 0x00e8a08f, 0x00e8a08d, 0x00e89fbe,
+ /* b8 */ 0x00e89fb6, 0x00e89fb7, 0x00e8a08e, 0x00e89f92,
+ /* bc */ 0x00e8a091, 0x00e8a096, 0x00e8a095, 0x00e8a0a2,
+ /* c0 */ 0x00e8a0a1, 0x00e8a0b1, 0x00e8a0b6, 0x00e8a0b9,
+ /* c4 */ 0x00e8a0a7, 0x00e8a0bb, 0x00e8a184, 0x00e8a182,
+ /* c8 */ 0x00e8a192, 0x00e8a199, 0x00e8a19e, 0x00e8a1a2,
+ /* cc */ 0x00e8a1ab, 0x00e8a281, 0x00e8a1be, 0x00e8a29e,
+ /* d0 */ 0x00e8a1b5, 0x00e8a1bd, 0x00e8a2b5, 0x00e8a1b2,
+ /* d4 */ 0x00e8a282, 0x00e8a297, 0x00e8a292, 0x00e8a2ae,
+ /* d8 */ 0x00e8a299, 0x00e8a2a2, 0x00e8a28d, 0x00e8a2a4,
+ /* dc */ 0x00e8a2b0, 0x00e8a2bf, 0x00e8a2b1, 0x00e8a383,
+ /* e0 */ 0x00e8a384, 0x00e8a394, 0x00e8a398, 0x00e8a399,
+ /* e4 */ 0x00e8a39d, 0x00e8a3b9, 0x00e8a482, 0x00e8a3bc,
+ /* e8 */ 0x00e8a3b4, 0x00e8a3a8, 0x00e8a3b2, 0x00e8a484,
+ /* ec */ 0x00e8a48c, 0x00e8a48a, 0x00e8a493, 0x00e8a583,
+ /* f0 */ 0x00e8a49e, 0x00e8a4a5, 0x00e8a4aa, 0x00e8a4ab,
+ /* f4 */ 0x00e8a581, 0x00e8a584, 0x00e8a4bb, 0x00e8a4b6,
+ /* f8 */ 0x00e8a4b8, 0x00e8a58c, 0x00e8a49d, 0x00e8a5a0,
+ /* fc */ 0x00e8a59e,
+
+ /*** Two byte table, leaf: e6xx - offset 0x01cc9 ***/
+
+ /* 40 */ 0x00e8a5a6, 0x00e8a5a4, 0x00e8a5ad, 0x00e8a5aa,
+ /* 44 */ 0x00e8a5af, 0x00e8a5b4, 0x00e8a5b7, 0x00e8a5be,
+ /* 48 */ 0x00e8a683, 0x00e8a688, 0x00e8a68a, 0x00e8a693,
+ /* 4c */ 0x00e8a698, 0x00e8a6a1, 0x00e8a6a9, 0x00e8a6a6,
+ /* 50 */ 0x00e8a6ac, 0x00e8a6af, 0x00e8a6b2, 0x00e8a6ba,
+ /* 54 */ 0x00e8a6bd, 0x00e8a6bf, 0x00e8a780, 0x00e8a79a,
+ /* 58 */ 0x00e8a79c, 0x00e8a79d, 0x00e8a7a7, 0x00e8a7b4,
+ /* 5c */ 0x00e8a7b8, 0x00e8a883, 0x00e8a896, 0x00e8a890,
+ /* 60 */ 0x00e8a88c, 0x00e8a89b, 0x00e8a89d, 0x00e8a8a5,
+ /* 64 */ 0x00e8a8b6, 0x00e8a981, 0x00e8a99b, 0x00e8a992,
+ /* 68 */ 0x00e8a986, 0x00e8a988, 0x00e8a9bc, 0x00e8a9ad,
+ /* 6c */ 0x00e8a9ac, 0x00e8a9a2, 0x00e8aa85, 0x00e8aa82,
+ /* 70 */ 0x00e8aa84, 0x00e8aaa8, 0x00e8aaa1, 0x00e8aa91,
+ /* 74 */ 0x00e8aaa5, 0x00e8aaa6, 0x00e8aa9a, 0x00e8aaa3,
+ /* 78 */ 0x00e8ab84, 0x00e8ab8d, 0x00e8ab82, 0x00e8ab9a,
+ /* 7c */ 0x00e8abab, 0x00e8abb3, 0x00e8aba7, 0x00000000,
+ /* 80 */ 0x00e8aba4, 0x00e8abb1, 0x00e8ac94, 0x00e8aba0,
+ /* 84 */ 0x00e8aba2, 0x00e8abb7, 0x00e8ab9e, 0x00e8ab9b,
+ /* 88 */ 0x00e8ac8c, 0x00e8ac87, 0x00e8ac9a, 0x00e8aba1,
+ /* 8c */ 0x00e8ac96, 0x00e8ac90, 0x00e8ac97, 0x00e8aca0,
+ /* 90 */ 0x00e8acb3, 0x00e99eab, 0x00e8aca6, 0x00e8acab,
+ /* 94 */ 0x00e8acbe, 0x00e8aca8, 0x00e8ad81, 0x00e8ad8c,
+ /* 98 */ 0x00e8ad8f, 0x00e8ad8e, 0x00e8ad89, 0x00e8ad96,
+ /* 9c */ 0x00e8ad9b, 0x00e8ad9a, 0x00e8adab, 0x00e8ad9f,
+ /* a0 */ 0x00e8adac, 0x00e8adaf, 0x00e8adb4, 0x00e8adbd,
+ /* a4 */ 0x00e8ae80, 0x00e8ae8c, 0x00e8ae8e, 0x00e8ae92,
+ /* a8 */ 0x00e8ae93, 0x00e8ae96, 0x00e8ae99, 0x00e8ae9a,
+ /* ac */ 0x00e8b0ba, 0x00e8b181, 0x00e8b0bf, 0x00e8b188,
+ /* b0 */ 0x00e8b18c, 0x00e8b18e, 0x00e8b190, 0x00e8b195,
+ /* b4 */ 0x00e8b1a2, 0x00e8b1ac, 0x00e8b1b8, 0x00e8b1ba,
+ /* b8 */ 0x00e8b282, 0x00e8b289, 0x00e8b285, 0x00e8b28a,
+ /* bc */ 0x00e8b28d, 0x00e8b28e, 0x00e8b294, 0x00e8b1bc,
+ /* c0 */ 0x00e8b298, 0x00e6889d, 0x00e8b2ad, 0x00e8b2aa,
+ /* c4 */ 0x00e8b2bd, 0x00e8b2b2, 0x00e8b2b3, 0x00e8b2ae,
+ /* c8 */ 0x00e8b2b6, 0x00e8b388, 0x00e8b381, 0x00e8b3a4,
+ /* cc */ 0x00e8b3a3, 0x00e8b39a, 0x00e8b3bd, 0x00e8b3ba,
+ /* d0 */ 0x00e8b3bb, 0x00e8b484, 0x00e8b485, 0x00e8b48a,
+ /* d4 */ 0x00e8b487, 0x00e8b48f, 0x00e8b48d, 0x00e8b490,
+ /* d8 */ 0x00e9bd8e, 0x00e8b493, 0x00e8b38d, 0x00e8b494,
+ /* dc */ 0x00e8b496, 0x00e8b5a7, 0x00e8b5ad, 0x00e8b5b1,
+ /* e0 */ 0x00e8b5b3, 0x00e8b681, 0x00e8b699, 0x00e8b782,
+ /* e4 */ 0x00e8b6be, 0x00e8b6ba, 0x00e8b78f, 0x00e8b79a,
+ /* e8 */ 0x00e8b796, 0x00e8b78c, 0x00e8b79b, 0x00e8b78b,
+ /* ec */ 0x00e8b7aa, 0x00e8b7ab, 0x00e8b79f, 0x00e8b7a3,
+ /* f0 */ 0x00e8b7bc, 0x00e8b888, 0x00e8b889, 0x00e8b7bf,
+ /* f4 */ 0x00e8b89d, 0x00e8b89e, 0x00e8b890, 0x00e8b89f,
+ /* f8 */ 0x00e8b982, 0x00e8b8b5, 0x00e8b8b0, 0x00e8b8b4,
+ /* fc */ 0x00e8b98a,
+
+ /*** Two byte table, leaf: e7xx - offset 0x01d86 ***/
+
+ /* 40 */ 0x00e8b987, 0x00e8b989, 0x00e8b98c, 0x00e8b990,
+ /* 44 */ 0x00e8b988, 0x00e8b999, 0x00e8b9a4, 0x00e8b9a0,
+ /* 48 */ 0x00e8b8aa, 0x00e8b9a3, 0x00e8b995, 0x00e8b9b6,
+ /* 4c */ 0x00e8b9b2, 0x00e8b9bc, 0x00e8ba81, 0x00e8ba87,
+ /* 50 */ 0x00e8ba85, 0x00e8ba84, 0x00e8ba8b, 0x00e8ba8a,
+ /* 54 */ 0x00e8ba93, 0x00e8ba91, 0x00e8ba94, 0x00e8ba99,
+ /* 58 */ 0x00e8baaa, 0x00e8baa1, 0x00e8baac, 0x00e8bab0,
+ /* 5c */ 0x00e8bb86, 0x00e8bab1, 0x00e8babe, 0x00e8bb85,
+ /* 60 */ 0x00e8bb88, 0x00e8bb8b, 0x00e8bb9b, 0x00e8bba3,
+ /* 64 */ 0x00e8bbbc, 0x00e8bbbb, 0x00e8bbab, 0x00e8bbbe,
+ /* 68 */ 0x00e8bc8a, 0x00e8bc85, 0x00e8bc95, 0x00e8bc92,
+ /* 6c */ 0x00e8bc99, 0x00e8bc93, 0x00e8bc9c, 0x00e8bc9f,
+ /* 70 */ 0x00e8bc9b, 0x00e8bc8c, 0x00e8bca6, 0x00e8bcb3,
+ /* 74 */ 0x00e8bcbb, 0x00e8bcb9, 0x00e8bd85, 0x00e8bd82,
+ /* 78 */ 0x00e8bcbe, 0x00e8bd8c, 0x00e8bd89, 0x00e8bd86,
+ /* 7c */ 0x00e8bd8e, 0x00e8bd97, 0x00e8bd9c, 0x00000000,
+ /* 80 */ 0x00e8bda2, 0x00e8bda3, 0x00e8bda4, 0x00e8be9c,
+ /* 84 */ 0x00e8be9f, 0x00e8bea3, 0x00e8bead, 0x00e8beaf,
+ /* 88 */ 0x00e8beb7, 0x00e8bf9a, 0x00e8bfa5, 0x00e8bfa2,
+ /* 8c */ 0x00e8bfaa, 0x00e8bfaf, 0x00e98287, 0x00e8bfb4,
+ /* 90 */ 0x00e98085, 0x00e8bfb9, 0x00e8bfba, 0x00e98091,
+ /* 94 */ 0x00e98095, 0x00e980a1, 0x00e9808d, 0x00e9809e,
+ /* 98 */ 0x00e98096, 0x00e9808b, 0x00e980a7, 0x00e980b6,
+ /* 9c */ 0x00e980b5, 0x00e980b9, 0x00e8bfb8, 0x00e9818f,
+ /* a0 */ 0x00e98190, 0x00e98191, 0x00e98192, 0x00e9808e,
+ /* a4 */ 0x00e98189, 0x00e980be, 0x00e98196, 0x00e98198,
+ /* a8 */ 0x00e9819e, 0x00e981a8, 0x00e981af, 0x00e981b6,
+ /* ac */ 0x00e99aa8, 0x00e981b2, 0x00e98282, 0x00e981bd,
+ /* b0 */ 0x00e98281, 0x00e98280, 0x00e9828a, 0x00e98289,
+ /* b4 */ 0x00e9828f, 0x00e982a8, 0x00e982af, 0x00e982b1,
+ /* b8 */ 0x00e982b5, 0x00e983a2, 0x00e983a4, 0x00e68988,
+ /* bc */ 0x00e9839b, 0x00e98482, 0x00e98492, 0x00e98499,
+ /* c0 */ 0x00e984b2, 0x00e984b0, 0x00e9858a, 0x00e98596,
+ /* c4 */ 0x00e98598, 0x00e985a3, 0x00e985a5, 0x00e985a9,
+ /* c8 */ 0x00e985b3, 0x00e985b2, 0x00e9868b, 0x00e98689,
+ /* cc */ 0x00e98682, 0x00e986a2, 0x00e986ab, 0x00e986af,
+ /* d0 */ 0x00e986aa, 0x00e986b5, 0x00e986b4, 0x00e986ba,
+ /* d4 */ 0x00e98780, 0x00e98781, 0x00e98789, 0x00e9878b,
+ /* d8 */ 0x00e98790, 0x00e98796, 0x00e9879f, 0x00e987a1,
+ /* dc */ 0x00e9879b, 0x00e987bc, 0x00e987b5, 0x00e987b6,
+ /* e0 */ 0x00e9889e, 0x00e987bf, 0x00e98894, 0x00e988ac,
+ /* e4 */ 0x00e98895, 0x00e98891, 0x00e9899e, 0x00e98997,
+ /* e8 */ 0x00e98985, 0x00e98989, 0x00e989a4, 0x00e98988,
+ /* ec */ 0x00e98a95, 0x00e988bf, 0x00e9898b, 0x00e98990,
+ /* f0 */ 0x00e98a9c, 0x00e98a96, 0x00e98a93, 0x00e98a9b,
+ /* f4 */ 0x00e9899a, 0x00e98b8f, 0x00e98ab9, 0x00e98ab7,
+ /* f8 */ 0x00e98ba9, 0x00e98c8f, 0x00e98bba, 0x00e98d84,
+ /* fc */ 0x00e98cae,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01e43 ***/
+
+ /* 40 */ 0x00e98c99, 0x00e98ca2, 0x00e98c9a, 0x00e98ca3,
+ /* 44 */ 0x00e98cba, 0x00e98cb5, 0x00e98cbb, 0x00e98d9c,
+ /* 48 */ 0x00e98da0, 0x00e98dbc, 0x00e98dae, 0x00e98d96,
+ /* 4c */ 0x00e98eb0, 0x00e98eac, 0x00e98ead, 0x00e98e94,
+ /* 50 */ 0x00e98eb9, 0x00e98f96, 0x00e98f97, 0x00e98fa8,
+ /* 54 */ 0x00e98fa5, 0x00e98f98, 0x00e98f83, 0x00e98f9d,
+ /* 58 */ 0x00e98f90, 0x00e98f88, 0x00e98fa4, 0x00e9909a,
+ /* 5c */ 0x00e99094, 0x00e99093, 0x00e99083, 0x00e99087,
+ /* 60 */ 0x00e99090, 0x00e990b6, 0x00e990ab, 0x00e990b5,
+ /* 64 */ 0x00e990a1, 0x00e990ba, 0x00e99181, 0x00e99192,
+ /* 68 */ 0x00e99184, 0x00e9919b, 0x00e991a0, 0x00e991a2,
+ /* 6c */ 0x00e9919e, 0x00e991aa, 0x00e988a9, 0x00e991b0,
+ /* 70 */ 0x00e991b5, 0x00e991b7, 0x00e991bd, 0x00e9919a,
+ /* 74 */ 0x00e991bc, 0x00e991be, 0x00e99281, 0x00e991bf,
+ /* 78 */ 0x00e99682, 0x00e99687, 0x00e9968a, 0x00e99694,
+ /* 7c */ 0x00e99696, 0x00e99698, 0x00e99699, 0x00000000,
+ /* 80 */ 0x00e996a0, 0x00e996a8, 0x00e996a7, 0x00e996ad,
+ /* 84 */ 0x00e996bc, 0x00e996bb, 0x00e996b9, 0x00e996be,
+ /* 88 */ 0x00e9978a, 0x00e6bfb6, 0x00e99783, 0x00e9978d,
+ /* 8c */ 0x00e9978c, 0x00e99795, 0x00e99794, 0x00e99796,
+ /* 90 */ 0x00e9979c, 0x00e997a1, 0x00e997a5, 0x00e997a2,
+ /* 94 */ 0x00e998a1, 0x00e998a8, 0x00e998ae, 0x00e998af,
+ /* 98 */ 0x00e99982, 0x00e9998c, 0x00e9998f, 0x00e9998b,
+ /* 9c */ 0x00e999b7, 0x00e9999c, 0x00e9999e, 0x00e9999d,
+ /* a0 */ 0x00e9999f, 0x00e999a6, 0x00e999b2, 0x00e999ac,
+ /* a4 */ 0x00e99a8d, 0x00e99a98, 0x00e99a95, 0x00e99a97,
+ /* a8 */ 0x00e99aaa, 0x00e99aa7, 0x00e99ab1, 0x00e99ab2,
+ /* ac */ 0x00e99ab0, 0x00e99ab4, 0x00e99ab6, 0x00e99ab8,
+ /* b0 */ 0x00e99ab9, 0x00e99b8e, 0x00e99b8b, 0x00e99b89,
+ /* b4 */ 0x00e99b8d, 0x00e8a58d, 0x00e99b9c, 0x00e99c8d,
+ /* b8 */ 0x00e99b95, 0x00e99bb9, 0x00e99c84, 0x00e99c86,
+ /* bc */ 0x00e99c88, 0x00e99c93, 0x00e99c8e, 0x00e99c91,
+ /* c0 */ 0x00e99c8f, 0x00e99c96, 0x00e99c99, 0x00e99ca4,
+ /* c4 */ 0x00e99caa, 0x00e99cb0, 0x00e99cb9, 0x00e99cbd,
+ /* c8 */ 0x00e99cbe, 0x00e99d84, 0x00e99d86, 0x00e99d88,
+ /* cc */ 0x00e99d82, 0x00e99d89, 0x00e99d9c, 0x00e99da0,
+ /* d0 */ 0x00e99da4, 0x00e99da6, 0x00e99da8, 0x00e58b92,
+ /* d4 */ 0x00e99dab, 0x00e99db1, 0x00e99db9, 0x00e99e85,
+ /* d8 */ 0x00e99dbc, 0x00e99e81, 0x00e99dba, 0x00e99e86,
+ /* dc */ 0x00e99e8b, 0x00e99e8f, 0x00e99e90, 0x00e99e9c,
+ /* e0 */ 0x00e99ea8, 0x00e99ea6, 0x00e99ea3, 0x00e99eb3,
+ /* e4 */ 0x00e99eb4, 0x00e99f83, 0x00e99f86, 0x00e99f88,
+ /* e8 */ 0x00e99f8b, 0x00e99f9c, 0x00e99fad, 0x00e9bd8f,
+ /* ec */ 0x00e99fb2, 0x00e7ab9f, 0x00e99fb6, 0x00e99fb5,
+ /* f0 */ 0x00e9a08f, 0x00e9a08c, 0x00e9a0b8, 0x00e9a0a4,
+ /* f4 */ 0x00e9a0a1, 0x00e9a0b7, 0x00e9a0bd, 0x00e9a186,
+ /* f8 */ 0x00e9a18f, 0x00e9a18b, 0x00e9a1ab, 0x00e9a1af,
+ /* fc */ 0x00e9a1b0,
+
+ /*** Two byte table, leaf: e9xx - offset 0x01f00 ***/
+
+ /* 40 */ 0x00e9a1b1, 0x00e9a1b4, 0x00e9a1b3, 0x00e9a2aa,
+ /* 44 */ 0x00e9a2af, 0x00e9a2b1, 0x00e9a2b6, 0x00e9a384,
+ /* 48 */ 0x00e9a383, 0x00e9a386, 0x00e9a3a9, 0x00e9a3ab,
+ /* 4c */ 0x00e9a483, 0x00e9a489, 0x00e9a492, 0x00e9a494,
+ /* 50 */ 0x00e9a498, 0x00e9a4a1, 0x00e9a49d, 0x00e9a49e,
+ /* 54 */ 0x00e9a4a4, 0x00e9a4a0, 0x00e9a4ac, 0x00e9a4ae,
+ /* 58 */ 0x00e9a4bd, 0x00e9a4be, 0x00e9a582, 0x00e9a589,
+ /* 5c */ 0x00e9a585, 0x00e9a590, 0x00e9a58b, 0x00e9a591,
+ /* 60 */ 0x00e9a592, 0x00e9a58c, 0x00e9a595, 0x00e9a697,
+ /* 64 */ 0x00e9a698, 0x00e9a6a5, 0x00e9a6ad, 0x00e9a6ae,
+ /* 68 */ 0x00e9a6bc, 0x00e9a79f, 0x00e9a79b, 0x00e9a79d,
+ /* 6c */ 0x00e9a798, 0x00e9a791, 0x00e9a7ad, 0x00e9a7ae,
+ /* 70 */ 0x00e9a7b1, 0x00e9a7b2, 0x00e9a7bb, 0x00e9a7b8,
+ /* 74 */ 0x00e9a881, 0x00e9a88f, 0x00e9a885, 0x00e9a7a2,
+ /* 78 */ 0x00e9a899, 0x00e9a8ab, 0x00e9a8b7, 0x00e9a985,
+ /* 7c */ 0x00e9a982, 0x00e9a980, 0x00e9a983, 0x00000000,
+ /* 80 */ 0x00e9a8be, 0x00e9a995, 0x00e9a98d, 0x00e9a99b,
+ /* 84 */ 0x00e9a997, 0x00e9a99f, 0x00e9a9a2, 0x00e9a9a5,
+ /* 88 */ 0x00e9a9a4, 0x00e9a9a9, 0x00e9a9ab, 0x00e9a9aa,
+ /* 8c */ 0x00e9aaad, 0x00e9aab0, 0x00e9aabc, 0x00e9ab80,
+ /* 90 */ 0x00e9ab8f, 0x00e9ab91, 0x00e9ab93, 0x00e9ab94,
+ /* 94 */ 0x00e9ab9e, 0x00e9ab9f, 0x00e9aba2, 0x00e9aba3,
+ /* 98 */ 0x00e9aba6, 0x00e9abaf, 0x00e9abab, 0x00e9abae,
+ /* 9c */ 0x00e9abb4, 0x00e9abb1, 0x00e9abb7, 0x00e9abbb,
+ /* a0 */ 0x00e9ac86, 0x00e9ac98, 0x00e9ac9a, 0x00e9ac9f,
+ /* a4 */ 0x00e9aca2, 0x00e9aca3, 0x00e9aca5, 0x00e9aca7,
+ /* a8 */ 0x00e9aca8, 0x00e9aca9, 0x00e9acaa, 0x00e9acae,
+ /* ac */ 0x00e9acaf, 0x00e9acb2, 0x00e9ad84, 0x00e9ad83,
+ /* b0 */ 0x00e9ad8f, 0x00e9ad8d, 0x00e9ad8e, 0x00e9ad91,
+ /* b4 */ 0x00e9ad98, 0x00e9adb4, 0x00e9ae93, 0x00e9ae83,
+ /* b8 */ 0x00e9ae91, 0x00e9ae96, 0x00e9ae97, 0x00e9ae9f,
+ /* bc */ 0x00e9aea0, 0x00e9aea8, 0x00e9aeb4, 0x00e9af80,
+ /* c0 */ 0x00e9af8a, 0x00e9aeb9, 0x00e9af86, 0x00e9af8f,
+ /* c4 */ 0x00e9af91, 0x00e9af92, 0x00e9afa3, 0x00e9afa2,
+ /* c8 */ 0x00e9afa4, 0x00e9af94, 0x00e9afa1, 0x00e9b0ba,
+ /* cc */ 0x00e9afb2, 0x00e9afb1, 0x00e9afb0, 0x00e9b095,
+ /* d0 */ 0x00e9b094, 0x00e9b089, 0x00e9b093, 0x00e9b08c,
+ /* d4 */ 0x00e9b086, 0x00e9b088, 0x00e9b092, 0x00e9b08a,
+ /* d8 */ 0x00e9b084, 0x00e9b0ae, 0x00e9b09b, 0x00e9b0a5,
+ /* dc */ 0x00e9b0a4, 0x00e9b0a1, 0x00e9b0b0, 0x00e9b187,
+ /* e0 */ 0x00e9b0b2, 0x00e9b186, 0x00e9b0be, 0x00e9b19a,
+ /* e4 */ 0x00e9b1a0, 0x00e9b1a7, 0x00e9b1b6, 0x00e9b1b8,
+ /* e8 */ 0x00e9b3a7, 0x00e9b3ac, 0x00e9b3b0, 0x00e9b489,
+ /* ec */ 0x00e9b488, 0x00e9b3ab, 0x00e9b483, 0x00e9b486,
+ /* f0 */ 0x00e9b4aa, 0x00e9b4a6, 0x00e9b6af, 0x00e9b4a3,
+ /* f4 */ 0x00e9b49f, 0x00e9b584, 0x00e9b495, 0x00e9b492,
+ /* f8 */ 0x00e9b581, 0x00e9b4bf, 0x00e9b4be, 0x00e9b586,
+ /* fc */ 0x00e9b588,
+
+ /*** Two byte table, leaf: eaxx - offset 0x01fbd ***/
+
+ /* 40 */ 0x00e9b59d, 0x00e9b59e, 0x00e9b5a4, 0x00e9b591,
+ /* 44 */ 0x00e9b590, 0x00e9b599, 0x00e9b5b2, 0x00e9b689,
+ /* 48 */ 0x00e9b687, 0x00e9b6ab, 0x00e9b5af, 0x00e9b5ba,
+ /* 4c */ 0x00e9b69a, 0x00e9b6a4, 0x00e9b6a9, 0x00e9b6b2,
+ /* 50 */ 0x00e9b784, 0x00e9b781, 0x00e9b6bb, 0x00e9b6b8,
+ /* 54 */ 0x00e9b6ba, 0x00e9b786, 0x00e9b78f, 0x00e9b782,
+ /* 58 */ 0x00e9b799, 0x00e9b793, 0x00e9b7b8, 0x00e9b7a6,
+ /* 5c */ 0x00e9b7ad, 0x00e9b7af, 0x00e9b7bd, 0x00e9b89a,
+ /* 60 */ 0x00e9b89b, 0x00e9b89e, 0x00e9b9b5, 0x00e9b9b9,
+ /* 64 */ 0x00e9b9bd, 0x00e9ba81, 0x00e9ba88, 0x00e9ba8b,
+ /* 68 */ 0x00e9ba8c, 0x00e9ba92, 0x00e9ba95, 0x00e9ba91,
+ /* 6c */ 0x00e9ba9d, 0x00e9baa5, 0x00e9baa9, 0x00e9bab8,
+ /* 70 */ 0x00e9baaa, 0x00e9baad, 0x00e99da1, 0x00e9bb8c,
+ /* 74 */ 0x00e9bb8e, 0x00e9bb8f, 0x00e9bb90, 0x00e9bb94,
+ /* 78 */ 0x00e9bb9c, 0x00e9bb9e, 0x00e9bb9d, 0x00e9bba0,
+ /* 7c */ 0x00e9bba5, 0x00e9bba8, 0x00e9bbaf, 0x00000000,
+ /* 80 */ 0x00e9bbb4, 0x00e9bbb6, 0x00e9bbb7, 0x00e9bbb9,
+ /* 84 */ 0x00e9bbbb, 0x00e9bbbc, 0x00e9bbbd, 0x00e9bc87,
+ /* 88 */ 0x00e9bc88, 0x00e79ab7, 0x00e9bc95, 0x00e9bca1,
+ /* 8c */ 0x00e9bcac, 0x00e9bcbe, 0x00e9bd8a, 0x00e9bd92,
+ /* 90 */ 0x00e9bd94, 0x00e9bda3, 0x00e9bd9f, 0x00e9bda0,
+ /* 94 */ 0x00e9bda1, 0x00e9bda6, 0x00e9bda7, 0x00e9bdac,
+ /* 98 */ 0x00e9bdaa, 0x00e9bdb7, 0x00e9bdb2, 0x00e9bdb6,
+ /* 9c */ 0x00e9be95, 0x00e9be9c, 0x00e9bea0, 0x00e5a0af,
+ /* a0 */ 0x00e6a787, 0x00e98199, 0x00e791a4, 0x00e5879c,
+ /* a4 */ 0x00e78699, 0x00e59993, 0x00e5b7a2, 0x00e5b894,
+ /* a8 */ 0x00e5b898, 0x00e5b998, 0x00e5b99e, 0x00e5babe,
+ /* ac */ 0x00efa4a8, 0x00e5bb8b, 0x00e5bbb9, 0x00e5bc80,
+ /* b0 */ 0x00e5bc82, 0x00e5bc87, 0x00e5bc9d, 0x00e5bca3,
+ /* b4 */ 0x00e5bcb4, 0x00e5bcb6, 0x00e5bcbd, 0x00e5bd80,
+ /* b8 */ 0x00e5bd85, 0x00e5bd94, 0x00e5bd98, 0x00e5bda4,
+ /* bc */ 0x00e5bda7, 0x00e5bdbd, 0x00e5be89, 0x00e5be9c,
+ /* c0 */ 0x00e5bea7, 0x00e5beaf, 0x00e5beb5, 0x00e5beb7,
+ /* c4 */ 0x00e5bf89, 0x00e5bf9e, 0x00e5bfa1, 0x00e5bfa9,
+ /* c8 */ 0x00e6808d, 0x00e68094, 0x00e68098, 0x00e680b3,
+ /* cc */ 0x00e680b5, 0x00e68187, 0x00efa8bd, 0x00e6829d,
+ /* d0 */ 0x00e6829e, 0x00e6838b, 0x00e68394, 0x00e68395,
+ /* d4 */ 0x00e6839d, 0x00e683b8, 0x00e6849c, 0x00e684ab,
+ /* d8 */ 0x00e684b0, 0x00e684b7, 0x00efa8be, 0x00e6868d,
+ /* dc */ 0x00efa8bf, 0x00e686bc, 0x00e686b9, 0x00efa980,
+ /* e0 */ 0x00e688a2, 0x00e688be, 0x00e68983, 0x00e68996,
+ /* e4 */ 0x00e6899a, 0x00e689af, 0x00e68a85, 0x00e68b84,
+ /* e8 */ 0x00e68b96, 0x00e68bbc, 0x00e68c8a, 0x00e68c98,
+ /* ec */ 0x00e68cb9, 0x00e68d83, 0x00e68da5, 0x00e68dbc,
+ /* f0 */ 0x00e68fa5, 0x00e68fad, 0x00e68fb5, 0x00e69090,
+ /* f4 */ 0x00e69094, 0x00e690a2, 0x00e691b9, 0x00e69191,
+ /* f8 */ 0x00e691a0, 0x00e691ad, 0x00e6938e, 0x00e692be,
+ /* fc */ 0x00e692bf,
+
+ /*** Two byte table, leaf: ebxx - offset 0x0207a ***/
+
+ /* 40 */ 0x00e69384, 0x00e6938a, 0x00e69390, 0x00e693b7,
+ /* 44 */ 0x00e693bb, 0x00e694a2, 0x00e694a9, 0x00efa981,
+ /* 48 */ 0x00e695a7, 0x00e6969d, 0x00efa982, 0x00e69880,
+ /* 4c */ 0x00e69889, 0x00e69895, 0x00e6989e, 0x00e698ba,
+ /* 50 */ 0x00e698a2, 0x00e698a4, 0x00e698ab, 0x00e698b0,
+ /* 54 */ 0x00e698b1, 0x00e698b3, 0x00e69bbb, 0x00e69988,
+ /* 58 */ 0x00e6998c, 0xf0a38784, 0x00e69999, 0x00e6999a,
+ /* 5c */ 0x00e699a1, 0x00e699a5, 0x00e699b3, 0x00e699b7,
+ /* 60 */ 0x00e699b8, 0x00e69a8d, 0x00efa983, 0x00e69aa0,
+ /* 64 */ 0x00e69ab2, 0x00e69abb, 0x00e69b86, 0x00e69b88,
+ /* 68 */ 0x00e3aca2, 0x00e69b9b, 0x00e69ba8, 0x00e69bba,
+ /* 6c */ 0x00e69c93, 0x00efa4a9, 0x00e69cb3, 0x00e69da6,
+ /* 70 */ 0x00e69d87, 0x00e69d88, 0x00e69dbb, 0x00e69e81,
+ /* 74 */ 0x00e69e93, 0x00e69e98, 0x00e69e9b, 0x00e69ebb,
+ /* 78 */ 0x00e69fb9, 0x00e69f80, 0x00e69f97, 0x00e69fbc,
+ /* 7c */ 0x00e6a081, 0x00e6a192, 0x00e6a09d, 0x00000000,
+ /* 80 */ 0x00e6a0ac, 0x00e6a0b1, 0x00e6a19b, 0x00e6a1b2,
+ /* 84 */ 0x00e6a1b5, 0x00efa984, 0x00e6a2a3, 0x00e6a2a5,
+ /* 88 */ 0x00e6a2b2, 0x00e6a388, 0x00e6a390, 0x00e6a3a8,
+ /* 8c */ 0x00e6a3ad, 0x00e6a3b0, 0x00e6a3b1, 0x00e6a3bc,
+ /* 90 */ 0x00e6a48a, 0x00e6a589, 0xf0a39784, 0x00e6a4b5,
+ /* 94 */ 0x00e6a582, 0x00e6a597, 0x00e6a5a3, 0x00e6a5a4,
+ /* 98 */ 0x00e6a5a8, 0x00e6a680, 0x00efa894, 0x00e6a6a5,
+ /* 9c */ 0x00e6a6ad, 0x00e6a78f, 0x00e3aeb6, 0x00e3af83,
+ /* a0 */ 0x00e6a7a2, 0x00e6a7a9, 0x00e6a7aa, 0x00e6a7b5,
+ /* a4 */ 0x00e6a7b6, 0x00e6a88f, 0x00e6a895, 0xf0a39cbf,
+ /* a8 */ 0x00e6a8bb, 0x00e6a8be, 0x00e6a985, 0x00e6a990,
+ /* ac */ 0x00e6a996, 0x00e6a99b, 0x00e6a9ab, 0x00e6a9b3,
+ /* b0 */ 0xf0a39da3, 0x00e6aa89, 0x00e6aa94, 0x00e6aa9d,
+ /* b4 */ 0x00e6aa9e, 0x00e6aaa5, 0x00e6aba4, 0x00e6aba7,
+ /* b8 */ 0x00e3b08f, 0x00efa49d, 0x00e6ac9b, 0x00e6ac9e,
+ /* bc */ 0x00e6acac, 0x00e6acb5, 0x00e6ad86, 0x00e6ad96,
+ /* c0 */ 0x00e6ada0, 0x00e6ada5, 0x00e6ada7, 0x00e6adb7,
+ /* c4 */ 0x00e6ae82, 0x00e6aea9, 0x00e6aead, 0x00efa5b0,
+ /* c8 */ 0x00e6af8f, 0x00e6af96, 0x00e6af97, 0x00e6afbf,
+ /* cc */ 0x00e6b085, 0x00e6b090, 0x00e6b0b3, 0x00e6b199,
+ /* d0 */ 0x00e6b19c, 0x00e6b2aa, 0x00e6b1b4, 0x00e6b1b6,
+ /* d4 */ 0x00e6b285, 0x00e6b286, 0x00e6b298, 0x00e6b29c,
+ /* d8 */ 0x00e6b3bb, 0x00e6b386, 0x00e6b394, 0x00e6b3a0,
+ /* dc */ 0x00e6b3ab, 0x00e6b3ae, 0xf0a3b3be, 0x00e6b484,
+ /* e0 */ 0x00e6b48e, 0x00e6b4ae, 0x00e6b4b1, 0x00e6b4b9,
+ /* e4 */ 0x00e6b4bf, 0x00e6b598, 0x00e6b5a5, 0x00efa985,
+ /* e8 */ 0x00e6b682, 0x00e6b687, 0x00e6b689, 0x00e6b694,
+ /* ec */ 0x00e6b6aa, 0x00e6b6ac, 0x00e6b6bf, 0x00e6b784,
+ /* f0 */ 0x00e6b796, 0x00e6b79a, 0x00e6b79b, 0x00e6b79d,
+ /* f4 */ 0x00e6b7bc, 0x00efa986, 0x00e6b8b4, 0x00e6b984,
+ /* f8 */ 0x00e6b99c, 0x00e6b99e, 0x00e6baab, 0x00e6bab1,
+ /* fc */ 0x00e6bb81,
+
+ /*** Two byte table, leaf: ecxx - offset 0x02137 ***/
+
+ /* 40 */ 0x00e6bb87, 0x00e6bb8e, 0x00e6bc90, 0x00e6bc9a,
+ /* 44 */ 0x00efa987, 0x00e6bcaa, 0x00e6bcaf, 0x00e6bcb3,
+ /* 48 */ 0x00e6bd91, 0x00e6bd99, 0x00e6bd9e, 0x00e6bda1,
+ /* 4c */ 0x00e6bda2, 0x00e6bdbe, 0x00e6be88, 0x00e6be8c,
+ /* 50 */ 0x00e6be8d, 0x00e6be94, 0x00e6bea0, 0x00e6bea7,
+ /* 54 */ 0x00e6beb6, 0x00e6bebc, 0x00e6bf87, 0x00e6bf8a,
+ /* 58 */ 0x00e6bfb9, 0x00e6bfb0, 0x00e6bfb5, 0x00e78085,
+ /* 5c */ 0x00e78086, 0x00e780a8, 0x00e7818a, 0x00e7819d,
+ /* 60 */ 0x00e7819e, 0x00e7818e, 0x00e781a4, 0x00e781b5,
+ /* 64 */ 0x00e78285, 0x00e782a4, 0x00e782ab, 0x00e782b7,
+ /* 68 */ 0x00e78394, 0x00e78398, 0x00e783a4, 0x00e7848f,
+ /* 6c */ 0x00e784ab, 0x00e7849e, 0x00e784a0, 0x00e784ae,
+ /* 70 */ 0x00e784b0, 0x00e78586, 0x00e78587, 0x00e78591,
+ /* 74 */ 0x00efa988, 0x00e78592, 0x00e7859c, 0x00e785a0,
+ /* 78 */ 0x00e785a8, 0x00efa895, 0x00e78685, 0x00e78687,
+ /* 7c */ 0x00e78692, 0x00e78781, 0x00e786ba, 0x00000000,
+ /* 80 */ 0x00e78784, 0x00e787be, 0x00e78880, 0x00e78895,
+ /* 84 */ 0x00e78995, 0x00e78996, 0x00e3b8bf, 0x00e78a8d,
+ /* 88 */ 0x00e78a9b, 0x00e78abe, 0x00e78b80, 0x00e78bbb,
+ /* 8c */ 0xf0a49fb1, 0x00e78ca7, 0x00e78ca8, 0x00efa896,
+ /* 90 */ 0x00e78d90, 0x00e78da6, 0x00e78dbc, 0x00e78e95,
+ /* 94 */ 0x00e78e9f, 0x00e78ea0, 0x00e78ea2, 0x00e78ea6,
+ /* 98 */ 0x00e78eab, 0x00e78f89, 0x00e78f8f, 0x00e78f96,
+ /* 9c */ 0x00e78f99, 0x00e78fa3, 0x00e78fa9, 0x00e79087,
+ /* a0 */ 0x00e7908a, 0x00e7909a, 0x00e7909b, 0x00efa98a,
+ /* a4 */ 0x00e790a6, 0x00e790a8, 0x00e790aa, 0x00e790ab,
+ /* a8 */ 0x00e790ac, 0x00e790ae, 0x00e790af, 0x00e790b0,
+ /* ac */ 0x00e79184, 0x00e79186, 0x00e79187, 0x00e7918b,
+ /* b0 */ 0x00e79197, 0x00e791a2, 0x00e791ab, 0x00e791ad,
+ /* b4 */ 0x00e79286, 0x00e79287, 0x00e79289, 0x00e79298,
+ /* b8 */ 0x00e7929c, 0x00e7929f, 0x00e792a3, 0x00e79290,
+ /* bc */ 0x00e792a6, 0x00e792a8, 0x00e792a9, 0x00e792b5,
+ /* c0 */ 0x00e792bf, 0x00e79388, 0x00e79389, 0x00e7939a,
+ /* c4 */ 0x00e793bf, 0x00e79481, 0x00e79497, 0x00e794af,
+ /* c8 */ 0x00e795af, 0x00e795b9, 0x00e79692, 0x00e3bdb2,
+ /* cc */ 0x00e7978e, 0x00e797a4, 0x00e79880, 0x00e79882,
+ /* d0 */ 0x00e79888, 0x00e79895, 0x00e79896, 0x00e79899,
+ /* d4 */ 0x00e7989e, 0x00e798ad, 0x00e798b5, 0x00e79983,
+ /* d8 */ 0x00e7998b, 0x00e799a4, 0x00e799a5, 0x00e799ad,
+ /* dc */ 0x00e799af, 0x00e799b1, 0x00e79a81, 0x00e79a9b,
+ /* e0 */ 0x00e79a9d, 0x00e79a9e, 0x00e79aa6, 0x00e79aaa,
+ /* e4 */ 0x00e79ab6, 0x00e79b85, 0x00e79b8c, 0x00e79b8e,
+ /* e8 */ 0x00e79b94, 0x00e79ba6, 0x00e79bb1, 0x00e79bbc,
+ /* ec */ 0x00e79c8a, 0x00e79c99, 0x00e79cb4, 0x00e79cb6,
+ /* f0 */ 0x00e79d86, 0x00e79d8d, 0x00e79d8e, 0x00e79d9c,
+ /* f4 */ 0x00e79d9f, 0x00e79da2, 0x00e79dba, 0x00e79e80,
+ /* f8 */ 0x00e79e94, 0x00e79eaa, 0x00e79fa0, 0x00e7a0ad,
+ /* fc */ 0xf0a5928e,
+
+ /*** Two byte table, leaf: edxx - offset 0x021f4 ***/
+
+ /* 40 */ 0x00e7a183, 0x00e7a18e, 0x00e7a18f, 0x00e7a191,
+ /* 44 */ 0x00e7a1a8, 0x00e7a1ae, 0x00efa98b, 0x00e7a2b0,
+ /* 48 */ 0xf0a5948e, 0x00e7a2ad, 0x00e7a3a4, 0x00e7a3b2,
+ /* 4c */ 0x00e7a480, 0x00e7a3b7, 0x00e7a49c, 0x00e7a4ae,
+ /* 50 */ 0x00e7a4b1, 0x00e7a4b4, 0x00efa98c, 0x00efa98d,
+ /* 54 */ 0x00e7a585, 0x00e7a586, 0x00efa98e, 0x00efa98f,
+ /* 58 */ 0x00efa990, 0x00e7a59c, 0x00efa991, 0x00efa899,
+ /* 5c */ 0x00efa89a, 0x00e7a5b9, 0x00efa992, 0x00efa993,
+ /* 60 */ 0x00efa89b, 0x00e7a698, 0x00e7a6b1, 0x00e7a6b8,
+ /* 64 */ 0x00e7a788, 0x00e7a78a, 0xf0a59db1, 0x00e7a794,
+ /* 68 */ 0x00e7a79e, 0x00e7a7ab, 0x00e7a7ad, 0x00e7a883,
+ /* 6c */ 0x00efa994, 0x00e7a8b9, 0x00e7a99d, 0x00e7a9ad,
+ /* 70 */ 0x00efa995, 0x00e7aa85, 0x00e7aaa0, 0xf0a5a784,
+ /* 74 */ 0x00e7aab3, 0x00e7aabb, 0x00e7ab8e, 0x00e7abab,
+ /* 78 */ 0x00e7abbd, 0x00e7ac92, 0x00e7acad, 0x00e7acbb,
+ /* 7c */ 0x00e7ad87, 0x00e7ad8e, 0x00e7ada0, 0x00000000,
+ /* 80 */ 0x00e7adad, 0x00e7adaf, 0x00e7adb2, 0x00e7ae9e,
+ /* 84 */ 0x00efa996, 0x00e7af97, 0x00e7af99, 0x00e7b081,
+ /* 88 */ 0x00e7b0b1, 0x00e7b09e, 0x00e7b0a0, 0x00e7b0b3,
+ /* 8c */ 0x00e7b0b6, 0x00e489a4, 0xf0a5b6a1, 0x00e7b199,
+ /* 90 */ 0x00e7b1ad, 0x00e7b1b9, 0x00e7b28f, 0x00e7b294,
+ /* 94 */ 0x00e7b2a0, 0x00e7b2bc, 0x00e7b395, 0x00e7b399,
+ /* 98 */ 0x00e7b39d, 0x00e7b487, 0x00e7b488, 0x00e7b493,
+ /* 9c */ 0x00e7b49d, 0x00e7b4a3, 0x00e7b4b1, 0x00e7b581,
+ /* a0 */ 0x00e7b588, 0x00e7b593, 0x00e7b59c, 0x00e7b5ba,
+ /* a4 */ 0x00e7b683, 0x00e7b68b, 0x00e7b6a0, 0x00e7b6a6,
+ /* a8 */ 0x00e7b782, 0x00e7b78c, 0x00e7b796, 0x00e7b7a3,
+ /* ac */ 0x00efa997, 0x00e7b8a8, 0x00e7b888, 0x00e7b891,
+ /* b0 */ 0x00e7b895, 0x00efa999, 0x00e7b987, 0x00e7b992,
+ /* b4 */ 0x00e7b9a1, 0x00e7ba8a, 0x00e7ba8d, 0x00e7bd87,
+ /* b8 */ 0x00efa99a, 0x00e7be91, 0x00e7be97, 0x00e7bebf,
+ /* bc */ 0x00e7bf8e, 0x00e7bf9b, 0x00e7bf9f, 0x00e7bfac,
+ /* c0 */ 0x00e7bfae, 0x00e7bfba, 0x00efa99b, 0x00e88094,
+ /* c4 */ 0x00e880a6, 0x00e880b5, 0x00e880b7, 0x00e880bc,
+ /* c8 */ 0x00e8838a, 0x00e88397, 0x00e883a0, 0x00e883b3,
+ /* cc */ 0x00e88498, 0x00e8858a, 0x00e885a0, 0x00e885a7,
+ /* d0 */ 0x00e885a8, 0x00e885ad, 0x00e886bb, 0x00e8878a,
+ /* d4 */ 0x00e8878f, 0x00e88797, 0x00efa99c, 0x00e49193,
+ /* d8 */ 0x00e4919b, 0x00e889a0, 0x00e889b4, 0xf0a6abbf,
+ /* dc */ 0x00e88a8e, 0x00e88aa1, 0x00e88aa3, 0x00e88aa4,
+ /* e0 */ 0x00e88aa9, 0x00e88aae, 0x00e88ab7, 0x00e88abe,
+ /* e4 */ 0x00e88abf, 0x00e88b86, 0x00e88b95, 0x00e88bbd,
+ /* e8 */ 0x00e88bbe, 0x00e88c80, 0x00e88c81, 0x00e88da2,
+ /* ec */ 0x00e88ca2, 0x00e88cad, 0x00e88cba, 0x00e88d83,
+ /* f0 */ 0x00e88d87, 0x00e88d91, 0x00e88d95, 0x00e88dbd,
+ /* f4 */ 0x00e88e86, 0x00e88e92, 0x00e88e98, 0x00e88ea7,
+ /* f8 */ 0x00e88ea9, 0x00e88ebf, 0x00e88f80, 0x00e88f87,
+ /* fc */ 0x00e88f8f,
+
+ /*** Two byte table, leaf: eexx - offset 0x022b1 ***/
+
+ /* 40 */ 0x00e88f91, 0x00e88fa1, 0x00e88faa, 0x00e89081,
+ /* 44 */ 0x00e89086, 0x00e8908a, 0x00efa99f, 0x00e89188,
+ /* 48 */ 0x00e8919f, 0x00e891b0, 0x00e891b3, 0x00e89285,
+ /* 4c */ 0x00e8929e, 0x00e892af, 0x00e892b4, 0x00e892ba,
+ /* 50 */ 0x00e89380, 0x00e89382, 0xf0a6b980, 0x00e894b2,
+ /* 54 */ 0x00e8949e, 0x00e894a3, 0x00e894af, 0x00e89599,
+ /* 58 */ 0x00e895a4, 0x00efa89f, 0x00e896ad, 0x00e895ba,
+ /* 5c */ 0x00e8968c, 0x00e8968f, 0x00e896a2, 0x00e896b0,
+ /* 60 */ 0x00e8978b, 0x00e8978e, 0x00e897ad, 0x00e89892,
+ /* 64 */ 0x00e897bf, 0x00e89884, 0x00e89885, 0x00e89890,
+ /* 68 */ 0xf0a783b4, 0x00e89898, 0x00e898a9, 0x00e898b8,
+ /* 6c */ 0x00e89997, 0x00e8999b, 0x00efa4b6, 0x00e899a2,
+ /* 70 */ 0x00e4969d, 0x00e899ac, 0x00e899b5, 0x00e89a98,
+ /* 74 */ 0x00e89ab8, 0x00e89bba, 0x00e89bbc, 0x00e89bbd,
+ /* 78 */ 0x00e89c8b, 0x00e89db1, 0x00e89e87, 0x00e89e88,
+ /* 7c */ 0x00e89eac, 0x00e89ead, 0x00e89eb5, 0x00000000,
+ /* 80 */ 0x00e497aa, 0x00e89f96, 0x00e89fac, 0x00e8a086,
+ /* 84 */ 0x00e8a08a, 0x00e8a090, 0x00e8a094, 0x00e8a09f,
+ /* 88 */ 0x00e8a298, 0x00e8a2aa, 0x00e8a38a, 0x00e8a38e,
+ /* 8c */ 0xf0a79a84, 0x00e8a3b5, 0x00e8a49c, 0x00efa9a0,
+ /* 90 */ 0x00e8a498, 0x00e8a499, 0x00e8a49a, 0x00e8a4a7,
+ /* 94 */ 0x00e8a4b0, 0x00e8a4b2, 0x00e8a4b9, 0x00e8a580,
+ /* 98 */ 0x00e8a694, 0x00efa9a1, 0x00e8a794, 0x00e8a7a5,
+ /* 9c */ 0x00e8a7b6, 0x00e8a892, 0x00e8a895, 0x00e8a8a2,
+ /* a0 */ 0x00e8a8b7, 0x00e8a987, 0x00e8a98e, 0x00e8a99d,
+ /* a4 */ 0x00e8a9a1, 0x00e8a9b5, 0x00e8a9b9, 0x00e8aaa7,
+ /* a8 */ 0x00e8ab90, 0x00e8ab9f, 0x00e8abb4, 0x00e8abb6,
+ /* ac */ 0x00efa8a2, 0x00efa9a2, 0x00efa9a3, 0x00e8ad86,
+ /* b0 */ 0x00e8ad94, 0x00e8ad99, 0x00e8ada9, 0x00e8ae9d,
+ /* b4 */ 0x00e8b189, 0x00e8b1a8, 0x00efa9a4, 0x00e8b3a1,
+ /* b8 */ 0x00e8b3b4, 0x00e8b3b8, 0x00e8b3be, 0x00efa9a5,
+ /* bc */ 0x00e8b492, 0x00e8b49b, 0x00e8b6af, 0x00e8b78e,
+ /* c0 */ 0x00e8b791, 0x00e8b797, 0x00e8b8a0, 0x00e8b8a3,
+ /* c4 */ 0x00e8b8bd, 0x00e8b9b0, 0x00e8b9bb, 0xf0a889b7,
+ /* c8 */ 0x00e8bb80, 0x00e4a184, 0x00e8bbba, 0x00e8bc9e,
+ /* cc */ 0x00e8bcad, 0x00e8bcb6, 0x00e8bd94, 0xf0a88f8d,
+ /* d0 */ 0x00e8bea6, 0x00e8beb5, 0x00e8bfa4, 0x00e8bfa8,
+ /* d4 */ 0x00e8bfae, 0x00e98088, 0x00e980ad, 0x00efa9a7,
+ /* d8 */ 0x00e98288, 0x00e98295, 0x00e98297, 0x00e98299,
+ /* dc */ 0x00e9829b, 0x00e982a2, 0x00e982b3, 0x00e982be,
+ /* e0 */ 0x00e98384, 0x00e98385, 0x00e98387, 0x00e98397,
+ /* e4 */ 0x00e9839d, 0x00e9839e, 0x00e983af, 0x00e983b4,
+ /* e8 */ 0x00efa8a6, 0x00e98494, 0x00e98495, 0x00e98496,
+ /* ec */ 0x00e984a2, 0x00e984a3, 0x00e984a7, 0x00e984af,
+ /* f0 */ 0x00e984b1, 0x00e984b4, 0x00e984bd, 0x00e98588,
+ /* f4 */ 0x00e9859b, 0x00e98683, 0x00e9869e, 0x00e986ac,
+ /* f8 */ 0x00e986b1, 0x00e986bc, 0x00e98797, 0x00e987bb,
+ /* fc */ 0x00e987a4,
+
+ /*** Two byte table, leaf: efxx - offset 0x0236e ***/
+
+ /* 40 */ 0x00e987a5, 0x00e987ad, 0x00e987b1, 0x00e98887,
+ /* 44 */ 0x00e98890, 0x00e988b8, 0x00e988b9, 0x00e988ba,
+ /* 48 */ 0x00e988bc, 0x00e98980, 0x00e98983, 0x00e9898f,
+ /* 4c */ 0x00e989b8, 0x00e98a88, 0x00e98b82, 0x00e98b8b,
+ /* 50 */ 0x00e98b8c, 0x00e98b93, 0x00e98ba0, 0x00e98bbf,
+ /* 54 */ 0x00e98c84, 0x00e98c9f, 0x00e98ca1, 0x00e98ca5,
+ /* 58 */ 0x00e98d88, 0x00e98d89, 0x00e98d8a, 0x00e98da4,
+ /* 5c */ 0x00e98da5, 0x00e98daa, 0x00e98db0, 0x00e98e9b,
+ /* 60 */ 0x00e98ea3, 0x00e98eba, 0x00e98f86, 0x00e98f9e,
+ /* 64 */ 0x00e98f9f, 0x00e99084, 0x00e98fbd, 0x00e990b3,
+ /* 68 */ 0x00e9918a, 0x00e991a3, 0x00e991ab, 0x00e991b1,
+ /* 6c */ 0x00e991b2, 0x00e9968e, 0x00e9969f, 0x00e996a6,
+ /* 70 */ 0x00e996a9, 0x00e996ac, 0x00e996b6, 0x00e996bd,
+ /* 74 */ 0x00e9978b, 0x00e99790, 0x00e99793, 0x00e4a6b0,
+ /* 78 */ 0x00e9979a, 0x00e9979e, 0x00e99998, 0x00e99a84,
+ /* 7c */ 0x00efa79c, 0x00e99a9d, 0x00e99aa4, 0x00000000,
+ /* 80 */ 0x00e99aa5, 0x00e99b92, 0x00e99b9e, 0x00efa9a8,
+ /* 84 */ 0x00e99ba9, 0x00e99baf, 0x00e99cb3, 0x00e99cbb,
+ /* 88 */ 0x00e99d8d, 0x00e99d8e, 0x00e99d8f, 0x00e99d9a,
+ /* 8c */ 0x00e99dae, 0x00e99db3, 0x00e99e95, 0x00e99eae,
+ /* 90 */ 0x00e99eba, 0x00e99f81, 0x00e99f89, 0x00e99f9e,
+ /* 94 */ 0x00e99f9b, 0x00e99fb4, 0x00efa9a9, 0x00e9a08a,
+ /* 98 */ 0x00e9a09e, 0x00e9a0ab, 0x00e9a0b0, 0x00efa9aa,
+ /* 9c */ 0x00e9a192, 0x00e9a193, 0x00e9a196, 0x00e9a197,
+ /* a0 */ 0x00e9a199, 0x00e9a19a, 0x00efa790, 0x00e9a1a5,
+ /* a4 */ 0x00e9a1ac, 0x00e9a2ba, 0x00e9a388, 0x00e9a3a7,
+ /* a8 */ 0x00e9a598, 0x00e9a69e, 0x00e9a882, 0x00e9a883,
+ /* ac */ 0x00e9a8a4, 0x00e9a8ad, 0x00e9a8ae, 0x00e9a8b8,
+ /* b0 */ 0x00e9a98a, 0x00e9a98e, 0x00e9a992, 0x00e9aab6,
+ /* b4 */ 0x00e9ab81, 0x00e9ab83, 0x00e9ab8e, 0x00e9ab96,
+ /* b8 */ 0x00e9abb9, 0x00e9ac82, 0x00e9ac88, 0x00e9aca0,
+ /* bc */ 0x00e4b097, 0x00e9acad, 0x00e9ad9e, 0x00e9adb9,
+ /* c0 */ 0x00e9ada6, 0x00e9adb2, 0x00e9adb5, 0x00e9ae84,
+ /* c4 */ 0x00e9ae8a, 0x00e9ae8f, 0x00e9ae9e, 0x00e9aea7,
+ /* c8 */ 0x00e9af81, 0x00e9af8e, 0x00e9afa5, 0x00e9afb8,
+ /* cc */ 0x00e9afbd, 0x00e9b080, 0x00e9b0a3, 0x00e9b181,
+ /* d0 */ 0x00e9b18f, 0x00e9b190, 0x00e9b193, 0x00e9b1a3,
+ /* d4 */ 0x00e9b1a5, 0x00e9b1b7, 0x00e9b49d, 0x00e9b49e,
+ /* d8 */ 0x00e9b583, 0x00e9b587, 0x00e9b592, 0x00e9b5a3,
+ /* dc */ 0x00e9b5b0, 0x00e9b5bc, 0x00e9b68a, 0x00e9b696,
+ /* e0 */ 0x00e9b780, 0x00e9b6ac, 0x00e9b6bc, 0x00e9b797,
+ /* e4 */ 0xf0aa8690, 0x00e9b7a7, 0x00e9b887, 0x00e9b895,
+ /* e8 */ 0x00e9b9bc, 0x00e9ba9e, 0x00e9baa4, 0x00e9baac,
+ /* ec */ 0x00e9baaf, 0x00e9bab4, 0x00e9bab5, 0x00e9bb83,
+ /* f0 */ 0x00e9bb91, 0x00e9bc90, 0x00e9bcb9, 0x00e9bd97,
+ /* f4 */ 0x00e9be90, 0x00e9be94, 0x00e9be97, 0x00e9bea2,
+ /* f8 */ 0x00e5a7b8, 0x00e5b19b, 0x00e5b9b7, 0x00e798a6,
+ /* fc */ 0x00e7b9ab,
+
+ /*** Two byte table, leaf: f0xx - offset 0x0242b ***/
+
+ /* 40 */ 0xf0a08289, 0x00e4b882, 0x00e4b88f, 0x00e4b892,
+ /* 44 */ 0x00e4b8a9, 0x00e4b8ab, 0x00e4b8ae, 0x00e4b980,
+ /* 48 */ 0x00e4b987, 0x00e4b988, 0xf0a082a2, 0x00e4b991,
+ /* 4c */ 0x00e39086, 0xf0a082a4, 0x00e4b99a, 0x00e4b9a9,
+ /* 50 */ 0x00e4ba9d, 0x00e390ac, 0x00e390ae, 0x00e4bab9,
+ /* 54 */ 0x00e4babb, 0xf0a086a2, 0x00e4babc, 0x00e4bb83,
+ /* 58 */ 0x00e4bb88, 0x00e4bb90, 0x00e4bbab, 0x00e4bb9a,
+ /* 5c */ 0x00e4bbb1, 0x00e4bbb5, 0x00e4bc80, 0x00e4bc96,
+ /* 60 */ 0x00e4bda4, 0x00e4bcb7, 0x00e4bcbe, 0x00e4bd94,
+ /* 64 */ 0x00e4bd98, 0xf0a08893, 0x00e4bdb7, 0x00e4bdb8,
+ /* 68 */ 0x00e4bdba, 0x00e4bdbd, 0x00e4be82, 0x00e4be85,
+ /* 6c */ 0x00e4be92, 0x00e4be9a, 0x00e4bfa6, 0x00e4beb2,
+ /* 70 */ 0x00e4bebe, 0x00e4bf85, 0x00e4bf8b, 0x00e4bf8f,
+ /* 74 */ 0x00e4bf92, 0x00e391aa, 0x00e4bfb2, 0x00e58080,
+ /* 78 */ 0x00e58090, 0x00e58093, 0x00e5809c, 0x00e5809e,
+ /* 7c */ 0x00e580a2, 0x00e391a8, 0x00e58182, 0x00000000,
+ /* 80 */ 0x00e58186, 0x00e5818e, 0x00e58193, 0x00e58197,
+ /* 84 */ 0x00e581a3, 0x00e581a6, 0x00e581aa, 0x00e581b0,
+ /* 88 */ 0x00e582a3, 0x00e58288, 0x00e58292, 0x00e58293,
+ /* 8c */ 0x00e58295, 0x00e58296, 0x00e5829c, 0x00e582aa,
+ /* 90 */ 0xf0a08cab, 0x00e582b1, 0x00e582ba, 0x00e582bb,
+ /* 94 */ 0x00e58384, 0x00e58387, 0x00e583b3, 0xf0a08e81,
+ /* 98 */ 0x00e5838e, 0xf0a08db1, 0x00e58394, 0x00e58399,
+ /* 9c */ 0x00e583a1, 0x00e583a9, 0x00e39292, 0x00e5ae96,
+ /* a0 */ 0x00e5aeac, 0x00e39da1, 0x00e5af80, 0x00e39da2,
+ /* a4 */ 0x00e5af8e, 0x00e5af96, 0x00e39dac, 0x00e39dab,
+ /* a8 */ 0x00e5afb1, 0x00e5afbd, 0x00e39db5, 0x00e5b083,
+ /* ac */ 0x00e5b0a9, 0x00e5b0b0, 0xf0a1b196, 0x00e5b19f,
+ /* b0 */ 0x00e5b1a3, 0x00e5b1a7, 0x00e5b1a8, 0x00e5b1a9,
+ /* b4 */ 0x00e5b1b0, 0xf0a1b4ad, 0xf0a1b585, 0x00e5b1bc,
+ /* b8 */ 0xf0a1b5b8, 0xf0a1b5a2, 0x00e5b288, 0x00e5b28a,
+ /* bc */ 0x00e39f81, 0xf0a1b6a1, 0xf0a1b69c, 0x00e5b2a0,
+ /* c0 */ 0x00e5b2a2, 0x00e5b2a6, 0x00e5b2a7, 0xf0a1b692,
+ /* c4 */ 0x00e5b2ad, 0x00e5b2b5, 0xf0a1b6b7, 0x00e5b389,
+ /* c8 */ 0xf0a1b7a0, 0xf0a1b8b3, 0x00e5b486, 0x00e5b490,
+ /* cc */ 0x00e5b4ab, 0x00e5b49d, 0x00e5b4a0, 0x00e5b4a4,
+ /* d0 */ 0x00e5b4a6, 0x00e5b4b1, 0x00e5b4b9, 0x00e5b582,
+ /* d4 */ 0x00e39fa8, 0x00e5b5a1, 0x00e5b5aa, 0x00e39fb4,
+ /* d8 */ 0x00e5b5b0, 0xf0a1bc9e, 0x00e39fbd, 0x00e5b688,
+ /* dc */ 0x00e3a080, 0x00e5b692, 0x00e5b694, 0x00e5b697,
+ /* e0 */ 0x00e5b699, 0x00e5b6b0, 0x00e5b6b2, 0x00e5b6b4,
+ /* e4 */ 0xf0a1bdb6, 0x00e5b6b9, 0x00e5b791, 0x00e5b797,
+ /* e8 */ 0x00e5b798, 0x00e5b7a0, 0xf0a1bfba, 0x00e5b7a4,
+ /* ec */ 0x00e5b7a9, 0x00e3a0af, 0x00e5b880, 0x00e3a0b6,
+ /* f0 */ 0x00e5b892, 0x00e5b895, 0x00e3a180, 0x00e5b89f,
+ /* f4 */ 0x00e5b8ae, 0x00e5b8be, 0x00e5b989, 0x00e3a19c,
+ /* f8 */ 0x00e5b996, 0x00e3a1a1, 0x00e5b9ab, 0x00e5b9ac,
+ /* fc */ 0x00e5b9ad,
+
+ /*** Two byte table, leaf: f1xx - offset 0x024e8 ***/
+
+ /* 40 */ 0x00e58488, 0xf0a08fb9, 0x00e58497, 0x00e5849b,
+ /* 44 */ 0xf0a0918a, 0x00e585a0, 0xf0a09489, 0x00e585b3,
+ /* 48 */ 0x00e58683, 0x00e5868b, 0x00e392bc, 0x00e58698,
+ /* 4c */ 0x00e586a3, 0x00e586ad, 0x00e39387, 0x00e586bc,
+ /* 50 */ 0xf0a09796, 0xf0a098a8, 0x00e587b3, 0x00e587b4,
+ /* 54 */ 0x00e58882, 0x00e58892, 0x00e58896, 0xf0a09d8f,
+ /* 58 */ 0x00e58995, 0x00e5899c, 0x00e589ac, 0x00e589b7,
+ /* 5c */ 0x00e58a84, 0x00e58a82, 0xf0a0a087, 0x00e58a98,
+ /* 60 */ 0xf0a0a0ba, 0x00e58aa4, 0x00e58aa6, 0x00e58aaf,
+ /* 64 */ 0x00e58aba, 0x00e58abb, 0x00e58b8a, 0x00e3949f,
+ /* 68 */ 0x00e58b91, 0xf0a0a2b9, 0x00e58bb7, 0x00e58c8a,
+ /* 6c */ 0x00e58c8b, 0x00e58ca4, 0x00e58cb5, 0x00e58cbe,
+ /* 70 */ 0x00e58d82, 0xf0a0a5bc, 0xf0a0a69d, 0x00e58da7,
+ /* 74 */ 0x00e58dac, 0x00e58dba, 0x00e58ea4, 0x00e58eb4,
+ /* 78 */ 0xf0a0ab93, 0x00e58eb7, 0x00e58f80, 0xf0a0ac9d,
+ /* 7c */ 0x00e3959d, 0x00e3959e, 0x00e58f95, 0x00000000,
+ /* 80 */ 0x00e58f9a, 0x00e395a3, 0x00e58fb4, 0x00e58fb5,
+ /* 84 */ 0x00e59195, 0x00e590a4, 0x00e590a8, 0x00e395ae,
+ /* 88 */ 0x00e59183, 0x00e591a2, 0x00e591a6, 0x00e591ac,
+ /* 8c */ 0x00e5928a, 0x00e5928d, 0x00e59295, 0x00e592a0,
+ /* 90 */ 0x00e592a6, 0x00e592ad, 0x00e592ae, 0x00e592b7,
+ /* 94 */ 0x00e592ba, 0x00e592bf, 0x00e59383, 0xf0a0b585,
+ /* 98 */ 0x00e593ac, 0x00e593af, 0x00e593b1, 0x00e593b3,
+ /* 9c */ 0x00e59480, 0x00e59481, 0x00e59489, 0x00e594bc,
+ /* a0 */ 0x00e59581, 0x00e396a6, 0x00e59587, 0x00e5958a,
+ /* a4 */ 0x00e396a8, 0x00e595a0, 0x00e595a1, 0x00e595a4,
+ /* a8 */ 0xf0a0b7a1, 0x00e595bd, 0x00e59682, 0x00e59688,
+ /* ac */ 0x00e59691, 0x00e39785, 0x00e59792, 0xf0a0ba95,
+ /* b0 */ 0xf0a0b9ad, 0x00e596bf, 0x00e59789, 0x00e5978c,
+ /* b4 */ 0x00e59791, 0x00e5979d, 0x00e3979a, 0x00e597a2,
+ /* b8 */ 0xf0a0b9a4, 0x00e597a9, 0x00e598a8, 0xf0a0bd9f,
+ /* bc */ 0x00e59887, 0x00e59890, 0x00e598b0, 0x00e598b7,
+ /* c0 */ 0x00e397b4, 0x00e598bd, 0x00e598bf, 0x00e59980,
+ /* c4 */ 0x00e59987, 0x00e5999e, 0x00e599a0, 0x00e599ad,
+ /* c8 */ 0x00e39885, 0x00e59a88, 0x00e59a8c, 0x00e59a95,
+ /* cc */ 0x00e59a9a, 0x00e59a9d, 0x00e59aa8, 0x00e59aad,
+ /* d0 */ 0x00e59ab2, 0x00e59b85, 0x00e59b8d, 0x00e59b9f,
+ /* d4 */ 0x00e59ba8, 0x00e59bb6, 0x00e59bb7, 0xf0a18881,
+ /* d8 */ 0x00e59c95, 0x00e59ca3, 0xf0a18995, 0x00e59ca9,
+ /* dc */ 0xf0a189bb, 0x00e59d85, 0x00e59d86, 0x00e59d8c,
+ /* e0 */ 0x00e59d8d, 0xf0a189b4, 0x00e59da8, 0x00e59daf,
+ /* e4 */ 0x00e59db3, 0x00e59db4, 0x00e59db5, 0x00e59dbb,
+ /* e8 */ 0xf0a18ba4, 0xf0a18b97, 0x00e59eac, 0x00e59e9a,
+ /* ec */ 0x00e59e9d, 0x00e59e9e, 0x00e59ea8, 0x00e59f97,
+ /* f0 */ 0xf0a18bbd, 0x00e59f8c, 0xf0a18cb6, 0xf0a18d84,
+ /* f4 */ 0x00e59f9e, 0x00e59fa6, 0x00e59fb0, 0x00e3998a,
+ /* f8 */ 0x00e59fb8, 0x00e59fbb, 0x00e59fbd, 0x00e5a084,
+ /* fc */ 0x00e5a09e,
+
+ /*** Two byte table, leaf: f2xx - offset 0x025a5 ***/
+
+ /* 40 */ 0x00e5a0a0, 0x00e5a0a7, 0x00e5a0b2, 0x00e5a0b9,
+ /* 44 */ 0xf0a18f84, 0x00e5a189, 0x00e5a18c, 0x00e5a1a7,
+ /* 48 */ 0x00e5a28a, 0x00e5a28b, 0x00e5a28d, 0x00e5a28f,
+ /* 4c */ 0x00e5a290, 0x00e5a294, 0x00e5a29d, 0x00e5a2aa,
+ /* 50 */ 0x00e5a2b1, 0xf0a191ad, 0x00e5a383, 0x00e5a38d,
+ /* 54 */ 0x00e5a3a2, 0x00e5a3b3, 0x00e5a3b4, 0x00e5a485,
+ /* 58 */ 0x00e5a486, 0x00e5a48b, 0x00e5a48d, 0x00e5a494,
+ /* 5c */ 0x00e5a4a4, 0xf0a19797, 0x00e39a91, 0x00e5a4bd,
+ /* 60 */ 0x00e39a99, 0x00e5a586, 0x00e39a96, 0xf0a6b0a9,
+ /* 64 */ 0x00e5a59b, 0x00e5a59f, 0xf0a19987, 0x00e5a5b5,
+ /* 68 */ 0x00e5a5b6, 0x00e5a5bc, 0x00e5a69f, 0x00e5a6ae,
+ /* 6c */ 0x00e5a6bc, 0x00e5a788, 0x00e5a78d, 0x00e5a79e,
+ /* 70 */ 0x00e5a7a3, 0x00e5a7a4, 0x00e5a7a7, 0x00e5a7ae,
+ /* 74 */ 0xf0a19c86, 0xf0a19d82, 0x00e39b8f, 0x00e5a88c,
+ /* 78 */ 0x00e5a88d, 0x00e5a897, 0x00e5a8a7, 0x00e5a8ad,
+ /* 7c */ 0x00e5a995, 0x00e5a9a5, 0x00e5a9ba, 0x00000000,
+ /* 80 */ 0x00e5aa8b, 0x00e5aa9c, 0x00e5aa9f, 0x00e5aaa0,
+ /* 84 */ 0x00e5aaa2, 0x00e5aab1, 0x00e5aab3, 0x00e5aab5,
+ /* 88 */ 0x00e5aaba, 0x00e5aabf, 0x00e5ab9a, 0x00e5ab9c,
+ /* 8c */ 0x00e5aba0, 0x00e5aba5, 0x00e5abb0, 0x00e5abae,
+ /* 90 */ 0x00e5abb5, 0x00e5ac80, 0x00e5ac88, 0x00e5ac97,
+ /* 94 */ 0x00e5acb4, 0x00e5acad, 0x00e5ad8c, 0x00e5ad92,
+ /* 98 */ 0x00e5ada8, 0x00e5adaf, 0x00e5adbc, 0x00e5adbf,
+ /* 9c */ 0x00e5ae81, 0x00e5ae84, 0xf0a1a783, 0x00e5b9ae,
+ /* a0 */ 0xf0a285bb, 0x00e5baa5, 0x00e5baaa, 0x00e5baac,
+ /* a4 */ 0x00e5bab9, 0x00e5babf, 0x00e5bb86, 0x00e5bb92,
+ /* a8 */ 0x00e5bb99, 0xf0a28c9e, 0x00e5bbbd, 0x00e5bc88,
+ /* ac */ 0x00e5bc8e, 0x00e5bc9c, 0xf0a28ead, 0x00e5bc9e,
+ /* b0 */ 0x00e5bd87, 0x00e5bda3, 0x00e5bdb2, 0x00e5bdbe,
+ /* b4 */ 0x00e5be8f, 0x00e5bea2, 0x00e5bea4, 0x00e5beb8,
+ /* b8 */ 0x00e5bf84, 0x00e3a3ba, 0x00e5bf87, 0x00e5bf8b,
+ /* bc */ 0x00e5bf92, 0x00e5bf93, 0x00e5bf94, 0x00e5bfa2,
+ /* c0 */ 0x00e5bfae, 0x00e5bfaf, 0x00e5bfb3, 0x00e5bfbc,
+ /* c4 */ 0x00e3a497, 0x00e68097, 0x00e680a2, 0x00e680a4,
+ /* c8 */ 0x00e3a49a, 0x00e6818c, 0x00e681bf, 0x00e6828a,
+ /* cc */ 0x00e68295, 0x00e682a8, 0xf0a29bb3, 0x00e682b0,
+ /* d0 */ 0x00e682b1, 0x00e682be, 0x00e68388, 0x00e68399,
+ /* d4 */ 0x00e6839b, 0x00e683ae, 0x00e683b2, 0x00e683b5,
+ /* d8 */ 0x00e68490, 0x00e68492, 0x00e68493, 0x00e68499,
+ /* dc */ 0x00e6849e, 0x00e684ba, 0x00e3a5af, 0x00e68581,
+ /* e0 */ 0x00e68586, 0x00e685a0, 0x00e685bc, 0xf0a2a19b,
+ /* e4 */ 0x00e68692, 0x00e68693, 0x00e68697, 0x00e68698,
+ /* e8 */ 0x00e686a5, 0x00e686a8, 0x00e686ad, 0xf0a2a2ab,
+ /* ec */ 0x00e68795, 0x00e6879d, 0x00e6879f, 0x00e687b5,
+ /* f0 */ 0xf0a2a68f, 0x00e68895, 0x00e688a3, 0x00e688a9,
+ /* f4 */ 0x00e68986, 0x00e6898c, 0x00e68991, 0x00e68992,
+ /* f8 */ 0x00e689a1, 0x00e689a4, 0x00e689bb, 0x00e689ad,
+ /* fc */ 0x00e689b3,
+
+ /*** Two byte table, leaf: f3xx - offset 0x02662 ***/
+
+ /* 40 */ 0x00e68a99, 0x00e68aa6, 0x00e68b95, 0xf0a2aab8,
+ /* 44 */ 0x00e68bbd, 0x00e68c83, 0x00e68c8d, 0x00e68c90,
+ /* 48 */ 0xf0a2ad8f, 0xf0a2ad90, 0x00e68cb2, 0x00e68cb5,
+ /* 4c */ 0x00e68cbb, 0x00e68cbc, 0x00e68d81, 0x00e68d84,
+ /* 50 */ 0x00e68d8e, 0xf0a2ad86, 0x00e68d99, 0xf0a2b09d,
+ /* 54 */ 0xf0a2aea6, 0x00e68dac, 0x00e68e84, 0x00e68e99,
+ /* 58 */ 0xf0a2b0a4, 0x00e68e94, 0x00e68ebd, 0x00e68fb7,
+ /* 5c */ 0x00e68f94, 0x00e68f95, 0x00e68f9c, 0x00e68fa0,
+ /* 60 */ 0x00e68fab, 0x00e68fac, 0x00e68fb2, 0x00e69089,
+ /* 64 */ 0x00e6909e, 0x00e690a5, 0x00e690a9, 0x00e690af,
+ /* 68 */ 0x00e6919a, 0x00e6919b, 0x00e6919d, 0x00e691b3,
+ /* 6c */ 0x00e691bd, 0x00e69287, 0x00e69291, 0x00e6929d,
+ /* 70 */ 0x00e6929f, 0x00e6938b, 0x00e6938c, 0x00e69395,
+ /* 74 */ 0x00e69397, 0xf0a2b7a1, 0x00e693a4, 0x00e693a5,
+ /* 78 */ 0x00e693bf, 0x00e69484, 0x00e3a9ae, 0x00e6948f,
+ /* 7c */ 0x00e69494, 0x00e69496, 0x00e3a9b3, 0x00000000,
+ /* 80 */ 0x00e6949e, 0x00e694b2, 0x00e69584, 0x00e69594,
+ /* 84 */ 0x00e695ab, 0x00e695ba, 0x00e69681, 0x00e69684,
+ /* 88 */ 0x00e69685, 0x00e6968a, 0x00e696b2, 0x00e696b5,
+ /* 8c */ 0x00e696b8, 0x00e696bf, 0x00e69782, 0x00e69789,
+ /* 90 */ 0x00e69794, 0x00e3ab96, 0x00e697b2, 0x00e697b9,
+ /* 94 */ 0x00e697bc, 0x00e69884, 0x00e69888, 0x00e698a1,
+ /* 98 */ 0x00e698aa, 0x00e69985, 0x00e69991, 0x00e6998e,
+ /* 9c */ 0x00e3abaa, 0xf0a38783, 0x00e69997, 0x00e6999b,
+ /* a0 */ 0x00e699a3, 0xf0a387b5, 0xf0a386b6, 0x00e699aa,
+ /* a4 */ 0x00e699ab, 0x00e699ac, 0x00e699ad, 0x00e699bb,
+ /* a8 */ 0x00e69a80, 0x00e69a90, 0x00e69a92, 0x00e69a99,
+ /* ac */ 0x00e3ac8e, 0x00e69aad, 0x00e69ab1, 0x00e69ab5,
+ /* b0 */ 0x00e3ac9a, 0x00e69abf, 0x00e3ac9c, 0x00e69bac,
+ /* b4 */ 0x00e3ab97, 0x00e69c81, 0x00e69c85, 0x00e69c92,
+ /* b8 */ 0xf0a38db2, 0x00e69c99, 0xf0a38f93, 0xf0a38f92,
+ /* bc */ 0x00e69d8c, 0x00e69d8d, 0x00e69d94, 0x00e69d9d,
+ /* c0 */ 0xf0a38f90, 0xf0a38fa4, 0xf0a38f95, 0x00e69db4,
+ /* c4 */ 0x00e69db6, 0xf0a38f9a, 0x00e69e92, 0xf0a38f9f,
+ /* c8 */ 0x00e88da3, 0x00e6a090, 0x00e69eb0, 0x00e69eb2,
+ /* cc */ 0x00e69f83, 0x00e69f88, 0x00e69f92, 0x00e69f99,
+ /* d0 */ 0x00e69f9b, 0x00e69fb0, 0x00e69fb7, 0xf0a3918a,
+ /* d4 */ 0xf0a39191, 0xf0a3918b, 0x00e6a098, 0x00e6a09f,
+ /* d8 */ 0x00e6a0ad, 0xf0a391a5, 0x00e6a0b3, 0x00e6a0bb,
+ /* dc */ 0x00e6a0be, 0x00e6a184, 0x00e6a185, 0x00e6a189,
+ /* e0 */ 0x00e6a18c, 0x00e6a195, 0x00e6a197, 0x00e3adb7,
+ /* e4 */ 0x00e6a1ab, 0x00e6a1ae, 0x00e6a1ba, 0x00e6a1bc,
+ /* e8 */ 0x00e6a282, 0x00e6a290, 0x00e6a296, 0x00e3adad,
+ /* ec */ 0x00e6a298, 0x00e6a299, 0x00e6a29a, 0x00e6a29c,
+ /* f0 */ 0x00e6a2aa, 0x00e6a2ab, 0x00e6a2b4, 0x00e6a2bb,
+ /* f4 */ 0x00e6a3bb, 0xf0a393a4, 0xf0a3959a, 0x00efa893,
+ /* f8 */ 0x00e6a383, 0x00e6a385, 0x00e6a38c, 0x00e6a38f,
+ /* fc */ 0x00e6a396,
+
+ /*** Two byte table, leaf: f4xx - offset 0x0271f ***/
+
+ /* 40 */ 0x00e6a399, 0x00e6a3a4, 0x00e6a3a5, 0x00e6a3ac,
+ /* 44 */ 0x00e6a3b7, 0x00e6a483, 0x00e6a487, 0x00e3ae87,
+ /* 48 */ 0x00e3ae88, 0xf0a39694, 0x00e6a4bb, 0x00e3ae8d,
+ /* 4c */ 0x00e6a586, 0x00e6a5a9, 0x00e6a5ac, 0x00e6a5b2,
+ /* 50 */ 0x00e6a5ba, 0x00e6a5bf, 0x00e6a692, 0x00e3aea4,
+ /* 54 */ 0x00e6a696, 0x00e6a698, 0x00e6a6a6, 0x00e6a6b0,
+ /* 58 */ 0x00e6a6b7, 0x00e6a6ba, 0x00e6a6bc, 0x00e6a780,
+ /* 5c */ 0x00e6a791, 0x00e6a796, 0xf0a398b9, 0xf0a39987,
+ /* 60 */ 0x00e6a8b0, 0xf0a398b8, 0xf0a398ba, 0x00e6a7a3,
+ /* 64 */ 0x00e6a7ae, 0x00e6a7af, 0x00e6a7b3, 0x00e3af8d,
+ /* 68 */ 0x00e6a7b4, 0x00e6a7be, 0x00e6a891, 0x00e6a89a,
+ /* 6c */ 0x00e6a89d, 0xf0a39c9c, 0x00e6a8b2, 0x00e6a8b3,
+ /* 70 */ 0x00e6a8b4, 0x00e6a8bf, 0x00e6a986, 0x00e6a989,
+ /* 74 */ 0x00e6a9ba, 0x00e6a98e, 0x00e6a992, 0x00e6a9a4,
+ /* 78 */ 0xf0a39c8c, 0x00e6a9be, 0x00e6aa83, 0x00e6aa8b,
+ /* 7c */ 0x00e3afb0, 0x00e6aa91, 0x00e6aa9f, 0x00000000,
+ /* 80 */ 0x00e6aaa1, 0xf0a39da4, 0x00e6aaab, 0x00e6aabd,
+ /* 84 */ 0x00e6ab86, 0x00e6ab94, 0x00e6ab90, 0x00e6ab9c,
+ /* 88 */ 0x00e6ab9d, 0xf0a39fbf, 0xf0a39fa7, 0x00e6abac,
+ /* 8c */ 0x00e6abb1, 0x00e6abb2, 0x00e6abb3, 0x00e6abbd,
+ /* 90 */ 0xf0a3a0a4, 0x00e6ac8b, 0x00e6ac8f, 0x00e6ac90,
+ /* 94 */ 0x00e6ac91, 0xf0a3a0bd, 0x00e6ac97, 0x00e3b0a6,
+ /* 98 */ 0x00e6acaf, 0x00e6ad8a, 0x00e6ad98, 0x00e6adac,
+ /* 9c */ 0x00e6adb5, 0x00e6adba, 0x00e6ae81, 0x00e6ae9b,
+ /* a0 */ 0x00e6aeae, 0xf0a3aa98, 0x00e6aebd, 0x00e6aebe,
+ /* a4 */ 0x00e6af87, 0x00e6af88, 0x00e6af89, 0x00e6af9a,
+ /* a8 */ 0x00e6afa6, 0x00e6afa7, 0x00e6afae, 0x00e6afb1,
+ /* ac */ 0x00e6b082, 0x00e6b08a, 0x00e6b08e, 0x00e6b0b5,
+ /* b0 */ 0x00e6b0b6, 0x00e6b0ba, 0xf0a3b1bf, 0x00e6b0bf,
+ /* b4 */ 0x00e6b18d, 0x00e6b19b, 0x00e6b1ad, 0x00e6b284,
+ /* b8 */ 0x00e6b289, 0x00e3b383, 0x00e6b294, 0x00e6b295,
+ /* bc */ 0x00e6b297, 0x00e6b2ad, 0x00e6b382, 0x00e6b390,
+ /* c0 */ 0x00e3b392, 0x00e6b396, 0x00e6b39a, 0x00e6b39c,
+ /* c4 */ 0x00e6b3a9, 0x00e6b3ac, 0x00e6b3ad, 0xf0a3b480,
+ /* c8 */ 0x00e6b480, 0x00e6b48a, 0x00e6b4a4, 0x00e6b4a6,
+ /* cc */ 0x00e6b4a7, 0x00e6b1a7, 0x00e6b4af, 0x00e6b4bc,
+ /* d0 */ 0x00e6b59b, 0x00e6b59e, 0x00e6b5a0, 0x00e6b5b0,
+ /* d4 */ 0x00e6b680, 0x00e6b681, 0x00e6b68a, 0x00e6b68d,
+ /* d8 */ 0x00e6b691, 0x00e6b698, 0xf0a3b580, 0x00e6b897,
+ /* dc */ 0xf0a3b7ba, 0xf0a3b7b9, 0xf0a3b793, 0x00e6b6ab,
+ /* e0 */ 0x00e6b6ae, 0x00e6b6b4, 0x00e6b782, 0x00e6b4b4,
+ /* e4 */ 0x00e6b788, 0x00e6b78e, 0x00e6b78f, 0x00e6b790,
+ /* e8 */ 0x00e6b79f, 0x00e6b7a9, 0x00e6b7b6, 0x00e6b8b6,
+ /* ec */ 0x00e6b89e, 0x00e6b8a2, 0x00e6b8a7, 0x00e3b491,
+ /* f0 */ 0x00e6b8b2, 0x00e6b8bc, 0x00e6b988, 0x00e6b989,
+ /* f4 */ 0x00e6b98b, 0x00e6b98c, 0x00e6b98f, 0x00e6b991,
+ /* f8 */ 0x00e6b993, 0x00e6b994, 0x00e6b997, 0x00e6b9a3,
+ /* fc */ 0x00e3b49e,
+
+ /*** Two byte table, leaf: f5xx - offset 0x027dc ***/
+
+ /* 40 */ 0x00e6ba93, 0x00e6baa7, 0x00e6bab4, 0x00e6babf,
+ /* 44 */ 0x00e6bb83, 0x00e6bb8a, 0x00e6bb99, 0x00e6bcb5,
+ /* 48 */ 0x00e6bbab, 0x00e6bbb9, 0x00e6bbbb, 0x00e6bc8a,
+ /* 4c */ 0x00e6bc8c, 0x00e6bc98, 0x00e6bca5, 0x00e6bcb6,
+ /* 50 */ 0x00e6bcbc, 0xf0a3bdbe, 0x00e6bd92, 0x00e6bd97,
+ /* 54 */ 0x00e6bd9a, 0x00e6bda0, 0x00e6bda8, 0x00e6be98,
+ /* 58 */ 0x00e6bdbd, 0x00e6be90, 0x00e6be96, 0x00e6bebe,
+ /* 5c */ 0x00e6be9f, 0x00e6bea5, 0x00e6beaf, 0x00e3b5a4,
+ /* 60 */ 0x00e6beb5, 0x00e6bf88, 0x00e6bf89, 0x00e6bf9a,
+ /* 64 */ 0x00e6bf9e, 0x00e6bfa9, 0xf0a48296, 0x00e6bfbc,
+ /* 68 */ 0x00e78080, 0x00e78087, 0x00e7808a, 0x00e780a3,
+ /* 6c */ 0xf0a48483, 0x00e780b9, 0x00e780ba, 0x00e780bc,
+ /* 70 */ 0x00e78183, 0x00e78187, 0x00e7818b, 0x00e3b69a,
+ /* 74 */ 0x00e78194, 0x00e781a5, 0x00e781a9, 0x00e781ac,
+ /* 78 */ 0x00e781ae, 0x00e781b6, 0x00e781be, 0x00e78281,
+ /* 7c */ 0x00e78286, 0x00e78295, 0x00e78297, 0x00000000,
+ /* 80 */ 0x00e782bb, 0xf0a48786, 0x00e7829f, 0x00e782b1,
+ /* 84 */ 0xf0a487be, 0x00e783ac, 0x00e7838a, 0x00e78391,
+ /* 88 */ 0x00e78393, 0x00e7839c, 0x00e78483, 0x00e78484,
+ /* 8c */ 0x00e78486, 0x00e78487, 0x00e78488, 0x00e7848c,
+ /* 90 */ 0x00e3b780, 0x00e784af, 0x00e784b1, 0x00e78590,
+ /* 94 */ 0x00e7858a, 0x00e78593, 0x00e7859e, 0x00e3b794,
+ /* 98 */ 0x00e78696, 0x00e78680, 0x00e7869b, 0x00e786a0,
+ /* 9c */ 0x00e786a2, 0x00e786ae, 0x00e786af, 0x00e786b3,
+ /* a0 */ 0xf0a48ebc, 0x00e7878b, 0x00e78793, 0x00e78799,
+ /* a4 */ 0x00e7879c, 0x00e78887, 0x00e3b885, 0x00efa989,
+ /* a8 */ 0x00e788ab, 0x00e788b4, 0x00e788b8, 0x00e788b9,
+ /* ac */ 0x00e4b8ac, 0x00e78982, 0x00e78993, 0x00e78997,
+ /* b0 */ 0x00e789a3, 0xf0a498a9, 0x00e789ae, 0x00e789af,
+ /* b4 */ 0x00e789b8, 0x00e789bf, 0x00e78a8e, 0xf0a49aa5,
+ /* b8 */ 0x00e78aad, 0x00e78aae, 0x00e78ab0, 0x00e78ab1,
+ /* bc */ 0x00e78b81, 0x00e3b9a0, 0x00e78b8c, 0x00e3b9a6,
+ /* c0 */ 0x00e3b9a8, 0x00e78bb3, 0x00e78bba, 0x00e78c87,
+ /* c4 */ 0x00e78c92, 0x00e78c98, 0x00e78c99, 0x00e3ba83,
+ /* c8 */ 0x00e78cb9, 0x00e78cac, 0x00e78cb1, 0x00e78cb3,
+ /* cc */ 0x00e78cbd, 0x00e78d92, 0x00e3ba94, 0x00e78dab,
+ /* d0 */ 0x00e78dac, 0xf0a4a296, 0x00e78dae, 0x00e78daf,
+ /* d4 */ 0x00e78db1, 0x00e78db7, 0x00e78e81, 0x00e78e85,
+ /* d8 */ 0x00e78e8a, 0x00e78e94, 0x00e78e98, 0x00e78e9c,
+ /* dc */ 0x00e78e9e, 0x00e78ea5, 0x00e78ea8, 0x00e78eb5,
+ /* e0 */ 0x00e78eb7, 0x00e78eb9, 0x00e78ebc, 0x00e78ebf,
+ /* e4 */ 0x00e78f85, 0x00e78f8b, 0x00e78fa1, 0x00e78fa7,
+ /* e8 */ 0x00e78fb9, 0x00e79093, 0x00e78fba, 0x00e79081,
+ /* ec */ 0x00e790a4, 0x00e790b1, 0x00e790b9, 0x00e79193,
+ /* f0 */ 0x00e79180, 0x00e79183, 0x00e7918d, 0x00e79192,
+ /* f4 */ 0x00e7919d, 0x00e791b1, 0x00e79281, 0x00e79285,
+ /* f8 */ 0x00e79288, 0xf0a4a98d, 0x00e79292, 0x00e79297,
+ /* fc */ 0x00e79299,
+
+ /*** Two byte table, leaf: f6xx - offset 0x02899 ***/
+
+ /* 40 */ 0x00e792a0, 0x00e792a1, 0x00e792a5, 0x00e792aa,
+ /* 44 */ 0x00e792ab, 0x00e792b9, 0x00e792bb, 0x00e792ba,
+ /* 48 */ 0x00e79396, 0x00e79398, 0x00e7939e, 0x00e793af,
+ /* 4c */ 0x00e793ab, 0xf0a4ad96, 0x00e793ba, 0xf0a4adaf,
+ /* 50 */ 0x00e794a0, 0x00e794a4, 0x00e794aa, 0x00e3bd97,
+ /* 54 */ 0xf0a4b096, 0x00e794bd, 0x00e794be, 0x00e79580,
+ /* 58 */ 0x00e79588, 0x00e7958e, 0x00e79590, 0x00e79592,
+ /* 5c */ 0x00e795ac, 0x00e795b2, 0x00e795b1, 0x00e795ba,
+ /* 60 */ 0x00e795bd, 0x00e795be, 0x00e79681, 0xf0a4b494,
+ /* 64 */ 0x00e7968c, 0x00e3bdb5, 0x00e796a2, 0x00e3bdb7,
+ /* 68 */ 0x00e796b0, 0x00e796b7, 0x00e796bf, 0x00e79780,
+ /* 6c */ 0x00e79786, 0x00e7978f, 0x00e79793, 0x00e7979d,
+ /* 70 */ 0x00e7979f, 0x00e797a0, 0x00e797a7, 0x00e797ac,
+ /* 74 */ 0x00e797ae, 0x00e797b1, 0x00e797b9, 0x00e79883,
+ /* 78 */ 0x00e79898, 0x00e79887, 0x00e7988f, 0x00e3beae,
+ /* 7c */ 0xf0a4b88e, 0x00e79893, 0x00e7989b, 0x00000000,
+ /* 80 */ 0x00e7989c, 0xf0a4b8b7, 0x00e798a5, 0x00e798a8,
+ /* 84 */ 0x00e798bc, 0x00e798b3, 0xf0a4b9aa, 0x00e3bf89,
+ /* 88 */ 0x00e79981, 0xf0a4ba8b, 0x00e79989, 0x00e79995,
+ /* 8c */ 0x00e3bf97, 0x00e799ae, 0x00e79a95, 0x00e79a9c,
+ /* 90 */ 0x00e79aa1, 0x00e79aa0, 0x00e79aa7, 0x00e79aa8,
+ /* 94 */ 0x00e79aaf, 0xf0a5818a, 0x00e79b89, 0xf0a58195,
+ /* 98 */ 0x00e79ba8, 0x00e79bac, 0xf0a584a2, 0x00e79c97,
+ /* 9c */ 0x00e79c9a, 0x00e79cad, 0x00e79cb5, 0xf0a586a9,
+ /* a0 */ 0x00e480b9, 0xf0a587a5, 0xf0a5878d, 0x00e79d98,
+ /* a4 */ 0x00e79da0, 0x00e79daa, 0xf0a5889e, 0x00e79db2,
+ /* a8 */ 0x00e79dbc, 0x00e79dbd, 0xf0a5898c, 0x00e48198,
+ /* ac */ 0x00e79e9a, 0x00e79e9f, 0x00e79ea2, 0x00e79ea4,
+ /* b0 */ 0x00e79ea9, 0x00e79f9e, 0x00e79f9f, 0x00e79fa4,
+ /* b4 */ 0x00e79fa6, 0x00e79faa, 0x00e79fac, 0x00e48293,
+ /* b8 */ 0x00e79fb0, 0x00e79fb4, 0x00e79fbb, 0xf0a590ae,
+ /* bc */ 0x00e7a085, 0x00e7a086, 0x00e7a089, 0x00e7a08d,
+ /* c0 */ 0x00e7a099, 0x00e7a0a1, 0x00e7a0ac, 0x00e7a187,
+ /* c4 */ 0x00e7a1a4, 0x00e7a1aa, 0xf0a59399, 0x00e7a28a,
+ /* c8 */ 0x00e7a294, 0x00e7a2a4, 0x00e7a29d, 0x00e7a29e,
+ /* cc */ 0x00e7a29f, 0x00e7a2bb, 0x00e7a388, 0x00e7a38c,
+ /* d0 */ 0x00e7a38e, 0x00e7a395, 0x00e7a3a0, 0x00e7a3a1,
+ /* d4 */ 0x00e7a3a6, 0x00e7a3b9, 0x00e7a3ba, 0x00e7a3bb,
+ /* d8 */ 0x00e7a3be, 0xf0a596a7, 0x00e7a490, 0x00e7a49b,
+ /* dc */ 0x00e7a4b0, 0x00e7a4a5, 0x00e7a4bb, 0x00e7a58a,
+ /* e0 */ 0x00e7a598, 0x00e7a59b, 0x00e48485, 0x00e7a5a7,
+ /* e4 */ 0x00e7a5b2, 0x00e7a694, 0x00e7a695, 0x00e7a696,
+ /* e8 */ 0x00e7a69b, 0x00e7a6a1, 0x00e7a6a9, 0x00e7a6b4,
+ /* ec */ 0x00e7a6bb, 0x00e7a782, 0x00e7a787, 0x00e7a78c,
+ /* f0 */ 0x00e7a78d, 0x00e7a796, 0x00e48588, 0xf0a59ea9,
+ /* f4 */ 0xf0a59eb4, 0x00e4858f, 0x00e7a88a, 0x00e7a891,
+ /* f8 */ 0x00e7a895, 0x00e7a89b, 0x00e7a89e, 0x00e485a3,
+ /* fc */ 0x00e7a8ad,
+
+ /*** Two byte table, leaf: f7xx - offset 0x02956 ***/
+
+ /* 40 */ 0x00e7a8b8, 0x00e7a987, 0x00e7a98c, 0x00e7a996,
+ /* 44 */ 0x00e7a999, 0x00e7a99c, 0x00e7a99f, 0x00e7a9a0,
+ /* 48 */ 0x00e7a9a7, 0x00e7a9aa, 0x00e7a9b5, 0x00e7a9b8,
+ /* 4c */ 0x00e7aa82, 0x00e7aa8a, 0x00e7aa90, 0x00e7aaa3,
+ /* 50 */ 0x00e7aaac, 0xf0a5a794, 0x00e486b4, 0x00e7aab9,
+ /* 54 */ 0x00e7aabc, 0x00e7aabe, 0x00e486bf, 0x00e7ab8c,
+ /* 58 */ 0x00e7ab91, 0x00e7aba7, 0x00e7aba8, 0x00e7abb4,
+ /* 5c */ 0xf0a5aba4, 0xf0a5aba3, 0x00e7ac87, 0xf0a5abb1,
+ /* 60 */ 0x00e7acbd, 0x00e7aca7, 0x00e7acaa, 0x00e7acae,
+ /* 64 */ 0x00e7acaf, 0x00e7acb1, 0x00e487a6, 0x00e487b3,
+ /* 68 */ 0x00e7adbf, 0x00e7ad81, 0x00e487ae, 0x00e7ad95,
+ /* 6c */ 0x00e7adb9, 0x00e7ada4, 0x00e7ada6, 0x00e7ada9,
+ /* 70 */ 0x00e7adb3, 0xf0a5aeb2, 0x00e48887, 0x00e7ae90,
+ /* 74 */ 0x00e7ae91, 0x00e7ae9b, 0x00e4888e, 0x00e7aeaf,
+ /* 78 */ 0x00e7aeb5, 0x00e7aebc, 0x00e7af85, 0x00e7af8a,
+ /* 7c */ 0xf0a5b18b, 0xf0a5b1a4, 0x00e7af94, 0x00000000,
+ /* 80 */ 0x00e7af96, 0x00e7af9a, 0x00e7afaa, 0x00e7afb0,
+ /* 84 */ 0x00e7b083, 0x00e7b08b, 0x00e7b08e, 0x00e7b08f,
+ /* 88 */ 0x00e7b0a6, 0x00e7b185, 0x00e7b18a, 0x00e7b191,
+ /* 8c */ 0x00e7b197, 0x00e7b19e, 0x00e7b1a1, 0x00e7b1a9,
+ /* 90 */ 0x00e7b1ae, 0x00e7b1af, 0x00e7b1b0, 0xf0a5b8ae,
+ /* 94 */ 0xf0a5b996, 0xf0a5b9a5, 0x00e7b2a6, 0xf0a5b9a2,
+ /* 98 */ 0x00e7b2b6, 0x00e7b2b7, 0x00e7b2bf, 0xf0a5bb98,
+ /* 9c */ 0x00e7b384, 0xf0a5bb82, 0x00e7b388, 0x00e7b38d,
+ /* a0 */ 0xf0a5bba8, 0x00e7b397, 0xf0a5bca3, 0x00e7b3a6,
+ /* a4 */ 0x00e7b3ab, 0xf0a5bd9c, 0x00e7b3b5, 0x00e7b483,
+ /* a8 */ 0x00e7b489, 0x00e48b86, 0x00e7b492, 0x00e7b49e,
+ /* ac */ 0xf0a5bfa0, 0xf0a5bf94, 0x00e7b4bd, 0x00e7b4be,
+ /* b0 */ 0x00e7b580, 0x00e7b587, 0xf0a6808c, 0xf0a5bfbb,
+ /* b4 */ 0x00e48b96, 0x00e7b599, 0x00e7b59a, 0x00e7b5aa,
+ /* b8 */ 0x00e7b5b0, 0x00e48b9d, 0x00e7b5bf, 0xf0a68097,
+ /* bc */ 0x00e7b686, 0x00e7b688, 0x00e7b68c, 0x00e7b697,
+ /* c0 */ 0xf0a681a0, 0x00e7b69d, 0x00e7b6a7, 0x00e7b6aa,
+ /* c4 */ 0x00e7b6b6, 0x00e7b6b7, 0x00e7b780, 0x00e7b797,
+ /* c8 */ 0x00e7b799, 0x00e7b7a6, 0x00e7b7b1, 0x00e7b7b9,
+ /* cc */ 0x00e48c82, 0xf0a683ad, 0x00efa998, 0x00e7b890,
+ /* d0 */ 0x00e7b897, 0x00e7b89d, 0x00e7b8a0, 0x00e7b8a7,
+ /* d4 */ 0x00e7b8ac, 0x00e7b985, 0x00e7b9b3, 0x00e7b9b5,
+ /* d8 */ 0x00e7b9be, 0x00e7ba86, 0x00e7ba87, 0x00e48cab,
+ /* dc */ 0x00e7ba91, 0x00e7ba98, 0x00e7ba9a, 0x00e48d83,
+ /* e0 */ 0x00e7bcbc, 0x00e7bcbb, 0x00e7bcbe, 0x00e7bd83,
+ /* e4 */ 0x00e7bd84, 0x00e7bd8f, 0x00e39381, 0xf0a689b0,
+ /* e8 */ 0x00e7bd92, 0xf0a68a86, 0x00e7bda1, 0x00e7bda3,
+ /* ec */ 0x00e7bda4, 0x00e7bdad, 0x00e7bdbd, 0x00e7bdbe,
+ /* f0 */ 0xf0a68d8c, 0x00e7be90, 0x00e585bb, 0xf0a3b48e,
+ /* f4 */ 0x00e7be96, 0x00e7be9c, 0x00e7bead, 0xf0a69082,
+ /* f8 */ 0x00e7bf83, 0x00e7bf8f, 0x00e7bfa3, 0x00e7bfa5,
+ /* fc */ 0x00e7bfaf,
+
+ /*** Two byte table, leaf: f8xx - offset 0x02a13 ***/
+
+ /* 40 */ 0x00e7bfb2, 0x00e88082, 0x00e8808a, 0x00e88088,
+ /* 44 */ 0x00e8808e, 0x00e88091, 0x00e88096, 0x00e880a4,
+ /* 48 */ 0x00e880ac, 0x00e880b0, 0x00e88183, 0x00e881a6,
+ /* 4c */ 0x00e881b1, 0x00e881b5, 0x00e881bb, 0x00e88299,
+ /* 50 */ 0x00e8829c, 0x00e882a4, 0x00e882a7, 0x00e882b8,
+ /* 54 */ 0xf0a699be, 0x00e88385, 0x00e88395, 0x00e88398,
+ /* 58 */ 0x00e883a6, 0xf0a69ab0, 0x00e8848d, 0x00e883b5,
+ /* 5c */ 0x00e883bb, 0x00e48fae, 0x00e884b5, 0x00e88496,
+ /* 60 */ 0x00e8849e, 0x00e48fb0, 0x00e884a4, 0x00e884a7,
+ /* 64 */ 0x00e884ac, 0xf0a69c9d, 0x00e884bd, 0x00e49088,
+ /* 68 */ 0x00e885a9, 0x00e49097, 0x00e88681, 0x00e4909c,
+ /* 6c */ 0x00e88684, 0x00e88685, 0x00e490a2, 0x00e88698,
+ /* 70 */ 0x00e886b2, 0x00e88781, 0x00e88783, 0x00e88796,
+ /* 74 */ 0x00e8879b, 0xf0a6a39d, 0x00e887a4, 0xf0a6a3aa,
+ /* 78 */ 0x00e887ac, 0xf0a6a591, 0x00e887bd, 0x00e887bf,
+ /* 7c */ 0xf0a6a5af, 0x00e88884, 0xf0a6a79d, 0x00000000,
+ /* 80 */ 0x00e88899, 0x00e888a1, 0x00e888a2, 0xf0a6a89e,
+ /* 84 */ 0x00e888b2, 0x00e888b4, 0x00e888bc, 0x00e88986,
+ /* 88 */ 0x00e88989, 0x00e88985, 0xf0a6a998, 0x00e8898b,
+ /* 8c */ 0x00e491b6, 0x00e8898f, 0x00e491ba, 0x00e88997,
+ /* 90 */ 0xf0a6aa8c, 0x00e8899c, 0x00e889a3, 0xf0a6aab7,
+ /* 94 */ 0x00efa99d, 0x00efa99e, 0x00e889b9, 0x00e49291,
+ /* 98 */ 0x00e889bd, 0x00e889bf, 0x00e88a83, 0x00e88a8a,
+ /* 9c */ 0x00e88a93, 0x00e88aa7, 0x00e88aa8, 0x00e88ab2,
+ /* a0 */ 0x00e88ab4, 0x00e88aba, 0x00e88abc, 0x00e88ba2,
+ /* a4 */ 0x00e88ba8, 0x00e88bb7, 0x00e88c87, 0x00e88c88,
+ /* a8 */ 0x00e88c8c, 0x00e88d94, 0x00e88c9b, 0x00e88c9d,
+ /* ac */ 0x00e88cb0, 0x00e88cbc, 0x00e88d84, 0x00e88d97,
+ /* b0 */ 0x00e492be, 0x00e88dbf, 0x00e49394, 0x00e492b3,
+ /* b4 */ 0x00e88e8d, 0x00e88e94, 0x00e88e95, 0x00e88e9b,
+ /* b8 */ 0x00e88e9d, 0x00e88f89, 0x00e88f90, 0x00e88f94,
+ /* bc */ 0x00e88f9d, 0x00e88fa5, 0x00e88fb9, 0x00e8908f,
+ /* c0 */ 0x00e89091, 0x00e89095, 0xf0a6b1b3, 0x00e89097,
+ /* c4 */ 0x00e890b9, 0x00e8918a, 0x00e8918f, 0x00e89191,
+ /* c8 */ 0x00e89192, 0x00e89199, 0x00e8919a, 0x00e8919c,
+ /* cc */ 0xf0a6b39d, 0x00e891a5, 0x00e891b6, 0x00e891b8,
+ /* d0 */ 0x00e891bc, 0x00e89281, 0x00e4948d, 0x00e8939c,
+ /* d4 */ 0x00e89297, 0x00e892a6, 0x00e892be, 0x00e49488,
+ /* d8 */ 0x00e8938e, 0x00e8938f, 0x00e89393, 0xf0a6b9a5,
+ /* dc */ 0x00e893a7, 0x00e893aa, 0x00e893af, 0x00e893b0,
+ /* e0 */ 0x00e893b1, 0x00e893ba, 0x00e893bd, 0x00e8948c,
+ /* e4 */ 0x00e8949b, 0x00e894a4, 0x00e894a5, 0x00e894ab,
+ /* e8 */ 0x00e894b4, 0x00e8958f, 0x00e895af, 0x00e494a5,
+ /* ec */ 0x00e49583, 0x00e894be, 0x00e89591, 0x00e89593,
+ /* f0 */ 0x00e8959e, 0x00e895a1, 0x00e895a2, 0xf0a6be94,
+ /* f4 */ 0x00e895bb, 0x00e895bd, 0x00e895bf, 0x00e89681,
+ /* f8 */ 0x00e89686, 0x00e89693, 0x00e8969d, 0x00e8969f,
+ /* fc */ 0xf0a6bfb8,
+
+ /*** Two byte table, leaf: f9xx - offset 0x02ad0 ***/
+
+ /* 40 */ 0xf0a6bfb6, 0xf0a6bfb7, 0x00e896b7, 0x00e896bc,
+ /* 44 */ 0x00e89787, 0x00e8978a, 0x00e89798, 0x00e89799,
+ /* 48 */ 0x00e8979f, 0x00e897a1, 0x00e897a6, 0x00e897b6,
+ /* 4c */ 0x00e89880, 0x00e89891, 0x00e8989e, 0x00e898a1,
+ /* 50 */ 0x00e898a4, 0x00e898a7, 0xf0a7848d, 0x00e898b9,
+ /* 54 */ 0x00e898bc, 0xf0a784b9, 0x00e89980, 0x00efa8a0,
+ /* 58 */ 0x00e89993, 0x00e89996, 0x00e899af, 0x00e899b7,
+ /* 5c */ 0x00e899ba, 0x00e89a87, 0x00e89a89, 0x00e89a8d,
+ /* 60 */ 0x00e89a91, 0x00e89a9c, 0x00e89a9d, 0x00e89aa8,
+ /* 64 */ 0x00efa8a1, 0x00e89ab1, 0x00e89ab3, 0x00e89b81,
+ /* 68 */ 0x00e89b83, 0x00e89b91, 0x00e89b95, 0x00e89b97,
+ /* 6c */ 0x00e89ba3, 0x00e89ba6, 0x00e496b8, 0x00e89c85,
+ /* 70 */ 0x00e89c87, 0x00e89c8e, 0x00e89c90, 0x00e89c93,
+ /* 74 */ 0x00e89c99, 0x00e89c9f, 0x00e89ca1, 0x00e89ca3,
+ /* 78 */ 0x00e89cb1, 0x00e89cba, 0x00e89cbe, 0x00e89d80,
+ /* 7c */ 0x00e89d83, 0x00e89d91, 0x00e89d98, 0x00000000,
+ /* 80 */ 0x00e89da4, 0x00e89da5, 0x00e89db2, 0x00e89dbc,
+ /* 84 */ 0xf0a78f9b, 0xf0a78f9a, 0x00e89ea7, 0x00e89e89,
+ /* 88 */ 0x00e89e8b, 0x00e89e93, 0x00e89ea0, 0xf0a78fbe,
+ /* 8c */ 0x00e497a5, 0x00e89ebe, 0xf0a79090, 0x00e89f81,
+ /* 90 */ 0x00e89f8e, 0x00e89fb5, 0x00e89f9f, 0xf0a79189,
+ /* 94 */ 0x00e89fa3, 0x00e89fa5, 0x00e89fa6, 0x00e89faa,
+ /* 98 */ 0x00e89fab, 0x00e89fad, 0x00e8a081, 0x00e8a083,
+ /* 9c */ 0x00e8a08b, 0x00e8a093, 0x00e8a0a8, 0x00e8a0ae,
+ /* a0 */ 0x00e8a0b2, 0x00e8a0bc, 0x00e4988f, 0x00e8a18a,
+ /* a4 */ 0x00e8a198, 0x00e8a19f, 0x00e8a1a4, 0xf0a79895,
+ /* a8 */ 0xf0a79894, 0x00e8a1a9, 0xf0a798b1, 0x00e8a1af,
+ /* ac */ 0x00e8a2a0, 0x00e8a2bc, 0x00e8a2bd, 0x00e8a2be,
+ /* b0 */ 0x00e8a380, 0x00e8a392, 0xf0a79a93, 0x00e8a391,
+ /* b4 */ 0x00e8a393, 0x00e8a39b, 0x00e8a3b0, 0x00e8a3b1,
+ /* b8 */ 0x00e49981, 0x00e8a481, 0xf0a79c8e, 0x00e8a4b7,
+ /* bc */ 0xf0a79ca3, 0x00e8a582, 0x00e8a585, 0x00e8a589,
+ /* c0 */ 0xf0a79d92, 0x00e499a5, 0x00e8a5a2, 0x00e8a680,
+ /* c4 */ 0x00e8a689, 0x00e8a690, 0x00e8a69f, 0x00e8a6b0,
+ /* c8 */ 0x00e8a6b7, 0x00e8a796, 0x00e8a798, 0x00e8a7ab,
+ /* cc */ 0x00e49aa1, 0x00e8a7b1, 0x00e8a7b3, 0x00e8a7bd,
+ /* d0 */ 0x00e8a7bf, 0x00e49aaf, 0x00e8a891, 0x00e8a894,
+ /* d4 */ 0xf0a7a685, 0x00e8a8a1, 0x00e8a8b5, 0x00e8a8be,
+ /* d8 */ 0x00e8a985, 0x00e8a98d, 0x00e8a998, 0x00e8aaae,
+ /* dc */ 0x00e8aa90, 0x00e8aab7, 0x00e8aabe, 0x00e8ab97,
+ /* e0 */ 0x00e8abbc, 0xf0a7aa84, 0x00e8ac8a, 0x00e8ac85,
+ /* e4 */ 0x00e8ac8d, 0x00e8ac9c, 0x00e8ac9f, 0x00e8acad,
+ /* e8 */ 0x00e8ad83, 0x00e49c8c, 0x00e8ad91, 0x00e8ad9e,
+ /* ec */ 0x00e8adb6, 0x00e8adbf, 0x00e8ae81, 0x00e8ae8b,
+ /* f0 */ 0x00e8ae94, 0x00e8ae95, 0x00e8ae9c, 0x00e8ae9e,
+ /* f4 */ 0x00e8b0b9, 0xf0a7aeb3, 0x00e8b0bd, 0xf0a7aebe,
+ /* f8 */ 0xf0a7af87, 0x00e8b185, 0x00e8b187, 0x00e8b18f,
+ /* fc */ 0x00e8b194,
+
+ /*** Two byte table, leaf: faxx - offset 0x02b8d ***/
+
+ /* 40 */ 0x00e8b197, 0x00e8b1a9, 0x00e8b1ad, 0x00e8b1b3,
+ /* 44 */ 0xf0a7b2b8, 0x00e8b293, 0x00e8b292, 0x00e8b299,
+ /* 48 */ 0x00e49da4, 0x00e8b29b, 0x00e8b2a4, 0x00e8b396,
+ /* 4c */ 0x00e8b395, 0x00e8b399, 0xf0a7b6a0, 0x00e8b3b0,
+ /* 50 */ 0x00e8b3b1, 0xf0a7b890, 0x00e8b489, 0x00e8b48e,
+ /* 54 */ 0x00e8b5ac, 0x00e8b684, 0x00e8b695, 0x00e8b6a6,
+ /* 58 */ 0xf0a7beb7, 0x00e8b786, 0x00e8b788, 0x00e8b799,
+ /* 5c */ 0x00e8b7ac, 0x00e8b88c, 0x00e49fbd, 0x00e8b7bd,
+ /* 60 */ 0x00e8b886, 0xf0a8828a, 0x00e8b894, 0x00e8b896,
+ /* 64 */ 0x00e8b8a1, 0x00e8b8a2, 0x00e8b8a7, 0xf0a882bb,
+ /* 68 */ 0x00e4a096, 0x00e8b8b6, 0x00e8b8b9, 0x00e8b98b,
+ /* 6c */ 0x00e8b994, 0x00e8b9a2, 0x00e8b9ac, 0x00e8b9ad,
+ /* 70 */ 0x00e8b9af, 0x00e8ba98, 0x00e8ba9e, 0x00e8baae,
+ /* 74 */ 0x00e8bab3, 0x00e8bab5, 0x00e8bab6, 0x00e8babb,
+ /* 78 */ 0xf0a88a82, 0x00e8bb91, 0x00e8bb94, 0x00e4a18e,
+ /* 7c */ 0x00e8bbb9, 0xf0a88bb3, 0x00e8bc80, 0x00000000,
+ /* 80 */ 0x00e8bc88, 0x00e8bc97, 0x00e8bcab, 0x00e8bd80,
+ /* 84 */ 0x00e8bd8a, 0x00e8bd98, 0xf0a8908c, 0x00e8bea4,
+ /* 88 */ 0x00e8beb4, 0x00efa9a6, 0x00e8beb6, 0xf0a89195,
+ /* 8c */ 0x00e8bf81, 0x00e8bf86, 0x00efa8a4, 0x00e8bf8a,
+ /* 90 */ 0x00e8bf8d, 0x00e8bf93, 0x00e8bf95, 0x00e8bfa0,
+ /* 94 */ 0x00e8bfb1, 0x00e8bfb5, 0x00e8bfbb, 0x00e98082,
+ /* 98 */ 0x00e9808c, 0x00e980b7, 0xf0a895ab, 0x00e98183,
+ /* 9c */ 0x00e98184, 0x00e9819d, 0xf0a89788, 0xf0a89789,
+ /* a0 */ 0x00e98285, 0x00e9828c, 0x00e98290, 0x00e9989d,
+ /* a4 */ 0x00e982a1, 0x00e4a2b5, 0x00e982b0, 0x00e982b6,
+ /* a8 */ 0x00e98383, 0x00e98388, 0xf0a89b97, 0x00e9839c,
+ /* ac */ 0x00e9839f, 0xf0a89bba, 0x00e983b6, 0x00e983b2,
+ /* b0 */ 0x00e98480, 0x00e983ab, 0x00e983be, 0x00e983bf,
+ /* b4 */ 0x00e98484, 0x00e98486, 0x00e98498, 0x00e9849c,
+ /* b8 */ 0x00e9849e, 0x00e984b7, 0x00e984b9, 0x00e984ba,
+ /* bc */ 0x00e98586, 0x00e98587, 0x00e98597, 0x00e98599,
+ /* c0 */ 0x00e985a1, 0x00e985a4, 0x00e985b4, 0x00e985b9,
+ /* c4 */ 0x00e98685, 0x00e9868e, 0x00e986a8, 0x00e986ae,
+ /* c8 */ 0x00e986b3, 0x00e986b6, 0x00e98783, 0x00e98784,
+ /* cc */ 0x00e9879a, 0xf0a8a589, 0xf0a8a586, 0x00e987ac,
+ /* d0 */ 0x00e987ae, 0x00e98881, 0x00e9888a, 0x00e98896,
+ /* d4 */ 0x00e98897, 0xf0a8a5ab, 0x00e988b3, 0x00e98982,
+ /* d8 */ 0x00e98987, 0x00e9898a, 0x00e9898e, 0x00e98991,
+ /* dc */ 0x00e98996, 0x00e98999, 0x00e989a0, 0x00e989a1,
+ /* e0 */ 0x00e989a5, 0x00e989a7, 0x00e989a8, 0xf0a8a687,
+ /* e4 */ 0xf0a8a688, 0x00e989bc, 0x00e989bd, 0x00e989bf,
+ /* e8 */ 0x00e98a89, 0x00e98a8d, 0x00e98a97, 0x00e98a99,
+ /* ec */ 0x00e98a9f, 0x00e98aa7, 0x00e98aab, 0xf0a8a6ba,
+ /* f0 */ 0xf0a8a6bb, 0x00e98ab2, 0x00e98abf, 0x00e98b80,
+ /* f4 */ 0x00e98b86, 0x00e98b8e, 0x00e98b90, 0x00e98b97,
+ /* f8 */ 0x00e98b99, 0x00e98ba5, 0x00e98ba7, 0x00e98c91,
+ /* fc */ 0xf0a8a89e,
+
+ /*** Two byte table, leaf: fbxx - offset 0x02c4a ***/
+
+ /* 40 */ 0xf0a8a8a9, 0x00e98bb7, 0x00e98bb9, 0x00e98bbb,
+ /* 44 */ 0x00e98c82, 0x00e98c8d, 0x00e98c95, 0x00e98c9d,
+ /* 48 */ 0x00e98c9e, 0x00e98ca7, 0x00e98ca9, 0xf0a8a9b1,
+ /* 4c */ 0xf0a8a983, 0x00e98d87, 0x00e98d91, 0x00e98d97,
+ /* 50 */ 0x00e98d9a, 0x00e98dab, 0x00e98db1, 0x00e98db3,
+ /* 54 */ 0x00e98ea1, 0xf0a8aa99, 0xf0a8ab8d, 0x00e98e88,
+ /* 58 */ 0x00e98e8b, 0x00e98e8f, 0x00e98e9e, 0x00e98fb5,
+ /* 5c */ 0xf0a8aba4, 0xf0a8ab9d, 0x00e98fb1, 0x00e98f81,
+ /* 60 */ 0x00e98f87, 0x00e98f9c, 0x00e98fa2, 0x00e98fa7,
+ /* 64 */ 0x00e99089, 0x00e9908f, 0x00e99096, 0x00e99097,
+ /* 68 */ 0x00e98fbb, 0x00e990b2, 0x00e990b4, 0x00e990bb,
+ /* 6c */ 0x00e99185, 0xf0a8af81, 0xf0a8afaf, 0x00e991ad,
+ /* 70 */ 0x00e991af, 0x00e995b8, 0x00e995b9, 0x00e99686,
+ /* 74 */ 0x00e9968c, 0x00e9968d, 0xf0a8b490, 0x00e996ab,
+ /* 78 */ 0x00e996b4, 0xf0a8b5b1, 0x00e99788, 0xf0a8b7bb,
+ /* 7c */ 0xf0a8b89f, 0x00e998ac, 0x00e998b3, 0x00000000,
+ /* 80 */ 0x00e998b4, 0xf0a8b8b6, 0x00e998bc, 0x00e99981,
+ /* 84 */ 0x00e999a1, 0xf0a8ba89, 0x00e99a82, 0xf0a8bbab,
+ /* 88 */ 0x00e99a9a, 0xf0a8bcb2, 0x00e4a7a7, 0x00e99aa9,
+ /* 8c */ 0x00e99aaf, 0x00e99ab3, 0x00e99aba, 0x00e99abd,
+ /* 90 */ 0x00e4a7ba, 0xf0a8bfb8, 0x00e99b98, 0x00e99b9a,
+ /* 94 */ 0x00e99b9d, 0x00e4a884, 0x00e99c94, 0x00e99ca3,
+ /* 98 */ 0x00e4a8a9, 0x00e99cb6, 0x00e99d81, 0x00e99d87,
+ /* 9c */ 0x00e99d95, 0x00e99d97, 0x00e99d9b, 0x00e99daa,
+ /* a0 */ 0xf0a98aa0, 0xf0a98ab1, 0x00e99e96, 0x00e99e9a,
+ /* a4 */ 0x00e99e9e, 0x00e99ea2, 0x00e99eb1, 0x00e99eb2,
+ /* a8 */ 0x00e99ebe, 0x00e99f8c, 0x00e99f91, 0x00e99f94,
+ /* ac */ 0x00e99f98, 0x00e99f99, 0x00e99fa1, 0x00e99fb1,
+ /* b0 */ 0x00e9a084, 0x00e9a08d, 0x00e9a08e, 0x00e9a094,
+ /* b4 */ 0x00e9a096, 0x00e4aabc, 0xf0a99290, 0x00e9a0a3,
+ /* b8 */ 0x00e9a0b2, 0x00e9a0b3, 0x00e9a0a5, 0x00e9a187,
+ /* bc */ 0x00e9a1a6, 0x00e9a2ab, 0x00e9a2ad, 0x00e9a2b0,
+ /* c0 */ 0xf0a9978f, 0x00e9a2b7, 0x00e9a2b8, 0x00e9a2bb,
+ /* c4 */ 0x00e9a2bc, 0x00e9a2bf, 0x00e9a382, 0x00e9a387,
+ /* c8 */ 0x00e9a38b, 0x00e9a3a0, 0xf0a999bf, 0x00e9a3a1,
+ /* cc */ 0x00e9a3a3, 0x00e9a3a5, 0x00e9a3aa, 0x00e9a3b0,
+ /* d0 */ 0x00e9a3b1, 0x00e9a3b3, 0x00e9a488, 0x00e4acbb,
+ /* d4 */ 0xf0a99bb0, 0x00e9a496, 0x00e9a497, 0xf0a99c99,
+ /* d8 */ 0x00e9a49a, 0x00e9a49b, 0x00e9a49c, 0xf0a99d90,
+ /* dc */ 0x00e9a4b1, 0x00e9a4b2, 0x00e9a4b3, 0x00e9a4ba,
+ /* e0 */ 0x00e9a4bb, 0x00e9a4bc, 0x00e9a580, 0x00e9a581,
+ /* e4 */ 0x00e9a586, 0x00e9a58d, 0x00e9a58e, 0x00e9a59c,
+ /* e8 */ 0x00e9a59f, 0x00e9a5a0, 0x00e9a6a3, 0x00e9a6a6,
+ /* ec */ 0x00e9a6b9, 0x00e9a6bd, 0x00e9a6bf, 0x00e9a783,
+ /* f0 */ 0x00e9a789, 0x00e9a794, 0x00e9a799, 0x00e9a79e,
+ /* f4 */ 0xf0a9a386, 0x00e9a7b0, 0x00e9a7b9, 0x00e9a7bc,
+ /* f8 */ 0x00e9a88a, 0x00e9a891, 0x00e9a896, 0x00e9a89a,
+ /* fc */ 0x00e9a8a0,
+
+ /*** Two byte table, leaf: fcxx - offset 0x02d07 ***/
+
+ /* 40 */ 0x00e9a8b1, 0x00e9a8b6, 0x00e9a984, 0x00e9a98c,
+ /* 44 */ 0x00e9a998, 0x00e4af82, 0x00e9aaaf, 0x00e4af8a,
+ /* 48 */ 0x00e9aab7, 0x00e4af92, 0x00e9aab9, 0xf0a9a9b2,
+ /* 4c */ 0x00e9ab86, 0x00e9ab90, 0x00e9ab92, 0x00e9ab95,
+ /* 50 */ 0x00e4afa8, 0x00e9ab9c, 0x00e9aba0, 0x00e9aba5,
+ /* 54 */ 0x00e9aba9, 0x00e9ac83, 0x00e9ac8c, 0x00e9ac90,
+ /* 58 */ 0x00e9ac92, 0x00e9ac96, 0x00e9ac9c, 0x00e9acab,
+ /* 5c */ 0x00e9acb3, 0x00e9acbd, 0x00e4b0a0, 0x00e9ad8b,
+ /* 60 */ 0x00e9ada3, 0x00e9ada5, 0x00e9adab, 0x00e9adac,
+ /* 64 */ 0x00e9adb3, 0x00e9adb6, 0x00e9adb7, 0x00e9aea6,
+ /* 68 */ 0x00e9aeac, 0x00e9aeb1, 0xf0a9b79b, 0xf0a9b8bd,
+ /* 6c */ 0x00e9aeb2, 0x00e9aeb8, 0x00e9aebe, 0x00e9af87,
+ /* 70 */ 0x00e9afb3, 0x00e9af98, 0x00e9af9d, 0x00e9afa7,
+ /* 74 */ 0x00e9afaa, 0x00e9afab, 0x00e9afaf, 0x00e9afae,
+ /* 78 */ 0xf0a9b895, 0x00e9afba, 0xf0a9ba8a, 0x00e9afb7,
+ /* 7c */ 0xf0a9b989, 0x00e9b096, 0x00e9b098, 0x00000000,
+ /* 80 */ 0x00e9b099, 0x00e9b09a, 0x00e9b09d, 0x00e9b0a2,
+ /* 84 */ 0x00e9b0a7, 0x00e9b0a9, 0x00e9b0aa, 0xf0a9bb84,
+ /* 88 */ 0x00e9b0b1, 0x00e9b0b6, 0x00e9b0b7, 0x00e9b185,
+ /* 8c */ 0x00e9b19c, 0xf0a9bba9, 0x00e9b189, 0x00e9b18a,
+ /* 90 */ 0xf0a9bb9b, 0x00e9b194, 0x00e9b198, 0x00e9b19b,
+ /* 94 */ 0x00e9b19d, 0x00e9b19f, 0x00e9b1a9, 0x00e9b1aa,
+ /* 98 */ 0x00e9b1ab, 0x00e9b1ad, 0x00e9b1ae, 0x00e9b1b0,
+ /* 9c */ 0x00e9b1b2, 0x00e9b1b5, 0x00e9b1ba, 0x00e9b3a6,
+ /* a0 */ 0x00e9b3b2, 0x00e9b48b, 0x00e9b482, 0xf0a9bf8e,
+ /* a4 */ 0x00e9b491, 0x00e9b497, 0x00e9b498, 0xf0aa80af,
+ /* a8 */ 0x00e4b384, 0xf0aa809a, 0x00e9b4b2, 0x00e4b391,
+ /* ac */ 0x00e9b582, 0x00e9b58a, 0x00e9b59f, 0x00e9b5a2,
+ /* b0 */ 0xf0aa83b9, 0x00e9b5a9, 0x00e9b5ab, 0xf0aa8282,
+ /* b4 */ 0x00e9b5b3, 0x00e9b5b6, 0x00e9b5b7, 0x00e9b5be,
+ /* b8 */ 0x00e9b684, 0x00e9b68d, 0x00e9b699, 0x00e9b6a1,
+ /* bc */ 0x00e9b6bf, 0x00e9b6b5, 0x00e9b6b9, 0x00e9b6bd,
+ /* c0 */ 0x00e9b783, 0x00e9b787, 0x00e9b789, 0x00e9b796,
+ /* c4 */ 0x00e9b79a, 0x00e9b79f, 0x00e9b7a0, 0x00e9b7a3,
+ /* c8 */ 0x00e9b7b4, 0x00e4b487, 0x00e9b88a, 0x00e9b882,
+ /* cc */ 0x00e9b88d, 0x00e9b899, 0x00e9b89c, 0x00e9b89d,
+ /* d0 */ 0x00e9b9bb, 0xf0a28898, 0x00e9ba80, 0x00e9ba85,
+ /* d4 */ 0x00e9ba9b, 0x00e9baa8, 0xf0aa8e8c, 0x00e9babd,
+ /* d8 */ 0xf0aa90b7, 0x00e9bb9f, 0x00e9bba7, 0x00e9bbae,
+ /* dc */ 0x00e9bbbf, 0x00e9bc82, 0x00e4b5b7, 0x00e9bc83,
+ /* e0 */ 0x00e9bc97, 0x00e9bc99, 0x00e9bcaf, 0x00e9bcb7,
+ /* e4 */ 0x00e9bcba, 0x00e9bcbd, 0x00e9bd81, 0x00e9bd85,
+ /* e8 */ 0x00e9bd86, 0x00e9bd93, 0x00e9bd95, 0x00e9bd98,
+ /* ec */ 0xf0aa97b1, 0x00e9bd9d, 0xf0aa9882, 0x00e9bda9,
+ /* f0 */ 0xf0aa989a, 0x00e9bdad, 0x00e9bdb0, 0x00e9bdb5,
+ /* f4 */ 0xf0aa9ab2, 0x00000000, 0x00000000, 0x00000000,
+ /* f8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* fc */ 0x00000000
+};
+
+/* Combined character map */
+static const pg_local_to_utf_combined LUmapSHIFT_JIS_2004_combined[25] = {
+ {0x82f5, 0x00e3818b, 0x00e3829a}, /* U+304B+309A [2000] */
+ {0x82f6, 0x00e3818d, 0x00e3829a}, /* U+304D+309A [2000] */
+ {0x82f7, 0x00e3818f, 0x00e3829a}, /* U+304F+309A [2000] */
+ {0x82f8, 0x00e38191, 0x00e3829a}, /* U+3051+309A [2000] */
+ {0x82f9, 0x00e38193, 0x00e3829a}, /* U+3053+309A [2000] */
+ {0x8397, 0x00e382ab, 0x00e3829a}, /* U+30AB+309A [2000] */
+ {0x8398, 0x00e382ad, 0x00e3829a}, /* U+30AD+309A [2000] */
+ {0x8399, 0x00e382af, 0x00e3829a}, /* U+30AF+309A [2000] */
+ {0x839a, 0x00e382b1, 0x00e3829a}, /* U+30B1+309A [2000] */
+ {0x839b, 0x00e382b3, 0x00e3829a}, /* U+30B3+309A [2000] */
+ {0x839c, 0x00e382bb, 0x00e3829a}, /* U+30BB+309A [2000] */
+ {0x839d, 0x00e38384, 0x00e3829a}, /* U+30C4+309A [2000] */
+ {0x839e, 0x00e38388, 0x00e3829a}, /* U+30C8+309A [2000] */
+ {0x83f6, 0x00e387b7, 0x00e3829a}, /* U+31F7+309A [2000] */
+ {0x8663, 0x0000c3a6, 0x0000cc80}, /* U+00E6+0300 [2000] */
+ {0x8667, 0x0000c994, 0x0000cc80}, /* U+0254+0300 [2000] */
+ {0x8668, 0x0000c994, 0x0000cc81}, /* U+0254+0301 [2000] */
+ {0x8669, 0x0000ca8c, 0x0000cc80}, /* U+028C+0300 [2000] */
+ {0x866a, 0x0000ca8c, 0x0000cc81}, /* U+028C+0301 [2000] */
+ {0x866b, 0x0000c999, 0x0000cc80}, /* U+0259+0300 [2000] */
+ {0x866c, 0x0000c999, 0x0000cc81}, /* U+0259+0301 [2000] */
+ {0x866d, 0x0000c99a, 0x0000cc80}, /* U+025A+0300 [2000] */
+ {0x866e, 0x0000c99a, 0x0000cc81}, /* U+025A+0301 [2000] */
+ {0x8685, 0x0000cba9, 0x0000cba5}, /* U+02E9+02E5 [2000] */
+ {0x8686, 0x0000cba5, 0x0000cba9} /* U+02E5+02E9 [2000] */
+};
diff --git a/src/backend/utils/mb/Unicode/sjis-0213-2004-std.txt b/src/backend/utils/mb/Unicode/sjis-0213-2004-std.txt
new file mode 100644
index 0000000..971de8c
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/sjis-0213-2004-std.txt
@@ -0,0 +1,11549 @@
+## Shift_JIS-2004 (JIS X 0213:2004 Appendix 1) vs Unicode mapping table
+##
+## Date: 3 May 2009
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+## Note:
+## [1983] JIS codepoint defined by JIS X 0208-1983
+## [1990] JIS codepoint defined by JIS X 0208-1990
+## [2000] JIS codepoint defined by JIS X 0213:2000
+## [2004] JIS codepoint defined by JIS X 0213:2004
+## [Unicode3.1] UCS codepoint defined by Unicode 3.1
+## [Unicode3.2] UCS codepoint defined by Unicode 3.2
+## Fullwidth UCS fullwidth form (U+Fxxx)
+## Windows Windows (CP932) mapping
+## Some 0213 character can't represent by one UCS character.
+## In this table, such characters are described as 'U+xxxx+xxxx'.
+##
+## JIS Unicode Name Note
+0x00 U+0000 # <control>
+0x01 U+0001 # <control>
+0x02 U+0002 # <control>
+0x03 U+0003 # <control>
+0x04 U+0004 # <control>
+0x05 U+0005 # <control>
+0x06 U+0006 # <control>
+0x07 U+0007 # <control>
+0x08 U+0008 # <control>
+0x09 U+0009 # <control>
+0x0A U+000A # <control>
+0x0B U+000B # <control>
+0x0C U+000C # <control>
+0x0D U+000D # <control>
+0x0E U+000E # <control>
+0x0F U+000F # <control>
+0x10 U+0010 # <control>
+0x11 U+0011 # <control>
+0x12 U+0012 # <control>
+0x13 U+0013 # <control>
+0x14 U+0014 # <control>
+0x15 U+0015 # <control>
+0x16 U+0016 # <control>
+0x17 U+0017 # <control>
+0x18 U+0018 # <control>
+0x19 U+0019 # <control>
+0x1A U+001A # <control>
+0x1B U+001B # <control>
+0x1C U+001C # <control>
+0x1D U+001D # <control>
+0x1E U+001E # <control>
+0x1F U+001F # <control>
+0x20 U+0020 # SPACE
+0x21 U+0021 # EXCLAMATION MARK
+0x22 U+0022 # QUOTATION MARK
+0x23 U+0023 # NUMBER SIGN
+0x24 U+0024 # DOLLAR SIGN
+0x25 U+0025 # PERCENT SIGN
+0x26 U+0026 # AMPERSAND
+0x27 U+0027 # APOSTROPHE
+0x28 U+0028 # LEFT PARENTHESIS
+0x29 U+0029 # RIGHT PARENTHESIS
+0x2A U+002A # ASTERISK
+0x2B U+002B # PLUS SIGN
+0x2C U+002C # COMMA
+0x2D U+002D # HYPHEN-MINUS
+0x2E U+002E # FULL STOP
+0x2F U+002F # SOLIDUS
+0x30 U+0030 # DIGIT ZERO
+0x31 U+0031 # DIGIT ONE
+0x32 U+0032 # DIGIT TWO
+0x33 U+0033 # DIGIT THREE
+0x34 U+0034 # DIGIT FOUR
+0x35 U+0035 # DIGIT FIVE
+0x36 U+0036 # DIGIT SIX
+0x37 U+0037 # DIGIT SEVEN
+0x38 U+0038 # DIGIT EIGHT
+0x39 U+0039 # DIGIT NINE
+0x3A U+003A # COLON
+0x3B U+003B # SEMICOLON
+0x3C U+003C # LESS-THAN SIGN
+0x3D U+003D # EQUALS SIGN
+0x3E U+003E # GREATER-THAN SIGN
+0x3F U+003F # QUESTION MARK
+0x40 U+0040 # COMMERCIAL AT
+0x41 U+0041 # LATIN CAPITAL LETTER A
+0x42 U+0042 # LATIN CAPITAL LETTER B
+0x43 U+0043 # LATIN CAPITAL LETTER C
+0x44 U+0044 # LATIN CAPITAL LETTER D
+0x45 U+0045 # LATIN CAPITAL LETTER E
+0x46 U+0046 # LATIN CAPITAL LETTER F
+0x47 U+0047 # LATIN CAPITAL LETTER G
+0x48 U+0048 # LATIN CAPITAL LETTER H
+0x49 U+0049 # LATIN CAPITAL LETTER I
+0x4A U+004A # LATIN CAPITAL LETTER J
+0x4B U+004B # LATIN CAPITAL LETTER K
+0x4C U+004C # LATIN CAPITAL LETTER L
+0x4D U+004D # LATIN CAPITAL LETTER M
+0x4E U+004E # LATIN CAPITAL LETTER N
+0x4F U+004F # LATIN CAPITAL LETTER O
+0x50 U+0050 # LATIN CAPITAL LETTER P
+0x51 U+0051 # LATIN CAPITAL LETTER Q
+0x52 U+0052 # LATIN CAPITAL LETTER R
+0x53 U+0053 # LATIN CAPITAL LETTER S
+0x54 U+0054 # LATIN CAPITAL LETTER T
+0x55 U+0055 # LATIN CAPITAL LETTER U
+0x56 U+0056 # LATIN CAPITAL LETTER V
+0x57 U+0057 # LATIN CAPITAL LETTER W
+0x58 U+0058 # LATIN CAPITAL LETTER X
+0x59 U+0059 # LATIN CAPITAL LETTER Y
+0x5A U+005A # LATIN CAPITAL LETTER Z
+0x5B U+005B # LEFT SQUARE BRACKET
+0x5C U+00A5 # YEN SIGN
+0x5D U+005D # RIGHT SQUARE BRACKET
+0x5E U+005E # CIRCUMFLEX ACCENT
+0x5F U+005F # LOW LINE
+0x60 U+0060 # GRAVE ACCENT
+0x61 U+0061 # LATIN SMALL LETTER A
+0x62 U+0062 # LATIN SMALL LETTER B
+0x63 U+0063 # LATIN SMALL LETTER C
+0x64 U+0064 # LATIN SMALL LETTER D
+0x65 U+0065 # LATIN SMALL LETTER E
+0x66 U+0066 # LATIN SMALL LETTER F
+0x67 U+0067 # LATIN SMALL LETTER G
+0x68 U+0068 # LATIN SMALL LETTER H
+0x69 U+0069 # LATIN SMALL LETTER I
+0x6A U+006A # LATIN SMALL LETTER J
+0x6B U+006B # LATIN SMALL LETTER K
+0x6C U+006C # LATIN SMALL LETTER L
+0x6D U+006D # LATIN SMALL LETTER M
+0x6E U+006E # LATIN SMALL LETTER N
+0x6F U+006F # LATIN SMALL LETTER O
+0x70 U+0070 # LATIN SMALL LETTER P
+0x71 U+0071 # LATIN SMALL LETTER Q
+0x72 U+0072 # LATIN SMALL LETTER R
+0x73 U+0073 # LATIN SMALL LETTER S
+0x74 U+0074 # LATIN SMALL LETTER T
+0x75 U+0075 # LATIN SMALL LETTER U
+0x76 U+0076 # LATIN SMALL LETTER V
+0x77 U+0077 # LATIN SMALL LETTER W
+0x78 U+0078 # LATIN SMALL LETTER X
+0x79 U+0079 # LATIN SMALL LETTER Y
+0x7A U+007A # LATIN SMALL LETTER Z
+0x7B U+007B # LEFT CURLY BRACKET
+0x7C U+007C # VERTICAL LINE
+0x7D U+007D # RIGHT CURLY BRACKET
+0x7E U+203E # OVERLINE
+0x7F U+007F # <control>
+0x80 # <reserved>
+0x81 # <doublebytes>
+0x82 # <doublebytes>
+0x83 # <doublebytes>
+0x84 # <doublebytes>
+0x85 # <doublebytes>
+0x86 # <doublebytes>
+0x87 # <doublebytes>
+0x88 # <doublebytes>
+0x89 # <doublebytes>
+0x8A # <doublebytes>
+0x8B # <doublebytes>
+0x8C # <doublebytes>
+0x8D # <doublebytes>
+0x8E # <doublebytes>
+0x8F # <doublebytes>
+0x90 # <doublebytes>
+0x91 # <doublebytes>
+0x92 # <doublebytes>
+0x93 # <doublebytes>
+0x94 # <doublebytes>
+0x95 # <doublebytes>
+0x96 # <doublebytes>
+0x97 # <doublebytes>
+0x98 # <doublebytes>
+0x99 # <doublebytes>
+0x9A # <doublebytes>
+0x9B # <doublebytes>
+0x9C # <doublebytes>
+0x9D # <doublebytes>
+0x9E # <doublebytes>
+0x9F # <doublebytes>
+0xA0 # <reserved>
+0xA1 U+FF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 U+FF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 U+FF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 U+FF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 U+FF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 U+FF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 U+FF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 U+FF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 U+FF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA U+FF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB U+FF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC U+FF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD U+FF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE U+FF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF U+FF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 U+FF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 U+FF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 U+FF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 U+FF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 U+FF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 U+FF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 U+FF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 U+FF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 U+FF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 U+FF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA U+FF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB U+FF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC U+FF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD U+FF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE U+FF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF U+FF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 U+FF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 U+FF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 U+FF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 U+FF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 U+FF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 U+FF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 U+FF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 U+FF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 U+FF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 U+FF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA U+FF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB U+FF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC U+FF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD U+FF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE U+FF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF U+FF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 U+FF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 U+FF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 U+FF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 U+FF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 U+FF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 U+FF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 U+FF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 U+FF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 U+FF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 U+FF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA U+FF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB U+FF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC U+FF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD U+FF9D # HALFWIDTH KATAKANA LETTER N
+0xDE U+FF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF U+FF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0 # <doublebytes>
+0xE1 # <doublebytes>
+0xE2 # <doublebytes>
+0xE3 # <doublebytes>
+0xE4 # <doublebytes>
+0xE5 # <doublebytes>
+0xE6 # <doublebytes>
+0xE7 # <doublebytes>
+0xE8 # <doublebytes>
+0xE9 # <doublebytes>
+0xEA # <doublebytes>
+0xEB # <doublebytes>
+0xEC # <doublebytes>
+0xED # <doublebytes>
+0xEE # <doublebytes>
+0xEF # <doublebytes>
+0xF0 # <doublebytes>
+0xF1 # <doublebytes>
+0xF2 # <doublebytes>
+0xF3 # <doublebytes>
+0xF4 # <doublebytes>
+0xF5 # <doublebytes>
+0xF6 # <doublebytes>
+0xF7 # <doublebytes>
+0xF8 # <doublebytes>
+0xF9 # <doublebytes>
+0xFA # <doublebytes>
+0xFB # <doublebytes>
+0xFC # <doublebytes>
+0xFD # <reserved>
+0xFE # <reserved>
+0xFF # <reserved>
+0x8140 U+3000 # IDEOGRAPHIC SPACE
+0x8141 U+3001 # IDEOGRAPHIC COMMA
+0x8142 U+3002 # IDEOGRAPHIC FULL STOP
+0x8143 U+FF0C # FULLWIDTH COMMA
+0x8144 U+FF0E # FULLWIDTH FULL STOP
+0x8145 U+30FB # KATAKANA MIDDLE DOT
+0x8146 U+FF1A # FULLWIDTH COLON
+0x8147 U+FF1B # FULLWIDTH SEMICOLON
+0x8148 U+FF1F # FULLWIDTH QUESTION MARK
+0x8149 U+FF01 # FULLWIDTH EXCLAMATION MARK
+0x814A U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C U+00B4 # ACUTE ACCENT
+0x814D U+FF40 # FULLWIDTH GRAVE ACCENT
+0x814E U+00A8 # DIAERESIS
+0x814F U+FF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 U+FFE3 # FULLWIDTH MACRON
+0x8151 U+FF3F # FULLWIDTH LOW LINE
+0x8152 U+30FD # KATAKANA ITERATION MARK
+0x8153 U+30FE # KATAKANA VOICED ITERATION MARK
+0x8154 U+309D # HIRAGANA ITERATION MARK
+0x8155 U+309E # HIRAGANA VOICED ITERATION MARK
+0x8156 U+3003 # DITTO MARK
+0x8157 U+4EDD # <cjk>
+0x8158 U+3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 U+3006 # IDEOGRAPHIC CLOSING MARK
+0x815A U+3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C U+2014 # EM DASH Windows: U+2015
+0x815D U+2010 # HYPHEN
+0x815E U+FF0F # FULLWIDTH SOLIDUS
+0x815F U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C
+0x8160 U+301C # WAVE DASH Windows: U+FF5E
+0x8161 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225
+0x8162 U+FF5C # FULLWIDTH VERTICAL LINE
+0x8163 U+2026 # HORIZONTAL ELLIPSIS
+0x8164 U+2025 # TWO DOT LEADER
+0x8165 U+2018 # LEFT SINGLE QUOTATION MARK
+0x8166 U+2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 U+201C # LEFT DOUBLE QUOTATION MARK
+0x8168 U+201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 U+FF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A U+FF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B U+3014 # LEFT TORTOISE SHELL BRACKET
+0x816C U+3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D U+FF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E U+FF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F U+FF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 U+FF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 U+3008 # LEFT ANGLE BRACKET
+0x8172 U+3009 # RIGHT ANGLE BRACKET
+0x8173 U+300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 U+300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 U+300C # LEFT CORNER BRACKET
+0x8176 U+300D # RIGHT CORNER BRACKET
+0x8177 U+300E # LEFT WHITE CORNER BRACKET
+0x8178 U+300F # RIGHT WHITE CORNER BRACKET
+0x8179 U+3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A U+3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B U+FF0B # FULLWIDTH PLUS SIGN
+0x817C U+2212 # MINUS SIGN Windows: U+FF0D
+0x817D U+00B1 # PLUS-MINUS SIGN
+0x817E U+00D7 # MULTIPLICATION SIGN
+0x8180 U+00F7 # DIVISION SIGN
+0x8181 U+FF1D # FULLWIDTH EQUALS SIGN
+0x8182 U+2260 # NOT EQUAL TO
+0x8183 U+FF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 U+FF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 U+2266 # LESS-THAN OVER EQUAL TO
+0x8186 U+2267 # GREATER-THAN OVER EQUAL TO
+0x8187 U+221E # INFINITY
+0x8188 U+2234 # THEREFORE
+0x8189 U+2642 # MALE SIGN
+0x818A U+2640 # FEMALE SIGN
+0x818B U+00B0 # DEGREE SIGN
+0x818C U+2032 # PRIME
+0x818D U+2033 # DOUBLE PRIME
+0x818E U+2103 # DEGREE CELSIUS
+0x818F U+FFE5 # FULLWIDTH YEN SIGN
+0x8190 U+FF04 # FULLWIDTH DOLLAR SIGN
+0x8191 U+00A2 # CENT SIGN Windows: U+FFE0
+0x8192 U+00A3 # POUND SIGN Windows: U+FFE1
+0x8193 U+FF05 # FULLWIDTH PERCENT SIGN
+0x8194 U+FF03 # FULLWIDTH NUMBER SIGN
+0x8195 U+FF06 # FULLWIDTH AMPERSAND
+0x8196 U+FF0A # FULLWIDTH ASTERISK
+0x8197 U+FF20 # FULLWIDTH COMMERCIAL AT
+0x8198 U+00A7 # SECTION SIGN
+0x8199 U+2606 # WHITE STAR
+0x819A U+2605 # BLACK STAR
+0x819B U+25CB # WHITE CIRCLE
+0x819C U+25CF # BLACK CIRCLE
+0x819D U+25CE # BULLSEYE
+0x819E U+25C7 # WHITE DIAMOND
+0x819F U+25C6 # BLACK DIAMOND
+0x81A0 U+25A1 # WHITE SQUARE
+0x81A1 U+25A0 # BLACK SQUARE
+0x81A2 U+25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 U+25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 U+25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 U+25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 U+203B # REFERENCE MARK
+0x81A7 U+3012 # POSTAL MARK
+0x81A8 U+2192 # RIGHTWARDS ARROW
+0x81A9 U+2190 # LEFTWARDS ARROW
+0x81AA U+2191 # UPWARDS ARROW
+0x81AB U+2193 # DOWNWARDS ARROW
+0x81AC U+3013 # GETA MARK
+0x81AD U+FF07 # FULLWIDTH APOSTROPHE [2000]
+0x81AE U+FF02 # FULLWIDTH QUOTATION MARK [2000]
+0x81AF U+FF0D # FULLWIDTH HYPHEN-MINUS [2000]
+0x81B0 U+007E # TILDE [2000] Fullwidth: U+FF5E
+0x81B1 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000]
+0x81B2 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000]
+0x81B3 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000]
+0x81B4 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2]
+0x81B5 U+303C # MASU MARK [2000] [Unicode3.2]
+0x81B6 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2]
+0x81B7 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2]
+0x81B8 U+2208 # ELEMENT OF [1983]
+0x81B9 U+220B # CONTAINS AS MEMBER [1983]
+0x81BA U+2286 # SUBSET OF OR EQUAL TO [1983]
+0x81BB U+2287 # SUPERSET OF OR EQUAL TO [1983]
+0x81BC U+2282 # SUBSET OF [1983]
+0x81BD U+2283 # SUPERSET OF [1983]
+0x81BE U+222A # UNION [1983]
+0x81BF U+2229 # INTERSECTION [1983]
+0x81C0 U+2284 # NOT A SUBSET OF [2000]
+0x81C1 U+2285 # NOT A SUPERSET OF [2000]
+0x81C2 U+228A # SUBSET OF WITH NOT EQUAL TO [2000]
+0x81C3 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000]
+0x81C4 U+2209 # NOT AN ELEMENT OF [2000]
+0x81C5 U+2205 # EMPTY SET [2000]
+0x81C6 U+2305 # PROJECTIVE [2000]
+0x81C7 U+2306 # PERSPECTIVE [2000]
+0x81C8 U+2227 # LOGICAL AND [1983]
+0x81C9 U+2228 # LOGICAL OR [1983]
+0x81CA U+00AC # NOT SIGN [1983] Windows: U+FFE2
+0x81CB U+21D2 # RIGHTWARDS DOUBLE ARROW [1983]
+0x81CC U+21D4 # LEFT RIGHT DOUBLE ARROW [1983]
+0x81CD U+2200 # FOR ALL [1983]
+0x81CE U+2203 # THERE EXISTS [1983]
+0x81CF U+2295 # CIRCLED PLUS [2000]
+0x81D0 U+2296 # CIRCLED MINUS [2000]
+0x81D1 U+2297 # CIRCLED TIMES [2000]
+0x81D2 U+2225 # PARALLEL TO [2000]
+0x81D3 U+2226 # NOT PARALLEL TO [2000]
+0x81D4 U+FF5F # FULLWIDTH LEFT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D5 U+FF60 # FULLWIDTH RIGHT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D6 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D7 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D8 U+3016 # LEFT WHITE LENTICULAR BRACKET [2000]
+0x81D9 U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000]
+0x81DA U+2220 # ANGLE [1983]
+0x81DB U+22A5 # UP TACK [1983]
+0x81DC U+2312 # ARC [1983]
+0x81DD U+2202 # PARTIAL DIFFERENTIAL [1983]
+0x81DE U+2207 # NABLA [1983]
+0x81DF U+2261 # IDENTICAL TO [1983]
+0x81E0 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983]
+0x81E1 U+226A # MUCH LESS-THAN [1983]
+0x81E2 U+226B # MUCH GREATER-THAN [1983]
+0x81E3 U+221A # SQUARE ROOT [1983]
+0x81E4 U+223D # REVERSED TILDE [1983]
+0x81E5 U+221D # PROPORTIONAL TO [1983]
+0x81E6 U+2235 # BECAUSE [1983]
+0x81E7 U+222B # INTEGRAL [1983]
+0x81E8 U+222C # DOUBLE INTEGRAL [1983]
+0x81E9 U+2262 # NOT IDENTICAL TO [2000]
+0x81EA U+2243 # ASYMPTOTICALLY EQUAL TO [2000]
+0x81EB U+2245 # APPROXIMATELY EQUAL TO [2000]
+0x81EC U+2248 # ALMOST EQUAL TO [2000]
+0x81ED U+2276 # LESS-THAN OR GREATER-THAN [2000]
+0x81EE U+2277 # GREATER-THAN OR LESS-THAN [2000]
+0x81EF U+2194 # LEFT RIGHT ARROW [2000]
+0x81F0 U+212B # ANGSTROM SIGN [1983]
+0x81F1 U+2030 # PER MILLE SIGN [1983]
+0x81F2 U+266F # MUSIC SHARP SIGN [1983]
+0x81F3 U+266D # MUSIC FLAT SIGN [1983]
+0x81F4 U+266A # EIGHTH NOTE [1983]
+0x81F5 U+2020 # DAGGER [1983]
+0x81F6 U+2021 # DOUBLE DAGGER [1983]
+0x81F7 U+00B6 # PILCROW SIGN [1983]
+0x81F8 U+266E # MUSIC NATURAL SIGN [2000]
+0x81F9 U+266B # BEAMED EIGHTH NOTES [2000]
+0x81FA U+266C # BEAMED SIXTEENTH NOTES [2000]
+0x81FB U+2669 # QUARTER NOTE [2000]
+0x81FC U+25EF # LARGE CIRCLE [1983]
+0x8240 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000]
+0x8241 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000]
+0x8242 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000]
+0x8243 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000]
+0x8244 U+2197 # NORTH EAST ARROW [2000]
+0x8245 U+2198 # SOUTH EAST ARROW [2000]
+0x8246 U+2196 # NORTH WEST ARROW [2000]
+0x8247 U+2199 # SOUTH WEST ARROW [2000]
+0x8248 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000]
+0x8249 U+21E8 # RIGHTWARDS WHITE ARROW [2000]
+0x824A U+21E6 # LEFTWARDS WHITE ARROW [2000]
+0x824B U+21E7 # UPWARDS WHITE ARROW [2000]
+0x824C U+21E9 # DOWNWARDS WHITE ARROW [2000]
+0x824D U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2]
+0x824E U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2]
+0x824F U+FF10 # FULLWIDTH DIGIT ZERO
+0x8250 U+FF11 # FULLWIDTH DIGIT ONE
+0x8251 U+FF12 # FULLWIDTH DIGIT TWO
+0x8252 U+FF13 # FULLWIDTH DIGIT THREE
+0x8253 U+FF14 # FULLWIDTH DIGIT FOUR
+0x8254 U+FF15 # FULLWIDTH DIGIT FIVE
+0x8255 U+FF16 # FULLWIDTH DIGIT SIX
+0x8256 U+FF17 # FULLWIDTH DIGIT SEVEN
+0x8257 U+FF18 # FULLWIDTH DIGIT EIGHT
+0x8258 U+FF19 # FULLWIDTH DIGIT NINE
+0x8259 U+29BF # CIRCLED BULLET [2000] [Unicode3.2]
+0x825A U+25C9 # FISHEYE [2000]
+0x825B U+303D # PART ALTERNATION MARK [2000] [Unicode3.2]
+0x825C U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2]
+0x825D U+FE45 # SESAME DOT [2000] [Unicode3.2]
+0x825E U+25E6 # WHITE BULLET [2000]
+0x825F U+2022 # BULLET [2000]
+0x8260 U+FF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 U+FF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 U+FF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 U+FF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 U+FF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 U+FF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 U+FF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 U+FF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 U+FF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 U+FF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A U+FF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B U+FF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C U+FF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D U+FF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E U+FF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F U+FF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 U+FF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 U+FF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 U+FF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 U+FF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 U+FF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 U+FF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 U+FF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 U+FF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 U+FF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 U+FF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x827A U+2213 # MINUS-OR-PLUS SIGN [2000]
+0x827B U+2135 # ALEF SYMBOL [2000]
+0x827C U+210F # PLANCK CONSTANT OVER TWO PI [2000]
+0x827D U+33CB # SQUARE HP [2000]
+0x827E U+2113 # SCRIPT SMALL L [2000]
+0x8280 U+2127 # INVERTED OHM SIGN [2000]
+0x8281 U+FF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 U+FF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 U+FF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 U+FF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 U+FF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 U+FF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 U+FF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 U+FF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 U+FF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A U+FF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B U+FF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C U+FF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D U+FF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E U+FF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F U+FF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 U+FF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 U+FF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 U+FF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 U+FF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 U+FF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 U+FF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 U+FF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 U+FF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 U+FF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 U+FF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A U+FF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2]
+0x829C U+2013 # EN DASH [2000]
+0x829D U+29FA # DOUBLE PLUS [2000] [Unicode3.2]
+0x829E U+29FB # TRIPLE PLUS [2000] [Unicode3.2]
+0x829F U+3041 # HIRAGANA LETTER SMALL A
+0x82A0 U+3042 # HIRAGANA LETTER A
+0x82A1 U+3043 # HIRAGANA LETTER SMALL I
+0x82A2 U+3044 # HIRAGANA LETTER I
+0x82A3 U+3045 # HIRAGANA LETTER SMALL U
+0x82A4 U+3046 # HIRAGANA LETTER U
+0x82A5 U+3047 # HIRAGANA LETTER SMALL E
+0x82A6 U+3048 # HIRAGANA LETTER E
+0x82A7 U+3049 # HIRAGANA LETTER SMALL O
+0x82A8 U+304A # HIRAGANA LETTER O
+0x82A9 U+304B # HIRAGANA LETTER KA
+0x82AA U+304C # HIRAGANA LETTER GA
+0x82AB U+304D # HIRAGANA LETTER KI
+0x82AC U+304E # HIRAGANA LETTER GI
+0x82AD U+304F # HIRAGANA LETTER KU
+0x82AE U+3050 # HIRAGANA LETTER GU
+0x82AF U+3051 # HIRAGANA LETTER KE
+0x82B0 U+3052 # HIRAGANA LETTER GE
+0x82B1 U+3053 # HIRAGANA LETTER KO
+0x82B2 U+3054 # HIRAGANA LETTER GO
+0x82B3 U+3055 # HIRAGANA LETTER SA
+0x82B4 U+3056 # HIRAGANA LETTER ZA
+0x82B5 U+3057 # HIRAGANA LETTER SI
+0x82B6 U+3058 # HIRAGANA LETTER ZI
+0x82B7 U+3059 # HIRAGANA LETTER SU
+0x82B8 U+305A # HIRAGANA LETTER ZU
+0x82B9 U+305B # HIRAGANA LETTER SE
+0x82BA U+305C # HIRAGANA LETTER ZE
+0x82BB U+305D # HIRAGANA LETTER SO
+0x82BC U+305E # HIRAGANA LETTER ZO
+0x82BD U+305F # HIRAGANA LETTER TA
+0x82BE U+3060 # HIRAGANA LETTER DA
+0x82BF U+3061 # HIRAGANA LETTER TI
+0x82C0 U+3062 # HIRAGANA LETTER DI
+0x82C1 U+3063 # HIRAGANA LETTER SMALL TU
+0x82C2 U+3064 # HIRAGANA LETTER TU
+0x82C3 U+3065 # HIRAGANA LETTER DU
+0x82C4 U+3066 # HIRAGANA LETTER TE
+0x82C5 U+3067 # HIRAGANA LETTER DE
+0x82C6 U+3068 # HIRAGANA LETTER TO
+0x82C7 U+3069 # HIRAGANA LETTER DO
+0x82C8 U+306A # HIRAGANA LETTER NA
+0x82C9 U+306B # HIRAGANA LETTER NI
+0x82CA U+306C # HIRAGANA LETTER NU
+0x82CB U+306D # HIRAGANA LETTER NE
+0x82CC U+306E # HIRAGANA LETTER NO
+0x82CD U+306F # HIRAGANA LETTER HA
+0x82CE U+3070 # HIRAGANA LETTER BA
+0x82CF U+3071 # HIRAGANA LETTER PA
+0x82D0 U+3072 # HIRAGANA LETTER HI
+0x82D1 U+3073 # HIRAGANA LETTER BI
+0x82D2 U+3074 # HIRAGANA LETTER PI
+0x82D3 U+3075 # HIRAGANA LETTER HU
+0x82D4 U+3076 # HIRAGANA LETTER BU
+0x82D5 U+3077 # HIRAGANA LETTER PU
+0x82D6 U+3078 # HIRAGANA LETTER HE
+0x82D7 U+3079 # HIRAGANA LETTER BE
+0x82D8 U+307A # HIRAGANA LETTER PE
+0x82D9 U+307B # HIRAGANA LETTER HO
+0x82DA U+307C # HIRAGANA LETTER BO
+0x82DB U+307D # HIRAGANA LETTER PO
+0x82DC U+307E # HIRAGANA LETTER MA
+0x82DD U+307F # HIRAGANA LETTER MI
+0x82DE U+3080 # HIRAGANA LETTER MU
+0x82DF U+3081 # HIRAGANA LETTER ME
+0x82E0 U+3082 # HIRAGANA LETTER MO
+0x82E1 U+3083 # HIRAGANA LETTER SMALL YA
+0x82E2 U+3084 # HIRAGANA LETTER YA
+0x82E3 U+3085 # HIRAGANA LETTER SMALL YU
+0x82E4 U+3086 # HIRAGANA LETTER YU
+0x82E5 U+3087 # HIRAGANA LETTER SMALL YO
+0x82E6 U+3088 # HIRAGANA LETTER YO
+0x82E7 U+3089 # HIRAGANA LETTER RA
+0x82E8 U+308A # HIRAGANA LETTER RI
+0x82E9 U+308B # HIRAGANA LETTER RU
+0x82EA U+308C # HIRAGANA LETTER RE
+0x82EB U+308D # HIRAGANA LETTER RO
+0x82EC U+308E # HIRAGANA LETTER SMALL WA
+0x82ED U+308F # HIRAGANA LETTER WA
+0x82EE U+3090 # HIRAGANA LETTER WI
+0x82EF U+3091 # HIRAGANA LETTER WE
+0x82F0 U+3092 # HIRAGANA LETTER WO
+0x82F1 U+3093 # HIRAGANA LETTER N
+0x82F2 U+3094 # HIRAGANA LETTER VU [2000]
+0x82F3 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2]
+0x82F4 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2]
+0x82F5 U+304B+309A # [2000]
+0x82F6 U+304D+309A # [2000]
+0x82F7 U+304F+309A # [2000]
+0x82F8 U+3051+309A # [2000]
+0x82F9 U+3053+309A # [2000]
+0x82FA # <reserved>
+0x82FB # <reserved>
+0x82FC # <reserved>
+0x8340 U+30A1 # KATAKANA LETTER SMALL A
+0x8341 U+30A2 # KATAKANA LETTER A
+0x8342 U+30A3 # KATAKANA LETTER SMALL I
+0x8343 U+30A4 # KATAKANA LETTER I
+0x8344 U+30A5 # KATAKANA LETTER SMALL U
+0x8345 U+30A6 # KATAKANA LETTER U
+0x8346 U+30A7 # KATAKANA LETTER SMALL E
+0x8347 U+30A8 # KATAKANA LETTER E
+0x8348 U+30A9 # KATAKANA LETTER SMALL O
+0x8349 U+30AA # KATAKANA LETTER O
+0x834A U+30AB # KATAKANA LETTER KA
+0x834B U+30AC # KATAKANA LETTER GA
+0x834C U+30AD # KATAKANA LETTER KI
+0x834D U+30AE # KATAKANA LETTER GI
+0x834E U+30AF # KATAKANA LETTER KU
+0x834F U+30B0 # KATAKANA LETTER GU
+0x8350 U+30B1 # KATAKANA LETTER KE
+0x8351 U+30B2 # KATAKANA LETTER GE
+0x8352 U+30B3 # KATAKANA LETTER KO
+0x8353 U+30B4 # KATAKANA LETTER GO
+0x8354 U+30B5 # KATAKANA LETTER SA
+0x8355 U+30B6 # KATAKANA LETTER ZA
+0x8356 U+30B7 # KATAKANA LETTER SI
+0x8357 U+30B8 # KATAKANA LETTER ZI
+0x8358 U+30B9 # KATAKANA LETTER SU
+0x8359 U+30BA # KATAKANA LETTER ZU
+0x835A U+30BB # KATAKANA LETTER SE
+0x835B U+30BC # KATAKANA LETTER ZE
+0x835C U+30BD # KATAKANA LETTER SO
+0x835D U+30BE # KATAKANA LETTER ZO
+0x835E U+30BF # KATAKANA LETTER TA
+0x835F U+30C0 # KATAKANA LETTER DA
+0x8360 U+30C1 # KATAKANA LETTER TI
+0x8361 U+30C2 # KATAKANA LETTER DI
+0x8362 U+30C3 # KATAKANA LETTER SMALL TU
+0x8363 U+30C4 # KATAKANA LETTER TU
+0x8364 U+30C5 # KATAKANA LETTER DU
+0x8365 U+30C6 # KATAKANA LETTER TE
+0x8366 U+30C7 # KATAKANA LETTER DE
+0x8367 U+30C8 # KATAKANA LETTER TO
+0x8368 U+30C9 # KATAKANA LETTER DO
+0x8369 U+30CA # KATAKANA LETTER NA
+0x836A U+30CB # KATAKANA LETTER NI
+0x836B U+30CC # KATAKANA LETTER NU
+0x836C U+30CD # KATAKANA LETTER NE
+0x836D U+30CE # KATAKANA LETTER NO
+0x836E U+30CF # KATAKANA LETTER HA
+0x836F U+30D0 # KATAKANA LETTER BA
+0x8370 U+30D1 # KATAKANA LETTER PA
+0x8371 U+30D2 # KATAKANA LETTER HI
+0x8372 U+30D3 # KATAKANA LETTER BI
+0x8373 U+30D4 # KATAKANA LETTER PI
+0x8374 U+30D5 # KATAKANA LETTER HU
+0x8375 U+30D6 # KATAKANA LETTER BU
+0x8376 U+30D7 # KATAKANA LETTER PU
+0x8377 U+30D8 # KATAKANA LETTER HE
+0x8378 U+30D9 # KATAKANA LETTER BE
+0x8379 U+30DA # KATAKANA LETTER PE
+0x837A U+30DB # KATAKANA LETTER HO
+0x837B U+30DC # KATAKANA LETTER BO
+0x837C U+30DD # KATAKANA LETTER PO
+0x837D U+30DE # KATAKANA LETTER MA
+0x837E U+30DF # KATAKANA LETTER MI
+0x8380 U+30E0 # KATAKANA LETTER MU
+0x8381 U+30E1 # KATAKANA LETTER ME
+0x8382 U+30E2 # KATAKANA LETTER MO
+0x8383 U+30E3 # KATAKANA LETTER SMALL YA
+0x8384 U+30E4 # KATAKANA LETTER YA
+0x8385 U+30E5 # KATAKANA LETTER SMALL YU
+0x8386 U+30E6 # KATAKANA LETTER YU
+0x8387 U+30E7 # KATAKANA LETTER SMALL YO
+0x8388 U+30E8 # KATAKANA LETTER YO
+0x8389 U+30E9 # KATAKANA LETTER RA
+0x838A U+30EA # KATAKANA LETTER RI
+0x838B U+30EB # KATAKANA LETTER RU
+0x838C U+30EC # KATAKANA LETTER RE
+0x838D U+30ED # KATAKANA LETTER RO
+0x838E U+30EE # KATAKANA LETTER SMALL WA
+0x838F U+30EF # KATAKANA LETTER WA
+0x8390 U+30F0 # KATAKANA LETTER WI
+0x8391 U+30F1 # KATAKANA LETTER WE
+0x8392 U+30F2 # KATAKANA LETTER WO
+0x8393 U+30F3 # KATAKANA LETTER N
+0x8394 U+30F4 # KATAKANA LETTER VU
+0x8395 U+30F5 # KATAKANA LETTER SMALL KA
+0x8396 U+30F6 # KATAKANA LETTER SMALL KE
+0x8397 U+30AB+309A # [2000]
+0x8398 U+30AD+309A # [2000]
+0x8399 U+30AF+309A # [2000]
+0x839A U+30B1+309A # [2000]
+0x839B U+30B3+309A # [2000]
+0x839C U+30BB+309A # [2000]
+0x839D U+30C4+309A # [2000]
+0x839E U+30C8+309A # [2000]
+0x839F U+0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 U+0392 # GREEK CAPITAL LETTER BETA
+0x83A1 U+0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 U+0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 U+0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 U+0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 U+0397 # GREEK CAPITAL LETTER ETA
+0x83A6 U+0398 # GREEK CAPITAL LETTER THETA
+0x83A7 U+0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 U+039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 U+039B # GREEK CAPITAL LETTER LAMDA
+0x83AA U+039C # GREEK CAPITAL LETTER MU
+0x83AB U+039D # GREEK CAPITAL LETTER NU
+0x83AC U+039E # GREEK CAPITAL LETTER XI
+0x83AD U+039F # GREEK CAPITAL LETTER OMICRON
+0x83AE U+03A0 # GREEK CAPITAL LETTER PI
+0x83AF U+03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 U+03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 U+03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 U+03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 U+03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 U+03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 U+03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 U+03A9 # GREEK CAPITAL LETTER OMEGA
+0x83B7 U+2664 # WHITE SPADE SUIT [2000]
+0x83B8 U+2660 # BLACK SPADE SUIT [2000]
+0x83B9 U+2662 # WHITE DIAMOND SUIT [2000]
+0x83BA U+2666 # BLACK DIAMOND SUIT [2000]
+0x83BB U+2661 # WHITE HEART SUIT [2000]
+0x83BC U+2665 # BLACK HEART SUIT [2000]
+0x83BD U+2667 # WHITE CLUB SUIT [2000]
+0x83BE U+2663 # BLACK CLUB SUIT [2000]
+0x83BF U+03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 U+03B2 # GREEK SMALL LETTER BETA
+0x83C1 U+03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 U+03B4 # GREEK SMALL LETTER DELTA
+0x83C3 U+03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 U+03B6 # GREEK SMALL LETTER ZETA
+0x83C5 U+03B7 # GREEK SMALL LETTER ETA
+0x83C6 U+03B8 # GREEK SMALL LETTER THETA
+0x83C7 U+03B9 # GREEK SMALL LETTER IOTA
+0x83C8 U+03BA # GREEK SMALL LETTER KAPPA
+0x83C9 U+03BB # GREEK SMALL LETTER LAMDA
+0x83CA U+03BC # GREEK SMALL LETTER MU
+0x83CB U+03BD # GREEK SMALL LETTER NU
+0x83CC U+03BE # GREEK SMALL LETTER XI
+0x83CD U+03BF # GREEK SMALL LETTER OMICRON
+0x83CE U+03C0 # GREEK SMALL LETTER PI
+0x83CF U+03C1 # GREEK SMALL LETTER RHO
+0x83D0 U+03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 U+03C4 # GREEK SMALL LETTER TAU
+0x83D2 U+03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 U+03C6 # GREEK SMALL LETTER PHI
+0x83D4 U+03C7 # GREEK SMALL LETTER CHI
+0x83D5 U+03C8 # GREEK SMALL LETTER PSI
+0x83D6 U+03C9 # GREEK SMALL LETTER OMEGA
+0x83D7 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000]
+0x83D8 U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2]
+0x83D9 U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2]
+0x83DA U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2]
+0x83DB U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2]
+0x83DC U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2]
+0x83DD U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2]
+0x83DE U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2]
+0x83DF U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2]
+0x83E0 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2]
+0x83E1 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2]
+0x83E2 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2]
+0x83E3 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2]
+0x83E4 U+3020 # POSTAL MARK FACE [2000]
+0x83E5 U+260E # BLACK TELEPHONE [2000]
+0x83E6 U+2600 # BLACK SUN WITH RAYS [2000]
+0x83E7 U+2601 # CLOUD [2000]
+0x83E8 U+2602 # UMBRELLA [2000]
+0x83E9 U+2603 # SNOWMAN [2000]
+0x83EA U+2668 # HOT SPRINGS [2000]
+0x83EB U+25B1 # WHITE PARALLELOGRAM [2000]
+0x83EC U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2]
+0x83ED U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2]
+0x83EE U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2]
+0x83EF U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2]
+0x83F0 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2]
+0x83F1 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2]
+0x83F2 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2]
+0x83F3 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2]
+0x83F4 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2]
+0x83F5 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2]
+0x83F6 U+31F7+309A # [2000]
+0x83F7 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2]
+0x83F8 U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2]
+0x83F9 U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2]
+0x83FA U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2]
+0x83FB U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2]
+0x83FC U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2]
+0x8440 U+0410 # CYRILLIC CAPITAL LETTER A
+0x8441 U+0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 U+0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 U+0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 U+0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 U+0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 U+0418 # CYRILLIC CAPITAL LETTER I
+0x844A U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B U+041A # CYRILLIC CAPITAL LETTER KA
+0x844C U+041B # CYRILLIC CAPITAL LETTER EL
+0x844D U+041C # CYRILLIC CAPITAL LETTER EM
+0x844E U+041D # CYRILLIC CAPITAL LETTER EN
+0x844F U+041E # CYRILLIC CAPITAL LETTER O
+0x8450 U+041F # CYRILLIC CAPITAL LETTER PE
+0x8451 U+0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 U+0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 U+0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 U+0423 # CYRILLIC CAPITAL LETTER U
+0x8455 U+0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 U+0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 U+0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 U+0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C U+042B # CYRILLIC CAPITAL LETTER YERU
+0x845D U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E U+042D # CYRILLIC CAPITAL LETTER E
+0x845F U+042E # CYRILLIC CAPITAL LETTER YU
+0x8460 U+042F # CYRILLIC CAPITAL LETTER YA
+0x8461 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2]
+0x8462 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2]
+0x8463 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2]
+0x8464 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8465 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8466 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8467 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8468 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8469 U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2]
+0x846A U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846B U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846C U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2]
+0x846D U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2]
+0x846E U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2]
+0x846F U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2]
+0x8470 U+0430 # CYRILLIC SMALL LETTER A
+0x8471 U+0431 # CYRILLIC SMALL LETTER BE
+0x8472 U+0432 # CYRILLIC SMALL LETTER VE
+0x8473 U+0433 # CYRILLIC SMALL LETTER GHE
+0x8474 U+0434 # CYRILLIC SMALL LETTER DE
+0x8475 U+0435 # CYRILLIC SMALL LETTER IE
+0x8476 U+0451 # CYRILLIC SMALL LETTER IO
+0x8477 U+0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 U+0437 # CYRILLIC SMALL LETTER ZE
+0x8479 U+0438 # CYRILLIC SMALL LETTER I
+0x847A U+0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B U+043A # CYRILLIC SMALL LETTER KA
+0x847C U+043B # CYRILLIC SMALL LETTER EL
+0x847D U+043C # CYRILLIC SMALL LETTER EM
+0x847E U+043D # CYRILLIC SMALL LETTER EN
+0x8480 U+043E # CYRILLIC SMALL LETTER O
+0x8481 U+043F # CYRILLIC SMALL LETTER PE
+0x8482 U+0440 # CYRILLIC SMALL LETTER ER
+0x8483 U+0441 # CYRILLIC SMALL LETTER ES
+0x8484 U+0442 # CYRILLIC SMALL LETTER TE
+0x8485 U+0443 # CYRILLIC SMALL LETTER U
+0x8486 U+0444 # CYRILLIC SMALL LETTER EF
+0x8487 U+0445 # CYRILLIC SMALL LETTER HA
+0x8488 U+0446 # CYRILLIC SMALL LETTER TSE
+0x8489 U+0447 # CYRILLIC SMALL LETTER CHE
+0x848A U+0448 # CYRILLIC SMALL LETTER SHA
+0x848B U+0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D U+044B # CYRILLIC SMALL LETTER YERU
+0x848E U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F U+044D # CYRILLIC SMALL LETTER E
+0x8490 U+044E # CYRILLIC SMALL LETTER YU
+0x8491 U+044F # CYRILLIC SMALL LETTER YA
+0x8492 U+30F7 # KATAKANA LETTER VA [2000]
+0x8493 U+30F8 # KATAKANA LETTER VI [2000]
+0x8494 U+30F9 # KATAKANA LETTER VE [2000]
+0x8495 U+30FA # KATAKANA LETTER VO [2000]
+0x8496 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000]
+0x8497 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000]
+0x8498 U+2153 # VULGAR FRACTION ONE THIRD [2000]
+0x8499 U+2154 # VULGAR FRACTION TWO THIRDS [2000]
+0x849A U+2155 # VULGAR FRACTION ONE FIFTH [2000]
+0x849B U+2713 # CHECK MARK [2000]
+0x849C U+2318 # PLACE OF INTEREST SIGN [2000]
+0x849D U+2423 # OPEN BOX [2000]
+0x849E U+23CE # RETURN SYMBOL [2000] [Unicode3.2]
+0x849F U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983]
+0x84A0 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983]
+0x84A1 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983]
+0x84A2 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983]
+0x84A3 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983]
+0x84A4 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983]
+0x84A5 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983]
+0x84A6 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983]
+0x84A7 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983]
+0x84A8 U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983]
+0x84A9 U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983]
+0x84AA U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983]
+0x84AB U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983]
+0x84AC U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983]
+0x84AD U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983]
+0x84AE U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983]
+0x84AF U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983]
+0x84B0 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983]
+0x84B1 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983]
+0x84B2 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983]
+0x84B3 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983]
+0x84B4 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983]
+0x84B5 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983]
+0x84B6 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B7 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983]
+0x84B8 U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B9 U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983]
+0x84BA U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983]
+0x84BB U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BC U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983]
+0x84BD U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BE U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BF U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2]
+0x84C0 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2]
+0x84C1 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2]
+0x84C2 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2]
+0x84C3 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2]
+0x84C4 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2]
+0x84C5 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2]
+0x84C6 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2]
+0x84C7 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2]
+0x84C8 U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2]
+0x84C9 U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2]
+0x84CA U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2]
+0x84CB U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2]
+0x84CC U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2]
+0x84CD U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2]
+0x84CE U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2]
+0x84CF U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2]
+0x84D0 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2]
+0x84D1 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2]
+0x84D2 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2]
+0x84D3 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2]
+0x84D4 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2]
+0x84D5 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2]
+0x84D6 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2]
+0x84D7 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2]
+0x84D8 U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2]
+0x84D9 U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2]
+0x84DA U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2]
+0x84DB U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2]
+0x84DC U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2]
+0x84DD # <reserved>
+0x84DE # <reserved>
+0x84DF # <reserved>
+0x84E0 # <reserved>
+0x84E1 # <reserved>
+0x84E2 # <reserved>
+0x84E3 # <reserved>
+0x84E4 # <reserved>
+0x84E5 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000]
+0x84E6 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000]
+0x84E7 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000]
+0x84E8 U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000]
+0x84E9 U+203C # DOUBLE EXCLAMATION MARK [2000]
+0x84EA U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2]
+0x84EB U+2048 # QUESTION EXCLAMATION MARK [2000]
+0x84EC U+2049 # EXCLAMATION QUESTION MARK [2000]
+0x84ED U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000]
+0x84EE U+01CE # LATIN SMALL LETTER A WITH CARON [2000]
+0x84EF U+01D0 # LATIN SMALL LETTER I WITH CARON [2000]
+0x84F0 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000]
+0x84F1 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000]
+0x84F2 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000]
+0x84F3 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000]
+0x84F4 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000]
+0x84F5 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000]
+0x84F6 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000]
+0x84F7 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000]
+0x84F8 U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000]
+0x84F9 U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000]
+0x84FA U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000]
+0x84FB # <reserved>
+0x84FC # <reserved>
+0x8540 U+20AC # EURO SIGN [2000]
+0x8541 U+00A0 # NO-BREAK SPACE [2000]
+0x8542 U+00A1 # INVERTED EXCLAMATION MARK [2000]
+0x8543 U+00A4 # CURRENCY SIGN [2000]
+0x8544 U+00A6 # BROKEN BAR [2000]
+0x8545 U+00A9 # COPYRIGHT SIGN [2000]
+0x8546 U+00AA # FEMININE ORDINAL INDICATOR [2000]
+0x8547 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8548 U+00AD # SOFT HYPHEN [2000]
+0x8549 U+00AE # REGISTERED SIGN [2000]
+0x854A U+00AF # MACRON [2000]
+0x854B U+00B2 # SUPERSCRIPT TWO [2000]
+0x854C U+00B3 # SUPERSCRIPT THREE [2000]
+0x854D U+00B7 # MIDDLE DOT [2000]
+0x854E U+00B8 # CEDILLA [2000]
+0x854F U+00B9 # SUPERSCRIPT ONE [2000]
+0x8550 U+00BA # MASCULINE ORDINAL INDICATOR [2000]
+0x8551 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8552 U+00BC # VULGAR FRACTION ONE QUARTER [2000]
+0x8553 U+00BD # VULGAR FRACTION ONE HALF [2000]
+0x8554 U+00BE # VULGAR FRACTION THREE QUARTERS [2000]
+0x8555 U+00BF # INVERTED QUESTION MARK [2000]
+0x8556 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000]
+0x8557 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000]
+0x8558 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000]
+0x8559 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000]
+0x855A U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000]
+0x855B U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000]
+0x855C U+00C6 # LATIN CAPITAL LETTER AE [2000]
+0x855D U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000]
+0x855E U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000]
+0x855F U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000]
+0x8560 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000]
+0x8561 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000]
+0x8562 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000]
+0x8563 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000]
+0x8564 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000]
+0x8565 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000]
+0x8566 U+00D0 # LATIN CAPITAL LETTER ETH [2000]
+0x8567 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000]
+0x8568 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000]
+0x8569 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000]
+0x856A U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000]
+0x856B U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000]
+0x856C U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000]
+0x856D U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000]
+0x856E U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000]
+0x856F U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000]
+0x8570 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000]
+0x8571 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000]
+0x8572 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000]
+0x8573 U+00DE # LATIN CAPITAL LETTER THORN [2000]
+0x8574 U+00DF # LATIN SMALL LETTER SHARP S [2000]
+0x8575 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000]
+0x8576 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000]
+0x8577 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000]
+0x8578 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000]
+0x8579 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000]
+0x857A U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000]
+0x857B U+00E6 # LATIN SMALL LETTER AE [2000]
+0x857C U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000]
+0x857D U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000]
+0x857E U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000]
+0x8580 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000]
+0x8581 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000]
+0x8582 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000]
+0x8583 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000]
+0x8584 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000]
+0x8585 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000]
+0x8586 U+00F0 # LATIN SMALL LETTER ETH [2000]
+0x8587 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000]
+0x8588 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000]
+0x8589 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000]
+0x858A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000]
+0x858B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000]
+0x858C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000]
+0x858D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000]
+0x858E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000]
+0x858F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000]
+0x8590 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000]
+0x8591 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000]
+0x8592 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000]
+0x8593 U+00FE # LATIN SMALL LETTER THORN [2000]
+0x8594 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000]
+0x8595 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000]
+0x8596 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000]
+0x8597 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000]
+0x8598 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000]
+0x8599 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000]
+0x859A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000]
+0x859B U+012B # LATIN SMALL LETTER I WITH MACRON [2000]
+0x859C U+016B # LATIN SMALL LETTER U WITH MACRON [2000]
+0x859D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000]
+0x859E U+014D # LATIN SMALL LETTER O WITH MACRON [2000]
+0x859F U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000]
+0x85A0 U+02D8 # BREVE [2000]
+0x85A1 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000]
+0x85A2 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000]
+0x85A3 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000]
+0x85A4 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000]
+0x85A5 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000]
+0x85A6 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000]
+0x85A7 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000]
+0x85A8 U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000]
+0x85A9 U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000]
+0x85AA U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000]
+0x85AB U+02DB # OGONEK [2000]
+0x85AC U+0142 # LATIN SMALL LETTER L WITH STROKE [2000]
+0x85AD U+013E # LATIN SMALL LETTER L WITH CARON [2000]
+0x85AE U+015B # LATIN SMALL LETTER S WITH ACUTE [2000]
+0x85AF U+02C7 # CARON [2000]
+0x85B0 U+0161 # LATIN SMALL LETTER S WITH CARON [2000]
+0x85B1 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000]
+0x85B2 U+0165 # LATIN SMALL LETTER T WITH CARON [2000]
+0x85B3 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000]
+0x85B4 U+02DD # DOUBLE ACUTE ACCENT [2000]
+0x85B5 U+017E # LATIN SMALL LETTER Z WITH CARON [2000]
+0x85B6 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000]
+0x85B7 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000]
+0x85B8 U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000]
+0x85B9 U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000]
+0x85BA U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000]
+0x85BB U+010C # LATIN CAPITAL LETTER C WITH CARON [2000]
+0x85BC U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000]
+0x85BD U+011A # LATIN CAPITAL LETTER E WITH CARON [2000]
+0x85BE U+010E # LATIN CAPITAL LETTER D WITH CARON [2000]
+0x85BF U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000]
+0x85C0 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000]
+0x85C1 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000]
+0x85C2 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000]
+0x85C3 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000]
+0x85C4 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000]
+0x85C5 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000]
+0x85C6 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000]
+0x85C7 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000]
+0x85C8 U+013A # LATIN SMALL LETTER L WITH ACUTE [2000]
+0x85C9 U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000]
+0x85CA U+010D # LATIN SMALL LETTER C WITH CARON [2000]
+0x85CB U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000]
+0x85CC U+011B # LATIN SMALL LETTER E WITH CARON [2000]
+0x85CD U+010F # LATIN SMALL LETTER D WITH CARON [2000]
+0x85CE U+0111 # LATIN SMALL LETTER D WITH STROKE [2000]
+0x85CF U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000]
+0x85D0 U+0148 # LATIN SMALL LETTER N WITH CARON [2000]
+0x85D1 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000]
+0x85D2 U+0159 # LATIN SMALL LETTER R WITH CARON [2000]
+0x85D3 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000]
+0x85D4 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000]
+0x85D5 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000]
+0x85D6 U+02D9 # DOT ABOVE [2000]
+0x85D7 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000]
+0x85D8 U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000]
+0x85D9 U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000]
+0x85DA U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000]
+0x85DB U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000]
+0x85DC U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000]
+0x85DD U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000]
+0x85DE U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000]
+0x85DF U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000]
+0x85E0 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000]
+0x85E1 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000]
+0x85E2 U+016D # LATIN SMALL LETTER U WITH BREVE [2000]
+0x85E3 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000]
+0x85E4 U+028B # LATIN SMALL LETTER V WITH HOOK [2000]
+0x85E5 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000]
+0x85E6 U+0283 # LATIN SMALL LETTER ESH [2000]
+0x85E7 U+0292 # LATIN SMALL LETTER EZH [2000]
+0x85E8 U+026C # LATIN SMALL LETTER L WITH BELT [2000]
+0x85E9 U+026E # LATIN SMALL LETTER LEZH [2000]
+0x85EA U+0279 # LATIN SMALL LETTER TURNED R [2000]
+0x85EB U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000]
+0x85EC U+0256 # LATIN SMALL LETTER D WITH TAIL [2000]
+0x85ED U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000]
+0x85EE U+027D # LATIN SMALL LETTER R WITH TAIL [2000]
+0x85EF U+0282 # LATIN SMALL LETTER S WITH HOOK [2000]
+0x85F0 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000]
+0x85F1 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000]
+0x85F2 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000]
+0x85F3 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000]
+0x85F4 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000]
+0x85F5 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000]
+0x85F6 U+028E # LATIN SMALL LETTER TURNED Y [2000]
+0x85F7 U+0261 # LATIN SMALL LETTER SCRIPT G [2000]
+0x85F8 U+014B # LATIN SMALL LETTER ENG [2000]
+0x85F9 U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000]
+0x85FA U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000]
+0x85FB U+0127 # LATIN SMALL LETTER H WITH STROKE [2000]
+0x85FC U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000]
+0x8640 U+0294 # LATIN LETTER GLOTTAL STOP [2000]
+0x8641 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000]
+0x8642 U+0298 # LATIN LETTER BILABIAL CLICK [2000]
+0x8643 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000]
+0x8644 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000]
+0x8645 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000]
+0x8646 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000]
+0x8647 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000]
+0x8648 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000]
+0x8649 U+0153 # LATIN SMALL LIGATURE OE [2000]
+0x864A U+0152 # LATIN CAPITAL LIGATURE OE [2000]
+0x864B U+0268 # LATIN SMALL LETTER I WITH STROKE [2000]
+0x864C U+0289 # LATIN SMALL LETTER U BAR [2000]
+0x864D U+0258 # LATIN SMALL LETTER REVERSED E [2000]
+0x864E U+0275 # LATIN SMALL LETTER BARRED O [2000]
+0x864F U+0259 # LATIN SMALL LETTER SCHWA [2000]
+0x8650 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000]
+0x8651 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000]
+0x8652 U+0250 # LATIN SMALL LETTER TURNED A [2000]
+0x8653 U+026F # LATIN SMALL LETTER TURNED M [2000]
+0x8654 U+028A # LATIN SMALL LETTER UPSILON [2000]
+0x8655 U+0264 # LATIN SMALL LETTER RAMS HORN [2000]
+0x8656 U+028C # LATIN SMALL LETTER TURNED V [2000]
+0x8657 U+0254 # LATIN SMALL LETTER OPEN O [2000]
+0x8658 U+0251 # LATIN SMALL LETTER ALPHA [2000]
+0x8659 U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000]
+0x865A U+028D # LATIN SMALL LETTER TURNED W [2000]
+0x865B U+0265 # LATIN SMALL LETTER TURNED H [2000]
+0x865C U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000]
+0x865D U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000]
+0x865E U+0255 # LATIN SMALL LETTER C WITH CURL [2000]
+0x865F U+0291 # LATIN SMALL LETTER Z WITH CURL [2000]
+0x8660 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000]
+0x8661 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000]
+0x8662 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000]
+0x8663 U+00E6+0300 # [2000]
+0x8664 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000]
+0x8665 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000]
+0x8666 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000]
+0x8667 U+0254+0300 # [2000]
+0x8668 U+0254+0301 # [2000]
+0x8669 U+028C+0300 # [2000]
+0x866A U+028C+0301 # [2000]
+0x866B U+0259+0300 # [2000]
+0x866C U+0259+0301 # [2000]
+0x866D U+025A+0300 # [2000]
+0x866E U+025A+0301 # [2000]
+0x866F U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000]
+0x8670 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000]
+0x8671 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000]
+0x8672 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000]
+0x8673 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000]
+0x8674 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000]
+0x8675 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000]
+0x8676 U+0306 # COMBINING BREVE [2000]
+0x8677 U+203F # UNDERTIE [2000]
+0x8678 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000]
+0x8679 U+0301 # COMBINING ACUTE ACCENT [2000]
+0x867A U+0304 # COMBINING MACRON [2000]
+0x867B U+0300 # COMBINING GRAVE ACCENT [2000]
+0x867C U+030F # COMBINING DOUBLE GRAVE ACCENT [2000]
+0x867D U+030C # COMBINING CARON [2000]
+0x867E U+0302 # COMBINING CIRCUMFLEX ACCENT [2000]
+0x8680 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000]
+0x8681 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000]
+0x8682 U+02E7 # MODIFIER LETTER MID TONE BAR [2000]
+0x8683 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000]
+0x8684 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000]
+0x8685 U+02E9+02E5 # [2000]
+0x8686 U+02E5+02E9 # [2000]
+0x8687 U+0325 # COMBINING RING BELOW [2000]
+0x8688 U+032C # COMBINING CARON BELOW [2000]
+0x8689 U+0339 # COMBINING RIGHT HALF RING BELOW [2000]
+0x868A U+031C # COMBINING LEFT HALF RING BELOW [2000]
+0x868B U+031F # COMBINING PLUS SIGN BELOW [2000]
+0x868C U+0320 # COMBINING MINUS SIGN BELOW [2000]
+0x868D U+0308 # COMBINING DIAERESIS [2000]
+0x868E U+033D # COMBINING X ABOVE [2000]
+0x868F U+0329 # COMBINING VERTICAL LINE BELOW [2000]
+0x8690 U+032F # COMBINING INVERTED BREVE BELOW [2000]
+0x8691 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000]
+0x8692 U+0324 # COMBINING DIAERESIS BELOW [2000]
+0x8693 U+0330 # COMBINING TILDE BELOW [2000]
+0x8694 U+033C # COMBINING SEAGULL BELOW [2000]
+0x8695 U+0334 # COMBINING TILDE OVERLAY [2000]
+0x8696 U+031D # COMBINING UP TACK BELOW [2000]
+0x8697 U+031E # COMBINING DOWN TACK BELOW [2000]
+0x8698 U+0318 # COMBINING LEFT TACK BELOW [2000]
+0x8699 U+0319 # COMBINING RIGHT TACK BELOW [2000]
+0x869A U+032A # COMBINING BRIDGE BELOW [2000]
+0x869B U+033A # COMBINING INVERTED BRIDGE BELOW [2000]
+0x869C U+033B # COMBINING SQUARE BELOW [2000]
+0x869D U+0303 # COMBINING TILDE [2000]
+0x869E U+031A # COMBINING LEFT ANGLE ABOVE [2000]
+0x869F U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000]
+0x86A0 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000]
+0x86A1 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000]
+0x86A2 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000]
+0x86A3 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000]
+0x86A4 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000]
+0x86A5 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000]
+0x86A6 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000]
+0x86A7 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000]
+0x86A8 U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000]
+0x86A9 U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2]
+0x86AA U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2]
+0x86AB U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2]
+0x86AC U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2]
+0x86AD U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2]
+0x86AE U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2]
+0x86AF U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2]
+0x86B0 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2]
+0x86B1 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2]
+0x86B2 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2]
+0x86B3 U+2170 # SMALL ROMAN NUMERAL ONE [2000]
+0x86B4 U+2171 # SMALL ROMAN NUMERAL TWO [2000]
+0x86B5 U+2172 # SMALL ROMAN NUMERAL THREE [2000]
+0x86B6 U+2173 # SMALL ROMAN NUMERAL FOUR [2000]
+0x86B7 U+2174 # SMALL ROMAN NUMERAL FIVE [2000]
+0x86B8 U+2175 # SMALL ROMAN NUMERAL SIX [2000]
+0x86B9 U+2176 # SMALL ROMAN NUMERAL SEVEN [2000]
+0x86BA U+2177 # SMALL ROMAN NUMERAL EIGHT [2000]
+0x86BB U+2178 # SMALL ROMAN NUMERAL NINE [2000]
+0x86BC U+2179 # SMALL ROMAN NUMERAL TEN [2000]
+0x86BD U+217A # SMALL ROMAN NUMERAL ELEVEN [2000]
+0x86BE U+217B # SMALL ROMAN NUMERAL TWELVE [2000]
+0x86BF U+24D0 # CIRCLED LATIN SMALL LETTER A [2000]
+0x86C0 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000]
+0x86C1 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000]
+0x86C2 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000]
+0x86C3 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000]
+0x86C4 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000]
+0x86C5 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000]
+0x86C6 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000]
+0x86C7 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000]
+0x86C8 U+24D9 # CIRCLED LATIN SMALL LETTER J [2000]
+0x86C9 U+24DA # CIRCLED LATIN SMALL LETTER K [2000]
+0x86CA U+24DB # CIRCLED LATIN SMALL LETTER L [2000]
+0x86CB U+24DC # CIRCLED LATIN SMALL LETTER M [2000]
+0x86CC U+24DD # CIRCLED LATIN SMALL LETTER N [2000]
+0x86CD U+24DE # CIRCLED LATIN SMALL LETTER O [2000]
+0x86CE U+24DF # CIRCLED LATIN SMALL LETTER P [2000]
+0x86CF U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000]
+0x86D0 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000]
+0x86D1 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000]
+0x86D2 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000]
+0x86D3 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000]
+0x86D4 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000]
+0x86D5 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000]
+0x86D6 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000]
+0x86D7 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000]
+0x86D8 U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000]
+0x86D9 U+32D0 # CIRCLED KATAKANA A [2000]
+0x86DA U+32D1 # CIRCLED KATAKANA I [2000]
+0x86DB U+32D2 # CIRCLED KATAKANA U [2000]
+0x86DC U+32D3 # CIRCLED KATAKANA E [2000]
+0x86DD U+32D4 # CIRCLED KATAKANA O [2000]
+0x86DE U+32D5 # CIRCLED KATAKANA KA [2000]
+0x86DF U+32D6 # CIRCLED KATAKANA KI [2000]
+0x86E0 U+32D7 # CIRCLED KATAKANA KU [2000]
+0x86E1 U+32D8 # CIRCLED KATAKANA KE [2000]
+0x86E2 U+32D9 # CIRCLED KATAKANA KO [2000]
+0x86E3 U+32DA # CIRCLED KATAKANA SA [2000]
+0x86E4 U+32DB # CIRCLED KATAKANA SI [2000]
+0x86E5 U+32DC # CIRCLED KATAKANA SU [2000]
+0x86E6 U+32DD # CIRCLED KATAKANA SE [2000]
+0x86E7 U+32DE # CIRCLED KATAKANA SO [2000]
+0x86E8 U+32DF # CIRCLED KATAKANA TA [2000]
+0x86E9 U+32E0 # CIRCLED KATAKANA TI [2000]
+0x86EA U+32E1 # CIRCLED KATAKANA TU [2000]
+0x86EB U+32E2 # CIRCLED KATAKANA TE [2000]
+0x86EC U+32E3 # CIRCLED KATAKANA TO [2000]
+0x86ED U+32FA # CIRCLED KATAKANA RO [2000]
+0x86EE U+32E9 # CIRCLED KATAKANA HA [2000]
+0x86EF U+32E5 # CIRCLED KATAKANA NI [2000]
+0x86F0 U+32ED # CIRCLED KATAKANA HO [2000]
+0x86F1 U+32EC # CIRCLED KATAKANA HE [2000]
+0x86F2 # <reserved>
+0x86F3 # <reserved>
+0x86F4 # <reserved>
+0x86F5 # <reserved>
+0x86F6 # <reserved>
+0x86F7 # <reserved>
+0x86F8 # <reserved>
+0x86F9 # <reserved>
+0x86FA # <reserved>
+0x86FB U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2]
+0x86FC U+2042 # ASTERISM [2000]
+0x8740 U+2460 # CIRCLED DIGIT ONE [2000]
+0x8741 U+2461 # CIRCLED DIGIT TWO [2000]
+0x8742 U+2462 # CIRCLED DIGIT THREE [2000]
+0x8743 U+2463 # CIRCLED DIGIT FOUR [2000]
+0x8744 U+2464 # CIRCLED DIGIT FIVE [2000]
+0x8745 U+2465 # CIRCLED DIGIT SIX [2000]
+0x8746 U+2466 # CIRCLED DIGIT SEVEN [2000]
+0x8747 U+2467 # CIRCLED DIGIT EIGHT [2000]
+0x8748 U+2468 # CIRCLED DIGIT NINE [2000]
+0x8749 U+2469 # CIRCLED NUMBER TEN [2000]
+0x874A U+246A # CIRCLED NUMBER ELEVEN [2000]
+0x874B U+246B # CIRCLED NUMBER TWELVE [2000]
+0x874C U+246C # CIRCLED NUMBER THIRTEEN [2000]
+0x874D U+246D # CIRCLED NUMBER FOURTEEN [2000]
+0x874E U+246E # CIRCLED NUMBER FIFTEEN [2000]
+0x874F U+246F # CIRCLED NUMBER SIXTEEN [2000]
+0x8750 U+2470 # CIRCLED NUMBER SEVENTEEN [2000]
+0x8751 U+2471 # CIRCLED NUMBER EIGHTEEN [2000]
+0x8752 U+2472 # CIRCLED NUMBER NINETEEN [2000]
+0x8753 U+2473 # CIRCLED NUMBER TWENTY [2000]
+0x8754 U+2160 # ROMAN NUMERAL ONE [2000]
+0x8755 U+2161 # ROMAN NUMERAL TWO [2000]
+0x8756 U+2162 # ROMAN NUMERAL THREE [2000]
+0x8757 U+2163 # ROMAN NUMERAL FOUR [2000]
+0x8758 U+2164 # ROMAN NUMERAL FIVE [2000]
+0x8759 U+2165 # ROMAN NUMERAL SIX [2000]
+0x875A U+2166 # ROMAN NUMERAL SEVEN [2000]
+0x875B U+2167 # ROMAN NUMERAL EIGHT [2000]
+0x875C U+2168 # ROMAN NUMERAL NINE [2000]
+0x875D U+2169 # ROMAN NUMERAL TEN [2000]
+0x875E U+216A # ROMAN NUMERAL ELEVEN [2000]
+0x875F U+3349 # SQUARE MIRI [2000]
+0x8760 U+3314 # SQUARE KIRO [2000]
+0x8761 U+3322 # SQUARE SENTI [2000]
+0x8762 U+334D # SQUARE MEETORU [2000]
+0x8763 U+3318 # SQUARE GURAMU [2000]
+0x8764 U+3327 # SQUARE TON [2000]
+0x8765 U+3303 # SQUARE AARU [2000]
+0x8766 U+3336 # SQUARE HEKUTAARU [2000]
+0x8767 U+3351 # SQUARE RITTORU [2000]
+0x8768 U+3357 # SQUARE WATTO [2000]
+0x8769 U+330D # SQUARE KARORII [2000]
+0x876A U+3326 # SQUARE DORU [2000]
+0x876B U+3323 # SQUARE SENTO [2000]
+0x876C U+332B # SQUARE PAASENTO [2000]
+0x876D U+334A # SQUARE MIRIBAARU [2000]
+0x876E U+333B # SQUARE PEEZI [2000]
+0x876F U+339C # SQUARE MM [2000]
+0x8770 U+339D # SQUARE CM [2000]
+0x8771 U+339E # SQUARE KM [2000]
+0x8772 U+338E # SQUARE MG [2000]
+0x8773 U+338F # SQUARE KG [2000]
+0x8774 U+33C4 # SQUARE CC [2000]
+0x8775 U+33A1 # SQUARE M SQUARED [2000]
+0x8776 U+216B # ROMAN NUMERAL TWELVE [2000]
+0x8777 # <reserved>
+0x8778 # <reserved>
+0x8779 # <reserved>
+0x877A # <reserved>
+0x877B # <reserved>
+0x877C # <reserved>
+0x877D # <reserved>
+0x877E U+337B # SQUARE ERA NAME HEISEI [2000]
+0x8780 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000]
+0x8781 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000]
+0x8782 U+2116 # NUMERO SIGN [2000]
+0x8783 U+33CD # SQUARE KK [2000]
+0x8784 U+2121 # TELEPHONE SIGN [2000]
+0x8785 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000]
+0x8786 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000]
+0x8787 U+32A6 # CIRCLED IDEOGRAPH LOW [2000]
+0x8788 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000]
+0x8789 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000]
+0x878A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000]
+0x878B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000]
+0x878C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000]
+0x878D U+337E # SQUARE ERA NAME MEIZI [2000]
+0x878E U+337D # SQUARE ERA NAME TAISYOU [2000]
+0x878F U+337C # SQUARE ERA NAME SYOUWA [2000]
+0x8790 # <reserved> Windows: U+2252
+0x8791 # <reserved> Windows: U+2261
+0x8792 # <reserved> Windows: U+222B
+0x8793 U+222E # CONTOUR INTEGRAL [2000]
+0x8794 # <reserved> Windows: U+2211
+0x8795 # <reserved> Windows: U+221A
+0x8796 # <reserved> Windows: U+22A5
+0x8797 # <reserved> Windows: U+2220
+0x8798 U+221F # RIGHT ANGLE [2000]
+0x8799 U+22BF # RIGHT TRIANGLE [2000]
+0x879A # <reserved> Windows: U+2235
+0x879B # <reserved> Windows: U+2229
+0x879C # <reserved> Windows: U+222A
+0x879D U+2756 # BLACK DIAMOND MINUS WHITE X [2000]
+0x879E U+261E # WHITE RIGHT POINTING INDEX [2000]
+0x879F U+4FF1 # <cjk> [2004]
+0x87A0 U+2000B # <cjk> [2000] [Unicode3.1]
+0x87A1 U+3402 # <cjk> [2000]
+0x87A2 U+4E28 # <cjk> [2000]
+0x87A3 U+4E2F # <cjk> [2000]
+0x87A4 U+4E30 # <cjk> [2000]
+0x87A5 U+4E8D # <cjk> [2000]
+0x87A6 U+4EE1 # <cjk> [2000]
+0x87A7 U+4EFD # <cjk> [2000]
+0x87A8 U+4EFF # <cjk> [2000]
+0x87A9 U+4F03 # <cjk> [2000]
+0x87AA U+4F0B # <cjk> [2000]
+0x87AB U+4F60 # <cjk> [2000]
+0x87AC U+4F48 # <cjk> [2000]
+0x87AD U+4F49 # <cjk> [2000]
+0x87AE U+4F56 # <cjk> [2000]
+0x87AF U+4F5F # <cjk> [2000]
+0x87B0 U+4F6A # <cjk> [2000]
+0x87B1 U+4F6C # <cjk> [2000]
+0x87B2 U+4F7E # <cjk> [2000]
+0x87B3 U+4F8A # <cjk> [2000]
+0x87B4 U+4F94 # <cjk> [2000]
+0x87B5 U+4F97 # <cjk> [2000]
+0x87B6 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2]
+0x87B7 U+4FC9 # <cjk> [2000]
+0x87B8 U+4FE0 # <cjk> [2000]
+0x87B9 U+5001 # <cjk> [2000]
+0x87BA U+5002 # <cjk> [2000]
+0x87BB U+500E # <cjk> [2000]
+0x87BC U+5018 # <cjk> [2000]
+0x87BD U+5027 # <cjk> [2000]
+0x87BE U+502E # <cjk> [2000]
+0x87BF U+5040 # <cjk> [2000]
+0x87C0 U+503B # <cjk> [2000]
+0x87C1 U+5041 # <cjk> [2000]
+0x87C2 U+5094 # <cjk> [2000]
+0x87C3 U+50CC # <cjk> [2000]
+0x87C4 U+50F2 # <cjk> [2000]
+0x87C5 U+50D0 # <cjk> [2000]
+0x87C6 U+50E6 # <cjk> [2000]
+0x87C7 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2]
+0x87C8 U+5106 # <cjk> [2000]
+0x87C9 U+5103 # <cjk> [2000]
+0x87CA U+510B # <cjk> [2000]
+0x87CB U+511E # <cjk> [2000]
+0x87CC U+5135 # <cjk> [2000]
+0x87CD U+514A # <cjk> [2000]
+0x87CE U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2]
+0x87CF U+5155 # <cjk> [2000]
+0x87D0 U+5157 # <cjk> [2000]
+0x87D1 U+34B5 # <cjk> [2000]
+0x87D2 U+519D # <cjk> [2000]
+0x87D3 U+51C3 # <cjk> [2000]
+0x87D4 U+51CA # <cjk> [2000]
+0x87D5 U+51DE # <cjk> [2000]
+0x87D6 U+51E2 # <cjk> [2000]
+0x87D7 U+51EE # <cjk> [2000]
+0x87D8 U+5201 # <cjk> [2000]
+0x87D9 U+34DB # <cjk> [2000]
+0x87DA U+5213 # <cjk> [2000]
+0x87DB U+5215 # <cjk> [2000]
+0x87DC U+5249 # <cjk> [2000]
+0x87DD U+5257 # <cjk> [2000]
+0x87DE U+5261 # <cjk> [2000]
+0x87DF U+5293 # <cjk> [2000]
+0x87E0 U+52C8 # <cjk> [2000]
+0x87E1 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2]
+0x87E2 U+52CC # <cjk> [2000]
+0x87E3 U+52D0 # <cjk> [2000]
+0x87E4 U+52D6 # <cjk> [2000]
+0x87E5 U+52DB # <cjk> [2000]
+0x87E6 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2]
+0x87E7 U+52F0 # <cjk> [2000]
+0x87E8 U+52FB # <cjk> [2000]
+0x87E9 U+5300 # <cjk> [2000]
+0x87EA U+5307 # <cjk> [2000]
+0x87EB U+531C # <cjk> [2000]
+0x87EC U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2]
+0x87ED U+5361 # <cjk> [2000]
+0x87EE U+5363 # <cjk> [2000]
+0x87EF U+537D # <cjk> [2000]
+0x87F0 U+5393 # <cjk> [2000]
+0x87F1 U+539D # <cjk> [2000]
+0x87F2 U+53B2 # <cjk> [2000]
+0x87F3 U+5412 # <cjk> [2000]
+0x87F4 U+5427 # <cjk> [2000]
+0x87F5 U+544D # <cjk> [2000]
+0x87F6 U+549C # <cjk> [2000]
+0x87F7 U+546B # <cjk> [2000]
+0x87F8 U+5474 # <cjk> [2000]
+0x87F9 U+547F # <cjk> [2000]
+0x87FA U+5488 # <cjk> [2000]
+0x87FB U+5496 # <cjk> [2000]
+0x87FC U+54A1 # <cjk> [2000]
+0x8840 U+54A9 # <cjk> [2000]
+0x8841 U+54C6 # <cjk> [2000]
+0x8842 U+54FF # <cjk> [2000]
+0x8843 U+550E # <cjk> [2000]
+0x8844 U+552B # <cjk> [2000]
+0x8845 U+5535 # <cjk> [2000]
+0x8846 U+5550 # <cjk> [2000]
+0x8847 U+555E # <cjk> [2000]
+0x8848 U+5581 # <cjk> [2000]
+0x8849 U+5586 # <cjk> [2000]
+0x884A U+558E # <cjk> [2000]
+0x884B U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2]
+0x884C U+55AD # <cjk> [2000]
+0x884D U+55CE # <cjk> [2000]
+0x884E U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2]
+0x884F U+5608 # <cjk> [2000]
+0x8850 U+560E # <cjk> [2000]
+0x8851 U+563B # <cjk> [2000]
+0x8852 U+5649 # <cjk> [2000]
+0x8853 U+5676 # <cjk> [2000]
+0x8854 U+5666 # <cjk> [2000]
+0x8855 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2]
+0x8856 U+566F # <cjk> [2000]
+0x8857 U+5671 # <cjk> [2000]
+0x8858 U+5672 # <cjk> [2000]
+0x8859 U+5699 # <cjk> [2000]
+0x885A U+569E # <cjk> [2000]
+0x885B U+56A9 # <cjk> [2000]
+0x885C U+56AC # <cjk> [2000]
+0x885D U+56B3 # <cjk> [2000]
+0x885E U+56C9 # <cjk> [2000]
+0x885F U+56CA # <cjk> [2000]
+0x8860 U+570A # <cjk> [2000]
+0x8861 U+2123D # <cjk> [2000] [Unicode3.1]
+0x8862 U+5721 # <cjk> [2000]
+0x8863 U+572F # <cjk> [2000]
+0x8864 U+5733 # <cjk> [2000]
+0x8865 U+5734 # <cjk> [2000]
+0x8866 U+5770 # <cjk> [2000]
+0x8867 U+5777 # <cjk> [2000]
+0x8868 U+577C # <cjk> [2000]
+0x8869 U+579C # <cjk> [2000]
+0x886A U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000]
+0x886B U+2131B # <cjk> [2000] [Unicode3.1]
+0x886C U+57B8 # <cjk> [2000]
+0x886D U+57C7 # <cjk> [2000]
+0x886E U+57C8 # <cjk> [2000]
+0x886F U+57CF # <cjk> [2000]
+0x8870 U+57E4 # <cjk> [2000]
+0x8871 U+57ED # <cjk> [2000]
+0x8872 U+57F5 # <cjk> [2000]
+0x8873 U+57F6 # <cjk> [2000]
+0x8874 U+57FF # <cjk> [2000]
+0x8875 U+5809 # <cjk> [2000]
+0x8876 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000]
+0x8877 U+5861 # <cjk> [2000]
+0x8878 U+5864 # <cjk> [2000]
+0x8879 U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2]
+0x887A U+587C # <cjk> [2000]
+0x887B U+5889 # <cjk> [2000]
+0x887C U+589E # <cjk> [2000]
+0x887D U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2]
+0x887E U+58A9 # <cjk> [2000]
+0x8880 U+2146E # <cjk> [2000] [Unicode3.1]
+0x8881 U+58D2 # <cjk> [2000]
+0x8882 U+58CE # <cjk> [2000]
+0x8883 U+58D4 # <cjk> [2000]
+0x8884 U+58DA # <cjk> [2000]
+0x8885 U+58E0 # <cjk> [2000]
+0x8886 U+58E9 # <cjk> [2000]
+0x8887 U+590C # <cjk> [2000]
+0x8888 U+8641 # <cjk> [2000]
+0x8889 U+595D # <cjk> [2000]
+0x888A U+596D # <cjk> [2000]
+0x888B U+598B # <cjk> [2000]
+0x888C U+5992 # <cjk> [2000]
+0x888D U+59A4 # <cjk> [2000]
+0x888E U+59C3 # <cjk> [2000]
+0x888F U+59D2 # <cjk> [2000]
+0x8890 U+59DD # <cjk> [2000]
+0x8891 U+5A13 # <cjk> [2000]
+0x8892 U+5A23 # <cjk> [2000]
+0x8893 U+5A67 # <cjk> [2000]
+0x8894 U+5A6D # <cjk> [2000]
+0x8895 U+5A77 # <cjk> [2000]
+0x8896 U+5A7E # <cjk> [2000]
+0x8897 U+5A84 # <cjk> [2000]
+0x8898 U+5A9E # <cjk> [2000]
+0x8899 U+5AA7 # <cjk> [2000]
+0x889A U+5AC4 # <cjk> [2000]
+0x889B U+218BD # <cjk> [2000] [Unicode3.1]
+0x889C U+5B19 # <cjk> [2000]
+0x889D U+5B25 # <cjk> [2000]
+0x889E U+525D # <cjk> [2004]
+0x889F U+4E9C # <cjk>
+0x88A0 U+5516 # <cjk>
+0x88A1 U+5A03 # <cjk>
+0x88A2 U+963F # <cjk>
+0x88A3 U+54C0 # <cjk>
+0x88A4 U+611B # <cjk>
+0x88A5 U+6328 # <cjk>
+0x88A6 U+59F6 # <cjk>
+0x88A7 U+9022 # <cjk>
+0x88A8 U+8475 # <cjk>
+0x88A9 U+831C # <cjk>
+0x88AA U+7A50 # <cjk>
+0x88AB U+60AA # <cjk>
+0x88AC U+63E1 # <cjk>
+0x88AD U+6E25 # <cjk>
+0x88AE U+65ED # <cjk>
+0x88AF U+8466 # <cjk>
+0x88B0 U+82A6 # <cjk>
+0x88B1 U+9BF5 # <cjk>
+0x88B2 U+6893 # <cjk>
+0x88B3 U+5727 # <cjk>
+0x88B4 U+65A1 # <cjk>
+0x88B5 U+6271 # <cjk>
+0x88B6 U+5B9B # <cjk>
+0x88B7 U+59D0 # <cjk>
+0x88B8 U+867B # <cjk>
+0x88B9 U+98F4 # <cjk>
+0x88BA U+7D62 # <cjk>
+0x88BB U+7DBE # <cjk>
+0x88BC U+9B8E # <cjk>
+0x88BD U+6216 # <cjk>
+0x88BE U+7C9F # <cjk>
+0x88BF U+88B7 # <cjk>
+0x88C0 U+5B89 # <cjk>
+0x88C1 U+5EB5 # <cjk>
+0x88C2 U+6309 # <cjk>
+0x88C3 U+6697 # <cjk>
+0x88C4 U+6848 # <cjk>
+0x88C5 U+95C7 # <cjk>
+0x88C6 U+978D # <cjk>
+0x88C7 U+674F # <cjk>
+0x88C8 U+4EE5 # <cjk>
+0x88C9 U+4F0A # <cjk>
+0x88CA U+4F4D # <cjk>
+0x88CB U+4F9D # <cjk>
+0x88CC U+5049 # <cjk>
+0x88CD U+56F2 # <cjk>
+0x88CE U+5937 # <cjk>
+0x88CF U+59D4 # <cjk>
+0x88D0 U+5A01 # <cjk>
+0x88D1 U+5C09 # <cjk>
+0x88D2 U+60DF # <cjk>
+0x88D3 U+610F # <cjk>
+0x88D4 U+6170 # <cjk>
+0x88D5 U+6613 # <cjk>
+0x88D6 U+6905 # <cjk>
+0x88D7 U+70BA # <cjk>
+0x88D8 U+754F # <cjk>
+0x88D9 U+7570 # <cjk>
+0x88DA U+79FB # <cjk>
+0x88DB U+7DAD # <cjk>
+0x88DC U+7DEF # <cjk>
+0x88DD U+80C3 # <cjk>
+0x88DE U+840E # <cjk>
+0x88DF U+8863 # <cjk>
+0x88E0 U+8B02 # <cjk>
+0x88E1 U+9055 # <cjk>
+0x88E2 U+907A # <cjk>
+0x88E3 U+533B # <cjk>
+0x88E4 U+4E95 # <cjk>
+0x88E5 U+4EA5 # <cjk>
+0x88E6 U+57DF # <cjk>
+0x88E7 U+80B2 # <cjk>
+0x88E8 U+90C1 # <cjk>
+0x88E9 U+78EF # <cjk>
+0x88EA U+4E00 # <cjk>
+0x88EB U+58F1 # <cjk>
+0x88EC U+6EA2 # <cjk>
+0x88ED U+9038 # <cjk>
+0x88EE U+7A32 # <cjk>
+0x88EF U+8328 # <cjk>
+0x88F0 U+828B # <cjk>
+0x88F1 U+9C2F # <cjk>
+0x88F2 U+5141 # <cjk>
+0x88F3 U+5370 # <cjk>
+0x88F4 U+54BD # <cjk>
+0x88F5 U+54E1 # <cjk>
+0x88F6 U+56E0 # <cjk>
+0x88F7 U+59FB # <cjk>
+0x88F8 U+5F15 # <cjk>
+0x88F9 U+98F2 # <cjk>
+0x88FA U+6DEB # <cjk>
+0x88FB U+80E4 # <cjk>
+0x88FC U+852D # <cjk>
+0x8940 U+9662 # <cjk>
+0x8941 U+9670 # <cjk>
+0x8942 U+96A0 # <cjk>
+0x8943 U+97FB # <cjk>
+0x8944 U+540B # <cjk>
+0x8945 U+53F3 # <cjk>
+0x8946 U+5B87 # <cjk>
+0x8947 U+70CF # <cjk>
+0x8948 U+7FBD # <cjk>
+0x8949 U+8FC2 # <cjk>
+0x894A U+96E8 # <cjk>
+0x894B U+536F # <cjk>
+0x894C U+9D5C # <cjk>
+0x894D U+7ABA # <cjk>
+0x894E U+4E11 # <cjk>
+0x894F U+7893 # <cjk>
+0x8950 U+81FC # <cjk>
+0x8951 U+6E26 # <cjk>
+0x8952 U+5618 # <cjk>
+0x8953 U+5504 # <cjk>
+0x8954 U+6B1D # <cjk>
+0x8955 U+851A # <cjk>
+0x8956 U+9C3B # <cjk>
+0x8957 U+59E5 # <cjk>
+0x8958 U+53A9 # <cjk>
+0x8959 U+6D66 # <cjk>
+0x895A U+74DC # <cjk>
+0x895B U+958F # <cjk>
+0x895C U+5642 # <cjk>
+0x895D U+4E91 # <cjk>
+0x895E U+904B # <cjk>
+0x895F U+96F2 # <cjk>
+0x8960 U+834F # <cjk>
+0x8961 U+990C # <cjk>
+0x8962 U+53E1 # <cjk>
+0x8963 U+55B6 # <cjk>
+0x8964 U+5B30 # <cjk>
+0x8965 U+5F71 # <cjk>
+0x8966 U+6620 # <cjk>
+0x8967 U+66F3 # <cjk>
+0x8968 U+6804 # <cjk>
+0x8969 U+6C38 # <cjk>
+0x896A U+6CF3 # <cjk>
+0x896B U+6D29 # <cjk>
+0x896C U+745B # <cjk>
+0x896D U+76C8 # <cjk>
+0x896E U+7A4E # <cjk>
+0x896F U+9834 # <cjk>
+0x8970 U+82F1 # <cjk>
+0x8971 U+885B # <cjk>
+0x8972 U+8A60 # <cjk>
+0x8973 U+92ED # <cjk>
+0x8974 U+6DB2 # <cjk>
+0x8975 U+75AB # <cjk>
+0x8976 U+76CA # <cjk>
+0x8977 U+99C5 # <cjk>
+0x8978 U+60A6 # <cjk>
+0x8979 U+8B01 # <cjk>
+0x897A U+8D8A # <cjk>
+0x897B U+95B2 # <cjk>
+0x897C U+698E # <cjk>
+0x897D U+53AD # <cjk>
+0x897E U+5186 # <cjk>
+0x8980 U+5712 # <cjk>
+0x8981 U+5830 # <cjk>
+0x8982 U+5944 # <cjk>
+0x8983 U+5BB4 # <cjk>
+0x8984 U+5EF6 # <cjk>
+0x8985 U+6028 # <cjk>
+0x8986 U+63A9 # <cjk>
+0x8987 U+63F4 # <cjk>
+0x8988 U+6CBF # <cjk>
+0x8989 U+6F14 # <cjk>
+0x898A U+708E # <cjk>
+0x898B U+7114 # <cjk>
+0x898C U+7159 # <cjk>
+0x898D U+71D5 # <cjk>
+0x898E U+733F # <cjk>
+0x898F U+7E01 # <cjk>
+0x8990 U+8276 # <cjk>
+0x8991 U+82D1 # <cjk>
+0x8992 U+8597 # <cjk>
+0x8993 U+9060 # <cjk>
+0x8994 U+925B # <cjk>
+0x8995 U+9D1B # <cjk>
+0x8996 U+5869 # <cjk>
+0x8997 U+65BC # <cjk>
+0x8998 U+6C5A # <cjk>
+0x8999 U+7525 # <cjk>
+0x899A U+51F9 # <cjk>
+0x899B U+592E # <cjk>
+0x899C U+5965 # <cjk>
+0x899D U+5F80 # <cjk>
+0x899E U+5FDC # <cjk>
+0x899F U+62BC # <cjk>
+0x89A0 U+65FA # <cjk>
+0x89A1 U+6A2A # <cjk>
+0x89A2 U+6B27 # <cjk>
+0x89A3 U+6BB4 # <cjk>
+0x89A4 U+738B # <cjk>
+0x89A5 U+7FC1 # <cjk>
+0x89A6 U+8956 # <cjk>
+0x89A7 U+9D2C # <cjk>
+0x89A8 U+9D0E # <cjk>
+0x89A9 U+9EC4 # <cjk>
+0x89AA U+5CA1 # <cjk>
+0x89AB U+6C96 # <cjk>
+0x89AC U+837B # <cjk>
+0x89AD U+5104 # <cjk>
+0x89AE U+5C4B # <cjk>
+0x89AF U+61B6 # <cjk>
+0x89B0 U+81C6 # <cjk>
+0x89B1 U+6876 # <cjk>
+0x89B2 U+7261 # <cjk>
+0x89B3 U+4E59 # <cjk>
+0x89B4 U+4FFA # <cjk>
+0x89B5 U+5378 # <cjk>
+0x89B6 U+6069 # <cjk>
+0x89B7 U+6E29 # <cjk>
+0x89B8 U+7A4F # <cjk>
+0x89B9 U+97F3 # <cjk>
+0x89BA U+4E0B # <cjk>
+0x89BB U+5316 # <cjk>
+0x89BC U+4EEE # <cjk>
+0x89BD U+4F55 # <cjk>
+0x89BE U+4F3D # <cjk>
+0x89BF U+4FA1 # <cjk>
+0x89C0 U+4F73 # <cjk>
+0x89C1 U+52A0 # <cjk>
+0x89C2 U+53EF # <cjk>
+0x89C3 U+5609 # <cjk>
+0x89C4 U+590F # <cjk>
+0x89C5 U+5AC1 # <cjk>
+0x89C6 U+5BB6 # <cjk>
+0x89C7 U+5BE1 # <cjk>
+0x89C8 U+79D1 # <cjk>
+0x89C9 U+6687 # <cjk>
+0x89CA U+679C # <cjk>
+0x89CB U+67B6 # <cjk>
+0x89CC U+6B4C # <cjk>
+0x89CD U+6CB3 # <cjk>
+0x89CE U+706B # <cjk>
+0x89CF U+73C2 # <cjk>
+0x89D0 U+798D # <cjk>
+0x89D1 U+79BE # <cjk>
+0x89D2 U+7A3C # <cjk>
+0x89D3 U+7B87 # <cjk>
+0x89D4 U+82B1 # <cjk>
+0x89D5 U+82DB # <cjk>
+0x89D6 U+8304 # <cjk>
+0x89D7 U+8377 # <cjk>
+0x89D8 U+83EF # <cjk>
+0x89D9 U+83D3 # <cjk>
+0x89DA U+8766 # <cjk>
+0x89DB U+8AB2 # <cjk>
+0x89DC U+5629 # <cjk>
+0x89DD U+8CA8 # <cjk>
+0x89DE U+8FE6 # <cjk>
+0x89DF U+904E # <cjk>
+0x89E0 U+971E # <cjk>
+0x89E1 U+868A # <cjk>
+0x89E2 U+4FC4 # <cjk>
+0x89E3 U+5CE8 # <cjk>
+0x89E4 U+6211 # <cjk>
+0x89E5 U+7259 # <cjk>
+0x89E6 U+753B # <cjk>
+0x89E7 U+81E5 # <cjk>
+0x89E8 U+82BD # <cjk>
+0x89E9 U+86FE # <cjk>
+0x89EA U+8CC0 # <cjk>
+0x89EB U+96C5 # <cjk>
+0x89EC U+9913 # <cjk>
+0x89ED U+99D5 # <cjk>
+0x89EE U+4ECB # <cjk>
+0x89EF U+4F1A # <cjk>
+0x89F0 U+89E3 # <cjk>
+0x89F1 U+56DE # <cjk>
+0x89F2 U+584A # <cjk>
+0x89F3 U+58CA # <cjk>
+0x89F4 U+5EFB # <cjk>
+0x89F5 U+5FEB # <cjk>
+0x89F6 U+602A # <cjk>
+0x89F7 U+6094 # <cjk>
+0x89F8 U+6062 # <cjk>
+0x89F9 U+61D0 # <cjk>
+0x89FA U+6212 # <cjk>
+0x89FB U+62D0 # <cjk>
+0x89FC U+6539 # <cjk>
+0x8A40 U+9B41 # <cjk>
+0x8A41 U+6666 # <cjk>
+0x8A42 U+68B0 # <cjk>
+0x8A43 U+6D77 # <cjk>
+0x8A44 U+7070 # <cjk>
+0x8A45 U+754C # <cjk>
+0x8A46 U+7686 # <cjk>
+0x8A47 U+7D75 # <cjk>
+0x8A48 U+82A5 # <cjk>
+0x8A49 U+87F9 # <cjk>
+0x8A4A U+958B # <cjk>
+0x8A4B U+968E # <cjk>
+0x8A4C U+8C9D # <cjk>
+0x8A4D U+51F1 # <cjk>
+0x8A4E U+52BE # <cjk>
+0x8A4F U+5916 # <cjk>
+0x8A50 U+54B3 # <cjk>
+0x8A51 U+5BB3 # <cjk>
+0x8A52 U+5D16 # <cjk>
+0x8A53 U+6168 # <cjk>
+0x8A54 U+6982 # <cjk>
+0x8A55 U+6DAF # <cjk>
+0x8A56 U+788D # <cjk>
+0x8A57 U+84CB # <cjk>
+0x8A58 U+8857 # <cjk>
+0x8A59 U+8A72 # <cjk>
+0x8A5A U+93A7 # <cjk>
+0x8A5B U+9AB8 # <cjk>
+0x8A5C U+6D6C # <cjk>
+0x8A5D U+99A8 # <cjk>
+0x8A5E U+86D9 # <cjk>
+0x8A5F U+57A3 # <cjk>
+0x8A60 U+67FF # <cjk>
+0x8A61 U+86CE # <cjk>
+0x8A62 U+920E # <cjk>
+0x8A63 U+5283 # <cjk>
+0x8A64 U+5687 # <cjk>
+0x8A65 U+5404 # <cjk>
+0x8A66 U+5ED3 # <cjk>
+0x8A67 U+62E1 # <cjk>
+0x8A68 U+64B9 # <cjk>
+0x8A69 U+683C # <cjk>
+0x8A6A U+6838 # <cjk>
+0x8A6B U+6BBB # <cjk>
+0x8A6C U+7372 # <cjk>
+0x8A6D U+78BA # <cjk>
+0x8A6E U+7A6B # <cjk>
+0x8A6F U+899A # <cjk>
+0x8A70 U+89D2 # <cjk>
+0x8A71 U+8D6B # <cjk>
+0x8A72 U+8F03 # <cjk>
+0x8A73 U+90ED # <cjk>
+0x8A74 U+95A3 # <cjk>
+0x8A75 U+9694 # <cjk>
+0x8A76 U+9769 # <cjk>
+0x8A77 U+5B66 # <cjk>
+0x8A78 U+5CB3 # <cjk>
+0x8A79 U+697D # <cjk>
+0x8A7A U+984D # <cjk>
+0x8A7B U+984E # <cjk>
+0x8A7C U+639B # <cjk>
+0x8A7D U+7B20 # <cjk>
+0x8A7E U+6A2B # <cjk>
+0x8A80 U+6A7F # <cjk>
+0x8A81 U+68B6 # <cjk>
+0x8A82 U+9C0D # <cjk>
+0x8A83 U+6F5F # <cjk>
+0x8A84 U+5272 # <cjk>
+0x8A85 U+559D # <cjk>
+0x8A86 U+6070 # <cjk>
+0x8A87 U+62EC # <cjk>
+0x8A88 U+6D3B # <cjk>
+0x8A89 U+6E07 # <cjk>
+0x8A8A U+6ED1 # <cjk>
+0x8A8B U+845B # <cjk>
+0x8A8C U+8910 # <cjk>
+0x8A8D U+8F44 # <cjk>
+0x8A8E U+4E14 # <cjk>
+0x8A8F U+9C39 # <cjk>
+0x8A90 U+53F6 # <cjk>
+0x8A91 U+691B # <cjk>
+0x8A92 U+6A3A # <cjk>
+0x8A93 U+9784 # <cjk>
+0x8A94 U+682A # <cjk>
+0x8A95 U+515C # <cjk>
+0x8A96 U+7AC3 # <cjk>
+0x8A97 U+84B2 # <cjk>
+0x8A98 U+91DC # <cjk>
+0x8A99 U+938C # <cjk>
+0x8A9A U+565B # <cjk>
+0x8A9B U+9D28 # <cjk>
+0x8A9C U+6822 # <cjk>
+0x8A9D U+8305 # <cjk>
+0x8A9E U+8431 # <cjk>
+0x8A9F U+7CA5 # <cjk>
+0x8AA0 U+5208 # <cjk>
+0x8AA1 U+82C5 # <cjk>
+0x8AA2 U+74E6 # <cjk>
+0x8AA3 U+4E7E # <cjk>
+0x8AA4 U+4F83 # <cjk>
+0x8AA5 U+51A0 # <cjk>
+0x8AA6 U+5BD2 # <cjk>
+0x8AA7 U+520A # <cjk>
+0x8AA8 U+52D8 # <cjk>
+0x8AA9 U+52E7 # <cjk>
+0x8AAA U+5DFB # <cjk>
+0x8AAB U+559A # <cjk>
+0x8AAC U+582A # <cjk>
+0x8AAD U+59E6 # <cjk>
+0x8AAE U+5B8C # <cjk>
+0x8AAF U+5B98 # <cjk>
+0x8AB0 U+5BDB # <cjk>
+0x8AB1 U+5E72 # <cjk>
+0x8AB2 U+5E79 # <cjk>
+0x8AB3 U+60A3 # <cjk>
+0x8AB4 U+611F # <cjk>
+0x8AB5 U+6163 # <cjk>
+0x8AB6 U+61BE # <cjk>
+0x8AB7 U+63DB # <cjk>
+0x8AB8 U+6562 # <cjk>
+0x8AB9 U+67D1 # <cjk>
+0x8ABA U+6853 # <cjk>
+0x8ABB U+68FA # <cjk>
+0x8ABC U+6B3E # <cjk>
+0x8ABD U+6B53 # <cjk>
+0x8ABE U+6C57 # <cjk>
+0x8ABF U+6F22 # <cjk>
+0x8AC0 U+6F97 # <cjk>
+0x8AC1 U+6F45 # <cjk>
+0x8AC2 U+74B0 # <cjk>
+0x8AC3 U+7518 # <cjk>
+0x8AC4 U+76E3 # <cjk>
+0x8AC5 U+770B # <cjk>
+0x8AC6 U+7AFF # <cjk>
+0x8AC7 U+7BA1 # <cjk>
+0x8AC8 U+7C21 # <cjk>
+0x8AC9 U+7DE9 # <cjk>
+0x8ACA U+7F36 # <cjk>
+0x8ACB U+7FF0 # <cjk>
+0x8ACC U+809D # <cjk>
+0x8ACD U+8266 # <cjk>
+0x8ACE U+839E # <cjk>
+0x8ACF U+89B3 # <cjk>
+0x8AD0 U+8ACC # <cjk>
+0x8AD1 U+8CAB # <cjk>
+0x8AD2 U+9084 # <cjk>
+0x8AD3 U+9451 # <cjk>
+0x8AD4 U+9593 # <cjk>
+0x8AD5 U+9591 # <cjk>
+0x8AD6 U+95A2 # <cjk>
+0x8AD7 U+9665 # <cjk>
+0x8AD8 U+97D3 # <cjk>
+0x8AD9 U+9928 # <cjk>
+0x8ADA U+8218 # <cjk>
+0x8ADB U+4E38 # <cjk>
+0x8ADC U+542B # <cjk>
+0x8ADD U+5CB8 # <cjk>
+0x8ADE U+5DCC # <cjk>
+0x8ADF U+73A9 # <cjk>
+0x8AE0 U+764C # <cjk>
+0x8AE1 U+773C # <cjk>
+0x8AE2 U+5CA9 # <cjk>
+0x8AE3 U+7FEB # <cjk>
+0x8AE4 U+8D0B # <cjk>
+0x8AE5 U+96C1 # <cjk>
+0x8AE6 U+9811 # <cjk>
+0x8AE7 U+9854 # <cjk>
+0x8AE8 U+9858 # <cjk>
+0x8AE9 U+4F01 # <cjk>
+0x8AEA U+4F0E # <cjk>
+0x8AEB U+5371 # <cjk>
+0x8AEC U+559C # <cjk>
+0x8AED U+5668 # <cjk>
+0x8AEE U+57FA # <cjk>
+0x8AEF U+5947 # <cjk>
+0x8AF0 U+5B09 # <cjk>
+0x8AF1 U+5BC4 # <cjk>
+0x8AF2 U+5C90 # <cjk>
+0x8AF3 U+5E0C # <cjk>
+0x8AF4 U+5E7E # <cjk>
+0x8AF5 U+5FCC # <cjk>
+0x8AF6 U+63EE # <cjk>
+0x8AF7 U+673A # <cjk>
+0x8AF8 U+65D7 # <cjk>
+0x8AF9 U+65E2 # <cjk>
+0x8AFA U+671F # <cjk>
+0x8AFB U+68CB # <cjk>
+0x8AFC U+68C4 # <cjk>
+0x8B40 U+6A5F # <cjk>
+0x8B41 U+5E30 # <cjk>
+0x8B42 U+6BC5 # <cjk>
+0x8B43 U+6C17 # <cjk>
+0x8B44 U+6C7D # <cjk>
+0x8B45 U+757F # <cjk>
+0x8B46 U+7948 # <cjk>
+0x8B47 U+5B63 # <cjk>
+0x8B48 U+7A00 # <cjk>
+0x8B49 U+7D00 # <cjk>
+0x8B4A U+5FBD # <cjk>
+0x8B4B U+898F # <cjk>
+0x8B4C U+8A18 # <cjk>
+0x8B4D U+8CB4 # <cjk>
+0x8B4E U+8D77 # <cjk>
+0x8B4F U+8ECC # <cjk>
+0x8B50 U+8F1D # <cjk>
+0x8B51 U+98E2 # <cjk>
+0x8B52 U+9A0E # <cjk>
+0x8B53 U+9B3C # <cjk>
+0x8B54 U+4E80 # <cjk>
+0x8B55 U+507D # <cjk>
+0x8B56 U+5100 # <cjk>
+0x8B57 U+5993 # <cjk>
+0x8B58 U+5B9C # <cjk>
+0x8B59 U+622F # <cjk>
+0x8B5A U+6280 # <cjk>
+0x8B5B U+64EC # <cjk>
+0x8B5C U+6B3A # <cjk>
+0x8B5D U+72A0 # <cjk>
+0x8B5E U+7591 # <cjk>
+0x8B5F U+7947 # <cjk>
+0x8B60 U+7FA9 # <cjk>
+0x8B61 U+87FB # <cjk>
+0x8B62 U+8ABC # <cjk>
+0x8B63 U+8B70 # <cjk>
+0x8B64 U+63AC # <cjk>
+0x8B65 U+83CA # <cjk>
+0x8B66 U+97A0 # <cjk>
+0x8B67 U+5409 # <cjk>
+0x8B68 U+5403 # <cjk>
+0x8B69 U+55AB # <cjk>
+0x8B6A U+6854 # <cjk>
+0x8B6B U+6A58 # <cjk>
+0x8B6C U+8A70 # <cjk>
+0x8B6D U+7827 # <cjk>
+0x8B6E U+6775 # <cjk>
+0x8B6F U+9ECD # <cjk>
+0x8B70 U+5374 # <cjk>
+0x8B71 U+5BA2 # <cjk>
+0x8B72 U+811A # <cjk>
+0x8B73 U+8650 # <cjk>
+0x8B74 U+9006 # <cjk>
+0x8B75 U+4E18 # <cjk>
+0x8B76 U+4E45 # <cjk>
+0x8B77 U+4EC7 # <cjk>
+0x8B78 U+4F11 # <cjk>
+0x8B79 U+53CA # <cjk>
+0x8B7A U+5438 # <cjk>
+0x8B7B U+5BAE # <cjk>
+0x8B7C U+5F13 # <cjk>
+0x8B7D U+6025 # <cjk>
+0x8B7E U+6551 # <cjk>
+0x8B80 U+673D # <cjk>
+0x8B81 U+6C42 # <cjk>
+0x8B82 U+6C72 # <cjk>
+0x8B83 U+6CE3 # <cjk>
+0x8B84 U+7078 # <cjk>
+0x8B85 U+7403 # <cjk>
+0x8B86 U+7A76 # <cjk>
+0x8B87 U+7AAE # <cjk>
+0x8B88 U+7B08 # <cjk>
+0x8B89 U+7D1A # <cjk>
+0x8B8A U+7CFE # <cjk>
+0x8B8B U+7D66 # <cjk>
+0x8B8C U+65E7 # <cjk>
+0x8B8D U+725B # <cjk>
+0x8B8E U+53BB # <cjk>
+0x8B8F U+5C45 # <cjk>
+0x8B90 U+5DE8 # <cjk>
+0x8B91 U+62D2 # <cjk>
+0x8B92 U+62E0 # <cjk>
+0x8B93 U+6319 # <cjk>
+0x8B94 U+6E20 # <cjk>
+0x8B95 U+865A # <cjk>
+0x8B96 U+8A31 # <cjk>
+0x8B97 U+8DDD # <cjk>
+0x8B98 U+92F8 # <cjk>
+0x8B99 U+6F01 # <cjk>
+0x8B9A U+79A6 # <cjk>
+0x8B9B U+9B5A # <cjk>
+0x8B9C U+4EA8 # <cjk>
+0x8B9D U+4EAB # <cjk>
+0x8B9E U+4EAC # <cjk>
+0x8B9F U+4F9B # <cjk>
+0x8BA0 U+4FA0 # <cjk>
+0x8BA1 U+50D1 # <cjk>
+0x8BA2 U+5147 # <cjk>
+0x8BA3 U+7AF6 # <cjk>
+0x8BA4 U+5171 # <cjk>
+0x8BA5 U+51F6 # <cjk>
+0x8BA6 U+5354 # <cjk>
+0x8BA7 U+5321 # <cjk>
+0x8BA8 U+537F # <cjk>
+0x8BA9 U+53EB # <cjk>
+0x8BAA U+55AC # <cjk>
+0x8BAB U+5883 # <cjk>
+0x8BAC U+5CE1 # <cjk>
+0x8BAD U+5F37 # <cjk>
+0x8BAE U+5F4A # <cjk>
+0x8BAF U+602F # <cjk>
+0x8BB0 U+6050 # <cjk>
+0x8BB1 U+606D # <cjk>
+0x8BB2 U+631F # <cjk>
+0x8BB3 U+6559 # <cjk>
+0x8BB4 U+6A4B # <cjk>
+0x8BB5 U+6CC1 # <cjk>
+0x8BB6 U+72C2 # <cjk>
+0x8BB7 U+72ED # <cjk>
+0x8BB8 U+77EF # <cjk>
+0x8BB9 U+80F8 # <cjk>
+0x8BBA U+8105 # <cjk>
+0x8BBB U+8208 # <cjk>
+0x8BBC U+854E # <cjk>
+0x8BBD U+90F7 # <cjk>
+0x8BBE U+93E1 # <cjk>
+0x8BBF U+97FF # <cjk>
+0x8BC0 U+9957 # <cjk>
+0x8BC1 U+9A5A # <cjk>
+0x8BC2 U+4EF0 # <cjk>
+0x8BC3 U+51DD # <cjk>
+0x8BC4 U+5C2D # <cjk>
+0x8BC5 U+6681 # <cjk>
+0x8BC6 U+696D # <cjk>
+0x8BC7 U+5C40 # <cjk>
+0x8BC8 U+66F2 # <cjk>
+0x8BC9 U+6975 # <cjk>
+0x8BCA U+7389 # <cjk>
+0x8BCB U+6850 # <cjk>
+0x8BCC U+7C81 # <cjk>
+0x8BCD U+50C5 # <cjk>
+0x8BCE U+52E4 # <cjk>
+0x8BCF U+5747 # <cjk>
+0x8BD0 U+5DFE # <cjk>
+0x8BD1 U+9326 # <cjk>
+0x8BD2 U+65A4 # <cjk>
+0x8BD3 U+6B23 # <cjk>
+0x8BD4 U+6B3D # <cjk>
+0x8BD5 U+7434 # <cjk>
+0x8BD6 U+7981 # <cjk>
+0x8BD7 U+79BD # <cjk>
+0x8BD8 U+7B4B # <cjk>
+0x8BD9 U+7DCA # <cjk>
+0x8BDA U+82B9 # <cjk>
+0x8BDB U+83CC # <cjk>
+0x8BDC U+887F # <cjk>
+0x8BDD U+895F # <cjk>
+0x8BDE U+8B39 # <cjk>
+0x8BDF U+8FD1 # <cjk>
+0x8BE0 U+91D1 # <cjk>
+0x8BE1 U+541F # <cjk>
+0x8BE2 U+9280 # <cjk>
+0x8BE3 U+4E5D # <cjk>
+0x8BE4 U+5036 # <cjk>
+0x8BE5 U+53E5 # <cjk>
+0x8BE6 U+533A # <cjk>
+0x8BE7 U+72D7 # <cjk>
+0x8BE8 U+7396 # <cjk>
+0x8BE9 U+77E9 # <cjk>
+0x8BEA U+82E6 # <cjk>
+0x8BEB U+8EAF # <cjk>
+0x8BEC U+99C6 # <cjk>
+0x8BED U+99C8 # <cjk>
+0x8BEE U+99D2 # <cjk>
+0x8BEF U+5177 # <cjk>
+0x8BF0 U+611A # <cjk>
+0x8BF1 U+865E # <cjk>
+0x8BF2 U+55B0 # <cjk>
+0x8BF3 U+7A7A # <cjk>
+0x8BF4 U+5076 # <cjk>
+0x8BF5 U+5BD3 # <cjk>
+0x8BF6 U+9047 # <cjk>
+0x8BF7 U+9685 # <cjk>
+0x8BF8 U+4E32 # <cjk>
+0x8BF9 U+6ADB # <cjk>
+0x8BFA U+91E7 # <cjk>
+0x8BFB U+5C51 # <cjk>
+0x8BFC U+5C48 # <cjk>
+0x8C40 U+6398 # <cjk>
+0x8C41 U+7A9F # <cjk>
+0x8C42 U+6C93 # <cjk>
+0x8C43 U+9774 # <cjk>
+0x8C44 U+8F61 # <cjk>
+0x8C45 U+7AAA # <cjk>
+0x8C46 U+718A # <cjk>
+0x8C47 U+9688 # <cjk>
+0x8C48 U+7C82 # <cjk>
+0x8C49 U+6817 # <cjk>
+0x8C4A U+7E70 # <cjk>
+0x8C4B U+6851 # <cjk>
+0x8C4C U+936C # <cjk>
+0x8C4D U+52F2 # <cjk>
+0x8C4E U+541B # <cjk>
+0x8C4F U+85AB # <cjk>
+0x8C50 U+8A13 # <cjk>
+0x8C51 U+7FA4 # <cjk>
+0x8C52 U+8ECD # <cjk>
+0x8C53 U+90E1 # <cjk>
+0x8C54 U+5366 # <cjk>
+0x8C55 U+8888 # <cjk>
+0x8C56 U+7941 # <cjk>
+0x8C57 U+4FC2 # <cjk>
+0x8C58 U+50BE # <cjk>
+0x8C59 U+5211 # <cjk>
+0x8C5A U+5144 # <cjk>
+0x8C5B U+5553 # <cjk>
+0x8C5C U+572D # <cjk>
+0x8C5D U+73EA # <cjk>
+0x8C5E U+578B # <cjk>
+0x8C5F U+5951 # <cjk>
+0x8C60 U+5F62 # <cjk>
+0x8C61 U+5F84 # <cjk>
+0x8C62 U+6075 # <cjk>
+0x8C63 U+6176 # <cjk>
+0x8C64 U+6167 # <cjk>
+0x8C65 U+61A9 # <cjk>
+0x8C66 U+63B2 # <cjk>
+0x8C67 U+643A # <cjk>
+0x8C68 U+656C # <cjk>
+0x8C69 U+666F # <cjk>
+0x8C6A U+6842 # <cjk>
+0x8C6B U+6E13 # <cjk>
+0x8C6C U+7566 # <cjk>
+0x8C6D U+7A3D # <cjk>
+0x8C6E U+7CFB # <cjk>
+0x8C6F U+7D4C # <cjk>
+0x8C70 U+7D99 # <cjk>
+0x8C71 U+7E4B # <cjk>
+0x8C72 U+7F6B # <cjk>
+0x8C73 U+830E # <cjk>
+0x8C74 U+834A # <cjk>
+0x8C75 U+86CD # <cjk>
+0x8C76 U+8A08 # <cjk>
+0x8C77 U+8A63 # <cjk>
+0x8C78 U+8B66 # <cjk>
+0x8C79 U+8EFD # <cjk>
+0x8C7A U+981A # <cjk>
+0x8C7B U+9D8F # <cjk>
+0x8C7C U+82B8 # <cjk>
+0x8C7D U+8FCE # <cjk>
+0x8C7E U+9BE8 # <cjk>
+0x8C80 U+5287 # <cjk>
+0x8C81 U+621F # <cjk>
+0x8C82 U+6483 # <cjk>
+0x8C83 U+6FC0 # <cjk>
+0x8C84 U+9699 # <cjk>
+0x8C85 U+6841 # <cjk>
+0x8C86 U+5091 # <cjk>
+0x8C87 U+6B20 # <cjk>
+0x8C88 U+6C7A # <cjk>
+0x8C89 U+6F54 # <cjk>
+0x8C8A U+7A74 # <cjk>
+0x8C8B U+7D50 # <cjk>
+0x8C8C U+8840 # <cjk>
+0x8C8D U+8A23 # <cjk>
+0x8C8E U+6708 # <cjk>
+0x8C8F U+4EF6 # <cjk>
+0x8C90 U+5039 # <cjk>
+0x8C91 U+5026 # <cjk>
+0x8C92 U+5065 # <cjk>
+0x8C93 U+517C # <cjk>
+0x8C94 U+5238 # <cjk>
+0x8C95 U+5263 # <cjk>
+0x8C96 U+55A7 # <cjk>
+0x8C97 U+570F # <cjk>
+0x8C98 U+5805 # <cjk>
+0x8C99 U+5ACC # <cjk>
+0x8C9A U+5EFA # <cjk>
+0x8C9B U+61B2 # <cjk>
+0x8C9C U+61F8 # <cjk>
+0x8C9D U+62F3 # <cjk>
+0x8C9E U+6372 # <cjk>
+0x8C9F U+691C # <cjk>
+0x8CA0 U+6A29 # <cjk>
+0x8CA1 U+727D # <cjk>
+0x8CA2 U+72AC # <cjk>
+0x8CA3 U+732E # <cjk>
+0x8CA4 U+7814 # <cjk>
+0x8CA5 U+786F # <cjk>
+0x8CA6 U+7D79 # <cjk>
+0x8CA7 U+770C # <cjk>
+0x8CA8 U+80A9 # <cjk>
+0x8CA9 U+898B # <cjk>
+0x8CAA U+8B19 # <cjk>
+0x8CAB U+8CE2 # <cjk>
+0x8CAC U+8ED2 # <cjk>
+0x8CAD U+9063 # <cjk>
+0x8CAE U+9375 # <cjk>
+0x8CAF U+967A # <cjk>
+0x8CB0 U+9855 # <cjk>
+0x8CB1 U+9A13 # <cjk>
+0x8CB2 U+9E78 # <cjk>
+0x8CB3 U+5143 # <cjk>
+0x8CB4 U+539F # <cjk>
+0x8CB5 U+53B3 # <cjk>
+0x8CB6 U+5E7B # <cjk>
+0x8CB7 U+5F26 # <cjk>
+0x8CB8 U+6E1B # <cjk>
+0x8CB9 U+6E90 # <cjk>
+0x8CBA U+7384 # <cjk>
+0x8CBB U+73FE # <cjk>
+0x8CBC U+7D43 # <cjk>
+0x8CBD U+8237 # <cjk>
+0x8CBE U+8A00 # <cjk>
+0x8CBF U+8AFA # <cjk>
+0x8CC0 U+9650 # <cjk>
+0x8CC1 U+4E4E # <cjk>
+0x8CC2 U+500B # <cjk>
+0x8CC3 U+53E4 # <cjk>
+0x8CC4 U+547C # <cjk>
+0x8CC5 U+56FA # <cjk>
+0x8CC6 U+59D1 # <cjk>
+0x8CC7 U+5B64 # <cjk>
+0x8CC8 U+5DF1 # <cjk>
+0x8CC9 U+5EAB # <cjk>
+0x8CCA U+5F27 # <cjk>
+0x8CCB U+6238 # <cjk>
+0x8CCC U+6545 # <cjk>
+0x8CCD U+67AF # <cjk>
+0x8CCE U+6E56 # <cjk>
+0x8CCF U+72D0 # <cjk>
+0x8CD0 U+7CCA # <cjk>
+0x8CD1 U+88B4 # <cjk>
+0x8CD2 U+80A1 # <cjk>
+0x8CD3 U+80E1 # <cjk>
+0x8CD4 U+83F0 # <cjk>
+0x8CD5 U+864E # <cjk>
+0x8CD6 U+8A87 # <cjk>
+0x8CD7 U+8DE8 # <cjk>
+0x8CD8 U+9237 # <cjk>
+0x8CD9 U+96C7 # <cjk>
+0x8CDA U+9867 # <cjk>
+0x8CDB U+9F13 # <cjk>
+0x8CDC U+4E94 # <cjk>
+0x8CDD U+4E92 # <cjk>
+0x8CDE U+4F0D # <cjk>
+0x8CDF U+5348 # <cjk>
+0x8CE0 U+5449 # <cjk>
+0x8CE1 U+543E # <cjk>
+0x8CE2 U+5A2F # <cjk>
+0x8CE3 U+5F8C # <cjk>
+0x8CE4 U+5FA1 # <cjk>
+0x8CE5 U+609F # <cjk>
+0x8CE6 U+68A7 # <cjk>
+0x8CE7 U+6A8E # <cjk>
+0x8CE8 U+745A # <cjk>
+0x8CE9 U+7881 # <cjk>
+0x8CEA U+8A9E # <cjk>
+0x8CEB U+8AA4 # <cjk>
+0x8CEC U+8B77 # <cjk>
+0x8CED U+9190 # <cjk>
+0x8CEE U+4E5E # <cjk>
+0x8CEF U+9BC9 # <cjk>
+0x8CF0 U+4EA4 # <cjk>
+0x8CF1 U+4F7C # <cjk>
+0x8CF2 U+4FAF # <cjk>
+0x8CF3 U+5019 # <cjk>
+0x8CF4 U+5016 # <cjk>
+0x8CF5 U+5149 # <cjk>
+0x8CF6 U+516C # <cjk>
+0x8CF7 U+529F # <cjk>
+0x8CF8 U+52B9 # <cjk>
+0x8CF9 U+52FE # <cjk>
+0x8CFA U+539A # <cjk>
+0x8CFB U+53E3 # <cjk>
+0x8CFC U+5411 # <cjk>
+0x8D40 U+540E # <cjk>
+0x8D41 U+5589 # <cjk>
+0x8D42 U+5751 # <cjk>
+0x8D43 U+57A2 # <cjk>
+0x8D44 U+597D # <cjk>
+0x8D45 U+5B54 # <cjk>
+0x8D46 U+5B5D # <cjk>
+0x8D47 U+5B8F # <cjk>
+0x8D48 U+5DE5 # <cjk>
+0x8D49 U+5DE7 # <cjk>
+0x8D4A U+5DF7 # <cjk>
+0x8D4B U+5E78 # <cjk>
+0x8D4C U+5E83 # <cjk>
+0x8D4D U+5E9A # <cjk>
+0x8D4E U+5EB7 # <cjk>
+0x8D4F U+5F18 # <cjk>
+0x8D50 U+6052 # <cjk>
+0x8D51 U+614C # <cjk>
+0x8D52 U+6297 # <cjk>
+0x8D53 U+62D8 # <cjk>
+0x8D54 U+63A7 # <cjk>
+0x8D55 U+653B # <cjk>
+0x8D56 U+6602 # <cjk>
+0x8D57 U+6643 # <cjk>
+0x8D58 U+66F4 # <cjk>
+0x8D59 U+676D # <cjk>
+0x8D5A U+6821 # <cjk>
+0x8D5B U+6897 # <cjk>
+0x8D5C U+69CB # <cjk>
+0x8D5D U+6C5F # <cjk>
+0x8D5E U+6D2A # <cjk>
+0x8D5F U+6D69 # <cjk>
+0x8D60 U+6E2F # <cjk>
+0x8D61 U+6E9D # <cjk>
+0x8D62 U+7532 # <cjk>
+0x8D63 U+7687 # <cjk>
+0x8D64 U+786C # <cjk>
+0x8D65 U+7A3F # <cjk>
+0x8D66 U+7CE0 # <cjk>
+0x8D67 U+7D05 # <cjk>
+0x8D68 U+7D18 # <cjk>
+0x8D69 U+7D5E # <cjk>
+0x8D6A U+7DB1 # <cjk>
+0x8D6B U+8015 # <cjk>
+0x8D6C U+8003 # <cjk>
+0x8D6D U+80AF # <cjk>
+0x8D6E U+80B1 # <cjk>
+0x8D6F U+8154 # <cjk>
+0x8D70 U+818F # <cjk>
+0x8D71 U+822A # <cjk>
+0x8D72 U+8352 # <cjk>
+0x8D73 U+884C # <cjk>
+0x8D74 U+8861 # <cjk>
+0x8D75 U+8B1B # <cjk>
+0x8D76 U+8CA2 # <cjk>
+0x8D77 U+8CFC # <cjk>
+0x8D78 U+90CA # <cjk>
+0x8D79 U+9175 # <cjk>
+0x8D7A U+9271 # <cjk>
+0x8D7B U+783F # <cjk>
+0x8D7C U+92FC # <cjk>
+0x8D7D U+95A4 # <cjk>
+0x8D7E U+964D # <cjk>
+0x8D80 U+9805 # <cjk>
+0x8D81 U+9999 # <cjk>
+0x8D82 U+9AD8 # <cjk>
+0x8D83 U+9D3B # <cjk>
+0x8D84 U+525B # <cjk>
+0x8D85 U+52AB # <cjk>
+0x8D86 U+53F7 # <cjk>
+0x8D87 U+5408 # <cjk>
+0x8D88 U+58D5 # <cjk>
+0x8D89 U+62F7 # <cjk>
+0x8D8A U+6FE0 # <cjk>
+0x8D8B U+8C6A # <cjk>
+0x8D8C U+8F5F # <cjk>
+0x8D8D U+9EB9 # <cjk>
+0x8D8E U+514B # <cjk>
+0x8D8F U+523B # <cjk>
+0x8D90 U+544A # <cjk>
+0x8D91 U+56FD # <cjk>
+0x8D92 U+7A40 # <cjk>
+0x8D93 U+9177 # <cjk>
+0x8D94 U+9D60 # <cjk>
+0x8D95 U+9ED2 # <cjk>
+0x8D96 U+7344 # <cjk>
+0x8D97 U+6F09 # <cjk>
+0x8D98 U+8170 # <cjk>
+0x8D99 U+7511 # <cjk>
+0x8D9A U+5FFD # <cjk>
+0x8D9B U+60DA # <cjk>
+0x8D9C U+9AA8 # <cjk>
+0x8D9D U+72DB # <cjk>
+0x8D9E U+8FBC # <cjk>
+0x8D9F U+6B64 # <cjk>
+0x8DA0 U+9803 # <cjk>
+0x8DA1 U+4ECA # <cjk>
+0x8DA2 U+56F0 # <cjk>
+0x8DA3 U+5764 # <cjk>
+0x8DA4 U+58BE # <cjk>
+0x8DA5 U+5A5A # <cjk>
+0x8DA6 U+6068 # <cjk>
+0x8DA7 U+61C7 # <cjk>
+0x8DA8 U+660F # <cjk>
+0x8DA9 U+6606 # <cjk>
+0x8DAA U+6839 # <cjk>
+0x8DAB U+68B1 # <cjk>
+0x8DAC U+6DF7 # <cjk>
+0x8DAD U+75D5 # <cjk>
+0x8DAE U+7D3A # <cjk>
+0x8DAF U+826E # <cjk>
+0x8DB0 U+9B42 # <cjk>
+0x8DB1 U+4E9B # <cjk>
+0x8DB2 U+4F50 # <cjk>
+0x8DB3 U+53C9 # <cjk>
+0x8DB4 U+5506 # <cjk>
+0x8DB5 U+5D6F # <cjk>
+0x8DB6 U+5DE6 # <cjk>
+0x8DB7 U+5DEE # <cjk>
+0x8DB8 U+67FB # <cjk>
+0x8DB9 U+6C99 # <cjk>
+0x8DBA U+7473 # <cjk>
+0x8DBB U+7802 # <cjk>
+0x8DBC U+8A50 # <cjk>
+0x8DBD U+9396 # <cjk>
+0x8DBE U+88DF # <cjk>
+0x8DBF U+5750 # <cjk>
+0x8DC0 U+5EA7 # <cjk>
+0x8DC1 U+632B # <cjk>
+0x8DC2 U+50B5 # <cjk>
+0x8DC3 U+50AC # <cjk>
+0x8DC4 U+518D # <cjk>
+0x8DC5 U+6700 # <cjk>
+0x8DC6 U+54C9 # <cjk>
+0x8DC7 U+585E # <cjk>
+0x8DC8 U+59BB # <cjk>
+0x8DC9 U+5BB0 # <cjk>
+0x8DCA U+5F69 # <cjk>
+0x8DCB U+624D # <cjk>
+0x8DCC U+63A1 # <cjk>
+0x8DCD U+683D # <cjk>
+0x8DCE U+6B73 # <cjk>
+0x8DCF U+6E08 # <cjk>
+0x8DD0 U+707D # <cjk>
+0x8DD1 U+91C7 # <cjk>
+0x8DD2 U+7280 # <cjk>
+0x8DD3 U+7815 # <cjk>
+0x8DD4 U+7826 # <cjk>
+0x8DD5 U+796D # <cjk>
+0x8DD6 U+658E # <cjk>
+0x8DD7 U+7D30 # <cjk>
+0x8DD8 U+83DC # <cjk>
+0x8DD9 U+88C1 # <cjk>
+0x8DDA U+8F09 # <cjk>
+0x8DDB U+969B # <cjk>
+0x8DDC U+5264 # <cjk>
+0x8DDD U+5728 # <cjk>
+0x8DDE U+6750 # <cjk>
+0x8DDF U+7F6A # <cjk>
+0x8DE0 U+8CA1 # <cjk>
+0x8DE1 U+51B4 # <cjk>
+0x8DE2 U+5742 # <cjk>
+0x8DE3 U+962A # <cjk>
+0x8DE4 U+583A # <cjk>
+0x8DE5 U+698A # <cjk>
+0x8DE6 U+80B4 # <cjk>
+0x8DE7 U+54B2 # <cjk>
+0x8DE8 U+5D0E # <cjk>
+0x8DE9 U+57FC # <cjk>
+0x8DEA U+7895 # <cjk>
+0x8DEB U+9DFA # <cjk>
+0x8DEC U+4F5C # <cjk>
+0x8DED U+524A # <cjk>
+0x8DEE U+548B # <cjk>
+0x8DEF U+643E # <cjk>
+0x8DF0 U+6628 # <cjk>
+0x8DF1 U+6714 # <cjk>
+0x8DF2 U+67F5 # <cjk>
+0x8DF3 U+7A84 # <cjk>
+0x8DF4 U+7B56 # <cjk>
+0x8DF5 U+7D22 # <cjk>
+0x8DF6 U+932F # <cjk>
+0x8DF7 U+685C # <cjk>
+0x8DF8 U+9BAD # <cjk>
+0x8DF9 U+7B39 # <cjk>
+0x8DFA U+5319 # <cjk>
+0x8DFB U+518A # <cjk>
+0x8DFC U+5237 # <cjk>
+0x8E40 U+5BDF # <cjk>
+0x8E41 U+62F6 # <cjk>
+0x8E42 U+64AE # <cjk>
+0x8E43 U+64E6 # <cjk>
+0x8E44 U+672D # <cjk>
+0x8E45 U+6BBA # <cjk>
+0x8E46 U+85A9 # <cjk>
+0x8E47 U+96D1 # <cjk>
+0x8E48 U+7690 # <cjk>
+0x8E49 U+9BD6 # <cjk>
+0x8E4A U+634C # <cjk>
+0x8E4B U+9306 # <cjk>
+0x8E4C U+9BAB # <cjk>
+0x8E4D U+76BF # <cjk>
+0x8E4E U+6652 # <cjk>
+0x8E4F U+4E09 # <cjk>
+0x8E50 U+5098 # <cjk>
+0x8E51 U+53C2 # <cjk>
+0x8E52 U+5C71 # <cjk>
+0x8E53 U+60E8 # <cjk>
+0x8E54 U+6492 # <cjk>
+0x8E55 U+6563 # <cjk>
+0x8E56 U+685F # <cjk>
+0x8E57 U+71E6 # <cjk>
+0x8E58 U+73CA # <cjk>
+0x8E59 U+7523 # <cjk>
+0x8E5A U+7B97 # <cjk>
+0x8E5B U+7E82 # <cjk>
+0x8E5C U+8695 # <cjk>
+0x8E5D U+8B83 # <cjk>
+0x8E5E U+8CDB # <cjk>
+0x8E5F U+9178 # <cjk>
+0x8E60 U+9910 # <cjk>
+0x8E61 U+65AC # <cjk>
+0x8E62 U+66AB # <cjk>
+0x8E63 U+6B8B # <cjk>
+0x8E64 U+4ED5 # <cjk>
+0x8E65 U+4ED4 # <cjk>
+0x8E66 U+4F3A # <cjk>
+0x8E67 U+4F7F # <cjk>
+0x8E68 U+523A # <cjk>
+0x8E69 U+53F8 # <cjk>
+0x8E6A U+53F2 # <cjk>
+0x8E6B U+55E3 # <cjk>
+0x8E6C U+56DB # <cjk>
+0x8E6D U+58EB # <cjk>
+0x8E6E U+59CB # <cjk>
+0x8E6F U+59C9 # <cjk>
+0x8E70 U+59FF # <cjk>
+0x8E71 U+5B50 # <cjk>
+0x8E72 U+5C4D # <cjk>
+0x8E73 U+5E02 # <cjk>
+0x8E74 U+5E2B # <cjk>
+0x8E75 U+5FD7 # <cjk>
+0x8E76 U+601D # <cjk>
+0x8E77 U+6307 # <cjk>
+0x8E78 U+652F # <cjk>
+0x8E79 U+5B5C # <cjk>
+0x8E7A U+65AF # <cjk>
+0x8E7B U+65BD # <cjk>
+0x8E7C U+65E8 # <cjk>
+0x8E7D U+679D # <cjk>
+0x8E7E U+6B62 # <cjk>
+0x8E80 U+6B7B # <cjk>
+0x8E81 U+6C0F # <cjk>
+0x8E82 U+7345 # <cjk>
+0x8E83 U+7949 # <cjk>
+0x8E84 U+79C1 # <cjk>
+0x8E85 U+7CF8 # <cjk>
+0x8E86 U+7D19 # <cjk>
+0x8E87 U+7D2B # <cjk>
+0x8E88 U+80A2 # <cjk>
+0x8E89 U+8102 # <cjk>
+0x8E8A U+81F3 # <cjk>
+0x8E8B U+8996 # <cjk>
+0x8E8C U+8A5E # <cjk>
+0x8E8D U+8A69 # <cjk>
+0x8E8E U+8A66 # <cjk>
+0x8E8F U+8A8C # <cjk>
+0x8E90 U+8AEE # <cjk>
+0x8E91 U+8CC7 # <cjk>
+0x8E92 U+8CDC # <cjk>
+0x8E93 U+96CC # <cjk>
+0x8E94 U+98FC # <cjk>
+0x8E95 U+6B6F # <cjk>
+0x8E96 U+4E8B # <cjk>
+0x8E97 U+4F3C # <cjk>
+0x8E98 U+4F8D # <cjk>
+0x8E99 U+5150 # <cjk>
+0x8E9A U+5B57 # <cjk>
+0x8E9B U+5BFA # <cjk>
+0x8E9C U+6148 # <cjk>
+0x8E9D U+6301 # <cjk>
+0x8E9E U+6642 # <cjk>
+0x8E9F U+6B21 # <cjk>
+0x8EA0 U+6ECB # <cjk>
+0x8EA1 U+6CBB # <cjk>
+0x8EA2 U+723E # <cjk>
+0x8EA3 U+74BD # <cjk>
+0x8EA4 U+75D4 # <cjk>
+0x8EA5 U+78C1 # <cjk>
+0x8EA6 U+793A # <cjk>
+0x8EA7 U+800C # <cjk>
+0x8EA8 U+8033 # <cjk>
+0x8EA9 U+81EA # <cjk>
+0x8EAA U+8494 # <cjk>
+0x8EAB U+8F9E # <cjk>
+0x8EAC U+6C50 # <cjk>
+0x8EAD U+9E7F # <cjk>
+0x8EAE U+5F0F # <cjk>
+0x8EAF U+8B58 # <cjk>
+0x8EB0 U+9D2B # <cjk>
+0x8EB1 U+7AFA # <cjk>
+0x8EB2 U+8EF8 # <cjk>
+0x8EB3 U+5B8D # <cjk>
+0x8EB4 U+96EB # <cjk>
+0x8EB5 U+4E03 # <cjk>
+0x8EB6 U+53F1 # <cjk>
+0x8EB7 U+57F7 # <cjk>
+0x8EB8 U+5931 # <cjk>
+0x8EB9 U+5AC9 # <cjk>
+0x8EBA U+5BA4 # <cjk>
+0x8EBB U+6089 # <cjk>
+0x8EBC U+6E7F # <cjk>
+0x8EBD U+6F06 # <cjk>
+0x8EBE U+75BE # <cjk>
+0x8EBF U+8CEA # <cjk>
+0x8EC0 U+5B9F # <cjk>
+0x8EC1 U+8500 # <cjk>
+0x8EC2 U+7BE0 # <cjk>
+0x8EC3 U+5072 # <cjk>
+0x8EC4 U+67F4 # <cjk>
+0x8EC5 U+829D # <cjk>
+0x8EC6 U+5C61 # <cjk>
+0x8EC7 U+854A # <cjk>
+0x8EC8 U+7E1E # <cjk>
+0x8EC9 U+820E # <cjk>
+0x8ECA U+5199 # <cjk>
+0x8ECB U+5C04 # <cjk>
+0x8ECC U+6368 # <cjk>
+0x8ECD U+8D66 # <cjk>
+0x8ECE U+659C # <cjk>
+0x8ECF U+716E # <cjk>
+0x8ED0 U+793E # <cjk>
+0x8ED1 U+7D17 # <cjk>
+0x8ED2 U+8005 # <cjk>
+0x8ED3 U+8B1D # <cjk>
+0x8ED4 U+8ECA # <cjk>
+0x8ED5 U+906E # <cjk>
+0x8ED6 U+86C7 # <cjk>
+0x8ED7 U+90AA # <cjk>
+0x8ED8 U+501F # <cjk>
+0x8ED9 U+52FA # <cjk>
+0x8EDA U+5C3A # <cjk>
+0x8EDB U+6753 # <cjk>
+0x8EDC U+707C # <cjk>
+0x8EDD U+7235 # <cjk>
+0x8EDE U+914C # <cjk>
+0x8EDF U+91C8 # <cjk>
+0x8EE0 U+932B # <cjk>
+0x8EE1 U+82E5 # <cjk>
+0x8EE2 U+5BC2 # <cjk>
+0x8EE3 U+5F31 # <cjk>
+0x8EE4 U+60F9 # <cjk>
+0x8EE5 U+4E3B # <cjk>
+0x8EE6 U+53D6 # <cjk>
+0x8EE7 U+5B88 # <cjk>
+0x8EE8 U+624B # <cjk>
+0x8EE9 U+6731 # <cjk>
+0x8EEA U+6B8A # <cjk>
+0x8EEB U+72E9 # <cjk>
+0x8EEC U+73E0 # <cjk>
+0x8EED U+7A2E # <cjk>
+0x8EEE U+816B # <cjk>
+0x8EEF U+8DA3 # <cjk>
+0x8EF0 U+9152 # <cjk>
+0x8EF1 U+9996 # <cjk>
+0x8EF2 U+5112 # <cjk>
+0x8EF3 U+53D7 # <cjk>
+0x8EF4 U+546A # <cjk>
+0x8EF5 U+5BFF # <cjk>
+0x8EF6 U+6388 # <cjk>
+0x8EF7 U+6A39 # <cjk>
+0x8EF8 U+7DAC # <cjk>
+0x8EF9 U+9700 # <cjk>
+0x8EFA U+56DA # <cjk>
+0x8EFB U+53CE # <cjk>
+0x8EFC U+5468 # <cjk>
+0x8F40 U+5B97 # <cjk>
+0x8F41 U+5C31 # <cjk>
+0x8F42 U+5DDE # <cjk>
+0x8F43 U+4FEE # <cjk>
+0x8F44 U+6101 # <cjk>
+0x8F45 U+62FE # <cjk>
+0x8F46 U+6D32 # <cjk>
+0x8F47 U+79C0 # <cjk>
+0x8F48 U+79CB # <cjk>
+0x8F49 U+7D42 # <cjk>
+0x8F4A U+7E4D # <cjk>
+0x8F4B U+7FD2 # <cjk>
+0x8F4C U+81ED # <cjk>
+0x8F4D U+821F # <cjk>
+0x8F4E U+8490 # <cjk>
+0x8F4F U+8846 # <cjk>
+0x8F50 U+8972 # <cjk>
+0x8F51 U+8B90 # <cjk>
+0x8F52 U+8E74 # <cjk>
+0x8F53 U+8F2F # <cjk>
+0x8F54 U+9031 # <cjk>
+0x8F55 U+914B # <cjk>
+0x8F56 U+916C # <cjk>
+0x8F57 U+96C6 # <cjk>
+0x8F58 U+919C # <cjk>
+0x8F59 U+4EC0 # <cjk>
+0x8F5A U+4F4F # <cjk>
+0x8F5B U+5145 # <cjk>
+0x8F5C U+5341 # <cjk>
+0x8F5D U+5F93 # <cjk>
+0x8F5E U+620E # <cjk>
+0x8F5F U+67D4 # <cjk>
+0x8F60 U+6C41 # <cjk>
+0x8F61 U+6E0B # <cjk>
+0x8F62 U+7363 # <cjk>
+0x8F63 U+7E26 # <cjk>
+0x8F64 U+91CD # <cjk>
+0x8F65 U+9283 # <cjk>
+0x8F66 U+53D4 # <cjk>
+0x8F67 U+5919 # <cjk>
+0x8F68 U+5BBF # <cjk>
+0x8F69 U+6DD1 # <cjk>
+0x8F6A U+795D # <cjk>
+0x8F6B U+7E2E # <cjk>
+0x8F6C U+7C9B # <cjk>
+0x8F6D U+587E # <cjk>
+0x8F6E U+719F # <cjk>
+0x8F6F U+51FA # <cjk>
+0x8F70 U+8853 # <cjk>
+0x8F71 U+8FF0 # <cjk>
+0x8F72 U+4FCA # <cjk>
+0x8F73 U+5CFB # <cjk>
+0x8F74 U+6625 # <cjk>
+0x8F75 U+77AC # <cjk>
+0x8F76 U+7AE3 # <cjk>
+0x8F77 U+821C # <cjk>
+0x8F78 U+99FF # <cjk>
+0x8F79 U+51C6 # <cjk>
+0x8F7A U+5FAA # <cjk>
+0x8F7B U+65EC # <cjk>
+0x8F7C U+696F # <cjk>
+0x8F7D U+6B89 # <cjk>
+0x8F7E U+6DF3 # <cjk>
+0x8F80 U+6E96 # <cjk>
+0x8F81 U+6F64 # <cjk>
+0x8F82 U+76FE # <cjk>
+0x8F83 U+7D14 # <cjk>
+0x8F84 U+5DE1 # <cjk>
+0x8F85 U+9075 # <cjk>
+0x8F86 U+9187 # <cjk>
+0x8F87 U+9806 # <cjk>
+0x8F88 U+51E6 # <cjk>
+0x8F89 U+521D # <cjk>
+0x8F8A U+6240 # <cjk>
+0x8F8B U+6691 # <cjk>
+0x8F8C U+66D9 # <cjk>
+0x8F8D U+6E1A # <cjk>
+0x8F8E U+5EB6 # <cjk>
+0x8F8F U+7DD2 # <cjk>
+0x8F90 U+7F72 # <cjk>
+0x8F91 U+66F8 # <cjk>
+0x8F92 U+85AF # <cjk>
+0x8F93 U+85F7 # <cjk>
+0x8F94 U+8AF8 # <cjk>
+0x8F95 U+52A9 # <cjk>
+0x8F96 U+53D9 # <cjk>
+0x8F97 U+5973 # <cjk>
+0x8F98 U+5E8F # <cjk>
+0x8F99 U+5F90 # <cjk>
+0x8F9A U+6055 # <cjk>
+0x8F9B U+92E4 # <cjk>
+0x8F9C U+9664 # <cjk>
+0x8F9D U+50B7 # <cjk>
+0x8F9E U+511F # <cjk>
+0x8F9F U+52DD # <cjk>
+0x8FA0 U+5320 # <cjk>
+0x8FA1 U+5347 # <cjk>
+0x8FA2 U+53EC # <cjk>
+0x8FA3 U+54E8 # <cjk>
+0x8FA4 U+5546 # <cjk>
+0x8FA5 U+5531 # <cjk>
+0x8FA6 U+5617 # <cjk>
+0x8FA7 U+5968 # <cjk>
+0x8FA8 U+59BE # <cjk>
+0x8FA9 U+5A3C # <cjk>
+0x8FAA U+5BB5 # <cjk>
+0x8FAB U+5C06 # <cjk>
+0x8FAC U+5C0F # <cjk>
+0x8FAD U+5C11 # <cjk>
+0x8FAE U+5C1A # <cjk>
+0x8FAF U+5E84 # <cjk>
+0x8FB0 U+5E8A # <cjk>
+0x8FB1 U+5EE0 # <cjk>
+0x8FB2 U+5F70 # <cjk>
+0x8FB3 U+627F # <cjk>
+0x8FB4 U+6284 # <cjk>
+0x8FB5 U+62DB # <cjk>
+0x8FB6 U+638C # <cjk>
+0x8FB7 U+6377 # <cjk>
+0x8FB8 U+6607 # <cjk>
+0x8FB9 U+660C # <cjk>
+0x8FBA U+662D # <cjk>
+0x8FBB U+6676 # <cjk>
+0x8FBC U+677E # <cjk>
+0x8FBD U+68A2 # <cjk>
+0x8FBE U+6A1F # <cjk>
+0x8FBF U+6A35 # <cjk>
+0x8FC0 U+6CBC # <cjk>
+0x8FC1 U+6D88 # <cjk>
+0x8FC2 U+6E09 # <cjk>
+0x8FC3 U+6E58 # <cjk>
+0x8FC4 U+713C # <cjk>
+0x8FC5 U+7126 # <cjk>
+0x8FC6 U+7167 # <cjk>
+0x8FC7 U+75C7 # <cjk>
+0x8FC8 U+7701 # <cjk>
+0x8FC9 U+785D # <cjk>
+0x8FCA U+7901 # <cjk>
+0x8FCB U+7965 # <cjk>
+0x8FCC U+79F0 # <cjk>
+0x8FCD U+7AE0 # <cjk>
+0x8FCE U+7B11 # <cjk>
+0x8FCF U+7CA7 # <cjk>
+0x8FD0 U+7D39 # <cjk>
+0x8FD1 U+8096 # <cjk>
+0x8FD2 U+83D6 # <cjk>
+0x8FD3 U+848B # <cjk>
+0x8FD4 U+8549 # <cjk>
+0x8FD5 U+885D # <cjk>
+0x8FD6 U+88F3 # <cjk>
+0x8FD7 U+8A1F # <cjk>
+0x8FD8 U+8A3C # <cjk>
+0x8FD9 U+8A54 # <cjk>
+0x8FDA U+8A73 # <cjk>
+0x8FDB U+8C61 # <cjk>
+0x8FDC U+8CDE # <cjk>
+0x8FDD U+91A4 # <cjk>
+0x8FDE U+9266 # <cjk>
+0x8FDF U+937E # <cjk>
+0x8FE0 U+9418 # <cjk>
+0x8FE1 U+969C # <cjk>
+0x8FE2 U+9798 # <cjk>
+0x8FE3 U+4E0A # <cjk>
+0x8FE4 U+4E08 # <cjk>
+0x8FE5 U+4E1E # <cjk>
+0x8FE6 U+4E57 # <cjk>
+0x8FE7 U+5197 # <cjk>
+0x8FE8 U+5270 # <cjk>
+0x8FE9 U+57CE # <cjk>
+0x8FEA U+5834 # <cjk>
+0x8FEB U+58CC # <cjk>
+0x8FEC U+5B22 # <cjk>
+0x8FED U+5E38 # <cjk>
+0x8FEE U+60C5 # <cjk>
+0x8FEF U+64FE # <cjk>
+0x8FF0 U+6761 # <cjk>
+0x8FF1 U+6756 # <cjk>
+0x8FF2 U+6D44 # <cjk>
+0x8FF3 U+72B6 # <cjk>
+0x8FF4 U+7573 # <cjk>
+0x8FF5 U+7A63 # <cjk>
+0x8FF6 U+84B8 # <cjk>
+0x8FF7 U+8B72 # <cjk>
+0x8FF8 U+91B8 # <cjk>
+0x8FF9 U+9320 # <cjk>
+0x8FFA U+5631 # <cjk>
+0x8FFB U+57F4 # <cjk>
+0x8FFC U+98FE # <cjk>
+0x9040 U+62ED # <cjk>
+0x9041 U+690D # <cjk>
+0x9042 U+6B96 # <cjk>
+0x9043 U+71ED # <cjk>
+0x9044 U+7E54 # <cjk>
+0x9045 U+8077 # <cjk>
+0x9046 U+8272 # <cjk>
+0x9047 U+89E6 # <cjk>
+0x9048 U+98DF # <cjk>
+0x9049 U+8755 # <cjk>
+0x904A U+8FB1 # <cjk>
+0x904B U+5C3B # <cjk>
+0x904C U+4F38 # <cjk>
+0x904D U+4FE1 # <cjk>
+0x904E U+4FB5 # <cjk>
+0x904F U+5507 # <cjk>
+0x9050 U+5A20 # <cjk>
+0x9051 U+5BDD # <cjk>
+0x9052 U+5BE9 # <cjk>
+0x9053 U+5FC3 # <cjk>
+0x9054 U+614E # <cjk>
+0x9055 U+632F # <cjk>
+0x9056 U+65B0 # <cjk>
+0x9057 U+664B # <cjk>
+0x9058 U+68EE # <cjk>
+0x9059 U+699B # <cjk>
+0x905A U+6D78 # <cjk>
+0x905B U+6DF1 # <cjk>
+0x905C U+7533 # <cjk>
+0x905D U+75B9 # <cjk>
+0x905E U+771F # <cjk>
+0x905F U+795E # <cjk>
+0x9060 U+79E6 # <cjk>
+0x9061 U+7D33 # <cjk>
+0x9062 U+81E3 # <cjk>
+0x9063 U+82AF # <cjk>
+0x9064 U+85AA # <cjk>
+0x9065 U+89AA # <cjk>
+0x9066 U+8A3A # <cjk>
+0x9067 U+8EAB # <cjk>
+0x9068 U+8F9B # <cjk>
+0x9069 U+9032 # <cjk>
+0x906A U+91DD # <cjk>
+0x906B U+9707 # <cjk>
+0x906C U+4EBA # <cjk>
+0x906D U+4EC1 # <cjk>
+0x906E U+5203 # <cjk>
+0x906F U+5875 # <cjk>
+0x9070 U+58EC # <cjk>
+0x9071 U+5C0B # <cjk>
+0x9072 U+751A # <cjk>
+0x9073 U+5C3D # <cjk>
+0x9074 U+814E # <cjk>
+0x9075 U+8A0A # <cjk>
+0x9076 U+8FC5 # <cjk>
+0x9077 U+9663 # <cjk>
+0x9078 U+976D # <cjk>
+0x9079 U+7B25 # <cjk>
+0x907A U+8ACF # <cjk>
+0x907B U+9808 # <cjk>
+0x907C U+9162 # <cjk>
+0x907D U+56F3 # <cjk>
+0x907E U+53A8 # <cjk>
+0x9080 U+9017 # <cjk>
+0x9081 U+5439 # <cjk>
+0x9082 U+5782 # <cjk>
+0x9083 U+5E25 # <cjk>
+0x9084 U+63A8 # <cjk>
+0x9085 U+6C34 # <cjk>
+0x9086 U+708A # <cjk>
+0x9087 U+7761 # <cjk>
+0x9088 U+7C8B # <cjk>
+0x9089 U+7FE0 # <cjk>
+0x908A U+8870 # <cjk>
+0x908B U+9042 # <cjk>
+0x908C U+9154 # <cjk>
+0x908D U+9310 # <cjk>
+0x908E U+9318 # <cjk>
+0x908F U+968F # <cjk>
+0x9090 U+745E # <cjk>
+0x9091 U+9AC4 # <cjk>
+0x9092 U+5D07 # <cjk>
+0x9093 U+5D69 # <cjk>
+0x9094 U+6570 # <cjk>
+0x9095 U+67A2 # <cjk>
+0x9096 U+8DA8 # <cjk>
+0x9097 U+96DB # <cjk>
+0x9098 U+636E # <cjk>
+0x9099 U+6749 # <cjk>
+0x909A U+6919 # <cjk>
+0x909B U+83C5 # <cjk>
+0x909C U+9817 # <cjk>
+0x909D U+96C0 # <cjk>
+0x909E U+88FE # <cjk>
+0x909F U+6F84 # <cjk>
+0x90A0 U+647A # <cjk>
+0x90A1 U+5BF8 # <cjk>
+0x90A2 U+4E16 # <cjk>
+0x90A3 U+702C # <cjk>
+0x90A4 U+755D # <cjk>
+0x90A5 U+662F # <cjk>
+0x90A6 U+51C4 # <cjk>
+0x90A7 U+5236 # <cjk>
+0x90A8 U+52E2 # <cjk>
+0x90A9 U+59D3 # <cjk>
+0x90AA U+5F81 # <cjk>
+0x90AB U+6027 # <cjk>
+0x90AC U+6210 # <cjk>
+0x90AD U+653F # <cjk>
+0x90AE U+6574 # <cjk>
+0x90AF U+661F # <cjk>
+0x90B0 U+6674 # <cjk>
+0x90B1 U+68F2 # <cjk>
+0x90B2 U+6816 # <cjk>
+0x90B3 U+6B63 # <cjk>
+0x90B4 U+6E05 # <cjk>
+0x90B5 U+7272 # <cjk>
+0x90B6 U+751F # <cjk>
+0x90B7 U+76DB # <cjk>
+0x90B8 U+7CBE # <cjk>
+0x90B9 U+8056 # <cjk>
+0x90BA U+58F0 # <cjk>
+0x90BB U+88FD # <cjk>
+0x90BC U+897F # <cjk>
+0x90BD U+8AA0 # <cjk>
+0x90BE U+8A93 # <cjk>
+0x90BF U+8ACB # <cjk>
+0x90C0 U+901D # <cjk>
+0x90C1 U+9192 # <cjk>
+0x90C2 U+9752 # <cjk>
+0x90C3 U+9759 # <cjk>
+0x90C4 U+6589 # <cjk>
+0x90C5 U+7A0E # <cjk>
+0x90C6 U+8106 # <cjk>
+0x90C7 U+96BB # <cjk>
+0x90C8 U+5E2D # <cjk>
+0x90C9 U+60DC # <cjk>
+0x90CA U+621A # <cjk>
+0x90CB U+65A5 # <cjk>
+0x90CC U+6614 # <cjk>
+0x90CD U+6790 # <cjk>
+0x90CE U+77F3 # <cjk>
+0x90CF U+7A4D # <cjk>
+0x90D0 U+7C4D # <cjk>
+0x90D1 U+7E3E # <cjk>
+0x90D2 U+810A # <cjk>
+0x90D3 U+8CAC # <cjk>
+0x90D4 U+8D64 # <cjk>
+0x90D5 U+8DE1 # <cjk>
+0x90D6 U+8E5F # <cjk>
+0x90D7 U+78A9 # <cjk>
+0x90D8 U+5207 # <cjk>
+0x90D9 U+62D9 # <cjk>
+0x90DA U+63A5 # <cjk>
+0x90DB U+6442 # <cjk>
+0x90DC U+6298 # <cjk>
+0x90DD U+8A2D # <cjk>
+0x90DE U+7A83 # <cjk>
+0x90DF U+7BC0 # <cjk>
+0x90E0 U+8AAC # <cjk>
+0x90E1 U+96EA # <cjk>
+0x90E2 U+7D76 # <cjk>
+0x90E3 U+820C # <cjk>
+0x90E4 U+8749 # <cjk>
+0x90E5 U+4ED9 # <cjk>
+0x90E6 U+5148 # <cjk>
+0x90E7 U+5343 # <cjk>
+0x90E8 U+5360 # <cjk>
+0x90E9 U+5BA3 # <cjk>
+0x90EA U+5C02 # <cjk>
+0x90EB U+5C16 # <cjk>
+0x90EC U+5DDD # <cjk>
+0x90ED U+6226 # <cjk>
+0x90EE U+6247 # <cjk>
+0x90EF U+64B0 # <cjk>
+0x90F0 U+6813 # <cjk>
+0x90F1 U+6834 # <cjk>
+0x90F2 U+6CC9 # <cjk>
+0x90F3 U+6D45 # <cjk>
+0x90F4 U+6D17 # <cjk>
+0x90F5 U+67D3 # <cjk>
+0x90F6 U+6F5C # <cjk>
+0x90F7 U+714E # <cjk>
+0x90F8 U+717D # <cjk>
+0x90F9 U+65CB # <cjk>
+0x90FA U+7A7F # <cjk>
+0x90FB U+7BAD # <cjk>
+0x90FC U+7DDA # <cjk>
+0x9140 U+7E4A # <cjk>
+0x9141 U+7FA8 # <cjk>
+0x9142 U+817A # <cjk>
+0x9143 U+821B # <cjk>
+0x9144 U+8239 # <cjk>
+0x9145 U+85A6 # <cjk>
+0x9146 U+8A6E # <cjk>
+0x9147 U+8CCE # <cjk>
+0x9148 U+8DF5 # <cjk>
+0x9149 U+9078 # <cjk>
+0x914A U+9077 # <cjk>
+0x914B U+92AD # <cjk>
+0x914C U+9291 # <cjk>
+0x914D U+9583 # <cjk>
+0x914E U+9BAE # <cjk>
+0x914F U+524D # <cjk>
+0x9150 U+5584 # <cjk>
+0x9151 U+6F38 # <cjk>
+0x9152 U+7136 # <cjk>
+0x9153 U+5168 # <cjk>
+0x9154 U+7985 # <cjk>
+0x9155 U+7E55 # <cjk>
+0x9156 U+81B3 # <cjk>
+0x9157 U+7CCE # <cjk>
+0x9158 U+564C # <cjk>
+0x9159 U+5851 # <cjk>
+0x915A U+5CA8 # <cjk>
+0x915B U+63AA # <cjk>
+0x915C U+66FE # <cjk>
+0x915D U+66FD # <cjk>
+0x915E U+695A # <cjk>
+0x915F U+72D9 # <cjk>
+0x9160 U+758F # <cjk>
+0x9161 U+758E # <cjk>
+0x9162 U+790E # <cjk>
+0x9163 U+7956 # <cjk>
+0x9164 U+79DF # <cjk>
+0x9165 U+7C97 # <cjk>
+0x9166 U+7D20 # <cjk>
+0x9167 U+7D44 # <cjk>
+0x9168 U+8607 # <cjk>
+0x9169 U+8A34 # <cjk>
+0x916A U+963B # <cjk>
+0x916B U+9061 # <cjk>
+0x916C U+9F20 # <cjk>
+0x916D U+50E7 # <cjk>
+0x916E U+5275 # <cjk>
+0x916F U+53CC # <cjk>
+0x9170 U+53E2 # <cjk>
+0x9171 U+5009 # <cjk>
+0x9172 U+55AA # <cjk>
+0x9173 U+58EE # <cjk>
+0x9174 U+594F # <cjk>
+0x9175 U+723D # <cjk>
+0x9176 U+5B8B # <cjk>
+0x9177 U+5C64 # <cjk>
+0x9178 U+531D # <cjk>
+0x9179 U+60E3 # <cjk>
+0x917A U+60F3 # <cjk>
+0x917B U+635C # <cjk>
+0x917C U+6383 # <cjk>
+0x917D U+633F # <cjk>
+0x917E U+63BB # <cjk>
+0x9180 U+64CD # <cjk>
+0x9181 U+65E9 # <cjk>
+0x9182 U+66F9 # <cjk>
+0x9183 U+5DE3 # <cjk>
+0x9184 U+69CD # <cjk>
+0x9185 U+69FD # <cjk>
+0x9186 U+6F15 # <cjk>
+0x9187 U+71E5 # <cjk>
+0x9188 U+4E89 # <cjk>
+0x9189 U+75E9 # <cjk>
+0x918A U+76F8 # <cjk>
+0x918B U+7A93 # <cjk>
+0x918C U+7CDF # <cjk>
+0x918D U+7DCF # <cjk>
+0x918E U+7D9C # <cjk>
+0x918F U+8061 # <cjk>
+0x9190 U+8349 # <cjk>
+0x9191 U+8358 # <cjk>
+0x9192 U+846C # <cjk>
+0x9193 U+84BC # <cjk>
+0x9194 U+85FB # <cjk>
+0x9195 U+88C5 # <cjk>
+0x9196 U+8D70 # <cjk>
+0x9197 U+9001 # <cjk>
+0x9198 U+906D # <cjk>
+0x9199 U+9397 # <cjk>
+0x919A U+971C # <cjk>
+0x919B U+9A12 # <cjk>
+0x919C U+50CF # <cjk>
+0x919D U+5897 # <cjk>
+0x919E U+618E # <cjk>
+0x919F U+81D3 # <cjk>
+0x91A0 U+8535 # <cjk>
+0x91A1 U+8D08 # <cjk>
+0x91A2 U+9020 # <cjk>
+0x91A3 U+4FC3 # <cjk>
+0x91A4 U+5074 # <cjk>
+0x91A5 U+5247 # <cjk>
+0x91A6 U+5373 # <cjk>
+0x91A7 U+606F # <cjk>
+0x91A8 U+6349 # <cjk>
+0x91A9 U+675F # <cjk>
+0x91AA U+6E2C # <cjk>
+0x91AB U+8DB3 # <cjk>
+0x91AC U+901F # <cjk>
+0x91AD U+4FD7 # <cjk>
+0x91AE U+5C5E # <cjk>
+0x91AF U+8CCA # <cjk>
+0x91B0 U+65CF # <cjk>
+0x91B1 U+7D9A # <cjk>
+0x91B2 U+5352 # <cjk>
+0x91B3 U+8896 # <cjk>
+0x91B4 U+5176 # <cjk>
+0x91B5 U+63C3 # <cjk>
+0x91B6 U+5B58 # <cjk>
+0x91B7 U+5B6B # <cjk>
+0x91B8 U+5C0A # <cjk>
+0x91B9 U+640D # <cjk>
+0x91BA U+6751 # <cjk>
+0x91BB U+905C # <cjk>
+0x91BC U+4ED6 # <cjk>
+0x91BD U+591A # <cjk>
+0x91BE U+592A # <cjk>
+0x91BF U+6C70 # <cjk>
+0x91C0 U+8A51 # <cjk>
+0x91C1 U+553E # <cjk>
+0x91C2 U+5815 # <cjk>
+0x91C3 U+59A5 # <cjk>
+0x91C4 U+60F0 # <cjk>
+0x91C5 U+6253 # <cjk>
+0x91C6 U+67C1 # <cjk>
+0x91C7 U+8235 # <cjk>
+0x91C8 U+6955 # <cjk>
+0x91C9 U+9640 # <cjk>
+0x91CA U+99C4 # <cjk>
+0x91CB U+9A28 # <cjk>
+0x91CC U+4F53 # <cjk>
+0x91CD U+5806 # <cjk>
+0x91CE U+5BFE # <cjk>
+0x91CF U+8010 # <cjk>
+0x91D0 U+5CB1 # <cjk>
+0x91D1 U+5E2F # <cjk>
+0x91D2 U+5F85 # <cjk>
+0x91D3 U+6020 # <cjk>
+0x91D4 U+614B # <cjk>
+0x91D5 U+6234 # <cjk>
+0x91D6 U+66FF # <cjk>
+0x91D7 U+6CF0 # <cjk>
+0x91D8 U+6EDE # <cjk>
+0x91D9 U+80CE # <cjk>
+0x91DA U+817F # <cjk>
+0x91DB U+82D4 # <cjk>
+0x91DC U+888B # <cjk>
+0x91DD U+8CB8 # <cjk>
+0x91DE U+9000 # <cjk>
+0x91DF U+902E # <cjk>
+0x91E0 U+968A # <cjk>
+0x91E1 U+9EDB # <cjk>
+0x91E2 U+9BDB # <cjk>
+0x91E3 U+4EE3 # <cjk>
+0x91E4 U+53F0 # <cjk>
+0x91E5 U+5927 # <cjk>
+0x91E6 U+7B2C # <cjk>
+0x91E7 U+918D # <cjk>
+0x91E8 U+984C # <cjk>
+0x91E9 U+9DF9 # <cjk>
+0x91EA U+6EDD # <cjk>
+0x91EB U+7027 # <cjk>
+0x91EC U+5353 # <cjk>
+0x91ED U+5544 # <cjk>
+0x91EE U+5B85 # <cjk>
+0x91EF U+6258 # <cjk>
+0x91F0 U+629E # <cjk>
+0x91F1 U+62D3 # <cjk>
+0x91F2 U+6CA2 # <cjk>
+0x91F3 U+6FEF # <cjk>
+0x91F4 U+7422 # <cjk>
+0x91F5 U+8A17 # <cjk>
+0x91F6 U+9438 # <cjk>
+0x91F7 U+6FC1 # <cjk>
+0x91F8 U+8AFE # <cjk>
+0x91F9 U+8338 # <cjk>
+0x91FA U+51E7 # <cjk>
+0x91FB U+86F8 # <cjk>
+0x91FC U+53EA # <cjk>
+0x9240 U+53E9 # <cjk>
+0x9241 U+4F46 # <cjk>
+0x9242 U+9054 # <cjk>
+0x9243 U+8FB0 # <cjk>
+0x9244 U+596A # <cjk>
+0x9245 U+8131 # <cjk>
+0x9246 U+5DFD # <cjk>
+0x9247 U+7AEA # <cjk>
+0x9248 U+8FBF # <cjk>
+0x9249 U+68DA # <cjk>
+0x924A U+8C37 # <cjk>
+0x924B U+72F8 # <cjk>
+0x924C U+9C48 # <cjk>
+0x924D U+6A3D # <cjk>
+0x924E U+8AB0 # <cjk>
+0x924F U+4E39 # <cjk>
+0x9250 U+5358 # <cjk>
+0x9251 U+5606 # <cjk>
+0x9252 U+5766 # <cjk>
+0x9253 U+62C5 # <cjk>
+0x9254 U+63A2 # <cjk>
+0x9255 U+65E6 # <cjk>
+0x9256 U+6B4E # <cjk>
+0x9257 U+6DE1 # <cjk>
+0x9258 U+6E5B # <cjk>
+0x9259 U+70AD # <cjk>
+0x925A U+77ED # <cjk>
+0x925B U+7AEF # <cjk>
+0x925C U+7BAA # <cjk>
+0x925D U+7DBB # <cjk>
+0x925E U+803D # <cjk>
+0x925F U+80C6 # <cjk>
+0x9260 U+86CB # <cjk>
+0x9261 U+8A95 # <cjk>
+0x9262 U+935B # <cjk>
+0x9263 U+56E3 # <cjk>
+0x9264 U+58C7 # <cjk>
+0x9265 U+5F3E # <cjk>
+0x9266 U+65AD # <cjk>
+0x9267 U+6696 # <cjk>
+0x9268 U+6A80 # <cjk>
+0x9269 U+6BB5 # <cjk>
+0x926A U+7537 # <cjk>
+0x926B U+8AC7 # <cjk>
+0x926C U+5024 # <cjk>
+0x926D U+77E5 # <cjk>
+0x926E U+5730 # <cjk>
+0x926F U+5F1B # <cjk>
+0x9270 U+6065 # <cjk>
+0x9271 U+667A # <cjk>
+0x9272 U+6C60 # <cjk>
+0x9273 U+75F4 # <cjk>
+0x9274 U+7A1A # <cjk>
+0x9275 U+7F6E # <cjk>
+0x9276 U+81F4 # <cjk>
+0x9277 U+8718 # <cjk>
+0x9278 U+9045 # <cjk>
+0x9279 U+99B3 # <cjk>
+0x927A U+7BC9 # <cjk>
+0x927B U+755C # <cjk>
+0x927C U+7AF9 # <cjk>
+0x927D U+7B51 # <cjk>
+0x927E U+84C4 # <cjk>
+0x9280 U+9010 # <cjk>
+0x9281 U+79E9 # <cjk>
+0x9282 U+7A92 # <cjk>
+0x9283 U+8336 # <cjk>
+0x9284 U+5AE1 # <cjk>
+0x9285 U+7740 # <cjk>
+0x9286 U+4E2D # <cjk>
+0x9287 U+4EF2 # <cjk>
+0x9288 U+5B99 # <cjk>
+0x9289 U+5FE0 # <cjk>
+0x928A U+62BD # <cjk>
+0x928B U+663C # <cjk>
+0x928C U+67F1 # <cjk>
+0x928D U+6CE8 # <cjk>
+0x928E U+866B # <cjk>
+0x928F U+8877 # <cjk>
+0x9290 U+8A3B # <cjk>
+0x9291 U+914E # <cjk>
+0x9292 U+92F3 # <cjk>
+0x9293 U+99D0 # <cjk>
+0x9294 U+6A17 # <cjk>
+0x9295 U+7026 # <cjk>
+0x9296 U+732A # <cjk>
+0x9297 U+82E7 # <cjk>
+0x9298 U+8457 # <cjk>
+0x9299 U+8CAF # <cjk>
+0x929A U+4E01 # <cjk>
+0x929B U+5146 # <cjk>
+0x929C U+51CB # <cjk>
+0x929D U+558B # <cjk>
+0x929E U+5BF5 # <cjk>
+0x929F U+5E16 # <cjk>
+0x92A0 U+5E33 # <cjk>
+0x92A1 U+5E81 # <cjk>
+0x92A2 U+5F14 # <cjk>
+0x92A3 U+5F35 # <cjk>
+0x92A4 U+5F6B # <cjk>
+0x92A5 U+5FB4 # <cjk>
+0x92A6 U+61F2 # <cjk>
+0x92A7 U+6311 # <cjk>
+0x92A8 U+66A2 # <cjk>
+0x92A9 U+671D # <cjk>
+0x92AA U+6F6E # <cjk>
+0x92AB U+7252 # <cjk>
+0x92AC U+753A # <cjk>
+0x92AD U+773A # <cjk>
+0x92AE U+8074 # <cjk>
+0x92AF U+8139 # <cjk>
+0x92B0 U+8178 # <cjk>
+0x92B1 U+8776 # <cjk>
+0x92B2 U+8ABF # <cjk>
+0x92B3 U+8ADC # <cjk>
+0x92B4 U+8D85 # <cjk>
+0x92B5 U+8DF3 # <cjk>
+0x92B6 U+929A # <cjk>
+0x92B7 U+9577 # <cjk>
+0x92B8 U+9802 # <cjk>
+0x92B9 U+9CE5 # <cjk>
+0x92BA U+52C5 # <cjk>
+0x92BB U+6357 # <cjk>
+0x92BC U+76F4 # <cjk>
+0x92BD U+6715 # <cjk>
+0x92BE U+6C88 # <cjk>
+0x92BF U+73CD # <cjk>
+0x92C0 U+8CC3 # <cjk>
+0x92C1 U+93AE # <cjk>
+0x92C2 U+9673 # <cjk>
+0x92C3 U+6D25 # <cjk>
+0x92C4 U+589C # <cjk>
+0x92C5 U+690E # <cjk>
+0x92C6 U+69CC # <cjk>
+0x92C7 U+8FFD # <cjk>
+0x92C8 U+939A # <cjk>
+0x92C9 U+75DB # <cjk>
+0x92CA U+901A # <cjk>
+0x92CB U+585A # <cjk>
+0x92CC U+6802 # <cjk>
+0x92CD U+63B4 # <cjk>
+0x92CE U+69FB # <cjk>
+0x92CF U+4F43 # <cjk>
+0x92D0 U+6F2C # <cjk>
+0x92D1 U+67D8 # <cjk>
+0x92D2 U+8FBB # <cjk>
+0x92D3 U+8526 # <cjk>
+0x92D4 U+7DB4 # <cjk>
+0x92D5 U+9354 # <cjk>
+0x92D6 U+693F # <cjk>
+0x92D7 U+6F70 # <cjk>
+0x92D8 U+576A # <cjk>
+0x92D9 U+58F7 # <cjk>
+0x92DA U+5B2C # <cjk>
+0x92DB U+7D2C # <cjk>
+0x92DC U+722A # <cjk>
+0x92DD U+540A # <cjk>
+0x92DE U+91E3 # <cjk>
+0x92DF U+9DB4 # <cjk>
+0x92E0 U+4EAD # <cjk>
+0x92E1 U+4F4E # <cjk>
+0x92E2 U+505C # <cjk>
+0x92E3 U+5075 # <cjk>
+0x92E4 U+5243 # <cjk>
+0x92E5 U+8C9E # <cjk>
+0x92E6 U+5448 # <cjk>
+0x92E7 U+5824 # <cjk>
+0x92E8 U+5B9A # <cjk>
+0x92E9 U+5E1D # <cjk>
+0x92EA U+5E95 # <cjk>
+0x92EB U+5EAD # <cjk>
+0x92EC U+5EF7 # <cjk>
+0x92ED U+5F1F # <cjk>
+0x92EE U+608C # <cjk>
+0x92EF U+62B5 # <cjk>
+0x92F0 U+633A # <cjk>
+0x92F1 U+63D0 # <cjk>
+0x92F2 U+68AF # <cjk>
+0x92F3 U+6C40 # <cjk>
+0x92F4 U+7887 # <cjk>
+0x92F5 U+798E # <cjk>
+0x92F6 U+7A0B # <cjk>
+0x92F7 U+7DE0 # <cjk>
+0x92F8 U+8247 # <cjk>
+0x92F9 U+8A02 # <cjk>
+0x92FA U+8AE6 # <cjk>
+0x92FB U+8E44 # <cjk>
+0x92FC U+9013 # <cjk>
+0x9340 U+90B8 # <cjk>
+0x9341 U+912D # <cjk>
+0x9342 U+91D8 # <cjk>
+0x9343 U+9F0E # <cjk>
+0x9344 U+6CE5 # <cjk>
+0x9345 U+6458 # <cjk>
+0x9346 U+64E2 # <cjk>
+0x9347 U+6575 # <cjk>
+0x9348 U+6EF4 # <cjk>
+0x9349 U+7684 # <cjk>
+0x934A U+7B1B # <cjk>
+0x934B U+9069 # <cjk>
+0x934C U+93D1 # <cjk>
+0x934D U+6EBA # <cjk>
+0x934E U+54F2 # <cjk>
+0x934F U+5FB9 # <cjk>
+0x9350 U+64A4 # <cjk>
+0x9351 U+8F4D # <cjk>
+0x9352 U+8FED # <cjk>
+0x9353 U+9244 # <cjk>
+0x9354 U+5178 # <cjk>
+0x9355 U+586B # <cjk>
+0x9356 U+5929 # <cjk>
+0x9357 U+5C55 # <cjk>
+0x9358 U+5E97 # <cjk>
+0x9359 U+6DFB # <cjk>
+0x935A U+7E8F # <cjk>
+0x935B U+751C # <cjk>
+0x935C U+8CBC # <cjk>
+0x935D U+8EE2 # <cjk>
+0x935E U+985B # <cjk>
+0x935F U+70B9 # <cjk>
+0x9360 U+4F1D # <cjk>
+0x9361 U+6BBF # <cjk>
+0x9362 U+6FB1 # <cjk>
+0x9363 U+7530 # <cjk>
+0x9364 U+96FB # <cjk>
+0x9365 U+514E # <cjk>
+0x9366 U+5410 # <cjk>
+0x9367 U+5835 # <cjk>
+0x9368 U+5857 # <cjk>
+0x9369 U+59AC # <cjk>
+0x936A U+5C60 # <cjk>
+0x936B U+5F92 # <cjk>
+0x936C U+6597 # <cjk>
+0x936D U+675C # <cjk>
+0x936E U+6E21 # <cjk>
+0x936F U+767B # <cjk>
+0x9370 U+83DF # <cjk>
+0x9371 U+8CED # <cjk>
+0x9372 U+9014 # <cjk>
+0x9373 U+90FD # <cjk>
+0x9374 U+934D # <cjk>
+0x9375 U+7825 # <cjk>
+0x9376 U+783A # <cjk>
+0x9377 U+52AA # <cjk>
+0x9378 U+5EA6 # <cjk>
+0x9379 U+571F # <cjk>
+0x937A U+5974 # <cjk>
+0x937B U+6012 # <cjk>
+0x937C U+5012 # <cjk>
+0x937D U+515A # <cjk>
+0x937E U+51AC # <cjk>
+0x9380 U+51CD # <cjk>
+0x9381 U+5200 # <cjk>
+0x9382 U+5510 # <cjk>
+0x9383 U+5854 # <cjk>
+0x9384 U+5858 # <cjk>
+0x9385 U+5957 # <cjk>
+0x9386 U+5B95 # <cjk>
+0x9387 U+5CF6 # <cjk>
+0x9388 U+5D8B # <cjk>
+0x9389 U+60BC # <cjk>
+0x938A U+6295 # <cjk>
+0x938B U+642D # <cjk>
+0x938C U+6771 # <cjk>
+0x938D U+6843 # <cjk>
+0x938E U+68BC # <cjk>
+0x938F U+68DF # <cjk>
+0x9390 U+76D7 # <cjk>
+0x9391 U+6DD8 # <cjk>
+0x9392 U+6E6F # <cjk>
+0x9393 U+6D9B # <cjk>
+0x9394 U+706F # <cjk>
+0x9395 U+71C8 # <cjk>
+0x9396 U+5F53 # <cjk>
+0x9397 U+75D8 # <cjk>
+0x9398 U+7977 # <cjk>
+0x9399 U+7B49 # <cjk>
+0x939A U+7B54 # <cjk>
+0x939B U+7B52 # <cjk>
+0x939C U+7CD6 # <cjk>
+0x939D U+7D71 # <cjk>
+0x939E U+5230 # <cjk>
+0x939F U+8463 # <cjk>
+0x93A0 U+8569 # <cjk>
+0x93A1 U+85E4 # <cjk>
+0x93A2 U+8A0E # <cjk>
+0x93A3 U+8B04 # <cjk>
+0x93A4 U+8C46 # <cjk>
+0x93A5 U+8E0F # <cjk>
+0x93A6 U+9003 # <cjk>
+0x93A7 U+900F # <cjk>
+0x93A8 U+9419 # <cjk>
+0x93A9 U+9676 # <cjk>
+0x93AA U+982D # <cjk>
+0x93AB U+9A30 # <cjk>
+0x93AC U+95D8 # <cjk>
+0x93AD U+50CD # <cjk>
+0x93AE U+52D5 # <cjk>
+0x93AF U+540C # <cjk>
+0x93B0 U+5802 # <cjk>
+0x93B1 U+5C0E # <cjk>
+0x93B2 U+61A7 # <cjk>
+0x93B3 U+649E # <cjk>
+0x93B4 U+6D1E # <cjk>
+0x93B5 U+77B3 # <cjk>
+0x93B6 U+7AE5 # <cjk>
+0x93B7 U+80F4 # <cjk>
+0x93B8 U+8404 # <cjk>
+0x93B9 U+9053 # <cjk>
+0x93BA U+9285 # <cjk>
+0x93BB U+5CE0 # <cjk>
+0x93BC U+9D07 # <cjk>
+0x93BD U+533F # <cjk>
+0x93BE U+5F97 # <cjk>
+0x93BF U+5FB3 # <cjk>
+0x93C0 U+6D9C # <cjk>
+0x93C1 U+7279 # <cjk>
+0x93C2 U+7763 # <cjk>
+0x93C3 U+79BF # <cjk>
+0x93C4 U+7BE4 # <cjk>
+0x93C5 U+6BD2 # <cjk>
+0x93C6 U+72EC # <cjk>
+0x93C7 U+8AAD # <cjk>
+0x93C8 U+6803 # <cjk>
+0x93C9 U+6A61 # <cjk>
+0x93CA U+51F8 # <cjk>
+0x93CB U+7A81 # <cjk>
+0x93CC U+6934 # <cjk>
+0x93CD U+5C4A # <cjk>
+0x93CE U+9CF6 # <cjk>
+0x93CF U+82EB # <cjk>
+0x93D0 U+5BC5 # <cjk>
+0x93D1 U+9149 # <cjk>
+0x93D2 U+701E # <cjk>
+0x93D3 U+5678 # <cjk>
+0x93D4 U+5C6F # <cjk>
+0x93D5 U+60C7 # <cjk>
+0x93D6 U+6566 # <cjk>
+0x93D7 U+6C8C # <cjk>
+0x93D8 U+8C5A # <cjk>
+0x93D9 U+9041 # <cjk>
+0x93DA U+9813 # <cjk>
+0x93DB U+5451 # <cjk>
+0x93DC U+66C7 # <cjk>
+0x93DD U+920D # <cjk>
+0x93DE U+5948 # <cjk>
+0x93DF U+90A3 # <cjk>
+0x93E0 U+5185 # <cjk>
+0x93E1 U+4E4D # <cjk>
+0x93E2 U+51EA # <cjk>
+0x93E3 U+8599 # <cjk>
+0x93E4 U+8B0E # <cjk>
+0x93E5 U+7058 # <cjk>
+0x93E6 U+637A # <cjk>
+0x93E7 U+934B # <cjk>
+0x93E8 U+6962 # <cjk>
+0x93E9 U+99B4 # <cjk>
+0x93EA U+7E04 # <cjk>
+0x93EB U+7577 # <cjk>
+0x93EC U+5357 # <cjk>
+0x93ED U+6960 # <cjk>
+0x93EE U+8EDF # <cjk>
+0x93EF U+96E3 # <cjk>
+0x93F0 U+6C5D # <cjk>
+0x93F1 U+4E8C # <cjk>
+0x93F2 U+5C3C # <cjk>
+0x93F3 U+5F10 # <cjk>
+0x93F4 U+8FE9 # <cjk>
+0x93F5 U+5302 # <cjk>
+0x93F6 U+8CD1 # <cjk>
+0x93F7 U+8089 # <cjk>
+0x93F8 U+8679 # <cjk>
+0x93F9 U+5EFF # <cjk>
+0x93FA U+65E5 # <cjk>
+0x93FB U+4E73 # <cjk>
+0x93FC U+5165 # <cjk>
+0x9440 U+5982 # <cjk>
+0x9441 U+5C3F # <cjk>
+0x9442 U+97EE # <cjk>
+0x9443 U+4EFB # <cjk>
+0x9444 U+598A # <cjk>
+0x9445 U+5FCD # <cjk>
+0x9446 U+8A8D # <cjk>
+0x9447 U+6FE1 # <cjk>
+0x9448 U+79B0 # <cjk>
+0x9449 U+7962 # <cjk>
+0x944A U+5BE7 # <cjk>
+0x944B U+8471 # <cjk>
+0x944C U+732B # <cjk>
+0x944D U+71B1 # <cjk>
+0x944E U+5E74 # <cjk>
+0x944F U+5FF5 # <cjk>
+0x9450 U+637B # <cjk>
+0x9451 U+649A # <cjk>
+0x9452 U+71C3 # <cjk>
+0x9453 U+7C98 # <cjk>
+0x9454 U+4E43 # <cjk>
+0x9455 U+5EFC # <cjk>
+0x9456 U+4E4B # <cjk>
+0x9457 U+57DC # <cjk>
+0x9458 U+56A2 # <cjk>
+0x9459 U+60A9 # <cjk>
+0x945A U+6FC3 # <cjk>
+0x945B U+7D0D # <cjk>
+0x945C U+80FD # <cjk>
+0x945D U+8133 # <cjk>
+0x945E U+81BF # <cjk>
+0x945F U+8FB2 # <cjk>
+0x9460 U+8997 # <cjk>
+0x9461 U+86A4 # <cjk>
+0x9462 U+5DF4 # <cjk>
+0x9463 U+628A # <cjk>
+0x9464 U+64AD # <cjk>
+0x9465 U+8987 # <cjk>
+0x9466 U+6777 # <cjk>
+0x9467 U+6CE2 # <cjk>
+0x9468 U+6D3E # <cjk>
+0x9469 U+7436 # <cjk>
+0x946A U+7834 # <cjk>
+0x946B U+5A46 # <cjk>
+0x946C U+7F75 # <cjk>
+0x946D U+82AD # <cjk>
+0x946E U+99AC # <cjk>
+0x946F U+4FF3 # <cjk>
+0x9470 U+5EC3 # <cjk>
+0x9471 U+62DD # <cjk>
+0x9472 U+6392 # <cjk>
+0x9473 U+6557 # <cjk>
+0x9474 U+676F # <cjk>
+0x9475 U+76C3 # <cjk>
+0x9476 U+724C # <cjk>
+0x9477 U+80CC # <cjk>
+0x9478 U+80BA # <cjk>
+0x9479 U+8F29 # <cjk>
+0x947A U+914D # <cjk>
+0x947B U+500D # <cjk>
+0x947C U+57F9 # <cjk>
+0x947D U+5A92 # <cjk>
+0x947E U+6885 # <cjk>
+0x9480 U+6973 # <cjk>
+0x9481 U+7164 # <cjk>
+0x9482 U+72FD # <cjk>
+0x9483 U+8CB7 # <cjk>
+0x9484 U+58F2 # <cjk>
+0x9485 U+8CE0 # <cjk>
+0x9486 U+966A # <cjk>
+0x9487 U+9019 # <cjk>
+0x9488 U+877F # <cjk>
+0x9489 U+79E4 # <cjk>
+0x948A U+77E7 # <cjk>
+0x948B U+8429 # <cjk>
+0x948C U+4F2F # <cjk>
+0x948D U+5265 # <cjk>
+0x948E U+535A # <cjk>
+0x948F U+62CD # <cjk>
+0x9490 U+67CF # <cjk>
+0x9491 U+6CCA # <cjk>
+0x9492 U+767D # <cjk>
+0x9493 U+7B94 # <cjk>
+0x9494 U+7C95 # <cjk>
+0x9495 U+8236 # <cjk>
+0x9496 U+8584 # <cjk>
+0x9497 U+8FEB # <cjk>
+0x9498 U+66DD # <cjk>
+0x9499 U+6F20 # <cjk>
+0x949A U+7206 # <cjk>
+0x949B U+7E1B # <cjk>
+0x949C U+83AB # <cjk>
+0x949D U+99C1 # <cjk>
+0x949E U+9EA6 # <cjk>
+0x949F U+51FD # <cjk>
+0x94A0 U+7BB1 # <cjk>
+0x94A1 U+7872 # <cjk>
+0x94A2 U+7BB8 # <cjk>
+0x94A3 U+8087 # <cjk>
+0x94A4 U+7B48 # <cjk>
+0x94A5 U+6AE8 # <cjk>
+0x94A6 U+5E61 # <cjk>
+0x94A7 U+808C # <cjk>
+0x94A8 U+7551 # <cjk>
+0x94A9 U+7560 # <cjk>
+0x94AA U+516B # <cjk>
+0x94AB U+9262 # <cjk>
+0x94AC U+6E8C # <cjk>
+0x94AD U+767A # <cjk>
+0x94AE U+9197 # <cjk>
+0x94AF U+9AEA # <cjk>
+0x94B0 U+4F10 # <cjk>
+0x94B1 U+7F70 # <cjk>
+0x94B2 U+629C # <cjk>
+0x94B3 U+7B4F # <cjk>
+0x94B4 U+95A5 # <cjk>
+0x94B5 U+9CE9 # <cjk>
+0x94B6 U+567A # <cjk>
+0x94B7 U+5859 # <cjk>
+0x94B8 U+86E4 # <cjk>
+0x94B9 U+96BC # <cjk>
+0x94BA U+4F34 # <cjk>
+0x94BB U+5224 # <cjk>
+0x94BC U+534A # <cjk>
+0x94BD U+53CD # <cjk>
+0x94BE U+53DB # <cjk>
+0x94BF U+5E06 # <cjk>
+0x94C0 U+642C # <cjk>
+0x94C1 U+6591 # <cjk>
+0x94C2 U+677F # <cjk>
+0x94C3 U+6C3E # <cjk>
+0x94C4 U+6C4E # <cjk>
+0x94C5 U+7248 # <cjk>
+0x94C6 U+72AF # <cjk>
+0x94C7 U+73ED # <cjk>
+0x94C8 U+7554 # <cjk>
+0x94C9 U+7E41 # <cjk>
+0x94CA U+822C # <cjk>
+0x94CB U+85E9 # <cjk>
+0x94CC U+8CA9 # <cjk>
+0x94CD U+7BC4 # <cjk>
+0x94CE U+91C6 # <cjk>
+0x94CF U+7169 # <cjk>
+0x94D0 U+9812 # <cjk>
+0x94D1 U+98EF # <cjk>
+0x94D2 U+633D # <cjk>
+0x94D3 U+6669 # <cjk>
+0x94D4 U+756A # <cjk>
+0x94D5 U+76E4 # <cjk>
+0x94D6 U+78D0 # <cjk>
+0x94D7 U+8543 # <cjk>
+0x94D8 U+86EE # <cjk>
+0x94D9 U+532A # <cjk>
+0x94DA U+5351 # <cjk>
+0x94DB U+5426 # <cjk>
+0x94DC U+5983 # <cjk>
+0x94DD U+5E87 # <cjk>
+0x94DE U+5F7C # <cjk>
+0x94DF U+60B2 # <cjk>
+0x94E0 U+6249 # <cjk>
+0x94E1 U+6279 # <cjk>
+0x94E2 U+62AB # <cjk>
+0x94E3 U+6590 # <cjk>
+0x94E4 U+6BD4 # <cjk>
+0x94E5 U+6CCC # <cjk>
+0x94E6 U+75B2 # <cjk>
+0x94E7 U+76AE # <cjk>
+0x94E8 U+7891 # <cjk>
+0x94E9 U+79D8 # <cjk>
+0x94EA U+7DCB # <cjk>
+0x94EB U+7F77 # <cjk>
+0x94EC U+80A5 # <cjk>
+0x94ED U+88AB # <cjk>
+0x94EE U+8AB9 # <cjk>
+0x94EF U+8CBB # <cjk>
+0x94F0 U+907F # <cjk>
+0x94F1 U+975E # <cjk>
+0x94F2 U+98DB # <cjk>
+0x94F3 U+6A0B # <cjk>
+0x94F4 U+7C38 # <cjk>
+0x94F5 U+5099 # <cjk>
+0x94F6 U+5C3E # <cjk>
+0x94F7 U+5FAE # <cjk>
+0x94F8 U+6787 # <cjk>
+0x94F9 U+6BD8 # <cjk>
+0x94FA U+7435 # <cjk>
+0x94FB U+7709 # <cjk>
+0x94FC U+7F8E # <cjk>
+0x9540 U+9F3B # <cjk>
+0x9541 U+67CA # <cjk>
+0x9542 U+7A17 # <cjk>
+0x9543 U+5339 # <cjk>
+0x9544 U+758B # <cjk>
+0x9545 U+9AED # <cjk>
+0x9546 U+5F66 # <cjk>
+0x9547 U+819D # <cjk>
+0x9548 U+83F1 # <cjk>
+0x9549 U+8098 # <cjk>
+0x954A U+5F3C # <cjk>
+0x954B U+5FC5 # <cjk>
+0x954C U+7562 # <cjk>
+0x954D U+7B46 # <cjk>
+0x954E U+903C # <cjk>
+0x954F U+6867 # <cjk>
+0x9550 U+59EB # <cjk>
+0x9551 U+5A9B # <cjk>
+0x9552 U+7D10 # <cjk>
+0x9553 U+767E # <cjk>
+0x9554 U+8B2C # <cjk>
+0x9555 U+4FF5 # <cjk>
+0x9556 U+5F6A # <cjk>
+0x9557 U+6A19 # <cjk>
+0x9558 U+6C37 # <cjk>
+0x9559 U+6F02 # <cjk>
+0x955A U+74E2 # <cjk>
+0x955B U+7968 # <cjk>
+0x955C U+8868 # <cjk>
+0x955D U+8A55 # <cjk>
+0x955E U+8C79 # <cjk>
+0x955F U+5EDF # <cjk>
+0x9560 U+63CF # <cjk>
+0x9561 U+75C5 # <cjk>
+0x9562 U+79D2 # <cjk>
+0x9563 U+82D7 # <cjk>
+0x9564 U+9328 # <cjk>
+0x9565 U+92F2 # <cjk>
+0x9566 U+849C # <cjk>
+0x9567 U+86ED # <cjk>
+0x9568 U+9C2D # <cjk>
+0x9569 U+54C1 # <cjk>
+0x956A U+5F6C # <cjk>
+0x956B U+658C # <cjk>
+0x956C U+6D5C # <cjk>
+0x956D U+7015 # <cjk>
+0x956E U+8CA7 # <cjk>
+0x956F U+8CD3 # <cjk>
+0x9570 U+983B # <cjk>
+0x9571 U+654F # <cjk>
+0x9572 U+74F6 # <cjk>
+0x9573 U+4E0D # <cjk>
+0x9574 U+4ED8 # <cjk>
+0x9575 U+57E0 # <cjk>
+0x9576 U+592B # <cjk>
+0x9577 U+5A66 # <cjk>
+0x9578 U+5BCC # <cjk>
+0x9579 U+51A8 # <cjk>
+0x957A U+5E03 # <cjk>
+0x957B U+5E9C # <cjk>
+0x957C U+6016 # <cjk>
+0x957D U+6276 # <cjk>
+0x957E U+6577 # <cjk>
+0x9580 U+65A7 # <cjk>
+0x9581 U+666E # <cjk>
+0x9582 U+6D6E # <cjk>
+0x9583 U+7236 # <cjk>
+0x9584 U+7B26 # <cjk>
+0x9585 U+8150 # <cjk>
+0x9586 U+819A # <cjk>
+0x9587 U+8299 # <cjk>
+0x9588 U+8B5C # <cjk>
+0x9589 U+8CA0 # <cjk>
+0x958A U+8CE6 # <cjk>
+0x958B U+8D74 # <cjk>
+0x958C U+961C # <cjk>
+0x958D U+9644 # <cjk>
+0x958E U+4FAE # <cjk>
+0x958F U+64AB # <cjk>
+0x9590 U+6B66 # <cjk>
+0x9591 U+821E # <cjk>
+0x9592 U+8461 # <cjk>
+0x9593 U+856A # <cjk>
+0x9594 U+90E8 # <cjk>
+0x9595 U+5C01 # <cjk>
+0x9596 U+6953 # <cjk>
+0x9597 U+98A8 # <cjk>
+0x9598 U+847A # <cjk>
+0x9599 U+8557 # <cjk>
+0x959A U+4F0F # <cjk>
+0x959B U+526F # <cjk>
+0x959C U+5FA9 # <cjk>
+0x959D U+5E45 # <cjk>
+0x959E U+670D # <cjk>
+0x959F U+798F # <cjk>
+0x95A0 U+8179 # <cjk>
+0x95A1 U+8907 # <cjk>
+0x95A2 U+8986 # <cjk>
+0x95A3 U+6DF5 # <cjk>
+0x95A4 U+5F17 # <cjk>
+0x95A5 U+6255 # <cjk>
+0x95A6 U+6CB8 # <cjk>
+0x95A7 U+4ECF # <cjk>
+0x95A8 U+7269 # <cjk>
+0x95A9 U+9B92 # <cjk>
+0x95AA U+5206 # <cjk>
+0x95AB U+543B # <cjk>
+0x95AC U+5674 # <cjk>
+0x95AD U+58B3 # <cjk>
+0x95AE U+61A4 # <cjk>
+0x95AF U+626E # <cjk>
+0x95B0 U+711A # <cjk>
+0x95B1 U+596E # <cjk>
+0x95B2 U+7C89 # <cjk>
+0x95B3 U+7CDE # <cjk>
+0x95B4 U+7D1B # <cjk>
+0x95B5 U+96F0 # <cjk>
+0x95B6 U+6587 # <cjk>
+0x95B7 U+805E # <cjk>
+0x95B8 U+4E19 # <cjk>
+0x95B9 U+4F75 # <cjk>
+0x95BA U+5175 # <cjk>
+0x95BB U+5840 # <cjk>
+0x95BC U+5E63 # <cjk>
+0x95BD U+5E73 # <cjk>
+0x95BE U+5F0A # <cjk>
+0x95BF U+67C4 # <cjk>
+0x95C0 U+4E26 # <cjk>
+0x95C1 U+853D # <cjk>
+0x95C2 U+9589 # <cjk>
+0x95C3 U+965B # <cjk>
+0x95C4 U+7C73 # <cjk>
+0x95C5 U+9801 # <cjk>
+0x95C6 U+50FB # <cjk>
+0x95C7 U+58C1 # <cjk>
+0x95C8 U+7656 # <cjk>
+0x95C9 U+78A7 # <cjk>
+0x95CA U+5225 # <cjk>
+0x95CB U+77A5 # <cjk>
+0x95CC U+8511 # <cjk>
+0x95CD U+7B86 # <cjk>
+0x95CE U+504F # <cjk>
+0x95CF U+5909 # <cjk>
+0x95D0 U+7247 # <cjk>
+0x95D1 U+7BC7 # <cjk>
+0x95D2 U+7DE8 # <cjk>
+0x95D3 U+8FBA # <cjk>
+0x95D4 U+8FD4 # <cjk>
+0x95D5 U+904D # <cjk>
+0x95D6 U+4FBF # <cjk>
+0x95D7 U+52C9 # <cjk>
+0x95D8 U+5A29 # <cjk>
+0x95D9 U+5F01 # <cjk>
+0x95DA U+97AD # <cjk>
+0x95DB U+4FDD # <cjk>
+0x95DC U+8217 # <cjk>
+0x95DD U+92EA # <cjk>
+0x95DE U+5703 # <cjk>
+0x95DF U+6355 # <cjk>
+0x95E0 U+6B69 # <cjk>
+0x95E1 U+752B # <cjk>
+0x95E2 U+88DC # <cjk>
+0x95E3 U+8F14 # <cjk>
+0x95E4 U+7A42 # <cjk>
+0x95E5 U+52DF # <cjk>
+0x95E6 U+5893 # <cjk>
+0x95E7 U+6155 # <cjk>
+0x95E8 U+620A # <cjk>
+0x95E9 U+66AE # <cjk>
+0x95EA U+6BCD # <cjk>
+0x95EB U+7C3F # <cjk>
+0x95EC U+83E9 # <cjk>
+0x95ED U+5023 # <cjk>
+0x95EE U+4FF8 # <cjk>
+0x95EF U+5305 # <cjk>
+0x95F0 U+5446 # <cjk>
+0x95F1 U+5831 # <cjk>
+0x95F2 U+5949 # <cjk>
+0x95F3 U+5B9D # <cjk>
+0x95F4 U+5CF0 # <cjk>
+0x95F5 U+5CEF # <cjk>
+0x95F6 U+5D29 # <cjk>
+0x95F7 U+5E96 # <cjk>
+0x95F8 U+62B1 # <cjk>
+0x95F9 U+6367 # <cjk>
+0x95FA U+653E # <cjk>
+0x95FB U+65B9 # <cjk>
+0x95FC U+670B # <cjk>
+0x9640 U+6CD5 # <cjk>
+0x9641 U+6CE1 # <cjk>
+0x9642 U+70F9 # <cjk>
+0x9643 U+7832 # <cjk>
+0x9644 U+7E2B # <cjk>
+0x9645 U+80DE # <cjk>
+0x9646 U+82B3 # <cjk>
+0x9647 U+840C # <cjk>
+0x9648 U+84EC # <cjk>
+0x9649 U+8702 # <cjk>
+0x964A U+8912 # <cjk>
+0x964B U+8A2A # <cjk>
+0x964C U+8C4A # <cjk>
+0x964D U+90A6 # <cjk>
+0x964E U+92D2 # <cjk>
+0x964F U+98FD # <cjk>
+0x9650 U+9CF3 # <cjk>
+0x9651 U+9D6C # <cjk>
+0x9652 U+4E4F # <cjk>
+0x9653 U+4EA1 # <cjk>
+0x9654 U+508D # <cjk>
+0x9655 U+5256 # <cjk>
+0x9656 U+574A # <cjk>
+0x9657 U+59A8 # <cjk>
+0x9658 U+5E3D # <cjk>
+0x9659 U+5FD8 # <cjk>
+0x965A U+5FD9 # <cjk>
+0x965B U+623F # <cjk>
+0x965C U+66B4 # <cjk>
+0x965D U+671B # <cjk>
+0x965E U+67D0 # <cjk>
+0x965F U+68D2 # <cjk>
+0x9660 U+5192 # <cjk>
+0x9661 U+7D21 # <cjk>
+0x9662 U+80AA # <cjk>
+0x9663 U+81A8 # <cjk>
+0x9664 U+8B00 # <cjk>
+0x9665 U+8C8C # <cjk>
+0x9666 U+8CBF # <cjk>
+0x9667 U+927E # <cjk>
+0x9668 U+9632 # <cjk>
+0x9669 U+5420 # <cjk>
+0x966A U+982C # <cjk>
+0x966B U+5317 # <cjk>
+0x966C U+50D5 # <cjk>
+0x966D U+535C # <cjk>
+0x966E U+58A8 # <cjk>
+0x966F U+64B2 # <cjk>
+0x9670 U+6734 # <cjk>
+0x9671 U+7267 # <cjk>
+0x9672 U+7766 # <cjk>
+0x9673 U+7A46 # <cjk>
+0x9674 U+91E6 # <cjk>
+0x9675 U+52C3 # <cjk>
+0x9676 U+6CA1 # <cjk>
+0x9677 U+6B86 # <cjk>
+0x9678 U+5800 # <cjk>
+0x9679 U+5E4C # <cjk>
+0x967A U+5954 # <cjk>
+0x967B U+672C # <cjk>
+0x967C U+7FFB # <cjk>
+0x967D U+51E1 # <cjk>
+0x967E U+76C6 # <cjk>
+0x9680 U+6469 # <cjk>
+0x9681 U+78E8 # <cjk>
+0x9682 U+9B54 # <cjk>
+0x9683 U+9EBB # <cjk>
+0x9684 U+57CB # <cjk>
+0x9685 U+59B9 # <cjk>
+0x9686 U+6627 # <cjk>
+0x9687 U+679A # <cjk>
+0x9688 U+6BCE # <cjk>
+0x9689 U+54E9 # <cjk>
+0x968A U+69D9 # <cjk>
+0x968B U+5E55 # <cjk>
+0x968C U+819C # <cjk>
+0x968D U+6795 # <cjk>
+0x968E U+9BAA # <cjk>
+0x968F U+67FE # <cjk>
+0x9690 U+9C52 # <cjk>
+0x9691 U+685D # <cjk>
+0x9692 U+4EA6 # <cjk>
+0x9693 U+4FE3 # <cjk>
+0x9694 U+53C8 # <cjk>
+0x9695 U+62B9 # <cjk>
+0x9696 U+672B # <cjk>
+0x9697 U+6CAB # <cjk>
+0x9698 U+8FC4 # <cjk>
+0x9699 U+4FAD # <cjk>
+0x969A U+7E6D # <cjk>
+0x969B U+9EBF # <cjk>
+0x969C U+4E07 # <cjk>
+0x969D U+6162 # <cjk>
+0x969E U+6E80 # <cjk>
+0x969F U+6F2B # <cjk>
+0x96A0 U+8513 # <cjk>
+0x96A1 U+5473 # <cjk>
+0x96A2 U+672A # <cjk>
+0x96A3 U+9B45 # <cjk>
+0x96A4 U+5DF3 # <cjk>
+0x96A5 U+7B95 # <cjk>
+0x96A6 U+5CAC # <cjk>
+0x96A7 U+5BC6 # <cjk>
+0x96A8 U+871C # <cjk>
+0x96A9 U+6E4A # <cjk>
+0x96AA U+84D1 # <cjk>
+0x96AB U+7A14 # <cjk>
+0x96AC U+8108 # <cjk>
+0x96AD U+5999 # <cjk>
+0x96AE U+7C8D # <cjk>
+0x96AF U+6C11 # <cjk>
+0x96B0 U+7720 # <cjk>
+0x96B1 U+52D9 # <cjk>
+0x96B2 U+5922 # <cjk>
+0x96B3 U+7121 # <cjk>
+0x96B4 U+725F # <cjk>
+0x96B5 U+77DB # <cjk>
+0x96B6 U+9727 # <cjk>
+0x96B7 U+9D61 # <cjk>
+0x96B8 U+690B # <cjk>
+0x96B9 U+5A7F # <cjk>
+0x96BA U+5A18 # <cjk>
+0x96BB U+51A5 # <cjk>
+0x96BC U+540D # <cjk>
+0x96BD U+547D # <cjk>
+0x96BE U+660E # <cjk>
+0x96BF U+76DF # <cjk>
+0x96C0 U+8FF7 # <cjk>
+0x96C1 U+9298 # <cjk>
+0x96C2 U+9CF4 # <cjk>
+0x96C3 U+59EA # <cjk>
+0x96C4 U+725D # <cjk>
+0x96C5 U+6EC5 # <cjk>
+0x96C6 U+514D # <cjk>
+0x96C7 U+68C9 # <cjk>
+0x96C8 U+7DBF # <cjk>
+0x96C9 U+7DEC # <cjk>
+0x96CA U+9762 # <cjk>
+0x96CB U+9EBA # <cjk>
+0x96CC U+6478 # <cjk>
+0x96CD U+6A21 # <cjk>
+0x96CE U+8302 # <cjk>
+0x96CF U+5984 # <cjk>
+0x96D0 U+5B5F # <cjk>
+0x96D1 U+6BDB # <cjk>
+0x96D2 U+731B # <cjk>
+0x96D3 U+76F2 # <cjk>
+0x96D4 U+7DB2 # <cjk>
+0x96D5 U+8017 # <cjk>
+0x96D6 U+8499 # <cjk>
+0x96D7 U+5132 # <cjk>
+0x96D8 U+6728 # <cjk>
+0x96D9 U+9ED9 # <cjk>
+0x96DA U+76EE # <cjk>
+0x96DB U+6762 # <cjk>
+0x96DC U+52FF # <cjk>
+0x96DD U+9905 # <cjk>
+0x96DE U+5C24 # <cjk>
+0x96DF U+623B # <cjk>
+0x96E0 U+7C7E # <cjk>
+0x96E1 U+8CB0 # <cjk>
+0x96E2 U+554F # <cjk>
+0x96E3 U+60B6 # <cjk>
+0x96E4 U+7D0B # <cjk>
+0x96E5 U+9580 # <cjk>
+0x96E6 U+5301 # <cjk>
+0x96E7 U+4E5F # <cjk>
+0x96E8 U+51B6 # <cjk>
+0x96E9 U+591C # <cjk>
+0x96EA U+723A # <cjk>
+0x96EB U+8036 # <cjk>
+0x96EC U+91CE # <cjk>
+0x96ED U+5F25 # <cjk>
+0x96EE U+77E2 # <cjk>
+0x96EF U+5384 # <cjk>
+0x96F0 U+5F79 # <cjk>
+0x96F1 U+7D04 # <cjk>
+0x96F2 U+85AC # <cjk>
+0x96F3 U+8A33 # <cjk>
+0x96F4 U+8E8D # <cjk>
+0x96F5 U+9756 # <cjk>
+0x96F6 U+67F3 # <cjk>
+0x96F7 U+85AE # <cjk>
+0x96F8 U+9453 # <cjk>
+0x96F9 U+6109 # <cjk>
+0x96FA U+6108 # <cjk>
+0x96FB U+6CB9 # <cjk>
+0x96FC U+7652 # <cjk>
+0x9740 U+8AED # <cjk>
+0x9741 U+8F38 # <cjk>
+0x9742 U+552F # <cjk>
+0x9743 U+4F51 # <cjk>
+0x9744 U+512A # <cjk>
+0x9745 U+52C7 # <cjk>
+0x9746 U+53CB # <cjk>
+0x9747 U+5BA5 # <cjk>
+0x9748 U+5E7D # <cjk>
+0x9749 U+60A0 # <cjk>
+0x974A U+6182 # <cjk>
+0x974B U+63D6 # <cjk>
+0x974C U+6709 # <cjk>
+0x974D U+67DA # <cjk>
+0x974E U+6E67 # <cjk>
+0x974F U+6D8C # <cjk>
+0x9750 U+7336 # <cjk>
+0x9751 U+7337 # <cjk>
+0x9752 U+7531 # <cjk>
+0x9753 U+7950 # <cjk>
+0x9754 U+88D5 # <cjk>
+0x9755 U+8A98 # <cjk>
+0x9756 U+904A # <cjk>
+0x9757 U+9091 # <cjk>
+0x9758 U+90F5 # <cjk>
+0x9759 U+96C4 # <cjk>
+0x975A U+878D # <cjk>
+0x975B U+5915 # <cjk>
+0x975C U+4E88 # <cjk>
+0x975D U+4F59 # <cjk>
+0x975E U+4E0E # <cjk>
+0x975F U+8A89 # <cjk>
+0x9760 U+8F3F # <cjk>
+0x9761 U+9810 # <cjk>
+0x9762 U+50AD # <cjk>
+0x9763 U+5E7C # <cjk>
+0x9764 U+5996 # <cjk>
+0x9765 U+5BB9 # <cjk>
+0x9766 U+5EB8 # <cjk>
+0x9767 U+63DA # <cjk>
+0x9768 U+63FA # <cjk>
+0x9769 U+64C1 # <cjk>
+0x976A U+66DC # <cjk>
+0x976B U+694A # <cjk>
+0x976C U+69D8 # <cjk>
+0x976D U+6D0B # <cjk>
+0x976E U+6EB6 # <cjk>
+0x976F U+7194 # <cjk>
+0x9770 U+7528 # <cjk>
+0x9771 U+7AAF # <cjk>
+0x9772 U+7F8A # <cjk>
+0x9773 U+8000 # <cjk>
+0x9774 U+8449 # <cjk>
+0x9775 U+84C9 # <cjk>
+0x9776 U+8981 # <cjk>
+0x9777 U+8B21 # <cjk>
+0x9778 U+8E0A # <cjk>
+0x9779 U+9065 # <cjk>
+0x977A U+967D # <cjk>
+0x977B U+990A # <cjk>
+0x977C U+617E # <cjk>
+0x977D U+6291 # <cjk>
+0x977E U+6B32 # <cjk>
+0x9780 U+6C83 # <cjk>
+0x9781 U+6D74 # <cjk>
+0x9782 U+7FCC # <cjk>
+0x9783 U+7FFC # <cjk>
+0x9784 U+6DC0 # <cjk>
+0x9785 U+7F85 # <cjk>
+0x9786 U+87BA # <cjk>
+0x9787 U+88F8 # <cjk>
+0x9788 U+6765 # <cjk>
+0x9789 U+83B1 # <cjk>
+0x978A U+983C # <cjk>
+0x978B U+96F7 # <cjk>
+0x978C U+6D1B # <cjk>
+0x978D U+7D61 # <cjk>
+0x978E U+843D # <cjk>
+0x978F U+916A # <cjk>
+0x9790 U+4E71 # <cjk>
+0x9791 U+5375 # <cjk>
+0x9792 U+5D50 # <cjk>
+0x9793 U+6B04 # <cjk>
+0x9794 U+6FEB # <cjk>
+0x9795 U+85CD # <cjk>
+0x9796 U+862D # <cjk>
+0x9797 U+89A7 # <cjk>
+0x9798 U+5229 # <cjk>
+0x9799 U+540F # <cjk>
+0x979A U+5C65 # <cjk>
+0x979B U+674E # <cjk>
+0x979C U+68A8 # <cjk>
+0x979D U+7406 # <cjk>
+0x979E U+7483 # <cjk>
+0x979F U+75E2 # <cjk>
+0x97A0 U+88CF # <cjk>
+0x97A1 U+88E1 # <cjk>
+0x97A2 U+91CC # <cjk>
+0x97A3 U+96E2 # <cjk>
+0x97A4 U+9678 # <cjk>
+0x97A5 U+5F8B # <cjk>
+0x97A6 U+7387 # <cjk>
+0x97A7 U+7ACB # <cjk>
+0x97A8 U+844E # <cjk>
+0x97A9 U+63A0 # <cjk>
+0x97AA U+7565 # <cjk>
+0x97AB U+5289 # <cjk>
+0x97AC U+6D41 # <cjk>
+0x97AD U+6E9C # <cjk>
+0x97AE U+7409 # <cjk>
+0x97AF U+7559 # <cjk>
+0x97B0 U+786B # <cjk>
+0x97B1 U+7C92 # <cjk>
+0x97B2 U+9686 # <cjk>
+0x97B3 U+7ADC # <cjk>
+0x97B4 U+9F8D # <cjk>
+0x97B5 U+4FB6 # <cjk>
+0x97B6 U+616E # <cjk>
+0x97B7 U+65C5 # <cjk>
+0x97B8 U+865C # <cjk>
+0x97B9 U+4E86 # <cjk>
+0x97BA U+4EAE # <cjk>
+0x97BB U+50DA # <cjk>
+0x97BC U+4E21 # <cjk>
+0x97BD U+51CC # <cjk>
+0x97BE U+5BEE # <cjk>
+0x97BF U+6599 # <cjk>
+0x97C0 U+6881 # <cjk>
+0x97C1 U+6DBC # <cjk>
+0x97C2 U+731F # <cjk>
+0x97C3 U+7642 # <cjk>
+0x97C4 U+77AD # <cjk>
+0x97C5 U+7A1C # <cjk>
+0x97C6 U+7CE7 # <cjk>
+0x97C7 U+826F # <cjk>
+0x97C8 U+8AD2 # <cjk>
+0x97C9 U+907C # <cjk>
+0x97CA U+91CF # <cjk>
+0x97CB U+9675 # <cjk>
+0x97CC U+9818 # <cjk>
+0x97CD U+529B # <cjk>
+0x97CE U+7DD1 # <cjk>
+0x97CF U+502B # <cjk>
+0x97D0 U+5398 # <cjk>
+0x97D1 U+6797 # <cjk>
+0x97D2 U+6DCB # <cjk>
+0x97D3 U+71D0 # <cjk>
+0x97D4 U+7433 # <cjk>
+0x97D5 U+81E8 # <cjk>
+0x97D6 U+8F2A # <cjk>
+0x97D7 U+96A3 # <cjk>
+0x97D8 U+9C57 # <cjk>
+0x97D9 U+9E9F # <cjk>
+0x97DA U+7460 # <cjk>
+0x97DB U+5841 # <cjk>
+0x97DC U+6D99 # <cjk>
+0x97DD U+7D2F # <cjk>
+0x97DE U+985E # <cjk>
+0x97DF U+4EE4 # <cjk>
+0x97E0 U+4F36 # <cjk>
+0x97E1 U+4F8B # <cjk>
+0x97E2 U+51B7 # <cjk>
+0x97E3 U+52B1 # <cjk>
+0x97E4 U+5DBA # <cjk>
+0x97E5 U+601C # <cjk>
+0x97E6 U+73B2 # <cjk>
+0x97E7 U+793C # <cjk>
+0x97E8 U+82D3 # <cjk>
+0x97E9 U+9234 # <cjk>
+0x97EA U+96B7 # <cjk>
+0x97EB U+96F6 # <cjk>
+0x97EC U+970A # <cjk>
+0x97ED U+9E97 # <cjk>
+0x97EE U+9F62 # <cjk>
+0x97EF U+66A6 # <cjk>
+0x97F0 U+6B74 # <cjk>
+0x97F1 U+5217 # <cjk>
+0x97F2 U+52A3 # <cjk>
+0x97F3 U+70C8 # <cjk>
+0x97F4 U+88C2 # <cjk>
+0x97F5 U+5EC9 # <cjk>
+0x97F6 U+604B # <cjk>
+0x97F7 U+6190 # <cjk>
+0x97F8 U+6F23 # <cjk>
+0x97F9 U+7149 # <cjk>
+0x97FA U+7C3E # <cjk>
+0x97FB U+7DF4 # <cjk>
+0x97FC U+806F # <cjk>
+0x9840 U+84EE # <cjk>
+0x9841 U+9023 # <cjk>
+0x9842 U+932C # <cjk>
+0x9843 U+5442 # <cjk>
+0x9844 U+9B6F # <cjk>
+0x9845 U+6AD3 # <cjk>
+0x9846 U+7089 # <cjk>
+0x9847 U+8CC2 # <cjk>
+0x9848 U+8DEF # <cjk>
+0x9849 U+9732 # <cjk>
+0x984A U+52B4 # <cjk>
+0x984B U+5A41 # <cjk>
+0x984C U+5ECA # <cjk>
+0x984D U+5F04 # <cjk>
+0x984E U+6717 # <cjk>
+0x984F U+697C # <cjk>
+0x9850 U+6994 # <cjk>
+0x9851 U+6D6A # <cjk>
+0x9852 U+6F0F # <cjk>
+0x9853 U+7262 # <cjk>
+0x9854 U+72FC # <cjk>
+0x9855 U+7BED # <cjk>
+0x9856 U+8001 # <cjk>
+0x9857 U+807E # <cjk>
+0x9858 U+874B # <cjk>
+0x9859 U+90CE # <cjk>
+0x985A U+516D # <cjk>
+0x985B U+9E93 # <cjk>
+0x985C U+7984 # <cjk>
+0x985D U+808B # <cjk>
+0x985E U+9332 # <cjk>
+0x985F U+8AD6 # <cjk>
+0x9860 U+502D # <cjk>
+0x9861 U+548C # <cjk>
+0x9862 U+8A71 # <cjk>
+0x9863 U+6B6A # <cjk>
+0x9864 U+8CC4 # <cjk>
+0x9865 U+8107 # <cjk>
+0x9866 U+60D1 # <cjk>
+0x9867 U+67A0 # <cjk>
+0x9868 U+9DF2 # <cjk>
+0x9869 U+4E99 # <cjk>
+0x986A U+4E98 # <cjk>
+0x986B U+9C10 # <cjk>
+0x986C U+8A6B # <cjk>
+0x986D U+85C1 # <cjk>
+0x986E U+8568 # <cjk>
+0x986F U+6900 # <cjk>
+0x9870 U+6E7E # <cjk>
+0x9871 U+7897 # <cjk>
+0x9872 U+8155 # <cjk>
+0x9873 U+20B9F # <cjk> [2004] [Unicode3.1]
+0x9874 U+5B41 # <cjk> [2000]
+0x9875 U+5B56 # <cjk> [2000]
+0x9876 U+5B7D # <cjk> [2000]
+0x9877 U+5B93 # <cjk> [2000]
+0x9878 U+5BD8 # <cjk> [2000]
+0x9879 U+5BEC # <cjk> [2000]
+0x987A U+5C12 # <cjk> [2000]
+0x987B U+5C1E # <cjk> [2000]
+0x987C U+5C23 # <cjk> [2000]
+0x987D U+5C2B # <cjk> [2000]
+0x987E U+378D # <cjk> [2000]
+0x9880 U+5C62 # <cjk> [2000]
+0x9881 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2]
+0x9882 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2]
+0x9883 U+216B4 # <cjk> [2000] [Unicode3.1]
+0x9884 U+5C7A # <cjk> [2000]
+0x9885 U+5C8F # <cjk> [2000]
+0x9886 U+5C9F # <cjk> [2000]
+0x9887 U+5CA3 # <cjk> [2000]
+0x9888 U+5CAA # <cjk> [2000]
+0x9889 U+5CBA # <cjk> [2000]
+0x988A U+5CCB # <cjk> [2000]
+0x988B U+5CD0 # <cjk> [2000]
+0x988C U+5CD2 # <cjk> [2000]
+0x988D U+5CF4 # <cjk> [2000]
+0x988E U+21E34 # <cjk> [2000] [Unicode3.1]
+0x988F U+37E2 # <cjk> [2000]
+0x9890 U+5D0D # <cjk> [2000]
+0x9891 U+5D27 # <cjk> [2000]
+0x9892 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000]
+0x9893 U+5D46 # <cjk> [2000]
+0x9894 U+5D47 # <cjk> [2000]
+0x9895 U+5D53 # <cjk> [2000]
+0x9896 U+5D4A # <cjk> [2000]
+0x9897 U+5D6D # <cjk> [2000]
+0x9898 U+5D81 # <cjk> [2000]
+0x9899 U+5DA0 # <cjk> [2000]
+0x989A U+5DA4 # <cjk> [2000]
+0x989B U+5DA7 # <cjk> [2000]
+0x989C U+5DB8 # <cjk> [2000]
+0x989D U+5DCB # <cjk> [2000]
+0x989E U+541E # <cjk> [2004]
+0x989F U+5F0C # <cjk>
+0x98A0 U+4E10 # <cjk>
+0x98A1 U+4E15 # <cjk>
+0x98A2 U+4E2A # <cjk>
+0x98A3 U+4E31 # <cjk>
+0x98A4 U+4E36 # <cjk>
+0x98A5 U+4E3C # <cjk>
+0x98A6 U+4E3F # <cjk>
+0x98A7 U+4E42 # <cjk>
+0x98A8 U+4E56 # <cjk>
+0x98A9 U+4E58 # <cjk>
+0x98AA U+4E82 # <cjk>
+0x98AB U+4E85 # <cjk>
+0x98AC U+8C6B # <cjk>
+0x98AD U+4E8A # <cjk>
+0x98AE U+8212 # <cjk>
+0x98AF U+5F0D # <cjk>
+0x98B0 U+4E8E # <cjk>
+0x98B1 U+4E9E # <cjk>
+0x98B2 U+4E9F # <cjk>
+0x98B3 U+4EA0 # <cjk>
+0x98B4 U+4EA2 # <cjk>
+0x98B5 U+4EB0 # <cjk>
+0x98B6 U+4EB3 # <cjk>
+0x98B7 U+4EB6 # <cjk>
+0x98B8 U+4ECE # <cjk>
+0x98B9 U+4ECD # <cjk>
+0x98BA U+4EC4 # <cjk>
+0x98BB U+4EC6 # <cjk>
+0x98BC U+4EC2 # <cjk>
+0x98BD U+4ED7 # <cjk>
+0x98BE U+4EDE # <cjk>
+0x98BF U+4EED # <cjk>
+0x98C0 U+4EDF # <cjk>
+0x98C1 U+4EF7 # <cjk>
+0x98C2 U+4F09 # <cjk>
+0x98C3 U+4F5A # <cjk>
+0x98C4 U+4F30 # <cjk>
+0x98C5 U+4F5B # <cjk>
+0x98C6 U+4F5D # <cjk>
+0x98C7 U+4F57 # <cjk>
+0x98C8 U+4F47 # <cjk>
+0x98C9 U+4F76 # <cjk>
+0x98CA U+4F88 # <cjk>
+0x98CB U+4F8F # <cjk>
+0x98CC U+4F98 # <cjk>
+0x98CD U+4F7B # <cjk>
+0x98CE U+4F69 # <cjk>
+0x98CF U+4F70 # <cjk>
+0x98D0 U+4F91 # <cjk>
+0x98D1 U+4F6F # <cjk>
+0x98D2 U+4F86 # <cjk>
+0x98D3 U+4F96 # <cjk>
+0x98D4 U+5118 # <cjk>
+0x98D5 U+4FD4 # <cjk>
+0x98D6 U+4FDF # <cjk>
+0x98D7 U+4FCE # <cjk>
+0x98D8 U+4FD8 # <cjk>
+0x98D9 U+4FDB # <cjk>
+0x98DA U+4FD1 # <cjk>
+0x98DB U+4FDA # <cjk>
+0x98DC U+4FD0 # <cjk>
+0x98DD U+4FE4 # <cjk>
+0x98DE U+4FE5 # <cjk>
+0x98DF U+501A # <cjk>
+0x98E0 U+5028 # <cjk>
+0x98E1 U+5014 # <cjk>
+0x98E2 U+502A # <cjk>
+0x98E3 U+5025 # <cjk>
+0x98E4 U+5005 # <cjk>
+0x98E5 U+4F1C # <cjk>
+0x98E6 U+4FF6 # <cjk>
+0x98E7 U+5021 # <cjk>
+0x98E8 U+5029 # <cjk>
+0x98E9 U+502C # <cjk>
+0x98EA U+4FFE # <cjk>
+0x98EB U+4FEF # <cjk>
+0x98EC U+5011 # <cjk>
+0x98ED U+5006 # <cjk>
+0x98EE U+5043 # <cjk>
+0x98EF U+5047 # <cjk>
+0x98F0 U+6703 # <cjk>
+0x98F1 U+5055 # <cjk>
+0x98F2 U+5050 # <cjk>
+0x98F3 U+5048 # <cjk>
+0x98F4 U+505A # <cjk>
+0x98F5 U+5056 # <cjk>
+0x98F6 U+506C # <cjk>
+0x98F7 U+5078 # <cjk>
+0x98F8 U+5080 # <cjk>
+0x98F9 U+509A # <cjk>
+0x98FA U+5085 # <cjk>
+0x98FB U+50B4 # <cjk>
+0x98FC U+50B2 # <cjk>
+0x9940 U+50C9 # <cjk>
+0x9941 U+50CA # <cjk>
+0x9942 U+50B3 # <cjk>
+0x9943 U+50C2 # <cjk>
+0x9944 U+50D6 # <cjk>
+0x9945 U+50DE # <cjk>
+0x9946 U+50E5 # <cjk>
+0x9947 U+50ED # <cjk>
+0x9948 U+50E3 # <cjk>
+0x9949 U+50EE # <cjk>
+0x994A U+50F9 # <cjk>
+0x994B U+50F5 # <cjk>
+0x994C U+5109 # <cjk>
+0x994D U+5101 # <cjk>
+0x994E U+5102 # <cjk>
+0x994F U+5116 # <cjk>
+0x9950 U+5115 # <cjk>
+0x9951 U+5114 # <cjk>
+0x9952 U+511A # <cjk>
+0x9953 U+5121 # <cjk>
+0x9954 U+513A # <cjk>
+0x9955 U+5137 # <cjk>
+0x9956 U+513C # <cjk>
+0x9957 U+513B # <cjk>
+0x9958 U+513F # <cjk>
+0x9959 U+5140 # <cjk>
+0x995A U+5152 # <cjk>
+0x995B U+514C # <cjk>
+0x995C U+5154 # <cjk>
+0x995D U+5162 # <cjk>
+0x995E U+7AF8 # <cjk>
+0x995F U+5169 # <cjk>
+0x9960 U+516A # <cjk>
+0x9961 U+516E # <cjk>
+0x9962 U+5180 # <cjk>
+0x9963 U+5182 # <cjk>
+0x9964 U+56D8 # <cjk>
+0x9965 U+518C # <cjk>
+0x9966 U+5189 # <cjk>
+0x9967 U+518F # <cjk>
+0x9968 U+5191 # <cjk>
+0x9969 U+5193 # <cjk>
+0x996A U+5195 # <cjk>
+0x996B U+5196 # <cjk>
+0x996C U+51A4 # <cjk>
+0x996D U+51A6 # <cjk>
+0x996E U+51A2 # <cjk>
+0x996F U+51A9 # <cjk>
+0x9970 U+51AA # <cjk>
+0x9971 U+51AB # <cjk>
+0x9972 U+51B3 # <cjk>
+0x9973 U+51B1 # <cjk>
+0x9974 U+51B2 # <cjk>
+0x9975 U+51B0 # <cjk>
+0x9976 U+51B5 # <cjk>
+0x9977 U+51BD # <cjk>
+0x9978 U+51C5 # <cjk>
+0x9979 U+51C9 # <cjk>
+0x997A U+51DB # <cjk>
+0x997B U+51E0 # <cjk>
+0x997C U+8655 # <cjk>
+0x997D U+51E9 # <cjk>
+0x997E U+51ED # <cjk>
+0x9980 U+51F0 # <cjk>
+0x9981 U+51F5 # <cjk>
+0x9982 U+51FE # <cjk>
+0x9983 U+5204 # <cjk>
+0x9984 U+520B # <cjk>
+0x9985 U+5214 # <cjk>
+0x9986 U+520E # <cjk>
+0x9987 U+5227 # <cjk>
+0x9988 U+522A # <cjk>
+0x9989 U+522E # <cjk>
+0x998A U+5233 # <cjk>
+0x998B U+5239 # <cjk>
+0x998C U+524F # <cjk>
+0x998D U+5244 # <cjk>
+0x998E U+524B # <cjk>
+0x998F U+524C # <cjk>
+0x9990 U+525E # <cjk>
+0x9991 U+5254 # <cjk>
+0x9992 U+526A # <cjk>
+0x9993 U+5274 # <cjk>
+0x9994 U+5269 # <cjk>
+0x9995 U+5273 # <cjk>
+0x9996 U+527F # <cjk>
+0x9997 U+527D # <cjk>
+0x9998 U+528D # <cjk>
+0x9999 U+5294 # <cjk>
+0x999A U+5292 # <cjk>
+0x999B U+5271 # <cjk>
+0x999C U+5288 # <cjk>
+0x999D U+5291 # <cjk>
+0x999E U+8FA8 # <cjk>
+0x999F U+8FA7 # <cjk>
+0x99A0 U+52AC # <cjk>
+0x99A1 U+52AD # <cjk>
+0x99A2 U+52BC # <cjk>
+0x99A3 U+52B5 # <cjk>
+0x99A4 U+52C1 # <cjk>
+0x99A5 U+52CD # <cjk>
+0x99A6 U+52D7 # <cjk>
+0x99A7 U+52DE # <cjk>
+0x99A8 U+52E3 # <cjk>
+0x99A9 U+52E6 # <cjk>
+0x99AA U+98ED # <cjk>
+0x99AB U+52E0 # <cjk>
+0x99AC U+52F3 # <cjk>
+0x99AD U+52F5 # <cjk>
+0x99AE U+52F8 # <cjk>
+0x99AF U+52F9 # <cjk>
+0x99B0 U+5306 # <cjk>
+0x99B1 U+5308 # <cjk>
+0x99B2 U+7538 # <cjk>
+0x99B3 U+530D # <cjk>
+0x99B4 U+5310 # <cjk>
+0x99B5 U+530F # <cjk>
+0x99B6 U+5315 # <cjk>
+0x99B7 U+531A # <cjk>
+0x99B8 U+5323 # <cjk>
+0x99B9 U+532F # <cjk>
+0x99BA U+5331 # <cjk>
+0x99BB U+5333 # <cjk>
+0x99BC U+5338 # <cjk>
+0x99BD U+5340 # <cjk>
+0x99BE U+5346 # <cjk>
+0x99BF U+5345 # <cjk>
+0x99C0 U+4E17 # <cjk>
+0x99C1 U+5349 # <cjk>
+0x99C2 U+534D # <cjk>
+0x99C3 U+51D6 # <cjk>
+0x99C4 U+535E # <cjk>
+0x99C5 U+5369 # <cjk>
+0x99C6 U+536E # <cjk>
+0x99C7 U+5918 # <cjk>
+0x99C8 U+537B # <cjk>
+0x99C9 U+5377 # <cjk>
+0x99CA U+5382 # <cjk>
+0x99CB U+5396 # <cjk>
+0x99CC U+53A0 # <cjk>
+0x99CD U+53A6 # <cjk>
+0x99CE U+53A5 # <cjk>
+0x99CF U+53AE # <cjk>
+0x99D0 U+53B0 # <cjk>
+0x99D1 U+53B6 # <cjk>
+0x99D2 U+53C3 # <cjk>
+0x99D3 U+7C12 # <cjk>
+0x99D4 U+96D9 # <cjk>
+0x99D5 U+53DF # <cjk>
+0x99D6 U+66FC # <cjk>
+0x99D7 U+71EE # <cjk>
+0x99D8 U+53EE # <cjk>
+0x99D9 U+53E8 # <cjk>
+0x99DA U+53ED # <cjk>
+0x99DB U+53FA # <cjk>
+0x99DC U+5401 # <cjk>
+0x99DD U+543D # <cjk>
+0x99DE U+5440 # <cjk>
+0x99DF U+542C # <cjk>
+0x99E0 U+542D # <cjk>
+0x99E1 U+543C # <cjk>
+0x99E2 U+542E # <cjk>
+0x99E3 U+5436 # <cjk>
+0x99E4 U+5429 # <cjk>
+0x99E5 U+541D # <cjk>
+0x99E6 U+544E # <cjk>
+0x99E7 U+548F # <cjk>
+0x99E8 U+5475 # <cjk>
+0x99E9 U+548E # <cjk>
+0x99EA U+545F # <cjk>
+0x99EB U+5471 # <cjk>
+0x99EC U+5477 # <cjk>
+0x99ED U+5470 # <cjk>
+0x99EE U+5492 # <cjk>
+0x99EF U+547B # <cjk>
+0x99F0 U+5480 # <cjk>
+0x99F1 U+5476 # <cjk>
+0x99F2 U+5484 # <cjk>
+0x99F3 U+5490 # <cjk>
+0x99F4 U+5486 # <cjk>
+0x99F5 U+54C7 # <cjk>
+0x99F6 U+54A2 # <cjk>
+0x99F7 U+54B8 # <cjk>
+0x99F8 U+54A5 # <cjk>
+0x99F9 U+54AC # <cjk>
+0x99FA U+54C4 # <cjk>
+0x99FB U+54C8 # <cjk>
+0x99FC U+54A8 # <cjk>
+0x9A40 U+54AB # <cjk>
+0x9A41 U+54C2 # <cjk>
+0x9A42 U+54A4 # <cjk>
+0x9A43 U+54BE # <cjk>
+0x9A44 U+54BC # <cjk>
+0x9A45 U+54D8 # <cjk>
+0x9A46 U+54E5 # <cjk>
+0x9A47 U+54E6 # <cjk>
+0x9A48 U+550F # <cjk>
+0x9A49 U+5514 # <cjk>
+0x9A4A U+54FD # <cjk>
+0x9A4B U+54EE # <cjk>
+0x9A4C U+54ED # <cjk>
+0x9A4D U+54FA # <cjk>
+0x9A4E U+54E2 # <cjk>
+0x9A4F U+5539 # <cjk>
+0x9A50 U+5540 # <cjk>
+0x9A51 U+5563 # <cjk>
+0x9A52 U+554C # <cjk>
+0x9A53 U+552E # <cjk>
+0x9A54 U+555C # <cjk>
+0x9A55 U+5545 # <cjk>
+0x9A56 U+5556 # <cjk>
+0x9A57 U+5557 # <cjk>
+0x9A58 U+5538 # <cjk>
+0x9A59 U+5533 # <cjk>
+0x9A5A U+555D # <cjk>
+0x9A5B U+5599 # <cjk>
+0x9A5C U+5580 # <cjk>
+0x9A5D U+54AF # <cjk>
+0x9A5E U+558A # <cjk>
+0x9A5F U+559F # <cjk>
+0x9A60 U+557B # <cjk>
+0x9A61 U+557E # <cjk>
+0x9A62 U+5598 # <cjk>
+0x9A63 U+559E # <cjk>
+0x9A64 U+55AE # <cjk>
+0x9A65 U+557C # <cjk>
+0x9A66 U+5583 # <cjk>
+0x9A67 U+55A9 # <cjk>
+0x9A68 U+5587 # <cjk>
+0x9A69 U+55A8 # <cjk>
+0x9A6A U+55DA # <cjk>
+0x9A6B U+55C5 # <cjk>
+0x9A6C U+55DF # <cjk>
+0x9A6D U+55C4 # <cjk>
+0x9A6E U+55DC # <cjk>
+0x9A6F U+55E4 # <cjk>
+0x9A70 U+55D4 # <cjk>
+0x9A71 U+5614 # <cjk>
+0x9A72 U+55F7 # <cjk>
+0x9A73 U+5616 # <cjk>
+0x9A74 U+55FE # <cjk>
+0x9A75 U+55FD # <cjk>
+0x9A76 U+561B # <cjk>
+0x9A77 U+55F9 # <cjk>
+0x9A78 U+564E # <cjk>
+0x9A79 U+5650 # <cjk>
+0x9A7A U+71DF # <cjk>
+0x9A7B U+5634 # <cjk>
+0x9A7C U+5636 # <cjk>
+0x9A7D U+5632 # <cjk>
+0x9A7E U+5638 # <cjk>
+0x9A80 U+566B # <cjk>
+0x9A81 U+5664 # <cjk>
+0x9A82 U+562F # <cjk>
+0x9A83 U+566C # <cjk>
+0x9A84 U+566A # <cjk>
+0x9A85 U+5686 # <cjk>
+0x9A86 U+5680 # <cjk>
+0x9A87 U+568A # <cjk>
+0x9A88 U+56A0 # <cjk>
+0x9A89 U+5694 # <cjk>
+0x9A8A U+568F # <cjk>
+0x9A8B U+56A5 # <cjk>
+0x9A8C U+56AE # <cjk>
+0x9A8D U+56B6 # <cjk>
+0x9A8E U+56B4 # <cjk>
+0x9A8F U+56C2 # <cjk>
+0x9A90 U+56BC # <cjk>
+0x9A91 U+56C1 # <cjk>
+0x9A92 U+56C3 # <cjk>
+0x9A93 U+56C0 # <cjk>
+0x9A94 U+56C8 # <cjk>
+0x9A95 U+56CE # <cjk>
+0x9A96 U+56D1 # <cjk>
+0x9A97 U+56D3 # <cjk>
+0x9A98 U+56D7 # <cjk>
+0x9A99 U+56EE # <cjk>
+0x9A9A U+56F9 # <cjk>
+0x9A9B U+5700 # <cjk>
+0x9A9C U+56FF # <cjk>
+0x9A9D U+5704 # <cjk>
+0x9A9E U+5709 # <cjk>
+0x9A9F U+5708 # <cjk>
+0x9AA0 U+570B # <cjk>
+0x9AA1 U+570D # <cjk>
+0x9AA2 U+5713 # <cjk>
+0x9AA3 U+5718 # <cjk>
+0x9AA4 U+5716 # <cjk>
+0x9AA5 U+55C7 # <cjk>
+0x9AA6 U+571C # <cjk>
+0x9AA7 U+5726 # <cjk>
+0x9AA8 U+5737 # <cjk>
+0x9AA9 U+5738 # <cjk>
+0x9AAA U+574E # <cjk>
+0x9AAB U+573B # <cjk>
+0x9AAC U+5740 # <cjk>
+0x9AAD U+574F # <cjk>
+0x9AAE U+5769 # <cjk>
+0x9AAF U+57C0 # <cjk>
+0x9AB0 U+5788 # <cjk>
+0x9AB1 U+5761 # <cjk>
+0x9AB2 U+577F # <cjk>
+0x9AB3 U+5789 # <cjk>
+0x9AB4 U+5793 # <cjk>
+0x9AB5 U+57A0 # <cjk>
+0x9AB6 U+57B3 # <cjk>
+0x9AB7 U+57A4 # <cjk>
+0x9AB8 U+57AA # <cjk>
+0x9AB9 U+57B0 # <cjk>
+0x9ABA U+57C3 # <cjk>
+0x9ABB U+57C6 # <cjk>
+0x9ABC U+57D4 # <cjk>
+0x9ABD U+57D2 # <cjk>
+0x9ABE U+57D3 # <cjk>
+0x9ABF U+580A # <cjk>
+0x9AC0 U+57D6 # <cjk>
+0x9AC1 U+57E3 # <cjk>
+0x9AC2 U+580B # <cjk>
+0x9AC3 U+5819 # <cjk>
+0x9AC4 U+581D # <cjk>
+0x9AC5 U+5872 # <cjk>
+0x9AC6 U+5821 # <cjk>
+0x9AC7 U+5862 # <cjk>
+0x9AC8 U+584B # <cjk>
+0x9AC9 U+5870 # <cjk>
+0x9ACA U+6BC0 # <cjk>
+0x9ACB U+5852 # <cjk>
+0x9ACC U+583D # <cjk>
+0x9ACD U+5879 # <cjk>
+0x9ACE U+5885 # <cjk>
+0x9ACF U+58B9 # <cjk>
+0x9AD0 U+589F # <cjk>
+0x9AD1 U+58AB # <cjk>
+0x9AD2 U+58BA # <cjk>
+0x9AD3 U+58DE # <cjk>
+0x9AD4 U+58BB # <cjk>
+0x9AD5 U+58B8 # <cjk>
+0x9AD6 U+58AE # <cjk>
+0x9AD7 U+58C5 # <cjk>
+0x9AD8 U+58D3 # <cjk>
+0x9AD9 U+58D1 # <cjk>
+0x9ADA U+58D7 # <cjk>
+0x9ADB U+58D9 # <cjk>
+0x9ADC U+58D8 # <cjk>
+0x9ADD U+58E5 # <cjk>
+0x9ADE U+58DC # <cjk>
+0x9ADF U+58E4 # <cjk>
+0x9AE0 U+58DF # <cjk>
+0x9AE1 U+58EF # <cjk>
+0x9AE2 U+58FA # <cjk>
+0x9AE3 U+58F9 # <cjk>
+0x9AE4 U+58FB # <cjk>
+0x9AE5 U+58FC # <cjk>
+0x9AE6 U+58FD # <cjk>
+0x9AE7 U+5902 # <cjk>
+0x9AE8 U+590A # <cjk>
+0x9AE9 U+5910 # <cjk>
+0x9AEA U+591B # <cjk>
+0x9AEB U+68A6 # <cjk>
+0x9AEC U+5925 # <cjk>
+0x9AED U+592C # <cjk>
+0x9AEE U+592D # <cjk>
+0x9AEF U+5932 # <cjk>
+0x9AF0 U+5938 # <cjk>
+0x9AF1 U+593E # <cjk>
+0x9AF2 U+7AD2 # <cjk>
+0x9AF3 U+5955 # <cjk>
+0x9AF4 U+5950 # <cjk>
+0x9AF5 U+594E # <cjk>
+0x9AF6 U+595A # <cjk>
+0x9AF7 U+5958 # <cjk>
+0x9AF8 U+5962 # <cjk>
+0x9AF9 U+5960 # <cjk>
+0x9AFA U+5967 # <cjk>
+0x9AFB U+596C # <cjk>
+0x9AFC U+5969 # <cjk>
+0x9B40 U+5978 # <cjk>
+0x9B41 U+5981 # <cjk>
+0x9B42 U+599D # <cjk>
+0x9B43 U+4F5E # <cjk>
+0x9B44 U+4FAB # <cjk>
+0x9B45 U+59A3 # <cjk>
+0x9B46 U+59B2 # <cjk>
+0x9B47 U+59C6 # <cjk>
+0x9B48 U+59E8 # <cjk>
+0x9B49 U+59DC # <cjk>
+0x9B4A U+598D # <cjk>
+0x9B4B U+59D9 # <cjk>
+0x9B4C U+59DA # <cjk>
+0x9B4D U+5A25 # <cjk>
+0x9B4E U+5A1F # <cjk>
+0x9B4F U+5A11 # <cjk>
+0x9B50 U+5A1C # <cjk>
+0x9B51 U+5A09 # <cjk>
+0x9B52 U+5A1A # <cjk>
+0x9B53 U+5A40 # <cjk>
+0x9B54 U+5A6C # <cjk>
+0x9B55 U+5A49 # <cjk>
+0x9B56 U+5A35 # <cjk>
+0x9B57 U+5A36 # <cjk>
+0x9B58 U+5A62 # <cjk>
+0x9B59 U+5A6A # <cjk>
+0x9B5A U+5A9A # <cjk>
+0x9B5B U+5ABC # <cjk>
+0x9B5C U+5ABE # <cjk>
+0x9B5D U+5ACB # <cjk>
+0x9B5E U+5AC2 # <cjk>
+0x9B5F U+5ABD # <cjk>
+0x9B60 U+5AE3 # <cjk>
+0x9B61 U+5AD7 # <cjk>
+0x9B62 U+5AE6 # <cjk>
+0x9B63 U+5AE9 # <cjk>
+0x9B64 U+5AD6 # <cjk>
+0x9B65 U+5AFA # <cjk>
+0x9B66 U+5AFB # <cjk>
+0x9B67 U+5B0C # <cjk>
+0x9B68 U+5B0B # <cjk>
+0x9B69 U+5B16 # <cjk>
+0x9B6A U+5B32 # <cjk>
+0x9B6B U+5AD0 # <cjk>
+0x9B6C U+5B2A # <cjk>
+0x9B6D U+5B36 # <cjk>
+0x9B6E U+5B3E # <cjk>
+0x9B6F U+5B43 # <cjk>
+0x9B70 U+5B45 # <cjk>
+0x9B71 U+5B40 # <cjk>
+0x9B72 U+5B51 # <cjk>
+0x9B73 U+5B55 # <cjk>
+0x9B74 U+5B5A # <cjk>
+0x9B75 U+5B5B # <cjk>
+0x9B76 U+5B65 # <cjk>
+0x9B77 U+5B69 # <cjk>
+0x9B78 U+5B70 # <cjk>
+0x9B79 U+5B73 # <cjk>
+0x9B7A U+5B75 # <cjk>
+0x9B7B U+5B78 # <cjk>
+0x9B7C U+6588 # <cjk>
+0x9B7D U+5B7A # <cjk>
+0x9B7E U+5B80 # <cjk>
+0x9B80 U+5B83 # <cjk>
+0x9B81 U+5BA6 # <cjk>
+0x9B82 U+5BB8 # <cjk>
+0x9B83 U+5BC3 # <cjk>
+0x9B84 U+5BC7 # <cjk>
+0x9B85 U+5BC9 # <cjk>
+0x9B86 U+5BD4 # <cjk>
+0x9B87 U+5BD0 # <cjk>
+0x9B88 U+5BE4 # <cjk>
+0x9B89 U+5BE6 # <cjk>
+0x9B8A U+5BE2 # <cjk>
+0x9B8B U+5BDE # <cjk>
+0x9B8C U+5BE5 # <cjk>
+0x9B8D U+5BEB # <cjk>
+0x9B8E U+5BF0 # <cjk>
+0x9B8F U+5BF6 # <cjk>
+0x9B90 U+5BF3 # <cjk>
+0x9B91 U+5C05 # <cjk>
+0x9B92 U+5C07 # <cjk>
+0x9B93 U+5C08 # <cjk>
+0x9B94 U+5C0D # <cjk>
+0x9B95 U+5C13 # <cjk>
+0x9B96 U+5C20 # <cjk>
+0x9B97 U+5C22 # <cjk>
+0x9B98 U+5C28 # <cjk>
+0x9B99 U+5C38 # <cjk>
+0x9B9A U+5C39 # <cjk>
+0x9B9B U+5C41 # <cjk>
+0x9B9C U+5C46 # <cjk>
+0x9B9D U+5C4E # <cjk>
+0x9B9E U+5C53 # <cjk>
+0x9B9F U+5C50 # <cjk>
+0x9BA0 U+5C4F # <cjk>
+0x9BA1 U+5B71 # <cjk>
+0x9BA2 U+5C6C # <cjk>
+0x9BA3 U+5C6E # <cjk>
+0x9BA4 U+4E62 # <cjk>
+0x9BA5 U+5C76 # <cjk>
+0x9BA6 U+5C79 # <cjk>
+0x9BA7 U+5C8C # <cjk>
+0x9BA8 U+5C91 # <cjk>
+0x9BA9 U+5C94 # <cjk>
+0x9BAA U+599B # <cjk>
+0x9BAB U+5CAB # <cjk>
+0x9BAC U+5CBB # <cjk>
+0x9BAD U+5CB6 # <cjk>
+0x9BAE U+5CBC # <cjk>
+0x9BAF U+5CB7 # <cjk>
+0x9BB0 U+5CC5 # <cjk>
+0x9BB1 U+5CBE # <cjk>
+0x9BB2 U+5CC7 # <cjk>
+0x9BB3 U+5CD9 # <cjk>
+0x9BB4 U+5CE9 # <cjk>
+0x9BB5 U+5CFD # <cjk>
+0x9BB6 U+5CFA # <cjk>
+0x9BB7 U+5CED # <cjk>
+0x9BB8 U+5D8C # <cjk>
+0x9BB9 U+5CEA # <cjk>
+0x9BBA U+5D0B # <cjk>
+0x9BBB U+5D15 # <cjk>
+0x9BBC U+5D17 # <cjk>
+0x9BBD U+5D5C # <cjk>
+0x9BBE U+5D1F # <cjk>
+0x9BBF U+5D1B # <cjk>
+0x9BC0 U+5D11 # <cjk>
+0x9BC1 U+5D14 # <cjk>
+0x9BC2 U+5D22 # <cjk>
+0x9BC3 U+5D1A # <cjk>
+0x9BC4 U+5D19 # <cjk>
+0x9BC5 U+5D18 # <cjk>
+0x9BC6 U+5D4C # <cjk>
+0x9BC7 U+5D52 # <cjk>
+0x9BC8 U+5D4E # <cjk>
+0x9BC9 U+5D4B # <cjk>
+0x9BCA U+5D6C # <cjk>
+0x9BCB U+5D73 # <cjk>
+0x9BCC U+5D76 # <cjk>
+0x9BCD U+5D87 # <cjk>
+0x9BCE U+5D84 # <cjk>
+0x9BCF U+5D82 # <cjk>
+0x9BD0 U+5DA2 # <cjk>
+0x9BD1 U+5D9D # <cjk>
+0x9BD2 U+5DAC # <cjk>
+0x9BD3 U+5DAE # <cjk>
+0x9BD4 U+5DBD # <cjk>
+0x9BD5 U+5D90 # <cjk>
+0x9BD6 U+5DB7 # <cjk>
+0x9BD7 U+5DBC # <cjk>
+0x9BD8 U+5DC9 # <cjk>
+0x9BD9 U+5DCD # <cjk>
+0x9BDA U+5DD3 # <cjk>
+0x9BDB U+5DD2 # <cjk>
+0x9BDC U+5DD6 # <cjk>
+0x9BDD U+5DDB # <cjk>
+0x9BDE U+5DEB # <cjk>
+0x9BDF U+5DF2 # <cjk>
+0x9BE0 U+5DF5 # <cjk>
+0x9BE1 U+5E0B # <cjk>
+0x9BE2 U+5E1A # <cjk>
+0x9BE3 U+5E19 # <cjk>
+0x9BE4 U+5E11 # <cjk>
+0x9BE5 U+5E1B # <cjk>
+0x9BE6 U+5E36 # <cjk>
+0x9BE7 U+5E37 # <cjk>
+0x9BE8 U+5E44 # <cjk>
+0x9BE9 U+5E43 # <cjk>
+0x9BEA U+5E40 # <cjk>
+0x9BEB U+5E4E # <cjk>
+0x9BEC U+5E57 # <cjk>
+0x9BED U+5E54 # <cjk>
+0x9BEE U+5E5F # <cjk>
+0x9BEF U+5E62 # <cjk>
+0x9BF0 U+5E64 # <cjk>
+0x9BF1 U+5E47 # <cjk>
+0x9BF2 U+5E75 # <cjk>
+0x9BF3 U+5E76 # <cjk>
+0x9BF4 U+5E7A # <cjk>
+0x9BF5 U+9EBC # <cjk>
+0x9BF6 U+5E7F # <cjk>
+0x9BF7 U+5EA0 # <cjk>
+0x9BF8 U+5EC1 # <cjk>
+0x9BF9 U+5EC2 # <cjk>
+0x9BFA U+5EC8 # <cjk>
+0x9BFB U+5ED0 # <cjk>
+0x9BFC U+5ECF # <cjk>
+0x9C40 U+5ED6 # <cjk>
+0x9C41 U+5EE3 # <cjk>
+0x9C42 U+5EDD # <cjk>
+0x9C43 U+5EDA # <cjk>
+0x9C44 U+5EDB # <cjk>
+0x9C45 U+5EE2 # <cjk>
+0x9C46 U+5EE1 # <cjk>
+0x9C47 U+5EE8 # <cjk>
+0x9C48 U+5EE9 # <cjk>
+0x9C49 U+5EEC # <cjk>
+0x9C4A U+5EF1 # <cjk>
+0x9C4B U+5EF3 # <cjk>
+0x9C4C U+5EF0 # <cjk>
+0x9C4D U+5EF4 # <cjk>
+0x9C4E U+5EF8 # <cjk>
+0x9C4F U+5EFE # <cjk>
+0x9C50 U+5F03 # <cjk>
+0x9C51 U+5F09 # <cjk>
+0x9C52 U+5F5D # <cjk>
+0x9C53 U+5F5C # <cjk>
+0x9C54 U+5F0B # <cjk>
+0x9C55 U+5F11 # <cjk>
+0x9C56 U+5F16 # <cjk>
+0x9C57 U+5F29 # <cjk>
+0x9C58 U+5F2D # <cjk>
+0x9C59 U+5F38 # <cjk>
+0x9C5A U+5F41 # <cjk>
+0x9C5B U+5F48 # <cjk>
+0x9C5C U+5F4C # <cjk>
+0x9C5D U+5F4E # <cjk>
+0x9C5E U+5F2F # <cjk>
+0x9C5F U+5F51 # <cjk>
+0x9C60 U+5F56 # <cjk>
+0x9C61 U+5F57 # <cjk>
+0x9C62 U+5F59 # <cjk>
+0x9C63 U+5F61 # <cjk>
+0x9C64 U+5F6D # <cjk>
+0x9C65 U+5F73 # <cjk>
+0x9C66 U+5F77 # <cjk>
+0x9C67 U+5F83 # <cjk>
+0x9C68 U+5F82 # <cjk>
+0x9C69 U+5F7F # <cjk>
+0x9C6A U+5F8A # <cjk>
+0x9C6B U+5F88 # <cjk>
+0x9C6C U+5F91 # <cjk>
+0x9C6D U+5F87 # <cjk>
+0x9C6E U+5F9E # <cjk>
+0x9C6F U+5F99 # <cjk>
+0x9C70 U+5F98 # <cjk>
+0x9C71 U+5FA0 # <cjk>
+0x9C72 U+5FA8 # <cjk>
+0x9C73 U+5FAD # <cjk>
+0x9C74 U+5FBC # <cjk>
+0x9C75 U+5FD6 # <cjk>
+0x9C76 U+5FFB # <cjk>
+0x9C77 U+5FE4 # <cjk>
+0x9C78 U+5FF8 # <cjk>
+0x9C79 U+5FF1 # <cjk>
+0x9C7A U+5FDD # <cjk>
+0x9C7B U+60B3 # <cjk>
+0x9C7C U+5FFF # <cjk>
+0x9C7D U+6021 # <cjk>
+0x9C7E U+6060 # <cjk>
+0x9C80 U+6019 # <cjk>
+0x9C81 U+6010 # <cjk>
+0x9C82 U+6029 # <cjk>
+0x9C83 U+600E # <cjk>
+0x9C84 U+6031 # <cjk>
+0x9C85 U+601B # <cjk>
+0x9C86 U+6015 # <cjk>
+0x9C87 U+602B # <cjk>
+0x9C88 U+6026 # <cjk>
+0x9C89 U+600F # <cjk>
+0x9C8A U+603A # <cjk>
+0x9C8B U+605A # <cjk>
+0x9C8C U+6041 # <cjk>
+0x9C8D U+606A # <cjk>
+0x9C8E U+6077 # <cjk>
+0x9C8F U+605F # <cjk>
+0x9C90 U+604A # <cjk>
+0x9C91 U+6046 # <cjk>
+0x9C92 U+604D # <cjk>
+0x9C93 U+6063 # <cjk>
+0x9C94 U+6043 # <cjk>
+0x9C95 U+6064 # <cjk>
+0x9C96 U+6042 # <cjk>
+0x9C97 U+606C # <cjk>
+0x9C98 U+606B # <cjk>
+0x9C99 U+6059 # <cjk>
+0x9C9A U+6081 # <cjk>
+0x9C9B U+608D # <cjk>
+0x9C9C U+60E7 # <cjk>
+0x9C9D U+6083 # <cjk>
+0x9C9E U+609A # <cjk>
+0x9C9F U+6084 # <cjk>
+0x9CA0 U+609B # <cjk>
+0x9CA1 U+6096 # <cjk>
+0x9CA2 U+6097 # <cjk>
+0x9CA3 U+6092 # <cjk>
+0x9CA4 U+60A7 # <cjk>
+0x9CA5 U+608B # <cjk>
+0x9CA6 U+60E1 # <cjk>
+0x9CA7 U+60B8 # <cjk>
+0x9CA8 U+60E0 # <cjk>
+0x9CA9 U+60D3 # <cjk>
+0x9CAA U+60B4 # <cjk>
+0x9CAB U+5FF0 # <cjk>
+0x9CAC U+60BD # <cjk>
+0x9CAD U+60C6 # <cjk>
+0x9CAE U+60B5 # <cjk>
+0x9CAF U+60D8 # <cjk>
+0x9CB0 U+614D # <cjk>
+0x9CB1 U+6115 # <cjk>
+0x9CB2 U+6106 # <cjk>
+0x9CB3 U+60F6 # <cjk>
+0x9CB4 U+60F7 # <cjk>
+0x9CB5 U+6100 # <cjk>
+0x9CB6 U+60F4 # <cjk>
+0x9CB7 U+60FA # <cjk>
+0x9CB8 U+6103 # <cjk>
+0x9CB9 U+6121 # <cjk>
+0x9CBA U+60FB # <cjk>
+0x9CBB U+60F1 # <cjk>
+0x9CBC U+610D # <cjk>
+0x9CBD U+610E # <cjk>
+0x9CBE U+6147 # <cjk>
+0x9CBF U+613E # <cjk>
+0x9CC0 U+6128 # <cjk>
+0x9CC1 U+6127 # <cjk>
+0x9CC2 U+614A # <cjk>
+0x9CC3 U+613F # <cjk>
+0x9CC4 U+613C # <cjk>
+0x9CC5 U+612C # <cjk>
+0x9CC6 U+6134 # <cjk>
+0x9CC7 U+613D # <cjk>
+0x9CC8 U+6142 # <cjk>
+0x9CC9 U+6144 # <cjk>
+0x9CCA U+6173 # <cjk>
+0x9CCB U+6177 # <cjk>
+0x9CCC U+6158 # <cjk>
+0x9CCD U+6159 # <cjk>
+0x9CCE U+615A # <cjk>
+0x9CCF U+616B # <cjk>
+0x9CD0 U+6174 # <cjk>
+0x9CD1 U+616F # <cjk>
+0x9CD2 U+6165 # <cjk>
+0x9CD3 U+6171 # <cjk>
+0x9CD4 U+615F # <cjk>
+0x9CD5 U+615D # <cjk>
+0x9CD6 U+6153 # <cjk>
+0x9CD7 U+6175 # <cjk>
+0x9CD8 U+6199 # <cjk>
+0x9CD9 U+6196 # <cjk>
+0x9CDA U+6187 # <cjk>
+0x9CDB U+61AC # <cjk>
+0x9CDC U+6194 # <cjk>
+0x9CDD U+619A # <cjk>
+0x9CDE U+618A # <cjk>
+0x9CDF U+6191 # <cjk>
+0x9CE0 U+61AB # <cjk>
+0x9CE1 U+61AE # <cjk>
+0x9CE2 U+61CC # <cjk>
+0x9CE3 U+61CA # <cjk>
+0x9CE4 U+61C9 # <cjk>
+0x9CE5 U+61F7 # <cjk>
+0x9CE6 U+61C8 # <cjk>
+0x9CE7 U+61C3 # <cjk>
+0x9CE8 U+61C6 # <cjk>
+0x9CE9 U+61BA # <cjk>
+0x9CEA U+61CB # <cjk>
+0x9CEB U+7F79 # <cjk>
+0x9CEC U+61CD # <cjk>
+0x9CED U+61E6 # <cjk>
+0x9CEE U+61E3 # <cjk>
+0x9CEF U+61F6 # <cjk>
+0x9CF0 U+61FA # <cjk>
+0x9CF1 U+61F4 # <cjk>
+0x9CF2 U+61FF # <cjk>
+0x9CF3 U+61FD # <cjk>
+0x9CF4 U+61FC # <cjk>
+0x9CF5 U+61FE # <cjk>
+0x9CF6 U+6200 # <cjk>
+0x9CF7 U+6208 # <cjk>
+0x9CF8 U+6209 # <cjk>
+0x9CF9 U+620D # <cjk>
+0x9CFA U+620C # <cjk>
+0x9CFB U+6214 # <cjk>
+0x9CFC U+621B # <cjk>
+0x9D40 U+621E # <cjk>
+0x9D41 U+6221 # <cjk>
+0x9D42 U+622A # <cjk>
+0x9D43 U+622E # <cjk>
+0x9D44 U+6230 # <cjk>
+0x9D45 U+6232 # <cjk>
+0x9D46 U+6233 # <cjk>
+0x9D47 U+6241 # <cjk>
+0x9D48 U+624E # <cjk>
+0x9D49 U+625E # <cjk>
+0x9D4A U+6263 # <cjk>
+0x9D4B U+625B # <cjk>
+0x9D4C U+6260 # <cjk>
+0x9D4D U+6268 # <cjk>
+0x9D4E U+627C # <cjk>
+0x9D4F U+6282 # <cjk>
+0x9D50 U+6289 # <cjk>
+0x9D51 U+627E # <cjk>
+0x9D52 U+6292 # <cjk>
+0x9D53 U+6293 # <cjk>
+0x9D54 U+6296 # <cjk>
+0x9D55 U+62D4 # <cjk>
+0x9D56 U+6283 # <cjk>
+0x9D57 U+6294 # <cjk>
+0x9D58 U+62D7 # <cjk>
+0x9D59 U+62D1 # <cjk>
+0x9D5A U+62BB # <cjk>
+0x9D5B U+62CF # <cjk>
+0x9D5C U+62FF # <cjk>
+0x9D5D U+62C6 # <cjk>
+0x9D5E U+64D4 # <cjk>
+0x9D5F U+62C8 # <cjk>
+0x9D60 U+62DC # <cjk>
+0x9D61 U+62CC # <cjk>
+0x9D62 U+62CA # <cjk>
+0x9D63 U+62C2 # <cjk>
+0x9D64 U+62C7 # <cjk>
+0x9D65 U+629B # <cjk>
+0x9D66 U+62C9 # <cjk>
+0x9D67 U+630C # <cjk>
+0x9D68 U+62EE # <cjk>
+0x9D69 U+62F1 # <cjk>
+0x9D6A U+6327 # <cjk>
+0x9D6B U+6302 # <cjk>
+0x9D6C U+6308 # <cjk>
+0x9D6D U+62EF # <cjk>
+0x9D6E U+62F5 # <cjk>
+0x9D6F U+6350 # <cjk>
+0x9D70 U+633E # <cjk>
+0x9D71 U+634D # <cjk>
+0x9D72 U+641C # <cjk>
+0x9D73 U+634F # <cjk>
+0x9D74 U+6396 # <cjk>
+0x9D75 U+638E # <cjk>
+0x9D76 U+6380 # <cjk>
+0x9D77 U+63AB # <cjk>
+0x9D78 U+6376 # <cjk>
+0x9D79 U+63A3 # <cjk>
+0x9D7A U+638F # <cjk>
+0x9D7B U+6389 # <cjk>
+0x9D7C U+639F # <cjk>
+0x9D7D U+63B5 # <cjk>
+0x9D7E U+636B # <cjk>
+0x9D80 U+6369 # <cjk>
+0x9D81 U+63BE # <cjk>
+0x9D82 U+63E9 # <cjk>
+0x9D83 U+63C0 # <cjk>
+0x9D84 U+63C6 # <cjk>
+0x9D85 U+63E3 # <cjk>
+0x9D86 U+63C9 # <cjk>
+0x9D87 U+63D2 # <cjk>
+0x9D88 U+63F6 # <cjk>
+0x9D89 U+63C4 # <cjk>
+0x9D8A U+6416 # <cjk>
+0x9D8B U+6434 # <cjk>
+0x9D8C U+6406 # <cjk>
+0x9D8D U+6413 # <cjk>
+0x9D8E U+6426 # <cjk>
+0x9D8F U+6436 # <cjk>
+0x9D90 U+651D # <cjk>
+0x9D91 U+6417 # <cjk>
+0x9D92 U+6428 # <cjk>
+0x9D93 U+640F # <cjk>
+0x9D94 U+6467 # <cjk>
+0x9D95 U+646F # <cjk>
+0x9D96 U+6476 # <cjk>
+0x9D97 U+644E # <cjk>
+0x9D98 U+652A # <cjk>
+0x9D99 U+6495 # <cjk>
+0x9D9A U+6493 # <cjk>
+0x9D9B U+64A5 # <cjk>
+0x9D9C U+64A9 # <cjk>
+0x9D9D U+6488 # <cjk>
+0x9D9E U+64BC # <cjk>
+0x9D9F U+64DA # <cjk>
+0x9DA0 U+64D2 # <cjk>
+0x9DA1 U+64C5 # <cjk>
+0x9DA2 U+64C7 # <cjk>
+0x9DA3 U+64BB # <cjk>
+0x9DA4 U+64D8 # <cjk>
+0x9DA5 U+64C2 # <cjk>
+0x9DA6 U+64F1 # <cjk>
+0x9DA7 U+64E7 # <cjk>
+0x9DA8 U+8209 # <cjk>
+0x9DA9 U+64E0 # <cjk>
+0x9DAA U+64E1 # <cjk>
+0x9DAB U+62AC # <cjk>
+0x9DAC U+64E3 # <cjk>
+0x9DAD U+64EF # <cjk>
+0x9DAE U+652C # <cjk>
+0x9DAF U+64F6 # <cjk>
+0x9DB0 U+64F4 # <cjk>
+0x9DB1 U+64F2 # <cjk>
+0x9DB2 U+64FA # <cjk>
+0x9DB3 U+6500 # <cjk>
+0x9DB4 U+64FD # <cjk>
+0x9DB5 U+6518 # <cjk>
+0x9DB6 U+651C # <cjk>
+0x9DB7 U+6505 # <cjk>
+0x9DB8 U+6524 # <cjk>
+0x9DB9 U+6523 # <cjk>
+0x9DBA U+652B # <cjk>
+0x9DBB U+6534 # <cjk>
+0x9DBC U+6535 # <cjk>
+0x9DBD U+6537 # <cjk>
+0x9DBE U+6536 # <cjk>
+0x9DBF U+6538 # <cjk>
+0x9DC0 U+754B # <cjk>
+0x9DC1 U+6548 # <cjk>
+0x9DC2 U+6556 # <cjk>
+0x9DC3 U+6555 # <cjk>
+0x9DC4 U+654D # <cjk>
+0x9DC5 U+6558 # <cjk>
+0x9DC6 U+655E # <cjk>
+0x9DC7 U+655D # <cjk>
+0x9DC8 U+6572 # <cjk>
+0x9DC9 U+6578 # <cjk>
+0x9DCA U+6582 # <cjk>
+0x9DCB U+6583 # <cjk>
+0x9DCC U+8B8A # <cjk>
+0x9DCD U+659B # <cjk>
+0x9DCE U+659F # <cjk>
+0x9DCF U+65AB # <cjk>
+0x9DD0 U+65B7 # <cjk>
+0x9DD1 U+65C3 # <cjk>
+0x9DD2 U+65C6 # <cjk>
+0x9DD3 U+65C1 # <cjk>
+0x9DD4 U+65C4 # <cjk>
+0x9DD5 U+65CC # <cjk>
+0x9DD6 U+65D2 # <cjk>
+0x9DD7 U+65DB # <cjk>
+0x9DD8 U+65D9 # <cjk>
+0x9DD9 U+65E0 # <cjk>
+0x9DDA U+65E1 # <cjk>
+0x9DDB U+65F1 # <cjk>
+0x9DDC U+6772 # <cjk>
+0x9DDD U+660A # <cjk>
+0x9DDE U+6603 # <cjk>
+0x9DDF U+65FB # <cjk>
+0x9DE0 U+6773 # <cjk>
+0x9DE1 U+6635 # <cjk>
+0x9DE2 U+6636 # <cjk>
+0x9DE3 U+6634 # <cjk>
+0x9DE4 U+661C # <cjk>
+0x9DE5 U+664F # <cjk>
+0x9DE6 U+6644 # <cjk>
+0x9DE7 U+6649 # <cjk>
+0x9DE8 U+6641 # <cjk>
+0x9DE9 U+665E # <cjk>
+0x9DEA U+665D # <cjk>
+0x9DEB U+6664 # <cjk>
+0x9DEC U+6667 # <cjk>
+0x9DED U+6668 # <cjk>
+0x9DEE U+665F # <cjk>
+0x9DEF U+6662 # <cjk>
+0x9DF0 U+6670 # <cjk>
+0x9DF1 U+6683 # <cjk>
+0x9DF2 U+6688 # <cjk>
+0x9DF3 U+668E # <cjk>
+0x9DF4 U+6689 # <cjk>
+0x9DF5 U+6684 # <cjk>
+0x9DF6 U+6698 # <cjk>
+0x9DF7 U+669D # <cjk>
+0x9DF8 U+66C1 # <cjk>
+0x9DF9 U+66B9 # <cjk>
+0x9DFA U+66C9 # <cjk>
+0x9DFB U+66BE # <cjk>
+0x9DFC U+66BC # <cjk>
+0x9E40 U+66C4 # <cjk>
+0x9E41 U+66B8 # <cjk>
+0x9E42 U+66D6 # <cjk>
+0x9E43 U+66DA # <cjk>
+0x9E44 U+66E0 # <cjk>
+0x9E45 U+663F # <cjk>
+0x9E46 U+66E6 # <cjk>
+0x9E47 U+66E9 # <cjk>
+0x9E48 U+66F0 # <cjk>
+0x9E49 U+66F5 # <cjk>
+0x9E4A U+66F7 # <cjk>
+0x9E4B U+670F # <cjk>
+0x9E4C U+6716 # <cjk>
+0x9E4D U+671E # <cjk>
+0x9E4E U+6726 # <cjk>
+0x9E4F U+6727 # <cjk>
+0x9E50 U+9738 # <cjk>
+0x9E51 U+672E # <cjk>
+0x9E52 U+673F # <cjk>
+0x9E53 U+6736 # <cjk>
+0x9E54 U+6741 # <cjk>
+0x9E55 U+6738 # <cjk>
+0x9E56 U+6737 # <cjk>
+0x9E57 U+6746 # <cjk>
+0x9E58 U+675E # <cjk>
+0x9E59 U+6760 # <cjk>
+0x9E5A U+6759 # <cjk>
+0x9E5B U+6763 # <cjk>
+0x9E5C U+6764 # <cjk>
+0x9E5D U+6789 # <cjk>
+0x9E5E U+6770 # <cjk>
+0x9E5F U+67A9 # <cjk>
+0x9E60 U+677C # <cjk>
+0x9E61 U+676A # <cjk>
+0x9E62 U+678C # <cjk>
+0x9E63 U+678B # <cjk>
+0x9E64 U+67A6 # <cjk>
+0x9E65 U+67A1 # <cjk>
+0x9E66 U+6785 # <cjk>
+0x9E67 U+67B7 # <cjk>
+0x9E68 U+67EF # <cjk>
+0x9E69 U+67B4 # <cjk>
+0x9E6A U+67EC # <cjk>
+0x9E6B U+67B3 # <cjk>
+0x9E6C U+67E9 # <cjk>
+0x9E6D U+67B8 # <cjk>
+0x9E6E U+67E4 # <cjk>
+0x9E6F U+67DE # <cjk>
+0x9E70 U+67DD # <cjk>
+0x9E71 U+67E2 # <cjk>
+0x9E72 U+67EE # <cjk>
+0x9E73 U+67B9 # <cjk>
+0x9E74 U+67CE # <cjk>
+0x9E75 U+67C6 # <cjk>
+0x9E76 U+67E7 # <cjk>
+0x9E77 U+6A9C # <cjk>
+0x9E78 U+681E # <cjk>
+0x9E79 U+6846 # <cjk>
+0x9E7A U+6829 # <cjk>
+0x9E7B U+6840 # <cjk>
+0x9E7C U+684D # <cjk>
+0x9E7D U+6832 # <cjk>
+0x9E7E U+684E # <cjk>
+0x9E80 U+68B3 # <cjk>
+0x9E81 U+682B # <cjk>
+0x9E82 U+6859 # <cjk>
+0x9E83 U+6863 # <cjk>
+0x9E84 U+6877 # <cjk>
+0x9E85 U+687F # <cjk>
+0x9E86 U+689F # <cjk>
+0x9E87 U+688F # <cjk>
+0x9E88 U+68AD # <cjk>
+0x9E89 U+6894 # <cjk>
+0x9E8A U+689D # <cjk>
+0x9E8B U+689B # <cjk>
+0x9E8C U+6883 # <cjk>
+0x9E8D U+6AAE # <cjk>
+0x9E8E U+68B9 # <cjk>
+0x9E8F U+6874 # <cjk>
+0x9E90 U+68B5 # <cjk>
+0x9E91 U+68A0 # <cjk>
+0x9E92 U+68BA # <cjk>
+0x9E93 U+690F # <cjk>
+0x9E94 U+688D # <cjk>
+0x9E95 U+687E # <cjk>
+0x9E96 U+6901 # <cjk>
+0x9E97 U+68CA # <cjk>
+0x9E98 U+6908 # <cjk>
+0x9E99 U+68D8 # <cjk>
+0x9E9A U+6922 # <cjk>
+0x9E9B U+6926 # <cjk>
+0x9E9C U+68E1 # <cjk>
+0x9E9D U+690C # <cjk>
+0x9E9E U+68CD # <cjk>
+0x9E9F U+68D4 # <cjk>
+0x9EA0 U+68E7 # <cjk>
+0x9EA1 U+68D5 # <cjk>
+0x9EA2 U+6936 # <cjk>
+0x9EA3 U+6912 # <cjk>
+0x9EA4 U+6904 # <cjk>
+0x9EA5 U+68D7 # <cjk>
+0x9EA6 U+68E3 # <cjk>
+0x9EA7 U+6925 # <cjk>
+0x9EA8 U+68F9 # <cjk>
+0x9EA9 U+68E0 # <cjk>
+0x9EAA U+68EF # <cjk>
+0x9EAB U+6928 # <cjk>
+0x9EAC U+692A # <cjk>
+0x9EAD U+691A # <cjk>
+0x9EAE U+6923 # <cjk>
+0x9EAF U+6921 # <cjk>
+0x9EB0 U+68C6 # <cjk>
+0x9EB1 U+6979 # <cjk>
+0x9EB2 U+6977 # <cjk>
+0x9EB3 U+695C # <cjk>
+0x9EB4 U+6978 # <cjk>
+0x9EB5 U+696B # <cjk>
+0x9EB6 U+6954 # <cjk>
+0x9EB7 U+697E # <cjk>
+0x9EB8 U+696E # <cjk>
+0x9EB9 U+6939 # <cjk>
+0x9EBA U+6974 # <cjk>
+0x9EBB U+693D # <cjk>
+0x9EBC U+6959 # <cjk>
+0x9EBD U+6930 # <cjk>
+0x9EBE U+6961 # <cjk>
+0x9EBF U+695E # <cjk>
+0x9EC0 U+695D # <cjk>
+0x9EC1 U+6981 # <cjk>
+0x9EC2 U+696A # <cjk>
+0x9EC3 U+69B2 # <cjk>
+0x9EC4 U+69AE # <cjk>
+0x9EC5 U+69D0 # <cjk>
+0x9EC6 U+69BF # <cjk>
+0x9EC7 U+69C1 # <cjk>
+0x9EC8 U+69D3 # <cjk>
+0x9EC9 U+69BE # <cjk>
+0x9ECA U+69CE # <cjk>
+0x9ECB U+5BE8 # <cjk>
+0x9ECC U+69CA # <cjk>
+0x9ECD U+69DD # <cjk>
+0x9ECE U+69BB # <cjk>
+0x9ECF U+69C3 # <cjk>
+0x9ED0 U+69A7 # <cjk>
+0x9ED1 U+6A2E # <cjk>
+0x9ED2 U+6991 # <cjk>
+0x9ED3 U+69A0 # <cjk>
+0x9ED4 U+699C # <cjk>
+0x9ED5 U+6995 # <cjk>
+0x9ED6 U+69B4 # <cjk>
+0x9ED7 U+69DE # <cjk>
+0x9ED8 U+69E8 # <cjk>
+0x9ED9 U+6A02 # <cjk>
+0x9EDA U+6A1B # <cjk>
+0x9EDB U+69FF # <cjk>
+0x9EDC U+6B0A # <cjk>
+0x9EDD U+69F9 # <cjk>
+0x9EDE U+69F2 # <cjk>
+0x9EDF U+69E7 # <cjk>
+0x9EE0 U+6A05 # <cjk>
+0x9EE1 U+69B1 # <cjk>
+0x9EE2 U+6A1E # <cjk>
+0x9EE3 U+69ED # <cjk>
+0x9EE4 U+6A14 # <cjk>
+0x9EE5 U+69EB # <cjk>
+0x9EE6 U+6A0A # <cjk>
+0x9EE7 U+6A12 # <cjk>
+0x9EE8 U+6AC1 # <cjk>
+0x9EE9 U+6A23 # <cjk>
+0x9EEA U+6A13 # <cjk>
+0x9EEB U+6A44 # <cjk>
+0x9EEC U+6A0C # <cjk>
+0x9EED U+6A72 # <cjk>
+0x9EEE U+6A36 # <cjk>
+0x9EEF U+6A78 # <cjk>
+0x9EF0 U+6A47 # <cjk>
+0x9EF1 U+6A62 # <cjk>
+0x9EF2 U+6A59 # <cjk>
+0x9EF3 U+6A66 # <cjk>
+0x9EF4 U+6A48 # <cjk>
+0x9EF5 U+6A38 # <cjk>
+0x9EF6 U+6A22 # <cjk>
+0x9EF7 U+6A90 # <cjk>
+0x9EF8 U+6A8D # <cjk>
+0x9EF9 U+6AA0 # <cjk>
+0x9EFA U+6A84 # <cjk>
+0x9EFB U+6AA2 # <cjk>
+0x9EFC U+6AA3 # <cjk>
+0x9F40 U+6A97 # <cjk>
+0x9F41 U+8617 # <cjk>
+0x9F42 U+6ABB # <cjk>
+0x9F43 U+6AC3 # <cjk>
+0x9F44 U+6AC2 # <cjk>
+0x9F45 U+6AB8 # <cjk>
+0x9F46 U+6AB3 # <cjk>
+0x9F47 U+6AAC # <cjk>
+0x9F48 U+6ADE # <cjk>
+0x9F49 U+6AD1 # <cjk>
+0x9F4A U+6ADF # <cjk>
+0x9F4B U+6AAA # <cjk>
+0x9F4C U+6ADA # <cjk>
+0x9F4D U+6AEA # <cjk>
+0x9F4E U+6AFB # <cjk>
+0x9F4F U+6B05 # <cjk>
+0x9F50 U+8616 # <cjk>
+0x9F51 U+6AFA # <cjk>
+0x9F52 U+6B12 # <cjk>
+0x9F53 U+6B16 # <cjk>
+0x9F54 U+9B31 # <cjk>
+0x9F55 U+6B1F # <cjk>
+0x9F56 U+6B38 # <cjk>
+0x9F57 U+6B37 # <cjk>
+0x9F58 U+76DC # <cjk>
+0x9F59 U+6B39 # <cjk>
+0x9F5A U+98EE # <cjk>
+0x9F5B U+6B47 # <cjk>
+0x9F5C U+6B43 # <cjk>
+0x9F5D U+6B49 # <cjk>
+0x9F5E U+6B50 # <cjk>
+0x9F5F U+6B59 # <cjk>
+0x9F60 U+6B54 # <cjk>
+0x9F61 U+6B5B # <cjk>
+0x9F62 U+6B5F # <cjk>
+0x9F63 U+6B61 # <cjk>
+0x9F64 U+6B78 # <cjk>
+0x9F65 U+6B79 # <cjk>
+0x9F66 U+6B7F # <cjk>
+0x9F67 U+6B80 # <cjk>
+0x9F68 U+6B84 # <cjk>
+0x9F69 U+6B83 # <cjk>
+0x9F6A U+6B8D # <cjk>
+0x9F6B U+6B98 # <cjk>
+0x9F6C U+6B95 # <cjk>
+0x9F6D U+6B9E # <cjk>
+0x9F6E U+6BA4 # <cjk>
+0x9F6F U+6BAA # <cjk>
+0x9F70 U+6BAB # <cjk>
+0x9F71 U+6BAF # <cjk>
+0x9F72 U+6BB2 # <cjk>
+0x9F73 U+6BB1 # <cjk>
+0x9F74 U+6BB3 # <cjk>
+0x9F75 U+6BB7 # <cjk>
+0x9F76 U+6BBC # <cjk>
+0x9F77 U+6BC6 # <cjk>
+0x9F78 U+6BCB # <cjk>
+0x9F79 U+6BD3 # <cjk>
+0x9F7A U+6BDF # <cjk>
+0x9F7B U+6BEC # <cjk>
+0x9F7C U+6BEB # <cjk>
+0x9F7D U+6BF3 # <cjk>
+0x9F7E U+6BEF # <cjk>
+0x9F80 U+9EBE # <cjk>
+0x9F81 U+6C08 # <cjk>
+0x9F82 U+6C13 # <cjk>
+0x9F83 U+6C14 # <cjk>
+0x9F84 U+6C1B # <cjk>
+0x9F85 U+6C24 # <cjk>
+0x9F86 U+6C23 # <cjk>
+0x9F87 U+6C5E # <cjk>
+0x9F88 U+6C55 # <cjk>
+0x9F89 U+6C62 # <cjk>
+0x9F8A U+6C6A # <cjk>
+0x9F8B U+6C82 # <cjk>
+0x9F8C U+6C8D # <cjk>
+0x9F8D U+6C9A # <cjk>
+0x9F8E U+6C81 # <cjk>
+0x9F8F U+6C9B # <cjk>
+0x9F90 U+6C7E # <cjk>
+0x9F91 U+6C68 # <cjk>
+0x9F92 U+6C73 # <cjk>
+0x9F93 U+6C92 # <cjk>
+0x9F94 U+6C90 # <cjk>
+0x9F95 U+6CC4 # <cjk>
+0x9F96 U+6CF1 # <cjk>
+0x9F97 U+6CD3 # <cjk>
+0x9F98 U+6CBD # <cjk>
+0x9F99 U+6CD7 # <cjk>
+0x9F9A U+6CC5 # <cjk>
+0x9F9B U+6CDD # <cjk>
+0x9F9C U+6CAE # <cjk>
+0x9F9D U+6CB1 # <cjk>
+0x9F9E U+6CBE # <cjk>
+0x9F9F U+6CBA # <cjk>
+0x9FA0 U+6CDB # <cjk>
+0x9FA1 U+6CEF # <cjk>
+0x9FA2 U+6CD9 # <cjk>
+0x9FA3 U+6CEA # <cjk>
+0x9FA4 U+6D1F # <cjk>
+0x9FA5 U+884D # <cjk>
+0x9FA6 U+6D36 # <cjk>
+0x9FA7 U+6D2B # <cjk>
+0x9FA8 U+6D3D # <cjk>
+0x9FA9 U+6D38 # <cjk>
+0x9FAA U+6D19 # <cjk>
+0x9FAB U+6D35 # <cjk>
+0x9FAC U+6D33 # <cjk>
+0x9FAD U+6D12 # <cjk>
+0x9FAE U+6D0C # <cjk>
+0x9FAF U+6D63 # <cjk>
+0x9FB0 U+6D93 # <cjk>
+0x9FB1 U+6D64 # <cjk>
+0x9FB2 U+6D5A # <cjk>
+0x9FB3 U+6D79 # <cjk>
+0x9FB4 U+6D59 # <cjk>
+0x9FB5 U+6D8E # <cjk>
+0x9FB6 U+6D95 # <cjk>
+0x9FB7 U+6FE4 # <cjk>
+0x9FB8 U+6D85 # <cjk>
+0x9FB9 U+6DF9 # <cjk>
+0x9FBA U+6E15 # <cjk>
+0x9FBB U+6E0A # <cjk>
+0x9FBC U+6DB5 # <cjk>
+0x9FBD U+6DC7 # <cjk>
+0x9FBE U+6DE6 # <cjk>
+0x9FBF U+6DB8 # <cjk>
+0x9FC0 U+6DC6 # <cjk>
+0x9FC1 U+6DEC # <cjk>
+0x9FC2 U+6DDE # <cjk>
+0x9FC3 U+6DCC # <cjk>
+0x9FC4 U+6DE8 # <cjk>
+0x9FC5 U+6DD2 # <cjk>
+0x9FC6 U+6DC5 # <cjk>
+0x9FC7 U+6DFA # <cjk>
+0x9FC8 U+6DD9 # <cjk>
+0x9FC9 U+6DE4 # <cjk>
+0x9FCA U+6DD5 # <cjk>
+0x9FCB U+6DEA # <cjk>
+0x9FCC U+6DEE # <cjk>
+0x9FCD U+6E2D # <cjk>
+0x9FCE U+6E6E # <cjk>
+0x9FCF U+6E2E # <cjk>
+0x9FD0 U+6E19 # <cjk>
+0x9FD1 U+6E72 # <cjk>
+0x9FD2 U+6E5F # <cjk>
+0x9FD3 U+6E3E # <cjk>
+0x9FD4 U+6E23 # <cjk>
+0x9FD5 U+6E6B # <cjk>
+0x9FD6 U+6E2B # <cjk>
+0x9FD7 U+6E76 # <cjk>
+0x9FD8 U+6E4D # <cjk>
+0x9FD9 U+6E1F # <cjk>
+0x9FDA U+6E43 # <cjk>
+0x9FDB U+6E3A # <cjk>
+0x9FDC U+6E4E # <cjk>
+0x9FDD U+6E24 # <cjk>
+0x9FDE U+6EFF # <cjk>
+0x9FDF U+6E1D # <cjk>
+0x9FE0 U+6E38 # <cjk>
+0x9FE1 U+6E82 # <cjk>
+0x9FE2 U+6EAA # <cjk>
+0x9FE3 U+6E98 # <cjk>
+0x9FE4 U+6EC9 # <cjk>
+0x9FE5 U+6EB7 # <cjk>
+0x9FE6 U+6ED3 # <cjk>
+0x9FE7 U+6EBD # <cjk>
+0x9FE8 U+6EAF # <cjk>
+0x9FE9 U+6EC4 # <cjk>
+0x9FEA U+6EB2 # <cjk>
+0x9FEB U+6ED4 # <cjk>
+0x9FEC U+6ED5 # <cjk>
+0x9FED U+6E8F # <cjk>
+0x9FEE U+6EA5 # <cjk>
+0x9FEF U+6EC2 # <cjk>
+0x9FF0 U+6E9F # <cjk>
+0x9FF1 U+6F41 # <cjk>
+0x9FF2 U+6F11 # <cjk>
+0x9FF3 U+704C # <cjk>
+0x9FF4 U+6EEC # <cjk>
+0x9FF5 U+6EF8 # <cjk>
+0x9FF6 U+6EFE # <cjk>
+0x9FF7 U+6F3F # <cjk>
+0x9FF8 U+6EF2 # <cjk>
+0x9FF9 U+6F31 # <cjk>
+0x9FFA U+6EEF # <cjk>
+0x9FFB U+6F32 # <cjk>
+0x9FFC U+6ECC # <cjk>
+0xE040 U+6F3E # <cjk>
+0xE041 U+6F13 # <cjk>
+0xE042 U+6EF7 # <cjk>
+0xE043 U+6F86 # <cjk>
+0xE044 U+6F7A # <cjk>
+0xE045 U+6F78 # <cjk>
+0xE046 U+6F81 # <cjk>
+0xE047 U+6F80 # <cjk>
+0xE048 U+6F6F # <cjk>
+0xE049 U+6F5B # <cjk>
+0xE04A U+6FF3 # <cjk>
+0xE04B U+6F6D # <cjk>
+0xE04C U+6F82 # <cjk>
+0xE04D U+6F7C # <cjk>
+0xE04E U+6F58 # <cjk>
+0xE04F U+6F8E # <cjk>
+0xE050 U+6F91 # <cjk>
+0xE051 U+6FC2 # <cjk>
+0xE052 U+6F66 # <cjk>
+0xE053 U+6FB3 # <cjk>
+0xE054 U+6FA3 # <cjk>
+0xE055 U+6FA1 # <cjk>
+0xE056 U+6FA4 # <cjk>
+0xE057 U+6FB9 # <cjk>
+0xE058 U+6FC6 # <cjk>
+0xE059 U+6FAA # <cjk>
+0xE05A U+6FDF # <cjk>
+0xE05B U+6FD5 # <cjk>
+0xE05C U+6FEC # <cjk>
+0xE05D U+6FD4 # <cjk>
+0xE05E U+6FD8 # <cjk>
+0xE05F U+6FF1 # <cjk>
+0xE060 U+6FEE # <cjk>
+0xE061 U+6FDB # <cjk>
+0xE062 U+7009 # <cjk>
+0xE063 U+700B # <cjk>
+0xE064 U+6FFA # <cjk>
+0xE065 U+7011 # <cjk>
+0xE066 U+7001 # <cjk>
+0xE067 U+700F # <cjk>
+0xE068 U+6FFE # <cjk>
+0xE069 U+701B # <cjk>
+0xE06A U+701A # <cjk>
+0xE06B U+6F74 # <cjk>
+0xE06C U+701D # <cjk>
+0xE06D U+7018 # <cjk>
+0xE06E U+701F # <cjk>
+0xE06F U+7030 # <cjk>
+0xE070 U+703E # <cjk>
+0xE071 U+7032 # <cjk>
+0xE072 U+7051 # <cjk>
+0xE073 U+7063 # <cjk>
+0xE074 U+7099 # <cjk>
+0xE075 U+7092 # <cjk>
+0xE076 U+70AF # <cjk>
+0xE077 U+70F1 # <cjk>
+0xE078 U+70AC # <cjk>
+0xE079 U+70B8 # <cjk>
+0xE07A U+70B3 # <cjk>
+0xE07B U+70AE # <cjk>
+0xE07C U+70DF # <cjk>
+0xE07D U+70CB # <cjk>
+0xE07E U+70DD # <cjk>
+0xE080 U+70D9 # <cjk>
+0xE081 U+7109 # <cjk>
+0xE082 U+70FD # <cjk>
+0xE083 U+711C # <cjk>
+0xE084 U+7119 # <cjk>
+0xE085 U+7165 # <cjk>
+0xE086 U+7155 # <cjk>
+0xE087 U+7188 # <cjk>
+0xE088 U+7166 # <cjk>
+0xE089 U+7162 # <cjk>
+0xE08A U+714C # <cjk>
+0xE08B U+7156 # <cjk>
+0xE08C U+716C # <cjk>
+0xE08D U+718F # <cjk>
+0xE08E U+71FB # <cjk>
+0xE08F U+7184 # <cjk>
+0xE090 U+7195 # <cjk>
+0xE091 U+71A8 # <cjk>
+0xE092 U+71AC # <cjk>
+0xE093 U+71D7 # <cjk>
+0xE094 U+71B9 # <cjk>
+0xE095 U+71BE # <cjk>
+0xE096 U+71D2 # <cjk>
+0xE097 U+71C9 # <cjk>
+0xE098 U+71D4 # <cjk>
+0xE099 U+71CE # <cjk>
+0xE09A U+71E0 # <cjk>
+0xE09B U+71EC # <cjk>
+0xE09C U+71E7 # <cjk>
+0xE09D U+71F5 # <cjk>
+0xE09E U+71FC # <cjk>
+0xE09F U+71F9 # <cjk>
+0xE0A0 U+71FF # <cjk>
+0xE0A1 U+720D # <cjk>
+0xE0A2 U+7210 # <cjk>
+0xE0A3 U+721B # <cjk>
+0xE0A4 U+7228 # <cjk>
+0xE0A5 U+722D # <cjk>
+0xE0A6 U+722C # <cjk>
+0xE0A7 U+7230 # <cjk>
+0xE0A8 U+7232 # <cjk>
+0xE0A9 U+723B # <cjk>
+0xE0AA U+723C # <cjk>
+0xE0AB U+723F # <cjk>
+0xE0AC U+7240 # <cjk>
+0xE0AD U+7246 # <cjk>
+0xE0AE U+724B # <cjk>
+0xE0AF U+7258 # <cjk>
+0xE0B0 U+7274 # <cjk>
+0xE0B1 U+727E # <cjk>
+0xE0B2 U+7282 # <cjk>
+0xE0B3 U+7281 # <cjk>
+0xE0B4 U+7287 # <cjk>
+0xE0B5 U+7292 # <cjk>
+0xE0B6 U+7296 # <cjk>
+0xE0B7 U+72A2 # <cjk>
+0xE0B8 U+72A7 # <cjk>
+0xE0B9 U+72B9 # <cjk>
+0xE0BA U+72B2 # <cjk>
+0xE0BB U+72C3 # <cjk>
+0xE0BC U+72C6 # <cjk>
+0xE0BD U+72C4 # <cjk>
+0xE0BE U+72CE # <cjk>
+0xE0BF U+72D2 # <cjk>
+0xE0C0 U+72E2 # <cjk>
+0xE0C1 U+72E0 # <cjk>
+0xE0C2 U+72E1 # <cjk>
+0xE0C3 U+72F9 # <cjk>
+0xE0C4 U+72F7 # <cjk>
+0xE0C5 U+500F # <cjk>
+0xE0C6 U+7317 # <cjk>
+0xE0C7 U+730A # <cjk>
+0xE0C8 U+731C # <cjk>
+0xE0C9 U+7316 # <cjk>
+0xE0CA U+731D # <cjk>
+0xE0CB U+7334 # <cjk>
+0xE0CC U+732F # <cjk>
+0xE0CD U+7329 # <cjk>
+0xE0CE U+7325 # <cjk>
+0xE0CF U+733E # <cjk>
+0xE0D0 U+734E # <cjk>
+0xE0D1 U+734F # <cjk>
+0xE0D2 U+9ED8 # <cjk>
+0xE0D3 U+7357 # <cjk>
+0xE0D4 U+736A # <cjk>
+0xE0D5 U+7368 # <cjk>
+0xE0D6 U+7370 # <cjk>
+0xE0D7 U+7378 # <cjk>
+0xE0D8 U+7375 # <cjk>
+0xE0D9 U+737B # <cjk>
+0xE0DA U+737A # <cjk>
+0xE0DB U+73C8 # <cjk>
+0xE0DC U+73B3 # <cjk>
+0xE0DD U+73CE # <cjk>
+0xE0DE U+73BB # <cjk>
+0xE0DF U+73C0 # <cjk>
+0xE0E0 U+73E5 # <cjk>
+0xE0E1 U+73EE # <cjk>
+0xE0E2 U+73DE # <cjk>
+0xE0E3 U+74A2 # <cjk>
+0xE0E4 U+7405 # <cjk>
+0xE0E5 U+746F # <cjk>
+0xE0E6 U+7425 # <cjk>
+0xE0E7 U+73F8 # <cjk>
+0xE0E8 U+7432 # <cjk>
+0xE0E9 U+743A # <cjk>
+0xE0EA U+7455 # <cjk>
+0xE0EB U+743F # <cjk>
+0xE0EC U+745F # <cjk>
+0xE0ED U+7459 # <cjk>
+0xE0EE U+7441 # <cjk>
+0xE0EF U+745C # <cjk>
+0xE0F0 U+7469 # <cjk>
+0xE0F1 U+7470 # <cjk>
+0xE0F2 U+7463 # <cjk>
+0xE0F3 U+746A # <cjk>
+0xE0F4 U+7476 # <cjk>
+0xE0F5 U+747E # <cjk>
+0xE0F6 U+748B # <cjk>
+0xE0F7 U+749E # <cjk>
+0xE0F8 U+74A7 # <cjk>
+0xE0F9 U+74CA # <cjk>
+0xE0FA U+74CF # <cjk>
+0xE0FB U+74D4 # <cjk>
+0xE0FC U+73F1 # <cjk>
+0xE140 U+74E0 # <cjk>
+0xE141 U+74E3 # <cjk>
+0xE142 U+74E7 # <cjk>
+0xE143 U+74E9 # <cjk>
+0xE144 U+74EE # <cjk>
+0xE145 U+74F2 # <cjk>
+0xE146 U+74F0 # <cjk>
+0xE147 U+74F1 # <cjk>
+0xE148 U+74F8 # <cjk>
+0xE149 U+74F7 # <cjk>
+0xE14A U+7504 # <cjk>
+0xE14B U+7503 # <cjk>
+0xE14C U+7505 # <cjk>
+0xE14D U+750C # <cjk>
+0xE14E U+750E # <cjk>
+0xE14F U+750D # <cjk>
+0xE150 U+7515 # <cjk>
+0xE151 U+7513 # <cjk>
+0xE152 U+751E # <cjk>
+0xE153 U+7526 # <cjk>
+0xE154 U+752C # <cjk>
+0xE155 U+753C # <cjk>
+0xE156 U+7544 # <cjk>
+0xE157 U+754D # <cjk>
+0xE158 U+754A # <cjk>
+0xE159 U+7549 # <cjk>
+0xE15A U+755B # <cjk>
+0xE15B U+7546 # <cjk>
+0xE15C U+755A # <cjk>
+0xE15D U+7569 # <cjk>
+0xE15E U+7564 # <cjk>
+0xE15F U+7567 # <cjk>
+0xE160 U+756B # <cjk>
+0xE161 U+756D # <cjk>
+0xE162 U+7578 # <cjk>
+0xE163 U+7576 # <cjk>
+0xE164 U+7586 # <cjk>
+0xE165 U+7587 # <cjk>
+0xE166 U+7574 # <cjk>
+0xE167 U+758A # <cjk>
+0xE168 U+7589 # <cjk>
+0xE169 U+7582 # <cjk>
+0xE16A U+7594 # <cjk>
+0xE16B U+759A # <cjk>
+0xE16C U+759D # <cjk>
+0xE16D U+75A5 # <cjk>
+0xE16E U+75A3 # <cjk>
+0xE16F U+75C2 # <cjk>
+0xE170 U+75B3 # <cjk>
+0xE171 U+75C3 # <cjk>
+0xE172 U+75B5 # <cjk>
+0xE173 U+75BD # <cjk>
+0xE174 U+75B8 # <cjk>
+0xE175 U+75BC # <cjk>
+0xE176 U+75B1 # <cjk>
+0xE177 U+75CD # <cjk>
+0xE178 U+75CA # <cjk>
+0xE179 U+75D2 # <cjk>
+0xE17A U+75D9 # <cjk>
+0xE17B U+75E3 # <cjk>
+0xE17C U+75DE # <cjk>
+0xE17D U+75FE # <cjk>
+0xE17E U+75FF # <cjk>
+0xE180 U+75FC # <cjk>
+0xE181 U+7601 # <cjk>
+0xE182 U+75F0 # <cjk>
+0xE183 U+75FA # <cjk>
+0xE184 U+75F2 # <cjk>
+0xE185 U+75F3 # <cjk>
+0xE186 U+760B # <cjk>
+0xE187 U+760D # <cjk>
+0xE188 U+7609 # <cjk>
+0xE189 U+761F # <cjk>
+0xE18A U+7627 # <cjk>
+0xE18B U+7620 # <cjk>
+0xE18C U+7621 # <cjk>
+0xE18D U+7622 # <cjk>
+0xE18E U+7624 # <cjk>
+0xE18F U+7634 # <cjk>
+0xE190 U+7630 # <cjk>
+0xE191 U+763B # <cjk>
+0xE192 U+7647 # <cjk>
+0xE193 U+7648 # <cjk>
+0xE194 U+7646 # <cjk>
+0xE195 U+765C # <cjk>
+0xE196 U+7658 # <cjk>
+0xE197 U+7661 # <cjk>
+0xE198 U+7662 # <cjk>
+0xE199 U+7668 # <cjk>
+0xE19A U+7669 # <cjk>
+0xE19B U+766A # <cjk>
+0xE19C U+7667 # <cjk>
+0xE19D U+766C # <cjk>
+0xE19E U+7670 # <cjk>
+0xE19F U+7672 # <cjk>
+0xE1A0 U+7676 # <cjk>
+0xE1A1 U+7678 # <cjk>
+0xE1A2 U+767C # <cjk>
+0xE1A3 U+7680 # <cjk>
+0xE1A4 U+7683 # <cjk>
+0xE1A5 U+7688 # <cjk>
+0xE1A6 U+768B # <cjk>
+0xE1A7 U+768E # <cjk>
+0xE1A8 U+7696 # <cjk>
+0xE1A9 U+7693 # <cjk>
+0xE1AA U+7699 # <cjk>
+0xE1AB U+769A # <cjk>
+0xE1AC U+76B0 # <cjk>
+0xE1AD U+76B4 # <cjk>
+0xE1AE U+76B8 # <cjk>
+0xE1AF U+76B9 # <cjk>
+0xE1B0 U+76BA # <cjk>
+0xE1B1 U+76C2 # <cjk>
+0xE1B2 U+76CD # <cjk>
+0xE1B3 U+76D6 # <cjk>
+0xE1B4 U+76D2 # <cjk>
+0xE1B5 U+76DE # <cjk>
+0xE1B6 U+76E1 # <cjk>
+0xE1B7 U+76E5 # <cjk>
+0xE1B8 U+76E7 # <cjk>
+0xE1B9 U+76EA # <cjk>
+0xE1BA U+862F # <cjk>
+0xE1BB U+76FB # <cjk>
+0xE1BC U+7708 # <cjk>
+0xE1BD U+7707 # <cjk>
+0xE1BE U+7704 # <cjk>
+0xE1BF U+7729 # <cjk>
+0xE1C0 U+7724 # <cjk>
+0xE1C1 U+771E # <cjk>
+0xE1C2 U+7725 # <cjk>
+0xE1C3 U+7726 # <cjk>
+0xE1C4 U+771B # <cjk>
+0xE1C5 U+7737 # <cjk>
+0xE1C6 U+7738 # <cjk>
+0xE1C7 U+7747 # <cjk>
+0xE1C8 U+775A # <cjk>
+0xE1C9 U+7768 # <cjk>
+0xE1CA U+776B # <cjk>
+0xE1CB U+775B # <cjk>
+0xE1CC U+7765 # <cjk>
+0xE1CD U+777F # <cjk>
+0xE1CE U+777E # <cjk>
+0xE1CF U+7779 # <cjk>
+0xE1D0 U+778E # <cjk>
+0xE1D1 U+778B # <cjk>
+0xE1D2 U+7791 # <cjk>
+0xE1D3 U+77A0 # <cjk>
+0xE1D4 U+779E # <cjk>
+0xE1D5 U+77B0 # <cjk>
+0xE1D6 U+77B6 # <cjk>
+0xE1D7 U+77B9 # <cjk>
+0xE1D8 U+77BF # <cjk>
+0xE1D9 U+77BC # <cjk>
+0xE1DA U+77BD # <cjk>
+0xE1DB U+77BB # <cjk>
+0xE1DC U+77C7 # <cjk>
+0xE1DD U+77CD # <cjk>
+0xE1DE U+77D7 # <cjk>
+0xE1DF U+77DA # <cjk>
+0xE1E0 U+77DC # <cjk>
+0xE1E1 U+77E3 # <cjk>
+0xE1E2 U+77EE # <cjk>
+0xE1E3 U+77FC # <cjk>
+0xE1E4 U+780C # <cjk>
+0xE1E5 U+7812 # <cjk>
+0xE1E6 U+7926 # <cjk>
+0xE1E7 U+7820 # <cjk>
+0xE1E8 U+792A # <cjk>
+0xE1E9 U+7845 # <cjk>
+0xE1EA U+788E # <cjk>
+0xE1EB U+7874 # <cjk>
+0xE1EC U+7886 # <cjk>
+0xE1ED U+787C # <cjk>
+0xE1EE U+789A # <cjk>
+0xE1EF U+788C # <cjk>
+0xE1F0 U+78A3 # <cjk>
+0xE1F1 U+78B5 # <cjk>
+0xE1F2 U+78AA # <cjk>
+0xE1F3 U+78AF # <cjk>
+0xE1F4 U+78D1 # <cjk>
+0xE1F5 U+78C6 # <cjk>
+0xE1F6 U+78CB # <cjk>
+0xE1F7 U+78D4 # <cjk>
+0xE1F8 U+78BE # <cjk>
+0xE1F9 U+78BC # <cjk>
+0xE1FA U+78C5 # <cjk>
+0xE1FB U+78CA # <cjk>
+0xE1FC U+78EC # <cjk>
+0xE240 U+78E7 # <cjk>
+0xE241 U+78DA # <cjk>
+0xE242 U+78FD # <cjk>
+0xE243 U+78F4 # <cjk>
+0xE244 U+7907 # <cjk>
+0xE245 U+7912 # <cjk>
+0xE246 U+7911 # <cjk>
+0xE247 U+7919 # <cjk>
+0xE248 U+792C # <cjk>
+0xE249 U+792B # <cjk>
+0xE24A U+7940 # <cjk>
+0xE24B U+7960 # <cjk>
+0xE24C U+7957 # <cjk>
+0xE24D U+795F # <cjk>
+0xE24E U+795A # <cjk>
+0xE24F U+7955 # <cjk>
+0xE250 U+7953 # <cjk>
+0xE251 U+797A # <cjk>
+0xE252 U+797F # <cjk>
+0xE253 U+798A # <cjk>
+0xE254 U+799D # <cjk>
+0xE255 U+79A7 # <cjk>
+0xE256 U+9F4B # <cjk>
+0xE257 U+79AA # <cjk>
+0xE258 U+79AE # <cjk>
+0xE259 U+79B3 # <cjk>
+0xE25A U+79B9 # <cjk>
+0xE25B U+79BA # <cjk>
+0xE25C U+79C9 # <cjk>
+0xE25D U+79D5 # <cjk>
+0xE25E U+79E7 # <cjk>
+0xE25F U+79EC # <cjk>
+0xE260 U+79E1 # <cjk>
+0xE261 U+79E3 # <cjk>
+0xE262 U+7A08 # <cjk>
+0xE263 U+7A0D # <cjk>
+0xE264 U+7A18 # <cjk>
+0xE265 U+7A19 # <cjk>
+0xE266 U+7A20 # <cjk>
+0xE267 U+7A1F # <cjk>
+0xE268 U+7980 # <cjk>
+0xE269 U+7A31 # <cjk>
+0xE26A U+7A3B # <cjk>
+0xE26B U+7A3E # <cjk>
+0xE26C U+7A37 # <cjk>
+0xE26D U+7A43 # <cjk>
+0xE26E U+7A57 # <cjk>
+0xE26F U+7A49 # <cjk>
+0xE270 U+7A61 # <cjk>
+0xE271 U+7A62 # <cjk>
+0xE272 U+7A69 # <cjk>
+0xE273 U+9F9D # <cjk>
+0xE274 U+7A70 # <cjk>
+0xE275 U+7A79 # <cjk>
+0xE276 U+7A7D # <cjk>
+0xE277 U+7A88 # <cjk>
+0xE278 U+7A97 # <cjk>
+0xE279 U+7A95 # <cjk>
+0xE27A U+7A98 # <cjk>
+0xE27B U+7A96 # <cjk>
+0xE27C U+7AA9 # <cjk>
+0xE27D U+7AC8 # <cjk>
+0xE27E U+7AB0 # <cjk>
+0xE280 U+7AB6 # <cjk>
+0xE281 U+7AC5 # <cjk>
+0xE282 U+7AC4 # <cjk>
+0xE283 U+7ABF # <cjk>
+0xE284 U+9083 # <cjk>
+0xE285 U+7AC7 # <cjk>
+0xE286 U+7ACA # <cjk>
+0xE287 U+7ACD # <cjk>
+0xE288 U+7ACF # <cjk>
+0xE289 U+7AD5 # <cjk>
+0xE28A U+7AD3 # <cjk>
+0xE28B U+7AD9 # <cjk>
+0xE28C U+7ADA # <cjk>
+0xE28D U+7ADD # <cjk>
+0xE28E U+7AE1 # <cjk>
+0xE28F U+7AE2 # <cjk>
+0xE290 U+7AE6 # <cjk>
+0xE291 U+7AED # <cjk>
+0xE292 U+7AF0 # <cjk>
+0xE293 U+7B02 # <cjk>
+0xE294 U+7B0F # <cjk>
+0xE295 U+7B0A # <cjk>
+0xE296 U+7B06 # <cjk>
+0xE297 U+7B33 # <cjk>
+0xE298 U+7B18 # <cjk>
+0xE299 U+7B19 # <cjk>
+0xE29A U+7B1E # <cjk>
+0xE29B U+7B35 # <cjk>
+0xE29C U+7B28 # <cjk>
+0xE29D U+7B36 # <cjk>
+0xE29E U+7B50 # <cjk>
+0xE29F U+7B7A # <cjk>
+0xE2A0 U+7B04 # <cjk>
+0xE2A1 U+7B4D # <cjk>
+0xE2A2 U+7B0B # <cjk>
+0xE2A3 U+7B4C # <cjk>
+0xE2A4 U+7B45 # <cjk>
+0xE2A5 U+7B75 # <cjk>
+0xE2A6 U+7B65 # <cjk>
+0xE2A7 U+7B74 # <cjk>
+0xE2A8 U+7B67 # <cjk>
+0xE2A9 U+7B70 # <cjk>
+0xE2AA U+7B71 # <cjk>
+0xE2AB U+7B6C # <cjk>
+0xE2AC U+7B6E # <cjk>
+0xE2AD U+7B9D # <cjk>
+0xE2AE U+7B98 # <cjk>
+0xE2AF U+7B9F # <cjk>
+0xE2B0 U+7B8D # <cjk>
+0xE2B1 U+7B9C # <cjk>
+0xE2B2 U+7B9A # <cjk>
+0xE2B3 U+7B8B # <cjk>
+0xE2B4 U+7B92 # <cjk>
+0xE2B5 U+7B8F # <cjk>
+0xE2B6 U+7B5D # <cjk>
+0xE2B7 U+7B99 # <cjk>
+0xE2B8 U+7BCB # <cjk>
+0xE2B9 U+7BC1 # <cjk>
+0xE2BA U+7BCC # <cjk>
+0xE2BB U+7BCF # <cjk>
+0xE2BC U+7BB4 # <cjk>
+0xE2BD U+7BC6 # <cjk>
+0xE2BE U+7BDD # <cjk>
+0xE2BF U+7BE9 # <cjk>
+0xE2C0 U+7C11 # <cjk>
+0xE2C1 U+7C14 # <cjk>
+0xE2C2 U+7BE6 # <cjk>
+0xE2C3 U+7BE5 # <cjk>
+0xE2C4 U+7C60 # <cjk>
+0xE2C5 U+7C00 # <cjk>
+0xE2C6 U+7C07 # <cjk>
+0xE2C7 U+7C13 # <cjk>
+0xE2C8 U+7BF3 # <cjk>
+0xE2C9 U+7BF7 # <cjk>
+0xE2CA U+7C17 # <cjk>
+0xE2CB U+7C0D # <cjk>
+0xE2CC U+7BF6 # <cjk>
+0xE2CD U+7C23 # <cjk>
+0xE2CE U+7C27 # <cjk>
+0xE2CF U+7C2A # <cjk>
+0xE2D0 U+7C1F # <cjk>
+0xE2D1 U+7C37 # <cjk>
+0xE2D2 U+7C2B # <cjk>
+0xE2D3 U+7C3D # <cjk>
+0xE2D4 U+7C4C # <cjk>
+0xE2D5 U+7C43 # <cjk>
+0xE2D6 U+7C54 # <cjk>
+0xE2D7 U+7C4F # <cjk>
+0xE2D8 U+7C40 # <cjk>
+0xE2D9 U+7C50 # <cjk>
+0xE2DA U+7C58 # <cjk>
+0xE2DB U+7C5F # <cjk>
+0xE2DC U+7C64 # <cjk>
+0xE2DD U+7C56 # <cjk>
+0xE2DE U+7C65 # <cjk>
+0xE2DF U+7C6C # <cjk>
+0xE2E0 U+7C75 # <cjk>
+0xE2E1 U+7C83 # <cjk>
+0xE2E2 U+7C90 # <cjk>
+0xE2E3 U+7CA4 # <cjk>
+0xE2E4 U+7CAD # <cjk>
+0xE2E5 U+7CA2 # <cjk>
+0xE2E6 U+7CAB # <cjk>
+0xE2E7 U+7CA1 # <cjk>
+0xE2E8 U+7CA8 # <cjk>
+0xE2E9 U+7CB3 # <cjk>
+0xE2EA U+7CB2 # <cjk>
+0xE2EB U+7CB1 # <cjk>
+0xE2EC U+7CAE # <cjk>
+0xE2ED U+7CB9 # <cjk>
+0xE2EE U+7CBD # <cjk>
+0xE2EF U+7CC0 # <cjk>
+0xE2F0 U+7CC5 # <cjk>
+0xE2F1 U+7CC2 # <cjk>
+0xE2F2 U+7CD8 # <cjk>
+0xE2F3 U+7CD2 # <cjk>
+0xE2F4 U+7CDC # <cjk>
+0xE2F5 U+7CE2 # <cjk>
+0xE2F6 U+9B3B # <cjk>
+0xE2F7 U+7CEF # <cjk>
+0xE2F8 U+7CF2 # <cjk>
+0xE2F9 U+7CF4 # <cjk>
+0xE2FA U+7CF6 # <cjk>
+0xE2FB U+7CFA # <cjk>
+0xE2FC U+7D06 # <cjk>
+0xE340 U+7D02 # <cjk>
+0xE341 U+7D1C # <cjk>
+0xE342 U+7D15 # <cjk>
+0xE343 U+7D0A # <cjk>
+0xE344 U+7D45 # <cjk>
+0xE345 U+7D4B # <cjk>
+0xE346 U+7D2E # <cjk>
+0xE347 U+7D32 # <cjk>
+0xE348 U+7D3F # <cjk>
+0xE349 U+7D35 # <cjk>
+0xE34A U+7D46 # <cjk>
+0xE34B U+7D73 # <cjk>
+0xE34C U+7D56 # <cjk>
+0xE34D U+7D4E # <cjk>
+0xE34E U+7D72 # <cjk>
+0xE34F U+7D68 # <cjk>
+0xE350 U+7D6E # <cjk>
+0xE351 U+7D4F # <cjk>
+0xE352 U+7D63 # <cjk>
+0xE353 U+7D93 # <cjk>
+0xE354 U+7D89 # <cjk>
+0xE355 U+7D5B # <cjk>
+0xE356 U+7D8F # <cjk>
+0xE357 U+7D7D # <cjk>
+0xE358 U+7D9B # <cjk>
+0xE359 U+7DBA # <cjk>
+0xE35A U+7DAE # <cjk>
+0xE35B U+7DA3 # <cjk>
+0xE35C U+7DB5 # <cjk>
+0xE35D U+7DC7 # <cjk>
+0xE35E U+7DBD # <cjk>
+0xE35F U+7DAB # <cjk>
+0xE360 U+7E3D # <cjk>
+0xE361 U+7DA2 # <cjk>
+0xE362 U+7DAF # <cjk>
+0xE363 U+7DDC # <cjk>
+0xE364 U+7DB8 # <cjk>
+0xE365 U+7D9F # <cjk>
+0xE366 U+7DB0 # <cjk>
+0xE367 U+7DD8 # <cjk>
+0xE368 U+7DDD # <cjk>
+0xE369 U+7DE4 # <cjk>
+0xE36A U+7DDE # <cjk>
+0xE36B U+7DFB # <cjk>
+0xE36C U+7DF2 # <cjk>
+0xE36D U+7DE1 # <cjk>
+0xE36E U+7E05 # <cjk>
+0xE36F U+7E0A # <cjk>
+0xE370 U+7E23 # <cjk>
+0xE371 U+7E21 # <cjk>
+0xE372 U+7E12 # <cjk>
+0xE373 U+7E31 # <cjk>
+0xE374 U+7E1F # <cjk>
+0xE375 U+7E09 # <cjk>
+0xE376 U+7E0B # <cjk>
+0xE377 U+7E22 # <cjk>
+0xE378 U+7E46 # <cjk>
+0xE379 U+7E66 # <cjk>
+0xE37A U+7E3B # <cjk>
+0xE37B U+7E35 # <cjk>
+0xE37C U+7E39 # <cjk>
+0xE37D U+7E43 # <cjk>
+0xE37E U+7E37 # <cjk>
+0xE380 U+7E32 # <cjk>
+0xE381 U+7E3A # <cjk>
+0xE382 U+7E67 # <cjk>
+0xE383 U+7E5D # <cjk>
+0xE384 U+7E56 # <cjk>
+0xE385 U+7E5E # <cjk>
+0xE386 U+7E59 # <cjk>
+0xE387 U+7E5A # <cjk>
+0xE388 U+7E79 # <cjk>
+0xE389 U+7E6A # <cjk>
+0xE38A U+7E69 # <cjk>
+0xE38B U+7E7C # <cjk>
+0xE38C U+7E7B # <cjk>
+0xE38D U+7E83 # <cjk>
+0xE38E U+7DD5 # <cjk>
+0xE38F U+7E7D # <cjk>
+0xE390 U+8FAE # <cjk>
+0xE391 U+7E7F # <cjk>
+0xE392 U+7E88 # <cjk>
+0xE393 U+7E89 # <cjk>
+0xE394 U+7E8C # <cjk>
+0xE395 U+7E92 # <cjk>
+0xE396 U+7E90 # <cjk>
+0xE397 U+7E93 # <cjk>
+0xE398 U+7E94 # <cjk>
+0xE399 U+7E96 # <cjk>
+0xE39A U+7E8E # <cjk>
+0xE39B U+7E9B # <cjk>
+0xE39C U+7E9C # <cjk>
+0xE39D U+7F38 # <cjk>
+0xE39E U+7F3A # <cjk>
+0xE39F U+7F45 # <cjk>
+0xE3A0 U+7F4C # <cjk>
+0xE3A1 U+7F4D # <cjk>
+0xE3A2 U+7F4E # <cjk>
+0xE3A3 U+7F50 # <cjk>
+0xE3A4 U+7F51 # <cjk>
+0xE3A5 U+7F55 # <cjk>
+0xE3A6 U+7F54 # <cjk>
+0xE3A7 U+7F58 # <cjk>
+0xE3A8 U+7F5F # <cjk>
+0xE3A9 U+7F60 # <cjk>
+0xE3AA U+7F68 # <cjk>
+0xE3AB U+7F69 # <cjk>
+0xE3AC U+7F67 # <cjk>
+0xE3AD U+7F78 # <cjk>
+0xE3AE U+7F82 # <cjk>
+0xE3AF U+7F86 # <cjk>
+0xE3B0 U+7F83 # <cjk>
+0xE3B1 U+7F88 # <cjk>
+0xE3B2 U+7F87 # <cjk>
+0xE3B3 U+7F8C # <cjk>
+0xE3B4 U+7F94 # <cjk>
+0xE3B5 U+7F9E # <cjk>
+0xE3B6 U+7F9D # <cjk>
+0xE3B7 U+7F9A # <cjk>
+0xE3B8 U+7FA3 # <cjk>
+0xE3B9 U+7FAF # <cjk>
+0xE3BA U+7FB2 # <cjk>
+0xE3BB U+7FB9 # <cjk>
+0xE3BC U+7FAE # <cjk>
+0xE3BD U+7FB6 # <cjk>
+0xE3BE U+7FB8 # <cjk>
+0xE3BF U+8B71 # <cjk>
+0xE3C0 U+7FC5 # <cjk>
+0xE3C1 U+7FC6 # <cjk>
+0xE3C2 U+7FCA # <cjk>
+0xE3C3 U+7FD5 # <cjk>
+0xE3C4 U+7FD4 # <cjk>
+0xE3C5 U+7FE1 # <cjk>
+0xE3C6 U+7FE6 # <cjk>
+0xE3C7 U+7FE9 # <cjk>
+0xE3C8 U+7FF3 # <cjk>
+0xE3C9 U+7FF9 # <cjk>
+0xE3CA U+98DC # <cjk>
+0xE3CB U+8006 # <cjk>
+0xE3CC U+8004 # <cjk>
+0xE3CD U+800B # <cjk>
+0xE3CE U+8012 # <cjk>
+0xE3CF U+8018 # <cjk>
+0xE3D0 U+8019 # <cjk>
+0xE3D1 U+801C # <cjk>
+0xE3D2 U+8021 # <cjk>
+0xE3D3 U+8028 # <cjk>
+0xE3D4 U+803F # <cjk>
+0xE3D5 U+803B # <cjk>
+0xE3D6 U+804A # <cjk>
+0xE3D7 U+8046 # <cjk>
+0xE3D8 U+8052 # <cjk>
+0xE3D9 U+8058 # <cjk>
+0xE3DA U+805A # <cjk>
+0xE3DB U+805F # <cjk>
+0xE3DC U+8062 # <cjk>
+0xE3DD U+8068 # <cjk>
+0xE3DE U+8073 # <cjk>
+0xE3DF U+8072 # <cjk>
+0xE3E0 U+8070 # <cjk>
+0xE3E1 U+8076 # <cjk>
+0xE3E2 U+8079 # <cjk>
+0xE3E3 U+807D # <cjk>
+0xE3E4 U+807F # <cjk>
+0xE3E5 U+8084 # <cjk>
+0xE3E6 U+8086 # <cjk>
+0xE3E7 U+8085 # <cjk>
+0xE3E8 U+809B # <cjk>
+0xE3E9 U+8093 # <cjk>
+0xE3EA U+809A # <cjk>
+0xE3EB U+80AD # <cjk>
+0xE3EC U+5190 # <cjk>
+0xE3ED U+80AC # <cjk>
+0xE3EE U+80DB # <cjk>
+0xE3EF U+80E5 # <cjk>
+0xE3F0 U+80D9 # <cjk>
+0xE3F1 U+80DD # <cjk>
+0xE3F2 U+80C4 # <cjk>
+0xE3F3 U+80DA # <cjk>
+0xE3F4 U+80D6 # <cjk>
+0xE3F5 U+8109 # <cjk>
+0xE3F6 U+80EF # <cjk>
+0xE3F7 U+80F1 # <cjk>
+0xE3F8 U+811B # <cjk>
+0xE3F9 U+8129 # <cjk>
+0xE3FA U+8123 # <cjk>
+0xE3FB U+812F # <cjk>
+0xE3FC U+814B # <cjk>
+0xE440 U+968B # <cjk>
+0xE441 U+8146 # <cjk>
+0xE442 U+813E # <cjk>
+0xE443 U+8153 # <cjk>
+0xE444 U+8151 # <cjk>
+0xE445 U+80FC # <cjk>
+0xE446 U+8171 # <cjk>
+0xE447 U+816E # <cjk>
+0xE448 U+8165 # <cjk>
+0xE449 U+8166 # <cjk>
+0xE44A U+8174 # <cjk>
+0xE44B U+8183 # <cjk>
+0xE44C U+8188 # <cjk>
+0xE44D U+818A # <cjk>
+0xE44E U+8180 # <cjk>
+0xE44F U+8182 # <cjk>
+0xE450 U+81A0 # <cjk>
+0xE451 U+8195 # <cjk>
+0xE452 U+81A4 # <cjk>
+0xE453 U+81A3 # <cjk>
+0xE454 U+815F # <cjk>
+0xE455 U+8193 # <cjk>
+0xE456 U+81A9 # <cjk>
+0xE457 U+81B0 # <cjk>
+0xE458 U+81B5 # <cjk>
+0xE459 U+81BE # <cjk>
+0xE45A U+81B8 # <cjk>
+0xE45B U+81BD # <cjk>
+0xE45C U+81C0 # <cjk>
+0xE45D U+81C2 # <cjk>
+0xE45E U+81BA # <cjk>
+0xE45F U+81C9 # <cjk>
+0xE460 U+81CD # <cjk>
+0xE461 U+81D1 # <cjk>
+0xE462 U+81D9 # <cjk>
+0xE463 U+81D8 # <cjk>
+0xE464 U+81C8 # <cjk>
+0xE465 U+81DA # <cjk>
+0xE466 U+81DF # <cjk>
+0xE467 U+81E0 # <cjk>
+0xE468 U+81E7 # <cjk>
+0xE469 U+81FA # <cjk>
+0xE46A U+81FB # <cjk>
+0xE46B U+81FE # <cjk>
+0xE46C U+8201 # <cjk>
+0xE46D U+8202 # <cjk>
+0xE46E U+8205 # <cjk>
+0xE46F U+8207 # <cjk>
+0xE470 U+820A # <cjk>
+0xE471 U+820D # <cjk>
+0xE472 U+8210 # <cjk>
+0xE473 U+8216 # <cjk>
+0xE474 U+8229 # <cjk>
+0xE475 U+822B # <cjk>
+0xE476 U+8238 # <cjk>
+0xE477 U+8233 # <cjk>
+0xE478 U+8240 # <cjk>
+0xE479 U+8259 # <cjk>
+0xE47A U+8258 # <cjk>
+0xE47B U+825D # <cjk>
+0xE47C U+825A # <cjk>
+0xE47D U+825F # <cjk>
+0xE47E U+8264 # <cjk>
+0xE480 U+8262 # <cjk>
+0xE481 U+8268 # <cjk>
+0xE482 U+826A # <cjk>
+0xE483 U+826B # <cjk>
+0xE484 U+822E # <cjk>
+0xE485 U+8271 # <cjk>
+0xE486 U+8277 # <cjk>
+0xE487 U+8278 # <cjk>
+0xE488 U+827E # <cjk>
+0xE489 U+828D # <cjk>
+0xE48A U+8292 # <cjk>
+0xE48B U+82AB # <cjk>
+0xE48C U+829F # <cjk>
+0xE48D U+82BB # <cjk>
+0xE48E U+82AC # <cjk>
+0xE48F U+82E1 # <cjk>
+0xE490 U+82E3 # <cjk>
+0xE491 U+82DF # <cjk>
+0xE492 U+82D2 # <cjk>
+0xE493 U+82F4 # <cjk>
+0xE494 U+82F3 # <cjk>
+0xE495 U+82FA # <cjk>
+0xE496 U+8393 # <cjk>
+0xE497 U+8303 # <cjk>
+0xE498 U+82FB # <cjk>
+0xE499 U+82F9 # <cjk>
+0xE49A U+82DE # <cjk>
+0xE49B U+8306 # <cjk>
+0xE49C U+82DC # <cjk>
+0xE49D U+8309 # <cjk>
+0xE49E U+82D9 # <cjk>
+0xE49F U+8335 # <cjk>
+0xE4A0 U+8334 # <cjk>
+0xE4A1 U+8316 # <cjk>
+0xE4A2 U+8332 # <cjk>
+0xE4A3 U+8331 # <cjk>
+0xE4A4 U+8340 # <cjk>
+0xE4A5 U+8339 # <cjk>
+0xE4A6 U+8350 # <cjk>
+0xE4A7 U+8345 # <cjk>
+0xE4A8 U+832F # <cjk>
+0xE4A9 U+832B # <cjk>
+0xE4AA U+8317 # <cjk>
+0xE4AB U+8318 # <cjk>
+0xE4AC U+8385 # <cjk>
+0xE4AD U+839A # <cjk>
+0xE4AE U+83AA # <cjk>
+0xE4AF U+839F # <cjk>
+0xE4B0 U+83A2 # <cjk>
+0xE4B1 U+8396 # <cjk>
+0xE4B2 U+8323 # <cjk>
+0xE4B3 U+838E # <cjk>
+0xE4B4 U+8387 # <cjk>
+0xE4B5 U+838A # <cjk>
+0xE4B6 U+837C # <cjk>
+0xE4B7 U+83B5 # <cjk>
+0xE4B8 U+8373 # <cjk>
+0xE4B9 U+8375 # <cjk>
+0xE4BA U+83A0 # <cjk>
+0xE4BB U+8389 # <cjk>
+0xE4BC U+83A8 # <cjk>
+0xE4BD U+83F4 # <cjk>
+0xE4BE U+8413 # <cjk>
+0xE4BF U+83EB # <cjk>
+0xE4C0 U+83CE # <cjk>
+0xE4C1 U+83FD # <cjk>
+0xE4C2 U+8403 # <cjk>
+0xE4C3 U+83D8 # <cjk>
+0xE4C4 U+840B # <cjk>
+0xE4C5 U+83C1 # <cjk>
+0xE4C6 U+83F7 # <cjk>
+0xE4C7 U+8407 # <cjk>
+0xE4C8 U+83E0 # <cjk>
+0xE4C9 U+83F2 # <cjk>
+0xE4CA U+840D # <cjk>
+0xE4CB U+8422 # <cjk>
+0xE4CC U+8420 # <cjk>
+0xE4CD U+83BD # <cjk>
+0xE4CE U+8438 # <cjk>
+0xE4CF U+8506 # <cjk>
+0xE4D0 U+83FB # <cjk>
+0xE4D1 U+846D # <cjk>
+0xE4D2 U+842A # <cjk>
+0xE4D3 U+843C # <cjk>
+0xE4D4 U+855A # <cjk>
+0xE4D5 U+8484 # <cjk>
+0xE4D6 U+8477 # <cjk>
+0xE4D7 U+846B # <cjk>
+0xE4D8 U+84AD # <cjk>
+0xE4D9 U+846E # <cjk>
+0xE4DA U+8482 # <cjk>
+0xE4DB U+8469 # <cjk>
+0xE4DC U+8446 # <cjk>
+0xE4DD U+842C # <cjk>
+0xE4DE U+846F # <cjk>
+0xE4DF U+8479 # <cjk>
+0xE4E0 U+8435 # <cjk>
+0xE4E1 U+84CA # <cjk>
+0xE4E2 U+8462 # <cjk>
+0xE4E3 U+84B9 # <cjk>
+0xE4E4 U+84BF # <cjk>
+0xE4E5 U+849F # <cjk>
+0xE4E6 U+84D9 # <cjk>
+0xE4E7 U+84CD # <cjk>
+0xE4E8 U+84BB # <cjk>
+0xE4E9 U+84DA # <cjk>
+0xE4EA U+84D0 # <cjk>
+0xE4EB U+84C1 # <cjk>
+0xE4EC U+84C6 # <cjk>
+0xE4ED U+84D6 # <cjk>
+0xE4EE U+84A1 # <cjk>
+0xE4EF U+8521 # <cjk>
+0xE4F0 U+84FF # <cjk>
+0xE4F1 U+84F4 # <cjk>
+0xE4F2 U+8517 # <cjk>
+0xE4F3 U+8518 # <cjk>
+0xE4F4 U+852C # <cjk>
+0xE4F5 U+851F # <cjk>
+0xE4F6 U+8515 # <cjk>
+0xE4F7 U+8514 # <cjk>
+0xE4F8 U+84FC # <cjk>
+0xE4F9 U+8540 # <cjk>
+0xE4FA U+8563 # <cjk>
+0xE4FB U+8558 # <cjk>
+0xE4FC U+8548 # <cjk>
+0xE540 U+8541 # <cjk>
+0xE541 U+8602 # <cjk>
+0xE542 U+854B # <cjk>
+0xE543 U+8555 # <cjk>
+0xE544 U+8580 # <cjk>
+0xE545 U+85A4 # <cjk>
+0xE546 U+8588 # <cjk>
+0xE547 U+8591 # <cjk>
+0xE548 U+858A # <cjk>
+0xE549 U+85A8 # <cjk>
+0xE54A U+856D # <cjk>
+0xE54B U+8594 # <cjk>
+0xE54C U+859B # <cjk>
+0xE54D U+85EA # <cjk>
+0xE54E U+8587 # <cjk>
+0xE54F U+859C # <cjk>
+0xE550 U+8577 # <cjk>
+0xE551 U+857E # <cjk>
+0xE552 U+8590 # <cjk>
+0xE553 U+85C9 # <cjk>
+0xE554 U+85BA # <cjk>
+0xE555 U+85CF # <cjk>
+0xE556 U+85B9 # <cjk>
+0xE557 U+85D0 # <cjk>
+0xE558 U+85D5 # <cjk>
+0xE559 U+85DD # <cjk>
+0xE55A U+85E5 # <cjk>
+0xE55B U+85DC # <cjk>
+0xE55C U+85F9 # <cjk>
+0xE55D U+860A # <cjk>
+0xE55E U+8613 # <cjk>
+0xE55F U+860B # <cjk>
+0xE560 U+85FE # <cjk>
+0xE561 U+85FA # <cjk>
+0xE562 U+8606 # <cjk>
+0xE563 U+8622 # <cjk>
+0xE564 U+861A # <cjk>
+0xE565 U+8630 # <cjk>
+0xE566 U+863F # <cjk>
+0xE567 U+864D # <cjk>
+0xE568 U+4E55 # <cjk>
+0xE569 U+8654 # <cjk>
+0xE56A U+865F # <cjk>
+0xE56B U+8667 # <cjk>
+0xE56C U+8671 # <cjk>
+0xE56D U+8693 # <cjk>
+0xE56E U+86A3 # <cjk>
+0xE56F U+86A9 # <cjk>
+0xE570 U+86AA # <cjk>
+0xE571 U+868B # <cjk>
+0xE572 U+868C # <cjk>
+0xE573 U+86B6 # <cjk>
+0xE574 U+86AF # <cjk>
+0xE575 U+86C4 # <cjk>
+0xE576 U+86C6 # <cjk>
+0xE577 U+86B0 # <cjk>
+0xE578 U+86C9 # <cjk>
+0xE579 U+8823 # <cjk>
+0xE57A U+86AB # <cjk>
+0xE57B U+86D4 # <cjk>
+0xE57C U+86DE # <cjk>
+0xE57D U+86E9 # <cjk>
+0xE57E U+86EC # <cjk>
+0xE580 U+86DF # <cjk>
+0xE581 U+86DB # <cjk>
+0xE582 U+86EF # <cjk>
+0xE583 U+8712 # <cjk>
+0xE584 U+8706 # <cjk>
+0xE585 U+8708 # <cjk>
+0xE586 U+8700 # <cjk>
+0xE587 U+8703 # <cjk>
+0xE588 U+86FB # <cjk>
+0xE589 U+8711 # <cjk>
+0xE58A U+8709 # <cjk>
+0xE58B U+870D # <cjk>
+0xE58C U+86F9 # <cjk>
+0xE58D U+870A # <cjk>
+0xE58E U+8734 # <cjk>
+0xE58F U+873F # <cjk>
+0xE590 U+8737 # <cjk>
+0xE591 U+873B # <cjk>
+0xE592 U+8725 # <cjk>
+0xE593 U+8729 # <cjk>
+0xE594 U+871A # <cjk>
+0xE595 U+8760 # <cjk>
+0xE596 U+875F # <cjk>
+0xE597 U+8778 # <cjk>
+0xE598 U+874C # <cjk>
+0xE599 U+874E # <cjk>
+0xE59A U+8774 # <cjk>
+0xE59B U+8757 # <cjk>
+0xE59C U+8768 # <cjk>
+0xE59D U+876E # <cjk>
+0xE59E U+8759 # <cjk>
+0xE59F U+8753 # <cjk>
+0xE5A0 U+8763 # <cjk>
+0xE5A1 U+876A # <cjk>
+0xE5A2 U+8805 # <cjk>
+0xE5A3 U+87A2 # <cjk>
+0xE5A4 U+879F # <cjk>
+0xE5A5 U+8782 # <cjk>
+0xE5A6 U+87AF # <cjk>
+0xE5A7 U+87CB # <cjk>
+0xE5A8 U+87BD # <cjk>
+0xE5A9 U+87C0 # <cjk>
+0xE5AA U+87D0 # <cjk>
+0xE5AB U+96D6 # <cjk>
+0xE5AC U+87AB # <cjk>
+0xE5AD U+87C4 # <cjk>
+0xE5AE U+87B3 # <cjk>
+0xE5AF U+87C7 # <cjk>
+0xE5B0 U+87C6 # <cjk>
+0xE5B1 U+87BB # <cjk>
+0xE5B2 U+87EF # <cjk>
+0xE5B3 U+87F2 # <cjk>
+0xE5B4 U+87E0 # <cjk>
+0xE5B5 U+880F # <cjk>
+0xE5B6 U+880D # <cjk>
+0xE5B7 U+87FE # <cjk>
+0xE5B8 U+87F6 # <cjk>
+0xE5B9 U+87F7 # <cjk>
+0xE5BA U+880E # <cjk>
+0xE5BB U+87D2 # <cjk>
+0xE5BC U+8811 # <cjk>
+0xE5BD U+8816 # <cjk>
+0xE5BE U+8815 # <cjk>
+0xE5BF U+8822 # <cjk>
+0xE5C0 U+8821 # <cjk>
+0xE5C1 U+8831 # <cjk>
+0xE5C2 U+8836 # <cjk>
+0xE5C3 U+8839 # <cjk>
+0xE5C4 U+8827 # <cjk>
+0xE5C5 U+883B # <cjk>
+0xE5C6 U+8844 # <cjk>
+0xE5C7 U+8842 # <cjk>
+0xE5C8 U+8852 # <cjk>
+0xE5C9 U+8859 # <cjk>
+0xE5CA U+885E # <cjk>
+0xE5CB U+8862 # <cjk>
+0xE5CC U+886B # <cjk>
+0xE5CD U+8881 # <cjk>
+0xE5CE U+887E # <cjk>
+0xE5CF U+889E # <cjk>
+0xE5D0 U+8875 # <cjk>
+0xE5D1 U+887D # <cjk>
+0xE5D2 U+88B5 # <cjk>
+0xE5D3 U+8872 # <cjk>
+0xE5D4 U+8882 # <cjk>
+0xE5D5 U+8897 # <cjk>
+0xE5D6 U+8892 # <cjk>
+0xE5D7 U+88AE # <cjk>
+0xE5D8 U+8899 # <cjk>
+0xE5D9 U+88A2 # <cjk>
+0xE5DA U+888D # <cjk>
+0xE5DB U+88A4 # <cjk>
+0xE5DC U+88B0 # <cjk>
+0xE5DD U+88BF # <cjk>
+0xE5DE U+88B1 # <cjk>
+0xE5DF U+88C3 # <cjk>
+0xE5E0 U+88C4 # <cjk>
+0xE5E1 U+88D4 # <cjk>
+0xE5E2 U+88D8 # <cjk>
+0xE5E3 U+88D9 # <cjk>
+0xE5E4 U+88DD # <cjk>
+0xE5E5 U+88F9 # <cjk>
+0xE5E6 U+8902 # <cjk>
+0xE5E7 U+88FC # <cjk>
+0xE5E8 U+88F4 # <cjk>
+0xE5E9 U+88E8 # <cjk>
+0xE5EA U+88F2 # <cjk>
+0xE5EB U+8904 # <cjk>
+0xE5EC U+890C # <cjk>
+0xE5ED U+890A # <cjk>
+0xE5EE U+8913 # <cjk>
+0xE5EF U+8943 # <cjk>
+0xE5F0 U+891E # <cjk>
+0xE5F1 U+8925 # <cjk>
+0xE5F2 U+892A # <cjk>
+0xE5F3 U+892B # <cjk>
+0xE5F4 U+8941 # <cjk>
+0xE5F5 U+8944 # <cjk>
+0xE5F6 U+893B # <cjk>
+0xE5F7 U+8936 # <cjk>
+0xE5F8 U+8938 # <cjk>
+0xE5F9 U+894C # <cjk>
+0xE5FA U+891D # <cjk>
+0xE5FB U+8960 # <cjk>
+0xE5FC U+895E # <cjk>
+0xE640 U+8966 # <cjk>
+0xE641 U+8964 # <cjk>
+0xE642 U+896D # <cjk>
+0xE643 U+896A # <cjk>
+0xE644 U+896F # <cjk>
+0xE645 U+8974 # <cjk>
+0xE646 U+8977 # <cjk>
+0xE647 U+897E # <cjk>
+0xE648 U+8983 # <cjk>
+0xE649 U+8988 # <cjk>
+0xE64A U+898A # <cjk>
+0xE64B U+8993 # <cjk>
+0xE64C U+8998 # <cjk>
+0xE64D U+89A1 # <cjk>
+0xE64E U+89A9 # <cjk>
+0xE64F U+89A6 # <cjk>
+0xE650 U+89AC # <cjk>
+0xE651 U+89AF # <cjk>
+0xE652 U+89B2 # <cjk>
+0xE653 U+89BA # <cjk>
+0xE654 U+89BD # <cjk>
+0xE655 U+89BF # <cjk>
+0xE656 U+89C0 # <cjk>
+0xE657 U+89DA # <cjk>
+0xE658 U+89DC # <cjk>
+0xE659 U+89DD # <cjk>
+0xE65A U+89E7 # <cjk>
+0xE65B U+89F4 # <cjk>
+0xE65C U+89F8 # <cjk>
+0xE65D U+8A03 # <cjk>
+0xE65E U+8A16 # <cjk>
+0xE65F U+8A10 # <cjk>
+0xE660 U+8A0C # <cjk>
+0xE661 U+8A1B # <cjk>
+0xE662 U+8A1D # <cjk>
+0xE663 U+8A25 # <cjk>
+0xE664 U+8A36 # <cjk>
+0xE665 U+8A41 # <cjk>
+0xE666 U+8A5B # <cjk>
+0xE667 U+8A52 # <cjk>
+0xE668 U+8A46 # <cjk>
+0xE669 U+8A48 # <cjk>
+0xE66A U+8A7C # <cjk>
+0xE66B U+8A6D # <cjk>
+0xE66C U+8A6C # <cjk>
+0xE66D U+8A62 # <cjk>
+0xE66E U+8A85 # <cjk>
+0xE66F U+8A82 # <cjk>
+0xE670 U+8A84 # <cjk>
+0xE671 U+8AA8 # <cjk>
+0xE672 U+8AA1 # <cjk>
+0xE673 U+8A91 # <cjk>
+0xE674 U+8AA5 # <cjk>
+0xE675 U+8AA6 # <cjk>
+0xE676 U+8A9A # <cjk>
+0xE677 U+8AA3 # <cjk>
+0xE678 U+8AC4 # <cjk>
+0xE679 U+8ACD # <cjk>
+0xE67A U+8AC2 # <cjk>
+0xE67B U+8ADA # <cjk>
+0xE67C U+8AEB # <cjk>
+0xE67D U+8AF3 # <cjk>
+0xE67E U+8AE7 # <cjk>
+0xE680 U+8AE4 # <cjk>
+0xE681 U+8AF1 # <cjk>
+0xE682 U+8B14 # <cjk>
+0xE683 U+8AE0 # <cjk>
+0xE684 U+8AE2 # <cjk>
+0xE685 U+8AF7 # <cjk>
+0xE686 U+8ADE # <cjk>
+0xE687 U+8ADB # <cjk>
+0xE688 U+8B0C # <cjk>
+0xE689 U+8B07 # <cjk>
+0xE68A U+8B1A # <cjk>
+0xE68B U+8AE1 # <cjk>
+0xE68C U+8B16 # <cjk>
+0xE68D U+8B10 # <cjk>
+0xE68E U+8B17 # <cjk>
+0xE68F U+8B20 # <cjk>
+0xE690 U+8B33 # <cjk>
+0xE691 U+97AB # <cjk>
+0xE692 U+8B26 # <cjk>
+0xE693 U+8B2B # <cjk>
+0xE694 U+8B3E # <cjk>
+0xE695 U+8B28 # <cjk>
+0xE696 U+8B41 # <cjk>
+0xE697 U+8B4C # <cjk>
+0xE698 U+8B4F # <cjk>
+0xE699 U+8B4E # <cjk>
+0xE69A U+8B49 # <cjk>
+0xE69B U+8B56 # <cjk>
+0xE69C U+8B5B # <cjk>
+0xE69D U+8B5A # <cjk>
+0xE69E U+8B6B # <cjk>
+0xE69F U+8B5F # <cjk>
+0xE6A0 U+8B6C # <cjk>
+0xE6A1 U+8B6F # <cjk>
+0xE6A2 U+8B74 # <cjk>
+0xE6A3 U+8B7D # <cjk>
+0xE6A4 U+8B80 # <cjk>
+0xE6A5 U+8B8C # <cjk>
+0xE6A6 U+8B8E # <cjk>
+0xE6A7 U+8B92 # <cjk>
+0xE6A8 U+8B93 # <cjk>
+0xE6A9 U+8B96 # <cjk>
+0xE6AA U+8B99 # <cjk>
+0xE6AB U+8B9A # <cjk>
+0xE6AC U+8C3A # <cjk>
+0xE6AD U+8C41 # <cjk>
+0xE6AE U+8C3F # <cjk>
+0xE6AF U+8C48 # <cjk>
+0xE6B0 U+8C4C # <cjk>
+0xE6B1 U+8C4E # <cjk>
+0xE6B2 U+8C50 # <cjk>
+0xE6B3 U+8C55 # <cjk>
+0xE6B4 U+8C62 # <cjk>
+0xE6B5 U+8C6C # <cjk>
+0xE6B6 U+8C78 # <cjk>
+0xE6B7 U+8C7A # <cjk>
+0xE6B8 U+8C82 # <cjk>
+0xE6B9 U+8C89 # <cjk>
+0xE6BA U+8C85 # <cjk>
+0xE6BB U+8C8A # <cjk>
+0xE6BC U+8C8D # <cjk>
+0xE6BD U+8C8E # <cjk>
+0xE6BE U+8C94 # <cjk>
+0xE6BF U+8C7C # <cjk>
+0xE6C0 U+8C98 # <cjk>
+0xE6C1 U+621D # <cjk>
+0xE6C2 U+8CAD # <cjk>
+0xE6C3 U+8CAA # <cjk>
+0xE6C4 U+8CBD # <cjk>
+0xE6C5 U+8CB2 # <cjk>
+0xE6C6 U+8CB3 # <cjk>
+0xE6C7 U+8CAE # <cjk>
+0xE6C8 U+8CB6 # <cjk>
+0xE6C9 U+8CC8 # <cjk>
+0xE6CA U+8CC1 # <cjk>
+0xE6CB U+8CE4 # <cjk>
+0xE6CC U+8CE3 # <cjk>
+0xE6CD U+8CDA # <cjk>
+0xE6CE U+8CFD # <cjk>
+0xE6CF U+8CFA # <cjk>
+0xE6D0 U+8CFB # <cjk>
+0xE6D1 U+8D04 # <cjk>
+0xE6D2 U+8D05 # <cjk>
+0xE6D3 U+8D0A # <cjk>
+0xE6D4 U+8D07 # <cjk>
+0xE6D5 U+8D0F # <cjk>
+0xE6D6 U+8D0D # <cjk>
+0xE6D7 U+8D10 # <cjk>
+0xE6D8 U+9F4E # <cjk>
+0xE6D9 U+8D13 # <cjk>
+0xE6DA U+8CCD # <cjk>
+0xE6DB U+8D14 # <cjk>
+0xE6DC U+8D16 # <cjk>
+0xE6DD U+8D67 # <cjk>
+0xE6DE U+8D6D # <cjk>
+0xE6DF U+8D71 # <cjk>
+0xE6E0 U+8D73 # <cjk>
+0xE6E1 U+8D81 # <cjk>
+0xE6E2 U+8D99 # <cjk>
+0xE6E3 U+8DC2 # <cjk>
+0xE6E4 U+8DBE # <cjk>
+0xE6E5 U+8DBA # <cjk>
+0xE6E6 U+8DCF # <cjk>
+0xE6E7 U+8DDA # <cjk>
+0xE6E8 U+8DD6 # <cjk>
+0xE6E9 U+8DCC # <cjk>
+0xE6EA U+8DDB # <cjk>
+0xE6EB U+8DCB # <cjk>
+0xE6EC U+8DEA # <cjk>
+0xE6ED U+8DEB # <cjk>
+0xE6EE U+8DDF # <cjk>
+0xE6EF U+8DE3 # <cjk>
+0xE6F0 U+8DFC # <cjk>
+0xE6F1 U+8E08 # <cjk>
+0xE6F2 U+8E09 # <cjk>
+0xE6F3 U+8DFF # <cjk>
+0xE6F4 U+8E1D # <cjk>
+0xE6F5 U+8E1E # <cjk>
+0xE6F6 U+8E10 # <cjk>
+0xE6F7 U+8E1F # <cjk>
+0xE6F8 U+8E42 # <cjk>
+0xE6F9 U+8E35 # <cjk>
+0xE6FA U+8E30 # <cjk>
+0xE6FB U+8E34 # <cjk>
+0xE6FC U+8E4A # <cjk>
+0xE740 U+8E47 # <cjk>
+0xE741 U+8E49 # <cjk>
+0xE742 U+8E4C # <cjk>
+0xE743 U+8E50 # <cjk>
+0xE744 U+8E48 # <cjk>
+0xE745 U+8E59 # <cjk>
+0xE746 U+8E64 # <cjk>
+0xE747 U+8E60 # <cjk>
+0xE748 U+8E2A # <cjk>
+0xE749 U+8E63 # <cjk>
+0xE74A U+8E55 # <cjk>
+0xE74B U+8E76 # <cjk>
+0xE74C U+8E72 # <cjk>
+0xE74D U+8E7C # <cjk>
+0xE74E U+8E81 # <cjk>
+0xE74F U+8E87 # <cjk>
+0xE750 U+8E85 # <cjk>
+0xE751 U+8E84 # <cjk>
+0xE752 U+8E8B # <cjk>
+0xE753 U+8E8A # <cjk>
+0xE754 U+8E93 # <cjk>
+0xE755 U+8E91 # <cjk>
+0xE756 U+8E94 # <cjk>
+0xE757 U+8E99 # <cjk>
+0xE758 U+8EAA # <cjk>
+0xE759 U+8EA1 # <cjk>
+0xE75A U+8EAC # <cjk>
+0xE75B U+8EB0 # <cjk>
+0xE75C U+8EC6 # <cjk>
+0xE75D U+8EB1 # <cjk>
+0xE75E U+8EBE # <cjk>
+0xE75F U+8EC5 # <cjk>
+0xE760 U+8EC8 # <cjk>
+0xE761 U+8ECB # <cjk>
+0xE762 U+8EDB # <cjk>
+0xE763 U+8EE3 # <cjk>
+0xE764 U+8EFC # <cjk>
+0xE765 U+8EFB # <cjk>
+0xE766 U+8EEB # <cjk>
+0xE767 U+8EFE # <cjk>
+0xE768 U+8F0A # <cjk>
+0xE769 U+8F05 # <cjk>
+0xE76A U+8F15 # <cjk>
+0xE76B U+8F12 # <cjk>
+0xE76C U+8F19 # <cjk>
+0xE76D U+8F13 # <cjk>
+0xE76E U+8F1C # <cjk>
+0xE76F U+8F1F # <cjk>
+0xE770 U+8F1B # <cjk>
+0xE771 U+8F0C # <cjk>
+0xE772 U+8F26 # <cjk>
+0xE773 U+8F33 # <cjk>
+0xE774 U+8F3B # <cjk>
+0xE775 U+8F39 # <cjk>
+0xE776 U+8F45 # <cjk>
+0xE777 U+8F42 # <cjk>
+0xE778 U+8F3E # <cjk>
+0xE779 U+8F4C # <cjk>
+0xE77A U+8F49 # <cjk>
+0xE77B U+8F46 # <cjk>
+0xE77C U+8F4E # <cjk>
+0xE77D U+8F57 # <cjk>
+0xE77E U+8F5C # <cjk>
+0xE780 U+8F62 # <cjk>
+0xE781 U+8F63 # <cjk>
+0xE782 U+8F64 # <cjk>
+0xE783 U+8F9C # <cjk>
+0xE784 U+8F9F # <cjk>
+0xE785 U+8FA3 # <cjk>
+0xE786 U+8FAD # <cjk>
+0xE787 U+8FAF # <cjk>
+0xE788 U+8FB7 # <cjk>
+0xE789 U+8FDA # <cjk>
+0xE78A U+8FE5 # <cjk>
+0xE78B U+8FE2 # <cjk>
+0xE78C U+8FEA # <cjk>
+0xE78D U+8FEF # <cjk>
+0xE78E U+9087 # <cjk>
+0xE78F U+8FF4 # <cjk>
+0xE790 U+9005 # <cjk>
+0xE791 U+8FF9 # <cjk>
+0xE792 U+8FFA # <cjk>
+0xE793 U+9011 # <cjk>
+0xE794 U+9015 # <cjk>
+0xE795 U+9021 # <cjk>
+0xE796 U+900D # <cjk>
+0xE797 U+901E # <cjk>
+0xE798 U+9016 # <cjk>
+0xE799 U+900B # <cjk>
+0xE79A U+9027 # <cjk>
+0xE79B U+9036 # <cjk>
+0xE79C U+9035 # <cjk>
+0xE79D U+9039 # <cjk>
+0xE79E U+8FF8 # <cjk>
+0xE79F U+904F # <cjk>
+0xE7A0 U+9050 # <cjk>
+0xE7A1 U+9051 # <cjk>
+0xE7A2 U+9052 # <cjk>
+0xE7A3 U+900E # <cjk>
+0xE7A4 U+9049 # <cjk>
+0xE7A5 U+903E # <cjk>
+0xE7A6 U+9056 # <cjk>
+0xE7A7 U+9058 # <cjk>
+0xE7A8 U+905E # <cjk>
+0xE7A9 U+9068 # <cjk>
+0xE7AA U+906F # <cjk>
+0xE7AB U+9076 # <cjk>
+0xE7AC U+96A8 # <cjk>
+0xE7AD U+9072 # <cjk>
+0xE7AE U+9082 # <cjk>
+0xE7AF U+907D # <cjk>
+0xE7B0 U+9081 # <cjk>
+0xE7B1 U+9080 # <cjk>
+0xE7B2 U+908A # <cjk>
+0xE7B3 U+9089 # <cjk>
+0xE7B4 U+908F # <cjk>
+0xE7B5 U+90A8 # <cjk>
+0xE7B6 U+90AF # <cjk>
+0xE7B7 U+90B1 # <cjk>
+0xE7B8 U+90B5 # <cjk>
+0xE7B9 U+90E2 # <cjk>
+0xE7BA U+90E4 # <cjk>
+0xE7BB U+6248 # <cjk>
+0xE7BC U+90DB # <cjk>
+0xE7BD U+9102 # <cjk>
+0xE7BE U+9112 # <cjk>
+0xE7BF U+9119 # <cjk>
+0xE7C0 U+9132 # <cjk>
+0xE7C1 U+9130 # <cjk>
+0xE7C2 U+914A # <cjk>
+0xE7C3 U+9156 # <cjk>
+0xE7C4 U+9158 # <cjk>
+0xE7C5 U+9163 # <cjk>
+0xE7C6 U+9165 # <cjk>
+0xE7C7 U+9169 # <cjk>
+0xE7C8 U+9173 # <cjk>
+0xE7C9 U+9172 # <cjk>
+0xE7CA U+918B # <cjk>
+0xE7CB U+9189 # <cjk>
+0xE7CC U+9182 # <cjk>
+0xE7CD U+91A2 # <cjk>
+0xE7CE U+91AB # <cjk>
+0xE7CF U+91AF # <cjk>
+0xE7D0 U+91AA # <cjk>
+0xE7D1 U+91B5 # <cjk>
+0xE7D2 U+91B4 # <cjk>
+0xE7D3 U+91BA # <cjk>
+0xE7D4 U+91C0 # <cjk>
+0xE7D5 U+91C1 # <cjk>
+0xE7D6 U+91C9 # <cjk>
+0xE7D7 U+91CB # <cjk>
+0xE7D8 U+91D0 # <cjk>
+0xE7D9 U+91D6 # <cjk>
+0xE7DA U+91DF # <cjk>
+0xE7DB U+91E1 # <cjk>
+0xE7DC U+91DB # <cjk>
+0xE7DD U+91FC # <cjk>
+0xE7DE U+91F5 # <cjk>
+0xE7DF U+91F6 # <cjk>
+0xE7E0 U+921E # <cjk>
+0xE7E1 U+91FF # <cjk>
+0xE7E2 U+9214 # <cjk>
+0xE7E3 U+922C # <cjk>
+0xE7E4 U+9215 # <cjk>
+0xE7E5 U+9211 # <cjk>
+0xE7E6 U+925E # <cjk>
+0xE7E7 U+9257 # <cjk>
+0xE7E8 U+9245 # <cjk>
+0xE7E9 U+9249 # <cjk>
+0xE7EA U+9264 # <cjk>
+0xE7EB U+9248 # <cjk>
+0xE7EC U+9295 # <cjk>
+0xE7ED U+923F # <cjk>
+0xE7EE U+924B # <cjk>
+0xE7EF U+9250 # <cjk>
+0xE7F0 U+929C # <cjk>
+0xE7F1 U+9296 # <cjk>
+0xE7F2 U+9293 # <cjk>
+0xE7F3 U+929B # <cjk>
+0xE7F4 U+925A # <cjk>
+0xE7F5 U+92CF # <cjk>
+0xE7F6 U+92B9 # <cjk>
+0xE7F7 U+92B7 # <cjk>
+0xE7F8 U+92E9 # <cjk>
+0xE7F9 U+930F # <cjk>
+0xE7FA U+92FA # <cjk>
+0xE7FB U+9344 # <cjk>
+0xE7FC U+932E # <cjk>
+0xE840 U+9319 # <cjk>
+0xE841 U+9322 # <cjk>
+0xE842 U+931A # <cjk>
+0xE843 U+9323 # <cjk>
+0xE844 U+933A # <cjk>
+0xE845 U+9335 # <cjk>
+0xE846 U+933B # <cjk>
+0xE847 U+935C # <cjk>
+0xE848 U+9360 # <cjk>
+0xE849 U+937C # <cjk>
+0xE84A U+936E # <cjk>
+0xE84B U+9356 # <cjk>
+0xE84C U+93B0 # <cjk>
+0xE84D U+93AC # <cjk>
+0xE84E U+93AD # <cjk>
+0xE84F U+9394 # <cjk>
+0xE850 U+93B9 # <cjk>
+0xE851 U+93D6 # <cjk>
+0xE852 U+93D7 # <cjk>
+0xE853 U+93E8 # <cjk>
+0xE854 U+93E5 # <cjk>
+0xE855 U+93D8 # <cjk>
+0xE856 U+93C3 # <cjk>
+0xE857 U+93DD # <cjk>
+0xE858 U+93D0 # <cjk>
+0xE859 U+93C8 # <cjk>
+0xE85A U+93E4 # <cjk>
+0xE85B U+941A # <cjk>
+0xE85C U+9414 # <cjk>
+0xE85D U+9413 # <cjk>
+0xE85E U+9403 # <cjk>
+0xE85F U+9407 # <cjk>
+0xE860 U+9410 # <cjk>
+0xE861 U+9436 # <cjk>
+0xE862 U+942B # <cjk>
+0xE863 U+9435 # <cjk>
+0xE864 U+9421 # <cjk>
+0xE865 U+943A # <cjk>
+0xE866 U+9441 # <cjk>
+0xE867 U+9452 # <cjk>
+0xE868 U+9444 # <cjk>
+0xE869 U+945B # <cjk>
+0xE86A U+9460 # <cjk>
+0xE86B U+9462 # <cjk>
+0xE86C U+945E # <cjk>
+0xE86D U+946A # <cjk>
+0xE86E U+9229 # <cjk>
+0xE86F U+9470 # <cjk>
+0xE870 U+9475 # <cjk>
+0xE871 U+9477 # <cjk>
+0xE872 U+947D # <cjk>
+0xE873 U+945A # <cjk>
+0xE874 U+947C # <cjk>
+0xE875 U+947E # <cjk>
+0xE876 U+9481 # <cjk>
+0xE877 U+947F # <cjk>
+0xE878 U+9582 # <cjk>
+0xE879 U+9587 # <cjk>
+0xE87A U+958A # <cjk>
+0xE87B U+9594 # <cjk>
+0xE87C U+9596 # <cjk>
+0xE87D U+9598 # <cjk>
+0xE87E U+9599 # <cjk>
+0xE880 U+95A0 # <cjk>
+0xE881 U+95A8 # <cjk>
+0xE882 U+95A7 # <cjk>
+0xE883 U+95AD # <cjk>
+0xE884 U+95BC # <cjk>
+0xE885 U+95BB # <cjk>
+0xE886 U+95B9 # <cjk>
+0xE887 U+95BE # <cjk>
+0xE888 U+95CA # <cjk>
+0xE889 U+6FF6 # <cjk>
+0xE88A U+95C3 # <cjk>
+0xE88B U+95CD # <cjk>
+0xE88C U+95CC # <cjk>
+0xE88D U+95D5 # <cjk>
+0xE88E U+95D4 # <cjk>
+0xE88F U+95D6 # <cjk>
+0xE890 U+95DC # <cjk>
+0xE891 U+95E1 # <cjk>
+0xE892 U+95E5 # <cjk>
+0xE893 U+95E2 # <cjk>
+0xE894 U+9621 # <cjk>
+0xE895 U+9628 # <cjk>
+0xE896 U+962E # <cjk>
+0xE897 U+962F # <cjk>
+0xE898 U+9642 # <cjk>
+0xE899 U+964C # <cjk>
+0xE89A U+964F # <cjk>
+0xE89B U+964B # <cjk>
+0xE89C U+9677 # <cjk>
+0xE89D U+965C # <cjk>
+0xE89E U+965E # <cjk>
+0xE89F U+965D # <cjk>
+0xE8A0 U+965F # <cjk>
+0xE8A1 U+9666 # <cjk>
+0xE8A2 U+9672 # <cjk>
+0xE8A3 U+966C # <cjk>
+0xE8A4 U+968D # <cjk>
+0xE8A5 U+9698 # <cjk>
+0xE8A6 U+9695 # <cjk>
+0xE8A7 U+9697 # <cjk>
+0xE8A8 U+96AA # <cjk>
+0xE8A9 U+96A7 # <cjk>
+0xE8AA U+96B1 # <cjk>
+0xE8AB U+96B2 # <cjk>
+0xE8AC U+96B0 # <cjk>
+0xE8AD U+96B4 # <cjk>
+0xE8AE U+96B6 # <cjk>
+0xE8AF U+96B8 # <cjk>
+0xE8B0 U+96B9 # <cjk>
+0xE8B1 U+96CE # <cjk>
+0xE8B2 U+96CB # <cjk>
+0xE8B3 U+96C9 # <cjk>
+0xE8B4 U+96CD # <cjk>
+0xE8B5 U+894D # <cjk>
+0xE8B6 U+96DC # <cjk>
+0xE8B7 U+970D # <cjk>
+0xE8B8 U+96D5 # <cjk>
+0xE8B9 U+96F9 # <cjk>
+0xE8BA U+9704 # <cjk>
+0xE8BB U+9706 # <cjk>
+0xE8BC U+9708 # <cjk>
+0xE8BD U+9713 # <cjk>
+0xE8BE U+970E # <cjk>
+0xE8BF U+9711 # <cjk>
+0xE8C0 U+970F # <cjk>
+0xE8C1 U+9716 # <cjk>
+0xE8C2 U+9719 # <cjk>
+0xE8C3 U+9724 # <cjk>
+0xE8C4 U+972A # <cjk>
+0xE8C5 U+9730 # <cjk>
+0xE8C6 U+9739 # <cjk>
+0xE8C7 U+973D # <cjk>
+0xE8C8 U+973E # <cjk>
+0xE8C9 U+9744 # <cjk>
+0xE8CA U+9746 # <cjk>
+0xE8CB U+9748 # <cjk>
+0xE8CC U+9742 # <cjk>
+0xE8CD U+9749 # <cjk>
+0xE8CE U+975C # <cjk>
+0xE8CF U+9760 # <cjk>
+0xE8D0 U+9764 # <cjk>
+0xE8D1 U+9766 # <cjk>
+0xE8D2 U+9768 # <cjk>
+0xE8D3 U+52D2 # <cjk>
+0xE8D4 U+976B # <cjk>
+0xE8D5 U+9771 # <cjk>
+0xE8D6 U+9779 # <cjk>
+0xE8D7 U+9785 # <cjk>
+0xE8D8 U+977C # <cjk>
+0xE8D9 U+9781 # <cjk>
+0xE8DA U+977A # <cjk>
+0xE8DB U+9786 # <cjk>
+0xE8DC U+978B # <cjk>
+0xE8DD U+978F # <cjk>
+0xE8DE U+9790 # <cjk>
+0xE8DF U+979C # <cjk>
+0xE8E0 U+97A8 # <cjk>
+0xE8E1 U+97A6 # <cjk>
+0xE8E2 U+97A3 # <cjk>
+0xE8E3 U+97B3 # <cjk>
+0xE8E4 U+97B4 # <cjk>
+0xE8E5 U+97C3 # <cjk>
+0xE8E6 U+97C6 # <cjk>
+0xE8E7 U+97C8 # <cjk>
+0xE8E8 U+97CB # <cjk>
+0xE8E9 U+97DC # <cjk>
+0xE8EA U+97ED # <cjk>
+0xE8EB U+9F4F # <cjk>
+0xE8EC U+97F2 # <cjk>
+0xE8ED U+7ADF # <cjk>
+0xE8EE U+97F6 # <cjk>
+0xE8EF U+97F5 # <cjk>
+0xE8F0 U+980F # <cjk>
+0xE8F1 U+980C # <cjk>
+0xE8F2 U+9838 # <cjk>
+0xE8F3 U+9824 # <cjk>
+0xE8F4 U+9821 # <cjk>
+0xE8F5 U+9837 # <cjk>
+0xE8F6 U+983D # <cjk>
+0xE8F7 U+9846 # <cjk>
+0xE8F8 U+984F # <cjk>
+0xE8F9 U+984B # <cjk>
+0xE8FA U+986B # <cjk>
+0xE8FB U+986F # <cjk>
+0xE8FC U+9870 # <cjk>
+0xE940 U+9871 # <cjk>
+0xE941 U+9874 # <cjk>
+0xE942 U+9873 # <cjk>
+0xE943 U+98AA # <cjk>
+0xE944 U+98AF # <cjk>
+0xE945 U+98B1 # <cjk>
+0xE946 U+98B6 # <cjk>
+0xE947 U+98C4 # <cjk>
+0xE948 U+98C3 # <cjk>
+0xE949 U+98C6 # <cjk>
+0xE94A U+98E9 # <cjk>
+0xE94B U+98EB # <cjk>
+0xE94C U+9903 # <cjk>
+0xE94D U+9909 # <cjk>
+0xE94E U+9912 # <cjk>
+0xE94F U+9914 # <cjk>
+0xE950 U+9918 # <cjk>
+0xE951 U+9921 # <cjk>
+0xE952 U+991D # <cjk>
+0xE953 U+991E # <cjk>
+0xE954 U+9924 # <cjk>
+0xE955 U+9920 # <cjk>
+0xE956 U+992C # <cjk>
+0xE957 U+992E # <cjk>
+0xE958 U+993D # <cjk>
+0xE959 U+993E # <cjk>
+0xE95A U+9942 # <cjk>
+0xE95B U+9949 # <cjk>
+0xE95C U+9945 # <cjk>
+0xE95D U+9950 # <cjk>
+0xE95E U+994B # <cjk>
+0xE95F U+9951 # <cjk>
+0xE960 U+9952 # <cjk>
+0xE961 U+994C # <cjk>
+0xE962 U+9955 # <cjk>
+0xE963 U+9997 # <cjk>
+0xE964 U+9998 # <cjk>
+0xE965 U+99A5 # <cjk>
+0xE966 U+99AD # <cjk>
+0xE967 U+99AE # <cjk>
+0xE968 U+99BC # <cjk>
+0xE969 U+99DF # <cjk>
+0xE96A U+99DB # <cjk>
+0xE96B U+99DD # <cjk>
+0xE96C U+99D8 # <cjk>
+0xE96D U+99D1 # <cjk>
+0xE96E U+99ED # <cjk>
+0xE96F U+99EE # <cjk>
+0xE970 U+99F1 # <cjk>
+0xE971 U+99F2 # <cjk>
+0xE972 U+99FB # <cjk>
+0xE973 U+99F8 # <cjk>
+0xE974 U+9A01 # <cjk>
+0xE975 U+9A0F # <cjk>
+0xE976 U+9A05 # <cjk>
+0xE977 U+99E2 # <cjk>
+0xE978 U+9A19 # <cjk>
+0xE979 U+9A2B # <cjk>
+0xE97A U+9A37 # <cjk>
+0xE97B U+9A45 # <cjk>
+0xE97C U+9A42 # <cjk>
+0xE97D U+9A40 # <cjk>
+0xE97E U+9A43 # <cjk>
+0xE980 U+9A3E # <cjk>
+0xE981 U+9A55 # <cjk>
+0xE982 U+9A4D # <cjk>
+0xE983 U+9A5B # <cjk>
+0xE984 U+9A57 # <cjk>
+0xE985 U+9A5F # <cjk>
+0xE986 U+9A62 # <cjk>
+0xE987 U+9A65 # <cjk>
+0xE988 U+9A64 # <cjk>
+0xE989 U+9A69 # <cjk>
+0xE98A U+9A6B # <cjk>
+0xE98B U+9A6A # <cjk>
+0xE98C U+9AAD # <cjk>
+0xE98D U+9AB0 # <cjk>
+0xE98E U+9ABC # <cjk>
+0xE98F U+9AC0 # <cjk>
+0xE990 U+9ACF # <cjk>
+0xE991 U+9AD1 # <cjk>
+0xE992 U+9AD3 # <cjk>
+0xE993 U+9AD4 # <cjk>
+0xE994 U+9ADE # <cjk>
+0xE995 U+9ADF # <cjk>
+0xE996 U+9AE2 # <cjk>
+0xE997 U+9AE3 # <cjk>
+0xE998 U+9AE6 # <cjk>
+0xE999 U+9AEF # <cjk>
+0xE99A U+9AEB # <cjk>
+0xE99B U+9AEE # <cjk>
+0xE99C U+9AF4 # <cjk>
+0xE99D U+9AF1 # <cjk>
+0xE99E U+9AF7 # <cjk>
+0xE99F U+9AFB # <cjk>
+0xE9A0 U+9B06 # <cjk>
+0xE9A1 U+9B18 # <cjk>
+0xE9A2 U+9B1A # <cjk>
+0xE9A3 U+9B1F # <cjk>
+0xE9A4 U+9B22 # <cjk>
+0xE9A5 U+9B23 # <cjk>
+0xE9A6 U+9B25 # <cjk>
+0xE9A7 U+9B27 # <cjk>
+0xE9A8 U+9B28 # <cjk>
+0xE9A9 U+9B29 # <cjk>
+0xE9AA U+9B2A # <cjk>
+0xE9AB U+9B2E # <cjk>
+0xE9AC U+9B2F # <cjk>
+0xE9AD U+9B32 # <cjk>
+0xE9AE U+9B44 # <cjk>
+0xE9AF U+9B43 # <cjk>
+0xE9B0 U+9B4F # <cjk>
+0xE9B1 U+9B4D # <cjk>
+0xE9B2 U+9B4E # <cjk>
+0xE9B3 U+9B51 # <cjk>
+0xE9B4 U+9B58 # <cjk>
+0xE9B5 U+9B74 # <cjk>
+0xE9B6 U+9B93 # <cjk>
+0xE9B7 U+9B83 # <cjk>
+0xE9B8 U+9B91 # <cjk>
+0xE9B9 U+9B96 # <cjk>
+0xE9BA U+9B97 # <cjk>
+0xE9BB U+9B9F # <cjk>
+0xE9BC U+9BA0 # <cjk>
+0xE9BD U+9BA8 # <cjk>
+0xE9BE U+9BB4 # <cjk>
+0xE9BF U+9BC0 # <cjk>
+0xE9C0 U+9BCA # <cjk>
+0xE9C1 U+9BB9 # <cjk>
+0xE9C2 U+9BC6 # <cjk>
+0xE9C3 U+9BCF # <cjk>
+0xE9C4 U+9BD1 # <cjk>
+0xE9C5 U+9BD2 # <cjk>
+0xE9C6 U+9BE3 # <cjk>
+0xE9C7 U+9BE2 # <cjk>
+0xE9C8 U+9BE4 # <cjk>
+0xE9C9 U+9BD4 # <cjk>
+0xE9CA U+9BE1 # <cjk>
+0xE9CB U+9C3A # <cjk>
+0xE9CC U+9BF2 # <cjk>
+0xE9CD U+9BF1 # <cjk>
+0xE9CE U+9BF0 # <cjk>
+0xE9CF U+9C15 # <cjk>
+0xE9D0 U+9C14 # <cjk>
+0xE9D1 U+9C09 # <cjk>
+0xE9D2 U+9C13 # <cjk>
+0xE9D3 U+9C0C # <cjk>
+0xE9D4 U+9C06 # <cjk>
+0xE9D5 U+9C08 # <cjk>
+0xE9D6 U+9C12 # <cjk>
+0xE9D7 U+9C0A # <cjk>
+0xE9D8 U+9C04 # <cjk>
+0xE9D9 U+9C2E # <cjk>
+0xE9DA U+9C1B # <cjk>
+0xE9DB U+9C25 # <cjk>
+0xE9DC U+9C24 # <cjk>
+0xE9DD U+9C21 # <cjk>
+0xE9DE U+9C30 # <cjk>
+0xE9DF U+9C47 # <cjk>
+0xE9E0 U+9C32 # <cjk>
+0xE9E1 U+9C46 # <cjk>
+0xE9E2 U+9C3E # <cjk>
+0xE9E3 U+9C5A # <cjk>
+0xE9E4 U+9C60 # <cjk>
+0xE9E5 U+9C67 # <cjk>
+0xE9E6 U+9C76 # <cjk>
+0xE9E7 U+9C78 # <cjk>
+0xE9E8 U+9CE7 # <cjk>
+0xE9E9 U+9CEC # <cjk>
+0xE9EA U+9CF0 # <cjk>
+0xE9EB U+9D09 # <cjk>
+0xE9EC U+9D08 # <cjk>
+0xE9ED U+9CEB # <cjk>
+0xE9EE U+9D03 # <cjk>
+0xE9EF U+9D06 # <cjk>
+0xE9F0 U+9D2A # <cjk>
+0xE9F1 U+9D26 # <cjk>
+0xE9F2 U+9DAF # <cjk>
+0xE9F3 U+9D23 # <cjk>
+0xE9F4 U+9D1F # <cjk>
+0xE9F5 U+9D44 # <cjk>
+0xE9F6 U+9D15 # <cjk>
+0xE9F7 U+9D12 # <cjk>
+0xE9F8 U+9D41 # <cjk>
+0xE9F9 U+9D3F # <cjk>
+0xE9FA U+9D3E # <cjk>
+0xE9FB U+9D46 # <cjk>
+0xE9FC U+9D48 # <cjk>
+0xEA40 U+9D5D # <cjk>
+0xEA41 U+9D5E # <cjk>
+0xEA42 U+9D64 # <cjk>
+0xEA43 U+9D51 # <cjk>
+0xEA44 U+9D50 # <cjk>
+0xEA45 U+9D59 # <cjk>
+0xEA46 U+9D72 # <cjk>
+0xEA47 U+9D89 # <cjk>
+0xEA48 U+9D87 # <cjk>
+0xEA49 U+9DAB # <cjk>
+0xEA4A U+9D6F # <cjk>
+0xEA4B U+9D7A # <cjk>
+0xEA4C U+9D9A # <cjk>
+0xEA4D U+9DA4 # <cjk>
+0xEA4E U+9DA9 # <cjk>
+0xEA4F U+9DB2 # <cjk>
+0xEA50 U+9DC4 # <cjk>
+0xEA51 U+9DC1 # <cjk>
+0xEA52 U+9DBB # <cjk>
+0xEA53 U+9DB8 # <cjk>
+0xEA54 U+9DBA # <cjk>
+0xEA55 U+9DC6 # <cjk>
+0xEA56 U+9DCF # <cjk>
+0xEA57 U+9DC2 # <cjk>
+0xEA58 U+9DD9 # <cjk>
+0xEA59 U+9DD3 # <cjk>
+0xEA5A U+9DF8 # <cjk>
+0xEA5B U+9DE6 # <cjk>
+0xEA5C U+9DED # <cjk>
+0xEA5D U+9DEF # <cjk>
+0xEA5E U+9DFD # <cjk>
+0xEA5F U+9E1A # <cjk>
+0xEA60 U+9E1B # <cjk>
+0xEA61 U+9E1E # <cjk>
+0xEA62 U+9E75 # <cjk>
+0xEA63 U+9E79 # <cjk>
+0xEA64 U+9E7D # <cjk>
+0xEA65 U+9E81 # <cjk>
+0xEA66 U+9E88 # <cjk>
+0xEA67 U+9E8B # <cjk>
+0xEA68 U+9E8C # <cjk>
+0xEA69 U+9E92 # <cjk>
+0xEA6A U+9E95 # <cjk>
+0xEA6B U+9E91 # <cjk>
+0xEA6C U+9E9D # <cjk>
+0xEA6D U+9EA5 # <cjk>
+0xEA6E U+9EA9 # <cjk>
+0xEA6F U+9EB8 # <cjk>
+0xEA70 U+9EAA # <cjk>
+0xEA71 U+9EAD # <cjk>
+0xEA72 U+9761 # <cjk>
+0xEA73 U+9ECC # <cjk>
+0xEA74 U+9ECE # <cjk>
+0xEA75 U+9ECF # <cjk>
+0xEA76 U+9ED0 # <cjk>
+0xEA77 U+9ED4 # <cjk>
+0xEA78 U+9EDC # <cjk>
+0xEA79 U+9EDE # <cjk>
+0xEA7A U+9EDD # <cjk>
+0xEA7B U+9EE0 # <cjk>
+0xEA7C U+9EE5 # <cjk>
+0xEA7D U+9EE8 # <cjk>
+0xEA7E U+9EEF # <cjk>
+0xEA80 U+9EF4 # <cjk>
+0xEA81 U+9EF6 # <cjk>
+0xEA82 U+9EF7 # <cjk>
+0xEA83 U+9EF9 # <cjk>
+0xEA84 U+9EFB # <cjk>
+0xEA85 U+9EFC # <cjk>
+0xEA86 U+9EFD # <cjk>
+0xEA87 U+9F07 # <cjk>
+0xEA88 U+9F08 # <cjk>
+0xEA89 U+76B7 # <cjk>
+0xEA8A U+9F15 # <cjk>
+0xEA8B U+9F21 # <cjk>
+0xEA8C U+9F2C # <cjk>
+0xEA8D U+9F3E # <cjk>
+0xEA8E U+9F4A # <cjk>
+0xEA8F U+9F52 # <cjk>
+0xEA90 U+9F54 # <cjk>
+0xEA91 U+9F63 # <cjk>
+0xEA92 U+9F5F # <cjk>
+0xEA93 U+9F60 # <cjk>
+0xEA94 U+9F61 # <cjk>
+0xEA95 U+9F66 # <cjk>
+0xEA96 U+9F67 # <cjk>
+0xEA97 U+9F6C # <cjk>
+0xEA98 U+9F6A # <cjk>
+0xEA99 U+9F77 # <cjk>
+0xEA9A U+9F72 # <cjk>
+0xEA9B U+9F76 # <cjk>
+0xEA9C U+9F95 # <cjk>
+0xEA9D U+9F9C # <cjk>
+0xEA9E U+9FA0 # <cjk>
+0xEA9F U+582F # <cjk> [1983]
+0xEAA0 U+69C7 # <cjk> [1983]
+0xEAA1 U+9059 # <cjk> [1983]
+0xEAA2 U+7464 # <cjk> [1983]
+0xEAA3 U+51DC # <cjk> [1990]
+0xEAA4 U+7199 # <cjk> [1990]
+0xEAA5 U+5653 # <cjk> [2004]
+0xEAA6 U+5DE2 # <cjk> [2000]
+0xEAA7 U+5E14 # <cjk> [2000]
+0xEAA8 U+5E18 # <cjk> [2000]
+0xEAA9 U+5E58 # <cjk> [2000]
+0xEAAA U+5E5E # <cjk> [2000]
+0xEAAB U+5EBE # <cjk> [2000]
+0xEAAC U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000]
+0xEAAD U+5ECB # <cjk> [2000]
+0xEAAE U+5EF9 # <cjk> [2000]
+0xEAAF U+5F00 # <cjk> [2000]
+0xEAB0 U+5F02 # <cjk> [2000]
+0xEAB1 U+5F07 # <cjk> [2000]
+0xEAB2 U+5F1D # <cjk> [2000]
+0xEAB3 U+5F23 # <cjk> [2000]
+0xEAB4 U+5F34 # <cjk> [2000]
+0xEAB5 U+5F36 # <cjk> [2000]
+0xEAB6 U+5F3D # <cjk> [2000]
+0xEAB7 U+5F40 # <cjk> [2000]
+0xEAB8 U+5F45 # <cjk> [2000]
+0xEAB9 U+5F54 # <cjk> [2000]
+0xEABA U+5F58 # <cjk> [2000]
+0xEABB U+5F64 # <cjk> [2000]
+0xEABC U+5F67 # <cjk> [2000]
+0xEABD U+5F7D # <cjk> [2000]
+0xEABE U+5F89 # <cjk> [2000]
+0xEABF U+5F9C # <cjk> [2000]
+0xEAC0 U+5FA7 # <cjk> [2000]
+0xEAC1 U+5FAF # <cjk> [2000]
+0xEAC2 U+5FB5 # <cjk> [2000]
+0xEAC3 U+5FB7 # <cjk> [2000]
+0xEAC4 U+5FC9 # <cjk> [2000]
+0xEAC5 U+5FDE # <cjk> [2000]
+0xEAC6 U+5FE1 # <cjk> [2000]
+0xEAC7 U+5FE9 # <cjk> [2000]
+0xEAC8 U+600D # <cjk> [2000]
+0xEAC9 U+6014 # <cjk> [2000]
+0xEACA U+6018 # <cjk> [2000]
+0xEACB U+6033 # <cjk> [2000]
+0xEACC U+6035 # <cjk> [2000]
+0xEACD U+6047 # <cjk> [2000]
+0xEACE U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2]
+0xEACF U+609D # <cjk> [2000]
+0xEAD0 U+609E # <cjk> [2000]
+0xEAD1 U+60CB # <cjk> [2000]
+0xEAD2 U+60D4 # <cjk> [2000]
+0xEAD3 U+60D5 # <cjk> [2000]
+0xEAD4 U+60DD # <cjk> [2000]
+0xEAD5 U+60F8 # <cjk> [2000]
+0xEAD6 U+611C # <cjk> [2000]
+0xEAD7 U+612B # <cjk> [2000]
+0xEAD8 U+6130 # <cjk> [2000]
+0xEAD9 U+6137 # <cjk> [2000]
+0xEADA U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2]
+0xEADB U+618D # <cjk> [2000]
+0xEADC U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2]
+0xEADD U+61BC # <cjk> [2000]
+0xEADE U+61B9 # <cjk> [2000]
+0xEADF U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2]
+0xEAE0 U+6222 # <cjk> [2000]
+0xEAE1 U+623E # <cjk> [2000]
+0xEAE2 U+6243 # <cjk> [2000]
+0xEAE3 U+6256 # <cjk> [2000]
+0xEAE4 U+625A # <cjk> [2000]
+0xEAE5 U+626F # <cjk> [2000]
+0xEAE6 U+6285 # <cjk> [2000]
+0xEAE7 U+62C4 # <cjk> [2000]
+0xEAE8 U+62D6 # <cjk> [2000]
+0xEAE9 U+62FC # <cjk> [2000]
+0xEAEA U+630A # <cjk> [2000]
+0xEAEB U+6318 # <cjk> [2000]
+0xEAEC U+6339 # <cjk> [2000]
+0xEAED U+6343 # <cjk> [2000]
+0xEAEE U+6365 # <cjk> [2000]
+0xEAEF U+637C # <cjk> [2000]
+0xEAF0 U+63E5 # <cjk> [2000]
+0xEAF1 U+63ED # <cjk> [2000]
+0xEAF2 U+63F5 # <cjk> [2000]
+0xEAF3 U+6410 # <cjk> [2000]
+0xEAF4 U+6414 # <cjk> [2000]
+0xEAF5 U+6422 # <cjk> [2000]
+0xEAF6 U+6479 # <cjk> [2000]
+0xEAF7 U+6451 # <cjk> [2000]
+0xEAF8 U+6460 # <cjk> [2000]
+0xEAF9 U+646D # <cjk> [2000]
+0xEAFA U+64CE # <cjk> [2000]
+0xEAFB U+64BE # <cjk> [2000]
+0xEAFC U+64BF # <cjk> [2000]
+0xEB40 U+64C4 # <cjk> [2000]
+0xEB41 U+64CA # <cjk> [2000]
+0xEB42 U+64D0 # <cjk> [2000]
+0xEB43 U+64F7 # <cjk> [2000]
+0xEB44 U+64FB # <cjk> [2000]
+0xEB45 U+6522 # <cjk> [2000]
+0xEB46 U+6529 # <cjk> [2000]
+0xEB47 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2]
+0xEB48 U+6567 # <cjk> [2000]
+0xEB49 U+659D # <cjk> [2000]
+0xEB4A U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2]
+0xEB4B U+6600 # <cjk> [2000]
+0xEB4C U+6609 # <cjk> [2000]
+0xEB4D U+6615 # <cjk> [2000]
+0xEB4E U+661E # <cjk> [2000]
+0xEB4F U+663A # <cjk> [2000]
+0xEB50 U+6622 # <cjk> [2000]
+0xEB51 U+6624 # <cjk> [2000]
+0xEB52 U+662B # <cjk> [2000]
+0xEB53 U+6630 # <cjk> [2000]
+0xEB54 U+6631 # <cjk> [2000]
+0xEB55 U+6633 # <cjk> [2000]
+0xEB56 U+66FB # <cjk> [2000]
+0xEB57 U+6648 # <cjk> [2000]
+0xEB58 U+664C # <cjk> [2000]
+0xEB59 U+231C4 # <cjk> [2000] [Unicode3.1]
+0xEB5A U+6659 # <cjk> [2000]
+0xEB5B U+665A # <cjk> [2000]
+0xEB5C U+6661 # <cjk> [2000]
+0xEB5D U+6665 # <cjk> [2000]
+0xEB5E U+6673 # <cjk> [2000]
+0xEB5F U+6677 # <cjk> [2000]
+0xEB60 U+6678 # <cjk> [2000]
+0xEB61 U+668D # <cjk> [2000]
+0xEB62 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2]
+0xEB63 U+66A0 # <cjk> [2000]
+0xEB64 U+66B2 # <cjk> [2000]
+0xEB65 U+66BB # <cjk> [2000]
+0xEB66 U+66C6 # <cjk> [2000]
+0xEB67 U+66C8 # <cjk> [2000]
+0xEB68 U+3B22 # <cjk> [2000]
+0xEB69 U+66DB # <cjk> [2000]
+0xEB6A U+66E8 # <cjk> [2000]
+0xEB6B U+66FA # <cjk> [2000]
+0xEB6C U+6713 # <cjk> [2000]
+0xEB6D U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000]
+0xEB6E U+6733 # <cjk> [2000]
+0xEB6F U+6766 # <cjk> [2000]
+0xEB70 U+6747 # <cjk> [2000]
+0xEB71 U+6748 # <cjk> [2000]
+0xEB72 U+677B # <cjk> [2000]
+0xEB73 U+6781 # <cjk> [2000]
+0xEB74 U+6793 # <cjk> [2000]
+0xEB75 U+6798 # <cjk> [2000]
+0xEB76 U+679B # <cjk> [2000]
+0xEB77 U+67BB # <cjk> [2000]
+0xEB78 U+67F9 # <cjk> [2000]
+0xEB79 U+67C0 # <cjk> [2000]
+0xEB7A U+67D7 # <cjk> [2000]
+0xEB7B U+67FC # <cjk> [2000]
+0xEB7C U+6801 # <cjk> [2000]
+0xEB7D U+6852 # <cjk> [2000]
+0xEB7E U+681D # <cjk> [2000]
+0xEB80 U+682C # <cjk> [2000]
+0xEB81 U+6831 # <cjk> [2000]
+0xEB82 U+685B # <cjk> [2000]
+0xEB83 U+6872 # <cjk> [2000]
+0xEB84 U+6875 # <cjk> [2000]
+0xEB85 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2]
+0xEB86 U+68A3 # <cjk> [2000]
+0xEB87 U+68A5 # <cjk> [2000]
+0xEB88 U+68B2 # <cjk> [2000]
+0xEB89 U+68C8 # <cjk> [2000]
+0xEB8A U+68D0 # <cjk> [2000]
+0xEB8B U+68E8 # <cjk> [2000]
+0xEB8C U+68ED # <cjk> [2000]
+0xEB8D U+68F0 # <cjk> [2000]
+0xEB8E U+68F1 # <cjk> [2000]
+0xEB8F U+68FC # <cjk> [2000]
+0xEB90 U+690A # <cjk> [2000]
+0xEB91 U+6949 # <cjk> [2000]
+0xEB92 U+235C4 # <cjk> [2000] [Unicode3.1]
+0xEB93 U+6935 # <cjk> [2000]
+0xEB94 U+6942 # <cjk> [2000]
+0xEB95 U+6957 # <cjk> [2000]
+0xEB96 U+6963 # <cjk> [2000]
+0xEB97 U+6964 # <cjk> [2000]
+0xEB98 U+6968 # <cjk> [2000]
+0xEB99 U+6980 # <cjk> [2000]
+0xEB9A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000]
+0xEB9B U+69A5 # <cjk> [2000]
+0xEB9C U+69AD # <cjk> [2000]
+0xEB9D U+69CF # <cjk> [2000]
+0xEB9E U+3BB6 # <cjk> [2000]
+0xEB9F U+3BC3 # <cjk> [2000]
+0xEBA0 U+69E2 # <cjk> [2000]
+0xEBA1 U+69E9 # <cjk> [2000]
+0xEBA2 U+69EA # <cjk> [2000]
+0xEBA3 U+69F5 # <cjk> [2000]
+0xEBA4 U+69F6 # <cjk> [2000]
+0xEBA5 U+6A0F # <cjk> [2000]
+0xEBA6 U+6A15 # <cjk> [2000]
+0xEBA7 U+2373F # <cjk> [2000] [Unicode3.1]
+0xEBA8 U+6A3B # <cjk> [2000]
+0xEBA9 U+6A3E # <cjk> [2000]
+0xEBAA U+6A45 # <cjk> [2000]
+0xEBAB U+6A50 # <cjk> [2000]
+0xEBAC U+6A56 # <cjk> [2000]
+0xEBAD U+6A5B # <cjk> [2000]
+0xEBAE U+6A6B # <cjk> [2000]
+0xEBAF U+6A73 # <cjk> [2000]
+0xEBB0 U+23763 # <cjk> [2000] [Unicode3.1]
+0xEBB1 U+6A89 # <cjk> [2000]
+0xEBB2 U+6A94 # <cjk> [2000]
+0xEBB3 U+6A9D # <cjk> [2000]
+0xEBB4 U+6A9E # <cjk> [2000]
+0xEBB5 U+6AA5 # <cjk> [2000]
+0xEBB6 U+6AE4 # <cjk> [2000]
+0xEBB7 U+6AE7 # <cjk> [2000]
+0xEBB8 U+3C0F # <cjk> [2000]
+0xEBB9 U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000]
+0xEBBA U+6B1B # <cjk> [2000]
+0xEBBB U+6B1E # <cjk> [2000]
+0xEBBC U+6B2C # <cjk> [2000]
+0xEBBD U+6B35 # <cjk> [2000]
+0xEBBE U+6B46 # <cjk> [2000]
+0xEBBF U+6B56 # <cjk> [2000]
+0xEBC0 U+6B60 # <cjk> [2000]
+0xEBC1 U+6B65 # <cjk> [2000]
+0xEBC2 U+6B67 # <cjk> [2000]
+0xEBC3 U+6B77 # <cjk> [2000]
+0xEBC4 U+6B82 # <cjk> [2000]
+0xEBC5 U+6BA9 # <cjk> [2000]
+0xEBC6 U+6BAD # <cjk> [2000]
+0xEBC7 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000]
+0xEBC8 U+6BCF # <cjk> [2000]
+0xEBC9 U+6BD6 # <cjk> [2000]
+0xEBCA U+6BD7 # <cjk> [2000]
+0xEBCB U+6BFF # <cjk> [2000]
+0xEBCC U+6C05 # <cjk> [2000]
+0xEBCD U+6C10 # <cjk> [2000]
+0xEBCE U+6C33 # <cjk> [2000]
+0xEBCF U+6C59 # <cjk> [2000]
+0xEBD0 U+6C5C # <cjk> [2000]
+0xEBD1 U+6CAA # <cjk> [2000]
+0xEBD2 U+6C74 # <cjk> [2000]
+0xEBD3 U+6C76 # <cjk> [2000]
+0xEBD4 U+6C85 # <cjk> [2000]
+0xEBD5 U+6C86 # <cjk> [2000]
+0xEBD6 U+6C98 # <cjk> [2000]
+0xEBD7 U+6C9C # <cjk> [2000]
+0xEBD8 U+6CFB # <cjk> [2000]
+0xEBD9 U+6CC6 # <cjk> [2000]
+0xEBDA U+6CD4 # <cjk> [2000]
+0xEBDB U+6CE0 # <cjk> [2000]
+0xEBDC U+6CEB # <cjk> [2000]
+0xEBDD U+6CEE # <cjk> [2000]
+0xEBDE U+23CFE # <cjk> [2000] [Unicode3.1]
+0xEBDF U+6D04 # <cjk> [2000]
+0xEBE0 U+6D0E # <cjk> [2000]
+0xEBE1 U+6D2E # <cjk> [2000]
+0xEBE2 U+6D31 # <cjk> [2000]
+0xEBE3 U+6D39 # <cjk> [2000]
+0xEBE4 U+6D3F # <cjk> [2000]
+0xEBE5 U+6D58 # <cjk> [2000]
+0xEBE6 U+6D65 # <cjk> [2000]
+0xEBE7 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2]
+0xEBE8 U+6D82 # <cjk> [2000]
+0xEBE9 U+6D87 # <cjk> [2000]
+0xEBEA U+6D89 # <cjk> [2000]
+0xEBEB U+6D94 # <cjk> [2000]
+0xEBEC U+6DAA # <cjk> [2000]
+0xEBED U+6DAC # <cjk> [2000]
+0xEBEE U+6DBF # <cjk> [2000]
+0xEBEF U+6DC4 # <cjk> [2000]
+0xEBF0 U+6DD6 # <cjk> [2000]
+0xEBF1 U+6DDA # <cjk> [2000]
+0xEBF2 U+6DDB # <cjk> [2000]
+0xEBF3 U+6DDD # <cjk> [2000]
+0xEBF4 U+6DFC # <cjk> [2000]
+0xEBF5 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2]
+0xEBF6 U+6E34 # <cjk> [2000]
+0xEBF7 U+6E44 # <cjk> [2000]
+0xEBF8 U+6E5C # <cjk> [2000]
+0xEBF9 U+6E5E # <cjk> [2000]
+0xEBFA U+6EAB # <cjk> [2000]
+0xEBFB U+6EB1 # <cjk> [2000]
+0xEBFC U+6EC1 # <cjk> [2000]
+0xEC40 U+6EC7 # <cjk> [2000]
+0xEC41 U+6ECE # <cjk> [2000]
+0xEC42 U+6F10 # <cjk> [2000]
+0xEC43 U+6F1A # <cjk> [2000]
+0xEC44 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2]
+0xEC45 U+6F2A # <cjk> [2000]
+0xEC46 U+6F2F # <cjk> [2000]
+0xEC47 U+6F33 # <cjk> [2000]
+0xEC48 U+6F51 # <cjk> [2000]
+0xEC49 U+6F59 # <cjk> [2000]
+0xEC4A U+6F5E # <cjk> [2000]
+0xEC4B U+6F61 # <cjk> [2000]
+0xEC4C U+6F62 # <cjk> [2000]
+0xEC4D U+6F7E # <cjk> [2000]
+0xEC4E U+6F88 # <cjk> [2000]
+0xEC4F U+6F8C # <cjk> [2000]
+0xEC50 U+6F8D # <cjk> [2000]
+0xEC51 U+6F94 # <cjk> [2000]
+0xEC52 U+6FA0 # <cjk> [2000]
+0xEC53 U+6FA7 # <cjk> [2000]
+0xEC54 U+6FB6 # <cjk> [2000]
+0xEC55 U+6FBC # <cjk> [2000]
+0xEC56 U+6FC7 # <cjk> [2000]
+0xEC57 U+6FCA # <cjk> [2000]
+0xEC58 U+6FF9 # <cjk> [2000]
+0xEC59 U+6FF0 # <cjk> [2000]
+0xEC5A U+6FF5 # <cjk> [2000]
+0xEC5B U+7005 # <cjk> [2000]
+0xEC5C U+7006 # <cjk> [2000]
+0xEC5D U+7028 # <cjk> [2000]
+0xEC5E U+704A # <cjk> [2000]
+0xEC5F U+705D # <cjk> [2000]
+0xEC60 U+705E # <cjk> [2000]
+0xEC61 U+704E # <cjk> [2000]
+0xEC62 U+7064 # <cjk> [2000]
+0xEC63 U+7075 # <cjk> [2000]
+0xEC64 U+7085 # <cjk> [2000]
+0xEC65 U+70A4 # <cjk> [2000]
+0xEC66 U+70AB # <cjk> [2000]
+0xEC67 U+70B7 # <cjk> [2000]
+0xEC68 U+70D4 # <cjk> [2000]
+0xEC69 U+70D8 # <cjk> [2000]
+0xEC6A U+70E4 # <cjk> [2000]
+0xEC6B U+710F # <cjk> [2000]
+0xEC6C U+712B # <cjk> [2000]
+0xEC6D U+711E # <cjk> [2000]
+0xEC6E U+7120 # <cjk> [2000]
+0xEC6F U+712E # <cjk> [2000]
+0xEC70 U+7130 # <cjk> [2000]
+0xEC71 U+7146 # <cjk> [2000]
+0xEC72 U+7147 # <cjk> [2000]
+0xEC73 U+7151 # <cjk> [2000]
+0xEC74 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2]
+0xEC75 U+7152 # <cjk> [2000]
+0xEC76 U+715C # <cjk> [2000]
+0xEC77 U+7160 # <cjk> [2000]
+0xEC78 U+7168 # <cjk> [2000]
+0xEC79 U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000]
+0xEC7A U+7185 # <cjk> [2000]
+0xEC7B U+7187 # <cjk> [2000]
+0xEC7C U+7192 # <cjk> [2000]
+0xEC7D U+71C1 # <cjk> [2000]
+0xEC7E U+71BA # <cjk> [2000]
+0xEC80 U+71C4 # <cjk> [2000]
+0xEC81 U+71FE # <cjk> [2000]
+0xEC82 U+7200 # <cjk> [2000]
+0xEC83 U+7215 # <cjk> [2000]
+0xEC84 U+7255 # <cjk> [2000]
+0xEC85 U+7256 # <cjk> [2000]
+0xEC86 U+3E3F # <cjk> [2000]
+0xEC87 U+728D # <cjk> [2000]
+0xEC88 U+729B # <cjk> [2000]
+0xEC89 U+72BE # <cjk> [2000]
+0xEC8A U+72C0 # <cjk> [2000]
+0xEC8B U+72FB # <cjk> [2000]
+0xEC8C U+247F1 # <cjk> [2000] [Unicode3.1]
+0xEC8D U+7327 # <cjk> [2000]
+0xEC8E U+7328 # <cjk> [2000]
+0xEC8F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000]
+0xEC90 U+7350 # <cjk> [2000]
+0xEC91 U+7366 # <cjk> [2000]
+0xEC92 U+737C # <cjk> [2000]
+0xEC93 U+7395 # <cjk> [2000]
+0xEC94 U+739F # <cjk> [2000]
+0xEC95 U+73A0 # <cjk> [2000]
+0xEC96 U+73A2 # <cjk> [2000]
+0xEC97 U+73A6 # <cjk> [2000]
+0xEC98 U+73AB # <cjk> [2000]
+0xEC99 U+73C9 # <cjk> [2000]
+0xEC9A U+73CF # <cjk> [2000]
+0xEC9B U+73D6 # <cjk> [2000]
+0xEC9C U+73D9 # <cjk> [2000]
+0xEC9D U+73E3 # <cjk> [2000]
+0xEC9E U+73E9 # <cjk> [2000]
+0xEC9F U+7407 # <cjk> [2000]
+0xECA0 U+740A # <cjk> [2000]
+0xECA1 U+741A # <cjk> [2000]
+0xECA2 U+741B # <cjk> [2000]
+0xECA3 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2]
+0xECA4 U+7426 # <cjk> [2000]
+0xECA5 U+7428 # <cjk> [2000]
+0xECA6 U+742A # <cjk> [2000]
+0xECA7 U+742B # <cjk> [2000]
+0xECA8 U+742C # <cjk> [2000]
+0xECA9 U+742E # <cjk> [2000]
+0xECAA U+742F # <cjk> [2000]
+0xECAB U+7430 # <cjk> [2000]
+0xECAC U+7444 # <cjk> [2000]
+0xECAD U+7446 # <cjk> [2000]
+0xECAE U+7447 # <cjk> [2000]
+0xECAF U+744B # <cjk> [2000]
+0xECB0 U+7457 # <cjk> [2000]
+0xECB1 U+7462 # <cjk> [2000]
+0xECB2 U+746B # <cjk> [2000]
+0xECB3 U+746D # <cjk> [2000]
+0xECB4 U+7486 # <cjk> [2000]
+0xECB5 U+7487 # <cjk> [2000]
+0xECB6 U+7489 # <cjk> [2000]
+0xECB7 U+7498 # <cjk> [2000]
+0xECB8 U+749C # <cjk> [2000]
+0xECB9 U+749F # <cjk> [2000]
+0xECBA U+74A3 # <cjk> [2000]
+0xECBB U+7490 # <cjk> [2000]
+0xECBC U+74A6 # <cjk> [2000]
+0xECBD U+74A8 # <cjk> [2000]
+0xECBE U+74A9 # <cjk> [2000]
+0xECBF U+74B5 # <cjk> [2000]
+0xECC0 U+74BF # <cjk> [2000]
+0xECC1 U+74C8 # <cjk> [2000]
+0xECC2 U+74C9 # <cjk> [2000]
+0xECC3 U+74DA # <cjk> [2000]
+0xECC4 U+74FF # <cjk> [2000]
+0xECC5 U+7501 # <cjk> [2000]
+0xECC6 U+7517 # <cjk> [2000]
+0xECC7 U+752F # <cjk> [2000]
+0xECC8 U+756F # <cjk> [2000]
+0xECC9 U+7579 # <cjk> [2000]
+0xECCA U+7592 # <cjk> [2000]
+0xECCB U+3F72 # <cjk> [2000]
+0xECCC U+75CE # <cjk> [2000]
+0xECCD U+75E4 # <cjk> [2000]
+0xECCE U+7600 # <cjk> [2000]
+0xECCF U+7602 # <cjk> [2000]
+0xECD0 U+7608 # <cjk> [2000]
+0xECD1 U+7615 # <cjk> [2000]
+0xECD2 U+7616 # <cjk> [2000]
+0xECD3 U+7619 # <cjk> [2000]
+0xECD4 U+761E # <cjk> [2000]
+0xECD5 U+762D # <cjk> [2000]
+0xECD6 U+7635 # <cjk> [2000]
+0xECD7 U+7643 # <cjk> [2000]
+0xECD8 U+764B # <cjk> [2000]
+0xECD9 U+7664 # <cjk> [2000]
+0xECDA U+7665 # <cjk> [2000]
+0xECDB U+766D # <cjk> [2000]
+0xECDC U+766F # <cjk> [2000]
+0xECDD U+7671 # <cjk> [2000]
+0xECDE U+7681 # <cjk> [2000]
+0xECDF U+769B # <cjk> [2000]
+0xECE0 U+769D # <cjk> [2000]
+0xECE1 U+769E # <cjk> [2000]
+0xECE2 U+76A6 # <cjk> [2000]
+0xECE3 U+76AA # <cjk> [2000]
+0xECE4 U+76B6 # <cjk> [2000]
+0xECE5 U+76C5 # <cjk> [2000]
+0xECE6 U+76CC # <cjk> [2000]
+0xECE7 U+76CE # <cjk> [2000]
+0xECE8 U+76D4 # <cjk> [2000]
+0xECE9 U+76E6 # <cjk> [2000]
+0xECEA U+76F1 # <cjk> [2000]
+0xECEB U+76FC # <cjk> [2000]
+0xECEC U+770A # <cjk> [2000]
+0xECED U+7719 # <cjk> [2000]
+0xECEE U+7734 # <cjk> [2000]
+0xECEF U+7736 # <cjk> [2000]
+0xECF0 U+7746 # <cjk> [2000]
+0xECF1 U+774D # <cjk> [2000]
+0xECF2 U+774E # <cjk> [2000]
+0xECF3 U+775C # <cjk> [2000]
+0xECF4 U+775F # <cjk> [2000]
+0xECF5 U+7762 # <cjk> [2000]
+0xECF6 U+777A # <cjk> [2000]
+0xECF7 U+7780 # <cjk> [2000]
+0xECF8 U+7794 # <cjk> [2000]
+0xECF9 U+77AA # <cjk> [2000]
+0xECFA U+77E0 # <cjk> [2000]
+0xECFB U+782D # <cjk> [2000]
+0xECFC U+2548E # <cjk> [2000] [Unicode3.1]
+0xED40 U+7843 # <cjk> [2000]
+0xED41 U+784E # <cjk> [2000]
+0xED42 U+784F # <cjk> [2000]
+0xED43 U+7851 # <cjk> [2000]
+0xED44 U+7868 # <cjk> [2000]
+0xED45 U+786E # <cjk> [2000]
+0xED46 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2]
+0xED47 U+78B0 # <cjk> [2000]
+0xED48 U+2550E # <cjk> [2000] [Unicode3.1]
+0xED49 U+78AD # <cjk> [2000]
+0xED4A U+78E4 # <cjk> [2000]
+0xED4B U+78F2 # <cjk> [2000]
+0xED4C U+7900 # <cjk> [2000]
+0xED4D U+78F7 # <cjk> [2000]
+0xED4E U+791C # <cjk> [2000]
+0xED4F U+792E # <cjk> [2000]
+0xED50 U+7931 # <cjk> [2000]
+0xED51 U+7934 # <cjk> [2000]
+0xED52 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2]
+0xED53 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2]
+0xED54 U+7945 # <cjk> [2000]
+0xED55 U+7946 # <cjk> [2000]
+0xED56 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2]
+0xED57 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2]
+0xED58 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2]
+0xED59 U+795C # <cjk> [2000]
+0xED5A U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2]
+0xED5B U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000]
+0xED5C U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000]
+0xED5D U+7979 # <cjk> [2000]
+0xED5E U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2]
+0xED5F U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2]
+0xED60 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000]
+0xED61 U+7998 # <cjk> [2000]
+0xED62 U+79B1 # <cjk> [2000]
+0xED63 U+79B8 # <cjk> [2000]
+0xED64 U+79C8 # <cjk> [2000]
+0xED65 U+79CA # <cjk> [2000]
+0xED66 U+25771 # <cjk> [2000] [Unicode3.1]
+0xED67 U+79D4 # <cjk> [2000]
+0xED68 U+79DE # <cjk> [2000]
+0xED69 U+79EB # <cjk> [2000]
+0xED6A U+79ED # <cjk> [2000]
+0xED6B U+7A03 # <cjk> [2000]
+0xED6C U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2]
+0xED6D U+7A39 # <cjk> [2000]
+0xED6E U+7A5D # <cjk> [2000]
+0xED6F U+7A6D # <cjk> [2000]
+0xED70 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2]
+0xED71 U+7A85 # <cjk> [2000]
+0xED72 U+7AA0 # <cjk> [2000]
+0xED73 U+259C4 # <cjk> [2000] [Unicode3.1]
+0xED74 U+7AB3 # <cjk> [2000]
+0xED75 U+7ABB # <cjk> [2000]
+0xED76 U+7ACE # <cjk> [2000]
+0xED77 U+7AEB # <cjk> [2000]
+0xED78 U+7AFD # <cjk> [2000]
+0xED79 U+7B12 # <cjk> [2000]
+0xED7A U+7B2D # <cjk> [2000]
+0xED7B U+7B3B # <cjk> [2000]
+0xED7C U+7B47 # <cjk> [2000]
+0xED7D U+7B4E # <cjk> [2000]
+0xED7E U+7B60 # <cjk> [2000]
+0xED80 U+7B6D # <cjk> [2000]
+0xED81 U+7B6F # <cjk> [2000]
+0xED82 U+7B72 # <cjk> [2000]
+0xED83 U+7B9E # <cjk> [2000]
+0xED84 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2]
+0xED85 U+7BD7 # <cjk> [2000]
+0xED86 U+7BD9 # <cjk> [2000]
+0xED87 U+7C01 # <cjk> [2000]
+0xED88 U+7C31 # <cjk> [2000]
+0xED89 U+7C1E # <cjk> [2000]
+0xED8A U+7C20 # <cjk> [2000]
+0xED8B U+7C33 # <cjk> [2000]
+0xED8C U+7C36 # <cjk> [2000]
+0xED8D U+4264 # <cjk> [2000]
+0xED8E U+25DA1 # <cjk> [2000] [Unicode3.1]
+0xED8F U+7C59 # <cjk> [2000]
+0xED90 U+7C6D # <cjk> [2000]
+0xED91 U+7C79 # <cjk> [2000]
+0xED92 U+7C8F # <cjk> [2000]
+0xED93 U+7C94 # <cjk> [2000]
+0xED94 U+7CA0 # <cjk> [2000]
+0xED95 U+7CBC # <cjk> [2000]
+0xED96 U+7CD5 # <cjk> [2000]
+0xED97 U+7CD9 # <cjk> [2000]
+0xED98 U+7CDD # <cjk> [2000]
+0xED99 U+7D07 # <cjk> [2000]
+0xED9A U+7D08 # <cjk> [2000]
+0xED9B U+7D13 # <cjk> [2000]
+0xED9C U+7D1D # <cjk> [2000]
+0xED9D U+7D23 # <cjk> [2000]
+0xED9E U+7D31 # <cjk> [2000]
+0xED9F U+7D41 # <cjk> [2000]
+0xEDA0 U+7D48 # <cjk> [2000]
+0xEDA1 U+7D53 # <cjk> [2000]
+0xEDA2 U+7D5C # <cjk> [2000]
+0xEDA3 U+7D7A # <cjk> [2000]
+0xEDA4 U+7D83 # <cjk> [2000]
+0xEDA5 U+7D8B # <cjk> [2000]
+0xEDA6 U+7DA0 # <cjk> [2000]
+0xEDA7 U+7DA6 # <cjk> [2000]
+0xEDA8 U+7DC2 # <cjk> [2000]
+0xEDA9 U+7DCC # <cjk> [2000]
+0xEDAA U+7DD6 # <cjk> [2000]
+0xEDAB U+7DE3 # <cjk> [2000]
+0xEDAC U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2]
+0xEDAD U+7E28 # <cjk> [2000]
+0xEDAE U+7E08 # <cjk> [2000]
+0xEDAF U+7E11 # <cjk> [2000]
+0xEDB0 U+7E15 # <cjk> [2000]
+0xEDB1 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2]
+0xEDB2 U+7E47 # <cjk> [2000]
+0xEDB3 U+7E52 # <cjk> [2000]
+0xEDB4 U+7E61 # <cjk> [2000]
+0xEDB5 U+7E8A # <cjk> [2000]
+0xEDB6 U+7E8D # <cjk> [2000]
+0xEDB7 U+7F47 # <cjk> [2000]
+0xEDB8 U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2]
+0xEDB9 U+7F91 # <cjk> [2000]
+0xEDBA U+7F97 # <cjk> [2000]
+0xEDBB U+7FBF # <cjk> [2000]
+0xEDBC U+7FCE # <cjk> [2000]
+0xEDBD U+7FDB # <cjk> [2000]
+0xEDBE U+7FDF # <cjk> [2000]
+0xEDBF U+7FEC # <cjk> [2000]
+0xEDC0 U+7FEE # <cjk> [2000]
+0xEDC1 U+7FFA # <cjk> [2000]
+0xEDC2 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2]
+0xEDC3 U+8014 # <cjk> [2000]
+0xEDC4 U+8026 # <cjk> [2000]
+0xEDC5 U+8035 # <cjk> [2000]
+0xEDC6 U+8037 # <cjk> [2000]
+0xEDC7 U+803C # <cjk> [2000]
+0xEDC8 U+80CA # <cjk> [2000]
+0xEDC9 U+80D7 # <cjk> [2000]
+0xEDCA U+80E0 # <cjk> [2000]
+0xEDCB U+80F3 # <cjk> [2000]
+0xEDCC U+8118 # <cjk> [2000]
+0xEDCD U+814A # <cjk> [2000]
+0xEDCE U+8160 # <cjk> [2000]
+0xEDCF U+8167 # <cjk> [2000]
+0xEDD0 U+8168 # <cjk> [2000]
+0xEDD1 U+816D # <cjk> [2000]
+0xEDD2 U+81BB # <cjk> [2000]
+0xEDD3 U+81CA # <cjk> [2000]
+0xEDD4 U+81CF # <cjk> [2000]
+0xEDD5 U+81D7 # <cjk> [2000]
+0xEDD6 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2]
+0xEDD7 U+4453 # <cjk> [2000]
+0xEDD8 U+445B # <cjk> [2000]
+0xEDD9 U+8260 # <cjk> [2000]
+0xEDDA U+8274 # <cjk> [2000]
+0xEDDB U+26AFF # <cjk> [2000] [Unicode3.1]
+0xEDDC U+828E # <cjk> [2000]
+0xEDDD U+82A1 # <cjk> [2000]
+0xEDDE U+82A3 # <cjk> [2000]
+0xEDDF U+82A4 # <cjk> [2000]
+0xEDE0 U+82A9 # <cjk> [2000]
+0xEDE1 U+82AE # <cjk> [2000]
+0xEDE2 U+82B7 # <cjk> [2000]
+0xEDE3 U+82BE # <cjk> [2000]
+0xEDE4 U+82BF # <cjk> [2000]
+0xEDE5 U+82C6 # <cjk> [2000]
+0xEDE6 U+82D5 # <cjk> [2000]
+0xEDE7 U+82FD # <cjk> [2000]
+0xEDE8 U+82FE # <cjk> [2000]
+0xEDE9 U+8300 # <cjk> [2000]
+0xEDEA U+8301 # <cjk> [2000]
+0xEDEB U+8362 # <cjk> [2000]
+0xEDEC U+8322 # <cjk> [2000]
+0xEDED U+832D # <cjk> [2000]
+0xEDEE U+833A # <cjk> [2000]
+0xEDEF U+8343 # <cjk> [2000]
+0xEDF0 U+8347 # <cjk> [2000]
+0xEDF1 U+8351 # <cjk> [2000]
+0xEDF2 U+8355 # <cjk> [2000]
+0xEDF3 U+837D # <cjk> [2000]
+0xEDF4 U+8386 # <cjk> [2000]
+0xEDF5 U+8392 # <cjk> [2000]
+0xEDF6 U+8398 # <cjk> [2000]
+0xEDF7 U+83A7 # <cjk> [2000]
+0xEDF8 U+83A9 # <cjk> [2000]
+0xEDF9 U+83BF # <cjk> [2000]
+0xEDFA U+83C0 # <cjk> [2000]
+0xEDFB U+83C7 # <cjk> [2000]
+0xEDFC U+83CF # <cjk> [2000]
+0xEE40 U+83D1 # <cjk> [2000]
+0xEE41 U+83E1 # <cjk> [2000]
+0xEE42 U+83EA # <cjk> [2000]
+0xEE43 U+8401 # <cjk> [2000]
+0xEE44 U+8406 # <cjk> [2000]
+0xEE45 U+840A # <cjk> [2000]
+0xEE46 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2]
+0xEE47 U+8448 # <cjk> [2000]
+0xEE48 U+845F # <cjk> [2000]
+0xEE49 U+8470 # <cjk> [2000]
+0xEE4A U+8473 # <cjk> [2000]
+0xEE4B U+8485 # <cjk> [2000]
+0xEE4C U+849E # <cjk> [2000]
+0xEE4D U+84AF # <cjk> [2000]
+0xEE4E U+84B4 # <cjk> [2000]
+0xEE4F U+84BA # <cjk> [2000]
+0xEE50 U+84C0 # <cjk> [2000]
+0xEE51 U+84C2 # <cjk> [2000]
+0xEE52 U+26E40 # <cjk> [2000] [Unicode3.1]
+0xEE53 U+8532 # <cjk> [2000]
+0xEE54 U+851E # <cjk> [2000]
+0xEE55 U+8523 # <cjk> [2000]
+0xEE56 U+852F # <cjk> [2000]
+0xEE57 U+8559 # <cjk> [2000]
+0xEE58 U+8564 # <cjk> [2000]
+0xEE59 U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000]
+0xEE5A U+85AD # <cjk> [2000]
+0xEE5B U+857A # <cjk> [2000]
+0xEE5C U+858C # <cjk> [2000]
+0xEE5D U+858F # <cjk> [2000]
+0xEE5E U+85A2 # <cjk> [2000]
+0xEE5F U+85B0 # <cjk> [2000]
+0xEE60 U+85CB # <cjk> [2000]
+0xEE61 U+85CE # <cjk> [2000]
+0xEE62 U+85ED # <cjk> [2000]
+0xEE63 U+8612 # <cjk> [2000]
+0xEE64 U+85FF # <cjk> [2000]
+0xEE65 U+8604 # <cjk> [2000]
+0xEE66 U+8605 # <cjk> [2000]
+0xEE67 U+8610 # <cjk> [2000]
+0xEE68 U+270F4 # <cjk> [2000] [Unicode3.1]
+0xEE69 U+8618 # <cjk> [2000]
+0xEE6A U+8629 # <cjk> [2000]
+0xEE6B U+8638 # <cjk> [2000]
+0xEE6C U+8657 # <cjk> [2000]
+0xEE6D U+865B # <cjk> [2000]
+0xEE6E U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000]
+0xEE6F U+8662 # <cjk> [2000]
+0xEE70 U+459D # <cjk> [2000]
+0xEE71 U+866C # <cjk> [2000]
+0xEE72 U+8675 # <cjk> [2000]
+0xEE73 U+8698 # <cjk> [2000]
+0xEE74 U+86B8 # <cjk> [2000]
+0xEE75 U+86FA # <cjk> [2000]
+0xEE76 U+86FC # <cjk> [2000]
+0xEE77 U+86FD # <cjk> [2000]
+0xEE78 U+870B # <cjk> [2000]
+0xEE79 U+8771 # <cjk> [2000]
+0xEE7A U+8787 # <cjk> [2000]
+0xEE7B U+8788 # <cjk> [2000]
+0xEE7C U+87AC # <cjk> [2000]
+0xEE7D U+87AD # <cjk> [2000]
+0xEE7E U+87B5 # <cjk> [2000]
+0xEE80 U+45EA # <cjk> [2000]
+0xEE81 U+87D6 # <cjk> [2000]
+0xEE82 U+87EC # <cjk> [2000]
+0xEE83 U+8806 # <cjk> [2000]
+0xEE84 U+880A # <cjk> [2000]
+0xEE85 U+8810 # <cjk> [2000]
+0xEE86 U+8814 # <cjk> [2000]
+0xEE87 U+881F # <cjk> [2000]
+0xEE88 U+8898 # <cjk> [2000]
+0xEE89 U+88AA # <cjk> [2000]
+0xEE8A U+88CA # <cjk> [2000]
+0xEE8B U+88CE # <cjk> [2000]
+0xEE8C U+27684 # <cjk> [2000] [Unicode3.1]
+0xEE8D U+88F5 # <cjk> [2000]
+0xEE8E U+891C # <cjk> [2000]
+0xEE8F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2]
+0xEE90 U+8918 # <cjk> [2000]
+0xEE91 U+8919 # <cjk> [2000]
+0xEE92 U+891A # <cjk> [2000]
+0xEE93 U+8927 # <cjk> [2000]
+0xEE94 U+8930 # <cjk> [2000]
+0xEE95 U+8932 # <cjk> [2000]
+0xEE96 U+8939 # <cjk> [2000]
+0xEE97 U+8940 # <cjk> [2000]
+0xEE98 U+8994 # <cjk> [2000]
+0xEE99 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2]
+0xEE9A U+89D4 # <cjk> [2000]
+0xEE9B U+89E5 # <cjk> [2000]
+0xEE9C U+89F6 # <cjk> [2000]
+0xEE9D U+8A12 # <cjk> [2000]
+0xEE9E U+8A15 # <cjk> [2000]
+0xEE9F U+8A22 # <cjk> [2000]
+0xEEA0 U+8A37 # <cjk> [2000]
+0xEEA1 U+8A47 # <cjk> [2000]
+0xEEA2 U+8A4E # <cjk> [2000]
+0xEEA3 U+8A5D # <cjk> [2000]
+0xEEA4 U+8A61 # <cjk> [2000]
+0xEEA5 U+8A75 # <cjk> [2000]
+0xEEA6 U+8A79 # <cjk> [2000]
+0xEEA7 U+8AA7 # <cjk> [2000]
+0xEEA8 U+8AD0 # <cjk> [2000]
+0xEEA9 U+8ADF # <cjk> [2000]
+0xEEAA U+8AF4 # <cjk> [2000]
+0xEEAB U+8AF6 # <cjk> [2000]
+0xEEAC U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000]
+0xEEAD U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2]
+0xEEAE U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2]
+0xEEAF U+8B46 # <cjk> [2000]
+0xEEB0 U+8B54 # <cjk> [2000]
+0xEEB1 U+8B59 # <cjk> [2000]
+0xEEB2 U+8B69 # <cjk> [2000]
+0xEEB3 U+8B9D # <cjk> [2000]
+0xEEB4 U+8C49 # <cjk> [2000]
+0xEEB5 U+8C68 # <cjk> [2000]
+0xEEB6 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2]
+0xEEB7 U+8CE1 # <cjk> [2000]
+0xEEB8 U+8CF4 # <cjk> [2000]
+0xEEB9 U+8CF8 # <cjk> [2000]
+0xEEBA U+8CFE # <cjk> [2000]
+0xEEBB U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2]
+0xEEBC U+8D12 # <cjk> [2000]
+0xEEBD U+8D1B # <cjk> [2000]
+0xEEBE U+8DAF # <cjk> [2000]
+0xEEBF U+8DCE # <cjk> [2000]
+0xEEC0 U+8DD1 # <cjk> [2000]
+0xEEC1 U+8DD7 # <cjk> [2000]
+0xEEC2 U+8E20 # <cjk> [2000]
+0xEEC3 U+8E23 # <cjk> [2000]
+0xEEC4 U+8E3D # <cjk> [2000]
+0xEEC5 U+8E70 # <cjk> [2000]
+0xEEC6 U+8E7B # <cjk> [2000]
+0xEEC7 U+28277 # <cjk> [2000] [Unicode3.1]
+0xEEC8 U+8EC0 # <cjk> [2000]
+0xEEC9 U+4844 # <cjk> [2000]
+0xEECA U+8EFA # <cjk> [2000]
+0xEECB U+8F1E # <cjk> [2000]
+0xEECC U+8F2D # <cjk> [2000]
+0xEECD U+8F36 # <cjk> [2000]
+0xEECE U+8F54 # <cjk> [2000]
+0xEECF U+283CD # <cjk> [2000] [Unicode3.1]
+0xEED0 U+8FA6 # <cjk> [2000]
+0xEED1 U+8FB5 # <cjk> [2000]
+0xEED2 U+8FE4 # <cjk> [2000]
+0xEED3 U+8FE8 # <cjk> [2000]
+0xEED4 U+8FEE # <cjk> [2000]
+0xEED5 U+9008 # <cjk> [2000]
+0xEED6 U+902D # <cjk> [2000]
+0xEED7 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2]
+0xEED8 U+9088 # <cjk> [2000]
+0xEED9 U+9095 # <cjk> [2000]
+0xEEDA U+9097 # <cjk> [2000]
+0xEEDB U+9099 # <cjk> [2000]
+0xEEDC U+909B # <cjk> [2000]
+0xEEDD U+90A2 # <cjk> [2000]
+0xEEDE U+90B3 # <cjk> [2000]
+0xEEDF U+90BE # <cjk> [2000]
+0xEEE0 U+90C4 # <cjk> [2000]
+0xEEE1 U+90C5 # <cjk> [2000]
+0xEEE2 U+90C7 # <cjk> [2000]
+0xEEE3 U+90D7 # <cjk> [2000]
+0xEEE4 U+90DD # <cjk> [2000]
+0xEEE5 U+90DE # <cjk> [2000]
+0xEEE6 U+90EF # <cjk> [2000]
+0xEEE7 U+90F4 # <cjk> [2000]
+0xEEE8 U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000]
+0xEEE9 U+9114 # <cjk> [2000]
+0xEEEA U+9115 # <cjk> [2000]
+0xEEEB U+9116 # <cjk> [2000]
+0xEEEC U+9122 # <cjk> [2000]
+0xEEED U+9123 # <cjk> [2000]
+0xEEEE U+9127 # <cjk> [2000]
+0xEEEF U+912F # <cjk> [2000]
+0xEEF0 U+9131 # <cjk> [2000]
+0xEEF1 U+9134 # <cjk> [2000]
+0xEEF2 U+913D # <cjk> [2000]
+0xEEF3 U+9148 # <cjk> [2000]
+0xEEF4 U+915B # <cjk> [2000]
+0xEEF5 U+9183 # <cjk> [2000]
+0xEEF6 U+919E # <cjk> [2000]
+0xEEF7 U+91AC # <cjk> [2000]
+0xEEF8 U+91B1 # <cjk> [2000]
+0xEEF9 U+91BC # <cjk> [2000]
+0xEEFA U+91D7 # <cjk> [2000]
+0xEEFB U+91FB # <cjk> [2000]
+0xEEFC U+91E4 # <cjk> [2000]
+0xEF40 U+91E5 # <cjk> [2000]
+0xEF41 U+91ED # <cjk> [2000]
+0xEF42 U+91F1 # <cjk> [2000]
+0xEF43 U+9207 # <cjk> [2000]
+0xEF44 U+9210 # <cjk> [2000]
+0xEF45 U+9238 # <cjk> [2000]
+0xEF46 U+9239 # <cjk> [2000]
+0xEF47 U+923A # <cjk> [2000]
+0xEF48 U+923C # <cjk> [2000]
+0xEF49 U+9240 # <cjk> [2000]
+0xEF4A U+9243 # <cjk> [2000]
+0xEF4B U+924F # <cjk> [2000]
+0xEF4C U+9278 # <cjk> [2000]
+0xEF4D U+9288 # <cjk> [2000]
+0xEF4E U+92C2 # <cjk> [2000]
+0xEF4F U+92CB # <cjk> [2000]
+0xEF50 U+92CC # <cjk> [2000]
+0xEF51 U+92D3 # <cjk> [2000]
+0xEF52 U+92E0 # <cjk> [2000]
+0xEF53 U+92FF # <cjk> [2000]
+0xEF54 U+9304 # <cjk> [2000]
+0xEF55 U+931F # <cjk> [2000]
+0xEF56 U+9321 # <cjk> [2000]
+0xEF57 U+9325 # <cjk> [2000]
+0xEF58 U+9348 # <cjk> [2000]
+0xEF59 U+9349 # <cjk> [2000]
+0xEF5A U+934A # <cjk> [2000]
+0xEF5B U+9364 # <cjk> [2000]
+0xEF5C U+9365 # <cjk> [2000]
+0xEF5D U+936A # <cjk> [2000]
+0xEF5E U+9370 # <cjk> [2000]
+0xEF5F U+939B # <cjk> [2000]
+0xEF60 U+93A3 # <cjk> [2000]
+0xEF61 U+93BA # <cjk> [2000]
+0xEF62 U+93C6 # <cjk> [2000]
+0xEF63 U+93DE # <cjk> [2000]
+0xEF64 U+93DF # <cjk> [2000]
+0xEF65 U+9404 # <cjk> [2000]
+0xEF66 U+93FD # <cjk> [2000]
+0xEF67 U+9433 # <cjk> [2000]
+0xEF68 U+944A # <cjk> [2000]
+0xEF69 U+9463 # <cjk> [2000]
+0xEF6A U+946B # <cjk> [2000]
+0xEF6B U+9471 # <cjk> [2000]
+0xEF6C U+9472 # <cjk> [2000]
+0xEF6D U+958E # <cjk> [2000]
+0xEF6E U+959F # <cjk> [2000]
+0xEF6F U+95A6 # <cjk> [2000]
+0xEF70 U+95A9 # <cjk> [2000]
+0xEF71 U+95AC # <cjk> [2000]
+0xEF72 U+95B6 # <cjk> [2000]
+0xEF73 U+95BD # <cjk> [2000]
+0xEF74 U+95CB # <cjk> [2000]
+0xEF75 U+95D0 # <cjk> [2000]
+0xEF76 U+95D3 # <cjk> [2000]
+0xEF77 U+49B0 # <cjk> [2000]
+0xEF78 U+95DA # <cjk> [2000]
+0xEF79 U+95DE # <cjk> [2000]
+0xEF7A U+9658 # <cjk> [2000]
+0xEF7B U+9684 # <cjk> [2000]
+0xEF7C U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000]
+0xEF7D U+969D # <cjk> [2000]
+0xEF7E U+96A4 # <cjk> [2000]
+0xEF80 U+96A5 # <cjk> [2000]
+0xEF81 U+96D2 # <cjk> [2000]
+0xEF82 U+96DE # <cjk> [2000]
+0xEF83 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2]
+0xEF84 U+96E9 # <cjk> [2000]
+0xEF85 U+96EF # <cjk> [2000]
+0xEF86 U+9733 # <cjk> [2000]
+0xEF87 U+973B # <cjk> [2000]
+0xEF88 U+974D # <cjk> [2000]
+0xEF89 U+974E # <cjk> [2000]
+0xEF8A U+974F # <cjk> [2000]
+0xEF8B U+975A # <cjk> [2000]
+0xEF8C U+976E # <cjk> [2000]
+0xEF8D U+9773 # <cjk> [2000]
+0xEF8E U+9795 # <cjk> [2000]
+0xEF8F U+97AE # <cjk> [2000]
+0xEF90 U+97BA # <cjk> [2000]
+0xEF91 U+97C1 # <cjk> [2000]
+0xEF92 U+97C9 # <cjk> [2000]
+0xEF93 U+97DE # <cjk> [2000]
+0xEF94 U+97DB # <cjk> [2000]
+0xEF95 U+97F4 # <cjk> [2000]
+0xEF96 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2]
+0xEF97 U+980A # <cjk> [2000]
+0xEF98 U+981E # <cjk> [2000]
+0xEF99 U+982B # <cjk> [2000]
+0xEF9A U+9830 # <cjk> [2000]
+0xEF9B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2]
+0xEF9C U+9852 # <cjk> [2000]
+0xEF9D U+9853 # <cjk> [2000]
+0xEF9E U+9856 # <cjk> [2000]
+0xEF9F U+9857 # <cjk> [2000]
+0xEFA0 U+9859 # <cjk> [2000]
+0xEFA1 U+985A # <cjk> [2000]
+0xEFA2 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000]
+0xEFA3 U+9865 # <cjk> [2000]
+0xEFA4 U+986C # <cjk> [2000]
+0xEFA5 U+98BA # <cjk> [2000]
+0xEFA6 U+98C8 # <cjk> [2000]
+0xEFA7 U+98E7 # <cjk> [2000]
+0xEFA8 U+9958 # <cjk> [2000]
+0xEFA9 U+999E # <cjk> [2000]
+0xEFAA U+9A02 # <cjk> [2000]
+0xEFAB U+9A03 # <cjk> [2000]
+0xEFAC U+9A24 # <cjk> [2000]
+0xEFAD U+9A2D # <cjk> [2000]
+0xEFAE U+9A2E # <cjk> [2000]
+0xEFAF U+9A38 # <cjk> [2000]
+0xEFB0 U+9A4A # <cjk> [2000]
+0xEFB1 U+9A4E # <cjk> [2000]
+0xEFB2 U+9A52 # <cjk> [2000]
+0xEFB3 U+9AB6 # <cjk> [2000]
+0xEFB4 U+9AC1 # <cjk> [2000]
+0xEFB5 U+9AC3 # <cjk> [2000]
+0xEFB6 U+9ACE # <cjk> [2000]
+0xEFB7 U+9AD6 # <cjk> [2000]
+0xEFB8 U+9AF9 # <cjk> [2000]
+0xEFB9 U+9B02 # <cjk> [2000]
+0xEFBA U+9B08 # <cjk> [2000]
+0xEFBB U+9B20 # <cjk> [2000]
+0xEFBC U+4C17 # <cjk> [2000]
+0xEFBD U+9B2D # <cjk> [2000]
+0xEFBE U+9B5E # <cjk> [2000]
+0xEFBF U+9B79 # <cjk> [2000]
+0xEFC0 U+9B66 # <cjk> [2000]
+0xEFC1 U+9B72 # <cjk> [2000]
+0xEFC2 U+9B75 # <cjk> [2000]
+0xEFC3 U+9B84 # <cjk> [2000]
+0xEFC4 U+9B8A # <cjk> [2000]
+0xEFC5 U+9B8F # <cjk> [2000]
+0xEFC6 U+9B9E # <cjk> [2000]
+0xEFC7 U+9BA7 # <cjk> [2000]
+0xEFC8 U+9BC1 # <cjk> [2000]
+0xEFC9 U+9BCE # <cjk> [2000]
+0xEFCA U+9BE5 # <cjk> [2000]
+0xEFCB U+9BF8 # <cjk> [2000]
+0xEFCC U+9BFD # <cjk> [2000]
+0xEFCD U+9C00 # <cjk> [2000]
+0xEFCE U+9C23 # <cjk> [2000]
+0xEFCF U+9C41 # <cjk> [2000]
+0xEFD0 U+9C4F # <cjk> [2000]
+0xEFD1 U+9C50 # <cjk> [2000]
+0xEFD2 U+9C53 # <cjk> [2000]
+0xEFD3 U+9C63 # <cjk> [2000]
+0xEFD4 U+9C65 # <cjk> [2000]
+0xEFD5 U+9C77 # <cjk> [2000]
+0xEFD6 U+9D1D # <cjk> [2000]
+0xEFD7 U+9D1E # <cjk> [2000]
+0xEFD8 U+9D43 # <cjk> [2000]
+0xEFD9 U+9D47 # <cjk> [2000]
+0xEFDA U+9D52 # <cjk> [2000]
+0xEFDB U+9D63 # <cjk> [2000]
+0xEFDC U+9D70 # <cjk> [2000]
+0xEFDD U+9D7C # <cjk> [2000]
+0xEFDE U+9D8A # <cjk> [2000]
+0xEFDF U+9D96 # <cjk> [2000]
+0xEFE0 U+9DC0 # <cjk> [2000]
+0xEFE1 U+9DAC # <cjk> [2000]
+0xEFE2 U+9DBC # <cjk> [2000]
+0xEFE3 U+9DD7 # <cjk> [2000]
+0xEFE4 U+2A190 # <cjk> [2000] [Unicode3.1]
+0xEFE5 U+9DE7 # <cjk> [2000]
+0xEFE6 U+9E07 # <cjk> [2000]
+0xEFE7 U+9E15 # <cjk> [2000]
+0xEFE8 U+9E7C # <cjk> [2000]
+0xEFE9 U+9E9E # <cjk> [2000]
+0xEFEA U+9EA4 # <cjk> [2000]
+0xEFEB U+9EAC # <cjk> [2000]
+0xEFEC U+9EAF # <cjk> [2000]
+0xEFED U+9EB4 # <cjk> [2000]
+0xEFEE U+9EB5 # <cjk> [2000]
+0xEFEF U+9EC3 # <cjk> [2000]
+0xEFF0 U+9ED1 # <cjk> [2000]
+0xEFF1 U+9F10 # <cjk> [2000]
+0xEFF2 U+9F39 # <cjk> [2000]
+0xEFF3 U+9F57 # <cjk> [2000]
+0xEFF4 U+9F90 # <cjk> [2000]
+0xEFF5 U+9F94 # <cjk> [2000]
+0xEFF6 U+9F97 # <cjk> [2000]
+0xEFF7 U+9FA2 # <cjk> [2000]
+0xEFF8 U+59F8 # <cjk> [2004]
+0xEFF9 U+5C5B # <cjk> [2004]
+0xEFFA U+5E77 # <cjk> [2004]
+0xEFFB U+7626 # <cjk> [2004]
+0xEFFC U+7E6B # <cjk> [2004]
+0xF040 U+20089 # <cjk> [2000] [Unicode3.1]
+0xF041 U+4E02 # <cjk> [2000]
+0xF042 U+4E0F # <cjk> [2000]
+0xF043 U+4E12 # <cjk> [2000]
+0xF044 U+4E29 # <cjk> [2000]
+0xF045 U+4E2B # <cjk> [2000]
+0xF046 U+4E2E # <cjk> [2000]
+0xF047 U+4E40 # <cjk> [2000]
+0xF048 U+4E47 # <cjk> [2000]
+0xF049 U+4E48 # <cjk> [2000]
+0xF04A U+200A2 # <cjk> [2000] [Unicode3.1]
+0xF04B U+4E51 # <cjk> [2000]
+0xF04C U+3406 # <cjk> [2000]
+0xF04D U+200A4 # <cjk> [2000] [Unicode3.1]
+0xF04E U+4E5A # <cjk> [2000]
+0xF04F U+4E69 # <cjk> [2000]
+0xF050 U+4E9D # <cjk> [2000]
+0xF051 U+342C # <cjk> [2000]
+0xF052 U+342E # <cjk> [2000]
+0xF053 U+4EB9 # <cjk> [2000]
+0xF054 U+4EBB # <cjk> [2000]
+0xF055 U+201A2 # <cjk> [2000] [Unicode3.1]
+0xF056 U+4EBC # <cjk> [2000]
+0xF057 U+4EC3 # <cjk> [2000]
+0xF058 U+4EC8 # <cjk> [2000]
+0xF059 U+4ED0 # <cjk> [2000]
+0xF05A U+4EEB # <cjk> [2000]
+0xF05B U+4EDA # <cjk> [2000]
+0xF05C U+4EF1 # <cjk> [2000]
+0xF05D U+4EF5 # <cjk> [2000]
+0xF05E U+4F00 # <cjk> [2000]
+0xF05F U+4F16 # <cjk> [2000]
+0xF060 U+4F64 # <cjk> [2000]
+0xF061 U+4F37 # <cjk> [2000]
+0xF062 U+4F3E # <cjk> [2000]
+0xF063 U+4F54 # <cjk> [2000]
+0xF064 U+4F58 # <cjk> [2000]
+0xF065 U+20213 # <cjk> [2000] [Unicode3.1]
+0xF066 U+4F77 # <cjk> [2000]
+0xF067 U+4F78 # <cjk> [2000]
+0xF068 U+4F7A # <cjk> [2000]
+0xF069 U+4F7D # <cjk> [2000]
+0xF06A U+4F82 # <cjk> [2000]
+0xF06B U+4F85 # <cjk> [2000]
+0xF06C U+4F92 # <cjk> [2000]
+0xF06D U+4F9A # <cjk> [2000]
+0xF06E U+4FE6 # <cjk> [2000]
+0xF06F U+4FB2 # <cjk> [2000]
+0xF070 U+4FBE # <cjk> [2000]
+0xF071 U+4FC5 # <cjk> [2000]
+0xF072 U+4FCB # <cjk> [2000]
+0xF073 U+4FCF # <cjk> [2000]
+0xF074 U+4FD2 # <cjk> [2000]
+0xF075 U+346A # <cjk> [2000]
+0xF076 U+4FF2 # <cjk> [2000]
+0xF077 U+5000 # <cjk> [2000]
+0xF078 U+5010 # <cjk> [2000]
+0xF079 U+5013 # <cjk> [2000]
+0xF07A U+501C # <cjk> [2000]
+0xF07B U+501E # <cjk> [2000]
+0xF07C U+5022 # <cjk> [2000]
+0xF07D U+3468 # <cjk> [2000]
+0xF07E U+5042 # <cjk> [2000]
+0xF080 U+5046 # <cjk> [2000]
+0xF081 U+504E # <cjk> [2000]
+0xF082 U+5053 # <cjk> [2000]
+0xF083 U+5057 # <cjk> [2000]
+0xF084 U+5063 # <cjk> [2000]
+0xF085 U+5066 # <cjk> [2000]
+0xF086 U+506A # <cjk> [2000]
+0xF087 U+5070 # <cjk> [2000]
+0xF088 U+50A3 # <cjk> [2000]
+0xF089 U+5088 # <cjk> [2000]
+0xF08A U+5092 # <cjk> [2000]
+0xF08B U+5093 # <cjk> [2000]
+0xF08C U+5095 # <cjk> [2000]
+0xF08D U+5096 # <cjk> [2000]
+0xF08E U+509C # <cjk> [2000]
+0xF08F U+50AA # <cjk> [2000]
+0xF090 U+2032B # <cjk> [2000] [Unicode3.1]
+0xF091 U+50B1 # <cjk> [2000]
+0xF092 U+50BA # <cjk> [2000]
+0xF093 U+50BB # <cjk> [2000]
+0xF094 U+50C4 # <cjk> [2000]
+0xF095 U+50C7 # <cjk> [2000]
+0xF096 U+50F3 # <cjk> [2000]
+0xF097 U+20381 # <cjk> [2000] [Unicode3.1]
+0xF098 U+50CE # <cjk> [2000]
+0xF099 U+20371 # <cjk> [2000] [Unicode3.1]
+0xF09A U+50D4 # <cjk> [2000]
+0xF09B U+50D9 # <cjk> [2000]
+0xF09C U+50E1 # <cjk> [2000]
+0xF09D U+50E9 # <cjk> [2000]
+0xF09E U+3492 # <cjk> [2000]
+0xF140 U+5108 # <cjk> [2000]
+0xF141 U+203F9 # <cjk> [2000] [Unicode3.1]
+0xF142 U+5117 # <cjk> [2000]
+0xF143 U+511B # <cjk> [2000]
+0xF144 U+2044A # <cjk> [2000] [Unicode3.1]
+0xF145 U+5160 # <cjk> [2000]
+0xF146 U+20509 # <cjk> [2000] [Unicode3.1]
+0xF147 U+5173 # <cjk> [2000]
+0xF148 U+5183 # <cjk> [2000]
+0xF149 U+518B # <cjk> [2000]
+0xF14A U+34BC # <cjk> [2000]
+0xF14B U+5198 # <cjk> [2000]
+0xF14C U+51A3 # <cjk> [2000]
+0xF14D U+51AD # <cjk> [2000]
+0xF14E U+34C7 # <cjk> [2000]
+0xF14F U+51BC # <cjk> [2000]
+0xF150 U+205D6 # <cjk> [2000] [Unicode3.1]
+0xF151 U+20628 # <cjk> [2000] [Unicode3.1]
+0xF152 U+51F3 # <cjk> [2000]
+0xF153 U+51F4 # <cjk> [2000]
+0xF154 U+5202 # <cjk> [2000]
+0xF155 U+5212 # <cjk> [2000]
+0xF156 U+5216 # <cjk> [2000]
+0xF157 U+2074F # <cjk> [2000] [Unicode3.1]
+0xF158 U+5255 # <cjk> [2000]
+0xF159 U+525C # <cjk> [2000]
+0xF15A U+526C # <cjk> [2000]
+0xF15B U+5277 # <cjk> [2000]
+0xF15C U+5284 # <cjk> [2000]
+0xF15D U+5282 # <cjk> [2000]
+0xF15E U+20807 # <cjk> [2000] [Unicode3.1]
+0xF15F U+5298 # <cjk> [2000]
+0xF160 U+2083A # <cjk> [2000] [Unicode3.1]
+0xF161 U+52A4 # <cjk> [2000]
+0xF162 U+52A6 # <cjk> [2000]
+0xF163 U+52AF # <cjk> [2000]
+0xF164 U+52BA # <cjk> [2000]
+0xF165 U+52BB # <cjk> [2000]
+0xF166 U+52CA # <cjk> [2000]
+0xF167 U+351F # <cjk> [2000]
+0xF168 U+52D1 # <cjk> [2000]
+0xF169 U+208B9 # <cjk> [2000] [Unicode3.1]
+0xF16A U+52F7 # <cjk> [2000]
+0xF16B U+530A # <cjk> [2000]
+0xF16C U+530B # <cjk> [2000]
+0xF16D U+5324 # <cjk> [2000]
+0xF16E U+5335 # <cjk> [2000]
+0xF16F U+533E # <cjk> [2000]
+0xF170 U+5342 # <cjk> [2000]
+0xF171 U+2097C # <cjk> [2000] [Unicode3.1]
+0xF172 U+2099D # <cjk> [2000] [Unicode3.1]
+0xF173 U+5367 # <cjk> [2000]
+0xF174 U+536C # <cjk> [2000]
+0xF175 U+537A # <cjk> [2000]
+0xF176 U+53A4 # <cjk> [2000]
+0xF177 U+53B4 # <cjk> [2000]
+0xF178 U+20AD3 # <cjk> [2000] [Unicode3.1]
+0xF179 U+53B7 # <cjk> [2000]
+0xF17A U+53C0 # <cjk> [2000]
+0xF17B U+20B1D # <cjk> [2000] [Unicode3.1]
+0xF17C U+355D # <cjk> [2000]
+0xF17D U+355E # <cjk> [2000]
+0xF17E U+53D5 # <cjk> [2000]
+0xF180 U+53DA # <cjk> [2000]
+0xF181 U+3563 # <cjk> [2000]
+0xF182 U+53F4 # <cjk> [2000]
+0xF183 U+53F5 # <cjk> [2000]
+0xF184 U+5455 # <cjk> [2000]
+0xF185 U+5424 # <cjk> [2000]
+0xF186 U+5428 # <cjk> [2000]
+0xF187 U+356E # <cjk> [2000]
+0xF188 U+5443 # <cjk> [2000]
+0xF189 U+5462 # <cjk> [2000]
+0xF18A U+5466 # <cjk> [2000]
+0xF18B U+546C # <cjk> [2000]
+0xF18C U+548A # <cjk> [2000]
+0xF18D U+548D # <cjk> [2000]
+0xF18E U+5495 # <cjk> [2000]
+0xF18F U+54A0 # <cjk> [2000]
+0xF190 U+54A6 # <cjk> [2000]
+0xF191 U+54AD # <cjk> [2000]
+0xF192 U+54AE # <cjk> [2000]
+0xF193 U+54B7 # <cjk> [2000]
+0xF194 U+54BA # <cjk> [2000]
+0xF195 U+54BF # <cjk> [2000]
+0xF196 U+54C3 # <cjk> [2000]
+0xF197 U+20D45 # <cjk> [2000] [Unicode3.1]
+0xF198 U+54EC # <cjk> [2000]
+0xF199 U+54EF # <cjk> [2000]
+0xF19A U+54F1 # <cjk> [2000]
+0xF19B U+54F3 # <cjk> [2000]
+0xF19C U+5500 # <cjk> [2000]
+0xF19D U+5501 # <cjk> [2000]
+0xF19E U+5509 # <cjk> [2000]
+0xF19F U+553C # <cjk> [2000]
+0xF1A0 U+5541 # <cjk> [2000]
+0xF1A1 U+35A6 # <cjk> [2000]
+0xF1A2 U+5547 # <cjk> [2000]
+0xF1A3 U+554A # <cjk> [2000]
+0xF1A4 U+35A8 # <cjk> [2000]
+0xF1A5 U+5560 # <cjk> [2000]
+0xF1A6 U+5561 # <cjk> [2000]
+0xF1A7 U+5564 # <cjk> [2000]
+0xF1A8 U+20DE1 # <cjk> [2000] [Unicode3.1]
+0xF1A9 U+557D # <cjk> [2000]
+0xF1AA U+5582 # <cjk> [2000]
+0xF1AB U+5588 # <cjk> [2000]
+0xF1AC U+5591 # <cjk> [2000]
+0xF1AD U+35C5 # <cjk> [2000]
+0xF1AE U+55D2 # <cjk> [2000]
+0xF1AF U+20E95 # <cjk> [2000] [Unicode3.1]
+0xF1B0 U+20E6D # <cjk> [2000] [Unicode3.1]
+0xF1B1 U+55BF # <cjk> [2000]
+0xF1B2 U+55C9 # <cjk> [2000]
+0xF1B3 U+55CC # <cjk> [2000]
+0xF1B4 U+55D1 # <cjk> [2000]
+0xF1B5 U+55DD # <cjk> [2000]
+0xF1B6 U+35DA # <cjk> [2000]
+0xF1B7 U+55E2 # <cjk> [2000]
+0xF1B8 U+20E64 # <cjk> [2000] [Unicode3.1]
+0xF1B9 U+55E9 # <cjk> [2000]
+0xF1BA U+5628 # <cjk> [2000]
+0xF1BB U+20F5F # <cjk> [2000] [Unicode3.1]
+0xF1BC U+5607 # <cjk> [2000]
+0xF1BD U+5610 # <cjk> [2000]
+0xF1BE U+5630 # <cjk> [2000]
+0xF1BF U+5637 # <cjk> [2000]
+0xF1C0 U+35F4 # <cjk> [2000]
+0xF1C1 U+563D # <cjk> [2000]
+0xF1C2 U+563F # <cjk> [2000]
+0xF1C3 U+5640 # <cjk> [2000]
+0xF1C4 U+5647 # <cjk> [2000]
+0xF1C5 U+565E # <cjk> [2000]
+0xF1C6 U+5660 # <cjk> [2000]
+0xF1C7 U+566D # <cjk> [2000]
+0xF1C8 U+3605 # <cjk> [2000]
+0xF1C9 U+5688 # <cjk> [2000]
+0xF1CA U+568C # <cjk> [2000]
+0xF1CB U+5695 # <cjk> [2000]
+0xF1CC U+569A # <cjk> [2000]
+0xF1CD U+569D # <cjk> [2000]
+0xF1CE U+56A8 # <cjk> [2000]
+0xF1CF U+56AD # <cjk> [2000]
+0xF1D0 U+56B2 # <cjk> [2000]
+0xF1D1 U+56C5 # <cjk> [2000]
+0xF1D2 U+56CD # <cjk> [2000]
+0xF1D3 U+56DF # <cjk> [2000]
+0xF1D4 U+56E8 # <cjk> [2000]
+0xF1D5 U+56F6 # <cjk> [2000]
+0xF1D6 U+56F7 # <cjk> [2000]
+0xF1D7 U+21201 # <cjk> [2000] [Unicode3.1]
+0xF1D8 U+5715 # <cjk> [2000]
+0xF1D9 U+5723 # <cjk> [2000]
+0xF1DA U+21255 # <cjk> [2000] [Unicode3.1]
+0xF1DB U+5729 # <cjk> [2000]
+0xF1DC U+2127B # <cjk> [2000] [Unicode3.1]
+0xF1DD U+5745 # <cjk> [2000]
+0xF1DE U+5746 # <cjk> [2000]
+0xF1DF U+574C # <cjk> [2000]
+0xF1E0 U+574D # <cjk> [2000]
+0xF1E1 U+21274 # <cjk> [2000] [Unicode3.1]
+0xF1E2 U+5768 # <cjk> [2000]
+0xF1E3 U+576F # <cjk> [2000]
+0xF1E4 U+5773 # <cjk> [2000]
+0xF1E5 U+5774 # <cjk> [2000]
+0xF1E6 U+5775 # <cjk> [2000]
+0xF1E7 U+577B # <cjk> [2000]
+0xF1E8 U+212E4 # <cjk> [2000] [Unicode3.1]
+0xF1E9 U+212D7 # <cjk> [2000] [Unicode3.1]
+0xF1EA U+57AC # <cjk> [2000]
+0xF1EB U+579A # <cjk> [2000]
+0xF1EC U+579D # <cjk> [2000]
+0xF1ED U+579E # <cjk> [2000]
+0xF1EE U+57A8 # <cjk> [2000]
+0xF1EF U+57D7 # <cjk> [2000]
+0xF1F0 U+212FD # <cjk> [2000] [Unicode3.1]
+0xF1F1 U+57CC # <cjk> [2000]
+0xF1F2 U+21336 # <cjk> [2000] [Unicode3.1]
+0xF1F3 U+21344 # <cjk> [2000] [Unicode3.1]
+0xF1F4 U+57DE # <cjk> [2000]
+0xF1F5 U+57E6 # <cjk> [2000]
+0xF1F6 U+57F0 # <cjk> [2000]
+0xF1F7 U+364A # <cjk> [2000]
+0xF1F8 U+57F8 # <cjk> [2000]
+0xF1F9 U+57FB # <cjk> [2000]
+0xF1FA U+57FD # <cjk> [2000]
+0xF1FB U+5804 # <cjk> [2000]
+0xF1FC U+581E # <cjk> [2000]
+0xF240 U+5820 # <cjk> [2000]
+0xF241 U+5827 # <cjk> [2000]
+0xF242 U+5832 # <cjk> [2000]
+0xF243 U+5839 # <cjk> [2000]
+0xF244 U+213C4 # <cjk> [2000] [Unicode3.1]
+0xF245 U+5849 # <cjk> [2000]
+0xF246 U+584C # <cjk> [2000]
+0xF247 U+5867 # <cjk> [2000]
+0xF248 U+588A # <cjk> [2000]
+0xF249 U+588B # <cjk> [2000]
+0xF24A U+588D # <cjk> [2000]
+0xF24B U+588F # <cjk> [2000]
+0xF24C U+5890 # <cjk> [2000]
+0xF24D U+5894 # <cjk> [2000]
+0xF24E U+589D # <cjk> [2000]
+0xF24F U+58AA # <cjk> [2000]
+0xF250 U+58B1 # <cjk> [2000]
+0xF251 U+2146D # <cjk> [2000] [Unicode3.1]
+0xF252 U+58C3 # <cjk> [2000]
+0xF253 U+58CD # <cjk> [2000]
+0xF254 U+58E2 # <cjk> [2000]
+0xF255 U+58F3 # <cjk> [2000]
+0xF256 U+58F4 # <cjk> [2000]
+0xF257 U+5905 # <cjk> [2000]
+0xF258 U+5906 # <cjk> [2000]
+0xF259 U+590B # <cjk> [2000]
+0xF25A U+590D # <cjk> [2000]
+0xF25B U+5914 # <cjk> [2000]
+0xF25C U+5924 # <cjk> [2000]
+0xF25D U+215D7 # <cjk> [2000] [Unicode3.1]
+0xF25E U+3691 # <cjk> [2000]
+0xF25F U+593D # <cjk> [2000]
+0xF260 U+3699 # <cjk> [2000]
+0xF261 U+5946 # <cjk> [2000]
+0xF262 U+3696 # <cjk> [2000]
+0xF263 U+26C29 # <cjk> [2000] [Unicode3.1]
+0xF264 U+595B # <cjk> [2000]
+0xF265 U+595F # <cjk> [2000]
+0xF266 U+21647 # <cjk> [2000] [Unicode3.1]
+0xF267 U+5975 # <cjk> [2000]
+0xF268 U+5976 # <cjk> [2000]
+0xF269 U+597C # <cjk> [2000]
+0xF26A U+599F # <cjk> [2000]
+0xF26B U+59AE # <cjk> [2000]
+0xF26C U+59BC # <cjk> [2000]
+0xF26D U+59C8 # <cjk> [2000]
+0xF26E U+59CD # <cjk> [2000]
+0xF26F U+59DE # <cjk> [2000]
+0xF270 U+59E3 # <cjk> [2000]
+0xF271 U+59E4 # <cjk> [2000]
+0xF272 U+59E7 # <cjk> [2000]
+0xF273 U+59EE # <cjk> [2000]
+0xF274 U+21706 # <cjk> [2000] [Unicode3.1]
+0xF275 U+21742 # <cjk> [2000] [Unicode3.1]
+0xF276 U+36CF # <cjk> [2000]
+0xF277 U+5A0C # <cjk> [2000]
+0xF278 U+5A0D # <cjk> [2000]
+0xF279 U+5A17 # <cjk> [2000]
+0xF27A U+5A27 # <cjk> [2000]
+0xF27B U+5A2D # <cjk> [2000]
+0xF27C U+5A55 # <cjk> [2000]
+0xF27D U+5A65 # <cjk> [2000]
+0xF27E U+5A7A # <cjk> [2000]
+0xF280 U+5A8B # <cjk> [2000]
+0xF281 U+5A9C # <cjk> [2000]
+0xF282 U+5A9F # <cjk> [2000]
+0xF283 U+5AA0 # <cjk> [2000]
+0xF284 U+5AA2 # <cjk> [2000]
+0xF285 U+5AB1 # <cjk> [2000]
+0xF286 U+5AB3 # <cjk> [2000]
+0xF287 U+5AB5 # <cjk> [2000]
+0xF288 U+5ABA # <cjk> [2000]
+0xF289 U+5ABF # <cjk> [2000]
+0xF28A U+5ADA # <cjk> [2000]
+0xF28B U+5ADC # <cjk> [2000]
+0xF28C U+5AE0 # <cjk> [2000]
+0xF28D U+5AE5 # <cjk> [2000]
+0xF28E U+5AF0 # <cjk> [2000]
+0xF28F U+5AEE # <cjk> [2000]
+0xF290 U+5AF5 # <cjk> [2000]
+0xF291 U+5B00 # <cjk> [2000]
+0xF292 U+5B08 # <cjk> [2000]
+0xF293 U+5B17 # <cjk> [2000]
+0xF294 U+5B34 # <cjk> [2000]
+0xF295 U+5B2D # <cjk> [2000]
+0xF296 U+5B4C # <cjk> [2000]
+0xF297 U+5B52 # <cjk> [2000]
+0xF298 U+5B68 # <cjk> [2000]
+0xF299 U+5B6F # <cjk> [2000]
+0xF29A U+5B7C # <cjk> [2000]
+0xF29B U+5B7F # <cjk> [2000]
+0xF29C U+5B81 # <cjk> [2000]
+0xF29D U+5B84 # <cjk> [2000]
+0xF29E U+219C3 # <cjk> [2000] [Unicode3.1]
+0xF09F U+5B96 # <cjk> [2000]
+0xF0A0 U+5BAC # <cjk> [2000]
+0xF0A1 U+3761 # <cjk> [2000]
+0xF0A2 U+5BC0 # <cjk> [2000]
+0xF0A3 U+3762 # <cjk> [2000]
+0xF0A4 U+5BCE # <cjk> [2000]
+0xF0A5 U+5BD6 # <cjk> [2000]
+0xF0A6 U+376C # <cjk> [2000]
+0xF0A7 U+376B # <cjk> [2000]
+0xF0A8 U+5BF1 # <cjk> [2000]
+0xF0A9 U+5BFD # <cjk> [2000]
+0xF0AA U+3775 # <cjk> [2000]
+0xF0AB U+5C03 # <cjk> [2000]
+0xF0AC U+5C29 # <cjk> [2000]
+0xF0AD U+5C30 # <cjk> [2000]
+0xF0AE U+21C56 # <cjk> [2000] [Unicode3.1]
+0xF0AF U+5C5F # <cjk> [2000]
+0xF0B0 U+5C63 # <cjk> [2000]
+0xF0B1 U+5C67 # <cjk> [2000]
+0xF0B2 U+5C68 # <cjk> [2000]
+0xF0B3 U+5C69 # <cjk> [2000]
+0xF0B4 U+5C70 # <cjk> [2000]
+0xF0B5 U+21D2D # <cjk> [2000] [Unicode3.1]
+0xF0B6 U+21D45 # <cjk> [2000] [Unicode3.1]
+0xF0B7 U+5C7C # <cjk> [2000]
+0xF0B8 U+21D78 # <cjk> [2000] [Unicode3.1]
+0xF0B9 U+21D62 # <cjk> [2000] [Unicode3.1]
+0xF0BA U+5C88 # <cjk> [2000]
+0xF0BB U+5C8A # <cjk> [2000]
+0xF0BC U+37C1 # <cjk> [2000]
+0xF0BD U+21DA1 # <cjk> [2000] [Unicode3.1]
+0xF0BE U+21D9C # <cjk> [2000] [Unicode3.1]
+0xF0BF U+5CA0 # <cjk> [2000]
+0xF0C0 U+5CA2 # <cjk> [2000]
+0xF0C1 U+5CA6 # <cjk> [2000]
+0xF0C2 U+5CA7 # <cjk> [2000]
+0xF0C3 U+21D92 # <cjk> [2000] [Unicode3.1]
+0xF0C4 U+5CAD # <cjk> [2000]
+0xF0C5 U+5CB5 # <cjk> [2000]
+0xF0C6 U+21DB7 # <cjk> [2000] [Unicode3.1]
+0xF0C7 U+5CC9 # <cjk> [2000]
+0xF0C8 U+21DE0 # <cjk> [2000] [Unicode3.1]
+0xF0C9 U+21E33 # <cjk> [2000] [Unicode3.1]
+0xF0CA U+5D06 # <cjk> [2000]
+0xF0CB U+5D10 # <cjk> [2000]
+0xF0CC U+5D2B # <cjk> [2000]
+0xF0CD U+5D1D # <cjk> [2000]
+0xF0CE U+5D20 # <cjk> [2000]
+0xF0CF U+5D24 # <cjk> [2000]
+0xF0D0 U+5D26 # <cjk> [2000]
+0xF0D1 U+5D31 # <cjk> [2000]
+0xF0D2 U+5D39 # <cjk> [2000]
+0xF0D3 U+5D42 # <cjk> [2000]
+0xF0D4 U+37E8 # <cjk> [2000]
+0xF0D5 U+5D61 # <cjk> [2000]
+0xF0D6 U+5D6A # <cjk> [2000]
+0xF0D7 U+37F4 # <cjk> [2000]
+0xF0D8 U+5D70 # <cjk> [2000]
+0xF0D9 U+21F1E # <cjk> [2000] [Unicode3.1]
+0xF0DA U+37FD # <cjk> [2000]
+0xF0DB U+5D88 # <cjk> [2000]
+0xF0DC U+3800 # <cjk> [2000]
+0xF0DD U+5D92 # <cjk> [2000]
+0xF0DE U+5D94 # <cjk> [2000]
+0xF0DF U+5D97 # <cjk> [2000]
+0xF0E0 U+5D99 # <cjk> [2000]
+0xF0E1 U+5DB0 # <cjk> [2000]
+0xF0E2 U+5DB2 # <cjk> [2000]
+0xF0E3 U+5DB4 # <cjk> [2000]
+0xF0E4 U+21F76 # <cjk> [2000] [Unicode3.1]
+0xF0E5 U+5DB9 # <cjk> [2000]
+0xF0E6 U+5DD1 # <cjk> [2000]
+0xF0E7 U+5DD7 # <cjk> [2000]
+0xF0E8 U+5DD8 # <cjk> [2000]
+0xF0E9 U+5DE0 # <cjk> [2000]
+0xF0EA U+21FFA # <cjk> [2000] [Unicode3.1]
+0xF0EB U+5DE4 # <cjk> [2000]
+0xF0EC U+5DE9 # <cjk> [2000]
+0xF0ED U+382F # <cjk> [2000]
+0xF0EE U+5E00 # <cjk> [2000]
+0xF0EF U+3836 # <cjk> [2000]
+0xF0F0 U+5E12 # <cjk> [2000]
+0xF0F1 U+5E15 # <cjk> [2000]
+0xF0F2 U+3840 # <cjk> [2000]
+0xF0F3 U+5E1F # <cjk> [2000]
+0xF0F4 U+5E2E # <cjk> [2000]
+0xF0F5 U+5E3E # <cjk> [2000]
+0xF0F6 U+5E49 # <cjk> [2000]
+0xF0F7 U+385C # <cjk> [2000]
+0xF0F8 U+5E56 # <cjk> [2000]
+0xF0F9 U+3861 # <cjk> [2000]
+0xF0FA U+5E6B # <cjk> [2000]
+0xF0FB U+5E6C # <cjk> [2000]
+0xF0FC U+5E6D # <cjk> [2000]
+0xF29F U+5E6E # <cjk> [2000]
+0xF2A0 U+2217B # <cjk> [2000] [Unicode3.1]
+0xF2A1 U+5EA5 # <cjk> [2000]
+0xF2A2 U+5EAA # <cjk> [2000]
+0xF2A3 U+5EAC # <cjk> [2000]
+0xF2A4 U+5EB9 # <cjk> [2000]
+0xF2A5 U+5EBF # <cjk> [2000]
+0xF2A6 U+5EC6 # <cjk> [2000]
+0xF2A7 U+5ED2 # <cjk> [2000]
+0xF2A8 U+5ED9 # <cjk> [2000]
+0xF2A9 U+2231E # <cjk> [2000] [Unicode3.1]
+0xF2AA U+5EFD # <cjk> [2000]
+0xF2AB U+5F08 # <cjk> [2000]
+0xF2AC U+5F0E # <cjk> [2000]
+0xF2AD U+5F1C # <cjk> [2000]
+0xF2AE U+223AD # <cjk> [2000] [Unicode3.1]
+0xF2AF U+5F1E # <cjk> [2000]
+0xF2B0 U+5F47 # <cjk> [2000]
+0xF2B1 U+5F63 # <cjk> [2000]
+0xF2B2 U+5F72 # <cjk> [2000]
+0xF2B3 U+5F7E # <cjk> [2000]
+0xF2B4 U+5F8F # <cjk> [2000]
+0xF2B5 U+5FA2 # <cjk> [2000]
+0xF2B6 U+5FA4 # <cjk> [2000]
+0xF2B7 U+5FB8 # <cjk> [2000]
+0xF2B8 U+5FC4 # <cjk> [2000]
+0xF2B9 U+38FA # <cjk> [2000]
+0xF2BA U+5FC7 # <cjk> [2000]
+0xF2BB U+5FCB # <cjk> [2000]
+0xF2BC U+5FD2 # <cjk> [2000]
+0xF2BD U+5FD3 # <cjk> [2000]
+0xF2BE U+5FD4 # <cjk> [2000]
+0xF2BF U+5FE2 # <cjk> [2000]
+0xF2C0 U+5FEE # <cjk> [2000]
+0xF2C1 U+5FEF # <cjk> [2000]
+0xF2C2 U+5FF3 # <cjk> [2000]
+0xF2C3 U+5FFC # <cjk> [2000]
+0xF2C4 U+3917 # <cjk> [2000]
+0xF2C5 U+6017 # <cjk> [2000]
+0xF2C6 U+6022 # <cjk> [2000]
+0xF2C7 U+6024 # <cjk> [2000]
+0xF2C8 U+391A # <cjk> [2000]
+0xF2C9 U+604C # <cjk> [2000]
+0xF2CA U+607F # <cjk> [2000]
+0xF2CB U+608A # <cjk> [2000]
+0xF2CC U+6095 # <cjk> [2000]
+0xF2CD U+60A8 # <cjk> [2000]
+0xF2CE U+226F3 # <cjk> [2000] [Unicode3.1]
+0xF2CF U+60B0 # <cjk> [2000]
+0xF2D0 U+60B1 # <cjk> [2000]
+0xF2D1 U+60BE # <cjk> [2000]
+0xF2D2 U+60C8 # <cjk> [2000]
+0xF2D3 U+60D9 # <cjk> [2000]
+0xF2D4 U+60DB # <cjk> [2000]
+0xF2D5 U+60EE # <cjk> [2000]
+0xF2D6 U+60F2 # <cjk> [2000]
+0xF2D7 U+60F5 # <cjk> [2000]
+0xF2D8 U+6110 # <cjk> [2000]
+0xF2D9 U+6112 # <cjk> [2000]
+0xF2DA U+6113 # <cjk> [2000]
+0xF2DB U+6119 # <cjk> [2000]
+0xF2DC U+611E # <cjk> [2000]
+0xF2DD U+613A # <cjk> [2000]
+0xF2DE U+396F # <cjk> [2000]
+0xF2DF U+6141 # <cjk> [2000]
+0xF2E0 U+6146 # <cjk> [2000]
+0xF2E1 U+6160 # <cjk> [2000]
+0xF2E2 U+617C # <cjk> [2000]
+0xF2E3 U+2285B # <cjk> [2000] [Unicode3.1]
+0xF2E4 U+6192 # <cjk> [2000]
+0xF2E5 U+6193 # <cjk> [2000]
+0xF2E6 U+6197 # <cjk> [2000]
+0xF2E7 U+6198 # <cjk> [2000]
+0xF2E8 U+61A5 # <cjk> [2000]
+0xF2E9 U+61A8 # <cjk> [2000]
+0xF2EA U+61AD # <cjk> [2000]
+0xF2EB U+228AB # <cjk> [2000] [Unicode3.1]
+0xF2EC U+61D5 # <cjk> [2000]
+0xF2ED U+61DD # <cjk> [2000]
+0xF2EE U+61DF # <cjk> [2000]
+0xF2EF U+61F5 # <cjk> [2000]
+0xF2F0 U+2298F # <cjk> [2000] [Unicode3.1]
+0xF2F1 U+6215 # <cjk> [2000]
+0xF2F2 U+6223 # <cjk> [2000]
+0xF2F3 U+6229 # <cjk> [2000]
+0xF2F4 U+6246 # <cjk> [2000]
+0xF2F5 U+624C # <cjk> [2000]
+0xF2F6 U+6251 # <cjk> [2000]
+0xF2F7 U+6252 # <cjk> [2000]
+0xF2F8 U+6261 # <cjk> [2000]
+0xF2F9 U+6264 # <cjk> [2000]
+0xF2FA U+627B # <cjk> [2000]
+0xF2FB U+626D # <cjk> [2000]
+0xF2FC U+6273 # <cjk> [2000]
+0xF340 U+6299 # <cjk> [2000]
+0xF341 U+62A6 # <cjk> [2000]
+0xF342 U+62D5 # <cjk> [2000]
+0xF343 U+22AB8 # <cjk> [2000] [Unicode3.1]
+0xF344 U+62FD # <cjk> [2000]
+0xF345 U+6303 # <cjk> [2000]
+0xF346 U+630D # <cjk> [2000]
+0xF347 U+6310 # <cjk> [2000]
+0xF348 U+22B4F # <cjk> [2000] [Unicode3.1]
+0xF349 U+22B50 # <cjk> [2000] [Unicode3.1]
+0xF34A U+6332 # <cjk> [2000]
+0xF34B U+6335 # <cjk> [2000]
+0xF34C U+633B # <cjk> [2000]
+0xF34D U+633C # <cjk> [2000]
+0xF34E U+6341 # <cjk> [2000]
+0xF34F U+6344 # <cjk> [2000]
+0xF350 U+634E # <cjk> [2000]
+0xF351 U+22B46 # <cjk> [2000] [Unicode3.1]
+0xF352 U+6359 # <cjk> [2000]
+0xF353 U+22C1D # <cjk> [2000] [Unicode3.1]
+0xF354 U+22BA6 # <cjk> [2000] [Unicode3.1]
+0xF355 U+636C # <cjk> [2000]
+0xF356 U+6384 # <cjk> [2000]
+0xF357 U+6399 # <cjk> [2000]
+0xF358 U+22C24 # <cjk> [2000] [Unicode3.1]
+0xF359 U+6394 # <cjk> [2000]
+0xF35A U+63BD # <cjk> [2000]
+0xF35B U+63F7 # <cjk> [2000]
+0xF35C U+63D4 # <cjk> [2000]
+0xF35D U+63D5 # <cjk> [2000]
+0xF35E U+63DC # <cjk> [2000]
+0xF35F U+63E0 # <cjk> [2000]
+0xF360 U+63EB # <cjk> [2000]
+0xF361 U+63EC # <cjk> [2000]
+0xF362 U+63F2 # <cjk> [2000]
+0xF363 U+6409 # <cjk> [2000]
+0xF364 U+641E # <cjk> [2000]
+0xF365 U+6425 # <cjk> [2000]
+0xF366 U+6429 # <cjk> [2000]
+0xF367 U+642F # <cjk> [2000]
+0xF368 U+645A # <cjk> [2000]
+0xF369 U+645B # <cjk> [2000]
+0xF36A U+645D # <cjk> [2000]
+0xF36B U+6473 # <cjk> [2000]
+0xF36C U+647D # <cjk> [2000]
+0xF36D U+6487 # <cjk> [2000]
+0xF36E U+6491 # <cjk> [2000]
+0xF36F U+649D # <cjk> [2000]
+0xF370 U+649F # <cjk> [2000]
+0xF371 U+64CB # <cjk> [2000]
+0xF372 U+64CC # <cjk> [2000]
+0xF373 U+64D5 # <cjk> [2000]
+0xF374 U+64D7 # <cjk> [2000]
+0xF375 U+22DE1 # <cjk> [2000] [Unicode3.1]
+0xF376 U+64E4 # <cjk> [2000]
+0xF377 U+64E5 # <cjk> [2000]
+0xF378 U+64FF # <cjk> [2000]
+0xF379 U+6504 # <cjk> [2000]
+0xF37A U+3A6E # <cjk> [2000]
+0xF37B U+650F # <cjk> [2000]
+0xF37C U+6514 # <cjk> [2000]
+0xF37D U+6516 # <cjk> [2000]
+0xF37E U+3A73 # <cjk> [2000]
+0xF380 U+651E # <cjk> [2000]
+0xF381 U+6532 # <cjk> [2000]
+0xF382 U+6544 # <cjk> [2000]
+0xF383 U+6554 # <cjk> [2000]
+0xF384 U+656B # <cjk> [2000]
+0xF385 U+657A # <cjk> [2000]
+0xF386 U+6581 # <cjk> [2000]
+0xF387 U+6584 # <cjk> [2000]
+0xF388 U+6585 # <cjk> [2000]
+0xF389 U+658A # <cjk> [2000]
+0xF38A U+65B2 # <cjk> [2000]
+0xF38B U+65B5 # <cjk> [2000]
+0xF38C U+65B8 # <cjk> [2000]
+0xF38D U+65BF # <cjk> [2000]
+0xF38E U+65C2 # <cjk> [2000]
+0xF38F U+65C9 # <cjk> [2000]
+0xF390 U+65D4 # <cjk> [2000]
+0xF391 U+3AD6 # <cjk> [2000]
+0xF392 U+65F2 # <cjk> [2000]
+0xF393 U+65F9 # <cjk> [2000]
+0xF394 U+65FC # <cjk> [2000]
+0xF395 U+6604 # <cjk> [2000]
+0xF396 U+6608 # <cjk> [2000]
+0xF397 U+6621 # <cjk> [2000]
+0xF398 U+662A # <cjk> [2000]
+0xF399 U+6645 # <cjk> [2000]
+0xF39A U+6651 # <cjk> [2000]
+0xF39B U+664E # <cjk> [2000]
+0xF39C U+3AEA # <cjk> [2000]
+0xF39D U+231C3 # <cjk> [2000] [Unicode3.1]
+0xF39E U+6657 # <cjk> [2000]
+0xF39F U+665B # <cjk> [2000]
+0xF3A0 U+6663 # <cjk> [2000]
+0xF3A1 U+231F5 # <cjk> [2000] [Unicode3.1]
+0xF3A2 U+231B6 # <cjk> [2000] [Unicode3.1]
+0xF3A3 U+666A # <cjk> [2000]
+0xF3A4 U+666B # <cjk> [2000]
+0xF3A5 U+666C # <cjk> [2000]
+0xF3A6 U+666D # <cjk> [2000]
+0xF3A7 U+667B # <cjk> [2000]
+0xF3A8 U+6680 # <cjk> [2000]
+0xF3A9 U+6690 # <cjk> [2000]
+0xF3AA U+6692 # <cjk> [2000]
+0xF3AB U+6699 # <cjk> [2000]
+0xF3AC U+3B0E # <cjk> [2000]
+0xF3AD U+66AD # <cjk> [2000]
+0xF3AE U+66B1 # <cjk> [2000]
+0xF3AF U+66B5 # <cjk> [2000]
+0xF3B0 U+3B1A # <cjk> [2000]
+0xF3B1 U+66BF # <cjk> [2000]
+0xF3B2 U+3B1C # <cjk> [2000]
+0xF3B3 U+66EC # <cjk> [2000]
+0xF3B4 U+3AD7 # <cjk> [2000]
+0xF3B5 U+6701 # <cjk> [2000]
+0xF3B6 U+6705 # <cjk> [2000]
+0xF3B7 U+6712 # <cjk> [2000]
+0xF3B8 U+23372 # <cjk> [2000] [Unicode3.1]
+0xF3B9 U+6719 # <cjk> [2000]
+0xF3BA U+233D3 # <cjk> [2000] [Unicode3.1]
+0xF3BB U+233D2 # <cjk> [2000] [Unicode3.1]
+0xF3BC U+674C # <cjk> [2000]
+0xF3BD U+674D # <cjk> [2000]
+0xF3BE U+6754 # <cjk> [2000]
+0xF3BF U+675D # <cjk> [2000]
+0xF3C0 U+233D0 # <cjk> [2000] [Unicode3.1]
+0xF3C1 U+233E4 # <cjk> [2000] [Unicode3.1]
+0xF3C2 U+233D5 # <cjk> [2000] [Unicode3.1]
+0xF3C3 U+6774 # <cjk> [2000]
+0xF3C4 U+6776 # <cjk> [2000]
+0xF3C5 U+233DA # <cjk> [2000] [Unicode3.1]
+0xF3C6 U+6792 # <cjk> [2000]
+0xF3C7 U+233DF # <cjk> [2000] [Unicode3.1]
+0xF3C8 U+8363 # <cjk> [2000]
+0xF3C9 U+6810 # <cjk> [2000]
+0xF3CA U+67B0 # <cjk> [2000]
+0xF3CB U+67B2 # <cjk> [2000]
+0xF3CC U+67C3 # <cjk> [2000]
+0xF3CD U+67C8 # <cjk> [2000]
+0xF3CE U+67D2 # <cjk> [2000]
+0xF3CF U+67D9 # <cjk> [2000]
+0xF3D0 U+67DB # <cjk> [2000]
+0xF3D1 U+67F0 # <cjk> [2000]
+0xF3D2 U+67F7 # <cjk> [2000]
+0xF3D3 U+2344A # <cjk> [2000] [Unicode3.1]
+0xF3D4 U+23451 # <cjk> [2000] [Unicode3.1]
+0xF3D5 U+2344B # <cjk> [2000] [Unicode3.1]
+0xF3D6 U+6818 # <cjk> [2000]
+0xF3D7 U+681F # <cjk> [2000]
+0xF3D8 U+682D # <cjk> [2000]
+0xF3D9 U+23465 # <cjk> [2000] [Unicode3.1]
+0xF3DA U+6833 # <cjk> [2000]
+0xF3DB U+683B # <cjk> [2000]
+0xF3DC U+683E # <cjk> [2000]
+0xF3DD U+6844 # <cjk> [2000]
+0xF3DE U+6845 # <cjk> [2000]
+0xF3DF U+6849 # <cjk> [2000]
+0xF3E0 U+684C # <cjk> [2000]
+0xF3E1 U+6855 # <cjk> [2000]
+0xF3E2 U+6857 # <cjk> [2000]
+0xF3E3 U+3B77 # <cjk> [2000]
+0xF3E4 U+686B # <cjk> [2000]
+0xF3E5 U+686E # <cjk> [2000]
+0xF3E6 U+687A # <cjk> [2000]
+0xF3E7 U+687C # <cjk> [2000]
+0xF3E8 U+6882 # <cjk> [2000]
+0xF3E9 U+6890 # <cjk> [2000]
+0xF3EA U+6896 # <cjk> [2000]
+0xF3EB U+3B6D # <cjk> [2000]
+0xF3EC U+6898 # <cjk> [2000]
+0xF3ED U+6899 # <cjk> [2000]
+0xF3EE U+689A # <cjk> [2000]
+0xF3EF U+689C # <cjk> [2000]
+0xF3F0 U+68AA # <cjk> [2000]
+0xF3F1 U+68AB # <cjk> [2000]
+0xF3F2 U+68B4 # <cjk> [2000]
+0xF3F3 U+68BB # <cjk> [2000]
+0xF3F4 U+68FB # <cjk> [2000]
+0xF3F5 U+234E4 # <cjk> [2000] [Unicode3.1]
+0xF3F6 U+2355A # <cjk> [2000] [Unicode3.1]
+0xF3F7 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000]
+0xF3F8 U+68C3 # <cjk> [2000]
+0xF3F9 U+68C5 # <cjk> [2000]
+0xF3FA U+68CC # <cjk> [2000]
+0xF3FB U+68CF # <cjk> [2000]
+0xF3FC U+68D6 # <cjk> [2000]
+0xF440 U+68D9 # <cjk> [2000]
+0xF441 U+68E4 # <cjk> [2000]
+0xF442 U+68E5 # <cjk> [2000]
+0xF443 U+68EC # <cjk> [2000]
+0xF444 U+68F7 # <cjk> [2000]
+0xF445 U+6903 # <cjk> [2000]
+0xF446 U+6907 # <cjk> [2000]
+0xF447 U+3B87 # <cjk> [2000]
+0xF448 U+3B88 # <cjk> [2000]
+0xF449 U+23594 # <cjk> [2000] [Unicode3.1]
+0xF44A U+693B # <cjk> [2000]
+0xF44B U+3B8D # <cjk> [2000]
+0xF44C U+6946 # <cjk> [2000]
+0xF44D U+6969 # <cjk> [2000]
+0xF44E U+696C # <cjk> [2000]
+0xF44F U+6972 # <cjk> [2000]
+0xF450 U+697A # <cjk> [2000]
+0xF451 U+697F # <cjk> [2000]
+0xF452 U+6992 # <cjk> [2000]
+0xF453 U+3BA4 # <cjk> [2000]
+0xF454 U+6996 # <cjk> [2000]
+0xF455 U+6998 # <cjk> [2000]
+0xF456 U+69A6 # <cjk> [2000]
+0xF457 U+69B0 # <cjk> [2000]
+0xF458 U+69B7 # <cjk> [2000]
+0xF459 U+69BA # <cjk> [2000]
+0xF45A U+69BC # <cjk> [2000]
+0xF45B U+69C0 # <cjk> [2000]
+0xF45C U+69D1 # <cjk> [2000]
+0xF45D U+69D6 # <cjk> [2000]
+0xF45E U+23639 # <cjk> [2000] [Unicode3.1]
+0xF45F U+23647 # <cjk> [2000] [Unicode3.1]
+0xF460 U+6A30 # <cjk> [2000]
+0xF461 U+23638 # <cjk> [2000] [Unicode3.1]
+0xF462 U+2363A # <cjk> [2000] [Unicode3.1]
+0xF463 U+69E3 # <cjk> [2000]
+0xF464 U+69EE # <cjk> [2000]
+0xF465 U+69EF # <cjk> [2000]
+0xF466 U+69F3 # <cjk> [2000]
+0xF467 U+3BCD # <cjk> [2000]
+0xF468 U+69F4 # <cjk> [2000]
+0xF469 U+69FE # <cjk> [2000]
+0xF46A U+6A11 # <cjk> [2000]
+0xF46B U+6A1A # <cjk> [2000]
+0xF46C U+6A1D # <cjk> [2000]
+0xF46D U+2371C # <cjk> [2000] [Unicode3.1]
+0xF46E U+6A32 # <cjk> [2000]
+0xF46F U+6A33 # <cjk> [2000]
+0xF470 U+6A34 # <cjk> [2000]
+0xF471 U+6A3F # <cjk> [2000]
+0xF472 U+6A46 # <cjk> [2000]
+0xF473 U+6A49 # <cjk> [2000]
+0xF474 U+6A7A # <cjk> [2000]
+0xF475 U+6A4E # <cjk> [2000]
+0xF476 U+6A52 # <cjk> [2000]
+0xF477 U+6A64 # <cjk> [2000]
+0xF478 U+2370C # <cjk> [2000] [Unicode3.1]
+0xF479 U+6A7E # <cjk> [2000]
+0xF47A U+6A83 # <cjk> [2000]
+0xF47B U+6A8B # <cjk> [2000]
+0xF47C U+3BF0 # <cjk> [2000]
+0xF47D U+6A91 # <cjk> [2000]
+0xF47E U+6A9F # <cjk> [2000]
+0xF480 U+6AA1 # <cjk> [2000]
+0xF481 U+23764 # <cjk> [2000] [Unicode3.1]
+0xF482 U+6AAB # <cjk> [2000]
+0xF483 U+6ABD # <cjk> [2000]
+0xF484 U+6AC6 # <cjk> [2000]
+0xF485 U+6AD4 # <cjk> [2000]
+0xF486 U+6AD0 # <cjk> [2000]
+0xF487 U+6ADC # <cjk> [2000]
+0xF488 U+6ADD # <cjk> [2000]
+0xF489 U+237FF # <cjk> [2000] [Unicode3.1]
+0xF48A U+237E7 # <cjk> [2000] [Unicode3.1]
+0xF48B U+6AEC # <cjk> [2000]
+0xF48C U+6AF1 # <cjk> [2000]
+0xF48D U+6AF2 # <cjk> [2000]
+0xF48E U+6AF3 # <cjk> [2000]
+0xF48F U+6AFD # <cjk> [2000]
+0xF490 U+23824 # <cjk> [2000] [Unicode3.1]
+0xF491 U+6B0B # <cjk> [2000]
+0xF492 U+6B0F # <cjk> [2000]
+0xF493 U+6B10 # <cjk> [2000]
+0xF494 U+6B11 # <cjk> [2000]
+0xF495 U+2383D # <cjk> [2000] [Unicode3.1]
+0xF496 U+6B17 # <cjk> [2000]
+0xF497 U+3C26 # <cjk> [2000]
+0xF498 U+6B2F # <cjk> [2000]
+0xF499 U+6B4A # <cjk> [2000]
+0xF49A U+6B58 # <cjk> [2000]
+0xF49B U+6B6C # <cjk> [2000]
+0xF49C U+6B75 # <cjk> [2000]
+0xF49D U+6B7A # <cjk> [2000]
+0xF49E U+6B81 # <cjk> [2000]
+0xF49F U+6B9B # <cjk> [2000]
+0xF4A0 U+6BAE # <cjk> [2000]
+0xF4A1 U+23A98 # <cjk> [2000] [Unicode3.1]
+0xF4A2 U+6BBD # <cjk> [2000]
+0xF4A3 U+6BBE # <cjk> [2000]
+0xF4A4 U+6BC7 # <cjk> [2000]
+0xF4A5 U+6BC8 # <cjk> [2000]
+0xF4A6 U+6BC9 # <cjk> [2000]
+0xF4A7 U+6BDA # <cjk> [2000]
+0xF4A8 U+6BE6 # <cjk> [2000]
+0xF4A9 U+6BE7 # <cjk> [2000]
+0xF4AA U+6BEE # <cjk> [2000]
+0xF4AB U+6BF1 # <cjk> [2000]
+0xF4AC U+6C02 # <cjk> [2000]
+0xF4AD U+6C0A # <cjk> [2000]
+0xF4AE U+6C0E # <cjk> [2000]
+0xF4AF U+6C35 # <cjk> [2000]
+0xF4B0 U+6C36 # <cjk> [2000]
+0xF4B1 U+6C3A # <cjk> [2000]
+0xF4B2 U+23C7F # <cjk> [2000] [Unicode3.1]
+0xF4B3 U+6C3F # <cjk> [2000]
+0xF4B4 U+6C4D # <cjk> [2000]
+0xF4B5 U+6C5B # <cjk> [2000]
+0xF4B6 U+6C6D # <cjk> [2000]
+0xF4B7 U+6C84 # <cjk> [2000]
+0xF4B8 U+6C89 # <cjk> [2000]
+0xF4B9 U+3CC3 # <cjk> [2000]
+0xF4BA U+6C94 # <cjk> [2000]
+0xF4BB U+6C95 # <cjk> [2000]
+0xF4BC U+6C97 # <cjk> [2000]
+0xF4BD U+6CAD # <cjk> [2000]
+0xF4BE U+6CC2 # <cjk> [2000]
+0xF4BF U+6CD0 # <cjk> [2000]
+0xF4C0 U+3CD2 # <cjk> [2000]
+0xF4C1 U+6CD6 # <cjk> [2000]
+0xF4C2 U+6CDA # <cjk> [2000]
+0xF4C3 U+6CDC # <cjk> [2000]
+0xF4C4 U+6CE9 # <cjk> [2000]
+0xF4C5 U+6CEC # <cjk> [2000]
+0xF4C6 U+6CED # <cjk> [2000]
+0xF4C7 U+23D00 # <cjk> [2000] [Unicode3.1]
+0xF4C8 U+6D00 # <cjk> [2000]
+0xF4C9 U+6D0A # <cjk> [2000]
+0xF4CA U+6D24 # <cjk> [2000]
+0xF4CB U+6D26 # <cjk> [2000]
+0xF4CC U+6D27 # <cjk> [2000]
+0xF4CD U+6C67 # <cjk> [2000]
+0xF4CE U+6D2F # <cjk> [2000]
+0xF4CF U+6D3C # <cjk> [2000]
+0xF4D0 U+6D5B # <cjk> [2000]
+0xF4D1 U+6D5E # <cjk> [2000]
+0xF4D2 U+6D60 # <cjk> [2000]
+0xF4D3 U+6D70 # <cjk> [2000]
+0xF4D4 U+6D80 # <cjk> [2000]
+0xF4D5 U+6D81 # <cjk> [2000]
+0xF4D6 U+6D8A # <cjk> [2000]
+0xF4D7 U+6D8D # <cjk> [2000]
+0xF4D8 U+6D91 # <cjk> [2000]
+0xF4D9 U+6D98 # <cjk> [2000]
+0xF4DA U+23D40 # <cjk> [2000] [Unicode3.1]
+0xF4DB U+6E17 # <cjk> [2000]
+0xF4DC U+23DFA # <cjk> [2000] [Unicode3.1]
+0xF4DD U+23DF9 # <cjk> [2000] [Unicode3.1]
+0xF4DE U+23DD3 # <cjk> [2000] [Unicode3.1]
+0xF4DF U+6DAB # <cjk> [2000]
+0xF4E0 U+6DAE # <cjk> [2000]
+0xF4E1 U+6DB4 # <cjk> [2000]
+0xF4E2 U+6DC2 # <cjk> [2000]
+0xF4E3 U+6D34 # <cjk> [2000]
+0xF4E4 U+6DC8 # <cjk> [2000]
+0xF4E5 U+6DCE # <cjk> [2000]
+0xF4E6 U+6DCF # <cjk> [2000]
+0xF4E7 U+6DD0 # <cjk> [2000]
+0xF4E8 U+6DDF # <cjk> [2000]
+0xF4E9 U+6DE9 # <cjk> [2000]
+0xF4EA U+6DF6 # <cjk> [2000]
+0xF4EB U+6E36 # <cjk> [2000]
+0xF4EC U+6E1E # <cjk> [2000]
+0xF4ED U+6E22 # <cjk> [2000]
+0xF4EE U+6E27 # <cjk> [2000]
+0xF4EF U+3D11 # <cjk> [2000]
+0xF4F0 U+6E32 # <cjk> [2000]
+0xF4F1 U+6E3C # <cjk> [2000]
+0xF4F2 U+6E48 # <cjk> [2000]
+0xF4F3 U+6E49 # <cjk> [2000]
+0xF4F4 U+6E4B # <cjk> [2000]
+0xF4F5 U+6E4C # <cjk> [2000]
+0xF4F6 U+6E4F # <cjk> [2000]
+0xF4F7 U+6E51 # <cjk> [2000]
+0xF4F8 U+6E53 # <cjk> [2000]
+0xF4F9 U+6E54 # <cjk> [2000]
+0xF4FA U+6E57 # <cjk> [2000]
+0xF4FB U+6E63 # <cjk> [2000]
+0xF4FC U+3D1E # <cjk> [2000]
+0xF540 U+6E93 # <cjk> [2000]
+0xF541 U+6EA7 # <cjk> [2000]
+0xF542 U+6EB4 # <cjk> [2000]
+0xF543 U+6EBF # <cjk> [2000]
+0xF544 U+6EC3 # <cjk> [2000]
+0xF545 U+6ECA # <cjk> [2000]
+0xF546 U+6ED9 # <cjk> [2000]
+0xF547 U+6F35 # <cjk> [2000]
+0xF548 U+6EEB # <cjk> [2000]
+0xF549 U+6EF9 # <cjk> [2000]
+0xF54A U+6EFB # <cjk> [2000]
+0xF54B U+6F0A # <cjk> [2000]
+0xF54C U+6F0C # <cjk> [2000]
+0xF54D U+6F18 # <cjk> [2000]
+0xF54E U+6F25 # <cjk> [2000]
+0xF54F U+6F36 # <cjk> [2000]
+0xF550 U+6F3C # <cjk> [2000]
+0xF551 U+23F7E # <cjk> [2000] [Unicode3.1]
+0xF552 U+6F52 # <cjk> [2000]
+0xF553 U+6F57 # <cjk> [2000]
+0xF554 U+6F5A # <cjk> [2000]
+0xF555 U+6F60 # <cjk> [2000]
+0xF556 U+6F68 # <cjk> [2000]
+0xF557 U+6F98 # <cjk> [2000]
+0xF558 U+6F7D # <cjk> [2000]
+0xF559 U+6F90 # <cjk> [2000]
+0xF55A U+6F96 # <cjk> [2000]
+0xF55B U+6FBE # <cjk> [2000]
+0xF55C U+6F9F # <cjk> [2000]
+0xF55D U+6FA5 # <cjk> [2000]
+0xF55E U+6FAF # <cjk> [2000]
+0xF55F U+3D64 # <cjk> [2000]
+0xF560 U+6FB5 # <cjk> [2000]
+0xF561 U+6FC8 # <cjk> [2000]
+0xF562 U+6FC9 # <cjk> [2000]
+0xF563 U+6FDA # <cjk> [2000]
+0xF564 U+6FDE # <cjk> [2000]
+0xF565 U+6FE9 # <cjk> [2000]
+0xF566 U+24096 # <cjk> [2000] [Unicode3.1]
+0xF567 U+6FFC # <cjk> [2000]
+0xF568 U+7000 # <cjk> [2000]
+0xF569 U+7007 # <cjk> [2000]
+0xF56A U+700A # <cjk> [2000]
+0xF56B U+7023 # <cjk> [2000]
+0xF56C U+24103 # <cjk> [2000] [Unicode3.1]
+0xF56D U+7039 # <cjk> [2000]
+0xF56E U+703A # <cjk> [2000]
+0xF56F U+703C # <cjk> [2000]
+0xF570 U+7043 # <cjk> [2000]
+0xF571 U+7047 # <cjk> [2000]
+0xF572 U+704B # <cjk> [2000]
+0xF573 U+3D9A # <cjk> [2000]
+0xF574 U+7054 # <cjk> [2000]
+0xF575 U+7065 # <cjk> [2000]
+0xF576 U+7069 # <cjk> [2000]
+0xF577 U+706C # <cjk> [2000]
+0xF578 U+706E # <cjk> [2000]
+0xF579 U+7076 # <cjk> [2000]
+0xF57A U+707E # <cjk> [2000]
+0xF57B U+7081 # <cjk> [2000]
+0xF57C U+7086 # <cjk> [2000]
+0xF57D U+7095 # <cjk> [2000]
+0xF57E U+7097 # <cjk> [2000]
+0xF580 U+70BB # <cjk> [2000]
+0xF581 U+241C6 # <cjk> [2000] [Unicode3.1]
+0xF582 U+709F # <cjk> [2000]
+0xF583 U+70B1 # <cjk> [2000]
+0xF584 U+241FE # <cjk> [2000] [Unicode3.1]
+0xF585 U+70EC # <cjk> [2000]
+0xF586 U+70CA # <cjk> [2000]
+0xF587 U+70D1 # <cjk> [2000]
+0xF588 U+70D3 # <cjk> [2000]
+0xF589 U+70DC # <cjk> [2000]
+0xF58A U+7103 # <cjk> [2000]
+0xF58B U+7104 # <cjk> [2000]
+0xF58C U+7106 # <cjk> [2000]
+0xF58D U+7107 # <cjk> [2000]
+0xF58E U+7108 # <cjk> [2000]
+0xF58F U+710C # <cjk> [2000]
+0xF590 U+3DC0 # <cjk> [2000]
+0xF591 U+712F # <cjk> [2000]
+0xF592 U+7131 # <cjk> [2000]
+0xF593 U+7150 # <cjk> [2000]
+0xF594 U+714A # <cjk> [2000]
+0xF595 U+7153 # <cjk> [2000]
+0xF596 U+715E # <cjk> [2000]
+0xF597 U+3DD4 # <cjk> [2000]
+0xF598 U+7196 # <cjk> [2000]
+0xF599 U+7180 # <cjk> [2000]
+0xF59A U+719B # <cjk> [2000]
+0xF59B U+71A0 # <cjk> [2000]
+0xF59C U+71A2 # <cjk> [2000]
+0xF59D U+71AE # <cjk> [2000]
+0xF59E U+71AF # <cjk> [2000]
+0xF59F U+71B3 # <cjk> [2000]
+0xF5A0 U+243BC # <cjk> [2000] [Unicode3.1]
+0xF5A1 U+71CB # <cjk> [2000]
+0xF5A2 U+71D3 # <cjk> [2000]
+0xF5A3 U+71D9 # <cjk> [2000]
+0xF5A4 U+71DC # <cjk> [2000]
+0xF5A5 U+7207 # <cjk> [2000]
+0xF5A6 U+3E05 # <cjk> [2000]
+0xF5A7 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2]
+0xF5A8 U+722B # <cjk> [2000]
+0xF5A9 U+7234 # <cjk> [2000]
+0xF5AA U+7238 # <cjk> [2000]
+0xF5AB U+7239 # <cjk> [2000]
+0xF5AC U+4E2C # <cjk> [2000]
+0xF5AD U+7242 # <cjk> [2000]
+0xF5AE U+7253 # <cjk> [2000]
+0xF5AF U+7257 # <cjk> [2000]
+0xF5B0 U+7263 # <cjk> [2000]
+0xF5B1 U+24629 # <cjk> [2000] [Unicode3.1]
+0xF5B2 U+726E # <cjk> [2000]
+0xF5B3 U+726F # <cjk> [2000]
+0xF5B4 U+7278 # <cjk> [2000]
+0xF5B5 U+727F # <cjk> [2000]
+0xF5B6 U+728E # <cjk> [2000]
+0xF5B7 U+246A5 # <cjk> [2000] [Unicode3.1]
+0xF5B8 U+72AD # <cjk> [2000]
+0xF5B9 U+72AE # <cjk> [2000]
+0xF5BA U+72B0 # <cjk> [2000]
+0xF5BB U+72B1 # <cjk> [2000]
+0xF5BC U+72C1 # <cjk> [2000]
+0xF5BD U+3E60 # <cjk> [2000]
+0xF5BE U+72CC # <cjk> [2000]
+0xF5BF U+3E66 # <cjk> [2000]
+0xF5C0 U+3E68 # <cjk> [2000]
+0xF5C1 U+72F3 # <cjk> [2000]
+0xF5C2 U+72FA # <cjk> [2000]
+0xF5C3 U+7307 # <cjk> [2000]
+0xF5C4 U+7312 # <cjk> [2000]
+0xF5C5 U+7318 # <cjk> [2000]
+0xF5C6 U+7319 # <cjk> [2000]
+0xF5C7 U+3E83 # <cjk> [2000]
+0xF5C8 U+7339 # <cjk> [2000]
+0xF5C9 U+732C # <cjk> [2000]
+0xF5CA U+7331 # <cjk> [2000]
+0xF5CB U+7333 # <cjk> [2000]
+0xF5CC U+733D # <cjk> [2000]
+0xF5CD U+7352 # <cjk> [2000]
+0xF5CE U+3E94 # <cjk> [2000]
+0xF5CF U+736B # <cjk> [2000]
+0xF5D0 U+736C # <cjk> [2000]
+0xF5D1 U+24896 # <cjk> [2000] [Unicode3.1]
+0xF5D2 U+736E # <cjk> [2000]
+0xF5D3 U+736F # <cjk> [2000]
+0xF5D4 U+7371 # <cjk> [2000]
+0xF5D5 U+7377 # <cjk> [2000]
+0xF5D6 U+7381 # <cjk> [2000]
+0xF5D7 U+7385 # <cjk> [2000]
+0xF5D8 U+738A # <cjk> [2000]
+0xF5D9 U+7394 # <cjk> [2000]
+0xF5DA U+7398 # <cjk> [2000]
+0xF5DB U+739C # <cjk> [2000]
+0xF5DC U+739E # <cjk> [2000]
+0xF5DD U+73A5 # <cjk> [2000]
+0xF5DE U+73A8 # <cjk> [2000]
+0xF5DF U+73B5 # <cjk> [2000]
+0xF5E0 U+73B7 # <cjk> [2000]
+0xF5E1 U+73B9 # <cjk> [2000]
+0xF5E2 U+73BC # <cjk> [2000]
+0xF5E3 U+73BF # <cjk> [2000]
+0xF5E4 U+73C5 # <cjk> [2000]
+0xF5E5 U+73CB # <cjk> [2000]
+0xF5E6 U+73E1 # <cjk> [2000]
+0xF5E7 U+73E7 # <cjk> [2000]
+0xF5E8 U+73F9 # <cjk> [2000]
+0xF5E9 U+7413 # <cjk> [2000]
+0xF5EA U+73FA # <cjk> [2000]
+0xF5EB U+7401 # <cjk> [2000]
+0xF5EC U+7424 # <cjk> [2000]
+0xF5ED U+7431 # <cjk> [2000]
+0xF5EE U+7439 # <cjk> [2000]
+0xF5EF U+7453 # <cjk> [2000]
+0xF5F0 U+7440 # <cjk> [2000]
+0xF5F1 U+7443 # <cjk> [2000]
+0xF5F2 U+744D # <cjk> [2000]
+0xF5F3 U+7452 # <cjk> [2000]
+0xF5F4 U+745D # <cjk> [2000]
+0xF5F5 U+7471 # <cjk> [2000]
+0xF5F6 U+7481 # <cjk> [2000]
+0xF5F7 U+7485 # <cjk> [2000]
+0xF5F8 U+7488 # <cjk> [2000]
+0xF5F9 U+24A4D # <cjk> [2000] [Unicode3.1]
+0xF5FA U+7492 # <cjk> [2000]
+0xF5FB U+7497 # <cjk> [2000]
+0xF5FC U+7499 # <cjk> [2000]
+0xF640 U+74A0 # <cjk> [2000]
+0xF641 U+74A1 # <cjk> [2000]
+0xF642 U+74A5 # <cjk> [2000]
+0xF643 U+74AA # <cjk> [2000]
+0xF644 U+74AB # <cjk> [2000]
+0xF645 U+74B9 # <cjk> [2000]
+0xF646 U+74BB # <cjk> [2000]
+0xF647 U+74BA # <cjk> [2000]
+0xF648 U+74D6 # <cjk> [2000]
+0xF649 U+74D8 # <cjk> [2000]
+0xF64A U+74DE # <cjk> [2000]
+0xF64B U+74EF # <cjk> [2000]
+0xF64C U+74EB # <cjk> [2000]
+0xF64D U+24B56 # <cjk> [2000] [Unicode3.1]
+0xF64E U+74FA # <cjk> [2000]
+0xF64F U+24B6F # <cjk> [2000] [Unicode3.1]
+0xF650 U+7520 # <cjk> [2000]
+0xF651 U+7524 # <cjk> [2000]
+0xF652 U+752A # <cjk> [2000]
+0xF653 U+3F57 # <cjk> [2000]
+0xF654 U+24C16 # <cjk> [2000] [Unicode3.1]
+0xF655 U+753D # <cjk> [2000]
+0xF656 U+753E # <cjk> [2000]
+0xF657 U+7540 # <cjk> [2000]
+0xF658 U+7548 # <cjk> [2000]
+0xF659 U+754E # <cjk> [2000]
+0xF65A U+7550 # <cjk> [2000]
+0xF65B U+7552 # <cjk> [2000]
+0xF65C U+756C # <cjk> [2000]
+0xF65D U+7572 # <cjk> [2000]
+0xF65E U+7571 # <cjk> [2000]
+0xF65F U+757A # <cjk> [2000]
+0xF660 U+757D # <cjk> [2000]
+0xF661 U+757E # <cjk> [2000]
+0xF662 U+7581 # <cjk> [2000]
+0xF663 U+24D14 # <cjk> [2000] [Unicode3.1]
+0xF664 U+758C # <cjk> [2000]
+0xF665 U+3F75 # <cjk> [2000]
+0xF666 U+75A2 # <cjk> [2000]
+0xF667 U+3F77 # <cjk> [2000]
+0xF668 U+75B0 # <cjk> [2000]
+0xF669 U+75B7 # <cjk> [2000]
+0xF66A U+75BF # <cjk> [2000]
+0xF66B U+75C0 # <cjk> [2000]
+0xF66C U+75C6 # <cjk> [2000]
+0xF66D U+75CF # <cjk> [2000]
+0xF66E U+75D3 # <cjk> [2000]
+0xF66F U+75DD # <cjk> [2000]
+0xF670 U+75DF # <cjk> [2000]
+0xF671 U+75E0 # <cjk> [2000]
+0xF672 U+75E7 # <cjk> [2000]
+0xF673 U+75EC # <cjk> [2000]
+0xF674 U+75EE # <cjk> [2000]
+0xF675 U+75F1 # <cjk> [2000]
+0xF676 U+75F9 # <cjk> [2000]
+0xF677 U+7603 # <cjk> [2000]
+0xF678 U+7618 # <cjk> [2000]
+0xF679 U+7607 # <cjk> [2000]
+0xF67A U+760F # <cjk> [2000]
+0xF67B U+3FAE # <cjk> [2000]
+0xF67C U+24E0E # <cjk> [2000] [Unicode3.1]
+0xF67D U+7613 # <cjk> [2000]
+0xF67E U+761B # <cjk> [2000]
+0xF680 U+761C # <cjk> [2000]
+0xF681 U+24E37 # <cjk> [2000] [Unicode3.1]
+0xF682 U+7625 # <cjk> [2000]
+0xF683 U+7628 # <cjk> [2000]
+0xF684 U+763C # <cjk> [2000]
+0xF685 U+7633 # <cjk> [2000]
+0xF686 U+24E6A # <cjk> [2000] [Unicode3.1]
+0xF687 U+3FC9 # <cjk> [2000]
+0xF688 U+7641 # <cjk> [2000]
+0xF689 U+24E8B # <cjk> [2000] [Unicode3.1]
+0xF68A U+7649 # <cjk> [2000]
+0xF68B U+7655 # <cjk> [2000]
+0xF68C U+3FD7 # <cjk> [2000]
+0xF68D U+766E # <cjk> [2000]
+0xF68E U+7695 # <cjk> [2000]
+0xF68F U+769C # <cjk> [2000]
+0xF690 U+76A1 # <cjk> [2000]
+0xF691 U+76A0 # <cjk> [2000]
+0xF692 U+76A7 # <cjk> [2000]
+0xF693 U+76A8 # <cjk> [2000]
+0xF694 U+76AF # <cjk> [2000]
+0xF695 U+2504A # <cjk> [2000] [Unicode3.1]
+0xF696 U+76C9 # <cjk> [2000]
+0xF697 U+25055 # <cjk> [2000] [Unicode3.1]
+0xF698 U+76E8 # <cjk> [2000]
+0xF699 U+76EC # <cjk> [2000]
+0xF69A U+25122 # <cjk> [2000] [Unicode3.1]
+0xF69B U+7717 # <cjk> [2000]
+0xF69C U+771A # <cjk> [2000]
+0xF69D U+772D # <cjk> [2000]
+0xF69E U+7735 # <cjk> [2000]
+0xF69F U+251A9 # <cjk> [2000] [Unicode3.1]
+0xF6A0 U+4039 # <cjk> [2000]
+0xF6A1 U+251E5 # <cjk> [2000] [Unicode3.1]
+0xF6A2 U+251CD # <cjk> [2000] [Unicode3.1]
+0xF6A3 U+7758 # <cjk> [2000]
+0xF6A4 U+7760 # <cjk> [2000]
+0xF6A5 U+776A # <cjk> [2000]
+0xF6A6 U+2521E # <cjk> [2000] [Unicode3.1]
+0xF6A7 U+7772 # <cjk> [2000]
+0xF6A8 U+777C # <cjk> [2000]
+0xF6A9 U+777D # <cjk> [2000]
+0xF6AA U+2524C # <cjk> [2000] [Unicode3.1]
+0xF6AB U+4058 # <cjk> [2000]
+0xF6AC U+779A # <cjk> [2000]
+0xF6AD U+779F # <cjk> [2000]
+0xF6AE U+77A2 # <cjk> [2000]
+0xF6AF U+77A4 # <cjk> [2000]
+0xF6B0 U+77A9 # <cjk> [2000]
+0xF6B1 U+77DE # <cjk> [2000]
+0xF6B2 U+77DF # <cjk> [2000]
+0xF6B3 U+77E4 # <cjk> [2000]
+0xF6B4 U+77E6 # <cjk> [2000]
+0xF6B5 U+77EA # <cjk> [2000]
+0xF6B6 U+77EC # <cjk> [2000]
+0xF6B7 U+4093 # <cjk> [2000]
+0xF6B8 U+77F0 # <cjk> [2000]
+0xF6B9 U+77F4 # <cjk> [2000]
+0xF6BA U+77FB # <cjk> [2000]
+0xF6BB U+2542E # <cjk> [2000] [Unicode3.1]
+0xF6BC U+7805 # <cjk> [2000]
+0xF6BD U+7806 # <cjk> [2000]
+0xF6BE U+7809 # <cjk> [2000]
+0xF6BF U+780D # <cjk> [2000]
+0xF6C0 U+7819 # <cjk> [2000]
+0xF6C1 U+7821 # <cjk> [2000]
+0xF6C2 U+782C # <cjk> [2000]
+0xF6C3 U+7847 # <cjk> [2000]
+0xF6C4 U+7864 # <cjk> [2000]
+0xF6C5 U+786A # <cjk> [2000]
+0xF6C6 U+254D9 # <cjk> [2000] [Unicode3.1]
+0xF6C7 U+788A # <cjk> [2000]
+0xF6C8 U+7894 # <cjk> [2000]
+0xF6C9 U+78A4 # <cjk> [2000]
+0xF6CA U+789D # <cjk> [2000]
+0xF6CB U+789E # <cjk> [2000]
+0xF6CC U+789F # <cjk> [2000]
+0xF6CD U+78BB # <cjk> [2000]
+0xF6CE U+78C8 # <cjk> [2000]
+0xF6CF U+78CC # <cjk> [2000]
+0xF6D0 U+78CE # <cjk> [2000]
+0xF6D1 U+78D5 # <cjk> [2000]
+0xF6D2 U+78E0 # <cjk> [2000]
+0xF6D3 U+78E1 # <cjk> [2000]
+0xF6D4 U+78E6 # <cjk> [2000]
+0xF6D5 U+78F9 # <cjk> [2000]
+0xF6D6 U+78FA # <cjk> [2000]
+0xF6D7 U+78FB # <cjk> [2000]
+0xF6D8 U+78FE # <cjk> [2000]
+0xF6D9 U+255A7 # <cjk> [2000] [Unicode3.1]
+0xF6DA U+7910 # <cjk> [2000]
+0xF6DB U+791B # <cjk> [2000]
+0xF6DC U+7930 # <cjk> [2000]
+0xF6DD U+7925 # <cjk> [2000]
+0xF6DE U+793B # <cjk> [2000]
+0xF6DF U+794A # <cjk> [2000]
+0xF6E0 U+7958 # <cjk> [2000]
+0xF6E1 U+795B # <cjk> [2000]
+0xF6E2 U+4105 # <cjk> [2000]
+0xF6E3 U+7967 # <cjk> [2000]
+0xF6E4 U+7972 # <cjk> [2000]
+0xF6E5 U+7994 # <cjk> [2000]
+0xF6E6 U+7995 # <cjk> [2000]
+0xF6E7 U+7996 # <cjk> [2000]
+0xF6E8 U+799B # <cjk> [2000]
+0xF6E9 U+79A1 # <cjk> [2000]
+0xF6EA U+79A9 # <cjk> [2000]
+0xF6EB U+79B4 # <cjk> [2000]
+0xF6EC U+79BB # <cjk> [2000]
+0xF6ED U+79C2 # <cjk> [2000]
+0xF6EE U+79C7 # <cjk> [2000]
+0xF6EF U+79CC # <cjk> [2000]
+0xF6F0 U+79CD # <cjk> [2000]
+0xF6F1 U+79D6 # <cjk> [2000]
+0xF6F2 U+4148 # <cjk> [2000]
+0xF6F3 U+257A9 # <cjk> [2000] [Unicode3.1]
+0xF6F4 U+257B4 # <cjk> [2000] [Unicode3.1]
+0xF6F5 U+414F # <cjk> [2000]
+0xF6F6 U+7A0A # <cjk> [2000]
+0xF6F7 U+7A11 # <cjk> [2000]
+0xF6F8 U+7A15 # <cjk> [2000]
+0xF6F9 U+7A1B # <cjk> [2000]
+0xF6FA U+7A1E # <cjk> [2000]
+0xF6FB U+4163 # <cjk> [2000]
+0xF6FC U+7A2D # <cjk> [2000]
+0xF740 U+7A38 # <cjk> [2000]
+0xF741 U+7A47 # <cjk> [2000]
+0xF742 U+7A4C # <cjk> [2000]
+0xF743 U+7A56 # <cjk> [2000]
+0xF744 U+7A59 # <cjk> [2000]
+0xF745 U+7A5C # <cjk> [2000]
+0xF746 U+7A5F # <cjk> [2000]
+0xF747 U+7A60 # <cjk> [2000]
+0xF748 U+7A67 # <cjk> [2000]
+0xF749 U+7A6A # <cjk> [2000]
+0xF74A U+7A75 # <cjk> [2000]
+0xF74B U+7A78 # <cjk> [2000]
+0xF74C U+7A82 # <cjk> [2000]
+0xF74D U+7A8A # <cjk> [2000]
+0xF74E U+7A90 # <cjk> [2000]
+0xF74F U+7AA3 # <cjk> [2000]
+0xF750 U+7AAC # <cjk> [2000]
+0xF751 U+259D4 # <cjk> [2000] [Unicode3.1]
+0xF752 U+41B4 # <cjk> [2000]
+0xF753 U+7AB9 # <cjk> [2000]
+0xF754 U+7ABC # <cjk> [2000]
+0xF755 U+7ABE # <cjk> [2000]
+0xF756 U+41BF # <cjk> [2000]
+0xF757 U+7ACC # <cjk> [2000]
+0xF758 U+7AD1 # <cjk> [2000]
+0xF759 U+7AE7 # <cjk> [2000]
+0xF75A U+7AE8 # <cjk> [2000]
+0xF75B U+7AF4 # <cjk> [2000]
+0xF75C U+25AE4 # <cjk> [2000] [Unicode3.1]
+0xF75D U+25AE3 # <cjk> [2000] [Unicode3.1]
+0xF75E U+7B07 # <cjk> [2000]
+0xF75F U+25AF1 # <cjk> [2000] [Unicode3.1]
+0xF760 U+7B3D # <cjk> [2000]
+0xF761 U+7B27 # <cjk> [2000]
+0xF762 U+7B2A # <cjk> [2000]
+0xF763 U+7B2E # <cjk> [2000]
+0xF764 U+7B2F # <cjk> [2000]
+0xF765 U+7B31 # <cjk> [2000]
+0xF766 U+41E6 # <cjk> [2000]
+0xF767 U+41F3 # <cjk> [2000]
+0xF768 U+7B7F # <cjk> [2000]
+0xF769 U+7B41 # <cjk> [2000]
+0xF76A U+41EE # <cjk> [2000]
+0xF76B U+7B55 # <cjk> [2000]
+0xF76C U+7B79 # <cjk> [2000]
+0xF76D U+7B64 # <cjk> [2000]
+0xF76E U+7B66 # <cjk> [2000]
+0xF76F U+7B69 # <cjk> [2000]
+0xF770 U+7B73 # <cjk> [2000]
+0xF771 U+25BB2 # <cjk> [2000] [Unicode3.1]
+0xF772 U+4207 # <cjk> [2000]
+0xF773 U+7B90 # <cjk> [2000]
+0xF774 U+7B91 # <cjk> [2000]
+0xF775 U+7B9B # <cjk> [2000]
+0xF776 U+420E # <cjk> [2000]
+0xF777 U+7BAF # <cjk> [2000]
+0xF778 U+7BB5 # <cjk> [2000]
+0xF779 U+7BBC # <cjk> [2000]
+0xF77A U+7BC5 # <cjk> [2000]
+0xF77B U+7BCA # <cjk> [2000]
+0xF77C U+25C4B # <cjk> [2000] [Unicode3.1]
+0xF77D U+25C64 # <cjk> [2000] [Unicode3.1]
+0xF77E U+7BD4 # <cjk> [2000]
+0xF780 U+7BD6 # <cjk> [2000]
+0xF781 U+7BDA # <cjk> [2000]
+0xF782 U+7BEA # <cjk> [2000]
+0xF783 U+7BF0 # <cjk> [2000]
+0xF784 U+7C03 # <cjk> [2000]
+0xF785 U+7C0B # <cjk> [2000]
+0xF786 U+7C0E # <cjk> [2000]
+0xF787 U+7C0F # <cjk> [2000]
+0xF788 U+7C26 # <cjk> [2000]
+0xF789 U+7C45 # <cjk> [2000]
+0xF78A U+7C4A # <cjk> [2000]
+0xF78B U+7C51 # <cjk> [2000]
+0xF78C U+7C57 # <cjk> [2000]
+0xF78D U+7C5E # <cjk> [2000]
+0xF78E U+7C61 # <cjk> [2000]
+0xF78F U+7C69 # <cjk> [2000]
+0xF790 U+7C6E # <cjk> [2000]
+0xF791 U+7C6F # <cjk> [2000]
+0xF792 U+7C70 # <cjk> [2000]
+0xF793 U+25E2E # <cjk> [2000] [Unicode3.1]
+0xF794 U+25E56 # <cjk> [2000] [Unicode3.1]
+0xF795 U+25E65 # <cjk> [2000] [Unicode3.1]
+0xF796 U+7CA6 # <cjk> [2000]
+0xF797 U+25E62 # <cjk> [2000] [Unicode3.1]
+0xF798 U+7CB6 # <cjk> [2000]
+0xF799 U+7CB7 # <cjk> [2000]
+0xF79A U+7CBF # <cjk> [2000]
+0xF79B U+25ED8 # <cjk> [2000] [Unicode3.1]
+0xF79C U+7CC4 # <cjk> [2000]
+0xF79D U+25EC2 # <cjk> [2000] [Unicode3.1]
+0xF79E U+7CC8 # <cjk> [2000]
+0xF79F U+7CCD # <cjk> [2000]
+0xF7A0 U+25EE8 # <cjk> [2000] [Unicode3.1]
+0xF7A1 U+7CD7 # <cjk> [2000]
+0xF7A2 U+25F23 # <cjk> [2000] [Unicode3.1]
+0xF7A3 U+7CE6 # <cjk> [2000]
+0xF7A4 U+7CEB # <cjk> [2000]
+0xF7A5 U+25F5C # <cjk> [2000] [Unicode3.1]
+0xF7A6 U+7CF5 # <cjk> [2000]
+0xF7A7 U+7D03 # <cjk> [2000]
+0xF7A8 U+7D09 # <cjk> [2000]
+0xF7A9 U+42C6 # <cjk> [2000]
+0xF7AA U+7D12 # <cjk> [2000]
+0xF7AB U+7D1E # <cjk> [2000]
+0xF7AC U+25FE0 # <cjk> [2000] [Unicode3.1]
+0xF7AD U+25FD4 # <cjk> [2000] [Unicode3.1]
+0xF7AE U+7D3D # <cjk> [2000]
+0xF7AF U+7D3E # <cjk> [2000]
+0xF7B0 U+7D40 # <cjk> [2000]
+0xF7B1 U+7D47 # <cjk> [2000]
+0xF7B2 U+2600C # <cjk> [2000] [Unicode3.1]
+0xF7B3 U+25FFB # <cjk> [2000] [Unicode3.1]
+0xF7B4 U+42D6 # <cjk> [2000]
+0xF7B5 U+7D59 # <cjk> [2000]
+0xF7B6 U+7D5A # <cjk> [2000]
+0xF7B7 U+7D6A # <cjk> [2000]
+0xF7B8 U+7D70 # <cjk> [2000]
+0xF7B9 U+42DD # <cjk> [2000]
+0xF7BA U+7D7F # <cjk> [2000]
+0xF7BB U+26017 # <cjk> [2000] [Unicode3.1]
+0xF7BC U+7D86 # <cjk> [2000]
+0xF7BD U+7D88 # <cjk> [2000]
+0xF7BE U+7D8C # <cjk> [2000]
+0xF7BF U+7D97 # <cjk> [2000]
+0xF7C0 U+26060 # <cjk> [2000] [Unicode3.1]
+0xF7C1 U+7D9D # <cjk> [2000]
+0xF7C2 U+7DA7 # <cjk> [2000]
+0xF7C3 U+7DAA # <cjk> [2000]
+0xF7C4 U+7DB6 # <cjk> [2000]
+0xF7C5 U+7DB7 # <cjk> [2000]
+0xF7C6 U+7DC0 # <cjk> [2000]
+0xF7C7 U+7DD7 # <cjk> [2000]
+0xF7C8 U+7DD9 # <cjk> [2000]
+0xF7C9 U+7DE6 # <cjk> [2000]
+0xF7CA U+7DF1 # <cjk> [2000]
+0xF7CB U+7DF9 # <cjk> [2000]
+0xF7CC U+4302 # <cjk> [2000]
+0xF7CD U+260ED # <cjk> [2000] [Unicode3.1]
+0xF7CE U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2]
+0xF7CF U+7E10 # <cjk> [2000]
+0xF7D0 U+7E17 # <cjk> [2000]
+0xF7D1 U+7E1D # <cjk> [2000]
+0xF7D2 U+7E20 # <cjk> [2000]
+0xF7D3 U+7E27 # <cjk> [2000]
+0xF7D4 U+7E2C # <cjk> [2000]
+0xF7D5 U+7E45 # <cjk> [2000]
+0xF7D6 U+7E73 # <cjk> [2000]
+0xF7D7 U+7E75 # <cjk> [2000]
+0xF7D8 U+7E7E # <cjk> [2000]
+0xF7D9 U+7E86 # <cjk> [2000]
+0xF7DA U+7E87 # <cjk> [2000]
+0xF7DB U+432B # <cjk> [2000]
+0xF7DC U+7E91 # <cjk> [2000]
+0xF7DD U+7E98 # <cjk> [2000]
+0xF7DE U+7E9A # <cjk> [2000]
+0xF7DF U+4343 # <cjk> [2000]
+0xF7E0 U+7F3C # <cjk> [2000]
+0xF7E1 U+7F3B # <cjk> [2000]
+0xF7E2 U+7F3E # <cjk> [2000]
+0xF7E3 U+7F43 # <cjk> [2000]
+0xF7E4 U+7F44 # <cjk> [2000]
+0xF7E5 U+7F4F # <cjk> [2000]
+0xF7E6 U+34C1 # <cjk> [2000]
+0xF7E7 U+26270 # <cjk> [2000] [Unicode3.1]
+0xF7E8 U+7F52 # <cjk> [2000]
+0xF7E9 U+26286 # <cjk> [2000] [Unicode3.1]
+0xF7EA U+7F61 # <cjk> [2000]
+0xF7EB U+7F63 # <cjk> [2000]
+0xF7EC U+7F64 # <cjk> [2000]
+0xF7ED U+7F6D # <cjk> [2000]
+0xF7EE U+7F7D # <cjk> [2000]
+0xF7EF U+7F7E # <cjk> [2000]
+0xF7F0 U+2634C # <cjk> [2000] [Unicode3.1]
+0xF7F1 U+7F90 # <cjk> [2000]
+0xF7F2 U+517B # <cjk> [2000]
+0xF7F3 U+23D0E # <cjk> [2000] [Unicode3.1]
+0xF7F4 U+7F96 # <cjk> [2000]
+0xF7F5 U+7F9C # <cjk> [2000]
+0xF7F6 U+7FAD # <cjk> [2000]
+0xF7F7 U+26402 # <cjk> [2000] [Unicode3.1]
+0xF7F8 U+7FC3 # <cjk> [2000]
+0xF7F9 U+7FCF # <cjk> [2000]
+0xF7FA U+7FE3 # <cjk> [2000]
+0xF7FB U+7FE5 # <cjk> [2000]
+0xF7FC U+7FEF # <cjk> [2000]
+0xF840 U+7FF2 # <cjk> [2000]
+0xF841 U+8002 # <cjk> [2000]
+0xF842 U+800A # <cjk> [2000]
+0xF843 U+8008 # <cjk> [2000]
+0xF844 U+800E # <cjk> [2000]
+0xF845 U+8011 # <cjk> [2000]
+0xF846 U+8016 # <cjk> [2000]
+0xF847 U+8024 # <cjk> [2000]
+0xF848 U+802C # <cjk> [2000]
+0xF849 U+8030 # <cjk> [2000]
+0xF84A U+8043 # <cjk> [2000]
+0xF84B U+8066 # <cjk> [2000]
+0xF84C U+8071 # <cjk> [2000]
+0xF84D U+8075 # <cjk> [2000]
+0xF84E U+807B # <cjk> [2000]
+0xF84F U+8099 # <cjk> [2000]
+0xF850 U+809C # <cjk> [2000]
+0xF851 U+80A4 # <cjk> [2000]
+0xF852 U+80A7 # <cjk> [2000]
+0xF853 U+80B8 # <cjk> [2000]
+0xF854 U+2667E # <cjk> [2000] [Unicode3.1]
+0xF855 U+80C5 # <cjk> [2000]
+0xF856 U+80D5 # <cjk> [2000]
+0xF857 U+80D8 # <cjk> [2000]
+0xF858 U+80E6 # <cjk> [2000]
+0xF859 U+266B0 # <cjk> [2000] [Unicode3.1]
+0xF85A U+810D # <cjk> [2000]
+0xF85B U+80F5 # <cjk> [2000]
+0xF85C U+80FB # <cjk> [2000]
+0xF85D U+43EE # <cjk> [2000]
+0xF85E U+8135 # <cjk> [2000]
+0xF85F U+8116 # <cjk> [2000]
+0xF860 U+811E # <cjk> [2000]
+0xF861 U+43F0 # <cjk> [2000]
+0xF862 U+8124 # <cjk> [2000]
+0xF863 U+8127 # <cjk> [2000]
+0xF864 U+812C # <cjk> [2000]
+0xF865 U+2671D # <cjk> [2000] [Unicode3.1]
+0xF866 U+813D # <cjk> [2000]
+0xF867 U+4408 # <cjk> [2000]
+0xF868 U+8169 # <cjk> [2000]
+0xF869 U+4417 # <cjk> [2000]
+0xF86A U+8181 # <cjk> [2000]
+0xF86B U+441C # <cjk> [2000]
+0xF86C U+8184 # <cjk> [2000]
+0xF86D U+8185 # <cjk> [2000]
+0xF86E U+4422 # <cjk> [2000]
+0xF86F U+8198 # <cjk> [2000]
+0xF870 U+81B2 # <cjk> [2000]
+0xF871 U+81C1 # <cjk> [2000]
+0xF872 U+81C3 # <cjk> [2000]
+0xF873 U+81D6 # <cjk> [2000]
+0xF874 U+81DB # <cjk> [2000]
+0xF875 U+268DD # <cjk> [2000] [Unicode3.1]
+0xF876 U+81E4 # <cjk> [2000]
+0xF877 U+268EA # <cjk> [2000] [Unicode3.1]
+0xF878 U+81EC # <cjk> [2000]
+0xF879 U+26951 # <cjk> [2000] [Unicode3.1]
+0xF87A U+81FD # <cjk> [2000]
+0xF87B U+81FF # <cjk> [2000]
+0xF87C U+2696F # <cjk> [2000] [Unicode3.1]
+0xF87D U+8204 # <cjk> [2000]
+0xF87E U+269DD # <cjk> [2000] [Unicode3.1]
+0xF880 U+8219 # <cjk> [2000]
+0xF881 U+8221 # <cjk> [2000]
+0xF882 U+8222 # <cjk> [2000]
+0xF883 U+26A1E # <cjk> [2000] [Unicode3.1]
+0xF884 U+8232 # <cjk> [2000]
+0xF885 U+8234 # <cjk> [2000]
+0xF886 U+823C # <cjk> [2000]
+0xF887 U+8246 # <cjk> [2000]
+0xF888 U+8249 # <cjk> [2000]
+0xF889 U+8245 # <cjk> [2000]
+0xF88A U+26A58 # <cjk> [2000] [Unicode3.1]
+0xF88B U+824B # <cjk> [2000]
+0xF88C U+4476 # <cjk> [2000]
+0xF88D U+824F # <cjk> [2000]
+0xF88E U+447A # <cjk> [2000]
+0xF88F U+8257 # <cjk> [2000]
+0xF890 U+26A8C # <cjk> [2000] [Unicode3.1]
+0xF891 U+825C # <cjk> [2000]
+0xF892 U+8263 # <cjk> [2000]
+0xF893 U+26AB7 # <cjk> [2000] [Unicode3.1]
+0xF894 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2]
+0xF895 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2]
+0xF896 U+8279 # <cjk> [2000]
+0xF897 U+4491 # <cjk> [2000]
+0xF898 U+827D # <cjk> [2000]
+0xF899 U+827F # <cjk> [2000]
+0xF89A U+8283 # <cjk> [2000]
+0xF89B U+828A # <cjk> [2000]
+0xF89C U+8293 # <cjk> [2000]
+0xF89D U+82A7 # <cjk> [2000]
+0xF89E U+82A8 # <cjk> [2000]
+0xF89F U+82B2 # <cjk> [2000]
+0xF8A0 U+82B4 # <cjk> [2000]
+0xF8A1 U+82BA # <cjk> [2000]
+0xF8A2 U+82BC # <cjk> [2000]
+0xF8A3 U+82E2 # <cjk> [2000]
+0xF8A4 U+82E8 # <cjk> [2000]
+0xF8A5 U+82F7 # <cjk> [2000]
+0xF8A6 U+8307 # <cjk> [2000]
+0xF8A7 U+8308 # <cjk> [2000]
+0xF8A8 U+830C # <cjk> [2000]
+0xF8A9 U+8354 # <cjk> [2000]
+0xF8AA U+831B # <cjk> [2000]
+0xF8AB U+831D # <cjk> [2000]
+0xF8AC U+8330 # <cjk> [2000]
+0xF8AD U+833C # <cjk> [2000]
+0xF8AE U+8344 # <cjk> [2000]
+0xF8AF U+8357 # <cjk> [2000]
+0xF8B0 U+44BE # <cjk> [2000]
+0xF8B1 U+837F # <cjk> [2000]
+0xF8B2 U+44D4 # <cjk> [2000]
+0xF8B3 U+44B3 # <cjk> [2000]
+0xF8B4 U+838D # <cjk> [2000]
+0xF8B5 U+8394 # <cjk> [2000]
+0xF8B6 U+8395 # <cjk> [2000]
+0xF8B7 U+839B # <cjk> [2000]
+0xF8B8 U+839D # <cjk> [2000]
+0xF8B9 U+83C9 # <cjk> [2000]
+0xF8BA U+83D0 # <cjk> [2000]
+0xF8BB U+83D4 # <cjk> [2000]
+0xF8BC U+83DD # <cjk> [2000]
+0xF8BD U+83E5 # <cjk> [2000]
+0xF8BE U+83F9 # <cjk> [2000]
+0xF8BF U+840F # <cjk> [2000]
+0xF8C0 U+8411 # <cjk> [2000]
+0xF8C1 U+8415 # <cjk> [2000]
+0xF8C2 U+26C73 # <cjk> [2000] [Unicode3.1]
+0xF8C3 U+8417 # <cjk> [2000]
+0xF8C4 U+8439 # <cjk> [2000]
+0xF8C5 U+844A # <cjk> [2000]
+0xF8C6 U+844F # <cjk> [2000]
+0xF8C7 U+8451 # <cjk> [2000]
+0xF8C8 U+8452 # <cjk> [2000]
+0xF8C9 U+8459 # <cjk> [2000]
+0xF8CA U+845A # <cjk> [2000]
+0xF8CB U+845C # <cjk> [2000]
+0xF8CC U+26CDD # <cjk> [2000] [Unicode3.1]
+0xF8CD U+8465 # <cjk> [2000]
+0xF8CE U+8476 # <cjk> [2000]
+0xF8CF U+8478 # <cjk> [2000]
+0xF8D0 U+847C # <cjk> [2000]
+0xF8D1 U+8481 # <cjk> [2000]
+0xF8D2 U+450D # <cjk> [2000]
+0xF8D3 U+84DC # <cjk> [2000]
+0xF8D4 U+8497 # <cjk> [2000]
+0xF8D5 U+84A6 # <cjk> [2000]
+0xF8D6 U+84BE # <cjk> [2000]
+0xF8D7 U+4508 # <cjk> [2000]
+0xF8D8 U+84CE # <cjk> [2000]
+0xF8D9 U+84CF # <cjk> [2000]
+0xF8DA U+84D3 # <cjk> [2000]
+0xF8DB U+26E65 # <cjk> [2000] [Unicode3.1]
+0xF8DC U+84E7 # <cjk> [2000]
+0xF8DD U+84EA # <cjk> [2000]
+0xF8DE U+84EF # <cjk> [2000]
+0xF8DF U+84F0 # <cjk> [2000]
+0xF8E0 U+84F1 # <cjk> [2000]
+0xF8E1 U+84FA # <cjk> [2000]
+0xF8E2 U+84FD # <cjk> [2000]
+0xF8E3 U+850C # <cjk> [2000]
+0xF8E4 U+851B # <cjk> [2000]
+0xF8E5 U+8524 # <cjk> [2000]
+0xF8E6 U+8525 # <cjk> [2000]
+0xF8E7 U+852B # <cjk> [2000]
+0xF8E8 U+8534 # <cjk> [2000]
+0xF8E9 U+854F # <cjk> [2000]
+0xF8EA U+856F # <cjk> [2000]
+0xF8EB U+4525 # <cjk> [2000]
+0xF8EC U+4543 # <cjk> [2000]
+0xF8ED U+853E # <cjk> [2000]
+0xF8EE U+8551 # <cjk> [2000]
+0xF8EF U+8553 # <cjk> [2000]
+0xF8F0 U+855E # <cjk> [2000]
+0xF8F1 U+8561 # <cjk> [2000]
+0xF8F2 U+8562 # <cjk> [2000]
+0xF8F3 U+26F94 # <cjk> [2000] [Unicode3.1]
+0xF8F4 U+857B # <cjk> [2000]
+0xF8F5 U+857D # <cjk> [2000]
+0xF8F6 U+857F # <cjk> [2000]
+0xF8F7 U+8581 # <cjk> [2000]
+0xF8F8 U+8586 # <cjk> [2000]
+0xF8F9 U+8593 # <cjk> [2000]
+0xF8FA U+859D # <cjk> [2000]
+0xF8FB U+859F # <cjk> [2000]
+0xF8FC U+26FF8 # <cjk> [2000] [Unicode3.1]
+0xF940 U+26FF6 # <cjk> [2000] [Unicode3.1]
+0xF941 U+26FF7 # <cjk> [2000] [Unicode3.1]
+0xF942 U+85B7 # <cjk> [2000]
+0xF943 U+85BC # <cjk> [2000]
+0xF944 U+85C7 # <cjk> [2000]
+0xF945 U+85CA # <cjk> [2000]
+0xF946 U+85D8 # <cjk> [2000]
+0xF947 U+85D9 # <cjk> [2000]
+0xF948 U+85DF # <cjk> [2000]
+0xF949 U+85E1 # <cjk> [2000]
+0xF94A U+85E6 # <cjk> [2000]
+0xF94B U+85F6 # <cjk> [2000]
+0xF94C U+8600 # <cjk> [2000]
+0xF94D U+8611 # <cjk> [2000]
+0xF94E U+861E # <cjk> [2000]
+0xF94F U+8621 # <cjk> [2000]
+0xF950 U+8624 # <cjk> [2000]
+0xF951 U+8627 # <cjk> [2000]
+0xF952 U+2710D # <cjk> [2000] [Unicode3.1]
+0xF953 U+8639 # <cjk> [2000]
+0xF954 U+863C # <cjk> [2000]
+0xF955 U+27139 # <cjk> [2000] [Unicode3.1]
+0xF956 U+8640 # <cjk> [2000]
+0xF957 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000]
+0xF958 U+8653 # <cjk> [2000]
+0xF959 U+8656 # <cjk> [2000]
+0xF95A U+866F # <cjk> [2000]
+0xF95B U+8677 # <cjk> [2000]
+0xF95C U+867A # <cjk> [2000]
+0xF95D U+8687 # <cjk> [2000]
+0xF95E U+8689 # <cjk> [2000]
+0xF95F U+868D # <cjk> [2000]
+0xF960 U+8691 # <cjk> [2000]
+0xF961 U+869C # <cjk> [2000]
+0xF962 U+869D # <cjk> [2000]
+0xF963 U+86A8 # <cjk> [2000]
+0xF964 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000]
+0xF965 U+86B1 # <cjk> [2000]
+0xF966 U+86B3 # <cjk> [2000]
+0xF967 U+86C1 # <cjk> [2000]
+0xF968 U+86C3 # <cjk> [2000]
+0xF969 U+86D1 # <cjk> [2000]
+0xF96A U+86D5 # <cjk> [2000]
+0xF96B U+86D7 # <cjk> [2000]
+0xF96C U+86E3 # <cjk> [2000]
+0xF96D U+86E6 # <cjk> [2000]
+0xF96E U+45B8 # <cjk> [2000]
+0xF96F U+8705 # <cjk> [2000]
+0xF970 U+8707 # <cjk> [2000]
+0xF971 U+870E # <cjk> [2000]
+0xF972 U+8710 # <cjk> [2000]
+0xF973 U+8713 # <cjk> [2000]
+0xF974 U+8719 # <cjk> [2000]
+0xF975 U+871F # <cjk> [2000]
+0xF976 U+8721 # <cjk> [2000]
+0xF977 U+8723 # <cjk> [2000]
+0xF978 U+8731 # <cjk> [2000]
+0xF979 U+873A # <cjk> [2000]
+0xF97A U+873E # <cjk> [2000]
+0xF97B U+8740 # <cjk> [2000]
+0xF97C U+8743 # <cjk> [2000]
+0xF97D U+8751 # <cjk> [2000]
+0xF97E U+8758 # <cjk> [2000]
+0xF980 U+8764 # <cjk> [2000]
+0xF981 U+8765 # <cjk> [2000]
+0xF982 U+8772 # <cjk> [2000]
+0xF983 U+877C # <cjk> [2000]
+0xF984 U+273DB # <cjk> [2000] [Unicode3.1]
+0xF985 U+273DA # <cjk> [2000] [Unicode3.1]
+0xF986 U+87A7 # <cjk> [2000]
+0xF987 U+8789 # <cjk> [2000]
+0xF988 U+878B # <cjk> [2000]
+0xF989 U+8793 # <cjk> [2000]
+0xF98A U+87A0 # <cjk> [2000]
+0xF98B U+273FE # <cjk> [2000] [Unicode3.1]
+0xF98C U+45E5 # <cjk> [2000]
+0xF98D U+87BE # <cjk> [2000]
+0xF98E U+27410 # <cjk> [2000] [Unicode3.1]
+0xF98F U+87C1 # <cjk> [2000]
+0xF990 U+87CE # <cjk> [2000]
+0xF991 U+87F5 # <cjk> [2000]
+0xF992 U+87DF # <cjk> [2000]
+0xF993 U+27449 # <cjk> [2000] [Unicode3.1]
+0xF994 U+87E3 # <cjk> [2000]
+0xF995 U+87E5 # <cjk> [2000]
+0xF996 U+87E6 # <cjk> [2000]
+0xF997 U+87EA # <cjk> [2000]
+0xF998 U+87EB # <cjk> [2000]
+0xF999 U+87ED # <cjk> [2000]
+0xF99A U+8801 # <cjk> [2000]
+0xF99B U+8803 # <cjk> [2000]
+0xF99C U+880B # <cjk> [2000]
+0xF99D U+8813 # <cjk> [2000]
+0xF99E U+8828 # <cjk> [2000]
+0xF99F U+882E # <cjk> [2000]
+0xF9A0 U+8832 # <cjk> [2000]
+0xF9A1 U+883C # <cjk> [2000]
+0xF9A2 U+460F # <cjk> [2000]
+0xF9A3 U+884A # <cjk> [2000]
+0xF9A4 U+8858 # <cjk> [2000]
+0xF9A5 U+885F # <cjk> [2000]
+0xF9A6 U+8864 # <cjk> [2000]
+0xF9A7 U+27615 # <cjk> [2000] [Unicode3.1]
+0xF9A8 U+27614 # <cjk> [2000] [Unicode3.1]
+0xF9A9 U+8869 # <cjk> [2000]
+0xF9AA U+27631 # <cjk> [2000] [Unicode3.1]
+0xF9AB U+886F # <cjk> [2000]
+0xF9AC U+88A0 # <cjk> [2000]
+0xF9AD U+88BC # <cjk> [2000]
+0xF9AE U+88BD # <cjk> [2000]
+0xF9AF U+88BE # <cjk> [2000]
+0xF9B0 U+88C0 # <cjk> [2000]
+0xF9B1 U+88D2 # <cjk> [2000]
+0xF9B2 U+27693 # <cjk> [2000] [Unicode3.1]
+0xF9B3 U+88D1 # <cjk> [2000]
+0xF9B4 U+88D3 # <cjk> [2000]
+0xF9B5 U+88DB # <cjk> [2000]
+0xF9B6 U+88F0 # <cjk> [2000]
+0xF9B7 U+88F1 # <cjk> [2000]
+0xF9B8 U+4641 # <cjk> [2000]
+0xF9B9 U+8901 # <cjk> [2000]
+0xF9BA U+2770E # <cjk> [2000] [Unicode3.1]
+0xF9BB U+8937 # <cjk> [2000]
+0xF9BC U+27723 # <cjk> [2000] [Unicode3.1]
+0xF9BD U+8942 # <cjk> [2000]
+0xF9BE U+8945 # <cjk> [2000]
+0xF9BF U+8949 # <cjk> [2000]
+0xF9C0 U+27752 # <cjk> [2000] [Unicode3.1]
+0xF9C1 U+4665 # <cjk> [2000]
+0xF9C2 U+8962 # <cjk> [2000]
+0xF9C3 U+8980 # <cjk> [2000]
+0xF9C4 U+8989 # <cjk> [2000]
+0xF9C5 U+8990 # <cjk> [2000]
+0xF9C6 U+899F # <cjk> [2000]
+0xF9C7 U+89B0 # <cjk> [2000]
+0xF9C8 U+89B7 # <cjk> [2000]
+0xF9C9 U+89D6 # <cjk> [2000]
+0xF9CA U+89D8 # <cjk> [2000]
+0xF9CB U+89EB # <cjk> [2000]
+0xF9CC U+46A1 # <cjk> [2000]
+0xF9CD U+89F1 # <cjk> [2000]
+0xF9CE U+89F3 # <cjk> [2000]
+0xF9CF U+89FD # <cjk> [2000]
+0xF9D0 U+89FF # <cjk> [2000]
+0xF9D1 U+46AF # <cjk> [2000]
+0xF9D2 U+8A11 # <cjk> [2000]
+0xF9D3 U+8A14 # <cjk> [2000]
+0xF9D4 U+27985 # <cjk> [2000] [Unicode3.1]
+0xF9D5 U+8A21 # <cjk> [2000]
+0xF9D6 U+8A35 # <cjk> [2000]
+0xF9D7 U+8A3E # <cjk> [2000]
+0xF9D8 U+8A45 # <cjk> [2000]
+0xF9D9 U+8A4D # <cjk> [2000]
+0xF9DA U+8A58 # <cjk> [2000]
+0xF9DB U+8AAE # <cjk> [2000]
+0xF9DC U+8A90 # <cjk> [2000]
+0xF9DD U+8AB7 # <cjk> [2000]
+0xF9DE U+8ABE # <cjk> [2000]
+0xF9DF U+8AD7 # <cjk> [2000]
+0xF9E0 U+8AFC # <cjk> [2000]
+0xF9E1 U+27A84 # <cjk> [2000] [Unicode3.1]
+0xF9E2 U+8B0A # <cjk> [2000]
+0xF9E3 U+8B05 # <cjk> [2000]
+0xF9E4 U+8B0D # <cjk> [2000]
+0xF9E5 U+8B1C # <cjk> [2000]
+0xF9E6 U+8B1F # <cjk> [2000]
+0xF9E7 U+8B2D # <cjk> [2000]
+0xF9E8 U+8B43 # <cjk> [2000]
+0xF9E9 U+470C # <cjk> [2000]
+0xF9EA U+8B51 # <cjk> [2000]
+0xF9EB U+8B5E # <cjk> [2000]
+0xF9EC U+8B76 # <cjk> [2000]
+0xF9ED U+8B7F # <cjk> [2000]
+0xF9EE U+8B81 # <cjk> [2000]
+0xF9EF U+8B8B # <cjk> [2000]
+0xF9F0 U+8B94 # <cjk> [2000]
+0xF9F1 U+8B95 # <cjk> [2000]
+0xF9F2 U+8B9C # <cjk> [2000]
+0xF9F3 U+8B9E # <cjk> [2000]
+0xF9F4 U+8C39 # <cjk> [2000]
+0xF9F5 U+27BB3 # <cjk> [2000] [Unicode3.1]
+0xF9F6 U+8C3D # <cjk> [2000]
+0xF9F7 U+27BBE # <cjk> [2000] [Unicode3.1]
+0xF9F8 U+27BC7 # <cjk> [2000] [Unicode3.1]
+0xF9F9 U+8C45 # <cjk> [2000]
+0xF9FA U+8C47 # <cjk> [2000]
+0xF9FB U+8C4F # <cjk> [2000]
+0xF9FC U+8C54 # <cjk> [2000]
+0xFA40 U+8C57 # <cjk> [2000]
+0xFA41 U+8C69 # <cjk> [2000]
+0xFA42 U+8C6D # <cjk> [2000]
+0xFA43 U+8C73 # <cjk> [2000]
+0xFA44 U+27CB8 # <cjk> [2000] [Unicode3.1]
+0xFA45 U+8C93 # <cjk> [2000]
+0xFA46 U+8C92 # <cjk> [2000]
+0xFA47 U+8C99 # <cjk> [2000]
+0xFA48 U+4764 # <cjk> [2000]
+0xFA49 U+8C9B # <cjk> [2000]
+0xFA4A U+8CA4 # <cjk> [2000]
+0xFA4B U+8CD6 # <cjk> [2000]
+0xFA4C U+8CD5 # <cjk> [2000]
+0xFA4D U+8CD9 # <cjk> [2000]
+0xFA4E U+27DA0 # <cjk> [2000] [Unicode3.1]
+0xFA4F U+8CF0 # <cjk> [2000]
+0xFA50 U+8CF1 # <cjk> [2000]
+0xFA51 U+27E10 # <cjk> [2000] [Unicode3.1]
+0xFA52 U+8D09 # <cjk> [2000]
+0xFA53 U+8D0E # <cjk> [2000]
+0xFA54 U+8D6C # <cjk> [2000]
+0xFA55 U+8D84 # <cjk> [2000]
+0xFA56 U+8D95 # <cjk> [2000]
+0xFA57 U+8DA6 # <cjk> [2000]
+0xFA58 U+27FB7 # <cjk> [2000] [Unicode3.1]
+0xFA59 U+8DC6 # <cjk> [2000]
+0xFA5A U+8DC8 # <cjk> [2000]
+0xFA5B U+8DD9 # <cjk> [2000]
+0xFA5C U+8DEC # <cjk> [2000]
+0xFA5D U+8E0C # <cjk> [2000]
+0xFA5E U+47FD # <cjk> [2000]
+0xFA5F U+8DFD # <cjk> [2000]
+0xFA60 U+8E06 # <cjk> [2000]
+0xFA61 U+2808A # <cjk> [2000] [Unicode3.1]
+0xFA62 U+8E14 # <cjk> [2000]
+0xFA63 U+8E16 # <cjk> [2000]
+0xFA64 U+8E21 # <cjk> [2000]
+0xFA65 U+8E22 # <cjk> [2000]
+0xFA66 U+8E27 # <cjk> [2000]
+0xFA67 U+280BB # <cjk> [2000] [Unicode3.1]
+0xFA68 U+4816 # <cjk> [2000]
+0xFA69 U+8E36 # <cjk> [2000]
+0xFA6A U+8E39 # <cjk> [2000]
+0xFA6B U+8E4B # <cjk> [2000]
+0xFA6C U+8E54 # <cjk> [2000]
+0xFA6D U+8E62 # <cjk> [2000]
+0xFA6E U+8E6C # <cjk> [2000]
+0xFA6F U+8E6D # <cjk> [2000]
+0xFA70 U+8E6F # <cjk> [2000]
+0xFA71 U+8E98 # <cjk> [2000]
+0xFA72 U+8E9E # <cjk> [2000]
+0xFA73 U+8EAE # <cjk> [2000]
+0xFA74 U+8EB3 # <cjk> [2000]
+0xFA75 U+8EB5 # <cjk> [2000]
+0xFA76 U+8EB6 # <cjk> [2000]
+0xFA77 U+8EBB # <cjk> [2000]
+0xFA78 U+28282 # <cjk> [2000] [Unicode3.1]
+0xFA79 U+8ED1 # <cjk> [2000]
+0xFA7A U+8ED4 # <cjk> [2000]
+0xFA7B U+484E # <cjk> [2000]
+0xFA7C U+8EF9 # <cjk> [2000]
+0xFA7D U+282F3 # <cjk> [2000] [Unicode3.1]
+0xFA7E U+8F00 # <cjk> [2000]
+0xFA80 U+8F08 # <cjk> [2000]
+0xFA81 U+8F17 # <cjk> [2000]
+0xFA82 U+8F2B # <cjk> [2000]
+0xFA83 U+8F40 # <cjk> [2000]
+0xFA84 U+8F4A # <cjk> [2000]
+0xFA85 U+8F58 # <cjk> [2000]
+0xFA86 U+2840C # <cjk> [2000] [Unicode3.1]
+0xFA87 U+8FA4 # <cjk> [2000]
+0xFA88 U+8FB4 # <cjk> [2000]
+0xFA89 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2]
+0xFA8A U+8FB6 # <cjk> [2000]
+0xFA8B U+28455 # <cjk> [2000] [Unicode3.1]
+0xFA8C U+8FC1 # <cjk> [2000]
+0xFA8D U+8FC6 # <cjk> [2000]
+0xFA8E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000]
+0xFA8F U+8FCA # <cjk> [2000]
+0xFA90 U+8FCD # <cjk> [2000]
+0xFA91 U+8FD3 # <cjk> [2000]
+0xFA92 U+8FD5 # <cjk> [2000]
+0xFA93 U+8FE0 # <cjk> [2000]
+0xFA94 U+8FF1 # <cjk> [2000]
+0xFA95 U+8FF5 # <cjk> [2000]
+0xFA96 U+8FFB # <cjk> [2000]
+0xFA97 U+9002 # <cjk> [2000]
+0xFA98 U+900C # <cjk> [2000]
+0xFA99 U+9037 # <cjk> [2000]
+0xFA9A U+2856B # <cjk> [2000] [Unicode3.1]
+0xFA9B U+9043 # <cjk> [2000]
+0xFA9C U+9044 # <cjk> [2000]
+0xFA9D U+905D # <cjk> [2000]
+0xFA9E U+285C8 # <cjk> [2000] [Unicode3.1]
+0xFA9F U+285C9 # <cjk> [2000] [Unicode3.1]
+0xFAA0 U+9085 # <cjk> [2000]
+0xFAA1 U+908C # <cjk> [2000]
+0xFAA2 U+9090 # <cjk> [2000]
+0xFAA3 U+961D # <cjk> [2000]
+0xFAA4 U+90A1 # <cjk> [2000]
+0xFAA5 U+48B5 # <cjk> [2000]
+0xFAA6 U+90B0 # <cjk> [2000]
+0xFAA7 U+90B6 # <cjk> [2000]
+0xFAA8 U+90C3 # <cjk> [2000]
+0xFAA9 U+90C8 # <cjk> [2000]
+0xFAAA U+286D7 # <cjk> [2000] [Unicode3.1]
+0xFAAB U+90DC # <cjk> [2000]
+0xFAAC U+90DF # <cjk> [2000]
+0xFAAD U+286FA # <cjk> [2000] [Unicode3.1]
+0xFAAE U+90F6 # <cjk> [2000]
+0xFAAF U+90F2 # <cjk> [2000]
+0xFAB0 U+9100 # <cjk> [2000]
+0xFAB1 U+90EB # <cjk> [2000]
+0xFAB2 U+90FE # <cjk> [2000]
+0xFAB3 U+90FF # <cjk> [2000]
+0xFAB4 U+9104 # <cjk> [2000]
+0xFAB5 U+9106 # <cjk> [2000]
+0xFAB6 U+9118 # <cjk> [2000]
+0xFAB7 U+911C # <cjk> [2000]
+0xFAB8 U+911E # <cjk> [2000]
+0xFAB9 U+9137 # <cjk> [2000]
+0xFABA U+9139 # <cjk> [2000]
+0xFABB U+913A # <cjk> [2000]
+0xFABC U+9146 # <cjk> [2000]
+0xFABD U+9147 # <cjk> [2000]
+0xFABE U+9157 # <cjk> [2000]
+0xFABF U+9159 # <cjk> [2000]
+0xFAC0 U+9161 # <cjk> [2000]
+0xFAC1 U+9164 # <cjk> [2000]
+0xFAC2 U+9174 # <cjk> [2000]
+0xFAC3 U+9179 # <cjk> [2000]
+0xFAC4 U+9185 # <cjk> [2000]
+0xFAC5 U+918E # <cjk> [2000]
+0xFAC6 U+91A8 # <cjk> [2000]
+0xFAC7 U+91AE # <cjk> [2000]
+0xFAC8 U+91B3 # <cjk> [2000]
+0xFAC9 U+91B6 # <cjk> [2000]
+0xFACA U+91C3 # <cjk> [2000]
+0xFACB U+91C4 # <cjk> [2000]
+0xFACC U+91DA # <cjk> [2000]
+0xFACD U+28949 # <cjk> [2000] [Unicode3.1]
+0xFACE U+28946 # <cjk> [2000] [Unicode3.1]
+0xFACF U+91EC # <cjk> [2000]
+0xFAD0 U+91EE # <cjk> [2000]
+0xFAD1 U+9201 # <cjk> [2000]
+0xFAD2 U+920A # <cjk> [2000]
+0xFAD3 U+9216 # <cjk> [2000]
+0xFAD4 U+9217 # <cjk> [2000]
+0xFAD5 U+2896B # <cjk> [2000] [Unicode3.1]
+0xFAD6 U+9233 # <cjk> [2000]
+0xFAD7 U+9242 # <cjk> [2000]
+0xFAD8 U+9247 # <cjk> [2000]
+0xFAD9 U+924A # <cjk> [2000]
+0xFADA U+924E # <cjk> [2000]
+0xFADB U+9251 # <cjk> [2000]
+0xFADC U+9256 # <cjk> [2000]
+0xFADD U+9259 # <cjk> [2000]
+0xFADE U+9260 # <cjk> [2000]
+0xFADF U+9261 # <cjk> [2000]
+0xFAE0 U+9265 # <cjk> [2000]
+0xFAE1 U+9267 # <cjk> [2000]
+0xFAE2 U+9268 # <cjk> [2000]
+0xFAE3 U+28987 # <cjk> [2000] [Unicode3.1]
+0xFAE4 U+28988 # <cjk> [2000] [Unicode3.1]
+0xFAE5 U+927C # <cjk> [2000]
+0xFAE6 U+927D # <cjk> [2000]
+0xFAE7 U+927F # <cjk> [2000]
+0xFAE8 U+9289 # <cjk> [2000]
+0xFAE9 U+928D # <cjk> [2000]
+0xFAEA U+9297 # <cjk> [2000]
+0xFAEB U+9299 # <cjk> [2000]
+0xFAEC U+929F # <cjk> [2000]
+0xFAED U+92A7 # <cjk> [2000]
+0xFAEE U+92AB # <cjk> [2000]
+0xFAEF U+289BA # <cjk> [2000] [Unicode3.1]
+0xFAF0 U+289BB # <cjk> [2000] [Unicode3.1]
+0xFAF1 U+92B2 # <cjk> [2000]
+0xFAF2 U+92BF # <cjk> [2000]
+0xFAF3 U+92C0 # <cjk> [2000]
+0xFAF4 U+92C6 # <cjk> [2000]
+0xFAF5 U+92CE # <cjk> [2000]
+0xFAF6 U+92D0 # <cjk> [2000]
+0xFAF7 U+92D7 # <cjk> [2000]
+0xFAF8 U+92D9 # <cjk> [2000]
+0xFAF9 U+92E5 # <cjk> [2000]
+0xFAFA U+92E7 # <cjk> [2000]
+0xFAFB U+9311 # <cjk> [2000]
+0xFAFC U+28A1E # <cjk> [2000] [Unicode3.1]
+0xFB40 U+28A29 # <cjk> [2000] [Unicode3.1]
+0xFB41 U+92F7 # <cjk> [2000]
+0xFB42 U+92F9 # <cjk> [2000]
+0xFB43 U+92FB # <cjk> [2000]
+0xFB44 U+9302 # <cjk> [2000]
+0xFB45 U+930D # <cjk> [2000]
+0xFB46 U+9315 # <cjk> [2000]
+0xFB47 U+931D # <cjk> [2000]
+0xFB48 U+931E # <cjk> [2000]
+0xFB49 U+9327 # <cjk> [2000]
+0xFB4A U+9329 # <cjk> [2000]
+0xFB4B U+28A71 # <cjk> [2000] [Unicode3.1]
+0xFB4C U+28A43 # <cjk> [2000] [Unicode3.1]
+0xFB4D U+9347 # <cjk> [2000]
+0xFB4E U+9351 # <cjk> [2000]
+0xFB4F U+9357 # <cjk> [2000]
+0xFB50 U+935A # <cjk> [2000]
+0xFB51 U+936B # <cjk> [2000]
+0xFB52 U+9371 # <cjk> [2000]
+0xFB53 U+9373 # <cjk> [2000]
+0xFB54 U+93A1 # <cjk> [2000]
+0xFB55 U+28A99 # <cjk> [2000] [Unicode3.1]
+0xFB56 U+28ACD # <cjk> [2000] [Unicode3.1]
+0xFB57 U+9388 # <cjk> [2000]
+0xFB58 U+938B # <cjk> [2000]
+0xFB59 U+938F # <cjk> [2000]
+0xFB5A U+939E # <cjk> [2000]
+0xFB5B U+93F5 # <cjk> [2000]
+0xFB5C U+28AE4 # <cjk> [2000] [Unicode3.1]
+0xFB5D U+28ADD # <cjk> [2000] [Unicode3.1]
+0xFB5E U+93F1 # <cjk> [2000]
+0xFB5F U+93C1 # <cjk> [2000]
+0xFB60 U+93C7 # <cjk> [2000]
+0xFB61 U+93DC # <cjk> [2000]
+0xFB62 U+93E2 # <cjk> [2000]
+0xFB63 U+93E7 # <cjk> [2000]
+0xFB64 U+9409 # <cjk> [2000]
+0xFB65 U+940F # <cjk> [2000]
+0xFB66 U+9416 # <cjk> [2000]
+0xFB67 U+9417 # <cjk> [2000]
+0xFB68 U+93FB # <cjk> [2000]
+0xFB69 U+9432 # <cjk> [2000]
+0xFB6A U+9434 # <cjk> [2000]
+0xFB6B U+943B # <cjk> [2000]
+0xFB6C U+9445 # <cjk> [2000]
+0xFB6D U+28BC1 # <cjk> [2000] [Unicode3.1]
+0xFB6E U+28BEF # <cjk> [2000] [Unicode3.1]
+0xFB6F U+946D # <cjk> [2000]
+0xFB70 U+946F # <cjk> [2000]
+0xFB71 U+9578 # <cjk> [2000]
+0xFB72 U+9579 # <cjk> [2000]
+0xFB73 U+9586 # <cjk> [2000]
+0xFB74 U+958C # <cjk> [2000]
+0xFB75 U+958D # <cjk> [2000]
+0xFB76 U+28D10 # <cjk> [2000] [Unicode3.1]
+0xFB77 U+95AB # <cjk> [2000]
+0xFB78 U+95B4 # <cjk> [2000]
+0xFB79 U+28D71 # <cjk> [2000] [Unicode3.1]
+0xFB7A U+95C8 # <cjk> [2000]
+0xFB7B U+28DFB # <cjk> [2000] [Unicode3.1]
+0xFB7C U+28E1F # <cjk> [2000] [Unicode3.1]
+0xFB7D U+962C # <cjk> [2000]
+0xFB7E U+9633 # <cjk> [2000]
+0xFB80 U+9634 # <cjk> [2000]
+0xFB81 U+28E36 # <cjk> [2000] [Unicode3.1]
+0xFB82 U+963C # <cjk> [2000]
+0xFB83 U+9641 # <cjk> [2000]
+0xFB84 U+9661 # <cjk> [2000]
+0xFB85 U+28E89 # <cjk> [2000] [Unicode3.1]
+0xFB86 U+9682 # <cjk> [2000]
+0xFB87 U+28EEB # <cjk> [2000] [Unicode3.1]
+0xFB88 U+969A # <cjk> [2000]
+0xFB89 U+28F32 # <cjk> [2000] [Unicode3.1]
+0xFB8A U+49E7 # <cjk> [2000]
+0xFB8B U+96A9 # <cjk> [2000]
+0xFB8C U+96AF # <cjk> [2000]
+0xFB8D U+96B3 # <cjk> [2000]
+0xFB8E U+96BA # <cjk> [2000]
+0xFB8F U+96BD # <cjk> [2000]
+0xFB90 U+49FA # <cjk> [2000]
+0xFB91 U+28FF8 # <cjk> [2000] [Unicode3.1]
+0xFB92 U+96D8 # <cjk> [2000]
+0xFB93 U+96DA # <cjk> [2000]
+0xFB94 U+96DD # <cjk> [2000]
+0xFB95 U+4A04 # <cjk> [2000]
+0xFB96 U+9714 # <cjk> [2000]
+0xFB97 U+9723 # <cjk> [2000]
+0xFB98 U+4A29 # <cjk> [2000]
+0xFB99 U+9736 # <cjk> [2000]
+0xFB9A U+9741 # <cjk> [2000]
+0xFB9B U+9747 # <cjk> [2000]
+0xFB9C U+9755 # <cjk> [2000]
+0xFB9D U+9757 # <cjk> [2000]
+0xFB9E U+975B # <cjk> [2000]
+0xFB9F U+976A # <cjk> [2000]
+0xFBA0 U+292A0 # <cjk> [2000] [Unicode3.1]
+0xFBA1 U+292B1 # <cjk> [2000] [Unicode3.1]
+0xFBA2 U+9796 # <cjk> [2000]
+0xFBA3 U+979A # <cjk> [2000]
+0xFBA4 U+979E # <cjk> [2000]
+0xFBA5 U+97A2 # <cjk> [2000]
+0xFBA6 U+97B1 # <cjk> [2000]
+0xFBA7 U+97B2 # <cjk> [2000]
+0xFBA8 U+97BE # <cjk> [2000]
+0xFBA9 U+97CC # <cjk> [2000]
+0xFBAA U+97D1 # <cjk> [2000]
+0xFBAB U+97D4 # <cjk> [2000]
+0xFBAC U+97D8 # <cjk> [2000]
+0xFBAD U+97D9 # <cjk> [2000]
+0xFBAE U+97E1 # <cjk> [2000]
+0xFBAF U+97F1 # <cjk> [2000]
+0xFBB0 U+9804 # <cjk> [2000]
+0xFBB1 U+980D # <cjk> [2000]
+0xFBB2 U+980E # <cjk> [2000]
+0xFBB3 U+9814 # <cjk> [2000]
+0xFBB4 U+9816 # <cjk> [2000]
+0xFBB5 U+4ABC # <cjk> [2000]
+0xFBB6 U+29490 # <cjk> [2000] [Unicode3.1]
+0xFBB7 U+9823 # <cjk> [2000]
+0xFBB8 U+9832 # <cjk> [2000]
+0xFBB9 U+9833 # <cjk> [2000]
+0xFBBA U+9825 # <cjk> [2000]
+0xFBBB U+9847 # <cjk> [2000]
+0xFBBC U+9866 # <cjk> [2000]
+0xFBBD U+98AB # <cjk> [2000]
+0xFBBE U+98AD # <cjk> [2000]
+0xFBBF U+98B0 # <cjk> [2000]
+0xFBC0 U+295CF # <cjk> [2000] [Unicode3.1]
+0xFBC1 U+98B7 # <cjk> [2000]
+0xFBC2 U+98B8 # <cjk> [2000]
+0xFBC3 U+98BB # <cjk> [2000]
+0xFBC4 U+98BC # <cjk> [2000]
+0xFBC5 U+98BF # <cjk> [2000]
+0xFBC6 U+98C2 # <cjk> [2000]
+0xFBC7 U+98C7 # <cjk> [2000]
+0xFBC8 U+98CB # <cjk> [2000]
+0xFBC9 U+98E0 # <cjk> [2000]
+0xFBCA U+2967F # <cjk> [2000] [Unicode3.1]
+0xFBCB U+98E1 # <cjk> [2000]
+0xFBCC U+98E3 # <cjk> [2000]
+0xFBCD U+98E5 # <cjk> [2000]
+0xFBCE U+98EA # <cjk> [2000]
+0xFBCF U+98F0 # <cjk> [2000]
+0xFBD0 U+98F1 # <cjk> [2000]
+0xFBD1 U+98F3 # <cjk> [2000]
+0xFBD2 U+9908 # <cjk> [2000]
+0xFBD3 U+4B3B # <cjk> [2000]
+0xFBD4 U+296F0 # <cjk> [2000] [Unicode3.1]
+0xFBD5 U+9916 # <cjk> [2000]
+0xFBD6 U+9917 # <cjk> [2000]
+0xFBD7 U+29719 # <cjk> [2000] [Unicode3.1]
+0xFBD8 U+991A # <cjk> [2000]
+0xFBD9 U+991B # <cjk> [2000]
+0xFBDA U+991C # <cjk> [2000]
+0xFBDB U+29750 # <cjk> [2000] [Unicode3.1]
+0xFBDC U+9931 # <cjk> [2000]
+0xFBDD U+9932 # <cjk> [2000]
+0xFBDE U+9933 # <cjk> [2000]
+0xFBDF U+993A # <cjk> [2000]
+0xFBE0 U+993B # <cjk> [2000]
+0xFBE1 U+993C # <cjk> [2000]
+0xFBE2 U+9940 # <cjk> [2000]
+0xFBE3 U+9941 # <cjk> [2000]
+0xFBE4 U+9946 # <cjk> [2000]
+0xFBE5 U+994D # <cjk> [2000]
+0xFBE6 U+994E # <cjk> [2000]
+0xFBE7 U+995C # <cjk> [2000]
+0xFBE8 U+995F # <cjk> [2000]
+0xFBE9 U+9960 # <cjk> [2000]
+0xFBEA U+99A3 # <cjk> [2000]
+0xFBEB U+99A6 # <cjk> [2000]
+0xFBEC U+99B9 # <cjk> [2000]
+0xFBED U+99BD # <cjk> [2000]
+0xFBEE U+99BF # <cjk> [2000]
+0xFBEF U+99C3 # <cjk> [2000]
+0xFBF0 U+99C9 # <cjk> [2000]
+0xFBF1 U+99D4 # <cjk> [2000]
+0xFBF2 U+99D9 # <cjk> [2000]
+0xFBF3 U+99DE # <cjk> [2000]
+0xFBF4 U+298C6 # <cjk> [2000] [Unicode3.1]
+0xFBF5 U+99F0 # <cjk> [2000]
+0xFBF6 U+99F9 # <cjk> [2000]
+0xFBF7 U+99FC # <cjk> [2000]
+0xFBF8 U+9A0A # <cjk> [2000]
+0xFBF9 U+9A11 # <cjk> [2000]
+0xFBFA U+9A16 # <cjk> [2000]
+0xFBFB U+9A1A # <cjk> [2000]
+0xFBFC U+9A20 # <cjk> [2000]
+0xFC40 U+9A31 # <cjk> [2000]
+0xFC41 U+9A36 # <cjk> [2000]
+0xFC42 U+9A44 # <cjk> [2000]
+0xFC43 U+9A4C # <cjk> [2000]
+0xFC44 U+9A58 # <cjk> [2000]
+0xFC45 U+4BC2 # <cjk> [2000]
+0xFC46 U+9AAF # <cjk> [2000]
+0xFC47 U+4BCA # <cjk> [2000]
+0xFC48 U+9AB7 # <cjk> [2000]
+0xFC49 U+4BD2 # <cjk> [2000]
+0xFC4A U+9AB9 # <cjk> [2000]
+0xFC4B U+29A72 # <cjk> [2000] [Unicode3.1]
+0xFC4C U+9AC6 # <cjk> [2000]
+0xFC4D U+9AD0 # <cjk> [2000]
+0xFC4E U+9AD2 # <cjk> [2000]
+0xFC4F U+9AD5 # <cjk> [2000]
+0xFC50 U+4BE8 # <cjk> [2000]
+0xFC51 U+9ADC # <cjk> [2000]
+0xFC52 U+9AE0 # <cjk> [2000]
+0xFC53 U+9AE5 # <cjk> [2000]
+0xFC54 U+9AE9 # <cjk> [2000]
+0xFC55 U+9B03 # <cjk> [2000]
+0xFC56 U+9B0C # <cjk> [2000]
+0xFC57 U+9B10 # <cjk> [2000]
+0xFC58 U+9B12 # <cjk> [2000]
+0xFC59 U+9B16 # <cjk> [2000]
+0xFC5A U+9B1C # <cjk> [2000]
+0xFC5B U+9B2B # <cjk> [2000]
+0xFC5C U+9B33 # <cjk> [2000]
+0xFC5D U+9B3D # <cjk> [2000]
+0xFC5E U+4C20 # <cjk> [2000]
+0xFC5F U+9B4B # <cjk> [2000]
+0xFC60 U+9B63 # <cjk> [2000]
+0xFC61 U+9B65 # <cjk> [2000]
+0xFC62 U+9B6B # <cjk> [2000]
+0xFC63 U+9B6C # <cjk> [2000]
+0xFC64 U+9B73 # <cjk> [2000]
+0xFC65 U+9B76 # <cjk> [2000]
+0xFC66 U+9B77 # <cjk> [2000]
+0xFC67 U+9BA6 # <cjk> [2000]
+0xFC68 U+9BAC # <cjk> [2000]
+0xFC69 U+9BB1 # <cjk> [2000]
+0xFC6A U+29DDB # <cjk> [2000] [Unicode3.1]
+0xFC6B U+29E3D # <cjk> [2000] [Unicode3.1]
+0xFC6C U+9BB2 # <cjk> [2000]
+0xFC6D U+9BB8 # <cjk> [2000]
+0xFC6E U+9BBE # <cjk> [2000]
+0xFC6F U+9BC7 # <cjk> [2000]
+0xFC70 U+9BF3 # <cjk> [2000]
+0xFC71 U+9BD8 # <cjk> [2000]
+0xFC72 U+9BDD # <cjk> [2000]
+0xFC73 U+9BE7 # <cjk> [2000]
+0xFC74 U+9BEA # <cjk> [2000]
+0xFC75 U+9BEB # <cjk> [2000]
+0xFC76 U+9BEF # <cjk> [2000]
+0xFC77 U+9BEE # <cjk> [2000]
+0xFC78 U+29E15 # <cjk> [2000] [Unicode3.1]
+0xFC79 U+9BFA # <cjk> [2000]
+0xFC7A U+29E8A # <cjk> [2000] [Unicode3.1]
+0xFC7B U+9BF7 # <cjk> [2000]
+0xFC7C U+29E49 # <cjk> [2000] [Unicode3.1]
+0xFC7D U+9C16 # <cjk> [2000]
+0xFC7E U+9C18 # <cjk> [2000]
+0xFC80 U+9C19 # <cjk> [2000]
+0xFC81 U+9C1A # <cjk> [2000]
+0xFC82 U+9C1D # <cjk> [2000]
+0xFC83 U+9C22 # <cjk> [2000]
+0xFC84 U+9C27 # <cjk> [2000]
+0xFC85 U+9C29 # <cjk> [2000]
+0xFC86 U+9C2A # <cjk> [2000]
+0xFC87 U+29EC4 # <cjk> [2000] [Unicode3.1]
+0xFC88 U+9C31 # <cjk> [2000]
+0xFC89 U+9C36 # <cjk> [2000]
+0xFC8A U+9C37 # <cjk> [2000]
+0xFC8B U+9C45 # <cjk> [2000]
+0xFC8C U+9C5C # <cjk> [2000]
+0xFC8D U+29EE9 # <cjk> [2000] [Unicode3.1]
+0xFC8E U+9C49 # <cjk> [2000]
+0xFC8F U+9C4A # <cjk> [2000]
+0xFC90 U+29EDB # <cjk> [2000] [Unicode3.1]
+0xFC91 U+9C54 # <cjk> [2000]
+0xFC92 U+9C58 # <cjk> [2000]
+0xFC93 U+9C5B # <cjk> [2000]
+0xFC94 U+9C5D # <cjk> [2000]
+0xFC95 U+9C5F # <cjk> [2000]
+0xFC96 U+9C69 # <cjk> [2000]
+0xFC97 U+9C6A # <cjk> [2000]
+0xFC98 U+9C6B # <cjk> [2000]
+0xFC99 U+9C6D # <cjk> [2000]
+0xFC9A U+9C6E # <cjk> [2000]
+0xFC9B U+9C70 # <cjk> [2000]
+0xFC9C U+9C72 # <cjk> [2000]
+0xFC9D U+9C75 # <cjk> [2000]
+0xFC9E U+9C7A # <cjk> [2000]
+0xFC9F U+9CE6 # <cjk> [2000]
+0xFCA0 U+9CF2 # <cjk> [2000]
+0xFCA1 U+9D0B # <cjk> [2000]
+0xFCA2 U+9D02 # <cjk> [2000]
+0xFCA3 U+29FCE # <cjk> [2000] [Unicode3.1]
+0xFCA4 U+9D11 # <cjk> [2000]
+0xFCA5 U+9D17 # <cjk> [2000]
+0xFCA6 U+9D18 # <cjk> [2000]
+0xFCA7 U+2A02F # <cjk> [2000] [Unicode3.1]
+0xFCA8 U+4CC4 # <cjk> [2000]
+0xFCA9 U+2A01A # <cjk> [2000] [Unicode3.1]
+0xFCAA U+9D32 # <cjk> [2000]
+0xFCAB U+4CD1 # <cjk> [2000]
+0xFCAC U+9D42 # <cjk> [2000]
+0xFCAD U+9D4A # <cjk> [2000]
+0xFCAE U+9D5F # <cjk> [2000]
+0xFCAF U+9D62 # <cjk> [2000]
+0xFCB0 U+2A0F9 # <cjk> [2000] [Unicode3.1]
+0xFCB1 U+9D69 # <cjk> [2000]
+0xFCB2 U+9D6B # <cjk> [2000]
+0xFCB3 U+2A082 # <cjk> [2000] [Unicode3.1]
+0xFCB4 U+9D73 # <cjk> [2000]
+0xFCB5 U+9D76 # <cjk> [2000]
+0xFCB6 U+9D77 # <cjk> [2000]
+0xFCB7 U+9D7E # <cjk> [2000]
+0xFCB8 U+9D84 # <cjk> [2000]
+0xFCB9 U+9D8D # <cjk> [2000]
+0xFCBA U+9D99 # <cjk> [2000]
+0xFCBB U+9DA1 # <cjk> [2000]
+0xFCBC U+9DBF # <cjk> [2000]
+0xFCBD U+9DB5 # <cjk> [2000]
+0xFCBE U+9DB9 # <cjk> [2000]
+0xFCBF U+9DBD # <cjk> [2000]
+0xFCC0 U+9DC3 # <cjk> [2000]
+0xFCC1 U+9DC7 # <cjk> [2000]
+0xFCC2 U+9DC9 # <cjk> [2000]
+0xFCC3 U+9DD6 # <cjk> [2000]
+0xFCC4 U+9DDA # <cjk> [2000]
+0xFCC5 U+9DDF # <cjk> [2000]
+0xFCC6 U+9DE0 # <cjk> [2000]
+0xFCC7 U+9DE3 # <cjk> [2000]
+0xFCC8 U+9DF4 # <cjk> [2000]
+0xFCC9 U+4D07 # <cjk> [2000]
+0xFCCA U+9E0A # <cjk> [2000]
+0xFCCB U+9E02 # <cjk> [2000]
+0xFCCC U+9E0D # <cjk> [2000]
+0xFCCD U+9E19 # <cjk> [2000]
+0xFCCE U+9E1C # <cjk> [2000]
+0xFCCF U+9E1D # <cjk> [2000]
+0xFCD0 U+9E7B # <cjk> [2000]
+0xFCD1 U+22218 # <cjk> [2000] [Unicode3.1]
+0xFCD2 U+9E80 # <cjk> [2000]
+0xFCD3 U+9E85 # <cjk> [2000]
+0xFCD4 U+9E9B # <cjk> [2000]
+0xFCD5 U+9EA8 # <cjk> [2000]
+0xFCD6 U+2A38C # <cjk> [2000] [Unicode3.1]
+0xFCD7 U+9EBD # <cjk> [2000]
+0xFCD8 U+2A437 # <cjk> [2000] [Unicode3.1]
+0xFCD9 U+9EDF # <cjk> [2000]
+0xFCDA U+9EE7 # <cjk> [2000]
+0xFCDB U+9EEE # <cjk> [2000]
+0xFCDC U+9EFF # <cjk> [2000]
+0xFCDD U+9F02 # <cjk> [2000]
+0xFCDE U+4D77 # <cjk> [2000]
+0xFCDF U+9F03 # <cjk> [2000]
+0xFCE0 U+9F17 # <cjk> [2000]
+0xFCE1 U+9F19 # <cjk> [2000]
+0xFCE2 U+9F2F # <cjk> [2000]
+0xFCE3 U+9F37 # <cjk> [2000]
+0xFCE4 U+9F3A # <cjk> [2000]
+0xFCE5 U+9F3D # <cjk> [2000]
+0xFCE6 U+9F41 # <cjk> [2000]
+0xFCE7 U+9F45 # <cjk> [2000]
+0xFCE8 U+9F46 # <cjk> [2000]
+0xFCE9 U+9F53 # <cjk> [2000]
+0xFCEA U+9F55 # <cjk> [2000]
+0xFCEB U+9F58 # <cjk> [2000]
+0xFCEC U+2A5F1 # <cjk> [2000] [Unicode3.1]
+0xFCED U+9F5D # <cjk> [2000]
+0xFCEE U+2A602 # <cjk> [2000] [Unicode3.1]
+0xFCEF U+9F69 # <cjk> [2000]
+0xFCF0 U+2A61A # <cjk> [2000] [Unicode3.1]
+0xFCF1 U+9F6D # <cjk> [2000]
+0xFCF2 U+9F70 # <cjk> [2000]
+0xFCF3 U+9F75 # <cjk> [2000]
+0xFCF4 U+2A6B2 # <cjk> [2000] [Unicode3.1]
diff --git a/src/backend/utils/mb/Unicode/sjis_to_utf8.map b/src/backend/utils/mb/Unicode/sjis_to_utf8.map
new file mode 100644
index 0000000..ece6c03
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/sjis_to_utf8.map
@@ -0,0 +1,2417 @@
+/* src/backend/utils/mb/Unicode/sjis_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_SJIS.pl */
+
+static const uint32 sjis_to_unicode_tree_table[8786];
+
+static const pg_mb_radix_tree sjis_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ sjis_to_unicode_tree_table,
+
+ 0x00bd, /* offset of table for 1-byte inputs */
+ 0xa1, /* b1_lower */
+ 0xdf, /* b1_upper */
+
+ 0x00fc, /* offset of table for 2-byte inputs */
+ 0x81, /* b2_1_lower */
+ 0xfc, /* b2_1_upper */
+ 0x40, /* b2_2_lower */
+ 0xfc, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 sjis_to_unicode_tree_table[8786] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x000bd ***/
+
+ /* a1 */ 0xefbda1, 0xefbda2, 0xefbda3, 0xefbda4,
+ /* a5 */ 0xefbda5, 0xefbda6, 0xefbda7, 0xefbda8,
+ /* a9 */ 0xefbda9, 0xefbdaa, 0xefbdab, 0xefbdac,
+ /* ad */ 0xefbdad, 0xefbdae, 0xefbdaf, 0xefbdb0,
+ /* b1 */ 0xefbdb1, 0xefbdb2, 0xefbdb3, 0xefbdb4,
+ /* b5 */ 0xefbdb5, 0xefbdb6, 0xefbdb7, 0xefbdb8,
+ /* b9 */ 0xefbdb9, 0xefbdba, 0xefbdbb, 0xefbdbc,
+ /* bd */ 0xefbdbd, 0xefbdbe, 0xefbdbf, 0xefbe80,
+ /* c1 */ 0xefbe81, 0xefbe82, 0xefbe83, 0xefbe84,
+ /* c5 */ 0xefbe85, 0xefbe86, 0xefbe87, 0xefbe88,
+ /* c9 */ 0xefbe89, 0xefbe8a, 0xefbe8b, 0xefbe8c,
+ /* cd */ 0xefbe8d, 0xefbe8e, 0xefbe8f, 0xefbe90,
+ /* d1 */ 0xefbe91, 0xefbe92, 0xefbe93, 0xefbe94,
+ /* d5 */ 0xefbe95, 0xefbe96, 0xefbe97, 0xefbe98,
+ /* d9 */ 0xefbe99, 0xefbe9a, 0xefbe9b, 0xefbe9c,
+ /* dd */ 0xefbe9d, 0xefbe9e, 0xefbe9f,
+
+ /*** Two byte table, byte #1: xx - offset 0x000fc ***/
+
+ /* 81 */ 0x000178, 0x000235, 0x0002f2, 0x0003af,
+ /* 85 */ 0x000000, 0x000000, 0x00046c, 0x0004ca,
+ /* 89 */ 0x000587, 0x000644, 0x000701, 0x0007be,
+ /* 8d */ 0x00087b, 0x000938, 0x0009f5, 0x000ab2,
+ /* 91 */ 0x000b6f, 0x000c2c, 0x000ce9, 0x000da6,
+ /* 95 */ 0x000e63, 0x000f20, 0x000fdd, 0x00109a,
+ /* 99 */ 0x001157, 0x001214, 0x0012d1, 0x00138e,
+ /* 9d */ 0x00144b, 0x001508, 0x0015c5, 0x000000,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x001682,
+ /* e1 */ 0x00173f, 0x0017fc, 0x0018b9, 0x001976,
+ /* e5 */ 0x001a33, 0x001af0, 0x001bad, 0x001c6a,
+ /* e9 */ 0x001d27, 0x001de4, 0x000000, 0x000000,
+ /* ed */ 0x001ea1, 0x001f5e, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x00201b, 0x0020d8, 0x002195,
+
+ /*** Two byte table, leaf: 81xx - offset 0x00178 ***/
+
+ /* 40 */ 0xe38080, 0xe38081, 0xe38082, 0xefbc8c,
+ /* 44 */ 0xefbc8e, 0xe383bb, 0xefbc9a, 0xefbc9b,
+ /* 48 */ 0xefbc9f, 0xefbc81, 0xe3829b, 0xe3829c,
+ /* 4c */ 0x00c2b4, 0xefbd80, 0x00c2a8, 0xefbcbe,
+ /* 50 */ 0xefbfa3, 0xefbcbf, 0xe383bd, 0xe383be,
+ /* 54 */ 0xe3829d, 0xe3829e, 0xe38083, 0xe4bb9d,
+ /* 58 */ 0xe38085, 0xe38086, 0xe38087, 0xe383bc,
+ /* 5c */ 0xe28095, 0xe28090, 0xefbc8f, 0xefbcbc,
+ /* 60 */ 0xefbd9e, 0xe288a5, 0xefbd9c, 0xe280a6,
+ /* 64 */ 0xe280a5, 0xe28098, 0xe28099, 0xe2809c,
+ /* 68 */ 0xe2809d, 0xefbc88, 0xefbc89, 0xe38094,
+ /* 6c */ 0xe38095, 0xefbcbb, 0xefbcbd, 0xefbd9b,
+ /* 70 */ 0xefbd9d, 0xe38088, 0xe38089, 0xe3808a,
+ /* 74 */ 0xe3808b, 0xe3808c, 0xe3808d, 0xe3808e,
+ /* 78 */ 0xe3808f, 0xe38090, 0xe38091, 0xefbc8b,
+ /* 7c */ 0xefbc8d, 0x00c2b1, 0x00c397, 0x000000,
+ /* 80 */ 0x00c3b7, 0xefbc9d, 0xe289a0, 0xefbc9c,
+ /* 84 */ 0xefbc9e, 0xe289a6, 0xe289a7, 0xe2889e,
+ /* 88 */ 0xe288b4, 0xe29982, 0xe29980, 0x00c2b0,
+ /* 8c */ 0xe280b2, 0xe280b3, 0xe28483, 0xefbfa5,
+ /* 90 */ 0xefbc84, 0xefbfa0, 0xefbfa1, 0xefbc85,
+ /* 94 */ 0xefbc83, 0xefbc86, 0xefbc8a, 0xefbca0,
+ /* 98 */ 0x00c2a7, 0xe29886, 0xe29885, 0xe2978b,
+ /* 9c */ 0xe2978f, 0xe2978e, 0xe29787, 0xe29786,
+ /* a0 */ 0xe296a1, 0xe296a0, 0xe296b3, 0xe296b2,
+ /* a4 */ 0xe296bd, 0xe296bc, 0xe280bb, 0xe38092,
+ /* a8 */ 0xe28692, 0xe28690, 0xe28691, 0xe28693,
+ /* ac */ 0xe38093, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0xe28888, 0xe2888b, 0xe28a86, 0xe28a87,
+ /* bc */ 0xe28a82, 0xe28a83, 0xe288aa, 0xe288a9,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0xe288a7, 0xe288a8, 0xefbfa2, 0xe28792,
+ /* cc */ 0xe28794, 0xe28880, 0xe28883, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0xe288a0, 0xe28aa5,
+ /* dc */ 0xe28c92, 0xe28882, 0xe28887, 0xe289a1,
+ /* e0 */ 0xe28992, 0xe289aa, 0xe289ab, 0xe2889a,
+ /* e4 */ 0xe288bd, 0xe2889d, 0xe288b5, 0xe288ab,
+ /* e8 */ 0xe288ac, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0xe284ab, 0xe280b0, 0xe299af, 0xe299ad,
+ /* f4 */ 0xe299aa, 0xe280a0, 0xe280a1, 0x00c2b6,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0xe297af,
+
+ /*** Two byte table, leaf: 82xx - offset 0x00235 ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0xefbc90,
+ /* 50 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* 54 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* 58 */ 0xefbc99, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* 64 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* 68 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* 6c */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* 70 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* 74 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* 78 */ 0xefbcb9, 0xefbcba, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0xefbd81, 0xefbd82, 0xefbd83,
+ /* 84 */ 0xefbd84, 0xefbd85, 0xefbd86, 0xefbd87,
+ /* 88 */ 0xefbd88, 0xefbd89, 0xefbd8a, 0xefbd8b,
+ /* 8c */ 0xefbd8c, 0xefbd8d, 0xefbd8e, 0xefbd8f,
+ /* 90 */ 0xefbd90, 0xefbd91, 0xefbd92, 0xefbd93,
+ /* 94 */ 0xefbd94, 0xefbd95, 0xefbd96, 0xefbd97,
+ /* 98 */ 0xefbd98, 0xefbd99, 0xefbd9a, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0xe38181,
+ /* a0 */ 0xe38182, 0xe38183, 0xe38184, 0xe38185,
+ /* a4 */ 0xe38186, 0xe38187, 0xe38188, 0xe38189,
+ /* a8 */ 0xe3818a, 0xe3818b, 0xe3818c, 0xe3818d,
+ /* ac */ 0xe3818e, 0xe3818f, 0xe38190, 0xe38191,
+ /* b0 */ 0xe38192, 0xe38193, 0xe38194, 0xe38195,
+ /* b4 */ 0xe38196, 0xe38197, 0xe38198, 0xe38199,
+ /* b8 */ 0xe3819a, 0xe3819b, 0xe3819c, 0xe3819d,
+ /* bc */ 0xe3819e, 0xe3819f, 0xe381a0, 0xe381a1,
+ /* c0 */ 0xe381a2, 0xe381a3, 0xe381a4, 0xe381a5,
+ /* c4 */ 0xe381a6, 0xe381a7, 0xe381a8, 0xe381a9,
+ /* c8 */ 0xe381aa, 0xe381ab, 0xe381ac, 0xe381ad,
+ /* cc */ 0xe381ae, 0xe381af, 0xe381b0, 0xe381b1,
+ /* d0 */ 0xe381b2, 0xe381b3, 0xe381b4, 0xe381b5,
+ /* d4 */ 0xe381b6, 0xe381b7, 0xe381b8, 0xe381b9,
+ /* d8 */ 0xe381ba, 0xe381bb, 0xe381bc, 0xe381bd,
+ /* dc */ 0xe381be, 0xe381bf, 0xe38280, 0xe38281,
+ /* e0 */ 0xe38282, 0xe38283, 0xe38284, 0xe38285,
+ /* e4 */ 0xe38286, 0xe38287, 0xe38288, 0xe38289,
+ /* e8 */ 0xe3828a, 0xe3828b, 0xe3828c, 0xe3828d,
+ /* ec */ 0xe3828e, 0xe3828f, 0xe38290, 0xe38291,
+ /* f0 */ 0xe38292, 0xe38293, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000,
+
+ /*** Two byte table, leaf: 83xx - offset 0x002f2 ***/
+
+ /* 40 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* 44 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* 48 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* 4c */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* 50 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* 54 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* 58 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* 5c */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* 60 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* 64 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* 68 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* 6c */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* 70 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* 74 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* 78 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* 7c */ 0xe3839d, 0xe3839e, 0xe3839f, 0x000000,
+ /* 80 */ 0xe383a0, 0xe383a1, 0xe383a2, 0xe383a3,
+ /* 84 */ 0xe383a4, 0xe383a5, 0xe383a6, 0xe383a7,
+ /* 88 */ 0xe383a8, 0xe383a9, 0xe383aa, 0xe383ab,
+ /* 8c */ 0xe383ac, 0xe383ad, 0xe383ae, 0xe383af,
+ /* 90 */ 0xe383b0, 0xe383b1, 0xe383b2, 0xe383b3,
+ /* 94 */ 0xe383b4, 0xe383b5, 0xe383b6, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00ce91,
+ /* a0 */ 0x00ce92, 0x00ce93, 0x00ce94, 0x00ce95,
+ /* a4 */ 0x00ce96, 0x00ce97, 0x00ce98, 0x00ce99,
+ /* a8 */ 0x00ce9a, 0x00ce9b, 0x00ce9c, 0x00ce9d,
+ /* ac */ 0x00ce9e, 0x00ce9f, 0x00cea0, 0x00cea1,
+ /* b0 */ 0x00cea3, 0x00cea4, 0x00cea5, 0x00cea6,
+ /* b4 */ 0x00cea7, 0x00cea8, 0x00cea9, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00ceb1,
+ /* c0 */ 0x00ceb2, 0x00ceb3, 0x00ceb4, 0x00ceb5,
+ /* c4 */ 0x00ceb6, 0x00ceb7, 0x00ceb8, 0x00ceb9,
+ /* c8 */ 0x00ceba, 0x00cebb, 0x00cebc, 0x00cebd,
+ /* cc */ 0x00cebe, 0x00cebf, 0x00cf80, 0x00cf81,
+ /* d0 */ 0x00cf83, 0x00cf84, 0x00cf85, 0x00cf86,
+ /* d4 */ 0x00cf87, 0x00cf88, 0x00cf89, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000,
+
+ /*** Two byte table, leaf: 84xx - offset 0x003af ***/
+
+ /* 40 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* 44 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* 48 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* 4c */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* 50 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* 54 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* 58 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* 5c */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* 60 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* 74 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* 78 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* 7c */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x000000,
+ /* 80 */ 0x00d0be, 0x00d0bf, 0x00d180, 0x00d181,
+ /* 84 */ 0x00d182, 0x00d183, 0x00d184, 0x00d185,
+ /* 88 */ 0x00d186, 0x00d187, 0x00d188, 0x00d189,
+ /* 8c */ 0x00d18a, 0x00d18b, 0x00d18c, 0x00d18d,
+ /* 90 */ 0x00d18e, 0x00d18f, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0xe29480,
+ /* a0 */ 0xe29482, 0xe2948c, 0xe29490, 0xe29498,
+ /* a4 */ 0xe29494, 0xe2949c, 0xe294ac, 0xe294a4,
+ /* a8 */ 0xe294b4, 0xe294bc, 0xe29481, 0xe29483,
+ /* ac */ 0xe2948f, 0xe29493, 0xe2949b, 0xe29497,
+ /* b0 */ 0xe294a3, 0xe294b3, 0xe294ab, 0xe294bb,
+ /* b4 */ 0xe2958b, 0xe294a0, 0xe294af, 0xe294a8,
+ /* b8 */ 0xe294b7, 0xe294bf, 0xe2949d, 0xe294b0,
+ /* bc */ 0xe294a5, 0xe294b8, 0xe29582, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000,
+
+ /*** Two byte table, leaf: 87xx - offset 0x0046c ***/
+
+ /* 40 */ 0xe291a0, 0xe291a1, 0xe291a2, 0xe291a3,
+ /* 44 */ 0xe291a4, 0xe291a5, 0xe291a6, 0xe291a7,
+ /* 48 */ 0xe291a8, 0xe291a9, 0xe291aa, 0xe291ab,
+ /* 4c */ 0xe291ac, 0xe291ad, 0xe291ae, 0xe291af,
+ /* 50 */ 0xe291b0, 0xe291b1, 0xe291b2, 0xe291b3,
+ /* 54 */ 0xe285a0, 0xe285a1, 0xe285a2, 0xe285a3,
+ /* 58 */ 0xe285a4, 0xe285a5, 0xe285a6, 0xe285a7,
+ /* 5c */ 0xe285a8, 0xe285a9, 0x000000, 0xe38d89,
+ /* 60 */ 0xe38c94, 0xe38ca2, 0xe38d8d, 0xe38c98,
+ /* 64 */ 0xe38ca7, 0xe38c83, 0xe38cb6, 0xe38d91,
+ /* 68 */ 0xe38d97, 0xe38c8d, 0xe38ca6, 0xe38ca3,
+ /* 6c */ 0xe38cab, 0xe38d8a, 0xe38cbb, 0xe38e9c,
+ /* 70 */ 0xe38e9d, 0xe38e9e, 0xe38e8e, 0xe38e8f,
+ /* 74 */ 0xe38f84, 0xe38ea1, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0xe38dbb, 0x000000,
+ /* 80 */ 0xe3809d, 0xe3809f, 0xe28496, 0xe38f8d,
+ /* 84 */ 0xe284a1, 0xe38aa4, 0xe38aa5, 0xe38aa6,
+ /* 88 */ 0xe38aa7, 0xe38aa8, 0xe388b1, 0xe388b2,
+ /* 8c */ 0xe388b9, 0xe38dbe, 0xe38dbd, 0xe38dbc,
+ /* 90 */ 0xe28992, 0xe289a1, 0xe288ab, 0xe288ae,
+ /* 94 */ 0xe28891, 0xe2889a, 0xe28aa5, 0xe288a0,
+ /* 98 */ 0xe2889f, 0xe28abf, 0xe288b5, 0xe288a9,
+ /* 9c */ 0xe288aa, 0x000000,
+ /* 95 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: 88xx - offset 0x004ca ***/
+
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0xe4ba9c,
+ /* a0 */ 0xe59496, 0xe5a883, 0xe998bf, 0xe59380,
+ /* a4 */ 0xe6849b, 0xe68ca8, 0xe5a7b6, 0xe980a2,
+ /* a8 */ 0xe891b5, 0xe88c9c, 0xe7a990, 0xe682aa,
+ /* ac */ 0xe68fa1, 0xe6b8a5, 0xe697ad, 0xe891a6,
+ /* b0 */ 0xe88aa6, 0xe9afb5, 0xe6a293, 0xe59ca7,
+ /* b4 */ 0xe696a1, 0xe689b1, 0xe5ae9b, 0xe5a790,
+ /* b8 */ 0xe899bb, 0xe9a3b4, 0xe7b5a2, 0xe7b6be,
+ /* bc */ 0xe9ae8e, 0xe68896, 0xe7b29f, 0xe8a2b7,
+ /* c0 */ 0xe5ae89, 0xe5bab5, 0xe68c89, 0xe69a97,
+ /* c4 */ 0xe6a188, 0xe99787, 0xe99e8d, 0xe69d8f,
+ /* c8 */ 0xe4bba5, 0xe4bc8a, 0xe4bd8d, 0xe4be9d,
+ /* cc */ 0xe58189, 0xe59bb2, 0xe5a4b7, 0xe5a794,
+ /* d0 */ 0xe5a881, 0xe5b089, 0xe6839f, 0xe6848f,
+ /* d4 */ 0xe685b0, 0xe69893, 0xe6a485, 0xe782ba,
+ /* d8 */ 0xe7958f, 0xe795b0, 0xe7a7bb, 0xe7b6ad,
+ /* dc */ 0xe7b7af, 0xe88383, 0xe8908e, 0xe8a1a3,
+ /* e0 */ 0xe8ac82, 0xe98195, 0xe981ba, 0xe58cbb,
+ /* e4 */ 0xe4ba95, 0xe4baa5, 0xe59f9f, 0xe882b2,
+ /* e8 */ 0xe98381, 0xe7a3af, 0xe4b880, 0xe5a3b1,
+ /* ec */ 0xe6baa2, 0xe980b8, 0xe7a8b2, 0xe88ca8,
+ /* f0 */ 0xe88a8b, 0xe9b0af, 0xe58581, 0xe58db0,
+ /* f4 */ 0xe592bd, 0xe593a1, 0xe59ba0, 0xe5a7bb,
+ /* f8 */ 0xe5bc95, 0xe9a3b2, 0xe6b7ab, 0xe883a4,
+ /* fc */ 0xe894ad,
+
+ /*** Two byte table, leaf: 89xx - offset 0x00587 ***/
+
+ /* 40 */ 0xe999a2, 0xe999b0, 0xe99aa0, 0xe99fbb,
+ /* 44 */ 0xe5908b, 0xe58fb3, 0xe5ae87, 0xe7838f,
+ /* 48 */ 0xe7bebd, 0xe8bf82, 0xe99ba8, 0xe58daf,
+ /* 4c */ 0xe9b59c, 0xe7aaba, 0xe4b891, 0xe7a293,
+ /* 50 */ 0xe887bc, 0xe6b8a6, 0xe59898, 0xe59484,
+ /* 54 */ 0xe6ac9d, 0xe8949a, 0xe9b0bb, 0xe5a7a5,
+ /* 58 */ 0xe58ea9, 0xe6b5a6, 0xe7939c, 0xe9968f,
+ /* 5c */ 0xe59982, 0xe4ba91, 0xe9818b, 0xe99bb2,
+ /* 60 */ 0xe88d8f, 0xe9a48c, 0xe58fa1, 0xe596b6,
+ /* 64 */ 0xe5acb0, 0xe5bdb1, 0xe698a0, 0xe69bb3,
+ /* 68 */ 0xe6a084, 0xe6b0b8, 0xe6b3b3, 0xe6b4a9,
+ /* 6c */ 0xe7919b, 0xe79b88, 0xe7a98e, 0xe9a0b4,
+ /* 70 */ 0xe88bb1, 0xe8a19b, 0xe8a9a0, 0xe98bad,
+ /* 74 */ 0xe6b6b2, 0xe796ab, 0xe79b8a, 0xe9a785,
+ /* 78 */ 0xe682a6, 0xe8ac81, 0xe8b68a, 0xe996b2,
+ /* 7c */ 0xe6a68e, 0xe58ead, 0xe58686, 0x000000,
+ /* 80 */ 0xe59c92, 0xe5a0b0, 0xe5a584, 0xe5aeb4,
+ /* 84 */ 0xe5bbb6, 0xe680a8, 0xe68ea9, 0xe68fb4,
+ /* 88 */ 0xe6b2bf, 0xe6bc94, 0xe7828e, 0xe78494,
+ /* 8c */ 0xe78599, 0xe78795, 0xe78cbf, 0xe7b881,
+ /* 90 */ 0xe889b6, 0xe88b91, 0xe89697, 0xe981a0,
+ /* 94 */ 0xe9899b, 0xe9b49b, 0xe5a1a9, 0xe696bc,
+ /* 98 */ 0xe6b19a, 0xe794a5, 0xe587b9, 0xe5a4ae,
+ /* 9c */ 0xe5a5a5, 0xe5be80, 0xe5bf9c, 0xe68abc,
+ /* a0 */ 0xe697ba, 0xe6a8aa, 0xe6aca7, 0xe6aeb4,
+ /* a4 */ 0xe78e8b, 0xe7bf81, 0xe8a596, 0xe9b4ac,
+ /* a8 */ 0xe9b48e, 0xe9bb84, 0xe5b2a1, 0xe6b296,
+ /* ac */ 0xe88dbb, 0xe58484, 0xe5b18b, 0xe686b6,
+ /* b0 */ 0xe88786, 0xe6a1b6, 0xe789a1, 0xe4b999,
+ /* b4 */ 0xe4bfba, 0xe58db8, 0xe681a9, 0xe6b8a9,
+ /* b8 */ 0xe7a98f, 0xe99fb3, 0xe4b88b, 0xe58c96,
+ /* bc */ 0xe4bbae, 0xe4bd95, 0xe4bcbd, 0xe4bea1,
+ /* c0 */ 0xe4bdb3, 0xe58aa0, 0xe58faf, 0xe59889,
+ /* c4 */ 0xe5a48f, 0xe5ab81, 0xe5aeb6, 0xe5afa1,
+ /* c8 */ 0xe7a791, 0xe69a87, 0xe69e9c, 0xe69eb6,
+ /* cc */ 0xe6ad8c, 0xe6b2b3, 0xe781ab, 0xe78f82,
+ /* d0 */ 0xe7a68d, 0xe7a6be, 0xe7a8bc, 0xe7ae87,
+ /* d4 */ 0xe88ab1, 0xe88b9b, 0xe88c84, 0xe88db7,
+ /* d8 */ 0xe88faf, 0xe88f93, 0xe89da6, 0xe8aab2,
+ /* dc */ 0xe598a9, 0xe8b2a8, 0xe8bfa6, 0xe9818e,
+ /* e0 */ 0xe99c9e, 0xe89a8a, 0xe4bf84, 0xe5b3a8,
+ /* e4 */ 0xe68891, 0xe78999, 0xe794bb, 0xe887a5,
+ /* e8 */ 0xe88abd, 0xe89bbe, 0xe8b380, 0xe99b85,
+ /* ec */ 0xe9a493, 0xe9a795, 0xe4bb8b, 0xe4bc9a,
+ /* f0 */ 0xe8a7a3, 0xe59b9e, 0xe5a18a, 0xe5a38a,
+ /* f4 */ 0xe5bbbb, 0xe5bfab, 0xe680aa, 0xe68294,
+ /* f8 */ 0xe681a2, 0xe68790, 0xe68892, 0xe68b90,
+ /* fc */ 0xe694b9,
+
+ /*** Two byte table, leaf: 8axx - offset 0x00644 ***/
+
+ /* 40 */ 0xe9ad81, 0xe699a6, 0xe6a2b0, 0xe6b5b7,
+ /* 44 */ 0xe781b0, 0xe7958c, 0xe79a86, 0xe7b5b5,
+ /* 48 */ 0xe88aa5, 0xe89fb9, 0xe9968b, 0xe99a8e,
+ /* 4c */ 0xe8b29d, 0xe587b1, 0xe58abe, 0xe5a496,
+ /* 50 */ 0xe592b3, 0xe5aeb3, 0xe5b496, 0xe685a8,
+ /* 54 */ 0xe6a682, 0xe6b6af, 0xe7a28d, 0xe8938b,
+ /* 58 */ 0xe8a197, 0xe8a9b2, 0xe98ea7, 0xe9aab8,
+ /* 5c */ 0xe6b5ac, 0xe9a6a8, 0xe89b99, 0xe59ea3,
+ /* 60 */ 0xe69fbf, 0xe89b8e, 0xe9888e, 0xe58a83,
+ /* 64 */ 0xe59a87, 0xe59084, 0xe5bb93, 0xe68ba1,
+ /* 68 */ 0xe692b9, 0xe6a0bc, 0xe6a0b8, 0xe6aebb,
+ /* 6c */ 0xe78db2, 0xe7a2ba, 0xe7a9ab, 0xe8a69a,
+ /* 70 */ 0xe8a792, 0xe8b5ab, 0xe8bc83, 0xe983ad,
+ /* 74 */ 0xe996a3, 0xe99a94, 0xe99da9, 0xe5ada6,
+ /* 78 */ 0xe5b2b3, 0xe6a5bd, 0xe9a18d, 0xe9a18e,
+ /* 7c */ 0xe68e9b, 0xe7aca0, 0xe6a8ab, 0x000000,
+ /* 80 */ 0xe6a9bf, 0xe6a2b6, 0xe9b08d, 0xe6bd9f,
+ /* 84 */ 0xe589b2, 0xe5969d, 0xe681b0, 0xe68bac,
+ /* 88 */ 0xe6b4bb, 0xe6b887, 0xe6bb91, 0xe8919b,
+ /* 8c */ 0xe8a490, 0xe8bd84, 0xe4b894, 0xe9b0b9,
+ /* 90 */ 0xe58fb6, 0xe6a49b, 0xe6a8ba, 0xe99e84,
+ /* 94 */ 0xe6a0aa, 0xe5859c, 0xe7ab83, 0xe892b2,
+ /* 98 */ 0xe9879c, 0xe98e8c, 0xe5999b, 0xe9b4a8,
+ /* 9c */ 0xe6a0a2, 0xe88c85, 0xe890b1, 0xe7b2a5,
+ /* a0 */ 0xe58888, 0xe88b85, 0xe793a6, 0xe4b9be,
+ /* a4 */ 0xe4be83, 0xe586a0, 0xe5af92, 0xe5888a,
+ /* a8 */ 0xe58b98, 0xe58ba7, 0xe5b7bb, 0xe5969a,
+ /* ac */ 0xe5a0aa, 0xe5a7a6, 0xe5ae8c, 0xe5ae98,
+ /* b0 */ 0xe5af9b, 0xe5b9b2, 0xe5b9b9, 0xe682a3,
+ /* b4 */ 0xe6849f, 0xe685a3, 0xe686be, 0xe68f9b,
+ /* b8 */ 0xe695a2, 0xe69f91, 0xe6a193, 0xe6a3ba,
+ /* bc */ 0xe6acbe, 0xe6ad93, 0xe6b197, 0xe6bca2,
+ /* c0 */ 0xe6be97, 0xe6bd85, 0xe792b0, 0xe79498,
+ /* c4 */ 0xe79ba3, 0xe79c8b, 0xe7abbf, 0xe7aea1,
+ /* c8 */ 0xe7b0a1, 0xe7b7a9, 0xe7bcb6, 0xe7bfb0,
+ /* cc */ 0xe8829d, 0xe889a6, 0xe88e9e, 0xe8a6b3,
+ /* d0 */ 0xe8ab8c, 0xe8b2ab, 0xe98284, 0xe99191,
+ /* d4 */ 0xe99693, 0xe99691, 0xe996a2, 0xe999a5,
+ /* d8 */ 0xe99f93, 0xe9a4a8, 0xe88898, 0xe4b8b8,
+ /* dc */ 0xe590ab, 0xe5b2b8, 0xe5b78c, 0xe78ea9,
+ /* e0 */ 0xe7998c, 0xe79cbc, 0xe5b2a9, 0xe7bfab,
+ /* e4 */ 0xe8b48b, 0xe99b81, 0xe9a091, 0xe9a194,
+ /* e8 */ 0xe9a198, 0xe4bc81, 0xe4bc8e, 0xe58db1,
+ /* ec */ 0xe5969c, 0xe599a8, 0xe59fba, 0xe5a587,
+ /* f0 */ 0xe5ac89, 0xe5af84, 0xe5b290, 0xe5b88c,
+ /* f4 */ 0xe5b9be, 0xe5bf8c, 0xe68fae, 0xe69cba,
+ /* f8 */ 0xe69797, 0xe697a2, 0xe69c9f, 0xe6a38b,
+ /* fc */ 0xe6a384,
+
+ /*** Two byte table, leaf: 8bxx - offset 0x00701 ***/
+
+ /* 40 */ 0xe6a99f, 0xe5b8b0, 0xe6af85, 0xe6b097,
+ /* 44 */ 0xe6b1bd, 0xe795bf, 0xe7a588, 0xe5ada3,
+ /* 48 */ 0xe7a880, 0xe7b480, 0xe5bebd, 0xe8a68f,
+ /* 4c */ 0xe8a898, 0xe8b2b4, 0xe8b5b7, 0xe8bb8c,
+ /* 50 */ 0xe8bc9d, 0xe9a3a2, 0xe9a88e, 0xe9acbc,
+ /* 54 */ 0xe4ba80, 0xe581bd, 0xe58480, 0xe5a693,
+ /* 58 */ 0xe5ae9c, 0xe688af, 0xe68a80, 0xe693ac,
+ /* 5c */ 0xe6acba, 0xe78aa0, 0xe79691, 0xe7a587,
+ /* 60 */ 0xe7bea9, 0xe89fbb, 0xe8aabc, 0xe8adb0,
+ /* 64 */ 0xe68eac, 0xe88f8a, 0xe99ea0, 0xe59089,
+ /* 68 */ 0xe59083, 0xe596ab, 0xe6a194, 0xe6a998,
+ /* 6c */ 0xe8a9b0, 0xe7a0a7, 0xe69db5, 0xe9bb8d,
+ /* 70 */ 0xe58db4, 0xe5aea2, 0xe8849a, 0xe89990,
+ /* 74 */ 0xe98086, 0xe4b898, 0xe4b985, 0xe4bb87,
+ /* 78 */ 0xe4bc91, 0xe58f8a, 0xe590b8, 0xe5aeae,
+ /* 7c */ 0xe5bc93, 0xe680a5, 0xe69591, 0x000000,
+ /* 80 */ 0xe69cbd, 0xe6b182, 0xe6b1b2, 0xe6b3a3,
+ /* 84 */ 0xe781b8, 0xe79083, 0xe7a9b6, 0xe7aaae,
+ /* 88 */ 0xe7ac88, 0xe7b49a, 0xe7b3be, 0xe7b5a6,
+ /* 8c */ 0xe697a7, 0xe7899b, 0xe58ebb, 0xe5b185,
+ /* 90 */ 0xe5b7a8, 0xe68b92, 0xe68ba0, 0xe68c99,
+ /* 94 */ 0xe6b8a0, 0xe8999a, 0xe8a8b1, 0xe8b79d,
+ /* 98 */ 0xe98bb8, 0xe6bc81, 0xe7a6a6, 0xe9ad9a,
+ /* 9c */ 0xe4baa8, 0xe4baab, 0xe4baac, 0xe4be9b,
+ /* a0 */ 0xe4bea0, 0xe58391, 0xe58587, 0xe7abb6,
+ /* a4 */ 0xe585b1, 0xe587b6, 0xe58d94, 0xe58ca1,
+ /* a8 */ 0xe58dbf, 0xe58fab, 0xe596ac, 0xe5a283,
+ /* ac */ 0xe5b3a1, 0xe5bcb7, 0xe5bd8a, 0xe680af,
+ /* b0 */ 0xe68190, 0xe681ad, 0xe68c9f, 0xe69599,
+ /* b4 */ 0xe6a98b, 0xe6b381, 0xe78b82, 0xe78bad,
+ /* b8 */ 0xe79faf, 0xe883b8, 0xe88485, 0xe88888,
+ /* bc */ 0xe8958e, 0xe983b7, 0xe98fa1, 0xe99fbf,
+ /* c0 */ 0xe9a597, 0xe9a99a, 0xe4bbb0, 0xe5879d,
+ /* c4 */ 0xe5b0ad, 0xe69a81, 0xe6a5ad, 0xe5b180,
+ /* c8 */ 0xe69bb2, 0xe6a5b5, 0xe78e89, 0xe6a190,
+ /* cc */ 0xe7b281, 0xe58385, 0xe58ba4, 0xe59d87,
+ /* d0 */ 0xe5b7be, 0xe98ca6, 0xe696a4, 0xe6aca3,
+ /* d4 */ 0xe6acbd, 0xe790b4, 0xe7a681, 0xe7a6bd,
+ /* d8 */ 0xe7ad8b, 0xe7b78a, 0xe88ab9, 0xe88f8c,
+ /* dc */ 0xe8a1bf, 0xe8a59f, 0xe8acb9, 0xe8bf91,
+ /* e0 */ 0xe98791, 0xe5909f, 0xe98a80, 0xe4b99d,
+ /* e4 */ 0xe580b6, 0xe58fa5, 0xe58cba, 0xe78b97,
+ /* e8 */ 0xe78e96, 0xe79fa9, 0xe88ba6, 0xe8baaf,
+ /* ec */ 0xe9a786, 0xe9a788, 0xe9a792, 0xe585b7,
+ /* f0 */ 0xe6849a, 0xe8999e, 0xe596b0, 0xe7a9ba,
+ /* f4 */ 0xe581b6, 0xe5af93, 0xe98187, 0xe99a85,
+ /* f8 */ 0xe4b8b2, 0xe6ab9b, 0xe987a7, 0xe5b191,
+ /* fc */ 0xe5b188,
+
+ /*** Two byte table, leaf: 8cxx - offset 0x007be ***/
+
+ /* 40 */ 0xe68e98, 0xe7aa9f, 0xe6b293, 0xe99db4,
+ /* 44 */ 0xe8bda1, 0xe7aaaa, 0xe7868a, 0xe99a88,
+ /* 48 */ 0xe7b282, 0xe6a097, 0xe7b9b0, 0xe6a191,
+ /* 4c */ 0xe98dac, 0xe58bb2, 0xe5909b, 0xe896ab,
+ /* 50 */ 0xe8a893, 0xe7bea4, 0xe8bb8d, 0xe983a1,
+ /* 54 */ 0xe58da6, 0xe8a288, 0xe7a581, 0xe4bf82,
+ /* 58 */ 0xe582be, 0xe58891, 0xe58584, 0xe59593,
+ /* 5c */ 0xe59cad, 0xe78faa, 0xe59e8b, 0xe5a591,
+ /* 60 */ 0xe5bda2, 0xe5be84, 0xe681b5, 0xe685b6,
+ /* 64 */ 0xe685a7, 0xe686a9, 0xe68eb2, 0xe690ba,
+ /* 68 */ 0xe695ac, 0xe699af, 0xe6a182, 0xe6b893,
+ /* 6c */ 0xe795a6, 0xe7a8bd, 0xe7b3bb, 0xe7b58c,
+ /* 70 */ 0xe7b699, 0xe7b98b, 0xe7bdab, 0xe88c8e,
+ /* 74 */ 0xe88d8a, 0xe89b8d, 0xe8a888, 0xe8a9a3,
+ /* 78 */ 0xe8ada6, 0xe8bbbd, 0xe9a09a, 0xe9b68f,
+ /* 7c */ 0xe88ab8, 0xe8bf8e, 0xe9afa8, 0x000000,
+ /* 80 */ 0xe58a87, 0xe6889f, 0xe69283, 0xe6bf80,
+ /* 84 */ 0xe99a99, 0xe6a181, 0xe58291, 0xe6aca0,
+ /* 88 */ 0xe6b1ba, 0xe6bd94, 0xe7a9b4, 0xe7b590,
+ /* 8c */ 0xe8a180, 0xe8a8a3, 0xe69c88, 0xe4bbb6,
+ /* 90 */ 0xe580b9, 0xe580a6, 0xe581a5, 0xe585bc,
+ /* 94 */ 0xe588b8, 0xe589a3, 0xe596a7, 0xe59c8f,
+ /* 98 */ 0xe5a085, 0xe5ab8c, 0xe5bbba, 0xe686b2,
+ /* 9c */ 0xe687b8, 0xe68bb3, 0xe68db2, 0xe6a49c,
+ /* a0 */ 0xe6a8a9, 0xe789bd, 0xe78aac, 0xe78cae,
+ /* a4 */ 0xe7a094, 0xe7a1af, 0xe7b5b9, 0xe79c8c,
+ /* a8 */ 0xe882a9, 0xe8a68b, 0xe8ac99, 0xe8b3a2,
+ /* ac */ 0xe8bb92, 0xe981a3, 0xe98db5, 0xe999ba,
+ /* b0 */ 0xe9a195, 0xe9a893, 0xe9b9b8, 0xe58583,
+ /* b4 */ 0xe58e9f, 0xe58eb3, 0xe5b9bb, 0xe5bca6,
+ /* b8 */ 0xe6b89b, 0xe6ba90, 0xe78e84, 0xe78fbe,
+ /* bc */ 0xe7b583, 0xe888b7, 0xe8a880, 0xe8abba,
+ /* c0 */ 0xe99990, 0xe4b98e, 0xe5808b, 0xe58fa4,
+ /* c4 */ 0xe591bc, 0xe59bba, 0xe5a791, 0xe5ada4,
+ /* c8 */ 0xe5b7b1, 0xe5baab, 0xe5bca7, 0xe688b8,
+ /* cc */ 0xe69585, 0xe69eaf, 0xe6b996, 0xe78b90,
+ /* d0 */ 0xe7b38a, 0xe8a2b4, 0xe882a1, 0xe883a1,
+ /* d4 */ 0xe88fb0, 0xe8998e, 0xe8aa87, 0xe8b7a8,
+ /* d8 */ 0xe988b7, 0xe99b87, 0xe9a1a7, 0xe9bc93,
+ /* dc */ 0xe4ba94, 0xe4ba92, 0xe4bc8d, 0xe58d88,
+ /* e0 */ 0xe59189, 0xe590be, 0xe5a8af, 0xe5be8c,
+ /* e4 */ 0xe5bea1, 0xe6829f, 0xe6a2a7, 0xe6aa8e,
+ /* e8 */ 0xe7919a, 0xe7a281, 0xe8aa9e, 0xe8aaa4,
+ /* ec */ 0xe8adb7, 0xe98690, 0xe4b99e, 0xe9af89,
+ /* f0 */ 0xe4baa4, 0xe4bdbc, 0xe4beaf, 0xe58099,
+ /* f4 */ 0xe58096, 0xe58589, 0xe585ac, 0xe58a9f,
+ /* f8 */ 0xe58ab9, 0xe58bbe, 0xe58e9a, 0xe58fa3,
+ /* fc */ 0xe59091,
+
+ /*** Two byte table, leaf: 8dxx - offset 0x0087b ***/
+
+ /* 40 */ 0xe5908e, 0xe59689, 0xe59d91, 0xe59ea2,
+ /* 44 */ 0xe5a5bd, 0xe5ad94, 0xe5ad9d, 0xe5ae8f,
+ /* 48 */ 0xe5b7a5, 0xe5b7a7, 0xe5b7b7, 0xe5b9b8,
+ /* 4c */ 0xe5ba83, 0xe5ba9a, 0xe5bab7, 0xe5bc98,
+ /* 50 */ 0xe68192, 0xe6858c, 0xe68a97, 0xe68b98,
+ /* 54 */ 0xe68ea7, 0xe694bb, 0xe69882, 0xe69983,
+ /* 58 */ 0xe69bb4, 0xe69dad, 0xe6a0a1, 0xe6a297,
+ /* 5c */ 0xe6a78b, 0xe6b19f, 0xe6b4aa, 0xe6b5a9,
+ /* 60 */ 0xe6b8af, 0xe6ba9d, 0xe794b2, 0xe79a87,
+ /* 64 */ 0xe7a1ac, 0xe7a8bf, 0xe7b3a0, 0xe7b485,
+ /* 68 */ 0xe7b498, 0xe7b59e, 0xe7b6b1, 0xe88095,
+ /* 6c */ 0xe88083, 0xe882af, 0xe882b1, 0xe88594,
+ /* 70 */ 0xe8868f, 0xe888aa, 0xe88d92, 0xe8a18c,
+ /* 74 */ 0xe8a1a1, 0xe8ac9b, 0xe8b2a2, 0xe8b3bc,
+ /* 78 */ 0xe9838a, 0xe985b5, 0xe989b1, 0xe7a0bf,
+ /* 7c */ 0xe98bbc, 0xe996a4, 0xe9998d, 0x000000,
+ /* 80 */ 0xe9a085, 0xe9a699, 0xe9ab98, 0xe9b4bb,
+ /* 84 */ 0xe5899b, 0xe58aab, 0xe58fb7, 0xe59088,
+ /* 88 */ 0xe5a395, 0xe68bb7, 0xe6bfa0, 0xe8b1aa,
+ /* 8c */ 0xe8bd9f, 0xe9bab9, 0xe5858b, 0xe588bb,
+ /* 90 */ 0xe5918a, 0xe59bbd, 0xe7a980, 0xe985b7,
+ /* 94 */ 0xe9b5a0, 0xe9bb92, 0xe78d84, 0xe6bc89,
+ /* 98 */ 0xe885b0, 0xe79491, 0xe5bfbd, 0xe6839a,
+ /* 9c */ 0xe9aaa8, 0xe78b9b, 0xe8bebc, 0xe6ada4,
+ /* a0 */ 0xe9a083, 0xe4bb8a, 0xe59bb0, 0xe59da4,
+ /* a4 */ 0xe5a2be, 0xe5a99a, 0xe681a8, 0xe68787,
+ /* a8 */ 0xe6988f, 0xe69886, 0xe6a0b9, 0xe6a2b1,
+ /* ac */ 0xe6b7b7, 0xe79795, 0xe7b4ba, 0xe889ae,
+ /* b0 */ 0xe9ad82, 0xe4ba9b, 0xe4bd90, 0xe58f89,
+ /* b4 */ 0xe59486, 0xe5b5af, 0xe5b7a6, 0xe5b7ae,
+ /* b8 */ 0xe69fbb, 0xe6b299, 0xe791b3, 0xe7a082,
+ /* bc */ 0xe8a990, 0xe98e96, 0xe8a39f, 0xe59d90,
+ /* c0 */ 0xe5baa7, 0xe68cab, 0xe582b5, 0xe582ac,
+ /* c4 */ 0xe5868d, 0xe69c80, 0xe59389, 0xe5a19e,
+ /* c8 */ 0xe5a6bb, 0xe5aeb0, 0xe5bda9, 0xe6898d,
+ /* cc */ 0xe68ea1, 0xe6a0bd, 0xe6adb3, 0xe6b888,
+ /* d0 */ 0xe781bd, 0xe98787, 0xe78a80, 0xe7a095,
+ /* d4 */ 0xe7a0a6, 0xe7a5ad, 0xe6968e, 0xe7b4b0,
+ /* d8 */ 0xe88f9c, 0xe8a381, 0xe8bc89, 0xe99a9b,
+ /* dc */ 0xe589a4, 0xe59ca8, 0xe69d90, 0xe7bdaa,
+ /* e0 */ 0xe8b2a1, 0xe586b4, 0xe59d82, 0xe998aa,
+ /* e4 */ 0xe5a0ba, 0xe6a68a, 0xe882b4, 0xe592b2,
+ /* e8 */ 0xe5b48e, 0xe59fbc, 0xe7a295, 0xe9b7ba,
+ /* ec */ 0xe4bd9c, 0xe5898a, 0xe5928b, 0xe690be,
+ /* f0 */ 0xe698a8, 0xe69c94, 0xe69fb5, 0xe7aa84,
+ /* f4 */ 0xe7ad96, 0xe7b4a2, 0xe98caf, 0xe6a19c,
+ /* f8 */ 0xe9aead, 0xe7acb9, 0xe58c99, 0xe5868a,
+ /* fc */ 0xe588b7,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00938 ***/
+
+ /* 40 */ 0xe5af9f, 0xe68bb6, 0xe692ae, 0xe693a6,
+ /* 44 */ 0xe69cad, 0xe6aeba, 0xe896a9, 0xe99b91,
+ /* 48 */ 0xe79a90, 0xe9af96, 0xe68d8c, 0xe98c86,
+ /* 4c */ 0xe9aeab, 0xe79abf, 0xe69992, 0xe4b889,
+ /* 50 */ 0xe58298, 0xe58f82, 0xe5b1b1, 0xe683a8,
+ /* 54 */ 0xe69292, 0xe695a3, 0xe6a19f, 0xe787a6,
+ /* 58 */ 0xe78f8a, 0xe794a3, 0xe7ae97, 0xe7ba82,
+ /* 5c */ 0xe89a95, 0xe8ae83, 0xe8b39b, 0xe985b8,
+ /* 60 */ 0xe9a490, 0xe696ac, 0xe69aab, 0xe6ae8b,
+ /* 64 */ 0xe4bb95, 0xe4bb94, 0xe4bcba, 0xe4bdbf,
+ /* 68 */ 0xe588ba, 0xe58fb8, 0xe58fb2, 0xe597a3,
+ /* 6c */ 0xe59b9b, 0xe5a3ab, 0xe5a78b, 0xe5a789,
+ /* 70 */ 0xe5a7bf, 0xe5ad90, 0xe5b18d, 0xe5b882,
+ /* 74 */ 0xe5b8ab, 0xe5bf97, 0xe6809d, 0xe68c87,
+ /* 78 */ 0xe694af, 0xe5ad9c, 0xe696af, 0xe696bd,
+ /* 7c */ 0xe697a8, 0xe69e9d, 0xe6ada2, 0x000000,
+ /* 80 */ 0xe6adbb, 0xe6b08f, 0xe78d85, 0xe7a589,
+ /* 84 */ 0xe7a781, 0xe7b3b8, 0xe7b499, 0xe7b4ab,
+ /* 88 */ 0xe882a2, 0xe88482, 0xe887b3, 0xe8a696,
+ /* 8c */ 0xe8a99e, 0xe8a9a9, 0xe8a9a6, 0xe8aa8c,
+ /* 90 */ 0xe8abae, 0xe8b387, 0xe8b39c, 0xe99b8c,
+ /* 94 */ 0xe9a3bc, 0xe6adaf, 0xe4ba8b, 0xe4bcbc,
+ /* 98 */ 0xe4be8d, 0xe58590, 0xe5ad97, 0xe5afba,
+ /* 9c */ 0xe68588, 0xe68c81, 0xe69982, 0xe6aca1,
+ /* a0 */ 0xe6bb8b, 0xe6b2bb, 0xe788be, 0xe792bd,
+ /* a4 */ 0xe79794, 0xe7a381, 0xe7a4ba, 0xe8808c,
+ /* a8 */ 0xe880b3, 0xe887aa, 0xe89294, 0xe8be9e,
+ /* ac */ 0xe6b190, 0xe9b9bf, 0xe5bc8f, 0xe8ad98,
+ /* b0 */ 0xe9b4ab, 0xe7abba, 0xe8bbb8, 0xe5ae8d,
+ /* b4 */ 0xe99bab, 0xe4b883, 0xe58fb1, 0xe59fb7,
+ /* b8 */ 0xe5a4b1, 0xe5ab89, 0xe5aea4, 0xe68289,
+ /* bc */ 0xe6b9bf, 0xe6bc86, 0xe796be, 0xe8b3aa,
+ /* c0 */ 0xe5ae9f, 0xe89480, 0xe7afa0, 0xe581b2,
+ /* c4 */ 0xe69fb4, 0xe88a9d, 0xe5b1a1, 0xe8958a,
+ /* c8 */ 0xe7b89e, 0xe8888e, 0xe58699, 0xe5b084,
+ /* cc */ 0xe68da8, 0xe8b5a6, 0xe6969c, 0xe785ae,
+ /* d0 */ 0xe7a4be, 0xe7b497, 0xe88085, 0xe8ac9d,
+ /* d4 */ 0xe8bb8a, 0xe981ae, 0xe89b87, 0xe982aa,
+ /* d8 */ 0xe5809f, 0xe58bba, 0xe5b0ba, 0xe69d93,
+ /* dc */ 0xe781bc, 0xe788b5, 0xe9858c, 0xe98788,
+ /* e0 */ 0xe98cab, 0xe88ba5, 0xe5af82, 0xe5bcb1,
+ /* e4 */ 0xe683b9, 0xe4b8bb, 0xe58f96, 0xe5ae88,
+ /* e8 */ 0xe6898b, 0xe69cb1, 0xe6ae8a, 0xe78ba9,
+ /* ec */ 0xe78fa0, 0xe7a8ae, 0xe885ab, 0xe8b6a3,
+ /* f0 */ 0xe98592, 0xe9a696, 0xe58492, 0xe58f97,
+ /* f4 */ 0xe591aa, 0xe5afbf, 0xe68e88, 0xe6a8b9,
+ /* f8 */ 0xe7b6ac, 0xe99c80, 0xe59b9a, 0xe58f8e,
+ /* fc */ 0xe591a8,
+
+ /*** Two byte table, leaf: 8fxx - offset 0x009f5 ***/
+
+ /* 40 */ 0xe5ae97, 0xe5b0b1, 0xe5b79e, 0xe4bfae,
+ /* 44 */ 0xe68481, 0xe68bbe, 0xe6b4b2, 0xe7a780,
+ /* 48 */ 0xe7a78b, 0xe7b582, 0xe7b98d, 0xe7bf92,
+ /* 4c */ 0xe887ad, 0xe8889f, 0xe89290, 0xe8a186,
+ /* 50 */ 0xe8a5b2, 0xe8ae90, 0xe8b9b4, 0xe8bcaf,
+ /* 54 */ 0xe980b1, 0xe9858b, 0xe985ac, 0xe99b86,
+ /* 58 */ 0xe9869c, 0xe4bb80, 0xe4bd8f, 0xe58585,
+ /* 5c */ 0xe58d81, 0xe5be93, 0xe6888e, 0xe69f94,
+ /* 60 */ 0xe6b181, 0xe6b88b, 0xe78da3, 0xe7b8a6,
+ /* 64 */ 0xe9878d, 0xe98a83, 0xe58f94, 0xe5a499,
+ /* 68 */ 0xe5aebf, 0xe6b791, 0xe7a59d, 0xe7b8ae,
+ /* 6c */ 0xe7b29b, 0xe5a1be, 0xe7869f, 0xe587ba,
+ /* 70 */ 0xe8a193, 0xe8bfb0, 0xe4bf8a, 0xe5b3bb,
+ /* 74 */ 0xe698a5, 0xe79eac, 0xe7aba3, 0xe8889c,
+ /* 78 */ 0xe9a7bf, 0xe58786, 0xe5beaa, 0xe697ac,
+ /* 7c */ 0xe6a5af, 0xe6ae89, 0xe6b7b3, 0x000000,
+ /* 80 */ 0xe6ba96, 0xe6bda4, 0xe79bbe, 0xe7b494,
+ /* 84 */ 0xe5b7a1, 0xe981b5, 0xe98687, 0xe9a086,
+ /* 88 */ 0xe587a6, 0xe5889d, 0xe68980, 0xe69a91,
+ /* 8c */ 0xe69b99, 0xe6b89a, 0xe5bab6, 0xe7b792,
+ /* 90 */ 0xe7bdb2, 0xe69bb8, 0xe896af, 0xe897b7,
+ /* 94 */ 0xe8abb8, 0xe58aa9, 0xe58f99, 0xe5a5b3,
+ /* 98 */ 0xe5ba8f, 0xe5be90, 0xe68195, 0xe98ba4,
+ /* 9c */ 0xe999a4, 0xe582b7, 0xe5849f, 0xe58b9d,
+ /* a0 */ 0xe58ca0, 0xe58d87, 0xe58fac, 0xe593a8,
+ /* a4 */ 0xe59586, 0xe594b1, 0xe59897, 0xe5a5a8,
+ /* a8 */ 0xe5a6be, 0xe5a8bc, 0xe5aeb5, 0xe5b086,
+ /* ac */ 0xe5b08f, 0xe5b091, 0xe5b09a, 0xe5ba84,
+ /* b0 */ 0xe5ba8a, 0xe5bba0, 0xe5bdb0, 0xe689bf,
+ /* b4 */ 0xe68a84, 0xe68b9b, 0xe68e8c, 0xe68db7,
+ /* b8 */ 0xe69887, 0xe6988c, 0xe698ad, 0xe699b6,
+ /* bc */ 0xe69dbe, 0xe6a2a2, 0xe6a89f, 0xe6a8b5,
+ /* c0 */ 0xe6b2bc, 0xe6b688, 0xe6b889, 0xe6b998,
+ /* c4 */ 0xe784bc, 0xe784a6, 0xe785a7, 0xe79787,
+ /* c8 */ 0xe79c81, 0xe7a19d, 0xe7a481, 0xe7a5a5,
+ /* cc */ 0xe7a7b0, 0xe7aba0, 0xe7ac91, 0xe7b2a7,
+ /* d0 */ 0xe7b4b9, 0xe88296, 0xe88f96, 0xe8928b,
+ /* d4 */ 0xe89589, 0xe8a19d, 0xe8a3b3, 0xe8a89f,
+ /* d8 */ 0xe8a8bc, 0xe8a994, 0xe8a9b3, 0xe8b1a1,
+ /* dc */ 0xe8b39e, 0xe986a4, 0xe989a6, 0xe98dbe,
+ /* e0 */ 0xe99098, 0xe99a9c, 0xe99e98, 0xe4b88a,
+ /* e4 */ 0xe4b888, 0xe4b89e, 0xe4b997, 0xe58697,
+ /* e8 */ 0xe589b0, 0xe59f8e, 0xe5a0b4, 0xe5a38c,
+ /* ec */ 0xe5aca2, 0xe5b8b8, 0xe68385, 0xe693be,
+ /* f0 */ 0xe69da1, 0xe69d96, 0xe6b584, 0xe78ab6,
+ /* f4 */ 0xe795b3, 0xe7a9a3, 0xe892b8, 0xe8adb2,
+ /* f8 */ 0xe986b8, 0xe98ca0, 0xe598b1, 0xe59fb4,
+ /* fc */ 0xe9a3be,
+
+ /*** Two byte table, leaf: 90xx - offset 0x00ab2 ***/
+
+ /* 40 */ 0xe68bad, 0xe6a48d, 0xe6ae96, 0xe787ad,
+ /* 44 */ 0xe7b994, 0xe881b7, 0xe889b2, 0xe8a7a6,
+ /* 48 */ 0xe9a39f, 0xe89d95, 0xe8beb1, 0xe5b0bb,
+ /* 4c */ 0xe4bcb8, 0xe4bfa1, 0xe4beb5, 0xe59487,
+ /* 50 */ 0xe5a8a0, 0xe5af9d, 0xe5afa9, 0xe5bf83,
+ /* 54 */ 0xe6858e, 0xe68caf, 0xe696b0, 0xe6998b,
+ /* 58 */ 0xe6a3ae, 0xe6a69b, 0xe6b5b8, 0xe6b7b1,
+ /* 5c */ 0xe794b3, 0xe796b9, 0xe79c9f, 0xe7a59e,
+ /* 60 */ 0xe7a7a6, 0xe7b4b3, 0xe887a3, 0xe88aaf,
+ /* 64 */ 0xe896aa, 0xe8a6aa, 0xe8a8ba, 0xe8baab,
+ /* 68 */ 0xe8be9b, 0xe980b2, 0xe9879d, 0xe99c87,
+ /* 6c */ 0xe4baba, 0xe4bb81, 0xe58883, 0xe5a1b5,
+ /* 70 */ 0xe5a3ac, 0xe5b08b, 0xe7949a, 0xe5b0bd,
+ /* 74 */ 0xe8858e, 0xe8a88a, 0xe8bf85, 0xe999a3,
+ /* 78 */ 0xe99dad, 0xe7aca5, 0xe8ab8f, 0xe9a088,
+ /* 7c */ 0xe985a2, 0xe59bb3, 0xe58ea8, 0x000000,
+ /* 80 */ 0xe98097, 0xe590b9, 0xe59e82, 0xe5b8a5,
+ /* 84 */ 0xe68ea8, 0xe6b0b4, 0xe7828a, 0xe79da1,
+ /* 88 */ 0xe7b28b, 0xe7bfa0, 0xe8a1b0, 0xe98182,
+ /* 8c */ 0xe98594, 0xe98c90, 0xe98c98, 0xe99a8f,
+ /* 90 */ 0xe7919e, 0xe9ab84, 0xe5b487, 0xe5b5a9,
+ /* 94 */ 0xe695b0, 0xe69ea2, 0xe8b6a8, 0xe99b9b,
+ /* 98 */ 0xe68dae, 0xe69d89, 0xe6a499, 0xe88f85,
+ /* 9c */ 0xe9a097, 0xe99b80, 0xe8a3be, 0xe6be84,
+ /* a0 */ 0xe691ba, 0xe5afb8, 0xe4b896, 0xe780ac,
+ /* a4 */ 0xe7959d, 0xe698af, 0xe58784, 0xe588b6,
+ /* a8 */ 0xe58ba2, 0xe5a793, 0xe5be81, 0xe680a7,
+ /* ac */ 0xe68890, 0xe694bf, 0xe695b4, 0xe6989f,
+ /* b0 */ 0xe699b4, 0xe6a3b2, 0xe6a096, 0xe6ada3,
+ /* b4 */ 0xe6b885, 0xe789b2, 0xe7949f, 0xe79b9b,
+ /* b8 */ 0xe7b2be, 0xe88196, 0xe5a3b0, 0xe8a3bd,
+ /* bc */ 0xe8a5bf, 0xe8aaa0, 0xe8aa93, 0xe8ab8b,
+ /* c0 */ 0xe9809d, 0xe98692, 0xe99d92, 0xe99d99,
+ /* c4 */ 0xe69689, 0xe7a88e, 0xe88486, 0xe99abb,
+ /* c8 */ 0xe5b8ad, 0xe6839c, 0xe6889a, 0xe696a5,
+ /* cc */ 0xe69894, 0xe69e90, 0xe79fb3, 0xe7a98d,
+ /* d0 */ 0xe7b18d, 0xe7b8be, 0xe8848a, 0xe8b2ac,
+ /* d4 */ 0xe8b5a4, 0xe8b7a1, 0xe8b99f, 0xe7a2a9,
+ /* d8 */ 0xe58887, 0xe68b99, 0xe68ea5, 0xe69182,
+ /* dc */ 0xe68a98, 0xe8a8ad, 0xe7aa83, 0xe7af80,
+ /* e0 */ 0xe8aaac, 0xe99baa, 0xe7b5b6, 0xe8888c,
+ /* e4 */ 0xe89d89, 0xe4bb99, 0xe58588, 0xe58d83,
+ /* e8 */ 0xe58da0, 0xe5aea3, 0xe5b082, 0xe5b096,
+ /* ec */ 0xe5b79d, 0xe688a6, 0xe68987, 0xe692b0,
+ /* f0 */ 0xe6a093, 0xe6a0b4, 0xe6b389, 0xe6b585,
+ /* f4 */ 0xe6b497, 0xe69f93, 0xe6bd9c, 0xe7858e,
+ /* f8 */ 0xe785bd, 0xe6978b, 0xe7a9bf, 0xe7aead,
+ /* fc */ 0xe7b79a,
+
+ /*** Two byte table, leaf: 91xx - offset 0x00b6f ***/
+
+ /* 40 */ 0xe7b98a, 0xe7bea8, 0xe885ba, 0xe8889b,
+ /* 44 */ 0xe888b9, 0xe896a6, 0xe8a9ae, 0xe8b38e,
+ /* 48 */ 0xe8b7b5, 0xe981b8, 0xe981b7, 0xe98aad,
+ /* 4c */ 0xe98a91, 0xe99683, 0xe9aeae, 0xe5898d,
+ /* 50 */ 0xe59684, 0xe6bcb8, 0xe784b6, 0xe585a8,
+ /* 54 */ 0xe7a685, 0xe7b995, 0xe886b3, 0xe7b38e,
+ /* 58 */ 0xe5998c, 0xe5a191, 0xe5b2a8, 0xe68eaa,
+ /* 5c */ 0xe69bbe, 0xe69bbd, 0xe6a59a, 0xe78b99,
+ /* 60 */ 0xe7968f, 0xe7968e, 0xe7a48e, 0xe7a596,
+ /* 64 */ 0xe7a79f, 0xe7b297, 0xe7b4a0, 0xe7b584,
+ /* 68 */ 0xe89887, 0xe8a8b4, 0xe998bb, 0xe981a1,
+ /* 6c */ 0xe9bca0, 0xe583a7, 0xe589b5, 0xe58f8c,
+ /* 70 */ 0xe58fa2, 0xe58089, 0xe596aa, 0xe5a3ae,
+ /* 74 */ 0xe5a58f, 0xe788bd, 0xe5ae8b, 0xe5b1a4,
+ /* 78 */ 0xe58c9d, 0xe683a3, 0xe683b3, 0xe68d9c,
+ /* 7c */ 0xe68e83, 0xe68cbf, 0xe68ebb, 0x000000,
+ /* 80 */ 0xe6938d, 0xe697a9, 0xe69bb9, 0xe5b7a3,
+ /* 84 */ 0xe6a78d, 0xe6a7bd, 0xe6bc95, 0xe787a5,
+ /* 88 */ 0xe4ba89, 0xe797a9, 0xe79bb8, 0xe7aa93,
+ /* 8c */ 0xe7b39f, 0xe7b78f, 0xe7b69c, 0xe881a1,
+ /* 90 */ 0xe88d89, 0xe88d98, 0xe891ac, 0xe892bc,
+ /* 94 */ 0xe897bb, 0xe8a385, 0xe8b5b0, 0xe98081,
+ /* 98 */ 0xe981ad, 0xe98e97, 0xe99c9c, 0xe9a892,
+ /* 9c */ 0xe5838f, 0xe5a297, 0xe6868e, 0xe88793,
+ /* a0 */ 0xe894b5, 0xe8b488, 0xe980a0, 0xe4bf83,
+ /* a4 */ 0xe581b4, 0xe58987, 0xe58db3, 0xe681af,
+ /* a8 */ 0xe68d89, 0xe69d9f, 0xe6b8ac, 0xe8b6b3,
+ /* ac */ 0xe9809f, 0xe4bf97, 0xe5b19e, 0xe8b38a,
+ /* b0 */ 0xe6978f, 0xe7b69a, 0xe58d92, 0xe8a296,
+ /* b4 */ 0xe585b6, 0xe68f83, 0xe5ad98, 0xe5adab,
+ /* b8 */ 0xe5b08a, 0xe6908d, 0xe69d91, 0xe9819c,
+ /* bc */ 0xe4bb96, 0xe5a49a, 0xe5a4aa, 0xe6b1b0,
+ /* c0 */ 0xe8a991, 0xe594be, 0xe5a095, 0xe5a6a5,
+ /* c4 */ 0xe683b0, 0xe68993, 0xe69f81, 0xe888b5,
+ /* c8 */ 0xe6a595, 0xe99980, 0xe9a784, 0xe9a8a8,
+ /* cc */ 0xe4bd93, 0xe5a086, 0xe5afbe, 0xe88090,
+ /* d0 */ 0xe5b2b1, 0xe5b8af, 0xe5be85, 0xe680a0,
+ /* d4 */ 0xe6858b, 0xe688b4, 0xe69bbf, 0xe6b3b0,
+ /* d8 */ 0xe6bb9e, 0xe8838e, 0xe885bf, 0xe88b94,
+ /* dc */ 0xe8a28b, 0xe8b2b8, 0xe98080, 0xe980ae,
+ /* e0 */ 0xe99a8a, 0xe9bb9b, 0xe9af9b, 0xe4bba3,
+ /* e4 */ 0xe58fb0, 0xe5a4a7, 0xe7acac, 0xe9868d,
+ /* e8 */ 0xe9a18c, 0xe9b7b9, 0xe6bb9d, 0xe780a7,
+ /* ec */ 0xe58d93, 0xe59584, 0xe5ae85, 0xe68998,
+ /* f0 */ 0xe68a9e, 0xe68b93, 0xe6b2a2, 0xe6bfaf,
+ /* f4 */ 0xe790a2, 0xe8a897, 0xe990b8, 0xe6bf81,
+ /* f8 */ 0xe8abbe, 0xe88cb8, 0xe587a7, 0xe89bb8,
+ /* fc */ 0xe58faa,
+
+ /*** Two byte table, leaf: 92xx - offset 0x00c2c ***/
+
+ /* 40 */ 0xe58fa9, 0xe4bd86, 0xe98194, 0xe8beb0,
+ /* 44 */ 0xe5a5aa, 0xe884b1, 0xe5b7bd, 0xe7abaa,
+ /* 48 */ 0xe8bebf, 0xe6a39a, 0xe8b0b7, 0xe78bb8,
+ /* 4c */ 0xe9b188, 0xe6a8bd, 0xe8aab0, 0xe4b8b9,
+ /* 50 */ 0xe58d98, 0xe59886, 0xe59da6, 0xe68b85,
+ /* 54 */ 0xe68ea2, 0xe697a6, 0xe6ad8e, 0xe6b7a1,
+ /* 58 */ 0xe6b99b, 0xe782ad, 0xe79fad, 0xe7abaf,
+ /* 5c */ 0xe7aeaa, 0xe7b6bb, 0xe880bd, 0xe88386,
+ /* 60 */ 0xe89b8b, 0xe8aa95, 0xe98d9b, 0xe59ba3,
+ /* 64 */ 0xe5a387, 0xe5bcbe, 0xe696ad, 0xe69a96,
+ /* 68 */ 0xe6aa80, 0xe6aeb5, 0xe794b7, 0xe8ab87,
+ /* 6c */ 0xe580a4, 0xe79fa5, 0xe59cb0, 0xe5bc9b,
+ /* 70 */ 0xe681a5, 0xe699ba, 0xe6b1a0, 0xe797b4,
+ /* 74 */ 0xe7a89a, 0xe7bdae, 0xe887b4, 0xe89c98,
+ /* 78 */ 0xe98185, 0xe9a6b3, 0xe7af89, 0xe7959c,
+ /* 7c */ 0xe7abb9, 0xe7ad91, 0xe89384, 0x000000,
+ /* 80 */ 0xe98090, 0xe7a7a9, 0xe7aa92, 0xe88cb6,
+ /* 84 */ 0xe5aba1, 0xe79d80, 0xe4b8ad, 0xe4bbb2,
+ /* 88 */ 0xe5ae99, 0xe5bfa0, 0xe68abd, 0xe698bc,
+ /* 8c */ 0xe69fb1, 0xe6b3a8, 0xe899ab, 0xe8a1b7,
+ /* 90 */ 0xe8a8bb, 0xe9858e, 0xe98bb3, 0xe9a790,
+ /* 94 */ 0xe6a897, 0xe780a6, 0xe78caa, 0xe88ba7,
+ /* 98 */ 0xe89197, 0xe8b2af, 0xe4b881, 0xe58586,
+ /* 9c */ 0xe5878b, 0xe5968b, 0xe5afb5, 0xe5b896,
+ /* a0 */ 0xe5b8b3, 0xe5ba81, 0xe5bc94, 0xe5bcb5,
+ /* a4 */ 0xe5bdab, 0xe5beb4, 0xe687b2, 0xe68c91,
+ /* a8 */ 0xe69aa2, 0xe69c9d, 0xe6bdae, 0xe78992,
+ /* ac */ 0xe794ba, 0xe79cba, 0xe881b4, 0xe884b9,
+ /* b0 */ 0xe885b8, 0xe89db6, 0xe8aabf, 0xe8ab9c,
+ /* b4 */ 0xe8b685, 0xe8b7b3, 0xe98a9a, 0xe995b7,
+ /* b8 */ 0xe9a082, 0xe9b3a5, 0xe58b85, 0xe68d97,
+ /* bc */ 0xe79bb4, 0xe69c95, 0xe6b288, 0xe78f8d,
+ /* c0 */ 0xe8b383, 0xe98eae, 0xe999b3, 0xe6b4a5,
+ /* c4 */ 0xe5a29c, 0xe6a48e, 0xe6a78c, 0xe8bfbd,
+ /* c8 */ 0xe98e9a, 0xe7979b, 0xe9809a, 0xe5a19a,
+ /* cc */ 0xe6a082, 0xe68eb4, 0xe6a7bb, 0xe4bd83,
+ /* d0 */ 0xe6bcac, 0xe69f98, 0xe8bebb, 0xe894a6,
+ /* d4 */ 0xe7b6b4, 0xe98d94, 0xe6a4bf, 0xe6bdb0,
+ /* d8 */ 0xe59daa, 0xe5a3b7, 0xe5acac, 0xe7b4ac,
+ /* dc */ 0xe788aa, 0xe5908a, 0xe987a3, 0xe9b6b4,
+ /* e0 */ 0xe4baad, 0xe4bd8e, 0xe5819c, 0xe581b5,
+ /* e4 */ 0xe58983, 0xe8b29e, 0xe59188, 0xe5a0a4,
+ /* e8 */ 0xe5ae9a, 0xe5b89d, 0xe5ba95, 0xe5baad,
+ /* ec */ 0xe5bbb7, 0xe5bc9f, 0xe6828c, 0xe68ab5,
+ /* f0 */ 0xe68cba, 0xe68f90, 0xe6a2af, 0xe6b180,
+ /* f4 */ 0xe7a287, 0xe7a68e, 0xe7a88b, 0xe7b7a0,
+ /* f8 */ 0xe88987, 0xe8a882, 0xe8aba6, 0xe8b984,
+ /* fc */ 0xe98093,
+
+ /*** Two byte table, leaf: 93xx - offset 0x00ce9 ***/
+
+ /* 40 */ 0xe982b8, 0xe984ad, 0xe98798, 0xe9bc8e,
+ /* 44 */ 0xe6b3a5, 0xe69198, 0xe693a2, 0xe695b5,
+ /* 48 */ 0xe6bbb4, 0xe79a84, 0xe7ac9b, 0xe981a9,
+ /* 4c */ 0xe98f91, 0xe6baba, 0xe593b2, 0xe5beb9,
+ /* 50 */ 0xe692a4, 0xe8bd8d, 0xe8bfad, 0xe98984,
+ /* 54 */ 0xe585b8, 0xe5a1ab, 0xe5a4a9, 0xe5b195,
+ /* 58 */ 0xe5ba97, 0xe6b7bb, 0xe7ba8f, 0xe7949c,
+ /* 5c */ 0xe8b2bc, 0xe8bba2, 0xe9a19b, 0xe782b9,
+ /* 60 */ 0xe4bc9d, 0xe6aebf, 0xe6beb1, 0xe794b0,
+ /* 64 */ 0xe99bbb, 0xe5858e, 0xe59090, 0xe5a0b5,
+ /* 68 */ 0xe5a197, 0xe5a6ac, 0xe5b1a0, 0xe5be92,
+ /* 6c */ 0xe69697, 0xe69d9c, 0xe6b8a1, 0xe799bb,
+ /* 70 */ 0xe88f9f, 0xe8b3ad, 0xe98094, 0xe983bd,
+ /* 74 */ 0xe98d8d, 0xe7a0a5, 0xe7a0ba, 0xe58aaa,
+ /* 78 */ 0xe5baa6, 0xe59c9f, 0xe5a5b4, 0xe68092,
+ /* 7c */ 0xe58092, 0xe5859a, 0xe586ac, 0x000000,
+ /* 80 */ 0xe5878d, 0xe58880, 0xe59490, 0xe5a194,
+ /* 84 */ 0xe5a198, 0xe5a597, 0xe5ae95, 0xe5b3b6,
+ /* 88 */ 0xe5b68b, 0xe682bc, 0xe68a95, 0xe690ad,
+ /* 8c */ 0xe69db1, 0xe6a183, 0xe6a2bc, 0xe6a39f,
+ /* 90 */ 0xe79b97, 0xe6b798, 0xe6b9af, 0xe6b69b,
+ /* 94 */ 0xe781af, 0xe78788, 0xe5bd93, 0xe79798,
+ /* 98 */ 0xe7a5b7, 0xe7ad89, 0xe7ad94, 0xe7ad92,
+ /* 9c */ 0xe7b396, 0xe7b5b1, 0xe588b0, 0xe891a3,
+ /* a0 */ 0xe895a9, 0xe897a4, 0xe8a88e, 0xe8ac84,
+ /* a4 */ 0xe8b186, 0xe8b88f, 0xe98083, 0xe9808f,
+ /* a8 */ 0xe99099, 0xe999b6, 0xe9a0ad, 0xe9a8b0,
+ /* ac */ 0xe99798, 0xe5838d, 0xe58b95, 0xe5908c,
+ /* b0 */ 0xe5a082, 0xe5b08e, 0xe686a7, 0xe6929e,
+ /* b4 */ 0xe6b49e, 0xe79eb3, 0xe7aba5, 0xe883b4,
+ /* b8 */ 0xe89084, 0xe98193, 0xe98a85, 0xe5b3a0,
+ /* bc */ 0xe9b487, 0xe58cbf, 0xe5be97, 0xe5beb3,
+ /* c0 */ 0xe6b69c, 0xe789b9, 0xe79da3, 0xe7a6bf,
+ /* c4 */ 0xe7afa4, 0xe6af92, 0xe78bac, 0xe8aaad,
+ /* c8 */ 0xe6a083, 0xe6a9a1, 0xe587b8, 0xe7aa81,
+ /* cc */ 0xe6a4b4, 0xe5b18a, 0xe9b3b6, 0xe88bab,
+ /* d0 */ 0xe5af85, 0xe98589, 0xe7809e, 0xe599b8,
+ /* d4 */ 0xe5b1af, 0xe68387, 0xe695a6, 0xe6b28c,
+ /* d8 */ 0xe8b19a, 0xe98181, 0xe9a093, 0xe59191,
+ /* dc */ 0xe69b87, 0xe9888d, 0xe5a588, 0xe982a3,
+ /* e0 */ 0xe58685, 0xe4b98d, 0xe587aa, 0xe89699,
+ /* e4 */ 0xe8ac8e, 0xe78198, 0xe68dba, 0xe98d8b,
+ /* e8 */ 0xe6a5a2, 0xe9a6b4, 0xe7b884, 0xe795b7,
+ /* ec */ 0xe58d97, 0xe6a5a0, 0xe8bb9f, 0xe99ba3,
+ /* f0 */ 0xe6b19d, 0xe4ba8c, 0xe5b0bc, 0xe5bc90,
+ /* f4 */ 0xe8bfa9, 0xe58c82, 0xe8b391, 0xe88289,
+ /* f8 */ 0xe899b9, 0xe5bbbf, 0xe697a5, 0xe4b9b3,
+ /* fc */ 0xe585a5,
+
+ /*** Two byte table, leaf: 94xx - offset 0x00da6 ***/
+
+ /* 40 */ 0xe5a682, 0xe5b0bf, 0xe99fae, 0xe4bbbb,
+ /* 44 */ 0xe5a68a, 0xe5bf8d, 0xe8aa8d, 0xe6bfa1,
+ /* 48 */ 0xe7a6b0, 0xe7a5a2, 0xe5afa7, 0xe891b1,
+ /* 4c */ 0xe78cab, 0xe786b1, 0xe5b9b4, 0xe5bfb5,
+ /* 50 */ 0xe68dbb, 0xe6929a, 0xe78783, 0xe7b298,
+ /* 54 */ 0xe4b983, 0xe5bbbc, 0xe4b98b, 0xe59f9c,
+ /* 58 */ 0xe59aa2, 0xe682a9, 0xe6bf83, 0xe7b48d,
+ /* 5c */ 0xe883bd, 0xe884b3, 0xe886bf, 0xe8beb2,
+ /* 60 */ 0xe8a697, 0xe89aa4, 0xe5b7b4, 0xe68a8a,
+ /* 64 */ 0xe692ad, 0xe8a687, 0xe69db7, 0xe6b3a2,
+ /* 68 */ 0xe6b4be, 0xe790b6, 0xe7a0b4, 0xe5a986,
+ /* 6c */ 0xe7bdb5, 0xe88aad, 0xe9a6ac, 0xe4bfb3,
+ /* 70 */ 0xe5bb83, 0xe68b9d, 0xe68e92, 0xe69597,
+ /* 74 */ 0xe69daf, 0xe79b83, 0xe7898c, 0xe8838c,
+ /* 78 */ 0xe882ba, 0xe8bca9, 0xe9858d, 0xe5808d,
+ /* 7c */ 0xe59fb9, 0xe5aa92, 0xe6a285, 0x000000,
+ /* 80 */ 0xe6a5b3, 0xe785a4, 0xe78bbd, 0xe8b2b7,
+ /* 84 */ 0xe5a3b2, 0xe8b3a0, 0xe999aa, 0xe98099,
+ /* 88 */ 0xe89dbf, 0xe7a7a4, 0xe79fa7, 0xe890a9,
+ /* 8c */ 0xe4bcaf, 0xe589a5, 0xe58d9a, 0xe68b8d,
+ /* 90 */ 0xe69f8f, 0xe6b38a, 0xe799bd, 0xe7ae94,
+ /* 94 */ 0xe7b295, 0xe888b6, 0xe89684, 0xe8bfab,
+ /* 98 */ 0xe69b9d, 0xe6bca0, 0xe78886, 0xe7b89b,
+ /* 9c */ 0xe88eab, 0xe9a781, 0xe9baa6, 0xe587bd,
+ /* a0 */ 0xe7aeb1, 0xe7a1b2, 0xe7aeb8, 0xe88287,
+ /* a4 */ 0xe7ad88, 0xe6aba8, 0xe5b9a1, 0xe8828c,
+ /* a8 */ 0xe79591, 0xe795a0, 0xe585ab, 0xe989a2,
+ /* ac */ 0xe6ba8c, 0xe799ba, 0xe98697, 0xe9abaa,
+ /* b0 */ 0xe4bc90, 0xe7bdb0, 0xe68a9c, 0xe7ad8f,
+ /* b4 */ 0xe996a5, 0xe9b3a9, 0xe599ba, 0xe5a199,
+ /* b8 */ 0xe89ba4, 0xe99abc, 0xe4bcb4, 0xe588a4,
+ /* bc */ 0xe58d8a, 0xe58f8d, 0xe58f9b, 0xe5b886,
+ /* c0 */ 0xe690ac, 0xe69691, 0xe69dbf, 0xe6b0be,
+ /* c4 */ 0xe6b18e, 0xe78988, 0xe78aaf, 0xe78fad,
+ /* c8 */ 0xe79594, 0xe7b981, 0xe888ac, 0xe897a9,
+ /* cc */ 0xe8b2a9, 0xe7af84, 0xe98786, 0xe785a9,
+ /* d0 */ 0xe9a092, 0xe9a3af, 0xe68cbd, 0xe699a9,
+ /* d4 */ 0xe795aa, 0xe79ba4, 0xe7a390, 0xe89583,
+ /* d8 */ 0xe89bae, 0xe58caa, 0xe58d91, 0xe590a6,
+ /* dc */ 0xe5a683, 0xe5ba87, 0xe5bdbc, 0xe682b2,
+ /* e0 */ 0xe68989, 0xe689b9, 0xe68aab, 0xe69690,
+ /* e4 */ 0xe6af94, 0xe6b38c, 0xe796b2, 0xe79aae,
+ /* e8 */ 0xe7a291, 0xe7a798, 0xe7b78b, 0xe7bdb7,
+ /* ec */ 0xe882a5, 0xe8a2ab, 0xe8aab9, 0xe8b2bb,
+ /* f0 */ 0xe981bf, 0xe99d9e, 0xe9a39b, 0xe6a88b,
+ /* f4 */ 0xe7b0b8, 0xe58299, 0xe5b0be, 0xe5beae,
+ /* f8 */ 0xe69e87, 0xe6af98, 0xe790b5, 0xe79c89,
+ /* fc */ 0xe7be8e,
+
+ /*** Two byte table, leaf: 95xx - offset 0x00e63 ***/
+
+ /* 40 */ 0xe9bcbb, 0xe69f8a, 0xe7a897, 0xe58cb9,
+ /* 44 */ 0xe7968b, 0xe9abad, 0xe5bda6, 0xe8869d,
+ /* 48 */ 0xe88fb1, 0xe88298, 0xe5bcbc, 0xe5bf85,
+ /* 4c */ 0xe795a2, 0xe7ad86, 0xe980bc, 0xe6a1a7,
+ /* 50 */ 0xe5a7ab, 0xe5aa9b, 0xe7b490, 0xe799be,
+ /* 54 */ 0xe8acac, 0xe4bfb5, 0xe5bdaa, 0xe6a899,
+ /* 58 */ 0xe6b0b7, 0xe6bc82, 0xe793a2, 0xe7a5a8,
+ /* 5c */ 0xe8a1a8, 0xe8a995, 0xe8b1b9, 0xe5bb9f,
+ /* 60 */ 0xe68f8f, 0xe79785, 0xe7a792, 0xe88b97,
+ /* 64 */ 0xe98ca8, 0xe98bb2, 0xe8929c, 0xe89bad,
+ /* 68 */ 0xe9b0ad, 0xe59381, 0xe5bdac, 0xe6968c,
+ /* 6c */ 0xe6b59c, 0xe78095, 0xe8b2a7, 0xe8b393,
+ /* 70 */ 0xe9a0bb, 0xe6958f, 0xe793b6, 0xe4b88d,
+ /* 74 */ 0xe4bb98, 0xe59fa0, 0xe5a4ab, 0xe5a9a6,
+ /* 78 */ 0xe5af8c, 0xe586a8, 0xe5b883, 0xe5ba9c,
+ /* 7c */ 0xe68096, 0xe689b6, 0xe695b7, 0x000000,
+ /* 80 */ 0xe696a7, 0xe699ae, 0xe6b5ae, 0xe788b6,
+ /* 84 */ 0xe7aca6, 0xe88590, 0xe8869a, 0xe88a99,
+ /* 88 */ 0xe8ad9c, 0xe8b2a0, 0xe8b3a6, 0xe8b5b4,
+ /* 8c */ 0xe9989c, 0xe99984, 0xe4beae, 0xe692ab,
+ /* 90 */ 0xe6ada6, 0xe8889e, 0xe891a1, 0xe895aa,
+ /* 94 */ 0xe983a8, 0xe5b081, 0xe6a593, 0xe9a2a8,
+ /* 98 */ 0xe891ba, 0xe89597, 0xe4bc8f, 0xe589af,
+ /* 9c */ 0xe5bea9, 0xe5b985, 0xe69c8d, 0xe7a68f,
+ /* a0 */ 0xe885b9, 0xe8a487, 0xe8a686, 0xe6b7b5,
+ /* a4 */ 0xe5bc97, 0xe68995, 0xe6b2b8, 0xe4bb8f,
+ /* a8 */ 0xe789a9, 0xe9ae92, 0xe58886, 0xe590bb,
+ /* ac */ 0xe599b4, 0xe5a2b3, 0xe686a4, 0xe689ae,
+ /* b0 */ 0xe7849a, 0xe5a5ae, 0xe7b289, 0xe7b39e,
+ /* b4 */ 0xe7b49b, 0xe99bb0, 0xe69687, 0xe8819e,
+ /* b8 */ 0xe4b899, 0xe4bdb5, 0xe585b5, 0xe5a180,
+ /* bc */ 0xe5b9a3, 0xe5b9b3, 0xe5bc8a, 0xe69f84,
+ /* c0 */ 0xe4b8a6, 0xe894bd, 0xe99689, 0xe9999b,
+ /* c4 */ 0xe7b1b3, 0xe9a081, 0xe583bb, 0xe5a381,
+ /* c8 */ 0xe79996, 0xe7a2a7, 0xe588a5, 0xe79ea5,
+ /* cc */ 0xe89491, 0xe7ae86, 0xe5818f, 0xe5a489,
+ /* d0 */ 0xe78987, 0xe7af87, 0xe7b7a8, 0xe8beba,
+ /* d4 */ 0xe8bf94, 0xe9818d, 0xe4bebf, 0xe58b89,
+ /* d8 */ 0xe5a8a9, 0xe5bc81, 0xe99ead, 0xe4bf9d,
+ /* dc */ 0xe88897, 0xe98baa, 0xe59c83, 0xe68d95,
+ /* e0 */ 0xe6ada9, 0xe794ab, 0xe8a39c, 0xe8bc94,
+ /* e4 */ 0xe7a982, 0xe58b9f, 0xe5a293, 0xe68595,
+ /* e8 */ 0xe6888a, 0xe69aae, 0xe6af8d, 0xe7b0bf,
+ /* ec */ 0xe88fa9, 0xe580a3, 0xe4bfb8, 0xe58c85,
+ /* f0 */ 0xe59186, 0xe5a0b1, 0xe5a589, 0xe5ae9d,
+ /* f4 */ 0xe5b3b0, 0xe5b3af, 0xe5b4a9, 0xe5ba96,
+ /* f8 */ 0xe68ab1, 0xe68da7, 0xe694be, 0xe696b9,
+ /* fc */ 0xe69c8b,
+
+ /*** Two byte table, leaf: 96xx - offset 0x00f20 ***/
+
+ /* 40 */ 0xe6b395, 0xe6b3a1, 0xe783b9, 0xe7a0b2,
+ /* 44 */ 0xe7b8ab, 0xe8839e, 0xe88ab3, 0xe8908c,
+ /* 48 */ 0xe893ac, 0xe89c82, 0xe8a492, 0xe8a8aa,
+ /* 4c */ 0xe8b18a, 0xe982a6, 0xe98b92, 0xe9a3bd,
+ /* 50 */ 0xe9b3b3, 0xe9b5ac, 0xe4b98f, 0xe4baa1,
+ /* 54 */ 0xe5828d, 0xe58996, 0xe59d8a, 0xe5a6a8,
+ /* 58 */ 0xe5b8bd, 0xe5bf98, 0xe5bf99, 0xe688bf,
+ /* 5c */ 0xe69ab4, 0xe69c9b, 0xe69f90, 0xe6a392,
+ /* 60 */ 0xe58692, 0xe7b4a1, 0xe882aa, 0xe886a8,
+ /* 64 */ 0xe8ac80, 0xe8b28c, 0xe8b2bf, 0xe989be,
+ /* 68 */ 0xe998b2, 0xe590a0, 0xe9a0ac, 0xe58c97,
+ /* 6c */ 0xe58395, 0xe58d9c, 0xe5a2a8, 0xe692b2,
+ /* 70 */ 0xe69cb4, 0xe789a7, 0xe79da6, 0xe7a986,
+ /* 74 */ 0xe987a6, 0xe58b83, 0xe6b2a1, 0xe6ae86,
+ /* 78 */ 0xe5a080, 0xe5b98c, 0xe5a594, 0xe69cac,
+ /* 7c */ 0xe7bfbb, 0xe587a1, 0xe79b86, 0x000000,
+ /* 80 */ 0xe691a9, 0xe7a3a8, 0xe9ad94, 0xe9babb,
+ /* 84 */ 0xe59f8b, 0xe5a6b9, 0xe698a7, 0xe69e9a,
+ /* 88 */ 0xe6af8e, 0xe593a9, 0xe6a799, 0xe5b995,
+ /* 8c */ 0xe8869c, 0xe69e95, 0xe9aeaa, 0xe69fbe,
+ /* 90 */ 0xe9b192, 0xe6a19d, 0xe4baa6, 0xe4bfa3,
+ /* 94 */ 0xe58f88, 0xe68ab9, 0xe69cab, 0xe6b2ab,
+ /* 98 */ 0xe8bf84, 0xe4bead, 0xe7b9ad, 0xe9babf,
+ /* 9c */ 0xe4b887, 0xe685a2, 0xe6ba80, 0xe6bcab,
+ /* a0 */ 0xe89493, 0xe591b3, 0xe69caa, 0xe9ad85,
+ /* a4 */ 0xe5b7b3, 0xe7ae95, 0xe5b2ac, 0xe5af86,
+ /* a8 */ 0xe89c9c, 0xe6b98a, 0xe89391, 0xe7a894,
+ /* ac */ 0xe88488, 0xe5a699, 0xe7b28d, 0xe6b091,
+ /* b0 */ 0xe79ca0, 0xe58b99, 0xe5a4a2, 0xe784a1,
+ /* b4 */ 0xe7899f, 0xe79f9b, 0xe99ca7, 0xe9b5a1,
+ /* b8 */ 0xe6a48b, 0xe5a9bf, 0xe5a898, 0xe586a5,
+ /* bc */ 0xe5908d, 0xe591bd, 0xe6988e, 0xe79b9f,
+ /* c0 */ 0xe8bfb7, 0xe98a98, 0xe9b3b4, 0xe5a7aa,
+ /* c4 */ 0xe7899d, 0xe6bb85, 0xe5858d, 0xe6a389,
+ /* c8 */ 0xe7b6bf, 0xe7b7ac, 0xe99da2, 0xe9baba,
+ /* cc */ 0xe691b8, 0xe6a8a1, 0xe88c82, 0xe5a684,
+ /* d0 */ 0xe5ad9f, 0xe6af9b, 0xe78c9b, 0xe79bb2,
+ /* d4 */ 0xe7b6b2, 0xe88097, 0xe89299, 0xe584b2,
+ /* d8 */ 0xe69ca8, 0xe9bb99, 0xe79bae, 0xe69da2,
+ /* dc */ 0xe58bbf, 0xe9a485, 0xe5b0a4, 0xe688bb,
+ /* e0 */ 0xe7b1be, 0xe8b2b0, 0xe5958f, 0xe682b6,
+ /* e4 */ 0xe7b48b, 0xe99680, 0xe58c81, 0xe4b99f,
+ /* e8 */ 0xe586b6, 0xe5a49c, 0xe788ba, 0xe880b6,
+ /* ec */ 0xe9878e, 0xe5bca5, 0xe79fa2, 0xe58e84,
+ /* f0 */ 0xe5bdb9, 0xe7b484, 0xe896ac, 0xe8a8b3,
+ /* f4 */ 0xe8ba8d, 0xe99d96, 0xe69fb3, 0xe896ae,
+ /* f8 */ 0xe99193, 0xe68489, 0xe68488, 0xe6b2b9,
+ /* fc */ 0xe79992,
+
+ /*** Two byte table, leaf: 97xx - offset 0x00fdd ***/
+
+ /* 40 */ 0xe8abad, 0xe8bcb8, 0xe594af, 0xe4bd91,
+ /* 44 */ 0xe584aa, 0xe58b87, 0xe58f8b, 0xe5aea5,
+ /* 48 */ 0xe5b9bd, 0xe682a0, 0xe68682, 0xe68f96,
+ /* 4c */ 0xe69c89, 0xe69f9a, 0xe6b9a7, 0xe6b68c,
+ /* 50 */ 0xe78cb6, 0xe78cb7, 0xe794b1, 0xe7a590,
+ /* 54 */ 0xe8a395, 0xe8aa98, 0xe9818a, 0xe98291,
+ /* 58 */ 0xe983b5, 0xe99b84, 0xe89e8d, 0xe5a495,
+ /* 5c */ 0xe4ba88, 0xe4bd99, 0xe4b88e, 0xe8aa89,
+ /* 60 */ 0xe8bcbf, 0xe9a090, 0xe582ad, 0xe5b9bc,
+ /* 64 */ 0xe5a696, 0xe5aeb9, 0xe5bab8, 0xe68f9a,
+ /* 68 */ 0xe68fba, 0xe69381, 0xe69b9c, 0xe6a58a,
+ /* 6c */ 0xe6a798, 0xe6b48b, 0xe6bab6, 0xe78694,
+ /* 70 */ 0xe794a8, 0xe7aaaf, 0xe7be8a, 0xe88080,
+ /* 74 */ 0xe89189, 0xe89389, 0xe8a681, 0xe8aca1,
+ /* 78 */ 0xe8b88a, 0xe981a5, 0xe999bd, 0xe9a48a,
+ /* 7c */ 0xe685be, 0xe68a91, 0xe6acb2, 0x000000,
+ /* 80 */ 0xe6b283, 0xe6b5b4, 0xe7bf8c, 0xe7bfbc,
+ /* 84 */ 0xe6b780, 0xe7be85, 0xe89eba, 0xe8a3b8,
+ /* 88 */ 0xe69da5, 0xe88eb1, 0xe9a0bc, 0xe99bb7,
+ /* 8c */ 0xe6b49b, 0xe7b5a1, 0xe890bd, 0xe985aa,
+ /* 90 */ 0xe4b9b1, 0xe58db5, 0xe5b590, 0xe6ac84,
+ /* 94 */ 0xe6bfab, 0xe8978d, 0xe898ad, 0xe8a6a7,
+ /* 98 */ 0xe588a9, 0xe5908f, 0xe5b1a5, 0xe69d8e,
+ /* 9c */ 0xe6a2a8, 0xe79086, 0xe79283, 0xe797a2,
+ /* a0 */ 0xe8a38f, 0xe8a3a1, 0xe9878c, 0xe99ba2,
+ /* a4 */ 0xe999b8, 0xe5be8b, 0xe78e87, 0xe7ab8b,
+ /* a8 */ 0xe8918e, 0xe68ea0, 0xe795a5, 0xe58a89,
+ /* ac */ 0xe6b581, 0xe6ba9c, 0xe79089, 0xe79599,
+ /* b0 */ 0xe7a1ab, 0xe7b292, 0xe99a86, 0xe7ab9c,
+ /* b4 */ 0xe9be8d, 0xe4beb6, 0xe685ae, 0xe69785,
+ /* b8 */ 0xe8999c, 0xe4ba86, 0xe4baae, 0xe5839a,
+ /* bc */ 0xe4b8a1, 0xe5878c, 0xe5afae, 0xe69699,
+ /* c0 */ 0xe6a281, 0xe6b6bc, 0xe78c9f, 0xe79982,
+ /* c4 */ 0xe79ead, 0xe7a89c, 0xe7b3a7, 0xe889af,
+ /* c8 */ 0xe8ab92, 0xe981bc, 0xe9878f, 0xe999b5,
+ /* cc */ 0xe9a098, 0xe58a9b, 0xe7b791, 0xe580ab,
+ /* d0 */ 0xe58e98, 0xe69e97, 0xe6b78b, 0xe78790,
+ /* d4 */ 0xe790b3, 0xe887a8, 0xe8bcaa, 0xe99aa3,
+ /* d8 */ 0xe9b197, 0xe9ba9f, 0xe791a0, 0xe5a181,
+ /* dc */ 0xe6b699, 0xe7b4af, 0xe9a19e, 0xe4bba4,
+ /* e0 */ 0xe4bcb6, 0xe4be8b, 0xe586b7, 0xe58ab1,
+ /* e4 */ 0xe5b6ba, 0xe6809c, 0xe78eb2, 0xe7a4bc,
+ /* e8 */ 0xe88b93, 0xe988b4, 0xe99ab7, 0xe99bb6,
+ /* ec */ 0xe99c8a, 0xe9ba97, 0xe9bda2, 0xe69aa6,
+ /* f0 */ 0xe6adb4, 0xe58897, 0xe58aa3, 0xe78388,
+ /* f4 */ 0xe8a382, 0xe5bb89, 0xe6818b, 0xe68690,
+ /* f8 */ 0xe6bca3, 0xe78589, 0xe7b0be, 0xe7b7b4,
+ /* fc */ 0xe881af,
+
+ /*** Two byte table, leaf: 98xx - offset 0x0109a ***/
+
+ /* 40 */ 0xe893ae, 0xe980a3, 0xe98cac, 0xe59182,
+ /* 44 */ 0xe9adaf, 0xe6ab93, 0xe78289, 0xe8b382,
+ /* 48 */ 0xe8b7af, 0xe99cb2, 0xe58ab4, 0xe5a981,
+ /* 4c */ 0xe5bb8a, 0xe5bc84, 0xe69c97, 0xe6a5bc,
+ /* 50 */ 0xe6a694, 0xe6b5aa, 0xe6bc8f, 0xe789a2,
+ /* 54 */ 0xe78bbc, 0xe7afad, 0xe88081, 0xe881be,
+ /* 58 */ 0xe89d8b, 0xe9838e, 0xe585ad, 0xe9ba93,
+ /* 5c */ 0xe7a684, 0xe8828b, 0xe98cb2, 0xe8ab96,
+ /* 60 */ 0xe580ad, 0xe5928c, 0xe8a9b1, 0xe6adaa,
+ /* 64 */ 0xe8b384, 0xe88487, 0xe68391, 0xe69ea0,
+ /* 68 */ 0xe9b7b2, 0xe4ba99, 0xe4ba98, 0xe9b090,
+ /* 6c */ 0xe8a9ab, 0xe89781, 0xe895a8, 0xe6a480,
+ /* 70 */ 0xe6b9be, 0xe7a297, 0xe88595, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0xe5bc8c,
+ /* a0 */ 0xe4b890, 0xe4b895, 0xe4b8aa, 0xe4b8b1,
+ /* a4 */ 0xe4b8b6, 0xe4b8bc, 0xe4b8bf, 0xe4b982,
+ /* a8 */ 0xe4b996, 0xe4b998, 0xe4ba82, 0xe4ba85,
+ /* ac */ 0xe8b1ab, 0xe4ba8a, 0xe88892, 0xe5bc8d,
+ /* b0 */ 0xe4ba8e, 0xe4ba9e, 0xe4ba9f, 0xe4baa0,
+ /* b4 */ 0xe4baa2, 0xe4bab0, 0xe4bab3, 0xe4bab6,
+ /* b8 */ 0xe4bb8e, 0xe4bb8d, 0xe4bb84, 0xe4bb86,
+ /* bc */ 0xe4bb82, 0xe4bb97, 0xe4bb9e, 0xe4bbad,
+ /* c0 */ 0xe4bb9f, 0xe4bbb7, 0xe4bc89, 0xe4bd9a,
+ /* c4 */ 0xe4bcb0, 0xe4bd9b, 0xe4bd9d, 0xe4bd97,
+ /* c8 */ 0xe4bd87, 0xe4bdb6, 0xe4be88, 0xe4be8f,
+ /* cc */ 0xe4be98, 0xe4bdbb, 0xe4bda9, 0xe4bdb0,
+ /* d0 */ 0xe4be91, 0xe4bdaf, 0xe4be86, 0xe4be96,
+ /* d4 */ 0xe58498, 0xe4bf94, 0xe4bf9f, 0xe4bf8e,
+ /* d8 */ 0xe4bf98, 0xe4bf9b, 0xe4bf91, 0xe4bf9a,
+ /* dc */ 0xe4bf90, 0xe4bfa4, 0xe4bfa5, 0xe5809a,
+ /* e0 */ 0xe580a8, 0xe58094, 0xe580aa, 0xe580a5,
+ /* e4 */ 0xe58085, 0xe4bc9c, 0xe4bfb6, 0xe580a1,
+ /* e8 */ 0xe580a9, 0xe580ac, 0xe4bfbe, 0xe4bfaf,
+ /* ec */ 0xe58091, 0xe58086, 0xe58183, 0xe58187,
+ /* f0 */ 0xe69c83, 0xe58195, 0xe58190, 0xe58188,
+ /* f4 */ 0xe5819a, 0xe58196, 0xe581ac, 0xe581b8,
+ /* f8 */ 0xe58280, 0xe5829a, 0xe58285, 0xe582b4,
+ /* fc */ 0xe582b2,
+
+ /*** Two byte table, leaf: 99xx - offset 0x01157 ***/
+
+ /* 40 */ 0xe58389, 0xe5838a, 0xe582b3, 0xe58382,
+ /* 44 */ 0xe58396, 0xe5839e, 0xe583a5, 0xe583ad,
+ /* 48 */ 0xe583a3, 0xe583ae, 0xe583b9, 0xe583b5,
+ /* 4c */ 0xe58489, 0xe58481, 0xe58482, 0xe58496,
+ /* 50 */ 0xe58495, 0xe58494, 0xe5849a, 0xe584a1,
+ /* 54 */ 0xe584ba, 0xe584b7, 0xe584bc, 0xe584bb,
+ /* 58 */ 0xe584bf, 0xe58580, 0xe58592, 0xe5858c,
+ /* 5c */ 0xe58594, 0xe585a2, 0xe7abb8, 0xe585a9,
+ /* 60 */ 0xe585aa, 0xe585ae, 0xe58680, 0xe58682,
+ /* 64 */ 0xe59b98, 0xe5868c, 0xe58689, 0xe5868f,
+ /* 68 */ 0xe58691, 0xe58693, 0xe58695, 0xe58696,
+ /* 6c */ 0xe586a4, 0xe586a6, 0xe586a2, 0xe586a9,
+ /* 70 */ 0xe586aa, 0xe586ab, 0xe586b3, 0xe586b1,
+ /* 74 */ 0xe586b2, 0xe586b0, 0xe586b5, 0xe586bd,
+ /* 78 */ 0xe58785, 0xe58789, 0xe5879b, 0xe587a0,
+ /* 7c */ 0xe89995, 0xe587a9, 0xe587ad, 0x000000,
+ /* 80 */ 0xe587b0, 0xe587b5, 0xe587be, 0xe58884,
+ /* 84 */ 0xe5888b, 0xe58894, 0xe5888e, 0xe588a7,
+ /* 88 */ 0xe588aa, 0xe588ae, 0xe588b3, 0xe588b9,
+ /* 8c */ 0xe5898f, 0xe58984, 0xe5898b, 0xe5898c,
+ /* 90 */ 0xe5899e, 0xe58994, 0xe589aa, 0xe589b4,
+ /* 94 */ 0xe589a9, 0xe589b3, 0xe589bf, 0xe589bd,
+ /* 98 */ 0xe58a8d, 0xe58a94, 0xe58a92, 0xe589b1,
+ /* 9c */ 0xe58a88, 0xe58a91, 0xe8bea8, 0xe8bea7,
+ /* a0 */ 0xe58aac, 0xe58aad, 0xe58abc, 0xe58ab5,
+ /* a4 */ 0xe58b81, 0xe58b8d, 0xe58b97, 0xe58b9e,
+ /* a8 */ 0xe58ba3, 0xe58ba6, 0xe9a3ad, 0xe58ba0,
+ /* ac */ 0xe58bb3, 0xe58bb5, 0xe58bb8, 0xe58bb9,
+ /* b0 */ 0xe58c86, 0xe58c88, 0xe794b8, 0xe58c8d,
+ /* b4 */ 0xe58c90, 0xe58c8f, 0xe58c95, 0xe58c9a,
+ /* b8 */ 0xe58ca3, 0xe58caf, 0xe58cb1, 0xe58cb3,
+ /* bc */ 0xe58cb8, 0xe58d80, 0xe58d86, 0xe58d85,
+ /* c0 */ 0xe4b897, 0xe58d89, 0xe58d8d, 0xe58796,
+ /* c4 */ 0xe58d9e, 0xe58da9, 0xe58dae, 0xe5a498,
+ /* c8 */ 0xe58dbb, 0xe58db7, 0xe58e82, 0xe58e96,
+ /* cc */ 0xe58ea0, 0xe58ea6, 0xe58ea5, 0xe58eae,
+ /* d0 */ 0xe58eb0, 0xe58eb6, 0xe58f83, 0xe7b092,
+ /* d4 */ 0xe99b99, 0xe58f9f, 0xe69bbc, 0xe787ae,
+ /* d8 */ 0xe58fae, 0xe58fa8, 0xe58fad, 0xe58fba,
+ /* dc */ 0xe59081, 0xe590bd, 0xe59180, 0xe590ac,
+ /* e0 */ 0xe590ad, 0xe590bc, 0xe590ae, 0xe590b6,
+ /* e4 */ 0xe590a9, 0xe5909d, 0xe5918e, 0xe5928f,
+ /* e8 */ 0xe591b5, 0xe5928e, 0xe5919f, 0xe591b1,
+ /* ec */ 0xe591b7, 0xe591b0, 0xe59292, 0xe591bb,
+ /* f0 */ 0xe59280, 0xe591b6, 0xe59284, 0xe59290,
+ /* f4 */ 0xe59286, 0xe59387, 0xe592a2, 0xe592b8,
+ /* f8 */ 0xe592a5, 0xe592ac, 0xe59384, 0xe59388,
+ /* fc */ 0xe592a8,
+
+ /*** Two byte table, leaf: 9axx - offset 0x01214 ***/
+
+ /* 40 */ 0xe592ab, 0xe59382, 0xe592a4, 0xe592be,
+ /* 44 */ 0xe592bc, 0xe59398, 0xe593a5, 0xe593a6,
+ /* 48 */ 0xe5948f, 0xe59494, 0xe593bd, 0xe593ae,
+ /* 4c */ 0xe593ad, 0xe593ba, 0xe593a2, 0xe594b9,
+ /* 50 */ 0xe59580, 0xe595a3, 0xe5958c, 0xe594ae,
+ /* 54 */ 0xe5959c, 0xe59585, 0xe59596, 0xe59597,
+ /* 58 */ 0xe594b8, 0xe594b3, 0xe5959d, 0xe59699,
+ /* 5c */ 0xe59680, 0xe592af, 0xe5968a, 0xe5969f,
+ /* 60 */ 0xe595bb, 0xe595be, 0xe59698, 0xe5969e,
+ /* 64 */ 0xe596ae, 0xe595bc, 0xe59683, 0xe596a9,
+ /* 68 */ 0xe59687, 0xe596a8, 0xe5979a, 0xe59785,
+ /* 6c */ 0xe5979f, 0xe59784, 0xe5979c, 0xe597a4,
+ /* 70 */ 0xe59794, 0xe59894, 0xe597b7, 0xe59896,
+ /* 74 */ 0xe597be, 0xe597bd, 0xe5989b, 0xe597b9,
+ /* 78 */ 0xe5998e, 0xe59990, 0xe7879f, 0xe598b4,
+ /* 7c */ 0xe598b6, 0xe598b2, 0xe598b8, 0x000000,
+ /* 80 */ 0xe599ab, 0xe599a4, 0xe598af, 0xe599ac,
+ /* 84 */ 0xe599aa, 0xe59a86, 0xe59a80, 0xe59a8a,
+ /* 88 */ 0xe59aa0, 0xe59a94, 0xe59a8f, 0xe59aa5,
+ /* 8c */ 0xe59aae, 0xe59ab6, 0xe59ab4, 0xe59b82,
+ /* 90 */ 0xe59abc, 0xe59b81, 0xe59b83, 0xe59b80,
+ /* 94 */ 0xe59b88, 0xe59b8e, 0xe59b91, 0xe59b93,
+ /* 98 */ 0xe59b97, 0xe59bae, 0xe59bb9, 0xe59c80,
+ /* 9c */ 0xe59bbf, 0xe59c84, 0xe59c89, 0xe59c88,
+ /* a0 */ 0xe59c8b, 0xe59c8d, 0xe59c93, 0xe59c98,
+ /* a4 */ 0xe59c96, 0xe59787, 0xe59c9c, 0xe59ca6,
+ /* a8 */ 0xe59cb7, 0xe59cb8, 0xe59d8e, 0xe59cbb,
+ /* ac */ 0xe59d80, 0xe59d8f, 0xe59da9, 0xe59f80,
+ /* b0 */ 0xe59e88, 0xe59da1, 0xe59dbf, 0xe59e89,
+ /* b4 */ 0xe59e93, 0xe59ea0, 0xe59eb3, 0xe59ea4,
+ /* b8 */ 0xe59eaa, 0xe59eb0, 0xe59f83, 0xe59f86,
+ /* bc */ 0xe59f94, 0xe59f92, 0xe59f93, 0xe5a08a,
+ /* c0 */ 0xe59f96, 0xe59fa3, 0xe5a08b, 0xe5a099,
+ /* c4 */ 0xe5a09d, 0xe5a1b2, 0xe5a0a1, 0xe5a1a2,
+ /* c8 */ 0xe5a18b, 0xe5a1b0, 0xe6af80, 0xe5a192,
+ /* cc */ 0xe5a0bd, 0xe5a1b9, 0xe5a285, 0xe5a2b9,
+ /* d0 */ 0xe5a29f, 0xe5a2ab, 0xe5a2ba, 0xe5a39e,
+ /* d4 */ 0xe5a2bb, 0xe5a2b8, 0xe5a2ae, 0xe5a385,
+ /* d8 */ 0xe5a393, 0xe5a391, 0xe5a397, 0xe5a399,
+ /* dc */ 0xe5a398, 0xe5a3a5, 0xe5a39c, 0xe5a3a4,
+ /* e0 */ 0xe5a39f, 0xe5a3af, 0xe5a3ba, 0xe5a3b9,
+ /* e4 */ 0xe5a3bb, 0xe5a3bc, 0xe5a3bd, 0xe5a482,
+ /* e8 */ 0xe5a48a, 0xe5a490, 0xe5a49b, 0xe6a2a6,
+ /* ec */ 0xe5a4a5, 0xe5a4ac, 0xe5a4ad, 0xe5a4b2,
+ /* f0 */ 0xe5a4b8, 0xe5a4be, 0xe7ab92, 0xe5a595,
+ /* f4 */ 0xe5a590, 0xe5a58e, 0xe5a59a, 0xe5a598,
+ /* f8 */ 0xe5a5a2, 0xe5a5a0, 0xe5a5a7, 0xe5a5ac,
+ /* fc */ 0xe5a5a9,
+
+ /*** Two byte table, leaf: 9bxx - offset 0x012d1 ***/
+
+ /* 40 */ 0xe5a5b8, 0xe5a681, 0xe5a69d, 0xe4bd9e,
+ /* 44 */ 0xe4beab, 0xe5a6a3, 0xe5a6b2, 0xe5a786,
+ /* 48 */ 0xe5a7a8, 0xe5a79c, 0xe5a68d, 0xe5a799,
+ /* 4c */ 0xe5a79a, 0xe5a8a5, 0xe5a89f, 0xe5a891,
+ /* 50 */ 0xe5a89c, 0xe5a889, 0xe5a89a, 0xe5a980,
+ /* 54 */ 0xe5a9ac, 0xe5a989, 0xe5a8b5, 0xe5a8b6,
+ /* 58 */ 0xe5a9a2, 0xe5a9aa, 0xe5aa9a, 0xe5aabc,
+ /* 5c */ 0xe5aabe, 0xe5ab8b, 0xe5ab82, 0xe5aabd,
+ /* 60 */ 0xe5aba3, 0xe5ab97, 0xe5aba6, 0xe5aba9,
+ /* 64 */ 0xe5ab96, 0xe5abba, 0xe5abbb, 0xe5ac8c,
+ /* 68 */ 0xe5ac8b, 0xe5ac96, 0xe5acb2, 0xe5ab90,
+ /* 6c */ 0xe5acaa, 0xe5acb6, 0xe5acbe, 0xe5ad83,
+ /* 70 */ 0xe5ad85, 0xe5ad80, 0xe5ad91, 0xe5ad95,
+ /* 74 */ 0xe5ad9a, 0xe5ad9b, 0xe5ada5, 0xe5ada9,
+ /* 78 */ 0xe5adb0, 0xe5adb3, 0xe5adb5, 0xe5adb8,
+ /* 7c */ 0xe69688, 0xe5adba, 0xe5ae80, 0x000000,
+ /* 80 */ 0xe5ae83, 0xe5aea6, 0xe5aeb8, 0xe5af83,
+ /* 84 */ 0xe5af87, 0xe5af89, 0xe5af94, 0xe5af90,
+ /* 88 */ 0xe5afa4, 0xe5afa6, 0xe5afa2, 0xe5af9e,
+ /* 8c */ 0xe5afa5, 0xe5afab, 0xe5afb0, 0xe5afb6,
+ /* 90 */ 0xe5afb3, 0xe5b085, 0xe5b087, 0xe5b088,
+ /* 94 */ 0xe5b08d, 0xe5b093, 0xe5b0a0, 0xe5b0a2,
+ /* 98 */ 0xe5b0a8, 0xe5b0b8, 0xe5b0b9, 0xe5b181,
+ /* 9c */ 0xe5b186, 0xe5b18e, 0xe5b193, 0xe5b190,
+ /* a0 */ 0xe5b18f, 0xe5adb1, 0xe5b1ac, 0xe5b1ae,
+ /* a4 */ 0xe4b9a2, 0xe5b1b6, 0xe5b1b9, 0xe5b28c,
+ /* a8 */ 0xe5b291, 0xe5b294, 0xe5a69b, 0xe5b2ab,
+ /* ac */ 0xe5b2bb, 0xe5b2b6, 0xe5b2bc, 0xe5b2b7,
+ /* b0 */ 0xe5b385, 0xe5b2be, 0xe5b387, 0xe5b399,
+ /* b4 */ 0xe5b3a9, 0xe5b3bd, 0xe5b3ba, 0xe5b3ad,
+ /* b8 */ 0xe5b68c, 0xe5b3aa, 0xe5b48b, 0xe5b495,
+ /* bc */ 0xe5b497, 0xe5b59c, 0xe5b49f, 0xe5b49b,
+ /* c0 */ 0xe5b491, 0xe5b494, 0xe5b4a2, 0xe5b49a,
+ /* c4 */ 0xe5b499, 0xe5b498, 0xe5b58c, 0xe5b592,
+ /* c8 */ 0xe5b58e, 0xe5b58b, 0xe5b5ac, 0xe5b5b3,
+ /* cc */ 0xe5b5b6, 0xe5b687, 0xe5b684, 0xe5b682,
+ /* d0 */ 0xe5b6a2, 0xe5b69d, 0xe5b6ac, 0xe5b6ae,
+ /* d4 */ 0xe5b6bd, 0xe5b690, 0xe5b6b7, 0xe5b6bc,
+ /* d8 */ 0xe5b789, 0xe5b78d, 0xe5b793, 0xe5b792,
+ /* dc */ 0xe5b796, 0xe5b79b, 0xe5b7ab, 0xe5b7b2,
+ /* e0 */ 0xe5b7b5, 0xe5b88b, 0xe5b89a, 0xe5b899,
+ /* e4 */ 0xe5b891, 0xe5b89b, 0xe5b8b6, 0xe5b8b7,
+ /* e8 */ 0xe5b984, 0xe5b983, 0xe5b980, 0xe5b98e,
+ /* ec */ 0xe5b997, 0xe5b994, 0xe5b99f, 0xe5b9a2,
+ /* f0 */ 0xe5b9a4, 0xe5b987, 0xe5b9b5, 0xe5b9b6,
+ /* f4 */ 0xe5b9ba, 0xe9babc, 0xe5b9bf, 0xe5baa0,
+ /* f8 */ 0xe5bb81, 0xe5bb82, 0xe5bb88, 0xe5bb90,
+ /* fc */ 0xe5bb8f,
+
+ /*** Two byte table, leaf: 9cxx - offset 0x0138e ***/
+
+ /* 40 */ 0xe5bb96, 0xe5bba3, 0xe5bb9d, 0xe5bb9a,
+ /* 44 */ 0xe5bb9b, 0xe5bba2, 0xe5bba1, 0xe5bba8,
+ /* 48 */ 0xe5bba9, 0xe5bbac, 0xe5bbb1, 0xe5bbb3,
+ /* 4c */ 0xe5bbb0, 0xe5bbb4, 0xe5bbb8, 0xe5bbbe,
+ /* 50 */ 0xe5bc83, 0xe5bc89, 0xe5bd9d, 0xe5bd9c,
+ /* 54 */ 0xe5bc8b, 0xe5bc91, 0xe5bc96, 0xe5bca9,
+ /* 58 */ 0xe5bcad, 0xe5bcb8, 0xe5bd81, 0xe5bd88,
+ /* 5c */ 0xe5bd8c, 0xe5bd8e, 0xe5bcaf, 0xe5bd91,
+ /* 60 */ 0xe5bd96, 0xe5bd97, 0xe5bd99, 0xe5bda1,
+ /* 64 */ 0xe5bdad, 0xe5bdb3, 0xe5bdb7, 0xe5be83,
+ /* 68 */ 0xe5be82, 0xe5bdbf, 0xe5be8a, 0xe5be88,
+ /* 6c */ 0xe5be91, 0xe5be87, 0xe5be9e, 0xe5be99,
+ /* 70 */ 0xe5be98, 0xe5bea0, 0xe5bea8, 0xe5bead,
+ /* 74 */ 0xe5bebc, 0xe5bf96, 0xe5bfbb, 0xe5bfa4,
+ /* 78 */ 0xe5bfb8, 0xe5bfb1, 0xe5bf9d, 0xe682b3,
+ /* 7c */ 0xe5bfbf, 0xe680a1, 0xe681a0, 0x000000,
+ /* 80 */ 0xe68099, 0xe68090, 0xe680a9, 0xe6808e,
+ /* 84 */ 0xe680b1, 0xe6809b, 0xe68095, 0xe680ab,
+ /* 88 */ 0xe680a6, 0xe6808f, 0xe680ba, 0xe6819a,
+ /* 8c */ 0xe68181, 0xe681aa, 0xe681b7, 0xe6819f,
+ /* 90 */ 0xe6818a, 0xe68186, 0xe6818d, 0xe681a3,
+ /* 94 */ 0xe68183, 0xe681a4, 0xe68182, 0xe681ac,
+ /* 98 */ 0xe681ab, 0xe68199, 0xe68281, 0xe6828d,
+ /* 9c */ 0xe683a7, 0xe68283, 0xe6829a, 0xe68284,
+ /* a0 */ 0xe6829b, 0xe68296, 0xe68297, 0xe68292,
+ /* a4 */ 0xe682a7, 0xe6828b, 0xe683a1, 0xe682b8,
+ /* a8 */ 0xe683a0, 0xe68393, 0xe682b4, 0xe5bfb0,
+ /* ac */ 0xe682bd, 0xe68386, 0xe682b5, 0xe68398,
+ /* b0 */ 0xe6858d, 0xe68495, 0xe68486, 0xe683b6,
+ /* b4 */ 0xe683b7, 0xe68480, 0xe683b4, 0xe683ba,
+ /* b8 */ 0xe68483, 0xe684a1, 0xe683bb, 0xe683b1,
+ /* bc */ 0xe6848d, 0xe6848e, 0xe68587, 0xe684be,
+ /* c0 */ 0xe684a8, 0xe684a7, 0xe6858a, 0xe684bf,
+ /* c4 */ 0xe684bc, 0xe684ac, 0xe684b4, 0xe684bd,
+ /* c8 */ 0xe68582, 0xe68584, 0xe685b3, 0xe685b7,
+ /* cc */ 0xe68598, 0xe68599, 0xe6859a, 0xe685ab,
+ /* d0 */ 0xe685b4, 0xe685af, 0xe685a5, 0xe685b1,
+ /* d4 */ 0xe6859f, 0xe6859d, 0xe68593, 0xe685b5,
+ /* d8 */ 0xe68699, 0xe68696, 0xe68687, 0xe686ac,
+ /* dc */ 0xe68694, 0xe6869a, 0xe6868a, 0xe68691,
+ /* e0 */ 0xe686ab, 0xe686ae, 0xe6878c, 0xe6878a,
+ /* e4 */ 0xe68789, 0xe687b7, 0xe68788, 0xe68783,
+ /* e8 */ 0xe68786, 0xe686ba, 0xe6878b, 0xe7bdb9,
+ /* ec */ 0xe6878d, 0xe687a6, 0xe687a3, 0xe687b6,
+ /* f0 */ 0xe687ba, 0xe687b4, 0xe687bf, 0xe687bd,
+ /* f4 */ 0xe687bc, 0xe687be, 0xe68880, 0xe68888,
+ /* f8 */ 0xe68889, 0xe6888d, 0xe6888c, 0xe68894,
+ /* fc */ 0xe6889b,
+
+ /*** Two byte table, leaf: 9dxx - offset 0x0144b ***/
+
+ /* 40 */ 0xe6889e, 0xe688a1, 0xe688aa, 0xe688ae,
+ /* 44 */ 0xe688b0, 0xe688b2, 0xe688b3, 0xe68981,
+ /* 48 */ 0xe6898e, 0xe6899e, 0xe689a3, 0xe6899b,
+ /* 4c */ 0xe689a0, 0xe689a8, 0xe689bc, 0xe68a82,
+ /* 50 */ 0xe68a89, 0xe689be, 0xe68a92, 0xe68a93,
+ /* 54 */ 0xe68a96, 0xe68b94, 0xe68a83, 0xe68a94,
+ /* 58 */ 0xe68b97, 0xe68b91, 0xe68abb, 0xe68b8f,
+ /* 5c */ 0xe68bbf, 0xe68b86, 0xe69394, 0xe68b88,
+ /* 60 */ 0xe68b9c, 0xe68b8c, 0xe68b8a, 0xe68b82,
+ /* 64 */ 0xe68b87, 0xe68a9b, 0xe68b89, 0xe68c8c,
+ /* 68 */ 0xe68bae, 0xe68bb1, 0xe68ca7, 0xe68c82,
+ /* 6c */ 0xe68c88, 0xe68baf, 0xe68bb5, 0xe68d90,
+ /* 70 */ 0xe68cbe, 0xe68d8d, 0xe6909c, 0xe68d8f,
+ /* 74 */ 0xe68e96, 0xe68e8e, 0xe68e80, 0xe68eab,
+ /* 78 */ 0xe68db6, 0xe68ea3, 0xe68e8f, 0xe68e89,
+ /* 7c */ 0xe68e9f, 0xe68eb5, 0xe68dab, 0x000000,
+ /* 80 */ 0xe68da9, 0xe68ebe, 0xe68fa9, 0xe68f80,
+ /* 84 */ 0xe68f86, 0xe68fa3, 0xe68f89, 0xe68f92,
+ /* 88 */ 0xe68fb6, 0xe68f84, 0xe69096, 0xe690b4,
+ /* 8c */ 0xe69086, 0xe69093, 0xe690a6, 0xe690b6,
+ /* 90 */ 0xe6949d, 0xe69097, 0xe690a8, 0xe6908f,
+ /* 94 */ 0xe691a7, 0xe691af, 0xe691b6, 0xe6918e,
+ /* 98 */ 0xe694aa, 0xe69295, 0xe69293, 0xe692a5,
+ /* 9c */ 0xe692a9, 0xe69288, 0xe692bc, 0xe6939a,
+ /* a0 */ 0xe69392, 0xe69385, 0xe69387, 0xe692bb,
+ /* a4 */ 0xe69398, 0xe69382, 0xe693b1, 0xe693a7,
+ /* a8 */ 0xe88889, 0xe693a0, 0xe693a1, 0xe68aac,
+ /* ac */ 0xe693a3, 0xe693af, 0xe694ac, 0xe693b6,
+ /* b0 */ 0xe693b4, 0xe693b2, 0xe693ba, 0xe69480,
+ /* b4 */ 0xe693bd, 0xe69498, 0xe6949c, 0xe69485,
+ /* b8 */ 0xe694a4, 0xe694a3, 0xe694ab, 0xe694b4,
+ /* bc */ 0xe694b5, 0xe694b7, 0xe694b6, 0xe694b8,
+ /* c0 */ 0xe7958b, 0xe69588, 0xe69596, 0xe69595,
+ /* c4 */ 0xe6958d, 0xe69598, 0xe6959e, 0xe6959d,
+ /* c8 */ 0xe695b2, 0xe695b8, 0xe69682, 0xe69683,
+ /* cc */ 0xe8ae8a, 0xe6969b, 0xe6969f, 0xe696ab,
+ /* d0 */ 0xe696b7, 0xe69783, 0xe69786, 0xe69781,
+ /* d4 */ 0xe69784, 0xe6978c, 0xe69792, 0xe6979b,
+ /* d8 */ 0xe69799, 0xe697a0, 0xe697a1, 0xe697b1,
+ /* dc */ 0xe69db2, 0xe6988a, 0xe69883, 0xe697bb,
+ /* e0 */ 0xe69db3, 0xe698b5, 0xe698b6, 0xe698b4,
+ /* e4 */ 0xe6989c, 0xe6998f, 0xe69984, 0xe69989,
+ /* e8 */ 0xe69981, 0xe6999e, 0xe6999d, 0xe699a4,
+ /* ec */ 0xe699a7, 0xe699a8, 0xe6999f, 0xe699a2,
+ /* f0 */ 0xe699b0, 0xe69a83, 0xe69a88, 0xe69a8e,
+ /* f4 */ 0xe69a89, 0xe69a84, 0xe69a98, 0xe69a9d,
+ /* f8 */ 0xe69b81, 0xe69ab9, 0xe69b89, 0xe69abe,
+ /* fc */ 0xe69abc,
+
+ /*** Two byte table, leaf: 9exx - offset 0x01508 ***/
+
+ /* 40 */ 0xe69b84, 0xe69ab8, 0xe69b96, 0xe69b9a,
+ /* 44 */ 0xe69ba0, 0xe698bf, 0xe69ba6, 0xe69ba9,
+ /* 48 */ 0xe69bb0, 0xe69bb5, 0xe69bb7, 0xe69c8f,
+ /* 4c */ 0xe69c96, 0xe69c9e, 0xe69ca6, 0xe69ca7,
+ /* 50 */ 0xe99cb8, 0xe69cae, 0xe69cbf, 0xe69cb6,
+ /* 54 */ 0xe69d81, 0xe69cb8, 0xe69cb7, 0xe69d86,
+ /* 58 */ 0xe69d9e, 0xe69da0, 0xe69d99, 0xe69da3,
+ /* 5c */ 0xe69da4, 0xe69e89, 0xe69db0, 0xe69ea9,
+ /* 60 */ 0xe69dbc, 0xe69daa, 0xe69e8c, 0xe69e8b,
+ /* 64 */ 0xe69ea6, 0xe69ea1, 0xe69e85, 0xe69eb7,
+ /* 68 */ 0xe69faf, 0xe69eb4, 0xe69fac, 0xe69eb3,
+ /* 6c */ 0xe69fa9, 0xe69eb8, 0xe69fa4, 0xe69f9e,
+ /* 70 */ 0xe69f9d, 0xe69fa2, 0xe69fae, 0xe69eb9,
+ /* 74 */ 0xe69f8e, 0xe69f86, 0xe69fa7, 0xe6aa9c,
+ /* 78 */ 0xe6a09e, 0xe6a186, 0xe6a0a9, 0xe6a180,
+ /* 7c */ 0xe6a18d, 0xe6a0b2, 0xe6a18e, 0x000000,
+ /* 80 */ 0xe6a2b3, 0xe6a0ab, 0xe6a199, 0xe6a1a3,
+ /* 84 */ 0xe6a1b7, 0xe6a1bf, 0xe6a29f, 0xe6a28f,
+ /* 88 */ 0xe6a2ad, 0xe6a294, 0xe6a29d, 0xe6a29b,
+ /* 8c */ 0xe6a283, 0xe6aaae, 0xe6a2b9, 0xe6a1b4,
+ /* 90 */ 0xe6a2b5, 0xe6a2a0, 0xe6a2ba, 0xe6a48f,
+ /* 94 */ 0xe6a28d, 0xe6a1be, 0xe6a481, 0xe6a38a,
+ /* 98 */ 0xe6a488, 0xe6a398, 0xe6a4a2, 0xe6a4a6,
+ /* 9c */ 0xe6a3a1, 0xe6a48c, 0xe6a38d, 0xe6a394,
+ /* a0 */ 0xe6a3a7, 0xe6a395, 0xe6a4b6, 0xe6a492,
+ /* a4 */ 0xe6a484, 0xe6a397, 0xe6a3a3, 0xe6a4a5,
+ /* a8 */ 0xe6a3b9, 0xe6a3a0, 0xe6a3af, 0xe6a4a8,
+ /* ac */ 0xe6a4aa, 0xe6a49a, 0xe6a4a3, 0xe6a4a1,
+ /* b0 */ 0xe6a386, 0xe6a5b9, 0xe6a5b7, 0xe6a59c,
+ /* b4 */ 0xe6a5b8, 0xe6a5ab, 0xe6a594, 0xe6a5be,
+ /* b8 */ 0xe6a5ae, 0xe6a4b9, 0xe6a5b4, 0xe6a4bd,
+ /* bc */ 0xe6a599, 0xe6a4b0, 0xe6a5a1, 0xe6a59e,
+ /* c0 */ 0xe6a59d, 0xe6a681, 0xe6a5aa, 0xe6a6b2,
+ /* c4 */ 0xe6a6ae, 0xe6a790, 0xe6a6bf, 0xe6a781,
+ /* c8 */ 0xe6a793, 0xe6a6be, 0xe6a78e, 0xe5afa8,
+ /* cc */ 0xe6a78a, 0xe6a79d, 0xe6a6bb, 0xe6a783,
+ /* d0 */ 0xe6a6a7, 0xe6a8ae, 0xe6a691, 0xe6a6a0,
+ /* d4 */ 0xe6a69c, 0xe6a695, 0xe6a6b4, 0xe6a79e,
+ /* d8 */ 0xe6a7a8, 0xe6a882, 0xe6a89b, 0xe6a7bf,
+ /* dc */ 0xe6ac8a, 0xe6a7b9, 0xe6a7b2, 0xe6a7a7,
+ /* e0 */ 0xe6a885, 0xe6a6b1, 0xe6a89e, 0xe6a7ad,
+ /* e4 */ 0xe6a894, 0xe6a7ab, 0xe6a88a, 0xe6a892,
+ /* e8 */ 0xe6ab81, 0xe6a8a3, 0xe6a893, 0xe6a984,
+ /* ec */ 0xe6a88c, 0xe6a9b2, 0xe6a8b6, 0xe6a9b8,
+ /* f0 */ 0xe6a987, 0xe6a9a2, 0xe6a999, 0xe6a9a6,
+ /* f4 */ 0xe6a988, 0xe6a8b8, 0xe6a8a2, 0xe6aa90,
+ /* f8 */ 0xe6aa8d, 0xe6aaa0, 0xe6aa84, 0xe6aaa2,
+ /* fc */ 0xe6aaa3,
+
+ /*** Two byte table, leaf: 9fxx - offset 0x015c5 ***/
+
+ /* 40 */ 0xe6aa97, 0xe89897, 0xe6aabb, 0xe6ab83,
+ /* 44 */ 0xe6ab82, 0xe6aab8, 0xe6aab3, 0xe6aaac,
+ /* 48 */ 0xe6ab9e, 0xe6ab91, 0xe6ab9f, 0xe6aaaa,
+ /* 4c */ 0xe6ab9a, 0xe6abaa, 0xe6abbb, 0xe6ac85,
+ /* 50 */ 0xe89896, 0xe6abba, 0xe6ac92, 0xe6ac96,
+ /* 54 */ 0xe9acb1, 0xe6ac9f, 0xe6acb8, 0xe6acb7,
+ /* 58 */ 0xe79b9c, 0xe6acb9, 0xe9a3ae, 0xe6ad87,
+ /* 5c */ 0xe6ad83, 0xe6ad89, 0xe6ad90, 0xe6ad99,
+ /* 60 */ 0xe6ad94, 0xe6ad9b, 0xe6ad9f, 0xe6ada1,
+ /* 64 */ 0xe6adb8, 0xe6adb9, 0xe6adbf, 0xe6ae80,
+ /* 68 */ 0xe6ae84, 0xe6ae83, 0xe6ae8d, 0xe6ae98,
+ /* 6c */ 0xe6ae95, 0xe6ae9e, 0xe6aea4, 0xe6aeaa,
+ /* 70 */ 0xe6aeab, 0xe6aeaf, 0xe6aeb2, 0xe6aeb1,
+ /* 74 */ 0xe6aeb3, 0xe6aeb7, 0xe6aebc, 0xe6af86,
+ /* 78 */ 0xe6af8b, 0xe6af93, 0xe6af9f, 0xe6afac,
+ /* 7c */ 0xe6afab, 0xe6afb3, 0xe6afaf, 0x000000,
+ /* 80 */ 0xe9babe, 0xe6b088, 0xe6b093, 0xe6b094,
+ /* 84 */ 0xe6b09b, 0xe6b0a4, 0xe6b0a3, 0xe6b19e,
+ /* 88 */ 0xe6b195, 0xe6b1a2, 0xe6b1aa, 0xe6b282,
+ /* 8c */ 0xe6b28d, 0xe6b29a, 0xe6b281, 0xe6b29b,
+ /* 90 */ 0xe6b1be, 0xe6b1a8, 0xe6b1b3, 0xe6b292,
+ /* 94 */ 0xe6b290, 0xe6b384, 0xe6b3b1, 0xe6b393,
+ /* 98 */ 0xe6b2bd, 0xe6b397, 0xe6b385, 0xe6b39d,
+ /* 9c */ 0xe6b2ae, 0xe6b2b1, 0xe6b2be, 0xe6b2ba,
+ /* a0 */ 0xe6b39b, 0xe6b3af, 0xe6b399, 0xe6b3aa,
+ /* a4 */ 0xe6b49f, 0xe8a18d, 0xe6b4b6, 0xe6b4ab,
+ /* a8 */ 0xe6b4bd, 0xe6b4b8, 0xe6b499, 0xe6b4b5,
+ /* ac */ 0xe6b4b3, 0xe6b492, 0xe6b48c, 0xe6b5a3,
+ /* b0 */ 0xe6b693, 0xe6b5a4, 0xe6b59a, 0xe6b5b9,
+ /* b4 */ 0xe6b599, 0xe6b68e, 0xe6b695, 0xe6bfa4,
+ /* b8 */ 0xe6b685, 0xe6b7b9, 0xe6b895, 0xe6b88a,
+ /* bc */ 0xe6b6b5, 0xe6b787, 0xe6b7a6, 0xe6b6b8,
+ /* c0 */ 0xe6b786, 0xe6b7ac, 0xe6b79e, 0xe6b78c,
+ /* c4 */ 0xe6b7a8, 0xe6b792, 0xe6b785, 0xe6b7ba,
+ /* c8 */ 0xe6b799, 0xe6b7a4, 0xe6b795, 0xe6b7aa,
+ /* cc */ 0xe6b7ae, 0xe6b8ad, 0xe6b9ae, 0xe6b8ae,
+ /* d0 */ 0xe6b899, 0xe6b9b2, 0xe6b99f, 0xe6b8be,
+ /* d4 */ 0xe6b8a3, 0xe6b9ab, 0xe6b8ab, 0xe6b9b6,
+ /* d8 */ 0xe6b98d, 0xe6b89f, 0xe6b983, 0xe6b8ba,
+ /* dc */ 0xe6b98e, 0xe6b8a4, 0xe6bbbf, 0xe6b89d,
+ /* e0 */ 0xe6b8b8, 0xe6ba82, 0xe6baaa, 0xe6ba98,
+ /* e4 */ 0xe6bb89, 0xe6bab7, 0xe6bb93, 0xe6babd,
+ /* e8 */ 0xe6baaf, 0xe6bb84, 0xe6bab2, 0xe6bb94,
+ /* ec */ 0xe6bb95, 0xe6ba8f, 0xe6baa5, 0xe6bb82,
+ /* f0 */ 0xe6ba9f, 0xe6bd81, 0xe6bc91, 0xe7818c,
+ /* f4 */ 0xe6bbac, 0xe6bbb8, 0xe6bbbe, 0xe6bcbf,
+ /* f8 */ 0xe6bbb2, 0xe6bcb1, 0xe6bbaf, 0xe6bcb2,
+ /* fc */ 0xe6bb8c,
+
+ /*** Two byte table, leaf: e0xx - offset 0x01682 ***/
+
+ /* 40 */ 0xe6bcbe, 0xe6bc93, 0xe6bbb7, 0xe6be86,
+ /* 44 */ 0xe6bdba, 0xe6bdb8, 0xe6be81, 0xe6be80,
+ /* 48 */ 0xe6bdaf, 0xe6bd9b, 0xe6bfb3, 0xe6bdad,
+ /* 4c */ 0xe6be82, 0xe6bdbc, 0xe6bd98, 0xe6be8e,
+ /* 50 */ 0xe6be91, 0xe6bf82, 0xe6bda6, 0xe6beb3,
+ /* 54 */ 0xe6bea3, 0xe6bea1, 0xe6bea4, 0xe6beb9,
+ /* 58 */ 0xe6bf86, 0xe6beaa, 0xe6bf9f, 0xe6bf95,
+ /* 5c */ 0xe6bfac, 0xe6bf94, 0xe6bf98, 0xe6bfb1,
+ /* 60 */ 0xe6bfae, 0xe6bf9b, 0xe78089, 0xe7808b,
+ /* 64 */ 0xe6bfba, 0xe78091, 0xe78081, 0xe7808f,
+ /* 68 */ 0xe6bfbe, 0xe7809b, 0xe7809a, 0xe6bdb4,
+ /* 6c */ 0xe7809d, 0xe78098, 0xe7809f, 0xe780b0,
+ /* 70 */ 0xe780be, 0xe780b2, 0xe78191, 0xe781a3,
+ /* 74 */ 0xe78299, 0xe78292, 0xe782af, 0xe783b1,
+ /* 78 */ 0xe782ac, 0xe782b8, 0xe782b3, 0xe782ae,
+ /* 7c */ 0xe7839f, 0xe7838b, 0xe7839d, 0x000000,
+ /* 80 */ 0xe78399, 0xe78489, 0xe783bd, 0xe7849c,
+ /* 84 */ 0xe78499, 0xe785a5, 0xe78595, 0xe78688,
+ /* 88 */ 0xe785a6, 0xe785a2, 0xe7858c, 0xe78596,
+ /* 8c */ 0xe785ac, 0xe7868f, 0xe787bb, 0xe78684,
+ /* 90 */ 0xe78695, 0xe786a8, 0xe786ac, 0xe78797,
+ /* 94 */ 0xe786b9, 0xe786be, 0xe78792, 0xe78789,
+ /* 98 */ 0xe78794, 0xe7878e, 0xe787a0, 0xe787ac,
+ /* 9c */ 0xe787a7, 0xe787b5, 0xe787bc, 0xe787b9,
+ /* a0 */ 0xe787bf, 0xe7888d, 0xe78890, 0xe7889b,
+ /* a4 */ 0xe788a8, 0xe788ad, 0xe788ac, 0xe788b0,
+ /* a8 */ 0xe788b2, 0xe788bb, 0xe788bc, 0xe788bf,
+ /* ac */ 0xe78980, 0xe78986, 0xe7898b, 0xe78998,
+ /* b0 */ 0xe789b4, 0xe789be, 0xe78a82, 0xe78a81,
+ /* b4 */ 0xe78a87, 0xe78a92, 0xe78a96, 0xe78aa2,
+ /* b8 */ 0xe78aa7, 0xe78ab9, 0xe78ab2, 0xe78b83,
+ /* bc */ 0xe78b86, 0xe78b84, 0xe78b8e, 0xe78b92,
+ /* c0 */ 0xe78ba2, 0xe78ba0, 0xe78ba1, 0xe78bb9,
+ /* c4 */ 0xe78bb7, 0xe5808f, 0xe78c97, 0xe78c8a,
+ /* c8 */ 0xe78c9c, 0xe78c96, 0xe78c9d, 0xe78cb4,
+ /* cc */ 0xe78caf, 0xe78ca9, 0xe78ca5, 0xe78cbe,
+ /* d0 */ 0xe78d8e, 0xe78d8f, 0xe9bb98, 0xe78d97,
+ /* d4 */ 0xe78daa, 0xe78da8, 0xe78db0, 0xe78db8,
+ /* d8 */ 0xe78db5, 0xe78dbb, 0xe78dba, 0xe78f88,
+ /* dc */ 0xe78eb3, 0xe78f8e, 0xe78ebb, 0xe78f80,
+ /* e0 */ 0xe78fa5, 0xe78fae, 0xe78f9e, 0xe792a2,
+ /* e4 */ 0xe79085, 0xe791af, 0xe790a5, 0xe78fb8,
+ /* e8 */ 0xe790b2, 0xe790ba, 0xe79195, 0xe790bf,
+ /* ec */ 0xe7919f, 0xe79199, 0xe79181, 0xe7919c,
+ /* f0 */ 0xe791a9, 0xe791b0, 0xe791a3, 0xe791aa,
+ /* f4 */ 0xe791b6, 0xe791be, 0xe7928b, 0xe7929e,
+ /* f8 */ 0xe792a7, 0xe7938a, 0xe7938f, 0xe79394,
+ /* fc */ 0xe78fb1,
+
+ /*** Two byte table, leaf: e1xx - offset 0x0173f ***/
+
+ /* 40 */ 0xe793a0, 0xe793a3, 0xe793a7, 0xe793a9,
+ /* 44 */ 0xe793ae, 0xe793b2, 0xe793b0, 0xe793b1,
+ /* 48 */ 0xe793b8, 0xe793b7, 0xe79484, 0xe79483,
+ /* 4c */ 0xe79485, 0xe7948c, 0xe7948e, 0xe7948d,
+ /* 50 */ 0xe79495, 0xe79493, 0xe7949e, 0xe794a6,
+ /* 54 */ 0xe794ac, 0xe794bc, 0xe79584, 0xe7958d,
+ /* 58 */ 0xe7958a, 0xe79589, 0xe7959b, 0xe79586,
+ /* 5c */ 0xe7959a, 0xe795a9, 0xe795a4, 0xe795a7,
+ /* 60 */ 0xe795ab, 0xe795ad, 0xe795b8, 0xe795b6,
+ /* 64 */ 0xe79686, 0xe79687, 0xe795b4, 0xe7968a,
+ /* 68 */ 0xe79689, 0xe79682, 0xe79694, 0xe7969a,
+ /* 6c */ 0xe7969d, 0xe796a5, 0xe796a3, 0xe79782,
+ /* 70 */ 0xe796b3, 0xe79783, 0xe796b5, 0xe796bd,
+ /* 74 */ 0xe796b8, 0xe796bc, 0xe796b1, 0xe7978d,
+ /* 78 */ 0xe7978a, 0xe79792, 0xe79799, 0xe797a3,
+ /* 7c */ 0xe7979e, 0xe797be, 0xe797bf, 0x000000,
+ /* 80 */ 0xe797bc, 0xe79881, 0xe797b0, 0xe797ba,
+ /* 84 */ 0xe797b2, 0xe797b3, 0xe7988b, 0xe7988d,
+ /* 88 */ 0xe79889, 0xe7989f, 0xe798a7, 0xe798a0,
+ /* 8c */ 0xe798a1, 0xe798a2, 0xe798a4, 0xe798b4,
+ /* 90 */ 0xe798b0, 0xe798bb, 0xe79987, 0xe79988,
+ /* 94 */ 0xe79986, 0xe7999c, 0xe79998, 0xe799a1,
+ /* 98 */ 0xe799a2, 0xe799a8, 0xe799a9, 0xe799aa,
+ /* 9c */ 0xe799a7, 0xe799ac, 0xe799b0, 0xe799b2,
+ /* a0 */ 0xe799b6, 0xe799b8, 0xe799bc, 0xe79a80,
+ /* a4 */ 0xe79a83, 0xe79a88, 0xe79a8b, 0xe79a8e,
+ /* a8 */ 0xe79a96, 0xe79a93, 0xe79a99, 0xe79a9a,
+ /* ac */ 0xe79ab0, 0xe79ab4, 0xe79ab8, 0xe79ab9,
+ /* b0 */ 0xe79aba, 0xe79b82, 0xe79b8d, 0xe79b96,
+ /* b4 */ 0xe79b92, 0xe79b9e, 0xe79ba1, 0xe79ba5,
+ /* b8 */ 0xe79ba7, 0xe79baa, 0xe898af, 0xe79bbb,
+ /* bc */ 0xe79c88, 0xe79c87, 0xe79c84, 0xe79ca9,
+ /* c0 */ 0xe79ca4, 0xe79c9e, 0xe79ca5, 0xe79ca6,
+ /* c4 */ 0xe79c9b, 0xe79cb7, 0xe79cb8, 0xe79d87,
+ /* c8 */ 0xe79d9a, 0xe79da8, 0xe79dab, 0xe79d9b,
+ /* cc */ 0xe79da5, 0xe79dbf, 0xe79dbe, 0xe79db9,
+ /* d0 */ 0xe79e8e, 0xe79e8b, 0xe79e91, 0xe79ea0,
+ /* d4 */ 0xe79e9e, 0xe79eb0, 0xe79eb6, 0xe79eb9,
+ /* d8 */ 0xe79ebf, 0xe79ebc, 0xe79ebd, 0xe79ebb,
+ /* dc */ 0xe79f87, 0xe79f8d, 0xe79f97, 0xe79f9a,
+ /* e0 */ 0xe79f9c, 0xe79fa3, 0xe79fae, 0xe79fbc,
+ /* e4 */ 0xe7a08c, 0xe7a092, 0xe7a4a6, 0xe7a0a0,
+ /* e8 */ 0xe7a4aa, 0xe7a185, 0xe7a28e, 0xe7a1b4,
+ /* ec */ 0xe7a286, 0xe7a1bc, 0xe7a29a, 0xe7a28c,
+ /* f0 */ 0xe7a2a3, 0xe7a2b5, 0xe7a2aa, 0xe7a2af,
+ /* f4 */ 0xe7a391, 0xe7a386, 0xe7a38b, 0xe7a394,
+ /* f8 */ 0xe7a2be, 0xe7a2bc, 0xe7a385, 0xe7a38a,
+ /* fc */ 0xe7a3ac,
+
+ /*** Two byte table, leaf: e2xx - offset 0x017fc ***/
+
+ /* 40 */ 0xe7a3a7, 0xe7a39a, 0xe7a3bd, 0xe7a3b4,
+ /* 44 */ 0xe7a487, 0xe7a492, 0xe7a491, 0xe7a499,
+ /* 48 */ 0xe7a4ac, 0xe7a4ab, 0xe7a580, 0xe7a5a0,
+ /* 4c */ 0xe7a597, 0xe7a59f, 0xe7a59a, 0xe7a595,
+ /* 50 */ 0xe7a593, 0xe7a5ba, 0xe7a5bf, 0xe7a68a,
+ /* 54 */ 0xe7a69d, 0xe7a6a7, 0xe9bd8b, 0xe7a6aa,
+ /* 58 */ 0xe7a6ae, 0xe7a6b3, 0xe7a6b9, 0xe7a6ba,
+ /* 5c */ 0xe7a789, 0xe7a795, 0xe7a7a7, 0xe7a7ac,
+ /* 60 */ 0xe7a7a1, 0xe7a7a3, 0xe7a888, 0xe7a88d,
+ /* 64 */ 0xe7a898, 0xe7a899, 0xe7a8a0, 0xe7a89f,
+ /* 68 */ 0xe7a680, 0xe7a8b1, 0xe7a8bb, 0xe7a8be,
+ /* 6c */ 0xe7a8b7, 0xe7a983, 0xe7a997, 0xe7a989,
+ /* 70 */ 0xe7a9a1, 0xe7a9a2, 0xe7a9a9, 0xe9be9d,
+ /* 74 */ 0xe7a9b0, 0xe7a9b9, 0xe7a9bd, 0xe7aa88,
+ /* 78 */ 0xe7aa97, 0xe7aa95, 0xe7aa98, 0xe7aa96,
+ /* 7c */ 0xe7aaa9, 0xe7ab88, 0xe7aab0, 0x000000,
+ /* 80 */ 0xe7aab6, 0xe7ab85, 0xe7ab84, 0xe7aabf,
+ /* 84 */ 0xe98283, 0xe7ab87, 0xe7ab8a, 0xe7ab8d,
+ /* 88 */ 0xe7ab8f, 0xe7ab95, 0xe7ab93, 0xe7ab99,
+ /* 8c */ 0xe7ab9a, 0xe7ab9d, 0xe7aba1, 0xe7aba2,
+ /* 90 */ 0xe7aba6, 0xe7abad, 0xe7abb0, 0xe7ac82,
+ /* 94 */ 0xe7ac8f, 0xe7ac8a, 0xe7ac86, 0xe7acb3,
+ /* 98 */ 0xe7ac98, 0xe7ac99, 0xe7ac9e, 0xe7acb5,
+ /* 9c */ 0xe7aca8, 0xe7acb6, 0xe7ad90, 0xe7adba,
+ /* a0 */ 0xe7ac84, 0xe7ad8d, 0xe7ac8b, 0xe7ad8c,
+ /* a4 */ 0xe7ad85, 0xe7adb5, 0xe7ada5, 0xe7adb4,
+ /* a8 */ 0xe7ada7, 0xe7adb0, 0xe7adb1, 0xe7adac,
+ /* ac */ 0xe7adae, 0xe7ae9d, 0xe7ae98, 0xe7ae9f,
+ /* b0 */ 0xe7ae8d, 0xe7ae9c, 0xe7ae9a, 0xe7ae8b,
+ /* b4 */ 0xe7ae92, 0xe7ae8f, 0xe7ad9d, 0xe7ae99,
+ /* b8 */ 0xe7af8b, 0xe7af81, 0xe7af8c, 0xe7af8f,
+ /* bc */ 0xe7aeb4, 0xe7af86, 0xe7af9d, 0xe7afa9,
+ /* c0 */ 0xe7b091, 0xe7b094, 0xe7afa6, 0xe7afa5,
+ /* c4 */ 0xe7b1a0, 0xe7b080, 0xe7b087, 0xe7b093,
+ /* c8 */ 0xe7afb3, 0xe7afb7, 0xe7b097, 0xe7b08d,
+ /* cc */ 0xe7afb6, 0xe7b0a3, 0xe7b0a7, 0xe7b0aa,
+ /* d0 */ 0xe7b09f, 0xe7b0b7, 0xe7b0ab, 0xe7b0bd,
+ /* d4 */ 0xe7b18c, 0xe7b183, 0xe7b194, 0xe7b18f,
+ /* d8 */ 0xe7b180, 0xe7b190, 0xe7b198, 0xe7b19f,
+ /* dc */ 0xe7b1a4, 0xe7b196, 0xe7b1a5, 0xe7b1ac,
+ /* e0 */ 0xe7b1b5, 0xe7b283, 0xe7b290, 0xe7b2a4,
+ /* e4 */ 0xe7b2ad, 0xe7b2a2, 0xe7b2ab, 0xe7b2a1,
+ /* e8 */ 0xe7b2a8, 0xe7b2b3, 0xe7b2b2, 0xe7b2b1,
+ /* ec */ 0xe7b2ae, 0xe7b2b9, 0xe7b2bd, 0xe7b380,
+ /* f0 */ 0xe7b385, 0xe7b382, 0xe7b398, 0xe7b392,
+ /* f4 */ 0xe7b39c, 0xe7b3a2, 0xe9acbb, 0xe7b3af,
+ /* f8 */ 0xe7b3b2, 0xe7b3b4, 0xe7b3b6, 0xe7b3ba,
+ /* fc */ 0xe7b486,
+
+ /*** Two byte table, leaf: e3xx - offset 0x018b9 ***/
+
+ /* 40 */ 0xe7b482, 0xe7b49c, 0xe7b495, 0xe7b48a,
+ /* 44 */ 0xe7b585, 0xe7b58b, 0xe7b4ae, 0xe7b4b2,
+ /* 48 */ 0xe7b4bf, 0xe7b4b5, 0xe7b586, 0xe7b5b3,
+ /* 4c */ 0xe7b596, 0xe7b58e, 0xe7b5b2, 0xe7b5a8,
+ /* 50 */ 0xe7b5ae, 0xe7b58f, 0xe7b5a3, 0xe7b693,
+ /* 54 */ 0xe7b689, 0xe7b59b, 0xe7b68f, 0xe7b5bd,
+ /* 58 */ 0xe7b69b, 0xe7b6ba, 0xe7b6ae, 0xe7b6a3,
+ /* 5c */ 0xe7b6b5, 0xe7b787, 0xe7b6bd, 0xe7b6ab,
+ /* 60 */ 0xe7b8bd, 0xe7b6a2, 0xe7b6af, 0xe7b79c,
+ /* 64 */ 0xe7b6b8, 0xe7b69f, 0xe7b6b0, 0xe7b798,
+ /* 68 */ 0xe7b79d, 0xe7b7a4, 0xe7b79e, 0xe7b7bb,
+ /* 6c */ 0xe7b7b2, 0xe7b7a1, 0xe7b885, 0xe7b88a,
+ /* 70 */ 0xe7b8a3, 0xe7b8a1, 0xe7b892, 0xe7b8b1,
+ /* 74 */ 0xe7b89f, 0xe7b889, 0xe7b88b, 0xe7b8a2,
+ /* 78 */ 0xe7b986, 0xe7b9a6, 0xe7b8bb, 0xe7b8b5,
+ /* 7c */ 0xe7b8b9, 0xe7b983, 0xe7b8b7, 0x000000,
+ /* 80 */ 0xe7b8b2, 0xe7b8ba, 0xe7b9a7, 0xe7b99d,
+ /* 84 */ 0xe7b996, 0xe7b99e, 0xe7b999, 0xe7b99a,
+ /* 88 */ 0xe7b9b9, 0xe7b9aa, 0xe7b9a9, 0xe7b9bc,
+ /* 8c */ 0xe7b9bb, 0xe7ba83, 0xe7b795, 0xe7b9bd,
+ /* 90 */ 0xe8beae, 0xe7b9bf, 0xe7ba88, 0xe7ba89,
+ /* 94 */ 0xe7ba8c, 0xe7ba92, 0xe7ba90, 0xe7ba93,
+ /* 98 */ 0xe7ba94, 0xe7ba96, 0xe7ba8e, 0xe7ba9b,
+ /* 9c */ 0xe7ba9c, 0xe7bcb8, 0xe7bcba, 0xe7bd85,
+ /* a0 */ 0xe7bd8c, 0xe7bd8d, 0xe7bd8e, 0xe7bd90,
+ /* a4 */ 0xe7bd91, 0xe7bd95, 0xe7bd94, 0xe7bd98,
+ /* a8 */ 0xe7bd9f, 0xe7bda0, 0xe7bda8, 0xe7bda9,
+ /* ac */ 0xe7bda7, 0xe7bdb8, 0xe7be82, 0xe7be86,
+ /* b0 */ 0xe7be83, 0xe7be88, 0xe7be87, 0xe7be8c,
+ /* b4 */ 0xe7be94, 0xe7be9e, 0xe7be9d, 0xe7be9a,
+ /* b8 */ 0xe7bea3, 0xe7beaf, 0xe7beb2, 0xe7beb9,
+ /* bc */ 0xe7beae, 0xe7beb6, 0xe7beb8, 0xe8adb1,
+ /* c0 */ 0xe7bf85, 0xe7bf86, 0xe7bf8a, 0xe7bf95,
+ /* c4 */ 0xe7bf94, 0xe7bfa1, 0xe7bfa6, 0xe7bfa9,
+ /* c8 */ 0xe7bfb3, 0xe7bfb9, 0xe9a39c, 0xe88086,
+ /* cc */ 0xe88084, 0xe8808b, 0xe88092, 0xe88098,
+ /* d0 */ 0xe88099, 0xe8809c, 0xe880a1, 0xe880a8,
+ /* d4 */ 0xe880bf, 0xe880bb, 0xe8818a, 0xe88186,
+ /* d8 */ 0xe88192, 0xe88198, 0xe8819a, 0xe8819f,
+ /* dc */ 0xe881a2, 0xe881a8, 0xe881b3, 0xe881b2,
+ /* e0 */ 0xe881b0, 0xe881b6, 0xe881b9, 0xe881bd,
+ /* e4 */ 0xe881bf, 0xe88284, 0xe88286, 0xe88285,
+ /* e8 */ 0xe8829b, 0xe88293, 0xe8829a, 0xe882ad,
+ /* ec */ 0xe58690, 0xe882ac, 0xe8839b, 0xe883a5,
+ /* f0 */ 0xe88399, 0xe8839d, 0xe88384, 0xe8839a,
+ /* f4 */ 0xe88396, 0xe88489, 0xe883af, 0xe883b1,
+ /* f8 */ 0xe8849b, 0xe884a9, 0xe884a3, 0xe884af,
+ /* fc */ 0xe8858b,
+
+ /*** Two byte table, leaf: e4xx - offset 0x01976 ***/
+
+ /* 40 */ 0xe99a8b, 0xe88586, 0xe884be, 0xe88593,
+ /* 44 */ 0xe88591, 0xe883bc, 0xe885b1, 0xe885ae,
+ /* 48 */ 0xe885a5, 0xe885a6, 0xe885b4, 0xe88683,
+ /* 4c */ 0xe88688, 0xe8868a, 0xe88680, 0xe88682,
+ /* 50 */ 0xe886a0, 0xe88695, 0xe886a4, 0xe886a3,
+ /* 54 */ 0xe8859f, 0xe88693, 0xe886a9, 0xe886b0,
+ /* 58 */ 0xe886b5, 0xe886be, 0xe886b8, 0xe886bd,
+ /* 5c */ 0xe88780, 0xe88782, 0xe886ba, 0xe88789,
+ /* 60 */ 0xe8878d, 0xe88791, 0xe88799, 0xe88798,
+ /* 64 */ 0xe88788, 0xe8879a, 0xe8879f, 0xe887a0,
+ /* 68 */ 0xe887a7, 0xe887ba, 0xe887bb, 0xe887be,
+ /* 6c */ 0xe88881, 0xe88882, 0xe88885, 0xe88887,
+ /* 70 */ 0xe8888a, 0xe8888d, 0xe88890, 0xe88896,
+ /* 74 */ 0xe888a9, 0xe888ab, 0xe888b8, 0xe888b3,
+ /* 78 */ 0xe88980, 0xe88999, 0xe88998, 0xe8899d,
+ /* 7c */ 0xe8899a, 0xe8899f, 0xe889a4, 0x000000,
+ /* 80 */ 0xe889a2, 0xe889a8, 0xe889aa, 0xe889ab,
+ /* 84 */ 0xe888ae, 0xe889b1, 0xe889b7, 0xe889b8,
+ /* 88 */ 0xe889be, 0xe88a8d, 0xe88a92, 0xe88aab,
+ /* 8c */ 0xe88a9f, 0xe88abb, 0xe88aac, 0xe88ba1,
+ /* 90 */ 0xe88ba3, 0xe88b9f, 0xe88b92, 0xe88bb4,
+ /* 94 */ 0xe88bb3, 0xe88bba, 0xe88e93, 0xe88c83,
+ /* 98 */ 0xe88bbb, 0xe88bb9, 0xe88b9e, 0xe88c86,
+ /* 9c */ 0xe88b9c, 0xe88c89, 0xe88b99, 0xe88cb5,
+ /* a0 */ 0xe88cb4, 0xe88c96, 0xe88cb2, 0xe88cb1,
+ /* a4 */ 0xe88d80, 0xe88cb9, 0xe88d90, 0xe88d85,
+ /* a8 */ 0xe88caf, 0xe88cab, 0xe88c97, 0xe88c98,
+ /* ac */ 0xe88e85, 0xe88e9a, 0xe88eaa, 0xe88e9f,
+ /* b0 */ 0xe88ea2, 0xe88e96, 0xe88ca3, 0xe88e8e,
+ /* b4 */ 0xe88e87, 0xe88e8a, 0xe88dbc, 0xe88eb5,
+ /* b8 */ 0xe88db3, 0xe88db5, 0xe88ea0, 0xe88e89,
+ /* bc */ 0xe88ea8, 0xe88fb4, 0xe89093, 0xe88fab,
+ /* c0 */ 0xe88f8e, 0xe88fbd, 0xe89083, 0xe88f98,
+ /* c4 */ 0xe8908b, 0xe88f81, 0xe88fb7, 0xe89087,
+ /* c8 */ 0xe88fa0, 0xe88fb2, 0xe8908d, 0xe890a2,
+ /* cc */ 0xe890a0, 0xe88ebd, 0xe890b8, 0xe89486,
+ /* d0 */ 0xe88fbb, 0xe891ad, 0xe890aa, 0xe890bc,
+ /* d4 */ 0xe8959a, 0xe89284, 0xe891b7, 0xe891ab,
+ /* d8 */ 0xe892ad, 0xe891ae, 0xe89282, 0xe891a9,
+ /* dc */ 0xe89186, 0xe890ac, 0xe891af, 0xe891b9,
+ /* e0 */ 0xe890b5, 0xe8938a, 0xe891a2, 0xe892b9,
+ /* e4 */ 0xe892bf, 0xe8929f, 0xe89399, 0xe8938d,
+ /* e8 */ 0xe892bb, 0xe8939a, 0xe89390, 0xe89381,
+ /* ec */ 0xe89386, 0xe89396, 0xe892a1, 0xe894a1,
+ /* f0 */ 0xe893bf, 0xe893b4, 0xe89497, 0xe89498,
+ /* f4 */ 0xe894ac, 0xe8949f, 0xe89495, 0xe89494,
+ /* f8 */ 0xe893bc, 0xe89580, 0xe895a3, 0xe89598,
+ /* fc */ 0xe89588,
+
+ /*** Two byte table, leaf: e5xx - offset 0x01a33 ***/
+
+ /* 40 */ 0xe89581, 0xe89882, 0xe8958b, 0xe89595,
+ /* 44 */ 0xe89680, 0xe896a4, 0xe89688, 0xe89691,
+ /* 48 */ 0xe8968a, 0xe896a8, 0xe895ad, 0xe89694,
+ /* 4c */ 0xe8969b, 0xe897aa, 0xe89687, 0xe8969c,
+ /* 50 */ 0xe895b7, 0xe895be, 0xe89690, 0xe89789,
+ /* 54 */ 0xe896ba, 0xe8978f, 0xe896b9, 0xe89790,
+ /* 58 */ 0xe89795, 0xe8979d, 0xe897a5, 0xe8979c,
+ /* 5c */ 0xe897b9, 0xe8988a, 0xe89893, 0xe8988b,
+ /* 60 */ 0xe897be, 0xe897ba, 0xe89886, 0xe898a2,
+ /* 64 */ 0xe8989a, 0xe898b0, 0xe898bf, 0xe8998d,
+ /* 68 */ 0xe4b995, 0xe89994, 0xe8999f, 0xe899a7,
+ /* 6c */ 0xe899b1, 0xe89a93, 0xe89aa3, 0xe89aa9,
+ /* 70 */ 0xe89aaa, 0xe89a8b, 0xe89a8c, 0xe89ab6,
+ /* 74 */ 0xe89aaf, 0xe89b84, 0xe89b86, 0xe89ab0,
+ /* 78 */ 0xe89b89, 0xe8a0a3, 0xe89aab, 0xe89b94,
+ /* 7c */ 0xe89b9e, 0xe89ba9, 0xe89bac, 0x000000,
+ /* 80 */ 0xe89b9f, 0xe89b9b, 0xe89baf, 0xe89c92,
+ /* 84 */ 0xe89c86, 0xe89c88, 0xe89c80, 0xe89c83,
+ /* 88 */ 0xe89bbb, 0xe89c91, 0xe89c89, 0xe89c8d,
+ /* 8c */ 0xe89bb9, 0xe89c8a, 0xe89cb4, 0xe89cbf,
+ /* 90 */ 0xe89cb7, 0xe89cbb, 0xe89ca5, 0xe89ca9,
+ /* 94 */ 0xe89c9a, 0xe89da0, 0xe89d9f, 0xe89db8,
+ /* 98 */ 0xe89d8c, 0xe89d8e, 0xe89db4, 0xe89d97,
+ /* 9c */ 0xe89da8, 0xe89dae, 0xe89d99, 0xe89d93,
+ /* a0 */ 0xe89da3, 0xe89daa, 0xe8a085, 0xe89ea2,
+ /* a4 */ 0xe89e9f, 0xe89e82, 0xe89eaf, 0xe89f8b,
+ /* a8 */ 0xe89ebd, 0xe89f80, 0xe89f90, 0xe99b96,
+ /* ac */ 0xe89eab, 0xe89f84, 0xe89eb3, 0xe89f87,
+ /* b0 */ 0xe89f86, 0xe89ebb, 0xe89faf, 0xe89fb2,
+ /* b4 */ 0xe89fa0, 0xe8a08f, 0xe8a08d, 0xe89fbe,
+ /* b8 */ 0xe89fb6, 0xe89fb7, 0xe8a08e, 0xe89f92,
+ /* bc */ 0xe8a091, 0xe8a096, 0xe8a095, 0xe8a0a2,
+ /* c0 */ 0xe8a0a1, 0xe8a0b1, 0xe8a0b6, 0xe8a0b9,
+ /* c4 */ 0xe8a0a7, 0xe8a0bb, 0xe8a184, 0xe8a182,
+ /* c8 */ 0xe8a192, 0xe8a199, 0xe8a19e, 0xe8a1a2,
+ /* cc */ 0xe8a1ab, 0xe8a281, 0xe8a1be, 0xe8a29e,
+ /* d0 */ 0xe8a1b5, 0xe8a1bd, 0xe8a2b5, 0xe8a1b2,
+ /* d4 */ 0xe8a282, 0xe8a297, 0xe8a292, 0xe8a2ae,
+ /* d8 */ 0xe8a299, 0xe8a2a2, 0xe8a28d, 0xe8a2a4,
+ /* dc */ 0xe8a2b0, 0xe8a2bf, 0xe8a2b1, 0xe8a383,
+ /* e0 */ 0xe8a384, 0xe8a394, 0xe8a398, 0xe8a399,
+ /* e4 */ 0xe8a39d, 0xe8a3b9, 0xe8a482, 0xe8a3bc,
+ /* e8 */ 0xe8a3b4, 0xe8a3a8, 0xe8a3b2, 0xe8a484,
+ /* ec */ 0xe8a48c, 0xe8a48a, 0xe8a493, 0xe8a583,
+ /* f0 */ 0xe8a49e, 0xe8a4a5, 0xe8a4aa, 0xe8a4ab,
+ /* f4 */ 0xe8a581, 0xe8a584, 0xe8a4bb, 0xe8a4b6,
+ /* f8 */ 0xe8a4b8, 0xe8a58c, 0xe8a49d, 0xe8a5a0,
+ /* fc */ 0xe8a59e,
+
+ /*** Two byte table, leaf: e6xx - offset 0x01af0 ***/
+
+ /* 40 */ 0xe8a5a6, 0xe8a5a4, 0xe8a5ad, 0xe8a5aa,
+ /* 44 */ 0xe8a5af, 0xe8a5b4, 0xe8a5b7, 0xe8a5be,
+ /* 48 */ 0xe8a683, 0xe8a688, 0xe8a68a, 0xe8a693,
+ /* 4c */ 0xe8a698, 0xe8a6a1, 0xe8a6a9, 0xe8a6a6,
+ /* 50 */ 0xe8a6ac, 0xe8a6af, 0xe8a6b2, 0xe8a6ba,
+ /* 54 */ 0xe8a6bd, 0xe8a6bf, 0xe8a780, 0xe8a79a,
+ /* 58 */ 0xe8a79c, 0xe8a79d, 0xe8a7a7, 0xe8a7b4,
+ /* 5c */ 0xe8a7b8, 0xe8a883, 0xe8a896, 0xe8a890,
+ /* 60 */ 0xe8a88c, 0xe8a89b, 0xe8a89d, 0xe8a8a5,
+ /* 64 */ 0xe8a8b6, 0xe8a981, 0xe8a99b, 0xe8a992,
+ /* 68 */ 0xe8a986, 0xe8a988, 0xe8a9bc, 0xe8a9ad,
+ /* 6c */ 0xe8a9ac, 0xe8a9a2, 0xe8aa85, 0xe8aa82,
+ /* 70 */ 0xe8aa84, 0xe8aaa8, 0xe8aaa1, 0xe8aa91,
+ /* 74 */ 0xe8aaa5, 0xe8aaa6, 0xe8aa9a, 0xe8aaa3,
+ /* 78 */ 0xe8ab84, 0xe8ab8d, 0xe8ab82, 0xe8ab9a,
+ /* 7c */ 0xe8abab, 0xe8abb3, 0xe8aba7, 0x000000,
+ /* 80 */ 0xe8aba4, 0xe8abb1, 0xe8ac94, 0xe8aba0,
+ /* 84 */ 0xe8aba2, 0xe8abb7, 0xe8ab9e, 0xe8ab9b,
+ /* 88 */ 0xe8ac8c, 0xe8ac87, 0xe8ac9a, 0xe8aba1,
+ /* 8c */ 0xe8ac96, 0xe8ac90, 0xe8ac97, 0xe8aca0,
+ /* 90 */ 0xe8acb3, 0xe99eab, 0xe8aca6, 0xe8acab,
+ /* 94 */ 0xe8acbe, 0xe8aca8, 0xe8ad81, 0xe8ad8c,
+ /* 98 */ 0xe8ad8f, 0xe8ad8e, 0xe8ad89, 0xe8ad96,
+ /* 9c */ 0xe8ad9b, 0xe8ad9a, 0xe8adab, 0xe8ad9f,
+ /* a0 */ 0xe8adac, 0xe8adaf, 0xe8adb4, 0xe8adbd,
+ /* a4 */ 0xe8ae80, 0xe8ae8c, 0xe8ae8e, 0xe8ae92,
+ /* a8 */ 0xe8ae93, 0xe8ae96, 0xe8ae99, 0xe8ae9a,
+ /* ac */ 0xe8b0ba, 0xe8b181, 0xe8b0bf, 0xe8b188,
+ /* b0 */ 0xe8b18c, 0xe8b18e, 0xe8b190, 0xe8b195,
+ /* b4 */ 0xe8b1a2, 0xe8b1ac, 0xe8b1b8, 0xe8b1ba,
+ /* b8 */ 0xe8b282, 0xe8b289, 0xe8b285, 0xe8b28a,
+ /* bc */ 0xe8b28d, 0xe8b28e, 0xe8b294, 0xe8b1bc,
+ /* c0 */ 0xe8b298, 0xe6889d, 0xe8b2ad, 0xe8b2aa,
+ /* c4 */ 0xe8b2bd, 0xe8b2b2, 0xe8b2b3, 0xe8b2ae,
+ /* c8 */ 0xe8b2b6, 0xe8b388, 0xe8b381, 0xe8b3a4,
+ /* cc */ 0xe8b3a3, 0xe8b39a, 0xe8b3bd, 0xe8b3ba,
+ /* d0 */ 0xe8b3bb, 0xe8b484, 0xe8b485, 0xe8b48a,
+ /* d4 */ 0xe8b487, 0xe8b48f, 0xe8b48d, 0xe8b490,
+ /* d8 */ 0xe9bd8e, 0xe8b493, 0xe8b38d, 0xe8b494,
+ /* dc */ 0xe8b496, 0xe8b5a7, 0xe8b5ad, 0xe8b5b1,
+ /* e0 */ 0xe8b5b3, 0xe8b681, 0xe8b699, 0xe8b782,
+ /* e4 */ 0xe8b6be, 0xe8b6ba, 0xe8b78f, 0xe8b79a,
+ /* e8 */ 0xe8b796, 0xe8b78c, 0xe8b79b, 0xe8b78b,
+ /* ec */ 0xe8b7aa, 0xe8b7ab, 0xe8b79f, 0xe8b7a3,
+ /* f0 */ 0xe8b7bc, 0xe8b888, 0xe8b889, 0xe8b7bf,
+ /* f4 */ 0xe8b89d, 0xe8b89e, 0xe8b890, 0xe8b89f,
+ /* f8 */ 0xe8b982, 0xe8b8b5, 0xe8b8b0, 0xe8b8b4,
+ /* fc */ 0xe8b98a,
+
+ /*** Two byte table, leaf: e7xx - offset 0x01bad ***/
+
+ /* 40 */ 0xe8b987, 0xe8b989, 0xe8b98c, 0xe8b990,
+ /* 44 */ 0xe8b988, 0xe8b999, 0xe8b9a4, 0xe8b9a0,
+ /* 48 */ 0xe8b8aa, 0xe8b9a3, 0xe8b995, 0xe8b9b6,
+ /* 4c */ 0xe8b9b2, 0xe8b9bc, 0xe8ba81, 0xe8ba87,
+ /* 50 */ 0xe8ba85, 0xe8ba84, 0xe8ba8b, 0xe8ba8a,
+ /* 54 */ 0xe8ba93, 0xe8ba91, 0xe8ba94, 0xe8ba99,
+ /* 58 */ 0xe8baaa, 0xe8baa1, 0xe8baac, 0xe8bab0,
+ /* 5c */ 0xe8bb86, 0xe8bab1, 0xe8babe, 0xe8bb85,
+ /* 60 */ 0xe8bb88, 0xe8bb8b, 0xe8bb9b, 0xe8bba3,
+ /* 64 */ 0xe8bbbc, 0xe8bbbb, 0xe8bbab, 0xe8bbbe,
+ /* 68 */ 0xe8bc8a, 0xe8bc85, 0xe8bc95, 0xe8bc92,
+ /* 6c */ 0xe8bc99, 0xe8bc93, 0xe8bc9c, 0xe8bc9f,
+ /* 70 */ 0xe8bc9b, 0xe8bc8c, 0xe8bca6, 0xe8bcb3,
+ /* 74 */ 0xe8bcbb, 0xe8bcb9, 0xe8bd85, 0xe8bd82,
+ /* 78 */ 0xe8bcbe, 0xe8bd8c, 0xe8bd89, 0xe8bd86,
+ /* 7c */ 0xe8bd8e, 0xe8bd97, 0xe8bd9c, 0x000000,
+ /* 80 */ 0xe8bda2, 0xe8bda3, 0xe8bda4, 0xe8be9c,
+ /* 84 */ 0xe8be9f, 0xe8bea3, 0xe8bead, 0xe8beaf,
+ /* 88 */ 0xe8beb7, 0xe8bf9a, 0xe8bfa5, 0xe8bfa2,
+ /* 8c */ 0xe8bfaa, 0xe8bfaf, 0xe98287, 0xe8bfb4,
+ /* 90 */ 0xe98085, 0xe8bfb9, 0xe8bfba, 0xe98091,
+ /* 94 */ 0xe98095, 0xe980a1, 0xe9808d, 0xe9809e,
+ /* 98 */ 0xe98096, 0xe9808b, 0xe980a7, 0xe980b6,
+ /* 9c */ 0xe980b5, 0xe980b9, 0xe8bfb8, 0xe9818f,
+ /* a0 */ 0xe98190, 0xe98191, 0xe98192, 0xe9808e,
+ /* a4 */ 0xe98189, 0xe980be, 0xe98196, 0xe98198,
+ /* a8 */ 0xe9819e, 0xe981a8, 0xe981af, 0xe981b6,
+ /* ac */ 0xe99aa8, 0xe981b2, 0xe98282, 0xe981bd,
+ /* b0 */ 0xe98281, 0xe98280, 0xe9828a, 0xe98289,
+ /* b4 */ 0xe9828f, 0xe982a8, 0xe982af, 0xe982b1,
+ /* b8 */ 0xe982b5, 0xe983a2, 0xe983a4, 0xe68988,
+ /* bc */ 0xe9839b, 0xe98482, 0xe98492, 0xe98499,
+ /* c0 */ 0xe984b2, 0xe984b0, 0xe9858a, 0xe98596,
+ /* c4 */ 0xe98598, 0xe985a3, 0xe985a5, 0xe985a9,
+ /* c8 */ 0xe985b3, 0xe985b2, 0xe9868b, 0xe98689,
+ /* cc */ 0xe98682, 0xe986a2, 0xe986ab, 0xe986af,
+ /* d0 */ 0xe986aa, 0xe986b5, 0xe986b4, 0xe986ba,
+ /* d4 */ 0xe98780, 0xe98781, 0xe98789, 0xe9878b,
+ /* d8 */ 0xe98790, 0xe98796, 0xe9879f, 0xe987a1,
+ /* dc */ 0xe9879b, 0xe987bc, 0xe987b5, 0xe987b6,
+ /* e0 */ 0xe9889e, 0xe987bf, 0xe98894, 0xe988ac,
+ /* e4 */ 0xe98895, 0xe98891, 0xe9899e, 0xe98997,
+ /* e8 */ 0xe98985, 0xe98989, 0xe989a4, 0xe98988,
+ /* ec */ 0xe98a95, 0xe988bf, 0xe9898b, 0xe98990,
+ /* f0 */ 0xe98a9c, 0xe98a96, 0xe98a93, 0xe98a9b,
+ /* f4 */ 0xe9899a, 0xe98b8f, 0xe98ab9, 0xe98ab7,
+ /* f8 */ 0xe98ba9, 0xe98c8f, 0xe98bba, 0xe98d84,
+ /* fc */ 0xe98cae,
+
+ /*** Two byte table, leaf: e8xx - offset 0x01c6a ***/
+
+ /* 40 */ 0xe98c99, 0xe98ca2, 0xe98c9a, 0xe98ca3,
+ /* 44 */ 0xe98cba, 0xe98cb5, 0xe98cbb, 0xe98d9c,
+ /* 48 */ 0xe98da0, 0xe98dbc, 0xe98dae, 0xe98d96,
+ /* 4c */ 0xe98eb0, 0xe98eac, 0xe98ead, 0xe98e94,
+ /* 50 */ 0xe98eb9, 0xe98f96, 0xe98f97, 0xe98fa8,
+ /* 54 */ 0xe98fa5, 0xe98f98, 0xe98f83, 0xe98f9d,
+ /* 58 */ 0xe98f90, 0xe98f88, 0xe98fa4, 0xe9909a,
+ /* 5c */ 0xe99094, 0xe99093, 0xe99083, 0xe99087,
+ /* 60 */ 0xe99090, 0xe990b6, 0xe990ab, 0xe990b5,
+ /* 64 */ 0xe990a1, 0xe990ba, 0xe99181, 0xe99192,
+ /* 68 */ 0xe99184, 0xe9919b, 0xe991a0, 0xe991a2,
+ /* 6c */ 0xe9919e, 0xe991aa, 0xe988a9, 0xe991b0,
+ /* 70 */ 0xe991b5, 0xe991b7, 0xe991bd, 0xe9919a,
+ /* 74 */ 0xe991bc, 0xe991be, 0xe99281, 0xe991bf,
+ /* 78 */ 0xe99682, 0xe99687, 0xe9968a, 0xe99694,
+ /* 7c */ 0xe99696, 0xe99698, 0xe99699, 0x000000,
+ /* 80 */ 0xe996a0, 0xe996a8, 0xe996a7, 0xe996ad,
+ /* 84 */ 0xe996bc, 0xe996bb, 0xe996b9, 0xe996be,
+ /* 88 */ 0xe9978a, 0xe6bfb6, 0xe99783, 0xe9978d,
+ /* 8c */ 0xe9978c, 0xe99795, 0xe99794, 0xe99796,
+ /* 90 */ 0xe9979c, 0xe997a1, 0xe997a5, 0xe997a2,
+ /* 94 */ 0xe998a1, 0xe998a8, 0xe998ae, 0xe998af,
+ /* 98 */ 0xe99982, 0xe9998c, 0xe9998f, 0xe9998b,
+ /* 9c */ 0xe999b7, 0xe9999c, 0xe9999e, 0xe9999d,
+ /* a0 */ 0xe9999f, 0xe999a6, 0xe999b2, 0xe999ac,
+ /* a4 */ 0xe99a8d, 0xe99a98, 0xe99a95, 0xe99a97,
+ /* a8 */ 0xe99aaa, 0xe99aa7, 0xe99ab1, 0xe99ab2,
+ /* ac */ 0xe99ab0, 0xe99ab4, 0xe99ab6, 0xe99ab8,
+ /* b0 */ 0xe99ab9, 0xe99b8e, 0xe99b8b, 0xe99b89,
+ /* b4 */ 0xe99b8d, 0xe8a58d, 0xe99b9c, 0xe99c8d,
+ /* b8 */ 0xe99b95, 0xe99bb9, 0xe99c84, 0xe99c86,
+ /* bc */ 0xe99c88, 0xe99c93, 0xe99c8e, 0xe99c91,
+ /* c0 */ 0xe99c8f, 0xe99c96, 0xe99c99, 0xe99ca4,
+ /* c4 */ 0xe99caa, 0xe99cb0, 0xe99cb9, 0xe99cbd,
+ /* c8 */ 0xe99cbe, 0xe99d84, 0xe99d86, 0xe99d88,
+ /* cc */ 0xe99d82, 0xe99d89, 0xe99d9c, 0xe99da0,
+ /* d0 */ 0xe99da4, 0xe99da6, 0xe99da8, 0xe58b92,
+ /* d4 */ 0xe99dab, 0xe99db1, 0xe99db9, 0xe99e85,
+ /* d8 */ 0xe99dbc, 0xe99e81, 0xe99dba, 0xe99e86,
+ /* dc */ 0xe99e8b, 0xe99e8f, 0xe99e90, 0xe99e9c,
+ /* e0 */ 0xe99ea8, 0xe99ea6, 0xe99ea3, 0xe99eb3,
+ /* e4 */ 0xe99eb4, 0xe99f83, 0xe99f86, 0xe99f88,
+ /* e8 */ 0xe99f8b, 0xe99f9c, 0xe99fad, 0xe9bd8f,
+ /* ec */ 0xe99fb2, 0xe7ab9f, 0xe99fb6, 0xe99fb5,
+ /* f0 */ 0xe9a08f, 0xe9a08c, 0xe9a0b8, 0xe9a0a4,
+ /* f4 */ 0xe9a0a1, 0xe9a0b7, 0xe9a0bd, 0xe9a186,
+ /* f8 */ 0xe9a18f, 0xe9a18b, 0xe9a1ab, 0xe9a1af,
+ /* fc */ 0xe9a1b0,
+
+ /*** Two byte table, leaf: e9xx - offset 0x01d27 ***/
+
+ /* 40 */ 0xe9a1b1, 0xe9a1b4, 0xe9a1b3, 0xe9a2aa,
+ /* 44 */ 0xe9a2af, 0xe9a2b1, 0xe9a2b6, 0xe9a384,
+ /* 48 */ 0xe9a383, 0xe9a386, 0xe9a3a9, 0xe9a3ab,
+ /* 4c */ 0xe9a483, 0xe9a489, 0xe9a492, 0xe9a494,
+ /* 50 */ 0xe9a498, 0xe9a4a1, 0xe9a49d, 0xe9a49e,
+ /* 54 */ 0xe9a4a4, 0xe9a4a0, 0xe9a4ac, 0xe9a4ae,
+ /* 58 */ 0xe9a4bd, 0xe9a4be, 0xe9a582, 0xe9a589,
+ /* 5c */ 0xe9a585, 0xe9a590, 0xe9a58b, 0xe9a591,
+ /* 60 */ 0xe9a592, 0xe9a58c, 0xe9a595, 0xe9a697,
+ /* 64 */ 0xe9a698, 0xe9a6a5, 0xe9a6ad, 0xe9a6ae,
+ /* 68 */ 0xe9a6bc, 0xe9a79f, 0xe9a79b, 0xe9a79d,
+ /* 6c */ 0xe9a798, 0xe9a791, 0xe9a7ad, 0xe9a7ae,
+ /* 70 */ 0xe9a7b1, 0xe9a7b2, 0xe9a7bb, 0xe9a7b8,
+ /* 74 */ 0xe9a881, 0xe9a88f, 0xe9a885, 0xe9a7a2,
+ /* 78 */ 0xe9a899, 0xe9a8ab, 0xe9a8b7, 0xe9a985,
+ /* 7c */ 0xe9a982, 0xe9a980, 0xe9a983, 0x000000,
+ /* 80 */ 0xe9a8be, 0xe9a995, 0xe9a98d, 0xe9a99b,
+ /* 84 */ 0xe9a997, 0xe9a99f, 0xe9a9a2, 0xe9a9a5,
+ /* 88 */ 0xe9a9a4, 0xe9a9a9, 0xe9a9ab, 0xe9a9aa,
+ /* 8c */ 0xe9aaad, 0xe9aab0, 0xe9aabc, 0xe9ab80,
+ /* 90 */ 0xe9ab8f, 0xe9ab91, 0xe9ab93, 0xe9ab94,
+ /* 94 */ 0xe9ab9e, 0xe9ab9f, 0xe9aba2, 0xe9aba3,
+ /* 98 */ 0xe9aba6, 0xe9abaf, 0xe9abab, 0xe9abae,
+ /* 9c */ 0xe9abb4, 0xe9abb1, 0xe9abb7, 0xe9abbb,
+ /* a0 */ 0xe9ac86, 0xe9ac98, 0xe9ac9a, 0xe9ac9f,
+ /* a4 */ 0xe9aca2, 0xe9aca3, 0xe9aca5, 0xe9aca7,
+ /* a8 */ 0xe9aca8, 0xe9aca9, 0xe9acaa, 0xe9acae,
+ /* ac */ 0xe9acaf, 0xe9acb2, 0xe9ad84, 0xe9ad83,
+ /* b0 */ 0xe9ad8f, 0xe9ad8d, 0xe9ad8e, 0xe9ad91,
+ /* b4 */ 0xe9ad98, 0xe9adb4, 0xe9ae93, 0xe9ae83,
+ /* b8 */ 0xe9ae91, 0xe9ae96, 0xe9ae97, 0xe9ae9f,
+ /* bc */ 0xe9aea0, 0xe9aea8, 0xe9aeb4, 0xe9af80,
+ /* c0 */ 0xe9af8a, 0xe9aeb9, 0xe9af86, 0xe9af8f,
+ /* c4 */ 0xe9af91, 0xe9af92, 0xe9afa3, 0xe9afa2,
+ /* c8 */ 0xe9afa4, 0xe9af94, 0xe9afa1, 0xe9b0ba,
+ /* cc */ 0xe9afb2, 0xe9afb1, 0xe9afb0, 0xe9b095,
+ /* d0 */ 0xe9b094, 0xe9b089, 0xe9b093, 0xe9b08c,
+ /* d4 */ 0xe9b086, 0xe9b088, 0xe9b092, 0xe9b08a,
+ /* d8 */ 0xe9b084, 0xe9b0ae, 0xe9b09b, 0xe9b0a5,
+ /* dc */ 0xe9b0a4, 0xe9b0a1, 0xe9b0b0, 0xe9b187,
+ /* e0 */ 0xe9b0b2, 0xe9b186, 0xe9b0be, 0xe9b19a,
+ /* e4 */ 0xe9b1a0, 0xe9b1a7, 0xe9b1b6, 0xe9b1b8,
+ /* e8 */ 0xe9b3a7, 0xe9b3ac, 0xe9b3b0, 0xe9b489,
+ /* ec */ 0xe9b488, 0xe9b3ab, 0xe9b483, 0xe9b486,
+ /* f0 */ 0xe9b4aa, 0xe9b4a6, 0xe9b6af, 0xe9b4a3,
+ /* f4 */ 0xe9b49f, 0xe9b584, 0xe9b495, 0xe9b492,
+ /* f8 */ 0xe9b581, 0xe9b4bf, 0xe9b4be, 0xe9b586,
+ /* fc */ 0xe9b588,
+
+ /*** Two byte table, leaf: eaxx - offset 0x01de4 ***/
+
+ /* 40 */ 0xe9b59d, 0xe9b59e, 0xe9b5a4, 0xe9b591,
+ /* 44 */ 0xe9b590, 0xe9b599, 0xe9b5b2, 0xe9b689,
+ /* 48 */ 0xe9b687, 0xe9b6ab, 0xe9b5af, 0xe9b5ba,
+ /* 4c */ 0xe9b69a, 0xe9b6a4, 0xe9b6a9, 0xe9b6b2,
+ /* 50 */ 0xe9b784, 0xe9b781, 0xe9b6bb, 0xe9b6b8,
+ /* 54 */ 0xe9b6ba, 0xe9b786, 0xe9b78f, 0xe9b782,
+ /* 58 */ 0xe9b799, 0xe9b793, 0xe9b7b8, 0xe9b7a6,
+ /* 5c */ 0xe9b7ad, 0xe9b7af, 0xe9b7bd, 0xe9b89a,
+ /* 60 */ 0xe9b89b, 0xe9b89e, 0xe9b9b5, 0xe9b9b9,
+ /* 64 */ 0xe9b9bd, 0xe9ba81, 0xe9ba88, 0xe9ba8b,
+ /* 68 */ 0xe9ba8c, 0xe9ba92, 0xe9ba95, 0xe9ba91,
+ /* 6c */ 0xe9ba9d, 0xe9baa5, 0xe9baa9, 0xe9bab8,
+ /* 70 */ 0xe9baaa, 0xe9baad, 0xe99da1, 0xe9bb8c,
+ /* 74 */ 0xe9bb8e, 0xe9bb8f, 0xe9bb90, 0xe9bb94,
+ /* 78 */ 0xe9bb9c, 0xe9bb9e, 0xe9bb9d, 0xe9bba0,
+ /* 7c */ 0xe9bba5, 0xe9bba8, 0xe9bbaf, 0x000000,
+ /* 80 */ 0xe9bbb4, 0xe9bbb6, 0xe9bbb7, 0xe9bbb9,
+ /* 84 */ 0xe9bbbb, 0xe9bbbc, 0xe9bbbd, 0xe9bc87,
+ /* 88 */ 0xe9bc88, 0xe79ab7, 0xe9bc95, 0xe9bca1,
+ /* 8c */ 0xe9bcac, 0xe9bcbe, 0xe9bd8a, 0xe9bd92,
+ /* 90 */ 0xe9bd94, 0xe9bda3, 0xe9bd9f, 0xe9bda0,
+ /* 94 */ 0xe9bda1, 0xe9bda6, 0xe9bda7, 0xe9bdac,
+ /* 98 */ 0xe9bdaa, 0xe9bdb7, 0xe9bdb2, 0xe9bdb6,
+ /* 9c */ 0xe9be95, 0xe9be9c, 0xe9bea0, 0xe5a0af,
+ /* a0 */ 0xe6a787, 0xe98199, 0xe791a4, 0xe5879c,
+ /* a4 */ 0xe78699, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000,
+
+ /*** Two byte table, leaf: edxx - offset 0x01ea1 ***/
+
+ /* 40 */ 0xe7ba8a, 0xe8a49c, 0xe98d88, 0xe98a88,
+ /* 44 */ 0xe8939c, 0xe4bf89, 0xe782bb, 0xe698b1,
+ /* 48 */ 0xe6a388, 0xe98bb9, 0xe69bbb, 0xe5bd85,
+ /* 4c */ 0xe4b8a8, 0xe4bba1, 0xe4bbbc, 0xe4bc80,
+ /* 50 */ 0xe4bc83, 0xe4bcb9, 0xe4bd96, 0xe4be92,
+ /* 54 */ 0xe4be8a, 0xe4be9a, 0xe4be94, 0xe4bf8d,
+ /* 58 */ 0xe58180, 0xe580a2, 0xe4bfbf, 0xe5809e,
+ /* 5c */ 0xe58186, 0xe581b0, 0xe58182, 0xe58294,
+ /* 60 */ 0xe583b4, 0xe58398, 0xe5858a, 0xe585a4,
+ /* 64 */ 0xe5869d, 0xe586be, 0xe587ac, 0xe58895,
+ /* 68 */ 0xe58a9c, 0xe58aa6, 0xe58b80, 0xe58b9b,
+ /* 6c */ 0xe58c80, 0xe58c87, 0xe58ca4, 0xe58db2,
+ /* 70 */ 0xe58e93, 0xe58eb2, 0xe58f9d, 0xefa88e,
+ /* 74 */ 0xe5929c, 0xe5928a, 0xe592a9, 0xe593bf,
+ /* 78 */ 0xe59686, 0xe59d99, 0xe59da5, 0xe59eac,
+ /* 7c */ 0xe59f88, 0xe59f87, 0xefa88f, 0x000000,
+ /* 80 */ 0xefa890, 0xe5a29e, 0xe5a2b2, 0xe5a48b,
+ /* 84 */ 0xe5a593, 0xe5a59b, 0xe5a59d, 0xe5a5a3,
+ /* 88 */ 0xe5a6a4, 0xe5a6ba, 0xe5ad96, 0xe5af80,
+ /* 8c */ 0xe794af, 0xe5af98, 0xe5afac, 0xe5b09e,
+ /* 90 */ 0xe5b2a6, 0xe5b2ba, 0xe5b3b5, 0xe5b4a7,
+ /* 94 */ 0xe5b593, 0xefa891, 0xe5b582, 0xe5b5ad,
+ /* 98 */ 0xe5b6b8, 0xe5b6b9, 0xe5b790, 0xe5bca1,
+ /* 9c */ 0xe5bcb4, 0xe5bda7, 0xe5beb7, 0xe5bf9e,
+ /* a0 */ 0xe6819d, 0xe68285, 0xe6828a, 0xe6839e,
+ /* a4 */ 0xe68395, 0xe684a0, 0xe683b2, 0xe68491,
+ /* a8 */ 0xe684b7, 0xe684b0, 0xe68698, 0xe68893,
+ /* ac */ 0xe68aa6, 0xe68fb5, 0xe691a0, 0xe6929d,
+ /* b0 */ 0xe6938e, 0xe6958e, 0xe69880, 0xe69895,
+ /* b4 */ 0xe698bb, 0xe69889, 0xe698ae, 0xe6989e,
+ /* b8 */ 0xe698a4, 0xe699a5, 0xe69997, 0xe69999,
+ /* bc */ 0xefa892, 0xe699b3, 0xe69a99, 0xe69aa0,
+ /* c0 */ 0xe69ab2, 0xe69abf, 0xe69bba, 0xe69c8e,
+ /* c4 */ 0xefa4a9, 0xe69da6, 0xe69ebb, 0xe6a192,
+ /* c8 */ 0xe69f80, 0xe6a081, 0xe6a184, 0xe6a38f,
+ /* cc */ 0xefa893, 0xe6a5a8, 0xefa894, 0xe6a698,
+ /* d0 */ 0xe6a7a2, 0xe6a8b0, 0xe6a9ab, 0xe6a986,
+ /* d4 */ 0xe6a9b3, 0xe6a9be, 0xe6aba2, 0xe6aba4,
+ /* d8 */ 0xe6af96, 0xe6b0bf, 0xe6b19c, 0xe6b286,
+ /* dc */ 0xe6b1af, 0xe6b39a, 0xe6b484, 0xe6b687,
+ /* e0 */ 0xe6b5af, 0xe6b696, 0xe6b6ac, 0xe6b78f,
+ /* e4 */ 0xe6b7b8, 0xe6b7b2, 0xe6b7bc, 0xe6b8b9,
+ /* e8 */ 0xe6b99c, 0xe6b8a7, 0xe6b8bc, 0xe6babf,
+ /* ec */ 0xe6be88, 0xe6beb5, 0xe6bfb5, 0xe78085,
+ /* f0 */ 0xe78087, 0xe780a8, 0xe78285, 0xe782ab,
+ /* f4 */ 0xe7848f, 0xe78484, 0xe7859c, 0xe78586,
+ /* f8 */ 0xe78587, 0xefa895, 0xe78781, 0xe787be,
+ /* fc */ 0xe78ab1,
+
+ /*** Two byte table, leaf: eexx - offset 0x01f5e ***/
+
+ /* 40 */ 0xe78abe, 0xe78ca4, 0xefa896, 0xe78db7,
+ /* 44 */ 0xe78ebd, 0xe78f89, 0xe78f96, 0xe78fa3,
+ /* 48 */ 0xe78f92, 0xe79087, 0xe78fb5, 0xe790a6,
+ /* 4c */ 0xe790aa, 0xe790a9, 0xe790ae, 0xe791a2,
+ /* 50 */ 0xe79289, 0xe7929f, 0xe79481, 0xe795af,
+ /* 54 */ 0xe79a82, 0xe79a9c, 0xe79a9e, 0xe79a9b,
+ /* 58 */ 0xe79aa6, 0xefa897, 0xe79d86, 0xe58aaf,
+ /* 5c */ 0xe7a0a1, 0xe7a18e, 0xe7a1a4, 0xe7a1ba,
+ /* 60 */ 0xe7a4b0, 0xefa898, 0xefa899, 0xefa89a,
+ /* 64 */ 0xe7a694, 0xefa89b, 0xe7a69b, 0xe7ab91,
+ /* 68 */ 0xe7aba7, 0xefa89c, 0xe7abab, 0xe7ae9e,
+ /* 6c */ 0xefa89d, 0xe7b588, 0xe7b59c, 0xe7b6b7,
+ /* 70 */ 0xe7b6a0, 0xe7b796, 0xe7b992, 0xe7bd87,
+ /* 74 */ 0xe7bea1, 0xefa89e, 0xe88c81, 0xe88da2,
+ /* 78 */ 0xe88dbf, 0xe88f87, 0xe88fb6, 0xe89188,
+ /* 7c */ 0xe892b4, 0xe89593, 0xe89599, 0x000000,
+ /* 80 */ 0xe895ab, 0xefa89f, 0xe896b0, 0xefa8a0,
+ /* 84 */ 0xefa8a1, 0xe8a087, 0xe8a3b5, 0xe8a892,
+ /* 88 */ 0xe8a8b7, 0xe8a9b9, 0xe8aaa7, 0xe8aabe,
+ /* 8c */ 0xe8ab9f, 0xefa8a2, 0xe8abb6, 0xe8ad93,
+ /* 90 */ 0xe8adbf, 0xe8b3b0, 0xe8b3b4, 0xe8b492,
+ /* 94 */ 0xe8b5b6, 0xefa8a3, 0xe8bb8f, 0xefa8a4,
+ /* 98 */ 0xefa8a5, 0xe981a7, 0xe9839e, 0xefa8a6,
+ /* 9c */ 0xe98495, 0xe984a7, 0xe9879a, 0xe98797,
+ /* a0 */ 0xe9879e, 0xe987ad, 0xe987ae, 0xe987a4,
+ /* a4 */ 0xe987a5, 0xe98886, 0xe98890, 0xe9888a,
+ /* a8 */ 0xe988ba, 0xe98980, 0xe988bc, 0xe9898e,
+ /* ac */ 0xe98999, 0xe98991, 0xe988b9, 0xe989a7,
+ /* b0 */ 0xe98aa7, 0xe989b7, 0xe989b8, 0xe98ba7,
+ /* b4 */ 0xe98b97, 0xe98b99, 0xe98b90, 0xefa8a7,
+ /* b8 */ 0xe98b95, 0xe98ba0, 0xe98b93, 0xe98ca5,
+ /* bc */ 0xe98ca1, 0xe98bbb, 0xefa8a8, 0xe98c9e,
+ /* c0 */ 0xe98bbf, 0xe98c9d, 0xe98c82, 0xe98db0,
+ /* c4 */ 0xe98d97, 0xe98ea4, 0xe98f86, 0xe98f9e,
+ /* c8 */ 0xe98fb8, 0xe990b1, 0xe99185, 0xe99188,
+ /* cc */ 0xe99692, 0xefa79c, 0xefa8a9, 0xe99a9d,
+ /* d0 */ 0xe99aaf, 0xe99cb3, 0xe99cbb, 0xe99d83,
+ /* d4 */ 0xe99d8d, 0xe99d8f, 0xe99d91, 0xe99d95,
+ /* d8 */ 0xe9a197, 0xe9a1a5, 0xefa8aa, 0xefa8ab,
+ /* dc */ 0xe9a4a7, 0xefa8ac, 0xe9a69e, 0xe9a98e,
+ /* e0 */ 0xe9ab99, 0xe9ab9c, 0xe9adb5, 0xe9adb2,
+ /* e4 */ 0xe9ae8f, 0xe9aeb1, 0xe9aebb, 0xe9b080,
+ /* e8 */ 0xe9b5b0, 0xe9b5ab, 0xefa8ad, 0xe9b899,
+ /* ec */ 0xe9bb91, 0x000000, 0x000000, 0xe285b0,
+ /* f0 */ 0xe285b1, 0xe285b2, 0xe285b3, 0xe285b4,
+ /* f4 */ 0xe285b5, 0xe285b6, 0xe285b7, 0xe285b8,
+ /* f8 */ 0xe285b9, 0xefbfa2, 0xefbfa4, 0xefbc87,
+ /* fc */ 0xefbc82,
+
+ /*** Two byte table, leaf: faxx - offset 0x0201b ***/
+
+ /* 40 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* 44 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* 48 */ 0xe285b8, 0xe285b9, 0xe285a0, 0xe285a1,
+ /* 4c */ 0xe285a2, 0xe285a3, 0xe285a4, 0xe285a5,
+ /* 50 */ 0xe285a6, 0xe285a7, 0xe285a8, 0xe285a9,
+ /* 54 */ 0xefbfa2, 0xefbfa4, 0xefbc87, 0xefbc82,
+ /* 58 */ 0xe388b1, 0xe28496, 0xe284a1, 0xe288b5,
+ /* 5c */ 0xe7ba8a, 0xe8a49c, 0xe98d88, 0xe98a88,
+ /* 60 */ 0xe8939c, 0xe4bf89, 0xe782bb, 0xe698b1,
+ /* 64 */ 0xe6a388, 0xe98bb9, 0xe69bbb, 0xe5bd85,
+ /* 68 */ 0xe4b8a8, 0xe4bba1, 0xe4bbbc, 0xe4bc80,
+ /* 6c */ 0xe4bc83, 0xe4bcb9, 0xe4bd96, 0xe4be92,
+ /* 70 */ 0xe4be8a, 0xe4be9a, 0xe4be94, 0xe4bf8d,
+ /* 74 */ 0xe58180, 0xe580a2, 0xe4bfbf, 0xe5809e,
+ /* 78 */ 0xe58186, 0xe581b0, 0xe58182, 0xe58294,
+ /* 7c */ 0xe583b4, 0xe58398, 0xe5858a, 0x000000,
+ /* 80 */ 0xe585a4, 0xe5869d, 0xe586be, 0xe587ac,
+ /* 84 */ 0xe58895, 0xe58a9c, 0xe58aa6, 0xe58b80,
+ /* 88 */ 0xe58b9b, 0xe58c80, 0xe58c87, 0xe58ca4,
+ /* 8c */ 0xe58db2, 0xe58e93, 0xe58eb2, 0xe58f9d,
+ /* 90 */ 0xefa88e, 0xe5929c, 0xe5928a, 0xe592a9,
+ /* 94 */ 0xe593bf, 0xe59686, 0xe59d99, 0xe59da5,
+ /* 98 */ 0xe59eac, 0xe59f88, 0xe59f87, 0xefa88f,
+ /* 9c */ 0xefa890, 0xe5a29e, 0xe5a2b2, 0xe5a48b,
+ /* a0 */ 0xe5a593, 0xe5a59b, 0xe5a59d, 0xe5a5a3,
+ /* a4 */ 0xe5a6a4, 0xe5a6ba, 0xe5ad96, 0xe5af80,
+ /* a8 */ 0xe794af, 0xe5af98, 0xe5afac, 0xe5b09e,
+ /* ac */ 0xe5b2a6, 0xe5b2ba, 0xe5b3b5, 0xe5b4a7,
+ /* b0 */ 0xe5b593, 0xefa891, 0xe5b582, 0xe5b5ad,
+ /* b4 */ 0xe5b6b8, 0xe5b6b9, 0xe5b790, 0xe5bca1,
+ /* b8 */ 0xe5bcb4, 0xe5bda7, 0xe5beb7, 0xe5bf9e,
+ /* bc */ 0xe6819d, 0xe68285, 0xe6828a, 0xe6839e,
+ /* c0 */ 0xe68395, 0xe684a0, 0xe683b2, 0xe68491,
+ /* c4 */ 0xe684b7, 0xe684b0, 0xe68698, 0xe68893,
+ /* c8 */ 0xe68aa6, 0xe68fb5, 0xe691a0, 0xe6929d,
+ /* cc */ 0xe6938e, 0xe6958e, 0xe69880, 0xe69895,
+ /* d0 */ 0xe698bb, 0xe69889, 0xe698ae, 0xe6989e,
+ /* d4 */ 0xe698a4, 0xe699a5, 0xe69997, 0xe69999,
+ /* d8 */ 0xefa892, 0xe699b3, 0xe69a99, 0xe69aa0,
+ /* dc */ 0xe69ab2, 0xe69abf, 0xe69bba, 0xe69c8e,
+ /* e0 */ 0xefa4a9, 0xe69da6, 0xe69ebb, 0xe6a192,
+ /* e4 */ 0xe69f80, 0xe6a081, 0xe6a184, 0xe6a38f,
+ /* e8 */ 0xefa893, 0xe6a5a8, 0xefa894, 0xe6a698,
+ /* ec */ 0xe6a7a2, 0xe6a8b0, 0xe6a9ab, 0xe6a986,
+ /* f0 */ 0xe6a9b3, 0xe6a9be, 0xe6aba2, 0xe6aba4,
+ /* f4 */ 0xe6af96, 0xe6b0bf, 0xe6b19c, 0xe6b286,
+ /* f8 */ 0xe6b1af, 0xe6b39a, 0xe6b484, 0xe6b687,
+ /* fc */ 0xe6b5af,
+
+ /*** Two byte table, leaf: fbxx - offset 0x020d8 ***/
+
+ /* 40 */ 0xe6b696, 0xe6b6ac, 0xe6b78f, 0xe6b7b8,
+ /* 44 */ 0xe6b7b2, 0xe6b7bc, 0xe6b8b9, 0xe6b99c,
+ /* 48 */ 0xe6b8a7, 0xe6b8bc, 0xe6babf, 0xe6be88,
+ /* 4c */ 0xe6beb5, 0xe6bfb5, 0xe78085, 0xe78087,
+ /* 50 */ 0xe780a8, 0xe78285, 0xe782ab, 0xe7848f,
+ /* 54 */ 0xe78484, 0xe7859c, 0xe78586, 0xe78587,
+ /* 58 */ 0xefa895, 0xe78781, 0xe787be, 0xe78ab1,
+ /* 5c */ 0xe78abe, 0xe78ca4, 0xefa896, 0xe78db7,
+ /* 60 */ 0xe78ebd, 0xe78f89, 0xe78f96, 0xe78fa3,
+ /* 64 */ 0xe78f92, 0xe79087, 0xe78fb5, 0xe790a6,
+ /* 68 */ 0xe790aa, 0xe790a9, 0xe790ae, 0xe791a2,
+ /* 6c */ 0xe79289, 0xe7929f, 0xe79481, 0xe795af,
+ /* 70 */ 0xe79a82, 0xe79a9c, 0xe79a9e, 0xe79a9b,
+ /* 74 */ 0xe79aa6, 0xefa897, 0xe79d86, 0xe58aaf,
+ /* 78 */ 0xe7a0a1, 0xe7a18e, 0xe7a1a4, 0xe7a1ba,
+ /* 7c */ 0xe7a4b0, 0xefa898, 0xefa899, 0x000000,
+ /* 80 */ 0xefa89a, 0xe7a694, 0xefa89b, 0xe7a69b,
+ /* 84 */ 0xe7ab91, 0xe7aba7, 0xefa89c, 0xe7abab,
+ /* 88 */ 0xe7ae9e, 0xefa89d, 0xe7b588, 0xe7b59c,
+ /* 8c */ 0xe7b6b7, 0xe7b6a0, 0xe7b796, 0xe7b992,
+ /* 90 */ 0xe7bd87, 0xe7bea1, 0xefa89e, 0xe88c81,
+ /* 94 */ 0xe88da2, 0xe88dbf, 0xe88f87, 0xe88fb6,
+ /* 98 */ 0xe89188, 0xe892b4, 0xe89593, 0xe89599,
+ /* 9c */ 0xe895ab, 0xefa89f, 0xe896b0, 0xefa8a0,
+ /* a0 */ 0xefa8a1, 0xe8a087, 0xe8a3b5, 0xe8a892,
+ /* a4 */ 0xe8a8b7, 0xe8a9b9, 0xe8aaa7, 0xe8aabe,
+ /* a8 */ 0xe8ab9f, 0xefa8a2, 0xe8abb6, 0xe8ad93,
+ /* ac */ 0xe8adbf, 0xe8b3b0, 0xe8b3b4, 0xe8b492,
+ /* b0 */ 0xe8b5b6, 0xefa8a3, 0xe8bb8f, 0xefa8a4,
+ /* b4 */ 0xefa8a5, 0xe981a7, 0xe9839e, 0xefa8a6,
+ /* b8 */ 0xe98495, 0xe984a7, 0xe9879a, 0xe98797,
+ /* bc */ 0xe9879e, 0xe987ad, 0xe987ae, 0xe987a4,
+ /* c0 */ 0xe987a5, 0xe98886, 0xe98890, 0xe9888a,
+ /* c4 */ 0xe988ba, 0xe98980, 0xe988bc, 0xe9898e,
+ /* c8 */ 0xe98999, 0xe98991, 0xe988b9, 0xe989a7,
+ /* cc */ 0xe98aa7, 0xe989b7, 0xe989b8, 0xe98ba7,
+ /* d0 */ 0xe98b97, 0xe98b99, 0xe98b90, 0xefa8a7,
+ /* d4 */ 0xe98b95, 0xe98ba0, 0xe98b93, 0xe98ca5,
+ /* d8 */ 0xe98ca1, 0xe98bbb, 0xefa8a8, 0xe98c9e,
+ /* dc */ 0xe98bbf, 0xe98c9d, 0xe98c82, 0xe98db0,
+ /* e0 */ 0xe98d97, 0xe98ea4, 0xe98f86, 0xe98f9e,
+ /* e4 */ 0xe98fb8, 0xe990b1, 0xe99185, 0xe99188,
+ /* e8 */ 0xe99692, 0xefa79c, 0xefa8a9, 0xe99a9d,
+ /* ec */ 0xe99aaf, 0xe99cb3, 0xe99cbb, 0xe99d83,
+ /* f0 */ 0xe99d8d, 0xe99d8f, 0xe99d91, 0xe99d95,
+ /* f4 */ 0xe9a197, 0xe9a1a5, 0xefa8aa, 0xefa8ab,
+ /* f8 */ 0xe9a4a7, 0xefa8ac, 0xe9a69e, 0xe9a98e,
+ /* fc */ 0xe9ab99,
+
+ /*** Two byte table, leaf: fcxx - offset 0x02195 ***/
+
+ /* 40 */ 0xe9ab9c, 0xe9adb5, 0xe9adb2, 0xe9ae8f,
+ /* 44 */ 0xe9aeb1, 0xe9aebb, 0xe9b080, 0xe9b5b0,
+ /* 48 */ 0xe9b5ab, 0xefa8ad, 0xe9b899, 0xe9bb91,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ec */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fc */ 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/uhc_to_utf8.map b/src/backend/utils/mb/Unicode/uhc_to_utf8.map
new file mode 100644
index 0000000..b8ecc37
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/uhc_to_utf8.map
@@ -0,0 +1,6553 @@
+/* src/backend/utils/mb/Unicode/uhc_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_UHC.pl */
+
+static const uint32 uhc_to_unicode_tree_table[24256];
+
+static const pg_mb_radix_tree uhc_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ uhc_to_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x00be, /* offset of table for 2-byte inputs */
+ 0x81, /* b2_1_lower */
+ 0xfe, /* b2_1_upper */
+ 0x41, /* b2_2_lower */
+ 0xfe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 uhc_to_unicode_tree_table[24256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x000be ***/
+
+ /* 81 */ 0x00013c, 0x0001fa, 0x0002b8, 0x000376,
+ /* 85 */ 0x000434, 0x0004f2, 0x0005b0, 0x00066e,
+ /* 89 */ 0x00072c, 0x0007ea, 0x0008a8, 0x000966,
+ /* 8d */ 0x000a24, 0x000ae2, 0x000ba0, 0x000c5e,
+ /* 91 */ 0x000d1c, 0x000dda, 0x000e98, 0x000f56,
+ /* 95 */ 0x001014, 0x0010d2, 0x001190, 0x00124e,
+ /* 99 */ 0x00130c, 0x0013ca, 0x001488, 0x001546,
+ /* 9d */ 0x001604, 0x0016c2, 0x001780, 0x00183e,
+ /* a1 */ 0x0018fc, 0x0019ba, 0x001a78, 0x001b36,
+ /* a5 */ 0x001bf4, 0x001cb2, 0x001d70, 0x001e2e,
+ /* a9 */ 0x001eec, 0x001faa, 0x002068, 0x002126,
+ /* ad */ 0x0021e4, 0x0022a2, 0x002360, 0x00241e,
+ /* b1 */ 0x0024dc, 0x00259a, 0x002658, 0x002716,
+ /* b5 */ 0x0027d4, 0x002892, 0x002950, 0x002a0e,
+ /* b9 */ 0x002acc, 0x002b8a, 0x002c48, 0x002d06,
+ /* bd */ 0x002dc4, 0x002e82, 0x002f40, 0x002ffe,
+ /* c1 */ 0x0030bc, 0x00317a, 0x003238, 0x0032f6,
+ /* c5 */ 0x0033b4, 0x003472, 0x003530, 0x0035ee,
+ /* c9 */ 0x0036ac, 0x00376a, 0x003828, 0x0038e6,
+ /* cd */ 0x0039a4, 0x003a62, 0x003b20, 0x003bde,
+ /* d1 */ 0x003c9c, 0x003d5a, 0x003e18, 0x003ed6,
+ /* d5 */ 0x003f94, 0x004052, 0x004110, 0x0041ce,
+ /* d9 */ 0x00428c, 0x00434a, 0x004408, 0x0044c6,
+ /* dd */ 0x004584, 0x004642, 0x004700, 0x0047be,
+ /* e1 */ 0x00487c, 0x00493a, 0x0049f8, 0x004ab6,
+ /* e5 */ 0x004b74, 0x004c32, 0x004cf0, 0x004dae,
+ /* e9 */ 0x004e6c, 0x004f2a, 0x004fe8, 0x0050a6,
+ /* ed */ 0x005164, 0x005222, 0x0052e0, 0x00539e,
+ /* f1 */ 0x00545c, 0x00551a, 0x0055d8, 0x005696,
+ /* f5 */ 0x005754, 0x005812, 0x0058d0, 0x00598e,
+ /* f9 */ 0x005a4c, 0x005b0a, 0x005bc8, 0x005c86,
+ /* fd */ 0x005d44, 0x005e02,
+
+ /*** Two byte table, leaf: 81xx - offset 0x0013c ***/
+
+ /* 41 */ 0xeab082, 0xeab083, 0xeab085, 0xeab086,
+ /* 45 */ 0xeab08b, 0xeab08c, 0xeab08d, 0xeab08e,
+ /* 49 */ 0xeab08f, 0xeab098, 0xeab09e, 0xeab09f,
+ /* 4d */ 0xeab0a1, 0xeab0a2, 0xeab0a3, 0xeab0a5,
+ /* 51 */ 0xeab0a6, 0xeab0a7, 0xeab0a8, 0xeab0a9,
+ /* 55 */ 0xeab0aa, 0xeab0ab, 0xeab0ae, 0xeab0b2,
+ /* 59 */ 0xeab0b3, 0xeab0b4, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab0b5, 0xeab0b6, 0xeab0b7, 0xeab0ba,
+ /* 65 */ 0xeab0bb, 0xeab0bd, 0xeab0be, 0xeab0bf,
+ /* 69 */ 0xeab181, 0xeab182, 0xeab183, 0xeab184,
+ /* 6d */ 0xeab185, 0xeab186, 0xeab187, 0xeab188,
+ /* 71 */ 0xeab189, 0xeab18a, 0xeab18c, 0xeab18e,
+ /* 75 */ 0xeab18f, 0xeab190, 0xeab191, 0xeab192,
+ /* 79 */ 0xeab193, 0xeab195, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab196, 0xeab197, 0xeab199, 0xeab19a,
+ /* 85 */ 0xeab19b, 0xeab19d, 0xeab19e, 0xeab19f,
+ /* 89 */ 0xeab1a0, 0xeab1a1, 0xeab1a2, 0xeab1a3,
+ /* 8d */ 0xeab1a4, 0xeab1a5, 0xeab1a6, 0xeab1a7,
+ /* 91 */ 0xeab1a8, 0xeab1a9, 0xeab1aa, 0xeab1ab,
+ /* 95 */ 0xeab1ac, 0xeab1ad, 0xeab1ae, 0xeab1af,
+ /* 99 */ 0xeab1b2, 0xeab1b3, 0xeab1b5, 0xeab1b6,
+ /* 9d */ 0xeab1b9, 0xeab1bb, 0xeab1bc, 0xeab1bd,
+ /* a1 */ 0xeab1be, 0xeab1bf, 0xeab282, 0xeab287,
+ /* a5 */ 0xeab288, 0xeab28d, 0xeab28e, 0xeab28f,
+ /* a9 */ 0xeab291, 0xeab292, 0xeab293, 0xeab295,
+ /* ad */ 0xeab296, 0xeab297, 0xeab298, 0xeab299,
+ /* b1 */ 0xeab29a, 0xeab29b, 0xeab29e, 0xeab2a2,
+ /* b5 */ 0xeab2a3, 0xeab2a4, 0xeab2a5, 0xeab2a6,
+ /* b9 */ 0xeab2a7, 0xeab2ab, 0xeab2ad, 0xeab2ae,
+ /* bd */ 0xeab2b1, 0xeab2b2, 0xeab2b3, 0xeab2b4,
+ /* c1 */ 0xeab2b5, 0xeab2b6, 0xeab2b7, 0xeab2ba,
+ /* c5 */ 0xeab2be, 0xeab2bf, 0xeab380, 0xeab382,
+ /* c9 */ 0xeab383, 0xeab385, 0xeab386, 0xeab387,
+ /* cd */ 0xeab389, 0xeab38a, 0xeab38b, 0xeab38d,
+ /* d1 */ 0xeab38e, 0xeab38f, 0xeab390, 0xeab391,
+ /* d5 */ 0xeab392, 0xeab393, 0xeab394, 0xeab396,
+ /* d9 */ 0xeab398, 0xeab399, 0xeab39a, 0xeab39b,
+ /* dd */ 0xeab39c, 0xeab39d, 0xeab39e, 0xeab39f,
+ /* e1 */ 0xeab3a2, 0xeab3a3, 0xeab3a5, 0xeab3a6,
+ /* e5 */ 0xeab3a9, 0xeab3ab, 0xeab3ad, 0xeab3ae,
+ /* e9 */ 0xeab3b2, 0xeab3b4, 0xeab3b7, 0xeab3b8,
+ /* ed */ 0xeab3b9, 0xeab3ba, 0xeab3bb, 0xeab3be,
+ /* f1 */ 0xeab3bf, 0xeab481, 0xeab482, 0xeab483,
+ /* f5 */ 0xeab485, 0xeab487, 0xeab488, 0xeab489,
+ /* f9 */ 0xeab48a, 0xeab48b, 0xeab48e, 0xeab490,
+ /* fd */ 0xeab492, 0xeab493,
+
+ /*** Two byte table, leaf: 82xx - offset 0x001fa ***/
+
+ /* 41 */ 0xeab494, 0xeab495, 0xeab496, 0xeab497,
+ /* 45 */ 0xeab499, 0xeab49a, 0xeab49b, 0xeab49d,
+ /* 49 */ 0xeab49e, 0xeab49f, 0xeab4a1, 0xeab4a2,
+ /* 4d */ 0xeab4a3, 0xeab4a4, 0xeab4a5, 0xeab4a6,
+ /* 51 */ 0xeab4a7, 0xeab4a8, 0xeab4aa, 0xeab4ab,
+ /* 55 */ 0xeab4ae, 0xeab4af, 0xeab4b0, 0xeab4b1,
+ /* 59 */ 0xeab4b2, 0xeab4b3, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab4b6, 0xeab4b7, 0xeab4b9, 0xeab4ba,
+ /* 65 */ 0xeab4bb, 0xeab4bd, 0xeab4be, 0xeab4bf,
+ /* 69 */ 0xeab580, 0xeab581, 0xeab582, 0xeab583,
+ /* 6d */ 0xeab586, 0xeab588, 0xeab58a, 0xeab58b,
+ /* 71 */ 0xeab58c, 0xeab58d, 0xeab58e, 0xeab58f,
+ /* 75 */ 0xeab591, 0xeab592, 0xeab593, 0xeab595,
+ /* 79 */ 0xeab596, 0xeab597, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab599, 0xeab59a, 0xeab59b, 0xeab59c,
+ /* 85 */ 0xeab59d, 0xeab59e, 0xeab59f, 0xeab5a0,
+ /* 89 */ 0xeab5a2, 0xeab5a4, 0xeab5a5, 0xeab5a6,
+ /* 8d */ 0xeab5a7, 0xeab5a8, 0xeab5a9, 0xeab5aa,
+ /* 91 */ 0xeab5ab, 0xeab5ae, 0xeab5af, 0xeab5b1,
+ /* 95 */ 0xeab5b2, 0xeab5b7, 0xeab5b8, 0xeab5b9,
+ /* 99 */ 0xeab5ba, 0xeab5be, 0xeab680, 0xeab683,
+ /* 9d */ 0xeab684, 0xeab685, 0xeab686, 0xeab687,
+ /* a1 */ 0xeab68a, 0xeab68b, 0xeab68d, 0xeab68e,
+ /* a5 */ 0xeab68f, 0xeab691, 0xeab692, 0xeab693,
+ /* a9 */ 0xeab694, 0xeab695, 0xeab696, 0xeab697,
+ /* ad */ 0xeab698, 0xeab699, 0xeab69a, 0xeab69b,
+ /* b1 */ 0xeab69e, 0xeab69f, 0xeab6a0, 0xeab6a1,
+ /* b5 */ 0xeab6a2, 0xeab6a3, 0xeab6a5, 0xeab6a6,
+ /* b9 */ 0xeab6a7, 0xeab6a8, 0xeab6a9, 0xeab6aa,
+ /* bd */ 0xeab6ab, 0xeab6ac, 0xeab6ad, 0xeab6ae,
+ /* c1 */ 0xeab6af, 0xeab6b0, 0xeab6b1, 0xeab6b2,
+ /* c5 */ 0xeab6b3, 0xeab6b4, 0xeab6b5, 0xeab6b6,
+ /* c9 */ 0xeab6b8, 0xeab6b9, 0xeab6ba, 0xeab6bb,
+ /* cd */ 0xeab6bc, 0xeab6bd, 0xeab6be, 0xeab6bf,
+ /* d1 */ 0xeab782, 0xeab783, 0xeab785, 0xeab786,
+ /* d5 */ 0xeab787, 0xeab789, 0xeab78a, 0xeab78b,
+ /* d9 */ 0xeab78c, 0xeab78d, 0xeab78e, 0xeab78f,
+ /* dd */ 0xeab792, 0xeab794, 0xeab795, 0xeab796,
+ /* e1 */ 0xeab797, 0xeab798, 0xeab799, 0xeab79a,
+ /* e5 */ 0xeab79b, 0xeab79d, 0xeab79e, 0xeab79f,
+ /* e9 */ 0xeab7a1, 0xeab7a2, 0xeab7a3, 0xeab7a5,
+ /* ed */ 0xeab7a6, 0xeab7a7, 0xeab7a8, 0xeab7a9,
+ /* f1 */ 0xeab7aa, 0xeab7ab, 0xeab7ac, 0xeab7ad,
+ /* f5 */ 0xeab7ae, 0xeab7af, 0xeab7b0, 0xeab7b1,
+ /* f9 */ 0xeab7b2, 0xeab7b3, 0xeab7b4, 0xeab7b5,
+ /* fd */ 0xeab7b6, 0xeab7b7,
+
+ /*** Two byte table, leaf: 83xx - offset 0x002b8 ***/
+
+ /* 41 */ 0xeab7ba, 0xeab7bb, 0xeab7bd, 0xeab7be,
+ /* 45 */ 0xeab882, 0xeab883, 0xeab884, 0xeab885,
+ /* 49 */ 0xeab886, 0xeab887, 0xeab88a, 0xeab88c,
+ /* 4d */ 0xeab88e, 0xeab88f, 0xeab890, 0xeab891,
+ /* 51 */ 0xeab892, 0xeab893, 0xeab895, 0xeab896,
+ /* 55 */ 0xeab897, 0xeab898, 0xeab899, 0xeab89a,
+ /* 59 */ 0xeab89b, 0xeab89c, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeab89d, 0xeab89e, 0xeab89f, 0xeab8a0,
+ /* 65 */ 0xeab8a1, 0xeab8a2, 0xeab8a3, 0xeab8a4,
+ /* 69 */ 0xeab8a5, 0xeab8a6, 0xeab8a7, 0xeab8a8,
+ /* 6d */ 0xeab8a9, 0xeab8aa, 0xeab8ab, 0xeab8ac,
+ /* 71 */ 0xeab8ad, 0xeab8ae, 0xeab8af, 0xeab8b2,
+ /* 75 */ 0xeab8b3, 0xeab8b5, 0xeab8b6, 0xeab8b9,
+ /* 79 */ 0xeab8bb, 0xeab8bc, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeab8bd, 0xeab8be, 0xeab8bf, 0xeab982,
+ /* 85 */ 0xeab984, 0xeab987, 0xeab988, 0xeab989,
+ /* 89 */ 0xeab98b, 0xeab98f, 0xeab991, 0xeab992,
+ /* 8d */ 0xeab993, 0xeab995, 0xeab997, 0xeab998,
+ /* 91 */ 0xeab999, 0xeab99a, 0xeab99b, 0xeab99e,
+ /* 95 */ 0xeab9a2, 0xeab9a3, 0xeab9a4, 0xeab9a6,
+ /* 99 */ 0xeab9a7, 0xeab9aa, 0xeab9ab, 0xeab9ad,
+ /* 9d */ 0xeab9ae, 0xeab9af, 0xeab9b1, 0xeab9b2,
+ /* a1 */ 0xeab9b3, 0xeab9b4, 0xeab9b5, 0xeab9b6,
+ /* a5 */ 0xeab9b7, 0xeab9ba, 0xeab9be, 0xeab9bf,
+ /* a9 */ 0xeaba80, 0xeaba81, 0xeaba82, 0xeaba83,
+ /* ad */ 0xeaba86, 0xeaba87, 0xeaba88, 0xeaba89,
+ /* b1 */ 0xeaba8a, 0xeaba8b, 0xeaba8d, 0xeaba8e,
+ /* b5 */ 0xeaba8f, 0xeaba90, 0xeaba91, 0xeaba92,
+ /* b9 */ 0xeaba93, 0xeaba94, 0xeaba95, 0xeaba96,
+ /* bd */ 0xeaba97, 0xeaba98, 0xeaba99, 0xeaba9a,
+ /* c1 */ 0xeaba9b, 0xeaba9c, 0xeaba9d, 0xeaba9e,
+ /* c5 */ 0xeaba9f, 0xeabaa0, 0xeabaa1, 0xeabaa2,
+ /* c9 */ 0xeabaa3, 0xeabaa4, 0xeabaa5, 0xeabaa6,
+ /* cd */ 0xeabaa7, 0xeabaa8, 0xeabaa9, 0xeabaaa,
+ /* d1 */ 0xeabaab, 0xeabaac, 0xeabaad, 0xeabaae,
+ /* d5 */ 0xeabaaf, 0xeabab0, 0xeabab1, 0xeabab2,
+ /* d9 */ 0xeabab3, 0xeabab4, 0xeabab5, 0xeabab6,
+ /* dd */ 0xeabab7, 0xeabab8, 0xeabab9, 0xeababa,
+ /* e1 */ 0xeababb, 0xeababf, 0xeabb81, 0xeabb82,
+ /* e5 */ 0xeabb83, 0xeabb85, 0xeabb86, 0xeabb87,
+ /* e9 */ 0xeabb88, 0xeabb89, 0xeabb8a, 0xeabb8b,
+ /* ed */ 0xeabb8e, 0xeabb92, 0xeabb93, 0xeabb94,
+ /* f1 */ 0xeabb95, 0xeabb96, 0xeabb97, 0xeabb9a,
+ /* f5 */ 0xeabb9b, 0xeabb9d, 0xeabb9e, 0xeabb9f,
+ /* f9 */ 0xeabba0, 0xeabba1, 0xeabba2, 0xeabba3,
+ /* fd */ 0xeabba4, 0xeabba5,
+
+ /*** Two byte table, leaf: 84xx - offset 0x00376 ***/
+
+ /* 41 */ 0xeabba6, 0xeabba7, 0xeabba9, 0xeabbaa,
+ /* 45 */ 0xeabbac, 0xeabbae, 0xeabbaf, 0xeabbb0,
+ /* 49 */ 0xeabbb1, 0xeabbb2, 0xeabbb3, 0xeabbb5,
+ /* 4d */ 0xeabbb6, 0xeabbb7, 0xeabbb9, 0xeabbba,
+ /* 51 */ 0xeabbbb, 0xeabbbd, 0xeabbbe, 0xeabbbf,
+ /* 55 */ 0xeabc80, 0xeabc81, 0xeabc82, 0xeabc83,
+ /* 59 */ 0xeabc84, 0xeabc85, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeabc86, 0xeabc89, 0xeabc8a, 0xeabc8b,
+ /* 65 */ 0xeabc8c, 0xeabc8e, 0xeabc8f, 0xeabc91,
+ /* 69 */ 0xeabc92, 0xeabc93, 0xeabc94, 0xeabc95,
+ /* 6d */ 0xeabc96, 0xeabc97, 0xeabc98, 0xeabc99,
+ /* 71 */ 0xeabc9a, 0xeabc9b, 0xeabc9c, 0xeabc9d,
+ /* 75 */ 0xeabc9e, 0xeabc9f, 0xeabca0, 0xeabca1,
+ /* 79 */ 0xeabca2, 0xeabca3, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeabca4, 0xeabca5, 0xeabca6, 0xeabca7,
+ /* 85 */ 0xeabca8, 0xeabca9, 0xeabcaa, 0xeabcab,
+ /* 89 */ 0xeabcae, 0xeabcaf, 0xeabcb1, 0xeabcb3,
+ /* 8d */ 0xeabcb5, 0xeabcb6, 0xeabcb7, 0xeabcb8,
+ /* 91 */ 0xeabcb9, 0xeabcba, 0xeabcbb, 0xeabcbe,
+ /* 95 */ 0xeabd80, 0xeabd84, 0xeabd85, 0xeabd86,
+ /* 99 */ 0xeabd87, 0xeabd8a, 0xeabd8b, 0xeabd8c,
+ /* 9d */ 0xeabd8d, 0xeabd8e, 0xeabd8f, 0xeabd91,
+ /* a1 */ 0xeabd92, 0xeabd93, 0xeabd94, 0xeabd95,
+ /* a5 */ 0xeabd96, 0xeabd97, 0xeabd98, 0xeabd99,
+ /* a9 */ 0xeabd9a, 0xeabd9b, 0xeabd9e, 0xeabd9f,
+ /* ad */ 0xeabda0, 0xeabda1, 0xeabda2, 0xeabda3,
+ /* b1 */ 0xeabda6, 0xeabda7, 0xeabda8, 0xeabda9,
+ /* b5 */ 0xeabdaa, 0xeabdab, 0xeabdac, 0xeabdad,
+ /* b9 */ 0xeabdae, 0xeabdaf, 0xeabdb0, 0xeabdb1,
+ /* bd */ 0xeabdb2, 0xeabdb3, 0xeabdb4, 0xeabdb5,
+ /* c1 */ 0xeabdb6, 0xeabdb7, 0xeabdb8, 0xeabdba,
+ /* c5 */ 0xeabdbb, 0xeabdbc, 0xeabdbd, 0xeabdbe,
+ /* c9 */ 0xeabdbf, 0xeabe81, 0xeabe82, 0xeabe83,
+ /* cd */ 0xeabe85, 0xeabe86, 0xeabe87, 0xeabe89,
+ /* d1 */ 0xeabe8a, 0xeabe8b, 0xeabe8c, 0xeabe8d,
+ /* d5 */ 0xeabe8e, 0xeabe8f, 0xeabe92, 0xeabe93,
+ /* d9 */ 0xeabe94, 0xeabe96, 0xeabe97, 0xeabe98,
+ /* dd */ 0xeabe99, 0xeabe9a, 0xeabe9b, 0xeabe9d,
+ /* e1 */ 0xeabe9e, 0xeabe9f, 0xeabea0, 0xeabea1,
+ /* e5 */ 0xeabea2, 0xeabea3, 0xeabea4, 0xeabea5,
+ /* e9 */ 0xeabea6, 0xeabea7, 0xeabea8, 0xeabea9,
+ /* ed */ 0xeabeaa, 0xeabeab, 0xeabeac, 0xeabead,
+ /* f1 */ 0xeabeae, 0xeabeaf, 0xeabeb0, 0xeabeb1,
+ /* f5 */ 0xeabeb2, 0xeabeb3, 0xeabeb4, 0xeabeb5,
+ /* f9 */ 0xeabeb6, 0xeabeb7, 0xeabeba, 0xeabebb,
+ /* fd */ 0xeabebd, 0xeabebe,
+
+ /*** Two byte table, leaf: 85xx - offset 0x00434 ***/
+
+ /* 41 */ 0xeabebf, 0xeabf81, 0xeabf82, 0xeabf83,
+ /* 45 */ 0xeabf84, 0xeabf85, 0xeabf86, 0xeabf8a,
+ /* 49 */ 0xeabf8c, 0xeabf8f, 0xeabf90, 0xeabf91,
+ /* 4d */ 0xeabf92, 0xeabf93, 0xeabf95, 0xeabf96,
+ /* 51 */ 0xeabf97, 0xeabf98, 0xeabf99, 0xeabf9a,
+ /* 55 */ 0xeabf9b, 0xeabf9d, 0xeabf9e, 0xeabf9f,
+ /* 59 */ 0xeabfa0, 0xeabfa1, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeabfa2, 0xeabfa3, 0xeabfa4, 0xeabfa5,
+ /* 65 */ 0xeabfa6, 0xeabfa7, 0xeabfaa, 0xeabfab,
+ /* 69 */ 0xeabfac, 0xeabfad, 0xeabfae, 0xeabfaf,
+ /* 6d */ 0xeabfb2, 0xeabfb3, 0xeabfb5, 0xeabfb6,
+ /* 71 */ 0xeabfb7, 0xeabfb9, 0xeabfba, 0xeabfbb,
+ /* 75 */ 0xeabfbc, 0xeabfbd, 0xeabfbe, 0xeabfbf,
+ /* 79 */ 0xeb8082, 0xeb8083, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8085, 0xeb8086, 0xeb8087, 0xeb8088,
+ /* 85 */ 0xeb8089, 0xeb808a, 0xeb808b, 0xeb808d,
+ /* 89 */ 0xeb808e, 0xeb808f, 0xeb8091, 0xeb8092,
+ /* 8d */ 0xeb8093, 0xeb8095, 0xeb8096, 0xeb8097,
+ /* 91 */ 0xeb8098, 0xeb8099, 0xeb809a, 0xeb809b,
+ /* 95 */ 0xeb809e, 0xeb809f, 0xeb80a0, 0xeb80a1,
+ /* 99 */ 0xeb80a2, 0xeb80a3, 0xeb80a4, 0xeb80a5,
+ /* 9d */ 0xeb80a6, 0xeb80a7, 0xeb80a9, 0xeb80aa,
+ /* a1 */ 0xeb80ab, 0xeb80ac, 0xeb80ad, 0xeb80ae,
+ /* a5 */ 0xeb80af, 0xeb80b0, 0xeb80b1, 0xeb80b2,
+ /* a9 */ 0xeb80b3, 0xeb80b4, 0xeb80b5, 0xeb80b6,
+ /* ad */ 0xeb80b7, 0xeb80b8, 0xeb80b9, 0xeb80ba,
+ /* b1 */ 0xeb80bb, 0xeb80bc, 0xeb80bd, 0xeb80be,
+ /* b5 */ 0xeb80bf, 0xeb8180, 0xeb8181, 0xeb8182,
+ /* b9 */ 0xeb8183, 0xeb8186, 0xeb8187, 0xeb8189,
+ /* bd */ 0xeb818b, 0xeb818d, 0xeb818f, 0xeb8190,
+ /* c1 */ 0xeb8191, 0xeb8192, 0xeb8196, 0xeb8198,
+ /* c5 */ 0xeb819a, 0xeb819b, 0xeb819c, 0xeb819e,
+ /* c9 */ 0xeb819f, 0xeb81a0, 0xeb81a1, 0xeb81a2,
+ /* cd */ 0xeb81a3, 0xeb81a4, 0xeb81a5, 0xeb81a6,
+ /* d1 */ 0xeb81a7, 0xeb81a8, 0xeb81a9, 0xeb81aa,
+ /* d5 */ 0xeb81ab, 0xeb81ac, 0xeb81ad, 0xeb81ae,
+ /* d9 */ 0xeb81af, 0xeb81b0, 0xeb81b1, 0xeb81b2,
+ /* dd */ 0xeb81b3, 0xeb81b4, 0xeb81b5, 0xeb81b6,
+ /* e1 */ 0xeb81b7, 0xeb81b8, 0xeb81b9, 0xeb81ba,
+ /* e5 */ 0xeb81bb, 0xeb81be, 0xeb81bf, 0xeb8281,
+ /* e9 */ 0xeb8282, 0xeb8283, 0xeb8285, 0xeb8286,
+ /* ed */ 0xeb8287, 0xeb8288, 0xeb8289, 0xeb828a,
+ /* f1 */ 0xeb828b, 0xeb828e, 0xeb8290, 0xeb8292,
+ /* f5 */ 0xeb8293, 0xeb8294, 0xeb8295, 0xeb8296,
+ /* f9 */ 0xeb8297, 0xeb829b, 0xeb829d, 0xeb829e,
+ /* fd */ 0xeb82a3, 0xeb82a4,
+
+ /*** Two byte table, leaf: 86xx - offset 0x004f2 ***/
+
+ /* 41 */ 0xeb82a5, 0xeb82a6, 0xeb82a7, 0xeb82aa,
+ /* 45 */ 0xeb82b0, 0xeb82b2, 0xeb82b6, 0xeb82b7,
+ /* 49 */ 0xeb82b9, 0xeb82ba, 0xeb82bb, 0xeb82bd,
+ /* 4d */ 0xeb82be, 0xeb82bf, 0xeb8380, 0xeb8381,
+ /* 51 */ 0xeb8382, 0xeb8383, 0xeb8386, 0xeb838a,
+ /* 55 */ 0xeb838b, 0xeb838c, 0xeb838d, 0xeb838e,
+ /* 59 */ 0xeb838f, 0xeb8392, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8393, 0xeb8395, 0xeb8396, 0xeb8397,
+ /* 65 */ 0xeb8399, 0xeb839a, 0xeb839b, 0xeb839c,
+ /* 69 */ 0xeb839d, 0xeb839e, 0xeb839f, 0xeb83a1,
+ /* 6d */ 0xeb83a2, 0xeb83a3, 0xeb83a4, 0xeb83a6,
+ /* 71 */ 0xeb83a7, 0xeb83a8, 0xeb83a9, 0xeb83aa,
+ /* 75 */ 0xeb83ab, 0xeb83ac, 0xeb83ad, 0xeb83ae,
+ /* 79 */ 0xeb83af, 0xeb83b0, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb83b1, 0xeb83b2, 0xeb83b3, 0xeb83b4,
+ /* 85 */ 0xeb83b5, 0xeb83b6, 0xeb83b7, 0xeb83b8,
+ /* 89 */ 0xeb83b9, 0xeb83ba, 0xeb83bb, 0xeb83bc,
+ /* 8d */ 0xeb83bd, 0xeb83be, 0xeb83bf, 0xeb8480,
+ /* 91 */ 0xeb8481, 0xeb8482, 0xeb8483, 0xeb8484,
+ /* 95 */ 0xeb8485, 0xeb8486, 0xeb8487, 0xeb848a,
+ /* 99 */ 0xeb848d, 0xeb848e, 0xeb848f, 0xeb8491,
+ /* 9d */ 0xeb8494, 0xeb8495, 0xeb8496, 0xeb8497,
+ /* a1 */ 0xeb849a, 0xeb849e, 0xeb849f, 0xeb84a0,
+ /* a5 */ 0xeb84a1, 0xeb84a2, 0xeb84a6, 0xeb84a7,
+ /* a9 */ 0xeb84a9, 0xeb84aa, 0xeb84ab, 0xeb84ad,
+ /* ad */ 0xeb84ae, 0xeb84af, 0xeb84b0, 0xeb84b1,
+ /* b1 */ 0xeb84b2, 0xeb84b3, 0xeb84b6, 0xeb84ba,
+ /* b5 */ 0xeb84bb, 0xeb84bc, 0xeb84bd, 0xeb84be,
+ /* b9 */ 0xeb84bf, 0xeb8582, 0xeb8583, 0xeb8585,
+ /* bd */ 0xeb8586, 0xeb8587, 0xeb8589, 0xeb858a,
+ /* c1 */ 0xeb858b, 0xeb858c, 0xeb858d, 0xeb858e,
+ /* c5 */ 0xeb858f, 0xeb8592, 0xeb8593, 0xeb8596,
+ /* c9 */ 0xeb8597, 0xeb8599, 0xeb859a, 0xeb859b,
+ /* cd */ 0xeb859d, 0xeb859e, 0xeb859f, 0xeb85a1,
+ /* d1 */ 0xeb85a2, 0xeb85a3, 0xeb85a4, 0xeb85a5,
+ /* d5 */ 0xeb85a6, 0xeb85a7, 0xeb85a8, 0xeb85a9,
+ /* d9 */ 0xeb85aa, 0xeb85ab, 0xeb85ac, 0xeb85ad,
+ /* dd */ 0xeb85ae, 0xeb85af, 0xeb85b0, 0xeb85b1,
+ /* e1 */ 0xeb85b2, 0xeb85b3, 0xeb85b4, 0xeb85b5,
+ /* e5 */ 0xeb85b6, 0xeb85b7, 0xeb85ba, 0xeb85bb,
+ /* e9 */ 0xeb85bd, 0xeb85be, 0xeb85bf, 0xeb8681,
+ /* ed */ 0xeb8683, 0xeb8684, 0xeb8685, 0xeb8686,
+ /* f1 */ 0xeb8687, 0xeb868a, 0xeb868c, 0xeb868e,
+ /* f5 */ 0xeb868f, 0xeb8690, 0xeb8691, 0xeb8695,
+ /* f9 */ 0xeb8696, 0xeb8697, 0xeb8699, 0xeb869a,
+ /* fd */ 0xeb869b, 0xeb869d,
+
+ /*** Two byte table, leaf: 87xx - offset 0x005b0 ***/
+
+ /* 41 */ 0xeb869e, 0xeb869f, 0xeb86a0, 0xeb86a1,
+ /* 45 */ 0xeb86a2, 0xeb86a3, 0xeb86a4, 0xeb86a5,
+ /* 49 */ 0xeb86a6, 0xeb86a7, 0xeb86a9, 0xeb86aa,
+ /* 4d */ 0xeb86ab, 0xeb86ac, 0xeb86ad, 0xeb86ae,
+ /* 51 */ 0xeb86af, 0xeb86b0, 0xeb86b1, 0xeb86b2,
+ /* 55 */ 0xeb86b3, 0xeb86b4, 0xeb86b5, 0xeb86b6,
+ /* 59 */ 0xeb86b7, 0xeb86b8, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb86b9, 0xeb86ba, 0xeb86bb, 0xeb86bc,
+ /* 65 */ 0xeb86bd, 0xeb86be, 0xeb86bf, 0xeb8780,
+ /* 69 */ 0xeb8781, 0xeb8782, 0xeb8783, 0xeb8784,
+ /* 6d */ 0xeb8785, 0xeb8786, 0xeb8787, 0xeb8788,
+ /* 71 */ 0xeb8789, 0xeb878a, 0xeb878b, 0xeb878d,
+ /* 75 */ 0xeb878e, 0xeb878f, 0xeb8791, 0xeb8792,
+ /* 79 */ 0xeb8793, 0xeb8795, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8796, 0xeb8797, 0xeb8798, 0xeb8799,
+ /* 85 */ 0xeb879a, 0xeb879b, 0xeb879e, 0xeb87a0,
+ /* 89 */ 0xeb87a1, 0xeb87a2, 0xeb87a3, 0xeb87a4,
+ /* 8d */ 0xeb87a5, 0xeb87a6, 0xeb87a7, 0xeb87aa,
+ /* 91 */ 0xeb87ab, 0xeb87ad, 0xeb87ae, 0xeb87af,
+ /* 95 */ 0xeb87b1, 0xeb87b2, 0xeb87b3, 0xeb87b4,
+ /* 99 */ 0xeb87b5, 0xeb87b6, 0xeb87b7, 0xeb87b8,
+ /* 9d */ 0xeb87ba, 0xeb87bc, 0xeb87be, 0xeb87bf,
+ /* a1 */ 0xeb8880, 0xeb8881, 0xeb8882, 0xeb8883,
+ /* a5 */ 0xeb8886, 0xeb8887, 0xeb8889, 0xeb888a,
+ /* a9 */ 0xeb888d, 0xeb888e, 0xeb888f, 0xeb8890,
+ /* ad */ 0xeb8891, 0xeb8892, 0xeb8893, 0xeb8896,
+ /* b1 */ 0xeb8898, 0xeb889a, 0xeb889b, 0xeb889c,
+ /* b5 */ 0xeb889d, 0xeb889e, 0xeb889f, 0xeb88a1,
+ /* b9 */ 0xeb88a2, 0xeb88a3, 0xeb88a4, 0xeb88a5,
+ /* bd */ 0xeb88a6, 0xeb88a7, 0xeb88a8, 0xeb88a9,
+ /* c1 */ 0xeb88aa, 0xeb88ab, 0xeb88ac, 0xeb88ad,
+ /* c5 */ 0xeb88ae, 0xeb88af, 0xeb88b0, 0xeb88b1,
+ /* c9 */ 0xeb88b2, 0xeb88b3, 0xeb88b5, 0xeb88b6,
+ /* cd */ 0xeb88b7, 0xeb88b8, 0xeb88b9, 0xeb88ba,
+ /* d1 */ 0xeb88bb, 0xeb88bd, 0xeb88be, 0xeb88bf,
+ /* d5 */ 0xeb8980, 0xeb8981, 0xeb8982, 0xeb8983,
+ /* d9 */ 0xeb8984, 0xeb8985, 0xeb8986, 0xeb8987,
+ /* dd */ 0xeb8988, 0xeb8989, 0xeb898a, 0xeb898b,
+ /* e1 */ 0xeb898c, 0xeb898d, 0xeb898e, 0xeb898f,
+ /* e5 */ 0xeb8990, 0xeb8991, 0xeb8992, 0xeb8993,
+ /* e9 */ 0xeb8994, 0xeb8995, 0xeb8996, 0xeb8997,
+ /* ed */ 0xeb8999, 0xeb899a, 0xeb899b, 0xeb899d,
+ /* f1 */ 0xeb899e, 0xeb899f, 0xeb89a1, 0xeb89a2,
+ /* f5 */ 0xeb89a3, 0xeb89a4, 0xeb89a5, 0xeb89a6,
+ /* f9 */ 0xeb89a7, 0xeb89aa, 0xeb89ab, 0xeb89ac,
+ /* fd */ 0xeb89ad, 0xeb89ae,
+
+ /*** Two byte table, leaf: 88xx - offset 0x0066e ***/
+
+ /* 41 */ 0xeb89af, 0xeb89b0, 0xeb89b1, 0xeb89b2,
+ /* 45 */ 0xeb89b3, 0xeb89b6, 0xeb89b7, 0xeb89b8,
+ /* 49 */ 0xeb89b9, 0xeb89ba, 0xeb89bb, 0xeb89bd,
+ /* 4d */ 0xeb89be, 0xeb89bf, 0xeb8a80, 0xeb8a81,
+ /* 51 */ 0xeb8a82, 0xeb8a83, 0xeb8a86, 0xeb8a87,
+ /* 55 */ 0xeb8a88, 0xeb8a8a, 0xeb8a8b, 0xeb8a8c,
+ /* 59 */ 0xeb8a8d, 0xeb8a8e, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8a8f, 0xeb8a92, 0xeb8a93, 0xeb8a95,
+ /* 65 */ 0xeb8a96, 0xeb8a97, 0xeb8a9b, 0xeb8a9c,
+ /* 69 */ 0xeb8a9d, 0xeb8a9e, 0xeb8a9f, 0xeb8aa2,
+ /* 6d */ 0xeb8aa4, 0xeb8aa7, 0xeb8aa8, 0xeb8aa9,
+ /* 71 */ 0xeb8aab, 0xeb8aad, 0xeb8aae, 0xeb8aaf,
+ /* 75 */ 0xeb8ab1, 0xeb8ab2, 0xeb8ab3, 0xeb8ab5,
+ /* 79 */ 0xeb8ab6, 0xeb8ab7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8ab8, 0xeb8ab9, 0xeb8aba, 0xeb8abb,
+ /* 85 */ 0xeb8abc, 0xeb8abd, 0xeb8abe, 0xeb8abf,
+ /* 89 */ 0xeb8b80, 0xeb8b81, 0xeb8b82, 0xeb8b83,
+ /* 8d */ 0xeb8b84, 0xeb8b85, 0xeb8b86, 0xeb8b87,
+ /* 91 */ 0xeb8b8a, 0xeb8b8b, 0xeb8b8d, 0xeb8b8e,
+ /* 95 */ 0xeb8b8f, 0xeb8b91, 0xeb8b93, 0xeb8b94,
+ /* 99 */ 0xeb8b95, 0xeb8b96, 0xeb8b97, 0xeb8b9a,
+ /* 9d */ 0xeb8b9c, 0xeb8b9e, 0xeb8b9f, 0xeb8ba0,
+ /* a1 */ 0xeb8ba1, 0xeb8ba3, 0xeb8ba7, 0xeb8ba9,
+ /* a5 */ 0xeb8baa, 0xeb8bb0, 0xeb8bb1, 0xeb8bb2,
+ /* a9 */ 0xeb8bb6, 0xeb8bbc, 0xeb8bbd, 0xeb8bbe,
+ /* ad */ 0xeb8c82, 0xeb8c83, 0xeb8c85, 0xeb8c86,
+ /* b1 */ 0xeb8c87, 0xeb8c89, 0xeb8c8a, 0xeb8c8b,
+ /* b5 */ 0xeb8c8c, 0xeb8c8d, 0xeb8c8e, 0xeb8c8f,
+ /* b9 */ 0xeb8c92, 0xeb8c96, 0xeb8c97, 0xeb8c98,
+ /* bd */ 0xeb8c99, 0xeb8c9a, 0xeb8c9b, 0xeb8c9d,
+ /* c1 */ 0xeb8c9e, 0xeb8c9f, 0xeb8ca0, 0xeb8ca1,
+ /* c5 */ 0xeb8ca2, 0xeb8ca3, 0xeb8ca4, 0xeb8ca5,
+ /* c9 */ 0xeb8ca6, 0xeb8ca7, 0xeb8ca8, 0xeb8ca9,
+ /* cd */ 0xeb8caa, 0xeb8cab, 0xeb8cac, 0xeb8cad,
+ /* d1 */ 0xeb8cae, 0xeb8caf, 0xeb8cb0, 0xeb8cb1,
+ /* d5 */ 0xeb8cb2, 0xeb8cb3, 0xeb8cb4, 0xeb8cb5,
+ /* d9 */ 0xeb8cb6, 0xeb8cb7, 0xeb8cb8, 0xeb8cb9,
+ /* dd */ 0xeb8cba, 0xeb8cbb, 0xeb8cbc, 0xeb8cbd,
+ /* e1 */ 0xeb8cbe, 0xeb8cbf, 0xeb8d80, 0xeb8d81,
+ /* e5 */ 0xeb8d82, 0xeb8d83, 0xeb8d84, 0xeb8d85,
+ /* e9 */ 0xeb8d86, 0xeb8d87, 0xeb8d88, 0xeb8d89,
+ /* ed */ 0xeb8d8a, 0xeb8d8b, 0xeb8d8c, 0xeb8d8d,
+ /* f1 */ 0xeb8d8e, 0xeb8d8f, 0xeb8d90, 0xeb8d91,
+ /* f5 */ 0xeb8d92, 0xeb8d93, 0xeb8d97, 0xeb8d99,
+ /* f9 */ 0xeb8d9a, 0xeb8d9d, 0xeb8da0, 0xeb8da1,
+ /* fd */ 0xeb8da2, 0xeb8da3,
+
+ /*** Two byte table, leaf: 89xx - offset 0x0072c ***/
+
+ /* 41 */ 0xeb8da6, 0xeb8da8, 0xeb8daa, 0xeb8dac,
+ /* 45 */ 0xeb8dad, 0xeb8daf, 0xeb8db2, 0xeb8db3,
+ /* 49 */ 0xeb8db5, 0xeb8db6, 0xeb8db7, 0xeb8db9,
+ /* 4d */ 0xeb8dba, 0xeb8dbb, 0xeb8dbc, 0xeb8dbd,
+ /* 51 */ 0xeb8dbe, 0xeb8dbf, 0xeb8e82, 0xeb8e86,
+ /* 55 */ 0xeb8e87, 0xeb8e88, 0xeb8e89, 0xeb8e8a,
+ /* 59 */ 0xeb8e8b, 0xeb8e8d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb8e8e, 0xeb8e8f, 0xeb8e91, 0xeb8e92,
+ /* 65 */ 0xeb8e93, 0xeb8e95, 0xeb8e96, 0xeb8e97,
+ /* 69 */ 0xeb8e98, 0xeb8e99, 0xeb8e9a, 0xeb8e9b,
+ /* 6d */ 0xeb8e9c, 0xeb8e9d, 0xeb8e9e, 0xeb8e9f,
+ /* 71 */ 0xeb8ea2, 0xeb8ea3, 0xeb8ea4, 0xeb8ea5,
+ /* 75 */ 0xeb8ea6, 0xeb8ea7, 0xeb8ea9, 0xeb8eaa,
+ /* 79 */ 0xeb8eab, 0xeb8ead, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb8eae, 0xeb8eaf, 0xeb8eb0, 0xeb8eb1,
+ /* 85 */ 0xeb8eb2, 0xeb8eb3, 0xeb8eb4, 0xeb8eb5,
+ /* 89 */ 0xeb8eb6, 0xeb8eb7, 0xeb8eb8, 0xeb8eb9,
+ /* 8d */ 0xeb8eba, 0xeb8ebb, 0xeb8ebc, 0xeb8ebd,
+ /* 91 */ 0xeb8ebe, 0xeb8ebf, 0xeb8f80, 0xeb8f81,
+ /* 95 */ 0xeb8f82, 0xeb8f83, 0xeb8f86, 0xeb8f87,
+ /* 99 */ 0xeb8f89, 0xeb8f8a, 0xeb8f8d, 0xeb8f8f,
+ /* 9d */ 0xeb8f91, 0xeb8f92, 0xeb8f93, 0xeb8f96,
+ /* a1 */ 0xeb8f98, 0xeb8f9a, 0xeb8f9c, 0xeb8f9e,
+ /* a5 */ 0xeb8f9f, 0xeb8fa1, 0xeb8fa2, 0xeb8fa3,
+ /* a9 */ 0xeb8fa5, 0xeb8fa6, 0xeb8fa7, 0xeb8fa9,
+ /* ad */ 0xeb8faa, 0xeb8fab, 0xeb8fac, 0xeb8fad,
+ /* b1 */ 0xeb8fae, 0xeb8faf, 0xeb8fb0, 0xeb8fb1,
+ /* b5 */ 0xeb8fb2, 0xeb8fb3, 0xeb8fb4, 0xeb8fb5,
+ /* b9 */ 0xeb8fb6, 0xeb8fb7, 0xeb8fb8, 0xeb8fb9,
+ /* bd */ 0xeb8fba, 0xeb8fbb, 0xeb8fbd, 0xeb8fbe,
+ /* c1 */ 0xeb8fbf, 0xeb9080, 0xeb9081, 0xeb9082,
+ /* c5 */ 0xeb9083, 0xeb9084, 0xeb9085, 0xeb9086,
+ /* c9 */ 0xeb9087, 0xeb9088, 0xeb9089, 0xeb908a,
+ /* cd */ 0xeb908b, 0xeb908c, 0xeb908d, 0xeb908e,
+ /* d1 */ 0xeb908f, 0xeb9091, 0xeb9092, 0xeb9093,
+ /* d5 */ 0xeb9094, 0xeb9095, 0xeb9096, 0xeb9097,
+ /* d9 */ 0xeb9099, 0xeb909a, 0xeb909b, 0xeb909d,
+ /* dd */ 0xeb909e, 0xeb909f, 0xeb90a1, 0xeb90a2,
+ /* e1 */ 0xeb90a3, 0xeb90a4, 0xeb90a5, 0xeb90a6,
+ /* e5 */ 0xeb90a7, 0xeb90aa, 0xeb90ac, 0xeb90ad,
+ /* e9 */ 0xeb90ae, 0xeb90af, 0xeb90b0, 0xeb90b1,
+ /* ed */ 0xeb90b2, 0xeb90b3, 0xeb90b5, 0xeb90b6,
+ /* f1 */ 0xeb90b7, 0xeb90b8, 0xeb90b9, 0xeb90ba,
+ /* f5 */ 0xeb90bb, 0xeb90bc, 0xeb90bd, 0xeb90be,
+ /* f9 */ 0xeb90bf, 0xeb9180, 0xeb9181, 0xeb9182,
+ /* fd */ 0xeb9183, 0xeb9184,
+
+ /*** Two byte table, leaf: 8axx - offset 0x007ea ***/
+
+ /* 41 */ 0xeb9185, 0xeb9186, 0xeb9187, 0xeb9188,
+ /* 45 */ 0xeb9189, 0xeb918a, 0xeb918b, 0xeb918c,
+ /* 49 */ 0xeb918d, 0xeb918e, 0xeb918f, 0xeb9192,
+ /* 4d */ 0xeb9193, 0xeb9195, 0xeb9196, 0xeb9197,
+ /* 51 */ 0xeb9199, 0xeb919a, 0xeb919b, 0xeb919c,
+ /* 55 */ 0xeb919d, 0xeb919e, 0xeb919f, 0xeb91a2,
+ /* 59 */ 0xeb91a4, 0xeb91a6, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb91a7, 0xeb91a8, 0xeb91a9, 0xeb91aa,
+ /* 65 */ 0xeb91ab, 0xeb91ad, 0xeb91ae, 0xeb91af,
+ /* 69 */ 0xeb91b0, 0xeb91b1, 0xeb91b2, 0xeb91b3,
+ /* 6d */ 0xeb91b4, 0xeb91b5, 0xeb91b6, 0xeb91b7,
+ /* 71 */ 0xeb91b8, 0xeb91b9, 0xeb91ba, 0xeb91bb,
+ /* 75 */ 0xeb91bc, 0xeb91bd, 0xeb91be, 0xeb91bf,
+ /* 79 */ 0xeb9281, 0xeb9282, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9283, 0xeb9284, 0xeb9285, 0xeb9286,
+ /* 85 */ 0xeb9287, 0xeb9289, 0xeb928a, 0xeb928b,
+ /* 89 */ 0xeb928c, 0xeb928d, 0xeb928e, 0xeb928f,
+ /* 8d */ 0xeb9290, 0xeb9291, 0xeb9292, 0xeb9293,
+ /* 91 */ 0xeb9294, 0xeb9295, 0xeb9296, 0xeb9297,
+ /* 95 */ 0xeb9298, 0xeb9299, 0xeb929a, 0xeb929b,
+ /* 99 */ 0xeb929c, 0xeb929e, 0xeb929f, 0xeb92a0,
+ /* 9d */ 0xeb92a1, 0xeb92a2, 0xeb92a3, 0xeb92a5,
+ /* a1 */ 0xeb92a6, 0xeb92a7, 0xeb92a9, 0xeb92aa,
+ /* a5 */ 0xeb92ab, 0xeb92ad, 0xeb92ae, 0xeb92af,
+ /* a9 */ 0xeb92b0, 0xeb92b1, 0xeb92b2, 0xeb92b3,
+ /* ad */ 0xeb92b4, 0xeb92b6, 0xeb92b8, 0xeb92ba,
+ /* b1 */ 0xeb92bb, 0xeb92bc, 0xeb92bd, 0xeb92be,
+ /* b5 */ 0xeb92bf, 0xeb9381, 0xeb9382, 0xeb9383,
+ /* b9 */ 0xeb9385, 0xeb9386, 0xeb9387, 0xeb9389,
+ /* bd */ 0xeb938a, 0xeb938b, 0xeb938c, 0xeb938d,
+ /* c1 */ 0xeb938e, 0xeb938f, 0xeb9391, 0xeb9392,
+ /* c5 */ 0xeb9393, 0xeb9394, 0xeb9396, 0xeb9397,
+ /* c9 */ 0xeb9398, 0xeb9399, 0xeb939a, 0xeb939b,
+ /* cd */ 0xeb939e, 0xeb939f, 0xeb93a1, 0xeb93a2,
+ /* d1 */ 0xeb93a5, 0xeb93a7, 0xeb93a8, 0xeb93a9,
+ /* d5 */ 0xeb93aa, 0xeb93ab, 0xeb93ae, 0xeb93b0,
+ /* d9 */ 0xeb93b2, 0xeb93b3, 0xeb93b4, 0xeb93b5,
+ /* dd */ 0xeb93b6, 0xeb93b7, 0xeb93b9, 0xeb93ba,
+ /* e1 */ 0xeb93bb, 0xeb93bc, 0xeb93bd, 0xeb93be,
+ /* e5 */ 0xeb93bf, 0xeb9480, 0xeb9481, 0xeb9482,
+ /* e9 */ 0xeb9483, 0xeb9484, 0xeb9485, 0xeb9486,
+ /* ed */ 0xeb9487, 0xeb9488, 0xeb9489, 0xeb948a,
+ /* f1 */ 0xeb948b, 0xeb948c, 0xeb948d, 0xeb948e,
+ /* f5 */ 0xeb948f, 0xeb9490, 0xeb9491, 0xeb9492,
+ /* f9 */ 0xeb9493, 0xeb9496, 0xeb9497, 0xeb9499,
+ /* fd */ 0xeb949a, 0xeb949d,
+
+ /*** Two byte table, leaf: 8bxx - offset 0x008a8 ***/
+
+ /* 41 */ 0xeb949e, 0xeb949f, 0xeb94a0, 0xeb94a1,
+ /* 45 */ 0xeb94a2, 0xeb94a3, 0xeb94a6, 0xeb94ab,
+ /* 49 */ 0xeb94ac, 0xeb94ad, 0xeb94ae, 0xeb94af,
+ /* 4d */ 0xeb94b2, 0xeb94b3, 0xeb94b5, 0xeb94b6,
+ /* 51 */ 0xeb94b7, 0xeb94b9, 0xeb94ba, 0xeb94bb,
+ /* 55 */ 0xeb94bc, 0xeb94bd, 0xeb94be, 0xeb94bf,
+ /* 59 */ 0xeb9582, 0xeb9586, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9587, 0xeb9588, 0xeb9589, 0xeb958a,
+ /* 65 */ 0xeb958e, 0xeb958f, 0xeb9591, 0xeb9592,
+ /* 69 */ 0xeb9593, 0xeb9595, 0xeb9596, 0xeb9597,
+ /* 6d */ 0xeb9598, 0xeb9599, 0xeb959a, 0xeb959b,
+ /* 71 */ 0xeb959e, 0xeb95a2, 0xeb95a3, 0xeb95a4,
+ /* 75 */ 0xeb95a5, 0xeb95a6, 0xeb95a7, 0xeb95a8,
+ /* 79 */ 0xeb95a9, 0xeb95aa, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb95ab, 0xeb95ac, 0xeb95ad, 0xeb95ae,
+ /* 85 */ 0xeb95af, 0xeb95b0, 0xeb95b1, 0xeb95b2,
+ /* 89 */ 0xeb95b3, 0xeb95b4, 0xeb95b5, 0xeb95b6,
+ /* 8d */ 0xeb95b7, 0xeb95b8, 0xeb95b9, 0xeb95ba,
+ /* 91 */ 0xeb95bb, 0xeb95bc, 0xeb95bd, 0xeb95be,
+ /* 95 */ 0xeb95bf, 0xeb9680, 0xeb9681, 0xeb9682,
+ /* 99 */ 0xeb9683, 0xeb9684, 0xeb9685, 0xeb9686,
+ /* 9d */ 0xeb9687, 0xeb9688, 0xeb9689, 0xeb968a,
+ /* a1 */ 0xeb968b, 0xeb968c, 0xeb968d, 0xeb968e,
+ /* a5 */ 0xeb968f, 0xeb9690, 0xeb9691, 0xeb9692,
+ /* a9 */ 0xeb9693, 0xeb9694, 0xeb9695, 0xeb9696,
+ /* ad */ 0xeb9697, 0xeb9698, 0xeb9699, 0xeb969a,
+ /* b1 */ 0xeb969b, 0xeb969c, 0xeb969d, 0xeb969e,
+ /* b5 */ 0xeb969f, 0xeb96a2, 0xeb96a3, 0xeb96a5,
+ /* b9 */ 0xeb96a6, 0xeb96a7, 0xeb96a9, 0xeb96ac,
+ /* bd */ 0xeb96ad, 0xeb96ae, 0xeb96af, 0xeb96b2,
+ /* c1 */ 0xeb96b6, 0xeb96b7, 0xeb96b8, 0xeb96b9,
+ /* c5 */ 0xeb96ba, 0xeb96be, 0xeb96bf, 0xeb9781,
+ /* c9 */ 0xeb9782, 0xeb9783, 0xeb9785, 0xeb9786,
+ /* cd */ 0xeb9787, 0xeb9788, 0xeb9789, 0xeb978a,
+ /* d1 */ 0xeb978b, 0xeb978e, 0xeb9792, 0xeb9793,
+ /* d5 */ 0xeb9794, 0xeb9795, 0xeb9796, 0xeb9797,
+ /* d9 */ 0xeb9799, 0xeb979a, 0xeb979b, 0xeb979c,
+ /* dd */ 0xeb979d, 0xeb979e, 0xeb979f, 0xeb97a0,
+ /* e1 */ 0xeb97a1, 0xeb97a2, 0xeb97a3, 0xeb97a4,
+ /* e5 */ 0xeb97a5, 0xeb97a6, 0xeb97a7, 0xeb97a8,
+ /* e9 */ 0xeb97a9, 0xeb97aa, 0xeb97ab, 0xeb97ad,
+ /* ed */ 0xeb97ae, 0xeb97af, 0xeb97b0, 0xeb97b1,
+ /* f1 */ 0xeb97b2, 0xeb97b3, 0xeb97b4, 0xeb97b5,
+ /* f5 */ 0xeb97b6, 0xeb97b7, 0xeb97b8, 0xeb97b9,
+ /* f9 */ 0xeb97ba, 0xeb97bb, 0xeb97bc, 0xeb97bd,
+ /* fd */ 0xeb97be, 0xeb97bf,
+
+ /*** Two byte table, leaf: 8cxx - offset 0x00966 ***/
+
+ /* 41 */ 0xeb9880, 0xeb9881, 0xeb9882, 0xeb9883,
+ /* 45 */ 0xeb9884, 0xeb9885, 0xeb9886, 0xeb9887,
+ /* 49 */ 0xeb9888, 0xeb9889, 0xeb988a, 0xeb988b,
+ /* 4d */ 0xeb988c, 0xeb988d, 0xeb988e, 0xeb988f,
+ /* 51 */ 0xeb9892, 0xeb9893, 0xeb9895, 0xeb9896,
+ /* 55 */ 0xeb9897, 0xeb9899, 0xeb989a, 0xeb989b,
+ /* 59 */ 0xeb989c, 0xeb989d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb989e, 0xeb989f, 0xeb98a0, 0xeb98a1,
+ /* 65 */ 0xeb98a2, 0xeb98a3, 0xeb98a4, 0xeb98a6,
+ /* 69 */ 0xeb98a7, 0xeb98a8, 0xeb98a9, 0xeb98aa,
+ /* 6d */ 0xeb98ab, 0xeb98ad, 0xeb98ae, 0xeb98af,
+ /* 71 */ 0xeb98b0, 0xeb98b1, 0xeb98b2, 0xeb98b3,
+ /* 75 */ 0xeb98b5, 0xeb98b6, 0xeb98b7, 0xeb98b8,
+ /* 79 */ 0xeb98b9, 0xeb98ba, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb98bb, 0xeb98bc, 0xeb98bd, 0xeb98be,
+ /* 85 */ 0xeb98bf, 0xeb9980, 0xeb9981, 0xeb9982,
+ /* 89 */ 0xeb9983, 0xeb9984, 0xeb9985, 0xeb9986,
+ /* 8d */ 0xeb9987, 0xeb9989, 0xeb998a, 0xeb998b,
+ /* 91 */ 0xeb998c, 0xeb998d, 0xeb998e, 0xeb998f,
+ /* 95 */ 0xeb9990, 0xeb9991, 0xeb9992, 0xeb9993,
+ /* 99 */ 0xeb9994, 0xeb9995, 0xeb9996, 0xeb9997,
+ /* 9d */ 0xeb9998, 0xeb9999, 0xeb999a, 0xeb999b,
+ /* a1 */ 0xeb999c, 0xeb999d, 0xeb999e, 0xeb999f,
+ /* a5 */ 0xeb99a0, 0xeb99a1, 0xeb99a2, 0xeb99a3,
+ /* a9 */ 0xeb99a5, 0xeb99a6, 0xeb99a7, 0xeb99a9,
+ /* ad */ 0xeb99aa, 0xeb99ab, 0xeb99ac, 0xeb99ad,
+ /* b1 */ 0xeb99ae, 0xeb99af, 0xeb99b0, 0xeb99b1,
+ /* b5 */ 0xeb99b2, 0xeb99b3, 0xeb99b4, 0xeb99b5,
+ /* b9 */ 0xeb99b6, 0xeb99b7, 0xeb99b8, 0xeb99b9,
+ /* bd */ 0xeb99ba, 0xeb99bb, 0xeb99bc, 0xeb99bd,
+ /* c1 */ 0xeb99be, 0xeb99bf, 0xeb9a80, 0xeb9a81,
+ /* c5 */ 0xeb9a82, 0xeb9a83, 0xeb9a84, 0xeb9a85,
+ /* c9 */ 0xeb9a86, 0xeb9a87, 0xeb9a88, 0xeb9a89,
+ /* cd */ 0xeb9a8a, 0xeb9a8b, 0xeb9a8c, 0xeb9a8d,
+ /* d1 */ 0xeb9a8e, 0xeb9a8f, 0xeb9a90, 0xeb9a91,
+ /* d5 */ 0xeb9a92, 0xeb9a93, 0xeb9a94, 0xeb9a95,
+ /* d9 */ 0xeb9a96, 0xeb9a97, 0xeb9a98, 0xeb9a99,
+ /* dd */ 0xeb9a9a, 0xeb9a9b, 0xeb9a9e, 0xeb9a9f,
+ /* e1 */ 0xeb9aa1, 0xeb9aa2, 0xeb9aa3, 0xeb9aa5,
+ /* e5 */ 0xeb9aa6, 0xeb9aa7, 0xeb9aa8, 0xeb9aa9,
+ /* e9 */ 0xeb9aaa, 0xeb9aad, 0xeb9aae, 0xeb9aaf,
+ /* ed */ 0xeb9ab0, 0xeb9ab2, 0xeb9ab3, 0xeb9ab4,
+ /* f1 */ 0xeb9ab5, 0xeb9ab6, 0xeb9ab7, 0xeb9ab8,
+ /* f5 */ 0xeb9ab9, 0xeb9aba, 0xeb9abb, 0xeb9abc,
+ /* f9 */ 0xeb9abd, 0xeb9abe, 0xeb9abf, 0xeb9b80,
+ /* fd */ 0xeb9b81, 0xeb9b82,
+
+ /*** Two byte table, leaf: 8dxx - offset 0x00a24 ***/
+
+ /* 41 */ 0xeb9b83, 0xeb9b84, 0xeb9b85, 0xeb9b86,
+ /* 45 */ 0xeb9b87, 0xeb9b88, 0xeb9b89, 0xeb9b8a,
+ /* 49 */ 0xeb9b8b, 0xeb9b8c, 0xeb9b8d, 0xeb9b8e,
+ /* 4d */ 0xeb9b8f, 0xeb9b90, 0xeb9b91, 0xeb9b92,
+ /* 51 */ 0xeb9b93, 0xeb9b95, 0xeb9b96, 0xeb9b97,
+ /* 55 */ 0xeb9b98, 0xeb9b99, 0xeb9b9a, 0xeb9b9b,
+ /* 59 */ 0xeb9b9c, 0xeb9b9d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9b9e, 0xeb9b9f, 0xeb9ba0, 0xeb9ba1,
+ /* 65 */ 0xeb9ba2, 0xeb9ba3, 0xeb9ba4, 0xeb9ba5,
+ /* 69 */ 0xeb9ba6, 0xeb9ba7, 0xeb9ba8, 0xeb9ba9,
+ /* 6d */ 0xeb9baa, 0xeb9bab, 0xeb9bac, 0xeb9bad,
+ /* 71 */ 0xeb9bae, 0xeb9baf, 0xeb9bb1, 0xeb9bb2,
+ /* 75 */ 0xeb9bb3, 0xeb9bb5, 0xeb9bb6, 0xeb9bb7,
+ /* 79 */ 0xeb9bb9, 0xeb9bba, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9bbb, 0xeb9bbc, 0xeb9bbd, 0xeb9bbe,
+ /* 85 */ 0xeb9bbf, 0xeb9c82, 0xeb9c83, 0xeb9c84,
+ /* 89 */ 0xeb9c86, 0xeb9c87, 0xeb9c88, 0xeb9c89,
+ /* 8d */ 0xeb9c8a, 0xeb9c8b, 0xeb9c8c, 0xeb9c8d,
+ /* 91 */ 0xeb9c8e, 0xeb9c8f, 0xeb9c90, 0xeb9c91,
+ /* 95 */ 0xeb9c92, 0xeb9c93, 0xeb9c94, 0xeb9c95,
+ /* 99 */ 0xeb9c96, 0xeb9c97, 0xeb9c98, 0xeb9c99,
+ /* 9d */ 0xeb9c9a, 0xeb9c9b, 0xeb9c9c, 0xeb9c9d,
+ /* a1 */ 0xeb9c9e, 0xeb9c9f, 0xeb9ca0, 0xeb9ca1,
+ /* a5 */ 0xeb9ca2, 0xeb9ca3, 0xeb9ca4, 0xeb9ca5,
+ /* a9 */ 0xeb9ca6, 0xeb9ca7, 0xeb9caa, 0xeb9cab,
+ /* ad */ 0xeb9cad, 0xeb9cae, 0xeb9cb1, 0xeb9cb2,
+ /* b1 */ 0xeb9cb3, 0xeb9cb4, 0xeb9cb5, 0xeb9cb6,
+ /* b5 */ 0xeb9cb7, 0xeb9cba, 0xeb9cbc, 0xeb9cbd,
+ /* b9 */ 0xeb9cbe, 0xeb9cbf, 0xeb9d80, 0xeb9d81,
+ /* bd */ 0xeb9d82, 0xeb9d83, 0xeb9d85, 0xeb9d86,
+ /* c1 */ 0xeb9d87, 0xeb9d89, 0xeb9d8a, 0xeb9d8b,
+ /* c5 */ 0xeb9d8d, 0xeb9d8e, 0xeb9d8f, 0xeb9d90,
+ /* c9 */ 0xeb9d91, 0xeb9d92, 0xeb9d93, 0xeb9d96,
+ /* cd */ 0xeb9d97, 0xeb9d98, 0xeb9d99, 0xeb9d9a,
+ /* d1 */ 0xeb9d9b, 0xeb9d9c, 0xeb9d9d, 0xeb9d9e,
+ /* d5 */ 0xeb9d9f, 0xeb9da1, 0xeb9da2, 0xeb9da3,
+ /* d9 */ 0xeb9da5, 0xeb9da6, 0xeb9da7, 0xeb9da9,
+ /* dd */ 0xeb9daa, 0xeb9dab, 0xeb9dac, 0xeb9dad,
+ /* e1 */ 0xeb9dae, 0xeb9daf, 0xeb9db2, 0xeb9db4,
+ /* e5 */ 0xeb9db6, 0xeb9db7, 0xeb9db8, 0xeb9db9,
+ /* e9 */ 0xeb9dba, 0xeb9dbb, 0xeb9dbe, 0xeb9dbf,
+ /* ed */ 0xeb9e81, 0xeb9e82, 0xeb9e83, 0xeb9e85,
+ /* f1 */ 0xeb9e86, 0xeb9e87, 0xeb9e88, 0xeb9e89,
+ /* f5 */ 0xeb9e8a, 0xeb9e8b, 0xeb9e8e, 0xeb9e93,
+ /* f9 */ 0xeb9e94, 0xeb9e95, 0xeb9e9a, 0xeb9e9b,
+ /* fd */ 0xeb9e9d, 0xeb9e9e,
+
+ /*** Two byte table, leaf: 8exx - offset 0x00ae2 ***/
+
+ /* 41 */ 0xeb9e9f, 0xeb9ea1, 0xeb9ea2, 0xeb9ea3,
+ /* 45 */ 0xeb9ea4, 0xeb9ea5, 0xeb9ea6, 0xeb9ea7,
+ /* 49 */ 0xeb9eaa, 0xeb9eae, 0xeb9eaf, 0xeb9eb0,
+ /* 4d */ 0xeb9eb1, 0xeb9eb2, 0xeb9eb3, 0xeb9eb6,
+ /* 51 */ 0xeb9eb7, 0xeb9eb9, 0xeb9eba, 0xeb9ebb,
+ /* 55 */ 0xeb9ebc, 0xeb9ebd, 0xeb9ebe, 0xeb9ebf,
+ /* 59 */ 0xeb9f80, 0xeb9f81, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeb9f82, 0xeb9f83, 0xeb9f84, 0xeb9f85,
+ /* 65 */ 0xeb9f86, 0xeb9f88, 0xeb9f8a, 0xeb9f8b,
+ /* 69 */ 0xeb9f8c, 0xeb9f8d, 0xeb9f8e, 0xeb9f8f,
+ /* 6d */ 0xeb9f90, 0xeb9f91, 0xeb9f92, 0xeb9f93,
+ /* 71 */ 0xeb9f94, 0xeb9f95, 0xeb9f96, 0xeb9f97,
+ /* 75 */ 0xeb9f98, 0xeb9f99, 0xeb9f9a, 0xeb9f9b,
+ /* 79 */ 0xeb9f9c, 0xeb9f9d, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeb9f9e, 0xeb9f9f, 0xeb9fa0, 0xeb9fa1,
+ /* 85 */ 0xeb9fa2, 0xeb9fa3, 0xeb9fa4, 0xeb9fa5,
+ /* 89 */ 0xeb9fa6, 0xeb9fa7, 0xeb9fa8, 0xeb9fa9,
+ /* 8d */ 0xeb9faa, 0xeb9fab, 0xeb9fae, 0xeb9faf,
+ /* 91 */ 0xeb9fb1, 0xeb9fb2, 0xeb9fb3, 0xeb9fb5,
+ /* 95 */ 0xeb9fb6, 0xeb9fb7, 0xeb9fb8, 0xeb9fb9,
+ /* 99 */ 0xeb9fba, 0xeb9fbb, 0xeb9fbe, 0xeba082,
+ /* 9d */ 0xeba083, 0xeba084, 0xeba085, 0xeba086,
+ /* a1 */ 0xeba08a, 0xeba08b, 0xeba08d, 0xeba08e,
+ /* a5 */ 0xeba08f, 0xeba091, 0xeba092, 0xeba093,
+ /* a9 */ 0xeba094, 0xeba095, 0xeba096, 0xeba097,
+ /* ad */ 0xeba09a, 0xeba09c, 0xeba09e, 0xeba09f,
+ /* b1 */ 0xeba0a0, 0xeba0a1, 0xeba0a2, 0xeba0a3,
+ /* b5 */ 0xeba0a6, 0xeba0a7, 0xeba0a9, 0xeba0aa,
+ /* b9 */ 0xeba0ab, 0xeba0ad, 0xeba0ae, 0xeba0af,
+ /* bd */ 0xeba0b0, 0xeba0b1, 0xeba0b2, 0xeba0b3,
+ /* c1 */ 0xeba0b6, 0xeba0ba, 0xeba0bb, 0xeba0bc,
+ /* c5 */ 0xeba0bd, 0xeba0be, 0xeba0bf, 0xeba181,
+ /* c9 */ 0xeba182, 0xeba183, 0xeba185, 0xeba186,
+ /* cd */ 0xeba187, 0xeba188, 0xeba189, 0xeba18a,
+ /* d1 */ 0xeba18b, 0xeba18c, 0xeba18d, 0xeba18e,
+ /* d5 */ 0xeba18f, 0xeba190, 0xeba192, 0xeba194,
+ /* d9 */ 0xeba195, 0xeba196, 0xeba197, 0xeba198,
+ /* dd */ 0xeba199, 0xeba19a, 0xeba19b, 0xeba19e,
+ /* e1 */ 0xeba19f, 0xeba1a1, 0xeba1a2, 0xeba1a3,
+ /* e5 */ 0xeba1a5, 0xeba1a6, 0xeba1a7, 0xeba1a8,
+ /* e9 */ 0xeba1a9, 0xeba1aa, 0xeba1ab, 0xeba1ae,
+ /* ed */ 0xeba1b0, 0xeba1b2, 0xeba1b3, 0xeba1b4,
+ /* f1 */ 0xeba1b5, 0xeba1b6, 0xeba1b7, 0xeba1b9,
+ /* f5 */ 0xeba1ba, 0xeba1bb, 0xeba1bd, 0xeba1be,
+ /* f9 */ 0xeba1bf, 0xeba280, 0xeba281, 0xeba282,
+ /* fd */ 0xeba283, 0xeba284,
+
+ /*** Two byte table, leaf: 8fxx - offset 0x00ba0 ***/
+
+ /* 41 */ 0xeba285, 0xeba286, 0xeba287, 0xeba288,
+ /* 45 */ 0xeba289, 0xeba28a, 0xeba28b, 0xeba28c,
+ /* 49 */ 0xeba28e, 0xeba28f, 0xeba290, 0xeba291,
+ /* 4d */ 0xeba292, 0xeba293, 0xeba294, 0xeba295,
+ /* 51 */ 0xeba296, 0xeba297, 0xeba298, 0xeba299,
+ /* 55 */ 0xeba29a, 0xeba29b, 0xeba29c, 0xeba29d,
+ /* 59 */ 0xeba29e, 0xeba29f, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba2a0, 0xeba2a1, 0xeba2a2, 0xeba2a3,
+ /* 65 */ 0xeba2a4, 0xeba2a5, 0xeba2a6, 0xeba2a7,
+ /* 69 */ 0xeba2a9, 0xeba2aa, 0xeba2ab, 0xeba2ac,
+ /* 6d */ 0xeba2ad, 0xeba2ae, 0xeba2af, 0xeba2b1,
+ /* 71 */ 0xeba2b2, 0xeba2b3, 0xeba2b5, 0xeba2b6,
+ /* 75 */ 0xeba2b7, 0xeba2b9, 0xeba2ba, 0xeba2bb,
+ /* 79 */ 0xeba2bc, 0xeba2bd, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba2be, 0xeba2bf, 0xeba382, 0xeba384,
+ /* 85 */ 0xeba386, 0xeba387, 0xeba388, 0xeba389,
+ /* 89 */ 0xeba38a, 0xeba38b, 0xeba38d, 0xeba38e,
+ /* 8d */ 0xeba38f, 0xeba391, 0xeba392, 0xeba393,
+ /* 91 */ 0xeba395, 0xeba396, 0xeba397, 0xeba398,
+ /* 95 */ 0xeba399, 0xeba39a, 0xeba39b, 0xeba39c,
+ /* 99 */ 0xeba39e, 0xeba3a0, 0xeba3a2, 0xeba3a3,
+ /* 9d */ 0xeba3a4, 0xeba3a5, 0xeba3a6, 0xeba3a7,
+ /* a1 */ 0xeba3aa, 0xeba3ab, 0xeba3ad, 0xeba3ae,
+ /* a5 */ 0xeba3af, 0xeba3b1, 0xeba3b2, 0xeba3b3,
+ /* a9 */ 0xeba3b4, 0xeba3b5, 0xeba3b6, 0xeba3b7,
+ /* ad */ 0xeba3ba, 0xeba3bc, 0xeba3be, 0xeba3bf,
+ /* b1 */ 0xeba480, 0xeba481, 0xeba482, 0xeba483,
+ /* b5 */ 0xeba485, 0xeba486, 0xeba487, 0xeba488,
+ /* b9 */ 0xeba489, 0xeba48a, 0xeba48b, 0xeba48c,
+ /* bd */ 0xeba48d, 0xeba48e, 0xeba48f, 0xeba490,
+ /* c1 */ 0xeba491, 0xeba492, 0xeba493, 0xeba494,
+ /* c5 */ 0xeba495, 0xeba496, 0xeba497, 0xeba499,
+ /* c9 */ 0xeba49a, 0xeba49b, 0xeba49c, 0xeba49d,
+ /* cd */ 0xeba49e, 0xeba49f, 0xeba4a1, 0xeba4a2,
+ /* d1 */ 0xeba4a3, 0xeba4a4, 0xeba4a5, 0xeba4a6,
+ /* d5 */ 0xeba4a7, 0xeba4a8, 0xeba4a9, 0xeba4aa,
+ /* d9 */ 0xeba4ab, 0xeba4ac, 0xeba4ad, 0xeba4ae,
+ /* dd */ 0xeba4af, 0xeba4b0, 0xeba4b1, 0xeba4b2,
+ /* e1 */ 0xeba4b3, 0xeba4b4, 0xeba4b5, 0xeba4b6,
+ /* e5 */ 0xeba4b7, 0xeba4b8, 0xeba4b9, 0xeba4ba,
+ /* e9 */ 0xeba4bb, 0xeba4be, 0xeba4bf, 0xeba581,
+ /* ed */ 0xeba582, 0xeba583, 0xeba585, 0xeba586,
+ /* f1 */ 0xeba587, 0xeba588, 0xeba589, 0xeba58a,
+ /* f5 */ 0xeba58b, 0xeba58d, 0xeba58e, 0xeba590,
+ /* f9 */ 0xeba592, 0xeba593, 0xeba594, 0xeba595,
+ /* fd */ 0xeba596, 0xeba597,
+
+ /*** Two byte table, leaf: 90xx - offset 0x00c5e ***/
+
+ /* 41 */ 0xeba59a, 0xeba59b, 0xeba59d, 0xeba59e,
+ /* 45 */ 0xeba59f, 0xeba5a1, 0xeba5a2, 0xeba5a3,
+ /* 49 */ 0xeba5a4, 0xeba5a5, 0xeba5a6, 0xeba5a7,
+ /* 4d */ 0xeba5aa, 0xeba5ac, 0xeba5ae, 0xeba5af,
+ /* 51 */ 0xeba5b0, 0xeba5b1, 0xeba5b2, 0xeba5b3,
+ /* 55 */ 0xeba5b6, 0xeba5b7, 0xeba5b9, 0xeba5ba,
+ /* 59 */ 0xeba5bb, 0xeba5bd, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba5be, 0xeba5bf, 0xeba680, 0xeba681,
+ /* 65 */ 0xeba682, 0xeba683, 0xeba686, 0xeba688,
+ /* 69 */ 0xeba68b, 0xeba68c, 0xeba68f, 0xeba690,
+ /* 6d */ 0xeba691, 0xeba692, 0xeba693, 0xeba694,
+ /* 71 */ 0xeba695, 0xeba696, 0xeba697, 0xeba698,
+ /* 75 */ 0xeba699, 0xeba69a, 0xeba69b, 0xeba69c,
+ /* 79 */ 0xeba69d, 0xeba69e, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeba69f, 0xeba6a0, 0xeba6a1, 0xeba6a2,
+ /* 85 */ 0xeba6a3, 0xeba6a4, 0xeba6a5, 0xeba6a6,
+ /* 89 */ 0xeba6a7, 0xeba6a8, 0xeba6a9, 0xeba6aa,
+ /* 8d */ 0xeba6ab, 0xeba6ae, 0xeba6af, 0xeba6b1,
+ /* 91 */ 0xeba6b2, 0xeba6b3, 0xeba6b5, 0xeba6b6,
+ /* 95 */ 0xeba6b7, 0xeba6b8, 0xeba6b9, 0xeba6ba,
+ /* 99 */ 0xeba6bb, 0xeba6be, 0xeba780, 0xeba782,
+ /* 9d */ 0xeba783, 0xeba784, 0xeba785, 0xeba786,
+ /* a1 */ 0xeba787, 0xeba78a, 0xeba78b, 0xeba78d,
+ /* a5 */ 0xeba793, 0xeba794, 0xeba795, 0xeba796,
+ /* a9 */ 0xeba797, 0xeba79a, 0xeba79c, 0xeba79f,
+ /* ad */ 0xeba7a0, 0xeba7a2, 0xeba7a6, 0xeba7a7,
+ /* b1 */ 0xeba7a9, 0xeba7aa, 0xeba7ab, 0xeba7ad,
+ /* b5 */ 0xeba7ae, 0xeba7af, 0xeba7b0, 0xeba7b1,
+ /* b9 */ 0xeba7b2, 0xeba7b3, 0xeba7b6, 0xeba7bb,
+ /* bd */ 0xeba7bc, 0xeba7bd, 0xeba7be, 0xeba7bf,
+ /* c1 */ 0xeba882, 0xeba883, 0xeba884, 0xeba885,
+ /* c5 */ 0xeba886, 0xeba887, 0xeba889, 0xeba88a,
+ /* c9 */ 0xeba88b, 0xeba88c, 0xeba88d, 0xeba88e,
+ /* cd */ 0xeba88f, 0xeba890, 0xeba891, 0xeba892,
+ /* d1 */ 0xeba893, 0xeba894, 0xeba896, 0xeba897,
+ /* d5 */ 0xeba898, 0xeba899, 0xeba89a, 0xeba89b,
+ /* d9 */ 0xeba89c, 0xeba89d, 0xeba89e, 0xeba89f,
+ /* dd */ 0xeba8a0, 0xeba8a1, 0xeba8a2, 0xeba8a3,
+ /* e1 */ 0xeba8a4, 0xeba8a5, 0xeba8a6, 0xeba8a7,
+ /* e5 */ 0xeba8a8, 0xeba8a9, 0xeba8aa, 0xeba8ab,
+ /* e9 */ 0xeba8ac, 0xeba8ad, 0xeba8ae, 0xeba8af,
+ /* ed */ 0xeba8b0, 0xeba8b1, 0xeba8b2, 0xeba8b3,
+ /* f1 */ 0xeba8b4, 0xeba8b5, 0xeba8b6, 0xeba8b7,
+ /* f5 */ 0xeba8ba, 0xeba8bb, 0xeba8bd, 0xeba8be,
+ /* f9 */ 0xeba8bf, 0xeba981, 0xeba983, 0xeba984,
+ /* fd */ 0xeba985, 0xeba986,
+
+ /*** Two byte table, leaf: 91xx - offset 0x00d1c ***/
+
+ /* 41 */ 0xeba987, 0xeba98a, 0xeba98c, 0xeba98f,
+ /* 45 */ 0xeba990, 0xeba991, 0xeba992, 0xeba996,
+ /* 49 */ 0xeba997, 0xeba999, 0xeba99a, 0xeba99b,
+ /* 4d */ 0xeba99d, 0xeba99e, 0xeba99f, 0xeba9a0,
+ /* 51 */ 0xeba9a1, 0xeba9a2, 0xeba9a3, 0xeba9a6,
+ /* 55 */ 0xeba9aa, 0xeba9ab, 0xeba9ac, 0xeba9ad,
+ /* 59 */ 0xeba9ae, 0xeba9af, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeba9b2, 0xeba9b3, 0xeba9b5, 0xeba9b6,
+ /* 65 */ 0xeba9b7, 0xeba9b9, 0xeba9ba, 0xeba9bb,
+ /* 69 */ 0xeba9bc, 0xeba9bd, 0xeba9be, 0xeba9bf,
+ /* 6d */ 0xebaa80, 0xebaa81, 0xebaa82, 0xebaa86,
+ /* 71 */ 0xebaa88, 0xebaa89, 0xebaa8a, 0xebaa8b,
+ /* 75 */ 0xebaa8d, 0xebaa8e, 0xebaa8f, 0xebaa90,
+ /* 79 */ 0xebaa91, 0xebaa92, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebaa93, 0xebaa94, 0xebaa95, 0xebaa96,
+ /* 85 */ 0xebaa97, 0xebaa98, 0xebaa99, 0xebaa9a,
+ /* 89 */ 0xebaa9b, 0xebaa9c, 0xebaa9d, 0xebaa9e,
+ /* 8d */ 0xebaa9f, 0xebaaa0, 0xebaaa1, 0xebaaa2,
+ /* 91 */ 0xebaaa3, 0xebaaa4, 0xebaaa5, 0xebaaa6,
+ /* 95 */ 0xebaaa7, 0xebaaaa, 0xebaaad, 0xebaaae,
+ /* 99 */ 0xebaaaf, 0xebaab1, 0xebaab3, 0xebaab4,
+ /* 9d */ 0xebaab5, 0xebaab6, 0xebaab7, 0xebaaba,
+ /* a1 */ 0xebaabc, 0xebaabe, 0xebaabf, 0xebab80,
+ /* a5 */ 0xebab81, 0xebab82, 0xebab83, 0xebab85,
+ /* a9 */ 0xebab86, 0xebab87, 0xebab89, 0xebab8a,
+ /* ad */ 0xebab8b, 0xebab8c, 0xebab8d, 0xebab8e,
+ /* b1 */ 0xebab8f, 0xebab90, 0xebab91, 0xebab92,
+ /* b5 */ 0xebab93, 0xebab94, 0xebab95, 0xebab96,
+ /* b9 */ 0xebab97, 0xebab9a, 0xebab9b, 0xebab9c,
+ /* bd */ 0xebab9d, 0xebab9e, 0xebab9f, 0xebaba0,
+ /* c1 */ 0xebaba1, 0xebaba2, 0xebaba3, 0xebaba4,
+ /* c5 */ 0xebaba5, 0xebaba6, 0xebaba7, 0xebaba8,
+ /* c9 */ 0xebaba9, 0xebabaa, 0xebabab, 0xebabac,
+ /* cd */ 0xebabad, 0xebabae, 0xebabaf, 0xebabb0,
+ /* d1 */ 0xebabb1, 0xebabb2, 0xebabb3, 0xebabb4,
+ /* d5 */ 0xebabb5, 0xebabb6, 0xebabb7, 0xebabb8,
+ /* d9 */ 0xebabb9, 0xebabba, 0xebabbb, 0xebabbd,
+ /* dd */ 0xebabbe, 0xebabbf, 0xebac81, 0xebac82,
+ /* e1 */ 0xebac83, 0xebac85, 0xebac86, 0xebac87,
+ /* e5 */ 0xebac88, 0xebac89, 0xebac8a, 0xebac8b,
+ /* e9 */ 0xebac8c, 0xebac8e, 0xebac90, 0xebac92,
+ /* ed */ 0xebac93, 0xebac94, 0xebac95, 0xebac96,
+ /* f1 */ 0xebac97, 0xebac99, 0xebac9a, 0xebac9b,
+ /* f5 */ 0xebac9d, 0xebac9e, 0xebac9f, 0xebaca1,
+ /* f9 */ 0xebaca2, 0xebaca3, 0xebaca4, 0xebaca5,
+ /* fd */ 0xebaca6, 0xebaca7,
+
+ /*** Two byte table, leaf: 92xx - offset 0x00dda ***/
+
+ /* 41 */ 0xebaca8, 0xebacaa, 0xebacac, 0xebacad,
+ /* 45 */ 0xebacae, 0xebacaf, 0xebacb0, 0xebacb1,
+ /* 49 */ 0xebacb2, 0xebacb3, 0xebacb7, 0xebacb9,
+ /* 4d */ 0xebacba, 0xebacbf, 0xebad80, 0xebad81,
+ /* 51 */ 0xebad82, 0xebad83, 0xebad86, 0xebad88,
+ /* 55 */ 0xebad8a, 0xebad8b, 0xebad8c, 0xebad8e,
+ /* 59 */ 0xebad91, 0xebad92, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebad93, 0xebad95, 0xebad96, 0xebad97,
+ /* 65 */ 0xebad99, 0xebad9a, 0xebad9b, 0xebad9c,
+ /* 69 */ 0xebad9d, 0xebad9e, 0xebad9f, 0xebada0,
+ /* 6d */ 0xebada2, 0xebada4, 0xebada5, 0xebada6,
+ /* 71 */ 0xebada7, 0xebada8, 0xebada9, 0xebadaa,
+ /* 75 */ 0xebadab, 0xebadad, 0xebadae, 0xebadaf,
+ /* 79 */ 0xebadb0, 0xebadb1, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebadb2, 0xebadb3, 0xebadb4, 0xebadb5,
+ /* 85 */ 0xebadb6, 0xebadb7, 0xebadb8, 0xebadb9,
+ /* 89 */ 0xebadba, 0xebadbb, 0xebadbc, 0xebadbd,
+ /* 8d */ 0xebadbe, 0xebadbf, 0xebae80, 0xebae81,
+ /* 91 */ 0xebae82, 0xebae83, 0xebae84, 0xebae85,
+ /* 95 */ 0xebae86, 0xebae87, 0xebae89, 0xebae8a,
+ /* 99 */ 0xebae8b, 0xebae8d, 0xebae8e, 0xebae8f,
+ /* 9d */ 0xebae91, 0xebae92, 0xebae93, 0xebae94,
+ /* a1 */ 0xebae95, 0xebae96, 0xebae97, 0xebae98,
+ /* a5 */ 0xebae99, 0xebae9a, 0xebae9b, 0xebae9c,
+ /* a9 */ 0xebae9d, 0xebae9e, 0xebae9f, 0xebaea0,
+ /* ad */ 0xebaea1, 0xebaea2, 0xebaea3, 0xebaea5,
+ /* b1 */ 0xebaea6, 0xebaea7, 0xebaea9, 0xebaeaa,
+ /* b5 */ 0xebaeab, 0xebaead, 0xebaeae, 0xebaeaf,
+ /* b9 */ 0xebaeb0, 0xebaeb1, 0xebaeb2, 0xebaeb3,
+ /* bd */ 0xebaeb5, 0xebaeb6, 0xebaeb8, 0xebaeb9,
+ /* c1 */ 0xebaeba, 0xebaebb, 0xebaebc, 0xebaebd,
+ /* c5 */ 0xebaebe, 0xebaebf, 0xebaf81, 0xebaf82,
+ /* c9 */ 0xebaf83, 0xebaf85, 0xebaf86, 0xebaf87,
+ /* cd */ 0xebaf89, 0xebaf8a, 0xebaf8b, 0xebaf8c,
+ /* d1 */ 0xebaf8d, 0xebaf8e, 0xebaf8f, 0xebaf91,
+ /* d5 */ 0xebaf92, 0xebaf94, 0xebaf95, 0xebaf96,
+ /* d9 */ 0xebaf97, 0xebaf98, 0xebaf99, 0xebaf9a,
+ /* dd */ 0xebaf9b, 0xebaf9c, 0xebaf9d, 0xebaf9e,
+ /* e1 */ 0xebaf9f, 0xebafa0, 0xebafa1, 0xebafa2,
+ /* e5 */ 0xebafa3, 0xebafa4, 0xebafa5, 0xebafa6,
+ /* e9 */ 0xebafa7, 0xebafa8, 0xebafa9, 0xebafaa,
+ /* ed */ 0xebafab, 0xebafac, 0xebafad, 0xebafae,
+ /* f1 */ 0xebafaf, 0xebafb0, 0xebafb1, 0xebafb2,
+ /* f5 */ 0xebafb3, 0xebafb4, 0xebafb5, 0xebafb6,
+ /* f9 */ 0xebafb7, 0xebafba, 0xebafbb, 0xebafbd,
+ /* fd */ 0xebafbe, 0xebb081,
+
+ /*** Two byte table, leaf: 93xx - offset 0x00e98 ***/
+
+ /* 41 */ 0xebb083, 0xebb084, 0xebb085, 0xebb086,
+ /* 45 */ 0xebb087, 0xebb08a, 0xebb08e, 0xebb090,
+ /* 49 */ 0xebb092, 0xebb093, 0xebb099, 0xebb09a,
+ /* 4d */ 0xebb0a0, 0xebb0a1, 0xebb0a2, 0xebb0a3,
+ /* 51 */ 0xebb0a6, 0xebb0a8, 0xebb0aa, 0xebb0ab,
+ /* 55 */ 0xebb0ac, 0xebb0ae, 0xebb0af, 0xebb0b2,
+ /* 59 */ 0xebb0b3, 0xebb0b5, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb0b6, 0xebb0b7, 0xebb0b9, 0xebb0ba,
+ /* 65 */ 0xebb0bb, 0xebb0bc, 0xebb0bd, 0xebb0be,
+ /* 69 */ 0xebb0bf, 0xebb182, 0xebb186, 0xebb187,
+ /* 6d */ 0xebb188, 0xebb18a, 0xebb18b, 0xebb18e,
+ /* 71 */ 0xebb18f, 0xebb191, 0xebb192, 0xebb193,
+ /* 75 */ 0xebb194, 0xebb195, 0xebb196, 0xebb197,
+ /* 79 */ 0xebb198, 0xebb199, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb19a, 0xebb19b, 0xebb19c, 0xebb19e,
+ /* 85 */ 0xebb19f, 0xebb1a0, 0xebb1a1, 0xebb1a2,
+ /* 89 */ 0xebb1a3, 0xebb1a4, 0xebb1a5, 0xebb1a6,
+ /* 8d */ 0xebb1a7, 0xebb1a8, 0xebb1a9, 0xebb1aa,
+ /* 91 */ 0xebb1ab, 0xebb1ac, 0xebb1ad, 0xebb1ae,
+ /* 95 */ 0xebb1af, 0xebb1b0, 0xebb1b1, 0xebb1b2,
+ /* 99 */ 0xebb1b3, 0xebb1b4, 0xebb1b5, 0xebb1b6,
+ /* 9d */ 0xebb1b7, 0xebb1b8, 0xebb1b9, 0xebb1ba,
+ /* a1 */ 0xebb1bb, 0xebb1bc, 0xebb1bd, 0xebb1be,
+ /* a5 */ 0xebb1bf, 0xebb280, 0xebb281, 0xebb282,
+ /* a9 */ 0xebb283, 0xebb286, 0xebb287, 0xebb289,
+ /* ad */ 0xebb28a, 0xebb28d, 0xebb28f, 0xebb290,
+ /* b1 */ 0xebb291, 0xebb292, 0xebb293, 0xebb296,
+ /* b5 */ 0xebb298, 0xebb29b, 0xebb29c, 0xebb29d,
+ /* b9 */ 0xebb29e, 0xebb29f, 0xebb2a2, 0xebb2a3,
+ /* bd */ 0xebb2a5, 0xebb2a6, 0xebb2a9, 0xebb2aa,
+ /* c1 */ 0xebb2ab, 0xebb2ac, 0xebb2ad, 0xebb2ae,
+ /* c5 */ 0xebb2af, 0xebb2b2, 0xebb2b6, 0xebb2b7,
+ /* c9 */ 0xebb2b8, 0xebb2b9, 0xebb2ba, 0xebb2bb,
+ /* cd */ 0xebb2be, 0xebb2bf, 0xebb381, 0xebb382,
+ /* d1 */ 0xebb383, 0xebb385, 0xebb386, 0xebb387,
+ /* d5 */ 0xebb388, 0xebb389, 0xebb38a, 0xebb38b,
+ /* d9 */ 0xebb38c, 0xebb38e, 0xebb392, 0xebb393,
+ /* dd */ 0xebb394, 0xebb396, 0xebb397, 0xebb399,
+ /* e1 */ 0xebb39a, 0xebb39b, 0xebb39d, 0xebb39e,
+ /* e5 */ 0xebb39f, 0xebb3a0, 0xebb3a1, 0xebb3a2,
+ /* e9 */ 0xebb3a3, 0xebb3a4, 0xebb3a5, 0xebb3a6,
+ /* ed */ 0xebb3a7, 0xebb3a8, 0xebb3a9, 0xebb3aa,
+ /* f1 */ 0xebb3ab, 0xebb3ac, 0xebb3ad, 0xebb3ae,
+ /* f5 */ 0xebb3af, 0xebb3b0, 0xebb3b1, 0xebb3b2,
+ /* f9 */ 0xebb3b3, 0xebb3b7, 0xebb3b9, 0xebb3ba,
+ /* fd */ 0xebb3bb, 0xebb3bd,
+
+ /*** Two byte table, leaf: 94xx - offset 0x00f56 ***/
+
+ /* 41 */ 0xebb3be, 0xebb3bf, 0xebb480, 0xebb481,
+ /* 45 */ 0xebb482, 0xebb483, 0xebb486, 0xebb488,
+ /* 49 */ 0xebb48a, 0xebb48b, 0xebb48c, 0xebb48d,
+ /* 4d */ 0xebb48e, 0xebb48f, 0xebb491, 0xebb492,
+ /* 51 */ 0xebb493, 0xebb495, 0xebb496, 0xebb497,
+ /* 55 */ 0xebb498, 0xebb499, 0xebb49a, 0xebb49b,
+ /* 59 */ 0xebb49c, 0xebb49d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb49e, 0xebb49f, 0xebb4a0, 0xebb4a1,
+ /* 65 */ 0xebb4a2, 0xebb4a3, 0xebb4a5, 0xebb4a6,
+ /* 69 */ 0xebb4a7, 0xebb4a8, 0xebb4a9, 0xebb4aa,
+ /* 6d */ 0xebb4ab, 0xebb4ad, 0xebb4ae, 0xebb4af,
+ /* 71 */ 0xebb4b0, 0xebb4b1, 0xebb4b2, 0xebb4b3,
+ /* 75 */ 0xebb4b4, 0xebb4b5, 0xebb4b6, 0xebb4b7,
+ /* 79 */ 0xebb4b8, 0xebb4b9, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb4ba, 0xebb4bb, 0xebb4bc, 0xebb4bd,
+ /* 85 */ 0xebb4be, 0xebb4bf, 0xebb581, 0xebb582,
+ /* 89 */ 0xebb583, 0xebb584, 0xebb585, 0xebb586,
+ /* 8d */ 0xebb587, 0xebb58a, 0xebb58b, 0xebb58d,
+ /* 91 */ 0xebb58e, 0xebb58f, 0xebb591, 0xebb592,
+ /* 95 */ 0xebb593, 0xebb594, 0xebb595, 0xebb596,
+ /* 99 */ 0xebb597, 0xebb59a, 0xebb59b, 0xebb59c,
+ /* 9d */ 0xebb59d, 0xebb59e, 0xebb59f, 0xebb5a0,
+ /* a1 */ 0xebb5a1, 0xebb5a2, 0xebb5a3, 0xebb5a5,
+ /* a5 */ 0xebb5a6, 0xebb5a7, 0xebb5a9, 0xebb5aa,
+ /* a9 */ 0xebb5ab, 0xebb5ac, 0xebb5ad, 0xebb5ae,
+ /* ad */ 0xebb5af, 0xebb5b0, 0xebb5b1, 0xebb5b2,
+ /* b1 */ 0xebb5b3, 0xebb5b4, 0xebb5b5, 0xebb5b6,
+ /* b5 */ 0xebb5b7, 0xebb5b8, 0xebb5b9, 0xebb5ba,
+ /* b9 */ 0xebb5bb, 0xebb5bc, 0xebb5bd, 0xebb5be,
+ /* bd */ 0xebb5bf, 0xebb682, 0xebb683, 0xebb685,
+ /* c1 */ 0xebb686, 0xebb68b, 0xebb68c, 0xebb68d,
+ /* c5 */ 0xebb68e, 0xebb68f, 0xebb692, 0xebb694,
+ /* c9 */ 0xebb696, 0xebb697, 0xebb698, 0xebb69b,
+ /* cd */ 0xebb69d, 0xebb69e, 0xebb69f, 0xebb6a0,
+ /* d1 */ 0xebb6a1, 0xebb6a2, 0xebb6a3, 0xebb6a5,
+ /* d5 */ 0xebb6a6, 0xebb6a7, 0xebb6a8, 0xebb6a9,
+ /* d9 */ 0xebb6aa, 0xebb6ab, 0xebb6ac, 0xebb6ad,
+ /* dd */ 0xebb6ae, 0xebb6af, 0xebb6b1, 0xebb6b2,
+ /* e1 */ 0xebb6b3, 0xebb6b4, 0xebb6b5, 0xebb6b6,
+ /* e5 */ 0xebb6b7, 0xebb6b9, 0xebb6ba, 0xebb6bb,
+ /* e9 */ 0xebb6bc, 0xebb6bd, 0xebb6be, 0xebb6bf,
+ /* ed */ 0xebb780, 0xebb781, 0xebb782, 0xebb783,
+ /* f1 */ 0xebb784, 0xebb785, 0xebb786, 0xebb787,
+ /* f5 */ 0xebb788, 0xebb789, 0xebb78a, 0xebb78b,
+ /* f9 */ 0xebb78c, 0xebb78d, 0xebb78e, 0xebb78f,
+ /* fd */ 0xebb790, 0xebb791,
+
+ /*** Two byte table, leaf: 95xx - offset 0x01014 ***/
+
+ /* 41 */ 0xebb792, 0xebb793, 0xebb796, 0xebb797,
+ /* 45 */ 0xebb799, 0xebb79a, 0xebb79b, 0xebb79d,
+ /* 49 */ 0xebb79e, 0xebb79f, 0xebb7a0, 0xebb7a1,
+ /* 4d */ 0xebb7a2, 0xebb7a3, 0xebb7a4, 0xebb7a5,
+ /* 51 */ 0xebb7a6, 0xebb7a7, 0xebb7a8, 0xebb7aa,
+ /* 55 */ 0xebb7ab, 0xebb7ac, 0xebb7ad, 0xebb7ae,
+ /* 59 */ 0xebb7af, 0xebb7b1, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebb7b2, 0xebb7b3, 0xebb7b5, 0xebb7b6,
+ /* 65 */ 0xebb7b7, 0xebb7b9, 0xebb7ba, 0xebb7bb,
+ /* 69 */ 0xebb7bc, 0xebb7bd, 0xebb7be, 0xebb7bf,
+ /* 6d */ 0xebb881, 0xebb882, 0xebb884, 0xebb886,
+ /* 71 */ 0xebb887, 0xebb888, 0xebb889, 0xebb88a,
+ /* 75 */ 0xebb88b, 0xebb88e, 0xebb88f, 0xebb891,
+ /* 79 */ 0xebb892, 0xebb893, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebb895, 0xebb896, 0xebb897, 0xebb898,
+ /* 85 */ 0xebb899, 0xebb89a, 0xebb89b, 0xebb89e,
+ /* 89 */ 0xebb8a0, 0xebb8a1, 0xebb8a2, 0xebb8a3,
+ /* 8d */ 0xebb8a4, 0xebb8a5, 0xebb8a6, 0xebb8a7,
+ /* 91 */ 0xebb8a8, 0xebb8a9, 0xebb8aa, 0xebb8ab,
+ /* 95 */ 0xebb8ac, 0xebb8ad, 0xebb8ae, 0xebb8af,
+ /* 99 */ 0xebb8b0, 0xebb8b1, 0xebb8b2, 0xebb8b3,
+ /* 9d */ 0xebb8b4, 0xebb8b5, 0xebb8b6, 0xebb8b7,
+ /* a1 */ 0xebb8b8, 0xebb8b9, 0xebb8ba, 0xebb8bb,
+ /* a5 */ 0xebb8bc, 0xebb8bd, 0xebb8be, 0xebb8bf,
+ /* a9 */ 0xebb980, 0xebb981, 0xebb982, 0xebb983,
+ /* ad */ 0xebb986, 0xebb987, 0xebb989, 0xebb98a,
+ /* b1 */ 0xebb98b, 0xebb98d, 0xebb98f, 0xebb990,
+ /* b5 */ 0xebb991, 0xebb992, 0xebb993, 0xebb996,
+ /* b9 */ 0xebb998, 0xebb99c, 0xebb99d, 0xebb99e,
+ /* bd */ 0xebb99f, 0xebb9a2, 0xebb9a3, 0xebb9a5,
+ /* c1 */ 0xebb9a6, 0xebb9a7, 0xebb9a9, 0xebb9ab,
+ /* c5 */ 0xebb9ac, 0xebb9ad, 0xebb9ae, 0xebb9af,
+ /* c9 */ 0xebb9b2, 0xebb9b6, 0xebb9b7, 0xebb9b8,
+ /* cd */ 0xebb9b9, 0xebb9ba, 0xebb9be, 0xebb9bf,
+ /* d1 */ 0xebba81, 0xebba82, 0xebba83, 0xebba85,
+ /* d5 */ 0xebba86, 0xebba87, 0xebba88, 0xebba89,
+ /* d9 */ 0xebba8a, 0xebba8b, 0xebba8e, 0xebba92,
+ /* dd */ 0xebba93, 0xebba94, 0xebba95, 0xebba96,
+ /* e1 */ 0xebba97, 0xebba9a, 0xebba9b, 0xebba9c,
+ /* e5 */ 0xebba9d, 0xebba9e, 0xebba9f, 0xebbaa0,
+ /* e9 */ 0xebbaa1, 0xebbaa2, 0xebbaa3, 0xebbaa4,
+ /* ed */ 0xebbaa5, 0xebbaa6, 0xebbaa7, 0xebbaa9,
+ /* f1 */ 0xebbaaa, 0xebbaab, 0xebbaac, 0xebbaad,
+ /* f5 */ 0xebbaae, 0xebbaaf, 0xebbab0, 0xebbab1,
+ /* f9 */ 0xebbab2, 0xebbab3, 0xebbab4, 0xebbab5,
+ /* fd */ 0xebbab6, 0xebbab7,
+
+ /*** Two byte table, leaf: 96xx - offset 0x010d2 ***/
+
+ /* 41 */ 0xebbab8, 0xebbab9, 0xebbaba, 0xebbabb,
+ /* 45 */ 0xebbabc, 0xebbabd, 0xebbabe, 0xebbabf,
+ /* 49 */ 0xebbb80, 0xebbb81, 0xebbb82, 0xebbb83,
+ /* 4d */ 0xebbb84, 0xebbb85, 0xebbb86, 0xebbb87,
+ /* 51 */ 0xebbb88, 0xebbb89, 0xebbb8a, 0xebbb8b,
+ /* 55 */ 0xebbb8c, 0xebbb8d, 0xebbb8e, 0xebbb8f,
+ /* 59 */ 0xebbb92, 0xebbb93, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebbb95, 0xebbb96, 0xebbb99, 0xebbb9a,
+ /* 65 */ 0xebbb9b, 0xebbb9c, 0xebbb9d, 0xebbb9e,
+ /* 69 */ 0xebbb9f, 0xebbba1, 0xebbba2, 0xebbba6,
+ /* 6d */ 0xebbba7, 0xebbba8, 0xebbba9, 0xebbbaa,
+ /* 71 */ 0xebbbab, 0xebbbad, 0xebbbae, 0xebbbaf,
+ /* 75 */ 0xebbbb0, 0xebbbb1, 0xebbbb2, 0xebbbb3,
+ /* 79 */ 0xebbbb4, 0xebbbb5, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebbbb6, 0xebbbb7, 0xebbbb8, 0xebbbb9,
+ /* 85 */ 0xebbbba, 0xebbbbb, 0xebbbbc, 0xebbbbd,
+ /* 89 */ 0xebbbbe, 0xebbbbf, 0xebbc80, 0xebbc82,
+ /* 8d */ 0xebbc83, 0xebbc84, 0xebbc85, 0xebbc86,
+ /* 91 */ 0xebbc87, 0xebbc8a, 0xebbc8b, 0xebbc8c,
+ /* 95 */ 0xebbc8d, 0xebbc8e, 0xebbc8f, 0xebbc90,
+ /* 99 */ 0xebbc91, 0xebbc92, 0xebbc93, 0xebbc94,
+ /* 9d */ 0xebbc95, 0xebbc96, 0xebbc97, 0xebbc9a,
+ /* a1 */ 0xebbc9e, 0xebbc9f, 0xebbca0, 0xebbca1,
+ /* a5 */ 0xebbca2, 0xebbca3, 0xebbca4, 0xebbca5,
+ /* a9 */ 0xebbca6, 0xebbca7, 0xebbca8, 0xebbca9,
+ /* ad */ 0xebbcaa, 0xebbcab, 0xebbcac, 0xebbcad,
+ /* b1 */ 0xebbcae, 0xebbcaf, 0xebbcb0, 0xebbcb1,
+ /* b5 */ 0xebbcb2, 0xebbcb3, 0xebbcb4, 0xebbcb5,
+ /* b9 */ 0xebbcb6, 0xebbcb7, 0xebbcb8, 0xebbcb9,
+ /* bd */ 0xebbcba, 0xebbcbb, 0xebbcbc, 0xebbcbd,
+ /* c1 */ 0xebbcbe, 0xebbcbf, 0xebbd82, 0xebbd83,
+ /* c5 */ 0xebbd85, 0xebbd86, 0xebbd87, 0xebbd89,
+ /* c9 */ 0xebbd8a, 0xebbd8b, 0xebbd8c, 0xebbd8d,
+ /* cd */ 0xebbd8e, 0xebbd8f, 0xebbd92, 0xebbd93,
+ /* d1 */ 0xebbd94, 0xebbd96, 0xebbd97, 0xebbd98,
+ /* d5 */ 0xebbd99, 0xebbd9a, 0xebbd9b, 0xebbd9c,
+ /* d9 */ 0xebbd9d, 0xebbd9e, 0xebbd9f, 0xebbda0,
+ /* dd */ 0xebbda1, 0xebbda2, 0xebbda3, 0xebbda4,
+ /* e1 */ 0xebbda5, 0xebbda6, 0xebbda7, 0xebbda8,
+ /* e5 */ 0xebbda9, 0xebbdaa, 0xebbdab, 0xebbdac,
+ /* e9 */ 0xebbdad, 0xebbdae, 0xebbdaf, 0xebbdb0,
+ /* ed */ 0xebbdb1, 0xebbdb2, 0xebbdb3, 0xebbdb4,
+ /* f1 */ 0xebbdb5, 0xebbdb6, 0xebbdb7, 0xebbdb8,
+ /* f5 */ 0xebbdb9, 0xebbdba, 0xebbdbb, 0xebbdbc,
+ /* f9 */ 0xebbdbd, 0xebbdbe, 0xebbdbf, 0xebbe80,
+ /* fd */ 0xebbe81, 0xebbe82,
+
+ /*** Two byte table, leaf: 97xx - offset 0x01190 ***/
+
+ /* 41 */ 0xebbe83, 0xebbe84, 0xebbe85, 0xebbe86,
+ /* 45 */ 0xebbe87, 0xebbe88, 0xebbe89, 0xebbe8a,
+ /* 49 */ 0xebbe8b, 0xebbe8c, 0xebbe8d, 0xebbe8e,
+ /* 4d */ 0xebbe8f, 0xebbe90, 0xebbe91, 0xebbe92,
+ /* 51 */ 0xebbe93, 0xebbe95, 0xebbe96, 0xebbe97,
+ /* 55 */ 0xebbe98, 0xebbe99, 0xebbe9a, 0xebbe9b,
+ /* 59 */ 0xebbe9c, 0xebbe9d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xebbe9e, 0xebbe9f, 0xebbea0, 0xebbea1,
+ /* 65 */ 0xebbea2, 0xebbea3, 0xebbea4, 0xebbea5,
+ /* 69 */ 0xebbea6, 0xebbea7, 0xebbea8, 0xebbea9,
+ /* 6d */ 0xebbeaa, 0xebbeab, 0xebbeac, 0xebbead,
+ /* 71 */ 0xebbeae, 0xebbeaf, 0xebbeb1, 0xebbeb2,
+ /* 75 */ 0xebbeb3, 0xebbeb4, 0xebbeb5, 0xebbeb6,
+ /* 79 */ 0xebbeb7, 0xebbeb8, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xebbeb9, 0xebbeba, 0xebbebb, 0xebbebc,
+ /* 85 */ 0xebbebd, 0xebbebe, 0xebbebf, 0xebbf80,
+ /* 89 */ 0xebbf81, 0xebbf82, 0xebbf83, 0xebbf84,
+ /* 8d */ 0xebbf86, 0xebbf87, 0xebbf88, 0xebbf89,
+ /* 91 */ 0xebbf8a, 0xebbf8b, 0xebbf8e, 0xebbf8f,
+ /* 95 */ 0xebbf91, 0xebbf92, 0xebbf93, 0xebbf95,
+ /* 99 */ 0xebbf96, 0xebbf97, 0xebbf98, 0xebbf99,
+ /* 9d */ 0xebbf9a, 0xebbf9b, 0xebbf9d, 0xebbf9e,
+ /* a1 */ 0xebbfa0, 0xebbfa2, 0xebbfa3, 0xebbfa4,
+ /* a5 */ 0xebbfa5, 0xebbfa6, 0xebbfa7, 0xebbfa8,
+ /* a9 */ 0xebbfa9, 0xebbfaa, 0xebbfab, 0xebbfac,
+ /* ad */ 0xebbfad, 0xebbfae, 0xebbfaf, 0xebbfb0,
+ /* b1 */ 0xebbfb1, 0xebbfb2, 0xebbfb3, 0xebbfb4,
+ /* b5 */ 0xebbfb5, 0xebbfb6, 0xebbfb7, 0xebbfb8,
+ /* b9 */ 0xebbfb9, 0xebbfba, 0xebbfbb, 0xebbfbc,
+ /* bd */ 0xebbfbd, 0xebbfbe, 0xebbfbf, 0xec8080,
+ /* c1 */ 0xec8081, 0xec8082, 0xec8083, 0xec8084,
+ /* c5 */ 0xec8085, 0xec8086, 0xec8087, 0xec8088,
+ /* c9 */ 0xec8089, 0xec808a, 0xec808b, 0xec808c,
+ /* cd */ 0xec808d, 0xec808e, 0xec808f, 0xec8090,
+ /* d1 */ 0xec8091, 0xec8092, 0xec8093, 0xec8094,
+ /* d5 */ 0xec8095, 0xec8096, 0xec8097, 0xec8098,
+ /* d9 */ 0xec8099, 0xec809a, 0xec809b, 0xec809c,
+ /* dd */ 0xec809d, 0xec809e, 0xec809f, 0xec80a0,
+ /* e1 */ 0xec80a1, 0xec80a2, 0xec80a3, 0xec80a4,
+ /* e5 */ 0xec80a5, 0xec80a6, 0xec80a7, 0xec80a8,
+ /* e9 */ 0xec80a9, 0xec80aa, 0xec80ab, 0xec80ac,
+ /* ed */ 0xec80ad, 0xec80ae, 0xec80af, 0xec80b0,
+ /* f1 */ 0xec80b1, 0xec80b2, 0xec80b3, 0xec80b4,
+ /* f5 */ 0xec80b5, 0xec80b6, 0xec80b7, 0xec80b8,
+ /* f9 */ 0xec80b9, 0xec80ba, 0xec80bb, 0xec80bd,
+ /* fd */ 0xec80be, 0xec80bf,
+
+ /*** Two byte table, leaf: 98xx - offset 0x0124e ***/
+
+ /* 41 */ 0xec8180, 0xec8181, 0xec8182, 0xec8183,
+ /* 45 */ 0xec8184, 0xec8185, 0xec8186, 0xec8187,
+ /* 49 */ 0xec8188, 0xec8189, 0xec818a, 0xec818b,
+ /* 4d */ 0xec818c, 0xec818d, 0xec818e, 0xec818f,
+ /* 51 */ 0xec8190, 0xec8192, 0xec8193, 0xec8194,
+ /* 55 */ 0xec8195, 0xec8196, 0xec8197, 0xec8199,
+ /* 59 */ 0xec819a, 0xec819b, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec819d, 0xec819e, 0xec819f, 0xec81a1,
+ /* 65 */ 0xec81a2, 0xec81a3, 0xec81a4, 0xec81a5,
+ /* 69 */ 0xec81a6, 0xec81a7, 0xec81aa, 0xec81ab,
+ /* 6d */ 0xec81ac, 0xec81ad, 0xec81ae, 0xec81af,
+ /* 71 */ 0xec81b0, 0xec81b1, 0xec81b2, 0xec81b3,
+ /* 75 */ 0xec81b4, 0xec81b5, 0xec81b6, 0xec81b7,
+ /* 79 */ 0xec81b8, 0xec81b9, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec81ba, 0xec81bb, 0xec81bc, 0xec81bd,
+ /* 85 */ 0xec81be, 0xec81bf, 0xec8280, 0xec8281,
+ /* 89 */ 0xec8282, 0xec8283, 0xec8284, 0xec8285,
+ /* 8d */ 0xec8286, 0xec8287, 0xec8288, 0xec8289,
+ /* 91 */ 0xec828a, 0xec828b, 0xec828c, 0xec828d,
+ /* 95 */ 0xec828e, 0xec828f, 0xec8292, 0xec8293,
+ /* 99 */ 0xec8295, 0xec8296, 0xec8297, 0xec8299,
+ /* 9d */ 0xec829a, 0xec829b, 0xec829c, 0xec829d,
+ /* a1 */ 0xec829e, 0xec829f, 0xec82a2, 0xec82a4,
+ /* a5 */ 0xec82a6, 0xec82a7, 0xec82a8, 0xec82a9,
+ /* a9 */ 0xec82aa, 0xec82ab, 0xec82ae, 0xec82b1,
+ /* ad */ 0xec82b2, 0xec82b7, 0xec82b8, 0xec82b9,
+ /* b1 */ 0xec82ba, 0xec82bb, 0xec82be, 0xec8382,
+ /* b5 */ 0xec8383, 0xec8384, 0xec8386, 0xec8387,
+ /* b9 */ 0xec838a, 0xec838b, 0xec838d, 0xec838e,
+ /* bd */ 0xec838f, 0xec8391, 0xec8392, 0xec8393,
+ /* c1 */ 0xec8394, 0xec8395, 0xec8396, 0xec8397,
+ /* c5 */ 0xec839a, 0xec839e, 0xec839f, 0xec83a0,
+ /* c9 */ 0xec83a1, 0xec83a2, 0xec83a3, 0xec83a6,
+ /* cd */ 0xec83a7, 0xec83a9, 0xec83aa, 0xec83ab,
+ /* d1 */ 0xec83ad, 0xec83ae, 0xec83af, 0xec83b0,
+ /* d5 */ 0xec83b1, 0xec83b2, 0xec83b3, 0xec83b6,
+ /* d9 */ 0xec83b8, 0xec83ba, 0xec83bb, 0xec83bc,
+ /* dd */ 0xec83bd, 0xec83be, 0xec83bf, 0xec8481,
+ /* e1 */ 0xec8482, 0xec8483, 0xec8485, 0xec8486,
+ /* e5 */ 0xec8487, 0xec8489, 0xec848a, 0xec848b,
+ /* e9 */ 0xec848c, 0xec848d, 0xec848e, 0xec848f,
+ /* ed */ 0xec8491, 0xec8492, 0xec8493, 0xec8494,
+ /* f1 */ 0xec8496, 0xec8497, 0xec8498, 0xec8499,
+ /* f5 */ 0xec849a, 0xec849b, 0xec84a1, 0xec84a2,
+ /* f9 */ 0xec84a5, 0xec84a8, 0xec84a9, 0xec84aa,
+ /* fd */ 0xec84ab, 0xec84ae,
+
+ /*** Two byte table, leaf: 99xx - offset 0x0130c ***/
+
+ /* 41 */ 0xec84b2, 0xec84b3, 0xec84b4, 0xec84b5,
+ /* 45 */ 0xec84b7, 0xec84ba, 0xec84bb, 0xec84bd,
+ /* 49 */ 0xec84be, 0xec84bf, 0xec8581, 0xec8582,
+ /* 4d */ 0xec8583, 0xec8584, 0xec8585, 0xec8586,
+ /* 51 */ 0xec8587, 0xec858a, 0xec858e, 0xec858f,
+ /* 55 */ 0xec8590, 0xec8591, 0xec8592, 0xec8593,
+ /* 59 */ 0xec8596, 0xec8597, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8599, 0xec859a, 0xec859b, 0xec859d,
+ /* 65 */ 0xec859e, 0xec859f, 0xec85a0, 0xec85a1,
+ /* 69 */ 0xec85a2, 0xec85a3, 0xec85a6, 0xec85aa,
+ /* 6d */ 0xec85ab, 0xec85ac, 0xec85ad, 0xec85ae,
+ /* 71 */ 0xec85af, 0xec85b1, 0xec85b2, 0xec85b3,
+ /* 75 */ 0xec85b5, 0xec85b6, 0xec85b7, 0xec85b9,
+ /* 79 */ 0xec85ba, 0xec85bb, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec85bc, 0xec85bd, 0xec85be, 0xec85bf,
+ /* 85 */ 0xec8680, 0xec8681, 0xec8682, 0xec8683,
+ /* 89 */ 0xec8684, 0xec8686, 0xec8687, 0xec8688,
+ /* 8d */ 0xec8689, 0xec868a, 0xec868b, 0xec868f,
+ /* 91 */ 0xec8691, 0xec8692, 0xec8693, 0xec8695,
+ /* 95 */ 0xec8697, 0xec8698, 0xec8699, 0xec869a,
+ /* 99 */ 0xec869b, 0xec869e, 0xec86a0, 0xec86a2,
+ /* 9d */ 0xec86a3, 0xec86a4, 0xec86a6, 0xec86a7,
+ /* a1 */ 0xec86aa, 0xec86ab, 0xec86ad, 0xec86ae,
+ /* a5 */ 0xec86af, 0xec86b1, 0xec86b2, 0xec86b3,
+ /* a9 */ 0xec86b4, 0xec86b5, 0xec86b6, 0xec86b7,
+ /* ad */ 0xec86b8, 0xec86b9, 0xec86ba, 0xec86bb,
+ /* b1 */ 0xec86bc, 0xec86be, 0xec86bf, 0xec8780,
+ /* b5 */ 0xec8781, 0xec8782, 0xec8783, 0xec8785,
+ /* b9 */ 0xec8786, 0xec8787, 0xec8789, 0xec878a,
+ /* bd */ 0xec878b, 0xec878d, 0xec878e, 0xec878f,
+ /* c1 */ 0xec8790, 0xec8791, 0xec8792, 0xec8793,
+ /* c5 */ 0xec8795, 0xec8796, 0xec8799, 0xec879a,
+ /* c9 */ 0xec879b, 0xec879c, 0xec879d, 0xec879e,
+ /* cd */ 0xec879f, 0xec87a1, 0xec87a2, 0xec87a3,
+ /* d1 */ 0xec87a5, 0xec87a6, 0xec87a7, 0xec87a9,
+ /* d5 */ 0xec87aa, 0xec87ab, 0xec87ac, 0xec87ad,
+ /* d9 */ 0xec87ae, 0xec87af, 0xec87b2, 0xec87b4,
+ /* dd */ 0xec87b5, 0xec87b6, 0xec87b7, 0xec87b8,
+ /* e1 */ 0xec87b9, 0xec87ba, 0xec87bb, 0xec87be,
+ /* e5 */ 0xec87bf, 0xec8881, 0xec8882, 0xec8883,
+ /* e9 */ 0xec8885, 0xec8886, 0xec8887, 0xec8888,
+ /* ed */ 0xec8889, 0xec888a, 0xec888b, 0xec888e,
+ /* f1 */ 0xec8890, 0xec8892, 0xec8893, 0xec8894,
+ /* f5 */ 0xec8895, 0xec8896, 0xec8897, 0xec889a,
+ /* f9 */ 0xec889b, 0xec889d, 0xec889e, 0xec88a1,
+ /* fd */ 0xec88a2, 0xec88a3,
+
+ /*** Two byte table, leaf: 9axx - offset 0x013ca ***/
+
+ /* 41 */ 0xec88a4, 0xec88a5, 0xec88a6, 0xec88a7,
+ /* 45 */ 0xec88aa, 0xec88ac, 0xec88ae, 0xec88b0,
+ /* 49 */ 0xec88b3, 0xec88b5, 0xec88b6, 0xec88b7,
+ /* 4d */ 0xec88b8, 0xec88b9, 0xec88ba, 0xec88bb,
+ /* 51 */ 0xec88bc, 0xec88bd, 0xec88be, 0xec88bf,
+ /* 55 */ 0xec8980, 0xec8981, 0xec8982, 0xec8983,
+ /* 59 */ 0xec8984, 0xec8985, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8986, 0xec8987, 0xec8989, 0xec898a,
+ /* 65 */ 0xec898b, 0xec898c, 0xec898d, 0xec898e,
+ /* 69 */ 0xec898f, 0xec8992, 0xec8993, 0xec8995,
+ /* 6d */ 0xec8996, 0xec8997, 0xec8999, 0xec899a,
+ /* 71 */ 0xec899b, 0xec899c, 0xec899d, 0xec899e,
+ /* 75 */ 0xec899f, 0xec89a1, 0xec89a2, 0xec89a3,
+ /* 79 */ 0xec89a4, 0xec89a6, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec89a7, 0xec89a8, 0xec89a9, 0xec89aa,
+ /* 85 */ 0xec89ab, 0xec89ae, 0xec89af, 0xec89b1,
+ /* 89 */ 0xec89b2, 0xec89b3, 0xec89b5, 0xec89b6,
+ /* 8d */ 0xec89b7, 0xec89b8, 0xec89b9, 0xec89ba,
+ /* 91 */ 0xec89bb, 0xec89be, 0xec8a80, 0xec8a82,
+ /* 95 */ 0xec8a83, 0xec8a84, 0xec8a85, 0xec8a86,
+ /* 99 */ 0xec8a87, 0xec8a8a, 0xec8a8b, 0xec8a8c,
+ /* 9d */ 0xec8a8d, 0xec8a8e, 0xec8a8f, 0xec8a91,
+ /* a1 */ 0xec8a92, 0xec8a93, 0xec8a94, 0xec8a95,
+ /* a5 */ 0xec8a96, 0xec8a97, 0xec8a99, 0xec8a9a,
+ /* a9 */ 0xec8a9c, 0xec8a9e, 0xec8a9f, 0xec8aa0,
+ /* ad */ 0xec8aa1, 0xec8aa2, 0xec8aa3, 0xec8aa6,
+ /* b1 */ 0xec8aa7, 0xec8aa9, 0xec8aaa, 0xec8aab,
+ /* b5 */ 0xec8aae, 0xec8aaf, 0xec8ab0, 0xec8ab1,
+ /* b9 */ 0xec8ab2, 0xec8ab3, 0xec8ab6, 0xec8ab8,
+ /* bd */ 0xec8aba, 0xec8abb, 0xec8abc, 0xec8abd,
+ /* c1 */ 0xec8abe, 0xec8abf, 0xec8b80, 0xec8b81,
+ /* c5 */ 0xec8b82, 0xec8b83, 0xec8b84, 0xec8b85,
+ /* c9 */ 0xec8b86, 0xec8b87, 0xec8b88, 0xec8b89,
+ /* cd */ 0xec8b8a, 0xec8b8b, 0xec8b8c, 0xec8b8d,
+ /* d1 */ 0xec8b8e, 0xec8b8f, 0xec8b90, 0xec8b91,
+ /* d5 */ 0xec8b92, 0xec8b93, 0xec8b94, 0xec8b95,
+ /* d9 */ 0xec8b96, 0xec8b97, 0xec8b98, 0xec8b99,
+ /* dd */ 0xec8b9a, 0xec8b9b, 0xec8b9e, 0xec8b9f,
+ /* e1 */ 0xec8ba1, 0xec8ba2, 0xec8ba5, 0xec8ba6,
+ /* e5 */ 0xec8ba7, 0xec8ba8, 0xec8ba9, 0xec8baa,
+ /* e9 */ 0xec8bae, 0xec8bb0, 0xec8bb2, 0xec8bb3,
+ /* ed */ 0xec8bb4, 0xec8bb5, 0xec8bb7, 0xec8bba,
+ /* f1 */ 0xec8bbd, 0xec8bbe, 0xec8bbf, 0xec8c81,
+ /* f5 */ 0xec8c82, 0xec8c83, 0xec8c84, 0xec8c85,
+ /* f9 */ 0xec8c86, 0xec8c87, 0xec8c8a, 0xec8c8b,
+ /* fd */ 0xec8c8e, 0xec8c8f,
+
+ /*** Two byte table, leaf: 9bxx - offset 0x01488 ***/
+
+ /* 41 */ 0xec8c90, 0xec8c91, 0xec8c92, 0xec8c96,
+ /* 45 */ 0xec8c97, 0xec8c99, 0xec8c9a, 0xec8c9b,
+ /* 49 */ 0xec8c9d, 0xec8c9e, 0xec8c9f, 0xec8ca0,
+ /* 4d */ 0xec8ca1, 0xec8ca2, 0xec8ca3, 0xec8ca6,
+ /* 51 */ 0xec8ca7, 0xec8caa, 0xec8cab, 0xec8cac,
+ /* 55 */ 0xec8cad, 0xec8cae, 0xec8caf, 0xec8cb0,
+ /* 59 */ 0xec8cb1, 0xec8cb2, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8cb3, 0xec8cb4, 0xec8cb5, 0xec8cb6,
+ /* 65 */ 0xec8cb7, 0xec8cb8, 0xec8cb9, 0xec8cba,
+ /* 69 */ 0xec8cbb, 0xec8cbc, 0xec8cbd, 0xec8cbe,
+ /* 6d */ 0xec8cbf, 0xec8d80, 0xec8d81, 0xec8d82,
+ /* 71 */ 0xec8d83, 0xec8d84, 0xec8d86, 0xec8d87,
+ /* 75 */ 0xec8d88, 0xec8d89, 0xec8d8a, 0xec8d8b,
+ /* 79 */ 0xec8d8c, 0xec8d8d, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec8d8e, 0xec8d8f, 0xec8d90, 0xec8d91,
+ /* 85 */ 0xec8d92, 0xec8d93, 0xec8d94, 0xec8d95,
+ /* 89 */ 0xec8d96, 0xec8d97, 0xec8d98, 0xec8d99,
+ /* 8d */ 0xec8d9a, 0xec8d9b, 0xec8d9c, 0xec8d9d,
+ /* 91 */ 0xec8d9e, 0xec8d9f, 0xec8da0, 0xec8da1,
+ /* 95 */ 0xec8da2, 0xec8da3, 0xec8da4, 0xec8da5,
+ /* 99 */ 0xec8da6, 0xec8da7, 0xec8daa, 0xec8dab,
+ /* 9d */ 0xec8dad, 0xec8dae, 0xec8daf, 0xec8db1,
+ /* a1 */ 0xec8db3, 0xec8db4, 0xec8db5, 0xec8db6,
+ /* a5 */ 0xec8db7, 0xec8dba, 0xec8dbb, 0xec8dbe,
+ /* a9 */ 0xec8dbf, 0xec8e80, 0xec8e81, 0xec8e82,
+ /* ad */ 0xec8e83, 0xec8e85, 0xec8e86, 0xec8e87,
+ /* b1 */ 0xec8e89, 0xec8e8a, 0xec8e8b, 0xec8e8d,
+ /* b5 */ 0xec8e8e, 0xec8e8f, 0xec8e90, 0xec8e91,
+ /* b9 */ 0xec8e92, 0xec8e93, 0xec8e94, 0xec8e95,
+ /* bd */ 0xec8e96, 0xec8e97, 0xec8e98, 0xec8e99,
+ /* c1 */ 0xec8e9a, 0xec8e9b, 0xec8e9c, 0xec8e9d,
+ /* c5 */ 0xec8e9e, 0xec8e9f, 0xec8ea0, 0xec8ea1,
+ /* c9 */ 0xec8ea2, 0xec8ea3, 0xec8ea4, 0xec8ea5,
+ /* cd */ 0xec8ea6, 0xec8ea7, 0xec8ea8, 0xec8ea9,
+ /* d1 */ 0xec8eaa, 0xec8eab, 0xec8eac, 0xec8ead,
+ /* d5 */ 0xec8eae, 0xec8eaf, 0xec8eb0, 0xec8eb1,
+ /* d9 */ 0xec8eb2, 0xec8eb3, 0xec8eb4, 0xec8eb5,
+ /* dd */ 0xec8eb6, 0xec8eb7, 0xec8eb8, 0xec8eb9,
+ /* e1 */ 0xec8eba, 0xec8ebb, 0xec8ebc, 0xec8ebd,
+ /* e5 */ 0xec8ebe, 0xec8ebf, 0xec8f81, 0xec8f82,
+ /* e9 */ 0xec8f83, 0xec8f84, 0xec8f85, 0xec8f86,
+ /* ed */ 0xec8f87, 0xec8f88, 0xec8f89, 0xec8f8a,
+ /* f1 */ 0xec8f8b, 0xec8f8c, 0xec8f8d, 0xec8f8e,
+ /* f5 */ 0xec8f8f, 0xec8f90, 0xec8f91, 0xec8f92,
+ /* f9 */ 0xec8f93, 0xec8f94, 0xec8f95, 0xec8f96,
+ /* fd */ 0xec8f97, 0xec8f9a,
+
+ /*** Two byte table, leaf: 9cxx - offset 0x01546 ***/
+
+ /* 41 */ 0xec8f9b, 0xec8f9d, 0xec8f9e, 0xec8fa1,
+ /* 45 */ 0xec8fa3, 0xec8fa4, 0xec8fa5, 0xec8fa6,
+ /* 49 */ 0xec8fa7, 0xec8faa, 0xec8fab, 0xec8fac,
+ /* 4d */ 0xec8fae, 0xec8faf, 0xec8fb0, 0xec8fb1,
+ /* 51 */ 0xec8fb2, 0xec8fb3, 0xec8fb6, 0xec8fb7,
+ /* 55 */ 0xec8fb9, 0xec8fba, 0xec8fbb, 0xec8fbc,
+ /* 59 */ 0xec8fbd, 0xec8fbe, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec8fbf, 0xec9080, 0xec9081, 0xec9082,
+ /* 65 */ 0xec9083, 0xec9084, 0xec9085, 0xec9086,
+ /* 69 */ 0xec9087, 0xec9089, 0xec908a, 0xec908b,
+ /* 6d */ 0xec908c, 0xec908d, 0xec908e, 0xec908f,
+ /* 71 */ 0xec9091, 0xec9092, 0xec9093, 0xec9094,
+ /* 75 */ 0xec9095, 0xec9096, 0xec9097, 0xec9098,
+ /* 79 */ 0xec9099, 0xec909a, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec909b, 0xec909c, 0xec909d, 0xec909e,
+ /* 85 */ 0xec909f, 0xec90a0, 0xec90a1, 0xec90a2,
+ /* 89 */ 0xec90a3, 0xec90a5, 0xec90a6, 0xec90a7,
+ /* 8d */ 0xec90a8, 0xec90a9, 0xec90aa, 0xec90ab,
+ /* 91 */ 0xec90ad, 0xec90ae, 0xec90af, 0xec90b1,
+ /* 95 */ 0xec90b2, 0xec90b3, 0xec90b5, 0xec90b6,
+ /* 99 */ 0xec90b7, 0xec90b8, 0xec90b9, 0xec90ba,
+ /* 9d */ 0xec90bb, 0xec90be, 0xec90bf, 0xec9180,
+ /* a1 */ 0xec9181, 0xec9182, 0xec9183, 0xec9184,
+ /* a5 */ 0xec9185, 0xec9186, 0xec9187, 0xec9189,
+ /* a9 */ 0xec918a, 0xec918b, 0xec918c, 0xec918d,
+ /* ad */ 0xec918e, 0xec918f, 0xec9190, 0xec9191,
+ /* b1 */ 0xec9192, 0xec9193, 0xec9194, 0xec9195,
+ /* b5 */ 0xec9196, 0xec9197, 0xec9198, 0xec9199,
+ /* b9 */ 0xec919a, 0xec919b, 0xec919c, 0xec919d,
+ /* bd */ 0xec919e, 0xec919f, 0xec91a0, 0xec91a1,
+ /* c1 */ 0xec91a2, 0xec91a3, 0xec91a6, 0xec91a7,
+ /* c5 */ 0xec91a9, 0xec91aa, 0xec91ab, 0xec91ad,
+ /* c9 */ 0xec91ae, 0xec91af, 0xec91b0, 0xec91b1,
+ /* cd */ 0xec91b2, 0xec91b3, 0xec91b6, 0xec91b7,
+ /* d1 */ 0xec91b8, 0xec91ba, 0xec91bb, 0xec91bc,
+ /* d5 */ 0xec91bd, 0xec91be, 0xec91bf, 0xec9281,
+ /* d9 */ 0xec9282, 0xec9283, 0xec9284, 0xec9285,
+ /* dd */ 0xec9286, 0xec9287, 0xec9288, 0xec9289,
+ /* e1 */ 0xec928a, 0xec928b, 0xec928c, 0xec928d,
+ /* e5 */ 0xec928e, 0xec928f, 0xec9290, 0xec9291,
+ /* e9 */ 0xec9292, 0xec9293, 0xec9295, 0xec9296,
+ /* ed */ 0xec9297, 0xec9298, 0xec9299, 0xec929a,
+ /* f1 */ 0xec929b, 0xec929d, 0xec929e, 0xec929f,
+ /* f5 */ 0xec92a0, 0xec92a1, 0xec92a2, 0xec92a3,
+ /* f9 */ 0xec92a4, 0xec92a5, 0xec92a6, 0xec92a7,
+ /* fd */ 0xec92a8, 0xec92a9,
+
+ /*** Two byte table, leaf: 9dxx - offset 0x01604 ***/
+
+ /* 41 */ 0xec92aa, 0xec92ab, 0xec92ac, 0xec92ad,
+ /* 45 */ 0xec92ae, 0xec92af, 0xec92b0, 0xec92b1,
+ /* 49 */ 0xec92b2, 0xec92b3, 0xec92b4, 0xec92b5,
+ /* 4d */ 0xec92b6, 0xec92b7, 0xec92b9, 0xec92ba,
+ /* 51 */ 0xec92bb, 0xec92bd, 0xec92be, 0xec92bf,
+ /* 55 */ 0xec9380, 0xec9381, 0xec9382, 0xec9383,
+ /* 59 */ 0xec9384, 0xec9385, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9386, 0xec9387, 0xec9388, 0xec9389,
+ /* 65 */ 0xec938a, 0xec938b, 0xec938c, 0xec938d,
+ /* 69 */ 0xec938e, 0xec938f, 0xec9390, 0xec9391,
+ /* 6d */ 0xec9392, 0xec9393, 0xec9394, 0xec9395,
+ /* 71 */ 0xec9396, 0xec9397, 0xec9398, 0xec9399,
+ /* 75 */ 0xec939a, 0xec939b, 0xec939c, 0xec939d,
+ /* 79 */ 0xec939e, 0xec939f, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec93a0, 0xec93a1, 0xec93a2, 0xec93a3,
+ /* 85 */ 0xec93a4, 0xec93a5, 0xec93a6, 0xec93a7,
+ /* 89 */ 0xec93a8, 0xec93aa, 0xec93ab, 0xec93ac,
+ /* 8d */ 0xec93ad, 0xec93ae, 0xec93af, 0xec93b2,
+ /* 91 */ 0xec93b3, 0xec93b5, 0xec93b6, 0xec93b7,
+ /* 95 */ 0xec93b9, 0xec93bb, 0xec93bc, 0xec93bd,
+ /* 99 */ 0xec93be, 0xec9482, 0xec9483, 0xec9484,
+ /* 9d */ 0xec9485, 0xec9486, 0xec9487, 0xec9488,
+ /* a1 */ 0xec9489, 0xec948a, 0xec948b, 0xec948d,
+ /* a5 */ 0xec948e, 0xec948f, 0xec9491, 0xec9492,
+ /* a9 */ 0xec9493, 0xec9495, 0xec9496, 0xec9497,
+ /* ad */ 0xec9498, 0xec9499, 0xec949a, 0xec949b,
+ /* b1 */ 0xec949d, 0xec949e, 0xec949f, 0xec94a0,
+ /* b5 */ 0xec94a1, 0xec94a2, 0xec94a3, 0xec94a4,
+ /* b9 */ 0xec94a5, 0xec94a6, 0xec94a7, 0xec94aa,
+ /* bd */ 0xec94ab, 0xec94ad, 0xec94ae, 0xec94af,
+ /* c1 */ 0xec94b1, 0xec94b2, 0xec94b3, 0xec94b4,
+ /* c5 */ 0xec94b5, 0xec94b6, 0xec94b7, 0xec94ba,
+ /* c9 */ 0xec94bc, 0xec94be, 0xec94bf, 0xec9580,
+ /* cd */ 0xec9581, 0xec9582, 0xec9583, 0xec9586,
+ /* d1 */ 0xec9587, 0xec958b, 0xec958f, 0xec9590,
+ /* d5 */ 0xec9591, 0xec9592, 0xec9596, 0xec959a,
+ /* d9 */ 0xec959b, 0xec959c, 0xec959f, 0xec95a2,
+ /* dd */ 0xec95a3, 0xec95a5, 0xec95a6, 0xec95a7,
+ /* e1 */ 0xec95a9, 0xec95aa, 0xec95ab, 0xec95ac,
+ /* e5 */ 0xec95ad, 0xec95ae, 0xec95af, 0xec95b2,
+ /* e9 */ 0xec95b6, 0xec95b7, 0xec95b8, 0xec95b9,
+ /* ed */ 0xec95ba, 0xec95bb, 0xec95be, 0xec95bf,
+ /* f1 */ 0xec9681, 0xec9682, 0xec9683, 0xec9685,
+ /* f5 */ 0xec9686, 0xec9688, 0xec9689, 0xec968a,
+ /* f9 */ 0xec968b, 0xec968e, 0xec9690, 0xec9692,
+ /* fd */ 0xec9693, 0xec9694,
+
+ /*** Two byte table, leaf: 9exx - offset 0x016c2 ***/
+
+ /* 41 */ 0xec9696, 0xec9699, 0xec969a, 0xec969b,
+ /* 45 */ 0xec969d, 0xec969e, 0xec969f, 0xec96a1,
+ /* 49 */ 0xec96a2, 0xec96a3, 0xec96a4, 0xec96a5,
+ /* 4d */ 0xec96a6, 0xec96a7, 0xec96a8, 0xec96aa,
+ /* 51 */ 0xec96ab, 0xec96ac, 0xec96ad, 0xec96ae,
+ /* 55 */ 0xec96af, 0xec96b0, 0xec96b1, 0xec96b2,
+ /* 59 */ 0xec96b3, 0xec96b6, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec96b7, 0xec96ba, 0xec96bf, 0xec9780,
+ /* 65 */ 0xec9781, 0xec9782, 0xec9783, 0xec978b,
+ /* 69 */ 0xec978d, 0xec978f, 0xec9792, 0xec9793,
+ /* 6d */ 0xec9795, 0xec9796, 0xec9797, 0xec9799,
+ /* 71 */ 0xec979a, 0xec979b, 0xec979c, 0xec979d,
+ /* 75 */ 0xec979e, 0xec979f, 0xec97a2, 0xec97a4,
+ /* 79 */ 0xec97a6, 0xec97a7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec97a8, 0xec97a9, 0xec97aa, 0xec97ab,
+ /* 85 */ 0xec97af, 0xec97b1, 0xec97b2, 0xec97b3,
+ /* 89 */ 0xec97b5, 0xec97b8, 0xec97b9, 0xec97ba,
+ /* 8d */ 0xec97bb, 0xec9882, 0xec9883, 0xec9884,
+ /* 91 */ 0xec9889, 0xec988a, 0xec988b, 0xec988d,
+ /* 95 */ 0xec988e, 0xec988f, 0xec9891, 0xec9892,
+ /* 99 */ 0xec9893, 0xec9894, 0xec9895, 0xec9896,
+ /* 9d */ 0xec9897, 0xec989a, 0xec989d, 0xec989e,
+ /* a1 */ 0xec989f, 0xec98a0, 0xec98a1, 0xec98a2,
+ /* a5 */ 0xec98a3, 0xec98a6, 0xec98a7, 0xec98a9,
+ /* a9 */ 0xec98aa, 0xec98ab, 0xec98af, 0xec98b1,
+ /* ad */ 0xec98b2, 0xec98b6, 0xec98b8, 0xec98ba,
+ /* b1 */ 0xec98bc, 0xec98bd, 0xec98be, 0xec98bf,
+ /* b5 */ 0xec9982, 0xec9983, 0xec9985, 0xec9986,
+ /* b9 */ 0xec9987, 0xec9989, 0xec998a, 0xec998b,
+ /* bd */ 0xec998c, 0xec998d, 0xec998e, 0xec998f,
+ /* c1 */ 0xec9992, 0xec9996, 0xec9997, 0xec9998,
+ /* c5 */ 0xec9999, 0xec999a, 0xec999b, 0xec999e,
+ /* c9 */ 0xec999f, 0xec99a1, 0xec99a2, 0xec99a3,
+ /* cd */ 0xec99a4, 0xec99a5, 0xec99a6, 0xec99a7,
+ /* d1 */ 0xec99a8, 0xec99a9, 0xec99aa, 0xec99ab,
+ /* d5 */ 0xec99ad, 0xec99ae, 0xec99b0, 0xec99b2,
+ /* d9 */ 0xec99b3, 0xec99b4, 0xec99b5, 0xec99b6,
+ /* dd */ 0xec99b7, 0xec99ba, 0xec99bb, 0xec99bd,
+ /* e1 */ 0xec99be, 0xec99bf, 0xec9a81, 0xec9a82,
+ /* e5 */ 0xec9a83, 0xec9a84, 0xec9a85, 0xec9a86,
+ /* e9 */ 0xec9a87, 0xec9a8a, 0xec9a8c, 0xec9a8e,
+ /* ed */ 0xec9a8f, 0xec9a90, 0xec9a91, 0xec9a92,
+ /* f1 */ 0xec9a93, 0xec9a96, 0xec9a97, 0xec9a99,
+ /* f5 */ 0xec9a9a, 0xec9a9b, 0xec9a9d, 0xec9a9e,
+ /* f9 */ 0xec9a9f, 0xec9aa0, 0xec9aa1, 0xec9aa2,
+ /* fd */ 0xec9aa3, 0xec9aa6,
+
+ /*** Two byte table, leaf: 9fxx - offset 0x01780 ***/
+
+ /* 41 */ 0xec9aa8, 0xec9aaa, 0xec9aab, 0xec9aac,
+ /* 45 */ 0xec9aad, 0xec9aae, 0xec9aaf, 0xec9ab2,
+ /* 49 */ 0xec9ab3, 0xec9ab5, 0xec9ab6, 0xec9ab7,
+ /* 4d */ 0xec9abb, 0xec9abc, 0xec9abd, 0xec9abe,
+ /* 51 */ 0xec9abf, 0xec9b82, 0xec9b84, 0xec9b86,
+ /* 55 */ 0xec9b87, 0xec9b88, 0xec9b89, 0xec9b8a,
+ /* 59 */ 0xec9b8b, 0xec9b8e, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9b8f, 0xec9b91, 0xec9b92, 0xec9b93,
+ /* 65 */ 0xec9b95, 0xec9b96, 0xec9b97, 0xec9b98,
+ /* 69 */ 0xec9b99, 0xec9b9a, 0xec9b9b, 0xec9b9e,
+ /* 6d */ 0xec9b9f, 0xec9ba2, 0xec9ba3, 0xec9ba4,
+ /* 71 */ 0xec9ba5, 0xec9ba6, 0xec9ba7, 0xec9baa,
+ /* 75 */ 0xec9bab, 0xec9bad, 0xec9bae, 0xec9baf,
+ /* 79 */ 0xec9bb1, 0xec9bb2, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9bb3, 0xec9bb4, 0xec9bb5, 0xec9bb6,
+ /* 85 */ 0xec9bb7, 0xec9bba, 0xec9bbb, 0xec9bbc,
+ /* 89 */ 0xec9bbe, 0xec9bbf, 0xec9c80, 0xec9c81,
+ /* 8d */ 0xec9c82, 0xec9c83, 0xec9c86, 0xec9c87,
+ /* 91 */ 0xec9c89, 0xec9c8a, 0xec9c8b, 0xec9c8d,
+ /* 95 */ 0xec9c8e, 0xec9c8f, 0xec9c90, 0xec9c91,
+ /* 99 */ 0xec9c92, 0xec9c93, 0xec9c96, 0xec9c98,
+ /* 9d */ 0xec9c9a, 0xec9c9b, 0xec9c9c, 0xec9c9d,
+ /* a1 */ 0xec9c9e, 0xec9c9f, 0xec9ca2, 0xec9ca3,
+ /* a5 */ 0xec9ca5, 0xec9ca6, 0xec9ca7, 0xec9ca9,
+ /* a9 */ 0xec9caa, 0xec9cab, 0xec9cac, 0xec9cad,
+ /* ad */ 0xec9cae, 0xec9caf, 0xec9cb2, 0xec9cb4,
+ /* b1 */ 0xec9cb6, 0xec9cb8, 0xec9cb9, 0xec9cba,
+ /* b5 */ 0xec9cbb, 0xec9cbe, 0xec9cbf, 0xec9d81,
+ /* b9 */ 0xec9d82, 0xec9d83, 0xec9d85, 0xec9d86,
+ /* bd */ 0xec9d87, 0xec9d88, 0xec9d89, 0xec9d8b,
+ /* c1 */ 0xec9d8e, 0xec9d90, 0xec9d99, 0xec9d9a,
+ /* c5 */ 0xec9d9b, 0xec9d9d, 0xec9d9e, 0xec9d9f,
+ /* c9 */ 0xec9da1, 0xec9da2, 0xec9da3, 0xec9da4,
+ /* cd */ 0xec9da5, 0xec9da6, 0xec9da7, 0xec9da9,
+ /* d1 */ 0xec9daa, 0xec9dac, 0xec9dad, 0xec9dae,
+ /* d5 */ 0xec9daf, 0xec9db0, 0xec9db1, 0xec9db2,
+ /* d9 */ 0xec9db3, 0xec9db6, 0xec9db7, 0xec9db9,
+ /* dd */ 0xec9dba, 0xec9dbb, 0xec9dbf, 0xec9e80,
+ /* e1 */ 0xec9e81, 0xec9e82, 0xec9e86, 0xec9e8b,
+ /* e5 */ 0xec9e8c, 0xec9e8d, 0xec9e8f, 0xec9e92,
+ /* e9 */ 0xec9e93, 0xec9e95, 0xec9e99, 0xec9e9b,
+ /* ed */ 0xec9e9c, 0xec9e9d, 0xec9e9e, 0xec9e9f,
+ /* f1 */ 0xec9ea2, 0xec9ea7, 0xec9ea8, 0xec9ea9,
+ /* f5 */ 0xec9eaa, 0xec9eab, 0xec9eae, 0xec9eaf,
+ /* f9 */ 0xec9eb1, 0xec9eb2, 0xec9eb3, 0xec9eb5,
+ /* fd */ 0xec9eb6, 0xec9eb7,
+
+ /*** Two byte table, leaf: a0xx - offset 0x0183e ***/
+
+ /* 41 */ 0xec9eb8, 0xec9eb9, 0xec9eba, 0xec9ebb,
+ /* 45 */ 0xec9ebe, 0xec9f82, 0xec9f83, 0xec9f84,
+ /* 49 */ 0xec9f85, 0xec9f86, 0xec9f87, 0xec9f8a,
+ /* 4d */ 0xec9f8b, 0xec9f8d, 0xec9f8f, 0xec9f91,
+ /* 51 */ 0xec9f92, 0xec9f93, 0xec9f94, 0xec9f95,
+ /* 55 */ 0xec9f96, 0xec9f97, 0xec9f99, 0xec9f9a,
+ /* 59 */ 0xec9f9b, 0xec9f9c, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xec9f9e, 0xec9f9f, 0xec9fa0, 0xec9fa1,
+ /* 65 */ 0xec9fa2, 0xec9fa3, 0xec9fa5, 0xec9fa6,
+ /* 69 */ 0xec9fa7, 0xec9fa9, 0xec9faa, 0xec9fab,
+ /* 6d */ 0xec9fad, 0xec9fae, 0xec9faf, 0xec9fb0,
+ /* 71 */ 0xec9fb1, 0xec9fb2, 0xec9fb3, 0xec9fb4,
+ /* 75 */ 0xec9fb5, 0xec9fb6, 0xec9fb7, 0xec9fb8,
+ /* 79 */ 0xec9fb9, 0xec9fba, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xec9fbb, 0xec9fbc, 0xec9fbd, 0xec9fbe,
+ /* 85 */ 0xec9fbf, 0xeca082, 0xeca083, 0xeca085,
+ /* 89 */ 0xeca086, 0xeca087, 0xeca089, 0xeca08b,
+ /* 8d */ 0xeca08c, 0xeca08d, 0xeca08e, 0xeca08f,
+ /* 91 */ 0xeca092, 0xeca094, 0xeca097, 0xeca098,
+ /* 95 */ 0xeca099, 0xeca09a, 0xeca09b, 0xeca09e,
+ /* 99 */ 0xeca09f, 0xeca0a1, 0xeca0a2, 0xeca0a3,
+ /* 9d */ 0xeca0a5, 0xeca0a6, 0xeca0a7, 0xeca0a8,
+ /* a1 */ 0xeca0a9, 0xeca0aa, 0xeca0ab, 0xeca0ae,
+ /* a5 */ 0xeca0b0, 0xeca0b2, 0xeca0b3, 0xeca0b4,
+ /* a9 */ 0xeca0b5, 0xeca0b6, 0xeca0b7, 0xeca0b9,
+ /* ad */ 0xeca0ba, 0xeca0bb, 0xeca0bd, 0xeca0be,
+ /* b1 */ 0xeca0bf, 0xeca181, 0xeca182, 0xeca183,
+ /* b5 */ 0xeca184, 0xeca185, 0xeca186, 0xeca187,
+ /* b9 */ 0xeca18a, 0xeca18b, 0xeca18e, 0xeca18f,
+ /* bd */ 0xeca190, 0xeca191, 0xeca192, 0xeca193,
+ /* c1 */ 0xeca195, 0xeca196, 0xeca197, 0xeca198,
+ /* c5 */ 0xeca199, 0xeca19a, 0xeca19b, 0xeca19c,
+ /* c9 */ 0xeca19d, 0xeca19e, 0xeca19f, 0xeca1a0,
+ /* cd */ 0xeca1a1, 0xeca1a2, 0xeca1a3, 0xeca1a4,
+ /* d1 */ 0xeca1a5, 0xeca1a6, 0xeca1a7, 0xeca1a8,
+ /* d5 */ 0xeca1a9, 0xeca1aa, 0xeca1ab, 0xeca1ac,
+ /* d9 */ 0xeca1ad, 0xeca1ae, 0xeca1af, 0xeca1b2,
+ /* dd */ 0xeca1b3, 0xeca1b5, 0xeca1b6, 0xeca1b7,
+ /* e1 */ 0xeca1b9, 0xeca1bb, 0xeca1bc, 0xeca1bd,
+ /* e5 */ 0xeca1be, 0xeca1bf, 0xeca282, 0xeca284,
+ /* e9 */ 0xeca288, 0xeca289, 0xeca28a, 0xeca28e,
+ /* ed */ 0xeca28f, 0xeca290, 0xeca291, 0xeca292,
+ /* f1 */ 0xeca293, 0xeca295, 0xeca296, 0xeca297,
+ /* f5 */ 0xeca298, 0xeca299, 0xeca29a, 0xeca29b,
+ /* f9 */ 0xeca29c, 0xeca29e, 0xeca2a0, 0xeca2a2,
+ /* fd */ 0xeca2a3, 0xeca2a4,
+
+ /*** Two byte table, leaf: a1xx - offset 0x018fc ***/
+
+ /* 41 */ 0xeca2a5, 0xeca2a6, 0xeca2a7, 0xeca2a9,
+ /* 45 */ 0xeca2aa, 0xeca2ab, 0xeca2ac, 0xeca2ad,
+ /* 49 */ 0xeca2ae, 0xeca2af, 0xeca2b0, 0xeca2b1,
+ /* 4d */ 0xeca2b2, 0xeca2b3, 0xeca2b4, 0xeca2b5,
+ /* 51 */ 0xeca2b6, 0xeca2b7, 0xeca2b8, 0xeca2b9,
+ /* 55 */ 0xeca2ba, 0xeca2bb, 0xeca2be, 0xeca2bf,
+ /* 59 */ 0xeca380, 0xeca381, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca382, 0xeca383, 0xeca385, 0xeca386,
+ /* 65 */ 0xeca387, 0xeca389, 0xeca38a, 0xeca38b,
+ /* 69 */ 0xeca38d, 0xeca38e, 0xeca38f, 0xeca390,
+ /* 6d */ 0xeca391, 0xeca392, 0xeca393, 0xeca396,
+ /* 71 */ 0xeca398, 0xeca39a, 0xeca39b, 0xeca39c,
+ /* 75 */ 0xeca39d, 0xeca39e, 0xeca39f, 0xeca3a2,
+ /* 79 */ 0xeca3a3, 0xeca3a5, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca3a6, 0xeca3a7, 0xeca3a8, 0xeca3a9,
+ /* 85 */ 0xeca3aa, 0xeca3ab, 0xeca3ac, 0xeca3ad,
+ /* 89 */ 0xeca3ae, 0xeca3af, 0xeca3b0, 0xeca3b1,
+ /* 8d */ 0xeca3b2, 0xeca3b3, 0xeca3b4, 0xeca3b6,
+ /* 91 */ 0xeca3b7, 0xeca3b8, 0xeca3b9, 0xeca3ba,
+ /* 95 */ 0xeca3bb, 0xeca3be, 0xeca3bf, 0xeca481,
+ /* 99 */ 0xeca482, 0xeca483, 0xeca487, 0xeca488,
+ /* 9d */ 0xeca489, 0xeca48a, 0xeca48b, 0xeca48e,
+ /* a1 */ 0xe38080, 0xe38081, 0xe38082, 0x00c2b7,
+ /* a5 */ 0xe280a5, 0xe280a6, 0x00c2a8, 0xe38083,
+ /* a9 */ 0x00c2ad, 0xe28095, 0xe288a5, 0xefbcbc,
+ /* ad */ 0xe288bc, 0xe28098, 0xe28099, 0xe2809c,
+ /* b1 */ 0xe2809d, 0xe38094, 0xe38095, 0xe38088,
+ /* b5 */ 0xe38089, 0xe3808a, 0xe3808b, 0xe3808c,
+ /* b9 */ 0xe3808d, 0xe3808e, 0xe3808f, 0xe38090,
+ /* bd */ 0xe38091, 0x00c2b1, 0x00c397, 0x00c3b7,
+ /* c1 */ 0xe289a0, 0xe289a4, 0xe289a5, 0xe2889e,
+ /* c5 */ 0xe288b4, 0x00c2b0, 0xe280b2, 0xe280b3,
+ /* c9 */ 0xe28483, 0xe284ab, 0xefbfa0, 0xefbfa1,
+ /* cd */ 0xefbfa5, 0xe29982, 0xe29980, 0xe288a0,
+ /* d1 */ 0xe28aa5, 0xe28c92, 0xe28882, 0xe28887,
+ /* d5 */ 0xe289a1, 0xe28992, 0x00c2a7, 0xe280bb,
+ /* d9 */ 0xe29886, 0xe29885, 0xe2978b, 0xe2978f,
+ /* dd */ 0xe2978e, 0xe29787, 0xe29786, 0xe296a1,
+ /* e1 */ 0xe296a0, 0xe296b3, 0xe296b2, 0xe296bd,
+ /* e5 */ 0xe296bc, 0xe28692, 0xe28690, 0xe28691,
+ /* e9 */ 0xe28693, 0xe28694, 0xe38093, 0xe289aa,
+ /* ed */ 0xe289ab, 0xe2889a, 0xe288bd, 0xe2889d,
+ /* f1 */ 0xe288b5, 0xe288ab, 0xe288ac, 0xe28888,
+ /* f5 */ 0xe2888b, 0xe28a86, 0xe28a87, 0xe28a82,
+ /* f9 */ 0xe28a83, 0xe288aa, 0xe288a9, 0xe288a7,
+ /* fd */ 0xe288a8, 0xefbfa2,
+
+ /*** Two byte table, leaf: a2xx - offset 0x019ba ***/
+
+ /* 41 */ 0xeca490, 0xeca492, 0xeca493, 0xeca494,
+ /* 45 */ 0xeca495, 0xeca496, 0xeca497, 0xeca499,
+ /* 49 */ 0xeca49a, 0xeca49b, 0xeca49c, 0xeca49d,
+ /* 4d */ 0xeca49e, 0xeca49f, 0xeca4a0, 0xeca4a1,
+ /* 51 */ 0xeca4a2, 0xeca4a3, 0xeca4a4, 0xeca4a5,
+ /* 55 */ 0xeca4a6, 0xeca4a7, 0xeca4a8, 0xeca4a9,
+ /* 59 */ 0xeca4aa, 0xeca4ab, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca4ad, 0xeca4ae, 0xeca4af, 0xeca4b0,
+ /* 65 */ 0xeca4b1, 0xeca4b2, 0xeca4b3, 0xeca4b5,
+ /* 69 */ 0xeca4b6, 0xeca4b7, 0xeca4b8, 0xeca4b9,
+ /* 6d */ 0xeca4ba, 0xeca4bb, 0xeca4bc, 0xeca4bd,
+ /* 71 */ 0xeca4be, 0xeca4bf, 0xeca580, 0xeca581,
+ /* 75 */ 0xeca582, 0xeca583, 0xeca584, 0xeca585,
+ /* 79 */ 0xeca586, 0xeca587, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca588, 0xeca589, 0xeca58a, 0xeca58b,
+ /* 85 */ 0xeca58c, 0xeca58d, 0xeca58e, 0xeca58f,
+ /* 89 */ 0xeca592, 0xeca593, 0xeca595, 0xeca596,
+ /* 8d */ 0xeca597, 0xeca599, 0xeca59a, 0xeca59b,
+ /* 91 */ 0xeca59c, 0xeca59d, 0xeca59e, 0xeca59f,
+ /* 95 */ 0xeca5a2, 0xeca5a4, 0xeca5a5, 0xeca5a6,
+ /* 99 */ 0xeca5a7, 0xeca5a8, 0xeca5a9, 0xeca5aa,
+ /* 9d */ 0xeca5ab, 0xeca5ad, 0xeca5ae, 0xeca5af,
+ /* a1 */ 0xe28792, 0xe28794, 0xe28880, 0xe28883,
+ /* a5 */ 0x00c2b4, 0xefbd9e, 0x00cb87, 0x00cb98,
+ /* a9 */ 0x00cb9d, 0x00cb9a, 0x00cb99, 0x00c2b8,
+ /* ad */ 0x00cb9b, 0x00c2a1, 0x00c2bf, 0x00cb90,
+ /* b1 */ 0xe288ae, 0xe28891, 0xe2888f, 0x00c2a4,
+ /* b5 */ 0xe28489, 0xe280b0, 0xe29781, 0xe29780,
+ /* b9 */ 0xe296b7, 0xe296b6, 0xe299a4, 0xe299a0,
+ /* bd */ 0xe299a1, 0xe299a5, 0xe299a7, 0xe299a3,
+ /* c1 */ 0xe28a99, 0xe29788, 0xe296a3, 0xe29790,
+ /* c5 */ 0xe29791, 0xe29692, 0xe296a4, 0xe296a5,
+ /* c9 */ 0xe296a8, 0xe296a7, 0xe296a6, 0xe296a9,
+ /* cd */ 0xe299a8, 0xe2988f, 0xe2988e, 0xe2989c,
+ /* d1 */ 0xe2989e, 0x00c2b6, 0xe280a0, 0xe280a1,
+ /* d5 */ 0xe28695, 0xe28697, 0xe28699, 0xe28696,
+ /* d9 */ 0xe28698, 0xe299ad, 0xe299a9, 0xe299aa,
+ /* dd */ 0xe299ac, 0xe389bf, 0xe3889c, 0xe28496,
+ /* e1 */ 0xe38f87, 0xe284a2, 0xe38f82, 0xe38f98,
+ /* e5 */ 0xe284a1, 0xe282ac, 0x00c2ae, 0xe389be,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a3xx - offset 0x01a78 ***/
+
+ /* 41 */ 0xeca5b1, 0xeca5b2, 0xeca5b3, 0xeca5b5,
+ /* 45 */ 0xeca5b6, 0xeca5b7, 0xeca5b8, 0xeca5b9,
+ /* 49 */ 0xeca5ba, 0xeca5bb, 0xeca5bd, 0xeca5be,
+ /* 4d */ 0xeca5bf, 0xeca680, 0xeca681, 0xeca682,
+ /* 51 */ 0xeca683, 0xeca684, 0xeca685, 0xeca686,
+ /* 55 */ 0xeca687, 0xeca68a, 0xeca68b, 0xeca68d,
+ /* 59 */ 0xeca68e, 0xeca68f, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca691, 0xeca692, 0xeca693, 0xeca694,
+ /* 65 */ 0xeca695, 0xeca696, 0xeca697, 0xeca69a,
+ /* 69 */ 0xeca69c, 0xeca69e, 0xeca69f, 0xeca6a0,
+ /* 6d */ 0xeca6a1, 0xeca6a2, 0xeca6a3, 0xeca6a4,
+ /* 71 */ 0xeca6a5, 0xeca6a6, 0xeca6a7, 0xeca6a8,
+ /* 75 */ 0xeca6a9, 0xeca6aa, 0xeca6ab, 0xeca6ac,
+ /* 79 */ 0xeca6ad, 0xeca6ae, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca6af, 0xeca6b0, 0xeca6b1, 0xeca6b2,
+ /* 85 */ 0xeca6b3, 0xeca6b4, 0xeca6b5, 0xeca6b6,
+ /* 89 */ 0xeca6b7, 0xeca6b8, 0xeca6b9, 0xeca6ba,
+ /* 8d */ 0xeca6bb, 0xeca6bc, 0xeca6bd, 0xeca6be,
+ /* 91 */ 0xeca6bf, 0xeca782, 0xeca783, 0xeca785,
+ /* 95 */ 0xeca786, 0xeca789, 0xeca78b, 0xeca78c,
+ /* 99 */ 0xeca78d, 0xeca78e, 0xeca78f, 0xeca792,
+ /* 9d */ 0xeca794, 0xeca797, 0xeca798, 0xeca79b,
+ /* a1 */ 0xefbc81, 0xefbc82, 0xefbc83, 0xefbc84,
+ /* a5 */ 0xefbc85, 0xefbc86, 0xefbc87, 0xefbc88,
+ /* a9 */ 0xefbc89, 0xefbc8a, 0xefbc8b, 0xefbc8c,
+ /* ad */ 0xefbc8d, 0xefbc8e, 0xefbc8f, 0xefbc90,
+ /* b1 */ 0xefbc91, 0xefbc92, 0xefbc93, 0xefbc94,
+ /* b5 */ 0xefbc95, 0xefbc96, 0xefbc97, 0xefbc98,
+ /* b9 */ 0xefbc99, 0xefbc9a, 0xefbc9b, 0xefbc9c,
+ /* bd */ 0xefbc9d, 0xefbc9e, 0xefbc9f, 0xefbca0,
+ /* c1 */ 0xefbca1, 0xefbca2, 0xefbca3, 0xefbca4,
+ /* c5 */ 0xefbca5, 0xefbca6, 0xefbca7, 0xefbca8,
+ /* c9 */ 0xefbca9, 0xefbcaa, 0xefbcab, 0xefbcac,
+ /* cd */ 0xefbcad, 0xefbcae, 0xefbcaf, 0xefbcb0,
+ /* d1 */ 0xefbcb1, 0xefbcb2, 0xefbcb3, 0xefbcb4,
+ /* d5 */ 0xefbcb5, 0xefbcb6, 0xefbcb7, 0xefbcb8,
+ /* d9 */ 0xefbcb9, 0xefbcba, 0xefbcbb, 0xefbfa6,
+ /* dd */ 0xefbcbd, 0xefbcbe, 0xefbcbf, 0xefbd80,
+ /* e1 */ 0xefbd81, 0xefbd82, 0xefbd83, 0xefbd84,
+ /* e5 */ 0xefbd85, 0xefbd86, 0xefbd87, 0xefbd88,
+ /* e9 */ 0xefbd89, 0xefbd8a, 0xefbd8b, 0xefbd8c,
+ /* ed */ 0xefbd8d, 0xefbd8e, 0xefbd8f, 0xefbd90,
+ /* f1 */ 0xefbd91, 0xefbd92, 0xefbd93, 0xefbd94,
+ /* f5 */ 0xefbd95, 0xefbd96, 0xefbd97, 0xefbd98,
+ /* f9 */ 0xefbd99, 0xefbd9a, 0xefbd9b, 0xefbd9c,
+ /* fd */ 0xefbd9d, 0xefbfa3,
+
+ /*** Two byte table, leaf: a4xx - offset 0x01b36 ***/
+
+ /* 41 */ 0xeca79e, 0xeca79f, 0xeca7a1, 0xeca7a3,
+ /* 45 */ 0xeca7a5, 0xeca7a6, 0xeca7a8, 0xeca7a9,
+ /* 49 */ 0xeca7aa, 0xeca7ab, 0xeca7ae, 0xeca7b2,
+ /* 4d */ 0xeca7b3, 0xeca7b4, 0xeca7b5, 0xeca7b6,
+ /* 51 */ 0xeca7b7, 0xeca7ba, 0xeca7bb, 0xeca7bd,
+ /* 55 */ 0xeca7be, 0xeca7bf, 0xeca881, 0xeca882,
+ /* 59 */ 0xeca883, 0xeca884, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca885, 0xeca886, 0xeca887, 0xeca88a,
+ /* 65 */ 0xeca88e, 0xeca88f, 0xeca890, 0xeca891,
+ /* 69 */ 0xeca892, 0xeca893, 0xeca895, 0xeca896,
+ /* 6d */ 0xeca897, 0xeca899, 0xeca89a, 0xeca89b,
+ /* 71 */ 0xeca89c, 0xeca89d, 0xeca89e, 0xeca89f,
+ /* 75 */ 0xeca8a0, 0xeca8a1, 0xeca8a2, 0xeca8a3,
+ /* 79 */ 0xeca8a4, 0xeca8a5, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xeca8a6, 0xeca8a7, 0xeca8a8, 0xeca8aa,
+ /* 85 */ 0xeca8ab, 0xeca8ac, 0xeca8ad, 0xeca8ae,
+ /* 89 */ 0xeca8af, 0xeca8b0, 0xeca8b1, 0xeca8b2,
+ /* 8d */ 0xeca8b3, 0xeca8b4, 0xeca8b5, 0xeca8b6,
+ /* 91 */ 0xeca8b7, 0xeca8b8, 0xeca8b9, 0xeca8ba,
+ /* 95 */ 0xeca8bb, 0xeca8bc, 0xeca8bd, 0xeca8be,
+ /* 99 */ 0xeca8bf, 0xeca980, 0xeca981, 0xeca982,
+ /* 9d */ 0xeca983, 0xeca984, 0xeca985, 0xeca986,
+ /* a1 */ 0xe384b1, 0xe384b2, 0xe384b3, 0xe384b4,
+ /* a5 */ 0xe384b5, 0xe384b6, 0xe384b7, 0xe384b8,
+ /* a9 */ 0xe384b9, 0xe384ba, 0xe384bb, 0xe384bc,
+ /* ad */ 0xe384bd, 0xe384be, 0xe384bf, 0xe38580,
+ /* b1 */ 0xe38581, 0xe38582, 0xe38583, 0xe38584,
+ /* b5 */ 0xe38585, 0xe38586, 0xe38587, 0xe38588,
+ /* b9 */ 0xe38589, 0xe3858a, 0xe3858b, 0xe3858c,
+ /* bd */ 0xe3858d, 0xe3858e, 0xe3858f, 0xe38590,
+ /* c1 */ 0xe38591, 0xe38592, 0xe38593, 0xe38594,
+ /* c5 */ 0xe38595, 0xe38596, 0xe38597, 0xe38598,
+ /* c9 */ 0xe38599, 0xe3859a, 0xe3859b, 0xe3859c,
+ /* cd */ 0xe3859d, 0xe3859e, 0xe3859f, 0xe385a0,
+ /* d1 */ 0xe385a1, 0xe385a2, 0xe385a3, 0xe385a4,
+ /* d5 */ 0xe385a5, 0xe385a6, 0xe385a7, 0xe385a8,
+ /* d9 */ 0xe385a9, 0xe385aa, 0xe385ab, 0xe385ac,
+ /* dd */ 0xe385ad, 0xe385ae, 0xe385af, 0xe385b0,
+ /* e1 */ 0xe385b1, 0xe385b2, 0xe385b3, 0xe385b4,
+ /* e5 */ 0xe385b5, 0xe385b6, 0xe385b7, 0xe385b8,
+ /* e9 */ 0xe385b9, 0xe385ba, 0xe385bb, 0xe385bc,
+ /* ed */ 0xe385bd, 0xe385be, 0xe385bf, 0xe38680,
+ /* f1 */ 0xe38681, 0xe38682, 0xe38683, 0xe38684,
+ /* f5 */ 0xe38685, 0xe38686, 0xe38687, 0xe38688,
+ /* f9 */ 0xe38689, 0xe3868a, 0xe3868b, 0xe3868c,
+ /* fd */ 0xe3868d, 0xe3868e,
+
+ /*** Two byte table, leaf: a5xx - offset 0x01bf4 ***/
+
+ /* 41 */ 0xeca987, 0xeca988, 0xeca989, 0xeca98a,
+ /* 45 */ 0xeca98b, 0xeca98e, 0xeca98f, 0xeca991,
+ /* 49 */ 0xeca992, 0xeca993, 0xeca995, 0xeca996,
+ /* 4d */ 0xeca997, 0xeca998, 0xeca999, 0xeca99a,
+ /* 51 */ 0xeca99b, 0xeca99e, 0xeca9a2, 0xeca9a3,
+ /* 55 */ 0xeca9a4, 0xeca9a5, 0xeca9a6, 0xeca9a7,
+ /* 59 */ 0xeca9a9, 0xeca9aa, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xeca9ab, 0xeca9ac, 0xeca9ad, 0xeca9ae,
+ /* 65 */ 0xeca9af, 0xeca9b0, 0xeca9b1, 0xeca9b2,
+ /* 69 */ 0xeca9b3, 0xeca9b4, 0xeca9b5, 0xeca9b6,
+ /* 6d */ 0xeca9b7, 0xeca9b8, 0xeca9b9, 0xeca9ba,
+ /* 71 */ 0xeca9bb, 0xeca9bc, 0xeca9be, 0xeca9bf,
+ /* 75 */ 0xecaa80, 0xecaa81, 0xecaa82, 0xecaa83,
+ /* 79 */ 0xecaa85, 0xecaa86, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecaa87, 0xecaa88, 0xecaa89, 0xecaa8a,
+ /* 85 */ 0xecaa8b, 0xecaa8c, 0xecaa8d, 0xecaa8e,
+ /* 89 */ 0xecaa8f, 0xecaa90, 0xecaa91, 0xecaa92,
+ /* 8d */ 0xecaa93, 0xecaa94, 0xecaa95, 0xecaa96,
+ /* 91 */ 0xecaa97, 0xecaa99, 0xecaa9a, 0xecaa9b,
+ /* 95 */ 0xecaa9c, 0xecaa9d, 0xecaa9e, 0xecaa9f,
+ /* 99 */ 0xecaaa0, 0xecaaa1, 0xecaaa2, 0xecaaa3,
+ /* 9d */ 0xecaaa4, 0xecaaa5, 0xecaaa6, 0xecaaa7,
+ /* a1 */ 0xe285b0, 0xe285b1, 0xe285b2, 0xe285b3,
+ /* a5 */ 0xe285b4, 0xe285b5, 0xe285b6, 0xe285b7,
+ /* a9 */ 0xe285b8, 0xe285b9, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0xe285a0,
+ /* b1 */ 0xe285a1, 0xe285a2, 0xe285a3, 0xe285a4,
+ /* b5 */ 0xe285a5, 0xe285a6, 0xe285a7, 0xe285a8,
+ /* b9 */ 0xe285a9, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x00ce91, 0x00ce92, 0x00ce93, 0x00ce94,
+ /* c5 */ 0x00ce95, 0x00ce96, 0x00ce97, 0x00ce98,
+ /* c9 */ 0x00ce99, 0x00ce9a, 0x00ce9b, 0x00ce9c,
+ /* cd */ 0x00ce9d, 0x00ce9e, 0x00ce9f, 0x00cea0,
+ /* d1 */ 0x00cea1, 0x00cea3, 0x00cea4, 0x00cea5,
+ /* d5 */ 0x00cea6, 0x00cea7, 0x00cea8, 0x00cea9,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x00ceb1, 0x00ceb2, 0x00ceb3, 0x00ceb4,
+ /* e5 */ 0x00ceb5, 0x00ceb6, 0x00ceb7, 0x00ceb8,
+ /* e9 */ 0x00ceb9, 0x00ceba, 0x00cebb, 0x00cebc,
+ /* ed */ 0x00cebd, 0x00cebe, 0x00cebf, 0x00cf80,
+ /* f1 */ 0x00cf81, 0x00cf83, 0x00cf84, 0x00cf85,
+ /* f5 */ 0x00cf86, 0x00cf87, 0x00cf88, 0x00cf89,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a6xx - offset 0x01cb2 ***/
+
+ /* 41 */ 0xecaaa8, 0xecaaa9, 0xecaaaa, 0xecaaab,
+ /* 45 */ 0xecaaac, 0xecaaad, 0xecaaae, 0xecaaaf,
+ /* 49 */ 0xecaab0, 0xecaab1, 0xecaab2, 0xecaab3,
+ /* 4d */ 0xecaab4, 0xecaab5, 0xecaab6, 0xecaab7,
+ /* 51 */ 0xecaab8, 0xecaab9, 0xecaaba, 0xecaabb,
+ /* 55 */ 0xecaabe, 0xecaabf, 0xecab81, 0xecab82,
+ /* 59 */ 0xecab83, 0xecab85, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecab86, 0xecab87, 0xecab88, 0xecab89,
+ /* 65 */ 0xecab8a, 0xecab8b, 0xecab8e, 0xecab90,
+ /* 69 */ 0xecab92, 0xecab94, 0xecab95, 0xecab96,
+ /* 6d */ 0xecab97, 0xecab9a, 0xecab9b, 0xecab9c,
+ /* 71 */ 0xecab9d, 0xecab9e, 0xecab9f, 0xecaba1,
+ /* 75 */ 0xecaba2, 0xecaba3, 0xecaba4, 0xecaba5,
+ /* 79 */ 0xecaba6, 0xecaba7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecaba8, 0xecaba9, 0xecabaa, 0xecabab,
+ /* 85 */ 0xecabad, 0xecabae, 0xecabaf, 0xecabb0,
+ /* 89 */ 0xecabb1, 0xecabb2, 0xecabb3, 0xecabb5,
+ /* 8d */ 0xecabb6, 0xecabb7, 0xecabb8, 0xecabb9,
+ /* 91 */ 0xecabba, 0xecabbb, 0xecabbc, 0xecabbd,
+ /* 95 */ 0xecabbe, 0xecabbf, 0xecac80, 0xecac81,
+ /* 99 */ 0xecac82, 0xecac83, 0xecac84, 0xecac85,
+ /* 9d */ 0xecac86, 0xecac87, 0xecac89, 0xecac8a,
+ /* a1 */ 0xe29480, 0xe29482, 0xe2948c, 0xe29490,
+ /* a5 */ 0xe29498, 0xe29494, 0xe2949c, 0xe294ac,
+ /* a9 */ 0xe294a4, 0xe294b4, 0xe294bc, 0xe29481,
+ /* ad */ 0xe29483, 0xe2948f, 0xe29493, 0xe2949b,
+ /* b1 */ 0xe29497, 0xe294a3, 0xe294b3, 0xe294ab,
+ /* b5 */ 0xe294bb, 0xe2958b, 0xe294a0, 0xe294af,
+ /* b9 */ 0xe294a8, 0xe294b7, 0xe294bf, 0xe2949d,
+ /* bd */ 0xe294b0, 0xe294a5, 0xe294b8, 0xe29582,
+ /* c1 */ 0xe29492, 0xe29491, 0xe2949a, 0xe29499,
+ /* c5 */ 0xe29496, 0xe29495, 0xe2948e, 0xe2948d,
+ /* c9 */ 0xe2949e, 0xe2949f, 0xe294a1, 0xe294a2,
+ /* cd */ 0xe294a6, 0xe294a7, 0xe294a9, 0xe294aa,
+ /* d1 */ 0xe294ad, 0xe294ae, 0xe294b1, 0xe294b2,
+ /* d5 */ 0xe294b5, 0xe294b6, 0xe294b9, 0xe294ba,
+ /* d9 */ 0xe294bd, 0xe294be, 0xe29580, 0xe29581,
+ /* dd */ 0xe29583, 0xe29584, 0xe29585, 0xe29586,
+ /* e1 */ 0xe29587, 0xe29588, 0xe29589, 0xe2958a,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a7xx - offset 0x01d70 ***/
+
+ /* 41 */ 0xecac8b, 0xecac8c, 0xecac8d, 0xecac8e,
+ /* 45 */ 0xecac8f, 0xecac91, 0xecac92, 0xecac93,
+ /* 49 */ 0xecac95, 0xecac96, 0xecac97, 0xecac99,
+ /* 4d */ 0xecac9a, 0xecac9b, 0xecac9c, 0xecac9d,
+ /* 51 */ 0xecac9e, 0xecac9f, 0xecaca2, 0xecaca3,
+ /* 55 */ 0xecaca4, 0xecaca5, 0xecaca6, 0xecaca7,
+ /* 59 */ 0xecaca8, 0xecaca9, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecacaa, 0xecacab, 0xecacac, 0xecacad,
+ /* 65 */ 0xecacae, 0xecacaf, 0xecacb0, 0xecacb1,
+ /* 69 */ 0xecacb2, 0xecacb3, 0xecacb4, 0xecacb5,
+ /* 6d */ 0xecacb6, 0xecacb7, 0xecacb8, 0xecacb9,
+ /* 71 */ 0xecacba, 0xecacbb, 0xecacbc, 0xecacbd,
+ /* 75 */ 0xecacbe, 0xecacbf, 0xecad80, 0xecad82,
+ /* 79 */ 0xecad83, 0xecad84, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecad85, 0xecad86, 0xecad87, 0xecad8a,
+ /* 85 */ 0xecad8b, 0xecad8d, 0xecad8e, 0xecad8f,
+ /* 89 */ 0xecad91, 0xecad92, 0xecad93, 0xecad94,
+ /* 8d */ 0xecad95, 0xecad96, 0xecad97, 0xecad9a,
+ /* 91 */ 0xecad9b, 0xecad9c, 0xecad9e, 0xecad9f,
+ /* 95 */ 0xecada0, 0xecada1, 0xecada2, 0xecada3,
+ /* 99 */ 0xecada5, 0xecada6, 0xecada7, 0xecada8,
+ /* 9d */ 0xecada9, 0xecadaa, 0xecadab, 0xecadac,
+ /* a1 */ 0xe38e95, 0xe38e96, 0xe38e97, 0xe28493,
+ /* a5 */ 0xe38e98, 0xe38f84, 0xe38ea3, 0xe38ea4,
+ /* a9 */ 0xe38ea5, 0xe38ea6, 0xe38e99, 0xe38e9a,
+ /* ad */ 0xe38e9b, 0xe38e9c, 0xe38e9d, 0xe38e9e,
+ /* b1 */ 0xe38e9f, 0xe38ea0, 0xe38ea1, 0xe38ea2,
+ /* b5 */ 0xe38f8a, 0xe38e8d, 0xe38e8e, 0xe38e8f,
+ /* b9 */ 0xe38f8f, 0xe38e88, 0xe38e89, 0xe38f88,
+ /* bd */ 0xe38ea7, 0xe38ea8, 0xe38eb0, 0xe38eb1,
+ /* c1 */ 0xe38eb2, 0xe38eb3, 0xe38eb4, 0xe38eb5,
+ /* c5 */ 0xe38eb6, 0xe38eb7, 0xe38eb8, 0xe38eb9,
+ /* c9 */ 0xe38e80, 0xe38e81, 0xe38e82, 0xe38e83,
+ /* cd */ 0xe38e84, 0xe38eba, 0xe38ebb, 0xe38ebc,
+ /* d1 */ 0xe38ebd, 0xe38ebe, 0xe38ebf, 0xe38e90,
+ /* d5 */ 0xe38e91, 0xe38e92, 0xe38e93, 0xe38e94,
+ /* d9 */ 0xe284a6, 0xe38f80, 0xe38f81, 0xe38e8a,
+ /* dd */ 0xe38e8b, 0xe38e8c, 0xe38f96, 0xe38f85,
+ /* e1 */ 0xe38ead, 0xe38eae, 0xe38eaf, 0xe38f9b,
+ /* e5 */ 0xe38ea9, 0xe38eaa, 0xe38eab, 0xe38eac,
+ /* e9 */ 0xe38f9d, 0xe38f90, 0xe38f93, 0xe38f83,
+ /* ed */ 0xe38f89, 0xe38f9c, 0xe38f86, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: a8xx - offset 0x01e2e ***/
+
+ /* 41 */ 0xecadad, 0xecadae, 0xecadaf, 0xecadb0,
+ /* 45 */ 0xecadb1, 0xecadb2, 0xecadb3, 0xecadb4,
+ /* 49 */ 0xecadb5, 0xecadb6, 0xecadb7, 0xecadba,
+ /* 4d */ 0xecadbb, 0xecadbc, 0xecadbd, 0xecadbe,
+ /* 51 */ 0xecadbf, 0xecae80, 0xecae81, 0xecae82,
+ /* 55 */ 0xecae83, 0xecae84, 0xecae85, 0xecae86,
+ /* 59 */ 0xecae87, 0xecae88, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecae89, 0xecae8a, 0xecae8b, 0xecae8c,
+ /* 65 */ 0xecae8d, 0xecae8e, 0xecae8f, 0xecae90,
+ /* 69 */ 0xecae91, 0xecae92, 0xecae93, 0xecae94,
+ /* 6d */ 0xecae95, 0xecae96, 0xecae97, 0xecae98,
+ /* 71 */ 0xecae99, 0xecae9a, 0xecae9b, 0xecae9d,
+ /* 75 */ 0xecae9e, 0xecae9f, 0xecaea0, 0xecaea1,
+ /* 79 */ 0xecaea2, 0xecaea3, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecaea4, 0xecaea5, 0xecaea6, 0xecaea7,
+ /* 85 */ 0xecaea8, 0xecaea9, 0xecaeaa, 0xecaeab,
+ /* 89 */ 0xecaeac, 0xecaead, 0xecaeae, 0xecaeaf,
+ /* 8d */ 0xecaeb0, 0xecaeb1, 0xecaeb2, 0xecaeb3,
+ /* 91 */ 0xecaeb4, 0xecaeb5, 0xecaeb6, 0xecaeb7,
+ /* 95 */ 0xecaeb9, 0xecaeba, 0xecaebb, 0xecaebc,
+ /* 99 */ 0xecaebd, 0xecaebe, 0xecaebf, 0xecaf80,
+ /* 9d */ 0xecaf81, 0xecaf82, 0xecaf83, 0xecaf84,
+ /* a1 */ 0x00c386, 0x00c390, 0x00c2aa, 0x00c4a6,
+ /* a5 */ 0x000000, 0x00c4b2, 0x000000, 0x00c4bf,
+ /* a9 */ 0x00c581, 0x00c398, 0x00c592, 0x00c2ba,
+ /* ad */ 0x00c39e, 0x00c5a6, 0x00c58a, 0x000000,
+ /* b1 */ 0xe389a0, 0xe389a1, 0xe389a2, 0xe389a3,
+ /* b5 */ 0xe389a4, 0xe389a5, 0xe389a6, 0xe389a7,
+ /* b9 */ 0xe389a8, 0xe389a9, 0xe389aa, 0xe389ab,
+ /* bd */ 0xe389ac, 0xe389ad, 0xe389ae, 0xe389af,
+ /* c1 */ 0xe389b0, 0xe389b1, 0xe389b2, 0xe389b3,
+ /* c5 */ 0xe389b4, 0xe389b5, 0xe389b6, 0xe389b7,
+ /* c9 */ 0xe389b8, 0xe389b9, 0xe389ba, 0xe389bb,
+ /* cd */ 0xe29390, 0xe29391, 0xe29392, 0xe29393,
+ /* d1 */ 0xe29394, 0xe29395, 0xe29396, 0xe29397,
+ /* d5 */ 0xe29398, 0xe29399, 0xe2939a, 0xe2939b,
+ /* d9 */ 0xe2939c, 0xe2939d, 0xe2939e, 0xe2939f,
+ /* dd */ 0xe293a0, 0xe293a1, 0xe293a2, 0xe293a3,
+ /* e1 */ 0xe293a4, 0xe293a5, 0xe293a6, 0xe293a7,
+ /* e5 */ 0xe293a8, 0xe293a9, 0xe291a0, 0xe291a1,
+ /* e9 */ 0xe291a2, 0xe291a3, 0xe291a4, 0xe291a5,
+ /* ed */ 0xe291a6, 0xe291a7, 0xe291a8, 0xe291a9,
+ /* f1 */ 0xe291aa, 0xe291ab, 0xe291ac, 0xe291ad,
+ /* f5 */ 0xe291ae, 0x00c2bd, 0xe28593, 0xe28594,
+ /* f9 */ 0x00c2bc, 0x00c2be, 0xe2859b, 0xe2859c,
+ /* fd */ 0xe2859d, 0xe2859e,
+
+ /*** Two byte table, leaf: a9xx - offset 0x01eec ***/
+
+ /* 41 */ 0xecaf85, 0xecaf86, 0xecaf87, 0xecaf88,
+ /* 45 */ 0xecaf89, 0xecaf8a, 0xecaf8b, 0xecaf8c,
+ /* 49 */ 0xecaf8d, 0xecaf8e, 0xecaf8f, 0xecaf90,
+ /* 4d */ 0xecaf91, 0xecaf92, 0xecaf93, 0xecaf95,
+ /* 51 */ 0xecaf96, 0xecaf97, 0xecaf98, 0xecaf99,
+ /* 55 */ 0xecaf9a, 0xecaf9b, 0xecaf9c, 0xecaf9d,
+ /* 59 */ 0xecaf9e, 0xecaf9f, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecafa0, 0xecafa1, 0xecafa2, 0xecafa3,
+ /* 65 */ 0xecafa5, 0xecafa6, 0xecafa8, 0xecafaa,
+ /* 69 */ 0xecafab, 0xecafac, 0xecafad, 0xecafae,
+ /* 6d */ 0xecafaf, 0xecafb0, 0xecafb1, 0xecafb2,
+ /* 71 */ 0xecafb3, 0xecafb4, 0xecafb5, 0xecafb6,
+ /* 75 */ 0xecafb7, 0xecafb8, 0xecafb9, 0xecafba,
+ /* 79 */ 0xecafbb, 0xecafbc, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecafbd, 0xecafbe, 0xecafbf, 0xecb080,
+ /* 85 */ 0xecb081, 0xecb082, 0xecb083, 0xecb084,
+ /* 89 */ 0xecb085, 0xecb086, 0xecb087, 0xecb088,
+ /* 8d */ 0xecb089, 0xecb08a, 0xecb08b, 0xecb08e,
+ /* 91 */ 0xecb08f, 0xecb091, 0xecb092, 0xecb093,
+ /* 95 */ 0xecb095, 0xecb096, 0xecb097, 0xecb098,
+ /* 99 */ 0xecb099, 0xecb09a, 0xecb09b, 0xecb09e,
+ /* 9d */ 0xecb09f, 0xecb0a0, 0xecb0a3, 0xecb0a4,
+ /* a1 */ 0x00c3a6, 0x00c491, 0x00c3b0, 0x00c4a7,
+ /* a5 */ 0x00c4b1, 0x00c4b3, 0x00c4b8, 0x00c580,
+ /* a9 */ 0x00c582, 0x00c3b8, 0x00c593, 0x00c39f,
+ /* ad */ 0x00c3be, 0x00c5a7, 0x00c58b, 0x00c589,
+ /* b1 */ 0xe38880, 0xe38881, 0xe38882, 0xe38883,
+ /* b5 */ 0xe38884, 0xe38885, 0xe38886, 0xe38887,
+ /* b9 */ 0xe38888, 0xe38889, 0xe3888a, 0xe3888b,
+ /* bd */ 0xe3888c, 0xe3888d, 0xe3888e, 0xe3888f,
+ /* c1 */ 0xe38890, 0xe38891, 0xe38892, 0xe38893,
+ /* c5 */ 0xe38894, 0xe38895, 0xe38896, 0xe38897,
+ /* c9 */ 0xe38898, 0xe38899, 0xe3889a, 0xe3889b,
+ /* cd */ 0xe2929c, 0xe2929d, 0xe2929e, 0xe2929f,
+ /* d1 */ 0xe292a0, 0xe292a1, 0xe292a2, 0xe292a3,
+ /* d5 */ 0xe292a4, 0xe292a5, 0xe292a6, 0xe292a7,
+ /* d9 */ 0xe292a8, 0xe292a9, 0xe292aa, 0xe292ab,
+ /* dd */ 0xe292ac, 0xe292ad, 0xe292ae, 0xe292af,
+ /* e1 */ 0xe292b0, 0xe292b1, 0xe292b2, 0xe292b3,
+ /* e5 */ 0xe292b4, 0xe292b5, 0xe291b4, 0xe291b5,
+ /* e9 */ 0xe291b6, 0xe291b7, 0xe291b8, 0xe291b9,
+ /* ed */ 0xe291ba, 0xe291bb, 0xe291bc, 0xe291bd,
+ /* f1 */ 0xe291be, 0xe291bf, 0xe29280, 0xe29281,
+ /* f5 */ 0xe29282, 0x00c2b9, 0x00c2b2, 0x00c2b3,
+ /* f9 */ 0xe281b4, 0xe281bf, 0xe28281, 0xe28282,
+ /* fd */ 0xe28283, 0xe28284,
+
+ /*** Two byte table, leaf: aaxx - offset 0x01faa ***/
+
+ /* 41 */ 0xecb0a5, 0xecb0a6, 0xecb0aa, 0xecb0ab,
+ /* 45 */ 0xecb0ad, 0xecb0af, 0xecb0b1, 0xecb0b2,
+ /* 49 */ 0xecb0b3, 0xecb0b4, 0xecb0b5, 0xecb0b6,
+ /* 4d */ 0xecb0b7, 0xecb0ba, 0xecb0bf, 0xecb180,
+ /* 51 */ 0xecb181, 0xecb182, 0xecb183, 0xecb186,
+ /* 55 */ 0xecb187, 0xecb189, 0xecb18a, 0xecb18b,
+ /* 59 */ 0xecb18d, 0xecb18e, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb18f, 0xecb190, 0xecb191, 0xecb192,
+ /* 65 */ 0xecb193, 0xecb196, 0xecb19a, 0xecb19b,
+ /* 69 */ 0xecb19c, 0xecb19d, 0xecb19e, 0xecb19f,
+ /* 6d */ 0xecb1a1, 0xecb1a2, 0xecb1a3, 0xecb1a5,
+ /* 71 */ 0xecb1a7, 0xecb1a9, 0xecb1aa, 0xecb1ab,
+ /* 75 */ 0xecb1ac, 0xecb1ad, 0xecb1ae, 0xecb1af,
+ /* 79 */ 0xecb1b1, 0xecb1b2, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb1b3, 0xecb1b4, 0xecb1b6, 0xecb1b7,
+ /* 85 */ 0xecb1b8, 0xecb1b9, 0xecb1ba, 0xecb1bb,
+ /* 89 */ 0xecb1bc, 0xecb1bd, 0xecb1be, 0xecb1bf,
+ /* 8d */ 0xecb280, 0xecb281, 0xecb282, 0xecb283,
+ /* 91 */ 0xecb284, 0xecb285, 0xecb286, 0xecb287,
+ /* 95 */ 0xecb288, 0xecb289, 0xecb28a, 0xecb28b,
+ /* 99 */ 0xecb28c, 0xecb28d, 0xecb28e, 0xecb28f,
+ /* 9d */ 0xecb290, 0xecb291, 0xecb292, 0xecb293,
+ /* a1 */ 0xe38181, 0xe38182, 0xe38183, 0xe38184,
+ /* a5 */ 0xe38185, 0xe38186, 0xe38187, 0xe38188,
+ /* a9 */ 0xe38189, 0xe3818a, 0xe3818b, 0xe3818c,
+ /* ad */ 0xe3818d, 0xe3818e, 0xe3818f, 0xe38190,
+ /* b1 */ 0xe38191, 0xe38192, 0xe38193, 0xe38194,
+ /* b5 */ 0xe38195, 0xe38196, 0xe38197, 0xe38198,
+ /* b9 */ 0xe38199, 0xe3819a, 0xe3819b, 0xe3819c,
+ /* bd */ 0xe3819d, 0xe3819e, 0xe3819f, 0xe381a0,
+ /* c1 */ 0xe381a1, 0xe381a2, 0xe381a3, 0xe381a4,
+ /* c5 */ 0xe381a5, 0xe381a6, 0xe381a7, 0xe381a8,
+ /* c9 */ 0xe381a9, 0xe381aa, 0xe381ab, 0xe381ac,
+ /* cd */ 0xe381ad, 0xe381ae, 0xe381af, 0xe381b0,
+ /* d1 */ 0xe381b1, 0xe381b2, 0xe381b3, 0xe381b4,
+ /* d5 */ 0xe381b5, 0xe381b6, 0xe381b7, 0xe381b8,
+ /* d9 */ 0xe381b9, 0xe381ba, 0xe381bb, 0xe381bc,
+ /* dd */ 0xe381bd, 0xe381be, 0xe381bf, 0xe38280,
+ /* e1 */ 0xe38281, 0xe38282, 0xe38283, 0xe38284,
+ /* e5 */ 0xe38285, 0xe38286, 0xe38287, 0xe38288,
+ /* e9 */ 0xe38289, 0xe3828a, 0xe3828b, 0xe3828c,
+ /* ed */ 0xe3828d, 0xe3828e, 0xe3828f, 0xe38290,
+ /* f1 */ 0xe38291, 0xe38292, 0xe38293, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: abxx - offset 0x02068 ***/
+
+ /* 41 */ 0xecb294, 0xecb295, 0xecb296, 0xecb297,
+ /* 45 */ 0xecb29a, 0xecb29b, 0xecb29d, 0xecb29e,
+ /* 49 */ 0xecb29f, 0xecb2a1, 0xecb2a2, 0xecb2a3,
+ /* 4d */ 0xecb2a4, 0xecb2a5, 0xecb2a6, 0xecb2a7,
+ /* 51 */ 0xecb2aa, 0xecb2ae, 0xecb2af, 0xecb2b0,
+ /* 55 */ 0xecb2b1, 0xecb2b2, 0xecb2b3, 0xecb2b6,
+ /* 59 */ 0xecb2b7, 0xecb2b9, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb2ba, 0xecb2bb, 0xecb2bd, 0xecb2be,
+ /* 65 */ 0xecb2bf, 0xecb380, 0xecb381, 0xecb382,
+ /* 69 */ 0xecb383, 0xecb386, 0xecb388, 0xecb38a,
+ /* 6d */ 0xecb38b, 0xecb38c, 0xecb38d, 0xecb38e,
+ /* 71 */ 0xecb38f, 0xecb391, 0xecb392, 0xecb393,
+ /* 75 */ 0xecb395, 0xecb396, 0xecb397, 0xecb398,
+ /* 79 */ 0xecb399, 0xecb39a, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb39b, 0xecb39c, 0xecb39d, 0xecb39e,
+ /* 85 */ 0xecb39f, 0xecb3a0, 0xecb3a1, 0xecb3a2,
+ /* 89 */ 0xecb3a3, 0xecb3a5, 0xecb3a6, 0xecb3a7,
+ /* 8d */ 0xecb3a8, 0xecb3a9, 0xecb3aa, 0xecb3ab,
+ /* 91 */ 0xecb3ad, 0xecb3ae, 0xecb3af, 0xecb3b1,
+ /* 95 */ 0xecb3b2, 0xecb3b3, 0xecb3b4, 0xecb3b5,
+ /* 99 */ 0xecb3b6, 0xecb3b7, 0xecb3b8, 0xecb3b9,
+ /* 9d */ 0xecb3ba, 0xecb3bb, 0xecb3bc, 0xecb3bd,
+ /* a1 */ 0xe382a1, 0xe382a2, 0xe382a3, 0xe382a4,
+ /* a5 */ 0xe382a5, 0xe382a6, 0xe382a7, 0xe382a8,
+ /* a9 */ 0xe382a9, 0xe382aa, 0xe382ab, 0xe382ac,
+ /* ad */ 0xe382ad, 0xe382ae, 0xe382af, 0xe382b0,
+ /* b1 */ 0xe382b1, 0xe382b2, 0xe382b3, 0xe382b4,
+ /* b5 */ 0xe382b5, 0xe382b6, 0xe382b7, 0xe382b8,
+ /* b9 */ 0xe382b9, 0xe382ba, 0xe382bb, 0xe382bc,
+ /* bd */ 0xe382bd, 0xe382be, 0xe382bf, 0xe38380,
+ /* c1 */ 0xe38381, 0xe38382, 0xe38383, 0xe38384,
+ /* c5 */ 0xe38385, 0xe38386, 0xe38387, 0xe38388,
+ /* c9 */ 0xe38389, 0xe3838a, 0xe3838b, 0xe3838c,
+ /* cd */ 0xe3838d, 0xe3838e, 0xe3838f, 0xe38390,
+ /* d1 */ 0xe38391, 0xe38392, 0xe38393, 0xe38394,
+ /* d5 */ 0xe38395, 0xe38396, 0xe38397, 0xe38398,
+ /* d9 */ 0xe38399, 0xe3839a, 0xe3839b, 0xe3839c,
+ /* dd */ 0xe3839d, 0xe3839e, 0xe3839f, 0xe383a0,
+ /* e1 */ 0xe383a1, 0xe383a2, 0xe383a3, 0xe383a4,
+ /* e5 */ 0xe383a5, 0xe383a6, 0xe383a7, 0xe383a8,
+ /* e9 */ 0xe383a9, 0xe383aa, 0xe383ab, 0xe383ac,
+ /* ed */ 0xe383ad, 0xe383ae, 0xe383af, 0xe383b0,
+ /* f1 */ 0xe383b1, 0xe383b2, 0xe383b3, 0xe383b4,
+ /* f5 */ 0xe383b5, 0xe383b6, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: acxx - offset 0x02126 ***/
+
+ /* 41 */ 0xecb3be, 0xecb3bf, 0xecb480, 0xecb482,
+ /* 45 */ 0xecb483, 0xecb484, 0xecb485, 0xecb486,
+ /* 49 */ 0xecb487, 0xecb48a, 0xecb48b, 0xecb48d,
+ /* 4d */ 0xecb48e, 0xecb48f, 0xecb491, 0xecb492,
+ /* 51 */ 0xecb493, 0xecb494, 0xecb495, 0xecb496,
+ /* 55 */ 0xecb497, 0xecb49a, 0xecb49c, 0xecb49e,
+ /* 59 */ 0xecb49f, 0xecb4a0, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb4a1, 0xecb4a2, 0xecb4a3, 0xecb4a5,
+ /* 65 */ 0xecb4a6, 0xecb4a7, 0xecb4a9, 0xecb4aa,
+ /* 69 */ 0xecb4ab, 0xecb4ad, 0xecb4ae, 0xecb4af,
+ /* 6d */ 0xecb4b0, 0xecb4b1, 0xecb4b2, 0xecb4b3,
+ /* 71 */ 0xecb4b4, 0xecb4b5, 0xecb4b6, 0xecb4b7,
+ /* 75 */ 0xecb4b8, 0xecb4ba, 0xecb4bb, 0xecb4bc,
+ /* 79 */ 0xecb4bd, 0xecb4be, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb4bf, 0xecb580, 0xecb581, 0xecb582,
+ /* 85 */ 0xecb583, 0xecb584, 0xecb585, 0xecb586,
+ /* 89 */ 0xecb587, 0xecb588, 0xecb589, 0xecb58a,
+ /* 8d */ 0xecb58b, 0xecb58c, 0xecb58d, 0xecb58e,
+ /* 91 */ 0xecb58f, 0xecb590, 0xecb591, 0xecb592,
+ /* 95 */ 0xecb593, 0xecb594, 0xecb595, 0xecb596,
+ /* 99 */ 0xecb597, 0xecb598, 0xecb599, 0xecb59a,
+ /* 9d */ 0xecb59b, 0xecb59d, 0xecb59e, 0xecb59f,
+ /* a1 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* a5 */ 0x00d094, 0x00d095, 0x00d081, 0x00d096,
+ /* a9 */ 0x00d097, 0x00d098, 0x00d099, 0x00d09a,
+ /* ad */ 0x00d09b, 0x00d09c, 0x00d09d, 0x00d09e,
+ /* b1 */ 0x00d09f, 0x00d0a0, 0x00d0a1, 0x00d0a2,
+ /* b5 */ 0x00d0a3, 0x00d0a4, 0x00d0a5, 0x00d0a6,
+ /* b9 */ 0x00d0a7, 0x00d0a8, 0x00d0a9, 0x00d0aa,
+ /* bd */ 0x00d0ab, 0x00d0ac, 0x00d0ad, 0x00d0ae,
+ /* c1 */ 0x00d0af, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* d5 */ 0x00d0b4, 0x00d0b5, 0x00d191, 0x00d0b6,
+ /* d9 */ 0x00d0b7, 0x00d0b8, 0x00d0b9, 0x00d0ba,
+ /* dd */ 0x00d0bb, 0x00d0bc, 0x00d0bd, 0x00d0be,
+ /* e1 */ 0x00d0bf, 0x00d180, 0x00d181, 0x00d182,
+ /* e5 */ 0x00d183, 0x00d184, 0x00d185, 0x00d186,
+ /* e9 */ 0x00d187, 0x00d188, 0x00d189, 0x00d18a,
+ /* ed */ 0x00d18b, 0x00d18c, 0x00d18d, 0x00d18e,
+ /* f1 */ 0x00d18f, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: adxx - offset 0x021e4 ***/
+
+ /* 41 */ 0xecb5a1, 0xecb5a2, 0xecb5a3, 0xecb5a5,
+ /* 45 */ 0xecb5a6, 0xecb5a7, 0xecb5a8, 0xecb5a9,
+ /* 49 */ 0xecb5aa, 0xecb5ab, 0xecb5ae, 0xecb5b0,
+ /* 4d */ 0xecb5b2, 0xecb5b3, 0xecb5b4, 0xecb5b5,
+ /* 51 */ 0xecb5b6, 0xecb5b7, 0xecb5b9, 0xecb5ba,
+ /* 55 */ 0xecb5bb, 0xecb5bc, 0xecb5bd, 0xecb5be,
+ /* 59 */ 0xecb5bf, 0xecb680, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb681, 0xecb682, 0xecb683, 0xecb684,
+ /* 65 */ 0xecb685, 0xecb686, 0xecb687, 0xecb689,
+ /* 69 */ 0xecb68a, 0xecb68b, 0xecb68c, 0xecb68d,
+ /* 6d */ 0xecb68e, 0xecb68f, 0xecb690, 0xecb691,
+ /* 71 */ 0xecb692, 0xecb693, 0xecb696, 0xecb697,
+ /* 75 */ 0xecb699, 0xecb69a, 0xecb69b, 0xecb69d,
+ /* 79 */ 0xecb69e, 0xecb69f, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb6a0, 0xecb6a1, 0xecb6a2, 0xecb6a3,
+ /* 85 */ 0xecb6a6, 0xecb6a8, 0xecb6aa, 0xecb6ab,
+ /* 89 */ 0xecb6ac, 0xecb6ad, 0xecb6ae, 0xecb6af,
+ /* 8d */ 0xecb6b1, 0xecb6b2, 0xecb6b3, 0xecb6b4,
+ /* 91 */ 0xecb6b5, 0xecb6b6, 0xecb6b7, 0xecb6b8,
+ /* 95 */ 0xecb6b9, 0xecb6ba, 0xecb6bb, 0xecb6bc,
+ /* 99 */ 0xecb6bd, 0xecb6be, 0xecb6bf, 0xecb780,
+ /* 9d */ 0xecb781, 0xecb782, 0xecb783, 0xecb785,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: aexx - offset 0x022a2 ***/
+
+ /* 41 */ 0xecb786, 0xecb787, 0xecb788, 0xecb789,
+ /* 45 */ 0xecb78a, 0xecb78b, 0xecb78d, 0xecb78e,
+ /* 49 */ 0xecb78f, 0xecb791, 0xecb792, 0xecb793,
+ /* 4d */ 0xecb794, 0xecb795, 0xecb796, 0xecb797,
+ /* 51 */ 0xecb798, 0xecb799, 0xecb79a, 0xecb79b,
+ /* 55 */ 0xecb79c, 0xecb79d, 0xecb79e, 0xecb79f,
+ /* 59 */ 0xecb7a0, 0xecb7a1, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb7a2, 0xecb7a3, 0xecb7a4, 0xecb7a5,
+ /* 65 */ 0xecb7a6, 0xecb7a7, 0xecb7a9, 0xecb7aa,
+ /* 69 */ 0xecb7ab, 0xecb7ad, 0xecb7ae, 0xecb7af,
+ /* 6d */ 0xecb7b1, 0xecb7b2, 0xecb7b3, 0xecb7b4,
+ /* 71 */ 0xecb7b5, 0xecb7b6, 0xecb7b7, 0xecb7ba,
+ /* 75 */ 0xecb7bc, 0xecb7be, 0xecb7bf, 0xecb880,
+ /* 79 */ 0xecb881, 0xecb882, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb883, 0xecb885, 0xecb886, 0xecb887,
+ /* 85 */ 0xecb889, 0xecb88a, 0xecb88b, 0xecb88d,
+ /* 89 */ 0xecb88e, 0xecb88f, 0xecb890, 0xecb891,
+ /* 8d */ 0xecb892, 0xecb893, 0xecb895, 0xecb896,
+ /* 91 */ 0xecb897, 0xecb898, 0xecb89a, 0xecb89b,
+ /* 95 */ 0xecb89c, 0xecb89d, 0xecb89e, 0xecb89f,
+ /* 99 */ 0xecb8a2, 0xecb8a3, 0xecb8a5, 0xecb8a6,
+ /* 9d */ 0xecb8a7, 0xecb8a9, 0xecb8aa, 0xecb8ab,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: afxx - offset 0x02360 ***/
+
+ /* 41 */ 0xecb8ac, 0xecb8ad, 0xecb8ae, 0xecb8af,
+ /* 45 */ 0xecb8b2, 0xecb8b4, 0xecb8b6, 0xecb8b7,
+ /* 49 */ 0xecb8b8, 0xecb8b9, 0xecb8ba, 0xecb8bb,
+ /* 4d */ 0xecb8bc, 0xecb8bd, 0xecb8be, 0xecb8bf,
+ /* 51 */ 0xecb980, 0xecb981, 0xecb982, 0xecb983,
+ /* 55 */ 0xecb984, 0xecb985, 0xecb986, 0xecb987,
+ /* 59 */ 0xecb988, 0xecb989, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecb98a, 0xecb98b, 0xecb98c, 0xecb98d,
+ /* 65 */ 0xecb98e, 0xecb98f, 0xecb990, 0xecb991,
+ /* 69 */ 0xecb992, 0xecb993, 0xecb994, 0xecb995,
+ /* 6d */ 0xecb996, 0xecb997, 0xecb99a, 0xecb99b,
+ /* 71 */ 0xecb99d, 0xecb99e, 0xecb9a2, 0xecb9a3,
+ /* 75 */ 0xecb9a4, 0xecb9a5, 0xecb9a6, 0xecb9a7,
+ /* 79 */ 0xecb9aa, 0xecb9ac, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecb9ae, 0xecb9af, 0xecb9b0, 0xecb9b1,
+ /* 85 */ 0xecb9b2, 0xecb9b3, 0xecb9b6, 0xecb9b7,
+ /* 89 */ 0xecb9b9, 0xecb9ba, 0xecb9bb, 0xecb9bd,
+ /* 8d */ 0xecb9be, 0xecb9bf, 0xecba80, 0xecba81,
+ /* 91 */ 0xecba82, 0xecba83, 0xecba86, 0xecba88,
+ /* 95 */ 0xecba8a, 0xecba8b, 0xecba8c, 0xecba8d,
+ /* 99 */ 0xecba8e, 0xecba8f, 0xecba92, 0xecba93,
+ /* 9d */ 0xecba95, 0xecba96, 0xecba97, 0xecba99,
+ /* a1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ad */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* c9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* cd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* d9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* dd */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f1 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f5 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* f9 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* fd */ 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: b0xx - offset 0x0241e ***/
+
+ /* 41 */ 0xecba9a, 0xecba9b, 0xecba9c, 0xecba9d,
+ /* 45 */ 0xecba9e, 0xecba9f, 0xecbaa2, 0xecbaa6,
+ /* 49 */ 0xecbaa7, 0xecbaa8, 0xecbaa9, 0xecbaaa,
+ /* 4d */ 0xecbaab, 0xecbaae, 0xecbaaf, 0xecbab0,
+ /* 51 */ 0xecbab1, 0xecbab2, 0xecbab3, 0xecbab4,
+ /* 55 */ 0xecbab5, 0xecbab6, 0xecbab7, 0xecbab8,
+ /* 59 */ 0xecbab9, 0xecbaba, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbabb, 0xecbabc, 0xecbabd, 0xecbabe,
+ /* 65 */ 0xecbabf, 0xecbb80, 0xecbb82, 0xecbb83,
+ /* 69 */ 0xecbb84, 0xecbb85, 0xecbb86, 0xecbb87,
+ /* 6d */ 0xecbb88, 0xecbb89, 0xecbb8a, 0xecbb8b,
+ /* 71 */ 0xecbb8c, 0xecbb8d, 0xecbb8e, 0xecbb8f,
+ /* 75 */ 0xecbb90, 0xecbb91, 0xecbb92, 0xecbb93,
+ /* 79 */ 0xecbb94, 0xecbb95, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecbb96, 0xecbb97, 0xecbb98, 0xecbb99,
+ /* 85 */ 0xecbb9a, 0xecbb9b, 0xecbb9c, 0xecbb9d,
+ /* 89 */ 0xecbb9e, 0xecbb9f, 0xecbba0, 0xecbba1,
+ /* 8d */ 0xecbba2, 0xecbba3, 0xecbba6, 0xecbba7,
+ /* 91 */ 0xecbba9, 0xecbbaa, 0xecbbad, 0xecbbae,
+ /* 95 */ 0xecbbaf, 0xecbbb0, 0xecbbb1, 0xecbbb2,
+ /* 99 */ 0xecbbb3, 0xecbbb6, 0xecbbba, 0xecbbbb,
+ /* 9d */ 0xecbbbc, 0xecbbbd, 0xecbbbe, 0xecbbbf,
+ /* a1 */ 0xeab080, 0xeab081, 0xeab084, 0xeab087,
+ /* a5 */ 0xeab088, 0xeab089, 0xeab08a, 0xeab090,
+ /* a9 */ 0xeab091, 0xeab092, 0xeab093, 0xeab094,
+ /* ad */ 0xeab095, 0xeab096, 0xeab097, 0xeab099,
+ /* b1 */ 0xeab09a, 0xeab09b, 0xeab09c, 0xeab09d,
+ /* b5 */ 0xeab0a0, 0xeab0a4, 0xeab0ac, 0xeab0ad,
+ /* b9 */ 0xeab0af, 0xeab0b0, 0xeab0b1, 0xeab0b8,
+ /* bd */ 0xeab0b9, 0xeab0bc, 0xeab180, 0xeab18b,
+ /* c1 */ 0xeab18d, 0xeab194, 0xeab198, 0xeab19c,
+ /* c5 */ 0xeab1b0, 0xeab1b1, 0xeab1b4, 0xeab1b7,
+ /* c9 */ 0xeab1b8, 0xeab1ba, 0xeab280, 0xeab281,
+ /* cd */ 0xeab283, 0xeab284, 0xeab285, 0xeab286,
+ /* d1 */ 0xeab289, 0xeab28a, 0xeab28b, 0xeab28c,
+ /* d5 */ 0xeab290, 0xeab294, 0xeab29c, 0xeab29d,
+ /* d9 */ 0xeab29f, 0xeab2a0, 0xeab2a1, 0xeab2a8,
+ /* dd */ 0xeab2a9, 0xeab2aa, 0xeab2ac, 0xeab2af,
+ /* e1 */ 0xeab2b0, 0xeab2b8, 0xeab2b9, 0xeab2bb,
+ /* e5 */ 0xeab2bc, 0xeab2bd, 0xeab381, 0xeab384,
+ /* e9 */ 0xeab388, 0xeab38c, 0xeab395, 0xeab397,
+ /* ed */ 0xeab3a0, 0xeab3a1, 0xeab3a4, 0xeab3a7,
+ /* f1 */ 0xeab3a8, 0xeab3aa, 0xeab3ac, 0xeab3af,
+ /* f5 */ 0xeab3b0, 0xeab3b1, 0xeab3b3, 0xeab3b5,
+ /* f9 */ 0xeab3b6, 0xeab3bc, 0xeab3bd, 0xeab480,
+ /* fd */ 0xeab484, 0xeab486,
+
+ /*** Two byte table, leaf: b1xx - offset 0x024dc ***/
+
+ /* 41 */ 0xecbc82, 0xecbc83, 0xecbc85, 0xecbc86,
+ /* 45 */ 0xecbc87, 0xecbc89, 0xecbc8a, 0xecbc8b,
+ /* 49 */ 0xecbc8c, 0xecbc8d, 0xecbc8e, 0xecbc8f,
+ /* 4d */ 0xecbc92, 0xecbc94, 0xecbc96, 0xecbc97,
+ /* 51 */ 0xecbc98, 0xecbc99, 0xecbc9a, 0xecbc9b,
+ /* 55 */ 0xecbc9d, 0xecbc9e, 0xecbc9f, 0xecbca1,
+ /* 59 */ 0xecbca2, 0xecbca3, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbca5, 0xecbca6, 0xecbca7, 0xecbca8,
+ /* 65 */ 0xecbca9, 0xecbcaa, 0xecbcab, 0xecbcae,
+ /* 69 */ 0xecbcb2, 0xecbcb3, 0xecbcb4, 0xecbcb5,
+ /* 6d */ 0xecbcb6, 0xecbcb7, 0xecbcb9, 0xecbcba,
+ /* 71 */ 0xecbcbb, 0xecbcbc, 0xecbcbd, 0xecbcbe,
+ /* 75 */ 0xecbcbf, 0xecbd80, 0xecbd81, 0xecbd82,
+ /* 79 */ 0xecbd83, 0xecbd84, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecbd85, 0xecbd86, 0xecbd87, 0xecbd88,
+ /* 85 */ 0xecbd89, 0xecbd8a, 0xecbd8b, 0xecbd8c,
+ /* 89 */ 0xecbd8d, 0xecbd8e, 0xecbd8f, 0xecbd90,
+ /* 8d */ 0xecbd91, 0xecbd92, 0xecbd93, 0xecbd96,
+ /* 91 */ 0xecbd97, 0xecbd99, 0xecbd9a, 0xecbd9b,
+ /* 95 */ 0xecbd9d, 0xecbd9e, 0xecbd9f, 0xecbda0,
+ /* 99 */ 0xecbda1, 0xecbda2, 0xecbda3, 0xecbda6,
+ /* 9d */ 0xecbda8, 0xecbdaa, 0xecbdab, 0xecbdac,
+ /* a1 */ 0xeab48c, 0xeab48d, 0xeab48f, 0xeab491,
+ /* a5 */ 0xeab498, 0xeab49c, 0xeab4a0, 0xeab4a9,
+ /* a9 */ 0xeab4ac, 0xeab4ad, 0xeab4b4, 0xeab4b5,
+ /* ad */ 0xeab4b8, 0xeab4bc, 0xeab584, 0xeab585,
+ /* b1 */ 0xeab587, 0xeab589, 0xeab590, 0xeab594,
+ /* b5 */ 0xeab598, 0xeab5a1, 0xeab5a3, 0xeab5ac,
+ /* b9 */ 0xeab5ad, 0xeab5b0, 0xeab5b3, 0xeab5b4,
+ /* bd */ 0xeab5b5, 0xeab5b6, 0xeab5bb, 0xeab5bc,
+ /* c1 */ 0xeab5bd, 0xeab5bf, 0xeab681, 0xeab682,
+ /* c5 */ 0xeab688, 0xeab689, 0xeab68c, 0xeab690,
+ /* c9 */ 0xeab69c, 0xeab69d, 0xeab6a4, 0xeab6b7,
+ /* cd */ 0xeab780, 0xeab781, 0xeab784, 0xeab788,
+ /* d1 */ 0xeab790, 0xeab791, 0xeab793, 0xeab79c,
+ /* d5 */ 0xeab7a0, 0xeab7a4, 0xeab7b8, 0xeab7b9,
+ /* d9 */ 0xeab7bc, 0xeab7bf, 0xeab880, 0xeab881,
+ /* dd */ 0xeab888, 0xeab889, 0xeab88b, 0xeab88d,
+ /* e1 */ 0xeab894, 0xeab8b0, 0xeab8b1, 0xeab8b4,
+ /* e5 */ 0xeab8b7, 0xeab8b8, 0xeab8ba, 0xeab980,
+ /* e9 */ 0xeab981, 0xeab983, 0xeab985, 0xeab986,
+ /* ed */ 0xeab98a, 0xeab98c, 0xeab98d, 0xeab98e,
+ /* f1 */ 0xeab990, 0xeab994, 0xeab996, 0xeab99c,
+ /* f5 */ 0xeab99d, 0xeab99f, 0xeab9a0, 0xeab9a1,
+ /* f9 */ 0xeab9a5, 0xeab9a8, 0xeab9a9, 0xeab9ac,
+ /* fd */ 0xeab9b0, 0xeab9b8,
+
+ /*** Two byte table, leaf: b2xx - offset 0x0259a ***/
+
+ /* 41 */ 0xecbdad, 0xecbdae, 0xecbdaf, 0xecbdb2,
+ /* 45 */ 0xecbdb3, 0xecbdb5, 0xecbdb6, 0xecbdb7,
+ /* 49 */ 0xecbdb9, 0xecbdba, 0xecbdbb, 0xecbdbc,
+ /* 4d */ 0xecbdbd, 0xecbdbe, 0xecbdbf, 0xecbe81,
+ /* 51 */ 0xecbe82, 0xecbe83, 0xecbe84, 0xecbe86,
+ /* 55 */ 0xecbe87, 0xecbe88, 0xecbe89, 0xecbe8a,
+ /* 59 */ 0xecbe8b, 0xecbe8d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbe8e, 0xecbe8f, 0xecbe90, 0xecbe91,
+ /* 65 */ 0xecbe92, 0xecbe93, 0xecbe94, 0xecbe95,
+ /* 69 */ 0xecbe96, 0xecbe97, 0xecbe98, 0xecbe99,
+ /* 6d */ 0xecbe9a, 0xecbe9b, 0xecbe9c, 0xecbe9d,
+ /* 71 */ 0xecbe9e, 0xecbe9f, 0xecbea0, 0xecbea2,
+ /* 75 */ 0xecbea3, 0xecbea4, 0xecbea5, 0xecbea6,
+ /* 79 */ 0xecbea7, 0xecbea9, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xecbeaa, 0xecbeab, 0xecbeac, 0xecbead,
+ /* 85 */ 0xecbeae, 0xecbeaf, 0xecbeb1, 0xecbeb2,
+ /* 89 */ 0xecbeb3, 0xecbeb4, 0xecbeb5, 0xecbeb6,
+ /* 8d */ 0xecbeb7, 0xecbeb8, 0xecbeb9, 0xecbeba,
+ /* 91 */ 0xecbebb, 0xecbebc, 0xecbebd, 0xecbebe,
+ /* 95 */ 0xecbebf, 0xecbf80, 0xecbf81, 0xecbf82,
+ /* 99 */ 0xecbf83, 0xecbf85, 0xecbf86, 0xecbf87,
+ /* 9d */ 0xecbf88, 0xecbf89, 0xecbf8a, 0xecbf8b,
+ /* a1 */ 0xeab9b9, 0xeab9bb, 0xeab9bc, 0xeab9bd,
+ /* a5 */ 0xeaba84, 0xeaba85, 0xeaba8c, 0xeababc,
+ /* a9 */ 0xeababd, 0xeababe, 0xeabb80, 0xeabb84,
+ /* ad */ 0xeabb8c, 0xeabb8d, 0xeabb8f, 0xeabb90,
+ /* b1 */ 0xeabb91, 0xeabb98, 0xeabb99, 0xeabb9c,
+ /* b5 */ 0xeabba8, 0xeabbab, 0xeabbad, 0xeabbb4,
+ /* b9 */ 0xeabbb8, 0xeabbbc, 0xeabc87, 0xeabc88,
+ /* bd */ 0xeabc8d, 0xeabc90, 0xeabcac, 0xeabcad,
+ /* c1 */ 0xeabcb0, 0xeabcb2, 0xeabcb4, 0xeabcbc,
+ /* c5 */ 0xeabcbd, 0xeabcbf, 0xeabd81, 0xeabd82,
+ /* c9 */ 0xeabd83, 0xeabd88, 0xeabd89, 0xeabd90,
+ /* cd */ 0xeabd9c, 0xeabd9d, 0xeabda4, 0xeabda5,
+ /* d1 */ 0xeabdb9, 0xeabe80, 0xeabe84, 0xeabe88,
+ /* d5 */ 0xeabe90, 0xeabe91, 0xeabe95, 0xeabe9c,
+ /* d9 */ 0xeabeb8, 0xeabeb9, 0xeabebc, 0xeabf80,
+ /* dd */ 0xeabf87, 0xeabf88, 0xeabf89, 0xeabf8b,
+ /* e1 */ 0xeabf8d, 0xeabf8e, 0xeabf94, 0xeabf9c,
+ /* e5 */ 0xeabfa8, 0xeabfa9, 0xeabfb0, 0xeabfb1,
+ /* e9 */ 0xeabfb4, 0xeabfb8, 0xeb8080, 0xeb8081,
+ /* ed */ 0xeb8084, 0xeb808c, 0xeb8090, 0xeb8094,
+ /* f1 */ 0xeb809c, 0xeb809d, 0xeb80a8, 0xeb8184,
+ /* f5 */ 0xeb8185, 0xeb8188, 0xeb818a, 0xeb818c,
+ /* f9 */ 0xeb818e, 0xeb8193, 0xeb8194, 0xeb8195,
+ /* fd */ 0xeb8197, 0xeb8199,
+
+ /*** Two byte table, leaf: b3xx - offset 0x02658 ***/
+
+ /* 41 */ 0xecbf8c, 0xecbf8d, 0xecbf8e, 0xecbf8f,
+ /* 45 */ 0xecbf90, 0xecbf91, 0xecbf92, 0xecbf93,
+ /* 49 */ 0xecbf94, 0xecbf95, 0xecbf96, 0xecbf97,
+ /* 4d */ 0xecbf98, 0xecbf99, 0xecbf9a, 0xecbf9b,
+ /* 51 */ 0xecbf9c, 0xecbf9d, 0xecbf9e, 0xecbf9f,
+ /* 55 */ 0xecbfa2, 0xecbfa3, 0xecbfa5, 0xecbfa6,
+ /* 59 */ 0xecbfa7, 0xecbfa9, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xecbfaa, 0xecbfab, 0xecbfac, 0xecbfad,
+ /* 65 */ 0xecbfae, 0xecbfaf, 0xecbfb2, 0xecbfb4,
+ /* 69 */ 0xecbfb6, 0xecbfb7, 0xecbfb8, 0xecbfb9,
+ /* 6d */ 0xecbfba, 0xecbfbb, 0xecbfbd, 0xecbfbe,
+ /* 71 */ 0xecbfbf, 0xed8081, 0xed8082, 0xed8083,
+ /* 75 */ 0xed8085, 0xed8086, 0xed8087, 0xed8088,
+ /* 79 */ 0xed8089, 0xed808a, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed808b, 0xed808c, 0xed808d, 0xed808e,
+ /* 85 */ 0xed808f, 0xed8090, 0xed8092, 0xed8093,
+ /* 89 */ 0xed8094, 0xed8095, 0xed8096, 0xed8097,
+ /* 8d */ 0xed8099, 0xed809a, 0xed809b, 0xed809c,
+ /* 91 */ 0xed809d, 0xed809e, 0xed809f, 0xed80a0,
+ /* 95 */ 0xed80a1, 0xed80a2, 0xed80a3, 0xed80a4,
+ /* 99 */ 0xed80a5, 0xed80a6, 0xed80a7, 0xed80a8,
+ /* 9d */ 0xed80a9, 0xed80aa, 0xed80ab, 0xed80ac,
+ /* a1 */ 0xeb819d, 0xeb81bc, 0xeb81bd, 0xeb8280,
+ /* a5 */ 0xeb8284, 0xeb828c, 0xeb828d, 0xeb828f,
+ /* a9 */ 0xeb8291, 0xeb8298, 0xeb8299, 0xeb829a,
+ /* ad */ 0xeb829c, 0xeb829f, 0xeb82a0, 0xeb82a1,
+ /* b1 */ 0xeb82a2, 0xeb82a8, 0xeb82a9, 0xeb82ab,
+ /* b5 */ 0xeb82ac, 0xeb82ad, 0xeb82ae, 0xeb82af,
+ /* b9 */ 0xeb82b1, 0xeb82b3, 0xeb82b4, 0xeb82b5,
+ /* bd */ 0xeb82b8, 0xeb82bc, 0xeb8384, 0xeb8385,
+ /* c1 */ 0xeb8387, 0xeb8388, 0xeb8389, 0xeb8390,
+ /* c5 */ 0xeb8391, 0xeb8394, 0xeb8398, 0xeb83a0,
+ /* c9 */ 0xeb83a5, 0xeb8488, 0xeb8489, 0xeb848b,
+ /* cd */ 0xeb848c, 0xeb8490, 0xeb8492, 0xeb8493,
+ /* d1 */ 0xeb8498, 0xeb8499, 0xeb849b, 0xeb849c,
+ /* d5 */ 0xeb849d, 0xeb84a3, 0xeb84a4, 0xeb84a5,
+ /* d9 */ 0xeb84a8, 0xeb84ac, 0xeb84b4, 0xeb84b5,
+ /* dd */ 0xeb84b7, 0xeb84b8, 0xeb84b9, 0xeb8580,
+ /* e1 */ 0xeb8581, 0xeb8584, 0xeb8588, 0xeb8590,
+ /* e5 */ 0xeb8591, 0xeb8594, 0xeb8595, 0xeb8598,
+ /* e9 */ 0xeb859c, 0xeb85a0, 0xeb85b8, 0xeb85b9,
+ /* ed */ 0xeb85bc, 0xeb8680, 0xeb8682, 0xeb8688,
+ /* f1 */ 0xeb8689, 0xeb868b, 0xeb868d, 0xeb8692,
+ /* f5 */ 0xeb8693, 0xeb8694, 0xeb8698, 0xeb869c,
+ /* f9 */ 0xeb86a8, 0xeb878c, 0xeb8790, 0xeb8794,
+ /* fd */ 0xeb879c, 0xeb879d,
+
+ /*** Two byte table, leaf: b4xx - offset 0x02716 ***/
+
+ /* 41 */ 0xed80ae, 0xed80af, 0xed80b0, 0xed80b1,
+ /* 45 */ 0xed80b2, 0xed80b3, 0xed80b6, 0xed80b7,
+ /* 49 */ 0xed80b9, 0xed80ba, 0xed80bb, 0xed80bd,
+ /* 4d */ 0xed80be, 0xed80bf, 0xed8180, 0xed8181,
+ /* 51 */ 0xed8182, 0xed8183, 0xed8186, 0xed8188,
+ /* 55 */ 0xed818a, 0xed818b, 0xed818c, 0xed818d,
+ /* 59 */ 0xed818e, 0xed818f, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8191, 0xed8192, 0xed8193, 0xed8195,
+ /* 65 */ 0xed8196, 0xed8197, 0xed8199, 0xed819a,
+ /* 69 */ 0xed819b, 0xed819c, 0xed819d, 0xed819e,
+ /* 6d */ 0xed819f, 0xed81a1, 0xed81a2, 0xed81a3,
+ /* 71 */ 0xed81a4, 0xed81a5, 0xed81a6, 0xed81a7,
+ /* 75 */ 0xed81a8, 0xed81a9, 0xed81aa, 0xed81ab,
+ /* 79 */ 0xed81ae, 0xed81af, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed81b1, 0xed81b2, 0xed81b3, 0xed81b5,
+ /* 85 */ 0xed81b6, 0xed81b7, 0xed81b8, 0xed81b9,
+ /* 89 */ 0xed81ba, 0xed81bb, 0xed81be, 0xed81bf,
+ /* 8d */ 0xed8280, 0xed8282, 0xed8283, 0xed8284,
+ /* 91 */ 0xed8285, 0xed8286, 0xed8287, 0xed8288,
+ /* 95 */ 0xed8289, 0xed828a, 0xed828b, 0xed828c,
+ /* 99 */ 0xed828d, 0xed828e, 0xed828f, 0xed8290,
+ /* 9d */ 0xed8291, 0xed8292, 0xed8293, 0xed8294,
+ /* a1 */ 0xeb879f, 0xeb87a8, 0xeb87a9, 0xeb87ac,
+ /* a5 */ 0xeb87b0, 0xeb87b9, 0xeb87bb, 0xeb87bd,
+ /* a9 */ 0xeb8884, 0xeb8885, 0xeb8888, 0xeb888b,
+ /* ad */ 0xeb888c, 0xeb8894, 0xeb8895, 0xeb8897,
+ /* b1 */ 0xeb8899, 0xeb88a0, 0xeb88b4, 0xeb88bc,
+ /* b5 */ 0xeb8998, 0xeb899c, 0xeb89a0, 0xeb89a8,
+ /* b9 */ 0xeb89a9, 0xeb89b4, 0xeb89b5, 0xeb89bc,
+ /* bd */ 0xeb8a84, 0xeb8a85, 0xeb8a89, 0xeb8a90,
+ /* c1 */ 0xeb8a91, 0xeb8a94, 0xeb8a98, 0xeb8a99,
+ /* c5 */ 0xeb8a9a, 0xeb8aa0, 0xeb8aa1, 0xeb8aa3,
+ /* c9 */ 0xeb8aa5, 0xeb8aa6, 0xeb8aaa, 0xeb8aac,
+ /* cd */ 0xeb8ab0, 0xeb8ab4, 0xeb8b88, 0xeb8b89,
+ /* d1 */ 0xeb8b8c, 0xeb8b90, 0xeb8b92, 0xeb8b98,
+ /* d5 */ 0xeb8b99, 0xeb8b9b, 0xeb8b9d, 0xeb8ba2,
+ /* d9 */ 0xeb8ba4, 0xeb8ba5, 0xeb8ba6, 0xeb8ba8,
+ /* dd */ 0xeb8bab, 0xeb8bac, 0xeb8bad, 0xeb8bae,
+ /* e1 */ 0xeb8baf, 0xeb8bb3, 0xeb8bb4, 0xeb8bb5,
+ /* e5 */ 0xeb8bb7, 0xeb8bb8, 0xeb8bb9, 0xeb8bba,
+ /* e9 */ 0xeb8bbb, 0xeb8bbf, 0xeb8c80, 0xeb8c81,
+ /* ed */ 0xeb8c84, 0xeb8c88, 0xeb8c90, 0xeb8c91,
+ /* f1 */ 0xeb8c93, 0xeb8c94, 0xeb8c95, 0xeb8c9c,
+ /* f5 */ 0xeb8d94, 0xeb8d95, 0xeb8d96, 0xeb8d98,
+ /* f9 */ 0xeb8d9b, 0xeb8d9c, 0xeb8d9e, 0xeb8d9f,
+ /* fd */ 0xeb8da4, 0xeb8da5,
+
+ /*** Two byte table, leaf: b5xx - offset 0x027d4 ***/
+
+ /* 41 */ 0xed8295, 0xed8296, 0xed8297, 0xed8298,
+ /* 45 */ 0xed8299, 0xed829a, 0xed829b, 0xed829c,
+ /* 49 */ 0xed829d, 0xed829e, 0xed829f, 0xed82a0,
+ /* 4d */ 0xed82a1, 0xed82a2, 0xed82a3, 0xed82a6,
+ /* 51 */ 0xed82a7, 0xed82a9, 0xed82aa, 0xed82ab,
+ /* 55 */ 0xed82ad, 0xed82ae, 0xed82af, 0xed82b0,
+ /* 59 */ 0xed82b1, 0xed82b2, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed82b3, 0xed82b6, 0xed82b8, 0xed82ba,
+ /* 65 */ 0xed82bb, 0xed82bc, 0xed82bd, 0xed82be,
+ /* 69 */ 0xed82bf, 0xed8382, 0xed8383, 0xed8385,
+ /* 6d */ 0xed8386, 0xed8387, 0xed838a, 0xed838b,
+ /* 71 */ 0xed838c, 0xed838d, 0xed838e, 0xed838f,
+ /* 75 */ 0xed8392, 0xed8396, 0xed8397, 0xed8398,
+ /* 79 */ 0xed8399, 0xed839a, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed839b, 0xed839e, 0xed839f, 0xed83a1,
+ /* 85 */ 0xed83a2, 0xed83a3, 0xed83a5, 0xed83a6,
+ /* 89 */ 0xed83a7, 0xed83a8, 0xed83a9, 0xed83aa,
+ /* 8d */ 0xed83ab, 0xed83ae, 0xed83b2, 0xed83b3,
+ /* 91 */ 0xed83b4, 0xed83b5, 0xed83b6, 0xed83b7,
+ /* 95 */ 0xed83b9, 0xed83ba, 0xed83bb, 0xed83bc,
+ /* 99 */ 0xed83bd, 0xed83be, 0xed83bf, 0xed8480,
+ /* 9d */ 0xed8481, 0xed8482, 0xed8483, 0xed8484,
+ /* a1 */ 0xeb8da7, 0xeb8da9, 0xeb8dab, 0xeb8dae,
+ /* a5 */ 0xeb8db0, 0xeb8db1, 0xeb8db4, 0xeb8db8,
+ /* a9 */ 0xeb8e80, 0xeb8e81, 0xeb8e83, 0xeb8e84,
+ /* ad */ 0xeb8e85, 0xeb8e8c, 0xeb8e90, 0xeb8e94,
+ /* b1 */ 0xeb8ea0, 0xeb8ea1, 0xeb8ea8, 0xeb8eac,
+ /* b5 */ 0xeb8f84, 0xeb8f85, 0xeb8f88, 0xeb8f8b,
+ /* b9 */ 0xeb8f8c, 0xeb8f8e, 0xeb8f90, 0xeb8f94,
+ /* bd */ 0xeb8f95, 0xeb8f97, 0xeb8f99, 0xeb8f9b,
+ /* c1 */ 0xeb8f9d, 0xeb8fa0, 0xeb8fa4, 0xeb8fa8,
+ /* c5 */ 0xeb8fbc, 0xeb9090, 0xeb9098, 0xeb909c,
+ /* c9 */ 0xeb90a0, 0xeb90a8, 0xeb90a9, 0xeb90ab,
+ /* cd */ 0xeb90b4, 0xeb9190, 0xeb9191, 0xeb9194,
+ /* d1 */ 0xeb9198, 0xeb91a0, 0xeb91a1, 0xeb91a3,
+ /* d5 */ 0xeb91a5, 0xeb91ac, 0xeb9280, 0xeb9288,
+ /* d9 */ 0xeb929d, 0xeb92a4, 0xeb92a8, 0xeb92ac,
+ /* dd */ 0xeb92b5, 0xeb92b7, 0xeb92b9, 0xeb9380,
+ /* e1 */ 0xeb9384, 0xeb9388, 0xeb9390, 0xeb9395,
+ /* e5 */ 0xeb939c, 0xeb939d, 0xeb93a0, 0xeb93a3,
+ /* e9 */ 0xeb93a4, 0xeb93a6, 0xeb93ac, 0xeb93ad,
+ /* ed */ 0xeb93af, 0xeb93b1, 0xeb93b8, 0xeb9494,
+ /* f1 */ 0xeb9495, 0xeb9498, 0xeb949b, 0xeb949c,
+ /* f5 */ 0xeb94a4, 0xeb94a5, 0xeb94a7, 0xeb94a8,
+ /* f9 */ 0xeb94a9, 0xeb94aa, 0xeb94b0, 0xeb94b1,
+ /* fd */ 0xeb94b4, 0xeb94b8,
+
+ /*** Two byte table, leaf: b6xx - offset 0x02892 ***/
+
+ /* 41 */ 0xed8485, 0xed8486, 0xed8487, 0xed8488,
+ /* 45 */ 0xed8489, 0xed848a, 0xed848b, 0xed848c,
+ /* 49 */ 0xed848e, 0xed848f, 0xed8490, 0xed8491,
+ /* 4d */ 0xed8492, 0xed8493, 0xed8494, 0xed8495,
+ /* 51 */ 0xed8496, 0xed8497, 0xed8498, 0xed8499,
+ /* 55 */ 0xed849a, 0xed849b, 0xed849c, 0xed849d,
+ /* 59 */ 0xed849e, 0xed849f, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed84a0, 0xed84a1, 0xed84a2, 0xed84a3,
+ /* 65 */ 0xed84a4, 0xed84a5, 0xed84a6, 0xed84a7,
+ /* 69 */ 0xed84a8, 0xed84a9, 0xed84aa, 0xed84ab,
+ /* 6d */ 0xed84ac, 0xed84ad, 0xed84ae, 0xed84af,
+ /* 71 */ 0xed84b2, 0xed84b3, 0xed84b5, 0xed84b6,
+ /* 75 */ 0xed84b7, 0xed84b9, 0xed84bb, 0xed84bc,
+ /* 79 */ 0xed84bd, 0xed84be, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed84bf, 0xed8582, 0xed8586, 0xed8587,
+ /* 85 */ 0xed8588, 0xed8589, 0xed858a, 0xed858b,
+ /* 89 */ 0xed858e, 0xed858f, 0xed8591, 0xed8592,
+ /* 8d */ 0xed8593, 0xed8595, 0xed8596, 0xed8597,
+ /* 91 */ 0xed8598, 0xed8599, 0xed859a, 0xed859b,
+ /* 95 */ 0xed859e, 0xed85a0, 0xed85a2, 0xed85a3,
+ /* 99 */ 0xed85a4, 0xed85a5, 0xed85a6, 0xed85a7,
+ /* 9d */ 0xed85a9, 0xed85aa, 0xed85ab, 0xed85ad,
+ /* a1 */ 0xeb9580, 0xeb9581, 0xeb9583, 0xeb9584,
+ /* a5 */ 0xeb9585, 0xeb958b, 0xeb958c, 0xeb958d,
+ /* a9 */ 0xeb9590, 0xeb9594, 0xeb959c, 0xeb959d,
+ /* ad */ 0xeb959f, 0xeb95a0, 0xeb95a1, 0xeb96a0,
+ /* b1 */ 0xeb96a1, 0xeb96a4, 0xeb96a8, 0xeb96aa,
+ /* b5 */ 0xeb96ab, 0xeb96b0, 0xeb96b1, 0xeb96b3,
+ /* b9 */ 0xeb96b4, 0xeb96b5, 0xeb96bb, 0xeb96bc,
+ /* bd */ 0xeb96bd, 0xeb9780, 0xeb9784, 0xeb978c,
+ /* c1 */ 0xeb978d, 0xeb978f, 0xeb9790, 0xeb9791,
+ /* c5 */ 0xeb9798, 0xeb97ac, 0xeb9890, 0xeb9891,
+ /* c9 */ 0xeb9894, 0xeb9898, 0xeb98a5, 0xeb98ac,
+ /* cd */ 0xeb98b4, 0xeb9988, 0xeb99a4, 0xeb99a8,
+ /* d1 */ 0xeb9a9c, 0xeb9a9d, 0xeb9aa0, 0xeb9aa4,
+ /* d5 */ 0xeb9aab, 0xeb9aac, 0xeb9ab1, 0xeb9b94,
+ /* d9 */ 0xeb9bb0, 0xeb9bb4, 0xeb9bb8, 0xeb9c80,
+ /* dd */ 0xeb9c81, 0xeb9c85, 0xeb9ca8, 0xeb9ca9,
+ /* e1 */ 0xeb9cac, 0xeb9caf, 0xeb9cb0, 0xeb9cb8,
+ /* e5 */ 0xeb9cb9, 0xeb9cbb, 0xeb9d84, 0xeb9d88,
+ /* e9 */ 0xeb9d8c, 0xeb9d94, 0xeb9d95, 0xeb9da0,
+ /* ed */ 0xeb9da4, 0xeb9da8, 0xeb9db0, 0xeb9db1,
+ /* f1 */ 0xeb9db3, 0xeb9db5, 0xeb9dbc, 0xeb9dbd,
+ /* f5 */ 0xeb9e80, 0xeb9e84, 0xeb9e8c, 0xeb9e8d,
+ /* f9 */ 0xeb9e8f, 0xeb9e90, 0xeb9e91, 0xeb9e92,
+ /* fd */ 0xeb9e96, 0xeb9e97,
+
+ /*** Two byte table, leaf: b7xx - offset 0x02950 ***/
+
+ /* 41 */ 0xed85ae, 0xed85af, 0xed85b0, 0xed85b1,
+ /* 45 */ 0xed85b2, 0xed85b3, 0xed85b4, 0xed85b5,
+ /* 49 */ 0xed85b6, 0xed85b7, 0xed85b8, 0xed85b9,
+ /* 4d */ 0xed85ba, 0xed85bb, 0xed85bd, 0xed85be,
+ /* 51 */ 0xed85bf, 0xed8680, 0xed8681, 0xed8682,
+ /* 55 */ 0xed8683, 0xed8685, 0xed8686, 0xed8687,
+ /* 59 */ 0xed8689, 0xed868a, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed868b, 0xed868c, 0xed868d, 0xed868e,
+ /* 65 */ 0xed868f, 0xed8690, 0xed8691, 0xed8692,
+ /* 69 */ 0xed8693, 0xed8694, 0xed8695, 0xed8696,
+ /* 6d */ 0xed8697, 0xed8698, 0xed8699, 0xed869a,
+ /* 71 */ 0xed869b, 0xed869c, 0xed869d, 0xed869e,
+ /* 75 */ 0xed869f, 0xed86a2, 0xed86a3, 0xed86a5,
+ /* 79 */ 0xed86a6, 0xed86a7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed86a9, 0xed86aa, 0xed86ab, 0xed86ac,
+ /* 85 */ 0xed86ad, 0xed86ae, 0xed86af, 0xed86b2,
+ /* 89 */ 0xed86b4, 0xed86b6, 0xed86b7, 0xed86b8,
+ /* 8d */ 0xed86b9, 0xed86bb, 0xed86bd, 0xed86be,
+ /* 91 */ 0xed86bf, 0xed8781, 0xed8782, 0xed8783,
+ /* 95 */ 0xed8784, 0xed8785, 0xed8786, 0xed8787,
+ /* 99 */ 0xed8788, 0xed8789, 0xed878a, 0xed878b,
+ /* 9d */ 0xed878c, 0xed878d, 0xed878e, 0xed878f,
+ /* a1 */ 0xeb9e98, 0xeb9e99, 0xeb9e9c, 0xeb9ea0,
+ /* a5 */ 0xeb9ea8, 0xeb9ea9, 0xeb9eab, 0xeb9eac,
+ /* a9 */ 0xeb9ead, 0xeb9eb4, 0xeb9eb5, 0xeb9eb8,
+ /* ad */ 0xeb9f87, 0xeb9f89, 0xeb9fac, 0xeb9fad,
+ /* b1 */ 0xeb9fb0, 0xeb9fb4, 0xeb9fbc, 0xeb9fbd,
+ /* b5 */ 0xeb9fbf, 0xeba080, 0xeba081, 0xeba087,
+ /* b9 */ 0xeba088, 0xeba089, 0xeba08c, 0xeba090,
+ /* bd */ 0xeba098, 0xeba099, 0xeba09b, 0xeba09d,
+ /* c1 */ 0xeba0a4, 0xeba0a5, 0xeba0a8, 0xeba0ac,
+ /* c5 */ 0xeba0b4, 0xeba0b5, 0xeba0b7, 0xeba0b8,
+ /* c9 */ 0xeba0b9, 0xeba180, 0xeba184, 0xeba191,
+ /* cd */ 0xeba193, 0xeba19c, 0xeba19d, 0xeba1a0,
+ /* d1 */ 0xeba1a4, 0xeba1ac, 0xeba1ad, 0xeba1af,
+ /* d5 */ 0xeba1b1, 0xeba1b8, 0xeba1bc, 0xeba28d,
+ /* d9 */ 0xeba2a8, 0xeba2b0, 0xeba2b4, 0xeba2b8,
+ /* dd */ 0xeba380, 0xeba381, 0xeba383, 0xeba385,
+ /* e1 */ 0xeba38c, 0xeba390, 0xeba394, 0xeba39d,
+ /* e5 */ 0xeba39f, 0xeba3a1, 0xeba3a8, 0xeba3a9,
+ /* e9 */ 0xeba3ac, 0xeba3b0, 0xeba3b8, 0xeba3b9,
+ /* ed */ 0xeba3bb, 0xeba3bd, 0xeba484, 0xeba498,
+ /* f1 */ 0xeba4a0, 0xeba4bc, 0xeba4bd, 0xeba580,
+ /* f5 */ 0xeba584, 0xeba58c, 0xeba58f, 0xeba591,
+ /* f9 */ 0xeba598, 0xeba599, 0xeba59c, 0xeba5a0,
+ /* fd */ 0xeba5a8, 0xeba5a9,
+
+ /*** Two byte table, leaf: b8xx - offset 0x02a0e ***/
+
+ /* 41 */ 0xed8790, 0xed8791, 0xed8792, 0xed8793,
+ /* 45 */ 0xed8794, 0xed8795, 0xed8796, 0xed8797,
+ /* 49 */ 0xed8799, 0xed879a, 0xed879b, 0xed879c,
+ /* 4d */ 0xed879d, 0xed879e, 0xed879f, 0xed87a0,
+ /* 51 */ 0xed87a1, 0xed87a2, 0xed87a3, 0xed87a4,
+ /* 55 */ 0xed87a5, 0xed87a6, 0xed87a7, 0xed87a8,
+ /* 59 */ 0xed87a9, 0xed87aa, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed87ab, 0xed87ac, 0xed87ad, 0xed87ae,
+ /* 65 */ 0xed87af, 0xed87b0, 0xed87b1, 0xed87b2,
+ /* 69 */ 0xed87b3, 0xed87b5, 0xed87b6, 0xed87b7,
+ /* 6d */ 0xed87b9, 0xed87ba, 0xed87bb, 0xed87bc,
+ /* 71 */ 0xed87bd, 0xed87be, 0xed87bf, 0xed8880,
+ /* 75 */ 0xed8881, 0xed8882, 0xed8883, 0xed8884,
+ /* 79 */ 0xed8885, 0xed8886, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8888, 0xed888a, 0xed888b, 0xed888c,
+ /* 85 */ 0xed888d, 0xed888e, 0xed888f, 0xed8891,
+ /* 89 */ 0xed8892, 0xed8893, 0xed8894, 0xed8895,
+ /* 8d */ 0xed8896, 0xed8897, 0xed8898, 0xed8899,
+ /* 91 */ 0xed889a, 0xed889b, 0xed889c, 0xed889d,
+ /* 95 */ 0xed889e, 0xed889f, 0xed88a0, 0xed88a1,
+ /* 99 */ 0xed88a2, 0xed88a3, 0xed88a4, 0xed88a5,
+ /* 9d */ 0xed88a6, 0xed88a7, 0xed88a8, 0xed88a9,
+ /* a1 */ 0xeba5ab, 0xeba5ad, 0xeba5b4, 0xeba5b5,
+ /* a5 */ 0xeba5b8, 0xeba5bc, 0xeba684, 0xeba685,
+ /* a9 */ 0xeba687, 0xeba689, 0xeba68a, 0xeba68d,
+ /* ad */ 0xeba68e, 0xeba6ac, 0xeba6ad, 0xeba6b0,
+ /* b1 */ 0xeba6b4, 0xeba6bc, 0xeba6bd, 0xeba6bf,
+ /* b5 */ 0xeba781, 0xeba788, 0xeba789, 0xeba78c,
+ /* b9 */ 0xeba78e, 0xeba78f, 0xeba790, 0xeba791,
+ /* bd */ 0xeba792, 0xeba798, 0xeba799, 0xeba79b,
+ /* c1 */ 0xeba79d, 0xeba79e, 0xeba7a1, 0xeba7a3,
+ /* c5 */ 0xeba7a4, 0xeba7a5, 0xeba7a8, 0xeba7ac,
+ /* c9 */ 0xeba7b4, 0xeba7b5, 0xeba7b7, 0xeba7b8,
+ /* cd */ 0xeba7b9, 0xeba7ba, 0xeba880, 0xeba881,
+ /* d1 */ 0xeba888, 0xeba895, 0xeba8b8, 0xeba8b9,
+ /* d5 */ 0xeba8bc, 0xeba980, 0xeba982, 0xeba988,
+ /* d9 */ 0xeba989, 0xeba98b, 0xeba98d, 0xeba98e,
+ /* dd */ 0xeba993, 0xeba994, 0xeba995, 0xeba998,
+ /* e1 */ 0xeba99c, 0xeba9a4, 0xeba9a5, 0xeba9a7,
+ /* e5 */ 0xeba9a8, 0xeba9a9, 0xeba9b0, 0xeba9b1,
+ /* e9 */ 0xeba9b4, 0xeba9b8, 0xebaa83, 0xebaa84,
+ /* ed */ 0xebaa85, 0xebaa87, 0xebaa8c, 0xebaaa8,
+ /* f1 */ 0xebaaa9, 0xebaaab, 0xebaaac, 0xebaab0,
+ /* f5 */ 0xebaab2, 0xebaab8, 0xebaab9, 0xebaabb,
+ /* f9 */ 0xebaabd, 0xebab84, 0xebab88, 0xebab98,
+ /* fd */ 0xebab99, 0xebabbc,
+
+ /*** Two byte table, leaf: b9xx - offset 0x02acc ***/
+
+ /* 41 */ 0xed88aa, 0xed88ab, 0xed88ae, 0xed88af,
+ /* 45 */ 0xed88b1, 0xed88b2, 0xed88b3, 0xed88b5,
+ /* 49 */ 0xed88b6, 0xed88b7, 0xed88b8, 0xed88b9,
+ /* 4d */ 0xed88ba, 0xed88bb, 0xed88be, 0xed8980,
+ /* 51 */ 0xed8982, 0xed8983, 0xed8984, 0xed8985,
+ /* 55 */ 0xed8986, 0xed8987, 0xed8989, 0xed898a,
+ /* 59 */ 0xed898b, 0xed898c, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed898d, 0xed898e, 0xed898f, 0xed8990,
+ /* 65 */ 0xed8991, 0xed8992, 0xed8993, 0xed8994,
+ /* 69 */ 0xed8995, 0xed8996, 0xed8997, 0xed8998,
+ /* 6d */ 0xed8999, 0xed899a, 0xed899b, 0xed899d,
+ /* 71 */ 0xed899e, 0xed899f, 0xed89a0, 0xed89a1,
+ /* 75 */ 0xed89a2, 0xed89a3, 0xed89a5, 0xed89a6,
+ /* 79 */ 0xed89a7, 0xed89a8, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed89a9, 0xed89aa, 0xed89ab, 0xed89ac,
+ /* 85 */ 0xed89ad, 0xed89ae, 0xed89af, 0xed89b0,
+ /* 89 */ 0xed89b1, 0xed89b2, 0xed89b3, 0xed89b4,
+ /* 8d */ 0xed89b5, 0xed89b6, 0xed89b7, 0xed89b8,
+ /* 91 */ 0xed89b9, 0xed89ba, 0xed89bb, 0xed89bc,
+ /* 95 */ 0xed89bd, 0xed89be, 0xed89bf, 0xed8a82,
+ /* 99 */ 0xed8a83, 0xed8a85, 0xed8a86, 0xed8a87,
+ /* 9d */ 0xed8a89, 0xed8a8a, 0xed8a8b, 0xed8a8c,
+ /* a1 */ 0xebac80, 0xebac84, 0xebac8d, 0xebac8f,
+ /* a5 */ 0xebac91, 0xebac98, 0xebac9c, 0xebaca0,
+ /* a9 */ 0xebaca9, 0xebacab, 0xebacb4, 0xebacb5,
+ /* ad */ 0xebacb6, 0xebacb8, 0xebacbb, 0xebacbc,
+ /* b1 */ 0xebacbd, 0xebacbe, 0xebad84, 0xebad85,
+ /* b5 */ 0xebad87, 0xebad89, 0xebad8d, 0xebad8f,
+ /* b9 */ 0xebad90, 0xebad94, 0xebad98, 0xebada1,
+ /* bd */ 0xebada3, 0xebadac, 0xebae88, 0xebae8c,
+ /* c1 */ 0xebae90, 0xebaea4, 0xebaea8, 0xebaeac,
+ /* c5 */ 0xebaeb4, 0xebaeb7, 0xebaf80, 0xebaf84,
+ /* c9 */ 0xebaf88, 0xebaf90, 0xebaf93, 0xebafb8,
+ /* cd */ 0xebafb9, 0xebafbc, 0xebafbf, 0xebb080,
+ /* d1 */ 0xebb082, 0xebb088, 0xebb089, 0xebb08b,
+ /* d5 */ 0xebb08c, 0xebb08d, 0xebb08f, 0xebb091,
+ /* d9 */ 0xebb094, 0xebb095, 0xebb096, 0xebb097,
+ /* dd */ 0xebb098, 0xebb09b, 0xebb09c, 0xebb09d,
+ /* e1 */ 0xebb09e, 0xebb09f, 0xebb0a4, 0xebb0a5,
+ /* e5 */ 0xebb0a7, 0xebb0a9, 0xebb0ad, 0xebb0b0,
+ /* e9 */ 0xebb0b1, 0xebb0b4, 0xebb0b8, 0xebb180,
+ /* ed */ 0xebb181, 0xebb183, 0xebb184, 0xebb185,
+ /* f1 */ 0xebb189, 0xebb18c, 0xebb18d, 0xebb190,
+ /* f5 */ 0xebb19d, 0xebb284, 0xebb285, 0xebb288,
+ /* f9 */ 0xebb28b, 0xebb28c, 0xebb28e, 0xebb294,
+ /* fd */ 0xebb295, 0xebb297,
+
+ /*** Two byte table, leaf: baxx - offset 0x02b8a ***/
+
+ /* 41 */ 0xed8a8d, 0xed8a8e, 0xed8a8f, 0xed8a92,
+ /* 45 */ 0xed8a93, 0xed8a94, 0xed8a96, 0xed8a97,
+ /* 49 */ 0xed8a98, 0xed8a99, 0xed8a9a, 0xed8a9b,
+ /* 4d */ 0xed8a9d, 0xed8a9e, 0xed8a9f, 0xed8aa1,
+ /* 51 */ 0xed8aa2, 0xed8aa3, 0xed8aa5, 0xed8aa6,
+ /* 55 */ 0xed8aa7, 0xed8aa8, 0xed8aa9, 0xed8aaa,
+ /* 59 */ 0xed8aab, 0xed8aad, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8aae, 0xed8aaf, 0xed8ab0, 0xed8ab2,
+ /* 65 */ 0xed8ab3, 0xed8ab4, 0xed8ab5, 0xed8ab6,
+ /* 69 */ 0xed8ab7, 0xed8aba, 0xed8abb, 0xed8abd,
+ /* 6d */ 0xed8abe, 0xed8b81, 0xed8b83, 0xed8b84,
+ /* 71 */ 0xed8b85, 0xed8b86, 0xed8b87, 0xed8b8a,
+ /* 75 */ 0xed8b8c, 0xed8b8d, 0xed8b8e, 0xed8b8f,
+ /* 79 */ 0xed8b90, 0xed8b91, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8b92, 0xed8b93, 0xed8b95, 0xed8b96,
+ /* 85 */ 0xed8b97, 0xed8b99, 0xed8b9a, 0xed8b9b,
+ /* 89 */ 0xed8b9d, 0xed8b9e, 0xed8b9f, 0xed8ba0,
+ /* 8d */ 0xed8ba1, 0xed8ba2, 0xed8ba3, 0xed8ba6,
+ /* 91 */ 0xed8ba7, 0xed8ba8, 0xed8ba9, 0xed8baa,
+ /* 95 */ 0xed8bab, 0xed8bac, 0xed8bad, 0xed8bae,
+ /* 99 */ 0xed8baf, 0xed8bb2, 0xed8bb3, 0xed8bb5,
+ /* 9d */ 0xed8bb6, 0xed8bb7, 0xed8bb9, 0xed8bba,
+ /* a1 */ 0xebb299, 0xebb29a, 0xebb2a0, 0xebb2a1,
+ /* a5 */ 0xebb2a4, 0xebb2a7, 0xebb2a8, 0xebb2b0,
+ /* a9 */ 0xebb2b1, 0xebb2b3, 0xebb2b4, 0xebb2b5,
+ /* ad */ 0xebb2bc, 0xebb2bd, 0xebb380, 0xebb384,
+ /* b1 */ 0xebb38d, 0xebb38f, 0xebb390, 0xebb391,
+ /* b5 */ 0xebb395, 0xebb398, 0xebb39c, 0xebb3b4,
+ /* b9 */ 0xebb3b5, 0xebb3b6, 0xebb3b8, 0xebb3bc,
+ /* bd */ 0xebb484, 0xebb485, 0xebb487, 0xebb489,
+ /* c1 */ 0xebb490, 0xebb494, 0xebb4a4, 0xebb4ac,
+ /* c5 */ 0xebb580, 0xebb588, 0xebb589, 0xebb58c,
+ /* c9 */ 0xebb590, 0xebb598, 0xebb599, 0xebb5a4,
+ /* cd */ 0xebb5a8, 0xebb680, 0xebb681, 0xebb684,
+ /* d1 */ 0xebb687, 0xebb688, 0xebb689, 0xebb68a,
+ /* d5 */ 0xebb690, 0xebb691, 0xebb693, 0xebb695,
+ /* d9 */ 0xebb699, 0xebb69a, 0xebb69c, 0xebb6a4,
+ /* dd */ 0xebb6b0, 0xebb6b8, 0xebb794, 0xebb795,
+ /* e1 */ 0xebb798, 0xebb79c, 0xebb7a9, 0xebb7b0,
+ /* e5 */ 0xebb7b4, 0xebb7b8, 0xebb880, 0xebb883,
+ /* e9 */ 0xebb885, 0xebb88c, 0xebb88d, 0xebb890,
+ /* ed */ 0xebb894, 0xebb89c, 0xebb89d, 0xebb89f,
+ /* f1 */ 0xebb984, 0xebb985, 0xebb988, 0xebb98c,
+ /* f5 */ 0xebb98e, 0xebb994, 0xebb995, 0xebb997,
+ /* f9 */ 0xebb999, 0xebb99a, 0xebb99b, 0xebb9a0,
+ /* fd */ 0xebb9a1, 0xebb9a4,
+
+ /*** Two byte table, leaf: bbxx - offset 0x02c48 ***/
+
+ /* 41 */ 0xed8bbb, 0xed8bbc, 0xed8bbd, 0xed8bbe,
+ /* 45 */ 0xed8bbf, 0xed8c82, 0xed8c84, 0xed8c86,
+ /* 49 */ 0xed8c87, 0xed8c88, 0xed8c89, 0xed8c8a,
+ /* 4d */ 0xed8c8b, 0xed8c8f, 0xed8c91, 0xed8c92,
+ /* 51 */ 0xed8c93, 0xed8c95, 0xed8c97, 0xed8c98,
+ /* 55 */ 0xed8c99, 0xed8c9a, 0xed8c9b, 0xed8c9e,
+ /* 59 */ 0xed8ca2, 0xed8ca3, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8ca4, 0xed8ca6, 0xed8ca7, 0xed8caa,
+ /* 65 */ 0xed8cab, 0xed8cad, 0xed8cae, 0xed8caf,
+ /* 69 */ 0xed8cb1, 0xed8cb2, 0xed8cb3, 0xed8cb4,
+ /* 6d */ 0xed8cb5, 0xed8cb6, 0xed8cb7, 0xed8cba,
+ /* 71 */ 0xed8cbe, 0xed8cbf, 0xed8d80, 0xed8d81,
+ /* 75 */ 0xed8d82, 0xed8d83, 0xed8d86, 0xed8d87,
+ /* 79 */ 0xed8d88, 0xed8d89, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8d8a, 0xed8d8b, 0xed8d8c, 0xed8d8d,
+ /* 85 */ 0xed8d8e, 0xed8d8f, 0xed8d90, 0xed8d91,
+ /* 89 */ 0xed8d92, 0xed8d93, 0xed8d94, 0xed8d95,
+ /* 8d */ 0xed8d96, 0xed8d97, 0xed8d98, 0xed8d99,
+ /* 91 */ 0xed8d9a, 0xed8d9b, 0xed8d9c, 0xed8d9d,
+ /* 95 */ 0xed8d9e, 0xed8d9f, 0xed8da0, 0xed8da1,
+ /* 99 */ 0xed8da2, 0xed8da3, 0xed8da4, 0xed8da5,
+ /* 9d */ 0xed8da6, 0xed8da7, 0xed8da8, 0xed8da9,
+ /* a1 */ 0xebb9a8, 0xebb9aa, 0xebb9b0, 0xebb9b1,
+ /* a5 */ 0xebb9b3, 0xebb9b4, 0xebb9b5, 0xebb9bb,
+ /* a9 */ 0xebb9bc, 0xebb9bd, 0xebba80, 0xebba84,
+ /* ad */ 0xebba8c, 0xebba8d, 0xebba8f, 0xebba90,
+ /* b1 */ 0xebba91, 0xebba98, 0xebba99, 0xebbaa8,
+ /* b5 */ 0xebbb90, 0xebbb91, 0xebbb94, 0xebbb97,
+ /* b9 */ 0xebbb98, 0xebbba0, 0xebbba3, 0xebbba4,
+ /* bd */ 0xebbba5, 0xebbbac, 0xebbc81, 0xebbc88,
+ /* c1 */ 0xebbc89, 0xebbc98, 0xebbc99, 0xebbc9b,
+ /* c5 */ 0xebbc9c, 0xebbc9d, 0xebbd80, 0xebbd81,
+ /* c9 */ 0xebbd84, 0xebbd88, 0xebbd90, 0xebbd91,
+ /* cd */ 0xebbd95, 0xebbe94, 0xebbeb0, 0xebbf85,
+ /* d1 */ 0xebbf8c, 0xebbf8d, 0xebbf90, 0xebbf94,
+ /* d5 */ 0xebbf9c, 0xebbf9f, 0xebbfa1, 0xec80bc,
+ /* d9 */ 0xec8191, 0xec8198, 0xec819c, 0xec81a0,
+ /* dd */ 0xec81a8, 0xec81a9, 0xec8290, 0xec8291,
+ /* e1 */ 0xec8294, 0xec8298, 0xec82a0, 0xec82a1,
+ /* e5 */ 0xec82a3, 0xec82a5, 0xec82ac, 0xec82ad,
+ /* e9 */ 0xec82af, 0xec82b0, 0xec82b3, 0xec82b4,
+ /* ed */ 0xec82b5, 0xec82b6, 0xec82bc, 0xec82bd,
+ /* f1 */ 0xec82bf, 0xec8380, 0xec8381, 0xec8385,
+ /* f5 */ 0xec8388, 0xec8389, 0xec838c, 0xec8390,
+ /* f9 */ 0xec8398, 0xec8399, 0xec839b, 0xec839c,
+ /* fd */ 0xec839d, 0xec83a4,
+
+ /*** Two byte table, leaf: bcxx - offset 0x02d06 ***/
+
+ /* 41 */ 0xed8daa, 0xed8dab, 0xed8dac, 0xed8dad,
+ /* 45 */ 0xed8dae, 0xed8daf, 0xed8db0, 0xed8db1,
+ /* 49 */ 0xed8db2, 0xed8db3, 0xed8db4, 0xed8db5,
+ /* 4d */ 0xed8db6, 0xed8db7, 0xed8db8, 0xed8db9,
+ /* 51 */ 0xed8dba, 0xed8dbb, 0xed8dbe, 0xed8dbf,
+ /* 55 */ 0xed8e81, 0xed8e82, 0xed8e83, 0xed8e85,
+ /* 59 */ 0xed8e86, 0xed8e87, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8e88, 0xed8e89, 0xed8e8a, 0xed8e8b,
+ /* 65 */ 0xed8e8e, 0xed8e92, 0xed8e93, 0xed8e94,
+ /* 69 */ 0xed8e95, 0xed8e96, 0xed8e97, 0xed8e9a,
+ /* 6d */ 0xed8e9b, 0xed8e9d, 0xed8e9e, 0xed8e9f,
+ /* 71 */ 0xed8ea1, 0xed8ea2, 0xed8ea3, 0xed8ea4,
+ /* 75 */ 0xed8ea5, 0xed8ea6, 0xed8ea7, 0xed8eaa,
+ /* 79 */ 0xed8eac, 0xed8eae, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed8eaf, 0xed8eb0, 0xed8eb1, 0xed8eb2,
+ /* 85 */ 0xed8eb3, 0xed8eb5, 0xed8eb6, 0xed8eb7,
+ /* 89 */ 0xed8eb9, 0xed8eba, 0xed8ebb, 0xed8ebd,
+ /* 8d */ 0xed8ebe, 0xed8ebf, 0xed8f80, 0xed8f81,
+ /* 91 */ 0xed8f82, 0xed8f83, 0xed8f86, 0xed8f87,
+ /* 95 */ 0xed8f8a, 0xed8f8b, 0xed8f8c, 0xed8f8d,
+ /* 99 */ 0xed8f8e, 0xed8f8f, 0xed8f91, 0xed8f92,
+ /* 9d */ 0xed8f93, 0xed8f94, 0xed8f95, 0xed8f96,
+ /* a1 */ 0xec83a5, 0xec83a8, 0xec83ac, 0xec83b4,
+ /* a5 */ 0xec83b5, 0xec83b7, 0xec83b9, 0xec8480,
+ /* a9 */ 0xec8484, 0xec8488, 0xec8490, 0xec8495,
+ /* ad */ 0xec849c, 0xec849d, 0xec849e, 0xec849f,
+ /* b1 */ 0xec84a0, 0xec84a3, 0xec84a4, 0xec84a6,
+ /* b5 */ 0xec84a7, 0xec84ac, 0xec84ad, 0xec84af,
+ /* b9 */ 0xec84b0, 0xec84b1, 0xec84b6, 0xec84b8,
+ /* bd */ 0xec84b9, 0xec84bc, 0xec8580, 0xec8588,
+ /* c1 */ 0xec8589, 0xec858b, 0xec858c, 0xec858d,
+ /* c5 */ 0xec8594, 0xec8595, 0xec8598, 0xec859c,
+ /* c9 */ 0xec85a4, 0xec85a5, 0xec85a7, 0xec85a8,
+ /* cd */ 0xec85a9, 0xec85b0, 0xec85b4, 0xec85b8,
+ /* d1 */ 0xec8685, 0xec868c, 0xec868d, 0xec868e,
+ /* d5 */ 0xec8690, 0xec8694, 0xec8696, 0xec869c,
+ /* d9 */ 0xec869d, 0xec869f, 0xec86a1, 0xec86a5,
+ /* dd */ 0xec86a8, 0xec86a9, 0xec86ac, 0xec86b0,
+ /* e1 */ 0xec86bd, 0xec8784, 0xec8788, 0xec878c,
+ /* e5 */ 0xec8794, 0xec8797, 0xec8798, 0xec87a0,
+ /* e9 */ 0xec87a4, 0xec87a8, 0xec87b0, 0xec87b1,
+ /* ed */ 0xec87b3, 0xec87bc, 0xec87bd, 0xec8880,
+ /* f1 */ 0xec8884, 0xec888c, 0xec888d, 0xec888f,
+ /* f5 */ 0xec8891, 0xec8898, 0xec8899, 0xec889c,
+ /* f9 */ 0xec889f, 0xec88a0, 0xec88a8, 0xec88a9,
+ /* fd */ 0xec88ab, 0xec88ad,
+
+ /*** Two byte table, leaf: bdxx - offset 0x02dc4 ***/
+
+ /* 41 */ 0xed8f97, 0xed8f99, 0xed8f9a, 0xed8f9b,
+ /* 45 */ 0xed8f9c, 0xed8f9d, 0xed8f9e, 0xed8f9f,
+ /* 49 */ 0xed8fa0, 0xed8fa2, 0xed8fa4, 0xed8fa5,
+ /* 4d */ 0xed8fa6, 0xed8fa7, 0xed8fa8, 0xed8fa9,
+ /* 51 */ 0xed8faa, 0xed8fab, 0xed8fae, 0xed8faf,
+ /* 55 */ 0xed8fb1, 0xed8fb2, 0xed8fb3, 0xed8fb5,
+ /* 59 */ 0xed8fb6, 0xed8fb7, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed8fb8, 0xed8fb9, 0xed8fba, 0xed8fbb,
+ /* 65 */ 0xed8fbe, 0xed9080, 0xed9082, 0xed9083,
+ /* 69 */ 0xed9084, 0xed9085, 0xed9086, 0xed9087,
+ /* 6d */ 0xed9089, 0xed908a, 0xed908b, 0xed908c,
+ /* 71 */ 0xed908d, 0xed908e, 0xed908f, 0xed9090,
+ /* 75 */ 0xed9091, 0xed9092, 0xed9093, 0xed9094,
+ /* 79 */ 0xed9095, 0xed9096, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9097, 0xed9098, 0xed9099, 0xed909a,
+ /* 85 */ 0xed909b, 0xed909c, 0xed909e, 0xed909f,
+ /* 89 */ 0xed90a0, 0xed90a1, 0xed90a2, 0xed90a3,
+ /* 8d */ 0xed90a4, 0xed90a5, 0xed90a6, 0xed90a7,
+ /* 91 */ 0xed90a8, 0xed90a9, 0xed90aa, 0xed90ab,
+ /* 95 */ 0xed90ac, 0xed90ad, 0xed90ae, 0xed90af,
+ /* 99 */ 0xed90b0, 0xed90b1, 0xed90b2, 0xed90b3,
+ /* 9d */ 0xed90b4, 0xed90b5, 0xed90b6, 0xed90b7,
+ /* a1 */ 0xec88af, 0xec88b1, 0xec88b2, 0xec88b4,
+ /* a5 */ 0xec8988, 0xec8990, 0xec8991, 0xec8994,
+ /* a9 */ 0xec8998, 0xec89a0, 0xec89a5, 0xec89ac,
+ /* ad */ 0xec89ad, 0xec89b0, 0xec89b4, 0xec89bc,
+ /* b1 */ 0xec89bd, 0xec89bf, 0xec8a81, 0xec8a88,
+ /* b5 */ 0xec8a89, 0xec8a90, 0xec8a98, 0xec8a9b,
+ /* b9 */ 0xec8a9d, 0xec8aa4, 0xec8aa5, 0xec8aa8,
+ /* bd */ 0xec8aac, 0xec8aad, 0xec8ab4, 0xec8ab5,
+ /* c1 */ 0xec8ab7, 0xec8ab9, 0xec8b9c, 0xec8b9d,
+ /* c5 */ 0xec8ba0, 0xec8ba3, 0xec8ba4, 0xec8bab,
+ /* c9 */ 0xec8bac, 0xec8bad, 0xec8baf, 0xec8bb1,
+ /* cd */ 0xec8bb6, 0xec8bb8, 0xec8bb9, 0xec8bbb,
+ /* d1 */ 0xec8bbc, 0xec8c80, 0xec8c88, 0xec8c89,
+ /* d5 */ 0xec8c8c, 0xec8c8d, 0xec8c93, 0xec8c94,
+ /* d9 */ 0xec8c95, 0xec8c98, 0xec8c9c, 0xec8ca4,
+ /* dd */ 0xec8ca5, 0xec8ca8, 0xec8ca9, 0xec8d85,
+ /* e1 */ 0xec8da8, 0xec8da9, 0xec8dac, 0xec8db0,
+ /* e5 */ 0xec8db2, 0xec8db8, 0xec8db9, 0xec8dbc,
+ /* e9 */ 0xec8dbd, 0xec8e84, 0xec8e88, 0xec8e8c,
+ /* ed */ 0xec8f80, 0xec8f98, 0xec8f99, 0xec8f9c,
+ /* f1 */ 0xec8f9f, 0xec8fa0, 0xec8fa2, 0xec8fa8,
+ /* f5 */ 0xec8fa9, 0xec8fad, 0xec8fb4, 0xec8fb5,
+ /* f9 */ 0xec8fb8, 0xec9088, 0xec9090, 0xec90a4,
+ /* fd */ 0xec90ac, 0xec90b0,
+
+ /*** Two byte table, leaf: bexx - offset 0x02e82 ***/
+
+ /* 41 */ 0xed90b8, 0xed90b9, 0xed90ba, 0xed90bb,
+ /* 45 */ 0xed90bc, 0xed90bd, 0xed90be, 0xed90bf,
+ /* 49 */ 0xed9181, 0xed9182, 0xed9183, 0xed9185,
+ /* 4d */ 0xed9186, 0xed9187, 0xed9188, 0xed9189,
+ /* 51 */ 0xed918a, 0xed918b, 0xed918c, 0xed918d,
+ /* 55 */ 0xed918e, 0xed918f, 0xed9190, 0xed9191,
+ /* 59 */ 0xed9192, 0xed9193, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9194, 0xed9195, 0xed9196, 0xed9197,
+ /* 65 */ 0xed9198, 0xed9199, 0xed919a, 0xed919b,
+ /* 69 */ 0xed919d, 0xed919e, 0xed919f, 0xed91a1,
+ /* 6d */ 0xed91a2, 0xed91a3, 0xed91a5, 0xed91a6,
+ /* 71 */ 0xed91a7, 0xed91a8, 0xed91a9, 0xed91aa,
+ /* 75 */ 0xed91ab, 0xed91ac, 0xed91ae, 0xed91b0,
+ /* 79 */ 0xed91b1, 0xed91b2, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed91b3, 0xed91b4, 0xed91b5, 0xed91b6,
+ /* 85 */ 0xed91b7, 0xed91ba, 0xed91bb, 0xed91bd,
+ /* 89 */ 0xed91be, 0xed9281, 0xed9283, 0xed9284,
+ /* 8d */ 0xed9285, 0xed9286, 0xed9287, 0xed928a,
+ /* 91 */ 0xed928c, 0xed928e, 0xed928f, 0xed9290,
+ /* 95 */ 0xed9291, 0xed9292, 0xed9293, 0xed9295,
+ /* 99 */ 0xed9296, 0xed9297, 0xed9298, 0xed9299,
+ /* 9d */ 0xed929a, 0xed929b, 0xed929c, 0xed929d,
+ /* a1 */ 0xec90b4, 0xec90bc, 0xec90bd, 0xec9188,
+ /* a5 */ 0xec91a4, 0xec91a5, 0xec91a8, 0xec91ac,
+ /* a9 */ 0xec91b4, 0xec91b5, 0xec91b9, 0xec9280,
+ /* ad */ 0xec9294, 0xec929c, 0xec92b8, 0xec92bc,
+ /* b1 */ 0xec93a9, 0xec93b0, 0xec93b1, 0xec93b4,
+ /* b5 */ 0xec93b8, 0xec93ba, 0xec93bf, 0xec9480,
+ /* b9 */ 0xec9481, 0xec948c, 0xec9490, 0xec9494,
+ /* bd */ 0xec949c, 0xec94a8, 0xec94a9, 0xec94ac,
+ /* c1 */ 0xec94b0, 0xec94b8, 0xec94b9, 0xec94bb,
+ /* c5 */ 0xec94bd, 0xec9584, 0xec9585, 0xec9588,
+ /* c9 */ 0xec9589, 0xec958a, 0xec958c, 0xec958d,
+ /* cd */ 0xec958e, 0xec9593, 0xec9594, 0xec9595,
+ /* d1 */ 0xec9597, 0xec9598, 0xec9599, 0xec959d,
+ /* d5 */ 0xec959e, 0xec95a0, 0xec95a1, 0xec95a4,
+ /* d9 */ 0xec95a8, 0xec95b0, 0xec95b1, 0xec95b3,
+ /* dd */ 0xec95b4, 0xec95b5, 0xec95bc, 0xec95bd,
+ /* e1 */ 0xec9680, 0xec9684, 0xec9687, 0xec968c,
+ /* e5 */ 0xec968d, 0xec968f, 0xec9691, 0xec9695,
+ /* e9 */ 0xec9697, 0xec9698, 0xec969c, 0xec96a0,
+ /* ed */ 0xec96a9, 0xec96b4, 0xec96b5, 0xec96b8,
+ /* f1 */ 0xec96b9, 0xec96bb, 0xec96bc, 0xec96bd,
+ /* f5 */ 0xec96be, 0xec9784, 0xec9785, 0xec9786,
+ /* f9 */ 0xec9787, 0xec9788, 0xec9789, 0xec978a,
+ /* fd */ 0xec978c, 0xec978e,
+
+ /*** Two byte table, leaf: bfxx - offset 0x02f40 ***/
+
+ /* 41 */ 0xed929e, 0xed929f, 0xed92a0, 0xed92a1,
+ /* 45 */ 0xed92a2, 0xed92a3, 0xed92a4, 0xed92a5,
+ /* 49 */ 0xed92a6, 0xed92a7, 0xed92a8, 0xed92aa,
+ /* 4d */ 0xed92ab, 0xed92ac, 0xed92ad, 0xed92ae,
+ /* 51 */ 0xed92af, 0xed92b0, 0xed92b1, 0xed92b2,
+ /* 55 */ 0xed92b3, 0xed92b4, 0xed92b5, 0xed92b6,
+ /* 59 */ 0xed92b7, 0xed92b8, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed92b9, 0xed92ba, 0xed92bb, 0xed92bc,
+ /* 65 */ 0xed92bd, 0xed92be, 0xed92bf, 0xed9380,
+ /* 69 */ 0xed9381, 0xed9382, 0xed9383, 0xed9384,
+ /* 6d */ 0xed9385, 0xed9386, 0xed9387, 0xed9388,
+ /* 71 */ 0xed9389, 0xed938a, 0xed938b, 0xed938d,
+ /* 75 */ 0xed938e, 0xed938f, 0xed9391, 0xed9392,
+ /* 79 */ 0xed9393, 0xed9395, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9396, 0xed9397, 0xed9398, 0xed9399,
+ /* 85 */ 0xed939a, 0xed939b, 0xed939d, 0xed939e,
+ /* 89 */ 0xed93a0, 0xed93a1, 0xed93a2, 0xed93a3,
+ /* 8d */ 0xed93a4, 0xed93a5, 0xed93a6, 0xed93a7,
+ /* 91 */ 0xed93a9, 0xed93aa, 0xed93ab, 0xed93ad,
+ /* 95 */ 0xed93ae, 0xed93af, 0xed93b1, 0xed93b2,
+ /* 99 */ 0xed93b3, 0xed93b4, 0xed93b5, 0xed93b6,
+ /* 9d */ 0xed93b7, 0xed93b9, 0xed93ba, 0xed93bc,
+ /* a1 */ 0xec9790, 0xec9791, 0xec9794, 0xec9798,
+ /* a5 */ 0xec97a0, 0xec97a1, 0xec97a3, 0xec97a5,
+ /* a9 */ 0xec97ac, 0xec97ad, 0xec97ae, 0xec97b0,
+ /* ad */ 0xec97b4, 0xec97b6, 0xec97b7, 0xec97bc,
+ /* b1 */ 0xec97bd, 0xec97be, 0xec97bf, 0xec9880,
+ /* b5 */ 0xec9881, 0xec9885, 0xec9886, 0xec9887,
+ /* b9 */ 0xec9888, 0xec988c, 0xec9890, 0xec9898,
+ /* bd */ 0xec9899, 0xec989b, 0xec989c, 0xec98a4,
+ /* c1 */ 0xec98a5, 0xec98a8, 0xec98ac, 0xec98ad,
+ /* c5 */ 0xec98ae, 0xec98b0, 0xec98b3, 0xec98b4,
+ /* c9 */ 0xec98b5, 0xec98b7, 0xec98b9, 0xec98bb,
+ /* cd */ 0xec9980, 0xec9981, 0xec9984, 0xec9988,
+ /* d1 */ 0xec9990, 0xec9991, 0xec9993, 0xec9994,
+ /* d5 */ 0xec9995, 0xec999c, 0xec999d, 0xec99a0,
+ /* d9 */ 0xec99ac, 0xec99af, 0xec99b1, 0xec99b8,
+ /* dd */ 0xec99b9, 0xec99bc, 0xec9a80, 0xec9a88,
+ /* e1 */ 0xec9a89, 0xec9a8b, 0xec9a8d, 0xec9a94,
+ /* e5 */ 0xec9a95, 0xec9a98, 0xec9a9c, 0xec9aa4,
+ /* e9 */ 0xec9aa5, 0xec9aa7, 0xec9aa9, 0xec9ab0,
+ /* ed */ 0xec9ab1, 0xec9ab4, 0xec9ab8, 0xec9ab9,
+ /* f1 */ 0xec9aba, 0xec9b80, 0xec9b81, 0xec9b83,
+ /* f5 */ 0xec9b85, 0xec9b8c, 0xec9b8d, 0xec9b90,
+ /* f9 */ 0xec9b94, 0xec9b9c, 0xec9b9d, 0xec9ba0,
+ /* fd */ 0xec9ba1, 0xec9ba8,
+
+ /*** Two byte table, leaf: c0xx - offset 0x02ffe ***/
+
+ /* 41 */ 0xed93be, 0xed93bf, 0xed9480, 0xed9481,
+ /* 45 */ 0xed9482, 0xed9483, 0xed9485, 0xed9486,
+ /* 49 */ 0xed9487, 0xed9489, 0xed948a, 0xed948b,
+ /* 4d */ 0xed948d, 0xed948e, 0xed948f, 0xed9490,
+ /* 51 */ 0xed9491, 0xed9492, 0xed9493, 0xed9496,
+ /* 55 */ 0xed9498, 0xed9499, 0xed949a, 0xed949b,
+ /* 59 */ 0xed949c, 0xed949d, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed949e, 0xed949f, 0xed94a0, 0xed94a1,
+ /* 65 */ 0xed94a2, 0xed94a3, 0xed94a4, 0xed94a5,
+ /* 69 */ 0xed94a6, 0xed94a7, 0xed94a8, 0xed94a9,
+ /* 6d */ 0xed94aa, 0xed94ab, 0xed94ac, 0xed94ad,
+ /* 71 */ 0xed94ae, 0xed94af, 0xed94b0, 0xed94b1,
+ /* 75 */ 0xed94b2, 0xed94b3, 0xed94b4, 0xed94b5,
+ /* 79 */ 0xed94b6, 0xed94b7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed94b8, 0xed94b9, 0xed94ba, 0xed94bb,
+ /* 85 */ 0xed94be, 0xed94bf, 0xed9581, 0xed9582,
+ /* 89 */ 0xed9583, 0xed9585, 0xed9586, 0xed9587,
+ /* 8d */ 0xed9588, 0xed9589, 0xed958a, 0xed958b,
+ /* 91 */ 0xed958e, 0xed9590, 0xed9592, 0xed9593,
+ /* 95 */ 0xed9594, 0xed9595, 0xed9596, 0xed9597,
+ /* 99 */ 0xed959a, 0xed959b, 0xed959d, 0xed959e,
+ /* 9d */ 0xed959f, 0xed95a1, 0xed95a2, 0xed95a3,
+ /* a1 */ 0xec9ba9, 0xec9bac, 0xec9bb0, 0xec9bb8,
+ /* a5 */ 0xec9bb9, 0xec9bbd, 0xec9c84, 0xec9c85,
+ /* a9 */ 0xec9c88, 0xec9c8c, 0xec9c94, 0xec9c95,
+ /* ad */ 0xec9c97, 0xec9c99, 0xec9ca0, 0xec9ca1,
+ /* b1 */ 0xec9ca4, 0xec9ca8, 0xec9cb0, 0xec9cb1,
+ /* b5 */ 0xec9cb3, 0xec9cb5, 0xec9cb7, 0xec9cbc,
+ /* b9 */ 0xec9cbd, 0xec9d80, 0xec9d84, 0xec9d8a,
+ /* bd */ 0xec9d8c, 0xec9d8d, 0xec9d8f, 0xec9d91,
+ /* c1 */ 0xec9d92, 0xec9d93, 0xec9d94, 0xec9d95,
+ /* c5 */ 0xec9d96, 0xec9d97, 0xec9d98, 0xec9d9c,
+ /* c9 */ 0xec9da0, 0xec9da8, 0xec9dab, 0xec9db4,
+ /* cd */ 0xec9db5, 0xec9db8, 0xec9dbc, 0xec9dbd,
+ /* d1 */ 0xec9dbe, 0xec9e83, 0xec9e84, 0xec9e85,
+ /* d5 */ 0xec9e87, 0xec9e88, 0xec9e89, 0xec9e8a,
+ /* d9 */ 0xec9e8e, 0xec9e90, 0xec9e91, 0xec9e94,
+ /* dd */ 0xec9e96, 0xec9e97, 0xec9e98, 0xec9e9a,
+ /* e1 */ 0xec9ea0, 0xec9ea1, 0xec9ea3, 0xec9ea4,
+ /* e5 */ 0xec9ea5, 0xec9ea6, 0xec9eac, 0xec9ead,
+ /* e9 */ 0xec9eb0, 0xec9eb4, 0xec9ebc, 0xec9ebd,
+ /* ed */ 0xec9ebf, 0xec9f80, 0xec9f81, 0xec9f88,
+ /* f1 */ 0xec9f89, 0xec9f8c, 0xec9f8e, 0xec9f90,
+ /* f5 */ 0xec9f98, 0xec9f9d, 0xec9fa4, 0xec9fa8,
+ /* f9 */ 0xec9fac, 0xeca080, 0xeca081, 0xeca084,
+ /* fd */ 0xeca088, 0xeca08a,
+
+ /*** Two byte table, leaf: c1xx - offset 0x030bc ***/
+
+ /* 41 */ 0xed95a4, 0xed95a6, 0xed95a7, 0xed95aa,
+ /* 45 */ 0xed95ac, 0xed95ae, 0xed95af, 0xed95b0,
+ /* 49 */ 0xed95b1, 0xed95b2, 0xed95b3, 0xed95b6,
+ /* 4d */ 0xed95b7, 0xed95b9, 0xed95ba, 0xed95bb,
+ /* 51 */ 0xed95bd, 0xed95be, 0xed95bf, 0xed9680,
+ /* 55 */ 0xed9681, 0xed9682, 0xed9683, 0xed9686,
+ /* 59 */ 0xed968a, 0xed968b, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed968c, 0xed968d, 0xed968e, 0xed968f,
+ /* 65 */ 0xed9691, 0xed9692, 0xed9693, 0xed9694,
+ /* 69 */ 0xed9695, 0xed9696, 0xed9697, 0xed9698,
+ /* 6d */ 0xed9699, 0xed969a, 0xed969b, 0xed969c,
+ /* 71 */ 0xed969d, 0xed969e, 0xed969f, 0xed96a0,
+ /* 75 */ 0xed96a1, 0xed96a2, 0xed96a3, 0xed96a4,
+ /* 79 */ 0xed96a6, 0xed96a7, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed96a8, 0xed96a9, 0xed96aa, 0xed96ab,
+ /* 85 */ 0xed96ac, 0xed96ad, 0xed96ae, 0xed96af,
+ /* 89 */ 0xed96b0, 0xed96b1, 0xed96b2, 0xed96b3,
+ /* 8d */ 0xed96b4, 0xed96b5, 0xed96b6, 0xed96b7,
+ /* 91 */ 0xed96b8, 0xed96b9, 0xed96ba, 0xed96bb,
+ /* 95 */ 0xed96bc, 0xed96bd, 0xed96be, 0xed96bf,
+ /* 99 */ 0xed9780, 0xed9781, 0xed9782, 0xed9783,
+ /* 9d */ 0xed9784, 0xed9785, 0xed9786, 0xed9787,
+ /* a1 */ 0xeca090, 0xeca091, 0xeca093, 0xeca095,
+ /* a5 */ 0xeca096, 0xeca09c, 0xeca09d, 0xeca0a0,
+ /* a9 */ 0xeca0a4, 0xeca0ac, 0xeca0ad, 0xeca0af,
+ /* ad */ 0xeca0b1, 0xeca0b8, 0xeca0bc, 0xeca180,
+ /* b1 */ 0xeca188, 0xeca189, 0xeca18c, 0xeca18d,
+ /* b5 */ 0xeca194, 0xeca1b0, 0xeca1b1, 0xeca1b4,
+ /* b9 */ 0xeca1b8, 0xeca1ba, 0xeca280, 0xeca281,
+ /* bd */ 0xeca283, 0xeca285, 0xeca286, 0xeca287,
+ /* c1 */ 0xeca28b, 0xeca28c, 0xeca28d, 0xeca294,
+ /* c5 */ 0xeca29d, 0xeca29f, 0xeca2a1, 0xeca2a8,
+ /* c9 */ 0xeca2bc, 0xeca2bd, 0xeca384, 0xeca388,
+ /* cd */ 0xeca38c, 0xeca394, 0xeca395, 0xeca397,
+ /* d1 */ 0xeca399, 0xeca3a0, 0xeca3a1, 0xeca3a4,
+ /* d5 */ 0xeca3b5, 0xeca3bc, 0xeca3bd, 0xeca480,
+ /* d9 */ 0xeca484, 0xeca485, 0xeca486, 0xeca48c,
+ /* dd */ 0xeca48d, 0xeca48f, 0xeca491, 0xeca498,
+ /* e1 */ 0xeca4ac, 0xeca4b4, 0xeca590, 0xeca591,
+ /* e5 */ 0xeca594, 0xeca598, 0xeca5a0, 0xeca5a1,
+ /* e9 */ 0xeca5a3, 0xeca5ac, 0xeca5b0, 0xeca5b4,
+ /* ed */ 0xeca5bc, 0xeca688, 0xeca689, 0xeca68c,
+ /* f1 */ 0xeca690, 0xeca698, 0xeca699, 0xeca69b,
+ /* f5 */ 0xeca69d, 0xeca780, 0xeca781, 0xeca784,
+ /* f9 */ 0xeca787, 0xeca788, 0xeca78a, 0xeca790,
+ /* fd */ 0xeca791, 0xeca793,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0317a ***/
+
+ /* 41 */ 0xed978a, 0xed978b, 0xed978d, 0xed978e,
+ /* 45 */ 0xed978f, 0xed9791, 0xed9793, 0xed9794,
+ /* 49 */ 0xed9795, 0xed9796, 0xed9797, 0xed979a,
+ /* 4d */ 0xed979c, 0xed979e, 0xed979f, 0xed97a0,
+ /* 51 */ 0xed97a1, 0xed97a2, 0xed97a3, 0xed97a6,
+ /* 55 */ 0xed97a7, 0xed97a9, 0xed97aa, 0xed97ab,
+ /* 59 */ 0xed97ad, 0xed97ae, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed97af, 0xed97b0, 0xed97b1, 0xed97b2,
+ /* 65 */ 0xed97b3, 0xed97b6, 0xed97b8, 0xed97ba,
+ /* 69 */ 0xed97bb, 0xed97bc, 0xed97bd, 0xed97be,
+ /* 6d */ 0xed97bf, 0xed9882, 0xed9883, 0xed9885,
+ /* 71 */ 0xed9886, 0xed9887, 0xed9889, 0xed988a,
+ /* 75 */ 0xed988b, 0xed988c, 0xed988d, 0xed988e,
+ /* 79 */ 0xed988f, 0xed9892, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9896, 0xed9897, 0xed9898, 0xed9899,
+ /* 85 */ 0xed989a, 0xed989b, 0xed989d, 0xed989e,
+ /* 89 */ 0xed989f, 0xed98a1, 0xed98a2, 0xed98a3,
+ /* 8d */ 0xed98a5, 0xed98a6, 0xed98a7, 0xed98a8,
+ /* 91 */ 0xed98a9, 0xed98aa, 0xed98ab, 0xed98ac,
+ /* 95 */ 0xed98ae, 0xed98af, 0xed98b0, 0xed98b1,
+ /* 99 */ 0xed98b2, 0xed98b3, 0xed98b4, 0xed98b5,
+ /* 9d */ 0xed98b6, 0xed98b7, 0xed98ba, 0xed98bb,
+ /* a1 */ 0xeca795, 0xeca796, 0xeca799, 0xeca79a,
+ /* a5 */ 0xeca79c, 0xeca79d, 0xeca7a0, 0xeca7a2,
+ /* a9 */ 0xeca7a4, 0xeca7a7, 0xeca7ac, 0xeca7ad,
+ /* ad */ 0xeca7af, 0xeca7b0, 0xeca7b1, 0xeca7b8,
+ /* b1 */ 0xeca7b9, 0xeca7bc, 0xeca880, 0xeca888,
+ /* b5 */ 0xeca889, 0xeca88b, 0xeca88c, 0xeca88d,
+ /* b9 */ 0xeca894, 0xeca898, 0xeca8a9, 0xeca98c,
+ /* bd */ 0xeca98d, 0xeca990, 0xeca994, 0xeca99c,
+ /* c1 */ 0xeca99d, 0xeca99f, 0xeca9a0, 0xeca9a1,
+ /* c5 */ 0xeca9a8, 0xeca9bd, 0xecaa84, 0xecaa98,
+ /* c9 */ 0xecaabc, 0xecaabd, 0xecab80, 0xecab84,
+ /* cd */ 0xecab8c, 0xecab8d, 0xecab8f, 0xecab91,
+ /* d1 */ 0xecab93, 0xecab98, 0xecab99, 0xecaba0,
+ /* d5 */ 0xecabac, 0xecabb4, 0xecac88, 0xecac90,
+ /* d9 */ 0xecac94, 0xecac98, 0xecaca0, 0xecaca1,
+ /* dd */ 0xecad81, 0xecad88, 0xecad89, 0xecad8c,
+ /* e1 */ 0xecad90, 0xecad98, 0xecad99, 0xecad9d,
+ /* e5 */ 0xecada4, 0xecadb8, 0xecadb9, 0xecae9c,
+ /* e9 */ 0xecaeb8, 0xecaf94, 0xecafa4, 0xecafa7,
+ /* ed */ 0xecafa9, 0xecb08c, 0xecb08d, 0xecb090,
+ /* f1 */ 0xecb094, 0xecb09c, 0xecb09d, 0xecb0a1,
+ /* f5 */ 0xecb0a2, 0xecb0a7, 0xecb0a8, 0xecb0a9,
+ /* f9 */ 0xecb0ac, 0xecb0ae, 0xecb0b0, 0xecb0b8,
+ /* fd */ 0xecb0b9, 0xecb0bb,
+
+ /*** Two byte table, leaf: c3xx - offset 0x03238 ***/
+
+ /* 41 */ 0xed98bd, 0xed98be, 0xed98bf, 0xed9981,
+ /* 45 */ 0xed9982, 0xed9983, 0xed9984, 0xed9986,
+ /* 49 */ 0xed9987, 0xed998a, 0xed998c, 0xed998e,
+ /* 4d */ 0xed998f, 0xed9990, 0xed9992, 0xed9993,
+ /* 51 */ 0xed9996, 0xed9997, 0xed9999, 0xed999a,
+ /* 55 */ 0xed999b, 0xed999d, 0xed999e, 0xed999f,
+ /* 59 */ 0xed99a0, 0xed99a1, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed99a2, 0xed99a3, 0xed99a4, 0xed99a5,
+ /* 65 */ 0xed99a6, 0xed99a8, 0xed99aa, 0xed99ab,
+ /* 69 */ 0xed99ac, 0xed99ad, 0xed99ae, 0xed99af,
+ /* 6d */ 0xed99b2, 0xed99b3, 0xed99b5, 0xed99b6,
+ /* 71 */ 0xed99b7, 0xed99b8, 0xed99b9, 0xed99ba,
+ /* 75 */ 0xed99bb, 0xed99bc, 0xed99bd, 0xed99be,
+ /* 79 */ 0xed99bf, 0xed9a80, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9a81, 0xed9a82, 0xed9a84, 0xed9a86,
+ /* 85 */ 0xed9a87, 0xed9a88, 0xed9a89, 0xed9a8a,
+ /* 89 */ 0xed9a8b, 0xed9a8e, 0xed9a8f, 0xed9a91,
+ /* 8d */ 0xed9a92, 0xed9a93, 0xed9a95, 0xed9a96,
+ /* 91 */ 0xed9a97, 0xed9a98, 0xed9a99, 0xed9a9a,
+ /* 95 */ 0xed9a9b, 0xed9a9c, 0xed9a9e, 0xed9aa0,
+ /* 99 */ 0xed9aa2, 0xed9aa3, 0xed9aa4, 0xed9aa5,
+ /* 9d */ 0xed9aa6, 0xed9aa7, 0xed9aa9, 0xed9aaa,
+ /* a1 */ 0xecb0bc, 0xecb0bd, 0xecb0be, 0xecb184,
+ /* a5 */ 0xecb185, 0xecb188, 0xecb18c, 0xecb194,
+ /* a9 */ 0xecb195, 0xecb197, 0xecb198, 0xecb199,
+ /* ad */ 0xecb1a0, 0xecb1a4, 0xecb1a6, 0xecb1a8,
+ /* b1 */ 0xecb1b0, 0xecb1b5, 0xecb298, 0xecb299,
+ /* b5 */ 0xecb29c, 0xecb2a0, 0xecb2a8, 0xecb2a9,
+ /* b9 */ 0xecb2ab, 0xecb2ac, 0xecb2ad, 0xecb2b4,
+ /* bd */ 0xecb2b5, 0xecb2b8, 0xecb2bc, 0xecb384,
+ /* c1 */ 0xecb385, 0xecb387, 0xecb389, 0xecb390,
+ /* c5 */ 0xecb394, 0xecb3a4, 0xecb3ac, 0xecb3b0,
+ /* c9 */ 0xecb481, 0xecb488, 0xecb489, 0xecb48c,
+ /* cd */ 0xecb490, 0xecb498, 0xecb499, 0xecb49b,
+ /* d1 */ 0xecb49d, 0xecb4a4, 0xecb4a8, 0xecb4ac,
+ /* d5 */ 0xecb4b9, 0xecb59c, 0xecb5a0, 0xecb5a4,
+ /* d9 */ 0xecb5ac, 0xecb5ad, 0xecb5af, 0xecb5b1,
+ /* dd */ 0xecb5b8, 0xecb688, 0xecb694, 0xecb695,
+ /* e1 */ 0xecb698, 0xecb69c, 0xecb6a4, 0xecb6a5,
+ /* e5 */ 0xecb6a7, 0xecb6a9, 0xecb6b0, 0xecb784,
+ /* e9 */ 0xecb78c, 0xecb790, 0xecb7a8, 0xecb7ac,
+ /* ed */ 0xecb7b0, 0xecb7b8, 0xecb7b9, 0xecb7bb,
+ /* f1 */ 0xecb7bd, 0xecb884, 0xecb888, 0xecb88c,
+ /* f5 */ 0xecb894, 0xecb899, 0xecb8a0, 0xecb8a1,
+ /* f9 */ 0xecb8a4, 0xecb8a8, 0xecb8b0, 0xecb8b1,
+ /* fd */ 0xecb8b3, 0xecb8b5,
+
+ /*** Two byte table, leaf: c4xx - offset 0x032f6 ***/
+
+ /* 41 */ 0xed9aab, 0xed9aad, 0xed9aae, 0xed9aaf,
+ /* 45 */ 0xed9ab1, 0xed9ab2, 0xed9ab3, 0xed9ab4,
+ /* 49 */ 0xed9ab5, 0xed9ab6, 0xed9ab7, 0xed9ab8,
+ /* 4d */ 0xed9aba, 0xed9abc, 0xed9abd, 0xed9abe,
+ /* 51 */ 0xed9abf, 0xed9b80, 0xed9b81, 0xed9b82,
+ /* 55 */ 0xed9b83, 0xed9b86, 0xed9b87, 0xed9b89,
+ /* 59 */ 0xed9b8a, 0xed9b8b, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9b8d, 0xed9b8e, 0xed9b8f, 0xed9b90,
+ /* 65 */ 0xed9b92, 0xed9b93, 0xed9b95, 0xed9b96,
+ /* 69 */ 0xed9b98, 0xed9b9a, 0xed9b9b, 0xed9b9c,
+ /* 6d */ 0xed9b9d, 0xed9b9e, 0xed9b9f, 0xed9ba1,
+ /* 71 */ 0xed9ba2, 0xed9ba3, 0xed9ba5, 0xed9ba6,
+ /* 75 */ 0xed9ba7, 0xed9ba9, 0xed9baa, 0xed9bab,
+ /* 79 */ 0xed9bac, 0xed9bad, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9bae, 0xed9baf, 0xed9bb1, 0xed9bb2,
+ /* 85 */ 0xed9bb3, 0xed9bb4, 0xed9bb6, 0xed9bb7,
+ /* 89 */ 0xed9bb8, 0xed9bb9, 0xed9bba, 0xed9bbb,
+ /* 8d */ 0xed9bbe, 0xed9bbf, 0xed9c81, 0xed9c82,
+ /* 91 */ 0xed9c83, 0xed9c85, 0xed9c86, 0xed9c87,
+ /* 95 */ 0xed9c88, 0xed9c89, 0xed9c8a, 0xed9c8b,
+ /* 99 */ 0xed9c8c, 0xed9c8d, 0xed9c8e, 0xed9c8f,
+ /* 9d */ 0xed9c90, 0xed9c92, 0xed9c93, 0xed9c94,
+ /* a1 */ 0xecb998, 0xecb999, 0xecb99c, 0xecb99f,
+ /* a5 */ 0xecb9a0, 0xecb9a1, 0xecb9a8, 0xecb9a9,
+ /* a9 */ 0xecb9ab, 0xecb9ad, 0xecb9b4, 0xecb9b5,
+ /* ad */ 0xecb9b8, 0xecb9bc, 0xecba84, 0xecba85,
+ /* b1 */ 0xecba87, 0xecba89, 0xecba90, 0xecba91,
+ /* b5 */ 0xecba94, 0xecba98, 0xecbaa0, 0xecbaa1,
+ /* b9 */ 0xecbaa3, 0xecbaa4, 0xecbaa5, 0xecbaac,
+ /* bd */ 0xecbaad, 0xecbb81, 0xecbba4, 0xecbba5,
+ /* c1 */ 0xecbba8, 0xecbbab, 0xecbbac, 0xecbbb4,
+ /* c5 */ 0xecbbb5, 0xecbbb7, 0xecbbb8, 0xecbbb9,
+ /* c9 */ 0xecbc80, 0xecbc81, 0xecbc84, 0xecbc88,
+ /* cd */ 0xecbc90, 0xecbc91, 0xecbc93, 0xecbc95,
+ /* d1 */ 0xecbc9c, 0xecbca0, 0xecbca4, 0xecbcac,
+ /* d5 */ 0xecbcad, 0xecbcaf, 0xecbcb0, 0xecbcb1,
+ /* d9 */ 0xecbcb8, 0xecbd94, 0xecbd95, 0xecbd98,
+ /* dd */ 0xecbd9c, 0xecbda4, 0xecbda5, 0xecbda7,
+ /* e1 */ 0xecbda9, 0xecbdb0, 0xecbdb1, 0xecbdb4,
+ /* e5 */ 0xecbdb8, 0xecbe80, 0xecbe85, 0xecbe8c,
+ /* e9 */ 0xecbea1, 0xecbea8, 0xecbeb0, 0xecbf84,
+ /* ed */ 0xecbfa0, 0xecbfa1, 0xecbfa4, 0xecbfa8,
+ /* f1 */ 0xecbfb0, 0xecbfb1, 0xecbfb3, 0xecbfb5,
+ /* f5 */ 0xecbfbc, 0xed8080, 0xed8084, 0xed8091,
+ /* f9 */ 0xed8098, 0xed80ad, 0xed80b4, 0xed80b5,
+ /* fd */ 0xed80b8, 0xed80bc,
+
+ /*** Two byte table, leaf: c5xx - offset 0x033b4 ***/
+
+ /* 41 */ 0xed9c95, 0xed9c96, 0xed9c97, 0xed9c9a,
+ /* 45 */ 0xed9c9b, 0xed9c9d, 0xed9c9e, 0xed9c9f,
+ /* 49 */ 0xed9ca1, 0xed9ca2, 0xed9ca3, 0xed9ca4,
+ /* 4d */ 0xed9ca5, 0xed9ca6, 0xed9ca7, 0xed9caa,
+ /* 51 */ 0xed9cac, 0xed9cae, 0xed9caf, 0xed9cb0,
+ /* 55 */ 0xed9cb1, 0xed9cb2, 0xed9cb3, 0xed9cb6,
+ /* 59 */ 0xed9cb7, 0xed9cb9, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0xed9cba, 0xed9cbb, 0xed9cbd, 0xed9cbe,
+ /* 65 */ 0xed9cbf, 0xed9d80, 0xed9d81, 0xed9d82,
+ /* 69 */ 0xed9d83, 0xed9d85, 0xed9d86, 0xed9d88,
+ /* 6d */ 0xed9d8a, 0xed9d8b, 0xed9d8c, 0xed9d8d,
+ /* 71 */ 0xed9d8e, 0xed9d8f, 0xed9d92, 0xed9d93,
+ /* 75 */ 0xed9d95, 0xed9d9a, 0xed9d9b, 0xed9d9c,
+ /* 79 */ 0xed9d9d, 0xed9d9e, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0xed9d9f, 0xed9da2, 0xed9da4, 0xed9da6,
+ /* 85 */ 0xed9da7, 0xed9da8, 0xed9daa, 0xed9dab,
+ /* 89 */ 0xed9dad, 0xed9dae, 0xed9daf, 0xed9db1,
+ /* 8d */ 0xed9db2, 0xed9db3, 0xed9db5, 0xed9db6,
+ /* 91 */ 0xed9db7, 0xed9db8, 0xed9db9, 0xed9dba,
+ /* 95 */ 0xed9dbb, 0xed9dbe, 0xed9dbf, 0xed9e80,
+ /* 99 */ 0xed9e82, 0xed9e83, 0xed9e84, 0xed9e85,
+ /* 9d */ 0xed9e86, 0xed9e87, 0xed9e8a, 0xed9e8b,
+ /* a1 */ 0xed8184, 0xed8185, 0xed8187, 0xed8189,
+ /* a5 */ 0xed8190, 0xed8194, 0xed8198, 0xed81a0,
+ /* a9 */ 0xed81ac, 0xed81ad, 0xed81b0, 0xed81b4,
+ /* ad */ 0xed81bc, 0xed81bd, 0xed8281, 0xed82a4,
+ /* b1 */ 0xed82a5, 0xed82a8, 0xed82ac, 0xed82b4,
+ /* b5 */ 0xed82b5, 0xed82b7, 0xed82b9, 0xed8380,
+ /* b9 */ 0xed8381, 0xed8384, 0xed8388, 0xed8389,
+ /* bd */ 0xed8390, 0xed8391, 0xed8393, 0xed8394,
+ /* c1 */ 0xed8395, 0xed839c, 0xed839d, 0xed83a0,
+ /* c5 */ 0xed83a4, 0xed83ac, 0xed83ad, 0xed83af,
+ /* c9 */ 0xed83b0, 0xed83b1, 0xed83b8, 0xed848d,
+ /* cd */ 0xed84b0, 0xed84b1, 0xed84b4, 0xed84b8,
+ /* d1 */ 0xed84ba, 0xed8580, 0xed8581, 0xed8583,
+ /* d5 */ 0xed8584, 0xed8585, 0xed858c, 0xed858d,
+ /* d9 */ 0xed8590, 0xed8594, 0xed859c, 0xed859d,
+ /* dd */ 0xed859f, 0xed85a1, 0xed85a8, 0xed85ac,
+ /* e1 */ 0xed85bc, 0xed8684, 0xed8688, 0xed86a0,
+ /* e5 */ 0xed86a1, 0xed86a4, 0xed86a8, 0xed86b0,
+ /* e9 */ 0xed86b1, 0xed86b3, 0xed86b5, 0xed86ba,
+ /* ed */ 0xed86bc, 0xed8780, 0xed8798, 0xed87b4,
+ /* f1 */ 0xed87b8, 0xed8887, 0xed8889, 0xed8890,
+ /* f5 */ 0xed88ac, 0xed88ad, 0xed88b0, 0xed88b4,
+ /* f9 */ 0xed88bc, 0xed88bd, 0xed88bf, 0xed8981,
+ /* fd */ 0xed8988, 0xed899c,
+
+ /*** Two byte table, leaf: c6xx - offset 0x03472 ***/
+
+ /* 41 */ 0xed9e8d, 0xed9e8e, 0xed9e8f, 0xed9e91,
+ /* 45 */ 0xed9e92, 0xed9e93, 0xed9e94, 0xed9e95,
+ /* 49 */ 0xed9e96, 0xed9e97, 0xed9e9a, 0xed9e9c,
+ /* 4d */ 0xed9e9e, 0xed9e9f, 0xed9ea0, 0xed9ea1,
+ /* 51 */ 0xed9ea2, 0xed9ea3, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed89a4, 0xed8a80, 0xed8a81, 0xed8a84,
+ /* a5 */ 0xed8a88, 0xed8a90, 0xed8a91, 0xed8a95,
+ /* a9 */ 0xed8a9c, 0xed8aa0, 0xed8aa4, 0xed8aac,
+ /* ad */ 0xed8ab1, 0xed8ab8, 0xed8ab9, 0xed8abc,
+ /* b1 */ 0xed8abf, 0xed8b80, 0xed8b82, 0xed8b88,
+ /* b5 */ 0xed8b89, 0xed8b8b, 0xed8b94, 0xed8b98,
+ /* b9 */ 0xed8b9c, 0xed8ba4, 0xed8ba5, 0xed8bb0,
+ /* bd */ 0xed8bb1, 0xed8bb4, 0xed8bb8, 0xed8c80,
+ /* c1 */ 0xed8c81, 0xed8c83, 0xed8c85, 0xed8c8c,
+ /* c5 */ 0xed8c8d, 0xed8c8e, 0xed8c90, 0xed8c94,
+ /* c9 */ 0xed8c96, 0xed8c9c, 0xed8c9d, 0xed8c9f,
+ /* cd */ 0xed8ca0, 0xed8ca1, 0xed8ca5, 0xed8ca8,
+ /* d1 */ 0xed8ca9, 0xed8cac, 0xed8cb0, 0xed8cb8,
+ /* d5 */ 0xed8cb9, 0xed8cbb, 0xed8cbc, 0xed8cbd,
+ /* d9 */ 0xed8d84, 0xed8d85, 0xed8dbc, 0xed8dbd,
+ /* dd */ 0xed8e80, 0xed8e84, 0xed8e8c, 0xed8e8d,
+ /* e1 */ 0xed8e8f, 0xed8e90, 0xed8e91, 0xed8e98,
+ /* e5 */ 0xed8e99, 0xed8e9c, 0xed8ea0, 0xed8ea8,
+ /* e9 */ 0xed8ea9, 0xed8eab, 0xed8ead, 0xed8eb4,
+ /* ed */ 0xed8eb8, 0xed8ebc, 0xed8f84, 0xed8f85,
+ /* f1 */ 0xed8f88, 0xed8f89, 0xed8f90, 0xed8f98,
+ /* f5 */ 0xed8fa1, 0xed8fa3, 0xed8fac, 0xed8fad,
+ /* f9 */ 0xed8fb0, 0xed8fb4, 0xed8fbc, 0xed8fbd,
+ /* fd */ 0xed8fbf, 0xed9081,
+
+ /*** Two byte table, leaf: c7xx - offset 0x03530 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed9088, 0xed909d, 0xed9180, 0xed9184,
+ /* a5 */ 0xed919c, 0xed91a0, 0xed91a4, 0xed91ad,
+ /* a9 */ 0xed91af, 0xed91b8, 0xed91b9, 0xed91bc,
+ /* ad */ 0xed91bf, 0xed9280, 0xed9282, 0xed9288,
+ /* b1 */ 0xed9289, 0xed928b, 0xed928d, 0xed9294,
+ /* b5 */ 0xed92a9, 0xed938c, 0xed9390, 0xed9394,
+ /* b9 */ 0xed939c, 0xed939f, 0xed93a8, 0xed93ac,
+ /* bd */ 0xed93b0, 0xed93b8, 0xed93bb, 0xed93bd,
+ /* c1 */ 0xed9484, 0xed9488, 0xed948c, 0xed9494,
+ /* c5 */ 0xed9495, 0xed9497, 0xed94bc, 0xed94bd,
+ /* c9 */ 0xed9580, 0xed9584, 0xed958c, 0xed958d,
+ /* cd */ 0xed958f, 0xed9591, 0xed9598, 0xed9599,
+ /* d1 */ 0xed959c, 0xed95a0, 0xed95a5, 0xed95a8,
+ /* d5 */ 0xed95a9, 0xed95ab, 0xed95ad, 0xed95b4,
+ /* d9 */ 0xed95b5, 0xed95b8, 0xed95bc, 0xed9684,
+ /* dd */ 0xed9685, 0xed9687, 0xed9688, 0xed9689,
+ /* e1 */ 0xed9690, 0xed96a5, 0xed9788, 0xed9789,
+ /* e5 */ 0xed978c, 0xed9790, 0xed9792, 0xed9798,
+ /* e9 */ 0xed9799, 0xed979b, 0xed979d, 0xed97a4,
+ /* ed */ 0xed97a5, 0xed97a8, 0xed97ac, 0xed97b4,
+ /* f1 */ 0xed97b5, 0xed97b7, 0xed97b9, 0xed9880,
+ /* f5 */ 0xed9881, 0xed9884, 0xed9888, 0xed9890,
+ /* f9 */ 0xed9891, 0xed9893, 0xed9894, 0xed9895,
+ /* fd */ 0xed989c, 0xed98a0,
+
+ /*** Two byte table, leaf: c8xx - offset 0x035ee ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xed98a4, 0xed98ad, 0xed98b8, 0xed98b9,
+ /* a5 */ 0xed98bc, 0xed9980, 0xed9985, 0xed9988,
+ /* a9 */ 0xed9989, 0xed998b, 0xed998d, 0xed9991,
+ /* ad */ 0xed9994, 0xed9995, 0xed9998, 0xed999c,
+ /* b1 */ 0xed99a7, 0xed99a9, 0xed99b0, 0xed99b1,
+ /* b5 */ 0xed99b4, 0xed9a83, 0xed9a85, 0xed9a8c,
+ /* b9 */ 0xed9a8d, 0xed9a90, 0xed9a94, 0xed9a9d,
+ /* bd */ 0xed9a9f, 0xed9aa1, 0xed9aa8, 0xed9aac,
+ /* c1 */ 0xed9ab0, 0xed9ab9, 0xed9abb, 0xed9b84,
+ /* c5 */ 0xed9b85, 0xed9b88, 0xed9b8c, 0xed9b91,
+ /* c9 */ 0xed9b94, 0xed9b97, 0xed9b99, 0xed9ba0,
+ /* cd */ 0xed9ba4, 0xed9ba8, 0xed9bb0, 0xed9bb5,
+ /* d1 */ 0xed9bbc, 0xed9bbd, 0xed9c80, 0xed9c84,
+ /* d5 */ 0xed9c91, 0xed9c98, 0xed9c99, 0xed9c9c,
+ /* d9 */ 0xed9ca0, 0xed9ca8, 0xed9ca9, 0xed9cab,
+ /* dd */ 0xed9cad, 0xed9cb4, 0xed9cb5, 0xed9cb8,
+ /* e1 */ 0xed9cbc, 0xed9d84, 0xed9d87, 0xed9d89,
+ /* e5 */ 0xed9d90, 0xed9d91, 0xed9d94, 0xed9d96,
+ /* e9 */ 0xed9d97, 0xed9d98, 0xed9d99, 0xed9da0,
+ /* ed */ 0xed9da1, 0xed9da3, 0xed9da5, 0xed9da9,
+ /* f1 */ 0xed9dac, 0xed9db0, 0xed9db4, 0xed9dbc,
+ /* f5 */ 0xed9dbd, 0xed9e81, 0xed9e88, 0xed9e89,
+ /* f9 */ 0xed9e8c, 0xed9e90, 0xed9e98, 0xed9e99,
+ /* fd */ 0xed9e9b, 0xed9e9d,
+
+ /*** Two byte table, leaf: c9xx - offset 0x036ac ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xee8080, 0xee8081, 0xee8082, 0xee8083,
+ /* a5 */ 0xee8084, 0xee8085, 0xee8086, 0xee8087,
+ /* a9 */ 0xee8088, 0xee8089, 0xee808a, 0xee808b,
+ /* ad */ 0xee808c, 0xee808d, 0xee808e, 0xee808f,
+ /* b1 */ 0xee8090, 0xee8091, 0xee8092, 0xee8093,
+ /* b5 */ 0xee8094, 0xee8095, 0xee8096, 0xee8097,
+ /* b9 */ 0xee8098, 0xee8099, 0xee809a, 0xee809b,
+ /* bd */ 0xee809c, 0xee809d, 0xee809e, 0xee809f,
+ /* c1 */ 0xee80a0, 0xee80a1, 0xee80a2, 0xee80a3,
+ /* c5 */ 0xee80a4, 0xee80a5, 0xee80a6, 0xee80a7,
+ /* c9 */ 0xee80a8, 0xee80a9, 0xee80aa, 0xee80ab,
+ /* cd */ 0xee80ac, 0xee80ad, 0xee80ae, 0xee80af,
+ /* d1 */ 0xee80b0, 0xee80b1, 0xee80b2, 0xee80b3,
+ /* d5 */ 0xee80b4, 0xee80b5, 0xee80b6, 0xee80b7,
+ /* d9 */ 0xee80b8, 0xee80b9, 0xee80ba, 0xee80bb,
+ /* dd */ 0xee80bc, 0xee80bd, 0xee80be, 0xee80bf,
+ /* e1 */ 0xee8180, 0xee8181, 0xee8182, 0xee8183,
+ /* e5 */ 0xee8184, 0xee8185, 0xee8186, 0xee8187,
+ /* e9 */ 0xee8188, 0xee8189, 0xee818a, 0xee818b,
+ /* ed */ 0xee818c, 0xee818d, 0xee818e, 0xee818f,
+ /* f1 */ 0xee8190, 0xee8191, 0xee8192, 0xee8193,
+ /* f5 */ 0xee8194, 0xee8195, 0xee8196, 0xee8197,
+ /* f9 */ 0xee8198, 0xee8199, 0xee819a, 0xee819b,
+ /* fd */ 0xee819c, 0xee819d,
+
+ /*** Two byte table, leaf: caxx - offset 0x0376a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe4bcbd, 0xe4bdb3, 0xe58187, 0xe583b9,
+ /* a5 */ 0xe58aa0, 0xe58faf, 0xe591b5, 0xe593a5,
+ /* a9 */ 0xe59889, 0xe5ab81, 0xe5aeb6, 0xe69a87,
+ /* ad */ 0xe69eb6, 0xe69eb7, 0xe69faf, 0xe6ad8c,
+ /* b1 */ 0xe78f82, 0xe79782, 0xe7a8bc, 0xe88b9b,
+ /* b5 */ 0xe88c84, 0xe8a197, 0xe8a288, 0xe8a8b6,
+ /* b9 */ 0xe8b388, 0xe8b78f, 0xe8bbbb, 0xe8bfa6,
+ /* bd */ 0xe9a795, 0xe588bb, 0xe58db4, 0xe59084,
+ /* c1 */ 0xe681aa, 0xe685a4, 0xe6aebc, 0xe78f8f,
+ /* c5 */ 0xe8849a, 0xe8a6ba, 0xe8a792, 0xe996a3,
+ /* c9 */ 0xe4be83, 0xe5888a, 0xe5a2be, 0xe5a5b8,
+ /* cd */ 0xe5a7a6, 0xe5b9b2, 0xe5b9b9, 0xe68787,
+ /* d1 */ 0xe68f80, 0xe69d86, 0xe69fac, 0xe6a1bf,
+ /* d5 */ 0xe6be97, 0xe7998e, 0xe79c8b, 0xe7a3b5,
+ /* d9 */ 0xe7a888, 0xe7abbf, 0xe7b0a1, 0xe8829d,
+ /* dd */ 0xe889ae, 0xe889b1, 0xe8abab, 0xe99693,
+ /* e1 */ 0xe4b9ab, 0xe5969d, 0xe69bb7, 0xe6b8b4,
+ /* e5 */ 0xe7a2a3, 0xe7abad, 0xe8919b, 0xe8a490,
+ /* e9 */ 0xe89d8e, 0xe99ea8, 0xe58b98, 0xe59d8e,
+ /* ed */ 0xe5a0aa, 0xe5b58c, 0xe6849f, 0xe686be,
+ /* f1 */ 0xe688a1, 0xe695a2, 0xe69f91, 0xe6a984,
+ /* f5 */ 0xe6b89b, 0xe79498, 0xe796b3, 0xe79ba3,
+ /* f9 */ 0xe79eb0, 0xe7b4ba, 0xe982af, 0xe99191,
+ /* fd */ 0xe99192, 0xe9be95,
+
+ /*** Two byte table, leaf: cbxx - offset 0x03828 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe58ca3, 0xe5b2ac, 0xe794b2, 0xe8839b,
+ /* a5 */ 0xe98980, 0xe99698, 0xe5899b, 0xe5a088,
+ /* a9 */ 0xe5a79c, 0xe5b2a1, 0xe5b497, 0xe5bab7,
+ /* ad */ 0xe5bcba, 0xe5bd8a, 0xe685b7, 0xe6b19f,
+ /* b1 */ 0xe795ba, 0xe79686, 0xe7b3a0, 0xe7b5b3,
+ /* b5 */ 0xe7b6b1, 0xe7be8c, 0xe88594, 0xe888a1,
+ /* b9 */ 0xe89691, 0xe8a581, 0xe8ac9b, 0xe98bbc,
+ /* bd */ 0xe9998d, 0xe9b187, 0xe4bb8b, 0xe4bbb7,
+ /* c1 */ 0xe5808b, 0xe587b1, 0xe5a18f, 0xe684b7,
+ /* c5 */ 0xe684be, 0xe685a8, 0xe694b9, 0xe6a7aa,
+ /* c9 */ 0xe6bc91, 0xe796a5, 0xe79a86, 0xe79b96,
+ /* cd */ 0xe7ae87, 0xe88aa5, 0xe8938b, 0xefa480,
+ /* d1 */ 0xe98ea7, 0xe9968b, 0xe59680, 0xe5aea2,
+ /* d5 */ 0xe59d91, 0xefa481, 0xe7b2b3, 0xe7beb9,
+ /* d9 */ 0xe986b5, 0xe580a8, 0xe58ebb, 0xe5b185,
+ /* dd */ 0xe5b7a8, 0xe68b92, 0xe68dae, 0xe6939a,
+ /* e1 */ 0xe693a7, 0xe6b8a0, 0xe782ac, 0xe7a59b,
+ /* e5 */ 0xe8b79d, 0xe8b89e, 0xefa482, 0xe981bd,
+ /* e9 */ 0xe98985, 0xe98bb8, 0xe4b9be, 0xe4bbb6,
+ /* ed */ 0xe581a5, 0xe5b7be, 0xe5bbba, 0xe68486,
+ /* f1 */ 0xe6a597, 0xe885b1, 0xe89994, 0xe8b987,
+ /* f5 */ 0xe98db5, 0xe9a8ab, 0xe4b99e, 0xe58291,
+ /* f9 */ 0xe69db0, 0xe6a180, 0xe58489, 0xe58a8d,
+ /* fd */ 0xe58a92, 0xe6aaa2,
+
+ /*** Two byte table, leaf: ccxx - offset 0x038e6 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe79ebc, 0xe98890, 0xe9bb94, 0xe58aab,
+ /* a5 */ 0xe680af, 0xe8bfb2, 0xe58188, 0xe686a9,
+ /* a9 */ 0xe68fad, 0xe6938a, 0xe6a0bc, 0xe6aa84,
+ /* ad */ 0xe6bf80, 0xe88688, 0xe8a6a1, 0xe99a94,
+ /* b1 */ 0xe5a085, 0xe789bd, 0xe78aac, 0xe79484,
+ /* b5 */ 0xe7b5b9, 0xe7b9ad, 0xe882a9, 0xe8a68b,
+ /* b9 */ 0xe8adb4, 0xe981a3, 0xe9b591, 0xe68a89,
+ /* bd */ 0xe6b1ba, 0xe6bd94, 0xe7b590, 0xe7bcba,
+ /* c1 */ 0xe8a8a3, 0xe585bc, 0xe6858a, 0xe7ae9d,
+ /* c5 */ 0xe8ac99, 0xe98997, 0xe98e8c, 0xe4baac,
+ /* c9 */ 0xe4bf93, 0xe5809e, 0xe582be, 0xe58486,
+ /* cd */ 0xe58b81, 0xe58b8d, 0xe58dbf, 0xe59db0,
+ /* d1 */ 0xe5a283, 0xe5ba9a, 0xe5be91, 0xe685b6,
+ /* d5 */ 0xe686ac, 0xe6938e, 0xe695ac, 0xe699af,
+ /* d9 */ 0xe69abb, 0xe69bb4, 0xe6a297, 0xe6b687,
+ /* dd */ 0xe78285, 0xe783b1, 0xe7929f, 0xe792a5,
+ /* e1 */ 0xe7938a, 0xe79799, 0xe7a1ac, 0xe7a3ac,
+ /* e5 */ 0xe7ab9f, 0xe7abb6, 0xe7b585, 0xe7b693,
+ /* e9 */ 0xe88095, 0xe880bf, 0xe8849b, 0xe88e96,
+ /* ed */ 0xe8ada6, 0xe8bc95, 0xe98095, 0xe98fa1,
+ /* f1 */ 0xe9a083, 0xe9a0b8, 0xe9a99a, 0xe9afa8,
+ /* f5 */ 0xe4bf82, 0xe59593, 0xe5a0ba, 0xe5a591,
+ /* f9 */ 0xe5ada3, 0xe5b186, 0xe682b8, 0xe68892,
+ /* fd */ 0xe6a182, 0xe6a2b0,
+
+ /*** Two byte table, leaf: cdxx - offset 0x039a4 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6a3a8, 0xe6baaa, 0xe7958c, 0xe799b8,
+ /* a5 */ 0xe7a38e, 0xe7a8bd, 0xe7b3bb, 0xe7b9ab,
+ /* a9 */ 0xe7b9bc, 0xe8a888, 0xe8aaa1, 0xe8b0bf,
+ /* ad */ 0xe99a8e, 0xe9b784, 0xe58fa4, 0xe58fa9,
+ /* b1 */ 0xe5918a, 0xe591b1, 0xe59bba, 0xe5a791,
+ /* b5 */ 0xe5ada4, 0xe5b0bb, 0xe5baab, 0xe68bb7,
+ /* b9 */ 0xe694b7, 0xe69585, 0xe695b2, 0xe69aa0,
+ /* bd */ 0xe69eaf, 0xe6a781, 0xe6b2bd, 0xe797bc,
+ /* c1 */ 0xe79a90, 0xe79dbe, 0xe7a8bf, 0xe7be94,
+ /* c5 */ 0xe88083, 0xe882a1, 0xe8868f, 0xe88ba6,
+ /* c9 */ 0xe88bbd, 0xe88fb0, 0xe89781, 0xe8a0b1,
+ /* cd */ 0xe8a2b4, 0xe8aaa5, 0xefa483, 0xe8be9c,
+ /* d1 */ 0xe98cae, 0xe99b87, 0xe9a1a7, 0xe9ab98,
+ /* d5 */ 0xe9bc93, 0xe593ad, 0xe6969b, 0xe69bb2,
+ /* d9 */ 0xe6a28f, 0xe7a980, 0xe8b0b7, 0xe9b5a0,
+ /* dd */ 0xe59bb0, 0xe59da4, 0xe5b491, 0xe69886,
+ /* e1 */ 0xe6a2b1, 0xe6a38d, 0xe6bbbe, 0xe790a8,
+ /* e5 */ 0xe8a29e, 0xe9afa4, 0xe6b1a8, 0xefa484,
+ /* e9 */ 0xe9aaa8, 0xe4be9b, 0xe585ac, 0xe585b1,
+ /* ed */ 0xe58a9f, 0xe5ad94, 0xe5b7a5, 0xe68190,
+ /* f1 */ 0xe681ad, 0xe68bb1, 0xe68ea7, 0xe694bb,
+ /* f5 */ 0xe78f99, 0xe7a9ba, 0xe89aa3, 0xe8b2a2,
+ /* f9 */ 0xe99e8f, 0xe4b8b2, 0xe5afa1, 0xe68888,
+ /* fd */ 0xe69e9c, 0xe7939c,
+
+ /*** Two byte table, leaf: cexx - offset 0x03a62 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7a791, 0xe88f93, 0xe8aa87, 0xe8aab2,
+ /* a5 */ 0xe8b7a8, 0xe9818e, 0xe98d8b, 0xe9a186,
+ /* a9 */ 0xe5bb93, 0xe6a7a8, 0xe897bf, 0xe983ad,
+ /* ad */ 0xefa485, 0xe586a0, 0xe5ae98, 0xe5afac,
+ /* b1 */ 0xe685a3, 0xe6a3ba, 0xe6acbe, 0xe7818c,
+ /* b5 */ 0xe790af, 0xe79398, 0xe7aea1, 0xe7bd90,
+ /* b9 */ 0xe88f85, 0xe8a780, 0xe8b2ab, 0xe9979c,
+ /* bd */ 0xe9a4a8, 0xe588ae, 0xe6819d, 0xe68bac,
+ /* c1 */ 0xe98082, 0xe4be8a, 0xe58589, 0xe58ca1,
+ /* c5 */ 0xe5a399, 0xe5bba3, 0xe69ba0, 0xe6b4b8,
+ /* c9 */ 0xe7829a, 0xe78b82, 0xe78f96, 0xe7ad90,
+ /* cd */ 0xe883b1, 0xe9919b, 0xe58da6, 0xe68e9b,
+ /* d1 */ 0xe7bdab, 0xe4b996, 0xe58280, 0xe5a18a,
+ /* d5 */ 0xe5a39e, 0xe680aa, 0xe684a7, 0xe68b90,
+ /* d9 */ 0xe6a790, 0xe9ad81, 0xe5ae8f, 0xe7b498,
+ /* dd */ 0xe882b1, 0xe8bd9f, 0xe4baa4, 0xe58391,
+ /* e1 */ 0xe592ac, 0xe596ac, 0xe5ac8c, 0xe5b6a0,
+ /* e5 */ 0xe5b7a7, 0xe694aa, 0xe6958e, 0xe6a0a1,
+ /* e9 */ 0xe6a98b, 0xe78ba1, 0xe79a8e, 0xe79faf,
+ /* ed */ 0xe7b59e, 0xe7bfb9, 0xe886a0, 0xe8958e,
+ /* f1 */ 0xe89b9f, 0xe8bc83, 0xe8bd8e, 0xe9838a,
+ /* f5 */ 0xe9a483, 0xe9a995, 0xe9aeab, 0xe4b898,
+ /* f9 */ 0xe4b985, 0xe4b99d, 0xe4bb87, 0xe4bfb1,
+ /* fd */ 0xe585b7, 0xe58bbe,
+
+ /*** Two byte table, leaf: cfxx - offset 0x03b20 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe58d80, 0xe58fa3, 0xe58fa5, 0xe5928e,
+ /* a5 */ 0xe59894, 0xe59db5, 0xe59ea2, 0xe5af87,
+ /* a9 */ 0xe5b687, 0xe5bb90, 0xe687bc, 0xe68b98,
+ /* ad */ 0xe69591, 0xe69eb8, 0xe69fa9, 0xe6a78b,
+ /* b1 */ 0xe6ad90, 0xe6af86, 0xe6afac, 0xe6b182,
+ /* b5 */ 0xe6ba9d, 0xe781b8, 0xe78b97, 0xe78e96,
+ /* b9 */ 0xe79083, 0xe79ebf, 0xe79fa9, 0xe7a9b6,
+ /* bd */ 0xe7b5bf, 0xe88089, 0xe887bc, 0xe88885,
+ /* c1 */ 0xe8888a, 0xe88b9f, 0xe8a1a2, 0xe8acb3,
+ /* c5 */ 0xe8b3bc, 0xe8bb80, 0xe98091, 0xe982b1,
+ /* c9 */ 0xe989a4, 0xe98ab6, 0xe9a792, 0xe9a985,
+ /* cd */ 0xe9b3a9, 0xe9b797, 0xe9be9c, 0xe59c8b,
+ /* d1 */ 0xe5b180, 0xe88f8a, 0xe99ea0, 0xe99eab,
+ /* d5 */ 0xe9bab4, 0xe5909b, 0xe7aa98, 0xe7bea4,
+ /* d9 */ 0xe8a399, 0xe8bb8d, 0xe983a1, 0xe5a080,
+ /* dd */ 0xe5b188, 0xe68e98, 0xe7aa9f, 0xe5aeae,
+ /* e1 */ 0xe5bc93, 0xe7a9b9, 0xe7aaae, 0xe88a8e,
+ /* e5 */ 0xe8baac, 0xe580a6, 0xe588b8, 0xe58bb8,
+ /* e9 */ 0xe58db7, 0xe59c88, 0xe68bb3, 0xe68db2,
+ /* ed */ 0xe6ac8a, 0xe6b783, 0xe79cb7, 0xe58ea5,
+ /* f1 */ 0xe78d97, 0xe895a8, 0xe8b9b6, 0xe99795,
+ /* f5 */ 0xe69cba, 0xe6ab83, 0xe6bdb0, 0xe8a9ad,
+ /* f9 */ 0xe8bb8c, 0xe9a58b, 0xefa486, 0xe699b7,
+ /* fd */ 0xe6adb8, 0xe8b2b4,
+
+ /*** Two byte table, leaf: d0xx - offset 0x03bde ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe9acbc, 0xefa487, 0xe58fab, 0xe59cad,
+ /* a5 */ 0xe5a58e, 0xe68f86, 0xe6a7bb, 0xe78faa,
+ /* a9 */ 0xe7a185, 0xe7aaba, 0xe7ab85, 0xe7b3be,
+ /* ad */ 0xe891b5, 0xe8a68f, 0xe8b5b3, 0xe980b5,
+ /* b1 */ 0xe996a8, 0xe58bbb, 0xe59d87, 0xe79587,
+ /* b5 */ 0xe7ada0, 0xe88f8c, 0xe9889e, 0xefa488,
+ /* b9 */ 0xe6a998, 0xe5858b, 0xe5898b, 0xe58a87,
+ /* bd */ 0xe6889f, 0xe6a398, 0xe6a5b5, 0xe99a99,
+ /* c1 */ 0xe58385, 0xe58aa4, 0xe58ba4, 0xe68783,
+ /* c5 */ 0xe696a4, 0xe6a0b9, 0xe6a7bf, 0xe791be,
+ /* c9 */ 0xe7ad8b, 0xe88ab9, 0xe88fab, 0xe8a6b2,
+ /* cd */ 0xe8acb9, 0xe8bf91, 0xe9a589, 0xefa489,
+ /* d1 */ 0xe4bb8a, 0xe5a697, 0xe69392, 0xe69891,
+ /* d5 */ 0xe6aa8e, 0xe790b4, 0xe7a681, 0xe7a6bd,
+ /* d9 */ 0xe88aa9, 0xe8a1be, 0xe8a1bf, 0xe8a59f,
+ /* dd */ 0xefa48a, 0xe98ca6, 0xe4bc8b, 0xe58f8a,
+ /* e1 */ 0xe680a5, 0xe689b1, 0xe6b1b2, 0xe7b49a,
+ /* e5 */ 0xe7b5a6, 0xe4ba98, 0xe585a2, 0xe79f9c,
+ /* e9 */ 0xe882af, 0xe4bc81, 0xe4bc8e, 0xe585b6,
+ /* ed */ 0xe58680, 0xe5979c, 0xe599a8, 0xe59cbb,
+ /* f1 */ 0xe59fba, 0xe59fbc, 0xe5a494, 0xe5a587,
+ /* f5 */ 0xe5a693, 0xe5af84, 0xe5b290, 0xe5b48e,
+ /* f9 */ 0xe5b7b1, 0xe5b9be, 0xe5bf8c, 0xe68a80,
+ /* fd */ 0xe69797, 0xe697a3,
+
+ /*** Two byte table, leaf: d1xx - offset 0x03c9c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe69c9e, 0xe69c9f, 0xe69d9e, 0xe6a38b,
+ /* a5 */ 0xe6a384, 0xe6a99f, 0xe6acba, 0xe6b0a3,
+ /* a9 */ 0xe6b1bd, 0xe6b282, 0xe6b787, 0xe78e98,
+ /* ad */ 0xe790a6, 0xe790aa, 0xe79282, 0xe792a3,
+ /* b1 */ 0xe795b8, 0xe795bf, 0xe7a281, 0xe7a3af,
+ /* b5 */ 0xe7a581, 0xe7a587, 0xe7a588, 0xe7a5ba,
+ /* b9 */ 0xe7ae95, 0xe7b480, 0xe7b6ba, 0xe7be88,
+ /* bd */ 0xe88086, 0xe880ad, 0xe8828c, 0xe8a898,
+ /* c1 */ 0xe8ad8f, 0xe8b188, 0xe8b5b7, 0xe98ca1,
+ /* c5 */ 0xe98ca4, 0xe9a3a2, 0xe9a591, 0xe9a88e,
+ /* c9 */ 0xe9a88f, 0xe9a9a5, 0xe9ba92, 0xe7b78a,
+ /* cd */ 0xe4bdb6, 0xe59089, 0xe68bae, 0xe6a194,
+ /* d1 */ 0xe98791, 0xe596ab, 0xe584ba, 0xefa48b,
+ /* d5 */ 0xefa48c, 0xe5a89c, 0xe687a6, 0xefa48d,
+ /* d9 */ 0xe68b8f, 0xe68bbf, 0xefa48e, 0xefa48f,
+ /* dd */ 0xefa490, 0xefa491, 0xefa492, 0xefa493,
+ /* e1 */ 0xe982a3, 0xefa494, 0xefa495, 0xefa496,
+ /* e5 */ 0xefa497, 0xefa498, 0xe8abbe, 0xefa499,
+ /* e9 */ 0xefa49a, 0xefa49b, 0xefa49c, 0xe69a96,
+ /* ed */ 0xefa49d, 0xe78596, 0xefa49e, 0xefa49f,
+ /* f1 */ 0xe99ba3, 0xefa4a0, 0xe68d8f, 0xe68dba,
+ /* f5 */ 0xe58d97, 0xefa4a1, 0xe69e8f, 0xe6a5a0,
+ /* f9 */ 0xe6b9b3, 0xefa4a2, 0xe794b7, 0xefa4a3,
+ /* fd */ 0xefa4a4, 0xefa4a5,
+
+ /*** Two byte table, leaf: d2xx - offset 0x03d5a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7b48d, 0xefa4a6, 0xefa4a7, 0xe8a1b2,
+ /* a5 */ 0xe59b8a, 0xe5a898, 0xefa4a8, 0xefa4a9,
+ /* a9 */ 0xefa4aa, 0xefa4ab, 0xefa4ac, 0xe4b983,
+ /* ad */ 0xefa4ad, 0xe585a7, 0xe5a588, 0xe69fb0,
+ /* b1 */ 0xe88090, 0xefa4ae, 0xe5a5b3, 0xe5b9b4,
+ /* b5 */ 0xe6929a, 0xe7a78a, 0xe5bfb5, 0xe681ac,
+ /* b9 */ 0xe68b88, 0xe68dbb, 0xe5afa7, 0xe5af97,
+ /* bd */ 0xe58aaa, 0xefa4af, 0xe5a5b4, 0xe5bca9,
+ /* c1 */ 0xe68092, 0xefa4b0, 0xefa4b1, 0xefa4b2,
+ /* c5 */ 0xe79199, 0xefa4b3, 0xefa4b4, 0xefa4b5,
+ /* c9 */ 0xefa4b6, 0xefa4b7, 0xefa4b8, 0xe9a791,
+ /* cd */ 0xefa4b9, 0xefa4ba, 0xefa4bb, 0xefa4bc,
+ /* d1 */ 0xefa4bd, 0xefa4be, 0xefa4bf, 0xefa580,
+ /* d5 */ 0xefa581, 0xefa582, 0xefa583, 0xe6bf83,
+ /* d9 */ 0xefa584, 0xefa585, 0xe886bf, 0xe8beb2,
+ /* dd */ 0xe683b1, 0xefa586, 0xefa587, 0xe885a6,
+ /* e1 */ 0xefa588, 0xefa589, 0xe5b0bf, 0xefa58a,
+ /* e5 */ 0xefa58b, 0xefa58c, 0xefa58d, 0xefa58e,
+ /* e9 */ 0xefa58f, 0xefa590, 0xefa591, 0xe5aba9,
+ /* ed */ 0xe8a8a5, 0xe69dbb, 0xe7b490, 0xefa592,
+ /* f1 */ 0xefa593, 0xefa594, 0xefa595, 0xefa596,
+ /* f5 */ 0xefa597, 0xe883bd, 0xefa598, 0xefa599,
+ /* f9 */ 0xe5b0bc, 0xe6b3a5, 0xe58cbf, 0xe6baba,
+ /* fd */ 0xe5a49a, 0xe88cb6,
+
+ /*** Two byte table, leaf: d3xx - offset 0x03e18 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe4b8b9, 0xe4bab6, 0xe4bd86, 0xe596ae,
+ /* a5 */ 0xe59c98, 0xe5a387, 0xe5bd96, 0xe696b7,
+ /* a9 */ 0xe697a6, 0xe6aa80, 0xe6aeb5, 0xe6b98d,
+ /* ad */ 0xe79fad, 0xe7abaf, 0xe7b09e, 0xe7b79e,
+ /* b1 */ 0xe89b8b, 0xe8a292, 0xe984b2, 0xe98d9b,
+ /* b5 */ 0xe692bb, 0xe6bebe, 0xe78dba, 0xe796b8,
+ /* b9 */ 0xe98194, 0xe59596, 0xe59d8d, 0xe686ba,
+ /* bd */ 0xe69394, 0xe69b87, 0xe6b7a1, 0xe6b99b,
+ /* c1 */ 0xe6bdad, 0xe6beb9, 0xe797b0, 0xe88183,
+ /* c5 */ 0xe886bd, 0xe89581, 0xe8a683, 0xe8ab87,
+ /* c9 */ 0xe8ad9a, 0xe98c9f, 0xe6b293, 0xe79593,
+ /* cd */ 0xe7ad94, 0xe8b88f, 0xe9819d, 0xe59490,
+ /* d1 */ 0xe5a082, 0xe5a198, 0xe5b9a2, 0xe68887,
+ /* d5 */ 0xe6929e, 0xe6a3a0, 0xe795b6, 0xe7b396,
+ /* d9 */ 0xe89eb3, 0xe9bba8, 0xe4bba3, 0xe59e88,
+ /* dd */ 0xe59dae, 0xe5a4a7, 0xe5b08d, 0xe5b2b1,
+ /* e1 */ 0xe5b8b6, 0xe5be85, 0xe688b4, 0xe693a1,
+ /* e5 */ 0xe78eb3, 0xe887ba, 0xe8a28b, 0xe8b2b8,
+ /* e9 */ 0xe99a8a, 0xe9bb9b, 0xe5ae85, 0xe5beb7,
+ /* ed */ 0xe682b3, 0xe58092, 0xe58880, 0xe588b0,
+ /* f1 */ 0xe59c96, 0xe5a0b5, 0xe5a197, 0xe5b08e,
+ /* f5 */ 0xe5b1a0, 0xe5b3b6, 0xe5b68b, 0xe5baa6,
+ /* f9 */ 0xe5be92, 0xe682bc, 0xe68c91, 0xe68e89,
+ /* fd */ 0xe69097, 0xe6a183,
+
+ /*** Two byte table, leaf: d4xx - offset 0x03ed6 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6a3b9, 0xe6ab82, 0xe6b798, 0xe6b8a1,
+ /* a5 */ 0xe6bb94, 0xe6bfa4, 0xe787be, 0xe79b9c,
+ /* a9 */ 0xe79db9, 0xe7a6b1, 0xe7a8bb, 0xe89084,
+ /* ad */ 0xe8a6a9, 0xe8b3ad, 0xe8b7b3, 0xe8b988,
+ /* b1 */ 0xe98083, 0xe98094, 0xe98193, 0xe983bd,
+ /* b5 */ 0xe98d8d, 0xe999b6, 0xe99f9c, 0xe6af92,
+ /* b9 */ 0xe78086, 0xe78998, 0xe78aa2, 0xe78da8,
+ /* bd */ 0xe79da3, 0xe7a6bf, 0xe7afa4, 0xe7ba9b,
+ /* c1 */ 0xe8ae80, 0xe5a2a9, 0xe68387, 0xe695a6,
+ /* c5 */ 0xe697bd, 0xe69abe, 0xe6b28c, 0xe7849e,
+ /* c9 */ 0xe78789, 0xe8b19a, 0xe9a093, 0xe4b9ad,
+ /* cd */ 0xe7aa81, 0xe4bb9d, 0xe586ac, 0xe5878d,
+ /* d1 */ 0xe58b95, 0xe5908c, 0xe686a7, 0xe69db1,
+ /* d5 */ 0xe6a190, 0xe6a39f, 0xe6b49e, 0xe6bdbc,
+ /* d9 */ 0xe796bc, 0xe79eb3, 0xe7aba5, 0xe883b4,
+ /* dd */ 0xe891a3, 0xe98a85, 0xe5859c, 0xe69697,
+ /* e1 */ 0xe69d9c, 0xe69e93, 0xe79798, 0xe7ab87,
+ /* e5 */ 0xe88db3, 0xefa59a, 0xe8b186, 0xe98097,
+ /* e9 */ 0xe9a0ad, 0xe5b1af, 0xe88780, 0xe88a9a,
+ /* ed */ 0xe98181, 0xe981af, 0xe9888d, 0xe5be97,
+ /* f1 */ 0xe5b69d, 0xe6a999, 0xe78788, 0xe799bb,
+ /* f5 */ 0xe7ad89, 0xe897a4, 0xe8ac84, 0xe984a7,
+ /* f9 */ 0xe9a8b0, 0xe59687, 0xe687b6, 0xefa59b,
+ /* fd */ 0xe799a9, 0xe7be85,
+
+ /*** Two byte table, leaf: d5xx - offset 0x03f94 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe898bf, 0xe89eba, 0xe8a3b8, 0xe9828f,
+ /* a5 */ 0xefa59c, 0xe6b49b, 0xe78399, 0xe78f9e,
+ /* a9 */ 0xe7b5a1, 0xe890bd, 0xefa59d, 0xe985aa,
+ /* ad */ 0xe9a7b1, 0xefa59e, 0xe4ba82, 0xe58db5,
+ /* b1 */ 0xe6ac84, 0xe6ac92, 0xe780be, 0xe7889b,
+ /* b5 */ 0xe898ad, 0xe9b89e, 0xe5898c, 0xe8bea3,
+ /* b9 */ 0xe5b590, 0xe693a5, 0xe694ac, 0xe6ac96,
+ /* bd */ 0xe6bfab, 0xe7b183, 0xe7ba9c, 0xe8978d,
+ /* c1 */ 0xe8a5a4, 0xe8a6bd, 0xe68b89, 0xe88798,
+ /* c5 */ 0xe8a09f, 0xe5bb8a, 0xe69c97, 0xe6b5aa,
+ /* c9 */ 0xe78bbc, 0xe79085, 0xe791af, 0xe89e82,
+ /* cd */ 0xe9839e, 0xe4be86, 0xe5b48d, 0xe5bea0,
+ /* d1 */ 0xe8908a, 0xe586b7, 0xe68ea0, 0xe795a5,
+ /* d5 */ 0xe4baae, 0xe58086, 0xe585a9, 0xe58789,
+ /* d9 */ 0xe6a281, 0xe6a891, 0xe7b2ae, 0xe7b2b1,
+ /* dd */ 0xe7b3a7, 0xe889af, 0xe8ab92, 0xe8bc9b,
+ /* e1 */ 0xe9878f, 0xe4beb6, 0xe584b7, 0xe58bb5,
+ /* e5 */ 0xe59182, 0xe5bbac, 0xe685ae, 0xe688be,
+ /* e9 */ 0xe69785, 0xe6ab9a, 0xe6bfbe, 0xe7a4aa,
+ /* ed */ 0xe8979c, 0xe8a0a3, 0xe996ad, 0xe9a9a2,
+ /* f1 */ 0xe9a9aa, 0xe9ba97, 0xe9bb8e, 0xe58a9b,
+ /* f5 */ 0xe69b86, 0xe6adb7, 0xe7809d, 0xe7a4ab,
+ /* f9 */ 0xe8bda2, 0xe99d82, 0xe68690, 0xe68880,
+ /* fd */ 0xe694a3, 0xe6bca3,
+
+ /*** Two byte table, leaf: d6xx - offset 0x04052 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe78589, 0xe79289, 0xe7b7b4, 0xe881af,
+ /* a5 */ 0xe893ae, 0xe8bca6, 0xe980a3, 0xe98d8a,
+ /* a9 */ 0xe586bd, 0xe58897, 0xe58aa3, 0xe6b48c,
+ /* ad */ 0xe78388, 0xe8a382, 0xe5bb89, 0xe69682,
+ /* b1 */ 0xe6aeae, 0xe6bf82, 0xe7b0be, 0xe78db5,
+ /* b5 */ 0xe4bba4, 0xe4bcb6, 0xe59bb9, 0xefa59f,
+ /* b9 */ 0xe5b2ba, 0xe5b6ba, 0xe6809c, 0xe78eb2,
+ /* bd */ 0xe7acad, 0xe7be9a, 0xe7bf8e, 0xe88186,
+ /* c1 */ 0xe9809e, 0xe988b4, 0xe99bb6, 0xe99d88,
+ /* c5 */ 0xe9a098, 0xe9bda1, 0xe4be8b, 0xe6bea7,
+ /* c9 */ 0xe7a6ae, 0xe986b4, 0xe99ab7, 0xe58b9e,
+ /* cd */ 0xefa5a0, 0xe69288, 0xe69384, 0xe6ab93,
+ /* d1 */ 0xe6bd9e, 0xe78098, 0xe78890, 0xe79ba7,
+ /* d5 */ 0xe88081, 0xe89886, 0xe8999c, 0xe8b7af,
+ /* d9 */ 0xe8bc85, 0xe99cb2, 0xe9adaf, 0xe9b7ba,
+ /* dd */ 0xe9b9b5, 0xe7a28c, 0xe7a5bf, 0xe7b6a0,
+ /* e1 */ 0xe88f89, 0xe98c84, 0xe9b9bf, 0xe9ba93,
+ /* e5 */ 0xe8ab96, 0xe5a39f, 0xe5bc84, 0xe69ca7,
+ /* e9 */ 0xe780a7, 0xe7938f, 0xe7b1a0, 0xe881be,
+ /* ed */ 0xe584a1, 0xe780a8, 0xe789a2, 0xe7a38a,
+ /* f1 */ 0xe8b382, 0xe8b39a, 0xe8b3b4, 0xe99bb7,
+ /* f5 */ 0xe4ba86, 0xe5839a, 0xe5afae, 0xe5bb96,
+ /* f9 */ 0xe69699, 0xe7878e, 0xe79982, 0xe79ead,
+ /* fd */ 0xe8818a, 0xe893bc,
+
+ /*** Two byte table, leaf: d7xx - offset 0x04110 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe981bc, 0xe9aca7, 0xe9be8d, 0xe5a398,
+ /* a5 */ 0xe5a981, 0xe5b1a2, 0xe6a893, 0xe6b79a,
+ /* a9 */ 0xe6bc8f, 0xe798bb, 0xe7b4af, 0xe7b8b7,
+ /* ad */ 0xe8949e, 0xe8a4b8, 0xe98fa4, 0xe9998b,
+ /* b1 */ 0xe58a89, 0xe69792, 0xe69fb3, 0xe6a6b4,
+ /* b5 */ 0xe6b581, 0xe6ba9c, 0xe7808f, 0xe79089,
+ /* b9 */ 0xe791a0, 0xe79599, 0xe798a4, 0xe7a1ab,
+ /* bd */ 0xe8acac, 0xe9a19e, 0xe585ad, 0xe688ae,
+ /* c1 */ 0xe999b8, 0xe4be96, 0xe580ab, 0xe5b499,
+ /* c5 */ 0xe6b7aa, 0xe7b6b8, 0xe8bcaa, 0xe5be8b,
+ /* c9 */ 0xe68584, 0xe6a097, 0xefa5a1, 0xe99a86,
+ /* cd */ 0xe58b92, 0xe8828b, 0xe5879c, 0xe5878c,
+ /* d1 */ 0xe6a59e, 0xe7a89c, 0xe7b6be, 0xe88fb1,
+ /* d5 */ 0xe999b5, 0xe4bf9a, 0xe588a9, 0xe58e98,
+ /* d9 */ 0xe5908f, 0xe5948e, 0xe5b1a5, 0xe682a7,
+ /* dd */ 0xe69d8e, 0xe6a2a8, 0xe6b5ac, 0xe78a81,
+ /* e1 */ 0xe78bb8, 0xe79086, 0xe79283, 0xefa5a2,
+ /* e5 */ 0xe797a2, 0xe7b1ac, 0xe7bdb9, 0xe7beb8,
+ /* e9 */ 0xe88e89, 0xe8a38f, 0xe8a3a1, 0xe9878c,
+ /* ed */ 0xe98790, 0xe99ba2, 0xe9af89, 0xe5909d,
+ /* f1 */ 0xe6bdbe, 0xe78790, 0xe79298, 0xe897ba,
+ /* f5 */ 0xe8baaa, 0xe99aa3, 0xe9b197, 0xe9ba9f,
+ /* f9 */ 0xe69e97, 0xe6b78b, 0xe790b3, 0xe887a8,
+ /* fd */ 0xe99c96, 0xe7a0ac,
+
+ /*** Two byte table, leaf: d8xx - offset 0x041ce ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7ab8b, 0xe7aca0, 0xe7b292, 0xe691a9,
+ /* a5 */ 0xe791aa, 0xe797b2, 0xe7a2bc, 0xe7a3a8,
+ /* a9 */ 0xe9a6ac, 0xe9ad94, 0xe9babb, 0xe5af9e,
+ /* ad */ 0xe5b995, 0xe6bca0, 0xe8869c, 0xe88eab,
+ /* b1 */ 0xe98288, 0xe4b887, 0xe58d8d, 0xe5a8a9,
+ /* b5 */ 0xe5b792, 0xe5bd8e, 0xe685a2, 0xe68cbd,
+ /* b9 */ 0xe699a9, 0xe69bbc, 0xe6bbbf, 0xe6bcab,
+ /* bd */ 0xe781a3, 0xe79e9e, 0xe890ac, 0xe89493,
+ /* c1 */ 0xe8a0bb, 0xe8bc93, 0xe9a585, 0xe9b0bb,
+ /* c5 */ 0xe5949c, 0xe68ab9, 0xe69cab, 0xe6b2ab,
+ /* c9 */ 0xe88c89, 0xe8a5aa, 0xe99dba, 0xe4baa1,
+ /* cd */ 0xe5a684, 0xe5bf98, 0xe5bf99, 0xe69c9b,
+ /* d1 */ 0xe7b6b2, 0xe7bd94, 0xe88a92, 0xe88cab,
+ /* d5 */ 0xe88ebd, 0xe8bc9e, 0xe98299, 0xe59f8b,
+ /* d9 */ 0xe5a6b9, 0xe5aa92, 0xe5af90, 0xe698a7,
+ /* dd */ 0xe69e9a, 0xe6a285, 0xe6af8f, 0xe785a4,
+ /* e1 */ 0xe7bdb5, 0xe8b2b7, 0xe8b3a3, 0xe98281,
+ /* e5 */ 0xe9ad85, 0xe88488, 0xe8b28a, 0xe9998c,
+ /* e9 */ 0xe9a980, 0xe9baa5, 0xe5ad9f, 0xe6b093,
+ /* ed */ 0xe78c9b, 0xe79bb2, 0xe79b9f, 0xe8908c,
+ /* f1 */ 0xe586aa, 0xe8a693, 0xe5858d, 0xe58695,
+ /* f5 */ 0xe58b89, 0xe6a389, 0xe6b294, 0xe79c84,
+ /* f9 */ 0xe79ca0, 0xe7b6bf, 0xe7b7ac, 0xe99da2,
+ /* fd */ 0xe9bab5, 0xe6bb85,
+
+ /*** Two byte table, leaf: d9xx - offset 0x0428c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe89491, 0xe586a5, 0xe5908d, 0xe591bd,
+ /* a5 */ 0xe6988e, 0xe69a9d, 0xe6a4a7, 0xe6ba9f,
+ /* a9 */ 0xe79abf, 0xe79e91, 0xe88c97, 0xe89382,
+ /* ad */ 0xe89e9f, 0xe985a9, 0xe98a98, 0xe9b3b4,
+ /* b1 */ 0xe8a282, 0xe4beae, 0xe58692, 0xe58b9f,
+ /* b5 */ 0xe5a786, 0xe5b8bd, 0xe68595, 0xe691b8,
+ /* b9 */ 0xe691b9, 0xe69aae, 0xe69f90, 0xe6a8a1,
+ /* bd */ 0xe6af8d, 0xe6af9b, 0xe7899f, 0xe789a1,
+ /* c1 */ 0xe79181, 0xe79cb8, 0xe79f9b, 0xe88097,
+ /* c5 */ 0xe88abc, 0xe88c85, 0xe8ac80, 0xe8aca8,
+ /* c9 */ 0xe8b28c, 0xe69ca8, 0xe6b290, 0xe789a7,
+ /* cd */ 0xe79bae, 0xe79da6, 0xe7a986, 0xe9b6a9,
+ /* d1 */ 0xe6adbf, 0xe6b292, 0xe5a4a2, 0xe69ca6,
+ /* d5 */ 0xe89299, 0xe58daf, 0xe5a293, 0xe5a699,
+ /* d9 */ 0xe5bb9f, 0xe68f8f, 0xe698b4, 0xe69db3,
+ /* dd */ 0xe6b8ba, 0xe78cab, 0xe7ab97, 0xe88b97,
+ /* e1 */ 0xe98ca8, 0xe58b99, 0xe5b7ab, 0xe686ae,
+ /* e5 */ 0xe6878b, 0xe6888a, 0xe68b87, 0xe692ab,
+ /* e9 */ 0xe697a0, 0xe6a599, 0xe6ada6, 0xe6af8b,
+ /* ed */ 0xe784a1, 0xe78fb7, 0xe7959d, 0xe7b986,
+ /* f1 */ 0xe8889e, 0xe88c82, 0xe895aa, 0xe8aaa3,
+ /* f5 */ 0xe8b2bf, 0xe99ca7, 0xe9b5a1, 0xe5a2a8,
+ /* f9 */ 0xe9bb98, 0xe58091, 0xe5888e, 0xe590bb,
+ /* fd */ 0xe5958f, 0xe69687,
+
+ /*** Two byte table, leaf: daxx - offset 0x0434a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6b1b6, 0xe7b48a, 0xe7b48b, 0xe8819e,
+ /* a5 */ 0xe89a8a, 0xe99680, 0xe99baf, 0xe58bbf,
+ /* a9 */ 0xe6b295, 0xe789a9, 0xe591b3, 0xe5aa9a,
+ /* ad */ 0xe5b0be, 0xe5b58b, 0xe5bd8c, 0xe5beae,
+ /* b1 */ 0xe69caa, 0xe6a2b6, 0xe6a5a3, 0xe6b8bc,
+ /* b5 */ 0xe6b984, 0xe79c89, 0xe7b1b3, 0xe7be8e,
+ /* b9 */ 0xe89687, 0xe8ac8e, 0xe8bfb7, 0xe99da1,
+ /* bd */ 0xe9bbb4, 0xe5b2b7, 0xe682b6, 0xe6848d,
+ /* c1 */ 0xe686ab, 0xe6958f, 0xe697bb, 0xe697bc,
+ /* c5 */ 0xe6b091, 0xe6b3af, 0xe78e9f, 0xe78f89,
+ /* c9 */ 0xe7b7a1, 0xe99694, 0xe5af86, 0xe89c9c,
+ /* cd */ 0xe8ac90, 0xe5899d, 0xe58d9a, 0xe68b8d,
+ /* d1 */ 0xe6908f, 0xe692b2, 0xe69cb4, 0xe6a8b8,
+ /* d5 */ 0xe6b38a, 0xe78f80, 0xe7929e, 0xe7ae94,
+ /* d9 */ 0xe7b295, 0xe7b89b, 0xe8868a, 0xe888b6,
+ /* dd */ 0xe89684, 0xe8bfab, 0xe99bb9, 0xe9a781,
+ /* e1 */ 0xe4bcb4, 0xe58d8a, 0xe58f8d, 0xe58f9b,
+ /* e5 */ 0xe68b8c, 0xe690ac, 0xe69480, 0xe69691,
+ /* e9 */ 0xe6a783, 0xe6b3ae, 0xe6bd98, 0xe78fad,
+ /* ed */ 0xe79594, 0xe798a2, 0xe79ba4, 0xe79bbc,
+ /* f1 */ 0xe7a390, 0xe7a3bb, 0xe7a4ac, 0xe7b586,
+ /* f5 */ 0xe888ac, 0xe89fa0, 0xe8bf94, 0xe9a092,
+ /* f9 */ 0xe9a3af, 0xe58b83, 0xe68b94, 0xe692a5,
+ /* fd */ 0xe6b8a4, 0xe6bd91,
+
+ /*** Two byte table, leaf: dbxx - offset 0x04408 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe799bc, 0xe8b78b, 0xe986b1, 0xe989a2,
+ /* a5 */ 0xe9abae, 0xe9ad83, 0xe580a3, 0xe5828d,
+ /* a9 */ 0xe59d8a, 0xe5a6a8, 0xe5b0a8, 0xe5b987,
+ /* ad */ 0xe5bdb7, 0xe688bf, 0xe694be, 0xe696b9,
+ /* b1 */ 0xe69781, 0xe69889, 0xe69e8b, 0xe6a69c,
+ /* b5 */ 0xe6bb82, 0xe7a385, 0xe7b4a1, 0xe882aa,
+ /* b9 */ 0xe88680, 0xe888ab, 0xe88ab3, 0xe892a1,
+ /* bd */ 0xe89a8c, 0xe8a8aa, 0xe8ac97, 0xe982a6,
+ /* c1 */ 0xe998b2, 0xe9be90, 0xe5808d, 0xe4bfb3,
+ /* c5 */ 0xefa5a3, 0xe59fb9, 0xe5be98, 0xe68b9c,
+ /* c9 */ 0xe68e92, 0xe69daf, 0xe6b983, 0xe78499,
+ /* cd */ 0xe79b83, 0xe8838c, 0xe8839a, 0xe8a3b4,
+ /* d1 */ 0xe8a3b5, 0xe8a499, 0xe8b3a0, 0xe8bca9,
+ /* d5 */ 0xe9858d, 0xe999aa, 0xe4bcaf, 0xe4bdb0,
+ /* d9 */ 0xe5b89b, 0xe69f8f, 0xe6a0a2, 0xe799bd,
+ /* dd */ 0xe799be, 0xe9ad84, 0xe5b9a1, 0xe6a88a,
+ /* e1 */ 0xe785a9, 0xe78794, 0xe795aa, 0xefa5a4,
+ /* e5 */ 0xe7b981, 0xe89583, 0xe897a9, 0xe9a39c,
+ /* e9 */ 0xe4bc90, 0xe7ad8f, 0xe7bdb0, 0xe996a5,
+ /* ed */ 0xe587a1, 0xe5b886, 0xe6a2b5, 0xe6b0be,
+ /* f1 */ 0xe6b18e, 0xe6b39b, 0xe78aaf, 0xe7af84,
+ /* f5 */ 0xe88c83, 0xe6b395, 0xe790ba, 0xe583bb,
+ /* f9 */ 0xe58a88, 0xe5a381, 0xe69398, 0xe6aa97,
+ /* fd */ 0xe792a7, 0xe79996,
+
+ /*** Two byte table, leaf: dcxx - offset 0x044c6 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7a2a7, 0xe89897, 0xe997a2, 0xe99cb9,
+ /* a5 */ 0xefa5a5, 0xe58d9e, 0xe5bc81, 0xe8ae8a,
+ /* a9 */ 0xe8bea8, 0xe8beaf, 0xe9828a, 0xe588a5,
+ /* ad */ 0xe79ea5, 0xe9b189, 0xe9bc88, 0xe4b899,
+ /* b1 */ 0xe58082, 0xe585b5, 0xe5b19b, 0xe5b9b7,
+ /* b5 */ 0xe6989e, 0xe698ba, 0xe69f84, 0xe6a385,
+ /* b9 */ 0xe782b3, 0xe79481, 0xe79785, 0xe7a789,
+ /* bd */ 0xe7ab9d, 0xe8bca7, 0xe9a4a0, 0xe9a888,
+ /* c1 */ 0xe4bf9d, 0xe5a0a1, 0xe5a0b1, 0xe5afb6,
+ /* c5 */ 0xe699ae, 0xe6ada5, 0xe6b491, 0xe6b9ba,
+ /* c9 */ 0xe6bdbd, 0xe78fa4, 0xe794ab, 0xe88fa9,
+ /* cd */ 0xe8a39c, 0xe8a493, 0xe8ad9c, 0xe8bc94,
+ /* d1 */ 0xe4bc8f, 0xe58395, 0xe58c90, 0xe58d9c,
+ /* d5 */ 0xe5ae93, 0xe5bea9, 0xe69c8d, 0xe7a68f,
+ /* d9 */ 0xe885b9, 0xe88caf, 0xe89494, 0xe8a487,
+ /* dd */ 0xe8a686, 0xe8bcb9, 0xe8bcbb, 0xe9a6a5,
+ /* e1 */ 0xe9b092, 0xe69cac, 0xe4b9b6, 0xe4bfb8,
+ /* e5 */ 0xe5a589, 0xe5b081, 0xe5b3af, 0xe5b3b0,
+ /* e9 */ 0xe68da7, 0xe6a392, 0xe783bd, 0xe786a2,
+ /* ed */ 0xe790ab, 0xe7b8ab, 0xe893ac, 0xe89c82,
+ /* f1 */ 0xe980a2, 0xe98b92, 0xe9b3b3, 0xe4b88d,
+ /* f5 */ 0xe4bb98, 0xe4bfaf, 0xe58285, 0xe58996,
+ /* f9 */ 0xe589af, 0xe590a6, 0xe59290, 0xe59fa0,
+ /* fd */ 0xe5a4ab, 0xe5a9a6,
+
+ /*** Two byte table, leaf: ddxx - offset 0x04584 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe5ad9a, 0xe5adb5, 0xe5af8c, 0xe5ba9c,
+ /* a5 */ 0xefa5a6, 0xe689b6, 0xe695b7, 0xe696a7,
+ /* a9 */ 0xe6b5ae, 0xe6baa5, 0xe788b6, 0xe7aca6,
+ /* ad */ 0xe7b0bf, 0xe7bcb6, 0xe88590, 0xe88591,
+ /* b1 */ 0xe8869a, 0xe88980, 0xe88a99, 0xe88ea9,
+ /* b5 */ 0xe8a883, 0xe8b2a0, 0xe8b3a6, 0xe8b3bb,
+ /* b9 */ 0xe8b5b4, 0xe8b6ba, 0xe983a8, 0xe9879c,
+ /* bd */ 0xe9989c, 0xe99984, 0xe9a799, 0xe9b3a7,
+ /* c1 */ 0xe58c97, 0xe58886, 0xe590a9, 0xe599b4,
+ /* c5 */ 0xe5a2b3, 0xe5a594, 0xe5a5ae, 0xe5bfbf,
+ /* c9 */ 0xe686a4, 0xe689ae, 0xe69890, 0xe6b1be,
+ /* cd */ 0xe7849a, 0xe79b86, 0xe7b289, 0xe7b39e,
+ /* d1 */ 0xe7b49b, 0xe88aac, 0xe8b381, 0xe99bb0,
+ /* d5 */ 0xefa5a7, 0xe4bd9b, 0xe5bc97, 0xe5bdbf,
+ /* d9 */ 0xe68b82, 0xe5b4a9, 0xe69c8b, 0xe6a39a,
+ /* dd */ 0xe7a1bc, 0xe7b983, 0xe9b5ac, 0xe4b895,
+ /* e1 */ 0xe58299, 0xe58c95, 0xe58caa, 0xe58d91,
+ /* e5 */ 0xe5a683, 0xe5a9a2, 0xe5ba87, 0xe682b2,
+ /* e9 */ 0xe6868a, 0xe68989, 0xe689b9, 0xe69690,
+ /* ed */ 0xe69e87, 0xe6a6a7, 0xe6af94, 0xe6af96,
+ /* f1 */ 0xe6af97, 0xe6af98, 0xe6b2b8, 0xefa5a8,
+ /* f5 */ 0xe790b5, 0xe797ba, 0xe7a092, 0xe7a291,
+ /* f9 */ 0xe7a795, 0xe7a798, 0xe7b283, 0xe7b78b,
+ /* fd */ 0xe7bfa1, 0xe882a5,
+
+ /*** Two byte table, leaf: dexx - offset 0x04642 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe884be, 0xe88782, 0xe88fb2, 0xe89c9a,
+ /* a5 */ 0xe8a3a8, 0xe8aab9, 0xe8adac, 0xe8b2bb,
+ /* a9 */ 0xe98499, 0xe99d9e, 0xe9a39b, 0xe9bcbb,
+ /* ad */ 0xe59aac, 0xe5acaa, 0xe5bdac, 0xe6968c,
+ /* b1 */ 0xe6aab3, 0xe6aeaf, 0xe6b59c, 0xe6bfb1,
+ /* b5 */ 0xe78095, 0xe7899d, 0xe78ead, 0xe8b2a7,
+ /* b9 */ 0xe8b393, 0xe9a0bb, 0xe68691, 0xe6b0b7,
+ /* bd */ 0xe88198, 0xe9a881, 0xe4b98d, 0xe4ba8b,
+ /* c1 */ 0xe4ba9b, 0xe4bb95, 0xe4bcba, 0xe4bcbc,
+ /* c5 */ 0xe4bdbf, 0xe4bf9f, 0xe583bf, 0xe58fb2,
+ /* c9 */ 0xe58fb8, 0xe59486, 0xe597a3, 0xe59b9b,
+ /* cd */ 0xe5a3ab, 0xe5a5a2, 0xe5a891, 0xe5afab,
+ /* d1 */ 0xe5afba, 0xe5b084, 0xe5b7b3, 0xe5b8ab,
+ /* d5 */ 0xe5be99, 0xe6809d, 0xe68da8, 0xe6969c,
+ /* d9 */ 0xe696af, 0xe69fb6, 0xe69fbb, 0xe6a2ad,
+ /* dd */ 0xe6adbb, 0xe6b299, 0xe6b397, 0xe6b8a3,
+ /* e1 */ 0xe78089, 0xe78d85, 0xe7a082, 0xe7a4be,
+ /* e5 */ 0xe7a580, 0xe7a5a0, 0xe7a781, 0xe7afa9,
+ /* e9 */ 0xe7b497, 0xe7b5b2, 0xe88286, 0xe8888d,
+ /* ed */ 0xe88e8e, 0xe89391, 0xe89b87, 0xe8a39f,
+ /* f1 */ 0xe8a990, 0xe8a99e, 0xe8ac9d, 0xe8b39c,
+ /* f5 */ 0xe8b5a6, 0xe8bead, 0xe982aa, 0xe9a3bc,
+ /* f9 */ 0xe9a79f, 0xe9ba9d, 0xe5898a, 0xefa5a9,
+ /* fd */ 0xe69c94, 0xefa5aa,
+
+ /*** Two byte table, leaf: dfxx - offset 0x04700 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe58298, 0xe588aa, 0xe5b1b1, 0xe695a3,
+ /* a5 */ 0xe6b195, 0xe78f8a, 0xe794a3, 0xe7969d,
+ /* a9 */ 0xe7ae97, 0xe8929c, 0xe985b8, 0xe99cb0,
+ /* ad */ 0xe4b9b7, 0xe69292, 0xe6aeba, 0xe7859e,
+ /* b1 */ 0xe896a9, 0xe4b889, 0xefa5ab, 0xe69d89,
+ /* b5 */ 0xe6a3ae, 0xe6b897, 0xe88a9f, 0xe89498,
+ /* b9 */ 0xe8a1ab, 0xe68fb7, 0xe6be81, 0xe98892,
+ /* bd */ 0xe9a2af, 0xe4b88a, 0xe582b7, 0xe5838f,
+ /* c1 */ 0xe5849f, 0xe59586, 0xe596aa, 0xe59897,
+ /* c5 */ 0xe5ad80, 0xe5b099, 0xe5b3a0, 0xe5b8b8,
+ /* c9 */ 0xe5ba8a, 0xe5baa0, 0xe5bb82, 0xe683b3,
+ /* cd */ 0xe6a191, 0xe6a9a1, 0xe6b998, 0xe788bd,
+ /* d1 */ 0xe78980, 0xe78b80, 0xe79bb8, 0xe7a5a5,
+ /* d5 */ 0xe7aeb1, 0xe7bf94, 0xe8a3b3, 0xe8a7b4,
+ /* d9 */ 0xe8a9b3, 0xe8b1a1, 0xe8b39e, 0xe99c9c,
+ /* dd */ 0xe5a19e, 0xe792bd, 0xe8b3bd, 0xe59787,
+ /* e1 */ 0xefa5ac, 0xe7a9a1, 0xe7b4a2, 0xe889b2,
+ /* e5 */ 0xe789b2, 0xe7949f, 0xe794a5, 0xefa5ad,
+ /* e9 */ 0xe7ac99, 0xe5a285, 0xe5a3bb, 0xe5b6bc,
+ /* ed */ 0xe5ba8f, 0xe5bab6, 0xe5be90, 0xe68195,
+ /* f1 */ 0xe68a92, 0xe68dbf, 0xe6958d, 0xe69a91,
+ /* f5 */ 0xe69b99, 0xe69bb8, 0xe6a096, 0xe6a3b2,
+ /* f9 */ 0xe78a80, 0xe7919e, 0xe7adae, 0xe7b5ae,
+ /* fd */ 0xe7b796, 0xe7bdb2,
+
+ /*** Two byte table, leaf: e0xx - offset 0x047be ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe883a5, 0xe88892, 0xe896af, 0xe8a5bf,
+ /* a5 */ 0xe8aa93, 0xe9809d, 0xe98ba4, 0xe9bb8d,
+ /* a9 */ 0xe9bca0, 0xe5a495, 0xe5a5ad, 0xe5b8ad,
+ /* ad */ 0xe6839c, 0xe69894, 0xe699b3, 0xe69e90,
+ /* b1 */ 0xe6b190, 0xe6b785, 0xe6bd9f, 0xe79fb3,
+ /* b5 */ 0xe7a2a9, 0xe89386, 0xe9878b, 0xe98cab,
+ /* b9 */ 0xe4bb99, 0xe5838a, 0xe58588, 0xe59684,
+ /* bd */ 0xe5ac8b, 0xe5aea3, 0xe68987, 0xe695be,
+ /* c1 */ 0xe6978b, 0xe6b8b2, 0xe785bd, 0xe79081,
+ /* c5 */ 0xe79184, 0xe79287, 0xe792bf, 0xe799ac,
+ /* c9 */ 0xe7a6aa, 0xe7b79a, 0xe7b995, 0xe7bea8,
+ /* cd */ 0xe885ba, 0xe886b3, 0xe888b9, 0xe8989a,
+ /* d1 */ 0xe89fac, 0xe8a9b5, 0xe8b7a3, 0xe981b8,
+ /* d5 */ 0xe98a91, 0xe990a5, 0xe9a58d, 0xe9aeae,
+ /* d9 */ 0xe58da8, 0xe5b191, 0xe6a594, 0xe6b384,
+ /* dd */ 0xe6b4a9, 0xe6b8ab, 0xe8888c, 0xe8969b,
+ /* e1 */ 0xe8a4bb, 0xe8a8ad, 0xe8aaaa, 0xe99baa,
+ /* e5 */ 0xe9bda7, 0xe589a1, 0xe69ab9, 0xe6aeb2,
+ /* e9 */ 0xe7ba96, 0xe89fbe, 0xe8b48d, 0xe99683,
+ /* ed */ 0xe9999d, 0xe6949d, 0xe6b689, 0xe787ae,
+ /* f1 */ 0xefa5ae, 0xe59f8e, 0xe5a793, 0xe5aeac,
+ /* f5 */ 0xe680a7, 0xe683ba, 0xe68890, 0xe6989f,
+ /* f9 */ 0xe6999f, 0xe78ca9, 0xe78fb9, 0xe79b9b,
+ /* fd */ 0xe79c81, 0xe7adac,
+
+ /*** Two byte table, leaf: e1xx - offset 0x0487c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe88196, 0xe881b2, 0xe885a5, 0xe8aaa0,
+ /* a5 */ 0xe98692, 0xe4b896, 0xe58ba2, 0xe6adb2,
+ /* a9 */ 0xe6b497, 0xe7a885, 0xe7acb9, 0xe7b4b0,
+ /* ad */ 0xefa5af, 0xe8b2b0, 0xe58fac, 0xe598af,
+ /* b1 */ 0xe5a191, 0xe5aeb5, 0xe5b08f, 0xe5b091,
+ /* b5 */ 0xe5b7a2, 0xe68980, 0xe68e83, 0xe69094,
+ /* b9 */ 0xe698ad, 0xe6a2b3, 0xe6b2bc, 0xe6b688,
+ /* bd */ 0xe6baaf, 0xe7809f, 0xe782a4, 0xe78792,
+ /* c1 */ 0xe794a6, 0xe7968f, 0xe7968e, 0xe79899,
+ /* c5 */ 0xe7ac91, 0xe7afa0, 0xe7b0ab, 0xe7b4a0,
+ /* c9 */ 0xe7b4b9, 0xe894ac, 0xe895ad, 0xe89887,
+ /* cd */ 0xe8a8b4, 0xe9808d, 0xe981a1, 0xe982b5,
+ /* d1 */ 0xe98ab7, 0xe99fb6, 0xe9a8b7, 0xe4bf97,
+ /* d5 */ 0xe5b1ac, 0xe69d9f, 0xe6b691, 0xe7b29f,
+ /* d9 */ 0xe7ba8c, 0xe8ac96, 0xe8b496, 0xe9809f,
+ /* dd */ 0xe5adab, 0xe5b7bd, 0xe6908d, 0xe89380,
+ /* e1 */ 0xe9819c, 0xe9a3a1, 0xe78e87, 0xe5ae8b,
+ /* e5 */ 0xe6829a, 0xe69dbe, 0xe6b79e, 0xe8a89f,
+ /* e9 */ 0xe8aaa6, 0xe98081, 0xe9a08c, 0xe588b7,
+ /* ed */ 0xefa5b0, 0xe78191, 0xe7a28e, 0xe98e96,
+ /* f1 */ 0xe8a1b0, 0xe98797, 0xe4bfae, 0xe58f97,
+ /* f5 */ 0xe597bd, 0xe59b9a, 0xe59e82, 0xe5a3bd,
+ /* f9 */ 0xe5ab82, 0xe5ae88, 0xe5b2ab, 0xe5b380,
+ /* fd */ 0xe5b8a5, 0xe68481,
+
+ /*** Two byte table, leaf: e2xx - offset 0x0493a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6888d, 0xe6898b, 0xe68e88, 0xe6909c,
+ /* a5 */ 0xe694b6, 0xe695b8, 0xe6a8b9, 0xe6ae8a,
+ /* a9 */ 0xe6b0b4, 0xe6b499, 0xe6bcb1, 0xe787a7,
+ /* ad */ 0xe78ba9, 0xe78db8, 0xe79087, 0xe792b2,
+ /* b1 */ 0xe798a6, 0xe79da1, 0xe7a780, 0xe7a997,
+ /* b5 */ 0xe7abaa, 0xe7b2b9, 0xe7b68f, 0xe7b6ac,
+ /* b9 */ 0xe7b9a1, 0xe7be9e, 0xe884a9, 0xe88cb1,
+ /* bd */ 0xe89290, 0xe8939a, 0xe897aa, 0xe8a296,
+ /* c1 */ 0xe8aab0, 0xe8ae90, 0xe8bcb8, 0xe98182,
+ /* c5 */ 0xe98283, 0xe985ac, 0xe98a96, 0xe98ab9,
+ /* c9 */ 0xe99a8b, 0xe99aa7, 0xe99aa8, 0xe99b96,
+ /* cd */ 0xe99c80, 0xe9a088, 0xe9a696, 0xe9ab93,
+ /* d1 */ 0xe9ac9a, 0xe58f94, 0xe5a1be, 0xe5a499,
+ /* d5 */ 0xe5adb0, 0xe5aebf, 0xe6b791, 0xe6bd9a,
+ /* d9 */ 0xe7869f, 0xe790a1, 0xe792b9, 0xe88285,
+ /* dd */ 0xe88fbd, 0xe5b7a1, 0xe5be87, 0xe5beaa,
+ /* e1 */ 0xe68182, 0xe697ac, 0xe6a092, 0xe6a5af,
+ /* e5 */ 0xe6a993, 0xe6ae89, 0xe6b4b5, 0xe6b7b3,
+ /* e9 */ 0xe78fa3, 0xe79bbe, 0xe79eac, 0xe7ad8d,
+ /* ed */ 0xe7b494, 0xe884a3, 0xe8889c, 0xe88d80,
+ /* f1 */ 0xe893b4, 0xe895a3, 0xe8a9a2, 0xe8ab84,
+ /* f5 */ 0xe98687, 0xe98c9e, 0xe9a086, 0xe9a6b4,
+ /* f9 */ 0xe6888c, 0xe8a193, 0xe8bfb0, 0xe989a5,
+ /* fd */ 0xe5b487, 0xe5b4a7,
+
+ /*** Two byte table, leaf: e3xx - offset 0x049f8 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe5b5a9, 0xe7919f, 0xe8869d, 0xe89da8,
+ /* a5 */ 0xe6bf95, 0xe68bbe, 0xe7bf92, 0xe8a4b6,
+ /* a9 */ 0xe8a5b2, 0xe4b89e, 0xe4b998, 0xe583a7,
+ /* ad */ 0xe58b9d, 0xe58d87, 0xe689bf, 0xe69887,
+ /* b1 */ 0xe7b9a9, 0xe8a085, 0xe9999e, 0xe4be8d,
+ /* b5 */ 0xe58c99, 0xe598b6, 0xe5a78b, 0xe5aaa4,
+ /* b9 */ 0xe5b0b8, 0xe5b18e, 0xe5b18d, 0xe5b882,
+ /* bd */ 0xe5bc91, 0xe68183, 0xe696bd, 0xe698af,
+ /* c1 */ 0xe69982, 0xe69ebe, 0xe69fb4, 0xe78c9c,
+ /* c5 */ 0xe79fa2, 0xe7a4ba, 0xe7bf85, 0xe89294,
+ /* c9 */ 0xe8938d, 0xe8a696, 0xe8a9a6, 0xe8a9a9,
+ /* cd */ 0xe8aba1, 0xe8b195, 0xe8b1ba, 0xe59fb4,
+ /* d1 */ 0xe5af94, 0xe5bc8f, 0xe681af, 0xe68bad,
+ /* d5 */ 0xe6a48d, 0xe6ae96, 0xe6b99c, 0xe78684,
+ /* d9 */ 0xe7af92, 0xe89d95, 0xe8ad98, 0xe8bbbe,
+ /* dd */ 0xe9a39f, 0xe9a3be, 0xe4bcb8, 0xe4be81,
+ /* e1 */ 0xe4bfa1, 0xe591bb, 0xe5a8a0, 0xe5aeb8,
+ /* e5 */ 0xe684bc, 0xe696b0, 0xe699a8, 0xe787bc,
+ /* e9 */ 0xe794b3, 0xe7a59e, 0xe7b4b3, 0xe8858e,
+ /* ed */ 0xe887a3, 0xe88e98, 0xe896aa, 0xe8978e,
+ /* f1 */ 0xe89c83, 0xe8a88a, 0xe8baab, 0xe8be9b,
+ /* f5 */ 0xefa5b1, 0xe8bf85, 0xe5a4b1, 0xe5aea4,
+ /* f9 */ 0xe5afa6, 0xe68289, 0xe5afa9, 0xe5b08b,
+ /* fd */ 0xe5bf83, 0xe6b281,
+
+ /*** Two byte table, leaf: e4xx - offset 0x04ab6 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xefa5b2, 0xe6b7b1, 0xe7808b, 0xe7949a,
+ /* a5 */ 0xe88aaf, 0xe8abb6, 0xe4bb80, 0xe58d81,
+ /* a9 */ 0xefa5b3, 0xe99b99, 0xe6b08f, 0xe4ba9e,
+ /* ad */ 0xe4bf84, 0xe58592, 0xe5959e, 0xe5a8a5,
+ /* b1 */ 0xe5b3a8, 0xe68891, 0xe78999, 0xe88abd,
+ /* b5 */ 0xe88eaa, 0xe89bbe, 0xe8a199, 0xe8a89d,
+ /* b9 */ 0xe998bf, 0xe99b85, 0xe9a493, 0xe9b489,
+ /* bd */ 0xe9b59d, 0xe5a08a, 0xe5b2b3, 0xe5b6bd,
+ /* c1 */ 0xe5b984, 0xe683a1, 0xe68495, 0xe68fa1,
+ /* c5 */ 0xe6a882, 0xe6b8a5, 0xe98482, 0xe98d94,
+ /* c9 */ 0xe9a18e, 0xe9b090, 0xe9bdb7, 0xe5ae89,
+ /* cd */ 0xe5b2b8, 0xe68c89, 0xe6998f, 0xe6a188,
+ /* d1 */ 0xe79cbc, 0xe99b81, 0xe99e8d, 0xe9a194,
+ /* d5 */ 0xe9ae9f, 0xe696a1, 0xe8ac81, 0xe8bb8b,
+ /* d9 */ 0xe996bc, 0xe594b5, 0xe5b2a9, 0xe5b796,
+ /* dd */ 0xe5bab5, 0xe69a97, 0xe7998c, 0xe88fb4,
+ /* e1 */ 0xe99787, 0xe5a393, 0xe68abc, 0xe78b8e,
+ /* e5 */ 0xe9b4a8, 0xe4bbb0, 0xe5a4ae, 0xe6808f,
+ /* e9 */ 0xe698bb, 0xe6ae83, 0xe7a7a7, 0xe9b4a6,
+ /* ed */ 0xe58e93, 0xe59380, 0xe59f83, 0xe5b496,
+ /* f1 */ 0xe6849b, 0xe69b96, 0xe6b6af, 0xe7a28d,
+ /* f5 */ 0xe889be, 0xe99a98, 0xe99d84, 0xe58e84,
+ /* f9 */ 0xe689bc, 0xe68e96, 0xe6b6b2, 0xe7b88a,
+ /* fd */ 0xe8858b, 0xe9a18d,
+
+ /*** Two byte table, leaf: e5xx - offset 0x04b74 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6abbb, 0xe7bd8c, 0xe9b6af, 0xe9b89a,
+ /* a5 */ 0xe4b99f, 0xe580bb, 0xe586b6, 0xe5a49c,
+ /* a9 */ 0xe683b9, 0xe68fb6, 0xe6a4b0, 0xe788ba,
+ /* ad */ 0xe880b6, 0xefa5b4, 0xe9878e, 0xe5bcb1,
+ /* b1 */ 0xefa5b5, 0xefa5b6, 0xe7b484, 0xe88ba5,
+ /* b5 */ 0xe891af, 0xe892bb, 0xe897a5, 0xe8ba8d,
+ /* b9 */ 0xefa5b7, 0xe4bdaf, 0xefa5b8, 0xefa5b9,
+ /* bd */ 0xe5a3a4, 0xe5ad83, 0xe68199, 0xe68f9a,
+ /* c1 */ 0xe69498, 0xe695ad, 0xe69a98, 0xefa5ba,
+ /* c5 */ 0xe6a58a, 0xe6a8a3, 0xe6b48b, 0xe78081,
+ /* c9 */ 0xe785ac, 0xe79792, 0xe7988d, 0xe7a6b3,
+ /* cd */ 0xe7a9b0, 0xefa5bb, 0xe7be8a, 0xefa5bc,
+ /* d1 */ 0xe8a584, 0xefa5bd, 0xe8ae93, 0xe98780,
+ /* d5 */ 0xe999bd, 0xefa5be, 0xe9a48a, 0xe59c84,
+ /* d9 */ 0xe5bea1, 0xe696bc, 0xe6bc81, 0xe79880,
+ /* dd */ 0xe7a6a6, 0xe8aa9e, 0xe9a6ad, 0xe9ad9a,
+ /* e1 */ 0xe9bdac, 0xe58484, 0xe686b6, 0xe68a91,
+ /* e5 */ 0xe6aa8d, 0xe88786, 0xe58183, 0xe5a0b0,
+ /* e9 */ 0xe5bda6, 0xe78489, 0xe8a880, 0xe8abba,
+ /* ed */ 0xe5adbc, 0xe89896, 0xe4bfba, 0xe584bc,
+ /* f1 */ 0xe59ab4, 0xe5a584, 0xe68ea9, 0xe6b7b9,
+ /* f5 */ 0xe5b6aa, 0xe6a5ad, 0xe58686, 0xe4ba88,
+ /* f9 */ 0xe4bd99, 0xefa5bf, 0xefa680, 0xefa681,
+ /* fd */ 0xe5a682, 0xefa682,
+
+ /*** Two byte table, leaf: e6xx - offset 0x04c32 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xefa683, 0xe6ad9f, 0xe6b19d, 0xefa684,
+ /* a5 */ 0xe792b5, 0xe7a496, 0xefa685, 0xe88887,
+ /* a9 */ 0xe88985, 0xe88cb9, 0xe8bcbf, 0xe8bd9d,
+ /* ad */ 0xefa686, 0xe9a498, 0xefa687, 0xefa688,
+ /* b1 */ 0xefa689, 0xe4baa6, 0xefa68a, 0xe59f9f,
+ /* b5 */ 0xe5bdb9, 0xe69893, 0xefa68b, 0xefa68c,
+ /* b9 */ 0xe796ab, 0xe7b9b9, 0xe8adaf, 0xefa68d,
+ /* bd */ 0xe98086, 0xe9a99b, 0xe59aa5, 0xe5a0a7,
+ /* c1 */ 0xe5a7b8, 0xe5a89f, 0xe5aeb4, 0xefa68e,
+ /* c5 */ 0xe5bbb6, 0xefa68f, 0xefa690, 0xe68d90,
+ /* c9 */ 0xe68cbb, 0xefa691, 0xe6a4bd, 0xe6b287,
+ /* cd */ 0xe6b2bf, 0xe6b68e, 0xe6b693, 0xe6b7b5,
+ /* d1 */ 0xe6bc94, 0xefa692, 0xe7839f, 0xe784b6,
+ /* d5 */ 0xe78599, 0xefa693, 0xe78783, 0xe78795,
+ /* d9 */ 0xefa694, 0xe7a18f, 0xe7a1af, 0xefa695,
+ /* dd */ 0xe7adb5, 0xe7b7a3, 0xefa696, 0xe7b8af,
+ /* e1 */ 0xefa697, 0xe8a18d, 0xe8bb9f, 0xefa698,
+ /* e5 */ 0xefa699, 0xefa69a, 0xe9899b, 0xefa69b,
+ /* e9 */ 0xe9b3b6, 0xefa69c, 0xefa69d, 0xefa69e,
+ /* ed */ 0xe68285, 0xe6b685, 0xefa69f, 0xe786b1,
+ /* f1 */ 0xefa6a0, 0xefa6a1, 0xe996b1, 0xe58ead,
+ /* f5 */ 0xefa6a2, 0xefa6a3, 0xefa6a4, 0xe69f93,
+ /* f9 */ 0xefa6a5, 0xe7828e, 0xe784b0, 0xe790b0,
+ /* fd */ 0xe889b6, 0xe88b92,
+
+ /*** Two byte table, leaf: e7xx - offset 0x04cf0 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xefa6a6, 0xe996bb, 0xe9aba5, 0xe9b9bd,
+ /* a5 */ 0xe69b84, 0xefa6a7, 0xe78781, 0xe89189,
+ /* a9 */ 0xefa6a8, 0xefa6a9, 0xe5a18b, 0xefa6aa,
+ /* ad */ 0xefa6ab, 0xe5b6b8, 0xe5bdb1, 0xefa6ac,
+ /* b1 */ 0xe698a0, 0xe69a8e, 0xe6a5b9, 0xe6a6ae,
+ /* b5 */ 0xe6b0b8, 0xe6b3b3, 0xe6b8b6, 0xe6bd81,
+ /* b9 */ 0xe6bf9a, 0xe7809b, 0xe780af, 0xe78590,
+ /* bd */ 0xe7879f, 0xe78db0, 0xefa6ad, 0xe7919b,
+ /* c1 */ 0xefa6ae, 0xe79394, 0xe79b88, 0xe7a98e,
+ /* c5 */ 0xe7ba93, 0xefa6af, 0xefa6b0, 0xe88bb1,
+ /* c9 */ 0xe8a9a0, 0xe8bf8e, 0xefa6b1, 0xe98d88,
+ /* cd */ 0xefa6b2, 0xe99c99, 0xefa6b3, 0xefa6b4,
+ /* d1 */ 0xe4b982, 0xe580aa, 0xefa6b5, 0xe58888,
+ /* d5 */ 0xe58fa1, 0xe69bb3, 0xe6b1ad, 0xe6bf8a,
+ /* d9 */ 0xe78c8a, 0xe79dbf, 0xe7a9a2, 0xe88aae,
+ /* dd */ 0xe8979d, 0xe89882, 0xefa6b6, 0xe8a394,
+ /* e1 */ 0xe8a9a3, 0xe8adbd, 0xe8b1ab, 0xefa6b7,
+ /* e5 */ 0xe98ab3, 0xefa6b8, 0xe99c93, 0xe9a090,
+ /* e9 */ 0xe4ba94, 0xe4bc8d, 0xe4bf89, 0xe582b2,
+ /* ed */ 0xe58d88, 0xe590be, 0xe590b3, 0xe5979a,
+ /* f1 */ 0xe5a1a2, 0xe5a2ba, 0xe5a5a7, 0xe5a89b,
+ /* f5 */ 0xe5afa4, 0xe6829f, 0xefa6b9, 0xe6878a,
+ /* f9 */ 0xe69596, 0xe697bf, 0xe699a4, 0xe6a2a7,
+ /* fd */ 0xe6b19a, 0xe6beb3,
+
+ /*** Two byte table, leaf: e8xx - offset 0x04dae ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7838f, 0xe786ac, 0xe78d92, 0xe7adbd,
+ /* a5 */ 0xe89c88, 0xe8aaa4, 0xe9b0b2, 0xe9bc87,
+ /* a9 */ 0xe5b18b, 0xe6b283, 0xe78d84, 0xe78e89,
+ /* ad */ 0xe988ba, 0xe6baab, 0xe791a5, 0xe7989f,
+ /* b1 */ 0xe7a9a9, 0xe7b895, 0xe8988a, 0xe58580,
+ /* b5 */ 0xe5a385, 0xe69381, 0xe793ae, 0xe79495,
+ /* b9 */ 0xe799b0, 0xe7bf81, 0xe98295, 0xe99b8d,
+ /* bd */ 0xe9a594, 0xe6b8a6, 0xe793a6, 0xe7aaa9,
+ /* c1 */ 0xe7aaaa, 0xe887a5, 0xe89b99, 0xe89db8,
+ /* c5 */ 0xe8a89b, 0xe5a989, 0xe5ae8c, 0xe5ae9b,
+ /* c9 */ 0xe6a2a1, 0xe6a480, 0xe6b5a3, 0xe78ea9,
+ /* cd */ 0xe79093, 0xe790ac, 0xe7a297, 0xe7b7a9,
+ /* d1 */ 0xe7bfab, 0xe88498, 0xe88595, 0xe88e9e,
+ /* d5 */ 0xe8b18c, 0xe998ae, 0xe9a091, 0xe69bb0,
+ /* d9 */ 0xe5be80, 0xe697ba, 0xe69e89, 0xe6b1aa,
+ /* dd */ 0xe78e8b, 0xe580ad, 0xe5a883, 0xe6adaa,
+ /* e1 */ 0xe79fae, 0xe5a496, 0xe5b5ac, 0xe5b78d,
+ /* e5 */ 0xe78ca5, 0xe7958f, 0xefa6ba, 0xefa6bb,
+ /* e9 */ 0xe583a5, 0xe587b9, 0xe5a0af, 0xe5a4ad,
+ /* ed */ 0xe5a696, 0xe5a79a, 0xe5afa5, 0xefa6bc,
+ /* f1 */ 0xefa6bd, 0xe5b6a2, 0xe68b97, 0xe69096,
+ /* f5 */ 0xe69293, 0xe693be, 0xefa6be, 0xe69b9c,
+ /* f9 */ 0xefa6bf, 0xe6a988, 0xefa780, 0xe787bf,
+ /* fd */ 0xe791a4, 0xefa781,
+
+ /*** Two byte table, leaf: e9xx - offset 0x04e6c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7aa88, 0xe7aaaf, 0xe7b987, 0xe7b99e,
+ /* a5 */ 0xe88080, 0xe885b0, 0xefa782, 0xe89faf,
+ /* a9 */ 0xe8a681, 0xe8aca0, 0xe98199, 0xefa783,
+ /* ad */ 0xe98280, 0xe9a592, 0xe685be, 0xe6acb2,
+ /* b1 */ 0xe6b5b4, 0xe7b89f, 0xe8a4a5, 0xe8beb1,
+ /* b5 */ 0xe4bf91, 0xe582ad, 0xe58697, 0xe58b87,
+ /* b9 */ 0xe59f87, 0xe5a289, 0xe5aeb9, 0xe5bab8,
+ /* bd */ 0xe68582, 0xe6a695, 0xe6b68c, 0xe6b9a7,
+ /* c1 */ 0xe6bab6, 0xe78694, 0xe791a2, 0xe794a8,
+ /* c5 */ 0xe794ac, 0xe881b3, 0xe88cb8, 0xe89389,
+ /* c9 */ 0xe8b88a, 0xe98e94, 0xe98f9e, 0xefa784,
+ /* cd */ 0xe4ba8e, 0xe4bd91, 0xe581b6, 0xe584aa,
+ /* d1 */ 0xe58f88, 0xe58f8b, 0xe58fb3, 0xe5ae87,
+ /* d5 */ 0xe5af93, 0xe5b0a4, 0xe6849a, 0xe68682,
+ /* d9 */ 0xe697b4, 0xe7899b, 0xe78e97, 0xe79180,
+ /* dd */ 0xe79b82, 0xe7a590, 0xe7a691, 0xe7a6b9,
+ /* e1 */ 0xe7b486, 0xe7bebd, 0xe88a8b, 0xe89795,
+ /* e5 */ 0xe8999e, 0xe8bf82, 0xe98187, 0xe983b5,
+ /* e9 */ 0xe987aa, 0xe99a85, 0xe99ba8, 0xe99ba9,
+ /* ed */ 0xe58b96, 0xe5bda7, 0xe697ad, 0xe698b1,
+ /* f1 */ 0xe6a0af, 0xe7859c, 0xe7a8b6, 0xe98381,
+ /* f5 */ 0xe9a08a, 0xe4ba91, 0xefa785, 0xe6a992,
+ /* f9 */ 0xe6ae9e, 0xe6be90, 0xe78689, 0xe88098,
+ /* fd */ 0xe88ab8, 0xe89593,
+
+ /*** Two byte table, leaf: eaxx - offset 0x04f2a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe9818b, 0xe99a95, 0xe99bb2, 0xe99fbb,
+ /* a5 */ 0xe8949a, 0xe9acb1, 0xe4ba90, 0xe7868a,
+ /* a9 */ 0xe99b84, 0xe58583, 0xe58e9f, 0xe593a1,
+ /* ad */ 0xe59c93, 0xe59c92, 0xe59ea3, 0xe5aa9b,
+ /* b1 */ 0xe5ab84, 0xe5af83, 0xe680a8, 0xe684bf,
+ /* b5 */ 0xe68fb4, 0xe6b285, 0xe6b4b9, 0xe6b9b2,
+ /* b9 */ 0xe6ba90, 0xe788b0, 0xe78cbf, 0xe79197,
+ /* bd */ 0xe88b91, 0xe8a281, 0xe8bd85, 0xe981a0,
+ /* c1 */ 0xefa786, 0xe999a2, 0xe9a198, 0xe9b49b,
+ /* c5 */ 0xe69c88, 0xe8b68a, 0xe9899e, 0xe4bd8d,
+ /* c9 */ 0xe58189, 0xe5839e, 0xe58db1, 0xe59c8d,
+ /* cd */ 0xe5a794, 0xe5a881, 0xe5b089, 0xe685b0,
+ /* d1 */ 0xe69a90, 0xe6b8ad, 0xe788b2, 0xe7918b,
+ /* d5 */ 0xe7b7af, 0xe88383, 0xe8908e, 0xe891a6,
+ /* d9 */ 0xe894bf, 0xe89d9f, 0xe8a19b, 0xe8a498,
+ /* dd */ 0xe8ac82, 0xe98195, 0xe99f8b, 0xe9ad8f,
+ /* e1 */ 0xe4b9b3, 0xe4be91, 0xe58492, 0xe585aa,
+ /* e5 */ 0xefa787, 0xe594af, 0xe596a9, 0xe5adba,
+ /* e9 */ 0xe5aea5, 0xe5b9bc, 0xe5b9bd, 0xe5babe,
+ /* ed */ 0xe682a0, 0xe6839f, 0xe68488, 0xe68489,
+ /* f1 */ 0xe68f84, 0xe694b8, 0xe69c89, 0xefa788,
+ /* f5 */ 0xe69f94, 0xe69f9a, 0xefa789, 0xe6a5a1,
+ /* f9 */ 0xe6a5a2, 0xe6b2b9, 0xe6b4a7, 0xefa78a,
+ /* fd */ 0xe6b8b8, 0xefa78b,
+
+ /*** Two byte table, leaf: ebxx - offset 0x04fe8 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6bfa1, 0xe78cb6, 0xe78cb7, 0xefa78c,
+ /* a5 */ 0xe7919c, 0xe794b1, 0xefa78d, 0xe79992,
+ /* a9 */ 0xefa78e, 0xefa78f, 0xe7b6ad, 0xe887be,
+ /* ad */ 0xe890b8, 0xe8a395, 0xe8aa98, 0xe8ab9b,
+ /* b1 */ 0xe8abad, 0xe8b8b0, 0xe8b982, 0xe9818a,
+ /* b5 */ 0xe980be, 0xe981ba, 0xe98589, 0xe98789,
+ /* b9 */ 0xe98dae, 0xefa790, 0xefa791, 0xe5a089,
+ /* bd */ 0xefa792, 0xe6af93, 0xe88289, 0xe882b2,
+ /* c1 */ 0xefa793, 0xefa794, 0xe58581, 0xe5a5ab,
+ /* c5 */ 0xe5b0b9, 0xefa795, 0xefa796, 0xe6bda4,
+ /* c9 */ 0xe78ea7, 0xe883a4, 0xe8b487, 0xefa797,
+ /* cd */ 0xe98897, 0xe9968f, 0xefa798, 0xefa799,
+ /* d1 */ 0xefa79a, 0xefa79b, 0xe881bf, 0xe6888e,
+ /* d5 */ 0xe7809c, 0xe7b5a8, 0xe89e8d, 0xefa79c,
+ /* d9 */ 0xe59ea0, 0xe681a9, 0xe68587, 0xe6aeb7,
+ /* dd */ 0xe8aabe, 0xe98a80, 0xe99ab1, 0xe4b999,
+ /* e1 */ 0xe5909f, 0xe6b7ab, 0xe894ad, 0xe999b0,
+ /* e5 */ 0xe99fb3, 0xe9a3ae, 0xe68f96, 0xe6b3a3,
+ /* e9 */ 0xe98291, 0xe5879d, 0xe68789, 0xe886ba,
+ /* ed */ 0xe9b7b9, 0xe4be9d, 0xe5809a, 0xe58480,
+ /* f1 */ 0xe5ae9c, 0xe6848f, 0xe687bf, 0xe693ac,
+ /* f5 */ 0xe6a485, 0xe6af85, 0xe79691, 0xe79fa3,
+ /* f9 */ 0xe7bea9, 0xe889a4, 0xe8968f, 0xe89fbb,
+ /* fd */ 0xe8a1a3, 0xe8aabc,
+
+ /*** Two byte table, leaf: ecxx - offset 0x050a6 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe8adb0, 0xe986ab, 0xe4ba8c, 0xe4bba5,
+ /* a5 */ 0xe4bc8a, 0xefa79d, 0xefa79e, 0xe5a4b7,
+ /* a9 */ 0xe5a7a8, 0xefa79f, 0xe5b7b2, 0xe5bc9b,
+ /* ad */ 0xe5bd9b, 0xe680a1, 0xefa7a0, 0xefa7a1,
+ /* b1 */ 0xefa7a2, 0xefa7a3, 0xe788be, 0xe78fa5,
+ /* b5 */ 0xefa7a4, 0xe795b0, 0xe7978d, 0xefa7a5,
+ /* b9 */ 0xe7a7bb, 0xefa7a6, 0xe8808c, 0xe880b3,
+ /* bd */ 0xe88284, 0xe88ba1, 0xe88d91, 0xefa7a7,
+ /* c1 */ 0xefa7a8, 0xe8b2bd, 0xe8b2b3, 0xe98287,
+ /* c5 */ 0xefa7a9, 0xefa7aa, 0xe9a3b4, 0xe9a48c,
+ /* c9 */ 0xefa7ab, 0xefa7ac, 0xe780b7, 0xe79b8a,
+ /* cd */ 0xe7bf8a, 0xe7bf8c, 0xe7bfbc, 0xe8ac9a,
+ /* d1 */ 0xe4baba, 0xe4bb81, 0xe58883, 0xe58db0,
+ /* d5 */ 0xefa7ad, 0xe592bd, 0xe59ba0, 0xe5a7bb,
+ /* d9 */ 0xe5af85, 0xe5bc95, 0xe5bf8d, 0xe6b9ae,
+ /* dd */ 0xefa7ae, 0xefa7af, 0xe7b5aa, 0xe88cb5,
+ /* e1 */ 0xefa7b0, 0xe89a93, 0xe8aa8d, 0xefa7b1,
+ /* e5 */ 0xe99dad, 0xe99db7, 0xefa7b2, 0xefa7b3,
+ /* e9 */ 0xe4b880, 0xe4bd9a, 0xe4bdbe, 0xe5a3b9,
+ /* ed */ 0xe697a5, 0xe6baa2, 0xe980b8, 0xe98eb0,
+ /* f1 */ 0xe9a6b9, 0xe4bbbb, 0xe5a3ac, 0xe5a68a,
+ /* f5 */ 0xe5a799, 0xe68181, 0xefa7b4, 0xefa7b5,
+ /* f9 */ 0xe7a894, 0xefa7b6, 0xe88d8f, 0xe8b383,
+ /* fd */ 0xe585a5, 0xe58d84,
+
+ /*** Two byte table, leaf: edxx - offset 0x05164 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xefa7b7, 0xefa7b8, 0xefa7b9, 0xe4bb8d,
+ /* a5 */ 0xe589a9, 0xe5ad95, 0xe88abf, 0xe4bb94,
+ /* a9 */ 0xe588ba, 0xe592a8, 0xe5a789, 0xe5a7bf,
+ /* ad */ 0xe5ad90, 0xe5ad97, 0xe5ad9c, 0xe681a3,
+ /* b1 */ 0xe68588, 0xe6bb8b, 0xe78299, 0xe785ae,
+ /* b5 */ 0xe78e86, 0xe793b7, 0xe796b5, 0xe7a381,
+ /* b9 */ 0xe7b4ab, 0xe88085, 0xe887aa, 0xe88ca8,
+ /* bd */ 0xe89497, 0xe89789, 0xe8abae, 0xe8b387,
+ /* c1 */ 0xe99b8c, 0xe4bd9c, 0xe58bba, 0xe59abc,
+ /* c5 */ 0xe696ab, 0xe698a8, 0xe781bc, 0xe782b8,
+ /* c9 */ 0xe788b5, 0xe7b6bd, 0xe88a8d, 0xe9858c,
+ /* cd */ 0xe99b80, 0xe9b5b2, 0xe5adb1, 0xe6a3a7,
+ /* d1 */ 0xe6ae98, 0xe6bdba, 0xe79b9e, 0xe5b291,
+ /* d5 */ 0xe69aab, 0xe6bd9b, 0xe7aeb4, 0xe7b0aa,
+ /* d9 */ 0xe8a0b6, 0xe99b9c, 0xe4b888, 0xe4bb97,
+ /* dd */ 0xe58ca0, 0xe5a0b4, 0xe5a2bb, 0xe5a3af,
+ /* e1 */ 0xe5a5ac, 0xe5b087, 0xe5b8b3, 0xe5ba84,
+ /* e5 */ 0xe5bcb5, 0xe68e8c, 0xe69ab2, 0xe69d96,
+ /* e9 */ 0xe6a89f, 0xe6aaa3, 0xe6ac8c, 0xe6bcbf,
+ /* ed */ 0xe78986, 0xefa7ba, 0xe78d90, 0xe7928b,
+ /* f1 */ 0xe7aba0, 0xe7b2a7, 0xe885b8, 0xe8879f,
+ /* f5 */ 0xe887a7, 0xe88e8a, 0xe891ac, 0xe894a3,
+ /* f9 */ 0xe89694, 0xe8978f, 0xe8a39d, 0xe8b493,
+ /* fd */ 0xe986ac, 0xe995b7,
+
+ /*** Two byte table, leaf: eexx - offset 0x05222 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe99a9c, 0xe5868d, 0xe59389, 0xe59ca8,
+ /* a5 */ 0xe5aeb0, 0xe6898d, 0xe69d90, 0xe6a0bd,
+ /* a9 */ 0xe6a293, 0xe6b8bd, 0xe6bb93, 0xe781bd,
+ /* ad */ 0xe7b8a1, 0xe8a381, 0xe8b2a1, 0xe8bc89,
+ /* b1 */ 0xe9bd8b, 0xe9bd8e, 0xe788ad, 0xe7ae8f,
+ /* b5 */ 0xe8ab8d, 0xe98c9a, 0xe4bd87, 0xe4bd8e,
+ /* b9 */ 0xe584b2, 0xe59280, 0xe5a790, 0xe5ba95,
+ /* bd */ 0xe68ab5, 0xe69db5, 0xe6a5ae, 0xe6a897,
+ /* c1 */ 0xe6b2ae, 0xe6b89a, 0xe78b99, 0xe78caa,
+ /* c5 */ 0xe796bd, 0xe7aeb8, 0xe7b4b5, 0xe88ba7,
+ /* c9 */ 0xe88fb9, 0xe89197, 0xe897b7, 0xe8a99b,
+ /* cd */ 0xe8b2af, 0xe8ba87, 0xe98099, 0xe982b8,
+ /* d1 */ 0xe99b8e, 0xe9bd9f, 0xe58ba3, 0xe5908a,
+ /* d5 */ 0xe5aba1, 0xe5af82, 0xe69198, 0xe695b5,
+ /* d9 */ 0xe6bbb4, 0xe78b84, 0xefa7bb, 0xe79a84,
+ /* dd */ 0xe7a98d, 0xe7ac9b, 0xe7b18d, 0xe7b8be,
+ /* e1 */ 0xe7bf9f, 0xe88dbb, 0xe8acab, 0xe8b38a,
+ /* e5 */ 0xe8b5a4, 0xe8b7a1, 0xe8b99f, 0xe8bfaa,
+ /* e9 */ 0xe8bfb9, 0xe981a9, 0xe98f91, 0xe4bd83,
+ /* ed */ 0xe4bdba, 0xe582b3, 0xe585a8, 0xe585b8,
+ /* f1 */ 0xe5898d, 0xe589aa, 0xe5a1a1, 0xe5a1bc,
+ /* f5 */ 0xe5a5a0, 0xe5b088, 0xe5b195, 0xe5bb9b,
+ /* f9 */ 0xe6829b, 0xe688b0, 0xe6a093, 0xe6aebf,
+ /* fd */ 0xe6b088, 0xe6beb1,
+
+ /*** Two byte table, leaf: efxx - offset 0x052e0 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7858e, 0xe790a0, 0xe794b0, 0xe794b8,
+ /* a5 */ 0xe79591, 0xe799b2, 0xe7ad8c, 0xe7ae8b,
+ /* a9 */ 0xe7aead, 0xe7af86, 0xe7ba8f, 0xe8a9ae,
+ /* ad */ 0xe8bcbe, 0xe8bd89, 0xe988bf, 0xe98a93,
+ /* b1 */ 0xe98ca2, 0xe990ab, 0xe99bbb, 0xe9a19a,
+ /* b5 */ 0xe9a1ab, 0xe9a49e, 0xe58887, 0xe688aa,
+ /* b9 */ 0xe68a98, 0xe6b599, 0xe799a4, 0xe7ab8a,
+ /* bd */ 0xe7af80, 0xe7b5b6, 0xe58da0, 0xe5b2be,
+ /* c1 */ 0xe5ba97, 0xe6bcb8, 0xe782b9, 0xe7b298,
+ /* c5 */ 0xe99c91, 0xe9ae8e, 0xe9bb9e, 0xe68ea5,
+ /* c9 */ 0xe691ba, 0xe89db6, 0xe4b881, 0xe4ba95,
+ /* cd */ 0xe4baad, 0xe5819c, 0xe581b5, 0xe59188,
+ /* d1 */ 0xe5a783, 0xe5ae9a, 0xe5b980, 0xe5baad,
+ /* d5 */ 0xe5bbb7, 0xe5be81, 0xe68385, 0xe68cba,
+ /* d9 */ 0xe694bf, 0xe695b4, 0xe6978c, 0xe699b6,
+ /* dd */ 0xe699b8, 0xe69fbe, 0xe6a5a8, 0xe6aa89,
+ /* e1 */ 0xe6ada3, 0xe6b180, 0xe6b780, 0xe6b7a8,
+ /* e5 */ 0xe6b89f, 0xe6b99e, 0xe7809e, 0xe782a1,
+ /* e9 */ 0xe78e8e, 0xe78fbd, 0xe794ba, 0xe79d9b,
+ /* ed */ 0xe7a287, 0xe7a68e, 0xe7a88b, 0xe7a9bd,
+ /* f1 */ 0xe7b2be, 0xe7b68e, 0xe88987, 0xe8a882,
+ /* f5 */ 0xe8abaa, 0xe8b29e, 0xe984ad, 0xe9858a,
+ /* f9 */ 0xe98798, 0xe989a6, 0xe98b8c, 0xe98ca0,
+ /* fd */ 0xe99c86, 0xe99d96,
+
+ /*** Two byte table, leaf: f0xx - offset 0x0539e ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe99d9c, 0xe9a082, 0xe9bc8e, 0xe588b6,
+ /* a5 */ 0xe58a91, 0xe595bc, 0xe5a0a4, 0xe5b89d,
+ /* a9 */ 0xe5bc9f, 0xe6828c, 0xe68f90, 0xe6a2af,
+ /* ad */ 0xe6bf9f, 0xe7a5ad, 0xe7acac, 0xe8878d,
+ /* b1 */ 0xe896ba, 0xe8a3bd, 0xe8abb8, 0xe8b984,
+ /* b5 */ 0xe9868d, 0xe999a4, 0xe99a9b, 0xe99cbd,
+ /* b9 */ 0xe9a18c, 0xe9bd8a, 0xe4bf8e, 0xe58586,
+ /* bd */ 0xe5878b, 0xe58aa9, 0xe598b2, 0xe5bc94,
+ /* c1 */ 0xe5bdab, 0xe68eaa, 0xe6938d, 0xe697a9,
+ /* c5 */ 0xe69981, 0xe69bba, 0xe69bb9, 0xe69c9d,
+ /* c9 */ 0xe6a29d, 0xe6a397, 0xe6a7bd, 0xe6bc95,
+ /* cd */ 0xe6bdae, 0xe785a7, 0xe787a5, 0xe788aa,
+ /* d1 */ 0xe792aa, 0xe79cba, 0xe7a596, 0xe7a59a,
+ /* d5 */ 0xe7a79f, 0xe7a8a0, 0xe7aa95, 0xe7b297,
+ /* d9 */ 0xe7b39f, 0xe7b584, 0xe7b9b0, 0xe88287,
+ /* dd */ 0xe897bb, 0xe89aa4, 0xe8a994, 0xe8aabf,
+ /* e1 */ 0xe8b699, 0xe8ba81, 0xe980a0, 0xe981ad,
+ /* e5 */ 0xe987a3, 0xe998bb, 0xe99b95, 0xe9b3a5,
+ /* e9 */ 0xe6978f, 0xe7b087, 0xe8b6b3, 0xe98f83,
+ /* ed */ 0xe5ad98, 0xe5b08a, 0xe58d92, 0xe68b99,
+ /* f1 */ 0xe78c9d, 0xe580a7, 0xe5ae97, 0xe5be9e,
+ /* f5 */ 0xe682b0, 0xe685ab, 0xe6a395, 0xe6b799,
+ /* f9 */ 0xe790ae, 0xe7a8ae, 0xe7b582, 0xe7b69c,
+ /* fd */ 0xe7b8b1, 0xe885ab,
+
+ /*** Two byte table, leaf: f1xx - offset 0x0545c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe8b8aa, 0xe8b8b5, 0xe98dbe, 0xe99098,
+ /* a5 */ 0xe4bd90, 0xe59d90, 0xe5b7a6, 0xe5baa7,
+ /* a9 */ 0xe68cab, 0xe7bdaa, 0xe4b8bb, 0xe4bd8f,
+ /* ad */ 0xe4be8f, 0xe5819a, 0xe5a79d, 0xe88384,
+ /* b1 */ 0xe591aa, 0xe591a8, 0xe597be, 0xe5a58f,
+ /* b5 */ 0xe5ae99, 0xe5b79e, 0xe5bb9a, 0xe6999d,
+ /* b9 */ 0xe69cb1, 0xe69fb1, 0xe6a0aa, 0xe6b3a8,
+ /* bd */ 0xe6b4b2, 0xe6b98a, 0xe6be8d, 0xe782b7,
+ /* c1 */ 0xe78fa0, 0xe79687, 0xe7b18c, 0xe7b482,
+ /* c5 */ 0xe7b4ac, 0xe7b6a2, 0xe8889f, 0xe89b9b,
+ /* c9 */ 0xe8a8bb, 0xe8aa85, 0xe8b5b0, 0xe8ba8a,
+ /* cd */ 0xe8bcb3, 0xe980b1, 0xe9858e, 0xe98592,
+ /* d1 */ 0xe99184, 0xe9a790, 0xe7abb9, 0xe7b2a5,
+ /* d5 */ 0xe4bf8a, 0xe58481, 0xe58786, 0xe59f88,
+ /* d9 */ 0xe5afaf, 0xe5b3bb, 0xe69999, 0xe6a8bd,
+ /* dd */ 0xe6b59a, 0xe6ba96, 0xe6bfac, 0xe7848c,
+ /* e1 */ 0xe795af, 0xe7aba3, 0xe8a0a2, 0xe980a1,
+ /* e5 */ 0xe981b5, 0xe99b8b, 0xe9a7bf, 0xe88c81,
+ /* e9 */ 0xe4b8ad, 0xe4bbb2, 0xe8a186, 0xe9878d,
+ /* ed */ 0xe58dbd, 0xe6ab9b, 0xe6a5ab, 0xe6b181,
+ /* f1 */ 0xe891ba, 0xe5a29e, 0xe6868e, 0xe69bbe,
+ /* f5 */ 0xe68baf, 0xe7839d, 0xe79491, 0xe79787,
+ /* f9 */ 0xe7b992, 0xe892b8, 0xe8ad89, 0xe8b488,
+ /* fd */ 0xe4b98b, 0xe58faa,
+
+ /*** Two byte table, leaf: f2xx - offset 0x0551a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe592ab, 0xe59cb0, 0xe59d80, 0xe5bf97,
+ /* a5 */ 0xe68c81, 0xe68c87, 0xe691af, 0xe694af,
+ /* a9 */ 0xe697a8, 0xe699ba, 0xe69e9d, 0xe69eb3,
+ /* ad */ 0xe6ada2, 0xe6b1a0, 0xe6b29a, 0xe6bcac,
+ /* b1 */ 0xe79fa5, 0xe7a0a5, 0xe7a589, 0xe7a597,
+ /* b5 */ 0xe7b499, 0xe882a2, 0xe88482, 0xe887b3,
+ /* b9 */ 0xe88a9d, 0xe88ab7, 0xe89c98, 0xe8aa8c,
+ /* bd */ 0xefa7bc, 0xe8b484, 0xe8b6be, 0xe981b2,
+ /* c1 */ 0xe79bb4, 0xe7a899, 0xe7a8b7, 0xe7b994,
+ /* c5 */ 0xe881b7, 0xe59487, 0xe59794, 0xe5a1b5,
+ /* c9 */ 0xe68caf, 0xe690a2, 0xe69989, 0xe6998b,
+ /* cd */ 0xe6a1ad, 0xe6a69b, 0xe6ae84, 0xe6b4a5,
+ /* d1 */ 0xe6bab1, 0xe78f8d, 0xe791a8, 0xe792a1,
+ /* d5 */ 0xe7959b, 0xe796b9, 0xe79ba1, 0xe79c9e,
+ /* d9 */ 0xe79e8b, 0xe7a7a6, 0xe7b889, 0xe7b89d,
+ /* dd */ 0xe887bb, 0xe894af, 0xe8a297, 0xe8a8ba,
+ /* e1 */ 0xe8b391, 0xe8bbab, 0xe8beb0, 0xe980b2,
+ /* e5 */ 0xe98ead, 0xe999a3, 0xe999b3, 0xe99c87,
+ /* e9 */ 0xe4be84, 0xe58fb1, 0xe5a7aa, 0xe5ab89,
+ /* ed */ 0xe5b899, 0xe6a18e, 0xe79386, 0xe796be,
+ /* f1 */ 0xe7a7a9, 0xe7aa92, 0xe886a3, 0xe89bad,
+ /* f5 */ 0xe8b3aa, 0xe8b78c, 0xe8bfad, 0xe6969f,
+ /* f9 */ 0xe69c95, 0xefa7bd, 0xe59fb7, 0xe6bd97,
+ /* fd */ 0xe7b79d, 0xe8bcaf,
+
+ /*** Two byte table, leaf: f3xx - offset 0x055d8 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe98fb6, 0xe99b86, 0xe5beb5, 0xe687b2,
+ /* a5 */ 0xe6be84, 0xe4b894, 0xe4be98, 0xe5809f,
+ /* a9 */ 0xe58f89, 0xe5979f, 0xe5b5af, 0xe5b7ae,
+ /* ad */ 0xe6aca1, 0xe6ada4, 0xe7a38b, 0xe7ae9a,
+ /* b1 */ 0xefa7be, 0xe8b989, 0xe8bb8a, 0xe981ae,
+ /* b5 */ 0xe68d89, 0xe690be, 0xe79d80, 0xe7aa84,
+ /* b9 */ 0xe98caf, 0xe991bf, 0xe9bdaa, 0xe692b0,
+ /* bd */ 0xe6beaf, 0xe787a6, 0xe792a8, 0xe7939a,
+ /* c1 */ 0xe7ab84, 0xe7b092, 0xe7ba82, 0xe7b2b2,
+ /* c5 */ 0xe7ba98, 0xe8ae9a, 0xe8b48a, 0xe991bd,
+ /* c9 */ 0xe9a490, 0xe9a58c, 0xe588b9, 0xe5af9f,
+ /* cd */ 0xe693a6, 0xe69cad, 0xe7b4ae, 0xe583ad,
+ /* d1 */ 0xe58f83, 0xe5a1b9, 0xe68598, 0xe68599,
+ /* d5 */ 0xe687ba, 0xe696ac, 0xe7ab99, 0xe8ae92,
+ /* d9 */ 0xe8ae96, 0xe58089, 0xe580a1, 0xe589b5,
+ /* dd */ 0xe594b1, 0xe5a8bc, 0xe5bba0, 0xe5bdb0,
+ /* e1 */ 0xe684b4, 0xe6959e, 0xe6988c, 0xe698b6,
+ /* e5 */ 0xe69aa2, 0xe6a78d, 0xe6bb84, 0xe6bcb2,
+ /* e9 */ 0xe78c96, 0xe798a1, 0xe7aa93, 0xe884b9,
+ /* ed */ 0xe88999, 0xe88f96, 0xe892bc, 0xe582b5,
+ /* f1 */ 0xe59fb0, 0xe5af80, 0xe5afa8, 0xe5bda9,
+ /* f5 */ 0xe68ea1, 0xe7a0a6, 0xe7b6b5, 0xe88f9c,
+ /* f9 */ 0xe894a1, 0xe98787, 0xe987b5, 0xe5868a,
+ /* fd */ 0xe69fb5, 0xe7ad96,
+
+ /*** Two byte table, leaf: f4xx - offset 0x05696 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe8b2ac, 0xe58784, 0xe5a6bb, 0xe682bd,
+ /* a5 */ 0xe89995, 0xe5809c, 0xefa7bf, 0xe58994,
+ /* a9 */ 0xe5b0ba, 0xe685bd, 0xe6889a, 0xe68b93,
+ /* ad */ 0xe693b2, 0xe696a5, 0xe6bb8c, 0xe798a0,
+ /* b1 */ 0xe8848a, 0xe8b9a0, 0xe9999f, 0xe99abb,
+ /* b5 */ 0xe4bb9f, 0xe58d83, 0xe59698, 0xe5a4a9,
+ /* b9 */ 0xe5b79d, 0xe69385, 0xe6b389, 0xe6b7ba,
+ /* bd */ 0xe78e94, 0xe7a9bf, 0xe8889b, 0xe896a6,
+ /* c1 */ 0xe8b3a4, 0xe8b890, 0xe981b7, 0xe987a7,
+ /* c5 */ 0xe997a1, 0xe998a1, 0xe99f86, 0xe587b8,
+ /* c9 */ 0xe593b2, 0xe59686, 0xe5beb9, 0xe692a4,
+ /* cd */ 0xe6be88, 0xe7b6b4, 0xe8bc9f, 0xe8bd8d,
+ /* d1 */ 0xe990b5, 0xe58389, 0xe5b096, 0xe6b2be,
+ /* d5 */ 0xe6b7bb, 0xe7949b, 0xe79ebb, 0xe7b0bd,
+ /* d9 */ 0xe7b1a4, 0xe8a9b9, 0xe8ab82, 0xe5a09e,
+ /* dd */ 0xe5a6be, 0xe5b896, 0xe68db7, 0xe78992,
+ /* e1 */ 0xe7968a, 0xe79dab, 0xe8ab9c, 0xe8b2bc,
+ /* e5 */ 0xe8bc92, 0xe5bbb3, 0xe699b4, 0xe6b7b8,
+ /* e9 */ 0xe881bd, 0xe88f81, 0xe8ab8b, 0xe99d91,
+ /* ed */ 0xe9af96, 0xefa880, 0xe58983, 0xe69bbf,
+ /* f1 */ 0xe6b695, 0xe6bbaf, 0xe7b7a0, 0xe8aba6,
+ /* f5 */ 0xe980ae, 0xe9819e, 0xe9ab94, 0xe5889d,
+ /* f9 */ 0xe589bf, 0xe593a8, 0xe68694, 0xe68a84,
+ /* fd */ 0xe68b9b, 0xe6a2a2,
+
+ /*** Two byte table, leaf: f5xx - offset 0x05754 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe6a492, 0xe6a59a, 0xe6a8b5, 0xe78292,
+ /* a5 */ 0xe784a6, 0xe7a19d, 0xe7a481, 0xe7a48e,
+ /* a9 */ 0xe7a792, 0xe7a88d, 0xe88296, 0xe889b8,
+ /* ad */ 0xe88b95, 0xe88d89, 0xe89589, 0xe8b282,
+ /* b1 */ 0xe8b685, 0xe985a2, 0xe9868b, 0xe986ae,
+ /* b5 */ 0xe4bf83, 0xe59b91, 0xe787ad, 0xe79f97,
+ /* b9 */ 0xe89c80, 0xe8a7b8, 0xe5afb8, 0xe5bf96,
+ /* bd */ 0xe69d91, 0xe982a8, 0xe58fa2, 0xe5a19a,
+ /* c1 */ 0xe5afb5, 0xe682a4, 0xe68681, 0xe691a0,
+ /* c5 */ 0xe7b8bd, 0xe881b0, 0xe894a5, 0xe98a83,
+ /* c9 */ 0xe692ae, 0xe582ac, 0xe5b494, 0xe69c80,
+ /* cd */ 0xe5a29c, 0xe68abd, 0xe68ea8, 0xe6a48e,
+ /* d1 */ 0xe6a5b8, 0xe6a89e, 0xe6b9ab, 0xe79aba,
+ /* d5 */ 0xe7a78b, 0xe88abb, 0xe890a9, 0xe8ab8f,
+ /* d9 */ 0xe8b6a8, 0xe8bfbd, 0xe98492, 0xe9858b,
+ /* dd */ 0xe9869c, 0xe98c90, 0xe98c98, 0xe98e9a,
+ /* e1 */ 0xe99b9b, 0xe9a8b6, 0xe9b08d, 0xe4b891,
+ /* e5 */ 0xe7959c, 0xe7a59d, 0xe7abba, 0xe7ad91,
+ /* e9 */ 0xe7af89, 0xe7b8ae, 0xe89384, 0xe8b999,
+ /* ed */ 0xe8b9b4, 0xe8bbb8, 0xe98090, 0xe698a5,
+ /* f1 */ 0xe6a4bf, 0xe79183, 0xe587ba, 0xe69cae,
+ /* f5 */ 0xe9bb9c, 0xe58585, 0xe5bfa0, 0xe6b296,
+ /* f9 */ 0xe89fb2, 0xe8a19d, 0xe8a1b7, 0xe682b4,
+ /* fd */ 0xe886b5, 0xe89083,
+
+ /*** Two byte table, leaf: f6xx - offset 0x05812 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe8b485, 0xe58f96, 0xe590b9, 0xe598b4,
+ /* a5 */ 0xe5a8b6, 0xe5b0b1, 0xe7828a, 0xe7bfa0,
+ /* a9 */ 0xe8819a, 0xe88486, 0xe887ad, 0xe8b6a3,
+ /* ad */ 0xe98689, 0xe9a99f, 0xe9b7b2, 0xe581b4,
+ /* b1 */ 0xe4bb84, 0xe58ea0, 0xe683bb, 0xe6b8ac,
+ /* b5 */ 0xe5b1a4, 0xe4be88, 0xe580a4, 0xe597a4,
+ /* b9 */ 0xe5b399, 0xe5b99f, 0xe681a5, 0xe6a294,
+ /* bd */ 0xe6b2bb, 0xe6b784, 0xe786be, 0xe79794,
+ /* c1 */ 0xe797b4, 0xe799a1, 0xe7a89a, 0xe7a989,
+ /* c5 */ 0xe7b787, 0xe7b7bb, 0xe7bdae, 0xe887b4,
+ /* c9 */ 0xe89aa9, 0xe8bc9c, 0xe99b89, 0xe9a6b3,
+ /* cd */ 0xe9bd92, 0xe58987, 0xe58b85, 0xe9a3ad,
+ /* d1 */ 0xe8a6aa, 0xe4b883, 0xe69f92, 0xe6bc86,
+ /* d5 */ 0xe4beb5, 0xe5afa2, 0xe69e95, 0xe6b288,
+ /* d9 */ 0xe6b5b8, 0xe7909b, 0xe7a0a7, 0xe9879d,
+ /* dd */ 0xe98dbc, 0xe89f84, 0xe7a7a4, 0xe7a8b1,
+ /* e1 */ 0xe5bfab, 0xe4bb96, 0xe592a4, 0xe594be,
+ /* e5 */ 0xe5a2ae, 0xe5a6a5, 0xe683b0, 0xe68993,
+ /* e9 */ 0xe68b96, 0xe69cb6, 0xe6a595, 0xe888b5,
+ /* ed */ 0xe99980, 0xe9a6b1, 0xe9a79d, 0xe580ac,
+ /* f1 */ 0xe58d93, 0xe59584, 0xe59dbc, 0xefa881,
+ /* f5 */ 0xe68998, 0xefa882, 0xe693a2, 0xe699ab,
+ /* f9 */ 0xe69f9d, 0xe6bf81, 0xe6bfaf, 0xe790a2,
+ /* fd */ 0xe790b8, 0xe8a897,
+
+ /*** Two byte table, leaf: f7xx - offset 0x058d0 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe990b8, 0xe59191, 0xe59886, 0xe59da6,
+ /* a5 */ 0xe5bd88, 0xe6869a, 0xe6ad8e, 0xe78198,
+ /* a9 */ 0xe782ad, 0xe7b6bb, 0xe8aa95, 0xe5a5aa,
+ /* ad */ 0xe884ab, 0xe68ea2, 0xe79c88, 0xe880bd,
+ /* b1 */ 0xe8b2aa, 0xe5a194, 0xe690ad, 0xe6a6bb,
+ /* b5 */ 0xe5ae95, 0xe5b891, 0xe6b9af, 0xefa883,
+ /* b9 */ 0xe895a9, 0xe5858c, 0xe58fb0, 0xe5a4aa,
+ /* bd */ 0xe680a0, 0xe6858b, 0xe6ae86, 0xe6b1b0,
+ /* c1 */ 0xe6b3b0, 0xe7ac9e, 0xe8838e, 0xe88b94,
+ /* c5 */ 0xe8b786, 0xe982b0, 0xe9a2b1, 0xefa884,
+ /* c9 */ 0xe69387, 0xe6bea4, 0xe69291, 0xe69484,
+ /* cd */ 0xe5858e, 0xe59090, 0xe59c9f, 0xe8a88e,
+ /* d1 */ 0xe6859f, 0xe6a1b6, 0xefa885, 0xe7979b,
+ /* d5 */ 0xe7ad92, 0xe7b5b1, 0xe9809a, 0xe5a086,
+ /* d9 */ 0xe6a78c, 0xe885bf, 0xe8a4aa, 0xe98080,
+ /* dd */ 0xe9a0b9, 0xe581b8, 0xe5a597, 0xe5a6ac,
+ /* e1 */ 0xe68a95, 0xe9808f, 0xe9acaa, 0xe6859d,
+ /* e5 */ 0xe789b9, 0xe99796, 0xe59da1, 0xe5a986,
+ /* e9 */ 0xe5b7b4, 0xe68a8a, 0xe692ad, 0xe693ba,
+ /* ed */ 0xe69db7, 0xe6b3a2, 0xe6b4be, 0xe788ac,
+ /* f1 */ 0xe790b6, 0xe7a0b4, 0xe7bdb7, 0xe88aad,
+ /* f5 */ 0xe8b79b, 0xe9a097, 0xe588a4, 0xe59d82,
+ /* f9 */ 0xe69dbf, 0xe78988, 0xe793a3, 0xe8b2a9,
+ /* fd */ 0xe8bea6, 0xe98891,
+
+ /*** Two byte table, leaf: f8xx - offset 0x0598e ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe998aa, 0xe585ab, 0xe58fad, 0xe68d8c,
+ /* a5 */ 0xe4bda9, 0xe59484, 0xe68296, 0xe69597,
+ /* a9 */ 0xe6b29b, 0xe6b5bf, 0xe7898c, 0xe78bbd,
+ /* ad */ 0xe7a897, 0xe8a687, 0xe8b29d, 0xe5bdad,
+ /* b1 */ 0xe6be8e, 0xe783b9, 0xe886a8, 0xe6848e,
+ /* b5 */ 0xe4bebf, 0xe5818f, 0xe68981, 0xe78987,
+ /* b9 */ 0xe7af87, 0xe7b7a8, 0xe7bfa9, 0xe9818d,
+ /* bd */ 0xe99ead, 0xe9a899, 0xe8b2b6, 0xe59daa,
+ /* c1 */ 0xe5b9b3, 0xe69eb0, 0xe8908d, 0xe8a995,
+ /* c5 */ 0xe590a0, 0xe5ac96, 0xe5b9a3, 0xe5bba2,
+ /* c9 */ 0xe5bc8a, 0xe69683, 0xe882ba, 0xe894bd,
+ /* cd */ 0xe99689, 0xe9999b, 0xe4bd88, 0xe58c85,
+ /* d1 */ 0xe58c8d, 0xe58c8f, 0xe59286, 0xe593ba,
+ /* d5 */ 0xe59c83, 0xe5b883, 0xe68096, 0xe68a9b,
+ /* d9 */ 0xe68ab1, 0xe68d95, 0xefa886, 0xe6b3a1,
+ /* dd */ 0xe6b5a6, 0xe796b1, 0xe7a0b2, 0xe8839e,
+ /* e1 */ 0xe884af, 0xe88b9e, 0xe891a1, 0xe892b2,
+ /* e5 */ 0xe8a28d, 0xe8a492, 0xe9808b, 0xe98baa,
+ /* e9 */ 0xe9a3bd, 0xe9ae91, 0xe5b985, 0xe69ab4,
+ /* ed */ 0xe69b9d, 0xe78091, 0xe78886, 0xefa887,
+ /* f1 */ 0xe4bfb5, 0xe589bd, 0xe5bdaa, 0xe68593,
+ /* f5 */ 0xe69d93, 0xe6a899, 0xe6bc82, 0xe793a2,
+ /* f9 */ 0xe7a5a8, 0xe8a1a8, 0xe8b1b9, 0xe9a387,
+ /* fd */ 0xe9a384, 0xe9a983,
+
+ /*** Two byte table, leaf: f9xx - offset 0x05a4c ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe59381, 0xe7a89f, 0xe6a593, 0xe8abb7,
+ /* a5 */ 0xe8b18a, 0xe9a2a8, 0xe9a6ae, 0xe5bdbc,
+ /* a9 */ 0xe68aab, 0xe796b2, 0xe79aae, 0xe8a2ab,
+ /* ad */ 0xe981bf, 0xe99982, 0xe58cb9, 0xe5bcbc,
+ /* b1 */ 0xe5bf85, 0xe6b38c, 0xe78f8c, 0xe795a2,
+ /* b5 */ 0xe7968b, 0xe7ad86, 0xe88bbe, 0xe9a69d,
+ /* b9 */ 0xe4b98f, 0xe980bc, 0xe4b88b, 0xe4bd95,
+ /* bd */ 0xe58ea6, 0xe5a48f, 0xe5bb88, 0xe698b0,
+ /* c1 */ 0xe6b2b3, 0xe79195, 0xe88db7, 0xe89da6,
+ /* c5 */ 0xe8b380, 0xe98190, 0xe99c9e, 0xe9b095,
+ /* c9 */ 0xe5a391, 0xe5adb8, 0xe89990, 0xe8ac94,
+ /* cd */ 0xe9b6b4, 0xe5af92, 0xe681a8, 0xe6828d,
+ /* d1 */ 0xe697b1, 0xe6b197, 0xe6bca2, 0xe6bea3,
+ /* d5 */ 0xe7809a, 0xe7bd95, 0xe7bfb0, 0xe99691,
+ /* d9 */ 0xe99692, 0xe99990, 0xe99f93, 0xe589b2,
+ /* dd */ 0xe8bd84, 0xe587bd, 0xe590ab, 0xe592b8,
+ /* e1 */ 0xe595a3, 0xe5968a, 0xe6aabb, 0xe6b6b5,
+ /* e5 */ 0xe7b798, 0xe889a6, 0xe98a9c, 0xe999b7,
+ /* e9 */ 0xe9b9b9, 0xe59088, 0xe59388, 0xe79b92,
+ /* ed */ 0xe89ba4, 0xe996a4, 0xe99794, 0xe9999c,
+ /* f1 */ 0xe4baa2, 0xe4bc89, 0xe5a7ae, 0xe5aba6,
+ /* f5 */ 0xe5b7b7, 0xe68192, 0xe68a97, 0xe69dad,
+ /* f9 */ 0xe6a181, 0xe6b286, 0xe6b8af, 0xe7bcb8,
+ /* fd */ 0xe8829b, 0xe888aa,
+
+ /*** Two byte table, leaf: faxx - offset 0x05b0a ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xefa888, 0xefa889, 0xe9a085, 0xe4baa5,
+ /* a5 */ 0xe58195, 0xe592b3, 0xe59e93, 0xe5a59a,
+ /* a9 */ 0xe5ada9, 0xe5aeb3, 0xe68788, 0xe6a5b7,
+ /* ad */ 0xe6b5b7, 0xe780a3, 0xe89fb9, 0xe8a7a3,
+ /* b1 */ 0xe8a9b2, 0xe8aba7, 0xe98282, 0xe9a7ad,
+ /* b5 */ 0xe9aab8, 0xe58abe, 0xe6a0b8, 0xe58096,
+ /* b9 */ 0xe5b9b8, 0xe69d8f, 0xe88d87, 0xe8a18c,
+ /* bd */ 0xe4baab, 0xe59091, 0xe59aae, 0xe78fa6,
+ /* c1 */ 0xe98495, 0xe99fbf, 0xe9a489, 0xe9a597,
+ /* c5 */ 0xe9a699, 0xe59993, 0xe5a29f, 0xe8999b,
+ /* c9 */ 0xe8a8b1, 0xe686b2, 0xe6abb6, 0xe78dbb,
+ /* cd */ 0xe8bb92, 0xe6ad87, 0xe99aaa, 0xe9a997,
+ /* d1 */ 0xe5a595, 0xe78880, 0xe8b5ab, 0xe99da9,
+ /* d5 */ 0xe4bf94, 0xe5b3b4, 0xe5bca6, 0xe687b8,
+ /* d9 */ 0xe6999b, 0xe6b3ab, 0xe782ab, 0xe78e84,
+ /* dd */ 0xe78eb9, 0xe78fbe, 0xe79ca9, 0xe79d8d,
+ /* e1 */ 0xe7b583, 0xe7b5a2, 0xe7b8a3, 0xe888b7,
+ /* e5 */ 0xe8a192, 0xefa88a, 0xe8b3a2, 0xe98989,
+ /* e9 */ 0xe9a1af, 0xe5ad91, 0xe7a9b4, 0xe8a180,
+ /* ed */ 0xe9a081, 0xe5ab8c, 0xe4bfa0, 0xe58d94,
+ /* f1 */ 0xe5a4be, 0xe5b3bd, 0xe68cbe, 0xe6b5b9,
+ /* f5 */ 0xe78bb9, 0xe88485, 0xe88487, 0xe88ea2,
+ /* f9 */ 0xe98b8f, 0xe9a0b0, 0xe4baa8, 0xe58584,
+ /* fd */ 0xe58891, 0xe59e8b,
+
+ /*** Two byte table, leaf: fbxx - offset 0x05bc8 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe5bda2, 0xe6b382, 0xe6bb8e, 0xe78085,
+ /* a5 */ 0xe78190, 0xe782af, 0xe78692, 0xe78fa9,
+ /* a9 */ 0xe791a9, 0xe88d8a, 0xe89ea2, 0xe8a1a1,
+ /* ad */ 0xe98088, 0xe982a2, 0xe98ea3, 0xe9a6a8,
+ /* b1 */ 0xe585ae, 0xe5bd97, 0xe683a0, 0xe685a7,
+ /* b5 */ 0xe69ab3, 0xe89599, 0xe8b98a, 0xe986af,
+ /* b9 */ 0xe99e8b, 0xe4b98e, 0xe4ba92, 0xe591bc,
+ /* bd */ 0xe5a395, 0xe5a3ba, 0xe5a5bd, 0xe5b2b5,
+ /* c1 */ 0xe5bca7, 0xe688b6, 0xe68988, 0xe6988a,
+ /* c5 */ 0xe699a7, 0xe6afab, 0xe6b5a9, 0xe6b78f,
+ /* c9 */ 0xe6b996, 0xe6bbb8, 0xe6be94, 0xe6bfa0,
+ /* cd */ 0xe6bfa9, 0xe7819d, 0xe78b90, 0xe790a5,
+ /* d1 */ 0xe7919a, 0xe793a0, 0xe79a93, 0xe7a59c,
+ /* d5 */ 0xe7b38a, 0xe7b89e, 0xe883a1, 0xe88aa6,
+ /* d9 */ 0xe891ab, 0xe892bf, 0xe8998e, 0xe8999f,
+ /* dd */ 0xe89db4, 0xe8adb7, 0xe8b1aa, 0xe98eac,
+ /* e1 */ 0xe9a080, 0xe9a1a5, 0xe68391, 0xe68896,
+ /* e5 */ 0xe985b7, 0xe5a99a, 0xe6988f, 0xe6b7b7,
+ /* e9 */ 0xe6b8be, 0xe790bf, 0xe9ad82, 0xe5bfbd,
+ /* ed */ 0xe6839a, 0xe7ac8f, 0xe59384, 0xe5bc98,
+ /* f1 */ 0xe6b19e, 0xe6b393, 0xe6b4aa, 0xe78398,
+ /* f5 */ 0xe7b485, 0xe899b9, 0xe8a88c, 0xe9b4bb,
+ /* f9 */ 0xe58c96, 0xe5928c, 0xe5ac85, 0xe6a8ba,
+ /* fd */ 0xe781ab, 0xe795b5,
+
+ /*** Two byte table, leaf: fcxx - offset 0x05c86 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe7a68d, 0xe7a6be, 0xe88ab1, 0xe88faf,
+ /* a5 */ 0xe8a9b1, 0xe8ad81, 0xe8b2a8, 0xe99db4,
+ /* a9 */ 0xefa88b, 0xe693b4, 0xe694ab, 0xe7a2ba,
+ /* ad */ 0xe7a2bb, 0xe7a9ab, 0xe4b8b8, 0xe5969a,
+ /* b1 */ 0xe5a590, 0xe5aea6, 0xe5b9bb, 0xe682a3,
+ /* b5 */ 0xe68f9b, 0xe6ada1, 0xe699a5, 0xe6a193,
+ /* b9 */ 0xe6b899, 0xe785a5, 0xe792b0, 0xe7b488,
+ /* bd */ 0xe98284, 0xe9a9a9, 0xe9b0a5, 0xe6b4bb,
+ /* c1 */ 0xe6bb91, 0xe78cbe, 0xe8b181, 0xe9978a,
+ /* c5 */ 0xe587b0, 0xe5b98c, 0xe5bea8, 0xe6818d,
+ /* c9 */ 0xe683b6, 0xe684b0, 0xe6858c, 0xe69983,
+ /* cd */ 0xe69984, 0xe6a6a5, 0xe6b381, 0xe6b99f,
+ /* d1 */ 0xe6bb89, 0xe6bda2, 0xe7858c, 0xe7929c,
+ /* d5 */ 0xe79a87, 0xe7af81, 0xe7b0a7, 0xe88d92,
+ /* d9 */ 0xe89d97, 0xe98191, 0xe99a8d, 0xe9bb83,
+ /* dd */ 0xe58caf, 0xe59b9e, 0xe5bbbb, 0xe5be8a,
+ /* e1 */ 0xe681a2, 0xe68294, 0xe687b7, 0xe699a6,
+ /* e5 */ 0xe69c83, 0xe6aa9c, 0xe6b7ae, 0xe6beae,
+ /* e9 */ 0xe781b0, 0xe78daa, 0xe7b9aa, 0xe886be,
+ /* ed */ 0xe88cb4, 0xe89b94, 0xe8aaa8, 0xe8b384,
+ /* f1 */ 0xe58a83, 0xe78db2, 0xe5ae96, 0xe6a9ab,
+ /* f5 */ 0xe99084, 0xe593ae, 0xe59a86, 0xe5ad9d,
+ /* f9 */ 0xe69588, 0xe69685, 0xe69b89, 0xe6a29f,
+ /* fd */ 0xe6b68d, 0xe6b786,
+
+ /*** Two byte table, leaf: fdxx - offset 0x05d44 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xe788bb, 0xe882b4, 0xe985b5, 0xe9a98d,
+ /* a5 */ 0xe4beaf, 0xe58099, 0xe58e9a, 0xe5908e,
+ /* a9 */ 0xe590bc, 0xe59689, 0xe59785, 0xe5b8bf,
+ /* ad */ 0xe5be8c, 0xe69cbd, 0xe785a6, 0xe78f9d,
+ /* b1 */ 0xe98085, 0xe58b9b, 0xe58bb3, 0xe5a1a4,
+ /* b5 */ 0xe5a38e, 0xe78484, 0xe7868f, 0xe787bb,
+ /* b9 */ 0xe896b0, 0xe8a893, 0xe69a88, 0xe896a8,
+ /* bd */ 0xe596a7, 0xe69a84, 0xe7858a, 0xe890b1,
+ /* c1 */ 0xe58d89, 0xe59699, 0xe6af81, 0xe5bd99,
+ /* c5 */ 0xe5bebd, 0xe68fae, 0xe69a89, 0xe78587,
+ /* c9 */ 0xe8abb1, 0xe8bc9d, 0xe9babe, 0xe4bc91,
+ /* cd */ 0xe690ba, 0xe7838b, 0xe795a6, 0xe899a7,
+ /* d1 */ 0xe681a4, 0xe8ad8e, 0xe9b7b8, 0xe58587,
+ /* d5 */ 0xe587b6, 0xe58c88, 0xe6b4b6, 0xe883b8,
+ /* d9 */ 0xe9bb91, 0xe69895, 0xe6aca3, 0xe78298,
+ /* dd */ 0xe79795, 0xe59083, 0xe5b1b9, 0xe7b487,
+ /* e1 */ 0xe8a896, 0xe6aca0, 0xe6acbd, 0xe6ad86,
+ /* e5 */ 0xe590b8, 0xe681b0, 0xe6b4bd, 0xe7bf95,
+ /* e9 */ 0xe88888, 0xe58396, 0xe5879e, 0xe5969c,
+ /* ed */ 0xe599ab, 0xe59b8d, 0xe5a7ac, 0xe5ac89,
+ /* f1 */ 0xe5b88c, 0xe68699, 0xe68698, 0xe688b1,
+ /* f5 */ 0xe6999e, 0xe69ba6, 0xe78699, 0xe786b9,
+ /* f9 */ 0xe786ba, 0xe78aa7, 0xe7a6a7, 0xe7a880,
+ /* fd */ 0xe7beb2, 0xe8a9b0,
+
+ /*** Two byte table, leaf: fexx - offset 0x05e02 ***/
+
+ /* 41 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 45 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 49 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 51 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 55 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 59 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 61 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 65 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 69 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 71 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 75 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 79 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 81 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 85 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 89 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 91 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 95 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 99 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9d */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a1 */ 0xee819e, 0xee819f, 0xee81a0, 0xee81a1,
+ /* a5 */ 0xee81a2, 0xee81a3, 0xee81a4, 0xee81a5,
+ /* a9 */ 0xee81a6, 0xee81a7, 0xee81a8, 0xee81a9,
+ /* ad */ 0xee81aa, 0xee81ab, 0xee81ac, 0xee81ad,
+ /* b1 */ 0xee81ae, 0xee81af, 0xee81b0, 0xee81b1,
+ /* b5 */ 0xee81b2, 0xee81b3, 0xee81b4, 0xee81b5,
+ /* b9 */ 0xee81b6, 0xee81b7, 0xee81b8, 0xee81b9,
+ /* bd */ 0xee81ba, 0xee81bb, 0xee81bc, 0xee81bd,
+ /* c1 */ 0xee81be, 0xee81bf, 0xee8280, 0xee8281,
+ /* c5 */ 0xee8282, 0xee8283, 0xee8284, 0xee8285,
+ /* c9 */ 0xee8286, 0xee8287, 0xee8288, 0xee8289,
+ /* cd */ 0xee828a, 0xee828b, 0xee828c, 0xee828d,
+ /* d1 */ 0xee828e, 0xee828f, 0xee8290, 0xee8291,
+ /* d5 */ 0xee8292, 0xee8293, 0xee8294, 0xee8295,
+ /* d9 */ 0xee8296, 0xee8297, 0xee8298, 0xee8299,
+ /* dd */ 0xee829a, 0xee829b, 0xee829c, 0xee829d,
+ /* e1 */ 0xee829e, 0xee829f, 0xee82a0, 0xee82a1,
+ /* e5 */ 0xee82a2, 0xee82a3, 0xee82a4, 0xee82a5,
+ /* e9 */ 0xee82a6, 0xee82a7, 0xee82a8, 0xee82a9,
+ /* ed */ 0xee82aa, 0xee82ab, 0xee82ac, 0xee82ad,
+ /* f1 */ 0xee82ae, 0xee82af, 0xee82b0, 0xee82b1,
+ /* f5 */ 0xee82b2, 0xee82b3, 0xee82b4, 0xee82b5,
+ /* f9 */ 0xee82b6, 0xee82b7, 0xee82b8, 0xee82b9,
+ /* fd */ 0xee82ba, 0xee82bb
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_big5.map b/src/backend/utils/mb/Unicode/utf8_to_big5.map
new file mode 100644
index 0000000..07c2198
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_big5.map
@@ -0,0 +1,4100 @@
+/* src/backend/utils/mb/Unicode/utf8_to_big5.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_BIG5.pl */
+
+static const uint16 big5_from_unicode_tree_table[22839];
+
+static const pg_mb_radix_tree big5_from_unicode_tree =
+{
+ big5_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x01ef, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 big5_from_unicode_tree_table[22839] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0088, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x00c1, 0x0000, 0x0000, 0x00f0, 0x0130, 0x016f, 0x01af,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xa246, 0xa247, 0x0000, 0xa244, 0x0000, 0xa1b1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa258, 0xa1d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa150,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00088 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d2,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x000c1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3be,
+ /* 88 */ 0x0000, 0xa3bc, 0xa3bd, 0xa3bf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa3bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x000f0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a,
+ /* 98 */ 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352,
+ /* a0 */ 0xa353, 0xa354, 0x0000, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359,
+ /* a8 */ 0xa35a, 0xa35b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362,
+ /* b8 */ 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00130 ***/
+
+ /* 80 */ 0xa36b, 0xa36c, 0x0000, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371,
+ /* 88 */ 0xa372, 0xa373, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0016f ***/
+
+ /* 80 */ 0x0000, 0xc7b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7b1, 0xc7b2, 0xc7b4, 0xc7b5,
+ /* 98 */ 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf,
+ /* a8 */ 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7,
+ /* b0 */ 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0,
+ /* b8 */ 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8,
+
+ /*** Two byte table, leaf: d1xx - offset 0x001af ***/
+
+ /* 80 */ 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0,
+ /* 88 */ 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8,
+ /* 90 */ 0x0000, 0xc7ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x001ef ***/
+
+ /* e2 */ 0x01fd, 0x023d, 0x024d, 0x028d, 0x02cd, 0x030d, 0x034d, 0x038d,
+ /* ea */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03cc,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x001fd ***/
+
+ /* 80 */ 0x040c, 0x0000, 0x0000, 0x0000, 0x044b, 0x046b, 0x049b, 0x0000,
+ /* 88 */ 0x04c1, 0x04fe, 0x0526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0566, 0x0000, 0x0000, 0x05a6, 0x05e3, 0x0622, 0x0660,
+ /* 98 */ 0x069b, 0x06db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x0023d ***/
+
+ /* 80 */ 0x071b, 0x075a, 0x079a, 0x07da, 0x0819, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0843, 0x0000, 0x0000, 0x0000, 0x0875, 0x08b1,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x0024d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x08f1, 0x092f, 0x096f, 0x09af, 0x09ef, 0x0a2f, 0x0a6f, 0x0aaf,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x0028d ***/
+
+ /* 80 */ 0x0aef, 0x0b2f, 0x0b6f, 0x0baf, 0x0bef, 0x0c2f, 0x0c6f, 0x0cae,
+ /* 88 */ 0x0cee, 0x0d2d, 0x0d6d, 0x0dad, 0x0ded, 0x0e2d, 0x0e6d, 0x0eaa,
+ /* 90 */ 0x0ee9, 0x0f29, 0x0f69, 0x0fa9, 0x0fe9, 0x1029, 0x1069, 0x10a9,
+ /* 98 */ 0x10e9, 0x1129, 0x1169, 0x11a9, 0x11e9, 0x1229, 0x1269, 0x12a9,
+ /* a0 */ 0x12e9, 0x1329, 0x1369, 0x13a9, 0x13e9, 0x1429, 0x1469, 0x14a9,
+ /* a8 */ 0x14e9, 0x1529, 0x1569, 0x15a9, 0x15e9, 0x1629, 0x1669, 0x16a9,
+ /* b0 */ 0x16e8, 0x1728, 0x1767, 0x17a1, 0x17e1, 0x1821, 0x1861, 0x18a1,
+ /* b8 */ 0x18e1, 0x1921, 0x1961, 0x19a0, 0x19e0, 0x1a20, 0x1a60, 0x1aa0,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x002cd ***/
+
+ /* 80 */ 0x1ae0, 0x1b20, 0x1b60, 0x1ba0, 0x1be0, 0x1c20, 0x1c60, 0x1ca0,
+ /* 88 */ 0x1ce0, 0x1d20, 0x1d60, 0x1da0, 0x1de0, 0x1e20, 0x1e60, 0x1ea0,
+ /* 90 */ 0x1eda, 0x1f1a, 0x1f5a, 0x1f9a, 0x1fda, 0x201a, 0x205a, 0x209a,
+ /* 98 */ 0x20da, 0x2119, 0x2159, 0x2199, 0x21d9, 0x2219, 0x2259, 0x2299,
+ /* a0 */ 0x22d9, 0x2319, 0x2359, 0x2395, 0x23d3, 0x2413, 0x2451, 0x2491,
+ /* a8 */ 0x24d1, 0x2511, 0x2551, 0x258f, 0x25cf, 0x260f, 0x264f, 0x268f,
+ /* b0 */ 0x26cf, 0x270f, 0x274f, 0x278f, 0x27cf, 0x280f, 0x284f, 0x288f,
+ /* b8 */ 0x28cf, 0x290f, 0x2949, 0x2989, 0x29c9, 0x2a09, 0x2a49, 0x2a89,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x0030d ***/
+
+ /* 80 */ 0x2ac9, 0x2b09, 0x2b47, 0x2b86, 0x2bc6, 0x2c05, 0x2c45, 0x2c85,
+ /* 88 */ 0x2cc5, 0x2d05, 0x2d45, 0x2d85, 0x2dc5, 0x2e05, 0x2e45, 0x2e85,
+ /* 90 */ 0x2ec5, 0x2f05, 0x2f45, 0x2f85, 0x2fc5, 0x3005, 0x3045, 0x3085,
+ /* 98 */ 0x30c5, 0x3103, 0x3143, 0x3183, 0x31c2, 0x3201, 0x3241, 0x3281,
+ /* a0 */ 0x32bf, 0x32fc, 0x333c, 0x337b, 0x33bb, 0x33fb, 0x343b, 0x347b,
+ /* a8 */ 0x34bb, 0x34fb, 0x353b, 0x357b, 0x35bb, 0x35fb, 0x3639, 0x3679,
+ /* b0 */ 0x36b9, 0x36f9, 0x3739, 0x3779, 0x37b9, 0x37f9, 0x3839, 0x3879,
+ /* b8 */ 0x38b6, 0x38f6, 0x3936, 0x0000, 0x3953, 0x3993, 0x39d3, 0x3a13,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x0034d ***/
+
+ /* 80 */ 0x3a53, 0x3a93, 0x3ad3, 0x3b11, 0x3b51, 0x3b90, 0x3bd0, 0x3c10,
+ /* 88 */ 0x3c50, 0x3c90, 0x3cd0, 0x3d10, 0x3d50, 0x3d90, 0x3dd0, 0x3e10,
+ /* 90 */ 0x3e50, 0x3e90, 0x3ecf, 0x3f0f, 0x3f4f, 0x3f8f, 0x3fcf, 0x400f,
+ /* 98 */ 0x404f, 0x408f, 0x40cc, 0x410c, 0x414c, 0x418c, 0x41cb, 0x420b,
+ /* a0 */ 0x424b, 0x428b, 0x42cb, 0x430b, 0x434a, 0x4389, 0x43c9, 0x4409,
+ /* a8 */ 0x4449, 0x4489, 0x44c9, 0x4509, 0x4549, 0x4589, 0x45c9, 0x0000,
+ /* b0 */ 0x45e9, 0x4629, 0x4669, 0x46a9, 0x46e9, 0x4705, 0x4745, 0x4785,
+ /* b8 */ 0x47c5, 0x4805, 0x4844, 0x4884, 0x48c4, 0x4904, 0x4929, 0x4969,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x0038d ***/
+
+ /* 80 */ 0x49a9, 0x49e9, 0x4a29, 0x4a69, 0x4aa9, 0x4ae9, 0x4b29, 0x4b69,
+ /* 88 */ 0x4ba9, 0x4be9, 0x4c29, 0x4c69, 0x4ca9, 0x4ce6, 0x4d26, 0x4d66,
+ /* 90 */ 0x4da6, 0x4de6, 0x4e26, 0x0000, 0x0000, 0x4e2f, 0x4e6f, 0x4eaf,
+ /* 98 */ 0x4ed5, 0x4f15, 0x4f55, 0x4f95, 0x4fd5, 0x5015, 0x5055, 0x5095,
+ /* a0 */ 0x50d5, 0x5114, 0x5149, 0x5189, 0x51c9, 0x5209, 0x5233, 0x5272,
+ /* a8 */ 0x52b2, 0x52f2, 0x531e, 0x535e, 0x539d, 0x53dd, 0x541d, 0x545d,
+ /* b0 */ 0x549b, 0x54db, 0x0000, 0x5516, 0x5556, 0x5596, 0x55d6, 0x5616,
+ /* b8 */ 0x5656, 0x5675, 0x56b5, 0x56f5, 0x5735, 0x5775, 0x57b4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x003cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x57e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x57f8, 0x5838, 0x0000, 0x0000, 0x5877, 0x58b7, 0x0000, 0x58f7,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0040c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa156, 0xa158, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xa1a5, 0xa1a6, 0x0000, 0x0000, 0xa1a7, 0xa1a8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xa145, 0x0000, 0x0000, 0xa14c, 0xa14b, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1ac, 0x0000, 0x0000, 0xa1ab, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1b0, 0x0000, 0x0000, 0xa1c2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x0044b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xa24a, 0x0000, 0xa1c1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa24b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x0046b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0,
+ /* a8 */ 0xa2c1, 0xa2c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x0049b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0x0000, 0x0000, 0xa1f8, 0xa1f9,
+ /* 98 */ 0xa1fb, 0xa1fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e288xx - offset 0x004c1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa1d4, 0x0000, 0x0000, 0x0000, 0xa1db, 0xa1e8,
+ /* a0 */ 0xa1e7, 0x0000, 0x0000, 0xa1fd, 0x0000, 0xa1fc, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xa1e4, 0xa1e5, 0xa1ec, 0x0000, 0x0000, 0xa1ed, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ef, 0xa1ee, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e3,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x004fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1da, 0xa1dd, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d8, 0xa1d9,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x00526 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e9,
+
+ /*** Three byte table, leaf: e291xx - offset 0x00566 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0,
+ /* a8 */ 0xc7f1, 0xc7f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6,
+ /* b8 */ 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x005a6 ***/
+
+ /* 80 */ 0xa277, 0x0000, 0xa278, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa27a, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa27b, 0x0000, 0x0000, 0x0000, 0xa27c, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xa27d, 0x0000, 0x0000, 0x0000, 0xa275, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa274, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa273, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa272, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa271,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e295xx - offset 0x005e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa2a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2a5, 0x0000,
+ /* a0 */ 0x0000, 0xa2a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xa2a6, 0x0000, 0x0000, 0xa27e, 0xa2a1, 0xa2a3,
+ /* b0 */ 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x00622 ***/
+
+ /* 80 */ 0x0000, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268,
+ /* 88 */ 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa276, 0xa279, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1bd, 0xa1bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1b6, 0xa1b5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1bf, 0xa1be,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x00660 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1bb, 0xa1ba,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xa1b3, 0x0000, 0x0000, 0xa1b7, 0xa1b4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x0069b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1b9, 0xa1b8, 0x0000,
+ /* 88 */ 0x0000, 0xa1f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x006db ***/
+
+ /* 80 */ 0xa1f0, 0xa1f2, 0xa1f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x0071b ***/
+
+ /* 80 */ 0xa140, 0xa142, 0xa143, 0xa1b2, 0x0000, 0xc6a4, 0x0000, 0x0000,
+ /* 88 */ 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a,
+ /* 90 */ 0xa169, 0xa16a, 0xa245, 0x0000, 0xa165, 0xa166, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a9, 0xa1aa, 0x0000,
+ /* a0 */ 0x0000, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9,
+ /* a8 */ 0xa2ca, 0xa2cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x0075a ***/
+
+ /* 80 */ 0x0000, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab,
+ /* 88 */ 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3,
+ /* 90 */ 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb,
+ /* 98 */ 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3,
+ /* a0 */ 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb,
+ /* a8 */ 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3,
+ /* b0 */ 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db,
+ /* b8 */ 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3,
+
+ /*** Three byte table, leaf: e382xx - offset 0x0079a ***/
+
+ /* 80 */ 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb,
+ /* 88 */ 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3,
+ /* 90 */ 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a2, 0xc6a3, 0x0000,
+ /* a0 */ 0x0000, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe,
+ /* a8 */ 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747,
+ /* b0 */ 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f,
+ /* b8 */ 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757,
+
+ /*** Three byte table, leaf: e383xx - offset 0x007da ***/
+
+ /* 80 */ 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f,
+ /* 88 */ 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767,
+ /* 90 */ 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f,
+ /* 98 */ 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777,
+ /* a0 */ 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1,
+ /* a8 */ 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9,
+ /* b0 */ 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x00819 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa374, 0xa375, 0xa376,
+ /* 88 */ 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e,
+ /* 90 */ 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8,
+ /* 98 */ 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0,
+ /* a0 */ 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8,
+ /* a8 */ 0xa3b9, 0xa3ba,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x00843 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xa1c0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00875 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa255, 0xa256,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa250, 0xa251, 0xa252, 0x0000,
+ /* a0 */ 0x0000, 0xa254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x008b1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa257, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa253, 0x0000,
+ /* 90 */ 0x0000, 0xa1eb, 0xa1ea, 0x0000, 0x0000, 0xa24f, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x008f1 ***/
+
+ /* 80 */ 0xa440, 0xa442, 0x0000, 0xa443, 0x0000, 0x0000, 0x0000, 0xc945,
+ /* 88 */ 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d,
+ /* 90 */ 0xa4a2, 0xa4a1, 0x0000, 0x0000, 0xa542, 0xa541, 0xa540, 0x0000,
+ /* 98 */ 0xa543, 0xa4fe, 0x0000, 0x0000, 0x0000, 0x0000, 0xa5e0, 0xa5e1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8c3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa458, 0x0000, 0xa4a4, 0xc950, 0x0000,
+ /* b0 */ 0xa4a5, 0xc963, 0xa6ea, 0xcbb1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xa459, 0xa4a6, 0x0000, 0xa544, 0xc964, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x0092f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc940, 0xa444, 0x0000, 0xa45b, 0x0000, 0xc947,
+ /* 88 */ 0xa45c, 0x0000, 0x0000, 0xa4a7, 0x0000, 0xa545, 0xa547, 0xa546,
+ /* 90 */ 0x0000, 0x0000, 0xa5e2, 0xa5e3, 0x0000, 0x0000, 0xa8c4, 0x0000,
+ /* 98 */ 0xadbc, 0xa441, 0x0000, 0x0000, 0xc941, 0xa445, 0xa45e, 0xa45d,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xa5e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xa8c5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0ae, 0xd44b,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x0096f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb6c3, 0xdcb1, 0xdcb2, 0x0000, 0xa446, 0x0000,
+ /* 88 */ 0xa4a9, 0x0000, 0x0000, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0x0000,
+ /* 90 */ 0x0000, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa5e5, 0x0000, 0xa8c7, 0x0000, 0x0000, 0xa8c8, 0xab45,
+ /* a0 */ 0x0000, 0xa460, 0xa4ae, 0x0000, 0xa5e6, 0xa5e8, 0xa5e7, 0x0000,
+ /* a8 */ 0xa6eb, 0x0000, 0x0000, 0xa8c9, 0xa8ca, 0xab46, 0xab47, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xadbd, 0x0000, 0x0000, 0xdcb3, 0x0000,
+ /* b8 */ 0x0000, 0xf6d6, 0xa448, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x009af ***/
+
+ /* 80 */ 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0x0000, 0xa4b2, 0xa4b3,
+ /* 88 */ 0xc954, 0xc953, 0xa4b5, 0xa4b6, 0x0000, 0xa4b4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa54a, 0xa54b, 0xa54c, 0xa54d,
+ /* 98 */ 0xa549, 0xa550, 0xc96a, 0x0000, 0xc966, 0xc969, 0xa551, 0xa561,
+ /* a0 */ 0x0000, 0xc968, 0x0000, 0xa54e, 0xa54f, 0xa548, 0x0000, 0x0000,
+ /* a8 */ 0xc965, 0xc967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, 0xa5f3, 0xc9b2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa5f4, 0x0000, 0xa5f7, 0x0000, 0xa5e9,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x009ef ***/
+
+ /* 80 */ 0xc9b1, 0xa5f8, 0xc9b5, 0x0000, 0xc9b9, 0xc9b6, 0x0000, 0x0000,
+ /* 88 */ 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0x0000, 0xa5ee, 0xc9ab, 0xa5f1,
+ /* 90 */ 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0x0000, 0x0000,
+ /* 98 */ 0xc9ac, 0xa5eb, 0x0000, 0x0000, 0x0000, 0xc9b4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xc9b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc9ad, 0xca66, 0x0000, 0xa742,
+ /* b0 */ 0xa6f4, 0x0000, 0x0000, 0xca67, 0xa6f1, 0x0000, 0xa744, 0x0000,
+ /* b8 */ 0xa6f9, 0x0000, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, 0xca68,
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00a2f ***/
+
+ /* 80 */ 0x0000, 0xca64, 0x0000, 0xa6fa, 0x0000, 0x0000, 0xa6fd, 0xa6ee,
+ /* 88 */ 0xa747, 0xca5d, 0x0000, 0x0000, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed,
+ /* 90 */ 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef,
+ /* 98 */ 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63,
+ /* a0 */ 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, 0x0000, 0x0000, 0xca61,
+ /* a8 */ 0x0000, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0x0000, 0xcbcc, 0xa8cb,
+ /* b0 */ 0xa8d5, 0x0000, 0x0000, 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc,
+ /* b8 */ 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00a6f ***/
+
+ /* 80 */ 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7,
+ /* 88 */ 0xa8d7, 0xcbba, 0x0000, 0xa8d2, 0x0000, 0xa8cd, 0x0000, 0xa8dc,
+ /* 90 */ 0xcbc4, 0xa8dd, 0xcbc8, 0x0000, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe,
+ /* 98 */ 0xcbb2, 0x0000, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xab56, 0xab4a,
+ /* b0 */ 0x0000, 0x0000, 0xcde0, 0xcde8, 0x0000, 0xab49, 0xab51, 0xab5d,
+ /* b8 */ 0x0000, 0xcdee, 0xcdec, 0xcde7, 0x0000, 0x0000, 0x0000, 0xab4b,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00aaf ***/
+
+ /* 80 */ 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, 0x0000, 0xcdea,
+ /* 88 */ 0x0000, 0xcde1, 0xab54, 0xcde2, 0x0000, 0xcddd, 0xab5b, 0xab4e,
+ /* 90 */ 0xab57, 0xab4d, 0x0000, 0xcddf, 0xcde4, 0x0000, 0xcdeb, 0xab55,
+ /* 98 */ 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53,
+ /* a0 */ 0xab4c, 0xab48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdef, 0x0000, 0xadd7, 0xadc1,
+ /* b0 */ 0x0000, 0xadd1, 0x0000, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5,
+ /* b8 */ 0xadc4, 0x0000, 0xadcd, 0x0000, 0x0000, 0x0000, 0xadda, 0x0000,
+
+ /*** Three byte table, leaf: e580xx - offset 0x00aef ***/
+
+ /* 80 */ 0xadce, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c9, 0xadc7, 0xd0ca,
+ /* 88 */ 0x0000, 0xaddc, 0x0000, 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf,
+ /* 90 */ 0x0000, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6, 0xd0d6,
+ /* 98 */ 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0x0000, 0xd0c8, 0xadc9,
+ /* a0 */ 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0x0000, 0xadc3, 0xadc2, 0xd0d9,
+ /* a8 */ 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0x0000, 0xd0db,
+ /* b0 */ 0xd0cd, 0xd0dc, 0x0000, 0xd0d1, 0x0000, 0xd0da, 0x0000, 0xd0d2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xadc8, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e581xx - offset 0x00b2f ***/
+
+ /* 80 */ 0xd463, 0xd457, 0x0000, 0xb0b3, 0x0000, 0xd45c, 0xd462, 0xb0b2,
+ /* 88 */ 0xd455, 0xb0b6, 0xd459, 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be,
+ /* 90 */ 0x0000, 0xd467, 0x0000, 0xd451, 0x0000, 0xb0ba, 0x0000, 0xd466,
+ /* 98 */ 0x0000, 0x0000, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d,
+ /* a0 */ 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0x0000, 0x0000,
+ /* a8 */ 0xd85b, 0xd45e, 0xd44d, 0xd45f, 0x0000, 0xb0c1, 0xd464, 0xb0c0,
+ /* b0 */ 0xd44c, 0x0000, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd,
+ /* b8 */ 0x0000, 0x0000, 0xb0af, 0x0000, 0x0000, 0xb0b0, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00b6f ***/
+
+ /* 80 */ 0xb3c8, 0x0000, 0xd85e, 0xd857, 0x0000, 0xb3c5, 0x0000, 0xd85f,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd855, 0xd858, 0xb3c4, 0xd859, 0x0000,
+ /* 90 */ 0x0000, 0xb3c7, 0xd85d, 0x0000, 0xd853, 0xd852, 0xb3c9, 0x0000,
+ /* 98 */ 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a, 0xd854, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb3c3, 0xd856, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd,
+ /* b0 */ 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb,
+ /* b8 */ 0xdcc4, 0x0000, 0xdcbf, 0xb6cc, 0x0000, 0xdcb4, 0xb6c9, 0xdcb5,
+
+ /*** Three byte table, leaf: e583xx - offset 0x00baf ***/
+
+ /* 80 */ 0x0000, 0xdcbe, 0xdcbc, 0x0000, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce,
+ /* 88 */ 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, 0x0000, 0x0000, 0xb9b6, 0xb9b3,
+ /* 90 */ 0x0000, 0xb9b4, 0x0000, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2,
+ /* 98 */ 0x0000, 0x0000, 0xb9b1, 0xe0f5, 0x0000, 0xe0f7, 0x0000, 0x0000,
+ /* a0 */ 0xe0fe, 0x0000, 0x0000, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac,
+ /* a8 */ 0xe0f3, 0xb9b7, 0xe0f6, 0x0000, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc,
+ /* b0 */ 0xe0fb, 0xb9b5, 0x0000, 0xe0f4, 0x0000, 0xbbf8, 0xe4ec, 0x0000,
+ /* b8 */ 0xe4e9, 0xbbf9, 0x0000, 0xbbf7, 0x0000, 0xe4f0, 0xe4ed, 0xe4e6,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00bef ***/
+
+ /* 80 */ 0xbbf6, 0x0000, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, 0xe4ea, 0xe4eb,
+ /* 88 */ 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0x0000, 0xe8f6,
+ /* 98 */ 0xbea8, 0x0000, 0xe8f7, 0x0000, 0xe8f4, 0x0000, 0x0000, 0xc076,
+ /* a0 */ 0xecbd, 0xc077, 0xecbb, 0x0000, 0xecbc, 0xecba, 0xecb9, 0x0000,
+ /* a8 */ 0x0000, 0xecbe, 0xc075, 0x0000, 0x0000, 0xefb8, 0xefb9, 0x0000,
+ /* b0 */ 0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0x0000, 0xc4d7,
+ /* b8 */ 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0x0000, 0xa449,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00c2f ***/
+
+ /* 80 */ 0xa461, 0xa4b9, 0x0000, 0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb,
+ /* 88 */ 0xa5fd, 0xa5fa, 0x0000, 0xa74a, 0xa749, 0xa74b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa8e0, 0x0000, 0xa8df, 0xa8e1, 0x0000, 0xab5e,
+ /* 98 */ 0x0000, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860,
+ /* a0 */ 0x0000, 0xa25d, 0xb9b8, 0xa25e, 0x0000, 0xa44a, 0x0000, 0xa4ba,
+ /* a8 */ 0xa5fe, 0xa8e2, 0x0000, 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0x0000,
+ /* b0 */ 0x0000, 0xa640, 0x0000, 0x0000, 0x0000, 0xa74c, 0xa8e4, 0xa8e3,
+ /* b8 */ 0xa8e5, 0x0000, 0x0000, 0x0000, 0xaddd, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00c6f ***/
+
+ /* 80 */ 0xbeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc94e,
+ /* 88 */ 0x0000, 0xa554, 0xa555, 0x0000, 0x0000, 0xa641, 0x0000, 0xca6a,
+ /* 90 */ 0x0000, 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0x0000, 0xa4be,
+ /* 98 */ 0xc955, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbcd, 0x0000,
+ /* a0 */ 0xab61, 0x0000, 0xade0, 0x0000, 0xadde, 0xaddf, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xbead, 0x0000, 0xa556, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa642, 0xc9bc, 0x0000, 0x0000, 0x0000, 0x0000, 0xa74d, 0xa74e,
+ /* b8 */ 0x0000, 0xca6b, 0x0000, 0x0000, 0xcbce, 0xa8e6, 0xcbcf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x00cae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0e2, 0xd0e3, 0xade3, 0x0000,
+ /* 88 */ 0xd0e4, 0x0000, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0x0000,
+ /* 90 */ 0xd468, 0x0000, 0x0000, 0x0000, 0xd861, 0x0000, 0x0000, 0xdcc5,
+ /* 98 */ 0xe140, 0x0000, 0x0000, 0x0000, 0xbbfe, 0xbeae, 0xe8f9, 0x0000,
+ /* a0 */ 0xa44c, 0xa45a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb0c4, 0xb3cd, 0x0000, 0xb9b9, 0x0000, 0xc942, 0xa4bf, 0x0000,
+ /* b8 */ 0xa559, 0xa557, 0xa558, 0x0000, 0x0000, 0xa8e7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00cee ***/
+
+ /* 80 */ 0xa44d, 0xa44e, 0x0000, 0xa462, 0x0000, 0x0000, 0xa4c0, 0xa4c1,
+ /* 88 */ 0xa4c2, 0xc9be, 0xa55a, 0x0000, 0xc96b, 0x0000, 0xa646, 0x0000,
+ /* 90 */ 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0x0000, 0x0000, 0xa647, 0xa643,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xca6c, 0xaaec, 0xca6d, 0x0000,
+ /* a0 */ 0x0000, 0xca6e, 0x0000, 0x0000, 0xa750, 0xa74f, 0x0000, 0x0000,
+ /* a8 */ 0xa753, 0xa751, 0xa752, 0x0000, 0x0000, 0x0000, 0xa8ed, 0x0000,
+ /* b0 */ 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0x0000, 0xcbd0, 0xa8ee, 0xa8ea,
+ /* b8 */ 0xa8e9, 0x0000, 0xa8eb, 0xa8e8, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x00d2d ***/
+
+ /* 80 */ 0x0000, 0xa8ef, 0x0000, 0xab63, 0xcdf0, 0x0000, 0xcbd3, 0xab68,
+ /* 88 */ 0x0000, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd0e8, 0x0000, 0xade7, 0xd0eb, 0xade5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd0e7, 0xade8, 0xade6, 0xade9, 0xd0e9, 0xd0ea,
+ /* a0 */ 0x0000, 0xd0e6, 0xd0ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6,
+ /* b0 */ 0x0000, 0x0000, 0xb3ce, 0x0000, 0xb3cf, 0xb3d0, 0x0000, 0xb6d0,
+ /* b8 */ 0xdcc7, 0x0000, 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0x0000, 0xb6cf,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00d6d ***/
+
+ /* 80 */ 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a, 0x0000, 0x0000, 0xbc40,
+ /* 88 */ 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xbeaf, 0x0000, 0xbeb0, 0x0000, 0x0000, 0xf1ed, 0xf5c3,
+ /* 98 */ 0xf5c2, 0xf7d1, 0x0000, 0xa44f, 0x0000, 0x0000, 0x0000, 0xa55c,
+ /* a0 */ 0xa55b, 0x0000, 0x0000, 0xa648, 0x0000, 0x0000, 0xc9c0, 0x0000,
+ /* a8 */ 0x0000, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa8f1, 0xcbd5, 0x0000, 0xa8f0, 0x0000,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00dad ***/
+
+ /* 80 */ 0xcdf2, 0xab6c, 0xcdf3, 0xab6b, 0x0000, 0x0000, 0x0000, 0xab69,
+ /* 88 */ 0x0000, 0xab6a, 0x0000, 0x0000, 0x0000, 0xd0ed, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb0c7, 0xd46e, 0x0000, 0xb0ca, 0xd46d, 0xb1e5,
+ /* 98 */ 0xb0c9, 0xb0c8, 0x0000, 0xb3d4, 0x0000, 0xb3d3, 0xb3d2, 0xb6d2,
+ /* a0 */ 0x0000, 0x0000, 0xb6d5, 0xb6d6, 0xb6d4, 0x0000, 0xb6d3, 0x0000,
+ /* a8 */ 0x0000, 0xe143, 0x0000, 0xe144, 0x0000, 0x0000, 0x0000, 0xe4f5,
+ /* b0 */ 0xbc45, 0xe4f4, 0x0000, 0xbeb1, 0xecbf, 0xc079, 0x0000, 0xf1ee,
+ /* b8 */ 0xc455, 0x0000, 0xa463, 0xa4c3, 0xc956, 0x0000, 0xa4c4, 0xa4c5,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00ded ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa55d, 0xa55e, 0x0000,
+ /* 88 */ 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0x0000, 0xab6d, 0xd0ee, 0xb0cc,
+ /* 90 */ 0xb0cb, 0xd863, 0xd862, 0x0000, 0x0000, 0xa450, 0xa4c6, 0xa55f,
+ /* 98 */ 0x0000, 0xb0cd, 0xc943, 0x0000, 0xc96c, 0xa560, 0x0000, 0xc9c2,
+ /* a0 */ 0xa64b, 0xa64a, 0xc9c1, 0xa758, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xadea, 0x0000, 0x0000, 0xd46f, 0x0000, 0xb6d7,
+ /* b0 */ 0xe145, 0xb9bc, 0x0000, 0x0000, 0xe8fa, 0x0000, 0x0000, 0xf3fd,
+ /* b8 */ 0x0000, 0xa4c7, 0x0000, 0x0000, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x00e2d ***/
+
+ /* 80 */ 0xb0cf, 0xa451, 0x0000, 0xa464, 0xa2cd, 0xa4ca, 0x0000, 0xa4c9,
+ /* 88 */ 0xa4c8, 0xa563, 0xa562, 0x0000, 0xc96d, 0xc9c3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0x0000, 0x0000, 0xab6e,
+ /* 98 */ 0x0000, 0x0000, 0xb3d5, 0x0000, 0xa452, 0x0000, 0xa4cb, 0x0000,
+ /* a0 */ 0xa565, 0xa564, 0x0000, 0xca72, 0x0000, 0x0000, 0xa8f6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc957, 0x0000, 0xa567, 0xa566,
+ /* b0 */ 0xa64c, 0xa64d, 0xca73, 0xa759, 0x0000, 0xa75a, 0x0000, 0xa8f7,
+ /* b8 */ 0xa8f8, 0xa8f9, 0x0000, 0xab6f, 0xcdf5, 0x0000, 0x0000, 0xadeb,
+
+ /*** Three byte table, leaf: e58exx - offset 0x00e6d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc944, 0x0000, 0xa4cc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc9c4, 0x0000, 0x0000, 0x0000, 0xca74, 0xca75,
+ /* 90 */ 0x0000, 0x0000, 0xcbd9, 0x0000, 0xcbda, 0x0000, 0xcdf7, 0xcdf6,
+ /* 98 */ 0xcdf9, 0xcdf8, 0xab70, 0x0000, 0xd470, 0xaded, 0xd0ef, 0xadec,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd864, 0xb3d6, 0x0000, 0xd865,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe146, 0xb9bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xbc46, 0x0000, 0xf1ef, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc958, 0x0000, 0xa568, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x00eaa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb0d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa453, 0xa465, 0xa4ce, 0xa4cd, 0x0000, 0xa4cf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa8fb, 0x0000, 0xa8fa, 0xa8fc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xab71, 0x0000, 0x0000, 0x0000, 0xadee,
+ /* a0 */ 0x0000, 0xe8fb, 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0x0000,
+ /* a8 */ 0xa56f, 0xa56e, 0xa575, 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569,
+ /* b0 */ 0xa578, 0xa577, 0xa576, 0xa56b, 0x0000, 0xa572, 0x0000, 0x0000,
+ /* b8 */ 0xa571, 0x0000, 0x0000, 0xa57b, 0xa570, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x00ee9 ***/
+
+ /* 80 */ 0x0000, 0xa653, 0x0000, 0xa659, 0xa655, 0x0000, 0xa65b, 0xc9c5,
+ /* 88 */ 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, 0xa65a, 0xa64f,
+ /* 90 */ 0xa652, 0xa656, 0xa65c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xca7e, 0xca7b, 0x0000, 0xa767, 0xca7c, 0xa75b, 0xa75d, 0xa775,
+ /* a0 */ 0xa770, 0x0000, 0x0000, 0x0000, 0xcaa5, 0xca7d, 0xa75f, 0xa761,
+ /* a8 */ 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, 0x0000,
+ /* b0 */ 0xca76, 0xa773, 0x0000, 0xa764, 0x0000, 0xa76e, 0xa76f, 0xca77,
+ /* b8 */ 0xa76c, 0xa76a, 0x0000, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0x0000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x00f29 ***/
+
+ /* 80 */ 0xa772, 0xcaa3, 0xa766, 0xa763, 0x0000, 0xca7a, 0xa762, 0xcaa6,
+ /* 88 */ 0xa765, 0x0000, 0xa769, 0x0000, 0x0000, 0x0000, 0xa760, 0xcaa2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xca79, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee,
+ /* a8 */ 0xa950, 0x0000, 0x0000, 0xcbe1, 0xcbe5, 0x0000, 0x0000, 0xcbe9,
+ /* b0 */ 0xce49, 0xa94b, 0xce4d, 0xa8fd, 0xcbe6, 0xa8fe, 0xa94c, 0xa945,
+ /* b8 */ 0xa941, 0x0000, 0xcbe2, 0xa944, 0xa949, 0xa952, 0xcbe3, 0xcbdc,
+
+ /*** Three byte table, leaf: e592xx - offset 0x00f69 ***/
+
+ /* 80 */ 0xa943, 0xcbdd, 0xcbdf, 0x0000, 0xa946, 0x0000, 0xa948, 0xcbdb,
+ /* 88 */ 0xcbe0, 0x0000, 0x0000, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0x0000,
+ /* 90 */ 0xa94a, 0xcbde, 0xa947, 0x0000, 0x0000, 0xa942, 0xa940, 0x0000,
+ /* 98 */ 0xcbec, 0x0000, 0xa94e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xce48, 0xcdfb, 0xce4b, 0x0000, 0x0000, 0xcdfd, 0xab78, 0xaba8,
+ /* a8 */ 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, 0xcdfc, 0xce43, 0xaba3,
+ /* b0 */ 0xce4f, 0xaba5, 0x0000, 0xab79, 0x0000, 0x0000, 0xce45, 0xce42,
+ /* b8 */ 0xab77, 0x0000, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9,
+
+ /*** Three byte table, leaf: e593xx - offset 0x00fa9 ***/
+
+ /* 80 */ 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a,
+ /* 88 */ 0xaba2, 0xab76, 0x0000, 0x0000, 0x0000, 0x0000, 0xab75, 0xcdfe,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce44, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce4e, 0x0000,
+ /* a0 */ 0xd144, 0xadfb, 0xd0f1, 0x0000, 0xd0f6, 0xadf4, 0xae40, 0xd0f4,
+ /* a8 */ 0xadef, 0xadf9, 0xadfe, 0xd0fb, 0x0000, 0xadfa, 0xadfd, 0x0000,
+ /* b0 */ 0x0000, 0xd0fe, 0xadf5, 0xd0f5, 0x0000, 0x0000, 0x0000, 0xd142,
+ /* b8 */ 0xd143, 0x0000, 0xadf7, 0xd141, 0xadf3, 0xae43, 0x0000, 0xd0f8,
+
+ /*** Three byte table, leaf: e594xx - offset 0x00fe9 ***/
+
+ /* 80 */ 0x0000, 0xadf1, 0x0000, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42,
+ /* 88 */ 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0x0000, 0xd145, 0xae44,
+ /* 90 */ 0xadf0, 0xd0fc, 0xd0f3, 0x0000, 0xadf8, 0x0000, 0x0000, 0xd0f2,
+ /* 98 */ 0x0000, 0x0000, 0xd0f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0f0, 0xae41,
+ /* a8 */ 0x0000, 0x0000, 0xd477, 0x0000, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df,
+ /* b0 */ 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2,
+ /* b8 */ 0xb0e1, 0xd4a5, 0x0000, 0xd4a8, 0xd473, 0x0000, 0xb3e8, 0x0000,
+
+ /*** Three byte table, leaf: e595xx - offset 0x01029 ***/
+
+ /* 80 */ 0xd4a9, 0xb0e7, 0x0000, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0x0000,
+ /* 88 */ 0xd4a6, 0x0000, 0xb0da, 0xd4aa, 0x0000, 0xd474, 0xd4a4, 0xb0dd,
+ /* 90 */ 0xd475, 0xd478, 0xd47d, 0x0000, 0x0000, 0xb0de, 0xb0dc, 0xb0e8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0e3, 0x0000, 0xb0d7, 0xb1d2,
+ /* a0 */ 0x0000, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb0d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd471, 0xd472, 0xd86a,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878,
+
+ /*** Three byte table, leaf: e596xx - offset 0x01069 ***/
+
+ /* 80 */ 0xb3d8, 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0x0000, 0x0000, 0xb3e2,
+ /* 88 */ 0xd86e, 0xb3ef, 0xb3db, 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f,
+ /* 90 */ 0x0000, 0xd866, 0xd873, 0xd86d, 0xb3e1, 0xd879, 0x0000, 0x0000,
+ /* 98 */ 0xb3dd, 0xb3f1, 0xb3ea, 0x0000, 0xb3df, 0xb3dc, 0x0000, 0xb3e7,
+ /* a0 */ 0x0000, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9,
+ /* a8 */ 0xd867, 0x0000, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0x0000,
+ /* b0 */ 0x0000, 0xb3ed, 0xb3e9, 0xb3e5, 0x0000, 0xd870, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb3eb, 0x0000, 0x0000, 0x0000, 0xdcd5,
+
+ /*** Three byte table, leaf: e597xx - offset 0x010a9 ***/
+
+ /* 80 */ 0xdcd1, 0x0000, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, 0xb6e6, 0xb6de,
+ /* 88 */ 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, 0xb6dc, 0xdcd8,
+ /* 90 */ 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, 0xdcdb, 0x0000,
+ /* 98 */ 0x0000, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0x0000, 0xb6d8,
+ /* a0 */ 0x0000, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f,
+ /* a8 */ 0xb6d9, 0xdcd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6e2,
+ /* b0 */ 0x0000, 0x0000, 0xdcdd, 0x0000, 0x0000, 0x0000, 0xb9cd, 0xb9c8,
+ /* b8 */ 0x0000, 0xe155, 0xe151, 0x0000, 0xe14b, 0xb9c2, 0xb9be, 0xe154,
+
+ /*** Three byte table, leaf: e598xx - offset 0x010e9 ***/
+
+ /* 80 */ 0xb9bf, 0xe14e, 0xe150, 0x0000, 0xe153, 0x0000, 0xb9c4, 0x0000,
+ /* 88 */ 0xb9cb, 0xb9c5, 0x0000, 0x0000, 0xe149, 0xb9c6, 0xb9c7, 0xe14c,
+ /* 90 */ 0xb9cc, 0x0000, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xb9c0, 0xe14d, 0xe152, 0x0000, 0xb9ca,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe147,
+ /* a8 */ 0x0000, 0xbc4d, 0xe547, 0x0000, 0xe544, 0x0000, 0xbc47, 0xbc53,
+ /* b0 */ 0xbc54, 0x0000, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0x0000,
+ /* b8 */ 0xe546, 0xbc49, 0xe548, 0xbc48, 0x0000, 0xe543, 0xe545, 0xbc4b,
+
+ /*** Three byte table, leaf: e599xx - offset 0x01129 ***/
+
+ /* 80 */ 0xe541, 0xe4fa, 0xe4f7, 0x0000, 0x0000, 0xd86b, 0xe4fd, 0x0000,
+ /* 88 */ 0xe4f6, 0xe4fc, 0xe4fb, 0x0000, 0xe4f8, 0x0000, 0xbc4f, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xbc4e, 0x0000, 0x0000, 0x0000, 0xbc50,
+ /* 98 */ 0xe4fe, 0xbeb2, 0xe540, 0x0000, 0x0000, 0x0000, 0xe945, 0x0000,
+ /* a0 */ 0xe8fd, 0x0000, 0xbebe, 0xe942, 0xbeb6, 0xbeba, 0xe941, 0x0000,
+ /* a8 */ 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, 0xbebc,
+ /* b0 */ 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0x0000, 0xbebf, 0xe946,
+ /* b8 */ 0xbeb7, 0xbeb4, 0x0000, 0x0000, 0x0000, 0x0000, 0xecc6, 0xecc8,
+
+ /*** Three byte table, leaf: e59axx - offset 0x01169 ***/
+
+ /* 80 */ 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d, 0xecc3, 0xc07e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecc1, 0xecc2, 0xc07a, 0xc0a1,
+ /* 90 */ 0xc07c, 0x0000, 0x0000, 0xecc0, 0x0000, 0xc250, 0x0000, 0xefbc,
+ /* 98 */ 0xefba, 0xefbf, 0xefbd, 0x0000, 0xefbb, 0xefbe, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc360, 0xf1f2, 0xf1f3,
+ /* a8 */ 0xc456, 0x0000, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc45a, 0xf5c5, 0xf5c6, 0x0000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x011a9 ***/
+
+ /* 80 */ 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0x0000, 0xf6d8, 0xf6d7, 0x0000,
+ /* 88 */ 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc5f1, 0x0000, 0xf8a5, 0xf8ee, 0x0000, 0x0000, 0xc949,
+ /* 98 */ 0x0000, 0x0000, 0xa57d, 0xa57c, 0x0000, 0xa65f, 0xa65e, 0xc9c7,
+ /* a0 */ 0xa65d, 0xc9c6, 0x0000, 0x0000, 0xa779, 0xcaa9, 0x0000, 0xcaa8,
+ /* a8 */ 0x0000, 0x0000, 0xa777, 0xa77a, 0x0000, 0x0000, 0xcaa7, 0x0000,
+ /* b0 */ 0xa778, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf0,
+ /* b8 */ 0x0000, 0xcbf1, 0xa954, 0x0000, 0x0000, 0x0000, 0x0000, 0xabaa,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x011e9 ***/
+
+ /* 80 */ 0x0000, 0xd148, 0xd149, 0xae45, 0xae46, 0x0000, 0x0000, 0xd4ac,
+ /* 88 */ 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb6e9, 0xb6ea, 0xdce1, 0x0000, 0xb9cf, 0x0000,
+ /* 98 */ 0xb9ce, 0x0000, 0xe549, 0xe948, 0xe947, 0x0000, 0xf96b, 0xa467,
+ /* a0 */ 0xc959, 0x0000, 0xc96e, 0xc96f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xa662, 0xa666, 0xc9c9, 0x0000, 0xa664, 0xa663, 0xc9c8, 0xa665,
+ /* b0 */ 0xa661, 0x0000, 0x0000, 0xa660, 0xc9ca, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa7a6, 0x0000, 0x0000, 0xa7a3, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01229 ***/
+
+ /* 80 */ 0xa77d, 0xcaaa, 0x0000, 0x0000, 0x0000, 0xcaab, 0x0000, 0xa7a1,
+ /* 88 */ 0x0000, 0xcaad, 0xa77b, 0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5,
+ /* 90 */ 0xa7a4, 0xa77c, 0xcaaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa959, 0xcbfe, 0x0000, 0xa95b, 0x0000, 0xa95a, 0x0000,
+ /* a8 */ 0xcc40, 0xa958, 0xa957, 0xcbf5, 0x0000, 0xcbf4, 0x0000, 0xcbf2,
+ /* b0 */ 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xcbfb, 0xa95c, 0xcc41, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59exx - offset 0x01269 ***/
+
+ /* 80 */ 0xcbf9, 0x0000, 0xabab, 0xa955, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xabac, 0xce54, 0x0000, 0x0000, 0xce5a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xabb2, 0xce58, 0xce5e, 0x0000, 0xce55,
+ /* 98 */ 0xce59, 0xce5b, 0xce5d, 0xce57, 0x0000, 0xce56, 0xce51, 0xce52,
+ /* a0 */ 0xabad, 0x0000, 0xabaf, 0xabae, 0xce53, 0xce5c, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xabb1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce50, 0xd153, 0x0000,
+ /* b8 */ 0xd152, 0xd157, 0xd14e, 0x0000, 0xd151, 0xd150, 0x0000, 0xd154,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x012a9 ***/
+
+ /* 80 */ 0x0000, 0xd158, 0xae47, 0xae4a, 0x0000, 0x0000, 0xd14f, 0xd155,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xae49, 0xd14a, 0x0000, 0xabb0, 0xd4ba,
+ /* 90 */ 0xd156, 0x0000, 0xd14d, 0x0000, 0xae48, 0xd14c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b1, 0x0000, 0x0000, 0xb0ec,
+ /* a0 */ 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, 0x0000, 0xd4c5,
+ /* a8 */ 0x0000, 0xd4c9, 0x0000, 0x0000, 0xd4c0, 0xd4b4, 0xd4bc, 0x0000,
+ /* b0 */ 0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5,
+ /* b8 */ 0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x012e9 ***/
+
+ /* 80 */ 0xd4b3, 0xd4c6, 0xb0f3, 0x0000, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb,
+ /* 88 */ 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0x0000,
+ /* 90 */ 0xd4c4, 0x0000, 0x0000, 0x0000, 0xd4ae, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd8a1, 0x0000, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0x0000,
+ /* a0 */ 0xb3fb, 0xb3f9, 0x0000, 0xd8a4, 0xb3f6, 0xd8a8, 0x0000, 0xd8a3,
+ /* a8 */ 0xd8a5, 0xd87d, 0xb3f4, 0x0000, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3,
+ /* b0 */ 0xb3f7, 0xb3f8, 0xd14b, 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e,
+ /* b8 */ 0xd8b0, 0xd8af, 0x0000, 0xd8b3, 0x0000, 0xdcef, 0x0000, 0xd8ac,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x01329 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5,
+ /* 90 */ 0x0000, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0x0000, 0xb6ee,
+ /* 98 */ 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0x0000, 0xdceb, 0xb6eb, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb6f5, 0xdcf0, 0xdce4, 0xdced, 0x0000, 0x0000,
+ /* a8 */ 0xdce3, 0x0000, 0x0000, 0xb6f1, 0x0000, 0xb6f3, 0x0000, 0xdce8,
+ /* b0 */ 0x0000, 0xdcf1, 0x0000, 0x0000, 0xe15d, 0xb9d0, 0xe163, 0x0000,
+ /* b8 */ 0x0000, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, 0xe15c,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x01369 ***/
+
+ /* 80 */ 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0x0000, 0xb9d6, 0xe15a, 0xe160,
+ /* 88 */ 0xe165, 0xe156, 0xb9d4, 0xe15e, 0x0000, 0x0000, 0xe162, 0xe168,
+ /* 90 */ 0xe158, 0xe161, 0x0000, 0xb9d3, 0xe167, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe159, 0x0000, 0x0000, 0x0000, 0xbc59, 0xe54b, 0xbc57, 0xbc56,
+ /* a0 */ 0xe54d, 0xe552, 0x0000, 0xe54e, 0x0000, 0xe551, 0xbc5c, 0x0000,
+ /* a8 */ 0xbea5, 0xbc5b, 0x0000, 0xe54a, 0xe550, 0x0000, 0xbc5a, 0xe54f,
+ /* b0 */ 0x0000, 0xe54c, 0x0000, 0xbc58, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe94d, 0xf9d9, 0xe94f, 0xe94a, 0xbec1, 0xe94c,
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x013a9 ***/
+
+ /* 80 */ 0x0000, 0xbec0, 0xe94e, 0x0000, 0x0000, 0xbec3, 0xe950, 0xbec2,
+ /* 88 */ 0xe949, 0xe94b, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0a5, 0xeccc,
+ /* 90 */ 0x0000, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0x0000,
+ /* 98 */ 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0x0000, 0xf1f7, 0xc361, 0xc362,
+ /* a0 */ 0x0000, 0x0000, 0xc363, 0xf442, 0xc45b, 0x0000, 0x0000, 0xf7d3,
+ /* a8 */ 0xf7d2, 0xc5f2, 0x0000, 0xa468, 0xa4d0, 0x0000, 0x0000, 0xa7a7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xce5f, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb3fc, 0xb3fd, 0x0000, 0xdcf2, 0xb9d8, 0xe169, 0xe553,
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x013e9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc95a, 0x0000, 0x0000, 0xcab0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcc42, 0xce60, 0xd159, 0xae4c,
+ /* 90 */ 0x0000, 0x0000, 0xf1f9, 0x0000, 0xc4dc, 0xa469, 0xa57e, 0xc970,
+ /* 98 */ 0x0000, 0xa667, 0xa668, 0x0000, 0xa95d, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb0f7, 0x0000, 0xb9da, 0x0000, 0xb9db, 0xb9d9, 0x0000, 0xa46a,
+ /* a8 */ 0x0000, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, 0xc971,
+ /* b0 */ 0x0000, 0xa5a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa669,
+ /* b8 */ 0xa66a, 0x0000, 0x0000, 0x0000, 0xc9cb, 0x0000, 0xa7a8, 0x0000,
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x01429 ***/
+
+ /* 80 */ 0xcab1, 0x0000, 0x0000, 0x0000, 0xa961, 0xcc43, 0x0000, 0xa95f,
+ /* 88 */ 0xa960, 0xa95e, 0xd15a, 0x0000, 0x0000, 0x0000, 0xabb6, 0xabb5,
+ /* 90 */ 0xabb7, 0xabb4, 0x0000, 0xce61, 0xa962, 0xabb3, 0x0000, 0xae4d,
+ /* 98 */ 0xae4e, 0x0000, 0xae4f, 0x0000, 0xd4cd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb3fe, 0xd8b4, 0xb0f8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6f8,
+ /* a8 */ 0x0000, 0xb9dd, 0xb9dc, 0xe16a, 0x0000, 0xbc5d, 0xbec4, 0x0000,
+ /* b0 */ 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0x0000, 0xa5a4, 0xc9d1,
+ /* b8 */ 0xa66c, 0xa66f, 0x0000, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2,
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x01469 ***/
+
+ /* 80 */ 0xc9cc, 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xa7b3, 0x0000, 0x0000, 0xa7b0, 0xcab6, 0xcab9,
+ /* 90 */ 0xcab8, 0x0000, 0xa7aa, 0xa7b2, 0x0000, 0x0000, 0xa7af, 0xcab5,
+ /* 98 */ 0xcab3, 0xa7ae, 0x0000, 0x0000, 0x0000, 0xa7a9, 0xa7ac, 0x0000,
+ /* a0 */ 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, 0xcab2, 0xcaba,
+ /* a8 */ 0xa7ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa967, 0xa96f,
+ /* b0 */ 0x0000, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0x0000,
+ /* b8 */ 0x0000, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0x0000,
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x014a9 ***/
+
+ /* 80 */ 0xcc51, 0xcc4a, 0x0000, 0xcc4d, 0x0000, 0xa972, 0xa969, 0xcc54,
+ /* 88 */ 0xcc52, 0x0000, 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46,
+ /* 90 */ 0xa96a, 0xa968, 0xa971, 0xa96d, 0xa965, 0x0000, 0xcc4e, 0x0000,
+ /* 98 */ 0xabb9, 0x0000, 0xabc0, 0xce6f, 0xabb8, 0xce67, 0xce63, 0x0000,
+ /* a0 */ 0xce73, 0xce62, 0x0000, 0xabbb, 0xce6c, 0xabbe, 0xabc1, 0x0000,
+ /* a8 */ 0xabbc, 0xce70, 0xabbf, 0x0000, 0xae56, 0xce76, 0xce64, 0x0000,
+ /* b0 */ 0x0000, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e,
+ /* b8 */ 0x0000, 0x0000, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74, 0xabba,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x014e9 ***/
+
+ /* 80 */ 0xce65, 0xabc2, 0x0000, 0xabbd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xae5c, 0xd162, 0x0000, 0xae5b, 0x0000, 0x0000, 0xd160,
+ /* 90 */ 0x0000, 0xae50, 0x0000, 0xae55, 0x0000, 0xd15f, 0xd15c, 0xd161,
+ /* 98 */ 0xae51, 0xd15b, 0x0000, 0xae54, 0xae52, 0x0000, 0xd163, 0xae53,
+ /* a0 */ 0xae57, 0x0000, 0x0000, 0xae58, 0x0000, 0xae5a, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xae59, 0x0000, 0x0000, 0x0000, 0xd15d, 0xd15e, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd164, 0x0000, 0xd4d4, 0xb0f9, 0xd8c2,
+ /* b8 */ 0xd4d3, 0xd4e6, 0x0000, 0x0000, 0xb140, 0x0000, 0xd4e4, 0x0000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01529 ***/
+
+ /* 80 */ 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, 0x0000, 0xb143, 0xd4ea,
+ /* 88 */ 0xd4e2, 0xb0fb, 0xb144, 0x0000, 0xd4e7, 0xd4e5, 0x0000, 0x0000,
+ /* 90 */ 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0x0000, 0xd4d0, 0xd4ec, 0xd4dc,
+ /* 98 */ 0xd4cf, 0x0000, 0xb142, 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7,
+ /* a0 */ 0xd4ce, 0x0000, 0xb141, 0x0000, 0xd4db, 0xd4d8, 0xb0fc, 0xd4d1,
+ /* a8 */ 0x0000, 0xd4e9, 0xb0fd, 0x0000, 0xd4d9, 0xd4d5, 0x0000, 0x0000,
+ /* b0 */ 0xd4e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb440,
+ /* b8 */ 0xd8bb, 0x0000, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0x0000, 0xb442,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x01569 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd8c6, 0xd8c3, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd8c4, 0xd8c7, 0xd8cb, 0x0000, 0xd4e3, 0xd8cd,
+ /* 90 */ 0xdd47, 0x0000, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0x0000, 0xd8c5,
+ /* 98 */ 0x0000, 0x0000, 0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7,
+ /* a0 */ 0x0000, 0x0000, 0xd8b9, 0x0000, 0x0000, 0xd8be, 0xd8bc, 0xb445,
+ /* a8 */ 0x0000, 0xd8c8, 0x0000, 0x0000, 0xd8bf, 0x0000, 0xd8c1, 0xd8b5,
+ /* b0 */ 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44, 0xdd40,
+ /* b8 */ 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc, 0xdcfb,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x015a9 ***/
+
+ /* 80 */ 0xdd41, 0xb6f9, 0xb741, 0x0000, 0xdcf4, 0x0000, 0xdcfe, 0xdcf3,
+ /* 88 */ 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe16e, 0xb9e2, 0xb9e1,
+ /* 98 */ 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, 0xe17c,
+ /* a0 */ 0xe175, 0xb9de, 0xe174, 0xb9e4, 0x0000, 0xe16d, 0xb9df, 0x0000,
+ /* a8 */ 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe173, 0xe555, 0xbc61, 0xe558, 0xe557,
+ /* b8 */ 0xe55a, 0xe55c, 0xf9dc, 0xbc5f, 0x0000, 0xe556, 0x0000, 0xe554,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x015e9 ***/
+
+ /* 80 */ 0x0000, 0xe55d, 0xe55b, 0xe559, 0x0000, 0xe55f, 0x0000, 0xe55e,
+ /* 88 */ 0xbc63, 0xbc5e, 0x0000, 0xbc60, 0xbc62, 0x0000, 0x0000, 0xe560,
+ /* 90 */ 0xe957, 0x0000, 0x0000, 0xe956, 0xe955, 0x0000, 0xe958, 0xe951,
+ /* 98 */ 0x0000, 0xe952, 0xe95a, 0xe953, 0x0000, 0xbec5, 0xe95c, 0x0000,
+ /* a0 */ 0xe95b, 0xe954, 0x0000, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3,
+ /* a8 */ 0xe959, 0x0000, 0xc0a7, 0x0000, 0xecd2, 0xecce, 0xecd6, 0xecd5,
+ /* b0 */ 0xc0a6, 0x0000, 0xecd0, 0x0000, 0xbec6, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc254, 0x0000, 0x0000, 0x0000, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01629 ***/
+
+ /* 80 */ 0xc45c, 0x0000, 0x0000, 0xc45d, 0x0000, 0xf443, 0x0000, 0xf5c8,
+ /* 88 */ 0xf5c7, 0x0000, 0x0000, 0xf6db, 0xf6dc, 0xf7d5, 0xf8a7, 0x0000,
+ /* 90 */ 0xa46c, 0xa46d, 0x0000, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, 0xa672,
+ /* 98 */ 0xa673, 0x0000, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0x0000, 0xa973,
+ /* a0 */ 0x0000, 0x0000, 0xcc55, 0xa975, 0xa974, 0xcc56, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xabc4, 0x0000, 0xae5d, 0xd165, 0x0000, 0xd4f0, 0x0000,
+ /* b0 */ 0xb145, 0xb447, 0xd4ef, 0xb446, 0x0000, 0xb9e5, 0x0000, 0xe17d,
+ /* b8 */ 0xbec7, 0x0000, 0xc0a9, 0xecd7, 0x0000, 0xc45e, 0x0000, 0xc570,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01669 ***/
+
+ /* 80 */ 0x0000, 0xc972, 0x0000, 0xa5a6, 0xc973, 0xa676, 0x0000, 0xa674,
+ /* 88 */ 0xa675, 0xa677, 0x0000, 0xa7ba, 0xa7b9, 0x0000, 0xcabc, 0xa7bb,
+ /* 90 */ 0x0000, 0x0000, 0xcabd, 0xcc57, 0x0000, 0xcc58, 0x0000, 0xa976,
+ /* 98 */ 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xabc8, 0xabc5, 0xabc7, 0xabc9, 0xabc6, 0xd166,
+ /* a8 */ 0xce77, 0x0000, 0x0000, 0x0000, 0xd168, 0xd167, 0xae63, 0x0000,
+ /* b0 */ 0xae5f, 0x0000, 0x0000, 0xae60, 0xae62, 0xae64, 0xae61, 0x0000,
+ /* b8 */ 0xae66, 0xae65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb14a,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x016a9 ***/
+
+ /* 80 */ 0xd4f2, 0xd4f1, 0xb149, 0x0000, 0xb148, 0xb147, 0xb14b, 0xb146,
+ /* 88 */ 0x0000, 0x0000, 0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0x0000,
+ /* 90 */ 0xb44b, 0xd8d4, 0xb448, 0xb44a, 0xd8d3, 0x0000, 0xdd48, 0x0000,
+ /* 98 */ 0xdd49, 0xdd4a, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9e6, 0xb9ee,
+ /* a0 */ 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7,
+ /* a8 */ 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0x0000, 0xbc64, 0xe95d,
+ /* b0 */ 0xbec8, 0xecd8, 0xecd9, 0x0000, 0x0000, 0xc364, 0xc45f, 0x0000,
+ /* b8 */ 0xa46f, 0x0000, 0xa678, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x016e8 ***/
+
+ /* 80 */ 0x0000, 0xabca, 0x0000, 0xd169, 0xae67, 0x0000, 0x0000, 0xb14e,
+ /* 88 */ 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470,
+ /* 90 */ 0xc95c, 0xa4d6, 0xc974, 0x0000, 0x0000, 0xc9d4, 0xa679, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa97c, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd4b,
+ /* a0 */ 0x0000, 0x0000, 0xa471, 0x0000, 0xa4d7, 0xc9d5, 0x0000, 0x0000,
+ /* a8 */ 0xcabe, 0x0000, 0xcabf, 0x0000, 0xa7bc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd8d8, 0xb44e, 0x0000, 0xdd4c, 0x0000, 0x0000, 0x0000, 0xc0aa,
+ /* b8 */ 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0x0000, 0xa7c0, 0xa7bf,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01728 ***/
+
+ /* 80 */ 0xa7bd, 0xa7be, 0x0000, 0x0000, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a,
+ /* 88 */ 0xa97d, 0x0000, 0x0000, 0xabce, 0xce78, 0xabcd, 0xabcb, 0xabcc,
+ /* 90 */ 0xae6a, 0xae68, 0x0000, 0x0000, 0xd16b, 0xae69, 0xd16a, 0x0000,
+ /* 98 */ 0xae5e, 0xd4f3, 0x0000, 0x0000, 0xb150, 0xb151, 0x0000, 0x0000,
+ /* a0 */ 0xb14f, 0x0000, 0xb9f0, 0xe1a2, 0xbc68, 0xbc69, 0x0000, 0xe561,
+ /* a8 */ 0xc0ab, 0xefc2, 0xefc3, 0x0000, 0xc4dd, 0xf8a8, 0xc94b, 0xa4d9,
+ /* b0 */ 0x0000, 0xa473, 0x0000, 0xc977, 0xc976, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xa67a, 0xc9d7, 0xc9d8, 0xc9d6, 0x0000, 0xc9d9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01767 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcac7, 0x0000,
+ /* 88 */ 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, 0xcac0, 0x0000, 0xcac1,
+ /* 90 */ 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcc68, 0x0000, 0xcc62,
+ /* a0 */ 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67,
+ /* a8 */ 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f,
+ /* b0 */ 0xcc6b, 0xa9a7, 0x0000, 0xa9a8, 0x0000, 0xcc5e, 0xcc6a, 0xa9a2,
+ /* b8 */ 0xa9a4, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x017a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xceab, 0xcea4,
+ /* 88 */ 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, 0x0000, 0xceac, 0xcea9,
+ /* 90 */ 0xce79, 0x0000, 0xabd0, 0xcea7, 0xcea8, 0x0000, 0xcea6, 0xce7c,
+ /* 98 */ 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0x0000, 0x0000, 0xcea1, 0xcead,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xae6f, 0x0000, 0xae6e, 0x0000, 0xd16c, 0xae6b, 0xd16e, 0x0000,
+ /* b0 */ 0xae70, 0xd16f, 0x0000, 0x0000, 0xae73, 0x0000, 0xae71, 0xd170,
+ /* b8 */ 0xceae, 0xd172, 0x0000, 0xae6d, 0x0000, 0xae6c, 0x0000, 0xd16d,
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x017e1 ***/
+
+ /* 80 */ 0xd171, 0xae72, 0x0000, 0x0000, 0x0000, 0x0000, 0xb153, 0xb152,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe,
+ /* 90 */ 0x0000, 0xb158, 0xd541, 0x0000, 0xb15a, 0x0000, 0xb156, 0xb15e,
+ /* 98 */ 0x0000, 0xb15b, 0xd4f7, 0xb155, 0x0000, 0xd4f6, 0xd4f4, 0xd543,
+ /* a0 */ 0xd4f8, 0x0000, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d,
+ /* a8 */ 0xd4fa, 0xb159, 0x0000, 0x0000, 0x0000, 0x0000, 0xd544, 0x0000,
+ /* b0 */ 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9,
+ /* b8 */ 0xd8ec, 0xd8ea, 0xd8e4, 0x0000, 0xd8ed, 0xd8e6, 0x0000, 0xd8de,
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01821 ***/
+
+ /* 80 */ 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0x0000, 0xd8f1, 0x0000, 0xb452,
+ /* 88 */ 0x0000, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f, 0x0000, 0xd8e1, 0x0000,
+ /* 90 */ 0xb450, 0xd8e0, 0xd8e5, 0x0000, 0x0000, 0xd8e2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd8e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd53, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdd56, 0xdd4e, 0x0000, 0xdd50, 0x0000, 0xdd55,
+ /* a8 */ 0xdd54, 0xb743, 0x0000, 0xd8db, 0xdd52, 0x0000, 0x0000, 0xb744,
+ /* b0 */ 0x0000, 0xdd4d, 0xdd51, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a9,
+ /* b8 */ 0x0000, 0xe1b0, 0xe1a7, 0x0000, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1,
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01861 ***/
+
+ /* 80 */ 0xe1a4, 0xe1a8, 0xe1a3, 0x0000, 0xb9f1, 0x0000, 0xe1a6, 0xb9f2,
+ /* 88 */ 0xe1ac, 0xe1ab, 0xe1aa, 0x0000, 0x0000, 0xe1af, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe565, 0xe567, 0xbc6b, 0xe568, 0x0000, 0xe563,
+ /* 98 */ 0x0000, 0xe562, 0xe56c, 0x0000, 0xe56a, 0xbc6a, 0xe56d, 0xe564,
+ /* a0 */ 0xe569, 0xe56b, 0xe566, 0x0000, 0x0000, 0x0000, 0x0000, 0xe961,
+ /* a8 */ 0xe966, 0xe960, 0xe965, 0x0000, 0xe95e, 0xe968, 0xe964, 0xe969,
+ /* b0 */ 0xe963, 0xe95f, 0xe967, 0x0000, 0xe96a, 0xe962, 0x0000, 0xecda,
+ /* b8 */ 0xc0af, 0x0000, 0xc0ad, 0x0000, 0xc0ac, 0xc0ae, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x018a1 ***/
+
+ /* 80 */ 0xefc4, 0x0000, 0xf172, 0xf1fd, 0x0000, 0x0000, 0xf444, 0xf445,
+ /* 88 */ 0x0000, 0xc460, 0x0000, 0xf5c9, 0x0000, 0xc4de, 0x0000, 0xf5ca,
+ /* 90 */ 0x0000, 0xf6de, 0xc572, 0x0000, 0xc571, 0xf6dd, 0xc5c9, 0x0000,
+ /* 98 */ 0xf7d6, 0x0000, 0x0000, 0x0000, 0x0000, 0xa474, 0xa67b, 0xc9da,
+ /* a0 */ 0xcaca, 0xa8b5, 0xb15f, 0x0000, 0x0000, 0xa475, 0xa5aa, 0xa5a9,
+ /* a8 */ 0xa5a8, 0x0000, 0x0000, 0xa7c5, 0x0000, 0x0000, 0xae74, 0x0000,
+ /* b0 */ 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0x0000, 0x0000, 0xabd1,
+ /* b8 */ 0x0000, 0xceaf, 0x0000, 0x0000, 0x0000, 0xb453, 0xa479, 0xc95d,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x018e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xa5ab, 0xa5ac, 0xc978, 0x0000, 0xa67c, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcacb, 0x0000, 0xa7c6, 0x0000, 0xcacc, 0x0000,
+ /* 90 */ 0x0000, 0xa9ae, 0x0000, 0x0000, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d,
+ /* 98 */ 0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0x0000, 0xabd2, 0x0000, 0xabd4,
+ /* a0 */ 0xceb3, 0xceb0, 0xceb1, 0xceb2, 0xceb4, 0xabd3, 0x0000, 0x0000,
+ /* a8 */ 0xd174, 0xd173, 0x0000, 0xae76, 0x0000, 0xae75, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xb162, 0xd546, 0x0000, 0xb161, 0xb163,
+ /* b8 */ 0xb160, 0x0000, 0x0000, 0x0000, 0x0000, 0xb455, 0xd545, 0x0000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01921 ***/
+
+ /* 80 */ 0xb456, 0xd8f3, 0x0000, 0xb457, 0xd8f2, 0xb454, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe1b4, 0xb9f7, 0xb9f5, 0x0000, 0xb9f6,
+ /* 98 */ 0xe1b2, 0xe1b3, 0x0000, 0xb9f3, 0xe571, 0xe56f, 0x0000, 0xbc6d,
+ /* a0 */ 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0x0000, 0x0000, 0xe96d, 0xe96b,
+ /* a8 */ 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e,
+ /* b0 */ 0xf1fe, 0x0000, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0x0000,
+ /* b8 */ 0xa9af, 0xb746, 0x0000, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0x0000,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01961 ***/
+
+ /* 80 */ 0xc979, 0x0000, 0xc97a, 0x0000, 0xc9dc, 0x0000, 0x0000, 0xa7c8,
+ /* 88 */ 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0x0000, 0xa7c7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9b3, 0xa9b4, 0xa9b1,
+ /* 98 */ 0x0000, 0x0000, 0xa9b0, 0xceb8, 0xa9b2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xabd6, 0x0000, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79,
+ /* a8 */ 0xd175, 0x0000, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0x0000,
+ /* b0 */ 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164,
+ /* b8 */ 0xb165, 0xd549, 0x0000, 0x0000, 0x0000, 0x0000, 0xb168,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x019a0 ***/
+
+ /* 80 */ 0x0000, 0xb45a, 0xb45b, 0x0000, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61,
+ /* 88 */ 0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0x0000, 0xe1b8, 0x0000,
+ /* 90 */ 0x0000, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7,
+ /* 98 */ 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71,
+ /* a0 */ 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0x0000, 0xe973, 0xe971, 0xe970,
+ /* a8 */ 0xe972, 0xe96f, 0x0000, 0x0000, 0xc366, 0x0000, 0xf446, 0xf447,
+ /* b0 */ 0x0000, 0xf5cb, 0xf6df, 0xc655, 0x0000, 0x0000, 0xa9b5, 0xa7ca,
+ /* b8 */ 0x0000, 0x0000, 0xabd8, 0x0000, 0x0000, 0x0000, 0xa47b, 0xa4dc,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x019e0 ***/
+
+ /* 80 */ 0x0000, 0xa5af, 0xc9dd, 0x0000, 0xa7cb, 0xcad2, 0x0000, 0xcebb,
+ /* 88 */ 0xabd9, 0x0000, 0xb9fa, 0xa47c, 0x0000, 0x0000, 0x0000, 0xa6a1,
+ /* 90 */ 0x0000, 0x0000, 0xb749, 0xa47d, 0xa4dd, 0xa4de, 0x0000, 0xa5b1,
+ /* 98 */ 0xa5b0, 0x0000, 0xc9de, 0xa6a2, 0x0000, 0xcad3, 0x0000, 0xa7cc,
+ /* a0 */ 0x0000, 0x0000, 0xcc71, 0xcc72, 0xcc73, 0x0000, 0xa9b6, 0xa9b7,
+ /* a8 */ 0xcc70, 0xa9b8, 0x0000, 0x0000, 0x0000, 0xabda, 0xcebc, 0x0000,
+ /* b0 */ 0xd17a, 0xae7a, 0x0000, 0xd179, 0x0000, 0xb169, 0xd54c, 0xb16a,
+ /* b8 */ 0xd54d, 0x0000, 0x0000, 0x0000, 0xb45d, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01a20 ***/
+
+ /* 80 */ 0xdd62, 0x0000, 0x0000, 0xe1bf, 0xe1be, 0x0000, 0xb9fb, 0x0000,
+ /* 88 */ 0xbc75, 0xe576, 0xbeca, 0xe974, 0xc0b1, 0x0000, 0xc573, 0xf7d8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcc74, 0x0000, 0xcebd, 0xb16b,
+ /* 98 */ 0xd8f4, 0xb74a, 0x0000, 0x0000, 0x0000, 0xc255, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xa7ce, 0x0000, 0xa7cd, 0xabdb, 0x0000, 0xd17b,
+ /* a8 */ 0x0000, 0xb16d, 0xb343, 0xb16e, 0xb16c, 0xb45e, 0x0000, 0xe1c0,
+ /* b0 */ 0xb9fc, 0xbc76, 0x0000, 0xc94c, 0xc9df, 0x0000, 0xcad5, 0xa7cf,
+ /* b8 */ 0xcad4, 0xa7d0, 0x0000, 0x0000, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01a60 ***/
+
+ /* 80 */ 0xa9b9, 0xa9ba, 0xcc75, 0x0000, 0x0000, 0xabdd, 0xcebe, 0xabe0,
+ /* 88 */ 0xabdc, 0xabe2, 0xabde, 0xabdf, 0xabe1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xae7d, 0xae7c, 0xae7b, 0x0000, 0x0000, 0x0000, 0xd54f, 0xb16f,
+ /* 98 */ 0xb172, 0xb170, 0x0000, 0xd54e, 0xb175, 0x0000, 0xb171, 0xd550,
+ /* a0 */ 0xb174, 0xb173, 0x0000, 0x0000, 0x0000, 0xd8f6, 0xd8f5, 0x0000,
+ /* a8 */ 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63,
+ /* b0 */ 0x0000, 0x0000, 0xe577, 0x0000, 0x0000, 0xbc78, 0xe1c1, 0xbc77,
+ /* b8 */ 0x0000, 0xb9fd, 0x0000, 0xecde, 0xe975, 0xc0b2, 0xecdd, 0xf240,
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01aa0 ***/
+
+ /* 80 */ 0xf448, 0xf449, 0x0000, 0xa4df, 0x0000, 0xa5b2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc97b, 0x0000, 0x0000, 0xa7d2, 0xa7d4, 0x0000, 0xc9e2,
+ /* 90 */ 0xcad8, 0xcad7, 0xcad6, 0x0000, 0xc9e1, 0xc9e0, 0xa6a4, 0xa7d3,
+ /* 98 */ 0xa7d1, 0xa6a3, 0x0000, 0x0000, 0x0000, 0xa9bd, 0xcc78, 0x0000,
+ /* a0 */ 0xa9be, 0xcadd, 0x0000, 0xcadf, 0xcade, 0xcc79, 0x0000, 0x0000,
+ /* a8 */ 0xcada, 0x0000, 0xa7d8, 0xa7d6, 0x0000, 0xcad9, 0xcadb, 0xcae1,
+ /* b0 */ 0x0000, 0xa7d5, 0x0000, 0xcadc, 0xcae5, 0xa9c0, 0x0000, 0xcae2,
+ /* b8 */ 0xa7d7, 0x0000, 0xcae0, 0xcae3, 0x0000, 0xa9bf, 0x0000, 0xa9c1,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01ae0 ***/
+
+ /* 80 */ 0xcae4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xccaf, 0xcca2, 0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2,
+ /* 90 */ 0xccaa, 0xccad, 0xabe3, 0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3,
+ /* 98 */ 0x0000, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, 0xabe4, 0xcca6, 0x0000,
+ /* a0 */ 0xabe5, 0xa9c9, 0xcca8, 0x0000, 0xcecd, 0xabe6, 0xcc7b, 0xa9ca,
+ /* a8 */ 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, 0xa9c4,
+ /* b0 */ 0x0000, 0x0000, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0x0000, 0xcebf,
+ /* b8 */ 0x0000, 0xcec0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e681xx - offset 0x01b20 ***/
+
+ /* 80 */ 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6,
+ /* 88 */ 0x0000, 0xcec7, 0x0000, 0x0000, 0xcec9, 0xabe9, 0x0000, 0x0000,
+ /* 90 */ 0xaea3, 0x0000, 0xf9da, 0xcec5, 0xcec1, 0xaea4, 0x0000, 0x0000,
+ /* 98 */ 0xcecf, 0xae7e, 0xd17d, 0xcec8, 0x0000, 0xd17c, 0xcec3, 0xcecc,
+ /* a0 */ 0x0000, 0x0000, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0, 0xd17e,
+ /* a8 */ 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1, 0xaea7,
+ /* b0 */ 0xabea, 0x0000, 0xcec2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb176,
+
+ /*** Three byte table, leaf: e682xx - offset 0x01b60 ***/
+
+ /* 80 */ 0xd1a4, 0xd1a6, 0x0000, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac,
+ /* 88 */ 0xd1a3, 0xb178, 0xd551, 0x0000, 0xaead, 0xaeab, 0xd1ae, 0x0000,
+ /* 90 */ 0xd552, 0x0000, 0xd1a5, 0x0000, 0xaeac, 0xd1a9, 0xaeaf, 0xd1ab,
+ /* 98 */ 0x0000, 0x0000, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0x0000, 0xaea9,
+ /* a0 */ 0xb179, 0x0000, 0xd1a2, 0xb177, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb17a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd555, 0xd55e, 0xb464, 0x0000, 0xb17c, 0xb1a3, 0xb465, 0xd560,
+ /* b8 */ 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562,
+
+ /*** Three byte table, leaf: e683xx - offset 0x01ba0 ***/
+
+ /* 80 */ 0xd565, 0xd949, 0x0000, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac,
+ /* 88 */ 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559,
+ /* 90 */ 0x0000, 0xb462, 0x0000, 0xd557, 0xd558, 0xb1a7, 0x0000, 0x0000,
+ /* 98 */ 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c, 0x0000, 0xb1a9,
+ /* a0 */ 0xb466, 0xb463, 0xd8fb, 0x0000, 0xd55a, 0x0000, 0xb17d, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65,
+ /* b8 */ 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0x0000, 0xd948, 0xd94e,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01be0 ***/
+
+ /* 80 */ 0xb473, 0xb754, 0x0000, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0x0000,
+ /* 88 */ 0xb755, 0xb472, 0xd941, 0xd950, 0x0000, 0xb75d, 0xb470, 0xb74e,
+ /* 90 */ 0xd94d, 0x0000, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942, 0x0000,
+ /* 98 */ 0xd94b, 0x0000, 0xb74d, 0xb752, 0xb467, 0xd94c, 0x0000, 0xb750,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xb468, 0x0000, 0x0000, 0x0000, 0xb75c,
+ /* a8 */ 0xe1c3, 0xdd70, 0x0000, 0xdd68, 0xe1c2, 0x0000, 0xdd6c, 0xdd6e,
+ /* b0 */ 0x0000, 0x0000, 0xdd6b, 0x0000, 0xb75b, 0x0000, 0xdd6a, 0xb75f,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe1d2, 0x0000, 0x0000, 0xb75a, 0xba40,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01c20 ***/
+
+ /* 80 */ 0xdd71, 0xe1c4, 0x0000, 0x0000, 0xb758, 0xdd69, 0xdd6d, 0xb9fe,
+ /* 88 */ 0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f,
+ /* 90 */ 0x0000, 0x0000, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0x0000,
+ /* 98 */ 0xba47, 0x0000, 0xba46, 0xe1d0, 0x0000, 0xbc7c, 0xe1c5, 0xba45,
+ /* a0 */ 0x0000, 0xe1d4, 0xba43, 0xba44, 0x0000, 0xe1d1, 0xe5aa, 0xbc7a,
+ /* a8 */ 0xb46e, 0x0000, 0xe1d3, 0xbca3, 0xe1cb, 0x0000, 0xbc7b, 0x0000,
+ /* b0 */ 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, 0xba48, 0xbc79, 0xba42,
+ /* b8 */ 0x0000, 0xe57a, 0xe1cf, 0x0000, 0xbca1, 0x0000, 0xbca4, 0x0000,
+
+ /*** Three byte table, leaf: e686xx - offset 0x01c60 ***/
+
+ /* 80 */ 0xe1cc, 0x0000, 0xbc7e, 0xe579, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0x0000,
+ /* 90 */ 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0x0000, 0xe978, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xbcaa, 0xe5a1, 0x0000, 0xe976, 0x0000, 0xe5a5,
+ /* a0 */ 0x0000, 0xe5a8, 0xe57d, 0x0000, 0xbcab, 0x0000, 0x0000, 0xbca5,
+ /* a8 */ 0xe977, 0xbecd, 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3,
+ /* b0 */ 0xe57c, 0xe57b, 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0x0000,
+ /* b8 */ 0xe9a2, 0x0000, 0xe97e, 0x0000, 0xece1, 0x0000, 0xbed1, 0xe9a1,
+
+ /*** Three byte table, leaf: e687xx - offset 0x01ca0 ***/
+
+ /* 80 */ 0x0000, 0xe97c, 0xc0b4, 0xecdf, 0x0000, 0xe979, 0xe97b, 0xc0b5,
+ /* 88 */ 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefcf, 0x0000,
+ /* 98 */ 0xefc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xece7, 0xefc8,
+ /* a0 */ 0xece3, 0x0000, 0x0000, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2,
+ /* a8 */ 0xece6, 0xefd0, 0xefcc, 0xefce, 0x0000, 0xefc9, 0xefca, 0x0000,
+ /* b0 */ 0xefcd, 0xefcb, 0xc367, 0x0000, 0x0000, 0xc36a, 0xc369, 0xc368,
+ /* b8 */ 0xc461, 0xf44a, 0xc462, 0xf241, 0xc4df, 0xf5cc, 0xc4e0, 0xc574,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01ce0 ***/
+
+ /* 80 */ 0xc5ca, 0xf7d9, 0x0000, 0xf7da, 0xf7db, 0x0000, 0x0000, 0xf9ba,
+ /* 88 */ 0xa4e0, 0xc97c, 0xa5b3, 0x0000, 0xa6a6, 0xa6a7, 0xa6a5, 0x0000,
+ /* 90 */ 0xa6a8, 0xa7da, 0xa7d9, 0x0000, 0xccb1, 0xa9cf, 0xa9ce, 0x0000,
+ /* 98 */ 0x0000, 0xd1af, 0xb1ad, 0xb1ae, 0x0000, 0x0000, 0x0000, 0xb475,
+ /* a0 */ 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0x0000, 0xe1d7,
+ /* a8 */ 0x0000, 0xe1d6, 0xba49, 0xe1d8, 0x0000, 0xe5ac, 0xbcae, 0x0000,
+ /* b0 */ 0xbed4, 0x0000, 0xc0b8, 0xc257, 0xc0b9, 0x0000, 0xa4e1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcae6, 0x0000, 0x0000, 0xccb2, 0xa9d1, 0xa9d0,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01d20 ***/
+
+ /* 80 */ 0xa9d2, 0xabf3, 0xced2, 0xced3, 0x0000, 0x0000, 0xd1b0, 0xaeb0,
+ /* 88 */ 0xb1af, 0xb476, 0xd951, 0xa4e2, 0x0000, 0xa47e, 0xa4e3, 0x0000,
+ /* 90 */ 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0x0000, 0xc9e4, 0x0000,
+ /* a0 */ 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7e1, 0xa7ea, 0xa7e8,
+ /* b0 */ 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0x0000, 0xa7df, 0xcaf3,
+ /* b8 */ 0x0000, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01d60 ***/
+
+ /* 80 */ 0xa7de, 0xcaf1, 0x0000, 0xcae7, 0xa7db, 0x0000, 0xa7ee, 0xcaec,
+ /* 88 */ 0xcaf2, 0xa7e0, 0xa7e2, 0x0000, 0xcae8, 0x0000, 0xcae9, 0xcaea,
+ /* 90 */ 0x0000, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc,
+ /* 98 */ 0xa7e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, 0xccbc,
+ /* b0 */ 0xccbf, 0xa9ea, 0x0000, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0x0000,
+ /* b8 */ 0xccc0, 0xa9d9, 0x0000, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01da0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xa9d8, 0x0000, 0xa9d6, 0x0000, 0xa9ee, 0xa9e6,
+ /* 88 */ 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4,
+ /* 90 */ 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0x0000, 0xa9ec, 0xa9ed,
+ /* 98 */ 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xceda, 0xac41, 0xabf8, 0xabfa, 0xac40,
+ /* b0 */ 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, 0xced7, 0xcedf, 0xabfe,
+ /* b8 */ 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, 0xabfb, 0xac42, 0xaeb3,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01de0 ***/
+
+ /* 80 */ 0xcee0, 0xabf9, 0xac45, 0xced9, 0x0000, 0x0000, 0x0000, 0xabfc,
+ /* 88 */ 0xaeb2, 0xabf6, 0x0000, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc,
+ /* 90 */ 0xd1b2, 0xac44, 0x0000, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xaec1, 0xd1be, 0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0x0000, 0xaeb6,
+ /* b0 */ 0x0000, 0x0000, 0xd566, 0xd1c6, 0xd1c0, 0x0000, 0xd1b7, 0x0000,
+ /* b8 */ 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0x0000,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x01e20 ***/
+
+ /* 80 */ 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5,
+ /* 88 */ 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba,
+ /* 90 */ 0xaebd, 0xd1c8, 0x0000, 0x0000, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca,
+ /* 98 */ 0xd1c1, 0xd1c3, 0xd1c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd567, 0x0000, 0xb1b7,
+ /* a8 */ 0xb1cb, 0xb1ca, 0x0000, 0xb1bf, 0x0000, 0xd579, 0xd575, 0xd572,
+ /* b0 */ 0xd5a6, 0xb1ba, 0xb1b2, 0x0000, 0x0000, 0xd577, 0xb4a8, 0xb1b6,
+ /* b8 */ 0xd5a1, 0x0000, 0xb1cc, 0xb1c9, 0xd57b, 0xd56a, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68exx - offset 0x01e60 ***/
+
+ /* 80 */ 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, 0xd5a2, 0x0000, 0xd573,
+ /* 88 */ 0xb1c2, 0xb1bc, 0xd568, 0x0000, 0xb478, 0xd5a5, 0xd571, 0xb1c7,
+ /* 90 */ 0xd574, 0xd5a4, 0xb1c6, 0x0000, 0xd952, 0x0000, 0xb1b3, 0xd56f,
+ /* 98 */ 0xb1b8, 0xb1c3, 0x0000, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e,
+ /* a0 */ 0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0x0000, 0xb1b1,
+ /* a8 */ 0xb1c0, 0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576,
+ /* b0 */ 0xd954, 0xd953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd56b, 0xd964, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x01ea0 ***/
+
+ /* 80 */ 0xb47a, 0x0000, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b,
+ /* 88 */ 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479,
+ /* 90 */ 0xb4a3, 0x0000, 0xb4a1, 0xd969, 0x0000, 0xd95f, 0xb4a5, 0xd970,
+ /* 98 */ 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0x0000, 0xd963,
+ /* a0 */ 0xd95d, 0xb4a4, 0x0000, 0xb4a2, 0xd1b9, 0xd956, 0x0000, 0xddb7,
+ /* a8 */ 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0x0000, 0xb4a6, 0xb4a7, 0xd958,
+ /* b0 */ 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, 0xd95e, 0x0000,
+ /* b8 */ 0x0000, 0xb4ae,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x01eda ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb770, 0x0000,
+ /* 88 */ 0x0000, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769,
+ /* 90 */ 0xdd7a, 0x0000, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f,
+ /* 98 */ 0xdda5, 0x0000, 0xddb2, 0xddb8, 0xb76a, 0x0000, 0xb764, 0xdda3,
+ /* a0 */ 0xdd7d, 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5,
+ /* a8 */ 0xddad, 0x0000, 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0,
+ /* b0 */ 0xddac, 0x0000, 0x0000, 0xdda1, 0xba53, 0xddaf, 0xb76d, 0xdda7,
+ /* b8 */ 0x0000, 0xdda6, 0x0000, 0x0000, 0x0000, 0xb767, 0xb763, 0xe1ee,
+
+ /*** Three byte table, leaf: e691xx - offset 0x01f1a ***/
+
+ /* 80 */ 0xddb3, 0xddae, 0x0000, 0xdda2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe1e9, 0x0000, 0xe1da, 0xe1e5, 0x0000,
+ /* 90 */ 0xe1ec, 0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xba4b, 0xe1f1, 0x0000, 0xe1db, 0xe1e8, 0xe1dc, 0xe1e7, 0xba4f,
+ /* a0 */ 0xe1eb, 0xd962, 0x0000, 0x0000, 0x0000, 0xe1f2, 0xe1e3, 0xba52,
+ /* a8 */ 0xe5ba, 0xbcaf, 0x0000, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0,
+ /* b0 */ 0xe5ae, 0x0000, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3,
+ /* b8 */ 0xba4e, 0xbcb1, 0xba50, 0xba55, 0x0000, 0xe1e1, 0x0000, 0xe1ed,
+
+ /*** Three byte table, leaf: e692xx - offset 0x01f5a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1e6, 0x0000, 0x0000, 0xe5b1, 0x0000, 0xba4a,
+ /* 88 */ 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0x0000, 0x0000, 0xe5b4,
+ /* 90 */ 0xbcb5, 0x0000, 0xbcbb, 0xbcb8, 0x0000, 0xbcb9, 0xe5af, 0xe5b2,
+ /* 98 */ 0xe5bc, 0xbcc1, 0xbcbf, 0x0000, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9,
+ /* a0 */ 0xe5b0, 0x0000, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0x0000,
+ /* a8 */ 0x0000, 0xbcba, 0x0000, 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0x0000,
+ /* b0 */ 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf,
+
+ /*** Three byte table, leaf: e693xx - offset 0x01f9a ***/
+
+ /* 80 */ 0x0000, 0xbed6, 0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0x0000, 0xbedc,
+ /* 88 */ 0x0000, 0xe9a8, 0xc0bb, 0xbed7, 0x0000, 0xbede, 0xc0ba, 0xe9a7,
+ /* 90 */ 0xe9a6, 0x0000, 0xbee0, 0x0000, 0xbee1, 0x0000, 0xe9a5, 0xe9a4,
+ /* 98 */ 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc0bd, 0x0000, 0xc0c2, 0xecea, 0xecec, 0x0000, 0xc0bf, 0x0000,
+ /* a8 */ 0xeced, 0xece9, 0x0000, 0xeceb, 0xc0c0, 0xc0c3, 0x0000, 0xece8,
+ /* b0 */ 0xc0be, 0xc0c1, 0xc259, 0xe9ad, 0xc258, 0x0000, 0x0000, 0xc25e,
+ /* b8 */ 0xefd4, 0x0000, 0xc25c, 0xc25d, 0xefd7, 0xefd3, 0xc25a, 0xefd1,
+
+ /*** Three byte table, leaf: e694xx - offset 0x01fda ***/
+
+ /* 80 */ 0xc36b, 0xefd5, 0x0000, 0xefd6, 0xefd2, 0x0000, 0xc25b, 0xf242,
+ /* 88 */ 0x0000, 0xf245, 0x0000, 0x0000, 0xf246, 0xf244, 0xf247, 0xc36c,
+ /* 90 */ 0xf243, 0x0000, 0x0000, 0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b,
+ /* 98 */ 0xc463, 0xc465, 0x0000, 0xf5cd, 0xc4e2, 0xc4e1, 0x0000, 0x0000,
+ /* a0 */ 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0x0000,
+ /* a8 */ 0x0000, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4,
+ /* b0 */ 0x0000, 0x0000, 0xd972, 0xe9af, 0x0000, 0x0000, 0xa6ac, 0xcaf7,
+ /* b8 */ 0xa7f1, 0xa7ef, 0x0000, 0xa7f0, 0x0000, 0xccc1, 0xa9f1, 0xac46,
+
+ /*** Three byte table, leaf: e695xx - offset 0x0201a ***/
+
+ /* 80 */ 0x0000, 0xcee7, 0x0000, 0xcee8, 0x0000, 0xac47, 0xd1ce, 0x0000,
+ /* 88 */ 0xaec4, 0xaec5, 0xd1cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1d3,
+ /* 90 */ 0x0000, 0xb1cf, 0x0000, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1,
+ /* 98 */ 0xb1d4, 0xb1d0, 0x0000, 0x0000, 0xd976, 0xb1cd, 0xb4af, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, 0xd973,
+ /* a8 */ 0xd977, 0x0000, 0xd974, 0x0000, 0xb771, 0x0000, 0x0000, 0xddbc,
+ /* b0 */ 0x0000, 0x0000, 0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5,
+ /* b8 */ 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, 0x0000, 0x0000, 0xe9b0,
+
+ /*** Three byte table, leaf: e696xx - offset 0x0205a ***/
+
+ /* 80 */ 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0x0000, 0x0000, 0xa4e5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd979, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb4b4, 0xb4b3, 0xddbd, 0x0000, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6,
+ /* 98 */ 0x0000, 0xaec6, 0x0000, 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772,
+ /* a0 */ 0xe1f5, 0xba57, 0xe9b2, 0x0000, 0xa4e7, 0xa5b8, 0x0000, 0xa9f2,
+ /* a8 */ 0xccc2, 0x0000, 0xcee9, 0xac48, 0xb1d9, 0x0000, 0xd97c, 0xb4b5,
+ /* b0 */ 0xb773, 0x0000, 0xe5c1, 0xe5c2, 0x0000, 0x0000, 0xecf0, 0xc25f,
+ /* b8 */ 0xf8f0, 0xa4e8, 0x0000, 0xccc3, 0xa9f3, 0xac49, 0x0000, 0xceea,
+
+ /*** Three byte table, leaf: e697xx - offset 0x0209a ***/
+
+ /* 80 */ 0x0000, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da,
+ /* 90 */ 0xd97d, 0x0000, 0xd97e, 0xddbe, 0x0000, 0x0000, 0xba59, 0xba58,
+ /* 98 */ 0x0000, 0x0000, 0xecf1, 0xefd9, 0x0000, 0xf24a, 0xf249, 0xf44f,
+ /* a0 */ 0x0000, 0xc95e, 0xac4a, 0x0000, 0x0000, 0xa4e9, 0xa5b9, 0x0000,
+ /* a8 */ 0xa6ae, 0xa6ad, 0x0000, 0x0000, 0xa6af, 0xa6b0, 0xc9ee, 0xc9ed,
+ /* b0 */ 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e698xx - offset 0x020da ***/
+
+ /* 80 */ 0xa9fb, 0x0000, 0xa9f9, 0xccca, 0xccc6, 0xcccd, 0xa9f8, 0xaa40,
+ /* 88 */ 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc,
+ /* 90 */ 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5, 0xa9fd, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xceef, 0xcef5, 0x0000, 0xac50,
+ /* a0 */ 0xac4d, 0xceec, 0xcef1, 0x0000, 0xac53, 0xac4b, 0xcef0, 0xac4e,
+ /* a8 */ 0xac51, 0x0000, 0x0000, 0xcef3, 0x0000, 0xac4c, 0xcef8, 0xac4f,
+ /* b0 */ 0x0000, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0x0000,
+ /* b8 */ 0x0000, 0xcef7, 0xcef4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e699xx - offset 0x02119 ***/
+
+ /* 80 */ 0x0000, 0xaed0, 0xaec9, 0xaecc, 0x0000, 0xaecf, 0x0000, 0xd1d5,
+ /* 88 */ 0x0000, 0xaeca, 0xd1d3, 0x0000, 0xaece, 0x0000, 0x0000, 0xaecb,
+ /* 90 */ 0x0000, 0xd1d6, 0xaecd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, 0xb1de, 0xb1e3, 0xd1d4,
+ /* a0 */ 0x0000, 0xd5aa, 0xd5ae, 0x0000, 0xb1e0, 0xd5a9, 0xb1e2, 0x0000,
+ /* a8 */ 0xb1e1, 0x0000, 0xd9a7, 0x0000, 0xd9a2, 0x0000, 0xb4b6, 0xb4ba,
+ /* b0 */ 0xb4b7, 0xd9a5, 0xd9a8, 0x0000, 0xb4b8, 0x0000, 0xb4b9, 0xb4be,
+ /* b8 */ 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0x0000, 0xb4bd, 0x0000,
+
+ /*** Three byte table, leaf: e69axx - offset 0x02159 ***/
+
+ /* 80 */ 0xd9a4, 0x0000, 0x0000, 0x0000, 0xb779, 0x0000, 0xddbf, 0xb776,
+ /* 88 */ 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0, 0xb77b, 0x0000, 0x0000,
+ /* 90 */ 0xddc2, 0xb4bb, 0x0000, 0x0000, 0xddc6, 0xddc1, 0xb778, 0xb774,
+ /* 98 */ 0xb77a, 0xddc5, 0x0000, 0x0000, 0x0000, 0xba5c, 0x0000, 0xe1f8,
+ /* a0 */ 0xe1f7, 0xe1f6, 0xba5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0x0000, 0x0000, 0xbcc7, 0xe5c9,
+ /* b0 */ 0xe5c4, 0xbcca, 0xe5c6, 0x0000, 0xbcc9, 0xe5c3, 0x0000, 0xe5c7,
+ /* b8 */ 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0x0000, 0xe9b9, 0xe9b4, 0x0000,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x02199 ***/
+
+ /* 80 */ 0xe9b5, 0x0000, 0x0000, 0x0000, 0xbee7, 0x0000, 0xbee4, 0xbee8,
+ /* 88 */ 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7, 0xe9bc, 0x0000, 0x0000, 0xe9b8,
+ /* 90 */ 0x0000, 0x0000, 0xecf2, 0x0000, 0x0000, 0x0000, 0xc0c7, 0x0000,
+ /* 98 */ 0xefdc, 0xc0c6, 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0x0000,
+ /* a0 */ 0xc36d, 0x0000, 0x0000, 0xf451, 0xf452, 0x0000, 0xc466, 0x0000,
+ /* a8 */ 0xf450, 0xc4e4, 0x0000, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0x0000,
+ /* b0 */ 0xa4ea, 0x0000, 0xa6b1, 0xa6b2, 0xa7f3, 0x0000, 0xccd1, 0xac54,
+ /* b8 */ 0xaed1, 0xb1e4, 0x0000, 0x0000, 0xb0d2, 0x0000, 0xb4bf, 0xb4c0,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x021d9 ***/
+
+ /* 80 */ 0xb3cc, 0xd9a9, 0x0000, 0xb77c, 0xe1fa, 0xe1f9, 0x0000, 0x0000,
+ /* 88 */ 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0x0000, 0xaa41, 0x0000, 0xcef9,
+ /* 90 */ 0xcefa, 0x0000, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0x0000, 0xaed4,
+ /* 98 */ 0xd5af, 0x0000, 0x0000, 0xb1e6, 0x0000, 0xb4c2, 0x0000, 0xb4c1,
+ /* a0 */ 0xddc8, 0xdf7a, 0xe1fb, 0xe9bd, 0x0000, 0x0000, 0xc261, 0xc467,
+ /* a8 */ 0xa4ec, 0x0000, 0xa5bc, 0xa5bd, 0xa5bb, 0xa5be, 0xa5ba, 0x0000,
+ /* b0 */ 0x0000, 0xa6b6, 0x0000, 0xc9f6, 0xa6b5, 0xa6b7, 0x0000, 0x0000,
+ /* b8 */ 0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x02219 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafd, 0xa7fd, 0xcafe,
+ /* 88 */ 0xcb43, 0xa7fc, 0x0000, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, 0xa7f6,
+ /* 90 */ 0xa7f7, 0xa7f8, 0x0000, 0xa840, 0x0000, 0xcb41, 0xa7fa, 0xa841,
+ /* 98 */ 0x0000, 0xcb40, 0xcb46, 0x0000, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4,
+ /* a0 */ 0xa7fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xaa57, 0x0000, 0xccd4, 0xaa43, 0x0000, 0xaa4d,
+ /* b0 */ 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49,
+ /* b8 */ 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02259 ***/
+
+ /* 80 */ 0x0000, 0xcce5, 0x0000, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a,
+ /* 88 */ 0x0000, 0xaa50, 0x0000, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0x0000,
+ /* 90 */ 0xaa52, 0xcce1, 0xccd6, 0xaa55, 0xcce8, 0xaa45, 0x0000, 0xaa4c,
+ /* 98 */ 0xccd9, 0xcce2, 0xaa54, 0x0000, 0xaa47, 0xaa4b, 0x0000, 0xcce0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcf5b, 0xac5c,
+ /* b0 */ 0xac69, 0x0000, 0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45,
+ /* b8 */ 0xac65, 0xcf52, 0xcefe, 0xcf41, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x02299 ***/
+
+ /* 80 */ 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0x0000,
+ /* 88 */ 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66,
+ /* 90 */ 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67, 0xcf49,
+ /* a0 */ 0x0000, 0x0000, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54,
+ /* a8 */ 0x0000, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f,
+ /* b0 */ 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d,
+ /* b8 */ 0xcf42, 0x0000, 0xcf5e, 0x0000, 0xcf57, 0x0000, 0x0000, 0xac55,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x022d9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd1ec, 0xaeea, 0xd1ed, 0x0000, 0xd1e1, 0xaedf,
+ /* 98 */ 0xaeeb, 0x0000, 0xd1da, 0x0000, 0xd1e3, 0xd1eb, 0x0000, 0xd1d9,
+ /* a0 */ 0xd1f4, 0xaed5, 0x0000, 0x0000, 0x0000, 0xd1f3, 0xd1ee, 0x0000,
+ /* a8 */ 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0x0000, 0xd1e6, 0xd1f0, 0xd1e7,
+ /* b0 */ 0x0000, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0x0000, 0x0000,
+ /* b8 */ 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02319 ***/
+
+ /* 80 */ 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8, 0x0000,
+ /* 88 */ 0xaed7, 0xd1db, 0x0000, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8, 0xd1e0,
+ /* 90 */ 0xaee4, 0xaee1, 0x0000, 0xaed9, 0xaedc, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd5c4, 0x0000, 0xd5b4, 0xd5b5, 0xd5b9,
+ /* b0 */ 0x0000, 0xd5c8, 0xd5c5, 0x0000, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1,
+ /* b8 */ 0xd5d0, 0xd5b0, 0x0000, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02359 ***/
+
+ /* 80 */ 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0x0000, 0xb1f6, 0xb1f5, 0xd5b1,
+ /* 88 */ 0x0000, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0x0000, 0x0000, 0xd5c0,
+ /* 90 */ 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0x0000, 0xd5cb, 0xb1f0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5ca, 0xd5b3, 0xb1f8, 0x0000, 0xb1fa,
+ /* a0 */ 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba, 0xd5cf, 0x0000, 0x0000, 0xb1ef,
+ /* a8 */ 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8,
+ /* b0 */ 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0, 0xb1eb, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02395 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1f3, 0x0000, 0xd9c3, 0xd9d9,
+ /* 88 */ 0xd9ce, 0xb4d6, 0x0000, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd, 0x0000,
+ /* 90 */ 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7,
+ /* 98 */ 0xb4c6, 0x0000, 0xb4d7, 0x0000, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9,
+ /* a0 */ 0xb4c5, 0xd9bb, 0x0000, 0xb4d0, 0xd9b6, 0x0000, 0xd9d1, 0xb4cc,
+ /* a8 */ 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0x0000, 0xb4cb, 0xd9c2,
+ /* b0 */ 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4,
+ /* b8 */ 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x023d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc,
+ /* 88 */ 0xd9be, 0x0000, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2,
+ /* 90 */ 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0x0000, 0xd9cc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d8, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd9ae, 0x0000, 0x0000, 0x0000, 0x0000, 0xddf2,
+ /* b0 */ 0xb7a6, 0x0000, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0x0000, 0xddec,
+ /* b8 */ 0xddcb, 0xddd2, 0x0000, 0xddea, 0xddf4, 0xdddc, 0x0000, 0xddcf,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02413 ***/
+
+ /* 80 */ 0xdde2, 0xdde7, 0xddd3, 0x0000, 0xdde4, 0xddd0, 0x0000, 0x0000,
+ /* 88 */ 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0x0000, 0xddcc, 0xddee,
+ /* 90 */ 0x0000, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0x0000, 0xd5b8, 0xddd4,
+ /* 98 */ 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca,
+ /* a0 */ 0xb7a3, 0x0000, 0xddcd, 0xb7b0, 0x0000, 0xdddd, 0xddc9, 0x0000,
+ /* a8 */ 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda, 0xb77e, 0xb4d8, 0xdde3,
+ /* b0 */ 0xd9bf, 0xddce, 0x0000, 0x0000, 0xdde8, 0xb7a5, 0xdde5, 0xb7a2,
+ /* b8 */ 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02451 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb7a7, 0xdec6, 0x0000, 0x0000, 0xb7ae, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe24a, 0xe248, 0x0000,
+ /* 90 */ 0xe25e, 0xe246, 0x0000, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d,
+ /* 98 */ 0x0000, 0xe247, 0xe255, 0xba64, 0xba5d, 0x0000, 0xe25b, 0x0000,
+ /* a0 */ 0xe240, 0xe25a, 0x0000, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249,
+ /* a8 */ 0xba5e, 0xe24b, 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d,
+ /* b0 */ 0xe243, 0xe1fc, 0x0000, 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65,
+ /* b8 */ 0x0000, 0xe253, 0x0000, 0xba66, 0xe245, 0xe250, 0xe24c, 0xe24e,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x02491 ***/
+
+ /* 80 */ 0x0000, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0x0000, 0xe262, 0x0000,
+ /* 88 */ 0x0000, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256,
+ /* 90 */ 0xba69, 0x0000, 0x0000, 0xba62, 0xe252, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe25c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe5d5, 0x0000, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de,
+ /* a8 */ 0xbccd, 0x0000, 0x0000, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0x0000,
+ /* b0 */ 0x0000, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0x0000, 0xe5eb, 0xe5dd,
+ /* b8 */ 0xe5ce, 0x0000, 0x0000, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, 0xe5d3,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x024d1 ***/
+
+ /* 80 */ 0xe5ca, 0xbcce, 0xbcd6, 0x0000, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed,
+ /* 88 */ 0xe5e0, 0xe5e6, 0xbcd4, 0x0000, 0x0000, 0xe5e3, 0x0000, 0xe5ea,
+ /* 90 */ 0x0000, 0xbcd9, 0x0000, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc,
+ /* 98 */ 0xe5e8, 0xbcd0, 0x0000, 0xe5d6, 0x0000, 0xe5d7, 0xbccf, 0xbccc,
+ /* a0 */ 0xe5d2, 0xbcd2, 0x0000, 0xbccb, 0x0000, 0xe5e9, 0xe5ec, 0xe5d9,
+ /* a8 */ 0xe9ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe9c2, 0x0000, 0xe9be, 0xbef6, 0x0000, 0x0000,
+ /* b8 */ 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, 0xbeea, 0xe9c4, 0xe9cd,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x02511 ***/
+
+ /* 80 */ 0xe5df, 0xe9ce, 0x0000, 0x0000, 0xbef1, 0x0000, 0xe9dd, 0xbef5,
+ /* 88 */ 0xbef8, 0xe9c0, 0x0000, 0xbef4, 0x0000, 0xe9db, 0xe9dc, 0xe9d2,
+ /* 90 */ 0xe9d1, 0xe9c9, 0x0000, 0x0000, 0xe9d3, 0xe9da, 0xe9d9, 0x0000,
+ /* 98 */ 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0x0000, 0xe9c5, 0xe9d8, 0xbef7,
+ /* a0 */ 0xe9d6, 0xbef3, 0xbef2, 0x0000, 0xe9d0, 0x0000, 0xe9bf, 0xe9c1,
+ /* a8 */ 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0x0000, 0xe9c6, 0x0000, 0xe9d4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c7, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0cf, 0xed45,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02551 ***/
+
+ /* 80 */ 0xc0c8, 0xecf5, 0x0000, 0xed41, 0xc0ca, 0xed48, 0x0000, 0xecfc,
+ /* 88 */ 0x0000, 0xecf7, 0x0000, 0x0000, 0xed49, 0xecf3, 0xecfe, 0x0000,
+ /* 90 */ 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40, 0xecf4, 0xc0d0,
+ /* 98 */ 0x0000, 0x0000, 0xed47, 0xecf9, 0xc0cc, 0x0000, 0xecfb, 0xecf8,
+ /* a0 */ 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0x0000,
+ /* a8 */ 0xed42, 0x0000, 0x0000, 0x0000, 0xc263, 0xefe7, 0xc268, 0xc269,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xc262, 0xefe6, 0x0000, 0xefe3, 0xefe4,
+ /* b8 */ 0xc266, 0xefde, 0xefe2, 0xc265, 0x0000, 0xefdf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x0258f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc267, 0xc264, 0x0000, 0xefdd, 0xefe1, 0xefe5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf251, 0xf24e, 0xf257, 0x0000, 0xf256,
+ /* 90 */ 0xf254, 0xf24f, 0x0000, 0xc372, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252,
+ /* a0 */ 0xf24d, 0xefe0, 0x0000, 0x0000, 0x0000, 0xc36f, 0x0000, 0xf24c,
+ /* a8 */ 0xf456, 0x0000, 0xf455, 0xf255, 0xc468, 0x0000, 0xf459, 0xf45a,
+ /* b0 */ 0xf454, 0xf458, 0x0000, 0xf453, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6acxx - offset 0x025cf ***/
+
+ /* 80 */ 0xf5d2, 0x0000, 0xf5ce, 0xf5d0, 0xc4e6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf6e5, 0xf6e6, 0xc576, 0xf6e4, 0x0000, 0x0000, 0x0000, 0xf7e2,
+ /* 90 */ 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0x0000, 0x0000, 0xc656, 0xf8f3,
+ /* 98 */ 0xf8f1, 0xf8f2, 0xf8f4, 0x0000, 0x0000, 0x0000, 0xf9bb, 0x0000,
+ /* a0 */ 0xa4ed, 0xa6b8, 0x0000, 0xaa59, 0x0000, 0xcce9, 0x0000, 0x0000,
+ /* a8 */ 0xcf64, 0x0000, 0x0000, 0x0000, 0xd1f5, 0xd1f7, 0x0000, 0xd1f6,
+ /* b0 */ 0x0000, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9, 0x0000, 0xd5d6, 0xd5d8,
+ /* b8 */ 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, 0xb4dc, 0xb4da, 0xd9dc,
+
+ /*** Three byte table, leaf: e6adxx - offset 0x0260f ***/
+
+ /* 80 */ 0x0000, 0xddfa, 0xddf8, 0xddf7, 0x0000, 0xddf6, 0xddf5, 0xb7b2,
+ /* 88 */ 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, 0x0000,
+ /* 90 */ 0xbcda, 0xe5f0, 0x0000, 0x0000, 0xe9df, 0xe9de, 0xe9e0, 0x0000,
+ /* 98 */ 0x0000, 0xbef9, 0x0000, 0xed4b, 0xc0d3, 0x0000, 0xefe8, 0xc26a,
+ /* a0 */ 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, 0xaa5a, 0xaa5b,
+ /* a8 */ 0x0000, 0x0000, 0xac6e, 0x0000, 0x0000, 0xd1fa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xb7b3, 0x0000, 0x0000, 0x0000, 0xe6d1, 0xbefa,
+ /* b8 */ 0xc26b, 0xa4ef, 0x0000, 0xa6ba, 0x0000, 0x0000, 0xcceb, 0xaa5c,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x0264f ***/
+
+ /* 80 */ 0xccea, 0x0000, 0xcf65, 0xac6f, 0xcf66, 0x0000, 0xac70, 0x0000,
+ /* 88 */ 0xd1fc, 0xaeee, 0xaeed, 0x0000, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db,
+ /* 90 */ 0x0000, 0xd5da, 0x0000, 0x0000, 0xd9de, 0xd9e1, 0xb4de, 0xd9df,
+ /* 98 */ 0xb4dd, 0xd9e0, 0x0000, 0xddfb, 0x0000, 0x0000, 0xe266, 0xe267,
+ /* a0 */ 0xe268, 0x0000, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1,
+ /* a8 */ 0x0000, 0x0000, 0xe9e2, 0xe9e3, 0x0000, 0xed4c, 0xc0d4, 0xc26c,
+ /* b0 */ 0xf25a, 0x0000, 0xc4e8, 0xc95f, 0x0000, 0xac71, 0xcf67, 0xaeef,
+ /* b8 */ 0x0000, 0x0000, 0xb1fe, 0x0000, 0xb4df, 0xd9e2, 0x0000, 0xb7b5,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x0268f ***/
+
+ /* 80 */ 0xb7b4, 0x0000, 0x0000, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5,
+ /* 88 */ 0xe9e4, 0xefe9, 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0x0000, 0xa843,
+ /* 90 */ 0xcb48, 0x0000, 0xac72, 0xb7b6, 0xa4f1, 0x0000, 0xcf68, 0xac73,
+ /* 98 */ 0xcf69, 0x0000, 0xc0d5, 0xa4f2, 0x0000, 0x0000, 0xccec, 0x0000,
+ /* a0 */ 0xcf6a, 0x0000, 0xd242, 0xd241, 0xd1fe, 0x0000, 0xd1fd, 0xd243,
+ /* a8 */ 0xd240, 0x0000, 0x0000, 0xb240, 0xb241, 0x0000, 0x0000, 0xb4e0,
+ /* b0 */ 0xd9e3, 0x0000, 0xd9e4, 0xd9e5, 0x0000, 0x0000, 0x0000, 0xde41,
+ /* b8 */ 0xde42, 0xde40, 0x0000, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x026cf ***/
+
+ /* 80 */ 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0x0000,
+ /* 88 */ 0xc0d6, 0xed4d, 0x0000, 0xefea, 0xf25b, 0xf6e7, 0x0000, 0xa4f3,
+ /* 90 */ 0xa5c2, 0xa5c1, 0x0000, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0x0000,
+ /* 98 */ 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0x0000, 0xcced, 0x0000, 0xac74,
+ /* a0 */ 0xcf6b, 0xcf6c, 0x0000, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1,
+ /* a8 */ 0xaef2, 0x0000, 0xd5df, 0xb242, 0xb4e3, 0x0000, 0xb4e1, 0xb4e2,
+ /* b0 */ 0xd9e6, 0x0000, 0x0000, 0xba72, 0xa4f4, 0x0000, 0xc9a1, 0x0000,
+ /* b8 */ 0xa5c3, 0x0000, 0x0000, 0xc9a4, 0x0000, 0x0000, 0xa5c6, 0xc9a3,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x0270f ***/
+
+ /* 80 */ 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0x0000, 0x0000, 0xc9f8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb,
+ /* 90 */ 0xa6c1, 0x0000, 0xc9f9, 0x0000, 0xc9fd, 0xa6c2, 0x0000, 0xa6bd,
+ /* 98 */ 0x0000, 0xa6be, 0x0000, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf,
+ /* a0 */ 0xa6c0, 0xa6c3, 0x0000, 0x0000, 0x0000, 0xcb5b, 0xcb59, 0xcb4c,
+ /* a8 */ 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0x0000, 0xcb55, 0x0000, 0xcb52,
+ /* b0 */ 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0x0000, 0xa85a, 0x0000,
+ /* b8 */ 0xcb4b, 0x0000, 0xa84d, 0xcb5c, 0x0000, 0xa854, 0xa857, 0x0000,
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x0274f ***/
+
+ /* 80 */ 0xcd45, 0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56,
+ /* 88 */ 0xa848, 0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50,
+ /* 90 */ 0xa84e, 0x0000, 0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0x0000,
+ /* 98 */ 0xa85d, 0xa846, 0xcb54, 0xa84b, 0xcb58, 0xcd44, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0x0000,
+ /* b0 */ 0xcd4b, 0xaa62, 0x0000, 0xaa65, 0xcd42, 0x0000, 0xccf3, 0xccf7,
+ /* b8 */ 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66, 0xaa67, 0xaa75,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x0278f ***/
+
+ /* 80 */ 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73, 0xccfc, 0xcd4a,
+ /* 88 */ 0x0000, 0xac75, 0xaa79, 0x0000, 0xaa63, 0xcd49, 0x0000, 0xcd4d,
+ /* 90 */ 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, 0xaa72,
+ /* 98 */ 0x0000, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0x0000,
+ /* a0 */ 0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0x0000, 0xaa64, 0x0000, 0xccf6,
+ /* a8 */ 0xaa60, 0xcd4e, 0x0000, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b,
+ /* b0 */ 0xaef5, 0xaa74, 0xccfe, 0xaa61, 0x0000, 0xaca6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xcd4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x027cf ***/
+
+ /* 80 */ 0xcf7c, 0xcfa1, 0x0000, 0xcfa4, 0xcf77, 0x0000, 0x0000, 0xcfa7,
+ /* 88 */ 0xcfaa, 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5,
+ /* 90 */ 0xcfad, 0xcf7b, 0xcf73, 0x0000, 0x0000, 0x0000, 0xd264, 0xac7e,
+ /* 98 */ 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0x0000, 0xcf7d, 0xac7d, 0xcf70,
+ /* a0 */ 0xcfa8, 0x0000, 0xcfab, 0x0000, 0x0000, 0xac7a, 0x0000, 0xaca8,
+ /* a8 */ 0xcf6d, 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e,
+ /* b0 */ 0xcd48, 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3,
+ /* b8 */ 0xaca9, 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x0280f ***/
+
+ /* 80 */ 0xcfa6, 0xac79, 0xcf7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd24c, 0xaefd, 0xaf43, 0x0000, 0x0000, 0x0000, 0xd255, 0xd25b,
+ /* a0 */ 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256,
+ /* a8 */ 0xd25f, 0xaf45, 0xaef6, 0x0000, 0xaf40, 0xd24e, 0xaf42, 0xd24f,
+ /* b0 */ 0xd259, 0x0000, 0x0000, 0x0000, 0xaf44, 0xd268, 0xd248, 0xaefc,
+ /* b8 */ 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261, 0xd253,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x0284f ***/
+
+ /* 80 */ 0xd262, 0x0000, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254, 0xaef9,
+ /* 88 */ 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243, 0x0000,
+ /* 90 */ 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0x0000, 0xd258,
+ /* 98 */ 0xd25d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb265, 0xd5e1, 0xd5e5, 0x0000, 0xb252, 0xb250,
+ /* b0 */ 0x0000, 0x0000, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0x0000, 0xd5e8,
+ /* b8 */ 0xb255, 0x0000, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x0288f ***/
+
+ /* 80 */ 0xd5e0, 0x0000, 0xd5fc, 0x0000, 0xb264, 0xb258, 0xb263, 0xb24e,
+ /* 88 */ 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0x0000, 0xd5fd,
+ /* 90 */ 0xd640, 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644,
+ /* 98 */ 0xb25e, 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee,
+ /* a0 */ 0xd5ed, 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0x0000,
+ /* a8 */ 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252,
+ /* b0 */ 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256,
+ /* b8 */ 0x0000, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x028cf ***/
+
+ /* 80 */ 0xd5eb, 0x0000, 0x0000, 0xd9fc, 0x0000, 0xb24d, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0x0000, 0xd9ea,
+ /* a0 */ 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d,
+ /* a8 */ 0xda44, 0x0000, 0x0000, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4,
+ /* b0 */ 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0x0000,
+ /* b8 */ 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2,
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x0290f ***/
+
+ /* 80 */ 0xd9f9, 0xd9f3, 0x0000, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9,
+ /* 88 */ 0x0000, 0xd9eb, 0xb4ea, 0xd9f8, 0x0000, 0xb4f8, 0xb542, 0x0000,
+ /* 90 */ 0x0000, 0xd9fa, 0xda53, 0xda4b, 0xb4e6, 0xda51, 0xb4f2, 0x0000,
+ /* 98 */ 0xb4f0, 0x0000, 0xda57, 0xb4ef, 0xda41, 0xd9f4, 0xd9fe, 0xb547,
+ /* a0 */ 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, 0xda54, 0xb4e9,
+ /* a8 */ 0xda40, 0xb546, 0x0000, 0xda47, 0x0000, 0x0000, 0xb4f3, 0xb4f6,
+ /* b0 */ 0x0000, 0xda46, 0xb545, 0xd9f5, 0xd5e4, 0x0000, 0x0000, 0xda50,
+ /* b8 */ 0xda4e, 0xda52,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02949 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd9ec, 0xb540, 0x0000, 0x0000, 0x0000, 0xde61, 0xde60, 0xde46,
+ /* 90 */ 0xb7bd, 0x0000, 0xde5f, 0xde49, 0xde4a, 0x0000, 0xb7c7, 0xde68,
+ /* 98 */ 0xb7c2, 0xde5e, 0x0000, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48,
+ /* a0 */ 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc,
+ /* a8 */ 0x0000, 0x0000, 0xb7cb, 0xb7c5, 0x0000, 0x0000, 0xde69, 0xb7b9,
+ /* b0 */ 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0x0000, 0xb7bb, 0xde54,
+ /* b8 */ 0x0000, 0xde4d, 0xb7c4, 0x0000, 0xb7c3, 0xde50, 0xde5a, 0xde64,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02989 ***/
+
+ /* 80 */ 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, 0xb7bf,
+ /* 88 */ 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, 0xde58,
+ /* 90 */ 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, 0x0000,
+ /* 98 */ 0xde5d, 0x0000, 0x0000, 0x0000, 0xde5c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2,
+ /* b0 */ 0x0000, 0xe26e, 0xbaaf, 0x0000, 0xba77, 0xe26d, 0xe2b0, 0xbab1,
+ /* b8 */ 0xe271, 0xe2a3, 0x0000, 0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x029c9 ***/
+
+ /* 80 */ 0xe653, 0xbaae, 0xba7d, 0xe26f, 0x0000, 0xe2ae, 0xbaa3, 0xe2ab,
+ /* 88 */ 0xe2b8, 0xe275, 0xe27e, 0x0000, 0x0000, 0xe2b6, 0xe2ac, 0xba7c,
+ /* 90 */ 0x0000, 0x0000, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0x0000, 0x0000,
+ /* 98 */ 0xe27a, 0xe277, 0xe278, 0x0000, 0xe2b2, 0x0000, 0xe2b7, 0xe2b5,
+ /* a0 */ 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0x0000, 0xe270, 0xe5fa, 0xe279,
+ /* a8 */ 0x0000, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa,
+ /* b0 */ 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0x0000, 0xe2a9, 0xe2a1, 0xe272,
+ /* b8 */ 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0x0000, 0xba79, 0xbcdf,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02a09 ***/
+
+ /* 80 */ 0xe2a6, 0xe5f9, 0x0000, 0xe2ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe276, 0xe644,
+ /* 90 */ 0xe64e, 0xbce2, 0xe64d, 0xe659, 0xbce4, 0xe64b, 0x0000, 0xe64f,
+ /* 98 */ 0xbcef, 0x0000, 0xe646, 0xbce7, 0x0000, 0xe652, 0xe9f0, 0xbcf3,
+ /* a0 */ 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0x0000, 0xbce3, 0xe657,
+ /* a8 */ 0x0000, 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1,
+ /* b0 */ 0xbcec, 0x0000, 0xe64c, 0xe2a2, 0x0000, 0x0000, 0xe648, 0xe65f,
+ /* b8 */ 0xbce8, 0x0000, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb, 0xe65c,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02a49 ***/
+
+ /* 80 */ 0xc0df, 0x0000, 0xe64a, 0x0000, 0xbce1, 0xe645, 0xbce5, 0xe5fc,
+ /* 88 */ 0xbaab, 0xe641, 0x0000, 0xe65a, 0xe642, 0xe640, 0xbcea, 0x0000,
+ /* 90 */ 0xe658, 0x0000, 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f3, 0x0000,
+ /* a0 */ 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43,
+ /* a8 */ 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44,
+ /* b0 */ 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0x0000, 0xbf47, 0x0000,
+ /* b8 */ 0xe9fe, 0xbf46, 0xe9f9, 0x0000, 0xe9ed, 0xe9f2, 0x0000, 0xe9fd,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02a89 ***/
+
+ /* 80 */ 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0x0000, 0xe5fd, 0xe9ec,
+ /* 88 */ 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed51, 0xc0e3, 0x0000, 0x0000,
+ /* 98 */ 0xc0d7, 0x0000, 0x0000, 0xc0db, 0xed53, 0xed59, 0xed57, 0xc0d9,
+ /* a0 */ 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0x0000, 0xed56, 0xed55,
+ /* a8 */ 0xed5b, 0xc0e2, 0x0000, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de,
+ /* b0 */ 0xc0e5, 0xc0d8, 0xed58, 0x0000, 0xed50, 0x0000, 0x0000, 0xeff7,
+ /* b8 */ 0x0000, 0x0000, 0xc271, 0xeff4, 0xeff6, 0x0000, 0xc26f, 0xeff2,
+
+ /*** Three byte table, leaf: e780xx - offset 0x02ac9 ***/
+
+ /* 80 */ 0xeff3, 0xefee, 0x0000, 0x0000, 0xe9f6, 0xefef, 0xc270, 0xefeb,
+ /* 88 */ 0x0000, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273,
+ /* 90 */ 0x0000, 0xc272, 0x0000, 0x0000, 0xeff0, 0xc378, 0xf25f, 0xf265,
+ /* 98 */ 0xc379, 0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0x0000, 0xc374,
+ /* a0 */ 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, 0x0000, 0xeff5, 0xf25d,
+ /* a8 */ 0xc375, 0xf264, 0xf268, 0xf260, 0x0000, 0x0000, 0x0000, 0xf45d,
+ /* b0 */ 0xc46a, 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0x0000, 0xf45e,
+ /* b8 */ 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b, 0x0000, 0xc469, 0xf463,
+
+ /*** Three byte table, leaf: e781xx - offset 0x02b09 ***/
+
+ /* 80 */ 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0x0000,
+ /* 88 */ 0xf5d6, 0xf5d7, 0xf5d5, 0x0000, 0xc4e9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc578, 0xf6eb, 0x0000, 0x0000, 0xf6e8, 0xf6e9, 0xf6ea,
+ /* 98 */ 0xc579, 0x0000, 0xf7e5, 0xf7e4, 0x0000, 0xf8af, 0xc5f4, 0xf8ad,
+ /* a0 */ 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, 0xf9a3, 0xf96c, 0x0000,
+ /* a8 */ 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa6c7, 0xca41, 0x0000, 0x0000, 0xcb5e, 0x0000, 0xa85f, 0x0000,
+ /* b8 */ 0xa862, 0x0000, 0xcb5f, 0x0000, 0xa860, 0xa861,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02b47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xaaa4, 0x0000, 0x0000, 0x0000, 0xaaa2, 0x0000,
+ /* 90 */ 0x0000, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1, 0xcd57, 0x0000,
+ /* 98 */ 0xcd51, 0xaaa5, 0xcd59, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfaf,
+ /* a0 */ 0x0000, 0xcfb3, 0x0000, 0x0000, 0xacb7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcfb6, 0x0000, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3,
+ /* b0 */ 0xcfb2, 0xcfb1, 0x0000, 0xacb1, 0xcfb4, 0xcfb5, 0x0000, 0xcfae,
+ /* b8 */ 0xacb5, 0x0000, 0xacb0, 0x0000, 0x0000, 0x0000, 0xcfb0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02b86 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd277, 0xd278, 0xd279,
+ /* 88 */ 0xaf50, 0x0000, 0xaf4c, 0xd26e, 0x0000, 0xd276, 0xd27b, 0xaf51,
+ /* 90 */ 0x0000, 0xd26c, 0xd272, 0xd26b, 0xd275, 0x0000, 0x0000, 0xd271,
+ /* 98 */ 0xaf4d, 0xaf4f, 0xd27a, 0x0000, 0xd26a, 0xd26d, 0xd273, 0x0000,
+ /* a0 */ 0xd274, 0xd27c, 0xd270, 0x0000, 0xaf4e, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb26d,
+ /* b0 */ 0xd64e, 0x0000, 0x0000, 0xd650, 0xd64c, 0x0000, 0xd658, 0xd64a,
+ /* b8 */ 0xd657, 0xb269, 0xd648, 0xda5b, 0xd652, 0xb26c, 0x0000, 0xd653,
+
+ /*** Three byte table, leaf: e784xx - offset 0x02bc6 ***/
+
+ /* 80 */ 0xd656, 0x0000, 0xd65a, 0x0000, 0xd64f, 0x0000, 0xd654, 0x0000,
+ /* 88 */ 0x0000, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0x0000,
+ /* 90 */ 0xd651, 0x0000, 0x0000, 0xd655, 0x0000, 0x0000, 0x0000, 0xd64b,
+ /* 98 */ 0x0000, 0xb548, 0xb549, 0xda65, 0xb54f, 0x0000, 0xda59, 0xda62,
+ /* a0 */ 0xda58, 0xb54c, 0xda60, 0xda5e, 0x0000, 0xda5f, 0xb54a, 0x0000,
+ /* a8 */ 0xda63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda5c, 0xda5a,
+ /* b0 */ 0xb54b, 0xda5d, 0xda61, 0x0000, 0x0000, 0x0000, 0xb54d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xda64, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02c05 ***/
+
+ /* 80 */ 0x0000, 0xde70, 0xde77, 0xde79, 0xdea1, 0x0000, 0xb7da, 0xde6b,
+ /* 88 */ 0x0000, 0xb7d2, 0x0000, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0x0000,
+ /* 90 */ 0xde7d, 0x0000, 0xde6d, 0xde7e, 0xde6c, 0x0000, 0xb7dc, 0x0000,
+ /* 98 */ 0xde78, 0xb7cf, 0xdea3, 0x0000, 0xb7d4, 0xde71, 0xb7d9, 0xde7c,
+ /* a0 */ 0xde6f, 0xde76, 0xde72, 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3,
+ /* a8 */ 0xb7db, 0xb7d0, 0xde75, 0x0000, 0xb7d5, 0x0000, 0xb54e, 0x0000,
+ /* b0 */ 0xde7b, 0x0000, 0xde73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xde74, 0x0000, 0x0000, 0xe2c1, 0x0000, 0xbab4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e786xx - offset 0x02c45 ***/
+
+ /* 80 */ 0xe2bd, 0xe2c3, 0xe2bf, 0x0000, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba,
+ /* 88 */ 0x0000, 0xe2bc, 0xbab5, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2c0,
+ /* 90 */ 0xe2bb, 0x0000, 0xbab7, 0x0000, 0xbab2, 0x0000, 0x0000, 0xe2c4,
+ /* 98 */ 0x0000, 0xbab3, 0xe667, 0xe664, 0xe670, 0xe66a, 0xe66c, 0xbcf4,
+ /* a0 */ 0xe666, 0xe66e, 0x0000, 0x0000, 0xe66d, 0xe66b, 0x0000, 0xe671,
+ /* a8 */ 0xbcf7, 0xe668, 0xe66f, 0x0000, 0xbcf5, 0x0000, 0x0000, 0xe663,
+ /* b0 */ 0xe665, 0xbcf6, 0xe662, 0xe672, 0x0000, 0xe669, 0x0000, 0x0000,
+ /* b8 */ 0xea4a, 0xbf51, 0x0000, 0x0000, 0xea55, 0xea53, 0xbf4b, 0xea49,
+
+ /*** Three byte table, leaf: e787xx - offset 0x02c85 ***/
+
+ /* 80 */ 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51,
+ /* 88 */ 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0x0000, 0x0000, 0xbf52, 0xea52,
+ /* 90 */ 0xbf4d, 0x0000, 0xbf4e, 0x0000, 0xea4f, 0xbf50, 0xea4b, 0x0000,
+ /* 98 */ 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0x0000, 0x0000, 0xc0e7,
+ /* a0 */ 0xc0ee, 0xed5c, 0xed62, 0x0000, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6,
+ /* a8 */ 0xed5e, 0x0000, 0x0000, 0x0000, 0xc0ec, 0xc0eb, 0xc0e8, 0x0000,
+ /* b0 */ 0xed61, 0xed5d, 0xed5f, 0x0000, 0xc0ed, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc277, 0xeffb, 0x0000, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02cc5 ***/
+
+ /* 80 */ 0x0000, 0xeff9, 0xf26c, 0xeffc, 0x0000, 0xf26d, 0xc37a, 0xf26b,
+ /* 88 */ 0x0000, 0x0000, 0xf26a, 0x0000, 0xf269, 0xc37b, 0x0000, 0x0000,
+ /* 90 */ 0xc46c, 0x0000, 0x0000, 0xf46a, 0xf46b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf5dc, 0xf5db, 0xc4ea, 0x0000, 0xf5da, 0xf6ec, 0xf6ed,
+ /* a0 */ 0x0000, 0x0000, 0xf7e6, 0xf8b1, 0x0000, 0x0000, 0xf8f6, 0xf9bc,
+ /* a8 */ 0xc679, 0xf9c6, 0xa4f6, 0x0000, 0xaaa6, 0xaaa7, 0x0000, 0x0000,
+ /* b0 */ 0xacb8, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0ef, 0xa4f7, 0x0000,
+ /* b8 */ 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0x0000, 0xb26e, 0xbab8, 0xc962,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02d05 ***/
+
+ /* 80 */ 0x0000, 0xcfb7, 0xd27d, 0x0000, 0xe2c5, 0x0000, 0xc0f0, 0xa4f9,
+ /* 88 */ 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0x0000, 0x0000, 0xdea4,
+ /* 90 */ 0x0000, 0x0000, 0xb7de, 0xe2c6, 0x0000, 0x0000, 0xbcf8, 0x0000,
+ /* 98 */ 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0x0000, 0xa6c9, 0xca42, 0xa6c8,
+ /* a0 */ 0xa865, 0xa864, 0xa863, 0xcb60, 0x0000, 0x0000, 0x0000, 0xaaaa,
+ /* a8 */ 0x0000, 0xaaab, 0xcd5b, 0x0000, 0xcfba, 0x0000, 0xcfbd, 0xacba,
+ /* b0 */ 0xcfbb, 0x0000, 0xacb9, 0xcfbc, 0xacbb, 0x0000, 0xd2a2, 0xd2a1,
+ /* b8 */ 0xd27e, 0xaf53, 0x0000, 0xd65d, 0xd65e, 0xb26f, 0xd65c, 0xd65f,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02d45 ***/
+
+ /* 80 */ 0xb552, 0xb270, 0x0000, 0x0000, 0xb551, 0xda6b, 0xda6a, 0x0000,
+ /* 88 */ 0xda68, 0xda69, 0x0000, 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0x0000,
+ /* 90 */ 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0x0000, 0xe2c8, 0xbaba, 0xe2c7,
+ /* 98 */ 0xe673, 0x0000, 0xe674, 0xbcf9, 0x0000, 0xea59, 0xea5a, 0x0000,
+ /* a0 */ 0x0000, 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb,
+ /* a8 */ 0xf46c, 0xf6ee, 0xf8f7, 0x0000, 0xa4fc, 0x0000, 0xc9a5, 0xa5c7,
+ /* b0 */ 0xc9a6, 0x0000, 0x0000, 0x0000, 0xca43, 0xca44, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcb66, 0x0000, 0x0000, 0xcb62, 0x0000, 0xcb61,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02d85 ***/
+
+ /* 80 */ 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, 0xcb67, 0xcb64, 0x0000,
+ /* 88 */ 0x0000, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0x0000, 0xaaad, 0x0000,
+ /* 90 */ 0xaab0, 0xcd65, 0xcd61, 0x0000, 0xcd62, 0x0000, 0xcd5c, 0xaaaf,
+ /* 98 */ 0xcd5e, 0xaaae, 0xcd63, 0x0000, 0xcd60, 0x0000, 0x0000, 0xcfc2,
+ /* a0 */ 0xacbd, 0xacbe, 0x0000, 0xcfc5, 0xcfbf, 0x0000, 0xcfc4, 0x0000,
+ /* a8 */ 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd2a8, 0xd2a5, 0x0000, 0xd2a7, 0xaf58,
+ /* b8 */ 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667,
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02dc5 ***/
+
+ /* 80 */ 0xd2a3, 0xd2aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd662,
+ /* 88 */ 0xd666, 0x0000, 0xd665, 0xda6e, 0xda79, 0x0000, 0x0000, 0xd668,
+ /* 90 */ 0x0000, 0xd663, 0xda6d, 0xb274, 0x0000, 0x0000, 0xb273, 0xd661,
+ /* 98 */ 0xd664, 0xb275, 0x0000, 0xb272, 0xb271, 0xd660, 0xd669, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xda70, 0xda77, 0x0000, 0xb554, 0xda76, 0xda73,
+ /* a8 */ 0x0000, 0xb556, 0x0000, 0x0000, 0x0000, 0xda75, 0x0000, 0x0000,
+ /* b0 */ 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, 0xb7df,
+ /* b8 */ 0x0000, 0x0000, 0xdead, 0xdeac, 0xdeaa, 0x0000, 0xb7e2, 0xb7e1,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x02e05 ***/
+
+ /* 80 */ 0xdeae, 0x0000, 0xdeab, 0xe2ca, 0xbabb, 0xb7e0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdeb0, 0xdeaf, 0x0000, 0xe2cd, 0xe2cb, 0xbcfa, 0x0000,
+ /* 90 */ 0xbabc, 0xe2cc, 0xe676, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcfb,
+ /* 98 */ 0xe675, 0xe67e, 0xe67d, 0xe67b, 0x0000, 0xe67a, 0xe677, 0xe678,
+ /* a0 */ 0xe679, 0xe67c, 0xe6a1, 0x0000, 0x0000, 0xea5f, 0xea5c, 0xea5d,
+ /* a8 */ 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0x0000, 0xed64, 0xed65,
+ /* b0 */ 0xc0f1, 0x0000, 0xc0f2, 0xed63, 0x0000, 0xc279, 0xeffe, 0xc278,
+ /* b8 */ 0xc37e, 0x0000, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef,
+
+ /*** Three byte table, leaf: e78exx - offset 0x02e45 ***/
+
+ /* 80 */ 0xc57a, 0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276,
+ /* 88 */ 0xd66a, 0xa5c9, 0xc9a7, 0xa4fd, 0x0000, 0x0000, 0xca45, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcd6d, 0x0000, 0xaab3,
+ /* a0 */ 0xcd6b, 0xcd67, 0xcd6a, 0x0000, 0xcd66, 0xaab5, 0xcd69, 0x0000,
+ /* a8 */ 0xaab2, 0xaab1, 0x0000, 0xaab4, 0xcd6c, 0xcd68, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xacc2, 0xacc5, 0xcfce, 0xcfcd, 0xcfcc, 0xacbf,
+ /* b8 */ 0xcfd5, 0xcfcb, 0x0000, 0xacc1, 0xd2af, 0x0000, 0xcfd2, 0xcfd0,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x02e85 ***/
+
+ /* 80 */ 0xacc4, 0x0000, 0xcfc8, 0xcfd3, 0x0000, 0xcfca, 0xcfd4, 0xcfd1,
+ /* 88 */ 0xcfc9, 0x0000, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd2b4, 0xd2ab, 0xd2b6, 0x0000, 0xd2ae, 0xd2b9,
+ /* 98 */ 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0x0000,
+ /* a0 */ 0xaf5d, 0x0000, 0x0000, 0xd2b1, 0x0000, 0xd2ad, 0x0000, 0xd2b0,
+ /* a8 */ 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, 0x0000, 0xaf5a, 0xaf5c, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd678, 0xd66d, 0xd66b, 0x0000,
+ /* b8 */ 0xd66c, 0x0000, 0xd673, 0x0000, 0xd674, 0xd670, 0xb27b, 0xd675,
+
+ /*** Three byte table, leaf: e790xx - offset 0x02ec5 ***/
+
+ /* 80 */ 0xd672, 0xd66f, 0x0000, 0xb279, 0xd66e, 0xb277, 0xb27a, 0xd671,
+ /* 88 */ 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda7e, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdaa1, 0xb560, 0x0000, 0xdaa7, 0x0000, 0x0000,
+ /* a0 */ 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0x0000,
+ /* a8 */ 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f,
+ /* b0 */ 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, 0xb55c, 0xb55d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xb557, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e9,
+
+ /*** Three byte table, leaf: e791xx - offset 0x02f05 ***/
+
+ /* 80 */ 0xdeb7, 0xb7e8, 0xdebb, 0x0000, 0xdeb1, 0x0000, 0xdebc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdeb2, 0xdeb3, 0x0000, 0xdebd, 0xdeba, 0xdeb8,
+ /* 90 */ 0xdeb9, 0xdeb5, 0xdeb4, 0x0000, 0xdebe, 0xb7e5, 0x0000, 0xdeb6,
+ /* 98 */ 0x0000, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0x0000, 0xb7e7, 0xb7e6,
+ /* a0 */ 0x0000, 0x0000, 0xe2ce, 0xbabe, 0xbabd, 0x0000, 0x0000, 0xe2d3,
+ /* a8 */ 0x0000, 0xbcfc, 0xbabf, 0x0000, 0x0000, 0xbac1, 0xe2d4, 0xb7e3,
+ /* b0 */ 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0x0000, 0xe2d1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe6ab, 0x0000, 0x0000, 0xe6aa, 0xe6a7, 0xbd40, 0xea62,
+
+ /*** Three byte table, leaf: e792xx - offset 0x02f45 ***/
+
+ /* 80 */ 0xbd41, 0xe6a6, 0x0000, 0xbcfe, 0x0000, 0xe6a8, 0xe6a5, 0xe6a2,
+ /* 88 */ 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xed69, 0x0000, 0xea66, 0x0000, 0xea65, 0xea67, 0x0000, 0xed66,
+ /* 98 */ 0xbf5a, 0x0000, 0xea63, 0x0000, 0xbf58, 0x0000, 0xbf5c, 0xbf5b,
+ /* a0 */ 0xea64, 0xea68, 0x0000, 0xbf59, 0x0000, 0xed6d, 0xc0f5, 0xc27a,
+ /* a8 */ 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0x0000, 0xed6b, 0x0000, 0xed6e,
+ /* b0 */ 0xc0f4, 0xed6c, 0xed67, 0x0000, 0x0000, 0xf042, 0xf045, 0xf275,
+ /* b8 */ 0xf040, 0x0000, 0xf46f, 0xf046, 0x0000, 0xc3a2, 0xf044, 0xc27b,
+
+ /*** Three byte table, leaf: e793xx - offset 0x02f85 ***/
+
+ /* 80 */ 0xf041, 0xf043, 0xf047, 0xf276, 0x0000, 0xf274, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc3a3, 0xf273, 0x0000, 0x0000, 0x0000, 0xc46e,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3,
+ /* 98 */ 0xf6f0, 0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd,
+ /* a0 */ 0xb27d, 0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0x0000,
+ /* a8 */ 0xcd6f, 0xa260, 0x0000, 0x0000, 0xcfd7, 0x0000, 0xcfd8, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd2be, 0xd2bf, 0xb27e, 0xb2a1,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdaab, 0x0000, 0xdec2, 0xdec1, 0xdec0,
+
+ /*** Three byte table, leaf: e794xx - offset 0x02fc5 ***/
+
+ /* 80 */ 0xe2d5, 0x0000, 0xe2d6, 0xe2d7, 0xbac2, 0x0000, 0x0000, 0xe6ad,
+ /* 88 */ 0xe6ac, 0x0000, 0x0000, 0xea69, 0xbf5e, 0xbf5f, 0x0000, 0xed72,
+ /* 90 */ 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, 0xf277, 0xf5de,
+ /* 98 */ 0xa5cc, 0x0000, 0xacc6, 0x0000, 0xb2a2, 0xdec3, 0x0000, 0xa5cd,
+ /* a0 */ 0x0000, 0xd2c0, 0xb2a3, 0x0000, 0x0000, 0xb563, 0xb564, 0x0000,
+ /* a8 */ 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac,
+ /* b0 */ 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0x0000, 0x0000, 0x0000, 0xa86b,
+ /* b8 */ 0xa86c, 0xcb6e, 0xcb6d, 0x0000, 0x0000, 0xaab6, 0xcd72, 0xcd70,
+
+ /*** Three byte table, leaf: e795xx - offset 0x03005 ***/
+
+ /* 80 */ 0xcd71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfda,
+ /* 88 */ 0xcfdb, 0x0000, 0x0000, 0xaccb, 0xacc9, 0x0000, 0xacca, 0xacc8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xaf60, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61, 0x0000, 0xd2c2,
+ /* a0 */ 0x0000, 0x0000, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb566, 0xb565, 0xdaae, 0x0000, 0x0000, 0xdaad,
+ /* b0 */ 0xb2a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7ed, 0xdec5,
+ /* b8 */ 0xb7ee, 0xdec4, 0x0000, 0x0000, 0x0000, 0xe2d8, 0xe6ae, 0xbd42,
+
+ /*** Three byte table, leaf: e796xx - offset 0x03045 ***/
+
+ /* 80 */ 0xea6a, 0x0000, 0x0000, 0x0000, 0xed73, 0x0000, 0xc3a6, 0xc3a5,
+ /* 88 */ 0x0000, 0x0000, 0xc57c, 0xa5d4, 0xcd73, 0x0000, 0x0000, 0xb2a8,
+ /* 90 */ 0xe2d9, 0xbac3, 0x0000, 0x0000, 0xcb6f, 0xcb70, 0x0000, 0x0000,
+ /* 98 */ 0xcd74, 0xaab8, 0xaab9, 0x0000, 0x0000, 0xaab7, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xaccf, 0xacd0, 0xaccd, 0xacce, 0x0000, 0xcfdc,
+ /* a8 */ 0x0000, 0x0000, 0xcfdd, 0xaccc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd2c3, 0x0000, 0xaf68, 0xaf69, 0x0000, 0xb2ab, 0xd2c9, 0x0000,
+ /* b8 */ 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, 0xd2c8,
+
+ /*** Three byte table, leaf: e797xx - offset 0x03085 ***/
+
+ /* 80 */ 0xd2c7, 0xd2c4, 0xaf6d, 0x0000, 0xd2c6, 0xaf66, 0x0000, 0xaf67,
+ /* 88 */ 0x0000, 0x0000, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e,
+ /* 90 */ 0xd6a4, 0xd6a3, 0xd67d, 0x0000, 0xb2a9, 0xb2aa, 0x0000, 0xdab6,
+ /* 98 */ 0xb56b, 0xb56a, 0xdab0, 0xb568, 0x0000, 0xdab3, 0xb56c, 0xdab4,
+ /* a0 */ 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0x0000, 0xdab2, 0xdaaf,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xded2, 0x0000, 0xdec7,
+ /* b0 */ 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca,
+ /* b8 */ 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5,
+
+ /*** Three byte table, leaf: e798xx - offset 0x030c5 ***/
+
+ /* 80 */ 0xb7ef, 0xb7f1, 0x0000, 0xdec9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe2db, 0xbac7, 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0x0000, 0xdec8,
+ /* 90 */ 0xdecf, 0xe2de, 0x0000, 0xbac8, 0xe2e0, 0xe2dd, 0xe2da, 0x0000,
+ /* 98 */ 0x0000, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0, 0xbd45,
+ /* a0 */ 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47, 0xbac4,
+ /* a8 */ 0xe6b6, 0xbd44, 0x0000, 0x0000, 0x0000, 0xea6c, 0x0000, 0xea6b,
+ /* b0 */ 0xea73, 0xea6d, 0xea72, 0xea6f, 0xbf60, 0xea71, 0x0000, 0x0000,
+ /* b8 */ 0xbf61, 0x0000, 0xbf62, 0x0000, 0xea70, 0xea6e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x03103 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc0f8, 0xed74, 0x0000, 0x0000, 0xc0f7, 0xed77,
+ /* 88 */ 0xed75, 0xed76, 0x0000, 0x0000, 0xc0f9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf04d, 0x0000, 0xc2a1, 0xf04e, 0x0000, 0x0000, 0xc27d, 0xf04f,
+ /* 98 */ 0xc27e, 0xf04c, 0xf050, 0x0000, 0xf04a, 0x0000, 0x0000, 0xc3a7,
+ /* a0 */ 0xf278, 0xc3a8, 0xc46f, 0x0000, 0xf04b, 0xc470, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc4ee, 0xf5df, 0x0000, 0xc57e, 0xf6f4, 0xc57d, 0x0000,
+ /* b0 */ 0xf7ea, 0xc5f5, 0xc5f6, 0x0000, 0x0000, 0xf9cc, 0x0000, 0x0000,
+ /* b8 */ 0xacd1, 0xcfde, 0x0000, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47,
+
+ /*** Three byte table, leaf: e79axx - offset 0x03143 ***/
+
+ /* 80 */ 0x0000, 0xcb71, 0xa86d, 0x0000, 0xaaba, 0x0000, 0xacd2, 0xacd3,
+ /* 88 */ 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0x0000, 0x0000, 0xb2ae, 0xd6a5,
+ /* 90 */ 0x0000, 0x0000, 0xdab8, 0xb571, 0x0000, 0xdab7, 0xb570, 0x0000,
+ /* 98 */ 0x0000, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8, 0xe6b9, 0xe6ba, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed78, 0x0000, 0xf051, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf471, 0xf470, 0x0000, 0xf6f5, 0xa5d6, 0xcd75,
+ /* b0 */ 0xaf70, 0x0000, 0x0000, 0x0000, 0xb572, 0xded6, 0x0000, 0x0000,
+ /* b8 */ 0xe2e1, 0x0000, 0xbd4b, 0xea74, 0x0000, 0xf052, 0xf472, 0xa5d7,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03183 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, 0x0000,
+ /* 88 */ 0xacd5, 0xd2cc, 0xaf71, 0x0000, 0x0000, 0xaf72, 0xaf73, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb2b0, 0xd6a7, 0xb2af, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9,
+ /* a0 */ 0x0000, 0xbac9, 0x0000, 0xbaca, 0xbd4c, 0xbf64, 0xea75, 0xbf63,
+ /* a8 */ 0x0000, 0xed79, 0xc0fa, 0x0000, 0xf053, 0xf473, 0xa5d8, 0xa86e,
+ /* b0 */ 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0x0000, 0xcfe5,
+ /* b8 */ 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0x0000, 0xacde,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x031c2 ***/
+
+ /* 80 */ 0x0000, 0xacd9, 0x0000, 0xcfe1, 0xcfe2, 0xcfe3, 0x0000, 0xace0,
+ /* 88 */ 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0x0000, 0xd2d4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd2d5, 0xd2d6, 0xd2ce, 0x0000, 0xd2cd, 0x0000, 0xaf75,
+ /* a0 */ 0xaf76, 0x0000, 0xd2d7, 0xd2d2, 0x0000, 0xd6b0, 0x0000, 0xd2d8,
+ /* a8 */ 0xaf77, 0xaf74, 0x0000, 0x0000, 0x0000, 0xd6aa, 0x0000, 0xd6a9,
+ /* b0 */ 0x0000, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2,
+ /* b8 */ 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79dxx - offset 0x03201 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdabc, 0xdabe, 0xdaba, 0xdabb,
+ /* 88 */ 0x0000, 0x0000, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0, 0xb574,
+ /* 90 */ 0x0000, 0x0000, 0xdedb, 0x0000, 0xdee0, 0xded8, 0xdedc, 0x0000,
+ /* 98 */ 0x0000, 0xdee1, 0xdedd, 0xb7fa, 0xb843, 0x0000, 0xb7fd, 0xded9,
+ /* a0 */ 0xdeda, 0xbace, 0xb846, 0xb7fe, 0x0000, 0xb844, 0xb7fc, 0xdedf,
+ /* a8 */ 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842, 0xdee2, 0xe2e6, 0xe2e8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb840, 0x0000, 0x0000, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd,
+
+ /*** Three byte table, leaf: e79exx - offset 0x03241 ***/
+
+ /* 80 */ 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0x0000, 0xbd4e,
+ /* 88 */ 0xe6bf, 0xe6be, 0x0000, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd,
+ /* 90 */ 0x0000, 0xbd50, 0x0000, 0x0000, 0x0000, 0xea7d, 0x0000, 0xeaa1,
+ /* 98 */ 0x0000, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67,
+ /* a0 */ 0xbf65, 0xea78, 0xea7b, 0xea7c, 0x0000, 0xbf68, 0x0000, 0xc140,
+ /* a8 */ 0xeda3, 0x0000, 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0x0000, 0x0000,
+ /* b0 */ 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1, 0xed7a, 0xed7e, 0xed7d,
+ /* b8 */ 0x0000, 0x0000, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, 0x0000, 0xc2a3,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03281 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf054, 0x0000, 0xf27b, 0x0000, 0x0000, 0xc3a9,
+ /* 88 */ 0x0000, 0xf279, 0xf27a, 0x0000, 0xf474, 0xf477, 0xf475, 0xf476,
+ /* 90 */ 0xf5e0, 0x0000, 0x0000, 0xc4ef, 0xf7eb, 0xf8b4, 0x0000, 0xc5f7,
+ /* 98 */ 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0x0000, 0xdac3, 0x0000,
+ /* a0 */ 0xdee3, 0x0000, 0xa5da, 0xa86f, 0x0000, 0xaabe, 0x0000, 0xcfe8,
+ /* a8 */ 0xcfe9, 0xaf78, 0x0000, 0x0000, 0xdac4, 0xb575, 0xb847, 0xc142,
+ /* b0 */ 0xeda4, 0xf27c, 0xf478, 0xa5db, 0x0000, 0x0000, 0x0000, 0xcda1,
+ /* b8 */ 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d, 0xcd7b, 0xaabf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x032bf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xace2, 0xcff2, 0x0000, 0xcfed, 0xcfea, 0x0000,
+ /* 88 */ 0x0000, 0xcff1, 0x0000, 0x0000, 0xace4, 0xace5, 0xcff0, 0xcfef,
+ /* 90 */ 0xcfee, 0xcfeb, 0xcfec, 0xcff3, 0xace3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaf7c, 0x0000, 0xafa4,
+ /* a0 */ 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0x0000, 0xafa1, 0xd6b9, 0xaf7a,
+ /* a8 */ 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd,
+ /* b0 */ 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0x0000, 0xaf7e,
+ /* b8 */ 0xaf7b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x032fc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb2b9, 0x0000, 0xd6ba, 0x0000, 0x0000,
+ /* 88 */ 0xd6b3, 0xd6b5, 0xd6b7, 0x0000, 0xd6b8, 0xd6b6, 0xb2ba, 0x0000,
+ /* 90 */ 0xd6bb, 0x0000, 0xd6b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdac8, 0xb576, 0xdad0, 0x0000,
+ /* a0 */ 0xdac5, 0x0000, 0xdad1, 0x0000, 0xdac6, 0xdac7, 0x0000, 0x0000,
+ /* a8 */ 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9, 0xdacc, 0xb578,
+ /* b0 */ 0xdacd, 0xdaca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdeee, 0x0000, 0xdef2, 0xb84e, 0x0000, 0xe2f0, 0xb851,
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0333c ***/
+
+ /* 80 */ 0xdef0, 0xf9d6, 0x0000, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4,
+ /* 88 */ 0x0000, 0xb84d, 0x0000, 0x0000, 0xb84c, 0x0000, 0xb848, 0xdee7,
+ /* 90 */ 0x0000, 0xb84f, 0x0000, 0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a,
+ /* 98 */ 0xb84b, 0xdeef, 0xdee5, 0x0000, 0x0000, 0x0000, 0xe2f2, 0xbad0,
+ /* a0 */ 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0x0000, 0xbad1,
+ /* a8 */ 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0x0000, 0x0000,
+ /* b0 */ 0xb849, 0x0000, 0xe2eb, 0xbad2, 0xe2ed, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xbd54, 0xe6c1, 0xbd58, 0x0000, 0xbd56,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0337b ***/
+
+ /* 80 */ 0x0000, 0xbacf, 0x0000, 0xe6c8, 0xe6c9, 0xbd53, 0x0000, 0x0000,
+ /* 88 */ 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2,
+ /* 90 */ 0xbd59, 0xe6c4, 0x0000, 0x0000, 0xe6c6, 0xbd57, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xbf6a, 0xeaa8, 0x0000, 0xeaa2, 0xeaa6, 0xeaac,
+ /* a0 */ 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0x0000, 0xeaa4, 0x0000, 0xbf6c,
+ /* a8 */ 0xbf69, 0xeaa3, 0xeaa5, 0x0000, 0xbf6b, 0xeaab, 0x0000, 0xc146,
+ /* b0 */ 0x0000, 0x0000, 0xedaa, 0xeda5, 0xc145, 0x0000, 0x0000, 0xc143,
+ /* b8 */ 0x0000, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x033bb ***/
+
+ /* 80 */ 0x0000, 0xc147, 0xeda7, 0x0000, 0xedae, 0xedab, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf05a, 0x0000, 0x0000, 0xf057, 0x0000, 0xc2a6, 0x0000,
+ /* 90 */ 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0x0000, 0x0000, 0xf2a3,
+ /* 98 */ 0x0000, 0xc3aa, 0x0000, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0x0000,
+ /* a0 */ 0x0000, 0xf2a1, 0x0000, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b,
+ /* a8 */ 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0x0000, 0xf5e3,
+ /* b0 */ 0x0000, 0xf5e2, 0x0000, 0x0000, 0x0000, 0xf6f6, 0x0000, 0x0000,
+ /* b8 */ 0xf8b5, 0xf8fa, 0xa5dc, 0x0000, 0x0000, 0xcb72, 0xaac0, 0xcda3,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x033fb ***/
+
+ /* 80 */ 0xaac1, 0xaac2, 0xcda2, 0x0000, 0xcff8, 0xcff7, 0xace6, 0xace9,
+ /* 88 */ 0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0x0000, 0x0000, 0xd2e8,
+ /* 90 */ 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad,
+ /* 98 */ 0x0000, 0x0000, 0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9,
+ /* a0 */ 0xafa8, 0xd6c2, 0x0000, 0xd6c0, 0xd6bc, 0xb2bb, 0x0000, 0xd6bd,
+ /* a8 */ 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0x0000, 0xb2bd, 0x0000, 0x0000,
+ /* b0 */ 0xdad5, 0x0000, 0xdad4, 0xdad3, 0xdad2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdef6, 0xb852, 0x0000, 0xdef3, 0xdef5, 0x0000, 0xb853,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x0343b ***/
+
+ /* 80 */ 0x0000, 0xb854, 0xdef4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe341, 0x0000, 0xe2f9, 0xe2fa, 0x0000, 0xbad7, 0xbad5, 0xbad6,
+ /* 90 */ 0xe343, 0x0000, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340,
+ /* 98 */ 0xe2f8, 0x0000, 0xe6cb, 0xe6d0, 0xe6ce, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe6cd, 0xe6cc, 0xe6cf, 0x0000, 0xeaae, 0x0000, 0xbf6d, 0xc148,
+ /* a8 */ 0xedb0, 0x0000, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0x0000,
+ /* b0 */ 0xf2a5, 0xc3ab, 0xf4a1, 0xc5a1, 0xf6f7, 0x0000, 0xf8b7, 0xf8b6,
+ /* b8 */ 0xc9a8, 0xacea, 0xaceb, 0xd6c3, 0x0000, 0xb856, 0xa5dd, 0xa872,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x0347b ***/
+
+ /* 80 */ 0xa871, 0xa870, 0x0000, 0x0000, 0x0000, 0xcda4, 0x0000, 0x0000,
+ /* 88 */ 0xaac4, 0xaac3, 0x0000, 0xacee, 0x0000, 0xcffa, 0xcffd, 0xcffb,
+ /* 90 */ 0x0000, 0xacec, 0xaced, 0x0000, 0x0000, 0xcff9, 0xcffc, 0x0000,
+ /* 98 */ 0xafb5, 0x0000, 0x0000, 0x0000, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2,
+ /* a0 */ 0xd2ef, 0x0000, 0x0000, 0xafb0, 0xafaf, 0x0000, 0xafb3, 0xafb1,
+ /* a8 */ 0x0000, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6c6, 0xd6c7,
+ /* b8 */ 0xd6c5, 0x0000, 0xd6c4, 0xb2be, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x034bb ***/
+
+ /* 80 */ 0xb57d, 0x0000, 0xdad6, 0xdad8, 0xdada, 0xb57c, 0x0000, 0x0000,
+ /* 88 */ 0xb57a, 0x0000, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0x0000, 0x0000,
+ /* 90 */ 0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0x0000, 0xdefb,
+ /* 98 */ 0xdef8, 0xdef9, 0xb858, 0xdf40, 0xb857, 0x0000, 0xb85c, 0xb85b,
+ /* a0 */ 0xb859, 0x0000, 0xdefd, 0x0000, 0x0000, 0x0000, 0xe349, 0x0000,
+ /* a8 */ 0xe348, 0x0000, 0x0000, 0xe344, 0x0000, 0x0000, 0xbad8, 0xe347,
+ /* b0 */ 0xe346, 0xbad9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd5e,
+ /* b8 */ 0x0000, 0xe6d2, 0x0000, 0xbd5f, 0xbd5b, 0xbd5d, 0x0000, 0xbd5a,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x034fb ***/
+
+ /* 80 */ 0xbd5c, 0x0000, 0x0000, 0x0000, 0xeaaf, 0x0000, 0xbf70, 0xeab1,
+ /* 88 */ 0xeab0, 0x0000, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedb5, 0x0000, 0xedb3, 0xc14a,
+ /* 98 */ 0xedb4, 0x0000, 0xedb6, 0xedb2, 0xedb1, 0x0000, 0x0000, 0xf060,
+ /* a0 */ 0xc2aa, 0xc2a8, 0xc2a9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a6,
+ /* a8 */ 0xf2a7, 0xc3ad, 0x0000, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, 0x0000,
+ /* b0 */ 0xf6f8, 0xf6f9, 0x0000, 0x0000, 0xa5de, 0xca48, 0xa873, 0x0000,
+ /* b8 */ 0xcda5, 0xaac6, 0xaac5, 0xcda6, 0x0000, 0x0000, 0xd040, 0xacef,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x0353b ***/
+
+ /* 80 */ 0xcffe, 0xacf0, 0x0000, 0x0000, 0xafb6, 0xd2f8, 0xd2f6, 0xd2fc,
+ /* 88 */ 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0x0000, 0x0000, 0xd6c8,
+ /* 90 */ 0xd6ca, 0x0000, 0xb2bf, 0x0000, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1,
+ /* 98 */ 0xb57e, 0xdadb, 0x0000, 0x0000, 0x0000, 0x0000, 0xdf44, 0xb85d,
+ /* a0 */ 0xb85e, 0x0000, 0xdf43, 0xdf42, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0x0000, 0xbd61, 0xbd60,
+ /* b0 */ 0x0000, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6,
+ /* b8 */ 0xeab3, 0x0000, 0xbf73, 0x0000, 0x0000, 0x0000, 0xedb7, 0xc14b,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x0357b ***/
+
+ /* 80 */ 0xedb8, 0xedb9, 0x0000, 0x0000, 0xc2ab, 0xc2ac, 0x0000, 0xc475,
+ /* 88 */ 0x0000, 0x0000, 0xc5d1, 0xa5df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd2fd, 0xafb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3ba,
+ /* a0 */ 0xb3b9, 0x0000, 0x0000, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xdf45, 0x0000, 0xbadc, 0xe34d, 0xbadd,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc476, 0xf4a5,
+ /* b8 */ 0x0000, 0xa6cb, 0xaac7, 0xcda7, 0x0000, 0xacf2, 0x0000, 0xacf1,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x035bb ***/
+
+ /* 80 */ 0xd042, 0xd043, 0x0000, 0x0000, 0xd340, 0xd342, 0xafb9, 0x0000,
+ /* 88 */ 0xd344, 0xd347, 0xd345, 0x0000, 0x0000, 0x0000, 0xd346, 0xd343,
+ /* 90 */ 0xd2fe, 0xafba, 0xd348, 0xd341, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0x0000, 0xd6d5, 0xb2c7, 0x0000,
+ /* a0 */ 0xb2c1, 0x0000, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0x0000,
+ /* a8 */ 0xb2c2, 0x0000, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9,
+ /* b0 */ 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0x0000, 0x0000,
+ /* b8 */ 0xd6db, 0x0000, 0x0000, 0xdadf, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7adxx - offset 0x035fb ***/
+
+ /* 80 */ 0xdae4, 0x0000, 0x0000, 0x0000, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc,
+ /* 88 */ 0xdae1, 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad,
+ /* 90 */ 0xb5a8, 0xb5ae, 0xb5a9, 0x0000, 0xb5aa, 0x0000, 0xb5a6, 0x0000,
+ /* 98 */ 0xdae5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb861, 0xdf50, 0x0000, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863,
+ /* a8 */ 0x0000, 0xdf4a, 0x0000, 0x0000, 0x0000, 0xdf48, 0xb862, 0x0000,
+ /* b0 */ 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f,
+ /* b8 */ 0xdf51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x03639 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe35d, 0x0000, 0xbae8, 0xe358, 0x0000, 0xbae7,
+ /* 88 */ 0xe34e, 0x0000, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5,
+ /* 90 */ 0xe352, 0xe351, 0x0000, 0x0000, 0xbae4, 0xbadf, 0xe353, 0xbae2,
+ /* 98 */ 0xe359, 0xe35b, 0x0000, 0xe356, 0xe34f, 0xbae3, 0x0000, 0x0000,
+ /* a0 */ 0xbd69, 0xbade, 0x0000, 0x0000, 0xe35c, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d9, 0xbd62, 0x0000, 0xe6db,
+ /* b0 */ 0x0000, 0xbd63, 0x0000, 0x0000, 0xbd65, 0xe6de, 0x0000, 0xe6d6,
+ /* b8 */ 0xbae6, 0xe6dc, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d8, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03679 ***/
+
+ /* 80 */ 0xb860, 0xbd68, 0x0000, 0x0000, 0xbd64, 0x0000, 0xbd66, 0xbd67,
+ /* 88 */ 0x0000, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0x0000, 0xe6da, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeac0, 0xeabb, 0x0000, 0x0000,
+ /* 98 */ 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6,
+ /* a0 */ 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9,
+ /* a8 */ 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, 0x0000, 0x0000, 0xc14f,
+ /* b8 */ 0xedc8, 0xeabf, 0x0000, 0xedbf, 0x0000, 0xedc9, 0xc14e, 0xedbe,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x036b9 ***/
+
+ /* 80 */ 0xedbd, 0xedc7, 0xedc4, 0xedc6, 0x0000, 0xedba, 0xedca, 0xc14c,
+ /* 88 */ 0x0000, 0xedc5, 0xedce, 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb,
+ /* 90 */ 0xedcd, 0xbf75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf063, 0x0000, 0x0000, 0xf061, 0xf067, 0xc2b0, 0xf065,
+ /* a0 */ 0xf064, 0xc2b2, 0xf06a, 0xc2b1, 0x0000, 0xf06b, 0xf068, 0xc2ae,
+ /* a8 */ 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, 0xf066, 0x0000, 0x0000,
+ /* b0 */ 0xf06c, 0x0000, 0x0000, 0xf2a8, 0x0000, 0x0000, 0x0000, 0xc3b2,
+ /* b8 */ 0xc3b0, 0xf2aa, 0x0000, 0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x036f9 ***/
+
+ /* 80 */ 0xc3b3, 0x0000, 0x0000, 0xc478, 0x0000, 0xf4aa, 0x0000, 0xf4a9,
+ /* 88 */ 0xf4a7, 0xf4a6, 0xf4a8, 0x0000, 0xc477, 0xc479, 0x0000, 0x0000,
+ /* 90 */ 0xc4f0, 0x0000, 0x0000, 0xf5e5, 0xf5e4, 0x0000, 0x0000, 0xf6fa,
+ /* 98 */ 0x0000, 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0x0000, 0x0000, 0xc5a3,
+ /* a0 */ 0xc5a2, 0x0000, 0x0000, 0xc5d3, 0xc5d2, 0xc5d4, 0xf7ed, 0xf7ec,
+ /* a8 */ 0x0000, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0x0000, 0xc659, 0xf96d,
+ /* b0 */ 0x0000, 0x0000, 0xc67e, 0xa6cc, 0x0000, 0xcda8, 0x0000, 0x0000,
+ /* b8 */ 0xd045, 0xd046, 0xd044, 0x0000, 0x0000, 0xacf3, 0x0000, 0xd047,
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x03739 ***/
+
+ /* 80 */ 0xd048, 0xd049, 0x0000, 0x0000, 0xd349, 0xd34f, 0x0000, 0x0000,
+ /* 88 */ 0xd34d, 0xafbb, 0xd34b, 0x0000, 0xd34c, 0xd34e, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd34a, 0xb2c9, 0x0000, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca,
+ /* 98 */ 0xd6df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdae8, 0xb5af,
+ /* a0 */ 0x0000, 0xdaea, 0xdae7, 0xd6e1, 0x0000, 0xb5b0, 0x0000, 0xf9db,
+ /* a8 */ 0xdae9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdf56,
+ /* b0 */ 0x0000, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xbae9, 0xe361, 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03779 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6df, 0x0000, 0x0000,
+ /* 88 */ 0xe6e0, 0x0000, 0xbd6b, 0xe6e2, 0xe6e1, 0x0000, 0xa261, 0x0000,
+ /* 90 */ 0xeaca, 0xeacb, 0xeac7, 0x0000, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9,
+ /* 98 */ 0x0000, 0xc157, 0x0000, 0x0000, 0xc153, 0xc158, 0xc154, 0xc156,
+ /* a0 */ 0xc152, 0x0000, 0xc155, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2b3,
+ /* a8 */ 0xedcf, 0x0000, 0xf2ae, 0x0000, 0xf2ad, 0x0000, 0xf4ab, 0xc47a,
+ /* b0 */ 0xc47b, 0xf741, 0xf5e6, 0x0000, 0xf740, 0x0000, 0xf8fd, 0xf9a4,
+ /* b8 */ 0xa6cd, 0x0000, 0x0000, 0xa874, 0x0000, 0xcda9, 0xaac8, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x037b9 ***/
+
+ /* 80 */ 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, 0xacf8,
+ /* 88 */ 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, 0xd359,
+ /* 90 */ 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, 0xafbd,
+ /* 98 */ 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, 0xd357,
+ /* a0 */ 0xafc0, 0xafbc, 0xafc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd6f0, 0xd6e9, 0x0000, 0xb5b5, 0xd6e8, 0x0000, 0xb2cf, 0xb2d6,
+ /* b0 */ 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0x0000, 0xd6e2, 0xd6e5, 0x0000,
+ /* b8 */ 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x037f9 ***/
+
+ /* 80 */ 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb,
+ /* 88 */ 0x0000, 0x0000, 0xd6ee, 0x0000, 0x0000, 0x0000, 0xdafb, 0xdaf2,
+ /* 90 */ 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0x0000,
+ /* 98 */ 0xdaeb, 0x0000, 0x0000, 0xb86c, 0xdaf4, 0x0000, 0xb5b1, 0xdafa,
+ /* a0 */ 0x0000, 0xb5b8, 0xb5ba, 0xdaed, 0x0000, 0x0000, 0xb5b9, 0xdaf0,
+ /* a8 */ 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0x0000, 0xdaf3, 0xb5b6, 0xdaec,
+ /* b0 */ 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb868, 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0x0000, 0xdf5b,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03839 ***/
+
+ /* 80 */ 0xdf59, 0xb86a, 0x0000, 0xdf60, 0xdf64, 0xdf5c, 0xdf58, 0x0000,
+ /* 88 */ 0xdf57, 0x0000, 0x0000, 0x0000, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b,
+ /* 90 */ 0x0000, 0xb869, 0xdf66, 0xb867, 0xdf63, 0x0000, 0xe372, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaee, 0xe36a, 0xbd78, 0xe374,
+ /* a0 */ 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0x0000, 0x0000, 0xe375, 0xe362,
+ /* a8 */ 0x0000, 0xe377, 0xe366, 0x0000, 0xbafe, 0xbafb, 0xe376, 0xe370,
+ /* b0 */ 0xbaed, 0xbaf5, 0xbaf4, 0x0000, 0xbaf3, 0xbaf9, 0x0000, 0xe363,
+ /* b8 */ 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0, 0xbaf8,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03879 ***/
+
+ /* 80 */ 0xe368, 0xe367, 0xe364, 0x0000, 0xe36c, 0xe369, 0xe36d, 0xbafd,
+ /* 88 */ 0x0000, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0x0000, 0xe36b, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xbafc, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e7,
+ /* 98 */ 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0x0000, 0xbd72, 0xbd76, 0xe6f0,
+ /* a0 */ 0xbd6c, 0xe6e8, 0x0000, 0xbd74, 0x0000, 0x0000, 0xe6eb, 0xe6e6,
+ /* a8 */ 0xbd73, 0xbd77, 0xe6e5, 0x0000, 0xbd71, 0x0000, 0xe6ef, 0xbd6e,
+ /* b0 */ 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0x0000, 0xe6ec, 0xe6e3,
+ /* b8 */ 0x0000, 0xbd7b, 0xe6ea, 0xbd6f, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x038b6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe6e9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9,
+ /* 90 */ 0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace,
+ /* 98 */ 0x0000, 0x0000, 0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0,
+ /* a0 */ 0xead1, 0xeacd, 0xead7, 0xbfa4, 0xeade, 0xeadd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xedda, 0xedd6, 0xc15f, 0x0000, 0xedd0, 0xc159, 0xc169,
+ /* b0 */ 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c,
+ /* b8 */ 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168,
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x038f6 ***/
+
+ /* 80 */ 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9,
+ /* 88 */ 0xc166, 0xedd7, 0x0000, 0x0000, 0xeddb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076,
+ /* 98 */ 0xf071, 0xc2ba, 0xc2b7, 0x0000, 0xf06d, 0x0000, 0xc2b6, 0xf073,
+ /* a0 */ 0xf075, 0xc2b8, 0xf072, 0xf070, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0x0000, 0xc3b5, 0x0000, 0xf2b4,
+ /* b0 */ 0xf2b2, 0x0000, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, 0xf2af, 0xf2b3,
+ /* b8 */ 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, 0xf4ad, 0x0000,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03936 ***/
+
+ /* 80 */ 0xf4af, 0xf4ae, 0xc4a1, 0x0000, 0x0000, 0x0000, 0xf5eb, 0xf5e8,
+ /* 88 */ 0xf5e9, 0x0000, 0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0x0000, 0xc4f1,
+ /* 90 */ 0x0000, 0xf742, 0x0000, 0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9,
+ /* 98 */ 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03953 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa6ce, 0x0000,
+ /* b8 */ 0xacfb, 0xd26f, 0xafca, 0x0000, 0x0000, 0xb2da, 0xdafc, 0xdafd,
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03993 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeadf, 0xc16a, 0xede1, 0x0000, 0x0000,
+ /* 88 */ 0xc2bb, 0x0000, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0x0000, 0xf743,
+ /* 90 */ 0xc5f8, 0xca49, 0x0000, 0x0000, 0xaac9, 0xa875, 0x0000, 0x0000,
+ /* 98 */ 0xd04d, 0x0000, 0x0000, 0xd360, 0xd35b, 0xd35f, 0xd35d, 0xafcb,
+ /* a0 */ 0xd35e, 0xd35c, 0x0000, 0xd6f1, 0x0000, 0xdafe, 0xdb40, 0xdf69,
+ /* a8 */ 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0x0000,
+ /* b0 */ 0xbb40, 0x0000, 0xb870, 0xe37a, 0x0000, 0xbd7c, 0xe6f1, 0xbd7d,
+ /* b8 */ 0x0000, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2,
+
+ /*** Three byte table, leaf: e7bexx - offset 0x039d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf2bb, 0x0000, 0xc3b9, 0xf2bc, 0xf744,
+ /* 88 */ 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0x0000,
+ /* 90 */ 0x0000, 0xd04e, 0xd362, 0x0000, 0xafcc, 0xd6f2, 0xd361, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, 0x0000,
+ /* a0 */ 0xdb42, 0xdb43, 0xdb41, 0x0000, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e,
+ /* a8 */ 0xb872, 0xb871, 0x0000, 0x0000, 0xe6f2, 0xe6f4, 0x0000, 0xbd7e,
+ /* b0 */ 0xe6f3, 0xeae3, 0xbfaa, 0xf079, 0x0000, 0xf078, 0xc3bb, 0xf2bd,
+ /* b8 */ 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03a13 ***/
+
+ /* 80 */ 0xd365, 0xafce, 0xd364, 0xd363, 0x0000, 0xafcd, 0x0000, 0xd6fb,
+ /* 88 */ 0x0000, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc,
+ /* 90 */ 0xd6f9, 0xd6fa, 0xb2df, 0x0000, 0xb5be, 0xb5bf, 0x0000, 0xdb44,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdf6f, 0xdf70, 0x0000, 0xe37e, 0xbb43,
+ /* a0 */ 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0x0000, 0xe37d, 0xe6f9, 0x0000,
+ /* a8 */ 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4,
+ /* b0 */ 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0x0000, 0xf07a,
+ /* b8 */ 0xf07b, 0xc2bc, 0x0000, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03a53 ***/
+
+ /* 80 */ 0xc4a3, 0xa6d1, 0x0000, 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb5c0, 0xa6d3, 0xad41, 0xd052, 0xd053,
+ /* 90 */ 0xad40, 0xad42, 0xa6d4, 0x0000, 0xd054, 0xafd1, 0xd366, 0xafd3,
+ /* 98 */ 0xafd0, 0xafd2, 0x0000, 0xd741, 0xb2e0, 0x0000, 0xd740, 0xd6fe,
+ /* a0 */ 0x0000, 0xdf71, 0x0000, 0x0000, 0xe3a1, 0x0000, 0xbda2, 0x0000,
+ /* a8 */ 0xbfae, 0xeae6, 0xeae5, 0x0000, 0xede7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf5ef, 0x0000, 0x0000, 0xa6d5, 0xcb73, 0xcdaa, 0xad43, 0xd055,
+ /* b8 */ 0x0000, 0xd368, 0x0000, 0x0000, 0x0000, 0xafd4, 0xd367, 0xafd5,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03a93 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd743, 0x0000, 0x0000, 0xb2e2, 0xd742,
+ /* 88 */ 0xd744, 0x0000, 0xb2e1, 0x0000, 0x0000, 0x0000, 0x0000, 0xdb46,
+ /* 90 */ 0xdb47, 0xdb45, 0xb5c1, 0x0000, 0x0000, 0x0000, 0xb874, 0x0000,
+ /* 98 */ 0xb875, 0x0000, 0xbb45, 0x0000, 0xe3a3, 0xe3a2, 0xbb44, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6fb, 0x0000, 0x0000, 0xe6fc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeae7, 0x0000, 0x0000, 0xc170,
+ /* b0 */ 0xc16f, 0xc16d, 0xc16e, 0xc171, 0x0000, 0xf07c, 0xc2bf, 0xc2be,
+ /* b8 */ 0xf2c0, 0xf4b2, 0x0000, 0x0000, 0x0000, 0xc5a5, 0xc5a4, 0xa6d6,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03ad3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd1fb, 0x0000, 0xb877, 0xb5c2, 0xb876, 0xbb46,
+ /* 88 */ 0x0000, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0x0000, 0x0000, 0xcdab,
+ /* 90 */ 0xcb76, 0x0000, 0xcb77, 0xa877, 0x0000, 0xcb74, 0xa876, 0x0000,
+ /* 98 */ 0xa879, 0xcb75, 0xa87b, 0xa87a, 0xcb78, 0xa878, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xaad1, 0xaacf, 0xcdad, 0x0000, 0xaace, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xaad3, 0xaad5, 0xaad2, 0x0000, 0xcdb0, 0xcdac, 0xaad6,
+ /* b0 */ 0x0000, 0xaad0, 0xa87c, 0x0000, 0xaad4, 0xcdaf, 0x0000, 0x0000,
+ /* b8 */ 0xcdae, 0x0000, 0xaacd, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03b11 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd05b, 0xad47, 0xad48, 0xd05d, 0x0000, 0xd057,
+ /* 88 */ 0xd05a, 0xd063, 0xd061, 0x0000, 0xad49, 0xd067, 0xad4c, 0xd064,
+ /* 90 */ 0xd05c, 0xd059, 0x0000, 0x0000, 0xdb49, 0xd062, 0xad44, 0xd065,
+ /* 98 */ 0xd056, 0xd05f, 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0x0000,
+ /* a0 */ 0xd058, 0xad4a, 0x0000, 0xd05e, 0xad4e, 0xad45, 0xd066, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xafda, 0x0000, 0xafe3,
+ /* b0 */ 0xafd8, 0xafd6, 0xd36a, 0xafde, 0xafdb, 0xd36c, 0x0000, 0x0000,
+ /* b8 */ 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, 0xafe0, 0xdb48, 0x0000,
+
+ /*** Three byte table, leaf: e884xx - offset 0x03b51 ***/
+
+ /* 80 */ 0xd36f, 0xd36d, 0xafd7, 0x0000, 0x0000, 0xafd9, 0xafdc, 0x0000,
+ /* 88 */ 0xafdf, 0x0000, 0xafe1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd74e, 0xb2e4, 0x0000,
+ /* 98 */ 0xd745, 0xd747, 0x0000, 0xd748, 0x0000, 0xd750, 0xd74c, 0xd74a,
+ /* a0 */ 0x0000, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0x0000, 0xd74f,
+ /* a8 */ 0x0000, 0xb2e7, 0x0000, 0xb2e6, 0xd74b, 0xd749, 0x0000, 0xb2e3,
+ /* b0 */ 0xb2e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb5c8, 0xdb51, 0x0000, 0x0000, 0xdb4f, 0xb5ca,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03b90 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xdb4a, 0xdfa1, 0x0000, 0xb5c9, 0xdb4e,
+ /* 88 */ 0x0000, 0x0000, 0xdb4b, 0xb5c5, 0xb5cb, 0xdb50, 0xb5c7, 0xdb4d,
+ /* 90 */ 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, 0xb5c3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdf77, 0xdf75, 0x0000, 0xdf7b, 0x0000,
+ /* a0 */ 0xdf73, 0xdfa2, 0xdf78, 0x0000, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d,
+ /* a8 */ 0x0000, 0xdf76, 0x0000, 0xb87e, 0x0000, 0x0000, 0xb87c, 0xdf7e,
+ /* b0 */ 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0x0000, 0xdf7c, 0xdf74,
+ /* b8 */ 0xb87a, 0xb8a1, 0xb8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xbb4c,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03bd0 ***/
+
+ /* 80 */ 0xbb48, 0x0000, 0xbb4d, 0xe3a6, 0x0000, 0x0000, 0xe3a5, 0xe3a7,
+ /* 88 */ 0xbb4a, 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0x0000, 0xbb49,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe741, 0x0000, 0xe744,
+ /* 98 */ 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe,
+ /* a0 */ 0xbda6, 0x0000, 0xe742, 0xe6fd, 0x0000, 0x0000, 0xeae9, 0xeaf3,
+ /* a8 */ 0xbfb1, 0xbfb0, 0x0000, 0xeaed, 0xeaef, 0x0000, 0xeaea, 0x0000,
+ /* b0 */ 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, 0x0000, 0xeaf2,
+ /* b8 */ 0x0000, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03c10 ***/
+
+ /* 80 */ 0xc176, 0x0000, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded,
+ /* 88 */ 0x0000, 0xc179, 0xedeb, 0x0000, 0xedea, 0xc2c0, 0x0000, 0xc2c1,
+ /* 90 */ 0xf0a1, 0xf07d, 0xf07e, 0x0000, 0x0000, 0xf2c2, 0x0000, 0xf2c1,
+ /* 98 */ 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0x0000, 0xf5f0, 0xf745, 0xc5a6,
+ /* a0 */ 0xf943, 0xf944, 0xc5d8, 0xa6da, 0x0000, 0xaad7, 0xdb52, 0xbb4e,
+ /* a8 */ 0xc17b, 0xedef, 0xa6db, 0x0000, 0xafe5, 0xafe4, 0xdb53, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeaf4, 0xa6dc, 0xad50, 0x0000, 0x0000, 0xdb54,
+ /* b8 */ 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0x0000, 0xaad8, 0xd068,
+
+ /*** Three byte table, leaf: e888xx - offset 0x03c50 ***/
+
+ /* 80 */ 0xafe6, 0xd370, 0xb2ea, 0x0000, 0xdb57, 0xb8a4, 0x0000, 0xbb50,
+ /* 88 */ 0xbfb3, 0xc17c, 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0x0000, 0x0000,
+ /* 90 */ 0xafe7, 0xd752, 0xb5ce, 0x0000, 0xbb51, 0xe3ab, 0xe745, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0,
+ /* a0 */ 0xcdb1, 0xd069, 0xad51, 0x0000, 0x0000, 0xd372, 0x0000, 0x0000,
+ /* a8 */ 0xafea, 0x0000, 0xafe8, 0xafe9, 0xafeb, 0x0000, 0x0000, 0xd371,
+ /* b0 */ 0x0000, 0x0000, 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec,
+ /* b8 */ 0xd753, 0xb2ee, 0xd755, 0x0000, 0xdb58, 0xdb59, 0x0000, 0xdb5a,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03c90 ***/
+
+ /* 80 */ 0xdfa6, 0x0000, 0xdfa7, 0x0000, 0xdfa5, 0xdfa8, 0x0000, 0xb8a5,
+ /* 88 */ 0x0000, 0xdfa4, 0x0000, 0xbb53, 0x0000, 0x0000, 0xe74a, 0xe746,
+ /* 90 */ 0xe749, 0xe74b, 0xe748, 0xe747, 0x0000, 0xeaf5, 0xeaf6, 0xeaf7,
+ /* 98 */ 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0x0000, 0xf0a3, 0xf0a2,
+ /* a0 */ 0x0000, 0xf2c4, 0x0000, 0xf2c5, 0xf2c3, 0x0000, 0xc4a5, 0x0000,
+ /* a8 */ 0xf4b6, 0xf4b7, 0x0000, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d,
+ /* b0 */ 0x0000, 0xc17d, 0xa6e2, 0x0000, 0xd758, 0xdb5b, 0x0000, 0xc641,
+ /* b8 */ 0xca4a, 0x0000, 0x0000, 0x0000, 0xca4b, 0xca4d, 0xa6e3, 0xca4e,
+
+ /*** Three byte table, leaf: e88axx - offset 0x03cd0 ***/
+
+ /* 80 */ 0xca4c, 0x0000, 0x0000, 0xcba2, 0xcba3, 0xcb7b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcba1, 0xa8a1, 0x0000, 0xa8a2, 0xcb7c, 0xcb7a,
+ /* 90 */ 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0x0000, 0xaadb, 0xcdbc, 0xaadf,
+ /* a0 */ 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3, 0x0000, 0xcdb9,
+ /* a8 */ 0xcdbf, 0xcdc1, 0x0000, 0xcdb4, 0xaae2, 0xaadd, 0xcdba, 0xaae4,
+ /* b0 */ 0xaae7, 0xaae1, 0x0000, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5, 0xaae9,
+ /* b8 */ 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8, 0x0000,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03d10 ***/
+
+ /* 80 */ 0xcdb3, 0x0000, 0xcdc2, 0xcdc4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d,
+ /* 98 */ 0x0000, 0xd06b, 0x0000, 0xad56, 0xad60, 0x0000, 0xad63, 0xad65,
+ /* a0 */ 0xd0a2, 0xd077, 0x0000, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52,
+ /* a8 */ 0xd06f, 0x0000, 0xd07e, 0xd073, 0xd076, 0xd0a5, 0x0000, 0xad66,
+ /* b0 */ 0xd07d, 0xad5e, 0xd078, 0xd0a4, 0xd075, 0xd079, 0xd07c, 0x0000,
+ /* b8 */ 0x0000, 0xd06d, 0xd0a3, 0xd07b, 0x0000, 0x0000, 0xd06c, 0x0000,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03d50 ***/
+
+ /* 80 */ 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e,
+ /* 88 */ 0xd3a5, 0xad5b, 0x0000, 0x0000, 0xd07a, 0xce41, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a8, 0xaffa,
+ /* 98 */ 0x0000, 0xd376, 0x0000, 0xd3a3, 0xd37d, 0x0000, 0xd3b2, 0x0000,
+ /* a0 */ 0xd3aa, 0x0000, 0xd37e, 0x0000, 0xd3a9, 0xd378, 0xd37c, 0xd3b5,
+ /* a8 */ 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0x0000, 0xd3ac,
+ /* b0 */ 0x0000, 0xaffc, 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab,
+ /* b8 */ 0xaff1, 0xaff8, 0xd072, 0xdb5c, 0xd3a6, 0x0000, 0x0000, 0xd37a,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x03d90 ***/
+
+ /* 80 */ 0xaffb, 0xd37b, 0xd3a1, 0xaffe, 0xd375, 0xd3af, 0x0000, 0xd3ae,
+ /* 88 */ 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, 0xd3a7, 0xd3a2, 0xaff6,
+ /* 90 */ 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, 0x0000, 0xd379, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc,
+ /* b8 */ 0xb2f2, 0x0000, 0xd75d, 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775,
+
+ /*** Three byte table, leaf: e88exx - offset 0x03dd0 ***/
+
+ /* 80 */ 0x0000, 0xd762, 0x0000, 0xd769, 0x0000, 0x0000, 0xb340, 0xd777,
+ /* 88 */ 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761,
+ /* 90 */ 0xd759, 0x0000, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773,
+ /* 98 */ 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0x0000, 0xd76b, 0xb2f0, 0x0000,
+ /* a0 */ 0xb2fb, 0x0000, 0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341,
+ /* a8 */ 0xd75b, 0xd767, 0xd76d, 0xb2f6, 0x0000, 0x0000, 0xd778, 0xd771,
+ /* b0 */ 0xd774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2f5, 0x0000, 0xdb6c,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x03e10 ***/
+
+ /* 80 */ 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3,
+ /* 88 */ 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0x0000, 0xdb74, 0xdb5d,
+ /* 90 */ 0x0000, 0xdba4, 0x0000, 0x0000, 0xb5e8, 0xdba1, 0xdb75, 0xdbac,
+ /* 98 */ 0xdb70, 0xdfc8, 0x0000, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9,
+ /* a0 */ 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0x0000, 0xdb63,
+ /* a8 */ 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0x0000, 0xdba9, 0xb5d8,
+ /* b0 */ 0xb5dd, 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0x0000,
+ /* b8 */ 0xb5d2, 0xdb5e, 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71,
+
+ /*** Three byte table, leaf: e890xx - offset 0x03e50 ***/
+
+ /* 80 */ 0x0000, 0xdb6d, 0x0000, 0xb5d1, 0xb5e5, 0x0000, 0xdb7c, 0xb5e7,
+ /* 88 */ 0x0000, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, 0xb5e4, 0xdb79,
+ /* 90 */ 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdbae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdb5f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdfc7, 0x0000, 0xdfdd, 0xb855, 0xdfcc, 0x0000, 0xdfca,
+ /* b0 */ 0xdfb5, 0xb8a9, 0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf,
+ /* b8 */ 0xb5e3, 0xdfcf, 0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0x0000, 0xdfaa,
+
+ /*** Three byte table, leaf: e891xx - offset 0x03e90 ***/
+
+ /* 80 */ 0xdfb2, 0x0000, 0xdfcb, 0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7,
+ /* 88 */ 0x0000, 0xb8ad, 0x0000, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0x0000,
+ /* 90 */ 0xdfe1, 0xdfb1, 0xdfd2, 0x0000, 0xdfdf, 0x0000, 0xdfab, 0xb5db,
+ /* 98 */ 0x0000, 0xdfb9, 0xdfb8, 0xb8af, 0x0000, 0xdfbc, 0xdfbe, 0xdfcd,
+ /* a0 */ 0xdfde, 0xb8b2, 0x0000, 0xb8b3, 0x0000, 0xdfb0, 0xb8ab, 0xdfb4,
+ /* a8 */ 0xdfda, 0xb8b4, 0x0000, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, 0xdfd3,
+ /* b0 */ 0xdfce, 0x0000, 0x0000, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7,
+ /* b8 */ 0xdfc4, 0xdfad, 0xdfc2, 0x0000, 0x0000, 0xdfb7, 0xdfdb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x03ecf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb8a6, 0x0000, 0x0000, 0x0000, 0xdfb3, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfaf, 0xdfd5, 0xdfae,
+ /* 90 */ 0xbb60, 0xe3d3, 0x0000, 0x0000, 0xe3c2, 0x0000, 0x0000, 0xe3ac,
+ /* 98 */ 0xe3ca, 0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af,
+ /* a0 */ 0xe3cd, 0xe3ae, 0xe3c1, 0x0000, 0xe3ad, 0x0000, 0x0000, 0xe3bf,
+ /* a8 */ 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0x0000, 0xe3b4, 0xe3c7,
+ /* b0 */ 0xe3d2, 0xe3bc, 0xbb5a, 0x0000, 0xe3b7, 0x0000, 0xe3cb, 0x0000,
+ /* b8 */ 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0x0000, 0x0000, 0xbb55,
+
+ /*** Three byte table, leaf: e893xx - offset 0x03f0f ***/
+
+ /* 80 */ 0xbb5e, 0xe3b8, 0xe3b2, 0x0000, 0xbb57, 0xdfd4, 0xbb56, 0xe3c3,
+ /* 88 */ 0x0000, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc,
+ /* 90 */ 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0x0000, 0xe3c9, 0xe3ce,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe3d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe773,
+ /* a8 */ 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, 0x0000, 0xbdac, 0xe776,
+ /* b0 */ 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0x0000, 0xe770, 0xe761,
+ /* b8 */ 0x0000, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6,
+
+ /*** Three byte table, leaf: e894xx - offset 0x03f4f ***/
+
+ /* 80 */ 0xe74f, 0x0000, 0xe76d, 0x0000, 0x0000, 0x0000, 0xbdb7, 0xdfbd,
+ /* 88 */ 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c, 0xe753, 0xe751, 0xe74e,
+ /* 90 */ 0x0000, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, 0xe760, 0xe768, 0xbda9,
+ /* 98 */ 0xe778, 0xe77c, 0xbdab, 0x0000, 0xe757, 0xe76b, 0xe76f, 0xe754,
+ /* a0 */ 0xe779, 0xbdb2, 0x0000, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, 0xe756,
+ /* a8 */ 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, 0xe77d,
+ /* b0 */ 0xe77a, 0xe771, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe74d, 0x0000, 0xbdaa, 0xeb49, 0x0000,
+
+ /*** Three byte table, leaf: e895xx - offset 0x03f8f ***/
+
+ /* 80 */ 0xeb40, 0xeb43, 0x0000, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47,
+ /* 88 */ 0xbfb8, 0xbfbc, 0xbfb6, 0x0000, 0x0000, 0xeafb, 0xeb4c, 0x0000,
+ /* 90 */ 0x0000, 0xeb46, 0x0000, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46,
+ /* 98 */ 0xeafe, 0xbfb7, 0x0000, 0xeb4a, 0x0000, 0xeb54, 0xbfbf, 0x0000,
+ /* a0 */ 0xeb51, 0xeafd, 0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50,
+ /* a8 */ 0xbfb9, 0xbfba, 0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0x0000,
+ /* b0 */ 0x0000, 0xeb4b, 0x0000, 0x0000, 0x0000, 0xeb4e, 0xee53, 0xee40,
+ /* b8 */ 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0x0000, 0xc1a2, 0x0000,
+
+ /*** Three byte table, leaf: e896xx - offset 0x03fcf ***/
+
+ /* 80 */ 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8,
+ /* 88 */ 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5,
+ /* 90 */ 0xee55, 0xc1a4, 0x0000, 0x0000, 0xc1a5, 0xedf7, 0xee48, 0x0000,
+ /* 98 */ 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56,
+ /* a0 */ 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0x0000, 0xc2cb, 0xedf6,
+ /* a8 */ 0xc1a9, 0xc2c4, 0xc17e, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1a6,
+ /* b0 */ 0xc2c8, 0xf0b3, 0x0000, 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8,
+ /* b8 */ 0xf0b7, 0xc2ca, 0xc2c9, 0x0000, 0x0000, 0xf0ab, 0xf0b9, 0xf0ae,
+
+ /*** Three byte table, leaf: e897xx - offset 0x0400f ***/
+
+ /* 80 */ 0xf0a6, 0x0000, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac,
+ /* 88 */ 0xf0b1, 0xc2c7, 0x0000, 0xf0af, 0x0000, 0xc2c5, 0xf0b0, 0xc2c3,
+ /* 90 */ 0xc2c6, 0xf2d5, 0xf0b5, 0x0000, 0x0000, 0xc3c2, 0x0000, 0xf2cd,
+ /* 98 */ 0xf2d1, 0xf2c9, 0xf2cc, 0x0000, 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2,
+ /* a0 */ 0x0000, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, 0xc3c4, 0xf2d7, 0x0000,
+ /* a8 */ 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, 0x0000, 0xf2d8,
+ /* b0 */ 0xf2d6, 0xf2c7, 0xf2cf, 0x0000, 0x0000, 0x0000, 0xf4be, 0xc3c5,
+ /* b8 */ 0xf2d0, 0xc4a7, 0xc4a9, 0xc4a6, 0x0000, 0xf4c3, 0xf4bb, 0xf4b9,
+
+ /*** Three byte table, leaf: e898xx - offset 0x0404f ***/
+
+ /* 80 */ 0xf4bd, 0xf4ba, 0x0000, 0x0000, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac,
+ /* 88 */ 0x0000, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc4a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4f4,
+ /* 98 */ 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0x0000, 0xf5fd, 0xf5f4,
+ /* a0 */ 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8,
+ /* a8 */ 0x0000, 0xf5fc, 0xf5f2, 0x0000, 0xf74a, 0xc4f5, 0xf5f9, 0x0000,
+ /* b0 */ 0x0000, 0xf7f4, 0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0x0000,
+ /* b8 */ 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, 0x0000, 0xf7f6, 0xc5da,
+
+ /*** Three byte table, leaf: e899xx - offset 0x0408f ***/
+
+ /* 80 */ 0xf7f1, 0x0000, 0x0000, 0xf8bc, 0x0000, 0x0000, 0xf945, 0xf946,
+ /* 88 */ 0xf947, 0x0000, 0x0000, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0x0000,
+ /* 90 */ 0xad68, 0x0000, 0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0x0000,
+ /* 98 */ 0x0000, 0xd77b, 0x0000, 0xb5ea, 0xb8b8, 0x0000, 0xb8b7, 0xb8b9,
+ /* a0 */ 0x0000, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0x0000, 0xc1ab,
+ /* a8 */ 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0x0000, 0xcdc9, 0xcdca, 0xcdc8,
+ /* b0 */ 0xcdc7, 0xaaeb, 0x0000, 0xd0a9, 0xd0a7, 0x0000, 0x0000, 0xd0a6,
+ /* b8 */ 0x0000, 0xad69, 0xad6b, 0xad6a, 0xd0a8,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x040cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3c4, 0xd3c1, 0xd3bf,
+ /* 88 */ 0x0000, 0x0000, 0xb041, 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0x0000,
+ /* 90 */ 0xd3cd, 0xd3bd, 0x0000, 0xb043, 0xd3ce, 0xd3c9, 0xd3bb, 0xd3c0,
+ /* 98 */ 0xd3ca, 0xd3c6, 0xd3c3, 0x0000, 0xb048, 0xd3cc, 0xd3be, 0x0000,
+ /* a0 */ 0x0000, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0x0000, 0xd3c8,
+ /* a8 */ 0xd3ba, 0xb045, 0xb042, 0x0000, 0x0000, 0x0000, 0x0000, 0xb34c,
+ /* b0 */ 0xd7a5, 0xb34b, 0x0000, 0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e,
+ /* b8 */ 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x0410c ***/
+
+ /* 80 */ 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344,
+ /* 88 */ 0xd7a6, 0xb34d, 0x0000, 0xb34a, 0xd7aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb5f1, 0xdbbf, 0x0000, 0xdbb4, 0xb5ee, 0x0000, 0xdfe7, 0xdbbd,
+ /* 98 */ 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb,
+ /* a0 */ 0x0000, 0x0000, 0xdbb2, 0xdbb5, 0xb5f0, 0x0000, 0xdbb3, 0x0000,
+ /* a8 */ 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfe8, 0xdfee, 0xdfe4,
+ /* b8 */ 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0x0000, 0x0000, 0xb8bf, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x0414c ***/
+
+ /* 80 */ 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd,
+ /* 88 */ 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0x0000,
+ /* 90 */ 0x0000, 0xe3f4, 0xe3e9, 0xb8bb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0x0000, 0xe3db, 0x0000,
+ /* a0 */ 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef,
+ /* a8 */ 0xe3d7, 0xbb6d, 0xe3e6, 0x0000, 0xe3e0, 0xe3e7, 0xe3da, 0x0000,
+ /* b0 */ 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0x0000, 0xbb6c,
+ /* b8 */ 0xe3f0, 0x0000, 0xe3ea, 0xbb66, 0xe3e8, 0x0000, 0xe3e2, 0xbb64,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x0418c ***/
+
+ /* 80 */ 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0x0000, 0x0000, 0xe3e3, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb,
+ /* 90 */ 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0,
+ /* 98 */ 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3,
+ /* a0 */ 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf,
+ /* a8 */ 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4,
+ /* b8 */ 0xbdbd, 0xeb64, 0xe7b7, 0xe7bc, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x041cb ***/
+
+ /* 80 */ 0x0000, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0x0000, 0xeb65,
+ /* 88 */ 0xeb60, 0xeb6f, 0x0000, 0x0000, 0x0000, 0xbfc4, 0x0000, 0xeb5c,
+ /* 90 */ 0xeb68, 0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0x0000, 0xeb62, 0xeb5d,
+ /* 98 */ 0xeb63, 0x0000, 0xeb6e, 0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1,
+ /* a0 */ 0x0000, 0x0000, 0xbfc3, 0xeb66, 0xf0cb, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67,
+ /* b0 */ 0xee5c, 0x0000, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66,
+ /* b8 */ 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x0420b ***/
+
+ /* 80 */ 0xc1ac, 0x0000, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0x0000,
+ /* 88 */ 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc1ad, 0xc1af, 0xf0c7, 0xf0c5, 0x0000, 0x0000, 0xf0cc,
+ /* 98 */ 0xf0c9, 0xf0cd, 0x0000, 0xf0be, 0xf0c6, 0xf0d1, 0xee6f, 0xf0c2,
+ /* a0 */ 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, 0xf0bc, 0xf0bb,
+ /* a8 */ 0xf0d0, 0x0000, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0x0000, 0xc2cc,
+ /* b0 */ 0x0000, 0x0000, 0xc2ce, 0xf0c3, 0xf0cf, 0x0000, 0xf2de, 0xf2df,
+ /* b8 */ 0x0000, 0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0x0000, 0xc3ca, 0xf2e6,
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x0424b ***/
+
+ /* 80 */ 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0x0000, 0xc3c7, 0xf2e3, 0x0000,
+ /* 88 */ 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0x0000, 0x0000,
+ /* 90 */ 0xf4c5, 0xf4c6, 0x0000, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7,
+ /* 98 */ 0x0000, 0xf4c4, 0x0000, 0xf642, 0xf645, 0xf641, 0x0000, 0xc4fa,
+ /* a0 */ 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f, 0x0000,
+ /* a8 */ 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0x0000, 0xf7f9, 0xf7d7,
+ /* b0 */ 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0x0000, 0xf8bf, 0xc5fa, 0xf8be,
+ /* b8 */ 0xf8bd, 0xc5fb, 0x0000, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x0428b ***/
+
+ /* 80 */ 0xa6e5, 0xd0aa, 0x0000, 0xd3cf, 0xd3d0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdbc0, 0x0000, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd7b1, 0xb34e, 0x0000, 0xdbc2, 0xdbc1, 0xb5f3,
+ /* 98 */ 0x0000, 0xb8c5, 0xe7c1, 0xbdc3, 0x0000, 0xbdc4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xbfc5, 0xc5fc, 0xa6e7, 0x0000, 0x0000, 0x0000, 0xd0ac,
+ /* a8 */ 0xaaed, 0xd0ae, 0xd0ad, 0xad6d, 0x0000, 0xd3d1, 0x0000, 0xd3d8,
+ /* b0 */ 0xb049, 0xd3d6, 0xd3d4, 0x0000, 0xd3db, 0xd3d2, 0xd3d3, 0xb04a,
+ /* b8 */ 0x0000, 0xb04e, 0x0000, 0x0000, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x042cb ***/
+
+ /* 80 */ 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb350, 0xd7b2, 0x0000, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0x0000,
+ /* 90 */ 0x0000, 0xd7b8, 0xb352, 0xd7c3, 0x0000, 0xd7b3, 0xb353, 0xd7bf,
+ /* 98 */ 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0x0000, 0x0000, 0xb34f, 0xd7ba,
+ /* a0 */ 0x0000, 0xd7b9, 0xd7b5, 0x0000, 0xd7c0, 0x0000, 0x0000, 0xd7bc,
+ /* a8 */ 0xd7b4, 0x0000, 0xd7b6, 0xb351, 0xd7c1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb5f6, 0xdbcd, 0x0000, 0x0000, 0x0000, 0xdbc9, 0xdbcb,
+ /* b8 */ 0xdbc6, 0xdbc5, 0xdbc3, 0x0000, 0xdbca, 0xdbcc, 0xdbc8, 0x0000,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x0430b ***/
+
+ /* 80 */ 0xdbc7, 0xb5f4, 0xb5f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xf9d8,
+ /* 90 */ 0xdff9, 0x0000, 0xb8cf, 0x0000, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4,
+ /* 98 */ 0xb8ca, 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6,
+ /* a0 */ 0x0000, 0xb8cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3f6,
+ /* a8 */ 0xbb74, 0x0000, 0x0000, 0xe442, 0xe441, 0x0000, 0xe3fb, 0xbb76,
+ /* b0 */ 0xe440, 0xe3f7, 0xe3f8, 0xbb6e, 0xbb70, 0x0000, 0xe3fd, 0xe3f5,
+ /* b8 */ 0xbb72, 0xbb71, 0xe3f9, 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x0434a ***/
+
+ /* 80 */ 0x0000, 0xdbce, 0xbb6f, 0x0000, 0x0000, 0xe7c2, 0xe7c9, 0xbdc6,
+ /* 88 */ 0x0000, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0x0000, 0xe7cc, 0x0000,
+ /* 90 */ 0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6,
+ /* 98 */ 0xe7c7, 0xe7c8, 0xbb75, 0x0000, 0x0000, 0x0000, 0xeb70, 0xeb7c,
+ /* a0 */ 0x0000, 0xbfca, 0xeb77, 0xeb79, 0x0000, 0xbfc8, 0xeb71, 0xeb75,
+ /* a8 */ 0x0000, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a,
+ /* b0 */ 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0x0000, 0xee71, 0xc1b7, 0xee77,
+ /* b8 */ 0xc1b9, 0x0000, 0x0000, 0xc1b6, 0xee73, 0xc1ba, 0xee74,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x04389 ***/
+
+ /* 80 */ 0x0000, 0xee75, 0xee78, 0x0000, 0xc1b8, 0x0000, 0xf0d6, 0x0000,
+ /* 88 */ 0x0000, 0xf0d9, 0x0000, 0xf0d3, 0xf0d5, 0x0000, 0x0000, 0xf0d4,
+ /* 90 */ 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0x0000, 0x0000, 0xc3cd, 0xf2ec,
+ /* 98 */ 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce, 0xc3cc,
+ /* a0 */ 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0x0000, 0xf4cb, 0x0000,
+ /* a8 */ 0x0000, 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8,
+ /* b0 */ 0x0000, 0xf752, 0xc5a7, 0xf7fd, 0xf7fc, 0x0000, 0xf7fb, 0x0000,
+ /* b8 */ 0x0000, 0xf948, 0xf949, 0xf94b, 0xf94a, 0x0000, 0xca50, 0xa6e8,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x043c9 ***/
+
+ /* 80 */ 0x0000, 0xad6e, 0xd7c5, 0xb5f7, 0x0000, 0xdffa, 0xc2d0, 0x0000,
+ /* 88 */ 0xf2f2, 0x0000, 0x0000, 0xa8a3, 0x0000, 0x0000, 0x0000, 0xb357,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xb356, 0x0000, 0xdbd0, 0xb5f8, 0xdbd2,
+ /* 98 */ 0xdbd1, 0x0000, 0x0000, 0xdffb, 0xb8d0, 0xe443, 0xe446, 0xe445,
+ /* a0 */ 0x0000, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0x0000, 0xbfcc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xbfcb, 0x0000, 0xc1bb, 0xee79, 0xee7b, 0xee7a,
+ /* b0 */ 0x0000, 0x0000, 0xc2d1, 0x0000, 0x0000, 0x0000, 0xf2f4, 0xf2f3,
+ /* b8 */ 0x0000, 0xf4cc, 0xc4b1, 0x0000, 0x0000, 0xc4fd, 0xf754, 0xf753,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x04409 ***/
+
+ /* 80 */ 0xc65b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0x0000,
+ /* 98 */ 0x0000, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0x0000, 0xdffc,
+ /* a0 */ 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0x0000,
+ /* a8 */ 0xe449, 0xe447, 0x0000, 0xe448, 0xe7d3, 0xe7d1, 0x0000, 0x0000,
+ /* b0 */ 0xe7d2, 0xeb7d, 0xee7c, 0xee7d, 0xc2d2, 0x0000, 0xf2f5, 0xf4cd,
+ /* b8 */ 0xc4b2, 0x0000, 0xf64c, 0xf755, 0xc5a9, 0x0000, 0xf7fe, 0xf94c,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x04449 ***/
+
+ /* 80 */ 0xa8a5, 0x0000, 0xad71, 0xad72, 0xd0b0, 0x0000, 0x0000, 0xd0b1,
+ /* 88 */ 0xad70, 0x0000, 0xb054, 0x0000, 0xb052, 0x0000, 0xb051, 0xb058,
+ /* 90 */ 0xb050, 0xb059, 0xd3dd, 0xb056, 0x0000, 0xb053, 0xb057, 0xb055,
+ /* 98 */ 0xb04f, 0x0000, 0x0000, 0xb35f, 0x0000, 0xb359, 0xd7cc, 0xb35e,
+ /* a0 */ 0x0000, 0x0000, 0xb360, 0xb35a, 0x0000, 0xb35b, 0x0000, 0xd7ca,
+ /* a8 */ 0x0000, 0x0000, 0xb358, 0x0000, 0xd7cb, 0xb35d, 0x0000, 0x0000,
+ /* b0 */ 0xd7c9, 0xb35c, 0x0000, 0x0000, 0xb644, 0x0000, 0xb646, 0x0000,
+ /* b8 */ 0x0000, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, 0x0000, 0xb8e4, 0xe049,
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x04489 ***/
+
+ /* 80 */ 0xdbda, 0xb5fe, 0x0000, 0x0000, 0xdbdd, 0xdbde, 0xb643, 0x0000,
+ /* 88 */ 0xdbe0, 0x0000, 0xdbe2, 0x0000, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4,
+ /* 90 */ 0xb642, 0xdbe1, 0xdbdf, 0x0000, 0xb640, 0xb5fb, 0xb647, 0xdbdb,
+ /* 98 */ 0xdbdc, 0xdbd9, 0x0000, 0xb641, 0x0000, 0x0000, 0xb5fc, 0x0000,
+ /* a0 */ 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0x0000, 0x0000, 0xb8d5, 0x0000,
+ /* a8 */ 0xb8e5, 0xb8d6, 0x0000, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0, 0x0000,
+ /* b0 */ 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a,
+ /* b8 */ 0x0000, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0x0000, 0x0000, 0xe047,
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x044c9 ***/
+
+ /* 80 */ 0x0000, 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe44c, 0xbb78, 0xbb7b, 0x0000, 0xe44e,
+ /* 90 */ 0x0000, 0xbba5, 0xe44d, 0xbb7d, 0x0000, 0xbdcf, 0xe44f, 0x0000,
+ /* 98 */ 0xbba4, 0xe44b, 0xbba6, 0x0000, 0x0000, 0x0000, 0xbb79, 0x0000,
+ /* a0 */ 0xb8db, 0xbb7c, 0x0000, 0xbb7a, 0xbb7e, 0xbba2, 0xbb77, 0xbba7,
+ /* a8 */ 0xbba3, 0x0000, 0xbba1, 0xe44a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbdd6, 0x0000, 0xbdd2, 0x0000, 0x0000, 0x0000, 0xbdd9, 0x0000,
+ /* b8 */ 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04509 ***/
+
+ /* 80 */ 0xe7de, 0x0000, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd,
+ /* 88 */ 0xebaa, 0xbdd3, 0x0000, 0xbdd0, 0x0000, 0xbdd8, 0x0000, 0xe7d4,
+ /* 90 */ 0x0000, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc,
+ /* 98 */ 0xe7e0, 0xe7e4, 0x0000, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8,
+ /* a0 */ 0xeb7e, 0xebac, 0xeba1, 0x0000, 0xeba7, 0x0000, 0xbfcd, 0xbfd3,
+ /* a8 */ 0xebad, 0x0000, 0x0000, 0xbfcf, 0x0000, 0xbfd9, 0xbfd4, 0xebaf,
+ /* b0 */ 0xeba9, 0xbfd0, 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8,
+ /* b8 */ 0xbdd1, 0x0000, 0xbfce, 0xebb0, 0xbfdc, 0x0000, 0xbfd5, 0xebae,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x04549 ***/
+
+ /* 80 */ 0xbfd1, 0xbfd6, 0xbfd7, 0x0000, 0xc1c3, 0xeea4, 0xeead, 0xeeaa,
+ /* 88 */ 0xeeac, 0x0000, 0xc1c0, 0xeea5, 0x0000, 0xeeab, 0xc1bc, 0xeea7,
+ /* 90 */ 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd,
+ /* 98 */ 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0x0000,
+ /* a0 */ 0xc1c1, 0x0000, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db,
+ /* a8 */ 0xc2d3, 0x0000, 0xf0da, 0xc2d6, 0xc2d5, 0x0000, 0xf0e9, 0xf0e1,
+ /* b0 */ 0xf0de, 0xf0e4, 0x0000, 0xf0dd, 0x0000, 0xf0df, 0xf0e8, 0xf0e6,
+ /* b8 */ 0x0000, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, 0xf0e3, 0x0000,
+
+ /*** Three byte table, leaf: e8adxx - offset 0x04589 ***/
+
+ /* 80 */ 0xf2f9, 0xc3cf, 0xf341, 0x0000, 0x0000, 0xf64f, 0xc3d6, 0xf0e0,
+ /* 88 */ 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0x0000, 0x0000, 0xc3d4, 0xc3d5,
+ /* 90 */ 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343,
+ /* 98 */ 0xc3d1, 0xc3d7, 0xc3d3, 0x0000, 0xc3d0, 0xf4d0, 0x0000, 0xc4b7,
+ /* a0 */ 0xf4ce, 0x0000, 0x0000, 0xf4d2, 0x0000, 0xf4d3, 0xc4b5, 0xf4d4,
+ /* a8 */ 0xf4d1, 0x0000, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0x0000, 0xc4b6,
+ /* b0 */ 0xc4b3, 0x0000, 0x0000, 0x0000, 0xc4fe, 0x0000, 0x0000, 0xc540,
+ /* b8 */ 0xf64e, 0xf64d, 0xf650, 0xf651, 0x0000, 0xc541, 0xf756, 0xf75b,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x045c9 ***/
+
+ /* 80 */ 0xc5aa, 0x0000, 0xf758, 0x0000, 0xf757, 0xf75a, 0xf759, 0x0000,
+ /* 88 */ 0xf843, 0x0000, 0xc5dc, 0xf842, 0xf840, 0x0000, 0xf841, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0x0000,
+ /* 98 */ 0xf94d, 0xf94e, 0xc667, 0x0000, 0xc66d, 0x0000, 0xf9a9, 0xf9c8,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x045e9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a6,
+ /* b8 */ 0x0000, 0xd7cd, 0x0000, 0xd7ce, 0xe052, 0xe450, 0xe7e5, 0xc1c6,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x04629 ***/
+
+ /* 80 */ 0x0000, 0xc1c5, 0xf0ee, 0xf344, 0x0000, 0xf844, 0xa8a7, 0xd3de,
+ /* 88 */ 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd, 0xeeb1,
+ /* 90 */ 0xc2d7, 0x0000, 0x0000, 0x0000, 0xc676, 0xa8a8, 0xcdcb, 0xd3df,
+ /* 98 */ 0x0000, 0x0000, 0xb362, 0x0000, 0xd7cf, 0xd7d0, 0x0000, 0xdbe5,
+ /* a0 */ 0x0000, 0xb648, 0xb8e6, 0x0000, 0xe056, 0xe055, 0xe057, 0x0000,
+ /* a8 */ 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0x0000, 0xeeb5,
+ /* b0 */ 0xeeb2, 0xeeb4, 0xeeb3, 0xc1c7, 0x0000, 0xf0ef, 0xf346, 0xf345,
+ /* b8 */ 0xcba4, 0xb05c, 0xb05b, 0xd3e0, 0x0000, 0xd7d1, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x04669 ***/
+
+ /* 80 */ 0xdbe7, 0xdbe6, 0xb649, 0x0000, 0xe059, 0xe05a, 0xe058, 0x0000,
+ /* 88 */ 0x0000, 0xb8e8, 0xb8e7, 0x0000, 0xbbaa, 0xbba9, 0x0000, 0xe7e7,
+ /* 90 */ 0xebb3, 0xebb1, 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0x0000, 0xf0f2,
+ /* 98 */ 0xf0f1, 0xf0f0, 0xf347, 0x0000, 0xf9aa, 0xa8a9, 0xad73, 0x0000,
+ /* a0 */ 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, 0xd7d2, 0x0000, 0xb368,
+ /* a8 */ 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0x0000, 0x0000, 0xb64a,
+ /* b0 */ 0xdbea, 0x0000, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652,
+ /* b8 */ 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x046a9 ***/
+
+ /* 80 */ 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0x0000, 0xb8ea,
+ /* 88 */ 0xb8eb, 0x0000, 0xb8e9, 0x0000, 0xe05b, 0x0000, 0x0000, 0xe454,
+ /* 90 */ 0x0000, 0xbbac, 0xbbad, 0xbbab, 0x0000, 0xe453, 0x0000, 0xe455,
+ /* 98 */ 0x0000, 0xe7ea, 0xe7ec, 0x0000, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9,
+ /* a0 */ 0xbddf, 0xbde9, 0xbde5, 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee,
+ /* a8 */ 0xe7eb, 0x0000, 0xbde8, 0x0000, 0xbde3, 0xbde4, 0xebb5, 0x0000,
+ /* b0 */ 0xebb7, 0xebb6, 0x0000, 0xebb8, 0xbfe0, 0xebb4, 0x0000, 0x0000,
+ /* b8 */ 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0x0000,
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x046e9 ***/
+
+ /* 80 */ 0xf0f6, 0x0000, 0xf0f5, 0x0000, 0xf0f4, 0xc2d8, 0xf348, 0xf349,
+ /* 88 */ 0xc3d8, 0xf34a, 0xc3d9, 0x0000, 0x0000, 0xc4ba, 0x0000, 0xc4b9,
+ /* 90 */ 0xf652, 0x0000, 0x0000, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac,
+ /* 98 */ 0x0000, 0xf845, 0x0000, 0xc642,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04705 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa8aa, 0x0000, 0xb36a, 0xb369,
+ /* a8 */ 0xe05c, 0xe05d, 0x0000, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9,
+ /* b0 */ 0xa8ab, 0x0000, 0xd0b2, 0xad76, 0xad75, 0x0000, 0xd3e3, 0xb05f,
+ /* b8 */ 0xd3e4, 0xd7d5, 0x0000, 0xd7d4, 0x0000, 0xd7d3, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04745 ***/
+
+ /* 80 */ 0xdbee, 0xb658, 0x0000, 0x0000, 0xdbed, 0xb657, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdbef, 0xb656, 0x0000, 0xe05f, 0xe062, 0xe060, 0xe061,
+ /* 90 */ 0xe065, 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0x0000,
+ /* 98 */ 0x0000, 0xbbaf, 0x0000, 0xe7f2, 0xe7f0, 0x0000, 0x0000, 0xbdeb,
+ /* a0 */ 0xe7ef, 0xe7f1, 0x0000, 0xbdec, 0x0000, 0xebbb, 0x0000, 0xebbc,
+ /* a8 */ 0xc1cd, 0x0000, 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654,
+ /* b0 */ 0x0000, 0x0000, 0xf96f, 0xa8ac, 0xad77, 0xd3e5, 0xd3e7, 0xd3e6,
+ /* b8 */ 0x0000, 0xd7d8, 0xb36c, 0x0000, 0xd7d6, 0x0000, 0xb36b, 0xd7d9,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x04785 ***/
+
+ /* 80 */ 0x0000, 0xd7da, 0xd7d7, 0x0000, 0x0000, 0xdbfb, 0xb660, 0xdbf3,
+ /* 88 */ 0xdbf9, 0x0000, 0x0000, 0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6,
+ /* 90 */ 0xe06c, 0xb65d, 0x0000, 0xdbf1, 0x0000, 0xdbf7, 0xdbf4, 0xdbfa,
+ /* 98 */ 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, 0x0000, 0xb8f2,
+ /* a0 */ 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0x0000, 0xb8f9, 0xe070,
+ /* a8 */ 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0x0000, 0xe06b, 0xb8f4,
+ /* b0 */ 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xb8f6, 0x0000, 0xbbb1, 0xe45b, 0xe461, 0xe459,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x047c5 ***/
+
+ /* 80 */ 0xe462, 0x0000, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e,
+ /* 88 */ 0x0000, 0xe457, 0xe45c, 0x0000, 0x0000, 0xe45a, 0x0000, 0xbdf1,
+ /* 90 */ 0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845,
+ /* 98 */ 0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3,
+ /* a0 */ 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe,
+ /* a8 */ 0x0000, 0xbdf2, 0x0000, 0xbded, 0x0000, 0x0000, 0xe7f7, 0x0000,
+ /* b0 */ 0xebc6, 0xbfe2, 0x0000, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0x0000,
+ /* b8 */ 0xebbf, 0xbfe5, 0x0000, 0x0000, 0xebc3, 0xebc4, 0xebbe, 0xebc7,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04805 ***/
+
+ /* 80 */ 0xebc0, 0xebc5, 0xbfe4, 0x0000, 0xbfe1, 0xebc1, 0x0000, 0xeebf,
+ /* 88 */ 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, 0x0000,
+ /* 90 */ 0xeebd, 0x0000, 0x0000, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa,
+ /* 98 */ 0x0000, 0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd,
+ /* a0 */ 0xf0f9, 0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe,
+ /* a8 */ 0x0000, 0xf144, 0xf352, 0x0000, 0xc3de, 0xf34f, 0x0000, 0xf353,
+ /* b0 */ 0x0000, 0x0000, 0xc3db, 0xf351, 0xc3e0, 0x0000, 0xc3dd, 0x0000,
+ /* b8 */ 0xf350, 0x0000, 0xc3df, 0xf354, 0xc3da, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04844 ***/
+
+ /* 80 */ 0x0000, 0xc4bc, 0xc4be, 0x0000, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc,
+ /* 88 */ 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0x0000,
+ /* 90 */ 0xf761, 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763,
+ /* 98 */ 0xf846, 0x0000, 0xf75f, 0x0000, 0x0000, 0xf8c6, 0xf8c3, 0xf8c4,
+ /* a0 */ 0xf8c5, 0xc65c, 0x0000, 0xf951, 0xf950, 0xf94f, 0xf970, 0x0000,
+ /* a8 */ 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xb8fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xbdf6, 0x0000, 0x0000, 0xebc8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04884 ***/
+
+ /* 80 */ 0xc2df, 0x0000, 0xf355, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78, 0x0000, 0xb063,
+ /* 90 */ 0x0000, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0x0000, 0x0000, 0xd7df,
+ /* 98 */ 0xd7db, 0x0000, 0x0000, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e,
+ /* a0 */ 0xd7e0, 0xd7e1, 0x0000, 0x0000, 0x0000, 0xdc43, 0xdc41, 0xdc45,
+ /* a8 */ 0xdc46, 0xdc4c, 0x0000, 0xdc48, 0xdc4a, 0x0000, 0xdc42, 0xdbfc,
+ /* b0 */ 0x0000, 0xdc49, 0x0000, 0x0000, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd,
+ /* b8 */ 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0x0000, 0xb8fd, 0xe075,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x048c4 ***/
+
+ /* 80 */ 0xe077, 0xe076, 0xe07b, 0xb8fb, 0x0000, 0xe078, 0xe074, 0xe079,
+ /* 88 */ 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0x0000, 0xe467, 0xe466, 0x0000,
+ /* 90 */ 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e,
+ /* 98 */ 0xe849, 0x0000, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9,
+ /* a0 */ 0xe84b, 0x0000, 0x0000, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0x0000,
+ /* a8 */ 0x0000, 0xbdfa, 0xbdfc, 0x0000, 0xe847, 0x0000, 0xebca, 0xbfe8,
+ /* b0 */ 0x0000, 0x0000, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce,
+ /* b8 */ 0xbfe9, 0xebcd, 0x0000, 0xbfe7, 0x0000, 0x0000, 0xc1d3, 0xc1d6,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04904 ***/
+
+ /* 80 */ 0xeec1, 0x0000, 0xc1d4, 0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147,
+ /* 88 */ 0xf148, 0xc2e0, 0x0000, 0xf149, 0x0000, 0xc2e1, 0xc3e2, 0xf358,
+ /* 90 */ 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, 0xf4db, 0xf4dc,
+ /* 98 */ 0xf4de, 0xf4da, 0xf4df, 0xf658, 0x0000, 0xf659, 0xf657, 0xc546,
+ /* a0 */ 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04929 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa8af, 0xb664, 0x0000, 0x0000, 0xb940,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xbbb6, 0x0000, 0x0000, 0xbfec, 0x0000,
+ /* a8 */ 0xbfeb, 0x0000, 0x0000, 0x0000, 0x0000, 0xc3e3, 0xc47c, 0xc547,
+ /* b0 */ 0xa8b0, 0xb064, 0xb941, 0x0000, 0xf35b, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcba6,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04969 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xa8b1, 0x0000, 0xa8b4, 0xa8b3, 0xa8b2, 0x0000,
+ /* 88 */ 0x0000, 0xcba5, 0x0000, 0xcdcd, 0x0000, 0xcdcf, 0xaaef, 0x0000,
+ /* 90 */ 0x0000, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, 0xad7e, 0xad7b, 0x0000,
+ /* a8 */ 0xada4, 0x0000, 0xad7d, 0xada2, 0x0000, 0xada1, 0xd0b5, 0x0000,
+ /* b0 */ 0xad7a, 0x0000, 0x0000, 0x0000, 0xb06a, 0xd3eb, 0xd3f1, 0xb067,
+ /* b8 */ 0xb06e, 0x0000, 0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed,
+
+ /*** Three byte table, leaf: e980xx - offset 0x049a9 ***/
+
+ /* 80 */ 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7e3, 0xd7e6, 0xb370, 0x0000, 0xb37a,
+ /* 90 */ 0xb376, 0xd7e4, 0x0000, 0x0000, 0xb37e, 0xb377, 0xb37c, 0xb372,
+ /* 98 */ 0x0000, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374,
+ /* a0 */ 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdc4d, 0xb665, 0xdc4f,
+ /* b0 */ 0x0000, 0xb667, 0xb669, 0x0000, 0xdc4e, 0xb666, 0xb66a, 0x0000,
+ /* b8 */ 0xb668, 0x0000, 0x0000, 0x0000, 0xb947, 0xe0a3, 0xb94f, 0xe07e,
+
+ /*** Three byte table, leaf: e981xx - offset 0x049e9 ***/
+
+ /* 80 */ 0x0000, 0xb950, 0xb945, 0x0000, 0xe0a1, 0x0000, 0x0000, 0xb94a,
+ /* 88 */ 0x0000, 0xe0a2, 0xb943, 0xb942, 0x0000, 0xb94d, 0xb94c, 0xb94b,
+ /* 90 */ 0xb949, 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0x0000, 0x0000,
+ /* 98 */ 0xbbb8, 0xbbbb, 0x0000, 0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0x0000,
+ /* a0 */ 0xbbb7, 0x0000, 0xbbbd, 0xbbba, 0x0000, 0x0000, 0x0000, 0xe852,
+ /* a8 */ 0xbe43, 0xbe41, 0x0000, 0xe853, 0x0000, 0xbe44, 0xbe42, 0xe851,
+ /* b0 */ 0xe850, 0x0000, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45,
+ /* b8 */ 0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04a29 ***/
+
+ /* 80 */ 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2,
+ /* 88 */ 0xc2e4, 0x0000, 0xc3e4, 0xc3e5, 0x0000, 0xf4e0, 0x0000, 0xc5de,
+ /* 90 */ 0xc5dd, 0xa8b6, 0x0000, 0x0000, 0xca55, 0xb06f, 0x0000, 0xca52,
+ /* 98 */ 0xca53, 0xca51, 0x0000, 0xca54, 0x0000, 0x0000, 0xcbaa, 0xcba7,
+ /* a0 */ 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0x0000, 0xcba9, 0xa8b9, 0xcbab,
+ /* a8 */ 0x0000, 0x0000, 0xa8b8, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd5,
+ /* b0 */ 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2, 0xaaf5, 0x0000,
+ /* b8 */ 0xaaf3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b8, 0xd0bc, 0xd0b9,
+
+ /*** Three byte table, leaf: e983xx - offset 0x04a69 ***/
+
+ /* 80 */ 0x0000, 0xada7, 0x0000, 0xada8, 0x0000, 0xd0bb, 0x0000, 0xd0bd,
+ /* 88 */ 0xd0bf, 0x0000, 0xada5, 0xd0be, 0x0000, 0x0000, 0xada6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ee, 0xd0ba, 0xd3f2, 0xd3fb,
+ /* 98 */ 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, 0xb071, 0x0000, 0xd3f7,
+ /* a0 */ 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, 0x0000, 0x0000,
+ /* a8 */ 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0x0000, 0xd7e8,
+ /* b0 */ 0xd7ea, 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdc56, 0xebd4, 0xdc57, 0xdc54, 0xb3a3, 0xb66e, 0xdc53,
+
+ /*** Three byte table, leaf: e984xx - offset 0x04aa9 ***/
+
+ /* 80 */ 0xdc59, 0xdc58, 0xb66b, 0xdc5c, 0xdc52, 0xdc5b, 0xdc50, 0xdc5a,
+ /* 88 */ 0xdc55, 0xb66d, 0x0000, 0xe0aa, 0x0000, 0xe0a5, 0xe0ab, 0xe0a6,
+ /* 90 */ 0xe0a4, 0xe0a7, 0xb951, 0x0000, 0xe0a9, 0x0000, 0xe0a8, 0xb952,
+ /* 98 */ 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c,
+ /* a0 */ 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0x0000, 0xe859, 0xbe48,
+ /* a8 */ 0xf14a, 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854,
+ /* b0 */ 0xbe46, 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0x0000,
+ /* b8 */ 0xeec4, 0xc1dd, 0xf14b, 0xf14c, 0x0000, 0x0000, 0xf14d, 0xf35d,
+
+ /*** Three byte table, leaf: e985xx - offset 0x04ae9 ***/
+
+ /* 80 */ 0xf35c, 0xf4e2, 0x0000, 0xf4e1, 0xf65b, 0xf65c, 0xf65a, 0xf766,
+ /* 88 */ 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, 0xb074, 0xd440, 0xd441,
+ /* 90 */ 0xd3fe, 0x0000, 0xb073, 0xd7f5, 0x0000, 0xd7f6, 0xd7f2, 0xb3a4,
+ /* 98 */ 0xd7f3, 0x0000, 0xd7f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xdc5f,
+ /* a0 */ 0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0x0000, 0x0000,
+ /* a8 */ 0xdd73, 0xb955, 0xb954, 0x0000, 0xb953, 0x0000, 0xe0ac, 0xe0ad,
+ /* b0 */ 0x0000, 0x0000, 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0x0000, 0xbbc5,
+ /* b8 */ 0xbbc4, 0xe474, 0xe472, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e986xx - offset 0x04b29 ***/
+
+ /* 80 */ 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a,
+ /* 88 */ 0x0000, 0xbe4b, 0xe85d, 0xbe4c, 0x0000, 0xebdb, 0x0000, 0xebdc,
+ /* 90 */ 0xebd9, 0xebda, 0xbff4, 0xebd8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9,
+ /* a0 */ 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0x0000, 0xf14f, 0x0000, 0xf150,
+ /* a8 */ 0xf14e, 0x0000, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151,
+ /* b0 */ 0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0x0000, 0xf4e3,
+ /* b8 */ 0x0000, 0xf65d, 0xc548, 0x0000, 0xf849, 0xf8c8, 0xf8c7, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04b69 ***/
+
+ /* 80 */ 0xc643, 0xc65d, 0xf8c9, 0xf971, 0x0000, 0xc66f, 0xa8bc, 0xaaf6,
+ /* 88 */ 0x0000, 0xb956, 0x0000, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671,
+ /* 90 */ 0xc2e7, 0xaaf7, 0x0000, 0xd0c1, 0xd0c0, 0xd442, 0x0000, 0xb078,
+ /* 98 */ 0xb076, 0xb07a, 0xd444, 0x0000, 0xb079, 0xb077, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd443, 0xb3a8, 0xd7fc, 0x0000, 0xb3a7, 0xb3a9,
+ /* a8 */ 0xd842, 0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0x0000,
+ /* b0 */ 0x0000, 0xd7f9, 0x0000, 0xd7fa, 0xd7f8, 0xb3a6, 0x0000, 0xd841,
+ /* b8 */ 0xd7fb, 0xd7fd, 0x0000, 0x0000, 0x0000, 0xdc6d, 0x0000, 0xdc6c,
+
+ /*** Three byte table, leaf: e988xx - offset 0x04ba9 ***/
+
+ /* 80 */ 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679,
+ /* 88 */ 0x0000, 0xb675, 0xdc63, 0x0000, 0xdc69, 0xb677, 0x0000, 0xdc68,
+ /* 90 */ 0xb678, 0xb67a, 0xdc6b, 0x0000, 0xb672, 0xb673, 0xdc77, 0xdc75,
+ /* 98 */ 0x0000, 0xdc74, 0xdc66, 0x0000, 0xdc72, 0x0000, 0xb676, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xb674, 0xdc73, 0xdc64, 0xdc67, 0xdc70,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ba, 0xe0b7, 0x0000,
+ /* b0 */ 0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0x0000, 0xe0c0, 0xb957,
+ /* b8 */ 0xb959, 0xb965, 0xe0b1, 0x0000, 0x0000, 0xb95a, 0xb95c, 0xb966,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04be9 ***/
+
+ /* 80 */ 0xb95b, 0x0000, 0x0000, 0x0000, 0x0000, 0xb964, 0xe0b9, 0x0000,
+ /* 88 */ 0xe0ae, 0xb962, 0xe0b8, 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc,
+ /* 90 */ 0xe0c6, 0xb960, 0xe0af, 0xe0c9, 0xe0c4, 0x0000, 0xe0cb, 0xb958,
+ /* 98 */ 0x0000, 0x0000, 0xb967, 0xb95d, 0x0000, 0x0000, 0xe0b5, 0x0000,
+ /* a0 */ 0xe0bd, 0xe0c1, 0x0000, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0bb, 0xe0ba, 0x0000, 0xe0bf,
+ /* b0 */ 0xe0c2, 0x0000, 0xe0c7, 0x0000, 0x0000, 0x0000, 0xe478, 0x0000,
+ /* b8 */ 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04c29 ***/
+
+ /* 80 */ 0xbbc8, 0x0000, 0xe4aa, 0xe0b6, 0x0000, 0xbbc9, 0xe4b1, 0xe4b6,
+ /* 88 */ 0xe4ae, 0x0000, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, 0x0000,
+ /* 90 */ 0x0000, 0xbbd1, 0x0000, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5,
+ /* 98 */ 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0x0000, 0x0000,
+ /* a0 */ 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4,
+ /* a8 */ 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50,
+ /* b8 */ 0x0000, 0xf9d7, 0x0000, 0xbe4f, 0xbe56, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04c69 ***/
+
+ /* 80 */ 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, 0xbe58,
+ /* 88 */ 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, 0xe868,
+ /* 90 */ 0xe862, 0xe87d, 0xbe57, 0xe87e, 0x0000, 0xe878, 0x0000, 0xe86d,
+ /* 98 */ 0xe86b, 0xe866, 0x0000, 0x0000, 0x0000, 0xe86e, 0xe87b, 0xe86a,
+ /* a0 */ 0xe87a, 0xe8a2, 0x0000, 0x0000, 0xbe53, 0x0000, 0xe876, 0xe87c,
+ /* a8 */ 0xe872, 0xe86c, 0xbe51, 0x0000, 0x0000, 0x0000, 0xe4a8, 0xe870,
+ /* b0 */ 0xbe59, 0xe869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf4,
+ /* b8 */ 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0x0000, 0xec41, 0xebf8,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04ca9 ***/
+
+ /* 80 */ 0xec43, 0xebe9, 0xebf6, 0x0000, 0xbffd, 0x0000, 0xebe1, 0x0000,
+ /* 88 */ 0xebdf, 0xec42, 0x0000, 0xec40, 0xebfe, 0xebed, 0xebec, 0xebe2,
+ /* 90 */ 0xc040, 0x0000, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45, 0x0000,
+ /* 98 */ 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0x0000, 0xebef, 0xebde, 0xebe0,
+ /* a0 */ 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd,
+ /* a8 */ 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0x0000, 0xebeb, 0xc044, 0xbff9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0x0000,
+ /* b8 */ 0xebe4, 0xebfa, 0x0000, 0x0000, 0xebe5,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04ce6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebea, 0xeed2,
+ /* 88 */ 0x0000, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3,
+ /* 90 */ 0xeed8, 0xeed9, 0xeee2, 0x0000, 0xc1ee, 0xeee1, 0xeed1, 0xeee0,
+ /* 98 */ 0xeed4, 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0x0000, 0xeee8, 0x0000,
+ /* a0 */ 0xeeda, 0xeee7, 0x0000, 0xeee9, 0xeed0, 0xc1e6, 0x0000, 0xeeea,
+ /* a8 */ 0x0000, 0x0000, 0xeede, 0x0000, 0xc1ea, 0xeedb, 0x0000, 0x0000,
+ /* b0 */ 0xc1ec, 0xeee4, 0x0000, 0x0000, 0x0000, 0xc1e4, 0xeed6, 0xeee5,
+ /* b8 */ 0x0000, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0x0000, 0xc1e9, 0x0000,
+
+ /*** Three byte table, leaf: e98exx - offset 0x04d26 ***/
+
+ /* 80 */ 0xeeeb, 0x0000, 0xc1e2, 0xeece, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf160, 0xf159, 0xc2e9, 0x0000, 0xf154, 0xf163, 0xf15b, 0xeedc,
+ /* 90 */ 0x0000, 0xf165, 0xf155, 0x0000, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2,
+ /* 98 */ 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0x0000, 0xf158, 0xf15d, 0xf162,
+ /* a0 */ 0x0000, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a,
+ /* a8 */ 0xf168, 0xf36a, 0xf15c, 0x0000, 0xc2ee, 0x0000, 0xc2ed, 0xeecf,
+ /* b0 */ 0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0x0000, 0xf156,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04d66 ***/
+
+ /* 80 */ 0xf373, 0x0000, 0xf363, 0xc3eb, 0xf371, 0x0000, 0x0000, 0xf361,
+ /* 88 */ 0xc3ec, 0x0000, 0xf36c, 0x0000, 0xf368, 0xc3f1, 0xf372, 0xf362,
+ /* 90 */ 0xf365, 0xc3e9, 0xf374, 0x0000, 0xf36d, 0xf370, 0xc3ef, 0xc3f4,
+ /* 98 */ 0xc3f2, 0xf369, 0xf364, 0x0000, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea,
+ /* a0 */ 0x0000, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0x0000, 0xf36b, 0xf375,
+ /* a8 */ 0xc3f5, 0x0000, 0x0000, 0x0000, 0xf367, 0x0000, 0xf36e, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f3, 0xf542, 0xf4f5,
+ /* b8 */ 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe,
+
+ /*** Three byte table, leaf: e990xx - offset 0x04da6 ***/
+
+ /* 80 */ 0xf4f4, 0x0000, 0x0000, 0xc4c2, 0x0000, 0x0000, 0xf544, 0xf4f6,
+ /* 88 */ 0x0000, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb,
+ /* 90 */ 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0x0000,
+ /* 98 */ 0xc4c1, 0xf4f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf4ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0x0000, 0xc549, 0x0000,
+ /* b0 */ 0xf664, 0xf66a, 0xc54e, 0xc54a, 0x0000, 0xc54b, 0xf660, 0xf667,
+ /* b8 */ 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, 0x0000, 0xf65e,
+
+ /*** Three byte table, leaf: e991xx - offset 0x04de6 ***/
+
+ /* 80 */ 0xf669, 0x0000, 0x0000, 0x0000, 0xc5b1, 0xf76d, 0xf770, 0xf76c,
+ /* 88 */ 0xf76e, 0xf76f, 0xf769, 0xf76a, 0xf767, 0x0000, 0x0000, 0xf76b,
+ /* 90 */ 0xf768, 0xc5b2, 0xc5b3, 0x0000, 0x0000, 0xf84b, 0x0000, 0xf84d,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf84c, 0xf84e, 0x0000,
+ /* a0 */ 0xc5e0, 0x0000, 0xf84a, 0xc5df, 0xc5e1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8cb, 0xf8cc, 0xc644, 0xf8ca, 0x0000, 0xf953, 0xf952, 0xf954,
+ /* b0 */ 0xc65f, 0xf955, 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668,
+ /* b8 */ 0xf973, 0x0000, 0x0000, 0x0000, 0xc672, 0xc670, 0xc671, 0xc677,
+
+ /*** Three byte table, leaf: e992xx - offset 0x04e26 ***/
+
+ /* 80 */ 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x04e2f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaf8,
+ /* b8 */ 0x0000, 0x0000, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x04e6f ***/
+
+ /* 80 */ 0xaaf9, 0x0000, 0xadac, 0xb07b, 0x0000, 0x0000, 0xd845, 0x0000,
+ /* 88 */ 0xd846, 0xb3ac, 0x0000, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c,
+ /* 90 */ 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb968, 0x0000, 0x0000, 0xe0d0, 0xe0ce, 0x0000, 0xe0cf, 0xe0cd,
+ /* a0 */ 0x0000, 0xbbd2, 0x0000, 0xbbd5, 0xbbd7, 0xbbd6, 0x0000, 0x0000,
+ /* a8 */ 0xbbd3, 0xbbd4, 0x0000, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0x0000,
+ /* b0 */ 0xe8a9, 0xbe5c, 0x0000, 0x0000, 0x0000, 0xec4d, 0xec4b, 0xeef3,
+ /* b8 */ 0x0000, 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c,
+
+ /*** Three byte table, leaf: e997xx - offset 0x04eaf ***/
+
+ /* 80 */ 0xeeef, 0x0000, 0x0000, 0xeef1, 0x0000, 0xeef2, 0xc1f3, 0xeeee,
+ /* 88 */ 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0x0000, 0x0000,
+ /* 90 */ 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf377, 0xf378, 0xc3f6, 0x0000, 0xf545, 0xf547,
+ /* a0 */ 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x04ed5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xaafa, 0x0000, 0xc9aa, 0x0000,
+ /* a0 */ 0xca58, 0xa6e9, 0xca56, 0xca59, 0xca57, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcbae, 0x0000, 0xa8c1, 0x0000, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf,
+ /* b0 */ 0xcbad, 0xa8c0, 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, 0xcdd9, 0x0000, 0xaafc,
+
+ /*** Three byte table, leaf: e999xx - offset 0x04f15 ***/
+
+ /* 80 */ 0xaafb, 0x0000, 0xab40, 0xcddc, 0xaafe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3,
+ /* 90 */ 0xadad, 0xd0c4, 0x0000, 0xd0c5, 0xd0c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb0a4, 0x0000, 0x0000, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446,
+ /* a0 */ 0x0000, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0x0000, 0xd84b,
+ /* b0 */ 0xb3b1, 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4,
+ /* b8 */ 0xb3b0, 0x0000, 0x0000, 0x0000, 0xd847, 0xb6a7, 0xdc7d, 0x0000,
+
+ /*** Three byte table, leaf: e99axx - offset 0x04f55 ***/
+
+ /* 80 */ 0xdca3, 0x0000, 0x0000, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c,
+ /* 88 */ 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0x0000, 0xb6aa, 0xb6a5, 0x0000,
+ /* 90 */ 0x0000, 0xe0d3, 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0x0000, 0xe0d4,
+ /* 98 */ 0xb969, 0xbbd8, 0x0000, 0xbbda, 0xbbd9, 0x0000, 0xe4bb, 0x0000,
+ /* a0 */ 0x0000, 0xe4bc, 0xe8ab, 0x0000, 0xe8aa, 0x0000, 0x0000, 0xc047,
+ /* a8 */ 0xc048, 0xec4f, 0xc049, 0x0000, 0xeef6, 0x0000, 0xeef4, 0x0000,
+ /* b0 */ 0xeef5, 0xc1f4, 0x0000, 0xf16f, 0xc3f7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc1f5, 0xab41, 0x0000, 0xb0a6, 0xd447, 0x0000, 0x0000, 0xd84c,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x04f95 ***/
+
+ /* 80 */ 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1,
+ /* 88 */ 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170,
+ /* 98 */ 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173,
+ /* a0 */ 0x0000, 0xf379, 0xc2f7, 0xc3f8, 0x0000, 0xf8cd, 0x0000, 0x0000,
+ /* a8 */ 0xab42, 0xb3b8, 0xb3b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6b2,
+ /* b0 */ 0xdca8, 0xdca7, 0xb6b3, 0x0000, 0x0000, 0xe0d9, 0xb973, 0xb970,
+ /* b8 */ 0xe0d8, 0xb972, 0xe0d6, 0xb971, 0x0000, 0xe0d7, 0x0000, 0xe4bd,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x04fd5 ***/
+
+ /* 80 */ 0xbbdd, 0x0000, 0xe8af, 0x0000, 0xbe5d, 0xe8ad, 0xbe5e, 0xbe5f,
+ /* 88 */ 0xe8ae, 0xbe60, 0x0000, 0xec51, 0x0000, 0xc04e, 0xc04b, 0xc050,
+ /* 90 */ 0xec53, 0xc04c, 0xec52, 0xc04f, 0x0000, 0x0000, 0xc04d, 0x0000,
+ /* 98 */ 0xeef9, 0xeefb, 0x0000, 0x0000, 0xc1f7, 0xeefa, 0xc1f8, 0xeef8,
+ /* a0 */ 0xeef7, 0x0000, 0xf177, 0xf176, 0xc2fc, 0xf178, 0xf37e, 0xc3fa,
+ /* a8 */ 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, 0x0000, 0xf548, 0xf549,
+ /* b0 */ 0xc4c5, 0x0000, 0xc553, 0x0000, 0x0000, 0xf66e, 0x0000, 0x0000,
+ /* b8 */ 0xc551, 0xc552, 0xf66f, 0x0000, 0x0000, 0xc5b4, 0xc5b5, 0xf771,
+
+ /*** Three byte table, leaf: e99dxx - offset 0x05015 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc645, 0xf8cf, 0xc647, 0x0000, 0xf8ce, 0xf8d0,
+ /* 88 */ 0xc646, 0xf957, 0x0000, 0xf9ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xab43, 0x0000, 0x0000, 0x0000, 0xb974, 0x0000,
+ /* 98 */ 0xe4be, 0x0000, 0xe8b0, 0xc051, 0xc052, 0x0000, 0xab44, 0x0000,
+ /* a0 */ 0xbe61, 0xc3fb, 0xadb1, 0x0000, 0x0000, 0x0000, 0xc053, 0x0000,
+ /* a8 */ 0xc5e2, 0xadb2, 0xd84d, 0x0000, 0xdca9, 0x0000, 0xdcab, 0x0000,
+ /* b0 */ 0xdcaa, 0x0000, 0xe0dd, 0xe0da, 0xb975, 0x0000, 0xb976, 0xe0db,
+ /* b8 */ 0xe0dc, 0x0000, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8,
+
+ /*** Three byte table, leaf: e99exx - offset 0x05055 ***/
+
+ /* 80 */ 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0x0000, 0x0000,
+ /* 88 */ 0xe8b3, 0x0000, 0xe8b1, 0xbe63, 0x0000, 0xbe62, 0xe8b2, 0xbe64,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec56, 0x0000, 0x0000, 0xec55,
+ /* 98 */ 0xc054, 0xec54, 0xeefc, 0x0000, 0xeefe, 0xef41, 0xef40, 0x0000,
+ /* a0 */ 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, 0xf17d, 0xf1a2, 0xc2fe, 0x0000,
+ /* a8 */ 0xf17b, 0x0000, 0xf17e, 0xf17c, 0xf179, 0xc340, 0xf17a, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf3a1, 0x0000, 0x0000, 0xf3a3, 0xf3a2,
+ /* b8 */ 0x0000, 0xf54a, 0x0000, 0xf54b, 0x0000, 0x0000, 0x0000, 0xf670,
+
+ /*** Three byte table, leaf: e99fxx - offset 0x05095 ***/
+
+ /* 80 */ 0x0000, 0xc5b7, 0x0000, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1,
+ /* 88 */ 0x0000, 0xc669, 0x0000, 0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5,
+ /* 90 */ 0xe8b4, 0x0000, 0x0000, 0xc1fa, 0xef43, 0xef42, 0xf1a5, 0xf1a3,
+ /* 98 */ 0xf1a6, 0xf1a4, 0x0000, 0x0000, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6,
+ /* a0 */ 0x0000, 0xf671, 0x0000, 0xf772, 0x0000, 0xf8d2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xadb4, 0x0000, 0x0000,
+ /* b0 */ 0xec57, 0xef44, 0x0000, 0xadb5, 0x0000, 0x0000, 0xbbe0, 0x0000,
+ /* b8 */ 0xec58, 0xc341, 0xf1a7, 0xc3fd, 0x0000, 0xf54c, 0xf54d, 0xc554,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x050d5 ***/
+
+ /* 80 */ 0xf851, 0xadb6, 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac,
+ /* 88 */ 0xb6b7, 0x0000, 0xb97a, 0x0000, 0xb97c, 0xe0df, 0xe0e0, 0xe0de,
+ /* 90 */ 0xb977, 0xb978, 0xb97b, 0xb979, 0x0000, 0x0000, 0xe4cb, 0xbbe1,
+ /* 98 */ 0xbbe2, 0x0000, 0x0000, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0x0000,
+ /* a0 */ 0xe8bb, 0xbe65, 0x0000, 0x0000, 0xc05b, 0x0000, 0xe8b8, 0xe8bd,
+ /* a8 */ 0xe8ba, 0xe8b9, 0x0000, 0xbe66, 0x0000, 0xc059, 0x0000, 0xec5a,
+ /* b0 */ 0xc055, 0x0000, 0xec5b, 0x0000, 0x0000, 0xec59, 0x0000, 0xc058,
+ /* b8 */ 0xc056, 0xc05a, 0x0000, 0xc057, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x05114 ***/
+
+ /* 80 */ 0x0000, 0xef45, 0x0000, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0x0000,
+ /* 88 */ 0xedd4, 0xef48, 0xef47, 0x0000, 0xc344, 0xc342, 0xc345, 0xc343,
+ /* 90 */ 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, 0x0000, 0x0000, 0x0000, 0xf3aa,
+ /* 98 */ 0xc440, 0xf3a8, 0x0000, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551,
+ /* a0 */ 0xf54e, 0x0000, 0xf54f, 0xf550, 0xf672, 0xc556, 0x0000, 0xc555,
+ /* a8 */ 0x0000, 0xf774, 0xf773, 0xc5b8, 0x0000, 0x0000, 0x0000, 0xc5e3,
+ /* b0 */ 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05149 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xadb7, 0xdcad, 0x0000, 0x0000, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3,
+ /* b0 */ 0x0000, 0xbbe4, 0xe8be, 0xbe68, 0x0000, 0x0000, 0xc1fc, 0x0000,
+ /* b8 */ 0xf1ab, 0x0000, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05189 ***/
+
+ /* 80 */ 0xf675, 0xf552, 0xf553, 0x0000, 0xc4c6, 0x0000, 0xf674, 0x0000,
+ /* 88 */ 0x0000, 0xf673, 0x0000, 0xf775, 0xf9b0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xadb8, 0x0000, 0x0000, 0x0000, 0xadb9,
+ /* a0 */ 0x0000, 0x0000, 0xb0a7, 0xd448, 0x0000, 0xd84f, 0x0000, 0xb6b8,
+ /* a8 */ 0x0000, 0xb6bb, 0xb6b9, 0xdcae, 0x0000, 0xb6bd, 0x0000, 0xb6ba,
+ /* b0 */ 0x0000, 0x0000, 0xb6bc, 0x0000, 0xb97e, 0x0000, 0xe0e2, 0x0000,
+ /* b8 */ 0x0000, 0xe0e3, 0xe8c0, 0x0000, 0xb97d, 0xb9a1, 0xb9a2, 0x0000,
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x051c9 ***/
+
+ /* 80 */ 0xe4cf, 0x0000, 0xe4ce, 0xbbe5, 0x0000, 0xbbe6, 0x0000, 0xe4d0,
+ /* 88 */ 0xe8bf, 0xbbe8, 0xbe69, 0x0000, 0xbbe7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4,
+ /* 98 */ 0xbe6c, 0x0000, 0xc061, 0xc05f, 0x0000, 0x0000, 0xc05e, 0xec5d,
+ /* a0 */ 0x0000, 0xc060, 0x0000, 0x0000, 0xec5c, 0xef4b, 0x0000, 0xec5e,
+ /* a8 */ 0xc05d, 0xec5f, 0xef4e, 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51,
+ /* b0 */ 0xef54, 0xef53, 0xef50, 0xef4f, 0x0000, 0xc1fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf1ae, 0x0000, 0xf1ad, 0xc34a, 0xc348, 0xc349,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x05209 ***/
+
+ /* 80 */ 0x0000, 0xf1ac, 0x0000, 0xf3b1, 0x0000, 0xc443, 0x0000, 0xf3b0,
+ /* 88 */ 0xf3af, 0xc444, 0x0000, 0xf558, 0xf557, 0x0000, 0xf555, 0x0000,
+ /* 90 */ 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557,
+ /* 98 */ 0xf676, 0xf556, 0x0000, 0xf777, 0xc5e4, 0x0000, 0xc661, 0xf959,
+ /* a0 */ 0x0000, 0xf9b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x05233 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xadba, 0xd850,
+ /* 98 */ 0xef55, 0xadbb, 0x0000, 0x0000, 0xe4d2, 0xe4d1, 0xec60, 0x0000,
+ /* a0 */ 0x0000, 0xef57, 0x0000, 0xef56, 0x0000, 0xc34c, 0xf3b2, 0xf3b3,
+ /* a8 */ 0xc4c9, 0x0000, 0x0000, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4,
+ /* b0 */ 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe4d4, 0xe4d6, 0xe4d5, 0x0000, 0xe4d8, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x05272 ***/
+
+ /* 80 */ 0x0000, 0xbbe9, 0xe4d7, 0xe4d3, 0x0000, 0x0000, 0x0000, 0xe4d9,
+ /* 88 */ 0x0000, 0xe8cc, 0x0000, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8,
+ /* 90 */ 0xbe6e, 0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0,
+ /* 98 */ 0xe8ce, 0xbe74, 0x0000, 0xbe70, 0xe8c6, 0xbe6d, 0x0000, 0xbe6f,
+ /* a0 */ 0x0000, 0x0000, 0xc063, 0xec66, 0xec64, 0xec63, 0x0000, 0xec69,
+ /* a8 */ 0x0000, 0xec68, 0xec67, 0x0000, 0xec62, 0xc062, 0xec61, 0x0000,
+ /* b0 */ 0xec65, 0xc064, 0x0000, 0x0000, 0xef5a, 0x0000, 0xef5e, 0xef5b,
+ /* b8 */ 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61, 0xc240,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x052b2 ***/
+
+ /* 80 */ 0x0000, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7,
+ /* 88 */ 0x0000, 0xf1b1, 0xf1b5, 0xf1b0, 0x0000, 0xf1b2, 0xc34d, 0xf1af,
+ /* 90 */ 0x0000, 0xf1b4, 0x0000, 0x0000, 0xf3c0, 0xf3b5, 0xc445, 0x0000,
+ /* 98 */ 0x0000, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, 0xf3be, 0x0000,
+ /* a0 */ 0xf3bb, 0x0000, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0x0000, 0xf3bc,
+ /* a8 */ 0x0000, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0x0000,
+ /* b0 */ 0xc4cb, 0xf55c, 0xf55a, 0x0000, 0xf55b, 0xc4cd, 0xf55f, 0xc4cc,
+ /* b8 */ 0xf562, 0xf678, 0xf67e, 0x0000, 0x0000, 0xf679, 0xc55b, 0xf6a1,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x052f2 ***/
+
+ /* 80 */ 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a, 0x0000,
+ /* 88 */ 0xf77d, 0xf7a1, 0xf77e, 0x0000, 0xf77b, 0xc5bb, 0xf778, 0xf77c,
+ /* 90 */ 0xf7a3, 0x0000, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7,
+ /* 98 */ 0x0000, 0xf853, 0xc5e5, 0xc5e6, 0x0000, 0x0000, 0xf8d3, 0xc64a,
+ /* a0 */ 0xf976, 0x0000, 0xc66a, 0x0000, 0xf9b3, 0xc66b, 0xf9b4, 0xf9b5,
+ /* a8 */ 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x0531e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb0a9, 0x0000, 0x0000, 0xe0e9, 0x0000, 0xe0e8, 0x0000, 0xbbea,
+ /* b0 */ 0xbbeb, 0xe4da, 0x0000, 0xe8d2, 0xec6c, 0x0000, 0x0000, 0xbe75,
+ /* b8 */ 0xc065, 0xec6a, 0x0000, 0xec6d, 0xc066, 0x0000, 0xef64, 0xec6b,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x0535e ***/
+
+ /* 80 */ 0xf1b9, 0xc34e, 0xf3c1, 0x0000, 0x0000, 0x0000, 0xf566, 0xf564,
+ /* 88 */ 0x0000, 0x0000, 0xf565, 0x0000, 0x0000, 0xf6a2, 0x0000, 0xc55c,
+ /* 90 */ 0xf7a4, 0xc5ea, 0xc5bc, 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0x0000,
+ /* 98 */ 0xb0aa, 0x0000, 0x0000, 0x0000, 0xf1ba, 0x0000, 0x0000, 0xd449,
+ /* a0 */ 0x0000, 0xb9a6, 0x0000, 0xe4db, 0x0000, 0x0000, 0xbbec, 0xe4dc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77,
+ /* b0 */ 0x0000, 0xe8d7, 0xe8d6, 0xe8d5, 0x0000, 0x0000, 0xec6e, 0xec71,
+ /* b8 */ 0x0000, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x0539d ***/
+
+ /* 80 */ 0x0000, 0xef67, 0x0000, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0x0000,
+ /* 88 */ 0xf1bb, 0x0000, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0x0000,
+ /* 90 */ 0xf567, 0xf569, 0xf568, 0x0000, 0x0000, 0xf6a3, 0xf6a6, 0xf6a4,
+ /* 98 */ 0xf6a5, 0xf7a5, 0xc5bd, 0x0000, 0x0000, 0x0000, 0xf854, 0xf855,
+ /* a0 */ 0xf856, 0x0000, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0x0000, 0xbe78,
+ /* a8 */ 0xc069, 0xf1be, 0x0000, 0xf7a6, 0x0000, 0x0000, 0xf9c4, 0xd44a,
+ /* b0 */ 0x0000, 0xc67b, 0xb0ac, 0xec72, 0x0000, 0xf1bf, 0x0000, 0xf3c6,
+ /* b8 */ 0x0000, 0x0000, 0xf6a7, 0xf7a7, 0xb0ad, 0x0000, 0xe4dd, 0xe4de,
+
+ /*** Three byte table, leaf: e9adxx - offset 0x053dd ***/
+
+ /* 80 */ 0x0000, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0x0000,
+ /* 88 */ 0xef69, 0x0000, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352, 0xc351,
+ /* 90 */ 0x0000, 0xc55e, 0xf6a8, 0x0000, 0xc55d, 0xf7a9, 0xf7a8, 0x0000,
+ /* 98 */ 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0x0000, 0x0000, 0x0000, 0xe4e1,
+ /* a0 */ 0xe4df, 0xe4e0, 0x0000, 0x0000, 0xe8e2, 0x0000, 0xe8dd, 0xe8da,
+ /* a8 */ 0xe8e1, 0x0000, 0x0000, 0x0000, 0xe8e3, 0x0000, 0x0000, 0xbe7c,
+ /* b0 */ 0xe8e0, 0xe8dc, 0x0000, 0x0000, 0xe8db, 0xe8df, 0xe8de, 0xbe7b,
+ /* b8 */ 0x0000, 0x0000, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, 0x0000,
+
+ /*** Three byte table, leaf: e9aexx - offset 0x0541d ***/
+
+ /* 80 */ 0xec73, 0x0000, 0xec79, 0x0000, 0x0000, 0xec74, 0xef72, 0xec75,
+ /* 88 */ 0xeca2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xec7c, 0xc06a, 0xec7b, 0xec7a, 0x0000, 0xec7e, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xef6a, 0xef6d, 0x0000, 0x0000, 0xef6c, 0x0000,
+ /* a0 */ 0xef74, 0xef6f, 0xef73, 0x0000, 0xef71, 0xef70, 0xef6e, 0x0000,
+ /* a8 */ 0xef6b, 0x0000, 0xc243, 0xc242, 0x0000, 0xc244, 0xc241, 0xef75,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c8, 0xf1cb, 0x0000,
+ /* b8 */ 0xf1c9, 0xf1cd, 0x0000, 0x0000, 0x0000, 0xf1ce, 0x0000, 0xf1c6,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x0545d ***/
+
+ /* 80 */ 0xc358, 0xf1c7, 0x0000, 0xf1c5, 0xf1cc, 0x0000, 0xf1c4, 0xf1c3,
+ /* 88 */ 0xc357, 0xc355, 0xc354, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0,
+ /* 98 */ 0x0000, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0x0000, 0xf3ca, 0x0000,
+ /* a0 */ 0xf3c9, 0xf3d6, 0xf3cd, 0x0000, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449,
+ /* a8 */ 0xc448, 0x0000, 0xf3c7, 0xf3c8, 0xf3d1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf3ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf56c,
+ /* b8 */ 0xf56f, 0x0000, 0x0000, 0x0000, 0x0000, 0xc356,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x0549b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf56d, 0xf573, 0xf571,
+ /* 88 */ 0xf56b, 0xf576, 0x0000, 0xf56a, 0x0000, 0xc4cf, 0xf572, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf56e, 0xc4ce, 0xf575, 0x0000, 0x0000, 0xf574,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ab, 0xf6aa, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf6b1, 0x0000, 0xf6ad, 0xf6b0, 0xc560, 0x0000, 0x0000,
+ /* a8 */ 0xf6ae, 0xf6af, 0x0000, 0xf6a9, 0xf6ac, 0xc55f, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0x0000, 0xf7b6, 0xf7b2,
+ /* b8 */ 0x0000, 0xf7ae, 0x0000, 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac,
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x054db ***/
+
+ /* 80 */ 0xf570, 0xf7b0, 0x0000, 0x0000, 0xf7ad, 0x0000, 0xf7aa, 0x0000,
+ /* 88 */ 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0x0000,
+ /* 90 */ 0xf859, 0x0000, 0xf857, 0x0000, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec,
+ /* 98 */ 0xf858, 0xf85e, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8da, 0xc64d,
+ /* a0 */ 0xf8db, 0x0000, 0xf8d9, 0xf8d6, 0x0000, 0x0000, 0xf8d8, 0xf8d7,
+ /* a8 */ 0xf95a, 0x0000, 0x0000, 0x0000, 0x0000, 0xf95c, 0xf95b, 0x0000,
+ /* b0 */ 0x0000, 0xf979, 0x0000, 0xf978, 0xf977, 0xf97a, 0x0000, 0xc673,
+ /* b8 */ 0xc674, 0xf9ca, 0xf9ce,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x05516 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3be, 0xdcaf, 0xe0ed,
+ /* a8 */ 0x0000, 0xb9a7, 0xe0eb, 0x0000, 0x0000, 0xe0ec, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8,
+ /* b8 */ 0x0000, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0x0000, 0xe8e7,
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x05556 ***/
+
+ /* 80 */ 0xe8ea, 0x0000, 0x0000, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d, 0xe8e9,
+ /* 88 */ 0xe8ed, 0xbe7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xecac, 0x0000, 0xc06f, 0x0000, 0xeca7, 0xc06b, 0x0000, 0xeca4,
+ /* 98 */ 0xecaa, 0xecad, 0x0000, 0xc070, 0x0000, 0xeca9, 0xeca6, 0xecae,
+ /* a0 */ 0xeca5, 0x0000, 0xecab, 0xc06c, 0x0000, 0xeca3, 0xc06d, 0x0000,
+ /* a8 */ 0xc06e, 0xeca8, 0x0000, 0x0000, 0x0000, 0xefa9, 0xef7a, 0xef7b,
+ /* b0 */ 0xef7e, 0xef7c, 0x0000, 0xef76, 0x0000, 0x0000, 0xef79, 0xefa5,
+ /* b8 */ 0xef7d, 0x0000, 0x0000, 0xc245, 0x0000, 0xefa7, 0xefa4, 0xc246,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x05596 ***/
+
+ /* 80 */ 0xefa6, 0xef77, 0xefa2, 0xefa3, 0x0000, 0xefa1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1d2, 0xf1d4, 0xf1d7, 0x0000, 0x0000, 0xf1d1,
+ /* 90 */ 0x0000, 0xc359, 0xf1d9, 0xf1d0, 0xf1da, 0x0000, 0xf1d6, 0xf1d8,
+ /* 98 */ 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a, 0x0000, 0xf1db,
+ /* a0 */ 0xc35b, 0xc44d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef78,
+ /* a8 */ 0xf3f1, 0xf3e8, 0xc44f, 0xf3e4, 0xc450, 0x0000, 0x0000, 0xf3ed,
+ /* b0 */ 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, 0xf3e6, 0x0000, 0xf3d8,
+ /* b8 */ 0xf3df, 0xf3ee, 0x0000, 0xf3eb, 0x0000, 0xf3e3, 0x0000, 0xf3ef,
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x055d6 ***/
+
+ /* 80 */ 0xf3de, 0xf3d9, 0xf3ec, 0x0000, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0,
+ /* 88 */ 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf57d, 0x0000, 0xf57b, 0x0000, 0xf5a2, 0x0000, 0xf5ae, 0xf5a5,
+ /* 98 */ 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577,
+ /* a0 */ 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0x0000, 0xf5af, 0xf5b0,
+ /* a8 */ 0xf5a9, 0xf5ad, 0xf5a4, 0x0000, 0xf6c1, 0xf6c4, 0x0000, 0xc561,
+ /* b0 */ 0x0000, 0xf6c3, 0xf6c8, 0xf6c6, 0xc562, 0xf6bd, 0xf6b3, 0xf6b2,
+ /* b8 */ 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, 0xf6b4, 0x0000, 0xf6b9, 0xf5ac,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x05616 ***/
+
+ /* 80 */ 0x0000, 0xf6b5, 0xc563, 0xf6bb, 0x0000, 0xf6ba, 0x0000, 0xf6b6,
+ /* 88 */ 0xf6c2, 0x0000, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8,
+ /* 90 */ 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0x0000, 0xf7c5, 0xf7c3, 0xc5c3,
+ /* 98 */ 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf,
+ /* a0 */ 0x0000, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee, 0xf86b, 0x0000,
+ /* a8 */ 0xf872, 0xf7c0, 0x0000, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863,
+ /* b0 */ 0xf86d, 0x0000, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862,
+ /* b8 */ 0xf866, 0xc64e, 0xc64f, 0xf861, 0x0000, 0xf8e6, 0xf8dd, 0xf8e5,
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x05656 ***/
+
+ /* 80 */ 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de,
+ /* 88 */ 0x0000, 0xf8e4, 0x0000, 0xf95d, 0x0000, 0xf95e, 0x0000, 0xf960,
+ /* 90 */ 0xf95f, 0xf962, 0xf961, 0xf97c, 0xf97b, 0xf9b7, 0x0000, 0xf9b8,
+ /* 98 */ 0x0000, 0xf9c5, 0xc678, 0xc67c, 0x0000, 0xf9cf, 0xc67d,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x05675 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3bf, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc4d0, 0xf6c9, 0x0000, 0xc650, 0xc651, 0x0000, 0xb3c0,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x056b5 ***/
+
+ /* 80 */ 0xe0ee, 0x0000, 0xb9a8, 0xe8f0, 0x0000, 0x0000, 0xecb0, 0xecb1,
+ /* 88 */ 0xecaf, 0xefab, 0xefaa, 0xc247, 0xf1df, 0xefac, 0xf1de, 0x0000,
+ /* 90 */ 0x0000, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0x0000, 0x0000, 0xc452,
+ /* 98 */ 0x0000, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0x0000, 0xc5ef,
+ /* a0 */ 0xf8e8, 0xf963, 0x0000, 0x0000, 0xf9d2, 0xb3c1, 0x0000, 0xe4e5,
+ /* a8 */ 0x0000, 0xbea2, 0x0000, 0x0000, 0x0000, 0xecb3, 0xecb2, 0x0000,
+ /* b0 */ 0xefad, 0x0000, 0x0000, 0x0000, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb3c2, 0xbbf2, 0x0000, 0xbea3, 0x0000,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x056f5 ***/
+
+ /* 80 */ 0xf3f4, 0x0000, 0xf874, 0xb6c0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xefae, 0x0000, 0x0000, 0x0000, 0xc664, 0xb6c1, 0xbea4, 0xc248,
+ /* 90 */ 0xf875, 0xb6c2, 0x0000, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0x0000,
+ /* 98 */ 0xc071, 0x0000, 0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0,
+ /* a0 */ 0xc35c, 0x0000, 0x0000, 0x0000, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6,
+ /* a8 */ 0xc4d2, 0x0000, 0x0000, 0xf6cb, 0x0000, 0xf6cd, 0xf6cc, 0xc566,
+ /* b0 */ 0xf7c8, 0x0000, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d, 0xc675,
+ /* b8 */ 0x0000, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0x0000, 0xefb1,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x05735 ***/
+
+ /* 80 */ 0xf1e2, 0xf1e1, 0x0000, 0x0000, 0x0000, 0x0000, 0xf878, 0xc652,
+ /* 88 */ 0x0000, 0xf965, 0xf97e, 0x0000, 0x0000, 0x0000, 0xb9a9, 0xe8f2,
+ /* 90 */ 0xe8f3, 0x0000, 0xecb7, 0xb9aa, 0x0000, 0xc35d, 0xf1e3, 0x0000,
+ /* 98 */ 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0x0000, 0xf8e9, 0x0000,
+ /* a0 */ 0xb9ab, 0x0000, 0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0x0000, 0x0000,
+ /* a8 */ 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3,
+ /* b0 */ 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b,
+ /* b8 */ 0xf87a, 0x0000, 0x0000, 0xbbf3, 0x0000, 0xecb8, 0xc24d, 0x0000,
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x05775 ***/
+
+ /* 80 */ 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0x0000, 0x0000, 0xf8ea, 0xf966,
+ /* 88 */ 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e,
+ /* 90 */ 0x0000, 0x0000, 0xbea6, 0x0000, 0xefb5, 0xf1ea, 0xf3fa, 0xf3fb,
+ /* 98 */ 0xf3fc, 0xf5be, 0x0000, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4,
+ /* a0 */ 0xf5bb, 0xc4d6, 0x0000, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a,
+ /* a8 */ 0x0000, 0x0000, 0xc5c6, 0xf7cd, 0xc5c5, 0x0000, 0xf8a3, 0xf8a4,
+ /* b0 */ 0xf8a2, 0xf8a1, 0xc654, 0x0000, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653,
+ /* b8 */ 0xf967, 0xf96a, 0xf969, 0xf968, 0x0000, 0x0000, 0xf9d3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x057b4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc073, 0x0000, 0x0000,
+ /* 90 */ 0xc365, 0xf5bf, 0xf6d5, 0x0000, 0xc5c7, 0xf7ce, 0x0000, 0x0000,
+ /* 98 */ 0xf9d5, 0x0000, 0x0000, 0x0000, 0xc074, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xefb6, 0x0000, 0xf7cf, 0x0000, 0xf9a1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x057e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc94a, 0xddfc, 0x0000, 0x0000,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb8xx - offset 0x057f8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa14a, 0xa157, 0x0000, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163,
+ /* b8 */ 0xa164, 0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173,
+
+ /*** Three byte table, leaf: efb9xx - offset 0x05838 ***/
+
+ /* 80 */ 0xa174, 0xa177, 0xa178, 0xa17b, 0xa17c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c,
+ /* 90 */ 0xa14d, 0x0000, 0xa14f, 0x0000, 0xa151, 0xa152, 0xa153, 0xa154,
+ /* 98 */ 0x0000, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc,
+ /* a0 */ 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0x0000,
+ /* a8 */ 0x0000, 0xa24c, 0xa24d, 0xa24e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x05877 ***/
+
+ /* 80 */ 0x0000, 0xa149, 0x0000, 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0x0000,
+ /* 88 */ 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141, 0xa1d0, 0xa144, 0xa241,
+ /* 90 */ 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6,
+ /* 98 */ 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5, 0xa1d7, 0xa1d6, 0xa148,
+ /* a0 */ 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5,
+ /* a8 */ 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd,
+ /* b0 */ 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5,
+ /* b8 */ 0xa2e6, 0xa2e7, 0xa2e8, 0x0000, 0xa242, 0x0000, 0x0000, 0xa1c4,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x058b7 ***/
+
+ /* 80 */ 0x0000, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef,
+ /* 88 */ 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7,
+ /* 90 */ 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340,
+ /* 98 */ 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa14e, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x058f7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa15a, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_euc_cn.map b/src/backend/utils/mb/Unicode/utf8_to_euc_cn.map
new file mode 100644
index 0000000..8190b4c
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_euc_cn.map
@@ -0,0 +1,4044 @@
+/* src/backend/utils/mb/Unicode/utf8_to_euc_cn.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl */
+
+static const uint16 euc_cn_from_unicode_tree_table[21644];
+
+static const pg_mb_radix_tree euc_cn_from_unicode_tree =
+{
+ euc_cn_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x028d, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 euc_cn_from_unicode_tree_table[21644] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0082, 0x00c1, 0x00f4, 0x0000, 0x0126, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x015f, 0x0000, 0x0000, 0x018e, 0x01ce, 0x020d, 0x024d,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e8, 0x0000, 0x0000, 0xa1ec,
+ /* a8 */ 0xa1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa1e3, 0xa1c0,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00082 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8a4, 0xa8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xa8a8, 0xa8a6, 0xa8ba, 0x0000, 0xa8ac, 0xa8aa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa8b0, 0xa8ae, 0x0000, 0x0000, 0x0000, 0xa1c2,
+ /* b8 */ 0x0000, 0xa8b4, 0xa8b2, 0x0000, 0xa8b9, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c1 ***/
+
+ /* 80 */ 0x0000, 0xa8a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa8a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa8a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa8a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000f4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ad, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa8b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x00126 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a3, 0x0000,
+ /* 90 */ 0xa8ab, 0x0000, 0xa8af, 0x0000, 0xa8b3, 0x0000, 0xa8b5, 0x0000,
+ /* 98 */ 0xa8b6, 0x0000, 0xa8b7, 0x0000, 0xa8b8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x0015f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a6,
+ /* 88 */ 0x0000, 0xa1a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x0018e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6, 0xa6a7,
+ /* 98 */ 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae, 0xa6af,
+ /* a0 */ 0xa6b0, 0xa6b1, 0x0000, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6,
+ /* a8 */ 0xa6b7, 0xa6b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7,
+ /* b8 */ 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf,
+
+ /*** Two byte table, leaf: cfxx - offset 0x001ce ***/
+
+ /* 80 */ 0xa6d0, 0xa6d1, 0x0000, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6,
+ /* 88 */ 0xa6d7, 0xa6d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0020d ***/
+
+ /* 80 */ 0x0000, 0xa7a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4, 0xa7a5, 0xa7a6, 0xa7a8, 0xa7a9,
+ /* 98 */ 0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1,
+ /* a0 */ 0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5, 0xa7b6, 0xa7b7, 0xa7b8, 0xa7b9,
+ /* a8 */ 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd, 0xa7be, 0xa7bf, 0xa7c0, 0xa7c1,
+ /* b0 */ 0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d8, 0xa7d9,
+ /* b8 */ 0xa7da, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de, 0xa7df, 0xa7e0, 0xa7e1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x0024d ***/
+
+ /* 80 */ 0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0xa7e7, 0xa7e8, 0xa7e9,
+ /* 88 */ 0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed, 0xa7ee, 0xa7ef, 0xa7f0, 0xa7f1,
+ /* 90 */ 0x0000, 0xa7d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0028d ***/
+
+ /* e2 */ 0x029b, 0x02db, 0x02e4, 0x0324, 0x0364, 0x03a4, 0x03e4, 0x0424,
+ /* ea */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0463,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0029b ***/
+
+ /* 80 */ 0x04a3, 0x0000, 0x0000, 0x0000, 0x04e0, 0x0500, 0x0530, 0x0000,
+ /* 88 */ 0x0568, 0x05a6, 0x05d6, 0x0000, 0x0604, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0624, 0x0664, 0x0000, 0x06a4, 0x06e4, 0x0704, 0x073e,
+ /* 98 */ 0x0779, 0x07b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x002db ***/
+
+ /* 80 */ 0x07f9, 0x0838, 0x0878, 0x08b8, 0x08f4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x091e,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x002e4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x095e, 0x099e, 0x09dd, 0x0a1d, 0x0a5d, 0x0a9b, 0x0adb, 0x0b1b,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00324 ***/
+
+ /* 80 */ 0x0b5a, 0x0b99, 0x0bd9, 0x0c15, 0x0c51, 0x0c91, 0x0cd1, 0x0d11,
+ /* 88 */ 0x0d51, 0x0d91, 0x0dd1, 0x0e11, 0x0e51, 0x0e91, 0x0ed1, 0x0f11,
+ /* 90 */ 0x0f50, 0x0f90, 0x0fd0, 0x1010, 0x1050, 0x1090, 0x10d0, 0x110f,
+ /* 98 */ 0x114f, 0x118f, 0x11cc, 0x1209, 0x1249, 0x1289, 0x12c7, 0x1305,
+ /* a0 */ 0x1345, 0x1381, 0x13c1, 0x1400, 0x143e, 0x147d, 0x14bc, 0x14fb,
+ /* a8 */ 0x153b, 0x157b, 0x15bb, 0x15fa, 0x1631, 0x1671, 0x16b1, 0x16f1,
+ /* b0 */ 0x1731, 0x1771, 0x17b1, 0x17f1, 0x182f, 0x186e, 0x18ac, 0x18e7,
+ /* b8 */ 0x1926, 0x1964, 0x19a4, 0x19e3, 0x1a23, 0x1a63, 0x1aa3, 0x1ae1,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x00364 ***/
+
+ /* 80 */ 0x1b21, 0x1b61, 0x1ba1, 0x1bde, 0x1c1e, 0x1c5e, 0x1c96, 0x1cd5,
+ /* 88 */ 0x1d15, 0x1d55, 0x1d95, 0x1dd5, 0x1e15, 0x1e53, 0x1e93, 0x1ed2,
+ /* 90 */ 0x1f12, 0x1f52, 0x1f90, 0x1fd0, 0x2010, 0x2050, 0x2089, 0x20c8,
+ /* 98 */ 0x2108, 0x2147, 0x2186, 0x21c5, 0x2205, 0x2245, 0x2285, 0x22c4,
+ /* a0 */ 0x2304, 0x2344, 0x2383, 0x23c3, 0x2402, 0x2442, 0x2482, 0x24c1,
+ /* a8 */ 0x2501, 0x2540, 0x2580, 0x0000, 0x25ad, 0x25ec, 0x262b, 0x266b,
+ /* b0 */ 0x26a9, 0x26e9, 0x2728, 0x2768, 0x27a7, 0x27e6, 0x2824, 0x2864,
+ /* b8 */ 0x28a1, 0x28de, 0x291e, 0x295d, 0x299b, 0x29da, 0x2a17, 0x2a57,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x003a4 ***/
+
+ /* 80 */ 0x2a87, 0x2ac1, 0x2b01, 0x2b41, 0x2b7f, 0x2bba, 0x2bf8, 0x2c35,
+ /* 88 */ 0x2c6f, 0x2caf, 0x2cef, 0x2d2e, 0x2d6d, 0x2dad, 0x2dec, 0x2e2c,
+ /* 90 */ 0x2e69, 0x2ea8, 0x2ee8, 0x2f23, 0x2f63, 0x2fa3, 0x2fe3, 0x3022,
+ /* 98 */ 0x3062, 0x30a2, 0x30e1, 0x3121, 0x3160, 0x31a0, 0x31e0, 0x3220,
+ /* a0 */ 0x3260, 0x32a0, 0x32dd, 0x331c, 0x335b, 0x339b, 0x33db, 0x341b,
+ /* a8 */ 0x345b, 0x349b, 0x34db, 0x351b, 0x355b, 0x359a, 0x35da, 0x3619,
+ /* b0 */ 0x3658, 0x3698, 0x36d6, 0x3715, 0x3751, 0x3781, 0x37b9, 0x0000,
+ /* b8 */ 0x37e8, 0x3827, 0x3865, 0x38a5, 0x38e5, 0x3923, 0x3962, 0x39a2,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x003e4 ***/
+
+ /* 80 */ 0x39e2, 0x3a22, 0x3a62, 0x3aa2, 0x3ae0, 0x3b1f, 0x3b5f, 0x3b9f,
+ /* 88 */ 0x3bdf, 0x3c1e, 0x3c5e, 0x3c9d, 0x3cdc, 0x3d1c, 0x3d5a, 0x3d9a,
+ /* 90 */ 0x3dd9, 0x3e17, 0x3e55, 0x3e95, 0x3ed5, 0x3f13, 0x3f52, 0x3f91,
+ /* 98 */ 0x3fd1, 0x400e, 0x404e, 0x408e, 0x40ce, 0x410e, 0x414d, 0x418d,
+ /* a0 */ 0x41cc, 0x420c, 0x424c, 0x428b, 0x42ca, 0x4309, 0x4349, 0x4388,
+ /* a8 */ 0x43c8, 0x4407, 0x4441, 0x0000, 0x447a, 0x44a1, 0x44ce, 0x450e,
+ /* b0 */ 0x454e, 0x458d, 0x45cb, 0x0000, 0x45ee, 0x462e, 0x466d, 0x46ad,
+ /* b8 */ 0x46eb, 0x472b, 0x476b, 0x47a6, 0x0000, 0x47c0, 0x4800, 0x483f,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00424 ***/
+
+ /* 80 */ 0x487f, 0x48be, 0x48fe, 0x493d, 0x497c, 0x49b9, 0x49f9, 0x4a34,
+ /* 88 */ 0x0000, 0x4a51, 0x4a86, 0x4abe, 0x4ac7, 0x4b06, 0x4b37, 0x4b6d,
+ /* 90 */ 0x4b84, 0x4bc3, 0x4bfe, 0x4c3e, 0x4c7e, 0x4cbe, 0x0000, 0x4cfe,
+ /* 98 */ 0x4d3e, 0x4d7e, 0x4db9, 0x4df9, 0x4e39, 0x4e78, 0x4eb5, 0x4eea,
+ /* a0 */ 0x0000, 0x4f21, 0x4f61, 0x4f93, 0x4fc6, 0x4ff5, 0x5035, 0x0000,
+ /* a8 */ 0x0000, 0x505e, 0x509e, 0x50de, 0x511b, 0x515a, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x516f, 0x51af, 0x51ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x5210, 0x5250, 0x5290, 0x52cf, 0x530e, 0x534d, 0x538d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x00463 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x53cc, 0x540c, 0x0000, 0x544c,
+
+ /*** Three byte table, leaf: e280xx - offset 0x004a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1aa, 0xa1ac, 0x0000,
+ /* 98 */ 0xa1ae, 0xa1af, 0x0000, 0x0000, 0xa1b0, 0xa1b1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ad, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa1eb, 0x0000, 0xa1e4, 0xa1e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1f9, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x004e0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xa1e6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ed, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00500 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8,
+ /* a8 */ 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00530 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa1fb, 0xa1fc, 0xa1fa, 0xa1fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e288xx - offset 0x00568 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c7,
+ /* 90 */ 0x0000, 0xa1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa1cc, 0x0000, 0x0000, 0xa1d8, 0xa1de, 0x0000,
+ /* a0 */ 0xa1cf, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ce, 0x0000, 0xa1c4,
+ /* a8 */ 0xa1c5, 0xa1c9, 0xa1c8, 0xa1d2, 0x0000, 0x0000, 0xa1d3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e0, 0xa1df, 0xa1c3, 0xa1cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x005a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1d6, 0x0000, 0x0000, 0x0000, 0xa1d5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1d9, 0xa1d4, 0x0000, 0x0000, 0xa1dc, 0xa1dd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1da, 0xa1db,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x005d6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1cd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x00604 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x00624 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0,
+ /* a8 */ 0xa2e1, 0xa2e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8,
+ /* b8 */ 0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0,
+
+ /*** Three byte table, leaf: e292xx - offset 0x00664 ***/
+
+ /* 80 */ 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8,
+ /* 88 */ 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8,
+ /* 90 */ 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0,
+ /* 98 */ 0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x006a4 ***/
+
+ /* 80 */ 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8, 0xa9a9, 0xa9aa, 0xa9ab,
+ /* 88 */ 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b1, 0xa9b2, 0xa9b3,
+ /* 90 */ 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb,
+ /* 98 */ 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9c1, 0xa9c2, 0xa9c3,
+ /* a0 */ 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb,
+ /* a8 */ 0xa9cc, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d2, 0xa9d3,
+ /* b0 */ 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9, 0xa9da, 0xa9db,
+ /* b8 */ 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0, 0xa9e1, 0xa9e2, 0xa9e3,
+
+ /*** Three byte table, leaf: e295xx - offset 0x006e4 ***/
+
+ /* 80 */ 0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, 0xa9e8, 0xa9e9, 0xa9ea, 0xa9eb,
+ /* 88 */ 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x00704 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1f6, 0xa1f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1f8, 0xa1f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x0073e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1f4, 0xa1f3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xa1f0, 0x0000, 0x0000, 0xa1f2, 0xa1f1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x00779 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ef, 0xa1ee, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x007b9 ***/
+
+ /* 80 */ 0xa1e2, 0x0000, 0xa1e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x007f9 ***/
+
+ /* 80 */ 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0x0000, 0xa1a9, 0x0000, 0x0000,
+ /* 88 */ 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
+ /* 90 */ 0xa1be, 0xa1bf, 0x0000, 0xa1fe, 0xa1b2, 0xa1b3, 0xa1bc, 0xa1bd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00838 ***/
+
+ /* 80 */ 0x0000, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7,
+ /* 88 */ 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af,
+ /* 90 */ 0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7,
+ /* 98 */ 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf,
+ /* a0 */ 0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7,
+ /* a8 */ 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf,
+ /* b0 */ 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7,
+ /* b8 */ 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00878 ***/
+
+ /* 80 */ 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7,
+ /* 88 */ 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef,
+ /* 90 */ 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7,
+ /* a8 */ 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae, 0xa5af,
+ /* b0 */ 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7,
+ /* b8 */ 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be, 0xa5bf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x008b8 ***/
+
+ /* 80 */ 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7,
+ /* 88 */ 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf,
+ /* 90 */ 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7,
+ /* 98 */ 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de, 0xa5df,
+ /* a0 */ 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7,
+ /* a8 */ 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef,
+ /* b0 */ 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1a4,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x008f4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8c5, 0xa8c6, 0xa8c7,
+ /* 88 */ 0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0xa8cd, 0xa8ce, 0xa8cf,
+ /* 90 */ 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7,
+ /* 98 */ 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc, 0xa8dd, 0xa8de, 0xa8df,
+ /* a0 */ 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7,
+ /* a8 */ 0xa8e8, 0xa8e9,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e388xx - offset 0x0091e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec,
+ /* a8 */ 0xa2ed, 0xa2ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x0095e ***/
+
+ /* 80 */ 0xd2bb, 0xb6a1, 0x0000, 0xc6df, 0x0000, 0x0000, 0x0000, 0xcdf2,
+ /* 88 */ 0xd5c9, 0xc8fd, 0xc9cf, 0xcfc2, 0xd8a2, 0xb2bb, 0xd3eb, 0x0000,
+ /* 90 */ 0xd8a4, 0xb3f3, 0x0000, 0xd7a8, 0xc7d2, 0xd8a7, 0xcac0, 0x0000,
+ /* 98 */ 0xc7f0, 0xb1fb, 0xd2b5, 0xb4d4, 0xb6ab, 0xcbbf, 0xd8a9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb6aa, 0x0000, 0xc1bd, 0xd1cf, 0x0000, 0xc9a5,
+ /* a8 */ 0xd8ad, 0x0000, 0xb8f6, 0xd1be, 0xe3dc, 0xd6d0, 0x0000, 0x0000,
+ /* b0 */ 0xb7e1, 0x0000, 0xb4ae, 0x0000, 0xc1d9, 0x0000, 0xd8bc, 0x0000,
+ /* b8 */ 0xcde8, 0xb5a4, 0xceaa, 0xd6f7, 0x0000, 0xc0f6, 0xbed9, 0xd8af,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x0099e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc4cb, 0x0000, 0xbec3, 0x0000, 0xd8b1,
+ /* 88 */ 0xc3b4, 0xd2e5, 0x0000, 0xd6ae, 0xceda, 0xd5a7, 0xbaf5, 0xb7a6,
+ /* 90 */ 0xc0d6, 0x0000, 0xc6b9, 0xc5d2, 0xc7c7, 0x0000, 0xb9d4, 0x0000,
+ /* 98 */ 0xb3cb, 0xd2d2, 0x0000, 0x0000, 0xd8bf, 0xbec5, 0xc6f2, 0xd2b2,
+ /* a0 */ 0xcfb0, 0xcfe7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcae9, 0x0000,
+ /* a8 */ 0x0000, 0xd8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc2f2, 0xc2d2, 0x0000, 0xc8e9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7ac,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4baxx - offset 0x009dd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1cb, 0x0000,
+ /* 88 */ 0xd3e8, 0xd5f9, 0x0000, 0xcac2, 0xb6fe, 0xd8a1, 0xd3da, 0xbff7,
+ /* 90 */ 0x0000, 0xd4c6, 0xbba5, 0xd8c1, 0xcee5, 0xbeae, 0x0000, 0x0000,
+ /* 98 */ 0xd8a8, 0x0000, 0xd1c7, 0xd0a9, 0x0000, 0x0000, 0x0000, 0xd8bd,
+ /* a0 */ 0xd9ef, 0xcdf6, 0xbfba, 0x0000, 0xbdbb, 0xbaa5, 0xd2e0, 0xb2fa,
+ /* a8 */ 0xbae0, 0xc4b6, 0x0000, 0xcfed, 0xbea9, 0xcda4, 0xc1c1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xc7d7, 0xd9f1, 0x0000, 0xd9f4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xc8cb, 0xd8e9, 0x0000, 0x0000, 0x0000, 0xd2da,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00a1d ***/
+
+ /* 80 */ 0xcab2, 0xc8ca, 0xd8ec, 0xd8ea, 0xd8c6, 0xbdf6, 0xc6cd, 0xb3f0,
+ /* 88 */ 0x0000, 0xd8eb, 0xbdf1, 0xbde9, 0x0000, 0xc8d4, 0xb4d3, 0x0000,
+ /* 90 */ 0x0000, 0xc2d8, 0x0000, 0xb2d6, 0xd7d0, 0xcacb, 0xcbfb, 0xd5cc,
+ /* 98 */ 0xb8b6, 0xcfc9, 0x0000, 0x0000, 0x0000, 0xd9da, 0xd8f0, 0xc7aa,
+ /* a0 */ 0x0000, 0xd8ee, 0x0000, 0xb4fa, 0xc1ee, 0xd2d4, 0x0000, 0x0000,
+ /* a8 */ 0xd8ed, 0x0000, 0xd2c7, 0xd8ef, 0xc3c7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd1f6, 0x0000, 0xd6d9, 0xd8f2, 0x0000, 0xd8f5, 0xbcfe, 0xbcdb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xc8ce, 0x0000, 0xb7dd, 0x0000, 0xb7c2,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00a5d ***/
+
+ /* 80 */ 0x0000, 0xc6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd8f8, 0xd2c1, 0x0000, 0x0000, 0xcee9, 0xbcbf, 0xb7fc,
+ /* 90 */ 0xb7a5, 0xd0dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6da,
+ /* 98 */ 0xd3c5, 0xbbef, 0xbbe1, 0xd8f1, 0x0000, 0x0000, 0xc9a1, 0xceb0,
+ /* a0 */ 0xb4ab, 0x0000, 0xd8f3, 0x0000, 0xc9cb, 0xd8f6, 0xc2d7, 0xd8f7,
+ /* a8 */ 0x0000, 0x0000, 0xceb1, 0xd8f9, 0x0000, 0x0000, 0x0000, 0xb2ae,
+ /* b0 */ 0xb9c0, 0x0000, 0xd9a3, 0x0000, 0xb0e9, 0x0000, 0xc1e6, 0x0000,
+ /* b8 */ 0xc9ec, 0x0000, 0xcbc5, 0x0000, 0xcbc6, 0xd9a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00a9b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb5e8, 0x0000, 0x0000, 0xb5ab, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcebb, 0xb5cd, 0xd7a1,
+ /* 90 */ 0xd7f4, 0xd3d3, 0x0000, 0xcce5, 0x0000, 0xbace, 0x0000, 0xd9a2,
+ /* 98 */ 0xd9dc, 0xd3e0, 0xd8fd, 0xb7f0, 0xd7f7, 0xd8fe, 0xd8fa, 0xd9a1,
+ /* a0 */ 0xc4e3, 0x0000, 0x0000, 0xd3b6, 0xd8f4, 0xd9dd, 0x0000, 0xd8fb,
+ /* a8 */ 0x0000, 0xc5e5, 0x0000, 0x0000, 0xc0d0, 0x0000, 0x0000, 0xd1f0,
+ /* b0 */ 0xb0db, 0x0000, 0x0000, 0xbcd1, 0xd9a6, 0x0000, 0xd9a5, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd9ac, 0xd9ae, 0x0000, 0xd9ab, 0xcab9,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00adb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd9a9, 0xd6b6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb3de, 0xd9a8, 0x0000, 0xc0fd, 0x0000, 0xcacc, 0x0000, 0xd9aa,
+ /* 90 */ 0x0000, 0xd9a7, 0x0000, 0x0000, 0xd9b0, 0x0000, 0x0000, 0xb6b1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xb9a9, 0x0000, 0xd2c0, 0x0000, 0x0000,
+ /* a0 */ 0xcfc0, 0x0000, 0x0000, 0xc2c2, 0x0000, 0xbdc4, 0xd5ec, 0xb2e0,
+ /* a8 */ 0xc7c8, 0xbfeb, 0xd9ad, 0x0000, 0xd9af, 0x0000, 0xceea, 0xbaee,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7d6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1e3,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00b1b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb4d9, 0xb6ed, 0xd9b4, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xbfa1, 0x0000, 0x0000, 0x0000, 0xd9de, 0xc7ce,
+ /* 90 */ 0xc0fe, 0xd9b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbd7,
+ /* 98 */ 0xb7fd, 0x0000, 0xd9b5, 0x0000, 0xd9b7, 0xb1a3, 0xd3e1, 0xd9b9,
+ /* a0 */ 0x0000, 0xd0c5, 0x0000, 0xd9b6, 0x0000, 0x0000, 0xd9b1, 0x0000,
+ /* a8 */ 0xd9b2, 0xc1a9, 0xd9b3, 0x0000, 0x0000, 0xbcf3, 0xd0de, 0xb8a9,
+ /* b0 */ 0x0000, 0xbee3, 0x0000, 0xd9bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd9ba, 0x0000, 0xb0b3, 0x0000, 0x0000, 0x0000, 0xd9c2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e580xx - offset 0x00b5a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9c4, 0xb1b6, 0x0000, 0xd9bf,
+ /* 90 */ 0x0000, 0x0000, 0xb5b9, 0x0000, 0xbef3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xccc8, 0xbaf2, 0xd2d0, 0x0000, 0xd9c3, 0x0000, 0x0000, 0xbde8,
+ /* a0 */ 0x0000, 0xb3ab, 0x0000, 0x0000, 0x0000, 0xd9c5, 0xbeeb, 0x0000,
+ /* a8 */ 0xd9c6, 0xd9bb, 0xc4df, 0x0000, 0xd9be, 0xd9c1, 0xd9c0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd5ae, 0x0000, 0xd6b5, 0x0000, 0xc7e3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e581xx - offset 0x00b99 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd9c8, 0x0000, 0x0000, 0x0000, 0xbcd9,
+ /* 88 */ 0xd9ca, 0x0000, 0x0000, 0x0000, 0xd9bc, 0x0000, 0xd9cb, 0xc6ab,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9c9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd7f6, 0x0000, 0xcda3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbda1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5bc, 0xcdb5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd9cd, 0x0000, 0x0000, 0xd9c7, 0xb3a5,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00bd9 ***/
+
+ /* 80 */ 0xbffe, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8b5, 0x0000, 0x0000,
+ /* 88 */ 0xc0fc, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0f8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xb4f6, 0x0000, 0xd9ce, 0x0000, 0xd9cf,
+ /* a8 */ 0xb4a2, 0xd9d0, 0x0000, 0x0000, 0xb4df, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xb0c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd9d1, 0xc9b5,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x00c15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d2, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xc1c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d6, 0xc9ae,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d5, 0xd9d4, 0xd9d7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xcbdb, 0x0000, 0xbda9, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xc6a7,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e584xx - offset 0x00c51 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d3, 0xd9d8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd9d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc8e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xc0dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6f9,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00c91 ***/
+
+ /* 80 */ 0xd8a3, 0xd4ca, 0x0000, 0xd4aa, 0xd0d6, 0xb3e4, 0xd5d7, 0x0000,
+ /* 88 */ 0xcfc8, 0xb9e2, 0x0000, 0xbfcb, 0x0000, 0xc3e2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xb6d2, 0x0000, 0x0000, 0xcdc3, 0xd9ee, 0xd9f0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xb5b3, 0x0000, 0xb6b5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xbea4, 0x0000, 0x0000, 0xc8eb, 0x0000, 0x0000,
+ /* a8 */ 0xc8ab, 0x0000, 0x0000, 0xb0cb, 0xb9ab, 0xc1f9, 0xd9e2, 0x0000,
+ /* b0 */ 0xc0bc, 0xb9b2, 0x0000, 0xb9d8, 0xd0cb, 0xb1f8, 0xc6e4, 0xbedf,
+ /* b8 */ 0xb5e4, 0xd7c8, 0x0000, 0xd1f8, 0xbce6, 0xcade, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00cd1 ***/
+
+ /* 80 */ 0xbcbd, 0xd9e6, 0xd8e7, 0x0000, 0x0000, 0xc4da, 0x0000, 0x0000,
+ /* 88 */ 0xb8d4, 0xc8bd, 0x0000, 0x0000, 0xb2e1, 0xd4d9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc3b0, 0x0000, 0x0000, 0xc3e1, 0xdaa2, 0xc8df,
+ /* 98 */ 0x0000, 0xd0b4, 0x0000, 0xbefc, 0xc5a9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb9da, 0x0000, 0xdaa3, 0x0000, 0xd4a9, 0xdaa4, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd9fb, 0xb6ac, 0x0000, 0x0000, 0xb7eb,
+ /* b0 */ 0xb1f9, 0xd9fc, 0xb3e5, 0xbef6, 0x0000, 0xbff6, 0xd2b1, 0xc0e4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb6b3, 0xd9fe, 0xd9fd, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e587xx - offset 0x00d11 ***/
+
+ /* 80 */ 0xbebb, 0x0000, 0x0000, 0x0000, 0xc6e0, 0x0000, 0xd7bc, 0xdaa1,
+ /* 88 */ 0x0000, 0xc1b9, 0x0000, 0xb5f2, 0xc1e8, 0x0000, 0x0000, 0xbcf5,
+ /* 90 */ 0x0000, 0xb4d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xc1dd, 0x0000, 0xc4fd, 0x0000, 0x0000,
+ /* a0 */ 0xbcb8, 0xb7b2, 0x0000, 0x0000, 0xb7ef, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd9ec, 0x0000, 0xc6be, 0x0000, 0xbfad,
+ /* b0 */ 0xbbcb, 0x0000, 0x0000, 0xb5ca, 0x0000, 0xdbc9, 0xd0d7, 0x0000,
+ /* b8 */ 0xcdb9, 0xb0bc, 0xb3f6, 0xbbf7, 0xdbca, 0xbaaf, 0x0000, 0xd4e4,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00d51 ***/
+
+ /* 80 */ 0xb5b6, 0xb5f3, 0xd8d6, 0xc8d0, 0x0000, 0x0000, 0xb7d6, 0xc7d0,
+ /* 88 */ 0xd8d7, 0x0000, 0xbfaf, 0x0000, 0x0000, 0xdbbb, 0xd8d8, 0x0000,
+ /* 90 */ 0x0000, 0xd0cc, 0xbbae, 0x0000, 0x0000, 0x0000, 0xebbe, 0xc1d0,
+ /* 98 */ 0xc1f5, 0xd4f2, 0xb8d5, 0xb4b4, 0x0000, 0xb3f5, 0x0000, 0x0000,
+ /* a0 */ 0xc9be, 0x0000, 0x0000, 0x0000, 0xc5d0, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc5d9, 0xc0fb, 0x0000, 0xb1f0, 0x0000, 0xd8d9, 0xb9ce, 0x0000,
+ /* b0 */ 0xb5bd, 0x0000, 0x0000, 0xd8da, 0x0000, 0x0000, 0xd6c6, 0xcba2,
+ /* b8 */ 0xc8af, 0xc9b2, 0xb4cc, 0xbfcc, 0x0000, 0xb9f4, 0x0000, 0xd8db,
+
+ /*** Three byte table, leaf: e589xx - offset 0x00d91 ***/
+
+ /* 80 */ 0xd8dc, 0xb6e7, 0xbcc1, 0xccea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcff7, 0x0000, 0xd8dd, 0xc7b0, 0x0000, 0x0000,
+ /* 90 */ 0xb9d0, 0xbda3, 0x0000, 0x0000, 0xccde, 0x0000, 0xc6ca, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8e0, 0x0000, 0xd8de, 0x0000,
+ /* a0 */ 0x0000, 0xd8df, 0x0000, 0x0000, 0x0000, 0xb0fe, 0x0000, 0xbee7,
+ /* a8 */ 0x0000, 0xcaa3, 0xbcf4, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8b1,
+ /* b0 */ 0x0000, 0x0000, 0xb8ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8e2, 0x0000, 0xbdcb,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00dd1 ***/
+
+ /* 80 */ 0x0000, 0xd8e4, 0xd8e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc5fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd8e5, 0x0000, 0x0000, 0xd8e6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xc1a6, 0x0000, 0xc8b0, 0xb0ec, 0xb9a6,
+ /* a0 */ 0xbcd3, 0xcef1, 0xdbbd, 0xc1d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb6af, 0xd6fa, 0xc5ac, 0xbdd9, 0xdbbe, 0xdbbf, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xc0f8, 0xbea2, 0xc0cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbc0, 0xcac6,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00e11 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb2aa, 0x0000, 0x0000, 0x0000, 0xd3c2,
+ /* 88 */ 0x0000, 0xc3e3, 0x0000, 0xd1ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdbc2, 0x0000, 0xc0d5, 0x0000, 0x0000, 0x0000, 0xdbc3, 0x0000,
+ /* 98 */ 0xbfb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4bc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7da, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdbc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd9e8, 0xc9d7, 0x0000, 0x0000, 0x0000, 0xb9b4, 0xcef0,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00e51 ***/
+
+ /* 80 */ 0xd4c8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0fc, 0xb4d2, 0x0000,
+ /* 88 */ 0xd0d9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e9, 0x0000, 0xdecb,
+ /* 90 */ 0xd9eb, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8b0, 0xbbaf, 0xb1b1,
+ /* 98 */ 0x0000, 0xb3d7, 0xd8ce, 0x0000, 0x0000, 0xd4d1, 0x0000, 0x0000,
+ /* a0 */ 0xbdb3, 0xbfef, 0x0000, 0xcfbb, 0x0000, 0x0000, 0xd8d0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb7cb, 0x0000, 0x0000, 0x0000, 0xd8d1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc6a5, 0xc7f8, 0xd2bd, 0x0000, 0x0000, 0xd8d2, 0xc4e4,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x00e91 ***/
+
+ /* 80 */ 0x0000, 0xcaae, 0x0000, 0xc7a7, 0x0000, 0xd8a6, 0x0000, 0xc9fd,
+ /* 88 */ 0xcee7, 0xbbdc, 0xb0eb, 0x0000, 0x0000, 0x0000, 0xbbaa, 0xd0ad,
+ /* 90 */ 0x0000, 0xb1b0, 0xd7e4, 0xd7bf, 0x0000, 0xb5a5, 0xc2f4, 0xc4cf,
+ /* 98 */ 0x0000, 0x0000, 0xb2a9, 0x0000, 0xb2b7, 0x0000, 0xb1e5, 0xdfb2,
+ /* a0 */ 0xd5bc, 0xbfa8, 0xc2ac, 0xd8d5, 0xc2b1, 0x0000, 0xd8d4, 0xced4,
+ /* a8 */ 0x0000, 0xdae0, 0x0000, 0xcec0, 0x0000, 0x0000, 0xd8b4, 0xc3ae,
+ /* b0 */ 0xd3a1, 0xcea3, 0x0000, 0xbcb4, 0xc8b4, 0xc2d1, 0x0000, 0xbeed,
+ /* b8 */ 0xd0b6, 0x0000, 0xdae1, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7e4,
+
+ /*** Three byte table, leaf: e58exx - offset 0x00ed1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb3a7, 0x0000, 0xb6f2, 0xccfc, 0xc0fa, 0x0000,
+ /* 88 */ 0x0000, 0xc0f7, 0x0000, 0xd1b9, 0xd1e1, 0xd8c7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2de, 0x0000, 0x0000,
+ /* 98 */ 0xc0e5, 0x0000, 0xbaf1, 0x0000, 0x0000, 0xd8c8, 0x0000, 0xd4ad,
+ /* a0 */ 0x0000, 0x0000, 0xcfe1, 0xd8c9, 0x0000, 0xd8ca, 0xcfc3, 0x0000,
+ /* a8 */ 0xb3f8, 0xbec7, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8cb, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbcc, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xc8a5, 0x0000, 0x0000, 0x0000, 0xcfd8,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x00f11 ***/
+
+ /* 80 */ 0x0000, 0xc8fe, 0xb2ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd3d6, 0xb2e6, 0xbcb0, 0xd3d1, 0xcbab, 0xb7b4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xb7a2, 0x0000, 0x0000, 0xcae5, 0x0000, 0xc8a1, 0xcadc,
+ /* 98 */ 0xb1e4, 0xd0f0, 0x0000, 0xc5d1, 0x0000, 0x0000, 0x0000, 0xdbc5,
+ /* a0 */ 0xb5fe, 0x0000, 0x0000, 0xbfda, 0xb9c5, 0xbee4, 0xc1ed, 0x0000,
+ /* a8 */ 0xdfb6, 0xdfb5, 0xd6bb, 0xbdd0, 0xd5d9, 0xb0c8, 0xb6a3, 0xbfc9,
+ /* b0 */ 0xcca8, 0xdfb3, 0xcab7, 0xd3d2, 0x0000, 0xd8cf, 0xd2b6, 0xbac5,
+ /* b8 */ 0xcbbe, 0xccbe, 0x0000, 0xdfb7, 0xb5f0, 0xdfb4, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x00f50 ***/
+
+ /* 80 */ 0x0000, 0xd3f5, 0x0000, 0xb3d4, 0xb8f7, 0x0000, 0xdfba, 0x0000,
+ /* 88 */ 0xbacf, 0xbcaa, 0xb5f5, 0x0000, 0xcdac, 0xc3fb, 0xbaf3, 0xc0f4,
+ /* 90 */ 0xcdc2, 0xcff2, 0xdfb8, 0xcfc5, 0x0000, 0xc2c0, 0xdfb9, 0xc2f0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xbefd, 0x0000, 0xc1df, 0xcdcc, 0xd2f7,
+ /* a0 */ 0xb7cd, 0xdfc1, 0x0000, 0xdfc4, 0x0000, 0x0000, 0xb7f1, 0xb0c9,
+ /* a8 */ 0xb6d6, 0xb7d4, 0x0000, 0xbaac, 0xccfd, 0xbfd4, 0xcbb1, 0xc6f4,
+ /* b0 */ 0x0000, 0xd6a8, 0xdfc5, 0x0000, 0xcee2, 0xb3b3, 0x0000, 0x0000,
+ /* b8 */ 0xcefc, 0xb4b5, 0x0000, 0xcec7, 0xbaf0, 0x0000, 0xcee1, 0x0000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x00f90 ***/
+
+ /* 80 */ 0xd1bd, 0x0000, 0x0000, 0xdfc0, 0x0000, 0x0000, 0xb4f4, 0x0000,
+ /* 88 */ 0xb3ca, 0x0000, 0xb8e6, 0xdfbb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc4c5, 0x0000, 0xdfbc, 0xdfbd, 0xdfbe, 0xc5bb, 0xdfbf, 0xdfc2,
+ /* 98 */ 0xd4b1, 0xdfc3, 0x0000, 0xc7ba, 0xced8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xc4d8, 0x0000, 0xdfca, 0x0000, 0xdfcf, 0x0000,
+ /* a8 */ 0xd6dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdfc9, 0xdfda, 0xceb6, 0x0000, 0xbac7, 0xdfce, 0xdfc8,
+ /* b8 */ 0xc5de, 0x0000, 0x0000, 0xc9eb, 0xbaf4, 0xc3fc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e592xx - offset 0x00fd0 ***/
+
+ /* 80 */ 0xbed7, 0x0000, 0xdfc6, 0x0000, 0xdfcd, 0x0000, 0xc5d8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd5a6, 0xbacd, 0x0000, 0xbecc, 0xd3bd,
+ /* 90 */ 0xb8c0, 0x0000, 0xd6e4, 0x0000, 0xdfc7, 0xb9be, 0xbfa7, 0x0000,
+ /* 98 */ 0x0000, 0xc1fc, 0xdfcb, 0xdfcc, 0x0000, 0xdfd0, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdfdb, 0xdfe5, 0x0000, 0xdfd7, 0xdfd6,
+ /* a8 */ 0xd7c9, 0xdfe3, 0xdfe4, 0xe5eb, 0xd2a7, 0xdfd2, 0x0000, 0xbfa9,
+ /* b0 */ 0x0000, 0xd4db, 0x0000, 0xbfc8, 0xdfd4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcfcc, 0x0000, 0x0000, 0xdfdd, 0x0000, 0xd1ca, 0x0000, 0xdfde,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01010 ***/
+
+ /* 80 */ 0xb0a7, 0xc6b7, 0xdfd3, 0x0000, 0xbae5, 0x0000, 0xb6df, 0xcddb,
+ /* 88 */ 0xb9fe, 0xd4d5, 0x0000, 0x0000, 0xdfdf, 0xcfec, 0xb0a5, 0xdfe7,
+ /* 90 */ 0xdfd1, 0xd1c6, 0xdfd5, 0xdfd8, 0xdfd9, 0xdfdc, 0x0000, 0xbba9,
+ /* 98 */ 0x0000, 0xdfe0, 0xdfe1, 0x0000, 0xdfe2, 0xdfe6, 0xdfe8, 0xd3b4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8e7, 0xc5b6, 0xdfea,
+ /* a8 */ 0xc9da, 0xc1a8, 0xc4c4, 0x0000, 0x0000, 0xbfde, 0xcff8, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd5dc, 0xdfee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xb2b8, 0x0000, 0xbadf, 0xdfec, 0x0000, 0xdbc1,
+
+ /*** Three byte table, leaf: e594xx - offset 0x01050 ***/
+
+ /* 80 */ 0x0000, 0xd1e4, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf4, 0xb4bd,
+ /* 88 */ 0x0000, 0xb0a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdff1,
+ /* 90 */ 0xccc6, 0xdff2, 0x0000, 0x0000, 0xdfed, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdfe9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdfeb, 0x0000, 0xdfef, 0xdff0, 0xbbbd, 0x0000, 0x0000, 0xdff3,
+ /* a8 */ 0x0000, 0x0000, 0xdff4, 0x0000, 0xbba3, 0x0000, 0xcadb, 0xcea8,
+ /* b0 */ 0xe0a7, 0xb3aa, 0x0000, 0xe0a6, 0x0000, 0x0000, 0x0000, 0xe0a1,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdffe, 0x0000, 0xcdd9, 0xdffc,
+
+ /*** Three byte table, leaf: e595xx - offset 0x01090 ***/
+
+ /* 80 */ 0x0000, 0xdffa, 0x0000, 0xbfd0, 0xd7c4, 0x0000, 0xc9cc, 0x0000,
+ /* 88 */ 0x0000, 0xdff8, 0xb0a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdffd, 0x0000, 0x0000, 0x0000, 0x0000, 0xdffb, 0xe0a2, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xb7c8, 0x0000, 0x0000, 0xc6a1, 0xc9b6, 0xc0b2, 0xdff5,
+ /* a8 */ 0x0000, 0x0000, 0xc5be, 0x0000, 0xd8c4, 0xdff9, 0xc4f6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a3, 0xe0a4, 0xe0a5,
+ /* b8 */ 0xd0a5, 0x0000, 0x0000, 0xe0b4, 0xcce4, 0x0000, 0xe0b1, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x010d0 ***/
+
+ /* 80 */ 0xbfa6, 0xe0af, 0xceb9, 0xe0ab, 0xc9c6, 0x0000, 0x0000, 0xc0ae,
+ /* 88 */ 0xe0ae, 0xbaed, 0xbab0, 0xe0a9, 0x0000, 0x0000, 0x0000, 0xdff6,
+ /* 90 */ 0x0000, 0xe0b3, 0x0000, 0x0000, 0xe0b8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb4ad, 0xe0b9, 0x0000, 0x0000, 0xcfb2, 0xbac8, 0x0000, 0xe0b0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe0ac, 0x0000, 0xd4fb, 0x0000, 0xdff7, 0x0000, 0xc5e7,
+ /* b8 */ 0x0000, 0xe0ad, 0x0000, 0xd3f7, 0x0000, 0xe0b6, 0xe0b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e597xx - offset 0x0110f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c4, 0xd0e1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe0bc, 0x0000, 0x0000, 0xe0c9, 0xe0ca, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe0be, 0xe0aa, 0xc9a4, 0xe0c1, 0x0000, 0xe0b2, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcac8, 0xe0c3, 0x0000, 0xe0b5,
+ /* a0 */ 0x0000, 0xcecb, 0x0000, 0xcbc3, 0xe0cd, 0xe0c6, 0xe0c2, 0x0000,
+ /* a8 */ 0xe0cb, 0x0000, 0xe0ba, 0xe0bf, 0xe0c0, 0x0000, 0x0000, 0xe0c5,
+ /* b0 */ 0x0000, 0x0000, 0xe0c7, 0xe0c8, 0x0000, 0xe0cc, 0x0000, 0xe0bb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbd4, 0xe0d5, 0x0000,
+
+ /*** Three byte table, leaf: e598xx - offset 0x0114f ***/
+
+ /* 80 */ 0xe0d6, 0xe0d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe0d0, 0xbcce, 0x0000, 0x0000, 0xe0d1, 0x0000, 0xb8c2, 0xd8c5,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd0ea, 0x0000, 0x0000, 0xc2ef, 0x0000, 0x0000, 0xe0cf, 0xe0bd,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe0d4, 0xe0d3, 0x0000, 0x0000, 0xe0d7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0dc, 0xe0d8, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd6f6, 0xb3b0, 0x0000, 0xd7ec, 0x0000, 0xcbbb, 0x0000,
+ /* b8 */ 0x0000, 0xe0da, 0x0000, 0xcefb, 0x0000, 0x0000, 0x0000, 0xbad9,
+
+ /*** Three byte table, leaf: e599xx - offset 0x0118f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e1, 0xe0dd, 0xd2ad, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e2, 0x0000, 0x0000, 0xe0db,
+ /* 98 */ 0xe0d9, 0xe0df, 0x0000, 0x0000, 0xe0e0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe0de, 0x0000, 0xe0e4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc6f7, 0xd8ac, 0xd4eb, 0xe0e6, 0xcac9, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe0e5, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8c1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe0e7, 0xe0e8,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59axx - offset 0x011cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e9, 0xe0e3, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbabf, 0xcce7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe0ea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcff9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0eb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdc0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59bxx - offset 0x01209 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc4d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ec, 0x0000, 0x0000, 0xe0ed,
+ /* 98 */ 0x0000, 0x0000, 0xc7f4, 0xcbc4, 0x0000, 0xe0ee, 0xbbd8, 0xd8b6,
+ /* a0 */ 0xd2f2, 0xe0ef, 0xcdc5, 0x0000, 0xb6da, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe0f1, 0x0000, 0xd4b0, 0x0000, 0x0000,
+ /* b0 */ 0xc0a7, 0xb4d1, 0x0000, 0x0000, 0xcea7, 0xe0f0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe0f2, 0xb9cc, 0x0000, 0x0000, 0xb9fa, 0xcdbc, 0xe0f3,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x01249 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc6d4, 0xe0f4, 0x0000, 0xd4b2, 0x0000,
+ /* 88 */ 0xc8a6, 0xe0f6, 0xe0f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f7, 0x0000, 0x0000, 0xcdc1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcaa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd4da, 0xdbd7, 0xdbd9, 0x0000, 0xdbd8, 0xb9e7, 0xdbdc, 0xdbdd,
+ /* b0 */ 0xb5d8, 0x0000, 0x0000, 0xdbda, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdbdb, 0xb3a1, 0xdbdf, 0x0000, 0x0000, 0xbbf8, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01289 ***/
+
+ /* 80 */ 0xd6b7, 0x0000, 0xdbe0, 0x0000, 0x0000, 0x0000, 0x0000, 0xbef9,
+ /* 88 */ 0x0000, 0x0000, 0xb7bb, 0x0000, 0xdbd0, 0xccae, 0xbfb2, 0xbbb5,
+ /* 90 */ 0xd7f8, 0xbfd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbfe9,
+ /* 98 */ 0x0000, 0x0000, 0xbce1, 0xccb3, 0xdbde, 0xb0d3, 0xceeb, 0xb7d8,
+ /* a0 */ 0xd7b9, 0xc6c2, 0x0000, 0x0000, 0xc0a4, 0x0000, 0xccb9, 0x0000,
+ /* a8 */ 0xdbe7, 0xdbe1, 0xc6ba, 0xdbe3, 0x0000, 0xdbe8, 0x0000, 0xc5f7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdbea, 0x0000, 0x0000, 0xdbe9, 0xbfc0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdbe6, 0xdbe5, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59exx - offset 0x012c7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb4b9, 0xc0ac, 0xc2a2, 0xdbe2, 0xdbe4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd0cd, 0xdbed, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc0dd, 0xdbf2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xb6e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdbf3, 0xdbd2, 0xb9b8, 0xd4ab, 0xdbec, 0x0000, 0xbfd1, 0xdbf0,
+ /* a8 */ 0x0000, 0xdbd1, 0x0000, 0xb5e6, 0x0000, 0xdbeb, 0xbfe5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdbee, 0x0000, 0xdbf1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdbf9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59fxx - offset 0x01305 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb9a1, 0xb0a3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xc2f1, 0x0000, 0x0000, 0xb3c7, 0xdbef,
+ /* 90 */ 0x0000, 0x0000, 0xdbf8, 0x0000, 0xc6d2, 0xdbf4, 0x0000, 0x0000,
+ /* 98 */ 0xdbf5, 0xdbf7, 0xdbf6, 0x0000, 0x0000, 0xdbfe, 0x0000, 0xd3f2,
+ /* a0 */ 0xb2ba, 0x0000, 0x0000, 0x0000, 0xdbfd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdca4, 0x0000, 0xdbfb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdbfa, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdbfc, 0xc5e0, 0xbbf9, 0x0000, 0x0000, 0xdca3, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x01345 ***/
+
+ /* 80 */ 0xdca5, 0x0000, 0xccc3, 0x0000, 0x0000, 0x0000, 0xb6d1, 0xddc0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdca1, 0x0000, 0xdca2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc7b5, 0x0000, 0x0000, 0x0000, 0xb6e9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdca7, 0x0000, 0x0000, 0x0000, 0x0000, 0xdca6, 0x0000,
+ /* a0 */ 0xdca9, 0xb1a4, 0x0000, 0x0000, 0xb5cc, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xbfb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd1df, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6c2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x01381 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdca8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcbfa, 0xebf3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcbdc, 0x0000, 0x0000, 0xcbfe, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xccc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8fb, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcaa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xccee, 0xdcab, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbd3, 0x0000,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x013c1 ***/
+
+ /* 80 */ 0xdcaf, 0xdcac, 0x0000, 0xbeb3, 0x0000, 0xcafb, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdcad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc9ca, 0xc4b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xc7bd, 0xdcae, 0x0000, 0x0000, 0x0000, 0xd4f6, 0xd0e6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc4ab, 0xb6d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdbd4, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x01400 ***/
+
+ /* 80 */ 0x0000, 0xb1da, 0x0000, 0x0000, 0x0000, 0xdbd5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdbd6, 0x0000, 0x0000, 0x0000, 0xbabe, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c0, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcabf, 0xc8c9, 0x0000, 0xd7b3, 0x0000,
+ /* b0 */ 0xc9f9, 0x0000, 0x0000, 0xbfc7, 0x0000, 0x0000, 0xbaf8, 0x0000,
+ /* b8 */ 0x0000, 0xd2bc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x0143e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe2ba, 0x0000, 0xb4a6, 0x0000, 0x0000, 0xb1b8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8b4, 0x0000, 0xcfc4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e7, 0xcfa6, 0xcde2, 0x0000,
+ /* 98 */ 0x0000, 0xd9ed, 0xb6e0, 0x0000, 0xd2b9, 0x0000, 0x0000, 0xb9bb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b9, 0xe2b7, 0x0000, 0xb4f3,
+ /* a8 */ 0x0000, 0xccec, 0xccab, 0xb7f2, 0x0000, 0xd8b2, 0xd1eb, 0xbabb,
+ /* b0 */ 0x0000, 0xcaa7, 0x0000, 0x0000, 0xcdb7, 0x0000, 0x0000, 0xd2c4,
+ /* b8 */ 0xbfe4, 0xbcd0, 0xb6e1, 0x0000, 0xdec5, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x0147d ***/
+
+ /* 80 */ 0x0000, 0xdec6, 0xdbbc, 0x0000, 0xd1d9, 0x0000, 0x0000, 0xc6e6,
+ /* 88 */ 0xc4ce, 0xb7ee, 0x0000, 0xb7dc, 0x0000, 0x0000, 0xbffc, 0xd7e0,
+ /* 90 */ 0x0000, 0xc6f5, 0x0000, 0x0000, 0xb1bc, 0xdec8, 0xbdb1, 0xccd7,
+ /* 98 */ 0xdeca, 0x0000, 0xdec9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb5ec, 0x0000, 0xc9dd, 0x0000, 0x0000, 0xb0c2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xc5ae, 0xc5ab, 0x0000, 0xc4cc, 0x0000,
+ /* b8 */ 0xbce9, 0xcbfd, 0x0000, 0x0000, 0x0000, 0xbac3, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x014bc ***/
+
+ /* 80 */ 0x0000, 0xe5f9, 0xc8e7, 0xe5fa, 0xcdfd, 0x0000, 0xd7b1, 0xb8be,
+ /* 88 */ 0xc2e8, 0x0000, 0xc8d1, 0x0000, 0x0000, 0xe5fb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb6ca, 0xbccb, 0x0000, 0x0000, 0xd1fd, 0xe6a1,
+ /* 98 */ 0x0000, 0xc3ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe5fe, 0xe6a5, 0xcdd7, 0x0000, 0x0000,
+ /* a8 */ 0xb7c1, 0xe5fc, 0xe5fd, 0xe6a3, 0x0000, 0x0000, 0xc4dd, 0xe6a8,
+ /* b0 */ 0x0000, 0x0000, 0xe6a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc3c3, 0x0000, 0xc6de, 0x0000, 0x0000, 0xe6aa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x014fb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4b7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe6a2, 0xcabc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbde3, 0xb9c3, 0xe6a6, 0xd0d5, 0xceaf, 0x0000, 0x0000, 0xe6a9,
+ /* 98 */ 0xe6b0, 0x0000, 0xd2a6, 0x0000, 0xbdaa, 0xe6ad, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe6af, 0x0000, 0xc0d1, 0x0000, 0x0000,
+ /* a8 */ 0xd2cc, 0x0000, 0x0000, 0x0000, 0xbca7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe6b1, 0x0000, 0xd2f6, 0x0000, 0x0000, 0x0000, 0xd7cb,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x0153b ***/
+
+ /* 80 */ 0x0000, 0xcdfe, 0x0000, 0xcdde, 0xc2a6, 0xe6ab, 0xe6ac, 0xbdbf,
+ /* 88 */ 0xe6ae, 0xe6b3, 0x0000, 0x0000, 0xe6b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe6b6, 0x0000, 0xe6b8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc4ef, 0x0000, 0x0000, 0x0000, 0xc4c8, 0x0000, 0x0000, 0xbeea,
+ /* a0 */ 0xc9ef, 0x0000, 0x0000, 0xe6b7, 0x0000, 0xb6f0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc3e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd3e9, 0xe6b4, 0x0000, 0xe6b5, 0x0000, 0xc8a2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6bd, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x0157b ***/
+
+ /* 80 */ 0xe6b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6c5, 0x0000,
+ /* 88 */ 0x0000, 0xcdf1, 0xe6bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6bc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xbbe9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe6be, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ba,
+ /* a8 */ 0x0000, 0x0000, 0xc0b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a4, 0xe6bf, 0xc9f4, 0xe6c3,
+ /* b8 */ 0x0000, 0x0000, 0xe6c4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0f6,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x015bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc3bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xc3c4, 0xe6c2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe6c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe6c7, 0xcfb1, 0x0000, 0xebf4, 0x0000, 0x0000,
+ /* b8 */ 0xe6ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6c5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5abxx - offset 0x015fa ***/
+
+ /* 80 */ 0x0000, 0xbcde, 0xc9a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xbcb5, 0x0000, 0x0000, 0xcfd3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe6c8, 0x0000, 0xe6c9, 0x0000, 0xe6ce, 0x0000,
+ /* 98 */ 0xe6d0, 0x0000, 0x0000, 0x0000, 0xe6d1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe6cb, 0xb5d5, 0x0000, 0xe6cc, 0x0000, 0x0000, 0xe6cf, 0x0000,
+ /* a8 */ 0x0000, 0xc4db, 0x0000, 0xe6c6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe6cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5acxx - offset 0x01631 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe6d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d4, 0xe6d3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe6d5, 0x0000, 0xd9f8, 0x0000, 0x0000, 0xe6d6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01671 ***/
+
+ /* 80 */ 0xe6d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd7d3, 0xe6dd, 0x0000, 0xe6de, 0xbfd7, 0xd4d0, 0x0000, 0xd7d6,
+ /* 98 */ 0xb4e6, 0xcbef, 0xe6da, 0xd8c3, 0xd7ce, 0xd0a2, 0x0000, 0xc3cf,
+ /* a0 */ 0x0000, 0x0000, 0xe6df, 0xbcbe, 0xb9c2, 0xe6db, 0xd1a7, 0x0000,
+ /* a8 */ 0x0000, 0xbaa2, 0xc2cf, 0x0000, 0xd8ab, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xcaeb, 0xe5ee, 0x0000, 0xe6dc, 0x0000, 0xb7f5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xc8e6, 0x0000, 0x0000, 0xc4f5, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x016b1 ***/
+
+ /* 80 */ 0xe5b2, 0xc4fe, 0x0000, 0xcbfc, 0xe5b3, 0xd5ac, 0x0000, 0xd3ee,
+ /* 88 */ 0xcad8, 0xb0b2, 0x0000, 0xcbce, 0xcdea, 0x0000, 0x0000, 0xbaea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe5b5, 0x0000, 0xe5b4, 0x0000, 0xd7da,
+ /* 98 */ 0xb9d9, 0xd6e6, 0xb6a8, 0xcdf0, 0xd2cb, 0xb1a6, 0xcab5, 0x0000,
+ /* a0 */ 0xb3e8, 0xc9f3, 0xbfcd, 0xd0fb, 0xcad2, 0xe5b6, 0xbbc2, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcfdc, 0xb9ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd4d7, 0x0000, 0x0000, 0xbaa6, 0xd1e7, 0xcffc, 0xbcd2, 0x0000,
+ /* b8 */ 0xe5b7, 0xc8dd, 0x0000, 0x0000, 0x0000, 0xbfed, 0xb1f6, 0xcbde,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x016f1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xbcc5, 0x0000, 0xbcc4, 0xd2fa, 0xc3dc, 0xbfdc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8bb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc3c2, 0x0000, 0xbaae, 0xd4a2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7de, 0xc4af, 0xb2ec,
+ /* a0 */ 0x0000, 0xb9d1, 0x0000, 0x0000, 0xe5bb, 0xc1c8, 0x0000, 0x0000,
+ /* a8 */ 0xd5af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5bc, 0x0000,
+ /* b0 */ 0xe5be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb4e7, 0xb6d4, 0xcbc2, 0xd1b0, 0xb5bc, 0x0000, 0x0000, 0xcad9,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x01731 ***/
+
+ /* 80 */ 0x0000, 0xb7e2, 0x0000, 0x0000, 0xc9e4, 0x0000, 0xbdab, 0x0000,
+ /* 88 */ 0x0000, 0xcebe, 0xd7f0, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a1,
+ /* 90 */ 0x0000, 0xc9d9, 0x0000, 0x0000, 0xb6fb, 0xe6d8, 0xbce2, 0x0000,
+ /* 98 */ 0xb3be, 0x0000, 0xc9d0, 0x0000, 0xe6d9, 0xb3a2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdecc, 0x0000, 0xd3c8, 0xdecd, 0x0000, 0xd2a2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdece, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xbecd, 0x0000, 0x0000, 0xdecf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcaac, 0xd2fc, 0xb3df, 0xe5ea, 0xc4e1, 0xbea1, 0xceb2, 0xc4f2,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01771 ***/
+
+ /* 80 */ 0xbed6, 0xc6a8, 0xb2e3, 0x0000, 0x0000, 0xbed3, 0x0000, 0x0000,
+ /* 88 */ 0xc7fc, 0xcceb, 0xbdec, 0xcedd, 0x0000, 0x0000, 0xcaba, 0xc6c1,
+ /* 90 */ 0xe5ec, 0xd0bc, 0x0000, 0x0000, 0x0000, 0xd5b9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0xcaf4, 0x0000,
+ /* a0 */ 0xcdc0, 0xc2c5, 0x0000, 0xe5ef, 0x0000, 0xc2c4, 0xe5f0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f8, 0xcdcd,
+ /* b0 */ 0x0000, 0xc9bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd2d9, 0xe1a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3ec,
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x017b1 ***/
+
+ /* 80 */ 0x0000, 0xcbea, 0xc6f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe1ac, 0x0000, 0x0000, 0x0000, 0xe1a7, 0xe1a9, 0x0000, 0x0000,
+ /* 90 */ 0xe1aa, 0xe1af, 0x0000, 0x0000, 0xb2ed, 0x0000, 0xe1ab, 0xb8da,
+ /* 98 */ 0xe1ad, 0xe1ae, 0xe1b0, 0xb5ba, 0xe1b1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe1b3, 0xe1b8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd1d2, 0x0000, 0xe1b6, 0xe1b5, 0xc1eb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe1b7, 0x0000, 0xd4c0, 0x0000, 0xe1b2, 0x0000, 0xe1ba,
+ /* b8 */ 0xb0b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b4, 0x0000, 0xbff9,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x017f1 ***/
+
+ /* 80 */ 0x0000, 0xe1b9, 0x0000, 0x0000, 0xe1bb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe1be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd6c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcfbf, 0x0000, 0x0000, 0xe1bd, 0xe1bf, 0xc2cd, 0x0000,
+ /* a8 */ 0xb6eb, 0x0000, 0xd3f8, 0x0000, 0x0000, 0xc7cd, 0x0000, 0x0000,
+ /* b0 */ 0xb7e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xbefe, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x0182f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1c0, 0xe1c1, 0x0000, 0x0000, 0xe1c7, 0xb3e7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6e9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4de, 0x0000, 0xd1c2, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe1c8, 0x0000, 0x0000, 0xe1c6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c5, 0x0000, 0xe1c3, 0xe1c2,
+ /* a8 */ 0x0000, 0xb1c0, 0x0000, 0x0000, 0x0000, 0xd5b8, 0xe1c4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1cb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1cc, 0xe1ca,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x0186e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeffa,
+ /* 88 */ 0x0000, 0x0000, 0xe1d3, 0xe1d2, 0xc7b6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe1c9, 0x0000, 0x0000, 0xe1ce, 0x0000, 0xe1d0, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe1d4, 0x0000, 0xe1d1, 0xe1cd, 0x0000, 0x0000, 0xe1cf,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x018ac ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe1d7, 0x0000, 0x0000, 0x0000, 0xe1d8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1da,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x018e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1db, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcea1, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe7dd, 0x0000, 0xb4a8, 0xd6dd, 0x0000,
+ /* a0 */ 0x0000, 0xd1b2, 0xb3b2, 0x0000, 0x0000, 0xb9a4, 0xd7f3, 0xc7c9,
+ /* a8 */ 0xbede, 0xb9ae, 0x0000, 0xced7, 0x0000, 0x0000, 0xb2ee, 0xdbcf,
+ /* b0 */ 0x0000, 0xbcba, 0xd2d1, 0xcbc8, 0xb0cd, 0x0000, 0x0000, 0xcfef,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e3, 0xbded,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01926 ***/
+
+ /* 80 */ 0x0000, 0xb1d2, 0xcad0, 0xb2bc, 0x0000, 0xcba7, 0xb7ab, 0x0000,
+ /* 88 */ 0xcaa6, 0x0000, 0x0000, 0x0000, 0xcfa3, 0x0000, 0x0000, 0xe0f8,
+ /* 90 */ 0xd5ca, 0xe0fb, 0x0000, 0x0000, 0xe0fa, 0xc5c1, 0xccfb, 0x0000,
+ /* 98 */ 0xc1b1, 0xe0f9, 0xd6e3, 0xb2af, 0xd6c4, 0xb5db, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4f8, 0xd6a1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfaf, 0xb0ef, 0x0000,
+ /* b0 */ 0x0000, 0xe0fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a1,
+ /* b8 */ 0xb3a3, 0x0000, 0x0000, 0xe0fd, 0xe0fe, 0xc3b1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01964 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc3dd, 0x0000, 0xe1a2, 0xb7f9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbcf, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a3, 0xc4bb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe1a4, 0x0000, 0x0000, 0xe1a5, 0x0000,
+ /* a0 */ 0x0000, 0xe1a6, 0xb4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xb8c9, 0xc6bd, 0xc4ea, 0x0000, 0xb2a2, 0x0000,
+ /* b8 */ 0xd0d2, 0x0000, 0xe7db, 0xbbc3, 0xd3d7, 0xd3c4, 0x0000, 0xb9e3,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x019a4 ***/
+
+ /* 80 */ 0xe2cf, 0x0000, 0x0000, 0x0000, 0xd7af, 0x0000, 0xc7ec, 0xb1d3,
+ /* 88 */ 0x0000, 0x0000, 0xb4b2, 0xe2d1, 0x0000, 0x0000, 0x0000, 0xd0f2,
+ /* 90 */ 0xc2ae, 0xe2d0, 0x0000, 0xbfe2, 0xd3a6, 0xb5d7, 0xe2d2, 0xb5ea,
+ /* 98 */ 0x0000, 0xc3ed, 0xb8fd, 0x0000, 0xb8ae, 0x0000, 0xc5d3, 0xb7cf,
+ /* a0 */ 0xe2d4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d3, 0xb6c8, 0xd7f9,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcda5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe2d8, 0x0000, 0xe2d6, 0xcafc, 0xbfb5,
+ /* b8 */ 0xd3b9, 0xe2d5, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x019e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc1ae, 0xc0c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe2db, 0xe2da, 0xc0aa, 0x0000, 0x0000, 0xc1ce, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe2dc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe2dd, 0x0000, 0xe2de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdbc8, 0x0000, 0xd1d3, 0xcda2,
+ /* b8 */ 0x0000, 0x0000, 0xbda8, 0x0000, 0x0000, 0x0000, 0xdec3, 0xd8a5,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01a23 ***/
+
+ /* 80 */ 0xbfaa, 0xdbcd, 0xd2ec, 0xc6fa, 0xc5aa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdec4, 0x0000, 0xb1d7, 0xdfae, 0x0000, 0x0000, 0x0000, 0xcabd,
+ /* 90 */ 0x0000, 0xdfb1, 0x0000, 0xb9ad, 0x0000, 0xd2fd, 0x0000, 0xb8a5,
+ /* 98 */ 0xbaeb, 0x0000, 0x0000, 0xb3da, 0x0000, 0x0000, 0x0000, 0xb5dc,
+ /* a0 */ 0xd5c5, 0x0000, 0x0000, 0x0000, 0x0000, 0xc3d6, 0xcfd2, 0xbba1,
+ /* a8 */ 0x0000, 0xe5f3, 0xe5f2, 0x0000, 0x0000, 0xe5f4, 0x0000, 0xcde4,
+ /* b0 */ 0x0000, 0xc8f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb5af, 0xc7bf, 0x0000, 0xe5f6, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01a63 ***/
+
+ /* 80 */ 0xecb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe5e6, 0x0000, 0xb9e9, 0xb5b1, 0x0000, 0xc2bc, 0xe5e8, 0xe5e7,
+ /* 98 */ 0xe5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2cd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe1ea, 0xd0ce, 0x0000, 0xcdae, 0x0000, 0xd1e5, 0x0000,
+ /* a8 */ 0x0000, 0xb2ca, 0xb1eb, 0x0000, 0xb1f2, 0xc5ed, 0x0000, 0x0000,
+ /* b0 */ 0xd5c3, 0xd3b0, 0x0000, 0xe1dc, 0x0000, 0x0000, 0x0000, 0xe1dd,
+ /* b8 */ 0x0000, 0xd2db, 0x0000, 0xb3b9, 0xb1cb, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01aa3 ***/
+
+ /* 80 */ 0xcdf9, 0xd5f7, 0xe1de, 0x0000, 0xbeb6, 0xb4fd, 0x0000, 0xe1df,
+ /* 88 */ 0xbadc, 0xe1e0, 0xbbb2, 0xc2c9, 0xe1e1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd0ec, 0x0000, 0xcdbd, 0x0000, 0x0000, 0xe1e2, 0x0000, 0xb5c3,
+ /* 98 */ 0xc5c7, 0xe1e3, 0x0000, 0x0000, 0xe1e4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd3f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe1e5, 0x0000, 0xd1ad, 0x0000, 0x0000, 0xe1e6, 0xcea2, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e7, 0x0000, 0xb5c2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e8, 0xbbd5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01ae1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd0c4, 0xe2e0, 0xb1d8, 0xd2e4, 0x0000,
+ /* 88 */ 0x0000, 0xe2e1, 0x0000, 0x0000, 0xbcc9, 0xc8cc, 0x0000, 0xe2e3,
+ /* 90 */ 0xecfe, 0xecfd, 0xdfaf, 0x0000, 0x0000, 0x0000, 0xe2e2, 0xd6be,
+ /* 98 */ 0xcdfc, 0xc3a6, 0x0000, 0x0000, 0x0000, 0xe3c3, 0x0000, 0x0000,
+ /* a0 */ 0xd6d2, 0xe2e7, 0x0000, 0x0000, 0xe2e8, 0x0000, 0x0000, 0xd3c7,
+ /* a8 */ 0x0000, 0x0000, 0xe2ec, 0xbfec, 0x0000, 0xe2ed, 0xe2e5, 0x0000,
+ /* b0 */ 0x0000, 0xb3c0, 0x0000, 0x0000, 0x0000, 0xc4ee, 0x0000, 0x0000,
+ /* b8 */ 0xe2ee, 0x0000, 0x0000, 0xd0c3, 0x0000, 0xbaf6, 0xe2e9, 0xb7de,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01b21 ***/
+
+ /* 80 */ 0xbbb3, 0xccac, 0xcbcb, 0xe2e4, 0xe2e6, 0xe2ea, 0xe2eb, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe2f7, 0x0000, 0x0000, 0xe2f4, 0xd4f5, 0xe2f3,
+ /* 90 */ 0x0000, 0x0000, 0xc5ad, 0x0000, 0xd5fa, 0xc5c2, 0xb2c0, 0x0000,
+ /* 98 */ 0x0000, 0xe2ef, 0x0000, 0xe2f2, 0xc1af, 0xcbbc, 0x0000, 0x0000,
+ /* a0 */ 0xb5a1, 0xe2f9, 0x0000, 0x0000, 0x0000, 0xbcb1, 0xe2f1, 0xd0d4,
+ /* a8 */ 0xd4b9, 0xe2f5, 0xb9d6, 0xe2f6, 0x0000, 0x0000, 0x0000, 0xc7d3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd7dc, 0xeda1, 0x0000, 0x0000, 0xe2f8,
+
+ /*** Three byte table, leaf: e681xx - offset 0x01b61 ***/
+
+ /* 80 */ 0x0000, 0xeda5, 0xe2fe, 0xcad1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xc1b5, 0x0000, 0xbbd0, 0x0000, 0x0000,
+ /* 90 */ 0xbfd6, 0x0000, 0xbae3, 0x0000, 0x0000, 0xcba1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeda6, 0xeda3, 0x0000, 0x0000, 0xeda2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xbbd6, 0xeda7, 0xd0f4, 0x0000, 0x0000, 0xeda4,
+ /* a8 */ 0xbade, 0xb6f7, 0xe3a1, 0xb6b2, 0xccf1, 0xb9a7, 0x0000, 0xcfa2,
+ /* b0 */ 0xc7a1, 0x0000, 0x0000, 0xbfd2, 0x0000, 0x0000, 0xb6f1, 0x0000,
+ /* b8 */ 0xe2fa, 0xe2fb, 0xe2fd, 0xe2fc, 0xc4d5, 0xe3a2, 0x0000, 0xd3c1,
+
+ /*** Three byte table, leaf: e682xx - offset 0x01ba1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe3a7, 0xc7c4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xcfa4, 0x0000, 0x0000, 0xe3a9, 0xbab7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3a8, 0x0000, 0xbbda, 0x0000, 0xe3a3, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe3a4, 0xe3aa, 0x0000, 0xe3a6, 0x0000, 0xcef2,
+ /* a0 */ 0xd3c6, 0x0000, 0x0000, 0xbbbc, 0x0000, 0x0000, 0xd4c3, 0x0000,
+ /* a8 */ 0xc4fa, 0x0000, 0x0000, 0xeda8, 0xd0fc, 0xe3a5, 0x0000, 0xc3f5,
+ /* b0 */ 0x0000, 0xe3ad, 0xb1af, 0x0000, 0xe3b2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbcc2, 0x0000, 0x0000, 0xe3ac, 0xb5bf,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01bde ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7e9, 0xe3b0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xbeaa, 0xcdef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xbbf3, 0x0000, 0x0000, 0x0000, 0xcce8, 0x0000, 0x0000,
+ /* 98 */ 0xe3af, 0x0000, 0xe3b1, 0x0000, 0xcfa7, 0xe3ae, 0x0000, 0xcea9,
+ /* a0 */ 0xbbdd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5eb, 0xbee5,
+ /* a8 */ 0xb2d2, 0xb3cd, 0x0000, 0xb1b9, 0xe3ab, 0xb2d1, 0xb5ac, 0xb9df,
+ /* b0 */ 0xb6e8, 0x0000, 0x0000, 0xcfeb, 0xe3b7, 0x0000, 0xbbcc, 0x0000,
+ /* b8 */ 0x0000, 0xc8c7, 0xd0ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01c1e ***/
+
+ /* 80 */ 0xe3b8, 0xb3ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xeda9, 0x0000,
+ /* 88 */ 0xd3fa, 0xd3e4, 0x0000, 0x0000, 0x0000, 0xedaa, 0xe3b9, 0xd2e2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd3de, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8d0,
+ /* a0 */ 0xe3b3, 0x0000, 0x0000, 0xe3b6, 0xb7df, 0x0000, 0xe3b4, 0xc0a2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe3ba, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b8,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01c5e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb4c8, 0x0000, 0xe3bb, 0x0000, 0xbbc5, 0x0000, 0xc9f7, 0x0000,
+ /* 90 */ 0x0000, 0xc9e5, 0x0000, 0x0000, 0x0000, 0xc4bd, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedab, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xc2fd, 0x0000, 0x0000, 0x0000, 0x0000, 0xbbdb,
+ /* a8 */ 0xbfae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xcebf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3bc, 0x0000, 0xbfb6,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x01c96 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb1ef, 0x0000, 0x0000, 0xd4f7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3be, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedad, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3bf,
+ /* a8 */ 0xbaa9, 0xedac, 0x0000, 0x0000, 0xe3bd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbab6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x01cd5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb6ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd0b8, 0x0000, 0xb0c3, 0xedae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xedaf, 0xc0c1, 0x0000, 0xe3c1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5b3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcb2,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01d15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedb0, 0x0000,
+ /* 88 */ 0xb8ea, 0x0000, 0xceec, 0xeaa7, 0xd0e7, 0xcaf9, 0xc8d6, 0xcfb7,
+ /* 90 */ 0xb3c9, 0xced2, 0xbde4, 0x0000, 0x0000, 0xe3de, 0xbbf2, 0xeaa8,
+ /* 98 */ 0xd5bd, 0x0000, 0xc6dd, 0xeaa9, 0x0000, 0x0000, 0x0000, 0xeaaa,
+ /* a0 */ 0x0000, 0xeaac, 0xeaab, 0x0000, 0xeaae, 0xeaad, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xbdd8, 0x0000, 0xeaaf, 0x0000, 0xc2be, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xb4c1, 0xb4f7, 0x0000, 0x0000, 0xbba7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xece6, 0xece5, 0xb7bf,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01d55 ***/
+
+ /* 80 */ 0xcbf9, 0xb1e2, 0x0000, 0xece7, 0x0000, 0x0000, 0x0000, 0xc9c8,
+ /* 88 */ 0xece8, 0xece9, 0x0000, 0xcad6, 0xded0, 0xb2c5, 0xd4fa, 0x0000,
+ /* 90 */ 0x0000, 0xc6cb, 0xb0c7, 0xb4f2, 0xc8d3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcdd0, 0x0000, 0x0000, 0xbfb8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xbfdb, 0x0000, 0x0000, 0xc7a4, 0xd6b4,
+ /* a8 */ 0x0000, 0xc0a9, 0xded1, 0xc9a8, 0xd1ef, 0xc5a4, 0xb0e7, 0xb3b6,
+ /* b0 */ 0xc8c5, 0x0000, 0x0000, 0xb0e2, 0x0000, 0x0000, 0xb7f6, 0x0000,
+ /* b8 */ 0x0000, 0xc5fa, 0x0000, 0x0000, 0xb6f3, 0x0000, 0xd5d2, 0xb3d0,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01d95 ***/
+
+ /* 80 */ 0xbcbc, 0x0000, 0x0000, 0x0000, 0xb3ad, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xbef1, 0xb0d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd2d6, 0xcae3, 0xd7a5, 0x0000, 0xcdb6, 0xb6b6, 0xbfb9,
+ /* 98 */ 0xd5db, 0x0000, 0xb8a7, 0xc5d7, 0x0000, 0x0000, 0x0000, 0xded2,
+ /* a0 */ 0xbfd9, 0xc2d5, 0xc7c0, 0x0000, 0xbba4, 0xb1a8, 0x0000, 0x0000,
+ /* a8 */ 0xc5ea, 0x0000, 0x0000, 0xc5fb, 0xcca7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb1a7, 0x0000, 0x0000, 0x0000, 0xb5d6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc4a8, 0x0000, 0xded3, 0xd1ba, 0xb3e9, 0x0000, 0xc3f2,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01dd5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb7f7, 0x0000, 0xd6f4, 0xb5a3, 0xb2f0, 0xc4b4,
+ /* 88 */ 0xc4e9, 0xc0ad, 0xded4, 0x0000, 0xb0e8, 0xc5c4, 0xc1e0, 0x0000,
+ /* 90 */ 0xb9d5, 0x0000, 0xbedc, 0xcdd8, 0xb0ce, 0x0000, 0xcdcf, 0xded6,
+ /* 98 */ 0xbed0, 0xd7be, 0xded5, 0xd5d0, 0xb0dd, 0x0000, 0x0000, 0xc4e2,
+ /* a0 */ 0x0000, 0x0000, 0xc2a3, 0xbcf0, 0x0000, 0xd3b5, 0xc0b9, 0xc5a1,
+ /* a8 */ 0xb2a6, 0xd4f1, 0x0000, 0x0000, 0xc0a8, 0xcac3, 0xded7, 0xd5fc,
+ /* b0 */ 0x0000, 0xb9b0, 0x0000, 0xc8ad, 0xcba9, 0x0000, 0xded9, 0xbfbd,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6b4, 0xd7a7, 0xcab0, 0xc4c3,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01e15 ***/
+
+ /* 80 */ 0x0000, 0xb3d6, 0xb9d2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6b8,
+ /* 88 */ 0xeafc, 0xb0b4, 0x0000, 0x0000, 0x0000, 0x0000, 0xbfe6, 0x0000,
+ /* 90 */ 0x0000, 0xccf4, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdda, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6bf, 0xc2ce, 0x0000, 0xcece, 0xcca2, 0xd0ae,
+ /* a0 */ 0xc4d3, 0xb5b2, 0xded8, 0xd5f5, 0xbcb7, 0xbbd3, 0x0000, 0x0000,
+ /* a8 */ 0xb0a4, 0x0000, 0xc5b2, 0xb4ec, 0x0000, 0x0000, 0x0000, 0xd5f1,
+ /* b0 */ 0x0000, 0x0000, 0xeafd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdeda, 0xcda6, 0x0000, 0x0000, 0xcdec,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68dxx - offset 0x01e53 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xcee6, 0xdedc, 0x0000, 0xcdb1, 0xc0a6, 0x0000,
+ /* 88 */ 0x0000, 0xd7bd, 0x0000, 0xdedb, 0xb0c6, 0xbab4, 0xc9d3, 0xc4f3,
+ /* 90 */ 0xbee8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2b6, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0cc, 0xcbf0,
+ /* a0 */ 0x0000, 0xbcf1, 0xbbbb, 0xb5b7, 0x0000, 0x0000, 0x0000, 0xc5f5,
+ /* a8 */ 0x0000, 0xdee6, 0x0000, 0x0000, 0x0000, 0xdee3, 0xbedd, 0x0000,
+ /* b0 */ 0x0000, 0xdedf, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4b7, 0xbddd,
+ /* b8 */ 0x0000, 0x0000, 0xdee0, 0xc4ed, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68exx - offset 0x01e93 ***/
+
+ /* 80 */ 0xcfc6, 0x0000, 0xb5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6de,
+ /* 88 */ 0xcada, 0xb5f4, 0xdee5, 0x0000, 0xd5c6, 0x0000, 0xdee1, 0xcccd,
+ /* 90 */ 0xc6fe, 0x0000, 0xc5c5, 0x0000, 0x0000, 0x0000, 0xd2b4, 0x0000,
+ /* 98 */ 0xbef2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc2d3, 0x0000, 0xccbd, 0xb3b8, 0x0000, 0xbdd3, 0x0000, 0xbfd8,
+ /* a8 */ 0xcdc6, 0xd1da, 0xb4eb, 0x0000, 0xdee4, 0xdedd, 0xdee7, 0x0000,
+ /* b0 */ 0xeafe, 0x0000, 0x0000, 0xc2b0, 0xdee2, 0x0000, 0x0000, 0xd6c0,
+ /* b8 */ 0xb5a7, 0x0000, 0xb2f4, 0x0000, 0xdee8, 0x0000, 0xdef2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68fxx - offset 0x01ed2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdeed, 0x0000, 0xdef1, 0x0000,
+ /* 88 */ 0x0000, 0xc8e0, 0x0000, 0x0000, 0x0000, 0xd7e1, 0xdeef, 0xc3e8,
+ /* 90 */ 0xcce1, 0x0000, 0xb2e5, 0x0000, 0x0000, 0x0000, 0xd2be, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeee, 0x0000,
+ /* a0 */ 0xdeeb, 0xced5, 0x0000, 0xb4a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xbfab, 0xbebe, 0x0000, 0x0000, 0xbdd2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdee9, 0x0000, 0xd4ae, 0x0000, 0xdede, 0x0000,
+ /* b8 */ 0xdeea, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0bf, 0x0000, 0xdeec,
+
+ /*** Three byte table, leaf: e690xx - offset 0x01f12 ***/
+
+ /* 80 */ 0xb2f3, 0xb8e9, 0xc2a7, 0x0000, 0x0000, 0xbdc1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdef5, 0xdef8, 0x0000, 0x0000, 0xb2ab,
+ /* 90 */ 0xb4a4, 0x0000, 0x0000, 0xb4ea, 0xc9a6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdef6, 0xcbd1, 0x0000, 0xb8e3, 0x0000,
+ /* a0 */ 0xdef7, 0xdefa, 0x0000, 0x0000, 0x0000, 0x0000, 0xdef9, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xccc2, 0x0000, 0xb0e1, 0xb4ee, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ba, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd0af, 0x0000, 0x0000, 0xb2eb, 0x0000, 0xeba1,
+
+ /*** Three byte table, leaf: e691xx - offset 0x01f52 ***/
+
+ /* 80 */ 0x0000, 0xdef4, 0x0000, 0x0000, 0xc9e3, 0xdef3, 0xb0da, 0xd2a1,
+ /* 88 */ 0xb1f7, 0x0000, 0xccaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdef0, 0x0000, 0xcba4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd5aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdefb, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4dd,
+ /* a8 */ 0x0000, 0xc4a6, 0x0000, 0x0000, 0x0000, 0xdefd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc3fe, 0xc4a1, 0xdfa1, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x01f90 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc1cc, 0x0000, 0xdefc, 0xbeef, 0x0000, 0xc6b2,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xb3c5, 0xc8f6, 0x0000, 0x0000, 0xcbba, 0xdefe, 0x0000,
+ /* 98 */ 0x0000, 0xdfa4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b2, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3b7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc1c3, 0x0000, 0x0000, 0xc7cb, 0xb2a5, 0xb4e9, 0x0000,
+ /* b0 */ 0xd7ab, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4ec, 0x0000, 0xdfa2,
+ /* b8 */ 0xdfa3, 0x0000, 0xdfa5, 0x0000, 0xbab3, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e693xx - offset 0x01fd0 ***/
+
+ /* 80 */ 0xdfa6, 0x0000, 0xc0de, 0x0000, 0x0000, 0xc9c3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2d9, 0xc7e6, 0x0000,
+ /* 90 */ 0xdfa7, 0x0000, 0xc7dc, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa8,
+ /* 98 */ 0xeba2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbd3, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdfaa, 0x0000, 0xdfa9, 0x0000, 0xb2c1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e694xx - offset 0x02010 ***/
+
+ /* 80 */ 0xc5ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdfab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd4dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc8c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfac, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xbef0, 0x0000, 0x0000, 0xdfad, 0xd6a7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeab7, 0xebb6, 0xcad5, 0x0000,
+ /* b8 */ 0xd8fc, 0xb8c4, 0x0000, 0xb9a5, 0x0000, 0x0000, 0xb7c5, 0xd5fe,
+
+ /*** Three byte table, leaf: e695xx - offset 0x02050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9ca, 0x0000, 0x0000,
+ /* 88 */ 0xd0a7, 0xf4cd, 0x0000, 0x0000, 0xb5d0, 0x0000, 0x0000, 0xc3f4,
+ /* 90 */ 0x0000, 0xbec8, 0x0000, 0x0000, 0x0000, 0xebb7, 0xb0bd, 0x0000,
+ /* 98 */ 0x0000, 0xbdcc, 0x0000, 0xc1b2, 0x0000, 0xb1d6, 0xb3a8, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb8d2, 0xc9a2, 0x0000, 0x0000, 0xb6d8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xebb8, 0xbeb4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xcafd, 0x0000, 0xc7c3, 0x0000, 0xd5fb, 0x0000, 0x0000, 0xb7f3,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x02089 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcec4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd5ab, 0xb1f3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xecb3, 0xb0df, 0x0000, 0xecb5, 0x0000, 0x0000, 0x0000, 0xb6b7,
+ /* 98 */ 0x0000, 0xc1cf, 0x0000, 0xf5fa, 0xd0b1, 0x0000, 0x0000, 0xd5e5,
+ /* a0 */ 0x0000, 0xced3, 0x0000, 0x0000, 0xbdef, 0xb3e2, 0x0000, 0xb8ab,
+ /* a8 */ 0x0000, 0xd5b6, 0x0000, 0xedbd, 0x0000, 0xb6cf, 0x0000, 0xcbb9,
+ /* b0 */ 0xd0c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb7bd, 0x0000, 0x0000, 0xecb6, 0xcaa9, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e697xx - offset 0x020c8 ***/
+
+ /* 80 */ 0x0000, 0xc5d4, 0x0000, 0xecb9, 0xecb8, 0xc2c3, 0xecb7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd0fd, 0xecba, 0x0000, 0xecbb, 0xd7e5,
+ /* 90 */ 0x0000, 0x0000, 0xecbc, 0x0000, 0x0000, 0x0000, 0xecbd, 0xc6ec,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcede, 0x0000, 0xbcc8, 0x0000, 0x0000, 0xc8d5, 0xb5a9, 0xbec9,
+ /* a8 */ 0xd6bc, 0xd4e7, 0x0000, 0x0000, 0xd1ae, 0xd0f1, 0xeab8, 0xeab9,
+ /* b0 */ 0xeaba, 0xbab5, 0x0000, 0x0000, 0x0000, 0x0000, 0xcab1, 0xbff5,
+ /* b8 */ 0x0000, 0x0000, 0xcdfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e698xx - offset 0x02108 ***/
+
+ /* 80 */ 0xeac0, 0x0000, 0xb0ba, 0xeabe, 0x0000, 0x0000, 0xc0a5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeabb, 0x0000, 0xb2fd, 0x0000, 0xc3f7, 0xbbe8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd2d7, 0xcef4, 0xeabf, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeabc, 0x0000, 0x0000, 0x0000, 0xeac3, 0x0000, 0xd0c7,
+ /* a0 */ 0xd3b3, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4ba, 0x0000, 0xc3c1,
+ /* a8 */ 0xd7f2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5d1, 0x0000, 0xcac7,
+ /* b0 */ 0x0000, 0xeac5, 0x0000, 0x0000, 0xeac4, 0xeac7, 0xeac6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6e7, 0x0000, 0xcfd4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e699xx - offset 0x02147 ***/
+
+ /* 80 */ 0x0000, 0xeacb, 0x0000, 0xbbce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xbdfa, 0xc9ce, 0x0000, 0x0000, 0xeacc,
+ /* 90 */ 0x0000, 0x0000, 0xc9b9, 0xcffe, 0xeaca, 0xd4ce, 0xeacd, 0xeacf,
+ /* 98 */ 0x0000, 0x0000, 0xcded, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac9,
+ /* a0 */ 0x0000, 0xeace, 0x0000, 0x0000, 0xceee, 0x0000, 0xbbde, 0x0000,
+ /* a8 */ 0xb3bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6d5, 0xbeb0,
+ /* b0 */ 0xcefa, 0x0000, 0x0000, 0x0000, 0xc7e7, 0x0000, 0xbea7, 0xead0,
+ /* b8 */ 0x0000, 0x0000, 0xd6c7, 0x0000, 0x0000, 0x0000, 0xc1c0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69axx - offset 0x02186 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd4dd, 0x0000, 0xead1, 0x0000, 0x0000, 0xcfbe,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xead2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcaee, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5af, 0xb0b5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xead4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xead3,
+ /* a8 */ 0xf4df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4ba, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1a9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe5df, 0x0000, 0x0000, 0x0000, 0x0000, 0xead5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69bxx - offset 0x021c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xcaef, 0x0000, 0xead6, 0xead7, 0xc6d8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xead8, 0x0000,
+ /* a8 */ 0x0000, 0xead9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd4bb, 0x0000, 0xc7fa, 0xd2b7, 0xb8fc, 0x0000, 0x0000, 0xeac2,
+ /* b8 */ 0x0000, 0xb2dc, 0x0000, 0x0000, 0xc2fc, 0x0000, 0xd4f8, 0xcce6,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x02205 ***/
+
+ /* 80 */ 0xd7ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd4c2, 0xd3d0, 0xebc3, 0xc5f3, 0x0000, 0xb7fe, 0x0000, 0x0000,
+ /* 90 */ 0xebd4, 0x0000, 0x0000, 0x0000, 0xcbb7, 0xebde, 0x0000, 0xc0ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcdfb, 0x0000, 0xb3af, 0x0000, 0xc6da,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebfc, 0x0000,
+ /* a8 */ 0xc4be, 0x0000, 0xceb4, 0xc4a9, 0xb1be, 0xd4fd, 0x0000, 0xcaf5,
+ /* b0 */ 0x0000, 0xd6ec, 0x0000, 0x0000, 0xc6d3, 0xb6e4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xbbfa, 0x0000, 0x0000, 0xd0e0, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x02245 ***/
+
+ /* 80 */ 0xc9b1, 0x0000, 0xd4d3, 0xc8a8, 0x0000, 0x0000, 0xb8cb, 0x0000,
+ /* 88 */ 0xe8be, 0xc9bc, 0x0000, 0x0000, 0xe8bb, 0x0000, 0xc0ee, 0xd0d3,
+ /* 90 */ 0xb2c4, 0xb4e5, 0x0000, 0xe8bc, 0x0000, 0x0000, 0xd5c8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6c5, 0x0000, 0xe8bd, 0xcaf8,
+ /* a0 */ 0xb8dc, 0xccf5, 0x0000, 0x0000, 0x0000, 0xc0b4, 0x0000, 0x0000,
+ /* a8 */ 0xd1ee, 0xe8bf, 0xe8c2, 0x0000, 0x0000, 0xbabc, 0x0000, 0xb1ad,
+ /* b0 */ 0xbddc, 0x0000, 0xeabd, 0xe8c3, 0x0000, 0xe8c6, 0x0000, 0xe8cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8cc, 0x0000, 0xcbc9, 0xb0e5,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02285 ***/
+
+ /* 80 */ 0x0000, 0xbcab, 0x0000, 0x0000, 0xb9b9, 0x0000, 0x0000, 0xe8c1,
+ /* 88 */ 0x0000, 0xcdf7, 0x0000, 0xe8ca, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcef6, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5ed, 0x0000, 0xc1d6,
+ /* 98 */ 0xe8c4, 0x0000, 0xc3b6, 0x0000, 0xb9fb, 0xd6a6, 0xe8c8, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcae0, 0xd4e6, 0x0000, 0xe8c0, 0x0000, 0xe8c5,
+ /* a8 */ 0xe8c7, 0x0000, 0xc7b9, 0xb7e3, 0x0000, 0xe8c9, 0x0000, 0xbfdd,
+ /* b0 */ 0xe8d2, 0x0000, 0x0000, 0xe8d7, 0x0000, 0xe8d5, 0xbcdc, 0xbccf,
+ /* b8 */ 0xe8db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69fxx - offset 0x022c4 ***/
+
+ /* 80 */ 0x0000, 0xe8de, 0x0000, 0xe8da, 0xb1fa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0d8,
+ /* 90 */ 0xc4b3, 0xb8cc, 0xc6e2, 0xc8be, 0xc8e1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe8cf, 0xe8d4, 0xe8d6, 0x0000, 0xb9f1, 0xe8d8, 0xd7f5, 0x0000,
+ /* a0 */ 0xc4fb, 0x0000, 0xe8dc, 0x0000, 0x0000, 0xb2e9, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8d1, 0x0000, 0x0000, 0xbced, 0x0000, 0x0000, 0xbfc2,
+ /* b0 */ 0xe8cd, 0xd6f9, 0x0000, 0xc1f8, 0xb2f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8df, 0x0000, 0xcac1,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x02304 ***/
+
+ /* 80 */ 0xe8d9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a4, 0x0000, 0xb1ea,
+ /* 88 */ 0xd5bb, 0xe8ce, 0xe8d0, 0xb6b0, 0xe8d3, 0x0000, 0xe8dd, 0xc0b8,
+ /* 90 */ 0x0000, 0xcaf7, 0x0000, 0xcba8, 0x0000, 0x0000, 0xc6dc, 0xc0f5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd0a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8f2, 0xd6ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe8e0, 0xe8e1, 0x0000, 0x0000, 0x0000, 0xd1f9,
+ /* b8 */ 0xbacb, 0xb8f9, 0x0000, 0x0000, 0xb8f1, 0xd4d4, 0xe8ef, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02344 ***/
+
+ /* 80 */ 0xe8ee, 0xe8ec, 0xb9f0, 0xccd2, 0xe8e6, 0xcea6, 0xbff2, 0x0000,
+ /* 88 */ 0xb0b8, 0xe8f1, 0xe8f0, 0x0000, 0xd7c0, 0x0000, 0xe8e4, 0x0000,
+ /* 90 */ 0xcda9, 0xc9a3, 0x0000, 0xbbb8, 0xbddb, 0xe8ea, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe8e2, 0xe8e3, 0xe8e5, 0xb5b5, 0xe8e7, 0xc7c5, 0xe8eb, 0xe8ed,
+ /* a8 */ 0xbdb0, 0xd7ae, 0x0000, 0xe8f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f5, 0x0000, 0xcdb0, 0xe8f6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02383 ***/
+
+ /* 80 */ 0x0000, 0xc1ba, 0x0000, 0xe8e8, 0x0000, 0xc3b7, 0xb0f0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe8f7, 0x0000, 0x0000, 0x0000, 0xb9a3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xc9d2, 0x0000, 0x0000, 0x0000, 0xc3ce, 0xcee0,
+ /* a8 */ 0xc0e6, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf3, 0x0000, 0xccdd,
+ /* b0 */ 0xd0b5, 0x0000, 0x0000, 0xcae1, 0x0000, 0xe8f3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x023c3 ***/
+
+ /* 80 */ 0xbcec, 0x0000, 0xe8f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc3de, 0x0000, 0xc6e5, 0x0000, 0xb9f7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb0f4, 0x0000, 0x0000, 0xd7d8, 0x0000, 0x0000,
+ /* 98 */ 0xbcac, 0x0000, 0xc5ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xccc4, 0x0000, 0x0000, 0xe9a6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9ad, 0x0000,
+ /* b0 */ 0xe9a2, 0xc0e2, 0x0000, 0x0000, 0x0000, 0xbfc3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe8fe, 0xb9d7, 0x0000, 0xe8fb, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x02402 ***/
+
+ /* 80 */ 0x0000, 0xe9a4, 0x0000, 0x0000, 0x0000, 0xd2ce, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe9a3, 0x0000, 0xd6b2, 0xd7b5, 0x0000,
+ /* 90 */ 0xe9a7, 0x0000, 0xbdb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8fc,
+ /* a0 */ 0xe8fd, 0x0000, 0x0000, 0x0000, 0xe9a1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd6, 0x0000, 0x0000,
+ /* b0 */ 0xd2ac, 0x0000, 0x0000, 0x0000, 0xe9b2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe9a9, 0x0000, 0x0000, 0x0000, 0xb4aa, 0x0000, 0xb4bb,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02442 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a8, 0x0000, 0x0000, 0xe9a5,
+ /* 98 */ 0x0000, 0x0000, 0xb3fe, 0x0000, 0x0000, 0xe9ac, 0xc0e3, 0x0000,
+ /* a0 */ 0xe9aa, 0x0000, 0x0000, 0xe9b9, 0x0000, 0x0000, 0xe9b8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe9ae, 0x0000, 0x0000, 0xe8fa, 0x0000,
+ /* b0 */ 0x0000, 0xe9a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbfac,
+ /* b8 */ 0xe9b1, 0xe9ba, 0x0000, 0x0000, 0xc2a5, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02482 ***/
+
+ /* 80 */ 0xe9af, 0x0000, 0xb8c5, 0x0000, 0xe9ad, 0x0000, 0xd3dc, 0xe9b4,
+ /* 88 */ 0xe9b5, 0xe9b7, 0x0000, 0x0000, 0x0000, 0xe9c7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0c6, 0xe9c5, 0x0000, 0x0000,
+ /* 98 */ 0xe9b0, 0x0000, 0x0000, 0xe9bb, 0xb0f1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9bc,
+ /* a8 */ 0xd5a5, 0x0000, 0x0000, 0xe9be, 0x0000, 0xe9bf, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe9c1, 0x0000, 0x0000, 0xc1f1, 0x0000, 0x0000, 0xc8b6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe9bd, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x024c1 ***/
+
+ /* 80 */ 0x0000, 0xe9c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe9c3, 0x0000, 0xe9b3, 0x0000, 0xe9b6, 0x0000,
+ /* 90 */ 0xbbb1, 0x0000, 0x0000, 0x0000, 0xe9c0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xbcf7, 0x0000, 0x0000, 0x0000, 0xe9c4,
+ /* a0 */ 0xe9c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ca, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe9ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2db, 0x0000, 0xe9c8,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x02501 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xb7ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9cb,
+ /* 98 */ 0xe9cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c1,
+ /* a0 */ 0x0000, 0xc4a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe9d8, 0x0000, 0xbae1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c9,
+ /* b0 */ 0x0000, 0xd3a3, 0x0000, 0x0000, 0x0000, 0xe9d4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9d7, 0xe9d0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x02540 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9cf, 0x0000, 0x0000, 0xc7c1,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe9d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe9d9, 0xb3c8, 0x0000, 0xe9d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcff0, 0x0000, 0x0000, 0x0000, 0xe9cd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb3f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe9d6, 0x0000, 0x0000, 0xe9da, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02580 ***/
+
+ /* 80 */ 0xccb4, 0x0000, 0x0000, 0x0000, 0xcfad, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9d5, 0x0000,
+ /* 90 */ 0xe9dc, 0xe9db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9de,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe9d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe9dd, 0x0000, 0xe9df, 0xc3ca,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x025ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc7b7, 0xb4ce, 0xbbb6, 0xd0c0, 0xeca3, 0x0000, 0x0000, 0xc5b7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd3fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca4,
+ /* b8 */ 0x0000, 0xeca5, 0xc6db, 0x0000, 0x0000, 0x0000, 0xbfee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x025ec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeca6, 0x0000, 0x0000, 0xeca7, 0xd0aa,
+ /* 88 */ 0x0000, 0xc7b8, 0x0000, 0x0000, 0xb8e8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeca8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd6b9, 0xd5fd, 0xb4cb, 0xb2bd, 0xcee4, 0xc6e7,
+ /* a8 */ 0x0000, 0x0000, 0xcde1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb4f5, 0x0000, 0xcbc0, 0xbcdf, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6aexx - offset 0x0262b ***/
+
+ /* 80 */ 0x0000, 0xe9e2, 0xe9e3, 0xd1ea, 0xe9e5, 0x0000, 0xb4f9, 0xe9e4,
+ /* 88 */ 0x0000, 0xd1b3, 0xcae2, 0xb2d0, 0x0000, 0xe9e8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe9e6, 0xe9e7, 0x0000, 0x0000, 0xd6b3, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe9e9, 0xe9ea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe9eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe9ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecaf, 0xc5b9, 0xb6ce, 0x0000, 0xd2f3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ee,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x0266b ***/
+
+ /* 80 */ 0x0000, 0xbbd9, 0xecb1, 0x0000, 0x0000, 0xd2e3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xcee3, 0x0000, 0xc4b8, 0x0000, 0xc3bf,
+ /* 90 */ 0x0000, 0x0000, 0xb6be, 0xd8b9, 0xb1c8, 0xb1cf, 0xb1d1, 0xc5fe,
+ /* 98 */ 0x0000, 0xb1d0, 0x0000, 0xc3ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd5b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xeba4, 0xbac1, 0x0000, 0x0000, 0x0000, 0xccba,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeba5, 0x0000, 0xeba7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeba8, 0x0000, 0x0000, 0x0000, 0xeba6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x026a9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba9, 0xebab, 0xebaa,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebac, 0x0000, 0xcacf,
+ /* 90 */ 0xd8b5, 0xc3f1, 0x0000, 0xc3a5, 0xc6f8, 0xebad, 0xc4ca, 0x0000,
+ /* 98 */ 0xebae, 0xebaf, 0xebb0, 0xb7d5, 0x0000, 0x0000, 0x0000, 0xb7fa,
+ /* a0 */ 0x0000, 0xebb1, 0xc7e2, 0x0000, 0xebb3, 0x0000, 0xbaa4, 0xd1f5,
+ /* a8 */ 0xb0b1, 0xebb2, 0xebb4, 0x0000, 0x0000, 0x0000, 0xb5aa, 0xc2c8,
+ /* b0 */ 0xc7e8, 0x0000, 0xebb5, 0x0000, 0xcbae, 0xe3df, 0x0000, 0x0000,
+ /* b8 */ 0xd3c0, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9db, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x026e9 ***/
+
+ /* 80 */ 0xcda1, 0xd6ad, 0xc7f3, 0x0000, 0x0000, 0x0000, 0xd9e0, 0xbbe3,
+ /* 88 */ 0x0000, 0xbaba, 0xe3e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcfab, 0x0000, 0x0000, 0x0000, 0xe3e0, 0xc9c7, 0x0000, 0xbab9,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd1b4, 0xe3e1, 0xc8ea, 0xb9af, 0xbdad,
+ /* a0 */ 0xb3d8, 0xcedb, 0x0000, 0x0000, 0xccc0, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe3e8, 0xe3e9, 0xcdf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xccad, 0x0000, 0xbcb3, 0x0000, 0xe3ea, 0x0000, 0xe3eb, 0x0000,
+ /* b8 */ 0x0000, 0xd0da, 0x0000, 0x0000, 0x0000, 0xc6fb, 0xb7da,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02728 ***/
+
+ /* 80 */ 0x0000, 0xc7df, 0xd2ca, 0xced6, 0x0000, 0xe3e4, 0xe3ec, 0x0000,
+ /* 88 */ 0xc9f2, 0xb3c1, 0x0000, 0x0000, 0xe3e7, 0x0000, 0x0000, 0xc6e3,
+ /* 90 */ 0xe3e5, 0x0000, 0x0000, 0xedb3, 0xe3e6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xc9b3, 0x0000, 0xc5e6, 0x0000, 0x0000, 0x0000, 0xb9b5,
+ /* a0 */ 0x0000, 0xc3bb, 0x0000, 0xe3e3, 0xc5bd, 0xc1a4, 0xc2d9, 0xb2d7,
+ /* a8 */ 0x0000, 0xe3ed, 0xbba6, 0xc4ad, 0x0000, 0xe3f0, 0xbeda, 0x0000,
+ /* b0 */ 0x0000, 0xe3fb, 0xe3f5, 0xbad3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb7d0, 0xd3cd, 0x0000, 0xd6ce, 0xd5d3, 0xb9c1, 0xd5b4, 0xd1d8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02768 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b9, 0xc7f6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc8aa, 0xb2b4, 0x0000, 0xc3da, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe3ee, 0x0000, 0x0000, 0xe3fc, 0xe3ef, 0xb7a8, 0xe3f7, 0xe3f4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xb7ba, 0x0000, 0x0000, 0xc5a2, 0x0000,
+ /* a0 */ 0xe3f6, 0xc5dd, 0xb2a8, 0xc6fc, 0x0000, 0xc4e0, 0x0000, 0x0000,
+ /* a8 */ 0xd7a2, 0x0000, 0xc0e1, 0xe3f9, 0x0000, 0x0000, 0xe3fa, 0xe3fd,
+ /* b0 */ 0xcca9, 0xe3f3, 0x0000, 0xd3be, 0x0000, 0xb1c3, 0xedb4, 0xe3f1,
+ /* b8 */ 0xe3f2, 0x0000, 0xe3f8, 0xd0ba, 0xc6c3, 0xd4f3, 0xe3fe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x027a7 ***/
+
+ /* 80 */ 0x0000, 0xbde0, 0x0000, 0x0000, 0xe4a7, 0x0000, 0x0000, 0xe4a6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd1f3, 0xe4a3, 0x0000, 0xe4a9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc8f7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfb4,
+ /* 98 */ 0x0000, 0xe4a8, 0xe4ae, 0xc2e5, 0x0000, 0x0000, 0xb6b4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdf2, 0x0000, 0xe4a2,
+ /* a8 */ 0x0000, 0x0000, 0xbae9, 0xe4aa, 0x0000, 0x0000, 0xe4ac, 0x0000,
+ /* b0 */ 0x0000, 0xb6fd, 0xd6de, 0xe4b2, 0x0000, 0xe4ad, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe4a1, 0x0000, 0xbbee, 0xcddd, 0xc7a2, 0xc5c9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x027e6 ***/
+
+ /* 80 */ 0x0000, 0xc1f7, 0x0000, 0xe4a4, 0x0000, 0xc7b3, 0xbdac, 0xbdbd,
+ /* 88 */ 0xe4a5, 0x0000, 0xd7c7, 0xb2e2, 0x0000, 0xe4ab, 0xbcc3, 0xe4af,
+ /* 90 */ 0x0000, 0xbbeb, 0xe4b0, 0xc5a8, 0xe4b1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd5e3, 0xbfa3, 0x0000, 0xe4ba, 0x0000, 0xe4b7, 0x0000,
+ /* a0 */ 0xe4bb, 0x0000, 0x0000, 0xe4bd, 0x0000, 0x0000, 0xc6d6, 0x0000,
+ /* a8 */ 0x0000, 0xbac6, 0xc0cb, 0x0000, 0x0000, 0x0000, 0xb8a1, 0xe4b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4a1, 0x0000, 0x0000, 0xbaa3,
+ /* b8 */ 0xbdfe, 0x0000, 0x0000, 0x0000, 0xe4bc, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02824 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xcdbf, 0x0000, 0x0000, 0xc4f9, 0x0000, 0x0000,
+ /* 88 */ 0xcffb, 0xc9e6, 0x0000, 0x0000, 0xd3bf, 0x0000, 0xcfd1, 0x0000,
+ /* 90 */ 0x0000, 0xe4b3, 0x0000, 0xe4b8, 0xe4b9, 0xcce9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xccce, 0x0000, 0xc0d4, 0xe4b5, 0xc1b0,
+ /* a0 */ 0xe4b6, 0xced0, 0x0000, 0xbbc1, 0xb5d3, 0x0000, 0xc8f3, 0xbda7,
+ /* a8 */ 0xd5c7, 0xc9ac, 0xb8a2, 0xe4ca, 0x0000, 0x0000, 0xe4cc, 0xd1c4,
+ /* b0 */ 0x0000, 0x0000, 0xd2ba, 0x0000, 0x0000, 0xbaad, 0x0000, 0x0000,
+ /* b8 */ 0xbad4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c3,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02864 ***/
+
+ /* 80 */ 0xb5ed, 0x0000, 0x0000, 0x0000, 0xd7cd, 0xe4c0, 0xcffd, 0xe4bf,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xc1dc, 0xccca, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcae7, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4d7, 0x0000,
+ /* 98 */ 0xccd4, 0xe4c8, 0x0000, 0x0000, 0x0000, 0xe4c7, 0xe4c1, 0x0000,
+ /* a0 */ 0xe4c4, 0xb5ad, 0x0000, 0x0000, 0xd3d9, 0x0000, 0xe4c6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd2f9, 0xb4e3, 0x0000, 0xbbb4, 0x0000,
+ /* b0 */ 0x0000, 0xc9ee, 0x0000, 0xb4be, 0x0000, 0x0000, 0x0000, 0xbbec,
+ /* b8 */ 0x0000, 0xd1cd, 0x0000, 0xcced, 0xedb5,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x028a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7e5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd4a8, 0x0000, 0xe4cb, 0xd7d5, 0xe4c2, 0x0000,
+ /* 90 */ 0xbda5, 0xe4c5, 0x0000, 0x0000, 0xd3e6, 0x0000, 0xe4c9, 0xc9f8,
+ /* 98 */ 0x0000, 0x0000, 0xe4be, 0x0000, 0x0000, 0xd3e5, 0x0000, 0x0000,
+ /* a0 */ 0xc7fe, 0xb6c9, 0x0000, 0xd4fc, 0xb2b3, 0xe4d7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcec2, 0x0000, 0xe4cd, 0x0000, 0xcebc, 0x0000, 0xb8db,
+ /* b0 */ 0x0000, 0x0000, 0xe4d6, 0x0000, 0xbfca, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd3ce, 0x0000, 0xc3ec, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x028de ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc5c8, 0xe4d8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc4, 0xe4cf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe4d4, 0xe4d5, 0x0000, 0xbafe, 0x0000,
+ /* 98 */ 0xcfe6, 0x0000, 0x0000, 0xd5bf, 0x0000, 0x0000, 0x0000, 0xe4d2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe4d0, 0x0000, 0x0000, 0xe4ce, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde5, 0xcaaa,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x0291e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc0a3, 0x0000, 0xbda6, 0xe4d3, 0x0000,
+ /* 88 */ 0x0000, 0xb8c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e7,
+ /* 90 */ 0xd4b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe4db, 0x0000, 0x0000, 0x0000, 0xc1ef, 0x0000, 0x0000, 0xe4e9,
+ /* a0 */ 0x0000, 0x0000, 0xd2e7, 0x0000, 0x0000, 0xe4df, 0x0000, 0xe4e0,
+ /* a8 */ 0x0000, 0x0000, 0xcfaa, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbdd,
+ /* b0 */ 0x0000, 0xe4da, 0xe4d1, 0x0000, 0xe4e5, 0x0000, 0xc8dc, 0xe4e3,
+ /* b8 */ 0x0000, 0x0000, 0xc4e7, 0xe4e2, 0x0000, 0xe4e1, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x0295d ***/
+
+ /* 80 */ 0x0000, 0xb3fc, 0xe4e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5e1,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7cc, 0x0000, 0x0000, 0x0000, 0xe4e6,
+ /* 90 */ 0x0000, 0xbbac, 0x0000, 0xd7d2, 0xcccf, 0xebf8, 0x0000, 0xe4e4,
+ /* 98 */ 0x0000, 0x0000, 0xb9f6, 0x0000, 0x0000, 0x0000, 0xd6cd, 0xe4d9,
+ /* a0 */ 0xe4dc, 0xc2fa, 0xe4de, 0x0000, 0xc2cb, 0xc0c4, 0xc2d0, 0x0000,
+ /* a8 */ 0xb1f5, 0xccb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ce, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe4ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x0299b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc6af, 0x0000, 0x0000, 0x0000, 0xc6e1, 0x0000,
+ /* 88 */ 0x0000, 0xe4f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2a9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xc0ec, 0xd1dd, 0xe4ee, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc4ae, 0x0000, 0x0000, 0x0000, 0xe4ed, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe4f6, 0xe4f4, 0xc2fe, 0x0000, 0xe4dd, 0x0000, 0xe4f0,
+ /* b0 */ 0x0000, 0xcafe, 0x0000, 0xd5c4, 0x0000, 0x0000, 0xe4f1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x029da ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4eb, 0xe4ec,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4f2, 0x0000, 0xceab, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc5cb, 0x0000, 0x0000, 0x0000, 0xc7b1, 0x0000, 0xc2ba, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe4ea, 0x0000, 0x0000, 0x0000, 0xc1ca, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccb6, 0xb3b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe4fb, 0x0000, 0xe4f3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe4fa, 0x0000, 0xe4fd, 0x0000, 0xe4fc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02a17 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3ce, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb3ba, 0xe4f7, 0x0000, 0x0000, 0xe4f9, 0xe4f8, 0xc5ec, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0bd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd4e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xb0c4, 0x0000, 0x0000, 0xe5a4, 0x0000,
+ /* b8 */ 0x0000, 0xe5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02a57 ***/
+
+ /* 80 */ 0xbca4, 0x0000, 0xe5a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe5a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe4fe, 0xb1f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a8, 0x0000,
+ /* a0 */ 0xe5a9, 0xe5a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a7, 0xe5aa,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e780xx - offset 0x02a87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc6d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5ab, 0xe5ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe5ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5af, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe5ae,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02ac1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9e0, 0x0000, 0x0000, 0xe5b0,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xbbf0, 0xece1, 0xc3f0, 0x0000, 0xb5c6,
+ /* b0 */ 0xbbd2, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1e9, 0xd4ee, 0x0000,
+ /* b8 */ 0xbec4, 0x0000, 0x0000, 0x0000, 0xd7c6, 0x0000, 0xd4d6, 0xb2d3,
+
+ /*** Three byte table, leaf: e782xx - offset 0x02b01 ***/
+
+ /* 80 */ 0xecbe, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc2af, 0xb4b6, 0x0000, 0x0000, 0x0000, 0xd1d7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb3b4, 0x0000, 0xc8b2, 0xbfbb, 0xecc0, 0x0000,
+ /* 98 */ 0x0000, 0xd6cb, 0x0000, 0x0000, 0xecbf, 0xecc1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xecc5, 0xbee6, 0xccbf, 0xc5da, 0xbebc,
+ /* b0 */ 0x0000, 0xecc6, 0x0000, 0xb1fe, 0x0000, 0x0000, 0x0000, 0xecc4,
+ /* b8 */ 0xd5a8, 0xb5e3, 0x0000, 0xecc2, 0xc1b6, 0xb3e3, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e783xx - offset 0x02b41 ***/
+
+ /* 80 */ 0xecc3, 0xcbb8, 0xc0c3, 0xccfe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc1d2, 0x0000, 0xecc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbae6, 0xc0d3, 0x0000, 0xd6f2, 0x0000, 0x0000, 0x0000, 0xd1cc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfbe, 0x0000, 0xb7b3, 0xc9d5,
+ /* a8 */ 0xecc7, 0xbbe2, 0x0000, 0xcccc, 0xbdfd, 0xc8c8, 0x0000, 0xcfa9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde9,
+ /* b8 */ 0x0000, 0xc5eb, 0x0000, 0x0000, 0x0000, 0xb7e9,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02b7f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd1c9, 0xbab8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xecc9, 0x0000, 0x0000, 0xecca, 0x0000, 0xbbc0, 0xeccb, 0x0000,
+ /* 98 */ 0xece2, 0xb1ba, 0xb7d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdb9, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeccc,
+ /* b0 */ 0xd1e6, 0xeccd, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8bb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02bba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xecd3, 0x0000, 0xbbcd, 0x0000, 0xbce5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeccf, 0x0000, 0xc9b7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3ba, 0x0000, 0xece3, 0xd5d5,
+ /* a8 */ 0xecd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6f3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xecd2, 0xecce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xecd4, 0x0000, 0xecd5, 0x0000, 0x0000, 0xc9bf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e786xx - offset 0x02bf8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd0dc, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1ac,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8db, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xecd6, 0xcef5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcaec,
+ /* a0 */ 0xecda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xecd9, 0x0000, 0x0000, 0x0000, 0xb0be, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecd7, 0x0000, 0xecd8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xece4, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x02c35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc8bc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecdc, 0xd1e0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xecdb, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4ef, 0x0000, 0xecdd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbc6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xecde,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e788xx - offset 0x02c6f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1ac, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecdf, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xece0, 0x0000, 0xd7a6, 0x0000, 0xc5c0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebbc, 0xb0ae, 0x0000, 0x0000, 0x0000, 0xbef4, 0xb8b8, 0xd2af,
+ /* b8 */ 0xb0d6, 0xb5f9, 0x0000, 0xd8b3, 0x0000, 0xcbac, 0x0000, 0xe3dd,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02caf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ac,
+ /* 88 */ 0xb0e6, 0x0000, 0x0000, 0x0000, 0xc5c6, 0xebb9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xebba, 0x0000, 0x0000, 0x0000, 0xebbb, 0x0000,
+ /* 98 */ 0x0000, 0xd1c0, 0x0000, 0xc5a3, 0x0000, 0xeaf2, 0x0000, 0xc4b2,
+ /* a0 */ 0x0000, 0xc4b5, 0xc0ce, 0x0000, 0x0000, 0x0000, 0xeaf3, 0xc4c1,
+ /* a8 */ 0x0000, 0xceef, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaf0, 0xeaf4,
+ /* b0 */ 0x0000, 0x0000, 0xc9fc, 0x0000, 0x0000, 0xc7a3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xccd8, 0xcefe, 0x0000, 0x0000, 0x0000, 0xeaf5, 0xeaf6,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02cef ***/
+
+ /* 80 */ 0xcfac, 0xc0e7, 0x0000, 0x0000, 0xeaf7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xb6bf, 0xeaf8, 0x0000, 0xeaf9, 0x0000, 0xeafa,
+ /* 90 */ 0x0000, 0x0000, 0xeafb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaf1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8ae, 0xe1eb, 0x0000, 0xb7b8,
+ /* b0 */ 0xe1ec, 0x0000, 0x0000, 0x0000, 0xe1ed, 0x0000, 0xd7b4, 0xe1ee,
+ /* b8 */ 0xe1ef, 0xd3cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02d2e ***/
+
+ /* 80 */ 0x0000, 0xe1f1, 0xbff1, 0xe1f0, 0xb5d2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb1b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f3, 0xe1f2, 0x0000,
+ /* 90 */ 0xbafc, 0x0000, 0xe1f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9b7,
+ /* 98 */ 0x0000, 0xbed1, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4fc, 0x0000,
+ /* a0 */ 0xbadd, 0xbdc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe1f5, 0xe1f7, 0x0000, 0x0000, 0xb6c0, 0xcfc1, 0xcaa8, 0xe1f6,
+ /* b0 */ 0xd5f8, 0xd3fc, 0xe1f8, 0xe1fc, 0xe1f9, 0x0000, 0x0000, 0xe1fa,
+ /* b8 */ 0xc0ea, 0x0000, 0xe1fe, 0xe2a1, 0xc0c7, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02d6d ***/
+
+ /* 80 */ 0x0000, 0xe1fb, 0x0000, 0xe1fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe2a5, 0x0000, 0x0000, 0x0000, 0xc1d4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe2a3, 0x0000, 0xe2a8, 0xb2fe, 0xe2a2,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xc3cd, 0xb2c2, 0xe2a7, 0xe2a6, 0x0000,
+ /* a0 */ 0x0000, 0xe2a4, 0xe2a9, 0x0000, 0x0000, 0xe2ab, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd0c9, 0xd6ed, 0xc3a8, 0xe2ac, 0x0000, 0xcfd7, 0x0000,
+ /* b0 */ 0x0000, 0xe2ae, 0x0000, 0x0000, 0xbaef, 0x0000, 0x0000, 0xe9e0,
+ /* b8 */ 0xe2ad, 0xe2aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xbbab, 0xd4b3,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x02dad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b0, 0x0000, 0x0000,
+ /* 90 */ 0xe2af, 0x0000, 0xe9e1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe2b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b3, 0xcca1, 0x0000, 0xe2b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x02dec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fe, 0x0000, 0x0000, 0xc2ca,
+ /* 88 */ 0x0000, 0xd3f1, 0x0000, 0xcdf5, 0x0000, 0x0000, 0xe7e0, 0x0000,
+ /* 90 */ 0x0000, 0xe7e1, 0x0000, 0x0000, 0x0000, 0x0000, 0xbec1, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xc2ea, 0x0000, 0x0000, 0x0000, 0xe7e4,
+ /* a0 */ 0x0000, 0x0000, 0xe7e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcde6, 0x0000, 0xc3b5, 0x0000, 0x0000, 0xe7e2, 0xbbb7,
+ /* b0 */ 0xcfd6, 0x0000, 0xc1e1, 0xe7e9, 0x0000, 0x0000, 0x0000, 0xe7e8,
+ /* b8 */ 0x0000, 0x0000, 0xe7f4, 0xb2a3, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x02e2c ***/
+
+ /* 80 */ 0xe7ea, 0x0000, 0xe7e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe7ec, 0xe7eb, 0xc9ba, 0x0000, 0x0000, 0xd5e4, 0x0000, 0xe7e5,
+ /* 90 */ 0xb7a9, 0xe7e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe7ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f3, 0x0000,
+ /* a0 */ 0xd6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ed, 0x0000, 0xe7f2,
+ /* a8 */ 0x0000, 0xe7f1, 0x0000, 0x0000, 0x0000, 0xb0e0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe7f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x02e69 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc7f2, 0x0000, 0xc0c5, 0xc0ed, 0x0000,
+ /* 88 */ 0x0000, 0xc1f0, 0xe7f0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f6,
+ /* 90 */ 0xcbf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe8a2, 0xe8a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd7c1, 0x0000, 0x0000, 0xe7fa, 0xe7f9, 0x0000,
+ /* a8 */ 0xe7fb, 0x0000, 0xe7f7, 0x0000, 0xe7fe, 0x0000, 0xe7fd, 0x0000,
+ /* b0 */ 0xe7fc, 0x0000, 0x0000, 0xc1d5, 0xc7d9, 0xc5fd, 0xc5c3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7ed, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e791xx - offset 0x02ea8 ***/
+
+ /* 80 */ 0x0000, 0xe8a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a6, 0x0000, 0xe8a5,
+ /* 98 */ 0x0000, 0xe8a7, 0xbaf7, 0xe7f8, 0xe8a4, 0x0000, 0xc8f0, 0xc9aa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a9, 0x0000, 0x0000,
+ /* b0 */ 0xb9e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1fe, 0xe8a8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8aa, 0x0000,
+
+ /*** Three byte table, leaf: e792xx - offset 0x02ee8 ***/
+
+ /* 80 */ 0xe8ad, 0xe8ae, 0x0000, 0xc1a7, 0x0000, 0x0000, 0x0000, 0xe8af,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8b0, 0x0000, 0x0000, 0xe8ac, 0x0000,
+ /* 90 */ 0xe8b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ab, 0x0000, 0xe8b1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b5,
+ /* a8 */ 0xe8b2, 0xe8b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe8b7,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e793xx - offset 0x02f23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe8b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9cf, 0x0000, 0xf0ac, 0x0000,
+ /* a0 */ 0xf0ad, 0x0000, 0xc6b0, 0xb0ea, 0xc8bf, 0x0000, 0xcddf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcecd, 0xeab1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeab2, 0x0000, 0xc6bf, 0xb4c9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeab3,
+
+ /*** Three byte table, leaf: e794xx - offset 0x02f63 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddf9, 0x0000, 0xeab4,
+ /* 90 */ 0x0000, 0xeab5, 0x0000, 0xeab6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb8ca, 0xdfb0, 0xc9f5, 0x0000, 0xccf0, 0x0000, 0x0000, 0xc9fa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9fb, 0x0000, 0x0000,
+ /* a8 */ 0xd3c3, 0xcba6, 0x0000, 0xb8a6, 0xf0ae, 0xb1c2, 0x0000, 0xe5b8,
+ /* b0 */ 0xccef, 0xd3c9, 0xbcd7, 0xc9ea, 0x0000, 0xb5e7, 0x0000, 0xc4d0,
+ /* b8 */ 0xb5e9, 0x0000, 0xeeae, 0xbbad, 0x0000, 0x0000, 0xe7de, 0x0000,
+
+ /*** Three byte table, leaf: e795xx - offset 0x02fa3 ***/
+
+ /* 80 */ 0xeeaf, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3a9, 0x0000, 0x0000,
+ /* 88 */ 0xeeb2, 0x0000, 0x0000, 0xeeb1, 0xbde7, 0x0000, 0xeeb0, 0xceb7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5cf, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xc1f4, 0xdbce, 0xeeb3, 0xd0f3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2d4, 0xc6e8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb7ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeeb4, 0x0000, 0xb3eb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbbfb, 0xeeb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7dc,
+
+ /*** Three byte table, leaf: e796xx - offset 0x02fe3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeeb6, 0x0000, 0x0000, 0xbdae, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf1e2, 0x0000, 0x0000, 0x0000, 0xcae8,
+ /* 90 */ 0x0000, 0xd2c9, 0xf0da, 0x0000, 0xf0db, 0x0000, 0xf0dc, 0xc1c6,
+ /* 98 */ 0x0000, 0xb8ed, 0xbece, 0x0000, 0x0000, 0xf0de, 0x0000, 0xc5b1,
+ /* a0 */ 0xf0dd, 0xd1f1, 0x0000, 0xf0e0, 0xb0cc, 0xbdea, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd2df, 0xf0df, 0x0000, 0xb4af, 0xb7e8,
+ /* b0 */ 0xf0e6, 0xf0e5, 0xc6a3, 0xf0e1, 0xf0e2, 0xb4c3, 0x0000, 0x0000,
+ /* b8 */ 0xf0e3, 0xd5ee, 0x0000, 0x0000, 0xccdb, 0xbed2, 0xbcb2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e797xx - offset 0x03022 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf0e8, 0xf0e7, 0xf0e4, 0xb2a1, 0x0000, 0xd6a2,
+ /* 88 */ 0xd3b8, 0xbeb7, 0xc8ac, 0x0000, 0x0000, 0xf0ea, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd1f7, 0x0000, 0xd6cc, 0xbadb, 0xf0e9, 0x0000,
+ /* 98 */ 0xb6bb, 0x0000, 0x0000, 0xcdb4, 0x0000, 0x0000, 0xc6a6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xc1a1, 0xf0eb, 0xf0ee, 0x0000, 0xf0ed, 0xf0f0,
+ /* a8 */ 0xf0ec, 0x0000, 0xbbbe, 0xf0ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xccb5, 0xf0f2, 0x0000, 0x0000, 0xb3d5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb1d4, 0x0000, 0x0000, 0xf0f3, 0x0000, 0x0000, 0xf0f4,
+
+ /*** Three byte table, leaf: e798xx - offset 0x03062 ***/
+
+ /* 80 */ 0xf0f6, 0xb4e1, 0x0000, 0xf0f1, 0x0000, 0xf0f7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf0fa, 0x0000, 0xf0f8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf0f5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fd, 0x0000, 0xf0f9,
+ /* 98 */ 0xf0fc, 0xf0fe, 0x0000, 0xf1a1, 0x0000, 0x0000, 0x0000, 0xcec1,
+ /* a0 */ 0xf1a4, 0x0000, 0xf1a3, 0x0000, 0xc1f6, 0xf0fb, 0xcadd, 0x0000,
+ /* a8 */ 0x0000, 0xb4f1, 0xb1f1, 0xccb1, 0x0000, 0xf1a6, 0x0000, 0x0000,
+ /* b0 */ 0xf1a7, 0x0000, 0x0000, 0xf1ac, 0xd5ce, 0xf1a9, 0x0000, 0x0000,
+ /* b8 */ 0xc8b3, 0x0000, 0x0000, 0x0000, 0xf1a2, 0x0000, 0xf1ab, 0xf1a8,
+
+ /*** Three byte table, leaf: e799xx - offset 0x030a2 ***/
+
+ /* 80 */ 0xf1a5, 0x0000, 0x0000, 0xf1aa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0a9, 0xf1ad, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1af, 0x0000, 0xf1b1, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1b0, 0x0000, 0xf1ae, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd1a2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1b2, 0x0000, 0x0000, 0x0000, 0xf1b3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb9ef, 0x0000, 0x0000, 0xb5c7, 0x0000, 0xb0d7, 0xb0d9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79axx - offset 0x030e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd4ed, 0x0000, 0xb5c4, 0x0000, 0xbdd4, 0xbbca,
+ /* 88 */ 0xf0a7, 0x0000, 0x0000, 0xb8de, 0x0000, 0x0000, 0xf0a8, 0x0000,
+ /* 90 */ 0x0000, 0xb0a8, 0x0000, 0xf0a9, 0x0000, 0x0000, 0xcdee, 0x0000,
+ /* 98 */ 0x0000, 0xf0aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ab, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a4, 0x0000,
+ /* b0 */ 0x0000, 0xd6e5, 0xf1e4, 0x0000, 0xf1e5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc3f3,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03121 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd3db, 0x0000, 0x0000, 0xd6d1, 0xc5e8, 0x0000,
+ /* 88 */ 0xd3af, 0x0000, 0xd2e6, 0x0000, 0x0000, 0xeec1, 0xb0bb, 0xd5b5,
+ /* 90 */ 0xd1ce, 0xbce0, 0xbad0, 0x0000, 0xbff8, 0x0000, 0xb8c7, 0xb5c1,
+ /* 98 */ 0xc5cc, 0x0000, 0x0000, 0xcaa2, 0x0000, 0x0000, 0x0000, 0xc3cb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeec2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4bf, 0xb6a2,
+ /* b0 */ 0x0000, 0xedec, 0xc3a4, 0x0000, 0xd6b1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcfe0, 0xedef, 0x0000, 0x0000, 0xc5ce, 0x0000, 0xb6dc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x03160 ***/
+
+ /* 80 */ 0x0000, 0xcaa1, 0x0000, 0x0000, 0xeded, 0x0000, 0x0000, 0xedf0,
+ /* 88 */ 0xedf1, 0xc3bc, 0x0000, 0xbfb4, 0x0000, 0xedee, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xedf4, 0xedf2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e6,
+ /* a0 */ 0xc3df, 0x0000, 0xedf3, 0x0000, 0x0000, 0x0000, 0xedf6, 0x0000,
+ /* a8 */ 0xd5a3, 0xd1a3, 0x0000, 0x0000, 0x0000, 0xedf5, 0x0000, 0xc3d0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedf7, 0xbff4, 0xbeec,
+ /* b8 */ 0xedf8, 0x0000, 0xccf7, 0x0000, 0xd1db, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x031a0 ***/
+
+ /* 80 */ 0xd7c5, 0xd5f6, 0x0000, 0xedfc, 0x0000, 0x0000, 0x0000, 0xedfb,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xedf9, 0xedfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xedfd, 0xbea6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcbaf, 0xeea1, 0xb6bd, 0x0000, 0xeea2, 0xc4c0, 0x0000,
+ /* a8 */ 0xedfe, 0x0000, 0x0000, 0xbdde, 0xb2c7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb6c3, 0x0000, 0x0000, 0x0000, 0xeea5, 0xd8ba, 0xeea3,
+
+ /*** Three byte table, leaf: e79exx - offset 0x031e0 ***/
+
+ /* 80 */ 0xeea6, 0x0000, 0x0000, 0x0000, 0xc3e9, 0xb3f2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeea7, 0xeea4, 0xcfb9, 0x0000,
+ /* 90 */ 0x0000, 0xeea8, 0xc2f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeea9,
+ /* a0 */ 0xeeaa, 0x0000, 0xdeab, 0x0000, 0x0000, 0xc6b3, 0x0000, 0xc7c6,
+ /* a8 */ 0x0000, 0xd6f5, 0xb5c9, 0x0000, 0xcbb2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xeeab, 0x0000, 0x0000, 0xcdab, 0x0000, 0xeeac, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd5b0, 0x0000, 0xeead, 0x0000, 0xf6c4,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03220 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbc7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4a3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xc3ac, 0xf1e6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcab8, 0xd2d3, 0x0000, 0xd6aa, 0x0000, 0xeff2,
+ /* a8 */ 0x0000, 0xbed8, 0x0000, 0xbdc3, 0xeff3, 0xb6cc, 0xb0ab, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xcaaf, 0x0000, 0x0000, 0xedb6, 0x0000,
+ /* b8 */ 0xedb7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcef9, 0xb7af, 0xbff3,
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x03260 ***/
+
+ /* 80 */ 0xedb8, 0xc2eb, 0xc9b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xedb9, 0x0000, 0x0000, 0xc6f6, 0xbfb3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xedbc, 0xc5f8, 0x0000, 0xd1d0, 0x0000, 0xd7a9, 0xedba,
+ /* 98 */ 0xedbb, 0x0000, 0xd1e2, 0x0000, 0xedbf, 0xedc0, 0x0000, 0xedc4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xedc8, 0x0000, 0xedc6, 0xedce, 0xd5e8,
+ /* a8 */ 0x0000, 0xedc9, 0x0000, 0x0000, 0xedc7, 0xedbe, 0x0000, 0x0000,
+ /* b0 */ 0xc5e9, 0x0000, 0x0000, 0x0000, 0xc6c6, 0x0000, 0x0000, 0xc9e9,
+ /* b8 */ 0xd4d2, 0xedc1, 0xedc2, 0xedc3, 0xedc5, 0x0000, 0xc0f9, 0x0000,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x032a0 ***/
+
+ /* 80 */ 0xb4a1, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9e8, 0x0000, 0xedd0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedd1, 0x0000, 0xedca, 0x0000,
+ /* 90 */ 0xedcf, 0x0000, 0xcef8, 0x0000, 0x0000, 0xcbb6, 0xedcc, 0xedcd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xedd2, 0xc1f2, 0xd3b2, 0xedcb, 0xc8b7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcef,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x032dd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd6,
+ /* 88 */ 0x0000, 0xb5ef, 0x0000, 0x0000, 0xc2b5, 0xb0ad, 0xcbe9, 0x0000,
+ /* 90 */ 0x0000, 0xb1ae, 0x0000, 0xedd4, 0x0000, 0x0000, 0x0000, 0xcdeb,
+ /* 98 */ 0xb5e2, 0x0000, 0xedd5, 0xedd3, 0xedd7, 0x0000, 0x0000, 0xb5fa,
+ /* a0 */ 0x0000, 0xedd8, 0x0000, 0xedd9, 0x0000, 0xeddc, 0x0000, 0xb1cc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc5f6, 0xbcee, 0xedda, 0xccbc, 0xb2ea, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeddb, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0331c ***/
+
+ /* 80 */ 0x0000, 0xb4c5, 0x0000, 0x0000, 0x0000, 0xb0f5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeddf, 0xc0da, 0xb4e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc5cd, 0x0000, 0x0000, 0x0000, 0xeddd, 0xbfc4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xedde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc4a5, 0x0000, 0x0000, 0x0000, 0xede0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xede1, 0x0000, 0xede3, 0x0000, 0x0000, 0xc1d7,
+ /* b8 */ 0x0000, 0x0000, 0xbbc7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x0335b ***/
+
+ /* 80 */ 0x0000, 0xbdb8, 0x0000, 0x0000, 0x0000, 0xede2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xede4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xede6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xede5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xede7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcabe, 0xecea, 0xc0f1, 0x0000, 0xc9e7, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x0339b ***/
+
+ /* 80 */ 0xeceb, 0xc6ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xecec, 0x0000,
+ /* 88 */ 0xc6ed, 0xeced, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xecf0, 0x0000, 0x0000, 0xd7e6, 0xecf3,
+ /* 98 */ 0x0000, 0x0000, 0xecf1, 0xecee, 0xecef, 0xd7a3, 0xc9f1, 0xcbee,
+ /* a0 */ 0xecf4, 0x0000, 0xecf2, 0x0000, 0x0000, 0xcfe9, 0x0000, 0xecf6,
+ /* a8 */ 0xc6b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcc0, 0x0000, 0xecf5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5bb,
+ /* b8 */ 0xbbf6, 0x0000, 0xecf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x033db ***/
+
+ /* 80 */ 0xd9f7, 0xbdfb, 0x0000, 0x0000, 0xc2bb, 0xecf8, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xecf9, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8a3,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xecfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecfb,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecfc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd3ed, 0xd8ae, 0xc0eb, 0x0000, 0xc7dd, 0xbacc, 0x0000,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x0341b ***/
+
+ /* 80 */ 0xd0e3, 0xcbbd, 0x0000, 0xcdba, 0x0000, 0x0000, 0xb8d1, 0x0000,
+ /* 88 */ 0x0000, 0xb1fc, 0x0000, 0xc7ef, 0x0000, 0xd6d6, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xbfc6, 0xc3eb, 0x0000, 0x0000, 0xeff5, 0x0000, 0x0000,
+ /* 98 */ 0xc3d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7e2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xeff7, 0xb3d3, 0x0000, 0xc7d8, 0xd1ed,
+ /* a8 */ 0x0000, 0xd6c8, 0x0000, 0xeff8, 0x0000, 0xeff6, 0x0000, 0xbbfd,
+ /* b0 */ 0xb3c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbdd5, 0x0000, 0x0000, 0xd2c6, 0x0000, 0xbbe0, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x0345b ***/
+
+ /* 80 */ 0xcfa1, 0x0000, 0xeffc, 0xeffb, 0x0000, 0x0000, 0xeff9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb3cc, 0x0000, 0xc9d4, 0xcbb0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeffe, 0x0000, 0x0000, 0xb0de,
+ /* 98 */ 0x0000, 0x0000, 0xd6c9, 0x0000, 0x0000, 0x0000, 0xeffd, 0x0000,
+ /* a0 */ 0xb3ed, 0x0000, 0x0000, 0xf6d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xcec8, 0x0000, 0x0000, 0x0000, 0xf0a2,
+ /* b8 */ 0x0000, 0xf0a1, 0x0000, 0xb5be, 0xbcda, 0xbbfc, 0x0000, 0xb8e5,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x0349b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4c2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf0a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbeb,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf0a6, 0x0000, 0x0000, 0x0000, 0xd1a8, 0x0000, 0xbebf, 0xc7ee,
+ /* b8 */ 0xf1b6, 0xf1b7, 0xbfd5, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4a9,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x034db ***/
+
+ /* 80 */ 0xf1b8, 0xcdbb, 0x0000, 0xc7d4, 0xd5ad, 0x0000, 0xf1b9, 0x0000,
+ /* 88 */ 0xf1ba, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7cf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd2a4, 0xd6cf, 0x0000, 0x0000, 0xf1bb, 0xbdd1, 0xb4b0,
+ /* 98 */ 0xbebd, 0x0000, 0x0000, 0x0000, 0xb4dc, 0xced1, 0x0000, 0xbfdf,
+ /* a0 */ 0xf1bd, 0x0000, 0x0000, 0x0000, 0x0000, 0xbffa, 0xf1bc, 0x0000,
+ /* a8 */ 0xf1bf, 0x0000, 0x0000, 0x0000, 0xf1be, 0xf1c0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf1c1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1fe,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x0351b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xc1a2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafa, 0x0000,
+ /* 98 */ 0x0000, 0xd5be, 0x0000, 0x0000, 0x0000, 0x0000, 0xbeba, 0xbeb9,
+ /* a0 */ 0xd5c2, 0x0000, 0x0000, 0xbfa2, 0x0000, 0xcdaf, 0xf1b5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbddf, 0x0000, 0xb6cb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd6f1, 0xf3c3, 0x0000, 0x0000, 0xf3c4, 0x0000, 0xb8cd,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x0355b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf3c6, 0xf3c7, 0x0000, 0xb0ca, 0x0000,
+ /* 88 */ 0xf3c5, 0x0000, 0xf3c9, 0xcbf1, 0x0000, 0x0000, 0x0000, 0xf3cb,
+ /* 90 */ 0x0000, 0xd0a6, 0x0000, 0x0000, 0xb1ca, 0xf3c8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf3cf, 0x0000, 0xb5d1, 0x0000, 0x0000, 0xf3d7, 0x0000,
+ /* a0 */ 0xf3d2, 0x0000, 0x0000, 0x0000, 0xf3d4, 0xf3d3, 0xb7fb, 0x0000,
+ /* a8 */ 0xb1bf, 0x0000, 0xf3ce, 0xf3ca, 0xb5da, 0x0000, 0xf3d0, 0x0000,
+ /* b0 */ 0x0000, 0xf3d1, 0x0000, 0xf3d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf3cd, 0x0000, 0xbce3, 0x0000, 0xc1fd, 0x0000, 0xf3d6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x0359a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3da, 0x0000, 0xf3cc,
+ /* 88 */ 0x0000, 0xb5c8, 0x0000, 0xbdee, 0xf3dc, 0x0000, 0x0000, 0xb7a4,
+ /* 90 */ 0xbff0, 0xd6fe, 0xcdb2, 0x0000, 0xb4f0, 0x0000, 0xb2df, 0x0000,
+ /* 98 */ 0xf3d8, 0x0000, 0xf3d9, 0xc9b8, 0x0000, 0xf3dd, 0x0000, 0x0000,
+ /* a0 */ 0xf3de, 0x0000, 0xf3e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3df, 0x0000,
+ /* b0 */ 0x0000, 0xf3e3, 0xf3e2, 0x0000, 0x0000, 0xf3db, 0x0000, 0xbfea,
+ /* b8 */ 0x0000, 0xb3ef, 0x0000, 0xf3e0, 0x0000, 0x0000, 0xc7a9, 0x0000,
+
+ /*** Three byte table, leaf: e7aexx - offset 0x035da ***/
+
+ /* 80 */ 0xbcf2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3eb, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9bf, 0x0000, 0x0000,
+ /* 90 */ 0xf3e4, 0x0000, 0x0000, 0x0000, 0xb2ad, 0xbbfe, 0x0000, 0xcbe3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3ed, 0xf3e9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xb9dc, 0xf3ee, 0x0000, 0x0000, 0x0000, 0xf3e5, 0xf3e6,
+ /* a8 */ 0xf3ea, 0xc2e1, 0xf3ec, 0xf3ef, 0xf3e8, 0xbcfd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcfe4, 0x0000, 0x0000, 0xf3f0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf3e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03619 ***/
+
+ /* 80 */ 0x0000, 0xf3f2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ad, 0xc6aa,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3f3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf3f1, 0x0000, 0xc2a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xb8dd, 0xf3f5, 0x0000, 0x0000, 0xf3f4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xb4db, 0x0000, 0x0000, 0x0000, 0xf3f6, 0xf3f7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf3f8, 0x0000, 0x0000, 0x0000, 0xc0ba, 0x0000,
+ /* b0 */ 0x0000, 0xc0e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f1,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fb, 0x0000, 0xf3fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x03658 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4d8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf3fe, 0xf3f9, 0x0000, 0x0000, 0xf3fc,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a3, 0xbbc9,
+ /* a8 */ 0x0000, 0x0000, 0xf4a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf4a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2be,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x03698 ***/
+
+ /* 80 */ 0xf4a6, 0xf4a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcae, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xc3d7, 0xd9e1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xc0e0, 0xf4cc, 0xd7d1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x036d6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xb7db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf4ce, 0xc1a3, 0x0000, 0x0000, 0xc6c9, 0x0000, 0xb4d6,
+ /* 98 */ 0xd5b3, 0x0000, 0x0000, 0x0000, 0xf4d0, 0xf4cf, 0xf4d1, 0xcbda,
+ /* a0 */ 0x0000, 0x0000, 0xf4d2, 0x0000, 0xd4c1, 0xd6e0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb7e0, 0x0000, 0x0000, 0x0000, 0xc1b8, 0x0000,
+ /* b0 */ 0x0000, 0xc1bb, 0xf4d3, 0xbeac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb4e2, 0x0000, 0x0000, 0xf4d4, 0xf4d5, 0xbeab,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03715 ***/
+
+ /* 80 */ 0x0000, 0xf4d6, 0x0000, 0x0000, 0x0000, 0xf4db, 0x0000, 0xf4d7,
+ /* 88 */ 0xf4da, 0x0000, 0xbafd, 0x0000, 0xf4d8, 0xf4d9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8e2, 0xccc7, 0xf4dc,
+ /* 98 */ 0x0000, 0xb2da, 0x0000, 0x0000, 0xc3d3, 0x0000, 0x0000, 0xd4e3,
+ /* a0 */ 0xbfb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf4dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf4e9, 0x0000, 0x0000, 0xcfb5,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03751 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcec9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcbd8, 0x0000, 0xcbf7, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdf4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd7cf, 0x0000, 0x0000, 0x0000, 0xc0db,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03781 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0f5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ea,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x037b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4eb, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ec,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x037e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf7e3, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03827 ***/
+
+ /* 80 */ 0x0000, 0xb7b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ed,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03865 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd7eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf4ee, 0x0000, 0x0000, 0x0000, 0xe6f9,
+ /* a0 */ 0xbec0, 0xe6fa, 0xbaec, 0xe6fb, 0xcfcb, 0xe6fc, 0xd4bc, 0xbcb6,
+ /* a8 */ 0xe6fd, 0xe6fe, 0xbccd, 0xc8d2, 0xceb3, 0xe7a1, 0x0000, 0xb4bf,
+ /* b0 */ 0xe7a2, 0xc9b4, 0xb8d9, 0xc4c9, 0x0000, 0xd7dd, 0xc2da, 0xb7d7,
+ /* b8 */ 0xd6bd, 0xcec6, 0xb7c4, 0x0000, 0x0000, 0xc5a6, 0xe7a3, 0xcfdf,
+
+ /*** Three byte table, leaf: e7bbxx - offset 0x038a5 ***/
+
+ /* 80 */ 0xe7a4, 0xe7a5, 0xe7a6, 0xc1b7, 0xd7e9, 0xc9f0, 0xcfb8, 0xd6af,
+ /* 88 */ 0xd6d5, 0xe7a7, 0xb0ed, 0xe7a8, 0xe7a9, 0xc9dc, 0xd2ef, 0xbead,
+ /* 90 */ 0xe7aa, 0xb0f3, 0xc8de, 0xbde1, 0xe7ab, 0xc8c6, 0x0000, 0xe7ac,
+ /* 98 */ 0xbbe6, 0xb8f8, 0xd1a4, 0xe7ad, 0xc2e7, 0xbef8, 0xbdca, 0xcdb3,
+ /* a0 */ 0xe7ae, 0xe7af, 0xbeee, 0xd0e5, 0x0000, 0xcbe7, 0xccd0, 0xbccc,
+ /* a8 */ 0xe7b0, 0xbca8, 0xd0f7, 0xe7b1, 0x0000, 0xd0f8, 0xe7b2, 0xe7b3,
+ /* b0 */ 0xb4c2, 0xe7b4, 0xe7b5, 0xc9fe, 0xceac, 0xc3e0, 0xe7b7, 0xb1c1,
+ /* b8 */ 0xb3f1, 0x0000, 0xe7b8, 0xe7b9, 0xd7db, 0xd5c0, 0xe7ba, 0xc2cc,
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x038e5 ***/
+
+ /* 80 */ 0xd7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xbcea, 0xc3e5, 0xc0c2, 0xe7be,
+ /* 88 */ 0xe7bf, 0xbca9, 0x0000, 0xe7c0, 0xe7c1, 0xe7b6, 0xb6d0, 0xe7c2,
+ /* 90 */ 0x0000, 0xe7c3, 0xe7c4, 0xbbba, 0xb5de, 0xc2c6, 0xb1e0, 0xe7c5,
+ /* 98 */ 0xd4b5, 0xe7c6, 0xb8bf, 0xe7c8, 0xe7c7, 0xb7ec, 0x0000, 0xe7c9,
+ /* a0 */ 0xb2f8, 0xe7ca, 0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, 0xe7d0,
+ /* a8 */ 0xd3a7, 0xcbf5, 0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xc9c9, 0xe7d5,
+ /* b0 */ 0xe7d6, 0xe7d7, 0xe7d8, 0xe7d9, 0xbdc9, 0xe7da, 0xf3be, 0x0000,
+ /* b8 */ 0xb8d7, 0x0000, 0xc8b1, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03923 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf3bf, 0x0000, 0xf3c0, 0xf3c1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb9de, 0xcdf8, 0x0000, 0x0000, 0xd8e8, 0xbab1, 0x0000, 0xc2de,
+ /* 98 */ 0xeeb7, 0x0000, 0xb7a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeb9,
+ /* a0 */ 0x0000, 0xeeb8, 0xb0d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeebb, 0xd5d6, 0xd7ef, 0x0000, 0x0000, 0x0000, 0xd6c3, 0x0000,
+ /* b0 */ 0x0000, 0xeebd, 0xcaf0, 0x0000, 0xeebc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeebe, 0x0000, 0x0000, 0x0000, 0x0000, 0xeec0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03962 ***/
+
+ /* 80 */ 0x0000, 0xeebf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd1f2, 0x0000, 0xc7bc, 0x0000, 0xc3c0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8e1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xc1e7, 0x0000, 0x0000, 0xf4c6, 0xd0df, 0xf4c7,
+ /* a0 */ 0x0000, 0xcfdb, 0x0000, 0x0000, 0xc8ba, 0x0000, 0x0000, 0xf4c8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c9,
+ /* b0 */ 0xf4ca, 0x0000, 0xf4cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd9fa, 0xb8fe, 0x0000, 0x0000, 0xe5f1, 0xd3f0, 0x0000, 0xf4e0,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x039a2 ***/
+
+ /* 80 */ 0x0000, 0xcecc, 0x0000, 0x0000, 0x0000, 0xb3e1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1b4, 0x0000, 0xd2ee, 0x0000, 0xf4e1, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfe8, 0xf4e2, 0x0000, 0x0000,
+ /* 98 */ 0xc7cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5d4,
+ /* a0 */ 0xb4e4, 0xf4e4, 0x0000, 0x0000, 0x0000, 0xf4e3, 0xf4e5, 0x0000,
+ /* a8 */ 0x0000, 0xf4e6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4e7, 0x0000,
+ /* b0 */ 0xbab2, 0xb0bf, 0x0000, 0xf4e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb7ad, 0xd2ed, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x039e2 ***/
+
+ /* 80 */ 0xd2ab, 0xc0cf, 0x0000, 0xbfbc, 0xeba3, 0xd5df, 0xeac8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf1f3, 0xb6f8, 0xcba3, 0x0000, 0x0000,
+ /* 90 */ 0xc4cd, 0x0000, 0xf1e7, 0x0000, 0xf1e8, 0xb8fb, 0xf1e9, 0xbac4,
+ /* 98 */ 0xd4c5, 0xb0d2, 0x0000, 0x0000, 0xf1ea, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf1eb, 0x0000, 0xf1ec, 0x0000, 0x0000, 0xf1ed, 0xf1ee, 0xf1ef,
+ /* a8 */ 0xf1f1, 0xf1f0, 0xc5d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf1f2, 0x0000, 0xb6fa, 0x0000, 0xf1f4, 0xd2ae, 0xdec7,
+ /* b8 */ 0xcbca, 0x0000, 0x0000, 0xb3dc, 0x0000, 0xb5a2, 0x0000, 0xb9a2,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03a22 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xc4f4, 0xf1f5, 0x0000, 0x0000, 0xf1f6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc1c4, 0xc1fb, 0xd6b0, 0xf1f7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf1f8, 0x0000, 0xc1aa, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc6b8, 0x0000, 0xbedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf1f9, 0xb4cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf1fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedb2,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03a62 ***/
+
+ /* 80 */ 0xedb1, 0x0000, 0x0000, 0xcbe0, 0xd2de, 0x0000, 0xcbc1, 0xd5d8,
+ /* 88 */ 0x0000, 0xc8e2, 0x0000, 0xc0df, 0xbca1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xebc1, 0x0000, 0x0000, 0xd0a4, 0x0000,
+ /* 98 */ 0xd6e2, 0x0000, 0xb6c7, 0xb8d8, 0xebc0, 0xb8ce, 0x0000, 0xebbf,
+ /* a0 */ 0xb3a6, 0xb9c9, 0xd6ab, 0x0000, 0xb7f4, 0xb7ca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xbce7, 0xb7be, 0xebc6, 0x0000, 0xebc7, 0xb0b9, 0xbfcf,
+ /* b0 */ 0x0000, 0xebc5, 0xd3fd, 0x0000, 0xebc8, 0x0000, 0x0000, 0xebc9,
+ /* b8 */ 0x0000, 0x0000, 0xb7ce, 0x0000, 0xebc2, 0xebc4, 0xc9f6, 0xd6d7,
+
+ /*** Three byte table, leaf: e883xx - offset 0x03aa2 ***/
+
+ /* 80 */ 0xd5cd, 0xd0b2, 0xebcf, 0xceb8, 0xebd0, 0x0000, 0xb5a8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1b3, 0xebd2, 0xcca5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5d6, 0xebd3,
+ /* 98 */ 0x0000, 0xebd1, 0xc5df, 0xebce, 0xcaa4, 0xebd5, 0xb0fb, 0x0000,
+ /* a0 */ 0x0000, 0xbafa, 0x0000, 0x0000, 0xd8b7, 0xf1e3, 0x0000, 0xebca,
+ /* a8 */ 0xebcb, 0xebcc, 0xebcd, 0xebd6, 0xe6c0, 0xebd9, 0x0000, 0xbfe8,
+ /* b0 */ 0xd2c8, 0xebd7, 0xebdc, 0xb8ec, 0xebd8, 0x0000, 0xbdba, 0x0000,
+ /* b8 */ 0xd0d8, 0x0000, 0xb0b7, 0x0000, 0xebdd, 0xc4dc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03ae0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd6ac, 0x0000, 0x0000, 0x0000, 0xb4e0, 0x0000,
+ /* 88 */ 0x0000, 0xc2f6, 0xbcb9, 0x0000, 0x0000, 0xebda, 0xebdb, 0xd4e0,
+ /* 90 */ 0xc6ea, 0xc4d4, 0xebdf, 0xc5a7, 0xd9f5, 0x0000, 0xb2b1, 0x0000,
+ /* 98 */ 0xebe4, 0x0000, 0xbdc5, 0x0000, 0x0000, 0x0000, 0xebe2, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebe3, 0x0000, 0x0000, 0xb8ac,
+ /* b0 */ 0x0000, 0xcdd1, 0xebe5, 0x0000, 0x0000, 0x0000, 0xebe1, 0x0000,
+ /* b8 */ 0xc1b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03b1f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccf3, 0x0000,
+ /* 88 */ 0xebe6, 0x0000, 0xc0b0, 0xd2b8, 0xebe7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb8af, 0xb8ad, 0x0000, 0xebe8, 0xc7bb, 0xcdf3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xebea, 0xebeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xebed, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c8, 0x0000, 0xebf2,
+ /* a8 */ 0x0000, 0xebee, 0x0000, 0x0000, 0x0000, 0xebf1, 0xc8f9, 0x0000,
+ /* b0 */ 0xd1fc, 0xebec, 0x0000, 0x0000, 0xebe9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb8b9, 0xcfd9, 0xc4e5, 0xebef, 0xebf0, 0xccda, 0xcdc8,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03b5f ***/
+
+ /* 80 */ 0xb0f2, 0x0000, 0xebf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xebf5, 0x0000, 0xb2b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8e0,
+ /* 90 */ 0x0000, 0xebf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb1ec, 0x0000, 0x0000, 0xccc5, 0xc4a4, 0xcfa5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xebf9, 0x0000, 0x0000, 0xeca2, 0x0000,
+ /* a8 */ 0xc5f2, 0x0000, 0xebfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xc9c5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe2df, 0xebfe, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03b9f ***/
+
+ /* 80 */ 0xcdce, 0xeca1, 0xb1db, 0xd3b7, 0x0000, 0x0000, 0xd2dc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xebfd, 0x0000, 0xebfb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xb3bc, 0x0000, 0x0000, 0x0000, 0xeab0,
+ /* a8 */ 0x0000, 0x0000, 0xd7d4, 0x0000, 0xf4ab, 0xb3f4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd6c1, 0xd6c2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd5e9, 0xbeca, 0x0000, 0xf4a7, 0x0000,
+
+ /*** Three byte table, leaf: e888xx - offset 0x03bdf ***/
+
+ /* 80 */ 0xd2a8, 0xf4a8, 0xf4a9, 0x0000, 0xf4aa, 0xbecb, 0xd3df, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc9e0, 0xc9e1, 0x0000, 0x0000,
+ /* 90 */ 0xf3c2, 0x0000, 0xcae6, 0x0000, 0xccf2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe2b6, 0xcbb4, 0x0000, 0xcee8, 0xd6db,
+ /* a0 */ 0x0000, 0xf4ad, 0xf4ae, 0xf4af, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf4b2, 0x0000, 0xbabd, 0xf4b3, 0xb0e3, 0xf4b0, 0x0000, 0xf4b1,
+ /* b0 */ 0xbda2, 0xb2d5, 0x0000, 0xf4b6, 0xf4b7, 0xb6e6, 0xb2b0, 0xcfcf,
+ /* b8 */ 0xf4b4, 0xb4ac, 0x0000, 0xf4b5, 0x0000, 0x0000, 0xf4b8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e889xx - offset 0x03c1e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4b9, 0x0000, 0x0000, 0xcda7,
+ /* 88 */ 0x0000, 0xf4ba, 0x0000, 0xf4bb, 0x0000, 0x0000, 0x0000, 0xf4bc,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcbd2, 0x0000, 0xf4bd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4be,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf4bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4de, 0xc1bc,
+ /* b0 */ 0xbce8, 0x0000, 0xc9ab, 0xd1de, 0xe5f5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdcb3, 0xd2d5, 0x0000, 0x0000, 0xdcb4, 0xb0ac, 0xdcb5,
+
+ /*** Three byte table, leaf: e88axx - offset 0x03c5e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xbdda, 0x0000, 0xdcb9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd8c2, 0x0000, 0xdcb7, 0xd3f3, 0x0000, 0xc9d6, 0xdcba, 0xdcb6,
+ /* 90 */ 0x0000, 0xdcbb, 0xc3a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcbc,
+ /* 98 */ 0xdcc5, 0xdcbd, 0x0000, 0x0000, 0xcedf, 0xd6a5, 0x0000, 0xdccf,
+ /* a0 */ 0x0000, 0xdccd, 0x0000, 0x0000, 0xdcd2, 0xbde6, 0xc2ab, 0x0000,
+ /* a8 */ 0xdcb8, 0xdccb, 0xdcce, 0xdcbe, 0xb7d2, 0xb0c5, 0xdcc7, 0xd0be,
+ /* b0 */ 0xdcc1, 0xbba8, 0x0000, 0xb7bc, 0xdccc, 0x0000, 0x0000, 0xdcc6,
+ /* b8 */ 0xdcbf, 0xc7db, 0x0000, 0x0000, 0x0000, 0xd1bf, 0xdcc0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03c9d ***/
+
+ /* 80 */ 0x0000, 0xdcca, 0x0000, 0x0000, 0xdcd0, 0x0000, 0x0000, 0xcead,
+ /* 88 */ 0xdcc2, 0x0000, 0xdcc3, 0xdcc8, 0xdcc9, 0xb2d4, 0xdcd1, 0xcbd5,
+ /* 90 */ 0x0000, 0xd4b7, 0xdcdb, 0xdcdf, 0xcca6, 0xdce6, 0x0000, 0xc3e7,
+ /* 98 */ 0xdcdc, 0x0000, 0x0000, 0xbfc1, 0xdcd9, 0x0000, 0xb0fa, 0xb9b6,
+ /* a0 */ 0xdce5, 0xdcd3, 0x0000, 0xdcc4, 0xdcd6, 0xc8f4, 0xbfe0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xc9bb, 0x0000, 0x0000, 0x0000, 0xb1bd,
+ /* b0 */ 0x0000, 0xd3a2, 0x0000, 0x0000, 0xdcda, 0x0000, 0x0000, 0xdcd5,
+ /* b8 */ 0x0000, 0xc6bb, 0x0000, 0xdcde, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03cdc ***/
+
+ /* 80 */ 0x0000, 0xd7c2, 0xc3af, 0xb7b6, 0xc7d1, 0xc3a9, 0xdce2, 0xdcd8,
+ /* 88 */ 0xdceb, 0xdcd4, 0x0000, 0x0000, 0xdcdd, 0x0000, 0xbea5, 0xdcd7,
+ /* 90 */ 0x0000, 0xdce0, 0x0000, 0x0000, 0xdce3, 0xdce4, 0x0000, 0xdcf8,
+ /* 98 */ 0x0000, 0x0000, 0xdce1, 0xdda2, 0xdce7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbceb,
+ /* a8 */ 0xb4c4, 0x0000, 0x0000, 0xc3a3, 0xb2e7, 0xdcfa, 0x0000, 0xdcf2,
+ /* b0 */ 0x0000, 0xdcef, 0x0000, 0xdcfc, 0xdcee, 0xd2f0, 0xb2e8, 0x0000,
+ /* b8 */ 0xc8d7, 0xc8e3, 0xdcfb, 0x0000, 0xdced, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x03d1c ***/
+
+ /* 80 */ 0xdcf7, 0x0000, 0x0000, 0xdcf5, 0x0000, 0x0000, 0xbea3, 0xdcf4,
+ /* 88 */ 0x0000, 0xb2dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcf3,
+ /* 90 */ 0xbcf6, 0xdce8, 0xbbc4, 0x0000, 0xc0f3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xbcd4, 0xdce9, 0xdcea, 0x0000, 0xdcf1, 0xdcf6,
+ /* a0 */ 0xdcf9, 0xb5b4, 0x0000, 0xc8d9, 0xbbe7, 0xdcfe, 0xdcfd, 0xd3ab,
+ /* a8 */ 0xdda1, 0xdda3, 0xdda5, 0xd2f1, 0xdda4, 0xdda6, 0xdda7, 0xd2a9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbac9,
+ /* b8 */ 0xdda9, 0x0000, 0x0000, 0xddb6, 0xddb1, 0xddb4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88exx - offset 0x03d5a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddb0, 0xc6ce, 0x0000,
+ /* 88 */ 0x0000, 0xc0f2, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9af, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdcec, 0xddae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xddb7, 0x0000, 0x0000, 0xdcf0, 0xddaf, 0x0000, 0xddb8, 0x0000,
+ /* a0 */ 0xddac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xddb9, 0xddb3, 0xddad, 0xc4aa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdda8, 0xc0b3, 0xc1ab, 0xddaa, 0xddab, 0x0000, 0xddb2, 0xbbf1,
+ /* b8 */ 0xddb5, 0xd3a8, 0xddba, 0x0000, 0xddbb, 0xc3a7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x03d9a ***/
+
+ /* 80 */ 0xddd2, 0xddbc, 0x0000, 0x0000, 0x0000, 0xddd1, 0x0000, 0xb9bd,
+ /* 88 */ 0x0000, 0x0000, 0xbed5, 0x0000, 0xbefa, 0x0000, 0x0000, 0xbaca,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddca, 0x0000, 0xddc5, 0x0000,
+ /* 98 */ 0xddbf, 0x0000, 0x0000, 0x0000, 0xb2cb, 0xddc3, 0x0000, 0xddcb,
+ /* a0 */ 0xb2a4, 0xddd5, 0x0000, 0x0000, 0x0000, 0xddbe, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc6d0, 0xddd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xddd4, 0xc1e2, 0xb7c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xddce, 0xddcf, 0x0000, 0x0000, 0x0000, 0xddc4, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x03dd9 ***/
+
+ /* 80 */ 0x0000, 0xddbd, 0x0000, 0xddcd, 0xccd1, 0x0000, 0xddc9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xddc2, 0xc3c8, 0xc6bc, 0xceae, 0xddcc,
+ /* 90 */ 0x0000, 0xddc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xddc1, 0x0000, 0x0000, 0x0000, 0xddc6, 0xc2dc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a9, 0xd3aa, 0xddd3, 0xcff4,
+ /* a8 */ 0xc8f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdde6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xddc7, 0x0000, 0x0000, 0x0000, 0xdde0, 0xc2e4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x03e17 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdde1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xddd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6f8,
+ /* 98 */ 0x0000, 0xddd9, 0xddd8, 0xb8f0, 0xddd6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xc6cf, 0x0000, 0xb6ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdde2, 0x0000, 0xbaf9, 0xd4e1, 0xdde7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb4d0, 0x0000, 0xddda, 0x0000, 0xbffb, 0xdde3, 0x0000,
+ /* b8 */ 0xdddf, 0x0000, 0xdddd, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x03e55 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdddb,
+ /* 88 */ 0xdddc, 0xddde, 0x0000, 0xbdaf, 0xdde4, 0x0000, 0xdde5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddf5,
+ /* 98 */ 0x0000, 0xc3c9, 0x0000, 0x0000, 0xcbe2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xddf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8e1,
+ /* b0 */ 0x0000, 0x0000, 0xc6d1, 0x0000, 0xddf4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd5f4, 0xddf3, 0xddf0, 0x0000, 0x0000, 0xddec, 0x0000, 0xddef,
+
+ /*** Three byte table, leaf: e893xx - offset 0x03e95 ***/
+
+ /* 80 */ 0x0000, 0xdde8, 0x0000, 0x0000, 0xd0ee, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xc8d8, 0xddee, 0x0000, 0x0000, 0xdde9, 0x0000, 0x0000,
+ /* 90 */ 0xddea, 0xcbf2, 0x0000, 0xdded, 0x0000, 0x0000, 0xb1cd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0b6, 0x0000, 0xbcbb,
+ /* a0 */ 0xddf1, 0x0000, 0x0000, 0xddf7, 0x0000, 0xddf6, 0xddeb, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5ee, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xddfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdea4, 0x0000, 0x0000, 0xdea3,
+
+ /*** Three byte table, leaf: e894xx - offset 0x03ed5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddf8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc3ef, 0x0000, 0xc2fb, 0x0000, 0x0000, 0x0000, 0xd5e1,
+ /* 98 */ 0x0000, 0x0000, 0xceb5, 0x0000, 0x0000, 0x0000, 0x0000, 0xddfd,
+ /* a0 */ 0x0000, 0xb2cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xc4e8, 0xcadf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7be,
+ /* b8 */ 0xddfa, 0xddfc, 0xddfe, 0xdea2, 0xb0aa, 0xb1ce,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e895xx - offset 0x03f13 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xdeac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdea6, 0xbdb6, 0xc8ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdea1, 0x0000,
+ /* 98 */ 0x0000, 0xdea5, 0x0000, 0x0000, 0x0000, 0x0000, 0xdea9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdea8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdea7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdead, 0x0000, 0xd4cc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdeb3, 0xdeaa, 0xdeae, 0x0000, 0x0000, 0xc0d9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e896xx - offset 0x03f52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1a1, 0xdeb6, 0x0000, 0xdeb1,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd1a6, 0xdeb5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdeaf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdeb0, 0x0000, 0xd0bd, 0x0000, 0x0000, 0x0000, 0xdeb4, 0xcaed,
+ /* b0 */ 0xdeb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb8,
+ /* b8 */ 0x0000, 0xdeb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x03f91 ***/
+
+ /* 80 */ 0x0000, 0xdebb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xbde5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2d8,
+ /* 90 */ 0xc3ea, 0x0000, 0x0000, 0xdeba, 0x0000, 0xc5ba, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdebc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccd9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb7aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd4e5, 0x0000, 0x0000, 0x0000, 0xdebd,
+
+ /*** Three byte table, leaf: e898xx - offset 0x03fd1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdebf, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc4a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdec1, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdebe,
+ /* a8 */ 0x0000, 0xdec0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd5ba, 0x0000, 0x0000, 0x0000, 0xdec2,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e899xx - offset 0x0400e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ae, 0xbba2, 0xc2b2,
+ /* 90 */ 0xc5b0, 0xc2c7, 0x0000, 0x0000, 0xf2af, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd0e9, 0x0000, 0x0000, 0x0000, 0xd3dd, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xebbd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xb3e6, 0xf2b0, 0x0000, 0xf2b1, 0x0000,
+ /* b0 */ 0x0000, 0xcaad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xbae7, 0xf2b3, 0xf2b5, 0xf2b4, 0xcbe4, 0xcfba, 0xf2b2,
+
+ /*** Three byte table, leaf: e89axx - offset 0x0404e ***/
+
+ /* 80 */ 0xcab4, 0xd2cf, 0xc2ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcec3, 0xf2b8, 0xb0f6, 0xf2b7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf2be, 0x0000, 0xb2cf, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd1c1, 0xf2ba, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf2bc, 0xd4e9, 0x0000, 0x0000, 0xf2bb,
+ /* a8 */ 0xf2b6, 0xf2bf, 0xf2bd, 0x0000, 0xf2b9, 0x0000, 0x0000, 0xf2c7,
+ /* b0 */ 0xf2c4, 0xf2c6, 0x0000, 0x0000, 0xf2ca, 0xf2c2, 0xf2c0, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf2c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x0408e ***/
+
+ /* 80 */ 0xd6fb, 0x0000, 0x0000, 0x0000, 0xf2c1, 0x0000, 0xc7f9, 0xc9df,
+ /* 88 */ 0x0000, 0xf2c8, 0xb9c6, 0xb5b0, 0x0000, 0x0000, 0xf2c3, 0xf2c9,
+ /* 90 */ 0xf2d0, 0xf2d6, 0x0000, 0x0000, 0xbbd7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf2d5, 0xcddc, 0x0000, 0xd6eb, 0x0000, 0x0000, 0xf2d2, 0xf2d4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8f2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf2cb, 0x0000, 0x0000, 0x0000, 0xf2ce, 0xc2f9, 0x0000,
+ /* b0 */ 0xd5dd, 0xf2cc, 0xf2cd, 0xf2cf, 0xf2d3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf2d9, 0xd3bc, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6ea, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x040ce ***/
+
+ /* 80 */ 0xcaf1, 0x0000, 0xb7e4, 0xf2d7, 0x0000, 0x0000, 0x0000, 0xf2d8,
+ /* 88 */ 0xf2da, 0xf2dd, 0xf2db, 0x0000, 0x0000, 0xf2dc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd1d1, 0xf2d1, 0x0000, 0xcdc9, 0x0000, 0xcecf,
+ /* 98 */ 0xd6a9, 0x0000, 0xf2e3, 0x0000, 0xc3db, 0x0000, 0xf2e0, 0x0000,
+ /* a0 */ 0x0000, 0xc0af, 0xf2ec, 0xf2de, 0x0000, 0xf2e1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf2e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2e2, 0x0000,
+ /* b0 */ 0x0000, 0xf2e7, 0x0000, 0x0000, 0xf2e6, 0x0000, 0x0000, 0xf2e9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf2df, 0x0000, 0x0000, 0xf2e4, 0xf2ea,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x0410e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3ac,
+ /* 88 */ 0xf2e5, 0xb2f5, 0x0000, 0x0000, 0xf2f2, 0x0000, 0xd0ab, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf2f5, 0x0000, 0x0000, 0x0000, 0xbbc8,
+ /* 98 */ 0x0000, 0xf2f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf2f0, 0x0000, 0x0000, 0xf2f6, 0xf2f8, 0xf2fa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f3, 0x0000,
+ /* b0 */ 0xf2f1, 0x0000, 0x0000, 0x0000, 0xbafb, 0x0000, 0xb5fb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf2ef, 0xf2f7, 0xf2ed, 0xf2ee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x0414d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf2eb, 0xf3a6, 0x0000, 0xf3a3, 0x0000, 0x0000,
+ /* 88 */ 0xf3a2, 0x0000, 0x0000, 0xf2f4, 0x0000, 0xc8da, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf2fb, 0x0000, 0x0000, 0x0000, 0xf3a5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc3f8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf2fd, 0x0000, 0x0000, 0xf3a7, 0xf3a9, 0xf3a4, 0x0000, 0xf2fc,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf3ab, 0x0000, 0xf3aa, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xc2dd, 0x0000, 0x0000, 0xf3ae, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x0418d ***/
+
+ /* 80 */ 0xf3b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3b1, 0xf3ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf3af, 0xf2fe, 0xf3ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf3b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf3b4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a8, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf3b3, 0x0000, 0x0000, 0x0000, 0xf3b5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd0b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3b8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x041cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd9f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf3b7, 0x0000, 0xc8e4, 0xf3b6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf3ba, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf3bb, 0xb4c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeec3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf3bc, 0x0000, 0x0000, 0xf3bd, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x0420c ***/
+
+ /* 80 */ 0xd1aa, 0x0000, 0x0000, 0x0000, 0xf4ac, 0xd0c6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0d0, 0xd1dc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfce, 0x0000, 0x0000, 0xbdd6,
+ /* 98 */ 0x0000, 0xd1c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xbae2, 0xe1e9, 0xd2c2, 0xf1c2, 0xb2b9, 0x0000, 0x0000,
+ /* a8 */ 0xb1ed, 0xf1c3, 0x0000, 0xc9c0, 0xb3c4, 0x0000, 0xd9f2, 0x0000,
+ /* b0 */ 0xcba5, 0x0000, 0xf1c4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6d4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c5, 0xf4c0, 0xf1c6,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x0424c ***/
+
+ /* 80 */ 0x0000, 0xd4ac, 0xf1c7, 0x0000, 0xb0c0, 0xf4c1, 0x0000, 0x0000,
+ /* 88 */ 0xf4c2, 0x0000, 0x0000, 0xb4fc, 0x0000, 0xc5db, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xccbb, 0x0000, 0x0000, 0x0000, 0xd0e4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcde0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf1c8, 0x0000, 0xd9f3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xb1bb, 0x0000, 0xcfae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb8a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ca,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1cb, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x0428b ***/
+
+ /* 80 */ 0x0000, 0xb2c3, 0xc1d1, 0x0000, 0x0000, 0xd7b0, 0xf1c9, 0x0000,
+ /* 88 */ 0x0000, 0xf1cc, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ce, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd9f6, 0x0000, 0xd2e1, 0xd4a3, 0x0000, 0x0000,
+ /* 98 */ 0xf4c3, 0xc8b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c4,
+ /* a0 */ 0x0000, 0x0000, 0xf1cd, 0xf1cf, 0xbfe3, 0xf1d0, 0x0000, 0x0000,
+ /* a8 */ 0xf1d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf1d6, 0xf1d1, 0x0000, 0xc9d1, 0xc5e1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc2e3, 0xb9fc, 0x0000, 0x0000, 0xf1d3, 0x0000, 0xf1d5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x042ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb9d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbad6, 0x0000, 0xb0fd, 0xf1d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf1d8, 0xf1d2, 0xf1da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf1d7, 0x0000, 0x0000, 0x0000, 0xc8ec, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcdca, 0xf1dd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe5bd, 0x0000, 0x0000, 0x0000, 0xf1dc, 0x0000, 0xf1de, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x04309 ***/
+
+ /* 80 */ 0x0000, 0xf1df, 0x0000, 0x0000, 0xcfe5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c5, 0xbdf3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf1e1, 0x0000, 0x0000, 0x0000, 0xcef7,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x04349 ***/
+
+ /* 80 */ 0x0000, 0xd2aa, 0x0000, 0xf1fb, 0x0000, 0x0000, 0xb8b2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x04388 ***/
+
+ /* 80 */ 0x0000, 0xbcfb, 0xb9db, 0x0000, 0xb9e6, 0xc3d9, 0xcad3, 0xeae8,
+ /* 88 */ 0xc0c0, 0xbef5, 0xeae9, 0xeaea, 0xeaeb, 0x0000, 0xeaec, 0xeaed,
+ /* 90 */ 0xeaee, 0xeaef, 0xbdc7, 0x0000, 0x0000, 0x0000, 0xf5fb, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf5fd, 0x0000, 0xf5fe, 0x0000, 0xf5fc, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xbde2, 0x0000, 0xf6a1, 0xb4a5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf6a2, 0x0000, 0x0000, 0x0000, 0xf6a3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecb2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x043c8 ***/
+
+ /* 80 */ 0xd1d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ea,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x04407 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeeba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd5b2,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04441 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd3fe, 0xccdc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcac4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8acxx - offset 0x0447a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5c0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a5,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x044a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbeaf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a9,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aexx - offset 0x044ce ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdaa5, 0xbcc6, 0xb6a9, 0xb8bc, 0xc8cf, 0xbca5, 0xdaa6, 0xdaa7,
+ /* a8 */ 0xccd6, 0xc8c3, 0xdaa8, 0xc6fd, 0x0000, 0xd1b5, 0xd2e9, 0xd1b6,
+ /* b0 */ 0xbcc7, 0x0000, 0xbdb2, 0xbbe4, 0xdaa9, 0xdaaa, 0xd1c8, 0xdaab,
+ /* b8 */ 0xd0ed, 0xb6ef, 0xc2db, 0x0000, 0xcbcf, 0xb7ed, 0xc9e8, 0xb7c3,
+
+ /*** Three byte table, leaf: e8afxx - offset 0x0450e ***/
+
+ /* 80 */ 0xbef7, 0xd6a4, 0xdaac, 0xdaad, 0xc6c0, 0xd7e7, 0xcab6, 0x0000,
+ /* 88 */ 0xd5a9, 0xcbdf, 0xd5ef, 0xdaae, 0xd6df, 0xb4ca, 0xdab0, 0xdaaf,
+ /* 90 */ 0x0000, 0xd2eb, 0xdab1, 0xdab2, 0xdab3, 0xcad4, 0xdab4, 0xcaab,
+ /* 98 */ 0xdab5, 0xdab6, 0xb3cf, 0xd6ef, 0xdab7, 0xbbb0, 0xb5ae, 0xdab8,
+ /* a0 */ 0xdab9, 0xb9ee, 0xd1af, 0xd2e8, 0xdaba, 0xb8c3, 0xcfea, 0xb2ef,
+ /* a8 */ 0xdabb, 0xdabc, 0x0000, 0xbdeb, 0xcedc, 0xd3ef, 0xdabd, 0xcef3,
+ /* b0 */ 0xdabe, 0xd3d5, 0xbbe5, 0xdabf, 0xcbb5, 0xcbd0, 0xdac0, 0xc7eb,
+ /* b8 */ 0xd6ee, 0xdac1, 0xc5b5, 0xb6c1, 0xdac2, 0xb7cc, 0xbfce, 0xdac3,
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x0454e ***/
+
+ /* 80 */ 0xdac4, 0xcbad, 0xdac5, 0xb5f7, 0xdac6, 0xc1c2, 0xd7bb, 0xdac7,
+ /* 88 */ 0xccb8, 0x0000, 0xd2ea, 0xc4b1, 0xdac8, 0xb5fd, 0xbbd1, 0xdac9,
+ /* 90 */ 0xd0b3, 0xdaca, 0xdacb, 0xcebd, 0xdacc, 0xdacd, 0xdace, 0xb2f7,
+ /* 98 */ 0xdad1, 0xdacf, 0xd1e8, 0xdad0, 0xc3d5, 0xdad2, 0x0000, 0xdad3,
+ /* a0 */ 0xdad4, 0xdad5, 0xd0bb, 0xd2a5, 0xb0f9, 0xdad6, 0xc7ab, 0xdad7,
+ /* a8 */ 0xbdf7, 0xc3a1, 0xdad8, 0xdad9, 0xc3fd, 0xccb7, 0xdada, 0xdadb,
+ /* b0 */ 0xc0be, 0xc6d7, 0xdadc, 0xdadd, 0xc7b4, 0xdade, 0xdadf, 0xb9c8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x0458d ***/
+
+ /* 80 */ 0x0000, 0xbbed, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6b9, 0xf4f8,
+ /* 88 */ 0x0000, 0xf4f9, 0x0000, 0x0000, 0xcde3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b9, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xebe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcff3, 0xbbbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xbac0, 0xd4a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe1d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5f4, 0xb1aa, 0xb2f2, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x045cb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf5f5, 0x0000, 0x0000, 0xf5f7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xbad1, 0xf5f6, 0x0000, 0xc3b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf5f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x045ee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1b4, 0xd5ea, 0xb8ba,
+ /* a0 */ 0x0000, 0xb9b1, 0xb2c6, 0xd4f0, 0xcfcd, 0xb0dc, 0xd5cb, 0xbbf5,
+ /* a8 */ 0xd6ca, 0xb7b7, 0xccb0, 0xc6b6, 0xb1e1, 0xb9ba, 0xd6fc, 0xb9e1,
+ /* b0 */ 0xb7a1, 0xbcfa, 0xeada, 0xeadb, 0xccf9, 0xb9f3, 0xeadc, 0xb4fb,
+ /* b8 */ 0xc3b3, 0xb7d1, 0xbad8, 0xeadd, 0xd4f4, 0xeade, 0xbcd6, 0xbbdf,
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x0462e ***/
+
+ /* 80 */ 0xeadf, 0xc1de, 0xc2b8, 0xd4df, 0xd7ca, 0xeae0, 0xeae1, 0xeae4,
+ /* 88 */ 0xeae2, 0xeae3, 0xc9de, 0xb8b3, 0xb6c4, 0xeae5, 0xcaea, 0xc9cd,
+ /* 90 */ 0xb4cd, 0x0000, 0x0000, 0xe2d9, 0xc5e2, 0xeae6, 0xc0b5, 0x0000,
+ /* 98 */ 0xd7b8, 0xeae7, 0xd7ac, 0xc8fc, 0xd8d3, 0xd8cd, 0xd4de, 0x0000,
+ /* a0 */ 0xd4f9, 0xc9c4, 0xd3ae, 0xb8d3, 0xb3e0, 0x0000, 0xc9e2, 0xf4f6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xbad5, 0x0000, 0xf4f7, 0x0000, 0x0000,
+ /* b0 */ 0xd7df, 0x0000, 0x0000, 0xf4f1, 0xb8b0, 0xd5d4, 0xb8cf, 0xc6f0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x0466d ***/
+
+ /* 80 */ 0x0000, 0xb3c3, 0x0000, 0x0000, 0xf4f2, 0xb3ac, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd4bd, 0xc7f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf4f4, 0x0000, 0x0000, 0xf4f3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcccb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xc8a4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf4f5, 0x0000, 0xd7e3, 0xc5bf, 0xf5c0, 0x0000, 0x0000,
+ /* b8 */ 0xf5bb, 0x0000, 0xf5c3, 0x0000, 0xf5c2, 0x0000, 0xd6ba, 0xf5c1,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x046ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd4be, 0xf5c4, 0x0000, 0xf5cc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb0cf, 0xb5f8, 0x0000, 0xf5c9, 0xf5ca,
+ /* 90 */ 0x0000, 0xc5dc, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c5, 0xf5c6,
+ /* 98 */ 0x0000, 0x0000, 0xf5c7, 0xf5cb, 0x0000, 0xbee0, 0xf5c8, 0xb8fa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf5d0, 0xf5d3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbfe7, 0x0000, 0xb9f2, 0xf5bc, 0xf5cd, 0x0000, 0x0000, 0xc2b7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xccf8, 0x0000, 0xbcf9, 0x0000, 0xf5ce,
+ /* b8 */ 0xf5cf, 0xf5d1, 0xb6e5, 0xf5d2, 0x0000, 0xf5d5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x046eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5bd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf5d4, 0xd3bb, 0x0000, 0xb3ec, 0x0000, 0x0000, 0xcca4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d7, 0xbee1, 0xf5d8,
+ /* a0 */ 0x0000, 0x0000, 0xccdf, 0xf5db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb2c8, 0xd7d9, 0x0000, 0xf5d9, 0x0000, 0xf5da, 0xf5dc,
+ /* b0 */ 0x0000, 0xf5e2, 0x0000, 0x0000, 0x0000, 0xf5e0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf5df, 0xf5dd, 0x0000, 0x0000, 0xf5e1, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x0472b ***/
+
+ /* 80 */ 0xf5de, 0xf5e4, 0xf5e5, 0x0000, 0xcce3, 0x0000, 0x0000, 0xe5bf,
+ /* 88 */ 0xb5b8, 0xf5e3, 0xf5e8, 0xcca3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5e6, 0xf5e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf5be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1c4, 0x0000,
+ /* a8 */ 0x0000, 0xf5bf, 0x0000, 0x0000, 0xb5c5, 0xb2e4, 0x0000, 0xf5ec,
+ /* b0 */ 0xf5e9, 0x0000, 0xb6d7, 0x0000, 0xf5ed, 0x0000, 0xf5ea, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5eb, 0x0000, 0x0000, 0xb4da,
+
+ /*** Three byte table, leaf: e8baxx - offset 0x0476b ***/
+
+ /* 80 */ 0x0000, 0xd4ea, 0x0000, 0x0000, 0x0000, 0xf5ee, 0x0000, 0xb3f9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ef,
+ /* 90 */ 0xf5f1, 0x0000, 0x0000, 0x0000, 0xf5f0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f2, 0x0000, 0xf5f3, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xc9ed, 0xb9aa, 0x0000, 0x0000, 0xc7fb,
+ /* b0 */ 0x0000, 0x0000, 0xb6e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xccc9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x047a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaa6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000,
+ /* 38 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x047c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3b5, 0xd4fe,
+ /* a8 */ 0xb9ec, 0xd0f9, 0x0000, 0xe9ed, 0xd7aa, 0xe9ee, 0xc2d6, 0xc8ed,
+ /* b0 */ 0xbae4, 0xe9ef, 0xe9f0, 0xe9f1, 0xd6e1, 0xe9f2, 0xe9f3, 0xe9f5,
+ /* b8 */ 0xe9f4, 0xe9f6, 0xe9f7, 0xc7e1, 0xe9f8, 0xd4d8, 0xe9f9, 0xbdce,
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04800 ***/
+
+ /* 80 */ 0x0000, 0xe9fa, 0xe9fb, 0xbdcf, 0xe9fc, 0xb8a8, 0xc1be, 0xe9fd,
+ /* 88 */ 0xb1b2, 0xbbd4, 0xb9f5, 0xe9fe, 0x0000, 0xeaa1, 0xeaa2, 0xeaa3,
+ /* 90 */ 0xb7f8, 0xbcad, 0x0000, 0xcae4, 0xe0ce, 0xd4af, 0xcfbd, 0xd5b7,
+ /* 98 */ 0xeaa4, 0xd5de, 0xeaa5, 0xd0c1, 0xb9bc, 0x0000, 0xb4c7, 0xb1d9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xc0b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb1e6, 0xb1e7, 0x0000, 0xb1e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb3bd, 0xc8e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5c1, 0x0000,
+ /* b8 */ 0x0000, 0xb1df, 0x0000, 0x0000, 0x0000, 0xc1c9, 0xb4ef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x0483f ***/
+
+ /* 80 */ 0x0000, 0xc7a8, 0xd3d8, 0x0000, 0xc6f9, 0xd1b8, 0x0000, 0xb9fd,
+ /* 88 */ 0xc2f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3ad, 0x0000,
+ /* 90 */ 0xd4cb, 0xbdfc, 0x0000, 0xe5c2, 0xb7b5, 0xe5c3, 0x0000, 0x0000,
+ /* 98 */ 0xbbb9, 0xd5e2, 0x0000, 0xbdf8, 0xd4b6, 0xcea5, 0xc1ac, 0xb3d9,
+ /* a0 */ 0x0000, 0x0000, 0xccf6, 0x0000, 0xe5c6, 0xe5c4, 0xe5c8, 0x0000,
+ /* a8 */ 0xe5ca, 0xe5c7, 0xb5cf, 0xc6c8, 0x0000, 0xb5fc, 0xe5c5, 0x0000,
+ /* b0 */ 0xcaf6, 0x0000, 0x0000, 0xe5c9, 0x0000, 0x0000, 0x0000, 0xc3d4,
+ /* b8 */ 0xb1c5, 0xbca3, 0x0000, 0x0000, 0x0000, 0xd7b7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x0487f ***/
+
+ /* 80 */ 0xcdcb, 0xcbcd, 0xcaca, 0xccd3, 0xe5cc, 0xe5cb, 0xc4e6, 0x0000,
+ /* 88 */ 0x0000, 0xd1a1, 0xd1b7, 0xe5cd, 0x0000, 0xe5d0, 0x0000, 0xcdb8,
+ /* 90 */ 0xd6f0, 0xe5cf, 0xb5dd, 0x0000, 0xcdbe, 0x0000, 0xe5d1, 0xb6ba,
+ /* 98 */ 0x0000, 0x0000, 0xcda8, 0xb9e4, 0x0000, 0xcac5, 0xb3d1, 0xcbd9,
+ /* a0 */ 0xd4ec, 0xe5d2, 0xb7ea, 0x0000, 0x0000, 0x0000, 0xe5ce, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d5, 0xb4fe, 0xe5d6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d3, 0xe5d4, 0x0000,
+ /* b8 */ 0xd2dd, 0x0000, 0x0000, 0xc2df, 0xb1c6, 0x0000, 0xd3e2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x048be ***/
+
+ /* 80 */ 0x0000, 0xb6dd, 0xcbec, 0x0000, 0xe5d7, 0x0000, 0x0000, 0xd3f6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1e9, 0x0000, 0xb6f4,
+ /* 90 */ 0xe5da, 0xe5d8, 0xe5d9, 0xb5c0, 0x0000, 0x0000, 0x0000, 0xd2c5,
+ /* 98 */ 0xe5dc, 0x0000, 0x0000, 0xe5de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe5dd, 0xc7b2, 0x0000, 0xd2a3, 0x0000, 0x0000,
+ /* a8 */ 0xe5db, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e2, 0xd5da, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e0, 0xd7f1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e1, 0x0000, 0xb1dc,
+
+ /*** Three byte table, leaf: e982xx - offset 0x048fe ***/
+
+ /* 80 */ 0xd1fb, 0x0000, 0xe5e2, 0xe5e4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe5e3, 0x0000, 0x0000, 0xe5e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd2d8, 0x0000, 0xb5cb, 0x0000, 0xe7df, 0x0000, 0xdaf5,
+ /* 98 */ 0x0000, 0xdaf8, 0x0000, 0xdaf6, 0x0000, 0xdaf7, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdafa, 0xd0cf, 0xc4c7, 0x0000, 0x0000, 0xb0ee, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd0b0, 0x0000, 0xdaf9, 0x0000, 0xd3ca, 0xbaaa,
+ /* b0 */ 0xdba2, 0xc7f1, 0x0000, 0xdafc, 0xdafb, 0xc9db, 0xdafd, 0x0000,
+ /* b8 */ 0xdba1, 0xd7de, 0xdafe, 0xc1da, 0x0000, 0x0000, 0xdba5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x0493d ***/
+
+ /* 80 */ 0x0000, 0xd3f4, 0x0000, 0x0000, 0xdba7, 0xdba4, 0x0000, 0xdba8,
+ /* 88 */ 0x0000, 0x0000, 0xbdbc, 0x0000, 0x0000, 0x0000, 0xc0c9, 0xdba3,
+ /* 90 */ 0xdba6, 0xd6a3, 0x0000, 0xdba9, 0x0000, 0x0000, 0x0000, 0xdbad,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdbae, 0xdbac, 0xbac2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xbfa4, 0xdbab, 0x0000, 0x0000, 0x0000, 0xdbaa, 0xd4c7,
+ /* a8 */ 0xb2bf, 0x0000, 0x0000, 0xdbaf, 0x0000, 0xb9f9, 0x0000, 0xdbb0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3bb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb5a6, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6bc, 0xdbb1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e984xx - offset 0x0497c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xb6f5, 0x0000, 0xdbb2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xb1c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbb4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdbb3, 0xdbb5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbb7,
+ /* b0 */ 0x0000, 0xdbb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdbb8, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x049b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xdbb9, 0x0000, 0x0000, 0xdbba, 0x0000,
+ /* 88 */ 0x0000, 0xd3cf, 0xf4fa, 0xc7f5, 0xd7c3, 0xc5e4, 0xf4fc, 0xf4fd,
+ /* 90 */ 0xf4fb, 0x0000, 0xbec6, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0ef,
+ /* 98 */ 0x0000, 0x0000, 0xb7d3, 0x0000, 0x0000, 0xd4cd, 0xccaa, 0x0000,
+ /* a0 */ 0x0000, 0xf5a2, 0xf5a1, 0xbaa8, 0xf4fe, 0xcbd6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf5a4, 0xc0d2, 0x0000, 0xb3ea, 0x0000, 0xcdaa, 0xf5a5,
+ /* b0 */ 0xf5a3, 0xbdb4, 0xf5a8, 0x0000, 0xf5a9, 0xbdcd, 0xc3b8, 0xbfe1,
+ /* b8 */ 0xcbe1, 0xf5aa, 0x0000, 0x0000, 0x0000, 0xf5a6, 0xf5a7, 0xc4f0,
+
+ /*** Three byte table, leaf: e986xx - offset 0x049f9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ac, 0x0000, 0xb4bc,
+ /* 88 */ 0x0000, 0xd7ed, 0x0000, 0xb4d7, 0xf5ab, 0xf5ae, 0x0000, 0x0000,
+ /* 90 */ 0xf5ad, 0xf5af, 0xd0d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xc3d1, 0xc8a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf5b0, 0xf5b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf5b2, 0x0000, 0x0000, 0xf5b3, 0xf5b4, 0xf5b5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b7, 0xf5b6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf5b8,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e987xx - offset 0x04a34 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2c9,
+ /* 88 */ 0x0000, 0xd3d4, 0xcacd, 0x0000, 0xc0ef, 0xd6d8, 0xd2b0, 0xc1bf,
+ /* 90 */ 0x0000, 0xbdf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8aa,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e989xx - offset 0x04a51 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcf8,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98axx - offset 0x04a86 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04abe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf6c8,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04ac7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04b06 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf6ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x04b37 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6cc,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04b6d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf6cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e9,
+ /* 41 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04b84 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6cd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x04bc3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf6ce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e992xx - offset 0x04bfe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeec4, 0xeec5, 0xeec6,
+ /* 88 */ 0xd5eb, 0xb6a4, 0xeec8, 0xeec7, 0xeec9, 0xeeca, 0xc7a5, 0xeecb,
+ /* 90 */ 0xeecc, 0x0000, 0xb7b0, 0xb5f6, 0xeecd, 0xeecf, 0x0000, 0xeece,
+ /* 98 */ 0x0000, 0xb8c6, 0xeed0, 0xeed1, 0xeed2, 0xb6db, 0xb3ae, 0xd6d3,
+ /* a0 */ 0xc4c6, 0xb1b5, 0xb8d6, 0xeed3, 0xeed4, 0xd4bf, 0xc7d5, 0xbefb,
+ /* a8 */ 0xced9, 0xb9b3, 0xeed6, 0xeed5, 0xeed8, 0xeed7, 0xc5a5, 0xeed9,
+ /* b0 */ 0xeeda, 0xc7ae, 0xeedb, 0xc7af, 0xeedc, 0xb2a7, 0xeedd, 0xeede,
+ /* b8 */ 0xeedf, 0xeee0, 0xeee1, 0xd7ea, 0xeee2, 0xeee3, 0xbcd8, 0xeee4,
+
+ /*** Three byte table, leaf: e993xx - offset 0x04c3e ***/
+
+ /* 80 */ 0xd3cb, 0xccfa, 0xb2ac, 0xc1e5, 0xeee5, 0xc7a6, 0xc3ad, 0x0000,
+ /* 88 */ 0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0x0000,
+ /* 90 */ 0xeeed, 0xeeee, 0xeeef, 0x0000, 0x0000, 0xeef0, 0xeef1, 0xeef2,
+ /* 98 */ 0xeef4, 0xeef3, 0x0000, 0xeef5, 0xcdad, 0xc2c1, 0xeef6, 0xeef7,
+ /* a0 */ 0xeef8, 0xd5a1, 0xeef9, 0xcfb3, 0xeefa, 0xeefb, 0x0000, 0xeefc,
+ /* a8 */ 0xeefd, 0xefa1, 0xeefe, 0xefa2, 0xb8f5, 0xc3fa, 0xefa3, 0xefa4,
+ /* b0 */ 0xbdc2, 0xd2bf, 0xb2f9, 0xefa5, 0xefa6, 0xefa7, 0xd2f8, 0xefa8,
+ /* b8 */ 0xd6fd, 0xefa9, 0xc6cc, 0x0000, 0xefaa, 0xefab, 0xc1b4, 0xefac,
+
+ /*** Three byte table, leaf: e994xx - offset 0x04c7e ***/
+
+ /* 80 */ 0xcffa, 0xcbf8, 0xefae, 0xefad, 0xb3fa, 0xb9f8, 0xefaf, 0xefb0,
+ /* 88 */ 0xd0e2, 0xefb1, 0xefb2, 0xb7e6, 0xd0bf, 0xefb3, 0xefb4, 0xefb5,
+ /* 90 */ 0xc8f1, 0xcce0, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xd5e0,
+ /* 98 */ 0xefbb, 0xb4ed, 0xc3aa, 0xefbc, 0x0000, 0xefbd, 0xefbe, 0xefbf,
+ /* a0 */ 0x0000, 0xcefd, 0xefc0, 0xc2e0, 0xb4b8, 0xd7b6, 0xbdf5, 0x0000,
+ /* a8 */ 0xcfc7, 0xefc3, 0xefc1, 0xefc2, 0xefc4, 0xb6a7, 0xbcfc, 0xbee2,
+ /* b0 */ 0xc3cc, 0xefc5, 0xefc6, 0x0000, 0xefc7, 0xefcf, 0xefc8, 0xefc9,
+ /* b8 */ 0xefca, 0xc7c2, 0xeff1, 0xb6cd, 0xefcb, 0x0000, 0xefcc, 0xefcd,
+
+ /*** Three byte table, leaf: e995xx - offset 0x04cbe ***/
+
+ /* 80 */ 0xb6c6, 0xc3be, 0xefce, 0x0000, 0xefd0, 0xefd1, 0xefd2, 0xd5f2,
+ /* 88 */ 0x0000, 0xefd3, 0xc4f7, 0x0000, 0xefd4, 0xc4f8, 0xefd5, 0xefd6,
+ /* 90 */ 0xb8e4, 0xb0f7, 0xefd7, 0xefd8, 0xefd9, 0x0000, 0xefda, 0xefdb,
+ /* 98 */ 0xefdc, 0xefdd, 0x0000, 0xefde, 0xbeb5, 0xefe1, 0xefdf, 0xefe0,
+ /* a0 */ 0x0000, 0xefe2, 0xefe3, 0xc1cd, 0xefe4, 0xefe5, 0xefe6, 0xefe7,
+ /* a8 */ 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xc0d8, 0x0000, 0xefed,
+ /* b0 */ 0xc1ad, 0xefee, 0xefef, 0xeff0, 0x0000, 0x0000, 0xcfe2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3a4,
+
+ /*** Three byte table, leaf: e997xx - offset 0x04cfe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc3c5, 0xe3c5, 0xc9c1, 0xe3c6, 0x0000, 0xb1d5, 0xceca, 0xb4b3,
+ /* b0 */ 0xc8f2, 0xe3c7, 0xcfd0, 0xe3c8, 0xbce4, 0xe3c9, 0xe3ca, 0xc3c6,
+ /* b8 */ 0xd5a2, 0xc4d6, 0xb9eb, 0xcec5, 0xe3cb, 0xc3f6, 0xe3cc, 0x0000,
+
+ /*** Three byte table, leaf: e998xx - offset 0x04d3e ***/
+
+ /* 80 */ 0xb7a7, 0xb8f3, 0xbad2, 0xe3cd, 0xe3ce, 0xd4c4, 0xe3cf, 0x0000,
+ /* 88 */ 0xe3d0, 0xd1cb, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xd1d6, 0xe3d5,
+ /* 90 */ 0xb2fb, 0xc0bb, 0xe3d6, 0x0000, 0xc0ab, 0xe3d7, 0xe3d8, 0xe3d9,
+ /* 98 */ 0x0000, 0xe3da, 0xe3db, 0x0000, 0xb8b7, 0xdae2, 0x0000, 0xb6d3,
+ /* a0 */ 0x0000, 0xdae4, 0xdae3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdae6, 0x0000, 0x0000, 0x0000, 0xc8ee, 0x0000,
+ /* b0 */ 0x0000, 0xdae5, 0xb7c0, 0xd1f4, 0xd2f5, 0xd5f3, 0xbdd7, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd7e8, 0xdae8, 0xdae7, 0x0000, 0xb0a2,
+
+ /*** Three byte table, leaf: e999xx - offset 0x04d7e ***/
+
+ /* 80 */ 0xcdd3, 0x0000, 0xdae9, 0x0000, 0xb8bd, 0xbcca, 0xc2bd, 0xc2a4,
+ /* 88 */ 0xb3c2, 0xdaea, 0x0000, 0xc2aa, 0xc4b0, 0xbdb5, 0x0000, 0x0000,
+ /* 90 */ 0xcfde, 0x0000, 0x0000, 0x0000, 0xdaeb, 0xc9c2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xb1dd, 0x0000, 0x0000, 0x0000, 0xdaec,
+ /* a0 */ 0x0000, 0xb6b8, 0xd4ba, 0x0000, 0xb3fd, 0x0000, 0x0000, 0xdaed,
+ /* a8 */ 0xd4c9, 0xcfd5, 0xc5e3, 0x0000, 0xdaee, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdaef, 0x0000, 0xdaf0, 0xc1ea, 0xccd5, 0xcfdd,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x04db9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3e7, 0xc2a1, 0x0000,
+ /* 88 */ 0xdaf1, 0x0000, 0x0000, 0xcbe5, 0x0000, 0xdaf2, 0x0000, 0xcbe6,
+ /* 90 */ 0xd2fe, 0x0000, 0x0000, 0x0000, 0xb8f4, 0x0000, 0x0000, 0xdaf3,
+ /* 98 */ 0xb0af, 0xcfb6, 0x0000, 0x0000, 0xd5cf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbed,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdaf4, 0x0000, 0x0000, 0xe3c4, 0x0000, 0x0000, 0xc1a5, 0x0000,
+ /* b8 */ 0x0000, 0xf6bf, 0x0000, 0x0000, 0xf6c0, 0xf6c1, 0xc4d1, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x04df9 ***/
+
+ /* 80 */ 0xc8b8, 0xd1e3, 0x0000, 0x0000, 0xd0db, 0xd1c5, 0xbcaf, 0xb9cd,
+ /* 88 */ 0x0000, 0xeff4, 0x0000, 0x0000, 0xb4c6, 0xd3ba, 0xf6c2, 0xb3fb,
+ /* 90 */ 0x0000, 0x0000, 0xf6c3, 0x0000, 0x0000, 0xb5f1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf6c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd3ea, 0xf6a7, 0xd1a9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf6a8, 0x0000, 0x0000, 0xc1e3, 0xc0d7,
+ /* b8 */ 0x0000, 0xb1a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xceed, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x04e39 ***/
+
+ /* 80 */ 0xd0e8, 0xf6ab, 0x0000, 0x0000, 0xcff6, 0x0000, 0xf6aa, 0xd5f0,
+ /* 88 */ 0xf6ac, 0xc3b9, 0x0000, 0x0000, 0x0000, 0xbbf4, 0xf6ae, 0xf6ad,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xc4de, 0x0000, 0x0000, 0xc1d8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcbaa, 0x0000, 0xcfbc, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf6af, 0x0000, 0x0000, 0xf6b0, 0x0000, 0x0000,
+ /* b0 */ 0xf6b1, 0x0000, 0xc2b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb0d4, 0xc5f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6b2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x04e78 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xc7e0, 0xf6a6, 0x0000, 0x0000, 0xbeb8, 0x0000,
+ /* 98 */ 0x0000, 0xbeb2, 0x0000, 0xb5e5, 0x0000, 0x0000, 0xb7c7, 0x0000,
+ /* a0 */ 0xbfbf, 0xc3d2, 0xc3e6, 0x0000, 0x0000, 0xd8cc, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb8ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xbdf9, 0xd1a5, 0x0000, 0xb0d0, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x04eb5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd0ac, 0x0000, 0xb0b0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7b2, 0xf7b3, 0x0000, 0xf7b4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc7ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbecf, 0x0000, 0x0000, 0xf7b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7b6, 0x0000, 0xb1de, 0x0000, 0xf7b5,
+ /* b0 */ 0x0000, 0x0000, 0xf7b8, 0x0000, 0xf7b9,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x04eea ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcea4, 0xc8cd,
+ /* a8 */ 0x0000, 0xbaab, 0xe8b8, 0xe8b9, 0xe8ba, 0xbec2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd2f4, 0x0000, 0xd4cf, 0xc9d8,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x04f21 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2b3, 0xb6a5, 0xc7ea,
+ /* b8 */ 0xf1fc, 0xcfee, 0xcbb3, 0xd0eb, 0xe7ef, 0xcde7, 0xb9cb, 0xb6d9,
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x04f61 ***/
+
+ /* 80 */ 0xf1fd, 0xb0e4, 0xcbcc, 0xf1fe, 0xd4a4, 0xc2ad, 0xc1ec, 0xc6c4,
+ /* 88 */ 0xbeb1, 0xf2a1, 0xbcd5, 0x0000, 0xf2a2, 0xf2a3, 0x0000, 0xf2a4,
+ /* 90 */ 0xd2c3, 0xc6b5, 0x0000, 0xcdc7, 0xf2a5, 0x0000, 0xd3b1, 0xbfc5,
+ /* 98 */ 0xcce2, 0x0000, 0xf2a6, 0xf2a7, 0xd1d5, 0xb6ee, 0xf2a8, 0xf2a9,
+ /* a0 */ 0xb5df, 0xf2aa, 0xf2ab, 0x0000, 0xb2fc, 0xf2ac, 0xf2ad, 0xc8a7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x04f93 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e7, 0x0000,
+ /* 90 */ 0x0000, 0xeca9, 0xecaa, 0xecab, 0x0000, 0xecac, 0x0000, 0x0000,
+ /* 98 */ 0xc6ae, 0xecad, 0xecae, 0x0000, 0x0000, 0x0000, 0xb7c9, 0xcab3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b8,
+ /* a8 */ 0xf7cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x04fc6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d0, 0x0000, 0x0000,
+ /* 90 */ 0xb2cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d1,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x04ff5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d3, 0xf7d2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe2bb, 0x0000, 0xbca2, 0x0000, 0xe2bc,
+ /* a8 */ 0xe2bd, 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xb7b9, 0xd2fb, 0xbda4,
+ /* b0 */ 0xcace, 0xb1a5, 0xcbc7, 0x0000, 0xe2c2, 0xb6fc, 0xc8c4, 0xe2c3,
+ /* b8 */ 0x0000, 0x0000, 0xbdc8, 0x0000, 0xb1fd, 0xe2c4, 0x0000, 0xb6f6,
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x05035 ***/
+
+ /* 80 */ 0xe2c5, 0xc4d9, 0x0000, 0x0000, 0xe2c6, 0xcfda, 0xb9dd, 0xe2c7,
+ /* 88 */ 0xc0a1, 0x0000, 0xe2c8, 0xb2f6, 0x0000, 0xe2c9, 0x0000, 0xc1f3,
+ /* 90 */ 0xe2ca, 0xe2cb, 0xc2f8, 0xe2cc, 0xe2cd, 0xe2ce, 0xcad7, 0xd8b8,
+ /* 98 */ 0xd9e5, 0xcfe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a5, 0x0000, 0x0000,
+ /* a8 */ 0xdcb0,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x0505e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2ed, 0xd4a6, 0xcdd4, 0xd1b1,
+ /* b0 */ 0xb3db, 0xc7fd, 0x0000, 0xb2b5, 0xc2bf, 0xe6e0, 0xcabb, 0xe6e1,
+ /* b8 */ 0xe6e2, 0xbed4, 0xe6e3, 0xd7a4, 0xcdd5, 0xe6e5, 0xbcdd, 0xe6e4,
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x0509e ***/
+
+ /* 80 */ 0xe6e6, 0xe6e7, 0xc2ee, 0x0000, 0xbdbe, 0xe6e8, 0xc2e6, 0xbaa7,
+ /* 88 */ 0xe6e9, 0x0000, 0xe6ea, 0xb3d2, 0xd1e9, 0x0000, 0x0000, 0xbfa5,
+ /* 90 */ 0xe6eb, 0xc6ef, 0xe6ec, 0xe6ed, 0x0000, 0x0000, 0xe6ee, 0xc6ad,
+ /* 98 */ 0xe6ef, 0x0000, 0xc9a7, 0xe6f0, 0xe6f1, 0xe6f2, 0xe5b9, 0xe6f3,
+ /* a0 */ 0xe6f4, 0xc2e2, 0xe6f5, 0xe6f6, 0xd6e8, 0xe6f7, 0x0000, 0xe6f8,
+ /* a8 */ 0xb9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf7bb, 0xf7ba, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7be, 0xf7bc,
+ /* b8 */ 0xbaa1, 0x0000, 0xf7bf, 0x0000, 0xf7c0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x050de ***/
+
+ /* 80 */ 0xf7c2, 0xf7c1, 0xf7c4, 0x0000, 0x0000, 0xf7c3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf7c5, 0xf7c6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7c7, 0x0000, 0xcbe8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb8df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d4,
+ /* a0 */ 0x0000, 0xf7d5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7d8, 0x0000, 0xf7da, 0x0000, 0xf7d7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7db, 0x0000, 0xf7d9, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x0511b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd7d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7dd,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf7de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7df,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf7e0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbcb,
+ /* b0 */ 0x0000, 0x0000, 0xd8aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe5f7, 0xb9ed, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x0515a ***/
+
+ /* 80 */ 0x0000, 0xbffd, 0xbbea, 0xf7c9, 0xc6c7, 0xf7c8, 0x0000, 0xf7ca,
+ /* 88 */ 0xf7cc, 0xf7cb, 0x0000, 0x0000, 0x0000, 0xf7cd, 0x0000, 0xceba,
+ /* 90 */ 0x0000, 0xf7ce, 0x0000, 0x0000, 0xc4a7,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x0516f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd3e3, 0x0000, 0x0000, 0xf6cf,
+
+ /*** Three byte table, leaf: e9b2xx - offset 0x051af ***/
+
+ /* 80 */ 0x0000, 0xc2b3, 0xf6d0, 0x0000, 0x0000, 0xf6d1, 0xf6d2, 0xf6d3,
+ /* 88 */ 0xf6d4, 0x0000, 0x0000, 0xf6d6, 0x0000, 0xb1ab, 0xf6d7, 0x0000,
+ /* 90 */ 0xf6d8, 0xf6d9, 0xf6da, 0x0000, 0xf6db, 0xf6dc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf6dd, 0xf6de, 0xcfca, 0x0000, 0xf6df, 0xf6e0,
+ /* a0 */ 0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xc0f0, 0xf6e5, 0xf6e6, 0xf6e7,
+ /* a8 */ 0xf6e8, 0xf6e9, 0x0000, 0xf6ea, 0x0000, 0xf6eb, 0xf6ec, 0x0000,
+ /* b0 */ 0xf6ed, 0xf6ee, 0xf6ef, 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4,
+ /* b8 */ 0xbea8, 0x0000, 0xf6f5, 0xf6f6, 0xf6f7, 0xf6f8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x051ed ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc8fa, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc,
+ /* 88 */ 0x0000, 0x0000, 0xf6fd, 0xf6fe, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4,
+ /* 90 */ 0xf7a5, 0x0000, 0x0000, 0xf7a6, 0xf7a7, 0xf7a8, 0xb1ee, 0xf7a9,
+ /* 98 */ 0xf7aa, 0xf7ab, 0x0000, 0x0000, 0xf7ac, 0xf7ad, 0xc1db, 0xf7ae,
+ /* a0 */ 0x0000, 0x0000, 0xf7af,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x05210 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4f1,
+ /* a0 */ 0xf0af, 0xbca6, 0xf0b0, 0xc3f9, 0x0000, 0xc5b8, 0xd1bb, 0x0000,
+ /* a8 */ 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xd1bc, 0x0000, 0xd1ec,
+ /* b0 */ 0x0000, 0xf0b7, 0xf0b6, 0xd4a7, 0x0000, 0xcdd2, 0xf0b8, 0xf0ba,
+ /* b8 */ 0xf0b9, 0xf0bb, 0xf0bc, 0x0000, 0x0000, 0xb8eb, 0xf0bd, 0xbae8,
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x05250 ***/
+
+ /* 80 */ 0x0000, 0xf0be, 0xf0bf, 0xbee9, 0xf0c0, 0xb6ec, 0xf0c1, 0xf0c2,
+ /* 88 */ 0xf0c3, 0xf0c4, 0xc8b5, 0xf0c5, 0xf0c6, 0x0000, 0xf0c7, 0xc5f4,
+ /* 90 */ 0x0000, 0xf0c8, 0x0000, 0x0000, 0x0000, 0xf0c9, 0x0000, 0xf0ca,
+ /* 98 */ 0xf7bd, 0x0000, 0xf0cb, 0xf0cc, 0xf0cd, 0x0000, 0xf0ce, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf0cf, 0xbad7, 0x0000, 0xf0d0, 0xf0d1,
+ /* a8 */ 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d8, 0x0000, 0x0000,
+ /* b0 */ 0xd3a5, 0xf0d7, 0x0000, 0xf0d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ba, 0xc2b9,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x05290 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf7e4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e5,
+ /* 88 */ 0xf7e6, 0x0000, 0x0000, 0xf7e7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf7e8, 0xc2b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7ea, 0x0000, 0xf7eb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2f3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf4ef, 0x0000, 0x0000, 0xc2e9, 0x0000, 0xf7e1, 0xf7e2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x052cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbc6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd9e4, 0x0000, 0x0000, 0x0000, 0xcaf2, 0xc0e8, 0xf0a4,
+ /* 90 */ 0x0000, 0xbada, 0x0000, 0x0000, 0xc7ad, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc4ac, 0x0000, 0x0000, 0xf7ec, 0xf7ed, 0xf7ee, 0x0000, 0xf7f0,
+ /* a0 */ 0xf7ef, 0x0000, 0xf7f1, 0x0000, 0x0000, 0xf7f4, 0x0000, 0xf7f3,
+ /* a8 */ 0x0000, 0xf7f2, 0xf7f5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xede9, 0x0000, 0xedea, 0xedeb, 0x0000, 0xf6bc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x0530e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf6bd, 0x0000, 0xf6be, 0xb6a6, 0x0000,
+ /* 90 */ 0xd8be, 0x0000, 0x0000, 0xb9c4, 0x0000, 0x0000, 0x0000, 0xd8bb,
+ /* 98 */ 0x0000, 0xdcb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcaf3, 0x0000, 0xf7f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f8, 0x0000, 0x0000, 0xf7f9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7fb,
+ /* b8 */ 0x0000, 0xf7fa, 0x0000, 0xb1c7, 0x0000, 0xf7fc, 0xf7fd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x0534d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc6eb, 0xecb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3dd,
+
+ /*** Three byte table, leaf: e9bexx - offset 0x0538d ***/
+
+ /* 80 */ 0xf6b3, 0x0000, 0x0000, 0xf6b4, 0xc1e4, 0xf6b5, 0xf6b6, 0xf6b7,
+ /* 88 */ 0xf6b8, 0xf6b9, 0xf6ba, 0xc8a3, 0xf6bb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xc1fa, 0xb9a8, 0xede8, 0x0000, 0x0000, 0x0000, 0xb9ea,
+ /* a0 */ 0xd9df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x053cc ***/
+
+ /* 80 */ 0x0000, 0xa3a1, 0xa3a2, 0xa3a3, 0xa1e7, 0xa3a5, 0xa3a6, 0xa3a7,
+ /* 88 */ 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af,
+ /* 90 */ 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
+ /* 98 */ 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf,
+ /* a0 */ 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
+ /* a8 */ 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
+ /* b0 */ 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
+ /* b8 */ 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd, 0xa3de, 0xa3df,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x0540c ***/
+
+ /* 80 */ 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
+ /* 88 */ 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
+ /* 90 */ 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
+ /* 98 */ 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa1ab, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x0544c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1e9, 0xa1ea, 0x0000, 0xa3fe, 0x0000, 0xa3a4, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_euc_jis_2004.map b/src/backend/utils/mb/Unicode/utf8_to_euc_jis_2004.map
new file mode 100644
index 0000000..55747fa
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_euc_jis_2004.map
@@ -0,0 +1,12567 @@
+/* src/backend/utils/mb/Unicode/utf8_to_euc_jis_2004.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl */
+
+static const uint32 euc_jis_2004_from_unicode_tree_table[39163];
+
+static const pg_mb_radix_tree euc_jis_2004_from_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_jis_2004_from_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x03ee, /* offset of table for 3-byte inputs */
+ 0xe1, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x6fc1, /* offset of table for 4-byte inputs */
+ 0xf0, /* b4_1_lower */
+ 0xf0, /* b4_1_upper */
+ 0xa0, /* b4_2_lower */
+ 0xaa, /* b4_2_upper */
+ 0x80, /* b4_3_lower */
+ 0xbf, /* b4_3_upper */
+ 0x80, /* b4_4_lower */
+ 0xbf /* b4_4_upper */
+};
+
+static const uint32 euc_jis_2004_from_unicode_tree_table[39163] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x000050, 0x000090, 0x0000d0, 0x00010f,
+ /* c6 */ 0x00014e, 0x00018c, 0x000000, 0x0001ca,
+ /* ca */ 0x000209, 0x000242, 0x000282, 0x0002c0,
+ /* ce */ 0x0002ef, 0x00032f, 0x00036e, 0x0003ae,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x000080, 0x000081, 0x000082, 0x000083,
+ /* 84 */ 0x000084, 0x000085, 0x000086, 0x000087,
+ /* 88 */ 0x000088, 0x000089, 0x00008a, 0x00008b,
+ /* 8c */ 0x00008c, 0x00008d, 0x00008e, 0x00008f,
+ /* 90 */ 0x000090, 0x000091, 0x000092, 0x000093,
+ /* 94 */ 0x000094, 0x000095, 0x000096, 0x000097,
+ /* 98 */ 0x000098, 0x000099, 0x00009a, 0x00009b,
+ /* 9c */ 0x00009c, 0x00009d, 0x00009e, 0x00009f,
+ /* a0 */ 0x00a9a2, 0x00a9a3, 0x00a1f1, 0x00a1f2,
+ /* a4 */ 0x00a9a4, 0x00a1ef, 0x00a9a5, 0x00a1f8,
+ /* a8 */ 0x00a1af, 0x00a9a6, 0x00a9a7, 0x00a9a8,
+ /* ac */ 0x00a2cc, 0x00a9a9, 0x00a9aa, 0x00a9ab,
+ /* b0 */ 0x00a1eb, 0x00a1de, 0x00a9ac, 0x00a9ad,
+ /* b4 */ 0x00a1ad, 0x000000, 0x00a2f9, 0x00a9ae,
+ /* b8 */ 0x00a9af, 0x00a9b0, 0x00a9b1, 0x00a9b2,
+ /* bc */ 0x00a9b3, 0x00a9b4, 0x00a9b5, 0x00a9b6,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x00a9b7, 0x00a9b8, 0x00a9b9, 0x00a9ba,
+ /* 84 */ 0x00a9bb, 0x00a9bc, 0x00a9bd, 0x00a9be,
+ /* 88 */ 0x00a9bf, 0x00a9c0, 0x00a9c1, 0x00a9c2,
+ /* 8c */ 0x00a9c3, 0x00a9c4, 0x00a9c5, 0x00a9c6,
+ /* 90 */ 0x00a9c7, 0x00a9c8, 0x00a9c9, 0x00a9ca,
+ /* 94 */ 0x00a9cb, 0x00a9cc, 0x00a9cd, 0x00a1df,
+ /* 98 */ 0x00a9ce, 0x00a9cf, 0x00a9d0, 0x00a9d1,
+ /* 9c */ 0x00a9d2, 0x00a9d3, 0x00a9d4, 0x00a9d5,
+ /* a0 */ 0x00a9d6, 0x00a9d7, 0x00a9d8, 0x00a9d9,
+ /* a4 */ 0x00a9da, 0x00a9db, 0x00a9dc, 0x00a9dd,
+ /* a8 */ 0x00a9de, 0x00a9df, 0x00a9e0, 0x00a9e1,
+ /* ac */ 0x00a9e2, 0x00a9e3, 0x00a9e4, 0x00a9e5,
+ /* b0 */ 0x00a9e6, 0x00a9e7, 0x00a9e8, 0x00a9e9,
+ /* b4 */ 0x00a9ea, 0x00a9eb, 0x00a9ec, 0x00a1e0,
+ /* b8 */ 0x00a9ed, 0x00a9ee, 0x00a9ef, 0x00a9f0,
+ /* bc */ 0x00a9f1, 0x00a9f2, 0x00a9f3, 0x00a9f4,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000d0 ***/
+
+ /* 80 */ 0x00a9f5, 0x00a9fa, 0x00aaba, 0x00aac9,
+ /* 84 */ 0x00aaa1, 0x00aaac, 0x00aabc, 0x00aacb,
+ /* 88 */ 0x00aad9, 0x00aadf, 0x000000, 0x000000,
+ /* 8c */ 0x00aabd, 0x00aacc, 0x00aac0, 0x00aacf,
+ /* 90 */ 0x000000, 0x00aad0, 0x00a9f8, 0x00a9fd,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00aabe, 0x00aacd, 0x00aabf, 0x00aace,
+ /* 9c */ 0x00aada, 0x00aae0, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00aadb, 0x00aae1, 0x000000, 0x00aafd,
+ /* a8 */ 0x000000, 0x000000, 0x00a9f6, 0x00a9fb,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00aadc, 0x00aae2, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00aabb, 0x00aaca, 0x000000,
+ /* bc */ 0x000000, 0x00aaa4, 0x00aaaf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x0010f ***/
+
+ /* 80 */ 0x000000, 0x00aaa3, 0x00aaae, 0x00aac1,
+ /* 84 */ 0x00aad1, 0x000000, 0x000000, 0x00aac2,
+ /* 88 */ 0x00aad2, 0x000000, 0x000000, 0x00aafa,
+ /* 8c */ 0x00a9f9, 0x00a9fe, 0x000000, 0x000000,
+ /* 90 */ 0x00aac3, 0x00aad3, 0x00abab, 0x00abaa,
+ /* 94 */ 0x00aab9, 0x00aac8, 0x000000, 0x000000,
+ /* 98 */ 0x00aac4, 0x00aad4, 0x00aaa5, 0x00aab0,
+ /* 9c */ 0x00aadd, 0x00aae3, 0x00aaa7, 0x00aab3,
+ /* a0 */ 0x00aaa6, 0x00aab2, 0x00aac7, 0x00aad7,
+ /* a4 */ 0x00aaa8, 0x00aab4, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00a9f7, 0x00a9fc,
+ /* ac */ 0x00aade, 0x00aae4, 0x00aac5, 0x00aad5,
+ /* b0 */ 0x00aac6, 0x00aad6, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00aaa9, 0x00aab5, 0x00aaab,
+ /* bc */ 0x00aab8, 0x00aaaa, 0x00aab7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x0014e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00aba9,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x0018c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00aba4, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00a8ef, 0x00a8f0, 0x000000,
+ /* 90 */ 0x00a8f1, 0x00a8f6, 0x00a8f7, 0x000000,
+ /* 94 */ 0x00a8f8, 0x000000, 0x00a8f9, 0x000000,
+ /* 98 */ 0x00a8fa, 0x000000, 0x00a8fb, 0x000000,
+ /* 9c */ 0x00a8fc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00a8f4, 0x00a8f5, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00abc5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c9xx - offset 0x001ca ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00abb3, 0x00abb9, 0x00abba, 0x00aba5,
+ /* 94 */ 0x00abb8, 0x00abbf, 0x00aaee, 0x00aba6,
+ /* 98 */ 0x00abae, 0x00abb0, 0x00abc3, 0x000000,
+ /* 9c */ 0x00abb1, 0x000000, 0x00abb2, 0x00aaf5,
+ /* a0 */ 0x00aba8, 0x00aaf9, 0x000000, 0x000000,
+ /* a4 */ 0x00abb6, 0x00abbc, 0x00aba2, 0x00abc2,
+ /* a8 */ 0x00abac, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00aaea, 0x00aaf4, 0x00aaeb, 0x00abb4,
+ /* b0 */ 0x00aafb, 0x00aae5, 0x00aaf6, 0x00aaef,
+ /* b4 */ 0x000000, 0x00abaf, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00aaec, 0x00abc1, 0x00aaf3,
+ /* bc */ 0x000000, 0x00aaf0, 0x00aae7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: caxx - offset 0x00209 ***/
+
+ /* 80 */ 0x000000, 0x00aafc, 0x00aaf1, 0x00aae8,
+ /* 84 */ 0x00aba7, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00aaed, 0x00abad, 0x00abb5, 0x00aae6,
+ /* 8c */ 0x00abb7, 0x00abbb, 0x00aaf8, 0x000000,
+ /* 90 */ 0x00aaf2, 0x00abc0, 0x00aae9, 0x000000,
+ /* 94 */ 0x00aba1, 0x00aafe, 0x000000, 0x000000,
+ /* 98 */ 0x00aba3, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00aaf7, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00abbe, 0x00abbd, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00242 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00aab1,
+ /* 88 */ 0x00abd3, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00abd4, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00abd5, 0x00abd6, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00aaa2, 0x00aad8, 0x000000, 0x00aaad,
+ /* 9c */ 0x000000, 0x00aab6, 0x00abf1, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00abe0, 0x00abe1, 0x00abe2,
+ /* a8 */ 0x00abe3, 0x00abe4, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, leaf: ccxx - offset 0x00282 ***/
+
+ /* 80 */ 0x00abdc, 0x00abda, 0x00abdf, 0x00abfd,
+ /* 84 */ 0x00abdb, 0x000000, 0x00abd7, 0x000000,
+ /* 88 */ 0x00abed, 0x000000, 0x000000, 0x00abd9,
+ /* 8c */ 0x00abde, 0x000000, 0x000000, 0x00abdd,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00abf8, 0x00abf9, 0x00abfe, 0x000000,
+ /* 9c */ 0x00abea, 0x00abf6, 0x00abf7, 0x00abeb,
+ /* a0 */ 0x00abec, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00abf2, 0x00abe7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00abef, 0x00abfa, 0x000000,
+ /* ac */ 0x00abe8, 0x000000, 0x000000, 0x00abf0,
+ /* b0 */ 0x00abf3, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00abf5, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00abe9, 0x00abfb, 0x00abfc,
+ /* bc */ 0x00abf4, 0x00abee,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cdxx - offset 0x002c0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00abd2, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x002ef ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00a6a1, 0x00a6a2, 0x00a6a3,
+ /* 94 */ 0x00a6a4, 0x00a6a5, 0x00a6a6, 0x00a6a7,
+ /* 98 */ 0x00a6a8, 0x00a6a9, 0x00a6aa, 0x00a6ab,
+ /* 9c */ 0x00a6ac, 0x00a6ad, 0x00a6ae, 0x00a6af,
+ /* a0 */ 0x00a6b0, 0x00a6b1, 0x000000, 0x00a6b2,
+ /* a4 */ 0x00a6b3, 0x00a6b4, 0x00a6b5, 0x00a6b6,
+ /* a8 */ 0x00a6b7, 0x00a6b8, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00a6c1, 0x00a6c2, 0x00a6c3,
+ /* b4 */ 0x00a6c4, 0x00a6c5, 0x00a6c6, 0x00a6c7,
+ /* b8 */ 0x00a6c8, 0x00a6c9, 0x00a6ca, 0x00a6cb,
+ /* bc */ 0x00a6cc, 0x00a6cd, 0x00a6ce, 0x00a6cf,
+
+ /*** Two byte table, leaf: cfxx - offset 0x0032f ***/
+
+ /* 80 */ 0x00a6d0, 0x00a6d1, 0x00a6d9, 0x00a6d2,
+ /* 84 */ 0x00a6d3, 0x00a6d4, 0x00a6d5, 0x00a6d6,
+ /* 88 */ 0x00a6d7, 0x00a6d8, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0036e ***/
+
+ /* 80 */ 0x000000, 0x00a7a7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00a7a1, 0x00a7a2, 0x00a7a3, 0x00a7a4,
+ /* 94 */ 0x00a7a5, 0x00a7a6, 0x00a7a8, 0x00a7a9,
+ /* 98 */ 0x00a7aa, 0x00a7ab, 0x00a7ac, 0x00a7ad,
+ /* 9c */ 0x00a7ae, 0x00a7af, 0x00a7b0, 0x00a7b1,
+ /* a0 */ 0x00a7b2, 0x00a7b3, 0x00a7b4, 0x00a7b5,
+ /* a4 */ 0x00a7b6, 0x00a7b7, 0x00a7b8, 0x00a7b9,
+ /* a8 */ 0x00a7ba, 0x00a7bb, 0x00a7bc, 0x00a7bd,
+ /* ac */ 0x00a7be, 0x00a7bf, 0x00a7c0, 0x00a7c1,
+ /* b0 */ 0x00a7d1, 0x00a7d2, 0x00a7d3, 0x00a7d4,
+ /* b4 */ 0x00a7d5, 0x00a7d6, 0x00a7d8, 0x00a7d9,
+ /* b8 */ 0x00a7da, 0x00a7db, 0x00a7dc, 0x00a7dd,
+ /* bc */ 0x00a7de, 0x00a7df, 0x00a7e0, 0x00a7e1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x003ae ***/
+
+ /* 80 */ 0x00a7e2, 0x00a7e3, 0x00a7e4, 0x00a7e5,
+ /* 84 */ 0x00a7e6, 0x00a7e7, 0x00a7e8, 0x00a7e9,
+ /* 88 */ 0x00a7ea, 0x00a7eb, 0x00a7ec, 0x00a7ed,
+ /* 8c */ 0x00a7ee, 0x00a7ef, 0x00a7f0, 0x00a7f1,
+ /* 90 */ 0x000000, 0x00a7d7, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, byte #1: xx - offset 0x003ee ***/
+
+ /* e1 */ 0x0003fd, 0x00043d, 0x00047d, 0x0004bd,
+ /* e5 */ 0x0004fd, 0x00053d, 0x00057d, 0x0005bd,
+ /* e9 */ 0x0005fd, 0x000000, 0x000000, 0x000000,
+ /* ed */ 0x000000, 0x000000, 0x00063c,
+
+ /*** Three byte table, byte #2: e1xx - offset 0x003fd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00067b, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x0006bb, 0x000000, 0x000000,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0043d ***/
+
+ /* 80 */ 0x0006ef, 0x00072f, 0x000743, 0x000000,
+ /* 84 */ 0x000780, 0x0007b6, 0x0007f2, 0x00082e,
+ /* 88 */ 0x00086e, 0x0008ac, 0x0008ea, 0x00092a,
+ /* 8c */ 0x000965, 0x000000, 0x00097e, 0x0009be,
+ /* 90 */ 0x0009db, 0x0009ff, 0x000000, 0x000a33,
+ /* 94 */ 0x000a73, 0x000ab3, 0x000ad3, 0x000b13,
+ /* 98 */ 0x000b53, 0x000b93, 0x000000, 0x000000,
+ /* 9c */ 0x000bc3, 0x000bed, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000c2d, 0x000000, 0x000c63, 0x000ca3,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x0047d ***/
+
+ /* 80 */ 0x000ce3, 0x000d22, 0x000d62, 0x000da2,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000de2,
+ /* 88 */ 0x000e22, 0x000e5c, 0x000e7c, 0x000ebc,
+ /* 8c */ 0x000ef9, 0x000f35, 0x000f74, 0x000fb0,
+ /* 90 */ 0x000fee, 0x00101d, 0x00104b, 0x00108a,
+ /* 94 */ 0x0010ab, 0x0010ce, 0x0010fd, 0x001138,
+ /* 98 */ 0x001173, 0x0011a9, 0x0011d8, 0x001209,
+ /* 9c */ 0x000000, 0x001228, 0x00125e, 0x00129d,
+ /* a0 */ 0x0012dd, 0x00131d, 0x000000, 0x00133f,
+ /* a4 */ 0x00137a, 0x001395, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x0013c5, 0x000000, 0x0013f9,
+ /* ac */ 0x00142b, 0x00144e, 0x001487, 0x0014c4,
+ /* b0 */ 0x0014f5, 0x000000, 0x000000, 0x001532,
+ /* b4 */ 0x001561, 0x001580, 0x0015a6, 0x0015e6,
+ /* b8 */ 0x001621, 0x001661, 0x00169e, 0x000000,
+ /* bc */ 0x000000, 0x0016c7, 0x0016ff, 0x001736,
+
+ /*** Three byte table, byte #2: e4xx - offset 0x004bd ***/
+
+ /* 80 */ 0x00174e, 0x001788, 0x0017b5, 0x000000,
+ /* 84 */ 0x0017f0, 0x001828, 0x00184c, 0x00188c,
+ /* 88 */ 0x0018c5, 0x0018e1, 0x000000, 0x00191b,
+ /* 8c */ 0x001959, 0x001996, 0x000000, 0x0019a8,
+ /* 90 */ 0x0019e0, 0x001a0d, 0x001a48, 0x001a87,
+ /* 94 */ 0x001abf, 0x001afc, 0x001b1f, 0x001b58,
+ /* 98 */ 0x001b89, 0x001bc8, 0x001bee, 0x000000,
+ /* 9c */ 0x001c22, 0x001c3e, 0x000000, 0x001c63,
+ /* a0 */ 0x001ca1, 0x001cdd, 0x001cec, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x001d22, 0x001d53,
+ /* a8 */ 0x001d8f, 0x000000, 0x001db9, 0x000000,
+ /* ac */ 0x001df6, 0x000000, 0x000000, 0x001e34,
+ /* b0 */ 0x001e5d, 0x000000, 0x000000, 0x001e99,
+ /* b4 */ 0x001ed2, 0x001edb, 0x000000, 0x000000,
+ /* b8 */ 0x001f1b, 0x001f5b, 0x001f9b, 0x001fdb,
+ /* bc */ 0x00201b, 0x00205a, 0x00209a, 0x0020da,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x004fd ***/
+
+ /* 80 */ 0x00211a, 0x00215a, 0x00219a, 0x0021d9,
+ /* 84 */ 0x002219, 0x002259, 0x002299, 0x0022d7,
+ /* 88 */ 0x002317, 0x002354, 0x002394, 0x0023d3,
+ /* 8c */ 0x002413, 0x002453, 0x002493, 0x0024d3,
+ /* 90 */ 0x002512, 0x002552, 0x002592, 0x0025d2,
+ /* 94 */ 0x002612, 0x002652, 0x002692, 0x0026d2,
+ /* 98 */ 0x002711, 0x002751, 0x002791, 0x0027d1,
+ /* 9c */ 0x002811, 0x002851, 0x002891, 0x0028d1,
+ /* a0 */ 0x002911, 0x002951, 0x002990, 0x0029cf,
+ /* a4 */ 0x002a0d, 0x002a4c, 0x002a8b, 0x002aca,
+ /* a8 */ 0x002b0a, 0x002b4a, 0x002b8a, 0x002bca,
+ /* ac */ 0x002c0a, 0x002c4a, 0x002c8a, 0x002cca,
+ /* b0 */ 0x002d0a, 0x002d4a, 0x002d87, 0x002dc6,
+ /* b4 */ 0x002e04, 0x002e42, 0x002e81, 0x002ebf,
+ /* b8 */ 0x002eff, 0x002f3f, 0x002f7f, 0x002fbf,
+ /* bc */ 0x002fff, 0x00303f, 0x00307f, 0x0030bd,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x0053d ***/
+
+ /* 80 */ 0x0030fd, 0x00313c, 0x00317c, 0x0031bb,
+ /* 84 */ 0x0031fb, 0x00323b, 0x00327a, 0x0032b9,
+ /* 88 */ 0x0032f9, 0x003339, 0x003379, 0x0033b7,
+ /* 8c */ 0x0033f7, 0x003437, 0x003477, 0x0034b7,
+ /* 90 */ 0x0034f2, 0x003531, 0x00356f, 0x0035af,
+ /* 94 */ 0x0035ef, 0x00362f, 0x00366e, 0x0036ae,
+ /* 98 */ 0x0036ee, 0x00372e, 0x00376e, 0x0037ae,
+ /* 9c */ 0x0037ee, 0x00382e, 0x00386e, 0x0038ae,
+ /* a0 */ 0x0038ee, 0x00392e, 0x00396e, 0x0039ab,
+ /* a4 */ 0x0039eb, 0x003a2b, 0x003a6b, 0x003aab,
+ /* a8 */ 0x003aeb, 0x003b2b, 0x003b6b, 0x003baa,
+ /* ac */ 0x003be8, 0x003c27, 0x003c67, 0x003ca7,
+ /* b0 */ 0x003ce7, 0x003d27, 0x003d66, 0x003da6,
+ /* b4 */ 0x003de6, 0x003e26, 0x003e66, 0x003ea6,
+ /* b8 */ 0x003ee3, 0x003f22, 0x003f62, 0x003fa2,
+ /* bc */ 0x003fe2, 0x004022, 0x004062, 0x0040a2,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x0057d ***/
+
+ /* 80 */ 0x0040e2, 0x004121, 0x004160, 0x00419c,
+ /* 84 */ 0x0041da, 0x004217, 0x004257, 0x004296,
+ /* 88 */ 0x0042d6, 0x004316, 0x004356, 0x004396,
+ /* 8c */ 0x0043d4, 0x004414, 0x004453, 0x004493,
+ /* 90 */ 0x0044d2, 0x004512, 0x004551, 0x004591,
+ /* 94 */ 0x0045d1, 0x004611, 0x004651, 0x004691,
+ /* 98 */ 0x0046d1, 0x004710, 0x004750, 0x004790,
+ /* 9c */ 0x0047cf, 0x00480f, 0x00484f, 0x00488f,
+ /* a0 */ 0x0048cd, 0x00490d, 0x00494c, 0x00498b,
+ /* a4 */ 0x0049cb, 0x004a0b, 0x004a4b, 0x004a8b,
+ /* a8 */ 0x004acb, 0x004b0b, 0x004b4b, 0x004b8b,
+ /* ac */ 0x004bcb, 0x004c0a, 0x004c4a, 0x004c8a,
+ /* b0 */ 0x004cca, 0x004d0a, 0x004d49, 0x004d89,
+ /* b4 */ 0x004dc9, 0x004e09, 0x004e49, 0x004e89,
+ /* b8 */ 0x004ec8, 0x004f07, 0x004f47, 0x000000,
+ /* bc */ 0x004f64, 0x004fa3, 0x004fe2, 0x005022,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x005bd ***/
+
+ /* 80 */ 0x005062, 0x0050a2, 0x0050e2, 0x00511f,
+ /* 84 */ 0x00515d, 0x00519c, 0x0051dc, 0x00521c,
+ /* 88 */ 0x00525c, 0x00529c, 0x0052dc, 0x00531c,
+ /* 8c */ 0x00535c, 0x00539c, 0x0053dc, 0x00541c,
+ /* 90 */ 0x00545b, 0x005499, 0x0054d8, 0x005518,
+ /* 94 */ 0x005558, 0x005598, 0x0055d8, 0x005617,
+ /* 98 */ 0x005657, 0x005697, 0x0056d3, 0x005712,
+ /* 9c */ 0x005752, 0x005792, 0x0057d2, 0x005812,
+ /* a0 */ 0x005851, 0x005891, 0x0058d1, 0x005911,
+ /* a4 */ 0x005950, 0x005990, 0x0059d0, 0x005a10,
+ /* a8 */ 0x005a50, 0x005a8f, 0x005acd, 0x005b0d,
+ /* ac */ 0x005b4d, 0x005b8c, 0x005bcc, 0x000000,
+ /* b0 */ 0x005beb, 0x005c2b, 0x005c69, 0x005ca9,
+ /* b4 */ 0x005ce8, 0x005d04, 0x005d43, 0x005d82,
+ /* b8 */ 0x005dc2, 0x005e00, 0x005e3f, 0x005e7f,
+ /* bc */ 0x005ebf, 0x005eff, 0x005f24, 0x005f64,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x005fd ***/
+
+ /* 80 */ 0x005fa4, 0x005fe3, 0x006023, 0x006062,
+ /* 84 */ 0x0060a2, 0x0060e0, 0x00611e, 0x00615e,
+ /* 88 */ 0x00619e, 0x0061de, 0x00621e, 0x00625e,
+ /* 8c */ 0x00629e, 0x0062da, 0x006319, 0x006358,
+ /* 90 */ 0x006396, 0x0063d5, 0x006415, 0x000000,
+ /* 94 */ 0x000000, 0x00641e, 0x00645e, 0x00649d,
+ /* 98 */ 0x0064c3, 0x006503, 0x006541, 0x006581,
+ /* 9c */ 0x0065c1, 0x006600, 0x00663f, 0x00667e,
+ /* a0 */ 0x0066be, 0x0066fc, 0x006731, 0x006771,
+ /* a4 */ 0x0067b0, 0x0067f0, 0x00681a, 0x00685a,
+ /* a8 */ 0x00689a, 0x0068da, 0x006906, 0x006946,
+ /* ac */ 0x006984, 0x0069c3, 0x006a00, 0x006a40,
+ /* b0 */ 0x006a80, 0x006abf, 0x000000, 0x006afa,
+ /* b4 */ 0x006b38, 0x006b78, 0x006bb7, 0x006bf7,
+ /* b8 */ 0x006c35, 0x006c54, 0x006c94, 0x006cd4,
+ /* bc */ 0x006d14, 0x006d53, 0x006d8b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0063c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x006dae, 0x006de5, 0x000000, 0x006e16,
+ /* a8 */ 0x006e47, 0x006e87, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x006ec2, 0x000000, 0x000000,
+ /* bc */ 0x006f01, 0x006f41, 0x006f81,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e1b8xx - offset 0x0067b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00a8f2, 0x00a8f3,
+
+ /*** Three byte table, leaf: e1bdxx - offset 0x006bb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00abc6, 0x00abc7, 0x00abd0, 0x00abd1,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e280xx - offset 0x006ef ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00a1be, 0x000000, 0x000000, 0x00a3fc,
+ /* 94 */ 0x00a1bd, 0x000000, 0x00a1c2, 0x000000,
+ /* 98 */ 0x00a1c6, 0x00a1c7, 0x000000, 0x000000,
+ /* 9c */ 0x00a1c8, 0x00a1c9, 0x000000, 0x000000,
+ /* a0 */ 0x00a2f7, 0x00a2f8, 0x00a3c0, 0x000000,
+ /* a4 */ 0x000000, 0x00a1c5, 0x00a1c4, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00a2f3, 0x000000, 0x00a1ec, 0x00a1ed,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00a2a8,
+ /* bc */ 0x00a8eb, 0x000000, 0x00a1b1, 0x00abd8,
+
+ /*** Three byte table, leaf: e281xx - offset 0x0072f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00acfe, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00a8ec,
+ /* 88 */ 0x00a8ed, 0x00a8ee, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00acfd, 0x000000, 0x000000,
+ /* 44 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e282xx - offset 0x00743 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00a9a1, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x00780 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00a1ee,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00a3dd,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00a3df,
+ /* 94 */ 0x000000, 0x000000, 0x00ade2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00ade4, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00a3e0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00a2f2,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00a3dc,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x007b6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00a7f8,
+ /* 94 */ 0x00a7f9, 0x00a7fa, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00adb5, 0x00adb6, 0x00adb7, 0x00adb8,
+ /* a4 */ 0x00adb9, 0x00adba, 0x00adbb, 0x00adbc,
+ /* a8 */ 0x00adbd, 0x00adbe, 0x00adbf, 0x00add7,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00acb5, 0x00acb6, 0x00acb7, 0x00acb8,
+ /* b4 */ 0x00acb9, 0x00acba, 0x00acbb, 0x00acbc,
+ /* b8 */ 0x00acbd, 0x00acbe, 0x00acbf, 0x00acc0,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x007f2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00a2ab, 0x00a2ac, 0x00a2aa, 0x00a2ad,
+ /* 94 */ 0x00a2f1, 0x000000, 0x00a3a7, 0x00a3a5,
+ /* 98 */ 0x00a3a6, 0x00a3a8, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x0082e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00a3a9, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2cd, 0x000000,
+ /* 94 */ 0x00a2ce, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00a3ab, 0x00a3ac,
+ /* a8 */ 0x00a3aa, 0x00a3ad, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x0086e ***/
+
+ /* 80 */ 0x00a2cf, 0x000000, 0x00a2df, 0x00a2d0,
+ /* 84 */ 0x000000, 0x00a2c7, 0x000000, 0x00a2e0,
+ /* 88 */ 0x00a2ba, 0x00a2c6, 0x000000, 0x00a2bb,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a1dd, 0x00a3db,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00a2e5, 0x000000,
+ /* 9c */ 0x000000, 0x00a2e7, 0x00a1e7, 0x00adf8,
+ /* a0 */ 0x00a2dc, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00a2d4, 0x00a2d5, 0x00a2ca,
+ /* a8 */ 0x00a2cb, 0x00a2c1, 0x00a2c0, 0x00a2e9,
+ /* ac */ 0x00a2ea, 0x000000, 0x00adf3, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00a1e8, 0x00a2e8, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00a2e6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x008ac ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00a2ec,
+ /* 84 */ 0x000000, 0x00a2ed, 0x000000, 0x000000,
+ /* 88 */ 0x00a2ee, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2e2, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a1e2, 0x00a2e1, 0x00a2eb, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00a1e5, 0x00a1e6,
+ /* a8 */ 0x000000, 0x000000, 0x00a2e3, 0x00a2e4,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00a2ef, 0x00a2f0,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x008ea ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00a2be, 0x00a2bf,
+ /* 84 */ 0x00a2c2, 0x00a2c3, 0x00a2bc, 0x00a2bd,
+ /* 88 */ 0x000000, 0x000000, 0x00a2c4, 0x00a2c5,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00a2d1, 0x00a2d2, 0x00a2d3,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00a2dd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00adf9,
+
+ /*** Three byte table, leaf: e28bxx - offset 0x0092a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00a7f6, 0x00a7f7,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x00965 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00a2c8, 0x00a2c9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2de, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00a7fc,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28exx - offset 0x0097e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00a7c2, 0x00a7c3,
+
+ /*** Three byte table, leaf: e28fxx - offset 0x009be ***/
+
+ /* 80 */ 0x00a7c4, 0x00a7c5, 0x00a7c6, 0x00a7c7,
+ /* 84 */ 0x00a7c8, 0x00a7c9, 0x00a7ca, 0x00a7cb,
+ /* 88 */ 0x00a7cc, 0x00a7cd, 0x00a7ce, 0x00a7cf,
+ /* 8c */ 0x00a7d0, 0x000000, 0x00a7fe, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e290xx - offset 0x009db ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00a7fd,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x009ff ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00ada1, 0x00ada2, 0x00ada3, 0x00ada4,
+ /* a4 */ 0x00ada5, 0x00ada6, 0x00ada7, 0x00ada8,
+ /* a8 */ 0x00ada9, 0x00adaa, 0x00adab, 0x00adac,
+ /* ac */ 0x00adad, 0x00adae, 0x00adaf, 0x00adb0,
+ /* b0 */ 0x00adb1, 0x00adb2, 0x00adb3, 0x00adb4,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e293xx - offset 0x00a33 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00acc1, 0x00acc2, 0x00acc3, 0x00acc4,
+ /* 94 */ 0x00acc5, 0x00acc6, 0x00acc7, 0x00acc8,
+ /* 98 */ 0x00acc9, 0x00acca, 0x00accb, 0x00accc,
+ /* 9c */ 0x00accd, 0x00acce, 0x00accf, 0x00acd0,
+ /* a0 */ 0x00acd1, 0x00acd2, 0x00acd3, 0x00acd4,
+ /* a4 */ 0x00acd5, 0x00acd6, 0x00acd7, 0x00acd8,
+ /* a8 */ 0x00acd9, 0x00acda, 0x000000, 0x00acab,
+ /* ac */ 0x00acac, 0x00acad, 0x00acae, 0x00acaf,
+ /* b0 */ 0x00acb0, 0x00acb1, 0x00acb2, 0x00acb3,
+ /* b4 */ 0x00acb4, 0x00a6da, 0x00a6db, 0x00a6dc,
+ /* b8 */ 0x00a6dd, 0x00a6de, 0x00a6df, 0x00a6e0,
+ /* bc */ 0x00a6e1, 0x00a6e2, 0x00a6e3, 0x000000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00a73 ***/
+
+ /* 80 */ 0x00a8a1, 0x00a8ac, 0x00a8a2, 0x00a8ad,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00a8a3, 0x000000, 0x000000, 0x00a8ae,
+ /* 90 */ 0x00a8a4, 0x000000, 0x000000, 0x00a8af,
+ /* 94 */ 0x00a8a6, 0x000000, 0x000000, 0x00a8b1,
+ /* 98 */ 0x00a8a5, 0x000000, 0x000000, 0x00a8b0,
+ /* 9c */ 0x00a8a7, 0x00a8bc, 0x000000, 0x000000,
+ /* a0 */ 0x00a8b7, 0x000000, 0x000000, 0x00a8b2,
+ /* a4 */ 0x00a8a9, 0x00a8be, 0x000000, 0x000000,
+ /* a8 */ 0x00a8b9, 0x000000, 0x000000, 0x00a8b4,
+ /* ac */ 0x00a8a8, 0x000000, 0x000000, 0x00a8b8,
+ /* b0 */ 0x00a8bd, 0x000000, 0x000000, 0x00a8b3,
+ /* b4 */ 0x00a8aa, 0x000000, 0x000000, 0x00a8ba,
+ /* b8 */ 0x00a8bf, 0x000000, 0x000000, 0x00a8b5,
+ /* bc */ 0x00a8ab, 0x000000, 0x000000, 0x00a8bb,
+
+ /*** Three byte table, leaf: e295xx - offset 0x00ab3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00a8c0, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00a8b6,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x00ad3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a2a3, 0x00a2a2, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00a6ed, 0x00a2a5, 0x00a2a4,
+ /* b4 */ 0x000000, 0x000000, 0x00a3a2, 0x00a3a1,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00a2a7, 0x00a2a6, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e297xx - offset 0x00b13 ***/
+
+ /* 80 */ 0x00a3a4, 0x00a3a3, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00a2a1, 0x00a1fe,
+ /* 88 */ 0x000000, 0x00a3bb, 0x000000, 0x00a1fb,
+ /* 8c */ 0x000000, 0x000000, 0x00a1fd, 0x00a1fc,
+ /* 90 */ 0x00a8e7, 0x00a8e8, 0x00a8e9, 0x00a8ea,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00a3bf, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00a2fe,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e298xx - offset 0x00b53 ***/
+
+ /* 80 */ 0x00a6e8, 0x00a6e9, 0x00a6ea, 0x00a6eb,
+ /* 84 */ 0x000000, 0x00a1fa, 0x00a1f9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00a6e7, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00a6e4, 0x00a6e5,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00adfe, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x00b93 ***/
+
+ /* 80 */ 0x00a1ea, 0x000000, 0x00a1e9, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a6ba, 0x00a6bd, 0x00a6bb, 0x00a6c0,
+ /* a4 */ 0x00a6b9, 0x00a6be, 0x00a6bc, 0x00a6bf,
+ /* a8 */ 0x00a6ec, 0x00a2fd, 0x00a2f6, 0x00a2fb,
+ /* ac */ 0x00a2fc, 0x00a2f5, 0x00a2fa, 0x00a2f4,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e29cxx - offset 0x00bc3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00a7fb,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e29dxx - offset 0x00bed ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00adfd, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00aca1, 0x00aca2,
+ /* b8 */ 0x00aca3, 0x00aca4, 0x00aca5, 0x00aca6,
+ /* bc */ 0x00aca7, 0x00aca8, 0x00aca9, 0x00acaa,
+
+ /*** Three byte table, leaf: e2a4xx - offset 0x00c2d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00a3ae, 0x00a3af,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e2a6xx - offset 0x00c63 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00a3ba,
+
+ /*** Three byte table, leaf: e2a7xx - offset 0x00ca3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00a3fd, 0x00a3fe,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00ce3 ***/
+
+ /* 80 */ 0x00a1a1, 0x00a1a2, 0x00a1a3, 0x00a1b7,
+ /* 84 */ 0x000000, 0x00a1b9, 0x00a1ba, 0x00a1bb,
+ /* 88 */ 0x00a1d2, 0x00a1d3, 0x00a1d4, 0x00a1d5,
+ /* 8c */ 0x00a1d6, 0x00a1d7, 0x00a1d8, 0x00a1d9,
+ /* 90 */ 0x00a1da, 0x00a1db, 0x00a2a9, 0x00a2ae,
+ /* 94 */ 0x00a1cc, 0x00a1cd, 0x00a2da, 0x00a2db,
+ /* 98 */ 0x00a2d8, 0x00a2d9, 0x000000, 0x000000,
+ /* 9c */ 0x00a1c1, 0x00ade0, 0x000000, 0x00ade1,
+ /* a0 */ 0x00a6e6, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00a2b3,
+ /* b4 */ 0x00a2b4, 0x00a2b5, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00a2b6,
+ /* bc */ 0x00a2b7, 0x00a3bc, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00d22 ***/
+
+ /* 80 */ 0x000000, 0x00a4a1, 0x00a4a2, 0x00a4a3,
+ /* 84 */ 0x00a4a4, 0x00a4a5, 0x00a4a6, 0x00a4a7,
+ /* 88 */ 0x00a4a8, 0x00a4a9, 0x00a4aa, 0x00a4ab,
+ /* 8c */ 0x00a4ac, 0x00a4ad, 0x00a4ae, 0x00a4af,
+ /* 90 */ 0x00a4b0, 0x00a4b1, 0x00a4b2, 0x00a4b3,
+ /* 94 */ 0x00a4b4, 0x00a4b5, 0x00a4b6, 0x00a4b7,
+ /* 98 */ 0x00a4b8, 0x00a4b9, 0x00a4ba, 0x00a4bb,
+ /* 9c */ 0x00a4bc, 0x00a4bd, 0x00a4be, 0x00a4bf,
+ /* a0 */ 0x00a4c0, 0x00a4c1, 0x00a4c2, 0x00a4c3,
+ /* a4 */ 0x00a4c4, 0x00a4c5, 0x00a4c6, 0x00a4c7,
+ /* a8 */ 0x00a4c8, 0x00a4c9, 0x00a4ca, 0x00a4cb,
+ /* ac */ 0x00a4cc, 0x00a4cd, 0x00a4ce, 0x00a4cf,
+ /* b0 */ 0x00a4d0, 0x00a4d1, 0x00a4d2, 0x00a4d3,
+ /* b4 */ 0x00a4d4, 0x00a4d5, 0x00a4d6, 0x00a4d7,
+ /* b8 */ 0x00a4d8, 0x00a4d9, 0x00a4da, 0x00a4db,
+ /* bc */ 0x00a4dc, 0x00a4dd, 0x00a4de, 0x00a4df,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00d62 ***/
+
+ /* 80 */ 0x00a4e0, 0x00a4e1, 0x00a4e2, 0x00a4e3,
+ /* 84 */ 0x00a4e4, 0x00a4e5, 0x00a4e6, 0x00a4e7,
+ /* 88 */ 0x00a4e8, 0x00a4e9, 0x00a4ea, 0x00a4eb,
+ /* 8c */ 0x00a4ec, 0x00a4ed, 0x00a4ee, 0x00a4ef,
+ /* 90 */ 0x00a4f0, 0x00a4f1, 0x00a4f2, 0x00a4f3,
+ /* 94 */ 0x00a4f4, 0x00a4f5, 0x00a4f6, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00a1ab,
+ /* 9c */ 0x00a1ac, 0x00a1b5, 0x00a1b6, 0x00a2b9,
+ /* a0 */ 0x00a3fb, 0x00a5a1, 0x00a5a2, 0x00a5a3,
+ /* a4 */ 0x00a5a4, 0x00a5a5, 0x00a5a6, 0x00a5a7,
+ /* a8 */ 0x00a5a8, 0x00a5a9, 0x00a5aa, 0x00a5ab,
+ /* ac */ 0x00a5ac, 0x00a5ad, 0x00a5ae, 0x00a5af,
+ /* b0 */ 0x00a5b0, 0x00a5b1, 0x00a5b2, 0x00a5b3,
+ /* b4 */ 0x00a5b4, 0x00a5b5, 0x00a5b6, 0x00a5b7,
+ /* b8 */ 0x00a5b8, 0x00a5b9, 0x00a5ba, 0x00a5bb,
+ /* bc */ 0x00a5bc, 0x00a5bd, 0x00a5be, 0x00a5bf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00da2 ***/
+
+ /* 80 */ 0x00a5c0, 0x00a5c1, 0x00a5c2, 0x00a5c3,
+ /* 84 */ 0x00a5c4, 0x00a5c5, 0x00a5c6, 0x00a5c7,
+ /* 88 */ 0x00a5c8, 0x00a5c9, 0x00a5ca, 0x00a5cb,
+ /* 8c */ 0x00a5cc, 0x00a5cd, 0x00a5ce, 0x00a5cf,
+ /* 90 */ 0x00a5d0, 0x00a5d1, 0x00a5d2, 0x00a5d3,
+ /* 94 */ 0x00a5d4, 0x00a5d5, 0x00a5d6, 0x00a5d7,
+ /* 98 */ 0x00a5d8, 0x00a5d9, 0x00a5da, 0x00a5db,
+ /* 9c */ 0x00a5dc, 0x00a5dd, 0x00a5de, 0x00a5df,
+ /* a0 */ 0x00a5e0, 0x00a5e1, 0x00a5e2, 0x00a5e3,
+ /* a4 */ 0x00a5e4, 0x00a5e5, 0x00a5e6, 0x00a5e7,
+ /* a8 */ 0x00a5e8, 0x00a5e9, 0x00a5ea, 0x00a5eb,
+ /* ac */ 0x00a5ec, 0x00a5ed, 0x00a5ee, 0x00a5ef,
+ /* b0 */ 0x00a5f0, 0x00a5f1, 0x00a5f2, 0x00a5f3,
+ /* b4 */ 0x00a5f4, 0x00a5f5, 0x00a5f6, 0x00a7f2,
+ /* b8 */ 0x00a7f3, 0x00a7f4, 0x00a7f5, 0x00a1a6,
+ /* bc */ 0x00a1bc, 0x00a1b3, 0x00a1b4, 0x00a2b8,
+
+ /*** Three byte table, leaf: e387xx - offset 0x00de2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00a6ee, 0x00a6ef, 0x00a6f0, 0x00a6f1,
+ /* b4 */ 0x00a6f2, 0x00a6f3, 0x00a6f4, 0x00a6f5,
+ /* b8 */ 0x00a6f6, 0x00a6f7, 0x00a6f9, 0x00a6fa,
+ /* bc */ 0x00a6fb, 0x00a6fc, 0x00a6fd, 0x00a6fe,
+
+ /*** Three byte table, leaf: e388xx - offset 0x00e22 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00adea, 0x00adeb, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00adec,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e389xx - offset 0x00e5c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00a8c1, 0x00a8c2, 0x00a8c3,
+ /* 94 */ 0x00a8c4, 0x00a8c5, 0x00a8c6, 0x00a8c7,
+ /* 98 */ 0x00a8c8, 0x00a8c9, 0x00a8ca, 0x00a8cb,
+ /* 9c */ 0x00a8cc, 0x00a8cd, 0x00a8ce, 0x00a8cf,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x00e7c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00ade5, 0x00ade6, 0x00ade7, 0x00ade8,
+ /* a8 */ 0x00ade9, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00a8d0, 0x00a8d1, 0x00a8d2,
+ /* b4 */ 0x00a8d3, 0x00a8d4, 0x00a8d5, 0x00a8d6,
+ /* b8 */ 0x00a8d7, 0x00a8d8, 0x00a8d9, 0x00a8da,
+ /* bc */ 0x00a8db, 0x00a8dc, 0x00a8dd, 0x00a8de,
+
+ /*** Three byte table, leaf: e38bxx - offset 0x00ebc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00acdb, 0x00acdc, 0x00acdd, 0x00acde,
+ /* 94 */ 0x00acdf, 0x00ace0, 0x00ace1, 0x00ace2,
+ /* 98 */ 0x00ace3, 0x00ace4, 0x00ace5, 0x00ace6,
+ /* 9c */ 0x00ace7, 0x00ace8, 0x00ace9, 0x00acea,
+ /* a0 */ 0x00aceb, 0x00acec, 0x00aced, 0x00acee,
+ /* a4 */ 0x000000, 0x00acf1, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00acf0, 0x000000, 0x000000,
+ /* ac */ 0x00acf3, 0x00acf2, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00acef, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38cxx - offset 0x00ef9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00adc6,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00adca, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00adc1, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00adc4, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00adc2, 0x00adcc,
+ /* a4 */ 0x000000, 0x000000, 0x00adcb, 0x00adc5,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00adcd,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00adc7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00adcf,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38dxx - offset 0x00f35 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00adc0, 0x00adce, 0x000000,
+ /* 8c */ 0x000000, 0x00adc3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00adc8, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00adc9,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00addf,
+ /* bc */ 0x00adef, 0x00adee, 0x00aded,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00f74 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00add3, 0x00add4,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00add0, 0x00add1, 0x00add2, 0x000000,
+ /* a0 */ 0x000000, 0x00add6, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00fb0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00add5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00a3de,
+ /* 8c */ 0x000000, 0x00ade3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e390xx - offset 0x00fee ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00aea3, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fa1ad, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fa1b2, 0x000000, 0x8fa1b3,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e391xx - offset 0x0101d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa1de, 0x000000, 0x8fa1d6, 0x000000,
+ /* ac */ 0x000000, 0x000000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e392xx - offset 0x0104b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fa1fe, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00aed3, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fa3ab, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e393xx - offset 0x0108a ***/
+
+ /* 80 */ 0x000000, 0x8ff4e8, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fa3af,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00aedb,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e394xx - offset 0x010ab ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fa3c8,
+ /* a0 */ 0x000000, 0x000000, 0x000000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e395xx - offset 0x010ce ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fa3dd, 0x8fa3de, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fa3e1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fa3e7,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e396xx - offset 0x010fd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fa4a3, 0x000000,
+ /* a8 */ 0x8fa4a6, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e397xx - offset 0x01138 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fa4af, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fa4b8, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fa4c2, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e398xx - offset 0x01173 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fa4ca, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e399xx - offset 0x011a9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fa4f9, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39axx - offset 0x011d8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fa5bf, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fa5c3, 0x000000,
+ /* 98 */ 0x000000, 0x8fa5c1, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39bxx - offset 0x01209 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fa5d7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39dxx - offset 0x01228 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa8a3, 0x8fa8a5, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fa8a9,
+ /* ac */ 0x8fa8a8, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fa8ac,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39exx - offset 0x0125e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00cfdf, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39fxx - offset 0x0129d ***/
+
+ /* 80 */ 0x000000, 0x8fa8be, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00cfef, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa8d6, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fa8d9, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fa8dc, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e3a0xx - offset 0x012dd ***/
+
+ /* 80 */ 0x8fa8de, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fa8ef,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fa8f1, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e3a1xx - offset 0x0131d ***/
+
+ /* 80 */ 0x8fa8f4, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fa8f9, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa8fb,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a3xx - offset 0x0133f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8facbb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a4xx - offset 0x0137a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8facc6,
+ /* 98 */ 0x000000, 0x000000, 0x8facca,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a5xx - offset 0x01395 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8face0,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a9xx - offset 0x013c5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8faddb, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8faddf,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3abxx - offset 0x013f9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fadf1, 0x8faeb6,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fadfc, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3acxx - offset 0x0142b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8faeae, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8faeb2, 0x000000,
+ /* 9c */ 0x8faeb4, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00f5c9,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3adxx - offset 0x0144e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8faeed, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8faee5,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3aexx - offset 0x01487 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fafa8,
+ /* 88 */ 0x8fafa9, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fafac, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fafb4, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00f5fe, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3afxx - offset 0x014c4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00f6a1,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fafc8, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fafdd,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b0xx - offset 0x014f5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00f6ba,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8faff7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b3xx - offset 0x01532 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8feebb,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8feec2, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b4xx - offset 0x01561 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8feef1, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8feefe,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b5xx - offset 0x01580 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fefc0, 0x000000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b6xx - offset 0x015a6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fefd4, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e3b7xx - offset 0x015e6 ***/
+
+ /* 80 */ 0x8feff0, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8feff7, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b8xx - offset 0x01621 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff0a8, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00f7e6,
+
+ /*** Three byte table, leaf: e3b9xx - offset 0x01661 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff0bf, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ff0c1, 0x000000,
+ /* a8 */ 0x8ff0c2, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3baxx - offset 0x0169e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff0c9,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff0d0, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bdxx - offset 0x016c7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff1b4,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00f8cd, 0x000000,
+ /* b4 */ 0x000000, 0x8ff1c6, 0x000000, 0x8ff1c8,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bexx - offset 0x016ff ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff1dc, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bfxx - offset 0x01736 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8ff1e7, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff1ec,
+ /* 40 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e480xx - offset 0x0174e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff2a2,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e481xx - offset 0x01788 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ff2ad, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e482xx - offset 0x017b5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8ff2b9,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e484xx - offset 0x017f0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff2e4, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e485xx - offset 0x01828 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8ff2f4, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8ff2f7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ff2fd,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e486xx - offset 0x0184c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8ff3b3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8ff3b7,
+
+ /*** Three byte table, leaf: e487xx - offset 0x0188c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ff3c7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff3cb, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff3c8,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e488xx - offset 0x018c5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff3d3,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff3d7, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e489xx - offset 0x018e1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00f9ed, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48bxx - offset 0x0191b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ff4ab, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff4b6, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ff4bb, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48cxx - offset 0x01959 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ff4ce, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ff4dd,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48dxx - offset 0x01996 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff4e1,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000,
+ /* 46 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48fxx - offset 0x019a8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff5be, 0x000000,
+ /* b0 */ 0x8ff5c2, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e490xx - offset 0x019e0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8ff5c8, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff5ca,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ff5cc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8ff5cf, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e491xx - offset 0x01a0d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00fad9,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00fada,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ff5ec, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ff5ee,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e492xx - offset 0x01a48 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ff5f7, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff6b5,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ff6b2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e493xx - offset 0x01a87 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff6b4, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e494xx - offset 0x01abf ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8ff6d9, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ff6d4, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff6ed, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e495xx - offset 0x01afc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff6ee,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e496xx - offset 0x01b1f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00fbd1, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ff7cf,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e497xx - offset 0x01b58 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff7ec, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00fbe0, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e498xx - offset 0x01b89 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8ff8a4,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e499xx - offset 0x01bc8 ***/
+
+ /* 80 */ 0x000000, 0x8ff8ba, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff8c3,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49axx - offset 0x01bee ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8ff8ce, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ff8d3,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49cxx - offset 0x01c22 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff8eb, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49dxx - offset 0x01c3e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8ff9a9,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49fxx - offset 0x01c63 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff9bf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a0xx - offset 0x01ca1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff9c9, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a1xx - offset 0x01cdd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00fccb, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff9dc,
+ /* 49 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a2xx - offset 0x01cec ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8ffaa7,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a6xx - offset 0x01d22 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00fdd8,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a7xx - offset 0x01d53 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ffbea,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ffbf0, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a8xx - offset 0x01d8f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8ffbf5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ffbf8,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4aaxx - offset 0x01db9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ffcb7,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4acxx - offset 0x01df6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ffcd5,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4afxx - offset 0x01e34 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffda6, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ffda8, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8ffdaa, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8ffdb1,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b0xx - offset 0x01e5d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00febe,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ffdbf, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b3xx - offset 0x01e99 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8ffeaa, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ffead, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b4xx - offset 0x01ed2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ffecb,
+ /* 88 */ 0x000000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b5xx - offset 0x01edb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ffee0,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x01f1b ***/
+
+ /* 80 */ 0x00b0ec, 0x00c3fa, 0x8fa1a2, 0x00bcb7,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00cbfc,
+ /* 88 */ 0x00bee6, 0x00bbb0, 0x00bee5, 0x00b2bc,
+ /* 8c */ 0x000000, 0x00c9d4, 0x00cdbf, 0x8fa1a3,
+ /* 90 */ 0x00d0a2, 0x00b1af, 0x8fa1a4, 0x000000,
+ /* 94 */ 0x00b3ee, 0x00d0a3, 0x00c0a4, 0x00d2c2,
+ /* 98 */ 0x00b5d6, 0x00caba, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00bee7, 0x000000,
+ /* a0 */ 0x000000, 0x00cebe, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00cac2, 0x000000,
+ /* a8 */ 0x00aea4, 0x8fa1a5, 0x00d0a4, 0x8fa1a6,
+ /* ac */ 0x8ff0ae, 0x00c3e6, 0x8fa1a7, 0x00aea5,
+ /* b0 */ 0x00aea6, 0x00d0a5, 0x00b6fa, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00d0a6, 0x000000,
+ /* b8 */ 0x00b4dd, 0x00c3b0, 0x000000, 0x00bce7,
+ /* bc */ 0x00d0a7, 0x000000, 0x000000, 0x00d0a8,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x01f5b ***/
+
+ /* 80 */ 0x8fa1a8, 0x000000, 0x00d0a9, 0x00c7b5,
+ /* 84 */ 0x000000, 0x00b5d7, 0x000000, 0x8fa1a9,
+ /* 88 */ 0x8fa1aa, 0x000000, 0x000000, 0x00c7b7,
+ /* 8c */ 0x000000, 0x00c6e3, 0x00b8c3, 0x00cbb3,
+ /* 90 */ 0x000000, 0x8fa1ac, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00e9c9, 0x00d0aa, 0x00bee8,
+ /* 98 */ 0x00d0ab, 0x00b2b5, 0x8fa1af, 0x000000,
+ /* 9c */ 0x000000, 0x00b6e5, 0x00b8f0, 0x00cce9,
+ /* a0 */ 0x000000, 0x000000, 0x00d6a6, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fa1b0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cdf0, 0x000000, 0x00c6fd,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00b4a5, 0x000000,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x01f9b ***/
+
+ /* 80 */ 0x00b5b5, 0x000000, 0x00d0ac, 0x000000,
+ /* 84 */ 0x000000, 0x00d0ad, 0x00cebb, 0x000000,
+ /* 88 */ 0x00cdbd, 0x00c1e8, 0x00d0af, 0x00bbf6,
+ /* 8c */ 0x00c6f3, 0x00aea7, 0x00d0b2, 0x000000,
+ /* 90 */ 0x000000, 0x00b1be, 0x00b8df, 0x000000,
+ /* 94 */ 0x00b8de, 0x00b0e6, 0x000000, 0x000000,
+ /* 98 */ 0x00cfcb, 0x00cfca, 0x000000, 0x00bab3,
+ /* 9c */ 0x00b0a1, 0x8fa1b1, 0x00d0b3, 0x00d0b4,
+ /* a0 */ 0x00d0b5, 0x00cbb4, 0x00d0b6, 0x000000,
+ /* a4 */ 0x00b8f2, 0x00b0e7, 0x00cbf2, 0x000000,
+ /* a8 */ 0x00b5fc, 0x000000, 0x000000, 0x00b5fd,
+ /* ac */ 0x00b5fe, 0x00c4e2, 0x00cebc, 0x000000,
+ /* b0 */ 0x00d0b7, 0x000000, 0x000000, 0x00d0b8,
+ /* b4 */ 0x000000, 0x000000, 0x00d0b9, 0x000000,
+ /* b8 */ 0x000000, 0x8fa1b4, 0x00bfcd, 0x8fa1b5,
+ /* bc */ 0x8fa1b7, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x01fdb ***/
+
+ /* 80 */ 0x00bdba, 0x00bfce, 0x00d0be, 0x8fa1b8,
+ /* 84 */ 0x00d0bc, 0x000000, 0x00d0bd, 0x00b5d8,
+ /* 88 */ 0x8fa1b9, 0x000000, 0x00baa3, 0x00b2f0,
+ /* 8c */ 0x000000, 0x00d0bb, 0x00d0ba, 0x00caa9,
+ /* 90 */ 0x8fa1ba, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00bbc6, 0x00bbc5, 0x00c2be, 0x00d0bf,
+ /* 98 */ 0x00c9d5, 0x00c0e7, 0x8fa1bc, 0x000000,
+ /* 9c */ 0x000000, 0x00a1b8, 0x00d0c0, 0x00d0c2,
+ /* a0 */ 0x000000, 0x00aea8, 0x000000, 0x00c2e5,
+ /* a4 */ 0x00cee1, 0x00b0ca, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fa1bb,
+ /* ac */ 0x000000, 0x00d0c1, 0x00b2be, 0x000000,
+ /* b0 */ 0x00b6c4, 0x8fa1bd, 0x00c3e7, 0x000000,
+ /* b4 */ 0x000000, 0x8fa1be, 0x00b7ef, 0x00d0c3,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00c7a4,
+ /* bc */ 0x000000, 0x00aea9, 0x000000, 0x00aeaa,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x0201b ***/
+
+ /* 80 */ 0x8fa1bf, 0x00b4eb, 0x000000, 0x00aeab,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d0c4, 0x00b0cb, 0x00aeac,
+ /* 8c */ 0x000000, 0x00b8e0, 0x00b4ec, 0x00c9fa,
+ /* 90 */ 0x00c8b2, 0x00b5d9, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fa1c0, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00b2f1, 0x000000,
+ /* 9c */ 0x00d0e7, 0x00c5c1, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00c7ec,
+ /* b0 */ 0x00d0c6, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00c8bc, 0x000000, 0x00cee2, 0x8fa1c2,
+ /* b8 */ 0x00bfad, 0x000000, 0x00bbc7, 0x000000,
+ /* bc */ 0x00bbf7, 0x00b2c0, 0x8fa1c3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x0205a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00c4d1,
+ /* 84 */ 0x000000, 0x000000, 0x00c3a2, 0x00d0ca,
+ /* 88 */ 0x00aeae, 0x00aeaf, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00b0cc, 0x00c4e3, 0x00bdbb,
+ /* 90 */ 0x00bab4, 0x00cda4, 0x000000, 0x00c2ce,
+ /* 94 */ 0x8fa1c4, 0x00b2bf, 0x00aeb0, 0x00d0c9,
+ /* 98 */ 0x8fa1c5, 0x00cdbe, 0x00d0c5, 0x00d0c7,
+ /* 9c */ 0x00baee, 0x00d0c8, 0x00d5a4, 0x00aeb1,
+ /* a0 */ 0x00aead, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fa1c1, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d0d0, 0x00aeb2, 0x000000,
+ /* ac */ 0x00aeb3, 0x000000, 0x000000, 0x00d0d3,
+ /* b0 */ 0x00d0d1, 0x000000, 0x000000, 0x00b2c2,
+ /* b4 */ 0x000000, 0x00cabb, 0x00d0cb, 0x8fa1c7,
+ /* b8 */ 0x8fa1c8, 0x000000, 0x8fa1c9, 0x00d0cf,
+ /* bc */ 0x00b8f3, 0x8fa1ca, 0x00aeb4, 0x00bbc8,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x0209a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fa1cb, 0x00b4a6,
+ /* 84 */ 0x000000, 0x8fa1cc, 0x00d0d4, 0x000000,
+ /* 88 */ 0x00d0cc, 0x000000, 0x00aeb5, 0x00cee3,
+ /* 8c */ 0x000000, 0x00bbf8, 0x000000, 0x00d0cd,
+ /* 90 */ 0x000000, 0x00d0d2, 0x8fa1cd, 0x000000,
+ /* 94 */ 0x00aeb6, 0x000000, 0x00d0d5, 0x00aeb7,
+ /* 98 */ 0x00d0ce, 0x000000, 0x8fa1ce, 0x00b6a1,
+ /* 9c */ 0x000000, 0x00b0cd, 0x000000, 0x000000,
+ /* a0 */ 0x00b6a2, 0x00b2c1, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00d5a5,
+ /* ac */ 0x000000, 0x00cbf9, 0x00c9ee, 0x00b8f4,
+ /* b0 */ 0x000000, 0x000000, 0x8fa1d0, 0x000000,
+ /* b4 */ 0x000000, 0x00bfaf, 0x00ceb7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fa1d1, 0x00cad8,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x020da ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00b7b8, 0x00c2a5,
+ /* 84 */ 0x00b2e4, 0x8fa1d2, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00aeb9, 0x00bdd3, 0x8fa1d3,
+ /* 8c */ 0x000000, 0x000000, 0x00d0d9, 0x8fa1d4,
+ /* 90 */ 0x00d0de, 0x00d0dc, 0x8fa1d5, 0x000000,
+ /* 94 */ 0x00d0d7, 0x000000, 0x000000, 0x00c2af,
+ /* 98 */ 0x00d0da, 0x000000, 0x00d0dd, 0x00d0db,
+ /* 9c */ 0x000000, 0x00cadd, 0x000000, 0x00d0d8,
+ /* a0 */ 0x00aeba, 0x00bfae, 0x000000, 0x00cbf3,
+ /* a4 */ 0x00d0df, 0x00d0e0, 0x8fa1cf, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00bda4, 0x00d0ed,
+ /* b0 */ 0x000000, 0x00aea1, 0x8fa1d7, 0x00c7d0,
+ /* b4 */ 0x000000, 0x00c9b6, 0x00d0e8, 0x000000,
+ /* b8 */ 0x00caf0, 0x000000, 0x00b2b6, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00d0ec, 0x000000,
+
+ /*** Three byte table, leaf: e580xx - offset 0x0211a ***/
+
+ /* 80 */ 0x8fa1d8, 0x00aebb, 0x00aebc, 0x000000,
+ /* 84 */ 0x000000, 0x00d0e6, 0x00d0ef, 0x000000,
+ /* 88 */ 0x000000, 0x00c1d2, 0x000000, 0x00b8c4,
+ /* 8c */ 0x000000, 0x00c7dc, 0x00aebd, 0x00e0c7,
+ /* 90 */ 0x8fa1d9, 0x00d0ee, 0x00c5dd, 0x8fa1da,
+ /* 94 */ 0x00d0e3, 0x000000, 0x00b8f6, 0x000000,
+ /* 98 */ 0x00aebe, 0x00b8f5, 0x00d0e1, 0x000000,
+ /* 9c */ 0x8fa1db, 0x000000, 0x8fa1dc, 0x00bcda,
+ /* a0 */ 0x000000, 0x00d0e9, 0x8fa1dd, 0x00caef,
+ /* a4 */ 0x00c3cd, 0x00d0e5, 0x00b7f1, 0x00aebf,
+ /* a8 */ 0x00d0e2, 0x00d0ea, 0x00d0e4, 0x00ced1,
+ /* ac */ 0x00d0eb, 0x00cfc1, 0x00aec0, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b6e6, 0x000000,
+ /* b8 */ 0x000000, 0x00b7f0, 0x000000, 0x00aec2,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e581xx - offset 0x0215a ***/
+
+ /* 80 */ 0x00aec1, 0x00aec3, 0x8fa1df, 0x00d0f0,
+ /* 84 */ 0x000000, 0x000000, 0x8fa1e0, 0x00d0f1,
+ /* 88 */ 0x00d0f5, 0x00b0ce, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fa1e1, 0x00cad0,
+ /* 90 */ 0x00d0f4, 0x000000, 0x000000, 0x8fa1e2,
+ /* 94 */ 0x000000, 0x00d0f3, 0x00d0f7, 0x8fa1e3,
+ /* 98 */ 0x000000, 0x000000, 0x00d0f6, 0x000000,
+ /* 9c */ 0x00c4e4, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fa1e4,
+ /* a4 */ 0x000000, 0x00b7f2, 0x8fa1e5, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fa1e6, 0x000000,
+ /* ac */ 0x00d0f8, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fa1e7, 0x000000, 0x00bcc5, 0x000000,
+ /* b4 */ 0x00c2a6, 0x00c4e5, 0x00b6f6, 0x000000,
+ /* b8 */ 0x00d0f9, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00b5b6, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x0219a ***/
+
+ /* 80 */ 0x00d0fa, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00d0fc, 0x000000, 0x000000,
+ /* 88 */ 0x8fa1e9, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00cbb5, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00b7e6, 0x8fa1ea, 0x8fa1eb,
+ /* 94 */ 0x00aec4, 0x8fa1ec, 0x8fa1ed, 0x000000,
+ /* 98 */ 0x00bbb1, 0x00c8f7, 0x00d0fb, 0x000000,
+ /* 9c */ 0x8fa1ee, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fa1e8,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fa1ef, 0x000000,
+ /* ac */ 0x00bac5, 0x00cdc3, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fa1f1, 0x00d0fe, 0x00d1a3,
+ /* b4 */ 0x00d0fd, 0x00bac4, 0x000000, 0x00bdfd,
+ /* b8 */ 0x000000, 0x000000, 0x8fa1f2, 0x8fa1f3,
+ /* bc */ 0x000000, 0x000000, 0x00b7b9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x021d9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d1a4, 0x000000,
+ /* 84 */ 0x8fa1f4, 0x00b6cf, 0x000000, 0x8fa1f5,
+ /* 88 */ 0x000000, 0x00d1a1, 0x00d1a2, 0x000000,
+ /* 8c */ 0x00aec5, 0x00c6af, 0x8fa1f8, 0x00c1fc,
+ /* 90 */ 0x00aec7, 0x00b6a3, 0x000000, 0x000000,
+ /* 94 */ 0x8fa1fa, 0x00cbcd, 0x00d1a5, 0x000000,
+ /* 98 */ 0x000000, 0x8fa1fb, 0x00cebd, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00d1a6, 0x000000,
+ /* a0 */ 0x000000, 0x8fa1fc, 0x000000, 0x00d1a9,
+ /* a4 */ 0x000000, 0x00d1a7, 0x00aec8, 0x00c1ce,
+ /* a8 */ 0x000000, 0x8fa1fd, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00d1a8, 0x00d1aa, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00aec6, 0x8fa1f6,
+ /* b4 */ 0x000000, 0x00d1ac, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00d1ab, 0x000000, 0x00cac8,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e584xx - offset 0x02219 ***/
+
+ /* 80 */ 0x00b5b7, 0x00d1ae, 0x00d1af, 0x00aecb,
+ /* 84 */ 0x00b2af, 0x000000, 0x00aeca, 0x000000,
+ /* 88 */ 0x8fa3a1, 0x00d1ad, 0x000000, 0x00aecc,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00bcf4, 0x000000,
+ /* 94 */ 0x00d1b2, 0x00d1b1, 0x00d1b0, 0x8fa3a3,
+ /* 98 */ 0x00d0d6, 0x000000, 0x00d1b3, 0x8fa3a4,
+ /* 9c */ 0x000000, 0x000000, 0x00aecd, 0x00bdfe,
+ /* a0 */ 0x000000, 0x00d1b4, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00cda5, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00ccd9, 0x000000,
+ /* b4 */ 0x000000, 0x00aece, 0x000000, 0x00d1b6,
+ /* b8 */ 0x000000, 0x000000, 0x00d1b5, 0x00d1b8,
+ /* bc */ 0x00d1b7, 0x000000, 0x000000, 0x00d1b9,
+
+ /*** Three byte table, leaf: e585xx - offset 0x02259 ***/
+
+ /* 80 */ 0x00d1ba, 0x00b0f4, 0x000000, 0x00b8b5,
+ /* 84 */ 0x00b7bb, 0x00bdbc, 0x00c3fb, 0x00b6a4,
+ /* 88 */ 0x00c0e8, 0x00b8f7, 0x00aecf, 0x00b9ee,
+ /* 8c */ 0x00d1bc, 0x00ccc8, 0x00c5c6, 0x000000,
+ /* 90 */ 0x00bbf9, 0x000000, 0x00d1bb, 0x000000,
+ /* 94 */ 0x00d1bd, 0x00aed1, 0x000000, 0x00aed2,
+ /* 98 */ 0x000000, 0x000000, 0x00c5de, 0x000000,
+ /* 9c */ 0x00b3f5, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fa3a6, 0x000000, 0x00d1be, 0x000000,
+ /* a4 */ 0x000000, 0x00c6fe, 0x000000, 0x000000,
+ /* a8 */ 0x00c1b4, 0x00d1c0, 0x00d1c1, 0x00c8ac,
+ /* ac */ 0x00b8f8, 0x00cfbb, 0x00d1c2, 0x000000,
+ /* b0 */ 0x000000, 0x00b6a6, 0x000000, 0x8fa3a8,
+ /* b4 */ 0x000000, 0x00cabc, 0x00c2b6, 0x00b6f1,
+ /* b8 */ 0x00c5b5, 0x000000, 0x000000, 0x8ff4f4,
+ /* bc */ 0x00b7f3, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x02299 ***/
+
+ /* 80 */ 0x00d1c3, 0x000000, 0x00d1c4, 0x8fa3a9,
+ /* 84 */ 0x000000, 0x00c6e2, 0x00b1df, 0x000000,
+ /* 88 */ 0x000000, 0x00d1c7, 0x00bafd, 0x8fa3aa,
+ /* 8c */ 0x00d1c6, 0x00bac6, 0x000000, 0x00d1c8,
+ /* 90 */ 0x00e6ee, 0x00d1c9, 0x00cbc1, 0x00d1ca,
+ /* 94 */ 0x000000, 0x00d1cb, 0x00d1cc, 0x00bee9,
+ /* 98 */ 0x8fa3ac, 0x00bccc, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00aed4, 0x000000, 0x000000,
+ /* a0 */ 0x00b4a7, 0x000000, 0x00d1cf, 0x8fa3ad,
+ /* a4 */ 0x00d1cd, 0x00ccbd, 0x00d1ce, 0x000000,
+ /* a8 */ 0x00c9da, 0x00d1d0, 0x00d1d1, 0x00d1d2,
+ /* ac */ 0x00c5df, 0x8fa3ae, 0x000000, 0x000000,
+ /* b0 */ 0x00d1d6, 0x00d1d4, 0x00d1d5, 0x00d1d3,
+ /* b4 */ 0x00bae3, 0x00d1d7, 0x00ccea, 0x00cee4,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fa3b0, 0x00d1d8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x022d7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00aed5,
+ /* 84 */ 0x00c0a8, 0x00d1d9, 0x00bdda, 0x000000,
+ /* 88 */ 0x000000, 0x00d1da, 0x00aed6, 0x00c3fc,
+ /* 8c */ 0x00cebf, 0x00c5e0, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00d2c5, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00d1db,
+ /* 9c */ 0x00f4a5, 0x00b6c5, 0x00aed7, 0x000000,
+ /* a0 */ 0x00d1dc, 0x00cbde, 0x00aed8, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00bde8, 0x00c2fc,
+ /* a8 */ 0x000000, 0x00d1de, 0x00c6e4, 0x000000,
+ /* ac */ 0x000000, 0x00d1df, 0x00aed9, 0x000000,
+ /* b0 */ 0x00d1e0, 0x00b3ae, 0x000000, 0x8fa3b3,
+ /* b4 */ 0x8fa3b4, 0x00d1e1, 0x00b6a7, 0x000000,
+ /* b8 */ 0x00c6cc, 0x00b1fa, 0x00bdd0, 0x000000,
+ /* bc */ 0x000000, 0x00c8a1, 0x00d1e2, 0x000000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x02317 ***/
+
+ /* 80 */ 0x00c5e1, 0x00aeda, 0x8fa3b5, 0x00bfcf,
+ /* 84 */ 0x00d1e3, 0x000000, 0x00caac, 0x00c0da,
+ /* 88 */ 0x00b4a2, 0x000000, 0x00b4a9, 0x00d1e4,
+ /* 8c */ 0x000000, 0x000000, 0x00d1e6, 0x000000,
+ /* 90 */ 0x000000, 0x00b7ba, 0x8fa3b6, 0x00aedc,
+ /* 94 */ 0x00d1e5, 0x00aedd, 0x8fa3b7, 0x00cef3,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00bde9, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c8bd, 0x00cacc, 0x000000, 0x00d1e7,
+ /* a8 */ 0x000000, 0x00cdf8, 0x00d1e8, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00d1e9, 0x000000,
+ /* b0 */ 0x00c5fe, 0x000000, 0x000000, 0x00d1ea,
+ /* b4 */ 0x000000, 0x000000, 0x00c0a9, 0x00bafe,
+ /* b8 */ 0x00b7f4, 0x00d1eb, 0x00bbc9, 0x00b9ef,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x02354 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00c4e6,
+ /* 84 */ 0x00d1ed, 0x000000, 0x000000, 0x00c2a7,
+ /* 88 */ 0x000000, 0x00aede, 0x00baef, 0x00d1ee,
+ /* 8c */ 0x00d1ef, 0x00c1b0, 0x000000, 0x00d1ec,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d1f1, 0x8fa3b9, 0x00cbb6, 0x00aedf,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00b9e4,
+ /* 9c */ 0x8fa3ba, 0x00affe, 0x00d1f0, 0x000000,
+ /* a0 */ 0x000000, 0x00aee0, 0x000000, 0x00b7f5,
+ /* a4 */ 0x00bade, 0x00c7ed, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d1f4, 0x00d1f2, 0x000000,
+ /* ac */ 0x8fa3bb, 0x000000, 0x000000, 0x00c9fb,
+ /* b0 */ 0x00beea, 0x00d1fb, 0x00b3e4, 0x00d1f5,
+ /* b4 */ 0x00d1f3, 0x00c1cf, 0x000000, 0x8fa3bc,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00d1f7, 0x000000, 0x00d1f6,
+
+ /*** Three byte table, leaf: e58axx - offset 0x02394 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fa3be, 0x00b3c4,
+ /* 84 */ 0x8fa3bd, 0x000000, 0x000000, 0x00b7e0,
+ /* 88 */ 0x00d1fc, 0x00cead, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00d1f8, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00d1fd, 0x00d1fa, 0x00aee1,
+ /* 94 */ 0x00d1f9, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8fa3c0, 0x000000, 0x000000, 0x00cecf,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b8f9,
+ /* a0 */ 0x00b2c3, 0x000000, 0x000000, 0x00cef4,
+ /* a4 */ 0x8fa3c2, 0x000000, 0x8fa3c3, 0x000000,
+ /* a8 */ 0x000000, 0x00bdf5, 0x00c5d8, 0x00b9e5,
+ /* ac */ 0x00d2a2, 0x00d2a3, 0x000000, 0x8fa3c4,
+ /* b0 */ 0x000000, 0x00cee5, 0x000000, 0x000000,
+ /* b4 */ 0x00cfab, 0x00d2a5, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00b8fa, 0x8fa3c5, 0x8fa3c6,
+ /* bc */ 0x00d2a4, 0x000000, 0x00b3af,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58bxx - offset 0x023d3 ***/
+
+ /* 80 */ 0x000000, 0x00d2a6, 0x000000, 0x00cbd6,
+ /* 84 */ 0x000000, 0x00c4bc, 0x000000, 0x00cda6,
+ /* 88 */ 0x00aee2, 0x00cad9, 0x8fa3c7, 0x000000,
+ /* 8c */ 0x00aee4, 0x00d2a7, 0x000000, 0x000000,
+ /* 90 */ 0x00aee5, 0x8fa3c9, 0x00f0d5, 0x000000,
+ /* 94 */ 0x000000, 0x00c6b0, 0x00aee6, 0x00d2a8,
+ /* 98 */ 0x00b4aa, 0x00ccb3, 0x000000, 0x00aee7,
+ /* 9c */ 0x000000, 0x00bea1, 0x00d2a9, 0x00cae7,
+ /* a0 */ 0x00d2ad, 0x000000, 0x00c0aa, 0x00d2aa,
+ /* a4 */ 0x00b6d0, 0x000000, 0x00d2ab, 0x00b4ab,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00aee9, 0x000000, 0x00b7ae, 0x00d2ae,
+ /* b4 */ 0x000000, 0x00d2af, 0x000000, 0x8fa3cb,
+ /* b8 */ 0x00d2b0, 0x00d2b1, 0x00bcdb, 0x00aeea,
+ /* bc */ 0x000000, 0x000000, 0x00b8fb, 0x00ccde,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x02413 ***/
+
+ /* 80 */ 0x00aeeb, 0x00cce8, 0x00c6f7, 0x000000,
+ /* 84 */ 0x000000, 0x00caf1, 0x00d2b2, 0x00aeec,
+ /* 88 */ 0x00d2b3, 0x000000, 0x8fa3cc, 0x8fa3cd,
+ /* 8c */ 0x000000, 0x00d2b5, 0x000000, 0x00d2b7,
+ /* 90 */ 0x00d2b6, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00d2b8, 0x00b2bd, 0x00cbcc,
+ /* 98 */ 0x000000, 0x00bafc, 0x00d2b9, 0x000000,
+ /* 9c */ 0x00aeed, 0x00c1d9, 0x000000, 0x000000,
+ /* a0 */ 0x00bea2, 0x00b6a9, 0x000000, 0x00d2ba,
+ /* a4 */ 0x8fa3ce, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00c8db, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00d2bb,
+ /* b0 */ 0x000000, 0x00d2bc, 0x000000, 0x00d2bd,
+ /* b4 */ 0x000000, 0x8fa3cf, 0x000000, 0x000000,
+ /* b8 */ 0x00d2be, 0x00c9a4, 0x00b6e8, 0x00b0e5,
+ /* bc */ 0x000000, 0x000000, 0x8fa3d0, 0x00c6bf,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x02453 ***/
+
+ /* 80 */ 0x00d2bf, 0x00bdbd, 0x8fa3d1, 0x00c0e9,
+ /* 84 */ 0x000000, 0x00d2c1, 0x00d2c0, 0x00bea3,
+ /* 88 */ 0x00b8e1, 0x00d2c3, 0x00c8be, 0x000000,
+ /* 8c */ 0x000000, 0x00d2c4, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00c8dc, 0x00c2b4, 0x00c2ee,
+ /* 94 */ 0x00b6a8, 0x000000, 0x000000, 0x00c6ee,
+ /* 98 */ 0x00c3b1, 0x000000, 0x00c7ee, 0x000000,
+ /* 9c */ 0x00cbce, 0x000000, 0x00d2c6, 0x000000,
+ /* a0 */ 0x00c0ea, 0x00aeef, 0x000000, 0x00aef0,
+ /* a4 */ 0x000000, 0x000000, 0x00b7b5, 0x8fa3d4,
+ /* a8 */ 0x000000, 0x00d2c7, 0x000000, 0x000000,
+ /* ac */ 0x8fa3d5, 0x000000, 0x00d2c8, 0x00b1ac,
+ /* b0 */ 0x00b0f5, 0x00b4ed, 0x000000, 0x00c2a8,
+ /* b4 */ 0x00b5d1, 0x00cdf1, 0x000000, 0x00d2cb,
+ /* b8 */ 0x00b2b7, 0x000000, 0x8fa3d6, 0x00d2ca,
+ /* bc */ 0x000000, 0x00aef1, 0x000000, 0x00b6aa,
+
+ /*** Three byte table, leaf: e58exx - offset 0x02493 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d2cc, 0x000000,
+ /* 84 */ 0x00ccf1, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00aef2,
+ /* 94 */ 0x000000, 0x000000, 0x00d2cd, 0x000000,
+ /* 98 */ 0x00ced2, 0x000000, 0x00b8fc, 0x000000,
+ /* 9c */ 0x000000, 0x00aef3, 0x000000, 0x00b8b6,
+ /* a0 */ 0x00d2ce, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fa3d7, 0x00d2d0, 0x00d2cf, 0x000000,
+ /* a8 */ 0x00bfdf, 0x00b1b9, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00b1de, 0x00d2d1, 0x000000,
+ /* b0 */ 0x00d2d2, 0x000000, 0x00aef4, 0x00b8b7,
+ /* b4 */ 0x8fa3d8, 0x000000, 0x00d2d3, 0x8fa3da,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b5ee,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x024d3 ***/
+
+ /* 80 */ 0x8fa3db, 0x000000, 0x00bbb2, 0x00d2d4,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00cbf4, 0x00bab5, 0x00b5da, 0x00cda7,
+ /* 8c */ 0x00c1d0, 0x00c8bf, 0x00bcfd, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00bdc7, 0x8fa3df, 0x00bce8, 0x00bcf5,
+ /* 98 */ 0x000000, 0x00bdf6, 0x8fa3e0, 0x00c8c0,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00d2d7,
+ /* a0 */ 0x000000, 0x00b1c3, 0x00c1d1, 0x00b8fd,
+ /* a4 */ 0x00b8c5, 0x00b6e7, 0x000000, 0x000000,
+ /* a8 */ 0x00d2db, 0x00c3a1, 0x00c2fe, 0x00b6ab,
+ /* ac */ 0x00bea4, 0x00d2dc, 0x00d2da, 0x00b2c4,
+ /* b0 */ 0x00c2e6, 0x00bcb8, 0x00bbcb, 0x00b1a6,
+ /* b4 */ 0x8fa3e2, 0x8fa3e3, 0x00b3f0, 0x00b9e6,
+ /* b8 */ 0x00bbca, 0x000000, 0x00d2dd, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x02512 ***/
+
+ /* 80 */ 0x000000, 0x00d2de, 0x000000, 0x00b5c9,
+ /* 84 */ 0x00b3c6, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00b9e7, 0x00b5c8, 0x00c4df, 0x00b1a5,
+ /* 8c */ 0x00c6b1, 0x00ccbe, 0x00b9a1, 0x00cdf9,
+ /* 90 */ 0x00c5c7, 0x00b8fe, 0x00aef5, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00b7af,
+ /* 9c */ 0x000000, 0x00d2e7, 0x00cffe, 0x00b6e3,
+ /* a0 */ 0x00cbca, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fa3e5, 0x000000, 0x00c8dd, 0x00aef6,
+ /* a8 */ 0x8fa3e6, 0x00d2e6, 0x000000, 0x00b4de,
+ /* ac */ 0x00d2e1, 0x00d2e2, 0x00d2e4, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00d2e5, 0x000000,
+ /* b8 */ 0x00b5db, 0x00bfe1, 0x000000, 0x00caad,
+ /* bc */ 0x00d2e3, 0x00d2df, 0x00b8e3, 0x000000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x02552 ***/
+
+ /* 80 */ 0x00d2e0, 0x000000, 0x00cfa4, 0x8fa3e8,
+ /* 84 */ 0x000000, 0x000000, 0x00caf2, 0x000000,
+ /* 88 */ 0x00c4e8, 0x00b8e2, 0x00b9f0, 0x000000,
+ /* 8c */ 0x000000, 0x00aef7, 0x00d2e8, 0x000000,
+ /* 90 */ 0x000000, 0x00c6dd, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fa3e4, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00d2ec,
+ /* a0 */ 0x000000, 0x000000, 0x8fa3e9, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fa3ea, 0x000000,
+ /* a8 */ 0x00bcfe, 0x000000, 0x00bcf6, 0x00aef9,
+ /* ac */ 0x8fa3eb, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d2ef, 0x00d2ed, 0x000000, 0x00cca3,
+ /* b4 */ 0x00aefa, 0x00d2ea, 0x00d2f3, 0x00d2ee,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00d2f1,
+ /* bc */ 0x00b8c6, 0x00ccbf, 0x000000, 0x00aefb,
+
+ /*** Three byte table, leaf: e592xx - offset 0x02592 ***/
+
+ /* 80 */ 0x00d2f2, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00d2f4, 0x000000, 0x00d2f6, 0x000000,
+ /* 88 */ 0x00aefc, 0x000000, 0x8fa3ec, 0x00baf0,
+ /* 8c */ 0x00cfc2, 0x8fa3ed, 0x00d2eb, 0x00d2e9,
+ /* 90 */ 0x00d2f5, 0x000000, 0x00d2f0, 0x000000,
+ /* 94 */ 0x000000, 0x8fa3ee, 0x00aefd, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00aef8, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fa3ef, 0x00aefe, 0x00d2f8, 0x000000,
+ /* a4 */ 0x00d3a3, 0x00d2fa, 0x8fa3f0, 0x000000,
+ /* a8 */ 0x00d2fe, 0x00afa1, 0x000000, 0x00d3a1,
+ /* ac */ 0x00d2fb, 0x8fa3f1, 0x8fa3f2, 0x00d3be,
+ /* b0 */ 0x000000, 0x000000, 0x00bae9, 0x00b3b1,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fa3f3,
+ /* b8 */ 0x00d2f9, 0x000000, 0x8fa3f4, 0x000000,
+ /* bc */ 0x00d3a5, 0x00b0f6, 0x00d3a4, 0x8fa3f5,
+
+ /*** Three byte table, leaf: e593xx - offset 0x025d2 ***/
+
+ /* 80 */ 0x00b0a5, 0x00c9ca, 0x00d3a2, 0x8fa3f6,
+ /* 84 */ 0x00d2fc, 0x000000, 0x00afa2, 0x00d2f7,
+ /* 88 */ 0x00d2fd, 0x00bac8, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00d3a6, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00b0f7, 0x00d3af, 0x000000,
+ /* a4 */ 0x000000, 0x00d3a7, 0x00d3a8, 0x000000,
+ /* a8 */ 0x00bea5, 0x00cbe9, 0x000000, 0x000000,
+ /* ac */ 0x8fa3f8, 0x00d3ad, 0x00d3ac, 0x8fa3f9,
+ /* b0 */ 0x000000, 0x8fa3fa, 0x00c5af, 0x8fa3fb,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d3ae, 0x000000,
+ /* bc */ 0x000000, 0x00d3ab, 0x000000, 0x00afa3,
+
+ /*** Three byte table, leaf: e594xx - offset 0x02612 ***/
+
+ /* 80 */ 0x8fa3fc, 0x8fa3fd, 0x000000, 0x000000,
+ /* 84 */ 0x00b1b4, 0x000000, 0x00bab6, 0x00bfb0,
+ /* 88 */ 0x000000, 0x8fa3fe, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00afa4, 0x00d3a9,
+ /* 90 */ 0x00c5e2, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d3aa, 0x000000, 0x00b0a2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00afa5,
+ /* ac */ 0x000000, 0x000000, 0x00d3b4, 0x00cda3,
+ /* b0 */ 0x000000, 0x00bea7, 0x000000, 0x00d3ba,
+ /* b4 */ 0x000000, 0x00afa6, 0x000000, 0x000000,
+ /* b8 */ 0x00d3b9, 0x00d3b0, 0x000000, 0x000000,
+ /* bc */ 0x8fa4a1, 0x000000, 0x00c2c3, 0x000000,
+
+ /*** Three byte table, leaf: e595xx - offset 0x02652 ***/
+
+ /* 80 */ 0x00d3b1, 0x8fa4a2, 0x000000, 0x000000,
+ /* 84 */ 0x00c2ef, 0x00d3b6, 0x00bea6, 0x8fa4a4,
+ /* 88 */ 0x000000, 0x000000, 0x8fa4a5, 0x000000,
+ /* 8c */ 0x00d3b3, 0x000000, 0x000000, 0x00cce4,
+ /* 90 */ 0x00afa7, 0x000000, 0x000000, 0x00b7bc,
+ /* 94 */ 0x000000, 0x000000, 0x00d3b7, 0x00d3b8,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00d3b5, 0x00d3bb, 0x00afa8, 0x000000,
+ /* a0 */ 0x8fa4a7, 0x8fa4a8, 0x000000, 0x00d3b2,
+ /* a4 */ 0x8fa4a9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00d3c1,
+ /* bc */ 0x00d3c6, 0x8fa4ab, 0x00d3c2, 0x000000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x02692 ***/
+
+ /* 80 */ 0x00d3bd, 0x00afa9, 0x8fa4ac, 0x00d3c7,
+ /* 84 */ 0x00c1b1, 0x000000, 0x00afaa, 0x00d3c9,
+ /* 88 */ 0x8fa4ad, 0x00b9a2, 0x00d3bf, 0x00c3fd,
+ /* 8c */ 0x000000, 0x000000, 0x00afab, 0x000000,
+ /* 90 */ 0x000000, 0x8fa4ae, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00d3c3, 0x00d3bc, 0x00b4ad, 0x000000,
+ /* 9c */ 0x00b4ee, 0x00b3e5, 0x00d3c4, 0x00d3c0,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00b7f6,
+ /* a8 */ 0x00d3ca, 0x00d3c8, 0x00c1d3, 0x00b5ca,
+ /* ac */ 0x00b6ac, 0x00afad, 0x00d3c5, 0x000000,
+ /* b0 */ 0x00b6f4, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b1c4, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fa4b3,
+
+ /*** Three byte table, leaf: e597xx - offset 0x026d2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00d3ce, 0x00d3cc, 0x000000, 0x00d4a7,
+ /* 88 */ 0x000000, 0x8fa4b4, 0x000000, 0x000000,
+ /* 8c */ 0x8fa4b5, 0x000000, 0x00afae, 0x000000,
+ /* 90 */ 0x000000, 0x8fa4b6, 0x8fa4b0, 0x000000,
+ /* 94 */ 0x00d3d1, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00d3cb, 0x000000,
+ /* 9c */ 0x00d3cf, 0x8fa4b7, 0x000000, 0x00d3cd,
+ /* a0 */ 0x000000, 0x000000, 0x8fa4b9, 0x00bbcc,
+ /* a4 */ 0x00d3d0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fa4bb, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00d3d3,
+ /* b8 */ 0x000000, 0x00d3d8, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00d3d6, 0x00d3d5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x02711 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00c3b2, 0x8fa4be,
+ /* 88 */ 0x00afb0, 0x00b2c5, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00afb1, 0x000000,
+ /* 90 */ 0x8fa4bf, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d3d2, 0x000000, 0x00d3d4, 0x00bea8,
+ /* 98 */ 0x00b1b3, 0x000000, 0x000000, 0x00d3d7,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa4bc, 0x00b2de, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00d3e2,
+ /* b0 */ 0x8fa4c0, 0x00befc, 0x00d3de, 0x000000,
+ /* b4 */ 0x00d3dc, 0x000000, 0x00d3dd, 0x8fa4c1,
+ /* b8 */ 0x00d3df, 0x000000, 0x000000, 0x00afb2,
+ /* bc */ 0x000000, 0x8fa4c3, 0x000000, 0x8fa4c4,
+
+ /*** Three byte table, leaf: e599xx - offset 0x02751 ***/
+
+ /* 80 */ 0x8fa4c5, 0x000000, 0x00b1bd, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fa4c6,
+ /* 88 */ 0x000000, 0x00afb3, 0x000000, 0x000000,
+ /* 8c */ 0x00c1b9, 0x000000, 0x00d3d9, 0x000000,
+ /* 90 */ 0x00d3da, 0x000000, 0x000000, 0x00f4a7,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00b3fa,
+ /* 9c */ 0x000000, 0x000000, 0x8fa4c7, 0x000000,
+ /* a0 */ 0x8fa4c8, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00d3e1, 0x000000, 0x00afb5, 0x000000,
+ /* a8 */ 0x00b4ef, 0x000000, 0x00d3e4, 0x00d3e0,
+ /* ac */ 0x00d3e3, 0x8fa4c9, 0x000000, 0x00afb7,
+ /* b0 */ 0x000000, 0x00afb8, 0x00afb9, 0x000000,
+ /* b4 */ 0x00caae, 0x000000, 0x00afb4, 0x000000,
+ /* b8 */ 0x00c6d5, 0x000000, 0x00c8b8, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59axx - offset 0x02791 ***/
+
+ /* 80 */ 0x00d3e6, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00d3e5, 0x00b3c5,
+ /* 88 */ 0x8fa4cb, 0x000000, 0x00d3e7, 0x000000,
+ /* 8c */ 0x8fa4cc, 0x000000, 0x000000, 0x00d3ea,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d3e9, 0x8fa4cd, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00afba, 0x8fa4ce, 0x000000,
+ /* 9c */ 0x000000, 0x8fa4cf, 0x00afbb, 0x000000,
+ /* a0 */ 0x00d3e8, 0x000000, 0x00c7b9, 0x000000,
+ /* a4 */ 0x000000, 0x00d3eb, 0x000000, 0x000000,
+ /* a8 */ 0x8fa4d0, 0x00afbc, 0x000000, 0x000000,
+ /* ac */ 0x00afbd, 0x8fa4d1, 0x00d3ec, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fa4d2, 0x00afbe,
+ /* b4 */ 0x00d3ee, 0x000000, 0x00d3ed, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00d3f0, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x027d1 ***/
+
+ /* 80 */ 0x00d3f3, 0x00d3f1, 0x00d3ef, 0x00d3f2,
+ /* 84 */ 0x000000, 0x8fa4d3, 0x000000, 0x000000,
+ /* 88 */ 0x00d3f4, 0x00afbf, 0x00afc0, 0x000000,
+ /* 8c */ 0x000000, 0x8fa4d4, 0x00d3f5, 0x000000,
+ /* 90 */ 0x000000, 0x00d3f6, 0x000000, 0x00d3f7,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00d3f8,
+ /* 98 */ 0x00d1c5, 0x000000, 0x00bcfc, 0x00bbcd,
+ /* 9c */ 0x000000, 0x000000, 0x00b2f3, 0x8fa4d5,
+ /* a0 */ 0x00b0f8, 0x000000, 0x000000, 0x00c3c4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa4d6, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00d3f9, 0x000000,
+ /* b0 */ 0x00baa4, 0x000000, 0x00b0cf, 0x00bfde,
+ /* b4 */ 0x000000, 0x000000, 0x8fa4d7, 0x8fa4d8,
+ /* b8 */ 0x000000, 0x00d3fa, 0x00b8c7, 0x000000,
+ /* bc */ 0x000000, 0x00b9f1, 0x000000, 0x00d3fc,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x02811 ***/
+
+ /* 80 */ 0x00d3fb, 0x000000, 0x000000, 0x00cae0,
+ /* 84 */ 0x00d3fd, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00d4a1, 0x00d3fe, 0x00afc1, 0x00d4a2,
+ /* 8c */ 0x000000, 0x00d4a3, 0x000000, 0x00b7f7,
+ /* 90 */ 0x000000, 0x000000, 0x00b1e0, 0x00d4a4,
+ /* 94 */ 0x000000, 0x8fa4da, 0x00d4a6, 0x000000,
+ /* 98 */ 0x00d4a5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00d4a8, 0x000000, 0x000000, 0x00c5da,
+ /* a0 */ 0x000000, 0x00afc3, 0x000000, 0x8fa4db,
+ /* a4 */ 0x000000, 0x000000, 0x00d4a9, 0x00b0b5,
+ /* a8 */ 0x00badf, 0x8fa4dd, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00b7bd, 0x000000, 0x00afc4,
+ /* b0 */ 0x00c3cf, 0x000000, 0x000000, 0x00afc5,
+ /* b4 */ 0x00afc6, 0x000000, 0x000000, 0x00d4aa,
+ /* b8 */ 0x00d4ab, 0x000000, 0x000000, 0x00d4ad,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x02851 ***/
+
+ /* 80 */ 0x00d4ae, 0x000000, 0x00bae4, 0x000000,
+ /* 84 */ 0x000000, 0x8fa4df, 0x8fa4e0, 0x00b6d1,
+ /* 88 */ 0x000000, 0x000000, 0x00cbb7, 0x000000,
+ /* 8c */ 0x8fa4e1, 0x8fa4e2, 0x00d4ac, 0x00d4af,
+ /* 90 */ 0x00bac1, 0x00b9a3, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00d4b3, 0x000000, 0x000000,
+ /* a4 */ 0x00baa5, 0x000000, 0x00c3b3, 0x000000,
+ /* a8 */ 0x8fa4e4, 0x00d4b0, 0x00c4da, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fa4e5,
+ /* b0 */ 0x00afc7, 0x000000, 0x000000, 0x8fa4e6,
+ /* b4 */ 0x8fa4e7, 0x8fa4e8, 0x000000, 0x00afc8,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8fa4e9,
+ /* bc */ 0x00afc9, 0x000000, 0x000000, 0x00d4b4,
+
+ /*** Three byte table, leaf: e59exx - offset 0x02891 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00bfe2, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00d4b2, 0x00d4b5, 0x000000, 0x00b7bf,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00d4b6,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fa4ed, 0x000000,
+ /* 9c */ 0x00afca, 0x8fa4ee, 0x8fa4ef, 0x000000,
+ /* a0 */ 0x00d4b7, 0x000000, 0x00b9a4, 0x00b3c0,
+ /* a4 */ 0x00d4b9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa4f0, 0x000000, 0x00d4ba, 0x000000,
+ /* ac */ 0x8fa4ec, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d4bb, 0x000000, 0x000000, 0x00d4b8,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00afcd, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x028d1 ***/
+
+ /* 80 */ 0x00d4b1, 0x000000, 0x000000, 0x00d4bc,
+ /* 84 */ 0x000000, 0x000000, 0x00d4bd, 0x00afce,
+ /* 88 */ 0x00afcf, 0x000000, 0x000000, 0x00cbe4,
+ /* 8c */ 0x8fa4f3, 0x000000, 0x00beeb, 0x00afd0,
+ /* 90 */ 0x000000, 0x000000, 0x00d4bf, 0x00d4c0,
+ /* 94 */ 0x00d4be, 0x000000, 0x00d4c2, 0x8fa4f1,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c7b8, 0x000000, 0x8fa4f6, 0x00b0e8,
+ /* a0 */ 0x00c9d6, 0x000000, 0x000000, 0x00d4c3,
+ /* a4 */ 0x00afd1, 0x000000, 0x8fa4f7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00afd2, 0x000000, 0x000000,
+ /* b0 */ 0x8fa4f8, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00befd, 0x00afd3, 0x00afd4, 0x00bcb9,
+ /* b8 */ 0x8fa4fa, 0x00c7dd, 0x00b4f0, 0x8fa4fb,
+ /* bc */ 0x00baeb, 0x8fa4fc, 0x000000, 0x00afd5,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x02911 ***/
+
+ /* 80 */ 0x00cbd9, 0x000000, 0x00c6b2, 0x000000,
+ /* 84 */ 0x8fa4fd, 0x00b7f8, 0x00c2cf, 0x000000,
+ /* 88 */ 0x000000, 0x00afd6, 0x00d4c1, 0x00d4c4,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c2c4, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d4c5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00d4c6, 0x8fa4fe, 0x000000,
+ /* a0 */ 0x8fa5a1, 0x00d4c8, 0x000000, 0x000000,
+ /* a4 */ 0x00c4e9, 0x000000, 0x000000, 0x8fa5a2,
+ /* a8 */ 0x000000, 0x000000, 0x00b4ae, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00f4a1,
+ /* b0 */ 0x00b1e1, 0x00caf3, 0x8fa5a3, 0x000000,
+ /* b4 */ 0x00beec, 0x00c5c8, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fa5a4, 0x00bae6, 0x000000,
+ /* bc */ 0x000000, 0x00d4ce, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x02951 ***/
+
+ /* 80 */ 0x00cabd, 0x00cedd, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8fa5a6, 0x00b2f4, 0x00d4ca,
+ /* 8c */ 0x8fa5a7, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00c1ba, 0x00d4cd, 0x000000,
+ /* 94 */ 0x00c5e3, 0x000000, 0x000000, 0x00c5c9,
+ /* 98 */ 0x00c5e4, 0x00c8b9, 0x00c4cd, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00bac9, 0x000000,
+ /* a0 */ 0x000000, 0x00afd8, 0x00d4c9, 0x000000,
+ /* a4 */ 0x00afd9, 0x000000, 0x000000, 0x8fa5a8,
+ /* a8 */ 0x000000, 0x00b1f6, 0x000000, 0x00c5b6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d4cb, 0x000000, 0x00d4c7, 0x000000,
+ /* b4 */ 0x000000, 0x00bfd0, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00d4cf, 0x000000, 0x000000,
+ /* bc */ 0x00afdb, 0x000000, 0x00bdce,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x02990 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b6ad,
+ /* 84 */ 0x000000, 0x00d4d0, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00afdc, 0x8fa5a9, 0x8fa5aa,
+ /* 8c */ 0x000000, 0x8fa5ab, 0x000000, 0x8fa5ac,
+ /* 90 */ 0x8fa5ad, 0x000000, 0x000000, 0x00cae8,
+ /* 94 */ 0x8fa5ae, 0x000000, 0x000000, 0x00c1fd,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c4c6, 0x8fa5af, 0x00afdd, 0x00d4d2,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00cbcf, 0x00afdf, 0x8fa5b0, 0x00d4d3,
+ /* ac */ 0x000000, 0x000000, 0x00d4d8, 0x000000,
+ /* b0 */ 0x000000, 0x8fa5b1, 0x000000, 0x00caaf,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00d4d7, 0x00d4d1, 0x00d4d4, 0x00d4d6,
+ /* bc */ 0x000000, 0x000000, 0x00baa6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x029cf ***/
+
+ /* 80 */ 0x000000, 0x00cac9, 0x000000, 0x8fa5b3,
+ /* 84 */ 0x000000, 0x00d4d9, 0x000000, 0x00c3c5,
+ /* 88 */ 0x000000, 0x000000, 0x00b2f5, 0x000000,
+ /* 8c */ 0x00beed, 0x8fa5b4, 0x00afe2, 0x000000,
+ /* 90 */ 0x000000, 0x00d4db, 0x00afe1, 0x00d4da,
+ /* 94 */ 0x00afe3, 0x00b9e8, 0x000000, 0x00d4dc,
+ /* 98 */ 0x00d4de, 0x00d4dd, 0x00afe4, 0x000000,
+ /* 9c */ 0x00d4e0, 0x000000, 0x00d4d5, 0x00d4e2,
+ /* a0 */ 0x00afe5, 0x000000, 0x8fa5b5, 0x000000,
+ /* a4 */ 0x00d4e1, 0x00d4df, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00afe6, 0x000000, 0x00bbce,
+ /* ac */ 0x00bfd1, 0x000000, 0x00c1d4, 0x00d4e3,
+ /* b0 */ 0x00c0bc, 0x00b0ed, 0x00c7e4, 0x8fa5b6,
+ /* b4 */ 0x8fa5b7, 0x000000, 0x000000, 0x00c4db,
+ /* b8 */ 0x000000, 0x00d4e5, 0x00d4e4, 0x00d4e6,
+ /* bc */ 0x00d4e7, 0x00d4e8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x02a0d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d4e9, 0x000000,
+ /* 84 */ 0x000000, 0x8fa5b8, 0x8fa5b9, 0x000000,
+ /* 88 */ 0x000000, 0x00cad1, 0x00d4ea, 0x8fa5ba,
+ /* 8c */ 0x00afe7, 0x8fa5bb, 0x000000, 0x00b2c6,
+ /* 90 */ 0x00d4eb, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fa5bc, 0x00cdbc, 0x00b3b0, 0x000000,
+ /* 98 */ 0x00d2c9, 0x00bdc8, 0x00c2bf, 0x00d4ec,
+ /* 9c */ 0x00cceb, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00ccb4, 0x000000,
+ /* a4 */ 0x8fa5bd, 0x00d4ee, 0x000000, 0x00c2e7,
+ /* a8 */ 0x000000, 0x00c5b7, 0x00c2c0, 0x00c9d7,
+ /* ac */ 0x00d4ef, 0x00d4f0, 0x00b1fb, 0x000000,
+ /* b0 */ 0x000000, 0x00bcba, 0x00d4f1, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00b0d0,
+ /* b8 */ 0x00d4f2, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fa5c0, 0x00d4f3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x02a4c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00b1e2, 0x000000, 0x8fa5c2, 0x00b4f1,
+ /* 88 */ 0x00c6e0, 0x00caf4, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00d4f7, 0x00c1d5,
+ /* 90 */ 0x00d4f6, 0x00b7c0, 0x000000, 0x000000,
+ /* 94 */ 0x00cbdb, 0x00d4f5, 0x000000, 0x00c5e5,
+ /* 98 */ 0x00d4f9, 0x000000, 0x00d4f8, 0x8fa5c5,
+ /* 9c */ 0x000000, 0x00afe9, 0x000000, 0x8fa5c6,
+ /* a0 */ 0x00d4fb, 0x000000, 0x00d4fa, 0x000000,
+ /* a4 */ 0x000000, 0x00b1fc, 0x000000, 0x00d4fc,
+ /* a8 */ 0x00bea9, 0x00d4fe, 0x00c3a5, 0x000000,
+ /* ac */ 0x00d4fd, 0x00afea, 0x00cab3, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00bdf7,
+ /* b4 */ 0x00c5db, 0x8fa5c8, 0x8fa5c9, 0x000000,
+ /* b8 */ 0x00d5a1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fa5ca, 0x00b9a5, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x02a8b ***/
+
+ /* 80 */ 0x000000, 0x00d5a2, 0x00c7a1, 0x00c8de,
+ /* 84 */ 0x00ccd1, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00c7a5, 0x00afeb,
+ /* 8c */ 0x000000, 0x00d5ab, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00afec, 0x00b5b8,
+ /* 94 */ 0x000000, 0x000000, 0x00cdc5, 0x000000,
+ /* 98 */ 0x000000, 0x00ccaf, 0x000000, 0x00d6ac,
+ /* 9c */ 0x000000, 0x00d5a3, 0x000000, 0x8fa5cb,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00d5a6,
+ /* a4 */ 0x00afed, 0x00c2c5, 0x000000, 0x000000,
+ /* a8 */ 0x00cbb8, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c5ca, 0x000000, 0x8fa5cc, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00d5a7, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00cbe5, 0x000000, 0x00baca,
+ /* bc */ 0x8fa5cd, 0x000000, 0x00beaa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x02aca ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00afee,
+ /* 84 */ 0x000000, 0x000000, 0x00d5a8, 0x000000,
+ /* 88 */ 0x8fa5ce, 0x00bbd0, 0x000000, 0x00bbcf,
+ /* 8c */ 0x000000, 0x8fa5cf, 0x000000, 0x000000,
+ /* 90 */ 0x00b0b9, 0x00b8c8, 0x00afef, 0x00c0ab,
+ /* 94 */ 0x00b0d1, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d5ac, 0x00d5ad, 0x000000,
+ /* 9c */ 0x00d5aa, 0x00aff0, 0x8fa5d0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fa5d1,
+ /* a4 */ 0x8fa5d2, 0x00b1b8, 0x00b4af, 0x8fa5d3,
+ /* a8 */ 0x00d5a9, 0x000000, 0x00ccc5, 0x00c9b1,
+ /* ac */ 0x000000, 0x000000, 0x8fa5d4, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b0a8, 0x000000,
+ /* b8 */ 0x00fefa, 0x000000, 0x000000, 0x00b0f9,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00bbd1,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x02b0a ***/
+
+ /* 80 */ 0x000000, 0x00b0d2, 0x000000, 0x00b0a3,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d5b2, 0x000000, 0x000000,
+ /* 8c */ 0x8fa5d8, 0x8fa5d9, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00d5b0, 0x000000, 0x00aff1,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fa5da,
+ /* 98 */ 0x00ccbc, 0x000000, 0x00d5b3, 0x000000,
+ /* 9c */ 0x00d5b1, 0x000000, 0x000000, 0x00d5af,
+ /* a0 */ 0x00bfb1, 0x000000, 0x000000, 0x00aff2,
+ /* a4 */ 0x000000, 0x00d5ae, 0x000000, 0x8fa5db,
+ /* a8 */ 0x000000, 0x00cada, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fa5dc, 0x000000, 0x00b8e4,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00d5b7, 0x00d5b8, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00beab, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x02b4a ***/
+
+ /* 80 */ 0x00d5b4, 0x00cfac, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00c7cc, 0x000000,
+ /* 88 */ 0x000000, 0x00d5b6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fa5dd, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00baa7, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00d5b9, 0x000000,
+ /* a4 */ 0x000000, 0x8fa5de, 0x00c9d8, 0x00aff3,
+ /* a8 */ 0x000000, 0x000000, 0x00d5ba, 0x000000,
+ /* ac */ 0x00d5b5, 0x00aff4, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00aff5,
+ /* b8 */ 0x000000, 0x000000, 0x8fa5df, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00aff6, 0x00ccbb,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x02b8a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00aff7, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fa5e0,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00c7de, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00d5bb, 0x00c9b2,
+ /* 9c */ 0x8fa5e1, 0x000000, 0x00aff8, 0x8fa5e2,
+ /* a0 */ 0x8fa5e3, 0x000000, 0x8fa5e4, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00aff9,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fa5e5, 0x000000, 0x8fa5e6,
+ /* b4 */ 0x000000, 0x8fa5e7, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fa5e8, 0x000000,
+ /* bc */ 0x00d5bc, 0x00d5c0, 0x00d5bd, 0x8fa5e9,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x02bca ***/
+
+ /* 80 */ 0x000000, 0x00b2c7, 0x00d5bf, 0x000000,
+ /* 84 */ 0x00affa, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00bcbb, 0x000000, 0x00d5be,
+ /* 8c */ 0x00b7f9, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00d5cc, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00d5c5, 0x00d5c2,
+ /* 98 */ 0x000000, 0x000000, 0x8fa5ea, 0x000000,
+ /* 9c */ 0x8fa5eb, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fa5ec, 0x00c3e4, 0x000000, 0x00d5c1,
+ /* a4 */ 0x000000, 0x8fa5ed, 0x00d5c3, 0x000000,
+ /* a8 */ 0x000000, 0x00d5c4, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fa5ef, 0x000000,
+ /* b0 */ 0x8fa5ee, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fa5f0, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d5c6, 0x00d5c7,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x02c0a ***/
+
+ /* 80 */ 0x8fa5f1, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fa5f2, 0x00b4f2, 0x000000, 0x00d5c9,
+ /* 8c */ 0x00d5c8, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00d5ca, 0x8fa5f3,
+ /* 98 */ 0x000000, 0x00affc, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00beee, 0x000000,
+ /* a4 */ 0x000000, 0x00affd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00d5cd, 0x000000,
+ /* ac */ 0x00c4dc, 0x8fa5f5, 0x000000, 0x000000,
+ /* b0 */ 0x00b1c5, 0x000000, 0x00d5cb, 0x000000,
+ /* b4 */ 0x8fa5f4, 0x000000, 0x00d5ce, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00d5cf, 0x000000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x02c4a ***/
+
+ /* 80 */ 0x00d5d2, 0x00cfd5, 0x000000, 0x00d5d0,
+ /* 84 */ 0x000000, 0x00d5d1, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fa5f6, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bbd2, 0x00d5d3, 0x8fa5f7, 0x000000,
+ /* 94 */ 0x00b9a6, 0x00d5d4, 0x00cfd6, 0x00bbfa,
+ /* 98 */ 0x00c2b8, 0x000000, 0x00d5d5, 0x00d5d6,
+ /* 9c */ 0x00bbda, 0x00b9a7, 0x000000, 0x00ccd2,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00b5a8,
+ /* a4 */ 0x00b8c9, 0x00d5d7, 0x00b3d8, 0x000000,
+ /* a8 */ 0x8fa5f8, 0x00d5d8, 0x000000, 0x00c2b9,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fa5f9,
+ /* b0 */ 0x00d5d9, 0x00d6a3, 0x000000, 0x00d5da,
+ /* b4 */ 0x000000, 0x00d5db, 0x000000, 0x000000,
+ /* b8 */ 0x00d5dc, 0x000000, 0x00d5de, 0x000000,
+ /* bc */ 0x8fa5fa, 0x00cfd7, 0x000000, 0x8fa5fb,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x02c8a ***/
+
+ /* 80 */ 0x00d5df, 0x8fa5fc, 0x000000, 0x00d5e0,
+ /* 84 */ 0x8fa5fd, 0x00c2f0, 0x000000, 0x00b1a7,
+ /* 88 */ 0x00bce9, 0x00b0c2, 0x000000, 0x00c1d7,
+ /* 8c */ 0x00b4b0, 0x00bcb5, 0x000000, 0x00b9a8,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00cfd8,
+ /* 94 */ 0x000000, 0x00c5e6, 0x8fa8a1, 0x00bda1,
+ /* 98 */ 0x00b4b1, 0x00c3e8, 0x00c4ea, 0x00b0b8,
+ /* 9c */ 0x00b5b9, 0x00caf5, 0x000000, 0x00bcc2,
+ /* a0 */ 0x000000, 0x000000, 0x00b5d2, 0x00c0eb,
+ /* a4 */ 0x00bcbc, 0x00cda8, 0x00d5e1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fa8a2, 0x000000, 0x00b5dc, 0x000000,
+ /* b0 */ 0x00bacb, 0x000000, 0x000000, 0x00b3b2,
+ /* b4 */ 0x00b1e3, 0x00beac, 0x00b2c8, 0x000000,
+ /* b8 */ 0x00d5e2, 0x00cdc6, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00bdc9,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x02cca ***/
+
+ /* 80 */ 0x8fa8a4, 0x000000, 0x00bce4, 0x00d5e3,
+ /* 84 */ 0x00b4f3, 0x00c6d2, 0x00cca9, 0x00d5e4,
+ /* 88 */ 0x000000, 0x00d5e5, 0x000000, 0x000000,
+ /* 8c */ 0x00c9d9, 0x000000, 0x8fa8a6, 0x000000,
+ /* 90 */ 0x00d5e7, 0x000000, 0x00b4a8, 0x00b6f7,
+ /* 94 */ 0x00d5e6, 0x000000, 0x8fa8a7, 0x000000,
+ /* 98 */ 0x00cfd9, 0x000000, 0x000000, 0x00b4b2,
+ /* 9c */ 0x000000, 0x00bfb2, 0x00d5eb, 0x00bba1,
+ /* a0 */ 0x000000, 0x00b2c9, 0x00d5ea, 0x000000,
+ /* a4 */ 0x00d5e8, 0x00d5ec, 0x00d5e9, 0x00c7ab,
+ /* a8 */ 0x00dccd, 0x00bfb3, 0x000000, 0x00d5ed,
+ /* ac */ 0x00cfda, 0x000000, 0x00cec0, 0x000000,
+ /* b0 */ 0x00d5ee, 0x8fa8aa, 0x000000, 0x00d5f0,
+ /* b4 */ 0x000000, 0x00c3fe, 0x00d5ef, 0x000000,
+ /* b8 */ 0x00c0a3, 0x000000, 0x00bbfb, 0x000000,
+ /* bc */ 0x000000, 0x8fa8ab, 0x00c2d0, 0x00bcf7,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x02d0a ***/
+
+ /* 80 */ 0x000000, 0x00c9f5, 0x00c0ec, 0x8fa8ad,
+ /* 84 */ 0x00bccd, 0x00d5f1, 0x00bead, 0x00d5f2,
+ /* 88 */ 0x00d5f3, 0x00b0d3, 0x00c2ba, 0x00bfd2,
+ /* 8c */ 0x000000, 0x00d5f4, 0x00c6b3, 0x00beae,
+ /* 90 */ 0x000000, 0x00beaf, 0x00cfdb, 0x00d5f5,
+ /* 94 */ 0x000000, 0x000000, 0x00c0ed, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00beb0, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00cfdc, 0x000000,
+ /* a0 */ 0x00d5f6, 0x000000, 0x00d5f7, 0x00cfdd,
+ /* a4 */ 0x00cce0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00d5f8, 0x8fa8ae, 0x000000, 0x00cfde,
+ /* ac */ 0x000000, 0x00b6c6, 0x000000, 0x000000,
+ /* b0 */ 0x8fa8af, 0x00bda2, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00d5f9, 0x00d5fa, 0x00bcdc, 0x00bfac,
+ /* bc */ 0x00c6f4, 0x00bfd4, 0x00c8f8, 0x00c7a2,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x02d4a ***/
+
+ /* 80 */ 0x00b6c9, 0x00d5fb, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b5ef, 0x00d5fc, 0x000000,
+ /* 88 */ 0x00b6fe, 0x000000, 0x00c6cf, 0x00b2b0,
+ /* 8c */ 0x000000, 0x00bbd3, 0x00d5fd, 0x00d6a2,
+ /* 90 */ 0x00d6a1, 0x00b6fd, 0x000000, 0x00d5fe,
+ /* 94 */ 0x000000, 0x00c5b8, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00fefb,
+ /* 9c */ 0x000000, 0x000000, 0x00c2b0, 0x8fa8b1,
+ /* a0 */ 0x00c5cb, 0x00bcc8, 0x00cfe0, 0x8fa8b2,
+ /* a4 */ 0x00c1d8, 0x00cdfa, 0x000000, 0x8fa8b3,
+ /* a8 */ 0x8fa8b4, 0x8fa8b5, 0x000000, 0x000000,
+ /* ac */ 0x00d6a4, 0x000000, 0x00d6a5, 0x00c6d6,
+ /* b0 */ 0x8fa8b6, 0x00bbb3, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00d6a7, 0x000000,
+ /* b8 */ 0x000000, 0x00d6a8, 0x00cfe4, 0x000000,
+ /* bc */ 0x8fa8b9,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x02d87 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fa8bc, 0x000000, 0x8fa8bd, 0x000000,
+ /* 8c */ 0x00d6a9, 0x000000, 0x000000, 0x00cfe5,
+ /* 90 */ 0x00b4f4, 0x00d6aa, 0x000000, 0x000000,
+ /* 94 */ 0x00d6ab, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00cfe6,
+ /* a0 */ 0x8fa8c1, 0x00b2ac, 0x8fa8c2, 0x00cfe7,
+ /* a4 */ 0x000000, 0x000000, 0x8fa8c3, 0x8fa8c4,
+ /* a8 */ 0x00c1bb, 0x00b4e4, 0x00cfe8, 0x00d6ad,
+ /* ac */ 0x00cca8, 0x8fa8c6, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00c2d2, 0x000000, 0x00b3d9,
+ /* b4 */ 0x000000, 0x8fa8c7, 0x00d6af, 0x00d6b1,
+ /* b8 */ 0x00b4df, 0x000000, 0x00cfe9, 0x00d6ae,
+ /* bc */ 0x00d6b0, 0x000000, 0x00d6b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x02dc6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00d6b2, 0x000000, 0x00d6b4,
+ /* 88 */ 0x000000, 0x8fa8c9, 0x000000, 0x00cfea,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00cfeb, 0x000000, 0x00cfec, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d6b5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c6bd, 0x00b6ae, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b2e5, 0x00d6b6, 0x00d6bb, 0x000000,
+ /* ac */ 0x000000, 0x00d6b9, 0x000000, 0x00caf7,
+ /* b0 */ 0x00caf6, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00cfed, 0x000000, 0x00c5e7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d6b8, 0x00bdd4,
+ /* bc */ 0x000000, 0x00d6b7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x02e04 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fa8cc, 0x00bff2,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00d6bc,
+ /* 8c */ 0x000000, 0x00cff0, 0x00baea, 0x000000,
+ /* 90 */ 0x8fa8cd, 0x00d6c2, 0x000000, 0x000000,
+ /* 94 */ 0x00d6c3, 0x00d6bd, 0x00b3b3, 0x00d6be,
+ /* 98 */ 0x00d6c7, 0x00d6c6, 0x00d6c5, 0x00d6c1,
+ /* 9c */ 0x000000, 0x8fa8cf, 0x000000, 0x00d6c0,
+ /* a0 */ 0x8fa8d0, 0x000000, 0x00d6c4, 0x000000,
+ /* a4 */ 0x8fa8d1, 0x000000, 0x8fa8d2, 0x00cff1,
+ /* a8 */ 0x000000, 0x00caf8, 0x000000, 0x8fa8ce,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fa8d3, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fa8d4, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x02e42 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fa8d5, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00cff3, 0x00cff4,
+ /* 88 */ 0x000000, 0x000000, 0x00cff6, 0x00d6cb,
+ /* 8c */ 0x00d6c8, 0x000000, 0x00d6ca, 0x000000,
+ /* 90 */ 0x00cdf2, 0x000000, 0x00d6c9, 0x00cff5,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00d6bf, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa8d7, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00bff3, 0x8fa8d8, 0x000000,
+ /* ac */ 0x00d6cc, 0x00cff7, 0x000000, 0x00bab7,
+ /* b0 */ 0x8fa8da, 0x000000, 0x000000, 0x00d6cd,
+ /* b4 */ 0x000000, 0x000000, 0x00d6ce, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x02e81 ***/
+
+ /* 80 */ 0x000000, 0x00cff8, 0x00d6d1, 0x000000,
+ /* 84 */ 0x00d6d0, 0x000000, 0x000000, 0x00d6cf,
+ /* 88 */ 0x8fa8dd, 0x000000, 0x000000, 0x00c5e8,
+ /* 8c */ 0x00d6ba, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00d6d7, 0x000000, 0x8fa8df, 0x000000,
+ /* 94 */ 0x8fa8e0, 0x000000, 0x000000, 0x8fa8e1,
+ /* 98 */ 0x000000, 0x8fa8e2, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00d6d3, 0x000000, 0x000000,
+ /* a0 */ 0x00cff9, 0x000000, 0x00d6d2, 0x000000,
+ /* a4 */ 0x00cffa, 0x000000, 0x000000, 0x00cffb,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00d6d4, 0x000000, 0x00d6d5, 0x000000,
+ /* b0 */ 0x8fa8e3, 0x000000, 0x8fa8e4, 0x000000,
+ /* b4 */ 0x8fa8e5, 0x000000, 0x000000, 0x00d6d8,
+ /* b8 */ 0x00cffc, 0x8fa8e7, 0x00cee6, 0x000000,
+ /* bc */ 0x00d6d9, 0x00d6d6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x02ebf ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d6da, 0x000000, 0x00cffd,
+ /* 8c */ 0x00b4e0, 0x00d6db, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fa8e8, 0x00d6dd, 0x00d6dc,
+ /* 94 */ 0x000000, 0x000000, 0x00d6de, 0x8fa8e9,
+ /* 98 */ 0x8fa8ea, 0x000000, 0x000000, 0x00d6df,
+ /* 9c */ 0x000000, 0x00c0ee, 0x00bda3, 0x000000,
+ /* a0 */ 0x8fa8eb, 0x00bde4, 0x00f4a8, 0x00c1e3,
+ /* a4 */ 0x8fa8ed, 0x00b9a9, 0x00bab8, 0x00b9aa,
+ /* a8 */ 0x00b5f0, 0x8fa8ee, 0x000000, 0x00d6e0,
+ /* ac */ 0x000000, 0x000000, 0x00bab9, 0x000000,
+ /* b0 */ 0x000000, 0x00b8ca, 0x00d6e1, 0x00cca6,
+ /* b4 */ 0x00c7c3, 0x00d6e2, 0x000000, 0x00b9ab,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b4ac,
+ /* bc */ 0x000000, 0x00c3a7, 0x00b6d2, 0x000000,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x02eff ***/
+
+ /* 80 */ 0x8fa8f0, 0x000000, 0x00bbd4, 0x00c9db,
+ /* 84 */ 0x000000, 0x000000, 0x00c8c1, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00d6e3,
+ /* 8c */ 0x00b4f5, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00d6e6, 0x8fa8f2, 0x000000,
+ /* 94 */ 0x00f4a9, 0x8fa8f3, 0x00c4a1, 0x000000,
+ /* 98 */ 0x00f4aa, 0x00d6e5, 0x00d6e4, 0x00d6e7,
+ /* 9c */ 0x000000, 0x00c4eb, 0x000000, 0x8fa8f5,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00bfe3, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00bbd5,
+ /* ac */ 0x000000, 0x00c0ca, 0x8fa8f6, 0x00c2d3,
+ /* b0 */ 0x00b5a2, 0x000000, 0x000000, 0x00c4a2,
+ /* b4 */ 0x000000, 0x000000, 0x00d6e8, 0x00d6e9,
+ /* b8 */ 0x00beef, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00cbb9, 0x8fa8f7, 0x000000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x02f3f ***/
+
+ /* 80 */ 0x00d6ec, 0x000000, 0x000000, 0x00d6eb,
+ /* 84 */ 0x00d6ea, 0x00c9fd, 0x000000, 0x00d6f3,
+ /* 88 */ 0x000000, 0x8fa8f8, 0x000000, 0x000000,
+ /* 8c */ 0x00cbda, 0x000000, 0x00d6ed, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d6ef, 0x00cbeb, 0x8fa8fa, 0x00d6ee,
+ /* 98 */ 0x00f4ab, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00f4ac, 0x00d6f0,
+ /* a0 */ 0x000000, 0x00c8a8, 0x00d6f1, 0x00cabe,
+ /* a4 */ 0x00d6f2, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fa8fc,
+ /* ac */ 0x8fa8fd, 0x8fa8fe, 0x8faca1, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b4b3, 0x00cabf,
+ /* b4 */ 0x00c7af, 0x00d6f4, 0x00d6f5, 0x00fefc,
+ /* b8 */ 0x00b9ac, 0x00b4b4, 0x00d6f6, 0x00b8b8,
+ /* bc */ 0x00cdc4, 0x00cda9, 0x00b4f6, 0x00d6f8,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x02f7f ***/
+
+ /* 80 */ 0x000000, 0x00c4a3, 0x000000, 0x00b9ad,
+ /* 84 */ 0x00beb1, 0x000000, 0x000000, 0x00c8df,
+ /* 88 */ 0x000000, 0x000000, 0x00beb2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00bdf8,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c4ec, 0x00caf9, 0x00c5b9,
+ /* 98 */ 0x000000, 0x000000, 0x00b9ae, 0x000000,
+ /* 9c */ 0x00c9dc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00d6f9, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8faca3, 0x00c5d9, 0x00bac2,
+ /* a8 */ 0x000000, 0x000000, 0x8faca4, 0x00b8cb,
+ /* ac */ 0x8faca5, 0x00c4ed, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00b0c3, 0x00bdee, 0x00b9af,
+ /* b8 */ 0x00cdc7, 0x8faca6, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00f4ad, 0x8faca7,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x02fbf ***/
+
+ /* 80 */ 0x000000, 0x00d6fa, 0x00d6fb, 0x00c7d1,
+ /* 84 */ 0x000000, 0x000000, 0x8faca8, 0x000000,
+ /* 88 */ 0x00d6fc, 0x00cef7, 0x00cfad, 0x00f4af,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00d6fe,
+ /* 90 */ 0x00d6fd, 0x000000, 0x8faca9, 0x00b3c7,
+ /* 94 */ 0x000000, 0x000000, 0x00d7a1, 0x000000,
+ /* 98 */ 0x000000, 0x8facaa, 0x00d7a4, 0x00d7a5,
+ /* 9c */ 0x000000, 0x00d7a3, 0x000000, 0x00c9c0,
+ /* a0 */ 0x00beb3, 0x00d7a7, 0x00d7a6, 0x00d7a2,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00d7a8, 0x00d7a9, 0x000000, 0x000000,
+ /* ac */ 0x00d7aa, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d7ad, 0x00d7ab, 0x000000, 0x00d7ac,
+ /* b4 */ 0x00d7ae, 0x000000, 0x00b1e4, 0x00c4ee,
+ /* b8 */ 0x00d7af, 0x00f4b0, 0x00b7fa, 0x00b2f6,
+ /* bc */ 0x00c7b6, 0x8facac, 0x00d7b0, 0x00c6fb,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x02fff ***/
+
+ /* 80 */ 0x00f4b1, 0x00cadb, 0x00f4b2, 0x00d7b1,
+ /* 84 */ 0x00cfae, 0x000000, 0x000000, 0x00f4b3,
+ /* 88 */ 0x8facad, 0x00d7b2, 0x00cac0, 0x00d7b5,
+ /* 8c */ 0x00d0a1, 0x00d0b1, 0x8facae, 0x00bcb0,
+ /* 90 */ 0x00c6f5, 0x00d7b6, 0x000000, 0x00b5dd,
+ /* 94 */ 0x00c4a4, 0x00b0fa, 0x00d7b7, 0x00caa6,
+ /* 98 */ 0x00b9b0, 0x000000, 0x000000, 0x00c3d0,
+ /* 9c */ 0x8facaf, 0x00f4b4, 0x8facb1, 0x00c4ef,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00f4b5,
+ /* a4 */ 0x000000, 0x00ccef, 0x00b8b9, 0x00b8cc,
+ /* a8 */ 0x000000, 0x00d7b8, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00d7b9, 0x000000, 0x00d7bf,
+ /* b0 */ 0x000000, 0x00bce5, 0x000000, 0x000000,
+ /* b4 */ 0x00f4b6, 0x00c4a5, 0x00f4b7, 0x00b6af,
+ /* b8 */ 0x00d7ba, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00c9ab, 0x00f4b8, 0x00c3c6, 0x000000,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x0303f ***/
+
+ /* 80 */ 0x00f4b9, 0x00d7bb, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00f4ba, 0x000000, 0x8facb2,
+ /* 88 */ 0x00d7bc, 0x000000, 0x00b6b0, 0x000000,
+ /* 8c */ 0x00d7bd, 0x000000, 0x00d7be, 0x000000,
+ /* 90 */ 0x000000, 0x00d7c0, 0x000000, 0x00c5f6,
+ /* 94 */ 0x00f4bb, 0x000000, 0x00d7c1, 0x00d7c2,
+ /* 98 */ 0x00f4bc, 0x00d7c3, 0x000000, 0x000000,
+ /* 9c */ 0x00d7b4, 0x00d7b3, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00d7c4, 0x00b7c1, 0x8facb3,
+ /* a4 */ 0x00f4bd, 0x000000, 0x00c9a7, 0x00f4be,
+ /* a8 */ 0x000000, 0x00bacc, 0x00c9b7, 0x00c4a6,
+ /* ac */ 0x00c9cb, 0x00d7c5, 0x000000, 0x000000,
+ /* b0 */ 0x00beb4, 0x00b1c6, 0x8facb4, 0x00d7c6,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00d7c7,
+ /* b8 */ 0x000000, 0x00ccf2, 0x000000, 0x000000,
+ /* bc */ 0x00c8e0, 0x00f4bf, 0x8facb5, 0x00d7ca,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x0307f ***/
+
+ /* 80 */ 0x00b1fd, 0x00c0ac, 0x00d7c9, 0x00d7c8,
+ /* 84 */ 0x00b7c2, 0x00c2d4, 0x000000, 0x00d7ce,
+ /* 88 */ 0x00d7cc, 0x00f4c0, 0x00d7cb, 0x00cea7,
+ /* 8c */ 0x00b8e5, 0x000000, 0x000000, 0x8facb6,
+ /* 90 */ 0x00bdf9, 0x00d7cd, 0x00c5cc, 0x00bdbe,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c6c0,
+ /* 98 */ 0x00d7d1, 0x00d7d0, 0x000000, 0x000000,
+ /* 9c */ 0x00f4c1, 0x000000, 0x00d7cf, 0x000000,
+ /* a0 */ 0x00d7d2, 0x00b8e6, 0x8facb7, 0x000000,
+ /* a4 */ 0x8facb8, 0x000000, 0x000000, 0x00f4c2,
+ /* a8 */ 0x00d7d3, 0x00c9fc, 0x00bddb, 0x000000,
+ /* ac */ 0x000000, 0x00d7d4, 0x00c8f9, 0x00f4c3,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00c6c1,
+ /* b4 */ 0x00c4a7, 0x00f4c4, 0x000000, 0x00f4c5,
+ /* b8 */ 0x8facb9, 0x00c5b0, 0x000000, 0x000000,
+ /* bc */ 0x00d7d5, 0x00b5ab,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x030bd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00bfb4,
+ /* 84 */ 0x8facba, 0x00c9ac, 0x000000, 0x8facbc,
+ /* 88 */ 0x000000, 0x00f4c6, 0x000000, 0x8facbd,
+ /* 8c */ 0x00b4f7, 0x00c7a6, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8facbe, 0x8facbf,
+ /* 94 */ 0x8facc0, 0x000000, 0x00d7d6, 0x00bbd6,
+ /* 98 */ 0x00cbba, 0x00cbbb, 0x000000, 0x000000,
+ /* 9c */ 0x00b1fe, 0x00d7db, 0x00f4c7, 0x000000,
+ /* a0 */ 0x00c3e9, 0x00f4c8, 0x8facc1, 0x000000,
+ /* a4 */ 0x00d7d8, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f4c9, 0x000000, 0x00b2f7,
+ /* ac */ 0x000000, 0x000000, 0x8facc2, 0x8facc3,
+ /* b0 */ 0x00d8ad, 0x00d7da, 0x000000, 0x8facc4,
+ /* b4 */ 0x000000, 0x00c7b0, 0x000000, 0x000000,
+ /* b8 */ 0x00d7d9, 0x000000, 0x000000, 0x00d7d7,
+ /* bc */ 0x8facc5, 0x00b9fa, 0x000000, 0x00d7dd,
+
+ /*** Three byte table, leaf: e680xx - offset 0x030fd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00f4ca, 0x00d7e3, 0x00d7e9,
+ /* 90 */ 0x00d7e1, 0x000000, 0x00c5dc, 0x000000,
+ /* 94 */ 0x00f4cb, 0x00d7e6, 0x00c9dd, 0x8facc7,
+ /* 98 */ 0x00f4cc, 0x00d7e0, 0x000000, 0x00d7e5,
+ /* 9c */ 0x00cee7, 0x00bbd7, 0x000000, 0x000000,
+ /* a0 */ 0x00c2d5, 0x00d7de, 0x8facc8, 0x000000,
+ /* a4 */ 0x8facc9, 0x00b5de, 0x00d7e8, 0x00c0ad,
+ /* a8 */ 0x00b1e5, 0x00d7e2, 0x00b2f8, 0x00d7e7,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00b6b1,
+ /* b0 */ 0x000000, 0x00d7e4, 0x000000, 0x00f4cd,
+ /* b4 */ 0x000000, 0x00f4ce, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d7ea, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x0313c ***/
+
+ /* 80 */ 0x000000, 0x00d7ec, 0x00d7f6, 0x00d7f4,
+ /* 84 */ 0x000000, 0x000000, 0x00d7f1, 0x00f4cf,
+ /* 88 */ 0x000000, 0x000000, 0x00d7f0, 0x00cef8,
+ /* 8c */ 0x8faccb, 0x00d7f2, 0x000000, 0x000000,
+ /* 90 */ 0x00b6b2, 0x000000, 0x00b9b1, 0x000000,
+ /* 94 */ 0x000000, 0x00bdfa, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d7f9, 0x00d7eb, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00d7ef,
+ /* a0 */ 0x00d7df, 0x000000, 0x00b2fa, 0x00d7f3,
+ /* a4 */ 0x00d7f5, 0x00c3d1, 0x000000, 0x000000,
+ /* a8 */ 0x00baa8, 0x00b2b8, 0x00d7ed, 0x00d7f8,
+ /* ac */ 0x00d7f7, 0x00b6b3, 0x000000, 0x00c2a9,
+ /* b0 */ 0x00b3e6, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00b7c3, 0x000000, 0x00d7ee,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8faccc,
+
+ /*** Three byte table, leaf: e682xx - offset 0x0317c ***/
+
+ /* 80 */ 0x000000, 0x00d7fa, 0x000000, 0x00d7fd,
+ /* 84 */ 0x00d8a1, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00bcbd, 0x8faccd, 0x00d8a7,
+ /* 8c */ 0x00c4f0, 0x00d7fb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00d8a5, 0x000000,
+ /* 94 */ 0x00b2f9, 0x8facce, 0x00d8a3, 0x00d8a4,
+ /* 98 */ 0x000000, 0x000000, 0x00d7fe, 0x00d8a2,
+ /* 9c */ 0x000000, 0x00f4d1, 0x00f4d2, 0x00b8e7,
+ /* a0 */ 0x00cdaa, 0x000000, 0x000000, 0x00b4b5,
+ /* a4 */ 0x000000, 0x000000, 0x00b1d9, 0x00d8a6,
+ /* a8 */ 0x8faccf, 0x00c7ba, 0x00b0ad, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8facd1, 0x8facd2, 0x00c8e1, 0x00d7dc,
+ /* b4 */ 0x00d8ac, 0x00d8b0, 0x00cce5, 0x000000,
+ /* b8 */ 0x00d8a9, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00c5e9, 0x00d8ae, 0x8facd3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x031bb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00bef0, 0x00d8af, 0x00c6d7,
+ /* 88 */ 0x8facd4, 0x000000, 0x000000, 0x00f4d3,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00cfc7, 0x000000, 0x00d8ab,
+ /* 94 */ 0x00f4d4, 0x00f4d5, 0x000000, 0x000000,
+ /* 98 */ 0x00d8b1, 0x8facd5, 0x00b9fb, 0x8facd6,
+ /* 9c */ 0x00c0cb, 0x00f4d6, 0x000000, 0x00b0d4,
+ /* a0 */ 0x00d8aa, 0x00d8a8, 0x000000, 0x00c1da,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d7fc,
+ /* a8 */ 0x00bbb4, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8facd7, 0x000000,
+ /* b0 */ 0x00c2c6, 0x00d8bd, 0x8facd8, 0x00c1db,
+ /* b4 */ 0x00d8b8, 0x8facd9, 0x00d8b5, 0x00d8b6,
+ /* b8 */ 0x00f4d7, 0x00bce6, 0x00d8b9, 0x00d8bc,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e684xx - offset 0x031fb ***/
+
+ /* 80 */ 0x00d8b7, 0x00bda5, 0x000000, 0x00d8ba,
+ /* 84 */ 0x000000, 0x000000, 0x00d8b4, 0x000000,
+ /* 88 */ 0x00ccfc, 0x00ccfb, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00d8be, 0x00d8bf, 0x00b0d5,
+ /* 90 */ 0x8facda, 0x000000, 0x8facdb, 0x8facdc,
+ /* 94 */ 0x000000, 0x00d8b3, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8facdd, 0x00b6f2, 0x00b0a6,
+ /* 9c */ 0x00f4d8, 0x000000, 0x8facde, 0x00b4b6,
+ /* a0 */ 0x000000, 0x00d8bb, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d8c3,
+ /* a8 */ 0x00d8c2, 0x000000, 0x000000, 0x00f4d9,
+ /* ac */ 0x00d8c7, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f4da, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00d8c8, 0x000000, 0x000000, 0x00f4db,
+ /* b8 */ 0x000000, 0x000000, 0x8facdf, 0x000000,
+ /* bc */ 0x00d8c6, 0x00d8c9, 0x00d8c1, 0x00d8c5,
+
+ /*** Three byte table, leaf: e685xx - offset 0x0323b ***/
+
+ /* 80 */ 0x000000, 0x8face1, 0x00d8ca, 0x000000,
+ /* 84 */ 0x00d8cb, 0x000000, 0x8face2, 0x00d8c0,
+ /* 88 */ 0x00bbfc, 0x000000, 0x00d8c4, 0x00c2d6,
+ /* 8c */ 0x00b9b2, 0x00d8b2, 0x00bfb5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00d8d8,
+ /* 94 */ 0x000000, 0x00cae9, 0x000000, 0x000000,
+ /* 98 */ 0x00d8ce, 0x00d8cf, 0x00d8d0, 0x000000,
+ /* 9c */ 0x000000, 0x00d8d7, 0x000000, 0x00d8d6,
+ /* a0 */ 0x8face3, 0x000000, 0x00cbfd, 0x00b4b7,
+ /* a4 */ 0x000000, 0x00d8d4, 0x000000, 0x00b7c5,
+ /* a8 */ 0x00b3b4, 0x000000, 0x000000, 0x00d8d1,
+ /* ac */ 0x000000, 0x000000, 0x00ceb8, 0x00d8d3,
+ /* b0 */ 0x00b0d6, 0x00d8d5, 0x000000, 0x00d8cc,
+ /* b4 */ 0x00d8d2, 0x00d8d9, 0x00b7c4, 0x00d8cd,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8face4, 0x000000, 0x00cddd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x0327a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00cdab, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00d8dc,
+ /* 88 */ 0x000000, 0x000000, 0x00d8e0, 0x000000,
+ /* 8c */ 0x000000, 0x00f4dd, 0x00c1fe, 0x000000,
+ /* 90 */ 0x00cef9, 0x00d8e1, 0x8face6, 0x8face7,
+ /* 94 */ 0x00d8de, 0x000000, 0x00d8db, 0x8face8,
+ /* 98 */ 0x8face9, 0x00d8da, 0x00d8df, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00cab0, 0x8facea, 0x000000, 0x00c6b4,
+ /* a8 */ 0x8faceb, 0x00b7c6, 0x000000, 0x00d8e2,
+ /* ac */ 0x00d8dd, 0x8facec, 0x00d8e3, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b7fb, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b2b1, 0x000000,
+ /* b8 */ 0x000000, 0x00f4e0, 0x00d8eb, 0x000000,
+ /* bc */ 0x00f4df, 0x000000, 0x00b4b8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x032b9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00d8e9,
+ /* 84 */ 0x000000, 0x000000, 0x00d8ea, 0x00baa9,
+ /* 88 */ 0x00d8e8, 0x00d8e6, 0x00d8e5, 0x00d8ec,
+ /* 8c */ 0x00d8e4, 0x00d8ee, 0x000000, 0x000000,
+ /* 90 */ 0x00b2fb, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8facee, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8facef, 0x000000, 0x8facf0,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00d8f0,
+ /* a4 */ 0x000000, 0x000000, 0x00d8ef, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00c4a8, 0x000000,
+ /* b4 */ 0x00d8f3, 0x8facf1, 0x00d8f1, 0x00d8e7,
+ /* b8 */ 0x00b7fc, 0x000000, 0x00d8f2, 0x000000,
+ /* bc */ 0x00d8f6, 0x00d8f5, 0x00d8f7, 0x00d8f4,
+
+ /*** Three byte table, leaf: e688xx - offset 0x032f9 ***/
+
+ /* 80 */ 0x00d8f8, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00d8f9, 0x00d8fa, 0x00caea, 0x000000,
+ /* 8c */ 0x00d8fc, 0x00d8fb, 0x00bdbf, 0x000000,
+ /* 90 */ 0x00c0ae, 0x00b2e6, 0x00b2fc, 0x000000,
+ /* 94 */ 0x00d8fd, 0x8facf3, 0x00b0bf, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00c0cc, 0x00d8fe,
+ /* 9c */ 0x000000, 0x00ecc3, 0x00d9a1, 0x00b7e1,
+ /* a0 */ 0x000000, 0x00d9a2, 0x00f4e2, 0x8facf4,
+ /* a4 */ 0x000000, 0x000000, 0x00c0ef, 0x000000,
+ /* a8 */ 0x000000, 0x8facf5, 0x00d9a3, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00d9a4, 0x00b5ba,
+ /* b0 */ 0x00d9a5, 0x000000, 0x00d9a6, 0x00d9a7,
+ /* b4 */ 0x00c2d7, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00b8cd, 0x000000, 0x000000, 0x00cce1,
+ /* bc */ 0x000000, 0x000000, 0x00f4e3, 0x00cbbc,
+
+ /*** Three byte table, leaf: e689xx - offset 0x03339 ***/
+
+ /* 80 */ 0x00bdea, 0x00d9a8, 0x000000, 0x00f4e4,
+ /* 84 */ 0x000000, 0x000000, 0x8facf6, 0x00c0f0,
+ /* 88 */ 0x00eebd, 0x00c8e2, 0x000000, 0x00bcea,
+ /* 8c */ 0x8facf7, 0x00bacd, 0x00d9a9, 0x000000,
+ /* 90 */ 0x000000, 0x8facf8, 0x8facf9, 0x00c2c7,
+ /* 94 */ 0x000000, 0x00caa7, 0x00f4e5, 0x000000,
+ /* 98 */ 0x00c2f1, 0x000000, 0x00f4e6, 0x00d9ac,
+ /* 9c */ 0x000000, 0x000000, 0x00d9aa, 0x000000,
+ /* a0 */ 0x00d9ad, 0x8facfa, 0x000000, 0x00d9ab,
+ /* a4 */ 0x8facfb, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00d9ae, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8facfd, 0x00cab1, 0x00f4e7,
+ /* b0 */ 0x000000, 0x00b0b7, 0x000000, 0x8facfe,
+ /* b4 */ 0x000000, 0x000000, 0x00c9de, 0x000000,
+ /* b8 */ 0x000000, 0x00c8e3, 0x000000, 0x8facfc,
+ /* bc */ 0x00d9af, 0x000000, 0x00d9b2, 0x00beb5,
+
+ /*** Three byte table, leaf: e68axx - offset 0x03379 ***/
+
+ /* 80 */ 0x00b5bb, 0x000000, 0x00d9b0, 0x00d9b7,
+ /* 84 */ 0x00beb6, 0x00f4e8, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d9b1, 0x00c7c4, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00cdde, 0x00d9b3, 0x00d9b4,
+ /* 94 */ 0x00d9b8, 0x00c5ea, 0x00d9b5, 0x00b9b3,
+ /* 98 */ 0x00c0de, 0x8fada1, 0x000000, 0x00d9c6,
+ /* 9c */ 0x00c8b4, 0x000000, 0x00c2f2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fada2, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00c8e4,
+ /* ac */ 0x00daad, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cafa, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00c4f1, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00cbf5, 0x000000, 0x00d9bb,
+ /* bc */ 0x00b2a1, 0x00c3ea,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x033b7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d9c4, 0x000000,
+ /* 84 */ 0x00f4e9, 0x00c3b4, 0x00d9be, 0x00d9c5,
+ /* 88 */ 0x00d9c0, 0x00d9c7, 0x00d9c3, 0x000000,
+ /* 8c */ 0x00d9c2, 0x00c7ef, 0x000000, 0x00d9bc,
+ /* 90 */ 0x00b2fd, 0x00d9ba, 0x00b5f1, 0x00c2f3,
+ /* 94 */ 0x00d9b6, 0x8fada3, 0x00f4ea, 0x00d9b9,
+ /* 98 */ 0x00b9b4, 0x00c0db, 0x000000, 0x00beb7,
+ /* 9c */ 0x00d9c1, 0x00c7d2, 0x000000, 0x000000,
+ /* a0 */ 0x00b5f2, 0x00b3c8, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00b3e7, 0x00bfa1, 0x00d9c9, 0x00d9ce,
+ /* b0 */ 0x000000, 0x00d9ca, 0x000000, 0x00b7fd,
+ /* b4 */ 0x000000, 0x00d9cf, 0x00bba2, 0x00b9e9,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00f4eb, 0x8fada5, 0x00bda6, 0x00d9bd,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x033f7 ***/
+
+ /* 80 */ 0x000000, 0x00bbfd, 0x00d9cc, 0x8fada6,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00bbd8,
+ /* 88 */ 0x00d9cd, 0x00b0c4, 0x00f4ec, 0x000000,
+ /* 8c */ 0x00d9c8, 0x8fada7, 0x000000, 0x000000,
+ /* 90 */ 0x8fada8, 0x00c4a9, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00f4ed, 0x00b5f3, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b6b4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d9cb,
+ /* a8 */ 0x00b0a7, 0x000000, 0x000000, 0x00bac3,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00bfb6,
+ /* b0 */ 0x000000, 0x000000, 0x8fadab, 0x000000,
+ /* b4 */ 0x000000, 0x8fadac, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00f4ee, 0x00c4f2, 0x8fadad,
+ /* bc */ 0x8fadae, 0x00c8d4, 0x00d9d1, 0x00c1de,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x03437 ***/
+
+ /* 80 */ 0x000000, 0x8fadaf, 0x000000, 0x00f4ef,
+ /* 84 */ 0x8fadb0, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00c2aa, 0x000000, 0x000000,
+ /* 8c */ 0x00bbab, 0x00d9d2, 0x8fadb1, 0x00d9d4,
+ /* 90 */ 0x00d9d0, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00cae1, 0x000000, 0x00c4bd,
+ /* 98 */ 0x000000, 0x8fadb3, 0x000000, 0x000000,
+ /* 9c */ 0x00c1dc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00f4f0, 0x000000, 0x00cafb,
+ /* a8 */ 0x00bcce, 0x00d9e0, 0x000000, 0x00d9df,
+ /* ac */ 0x8fadb6, 0x000000, 0x00bff8, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b7fe, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00d9d9, 0x00beb9,
+ /* b8 */ 0x000000, 0x000000, 0x00c6e8, 0x00c7b1,
+ /* bc */ 0x00f4f1, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e68exx - offset 0x03477 ***/
+
+ /* 80 */ 0x00d9d7, 0x000000, 0x000000, 0x00c1dd,
+ /* 84 */ 0x8fadb7, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00bcf8, 0x00d9dc, 0x000000, 0x000000,
+ /* 8c */ 0x00beb8, 0x000000, 0x00d9d6, 0x00d9db,
+ /* 90 */ 0x000000, 0x000000, 0x00c7d3, 0x000000,
+ /* 94 */ 0x8fadba, 0x000000, 0x00d9d5, 0x000000,
+ /* 98 */ 0x00b7a1, 0x8fadb8, 0x000000, 0x00b3dd,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00d9dd,
+ /* a0 */ 0x00ceab, 0x00bace, 0x00c3b5, 0x00d9da,
+ /* a4 */ 0x000000, 0x00c0dc, 0x000000, 0x00b9b5,
+ /* a8 */ 0x00bfe4, 0x00b1e6, 0x00c1bc, 0x00d9d8,
+ /* ac */ 0x00b5c5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b7c7, 0x000000,
+ /* b4 */ 0x00c4cf, 0x00d9de, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00c1df,
+ /* bc */ 0x000000, 0x8fadbb, 0x00d9e1, 0x000000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x034b7 ***/
+
+ /* 80 */ 0x00d9e3, 0x000000, 0x000000, 0x00c2b7,
+ /* 84 */ 0x00d9e9, 0x000000, 0x00d9e4, 0x000000,
+ /* 88 */ 0x000000, 0x00d9e6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00c9c1,
+ /* 90 */ 0x00c4f3, 0x000000, 0x00d9e7, 0x000000,
+ /* 94 */ 0x8fadbd, 0x8fadbe, 0x00cdac, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00cdc8, 0x00b4b9,
+ /* 9c */ 0x8fadbf, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fadc0, 0x00b0ae, 0x000000, 0x00d9e5,
+ /* a4 */ 0x000000, 0x00f4f2, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d9e2, 0x000000, 0x8fadc1,
+ /* ac */ 0x8fadc2, 0x00f4f3, 0x00b4f8, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fadc3, 0x000000,
+ /* b4 */ 0x00b1e7, 0x00f4f4, 0x00d9e8, 0x8fadbc,
+ /* b8 */ 0x000000, 0x000000, 0x00cdc9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x034f2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00d9ec, 0x000000,
+ /* 88 */ 0x000000, 0x8fadc4, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00c2bb, 0x000000, 0x00d9f3,
+ /* 90 */ 0x00f4f5, 0x000000, 0x000000, 0x00d9ed,
+ /* 94 */ 0x00f4f6, 0x000000, 0x00d9ea, 0x00d9f1,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00d9d3, 0x000000, 0x8fadc5, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00f4f7, 0x000000,
+ /* a4 */ 0x000000, 0x8fadc6, 0x00d9ee, 0x000000,
+ /* a8 */ 0x00d9f2, 0x8fadc7, 0x000000, 0x000000,
+ /* ac */ 0x00c8c2, 0x00c5eb, 0x000000, 0x8fadc8,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00d9eb, 0x000000, 0x00d9ef, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00b7c8, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00baf1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x03531 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00c0dd, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00d9f7, 0x000000,
+ /* 90 */ 0x000000, 0x00f4f9, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00c5a6, 0x000000, 0x8fadc9, 0x8fadca,
+ /* 9c */ 0x000000, 0x8fadcb, 0x000000, 0x000000,
+ /* a0 */ 0x00f4fa, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d9f4,
+ /* a8 */ 0x000000, 0x00cbe0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f4fb, 0x000000, 0x00d9f5,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fadcc,
+ /* b4 */ 0x000000, 0x000000, 0x00d9f6, 0x000000,
+ /* b8 */ 0x00ccce, 0x00f4f8, 0x00c0a2, 0x000000,
+ /* bc */ 0x000000, 0x8fadcd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x0356f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b7e2,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fadce,
+ /* 88 */ 0x00d9fd, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fadcf, 0x00bbb5, 0x00d9fa,
+ /* 94 */ 0x000000, 0x00d9f9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00c7b2, 0x000000,
+ /* 9c */ 0x000000, 0x8fadd0, 0x00c6b5, 0x8fadd1,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c5b1, 0x00d9fb, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d9fc, 0x000000, 0x00c9ef,
+ /* ac */ 0x000000, 0x00c7c5, 0x00bba3, 0x000000,
+ /* b0 */ 0x00c0f1, 0x000000, 0x00cbd0, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00b3c9, 0x000000, 0x00daa5,
+ /* bc */ 0x00d9fe, 0x000000, 0x00f4fd, 0x00f4fe,
+
+ /*** Three byte table, leaf: e693xx - offset 0x035af ***/
+
+ /* 80 */ 0x000000, 0x00cdca, 0x00daa7, 0x000000,
+ /* 84 */ 0x00f5a1, 0x00daa3, 0x000000, 0x00daa4,
+ /* 88 */ 0x000000, 0x000000, 0x00f5a2, 0x8fadd2,
+ /* 8c */ 0x8fadd3, 0x00c1e0, 0x00f4fc, 0x000000,
+ /* 90 */ 0x00f5a3, 0x000000, 0x00daa2, 0x000000,
+ /* 94 */ 0x00d9bf, 0x8fadd4, 0x000000, 0x8fadd5,
+ /* 98 */ 0x00daa6, 0x000000, 0x00daa1, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00daab, 0x00daac, 0x00c5a7, 0x00daae,
+ /* a4 */ 0x8fadd7, 0x8fadd8, 0x00bba4, 0x00daa9,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00b5bc, 0x000000, 0x000000, 0x00daaf,
+ /* b0 */ 0x000000, 0x00daa8, 0x00dab3, 0x000000,
+ /* b4 */ 0x00dab2, 0x000000, 0x00dab1, 0x00f5a4,
+ /* b8 */ 0x000000, 0x000000, 0x00dab4, 0x00f5a5,
+ /* bc */ 0x000000, 0x00dab6, 0x00bef1, 0x8fadd9,
+
+ /*** Three byte table, leaf: e694xx - offset 0x035ef ***/
+
+ /* 80 */ 0x00dab5, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fadda, 0x00dab9, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8faddc,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8faddd, 0x000000, 0x8fadde, 0x000000,
+ /* 98 */ 0x00dab7, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00dab8, 0x00d9f0, 0x8fade0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00f5a6, 0x00dabb,
+ /* a4 */ 0x00daba, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f5a7, 0x00d9f8, 0x00dabc,
+ /* ac */ 0x00dab0, 0x000000, 0x000000, 0x00bbd9,
+ /* b0 */ 0x000000, 0x000000, 0x8fade1, 0x000000,
+ /* b4 */ 0x00dabd, 0x00dabe, 0x00dac0, 0x00dabf,
+ /* b8 */ 0x00dac1, 0x00b2fe, 0x000000, 0x00b9b6,
+ /* bc */ 0x000000, 0x000000, 0x00cafc, 0x00c0af,
+
+ /*** Three byte table, leaf: e695xx - offset 0x0362f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fade2, 0x00b8ce, 0x000000, 0x000000,
+ /* 88 */ 0x00dac3, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00dac6, 0x000000, 0x00c9d2,
+ /* 90 */ 0x000000, 0x00b5df, 0x000000, 0x000000,
+ /* 94 */ 0x8fade3, 0x00dac5, 0x00dac4, 0x00c7d4,
+ /* 98 */ 0x00dac7, 0x00b6b5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00dac9, 0x00dac8, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00b4ba, 0x00bbb6,
+ /* a4 */ 0x000000, 0x000000, 0x00c6d8, 0x00f5a9,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fade4,
+ /* ac */ 0x00b7c9, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00bff4, 0x000000, 0x00daca, 0x000000,
+ /* b4 */ 0x00c0b0, 0x00c5a8, 0x000000, 0x00c9df,
+ /* b8 */ 0x00dacb, 0x000000, 0x8fade5, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x0366e ***/
+
+ /* 80 */ 0x000000, 0x8fade6, 0x00dacc, 0x00dacd,
+ /* 84 */ 0x8fade7, 0x8fade8, 0x000000, 0x00cab8,
+ /* 88 */ 0x00d5dd, 0x00c0c6, 0x8fade9, 0x000000,
+ /* 8c */ 0x00c9cc, 0x000000, 0x00bad8, 0x000000,
+ /* 90 */ 0x00c8e5, 0x00c8c3, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c5cd,
+ /* 98 */ 0x000000, 0x00cec1, 0x000000, 0x00dacf,
+ /* 9c */ 0x00bcd0, 0x00f5aa, 0x000000, 0x00dad0,
+ /* a0 */ 0x000000, 0x00b0b6, 0x000000, 0x000000,
+ /* a4 */ 0x00b6d4, 0x00c0cd, 0x000000, 0x00c9e0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00dad1,
+ /* ac */ 0x00bbc2, 0x00c3c7, 0x000000, 0x00bbdb,
+ /* b0 */ 0x00bfb7, 0x000000, 0x8fadea, 0x000000,
+ /* b4 */ 0x000000, 0x8fadeb, 0x000000, 0x00dad2,
+ /* b8 */ 0x8fadec, 0x00cafd, 0x000000, 0x000000,
+ /* bc */ 0x00b1f7, 0x00bbdc, 0x000000, 0x8faded,
+
+ /*** Three byte table, leaf: e697xx - offset 0x036ae ***/
+
+ /* 80 */ 0x000000, 0x00dad5, 0x8fadee, 0x00dad3,
+ /* 84 */ 0x00dad6, 0x00ceb9, 0x00dad4, 0x000000,
+ /* 88 */ 0x000000, 0x8fadef, 0x000000, 0x00c0fb,
+ /* 8c */ 0x00dad7, 0x000000, 0x000000, 0x00c2b2,
+ /* 90 */ 0x000000, 0x000000, 0x00dad8, 0x000000,
+ /* 94 */ 0x8fadf0, 0x000000, 0x000000, 0x00b4fa,
+ /* 98 */ 0x000000, 0x00dada, 0x000000, 0x00dad9,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00dadb, 0x00dadc, 0x00b4fb, 0x000000,
+ /* a4 */ 0x000000, 0x00c6fc, 0x00c3b6, 0x00b5ec,
+ /* a8 */ 0x00bbdd, 0x00c1e1, 0x000000, 0x000000,
+ /* ac */ 0x00bddc, 0x00b0b0, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00dadd, 0x8fadf2, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fadf3, 0x00b2a2, 0x00dae1,
+ /* bc */ 0x8fadf4, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e698xx - offset 0x036ee ***/
+
+ /* 80 */ 0x00f5ac, 0x000000, 0x00b9b7, 0x00dae0,
+ /* 84 */ 0x8fadf5, 0x000000, 0x00baab, 0x00beba,
+ /* 88 */ 0x8fadf6, 0x00f5ad, 0x00dadf, 0x000000,
+ /* 8c */ 0x00bebb, 0x000000, 0x00ccc0, 0x00baaa,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00b0d7,
+ /* 94 */ 0x00c0ce, 0x00f5ae, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00dae6, 0x000000, 0x00f5af, 0x00c0b1,
+ /* a0 */ 0x00b1c7, 0x8fadf7, 0x00f5b1, 0x000000,
+ /* a4 */ 0x00f5b2, 0x00bdd5, 0x000000, 0x00cbe6,
+ /* a8 */ 0x00baf2, 0x000000, 0x8fadf8, 0x00f5b3,
+ /* ac */ 0x000000, 0x00bebc, 0x000000, 0x00c0a7,
+ /* b0 */ 0x00f5b4, 0x00f5b5, 0x000000, 0x00f5b6,
+ /* b4 */ 0x00dae5, 0x00dae3, 0x00dae4, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00f5b0, 0x000000,
+ /* bc */ 0x00c3eb, 0x000000, 0x000000, 0x00dba6,
+
+ /*** Three byte table, leaf: e699xx - offset 0x0372e ***/
+
+ /* 80 */ 0x000000, 0x00daea, 0x00bbfe, 0x00b9b8,
+ /* 84 */ 0x00dae8, 0x8fadf9, 0x000000, 0x000000,
+ /* 88 */ 0x00f5b8, 0x00dae9, 0x000000, 0x00bfb8,
+ /* 8c */ 0x00f5b9, 0x000000, 0x8fadfb, 0x00dae7,
+ /* 90 */ 0x000000, 0x8fadfa, 0x00bbaf, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fadfe,
+ /* 98 */ 0x000000, 0x00f5bb, 0x00f5bc, 0x8faea1,
+ /* 9c */ 0x000000, 0x00daec, 0x00daeb, 0x00daf0,
+ /* a0 */ 0x000000, 0x00f5bd, 0x00daf1, 0x8faea2,
+ /* a4 */ 0x00daed, 0x00f5be, 0x00b3a2, 0x00daee,
+ /* a8 */ 0x00daef, 0x00c8d5, 0x8faea5, 0x8faea6,
+ /* ac */ 0x8faea7, 0x8faea8, 0x00c9e1, 0x00b7ca,
+ /* b0 */ 0x00daf2, 0x000000, 0x000000, 0x00f5bf,
+ /* b4 */ 0x00c0b2, 0x000000, 0x00bebd, 0x00f5c0,
+ /* b8 */ 0x00f5c1, 0x000000, 0x00c3d2, 0x8faea9,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e69axx - offset 0x0376e ***/
+
+ /* 80 */ 0x8faeaa, 0x00b6c7, 0x000000, 0x00daf3,
+ /* 84 */ 0x00daf7, 0x000000, 0x000000, 0x00b2cb,
+ /* 88 */ 0x00daf4, 0x00daf6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00f5c2, 0x00daf5, 0x000000,
+ /* 90 */ 0x8faeab, 0x00bdeb, 0x8faeac, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c3c8, 0x00b0c5,
+ /* 98 */ 0x00daf8, 0x8faead, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00daf9, 0x000000, 0x000000,
+ /* a0 */ 0x00f5c4, 0x000000, 0x00c4aa, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00cef1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00bbc3,
+ /* ac */ 0x000000, 0x8faeaf, 0x00caeb, 0x000000,
+ /* b0 */ 0x000000, 0x8faeb0, 0x00f5c5, 0x000000,
+ /* b4 */ 0x00cbbd, 0x8faeb1, 0x000000, 0x000000,
+ /* b8 */ 0x00dba2, 0x00dafb, 0x000000, 0x00f5c6,
+ /* bc */ 0x00dafe, 0x000000, 0x00dafd, 0x8faeb3,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x037ae ***/
+
+ /* 80 */ 0x000000, 0x00dafa, 0x000000, 0x000000,
+ /* 84 */ 0x00dba1, 0x000000, 0x00f5c7, 0x00c6de,
+ /* 88 */ 0x00f5c8, 0x00dafc, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00dba3, 0x000000,
+ /* 98 */ 0x000000, 0x00bdec, 0x00dba4, 0x00f5ca,
+ /* 9c */ 0x00cdcb, 0x00c7f8, 0x000000, 0x000000,
+ /* a0 */ 0x00dba5, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dba7, 0x000000,
+ /* a8 */ 0x00f5cb, 0x00dba8, 0x000000, 0x000000,
+ /* ac */ 0x8faeb5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00dba9, 0x000000, 0x00b6ca, 0x00b1c8,
+ /* b4 */ 0x00b9b9, 0x00dbaa, 0x000000, 0x00dbab,
+ /* b8 */ 0x00bdf1, 0x00c1e2, 0x00f5cc, 0x00f5b7,
+ /* bc */ 0x00d2d8, 0x00c1be, 0x00c1bd, 0x00c2d8,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x037ee ***/
+
+ /* 80 */ 0x00bac7, 0x8faeb7, 0x000000, 0x00d0f2,
+ /* 84 */ 0x000000, 0x8faeb8, 0x000000, 0x000000,
+ /* 88 */ 0x00b7ee, 0x00cdad, 0x000000, 0x00cafe,
+ /* 8c */ 0x000000, 0x00c9fe, 0x000000, 0x00dbac,
+ /* 90 */ 0x000000, 0x000000, 0x8faeb9, 0x00f5cd,
+ /* 94 */ 0x00baf3, 0x00c4bf, 0x00dbad, 0x00cfaf,
+ /* 98 */ 0x000000, 0x8faebb, 0x000000, 0x00cbbe,
+ /* 9c */ 0x000000, 0x00c4ab, 0x00dbae, 0x00b4fc,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dbaf, 0x00dbb0,
+ /* a8 */ 0x00ccda, 0x000000, 0x00cca4, 0x00cbf6,
+ /* ac */ 0x00cbdc, 0x00bba5, 0x00dbb2, 0x000000,
+ /* b0 */ 0x000000, 0x00bceb, 0x000000, 0x00f5cf,
+ /* b4 */ 0x00cbd1, 0x000000, 0x00dbb4, 0x00dbb7,
+ /* b8 */ 0x00dbb6, 0x000000, 0x00b4f9, 0x000000,
+ /* bc */ 0x000000, 0x00b5e0, 0x000000, 0x00dbb3,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x0382e ***/
+
+ /* 80 */ 0x000000, 0x00dbb5, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00dbb8, 0x00f5d1,
+ /* 88 */ 0x00f5d2, 0x00bff9, 0x000000, 0x000000,
+ /* 8c */ 0x8faebe, 0x8faebf, 0x00cdfb, 0x00b0c9,
+ /* 90 */ 0x00bae0, 0x00c2bc, 0x000000, 0x00bcdd,
+ /* 94 */ 0x8faec0, 0x000000, 0x00bef3, 0x000000,
+ /* 98 */ 0x000000, 0x00dbbb, 0x000000, 0x000000,
+ /* 9c */ 0x00c5ce, 0x8faec1, 0x00dbb9, 0x00c2ab,
+ /* a0 */ 0x00dbba, 0x00bef2, 0x00ccdd, 0x00dbbc,
+ /* a4 */ 0x00dbbd, 0x00cde8, 0x00f5d0, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00dbc2, 0x000000,
+ /* ac */ 0x000000, 0x00b9ba, 0x000000, 0x00c7d5,
+ /* b0 */ 0x00dbbf, 0x00c5ec, 0x00dade, 0x00dae2,
+ /* b4 */ 0x8faec5, 0x00b5cf, 0x8faec6, 0x00c7c7,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00f5d3,
+ /* bc */ 0x00dbc1, 0x000000, 0x00bebe, 0x00c8c4,
+
+ /*** Three byte table, leaf: e69exx - offset 0x0386e ***/
+
+ /* 80 */ 0x000000, 0x00f5d4, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00dbc7, 0x000000, 0x00c8fa,
+ /* 88 */ 0x000000, 0x00dbbe, 0x000000, 0x00dbc4,
+ /* 8c */ 0x00dbc3, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00c0cf, 0x000000, 0x8faec8, 0x00f5d5,
+ /* 94 */ 0x000000, 0x00cbed, 0x000000, 0x00ced3,
+ /* 98 */ 0x00f5d6, 0x000000, 0x00cbe7, 0x00f5d7,
+ /* 9c */ 0x00b2cc, 0x00bbde, 0x000000, 0x000000,
+ /* a0 */ 0x00cfc8, 0x00dbc6, 0x00bff5, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dbc5, 0x000000,
+ /* a8 */ 0x000000, 0x00dbc0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00b8cf,
+ /* b0 */ 0x8faecc, 0x000000, 0x8faecd, 0x00dbcc,
+ /* b4 */ 0x00dbca, 0x000000, 0x00b2cd, 0x00dbc8,
+ /* b8 */ 0x00dbce, 0x00dbd4, 0x000000, 0x00f5d8,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x038ae ***/
+
+ /* 80 */ 0x00f5da, 0x00c2c8, 0x000000, 0x8faece,
+ /* 84 */ 0x00cac1, 0x000000, 0x00dbd6, 0x000000,
+ /* 88 */ 0x8faecf, 0x000000, 0x00c9a2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00dbd5, 0x00c7f0,
+ /* 90 */ 0x00cbbf, 0x00b4bb, 0x8faed0, 0x00c0f7,
+ /* 94 */ 0x00bdc0, 0x000000, 0x000000, 0x00f5db,
+ /* 98 */ 0x00c4d3, 0x8faed1, 0x00cdae, 0x8faed2,
+ /* 9c */ 0x000000, 0x00dbd1, 0x00dbd0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00dbd2, 0x000000,
+ /* a4 */ 0x00dbcf, 0x000000, 0x000000, 0x00dbd7,
+ /* a8 */ 0x000000, 0x00dbcd, 0x000000, 0x000000,
+ /* ac */ 0x00dbcb, 0x000000, 0x00dbd3, 0x00dbc9,
+ /* b0 */ 0x8faed3, 0x00c3ec, 0x000000, 0x00ccf8,
+ /* b4 */ 0x00bcc6, 0x00baf4, 0x000000, 0x8faed4,
+ /* b8 */ 0x000000, 0x00f5d9, 0x000000, 0x00baba,
+ /* bc */ 0x00f5dc, 0x000000, 0x00cbef, 0x00b3c1,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x038ee ***/
+
+ /* 80 */ 0x000000, 0x00f5dd, 0x00c4ce, 0x00c6ca,
+ /* 84 */ 0x00b1c9, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8faecb, 0x000000, 0x000000, 0x00c0f2,
+ /* 94 */ 0x000000, 0x000000, 0x00c0b4, 0x00b7aa,
+ /* 98 */ 0x8faed8, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00f5df, 0x00dbd9, 0x8faed9,
+ /* a0 */ 0x000000, 0x00b9bb, 0x00b3fc, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00dbdb, 0x00b3f4, 0x00dbe1,
+ /* ac */ 0x00f5e0, 0x8faeda, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00f5e1, 0x00dbde, 0x8faedc,
+ /* b4 */ 0x00c0f3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00b3cb, 0x00baac, 0x000000, 0x8faedd,
+ /* bc */ 0x00b3ca, 0x00bacf, 0x8faede, 0x000000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x0392e ***/
+
+ /* 80 */ 0x00dbdc, 0x00b7e5, 0x00b7cb, 0x00c5ed,
+ /* 84 */ 0x8faedf, 0x8faee0, 0x00dbda, 0x000000,
+ /* 88 */ 0x00b0c6, 0x8faee1, 0x000000, 0x000000,
+ /* 8c */ 0x8faee2, 0x00dbdd, 0x00dbdf, 0x000000,
+ /* 90 */ 0x00b6cd, 0x00b7ac, 0x00f5de, 0x00b4bc,
+ /* 94 */ 0x00b5cb, 0x8faee3, 0x000000, 0x8faee4,
+ /* 98 */ 0x000000, 0x00dbe2, 0x000000, 0x00f5e2,
+ /* 9c */ 0x00baf9, 0x00cbf1, 0x000000, 0x00bbb7,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dbe3,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00c9b0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8faee6,
+ /* ac */ 0x000000, 0x000000, 0x8faee7, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00f5e3, 0x000000,
+ /* b4 */ 0x00dbef, 0x00f5e4, 0x00b2b3, 0x00dbe4,
+ /* b8 */ 0x000000, 0x000000, 0x8faee8, 0x000000,
+ /* bc */ 0x8faee9, 0x000000, 0x00dbf5, 0x00dbe5,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x0396e ***/
+
+ /* 80 */ 0x000000, 0x00cec2, 0x8faeea, 0x00dbec,
+ /* 84 */ 0x000000, 0x00c7df, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00dbf4, 0x000000, 0x00dbe7,
+ /* 90 */ 0x8faeeb, 0x000000, 0x000000, 0x00b0b4,
+ /* 94 */ 0x00dbe9, 0x000000, 0x8faeec, 0x00b9bc,
+ /* 98 */ 0x8faeee, 0x8faeef, 0x8faef0, 0x00dbeb,
+ /* 9c */ 0x8faef1, 0x00dbea, 0x000000, 0x00dbe6,
+ /* a0 */ 0x00dbf1, 0x000000, 0x00bebf, 0x00f5e6,
+ /* a4 */ 0x000000, 0x00f5e7, 0x00d4ed, 0x00b8e8,
+ /* a8 */ 0x00cdfc, 0x000000, 0x8faef2, 0x8faef3,
+ /* ac */ 0x000000, 0x00dbe8, 0x000000, 0x00c4f4,
+ /* b0 */ 0x00b3a3, 0x00baad, 0x00f5e8, 0x00dbe0,
+ /* b4 */ 0x8faef4, 0x00dbf0, 0x00b3e1, 0x000000,
+ /* b8 */ 0x000000, 0x00dbee, 0x00dbf2, 0x8faef5,
+ /* bc */ 0x00c5ee,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x039ab ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8faefa,
+ /* 84 */ 0x00b4fe, 0x8faefb, 0x00dcb2, 0x000000,
+ /* 88 */ 0x00f5e9, 0x00ccc9, 0x00dbf7, 0x00b4fd,
+ /* 8c */ 0x8faefc, 0x00dbfe, 0x000000, 0x8faefd,
+ /* 90 */ 0x00f5ea, 0x000000, 0x00cbc0, 0x000000,
+ /* 94 */ 0x00dca1, 0x00dca3, 0x8faefe, 0x00dca7,
+ /* 98 */ 0x00dbf9, 0x8fafa1, 0x00c3aa, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00c5ef,
+ /* a0 */ 0x00dcab, 0x00dbfc, 0x000000, 0x00dca8,
+ /* a4 */ 0x8fafa2, 0x8fafa3, 0x000000, 0x00dca2,
+ /* a8 */ 0x00f5eb, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fafa4, 0x00f5ec, 0x00bfb9, 0x00dcac,
+ /* b0 */ 0x00f5ed, 0x00f5ee, 0x00c0b3, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fafa5,
+ /* b8 */ 0x000000, 0x00dcaa, 0x00b4bd, 0x8faef6,
+ /* bc */ 0x00f5ef, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x039eb ***/
+
+ /* 80 */ 0x00cfd0, 0x00dbf6, 0x000000, 0x8fafa6,
+ /* 84 */ 0x00dca6, 0x00b0d8, 0x000000, 0x8fafa7,
+ /* 88 */ 0x00dbf8, 0x000000, 0x00f5f0, 0x00ccba,
+ /* 8c */ 0x00dbfd, 0x00bfa2, 0x00c4c7, 0x00dbf3,
+ /* 90 */ 0x000000, 0x000000, 0x00dca5, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00bffa, 0x00dcaf, 0x00b3f1,
+ /* 9c */ 0x00b8a1, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00dcb1, 0x00dbfa, 0x00dcb0,
+ /* a4 */ 0x000000, 0x00dca9, 0x00dbfb, 0x000000,
+ /* a8 */ 0x00dcad, 0x000000, 0x00dcae, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00dcbf, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00c6ce, 0x00f5f3, 0x00dca4, 0x000000,
+ /* b8 */ 0x000000, 0x00dcbb, 0x000000, 0x8fafab,
+ /* bc */ 0x000000, 0x00dcbd, 0x000000, 0x00c4d8,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x03a2b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00f5f4, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fafad, 0x000000,
+ /* 88 */ 0x000000, 0x00f5f1, 0x00cdcc, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00c9f6,
+ /* 94 */ 0x00dcb8, 0x00c2ca, 0x000000, 0x00f5f5,
+ /* 98 */ 0x000000, 0x00dcbe, 0x00c1bf, 0x000000,
+ /* 9c */ 0x00dcb5, 0x00dcc2, 0x00dcc1, 0x000000,
+ /* a0 */ 0x00c6ef, 0x00dcc0, 0x00c6ea, 0x00f5f6,
+ /* a4 */ 0x00f5f7, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00f5f8, 0x8fafae, 0x00dcc4, 0x00dcb7,
+ /* ac */ 0x8fafaf, 0x00b6c8, 0x00dcba, 0x00bddd,
+ /* b0 */ 0x000000, 0x000000, 0x8fafb0, 0x00c7e0,
+ /* b4 */ 0x00dcbc, 0x00b6cb, 0x000000, 0x00dcb4,
+ /* b8 */ 0x00dcb6, 0x00dcb3, 0x8fafb1, 0x000000,
+ /* bc */ 0x00cfb0, 0x00b3da, 0x00dcb9, 0x8fafb2,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x03a6b ***/
+
+ /* 80 */ 0x00f5f9, 0x00dcc3, 0x00b3b5, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00bae7, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00b1dd, 0x000000,
+ /* 90 */ 0x000000, 0x00dcd4, 0x8fafb3, 0x000000,
+ /* 94 */ 0x00cfb1, 0x00dcd7, 0x8fafb5, 0x000000,
+ /* 98 */ 0x8fafb6, 0x000000, 0x000000, 0x00bfba,
+ /* 9c */ 0x00dcd6, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00dcd5, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00f5fb, 0x8fafb7, 0x00dcd2,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f5fc, 0x00dcc6, 0x000000,
+ /* b0 */ 0x8fafb8, 0x00dce3, 0x00dcc5, 0x000000,
+ /* b4 */ 0x00dcd8, 0x000000, 0x000000, 0x8fafb9,
+ /* b8 */ 0x000000, 0x000000, 0x8fafba, 0x00dcd0,
+ /* bc */ 0x8fafbb, 0x000000, 0x00dccb, 0x00dcc8,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x03aab ***/
+
+ /* 80 */ 0x8fafbc, 0x00dcc9, 0x000000, 0x00dcd1,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00f4a2,
+ /* 88 */ 0x000000, 0x000000, 0x00dcce, 0x00b9bd,
+ /* 8c */ 0x00c4c8, 0x00c1e4, 0x00dccc, 0x00f5fd,
+ /* 90 */ 0x00dcc7, 0x8fafbd, 0x000000, 0x00dcca,
+ /* 94 */ 0x000000, 0x000000, 0x8fafbe, 0x000000,
+ /* 98 */ 0x00cdcd, 0x00cbea, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00dccf, 0x00dcd9, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00f6a2, 0x8fafc4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00dce1,
+ /* a8 */ 0x00dcda, 0x00f6a3, 0x00f6a4, 0x00dce7,
+ /* ac */ 0x000000, 0x00dce5, 0x8fafc5, 0x8fafc6,
+ /* b0 */ 0x000000, 0x000000, 0x00dce0, 0x8fafc7,
+ /* b4 */ 0x8fafc9, 0x00f6a5, 0x00f6a6, 0x000000,
+ /* b8 */ 0x000000, 0x00dcdf, 0x000000, 0x00c4d0,
+ /* bc */ 0x000000, 0x00c1e5, 0x8fafca, 0x00dcdd,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x03aeb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00dcdb, 0x000000,
+ /* 84 */ 0x000000, 0x00dce2, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00dce8, 0x00c8f5,
+ /* 8c */ 0x00dcee, 0x000000, 0x000000, 0x00f6a7,
+ /* 90 */ 0x000000, 0x8fafcb, 0x00dce9, 0x00dcec,
+ /* 94 */ 0x00dce6, 0x00f6a8, 0x000000, 0x00c3f4,
+ /* 98 */ 0x000000, 0x00c9b8, 0x8fafcc, 0x00dcdc,
+ /* 9c */ 0x000000, 0x8fafcd, 0x00dce4, 0x00bec0,
+ /* a0 */ 0x000000, 0x00cccf, 0x00dcf8, 0x00dceb,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00b8a2, 0x00b2a3, 0x00b3df,
+ /* ac */ 0x000000, 0x000000, 0x00dcd3, 0x000000,
+ /* b0 */ 0x8fafc1, 0x000000, 0x8fafcf, 0x8fafd0,
+ /* b4 */ 0x8fafd1, 0x00bec1, 0x00dcf0, 0x000000,
+ /* b8 */ 0x00dcf7, 0x00bcf9, 0x00b3f2, 0x00f6aa,
+ /* bc */ 0x000000, 0x00c3ae, 0x00f6ab, 0x8fafd2,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x03b2b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00dced, 0x00f6ac, 0x8fafd3, 0x00dcf2,
+ /* 88 */ 0x00dcf6, 0x8fafd4, 0x000000, 0x00b6b6,
+ /* 8c */ 0x000000, 0x000000, 0x8fafd6, 0x000000,
+ /* 90 */ 0x00f6ad, 0x000000, 0x8fafd7, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00f6ae, 0x000000,
+ /* 98 */ 0x00b5cc, 0x00dcf4, 0x000000, 0x00f6af,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b5a1,
+ /* a0 */ 0x000000, 0x00c6cb, 0x00dcf3, 0x000000,
+ /* a4 */ 0x8fafd8, 0x000000, 0x00dcf5, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00f6b0,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00dcef, 0x00f6b1,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dcf1, 0x000000, 0x8fafd5, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fafda, 0x00b3e0,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x03b6b ***/
+
+ /* 80 */ 0x00c3c9, 0x000000, 0x000000, 0x8fafdb,
+ /* 84 */ 0x00dcfc, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00f6b3, 0x000000, 0x8fafdc,
+ /* 8c */ 0x000000, 0x00dcfa, 0x00b8e9, 0x000000,
+ /* 90 */ 0x00dcf9, 0x8fafde, 0x000000, 0x000000,
+ /* 94 */ 0x00f6b4, 0x000000, 0x000000, 0x00dda1,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00dbd8, 0x00f6b5, 0x00f6b6, 0x8fafdf,
+ /* a0 */ 0x00dcfb, 0x8fafe0, 0x00dcfd, 0x00dcfe,
+ /* a4 */ 0x000000, 0x00f6b7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00ddac, 0x8fafe2,
+ /* ac */ 0x00dda8, 0x000000, 0x00dbed, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00dda7,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dda6, 0x000000, 0x000000, 0x00dda3,
+ /* bc */ 0x000000, 0x8fafe3, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x03baa ***/
+
+ /* 80 */ 0x000000, 0x00dcea, 0x00dda5, 0x00dda4,
+ /* 84 */ 0x000000, 0x000000, 0x8fafe4, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fafe6, 0x00ddaa, 0x000000, 0x00cfa6,
+ /* 94 */ 0x8fafe5, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00ddad, 0x00b6fb,
+ /* 9c */ 0x8fafe7, 0x8fafe8, 0x00dda9, 0x00ddab,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00f6b8, 0x000000, 0x000000, 0x00f6b9,
+ /* a8 */ 0x00c8a7, 0x000000, 0x00ddae, 0x000000,
+ /* ac */ 0x8fafeb, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fafec, 0x8fafed, 0x8fafee,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00ddb2, 0x00ddaf,
+ /* bc */ 0x000000, 0x8fafef,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x03be8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00cdf3, 0x00ddb0, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00dcde, 0x8faff1,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8faff2,
+ /* 90 */ 0x8faff3, 0x8faff4, 0x00ddb3, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00ddb4, 0x8faff6,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00f6bc,
+ /* 9c */ 0x000000, 0x00b1b5, 0x00f6bd, 0x00ddb6,
+ /* a0 */ 0x00b7e7, 0x00bca1, 0x000000, 0x00b6d5,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00b2a4,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00f6be, 0x000000, 0x000000, 0x8faff8,
+ /* b0 */ 0x000000, 0x000000, 0x00cddf, 0x000000,
+ /* b4 */ 0x000000, 0x00f6bf, 0x000000, 0x00ddb8,
+ /* b8 */ 0x00ddb7, 0x00ddba, 0x00b5bd, 0x000000,
+ /* bc */ 0x000000, 0x00b6d6, 0x00b4be,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x03c27 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00ddbd,
+ /* 84 */ 0x000000, 0x000000, 0x00f6c0, 0x00ddbc,
+ /* 88 */ 0x000000, 0x00ddbe, 0x8faff9, 0x000000,
+ /* 8c */ 0x00b2ce, 0x000000, 0x00c3b7, 0x000000,
+ /* 90 */ 0x00ddbf, 0x000000, 0x000000, 0x00b4bf,
+ /* 94 */ 0x00ddc1, 0x000000, 0x00f6c1, 0x000000,
+ /* 98 */ 0x8faffa, 0x00ddc0, 0x000000, 0x00ddc2,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00ddc3,
+ /* a0 */ 0x00f6c2, 0x00ddc4, 0x00bbdf, 0x00c0b5,
+ /* a4 */ 0x00baa1, 0x00f6c3, 0x00c9f0, 0x00f6c4,
+ /* a8 */ 0x000000, 0x00cae2, 0x00cfc4, 0x000000,
+ /* ac */ 0x8faffb, 0x000000, 0x000000, 0x00bbf5,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00bad0,
+ /* b4 */ 0x00cef2, 0x8faffc, 0x000000, 0x00f6c5,
+ /* b8 */ 0x00ddc5, 0x00ddc6, 0x8faffd, 0x00bbe0,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00ddc7,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x03c67 ***/
+
+ /* 80 */ 0x00ddc8, 0x8faffe, 0x00f6c6, 0x00ddca,
+ /* 84 */ 0x00ddc9, 0x000000, 0x00cbd8, 0x000000,
+ /* 88 */ 0x000000, 0x00bdde, 0x00bcec, 0x00bbc4,
+ /* 8c */ 0x000000, 0x00ddcb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00ddcd, 0x00bfa3, 0x000000,
+ /* 98 */ 0x00ddcc, 0x000000, 0x000000, 0x8feea1,
+ /* 9c */ 0x000000, 0x000000, 0x00ddce, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00ddcf, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f6c7, 0x00ddd0, 0x00ddd1,
+ /* ac */ 0x000000, 0x00f6c8, 0x8feea2, 0x00ddd2,
+ /* b0 */ 0x000000, 0x00ddd4, 0x00ddd3, 0x00ddd5,
+ /* b4 */ 0x00b2a5, 0x00c3ca, 0x000000, 0x00ddd6,
+ /* b8 */ 0x000000, 0x000000, 0x00bba6, 0x00b3cc,
+ /* bc */ 0x00ddd7, 0x8feea4, 0x8feea5, 0x00c5c2,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x03ca7 ***/
+
+ /* 80 */ 0x00d4cc, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b5a3, 0x00ddd8, 0x8feea6,
+ /* 88 */ 0x8feea7, 0x8feea8, 0x000000, 0x00ddd9,
+ /* 8c */ 0x000000, 0x00caec, 0x00cbe8, 0x00f6ca,
+ /* 90 */ 0x000000, 0x000000, 0x00c6c7, 0x00ddda,
+ /* 94 */ 0x00c8e6, 0x000000, 0x00f6cb, 0x00f6cc,
+ /* 98 */ 0x00c8fb, 0x000000, 0x8feea9, 0x00ccd3,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00dddb,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8feeaa, 0x8feeab,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00dddd,
+ /* ac */ 0x00dddc, 0x000000, 0x8feeac, 0x00dddf,
+ /* b0 */ 0x000000, 0x8feead, 0x000000, 0x00ddde,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00f6cd,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x03ce7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8feeae, 0x000000,
+ /* 84 */ 0x000000, 0x00f6ce, 0x000000, 0x000000,
+ /* 88 */ 0x00dde1, 0x000000, 0x8feeaf, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8feeb0, 0x00bbe1,
+ /* 90 */ 0x00f6cf, 0x00ccb1, 0x000000, 0x00dde2,
+ /* 94 */ 0x00dde3, 0x000000, 0x000000, 0x00b5a4,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00dde4,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dde6,
+ /* a4 */ 0x00dde5, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00f6d0,
+ /* b4 */ 0x00bfe5, 0x8feeb1, 0x8feeb2, 0x00c9b9,
+ /* b8 */ 0x00b1ca, 0x000000, 0x8feeb3, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00c8c5, 0x8feeb5,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x03d27 ***/
+
+ /* 80 */ 0x00c4f5, 0x00bdc1, 0x00b5e1, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8feeb6, 0x00c8c6, 0x000000,
+ /* 90 */ 0x00bcae, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00dde8, 0x000000, 0x00b4c0,
+ /* 98 */ 0x000000, 0x00f6d1, 0x00b1f8, 0x8feeb7,
+ /* 9c */ 0x00f6d2, 0x00c6f2, 0x00dde7, 0x00b9be,
+ /* a0 */ 0x00c3d3, 0x000000, 0x00dde9, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8feecf,
+ /* a8 */ 0x00ddf1, 0x000000, 0x00ddea, 0x000000,
+ /* ac */ 0x000000, 0x8feeb8, 0x000000, 0x000000,
+ /* b0 */ 0x00c2c1, 0x000000, 0x00b5e2, 0x00ddf2,
+ /* b4 */ 0x00f6d4, 0x000000, 0x00f6d5, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00b7e8, 0x000000,
+ /* bc */ 0x000000, 0x00b5a5, 0x00ddf0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x03d66 ***/
+
+ /* 80 */ 0x000000, 0x00ddee, 0x00ddeb, 0x00cde0,
+ /* 84 */ 0x8feeb9, 0x00f6d6, 0x00f6d7, 0x000000,
+ /* 88 */ 0x00c4c0, 0x8feeba, 0x000000, 0x000000,
+ /* 8c */ 0x00c6d9, 0x00ddec, 0x000000, 0x000000,
+ /* 90 */ 0x00ddf4, 0x000000, 0x00ddf3, 0x00b7a3,
+ /* 94 */ 0x8feebc, 0x8feebd, 0x00b2ad, 0x8feebe,
+ /* 98 */ 0x00f6d8, 0x00babb, 0x00dded, 0x00ddef,
+ /* 9c */ 0x00f6d9, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00cbd7, 0x00c2f4, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00f6d3, 0x00cbf7,
+ /* ac */ 0x000000, 0x8feebf, 0x00ddfc, 0x000000,
+ /* b0 */ 0x000000, 0x00ddfd, 0x000000, 0x00b2cf,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00caa8, 0x00ccfd, 0x00dea1, 0x00bca3,
+ /* bc */ 0x00bec2, 0x00ddf8, 0x00ddfe, 0x00b1e8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x03da6 ***/
+
+ /* 80 */ 0x000000, 0x00b6b7, 0x8feec0, 0x000000,
+ /* 84 */ 0x00ddf5, 0x00ddfa, 0x00f6db, 0x000000,
+ /* 88 */ 0x000000, 0x00c0f4, 0x00c7f1, 0x000000,
+ /* 8c */ 0x00c8e7, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8feec1, 0x000000, 0x000000, 0x00ddf7,
+ /* 94 */ 0x00f6dc, 0x00cba1, 0x8feec3, 0x00ddf9,
+ /* 98 */ 0x000000, 0x00dea4, 0x8feec4, 0x00dea2,
+ /* 9c */ 0x8feec5, 0x00ddfb, 0x000000, 0x000000,
+ /* a0 */ 0x00f6dd, 0x00cba2, 0x00c7c8, 0x00b5e3,
+ /* a4 */ 0x000000, 0x00c5a5, 0x000000, 0x000000,
+ /* a8 */ 0x00c3ed, 0x8feec6, 0x00dea5, 0x00f6de,
+ /* ac */ 0x8feec7, 0x8feec8, 0x00f6df, 0x00dea3,
+ /* b0 */ 0x00c2d9, 0x00ddf6, 0x000000, 0x00b1cb,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00f6da,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x03de6 ***/
+
+ /* 80 */ 0x8feeca, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00f6e1, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8feecb, 0x00cdce,
+ /* 8c */ 0x00deb0, 0x000000, 0x00f6e2, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00deaf, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c0f6,
+ /* 98 */ 0x000000, 0x00deac, 0x000000, 0x00cdec,
+ /* 9c */ 0x000000, 0x000000, 0x00c6b6, 0x00dea6,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8feecc, 0x00c4c5, 0x8feecd, 0x8feece,
+ /* a8 */ 0x000000, 0x00b1cc, 0x00b9bf, 0x00dea9,
+ /* ac */ 0x000000, 0x000000, 0x00f6e3, 0x8feed0,
+ /* b0 */ 0x000000, 0x00f6e4, 0x00bda7, 0x00deae,
+ /* b4 */ 0x8feee5, 0x00dead, 0x00dea8, 0x000000,
+ /* b8 */ 0x00deab, 0x00f6e5, 0x000000, 0x00b3e8,
+ /* bc */ 0x8feed1, 0x00deaa, 0x00c7c9, 0x00f6e6,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x03e26 ***/
+
+ /* 80 */ 0x000000, 0x00ceae, 0x000000, 0x000000,
+ /* 84 */ 0x00bef4, 0x00c0f5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00f6e7, 0x00deb6, 0x00deb4, 0x8feed2,
+ /* 9c */ 0x00c9cd, 0x000000, 0x8feed3, 0x000000,
+ /* a0 */ 0x8feed4, 0x000000, 0x000000, 0x00deb1,
+ /* a4 */ 0x00deb3, 0x00f6e8, 0x00b1ba, 0x000000,
+ /* a8 */ 0x000000, 0x00b9c0, 0x00cfb2, 0x000000,
+ /* ac */ 0x00b3bd, 0x000000, 0x00c9e2, 0x000000,
+ /* b0 */ 0x8feed5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00cde1, 0x000000, 0x000000, 0x00b3a4,
+ /* b8 */ 0x00bfbb, 0x00deb5, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x03e66 ***/
+
+ /* 80 */ 0x8feed6, 0x8feed7, 0x00f6ea, 0x000000,
+ /* 84 */ 0x000000, 0x00deba, 0x000000, 0x00f6eb,
+ /* 88 */ 0x00bec3, 0x00f6ec, 0x8feed8, 0x000000,
+ /* 8c */ 0x00cdb0, 0x8feed9, 0x00deb7, 0x000000,
+ /* 90 */ 0x000000, 0x8feeda, 0x000000, 0x00deb2,
+ /* 94 */ 0x00f6ed, 0x00deb8, 0x000000, 0x000000,
+ /* 98 */ 0x8feedb, 0x00cede, 0x000000, 0x00c5f3,
+ /* 9c */ 0x00c6c2, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00f6ee, 0x8feee1,
+ /* ac */ 0x00f6ef, 0x000000, 0x8feee2, 0x00b3b6,
+ /* b0 */ 0x000000, 0x000000, 0x00b1d5, 0x000000,
+ /* b4 */ 0x8feee3, 0x00debe, 0x000000, 0x000000,
+ /* b8 */ 0x00dec1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00cec3, 0x000000, 0x000000, 0x00f6f0,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x03ea6 ***/
+
+ /* 80 */ 0x00cde4, 0x000000, 0x8feee4, 0x000000,
+ /* 84 */ 0x00f6f1, 0x00dec8, 0x00dec2, 0x00debf,
+ /* 88 */ 0x8feee6, 0x000000, 0x000000, 0x00ced4,
+ /* 8c */ 0x00dec5, 0x000000, 0x8feee7, 0x8feee8,
+ /* 90 */ 0x8feee9, 0x00bdca, 0x00dec7, 0x000000,
+ /* 94 */ 0x000000, 0x00decc, 0x00f6f2, 0x000000,
+ /* 98 */ 0x00c5f1, 0x00deca, 0x00f6f3, 0x00f6f4,
+ /* 9c */ 0x000000, 0x00f6f5, 0x00dec4, 0x8feeea,
+ /* a0 */ 0x000000, 0x00c3b8, 0x000000, 0x000000,
+ /* a4 */ 0x00decb, 0x000000, 0x00dec0, 0x000000,
+ /* a8 */ 0x00dec6, 0x8feeeb, 0x00decd, 0x00b0fc,
+ /* ac */ 0x00dec3, 0x000000, 0x00dece, 0x000000,
+ /* b0 */ 0x000000, 0x00bfbc, 0x000000, 0x00bddf,
+ /* b4 */ 0x000000, 0x00caa5, 0x8feeec, 0x00baae,
+ /* b8 */ 0x000000, 0x00debb, 0x00dec9, 0x00c5ba,
+ /* bc */ 0x00f6f6,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x03ee3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00c0b6, 0x000000, 0x00b3e9,
+ /* 88 */ 0x00bad1, 0x00bec4, 0x00debd, 0x00bdc2,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00b7cc,
+ /* 94 */ 0x000000, 0x00debc, 0x000000, 0x8feedd,
+ /* 98 */ 0x000000, 0x00ded2, 0x00bded, 0x00b8ba,
+ /* 9c */ 0x000000, 0x00dee1, 0x8feeee, 0x00dedb,
+ /* a0 */ 0x00b5f4, 0x00c5cf, 0x8feeef, 0x00ded6,
+ /* a4 */ 0x00dedf, 0x00b0af, 0x00b1b2, 0x8feef0,
+ /* a8 */ 0x000000, 0x00b2b9, 0x000000, 0x00ded8,
+ /* ac */ 0x00c2ac, 0x00decf, 0x00ded1, 0x00b9c1,
+ /* b0 */ 0x000000, 0x000000, 0x8feef2, 0x000000,
+ /* b4 */ 0x00f6f8, 0x000000, 0x8feeed, 0x000000,
+ /* b8 */ 0x00dee2, 0x000000, 0x00dedd, 0x000000,
+ /* bc */ 0x8feef3, 0x000000, 0x00ded5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x03f22 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00dedc,
+ /* 84 */ 0x00f6f9, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8feef4, 0x8feef5, 0x00ccab, 0x8feef6,
+ /* 8c */ 0x8feef7, 0x00deda, 0x00dede, 0x8feef8,
+ /* 90 */ 0x000000, 0x8feef9, 0x000000, 0x8feefa,
+ /* 94 */ 0x8feefb, 0x000000, 0x00b8d0, 0x8feefc,
+ /* 98 */ 0x00bec5, 0x000000, 0x000000, 0x00c3b9,
+ /* 9c */ 0x00f6fa, 0x000000, 0x00f6fb, 0x00ded4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8feefd,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00cdaf,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00ded7,
+ /* ac */ 0x000000, 0x000000, 0x00ded0, 0x00c5f2,
+ /* b0 */ 0x000000, 0x000000, 0x00ded3, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00ded9, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00cfd1, 0x00bcbe,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x03f62 ***/
+
+ /* 80 */ 0x00cbfe, 0x000000, 0x00dee3, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00c8ae, 0x000000, 0x000000, 0x00deef,
+ /* 90 */ 0x00b8bb, 0x000000, 0x000000, 0x8fefa1,
+ /* 94 */ 0x000000, 0x000000, 0x00bde0, 0x000000,
+ /* 98 */ 0x00dee5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00ceaf, 0x00b9c2, 0x000000, 0x00def2,
+ /* a0 */ 0x000000, 0x000000, 0x00b0ee, 0x000000,
+ /* a4 */ 0x000000, 0x00def0, 0x000000, 0x8fefa2,
+ /* a8 */ 0x000000, 0x000000, 0x00dee4, 0x00f6fc,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00deea,
+ /* b0 */ 0x000000, 0x00f6fd, 0x00deec, 0x000000,
+ /* b4 */ 0x8fefa3, 0x000000, 0x00cdcf, 0x00dee7,
+ /* b8 */ 0x000000, 0x000000, 0x00c5ae, 0x000000,
+ /* bc */ 0x000000, 0x00dee9, 0x000000, 0x8fefa4,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x03fa2 ***/
+
+ /* 80 */ 0x000000, 0x00f6fe, 0x00def1, 0x8fefa5,
+ /* 84 */ 0x00deeb, 0x00ccc7, 0x000000, 0x00f7a1,
+ /* 88 */ 0x000000, 0x00dee6, 0x8fefa6, 0x00bca2,
+ /* 8c */ 0x00defe, 0x000000, 0x00f7a2, 0x000000,
+ /* 90 */ 0x000000, 0x00b3ea, 0x000000, 0x00dee8,
+ /* 94 */ 0x00deed, 0x00deee, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fefa7, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00c2ec, 0x00c2da, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fefa9,
+ /* ac */ 0x00def6, 0x000000, 0x000000, 0x00defc,
+ /* b0 */ 0x000000, 0x000000, 0x00defa, 0x000000,
+ /* b4 */ 0x00c5a9, 0x000000, 0x000000, 0x00dfa3,
+ /* b8 */ 0x00def7, 0x8fefaa, 0x000000, 0x8fefab,
+ /* bc */ 0x000000, 0x000000, 0x00def8, 0x00dee0,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x03fe2 ***/
+
+ /* 80 */ 0x000000, 0x00b5f9, 0x00c9ba, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00bcbf, 0x000000,
+ /* 88 */ 0x000000, 0x00b9f7, 0x8fefac, 0x000000,
+ /* 8c */ 0x8fefad, 0x000000, 0x000000, 0x00cfb3,
+ /* 90 */ 0x00f7a3, 0x00def4, 0x000000, 0x00dfa2,
+ /* 94 */ 0x00b1e9, 0x00c1e6, 0x000000, 0x000000,
+ /* 98 */ 0x8fefae, 0x000000, 0x00f7a4, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c7f9, 0x000000, 0x00b4c1, 0x00cefa,
+ /* a4 */ 0x000000, 0x8fefaf, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00f7a6, 0x00cca1,
+ /* ac */ 0x00c4d2, 0x000000, 0x000000, 0x00f7a7,
+ /* b0 */ 0x000000, 0x00defb, 0x00defd, 0x00f7a8,
+ /* b4 */ 0x000000, 0x8fefa8, 0x8fefb0, 0x000000,
+ /* b8 */ 0x00c1b2, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fefb1, 0x000000, 0x00dfa1, 0x00def9,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x04022 ***/
+
+ /* 80 */ 0x000000, 0x00def3, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b4c3, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00f7a9, 0x8fefb3, 0x000000,
+ /* 94 */ 0x00b7e9, 0x000000, 0x000000, 0x8fefb4,
+ /* 98 */ 0x00dfaf, 0x00f7aa, 0x8fefb5, 0x00dfaa,
+ /* 9c */ 0x00c0f8, 0x000000, 0x00f7ab, 0x00b3e3,
+ /* a0 */ 0x8fefb6, 0x00f7ac, 0x00f7ad, 0x000000,
+ /* a4 */ 0x00bde1, 0x000000, 0x00dfb3, 0x000000,
+ /* a8 */ 0x8fefb7, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00dfac, 0x00c4ac, 0x00dfa9,
+ /* b0 */ 0x00c4d9, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00dfcc, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dfa6, 0x000000, 0x00dfa5, 0x000000,
+ /* bc */ 0x00dfae, 0x8fefb9, 0x00f7ae, 0x000000,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x04062 ***/
+
+ /* 80 */ 0x00dfa8, 0x00dfa7, 0x00dfad, 0x000000,
+ /* 84 */ 0x00c0a1, 0x000000, 0x00dfa4, 0x000000,
+ /* 88 */ 0x00f7af, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00f7b0, 0x00f7b1, 0x00dfb0, 0x000000,
+ /* 90 */ 0x8fefba, 0x00dfb1, 0x000000, 0x000000,
+ /* 94 */ 0x00f7b2, 0x000000, 0x8fefbb, 0x00b4c2,
+ /* 98 */ 0x8fefb8, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fefbd,
+ /* a0 */ 0x00f7b3, 0x00dfb6, 0x000000, 0x00dfb5,
+ /* a4 */ 0x00dfb7, 0x8fefbe, 0x000000, 0x00f7b4,
+ /* a8 */ 0x000000, 0x000000, 0x00dfba, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fefbf,
+ /* b0 */ 0x000000, 0x00c5c3, 0x000000, 0x00dfb4,
+ /* b4 */ 0x000000, 0x8fefc1, 0x00f7b5, 0x000000,
+ /* b8 */ 0x000000, 0x00dfb8, 0x000000, 0x000000,
+ /* bc */ 0x00f7b6, 0x000000, 0x8fefbc, 0x000000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x040a2 ***/
+
+ /* 80 */ 0x00b7e3, 0x00c2f9, 0x00dfb2, 0x00c7bb,
+ /* 84 */ 0x000000, 0x000000, 0x00dfb9, 0x00f7b7,
+ /* 88 */ 0x8fefc2, 0x8fefc3, 0x00f7b8, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00dfbe, 0x00dfbc, 0x000000, 0x000000,
+ /* 98 */ 0x00dfbf, 0x000000, 0x8fefc4, 0x00dfc2,
+ /* 9c */ 0x000000, 0x000000, 0x8fefc5, 0x00dfbb,
+ /* a0 */ 0x00b9ea, 0x00c7a8, 0x000000, 0x000000,
+ /* a4 */ 0x00deb9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fefc6, 0x000000, 0x00cdf4,
+ /* ac */ 0x00dfbd, 0x000000, 0x00dfc1, 0x00c2f5,
+ /* b0 */ 0x00f7ba, 0x00dfc0, 0x000000, 0x00dfab,
+ /* b4 */ 0x000000, 0x00f7bb, 0x00efe9, 0x000000,
+ /* b8 */ 0x000000, 0x00f7b9, 0x00dfc5, 0x000000,
+ /* bc */ 0x8fefc8, 0x000000, 0x00dfc9, 0x000000,
+
+ /*** Three byte table, leaf: e780xx - offset 0x040e2 ***/
+
+ /* 80 */ 0x8fefc9, 0x00dfc7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00f7bc, 0x00f7bd, 0x8fefca,
+ /* 88 */ 0x000000, 0x00dfc3, 0x8fefcb, 0x00dfc4,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00dfc8,
+ /* 90 */ 0x000000, 0x00dfc6, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c9ce, 0x000000, 0x000000,
+ /* 98 */ 0x00dfce, 0x000000, 0x00dfcb, 0x00dfca,
+ /* 9c */ 0x000000, 0x00dfcd, 0x00c6d4, 0x00dfcf,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fefcc,
+ /* a4 */ 0x000000, 0x000000, 0x00c3f5, 0x00c2ed,
+ /* a8 */ 0x00f7be, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c0a5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00dfd0, 0x000000, 0x00dfd2, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fefce, 0x8fefcf, 0x000000,
+ /* bc */ 0x8fefd0, 0x000000, 0x00dfd1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x04121 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fefd1,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fefd2,
+ /* 88 */ 0x000000, 0x000000, 0x00f7bf, 0x8fefd3,
+ /* 8c */ 0x00def5, 0x000000, 0x00f7c2, 0x000000,
+ /* 90 */ 0x000000, 0x00dfd3, 0x000000, 0x000000,
+ /* 94 */ 0x8fefd5, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00c6e7, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00f7c0, 0x00f7c1, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dfd4,
+ /* a4 */ 0x00f7c3, 0x8fefd6, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fefd7, 0x000000, 0x00b2d0,
+ /* ac */ 0x8fefd8, 0x000000, 0x8fefd9, 0x00c5f4,
+ /* b0 */ 0x00b3a5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00f7c4, 0x8fefda, 0x000000,
+ /* b8 */ 0x00b5e4, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bcde, 0x00bad2, 0x8fefdb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x04160 ***/
+
+ /* 80 */ 0x000000, 0x8fefdc, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00f7c5, 0x8fefdd, 0x000000,
+ /* 88 */ 0x000000, 0x00cfa7, 0x00bfe6, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00b1ea, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00dfd6, 0x000000,
+ /* 94 */ 0x000000, 0x8fefde, 0x000000, 0x8fefdf,
+ /* 98 */ 0x000000, 0x00dfd5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fefe2,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00f7c6, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00f7c7,
+ /* ac */ 0x00dfd9, 0x00c3ba, 0x00dfdc, 0x00dfd7,
+ /* b0 */ 0x000000, 0x8fefe3, 0x000000, 0x00dfdb,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00f7c8,
+ /* b8 */ 0x00dfda, 0x00c5c0, 0x00b0d9, 0x8fefe0,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x0419c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00cef5, 0x000000, 0x8fefe6, 0x00dfde,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00b1a8,
+ /* 90 */ 0x000000, 0x8fefe7, 0x000000, 0x8fefe8,
+ /* 94 */ 0x00f7c9, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00f7ca, 0x00dfe0, 0x000000, 0x000000,
+ /* 9c */ 0x8fefe9, 0x00dfdf, 0x000000, 0x00dfdd,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00f7cb, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fefe5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00dfd8, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00cba3, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00dfe2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x041da ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fefea,
+ /* 84 */ 0x8fefeb, 0x000000, 0x8fefec, 0x8fefed,
+ /* 88 */ 0x8fefee, 0x00dfe1, 0x000000, 0x000000,
+ /* 8c */ 0x8fefef, 0x000000, 0x000000, 0x00f7cc,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00b1eb, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00dfe4, 0x00cab2, 0x000000,
+ /* 9c */ 0x00dfe3, 0x000000, 0x00f7ce, 0x000000,
+ /* a0 */ 0x00f7cf, 0x00ccb5, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00bec7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00f7cd,
+ /* ac */ 0x000000, 0x000000, 0x00f7d0, 0x8feff1,
+ /* b0 */ 0x00f7d1, 0x8feff2, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00c1b3, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bec6,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x04217 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00f7d2, 0x00f7d3,
+ /* 88 */ 0x000000, 0x00cefb, 0x8feff4, 0x000000,
+ /* 8c */ 0x00dfea, 0x000000, 0x00c0f9, 0x000000,
+ /* 90 */ 0x8feff3, 0x00f7d4, 0x00f7d6, 0x8feff5,
+ /* 94 */ 0x000000, 0x00dfe6, 0x00dfeb, 0x000000,
+ /* 98 */ 0x000000, 0x00b1ec, 0x000000, 0x000000,
+ /* 9c */ 0x00f7d7, 0x000000, 0x8feff6, 0x000000,
+ /* a0 */ 0x00f7d8, 0x000000, 0x00dfe9, 0x000000,
+ /* a4 */ 0x00c7e1, 0x00dfe5, 0x00dfe8, 0x00bec8,
+ /* a8 */ 0x00f7d9, 0x00c8d1, 0x000000, 0x000000,
+ /* ac */ 0x00dfec, 0x000000, 0x00bcd1, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00c0fa, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e786xx - offset 0x04257 ***/
+
+ /* 80 */ 0x8feff9, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00dfef, 0x00f7db, 0x000000, 0x00f7dc,
+ /* 88 */ 0x00dfe7, 0x000000, 0x00b7a7, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00dfed,
+ /* 90 */ 0x000000, 0x000000, 0x00f7dd, 0x000000,
+ /* 94 */ 0x00cdd0, 0x00dff0, 0x8feff8, 0x000000,
+ /* 98 */ 0x000000, 0x00f4a6, 0x000000, 0x8feffa,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00bdcf,
+ /* a0 */ 0x8feffb, 0x000000, 0x8feffc, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00dff1, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00dff2, 0x000000, 0x8feffd, 0x8feffe,
+ /* b0 */ 0x000000, 0x00c7ae, 0x000000, 0x8ff0a1,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00dff4, 0x00f7df, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00dff5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x04296 ***/
+
+ /* 80 */ 0x000000, 0x00f7de, 0x000000, 0x00c7b3,
+ /* 84 */ 0x00f7e0, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00c5f5, 0x00dff7, 0x000000, 0x8ff0a3,
+ /* 8c */ 0x000000, 0x000000, 0x00dff9, 0x000000,
+ /* 90 */ 0x00ced5, 0x000000, 0x00dff6, 0x8ff0a4,
+ /* 94 */ 0x00dff8, 0x00b1ed, 0x000000, 0x00dff3,
+ /* 98 */ 0x000000, 0x8ff0a5, 0x000000, 0x000000,
+ /* 9c */ 0x8ff0a6, 0x000000, 0x000000, 0x00d3db,
+ /* a0 */ 0x00dffa, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c1e7, 0x00bbb8, 0x00dffc,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00dffb, 0x00bfa4, 0x00d2d9, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00dffd, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e0a1, 0x000000, 0x00dfee,
+ /* bc */ 0x00dffe, 0x000000, 0x00f7e1, 0x00e0a2,
+
+ /*** Three byte table, leaf: e788xx - offset 0x042d6 ***/
+
+ /* 80 */ 0x00f7e2, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00c7fa, 0x8ff0a7,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e0a3, 0x000000, 0x000000,
+ /* 90 */ 0x00e0a4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00f7e3, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00e0a5,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00e0a6, 0x000000, 0x00c4de, 0x8ff0aa,
+ /* ac */ 0x00e0a8, 0x00e0a7, 0x000000, 0x000000,
+ /* b0 */ 0x00e0a9, 0x000000, 0x00e0aa, 0x000000,
+ /* b4 */ 0x8ff0ab, 0x00bcdf, 0x00c9e3, 0x000000,
+ /* b8 */ 0x8ff0ac, 0x8ff0ad, 0x00ccec, 0x00e0ab,
+ /* bc */ 0x00e0ac, 0x00c1d6, 0x00bca4, 0x00e0ad,
+
+ /*** Three byte table, leaf: e789xx - offset 0x04316 ***/
+
+ /* 80 */ 0x00e0ae, 0x000000, 0x8ff0af, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e0af, 0x00cad2,
+ /* 88 */ 0x00c8c7, 0x000000, 0x000000, 0x00e0b0,
+ /* 8c */ 0x00c7d7, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00c4ad, 0x8ff0b0,
+ /* 94 */ 0x000000, 0x00f7e4, 0x00f7e5, 0x8ff0b1,
+ /* 98 */ 0x00e0b1, 0x00b2e7, 0x000000, 0x00b5ed,
+ /* 9c */ 0x000000, 0x00ccc6, 0x000000, 0x00ccb6,
+ /* a0 */ 0x000000, 0x00b2b4, 0x00cfb4, 0x8ff0b2,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00cbd2,
+ /* a8 */ 0x000000, 0x00caaa, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff0b4, 0x8ff0b5,
+ /* b0 */ 0x000000, 0x000000, 0x00c0b7, 0x000000,
+ /* b4 */ 0x00e0b2, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ff0b6, 0x00c6c3, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00b8a3, 0x00e0b3, 0x8ff0b7,
+
+ /*** Three byte table, leaf: e78axx - offset 0x04356 ***/
+
+ /* 80 */ 0x00bad4, 0x00e0b5, 0x00e0b4, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e0b6,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00f7e7, 0x8ff0b8, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e0b7, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00e0b8, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00f7e8,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00b5be, 0x000000, 0x00e0b9, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00e0ba,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00b8a4, 0x8ff0ba, 0x8ff0bb, 0x00c8c8,
+ /* b0 */ 0x8ff0bc, 0x8ff0bd, 0x00e0bc, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00bef5, 0x000000,
+ /* b8 */ 0x000000, 0x00e0bb, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00f7e9, 0x000000,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x04396 ***/
+
+ /* 80 */ 0x00f7ea, 0x8ff0be, 0x00b6b8, 0x00e0bd,
+ /* 84 */ 0x00e0bf, 0x000000, 0x00e0be, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff0c0, 0x000000, 0x00e0c0, 0x000000,
+ /* 90 */ 0x00b8d1, 0x000000, 0x00e0c1, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00b6e9,
+ /* 98 */ 0x000000, 0x00c1c0, 0x000000, 0x00b9fd,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00e0c3, 0x00e0c4, 0x00e0c2, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00bced, 0x000000, 0x000000,
+ /* ac */ 0x00c6c8, 0x00b6b9, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff0c3,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00e0c6,
+ /* b8 */ 0x00c3ac, 0x00e0c5, 0x8ff0c4, 0x00f7eb,
+ /* bc */ 0x00cfb5, 0x00c7e2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x043d4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff0c5,
+ /* 88 */ 0x000000, 0x000000, 0x00e0c9, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8ff0c6, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00e0cb, 0x00e0c8,
+ /* 98 */ 0x8ff0c7, 0x8ff0c8, 0x000000, 0x00ccd4,
+ /* 9c */ 0x00e0ca, 0x00e0cc, 0x000000, 0x00cec4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00e0d0, 0x000000, 0x00f7ed,
+ /* a8 */ 0x00f7ee, 0x00e0cf, 0x00c3f6, 0x00c7ad,
+ /* ac */ 0x8ff0cb, 0x000000, 0x00b8a5, 0x00e0ce,
+ /* b0 */ 0x000000, 0x8ff0cc, 0x000000, 0x8ff0cd,
+ /* b4 */ 0x00e0cd, 0x000000, 0x00cdb1, 0x00cdb2,
+ /* b8 */ 0x000000, 0x8ff0ca, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff0ce, 0x00e0d1, 0x00b1ee,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x04414 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00b9f6, 0x00bbe2, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00e0d2, 0x00e0d3,
+ /* 90 */ 0x00f7f0, 0x000000, 0x8ff0cf, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00e0d5,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00bdc3,
+ /* a4 */ 0x000000, 0x000000, 0x00f7f1, 0x000000,
+ /* a8 */ 0x00e0d7, 0x000000, 0x00e0d6, 0x8ff0d1,
+ /* ac */ 0x8ff0d2, 0x000000, 0x8ff0d4, 0x8ff0d5,
+ /* b0 */ 0x00e0d8, 0x8ff0d6, 0x00b3cd, 0x000000,
+ /* b4 */ 0x000000, 0x00e0da, 0x000000, 0x8ff0d7,
+ /* b8 */ 0x00e0d9, 0x000000, 0x00e0dc, 0x00e0db,
+ /* bc */ 0x00f7f2, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x04453 ***/
+
+ /* 80 */ 0x000000, 0x8ff0d8, 0x000000, 0x000000,
+ /* 84 */ 0x00b8bc, 0x8ff0d9, 0x000000, 0x00cea8,
+ /* 88 */ 0x000000, 0x00b6cc, 0x8ff0da, 0x00b2a6,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff0db, 0x00f7f3, 0x00b6ea, 0x000000,
+ /* 98 */ 0x8ff0dc, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ff0dd, 0x000000, 0x8ff0de, 0x00f7f4,
+ /* a0 */ 0x00f7f5, 0x000000, 0x00f7f6, 0x000000,
+ /* a4 */ 0x000000, 0x8ff0df, 0x00f7f7, 0x000000,
+ /* a8 */ 0x8ff0e0, 0x00b4e1, 0x000000, 0x00f7f8,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00cee8, 0x00e0de,
+ /* b4 */ 0x000000, 0x8ff0e1, 0x000000, 0x8ff0e2,
+ /* b8 */ 0x000000, 0x8ff0e3, 0x000000, 0x00e0e0,
+ /* bc */ 0x8ff0e4, 0x000000, 0x000000, 0x8ff0e5,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x04493 ***/
+
+ /* 80 */ 0x00e0e1, 0x000000, 0x00b2d1, 0x000000,
+ /* 84 */ 0x000000, 0x8ff0e6, 0x000000, 0x000000,
+ /* 88 */ 0x00e0dd, 0x00f7f9, 0x00bbb9, 0x8ff0e7,
+ /* 8c */ 0x000000, 0x00c4c1, 0x00e0df, 0x00f7fa,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00f7fb, 0x000000,
+ /* 98 */ 0x000000, 0x00f7fc, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00e0e4, 0x000000,
+ /* a0 */ 0x00bcee, 0x8ff0e8, 0x000000, 0x00f7fd,
+ /* a4 */ 0x000000, 0x00e0e2, 0x000000, 0x8ff0e9,
+ /* a8 */ 0x000000, 0x00f7fe, 0x00b7be, 0x000000,
+ /* ac */ 0x000000, 0x00c8c9, 0x00e0e3, 0x000000,
+ /* b0 */ 0x000000, 0x00e0fe, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00e0e9, 0x8ff0ea, 0x8ff0ec, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00b8bd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x044d2 ***/
+
+ /* 80 */ 0x000000, 0x8ff0ed, 0x000000, 0x00b5e5,
+ /* 84 */ 0x000000, 0x00e0e6, 0x00cdfd, 0x00f8a1,
+ /* 88 */ 0x000000, 0x00ceb0, 0x00f8a2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8ff0eb,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00f8a3, 0x00f8a4,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00c2f6, 0x000000,
+ /* a4 */ 0x8ff0ee, 0x00e0e8, 0x00f8a6, 0x000000,
+ /* a8 */ 0x00f8a7, 0x000000, 0x00f8a8, 0x00f8a9,
+ /* ac */ 0x00f8aa, 0x000000, 0x00f8ab, 0x00f8ac,
+ /* b0 */ 0x00f8ad, 0x8ff0ef, 0x00e0ea, 0x00ced6,
+ /* b4 */ 0x00b6d7, 0x00c8fc, 0x00c7ca, 0x000000,
+ /* b8 */ 0x000000, 0x8ff0f0, 0x00e0eb, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00e0ed,
+
+ /*** Three byte table, leaf: e791xx - offset 0x04512 ***/
+
+ /* 80 */ 0x8ff0f2, 0x00e0f0, 0x000000, 0x8ff0f3,
+ /* 84 */ 0x00f8ae, 0x000000, 0x00f8af, 0x00f8b0,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00f8b1,
+ /* 8c */ 0x000000, 0x8ff0f4, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8ff0f5, 0x8ff0f1,
+ /* 94 */ 0x000000, 0x00e0ec, 0x000000, 0x00f8b2,
+ /* 98 */ 0x000000, 0x00e0ef, 0x00b8ea, 0x00b1cd,
+ /* 9c */ 0x00e0f1, 0x8ff0f6, 0x00bff0, 0x00e0ee,
+ /* a0 */ 0x00cedc, 0x000000, 0x00f8b3, 0x00e0f4,
+ /* a4 */ 0x00f4a4, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00e0f2, 0x00e0f5, 0x00f8b4,
+ /* ac */ 0x000000, 0x00f8b5, 0x000000, 0x00e0e7,
+ /* b0 */ 0x00e0f3, 0x8ff0f7, 0x000000, 0x00babc,
+ /* b4 */ 0x000000, 0x000000, 0x00e0f6, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00e0f7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x04551 ***/
+
+ /* 80 */ 0x000000, 0x8ff0f8, 0x000000, 0x00cdfe,
+ /* 84 */ 0x000000, 0x8ff0f9, 0x00f8b6, 0x00f8b7,
+ /* 88 */ 0x8ff0fa, 0x00f8b8, 0x000000, 0x00e0f8,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00f8bd, 0x000000, 0x8ff0fc, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff0fd,
+ /* 98 */ 0x00f8b9, 0x8ff0fe, 0x000000, 0x000000,
+ /* 9c */ 0x00f8ba, 0x000000, 0x00e0f9, 0x00f8bb,
+ /* a0 */ 0x8ff1a1, 0x8ff1a2, 0x00e0e5, 0x00f8bc,
+ /* a4 */ 0x000000, 0x8ff1a3, 0x00f8be, 0x00e0fa,
+ /* a8 */ 0x00f8bf, 0x00f8c0, 0x8ff1a4, 0x8ff1a5,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00b4c4, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00f8c1, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff1a6, 0x8ff1a8, 0x8ff1a7,
+ /* bc */ 0x000000, 0x00bca5, 0x000000, 0x00f8c2,
+
+ /*** Three byte table, leaf: e793xx - offset 0x04591 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00f8c3, 0x00f8c4, 0x00e0fb, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00e0fc,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00e0fd, 0x000000, 0x8ff1a9, 0x000000,
+ /* 98 */ 0x8ff1aa, 0x000000, 0x00f8c5, 0x000000,
+ /* 9c */ 0x00b1bb, 0x000000, 0x8ff1ab, 0x000000,
+ /* a0 */ 0x00e1a1, 0x000000, 0x00c9bb, 0x00e1a2,
+ /* a4 */ 0x000000, 0x000000, 0x00b4a4, 0x00e1a3,
+ /* a8 */ 0x000000, 0x00e1a4, 0x000000, 0x8ff1ad,
+ /* ac */ 0x000000, 0x000000, 0x00e1a5, 0x8ff1ac,
+ /* b0 */ 0x00e1a7, 0x00e1a8, 0x00e1a6, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00c9d3, 0x00e1aa,
+ /* b8 */ 0x00e1a9, 0x000000, 0x8ff1af, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00f8c6,
+
+ /*** Three byte table, leaf: e794xx - offset 0x045d1 ***/
+
+ /* 80 */ 0x000000, 0x00f8c7, 0x000000, 0x00e1ac,
+ /* 84 */ 0x00e1ab, 0x00e1ad, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00e1ae, 0x00e1b0, 0x00e1af, 0x000000,
+ /* 90 */ 0x000000, 0x00b9f9, 0x000000, 0x00e1b2,
+ /* 94 */ 0x000000, 0x00e1b1, 0x000000, 0x00f8c8,
+ /* 98 */ 0x00b4c5, 0x000000, 0x00bfd3, 0x000000,
+ /* 9c */ 0x00c5bc, 0x000000, 0x00e1b3, 0x00c0b8,
+ /* a0 */ 0x8ff1b1, 0x000000, 0x000000, 0x00bbba,
+ /* a4 */ 0x8ff1b2, 0x00b1f9, 0x00e1b4, 0x000000,
+ /* a8 */ 0x00cdd1, 0x000000, 0x8ff1b3, 0x00cae3,
+ /* ac */ 0x00e1b5, 0x000000, 0x000000, 0x00f8c9,
+ /* b0 */ 0x00c5c4, 0x00cdb3, 0x00b9c3, 0x00bfbd,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c3cb,
+ /* b8 */ 0x00d2b4, 0x000000, 0x00c4ae, 0x00b2e8,
+ /* bc */ 0x00e1b6, 0x8ff1b6, 0x8ff1b7, 0x000000,
+
+ /*** Three byte table, leaf: e795xx - offset 0x04611 ***/
+
+ /* 80 */ 0x8ff1b8, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00e1b7, 0x000000, 0x00e1bc, 0x000000,
+ /* 88 */ 0x8ff1b9, 0x00e1ba, 0x00e1b9, 0x00dac2,
+ /* 8c */ 0x00b3a6, 0x00e1b8, 0x8ff1ba, 0x00b0da,
+ /* 90 */ 0x8ff1bb, 0x00c8aa, 0x8ff1bc, 0x000000,
+ /* 94 */ 0x00c8ca, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00ceb1, 0x00e1bd, 0x00e1bb,
+ /* 9c */ 0x00c3dc, 0x00c0a6, 0x000000, 0x000000,
+ /* a0 */ 0x00c8ab, 0x000000, 0x00c9ad, 0x000000,
+ /* a4 */ 0x00e1bf, 0x00ceac, 0x00b7cd, 0x00e1c0,
+ /* a8 */ 0x000000, 0x00e1be, 0x00c8d6, 0x00e1c1,
+ /* ac */ 0x8ff1bd, 0x00e1c2, 0x000000, 0x00f8ca,
+ /* b0 */ 0x00b0db, 0x8ff1bf, 0x8ff1be, 0x00bef6,
+ /* b4 */ 0x00e1c7, 0x000000, 0x00e1c4, 0x00c6ed,
+ /* b8 */ 0x00e1c3, 0x00f8cb, 0x8ff1c0, 0x000000,
+ /* bc */ 0x000000, 0x8ff1c1, 0x8ff1c2, 0x00b5a6,
+
+ /*** Three byte table, leaf: e796xx - offset 0x04651 ***/
+
+ /* 80 */ 0x000000, 0x8ff1c3, 0x00e1ca, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e1c5, 0x00e1c6,
+ /* 88 */ 0x000000, 0x00e1c9, 0x00e1c8, 0x00c9a5,
+ /* 8c */ 0x8ff1c5, 0x000000, 0x00c1c2, 0x00c1c1,
+ /* 90 */ 0x000000, 0x00b5bf, 0x00f8cc, 0x000000,
+ /* 94 */ 0x00e1cb, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00e1cc, 0x000000,
+ /* 9c */ 0x000000, 0x00e1cd, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8ff1c7, 0x00e1cf,
+ /* a4 */ 0x000000, 0x00e1ce, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00b1d6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff1c9, 0x00e1d7, 0x00c8e8, 0x00e1d1,
+ /* b4 */ 0x000000, 0x00e1d3, 0x000000, 0x8ff1ca,
+ /* b8 */ 0x00e1d5, 0x00bfbe, 0x000000, 0x000000,
+ /* bc */ 0x00e1d6, 0x00e1d4, 0x00bcc0, 0x8ff1cb,
+
+ /*** Three byte table, leaf: e797xx - offset 0x04691 ***/
+
+ /* 80 */ 0x8ff1cc, 0x000000, 0x00e1d0, 0x00e1d2,
+ /* 84 */ 0x000000, 0x00c9c2, 0x8ff1cd, 0x00bec9,
+ /* 88 */ 0x000000, 0x000000, 0x00e1d9, 0x000000,
+ /* 8c */ 0x000000, 0x00e1d8, 0x00f8ce, 0x8ff1ce,
+ /* 90 */ 0x000000, 0x000000, 0x00e1da, 0x8ff1cf,
+ /* 94 */ 0x00bca6, 0x00baaf, 0x000000, 0x000000,
+ /* 98 */ 0x00c5f7, 0x00e1db, 0x000000, 0x00c4cb,
+ /* 9c */ 0x000000, 0x8ff1d0, 0x00e1dd, 0x8ff1d1,
+ /* a0 */ 0x8ff1d2, 0x000000, 0x00cea1, 0x00e1dc,
+ /* a4 */ 0x00f8cf, 0x000000, 0x000000, 0x8ff1d3,
+ /* a8 */ 0x000000, 0x00c1e9, 0x000000, 0x000000,
+ /* ac */ 0x8ff1d4, 0x000000, 0x8ff1d5, 0x000000,
+ /* b0 */ 0x00e1e2, 0x8ff1d6, 0x00e1e4, 0x00e1e5,
+ /* b4 */ 0x00c3d4, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff1d7, 0x00e1e3, 0x000000,
+ /* bc */ 0x00e1e0, 0x000000, 0x00e1de, 0x00e1df,
+
+ /*** Three byte table, leaf: e798xx - offset 0x046d1 ***/
+
+ /* 80 */ 0x00f8d0, 0x00e1e1, 0x00f8d1, 0x8ff1d8,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff1da,
+ /* 88 */ 0x00f8d2, 0x00e1e8, 0x000000, 0x00e1e6,
+ /* 8c */ 0x000000, 0x00e1e7, 0x000000, 0x8ff1db,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8ff1de,
+ /* 94 */ 0x000000, 0x00f8d3, 0x00f8d4, 0x000000,
+ /* 98 */ 0x8ff1d9, 0x00f8d5, 0x000000, 0x8ff1df,
+ /* 9c */ 0x8ff1e0, 0x000000, 0x00f8d6, 0x00e1e9,
+ /* a0 */ 0x00e1eb, 0x00e1ec, 0x00e1ed, 0x000000,
+ /* a4 */ 0x00e1ee, 0x8ff1e2, 0x00fefd, 0x00e1ea,
+ /* a8 */ 0x8ff1e3, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f8d7, 0x000000, 0x000000,
+ /* b0 */ 0x00e1f0, 0x000000, 0x000000, 0x8ff1e5,
+ /* b4 */ 0x00e1ef, 0x00f8d8, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00e1f1,
+ /* bc */ 0x8ff1e4, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x04710 ***/
+
+ /* 80 */ 0x000000, 0x8ff1e8, 0x00cec5, 0x00f8d9,
+ /* 84 */ 0x000000, 0x000000, 0x00e1f4, 0x00e1f2,
+ /* 88 */ 0x00e1f3, 0x8ff1ea, 0x000000, 0x00f8da,
+ /* 8c */ 0x00b4e2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00ccfe, 0x000000,
+ /* 94 */ 0x000000, 0x8ff1eb, 0x00caca, 0x000000,
+ /* 98 */ 0x00e1f6, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00e1f5, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00e1f7, 0x00e1f8, 0x000000,
+ /* a4 */ 0x00f8db, 0x00f8dc, 0x000000, 0x00e1fc,
+ /* a8 */ 0x00e1f9, 0x00e1fa, 0x00e1fb, 0x000000,
+ /* ac */ 0x00e1fd, 0x00f8dd, 0x8ff1ed, 0x00f8de,
+ /* b0 */ 0x00e1fe, 0x00f8df, 0x00e2a1, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00e2a2, 0x000000,
+ /* b8 */ 0x00e2a3, 0x000000, 0x00c8af, 0x00c5d0,
+ /* bc */ 0x00e2a4, 0x00c7f2, 0x00c9b4, 0x000000,
+
+ /*** Three byte table, leaf: e79axx - offset 0x04750 ***/
+
+ /* 80 */ 0x00e2a5, 0x00f8e0, 0x000000, 0x00e2a6,
+ /* 84 */ 0x00c5aa, 0x000000, 0x00b3a7, 0x00b9c4,
+ /* 88 */ 0x00e2a7, 0x000000, 0x000000, 0x00e2a8,
+ /* 8c */ 0x000000, 0x000000, 0x00e2a9, 0x000000,
+ /* 90 */ 0x00bba9, 0x000000, 0x000000, 0x00e2ab,
+ /* 94 */ 0x000000, 0x8ff1ee, 0x00e2aa, 0x000000,
+ /* 98 */ 0x000000, 0x00e2ac, 0x00e2ad, 0x00f8e1,
+ /* 9c */ 0x8ff1ef, 0x00f8e2, 0x00f8e3, 0x000000,
+ /* a0 */ 0x8ff1f1, 0x8ff1f0, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00f8e4, 0x8ff1f2,
+ /* a8 */ 0x8ff1f3, 0x000000, 0x00f8e5, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00c8e9, 0x8ff1f4,
+ /* b0 */ 0x00e2ae, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00e2af, 0x000000, 0x00f8e6, 0x00f3e9,
+ /* b8 */ 0x00e2b0, 0x00e2b1, 0x00e2b2, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00bbae,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x04790 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00e2b3, 0x00c7d6,
+ /* 84 */ 0x000000, 0x00f8e7, 0x00cbdf, 0x000000,
+ /* 88 */ 0x00b1ce, 0x8ff1f6, 0x00b1d7, 0x000000,
+ /* 8c */ 0x00f8e8, 0x00e2b4, 0x00f8e9, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e2b6, 0x000000,
+ /* 94 */ 0x00f8ea, 0x000000, 0x00e2b5, 0x00c5f0,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00c0b9,
+ /* 9c */ 0x00ddb9, 0x000000, 0x00e2b7, 0x00ccc1,
+ /* a0 */ 0x000000, 0x00e2b8, 0x000000, 0x00b4c6,
+ /* a4 */ 0x00c8d7, 0x00e2b9, 0x00f8eb, 0x00e2ba,
+ /* a8 */ 0x8ff1f8, 0x000000, 0x00e2bb, 0x000000,
+ /* ac */ 0x8ff1f9, 0x000000, 0x00ccdc, 0x000000,
+ /* b0 */ 0x000000, 0x00f8ec, 0x00ccd5, 0x000000,
+ /* b4 */ 0x00c4be, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00c1ea, 0x000000, 0x000000, 0x00e2bd,
+ /* bc */ 0x00f8ed, 0x000000, 0x00bde2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x047cf ***/
+
+ /* 80 */ 0x000000, 0x00beca, 0x000000, 0x000000,
+ /* 84 */ 0x00e2c0, 0x000000, 0x000000, 0x00e2bf,
+ /* 88 */ 0x00e2be, 0x00c8fd, 0x00f8ee, 0x00b4c7,
+ /* 8c */ 0x00b8a9, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff1fb,
+ /* 98 */ 0x000000, 0x00f8ef, 0x8ff1fc, 0x00e2c6,
+ /* 9c */ 0x000000, 0x000000, 0x00e2c3, 0x00bfbf,
+ /* a0 */ 0x00ccb2, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00e2c2, 0x00e2c4, 0x00e2c5, 0x000000,
+ /* a8 */ 0x000000, 0x00e2c1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8ff1fd, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00f8f0, 0x8ff1fe, 0x00f8f1, 0x00e2c7,
+ /* b8 */ 0x00e2c8, 0x000000, 0x00c4af, 0x000000,
+ /* bc */ 0x00b4e3, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x0480f ***/
+
+ /* 80 */ 0x00c3e5, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00f8f2, 0x00e2c9,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00f8f3, 0x00f8f4, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ff2a5, 0x000000, 0x00e2ca, 0x00e2cd,
+ /* 9c */ 0x00f8f5, 0x000000, 0x000000, 0x00f8f6,
+ /* a0 */ 0x8ff2a6, 0x00bfe7, 0x00f8f7, 0x00c6c4,
+ /* a4 */ 0x000000, 0x00e2ce, 0x00cbd3, 0x000000,
+ /* a8 */ 0x00e2cb, 0x000000, 0x8ff2a7, 0x00e2cc,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ff2a9, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e2d1, 0x00f8f8, 0x000000,
+ /* bc */ 0x8ff2aa, 0x8ff2ab, 0x00e2d0, 0x00e2cf,
+
+ /*** Three byte table, leaf: e79exx - offset 0x0484f ***/
+
+ /* 80 */ 0x00f8f9, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00e2d3,
+ /* 8c */ 0x000000, 0x000000, 0x00e2d2, 0x000000,
+ /* 90 */ 0x000000, 0x00e2d4, 0x000000, 0x000000,
+ /* 94 */ 0x00f8fa, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8ff2ae, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00e2d6, 0x8ff2af,
+ /* a0 */ 0x00e2d5, 0x000000, 0x8ff2b0, 0x000000,
+ /* a4 */ 0x8ff2b1, 0x00cacd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff2b2, 0x00f8fb, 0x000000,
+ /* ac */ 0x00bdd6, 0x00cec6, 0x000000, 0x000000,
+ /* b0 */ 0x00e2d7, 0x000000, 0x000000, 0x00c6b7,
+ /* b4 */ 0x000000, 0x000000, 0x00e2d8, 0x000000,
+ /* b8 */ 0x000000, 0x00e2d9, 0x000000, 0x00e2dd,
+ /* bc */ 0x00e2db, 0x00e2dc, 0x000000, 0x00e2da,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x0488f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e2de,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e2df, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00e2e0,
+ /* 98 */ 0x000000, 0x000000, 0x00e2e1, 0x00ccb7,
+ /* 9c */ 0x00e2e2, 0x000000, 0x8ff2b3, 0x8ff2b4,
+ /* a0 */ 0x00f8fc, 0x000000, 0x00ccf0, 0x00e2e3,
+ /* a4 */ 0x8ff2b5, 0x00c3ce, 0x8ff2b6, 0x00c7ea,
+ /* a8 */ 0x000000, 0x00b6eb, 0x8ff2b7, 0x000000,
+ /* ac */ 0x8ff2b8, 0x00c3bb, 0x00e2e4, 0x00b6ba,
+ /* b0 */ 0x8ff2ba, 0x000000, 0x000000, 0x00c0d0,
+ /* b4 */ 0x8ff2bb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ff2bc,
+ /* bc */ 0x00e2e5, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x048cd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00babd, 0x000000,
+ /* 84 */ 0x000000, 0x8ff2be, 0x8ff2bf, 0x000000,
+ /* 88 */ 0x000000, 0x8ff2c0, 0x000000, 0x000000,
+ /* 8c */ 0x00e2e6, 0x8ff2c1, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e2e7, 0x000000,
+ /* 94 */ 0x00b8a6, 0x00bad5, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ff2c2, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00e2e9, 0x8ff2c3, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c5d6, 0x00bad6, 0x00b5ce,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8ff2c4, 0x00f8fd, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00cba4, 0x000000,
+ /* b4 */ 0x00c7cb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00c5d7, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00b9dc,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x0490d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00f9a1,
+ /* 84 */ 0x000000, 0x00e2eb, 0x000000, 0x8ff2c5,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00f9a2, 0x00f9a3,
+ /* 90 */ 0x000000, 0x00f9a4, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00becb, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8ff2c6, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00f9a5, 0x000000, 0x8ff2c7, 0x00ceb2,
+ /* ac */ 0x00b9c5, 0x000000, 0x00f9a6, 0x00b8a7,
+ /* b0 */ 0x000000, 0x000000, 0x00c8a3, 0x000000,
+ /* b4 */ 0x00e2ed, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00e2ef, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0494c ***/
+
+ /* 80 */ 0x000000, 0x00b8eb, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e2ee, 0x00c4f6,
+ /* 88 */ 0x000000, 0x000000, 0x8ff2c9, 0x000000,
+ /* 8c */ 0x00e2f1, 0x00b3b7, 0x00e2ec, 0x000000,
+ /* 90 */ 0x000000, 0x00c8ea, 0x000000, 0x00b1b0,
+ /* 94 */ 0x8ff2ca, 0x00baec, 0x000000, 0x00cfd2,
+ /* 98 */ 0x000000, 0x000000, 0x00e2f0, 0x000000,
+ /* 9c */ 0x000000, 0x8ff2cc, 0x8ff2cd, 0x8ff2ce,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00e2f2,
+ /* a4 */ 0x8ff2cb, 0x000000, 0x000000, 0x00cacb,
+ /* a8 */ 0x000000, 0x00c0d9, 0x00e2f4, 0x000000,
+ /* ac */ 0x000000, 0x00f9aa, 0x000000, 0x00e2f5,
+ /* b0 */ 0x00f9a8, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00e2f3, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00b3ce, 0x8ff2cf,
+ /* bc */ 0x00e2fb, 0x000000, 0x00e2fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0498b ***/
+
+ /* 80 */ 0x000000, 0x00bca7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00e2fc, 0x00e2f7, 0x000000,
+ /* 88 */ 0x8ff2d0, 0x000000, 0x00e2fd, 0x00e2f8,
+ /* 8c */ 0x8ff2d1, 0x000000, 0x8ff2d2, 0x000000,
+ /* 90 */ 0x00c8d8, 0x00e2f6, 0x000000, 0x000000,
+ /* 94 */ 0x00e2f9, 0x8ff2d3, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00e3a2, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff2d4, 0x8ff2d5, 0x000000, 0x000000,
+ /* a4 */ 0x00f9ab, 0x000000, 0x8ff2d6, 0x00e3a1,
+ /* a8 */ 0x00cbe1, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00e2fe, 0x000000, 0x000000, 0x00b0eb,
+ /* b0 */ 0x000000, 0x000000, 0x00f9ac, 0x000000,
+ /* b4 */ 0x00e3a4, 0x000000, 0x000000, 0x00f9ae,
+ /* b8 */ 0x000000, 0x8ff2d7, 0x8ff2d8, 0x8ff2d9,
+ /* bc */ 0x000000, 0x00e3a3, 0x8ff2da, 0x000000,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x049cb ***/
+
+ /* 80 */ 0x00f9ad, 0x00becc, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e3a5,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00c1c3, 0x000000,
+ /* 90 */ 0x8ff2dc, 0x00e3a7, 0x00e3a6, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00e3a8, 0x000000, 0x8ff2dd,
+ /* 9c */ 0x00f9af, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff2df, 0x00e2e8, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00e2ea, 0x00e3aa,
+ /* ac */ 0x00e3a9, 0x000000, 0x00f9b0, 0x000000,
+ /* b0 */ 0x8ff2de, 0x00f9b1, 0x000000, 0x000000,
+ /* b4 */ 0x00f9b2, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00bca8, 0x8ff2e0,
+ /* bc */ 0x00cee9, 0x000000, 0x00bcd2, 0x000000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x04a0b ***/
+
+ /* 80 */ 0x00e3ab, 0x00b7b7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00f9b5, 0x00f9b6, 0x00b5c0,
+ /* 88 */ 0x00b5a7, 0x00bbe3, 0x8ff2e1, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00cdb4, 0x000000, 0x000000, 0x00e3b1,
+ /* 94 */ 0x000000, 0x00e3b0, 0x00c1c4, 0x00e3ad,
+ /* 98 */ 0x8ff2e2, 0x000000, 0x00e3af, 0x8ff2e3,
+ /* 9c */ 0x00f9ba, 0x00bdcb, 0x00bfc0, 0x00e3ae,
+ /* a0 */ 0x00e3ac, 0x000000, 0x00c7aa, 0x000000,
+ /* a4 */ 0x000000, 0x00becd, 0x000000, 0x8ff2e5,
+ /* a8 */ 0x00c9bc, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00bad7, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ff2e6, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c5f8,
+ /* b8 */ 0x000000, 0x00f9be, 0x00e3b2, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00e3b3,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x04a4b ***/
+
+ /* 80 */ 0x00e3c9, 0x00b6d8, 0x000000, 0x000000,
+ /* 84 */ 0x00cfbd, 0x00c1b5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00e3b4, 0x000000,
+ /* 8c */ 0x000000, 0x00b2d2, 0x00c4f7, 0x00caa1,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff2e7, 0x8ff2e8, 0x8ff2e9, 0x000000,
+ /* 98 */ 0x00f9c2, 0x000000, 0x000000, 0x8ff2ea,
+ /* 9c */ 0x000000, 0x00e3b5, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8ff2eb, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00b5fa, 0x00e3b6,
+ /* a8 */ 0x000000, 0x8ff2ec, 0x00e3b8, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00e3b9, 0x000000,
+ /* b0 */ 0x00c7a9, 0x00f9c3, 0x000000, 0x00e3ba,
+ /* b4 */ 0x8ff2ed, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00f9c4, 0x00e3bb, 0x00e3bc, 0x8ff2ee,
+ /* bc */ 0x000000, 0x00b6d9, 0x00b2d3, 0x00c6c5,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x04a8b ***/
+
+ /* 80 */ 0x00bda8, 0x00bbe4, 0x8ff2ef, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff2f0,
+ /* 88 */ 0x00f9c5, 0x00e3bd, 0x00f9c6, 0x00bda9,
+ /* 8c */ 0x8ff2f1, 0x8ff2f2, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00b2ca, 0x00c9c3, 0x000000,
+ /* 94 */ 0x00f9c8, 0x00e3be, 0x8ff2f3, 0x000000,
+ /* 98 */ 0x00c8eb, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00f9c9, 0x00c1c5,
+ /* a0 */ 0x000000, 0x00e3c1, 0x000000, 0x00e3c2,
+ /* a4 */ 0x00c7e9, 0x000000, 0x00bfc1, 0x00e3bf,
+ /* a8 */ 0x000000, 0x00c3e1, 0x000000, 0x00f9ca,
+ /* ac */ 0x00e3c0, 0x00f9cb, 0x000000, 0x000000,
+ /* b0 */ 0x00bece, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b0dc,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x04acb ***/
+
+ /* 80 */ 0x00b5a9, 0x000000, 0x000000, 0x00f9cc,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00e3c3, 0x000000, 0x8ff2f8, 0x00c4f8,
+ /* 8c */ 0x000000, 0x00e3c4, 0x00c0c7, 0x000000,
+ /* 90 */ 0x000000, 0x8ff2f9, 0x000000, 0x000000,
+ /* 94 */ 0x00ccad, 0x8ff2fa, 0x000000, 0x00c9a3,
+ /* 98 */ 0x00e3c5, 0x00e3c6, 0x00c3d5, 0x8ff2fb,
+ /* 9c */ 0x00cec7, 0x000000, 0x8ff2fc, 0x00e3c8,
+ /* a0 */ 0x00e3c7, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8ff2fe, 0x00bcef, 0x000000,
+ /* b0 */ 0x000000, 0x00e3ca, 0x00b0f0, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00e3cd,
+ /* b8 */ 0x8ff3a1, 0x00f9ce, 0x000000, 0x00e3cb,
+ /* bc */ 0x00b2d4, 0x00b7ce, 0x00e3cc, 0x00b9c6,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x04b0b ***/
+
+ /* 80 */ 0x00b9f2, 0x000000, 0x00cae6, 0x00e3ce,
+ /* 84 */ 0x000000, 0x000000, 0x00cbd4, 0x8ff3a2,
+ /* 88 */ 0x000000, 0x00e3d0, 0x000000, 0x000000,
+ /* 8c */ 0x8ff3a3, 0x00c0d1, 0x00b1cf, 0x00b2ba,
+ /* 90 */ 0x00b0ac, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff3a4, 0x00e3cf,
+ /* 98 */ 0x000000, 0x8ff3a5, 0x000000, 0x000000,
+ /* 9c */ 0x8ff3a6, 0x00f9cf, 0x000000, 0x8ff3a7,
+ /* a0 */ 0x8ff3a8, 0x00e3d1, 0x00e3d2, 0x00bef7,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ff3a9,
+ /* a8 */ 0x000000, 0x00e3d3, 0x8ff3aa, 0x00b3cf,
+ /* ac */ 0x000000, 0x00f9d0, 0x000000, 0x000000,
+ /* b0 */ 0x00e3d5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00b7ea, 0x8ff3ab, 0x00b5e6, 0x000000,
+ /* b8 */ 0x8ff3ac, 0x00e3d6, 0x00b6f5, 0x000000,
+ /* bc */ 0x000000, 0x00e3d7, 0x000000, 0x00c0fc,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x04b4b ***/
+
+ /* 80 */ 0x000000, 0x00c6cd, 0x8ff3ad, 0x00c0e0,
+ /* 84 */ 0x00baf5, 0x00f9d2, 0x000000, 0x000000,
+ /* 88 */ 0x00e3d8, 0x000000, 0x8ff3ae, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ff3af, 0x000000, 0x00c3e2, 0x00c1eb,
+ /* 94 */ 0x000000, 0x00e3da, 0x00e3dc, 0x00e3d9,
+ /* 98 */ 0x00e3db, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b7a2,
+ /* a0 */ 0x00f9d3, 0x000000, 0x000000, 0x8ff3b0,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00e3dd, 0x00b7a6, 0x000000,
+ /* ac */ 0x8ff3b1, 0x000000, 0x00b5e7, 0x00cdd2,
+ /* b0 */ 0x00e3df, 0x000000, 0x000000, 0x00f9d5,
+ /* b4 */ 0x000000, 0x000000, 0x00e3e0, 0x000000,
+ /* b8 */ 0x000000, 0x8ff3b4, 0x00b1ae, 0x00f9d6,
+ /* bc */ 0x8ff3b5, 0x000000, 0x8ff3b6, 0x00e3e3,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x04b8b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b3f6,
+ /* 84 */ 0x00e3e2, 0x00e3e1, 0x000000, 0x00e3e5,
+ /* 88 */ 0x00e3de, 0x000000, 0x00e3e6, 0x00cea9,
+ /* 8c */ 0x8ff3b8, 0x00e3e7, 0x00f9d7, 0x00e3e8,
+ /* 90 */ 0x000000, 0x8ff3b9, 0x00d4f4, 0x00e3ea,
+ /* 94 */ 0x000000, 0x00e3e9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00e3eb, 0x00e3ec, 0x000000,
+ /* 9c */ 0x00ceb5, 0x00e3ed, 0x000000, 0x00f0ef,
+ /* a0 */ 0x00becf, 0x00e3ee, 0x00e3ef, 0x00bdd7,
+ /* a4 */ 0x000000, 0x00c6b8, 0x00e3f0, 0x8ff3ba,
+ /* a8 */ 0x8ff3bb, 0x000000, 0x00c3a8, 0x00f9d8,
+ /* ac */ 0x000000, 0x00e3f1, 0x000000, 0x00c3bc,
+ /* b0 */ 0x00e3f2, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8ff3bc, 0x000000, 0x00b6a5, 0x000000,
+ /* b8 */ 0x00d1bf, 0x00c3dd, 0x00bcb3, 0x000000,
+ /* bc */ 0x000000, 0x00f9d9, 0x000000, 0x00b4c8,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x04bcb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00e3f3, 0x000000,
+ /* 84 */ 0x00e4a2, 0x000000, 0x00e3f6, 0x8ff3bf,
+ /* 88 */ 0x00b5e8, 0x000000, 0x00e3f5, 0x00e4a4,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00e3f4,
+ /* 90 */ 0x000000, 0x00bed0, 0x00f9da, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00e3f8, 0x00e3f9, 0x000000, 0x00c5ab,
+ /* 9c */ 0x000000, 0x000000, 0x00e3fa, 0x000000,
+ /* a0 */ 0x00b3de, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00bfda, 0x00c9e4, 0x8ff3c2,
+ /* a8 */ 0x00e3fc, 0x000000, 0x8ff3c3, 0x000000,
+ /* ac */ 0x00c2e8, 0x00f9db, 0x8ff3c4, 0x8ff3c5,
+ /* b0 */ 0x000000, 0x8ff3c6, 0x000000, 0x00e3f7,
+ /* b4 */ 0x000000, 0x00e3fb, 0x00e3fd, 0x000000,
+ /* b8 */ 0x000000, 0x00bafb, 0x000000, 0x00f9dc,
+ /* bc */ 0x000000, 0x8ff3c1, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x04c0a ***/
+
+ /* 80 */ 0x000000, 0x8ff3ca, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00e4a6, 0x00c9ae, 0x00f9dd,
+ /* 88 */ 0x00c8a6, 0x00c5f9, 0x000000, 0x00b6da,
+ /* 8c */ 0x00e4a5, 0x00e4a3, 0x00f9de, 0x00c8b5,
+ /* 90 */ 0x00e3fe, 0x00c3de, 0x00c5fb, 0x000000,
+ /* 94 */ 0x00c5fa, 0x8ff3cc, 0x00baf6, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00e4b8, 0x000000, 0x000000,
+ /* a0 */ 0x00f9df, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8ff3ce, 0x00e4a8, 0x8ff3cf, 0x00e4aa,
+ /* a8 */ 0x000000, 0x8ff3d0, 0x000000, 0x000000,
+ /* ac */ 0x00e4ad, 0x00f9e0, 0x00e4ae, 0x00f9e1,
+ /* b0 */ 0x00e4ab, 0x00e4ac, 0x00f9e2, 0x8ff3d1,
+ /* b4 */ 0x00e4a9, 0x00e4a7, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff3cd, 0x00e4a1, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8ff3c9,
+
+ /*** Three byte table, leaf: e7aexx - offset 0x04c4a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00cacf, 0x00b2d5,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00e4b5,
+ /* 8c */ 0x000000, 0x00e4b2, 0x000000, 0x00e4b7,
+ /* 90 */ 0x8ff3d4, 0x8ff3d5, 0x00e4b6, 0x000000,
+ /* 94 */ 0x00c7f3, 0x00cca7, 0x000000, 0x00bbbb,
+ /* 98 */ 0x00e4b0, 0x00e4b9, 0x00e4b4, 0x8ff3d6,
+ /* 9c */ 0x00e4b3, 0x00e4af, 0x00f9e3, 0x00e4b1,
+ /* a0 */ 0x000000, 0x00b4c9, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00c3bd, 0x000000,
+ /* ac */ 0x000000, 0x00c0fd, 0x000000, 0x8ff3d8,
+ /* b0 */ 0x000000, 0x00c8a2, 0x000000, 0x000000,
+ /* b4 */ 0x00e4be, 0x8ff3d9, 0x000000, 0x000000,
+ /* b8 */ 0x00c8a4, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ff3da, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x04c8a ***/
+
+ /* 80 */ 0x00c0e1, 0x00e4bb, 0x000000, 0x000000,
+ /* 84 */ 0x00c8cf, 0x8ff3db, 0x00e4bf, 0x00cad3,
+ /* 88 */ 0x000000, 0x00c3db, 0x8ff3dc, 0x00e4ba,
+ /* 8c */ 0x00e4bc, 0x000000, 0x000000, 0x00e4bd,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff3df, 0x000000, 0x8ff3e0, 0x00f9e5,
+ /* 98 */ 0x000000, 0x00f9e6, 0x8ff3e1, 0x000000,
+ /* 9c */ 0x000000, 0x00e4c0, 0x000000, 0x000000,
+ /* a0 */ 0x00bcc4, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c6c6, 0x00e4c5, 0x00e4c4, 0x000000,
+ /* a8 */ 0x000000, 0x00e4c1, 0x8ff3e2, 0x000000,
+ /* ac */ 0x000000, 0x00cfb6, 0x000000, 0x000000,
+ /* b0 */ 0x8ff3e3, 0x000000, 0x000000, 0x00e4ca,
+ /* b4 */ 0x000000, 0x000000, 0x00e4ce, 0x00e4cb,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x04cca ***/
+
+ /* 80 */ 0x00e4c7, 0x00f9e7, 0x000000, 0x8ff3e4,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e4c8,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8ff3e5,
+ /* 8c */ 0x000000, 0x00e4cd, 0x8ff3e6, 0x8ff3e7,
+ /* 90 */ 0x000000, 0x00e4c2, 0x00d2d5, 0x00e4c9,
+ /* 94 */ 0x00e4c3, 0x000000, 0x000000, 0x00e4cc,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00f9e9, 0x00e4d2,
+ /* a0 */ 0x00f9ea, 0x00b4ca, 0x000000, 0x00e4cf,
+ /* a4 */ 0x000000, 0x000000, 0x8ff3e8, 0x00e4d0,
+ /* a8 */ 0x000000, 0x000000, 0x00e4d1, 0x00e4d4,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00f9e8, 0x000000, 0x00f9eb,
+ /* b4 */ 0x000000, 0x000000, 0x00f9ec, 0x00e4d3,
+ /* b8 */ 0x00c8f6, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00e4d5, 0x00cefc, 0x00caed,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x04d0a ***/
+
+ /* 80 */ 0x00e4da, 0x000000, 0x000000, 0x00e4d7,
+ /* 84 */ 0x000000, 0x8ff3e9, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff3ea, 0x000000,
+ /* 8c */ 0x00e4d6, 0x00c0d2, 0x000000, 0x00e4d9,
+ /* 90 */ 0x00e4db, 0x8ff3eb, 0x000000, 0x000000,
+ /* 94 */ 0x00e4d8, 0x000000, 0x00e4df, 0x8ff3ec,
+ /* 98 */ 0x00e4dc, 0x00f9ef, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff3ed, 0x00e4dd,
+ /* a0 */ 0x00e4c6, 0x8ff3ee, 0x000000, 0x000000,
+ /* a4 */ 0x00e4de, 0x00e4e0, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff3ef, 0x000000, 0x000000,
+ /* ac */ 0x00e4e1, 0x00f9f0, 0x8ff3f0, 0x8ff3f1,
+ /* b0 */ 0x8ff3f2, 0x000000, 0x000000, 0x00cac6,
+ /* b4 */ 0x000000, 0x00e4e2, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00f9f1, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00cce2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x04d49 ***/
+
+ /* 80 */ 0x000000, 0x00b6ce, 0x00b7a9, 0x00e4e3,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00cab4, 0x000000, 0x00bfe8,
+ /* 8c */ 0x000000, 0x00ccb0, 0x000000, 0x00f9f2,
+ /* 90 */ 0x00e4e4, 0x000000, 0x00ceb3, 0x000000,
+ /* 94 */ 0x00f9f3, 0x00c7f4, 0x000000, 0x00c1c6,
+ /* 98 */ 0x00c7b4, 0x000000, 0x000000, 0x00bdcd,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b0c0,
+ /* a0 */ 0x00f9f4, 0x00e4e9, 0x00e4e7, 0x000000,
+ /* a4 */ 0x00e4e5, 0x00b4a1, 0x8ff3f6, 0x00bed1,
+ /* a8 */ 0x00e4ea, 0x000000, 0x000000, 0x00e4e8,
+ /* ac */ 0x000000, 0x00e4e6, 0x00e4ee, 0x000000,
+ /* b0 */ 0x000000, 0x00e4ed, 0x00e4ec, 0x00e4eb,
+ /* b4 */ 0x000000, 0x000000, 0x8ff3f8, 0x8ff3f9,
+ /* b8 */ 0x000000, 0x00e4ef, 0x000000, 0x000000,
+ /* bc */ 0x00f9f5, 0x00e4f0, 0x00c0ba, 0x8ff3fa,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x04d89 ***/
+
+ /* 80 */ 0x00e4f1, 0x000000, 0x00e4f3, 0x000000,
+ /* 84 */ 0x8ff3fc, 0x00e4f2, 0x000000, 0x000000,
+ /* 88 */ 0x8ff3fe, 0x000000, 0x00b8d2, 0x000000,
+ /* 8c */ 0x000000, 0x8ff4a1, 0x00c1b8, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e4f5, 0x000000,
+ /* 94 */ 0x000000, 0x00f9f6, 0x00c5fc, 0x8ff4a3,
+ /* 98 */ 0x00e4f4, 0x00f9f7, 0x000000, 0x000000,
+ /* 9c */ 0x00e4f6, 0x00f9f8, 0x00cab5, 0x00c1ec,
+ /* a0 */ 0x00b9c7, 0x000000, 0x00e4f7, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ff4a5, 0x00cec8,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ff4a6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00e4f9,
+ /* b0 */ 0x000000, 0x000000, 0x00e4fa, 0x000000,
+ /* b4 */ 0x00e4fb, 0x8ff4a8, 0x00e4fc, 0x000000,
+ /* b8 */ 0x00bbe5, 0x000000, 0x00e4fd, 0x00b7cf,
+ /* bc */ 0x000000, 0x000000, 0x00b5ea, 0x000000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x04dc9 ***/
+
+ /* 80 */ 0x00b5aa, 0x000000, 0x00e5a1, 0x8ff4a9,
+ /* 84 */ 0x00ccf3, 0x00b9c8, 0x00e4fe, 0x00f9f9,
+ /* 88 */ 0x00f9fa, 0x8ff4aa, 0x00e5a4, 0x00cce6,
+ /* 8c */ 0x000000, 0x00c7bc, 0x000000, 0x000000,
+ /* 90 */ 0x00c9b3, 0x000000, 0x8ff4ac, 0x00f9fb,
+ /* 94 */ 0x00bde3, 0x00e5a3, 0x000000, 0x00bcd3,
+ /* 98 */ 0x00b9c9, 0x00bbe6, 0x00b5e9, 0x00cab6,
+ /* 9c */ 0x00e5a2, 0x00f9fc, 0x8ff4ad, 0x000000,
+ /* a0 */ 0x00c1c7, 0x00cbc2, 0x00baf7, 0x00f9fd,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00bbe7,
+ /* ac */ 0x00c4dd, 0x000000, 0x00e5a7, 0x00cedf,
+ /* b0 */ 0x00bad9, 0x00f9fe, 0x00e5a8, 0x00bfc2,
+ /* b4 */ 0x000000, 0x00e5aa, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00bed2, 0x00bab0, 0x000000,
+ /* bc */ 0x000000, 0x8ff4b0, 0x8ff4b1, 0x00e5a9,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x04e09 ***/
+
+ /* 80 */ 0x8ff4b2, 0x00faa1, 0x00bdaa, 0x00b8be,
+ /* 84 */ 0x00c1c8, 0x00e5a5, 0x00e5ab, 0x8ff4b3,
+ /* 88 */ 0x00faa2, 0x000000, 0x000000, 0x00e5a6,
+ /* 8c */ 0x00b7d0, 0x000000, 0x00e5ae, 0x00e5b2,
+ /* 90 */ 0x00b7eb, 0x000000, 0x000000, 0x00faa3,
+ /* 94 */ 0x000000, 0x000000, 0x00e5ad, 0x000000,
+ /* 98 */ 0x000000, 0x8ff4b7, 0x8ff4b8, 0x00e5b6,
+ /* 9c */ 0x00faa4, 0x000000, 0x00b9ca, 0x000000,
+ /* a0 */ 0x000000, 0x00cded, 0x00b0bc, 0x00e5b3,
+ /* a4 */ 0x000000, 0x000000, 0x00b5eb, 0x000000,
+ /* a8 */ 0x00e5b0, 0x000000, 0x8ff4b9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00e5b1, 0x000000,
+ /* b0 */ 0x8ff4ba, 0x00c5fd, 0x00e5af, 0x00e5ac,
+ /* b4 */ 0x000000, 0x00b3a8, 0x00c0e4, 0x000000,
+ /* b8 */ 0x000000, 0x00b8a8, 0x00faa5, 0x000000,
+ /* bc */ 0x000000, 0x00e5b8, 0x000000, 0x8ff4bc,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x04e49 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00faa6,
+ /* 84 */ 0x000000, 0x000000, 0x8ff4be, 0x000000,
+ /* 88 */ 0x8ff4bf, 0x00e5b5, 0x000000, 0x00faa7,
+ /* 8c */ 0x8ff4c0, 0x000000, 0x000000, 0x00e5b7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00e5b4,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff4c1,
+ /* 98 */ 0x000000, 0x00b7d1, 0x00c2b3, 0x00e5b9,
+ /* 9c */ 0x00c1ee, 0x8ff4c3, 0x000000, 0x00e5c6,
+ /* a0 */ 0x00faa8, 0x000000, 0x00e5c2, 0x00e5bc,
+ /* a4 */ 0x000000, 0x000000, 0x00faa9, 0x8ff4c4,
+ /* a8 */ 0x000000, 0x000000, 0x8ff4c5, 0x00e5c0,
+ /* ac */ 0x00bcfa, 0x00b0dd, 0x00e5bb, 0x00e5c3,
+ /* b0 */ 0x00e5c7, 0x00b9cb, 0x00ccd6, 0x000000,
+ /* b4 */ 0x00c4d6, 0x00e5bd, 0x8ff4c6, 0x8ff4c7,
+ /* b8 */ 0x00e5c5, 0x000000, 0x00e5ba, 0x00c3be,
+ /* bc */ 0x000000, 0x00e5bf, 0x00b0bd, 0x00ccca,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x04e89 ***/
+
+ /* 80 */ 0x8ff4c8, 0x000000, 0x00faaa, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e5be,
+ /* 88 */ 0x000000, 0x000000, 0x00b6db, 0x00c8ec,
+ /* 8c */ 0x00faab, 0x000000, 0x000000, 0x00c1ed,
+ /* 90 */ 0x000000, 0x00ced0, 0x00bdef, 0x000000,
+ /* 94 */ 0x000000, 0x00e5ee, 0x00faac, 0x8ff4c9,
+ /* 98 */ 0x00e5c8, 0x8ff4ca, 0x00c0fe, 0x000000,
+ /* 9c */ 0x00e5c4, 0x00e5c9, 0x00e5cb, 0x000000,
+ /* a0 */ 0x00c4f9, 0x00e5ce, 0x000000, 0x00faad,
+ /* a4 */ 0x00e5ca, 0x000000, 0x8ff4cb, 0x000000,
+ /* a8 */ 0x00cad4, 0x00b4cb, 0x000000, 0x000000,
+ /* ac */ 0x00cccb, 0x000000, 0x000000, 0x00b0de,
+ /* b0 */ 0x000000, 0x8ff4cc, 0x00e5cd, 0x000000,
+ /* b4 */ 0x00cefd, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff4cd, 0x000000, 0x00e5cc,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x04ec8 ***/
+
+ /* 80 */ 0x000000, 0x00b1ef, 0x000000, 0x000000,
+ /* 84 */ 0x00c6ec, 0x00e5cf, 0x000000, 0x000000,
+ /* 88 */ 0x00fab0, 0x00e5d6, 0x00e5d0, 0x00e5d7,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ff4d1, 0x00fab1, 0x00e5d3, 0x000000,
+ /* 94 */ 0x000000, 0x00fab2, 0x000000, 0x8ff4d2,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00c7fb,
+ /* 9c */ 0x000000, 0x8ff4d3, 0x00bcca, 0x00e5d5,
+ /* a0 */ 0x8ff4d4, 0x00e5d2, 0x00e5d8, 0x00e5d1,
+ /* a4 */ 0x000000, 0x000000, 0x00bdc4, 0x8ff4d5,
+ /* a8 */ 0x00faaf, 0x000000, 0x000000, 0x00cba5,
+ /* ac */ 0x8ff4d6, 0x000000, 0x00bdcc, 0x000000,
+ /* b0 */ 0x000000, 0x00e5d4, 0x00e5e0, 0x000000,
+ /* b4 */ 0x000000, 0x00e5dc, 0x000000, 0x00e5df,
+ /* b8 */ 0x000000, 0x00e5dd, 0x00e5e1, 0x00e5db,
+ /* bc */ 0x000000, 0x00e5c1, 0x00c0d3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x04f07 ***/
+
+ /* 80 */ 0x000000, 0x00c8cb, 0x000000, 0x00e5de,
+ /* 84 */ 0x000000, 0x8ff4d7, 0x00e5d9, 0x00fab4,
+ /* 88 */ 0x000000, 0x000000, 0x00c1a1, 0x00b7d2,
+ /* 8c */ 0x000000, 0x00bdab, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00fab5, 0x000000,
+ /* 94 */ 0x00bfa5, 0x00c1b6, 0x00e5e4, 0x000000,
+ /* 98 */ 0x000000, 0x00e5e6, 0x00e5e7, 0x000000,
+ /* 9c */ 0x000000, 0x00e5e3, 0x00e5e5, 0x000000,
+ /* a0 */ 0x000000, 0x00fab6, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00e5da, 0x00e5e2,
+ /* a8 */ 0x000000, 0x00e5ea, 0x00e5e9, 0x00fefe,
+ /* ac */ 0x000000, 0x00cbfa, 0x000000, 0x000000,
+ /* b0 */ 0x00b7ab, 0x000000, 0x000000, 0x8ff4d8,
+ /* b4 */ 0x000000, 0x8ff4d9, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e5e8, 0x000000, 0x00e5ec,
+ /* bc */ 0x00e5eb, 0x00e5ef, 0x8ff4da, 0x00e5f1,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x04f47 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00bbbc, 0x00e5ed,
+ /* 84 */ 0x000000, 0x000000, 0x8ff4db, 0x8ff4dc,
+ /* 88 */ 0x00e5f2, 0x00e5f3, 0x00fab7, 0x000000,
+ /* 8c */ 0x00e5f4, 0x00fab8, 0x00e5fa, 0x00c5bb,
+ /* 90 */ 0x00e5f6, 0x8ff4de, 0x00e5f5, 0x00e5f7,
+ /* 94 */ 0x00e5f8, 0x000000, 0x00e5f9, 0x000000,
+ /* 98 */ 0x8ff4df, 0x000000, 0x8ff4e0, 0x00e5fb,
+ /* 9c */ 0x00e5fc,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x04f64 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b4cc, 0x000000,
+ /* b8 */ 0x00e5fd, 0x000000, 0x00e5fe, 0x8ff4e3,
+ /* bc */ 0x8ff4e2, 0x000000, 0x8ff4e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x04fa3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff4e5,
+ /* 84 */ 0x8ff4e6, 0x00e6a1, 0x000000, 0x00fab9,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00e6a2, 0x00e6a3, 0x00e6a4, 0x8ff4e7,
+ /* 90 */ 0x00e6a5, 0x00e6a6, 0x8ff4ea, 0x000000,
+ /* 94 */ 0x00e6a8, 0x00e6a7, 0x000000, 0x000000,
+ /* 98 */ 0x00e6a9, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e6aa,
+ /* a0 */ 0x00e6ab, 0x8ff4ec, 0x000000, 0x8ff4ed,
+ /* a4 */ 0x8ff4ee, 0x000000, 0x000000, 0x00e6ae,
+ /* a8 */ 0x00e6ac, 0x00e6ad, 0x00bae1, 0x00b7d3,
+ /* ac */ 0x000000, 0x8ff4ef, 0x00c3d6, 0x000000,
+ /* b0 */ 0x00c8b3, 0x000000, 0x00bdf0, 0x000000,
+ /* b4 */ 0x000000, 0x00c7cd, 0x000000, 0x00c8ed,
+ /* b8 */ 0x00e6af, 0x00d8ed, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff4f0, 0x8ff4f1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x04fe2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00e6b0, 0x00e6b2,
+ /* 84 */ 0x000000, 0x00cde5, 0x00e6b1, 0x00e6b4,
+ /* 88 */ 0x00e6b3, 0x000000, 0x00cdd3, 0x000000,
+ /* 8c */ 0x00e6b5, 0x000000, 0x00c8fe, 0x000000,
+ /* 90 */ 0x8ff4f3, 0x00fabb, 0x000000, 0x000000,
+ /* 94 */ 0x00e6b6, 0x000000, 0x8ff4f6, 0x00fabc,
+ /* 98 */ 0x000000, 0x000000, 0x00e6b9, 0x000000,
+ /* 9c */ 0x8ff4f7, 0x00e6b8, 0x00e6b7, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00e6ba,
+ /* a4 */ 0x00b7b2, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c1a2, 0x00b5c1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8ff4f8, 0x00e6be, 0x00e6bb,
+ /* b0 */ 0x000000, 0x000000, 0x00e6bc, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00e6bf, 0x000000,
+ /* b8 */ 0x00e6c0, 0x00e6bd, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00b1a9, 0x000000, 0x00fabd,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x05022 ***/
+
+ /* 80 */ 0x000000, 0x00b2a7, 0x000000, 0x8ff4fa,
+ /* 84 */ 0x000000, 0x00e6c2, 0x00e6c3, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00e6c4, 0x000000,
+ /* 8c */ 0x00cde2, 0x000000, 0x00fabe, 0x8ff4fb,
+ /* 90 */ 0x000000, 0x000000, 0x00bdac, 0x000000,
+ /* 94 */ 0x00e6c6, 0x00e6c5, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00fabf,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00fac0,
+ /* a0 */ 0x00bfe9, 0x00e6c7, 0x000000, 0x8ff4fc,
+ /* a4 */ 0x000000, 0x8ff4fd, 0x00e6c8, 0x000000,
+ /* a8 */ 0x000000, 0x00e6c9, 0x000000, 0x00b4e5,
+ /* ac */ 0x00fac1, 0x000000, 0x00fac2, 0x8ff4fe,
+ /* b0 */ 0x00b4cd, 0x000000, 0x8ff5a1, 0x00e6ca,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e6cb, 0x00fac3, 0x00cbdd,
+ /* bc */ 0x00cde3, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x05062 ***/
+
+ /* 80 */ 0x00cdd4, 0x00cfb7, 0x8ff5a2, 0x00b9cd,
+ /* 84 */ 0x00e6ce, 0x00bcd4, 0x00e6cd, 0x000000,
+ /* 88 */ 0x8ff5a4, 0x000000, 0x8ff5a3, 0x00e6cf,
+ /* 8c */ 0x00bca9, 0x000000, 0x8ff5a5, 0x000000,
+ /* 90 */ 0x00c2d1, 0x8ff5a6, 0x00e6d0, 0x000000,
+ /* 94 */ 0x00fac5, 0x00b9cc, 0x8ff5a7, 0x00ccd7,
+ /* 98 */ 0x00e6d1, 0x00e6d2, 0x000000, 0x000000,
+ /* 9c */ 0x00e6d3, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00e6d4, 0x000000, 0x000000,
+ /* a4 */ 0x8ff5a8, 0x000000, 0x00fac6, 0x000000,
+ /* a8 */ 0x00e6d5, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8ff5a9, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff5aa, 0x000000, 0x000000, 0x00bcaa,
+ /* b4 */ 0x000000, 0x00fac7, 0x00cced, 0x00fac8,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00e6d7,
+ /* bc */ 0x00fac9, 0x00c3bf, 0x000000, 0x00e6d6,
+
+ /*** Three byte table, leaf: e881xx - offset 0x050a2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff5ab,
+ /* 84 */ 0x000000, 0x000000, 0x00e6d9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00e6d8, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e6da, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c0bb, 0x000000,
+ /* 98 */ 0x00e6db, 0x000000, 0x00e6dc, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00cab9, 0x00e6dd,
+ /* a0 */ 0x000000, 0x00c1ef, 0x00e6de, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ff5ac, 0x000000,
+ /* a8 */ 0x00e6df, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00cefe,
+ /* b0 */ 0x00e6e2, 0x8ff5ad, 0x00e6e1, 0x00e6e0,
+ /* b4 */ 0x00c4b0, 0x8ff5ae, 0x00e6e3, 0x00bfa6,
+ /* b8 */ 0x000000, 0x00e6e4, 0x000000, 0x8ff5af,
+ /* bc */ 0x000000, 0x00e6e5, 0x00cfb8, 0x00e6e6,
+
+ /*** Three byte table, leaf: e882xx - offset 0x050e2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00e6e7, 0x00e6e9, 0x00e6e8, 0x00c8a5,
+ /* 88 */ 0x000000, 0x00c6f9, 0x000000, 0x00cfbe,
+ /* 8c */ 0x00c8a9, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00e6eb,
+ /* 94 */ 0x000000, 0x000000, 0x00bed3, 0x000000,
+ /* 98 */ 0x00c9aa, 0x8ff5b0, 0x00e6ec, 0x00e6ea,
+ /* 9c */ 0x8ff5b1, 0x00b4ce, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00b8d4, 0x00bbe8, 0x000000,
+ /* a4 */ 0x8ff5b2, 0x00c8ee, 0x000000, 0x8ff5b3,
+ /* a8 */ 0x000000, 0x00b8aa, 0x00cbc3, 0x000000,
+ /* ac */ 0x00e6ef, 0x00e6ed, 0x000000, 0x00b9ce,
+ /* b0 */ 0x000000, 0x00b9cf, 0x00b0e9, 0x000000,
+ /* b4 */ 0x00bae8, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ff5b4, 0x000000, 0x00c7d9, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x0511f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b0df,
+ /* 84 */ 0x00e6f4, 0x8ff5b6, 0x00c3c0, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00faca, 0x000000,
+ /* 8c */ 0x00c7d8, 0x000000, 0x00c2db, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ff5b7, 0x00e6f6, 0x00facb,
+ /* 98 */ 0x8ff5b8, 0x00e6f2, 0x00e6f5, 0x00e6f0,
+ /* 9c */ 0x000000, 0x00e6f3, 0x00cba6, 0x000000,
+ /* a0 */ 0x00facc, 0x00b8d5, 0x000000, 0x000000,
+ /* a4 */ 0x00b0fd, 0x00e6f1, 0x8ff5b9, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00e6f8,
+ /* b0 */ 0x000000, 0x00e6f9, 0x000000, 0x00facd,
+ /* b4 */ 0x00c6b9, 0x8ff5bc, 0x000000, 0x000000,
+ /* b8 */ 0x00b6bb, 0x000000, 0x000000, 0x8ff5bd,
+ /* bc */ 0x00e7a6, 0x00c7bd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x0515d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00bbe9, 0x000000,
+ /* 84 */ 0x000000, 0x00b6bc, 0x00c0c8, 0x00cfc6,
+ /* 88 */ 0x00ccae, 0x00e6f7, 0x00c0d4, 0x000000,
+ /* 8c */ 0x000000, 0x8ff5bb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff5c0, 0x000000,
+ /* 98 */ 0x00face, 0x000000, 0x00b5d3, 0x00e6fa,
+ /* 9c */ 0x000000, 0x000000, 0x8ff5c1, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00e6fc,
+ /* a4 */ 0x8ff5c3, 0x000000, 0x000000, 0x8ff5c4,
+ /* a8 */ 0x000000, 0x00e6fb, 0x000000, 0x000000,
+ /* ac */ 0x8ff5c5, 0x000000, 0x000000, 0x00e6fd,
+ /* b0 */ 0x000000, 0x00c3a6, 0x000000, 0x00c7be,
+ /* b4 */ 0x000000, 0x8ff5bf, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00c4b1, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff5c7, 0x00e7a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x0519c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e7a2, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00facf, 0x00e6fe,
+ /* 8c */ 0x000000, 0x000000, 0x00bfd5, 0x000000,
+ /* 90 */ 0x00c9e5, 0x00e7a5, 0x000000, 0x00e7a4,
+ /* 94 */ 0x00b9d0, 0x00cfd3, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e7b5,
+ /* a0 */ 0x00fad0, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00e7a9, 0x00e7aa, 0x00fad1,
+ /* a8 */ 0x00fad2, 0x8ff5c9, 0x000000, 0x00bcf0,
+ /* ac */ 0x000000, 0x00fad3, 0x00e7a8, 0x000000,
+ /* b0 */ 0x00b9f8, 0x00e7a7, 0x000000, 0x000000,
+ /* b4 */ 0x00e7ab, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00c4b2, 0x00caa2, 0x00c1a3, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00c2dc,
+
+ /*** Three byte table, leaf: e886xx - offset 0x051dc ***/
+
+ /* 80 */ 0x00e7af, 0x8ff5cb, 0x00e7b0, 0x00e7ac,
+ /* 84 */ 0x8ff5cd, 0x8ff5ce, 0x000000, 0x000000,
+ /* 88 */ 0x00e7ad, 0x000000, 0x00e7ae, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00b9d1,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00e7b6,
+ /* 94 */ 0x000000, 0x00e7b2, 0x000000, 0x000000,
+ /* 98 */ 0x8ff5d0, 0x000000, 0x00c9e6, 0x000000,
+ /* 9c */ 0x00cbec, 0x00c9a8, 0x000000, 0x000000,
+ /* a0 */ 0x00e7b1, 0x000000, 0x000000, 0x00e7b4,
+ /* a4 */ 0x00e7b3, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00cbc4, 0x00e7b7, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00e7b8, 0x000000, 0x8ff5d1, 0x00c1b7,
+ /* b4 */ 0x000000, 0x00e7b9, 0x000000, 0x000000,
+ /* b8 */ 0x00e7bb, 0x000000, 0x00e7bf, 0x00fad4,
+ /* bc */ 0x000000, 0x00e7bc, 0x00e7ba, 0x00c7bf,
+
+ /*** Three byte table, leaf: e887xx - offset 0x0521c ***/
+
+ /* 80 */ 0x00e7bd, 0x8ff5d2, 0x00e7be, 0x8ff5d3,
+ /* 84 */ 0x000000, 0x000000, 0x00b2b2, 0x000000,
+ /* 88 */ 0x00e7c5, 0x00e7c0, 0x00fad5, 0x000000,
+ /* 8c */ 0x000000, 0x00e7c1, 0x000000, 0x00fad6,
+ /* 90 */ 0x000000, 0x00e7c2, 0x000000, 0x00c2a1,
+ /* 94 */ 0x000000, 0x000000, 0x8ff5d4, 0x00fad7,
+ /* 98 */ 0x00e7c4, 0x00e7c3, 0x00e7c6, 0x8ff5d5,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e7c7,
+ /* a0 */ 0x00e7c8, 0x000000, 0x000000, 0x00bfc3,
+ /* a4 */ 0x8ff5d7, 0x00b2e9, 0x000000, 0x00e7c9,
+ /* a8 */ 0x00ced7, 0x000000, 0x00bcab, 0x000000,
+ /* ac */ 0x8ff5d9, 0x00bdad, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00bbea,
+ /* b4 */ 0x00c3d7, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00e7ca, 0x00e7cb,
+ /* bc */ 0x00b1b1, 0x8ff5db, 0x00e7cc, 0x8ff5dc,
+
+ /*** Three byte table, leaf: e888xx - offset 0x0525c ***/
+
+ /* 80 */ 0x000000, 0x00e7cd, 0x00e7ce, 0x000000,
+ /* 84 */ 0x8ff5de, 0x00e7cf, 0x000000, 0x00e7d0,
+ /* 88 */ 0x00b6bd, 0x00daaa, 0x00e7d1, 0x000000,
+ /* 8c */ 0x00c0e5, 0x00e7d2, 0x00bccb, 0x000000,
+ /* 90 */ 0x00e7d3, 0x000000, 0x00d0b0, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00e7d4, 0x00cade,
+ /* 98 */ 0x00b4dc, 0x8ff5e0, 0x000000, 0x00c1a4,
+ /* 9c */ 0x00bdd8, 0x000000, 0x00c9f1, 0x00bdae,
+ /* a0 */ 0x000000, 0x8ff5e1, 0x8ff5e2, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00e7d5, 0x00b9d2, 0x00e7d6,
+ /* ac */ 0x00c8cc, 0x000000, 0x00e7e4, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ff5e4, 0x00e7d8,
+ /* b4 */ 0x8ff5e5, 0x00c2c9, 0x00c7f5, 0x00b8bf,
+ /* b8 */ 0x00e7d7, 0x00c1a5, 0x000000, 0x000000,
+ /* bc */ 0x8ff5e6, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x0529c ***/
+
+ /* 80 */ 0x00e7d9, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff5e9, 0x8ff5e7, 0x00c4fa,
+ /* 88 */ 0x000000, 0x8ff5e8, 0x000000, 0x8ff5eb,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8ff5ed,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff5ef,
+ /* 98 */ 0x00e7db, 0x00e7da, 0x00e7dd, 0x000000,
+ /* 9c */ 0x8ff5f1, 0x00e7dc, 0x000000, 0x00e7de,
+ /* a0 */ 0x00fadb, 0x000000, 0x00e7e0, 0x8ff5f2,
+ /* a4 */ 0x00e7df, 0x000000, 0x00b4cf, 0x000000,
+ /* a8 */ 0x00e7e1, 0x000000, 0x00e7e2, 0x00e7e3,
+ /* ac */ 0x000000, 0x000000, 0x00bab1, 0x00cec9,
+ /* b0 */ 0x000000, 0x00e7e5, 0x00bfa7, 0x000000,
+ /* b4 */ 0x00fadc, 0x000000, 0x00b1f0, 0x00e7e6,
+ /* b8 */ 0x00e7e7, 0x8ff5f6, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff5f8, 0x00e7e8, 0x8ff5f9,
+
+ /*** Three byte table, leaf: e88axx - offset 0x052dc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ff5fa,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff5fb, 0x00b0f2,
+ /* 8c */ 0x000000, 0x00e7e9, 0x00fade, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e7ea, 0x8ff5fc,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00c9e7, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00bcc7, 0x000000, 0x00e7ec,
+ /* a0 */ 0x000000, 0x00fadf, 0x000000, 0x00fae0,
+ /* a4 */ 0x00fae1, 0x00b3a9, 0x00b0b2, 0x8ff5fd,
+ /* a8 */ 0x8ff5fe, 0x00fae2, 0x000000, 0x00e7eb,
+ /* ac */ 0x00e7ee, 0x00c7ce, 0x00fae3, 0x00bfc4,
+ /* b0 */ 0x000000, 0x00b2d6, 0x8ff6a1, 0x00cba7,
+ /* b4 */ 0x8ff6a2, 0x000000, 0x000000, 0x00fae4,
+ /* b8 */ 0x00b7dd, 0x00b6dc, 0x8ff6a3, 0x00e7ed,
+ /* bc */ 0x8ff6a4, 0x00b2ea, 0x00fae5, 0x00fae6,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x0531c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b4a3, 0x00fae7, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00b1f1, 0x00e7f2, 0x00ceea,
+ /* 94 */ 0x00c2dd, 0x00fae8, 0x000000, 0x00c9c4,
+ /* 98 */ 0x000000, 0x00e7fe, 0x000000, 0x00b2d7,
+ /* 9c */ 0x00e7fc, 0x000000, 0x00e7fa, 0x00e7f1,
+ /* a0 */ 0x000000, 0x00e7ef, 0x8ff6a5, 0x00e7f0,
+ /* a4 */ 0x000000, 0x00bce3, 0x00b6ec, 0x00c3f7,
+ /* a8 */ 0x8ff6a6, 0x000000, 0x000000, 0x00c6d1,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00b1d1, 0x000000, 0x00e7f4,
+ /* b4 */ 0x00e7f3, 0x000000, 0x000000, 0x8ff6a7,
+ /* b8 */ 0x000000, 0x00e7f9, 0x00e7f5, 0x00e7f8,
+ /* bc */ 0x000000, 0x00fae9, 0x00faea, 0x000000,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x0535c ***/
+
+ /* 80 */ 0x00faeb, 0x00faec, 0x00ccd0, 0x00e7f7,
+ /* 84 */ 0x00b2d8, 0x00b3fd, 0x00e7fb, 0x8ff6a8,
+ /* 88 */ 0x8ff6a9, 0x00e7fd, 0x000000, 0x000000,
+ /* 8c */ 0x8ff6aa, 0x000000, 0x00b7d4, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00e8a3, 0x00e8ac,
+ /* 98 */ 0x00e8ad, 0x000000, 0x000000, 0x8ff6ac,
+ /* 9c */ 0x00b0ab, 0x8ff6ad, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00faee, 0x00e8b4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b0f1, 0x000000, 0x000000, 0x00e8ab,
+ /* ac */ 0x000000, 0x00faef, 0x000000, 0x00e8aa,
+ /* b0 */ 0x8ff6ae, 0x00e8a5, 0x00e8a4, 0x000000,
+ /* b4 */ 0x00e8a2, 0x00e8a1, 0x00c3e3, 0x000000,
+ /* b8 */ 0x00c2fb, 0x00e8a7, 0x00faf0, 0x000000,
+ /* bc */ 0x8ff6af, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x0539c ***/
+
+ /* 80 */ 0x00e8a6, 0x000000, 0x000000, 0x00faf1,
+ /* 84 */ 0x8ff6b0, 0x00e8a9, 0x000000, 0x00faf2,
+ /* 88 */ 0x000000, 0x00c1f0, 0x00b7d5, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00b1c1,
+ /* 90 */ 0x00e8a8, 0x00faf3, 0x00b9d3, 0x000000,
+ /* 94 */ 0x8ff6ab, 0x00faf4, 0x000000, 0x8ff6b1,
+ /* 98 */ 0x00c1f1, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00faed, 0x8faeca,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00e8ba,
+ /* b4 */ 0x000000, 0x00e8bb, 0x000000, 0x00b2d9,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b2ae,
+ /* bc */ 0x00e8b8, 0x00faf5, 0x000000, 0x8ff6b3,
+
+ /*** Three byte table, leaf: e88exx - offset 0x053dc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00e8ae, 0x00faf6, 0x00e8b6,
+ /* 88 */ 0x000000, 0x00e8bd, 0x00e8b7, 0x000000,
+ /* 8c */ 0x000000, 0x8ff6b6, 0x00e8b5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00faf7, 0x00e7f6,
+ /* 94 */ 0x8ff6b7, 0x8ff6b8, 0x00e8b3, 0x000000,
+ /* 98 */ 0x00faf8, 0x000000, 0x00e8af, 0x8ff6b9,
+ /* 9c */ 0x000000, 0x8ff6ba, 0x00b4d0, 0x00e8b1,
+ /* a0 */ 0x00e8bc, 0x000000, 0x00e8b2, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00faf9,
+ /* a8 */ 0x00e8be, 0x00fafa, 0x00e8b0, 0x00c7fc,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cde9, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00e8b9, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00e8cf, 0x000000, 0x00fafb,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x0541c ***/
+
+ /* 80 */ 0x00fafc, 0x00e8c7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00bffb, 0x000000, 0x00fafd,
+ /* 88 */ 0x000000, 0x8ff6bb, 0x00b5c6, 0x000000,
+ /* 8c */ 0x00b6dd, 0x000000, 0x00e8c2, 0x00fafe,
+ /* 90 */ 0x8ff6bc, 0x00fba1, 0x000000, 0x00b2db,
+ /* 94 */ 0x8ff6bd, 0x000000, 0x00bed4, 0x000000,
+ /* 98 */ 0x00e8c5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00bada, 0x8ff6be, 0x000000, 0x00c5d1,
+ /* a0 */ 0x00e8ca, 0x00fba2, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff6bf, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00caee, 0x00fba3, 0x00e8c1,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00b2da,
+ /* b0 */ 0x00b8d6, 0x00c9a9, 0x00e8cb, 0x000000,
+ /* b4 */ 0x00e8bf, 0x000000, 0x000000, 0x00e8c8,
+ /* b8 */ 0x000000, 0x8ff6c0, 0x000000, 0x00e8d2,
+ /* bc */ 0x000000, 0x00e8c3, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x0545b ***/
+
+ /* 80 */ 0x000000, 0x00fba4, 0x000000, 0x00e8c4,
+ /* 84 */ 0x00c6ba, 0x000000, 0x00fba5, 0x00e8c9,
+ /* 88 */ 0x000000, 0x000000, 0x00fba6, 0x00e8c6,
+ /* 8c */ 0x00cba8, 0x00e8cc, 0x00b0e0, 0x8ff6c1,
+ /* 90 */ 0x000000, 0x8ff6c2, 0x000000, 0x00e8c0,
+ /* 94 */ 0x000000, 0x8ff6c3, 0x000000, 0x8ff6c5,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00e8ce, 0x000000, 0x00e8cd, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00c7eb, 0x00e8d4, 0x000000,
+ /* ac */ 0x00e8df, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00b3fe, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00e8e2, 0x000000, 0x000000,
+ /* b8 */ 0x00e8d0, 0x8ff6c6, 0x000000, 0x000000,
+ /* bc */ 0x00e8d5, 0x00cdee,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x05499 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e8de, 0x000000,
+ /* 88 */ 0x00fba8, 0x00cdd5, 0x8ff6c7, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00ceaa, 0x8ff6c8,
+ /* 90 */ 0x000000, 0x8ff6c9, 0x8ff6ca, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c3f8,
+ /* 98 */ 0x000000, 0x8ff6cb, 0x8ff6cc, 0x00b3eb,
+ /* 9c */ 0x8ff6cd, 0x000000, 0x000000, 0x00fba9,
+ /* a0 */ 0x000000, 0x00c9f2, 0x00e8e4, 0x00c6a1,
+ /* a4 */ 0x000000, 0x8ff6cf, 0x00b0b1, 0x000000,
+ /* a8 */ 0x000000, 0x00e8dd, 0x000000, 0x00e8d9,
+ /* ac */ 0x00c1f2, 0x00e8d3, 0x00e8db, 0x00e8e0,
+ /* b0 */ 0x00fbaa, 0x00c7ac, 0x000000, 0x00fbab,
+ /* b4 */ 0x000000, 0x00b0aa, 0x8ff6d0, 0x00e8d8,
+ /* b8 */ 0x8ff6d1, 0x00e8e1, 0x00c9f8, 0x000000,
+ /* bc */ 0x8ff6d2, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x054d8 ***/
+
+ /* 80 */ 0x000000, 0x8ff6d3, 0x00e8dc, 0x000000,
+ /* 84 */ 0x00e8d7, 0x00fbac, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00bed5,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bdaf, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00bcac, 0x000000, 0x000000, 0x8ff6d6,
+ /* 98 */ 0x000000, 0x00ccd8, 0x000000, 0x000000,
+ /* 9c */ 0x00c9c7, 0x000000, 0x00fbad, 0x00e8e7,
+ /* a0 */ 0x000000, 0x00e8f0, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ff6d7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00e8da, 0x000000, 0x00fbae,
+ /* b0 */ 0x000000, 0x000000, 0x00b3f7, 0x000000,
+ /* b4 */ 0x00fbaf, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00bef8, 0x00e8e5, 0x00fbb0, 0x00e8ea,
+ /* bc */ 0x00c1f3, 0x000000, 0x8ff6d8, 0x00e8e6,
+
+ /*** Three byte table, leaf: e893xx - offset 0x05518 ***/
+
+ /* 80 */ 0x00fbb1, 0x00e8ed, 0x00fbb2, 0x000000,
+ /* 84 */ 0x00c3df, 0x000000, 0x00e8ee, 0x000000,
+ /* 88 */ 0x000000, 0x00cdd6, 0x00e8e3, 0x00b3b8,
+ /* 8c */ 0x000000, 0x00e8e9, 0x8ff6da, 0x8ff6db,
+ /* 90 */ 0x00e8ec, 0x00ccac, 0x000000, 0x8ff6dc,
+ /* 94 */ 0x000000, 0x000000, 0x00e8ef, 0x000000,
+ /* 98 */ 0x000000, 0x00e8e8, 0x00e8eb, 0x000000,
+ /* 9c */ 0x8ff6d5, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ff6de,
+ /* a8 */ 0x000000, 0x000000, 0x8ff6df, 0x000000,
+ /* ac */ 0x00cba9, 0x000000, 0x00cfa1, 0x8ff6e0,
+ /* b0 */ 0x8ff6e1, 0x8ff6e2, 0x000000, 0x000000,
+ /* b4 */ 0x00e8f3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ff6e3, 0x000000,
+ /* bc */ 0x00e8fa, 0x8ff6e4, 0x000000, 0x00e8f2,
+
+ /*** Three byte table, leaf: e894xx - offset 0x05558 ***/
+
+ /* 80 */ 0x00bcc3, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e8d1, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff6e5, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00cace, 0x000000, 0x00cca2,
+ /* 94 */ 0x00e8f9, 0x00e8f8, 0x000000, 0x00e8f4,
+ /* 98 */ 0x00e8f5, 0x000000, 0x00b1b6, 0x8ff6e6,
+ /* 9c */ 0x000000, 0x000000, 0x00fbb5, 0x00e8f7,
+ /* a0 */ 0x000000, 0x00e8f1, 0x000000, 0x00fbb6,
+ /* a4 */ 0x8ff6e7, 0x8ff6e8, 0x00c4d5, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ff6e9,
+ /* ac */ 0x00e8f6, 0x00b0fe, 0x000000, 0x00fbb7,
+ /* b0 */ 0x000000, 0x000000, 0x00fbb4, 0x000000,
+ /* b4 */ 0x8ff6ea, 0x00c2a2, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00cac3, 0x8ff6ef, 0x000000,
+
+ /*** Three byte table, leaf: e895xx - offset 0x05598 ***/
+
+ /* 80 */ 0x00e8fb, 0x00e9a1, 0x000000, 0x00c8d9,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00e8fe, 0x00bed6, 0x00bcc9, 0x00e9a3,
+ /* 8c */ 0x000000, 0x000000, 0x00b6be, 0x8ff6eb,
+ /* 90 */ 0x000000, 0x8ff6f0, 0x000000, 0x8ff6f1,
+ /* 94 */ 0x000000, 0x00e9a4, 0x000000, 0x00c9f9,
+ /* 98 */ 0x00e8fd, 0x00fbb8, 0x00e8d6, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff6f2, 0x000000,
+ /* a0 */ 0x000000, 0x8ff6f3, 0x8ff6f4, 0x00e8fc,
+ /* a4 */ 0x00fbb9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00cfcf, 0x00c6a2, 0x00c9f3, 0x000000,
+ /* ac */ 0x000000, 0x00e9ab, 0x000000, 0x8ff6ec,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00e9b1,
+ /* b8 */ 0x000000, 0x000000, 0x00fbbc, 0x8ff6f6,
+ /* bc */ 0x000000, 0x8ff6f7, 0x00e9b2, 0x8ff6f8,
+
+ /*** Three byte table, leaf: e896xx - offset 0x055d8 ***/
+
+ /* 80 */ 0x00e9a5, 0x8ff6f9, 0x000000, 0x000000,
+ /* 84 */ 0x00c7f6, 0x000000, 0x8ff6fa, 0x00e9af,
+ /* 88 */ 0x00e9a7, 0x000000, 0x00e9a9, 0x000000,
+ /* 8c */ 0x00fbbd, 0x000000, 0x000000, 0x00fbbe,
+ /* 90 */ 0x00e9b3, 0x00e9a8, 0x000000, 0x8ff6fb,
+ /* 94 */ 0x00e9ac, 0x000000, 0x000000, 0x00b1f2,
+ /* 98 */ 0x000000, 0x00c6e5, 0x000000, 0x00e9ad,
+ /* 9c */ 0x00e9b0, 0x8ff6fc, 0x000000, 0x8ff6fd,
+ /* a0 */ 0x000000, 0x000000, 0x00fbbf, 0x000000,
+ /* a4 */ 0x00e9a6, 0x000000, 0x00c1a6, 0x000000,
+ /* a8 */ 0x00e9aa, 0x00bba7, 0x00bfc5, 0x00b7b0,
+ /* ac */ 0x00ccf4, 0x00fbbb, 0x00ccf9, 0x00bdf2,
+ /* b0 */ 0x00fbc0, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff7a3,
+ /* b8 */ 0x000000, 0x00e9b7, 0x00e9b5, 0x000000,
+ /* bc */ 0x8ff7a4, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x05617 ***/
+
+ /* 80 */ 0x000000, 0x00cfce, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff7a5,
+ /* 88 */ 0x000000, 0x00e9b4, 0x8ff7a6, 0x00fbc1,
+ /* 8c */ 0x000000, 0x00cdf5, 0x00fbc2, 0x00e9b6,
+ /* 90 */ 0x00e9b8, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00e9b9, 0x000000, 0x000000,
+ /* 98 */ 0x8ff7a7, 0x8ff7a8, 0x000000, 0x000000,
+ /* 9c */ 0x00e9bc, 0x00e9ba, 0x000000, 0x8ff7a9,
+ /* a0 */ 0x000000, 0x8ff7aa, 0x000000, 0x000000,
+ /* a4 */ 0x00c6a3, 0x00e9bb, 0x8ff7ab, 0x000000,
+ /* a8 */ 0x000000, 0x00c8cd, 0x00e9ae, 0x000000,
+ /* ac */ 0x000000, 0x00fbc3, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ff7ac, 0x00bdf3,
+ /* b8 */ 0x000000, 0x00e9bd, 0x00e9c2, 0x00c1f4,
+ /* bc */ 0x000000, 0x000000, 0x00e9c1, 0x00fbc5,
+
+ /*** Three byte table, leaf: e898xx - offset 0x05657 ***/
+
+ /* 80 */ 0x8ff7ad, 0x000000, 0x00e9a2, 0x000000,
+ /* 84 */ 0x00fbc6, 0x00fbc7, 0x00e9c3, 0x00c1c9,
+ /* 88 */ 0x000000, 0x000000, 0x00e9be, 0x00e9c0,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00fbc8, 0x8ff7ae, 0x00fbc4, 0x00e9bf,
+ /* 94 */ 0x000000, 0x000000, 0x00ddb1, 0x00dda2,
+ /* 98 */ 0x00fbca, 0x000000, 0x00e9c5, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff7af, 0x000000,
+ /* a0 */ 0x000000, 0x8ff7b0, 0x00e9c4, 0x000000,
+ /* a4 */ 0x8ff7b1, 0x000000, 0x000000, 0x8ff7b2,
+ /* a8 */ 0x000000, 0x00fbcb, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00cdf6, 0x000000, 0x00e2bc,
+ /* b0 */ 0x00e9c6, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00fbcc, 0x8ff7b4, 0x000000, 0x000000,
+ /* bc */ 0x8ff7b5, 0x000000, 0x000000, 0x00e9c7,
+
+ /*** Three byte table, leaf: e899xx - offset 0x05697 ***/
+
+ /* 80 */ 0x8ff7b7, 0x00afe8, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e9c8, 0x00b8d7, 0x000000,
+ /* 90 */ 0x00b5d4, 0x000000, 0x000000, 0x8ff7b9,
+ /* 94 */ 0x00e9ca, 0x00d1dd, 0x8ff7ba, 0x00fbcd,
+ /* 98 */ 0x000000, 0x000000, 0x00b5f5, 0x00fbce,
+ /* 9c */ 0x00ceba, 0x000000, 0x00b6f3, 0x00e9cb,
+ /* a0 */ 0x000000, 0x000000, 0x00fbd0, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00e9cc,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00c3ee,
+ /* ac */ 0x00fbd2, 0x000000, 0x000000, 0x8ff7bb,
+ /* b0 */ 0x000000, 0x00e9cd, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00fbd3, 0x000000, 0x8ff7bc,
+ /* b8 */ 0x000000, 0x00c6fa, 0x8ff7bd, 0x00b0ba,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x056d3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff7be,
+ /* 88 */ 0x000000, 0x8ff7bf, 0x00b2e3, 0x00e9d2,
+ /* 8c */ 0x00e9d3, 0x8ff7c0, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ff7c1, 0x000000, 0x00e9ce,
+ /* 94 */ 0x000000, 0x00bbbd, 0x000000, 0x000000,
+ /* 98 */ 0x00fbd4, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ff7c2, 0x8ff7c3, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00e9cf,
+ /* a4 */ 0x00c7c2, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8ff7c4, 0x00e9d0, 0x00e9d1, 0x00e9db,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00e9d5,
+ /* b0 */ 0x00e9d8, 0x8ff7c6, 0x000000, 0x8ff7c7,
+ /* b4 */ 0x000000, 0x000000, 0x00e9d4, 0x000000,
+ /* b8 */ 0x00fbd5, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x05712 ***/
+
+ /* 80 */ 0x000000, 0x8ff7c8, 0x000000, 0x8ff7c9,
+ /* 84 */ 0x00e9d6, 0x000000, 0x00e9d7, 0x00bcd8,
+ /* 88 */ 0x000000, 0x00e9d9, 0x000000, 0x00c3c1,
+ /* 8c */ 0x000000, 0x00b7d6, 0x00b3c2, 0x000000,
+ /* 90 */ 0x000000, 0x8ff7ca, 0x000000, 0x000000,
+ /* 94 */ 0x00e9dc, 0x8ff7cb, 0x000000, 0x8ff7cc,
+ /* 98 */ 0x000000, 0x00b3bf, 0x000000, 0x00e9e1,
+ /* 9c */ 0x000000, 0x000000, 0x00e9dd, 0x00e9e0,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ff7cd,
+ /* a4 */ 0x00c8ba, 0x000000, 0x8ff7ce, 0x000000,
+ /* a8 */ 0x000000, 0x00e9de, 0x000000, 0x000000,
+ /* ac */ 0x00e9df, 0x00c9c8, 0x00c8da, 0x00e9e2,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00c2fd, 0x00e9ec, 0x00fbd6, 0x00e9e8,
+ /* bc */ 0x00fbd7, 0x00fbd8, 0x00b2eb, 0x000000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x05752 ***/
+
+ /* 80 */ 0x00e9e6, 0x000000, 0x00cbaa, 0x00e9e7,
+ /* 84 */ 0x000000, 0x8ff7d0, 0x00e9e4, 0x8ff7d1,
+ /* 88 */ 0x00e9e5, 0x00e9ea, 0x00e9ed, 0x00fbd9,
+ /* 8c */ 0x000000, 0x00e9eb, 0x8ff7d2, 0x000000,
+ /* 90 */ 0x8ff7d3, 0x00e9e9, 0x00e9e3, 0x8ff7d4,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00c3d8, 0x8ff7d5, 0x00e9f4, 0x000000,
+ /* 9c */ 0x00ccaa, 0x000000, 0x000000, 0x8ff7d6,
+ /* a0 */ 0x000000, 0x8ff7d7, 0x000000, 0x8ff7d8,
+ /* a4 */ 0x000000, 0x00e9f2, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00e9f3, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ff7d9, 0x000000, 0x000000,
+ /* b4 */ 0x00e9ee, 0x000000, 0x000000, 0x00e9f0,
+ /* b8 */ 0x000000, 0x000000, 0x8ff7da, 0x00e9f1,
+ /* bc */ 0x000000, 0x000000, 0x8ff7db, 0x00e9ef,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x05792 ***/
+
+ /* 80 */ 0x8ff7dc, 0x000000, 0x000000, 0x8ff7dd,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00c0e6, 0x000000, 0x00cfb9,
+ /* 8c */ 0x00e9f8, 0x000000, 0x00e9f9, 0x000000,
+ /* 90 */ 0x000000, 0x8ff7de, 0x000000, 0x00eaa1,
+ /* 94 */ 0x000000, 0x00bfaa, 0x000000, 0x00e9fb,
+ /* 98 */ 0x8ff7df, 0x00e9fe, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e9f6,
+ /* a0 */ 0x00e9f5, 0x000000, 0x000000, 0x00eaa2,
+ /* a4 */ 0x8ff7e0, 0x8ff7e1, 0x00b2dc, 0x000000,
+ /* a8 */ 0x00e9fc, 0x000000, 0x00eaa3, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00e9fd, 0x000000,
+ /* b0 */ 0x000000, 0x00fbda, 0x8ff7e2, 0x000000,
+ /* b4 */ 0x00e9fa, 0x000000, 0x00c4b3, 0x000000,
+ /* b8 */ 0x00e9f7, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ff7e3, 0x000000, 0x000000, 0x00c7e8,
+
+ /*** Three byte table, leaf: e89exx - offset 0x057d2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00eaa7, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00fbdb,
+ /* 88 */ 0x00fbdc, 0x8ff7e7, 0x000000, 0x8ff7e8,
+ /* 8c */ 0x000000, 0x00cdbb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8ff7e9,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00eaa6,
+ /* a0 */ 0x8ff7ea, 0x000000, 0x00eaa5, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ff7e6,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00eaae,
+ /* ac */ 0x00fbdd, 0x00fbde, 0x000000, 0x00eaa8,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00eab0,
+ /* b4 */ 0x000000, 0x00fbdf, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00cde6, 0x00eab3,
+ /* bc */ 0x000000, 0x00eaaa, 0x8ff7ed, 0x000000,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x05812 ***/
+
+ /* 80 */ 0x00eaab, 0x8ff7ef, 0x000000, 0x000000,
+ /* 84 */ 0x00eaaf, 0x000000, 0x00eab2, 0x00eab1,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00eaa9,
+ /* 8c */ 0x000000, 0x000000, 0x8ff7f0, 0x000000,
+ /* 90 */ 0x00eaac, 0x000000, 0x00eabd, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00fbe1, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8ff7f2,
+ /* a0 */ 0x00eab6, 0x000000, 0x000000, 0x8ff7f4,
+ /* a4 */ 0x000000, 0x8ff7f5, 0x8ff7f6, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8ff7f7, 0x8ff7f8,
+ /* ac */ 0x00fbe2, 0x8ff7f9, 0x000000, 0x00eab4,
+ /* b0 */ 0x000000, 0x000000, 0x00eab5, 0x000000,
+ /* b4 */ 0x000000, 0x8ff7f1, 0x00eaba, 0x00eabb,
+ /* b8 */ 0x000000, 0x00b3aa, 0x000000, 0x00b5c2,
+ /* bc */ 0x000000, 0x000000, 0x00eab9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x05851 ***/
+
+ /* 80 */ 0x000000, 0x8ff7fa, 0x000000, 0x8ff7fb,
+ /* 84 */ 0x000000, 0x00eaa4, 0x00fbe3, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00fbe4, 0x8ff7fc,
+ /* 8c */ 0x000000, 0x00eab8, 0x00eabc, 0x00eab7,
+ /* 90 */ 0x00fbe5, 0x00eabe, 0x000000, 0x8ff7fd,
+ /* 94 */ 0x00fbe6, 0x00eac0, 0x00eabf, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00fbe7,
+ /* a0 */ 0x000000, 0x00eac2, 0x00eac1, 0x00e9da,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00eac6,
+ /* a8 */ 0x8ff7fe, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff8a1, 0x000000,
+ /* b0 */ 0x000000, 0x00eac3, 0x8ff8a2, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00eac4, 0x000000,
+ /* b8 */ 0x000000, 0x00eac5, 0x000000, 0x00eac7,
+ /* bc */ 0x8ff8a3, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x05891 ***/
+
+ /* 80 */ 0x00b7ec, 0x000000, 0x00eac9, 0x000000,
+ /* 84 */ 0x00eac8, 0x000000, 0x00bdb0, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff8a5, 0x000000,
+ /* 8c */ 0x00b9d4, 0x00dea7, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00eaca, 0x00bdd1,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00b3b9,
+ /* 98 */ 0x8ff8a6, 0x00eacb, 0x000000, 0x00b1d2,
+ /* 9c */ 0x000000, 0x00bed7, 0x00eacc, 0x8ff8a7,
+ /* a0 */ 0x000000, 0x00b9d5, 0x00eacd, 0x00b0e1,
+ /* a4 */ 0x8ff8a8, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c9bd, 0x8ff8ab, 0x000000, 0x00eace,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ff8ad,
+ /* b0 */ 0x00bfea, 0x000000, 0x00ead5, 0x000000,
+ /* b4 */ 0x000000, 0x00ead2, 0x000000, 0x00c3ef,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00ead3, 0x00ead0, 0x00b6de,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x058d1 ***/
+
+ /* 80 */ 0x000000, 0x00eacf, 0x00ead6, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00b7b6, 0x000000, 0x000000, 0x00c2de,
+ /* 8c */ 0x000000, 0x00eadc, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00ead8, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c2b5, 0x00ead7,
+ /* 98 */ 0x00fbe8, 0x00eada, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00ead1, 0x000000,
+ /* a0 */ 0x8ff8ae, 0x000000, 0x00eadb, 0x000000,
+ /* a4 */ 0x00eadd, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00fbe9, 0x00c8ef,
+ /* ac */ 0x000000, 0x000000, 0x00ead9, 0x000000,
+ /* b0 */ 0x00eade, 0x00eae0, 0x000000, 0x000000,
+ /* b4 */ 0x00b8d3, 0x00ead4, 0x000000, 0x00b0c1,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ff8af, 0x8ff8b0, 0x8ff8b1, 0x00eadf,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x05911 ***/
+
+ /* 80 */ 0x8ff8b2, 0x00badb, 0x00cef6, 0x00eae1,
+ /* 84 */ 0x00eae2, 0x00c1f5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00fbea, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00fbeb, 0x00cea2,
+ /* 90 */ 0x000000, 0x8ff8b5, 0x8ff8b3, 0x8ff8b6,
+ /* 94 */ 0x00eae3, 0x00cdb5, 0x000000, 0x000000,
+ /* 98 */ 0x00eae4, 0x00eae5, 0x000000, 0x8ff8b7,
+ /* 9c */ 0x00cae4, 0x00eae6, 0x000000, 0x00bac0,
+ /* a0 */ 0x000000, 0x00cea3, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00eaeb, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff8b8, 0x8ff8b9, 0x00eaec, 0x00bed8,
+ /* b4 */ 0x00eaea, 0x00fbed, 0x000000, 0x000000,
+ /* b8 */ 0x00cde7, 0x00eae7, 0x000000, 0x000000,
+ /* bc */ 0x00eae9, 0x00c0bd, 0x00bffe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x05950 ***/
+
+ /* 80 */ 0x000000, 0x8ff8bb, 0x00eae8, 0x000000,
+ /* 84 */ 0x00eaed, 0x000000, 0x000000, 0x00caa3,
+ /* 88 */ 0x000000, 0x000000, 0x00eaef, 0x000000,
+ /* 8c */ 0x00eaee, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00b3ec, 0x000000, 0x00cbab, 0x00eaf0,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00fbf0, 0x00fbf1, 0x00fbf2, 0x000000,
+ /* 9c */ 0x00fbee, 0x00eafc, 0x00eaf2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00eaf3, 0x000000, 0x00fbf3,
+ /* a8 */ 0x000000, 0x000000, 0x00eaf4, 0x00eaf5,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00fbf4, 0x000000, 0x00fbf5, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00eaf9, 0x8ff8bd,
+ /* b8 */ 0x00eafa, 0x00fbf6, 0x000000, 0x00eaf8,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x05990 ***/
+
+ /* 80 */ 0x00fbf7, 0x00eaf6, 0x8ff8bf, 0x00eaf1,
+ /* 84 */ 0x00eaf7, 0x8ff8c0, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8ff8c1, 0x000000, 0x000000,
+ /* 8c */ 0x00eafb, 0x00f0b7, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00b2a8, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00eafe, 0x00b6df,
+ /* a0 */ 0x00eafd, 0x000000, 0x8ff8c4, 0x000000,
+ /* a4 */ 0x00eba2, 0x000000, 0x00eba1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00eba4, 0x000000,
+ /* ac */ 0x000000, 0x00eba3, 0x000000, 0x00eba5,
+ /* b0 */ 0x000000, 0x000000, 0x00bdb1, 0x000000,
+ /* b4 */ 0x00eba6, 0x000000, 0x000000, 0x00eba7,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00eba8, 0x00c0be,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x059d0 ***/
+
+ /* 80 */ 0x8ff8c5, 0x00cdd7, 0x000000, 0x00eba9,
+ /* 84 */ 0x000000, 0x000000, 0x00caa4, 0x00c7c6,
+ /* 88 */ 0x00ebaa, 0x8ff8c6, 0x00ebab, 0x00b8ab,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00b5ac,
+ /* 90 */ 0x8ff8c7, 0x000000, 0x000000, 0x00ebac,
+ /* 94 */ 0x00fbf8, 0x000000, 0x00bbeb, 0x00c7c1,
+ /* 98 */ 0x00ebad, 0x000000, 0x00b3d0, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8ff8c8,
+ /* a0 */ 0x000000, 0x00ebae, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00ebb0, 0x00cdf7,
+ /* a8 */ 0x000000, 0x00ebaf, 0x00bfc6, 0x000000,
+ /* ac */ 0x00ebb1, 0x000000, 0x000000, 0x00ebb2,
+ /* b0 */ 0x8ff8c9, 0x000000, 0x00ebb3, 0x00b4d1,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff8ca,
+ /* b8 */ 0x000000, 0x000000, 0x00ebb4, 0x000000,
+ /* bc */ 0x000000, 0x00ebb5, 0x000000, 0x00ebb6,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x05a10 ***/
+
+ /* 80 */ 0x00ebb7, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00b3d1, 0x000000,
+ /* 94 */ 0x00fbfa, 0x000000, 0x8ff8cb, 0x000000,
+ /* 98 */ 0x8ff8cc, 0x000000, 0x00ebb8, 0x000000,
+ /* 9c */ 0x00ebb9, 0x00ebba, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00b2f2,
+ /* a4 */ 0x000000, 0x00fbfb, 0x00bfa8, 0x00ebbb,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ff8cd,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ff8cf, 0x000000, 0x8ff8d0,
+ /* b4 */ 0x00ebbc, 0x000000, 0x00fbfc, 0x000000,
+ /* b8 */ 0x00ebbd, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ff8d1, 0x000000, 0x8ff8d2,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x05a50 ***/
+
+ /* 80 */ 0x00b8c0, 0x000000, 0x00c4fb, 0x00ebbe,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00b7d7, 0x000000, 0x00bfd6, 0x000000,
+ /* 8c */ 0x00ebc1, 0x000000, 0x00c6a4, 0x000000,
+ /* 90 */ 0x00ebc0, 0x8ff8d4, 0x00fbfd, 0x00b7b1,
+ /* 94 */ 0x8ff8d5, 0x00fbfe, 0x00ebbf, 0x00c2f7,
+ /* 98 */ 0x00b5ad, 0x000000, 0x000000, 0x00ebc2,
+ /* 9c */ 0x000000, 0x00ebc3, 0x000000, 0x00bed9,
+ /* a0 */ 0x000000, 0x8ff8d7, 0x00fca1, 0x00b7ed,
+ /* a4 */ 0x000000, 0x00ebc4, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00cbac, 0x000000,
+ /* ac */ 0x000000, 0x00c0df, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00b5f6, 0x000000, 0x00ccf5,
+ /* b4 */ 0x00c1ca, 0x8ff8d8, 0x00ebc5, 0x00fca2,
+ /* b8 */ 0x000000, 0x000000, 0x00bfc7, 0x00c3f0,
+ /* bc */ 0x00beda, 0x000000, 0x8ff8d9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x05a8f ***/
+
+ /* 80 */ 0x000000, 0x00ebc6, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff8da, 0x00ebc9, 0x00fca3,
+ /* 88 */ 0x00ebca, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ff8db, 0x00fca4, 0x000000,
+ /* 90 */ 0x00babe, 0x00c2c2, 0x00ebc8, 0x000000,
+ /* 94 */ 0x00bedb, 0x00c9be, 0x000000, 0x000000,
+ /* 98 */ 0x8ff8dc, 0x000000, 0x000000, 0x00ebc7,
+ /* 9c */ 0x000000, 0x00fca5, 0x00bbec, 0x000000,
+ /* a0 */ 0x00b1d3, 0x00fca6, 0x00ebce, 0x00b7d8,
+ /* a4 */ 0x000000, 0x000000, 0x00bbee, 0x000000,
+ /* a8 */ 0x000000, 0x00bbed, 0x000000, 0x00cfcd,
+ /* ac */ 0x00ebcd, 0x00ebcc, 0x00c1a7, 0x000000,
+ /* b0 */ 0x00b5cd, 0x00cfc3, 0x00b3ba, 0x00bedc,
+ /* b4 */ 0x000000, 0x00fca7, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00fca8, 0x000000, 0x000000,
+ /* bc */ 0x00ebcb, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x05acd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ebd0, 0x000000,
+ /* 84 */ 0x00ebd1, 0x00ebcf, 0x000000, 0x00b8d8,
+ /* 88 */ 0x000000, 0x00cdc0, 0x000000, 0x000000,
+ /* 8c */ 0x00bbef, 0x00c7a7, 0x000000, 0x000000,
+ /* 90 */ 0x8ff8de, 0x00ebd4, 0x000000, 0x00c0c0,
+ /* 94 */ 0x000000, 0x00c3c2, 0x000000, 0x000000,
+ /* 98 */ 0x00cdb6, 0x000000, 0x00ebd7, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00b8ec, 0x000000,
+ /* a0 */ 0x00c0bf, 0x00ebd3, 0x000000, 0x00ebd8,
+ /* a4 */ 0x00b8ed, 0x00ebd5, 0x00ebd6, 0x00fca9,
+ /* a8 */ 0x00ebd2, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c0e2, 0x00c6c9, 0x8ff8dd, 0x000000,
+ /* b0 */ 0x00c3af, 0x000000, 0x00b2dd, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff8df,
+ /* b8 */ 0x000000, 0x00c8f0, 0x000000, 0x000000,
+ /* bc */ 0x00b5c3, 0x000000, 0x8ff8e0, 0x00c4b4,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x05b0d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ebdb, 0x000000,
+ /* 84 */ 0x00ebd9, 0x000000, 0x000000, 0x00c3cc,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00c0c1,
+ /* 8c */ 0x00b4d2, 0x00ebda, 0x000000, 0x00bfdb,
+ /* 90 */ 0x00fcaa, 0x000000, 0x00ceca, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00cfc0, 0x8ff8e1,
+ /* 98 */ 0x000000, 0x000000, 0x00ebdc, 0x00ebe7,
+ /* 9c */ 0x00c4b5, 0x000000, 0x00ebe6, 0x00fcab,
+ /* a0 */ 0x00ebe3, 0x00ebeb, 0x00ebe4, 0x000000,
+ /* a4 */ 0x00ebe0, 0x000000, 0x00c4fc, 0x00ebdf,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00ebdd,
+ /* ac */ 0x000000, 0x00cda1, 0x00bbf0, 0x000000,
+ /* b0 */ 0x000000, 0x00ebe1, 0x000000, 0x00ebde,
+ /* b4 */ 0x00fcac, 0x000000, 0x00fcad, 0x00ebe5,
+ /* b8 */ 0x00bdf4, 0x000000, 0x00b8c1, 0x000000,
+ /* bc */ 0x8ff8e2, 0x000000, 0x00c2fa, 0x000000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x05b4d ***/
+
+ /* 80 */ 0x00cbc5, 0x00b1da, 0x00b0e2, 0x000000,
+ /* 84 */ 0x00c6a5, 0x8ff8e5, 0x000000, 0x00ebe9,
+ /* 88 */ 0x000000, 0x000000, 0x8ff8e4, 0x000000,
+ /* 8c */ 0x00ebe8, 0x8ff8e6, 0x00c6e6, 0x000000,
+ /* 90 */ 0x00ebed, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00ebe2, 0x000000, 0x00ebec, 0x00ebee,
+ /* 98 */ 0x000000, 0x00b8ac, 0x00ebea, 0x00b9d6,
+ /* 9c */ 0x8ff8e7, 0x00bcd5, 0x000000, 0x8ff8e8,
+ /* a0 */ 0x00ebef, 0x00cdd8, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00ebf2, 0x000000,
+ /* a8 */ 0x00ebf5, 0x000000, 0x000000, 0x00ebf3,
+ /* ac */ 0x00c9b5, 0x8ff8e9, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00ebf0,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00b6e0, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00ebf4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x05b8c ***/
+
+ /* 80 */ 0x000000, 0x00ebf6, 0x000000, 0x8ff8ea,
+ /* 84 */ 0x000000, 0x000000, 0x00fcb1, 0x000000,
+ /* 88 */ 0x000000, 0x00ebfa, 0x000000, 0x000000,
+ /* 8c */ 0x00ebf7, 0x000000, 0x00ebf9, 0x00ebf8,
+ /* 90 */ 0x000000, 0x8ff8ec, 0x000000, 0x000000,
+ /* 94 */ 0x00fcb2, 0x000000, 0x00ebfb, 0x000000,
+ /* 98 */ 0x00bcb1, 0x00fcb3, 0x00ebfd, 0x00ebfc,
+ /* 9c */ 0x00c9e8, 0x000000, 0x8ff8ed, 0x00eca1,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00b7d9, 0x000000,
+ /* a8 */ 0x000000, 0x00fcb4, 0x000000, 0x00ebfe,
+ /* ac */ 0x00eca2, 0x000000, 0x000000, 0x00eca3,
+ /* b0 */ 0x00b5c4, 0x00e6c1, 0x00bef9, 0x000000,
+ /* b4 */ 0x00eca4, 0x000000, 0x8ff8ee, 0x00b8ee,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00eca5, 0x000000, 0x8ff8ef,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x05bcc ***/
+
+ /* 80 */ 0x00eca6, 0x8ff8f0, 0x000000, 0x00bbbe,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00dace, 0x8ff8f1,
+ /* 8c */ 0x00eca7, 0x000000, 0x00eca8, 0x000000,
+ /* 90 */ 0x00bdb2, 0x000000, 0x00eca9, 0x00ecaa,
+ /* 94 */ 0x8ff8f2, 0x8ff8f3, 0x00ecab, 0x000000,
+ /* 98 */ 0x000000, 0x00ecac, 0x00ecad, 0x000000,
+ /* 9c */ 0x8ff8f4, 0x00fcb5, 0x8ff8f5,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x05beb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c3ab,
+ /* b8 */ 0x000000, 0x8ff8f6, 0x00ecae, 0x000000,
+ /* bc */ 0x000000, 0x8ff8f8, 0x000000, 0x00ecb0,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x05c2b ***/
+
+ /* 80 */ 0x000000, 0x00ecaf, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff8fb, 0x00c6a6, 0x8ff8fc,
+ /* 88 */ 0x00ecb1, 0x00fcb6, 0x00cbad, 0x000000,
+ /* 8c */ 0x00ecb2, 0x000000, 0x00ecb3, 0x8ff8fd,
+ /* 90 */ 0x00ecb4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff8fe, 0x00ecb5, 0x000000, 0x8ff9a1,
+ /* 98 */ 0x000000, 0x000000, 0x00c6da, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00bedd, 0x00ecb6, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00fcb7, 0x8ff9a2, 0x00b9eb, 0x00d0ae,
+ /* ac */ 0x00ecb7, 0x8ff9a3, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff9a4,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00ecb8, 0x00c9bf, 0x00ecb9, 0x000000,
+ /* bc */ 0x00ecc1, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x05c69 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ecba, 0x000000,
+ /* 84 */ 0x000000, 0x00ecbc, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00ecbb, 0x00ecbd, 0x000000,
+ /* 8c */ 0x00cbc6, 0x00ecbe, 0x00ecbf, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8ff9a7, 0x8ff9a6,
+ /* 94 */ 0x00ecc0, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00ecc2, 0x8ff9a8, 0x000000, 0x8ff9aa,
+ /* 9c */ 0x000000, 0x00b3ad, 0x00c4e7, 0x000000,
+ /* a0 */ 0x00c9e9, 0x00bae2, 0x00b9d7, 0x000000,
+ /* a4 */ 0x8ff9ab, 0x000000, 0x000000, 0x00c9cf,
+ /* a8 */ 0x00b2df, 0x00c8ce, 0x00ecc5, 0x00b4d3,
+ /* ac */ 0x00c0d5, 0x00ecc4, 0x00ecc9, 0x00c3f9,
+ /* b0 */ 0x00cce3, 0x000000, 0x00ecc7, 0x00ecc8,
+ /* b4 */ 0x00b5ae, 0x000000, 0x00ecca, 0x00c7e3,
+ /* b8 */ 0x00c2df, 0x000000, 0x000000, 0x00c8f1,
+ /* bc */ 0x00c5bd, 0x00ecc6, 0x000000, 0x00cbc7,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x05ca9 ***/
+
+ /* 80 */ 0x00b2ec, 0x00eccc, 0x00cfa8, 0x00c4c2,
+ /* 84 */ 0x00cfc5, 0x000000, 0x000000, 0x00bbf1,
+ /* 88 */ 0x00eccb, 0x000000, 0x00c2b1, 0x000000,
+ /* 8c */ 0x000000, 0x00ecdc, 0x00c1a8, 0x000000,
+ /* 90 */ 0x000000, 0x00c6f8, 0x000000, 0x00c9d0,
+ /* 94 */ 0x000000, 0x8ff9ad, 0x8ff9ac, 0x000000,
+ /* 98 */ 0x000000, 0x8ff9ae, 0x00eccf, 0x00bbbf,
+ /* 9c */ 0x00bbf2, 0x000000, 0x00bede, 0x000000,
+ /* a0 */ 0x00c7e5, 0x00fcb9, 0x00b8ad, 0x00ecce,
+ /* a4 */ 0x00eccd, 0x000000, 0x00c9ea, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00bcc1, 0x000000,
+ /* ac */ 0x000000, 0x00c5d2, 0x000000, 0x000000,
+ /* b0 */ 0x8ff9b0, 0x8ff9b1, 0x000000, 0x000000,
+ /* b4 */ 0x00fcba, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00fcbb, 0x000000, 0x00ecd1, 0x00ecd2,
+ /* bc */ 0x00b9d8, 0x00ecd0, 0x00fcbc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x05ce8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00ecd3, 0x00ecd4, 0x000000, 0x00ecd6,
+ /* 88 */ 0x00c2a3, 0x8ff9b3, 0x00ecd5, 0x00b4e6,
+ /* 8c */ 0x000000, 0x00ecd8, 0x8ff9b4, 0x00ecd7,
+ /* 90 */ 0x00ecd9, 0x000000, 0x00fcbe, 0x00ecdb,
+ /* 94 */ 0x00ecdd, 0x000000, 0x00ecde, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00fcbf,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x05d04 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c0d6, 0x000000, 0x00bccf, 0x00ecdf,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00b3d2,
+ /* ac */ 0x8ff9b5, 0x00ece0, 0x000000, 0x000000,
+ /* b0 */ 0x00c1f6, 0x00ece1, 0x000000, 0x00ece2,
+ /* b4 */ 0x00c9eb, 0x000000, 0x000000, 0x00b5af,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x05d43 ***/
+
+ /* 80 */ 0x000000, 0x00ece3, 0x000000, 0x000000,
+ /* 84 */ 0x8ff9b6, 0x00c4b6, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00b1db, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ff9b7, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00ece4, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00bcf1,
+ /* a4 */ 0x000000, 0x000000, 0x8ff9b8, 0x000000,
+ /* a8 */ 0x00bff6, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00fcc0,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00c2ad,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00ece7, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00ece6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x05d82 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ece5, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ff9ba, 0x000000,
+ /* 88 */ 0x8ff9bb, 0x000000, 0x000000, 0x00eced,
+ /* 8c */ 0x00eceb, 0x000000, 0x00fcc1, 0x00ece8,
+ /* 90 */ 0x000000, 0x00fcc2, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00ecea, 0x00fcc3,
+ /* 98 */ 0x000000, 0x8ff9bc, 0x00ece9, 0x00ecec,
+ /* 9c */ 0x000000, 0x00b5f7, 0x000000, 0x00ecf0,
+ /* a0 */ 0x000000, 0x00c0d7, 0x000000, 0x00ecf1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b8d9, 0x000000, 0x00ecee, 0x00ecef,
+ /* ac */ 0x8ff9bd, 0x000000, 0x000000, 0x00cfa9,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00c4b7,
+ /* b4 */ 0x000000, 0x00c1a9, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00ecf2, 0x8ff9c0, 0x000000, 0x00ecf5,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x05dc2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ff9c1, 0x000000,
+ /* 88 */ 0x00ecf3, 0x00ecf4, 0x00cdd9, 0x000000,
+ /* 8c */ 0x8ff9be, 0x000000, 0x000000, 0x00c6a7,
+ /* 90 */ 0x00ecf8, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff9c3, 0x000000, 0x8ff9c4, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00ecf6, 0x00ecf7, 0x00ecf9,
+ /* a0 */ 0x00fcc4, 0x8ff9c5, 0x8ff9c6, 0x00fcc5,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ff9c7,
+ /* a8 */ 0x000000, 0x000000, 0x00eda9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00ecfc, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00ecfd, 0x00ecfb, 0x8ff9ca, 0x000000,
+ /* b8 */ 0x000000, 0x8ff9cb, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00fcc6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x05e00 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ecfa, 0x000000,
+ /* 84 */ 0x00c4fd, 0x000000, 0x000000, 0x00eda1,
+ /* 88 */ 0x00eda5, 0x00eda2, 0x00ecfe, 0x8ff9cc,
+ /* 8c */ 0x00eda3, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00eda4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff9cd, 0x00edab, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00eda6, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00c0d8,
+ /* a0 */ 0x00eda8, 0x000000, 0x8ff9ce, 0x00edaa,
+ /* a4 */ 0x00eda7, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8ff9cf, 0x8ff9d0, 0x000000, 0x8ff9d1,
+ /* b0 */ 0x00fcc7, 0x000000, 0x00edad, 0x000000,
+ /* b4 */ 0x00bdb3, 0x000000, 0x00edac, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00fcc8,
+ /* bc */ 0x00edae, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x05e3f ***/
+
+ /* 80 */ 0x000000, 0x00edaf, 0x000000, 0x000000,
+ /* 84 */ 0x00edb2, 0x00edb1, 0x000000, 0x00edb0,
+ /* 88 */ 0x000000, 0x000000, 0x00edb4, 0x00edb3,
+ /* 8c */ 0x000000, 0x00ccf6, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00edb6, 0x000000, 0x00edb5,
+ /* 94 */ 0x00edb7, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ff9d2, 0x00edb8, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff9d3, 0x000000,
+ /* a0 */ 0x000000, 0x00edba, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00edb9, 0x00bfc8,
+ /* ac */ 0x00edbb, 0x000000, 0x8ff9d4, 0x00b6ed,
+ /* b0 */ 0x00edbc, 0x00edbe, 0x000000, 0x8ff9d5,
+ /* b4 */ 0x000000, 0x8ff9d6, 0x8ff9d7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ff9d8,
+ /* bc */ 0x000000, 0x000000, 0x00edbf, 0x000000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x05e7f ***/
+
+ /* 80 */ 0x00fcca, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00edc0, 0x00edbd, 0x000000,
+ /* 88 */ 0x00edc1, 0x000000, 0x00bcd6, 0x00edc2,
+ /* 8c */ 0x00b5b0, 0x00b7b3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ff9da, 0x00b8ae, 0x000000,
+ /* 94 */ 0x8ff9db, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00edc3,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00c6f0,
+ /* a0 */ 0x000000, 0x000000, 0x00c5be, 0x00edc4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00edc7,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00bcb4, 0x8ff9dd, 0x00fccc, 0x00edc6,
+ /* bc */ 0x00edc5, 0x00b7da, 0x00edc8, 0x000000,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x05ebf ***/
+
+ /* 80 */ 0x8ff9df, 0x000000, 0x000000, 0x00b3d3,
+ /* 84 */ 0x000000, 0x00edca, 0x000000, 0x000000,
+ /* 88 */ 0x8ff9e0, 0x00badc, 0x00edc9, 0x000000,
+ /* 8c */ 0x00edd2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00edcc, 0x00edce,
+ /* 94 */ 0x00cae5, 0x00edcb, 0x000000, 0x8ff9e1,
+ /* 98 */ 0x000000, 0x00edcd, 0x000000, 0x00edd1,
+ /* 9c */ 0x00edcf, 0x00b5b1, 0x00fccd, 0x00edd0,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00edd3, 0x000000,
+ /* a8 */ 0x000000, 0x00c7da, 0x00ced8, 0x8ff9e2,
+ /* ac */ 0x000000, 0x00fcce, 0x000000, 0x00bdb4,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00edd4,
+ /* b4 */ 0x000000, 0x000000, 0x00fccf, 0x000000,
+ /* b8 */ 0x00cda2, 0x00edd6, 0x000000, 0x00edd5,
+ /* bc */ 0x000000, 0x000000, 0x00edd9, 0x00cdc1,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x05eff ***/
+
+ /* 80 */ 0x8ff9e3, 0x000000, 0x00edd8, 0x000000,
+ /* 84 */ 0x00b3ed, 0x00edd7, 0x00eddc, 0x000000,
+ /* 88 */ 0x000000, 0x00eddb, 0x8ff9e4, 0x000000,
+ /* 8c */ 0x00edda, 0x00c5b2, 0x00eddd, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00fcd0, 0x000000, 0x000000, 0x00edde,
+ /* 98 */ 0x8ff9e5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00eddf, 0x000000, 0x000000, 0x00b9ec,
+ /* a0 */ 0x000000, 0x00b7a5, 0x00ede0, 0x00ede1,
+ /* a4 */ 0x00ede2,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x05f24 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00bfc9,
+ /* 9c */ 0x00ede3, 0x000000, 0x00bcad, 0x00ede4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00ede5,
+ /* a4 */ 0x8ff9e7, 0x000000, 0x00fcd2, 0x00d2a1,
+ /* a8 */ 0x00d1fe, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00ede6, 0x00e5f0, 0x00ede7,
+ /* b0 */ 0x00c3a4, 0x00bfab, 0x00c7c0, 0x000000,
+ /* b4 */ 0x8ff9e8, 0x00fcd3, 0x8ff9ea, 0x00ede8,
+ /* b8 */ 0x000000, 0x000000, 0x00cad5, 0x00c4d4,
+ /* bc */ 0x00b9fe, 0x000000, 0x000000, 0x00c3a9,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x05f64 ***/
+
+ /* 80 */ 0x000000, 0x8ff9ec, 0x00b1aa, 0x000000,
+ /* 84 */ 0x00cbf8, 0x00bfd7, 0x8ff9ed, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff9ef, 0x000000,
+ /* 8c */ 0x000000, 0x8ff9f0, 0x00b7de, 0x000000,
+ /* 90 */ 0x000000, 0x00b6e1, 0x000000, 0x8ff9f1,
+ /* 94 */ 0x00cad6, 0x8ff9f2, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00ede9, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff9f3, 0x000000, 0x00edeb, 0x000000,
+ /* a4 */ 0x00fcd4, 0x00edea, 0x00b2e0, 0x000000,
+ /* a8 */ 0x00fcd5, 0x00c6f6, 0x00edec, 0x00c7f7,
+ /* ac */ 0x000000, 0x00c5b3, 0x00fcd6, 0x00eded,
+ /* b0 */ 0x00bdd2, 0x8ff9f4, 0x000000, 0x000000,
+ /* b4 */ 0x00edef, 0x8ff9f5, 0x000000, 0x00ccc2,
+ /* b8 */ 0x00edfe, 0x00edf1, 0x00edf2, 0x8ff9f6,
+ /* bc */ 0x000000, 0x00c4c9, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x05fa4 ***/
+
+ /* 80 */ 0x00c2e0, 0x00c1f7, 0x8ff9f7, 0x00c6a8,
+ /* 84 */ 0x000000, 0x00edf0, 0x00b5d5, 0x000000,
+ /* 88 */ 0x00fcd7, 0x000000, 0x000000, 0x00edf9,
+ /* 8c */ 0x8ff9f8, 0x00edf6, 0x00eea5, 0x00c6a9,
+ /* 90 */ 0x00c3e0, 0x00edf3, 0x000000, 0x00c4fe,
+ /* 94 */ 0x00c5d3, 0x00edf4, 0x00edf8, 0x00bfe0,
+ /* 98 */ 0x000000, 0x00c7e7, 0x00c4cc, 0x000000,
+ /* 9c */ 0x000000, 0x00c0c2, 0x00edf7, 0x00c2ae,
+ /* a0 */ 0x00c2a4, 0x00edf5, 0x00b0a9, 0x00cfa2,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00edfa,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00fcd8, 0x00c2e1, 0x000000,
+ /* b0 */ 0x000000, 0x00bdb5, 0x00bfca, 0x000000,
+ /* b4 */ 0x000000, 0x00edfc, 0x00edfb, 0x8ff9f9,
+ /* b8 */ 0x00b0ef, 0x00edfd, 0x000000, 0x000000,
+ /* bc */ 0x00c9af, 0x000000, 0x00eea7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x05fe3 ***/
+
+ /* 80 */ 0x000000, 0x00c6db, 0x00bfeb, 0x8ff9fb,
+ /* 84 */ 0x8ff9fc, 0x00c3d9, 0x000000, 0x00b6f8,
+ /* 88 */ 0x000000, 0x00eea6, 0x00cdb7, 0x00b1bf,
+ /* 8c */ 0x000000, 0x00cad7, 0x00b2e1, 0x00eea1,
+ /* 90 */ 0x00eea2, 0x00eea3, 0x00eea4, 0x00c6bb,
+ /* 94 */ 0x00c3a3, 0x00b0e3, 0x00eea8, 0x000000,
+ /* 98 */ 0x00eea9, 0x00f4a3, 0x000000, 0x000000,
+ /* 9c */ 0x00c2bd, 0x8ff9fd, 0x00eeaa, 0x000000,
+ /* a0 */ 0x00b1f3, 0x00c1cc, 0x000000, 0x00b8af,
+ /* a4 */ 0x000000, 0x00cdda, 0x000000, 0x000000,
+ /* a8 */ 0x00eeab, 0x00c5ac, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00c1f8, 0x00bcd7, 0x00eeac,
+ /* b0 */ 0x000000, 0x000000, 0x00eeaf, 0x000000,
+ /* b4 */ 0x000000, 0x00bde5, 0x00eead, 0x00c1ab,
+ /* b8 */ 0x00c1aa, 0x000000, 0x00b0e4, 0x000000,
+ /* bc */ 0x00cecb, 0x00eeb1, 0x000000, 0x00c8f2,
+
+ /*** Three byte table, leaf: e982xx - offset 0x06023 ***/
+
+ /* 80 */ 0x00eeb3, 0x00eeb2, 0x00eeb0, 0x00e3e4,
+ /* 84 */ 0x00b4d4, 0x8ffaa2, 0x000000, 0x00edee,
+ /* 88 */ 0x00fcda, 0x00eeb5, 0x00eeb4, 0x000000,
+ /* 8c */ 0x8ffaa3, 0x000000, 0x000000, 0x00eeb6,
+ /* 90 */ 0x8ffaa4, 0x00cdb8, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00fcdb, 0x000000, 0x00fcdc,
+ /* 98 */ 0x000000, 0x00fcdd, 0x000000, 0x00fcde,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8ffaa6, 0x00fcdf, 0x00c6e1,
+ /* a4 */ 0x000000, 0x000000, 0x00cbae, 0x000000,
+ /* a8 */ 0x00eeb7, 0x000000, 0x00bcd9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00eeb8,
+ /* b0 */ 0x8ffaa8, 0x00eeb9, 0x000000, 0x00fce0,
+ /* b4 */ 0x000000, 0x00eeba, 0x8ffaa9, 0x000000,
+ /* b8 */ 0x00c5a1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00fce1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x06062 ***/
+
+ /* 80 */ 0x000000, 0x00b0ea, 0x000000, 0x8ffaaa,
+ /* 84 */ 0x00fce2, 0x00fce3, 0x000000, 0x00fce4,
+ /* 88 */ 0x8ffaab, 0x000000, 0x00b9d9, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00cfba, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00fce5,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00eebe,
+ /* 9c */ 0x8ffaad, 0x00fce6, 0x00fce7, 0x8ffaae,
+ /* a0 */ 0x000000, 0x00b7b4, 0x00eebb, 0x000000,
+ /* a4 */ 0x00eebc, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c9f4, 0x000000, 0x000000, 0x8ffab3,
+ /* ac */ 0x000000, 0x00b3d4, 0x000000, 0x00fce8,
+ /* b0 */ 0x000000, 0x000000, 0x8ffab1, 0x000000,
+ /* b4 */ 0x00fce9, 0x00cdb9, 0x8ffab0, 0x00b6bf,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00c5d4, 0x8ffab4, 0x8ffab5,
+
+ /*** Three byte table, leaf: e984xx - offset 0x060a2 ***/
+
+ /* 80 */ 0x8ffab2, 0x000000, 0x00eebf, 0x000000,
+ /* 84 */ 0x8ffab6, 0x000000, 0x8ffab7, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00eec0, 0x000000,
+ /* 94 */ 0x00fceb, 0x00fcec, 0x00fced, 0x000000,
+ /* 98 */ 0x8ffab8, 0x00eec1, 0x000000, 0x000000,
+ /* 9c */ 0x8ffab9, 0x000000, 0x8ffaba, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00fcee, 0x00fcef,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00fcf0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00c5a2, 0x000000, 0x00fcf1,
+ /* b0 */ 0x00eec3, 0x00fcf2, 0x00eec2, 0x000000,
+ /* b4 */ 0x00fcf3, 0x000000, 0x000000, 0x8ffabb,
+ /* b8 */ 0x000000, 0x8ffabc, 0x8ffabd, 0x000000,
+ /* bc */ 0x000000, 0x00fcf4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x060e0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ffabe, 0x8ffabf,
+ /* 88 */ 0x00fcf5, 0x00c6d3, 0x00eec4, 0x00bdb6,
+ /* 8c */ 0x00bce0, 0x00c7db, 0x00c3f1, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00bcf2, 0x000000,
+ /* 94 */ 0x00bfec, 0x000000, 0x00eec5, 0x8ffac0,
+ /* 98 */ 0x00eec6, 0x8ffac1, 0x000000, 0x00fcf6,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8ffac2, 0x00bfdd, 0x00eec7,
+ /* a4 */ 0x8ffac3, 0x00eec8, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00eec9, 0x00cdef, 0x000000,
+ /* ac */ 0x00bdb7, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00eecb, 0x00eeca,
+ /* b4 */ 0x8ffac4, 0x00b9da, 0x000000, 0x00b9f3,
+ /* b8 */ 0x00bbc0, 0x8ffac5, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x0611e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00eece, 0x00fcf7,
+ /* 84 */ 0x000000, 0x8ffac6, 0x000000, 0x00bde6,
+ /* 88 */ 0x000000, 0x00eecd, 0x000000, 0x00eecc,
+ /* 8c */ 0x000000, 0x00c2e9, 0x8ffac7, 0x000000,
+ /* 90 */ 0x00b8ef, 0x000000, 0x00c0c3, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c8b0,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00bdb9, 0x000000, 0x00fcf8, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00eecf, 0x000000,
+ /* a4 */ 0x00bedf, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8ffac8, 0x000000, 0x00eed2, 0x00eed0,
+ /* ac */ 0x00fcf9, 0x000000, 0x8ffac9, 0x00eed1,
+ /* b0 */ 0x000000, 0x00fcfa, 0x000000, 0x8ffaca,
+ /* b4 */ 0x00eed4, 0x00eed3, 0x8ffacb, 0x000000,
+ /* b8 */ 0x00befa, 0x000000, 0x00eed5, 0x000000,
+ /* bc */ 0x00fcfb, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x0615e ***/
+
+ /* 80 */ 0x00eed6, 0x00eed7, 0x000000, 0x8ffacc,
+ /* 84 */ 0x8ffacd, 0x000000, 0x00c8d0, 0x00bad3,
+ /* 88 */ 0x00bce1, 0x00eed8, 0x000000, 0x00eed9,
+ /* 8c */ 0x00cea4, 0x00bdc5, 0x00ccee, 0x00cecc,
+ /* 90 */ 0x00eeda, 0x00b6e2, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00eedb, 0x00fcfc,
+ /* 98 */ 0x00c5a3, 0x000000, 0x8fface, 0x00eede,
+ /* 9c */ 0x00b3f8, 0x00bfcb, 0x000000, 0x00eedc,
+ /* a0 */ 0x000000, 0x00eedd, 0x000000, 0x00c4e0,
+ /* a4 */ 0x00fcfe, 0x00fda1, 0x00cbd5, 0x00b6fc,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8ffad1, 0x00fda2, 0x8ffad2, 0x000000,
+ /* b0 */ 0x000000, 0x00fda3, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00eee0, 0x00eee1, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00fcfd,
+ /* bc */ 0x00eedf, 0x000000, 0x000000, 0x00eee3,
+
+ /*** Three byte table, leaf: e988xx - offset 0x0619e ***/
+
+ /* 80 */ 0x000000, 0x8ffad3, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00fda4,
+ /* 88 */ 0x000000, 0x000000, 0x8ffad4, 0x000000,
+ /* 8c */ 0x000000, 0x00c6df, 0x00b3c3, 0x000000,
+ /* 90 */ 0x00fda5, 0x00eee7, 0x000000, 0x000000,
+ /* 94 */ 0x00eee4, 0x00eee6, 0x8ffad5, 0x8ffad6,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00eee2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00efcf, 0x000000, 0x000000,
+ /* ac */ 0x00eee5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ffad8,
+ /* b4 */ 0x00ceeb, 0x000000, 0x000000, 0x00b8da,
+ /* b8 */ 0x00fda6, 0x00fda7, 0x00fda8, 0x000000,
+ /* bc */ 0x00fda9, 0x000000, 0x000000, 0x00eeef,
+
+ /*** Three byte table, leaf: e989xx - offset 0x061de ***/
+
+ /* 80 */ 0x00fdaa, 0x000000, 0x8ffad9, 0x00fdab,
+ /* 84 */ 0x00c5b4, 0x00eeea, 0x000000, 0x8ffada,
+ /* 88 */ 0x00eeed, 0x00eeeb, 0x8ffadb, 0x00eef0,
+ /* 8c */ 0x000000, 0x000000, 0x8ffadc, 0x00fdac,
+ /* 90 */ 0x00eef1, 0x8ffadd, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ffade, 0x00eee9,
+ /* 98 */ 0x000000, 0x8ffadf, 0x00eef6, 0x00b1f4,
+ /* 9c */ 0x000000, 0x000000, 0x00eee8, 0x000000,
+ /* a0 */ 0x8ffae0, 0x8ffae1, 0x00c8ad, 0x000000,
+ /* a4 */ 0x00eeec, 0x8ffae2, 0x00bee0, 0x8ffae3,
+ /* a8 */ 0x8ffae4, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00b9db, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00fdad, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ffae7, 0x8ffae8, 0x00cbc8, 0x8ffae9,
+
+ /*** Three byte table, leaf: e98axx - offset 0x0621e ***/
+
+ /* 80 */ 0x00b6e4, 0x000000, 0x000000, 0x00bdc6,
+ /* 84 */ 0x000000, 0x00c6bc, 0x000000, 0x000000,
+ /* 88 */ 0x00fdae, 0x8ffaea, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ffaeb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00c1ad, 0x000000, 0x00eef4,
+ /* 94 */ 0x000000, 0x00eeee, 0x00eef3, 0x8ffaec,
+ /* 98 */ 0x00ccc3, 0x8ffaed, 0x00c4b8, 0x00eef5,
+ /* 9c */ 0x00eef2, 0x000000, 0x000000, 0x8ffaee,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ffaef,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ffaf0,
+ /* ac */ 0x000000, 0x00c1ac, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffaf3, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00eef9,
+ /* b8 */ 0x000000, 0x00eef8, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8ffaf4,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x0625e ***/
+
+ /* 80 */ 0x8ffaf5, 0x000000, 0x00fdaf, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ffaf6, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00fdb0,
+ /* 8c */ 0x00fdb1, 0x000000, 0x8ffaf7, 0x00eef7,
+ /* 90 */ 0x8ffaf8, 0x000000, 0x00cbaf, 0x00fdb2,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ffaf9,
+ /* 98 */ 0x000000, 0x8ffafa, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00fdb3, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00bdfb, 0x8ffafb, 0x000000, 0x8ffafc,
+ /* a8 */ 0x000000, 0x00eefa, 0x00cadf, 0x000000,
+ /* ac */ 0x000000, 0x00b1d4, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00c9c6, 0x00c3f2,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ffba2,
+ /* b8 */ 0x00b5f8, 0x8ffba3, 0x00eefc, 0x8ffba4,
+ /* bc */ 0x00b9dd, 0x000000, 0x000000, 0x00fdb4,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x0629e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffba5, 0x000000,
+ /* 84 */ 0x00fdb5, 0x000000, 0x00bbac, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ffba6, 0x000000, 0x00eefb,
+ /* 90 */ 0x00bfed, 0x8ffafd, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ffba7, 0x000000, 0x000000,
+ /* 98 */ 0x00bfee, 0x00efa1, 0x00efa3, 0x000000,
+ /* 9c */ 0x000000, 0x8ffba8, 0x8ffba9, 0x00fdb6,
+ /* a0 */ 0x00befb, 0x00fdb7, 0x00efa2, 0x00efa4,
+ /* a4 */ 0x000000, 0x00fdb8, 0x00b6d3, 0x8ffbaa,
+ /* a8 */ 0x00c9c5, 0x8ffbab, 0x000000, 0x00bce2,
+ /* ac */ 0x00cfa3, 0x000000, 0x00eefe, 0x00baf8,
+ /* b0 */ 0x000000, 0x000000, 0x00cfbf, 0x000000,
+ /* b4 */ 0x000000, 0x00efa6, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00efa5, 0x00efa7,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x062da ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00eefd, 0x000000, 0x000000, 0x8ffbae,
+ /* 88 */ 0x00fdb9, 0x00fdba, 0x00fdbb, 0x00c6e9,
+ /* 8c */ 0x000000, 0x00c5d5, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ffbaf, 0x000000, 0x000000,
+ /* 94 */ 0x00c4d7, 0x000000, 0x00efac, 0x8ffbb0,
+ /* 98 */ 0x000000, 0x000000, 0x8ffbb1, 0x00c3c3,
+ /* 9c */ 0x00efa8, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00efa9, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00fdbc, 0x00fdbd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00fdbe, 0x8ffbb2,
+ /* ac */ 0x00b7ad, 0x000000, 0x00efab, 0x000000,
+ /* b0 */ 0x00fdbf, 0x8ffbb3, 0x000000, 0x8ffbb4,
+ /* b4 */ 0x000000, 0x00b8b0, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00efaa, 0x000000, 0x00bee1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x06319 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8ffbb8, 0x000000, 0x000000, 0x8ffbb9,
+ /* 8c */ 0x00b3f9, 0x000000, 0x000000, 0x8ffbba,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00efb0, 0x000000, 0x00babf, 0x00c1f9,
+ /* 98 */ 0x000000, 0x000000, 0x00c4ca, 0x00fdc0,
+ /* 9c */ 0x000000, 0x000000, 0x8ffbbb, 0x000000,
+ /* a0 */ 0x000000, 0x8ffbb5, 0x000000, 0x00fdc1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00b3bb,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00efae, 0x00efaf, 0x00c4c3, 0x000000,
+ /* b0 */ 0x00efad, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00efb1, 0x00fdc2, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x06358 ***/
+
+ /* 80 */ 0x000000, 0x8ffbc0, 0x000000, 0x00efb7,
+ /* 84 */ 0x000000, 0x000000, 0x00fdc3, 0x8ffbc1,
+ /* 88 */ 0x00efba, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00efb9, 0x00c5ad, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00efb2, 0x00efb3,
+ /* 98 */ 0x00efb6, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ffbc2, 0x00efb8, 0x00fdc4, 0x00fdc5,
+ /* a0 */ 0x000000, 0x00b6c0, 0x8ffbc3, 0x000000,
+ /* a4 */ 0x00efbb, 0x00efb5, 0x000000, 0x8ffbc4,
+ /* a8 */ 0x00efb4, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ffbbf, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8ffbbc, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ffbc9,
+ /* bc */ 0x000000, 0x00fdc7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x06396 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00efbf,
+ /* 84 */ 0x00fdc6, 0x000000, 0x000000, 0x00efc0,
+ /* 88 */ 0x000000, 0x8ffbc5, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8ffbc6,
+ /* 90 */ 0x00efc1, 0x000000, 0x000000, 0x00efbe,
+ /* 94 */ 0x00efbd, 0x000000, 0x8ffbc7, 0x8ffbc8,
+ /* 98 */ 0x00bee2, 0x00c6aa, 0x00efbc, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00efc5, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00efc3,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffbca, 0x00fdc8,
+ /* b4 */ 0x8ffbcb, 0x00efc4, 0x00efc2, 0x000000,
+ /* b8 */ 0x00c2f8, 0x000000, 0x00efc6, 0x8ffbcc,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x063d5 ***/
+
+ /* 80 */ 0x000000, 0x00efc7, 0x000000, 0x000000,
+ /* 84 */ 0x00efc9, 0x8ffbcd, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00fdc9, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00b4d5, 0x00efc8, 0x00ccfa,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00efd4, 0x00efca,
+ /* 9c */ 0x000000, 0x000000, 0x00efcd, 0x000000,
+ /* a0 */ 0x00efcb, 0x000000, 0x00efcc, 0x00fdca,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00efce, 0x00fdcb,
+ /* ac */ 0x000000, 0x8ffbd0, 0x000000, 0x8ffbd1,
+ /* b0 */ 0x00efd0, 0x00fdcc, 0x00fdcd, 0x000000,
+ /* b4 */ 0x000000, 0x00efd1, 0x000000, 0x00efd2,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00efd5, 0x00efd3, 0x00efd6, 0x00efd8,
+
+ /*** Three byte table, leaf: e992xx - offset 0x06415 ***/
+
+ /* 80 */ 0x000000, 0x00efd7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x0641e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c4b9,
+ /* b8 */ 0x8ffbd2, 0x8ffbd3, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x0645e ***/
+
+ /* 80 */ 0x00cce7, 0x000000, 0x00efd9, 0x00c1ae,
+ /* 84 */ 0x000000, 0x000000, 0x8ffbd4, 0x00efda,
+ /* 88 */ 0x000000, 0x00cac4, 0x00efdb, 0x00b3ab,
+ /* 8c */ 0x8ffbd5, 0x8ffbd6, 0x00fdce, 0x00b1bc,
+ /* 90 */ 0x000000, 0x00b4d7, 0x000000, 0x00b4d6,
+ /* 94 */ 0x00efdc, 0x000000, 0x00efdd, 0x000000,
+ /* 98 */ 0x00efde, 0x00efdf, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00fdcf,
+ /* a0 */ 0x00efe0, 0x000000, 0x00b4d8, 0x00b3d5,
+ /* a4 */ 0x00b9de, 0x00c8b6, 0x00fdd0, 0x00efe2,
+ /* a8 */ 0x00efe1, 0x00fdd1, 0x000000, 0x8ffbd8,
+ /* ac */ 0x00fdd2, 0x00efe3, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b1dc, 0x000000,
+ /* b4 */ 0x8ffbd9, 0x000000, 0x00fdd3, 0x000000,
+ /* b8 */ 0x000000, 0x00efe6, 0x000000, 0x00efe5,
+ /* bc */ 0x00efe4, 0x00fdd4, 0x00efe7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x0649d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00efea,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00b0c7,
+ /* 88 */ 0x8ffbdb, 0x000000, 0x00efe8, 0x00fdd5,
+ /* 8c */ 0x00efec, 0x00efeb, 0x000000, 0x000000,
+ /* 90 */ 0x00fdd6, 0x000000, 0x000000, 0x00fdd7,
+ /* 94 */ 0x00efee, 0x00efed, 0x00efef, 0x000000,
+ /* 98 */ 0x00c6ae, 0x000000, 0x00fdd9, 0x000000,
+ /* 9c */ 0x00eff0, 0x000000, 0x00fdda, 0x000000,
+ /* a0 */ 0x000000, 0x00eff1, 0x00eff3, 0x000000,
+ /* a4 */ 0x000000, 0x00eff2,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x064c3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c9ec, 0x8ffaa5, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00eff4, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00eff5, 0x000000, 0x00bae5, 0x000000,
+ /* ac */ 0x8ffbde, 0x000000, 0x00eff6, 0x00eff7,
+ /* b0 */ 0x000000, 0x000000, 0x00cbc9, 0x8ffbdf,
+ /* b4 */ 0x8ffbe0, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00c1cb,
+ /* bc */ 0x8ffbe2, 0x000000, 0x000000, 0x00b0a4,
+
+ /*** Three byte table, leaf: e999xx - offset 0x06503 ***/
+
+ /* 80 */ 0x00c2cb, 0x8ffbe3, 0x00eff8, 0x000000,
+ /* 84 */ 0x00c9ed, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00effb,
+ /* 8c */ 0x00eff9, 0x00b9df, 0x000000, 0x00effa,
+ /* 90 */ 0x00b8c2, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00fddb, 0x000000, 0x000000, 0x00cac5,
+ /* 9c */ 0x00effd, 0x00f0a1, 0x00effe, 0x00f0a2,
+ /* a0 */ 0x000000, 0x8ffbe4, 0x00b1a1, 0x00bfd8,
+ /* a4 */ 0x00bdfc, 0x00b4d9, 0x00f0a3, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00c7e6, 0x000000,
+ /* ac */ 0x00f0a5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00b1a2, 0x000000, 0x00f0a4, 0x00c4c4,
+ /* b4 */ 0x000000, 0x00cecd, 0x00c6ab, 0x00effc,
+ /* b8 */ 0x00cea6, 0x000000, 0x00b8b1, 0x000000,
+ /* bc */ 0x000000, 0x00cddb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x06541 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffbe6, 0x000000,
+ /* 84 */ 0x00fddc, 0x00b6f9, 0x00ceb4, 0x000000,
+ /* 88 */ 0x00b7a8, 0x000000, 0x00c2e2, 0x00e7a1,
+ /* 8c */ 0x000000, 0x00f0a6, 0x00b3ac, 0x00bfef,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00b3d6, 0x00f0a8, 0x000000, 0x00f0a9,
+ /* 98 */ 0x00f0a7, 0x00b7e4, 0x8ffbe8, 0x00badd,
+ /* 9c */ 0x00bee3, 0x00fdde, 0x000000, 0x000000,
+ /* a0 */ 0x00b1a3, 0x000000, 0x000000, 0x00ced9,
+ /* a4 */ 0x00fddf, 0x00fde0, 0x000000, 0x00f0ab,
+ /* a8 */ 0x00eeae, 0x8ffbeb, 0x00f0aa, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ffbec,
+ /* b0 */ 0x00f0ae, 0x00f0ac, 0x00f0ad, 0x8ffbed,
+ /* b4 */ 0x00f0af, 0x000000, 0x00f0b0, 0x00ceec,
+ /* b8 */ 0x00f0b1, 0x00f0b2, 0x8ffbee, 0x00c0c9,
+ /* bc */ 0x00c8bb, 0x8ffbef, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x06581 ***/
+
+ /* 80 */ 0x00bffd, 0x00b4e7, 0x000000, 0x000000,
+ /* 84 */ 0x00cdba, 0x00b2ed, 0x00bdb8, 0x00b8db,
+ /* 88 */ 0x000000, 0x00f0b5, 0x000000, 0x00f0b4,
+ /* 8c */ 0x00bbf3, 0x00f0b6, 0x00f0b3, 0x000000,
+ /* 90 */ 0x000000, 0x00bba8, 0x00fde1, 0x000000,
+ /* 94 */ 0x000000, 0x00f0ba, 0x00eaad, 0x000000,
+ /* 98 */ 0x8ffbf2, 0x00d2d6, 0x8ffbf3, 0x00bff7,
+ /* 9c */ 0x00f0b8, 0x8ffbf4, 0x00fde2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00cea5, 0x00c6f1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b1ab, 0x00fde4, 0x00c0e3, 0x00bcb6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00fde5,
+ /* b0 */ 0x00cab7, 0x000000, 0x00b1c0, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00ceed, 0x00cdeb,
+ /* b8 */ 0x000000, 0x00f0bb, 0x000000, 0x00c5c5,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x065c1 ***/
+
+ /* 80 */ 0x00bcfb, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00f0bc, 0x000000, 0x00f0bd, 0x00bfcc,
+ /* 88 */ 0x00f0be, 0x000000, 0x00ceee, 0x000000,
+ /* 8c */ 0x000000, 0x00f0b9, 0x00f0c0, 0x00f0c2,
+ /* 90 */ 0x000000, 0x00f0c1, 0x000000, 0x00f0bf,
+ /* 94 */ 0x8ffbf6, 0x000000, 0x00f0c3, 0x000000,
+ /* 98 */ 0x000000, 0x00f0c4, 0x000000, 0x000000,
+ /* 9c */ 0x00c1fa, 0x000000, 0x00b2e2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ffbf7,
+ /* a4 */ 0x00f0c5, 0x000000, 0x000000, 0x00ccb8,
+ /* a8 */ 0x000000, 0x000000, 0x00f0c6, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f0c7, 0x000000, 0x00cfaa, 0x00fde6,
+ /* b4 */ 0x000000, 0x000000, 0x8ffbf9, 0x000000,
+ /* b8 */ 0x00dbb1, 0x00f0c8, 0x000000, 0x00fde7,
+ /* bc */ 0x000000, 0x00f0c9, 0x00f0ca,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x06600 ***/
+
+ /* 80 */ 0x000000, 0x8ffbfa, 0x00f0ce, 0x000000,
+ /* 84 */ 0x00f0cb, 0x000000, 0x00f0cc, 0x8ffbfb,
+ /* 88 */ 0x00f0cd, 0x00f0cf, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00fde8, 0x00fde9, 0x00fdea,
+ /* 90 */ 0x000000, 0x000000, 0x00c0c4, 0x000000,
+ /* 94 */ 0x000000, 0x8ffbfc, 0x00ccf7, 0x8ffbfd,
+ /* 98 */ 0x000000, 0x00c0c5, 0x00fdeb, 0x8ffbfe,
+ /* 9c */ 0x00f0d0, 0x000000, 0x00c8f3, 0x000000,
+ /* a0 */ 0x00f0d1, 0x00f3d3, 0x00cccc, 0x000000,
+ /* a4 */ 0x00f0d2, 0x000000, 0x00f0d3, 0x000000,
+ /* a8 */ 0x00f0d4, 0x00b3d7, 0x8ffca1, 0x00f0d6,
+ /* ac */ 0x000000, 0x00bfd9, 0x00fdec, 0x000000,
+ /* b0 */ 0x000000, 0x00f0d7, 0x000000, 0x00fded,
+ /* b4 */ 0x00b7a4, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00f0d8, 0x00f0dc, 0x000000,
+ /* bc */ 0x00f0da, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x0663f ***/
+
+ /* 80 */ 0x000000, 0x00f0db, 0x000000, 0x000000,
+ /* 84 */ 0x00b3f3, 0x00f0d9, 0x00f0dd, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00f0de,
+ /* 8c */ 0x000000, 0x00b0c8, 0x000000, 0x00f0df,
+ /* 90 */ 0x00f0e0, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00fdee, 0x8ffca4, 0x000000,
+ /* 98 */ 0x00bee4, 0x000000, 0x8ffca5, 0x000000,
+ /* 9c */ 0x00f0e1, 0x000000, 0x8ffca6, 0x000000,
+ /* a0 */ 0x00b5c7, 0x000000, 0x8ffca7, 0x00f0e4,
+ /* a4 */ 0x000000, 0x000000, 0x00f0e3, 0x000000,
+ /* a8 */ 0x00f0e2, 0x000000, 0x000000, 0x00ebf1,
+ /* ac */ 0x000000, 0x00cadc, 0x00fdef, 0x000000,
+ /* b0 */ 0x000000, 0x8ffca8, 0x8ffca9, 0x00f0e5,
+ /* b4 */ 0x00f0e6, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00fdf0, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ffcaa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x0667e ***/
+
+ /* 80 */ 0x000000, 0x00fdf1, 0x000000, 0x00f0e7,
+ /* 84 */ 0x000000, 0x000000, 0x00f0e8, 0x000000,
+ /* 88 */ 0x00f0e9, 0x00fdf2, 0x000000, 0x00f0ea,
+ /* 8c */ 0x8ffcab, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ffcac, 0x000000, 0x00b4da,
+ /* 94 */ 0x8ffcad, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ffcae, 0x8ffcaf, 0x000000, 0x00fdf4,
+ /* 9c */ 0x00f0eb, 0x000000, 0x00fdf3, 0x000000,
+ /* a0 */ 0x000000, 0x8ffcb0, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f0ec, 0x00c7a3, 0x000000,
+ /* b0 */ 0x000000, 0x8ffcb1, 0x00f0ee, 0x00b2bb,
+ /* b4 */ 0x00fdf5, 0x00f0f1, 0x00f0f0, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b1a4,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00b6c1,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x066be ***/
+
+ /* 80 */ 0x000000, 0x00cac7, 0x00c4ba, 0x00baa2,
+ /* 84 */ 0x8ffcb2, 0x00b9e0, 0x00bde7, 0x000000,
+ /* 88 */ 0x00bfdc, 0x000000, 0x00fdf7, 0x000000,
+ /* 8c */ 0x00f0f3, 0x8ffcb3, 0x8ffcb4, 0x00f0f2,
+ /* 90 */ 0x00cdc2, 0x00b4e8, 0x00c8d2, 0x00c6dc,
+ /* 94 */ 0x8ffcb5, 0x000000, 0x8ffcb6, 0x00bffc,
+ /* 98 */ 0x00cece, 0x000000, 0x00b7db, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00fdf8, 0x000000,
+ /* a0 */ 0x000000, 0x00f0f6, 0x000000, 0x8ffcb9,
+ /* a4 */ 0x00f0f5, 0x8ffcbc, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00fdf9,
+ /* ac */ 0x00cbcb, 0x00c6ac, 0x000000, 0x000000,
+ /* b0 */ 0x00fdfa, 0x000000, 0x8ffcba, 0x8ffcbb,
+ /* b4 */ 0x00b1d0, 0x000000, 0x000000, 0x00f0f7,
+ /* b8 */ 0x00f0f4, 0x000000, 0x000000, 0x00c9d1,
+ /* bc */ 0x00cdea, 0x00f0f8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x066fc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00f0f9, 0x8ffcbd,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00f0fb,
+ /* 8c */ 0x00c2ea, 0x00b3db, 0x00b3dc, 0x00f0fa,
+ /* 90 */ 0x000000, 0x000000, 0x00fdfc, 0x00fdfd,
+ /* 94 */ 0x00b4e9, 0x00b8b2, 0x00fdfe, 0x00fea1,
+ /* 98 */ 0x00b4ea, 0x00fea2, 0x00fea3, 0x00c5bf,
+ /* 9c */ 0x000000, 0x000000, 0x00cee0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00fea5, 0x8ffcbe, 0x00b8dc,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00f0fc,
+ /* ac */ 0x00fea6, 0x000000, 0x000000, 0x00f0fd,
+ /* b0 */ 0x00f0fe, 0x00f1a1, 0x000000, 0x00f1a3,
+ /* b4 */ 0x00f1a2,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x06731 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c9f7, 0x000000, 0x00f1a4, 0x8ffcbf,
+ /* ac */ 0x000000, 0x8ffcc0, 0x000000, 0x00f1a5,
+ /* b0 */ 0x8ffcc1, 0x00f1a6, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00f1a7, 0x8ffcc3,
+ /* b8 */ 0x8ffcc4, 0x000000, 0x00fea7, 0x8ffcc5,
+ /* bc */ 0x8ffcc6, 0x000000, 0x000000, 0x8ffcc7,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x06771 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffcc8, 0x00f1a9,
+ /* 84 */ 0x00f1a8, 0x000000, 0x00f1aa, 0x8ffcc9,
+ /* 88 */ 0x00fea8, 0x000000, 0x000000, 0x8ffcca,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00c8f4,
+ /* 9c */ 0x00e6cc, 0x000000, 0x000000, 0x00bfa9,
+ /* a0 */ 0x8ffccb, 0x8ffccd, 0x00b5b2, 0x8ffcce,
+ /* a4 */ 0x000000, 0x8ffccf, 0x000000, 0x00fea9,
+ /* a8 */ 0x000000, 0x00f1ab, 0x8ffcd0, 0x00f1ac,
+ /* ac */ 0x000000, 0x00d2ac, 0x00ddbb, 0x00c8d3,
+ /* b0 */ 0x8ffcd1, 0x8ffcd2, 0x00b0fb, 0x8ffcd3,
+ /* b4 */ 0x00b0bb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bbf4, 0x00cbb0, 0x00befe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x067b0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00f1ad,
+ /* 84 */ 0x000000, 0x00ccdf, 0x000000, 0x000000,
+ /* 88 */ 0x8ffcd4, 0x00f1ae, 0x00cddc, 0x000000,
+ /* 8c */ 0x00b1c2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bbc1, 0x000000, 0x00f1af, 0x00b2ee,
+ /* 94 */ 0x00f1b0, 0x000000, 0x8ffcd7, 0x8ffcd8,
+ /* 98 */ 0x00f1b1, 0x000000, 0x8ffcda, 0x8ffcdb,
+ /* 9c */ 0x8ffcdc, 0x00f1b3, 0x00f1b4, 0x000000,
+ /* a0 */ 0x00f1b6, 0x00f1b2, 0x000000, 0x000000,
+ /* a4 */ 0x00f1b5, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b4db, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00f1b7, 0x000000, 0x00f1b8, 0x000000,
+ /* b0 */ 0x000000, 0x8ffcde, 0x8ffcdf, 0x8ffce0,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ffce1, 0x8ffce2,
+ /* bc */ 0x8ffce3, 0x00f1b9, 0x00f1ba, 0x000000,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x067f0 ***/
+
+ /* 80 */ 0x8ffce4, 0x8ffce5, 0x00f1bb, 0x000000,
+ /* 84 */ 0x000000, 0x00f1bd, 0x8ffce6, 0x000000,
+ /* 88 */ 0x000000, 0x00f1bc, 0x000000, 0x00f1bf,
+ /* 8c */ 0x00f1c2, 0x8ffce7, 0x8ffce8, 0x000000,
+ /* 90 */ 0x00f1be, 0x00f1c0, 0x00f1c1, 0x000000,
+ /* 94 */ 0x000000, 0x00f1c3, 0x000000, 0x00b6c2,
+ /* 98 */ 0x00feaa, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ffce9, 0x000000, 0x000000, 0x8ffcea,
+ /* a0 */ 0x8ffceb, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x0681a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00bcf3, 0x00f1c4,
+ /* 98 */ 0x00f1c5, 0x00b9e1, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00feab, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ffcec,
+ /* a4 */ 0x000000, 0x00f1c6, 0x8ffced, 0x000000,
+ /* a8 */ 0x00b3be, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c7cf, 0x00f1c7, 0x00f1c8, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00c3da,
+ /* b4 */ 0x00c6eb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ffcee, 0x000000, 0x000000,
+ /* bc */ 0x00f1c9, 0x8ffcef, 0x000000, 0x8ffcf0,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x0685a ***/
+
+ /* 80 */ 0x000000, 0x00c7fd, 0x000000, 0x8ffcf1,
+ /* 84 */ 0x00c2cc, 0x00b1d8, 0x00b6ee, 0x000000,
+ /* 88 */ 0x00b6ef, 0x8ffcf2, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00c3f3, 0x00f1ce, 0x00b6f0, 0x000000,
+ /* 94 */ 0x8ffcf3, 0x00b2ef, 0x000000, 0x000000,
+ /* 98 */ 0x00f1cd, 0x8ffcf4, 0x000000, 0x00f1cb,
+ /* 9c */ 0x000000, 0x00f1cc, 0x8ffcf5, 0x00f1ca,
+ /* a0 */ 0x000000, 0x000000, 0x00f1d8, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f1cf, 0x00f1d0, 0x000000,
+ /* b0 */ 0x8ffcf7, 0x00f1d1, 0x00f1d2, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00f1d4, 0x8ffcf8, 0x000000, 0x00f1d3,
+ /* bc */ 0x8ffcf9, 0x000000, 0x000000, 0x00bdd9,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x0689a ***/
+
+ /* 80 */ 0x000000, 0x00f1d5, 0x00feac, 0x00fead,
+ /* 84 */ 0x000000, 0x00f1d7, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ffcfa, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00b5b3, 0x00f1d6,
+ /* 90 */ 0x000000, 0x8ffcfb, 0x00c1fb, 0x00b8b3,
+ /* 94 */ 0x000000, 0x000000, 0x8ffcfc, 0x000000,
+ /* 98 */ 0x000000, 0x00f1d9, 0x8ffcfd, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ffcfe, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00feae, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c2cd, 0x000000, 0x000000, 0x00f1da,
+ /* ac */ 0x000000, 0x00feaf, 0x00feb0, 0x000000,
+ /* b0 */ 0x00c6ad, 0x8ffda1, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ffda2, 0x00f1db,
+ /* b8 */ 0x00feb1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00f1e0, 0x000000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x068da ***/
+
+ /* 80 */ 0x00f1de, 0x000000, 0x00f1dd, 0x00f1df,
+ /* 84 */ 0x8ffda3, 0x00f1dc, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00feb2, 0x000000,
+ /* 8c */ 0x8ffda4, 0x00f1e2, 0x00feb3, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00feb4, 0x000000,
+ /* 94 */ 0x000000, 0x00f1e1, 0x000000, 0x00f1e4,
+ /* 98 */ 0x8ffda5, 0x000000, 0x00b6c3, 0x00f1e3,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00f1e5,
+ /* a0 */ 0x000000, 0x000000, 0x00f1e6, 0x000000,
+ /* a4 */ 0x00f1e8, 0x00f1e7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f1e9, 0x00f1eb, 0x00f1ea,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x06906 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b9fc, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f1ec, 0x000000, 0x8ffda7,
+ /* b0 */ 0x00f1ed, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00feb5, 0x8ffda9,
+ /* b8 */ 0x00b3bc, 0x8ffdab, 0x000000, 0x000000,
+ /* bc */ 0x00f1ee, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x06946 ***/
+
+ /* 80 */ 0x00f1ef, 0x00feb6, 0x000000, 0x00feb7,
+ /* 84 */ 0x00bff1, 0x000000, 0x8ffdad, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00feb8, 0x00f1f0,
+ /* 90 */ 0x8ffdae, 0x00f1f1, 0x8ffdaf, 0x00f1f2,
+ /* 94 */ 0x00f1f3, 0x8ffdb0, 0x00feb9, 0x000000,
+ /* 98 */ 0x00b9e2, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ffdb2, 0x000000, 0x00f1f4, 0x00f1f5,
+ /* a0 */ 0x8ffdb3, 0x000000, 0x00f1f6, 0x00f1f7,
+ /* a4 */ 0x000000, 0x8ffdb4, 0x00f1f8, 0x000000,
+ /* a8 */ 0x000000, 0x8ffdb5, 0x00c8b1, 0x00f1fa,
+ /* ac */ 0x000000, 0x00c9a6, 0x00f1fb, 0x00f1f9,
+ /* b0 */ 0x000000, 0x00f1fd, 0x000000, 0x000000,
+ /* b4 */ 0x00f1fc, 0x000000, 0x000000, 0x00f1fe,
+ /* b8 */ 0x000000, 0x00feba, 0x000000, 0x00f2a1,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x06984 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00febb, 0x8ffdb6,
+ /* 84 */ 0x000000, 0x000000, 0x00f2a2, 0x000000,
+ /* 88 */ 0x00febc, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ffdb7, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ffdb8, 0x000000, 0x8ffdb9, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ffdba, 0x000000,
+ /* 98 */ 0x00f2a3, 0x000000, 0x00f2a4, 0x000000,
+ /* 9c */ 0x8ffdbb, 0x000000, 0x000000, 0x00f2a5,
+ /* a0 */ 0x00febd, 0x000000, 0x00f2a6, 0x00f2a7,
+ /* a4 */ 0x000000, 0x00f2a8, 0x000000, 0x00f2a9,
+ /* a8 */ 0x00f2aa, 0x00f2ab, 0x00f2ac, 0x8ffdbc,
+ /* ac */ 0x000000, 0x00febf, 0x00f2ad, 0x00f2ae,
+ /* b0 */ 0x000000, 0x00ddb5, 0x00f2af, 0x8ffdbd,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00e4f8,
+ /* bc */ 0x00b5b4, 0x8ffdbe, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x069c3 ***/
+
+ /* 80 */ 0x000000, 0x00b3a1, 0x00bab2, 0x00f2b1,
+ /* 84 */ 0x00f2b0, 0x00cca5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8ffdc0,
+ /* 8c */ 0x000000, 0x00f2b3, 0x00f2b4, 0x00f2b2,
+ /* 90 */ 0x000000, 0x00f2b5, 0x000000, 0x000000,
+ /* 94 */ 0x00cbe2, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00f2b6, 0x000000, 0x00b5fb, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00fec0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ffdc1,
+ /* a4 */ 0x000000, 0x8ffdc2, 0x00fec2, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ffdc3,
+ /* ac */ 0x8ffdc4, 0x000000, 0x000000, 0x00cfa5,
+ /* b0 */ 0x000000, 0x000000, 0x00fec3, 0x8ffdc5,
+ /* b4 */ 0x00f2b7, 0x00fec4, 0x8ffdc6, 0x8ffdc7,
+ /* b8 */ 0x000000, 0x00fec1, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x06a00 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00f2b9,
+ /* 84 */ 0x00fec5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00fec6, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00b0be, 0x00fec7,
+ /* 90 */ 0x000000, 0x00f2ba, 0x00caab, 0x00f2b8,
+ /* 94 */ 0x000000, 0x000000, 0x00f2bb, 0x00f2bc,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00fec8, 0x00f2bd,
+ /* a0 */ 0x00f2be, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8ffdc8, 0x00fec9,
+ /* a8 */ 0x00f2bf, 0x000000, 0x00cbee, 0x00bbad,
+ /* ac */ 0x8ffdc9, 0x00bafa, 0x00c1af, 0x000000,
+ /* b0 */ 0x000000, 0x8ffdca, 0x8ffdcd, 0x000000,
+ /* b4 */ 0x00f2c0, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ffdce, 0x00f2c3, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ffdcf, 0x000000,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x06a40 ***/
+
+ /* 80 */ 0x00f2c1, 0x00feca, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00f2c4, 0x8ffdd0,
+ /* 88 */ 0x000000, 0x00b8f1, 0x00f2c2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00fecb, 0x00f2c5,
+ /* 90 */ 0x000000, 0x00f2c6, 0x00f2c7, 0x000000,
+ /* 94 */ 0x00f2cb, 0x000000, 0x00bbaa, 0x000000,
+ /* 98 */ 0x8ffdd2, 0x000000, 0x000000, 0x00c2e4,
+ /* 9c */ 0x000000, 0x8ffdd3, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00f2cc, 0x00f2c9, 0x00f2c8,
+ /* a4 */ 0x00f2ca, 0x00fecc, 0x000000, 0x8ffdd4,
+ /* a8 */ 0x00b7df, 0x000000, 0x8ffdd5, 0x8ffdd6,
+ /* ac */ 0x000000, 0x000000, 0x8ffdd8, 0x8ffdd7,
+ /* b0 */ 0x00f2d0, 0x00f2cf, 0x00f2ce, 0x8ffdd1,
+ /* b4 */ 0x000000, 0x00b0b3, 0x000000, 0x8ffddc,
+ /* b8 */ 0x00fecd, 0x000000, 0x8ffdda, 0x000000,
+ /* bc */ 0x000000, 0x00fece, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x06a80 ***/
+
+ /* 80 */ 0x00fecf, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00f2da, 0x000000, 0x00f2d6, 0x000000,
+ /* 88 */ 0x00f2d7, 0x00f2d3, 0x00f2d9, 0x000000,
+ /* 8c */ 0x00f2d5, 0x00b3e2, 0x000000, 0x000000,
+ /* 90 */ 0x00cfcc, 0x000000, 0x00f2d8, 0x00f2d4,
+ /* 94 */ 0x00f2d2, 0x00f2d1, 0x8ffdde, 0x000000,
+ /* 98 */ 0x8ffddf, 0x8ffde0, 0x8ffde1, 0x00f2dc,
+ /* 9c */ 0x000000, 0x8ffde2, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00f2df, 0x8ffde3, 0x00fed0,
+ /* a4 */ 0x00f2de, 0x00f2dd, 0x000000, 0x8ffde4,
+ /* a8 */ 0x000000, 0x8ffde5, 0x8ffde6, 0x000000,
+ /* ac */ 0x000000, 0x00c9c9, 0x00f2db, 0x00b0f3,
+ /* b0 */ 0x00f2e0, 0x8ffde8, 0x00f2e2, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ffde9, 0x8ffdea,
+ /* b8 */ 0x000000, 0x00b3ef, 0x00f2cd, 0x00b1b7,
+ /* bc */ 0x000000, 0x000000, 0x00f2e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x06abf ***/
+
+ /* 80 */ 0x000000, 0x00fed1, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ffdeb, 0x00f2e3, 0x00f2e1,
+ /* 88 */ 0x00c3ad, 0x8ffdee, 0x8ffdef, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00fed2,
+ /* 90 */ 0x00fed3, 0x000000, 0x00cbf0, 0x00fed4,
+ /* 94 */ 0x8ffdf1, 0x000000, 0x000000, 0x00ceda,
+ /* 98 */ 0x8ffdf2, 0x000000, 0x00f2e5, 0x8ffdf3,
+ /* 9c */ 0x8ffdec, 0x8ffdf4, 0x000000, 0x8ffdf5,
+ /* a0 */ 0x00f2e6, 0x000000, 0x000000, 0x00fed5,
+ /* a4 */ 0x000000, 0x00fed6, 0x000000, 0x00f2e7,
+ /* a8 */ 0x000000, 0x8ffdf6, 0x8ffdf7, 0x8ffdf8,
+ /* ac */ 0x000000, 0x8ffdf9, 0x8ffdfa, 0x000000,
+ /* b0 */ 0x8ffdfb, 0x000000, 0x8ffdfc, 0x000000,
+ /* b4 */ 0x000000, 0x8ffdfd, 0x00f2e8, 0x00fed7,
+ /* b8 */ 0x00f2e9, 0x000000, 0x8ffdfe,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x06afa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c4bb, 0x8ffea1, 0x00f2ea,
+ /* a8 */ 0x000000, 0x00c8b7, 0x000000, 0x00f2ef,
+ /* ac */ 0x00f2eb, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f2ec, 0x000000, 0x8ffea2, 0x00cbb1,
+ /* b4 */ 0x00ccc4, 0x000000, 0x00c6d0, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x06b38 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffea4, 0x00f2f0,
+ /* 84 */ 0x000000, 0x000000, 0x00f2f1, 0x00c6be,
+ /* 88 */ 0x00f2ee, 0x00f2ed, 0x000000, 0x8ffea3,
+ /* 8c */ 0x000000, 0x000000, 0x00b2aa, 0x000000,
+ /* 90 */ 0x000000, 0x8ffea6, 0x00f2f9, 0x000000,
+ /* 94 */ 0x000000, 0x00f2f8, 0x000000, 0x8ffea7,
+ /* 98 */ 0x8ffea8, 0x000000, 0x000000, 0x00b1f5,
+ /* 9c */ 0x000000, 0x00fed8, 0x00fed9, 0x00f2f6,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00f2f5,
+ /* a4 */ 0x000000, 0x000000, 0x00f2f3, 0x000000,
+ /* a8 */ 0x00b3fb, 0x000000, 0x00f2f2, 0x00bcb2,
+ /* ac */ 0x00b2a9, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffeac, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b9e3,
+ /* bc */ 0x000000, 0x000000, 0x00f2fc, 0x00f2fb,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x06b78 ***/
+
+ /* 80 */ 0x000000, 0x00f2fa, 0x8ffeae, 0x00feda,
+ /* 84 */ 0x00f2f7, 0x000000, 0x00f2fd, 0x00fedb,
+ /* 88 */ 0x00f2fe, 0x000000, 0x8ffeaf, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00f3a5, 0x00f3a4, 0x00fedc, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00f3a6, 0x000000, 0x000000,
+ /* 9c */ 0x00b1ad, 0x00f3a1, 0x00f3a2, 0x8ffeb0,
+ /* a0 */ 0x00b9f4, 0x00ccb9, 0x8ffeb1, 0x00fedd,
+ /* a4 */ 0x00f3a3, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ffeb3, 0x000000, 0x8ffeb4,
+ /* ac */ 0x00cbb2, 0x000000, 0x000000, 0x00f3ab,
+ /* b0 */ 0x00fede, 0x000000, 0x00f3a7, 0x8ffeb6,
+ /* b4 */ 0x000000, 0x000000, 0x8ffeb7, 0x8ffeb8,
+ /* b8 */ 0x000000, 0x000000, 0x00f3ac, 0x000000,
+ /* bc */ 0x00fedf, 0x000000, 0x8ffeb9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x06bb7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8ffeba, 0x000000, 0x000000, 0x00f3a9,
+ /* 88 */ 0x000000, 0x00f3a8, 0x00fee0, 0x000000,
+ /* 8c */ 0x000000, 0x8ffebb, 0x000000, 0x00b7dc,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00fee1, 0x000000,
+ /* 98 */ 0x000000, 0x8ffebc, 0x00f3ad, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8ffebd, 0x000000, 0x000000,
+ /* a4 */ 0x00f3ae, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f3af, 0x000000, 0x00f3aa,
+ /* ac */ 0x00fee3, 0x000000, 0x000000, 0x00f2f4,
+ /* b0 */ 0x000000, 0x000000, 0x00f3b0, 0x000000,
+ /* b4 */ 0x00c4e1, 0x8ffebf, 0x000000, 0x000000,
+ /* b8 */ 0x00f3b4, 0x8ffec0, 0x00f3b5, 0x00f3b3,
+ /* bc */ 0x00fee4, 0x8ffec1, 0x000000, 0x8ffebe,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x06bf7 ***/
+
+ /* 80 */ 0x00fee2, 0x00f3b2, 0x00f3b8, 0x8ffec2,
+ /* 84 */ 0x00f3b1, 0x000000, 0x00f3b6, 0x8ffec3,
+ /* 88 */ 0x000000, 0x8ffec4, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00f3b7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00f3ba,
+ /* 94 */ 0x000000, 0x000000, 0x8ffec5, 0x00fee5,
+ /* 98 */ 0x000000, 0x00f3b9, 0x8ffec6, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8ffec7,
+ /* a0 */ 0x8ffec8, 0x000000, 0x000000, 0x8ffec9,
+ /* a4 */ 0x000000, 0x000000, 0x00f3bc, 0x00fee7,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f3bd, 0x000000, 0x00f3be,
+ /* b0 */ 0x000000, 0x000000, 0x00cfc9, 0x000000,
+ /* b4 */ 0x8ffeca, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00f3bb, 0x00c2eb, 0x00baed, 0x000000,
+ /* bc */ 0x000000, 0x00f3bf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x06c35 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffecd, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00fee8,
+ /* 88 */ 0x000000, 0x000000, 0x8ffecc, 0x000000,
+ /* 8c */ 0x000000, 0x8ffece, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00fee9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ffecf, 0x00f3c0, 0x00f3c1,
+ /* 9c */ 0x8ffed0, 0x8ffed1, 0x00f3c2,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x06c54 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00f3c3, 0x000000, 0x000000,
+ /* b8 */ 0x00b8b4, 0x00f3c4, 0x000000, 0x8ffed2,
+ /* bc */ 0x00feea, 0x00f3c5, 0x000000, 0x00bcaf,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x06c94 ***/
+
+ /* 80 */ 0x8ffed4, 0x00f3c6, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ffed5, 0x000000, 0x000000,
+ /* 88 */ 0x00f3c7, 0x000000, 0x000000, 0x00f3c8,
+ /* 8c */ 0x00f3c9, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00f3cc, 0x00f3ca, 0x00cfbc,
+ /* 94 */ 0x000000, 0x00f3cb, 0x000000, 0x00ceef,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8ffed6,
+ /* 9c */ 0x000000, 0x00f3cd, 0x00feeb, 0x00cedb,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00feec, 0x00f3ce, 0x00c7fe, 0x000000,
+ /* a8 */ 0x8ffed7, 0x00f3cf, 0x00f3d1, 0x000000,
+ /* ac */ 0x00feed, 0x00f3d2, 0x000000, 0x00feee,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00feef, 0x00fef0, 0x000000, 0x000000,
+ /* b8 */ 0x00f3d0, 0x00b9ed, 0x00cccd, 0x00cbe3,
+ /* bc */ 0x00d6f7, 0x8ffed9, 0x00dde0, 0x00cbfb,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x06cd4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00fef1,
+ /* 84 */ 0x00b2ab, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00f3d4, 0x00b5d0, 0x00f3d5, 0x00f3d6,
+ /* 90 */ 0x00f3d7, 0x00fef2, 0x00b9f5, 0x000000,
+ /* 94 */ 0x00f3d8, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00e0d4, 0x00ccdb, 0x000000, 0x00c2e3,
+ /* 9c */ 0x00f3d9, 0x00f3db, 0x00f3da, 0x8ffedb,
+ /* a0 */ 0x00f3dc, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00f3dd, 0x000000, 0x8ffedc,
+ /* a8 */ 0x00f3de, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ffedd, 0x00f3df,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00f3e0, 0x000000, 0x00f3e1, 0x00f3e2,
+ /* b8 */ 0x000000, 0x00f3e3, 0x000000, 0x00f3e4,
+ /* bc */ 0x00f3e5, 0x00f3e6, 0x000000, 0x8ffede,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x06d14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffedf, 0x8ffee1,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00f3e7,
+ /* 88 */ 0x00f3e8, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00c5a4, 0x000000,
+ /* 90 */ 0x00fef3, 0x000000, 0x000000, 0x00b8dd,
+ /* 94 */ 0x000000, 0x00f3ea, 0x000000, 0x8ffee2,
+ /* 98 */ 0x000000, 0x8ffee3, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c1cd, 0x00f3eb, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00f3ec, 0x000000, 0x000000, 0x8ffee4,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ffee5,
+ /* b8 */ 0x000000, 0x00fef4, 0x8ffee6, 0x00c9a1,
+ /* bc */ 0x000000, 0x8ffee7, 0x00f3ed,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x06d53 ***/
+
+ /* 80 */ 0x000000, 0x8ffee8, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ffee9, 0x8ffeea, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00f3ee, 0x00e3b7,
+ /* 8c */ 0x000000, 0x000000, 0x00ecda, 0x00f0ed,
+ /* 90 */ 0x000000, 0x000000, 0x00f3ef, 0x8ffeeb,
+ /* 94 */ 0x00f3f0, 0x8ffeec, 0x000000, 0x00fef5,
+ /* 98 */ 0x8ffeed, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ffeef, 0x000000, 0x00f3f2,
+ /* a0 */ 0x00f3f3, 0x00f3f4, 0x00cef0, 0x00f3f1,
+ /* a4 */ 0x000000, 0x000000, 0x00f3f5, 0x00f3f6,
+ /* a8 */ 0x000000, 0x8ffef1, 0x00f3f8, 0x000000,
+ /* ac */ 0x00f3f7, 0x8ffef3, 0x000000, 0x000000,
+ /* b0 */ 0x8ffef4, 0x000000, 0x00f3fa, 0x000000,
+ /* b4 */ 0x000000, 0x8ffef5, 0x00f3fb, 0x00f3f9,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x06d8b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00ceb6, 0x000000, 0x000000,
+ /* 90 */ 0x00fef6, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00fef7, 0x00f3fc, 0x000000, 0x00fef8,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00f3fd, 0x00e3d4, 0x000000, 0x000000,
+ /* a0 */ 0x00f3fe, 0x000000, 0x00fef9,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x06dae ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00f6bb, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00f4ae, 0x00f5ce, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00fbcf,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa5xx - offset 0x06de5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f6c9,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa7xx - offset 0x06e16 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00fea4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00fddd, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x06e47 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00afcb,
+ /* 90 */ 0x00afd7, 0x00cff2, 0x000000, 0x8faef9,
+ /* 94 */ 0x00f5fa, 0x00f7da, 0x00f7ef, 0x000000,
+ /* 98 */ 0x000000, 0x00f9bc, 0x00f9bd, 0x00f9c1,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00fbba,
+ /* a0 */ 0x8ff7b8, 0x8ff7c5, 0x00fcae, 0x000000,
+ /* a4 */ 0x8ff9ee, 0x000000, 0x00fcea, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00aeb8, 0x00aec9, 0x00aed0, 0x00aee3,
+ /* b4 */ 0x00aee8, 0x00aeee, 0x00afac, 0x00afaf,
+ /* b8 */ 0x00afb6, 0x00afda, 0x00afde, 0x00cfe1,
+ /* bc */ 0x00cfe2, 0x00f4d0, 0x00f4dc, 0x00f4de,
+
+ /*** Three byte table, leaf: efa9xx - offset 0x06e87 ***/
+
+ /* 80 */ 0x00f4e1, 0x00f5a8, 0x00f5ab, 0x00f5c3,
+ /* 84 */ 0x00f5e5, 0x00f6e9, 0x00f6f7, 0x00f7a5,
+ /* 88 */ 0x00f7d5, 0x8ff0a9, 0x00f8a5, 0x00f9a7,
+ /* 8c */ 0x00f9b3, 0x00f9b4, 0x00f9b7, 0x00f9b8,
+ /* 90 */ 0x00f9b9, 0x00f9bb, 0x00f9bf, 0x00f9c0,
+ /* 94 */ 0x00f9cd, 0x00f9d1, 0x00f9e4, 0x00faae,
+ /* 98 */ 0x8ff4d0, 0x00fab3, 0x00faba, 0x00fac4,
+ /* 9c */ 0x00fad8, 0x8ff5f4, 0x8ff5f5, 0x00fba7,
+ /* a0 */ 0x00fbef, 0x00fbf9, 0x00fcaf, 0x00fcb0,
+ /* a4 */ 0x00fcb8, 0x00fcbd, 0x8ff9e9, 0x00fcd9,
+ /* a8 */ 0x00fde3, 0x00fdf6, 0x00fdfb, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb9xx - offset 0x06ec2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00a3be, 0x00a3bd, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x06f01 ***/
+
+ /* 80 */ 0x000000, 0x00a1aa, 0x00a2b0, 0x00a1f4,
+ /* 84 */ 0x00a1f0, 0x00a1f3, 0x00a1f5, 0x00a2af,
+ /* 88 */ 0x00a1ca, 0x00a1cb, 0x00a1f6, 0x00a1dc,
+ /* 8c */ 0x00a1a4, 0x00a2b1, 0x00a1a5, 0x00a1bf,
+ /* 90 */ 0x00a3b0, 0x00a3b1, 0x00a3b2, 0x00a3b3,
+ /* 94 */ 0x00a3b4, 0x00a3b5, 0x00a3b6, 0x00a3b7,
+ /* 98 */ 0x00a3b8, 0x00a3b9, 0x00a1a7, 0x00a1a8,
+ /* 9c */ 0x00a1e3, 0x00a1e1, 0x00a1e4, 0x00a1a9,
+ /* a0 */ 0x00a1f7, 0x00a3c1, 0x00a3c2, 0x00a3c3,
+ /* a4 */ 0x00a3c4, 0x00a3c5, 0x00a3c6, 0x00a3c7,
+ /* a8 */ 0x00a3c8, 0x00a3c9, 0x00a3ca, 0x00a3cb,
+ /* ac */ 0x00a3cc, 0x00a3cd, 0x00a3ce, 0x00a3cf,
+ /* b0 */ 0x00a3d0, 0x00a3d1, 0x00a3d2, 0x00a3d3,
+ /* b4 */ 0x00a3d4, 0x00a3d5, 0x00a3d6, 0x00a3d7,
+ /* b8 */ 0x00a3d8, 0x00a3d9, 0x00a3da, 0x00a1ce,
+ /* bc */ 0x00a1c0, 0x00a1cf, 0x00a1b0, 0x00a1b2,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x06f41 ***/
+
+ /* 80 */ 0x00a1ae, 0x00a3e1, 0x00a3e2, 0x00a3e3,
+ /* 84 */ 0x00a3e4, 0x00a3e5, 0x00a3e6, 0x00a3e7,
+ /* 88 */ 0x00a3e8, 0x00a3e9, 0x00a3ea, 0x00a3eb,
+ /* 8c */ 0x00a3ec, 0x00a3ed, 0x00a3ee, 0x00a3ef,
+ /* 90 */ 0x00a3f0, 0x00a3f1, 0x00a3f2, 0x00a3f3,
+ /* 94 */ 0x00a3f4, 0x00a3f5, 0x00a3f6, 0x00a3f7,
+ /* 98 */ 0x00a3f8, 0x00a3f9, 0x00a3fa, 0x00a1d0,
+ /* 9c */ 0x00a1c3, 0x00a1d1, 0x00a2b2, 0x00a2d6,
+ /* a0 */ 0x00a2d7, 0x008ea1, 0x008ea2, 0x008ea3,
+ /* a4 */ 0x008ea4, 0x008ea5, 0x008ea6, 0x008ea7,
+ /* a8 */ 0x008ea8, 0x008ea9, 0x008eaa, 0x008eab,
+ /* ac */ 0x008eac, 0x008ead, 0x008eae, 0x008eaf,
+ /* b0 */ 0x008eb0, 0x008eb1, 0x008eb2, 0x008eb3,
+ /* b4 */ 0x008eb4, 0x008eb5, 0x008eb6, 0x008eb7,
+ /* b8 */ 0x008eb8, 0x008eb9, 0x008eba, 0x008ebb,
+ /* bc */ 0x008ebc, 0x008ebd, 0x008ebe, 0x008ebf,
+
+ /*** Three byte table, leaf: efbexx - offset 0x06f81 ***/
+
+ /* 80 */ 0x008ec0, 0x008ec1, 0x008ec2, 0x008ec3,
+ /* 84 */ 0x008ec4, 0x008ec5, 0x008ec6, 0x008ec7,
+ /* 88 */ 0x008ec8, 0x008ec9, 0x008eca, 0x008ecb,
+ /* 8c */ 0x008ecc, 0x008ecd, 0x008ece, 0x008ecf,
+ /* 90 */ 0x008ed0, 0x008ed1, 0x008ed2, 0x008ed3,
+ /* 94 */ 0x008ed4, 0x008ed5, 0x008ed6, 0x008ed7,
+ /* 98 */ 0x008ed8, 0x008ed9, 0x008eda, 0x008edb,
+ /* 9c */ 0x008edc, 0x008edd, 0x008ede, 0x008edf,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Four byte table, byte #1: xx - offset 0x06fc1 ***/
+
+ /* f0 */ 0x006fc2,
+
+ /*** Four byte table, byte #2: f0xx - offset 0x06fc2 ***/
+
+ /* a0 */ 0x006fcd, 0x00700b, 0x00704b, 0x007085,
+ /* a4 */ 0x0070c3, 0x007102, 0x007142, 0x007182,
+ /* a8 */ 0x0071c1, 0x007201, 0x007241,
+
+ /*** Four byte table, byte #3: f0a0xx - offset 0x06fcd ***/
+
+ /* 80 */ 0x007276, 0x000000, 0x0072ad, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x0072d2, 0x000000,
+ /* 88 */ 0x0072ff, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x007314, 0x007340, 0x00737f, 0x007386,
+ /* 90 */ 0x000000, 0x0073c0, 0x000000, 0x000000,
+ /* 94 */ 0x0073f7, 0x000000, 0x000000, 0x007421,
+ /* 98 */ 0x007439, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00746a, 0x000000, 0x000000,
+ /* a0 */ 0x0074a3, 0x000000, 0x0074de, 0x000000,
+ /* a4 */ 0x000000, 0x007518, 0x007555, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x007582,
+ /* ac */ 0x0075a5, 0x000000, 0x0075c6, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x007601, 0x000000, 0x007620,
+ /* b8 */ 0x000000, 0x007642, 0x007670, 0x000000,
+ /* bc */ 0x000000, 0x007691,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a1xx - offset 0x0700b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x0076d0, 0x00770e, 0x000000, 0x00774a,
+ /* 8c */ 0x007788, 0x0077c4, 0x000000, 0x007800,
+ /* 90 */ 0x000000, 0x007813, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x007842,
+ /* 98 */ 0x000000, 0x00787b, 0x007887, 0x000000,
+ /* 9c */ 0x0078c1, 0x0078ff, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x007902, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x007940,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00796a, 0x000000, 0x000000,
+ /* b4 */ 0x007981, 0x0079bc, 0x0079f5, 0x007a2d,
+ /* b8 */ 0x007a4e, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x007a83, 0x007aa2, 0x000000, 0x007ad9,
+
+ /*** Four byte table, byte #3: f0a2xx - offset 0x0704b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x007b14, 0x000000, 0x000000,
+ /* 88 */ 0x007b50, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x007b72, 0x000000, 0x007b91, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x007bbf,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x007bf3, 0x007c0f, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x007c40, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x007c50, 0x000000,
+ /* ac */ 0x000000, 0x007c8a, 0x007ca4, 0x000000,
+ /* b0 */ 0x007ccb, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x007cf0,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a3xx - offset 0x07085 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x007d12, 0x007d4f,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x007d85, 0x000000, 0x007db8,
+ /* 90 */ 0x000000, 0x007dee, 0x000000, 0x007e14,
+ /* 94 */ 0x000000, 0x007e3a, 0x007e66, 0x007ea2,
+ /* 98 */ 0x007eaa, 0x007ee5, 0x000000, 0x000000,
+ /* 9c */ 0x007f19, 0x007f59, 0x000000, 0x007f7e,
+ /* a0 */ 0x007fbe, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x007ffc, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x008015, 0x000000, 0x008055,
+ /* b4 */ 0x008095, 0x0080d5, 0x000000, 0x008102,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00813d,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a4xx - offset 0x070c3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00817c, 0x000000,
+ /* 84 */ 0x0081b9, 0x000000, 0x000000, 0x0081f3,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x008232, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00826f, 0x000000, 0x008299, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x0082bf,
+ /* a0 */ 0x000000, 0x000000, 0x0082f1, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x008324, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00834e, 0x000000, 0x000000,
+ /* b0 */ 0x00837e, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x0083aa, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x0083dc, 0x008414, 0x008449, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a5xx - offset 0x07102 ***/
+
+ /* 80 */ 0x000000, 0x00847f, 0x000000, 0x000000,
+ /* 84 */ 0x00849d, 0x000000, 0x0084c0, 0x0084f3,
+ /* 88 */ 0x008519, 0x00854d, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00855f, 0x000000, 0x008591, 0x0085b8,
+ /* 94 */ 0x0085ea, 0x000000, 0x008603, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00862b, 0x00865d, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x008699,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x0086b6,
+ /* ac */ 0x000000, 0x000000, 0x0086e8, 0x000000,
+ /* b0 */ 0x000000, 0x00871d, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x008742, 0x000000,
+ /* b8 */ 0x008764, 0x008793, 0x000000, 0x0087d1,
+ /* bc */ 0x0087fa, 0x00881e, 0x000000, 0x00884a,
+
+ /*** Four byte table, byte #3: f0a6xx - offset 0x07142 ***/
+
+ /* 80 */ 0x008886, 0x0088a6, 0x000000, 0x0088c7,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x0088f5, 0x00892f, 0x000000,
+ /* 8c */ 0x000000, 0x008963, 0x000000, 0x000000,
+ /* 90 */ 0x0089a1, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x0089a4, 0x0089e3, 0x000000,
+ /* 9c */ 0x008a14, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x008a37,
+ /* a4 */ 0x000000, 0x008a66, 0x000000, 0x008a96,
+ /* a8 */ 0x008ab8, 0x008ae0, 0x008b14, 0x008b4c,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x008b8c, 0x008bb6, 0x000000, 0x008bea,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x008c2a, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x008c56, 0x008c6b,
+
+ /*** Four byte table, byte #3: f0a7xx - offset 0x07182 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x008ca4,
+ /* 84 */ 0x008cd9, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x008d13,
+ /* 90 */ 0x008d52, 0x008d89, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x008db5, 0x000000, 0x008df1, 0x000000,
+ /* 9c */ 0x008e23, 0x008e51, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x008e8c, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x008ec8, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x008ed5, 0x008f14,
+ /* b0 */ 0x000000, 0x000000, 0x008f1c, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x008f55, 0x000000,
+ /* b8 */ 0x008f85, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x008f96,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a8xx - offset 0x071c1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x008fce, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00900a, 0x009048, 0x009055,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x009089,
+ /* 90 */ 0x0090bd, 0x0090e8, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x0090fe, 0x000000, 0x009136,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00915f,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00919a, 0x0091d3, 0x000000,
+ /* a8 */ 0x00920f, 0x00924c, 0x00927e, 0x0092b1,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x0092f0,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x009320, 0x009331, 0x000000, 0x009363,
+ /* b8 */ 0x00939f, 0x000000, 0x0093d6, 0x0093eb,
+ /* bc */ 0x009417, 0x000000, 0x000000, 0x00944a,
+
+ /*** Four byte table, byte #3: f0a9xx - offset 0x07201 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x009483, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x0094b5, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x0094e6,
+ /* 98 */ 0x000000, 0x0094f6, 0x000000, 0x009536,
+ /* 9c */ 0x009567, 0x009597, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x0095d1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x0095df, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x009612,
+ /* b8 */ 0x00963d, 0x00967b, 0x0096b1, 0x0096ed,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00971f,
+
+ /*** Four byte table, byte #3: f0aaxx - offset 0x07241 ***/
+
+ /* 80 */ 0x009745, 0x000000, 0x009783, 0x00978a,
+ /* 84 */ 0x000000, 0x000000, 0x0097c4, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x0097f8, 0x000000,
+ /* 90 */ 0x009805, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00983d,
+ /* 98 */ 0x00987b, 0x000000, 0x0098bb, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a080xx - offset 0x07276 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00aea2,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a082xx - offset 0x072ad ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8fa1a1, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fa1ab, 0x000000,
+ /* a4 */ 0x8fa1ae,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a086xx - offset 0x072d2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fa1b6, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a088xx - offset 0x072ff ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8fa1c6,
+ /* 94 */ 0x000000,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08cxx - offset 0x07314 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fa1f0,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08dxx - offset 0x07340 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fa1f9, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08exx - offset 0x0737f ***/
+
+ /* 80 */ 0x000000, 0x8fa1f7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000,
+ /* 57 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08fxx - offset 0x07386 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fa3a2,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a091xx - offset 0x073c0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fa3a5, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a094xx - offset 0x073f7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8fa3a7, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a097xx - offset 0x07421 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fa3b1, 0x000000,
+ /* 40 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a098xx - offset 0x07439 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fa3b2, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a09dxx - offset 0x0746a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fa3b8,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a0xx - offset 0x074a3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fa3bf,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fa3c1,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a2xx - offset 0x074de ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fa3ca,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a5xx - offset 0x07518 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fa3d2,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a6xx - offset 0x07555 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fa3d3, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0abxx - offset 0x07582 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8fa3d9,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0acxx - offset 0x075a5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fa3dc, 0x000000, 0x000000,
+ /* a0 */ 0x000000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0aexx - offset 0x075c6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00cfd4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b5xx - offset 0x07601 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fa3f7, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b7xx - offset 0x07620 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa4aa,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b9xx - offset 0x07642 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fa4ba, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fa4b2,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0baxx - offset 0x07670 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fa4b1, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0bdxx - offset 0x07691 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fa4bd,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a188xx - offset 0x076d0 ***/
+
+ /* 80 */ 0x000000, 0x8fa4d9, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00afc2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a189xx - offset 0x0770e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fa4dc, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fa4e3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8fa4de,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18bxx - offset 0x0774a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fa4eb,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fa4ea, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fa4f2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18cxx - offset 0x07788 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00afcc,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fa4f4, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18dxx - offset 0x077c4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fa4f5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18fxx - offset 0x07800 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fa5a5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000,
+ /* 45 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a191xx - offset 0x07813 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fa5b2, 0x00afe0,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a197xx - offset 0x07842 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fa5be,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a199xx - offset 0x0787b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fa5c7,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 52 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19axx - offset 0x07887 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00cfe3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19cxx - offset 0x078c1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fa5d5, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19dxx - offset 0x078ff ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fa5d6,
+ /* 61 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1a2xx - offset 0x07902 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00affb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1a7xx - offset 0x07940 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fa5fe,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b1xx - offset 0x0796a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fa8b0,
+ /* 41 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b4xx - offset 0x07981 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fa8b7, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b5xx - offset 0x079bc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fa8b8, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fa8bb, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fa8ba,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b6xx - offset 0x079f5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fa8c5, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fa8c0, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa8bf, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fa8c8,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b7xx - offset 0x07a2d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fa8ca,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b8xx - offset 0x07a4e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fa8cb,
+ /* b4 */ 0x00cfee,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bcxx - offset 0x07a83 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fa8db,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bdxx - offset 0x07aa2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fa8e6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bfxx - offset 0x07ad9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fa8ec,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a285xx - offset 0x07b14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8faca2,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a288xx - offset 0x07b50 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ffed3, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a28cxx - offset 0x07b72 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8facab,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a28exx - offset 0x07b91 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8facb0,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a29bxx - offset 0x07bbf ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8facd0,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a1xx - offset 0x07bf3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8face5,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a2xx - offset 0x07c0f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8faced,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a6xx - offset 0x07c40 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8facf2,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2aaxx - offset 0x07c50 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fada4, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2adxx - offset 0x07c8a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fadb2, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fada9,
+ /* 90 */ 0x8fadaa, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000,
+ /* 38 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2aexx - offset 0x07ca4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fadb5,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2b0xx - offset 0x07ccb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fadb4, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fadb9,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2b7xx - offset 0x07cf0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fadd6,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a386xx - offset 0x07d12 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8faea4, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a387xx - offset 0x07d4f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fadfd,
+ /* 84 */ 0x00f5ba, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8faea3,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a38dxx - offset 0x07d85 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8faeba,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a38fxx - offset 0x07db8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8faec2, 0x000000, 0x8faebd, 0x8faebc,
+ /* 94 */ 0x000000, 0x8faec4, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8faec7, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8faec9,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8faec3, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a391xx - offset 0x07dee ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8faed5, 0x8faed7,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8faed6, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8faedb,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a393xx - offset 0x07e14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8faef7, 0x000000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a395xx - offset 0x07e3a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8faef8, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a396xx - offset 0x07e66 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fafaa, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a397xx - offset 0x07ea2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00f5f2, 0x000000, 0x000000, 0x000000,
+ /* 56 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a398xx - offset 0x07eaa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fafc2, 0x8fafbf, 0x8fafc3,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a399xx - offset 0x07ee5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fafc0,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a39cxx - offset 0x07f19 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fafd9, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fafce, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00f6a9,
+
+ /*** Four byte table, leaf: f0a39dxx - offset 0x07f59 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00f6b2,
+ /* a4 */ 0x8fafe1,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a39fxx - offset 0x07f7e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fafea,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fafe9,
+
+ /*** Four byte table, leaf: f0a3a0xx - offset 0x07fbe ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8faff0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8faff5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3aaxx - offset 0x07ffc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8feea3,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3b1xx - offset 0x08015 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8feeb4,
+
+ /*** Four byte table, leaf: f0a3b3xx - offset 0x08055 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00f6e0, 0x000000,
+
+ /*** Four byte table, leaf: f0a3b4xx - offset 0x08095 ***/
+
+ /* 80 */ 0x8feec9, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff4f5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: f0a3b5xx - offset 0x080d5 ***/
+
+ /* 80 */ 0x8feedc, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3b7xx - offset 0x08102 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8feee0,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8feedf, 0x8feede,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3bdxx - offset 0x0813d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fefb2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a482xx - offset 0x0817c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fefc7, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a484xx - offset 0x081b9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fefcd,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a487xx - offset 0x081f3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fefe1, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fefe4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a48exx - offset 0x08232 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8ff0a2,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a498xx - offset 0x0826f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff0b3,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a49axx - offset 0x08299 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff0b9,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a49fxx - offset 0x082bf ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00f7ec,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4a2xx - offset 0x082f1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff0d3, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4a9xx - offset 0x08324 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ff0fb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4adxx - offset 0x0834e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff1ae, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ff1b0,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b0xx - offset 0x0837e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff1b5, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b4xx - offset 0x083aa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff1c4, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b8xx - offset 0x083dc ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff1dd, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff1e1,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b9xx - offset 0x08414 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8ff1e6, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4baxx - offset 0x08449 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8ff1e9,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a581xx - offset 0x0847f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff1f5, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ff1f7, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000,
+ /* 34 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a584xx - offset 0x0849d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8ff1fa,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a586xx - offset 0x084c0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff2a1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a587xx - offset 0x084f3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ff2a4, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff2a3,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a588xx - offset 0x08519 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff2a8, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a589xx - offset 0x0854d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff2ac, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000,
+ /* 46 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a590xx - offset 0x0855f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff2bd, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a592xx - offset 0x08591 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00f8fe, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a593xx - offset 0x085b8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ff2c8, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a594xx - offset 0x085ea ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00f9a9, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a596xx - offset 0x08603 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8ff2db,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a59dxx - offset 0x0862b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00f9c7,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a59exx - offset 0x0865d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff2f5, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8ff2f6, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5a7xx - offset 0x08699 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00f9d4, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff3b2, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5abxx - offset 0x086b6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ff3be,
+ /* a4 */ 0x8ff3bd, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ff3c0,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5aexx - offset 0x086e8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ff3d2, 0x000000,
+ /* b4 */ 0x000000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b1xx - offset 0x0871d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8ff3dd,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8ff3de,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b6xx - offset 0x08742 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00f9ee,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b8xx - offset 0x08764 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8ff3f3,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b9xx - offset 0x08793 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8ff3f4, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8ff3f7, 0x000000,
+ /* a4 */ 0x000000, 0x8ff3f5, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bbxx - offset 0x087d1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ff3fd, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ff3fb, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8ff4a2,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bcxx - offset 0x087fa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ff4a4,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bdxx - offset 0x0881e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ff4a7, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bfxx - offset 0x0884a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff4af, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff4ae, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ff4b5,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a680xx - offset 0x08886 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff4b4, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ff4bd,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a681xx - offset 0x088a6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff4c2,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a683xx - offset 0x088c7 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8ff4cf,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a689xx - offset 0x088f5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff4e9, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a68axx - offset 0x0892f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ff4eb, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a68dxx - offset 0x08963 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff4f2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a690xx - offset 0x089a1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ff4f9,
+ /* 61 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a699xx - offset 0x089a4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ff5b5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a69axx - offset 0x089e3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff5ba,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a69cxx - offset 0x08a14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ff5c6, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a3xx - offset 0x08a37 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ff5d6, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8ff5d8, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a5xx - offset 0x08a66 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8ff5da, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ff5dd,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a7xx - offset 0x08a96 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ff5df, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a8xx - offset 0x08ab8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ff5e3, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a9xx - offset 0x08ae0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8ff5ea, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6aaxx - offset 0x08b14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff5f0, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff5f3,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6abxx - offset 0x08b4c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00fadd,
+
+ /*** Four byte table, leaf: f0a6b0xx - offset 0x08b8c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fa5c4,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6b1xx - offset 0x08bb6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff6c4,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6b3xx - offset 0x08bea ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ff6ce, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: f0a6b9xx - offset 0x08c2a ***/
+
+ /* 80 */ 0x00fbb3, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8ff6dd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6bexx - offset 0x08c56 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff6f5,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6bfxx - offset 0x08c6b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ff7a1, 0x8ff7a2,
+ /* b8 */ 0x8ff6fe,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a783xx - offset 0x08ca4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00fbc9,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a784xx - offset 0x08cd9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ff7b3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ff7b6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a78fxx - offset 0x08d13 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8ff7e5, 0x8ff7e4,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ff7eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a790xx - offset 0x08d52 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ff7ee, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a791xx - offset 0x08d89 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8ff7f3, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a798xx - offset 0x08db5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8ff8aa, 0x8ff8a9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ff8ac, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79axx - offset 0x08df1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00fbec, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8ff8b4,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79cxx - offset 0x08e23 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff8bc, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8ff8be,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79dxx - offset 0x08e51 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8ff8c2, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7a6xx - offset 0x08e8c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8ff8d6, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7aaxx - offset 0x08ec8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8ff8e3, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7aexx - offset 0x08ed5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff8f7,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8ff8f9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7afxx - offset 0x08f14 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ff8fa,
+ /* 56 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b2xx - offset 0x08f1c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ff9a5,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b6xx - offset 0x08f55 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ff9af, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b8xx - offset 0x08f85 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ff9b2,
+ /* 47 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7bexx - offset 0x08f96 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ff9b9,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a882xx - offset 0x08fce ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ff9c2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ff9c8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a889xx - offset 0x0900a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00fcc9,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88axx - offset 0x09048 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ff9d9, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88bxx - offset 0x09055 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8ff9de,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88fxx - offset 0x09089 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00fcd1, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a890xx - offset 0x090bd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ff9e6, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a891xx - offset 0x090e8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ff9eb,
+ /* 42 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a895xx - offset 0x090fe ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ff9fa,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a897xx - offset 0x09136 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8ff9fe, 0x8ffaa1, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a89bxx - offset 0x0915f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8ffaac,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ffaaf,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a5xx - offset 0x0919a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ffad0, 0x000000,
+ /* 88 */ 0x000000, 0x8ffacf, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ffad7,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a6xx - offset 0x091d3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8ffae5,
+ /* 88 */ 0x8ffae6, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8ffaf1, 0x8ffaf2,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a8xx - offset 0x0920f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8ffafe, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ffba1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a9xx - offset 0x0924c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8ffbad,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ffbac,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8aaxx - offset 0x0927e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ffbb6, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8abxx - offset 0x092b1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8ffbb7, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8ffbbe, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8ffbbd, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8afxx - offset 0x092f0 ***/
+
+ /* 80 */ 0x000000, 0x8ffbce, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ffbcf,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b4xx - offset 0x09320 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ffbd7,
+ /* 47 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b5xx - offset 0x09331 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ffbda,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b7xx - offset 0x09363 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8ffbdc,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b8xx - offset 0x0939f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8ffbdd,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8ffbe1,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8baxx - offset 0x093d6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8ffbe5, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bbxx - offset 0x093eb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8ffbe7,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bcxx - offset 0x09417 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffbe9,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bfxx - offset 0x0944a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8ffbf1,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a98axx - offset 0x09483 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8ffca2, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ffca3,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a992xx - offset 0x094b5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ffcb8, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a997xx - offset 0x094e6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8ffcc2,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a999xx - offset 0x094f6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8ffccc,
+
+ /*** Four byte table, leaf: f0a99bxx - offset 0x09536 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ffcd6,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a99cxx - offset 0x09567 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ffcd9, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a99dxx - offset 0x09597 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8ffcdd, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9a3xx - offset 0x095d1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8ffcf6, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000,
+ /* 50 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9a9xx - offset 0x095df ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffdac,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b7xx - offset 0x09612 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8ffdcb,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b8xx - offset 0x0963d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8ffdd9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8ffdcc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b9xx - offset 0x0967b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8ffddd, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9baxx - offset 0x096b1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8ffddb, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9bbxx - offset 0x096ed ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8ffde7, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8ffdf0,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ffded, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9bfxx - offset 0x0971f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ffea5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa80xx - offset 0x09745 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8ffeab, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8ffea9,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa82xx - offset 0x09783 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffeb5, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000,
+ /* 57 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa83xx - offset 0x0978a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8ffeb2,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa86xx - offset 0x097c4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00fee6, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa8exx - offset 0x097f8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8ffed8,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa90xx - offset 0x09805 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8ffeda,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa97xx - offset 0x0983d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8ffeee, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa98xx - offset 0x0987b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8ffef0, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8ffef2, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Four byte table, leaf: f0aa9axx - offset 0x098bb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8ffef6, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000
+};
+
+/* Combined character map */
+static const pg_utf_to_local_combined ULmapEUC_JIS_2004_combined[25] = {
+ {0x0000c3a6, 0x0000cc80, 0xabc4}, /* U+00E6+0300 [2000] */
+ {0x0000c994, 0x0000cc80, 0xabc8}, /* U+0254+0300 [2000] */
+ {0x0000c994, 0x0000cc81, 0xabc9}, /* U+0254+0301 [2000] */
+ {0x0000c999, 0x0000cc80, 0xabcc}, /* U+0259+0300 [2000] */
+ {0x0000c999, 0x0000cc81, 0xabcd}, /* U+0259+0301 [2000] */
+ {0x0000c99a, 0x0000cc80, 0xabce}, /* U+025A+0300 [2000] */
+ {0x0000c99a, 0x0000cc81, 0xabcf}, /* U+025A+0301 [2000] */
+ {0x0000ca8c, 0x0000cc80, 0xabca}, /* U+028C+0300 [2000] */
+ {0x0000ca8c, 0x0000cc81, 0xabcb}, /* U+028C+0301 [2000] */
+ {0x0000cba5, 0x0000cba9, 0xabe6}, /* U+02E5+02E9 [2000] */
+ {0x0000cba9, 0x0000cba5, 0xabe5}, /* U+02E9+02E5 [2000] */
+ {0x00e3818b, 0x00e3829a, 0xa4f7}, /* U+304B+309A [2000] */
+ {0x00e3818d, 0x00e3829a, 0xa4f8}, /* U+304D+309A [2000] */
+ {0x00e3818f, 0x00e3829a, 0xa4f9}, /* U+304F+309A [2000] */
+ {0x00e38191, 0x00e3829a, 0xa4fa}, /* U+3051+309A [2000] */
+ {0x00e38193, 0x00e3829a, 0xa4fb}, /* U+3053+309A [2000] */
+ {0x00e382ab, 0x00e3829a, 0xa5f7}, /* U+30AB+309A [2000] */
+ {0x00e382ad, 0x00e3829a, 0xa5f8}, /* U+30AD+309A [2000] */
+ {0x00e382af, 0x00e3829a, 0xa5f9}, /* U+30AF+309A [2000] */
+ {0x00e382b1, 0x00e3829a, 0xa5fa}, /* U+30B1+309A [2000] */
+ {0x00e382b3, 0x00e3829a, 0xa5fb}, /* U+30B3+309A [2000] */
+ {0x00e382bb, 0x00e3829a, 0xa5fc}, /* U+30BB+309A [2000] */
+ {0x00e38384, 0x00e3829a, 0xa5fd}, /* U+30C4+309A [2000] */
+ {0x00e38388, 0x00e3829a, 0xa5fe}, /* U+30C8+309A [2000] */
+ {0x00e387b7, 0x00e3829a, 0xa6f8} /* U+31F7+309A [2000] */
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_euc_jp.map b/src/backend/utils/mb/Unicode/utf8_to_euc_jp.map
new file mode 100644
index 0000000..d5c75ad
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_euc_jp.map
@@ -0,0 +1,7141 @@
+/* src/backend/utils/mb/Unicode/utf8_to_euc_jp.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl */
+
+static const uint32 euc_jp_from_unicode_tree_table[23370];
+
+static const pg_mb_radix_tree euc_jp_from_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_jp_from_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x02c3, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_jp_from_unicode_tree_table[23370] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x000050, 0x000090, 0x0000d0, 0x000110,
+ /* c6 */ 0x000000, 0x00014f, 0x000000, 0x000000,
+ /* ca */ 0x000000, 0x000188, 0x000000, 0x000000,
+ /* ce */ 0x0001c4, 0x000204, 0x000243, 0x000283,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fa2c2, 0x000000, 0x000000,
+ /* a4 */ 0x8fa2f0, 0x000000, 0x8fa2c3, 0x00a1f8,
+ /* a8 */ 0x00a1af, 0x8fa2ed, 0x8fa2ec, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fa2ee, 0x8fa2b4,
+ /* b0 */ 0x00a1eb, 0x00a1de, 0x000000, 0x000000,
+ /* b4 */ 0x00a1ad, 0x000000, 0x00a2f9, 0x000000,
+ /* b8 */ 0x8fa2b1, 0x000000, 0x8fa2eb, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fa2c4,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x8faaa2, 0x8faaa1, 0x8faaa4, 0x8faaaa,
+ /* 84 */ 0x8faaa3, 0x8faaa9, 0x8fa9a1, 0x8faaae,
+ /* 88 */ 0x8faab2, 0x8faab1, 0x8faab4, 0x8faab3,
+ /* 8c */ 0x8faac0, 0x8faabf, 0x8faac2, 0x8faac1,
+ /* 90 */ 0x000000, 0x8faad0, 0x8faad2, 0x8faad1,
+ /* 94 */ 0x8faad4, 0x8faad8, 0x8faad3, 0x00a1df,
+ /* 98 */ 0x8fa9ac, 0x8faae3, 0x8faae2, 0x8faae5,
+ /* 9c */ 0x8faae4, 0x8faaf2, 0x8fa9b0, 0x8fa9ce,
+ /* a0 */ 0x8faba2, 0x8faba1, 0x8faba4, 0x8fabaa,
+ /* a4 */ 0x8faba3, 0x8faba9, 0x8fa9c1, 0x8fabae,
+ /* a8 */ 0x8fabb2, 0x8fabb1, 0x8fabb4, 0x8fabb3,
+ /* ac */ 0x8fabc0, 0x8fabbf, 0x8fabc2, 0x8fabc1,
+ /* b0 */ 0x8fa9c3, 0x8fabd0, 0x8fabd2, 0x8fabd1,
+ /* b4 */ 0x8fabd4, 0x8fabd8, 0x8fabd3, 0x00a1e0,
+ /* b8 */ 0x8fa9cc, 0x8fabe3, 0x8fabe2, 0x8fabe5,
+ /* bc */ 0x8fabe4, 0x8fabf2, 0x8fa9d0, 0x8fabf3,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000d0 ***/
+
+ /* 80 */ 0x8faaa7, 0x8faba7, 0x8faaa5, 0x8faba5,
+ /* 84 */ 0x8faaa8, 0x8faba8, 0x8faaab, 0x8fabab,
+ /* 88 */ 0x8faaac, 0x8fabac, 0x8faaaf, 0x8fabaf,
+ /* 8c */ 0x8faaad, 0x8fabad, 0x8faab0, 0x8fabb0,
+ /* 90 */ 0x8fa9a2, 0x8fa9c2, 0x8faab7, 0x8fabb7,
+ /* 94 */ 0x000000, 0x000000, 0x8faab6, 0x8fabb6,
+ /* 98 */ 0x8faab8, 0x8fabb8, 0x8faab5, 0x8fabb5,
+ /* 9c */ 0x8faaba, 0x8fabba, 0x8faabb, 0x8fabbb,
+ /* a0 */ 0x8faabd, 0x8fabbd, 0x8faabc, 0x000000,
+ /* a4 */ 0x8faabe, 0x8fabbe, 0x8fa9a4, 0x8fa9c4,
+ /* a8 */ 0x8faac7, 0x8fabc7, 0x8faac5, 0x8fabc5,
+ /* ac */ 0x000000, 0x000000, 0x8faac6, 0x8fabc6,
+ /* b0 */ 0x8faac4, 0x8fa9c5, 0x8fa9a6, 0x8fa9c6,
+ /* b4 */ 0x8faac8, 0x8fabc8, 0x8faac9, 0x8fabc9,
+ /* b8 */ 0x8fa9c7, 0x8faaca, 0x8fabca, 0x8faacc,
+ /* bc */ 0x8fabcc, 0x8faacb, 0x8fabcb, 0x8fa9a9,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00110 ***/
+
+ /* 80 */ 0x8fa9c9, 0x8fa9a8, 0x8fa9c8, 0x8faacd,
+ /* 84 */ 0x8fabcd, 0x8faacf, 0x8fabcf, 0x8faace,
+ /* 88 */ 0x8fabce, 0x8fa9ca, 0x8fa9ab, 0x8fa9cb,
+ /* 8c */ 0x8faad7, 0x8fabd7, 0x000000, 0x000000,
+ /* 90 */ 0x8faad6, 0x8fabd6, 0x8fa9ad, 0x8fa9cd,
+ /* 94 */ 0x8faad9, 0x8fabd9, 0x8faadb, 0x8fabdb,
+ /* 98 */ 0x8faada, 0x8fabda, 0x8faadc, 0x8fabdc,
+ /* 9c */ 0x8faadd, 0x8fabdd, 0x8faadf, 0x8fabdf,
+ /* a0 */ 0x8faade, 0x8fabde, 0x8faae1, 0x8fabe1,
+ /* a4 */ 0x8faae0, 0x8fabe0, 0x8fa9af, 0x8fa9cf,
+ /* a8 */ 0x8faaec, 0x8fabec, 0x8faae9, 0x8fabe9,
+ /* ac */ 0x8faae6, 0x8fabe6, 0x8faaeb, 0x8fabeb,
+ /* b0 */ 0x8faae8, 0x8fabe8, 0x8faaea, 0x8fabea,
+ /* b4 */ 0x8faaf1, 0x8fabf1, 0x8faaf4, 0x8fabf4,
+ /* b8 */ 0x8faaf3, 0x8faaf5, 0x8fabf5, 0x8faaf7,
+ /* bc */ 0x8fabf7, 0x8faaf6, 0x8fabf6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x0014f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8faaa6, 0x8faba6, 0x8faac3,
+ /* 90 */ 0x8fabc3, 0x8faad5, 0x8fabd5, 0x8faae7,
+ /* 94 */ 0x8fabe7, 0x8faaf0, 0x8fabf0, 0x8faaed,
+ /* 98 */ 0x8fabed, 0x8faaef, 0x8fabef, 0x8faaee,
+ /* 9c */ 0x8fabee, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fabb9, 0x000000, 0x000000,
+ /* b8 */ 0x000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00188 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fa2b0,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8fa2af, 0x8fa2b2, 0x8fa2b6, 0x8fa2b5,
+ /* 9c */ 0x000000, 0x8fa2b3, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x001c4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fa2b8, 0x8fa2b9, 0x8fa6e1, 0x000000,
+ /* 88 */ 0x8fa6e2, 0x8fa6e3, 0x8fa6e4, 0x000000,
+ /* 8c */ 0x8fa6e7, 0x000000, 0x8fa6e9, 0x8fa6ec,
+ /* 90 */ 0x8fa6f6, 0x00a6a1, 0x00a6a2, 0x00a6a3,
+ /* 94 */ 0x00a6a4, 0x00a6a5, 0x00a6a6, 0x00a6a7,
+ /* 98 */ 0x00a6a8, 0x00a6a9, 0x00a6aa, 0x00a6ab,
+ /* 9c */ 0x00a6ac, 0x00a6ad, 0x00a6ae, 0x00a6af,
+ /* a0 */ 0x00a6b0, 0x00a6b1, 0x000000, 0x00a6b2,
+ /* a4 */ 0x00a6b3, 0x00a6b4, 0x00a6b5, 0x00a6b6,
+ /* a8 */ 0x00a6b7, 0x00a6b8, 0x8fa6e5, 0x8fa6ea,
+ /* ac */ 0x8fa6f1, 0x8fa6f2, 0x8fa6f3, 0x8fa6f4,
+ /* b0 */ 0x8fa6fb, 0x00a6c1, 0x00a6c2, 0x00a6c3,
+ /* b4 */ 0x00a6c4, 0x00a6c5, 0x00a6c6, 0x00a6c7,
+ /* b8 */ 0x00a6c8, 0x00a6c9, 0x00a6ca, 0x00a6cb,
+ /* bc */ 0x00a6cc, 0x00a6cd, 0x00a6ce, 0x00a6cf,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00204 ***/
+
+ /* 80 */ 0x00a6d0, 0x00a6d1, 0x8fa6f8, 0x00a6d2,
+ /* 84 */ 0x00a6d3, 0x00a6d4, 0x00a6d5, 0x00a6d6,
+ /* 88 */ 0x00a6d7, 0x00a6d8, 0x8fa6f5, 0x8fa6fa,
+ /* 8c */ 0x8fa6f7, 0x8fa6f9, 0x8fa6fc, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x00243 ***/
+
+ /* 80 */ 0x000000, 0x00a7a7, 0x8fa7c2, 0x8fa7c3,
+ /* 84 */ 0x8fa7c4, 0x8fa7c5, 0x8fa7c6, 0x8fa7c7,
+ /* 88 */ 0x8fa7c8, 0x8fa7c9, 0x8fa7ca, 0x8fa7cb,
+ /* 8c */ 0x8fa7cc, 0x000000, 0x8fa7cd, 0x8fa7ce,
+ /* 90 */ 0x00a7a1, 0x00a7a2, 0x00a7a3, 0x00a7a4,
+ /* 94 */ 0x00a7a5, 0x00a7a6, 0x00a7a8, 0x00a7a9,
+ /* 98 */ 0x00a7aa, 0x00a7ab, 0x00a7ac, 0x00a7ad,
+ /* 9c */ 0x00a7ae, 0x00a7af, 0x00a7b0, 0x00a7b1,
+ /* a0 */ 0x00a7b2, 0x00a7b3, 0x00a7b4, 0x00a7b5,
+ /* a4 */ 0x00a7b6, 0x00a7b7, 0x00a7b8, 0x00a7b9,
+ /* a8 */ 0x00a7ba, 0x00a7bb, 0x00a7bc, 0x00a7bd,
+ /* ac */ 0x00a7be, 0x00a7bf, 0x00a7c0, 0x00a7c1,
+ /* b0 */ 0x00a7d1, 0x00a7d2, 0x00a7d3, 0x00a7d4,
+ /* b4 */ 0x00a7d5, 0x00a7d6, 0x00a7d8, 0x00a7d9,
+ /* b8 */ 0x00a7da, 0x00a7db, 0x00a7dc, 0x00a7dd,
+ /* bc */ 0x00a7de, 0x00a7df, 0x00a7e0, 0x00a7e1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00283 ***/
+
+ /* 80 */ 0x00a7e2, 0x00a7e3, 0x00a7e4, 0x00a7e5,
+ /* 84 */ 0x00a7e6, 0x00a7e7, 0x00a7e8, 0x00a7e9,
+ /* 88 */ 0x00a7ea, 0x00a7eb, 0x00a7ec, 0x00a7ed,
+ /* 8c */ 0x00a7ee, 0x00a7ef, 0x00a7f0, 0x00a7f1,
+ /* 90 */ 0x000000, 0x00a7d7, 0x8fa7f2, 0x8fa7f3,
+ /* 94 */ 0x8fa7f4, 0x8fa7f5, 0x8fa7f6, 0x8fa7f7,
+ /* 98 */ 0x8fa7f8, 0x8fa7f9, 0x8fa7fa, 0x8fa7fb,
+ /* 9c */ 0x8fa7fc, 0x000000, 0x8fa7fd, 0x8fa7fe,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, byte #1: xx - offset 0x002c3 ***/
+
+ /* e2 */ 0x0002d1, 0x000311, 0x000321, 0x000361,
+ /* e6 */ 0x0003a1, 0x0003e1, 0x000421, 0x000461,
+ /* ea */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ee */ 0x000000, 0x0004a0,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x002d1 ***/
+
+ /* 80 */ 0x0004e0, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00051d, 0x000549, 0x000583, 0x0005b1,
+ /* 88 */ 0x0005f1, 0x00062f, 0x00066d, 0x000000,
+ /* 8c */ 0x0006ad, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x0006cd, 0x000000, 0x000000,
+ /* 94 */ 0x00070d, 0x00074d, 0x00076d, 0x0007ab,
+ /* 98 */ 0x0007e6, 0x000826, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x00311 ***/
+
+ /* 80 */ 0x000866, 0x0008a5, 0x0008e5, 0x000925,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000964, 0x000000, 0x00099e, 0x000000,
+ /* 8c */ 0x0009db, 0x000a17, 0x000a56, 0x000a92,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x00321 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000ad2, 0x000b12, 0x000b52, 0x000b92,
+ /* bc */ 0x000bd2, 0x000c12, 0x000c52, 0x000c92,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00361 ***/
+
+ /* 80 */ 0x000cd2, 0x000d12, 0x000d52, 0x000d92,
+ /* 84 */ 0x000dd2, 0x000e12, 0x000e52, 0x000e92,
+ /* 88 */ 0x000ed2, 0x000f0f, 0x000f4f, 0x000f8f,
+ /* 8c */ 0x000fcf, 0x00100f, 0x00104f, 0x00108f,
+ /* 90 */ 0x0010ce, 0x00110e, 0x00114e, 0x00118e,
+ /* 94 */ 0x0011ce, 0x00120e, 0x00124e, 0x00128e,
+ /* 98 */ 0x0012ce, 0x00130e, 0x00134e, 0x00138e,
+ /* 9c */ 0x0013ce, 0x00140e, 0x00144e, 0x00148e,
+ /* a0 */ 0x0014ce, 0x00150e, 0x00154e, 0x00158d,
+ /* a4 */ 0x0015cb, 0x00160b, 0x00164a, 0x001689,
+ /* a8 */ 0x0016c9, 0x001709, 0x001749, 0x001789,
+ /* ac */ 0x0017c9, 0x001809, 0x001849, 0x001889,
+ /* b0 */ 0x0018c9, 0x001909, 0x001947, 0x001986,
+ /* b4 */ 0x0019c5, 0x001a05, 0x001a45, 0x001a83,
+ /* b8 */ 0x001ac3, 0x001b03, 0x001b43, 0x001b83,
+ /* bc */ 0x001bc3, 0x001c03, 0x001c43, 0x001c81,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x003a1 ***/
+
+ /* 80 */ 0x001cc1, 0x001d01, 0x001d41, 0x001d80,
+ /* 84 */ 0x001dc0, 0x001e00, 0x001e40, 0x001e80,
+ /* 88 */ 0x001ec0, 0x001f00, 0x001f40, 0x001f80,
+ /* 8c */ 0x001fc0, 0x002000, 0x002040, 0x002080,
+ /* 90 */ 0x0020bb, 0x0020fb, 0x002139, 0x002179,
+ /* 94 */ 0x0021b9, 0x0021f9, 0x002238, 0x002278,
+ /* 98 */ 0x0022b8, 0x0022f8, 0x002338, 0x002378,
+ /* 9c */ 0x0023b8, 0x0023f8, 0x002438, 0x002478,
+ /* a0 */ 0x0024b8, 0x0024f8, 0x002538, 0x002575,
+ /* a4 */ 0x0025b5, 0x0025f5, 0x002635, 0x002675,
+ /* a8 */ 0x0026b5, 0x0026f5, 0x002735, 0x002775,
+ /* ac */ 0x0027b3, 0x0027f3, 0x002833, 0x002873,
+ /* b0 */ 0x0028b3, 0x0028f3, 0x002932, 0x002972,
+ /* b4 */ 0x0029ae, 0x0029ee, 0x002a2c, 0x002a6c,
+ /* b8 */ 0x002aac, 0x002aeb, 0x002b2b, 0x002b6b,
+ /* bc */ 0x002bab, 0x002beb, 0x002c2b, 0x002c6b,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x003e1 ***/
+
+ /* 80 */ 0x002cab, 0x002cea, 0x002d29, 0x002d65,
+ /* 84 */ 0x002da3, 0x002de2, 0x002e22, 0x002e62,
+ /* 88 */ 0x002ea2, 0x002ee2, 0x002f22, 0x002f61,
+ /* 8c */ 0x002fa0, 0x002fe0, 0x003020, 0x003060,
+ /* 90 */ 0x0030a0, 0x0030e0, 0x003120, 0x003160,
+ /* 94 */ 0x0031a0, 0x0031e0, 0x003220, 0x003260,
+ /* 98 */ 0x0032a0, 0x0032e0, 0x003320, 0x003360,
+ /* 9c */ 0x0033a0, 0x0033e0, 0x003420, 0x003460,
+ /* a0 */ 0x00349e, 0x0034de, 0x00351d, 0x00355d,
+ /* a4 */ 0x00359d, 0x0035dd, 0x00361d, 0x00365d,
+ /* a8 */ 0x00369d, 0x0036dd, 0x00371d, 0x00375d,
+ /* ac */ 0x00379d, 0x0037dd, 0x003819, 0x003859,
+ /* b0 */ 0x003899, 0x0038d9, 0x003918, 0x003958,
+ /* b4 */ 0x003998, 0x0039d8, 0x003a18, 0x003a58,
+ /* b8 */ 0x003a98, 0x003ad8, 0x003b18, 0x000000,
+ /* bc */ 0x003b37, 0x003b77, 0x003bb7, 0x003bf7,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x00421 ***/
+
+ /* 80 */ 0x003c37, 0x003c77, 0x003cb7, 0x003cf4,
+ /* 84 */ 0x003d33, 0x003d72, 0x003db2, 0x003df2,
+ /* 88 */ 0x003e32, 0x003e72, 0x003eb2, 0x003ef2,
+ /* 8c */ 0x003f32, 0x003f72, 0x003fb2, 0x003ff2,
+ /* 90 */ 0x004031, 0x00406f, 0x0040ae, 0x0040ee,
+ /* 94 */ 0x00412e, 0x00416e, 0x0041ae, 0x0041ee,
+ /* 98 */ 0x00422e, 0x00426e, 0x0042aa, 0x0042ea,
+ /* 9c */ 0x00432a, 0x00436a, 0x0043aa, 0x0043ea,
+ /* a0 */ 0x00442a, 0x00446a, 0x0044aa, 0x0044ea,
+ /* a4 */ 0x004529, 0x004569, 0x0045a9, 0x0045e9,
+ /* a8 */ 0x004629, 0x004669, 0x0046a9, 0x0046e9,
+ /* ac */ 0x004729, 0x004768, 0x0047a8, 0x000000,
+ /* b0 */ 0x0047c8, 0x004808, 0x004847, 0x004887,
+ /* b4 */ 0x0048c7, 0x0048e3, 0x004923, 0x004963,
+ /* b8 */ 0x0049a3, 0x0049e3, 0x004a22, 0x004a62,
+ /* bc */ 0x004aa2, 0x004ae2, 0x004b08, 0x004b48,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00461 ***/
+
+ /* 80 */ 0x004b88, 0x004bc8, 0x004c08, 0x004c47,
+ /* 84 */ 0x004c87, 0x004cc5, 0x004d04, 0x004d44,
+ /* 88 */ 0x004d84, 0x004dc4, 0x004e04, 0x004e44,
+ /* 8c */ 0x004e84, 0x004ec0, 0x004f00, 0x004f3f,
+ /* 90 */ 0x004f7e, 0x004fbe, 0x004ffe, 0x000000,
+ /* 94 */ 0x000000, 0x005007, 0x005047, 0x005087,
+ /* 98 */ 0x0050ae, 0x0050ee, 0x00512e, 0x00516e,
+ /* 9c */ 0x0051ae, 0x0051ed, 0x00522d, 0x00526d,
+ /* a0 */ 0x0052ad, 0x0052ec, 0x005321, 0x005361,
+ /* a4 */ 0x0053a0, 0x0053e0, 0x00540a, 0x00544a,
+ /* a8 */ 0x00548a, 0x0054ca, 0x0054f6, 0x005536,
+ /* ac */ 0x005576, 0x0055b5, 0x0055f5, 0x005635,
+ /* b0 */ 0x005675, 0x0056b4, 0x000000, 0x0056f0,
+ /* b4 */ 0x00572e, 0x00576e, 0x0057ad, 0x0057ed,
+ /* b8 */ 0x00582c, 0x00584b, 0x00588b, 0x0058cb,
+ /* bc */ 0x00590b, 0x00594b, 0x005989,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x004a0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x0059af, 0x000000, 0x000000, 0x0059d9,
+ /* a8 */ 0x005a0b, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x005a4a, 0x005a8a, 0x005aca, 0x005b0a,
+
+ /*** Three byte table, leaf: e280xx - offset 0x004e0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00a1be, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00a1bd, 0x000000, 0x000000,
+ /* 98 */ 0x00a1c6, 0x00a1c7, 0x000000, 0x000000,
+ /* 9c */ 0x00a1c8, 0x00a1c9, 0x000000, 0x000000,
+ /* a0 */ 0x00a2f7, 0x00a2f8, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00a1c5, 0x00a1c4, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00a2f3, 0x000000, 0x00a1ec, 0x00a1ed,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00a2a8,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x0051d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00a1ee,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00ade2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00ade4, 0x8fa2ef, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00a2f2,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00549 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00adb5, 0x00adb6, 0x00adb7, 0x00adb8,
+ /* a4 */ 0x00adb9, 0x00adba, 0x00adbb, 0x00adbc,
+ /* a8 */ 0x00adbd, 0x00adbe, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8ff3f3, 0x8ff3f4, 0x8ff3f5, 0x8ff3f6,
+ /* b4 */ 0x8ff3f7, 0x8ff3f8, 0x8ff3f9, 0x8ff3fa,
+ /* b8 */ 0x8ff3fb, 0x8ff3fc,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00583 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00a2ab, 0x00a2ac, 0x00a2aa, 0x00a2ad,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x005b1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2cd, 0x000000,
+ /* 94 */ 0x00a2ce, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x005f1 ***/
+
+ /* 80 */ 0x00a2cf, 0x000000, 0x00a2df, 0x00a2d0,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00a2e0,
+ /* 88 */ 0x00a2ba, 0x000000, 0x000000, 0x00a2bb,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00adf4, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00a2e5, 0x000000,
+ /* 9c */ 0x000000, 0x00a2e7, 0x00a1e7, 0x00adf8,
+ /* a0 */ 0x00a2dc, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00a1c2, 0x000000, 0x00a2ca,
+ /* a8 */ 0x00a2cb, 0x00a2c1, 0x00a2c0, 0x00a2e9,
+ /* ac */ 0x00a2ea, 0x000000, 0x00adf3, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00a1e8, 0x00a2e8, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00a2e6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0062f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2e2, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a1e2, 0x00a2e1, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00a1e5, 0x00a1e6,
+ /* a8 */ 0x000000, 0x000000, 0x00a2e3, 0x00a2e4,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x0066d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00a2be, 0x00a2bf,
+ /* 84 */ 0x000000, 0x000000, 0x00a2bc, 0x00a2bd,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00a2dd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00adf9,
+
+ /*** Three byte table, leaf: e28cxx - offset 0x006ad ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00a2de, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x006cd ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00ada1, 0x00ada2, 0x00ada3, 0x00ada4,
+ /* a4 */ 0x00ada5, 0x00ada6, 0x00ada7, 0x00ada8,
+ /* a8 */ 0x00ada9, 0x00adaa, 0x00adab, 0x00adac,
+ /* ac */ 0x00adad, 0x00adae, 0x00adaf, 0x00adb0,
+ /* b0 */ 0x00adb1, 0x00adb2, 0x00adb3, 0x00adb4,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x0070d ***/
+
+ /* 80 */ 0x00a8a1, 0x00a8ac, 0x00a8a2, 0x00a8ad,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00a8a3, 0x000000, 0x000000, 0x00a8ae,
+ /* 90 */ 0x00a8a4, 0x000000, 0x000000, 0x00a8af,
+ /* 94 */ 0x00a8a6, 0x000000, 0x000000, 0x00a8b1,
+ /* 98 */ 0x00a8a5, 0x000000, 0x000000, 0x00a8b0,
+ /* 9c */ 0x00a8a7, 0x00a8bc, 0x000000, 0x000000,
+ /* a0 */ 0x00a8b7, 0x000000, 0x000000, 0x00a8b2,
+ /* a4 */ 0x00a8a9, 0x00a8be, 0x000000, 0x000000,
+ /* a8 */ 0x00a8b9, 0x000000, 0x000000, 0x00a8b4,
+ /* ac */ 0x00a8a8, 0x000000, 0x000000, 0x00a8b8,
+ /* b0 */ 0x00a8bd, 0x000000, 0x000000, 0x00a8b3,
+ /* b4 */ 0x00a8aa, 0x000000, 0x000000, 0x00a8ba,
+ /* b8 */ 0x00a8bf, 0x000000, 0x000000, 0x00a8b5,
+ /* bc */ 0x00a8ab, 0x000000, 0x000000, 0x00a8bb,
+
+ /*** Three byte table, leaf: e295xx - offset 0x0074d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00a8c0, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00a8b6,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x0076d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a2a3, 0x00a2a2, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00a2a5, 0x00a2a4,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00a2a7, 0x00a2a6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x007ab ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00a2a1, 0x00a1fe,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00a1fb,
+ /* 8c */ 0x000000, 0x000000, 0x00a1fd, 0x00a1fc,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00a2fe,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x007e6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00a1fa, 0x00a1f9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x00826 ***/
+
+ /* 80 */ 0x00a1ea, 0x000000, 0x00a1e9, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00a2f6, 0x000000,
+ /* ac */ 0x000000, 0x00a2f5, 0x000000, 0x00a2f4,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00866 ***/
+
+ /* 80 */ 0x00a1a1, 0x00a1a2, 0x00a1a3, 0x00a1b7,
+ /* 84 */ 0x000000, 0x00a1b9, 0x00a1ba, 0x00a1bb,
+ /* 88 */ 0x00a1d2, 0x00a1d3, 0x00a1d4, 0x00a1d5,
+ /* 8c */ 0x00a1d6, 0x00a1d7, 0x00a1d8, 0x00a1d9,
+ /* 90 */ 0x00a1da, 0x00a1db, 0x00a2a9, 0x00a2ae,
+ /* 94 */ 0x00a1cc, 0x00a1cd, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00ade0, 0x000000, 0x00ade1,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x008a5 ***/
+
+ /* 80 */ 0x000000, 0x00a4a1, 0x00a4a2, 0x00a4a3,
+ /* 84 */ 0x00a4a4, 0x00a4a5, 0x00a4a6, 0x00a4a7,
+ /* 88 */ 0x00a4a8, 0x00a4a9, 0x00a4aa, 0x00a4ab,
+ /* 8c */ 0x00a4ac, 0x00a4ad, 0x00a4ae, 0x00a4af,
+ /* 90 */ 0x00a4b0, 0x00a4b1, 0x00a4b2, 0x00a4b3,
+ /* 94 */ 0x00a4b4, 0x00a4b5, 0x00a4b6, 0x00a4b7,
+ /* 98 */ 0x00a4b8, 0x00a4b9, 0x00a4ba, 0x00a4bb,
+ /* 9c */ 0x00a4bc, 0x00a4bd, 0x00a4be, 0x00a4bf,
+ /* a0 */ 0x00a4c0, 0x00a4c1, 0x00a4c2, 0x00a4c3,
+ /* a4 */ 0x00a4c4, 0x00a4c5, 0x00a4c6, 0x00a4c7,
+ /* a8 */ 0x00a4c8, 0x00a4c9, 0x00a4ca, 0x00a4cb,
+ /* ac */ 0x00a4cc, 0x00a4cd, 0x00a4ce, 0x00a4cf,
+ /* b0 */ 0x00a4d0, 0x00a4d1, 0x00a4d2, 0x00a4d3,
+ /* b4 */ 0x00a4d4, 0x00a4d5, 0x00a4d6, 0x00a4d7,
+ /* b8 */ 0x00a4d8, 0x00a4d9, 0x00a4da, 0x00a4db,
+ /* bc */ 0x00a4dc, 0x00a4dd, 0x00a4de, 0x00a4df,
+
+ /*** Three byte table, leaf: e382xx - offset 0x008e5 ***/
+
+ /* 80 */ 0x00a4e0, 0x00a4e1, 0x00a4e2, 0x00a4e3,
+ /* 84 */ 0x00a4e4, 0x00a4e5, 0x00a4e6, 0x00a4e7,
+ /* 88 */ 0x00a4e8, 0x00a4e9, 0x00a4ea, 0x00a4eb,
+ /* 8c */ 0x00a4ec, 0x00a4ed, 0x00a4ee, 0x00a4ef,
+ /* 90 */ 0x00a4f0, 0x00a4f1, 0x00a4f2, 0x00a4f3,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00a1ab,
+ /* 9c */ 0x00a1ac, 0x00a1b5, 0x00a1b6, 0x000000,
+ /* a0 */ 0x000000, 0x00a5a1, 0x00a5a2, 0x00a5a3,
+ /* a4 */ 0x00a5a4, 0x00a5a5, 0x00a5a6, 0x00a5a7,
+ /* a8 */ 0x00a5a8, 0x00a5a9, 0x00a5aa, 0x00a5ab,
+ /* ac */ 0x00a5ac, 0x00a5ad, 0x00a5ae, 0x00a5af,
+ /* b0 */ 0x00a5b0, 0x00a5b1, 0x00a5b2, 0x00a5b3,
+ /* b4 */ 0x00a5b4, 0x00a5b5, 0x00a5b6, 0x00a5b7,
+ /* b8 */ 0x00a5b8, 0x00a5b9, 0x00a5ba, 0x00a5bb,
+ /* bc */ 0x00a5bc, 0x00a5bd, 0x00a5be, 0x00a5bf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00925 ***/
+
+ /* 80 */ 0x00a5c0, 0x00a5c1, 0x00a5c2, 0x00a5c3,
+ /* 84 */ 0x00a5c4, 0x00a5c5, 0x00a5c6, 0x00a5c7,
+ /* 88 */ 0x00a5c8, 0x00a5c9, 0x00a5ca, 0x00a5cb,
+ /* 8c */ 0x00a5cc, 0x00a5cd, 0x00a5ce, 0x00a5cf,
+ /* 90 */ 0x00a5d0, 0x00a5d1, 0x00a5d2, 0x00a5d3,
+ /* 94 */ 0x00a5d4, 0x00a5d5, 0x00a5d6, 0x00a5d7,
+ /* 98 */ 0x00a5d8, 0x00a5d9, 0x00a5da, 0x00a5db,
+ /* 9c */ 0x00a5dc, 0x00a5dd, 0x00a5de, 0x00a5df,
+ /* a0 */ 0x00a5e0, 0x00a5e1, 0x00a5e2, 0x00a5e3,
+ /* a4 */ 0x00a5e4, 0x00a5e5, 0x00a5e6, 0x00a5e7,
+ /* a8 */ 0x00a5e8, 0x00a5e9, 0x00a5ea, 0x00a5eb,
+ /* ac */ 0x00a5ec, 0x00a5ed, 0x00a5ee, 0x00a5ef,
+ /* b0 */ 0x00a5f0, 0x00a5f1, 0x00a5f2, 0x00a5f3,
+ /* b4 */ 0x00a5f4, 0x00a5f5, 0x00a5f6, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00a1a6,
+ /* bc */ 0x00a1bc, 0x00a1b3, 0x00a1b4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e388xx - offset 0x00964 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00adea, 0x00adeb, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00adec,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x0099e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00ade5, 0x00ade6, 0x00ade7, 0x00ade8,
+ /* a8 */ 0x00ade9, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38cxx - offset 0x009db ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00adc6,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00adca, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00adc1, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00adc4, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00adc2, 0x00adcc,
+ /* a4 */ 0x000000, 0x000000, 0x00adcb, 0x00adc5,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00adcd,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00adc7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00adcf,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38dxx - offset 0x00a17 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00adc0, 0x00adce, 0x000000,
+ /* 8c */ 0x000000, 0x00adc3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00adc8, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00adc9,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00addf,
+ /* bc */ 0x00adef, 0x00adee, 0x00aded,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00a56 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00add3, 0x00add4,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00add0, 0x00add1, 0x00add2, 0x000000,
+ /* a0 */ 0x000000, 0x00add6, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00a92 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00add5, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00ade3, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00ad2 ***/
+
+ /* 80 */ 0x00b0ec, 0x00c3fa, 0x8fb0a1, 0x00bcb7,
+ /* 84 */ 0x8fb0a2, 0x8fb0a3, 0x000000, 0x00cbfc,
+ /* 88 */ 0x00bee6, 0x00bbb0, 0x00bee5, 0x00b2bc,
+ /* 8c */ 0x8fb0a4, 0x00c9d4, 0x00cdbf, 0x000000,
+ /* 90 */ 0x00d0a2, 0x00b1af, 0x8fb0a5, 0x000000,
+ /* 94 */ 0x00b3ee, 0x00d0a3, 0x00c0a4, 0x00d2c2,
+ /* 98 */ 0x00b5d6, 0x00caba, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00bee7, 0x8fb0a6,
+ /* a0 */ 0x000000, 0x00cebe, 0x000000, 0x8fb0a7,
+ /* a4 */ 0x8fb0a8, 0x000000, 0x00cac2, 0x000000,
+ /* a8 */ 0x8fb0a9, 0x000000, 0x00d0a4, 0x8fb0aa,
+ /* ac */ 0x000000, 0x00c3e6, 0x8fb0ab, 0x8fb0ac,
+ /* b0 */ 0x8fb0ad, 0x00d0a5, 0x00b6fa, 0x000000,
+ /* b4 */ 0x000000, 0x8fb0ae, 0x00d0a6, 0x000000,
+ /* b8 */ 0x00b4dd, 0x00c3b0, 0x000000, 0x00bce7,
+ /* bc */ 0x00d0a7, 0x000000, 0x000000, 0x00d0a8,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00b12 ***/
+
+ /* 80 */ 0x8fb0af, 0x8fb0b0, 0x00d0a9, 0x00c7b5,
+ /* 84 */ 0x8fb0b1, 0x00b5d7, 0x000000, 0x8fb0b2,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00c7b7,
+ /* 8c */ 0x000000, 0x00c6e3, 0x00b8c3, 0x00cbb3,
+ /* 90 */ 0x000000, 0x8fb0b3, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00e9c9, 0x00d0aa, 0x00bee8,
+ /* 98 */ 0x00d0ab, 0x00b2b5, 0x8fb0b4, 0x000000,
+ /* 9c */ 0x8fb0b5, 0x00b6e5, 0x00b8f0, 0x00cce9,
+ /* a0 */ 0x000000, 0x000000, 0x00d6a6, 0x8fb0b6,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fb0b7, 0x8fb0b8, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cdf0, 0x000000, 0x00c6fd,
+ /* b4 */ 0x8fb0b9, 0x8fb0ba, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fb0bb, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00b4a5, 0x8fb0bc,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00b52 ***/
+
+ /* 80 */ 0x00b5b5, 0x000000, 0x00d0ac, 0x000000,
+ /* 84 */ 0x000000, 0x00d0ad, 0x00cebb, 0x000000,
+ /* 88 */ 0x00cdbd, 0x00c1e8, 0x00d0af, 0x00bbf6,
+ /* 8c */ 0x00c6f3, 0x8fb0bd, 0x00d0b2, 0x000000,
+ /* 90 */ 0x000000, 0x00b1be, 0x00b8df, 0x000000,
+ /* 94 */ 0x00b8de, 0x00b0e6, 0x8fb0be, 0x8fb0bf,
+ /* 98 */ 0x00cfcb, 0x00cfca, 0x000000, 0x00bab3,
+ /* 9c */ 0x00b0a1, 0x8fb0c0, 0x00d0b3, 0x00d0b4,
+ /* a0 */ 0x00d0b5, 0x00cbb4, 0x00d0b6, 0x000000,
+ /* a4 */ 0x00b8f2, 0x00b0e7, 0x00cbf2, 0x000000,
+ /* a8 */ 0x00b5fc, 0x000000, 0x000000, 0x00b5fd,
+ /* ac */ 0x00b5fe, 0x00c4e2, 0x00cebc, 0x8fb0c1,
+ /* b0 */ 0x00d0b7, 0x000000, 0x000000, 0x00d0b8,
+ /* b4 */ 0x000000, 0x000000, 0x00d0b9, 0x000000,
+ /* b8 */ 0x000000, 0x8fb0c2, 0x00bfcd, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00b92 ***/
+
+ /* 80 */ 0x00bdba, 0x00bfce, 0x00d0be, 0x8fb0c3,
+ /* 84 */ 0x00d0bc, 0x000000, 0x00d0bd, 0x00b5d8,
+ /* 88 */ 0x000000, 0x000000, 0x00baa3, 0x00b2f0,
+ /* 8c */ 0x000000, 0x00d0bb, 0x00d0ba, 0x00caa9,
+ /* 90 */ 0x8fb0c4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00bbc6, 0x00bbc5, 0x00c2be, 0x00d0bf,
+ /* 98 */ 0x00c9d5, 0x00c0e7, 0x8fb0c5, 0x8fb0c6,
+ /* 9c */ 0x000000, 0x00a1b8, 0x00d0c0, 0x00d0c2,
+ /* a0 */ 0x8fb0c7, 0x8fb0c8, 0x8fb0c9, 0x00c2e5,
+ /* a4 */ 0x00cee1, 0x00b0ca, 0x000000, 0x000000,
+ /* a8 */ 0x8fb0ca, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00d0c1, 0x00b2be, 0x8fb0cb,
+ /* b0 */ 0x00b6c4, 0x8fb0cc, 0x00c3e7, 0x8fb0cd,
+ /* b4 */ 0x000000, 0x8fb0ce, 0x00b7ef, 0x00d0c3,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00c7a4,
+ /* bc */ 0x8ff4af, 0x8fb0cf, 0x8fb0d0, 0x8fb0d1,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00bd2 ***/
+
+ /* 80 */ 0x8fb0d2, 0x00b4eb, 0x8fb0d3, 0x8fb0d4,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fb0d5, 0x00d0c4, 0x00b0cb, 0x8fb0d6,
+ /* 8c */ 0x8fb0d7, 0x00b8e0, 0x00b4ec, 0x00c9fa,
+ /* 90 */ 0x00c8b2, 0x00b5d9, 0x8fb0d8, 0x000000,
+ /* 94 */ 0x000000, 0x8fb0d9, 0x8fb0da, 0x8fb0db,
+ /* 98 */ 0x000000, 0x8fb0dc, 0x00b2f1, 0x000000,
+ /* 9c */ 0x00d0e7, 0x00c5c1, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fb0dd, 0x00c7ec,
+ /* b0 */ 0x00d0c6, 0x8fb0de, 0x000000, 0x8fb0e0,
+ /* b4 */ 0x00c8bc, 0x8fb0e1, 0x00cee2, 0x8fb0e2,
+ /* b8 */ 0x00bfad, 0x8fb0e3, 0x00bbc7, 0x8fb0e4,
+ /* bc */ 0x00bbf7, 0x00b2c0, 0x8fb0e5, 0x000000,
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00c12 ***/
+
+ /* 80 */ 0x8fb0e6, 0x000000, 0x8fb0e7, 0x00c4d1,
+ /* 84 */ 0x000000, 0x000000, 0x00c3a2, 0x00d0ca,
+ /* 88 */ 0x8fb0e8, 0x8fb0e9, 0x000000, 0x8fb0ea,
+ /* 8c */ 0x8fb0eb, 0x00b0cc, 0x00c4e3, 0x00bdbb,
+ /* 90 */ 0x00bab4, 0x00cda4, 0x8fb0ec, 0x00c2ce,
+ /* 94 */ 0x8fb0ed, 0x00b2bf, 0x8fb0ee, 0x00d0c9,
+ /* 98 */ 0x8fb0ef, 0x00cdbe, 0x00d0c5, 0x00d0c7,
+ /* 9c */ 0x00baee, 0x00d0c8, 0x00d5a4, 0x8fb0f0,
+ /* a0 */ 0x8fb0df, 0x000000, 0x000000, 0x8fb0f1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d0d0, 0x8fb0f2, 0x000000,
+ /* ac */ 0x8fb0f3, 0x000000, 0x8fb0f4, 0x00d0d3,
+ /* b0 */ 0x00d0d1, 0x8fb0f5, 0x000000, 0x00b2c2,
+ /* b4 */ 0x000000, 0x00cabb, 0x00d0cb, 0x8fb0f6,
+ /* b8 */ 0x8fb0f7, 0x8fb0f8, 0x8fb0f9, 0x00d0cf,
+ /* bc */ 0x00b8f3, 0x8fb0fa, 0x8fb0fb, 0x00bbc8,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00c52 ***/
+
+ /* 80 */ 0x000000, 0x8fb0fc, 0x8fb0fd, 0x00b4a6,
+ /* 84 */ 0x8fb0fe, 0x8fb1a1, 0x00d0d4, 0x000000,
+ /* 88 */ 0x00d0cc, 0x8fb1a2, 0x8fb1a3, 0x00cee3,
+ /* 8c */ 0x8fb1a4, 0x00bbf8, 0x8fb1a5, 0x00d0cd,
+ /* 90 */ 0x8fb1a6, 0x00d0d2, 0x8fb1a7, 0x8fb1a8,
+ /* 94 */ 0x8fb1a9, 0x000000, 0x00d0d5, 0x8fb1aa,
+ /* 98 */ 0x00d0ce, 0x8fb1ab, 0x8fb1ac, 0x00b6a1,
+ /* 9c */ 0x000000, 0x00b0cd, 0x8fb1ad, 0x8fb1ae,
+ /* a0 */ 0x00b6a2, 0x00b2c1, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00d5a5,
+ /* ac */ 0x000000, 0x00cbf9, 0x00c9ee, 0x00b8f4,
+ /* b0 */ 0x000000, 0x000000, 0x8fb1af, 0x000000,
+ /* b4 */ 0x000000, 0x00bfaf, 0x00ceb7, 0x8fb1b0,
+ /* b8 */ 0x000000, 0x8fb1b1, 0x000000, 0x8fb1b2,
+ /* bc */ 0x8fb1b3, 0x8fb1b4, 0x8fb1b5, 0x00cad8,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00c92 ***/
+
+ /* 80 */ 0x8fb1b6, 0x8fb1b7, 0x00b7b8, 0x00c2a5,
+ /* 84 */ 0x00b2e4, 0x8fb1b8, 0x8fb1b9, 0x000000,
+ /* 88 */ 0x8fb1ba, 0x8fb1bb, 0x00bdd3, 0x8fb1bc,
+ /* 8c */ 0x8fb1bd, 0x8fb1be, 0x00d0d9, 0x8fb1bf,
+ /* 90 */ 0x00d0de, 0x00d0dc, 0x8fb1c0, 0x000000,
+ /* 94 */ 0x00d0d7, 0x000000, 0x000000, 0x00c2af,
+ /* 98 */ 0x00d0da, 0x000000, 0x00d0dd, 0x00d0db,
+ /* 9c */ 0x8fb1c1, 0x00cadd, 0x000000, 0x00d0d8,
+ /* a0 */ 0x8fb1c2, 0x00bfae, 0x8fb1c3, 0x00cbf3,
+ /* a4 */ 0x00d0df, 0x00d0e0, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00bda4, 0x00d0ed,
+ /* b0 */ 0x8fb1c4, 0x000000, 0x8fb1c5, 0x00c7d0,
+ /* b4 */ 0x000000, 0x00c9b6, 0x00d0e8, 0x000000,
+ /* b8 */ 0x00caf0, 0x000000, 0x00b2b6, 0x000000,
+ /* bc */ 0x8fb1c6, 0x8fb1c7, 0x00d0ec, 0x8fb1c8,
+
+ /*** Three byte table, leaf: e580xx - offset 0x00cd2 ***/
+
+ /* 80 */ 0x8fb1c9, 0x8fb1ca, 0x000000, 0x000000,
+ /* 84 */ 0x8fb1cb, 0x00d0e6, 0x00d0ef, 0x8fb1cc,
+ /* 88 */ 0x000000, 0x00c1d2, 0x8fb1cd, 0x00b8c4,
+ /* 8c */ 0x8fb1ce, 0x00c7dc, 0x8fb1cf, 0x00e0c7,
+ /* 90 */ 0x8fb1d0, 0x00d0ee, 0x00c5dd, 0x8fb1d1,
+ /* 94 */ 0x00d0e3, 0x000000, 0x00b8f6, 0x8fb1d2,
+ /* 98 */ 0x8fb1d3, 0x00b8f5, 0x00d0e1, 0x8fb1d4,
+ /* 9c */ 0x8fb1d5, 0x8fb1d6, 0x8fb1d7, 0x00bcda,
+ /* a0 */ 0x000000, 0x00d0e9, 0x8fb1d8, 0x00caef,
+ /* a4 */ 0x00c3cd, 0x00d0e5, 0x00b7f1, 0x8fb1d9,
+ /* a8 */ 0x00d0e2, 0x00d0ea, 0x00d0e4, 0x00ced1,
+ /* ac */ 0x00d0eb, 0x00cfc1, 0x8fb1da, 0x000000,
+ /* b0 */ 0x8fb1db, 0x000000, 0x8fb1dc, 0x8fb1dd,
+ /* b4 */ 0x000000, 0x8fb1de, 0x00b6e6, 0x000000,
+ /* b8 */ 0x000000, 0x00b7f0, 0x000000, 0x8fb1f6,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e581xx - offset 0x00d12 ***/
+
+ /* 80 */ 0x8fb1df, 0x8fb1e0, 0x8fb1e1, 0x00d0f0,
+ /* 84 */ 0x000000, 0x8fb1e2, 0x8fb1e3, 0x00d0f1,
+ /* 88 */ 0x00d0f5, 0x00b0ce, 0x8fb1e4, 0x000000,
+ /* 8c */ 0x8fb1e5, 0x000000, 0x8fb1e6, 0x00cad0,
+ /* 90 */ 0x00d0f4, 0x8fb1e7, 0x8fb1e8, 0x8fb1e9,
+ /* 94 */ 0x000000, 0x00d0f3, 0x00d0f7, 0x8fb1ea,
+ /* 98 */ 0x000000, 0x8fb1eb, 0x00d0f6, 0x000000,
+ /* 9c */ 0x00c4e4, 0x000000, 0x000000, 0x8fb1ec,
+ /* a0 */ 0x8fb1ed, 0x000000, 0x8fb1ee, 0x8fb1ef,
+ /* a4 */ 0x000000, 0x00b7f2, 0x8fb1f0, 0x8fb1f1,
+ /* a8 */ 0x000000, 0x000000, 0x8fb1f2, 0x000000,
+ /* ac */ 0x00d0f8, 0x8fb1f3, 0x000000, 0x000000,
+ /* b0 */ 0x8fb1f4, 0x8fb1f5, 0x00bcc5, 0x000000,
+ /* b4 */ 0x00c2a6, 0x00c4e5, 0x00b6f6, 0x000000,
+ /* b8 */ 0x00d0f9, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00b5b6, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00d52 ***/
+
+ /* 80 */ 0x00d0fa, 0x8fb1f7, 0x000000, 0x8fb1f8,
+ /* 84 */ 0x8fb1f9, 0x00d0fc, 0x8fb1fa, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fb1fb, 0x000000,
+ /* 8c */ 0x000000, 0x00cbb5, 0x8fb1fc, 0x8fb1fd,
+ /* 90 */ 0x8fb1fe, 0x00b7e6, 0x8fb2a1, 0x8fb2a2,
+ /* 94 */ 0x8fb2a3, 0x000000, 0x8fb2a4, 0x000000,
+ /* 98 */ 0x00bbb1, 0x00c8f7, 0x00d0fb, 0x8fb2a5,
+ /* 9c */ 0x8fb2a6, 0x000000, 0x8fb2a7, 0x8fb2a8,
+ /* a0 */ 0x8fb2a9, 0x8fb2aa, 0x8fb2ab, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fb2ac, 0x000000,
+ /* ac */ 0x00bac5, 0x00cdc3, 0x000000, 0x8fb2ad,
+ /* b0 */ 0x8fb2ae, 0x000000, 0x00d0fe, 0x00d1a3,
+ /* b4 */ 0x00d0fd, 0x00bac4, 0x000000, 0x00bdfd,
+ /* b8 */ 0x000000, 0x8fb2af, 0x8fb2b0, 0x000000,
+ /* bc */ 0x000000, 0x8fb2b1, 0x00b7b9, 0x000000,
+
+ /*** Three byte table, leaf: e583xx - offset 0x00d92 ***/
+
+ /* 80 */ 0x8fb2b2, 0x000000, 0x00d1a4, 0x8fb2b3,
+ /* 84 */ 0x8fb2b4, 0x00b6cf, 0x000000, 0x8fb2b5,
+ /* 88 */ 0x000000, 0x00d1a1, 0x00d1a2, 0x000000,
+ /* 8c */ 0x8fb2b6, 0x00c6af, 0x8fb2b7, 0x00c1fc,
+ /* 90 */ 0x8fb2b8, 0x00b6a3, 0x000000, 0x8fb2b9,
+ /* 94 */ 0x8fb2ba, 0x00cbcd, 0x00d1a5, 0x000000,
+ /* 98 */ 0x8fb2bb, 0x000000, 0x00cebd, 0x000000,
+ /* 9c */ 0x8fb2bc, 0x8fb2bd, 0x00d1a6, 0x8fb2be,
+ /* a0 */ 0x000000, 0x000000, 0x8fb2bf, 0x00d1a9,
+ /* a4 */ 0x8fb2c0, 0x00d1a7, 0x8fb2c1, 0x00c1ce,
+ /* a8 */ 0x8fb2c2, 0x8fb2c3, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00d1a8, 0x00d1aa, 0x8fb2c4,
+ /* b0 */ 0x000000, 0x8fb2c5, 0x8fb2d1, 0x000000,
+ /* b4 */ 0x8ff4b0, 0x00d1ac, 0x8fb2c6, 0x000000,
+ /* b8 */ 0x000000, 0x00d1ab, 0x8fb2c7, 0x00cac8,
+ /* bc */ 0x000000, 0x000000, 0x8fb2c8, 0x000000,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00dd2 ***/
+
+ /* 80 */ 0x00b5b7, 0x00d1ae, 0x00d1af, 0x8fb2c9,
+ /* 84 */ 0x00b2af, 0x000000, 0x8fb2ca, 0x8fb2cb,
+ /* 88 */ 0x8fb2cc, 0x00d1ad, 0x000000, 0x8fb2cd,
+ /* 8c */ 0x8fb2ce, 0x8fb2cf, 0x8fb2d0, 0x000000,
+ /* 90 */ 0x8fb2d2, 0x000000, 0x00bcf4, 0x000000,
+ /* 94 */ 0x00d1b2, 0x00d1b1, 0x00d1b0, 0x8fb2d3,
+ /* 98 */ 0x00d0d6, 0x8fb2d4, 0x00d1b3, 0x8fb2d5,
+ /* 9c */ 0x8fb2d6, 0x8fb2d7, 0x8fb2d8, 0x00bdfe,
+ /* a0 */ 0x000000, 0x00d1b4, 0x000000, 0x8fb2d9,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fb2da,
+ /* a8 */ 0x8fb2db, 0x000000, 0x00cda5, 0x000000,
+ /* ac */ 0x8fb2dc, 0x8fb2dd, 0x000000, 0x8fb2de,
+ /* b0 */ 0x000000, 0x8fb2df, 0x00ccd9, 0x8fb2e0,
+ /* b4 */ 0x8fb2e1, 0x8fb2e2, 0x000000, 0x00d1b6,
+ /* b8 */ 0x8fb2e3, 0x8fb2e4, 0x00d1b5, 0x00d1b8,
+ /* bc */ 0x00d1b7, 0x000000, 0x000000, 0x00d1b9,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00e12 ***/
+
+ /* 80 */ 0x00d1ba, 0x00b0f4, 0x8fb2e5, 0x00b8b5,
+ /* 84 */ 0x00b7bb, 0x00bdbc, 0x00c3fb, 0x00b6a4,
+ /* 88 */ 0x00c0e8, 0x00b8f7, 0x8fb2e6, 0x00b9ee,
+ /* 8c */ 0x00d1bc, 0x00ccc8, 0x00c5c6, 0x8fb2e7,
+ /* 90 */ 0x00bbf9, 0x000000, 0x00d1bb, 0x8fb2e8,
+ /* 94 */ 0x00d1bd, 0x8fb2e9, 0x000000, 0x8fb2ea,
+ /* 98 */ 0x8fb2eb, 0x000000, 0x00c5de, 0x000000,
+ /* 9c */ 0x00b3f5, 0x000000, 0x000000, 0x8fb2ec,
+ /* a0 */ 0x000000, 0x000000, 0x00d1be, 0x000000,
+ /* a4 */ 0x8fb2ed, 0x00c6fe, 0x8fb2ee, 0x000000,
+ /* a8 */ 0x00c1b4, 0x00d1c0, 0x00d1c1, 0x00c8ac,
+ /* ac */ 0x00b8f8, 0x00cfbb, 0x00d1c2, 0x000000,
+ /* b0 */ 0x000000, 0x00b6a6, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00cabc, 0x00c2b6, 0x00b6f1,
+ /* b8 */ 0x00c5b5, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00b7f3, 0x000000, 0x8fb2ef, 0x000000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00e52 ***/
+
+ /* 80 */ 0x00d1c3, 0x000000, 0x00d1c4, 0x8fb2f0,
+ /* 84 */ 0x8fb2f1, 0x00c6e2, 0x00b1df, 0x000000,
+ /* 88 */ 0x000000, 0x00d1c7, 0x00bafd, 0x8fb2f2,
+ /* 8c */ 0x00d1c6, 0x00bac6, 0x8fb2f3, 0x00d1c8,
+ /* 90 */ 0x00e6ee, 0x00d1c9, 0x00cbc1, 0x00d1ca,
+ /* 94 */ 0x000000, 0x00d1cb, 0x00d1cc, 0x00bee9,
+ /* 98 */ 0x8fb2f4, 0x00bccc, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fb2f5, 0x000000, 0x000000,
+ /* a0 */ 0x00b4a7, 0x8fb2f6, 0x00d1cf, 0x8fb2f7,
+ /* a4 */ 0x00d1cd, 0x00ccbd, 0x00d1ce, 0x000000,
+ /* a8 */ 0x00c9da, 0x00d1d0, 0x00d1d1, 0x00d1d2,
+ /* ac */ 0x00c5df, 0x8fb2f8, 0x000000, 0x000000,
+ /* b0 */ 0x00d1d6, 0x00d1d4, 0x00d1d5, 0x00d1d3,
+ /* b4 */ 0x00bae3, 0x00d1d7, 0x00ccea, 0x00cee4,
+ /* b8 */ 0x8fb2f9, 0x000000, 0x8fb2fa, 0x000000,
+ /* bc */ 0x8fb2fb, 0x00d1d8, 0x8fb2fc, 0x8fb2fd,
+
+ /*** Three byte table, leaf: e587xx - offset 0x00e92 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fb2fe, 0x000000,
+ /* 84 */ 0x00c0a8, 0x00d1d9, 0x00bdda, 0x000000,
+ /* 88 */ 0x8fb3a1, 0x00d1da, 0x000000, 0x00c3fc,
+ /* 8c */ 0x00cebf, 0x00c5e0, 0x000000, 0x8fb3a2,
+ /* 90 */ 0x000000, 0x8fb3a3, 0x8fb3a4, 0x8fb3a5,
+ /* 94 */ 0x000000, 0x8fb3a6, 0x00d2c5, 0x000000,
+ /* 98 */ 0x8fb3a7, 0x000000, 0x000000, 0x00d1db,
+ /* 9c */ 0x00f4a5, 0x00b6c5, 0x8fb3a8, 0x000000,
+ /* a0 */ 0x00d1dc, 0x00cbde, 0x8fb3a9, 0x000000,
+ /* a4 */ 0x000000, 0x8fb3aa, 0x00bde8, 0x00c2fc,
+ /* a8 */ 0x000000, 0x00d1de, 0x00c6e4, 0x000000,
+ /* ac */ 0x8ff4b1, 0x00d1df, 0x8fb3ab, 0x000000,
+ /* b0 */ 0x00d1e0, 0x00b3ae, 0x8fb3ac, 0x8fb3ad,
+ /* b4 */ 0x8fb3ae, 0x00d1e1, 0x00b6a7, 0x8fb3af,
+ /* b8 */ 0x00c6cc, 0x00b1fa, 0x00bdd0, 0x000000,
+ /* bc */ 0x000000, 0x00c8a1, 0x00d1e2, 0x000000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00ed2 ***/
+
+ /* 80 */ 0x00c5e1, 0x8fb3b0, 0x8fb3b1, 0x00bfcf,
+ /* 84 */ 0x00d1e3, 0x8fb3b2, 0x00caac, 0x00c0da,
+ /* 88 */ 0x00b4a2, 0x000000, 0x00b4a9, 0x00d1e4,
+ /* 8c */ 0x000000, 0x000000, 0x00d1e6, 0x000000,
+ /* 90 */ 0x000000, 0x00b7ba, 0x8fb3b3, 0x8fb3b4,
+ /* 94 */ 0x00d1e5, 0x8fb3b5, 0x8fb3b6, 0x00cef3,
+ /* 98 */ 0x8fb3b7, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00bde9, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fb3b8, 0x000000,
+ /* a4 */ 0x00c8bd, 0x00cacc, 0x000000, 0x00d1e7,
+ /* a8 */ 0x8fb3b9, 0x00cdf8, 0x00d1e8, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00d1e9, 0x000000,
+ /* b0 */ 0x00c5fe, 0x8fb3ba, 0x8fb3bb, 0x00d1ea,
+ /* b4 */ 0x000000, 0x8fb3bc, 0x00c0a9, 0x00bafe,
+ /* b8 */ 0x00b7f4, 0x00d1eb, 0x00bbc9, 0x00b9ef,
+ /* bc */ 0x8fb3bd,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x00f0f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00c4e6,
+ /* 84 */ 0x00d1ed, 0x8fb3be, 0x000000, 0x00c2a7,
+ /* 88 */ 0x000000, 0x8fb3bf, 0x00baef, 0x00d1ee,
+ /* 8c */ 0x00d1ef, 0x00c1b0, 0x000000, 0x00d1ec,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d1f1, 0x8fb3c0, 0x00cbb6, 0x8fb3c1,
+ /* 98 */ 0x8fb3c2, 0x000000, 0x8fb3c3, 0x00b9e4,
+ /* 9c */ 0x8fb3c4, 0x000000, 0x00d1f0, 0x8fb3c5,
+ /* a0 */ 0x8fb3c6, 0x8fb3c7, 0x000000, 0x00b7f5,
+ /* a4 */ 0x00bade, 0x00c7ed, 0x8fb3c8, 0x000000,
+ /* a8 */ 0x000000, 0x00d1f4, 0x00d1f2, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fb3c9, 0x00c9fb,
+ /* b0 */ 0x00beea, 0x00d1fb, 0x00b3e4, 0x00d1f5,
+ /* b4 */ 0x00d1f3, 0x00c1cf, 0x000000, 0x8fb3ca,
+ /* b8 */ 0x8fb3cb, 0x8fb3cc, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00d1f7, 0x000000, 0x00d1f6,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00f4f ***/
+
+ /* 80 */ 0x8fb3cd, 0x000000, 0x8fb3ce, 0x00b3c4,
+ /* 84 */ 0x000000, 0x8fb3cf, 0x000000, 0x00b7e0,
+ /* 88 */ 0x00d1fc, 0x00cead, 0x8fb3d0, 0x000000,
+ /* 8c */ 0x8fb3d1, 0x00d1f8, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00d1fd, 0x00d1fa, 0x8fb3d2,
+ /* 94 */ 0x00d1f9, 0x8fb3d3, 0x8fb3d4, 0x8fb3d5,
+ /* 98 */ 0x8fb3d6, 0x000000, 0x8fb3d7, 0x00cecf,
+ /* 9c */ 0x8fb3d8, 0x000000, 0x000000, 0x00b8f9,
+ /* a0 */ 0x00b2c3, 0x000000, 0x000000, 0x00cef4,
+ /* a4 */ 0x8fb3d9, 0x8fb3da, 0x8fb3db, 0x8fb3dc,
+ /* a8 */ 0x000000, 0x00bdf5, 0x00c5d8, 0x00b9e5,
+ /* ac */ 0x00d2a2, 0x00d2a3, 0x000000, 0x8fb3dd,
+ /* b0 */ 0x8fb3de, 0x00cee5, 0x000000, 0x000000,
+ /* b4 */ 0x00cfab, 0x00d2a5, 0x8fb3df, 0x8fb3e0,
+ /* b8 */ 0x8fb3e1, 0x00b8fa, 0x8fb3e2, 0x8fb3e3,
+ /* bc */ 0x00d2a4, 0x8fb3e4, 0x00b3af, 0x000000,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00f8f ***/
+
+ /* 80 */ 0x8fb3e5, 0x00d2a6, 0x000000, 0x00cbd6,
+ /* 84 */ 0x8fb3e6, 0x00c4bc, 0x8fb3e7, 0x00cda6,
+ /* 88 */ 0x8fb3e8, 0x00cad9, 0x000000, 0x000000,
+ /* 8c */ 0x8fb3e9, 0x00d2a7, 0x000000, 0x8fb3ea,
+ /* 90 */ 0x000000, 0x8fb3eb, 0x00f0d5, 0x000000,
+ /* 94 */ 0x8fb3ec, 0x00c6b0, 0x8fb3ed, 0x00d2a8,
+ /* 98 */ 0x00b4aa, 0x00ccb3, 0x000000, 0x8fb3ee,
+ /* 9c */ 0x8fb3ef, 0x00bea1, 0x00d2a9, 0x00cae7,
+ /* a0 */ 0x00d2ad, 0x8fb3f0, 0x00c0aa, 0x00d2aa,
+ /* a4 */ 0x00b6d0, 0x8fb3f1, 0x00d2ab, 0x00b4ab,
+ /* a8 */ 0x8fb3f2, 0x8fb3f3, 0x8fb3f4, 0x000000,
+ /* ac */ 0x8fb3f5, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fb3f6, 0x8fb3f7, 0x00b7ae, 0x00d2ae,
+ /* b4 */ 0x8fb3f8, 0x00d2af, 0x8fb3f9, 0x8fb3fa,
+ /* b8 */ 0x00d2b0, 0x00d2b1, 0x00bcdb, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00b8fb, 0x00ccde,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00fcf ***/
+
+ /* 80 */ 0x8fb3fb, 0x00cce8, 0x00c6f7, 0x8fb3fc,
+ /* 84 */ 0x000000, 0x00caf1, 0x00d2b2, 0x8ff4b2,
+ /* 88 */ 0x00d2b3, 0x000000, 0x8fb3fd, 0x8fb3fe,
+ /* 8c */ 0x8fb4a1, 0x00d2b5, 0x000000, 0x00d2b7,
+ /* 90 */ 0x00d2b6, 0x8fb4a2, 0x000000, 0x8fb4a3,
+ /* 94 */ 0x000000, 0x00d2b8, 0x00b2bd, 0x00cbcc,
+ /* 98 */ 0x8fb4a4, 0x00bafc, 0x00d2b9, 0x8fb4a5,
+ /* 9c */ 0x8fb4a6, 0x00c1d9, 0x8fb4a7, 0x8fb4a8,
+ /* a0 */ 0x00bea2, 0x00b6a9, 0x000000, 0x00d2ba,
+ /* a4 */ 0x8ff4b3, 0x8fb4a9, 0x000000, 0x8fb4aa,
+ /* a8 */ 0x8fb4ab, 0x8fb4ac, 0x00c8db, 0x8fb4ad,
+ /* ac */ 0x8fb4ae, 0x8fb4af, 0x000000, 0x00d2bb,
+ /* b0 */ 0x8fb4b0, 0x00d2bc, 0x8fb4b1, 0x00d2bd,
+ /* b4 */ 0x000000, 0x8fb4b2, 0x000000, 0x000000,
+ /* b8 */ 0x00d2be, 0x00c9a4, 0x00b6e8, 0x00b0e5,
+ /* bc */ 0x8fb4b3, 0x8fb4b4, 0x8fb4b5, 0x00c6bf,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x0100f ***/
+
+ /* 80 */ 0x00d2bf, 0x00bdbd, 0x8fb4b6, 0x00c0e9,
+ /* 84 */ 0x000000, 0x00d2c1, 0x00d2c0, 0x00bea3,
+ /* 88 */ 0x00b8e1, 0x00d2c3, 0x00c8be, 0x8fb4b8,
+ /* 8c */ 0x8fb4b7, 0x00d2c4, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00c8dc, 0x00c2b4, 0x00c2ee,
+ /* 94 */ 0x00b6a8, 0x000000, 0x000000, 0x00c6ee,
+ /* 98 */ 0x00c3b1, 0x8fb4b9, 0x00c7ee, 0x8fb4ba,
+ /* 9c */ 0x00cbce, 0x000000, 0x00d2c6, 0x000000,
+ /* a0 */ 0x00c0ea, 0x8fb4bb, 0x000000, 0x8fb4bc,
+ /* a4 */ 0x000000, 0x8fb4bd, 0x00b7b5, 0x000000,
+ /* a8 */ 0x000000, 0x00d2c7, 0x000000, 0x000000,
+ /* ac */ 0x8fb4be, 0x8fb4bf, 0x00d2c8, 0x00b1ac,
+ /* b0 */ 0x00b0f5, 0x00b4ed, 0x8fb4c0, 0x00c2a8,
+ /* b4 */ 0x00b5d1, 0x00cdf1, 0x000000, 0x00d2cb,
+ /* b8 */ 0x00b2b7, 0x8fb4c1, 0x000000, 0x00d2ca,
+ /* bc */ 0x000000, 0x000000, 0x8fb4c2, 0x00b6aa,
+
+ /*** Three byte table, leaf: e58exx - offset 0x0104f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d2cc, 0x8fb4c3,
+ /* 84 */ 0x00ccf1, 0x000000, 0x000000, 0x8fb4c4,
+ /* 88 */ 0x8fb4c5, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fb4c6, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8fb4c7,
+ /* 94 */ 0x8fb4c8, 0x000000, 0x00d2cd, 0x000000,
+ /* 98 */ 0x00ced2, 0x8fb4c9, 0x00b8fc, 0x000000,
+ /* 9c */ 0x000000, 0x8fb4ca, 0x000000, 0x00b8b6,
+ /* a0 */ 0x00d2ce, 0x8fb4cb, 0x000000, 0x000000,
+ /* a4 */ 0x8fb4cc, 0x00d2d0, 0x00d2cf, 0x000000,
+ /* a8 */ 0x00bfdf, 0x00b1b9, 0x8fb4cd, 0x8fb4ce,
+ /* ac */ 0x000000, 0x00b1de, 0x00d2d1, 0x8fb4cf,
+ /* b0 */ 0x00d2d2, 0x000000, 0x8fb4d0, 0x00b8b7,
+ /* b4 */ 0x8fb4d1, 0x8fb4d2, 0x00d2d3, 0x8fb4d3,
+ /* b8 */ 0x8fb4d4, 0x000000, 0x8fb4d5, 0x00b5ee,
+ /* bc */ 0x000000, 0x8fb4d6, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x0108f ***/
+
+ /* 80 */ 0x8fb4d7, 0x000000, 0x00bbb2, 0x00d2d4,
+ /* 84 */ 0x000000, 0x8fb4d8, 0x000000, 0x000000,
+ /* 88 */ 0x00cbf4, 0x00bab5, 0x00b5da, 0x00cda7,
+ /* 8c */ 0x00c1d0, 0x00c8bf, 0x00bcfd, 0x8fb4d9,
+ /* 90 */ 0x000000, 0x000000, 0x8fb4da, 0x8fb4db,
+ /* 94 */ 0x00bdc7, 0x8fb4dc, 0x00bce8, 0x00bcf5,
+ /* 98 */ 0x000000, 0x00bdf6, 0x8fb4dd, 0x00c8c0,
+ /* 9c */ 0x000000, 0x8fb4de, 0x8fb4df, 0x00d2d7,
+ /* a0 */ 0x8fb4e0, 0x00b1c3, 0x00c1d1, 0x00b8fd,
+ /* a4 */ 0x00b8c5, 0x00b6e7, 0x8fb4e1, 0x8fb4e2,
+ /* a8 */ 0x00d2db, 0x00c3a1, 0x00c2fe, 0x00b6ab,
+ /* ac */ 0x00bea4, 0x00d2dc, 0x00d2da, 0x00b2c4,
+ /* b0 */ 0x00c2e6, 0x00bcb8, 0x00bbcb, 0x00b1a6,
+ /* b4 */ 0x000000, 0x8fb4e3, 0x00b3f0, 0x00b9e6,
+ /* b8 */ 0x00bbca, 0x000000, 0x00d2dd, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x010ce ***/
+
+ /* 80 */ 0x000000, 0x00d2de, 0x8fb4e4, 0x00b5c9,
+ /* 84 */ 0x00b3c6, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00b9e7, 0x00b5c8, 0x00c4df, 0x00b1a5,
+ /* 8c */ 0x00c6b1, 0x00ccbe, 0x00b9a1, 0x00cdf9,
+ /* 90 */ 0x00c5c7, 0x00b8fe, 0x000000, 0x8fb4e5,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fb4e6, 0x00b7af,
+ /* 9c */ 0x000000, 0x00d2e7, 0x000000, 0x00b6e3,
+ /* a0 */ 0x00cbca, 0x8fb4e7, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00c8dd, 0x8fb4e8,
+ /* a8 */ 0x8fb4e9, 0x00d2e6, 0x8fb4ea, 0x00b4de,
+ /* ac */ 0x00d2e1, 0x00d2e2, 0x00d2e4, 0x8fb4eb,
+ /* b0 */ 0x000000, 0x8fb4ec, 0x000000, 0x000000,
+ /* b4 */ 0x8fb4ed, 0x8fb4ee, 0x00d2e5, 0x000000,
+ /* b8 */ 0x00b5db, 0x00bfe1, 0x000000, 0x00caad,
+ /* bc */ 0x00d2e3, 0x00d2df, 0x00b8e3, 0x000000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x0110e ***/
+
+ /* 80 */ 0x00d2e0, 0x000000, 0x00cfa4, 0x8fb4ef,
+ /* 84 */ 0x8fb4f0, 0x000000, 0x00caf2, 0x8fb4f1,
+ /* 88 */ 0x00c4e8, 0x00b8e2, 0x00b9f0, 0x000000,
+ /* 8c */ 0x000000, 0x8fb4f2, 0x00d2e8, 0x8fb4f3,
+ /* 90 */ 0x000000, 0x00c6dd, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fb4f4, 0x00d2ec,
+ /* a0 */ 0x000000, 0x000000, 0x8fb4f5, 0x000000,
+ /* a4 */ 0x8fb4f6, 0x000000, 0x8fb4f7, 0x8fb4f8,
+ /* a8 */ 0x00bcfe, 0x8fb4f9, 0x00bcf6, 0x8fb4fa,
+ /* ac */ 0x000000, 0x8fb4fb, 0x8fb4fc, 0x000000,
+ /* b0 */ 0x00d2ef, 0x00d2ed, 0x000000, 0x00cca3,
+ /* b4 */ 0x8fb4fd, 0x00d2ea, 0x00d2f3, 0x00d2ee,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00d2f1,
+ /* bc */ 0x00b8c6, 0x00ccbf, 0x000000, 0x8fb4fe,
+
+ /*** Three byte table, leaf: e592xx - offset 0x0114e ***/
+
+ /* 80 */ 0x00d2f2, 0x8fb5a1, 0x000000, 0x8fb5a2,
+ /* 84 */ 0x00d2f4, 0x8fb5a3, 0x00d2f6, 0x000000,
+ /* 88 */ 0x8fb5a4, 0x8fb5a5, 0x8ff4b5, 0x00baf0,
+ /* 8c */ 0x00cfc2, 0x8fb5a6, 0x00d2eb, 0x00d2e9,
+ /* 90 */ 0x00d2f5, 0x8fb5a7, 0x00d2f0, 0x000000,
+ /* 94 */ 0x000000, 0x8fb5a8, 0x8fb5a9, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fb5aa, 0x000000, 0x000000, 0x8fb5ab,
+ /* a0 */ 0x000000, 0x8fb5ac, 0x00d2f8, 0x000000,
+ /* a4 */ 0x00d3a3, 0x00d2fa, 0x8fb5ad, 0x8fb5ae,
+ /* a8 */ 0x00d2fe, 0x8fb5af, 0x8fb5b0, 0x00d3a1,
+ /* ac */ 0x00d2fb, 0x8fb5b1, 0x8fb5b2, 0x00d3be,
+ /* b0 */ 0x000000, 0x8fb5b3, 0x00bae9, 0x00b3b1,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fb5b4,
+ /* b8 */ 0x00d2f9, 0x8fb5b5, 0x8fb5b6, 0x8fb5b7,
+ /* bc */ 0x00d3a5, 0x00b0f6, 0x00d3a4, 0x8fb5b8,
+
+ /*** Three byte table, leaf: e593xx - offset 0x0118e ***/
+
+ /* 80 */ 0x00b0a5, 0x00c9ca, 0x00d3a2, 0x000000,
+ /* 84 */ 0x00d2fc, 0x000000, 0x8fb5b9, 0x00d2f7,
+ /* 88 */ 0x00d2fd, 0x00bac8, 0x8fb5ba, 0x000000,
+ /* 8c */ 0x000000, 0x8fb5bb, 0x8fb5bc, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00d3a6, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fb5bd, 0x00b0f7, 0x00d3af, 0x000000,
+ /* a4 */ 0x000000, 0x00d3a7, 0x00d3a8, 0x000000,
+ /* a8 */ 0x00bea5, 0x00cbe9, 0x8fb5be, 0x000000,
+ /* ac */ 0x8fb5bf, 0x00d3ad, 0x00d3ac, 0x8fb5c0,
+ /* b0 */ 0x000000, 0x000000, 0x00c5af, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fb5c1, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d3ae, 0x000000,
+ /* bc */ 0x8fb5c2, 0x00d3ab, 0x8fb5c3, 0x8fb5c4,
+
+ /*** Three byte table, leaf: e594xx - offset 0x011ce ***/
+
+ /* 80 */ 0x8fb5c5, 0x8fb5c6, 0x000000, 0x000000,
+ /* 84 */ 0x00b1b4, 0x8fb5c7, 0x00bab6, 0x00bfb0,
+ /* 88 */ 0x8fb5c8, 0x8fb5c9, 0x000000, 0x000000,
+ /* 8c */ 0x8fb5ca, 0x8fb5cb, 0x8fb5cc, 0x00d3a9,
+ /* 90 */ 0x00c5e2, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d3aa, 0x8fb5cd, 0x00b0a2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fb5ce, 0x8fb5cf,
+ /* ac */ 0x000000, 0x000000, 0x00d3b4, 0x00cda3,
+ /* b0 */ 0x000000, 0x00bea7, 0x8fb5d0, 0x00d3ba,
+ /* b4 */ 0x000000, 0x8fb5d1, 0x8fb5d2, 0x000000,
+ /* b8 */ 0x00d3b9, 0x00d3b0, 0x000000, 0x8fb5d3,
+ /* bc */ 0x8fb5d4, 0x8fb5d5, 0x00c2c3, 0x000000,
+
+ /*** Three byte table, leaf: e595xx - offset 0x0120e ***/
+
+ /* 80 */ 0x00d3b1, 0x8fb5d6, 0x000000, 0x000000,
+ /* 84 */ 0x00c2ef, 0x00d3b6, 0x00bea6, 0x8fb5d7,
+ /* 88 */ 0x000000, 0x8fb5d8, 0x8fb5d9, 0x000000,
+ /* 8c */ 0x00d3b3, 0x8fb5da, 0x000000, 0x00cce4,
+ /* 90 */ 0x8fb5db, 0x8fb5dc, 0x000000, 0x00b7bc,
+ /* 94 */ 0x000000, 0x000000, 0x00d3b7, 0x00d3b8,
+ /* 98 */ 0x8fb5dd, 0x000000, 0x8fb5de, 0x8fb5df,
+ /* 9c */ 0x00d3b5, 0x00d3bb, 0x8fb5e0, 0x000000,
+ /* a0 */ 0x8fb5e1, 0x8fb5e2, 0x000000, 0x00d3b2,
+ /* a4 */ 0x8fb5e3, 0x000000, 0x8fb5e4, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00d3c1,
+ /* bc */ 0x00d3c6, 0x000000, 0x00d3c2, 0x8fb5e5,
+
+ /*** Three byte table, leaf: e596xx - offset 0x0124e ***/
+
+ /* 80 */ 0x00d3bd, 0x8fb5e6, 0x8fb5e7, 0x00d3c7,
+ /* 84 */ 0x00c1b1, 0x000000, 0x8fb5e8, 0x00d3c9,
+ /* 88 */ 0x8fb5e9, 0x00b9a2, 0x00d3bf, 0x00c3fd,
+ /* 8c */ 0x000000, 0x000000, 0x8fb5ea, 0x8fb5eb,
+ /* 90 */ 0x000000, 0x8fb5ec, 0x8fb5ed, 0x8fb5ee,
+ /* 94 */ 0x8fb5ef, 0x000000, 0x000000, 0x8fb5f0,
+ /* 98 */ 0x00d3c3, 0x00d3bc, 0x00b4ad, 0x000000,
+ /* 9c */ 0x00b4ee, 0x00b3e5, 0x00d3c4, 0x00d3c0,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fb5f1,
+ /* a4 */ 0x8fb5f2, 0x000000, 0x000000, 0x00b7f6,
+ /* a8 */ 0x00d3ca, 0x00d3c8, 0x00c1d3, 0x00b5ca,
+ /* ac */ 0x00b6ac, 0x8fb5f3, 0x00d3c5, 0x000000,
+ /* b0 */ 0x00b6f4, 0x000000, 0x8fb5f4, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b1c4, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fb5f5,
+
+ /*** Three byte table, leaf: e597xx - offset 0x0128e ***/
+
+ /* 80 */ 0x000000, 0x8fb5f6, 0x000000, 0x8fb5f7,
+ /* 84 */ 0x00d3ce, 0x00d3cc, 0x8fb5f8, 0x00d4a7,
+ /* 88 */ 0x000000, 0x8fb5f9, 0x000000, 0x8fb5fa,
+ /* 8c */ 0x8fb5fb, 0x000000, 0x8fb5fc, 0x000000,
+ /* 90 */ 0x000000, 0x8fb5fd, 0x8fb5fe, 0x8fb6a1,
+ /* 94 */ 0x00d3d1, 0x000000, 0x000000, 0x8fb6a2,
+ /* 98 */ 0x8fb6a3, 0x000000, 0x00d3cb, 0x8fb6a4,
+ /* 9c */ 0x00d3cf, 0x000000, 0x8fb6a5, 0x00d3cd,
+ /* a0 */ 0x000000, 0x000000, 0x8fb6a6, 0x00bbcc,
+ /* a4 */ 0x00d3d0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fb6a7, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fb6a8, 0x00d3d3,
+ /* b8 */ 0x000000, 0x00d3d8, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00d3d6, 0x00d3d5, 0x8fb6a9,
+
+ /*** Three byte table, leaf: e598xx - offset 0x012ce ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fb6aa, 0x00c3b2, 0x000000,
+ /* 88 */ 0x8fb6ab, 0x00b2c5, 0x8fb6ac, 0x000000,
+ /* 8c */ 0x000000, 0x8fb6ad, 0x8fb6ae, 0x8fb6af,
+ /* 90 */ 0x8fb6b0, 0x8fb6b1, 0x8fb6b2, 0x000000,
+ /* 94 */ 0x00d3d2, 0x000000, 0x00d3d4, 0x00bea8,
+ /* 98 */ 0x00b1b3, 0x8fb6b3, 0x000000, 0x00d3d7,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00b2de, 0x000000, 0x000000,
+ /* ac */ 0x8fb6b4, 0x000000, 0x000000, 0x00d3e2,
+ /* b0 */ 0x8fb6b5, 0x00befc, 0x00d3de, 0x8fb6b6,
+ /* b4 */ 0x00d3dc, 0x8fb6b7, 0x00d3dd, 0x8fb6b8,
+ /* b8 */ 0x00d3df, 0x8fb6b9, 0x000000, 0x8fb6ba,
+ /* bc */ 0x8fb6bb, 0x8fb6bc, 0x000000, 0x8fb6bd,
+
+ /*** Three byte table, leaf: e599xx - offset 0x0130e ***/
+
+ /* 80 */ 0x8fb6be, 0x8fb6bf, 0x00b1bd, 0x8fb6c0,
+ /* 84 */ 0x8fb6c1, 0x000000, 0x8fb6c2, 0x000000,
+ /* 88 */ 0x000000, 0x8fb6c3, 0x000000, 0x8fb6c4,
+ /* 8c */ 0x00c1b9, 0x8fb6c5, 0x00d3d9, 0x8fb6c6,
+ /* 90 */ 0x00d3da, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fb6c7, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00b3fa,
+ /* 9c */ 0x000000, 0x000000, 0x8fb6c8, 0x000000,
+ /* a0 */ 0x8fb6c9, 0x8fb6ca, 0x8fb6cb, 0x8fb6cc,
+ /* a4 */ 0x00d3e1, 0x000000, 0x8fb6cd, 0x000000,
+ /* a8 */ 0x00b4ef, 0x8fb6ce, 0x00d3e4, 0x00d3e0,
+ /* ac */ 0x00d3e3, 0x8fb6cf, 0x000000, 0x8fb6d0,
+ /* b0 */ 0x000000, 0x8fb6d1, 0x8fb6d2, 0x000000,
+ /* b4 */ 0x00caae, 0x8fb6d3, 0x000000, 0x000000,
+ /* b8 */ 0x00c6d5, 0x000000, 0x00c8b8, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59axx - offset 0x0134e ***/
+
+ /* 80 */ 0x00d3e6, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fb6d4, 0x8fb6d5, 0x00d3e5, 0x00b3c5,
+ /* 88 */ 0x8fb6d6, 0x000000, 0x00d3e7, 0x8fb6d7,
+ /* 8c */ 0x8fb6d8, 0x000000, 0x000000, 0x00d3ea,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00d3e9, 0x8fb6d9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fb6da, 0x8fb6db, 0x000000,
+ /* 9c */ 0x000000, 0x8fb6dc, 0x8fb6dd, 0x8fb6de,
+ /* a0 */ 0x00d3e8, 0x000000, 0x00c7b9, 0x000000,
+ /* a4 */ 0x000000, 0x00d3eb, 0x8fb6df, 0x8fb6e0,
+ /* a8 */ 0x8fb6e1, 0x8fb6e2, 0x000000, 0x8fb6e3,
+ /* ac */ 0x8fb6e4, 0x8fb6e5, 0x00d3ec, 0x000000,
+ /* b0 */ 0x000000, 0x8fb6e6, 0x000000, 0x8fb6e7,
+ /* b4 */ 0x00d3ee, 0x000000, 0x00d3ed, 0x8fb6e8,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00d3f0, 0x000000, 0x8fb6e9, 0x000000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x0138e ***/
+
+ /* 80 */ 0x00d3f3, 0x00d3f1, 0x00d3ef, 0x00d3f2,
+ /* 84 */ 0x000000, 0x8fb6ea, 0x000000, 0x000000,
+ /* 88 */ 0x00d3f4, 0x8fb6eb, 0x8fb6ec, 0x8fb6ed,
+ /* 8c */ 0x8fb6f0, 0x8fb6f1, 0x00d3f5, 0x8fb6ee,
+ /* 90 */ 0x8fb6ef, 0x00d3f6, 0x000000, 0x00d3f7,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00d3f8,
+ /* 98 */ 0x00d1c5, 0x8fb6f2, 0x00bcfc, 0x00bbcd,
+ /* 9c */ 0x8fb6f3, 0x8fb6f4, 0x00b2f3, 0x8fb6f5,
+ /* a0 */ 0x00b0f8, 0x8fb6f6, 0x000000, 0x00c3c4,
+ /* a4 */ 0x8fb6f7, 0x8fb6f8, 0x8fb6f9, 0x8fb6fa,
+ /* a8 */ 0x8fb6fb, 0x000000, 0x000000, 0x8fb6fd,
+ /* ac */ 0x000000, 0x8fb6fe, 0x00d3f9, 0x000000,
+ /* b0 */ 0x00baa4, 0x8fb6fc, 0x00b0cf, 0x00bfde,
+ /* b4 */ 0x000000, 0x000000, 0x8fb7a1, 0x8fb7a2,
+ /* b8 */ 0x000000, 0x00d3fa, 0x00b8c7, 0x000000,
+ /* bc */ 0x000000, 0x00b9f1, 0x000000, 0x00d3fc,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x013ce ***/
+
+ /* 80 */ 0x00d3fb, 0x8fb7a3, 0x8fb7a4, 0x00cae0,
+ /* 84 */ 0x00d3fd, 0x000000, 0x000000, 0x8fb7a5,
+ /* 88 */ 0x00d4a1, 0x00d3fe, 0x8fb7a6, 0x00d4a2,
+ /* 8c */ 0x8fb7a7, 0x00d4a3, 0x000000, 0x00b7f7,
+ /* 90 */ 0x000000, 0x8fb7a8, 0x00b1e0, 0x00d4a4,
+ /* 94 */ 0x000000, 0x8fb7a9, 0x00d4a6, 0x000000,
+ /* 98 */ 0x00d4a5, 0x000000, 0x8fb7aa, 0x8fb7ab,
+ /* 9c */ 0x00d4a8, 0x8fb7ac, 0x000000, 0x00c5da,
+ /* a0 */ 0x8fb7ad, 0x000000, 0x8fb7ae, 0x8fb7af,
+ /* a4 */ 0x8fb7b0, 0x8fb7b1, 0x00d4a9, 0x00b0b5,
+ /* a8 */ 0x00badf, 0x8fb7b2, 0x8fb7b3, 0x000000,
+ /* ac */ 0x8fb7b4, 0x00b7bd, 0x8fb7b5, 0x8fb7b6,
+ /* b0 */ 0x00c3cf, 0x000000, 0x000000, 0x8fb7b7,
+ /* b4 */ 0x8fb7b8, 0x000000, 0x000000, 0x00d4aa,
+ /* b8 */ 0x00d4ab, 0x000000, 0x000000, 0x00d4ad,
+ /* bc */ 0x000000, 0x8fb7b9, 0x8fb7ba, 0x8fb7bb,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x0140e ***/
+
+ /* 80 */ 0x00d4ae, 0x000000, 0x00bae4, 0x000000,
+ /* 84 */ 0x000000, 0x8fb7bc, 0x8fb7bd, 0x00b6d1,
+ /* 88 */ 0x000000, 0x000000, 0x00cbb7, 0x000000,
+ /* 8c */ 0x8fb7be, 0x8fb7bf, 0x00d4ac, 0x00d4af,
+ /* 90 */ 0x00bac1, 0x00b9a3, 0x8fb7c0, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8ff4b6, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00d4b3, 0x8fb7c1, 0x000000,
+ /* a4 */ 0x00baa5, 0x8fb7c2, 0x00c3b3, 0x8fb7c3,
+ /* a8 */ 0x8fb7c4, 0x00d4b0, 0x00c4da, 0x8fb7c5,
+ /* ac */ 0x000000, 0x8fb7c6, 0x8fb7c7, 0x8fb7c8,
+ /* b0 */ 0x8fb7c9, 0x8fb7ca, 0x000000, 0x8fb7cb,
+ /* b4 */ 0x8fb7cc, 0x8fb7cd, 0x000000, 0x8fb7ce,
+ /* b8 */ 0x000000, 0x8fb7cf, 0x8fb7d0, 0x8fb7d1,
+ /* bc */ 0x8fb7d2, 0x000000, 0x8fb7d3, 0x00d4b4,
+
+ /*** Three byte table, leaf: e59exx - offset 0x0144e ***/
+
+ /* 80 */ 0x000000, 0x8fb7d4, 0x00bfe2, 0x8fb7d5,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00d4b2, 0x00d4b5, 0x000000, 0x00b7bf,
+ /* 8c */ 0x8fb7d6, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00d4b6,
+ /* 94 */ 0x8fb7d7, 0x8fb7e0, 0x000000, 0x8fb7d8,
+ /* 98 */ 0x000000, 0x8fb7d9, 0x8fb7da, 0x000000,
+ /* 9c */ 0x8fb7db, 0x8fb7dc, 0x8fb7dd, 0x8fb7de,
+ /* a0 */ 0x00d4b7, 0x8fb7df, 0x00b9a4, 0x00b3c0,
+ /* a4 */ 0x00d4b9, 0x000000, 0x000000, 0x8fb7e1,
+ /* a8 */ 0x8fb7e2, 0x8fb7e3, 0x00d4ba, 0x000000,
+ /* ac */ 0x8fb7e4, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d4bb, 0x000000, 0x000000, 0x00d4b8,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fb7e5, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fb7e6, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x0148e ***/
+
+ /* 80 */ 0x00d4b1, 0x000000, 0x000000, 0x00d4bc,
+ /* 84 */ 0x000000, 0x000000, 0x00d4bd, 0x8fb7e7,
+ /* 88 */ 0x8fb7e8, 0x000000, 0x000000, 0x00cbe4,
+ /* 8c */ 0x8fb7e9, 0x000000, 0x00beeb, 0x8fb7ea,
+ /* 90 */ 0x000000, 0x000000, 0x00d4bf, 0x00d4c0,
+ /* 94 */ 0x00d4be, 0x8fb7eb, 0x00d4c2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c7b8, 0x8fb7ec, 0x8fb7ed, 0x00b0e8,
+ /* a0 */ 0x00c9d6, 0x8fb7fe, 0x000000, 0x00d4c3,
+ /* a4 */ 0x8fb7ee, 0x000000, 0x8fb7ef, 0x8fb7f0,
+ /* a8 */ 0x000000, 0x8fb7f1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fb7f2, 0x000000, 0x000000,
+ /* b0 */ 0x8fb7f3, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00befd, 0x8fb7f4, 0x8fb7f5, 0x00bcb9,
+ /* b8 */ 0x8fb7f6, 0x00c7dd, 0x00b4f0, 0x000000,
+ /* bc */ 0x00baeb, 0x8fb7f7, 0x8fb7f8, 0x8fb7f9,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x014ce ***/
+
+ /* 80 */ 0x00cbd9, 0x000000, 0x00c6b2, 0x8fb7fa,
+ /* 84 */ 0x8fb7fb, 0x00b7f8, 0x00c2cf, 0x000000,
+ /* 88 */ 0x8fb7fc, 0x8fb7fd, 0x00d4c1, 0x00d4c4,
+ /* 8c */ 0x8fb8a1, 0x8fb8a2, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c2c4, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d4c5, 0x000000, 0x8fb8a3,
+ /* 9c */ 0x000000, 0x00d4c6, 0x8fb8a4, 0x8fb8a5,
+ /* a0 */ 0x8fb8a6, 0x00d4c8, 0x000000, 0x000000,
+ /* a4 */ 0x00c4e9, 0x000000, 0x8fb8a7, 0x8fb8a8,
+ /* a8 */ 0x000000, 0x000000, 0x00b4ae, 0x000000,
+ /* ac */ 0x000000, 0x8fb8a9, 0x000000, 0x00f4a1,
+ /* b0 */ 0x00b1e1, 0x00caf3, 0x8fb8aa, 0x000000,
+ /* b4 */ 0x00beec, 0x00c5c8, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fb8ab, 0x00bae6, 0x000000,
+ /* bc */ 0x000000, 0x00d4ce, 0x000000, 0x8fb8ac,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x0150e ***/
+
+ /* 80 */ 0x00cabd, 0x00cedd, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8fb8ad, 0x00b2f4, 0x00d4ca,
+ /* 8c */ 0x8fb8ae, 0x8fb8af, 0x000000, 0x8fb8b0,
+ /* 90 */ 0x8fb8b1, 0x00c1ba, 0x00d4cd, 0x000000,
+ /* 94 */ 0x00c5e3, 0x8fb8b2, 0x000000, 0x00c5c9,
+ /* 98 */ 0x00c5e4, 0x00c8b9, 0x00c4cd, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00bac9, 0x8fb8b3,
+ /* a0 */ 0x000000, 0x8fb8b4, 0x00d4c9, 0x000000,
+ /* a4 */ 0x8fb8b5, 0x000000, 0x000000, 0x8fb8b6,
+ /* a8 */ 0x8fb8b7, 0x00b1f6, 0x000000, 0x00c5b6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d4cb, 0x000000, 0x00d4c7, 0x000000,
+ /* b4 */ 0x000000, 0x00bfd0, 0x000000, 0x000000,
+ /* b8 */ 0x8fb8b8, 0x00d4cf, 0x000000, 0x000000,
+ /* bc */ 0x8fb8b9, 0x000000, 0x00bdce, 0x8fb8ba,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x0154e ***/
+
+ /* 80 */ 0x8fb8bb, 0x8fb8bc, 0x000000, 0x00b6ad,
+ /* 84 */ 0x000000, 0x00d4d0, 0x000000, 0x8fb8bd,
+ /* 88 */ 0x8fb8be, 0x8fb8bf, 0x8fb8c0, 0x000000,
+ /* 8c */ 0x8fb8c1, 0x8fb8c2, 0x000000, 0x8fb8c3,
+ /* 90 */ 0x8fb8c4, 0x000000, 0x000000, 0x00cae8,
+ /* 94 */ 0x8fb8c5, 0x000000, 0x8fb8c6, 0x00c1fd,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c4c6, 0x8fb8c7, 0x8ff4b9, 0x00d4d2,
+ /* a0 */ 0x8fb8c8, 0x8fb8c9, 0x8fb8ca, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fb8cb, 0x000000,
+ /* a8 */ 0x00cbcf, 0x8fb8cc, 0x000000, 0x00d4d3,
+ /* ac */ 0x000000, 0x000000, 0x00d4d8, 0x000000,
+ /* b0 */ 0x000000, 0x8fb8cd, 0x8fb8ce, 0x00caaf,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00d4d7, 0x00d4d1, 0x00d4d4, 0x00d4d6,
+ /* bc */ 0x8fb8d0, 0x000000, 0x00baa6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x0158d ***/
+
+ /* 80 */ 0x000000, 0x00cac9, 0x8fb8d1, 0x000000,
+ /* 84 */ 0x8fb8cf, 0x00d4d9, 0x000000, 0x00c3c5,
+ /* 88 */ 0x8fb8d2, 0x000000, 0x00b2f5, 0x000000,
+ /* 8c */ 0x00beed, 0x8fb8d3, 0x8fb8d4, 0x000000,
+ /* 90 */ 0x8fb8d5, 0x00d4db, 0x8fb8d6, 0x00d4da,
+ /* 94 */ 0x8fb8d7, 0x00b9e8, 0x8fb8d8, 0x00d4dc,
+ /* 98 */ 0x00d4de, 0x00d4dd, 0x8fb8d9, 0x000000,
+ /* 9c */ 0x00d4e0, 0x8fb8da, 0x00d4d5, 0x00d4e2,
+ /* a0 */ 0x000000, 0x8fb8db, 0x8fb8dc, 0x000000,
+ /* a4 */ 0x00d4e1, 0x00d4df, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fb8dd, 0x000000, 0x00bbce,
+ /* ac */ 0x00bfd1, 0x000000, 0x00c1d4, 0x00d4e3,
+ /* b0 */ 0x00c0bc, 0x00b0ed, 0x00c7e4, 0x8fb8de,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c4db,
+ /* b8 */ 0x000000, 0x00d4e5, 0x00d4e4, 0x00d4e6,
+ /* bc */ 0x00d4e7, 0x00d4e8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x015cb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d4e9, 0x000000,
+ /* 84 */ 0x000000, 0x8fb8df, 0x8fb8e0, 0x000000,
+ /* 88 */ 0x000000, 0x00cad1, 0x00d4ea, 0x8fb8e1,
+ /* 8c */ 0x8fb8e2, 0x000000, 0x000000, 0x00b2c6,
+ /* 90 */ 0x00d4eb, 0x000000, 0x8fb8e3, 0x8fb8e4,
+ /* 94 */ 0x8fb8e5, 0x00cdbc, 0x00b3b0, 0x000000,
+ /* 98 */ 0x00d2c9, 0x00bdc8, 0x00c2bf, 0x00d4ec,
+ /* 9c */ 0x00cceb, 0x8fb8e7, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fb8e8, 0x00ccb4, 0x8fb8e9,
+ /* a4 */ 0x8fb8ea, 0x00d4ee, 0x000000, 0x00c2e7,
+ /* a8 */ 0x8fb8eb, 0x00c5b7, 0x00c2c0, 0x00c9d7,
+ /* ac */ 0x00d4ef, 0x00d4f0, 0x00b1fb, 0x8fb8ec,
+ /* b0 */ 0x8fb8ed, 0x00bcba, 0x00d4f1, 0x8fb8ee,
+ /* b4 */ 0x000000, 0x8fb8ef, 0x8fb8f0, 0x00b0d0,
+ /* b8 */ 0x00d4f2, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00d4f3, 0x8fb8f1,
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x0160b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fb8f2,
+ /* 84 */ 0x00b1e2, 0x000000, 0x8fb8f3, 0x00b4f1,
+ /* 88 */ 0x00c6e0, 0x00caf4, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00d4f7, 0x00c1d5,
+ /* 90 */ 0x00d4f6, 0x00b7c0, 0x8fb8f4, 0x8fb8f5,
+ /* 94 */ 0x00cbdb, 0x00d4f5, 0x000000, 0x00c5e5,
+ /* 98 */ 0x00d4f9, 0x8fb8f6, 0x00d4f8, 0x8fb8f7,
+ /* 9c */ 0x000000, 0x8fb8f8, 0x8fb8f9, 0x8fb8fa,
+ /* a0 */ 0x00d4fb, 0x8fb8fb, 0x00d4fa, 0x8fb8fc,
+ /* a4 */ 0x000000, 0x00b1fc, 0x000000, 0x00d4fc,
+ /* a8 */ 0x00bea9, 0x00d4fe, 0x00c3a5, 0x8fb8fd,
+ /* ac */ 0x00d4fd, 0x8fb8fe, 0x00cab3, 0x8fb9a1,
+ /* b0 */ 0x000000, 0x000000, 0x8fb9a2, 0x00bdf7,
+ /* b4 */ 0x00c5db, 0x8fb9a3, 0x8fb9a4, 0x000000,
+ /* b8 */ 0x00d5a1, 0x8fb9a5, 0x000000, 0x8fb9a6,
+ /* bc */ 0x8fb9a7, 0x00b9a5, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x0164a ***/
+
+ /* 80 */ 0x000000, 0x00d5a2, 0x00c7a1, 0x00c8de,
+ /* 84 */ 0x00ccd1, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00c7a5, 0x8fb9a8,
+ /* 8c */ 0x8fb9a9, 0x00d5ab, 0x8fb9aa, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fb9ab, 0x00b5b8,
+ /* 94 */ 0x000000, 0x8fb9ac, 0x00cdc5, 0x8fb9ad,
+ /* 98 */ 0x000000, 0x00ccaf, 0x000000, 0x00d6ac,
+ /* 9c */ 0x000000, 0x00d5a3, 0x000000, 0x8fb9ae,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00d5a6,
+ /* a4 */ 0x8fb9af, 0x00c2c5, 0x000000, 0x8fb9b0,
+ /* a8 */ 0x00cbb8, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c5ca, 0x8fb9b1, 0x8fb9b2, 0x8fb9b3,
+ /* b0 */ 0x8fb9b4, 0x000000, 0x00d5a7, 0x8fb9b5,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fb9b6,
+ /* b8 */ 0x000000, 0x00cbe5, 0x8fb9b7, 0x00baca,
+ /* bc */ 0x8fb9b8, 0x000000, 0x00beaa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x01689 ***/
+
+ /* 80 */ 0x000000, 0x8fb9b9, 0x000000, 0x8fb9ba,
+ /* 84 */ 0x8fb9bb, 0x000000, 0x00d5a8, 0x000000,
+ /* 88 */ 0x8fb9bc, 0x00bbd0, 0x8fb9bd, 0x00bbcf,
+ /* 8c */ 0x000000, 0x8fb9be, 0x000000, 0x000000,
+ /* 90 */ 0x00b0b9, 0x00b8c8, 0x8fb9bf, 0x00c0ab,
+ /* 94 */ 0x00b0d1, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00d5ac, 0x00d5ad, 0x000000,
+ /* 9c */ 0x00d5aa, 0x8fb9c0, 0x8fb9c1, 0x8fb9c2,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fb9c3,
+ /* a4 */ 0x8fb9c4, 0x00b1b8, 0x00b4af, 0x8fb9c5,
+ /* a8 */ 0x00d5a9, 0x000000, 0x00ccc5, 0x00c9b1,
+ /* ac */ 0x000000, 0x000000, 0x8fb9c6, 0x8fb9c7,
+ /* b0 */ 0x000000, 0x8fb9c8, 0x8fb9c9, 0x000000,
+ /* b4 */ 0x8fb9ca, 0x000000, 0x00b0a8, 0x8fb9cb,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00b0f9,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00bbd1,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x016c9 ***/
+
+ /* 80 */ 0x8fb9cc, 0x00b0d2, 0x000000, 0x00b0a3,
+ /* 84 */ 0x8fb9cd, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d5b2, 0x000000, 0x000000,
+ /* 8c */ 0x8fb9ce, 0x8fb9cf, 0x8fb9d0, 0x000000,
+ /* 90 */ 0x000000, 0x00d5b0, 0x8fb9d1, 0x8fb9d2,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00ccbc, 0x000000, 0x00d5b3, 0x000000,
+ /* 9c */ 0x00d5b1, 0x000000, 0x8fb9d3, 0x00d5af,
+ /* a0 */ 0x00bfb1, 0x000000, 0x000000, 0x8fb9d4,
+ /* a4 */ 0x8fb9d5, 0x00d5ae, 0x000000, 0x8fb9d6,
+ /* a8 */ 0x8fb9d7, 0x00cada, 0x8fb9d8, 0x000000,
+ /* ac */ 0x000000, 0x8fb9d9, 0x000000, 0x00b8e4,
+ /* b0 */ 0x8fb9da, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00d5b7, 0x00d5b8, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00beab, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01709 ***/
+
+ /* 80 */ 0x00d5b4, 0x00cfac, 0x000000, 0x000000,
+ /* 84 */ 0x8fb9db, 0x8fb9dc, 0x00c7cc, 0x8fb9dd,
+ /* 88 */ 0x8fb9de, 0x00d5b6, 0x000000, 0x000000,
+ /* 8c */ 0x8fb9df, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fb9e0, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fb9e1, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00baa7, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fb9e2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00d5b9, 0x8fb9e3,
+ /* a4 */ 0x000000, 0x8fb9e4, 0x00c9d8, 0x8fb9e5,
+ /* a8 */ 0x000000, 0x000000, 0x00d5ba, 0x000000,
+ /* ac */ 0x00d5b5, 0x8fb9e6, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fb9e7,
+ /* b8 */ 0x000000, 0x000000, 0x8fb9e8, 0x8fb9e9,
+ /* bc */ 0x000000, 0x000000, 0x8fb9ea, 0x00ccbb,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x01749 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fb9eb,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fb9ec, 0x000000, 0x00c7de, 0x8fb9ed,
+ /* 94 */ 0x000000, 0x000000, 0x8fb9ee, 0x000000,
+ /* 98 */ 0x000000, 0x8fb9ef, 0x00d5bb, 0x00c9b2,
+ /* 9c */ 0x8fb9f0, 0x000000, 0x8fb9f1, 0x8fb9f2,
+ /* a0 */ 0x8fb9f3, 0x000000, 0x8fb9f4, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fb9f5,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fb9f6, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fb9f7, 0x8fb9f8, 0x8fb9f9,
+ /* b4 */ 0x000000, 0x8fb9fa, 0x000000, 0x000000,
+ /* b8 */ 0x8fb9fb, 0x000000, 0x8fb9fc, 0x8fb9fd,
+ /* bc */ 0x00d5bc, 0x00d5c0, 0x00d5bd, 0x8fb9fe,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x01789 ***/
+
+ /* 80 */ 0x000000, 0x00b2c7, 0x00d5bf, 0x000000,
+ /* 84 */ 0x8fbaa1, 0x000000, 0x8fbaa2, 0x000000,
+ /* 88 */ 0x8fbaa3, 0x00bcbb, 0x000000, 0x00d5be,
+ /* 8c */ 0x00b7f9, 0x000000, 0x000000, 0x8fbaa4,
+ /* 90 */ 0x00d5cc, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00d5c5, 0x00d5c2,
+ /* 98 */ 0x000000, 0x000000, 0x8fbaa5, 0x000000,
+ /* 9c */ 0x8fbaa6, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fbaa7, 0x00c3e4, 0x000000, 0x00d5c1,
+ /* a4 */ 0x000000, 0x8fbaa8, 0x00d5c3, 0x000000,
+ /* a8 */ 0x000000, 0x00d5c4, 0x8fbaa9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fbaaa, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fbaab, 0x8fbaac, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d5c6, 0x00d5c7,
+ /* bc */ 0x000000, 0x8fbaad, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x017c9 ***/
+
+ /* 80 */ 0x8fbaae, 0x8fbaaf, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fbab0, 0x00b4f2, 0x000000, 0x00d5c9,
+ /* 8c */ 0x00d5c8, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00d5ca, 0x8fbab1,
+ /* 98 */ 0x000000, 0x8fbab3, 0x000000, 0x8fbab4,
+ /* 9c */ 0x000000, 0x8fbab5, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fbab6, 0x00beee, 0x000000,
+ /* a4 */ 0x000000, 0x8fbab7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00d5cd, 0x000000,
+ /* ac */ 0x00c4dc, 0x8fbab8, 0x000000, 0x000000,
+ /* b0 */ 0x00b1c5, 0x000000, 0x00d5cb, 0x000000,
+ /* b4 */ 0x8fbab2, 0x000000, 0x00d5ce, 0x000000,
+ /* b8 */ 0x8fbab9, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00d5cf, 0x000000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01809 ***/
+
+ /* 80 */ 0x00d5d2, 0x8fbaba, 0x000000, 0x00d5d0,
+ /* 84 */ 0x000000, 0x00d5d1, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fbabb,
+ /* 8c */ 0x8fbabc, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bbd2, 0x00d5d3, 0x8fbabd, 0x000000,
+ /* 94 */ 0x00b9a6, 0x00d5d4, 0x8fbabe, 0x00bbfa,
+ /* 98 */ 0x00c2b8, 0x000000, 0x00d5d5, 0x00d5d6,
+ /* 9c */ 0x00bbda, 0x00b9a7, 0x8fbabf, 0x00ccd2,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00b5a8,
+ /* a4 */ 0x00b8c9, 0x00d5d7, 0x00b3d8, 0x000000,
+ /* a8 */ 0x8fbac0, 0x00d5d8, 0x000000, 0x00c2b9,
+ /* ac */ 0x000000, 0x000000, 0x8fbac1, 0x8fbac2,
+ /* b0 */ 0x00d5d9, 0x00d6a3, 0x000000, 0x00d5da,
+ /* b4 */ 0x000000, 0x00d5db, 0x000000, 0x000000,
+ /* b8 */ 0x00d5dc, 0x000000, 0x00d5de, 0x000000,
+ /* bc */ 0x8fbac3, 0x8fbac4, 0x8fbac5, 0x8fbac6,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01849 ***/
+
+ /* 80 */ 0x00d5df, 0x8fbac7, 0x000000, 0x00d5e0,
+ /* 84 */ 0x8fbac8, 0x00c2f0, 0x8fbac9, 0x00b1a7,
+ /* 88 */ 0x00bce9, 0x00b0c2, 0x8fbaca, 0x00c1d7,
+ /* 8c */ 0x00b4b0, 0x00bcb5, 0x8fbacb, 0x00b9a8,
+ /* 90 */ 0x8fbacc, 0x8fbacd, 0x000000, 0x8fbace,
+ /* 94 */ 0x8fbacf, 0x00c5e6, 0x8fbad0, 0x00bda1,
+ /* 98 */ 0x00b4b1, 0x00c3e8, 0x00c4ea, 0x00b0b8,
+ /* 9c */ 0x00b5b9, 0x00caf5, 0x000000, 0x00bcc2,
+ /* a0 */ 0x000000, 0x000000, 0x00b5d2, 0x00c0eb,
+ /* a4 */ 0x00bcbc, 0x00cda8, 0x00d5e1, 0x000000,
+ /* a8 */ 0x8fbad1, 0x8fbad2, 0x000000, 0x000000,
+ /* ac */ 0x8fbad3, 0x8fbad4, 0x00b5dc, 0x8fbad5,
+ /* b0 */ 0x00bacb, 0x8fbad6, 0x8fbad7, 0x00b3b2,
+ /* b4 */ 0x00b1e3, 0x00beac, 0x00b2c8, 0x8fbad8,
+ /* b8 */ 0x00d5e2, 0x00cdc6, 0x8fbad9, 0x000000,
+ /* bc */ 0x8fbada, 0x000000, 0x000000, 0x00bdc9,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x01889 ***/
+
+ /* 80 */ 0x8fbadb, 0x8fbadc, 0x00bce4, 0x00d5e3,
+ /* 84 */ 0x00b4f3, 0x00c6d2, 0x00cca9, 0x00d5e4,
+ /* 88 */ 0x000000, 0x00d5e5, 0x000000, 0x000000,
+ /* 8c */ 0x00c9d9, 0x8fbadd, 0x000000, 0x8fbade,
+ /* 90 */ 0x00d5e7, 0x000000, 0x00b4a8, 0x00b6f7,
+ /* 94 */ 0x00d5e6, 0x000000, 0x8fbadf, 0x8fbae0,
+ /* 98 */ 0x8fbae1, 0x8fbae2, 0x8fbae3, 0x00b4b2,
+ /* 9c */ 0x000000, 0x00bfb2, 0x00d5eb, 0x00bba1,
+ /* a0 */ 0x8fbae4, 0x00b2c9, 0x00d5ea, 0x000000,
+ /* a4 */ 0x00d5e8, 0x00d5ec, 0x00d5e9, 0x00c7ab,
+ /* a8 */ 0x00dccd, 0x00bfb3, 0x000000, 0x00d5ed,
+ /* ac */ 0x8ff4ba, 0x000000, 0x00cec0, 0x8fbae5,
+ /* b0 */ 0x00d5ee, 0x8fbae6, 0x000000, 0x00d5f0,
+ /* b4 */ 0x8fbae7, 0x00c3fe, 0x00d5ef, 0x000000,
+ /* b8 */ 0x00c0a3, 0x000000, 0x00bbfb, 0x000000,
+ /* bc */ 0x000000, 0x8fbae8, 0x00c2d0, 0x00bcf7,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x018c9 ***/
+
+ /* 80 */ 0x000000, 0x00c9f5, 0x00c0ec, 0x000000,
+ /* 84 */ 0x00bccd, 0x00d5f1, 0x00bead, 0x00d5f2,
+ /* 88 */ 0x00d5f3, 0x00b0d3, 0x00c2ba, 0x00bfd2,
+ /* 8c */ 0x8fbae9, 0x00d5f4, 0x00c6b3, 0x00beae,
+ /* 90 */ 0x000000, 0x00beaf, 0x000000, 0x00d5f5,
+ /* 94 */ 0x000000, 0x000000, 0x00c0ed, 0x8fbaea,
+ /* 98 */ 0x000000, 0x000000, 0x00beb0, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fbaeb, 0x8fbaec,
+ /* a0 */ 0x00d5f6, 0x000000, 0x00d5f7, 0x8fbaed,
+ /* a4 */ 0x00cce0, 0x000000, 0x8fbaee, 0x000000,
+ /* a8 */ 0x00d5f8, 0x8fbaef, 0x000000, 0x8fbaf0,
+ /* ac */ 0x8fbaf1, 0x00b6c6, 0x8fbaf2, 0x000000,
+ /* b0 */ 0x8fbaf3, 0x00bda2, 0x8fbaf4, 0x000000,
+ /* b4 */ 0x000000, 0x8fbaf5, 0x8fbaf6, 0x000000,
+ /* b8 */ 0x00d5f9, 0x00d5fa, 0x00bcdc, 0x00bfac,
+ /* bc */ 0x00c6f4, 0x00bfd4, 0x00c8f8, 0x00c7a2,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01909 ***/
+
+ /* 80 */ 0x00b6c9, 0x00d5fb, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b5ef, 0x00d5fc, 0x000000,
+ /* 88 */ 0x00b6fe, 0x000000, 0x00c6cf, 0x00b2b0,
+ /* 8c */ 0x000000, 0x00bbd3, 0x00d5fd, 0x00d6a2,
+ /* 90 */ 0x00d6a1, 0x00b6fd, 0x000000, 0x00d5fe,
+ /* 94 */ 0x000000, 0x00c5b8, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fbaf7, 0x8fbaf8, 0x000000,
+ /* 9c */ 0x8fbaf9, 0x000000, 0x00c2b0, 0x000000,
+ /* a0 */ 0x00c5cb, 0x00bcc8, 0x8fbafa, 0x8fbafb,
+ /* a4 */ 0x00c1d8, 0x00cdfa, 0x000000, 0x8fbafc,
+ /* a8 */ 0x8fbafd, 0x8fbafe, 0x000000, 0x000000,
+ /* ac */ 0x00d6a4, 0x8fbba1, 0x00d6a5, 0x00c6d6,
+ /* b0 */ 0x8fbba2, 0x00bbb3, 0x000000, 0x000000,
+ /* b4 */ 0x8fbba3, 0x8fbba4, 0x00d6a7, 0x000000,
+ /* b8 */ 0x000000, 0x00d6a8, 0x8fbba5, 0x8fbba6,
+ /* bc */ 0x8fbba7, 0x8fbba8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01947 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fbba9,
+ /* 88 */ 0x8fbbaa, 0x000000, 0x8fbbab, 0x000000,
+ /* 8c */ 0x00d6a9, 0x000000, 0x000000, 0x8fbbac,
+ /* 90 */ 0x00b4f4, 0x00d6aa, 0x8fbbad, 0x000000,
+ /* 94 */ 0x00d6ab, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fbbae, 0x000000, 0x8fbbaf,
+ /* a0 */ 0x8fbbb0, 0x00b2ac, 0x8fbbb1, 0x8fbbb2,
+ /* a4 */ 0x000000, 0x000000, 0x8fbbb3, 0x000000,
+ /* a8 */ 0x00c1bb, 0x00b4e4, 0x8fbbb4, 0x00d6ad,
+ /* ac */ 0x00cca8, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00c2d2, 0x8fbbb5, 0x00b3d9,
+ /* b4 */ 0x8fbbb6, 0x8fbbb7, 0x00d6af, 0x00d6b1,
+ /* b8 */ 0x00b4df, 0x000000, 0x8fbbb8, 0x00d6ae,
+ /* bc */ 0x00d6b0, 0x000000, 0x00d6b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x01986 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00d6b2, 0x000000, 0x00d6b4,
+ /* 88 */ 0x000000, 0x8fbbb9, 0x000000, 0x8fbbba,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fbbbb, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fbbbd,
+ /* 98 */ 0x000000, 0x00d6b5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fbbbc, 0x000000, 0x000000,
+ /* a0 */ 0x00c6bd, 0x00b6ae, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b2e5, 0x00d6b6, 0x00d6bb, 0x000000,
+ /* ac */ 0x000000, 0x00d6b9, 0x8fbbbe, 0x00caf7,
+ /* b0 */ 0x00caf6, 0x8fbbbf, 0x8fbbc0, 0x000000,
+ /* b4 */ 0x8fbbc1, 0x8ff4bb, 0x00c5e7, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d6b8, 0x00bdd4,
+ /* bc */ 0x000000, 0x00d6b7, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x019c5 ***/
+
+ /* 80 */ 0x000000, 0x8fbbc2, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fbbc3, 0x00bff2,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00d6bc,
+ /* 8c */ 0x000000, 0x8fbbc4, 0x00baea, 0x000000,
+ /* 90 */ 0x000000, 0x00d6c2, 0x8fbbc5, 0x000000,
+ /* 94 */ 0x00d6c3, 0x00d6bd, 0x00b3b3, 0x00d6be,
+ /* 98 */ 0x00d6c7, 0x00d6c6, 0x00d6c5, 0x00d6c1,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00d6c0,
+ /* a0 */ 0x000000, 0x000000, 0x00d6c4, 0x8fbbc7,
+ /* a4 */ 0x8fbbc8, 0x000000, 0x8fbbc9, 0x8fbbca,
+ /* a8 */ 0x000000, 0x00caf8, 0x000000, 0x8fbbc6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fbbcb, 0x000000, 0x000000,
+ /* b4 */ 0x8fbbcc, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fbbcd, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fbbce, 0x000000, 0x8fbbcf,
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01a05 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fbbd0, 0x8fbbd1,
+ /* 84 */ 0x000000, 0x000000, 0x8fbbd2, 0x000000,
+ /* 88 */ 0x8fbbd3, 0x000000, 0x8fbbd7, 0x00d6cb,
+ /* 8c */ 0x00d6c8, 0x000000, 0x00d6ca, 0x000000,
+ /* 90 */ 0x00cdf2, 0x8fbbd5, 0x00d6c9, 0x8ff4bc,
+ /* 94 */ 0x000000, 0x8fbbd4, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fbbd6, 0x000000, 0x000000,
+ /* 9c */ 0x00d6bf, 0x000000, 0x000000, 0x8fbbd8,
+ /* a0 */ 0x8fbbd9, 0x8fbbda, 0x8fbbdb, 0x000000,
+ /* a4 */ 0x8fbbdc, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00bff3, 0x8fbbdd, 0x000000,
+ /* ac */ 0x00d6cc, 0x8fbbde, 0x000000, 0x00bab7,
+ /* b0 */ 0x8fbbdf, 0x000000, 0x000000, 0x00d6cd,
+ /* b4 */ 0x000000, 0x000000, 0x00d6ce, 0x000000,
+ /* b8 */ 0x000000, 0x8fbbe0, 0x8fbbe1, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fbbe2, 0x8fbbe3,
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01a45 ***/
+
+ /* 80 */ 0x000000, 0x8fbbe4, 0x00d6d1, 0x8fbbe5,
+ /* 84 */ 0x00d6d0, 0x000000, 0x000000, 0x00d6cf,
+ /* 88 */ 0x8fbbe6, 0x000000, 0x8fbbe7, 0x00c5e8,
+ /* 8c */ 0x00d6ba, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00d6d7, 0x000000, 0x8fbbe8, 0x8fbbe9,
+ /* 94 */ 0x8fbbea, 0x8fbbeb, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fbbec, 0x000000, 0x8fbbed,
+ /* 9c */ 0x000000, 0x00d6d3, 0x000000, 0x8fbbee,
+ /* a0 */ 0x8fbbef, 0x000000, 0x00d6d2, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fbbf0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fbbf1,
+ /* ac */ 0x00d6d4, 0x000000, 0x00d6d5, 0x000000,
+ /* b0 */ 0x8fbbf2, 0x000000, 0x8fe6f4, 0x000000,
+ /* b4 */ 0x8fbbf3, 0x000000, 0x000000, 0x00d6d8,
+ /* b8 */ 0x8fbbf4, 0x8fbbf5, 0x00cee6, 0x000000,
+ /* bc */ 0x00d6d9, 0x00d6d6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01a83 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fbbf6,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fbbf7,
+ /* 88 */ 0x000000, 0x00d6da, 0x000000, 0x8fbbf8,
+ /* 8c */ 0x00b4e0, 0x00d6db, 0x8fbbfa, 0x000000,
+ /* 90 */ 0x8fbbf9, 0x000000, 0x00d6dd, 0x00d6dc,
+ /* 94 */ 0x000000, 0x000000, 0x00d6de, 0x000000,
+ /* 98 */ 0x8fbbfb, 0x8fbbfc, 0x000000, 0x00d6df,
+ /* 9c */ 0x000000, 0x00c0ee, 0x00bda3, 0x000000,
+ /* a0 */ 0x8fbbfd, 0x00bde4, 0x000000, 0x00c1e3,
+ /* a4 */ 0x8fbbfe, 0x00b9a9, 0x00bab8, 0x00b9aa,
+ /* a8 */ 0x00b5f0, 0x8fbca1, 0x000000, 0x00d6e0,
+ /* ac */ 0x000000, 0x000000, 0x00bab9, 0x000000,
+ /* b0 */ 0x000000, 0x00b8ca, 0x00d6e1, 0x00cca6,
+ /* b4 */ 0x00c7c3, 0x00d6e2, 0x000000, 0x00b9ab,
+ /* b8 */ 0x8fbca2, 0x8fbca3, 0x000000, 0x00b4ac,
+ /* bc */ 0x000000, 0x00c3a7, 0x00b6d2, 0x000000,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01ac3 ***/
+
+ /* 80 */ 0x8fbca4, 0x000000, 0x00bbd4, 0x00c9db,
+ /* 84 */ 0x000000, 0x000000, 0x00c8c1, 0x8fbca5,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00d6e3,
+ /* 8c */ 0x00b4f5, 0x8fbca6, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00d6e6, 0x8fbca7, 0x000000,
+ /* 94 */ 0x8fbca8, 0x8fbca9, 0x00c4a1, 0x000000,
+ /* 98 */ 0x8fbcaa, 0x00d6e5, 0x00d6e4, 0x00d6e7,
+ /* 9c */ 0x000000, 0x00c4eb, 0x000000, 0x8fbcab,
+ /* a0 */ 0x8fbcac, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00bfe3, 0x000000, 0x000000,
+ /* a8 */ 0x8fbcae, 0x000000, 0x000000, 0x00bbd5,
+ /* ac */ 0x000000, 0x00c0ca, 0x8fbcad, 0x00c2d3,
+ /* b0 */ 0x00b5a2, 0x000000, 0x8fbcaf, 0x00c4a2,
+ /* b4 */ 0x000000, 0x8fbcb0, 0x00d6e8, 0x00d6e9,
+ /* b8 */ 0x00beef, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00cbb9, 0x8fbcb1, 0x000000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01b03 ***/
+
+ /* 80 */ 0x00d6ec, 0x000000, 0x000000, 0x00d6eb,
+ /* 84 */ 0x00d6ea, 0x00c9fd, 0x000000, 0x00d6f3,
+ /* 88 */ 0x000000, 0x8fbcb4, 0x000000, 0x8fbcb2,
+ /* 8c */ 0x00cbda, 0x000000, 0x00d6ed, 0x000000,
+ /* 90 */ 0x8fbcb3, 0x8fbcb5, 0x000000, 0x000000,
+ /* 94 */ 0x00d6ef, 0x00cbeb, 0x8fbcb6, 0x00d6ee,
+ /* 98 */ 0x8fbcb7, 0x000000, 0x000000, 0x8fbcb8,
+ /* 9c */ 0x8fbcb9, 0x000000, 0x8fbcba, 0x00d6f0,
+ /* a0 */ 0x000000, 0x00c8a8, 0x00d6f1, 0x00cabe,
+ /* a4 */ 0x00d6f2, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fbcbb, 0x000000, 0x8fbcbc, 0x8fbcbd,
+ /* ac */ 0x8fbcbe, 0x8fbcbf, 0x8fbcc0, 0x000000,
+ /* b0 */ 0x8fbcc1, 0x000000, 0x00b4b3, 0x00cabf,
+ /* b4 */ 0x00c7af, 0x00d6f4, 0x00d6f5, 0x000000,
+ /* b8 */ 0x00b9ac, 0x00b4b4, 0x00d6f6, 0x00b8b8,
+ /* bc */ 0x00cdc4, 0x00cda9, 0x00b4f6, 0x00d6f8,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01b43 ***/
+
+ /* 80 */ 0x8fbcc2, 0x00c4a3, 0x000000, 0x00b9ad,
+ /* 84 */ 0x00beb1, 0x000000, 0x000000, 0x00c8df,
+ /* 88 */ 0x000000, 0x000000, 0x00beb2, 0x8fbcc3,
+ /* 8c */ 0x000000, 0x000000, 0x8fbcc4, 0x00bdf8,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c4ec, 0x00caf9, 0x00c5b9,
+ /* 98 */ 0x000000, 0x000000, 0x00b9ae, 0x000000,
+ /* 9c */ 0x00c9dc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00d6f9, 0x000000, 0x8fbcc5, 0x000000,
+ /* a4 */ 0x8fbcc6, 0x8fbcc7, 0x00c5d9, 0x00bac2,
+ /* a8 */ 0x8fbcc8, 0x000000, 0x8fbcc9, 0x00b8cb,
+ /* ac */ 0x8fbcca, 0x00c4ed, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fbccb, 0x000000, 0x8fbccc,
+ /* b4 */ 0x000000, 0x00b0c3, 0x00bdee, 0x00b9af,
+ /* b8 */ 0x00cdc7, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fbccd, 0x8fbcce, 0x8fbccf,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01b83 ***/
+
+ /* 80 */ 0x000000, 0x00d6fa, 0x00d6fb, 0x00c7d1,
+ /* 84 */ 0x000000, 0x000000, 0x8fbcd0, 0x000000,
+ /* 88 */ 0x00d6fc, 0x00cef7, 0x00cfad, 0x8fbcd2,
+ /* 8c */ 0x8fbcd1, 0x000000, 0x8fbcd3, 0x00d6fe,
+ /* 90 */ 0x00d6fd, 0x8fbcd4, 0x8fbcd5, 0x00b3c7,
+ /* 94 */ 0x8fbcd6, 0x8fbcd7, 0x00d7a1, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00d7a4, 0x00d7a5,
+ /* 9c */ 0x8fbcd8, 0x00d7a3, 0x8fbcd9, 0x00c9c0,
+ /* a0 */ 0x00beb3, 0x00d7a7, 0x00d7a6, 0x00d7a2,
+ /* a4 */ 0x000000, 0x8fbcda, 0x000000, 0x000000,
+ /* a8 */ 0x00d7a8, 0x00d7a9, 0x000000, 0x8fbcdb,
+ /* ac */ 0x00d7aa, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00d7ad, 0x00d7ab, 0x000000, 0x00d7ac,
+ /* b4 */ 0x00d7ae, 0x000000, 0x00b1e4, 0x00c4ee,
+ /* b8 */ 0x00d7af, 0x000000, 0x00b7fa, 0x00b2f6,
+ /* bc */ 0x00c7b6, 0x000000, 0x00d7b0, 0x00c6fb,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01bc3 ***/
+
+ /* 80 */ 0x000000, 0x00cadb, 0x8fbcdc, 0x00d7b1,
+ /* 84 */ 0x00cfae, 0x000000, 0x8fbcdd, 0x8fbcde,
+ /* 88 */ 0x8fbcdf, 0x00d7b2, 0x00cac0, 0x00d7b5,
+ /* 8c */ 0x00d0a1, 0x00d0b1, 0x8fbce0, 0x00bcb0,
+ /* 90 */ 0x00c6f5, 0x00d7b6, 0x000000, 0x00b5dd,
+ /* 94 */ 0x00c4a4, 0x00b0fa, 0x00d7b7, 0x00caa6,
+ /* 98 */ 0x00b9b0, 0x8fbce1, 0x000000, 0x00c3d0,
+ /* 9c */ 0x8fbce2, 0x8fbce3, 0x000000, 0x00c4ef,
+ /* a0 */ 0x000000, 0x8fbce4, 0x8fbce5, 0x8fbce6,
+ /* a4 */ 0x8fbce7, 0x00ccef, 0x00b8b9, 0x00b8cc,
+ /* a8 */ 0x8fbce8, 0x00d7b8, 0x000000, 0x8fbce9,
+ /* ac */ 0x8fbcea, 0x00d7b9, 0x8fbceb, 0x00d7bf,
+ /* b0 */ 0x8fbcec, 0x00bce5, 0x000000, 0x000000,
+ /* b4 */ 0x8fbced, 0x00c4a5, 0x8fbcee, 0x00b6af,
+ /* b8 */ 0x00d7ba, 0x000000, 0x000000, 0x8fbcef,
+ /* bc */ 0x00c9ab, 0x8fbcf0, 0x00c3c6, 0x8fbcf1,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01c03 ***/
+
+ /* 80 */ 0x8fbcf2, 0x00d7bb, 0x000000, 0x000000,
+ /* 84 */ 0x8fbcf3, 0x8fbcf4, 0x000000, 0x8fbcf5,
+ /* 88 */ 0x00d7bc, 0x000000, 0x00b6b0, 0x000000,
+ /* 8c */ 0x00d7bd, 0x8fbcf6, 0x00d7be, 0x000000,
+ /* 90 */ 0x8fbcf7, 0x00d7c0, 0x000000, 0x00c5f6,
+ /* 94 */ 0x8fbcf8, 0x000000, 0x00d7c1, 0x00d7c2,
+ /* 98 */ 0x8fbcf9, 0x00d7c3, 0x000000, 0x8fbcfa,
+ /* 9c */ 0x00d7b4, 0x00d7b3, 0x000000, 0x000000,
+ /* a0 */ 0x8fbcfb, 0x00d7c4, 0x00b7c1, 0x8fbcfc,
+ /* a4 */ 0x8fbcfd, 0x000000, 0x00c9a7, 0x8fbcfe,
+ /* a8 */ 0x000000, 0x00bacc, 0x00c9b7, 0x00c4a6,
+ /* ac */ 0x00c9cb, 0x00d7c5, 0x000000, 0x8fbda1,
+ /* b0 */ 0x00beb4, 0x00b1c6, 0x8fbda2, 0x00d7c6,
+ /* b4 */ 0x8fbda3, 0x8fbda4, 0x000000, 0x00d7c7,
+ /* b8 */ 0x8fbda5, 0x00ccf2, 0x8fbda6, 0x000000,
+ /* bc */ 0x00c8e0, 0x8fbda7, 0x8fbda8, 0x00d7ca,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01c43 ***/
+
+ /* 80 */ 0x00b1fd, 0x00c0ac, 0x00d7c9, 0x00d7c8,
+ /* 84 */ 0x00b7c2, 0x00c2d4, 0x000000, 0x00d7ce,
+ /* 88 */ 0x00d7cc, 0x8fbda9, 0x00d7cb, 0x00cea7,
+ /* 8c */ 0x00b8e5, 0x8fbdaa, 0x000000, 0x8fbdab,
+ /* 90 */ 0x00bdf9, 0x00d7cd, 0x00c5cc, 0x00bdbe,
+ /* 94 */ 0x000000, 0x000000, 0x8fbdac, 0x00c6c0,
+ /* 98 */ 0x00d7d1, 0x00d7d0, 0x000000, 0x000000,
+ /* 9c */ 0x8fbdad, 0x8fbdae, 0x00d7cf, 0x000000,
+ /* a0 */ 0x00d7d2, 0x00b8e6, 0x8fbdaf, 0x000000,
+ /* a4 */ 0x8fbdb2, 0x000000, 0x000000, 0x8fbdb0,
+ /* a8 */ 0x00d7d3, 0x00c9fc, 0x00bddb, 0x8fbdb1,
+ /* ac */ 0x8fbdb3, 0x00d7d4, 0x00c8f9, 0x8fbdb4,
+ /* b0 */ 0x8fbdb5, 0x8fbdb6, 0x000000, 0x00c6c1,
+ /* b4 */ 0x00c4a7, 0x000000, 0x000000, 0x8ff4be,
+ /* b8 */ 0x8fbdb7, 0x00c5b0, 0x000000, 0x000000,
+ /* bc */ 0x00d7d5, 0x00b5ab,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01c81 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00bfb4,
+ /* 84 */ 0x8fbdb8, 0x00c9ac, 0x000000, 0x8fbdb9,
+ /* 88 */ 0x8fbdba, 0x8fbdbb, 0x000000, 0x8fbdbc,
+ /* 8c */ 0x00b4f7, 0x00c7a6, 0x000000, 0x000000,
+ /* 90 */ 0x8fbdbd, 0x8fbdbe, 0x8fbdbf, 0x8fbdc0,
+ /* 94 */ 0x8fbdc1, 0x000000, 0x00d7d6, 0x00bbd6,
+ /* 98 */ 0x00cbba, 0x00cbbb, 0x000000, 0x000000,
+ /* 9c */ 0x00b1fe, 0x00d7db, 0x8fbdc2, 0x000000,
+ /* a0 */ 0x00c3e9, 0x8fbdc3, 0x8fbdc4, 0x000000,
+ /* a4 */ 0x00d7d8, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fbdc5, 0x8fbdc6, 0x8fbdc7, 0x00b2f7,
+ /* ac */ 0x8fbdc8, 0x8fbdc9, 0x8fbdca, 0x8fbdcb,
+ /* b0 */ 0x00d8ad, 0x00d7da, 0x8fbdcc, 0x8fbdcd,
+ /* b4 */ 0x000000, 0x00c7b0, 0x8fbdce, 0x000000,
+ /* b8 */ 0x00d7d9, 0x000000, 0x8fbdcf, 0x00d7d7,
+ /* bc */ 0x8fbdd0, 0x00b9fa, 0x000000, 0x00d7dd,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01cc1 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fbdd1,
+ /* 88 */ 0x000000, 0x000000, 0x8fbdd2, 0x000000,
+ /* 8c */ 0x000000, 0x8fbdd3, 0x00d7e3, 0x00d7e9,
+ /* 90 */ 0x00d7e1, 0x000000, 0x00c5dc, 0x8fbdd4,
+ /* 94 */ 0x8fbdd5, 0x00d7e6, 0x00c9dd, 0x8fbdd6,
+ /* 98 */ 0x8fbdd7, 0x00d7e0, 0x8fbdd8, 0x00d7e5,
+ /* 9c */ 0x00cee7, 0x00bbd7, 0x000000, 0x8fbdd9,
+ /* a0 */ 0x00c2d5, 0x00d7de, 0x000000, 0x000000,
+ /* a4 */ 0x8fbdda, 0x00b5de, 0x00d7e8, 0x00c0ad,
+ /* a8 */ 0x00b1e5, 0x00d7e2, 0x00b2f8, 0x00d7e7,
+ /* ac */ 0x000000, 0x8fbddb, 0x000000, 0x00b6b1,
+ /* b0 */ 0x000000, 0x00d7e4, 0x000000, 0x8fbddc,
+ /* b4 */ 0x000000, 0x8fbddd, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00d7ea, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e681xx - offset 0x01d01 ***/
+
+ /* 80 */ 0x8fbdde, 0x00d7ec, 0x00d7f6, 0x00d7f4,
+ /* 84 */ 0x000000, 0x000000, 0x00d7f1, 0x8fbddf,
+ /* 88 */ 0x8fbde0, 0x8fbde1, 0x00d7f0, 0x00cef8,
+ /* 8c */ 0x8fbde2, 0x00d7f2, 0x000000, 0x000000,
+ /* 90 */ 0x00b6b2, 0x8fbde3, 0x00b9b1, 0x000000,
+ /* 94 */ 0x8fbde4, 0x00bdfa, 0x8fbde5, 0x8fbde6,
+ /* 98 */ 0x000000, 0x00d7f9, 0x00d7eb, 0x000000,
+ /* 9c */ 0x000000, 0x8fbde7, 0x000000, 0x00d7ef,
+ /* a0 */ 0x00d7df, 0x8fbde8, 0x00b2fa, 0x00d7f3,
+ /* a4 */ 0x00d7f5, 0x00c3d1, 0x000000, 0x8fbde9,
+ /* a8 */ 0x00baa8, 0x00b2b8, 0x00d7ed, 0x00d7f8,
+ /* ac */ 0x00d7f7, 0x00b6b3, 0x000000, 0x00c2a9,
+ /* b0 */ 0x00b3e6, 0x8fbdea, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00b7c3, 0x000000, 0x00d7ee,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fbdeb, 0x8fbdec,
+
+ /*** Three byte table, leaf: e682xx - offset 0x01d41 ***/
+
+ /* 80 */ 0x000000, 0x00d7fa, 0x8fbded, 0x00d7fd,
+ /* 84 */ 0x00d8a1, 0x8ff4bf, 0x8fbdee, 0x000000,
+ /* 88 */ 0x8fbdef, 0x00bcbd, 0x8fbdf0, 0x00d8a7,
+ /* 8c */ 0x00c4f0, 0x00d7fb, 0x8fbdf1, 0x000000,
+ /* 90 */ 0x000000, 0x8fbdf2, 0x00d8a5, 0x8fbdf3,
+ /* 94 */ 0x00b2f9, 0x8fbdf4, 0x00d8a3, 0x00d8a4,
+ /* 98 */ 0x8fbdf5, 0x000000, 0x00d7fe, 0x00d8a2,
+ /* 9c */ 0x000000, 0x8fbdf6, 0x8fbdf7, 0x00b8e7,
+ /* a0 */ 0x00cdaa, 0x000000, 0x8fbdf8, 0x00b4b5,
+ /* a4 */ 0x8fbdf9, 0x8fbdfa, 0x00b1d9, 0x00d8a6,
+ /* a8 */ 0x8fbdfb, 0x00c7ba, 0x00b0ad, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fbdfc, 0x8fbdfd, 0x00c8e1, 0x00d7dc,
+ /* b4 */ 0x00d8ac, 0x00d8b0, 0x00cce5, 0x8fbdfe,
+ /* b8 */ 0x00d8a9, 0x000000, 0x000000, 0x8fbea1,
+ /* bc */ 0x00c5e9, 0x00d8ae, 0x8fbea2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01d80 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fbea3, 0x000000,
+ /* 84 */ 0x8fbea4, 0x00bef0, 0x00d8af, 0x00c6d7,
+ /* 88 */ 0x8fbea5, 0x8fbea6, 0x8fbea7, 0x8fbea8,
+ /* 8c */ 0x000000, 0x000000, 0x8fbea9, 0x8fbeaa,
+ /* 90 */ 0x000000, 0x00cfc7, 0x000000, 0x00d8ab,
+ /* 94 */ 0x8fbeab, 0x8fbeac, 0x000000, 0x000000,
+ /* 98 */ 0x00d8b1, 0x8fbead, 0x00b9fb, 0x8fbeae,
+ /* 9c */ 0x00c0cb, 0x8fbeaf, 0x8fbeb0, 0x00b0d4,
+ /* a0 */ 0x00d8aa, 0x00d8a8, 0x8fbeb1, 0x00c1da,
+ /* a4 */ 0x000000, 0x8fbeb2, 0x000000, 0x00d7fc,
+ /* a8 */ 0x00bbb4, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00c2c6, 0x00d8bd, 0x8fbeb3, 0x00c1db,
+ /* b4 */ 0x00d8b8, 0x8fbeb4, 0x00d8b5, 0x00d8b6,
+ /* b8 */ 0x8fbeb5, 0x00bce6, 0x00d8b9, 0x00d8bc,
+ /* bc */ 0x8fbeb6, 0x8fbeb7, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01dc0 ***/
+
+ /* 80 */ 0x00d8b7, 0x00bda5, 0x8fbeb8, 0x00d8ba,
+ /* 84 */ 0x000000, 0x000000, 0x00d8b4, 0x8fbeb9,
+ /* 88 */ 0x00ccfc, 0x00ccfb, 0x8fbeba, 0x000000,
+ /* 8c */ 0x8fbebb, 0x00d8be, 0x00d8bf, 0x00b0d5,
+ /* 90 */ 0x8fbebc, 0x8fbebd, 0x8fbebe, 0x8fbebf,
+ /* 94 */ 0x8fbec0, 0x00d8b3, 0x8fbec1, 0x8fbec2,
+ /* 98 */ 0x000000, 0x8fbec3, 0x00b6f2, 0x00b0a6,
+ /* 9c */ 0x8fbec4, 0x000000, 0x8fbec5, 0x00b4b6,
+ /* a0 */ 0x8ff4c0, 0x00d8bb, 0x8fbec6, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d8c3,
+ /* a8 */ 0x00d8c2, 0x000000, 0x8fbec7, 0x8fbec8,
+ /* ac */ 0x00d8c7, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fbec9, 0x8fbeca, 0x000000, 0x000000,
+ /* b4 */ 0x00d8c8, 0x8fbecb, 0x8fbecc, 0x8fbecd,
+ /* b8 */ 0x000000, 0x8fbece, 0x000000, 0x000000,
+ /* bc */ 0x00d8c6, 0x00d8c9, 0x00d8c1, 0x00d8c5,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01e00 ***/
+
+ /* 80 */ 0x000000, 0x8fbecf, 0x00d8ca, 0x000000,
+ /* 84 */ 0x00d8cb, 0x8fbed0, 0x8fbed1, 0x00d8c0,
+ /* 88 */ 0x00bbfc, 0x8fbed2, 0x00d8c4, 0x00c2d6,
+ /* 8c */ 0x00b9b2, 0x00d8b2, 0x00bfb5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00d8d8,
+ /* 94 */ 0x000000, 0x00cae9, 0x000000, 0x000000,
+ /* 98 */ 0x00d8ce, 0x00d8cf, 0x00d8d0, 0x000000,
+ /* 9c */ 0x000000, 0x00d8d7, 0x8fbed3, 0x00d8d6,
+ /* a0 */ 0x8fbed4, 0x000000, 0x00cbfd, 0x00b4b7,
+ /* a4 */ 0x000000, 0x00d8d4, 0x000000, 0x00b7c5,
+ /* a8 */ 0x00b3b4, 0x000000, 0x000000, 0x00d8d1,
+ /* ac */ 0x8fbed5, 0x000000, 0x00ceb8, 0x00d8d3,
+ /* b0 */ 0x00b0d6, 0x00d8d5, 0x8fbed6, 0x00d8cc,
+ /* b4 */ 0x00d8d2, 0x00d8d9, 0x00b7c4, 0x00d8cd,
+ /* b8 */ 0x8fbed7, 0x000000, 0x000000, 0x8fbed8,
+ /* bc */ 0x8fbed9, 0x000000, 0x00cddd, 0x8fbeda,
+
+ /*** Three byte table, leaf: e686xx - offset 0x01e40 ***/
+
+ /* 80 */ 0x8fbedb, 0x8fbedc, 0x00cdab, 0x8fbedd,
+ /* 84 */ 0x8fbede, 0x000000, 0x000000, 0x00d8dc,
+ /* 88 */ 0x000000, 0x000000, 0x00d8e0, 0x8fbedf,
+ /* 8c */ 0x000000, 0x8fbee0, 0x00c1fe, 0x000000,
+ /* 90 */ 0x00cef9, 0x00d8e1, 0x8fbee1, 0x8fbee2,
+ /* 94 */ 0x00d8de, 0x000000, 0x00d8db, 0x8fbee3,
+ /* 98 */ 0x8fbee4, 0x00d8da, 0x00d8df, 0x000000,
+ /* 9c */ 0x8fbee5, 0x8fbee6, 0x000000, 0x8fbee7,
+ /* a0 */ 0x8fbee8, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00cab0, 0x8fbee9, 0x000000, 0x00c6b4,
+ /* a8 */ 0x8fbeea, 0x00b7c6, 0x8fbeeb, 0x00d8e2,
+ /* ac */ 0x00d8dd, 0x8fbeec, 0x00d8e3, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b7fb, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b2b1, 0x000000,
+ /* b8 */ 0x8fbeed, 0x8fbeee, 0x00d8eb, 0x000000,
+ /* bc */ 0x8fbeef, 0x000000, 0x00b4b8, 0x000000,
+
+ /*** Three byte table, leaf: e687xx - offset 0x01e80 ***/
+
+ /* 80 */ 0x8fbef0, 0x8fbef1, 0x8fbef2, 0x00d8e9,
+ /* 84 */ 0x000000, 0x000000, 0x00d8ea, 0x00baa9,
+ /* 88 */ 0x00d8e8, 0x00d8e6, 0x00d8e5, 0x00d8ec,
+ /* 8c */ 0x00d8e4, 0x00d8ee, 0x8fbef3, 0x8fbef4,
+ /* 90 */ 0x00b2fb, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fbef5, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fbef6, 0x8fbef7, 0x8fbef8, 0x8fbef9,
+ /* a0 */ 0x000000, 0x8fbefa, 0x8fbefb, 0x00d8f0,
+ /* a4 */ 0x000000, 0x8fbefe, 0x00d8ef, 0x8fbefc,
+ /* a8 */ 0x000000, 0x8fbefd, 0x000000, 0x000000,
+ /* ac */ 0x8fbfa1, 0x8fbfa2, 0x000000, 0x8fbfa3,
+ /* b0 */ 0x000000, 0x000000, 0x00c4a8, 0x000000,
+ /* b4 */ 0x00d8f3, 0x000000, 0x00d8f1, 0x00d8e7,
+ /* b8 */ 0x00b7fc, 0x000000, 0x00d8f2, 0x000000,
+ /* bc */ 0x00d8f6, 0x00d8f5, 0x00d8f7, 0x00d8f4,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01ec0 ***/
+
+ /* 80 */ 0x00d8f8, 0x8fbfa4, 0x000000, 0x8fbfa5,
+ /* 84 */ 0x8fbfa6, 0x000000, 0x000000, 0x8fbfa7,
+ /* 88 */ 0x00d8f9, 0x00d8fa, 0x00caea, 0x000000,
+ /* 8c */ 0x00d8fc, 0x00d8fb, 0x00bdbf, 0x000000,
+ /* 90 */ 0x00c0ae, 0x00b2e6, 0x00b2fc, 0x8fbfa8,
+ /* 94 */ 0x00d8fd, 0x8fbfa9, 0x00b0bf, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00c0cc, 0x00d8fe,
+ /* 9c */ 0x8fbfaa, 0x00ecc3, 0x00d9a1, 0x00b7e1,
+ /* a0 */ 0x8fbfab, 0x00d9a2, 0x8fbfac, 0x8fbfad,
+ /* a4 */ 0x000000, 0x000000, 0x00c0ef, 0x8fbfae,
+ /* a8 */ 0x000000, 0x8fbfaf, 0x00d9a3, 0x8fbfb0,
+ /* ac */ 0x000000, 0x000000, 0x00d9a4, 0x00b5ba,
+ /* b0 */ 0x00d9a5, 0x000000, 0x00d9a6, 0x00d9a7,
+ /* b4 */ 0x00c2d7, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00b8cd, 0x8fbfb1, 0x000000, 0x00cce1,
+ /* bc */ 0x000000, 0x8fbfb2, 0x000000, 0x00cbbc,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01f00 ***/
+
+ /* 80 */ 0x00bdea, 0x00d9a8, 0x8fbfb3, 0x8fbfb4,
+ /* 84 */ 0x8fbfb5, 0x000000, 0x8fbfb6, 0x00c0f0,
+ /* 88 */ 0x00eebd, 0x00c8e2, 0x000000, 0x00bcea,
+ /* 8c */ 0x8fbfb7, 0x00bacd, 0x00d9a9, 0x000000,
+ /* 90 */ 0x8fbfb8, 0x8fbfb9, 0x8fbfba, 0x00c2c7,
+ /* 94 */ 0x8fbfbb, 0x00caa7, 0x8fbfbc, 0x000000,
+ /* 98 */ 0x00c2f1, 0x000000, 0x8fbfbd, 0x00d9ac,
+ /* 9c */ 0x8fbfbe, 0x000000, 0x00d9aa, 0x000000,
+ /* a0 */ 0x00d9ad, 0x000000, 0x000000, 0x00d9ab,
+ /* a4 */ 0x8fbfbf, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00d9ae, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fbfc0, 0x00cab1, 0x8fbfc1,
+ /* b0 */ 0x000000, 0x00b0b7, 0x000000, 0x8fbfc2,
+ /* b4 */ 0x000000, 0x000000, 0x00c9de, 0x000000,
+ /* b8 */ 0x000000, 0x00c8e3, 0x8fbfc3, 0x000000,
+ /* bc */ 0x00d9af, 0x8fbfc4, 0x00d9b2, 0x00beb5,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01f40 ***/
+
+ /* 80 */ 0x00b5bb, 0x000000, 0x00d9b0, 0x00d9b7,
+ /* 84 */ 0x00beb6, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00d9b1, 0x00c7c4, 0x000000,
+ /* 8c */ 0x000000, 0x8fbfc5, 0x8fbfc6, 0x8fbfc7,
+ /* 90 */ 0x8fbfc8, 0x00cdde, 0x00d9b3, 0x00d9b4,
+ /* 94 */ 0x00d9b8, 0x00c5ea, 0x00d9b5, 0x00b9b3,
+ /* 98 */ 0x00c0de, 0x000000, 0x000000, 0x00d9c6,
+ /* 9c */ 0x00c8b4, 0x000000, 0x00c2f2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fbfc9, 0x000000,
+ /* a8 */ 0x8fbfca, 0x000000, 0x000000, 0x00c8e4,
+ /* ac */ 0x00daad, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cafa, 0x000000, 0x8fbfcb,
+ /* b4 */ 0x000000, 0x00c4f1, 0x8fbfcc, 0x8fbfcd,
+ /* b8 */ 0x000000, 0x00cbf5, 0x8fbfce, 0x00d9bb,
+ /* bc */ 0x00b2a1, 0x00c3ea, 0x8fbfcf, 0x8fbfd0,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01f80 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00d9c4, 0x000000,
+ /* 84 */ 0x8fbfd1, 0x00c3b4, 0x00d9be, 0x00d9c5,
+ /* 88 */ 0x00d9c0, 0x00d9c7, 0x00d9c3, 0x000000,
+ /* 8c */ 0x00d9c2, 0x00c7ef, 0x8fbfd2, 0x00d9bc,
+ /* 90 */ 0x00b2fd, 0x00d9ba, 0x00b5f1, 0x00c2f3,
+ /* 94 */ 0x00d9b6, 0x8fbfd3, 0x8fbfd4, 0x00d9b9,
+ /* 98 */ 0x00b9b4, 0x00c0db, 0x8fbfd5, 0x00beb7,
+ /* 9c */ 0x00d9c1, 0x00c7d2, 0x000000, 0x000000,
+ /* a0 */ 0x00b5f2, 0x00b3c8, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fbfd6, 0x000000,
+ /* ac */ 0x00b3e7, 0x00bfa1, 0x00d9c9, 0x00d9ce,
+ /* b0 */ 0x000000, 0x00d9ca, 0x8fbfd7, 0x00b7fd,
+ /* b4 */ 0x8fbfd8, 0x00d9cf, 0x00bba2, 0x00b9e9,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x8fbfd9, 0x8fbfda, 0x00bda6, 0x00d9bd,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01fc0 ***/
+
+ /* 80 */ 0x000000, 0x00bbfd, 0x00d9cc, 0x8fbfdb,
+ /* 84 */ 0x8fbfdc, 0x000000, 0x000000, 0x00bbd8,
+ /* 88 */ 0x00d9cd, 0x00b0c4, 0x8fbfdd, 0x8fbfde,
+ /* 8c */ 0x00d9c8, 0x8fbfdf, 0x000000, 0x000000,
+ /* 90 */ 0x8fbfe0, 0x00c4a9, 0x000000, 0x8fbfe1,
+ /* 94 */ 0x000000, 0x000000, 0x8fbfe2, 0x000000,
+ /* 98 */ 0x8fbfe3, 0x00b5f3, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b6b4,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d9cb,
+ /* a8 */ 0x00b0a7, 0x8fbfe4, 0x8fbfe5, 0x00bac3,
+ /* ac */ 0x000000, 0x8fbfe6, 0x000000, 0x00bfb6,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fbfe7, 0x8fbfe8, 0x000000,
+ /* b8 */ 0x000000, 0x8fbfe9, 0x00c4f2, 0x000000,
+ /* bc */ 0x8fbfea, 0x00c8d4, 0x00d9d1, 0x00c1de,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x02000 ***/
+
+ /* 80 */ 0x000000, 0x8fbfeb, 0x8fbfec, 0x8fbfed,
+ /* 84 */ 0x8fbfee, 0x000000, 0x8fbfef, 0x000000,
+ /* 88 */ 0x000000, 0x00c2aa, 0x8fbff0, 0x8fbff1,
+ /* 8c */ 0x00bbab, 0x00d9d2, 0x8fbff2, 0x00d9d4,
+ /* 90 */ 0x00d9d0, 0x000000, 0x8fbff3, 0x8fbff4,
+ /* 94 */ 0x8fbff5, 0x00cae1, 0x000000, 0x00c4bd,
+ /* 98 */ 0x8fbff6, 0x000000, 0x000000, 0x8fbff7,
+ /* 9c */ 0x00c1dc, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fbff8, 0x8fbff9, 0x00cafb,
+ /* a8 */ 0x00bcce, 0x00d9e0, 0x000000, 0x00d9df,
+ /* ac */ 0x8fbffa, 0x8fbffb, 0x00bff8, 0x000000,
+ /* b0 */ 0x000000, 0x8fbffc, 0x00b7fe, 0x000000,
+ /* b4 */ 0x8fbffd, 0x8fbffe, 0x00d9d9, 0x00beb9,
+ /* b8 */ 0x8fc0a1, 0x000000, 0x00c6e8, 0x00c7b1,
+ /* bc */ 0x8fc0a2, 0x8fc0a3, 0x000000, 0x8fc0a4,
+
+ /*** Three byte table, leaf: e68exx - offset 0x02040 ***/
+
+ /* 80 */ 0x00d9d7, 0x000000, 0x8fc0a5, 0x00c1dd,
+ /* 84 */ 0x8fc0a6, 0x000000, 0x000000, 0x8fc0a7,
+ /* 88 */ 0x00bcf8, 0x00d9dc, 0x8fc0a8, 0x000000,
+ /* 8c */ 0x00beb8, 0x000000, 0x00d9d6, 0x00d9db,
+ /* 90 */ 0x8fc0a9, 0x000000, 0x00c7d3, 0x000000,
+ /* 94 */ 0x8fc0aa, 0x8fc0ab, 0x00d9d5, 0x000000,
+ /* 98 */ 0x00b7a1, 0x8fc0ac, 0x8fc0ad, 0x00b3dd,
+ /* 9c */ 0x000000, 0x000000, 0x8fc0ae, 0x00d9dd,
+ /* a0 */ 0x00ceab, 0x00bace, 0x00c3b5, 0x00d9da,
+ /* a4 */ 0x8fc0af, 0x00c0dc, 0x8fc0b0, 0x00b9b5,
+ /* a8 */ 0x00bfe4, 0x00b1e6, 0x00c1bc, 0x00d9d8,
+ /* ac */ 0x00b5c5, 0x8fc0b1, 0x8fc0b2, 0x8fc0b3,
+ /* b0 */ 0x000000, 0x000000, 0x00b7c7, 0x000000,
+ /* b4 */ 0x00c4cf, 0x00d9de, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x00c1df,
+ /* bc */ 0x000000, 0x8fc0b4, 0x00d9e1, 0x000000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x02080 ***/
+
+ /* 80 */ 0x00d9e3, 0x8fc0b5, 0x000000, 0x00c2b7,
+ /* 84 */ 0x00d9e9, 0x8fc0b6, 0x00d9e4, 0x000000,
+ /* 88 */ 0x8fc0b7, 0x00d9e6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fc0b8, 0x00c9c1,
+ /* 90 */ 0x00c4f3, 0x8fc0b9, 0x00d9e7, 0x8fc0ba,
+ /* 94 */ 0x8fc0bb, 0x8fc0bc, 0x00cdac, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00cdc8, 0x00b4b9,
+ /* 9c */ 0x8fc0bd, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fc0be, 0x00b0ae, 0x000000, 0x00d9e5,
+ /* a4 */ 0x000000, 0x8fc0bf, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00d9e2, 0x8fc0c0, 0x000000,
+ /* ac */ 0x8fc0c1, 0x000000, 0x00b4f8, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fc0c2, 0x8fc0c3,
+ /* b4 */ 0x00b1e7, 0x8fc0c4, 0x00d9e8, 0x000000,
+ /* b8 */ 0x8fc0c5, 0x8fc0c6, 0x00cdc9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x020bb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00d9ec, 0x000000,
+ /* 88 */ 0x000000, 0x8fc0c7, 0x8fc0c8, 0x000000,
+ /* 8c */ 0x000000, 0x00c2bb, 0x000000, 0x00d9f3,
+ /* 90 */ 0x8fc0c9, 0x000000, 0x8fc0ca, 0x00d9ed,
+ /* 94 */ 0x8fc0cb, 0x000000, 0x00d9ea, 0x00d9f1,
+ /* 98 */ 0x8fc0cc, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00d9d3, 0x000000, 0x8fc0cd, 0x000000,
+ /* a0 */ 0x8fc0ce, 0x000000, 0x8fc0cf, 0x000000,
+ /* a4 */ 0x8fc0d0, 0x8fc0d1, 0x00d9ee, 0x000000,
+ /* a8 */ 0x00d9f2, 0x8fc0d2, 0x8fc0d3, 0x000000,
+ /* ac */ 0x00c8c2, 0x00c5eb, 0x000000, 0x8fc0d4,
+ /* b0 */ 0x8fc0d5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00d9eb, 0x8fc0d6, 0x00d9ef, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00b7c8, 0x000000,
+ /* bc */ 0x000000, 0x8fc0d7, 0x00baf1, 0x8fc0d8,
+
+ /*** Three byte table, leaf: e691xx - offset 0x020fb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00c0dd, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fc0d9,
+ /* 8c */ 0x000000, 0x000000, 0x00d9f7, 0x8fc0da,
+ /* 90 */ 0x000000, 0x8fc0db, 0x8fc0dc, 0x8fc0dd,
+ /* 94 */ 0x8fc0de, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00c5a6, 0x000000, 0x8fc0df, 0x8fc0e0,
+ /* 9c */ 0x8fc0e1, 0x8fc0e2, 0x000000, 0x8fc0e3,
+ /* a0 */ 0x8fc0e4, 0x8fc0e5, 0x000000, 0x8fc0e6,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00d9f4,
+ /* a8 */ 0x000000, 0x00cbe0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fc0e7, 0x000000, 0x00d9f5,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fc0e8,
+ /* b4 */ 0x8fc0e9, 0x000000, 0x00d9f6, 0x000000,
+ /* b8 */ 0x00ccce, 0x000000, 0x00c0a2, 0x8fc0ea,
+ /* bc */ 0x000000, 0x8fc0eb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x02139 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b7e2,
+ /* 84 */ 0x000000, 0x8fc0ec, 0x000000, 0x8fc0ed,
+ /* 88 */ 0x00d9fd, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fc0ee,
+ /* 90 */ 0x8fc0ef, 0x8fc0f0, 0x00bbb5, 0x00d9fa,
+ /* 94 */ 0x000000, 0x00d9f9, 0x000000, 0x000000,
+ /* 98 */ 0x8fc0f1, 0x8fc0f2, 0x00c7b2, 0x8fc0f3,
+ /* 9c */ 0x000000, 0x8fc0f4, 0x00c6b5, 0x8fc0f5,
+ /* a0 */ 0x000000, 0x8fc0f6, 0x000000, 0x8fc0f7,
+ /* a4 */ 0x00c5b1, 0x00d9fb, 0x8fc0f8, 0x000000,
+ /* a8 */ 0x8fc0f9, 0x00d9fc, 0x000000, 0x00c9ef,
+ /* ac */ 0x8fc0fa, 0x00c7c5, 0x00bba3, 0x000000,
+ /* b0 */ 0x00c0f1, 0x000000, 0x00cbd0, 0x8fc0fb,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00b3c9, 0x000000, 0x00daa5,
+ /* bc */ 0x00d9fe, 0x8fc0fc, 0x8fc0fd, 0x8fc0fe,
+
+ /*** Three byte table, leaf: e693xx - offset 0x02179 ***/
+
+ /* 80 */ 0x000000, 0x00cdca, 0x00daa7, 0x000000,
+ /* 84 */ 0x8fc1a1, 0x00daa3, 0x000000, 0x00daa4,
+ /* 88 */ 0x000000, 0x8fc1a2, 0x8fc1a3, 0x8fc1a4,
+ /* 8c */ 0x8fc1a5, 0x00c1e0, 0x8fc1a6, 0x000000,
+ /* 90 */ 0x8fc1a7, 0x8fc1a8, 0x00daa2, 0x000000,
+ /* 94 */ 0x00d9bf, 0x8fc1a9, 0x000000, 0x8fc1aa,
+ /* 98 */ 0x00daa6, 0x000000, 0x00daa1, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00daab, 0x00daac, 0x00c5a7, 0x00daae,
+ /* a4 */ 0x8fc1ab, 0x8fc1ac, 0x00bba4, 0x00daa9,
+ /* a8 */ 0x000000, 0x8fc1ad, 0x8fc1ae, 0x000000,
+ /* ac */ 0x00b5bc, 0x8fc1af, 0x000000, 0x00daaf,
+ /* b0 */ 0x8fc1b0, 0x00daa8, 0x00dab3, 0x000000,
+ /* b4 */ 0x00dab2, 0x8fc1b1, 0x00dab1, 0x8fc1b2,
+ /* b8 */ 0x000000, 0x000000, 0x00dab4, 0x8fc1b3,
+ /* bc */ 0x000000, 0x00dab6, 0x00bef1, 0x8fc1b4,
+
+ /*** Three byte table, leaf: e694xx - offset 0x021b9 ***/
+
+ /* 80 */ 0x00dab5, 0x8fc1b5, 0x000000, 0x000000,
+ /* 84 */ 0x8fc1b6, 0x00dab9, 0x000000, 0x000000,
+ /* 88 */ 0x8fc1b7, 0x8fc1b8, 0x8fc1b9, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fc1ba,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8fc1bb,
+ /* 94 */ 0x8fc1bc, 0x000000, 0x8fc1bd, 0x000000,
+ /* 98 */ 0x00dab7, 0x8fc1be, 0x000000, 0x8fc1bf,
+ /* 9c */ 0x00dab8, 0x00d9f0, 0x8fc1c0, 0x8fc1c1,
+ /* a0 */ 0x000000, 0x000000, 0x8fc1c2, 0x00dabb,
+ /* a4 */ 0x00daba, 0x000000, 0x8fc1c3, 0x000000,
+ /* a8 */ 0x000000, 0x8fc1c4, 0x00d9f8, 0x00dabc,
+ /* ac */ 0x00dab0, 0x000000, 0x8fc1c5, 0x00bbd9,
+ /* b0 */ 0x000000, 0x8fc1c6, 0x000000, 0x000000,
+ /* b4 */ 0x00dabd, 0x00dabe, 0x00dac0, 0x00dabf,
+ /* b8 */ 0x00dac1, 0x00b2fe, 0x8fc1c7, 0x00b9b6,
+ /* bc */ 0x8fc1c8, 0x8fc1c9, 0x00cafc, 0x00c0af,
+
+ /*** Three byte table, leaf: e695xx - offset 0x021f9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fc1ca,
+ /* 84 */ 0x000000, 0x00b8ce, 0x000000, 0x8fc1cb,
+ /* 88 */ 0x00dac3, 0x8fc1cc, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00dac6, 0x8ff4c1, 0x00c9d2,
+ /* 90 */ 0x8fc1cd, 0x00b5df, 0x8fc1ce, 0x000000,
+ /* 94 */ 0x8fc1cf, 0x00dac5, 0x00dac4, 0x00c7d4,
+ /* 98 */ 0x00dac7, 0x00b6b5, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00dac9, 0x00dac8, 0x8fc1d0,
+ /* a0 */ 0x8fc1d1, 0x000000, 0x00b4ba, 0x00bbb6,
+ /* a4 */ 0x000000, 0x000000, 0x00c6d8, 0x8fc1d2,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fc1d3,
+ /* ac */ 0x00b7c9, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00bff4, 0x000000, 0x00daca, 0x000000,
+ /* b4 */ 0x00c0b0, 0x00c5a8, 0x000000, 0x00c9df,
+ /* b8 */ 0x00dacb, 0x000000, 0x8fc1d4, 0x000000,
+ /* bc */ 0x000000, 0x8fc1d5, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x02238 ***/
+
+ /* 80 */ 0x000000, 0x8fc1d6, 0x00dacc, 0x00dacd,
+ /* 84 */ 0x000000, 0x8fc1d7, 0x000000, 0x00cab8,
+ /* 88 */ 0x00d5dd, 0x00c0c6, 0x8fc1d8, 0x000000,
+ /* 8c */ 0x00c9cc, 0x000000, 0x00bad8, 0x000000,
+ /* 90 */ 0x00c8e5, 0x00c8c3, 0x8fc1d9, 0x000000,
+ /* 94 */ 0x000000, 0x8fc1da, 0x000000, 0x00c5cd,
+ /* 98 */ 0x8fc1db, 0x00cec1, 0x000000, 0x00dacf,
+ /* 9c */ 0x00bcd0, 0x8fc1dc, 0x000000, 0x00dad0,
+ /* a0 */ 0x8fc1dd, 0x00b0b6, 0x000000, 0x8fc1de,
+ /* a4 */ 0x00b6d4, 0x00c0cd, 0x8fc1df, 0x00c9e0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00dad1,
+ /* ac */ 0x00bbc2, 0x00c3c7, 0x8fc1e0, 0x00bbdb,
+ /* b0 */ 0x00bfb7, 0x000000, 0x8fc1e1, 0x8fc1e2,
+ /* b4 */ 0x8fc1e3, 0x000000, 0x000000, 0x00dad2,
+ /* b8 */ 0x000000, 0x00cafd, 0x000000, 0x000000,
+ /* bc */ 0x00b1f7, 0x00bbdc, 0x000000, 0x8fc1e4,
+
+ /*** Three byte table, leaf: e697xx - offset 0x02278 ***/
+
+ /* 80 */ 0x000000, 0x00dad5, 0x8fc1e5, 0x00dad3,
+ /* 84 */ 0x00dad6, 0x00ceb9, 0x00dad4, 0x000000,
+ /* 88 */ 0x8fc1e6, 0x8fc1e7, 0x000000, 0x00c0fb,
+ /* 8c */ 0x00dad7, 0x000000, 0x8fc1e8, 0x00c2b2,
+ /* 90 */ 0x8fc1e9, 0x000000, 0x00dad8, 0x000000,
+ /* 94 */ 0x8fc1ea, 0x000000, 0x8fc1eb, 0x00b4fa,
+ /* 98 */ 0x8fc1ec, 0x00dada, 0x000000, 0x00dad9,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fc1ed,
+ /* a0 */ 0x00dadb, 0x00dadc, 0x00b4fb, 0x000000,
+ /* a4 */ 0x000000, 0x00c6fc, 0x00c3b6, 0x00b5ec,
+ /* a8 */ 0x00bbdd, 0x00c1e1, 0x000000, 0x000000,
+ /* ac */ 0x00bddc, 0x00b0b0, 0x000000, 0x000000,
+ /* b0 */ 0x8fc1ee, 0x00dadd, 0x8fc1ef, 0x000000,
+ /* b4 */ 0x8fc1f0, 0x8fc1f1, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fc1f2, 0x00b2a2, 0x00dae1,
+ /* bc */ 0x000000, 0x000000, 0x8fc1f3, 0x8fc1f4,
+
+ /*** Three byte table, leaf: e698xx - offset 0x022b8 ***/
+
+ /* 80 */ 0x8fc1f5, 0x000000, 0x00b9b7, 0x00dae0,
+ /* 84 */ 0x8fc1f6, 0x000000, 0x00baab, 0x00beba,
+ /* 88 */ 0x8fc1f7, 0x8fc1f8, 0x00dadf, 0x000000,
+ /* 8c */ 0x00bebb, 0x8fc1f9, 0x00ccc0, 0x00baaa,
+ /* 90 */ 0x000000, 0x8fc1fa, 0x8fc1fb, 0x00b0d7,
+ /* 94 */ 0x00c0ce, 0x8fc1fc, 0x8fc1fd, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00dae6, 0x8fc1fe, 0x8fc2a1, 0x00c0b1,
+ /* a0 */ 0x00b1c7, 0x8fc2a2, 0x8fc2a3, 0x8fc2a4,
+ /* a4 */ 0x8fc2a5, 0x00bdd5, 0x8fc2a6, 0x00cbe6,
+ /* a8 */ 0x00baf2, 0x8fc2a7, 0x8fc2a8, 0x8fc2a9,
+ /* ac */ 0x8fc2aa, 0x00bebc, 0x8fc2ab, 0x00c0a7,
+ /* b0 */ 0x8fc2ac, 0x8fc2ad, 0x000000, 0x8fc2ae,
+ /* b4 */ 0x00dae5, 0x00dae3, 0x00dae4, 0x8fc2b0,
+ /* b8 */ 0x000000, 0x8fc2af, 0x000000, 0x8ff4c2,
+ /* bc */ 0x00c3eb, 0x000000, 0x000000, 0x00dba6,
+
+ /*** Three byte table, leaf: e699xx - offset 0x022f8 ***/
+
+ /* 80 */ 0x8fc2b1, 0x00daea, 0x00bbfe, 0x00b9b8,
+ /* 84 */ 0x00dae8, 0x8fc2b2, 0x8fc2b3, 0x000000,
+ /* 88 */ 0x000000, 0x00dae9, 0x8fc2b4, 0x00bfb8,
+ /* 8c */ 0x8fc2b5, 0x000000, 0x8fc2b7, 0x00dae7,
+ /* 90 */ 0x000000, 0x8fc2b6, 0x00bbaf, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fc2b8,
+ /* 98 */ 0x8fc2b9, 0x8fc2ba, 0x000000, 0x8fc2bb,
+ /* 9c */ 0x8fc2bc, 0x00daec, 0x00daeb, 0x00daf0,
+ /* a0 */ 0x8fc2bd, 0x8fc2be, 0x00daf1, 0x000000,
+ /* a4 */ 0x00daed, 0x8ff4c3, 0x00b3a2, 0x00daee,
+ /* a8 */ 0x00daef, 0x00c8d5, 0x8fc2c0, 0x8fc2c1,
+ /* ac */ 0x8fc2c2, 0x000000, 0x00c9e1, 0x00b7ca,
+ /* b0 */ 0x00daf2, 0x000000, 0x000000, 0x8fc2c4,
+ /* b4 */ 0x00c0b2, 0x8fc2c5, 0x00bebd, 0x8fc2c7,
+ /* b8 */ 0x8fc2c8, 0x8fc2c9, 0x00c3d2, 0x8fc2ca,
+ /* bc */ 0x8fc2cc, 0x000000, 0x8fc2c3, 0x8fc2c6,
+
+ /*** Three byte table, leaf: e69axx - offset 0x02338 ***/
+
+ /* 80 */ 0x8fc2cb, 0x00b6c7, 0x000000, 0x00daf3,
+ /* 84 */ 0x00daf7, 0x000000, 0x000000, 0x00b2cb,
+ /* 88 */ 0x00daf4, 0x00daf6, 0x000000, 0x8fc2cd,
+ /* 8c */ 0x8fc2ce, 0x8fc2cf, 0x00daf5, 0x000000,
+ /* 90 */ 0x8fc2d0, 0x00bdeb, 0x8fc2d1, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c3c8, 0x00b0c5,
+ /* 98 */ 0x00daf8, 0x8fc2d2, 0x8fc2d3, 0x8fc2d4,
+ /* 9c */ 0x8fc2d5, 0x00daf9, 0x000000, 0x8fc2d6,
+ /* a0 */ 0x8fc2d7, 0x000000, 0x00c4aa, 0x000000,
+ /* a4 */ 0x8fc2d8, 0x000000, 0x00cef1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00bbc3,
+ /* ac */ 0x000000, 0x8fc2d9, 0x00caeb, 0x000000,
+ /* b0 */ 0x000000, 0x8fc2da, 0x8fc2db, 0x000000,
+ /* b4 */ 0x00cbbd, 0x8fc2dc, 0x000000, 0x000000,
+ /* b8 */ 0x00dba2, 0x00dafb, 0x000000, 0x8fc2dd,
+ /* bc */ 0x00dafe, 0x000000, 0x00dafd, 0x8fc2de,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x02378 ***/
+
+ /* 80 */ 0x8fc2df, 0x00dafa, 0x8fc2e0, 0x8fc2e1,
+ /* 84 */ 0x00dba1, 0x000000, 0x000000, 0x00c6de,
+ /* 88 */ 0x8fc2e2, 0x00dafc, 0x000000, 0x000000,
+ /* 8c */ 0x8fc2e3, 0x000000, 0x8fc2e4, 0x8fc2e5,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fc2e6, 0x000000, 0x00dba3, 0x000000,
+ /* 98 */ 0x000000, 0x00bdec, 0x00dba4, 0x8fc2e7,
+ /* 9c */ 0x00cdcb, 0x00c7f8, 0x000000, 0x8fc2e8,
+ /* a0 */ 0x00dba5, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dba7, 0x000000,
+ /* a8 */ 0x8fc2e9, 0x00dba8, 0x000000, 0x8fc2ea,
+ /* ac */ 0x8fc2eb, 0x000000, 0x8fc2ec, 0x000000,
+ /* b0 */ 0x00dba9, 0x000000, 0x00b6ca, 0x00b1c8,
+ /* b4 */ 0x00b9b9, 0x00dbaa, 0x000000, 0x00dbab,
+ /* b8 */ 0x00bdf1, 0x00c1e2, 0x8fc2ed, 0x8fc2bf,
+ /* bc */ 0x00d2d8, 0x00c1be, 0x00c1bd, 0x00c2d8,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x023b8 ***/
+
+ /* 80 */ 0x00bac7, 0x000000, 0x000000, 0x00d0f2,
+ /* 84 */ 0x000000, 0x8fc2ee, 0x000000, 0x8fc2ef,
+ /* 88 */ 0x00b7ee, 0x00cdad, 0x000000, 0x00cafe,
+ /* 8c */ 0x000000, 0x00c9fe, 0x8fc2f0, 0x00dbac,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x8fc2f1,
+ /* 94 */ 0x00baf3, 0x00c4bf, 0x00dbad, 0x00cfaf,
+ /* 98 */ 0x000000, 0x8fc2f2, 0x000000, 0x00cbbe,
+ /* 9c */ 0x8fc2f3, 0x00c4ab, 0x00dbae, 0x00b4fc,
+ /* a0 */ 0x8fc2f4, 0x000000, 0x8fc2f5, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dbaf, 0x00dbb0,
+ /* a8 */ 0x00ccda, 0x000000, 0x00cca4, 0x00cbf6,
+ /* ac */ 0x00cbdc, 0x00bba5, 0x00dbb2, 0x000000,
+ /* b0 */ 0x000000, 0x00bceb, 0x000000, 0x8fc2f6,
+ /* b4 */ 0x00cbd1, 0x000000, 0x00dbb4, 0x00dbb7,
+ /* b8 */ 0x00dbb6, 0x000000, 0x00b4f9, 0x000000,
+ /* bc */ 0x000000, 0x00b5e0, 0x8fc2f7, 0x00dbb3,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x023f8 ***/
+
+ /* 80 */ 0x000000, 0x00dbb5, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fc2f8, 0x00dbb8, 0x8fc2f9,
+ /* 88 */ 0x8fc2fa, 0x00bff9, 0x000000, 0x000000,
+ /* 8c */ 0x8fc2fb, 0x000000, 0x00cdfb, 0x00b0c9,
+ /* 90 */ 0x00bae0, 0x00c2bc, 0x000000, 0x00bcdd,
+ /* 94 */ 0x8fc2fc, 0x8fc2fd, 0x00bef3, 0x000000,
+ /* 98 */ 0x000000, 0x00dbbb, 0x000000, 0x000000,
+ /* 9c */ 0x00c5ce, 0x8fc2fe, 0x00dbb9, 0x00c2ab,
+ /* a0 */ 0x00dbba, 0x00bef2, 0x00ccdd, 0x00dbbc,
+ /* a4 */ 0x00dbbd, 0x00cde8, 0x8fc3a1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00dbc2, 0x000000,
+ /* ac */ 0x8fc3a2, 0x00b9ba, 0x8fc3a3, 0x00c7d5,
+ /* b0 */ 0x00dbbf, 0x00c5ec, 0x00dade, 0x00dae2,
+ /* b4 */ 0x8fc3a4, 0x00b5cf, 0x8fc3a5, 0x00c7c7,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8fc3a6,
+ /* bc */ 0x00dbc1, 0x000000, 0x00bebe, 0x00c8c4,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02438 ***/
+
+ /* 80 */ 0x000000, 0x8fc3a7, 0x000000, 0x000000,
+ /* 84 */ 0x8fc3a8, 0x00dbc7, 0x000000, 0x00c8fa,
+ /* 88 */ 0x000000, 0x00dbbe, 0x000000, 0x00dbc4,
+ /* 8c */ 0x00dbc3, 0x000000, 0x8fc3a9, 0x8fc3aa,
+ /* 90 */ 0x00c0cf, 0x8fc3ab, 0x000000, 0x8fc3ac,
+ /* 94 */ 0x000000, 0x00cbed, 0x8fc3ad, 0x00ced3,
+ /* 98 */ 0x8fc3ae, 0x8fc3af, 0x00cbe7, 0x8fc3b0,
+ /* 9c */ 0x00b2cc, 0x00bbde, 0x000000, 0x000000,
+ /* a0 */ 0x00cfc8, 0x00dbc6, 0x00bff5, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00dbc5, 0x000000,
+ /* a8 */ 0x000000, 0x00dbc0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00b8cf,
+ /* b0 */ 0x8fc3b1, 0x8fc3b2, 0x8fc3b3, 0x00dbcc,
+ /* b4 */ 0x00dbca, 0x8fc3b4, 0x00b2cd, 0x00dbc8,
+ /* b8 */ 0x00dbce, 0x00dbd4, 0x000000, 0x8fc3b5,
+ /* bc */ 0x8fc3b6, 0x8fc3b7, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x02478 ***/
+
+ /* 80 */ 0x8fc3b9, 0x00c2c8, 0x8fc3ba, 0x8fc3bb,
+ /* 84 */ 0x00cac1, 0x8fc3bc, 0x00dbd6, 0x000000,
+ /* 88 */ 0x8fc3bd, 0x8fc3be, 0x00c9a2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00dbd5, 0x00c7f0,
+ /* 90 */ 0x00cbbf, 0x00b4bb, 0x8fc3bf, 0x00c0f7,
+ /* 94 */ 0x00bdc0, 0x000000, 0x000000, 0x8fc3c0,
+ /* 98 */ 0x00c4d3, 0x8fc3c1, 0x00cdae, 0x000000,
+ /* 9c */ 0x8fc3c2, 0x00dbd1, 0x00dbd0, 0x000000,
+ /* a0 */ 0x000000, 0x8fc3c3, 0x00dbd2, 0x000000,
+ /* a4 */ 0x00dbcf, 0x000000, 0x8fc3c4, 0x00dbd7,
+ /* a8 */ 0x000000, 0x00dbcd, 0x000000, 0x000000,
+ /* ac */ 0x00dbcb, 0x000000, 0x00dbd3, 0x00dbc9,
+ /* b0 */ 0x8fc3c5, 0x00c3ec, 0x8fc3c6, 0x00ccf8,
+ /* b4 */ 0x00bcc6, 0x00baf4, 0x8fc3c7, 0x8fc3c8,
+ /* b8 */ 0x000000, 0x8fc3b8, 0x000000, 0x00baba,
+ /* bc */ 0x000000, 0x000000, 0x00cbef, 0x00b3c1,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x024b8 ***/
+
+ /* 80 */ 0x000000, 0x8ff4c6, 0x00c4ce, 0x00c6ca,
+ /* 84 */ 0x00b1c9, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00c0f2,
+ /* 94 */ 0x8fc3ca, 0x000000, 0x00c0b4, 0x00b7aa,
+ /* 98 */ 0x000000, 0x8fc3cb, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fc3cc, 0x00dbd9, 0x8fc3cd,
+ /* a0 */ 0x000000, 0x00b9bb, 0x00b3fc, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fc3cf,
+ /* a8 */ 0x8fc3ce, 0x00dbdb, 0x00b3f4, 0x00dbe1,
+ /* ac */ 0x8fc3d0, 0x8fc3d1, 0x000000, 0x8fc3d2,
+ /* b0 */ 0x8fc3d3, 0x8fc3d4, 0x00dbde, 0x8fc3d5,
+ /* b4 */ 0x00c0f3, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00b3cb, 0x00baac, 0x000000, 0x8fc3d6,
+ /* bc */ 0x00b3ca, 0x00bacf, 0x000000, 0x8fc3d7,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x024f8 ***/
+
+ /* 80 */ 0x00dbdc, 0x00b7e5, 0x00b7cb, 0x00c5ed,
+ /* 84 */ 0x8fc3d8, 0x8fc3d9, 0x00dbda, 0x000000,
+ /* 88 */ 0x00b0c6, 0x000000, 0x8fc3da, 0x000000,
+ /* 8c */ 0x8fc3db, 0x00dbdd, 0x00dbdf, 0x000000,
+ /* 90 */ 0x00b6cd, 0x00b7ac, 0x8fc3c9, 0x00b4bc,
+ /* 94 */ 0x00b5cb, 0x8fc3dc, 0x000000, 0x8fc3dd,
+ /* 98 */ 0x8fc3de, 0x00dbe2, 0x000000, 0x8fc3df,
+ /* 9c */ 0x00baf9, 0x00cbf1, 0x000000, 0x00bbb7,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dbe3,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00c9b0,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fc3e0,
+ /* ac */ 0x000000, 0x000000, 0x8fc3e1, 0x8fc3e2,
+ /* b0 */ 0x8fc3e3, 0x8fc3e4, 0x8fc3e5, 0x000000,
+ /* b4 */ 0x00dbef, 0x8fc3e6, 0x00b2b3, 0x00dbe4,
+ /* b8 */ 0x000000, 0x8fc3e7, 0x8fc3e8, 0x8fc3e9,
+ /* bc */ 0x8fc3ea, 0x000000, 0x00dbf5, 0x00dbe5,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02538 ***/
+
+ /* 80 */ 0x000000, 0x00cec2, 0x8fc3eb, 0x00dbec,
+ /* 84 */ 0x8fc3ec, 0x00c7df, 0x8fc3ed, 0x000000,
+ /* 88 */ 0x8fc3ee, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00dbf4, 0x000000, 0x00dbe7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00b0b4,
+ /* 94 */ 0x00dbe9, 0x000000, 0x8fc3ef, 0x00b9bc,
+ /* 98 */ 0x8fc3f0, 0x000000, 0x8fc3f1, 0x00dbeb,
+ /* 9c */ 0x8fc3f2, 0x00dbea, 0x000000, 0x00dbe6,
+ /* a0 */ 0x00dbf1, 0x8fc3f3, 0x00bebf, 0x8fc3f4,
+ /* a4 */ 0x000000, 0x8fc3f5, 0x00d4ed, 0x00b8e8,
+ /* a8 */ 0x00cdfc, 0x8fc3f6, 0x8fc3f7, 0x000000,
+ /* ac */ 0x000000, 0x00dbe8, 0x8fc3f8, 0x00c4f4,
+ /* b0 */ 0x00b3a3, 0x00baad, 0x8fc3f9, 0x00dbe0,
+ /* b4 */ 0x000000, 0x00dbf0, 0x00b3e1, 0x000000,
+ /* b8 */ 0x000000, 0x00dbee, 0x00dbf2, 0x8fc3fa,
+ /* bc */ 0x00c5ee,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02575 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00b4fe, 0x8fc3fb, 0x00dcb2, 0x000000,
+ /* 88 */ 0x8fc3fc, 0x00ccc9, 0x00dbf7, 0x00b4fd,
+ /* 8c */ 0x8fc3fd, 0x00dbfe, 0x000000, 0x8fc3fe,
+ /* 90 */ 0x8fc4a1, 0x8fc4a2, 0x00cbc0, 0x8fc4a3,
+ /* 94 */ 0x00dca1, 0x00dca3, 0x8fc4a4, 0x00dca7,
+ /* 98 */ 0x00dbf9, 0x8fc4a5, 0x00c3aa, 0x000000,
+ /* 9c */ 0x8fc4a6, 0x8fc4a7, 0x000000, 0x00c5ef,
+ /* a0 */ 0x00dcab, 0x00dbfc, 0x000000, 0x00dca8,
+ /* a4 */ 0x000000, 0x8fc4a8, 0x000000, 0x00dca2,
+ /* a8 */ 0x8fc4a9, 0x000000, 0x8fc4aa, 0x8fc4ab,
+ /* ac */ 0x8fc4ac, 0x8fc4ad, 0x00bfb9, 0x00dcac,
+ /* b0 */ 0x8fc4ae, 0x8fc4af, 0x00c0b3, 0x000000,
+ /* b4 */ 0x000000, 0x8fc4b0, 0x8fc4b1, 0x000000,
+ /* b8 */ 0x000000, 0x00dcaa, 0x00b4bd, 0x8fc4b2,
+ /* bc */ 0x8fc4b3, 0x8fc4b4, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x025b5 ***/
+
+ /* 80 */ 0x00cfd0, 0x00dbf6, 0x000000, 0x000000,
+ /* 84 */ 0x00dca6, 0x00b0d8, 0x8fc4b5, 0x000000,
+ /* 88 */ 0x00dbf8, 0x8fc4b6, 0x8fc4b7, 0x00ccba,
+ /* 8c */ 0x00dbfd, 0x00bfa2, 0x00c4c7, 0x00dbf3,
+ /* 90 */ 0x8fc4b8, 0x8fc4b9, 0x00dca5, 0x8fc4ba,
+ /* 94 */ 0x000000, 0x000000, 0x8fc4bb, 0x8fc4bc,
+ /* 98 */ 0x000000, 0x00bffa, 0x00dcaf, 0x00b3f1,
+ /* 9c */ 0x00b8a1, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00dcb1, 0x00dbfa, 0x00dcb0,
+ /* a4 */ 0x000000, 0x00dca9, 0x00dbfb, 0x000000,
+ /* a8 */ 0x00dcad, 0x000000, 0x00dcae, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00dcbf, 0x8fc4bd, 0x000000, 0x8fc4be,
+ /* b4 */ 0x00c6ce, 0x8fc4bf, 0x00dca4, 0x000000,
+ /* b8 */ 0x8fc4c0, 0x00dcbb, 0x000000, 0x8fc4c1,
+ /* bc */ 0x000000, 0x00dcbd, 0x000000, 0x00c4d8,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x025f5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fc4c2, 0x000000,
+ /* 84 */ 0x000000, 0x8fc4c3, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x8fc4c4, 0x00cdcc, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fc4c5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00c9f6,
+ /* 94 */ 0x00dcb8, 0x00c2ca, 0x000000, 0x8fc4c6,
+ /* 98 */ 0x000000, 0x00dcbe, 0x00c1bf, 0x8fc4c7,
+ /* 9c */ 0x00dcb5, 0x00dcc2, 0x00dcc1, 0x000000,
+ /* a0 */ 0x00c6ef, 0x00dcc0, 0x00c6ea, 0x8fc4c8,
+ /* a4 */ 0x8fc4c9, 0x8fc4ca, 0x8fc4cb, 0x000000,
+ /* a8 */ 0x8fc4cc, 0x8fc4cd, 0x00dcc4, 0x00dcb7,
+ /* ac */ 0x8fc4ce, 0x00b6c8, 0x00dcba, 0x00bddd,
+ /* b0 */ 0x8fc4cf, 0x8fc4d0, 0x8fc4d1, 0x00c7e0,
+ /* b4 */ 0x00dcbc, 0x00b6cb, 0x000000, 0x00dcb4,
+ /* b8 */ 0x00dcb6, 0x00dcb3, 0x8fc4d2, 0x8fc4d3,
+ /* bc */ 0x00cfb0, 0x00b3da, 0x00dcb9, 0x8fc4d4,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02635 ***/
+
+ /* 80 */ 0x8fc4d5, 0x00dcc3, 0x00b3b5, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00bae7, 0x000000,
+ /* 8c */ 0x000000, 0x8fc4d6, 0x00b1dd, 0x000000,
+ /* 90 */ 0x000000, 0x00dcd4, 0x8fc4d7, 0x000000,
+ /* 94 */ 0x00cfb1, 0x00dcd7, 0x8fc4d8, 0x000000,
+ /* 98 */ 0x8fc4d9, 0x000000, 0x000000, 0x00bfba,
+ /* 9c */ 0x00dcd6, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00dcd5, 0x8fc4da, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fc4db, 0x8fc4dc, 0x00dcd2,
+ /* a8 */ 0x8fc4dd, 0x000000, 0x000000, 0x8fc4de,
+ /* ac */ 0x000000, 0x8fc4df, 0x00dcc6, 0x8fc4e0,
+ /* b0 */ 0x000000, 0x00dce3, 0x00dcc5, 0x000000,
+ /* b4 */ 0x00dcd8, 0x000000, 0x000000, 0x8fc4e1,
+ /* b8 */ 0x8fc4e2, 0x000000, 0x8fc4e3, 0x00dcd0,
+ /* bc */ 0x8fc4e4, 0x000000, 0x00dccb, 0x00dcc8,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x02675 ***/
+
+ /* 80 */ 0x000000, 0x00dcc9, 0x000000, 0x00dcd1,
+ /* 84 */ 0x000000, 0x8fc4e5, 0x000000, 0x00f4a2,
+ /* 88 */ 0x8fc4e6, 0x000000, 0x00dcce, 0x00b9bd,
+ /* 8c */ 0x00c4c8, 0x00c1e4, 0x00dccc, 0x000000,
+ /* 90 */ 0x00dcc7, 0x8fc4e7, 0x000000, 0x00dcca,
+ /* 94 */ 0x000000, 0x000000, 0x8fc4e8, 0x8fc4e9,
+ /* 98 */ 0x00cdcd, 0x00cbea, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00dccf, 0x00dcd9, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fc4ea, 0x000000,
+ /* a4 */ 0x000000, 0x8fc4eb, 0x000000, 0x00dce1,
+ /* a8 */ 0x00dcda, 0x000000, 0x000000, 0x00dce7,
+ /* ac */ 0x000000, 0x00dce5, 0x8fc4ec, 0x8fc4ed,
+ /* b0 */ 0x000000, 0x8fc4ee, 0x00dce0, 0x8fc4ef,
+ /* b4 */ 0x000000, 0x8fc4f0, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00dcdf, 0x000000, 0x00c4d0,
+ /* bc */ 0x000000, 0x00c1e5, 0x8fc4f1, 0x00dcdd,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x026b5 ***/
+
+ /* 80 */ 0x8fc4f2, 0x8fc4f3, 0x00dcdb, 0x8fc4f4,
+ /* 84 */ 0x000000, 0x00dce2, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00dce8, 0x00c8f5,
+ /* 8c */ 0x00dcee, 0x000000, 0x000000, 0x8fc4f5,
+ /* 90 */ 0x000000, 0x8fc4f6, 0x00dce9, 0x00dcec,
+ /* 94 */ 0x00dce6, 0x8fc4f7, 0x000000, 0x00c3f4,
+ /* 98 */ 0x000000, 0x00c9b8, 0x8fc4f8, 0x00dcdc,
+ /* 9c */ 0x000000, 0x8fc4f9, 0x00dce4, 0x00bec0,
+ /* a0 */ 0x8fc4fa, 0x00cccf, 0x00dcf8, 0x00dceb,
+ /* a4 */ 0x8fc4fb, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fc4fc, 0x00b8a2, 0x00b2a3, 0x00b3df,
+ /* ac */ 0x000000, 0x000000, 0x00dcd3, 0x000000,
+ /* b0 */ 0x8fc4fd, 0x000000, 0x8fc4fe, 0x000000,
+ /* b4 */ 0x8fc5a1, 0x00bec1, 0x00dcf0, 0x8fc5a2,
+ /* b8 */ 0x00dcf7, 0x00bcf9, 0x00b3f2, 0x8fc5a3,
+ /* bc */ 0x000000, 0x00c3ae, 0x8fc5a4, 0x8fc5a5,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x026f5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00dced, 0x8fc5a6, 0x8fc5a7, 0x00dcf2,
+ /* 88 */ 0x00dcf6, 0x8fc5a8, 0x8fc5a9, 0x00b6b6,
+ /* 8c */ 0x000000, 0x000000, 0x8fc5aa, 0x000000,
+ /* 90 */ 0x8fc5ab, 0x8fc5ac, 0x8fc5ad, 0x000000,
+ /* 94 */ 0x000000, 0x8fc5ae, 0x8fc5af, 0x000000,
+ /* 98 */ 0x00b5cc, 0x00dcf4, 0x000000, 0x8fc5b0,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00b5a1,
+ /* a0 */ 0x000000, 0x00c6cb, 0x00dcf3, 0x000000,
+ /* a4 */ 0x8fc5b1, 0x000000, 0x00dcf5, 0x8fc5b2,
+ /* a8 */ 0x000000, 0x000000, 0x8fc5b3, 0x8ff4c9,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fc5b4, 0x00dcef, 0x8fc5b5,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dcf1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fc5b6, 0x00b3e0,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02735 ***/
+
+ /* 80 */ 0x00c3c9, 0x8fc5b7, 0x000000, 0x8fc5b8,
+ /* 84 */ 0x00dcfc, 0x000000, 0x8fc5b9, 0x8fc5ba,
+ /* 88 */ 0x000000, 0x8fc5bb, 0x000000, 0x8fc5bc,
+ /* 8c */ 0x000000, 0x00dcfa, 0x00b8e9, 0x000000,
+ /* 90 */ 0x00dcf9, 0x8fc5bd, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00dda1,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8fc5be,
+ /* 9c */ 0x00dbd8, 0x8fc5bf, 0x8fc5c0, 0x8fc5c1,
+ /* a0 */ 0x00dcfb, 0x000000, 0x00dcfd, 0x00dcfe,
+ /* a4 */ 0x000000, 0x8fc5c2, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00ddac, 0x8fc5c3,
+ /* ac */ 0x00dda8, 0x000000, 0x00dbed, 0x8fc5c4,
+ /* b0 */ 0x8fc5c5, 0x8fc5c6, 0x000000, 0x00dda7,
+ /* b4 */ 0x8fc5c7, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dda6, 0x000000, 0x000000, 0x00dda3,
+ /* bc */ 0x000000, 0x8fc5c8, 0x8fc5c9, 0x8fc5ca,
+
+ /*** Three byte table, leaf: e6abxx - offset 0x02775 ***/
+
+ /* 80 */ 0x000000, 0x00dcea, 0x00dda5, 0x00dda4,
+ /* 84 */ 0x000000, 0x000000, 0x8fc5cb, 0x000000,
+ /* 88 */ 0x8fc5cd, 0x8fc5cc, 0x000000, 0x000000,
+ /* 8c */ 0x8fc5ce, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fc5cf, 0x00ddaa, 0x000000, 0x00cfa6,
+ /* 94 */ 0x8fc5d0, 0x8fc5d1, 0x8fc5d2, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00ddad, 0x00b6fb,
+ /* 9c */ 0x8fc5d3, 0x8fc5d4, 0x00dda9, 0x00ddab,
+ /* a0 */ 0x000000, 0x000000, 0x8ff4ca, 0x000000,
+ /* a4 */ 0x8fc5d5, 0x000000, 0x000000, 0x8fc5d6,
+ /* a8 */ 0x00c8a7, 0x000000, 0x00ddae, 0x000000,
+ /* ac */ 0x8fc5d7, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fc5d8, 0x8fc5d9, 0x8fc5da, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00ddb2, 0x00ddaf,
+ /* bc */ 0x8fc5db, 0x8fc5dc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x027b3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fc5dd, 0x8fc5de,
+ /* 84 */ 0x00cdf3, 0x00ddb0, 0x8fc5df, 0x8fc5e0,
+ /* 88 */ 0x000000, 0x8fc5e1, 0x00dcde, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fc5e2,
+ /* 90 */ 0x8fc5e3, 0x8fc5e4, 0x00ddb3, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00ddb4, 0x8fc5e5,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8fc5e6,
+ /* 9c */ 0x000000, 0x00b1b5, 0x8fc5e7, 0x00ddb6,
+ /* a0 */ 0x00b7e7, 0x00bca1, 0x000000, 0x00b6d5,
+ /* a4 */ 0x8fc5e8, 0x000000, 0x000000, 0x00b2a4,
+ /* a8 */ 0x8fc5e9, 0x000000, 0x000000, 0x8fc5ea,
+ /* ac */ 0x8fc5eb, 0x000000, 0x000000, 0x8fc5ec,
+ /* b0 */ 0x000000, 0x000000, 0x00cddf, 0x000000,
+ /* b4 */ 0x000000, 0x8fc5ed, 0x8fc5ee, 0x00ddb8,
+ /* b8 */ 0x00ddb7, 0x00ddba, 0x00b5bd, 0x8fc5ef,
+ /* bc */ 0x000000, 0x00b6d6, 0x00b4be, 0x8fc5f0,
+
+ /*** Three byte table, leaf: e6adxx - offset 0x027f3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00ddbd,
+ /* 84 */ 0x000000, 0x000000, 0x8fc5f1, 0x00ddbc,
+ /* 88 */ 0x000000, 0x00ddbe, 0x8fc5f2, 0x000000,
+ /* 8c */ 0x00b2ce, 0x8fc5f3, 0x00c3b7, 0x000000,
+ /* 90 */ 0x00ddbf, 0x000000, 0x8fc5f4, 0x00b4bf,
+ /* 94 */ 0x00ddc1, 0x000000, 0x8fc5f5, 0x000000,
+ /* 98 */ 0x8fc5f6, 0x00ddc0, 0x000000, 0x00ddc2,
+ /* 9c */ 0x000000, 0x8fc5f7, 0x000000, 0x00ddc3,
+ /* a0 */ 0x8fc5f8, 0x00ddc4, 0x00bbdf, 0x00c0b5,
+ /* a4 */ 0x00baa1, 0x000000, 0x00c9f0, 0x8fc5f9,
+ /* a8 */ 0x000000, 0x00cae2, 0x00cfc4, 0x8fc5fa,
+ /* ac */ 0x000000, 0x000000, 0x8fc5fb, 0x00bbf5,
+ /* b0 */ 0x8fc5fc, 0x000000, 0x000000, 0x00bad0,
+ /* b4 */ 0x00cef2, 0x8fc5fd, 0x000000, 0x000000,
+ /* b8 */ 0x00ddc5, 0x00ddc6, 0x000000, 0x00bbe0,
+ /* bc */ 0x000000, 0x8fc5fe, 0x8fc6a1, 0x00ddc7,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02833 ***/
+
+ /* 80 */ 0x00ddc8, 0x000000, 0x8fc6a2, 0x00ddca,
+ /* 84 */ 0x00ddc9, 0x8fc6a3, 0x00cbd8, 0x000000,
+ /* 88 */ 0x000000, 0x00bdde, 0x00bcec, 0x00bbc4,
+ /* 8c */ 0x000000, 0x00ddcb, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00ddcd, 0x00bfa3, 0x8fc6a4,
+ /* 98 */ 0x00ddcc, 0x000000, 0x000000, 0x8fc6a5,
+ /* 9c */ 0x000000, 0x000000, 0x00ddce, 0x8fc6a6,
+ /* a0 */ 0x8fc6a7, 0x000000, 0x8fc6a8, 0x8fc6a9,
+ /* a4 */ 0x00ddcf, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fc6aa, 0x8fc6ab, 0x00ddd0, 0x00ddd1,
+ /* ac */ 0x8fc6ac, 0x8fc6ad, 0x8fc6ae, 0x00ddd2,
+ /* b0 */ 0x8fc6af, 0x00ddd4, 0x00ddd3, 0x00ddd5,
+ /* b4 */ 0x00b2a5, 0x00c3ca, 0x000000, 0x00ddd6,
+ /* b8 */ 0x8fc6b0, 0x8fc6b1, 0x00bba6, 0x00b3cc,
+ /* bc */ 0x00ddd7, 0x8fc6b2, 0x8fc6b3, 0x00c5c2,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x02873 ***/
+
+ /* 80 */ 0x00d4cc, 0x000000, 0x000000, 0x8fc6b4,
+ /* 84 */ 0x8fc6b5, 0x00b5a3, 0x00ddd8, 0x000000,
+ /* 88 */ 0x000000, 0x8fc6b6, 0x000000, 0x00ddd9,
+ /* 8c */ 0x8fc6b7, 0x00caec, 0x00cbe8, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00c6c7, 0x00ddda,
+ /* 94 */ 0x00c8e6, 0x000000, 0x8fc6b8, 0x000000,
+ /* 98 */ 0x00c8fb, 0x000000, 0x8fc6b9, 0x00ccd3,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00dddb,
+ /* a0 */ 0x000000, 0x8fc6ba, 0x000000, 0x8fc6bb,
+ /* a4 */ 0x000000, 0x000000, 0x8fc6bc, 0x8fc6bd,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00dddd,
+ /* ac */ 0x00dddc, 0x000000, 0x8fc6be, 0x00dddf,
+ /* b0 */ 0x000000, 0x8fc6bf, 0x000000, 0x00ddde,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fc6c0,
+ /* b8 */ 0x000000, 0x8fc6c1, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fc6c2,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x028b3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fc6c3, 0x000000,
+ /* 84 */ 0x8fc6c4, 0x8fc6c5, 0x000000, 0x000000,
+ /* 88 */ 0x00dde1, 0x8fc6c6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fc6c7, 0x8fc6c8, 0x00bbe1,
+ /* 90 */ 0x8fc6c9, 0x00ccb1, 0x8fc6ca, 0x00dde2,
+ /* 94 */ 0x00dde3, 0x000000, 0x000000, 0x00b5a4,
+ /* 98 */ 0x000000, 0x8fc6cb, 0x000000, 0x00dde4,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fc6cc,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dde6,
+ /* a4 */ 0x00dde5, 0x000000, 0x8fc6cd, 0x8fc6ce,
+ /* a8 */ 0x8fc6cf, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fc6d0, 0x000000, 0x8fc6d1, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fc6d2,
+ /* b4 */ 0x00bfe5, 0x8fc6d3, 0x8fc6d4, 0x00c9b9,
+ /* b8 */ 0x00b1ca, 0x000000, 0x8fc6d5, 0x8fc6d6,
+ /* bc */ 0x000000, 0x000000, 0x00c8c5, 0x8fc6d7,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x028f3 ***/
+
+ /* 80 */ 0x00c4f5, 0x00bdc1, 0x00b5e1, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fc6d8, 0x8fc6d9,
+ /* 8c */ 0x000000, 0x8fc6da, 0x00c8c6, 0x8fc6db,
+ /* 90 */ 0x00bcae, 0x000000, 0x8fc6dc, 0x000000,
+ /* 94 */ 0x8fc6dd, 0x00dde8, 0x000000, 0x00b4c0,
+ /* 98 */ 0x000000, 0x8fc6de, 0x00b1f8, 0x8fc6df,
+ /* 9c */ 0x8fc6e0, 0x00c6f2, 0x00dde7, 0x00b9be,
+ /* a0 */ 0x00c3d3, 0x000000, 0x00dde9, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fc7b6,
+ /* a8 */ 0x00ddf1, 0x000000, 0x00ddea, 0x8fc6e1,
+ /* ac */ 0x000000, 0x8fc6e2, 0x000000, 0x8fc6e3,
+ /* b0 */ 0x00c2c1, 0x000000, 0x00b5e2, 0x00ddf2,
+ /* b4 */ 0x8fc6e4, 0x000000, 0x8fc6e5, 0x000000,
+ /* b8 */ 0x8fc6e6, 0x8fc6e7, 0x00b7e8, 0x8fc6e8,
+ /* bc */ 0x000000, 0x00b5a5, 0x00ddf0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02932 ***/
+
+ /* 80 */ 0x000000, 0x00ddee, 0x00ddeb, 0x00cde0,
+ /* 84 */ 0x000000, 0x8fc6e9, 0x8fc6ea, 0x8fc6eb,
+ /* 88 */ 0x00c4c0, 0x8fc6ec, 0x000000, 0x000000,
+ /* 8c */ 0x00c6d9, 0x00ddec, 0x000000, 0x000000,
+ /* 90 */ 0x00ddf4, 0x000000, 0x00ddf3, 0x00b7a3,
+ /* 94 */ 0x8fc6ed, 0x8fc6ee, 0x00b2ad, 0x8fc6ef,
+ /* 98 */ 0x8fc6f0, 0x00babb, 0x00dded, 0x00ddef,
+ /* 9c */ 0x8fc6f1, 0x000000, 0x000000, 0x8fc6f2,
+ /* a0 */ 0x000000, 0x00cbd7, 0x00c2f4, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00cbf7,
+ /* ac */ 0x000000, 0x000000, 0x00ddfc, 0x000000,
+ /* b0 */ 0x8fc6f3, 0x00ddfd, 0x8fc6f4, 0x00b2cf,
+ /* b4 */ 0x8fc6f5, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00caa8, 0x00ccfd, 0x00dea1, 0x00bca3,
+ /* bc */ 0x00bec2, 0x00ddf8, 0x00ddfe, 0x00b1e8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02972 ***/
+
+ /* 80 */ 0x000000, 0x00b6b7, 0x8fc6f6, 0x000000,
+ /* 84 */ 0x00ddf5, 0x00ddfa, 0x8fc6f7, 0x000000,
+ /* 88 */ 0x000000, 0x00c0f4, 0x00c7f1, 0x000000,
+ /* 8c */ 0x00c8e7, 0x8fc6f8, 0x000000, 0x8fc6f9,
+ /* 90 */ 0x8fc6fa, 0x8fc6fb, 0x8fc6fc, 0x00ddf7,
+ /* 94 */ 0x8fc6fd, 0x00cba1, 0x8fc6fe, 0x00ddf9,
+ /* 98 */ 0x000000, 0x00dea4, 0x8fc7a1, 0x00dea2,
+ /* 9c */ 0x8fc7a2, 0x00ddfb, 0x000000, 0x000000,
+ /* a0 */ 0x8fc7a3, 0x00cba2, 0x00c7c8, 0x00b5e3,
+ /* a4 */ 0x000000, 0x00c5a5, 0x000000, 0x8fc7a4,
+ /* a8 */ 0x00c3ed, 0x8fc7a5, 0x00dea5, 0x8fc7a6,
+ /* ac */ 0x8fc7a7, 0x000000, 0x8fc7a8, 0x00dea3,
+ /* b0 */ 0x00c2d9, 0x00ddf6, 0x8fc7a9, 0x00b1cb,
+ /* b4 */ 0x8fc7aa, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x029ae ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fc7ab, 0x000000, 0x000000, 0x8fc7ac,
+ /* 88 */ 0x000000, 0x000000, 0x8fc7ad, 0x00cdce,
+ /* 8c */ 0x00deb0, 0x000000, 0x8fc7ae, 0x8fc7af,
+ /* 90 */ 0x000000, 0x8fc7b0, 0x00deaf, 0x8fc7b1,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00c0f6,
+ /* 98 */ 0x000000, 0x00deac, 0x8fc7b2, 0x00cdec,
+ /* 9c */ 0x000000, 0x000000, 0x00c6b6, 0x00dea6,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c4c5, 0x8fc7b3, 0x8fc7b4,
+ /* a8 */ 0x8fc7b5, 0x00b1cc, 0x00b9bf, 0x00dea9,
+ /* ac */ 0x000000, 0x000000, 0x8fc7b7, 0x8fc7b8,
+ /* b0 */ 0x000000, 0x8fc7b9, 0x00bda7, 0x00deae,
+ /* b4 */ 0x000000, 0x00dead, 0x00dea8, 0x000000,
+ /* b8 */ 0x00deab, 0x8fc7ba, 0x000000, 0x00b3e8,
+ /* bc */ 0x8fc7bb, 0x00deaa, 0x00c7c9, 0x8fc7bc,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x029ee ***/
+
+ /* 80 */ 0x000000, 0x00ceae, 0x000000, 0x000000,
+ /* 84 */ 0x00bef4, 0x00c0f5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fc7bd,
+ /* 98 */ 0x000000, 0x00deb6, 0x00deb4, 0x000000,
+ /* 9c */ 0x00c9cd, 0x000000, 0x8fc7be, 0x8fc7bf,
+ /* a0 */ 0x000000, 0x8fc7c0, 0x000000, 0x00deb1,
+ /* a4 */ 0x00deb3, 0x8fc7c1, 0x00b1ba, 0x8fc7c2,
+ /* a8 */ 0x000000, 0x00b9c0, 0x00cfb2, 0x000000,
+ /* ac */ 0x00b3bd, 0x000000, 0x00c9e2, 0x8fc7c3,
+ /* b0 */ 0x8fc7c4, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00cde1, 0x000000, 0x000000, 0x00b3a4,
+ /* b8 */ 0x00bfbb, 0x00deb5, 0x000000, 0x000000,
+ /* bc */ 0x8fc7c5, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02a2c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fc7c6, 0x000000,
+ /* 84 */ 0x000000, 0x00deba, 0x000000, 0x8fc7c7,
+ /* 88 */ 0x00bec3, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00cdb0, 0x000000, 0x00deb7, 0x000000,
+ /* 90 */ 0x000000, 0x8fc7c8, 0x8fc7c9, 0x00deb2,
+ /* 94 */ 0x8fc7ca, 0x00deb8, 0x8fc7cb, 0x8fc7cc,
+ /* 98 */ 0x8fc7cd, 0x00cede, 0x000000, 0x00c5f3,
+ /* 9c */ 0x00c6c2, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fc7ce, 0x000000,
+ /* ac */ 0x8fc7cf, 0x000000, 0x000000, 0x00b3b6,
+ /* b0 */ 0x000000, 0x000000, 0x00b1d5, 0x000000,
+ /* b4 */ 0x8fc7d0, 0x00debe, 0x000000, 0x8fc7d1,
+ /* b8 */ 0x00dec1, 0x8fc7d2, 0x000000, 0x000000,
+ /* bc */ 0x00cec3, 0x8fc7d3, 0x000000, 0x8fc7d4,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02a6c ***/
+
+ /* 80 */ 0x00cde4, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fc7d5, 0x00dec8, 0x00dec2, 0x00debf,
+ /* 88 */ 0x8fc7d6, 0x000000, 0x8fc7d7, 0x00ced4,
+ /* 8c */ 0x00dec5, 0x000000, 0x8fc7d8, 0x8fc7d9,
+ /* 90 */ 0x000000, 0x00bdca, 0x00dec7, 0x000000,
+ /* 94 */ 0x000000, 0x00decc, 0x8fc7da, 0x000000,
+ /* 98 */ 0x00c5f1, 0x00deca, 0x000000, 0x8fc7db,
+ /* 9c */ 0x000000, 0x8fc7dc, 0x00dec4, 0x8fc7dd,
+ /* a0 */ 0x8fc7de, 0x00c3b8, 0x8fc7df, 0x000000,
+ /* a4 */ 0x00decb, 0x8fc7e0, 0x00dec0, 0x000000,
+ /* a8 */ 0x00dec6, 0x8fc7e1, 0x00decd, 0x00b0fc,
+ /* ac */ 0x00dec3, 0x000000, 0x00dece, 0x8fc7e2,
+ /* b0 */ 0x8fc7e3, 0x00bfbc, 0x8ff4cc, 0x00bddf,
+ /* b4 */ 0x8fc7e4, 0x00caa5, 0x8fc7e5, 0x00baae,
+ /* b8 */ 0x8ff4cb, 0x00debb, 0x00dec9, 0x00c5ba,
+ /* bc */ 0x8fc7e6, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02aac ***/
+
+ /* 80 */ 0x8fc7e7, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fc7e8, 0x00c0b6, 0x000000, 0x00b3e9,
+ /* 88 */ 0x00bad1, 0x00bec4, 0x00debd, 0x00bdc2,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00b7cc,
+ /* 94 */ 0x000000, 0x00debc, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00ded2, 0x00bded, 0x00b8ba,
+ /* 9c */ 0x000000, 0x00dee1, 0x8fc7e9, 0x00dedb,
+ /* a0 */ 0x00b5f4, 0x00c5cf, 0x8fc7ea, 0x00ded6,
+ /* a4 */ 0x00dedf, 0x00b0af, 0x00b1b2, 0x8fc7eb,
+ /* a8 */ 0x000000, 0x00b2b9, 0x000000, 0x00ded8,
+ /* ac */ 0x00c2ac, 0x00decf, 0x00ded1, 0x00b9c1,
+ /* b0 */ 0x000000, 0x000000, 0x8fc7ec, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fc7ed, 0x000000,
+ /* b8 */ 0x00dee2, 0x8fc7ee, 0x00dedd, 0x8fc7ef,
+ /* bc */ 0x8fc7f0, 0x000000, 0x00ded5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02aeb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00dedc,
+ /* 84 */ 0x8fc7f1, 0x8fc7f2, 0x000000, 0x000000,
+ /* 88 */ 0x8fc7f3, 0x8fc7f4, 0x00ccab, 0x8fc7f5,
+ /* 8c */ 0x000000, 0x00deda, 0x00dede, 0x8fc7f6,
+ /* 90 */ 0x000000, 0x8fc7f7, 0x8fc7f8, 0x8fc7f9,
+ /* 94 */ 0x8fc7fa, 0x000000, 0x00b8d0, 0x8fc7fb,
+ /* 98 */ 0x00bec5, 0x000000, 0x000000, 0x00c3b9,
+ /* 9c */ 0x8fc7fc, 0x8fc7fd, 0x8fc7fe, 0x00ded4,
+ /* a0 */ 0x000000, 0x000000, 0x8fc8a1, 0x8fc8a2,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00cdaf,
+ /* a8 */ 0x8fc8a3, 0x000000, 0x000000, 0x00ded7,
+ /* ac */ 0x000000, 0x000000, 0x00ded0, 0x00c5f2,
+ /* b0 */ 0x000000, 0x000000, 0x00ded3, 0x8fc8a4,
+ /* b4 */ 0x000000, 0x000000, 0x00ded9, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x8fc8a5,
+ /* bc */ 0x000000, 0x8fc8a6, 0x00cfd1, 0x00bcbe,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02b2b ***/
+
+ /* 80 */ 0x00cbfe, 0x000000, 0x00dee3, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00c8ae, 0x8fc8a7, 0x000000, 0x00deef,
+ /* 90 */ 0x00b8bb, 0x000000, 0x000000, 0x8fc8a8,
+ /* 94 */ 0x000000, 0x000000, 0x00bde0, 0x000000,
+ /* 98 */ 0x00dee5, 0x8fc8a9, 0x000000, 0x000000,
+ /* 9c */ 0x00ceaf, 0x00b9c2, 0x000000, 0x00def2,
+ /* a0 */ 0x8fc8aa, 0x000000, 0x00b0ee, 0x000000,
+ /* a4 */ 0x000000, 0x00def0, 0x000000, 0x8fc8ab,
+ /* a8 */ 0x000000, 0x000000, 0x00dee4, 0x000000,
+ /* ac */ 0x000000, 0x8fc8ac, 0x8fc8ad, 0x00deea,
+ /* b0 */ 0x000000, 0x8fc8ae, 0x00deec, 0x8fc8af,
+ /* b4 */ 0x000000, 0x000000, 0x00cdcf, 0x00dee7,
+ /* b8 */ 0x000000, 0x000000, 0x00c5ae, 0x8fc8b0,
+ /* bc */ 0x000000, 0x00dee9, 0x000000, 0x8fc8b1,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02b6b ***/
+
+ /* 80 */ 0x8fc8b2, 0x8fc8b3, 0x00def1, 0x8fc8b4,
+ /* 84 */ 0x00deeb, 0x00ccc7, 0x000000, 0x8fc8b5,
+ /* 88 */ 0x8fc8b6, 0x00dee6, 0x8fc8b7, 0x00bca2,
+ /* 8c */ 0x00defe, 0x8fc8b8, 0x8fc8b9, 0x8fc8ba,
+ /* 90 */ 0x000000, 0x00b3ea, 0x000000, 0x00dee8,
+ /* 94 */ 0x00deed, 0x00deee, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00c2ec, 0x00c2da, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fc8bb,
+ /* ac */ 0x00def6, 0x8fc8bc, 0x8fc8bd, 0x00defc,
+ /* b0 */ 0x000000, 0x000000, 0x00defa, 0x000000,
+ /* b4 */ 0x00c5a9, 0x000000, 0x000000, 0x00dfa3,
+ /* b8 */ 0x00def7, 0x8fc8be, 0x000000, 0x8fc8bf,
+ /* bc */ 0x000000, 0x8fc8c0, 0x00def8, 0x00dee0,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02bab ***/
+
+ /* 80 */ 0x000000, 0x00b5f9, 0x00c9ba, 0x000000,
+ /* 84 */ 0x8fc8c1, 0x000000, 0x00bcbf, 0x000000,
+ /* 88 */ 0x8fc8c2, 0x00b9f7, 0x8fc8c3, 0x000000,
+ /* 8c */ 0x8fc8c4, 0x8fc8c5, 0x000000, 0x00cfb3,
+ /* 90 */ 0x000000, 0x00def4, 0x000000, 0x00dfa2,
+ /* 94 */ 0x00b1e9, 0x00c1e6, 0x8fc8c6, 0x000000,
+ /* 98 */ 0x8fc8c7, 0x000000, 0x8fc8c8, 0x8fc8c9,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c7f9, 0x000000, 0x00b4c1, 0x00cefa,
+ /* a4 */ 0x000000, 0x000000, 0x8fc8ca, 0x000000,
+ /* a8 */ 0x000000, 0x8fc8cb, 0x8fc8cc, 0x00cca1,
+ /* ac */ 0x00c4d2, 0x8fc8d3, 0x000000, 0x8fc8cd,
+ /* b0 */ 0x8fc8ce, 0x00defb, 0x00defd, 0x8fc8cf,
+ /* b4 */ 0x000000, 0x000000, 0x8fc8d0, 0x000000,
+ /* b8 */ 0x00c1b2, 0x000000, 0x000000, 0x8fc8d1,
+ /* bc */ 0x8fc8d2, 0x000000, 0x00dfa1, 0x00def9,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02beb ***/
+
+ /* 80 */ 0x000000, 0x00def3, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b4c3, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fc8d4,
+ /* 90 */ 0x000000, 0x8fc8d5, 0x8fc8d6, 0x8fc8d7,
+ /* 94 */ 0x00b7e9, 0x000000, 0x000000, 0x8fc8d8,
+ /* 98 */ 0x00dfaf, 0x8fc8d9, 0x8fc8da, 0x00dfaa,
+ /* 9c */ 0x00c0f8, 0x8fc8db, 0x8fc8dc, 0x00b3e3,
+ /* a0 */ 0x000000, 0x8fc8dd, 0x8fc8de, 0x000000,
+ /* a4 */ 0x00bde1, 0x000000, 0x00dfb3, 0x000000,
+ /* a8 */ 0x8fc8df, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fc8e0, 0x00dfac, 0x00c4ac, 0x00dfa9,
+ /* b0 */ 0x00c4d9, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00dfcc, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dfa6, 0x000000, 0x00dfa5, 0x000000,
+ /* bc */ 0x00dfae, 0x8fc8e1, 0x8fc8e2, 0x000000,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02c2b ***/
+
+ /* 80 */ 0x00dfa8, 0x00dfa7, 0x00dfad, 0x8fc8e3,
+ /* 84 */ 0x00c0a1, 0x000000, 0x00dfa4, 0x8fc8e4,
+ /* 88 */ 0x8fc8e5, 0x000000, 0x000000, 0x8fc8e6,
+ /* 8c */ 0x8fc8e7, 0x8fc8e8, 0x00dfb0, 0x000000,
+ /* 90 */ 0x8fc8e9, 0x00dfb1, 0x8fc8ea, 0x8fc8eb,
+ /* 94 */ 0x8fc8ec, 0x000000, 0x8fc8ed, 0x00b4c2,
+ /* 98 */ 0x000000, 0x000000, 0x8fc8ee, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fc8ef,
+ /* a0 */ 0x8fc8f0, 0x00dfb6, 0x000000, 0x00dfb5,
+ /* a4 */ 0x00dfb7, 0x8fc8f1, 0x8fc8f2, 0x8fc8f3,
+ /* a8 */ 0x8fc8f4, 0x000000, 0x00dfba, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fc8f5, 0x8fc8f6,
+ /* b0 */ 0x8fc8f7, 0x00c5c3, 0x000000, 0x00dfb4,
+ /* b4 */ 0x000000, 0x8fc8f8, 0x8fc8f9, 0x000000,
+ /* b8 */ 0x000000, 0x00dfb8, 0x000000, 0x000000,
+ /* bc */ 0x8fc8fa, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02c6b ***/
+
+ /* 80 */ 0x00b7e3, 0x00c2f9, 0x00dfb2, 0x00c7bb,
+ /* 84 */ 0x000000, 0x8fc8fb, 0x00dfb9, 0x8fc8fc,
+ /* 88 */ 0x8fc8fd, 0x000000, 0x8fc8fe, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00dfbe, 0x00dfbc, 0x000000, 0x000000,
+ /* 98 */ 0x00dfbf, 0x000000, 0x8fc9a1, 0x00dfc2,
+ /* 9c */ 0x000000, 0x000000, 0x8fc9a2, 0x00dfbb,
+ /* a0 */ 0x00b9ea, 0x00c7a8, 0x000000, 0x000000,
+ /* a4 */ 0x00deb9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fc9a3, 0x8fc9a4, 0x000000, 0x00cdf4,
+ /* ac */ 0x00dfbd, 0x000000, 0x00dfc1, 0x00c2f5,
+ /* b0 */ 0x8fc9a5, 0x00dfc0, 0x000000, 0x00dfab,
+ /* b4 */ 0x000000, 0x8fc9a6, 0x00efe9, 0x000000,
+ /* b8 */ 0x000000, 0x8fc9a7, 0x00dfc5, 0x000000,
+ /* bc */ 0x8fc9a8, 0x8fc9a9, 0x00dfc9, 0x000000,
+
+ /*** Three byte table, leaf: e780xx - offset 0x02cab ***/
+
+ /* 80 */ 0x8fc9aa, 0x00dfc7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fc9ab, 0x8fc9ac, 0x8fc9ad,
+ /* 88 */ 0x000000, 0x00dfc3, 0x000000, 0x00dfc4,
+ /* 8c */ 0x000000, 0x8fc9ae, 0x000000, 0x00dfc8,
+ /* 90 */ 0x000000, 0x00dfc6, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00c9ce, 0x000000, 0x8fc9af,
+ /* 98 */ 0x00dfce, 0x000000, 0x00dfcb, 0x00dfca,
+ /* 9c */ 0x000000, 0x00dfcd, 0x00c6d4, 0x00dfcf,
+ /* a0 */ 0x8fc9b0, 0x000000, 0x000000, 0x8fc9b1,
+ /* a4 */ 0x000000, 0x000000, 0x00c3f5, 0x00c2ed,
+ /* a8 */ 0x8ff4cd, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c0a5, 0x000000, 0x000000, 0x8fc9b2,
+ /* b0 */ 0x00dfd0, 0x000000, 0x00dfd2, 0x000000,
+ /* b4 */ 0x8fc9b3, 0x000000, 0x000000, 0x8fc9b4,
+ /* b8 */ 0x000000, 0x8fc9b5, 0x000000, 0x000000,
+ /* bc */ 0x8fc9b6, 0x000000, 0x00dfd1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02cea ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fc9b7,
+ /* 84 */ 0x8fc9b8, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fc9b9, 0x8fc9ba, 0x8fc9bb, 0x8fc9bc,
+ /* 8c */ 0x00def5, 0x000000, 0x8fc9c1, 0x000000,
+ /* 90 */ 0x000000, 0x00dfd3, 0x000000, 0x000000,
+ /* 94 */ 0x8fc9bd, 0x8fc9be, 0x000000, 0x000000,
+ /* 98 */ 0x00c6e7, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fc9bf, 0x8fc9c0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00dfd4,
+ /* a4 */ 0x8fc9c2, 0x8fc9c3, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00b2d0,
+ /* ac */ 0x8fc9c4, 0x000000, 0x8fc9c5, 0x00c5f4,
+ /* b0 */ 0x00b3a5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fc9c6, 0x8fc9c7, 0x000000,
+ /* b8 */ 0x00b5e4, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bcde, 0x00bad2, 0x8fc9c8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02d29 ***/
+
+ /* 80 */ 0x000000, 0x8fc9c9, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fc9ca, 0x8fc9cb, 0x000000,
+ /* 88 */ 0x000000, 0x00cfa7, 0x00bfe6, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00b1ea, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00dfd6, 0x000000,
+ /* 94 */ 0x8fc9cc, 0x8fc9cd, 0x8fc9ce, 0x8fc9cf,
+ /* 98 */ 0x8fc9d0, 0x00dfd5, 0x000000, 0x8fc9d1,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fc9d2, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fc9d3,
+ /* ac */ 0x00dfd9, 0x00c3ba, 0x00dfdc, 0x00dfd7,
+ /* b0 */ 0x8fc9d4, 0x8fc9d5, 0x000000, 0x00dfdb,
+ /* b4 */ 0x8fc9d6, 0x000000, 0x000000, 0x8fc9d7,
+ /* b8 */ 0x00dfda, 0x00c5c0, 0x00b0d9, 0x8ff4ae,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02d65 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00cef5, 0x000000, 0x8fc9d8, 0x00dfde,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00b1a8,
+ /* 90 */ 0x000000, 0x8fc9d9, 0x000000, 0x8fc9da,
+ /* 94 */ 0x8fc9db, 0x8fc9dc, 0x8fc9dd, 0x000000,
+ /* 98 */ 0x8fc9de, 0x00dfe0, 0x000000, 0x000000,
+ /* 9c */ 0x8fc9df, 0x00dfdf, 0x000000, 0x00dfdd,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fc9e0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00dfd8, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00cba3, 0x8fc9e1, 0x000000,
+ /* bc */ 0x000000, 0x00dfe2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02da3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fc9e2,
+ /* 84 */ 0x8fc9e3, 0x8fc9e4, 0x8fc9e5, 0x8fc9e6,
+ /* 88 */ 0x000000, 0x00dfe1, 0x000000, 0x8fc9e7,
+ /* 8c */ 0x8fc9e8, 0x000000, 0x000000, 0x8fc9e9,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x00b1eb, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00dfe4, 0x00cab2, 0x000000,
+ /* 9c */ 0x00dfe3, 0x000000, 0x8fc9ea, 0x000000,
+ /* a0 */ 0x8fc9eb, 0x00ccb5, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00bec7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fc9ec,
+ /* ac */ 0x000000, 0x8fc9ed, 0x000000, 0x8fc9ee,
+ /* b0 */ 0x8fc9ef, 0x8fc9f0, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00c1b3, 0x000000,
+ /* b8 */ 0x8fc9f1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bec6, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02de2 ***/
+
+ /* 80 */ 0x000000, 0x8fc9f2, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fc9f3, 0x8fc9f4, 0x8fc9f5,
+ /* 88 */ 0x000000, 0x00cefb, 0x8fc9f6, 0x8fc9f7,
+ /* 8c */ 0x00dfea, 0x000000, 0x00c0f9, 0x000000,
+ /* 90 */ 0x8fc9f8, 0x000000, 0x8fc9f9, 0x000000,
+ /* 94 */ 0x000000, 0x00dfe6, 0x00dfeb, 0x8fc9fa,
+ /* 98 */ 0x000000, 0x00b1ec, 0x8fc9fb, 0x000000,
+ /* 9c */ 0x8fc9fc, 0x000000, 0x8fc9fd, 0x000000,
+ /* a0 */ 0x8fc9fe, 0x000000, 0x00dfe9, 0x000000,
+ /* a4 */ 0x00c7e1, 0x00dfe5, 0x00dfe8, 0x00bec8,
+ /* a8 */ 0x8fcaa1, 0x00c8d1, 0x000000, 0x000000,
+ /* ac */ 0x00dfec, 0x000000, 0x00bcd1, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fcaa2, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00c0fa, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e786xx - offset 0x02e22 ***/
+
+ /* 80 */ 0x8fcaa3, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00dfef, 0x8fcaa4, 0x000000, 0x8fcaa5,
+ /* 88 */ 0x00dfe7, 0x000000, 0x00b7a7, 0x000000,
+ /* 8c */ 0x8fcaa6, 0x000000, 0x000000, 0x00dfed,
+ /* 90 */ 0x000000, 0x000000, 0x8fcaa7, 0x000000,
+ /* 94 */ 0x00cdd0, 0x00dff0, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00f4a6, 0x8fcaa8, 0x8fcaa9,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00bdcf,
+ /* a0 */ 0x8fcaaa, 0x000000, 0x8fcaab, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00dff1, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00dff2, 0x000000, 0x000000, 0x8fcaac,
+ /* b0 */ 0x8fcaad, 0x00c7ae, 0x8fcaae, 0x8fcaaf,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00dff4, 0x8fcab0, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00dff5, 0x8fcab1,
+
+ /*** Three byte table, leaf: e787xx - offset 0x02e62 ***/
+
+ /* 80 */ 0x8fcab2, 0x8fcab3, 0x000000, 0x00c7b3,
+ /* 84 */ 0x8fcab4, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00c5f5, 0x00dff7, 0x000000, 0x8fcab5,
+ /* 8c */ 0x8fcab6, 0x000000, 0x00dff9, 0x000000,
+ /* 90 */ 0x00ced5, 0x000000, 0x00dff6, 0x8fcab7,
+ /* 94 */ 0x00dff8, 0x00b1ed, 0x8fcab8, 0x00dff3,
+ /* 98 */ 0x000000, 0x8fcab9, 0x8fcaba, 0x000000,
+ /* 9c */ 0x8fcabb, 0x000000, 0x000000, 0x00d3db,
+ /* a0 */ 0x00dffa, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c1e7, 0x00bbb8, 0x00dffc,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00dffb, 0x00bfa4, 0x00d2d9, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00dffd, 0x000000, 0x000000,
+ /* b8 */ 0x8fcabc, 0x00e0a1, 0x000000, 0x00dfee,
+ /* bc */ 0x00dffe, 0x000000, 0x8fcabd, 0x00e0a2,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02ea2 ***/
+
+ /* 80 */ 0x8fcabe, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00c7fa, 0x8fcabf,
+ /* 88 */ 0x8fcac0, 0x8fcac1, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e0a3, 0x000000, 0x000000,
+ /* 90 */ 0x00e0a4, 0x000000, 0x000000, 0x8fcac2,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x8fcac3,
+ /* 98 */ 0x000000, 0x000000, 0x8fcac4, 0x00e0a5,
+ /* 9c */ 0x000000, 0x8fcac5, 0x000000, 0x8fcac6,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fcac7, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00e0a6, 0x000000, 0x00c4de, 0x8fcac8,
+ /* ac */ 0x00e0a8, 0x00e0a7, 0x000000, 0x8fcac9,
+ /* b0 */ 0x00e0a9, 0x000000, 0x00e0aa, 0x000000,
+ /* b4 */ 0x8fcaca, 0x00bcdf, 0x00c9e3, 0x000000,
+ /* b8 */ 0x8fcacb, 0x8fcacc, 0x00ccec, 0x00e0ab,
+ /* bc */ 0x00e0ac, 0x00c1d6, 0x00bca4, 0x00e0ad,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02ee2 ***/
+
+ /* 80 */ 0x00e0ae, 0x8fcacd, 0x8fcace, 0x8fcacf,
+ /* 84 */ 0x000000, 0x8fcad0, 0x00e0af, 0x00cad2,
+ /* 88 */ 0x00c8c7, 0x000000, 0x000000, 0x00e0b0,
+ /* 8c */ 0x00c7d7, 0x000000, 0x8fcad1, 0x8fcad2,
+ /* 90 */ 0x8fcad3, 0x000000, 0x00c4ad, 0x8fcad4,
+ /* 94 */ 0x000000, 0x8fcad5, 0x8fcad6, 0x000000,
+ /* 98 */ 0x00e0b1, 0x00b2e7, 0x8fcad7, 0x00b5ed,
+ /* 9c */ 0x8fcad8, 0x00ccc6, 0x8fcad9, 0x00ccb6,
+ /* a0 */ 0x8fcada, 0x00b2b4, 0x00cfb4, 0x8fcadb,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00cbd2,
+ /* a8 */ 0x8fcadc, 0x00caaa, 0x000000, 0x8fcadd,
+ /* ac */ 0x000000, 0x000000, 0x8fcade, 0x8fcadf,
+ /* b0 */ 0x000000, 0x8fcae0, 0x00c0b7, 0x000000,
+ /* b4 */ 0x00e0b2, 0x000000, 0x000000, 0x8fcae1,
+ /* b8 */ 0x8fcae2, 0x00c6c3, 0x000000, 0x8fcae3,
+ /* bc */ 0x8fcae4, 0x00b8a3, 0x00e0b3, 0x8fcae5,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02f22 ***/
+
+ /* 80 */ 0x00bad4, 0x00e0b5, 0x00e0b4, 0x000000,
+ /* 84 */ 0x8fcae6, 0x000000, 0x000000, 0x00e0b6,
+ /* 88 */ 0x000000, 0x8fcae7, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fcae8, 0x8fcae9, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e0b7, 0x8fcaea,
+ /* 94 */ 0x000000, 0x000000, 0x00e0b8, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8fcaeb,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00b5be, 0x000000, 0x00e0b9, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00e0ba,
+ /* a8 */ 0x8fcaec, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00b8a4, 0x8fcaed, 0x8fcaee, 0x00c8c8,
+ /* b0 */ 0x000000, 0x8fcaef, 0x00e0bc, 0x000000,
+ /* b4 */ 0x8fcaf0, 0x000000, 0x00bef5, 0x000000,
+ /* b8 */ 0x000000, 0x00e0bb, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fcaf1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02f61 ***/
+
+ /* 80 */ 0x000000, 0x8fcaf2, 0x00b6b8, 0x00e0bd,
+ /* 84 */ 0x00e0bf, 0x000000, 0x00e0be, 0x8fcaf3,
+ /* 88 */ 0x000000, 0x8fcaf4, 0x000000, 0x000000,
+ /* 8c */ 0x8fcaf5, 0x000000, 0x00e0c0, 0x000000,
+ /* 90 */ 0x00b8d1, 0x000000, 0x00e0c1, 0x000000,
+ /* 94 */ 0x000000, 0x8fcaf6, 0x8fcaf7, 0x00b6e9,
+ /* 98 */ 0x8fcaf8, 0x00c1c0, 0x000000, 0x00b9fd,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fcaf9,
+ /* a0 */ 0x00e0c3, 0x00e0c4, 0x00e0c2, 0x000000,
+ /* a4 */ 0x000000, 0x8fcafa, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00bced, 0x000000, 0x000000,
+ /* ac */ 0x00c6c8, 0x00b6b9, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fcafb,
+ /* b4 */ 0x8fcafc, 0x000000, 0x000000, 0x00e0c6,
+ /* b8 */ 0x00c3ac, 0x00e0c5, 0x8fcafd, 0x8fcafe,
+ /* bc */ 0x00cfb5, 0x00c7e2, 0x8fcba1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02fa0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fcba2, 0x000000,
+ /* 84 */ 0x8fcba3, 0x8fcba4, 0x000000, 0x8fcba5,
+ /* 88 */ 0x000000, 0x000000, 0x00e0c9, 0x8fcba6,
+ /* 8c */ 0x000000, 0x8fcba7, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fcba8, 0x8fcba9,
+ /* 94 */ 0x000000, 0x000000, 0x00e0cb, 0x00e0c8,
+ /* 98 */ 0x8fcbaa, 0x8fcbab, 0x000000, 0x00ccd4,
+ /* 9c */ 0x00e0ca, 0x00e0cc, 0x8fcbac, 0x00cec4,
+ /* a0 */ 0x000000, 0x000000, 0x8fcbad, 0x000000,
+ /* a4 */ 0x8fcbae, 0x00e0d0, 0x000000, 0x8fcbaf,
+ /* a8 */ 0x8fcbb0, 0x00e0cf, 0x00c3f6, 0x00c7ad,
+ /* ac */ 0x8fcbb1, 0x000000, 0x00b8a5, 0x00e0ce,
+ /* b0 */ 0x000000, 0x8fcbb2, 0x8fcbb3, 0x000000,
+ /* b4 */ 0x00e0cd, 0x8fcbb4, 0x00cdb1, 0x00cdb2,
+ /* b8 */ 0x000000, 0x000000, 0x8fcbb5, 0x8fcbb6,
+ /* bc */ 0x000000, 0x8fcbb7, 0x00e0d1, 0x00b1ee,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x02fe0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fcbb8,
+ /* 84 */ 0x00b9f6, 0x00bbe2, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fcbb9, 0x00e0d2, 0x00e0d3,
+ /* 90 */ 0x8fcbba, 0x000000, 0x8fcbbb, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fcbbc, 0x00e0d5,
+ /* 98 */ 0x8fcbbd, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fcbbe, 0x8fcbbf, 0x8fcbc0,
+ /* a0 */ 0x8fcbc1, 0x000000, 0x000000, 0x00bdc3,
+ /* a4 */ 0x000000, 0x000000, 0x8fcbc2, 0x8fcbc3,
+ /* a8 */ 0x00e0d7, 0x8fcbc4, 0x00e0d6, 0x8fcbc5,
+ /* ac */ 0x8fcbc6, 0x000000, 0x8fcbc7, 0x8fcbc8,
+ /* b0 */ 0x00e0d8, 0x8fcbc9, 0x00b3cd, 0x000000,
+ /* b4 */ 0x000000, 0x00e0da, 0x000000, 0x8fcbca,
+ /* b8 */ 0x00e0d9, 0x8fcbcb, 0x00e0dc, 0x00e0db,
+ /* bc */ 0x8fcbcc, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e78exx - offset 0x03020 ***/
+
+ /* 80 */ 0x8fcbcd, 0x8fcbce, 0x000000, 0x8fcbcf,
+ /* 84 */ 0x00b8bc, 0x8fcbd0, 0x8fcbd1, 0x00cea8,
+ /* 88 */ 0x000000, 0x00b6cc, 0x000000, 0x00b2a6,
+ /* 8c */ 0x000000, 0x000000, 0x8fcbd2, 0x000000,
+ /* 90 */ 0x8fcbd3, 0x000000, 0x000000, 0x8fcbd4,
+ /* 94 */ 0x000000, 0x8fcbd5, 0x00b6ea, 0x8fcbd6,
+ /* 98 */ 0x8fcbd7, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fcbd8, 0x000000, 0x8fcbd9, 0x8fcbda,
+ /* a0 */ 0x8fcbdb, 0x000000, 0x8fcbdc, 0x000000,
+ /* a4 */ 0x000000, 0x8fcbdd, 0x8fcbde, 0x000000,
+ /* a8 */ 0x000000, 0x00b4e1, 0x8fcbdf, 0x8fcbe0,
+ /* ac */ 0x000000, 0x8fcbe1, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00cee8, 0x00e0de,
+ /* b4 */ 0x000000, 0x8fcbe2, 0x000000, 0x8fcbe3,
+ /* b8 */ 0x000000, 0x8fcbe4, 0x000000, 0x00e0e0,
+ /* bc */ 0x8fcbe5, 0x8fcbe6, 0x000000, 0x8fcbe7,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x03060 ***/
+
+ /* 80 */ 0x00e0e1, 0x000000, 0x00b2d1, 0x000000,
+ /* 84 */ 0x000000, 0x8fcbe8, 0x8fcbe9, 0x000000,
+ /* 88 */ 0x00e0dd, 0x8fcbea, 0x00bbb9, 0x8fcbeb,
+ /* 8c */ 0x8fcbec, 0x00c4c1, 0x00e0df, 0x8fcbed,
+ /* 90 */ 0x000000, 0x000000, 0x8fcbee, 0x8fcbef,
+ /* 94 */ 0x000000, 0x000000, 0x8fcbf0, 0x000000,
+ /* 98 */ 0x000000, 0x8fcbf1, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fcbf2, 0x00e0e4, 0x000000,
+ /* a0 */ 0x00bcee, 0x8fcbf3, 0x000000, 0x8fcbf4,
+ /* a4 */ 0x000000, 0x00e0e2, 0x8fcbf5, 0x8fcbf6,
+ /* a8 */ 0x000000, 0x8fcbf7, 0x00b7be, 0x000000,
+ /* ac */ 0x000000, 0x00c8c9, 0x00e0e3, 0x000000,
+ /* b0 */ 0x000000, 0x00e0fe, 0x000000, 0x000000,
+ /* b4 */ 0x8fcbf8, 0x8fcbf9, 0x000000, 0x8fcbfa,
+ /* b8 */ 0x00e0e9, 0x8fcbfb, 0x8fcbfc, 0x8fcbfd,
+ /* bc */ 0x000000, 0x8fcbfe, 0x00b8bd, 0x8fcca1,
+
+ /*** Three byte table, leaf: e790xx - offset 0x030a0 ***/
+
+ /* 80 */ 0x8fcca2, 0x8fcca3, 0x000000, 0x00b5e5,
+ /* 84 */ 0x8fcca4, 0x00e0e6, 0x00cdfd, 0x8fcca5,
+ /* 88 */ 0x000000, 0x00ceb0, 0x8fcca6, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fcca7, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fcca8, 0x8fcca9,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x00c2f6, 0x000000,
+ /* a4 */ 0x8fccaa, 0x00e0e8, 0x8fccab, 0x000000,
+ /* a8 */ 0x8fccac, 0x8fccad, 0x8fccae, 0x8fccaf,
+ /* ac */ 0x8fccb0, 0x8fccb1, 0x8fccb2, 0x8fccb3,
+ /* b0 */ 0x8fccb4, 0x8fccb5, 0x00e0ea, 0x00ced6,
+ /* b4 */ 0x00b6d7, 0x00c8fc, 0x00c7ca, 0x000000,
+ /* b8 */ 0x000000, 0x8fccb6, 0x00e0eb, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00e0ed,
+
+ /*** Three byte table, leaf: e791xx - offset 0x030e0 ***/
+
+ /* 80 */ 0x8fccb7, 0x00e0f0, 0x000000, 0x8fccb8,
+ /* 84 */ 0x8fccb9, 0x000000, 0x8fccba, 0x8fccbb,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fccbc,
+ /* 8c */ 0x000000, 0x8fccbd, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fccbe, 0x8fccbf, 0x000000,
+ /* 94 */ 0x000000, 0x00e0ec, 0x000000, 0x8fccc0,
+ /* 98 */ 0x000000, 0x00e0ef, 0x00b8ea, 0x00b1cd,
+ /* 9c */ 0x00e0f1, 0x8fccc1, 0x00bff0, 0x00e0ee,
+ /* a0 */ 0x00cedc, 0x000000, 0x8fccc2, 0x00e0f4,
+ /* a4 */ 0x00f4a4, 0x000000, 0x8fccc3, 0x8fccc4,
+ /* a8 */ 0x8fccc5, 0x00e0f2, 0x00e0f5, 0x8fccc6,
+ /* ac */ 0x000000, 0x8fccc7, 0x8fccc8, 0x00e0e7,
+ /* b0 */ 0x00e0f3, 0x8fccc9, 0x8fccca, 0x00babc,
+ /* b4 */ 0x000000, 0x000000, 0x00e0f6, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00e0f7, 0x000000,
+
+ /*** Three byte table, leaf: e792xx - offset 0x03120 ***/
+
+ /* 80 */ 0x8fcccb, 0x8fcccc, 0x000000, 0x00cdfe,
+ /* 84 */ 0x000000, 0x8fcccd, 0x8fccce, 0x8fcccf,
+ /* 88 */ 0x000000, 0x8fccd0, 0x000000, 0x00e0f8,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fccd1,
+ /* 90 */ 0x8fccd2, 0x8fccd3, 0x8fccd4, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8fccd5, 0x8fccd6, 0x8fccd7, 0x000000,
+ /* 9c */ 0x8fccd8, 0x000000, 0x00e0f9, 0x8fccd9,
+ /* a0 */ 0x8fccda, 0x8fccdb, 0x00e0e5, 0x8fccdc,
+ /* a4 */ 0x000000, 0x000000, 0x8fccdd, 0x00e0fa,
+ /* a8 */ 0x8fccde, 0x8fccdf, 0x8fcce0, 0x8fcce1,
+ /* ac */ 0x000000, 0x000000, 0x8fcce2, 0x8fcce3,
+ /* b0 */ 0x00b4c4, 0x8fcce4, 0x8fcce5, 0x000000,
+ /* b4 */ 0x000000, 0x8fcce6, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fcce7, 0x000000, 0x8fcce8,
+ /* bc */ 0x000000, 0x00bca5, 0x000000, 0x8fcce9,
+
+ /*** Three byte table, leaf: e793xx - offset 0x03160 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fccea, 0x8fcceb, 0x00e0fb, 0x000000,
+ /* 8c */ 0x8fccec, 0x000000, 0x000000, 0x00e0fc,
+ /* 90 */ 0x8fcced, 0x000000, 0x000000, 0x8fccee,
+ /* 94 */ 0x00e0fd, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x8fccef, 0x000000, 0x8fccf0, 0x8fccf1,
+ /* 9c */ 0x00b1bb, 0x000000, 0x8fccf2, 0x8fccf3,
+ /* a0 */ 0x00e1a1, 0x000000, 0x00c9bb, 0x00e1a2,
+ /* a4 */ 0x8fccf4, 0x000000, 0x00b4a4, 0x00e1a3,
+ /* a8 */ 0x8fccf5, 0x00e1a4, 0x8fccf6, 0x8fccf7,
+ /* ac */ 0x000000, 0x000000, 0x00e1a5, 0x8fccf8,
+ /* b0 */ 0x00e1a7, 0x00e1a8, 0x00e1a6, 0x000000,
+ /* b4 */ 0x8fccf9, 0x000000, 0x00c9d3, 0x00e1aa,
+ /* b8 */ 0x00e1a9, 0x000000, 0x8fccfa, 0x8fccfb,
+ /* bc */ 0x8fccfc, 0x000000, 0x000000, 0x8fccfd,
+
+ /*** Three byte table, leaf: e794xx - offset 0x031a0 ***/
+
+ /* 80 */ 0x000000, 0x8ff4d0, 0x000000, 0x00e1ac,
+ /* 84 */ 0x00e1ab, 0x00e1ad, 0x8fccfe, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00e1ae, 0x00e1b0, 0x00e1af, 0x000000,
+ /* 90 */ 0x000000, 0x00b9f9, 0x8fcda1, 0x00e1b2,
+ /* 94 */ 0x000000, 0x00e1b1, 0x8fcda2, 0x8fcda3,
+ /* 98 */ 0x00b4c5, 0x000000, 0x00bfd3, 0x000000,
+ /* 9c */ 0x00c5bc, 0x000000, 0x00e1b3, 0x00c0b8,
+ /* a0 */ 0x8fcda4, 0x8fcda5, 0x000000, 0x00bbba,
+ /* a4 */ 0x8fcda6, 0x00b1f9, 0x00e1b4, 0x8fcda7,
+ /* a8 */ 0x00cdd1, 0x8fcda8, 0x8fcda9, 0x00cae3,
+ /* ac */ 0x00e1b5, 0x000000, 0x000000, 0x8fcdaa,
+ /* b0 */ 0x00c5c4, 0x00cdb3, 0x00b9c3, 0x00bfbd,
+ /* b4 */ 0x000000, 0x000000, 0x8fcdab, 0x00c3cb,
+ /* b8 */ 0x00d2b4, 0x8fcdac, 0x00c4ae, 0x00b2e8,
+ /* bc */ 0x00e1b6, 0x8fcdad, 0x8fcdae, 0x8fcdaf,
+
+ /*** Three byte table, leaf: e795xx - offset 0x031e0 ***/
+
+ /* 80 */ 0x8fcdb0, 0x000000, 0x000000, 0x8fcdb1,
+ /* 84 */ 0x00e1b7, 0x000000, 0x00e1bc, 0x8fcdb2,
+ /* 88 */ 0x8fcdb3, 0x00e1ba, 0x00e1b9, 0x00dac2,
+ /* 8c */ 0x00b3a6, 0x00e1b8, 0x8fcdb4, 0x00b0da,
+ /* 90 */ 0x8fcdb5, 0x00c8aa, 0x8fcdb6, 0x000000,
+ /* 94 */ 0x00c8ca, 0x000000, 0x000000, 0x8fcdb7,
+ /* 98 */ 0x000000, 0x00ceb1, 0x00e1bd, 0x00e1bb,
+ /* 9c */ 0x00c3dc, 0x00c0a6, 0x8fcdb8, 0x8fcdb9,
+ /* a0 */ 0x00c8ab, 0x8fcdba, 0x00c9ad, 0x000000,
+ /* a4 */ 0x00e1bf, 0x00ceac, 0x00b7cd, 0x00e1c0,
+ /* a8 */ 0x000000, 0x00e1be, 0x00c8d6, 0x00e1c1,
+ /* ac */ 0x000000, 0x00e1c2, 0x000000, 0x8fcdbb,
+ /* b0 */ 0x00b0db, 0x8fcdbc, 0x000000, 0x00bef6,
+ /* b4 */ 0x00e1c7, 0x000000, 0x00e1c4, 0x00c6ed,
+ /* b8 */ 0x00e1c3, 0x8fcdbd, 0x8fcdbe, 0x8fcdbf,
+ /* bc */ 0x8fcdc0, 0x8fcdc1, 0x8fcdc2, 0x00b5a6,
+
+ /*** Three byte table, leaf: e796xx - offset 0x03220 ***/
+
+ /* 80 */ 0x000000, 0x8fcdc3, 0x00e1ca, 0x000000,
+ /* 84 */ 0x000000, 0x8fcdc4, 0x00e1c5, 0x00e1c6,
+ /* 88 */ 0x000000, 0x00e1c9, 0x00e1c8, 0x00c9a5,
+ /* 8c */ 0x000000, 0x000000, 0x00c1c2, 0x00c1c1,
+ /* 90 */ 0x8fcdc5, 0x00b5bf, 0x8fcdc6, 0x8fcdc7,
+ /* 94 */ 0x00e1cb, 0x8fcdc8, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fcdc9, 0x00e1cc, 0x000000,
+ /* 9c */ 0x8fcdca, 0x00e1cd, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fcdcb, 0x00e1cf,
+ /* a4 */ 0x8fcdcc, 0x00e1ce, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00b1d6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00e1d7, 0x00c8e8, 0x00e1d1,
+ /* b4 */ 0x8fcdcd, 0x00e1d3, 0x000000, 0x000000,
+ /* b8 */ 0x00e1d5, 0x00bfbe, 0x8fcdce, 0x000000,
+ /* bc */ 0x00e1d6, 0x00e1d4, 0x00bcc0, 0x8fcdcf,
+
+ /*** Three byte table, leaf: e797xx - offset 0x03260 ***/
+
+ /* 80 */ 0x8fcdd0, 0x8fcdd1, 0x00e1d0, 0x00e1d2,
+ /* 84 */ 0x8fcdd2, 0x00c9c2, 0x8fcdd3, 0x00bec9,
+ /* 88 */ 0x000000, 0x000000, 0x00e1d9, 0x000000,
+ /* 8c */ 0x8fcdd4, 0x00e1d8, 0x8fcdd5, 0x8fcdd6,
+ /* 90 */ 0x000000, 0x000000, 0x00e1da, 0x000000,
+ /* 94 */ 0x00bca6, 0x00baaf, 0x000000, 0x8fcdd7,
+ /* 98 */ 0x00c5f7, 0x00e1db, 0x000000, 0x00c4cb,
+ /* 9c */ 0x8fcdd8, 0x000000, 0x00e1dd, 0x8fcdd9,
+ /* a0 */ 0x8fcdda, 0x8fcddb, 0x00cea1, 0x00e1dc,
+ /* a4 */ 0x8fcddc, 0x000000, 0x000000, 0x8fcddd,
+ /* a8 */ 0x000000, 0x00c1e9, 0x000000, 0x000000,
+ /* ac */ 0x8fcdde, 0x000000, 0x8fcddf, 0x8fcde0,
+ /* b0 */ 0x00e1e2, 0x8fcde1, 0x00e1e4, 0x00e1e5,
+ /* b4 */ 0x00c3d4, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fcde2, 0x00e1e3, 0x000000,
+ /* bc */ 0x00e1e0, 0x000000, 0x00e1de, 0x00e1df,
+
+ /*** Three byte table, leaf: e798xx - offset 0x032a0 ***/
+
+ /* 80 */ 0x8fcde3, 0x00e1e1, 0x8fcde4, 0x8fcde5,
+ /* 84 */ 0x8fcde6, 0x000000, 0x000000, 0x8fcde7,
+ /* 88 */ 0x8fcde8, 0x00e1e8, 0x8fcde9, 0x00e1e6,
+ /* 8c */ 0x8fcdea, 0x00e1e7, 0x000000, 0x8fcdeb,
+ /* 90 */ 0x000000, 0x000000, 0x8fcdec, 0x8fcded,
+ /* 94 */ 0x000000, 0x8fcdee, 0x8fcdef, 0x000000,
+ /* 98 */ 0x000000, 0x8fcdf0, 0x000000, 0x8fcdf1,
+ /* 9c */ 0x8fcdf2, 0x8fcdf3, 0x8fcdf4, 0x00e1e9,
+ /* a0 */ 0x00e1eb, 0x00e1ec, 0x00e1ed, 0x8fcdf5,
+ /* a4 */ 0x00e1ee, 0x8fcdf6, 0x8fcdf7, 0x00e1ea,
+ /* a8 */ 0x000000, 0x8fcdf8, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fcdf9, 0x000000, 0x000000,
+ /* b0 */ 0x00e1f0, 0x000000, 0x8fcdfa, 0x8fcdfb,
+ /* b4 */ 0x00e1ef, 0x8fcdfc, 0x000000, 0x000000,
+ /* b8 */ 0x8fcdfd, 0x8fcdfe, 0x8fcea1, 0x00e1f1,
+ /* bc */ 0x8fcea2, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e799xx - offset 0x032e0 ***/
+
+ /* 80 */ 0x8fcea4, 0x8fcea5, 0x00cec5, 0x8fcea6,
+ /* 84 */ 0x8fcea7, 0x8fcea8, 0x00e1f4, 0x00e1f2,
+ /* 88 */ 0x00e1f3, 0x8fcea9, 0x8fcea3, 0x8fceaa,
+ /* 8c */ 0x00b4e2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00ccfe, 0x000000,
+ /* 94 */ 0x000000, 0x8fceab, 0x00caca, 0x000000,
+ /* 98 */ 0x00e1f6, 0x8fceac, 0x000000, 0x000000,
+ /* 9c */ 0x00e1f5, 0x000000, 0x000000, 0x8fcead,
+ /* a0 */ 0x000000, 0x00e1f7, 0x00e1f8, 0x000000,
+ /* a4 */ 0x8fceae, 0x8fceaf, 0x000000, 0x00e1fc,
+ /* a8 */ 0x00e1f9, 0x00e1fa, 0x00e1fb, 0x000000,
+ /* ac */ 0x00e1fd, 0x8fceb0, 0x8fceb1, 0x8fceb2,
+ /* b0 */ 0x00e1fe, 0x8fceb3, 0x00e2a1, 0x000000,
+ /* b4 */ 0x8fceb4, 0x000000, 0x00e2a2, 0x000000,
+ /* b8 */ 0x00e2a3, 0x000000, 0x00c8af, 0x00c5d0,
+ /* bc */ 0x00e2a4, 0x00c7f2, 0x00c9b4, 0x000000,
+
+ /*** Three byte table, leaf: e79axx - offset 0x03320 ***/
+
+ /* 80 */ 0x00e2a5, 0x8fceb5, 0x8ff4d1, 0x00e2a6,
+ /* 84 */ 0x00c5aa, 0x8fceb6, 0x00b3a7, 0x00b9c4,
+ /* 88 */ 0x00e2a7, 0x000000, 0x000000, 0x00e2a8,
+ /* 8c */ 0x8fceb7, 0x8fceb8, 0x00e2a9, 0x000000,
+ /* 90 */ 0x00bba9, 0x000000, 0x000000, 0x00e2ab,
+ /* 94 */ 0x000000, 0x8fceb9, 0x00e2aa, 0x000000,
+ /* 98 */ 0x000000, 0x00e2ac, 0x00e2ad, 0x8fceba,
+ /* 9c */ 0x8fcebb, 0x8fcebc, 0x8ff4d2, 0x8fcebd,
+ /* a0 */ 0x8fcebe, 0x000000, 0x8fcebf, 0x8fcec0,
+ /* a4 */ 0x8fcec1, 0x8fcec2, 0x8fcec3, 0x8fcec4,
+ /* a8 */ 0x8fcec5, 0x000000, 0x8fcec6, 0x000000,
+ /* ac */ 0x000000, 0x8fcec7, 0x00c8e9, 0x000000,
+ /* b0 */ 0x00e2ae, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00e2af, 0x000000, 0x000000, 0x00f3e9,
+ /* b8 */ 0x00e2b0, 0x00e2b1, 0x00e2b2, 0x000000,
+ /* bc */ 0x000000, 0x8fcec8, 0x000000, 0x00bbae,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03360 ***/
+
+ /* 80 */ 0x000000, 0x8fcec9, 0x00e2b3, 0x00c7d6,
+ /* 84 */ 0x000000, 0x8fceca, 0x00cbdf, 0x000000,
+ /* 88 */ 0x00b1ce, 0x8fcecb, 0x00b1d7, 0x8fcecc,
+ /* 8c */ 0x8fcecd, 0x00e2b4, 0x8fcece, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e2b6, 0x000000,
+ /* 94 */ 0x8fcecf, 0x000000, 0x00e2b5, 0x00c5f0,
+ /* 98 */ 0x000000, 0x8fced0, 0x000000, 0x00c0b9,
+ /* 9c */ 0x00ddb9, 0x000000, 0x00e2b7, 0x00ccc1,
+ /* a0 */ 0x8fced1, 0x00e2b8, 0x000000, 0x00b4c6,
+ /* a4 */ 0x00c8d7, 0x00e2b9, 0x8fced2, 0x00e2ba,
+ /* a8 */ 0x8fced3, 0x000000, 0x00e2bb, 0x000000,
+ /* ac */ 0x8fced4, 0x000000, 0x00ccdc, 0x000000,
+ /* b0 */ 0x8fced5, 0x8fced6, 0x00ccd5, 0x000000,
+ /* b4 */ 0x00c4be, 0x000000, 0x8fced7, 0x000000,
+ /* b8 */ 0x00c1ea, 0x8fced8, 0x000000, 0x00e2bd,
+ /* bc */ 0x8fced9, 0x000000, 0x00bde2, 0x000000,
+
+ /*** Three byte table, leaf: e79cxx - offset 0x033a0 ***/
+
+ /* 80 */ 0x8fceda, 0x00beca, 0x000000, 0x000000,
+ /* 84 */ 0x00e2c0, 0x000000, 0x8fcedb, 0x00e2bf,
+ /* 88 */ 0x00e2be, 0x00c8fd, 0x8fcedc, 0x00b4c7,
+ /* 8c */ 0x00b8a9, 0x000000, 0x8fcedd, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fcede, 0x000000,
+ /* 94 */ 0x8fcedf, 0x8fcee0, 0x000000, 0x8fcee1,
+ /* 98 */ 0x000000, 0x8fcee2, 0x8fcee3, 0x00e2c6,
+ /* 9c */ 0x8fcee4, 0x000000, 0x00e2c3, 0x00bfbf,
+ /* a0 */ 0x00ccb2, 0x000000, 0x8fcee5, 0x000000,
+ /* a4 */ 0x00e2c2, 0x00e2c4, 0x00e2c5, 0x000000,
+ /* a8 */ 0x8fcee6, 0x00e2c1, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fcee7, 0x8fcee8, 0x8fcee9,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fceea, 0x8fceeb, 0x8fceec, 0x00e2c7,
+ /* b8 */ 0x00e2c8, 0x8fceed, 0x00c4af, 0x000000,
+ /* bc */ 0x00b4e3, 0x8fceee, 0x8fceef, 0x000000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x033e0 ***/
+
+ /* 80 */ 0x00c3e5, 0x000000, 0x8fcef0, 0x000000,
+ /* 84 */ 0x000000, 0x8fcef1, 0x8fcef2, 0x00e2c9,
+ /* 88 */ 0x000000, 0x000000, 0x8fcef3, 0x000000,
+ /* 8c */ 0x000000, 0x8fcef4, 0x8fcef5, 0x8fcef6,
+ /* 90 */ 0x000000, 0x000000, 0x8fcef7, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fcef8, 0x8fcef9,
+ /* 98 */ 0x000000, 0x000000, 0x00e2ca, 0x00e2cd,
+ /* 9c */ 0x8fcefa, 0x000000, 0x8fcefb, 0x8fcefc,
+ /* a0 */ 0x8fcefd, 0x00bfe7, 0x8fcefe, 0x00c6c4,
+ /* a4 */ 0x8fcfa1, 0x00e2ce, 0x00cbd3, 0x8fcfa2,
+ /* a8 */ 0x00e2cb, 0x000000, 0x8fcfa3, 0x00e2cc,
+ /* ac */ 0x8fcfa4, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fcfa5, 0x000000, 0x8fcfa6, 0x8fcfa7,
+ /* b4 */ 0x8fcfa8, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e2d1, 0x8fcfa9, 0x000000,
+ /* bc */ 0x000000, 0x8fcfaa, 0x00e2d0, 0x00e2cf,
+
+ /*** Three byte table, leaf: e79exx - offset 0x03420 ***/
+
+ /* 80 */ 0x8fcfab, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fcfac, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00e2d3,
+ /* 8c */ 0x8fcfad, 0x8fcfae, 0x00e2d2, 0x000000,
+ /* 90 */ 0x000000, 0x00e2d4, 0x000000, 0x000000,
+ /* 94 */ 0x8fcfaf, 0x8fcfb0, 0x8fcfb1, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x8fcfb2, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00e2d6, 0x8fcfb3,
+ /* a0 */ 0x00e2d5, 0x000000, 0x8fcfb4, 0x000000,
+ /* a4 */ 0x000000, 0x00cacd, 0x000000, 0x8fcfb5,
+ /* a8 */ 0x000000, 0x000000, 0x8fcfb6, 0x000000,
+ /* ac */ 0x00bdd6, 0x00cec6, 0x8fcfb7, 0x8fcfb8,
+ /* b0 */ 0x00e2d7, 0x8fcfb9, 0x000000, 0x00c6b7,
+ /* b4 */ 0x000000, 0x8fcfba, 0x00e2d8, 0x000000,
+ /* b8 */ 0x000000, 0x00e2d9, 0x000000, 0x00e2dd,
+ /* bc */ 0x00e2db, 0x00e2dc, 0x8fcfbb, 0x00e2da,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03460 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fcfbc,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00e2de,
+ /* 88 */ 0x000000, 0x8fcfbd, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e2df, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fcfbe, 0x8fcfbf, 0x000000,
+ /* 94 */ 0x000000, 0x8fcfc0, 0x000000, 0x00e2e0,
+ /* 98 */ 0x000000, 0x8fcfc1, 0x00e2e1, 0x00ccb7,
+ /* 9c */ 0x00e2e2, 0x000000, 0x8fcfc2, 0x8fcfc3,
+ /* a0 */ 0x8fcfc4, 0x000000, 0x00ccf0, 0x00e2e3,
+ /* a4 */ 0x8fcfc5, 0x00c3ce, 0x8fcfc6, 0x00c7ea,
+ /* a8 */ 0x000000, 0x00b6eb, 0x8fcfc7, 0x000000,
+ /* ac */ 0x8fcfc8, 0x00c3bb, 0x00e2e4, 0x00b6ba,
+ /* b0 */ 0x8fcfc9, 0x8fcfca, 0x000000, 0x00c0d0,
+ /* b4 */ 0x8fcfcb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fcfcc, 0x000000, 0x000000, 0x8fcfcd,
+ /* bc */ 0x00e2e5, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x0349e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00babd, 0x000000,
+ /* 84 */ 0x000000, 0x8fcfce, 0x8fcfcf, 0x000000,
+ /* 88 */ 0x000000, 0x8fcfd0, 0x000000, 0x000000,
+ /* 8c */ 0x00e2e6, 0x8fcfd1, 0x8fcfd2, 0x000000,
+ /* 90 */ 0x000000, 0x8fcfd3, 0x00e2e7, 0x000000,
+ /* 94 */ 0x00b8a6, 0x00bad5, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fcfd4, 0x000000, 0x000000,
+ /* a0 */ 0x00e2e9, 0x8fcfd5, 0x8fcfd6, 0x8fcfd7,
+ /* a4 */ 0x000000, 0x00c5d6, 0x00bad6, 0x00b5ce,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fcfd8, 0x8fcfd9, 0x000000,
+ /* b0 */ 0x8fcfda, 0x000000, 0x00cba4, 0x000000,
+ /* b4 */ 0x00c7cb, 0x8fcfdb, 0x000000, 0x8fcfdc,
+ /* b8 */ 0x000000, 0x000000, 0x00c5d7, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00b9dc,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x034de ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fcfdd,
+ /* 84 */ 0x8fcfde, 0x00e2eb, 0x000000, 0x8fcfdf,
+ /* 88 */ 0x8fcfe0, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fcfe1, 0x000000, 0x8fcfe2, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fcfe3, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fcfe4, 0x00becb, 0x8fcfe5, 0x000000,
+ /* a0 */ 0x8fcfe6, 0x8fcfe7, 0x000000, 0x8fcfe8,
+ /* a4 */ 0x8fcfe9, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fcfea, 0x000000, 0x8fcfeb, 0x00ceb2,
+ /* ac */ 0x00b9c5, 0x000000, 0x8fcfec, 0x00b8a7,
+ /* b0 */ 0x000000, 0x000000, 0x00c8a3, 0x000000,
+ /* b4 */ 0x00e2ed, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fcfed, 0x000000,
+ /* bc */ 0x00e2ef, 0x000000, 0x8fcfee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0351d ***/
+
+ /* 80 */ 0x000000, 0x00b8eb, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00e2ee, 0x00c4f6,
+ /* 88 */ 0x000000, 0x000000, 0x8fcfef, 0x000000,
+ /* 8c */ 0x00e2f1, 0x00b3b7, 0x00e2ec, 0x8fcff0,
+ /* 90 */ 0x000000, 0x00c8ea, 0x000000, 0x00b1b0,
+ /* 94 */ 0x8fcff1, 0x00baec, 0x000000, 0x00cfd2,
+ /* 98 */ 0x8fcff2, 0x000000, 0x00e2f0, 0x000000,
+ /* 9c */ 0x000000, 0x8fcff4, 0x8fcff5, 0x8fcff6,
+ /* a0 */ 0x000000, 0x8fcff3, 0x000000, 0x00e2f2,
+ /* a4 */ 0x8fcff7, 0x000000, 0x000000, 0x00cacb,
+ /* a8 */ 0x8fcff8, 0x00c0d9, 0x00e2f4, 0x000000,
+ /* ac */ 0x8fcff9, 0x8fcffa, 0x000000, 0x00e2f5,
+ /* b0 */ 0x8fcffb, 0x8fcffc, 0x8fcffd, 0x8fcffe,
+ /* b4 */ 0x000000, 0x00e2f3, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00b3ce, 0x8fd0a1,
+ /* bc */ 0x00e2fb, 0x8fd0a2, 0x00e2fa, 0x8fd0a3,
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0355d ***/
+
+ /* 80 */ 0x000000, 0x00bca7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00e2fc, 0x00e2f7, 0x8fd0a4,
+ /* 88 */ 0x8fd0a5, 0x8fd0a6, 0x00e2fd, 0x00e2f8,
+ /* 8c */ 0x8fd0a7, 0x000000, 0x8fd0a8, 0x000000,
+ /* 90 */ 0x00c8d8, 0x00e2f6, 0x8fd0a9, 0x8fd0aa,
+ /* 94 */ 0x00e2f9, 0x8fd0ab, 0x8fd0ac, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00e3a2, 0x8fd0ae,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fd0af,
+ /* a0 */ 0x8fd0b0, 0x8fd0b1, 0x000000, 0x000000,
+ /* a4 */ 0x8fd0ad, 0x000000, 0x8fd0b2, 0x00e3a1,
+ /* a8 */ 0x00cbe1, 0x000000, 0x8fd0b3, 0x000000,
+ /* ac */ 0x00e2fe, 0x000000, 0x000000, 0x00b0eb,
+ /* b0 */ 0x000000, 0x000000, 0x8fd0b4, 0x8fd0b5,
+ /* b4 */ 0x00e3a4, 0x000000, 0x8fd0b7, 0x8fd0b8,
+ /* b8 */ 0x000000, 0x000000, 0x8fd0b9, 0x8fd0ba,
+ /* bc */ 0x000000, 0x00e3a3, 0x000000, 0x8fd0bb,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x0359d ***/
+
+ /* 80 */ 0x8fd0b6, 0x00becc, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fd0bc, 0x00e3a5,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fd0bd, 0x000000, 0x00c1c3, 0x000000,
+ /* 90 */ 0x8fd0be, 0x00e3a7, 0x00e3a6, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00e3a8, 0x8fd0bf, 0x000000,
+ /* 9c */ 0x8fd0c0, 0x000000, 0x8fd0c1, 0x8fd0c2,
+ /* a0 */ 0x8fd0c3, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fd0c4, 0x00e2e8, 0x8fd0c5,
+ /* a8 */ 0x000000, 0x8fd0c6, 0x00e2ea, 0x00e3aa,
+ /* ac */ 0x00e3a9, 0x8fd0c7, 0x000000, 0x000000,
+ /* b0 */ 0x8ff4d4, 0x8fd0c8, 0x000000, 0x000000,
+ /* b4 */ 0x8fd0c9, 0x8fd0ca, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00bca8, 0x8fd0cb,
+ /* bc */ 0x00cee9, 0x8fd0cc, 0x00bcd2, 0x8fd0cd,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x035dd ***/
+
+ /* 80 */ 0x00e3ab, 0x00b7b7, 0x000000, 0x000000,
+ /* 84 */ 0x8fd0ce, 0x8fd0cf, 0x8fd0d0, 0x00b5c0,
+ /* 88 */ 0x00b5a7, 0x00bbe3, 0x8fd0d1, 0x8fd0d2,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fd0d3,
+ /* 90 */ 0x00cdb4, 0x8fd0d4, 0x000000, 0x00e3b1,
+ /* 94 */ 0x8fd0d5, 0x00e3b0, 0x00c1c4, 0x00e3ad,
+ /* 98 */ 0x8fd0d6, 0x000000, 0x00e3af, 0x8fd0d7,
+ /* 9c */ 0x8fd0d8, 0x00bdcb, 0x00bfc0, 0x00e3ae,
+ /* a0 */ 0x00e3ac, 0x000000, 0x00c7aa, 0x000000,
+ /* a4 */ 0x000000, 0x00becd, 0x000000, 0x8fd0d9,
+ /* a8 */ 0x00c9bc, 0x8fd0da, 0x000000, 0x8fd0db,
+ /* ac */ 0x000000, 0x00bad7, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fd0dc, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c5f8,
+ /* b8 */ 0x000000, 0x8fd0dd, 0x00e3b2, 0x8fd0de,
+ /* bc */ 0x8fd0df, 0x000000, 0x8fd0e0, 0x00e3b3,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x0361d ***/
+
+ /* 80 */ 0x00e3c9, 0x00b6d8, 0x000000, 0x000000,
+ /* 84 */ 0x00cfbd, 0x00c1b5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00e3b4, 0x8fd0e1,
+ /* 8c */ 0x8fd0e2, 0x00b2d2, 0x00c4f7, 0x00caa1,
+ /* 90 */ 0x000000, 0x8fd0e3, 0x000000, 0x8fd0e4,
+ /* 94 */ 0x8fd0e5, 0x8fd0e6, 0x8fd0e7, 0x000000,
+ /* 98 */ 0x8fd0e8, 0x000000, 0x000000, 0x8fd0e9,
+ /* 9c */ 0x8fd0ea, 0x00e3b5, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fd0eb, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00b5fa, 0x00e3b6,
+ /* a8 */ 0x8fd0ec, 0x8fd0ed, 0x00e3b8, 0x8fd0ee,
+ /* ac */ 0x000000, 0x000000, 0x00e3b9, 0x8fd0ef,
+ /* b0 */ 0x00c7a9, 0x8fd0f0, 0x000000, 0x00e3ba,
+ /* b4 */ 0x8fd0f1, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fd0f2, 0x00e3bb, 0x00e3bc, 0x8fd0f3,
+ /* bc */ 0x000000, 0x00b6d9, 0x00b2d3, 0x00c6c5,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x0365d ***/
+
+ /* 80 */ 0x00bda8, 0x00bbe4, 0x8fd0f4, 0x000000,
+ /* 84 */ 0x8fd0f5, 0x000000, 0x000000, 0x8fd0f6,
+ /* 88 */ 0x8fd0f7, 0x00e3bd, 0x8fd0f8, 0x00bda9,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x8fd0f9,
+ /* 90 */ 0x000000, 0x00b2ca, 0x00c9c3, 0x000000,
+ /* 94 */ 0x8fd0fa, 0x00e3be, 0x8fd0fb, 0x000000,
+ /* 98 */ 0x00c8eb, 0x000000, 0x8fd0fc, 0x000000,
+ /* 9c */ 0x000000, 0x8fd0fd, 0x8fd0fe, 0x00c1c5,
+ /* a0 */ 0x8fd1a1, 0x00e3c1, 0x8fd1a2, 0x00e3c2,
+ /* a4 */ 0x00c7e9, 0x8fd1a3, 0x00bfc1, 0x00e3bf,
+ /* a8 */ 0x000000, 0x00c3e1, 0x8fd1a4, 0x8fd1a5,
+ /* ac */ 0x00e3c0, 0x8fd1a6, 0x000000, 0x000000,
+ /* b0 */ 0x00bece, 0x8fd1a7, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fd1a8, 0x000000, 0x000000, 0x00b0dc,
+ /* bc */ 0x8fd1a9, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x0369d ***/
+
+ /* 80 */ 0x00b5a9, 0x000000, 0x8fd1aa, 0x8fd1ab,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fd1ac,
+ /* 88 */ 0x00e3c3, 0x8fd1ad, 0x8fd1ae, 0x00c4f8,
+ /* 8c */ 0x8fd1af, 0x00e3c4, 0x00c0c7, 0x000000,
+ /* 90 */ 0x000000, 0x8fd1b0, 0x000000, 0x000000,
+ /* 94 */ 0x00ccad, 0x8fd1b1, 0x000000, 0x00c9a3,
+ /* 98 */ 0x00e3c5, 0x00e3c6, 0x00c3d5, 0x8fd1b2,
+ /* 9c */ 0x00cec7, 0x000000, 0x8fd1b3, 0x00e3c8,
+ /* a0 */ 0x00e3c7, 0x8fd1b4, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fd1b5,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fd1b6,
+ /* ac */ 0x000000, 0x8fd1b7, 0x00bcef, 0x8fd1b8,
+ /* b0 */ 0x8fd1b9, 0x00e3ca, 0x00b0f0, 0x000000,
+ /* b4 */ 0x8fd1ba, 0x8fd1bb, 0x000000, 0x00e3cd,
+ /* b8 */ 0x8fd1bc, 0x8fd1bd, 0x8fd1be, 0x00e3cb,
+ /* bc */ 0x00b2d4, 0x00b7ce, 0x00e3cc, 0x00b9c6,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x036dd ***/
+
+ /* 80 */ 0x00b9f2, 0x000000, 0x00cae6, 0x00e3ce,
+ /* 84 */ 0x8fd1bf, 0x8fd1c0, 0x00cbd4, 0x8fd1c1,
+ /* 88 */ 0x8fd1c2, 0x00e3d0, 0x000000, 0x000000,
+ /* 8c */ 0x8fd1c3, 0x00c0d1, 0x00b1cf, 0x00b2ba,
+ /* 90 */ 0x00b0ac, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fd1c4, 0x8fd1c5, 0x00e3cf,
+ /* 98 */ 0x000000, 0x8fd1c6, 0x000000, 0x000000,
+ /* 9c */ 0x8fd1c7, 0x8fd1c8, 0x000000, 0x8fd1c9,
+ /* a0 */ 0x8fd1ca, 0x00e3d1, 0x00e3d2, 0x00bef7,
+ /* a4 */ 0x000000, 0x8fd1cb, 0x000000, 0x8fd1cc,
+ /* a8 */ 0x000000, 0x00e3d3, 0x8fd1cd, 0x00b3cf,
+ /* ac */ 0x000000, 0x8fd1ce, 0x000000, 0x000000,
+ /* b0 */ 0x00e3d5, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x00b7ea, 0x8fd1cf, 0x00b5e6, 0x000000,
+ /* b8 */ 0x8fd1d0, 0x00e3d6, 0x00b6f5, 0x000000,
+ /* bc */ 0x000000, 0x00e3d7, 0x8fd1d1, 0x00c0fc,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x0371d ***/
+
+ /* 80 */ 0x8fd1d2, 0x00c6cd, 0x8fd1d3, 0x00c0e0,
+ /* 84 */ 0x00baf5, 0x8fd1d4, 0x8fd1d5, 0x000000,
+ /* 88 */ 0x00e3d8, 0x000000, 0x8fd1d6, 0x8fd1d7,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fd1d8, 0x8fd1d9, 0x00c3e2, 0x00c1eb,
+ /* 94 */ 0x8fd1da, 0x00e3da, 0x00e3dc, 0x00e3d9,
+ /* 98 */ 0x00e3db, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fd1db, 0x00b7a2,
+ /* a0 */ 0x8fd1dc, 0x000000, 0x000000, 0x8fd1dd,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00e3dd, 0x00b7a6, 0x000000,
+ /* ac */ 0x8fd1de, 0x000000, 0x00b5e7, 0x00cdd2,
+ /* b0 */ 0x00e3df, 0x000000, 0x000000, 0x8fd1df,
+ /* b4 */ 0x000000, 0x8fd1e0, 0x00e3e0, 0x000000,
+ /* b8 */ 0x000000, 0x8fd1e1, 0x00b1ae, 0x8fd1e2,
+ /* bc */ 0x8fd1e3, 0x000000, 0x000000, 0x00e3e3,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x0375d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b3f6,
+ /* 84 */ 0x00e3e2, 0x00e3e1, 0x8fd1e4, 0x00e3e5,
+ /* 88 */ 0x00e3de, 0x8fd1e5, 0x00e3e6, 0x00cea9,
+ /* 8c */ 0x8fd1e6, 0x00e3e7, 0x8fd1e7, 0x00e3e8,
+ /* 90 */ 0x000000, 0x8fd1e8, 0x00d4f4, 0x00e3ea,
+ /* 94 */ 0x000000, 0x00e3e9, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00e3eb, 0x00e3ec, 0x8fd1e9,
+ /* 9c */ 0x00ceb5, 0x00e3ed, 0x000000, 0x00f0ef,
+ /* a0 */ 0x00becf, 0x00e3ee, 0x00e3ef, 0x00bdd7,
+ /* a4 */ 0x000000, 0x00c6b8, 0x00e3f0, 0x8ff4d9,
+ /* a8 */ 0x8fd1ea, 0x8fd1eb, 0x00c3a8, 0x8fd1ec,
+ /* ac */ 0x8fd1ed, 0x00e3f1, 0x000000, 0x00c3bc,
+ /* b0 */ 0x00e3f2, 0x8fd1ee, 0x000000, 0x000000,
+ /* b4 */ 0x8fd1ef, 0x000000, 0x00b6a5, 0x000000,
+ /* b8 */ 0x00d1bf, 0x00c3dd, 0x00bcb3, 0x8fd1f0,
+ /* bc */ 0x000000, 0x8fd1f1, 0x8fd1f2, 0x00b4c8,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x0379d ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00e3f3, 0x000000,
+ /* 84 */ 0x00e4a2, 0x000000, 0x00e3f6, 0x8fd1f3,
+ /* 88 */ 0x00b5e8, 0x000000, 0x00e3f5, 0x00e4a4,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00e3f4,
+ /* 90 */ 0x000000, 0x00bed0, 0x000000, 0x000000,
+ /* 94 */ 0x8fd1f4, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00e3f8, 0x00e3f9, 0x000000, 0x00c5ab,
+ /* 9c */ 0x000000, 0x000000, 0x00e3fa, 0x8fd1f5,
+ /* a0 */ 0x00b3de, 0x000000, 0x000000, 0x8fd1f6,
+ /* a4 */ 0x000000, 0x00bfda, 0x00c9e4, 0x8fd1f7,
+ /* a8 */ 0x00e3fc, 0x8fd1f8, 0x8fd1f9, 0x8fd1fa,
+ /* ac */ 0x00c2e8, 0x8fd1fb, 0x8fd1fc, 0x8fd1fd,
+ /* b0 */ 0x8fd1fe, 0x8fd2a1, 0x000000, 0x00e3f7,
+ /* b4 */ 0x8fd2a2, 0x00e3fb, 0x00e3fd, 0x000000,
+ /* b8 */ 0x000000, 0x00bafb, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fd2a3, 0x000000, 0x8fd2a4,
+
+ /*** Three byte table, leaf: e7adxx - offset 0x037dd ***/
+
+ /* 80 */ 0x8fd2a5, 0x8fd2a6, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00e4a6, 0x00c9ae, 0x8fd2a7,
+ /* 88 */ 0x00c8a6, 0x00c5f9, 0x000000, 0x00b6da,
+ /* 8c */ 0x00e4a5, 0x00e4a3, 0x8fd2a8, 0x00c8b5,
+ /* 90 */ 0x00e3fe, 0x00c3de, 0x00c5fb, 0x000000,
+ /* 94 */ 0x00c5fa, 0x8fd2a9, 0x00baf6, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00e4b8, 0x000000, 0x000000,
+ /* a0 */ 0x8fd2aa, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fd2ab, 0x00e4a8, 0x8fd2ac, 0x00e4aa,
+ /* a8 */ 0x000000, 0x8fd2ad, 0x8fd2ae, 0x000000,
+ /* ac */ 0x00e4ad, 0x8fd2af, 0x00e4ae, 0x8fd2b0,
+ /* b0 */ 0x00e4ab, 0x00e4ac, 0x8fd2b1, 0x8fd2b2,
+ /* b4 */ 0x00e4a9, 0x00e4a7, 0x000000, 0x8fd2b3,
+ /* b8 */ 0x000000, 0x000000, 0x00e4a1, 0x000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x03819 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fd2b4, 0x000000, 0x00cacf, 0x00b2d5,
+ /* 88 */ 0x000000, 0x8fd2b5, 0x000000, 0x00e4b5,
+ /* 8c */ 0x000000, 0x00e4b2, 0x8fd2b6, 0x00e4b7,
+ /* 90 */ 0x8fd2b7, 0x8fd2b8, 0x00e4b6, 0x000000,
+ /* 94 */ 0x00c7f3, 0x00cca7, 0x8fd2b9, 0x00bbbb,
+ /* 98 */ 0x00e4b0, 0x00e4b9, 0x00e4b4, 0x8fd2ba,
+ /* 9c */ 0x00e4b3, 0x00e4af, 0x8fd2bb, 0x00e4b1,
+ /* a0 */ 0x8fd2bc, 0x00b4c9, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fd2bd, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00c3bd, 0x000000,
+ /* ac */ 0x8fd2be, 0x00c0fd, 0x000000, 0x8fd2bf,
+ /* b0 */ 0x8fd2c0, 0x00c8a2, 0x8fd2c1, 0x000000,
+ /* b4 */ 0x00e4be, 0x8fd2c2, 0x8fd2c3, 0x000000,
+ /* b8 */ 0x00c8a4, 0x000000, 0x8fd2c4, 0x8fd2c5,
+ /* bc */ 0x8fd2c6, 0x8fd2c7, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03859 ***/
+
+ /* 80 */ 0x00c0e1, 0x00e4bb, 0x8fd2c8, 0x000000,
+ /* 84 */ 0x00c8cf, 0x8fd2c9, 0x00e4bf, 0x00cad3,
+ /* 88 */ 0x8fd2ca, 0x00c3db, 0x8fd2cb, 0x00e4ba,
+ /* 8c */ 0x00e4bc, 0x000000, 0x000000, 0x00e4bd,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fd2cc, 0x000000, 0x8fd2cd, 0x8fd2ce,
+ /* 98 */ 0x000000, 0x8fd2cf, 0x8fd2d0, 0x8fd2d1,
+ /* 9c */ 0x000000, 0x00e4c0, 0x000000, 0x000000,
+ /* a0 */ 0x00bcc4, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c6c6, 0x00e4c5, 0x00e4c4, 0x000000,
+ /* a8 */ 0x8fd2d2, 0x00e4c1, 0x8fd2d3, 0x000000,
+ /* ac */ 0x000000, 0x00cfb6, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fd2d4, 0x00e4ca,
+ /* b4 */ 0x8fd2d5, 0x8fd2d6, 0x00e4ce, 0x00e4cb,
+ /* b8 */ 0x8fd2d7, 0x8fd2d8, 0x8fd2d9, 0x000000,
+ /* bc */ 0x8fd2da, 0x000000, 0x8fd2db, 0x000000,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x03899 ***/
+
+ /* 80 */ 0x00e4c7, 0x8fd2dc, 0x8fd2dd, 0x8fd2de,
+ /* 84 */ 0x8fd2df, 0x000000, 0x8fd2e0, 0x00e4c8,
+ /* 88 */ 0x000000, 0x8fd2e1, 0x000000, 0x8fd2e2,
+ /* 8c */ 0x8fd2e3, 0x00e4cd, 0x8fd2e4, 0x8fd2e5,
+ /* 90 */ 0x000000, 0x00e4c2, 0x00d2d5, 0x00e4c9,
+ /* 94 */ 0x00e4c3, 0x000000, 0x000000, 0x00e4cc,
+ /* 98 */ 0x000000, 0x8fd2e6, 0x000000, 0x8fd2e7,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e4d2,
+ /* a0 */ 0x8fd2e8, 0x00b4ca, 0x000000, 0x00e4cf,
+ /* a4 */ 0x000000, 0x8fd2e9, 0x8fd2ea, 0x00e4d0,
+ /* a8 */ 0x8fd2eb, 0x000000, 0x00e4d1, 0x00e4d4,
+ /* ac */ 0x8fd2ec, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fd2ed, 0x000000, 0x8fd2ee,
+ /* b4 */ 0x8fd2ef, 0x000000, 0x8fd2f0, 0x00e4d3,
+ /* b8 */ 0x00c8f6, 0x8fd2f1, 0x8fd2f2, 0x000000,
+ /* bc */ 0x000000, 0x00e4d5, 0x00cefc, 0x00caed,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x038d9 ***/
+
+ /* 80 */ 0x00e4da, 0x000000, 0x000000, 0x00e4d7,
+ /* 84 */ 0x000000, 0x000000, 0x8fd2f3, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fd2f4, 0x000000,
+ /* 8c */ 0x00e4d6, 0x00c0d2, 0x000000, 0x00e4d9,
+ /* 90 */ 0x00e4db, 0x8fd2f6, 0x8fd2f7, 0x8fd2f8,
+ /* 94 */ 0x00e4d8, 0x8fd2f5, 0x00e4df, 0x000000,
+ /* 98 */ 0x00e4dc, 0x8fd2f9, 0x8fd2fa, 0x8fd2fb,
+ /* 9c */ 0x8fd2fc, 0x8fd2fd, 0x8fd2fe, 0x00e4dd,
+ /* a0 */ 0x00e4c6, 0x8fd3a1, 0x000000, 0x8fd3a2,
+ /* a4 */ 0x00e4de, 0x00e4e0, 0x000000, 0x8fd3a3,
+ /* a8 */ 0x000000, 0x8fd3a4, 0x000000, 0x000000,
+ /* ac */ 0x00e4e1, 0x8fd3a5, 0x8fd3a6, 0x000000,
+ /* b0 */ 0x8fd3a7, 0x000000, 0x8fd3a8, 0x00cac6,
+ /* b4 */ 0x000000, 0x00e4e2, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fd3a9, 0x000000, 0x000000,
+ /* bc */ 0x8fd3aa, 0x8fd3ab, 0x00cce2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x03918 ***/
+
+ /* 80 */ 0x000000, 0x00b6ce, 0x00b7a9, 0x00e4e3,
+ /* 84 */ 0x000000, 0x000000, 0x8fd3ac, 0x8fd3ad,
+ /* 88 */ 0x000000, 0x00cab4, 0x000000, 0x00bfe8,
+ /* 8c */ 0x000000, 0x00ccb0, 0x000000, 0x8fd3ae,
+ /* 90 */ 0x00e4e4, 0x000000, 0x00ceb3, 0x000000,
+ /* 94 */ 0x8fd3af, 0x00c7f4, 0x000000, 0x00c1c6,
+ /* 98 */ 0x00c7b4, 0x000000, 0x000000, 0x00bdcd,
+ /* 9c */ 0x000000, 0x000000, 0x8fd3b0, 0x00b0c0,
+ /* a0 */ 0x8fd3b1, 0x00e4e9, 0x00e4e7, 0x000000,
+ /* a4 */ 0x00e4e5, 0x00b4a1, 0x8fd3b2, 0x00bed1,
+ /* a8 */ 0x00e4ea, 0x000000, 0x000000, 0x00e4e8,
+ /* ac */ 0x000000, 0x00e4e6, 0x00e4ee, 0x000000,
+ /* b0 */ 0x8fd3b3, 0x00e4ed, 0x00e4ec, 0x00e4eb,
+ /* b4 */ 0x000000, 0x000000, 0x8fd3b4, 0x8fd3b5,
+ /* b8 */ 0x000000, 0x00e4ef, 0x8fd3b6, 0x8fd3b7,
+ /* bc */ 0x8fd3b8, 0x00e4f0, 0x00c0ba, 0x8fd3b9,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03958 ***/
+
+ /* 80 */ 0x00e4f1, 0x000000, 0x00e4f3, 0x000000,
+ /* 84 */ 0x8fd3ba, 0x00e4f2, 0x000000, 0x8fd3bb,
+ /* 88 */ 0x8fd3bc, 0x8fd3bd, 0x00b8d2, 0x000000,
+ /* 8c */ 0x000000, 0x8fd3be, 0x00c1b8, 0x8fd3bf,
+ /* 90 */ 0x000000, 0x000000, 0x00e4f5, 0x8fd3c0,
+ /* 94 */ 0x8fd3c1, 0x8fd3c2, 0x00c5fc, 0x8fd3c3,
+ /* 98 */ 0x00e4f4, 0x8fd3c4, 0x8fd3c5, 0x000000,
+ /* 9c */ 0x00e4f6, 0x8fd3c6, 0x00cab5, 0x00c1ec,
+ /* a0 */ 0x00b9c7, 0x000000, 0x00e4f7, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fd3c7, 0x00cec8,
+ /* a8 */ 0x000000, 0x8fd3c8, 0x000000, 0x8fd3c9,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00e4f9,
+ /* b0 */ 0x000000, 0x000000, 0x00e4fa, 0x000000,
+ /* b4 */ 0x00e4fb, 0x8fd3ca, 0x00e4fc, 0x000000,
+ /* b8 */ 0x00bbe5, 0x000000, 0x00e4fd, 0x00b7cf,
+ /* bc */ 0x000000, 0x000000, 0x00b5ea, 0x000000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03998 ***/
+
+ /* 80 */ 0x00b5aa, 0x000000, 0x00e5a1, 0x8fd3cb,
+ /* 84 */ 0x00ccf3, 0x00b9c8, 0x00e4fe, 0x8fd3cc,
+ /* 88 */ 0x8fd3cd, 0x8fd3ce, 0x00e5a4, 0x00cce6,
+ /* 8c */ 0x000000, 0x00c7bc, 0x000000, 0x8fd3cf,
+ /* 90 */ 0x00c9b3, 0x8fd3d0, 0x8fd3d1, 0x8fd3d2,
+ /* 94 */ 0x00bde3, 0x00e5a3, 0x8fd3d3, 0x00bcd3,
+ /* 98 */ 0x00b9c9, 0x00bbe6, 0x00b5e9, 0x00cab6,
+ /* 9c */ 0x00e5a2, 0x8fd3d4, 0x8fd3d5, 0x000000,
+ /* a0 */ 0x00c1c7, 0x00cbc2, 0x00baf7, 0x8fd3d6,
+ /* a4 */ 0x000000, 0x000000, 0x8fd3d7, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fd3d8, 0x00bbe7,
+ /* ac */ 0x00c4dd, 0x8fd3d9, 0x00e5a7, 0x00cedf,
+ /* b0 */ 0x00bad9, 0x8fd3da, 0x00e5a8, 0x00bfc2,
+ /* b4 */ 0x000000, 0x00e5aa, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00bed2, 0x00bab0, 0x000000,
+ /* bc */ 0x8fd3db, 0x8fd3dc, 0x8fd3dd, 0x00e5a9,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x039d8 ***/
+
+ /* 80 */ 0x8fd3de, 0x8fd3df, 0x00bdaa, 0x00b8be,
+ /* 84 */ 0x00c1c8, 0x00e5a5, 0x00e5ab, 0x8fd3e0,
+ /* 88 */ 0x8fd3e1, 0x000000, 0x000000, 0x00e5a6,
+ /* 8c */ 0x00b7d0, 0x8fd3e2, 0x00e5ae, 0x00e5b2,
+ /* 90 */ 0x00b7eb, 0x8fd3e3, 0x000000, 0x8fd3e4,
+ /* 94 */ 0x000000, 0x000000, 0x00e5ad, 0x8fd3e5,
+ /* 98 */ 0x000000, 0x8fd3e6, 0x8fd3e7, 0x00e5b6,
+ /* 9c */ 0x8fd3e8, 0x8fd3e9, 0x00b9ca, 0x000000,
+ /* a0 */ 0x000000, 0x00cded, 0x00b0bc, 0x00e5b3,
+ /* a4 */ 0x000000, 0x8fd3ea, 0x00b5eb, 0x8fd3eb,
+ /* a8 */ 0x00e5b0, 0x000000, 0x8fd3ec, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00e5b1, 0x000000,
+ /* b0 */ 0x8fd3ed, 0x00c5fd, 0x00e5af, 0x00e5ac,
+ /* b4 */ 0x000000, 0x00b3a8, 0x00c0e4, 0x000000,
+ /* b8 */ 0x8fd3ee, 0x00b8a8, 0x8fd3ef, 0x8fd3f0,
+ /* bc */ 0x000000, 0x00e5b8, 0x000000, 0x8fd3f1,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03a18 ***/
+
+ /* 80 */ 0x000000, 0x8fd3f2, 0x8fd3f3, 0x8fd3f4,
+ /* 84 */ 0x000000, 0x8fd3f5, 0x8fd3f6, 0x000000,
+ /* 88 */ 0x8fd3f7, 0x00e5b5, 0x000000, 0x8fd3f8,
+ /* 8c */ 0x8fd3f9, 0x8fd3fa, 0x000000, 0x00e5b7,
+ /* 90 */ 0x000000, 0x8fd3fb, 0x000000, 0x00e5b4,
+ /* 94 */ 0x000000, 0x000000, 0x8fd3fc, 0x8fd3fd,
+ /* 98 */ 0x000000, 0x00b7d1, 0x00c2b3, 0x00e5b9,
+ /* 9c */ 0x00c1ee, 0x8fd3fe, 0x8fd4a1, 0x00e5c6,
+ /* a0 */ 0x8ff4dc, 0x000000, 0x00e5c2, 0x00e5bc,
+ /* a4 */ 0x000000, 0x000000, 0x8fd4a2, 0x8fd4a3,
+ /* a8 */ 0x000000, 0x000000, 0x8fd4a4, 0x00e5c0,
+ /* ac */ 0x00bcfa, 0x00b0dd, 0x00e5bb, 0x00e5c3,
+ /* b0 */ 0x00e5c7, 0x00b9cb, 0x00ccd6, 0x8fd4a5,
+ /* b4 */ 0x00c4d6, 0x00e5bd, 0x8fd4a6, 0x8fd4a7,
+ /* b8 */ 0x00e5c5, 0x8fd4a8, 0x00e5ba, 0x00c3be,
+ /* bc */ 0x000000, 0x00e5bf, 0x00b0bd, 0x00ccca,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03a58 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fd4a9, 0x8fd4aa,
+ /* 84 */ 0x8fd4ab, 0x8fd4ac, 0x8fd4ad, 0x00e5be,
+ /* 88 */ 0x000000, 0x000000, 0x00b6db, 0x00c8ec,
+ /* 8c */ 0x8fd4ae, 0x8fd4af, 0x8fd4b0, 0x00c1ed,
+ /* 90 */ 0x000000, 0x00ced0, 0x00bdef, 0x000000,
+ /* 94 */ 0x000000, 0x00e5ee, 0x8ff4dd, 0x8fd4b1,
+ /* 98 */ 0x00e5c8, 0x8fd4b2, 0x00c0fe, 0x000000,
+ /* 9c */ 0x00e5c4, 0x00e5c9, 0x00e5cb, 0x000000,
+ /* a0 */ 0x00c4f9, 0x00e5ce, 0x8fd4b4, 0x000000,
+ /* a4 */ 0x00e5ca, 0x8fd4b5, 0x8fd4b6, 0x000000,
+ /* a8 */ 0x00cad4, 0x00b4cb, 0x8fd4b7, 0x8fd4b8,
+ /* ac */ 0x00cccb, 0x8fd4b9, 0x000000, 0x00b0de,
+ /* b0 */ 0x000000, 0x8fd4ba, 0x00e5cd, 0x000000,
+ /* b4 */ 0x00cefd, 0x8fd4bb, 0x8fd4bc, 0x000000,
+ /* b8 */ 0x000000, 0x8fd4bd, 0x8fd4be, 0x00e5cc,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x03a98 ***/
+
+ /* 80 */ 0x8fd4b3, 0x00b1ef, 0x000000, 0x000000,
+ /* 84 */ 0x00c6ec, 0x00e5cf, 0x000000, 0x000000,
+ /* 88 */ 0x8fd4bf, 0x00e5d6, 0x00e5d0, 0x00e5d7,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fd4c0, 0x8fd4c1, 0x00e5d3, 0x000000,
+ /* 94 */ 0x000000, 0x8fd4c2, 0x000000, 0x8fd4c3,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00c7fb,
+ /* 9c */ 0x8fd4c4, 0x8fd4c5, 0x00bcca, 0x00e5d5,
+ /* a0 */ 0x8fd4c6, 0x00e5d2, 0x00e5d8, 0x00e5d1,
+ /* a4 */ 0x000000, 0x000000, 0x00bdc4, 0x8fd4c7,
+ /* a8 */ 0x8fd4c8, 0x000000, 0x000000, 0x00cba5,
+ /* ac */ 0x8fd4c9, 0x8fd4ca, 0x00bdcc, 0x8fd4cb,
+ /* b0 */ 0x000000, 0x00e5d4, 0x00e5e0, 0x8fd4cc,
+ /* b4 */ 0x000000, 0x00e5dc, 0x8fd4cd, 0x00e5df,
+ /* b8 */ 0x000000, 0x00e5dd, 0x00e5e1, 0x00e5db,
+ /* bc */ 0x000000, 0x00e5c1, 0x00c0d3, 0x8fd4ce,
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03ad8 ***/
+
+ /* 80 */ 0x000000, 0x00c8cb, 0x000000, 0x00e5de,
+ /* 84 */ 0x8fd4cf, 0x8fd4d0, 0x00e5d9, 0x8fd4d1,
+ /* 88 */ 0x000000, 0x000000, 0x00c1a1, 0x00b7d2,
+ /* 8c */ 0x000000, 0x00bdab, 0x8fd4d2, 0x000000,
+ /* 90 */ 0x8fd4d3, 0x000000, 0x8fd4d4, 0x000000,
+ /* 94 */ 0x00bfa5, 0x00c1b6, 0x00e5e4, 0x000000,
+ /* 98 */ 0x8fd4d5, 0x00e5e6, 0x00e5e7, 0x000000,
+ /* 9c */ 0x000000, 0x00e5e3, 0x00e5e5, 0x8fd4d6,
+ /* a0 */ 0x000000, 0x8fd4d7, 0x8fd4d8, 0x000000,
+ /* a4 */ 0x000000, 0x8fd4d9, 0x00e5da, 0x00e5e2,
+ /* a8 */ 0x000000, 0x00e5ea, 0x00e5e9, 0x8fd4da,
+ /* ac */ 0x000000, 0x00cbfa, 0x8fd4db, 0x8fd4dc,
+ /* b0 */ 0x00b7ab, 0x000000, 0x000000, 0x8fd4dd,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fd4de, 0x00e5e8, 0x000000, 0x00e5ec,
+ /* bc */ 0x00e5eb, 0x00e5ef, 0x8fd4df, 0x00e5f1,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03b18 ***/
+
+ /* 80 */ 0x000000, 0x8fd4e0, 0x00bbbc, 0x00e5ed,
+ /* 84 */ 0x000000, 0x000000, 0x8fd4e1, 0x8fd4e2,
+ /* 88 */ 0x00e5f2, 0x00e5f3, 0x8fd4e3, 0x000000,
+ /* 8c */ 0x00e5f4, 0x8fd4e4, 0x00e5fa, 0x00c5bb,
+ /* 90 */ 0x00e5f6, 0x8fd4e5, 0x00e5f5, 0x00e5f7,
+ /* 94 */ 0x00e5f8, 0x8fd4e6, 0x00e5f9, 0x000000,
+ /* 98 */ 0x8fd4e7, 0x000000, 0x8fd4e8, 0x00e5fb,
+ /* 9c */ 0x00e5fc, 0x8fd4e9, 0x8fd4ea,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03b37 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00b4cc, 0x000000,
+ /* b8 */ 0x00e5fd, 0x000000, 0x00e5fe, 0x8fd4ec,
+ /* bc */ 0x8fd4eb, 0x8fd4ed, 0x8fd4ee, 0x8fd4ef,
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03b77 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fd4f0,
+ /* 84 */ 0x8fd4f1, 0x00e6a1, 0x000000, 0x8fd4f2,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00e6a2, 0x00e6a3, 0x00e6a4, 0x8fd4f3,
+ /* 90 */ 0x00e6a5, 0x00e6a6, 0x8fd4f4, 0x8fd4f5,
+ /* 94 */ 0x00e6a8, 0x00e6a7, 0x000000, 0x000000,
+ /* 98 */ 0x00e6a9, 0x000000, 0x000000, 0x8fd4f6,
+ /* 9c */ 0x8fd4f7, 0x8fd4f8, 0x000000, 0x00e6aa,
+ /* a0 */ 0x00e6ab, 0x8fd4f9, 0x000000, 0x8fd4fa,
+ /* a4 */ 0x8fd4fb, 0x8fd4fc, 0x8fd4fd, 0x00e6ae,
+ /* a8 */ 0x00e6ac, 0x00e6ad, 0x00bae1, 0x00b7d3,
+ /* ac */ 0x000000, 0x8fd4fe, 0x00c3d6, 0x000000,
+ /* b0 */ 0x00c8b3, 0x8fd5a1, 0x00bdf0, 0x000000,
+ /* b4 */ 0x000000, 0x00c7cd, 0x000000, 0x00c8ed,
+ /* b8 */ 0x00e6af, 0x00d8ed, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fd5a2, 0x8fd5a3, 0x8fd5a4,
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03bb7 ***/
+
+ /* 80 */ 0x8fd5a5, 0x000000, 0x00e6b0, 0x00e6b2,
+ /* 84 */ 0x000000, 0x00cde5, 0x00e6b1, 0x00e6b4,
+ /* 88 */ 0x00e6b3, 0x000000, 0x00cdd3, 0x8fd5a6,
+ /* 8c */ 0x00e6b5, 0x8fd5a7, 0x00c8fe, 0x8fd5a8,
+ /* 90 */ 0x8fd5a9, 0x8fd5aa, 0x000000, 0x000000,
+ /* 94 */ 0x00e6b6, 0x000000, 0x8fd5ab, 0x8fd5ac,
+ /* 98 */ 0x000000, 0x000000, 0x00e6b9, 0x000000,
+ /* 9c */ 0x8fd5ad, 0x00e6b8, 0x00e6b7, 0x000000,
+ /* a0 */ 0x000000, 0x8fd5ae, 0x8fd5af, 0x00e6ba,
+ /* a4 */ 0x00b7b2, 0x000000, 0x8fd5b0, 0x000000,
+ /* a8 */ 0x00c1a2, 0x00b5c1, 0x8fd5b1, 0x000000,
+ /* ac */ 0x000000, 0x8fd5b2, 0x00e6be, 0x00e6bb,
+ /* b0 */ 0x000000, 0x000000, 0x00e6bc, 0x000000,
+ /* b4 */ 0x8fd5b3, 0x000000, 0x00e6bf, 0x000000,
+ /* b8 */ 0x00e6c0, 0x00e6bd, 0x000000, 0x000000,
+ /* bc */ 0x8fd5b4, 0x00b1a9, 0x000000, 0x8fd5b5,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03bf7 ***/
+
+ /* 80 */ 0x8fd5b6, 0x00b2a7, 0x000000, 0x8fd5b7,
+ /* 84 */ 0x000000, 0x00e6c2, 0x00e6c3, 0x000000,
+ /* 88 */ 0x8fd5b8, 0x000000, 0x00e6c4, 0x000000,
+ /* 8c */ 0x00cde2, 0x000000, 0x8fd5b9, 0x8fd5ba,
+ /* 90 */ 0x000000, 0x000000, 0x00bdac, 0x000000,
+ /* 94 */ 0x00e6c6, 0x00e6c5, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8fd5bb,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fd5bc,
+ /* a0 */ 0x00bfe9, 0x00e6c7, 0x000000, 0x8fd5bd,
+ /* a4 */ 0x000000, 0x8fd5be, 0x00e6c8, 0x000000,
+ /* a8 */ 0x8fd5bf, 0x00e6c9, 0x000000, 0x00b4e5,
+ /* ac */ 0x8fd5c0, 0x000000, 0x8fd5c1, 0x8fd5c2,
+ /* b0 */ 0x00b4cd, 0x000000, 0x8fd5c3, 0x00e6ca,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00e6cb, 0x8fd5c4, 0x00cbdd,
+ /* bc */ 0x00cde3, 0x8fd5c5, 0x8fd5c6, 0x8fd5c7,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03c37 ***/
+
+ /* 80 */ 0x00cdd4, 0x00cfb7, 0x000000, 0x00b9cd,
+ /* 84 */ 0x00e6ce, 0x00bcd4, 0x00e6cd, 0x8fd5c8,
+ /* 88 */ 0x8fd5c9, 0x000000, 0x8fd5ca, 0x00e6cf,
+ /* 8c */ 0x00bca9, 0x8fd5cb, 0x8fd5cc, 0x8fd5cd,
+ /* 90 */ 0x00c2d1, 0x8fd5ce, 0x00e6d0, 0x8fd5cf,
+ /* 94 */ 0x8fd5d0, 0x00b9cc, 0x8fd5d1, 0x00ccd7,
+ /* 98 */ 0x00e6d1, 0x00e6d2, 0x000000, 0x000000,
+ /* 9c */ 0x00e6d3, 0x8fd5d2, 0x8fd5d3, 0x8fd5d4,
+ /* a0 */ 0x8fd5d5, 0x00e6d4, 0x000000, 0x000000,
+ /* a4 */ 0x8fd5d6, 0x000000, 0x8fd5d7, 0x000000,
+ /* a8 */ 0x00e6d5, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fd5d8, 0x000000, 0x8fd5d9, 0x000000,
+ /* b0 */ 0x8fd5da, 0x000000, 0x000000, 0x00bcaa,
+ /* b4 */ 0x8fd5db, 0x8fd5dc, 0x00cced, 0x8fd5dd,
+ /* b8 */ 0x000000, 0x8fd5de, 0x8fd5df, 0x00e6d7,
+ /* bc */ 0x8fd5e0, 0x00c3bf, 0x8fd5e1, 0x00e6d6,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03c77 ***/
+
+ /* 80 */ 0x8fd5e2, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fd5e3, 0x000000, 0x00e6d9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00e6d8, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00e6da, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c0bb, 0x000000,
+ /* 98 */ 0x00e6db, 0x000000, 0x00e6dc, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00cab9, 0x00e6dd,
+ /* a0 */ 0x8fd5e4, 0x00c1ef, 0x00e6de, 0x000000,
+ /* a4 */ 0x8fd5e5, 0x000000, 0x8fd5e6, 0x000000,
+ /* a8 */ 0x00e6df, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fd5e7, 0x000000, 0x00cefe,
+ /* b0 */ 0x00e6e2, 0x8fd5e8, 0x00e6e1, 0x00e6e0,
+ /* b4 */ 0x00c4b0, 0x8fd5e9, 0x00e6e3, 0x00bfa6,
+ /* b8 */ 0x000000, 0x00e6e4, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00e6e5, 0x00cfb8, 0x00e6e6,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03cb7 ***/
+
+ /* 80 */ 0x000000, 0x8fd5ea, 0x000000, 0x000000,
+ /* 84 */ 0x00e6e7, 0x00e6e9, 0x00e6e8, 0x00c8a5,
+ /* 88 */ 0x8fd5eb, 0x00c6f9, 0x000000, 0x00cfbe,
+ /* 8c */ 0x00c8a9, 0x000000, 0x8fd5ec, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00e6eb,
+ /* 94 */ 0x000000, 0x000000, 0x00bed3, 0x000000,
+ /* 98 */ 0x00c9aa, 0x000000, 0x00e6ec, 0x00e6ea,
+ /* 9c */ 0x8fd5ed, 0x00b4ce, 0x8fd5ee, 0x000000,
+ /* a0 */ 0x000000, 0x00b8d4, 0x00bbe8, 0x000000,
+ /* a4 */ 0x000000, 0x00c8ee, 0x8fd5ef, 0x8fd5f0,
+ /* a8 */ 0x000000, 0x00b8aa, 0x00cbc3, 0x8fd5f1,
+ /* ac */ 0x00e6ef, 0x00e6ed, 0x000000, 0x00b9ce,
+ /* b0 */ 0x000000, 0x00b9cf, 0x00b0e9, 0x000000,
+ /* b4 */ 0x00bae8, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x8fd5f2, 0x8fd5f3, 0x00c7d9, 0x000000,
+ /* bc */ 0x000000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03cf4 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00b0df,
+ /* 84 */ 0x00e6f4, 0x000000, 0x00c3c0, 0x000000,
+ /* 88 */ 0x8fd5f4, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x00c7d8, 0x8fd5f5, 0x00c2db, 0x8fd5f6,
+ /* 90 */ 0x000000, 0x000000, 0x8fd5f7, 0x000000,
+ /* 94 */ 0x8fd5f8, 0x8fd5f9, 0x00e6f6, 0x8fd5fa,
+ /* 98 */ 0x8fd5fb, 0x00e6f2, 0x00e6f5, 0x00e6f0,
+ /* 9c */ 0x000000, 0x00e6f3, 0x00cba6, 0x000000,
+ /* a0 */ 0x8fd5fc, 0x00b8d5, 0x000000, 0x000000,
+ /* a4 */ 0x00b0fd, 0x00e6f1, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fd5fd, 0x8fd5fe, 0x00e6f8,
+ /* b0 */ 0x8fd6a1, 0x00e6f9, 0x8fd6a2, 0x8fd6a3,
+ /* b4 */ 0x00c6b9, 0x000000, 0x8fd6a4, 0x000000,
+ /* b8 */ 0x00b6bb, 0x8fd6a5, 0x8fd6a6, 0x000000,
+ /* bc */ 0x00e7a6, 0x00c7bd, 0x8fd6a7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03d33 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00bbe9, 0x8fd6a8,
+ /* 84 */ 0x000000, 0x00b6bc, 0x00c0c8, 0x00cfc6,
+ /* 88 */ 0x00ccae, 0x00e6f7, 0x00c0d4, 0x8fd6a9,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fd6aa, 0x8fd6ab,
+ /* 98 */ 0x8fd6ac, 0x000000, 0x00b5d3, 0x00e6fa,
+ /* 9c */ 0x8fd6ad, 0x000000, 0x8fd6ae, 0x000000,
+ /* a0 */ 0x8fd6af, 0x000000, 0x000000, 0x00e6fc,
+ /* a4 */ 0x8fd6b0, 0x000000, 0x000000, 0x8fd6b1,
+ /* a8 */ 0x000000, 0x00e6fb, 0x000000, 0x000000,
+ /* ac */ 0x8fd6b2, 0x000000, 0x000000, 0x00e6fd,
+ /* b0 */ 0x8fd6b3, 0x00c3a6, 0x000000, 0x00c7be,
+ /* b4 */ 0x000000, 0x8fd6b4, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x00c4b1, 0x8fd6b5, 0x000000,
+ /* bc */ 0x8fd6b6, 0x000000, 0x00e7a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03d72 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fd6b7, 0x00e7a2, 0x8fd6b8,
+ /* 88 */ 0x000000, 0x000000, 0x8fd6b9, 0x00e6fe,
+ /* 8c */ 0x8fd6ba, 0x000000, 0x00bfd5, 0x000000,
+ /* 90 */ 0x00c9e5, 0x00e7a5, 0x8fd6bb, 0x00e7a4,
+ /* 94 */ 0x00b9d0, 0x00cfd3, 0x000000, 0x8fd6bc,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x00e7b5,
+ /* a0 */ 0x8fd6bd, 0x8fd6be, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00e7a9, 0x00e7aa, 0x8fd6bf,
+ /* a8 */ 0x8fd6c0, 0x8fd6c1, 0x000000, 0x00bcf0,
+ /* ac */ 0x000000, 0x8fd6c2, 0x00e7a8, 0x8fd6c3,
+ /* b0 */ 0x00b9f8, 0x00e7a7, 0x000000, 0x000000,
+ /* b4 */ 0x00e7ab, 0x000000, 0x000000, 0x8fd6c4,
+ /* b8 */ 0x00c4b2, 0x00caa2, 0x00c1a3, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00c2dc,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03db2 ***/
+
+ /* 80 */ 0x00e7af, 0x8fd6c5, 0x00e7b0, 0x00e7ac,
+ /* 84 */ 0x8fd6c7, 0x8fd6c8, 0x8fd6c9, 0x000000,
+ /* 88 */ 0x00e7ad, 0x000000, 0x00e7ae, 0x8fd6ca,
+ /* 8c */ 0x000000, 0x000000, 0x8fd6cb, 0x00b9d1,
+ /* 90 */ 0x8fd6c6, 0x000000, 0x000000, 0x00e7b6,
+ /* 94 */ 0x000000, 0x00e7b2, 0x8fd6cc, 0x000000,
+ /* 98 */ 0x8fd6cd, 0x000000, 0x00c9e6, 0x8fd6ce,
+ /* 9c */ 0x00cbec, 0x00c9a8, 0x8fd6cf, 0x000000,
+ /* a0 */ 0x00e7b1, 0x000000, 0x8fd6d0, 0x00e7b4,
+ /* a4 */ 0x00e7b3, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00cbc4, 0x00e7b7, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fd6d1, 0x000000,
+ /* b0 */ 0x00e7b8, 0x000000, 0x8fd6d2, 0x00c1b7,
+ /* b4 */ 0x8fd6d3, 0x00e7b9, 0x000000, 0x000000,
+ /* b8 */ 0x00e7bb, 0x000000, 0x00e7bf, 0x8fd6d4,
+ /* bc */ 0x000000, 0x00e7bc, 0x00e7ba, 0x00c7bf,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03df2 ***/
+
+ /* 80 */ 0x00e7bd, 0x000000, 0x00e7be, 0x8fd6d6,
+ /* 84 */ 0x000000, 0x8fd6d7, 0x00b2b2, 0x000000,
+ /* 88 */ 0x00e7c5, 0x00e7c0, 0x8fd6d8, 0x8fd6d5,
+ /* 8c */ 0x000000, 0x00e7c1, 0x8fd6d9, 0x8fd6da,
+ /* 90 */ 0x000000, 0x00e7c2, 0x000000, 0x00c2a1,
+ /* 94 */ 0x000000, 0x8fd6db, 0x000000, 0x8fd6dc,
+ /* 98 */ 0x00e7c4, 0x00e7c3, 0x00e7c6, 0x8fd6dd,
+ /* 9c */ 0x000000, 0x8fd6de, 0x8fd6df, 0x00e7c7,
+ /* a0 */ 0x00e7c8, 0x8fd6e0, 0x000000, 0x00bfc3,
+ /* a4 */ 0x8fd6e1, 0x00b2e9, 0x000000, 0x00e7c9,
+ /* a8 */ 0x00ced7, 0x000000, 0x00bcab, 0x8fd6e2,
+ /* ac */ 0x8fd6e3, 0x00bdad, 0x000000, 0x000000,
+ /* b0 */ 0x8fd6e4, 0x8fd6e5, 0x8fd6e6, 0x00bbea,
+ /* b4 */ 0x00c3d7, 0x8fd6e7, 0x8fd6e8, 0x000000,
+ /* b8 */ 0x8fd6e9, 0x8fd6ea, 0x00e7ca, 0x00e7cb,
+ /* bc */ 0x00b1b1, 0x8fd6eb, 0x00e7cc, 0x8fd6ec,
+
+ /*** Three byte table, leaf: e888xx - offset 0x03e32 ***/
+
+ /* 80 */ 0x8fd6ed, 0x00e7cd, 0x00e7ce, 0x8fd6ee,
+ /* 84 */ 0x000000, 0x00e7cf, 0x000000, 0x00e7d0,
+ /* 88 */ 0x00b6bd, 0x00daaa, 0x00e7d1, 0x000000,
+ /* 8c */ 0x00c0e5, 0x00e7d2, 0x00bccb, 0x8fd6ef,
+ /* 90 */ 0x00e7d3, 0x000000, 0x00d0b0, 0x8fd6f0,
+ /* 94 */ 0x8fd6f1, 0x000000, 0x00e7d4, 0x00cade,
+ /* 98 */ 0x00b4dc, 0x8fd6f2, 0x8fd6f3, 0x00c1a4,
+ /* 9c */ 0x00bdd8, 0x8fd6f4, 0x00c9f1, 0x00bdae,
+ /* a0 */ 0x000000, 0x8fd6f5, 0x8fd6f6, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fd6f7, 0x00e7d5, 0x00b9d2, 0x00e7d6,
+ /* ac */ 0x00c8cc, 0x000000, 0x00e7e4, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x8fd6f8, 0x00e7d8,
+ /* b4 */ 0x8fd6f9, 0x00c2c9, 0x00c7f5, 0x00b8bf,
+ /* b8 */ 0x00e7d7, 0x00c1a5, 0x8fd6fa, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03e72 ***/
+
+ /* 80 */ 0x00e7d9, 0x000000, 0x000000, 0x8fd6fb,
+ /* 84 */ 0x8fd6fc, 0x8fd6fd, 0x8fd6fe, 0x00c4fa,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fd7a1,
+ /* 8c */ 0x000000, 0x000000, 0x8fd7a2, 0x8fd7a3,
+ /* 90 */ 0x000000, 0x8fd7a4, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fd7a5, 0x000000,
+ /* 98 */ 0x00e7db, 0x00e7da, 0x00e7dd, 0x000000,
+ /* 9c */ 0x8fd7a6, 0x00e7dc, 0x000000, 0x00e7de,
+ /* a0 */ 0x8fd7a7, 0x000000, 0x00e7e0, 0x8fd7a8,
+ /* a4 */ 0x00e7df, 0x000000, 0x00b4cf, 0x8fd7a9,
+ /* a8 */ 0x00e7e1, 0x000000, 0x00e7e2, 0x00e7e3,
+ /* ac */ 0x000000, 0x8fd7aa, 0x00bab1, 0x00cec9,
+ /* b0 */ 0x000000, 0x00e7e5, 0x00bfa7, 0x000000,
+ /* b4 */ 0x8fd7ab, 0x000000, 0x00b1f0, 0x00e7e6,
+ /* b8 */ 0x00e7e7, 0x000000, 0x000000, 0x8fd7ac,
+ /* bc */ 0x000000, 0x8fd7ad, 0x00e7e8, 0x8fd7ae,
+
+ /*** Three byte table, leaf: e88axx - offset 0x03eb2 ***/
+
+ /* 80 */ 0x8fd7af, 0x8fd7b0, 0x000000, 0x8fd7b1,
+ /* 84 */ 0x8fd7b2, 0x000000, 0x000000, 0x8fd7b3,
+ /* 88 */ 0x000000, 0x8fd7b4, 0x8fd7b5, 0x00b0f2,
+ /* 8c */ 0x000000, 0x00e7e9, 0x8fd7b6, 0x000000,
+ /* 90 */ 0x000000, 0x8fd7b7, 0x00e7ea, 0x000000,
+ /* 94 */ 0x8fd7b8, 0x000000, 0x8fd7b9, 0x000000,
+ /* 98 */ 0x8fd7ba, 0x00c9e7, 0x8fd7bb, 0x8fd7bc,
+ /* 9c */ 0x000000, 0x00bcc7, 0x000000, 0x00e7ec,
+ /* a0 */ 0x8fd7bd, 0x8fd7be, 0x000000, 0x8fd7bf,
+ /* a4 */ 0x8fd7c0, 0x00b3a9, 0x00b0b2, 0x8fd7c1,
+ /* a8 */ 0x8fd7c2, 0x8fd7c3, 0x8fd7c4, 0x00e7eb,
+ /* ac */ 0x00e7ee, 0x00c7ce, 0x8fd7c5, 0x00bfc4,
+ /* b0 */ 0x8fd7c6, 0x00b2d6, 0x8fd7c7, 0x00cba7,
+ /* b4 */ 0x8fd7c8, 0x000000, 0x000000, 0x8fd7c9,
+ /* b8 */ 0x00b7dd, 0x00b6dc, 0x8fd7ca, 0x00e7ed,
+ /* bc */ 0x8fd7cb, 0x00b2ea, 0x8fd7cc, 0x8fd7cd,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03ef2 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00b4a3, 0x8fd7ce, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x8fd7cf, 0x00b1f1, 0x00e7f2, 0x00ceea,
+ /* 94 */ 0x00c2dd, 0x8fd7d0, 0x000000, 0x00c9c4,
+ /* 98 */ 0x000000, 0x00e7fe, 0x8fd7d1, 0x00b2d7,
+ /* 9c */ 0x00e7fc, 0x000000, 0x00e7fa, 0x00e7f1,
+ /* a0 */ 0x8fd7d2, 0x00e7ef, 0x8fd7d3, 0x00e7f0,
+ /* a4 */ 0x8fd7d4, 0x00bce3, 0x00b6ec, 0x00c3f7,
+ /* a8 */ 0x8fd7d5, 0x000000, 0x8fd7d6, 0x00c6d1,
+ /* ac */ 0x000000, 0x8fd7d7, 0x000000, 0x8fd7d8,
+ /* b0 */ 0x000000, 0x00b1d1, 0x000000, 0x00e7f4,
+ /* b4 */ 0x00e7f3, 0x000000, 0x8fd7d9, 0x8fd7da,
+ /* b8 */ 0x000000, 0x00e7f9, 0x00e7f5, 0x00e7f8,
+ /* bc */ 0x000000, 0x8fd7db, 0x8fd7dc, 0x000000,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03f32 ***/
+
+ /* 80 */ 0x8fd7dd, 0x8fd7de, 0x00ccd0, 0x00e7f7,
+ /* 84 */ 0x00b2d8, 0x00b3fd, 0x00e7fb, 0x8fd7df,
+ /* 88 */ 0x8fd7e0, 0x00e7fd, 0x8fd7e1, 0x8fd7e2,
+ /* 8c */ 0x000000, 0x000000, 0x00b7d4, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00e8a3, 0x00e8ac,
+ /* 98 */ 0x00e8ad, 0x000000, 0x000000, 0x8fd7e4,
+ /* 9c */ 0x00b0ab, 0x8fd7e5, 0x8fd7e6, 0x8fd7e7,
+ /* a0 */ 0x000000, 0x8fd7e8, 0x8fd7e9, 0x00e8b4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b0f1, 0x000000, 0x000000, 0x00e8ab,
+ /* ac */ 0x8fd7ea, 0x8fd7eb, 0x8fd7ec, 0x00e8aa,
+ /* b0 */ 0x8fd7ed, 0x00e8a5, 0x00e8a4, 0x8fd7ee,
+ /* b4 */ 0x00e8a2, 0x00e8a1, 0x00c3e3, 0x8fd7ef,
+ /* b8 */ 0x00c2fb, 0x00e8a7, 0x8fd7f0, 0x000000,
+ /* bc */ 0x8fd7f1, 0x8fd7f2, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x03f72 ***/
+
+ /* 80 */ 0x00e8a6, 0x000000, 0x8fd7f3, 0x8fd7f4,
+ /* 84 */ 0x8fd7f5, 0x00e8a9, 0x000000, 0x8fd7f6,
+ /* 88 */ 0x000000, 0x00c1f0, 0x00b7d5, 0x000000,
+ /* 8c */ 0x000000, 0x8fd7f7, 0x8fd7f8, 0x00b1c1,
+ /* 90 */ 0x00e8a8, 0x8fd7f9, 0x00b9d3, 0x8fd8be,
+ /* 94 */ 0x8fd7e3, 0x8fd7fa, 0x8fd7fb, 0x8fd7fc,
+ /* 98 */ 0x00c1f1, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8ff4df, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fd7fd, 0x000000, 0x000000, 0x00e8ba,
+ /* b4 */ 0x000000, 0x00e8bb, 0x000000, 0x00b2d9,
+ /* b8 */ 0x8fd7fe, 0x000000, 0x000000, 0x00b2ae,
+ /* bc */ 0x00e8b8, 0x8fd8a1, 0x000000, 0x8fd8a2,
+
+ /*** Three byte table, leaf: e88exx - offset 0x03fb2 ***/
+
+ /* 80 */ 0x8fd8a3, 0x000000, 0x8fd8a4, 0x000000,
+ /* 84 */ 0x8fd8a5, 0x00e8ae, 0x8fd8a6, 0x00e8b6,
+ /* 88 */ 0x000000, 0x00e8bd, 0x00e8b7, 0x000000,
+ /* 8c */ 0x000000, 0x8fd8a7, 0x00e8b5, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fd8a8, 0x00e7f6,
+ /* 94 */ 0x8fd8a9, 0x8fd8aa, 0x00e8b3, 0x000000,
+ /* 98 */ 0x8fd8ab, 0x8fd8ac, 0x00e8af, 0x8fd8ad,
+ /* 9c */ 0x8fd8ae, 0x8fd8af, 0x00b4d0, 0x00e8b1,
+ /* a0 */ 0x00e8bc, 0x000000, 0x00e8b2, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fd8b0, 0x8fd8b1,
+ /* a8 */ 0x00e8be, 0x8fd8b2, 0x00e8b0, 0x00c7fc,
+ /* ac */ 0x8fd8b3, 0x8fd8cc, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x00cde9, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00e8b9, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00e8cf, 0x8fd8b4, 0x8fd8b5,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x03ff2 ***/
+
+ /* 80 */ 0x8fd8b6, 0x00e8c7, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x00bffb, 0x000000, 0x8fd8b7,
+ /* 88 */ 0x000000, 0x8fd8b8, 0x00b5c6, 0x000000,
+ /* 8c */ 0x00b6dd, 0x000000, 0x00e8c2, 0x8fd8b9,
+ /* 90 */ 0x8fd8ba, 0x8fd8bb, 0x000000, 0x00b2db,
+ /* 94 */ 0x8fd8bc, 0x000000, 0x00bed4, 0x000000,
+ /* 98 */ 0x00e8c5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00bada, 0x8fd8bd, 0x000000, 0x00c5d1,
+ /* a0 */ 0x00e8ca, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fd8bf, 0x00caee, 0x8fd8c0, 0x00e8c1,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00b2da,
+ /* b0 */ 0x00b8d6, 0x00c9a9, 0x00e8cb, 0x000000,
+ /* b4 */ 0x00e8bf, 0x000000, 0x8fd8c1, 0x00e8c8,
+ /* b8 */ 0x8fd8c2, 0x8fd8c3, 0x000000, 0x00e8d2,
+ /* bc */ 0x8fd8c4, 0x00e8c3, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x04031 ***/
+
+ /* 80 */ 0x000000, 0x8fd8c5, 0x000000, 0x00e8c4,
+ /* 84 */ 0x00c6ba, 0x000000, 0x8fd8c6, 0x00e8c9,
+ /* 88 */ 0x000000, 0x000000, 0x8fd8c7, 0x00e8c6,
+ /* 8c */ 0x00cba8, 0x00e8cc, 0x00b0e0, 0x8fd8c8,
+ /* 90 */ 0x000000, 0x8fd8c9, 0x000000, 0x00e8c0,
+ /* 94 */ 0x000000, 0x8fd8ca, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fd8cb, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00e8ce, 0x000000, 0x00e8cd, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00c7eb, 0x00e8d4, 0x000000,
+ /* ac */ 0x00e8df, 0x000000, 0x000000, 0x8fd8cd,
+ /* b0 */ 0x000000, 0x00b3fe, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00e8e2, 0x000000, 0x000000,
+ /* b8 */ 0x00e8d0, 0x8fd8ce, 0x000000, 0x000000,
+ /* bc */ 0x00e8d5, 0x00cdee,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x0406f ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fd8cf, 0x00e8de, 0x8fd8d0,
+ /* 88 */ 0x8fd8d1, 0x00cdd5, 0x8fd8d2, 0x000000,
+ /* 8c */ 0x000000, 0x8fd8d3, 0x00ceaa, 0x8fd8d4,
+ /* 90 */ 0x000000, 0x8fd8d5, 0x8fd8d6, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8fd8d7, 0x00c3f8,
+ /* 98 */ 0x8fd8d8, 0x8fd8d9, 0x8fd8da, 0x00b3eb,
+ /* 9c */ 0x8fd8db, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fd8dc, 0x00c9f2, 0x00e8e4, 0x00c6a1,
+ /* a4 */ 0x8fd8dd, 0x8fd8de, 0x00b0b1, 0x8fd8df,
+ /* a8 */ 0x000000, 0x00e8dd, 0x8fd8e0, 0x00e8d9,
+ /* ac */ 0x00c1f2, 0x00e8d3, 0x00e8db, 0x00e8e0,
+ /* b0 */ 0x8fd8e1, 0x00c7ac, 0x000000, 0x8fd8e2,
+ /* b4 */ 0x8fd8e3, 0x00b0aa, 0x8fd8e4, 0x00e8d8,
+ /* b8 */ 0x8fd8e5, 0x00e8e1, 0x00c9f8, 0x000000,
+ /* bc */ 0x8fd8e6, 0x8fd8e7, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x040ae ***/
+
+ /* 80 */ 0x000000, 0x8fd8e8, 0x00e8dc, 0x000000,
+ /* 84 */ 0x00e8d7, 0x8fd8e9, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00bed5,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bdaf, 0x000000, 0x8fd8ea, 0x8fd8eb,
+ /* 94 */ 0x00bcac, 0x8fd8ec, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00ccd8, 0x000000, 0x000000,
+ /* 9c */ 0x00c9c7, 0x000000, 0x8fd8ed, 0x00e8e7,
+ /* a0 */ 0x000000, 0x00e8f0, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fd8ee, 0x000000,
+ /* a8 */ 0x8fd8ef, 0x8fd8f0, 0x8fd8f1, 0x000000,
+ /* ac */ 0x000000, 0x00e8da, 0x000000, 0x8fd8f2,
+ /* b0 */ 0x000000, 0x8fd8f3, 0x00b3f7, 0x000000,
+ /* b4 */ 0x8fd8f4, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00bef8, 0x00e8e5, 0x8fd8f5, 0x00e8ea,
+ /* bc */ 0x00c1f3, 0x8fd8f6, 0x8fd8f7, 0x00e8e6,
+
+ /*** Three byte table, leaf: e893xx - offset 0x040ee ***/
+
+ /* 80 */ 0x8fd8f8, 0x00e8ed, 0x8fd8f9, 0x000000,
+ /* 84 */ 0x00c3df, 0x000000, 0x00e8ee, 0x8fd8fa,
+ /* 88 */ 0x8fd8fb, 0x00cdd6, 0x00e8e3, 0x00b3b8,
+ /* 8c */ 0x8fd8fc, 0x00e8e9, 0x000000, 0x8fd8fd,
+ /* 90 */ 0x00e8ec, 0x00ccac, 0x000000, 0x8fd8fe,
+ /* 94 */ 0x000000, 0x000000, 0x00e8ef, 0x000000,
+ /* 98 */ 0x000000, 0x00e8e8, 0x00e8eb, 0x000000,
+ /* 9c */ 0x8fd9a1, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fd9a2,
+ /* a8 */ 0x000000, 0x000000, 0x8fd9a3, 0x000000,
+ /* ac */ 0x00cba9, 0x000000, 0x00cfa1, 0x8fd9a4,
+ /* b0 */ 0x8fd9a5, 0x8fd9a6, 0x8fd9a7, 0x000000,
+ /* b4 */ 0x00e8f3, 0x000000, 0x000000, 0x8fd9a8,
+ /* b8 */ 0x000000, 0x000000, 0x8fd9aa, 0x8fd9ab,
+ /* bc */ 0x00e8fa, 0x8fd9ac, 0x000000, 0x00e8f2,
+
+ /*** Three byte table, leaf: e894xx - offset 0x0412e ***/
+
+ /* 80 */ 0x00bcc3, 0x000000, 0x8fd9ad, 0x8fd9ae,
+ /* 84 */ 0x000000, 0x000000, 0x00e8d1, 0x8fd9af,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fd9b0, 0x000000, 0x8fd9b1, 0x000000,
+ /* 90 */ 0x8fd9b2, 0x00cace, 0x000000, 0x00cca2,
+ /* 94 */ 0x00e8f9, 0x00e8f8, 0x000000, 0x00e8f4,
+ /* 98 */ 0x00e8f5, 0x000000, 0x00b1b6, 0x000000,
+ /* 9c */ 0x8fd9b3, 0x000000, 0x8fd9b4, 0x00e8f7,
+ /* a0 */ 0x000000, 0x00e8f1, 0x8fd9b5, 0x8fd9b6,
+ /* a4 */ 0x8fd9b7, 0x8fd9b8, 0x00c4d5, 0x8fd9b9,
+ /* a8 */ 0x000000, 0x000000, 0x8fd9ba, 0x8fd9bb,
+ /* ac */ 0x00e8f6, 0x00b0fe, 0x000000, 0x8fd9bc,
+ /* b0 */ 0x000000, 0x000000, 0x8fd9a9, 0x8fd9bd,
+ /* b4 */ 0x8fd9be, 0x00c2a2, 0x8fd9bf, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00cac3, 0x000000, 0x8fd9c0,
+
+ /*** Three byte table, leaf: e895xx - offset 0x0416e ***/
+
+ /* 80 */ 0x00e8fb, 0x00e9a1, 0x000000, 0x00c8d9,
+ /* 84 */ 0x000000, 0x000000, 0x8fd9c1, 0x000000,
+ /* 88 */ 0x00e8fe, 0x00bed6, 0x00bcc9, 0x00e9a3,
+ /* 8c */ 0x000000, 0x000000, 0x00b6be, 0x8fd9c2,
+ /* 90 */ 0x8fd9c3, 0x8fd9c4, 0x8fd9c5, 0x8fd9c6,
+ /* 94 */ 0x000000, 0x00e9a4, 0x8fd9c7, 0x00c9f9,
+ /* 98 */ 0x00e8fd, 0x8fd9c8, 0x00e8d6, 0x000000,
+ /* 9c */ 0x8fd9c9, 0x8fd9ca, 0x8fd9cb, 0x8fd9cc,
+ /* a0 */ 0x8fd9cd, 0x8fd9ce, 0x8fd9cf, 0x00e8fc,
+ /* a4 */ 0x8fd9d0, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00cfcf, 0x00c6a2, 0x00c9f3, 0x8fd9d1,
+ /* ac */ 0x000000, 0x00e9ab, 0x000000, 0x8fd9d2,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00e9b1,
+ /* b8 */ 0x000000, 0x8fd9d3, 0x8fd9d4, 0x8fd9d5,
+ /* bc */ 0x000000, 0x8fd9d6, 0x00e9b2, 0x8fd9d7,
+
+ /*** Three byte table, leaf: e896xx - offset 0x041ae ***/
+
+ /* 80 */ 0x00e9a5, 0x8fd9d8, 0x000000, 0x000000,
+ /* 84 */ 0x00c7f6, 0x8fd9d9, 0x8fd9da, 0x00e9af,
+ /* 88 */ 0x00e9a7, 0x8fd9db, 0x00e9a9, 0x8fd9dc,
+ /* 8c */ 0x8fd9dd, 0x000000, 0x000000, 0x8fd9de,
+ /* 90 */ 0x00e9b3, 0x00e9a8, 0x000000, 0x8fd9df,
+ /* 94 */ 0x00e9ac, 0x000000, 0x000000, 0x00b1f2,
+ /* 98 */ 0x8fd9e0, 0x00c6e5, 0x000000, 0x00e9ad,
+ /* 9c */ 0x00e9b0, 0x8fd9e1, 0x000000, 0x8fd9e2,
+ /* a0 */ 0x8fd9e3, 0x000000, 0x8fd9e4, 0x000000,
+ /* a4 */ 0x00e9a6, 0x8fd9e5, 0x00c1a6, 0x8fd9e6,
+ /* a8 */ 0x00e9aa, 0x00bba7, 0x00bfc5, 0x00b7b0,
+ /* ac */ 0x00ccf4, 0x8fd9f4, 0x00ccf9, 0x00bdf2,
+ /* b0 */ 0x8ff4e1, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fd9e7, 0x000000, 0x8fd9e8, 0x8fd9e9,
+ /* b8 */ 0x8fd9ea, 0x00e9b7, 0x00e9b5, 0x000000,
+ /* bc */ 0x8fd9eb, 0x8fd9ec, 0x8fd9ed, 0x8fd9ee,
+
+ /*** Three byte table, leaf: e897xx - offset 0x041ee ***/
+
+ /* 80 */ 0x000000, 0x00cfce, 0x8fd9ef, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fd9f0,
+ /* 88 */ 0x000000, 0x00e9b4, 0x8fd9f1, 0x8fd9f2,
+ /* 8c */ 0x000000, 0x00cdf5, 0x8fd9f3, 0x00e9b6,
+ /* 90 */ 0x00e9b8, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x00e9b9, 0x000000, 0x000000,
+ /* 98 */ 0x8fd9f5, 0x000000, 0x8fd9f6, 0x000000,
+ /* 9c */ 0x00e9bc, 0x00e9ba, 0x000000, 0x8fd9f7,
+ /* a0 */ 0x8fd9f8, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c6a3, 0x00e9bb, 0x8fd9f9, 0x000000,
+ /* a8 */ 0x8fd9fa, 0x00c8cd, 0x00e9ae, 0x000000,
+ /* ac */ 0x000000, 0x8fd9fb, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fd9fc,
+ /* b4 */ 0x000000, 0x000000, 0x8fd9fd, 0x00bdf3,
+ /* b8 */ 0x000000, 0x00e9bd, 0x00e9c2, 0x00c1f4,
+ /* bc */ 0x8fd9fe, 0x000000, 0x00e9c1, 0x8fdaa1,
+
+ /*** Three byte table, leaf: e898xx - offset 0x0422e ***/
+
+ /* 80 */ 0x8fdaa2, 0x000000, 0x00e9a2, 0x000000,
+ /* 84 */ 0x8fdaa3, 0x8fdaa4, 0x00e9c3, 0x00c1c9,
+ /* 88 */ 0x000000, 0x000000, 0x00e9be, 0x00e9c0,
+ /* 8c */ 0x000000, 0x8fdaa5, 0x8fdaa6, 0x000000,
+ /* 90 */ 0x8fdaa7, 0x8fdaa8, 0x8fdaa9, 0x00e9bf,
+ /* 94 */ 0x000000, 0x000000, 0x00ddb1, 0x00dda2,
+ /* 98 */ 0x8fdaaa, 0x8fdaab, 0x00e9c5, 0x8fdaac,
+ /* 9c */ 0x000000, 0x000000, 0x8fdaad, 0x000000,
+ /* a0 */ 0x000000, 0x8fdaae, 0x00e9c4, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fdaaf,
+ /* a8 */ 0x000000, 0x8fdab0, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00cdf6, 0x000000, 0x00e2bc,
+ /* b0 */ 0x00e9c6, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fdab1, 0x000000,
+ /* b8 */ 0x8fdab2, 0x000000, 0x8fdab3, 0x000000,
+ /* bc */ 0x8fdab4, 0x8fdab5, 0x000000, 0x00e9c7,
+
+ /*** Three byte table, leaf: e899xx - offset 0x0426e ***/
+
+ /* 80 */ 0x8fdab6, 0x8fb8e6, 0x8fdab7, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x8fdab8, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00e9c8, 0x00b8d7, 0x000000,
+ /* 90 */ 0x00b5d4, 0x000000, 0x8fdab9, 0x8fdaba,
+ /* 94 */ 0x00e9ca, 0x00d1dd, 0x8fdabb, 0x8fdabc,
+ /* 98 */ 0x8fdabd, 0x8fdabe, 0x00b5f5, 0x000000,
+ /* 9c */ 0x00ceba, 0x8fdabf, 0x00b6f3, 0x00e9cb,
+ /* a0 */ 0x8fdac0, 0x8fdac1, 0x8fdac2, 0x8fdac3,
+ /* a4 */ 0x8fdac4, 0x000000, 0x000000, 0x00e9cc,
+ /* a8 */ 0x000000, 0x8fdac5, 0x000000, 0x00c3ee,
+ /* ac */ 0x8fdac6, 0x000000, 0x000000, 0x8fdac7,
+ /* b0 */ 0x000000, 0x00e9cd, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fdac8, 0x8fdac9, 0x8fdaca,
+ /* b8 */ 0x000000, 0x00c6fa, 0x8fdacb, 0x00b0ba,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x042aa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fdaed, 0x000000, 0x00b2e3, 0x00e9d2,
+ /* 8c */ 0x00e9d3, 0x8fdacc, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x8fdacd, 0x000000, 0x00e9ce,
+ /* 94 */ 0x000000, 0x00bbbd, 0x8fdace, 0x000000,
+ /* 98 */ 0x8fdacf, 0x000000, 0x8fdad0, 0x000000,
+ /* 9c */ 0x8fdad1, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fdad2, 0x000000, 0x00e9cf,
+ /* a4 */ 0x00c7c2, 0x000000, 0x8fdad3, 0x8fdad4,
+ /* a8 */ 0x8fdad5, 0x00e9d0, 0x00e9d1, 0x00e9db,
+ /* ac */ 0x000000, 0x8fdad6, 0x000000, 0x00e9d5,
+ /* b0 */ 0x00e9d8, 0x8fdad7, 0x000000, 0x8fdad8,
+ /* b4 */ 0x8fdad9, 0x8fdada, 0x00e9d4, 0x8fdadb,
+ /* b8 */ 0x8fdadc, 0x8fdadd, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fdade,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x042ea ***/
+
+ /* 80 */ 0x8fdadf, 0x8fdae0, 0x000000, 0x8fdae1,
+ /* 84 */ 0x00e9d6, 0x8fdae2, 0x00e9d7, 0x00bcd8,
+ /* 88 */ 0x000000, 0x00e9d9, 0x000000, 0x00c3c1,
+ /* 8c */ 0x000000, 0x00b7d6, 0x00b3c2, 0x000000,
+ /* 90 */ 0x000000, 0x8fdae3, 0x8fdae4, 0x000000,
+ /* 94 */ 0x00e9dc, 0x8fdae5, 0x000000, 0x8fdae6,
+ /* 98 */ 0x000000, 0x00b3bf, 0x8fdae7, 0x00e9e1,
+ /* 9c */ 0x8fdae8, 0x000000, 0x00e9dd, 0x00e9e0,
+ /* a0 */ 0x8fdae9, 0x000000, 0x000000, 0x8fdaea,
+ /* a4 */ 0x00c8ba, 0x8fdaeb, 0x000000, 0x8fdaec,
+ /* a8 */ 0x000000, 0x00e9de, 0x000000, 0x000000,
+ /* ac */ 0x00e9df, 0x00c9c8, 0x00c8da, 0x00e9e2,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00c2fd, 0x00e9ec, 0x8fdaee, 0x00e9e8,
+ /* bc */ 0x8fdaef, 0x8fdaf0, 0x00b2eb, 0x000000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x0432a ***/
+
+ /* 80 */ 0x00e9e6, 0x000000, 0x00cbaa, 0x00e9e7,
+ /* 84 */ 0x8fdaf1, 0x8fdaf2, 0x00e9e4, 0x8fdaf3,
+ /* 88 */ 0x00e9e5, 0x00e9ea, 0x00e9ed, 0x8fdaf4,
+ /* 8c */ 0x000000, 0x00e9eb, 0x8fdaf5, 0x8fdaf6,
+ /* 90 */ 0x8fdaf7, 0x00e9e9, 0x00e9e3, 0x8fdaf8,
+ /* 94 */ 0x8fdaf9, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00c3d8, 0x8fdafa, 0x00e9f4, 0x000000,
+ /* 9c */ 0x00ccaa, 0x000000, 0x8fdafb, 0x8fdafc,
+ /* a0 */ 0x000000, 0x8fdafd, 0x000000, 0x8fdafe,
+ /* a4 */ 0x000000, 0x00e9f2, 0x000000, 0x000000,
+ /* a8 */ 0x8fdba1, 0x00e9f3, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fdba2, 0x8fdba3,
+ /* b0 */ 0x000000, 0x8fdba4, 0x8fdba5, 0x000000,
+ /* b4 */ 0x00e9ee, 0x000000, 0x000000, 0x00e9f0,
+ /* b8 */ 0x000000, 0x8fdba6, 0x8fdba7, 0x00e9f1,
+ /* bc */ 0x8fdba8, 0x8fdba9, 0x8fdbaa, 0x00e9ef,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x0436a ***/
+
+ /* 80 */ 0x8fdbab, 0x000000, 0x000000, 0x8fdbac,
+ /* 84 */ 0x000000, 0x8fdbad, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x00c0e6, 0x000000, 0x00cfb9,
+ /* 8c */ 0x00e9f8, 0x8fdbae, 0x00e9f9, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00eaa1,
+ /* 94 */ 0x000000, 0x00bfaa, 0x000000, 0x00e9fb,
+ /* 98 */ 0x8fdbaf, 0x00e9fe, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fdbb0, 0x000000, 0x00e9f6,
+ /* a0 */ 0x00e9f5, 0x8fdbb1, 0x000000, 0x00eaa2,
+ /* a4 */ 0x8fdbb2, 0x8fdbb3, 0x00b2dc, 0x000000,
+ /* a8 */ 0x00e9fc, 0x000000, 0x00eaa3, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x00e9fd, 0x8fdbb4,
+ /* b0 */ 0x000000, 0x8fdbb5, 0x8fdbb6, 0x000000,
+ /* b4 */ 0x00e9fa, 0x000000, 0x00c4b3, 0x000000,
+ /* b8 */ 0x00e9f7, 0x000000, 0x000000, 0x8fdbb7,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00c7e8,
+
+ /*** Three byte table, leaf: e89exx - offset 0x043aa ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00eaa7, 0x8fdbb8,
+ /* 84 */ 0x8fdbb9, 0x8fdbba, 0x8fdbbb, 0x8fdbbc,
+ /* 88 */ 0x8fdbbd, 0x8fdbbe, 0x000000, 0x8fdbbf,
+ /* 8c */ 0x8fdbc0, 0x00cdbb, 0x000000, 0x000000,
+ /* 90 */ 0x8fdbc1, 0x000000, 0x000000, 0x8fdbc2,
+ /* 94 */ 0x000000, 0x8fdbc3, 0x000000, 0x8fdbc4,
+ /* 98 */ 0x8fdbc5, 0x8fdbc6, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fdbc7, 0x00eaa6,
+ /* a0 */ 0x8fdbc8, 0x000000, 0x00eaa5, 0x8fdbc9,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fdbca,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00eaae,
+ /* ac */ 0x8fdbcb, 0x8fdbcc, 0x8fdbcd, 0x00eaa8,
+ /* b0 */ 0x000000, 0x8fdbce, 0x000000, 0x00eab0,
+ /* b4 */ 0x000000, 0x8fdbcf, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x00cde6, 0x00eab3,
+ /* bc */ 0x000000, 0x00eaaa, 0x8fdbd0, 0x8fdbd1,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x043ea ***/
+
+ /* 80 */ 0x00eaab, 0x8fdbd2, 0x000000, 0x000000,
+ /* 84 */ 0x00eaaf, 0x000000, 0x00eab2, 0x00eab1,
+ /* 88 */ 0x8fdbd3, 0x8fdbd4, 0x8fdbd5, 0x00eaa9,
+ /* 8c */ 0x000000, 0x000000, 0x8fdbd6, 0x000000,
+ /* 90 */ 0x00eaac, 0x000000, 0x00eabd, 0x000000,
+ /* 94 */ 0x000000, 0x8fdbd7, 0x8fdbd8, 0x000000,
+ /* 98 */ 0x000000, 0x8fdbd9, 0x8fdbda, 0x000000,
+ /* 9c */ 0x8fdbdb, 0x000000, 0x000000, 0x8fdbdc,
+ /* a0 */ 0x00eab6, 0x000000, 0x8fdbdd, 0x8fdbde,
+ /* a4 */ 0x8fdbdf, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fdbe0, 0x8fdbe1,
+ /* ac */ 0x000000, 0x8fdbe2, 0x000000, 0x00eab4,
+ /* b0 */ 0x000000, 0x8fdbe3, 0x00eab5, 0x8fdbe4,
+ /* b4 */ 0x000000, 0x000000, 0x00eaba, 0x00eabb,
+ /* b8 */ 0x8fdbe5, 0x00b3aa, 0x8fdbe6, 0x00b5c2,
+ /* bc */ 0x000000, 0x000000, 0x00eab9, 0x8fdbe7,
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x0442a ***/
+
+ /* 80 */ 0x000000, 0x8fdbe8, 0x000000, 0x8fdbe9,
+ /* 84 */ 0x000000, 0x00eaa4, 0x8fdbea, 0x8ff4e4,
+ /* 88 */ 0x000000, 0x8fdbeb, 0x8fdbec, 0x8fdbed,
+ /* 8c */ 0x000000, 0x00eab8, 0x00eabc, 0x00eab7,
+ /* 90 */ 0x8fdbee, 0x00eabe, 0x8fdbf0, 0x8fdbf1,
+ /* 94 */ 0x8fdbf2, 0x00eac0, 0x00eabf, 0x000000,
+ /* 98 */ 0x8fdbf3, 0x8fdbef, 0x8fdbf4, 0x8fdbf5,
+ /* 9c */ 0x8fdbf6, 0x000000, 0x8fdbf7, 0x8fdbf8,
+ /* a0 */ 0x000000, 0x00eac2, 0x00eac1, 0x00e9da,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00eac6,
+ /* a8 */ 0x8fdbf9, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x8fdbfa, 0x8fdbfb, 0x000000,
+ /* b0 */ 0x8fdbfc, 0x00eac3, 0x8fdbfd, 0x000000,
+ /* b4 */ 0x000000, 0x8fdbfe, 0x00eac4, 0x000000,
+ /* b8 */ 0x000000, 0x00eac5, 0x8fdca1, 0x00eac7,
+ /* bc */ 0x8fdca2, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x0446a ***/
+
+ /* 80 */ 0x00b7ec, 0x8fdca3, 0x00eac9, 0x8fdca4,
+ /* 84 */ 0x00eac8, 0x8fdca5, 0x00bdb0, 0x000000,
+ /* 88 */ 0x8fdca6, 0x8fdca7, 0x8fdca8, 0x8fdca9,
+ /* 8c */ 0x00b9d4, 0x00dea7, 0x8fdcaa, 0x000000,
+ /* 90 */ 0x000000, 0x8fdcab, 0x00eaca, 0x00bdd1,
+ /* 94 */ 0x000000, 0x8fdcac, 0x8fdcad, 0x00b3b9,
+ /* 98 */ 0x8fdcae, 0x00eacb, 0x8fdcaf, 0x00b1d2,
+ /* 9c */ 0x8fdcb0, 0x00bed7, 0x00eacc, 0x8fdcb1,
+ /* a0 */ 0x8fdcb2, 0x00b9d5, 0x00eacd, 0x00b0e1,
+ /* a4 */ 0x8fdcb3, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c9bd, 0x8fdcb4, 0x000000, 0x00eace,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00bfea, 0x8fdcb5, 0x00ead5, 0x000000,
+ /* b4 */ 0x000000, 0x00ead2, 0x000000, 0x00c3ef,
+ /* b8 */ 0x000000, 0x8fdcb6, 0x000000, 0x8fdcb7,
+ /* bc */ 0x000000, 0x00ead3, 0x00ead0, 0x00b6de,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x044aa ***/
+
+ /* 80 */ 0x8fdcb8, 0x00eacf, 0x00ead6, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x00b7b6, 0x000000, 0x000000, 0x00c2de,
+ /* 8c */ 0x000000, 0x00eadc, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00ead8, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00c2b5, 0x00ead7,
+ /* 98 */ 0x8fdcb9, 0x00eada, 0x8fdcba, 0x8fdcbb,
+ /* 9c */ 0x8fdcbc, 0x000000, 0x00ead1, 0x8fdcbd,
+ /* a0 */ 0x8fdcbe, 0x000000, 0x00eadb, 0x000000,
+ /* a4 */ 0x00eadd, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fdcbf, 0x000000, 0x8fdcc0, 0x00c8ef,
+ /* ac */ 0x000000, 0x000000, 0x00ead9, 0x000000,
+ /* b0 */ 0x00eade, 0x00eae0, 0x000000, 0x000000,
+ /* b4 */ 0x00b8d3, 0x00ead4, 0x000000, 0x00b0c1,
+ /* b8 */ 0x000000, 0x000000, 0x8fdcc1, 0x000000,
+ /* bc */ 0x000000, 0x8fdcc2, 0x8fdcc3, 0x00eadf,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x044ea ***/
+
+ /* 80 */ 0x8fdcc4, 0x00badb, 0x00cef6, 0x00eae1,
+ /* 84 */ 0x00eae2, 0x00c1f5, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fdcc5, 0x8fdcc6,
+ /* 8c */ 0x8fdcc7, 0x8fdcc8, 0x8fdcc9, 0x00cea2,
+ /* 90 */ 0x000000, 0x8fdcca, 0x8fdccb, 0x8fdccc,
+ /* 94 */ 0x00eae3, 0x00cdb5, 0x000000, 0x000000,
+ /* 98 */ 0x00eae4, 0x00eae5, 0x000000, 0x8fdccd,
+ /* 9c */ 0x00cae4, 0x00eae6, 0x8fdcce, 0x00bac0,
+ /* a0 */ 0x000000, 0x00cea3, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fdccf,
+ /* a8 */ 0x00eaeb, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fdcd0,
+ /* b0 */ 0x8fdcd1, 0x8fdcd2, 0x00eaec, 0x00bed8,
+ /* b4 */ 0x00eaea, 0x8fdcd3, 0x000000, 0x8fdcd4,
+ /* b8 */ 0x00cde7, 0x00eae7, 0x000000, 0x000000,
+ /* bc */ 0x00eae9, 0x00c0bd, 0x00bffe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x04529 ***/
+
+ /* 80 */ 0x000000, 0x8fdcd5, 0x00eae8, 0x000000,
+ /* 84 */ 0x00eaed, 0x000000, 0x8fdcd6, 0x00caa3,
+ /* 88 */ 0x000000, 0x000000, 0x00eaef, 0x000000,
+ /* 8c */ 0x00eaee, 0x8fdcd7, 0x8fdcd8, 0x8fdcd9,
+ /* 90 */ 0x00b3ec, 0x000000, 0x00cbab, 0x00eaf0,
+ /* 94 */ 0x000000, 0x8fdcda, 0x8fdcdb, 0x000000,
+ /* 98 */ 0x8fdcdc, 0x8fdcdd, 0x8fdcde, 0x000000,
+ /* 9c */ 0x8fdcdf, 0x00eafc, 0x00eaf2, 0x000000,
+ /* a0 */ 0x8fdce0, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00eaf3, 0x8fdce1, 0x8fdce2,
+ /* a8 */ 0x8fdce3, 0x000000, 0x00eaf4, 0x00eaf5,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x8fdce4, 0x8fdce5, 0x8fdce6, 0x000000,
+ /* b4 */ 0x000000, 0x8fdce7, 0x00eaf9, 0x000000,
+ /* b8 */ 0x00eafa, 0x8fdce8, 0x8fdce9, 0x00eaf8,
+ /* bc */ 0x000000, 0x000000, 0x8fdcea, 0x000000,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x04569 ***/
+
+ /* 80 */ 0x8fdceb, 0x00eaf6, 0x8fdcec, 0x00eaf1,
+ /* 84 */ 0x00eaf7, 0x8fdced, 0x8fdcee, 0x000000,
+ /* 88 */ 0x000000, 0x8fdcef, 0x000000, 0x000000,
+ /* 8c */ 0x00eafb, 0x00f0b7, 0x000000, 0x8fdcf0,
+ /* 90 */ 0x000000, 0x000000, 0x8fdcf1, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00b2a8, 0x8fdcf2,
+ /* 98 */ 0x000000, 0x000000, 0x8fdcf3, 0x8fdcf4,
+ /* 9c */ 0x8fdcf5, 0x000000, 0x00eafe, 0x00b6df,
+ /* a0 */ 0x00eafd, 0x8fdcf6, 0x8fdcf7, 0x8fdcf8,
+ /* a4 */ 0x00eba2, 0x000000, 0x00eba1, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00eba4, 0x8fdcf9,
+ /* ac */ 0x000000, 0x00eba3, 0x8fdcfa, 0x00eba5,
+ /* b0 */ 0x8fdcfb, 0x000000, 0x00bdb1, 0x8fdcfc,
+ /* b4 */ 0x00eba6, 0x8fdcfd, 0x000000, 0x00eba7,
+ /* b8 */ 0x000000, 0x000000, 0x8fdcfe, 0x8fdda1,
+ /* bc */ 0x8fdda2, 0x8fdda3, 0x00eba8, 0x00c0be,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x045a9 ***/
+
+ /* 80 */ 0x000000, 0x00cdd7, 0x000000, 0x00eba9,
+ /* 84 */ 0x000000, 0x000000, 0x00caa4, 0x00c7c6,
+ /* 88 */ 0x00ebaa, 0x8fdda4, 0x00ebab, 0x00b8ab,
+ /* 8c */ 0x000000, 0x8fdda5, 0x000000, 0x00b5ac,
+ /* 90 */ 0x8fdda6, 0x000000, 0x000000, 0x00ebac,
+ /* 94 */ 0x8fdda7, 0x8fdda8, 0x00bbeb, 0x00c7c1,
+ /* 98 */ 0x00ebad, 0x000000, 0x00b3d0, 0x8fdda9,
+ /* 9c */ 0x8fddaa, 0x000000, 0x000000, 0x8fddab,
+ /* a0 */ 0x8fddac, 0x00ebae, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fddad, 0x00ebb0, 0x00cdf7,
+ /* a8 */ 0x000000, 0x00ebaf, 0x00bfc6, 0x000000,
+ /* ac */ 0x00ebb1, 0x000000, 0x000000, 0x00ebb2,
+ /* b0 */ 0x8fddae, 0x000000, 0x00ebb3, 0x00b4d1,
+ /* b4 */ 0x8fddaf, 0x8fddb0, 0x8fddb1, 0x8fddb2,
+ /* b8 */ 0x000000, 0x000000, 0x00ebb4, 0x000000,
+ /* bc */ 0x8fddb3, 0x00ebb5, 0x000000, 0x00ebb6,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x045e9 ***/
+
+ /* 80 */ 0x00ebb7, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x00b3d1, 0x000000,
+ /* 94 */ 0x8fddb4, 0x8fddb5, 0x8fddb6, 0x8fddb7,
+ /* 98 */ 0x8fddb8, 0x000000, 0x00ebb8, 0x000000,
+ /* 9c */ 0x00ebb9, 0x00ebba, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00b2f2,
+ /* a4 */ 0x000000, 0x8fddb9, 0x00bfa8, 0x00ebbb,
+ /* a8 */ 0x000000, 0x8fddba, 0x000000, 0x8fddbb,
+ /* ac */ 0x000000, 0x8fddbc, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x8fddbd, 0x000000, 0x8fddbe,
+ /* b4 */ 0x00ebbc, 0x000000, 0x8fddbf, 0x000000,
+ /* b8 */ 0x00ebbd, 0x8fddc0, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fddc1, 0x000000, 0x8fddc2,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x04629 ***/
+
+ /* 80 */ 0x00b8c0, 0x000000, 0x00c4fb, 0x00ebbe,
+ /* 84 */ 0x8fddc3, 0x8fddc4, 0x000000, 0x8fddc5,
+ /* 88 */ 0x00b7d7, 0x000000, 0x00bfd6, 0x000000,
+ /* 8c */ 0x00ebc1, 0x000000, 0x00c6a4, 0x8fddc6,
+ /* 90 */ 0x00ebc0, 0x8fddc7, 0x8fddc8, 0x00b7b1,
+ /* 94 */ 0x8fddc9, 0x8fddca, 0x00ebbf, 0x00c2f7,
+ /* 98 */ 0x00b5ad, 0x000000, 0x000000, 0x00ebc2,
+ /* 9c */ 0x000000, 0x00ebc3, 0x8fddcb, 0x00bed9,
+ /* a0 */ 0x8fddcc, 0x000000, 0x8fddcd, 0x00b7ed,
+ /* a4 */ 0x8fddce, 0x00ebc4, 0x8fddcf, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00cbac, 0x8fddd0,
+ /* ac */ 0x8fddd1, 0x00c0df, 0x000000, 0x8fddd2,
+ /* b0 */ 0x000000, 0x00b5f6, 0x000000, 0x00ccf5,
+ /* b4 */ 0x00c1ca, 0x8fddd3, 0x00ebc5, 0x8fddd4,
+ /* b8 */ 0x000000, 0x000000, 0x00bfc7, 0x00c3f0,
+ /* bc */ 0x00beda, 0x8fddd5, 0x8fddd6, 0x000000,
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x04669 ***/
+
+ /* 80 */ 0x8fddd7, 0x00ebc6, 0x000000, 0x8fddd8,
+ /* 84 */ 0x000000, 0x8fddd9, 0x00ebc9, 0x8fddda,
+ /* 88 */ 0x00ebca, 0x8fdddb, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fdddc, 0x8fdddd, 0x000000,
+ /* 90 */ 0x00babe, 0x00c2c2, 0x00ebc8, 0x8fddde,
+ /* 94 */ 0x00bedb, 0x00c9be, 0x8fdddf, 0x8fdde0,
+ /* 98 */ 0x8fdde1, 0x000000, 0x000000, 0x00ebc7,
+ /* 9c */ 0x8fdde2, 0x8fdde3, 0x00bbec, 0x000000,
+ /* a0 */ 0x00b1d3, 0x8fdde4, 0x00ebce, 0x00b7d8,
+ /* a4 */ 0x000000, 0x8fdde5, 0x00bbee, 0x8fdde6,
+ /* a8 */ 0x000000, 0x00bbed, 0x000000, 0x00cfcd,
+ /* ac */ 0x00ebcd, 0x00ebcc, 0x00c1a7, 0x000000,
+ /* b0 */ 0x00b5cd, 0x00cfc3, 0x00b3ba, 0x00bedc,
+ /* b4 */ 0x000000, 0x8fdde7, 0x8fdde8, 0x8fdde9,
+ /* b8 */ 0x000000, 0x8fddea, 0x8fddeb, 0x8fddec,
+ /* bc */ 0x00ebcb, 0x000000, 0x8fdded, 0x8fddee,
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x046a9 ***/
+
+ /* 80 */ 0x8fddef, 0x000000, 0x00ebd0, 0x8fddf0,
+ /* 84 */ 0x00ebd1, 0x00ebcf, 0x8fddf1, 0x00b8d8,
+ /* 88 */ 0x000000, 0x00cdc0, 0x000000, 0x8fddf2,
+ /* 8c */ 0x00bbef, 0x00c7a7, 0x000000, 0x8fddf3,
+ /* 90 */ 0x8fddf4, 0x00ebd4, 0x8fddf5, 0x00c0c0,
+ /* 94 */ 0x000000, 0x00c3c2, 0x8fddf6, 0x8fddf7,
+ /* 98 */ 0x00cdb6, 0x8fddf8, 0x00ebd7, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x00b8ec, 0x8fddf9,
+ /* a0 */ 0x00c0bf, 0x00ebd3, 0x000000, 0x00ebd8,
+ /* a4 */ 0x00b8ed, 0x00ebd5, 0x00ebd6, 0x8fddfa,
+ /* a8 */ 0x00ebd2, 0x8fddfb, 0x000000, 0x000000,
+ /* ac */ 0x00c0e2, 0x00c6c9, 0x8fddfc, 0x8fddfd,
+ /* b0 */ 0x00c3af, 0x000000, 0x00b2dd, 0x8fddfe,
+ /* b4 */ 0x000000, 0x000000, 0x8fdea1, 0x8fdea2,
+ /* b8 */ 0x000000, 0x00c8f0, 0x000000, 0x8fdea3,
+ /* bc */ 0x00b5c3, 0x000000, 0x8fdea4, 0x00c4b4,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x046e9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ebdb, 0x8fdea5,
+ /* 84 */ 0x00ebd9, 0x000000, 0x8fdea6, 0x00c3cc,
+ /* 88 */ 0x8fdea7, 0x8fdea8, 0x8fdea9, 0x00c0c1,
+ /* 8c */ 0x00b4d2, 0x00ebda, 0x000000, 0x00bfdb,
+ /* 90 */ 0x000000, 0x8fdeaa, 0x00ceca, 0x8fdeab,
+ /* 94 */ 0x8fdeac, 0x8fdead, 0x00cfc0, 0x8fdeae,
+ /* 98 */ 0x000000, 0x000000, 0x00ebdc, 0x00ebe7,
+ /* 9c */ 0x00c4b5, 0x8fdeaf, 0x00ebe6, 0x8fdeb0,
+ /* a0 */ 0x00ebe3, 0x00ebeb, 0x00ebe4, 0x000000,
+ /* a4 */ 0x00ebe0, 0x000000, 0x00c4fc, 0x00ebdf,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00ebdd,
+ /* ac */ 0x8fdeb1, 0x00cda1, 0x00bbf0, 0x000000,
+ /* b0 */ 0x8fdeb2, 0x00ebe1, 0x000000, 0x00ebde,
+ /* b4 */ 0x8fdeb3, 0x8fdeb4, 0x8fdeb5, 0x00ebe5,
+ /* b8 */ 0x00bdf4, 0x000000, 0x00b8c1, 0x000000,
+ /* bc */ 0x8fdeb6, 0x000000, 0x00c2fa, 0x8fdeb7,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x04729 ***/
+
+ /* 80 */ 0x00cbc5, 0x00b1da, 0x00b0e2, 0x000000,
+ /* 84 */ 0x00c6a5, 0x8fdeb8, 0x8fdeb9, 0x00ebe9,
+ /* 88 */ 0x000000, 0x000000, 0x8fdebf, 0x8fdeba,
+ /* 8c */ 0x00ebe8, 0x000000, 0x00c6e6, 0x000000,
+ /* 90 */ 0x00ebed, 0x8fdebb, 0x000000, 0x000000,
+ /* 94 */ 0x00ebe2, 0x000000, 0x00ebec, 0x00ebee,
+ /* 98 */ 0x000000, 0x00b8ac, 0x00ebea, 0x00b9d6,
+ /* 9c */ 0x8fdebc, 0x00bcd5, 0x8fdebd, 0x8fdebe,
+ /* a0 */ 0x00ebef, 0x00cdd8, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x00ebf2, 0x000000,
+ /* a8 */ 0x00ebf5, 0x000000, 0x000000, 0x00ebf3,
+ /* ac */ 0x00c9b5, 0x8fdec0, 0x000000, 0x000000,
+ /* b0 */ 0x8fdec1, 0x000000, 0x000000, 0x00ebf0,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fdec2,
+ /* b8 */ 0x000000, 0x00b6e0, 0x000000, 0x000000,
+ /* bc */ 0x8fdec3, 0x000000, 0x00ebf4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x04768 ***/
+
+ /* 80 */ 0x000000, 0x00ebf6, 0x8fdec4, 0x8fdec5,
+ /* 84 */ 0x8fdec6, 0x8fdec7, 0x8fdec8, 0x000000,
+ /* 88 */ 0x8fdec9, 0x00ebfa, 0x000000, 0x000000,
+ /* 8c */ 0x00ebf7, 0x8fdece, 0x00ebf9, 0x00ebf8,
+ /* 90 */ 0x000000, 0x000000, 0x8fdeca, 0x8fdecb,
+ /* 94 */ 0x8fdecc, 0x000000, 0x00ebfb, 0x000000,
+ /* 98 */ 0x00bcb1, 0x8fdecd, 0x00ebfd, 0x00ebfc,
+ /* 9c */ 0x00c9e8, 0x000000, 0x8fdecf, 0x00eca1,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fded0,
+ /* a4 */ 0x000000, 0x000000, 0x00b7d9, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00ebfe,
+ /* ac */ 0x00eca2, 0x8fded1, 0x000000, 0x00eca3,
+ /* b0 */ 0x00b5c4, 0x00e6c1, 0x00bef9, 0x000000,
+ /* b4 */ 0x00eca4, 0x000000, 0x8fded2, 0x00b8ee,
+ /* b8 */ 0x8fded3, 0x8fded4, 0x000000, 0x000000,
+ /* bc */ 0x8fded5, 0x00eca5, 0x8fded6, 0x8ff4e6,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x047a8 ***/
+
+ /* 80 */ 0x00eca6, 0x8fded7, 0x000000, 0x00bbbe,
+ /* 84 */ 0x8fded8, 0x8fded9, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x00dace, 0x8fdeda,
+ /* 8c */ 0x00eca7, 0x8fdedb, 0x00eca8, 0x8fdedc,
+ /* 90 */ 0x00bdb2, 0x000000, 0x00eca9, 0x00ecaa,
+ /* 94 */ 0x8fdedd, 0x8fdede, 0x00ecab, 0x000000,
+ /* 98 */ 0x000000, 0x00ecac, 0x00ecad, 0x000000,
+ /* 9c */ 0x8fdedf, 0x000000, 0x8fdee0, 0x8fdee1,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x047c8 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c3ab,
+ /* b8 */ 0x8fdee2, 0x8fdee3, 0x00ecae, 0x000000,
+ /* bc */ 0x000000, 0x8fdee4, 0x8fdee5, 0x00ecb0,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x04808 ***/
+
+ /* 80 */ 0x000000, 0x00ecaf, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x8fdee6, 0x00c6a6, 0x8fdee7,
+ /* 88 */ 0x00ecb1, 0x8fdee8, 0x00cbad, 0x8fdee9,
+ /* 8c */ 0x00ecb2, 0x000000, 0x00ecb3, 0x8fdeea,
+ /* 90 */ 0x00ecb4, 0x8fdeeb, 0x000000, 0x8fdeec,
+ /* 94 */ 0x8fdeed, 0x00ecb5, 0x000000, 0x8fdeee,
+ /* 98 */ 0x8fdeef, 0x8fdef2, 0x00c6da, 0x8fdef0,
+ /* 9c */ 0x000000, 0x8fdef1, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x00bedd, 0x00ecb6, 0x8fdef3,
+ /* a4 */ 0x8fdef4, 0x000000, 0x8fdef5, 0x000000,
+ /* a8 */ 0x8fdef6, 0x8fdef7, 0x00b9eb, 0x00d0ae,
+ /* ac */ 0x00ecb7, 0x8fdef8, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x8fdef9,
+ /* b4 */ 0x000000, 0x8fdefa, 0x8fdefb, 0x000000,
+ /* b8 */ 0x00ecb8, 0x00c9bf, 0x00ecb9, 0x8fdefc,
+ /* bc */ 0x00ecc1, 0x000000, 0x8fdefd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x04847 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x00ecba, 0x000000,
+ /* 84 */ 0x000000, 0x00ecbc, 0x8fdefe, 0x8fdfa1,
+ /* 88 */ 0x000000, 0x00ecbb, 0x00ecbd, 0x8fdfa2,
+ /* 8c */ 0x00cbc6, 0x00ecbe, 0x00ecbf, 0x000000,
+ /* 90 */ 0x8fdfa3, 0x000000, 0x8fdfa4, 0x8fdfa5,
+ /* 94 */ 0x00ecc0, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x00ecc2, 0x8fdfa6, 0x000000, 0x8fdfa7,
+ /* 9c */ 0x8fdfa8, 0x00b3ad, 0x00c4e7, 0x000000,
+ /* a0 */ 0x00c9e9, 0x00bae2, 0x00b9d7, 0x000000,
+ /* a4 */ 0x8fdfa9, 0x000000, 0x000000, 0x00c9cf,
+ /* a8 */ 0x00b2df, 0x00c8ce, 0x00ecc5, 0x00b4d3,
+ /* ac */ 0x00c0d5, 0x00ecc4, 0x00ecc9, 0x00c3f9,
+ /* b0 */ 0x00cce3, 0x000000, 0x00ecc7, 0x00ecc8,
+ /* b4 */ 0x00b5ae, 0x000000, 0x00ecca, 0x00c7e3,
+ /* b8 */ 0x00c2df, 0x8fdfaa, 0x8fdfab, 0x00c8f1,
+ /* bc */ 0x00c5bd, 0x00ecc6, 0x000000, 0x00cbc7,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x04887 ***/
+
+ /* 80 */ 0x00b2ec, 0x00eccc, 0x00cfa8, 0x00c4c2,
+ /* 84 */ 0x00cfc5, 0x8fdfac, 0x8fdfad, 0x00bbf1,
+ /* 88 */ 0x00eccb, 0x8fdfae, 0x00c2b1, 0x8fdfaf,
+ /* 8c */ 0x000000, 0x00ecdc, 0x00c1a8, 0x8fdfb0,
+ /* 90 */ 0x000000, 0x00c6f8, 0x000000, 0x00c9d0,
+ /* 94 */ 0x000000, 0x8fdfb2, 0x8fdfb1, 0x000000,
+ /* 98 */ 0x000000, 0x8fdfb3, 0x00eccf, 0x00bbbf,
+ /* 9c */ 0x00bbf2, 0x8fdfb4, 0x00bede, 0x000000,
+ /* a0 */ 0x00c7e5, 0x8fdfb5, 0x00b8ad, 0x00ecce,
+ /* a4 */ 0x00eccd, 0x000000, 0x00c9ea, 0x000000,
+ /* a8 */ 0x8fdfb6, 0x000000, 0x00bcc1, 0x000000,
+ /* ac */ 0x8fdfb7, 0x00c5d2, 0x000000, 0x8fdfb8,
+ /* b0 */ 0x8fdfb9, 0x000000, 0x8fdfba, 0x000000,
+ /* b4 */ 0x8ff4e7, 0x8fdfbb, 0x000000, 0x8fdfbc,
+ /* b8 */ 0x8fdfbd, 0x000000, 0x00ecd1, 0x00ecd2,
+ /* bc */ 0x00b9d8, 0x00ecd0, 0x8fdfbe, 0x8fdfbf,
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x048c7 ***/
+
+ /* 80 */ 0x000000, 0x8fdfc0, 0x000000, 0x8fdfc1,
+ /* 84 */ 0x00ecd3, 0x00ecd4, 0x000000, 0x00ecd6,
+ /* 88 */ 0x00c2a3, 0x8fdfc2, 0x00ecd5, 0x00b4e6,
+ /* 8c */ 0x000000, 0x00ecd8, 0x000000, 0x00ecd7,
+ /* 90 */ 0x00ecd9, 0x000000, 0x8fdfc3, 0x00ecdb,
+ /* 94 */ 0x00ecdd, 0x000000, 0x00ecde, 0x8fdfc4,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x8fdfc5,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x048e3 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x00c0d6, 0x8fdfc6, 0x00bccf, 0x00ecdf,
+ /* a8 */ 0x000000, 0x8fdfc7, 0x000000, 0x00b3d2,
+ /* ac */ 0x8fdfc8, 0x00ece0, 0x8fdfc9, 0x000000,
+ /* b0 */ 0x00c1f6, 0x00ece1, 0x000000, 0x00ece2,
+ /* b4 */ 0x00c9eb, 0x000000, 0x8ff4e8, 0x00b5af,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fdfca,
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04923 ***/
+
+ /* 80 */ 0x000000, 0x00ece3, 0x8fdfcb, 0x000000,
+ /* 84 */ 0x8fdfcc, 0x00c4b6, 0x000000, 0x000000,
+ /* 88 */ 0x8fdfcd, 0x000000, 0x00b1db, 0x000000,
+ /* 8c */ 0x000000, 0x8fdfce, 0x000000, 0x000000,
+ /* 90 */ 0x8fdfcf, 0x8fdfd0, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fdfd1, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00ece4, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fdfd2, 0x8fdfd3,
+ /* a0 */ 0x8fdfd4, 0x000000, 0x000000, 0x00bcf1,
+ /* a4 */ 0x000000, 0x000000, 0x8fdfd5, 0x000000,
+ /* a8 */ 0x00bff6, 0x000000, 0x000000, 0x8fdfd6,
+ /* ac */ 0x8fdfd7, 0x000000, 0x000000, 0x8fdfd8,
+ /* b0 */ 0x000000, 0x000000, 0x8fdfd9, 0x00c2ad,
+ /* b4 */ 0x000000, 0x8fdfda, 0x000000, 0x8fdfdb,
+ /* b8 */ 0x000000, 0x8fdfdc, 0x00ece7, 0x8fdfdd,
+ /* bc */ 0x8fdfef, 0x000000, 0x00ece6, 0x000000,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x04963 ***/
+
+ /* 80 */ 0x8fdfde, 0x000000, 0x00ece5, 0x000000,
+ /* 84 */ 0x000000, 0x8fdfdf, 0x8fdfe0, 0x8fdfe1,
+ /* 88 */ 0x8fdfe2, 0x000000, 0x8fdfe3, 0x00eced,
+ /* 8c */ 0x00eceb, 0x000000, 0x8fdfe4, 0x00ece8,
+ /* 90 */ 0x000000, 0x8fdfe5, 0x000000, 0x000000,
+ /* 94 */ 0x8fdfe6, 0x8fdfe7, 0x00ecea, 0x8fdfe8,
+ /* 98 */ 0x000000, 0x8fdfe9, 0x00ece9, 0x00ecec,
+ /* 9c */ 0x000000, 0x00b5f7, 0x000000, 0x00ecf0,
+ /* a0 */ 0x000000, 0x00c0d7, 0x000000, 0x00ecf1,
+ /* a4 */ 0x8fdfea, 0x8fdfeb, 0x000000, 0x8fdfec,
+ /* a8 */ 0x00b8d9, 0x000000, 0x00ecee, 0x00ecef,
+ /* ac */ 0x8fdfed, 0x000000, 0x000000, 0x00cfa9,
+ /* b0 */ 0x8fdfee, 0x8fdff0, 0x8fdff1, 0x00c4b7,
+ /* b4 */ 0x8fdff2, 0x00c1a9, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00ecf2, 0x8fdff3, 0x000000, 0x00ecf5,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x049a3 ***/
+
+ /* 80 */ 0x000000, 0x8fdff4, 0x000000, 0x000000,
+ /* 84 */ 0x8fdff5, 0x8fdff6, 0x8fdff7, 0x000000,
+ /* 88 */ 0x00ecf3, 0x00ecf4, 0x00cdd9, 0x8fdff8,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00c6a7,
+ /* 90 */ 0x00ecf8, 0x8fdff9, 0x000000, 0x000000,
+ /* 94 */ 0x8fdffa, 0x000000, 0x8fdffb, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x00ecf6, 0x00ecf7, 0x00ecf9,
+ /* a0 */ 0x8fdffc, 0x8fdffd, 0x8fdffe, 0x8fe0a1,
+ /* a4 */ 0x000000, 0x000000, 0x8fe0a2, 0x8fe0a3,
+ /* a8 */ 0x000000, 0x000000, 0x00eda9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00ecfc, 0x8fe0a4, 0x000000, 0x8fe0a5,
+ /* b4 */ 0x00ecfd, 0x00ecfb, 0x8fe0a6, 0x8fe0a7,
+ /* b8 */ 0x8fe0a8, 0x8fe0a9, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fe0aa, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x049e3 ***/
+
+ /* 80 */ 0x8fe0ab, 0x8fe0ac, 0x00ecfa, 0x000000,
+ /* 84 */ 0x00c4fd, 0x000000, 0x000000, 0x00eda1,
+ /* 88 */ 0x00eda5, 0x00eda2, 0x00ecfe, 0x8fe0ad,
+ /* 8c */ 0x00eda3, 0x8fe0ae, 0x8fe0af, 0x8fe0b0,
+ /* 90 */ 0x00eda4, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x8fe0b1, 0x00edab, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00eda6, 0x000000, 0x8fe0b2,
+ /* 9c */ 0x8fe0b3, 0x8fe0b4, 0x8fe0b5, 0x00c0d8,
+ /* a0 */ 0x00eda8, 0x8fe0b6, 0x8fe0b7, 0x00edaa,
+ /* a4 */ 0x00eda7, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8fe0b8, 0x000000, 0x000000,
+ /* ac */ 0x8fe0b9, 0x8fe0ba, 0x000000, 0x8fe0bb,
+ /* b0 */ 0x8fe0bc, 0x8fe0bd, 0x00edad, 0x000000,
+ /* b4 */ 0x00bdb3, 0x000000, 0x00edac, 0x000000,
+ /* b8 */ 0x000000, 0x8fe0be, 0x8fe0bf, 0x8fe0c0,
+ /* bc */ 0x00edae, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04a22 ***/
+
+ /* 80 */ 0x000000, 0x00edaf, 0x8fe0c1, 0x8fe0c2,
+ /* 84 */ 0x00edb2, 0x00edb1, 0x000000, 0x00edb0,
+ /* 88 */ 0x000000, 0x8fe0c3, 0x00edb4, 0x00edb3,
+ /* 8c */ 0x000000, 0x00ccf6, 0x000000, 0x000000,
+ /* 90 */ 0x8fe0c4, 0x00edb6, 0x8fe0c5, 0x00edb5,
+ /* 94 */ 0x00edb7, 0x8fe0c6, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00edb8, 0x8fe0c7, 0x8fe0c8,
+ /* 9c */ 0x000000, 0x8fe0c9, 0x8fe0ca, 0x000000,
+ /* a0 */ 0x000000, 0x00edba, 0x8fe0cb, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fe0cc,
+ /* a8 */ 0x000000, 0x8fe0cd, 0x00edb9, 0x00bfc8,
+ /* ac */ 0x00edbb, 0x8fe0ce, 0x8fe0cf, 0x00b6ed,
+ /* b0 */ 0x00edbc, 0x00edbe, 0x000000, 0x8fe0d0,
+ /* b4 */ 0x000000, 0x8fe0d1, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fe0d2, 0x8fe0d3,
+ /* bc */ 0x000000, 0x000000, 0x00edbf, 0x000000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04a62 ***/
+
+ /* 80 */ 0x8fe0d4, 0x8fe0d5, 0x000000, 0x8fe0d6,
+ /* 84 */ 0x8fe0d7, 0x00edc0, 0x00edbd, 0x8fe0d8,
+ /* 88 */ 0x00edc1, 0x000000, 0x00bcd6, 0x00edc2,
+ /* 8c */ 0x00b5b0, 0x00b7b3, 0x000000, 0x8fe0d9,
+ /* 90 */ 0x000000, 0x8fe0da, 0x00b8ae, 0x000000,
+ /* 94 */ 0x8fe0db, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00edc3,
+ /* 9c */ 0x8fe0dc, 0x000000, 0x000000, 0x00c6f0,
+ /* a0 */ 0x000000, 0x000000, 0x00c5be, 0x00edc4,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fe0dd, 0x000000, 0x000000, 0x00edc7,
+ /* ac */ 0x000000, 0x8fe0e4, 0x8fe0de, 0x000000,
+ /* b0 */ 0x8fe0df, 0x8fe0e0, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fe0e1,
+ /* b8 */ 0x00bcb4, 0x8fe0e2, 0x8fe0e3, 0x00edc6,
+ /* bc */ 0x00edc5, 0x00b7da, 0x00edc8, 0x000000,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x04aa2 ***/
+
+ /* 80 */ 0x8fe0e5, 0x000000, 0x8fe0e6, 0x00b3d3,
+ /* 84 */ 0x000000, 0x00edca, 0x000000, 0x8fe0e7,
+ /* 88 */ 0x8fe0e8, 0x00badc, 0x00edc9, 0x000000,
+ /* 8c */ 0x00edd2, 0x000000, 0x000000, 0x8fe0e9,
+ /* 90 */ 0x8fe0ea, 0x000000, 0x00edcc, 0x00edce,
+ /* 94 */ 0x00cae5, 0x00edcb, 0x8fe0eb, 0x8fe0ec,
+ /* 98 */ 0x8fe0ed, 0x00edcd, 0x000000, 0x00edd1,
+ /* 9c */ 0x00edcf, 0x00b5b1, 0x8fe0ee, 0x00edd0,
+ /* a0 */ 0x8fe0ef, 0x8fe0f0, 0x000000, 0x8fe0f1,
+ /* a4 */ 0x000000, 0x8fe0f2, 0x00edd3, 0x8fe0f3,
+ /* a8 */ 0x8fe0f4, 0x00c7da, 0x00ced8, 0x000000,
+ /* ac */ 0x8fe0f5, 0x8fe0f6, 0x8fe0f7, 0x00bdb4,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x00edd4,
+ /* b4 */ 0x8fe0f8, 0x8fe0f9, 0x8fe0fa, 0x8fe0fb,
+ /* b8 */ 0x00cda2, 0x00edd6, 0x8fe0fc, 0x00edd5,
+ /* bc */ 0x000000, 0x000000, 0x00edd9, 0x00cdc1,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04ae2 ***/
+
+ /* 80 */ 0x8fe0fd, 0x8fe0fe, 0x00edd8, 0x8fe1a1,
+ /* 84 */ 0x00b3ed, 0x00edd7, 0x00eddc, 0x8fe1a2,
+ /* 88 */ 0x000000, 0x00eddb, 0x000000, 0x000000,
+ /* 8c */ 0x00edda, 0x00c5b2, 0x00eddd, 0x8fe1a3,
+ /* 90 */ 0x000000, 0x8fe1a4, 0x8fe1a5, 0x8fe1a6,
+ /* 94 */ 0x8fe1a7, 0x8fe1a8, 0x000000, 0x00edde,
+ /* 98 */ 0x8fe1a9, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00eddf, 0x8fe1aa, 0x8fe1ab, 0x00b9ec,
+ /* a0 */ 0x000000, 0x00b7a5, 0x00ede0, 0x00ede1,
+ /* a4 */ 0x00ede2, 0x8fe1ac,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04b08 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00bfc9,
+ /* 9c */ 0x00ede3, 0x8fe1ad, 0x00bcad, 0x00ede4,
+ /* a0 */ 0x8fe1ae, 0x8fe1af, 0x000000, 0x00ede5,
+ /* a4 */ 0x8fe1b0, 0x8fe1b1, 0x8fe1b2, 0x00d2a1,
+ /* a8 */ 0x00d1fe, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00ede6, 0x00e5f0, 0x00ede7,
+ /* b0 */ 0x00c3a4, 0x00bfab, 0x00c7c0, 0x000000,
+ /* b4 */ 0x000000, 0x8fe1b3, 0x8fe1b4, 0x00ede8,
+ /* b8 */ 0x8fe1b5, 0x000000, 0x00cad5, 0x00c4d4,
+ /* bc */ 0x00b9fe, 0x000000, 0x8fe1b6, 0x00c3a9,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04b48 ***/
+
+ /* 80 */ 0x8fe1b7, 0x8fe1b8, 0x00b1aa, 0x000000,
+ /* 84 */ 0x00cbf8, 0x00bfd7, 0x8fe1b9, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x8fe1ba, 0x8fe1bb,
+ /* 8c */ 0x000000, 0x8fe1bc, 0x00b7de, 0x000000,
+ /* 90 */ 0x8fe1bd, 0x00b6e1, 0x8fe1be, 0x8fe1bf,
+ /* 94 */ 0x00cad6, 0x8fe1c0, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x00ede9, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fe1c1, 0x000000, 0x00edeb, 0x8fe1c2,
+ /* a4 */ 0x8fe1c3, 0x00edea, 0x00b2e0, 0x000000,
+ /* a8 */ 0x8fe1c4, 0x00c6f6, 0x00edec, 0x00c7f7,
+ /* ac */ 0x000000, 0x00c5b3, 0x8fe1c5, 0x00eded,
+ /* b0 */ 0x00bdd2, 0x8fe1c6, 0x000000, 0x000000,
+ /* b4 */ 0x00edef, 0x8fe1c7, 0x8fe1c8, 0x00ccc2,
+ /* b8 */ 0x00edfe, 0x00edf1, 0x00edf2, 0x8fe1c9,
+ /* bc */ 0x000000, 0x00c4c9, 0x8fe1ca, 0x000000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x04b88 ***/
+
+ /* 80 */ 0x00c2e0, 0x00c1f7, 0x8fe1cb, 0x00c6a8,
+ /* 84 */ 0x8fe1cc, 0x00edf0, 0x00b5d5, 0x000000,
+ /* 88 */ 0x8fe1cd, 0x000000, 0x000000, 0x00edf9,
+ /* 8c */ 0x8fe1ce, 0x00edf6, 0x00eea5, 0x00c6a9,
+ /* 90 */ 0x00c3e0, 0x00edf3, 0x000000, 0x00c4fe,
+ /* 94 */ 0x00c5d3, 0x00edf4, 0x00edf8, 0x00bfe0,
+ /* 98 */ 0x8fe1cf, 0x00c7e7, 0x00c4cc, 0x8fe1d0,
+ /* 9c */ 0x000000, 0x00c0c2, 0x00edf7, 0x00c2ae,
+ /* a0 */ 0x00c2a4, 0x00edf5, 0x00b0a9, 0x00cfa2,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00edfa,
+ /* a8 */ 0x8fe1d1, 0x8fe1d2, 0x8fe1d4, 0x000000,
+ /* ac */ 0x8fe1d5, 0x8fe1d6, 0x00c2e1, 0x8fe1d3,
+ /* b0 */ 0x000000, 0x00bdb5, 0x00bfca, 0x8fe1d7,
+ /* b4 */ 0x8fe1d8, 0x00edfc, 0x00edfb, 0x8fe1d9,
+ /* b8 */ 0x00b0ef, 0x00edfd, 0x000000, 0x000000,
+ /* bc */ 0x00c9af, 0x000000, 0x00eea7, 0x8fe1da,
+
+ /*** Three byte table, leaf: e981xx - offset 0x04bc8 ***/
+
+ /* 80 */ 0x000000, 0x00c6db, 0x00bfeb, 0x8fe1db,
+ /* 84 */ 0x8fe1dc, 0x00c3d9, 0x000000, 0x00b6f8,
+ /* 88 */ 0x000000, 0x00eea6, 0x00cdb7, 0x00b1bf,
+ /* 8c */ 0x8fe1dd, 0x00cad7, 0x00b2e1, 0x00eea1,
+ /* 90 */ 0x00eea2, 0x00eea3, 0x00eea4, 0x00c6bb,
+ /* 94 */ 0x00c3a3, 0x00b0e3, 0x00eea8, 0x000000,
+ /* 98 */ 0x00eea9, 0x00f4a3, 0x000000, 0x8fe1de,
+ /* 9c */ 0x00c2bd, 0x8fe1df, 0x00eeaa, 0x000000,
+ /* a0 */ 0x00b1f3, 0x00c1cc, 0x8fe1e0, 0x00b8af,
+ /* a4 */ 0x000000, 0x00cdda, 0x8fe1e1, 0x8fe1e2,
+ /* a8 */ 0x00eeab, 0x00c5ac, 0x000000, 0x000000,
+ /* ac */ 0x8fe1e3, 0x00c1f8, 0x00bcd7, 0x00eeac,
+ /* b0 */ 0x8fe1e4, 0x000000, 0x00eeaf, 0x000000,
+ /* b4 */ 0x8fe1e5, 0x00bde5, 0x00eead, 0x00c1ab,
+ /* b8 */ 0x00c1aa, 0x8fe1e6, 0x00b0e4, 0x000000,
+ /* bc */ 0x00cecb, 0x00eeb1, 0x000000, 0x00c8f2,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04c08 ***/
+
+ /* 80 */ 0x00eeb3, 0x00eeb2, 0x00eeb0, 0x00e3e4,
+ /* 84 */ 0x00b4d4, 0x8fe1e7, 0x000000, 0x00edee,
+ /* 88 */ 0x8fe1e8, 0x00eeb5, 0x00eeb4, 0x8fe1e9,
+ /* 8c */ 0x8fe1ea, 0x000000, 0x8fe1eb, 0x00eeb6,
+ /* 90 */ 0x8fe1ec, 0x00cdb8, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fe1ed, 0x000000, 0x8fe1ee,
+ /* 98 */ 0x8fe1ef, 0x8fe1f0, 0x000000, 0x8fe1f1,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x8fe1f2, 0x8fe1f3, 0x8fe1f4, 0x00c6e1,
+ /* a4 */ 0x000000, 0x8fe1f5, 0x00cbae, 0x000000,
+ /* a8 */ 0x00eeb7, 0x000000, 0x00bcd9, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x00eeb8,
+ /* b0 */ 0x8fe1f6, 0x00eeb9, 0x8fe1f7, 0x8fe1f8,
+ /* b4 */ 0x8fe1f9, 0x00eeba, 0x8fe1fa, 0x000000,
+ /* b8 */ 0x00c5a1, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x8fe1fb, 0x8fe1fd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x04c47 ***/
+
+ /* 80 */ 0x000000, 0x00b0ea, 0x000000, 0x8fe1fe,
+ /* 84 */ 0x8fe2a1, 0x8fe2a2, 0x000000, 0x8fe2a3,
+ /* 88 */ 0x8fe2a4, 0x000000, 0x00b9d9, 0x000000,
+ /* 8c */ 0x8fe1fc, 0x000000, 0x00cfba, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x8fe2ad, 0x000000,
+ /* 94 */ 0x000000, 0x8fe2a5, 0x000000, 0x8fe2a6,
+ /* 98 */ 0x8fe2a7, 0x8fe2a8, 0x000000, 0x00eebe,
+ /* 9c */ 0x8fe2a9, 0x8fe2aa, 0x8ff4ec, 0x8fe2ab,
+ /* a0 */ 0x000000, 0x00b7b4, 0x00eebb, 0x000000,
+ /* a4 */ 0x00eebc, 0x8fe2ac, 0x000000, 0x000000,
+ /* a8 */ 0x00c9f4, 0x000000, 0x000000, 0x8fe2af,
+ /* ac */ 0x000000, 0x00b3d4, 0x000000, 0x8fe2b0,
+ /* b0 */ 0x8fe2b1, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fe2b2, 0x00cdb9, 0x8fe2ae, 0x00b6bf,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x00c5d4, 0x8fe2b3, 0x8fe2b4,
+
+ /*** Three byte table, leaf: e984xx - offset 0x04c87 ***/
+
+ /* 80 */ 0x8fe2b5, 0x000000, 0x00eebf, 0x000000,
+ /* 84 */ 0x8fe2b6, 0x8fe2b7, 0x8fe2b8, 0x000000,
+ /* 88 */ 0x8fe2b9, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fe2ba, 0x000000, 0x000000,
+ /* 90 */ 0x8fe2bb, 0x000000, 0x00eec0, 0x000000,
+ /* 94 */ 0x8fe2bc, 0x8ff4ee, 0x8fe2bd, 0x8fe2be,
+ /* 98 */ 0x8fe2bf, 0x00eec1, 0x8fe2c0, 0x000000,
+ /* 9c */ 0x8fe2c1, 0x000000, 0x8fe2c2, 0x000000,
+ /* a0 */ 0x8fe2c3, 0x000000, 0x8fe2c5, 0x8fe2c6,
+ /* a4 */ 0x000000, 0x8fe2c4, 0x000000, 0x8fe2c7,
+ /* a8 */ 0x000000, 0x8fe2c8, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00c5a2, 0x8fe2c9, 0x8fe2ca,
+ /* b0 */ 0x00eec3, 0x8fe2cb, 0x00eec2, 0x000000,
+ /* b4 */ 0x8fe2cc, 0x000000, 0x8fe2cd, 0x8fe2ce,
+ /* b8 */ 0x000000, 0x8fe2cf, 0x8fe2d0, 0x000000,
+ /* bc */ 0x8fe2d1, 0x8fe2d2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x04cc5 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8fe2d3,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8fe2d4,
+ /* 88 */ 0x8fe2d5, 0x00c6d3, 0x00eec4, 0x00bdb6,
+ /* 8c */ 0x00bce0, 0x00c7db, 0x00c3f1, 0x8fe2d6,
+ /* 90 */ 0x000000, 0x000000, 0x00bcf2, 0x8fe2d7,
+ /* 94 */ 0x00bfec, 0x000000, 0x00eec5, 0x8fe2d8,
+ /* 98 */ 0x00eec6, 0x8fe2d9, 0x8fe2da, 0x8fe2db,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fe2dc, 0x00bfdd, 0x00eec7,
+ /* a4 */ 0x8fe2dd, 0x00eec8, 0x000000, 0x8fe2de,
+ /* a8 */ 0x000000, 0x00eec9, 0x00cdef, 0x000000,
+ /* ac */ 0x00bdb7, 0x8fe2df, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00eecb, 0x00eeca,
+ /* b4 */ 0x8fe2e0, 0x00b9da, 0x000000, 0x00b9f3,
+ /* b8 */ 0x00bbc0, 0x8fe2e1, 0x8fe2e2, 0x8fe2e3,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x04d04 ***/
+
+ /* 80 */ 0x000000, 0x8fe2e4, 0x00eece, 0x8fe2e5,
+ /* 84 */ 0x000000, 0x8fe2e6, 0x8fe2e7, 0x00bde6,
+ /* 88 */ 0x000000, 0x00eecd, 0x8fe2e8, 0x00eecc,
+ /* 8c */ 0x000000, 0x00c2e9, 0x8fe2e9, 0x000000,
+ /* 90 */ 0x00b8ef, 0x8fe2ea, 0x00c0c3, 0x8fe2eb,
+ /* 94 */ 0x8fe2ec, 0x8fe2ed, 0x000000, 0x00c8b0,
+ /* 98 */ 0x8fe2ee, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00bdb9, 0x000000, 0x8fe2ef, 0x000000,
+ /* a0 */ 0x000000, 0x8fe2f0, 0x00eecf, 0x000000,
+ /* a4 */ 0x00bedf, 0x000000, 0x8fe2f1, 0x000000,
+ /* a8 */ 0x8fe2f2, 0x000000, 0x00eed2, 0x00eed0,
+ /* ac */ 0x8fe2f3, 0x8fe2f4, 0x8fe2f5, 0x00eed1,
+ /* b0 */ 0x8fe2f6, 0x8fe2f7, 0x8fe2f8, 0x8fe2f9,
+ /* b4 */ 0x00eed4, 0x00eed3, 0x8fe2fa, 0x000000,
+ /* b8 */ 0x00befa, 0x000000, 0x00eed5, 0x8fe2fb,
+ /* bc */ 0x8fe2fc, 0x8fe2fd, 0x000000, 0x8fe2fe,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04d44 ***/
+
+ /* 80 */ 0x00eed6, 0x00eed7, 0x8fe3a1, 0x8fe3a2,
+ /* 84 */ 0x000000, 0x8fe3a3, 0x00c8d0, 0x00bad3,
+ /* 88 */ 0x00bce1, 0x00eed8, 0x000000, 0x00eed9,
+ /* 8c */ 0x00cea4, 0x00bdc5, 0x00ccee, 0x00cecc,
+ /* 90 */ 0x00eeda, 0x00b6e2, 0x000000, 0x8fe3a4,
+ /* 94 */ 0x8fe3a5, 0x000000, 0x00eedb, 0x8fe3a6,
+ /* 98 */ 0x00c5a3, 0x8fe3a7, 0x8fe3a8, 0x00eede,
+ /* 9c */ 0x00b3f8, 0x00bfcb, 0x8fe3a9, 0x00eedc,
+ /* a0 */ 0x000000, 0x00eedd, 0x000000, 0x00c4e0,
+ /* a4 */ 0x8fe3aa, 0x8fe3ab, 0x00cbd5, 0x00b6fc,
+ /* a8 */ 0x000000, 0x8fe3ac, 0x8fe3ad, 0x000000,
+ /* ac */ 0x8fe3ae, 0x8fe3af, 0x8fe3b0, 0x8fe3b1,
+ /* b0 */ 0x8fe3b2, 0x8fe3b3, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00eee0, 0x00eee1, 0x8fe3b4,
+ /* b8 */ 0x000000, 0x8fe3b5, 0x000000, 0x8fe3b6,
+ /* bc */ 0x00eedf, 0x8fe3b7, 0x000000, 0x00eee3,
+
+ /*** Three byte table, leaf: e988xx - offset 0x04d84 ***/
+
+ /* 80 */ 0x8fe3b8, 0x8fe3b9, 0x000000, 0x000000,
+ /* 84 */ 0x8fe3ba, 0x8fe3bb, 0x8fe3bc, 0x8fe3bd,
+ /* 88 */ 0x000000, 0x8fe3be, 0x8fe3bf, 0x000000,
+ /* 8c */ 0x8fe3c0, 0x00c6df, 0x00b3c3, 0x000000,
+ /* 90 */ 0x8fe3c1, 0x00eee7, 0x8fe3c2, 0x8fe3c3,
+ /* 94 */ 0x00eee4, 0x00eee6, 0x8fe3c4, 0x000000,
+ /* 98 */ 0x8fe3c5, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8fe3c6, 0x8fe3c7, 0x00eee2, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x8fe3c8,
+ /* a4 */ 0x8fe3c9, 0x8fe3ca, 0x8fe3cb, 0x000000,
+ /* a8 */ 0x8fe3cc, 0x00efcf, 0x000000, 0x000000,
+ /* ac */ 0x00eee5, 0x000000, 0x8fe3cd, 0x8fe3ce,
+ /* b0 */ 0x8fe3cf, 0x000000, 0x000000, 0x8fe3d0,
+ /* b4 */ 0x00ceeb, 0x8fe3d1, 0x8fe3d2, 0x00b8da,
+ /* b8 */ 0x8fe3d3, 0x8fe3d4, 0x8fe3d5, 0x000000,
+ /* bc */ 0x8fe3d6, 0x000000, 0x8fe3d7, 0x00eeef,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04dc4 ***/
+
+ /* 80 */ 0x8fe3d8, 0x000000, 0x8fe3d9, 0x8fe3da,
+ /* 84 */ 0x00c5b4, 0x00eeea, 0x8fe3db, 0x8fe3dc,
+ /* 88 */ 0x00eeed, 0x00eeeb, 0x8fe3dd, 0x00eef0,
+ /* 8c */ 0x000000, 0x8fe3de, 0x8fe3df, 0x8fe3e0,
+ /* 90 */ 0x00eef1, 0x8fe3e1, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x00eee9,
+ /* 98 */ 0x8fe3e2, 0x8fe3e3, 0x00eef6, 0x00b1f4,
+ /* 9c */ 0x8fe3e4, 0x8fe3e5, 0x00eee8, 0x000000,
+ /* a0 */ 0x8fe3e6, 0x8fe3e7, 0x00c8ad, 0x000000,
+ /* a4 */ 0x00eeec, 0x8fe3e8, 0x00bee0, 0x8fe3e9,
+ /* a8 */ 0x8fe3ea, 0x8fe3eb, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fe3ec, 0x8fe3ed,
+ /* b0 */ 0x8fe3ee, 0x00b9db, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x8fe3ef, 0x8fe3f0, 0x8fe3f1,
+ /* b8 */ 0x8fe3f2, 0x8fe3f3, 0x000000, 0x8fe3f4,
+ /* bc */ 0x8fe3f5, 0x8fe3f6, 0x00cbc8, 0x8fe3f7,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04e04 ***/
+
+ /* 80 */ 0x00b6e4, 0x000000, 0x000000, 0x00bdc6,
+ /* 84 */ 0x000000, 0x00c6bc, 0x000000, 0x000000,
+ /* 88 */ 0x8fe3f8, 0x8fe3f9, 0x8fe3fa, 0x000000,
+ /* 8c */ 0x000000, 0x8fe3fb, 0x8fe3fc, 0x000000,
+ /* 90 */ 0x000000, 0x00c1ad, 0x8fe3fd, 0x00eef4,
+ /* 94 */ 0x000000, 0x00eeee, 0x00eef3, 0x8fe3fe,
+ /* 98 */ 0x00ccc3, 0x8fe4a1, 0x00c4b8, 0x00eef5,
+ /* 9c */ 0x00eef2, 0x000000, 0x000000, 0x8fe4a2,
+ /* a0 */ 0x8fe4a3, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fe4a4, 0x8fe4a5, 0x000000, 0x8fe4a6,
+ /* a8 */ 0x8fe4a7, 0x000000, 0x000000, 0x8fe4a8,
+ /* ac */ 0x000000, 0x00c1ac, 0x000000, 0x8fe4a9,
+ /* b0 */ 0x000000, 0x000000, 0x8fe4aa, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8fe4ab, 0x00eef9,
+ /* b8 */ 0x8fe4ac, 0x00eef8, 0x8fe4ad, 0x8fe4ae,
+ /* bc */ 0x8fe4af, 0x8fe4b0, 0x000000, 0x8fe4b1,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04e44 ***/
+
+ /* 80 */ 0x8fe4b2, 0x8fe4b3, 0x8fe4b4, 0x8fe4b5,
+ /* 84 */ 0x000000, 0x8fe4b6, 0x8fe4b7, 0x8fe4b8,
+ /* 88 */ 0x8fe4b9, 0x000000, 0x000000, 0x8fe4ba,
+ /* 8c */ 0x8fe4bb, 0x8fe4bc, 0x8fe4bd, 0x00eef7,
+ /* 90 */ 0x8fe4be, 0x000000, 0x00cbaf, 0x8fe4bf,
+ /* 94 */ 0x000000, 0x8fe4c0, 0x000000, 0x8fe4c1,
+ /* 98 */ 0x8fe4c2, 0x8fe4c3, 0x000000, 0x000000,
+ /* 9c */ 0x8fe4c4, 0x8fe4c5, 0x000000, 0x8fe4c6,
+ /* a0 */ 0x8fe4c7, 0x8fe4c8, 0x000000, 0x8fe4c9,
+ /* a4 */ 0x00bdfb, 0x8fe4ca, 0x000000, 0x8fe4cb,
+ /* a8 */ 0x8fe4cc, 0x00eefa, 0x00cadf, 0x000000,
+ /* ac */ 0x8fe4cd, 0x00b1d4, 0x8fe4ce, 0x000000,
+ /* b0 */ 0x8fe4cf, 0x000000, 0x00c9c6, 0x00c3f2,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00b5f8, 0x8fe4d0, 0x00eefc, 0x8fe4d1,
+ /* bc */ 0x00b9dd, 0x000000, 0x000000, 0x8fe4d2,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04e84 ***/
+
+ /* 80 */ 0x8fe4d3, 0x000000, 0x8fe4d4, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00bbac, 0x000000,
+ /* 88 */ 0x8fe4d5, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fe4d6, 0x000000, 0x00eefb,
+ /* 90 */ 0x00bfed, 0x8fe4d7, 0x000000, 0x000000,
+ /* 94 */ 0x8fe4d8, 0x8fe4d9, 0x000000, 0x000000,
+ /* 98 */ 0x00bfee, 0x00efa1, 0x00efa3, 0x000000,
+ /* 9c */ 0x8fe4da, 0x8fe4db, 0x8fe4dc, 0x8fe4dd,
+ /* a0 */ 0x00befb, 0x8fe4de, 0x00efa2, 0x00efa4,
+ /* a4 */ 0x8fe4df, 0x8fe4e0, 0x00b6d3, 0x8fe4e1,
+ /* a8 */ 0x00c9c5, 0x8fe4e2, 0x8fe4e3, 0x00bce2,
+ /* ac */ 0x00cfa3, 0x000000, 0x00eefe, 0x00baf8,
+ /* b0 */ 0x000000, 0x000000, 0x00cfbf, 0x8fe4e4,
+ /* b4 */ 0x8fe4e5, 0x00efa6, 0x8fe4e6, 0x8fe4e7,
+ /* b8 */ 0x000000, 0x000000, 0x00efa5, 0x00efa7,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04ec0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00eefd, 0x000000, 0x000000, 0x8fe4e8,
+ /* 88 */ 0x8fe4e9, 0x8fe4ea, 0x000000, 0x00c6e9,
+ /* 8c */ 0x000000, 0x00c5d5, 0x000000, 0x000000,
+ /* 90 */ 0x8fe4eb, 0x8fe4ec, 0x8fe4ed, 0x000000,
+ /* 94 */ 0x00c4d7, 0x8fe4ee, 0x00efac, 0x8fe4ef,
+ /* 98 */ 0x8fe4f0, 0x000000, 0x8fe4f1, 0x00c3c3,
+ /* 9c */ 0x00efa8, 0x000000, 0x8fe4f2, 0x000000,
+ /* a0 */ 0x00efa9, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fe4f3, 0x8fe4f4, 0x000000, 0x8fe4f5,
+ /* a8 */ 0x000000, 0x8fe4f6, 0x8fe4f7, 0x000000,
+ /* ac */ 0x00b7ad, 0x8fe4f8, 0x00efab, 0x8fe4f9,
+ /* b0 */ 0x8fe4fa, 0x8fe4fb, 0x000000, 0x8fe4fc,
+ /* b4 */ 0x8fe4fd, 0x00b8b0, 0x8fe4fe, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8fe5a1, 0x000000,
+ /* bc */ 0x00efaa, 0x8fe5a2, 0x00bee1, 0x8fe5a3,
+
+ /*** Three byte table, leaf: e98exx - offset 0x04f00 ***/
+
+ /* 80 */ 0x8fe5a4, 0x8fe5a5, 0x8fe5a6, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x8fe5a7, 0x000000, 0x8fe5a8, 0x8fe5a9,
+ /* 8c */ 0x00b3f9, 0x8fe5aa, 0x000000, 0x8fe5ab,
+ /* 90 */ 0x000000, 0x000000, 0x8fe5ac, 0x000000,
+ /* 94 */ 0x00efb0, 0x8fe5ad, 0x00babf, 0x00c1f9,
+ /* 98 */ 0x8fe5ae, 0x000000, 0x00c4ca, 0x8fe5af,
+ /* 9c */ 0x000000, 0x000000, 0x8fe5b0, 0x000000,
+ /* a0 */ 0x000000, 0x8fe5b1, 0x000000, 0x8fe5b2,
+ /* a4 */ 0x8fe5b3, 0x000000, 0x8fe5b4, 0x00b3bb,
+ /* a8 */ 0x8fe5b5, 0x8fe5bb, 0x000000, 0x8fe5b6,
+ /* ac */ 0x00efae, 0x00efaf, 0x00c4c3, 0x000000,
+ /* b0 */ 0x00efad, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x8fe5b7, 0x8fe5b8, 0x8fe5b9, 0x000000,
+ /* b8 */ 0x000000, 0x00efb1, 0x8fe5ba, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04f3f ***/
+
+ /* 80 */ 0x000000, 0x8fe5bc, 0x000000, 0x00efb7,
+ /* 84 */ 0x8fe5bd, 0x8fe5be, 0x8fe5bf, 0x8fe5c0,
+ /* 88 */ 0x00efba, 0x8fe5c1, 0x8fe5c2, 0x8fe5c3,
+ /* 8c */ 0x8fe5c4, 0x8fe5c5, 0x000000, 0x000000,
+ /* 90 */ 0x00efb9, 0x00c5ad, 0x000000, 0x8fe5c6,
+ /* 94 */ 0x000000, 0x000000, 0x00efb2, 0x00efb3,
+ /* 98 */ 0x00efb6, 0x8fe5c7, 0x000000, 0x000000,
+ /* 9c */ 0x8fe5c8, 0x00efb8, 0x8fe5c9, 0x8fe5ca,
+ /* a0 */ 0x000000, 0x00b6c0, 0x8fe5cb, 0x000000,
+ /* a4 */ 0x00efbb, 0x00efb5, 0x8fe5cc, 0x8fe5cd,
+ /* a8 */ 0x00efb4, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fe5cf,
+ /* b8 */ 0x8fe5d0, 0x8fe5ce, 0x8fe5d1, 0x8fe5d2,
+ /* bc */ 0x000000, 0x8fe5d3, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04f7e ***/
+
+ /* 80 */ 0x000000, 0x8fe5d4, 0x8fe5d5, 0x00efbf,
+ /* 84 */ 0x8fe5d6, 0x000000, 0x000000, 0x00efc0,
+ /* 88 */ 0x8fe5d7, 0x8fe5d8, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x8fe5d9, 0x8fe5da, 0x8fe5db,
+ /* 90 */ 0x00efc1, 0x000000, 0x000000, 0x00efbe,
+ /* 94 */ 0x00efbd, 0x8fe5dc, 0x8fe5dd, 0x8fe5de,
+ /* 98 */ 0x00bee2, 0x00c6aa, 0x00efbc, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fe5df,
+ /* a0 */ 0x000000, 0x00efc5, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x00efc3,
+ /* ac */ 0x000000, 0x000000, 0x8fe5e0, 0x8fe5e1,
+ /* b0 */ 0x000000, 0x8fe5e2, 0x8fe5e3, 0x8fe5e4,
+ /* b4 */ 0x8fe5e5, 0x00efc4, 0x00efc2, 0x000000,
+ /* b8 */ 0x00c2f8, 0x000000, 0x00efc6, 0x8fe5e6,
+ /* bc */ 0x000000, 0x8fe5e8, 0x000000, 0x8fe5e7,
+
+ /*** Three byte table, leaf: e991xx - offset 0x04fbe ***/
+
+ /* 80 */ 0x000000, 0x00efc7, 0x000000, 0x8fe5e9,
+ /* 84 */ 0x00efc9, 0x8fe5ea, 0x000000, 0x000000,
+ /* 88 */ 0x8fe5eb, 0x000000, 0x8fe5ec, 0x000000,
+ /* 8c */ 0x8fe5ed, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x00b4d5, 0x00efc8, 0x00ccfa,
+ /* 94 */ 0x000000, 0x8fe5ee, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x8fe5ef, 0x00efd4, 0x00efca,
+ /* 9c */ 0x8fe5f0, 0x000000, 0x00efcd, 0x8fe5f1,
+ /* a0 */ 0x00efcb, 0x8fe5f2, 0x00efcc, 0x8fe5f3,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x8fe5f4, 0x000000, 0x00efce, 0x8fe5f5,
+ /* ac */ 0x000000, 0x8fe5f6, 0x8fe5f7, 0x8fe5f8,
+ /* b0 */ 0x00efd0, 0x8fe5f9, 0x8fe5fa, 0x000000,
+ /* b4 */ 0x000000, 0x00efd1, 0x000000, 0x00efd2,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00efd5, 0x00efd3, 0x00efd6, 0x00efd8,
+
+ /*** Three byte table, leaf: e992xx - offset 0x04ffe ***/
+
+ /* 80 */ 0x000000, 0x00efd7, 0x000000, 0x8fe5fc,
+ /* 84 */ 0x8fe5fb, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x05007 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x00c4b9,
+ /* b8 */ 0x8fe5fd, 0x8fe5fe, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x8fe6a1, 0x000000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x05047 ***/
+
+ /* 80 */ 0x00cce7, 0x000000, 0x00efd9, 0x00c1ae,
+ /* 84 */ 0x8fe6a2, 0x000000, 0x000000, 0x00efda,
+ /* 88 */ 0x8fe6a3, 0x00cac4, 0x00efdb, 0x00b3ab,
+ /* 8c */ 0x8fe6a4, 0x8fe6a5, 0x8fe6a6, 0x00b1bc,
+ /* 90 */ 0x000000, 0x00b4d7, 0x8ff4f1, 0x00b4d6,
+ /* 94 */ 0x00efdc, 0x000000, 0x00efdd, 0x000000,
+ /* 98 */ 0x00efde, 0x00efdf, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x8fe6a7, 0x8fe6a8, 0x8fe6a9,
+ /* a0 */ 0x00efe0, 0x8fe6aa, 0x00b4d8, 0x00b3d5,
+ /* a4 */ 0x00b9de, 0x00c8b6, 0x8fe6ab, 0x00efe2,
+ /* a8 */ 0x00efe1, 0x8fe6ac, 0x000000, 0x8fe6ad,
+ /* ac */ 0x8fe6ae, 0x00efe3, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x00b1dc, 0x000000,
+ /* b4 */ 0x8fe6af, 0x000000, 0x8fe6b0, 0x000000,
+ /* b8 */ 0x000000, 0x00efe6, 0x8fe6b1, 0x00efe5,
+ /* bc */ 0x00efe4, 0x8fe6b2, 0x00efe7, 0x8fe6b3,
+
+ /*** Three byte table, leaf: e997xx - offset 0x05087 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x00efea,
+ /* 84 */ 0x000000, 0x000000, 0x8fe6b4, 0x00b0c7,
+ /* 88 */ 0x8fe6b5, 0x8fe6b6, 0x00efe8, 0x8fe6b7,
+ /* 8c */ 0x00efec, 0x00efeb, 0x000000, 0x000000,
+ /* 90 */ 0x8fe6b8, 0x8fe6b9, 0x8fe6ba, 0x8fe6bb,
+ /* 94 */ 0x00efee, 0x00efed, 0x00efef, 0x000000,
+ /* 98 */ 0x00c6ae, 0x8fe6bc, 0x8fe6bd, 0x000000,
+ /* 9c */ 0x00eff0, 0x8fe6be, 0x8fe6bf, 0x8fe6c0,
+ /* a0 */ 0x8fe6c1, 0x00eff1, 0x00eff3, 0x000000,
+ /* a4 */ 0x8fe6c2, 0x00eff2, 0x8fe6c3,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x050ae ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00c9ec, 0x8fe6c4, 0x8fe6c5, 0x000000,
+ /* a0 */ 0x000000, 0x00eff4, 0x8fe6c6, 0x000000,
+ /* a4 */ 0x8fe6c7, 0x8fe6c8, 0x8fe6c9, 0x000000,
+ /* a8 */ 0x00eff5, 0x000000, 0x00bae5, 0x000000,
+ /* ac */ 0x8fe6ca, 0x000000, 0x00eff6, 0x00eff7,
+ /* b0 */ 0x000000, 0x8fe6cb, 0x00cbc9, 0x8fe6cc,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x8fe6cd,
+ /* b8 */ 0x8fe6ce, 0x8fe6cf, 0x8fe6d0, 0x00c1cb,
+ /* bc */ 0x8fe6d1, 0x8fe6d2, 0x000000, 0x00b0a4,
+
+ /*** Three byte table, leaf: e999xx - offset 0x050ee ***/
+
+ /* 80 */ 0x00c2cb, 0x8fe6d3, 0x00eff8, 0x000000,
+ /* 84 */ 0x00c9ed, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x00effb,
+ /* 8c */ 0x00eff9, 0x00b9df, 0x000000, 0x00effa,
+ /* 90 */ 0x00b8c2, 0x000000, 0x8fe6d4, 0x000000,
+ /* 94 */ 0x8fe6d5, 0x000000, 0x8fe6d6, 0x8fe6d7,
+ /* 98 */ 0x8fe6d8, 0x000000, 0x000000, 0x00cac5,
+ /* 9c */ 0x00effd, 0x00f0a1, 0x00effe, 0x00f0a2,
+ /* a0 */ 0x000000, 0x8fe6d9, 0x00b1a1, 0x00bfd8,
+ /* a4 */ 0x00bdfc, 0x00b4d9, 0x00f0a3, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x00c7e6, 0x000000,
+ /* ac */ 0x00f0a5, 0x000000, 0x8fe6da, 0x000000,
+ /* b0 */ 0x00b1a2, 0x000000, 0x00f0a4, 0x00c4c4,
+ /* b4 */ 0x8fe6db, 0x00cecd, 0x00c6ab, 0x00effc,
+ /* b8 */ 0x00cea6, 0x000000, 0x00b8b1, 0x8fe6dc,
+ /* bc */ 0x8fe6dd, 0x00cddb, 0x8fe6de, 0x8fe6df,
+
+ /*** Three byte table, leaf: e99axx - offset 0x0512e ***/
+
+ /* 80 */ 0x000000, 0x8fe6e0, 0x8fe6e1, 0x8fe6e2,
+ /* 84 */ 0x8fe6e3, 0x00b6f9, 0x00ceb4, 0x000000,
+ /* 88 */ 0x00b7a8, 0x8fe6e4, 0x00c2e2, 0x00e7a1,
+ /* 8c */ 0x000000, 0x00f0a6, 0x00b3ac, 0x00bfef,
+ /* 90 */ 0x000000, 0x8fe6e5, 0x000000, 0x000000,
+ /* 94 */ 0x00b3d6, 0x00f0a8, 0x8fe6e6, 0x00f0a9,
+ /* 98 */ 0x00f0a7, 0x00b7e4, 0x8fe6e7, 0x00badd,
+ /* 9c */ 0x00bee3, 0x8fe6e8, 0x000000, 0x8fe6e9,
+ /* a0 */ 0x00b1a3, 0x000000, 0x000000, 0x00ced9,
+ /* a4 */ 0x8fe6ea, 0x8fe6eb, 0x8fe6ec, 0x00f0ab,
+ /* a8 */ 0x00eeae, 0x8fe6ed, 0x00f0aa, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x8fe6ee, 0x8fe6ef,
+ /* b0 */ 0x00f0ae, 0x00f0ac, 0x00f0ad, 0x8fe6f0,
+ /* b4 */ 0x00f0af, 0x000000, 0x00f0b0, 0x00ceec,
+ /* b8 */ 0x00f0b1, 0x00f0b2, 0x8fe6f1, 0x00c0c9,
+ /* bc */ 0x00c8bb, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x0516e ***/
+
+ /* 80 */ 0x00bffd, 0x00b4e7, 0x000000, 0x000000,
+ /* 84 */ 0x00cdba, 0x00b2ed, 0x00bdb8, 0x00b8db,
+ /* 88 */ 0x000000, 0x00f0b5, 0x8fe6f2, 0x00f0b4,
+ /* 8c */ 0x00bbf3, 0x00f0b6, 0x00f0b3, 0x000000,
+ /* 90 */ 0x000000, 0x00bba8, 0x8fe6f3, 0x000000,
+ /* 94 */ 0x000000, 0x00f0ba, 0x00eaad, 0x000000,
+ /* 98 */ 0x8fe6f5, 0x00d2d6, 0x8fe6f6, 0x00bff7,
+ /* 9c */ 0x00f0b8, 0x8fe6f7, 0x8fe6f8, 0x8fe6f9,
+ /* a0 */ 0x000000, 0x000000, 0x00cea5, 0x00c6f1,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b1ab, 0x8fe6fa, 0x00c0e3, 0x00bcb6,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8fe6fb,
+ /* b0 */ 0x00cab7, 0x8fe6fc, 0x00b1c0, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x00ceed, 0x00cdeb,
+ /* b8 */ 0x000000, 0x00f0bb, 0x8fe6fd, 0x00c5c5,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x051ae ***/
+
+ /* 80 */ 0x00bcfb, 0x000000, 0x8fe6fe, 0x8fe7a1,
+ /* 84 */ 0x00f0bc, 0x8fe7a2, 0x00f0bd, 0x00bfcc,
+ /* 88 */ 0x00f0be, 0x8fe7a3, 0x00ceee, 0x000000,
+ /* 8c */ 0x000000, 0x00f0b9, 0x00f0c0, 0x00f0c2,
+ /* 90 */ 0x000000, 0x00f0c1, 0x000000, 0x00f0bf,
+ /* 94 */ 0x000000, 0x000000, 0x00f0c3, 0x000000,
+ /* 98 */ 0x000000, 0x00f0c4, 0x8fe7a4, 0x8fe7a5,
+ /* 9c */ 0x00c1fa, 0x8fe7a6, 0x00b2e2, 0x000000,
+ /* a0 */ 0x000000, 0x8fe7a7, 0x8fe7a8, 0x8fe7a9,
+ /* a4 */ 0x00f0c5, 0x000000, 0x000000, 0x00ccb8,
+ /* a8 */ 0x8fe7aa, 0x000000, 0x00f0c6, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f0c7, 0x8fe7ab, 0x00cfaa, 0x8fe7ac,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00dbb1, 0x00f0c8, 0x000000, 0x8ff4f4,
+ /* bc */ 0x000000, 0x00f0c9, 0x00f0ca,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x051ed ***/
+
+ /* 80 */ 0x000000, 0x8fe7ad, 0x00f0ce, 0x8fe7ae,
+ /* 84 */ 0x00f0cb, 0x000000, 0x00f0cc, 0x000000,
+ /* 88 */ 0x00f0cd, 0x00f0cf, 0x8fe7af, 0x000000,
+ /* 8c */ 0x000000, 0x8ff4f5, 0x8fe7b0, 0x8fe7b1,
+ /* 90 */ 0x000000, 0x8ff4f6, 0x00c0c4, 0x000000,
+ /* 94 */ 0x000000, 0x8fe7b2, 0x00ccf7, 0x8fe7b3,
+ /* 98 */ 0x8fe7b4, 0x00c0c5, 0x8fe7b5, 0x8fe7b6,
+ /* 9c */ 0x00f0d0, 0x000000, 0x00c8f3, 0x000000,
+ /* a0 */ 0x00f0d1, 0x00f3d3, 0x00cccc, 0x8fe7b7,
+ /* a4 */ 0x00f0d2, 0x000000, 0x00f0d3, 0x8fe7b8,
+ /* a8 */ 0x00f0d4, 0x00b3d7, 0x8fe7b9, 0x00f0d6,
+ /* ac */ 0x000000, 0x00bfd9, 0x8fe7ba, 0x000000,
+ /* b0 */ 0x000000, 0x00f0d7, 0x000000, 0x8fe7bb,
+ /* b4 */ 0x00b7a4, 0x000000, 0x8fe7bc, 0x8fe7bd,
+ /* b8 */ 0x8fe7be, 0x00f0d8, 0x00f0dc, 0x8fe7bf,
+ /* bc */ 0x00f0da, 0x8fe7c0, 0x000000, 0x8fe7c1,
+
+ /*** Three byte table, leaf: e99exx - offset 0x0522d ***/
+
+ /* 80 */ 0x8fe7c2, 0x00f0db, 0x000000, 0x000000,
+ /* 84 */ 0x00b3f3, 0x00f0d9, 0x00f0dd, 0x000000,
+ /* 88 */ 0x000000, 0x8fe7c3, 0x000000, 0x00f0de,
+ /* 8c */ 0x000000, 0x00b0c8, 0x000000, 0x00f0df,
+ /* 90 */ 0x00f0e0, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x8fe7c4, 0x8fe7c5, 0x8fe7c6,
+ /* 98 */ 0x00bee4, 0x8fe7c7, 0x8fe7c8, 0x000000,
+ /* 9c */ 0x00f0e1, 0x000000, 0x8fe7c9, 0x8fe7ca,
+ /* a0 */ 0x00b5c7, 0x000000, 0x8fe7cb, 0x00f0e4,
+ /* a4 */ 0x000000, 0x000000, 0x00f0e3, 0x000000,
+ /* a8 */ 0x00f0e2, 0x000000, 0x000000, 0x00ebf1,
+ /* ac */ 0x8fe7cc, 0x00cadc, 0x8fe7cd, 0x000000,
+ /* b0 */ 0x000000, 0x8fe7ce, 0x8fe7cf, 0x00f0e5,
+ /* b4 */ 0x00f0e6, 0x8fe7d0, 0x8fe7d1, 0x000000,
+ /* b8 */ 0x8fe7d2, 0x8fe7d3, 0x8fe7d4, 0x000000,
+ /* bc */ 0x8fe7d5, 0x000000, 0x8fe7d6, 0x8fe7d7,
+
+ /*** Three byte table, leaf: e99fxx - offset 0x0526d ***/
+
+ /* 80 */ 0x000000, 0x8fe7d8, 0x000000, 0x00f0e7,
+ /* 84 */ 0x8fe7d9, 0x8fe7da, 0x00f0e8, 0x8fe7db,
+ /* 88 */ 0x00f0e9, 0x8fe7dc, 0x8fe7dd, 0x00f0ea,
+ /* 8c */ 0x8fe7de, 0x8fe7df, 0x8fe7e0, 0x000000,
+ /* 90 */ 0x8fe7e1, 0x8fe7e2, 0x000000, 0x00b4da,
+ /* 94 */ 0x8fe7e3, 0x000000, 0x000000, 0x8fe7e4,
+ /* 98 */ 0x8fe7e5, 0x8fe7e6, 0x000000, 0x8fe7ea,
+ /* 9c */ 0x00f0eb, 0x8fe7e7, 0x8fe7e8, 0x000000,
+ /* a0 */ 0x8fe7e9, 0x8fe7eb, 0x000000, 0x000000,
+ /* a4 */ 0x8fe7ec, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x00f0ec, 0x00c7a3, 0x8fe7ed,
+ /* b0 */ 0x000000, 0x8fe7ee, 0x00f0ee, 0x00b2bb,
+ /* b4 */ 0x8fe7ef, 0x00f0f1, 0x00f0f0, 0x8fe7f0,
+ /* b8 */ 0x8fe7f1, 0x000000, 0x8fe7f2, 0x00b1a4,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x00b6c1,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x052ad ***/
+
+ /* 80 */ 0x000000, 0x00cac7, 0x00c4ba, 0x00baa2,
+ /* 84 */ 0x000000, 0x00b9e0, 0x00bde7, 0x8fe7f3,
+ /* 88 */ 0x00bfdc, 0x000000, 0x8fe7f4, 0x000000,
+ /* 8c */ 0x00f0f3, 0x8fe7f6, 0x8fe7f7, 0x00f0f2,
+ /* 90 */ 0x00cdc2, 0x00b4e8, 0x00c8d2, 0x00c6dc,
+ /* 94 */ 0x8fe7f8, 0x000000, 0x8fe7f9, 0x00bffc,
+ /* 98 */ 0x00cece, 0x8fe7f5, 0x00b7db, 0x000000,
+ /* 9c */ 0x8fe7fa, 0x000000, 0x8fe7fb, 0x000000,
+ /* a0 */ 0x8fe7fc, 0x00f0f6, 0x000000, 0x8fe7fd,
+ /* a4 */ 0x00f0f5, 0x8fe8a8, 0x8fe7fe, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x8fe8a1,
+ /* ac */ 0x00cbcb, 0x00c6ac, 0x8fe8a2, 0x8fe8a3,
+ /* b0 */ 0x8fe8a4, 0x000000, 0x8fe8a5, 0x8fe8a6,
+ /* b4 */ 0x00b1d0, 0x8fe8a7, 0x000000, 0x00f0f7,
+ /* b8 */ 0x00f0f4, 0x000000, 0x000000, 0x00c9d1,
+ /* bc */ 0x00cdea, 0x00f0f8, 0x8fe8a9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x052ec ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x8fe8aa, 0x000000, 0x00f0f9, 0x8fe8ab,
+ /* 88 */ 0x000000, 0x000000, 0x8fe8ac, 0x00f0fb,
+ /* 8c */ 0x00c2ea, 0x00b3db, 0x00b3dc, 0x00f0fa,
+ /* 90 */ 0x000000, 0x8fe8ad, 0x8fe8ae, 0x8fe8af,
+ /* 94 */ 0x00b4e9, 0x00b8b2, 0x8fe8b0, 0x8fe8b1,
+ /* 98 */ 0x00b4ea, 0x8fe8b2, 0x8fe8b3, 0x00c5bf,
+ /* 9c */ 0x000000, 0x000000, 0x00cee0, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x8fe8b4, 0x8fe8b5,
+ /* a4 */ 0x000000, 0x8fe8b6, 0x8fe8b7, 0x00b8dc,
+ /* a8 */ 0x000000, 0x000000, 0x8fe8b8, 0x00f0fc,
+ /* ac */ 0x8fe8b9, 0x000000, 0x000000, 0x00f0fd,
+ /* b0 */ 0x00f0fe, 0x00f1a1, 0x000000, 0x00f1a3,
+ /* b4 */ 0x00f1a2,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05321 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00c9f7, 0x000000, 0x00f1a4, 0x8fe8ba,
+ /* ac */ 0x000000, 0x8fe8bb, 0x8fe8bc, 0x00f1a5,
+ /* b0 */ 0x8fe8bd, 0x00f1a6, 0x000000, 0x000000,
+ /* b4 */ 0x8fe8be, 0x000000, 0x00f1a7, 0x8fe8bf,
+ /* b8 */ 0x8fe8c0, 0x000000, 0x8fe8c1, 0x8fe8c2,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fe8c3,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05361 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fe8c4, 0x00f1a9,
+ /* 84 */ 0x00f1a8, 0x8fe8c5, 0x00f1aa, 0x000000,
+ /* 88 */ 0x8fe8c6, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x8fe8c7, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x00c8f4,
+ /* 9c */ 0x00e6cc, 0x000000, 0x000000, 0x00bfa9,
+ /* a0 */ 0x000000, 0x8fe8c8, 0x00b5b2, 0x8fe8c9,
+ /* a4 */ 0x000000, 0x8fe8ca, 0x8fe8cb, 0x8fe8cc,
+ /* a8 */ 0x000000, 0x00f1ab, 0x8fe8cd, 0x00f1ac,
+ /* ac */ 0x000000, 0x00d2ac, 0x00ddbb, 0x00c8d3,
+ /* b0 */ 0x000000, 0x000000, 0x00b0fb, 0x8fe8ce,
+ /* b4 */ 0x00b0bb, 0x000000, 0x8fe8cf, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x00bbf4, 0x00cbb0, 0x00befe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x053a0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fe8d0, 0x00f1ad,
+ /* 84 */ 0x000000, 0x00ccdf, 0x000000, 0x8fe8d1,
+ /* 88 */ 0x8fe8d2, 0x00f1ae, 0x00cddc, 0x000000,
+ /* 8c */ 0x00b1c2, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00bbc1, 0x8fe8d3, 0x00f1af, 0x00b2ee,
+ /* 94 */ 0x00f1b0, 0x8fe8d4, 0x8fe8d5, 0x8fe8d6,
+ /* 98 */ 0x00f1b1, 0x000000, 0x8fe8d7, 0x8fe8d8,
+ /* 9c */ 0x8fe8d9, 0x00f1b3, 0x00f1b4, 0x8fe8da,
+ /* a0 */ 0x00f1b6, 0x00f1b2, 0x8fe8db, 0x000000,
+ /* a4 */ 0x00f1b5, 0x000000, 0x8fe8dc, 0x8fe8dd,
+ /* a8 */ 0x00b4db, 0x000000, 0x000000, 0x8fe8de,
+ /* ac */ 0x00f1b7, 0x000000, 0x00f1b8, 0x000000,
+ /* b0 */ 0x000000, 0x8fe8df, 0x8fe8e0, 0x8fe8e1,
+ /* b4 */ 0x8fe8e2, 0x8fe8e3, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fe8e4, 0x8fe8e5, 0x8fe8e6,
+ /* bc */ 0x8fe8e7, 0x00f1b9, 0x00f1ba, 0x000000,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x053e0 ***/
+
+ /* 80 */ 0x8fe8e8, 0x8fe8e9, 0x00f1bb, 0x000000,
+ /* 84 */ 0x000000, 0x00f1bd, 0x8fe8ea, 0x8fe8eb,
+ /* 88 */ 0x8fe8ec, 0x00f1bc, 0x000000, 0x00f1bf,
+ /* 8c */ 0x00f1c2, 0x8fe8ed, 0x8fe8ee, 0x000000,
+ /* 90 */ 0x00f1be, 0x00f1c0, 0x00f1c1, 0x000000,
+ /* 94 */ 0x8fe8ef, 0x00f1c3, 0x000000, 0x00b6c2,
+ /* 98 */ 0x8fe8f0, 0x8fe8f1, 0x000000, 0x8fe8f2,
+ /* 9c */ 0x8fe8f3, 0x000000, 0x8fe8f4, 0x8fe8f5,
+ /* a0 */ 0x8fe8f6, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x0540a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x00bcf3, 0x00f1c4,
+ /* 98 */ 0x00f1c5, 0x00b9e1, 0x000000, 0x8fe8f7,
+ /* 9c */ 0x000000, 0x8fe8f8, 0x8ff4fa, 0x8fe8f9,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00f1c6, 0x8fe8fa, 0x000000,
+ /* a8 */ 0x00b3be, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x00c7cf, 0x00f1c7, 0x00f1c8, 0x000000,
+ /* b0 */ 0x8fe8fb, 0x8fe8fc, 0x8fe8fd, 0x00c3da,
+ /* b4 */ 0x00c6eb, 0x8fe8fe, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x8fe9a1, 0x8fe9a2, 0x000000,
+ /* bc */ 0x00f1c9, 0x8fe9a3, 0x000000, 0x8fe9a4,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x0544a ***/
+
+ /* 80 */ 0x000000, 0x00c7fd, 0x000000, 0x8fe9a5,
+ /* 84 */ 0x00c2cc, 0x00b1d8, 0x00b6ee, 0x000000,
+ /* 88 */ 0x00b6ef, 0x8fe9a6, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00c3f3, 0x00f1ce, 0x00b6f0, 0x8fe9a7,
+ /* 94 */ 0x8fe9a8, 0x00b2ef, 0x000000, 0x000000,
+ /* 98 */ 0x00f1cd, 0x8fe9a9, 0x8fe9aa, 0x00f1cb,
+ /* 9c */ 0x8fe9ab, 0x00f1cc, 0x8fe9ac, 0x00f1ca,
+ /* a0 */ 0x000000, 0x000000, 0x00f1d8, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x8fe9ad,
+ /* a8 */ 0x000000, 0x000000, 0x8fe9ae, 0x8fe9af,
+ /* ac */ 0x8fe9b0, 0x00f1cf, 0x00f1d0, 0x000000,
+ /* b0 */ 0x8fe9b1, 0x00f1d1, 0x00f1d2, 0x000000,
+ /* b4 */ 0x8fe9b2, 0x8fe9b3, 0x000000, 0x000000,
+ /* b8 */ 0x00f1d4, 0x8fe9b4, 0x000000, 0x00f1d3,
+ /* bc */ 0x000000, 0x8fe9b5, 0x8fe9b6, 0x00bdd9,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x0548a ***/
+
+ /* 80 */ 0x000000, 0x00f1d5, 0x8fe9b7, 0x8fe9b8,
+ /* 84 */ 0x8fe9b9, 0x00f1d7, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x8fe9ba,
+ /* 8c */ 0x8fe9bb, 0x000000, 0x00b5b3, 0x00f1d6,
+ /* 90 */ 0x8fe9bc, 0x8fe9bd, 0x00c1fb, 0x00b8b3,
+ /* 94 */ 0x000000, 0x000000, 0x8fe9be, 0x000000,
+ /* 98 */ 0x000000, 0x00f1d9, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fe9bf, 0x000000,
+ /* a0 */ 0x8fe9c0, 0x000000, 0x8fe9c1, 0x8fe9c2,
+ /* a4 */ 0x8fe9c3, 0x000000, 0x000000, 0x8fe9c4,
+ /* a8 */ 0x00c2cd, 0x000000, 0x000000, 0x00f1da,
+ /* ac */ 0x000000, 0x8fe9c5, 0x8fe9c6, 0x000000,
+ /* b0 */ 0x00c6ad, 0x000000, 0x000000, 0x8fe9c7,
+ /* b4 */ 0x000000, 0x8fe9c8, 0x8fe9c9, 0x00f1db,
+ /* b8 */ 0x8fe9ca, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x00f1e0, 0x000000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x054ca ***/
+
+ /* 80 */ 0x00f1de, 0x8fe9cc, 0x00f1dd, 0x00f1df,
+ /* 84 */ 0x8fe9cd, 0x00f1dc, 0x000000, 0x8fe9cb,
+ /* 88 */ 0x000000, 0x000000, 0x8fe9ce, 0x8fe9cf,
+ /* 8c */ 0x8fe9d0, 0x00f1e2, 0x8fe9d1, 0x000000,
+ /* 90 */ 0x000000, 0x8fe9d2, 0x000000, 0x000000,
+ /* 94 */ 0x8fe9d3, 0x00f1e1, 0x8fe9d4, 0x00f1e4,
+ /* 98 */ 0x000000, 0x000000, 0x00b6c3, 0x00f1e3,
+ /* 9c */ 0x000000, 0x8fe9d5, 0x000000, 0x00f1e5,
+ /* a0 */ 0x000000, 0x000000, 0x00f1e6, 0x000000,
+ /* a4 */ 0x00f1e8, 0x00f1e7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f1e9, 0x00f1eb, 0x00f1ea,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x054f6 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x00b9fc, 0x000000, 0x8fe9d6, 0x000000,
+ /* ac */ 0x8fe9d7, 0x00f1ec, 0x8fe9d8, 0x8fe9d9,
+ /* b0 */ 0x00f1ed, 0x000000, 0x8fe9da, 0x000000,
+ /* b4 */ 0x8fe9db, 0x8fe9dc, 0x8fe9dd, 0x000000,
+ /* b8 */ 0x00b3bc, 0x8fe9de, 0x000000, 0x8fe9df,
+ /* bc */ 0x00f1ee, 0x000000, 0x8fe9e0, 0x8fe9e1,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x05536 ***/
+
+ /* 80 */ 0x00f1ef, 0x8fe9e2, 0x000000, 0x8fe9e3,
+ /* 84 */ 0x00bff1, 0x000000, 0x8fe9e4, 0x000000,
+ /* 88 */ 0x8fe9e5, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fe9e6, 0x00f1f0,
+ /* 90 */ 0x8fe9e7, 0x00f1f1, 0x8fe9e8, 0x00f1f2,
+ /* 94 */ 0x00f1f3, 0x8fe9e9, 0x8fe9ea, 0x8fe9eb,
+ /* 98 */ 0x00b9e2, 0x8ff4fb, 0x000000, 0x8fe9ec,
+ /* 9c */ 0x8fe9ed, 0x000000, 0x00f1f4, 0x00f1f5,
+ /* a0 */ 0x8fe9ee, 0x000000, 0x00f1f6, 0x00f1f7,
+ /* a4 */ 0x8fe9ef, 0x8fe9f0, 0x00f1f8, 0x8fe9f1,
+ /* a8 */ 0x000000, 0x8fe9f2, 0x00c8b1, 0x00f1fa,
+ /* ac */ 0x8fe9f3, 0x00c9a6, 0x00f1fb, 0x00f1f9,
+ /* b0 */ 0x000000, 0x00f1fd, 0x8fe9f4, 0x8fe9f5,
+ /* b4 */ 0x00f1fc, 0x8fe9f6, 0x000000, 0x00f1fe,
+ /* b8 */ 0x000000, 0x8fe9f7, 0x8fe9f8, 0x00f2a1,
+ /* bc */ 0x000000, 0x8fe9f9, 0x000000, 0x8fe9fa,
+
+ /*** Three byte table, leaf: e9acxx - offset 0x05576 ***/
+
+ /* 80 */ 0x8fe9fb, 0x8fe9fc, 0x8fe9fd, 0x8fe9fe,
+ /* 84 */ 0x8feaa1, 0x8feaa2, 0x00f2a2, 0x000000,
+ /* 88 */ 0x8feaa3, 0x8feaa4, 0x000000, 0x8feaa5,
+ /* 8c */ 0x8feaa6, 0x8feaa7, 0x8feaa8, 0x000000,
+ /* 90 */ 0x8feaa9, 0x000000, 0x8feaaa, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x8feaab, 0x000000,
+ /* 98 */ 0x00f2a3, 0x8feaac, 0x00f2a4, 0x8feaad,
+ /* 9c */ 0x8feaae, 0x000000, 0x000000, 0x00f2a5,
+ /* a0 */ 0x8feaaf, 0x000000, 0x00f2a6, 0x00f2a7,
+ /* a4 */ 0x000000, 0x00f2a8, 0x8feab0, 0x00f2a9,
+ /* a8 */ 0x00f2aa, 0x00f2ab, 0x00f2ac, 0x8feab1,
+ /* ac */ 0x000000, 0x8feab2, 0x00f2ad, 0x00f2ae,
+ /* b0 */ 0x000000, 0x00ddb5, 0x00f2af, 0x8feab3,
+ /* b4 */ 0x8feab4, 0x8feab5, 0x000000, 0x8feab6,
+ /* b8 */ 0x000000, 0x8feab7, 0x8feab8, 0x00e4f8,
+ /* bc */ 0x00b5b4, 0x8feab9, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x055b5 ***/
+
+ /* 80 */ 0x000000, 0x00b3a1, 0x00bab2, 0x00f2b1,
+ /* 84 */ 0x00f2b0, 0x00cca5, 0x000000, 0x000000,
+ /* 88 */ 0x8feaba, 0x000000, 0x000000, 0x8feabb,
+ /* 8c */ 0x8feabc, 0x00f2b3, 0x00f2b4, 0x00f2b2,
+ /* 90 */ 0x000000, 0x00f2b5, 0x000000, 0x000000,
+ /* 94 */ 0x00cbe2, 0x8feabd, 0x8feabe, 0x8feabf,
+ /* 98 */ 0x00f2b6, 0x000000, 0x00b5fb, 0x8feac0,
+ /* 9c */ 0x000000, 0x000000, 0x8feac1, 0x000000,
+ /* a0 */ 0x000000, 0x8feac2, 0x000000, 0x8feac3,
+ /* a4 */ 0x000000, 0x8feac4, 0x8feac5, 0x000000,
+ /* a8 */ 0x8feac6, 0x000000, 0x8feac7, 0x8feac8,
+ /* ac */ 0x8feac9, 0x8feaca, 0x8feacb, 0x00cfa5,
+ /* b0 */ 0x000000, 0x000000, 0x8ff4fc, 0x8feacc,
+ /* b4 */ 0x00f2b7, 0x8feacd, 0x000000, 0x8feace,
+ /* b8 */ 0x8feacf, 0x8fead0, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x8fead1,
+
+ /*** Three byte table, leaf: e9aexx - offset 0x055f5 ***/
+
+ /* 80 */ 0x8fead2, 0x000000, 0x000000, 0x00f2b9,
+ /* 84 */ 0x8fead3, 0x8fead4, 0x8fead5, 0x8fead6,
+ /* 88 */ 0x000000, 0x8fead7, 0x8fead8, 0x8fead9,
+ /* 8c */ 0x000000, 0x8feada, 0x00b0be, 0x8feadb,
+ /* 90 */ 0x8feadc, 0x00f2ba, 0x00caab, 0x00f2b8,
+ /* 94 */ 0x8feadd, 0x000000, 0x00f2bb, 0x00f2bc,
+ /* 98 */ 0x000000, 0x000000, 0x8feade, 0x000000,
+ /* 9c */ 0x000000, 0x8feadf, 0x8feae0, 0x00f2bd,
+ /* a0 */ 0x00f2be, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8feae1, 0x8feae2,
+ /* a8 */ 0x00f2bf, 0x8feae3, 0x00cbee, 0x00bbad,
+ /* ac */ 0x8feae4, 0x00bafa, 0x00c1af, 0x000000,
+ /* b0 */ 0x8feae5, 0x8feae6, 0x8feae7, 0x000000,
+ /* b4 */ 0x00f2c0, 0x000000, 0x000000, 0x8feae8,
+ /* b8 */ 0x8feae9, 0x00f2c3, 0x000000, 0x8feaea,
+ /* bc */ 0x8feaeb, 0x000000, 0x8feaec, 0x8feaed,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x05635 ***/
+
+ /* 80 */ 0x00f2c1, 0x8feaee, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x00f2c4, 0x8feaef,
+ /* 88 */ 0x8feaf0, 0x00b8f1, 0x00f2c2, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8feaf1, 0x00f2c5,
+ /* 90 */ 0x8feaf2, 0x00f2c6, 0x00f2c7, 0x000000,
+ /* 94 */ 0x00f2cb, 0x000000, 0x00bbaa, 0x8feaf3,
+ /* 98 */ 0x8feaf4, 0x000000, 0x000000, 0x00c2e4,
+ /* 9c */ 0x000000, 0x8feaf5, 0x000000, 0x8feaf6,
+ /* a0 */ 0x000000, 0x00f2cc, 0x00f2c9, 0x00f2c8,
+ /* a4 */ 0x00f2ca, 0x8feaf7, 0x000000, 0x8feaf8,
+ /* a8 */ 0x00b7df, 0x000000, 0x8feaf9, 0x8feafa,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x8feafb,
+ /* b0 */ 0x00f2d0, 0x00f2cf, 0x00f2ce, 0x8feafc,
+ /* b4 */ 0x000000, 0x00b0b3, 0x000000, 0x8feafd,
+ /* b8 */ 0x8feafe, 0x8feba1, 0x8feba2, 0x000000,
+ /* bc */ 0x000000, 0x8feba3, 0x000000, 0x8feba4,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x05675 ***/
+
+ /* 80 */ 0x8feba5, 0x000000, 0x8feba6, 0x000000,
+ /* 84 */ 0x00f2da, 0x000000, 0x00f2d6, 0x000000,
+ /* 88 */ 0x00f2d7, 0x00f2d3, 0x00f2d9, 0x8feba7,
+ /* 8c */ 0x00f2d5, 0x00b3e2, 0x000000, 0x8feba8,
+ /* 90 */ 0x00cfcc, 0x8feba9, 0x00f2d8, 0x00f2d4,
+ /* 94 */ 0x00f2d2, 0x00f2d1, 0x8febaa, 0x000000,
+ /* 98 */ 0x8febab, 0x8febac, 0x8febad, 0x00f2dc,
+ /* 9c */ 0x8febae, 0x000000, 0x8febaf, 0x000000,
+ /* a0 */ 0x000000, 0x00f2df, 0x8febb0, 0x8febb1,
+ /* a4 */ 0x00f2de, 0x00f2dd, 0x8febb2, 0x8febb3,
+ /* a8 */ 0x8febb4, 0x8febb5, 0x8febb6, 0x000000,
+ /* ac */ 0x000000, 0x00c9c9, 0x00f2db, 0x00b0f3,
+ /* b0 */ 0x00f2e0, 0x8febb7, 0x00f2e2, 0x000000,
+ /* b4 */ 0x000000, 0x8febb8, 0x8febb9, 0x8febba,
+ /* b8 */ 0x000000, 0x00b3ef, 0x00f2cd, 0x00b1b7,
+ /* bc */ 0x000000, 0x8febbb, 0x00f2e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x056b4 ***/
+
+ /* 80 */ 0x000000, 0x8febbc, 0x000000, 0x8febbd,
+ /* 84 */ 0x8febbe, 0x8febbf, 0x00f2e3, 0x00f2e1,
+ /* 88 */ 0x00c3ad, 0x8febc0, 0x8febc1, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8febc2, 0x8febc3,
+ /* 90 */ 0x8febc4, 0x000000, 0x00cbf0, 0x8febc5,
+ /* 94 */ 0x8febc6, 0x000000, 0x8febc7, 0x00ceda,
+ /* 98 */ 0x8febc8, 0x000000, 0x00f2e5, 0x8febc9,
+ /* 9c */ 0x8febd0, 0x8febca, 0x8febcb, 0x8febcc,
+ /* a0 */ 0x00f2e6, 0x000000, 0x000000, 0x8febcd,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x00f2e7,
+ /* a8 */ 0x8febd2, 0x8febce, 0x8febcf, 0x8febd1,
+ /* ac */ 0x000000, 0x000000, 0x8febd3, 0x000000,
+ /* b0 */ 0x8febd4, 0x000000, 0x8febd5, 0x000000,
+ /* b4 */ 0x000000, 0x8febd6, 0x00f2e8, 0x8febd7,
+ /* b8 */ 0x00f2e9, 0x000000, 0x000000, 0x8febd8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x056f0 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x00c4bb, 0x8febd9, 0x00f2ea,
+ /* a8 */ 0x000000, 0x00c8b7, 0x000000, 0x00f2ef,
+ /* ac */ 0x00f2eb, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x00f2ec, 0x000000, 0x8febda, 0x00cbb1,
+ /* b4 */ 0x00ccc4, 0x000000, 0x00c6d0, 0x8febdb,
+ /* b8 */ 0x000000, 0x8febdc, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x0572e ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8febde, 0x00f2f0,
+ /* 84 */ 0x000000, 0x000000, 0x00f2f1, 0x00c6be,
+ /* 88 */ 0x00f2ee, 0x00f2ed, 0x000000, 0x8febdd,
+ /* 8c */ 0x000000, 0x000000, 0x00b2aa, 0x000000,
+ /* 90 */ 0x000000, 0x8febdf, 0x00f2f9, 0x000000,
+ /* 94 */ 0x000000, 0x00f2f8, 0x000000, 0x8febe0,
+ /* 98 */ 0x8febe1, 0x000000, 0x000000, 0x00b1f5,
+ /* 9c */ 0x8febe2, 0x8febe3, 0x8febe4, 0x00f2f6,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x00f2f5,
+ /* a4 */ 0x000000, 0x000000, 0x00f2f3, 0x000000,
+ /* a8 */ 0x00b3fb, 0x000000, 0x00f2f2, 0x00bcb2,
+ /* ac */ 0x00b2a9, 0x000000, 0x000000, 0x8febe5,
+ /* b0 */ 0x8febe6, 0x000000, 0x8febe7, 0x8febe8,
+ /* b4 */ 0x8febe9, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x8febea, 0x00b9e3,
+ /* bc */ 0x8febeb, 0x8febed, 0x00f2fc, 0x00f2fb,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x0576e ***/
+
+ /* 80 */ 0x000000, 0x00f2fa, 0x8febee, 0x8febef,
+ /* 84 */ 0x00f2f7, 0x8febec, 0x00f2fd, 0x8febf0,
+ /* 88 */ 0x00f2fe, 0x000000, 0x8febf1, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x00f3a5, 0x00f3a4, 0x000000, 0x8febf2,
+ /* 94 */ 0x8febf3, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x00f3a6, 0x000000, 0x000000,
+ /* 9c */ 0x00b1ad, 0x00f3a1, 0x00f3a2, 0x8febf4,
+ /* a0 */ 0x00b9f4, 0x00ccb9, 0x8febf6, 0x8febf5,
+ /* a4 */ 0x00f3a3, 0x8febf7, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8febf8, 0x8febf9, 0x8febfa,
+ /* ac */ 0x00cbb2, 0x000000, 0x000000, 0x00f3ab,
+ /* b0 */ 0x8febfb, 0x000000, 0x00f3a7, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x8febfc, 0x8febfd,
+ /* b8 */ 0x000000, 0x000000, 0x00f3ac, 0x8febfe,
+ /* bc */ 0x8feca1, 0x000000, 0x8feca2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x057ad ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x8feca3,
+ /* 84 */ 0x8feca4, 0x000000, 0x8feca5, 0x00f3a9,
+ /* 88 */ 0x000000, 0x00f3a8, 0x8feca6, 0x000000,
+ /* 8c */ 0x000000, 0x8feca7, 0x8feca8, 0x00b7dc,
+ /* 90 */ 0x000000, 0x000000, 0x8feca9, 0x8fecaa,
+ /* 94 */ 0x000000, 0x8fecab, 0x8fecac, 0x8fecad,
+ /* 98 */ 0x8fecae, 0x000000, 0x00f3ad, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x8fecaf, 0x000000, 0x000000,
+ /* a4 */ 0x00f3ae, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x00f3af, 0x8fecb0, 0x00f3aa,
+ /* ac */ 0x8fecb1, 0x000000, 0x8fecb2, 0x00f2f4,
+ /* b0 */ 0x000000, 0x8fecb3, 0x00f3b0, 0x000000,
+ /* b4 */ 0x00c4e1, 0x8fecb4, 0x000000, 0x000000,
+ /* b8 */ 0x00f3b4, 0x8fecb5, 0x00f3b5, 0x00f3b3,
+ /* bc */ 0x8fecb6, 0x000000, 0x000000, 0x8fecb7,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x057ed ***/
+
+ /* 80 */ 0x000000, 0x00f3b2, 0x00f3b8, 0x8fecb8,
+ /* 84 */ 0x00f3b1, 0x000000, 0x00f3b6, 0x8fecb9,
+ /* 88 */ 0x000000, 0x8fecba, 0x8fecbb, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x00f3b7,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x00f3ba,
+ /* 94 */ 0x8fecbc, 0x8fecbd, 0x8fecbe, 0x8fecbf,
+ /* 98 */ 0x000000, 0x00f3b9, 0x8fecc0, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x8fecc1, 0x8fecc2,
+ /* a0 */ 0x8fecc3, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x8fecc4, 0x00f3bc, 0x8fecc5,
+ /* a8 */ 0x000000, 0x8fecc6, 0x000000, 0x8fecc7,
+ /* ac */ 0x000000, 0x00f3bd, 0x8fecc8, 0x00f3be,
+ /* b0 */ 0x8fecc9, 0x000000, 0x00cfc9, 0x8fecca,
+ /* b4 */ 0x8feccb, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x00f3bb, 0x00c2eb, 0x00baed, 0x000000,
+ /* bc */ 0x000000, 0x00f3bf, 0x8feccc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x0582c ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8fecce, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x8feccf,
+ /* 88 */ 0x000000, 0x000000, 0x8feccd, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8fecd0, 0x000000,
+ /* 90 */ 0x8fecd1, 0x8fecd2, 0x8fecd3, 0x000000,
+ /* 94 */ 0x000000, 0x8fecd4, 0x8fecd5, 0x000000,
+ /* 98 */ 0x000000, 0x8fecd6, 0x00f3c0, 0x00f3c1,
+ /* 9c */ 0x8fecd7, 0x8fecd8, 0x00f3c2,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x0584b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x00f3c3, 0x000000, 0x000000,
+ /* b8 */ 0x00b8b4, 0x00f3c4, 0x8fecd9, 0x8fecda,
+ /* bc */ 0x8fecdb, 0x00f3c5, 0x000000, 0x00bcaf,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x0588b ***/
+
+ /* 80 */ 0x8fecdc, 0x00f3c6, 0x8fecdd, 0x8fecde,
+ /* 84 */ 0x8fecdf, 0x8fece0, 0x000000, 0x8fece1,
+ /* 88 */ 0x00f3c7, 0x000000, 0x000000, 0x00f3c8,
+ /* 8c */ 0x00f3c9, 0x000000, 0x8fece2, 0x8fece3,
+ /* 90 */ 0x000000, 0x00f3cc, 0x00f3ca, 0x00cfbc,
+ /* 94 */ 0x000000, 0x00f3cb, 0x8fece4, 0x00ceef,
+ /* 98 */ 0x8fece5, 0x000000, 0x000000, 0x8fece6,
+ /* 9c */ 0x000000, 0x00f3cd, 0x8fece7, 0x00cedb,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fece8, 0x00f3ce, 0x00c7fe, 0x000000,
+ /* a8 */ 0x8fece9, 0x00f3cf, 0x00f3d1, 0x000000,
+ /* ac */ 0x8fecea, 0x00f3d2, 0x8feceb, 0x8fecec,
+ /* b0 */ 0x8feced, 0x000000, 0x000000, 0x8fecee,
+ /* b4 */ 0x8fecef, 0x8fecf0, 0x000000, 0x000000,
+ /* b8 */ 0x00f3d0, 0x00b9ed, 0x00cccd, 0x00cbe3,
+ /* bc */ 0x00d6f7, 0x000000, 0x00dde0, 0x00cbfb,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x058cb ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x00b2ab, 0x000000, 0x8fecf1, 0x000000,
+ /* 88 */ 0x8fecf2, 0x000000, 0x000000, 0x8fecf3,
+ /* 8c */ 0x00f3d4, 0x00b5d0, 0x00f3d5, 0x00f3d6,
+ /* 90 */ 0x00f3d7, 0x8ff4fe, 0x00b9f5, 0x000000,
+ /* 94 */ 0x00f3d8, 0x8fecf4, 0x000000, 0x000000,
+ /* 98 */ 0x00e0d4, 0x00ccdb, 0x000000, 0x00c2e3,
+ /* 9c */ 0x00f3d9, 0x00f3db, 0x00f3da, 0x8fecf5,
+ /* a0 */ 0x00f3dc, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x8fecf6, 0x00f3dd, 0x000000, 0x8fecf7,
+ /* a8 */ 0x00f3de, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x8fecf8, 0x8fecf9, 0x8fecfa, 0x00f3df,
+ /* b0 */ 0x8fecfb, 0x8fecfc, 0x8fecfd, 0x000000,
+ /* b4 */ 0x00f3e0, 0x8fecfe, 0x00f3e1, 0x00f3e2,
+ /* b8 */ 0x8feda1, 0x00f3e3, 0x000000, 0x00f3e4,
+ /* bc */ 0x00f3e5, 0x00f3e6, 0x000000, 0x8feda2,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x0590b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x8feda3, 0x8feda4,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x00f3e7,
+ /* 88 */ 0x00f3e8, 0x8feda5, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x00c5a4, 0x8feda6,
+ /* 90 */ 0x8feda7, 0x8feda8, 0x8feda9, 0x00b8dd,
+ /* 94 */ 0x8fedaa, 0x00f3ea, 0x8fedab, 0x8fedac,
+ /* 98 */ 0x000000, 0x8fedad, 0x8fedae, 0x8fedaf,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x8fedb0,
+ /* a0 */ 0x00c1cd, 0x00f3eb, 0x8fedb1, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x8fedb2, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x8fedb3, 0x8fedb4,
+ /* ac */ 0x00f3ec, 0x000000, 0x000000, 0x8fedb5,
+ /* b0 */ 0x000000, 0x8fedb6, 0x8fedb7, 0x000000,
+ /* b4 */ 0x8fedb8, 0x000000, 0x000000, 0x8fedb9,
+ /* b8 */ 0x000000, 0x8fedba, 0x8fedbb, 0x00c9a1,
+ /* bc */ 0x8fedbc, 0x8fedbd, 0x00f3ed, 0x8fedbe,
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x0594b ***/
+
+ /* 80 */ 0x000000, 0x8fedbf, 0x000000, 0x8fedc0,
+ /* 84 */ 0x8fedc1, 0x8fedc2, 0x8fedc3, 0x8fedc4,
+ /* 88 */ 0x000000, 0x000000, 0x00f3ee, 0x00e3b7,
+ /* 8c */ 0x000000, 0x000000, 0x00ecda, 0x00f0ed,
+ /* 90 */ 0x000000, 0x000000, 0x00f3ef, 0x8fedc5,
+ /* 94 */ 0x00f3f0, 0x8fedc6, 0x8fedc7, 0x8fedc8,
+ /* 98 */ 0x8fedc9, 0x000000, 0x8fedca, 0x000000,
+ /* 9c */ 0x000000, 0x8fedcb, 0x8fedcc, 0x00f3f2,
+ /* a0 */ 0x00f3f3, 0x00f3f4, 0x00cef0, 0x00f3f1,
+ /* a4 */ 0x000000, 0x000000, 0x00f3f5, 0x00f3f6,
+ /* a8 */ 0x8fedcd, 0x8fedce, 0x00f3f8, 0x000000,
+ /* ac */ 0x00f3f7, 0x8fedcf, 0x8fedd0, 0x8fedd1,
+ /* b0 */ 0x8fedd2, 0x8fedd3, 0x00f3fa, 0x8fedd4,
+ /* b4 */ 0x000000, 0x8fedd5, 0x00f3fb, 0x00f3f9,
+ /* b8 */ 0x000000, 0x000000, 0x8fedd6, 0x000000,
+ /* bc */ 0x000000, 0x8fedd7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x05989 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x00ceb6, 0x000000, 0x8fedd8,
+ /* 90 */ 0x8fedd9, 0x8fedda, 0x8feddb, 0x000000,
+ /* 94 */ 0x8feddc, 0x00f3fc, 0x8feddd, 0x8fedde,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x00f3fd, 0x00e3d4, 0x8feddf, 0x000000,
+ /* a0 */ 0x00f3fe, 0x8fede0, 0x8fede1, 0x8fede2,
+ /* a4 */ 0x000000, 0x8fede3,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x059af ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x8ff4c5,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa7xx - offset 0x059d9 ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x8ff4f2, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x05a0b ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x8ff4b4, 0x8ff4b7,
+ /* 90 */ 0x8ff4b8, 0x8ff4bd, 0x8ff4c4, 0x8ff4c7,
+ /* 94 */ 0x8ff4c8, 0x8ff4ce, 0x8ff4cf, 0x8ff4d3,
+ /* 98 */ 0x8ff4d5, 0x8ff4d6, 0x8ff4d7, 0x8ff4d8,
+ /* 9c */ 0x8ff4da, 0x8ff4db, 0x8ff4de, 0x8ff4e0,
+ /* a0 */ 0x8ff4e2, 0x8ff4e3, 0x8ff4e5, 0x8ff4e9,
+ /* a4 */ 0x8ff4ea, 0x8ff4eb, 0x8ff4ed, 0x8ff4ef,
+ /* a8 */ 0x8ff4f0, 0x8ff4f3, 0x8ff4f7, 0x8ff4f8,
+ /* ac */ 0x8ff4f9, 0x8ff4fd, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x05a4a ***/
+
+ /* 80 */ 0x000000, 0x00a1aa, 0x8ff4aa, 0x00a1f4,
+ /* 84 */ 0x00a1f0, 0x00a1f3, 0x00a1f5, 0x8ff4a9,
+ /* 88 */ 0x00a1ca, 0x00a1cb, 0x00a1f6, 0x00a1dc,
+ /* 8c */ 0x00a1a4, 0x00a1dd, 0x00a1a5, 0x00a1bf,
+ /* 90 */ 0x00a3b0, 0x00a3b1, 0x00a3b2, 0x00a3b3,
+ /* 94 */ 0x00a3b4, 0x00a3b5, 0x00a3b6, 0x00a3b7,
+ /* 98 */ 0x00a3b8, 0x00a3b9, 0x00a1a7, 0x00a1a8,
+ /* 9c */ 0x00a1e3, 0x00a1e1, 0x00a1e4, 0x00a1a9,
+ /* a0 */ 0x00a1f7, 0x00a3c1, 0x00a3c2, 0x00a3c3,
+ /* a4 */ 0x00a3c4, 0x00a3c5, 0x00a3c6, 0x00a3c7,
+ /* a8 */ 0x00a3c8, 0x00a3c9, 0x00a3ca, 0x00a3cb,
+ /* ac */ 0x00a3cc, 0x00a3cd, 0x00a3ce, 0x00a3cf,
+ /* b0 */ 0x00a3d0, 0x00a3d1, 0x00a3d2, 0x00a3d3,
+ /* b4 */ 0x00a3d4, 0x00a3d5, 0x00a3d6, 0x00a3d7,
+ /* b8 */ 0x00a3d8, 0x00a3d9, 0x00a3da, 0x00a1ce,
+ /* bc */ 0x00a1c0, 0x00a1cf, 0x00a1b0, 0x00a1b2,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x05a8a ***/
+
+ /* 80 */ 0x00a1ae, 0x00a3e1, 0x00a3e2, 0x00a3e3,
+ /* 84 */ 0x00a3e4, 0x00a3e5, 0x00a3e6, 0x00a3e7,
+ /* 88 */ 0x00a3e8, 0x00a3e9, 0x00a3ea, 0x00a3eb,
+ /* 8c */ 0x00a3ec, 0x00a3ed, 0x00a3ee, 0x00a3ef,
+ /* 90 */ 0x00a3f0, 0x00a3f1, 0x00a3f2, 0x00a3f3,
+ /* 94 */ 0x00a3f4, 0x00a3f5, 0x00a3f6, 0x00a3f7,
+ /* 98 */ 0x00a3f8, 0x00a3f9, 0x00a3fa, 0x00a1d0,
+ /* 9c */ 0x00a1c3, 0x00a1d1, 0x00a1c1, 0x000000,
+ /* a0 */ 0x000000, 0x008ea1, 0x008ea2, 0x008ea3,
+ /* a4 */ 0x008ea4, 0x008ea5, 0x008ea6, 0x008ea7,
+ /* a8 */ 0x008ea8, 0x008ea9, 0x008eaa, 0x008eab,
+ /* ac */ 0x008eac, 0x008ead, 0x008eae, 0x008eaf,
+ /* b0 */ 0x008eb0, 0x008eb1, 0x008eb2, 0x008eb3,
+ /* b4 */ 0x008eb4, 0x008eb5, 0x008eb6, 0x008eb7,
+ /* b8 */ 0x008eb8, 0x008eb9, 0x008eba, 0x008ebb,
+ /* bc */ 0x008ebc, 0x008ebd, 0x008ebe, 0x008ebf,
+
+ /*** Three byte table, leaf: efbexx - offset 0x05aca ***/
+
+ /* 80 */ 0x008ec0, 0x008ec1, 0x008ec2, 0x008ec3,
+ /* 84 */ 0x008ec4, 0x008ec5, 0x008ec6, 0x008ec7,
+ /* 88 */ 0x008ec8, 0x008ec9, 0x008eca, 0x008ecb,
+ /* 8c */ 0x008ecc, 0x008ecd, 0x008ece, 0x008ecf,
+ /* 90 */ 0x008ed0, 0x008ed1, 0x008ed2, 0x008ed3,
+ /* 94 */ 0x008ed4, 0x008ed5, 0x008ed6, 0x008ed7,
+ /* 98 */ 0x008ed8, 0x008ed9, 0x008eda, 0x008edb,
+ /* 9c */ 0x008edc, 0x008edd, 0x008ede, 0x008edf,
+ /* a0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x05b0a ***/
+
+ /* 80 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 94 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00a1f1, 0x00a1f2, 0x00a2cc, 0x00a1b1,
+ /* a4 */ 0x8fa2c3, 0x00a1ef, 0x000000, 0x000000,
+ /* a8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* ac */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b0 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b4 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* b8 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* bc */ 0x000000, 0x000000, 0x000000, 0x000000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_euc_kr.map b/src/backend/utils/mb/Unicode/utf8_to_euc_kr.map
new file mode 100644
index 0000000..6befea1
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_euc_kr.map
@@ -0,0 +1,6392 @@
+/* src/backend/utils/mb/Unicode/utf8_to_euc_kr.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl */
+
+static const uint16 euc_kr_from_unicode_tree_table[33954];
+
+static const pg_mb_radix_tree euc_kr_from_unicode_tree =
+{
+ euc_kr_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0276, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 euc_kr_from_unicode_tree_table[33954] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0090, 0x00cf, 0x010f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0148, 0x0000, 0x0000, 0x0177, 0x01b7, 0x01f6, 0x0236,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa2ae, 0x0000, 0x0000, 0xa2b4, 0x0000, 0x0000, 0xa1d7,
+ /* a8 */ 0xa1a7, 0x0000, 0xa8a3, 0x0000, 0x0000, 0xa1a9, 0xa2e7, 0x0000,
+ /* b0 */ 0xa1c6, 0xa1be, 0xa9f7, 0xa9f8, 0xa2a5, 0x0000, 0xa2d2, 0xa1a4,
+ /* b8 */ 0xa2ac, 0xa9f6, 0xa8ac, 0x0000, 0xa8f9, 0xa8f6, 0xa8fa, 0xa2af,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1bf,
+ /* 98 */ 0xa8aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ad, 0xa9ac,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9a1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa9a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c0,
+ /* b8 */ 0xa9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9ad,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa9a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a4, 0xa9a4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa9a5, 0xa8a6, 0xa9a6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xa9a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a8,
+
+ /*** Two byte table, leaf: c5xx - offset 0x0010f ***/
+
+ /* 80 */ 0xa9a8, 0xa8a9, 0xa9a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa9b0, 0xa8af, 0xa9af, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa8ab, 0xa9ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ae, 0xa9ae,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00148 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2a7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa2b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xa2a8, 0xa2ab, 0xa2aa, 0xa2ad, 0x0000, 0xa2a9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x00177 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7,
+ /* 98 */ 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf,
+ /* a0 */ 0xa5d0, 0xa5d1, 0x0000, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6,
+ /* a8 */ 0xa5d7, 0xa5d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7,
+ /* b8 */ 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef,
+
+ /*** Two byte table, leaf: cfxx - offset 0x001b7 ***/
+
+ /* 80 */ 0xa5f0, 0xa5f1, 0x0000, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6,
+ /* 88 */ 0xa5f7, 0xa5f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x001f6 ***/
+
+ /* 80 */ 0x0000, 0xaca7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xaca1, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca8, 0xaca9,
+ /* 98 */ 0xacaa, 0xacab, 0xacac, 0xacad, 0xacae, 0xacaf, 0xacb0, 0xacb1,
+ /* a0 */ 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacb8, 0xacb9,
+ /* a8 */ 0xacba, 0xacbb, 0xacbc, 0xacbd, 0xacbe, 0xacbf, 0xacc0, 0xacc1,
+ /* b0 */ 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd5, 0xacd6, 0xacd8, 0xacd9,
+ /* b8 */ 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0xace0, 0xace1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00236 ***/
+
+ /* 80 */ 0xace2, 0xace3, 0xace4, 0xace5, 0xace6, 0xace7, 0xace8, 0xace9,
+ /* 88 */ 0xacea, 0xaceb, 0xacec, 0xaced, 0xacee, 0xacef, 0xacf0, 0xacf1,
+ /* 90 */ 0x0000, 0xacd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00276 ***/
+
+ /* e2 */ 0x0284, 0x02c4, 0x02d4, 0x0314, 0x0354, 0x0394, 0x03d4, 0x0414,
+ /* ea */ 0x0453, 0x0493, 0x04d3, 0x0513, 0x0000, 0x0532,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00284 ***/
+
+ /* 80 */ 0x0572, 0x05ae, 0x05ee, 0x0000, 0x062b, 0x0658, 0x0692, 0x06c0,
+ /* 88 */ 0x0700, 0x073e, 0x077c, 0x0000, 0x07aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x07ca, 0x080a, 0x0840, 0x0880, 0x08c0, 0x08ee, 0x092e,
+ /* 98 */ 0x0969, 0x09a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x002c4 ***/
+
+ /* 80 */ 0x09e9, 0x0a28, 0x0a68, 0x0aa8, 0x0adf, 0x0b1f, 0x0b5f, 0x0000,
+ /* 88 */ 0x0b9f, 0x0bbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bff, 0x0c3f,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x002d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0c7f, 0x0cbd, 0x0cfc, 0x0d3c, 0x0d7b, 0x0db9, 0x0df9, 0x0e39,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00314 ***/
+
+ /* 80 */ 0x0e77, 0x0eb4, 0x0ef4, 0x0f33, 0x0f73, 0x0fb3, 0x0ff3, 0x1031,
+ /* 88 */ 0x1071, 0x10ae, 0x10ee, 0x112d, 0x116d, 0x11ad, 0x11ed, 0x122a,
+ /* 90 */ 0x1267, 0x12a6, 0x12e6, 0x1326, 0x1362, 0x13a1, 0x13e1, 0x141c,
+ /* 98 */ 0x145b, 0x1492, 0x14cc, 0x1509, 0x1546, 0x1586, 0x15c4, 0x1601,
+ /* a0 */ 0x1641, 0x167c, 0x16bb, 0x16fa, 0x1738, 0x1777, 0x17b5, 0x17f4,
+ /* a8 */ 0x1834, 0x1873, 0x18a1, 0x18e0, 0x191b, 0x195b, 0x1998, 0x19d8,
+ /* b0 */ 0x1a17, 0x1a57, 0x1a91, 0x1ad1, 0x1b0f, 0x1b44, 0x1b7d, 0x1bbb,
+ /* b8 */ 0x1bfa, 0x1c3a, 0x1c79, 0x1cb8, 0x1cf7, 0x1d34, 0x1d74, 0x1db2,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x00354 ***/
+
+ /* 80 */ 0x1df2, 0x1e31, 0x1e6c, 0x1eaa, 0x1ee9, 0x1f29, 0x1f68, 0x1fa7,
+ /* 88 */ 0x1fe7, 0x2027, 0x2067, 0x20a5, 0x20e5, 0x2124, 0x2164, 0x21a4,
+ /* 90 */ 0x21dc, 0x221b, 0x2256, 0x2295, 0x22d5, 0x2315, 0x2354, 0x2393,
+ /* 98 */ 0x23d3, 0x2412, 0x244e, 0x248d, 0x24cd, 0x250b, 0x254b, 0x258a,
+ /* a0 */ 0x25c9, 0x2609, 0x2649, 0x2685, 0x26c5, 0x2705, 0x273f, 0x277e,
+ /* a8 */ 0x27be, 0x27fc, 0x283c, 0x287a, 0x28b6, 0x28f5, 0x2935, 0x2975,
+ /* b0 */ 0x29ad, 0x29ed, 0x2a2c, 0x2a6c, 0x2aa1, 0x2ae0, 0x2b20, 0x2b60,
+ /* b8 */ 0x2b9c, 0x2bdb, 0x2c16, 0x2c54, 0x2c94, 0x2cd4, 0x2d13, 0x2d53,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x00394 ***/
+
+ /* 80 */ 0x2d92, 0x2dd1, 0x2e0f, 0x2e49, 0x2e87, 0x2ec0, 0x2efe, 0x2f3d,
+ /* 88 */ 0x2f7d, 0x2fbd, 0x2ffd, 0x303d, 0x307b, 0x30bb, 0x30f7, 0x3137,
+ /* 90 */ 0x3176, 0x31b6, 0x31f5, 0x3235, 0x3274, 0x32af, 0x32ef, 0x332e,
+ /* 98 */ 0x336e, 0x33ac, 0x33eb, 0x342b, 0x346a, 0x34aa, 0x34ea, 0x352a,
+ /* a0 */ 0x3568, 0x35a3, 0x35e2, 0x3621, 0x3660, 0x36a0, 0x36e0, 0x3720,
+ /* a8 */ 0x3760, 0x37a0, 0x37e0, 0x381c, 0x385c, 0x3896, 0x38d4, 0x3914,
+ /* b0 */ 0x394d, 0x398d, 0x39ca, 0x3a09, 0x3a49, 0x3a87, 0x3ac7, 0x3b07,
+ /* b8 */ 0x3b43, 0x3b82, 0x3bc0, 0x0000, 0x3bdd, 0x3c18, 0x3c53, 0x3c92,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x003d4 ***/
+
+ /* 80 */ 0x3cd2, 0x3d12, 0x3d52, 0x3d8f, 0x3dcd, 0x3e0c, 0x3e4c, 0x3e8c,
+ /* 88 */ 0x3ecb, 0x3f0b, 0x3f4a, 0x3f8a, 0x3fc9, 0x4009, 0x4045, 0x4084,
+ /* 90 */ 0x40c2, 0x4100, 0x413b, 0x417b, 0x41b8, 0x41f8, 0x4234, 0x4273,
+ /* 98 */ 0x42b3, 0x42f3, 0x432d, 0x4366, 0x43a6, 0x43d8, 0x4416, 0x4452,
+ /* a0 */ 0x4491, 0x44d1, 0x4511, 0x4550, 0x458e, 0x45cd, 0x460d, 0x464d,
+ /* a8 */ 0x468d, 0x46c9, 0x4704, 0x4744, 0x4784, 0x47c3, 0x4803, 0x0000,
+ /* b0 */ 0x481e, 0x485e, 0x489c, 0x48dc, 0x491a, 0x4936, 0x4971, 0x49b0,
+ /* b8 */ 0x49e6, 0x4a24, 0x4a63, 0x4aa3, 0x4ae2, 0x4b22, 0x4b47, 0x4b85,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00414 ***/
+
+ /* 80 */ 0x4bc5, 0x4c04, 0x4c44, 0x4c83, 0x4cc1, 0x4cf8, 0x4d31, 0x4d71,
+ /* 88 */ 0x4da7, 0x4de7, 0x4e27, 0x4e61, 0x4e9e, 0x4ed6, 0x4f15, 0x4f52,
+ /* 90 */ 0x4f8e, 0x4fca, 0x0000, 0x0000, 0x0000, 0x500a, 0x504a, 0x5087,
+ /* 98 */ 0x50ab, 0x50eb, 0x5129, 0x5169, 0x51a9, 0x51e7, 0x5222, 0x525c,
+ /* a0 */ 0x529c, 0x52d8, 0x5308, 0x5344, 0x5383, 0x53be, 0x53e8, 0x5427,
+ /* a8 */ 0x5467, 0x54a7, 0x54d2, 0x550b, 0x553a, 0x5579, 0x55ab, 0x55e2,
+ /* b0 */ 0x5615, 0x5651, 0x0000, 0x566c, 0x56a3, 0x56df, 0x5712, 0x574e,
+ /* b8 */ 0x5789, 0x57a8, 0x57e8, 0x5827, 0x5860, 0x589c, 0x58d4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: eaxx - offset 0x00453 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x5914, 0x5954, 0x5994, 0x59d3, 0x5a13, 0x5a50, 0x5a90, 0x5ad0,
+ /* b8 */ 0x5b10, 0x5b50, 0x5b8e, 0x5bce, 0x5c0b, 0x5c4b, 0x5c8b, 0x5ccb,
+
+ /*** Three byte table, byte #2: ebxx - offset 0x00493 ***/
+
+ /* 80 */ 0x5d0b, 0x5d47, 0x5d87, 0x5dc4, 0x5dfc, 0x5e3c, 0x5e7c, 0x5eb0,
+ /* 88 */ 0x5eee, 0x5f2b, 0x5f68, 0x5fa0, 0x5fe0, 0x600c, 0x604c, 0x6088,
+ /* 90 */ 0x60c5, 0x60fa, 0x613a, 0x617a, 0x61b3, 0x61f3, 0x6215, 0x6255,
+ /* 98 */ 0x6285, 0x62bd, 0x62e6, 0x6318, 0x6358, 0x6394, 0x63d4, 0x640d,
+ /* a0 */ 0x644d, 0x648d, 0x64ca, 0x650a, 0x6548, 0x6588, 0x65c5, 0x6605,
+ /* a8 */ 0x6645, 0x6685, 0x66c2, 0x6700, 0x6740, 0x677f, 0x67b7, 0x67f7,
+ /* b0 */ 0x6837, 0x6877, 0x68b3, 0x68f3, 0x6930, 0x6970, 0x69b0, 0x69e9,
+ /* b8 */ 0x6a29, 0x6a65, 0x6aa5, 0x6ad5, 0x6b14, 0x6b54, 0x6b80, 0x6bbb,
+
+ /*** Three byte table, byte #2: ecxx - offset 0x004d3 ***/
+
+ /* 80 */ 0x6bdd, 0x6c1a, 0x6c4a, 0x6c8a, 0x6cca, 0x6d0a, 0x6d45, 0x6d83,
+ /* 88 */ 0x6dc3, 0x6dfb, 0x6e3b, 0x6e75, 0x6eb5, 0x6ef0, 0x6f2e, 0x6f6e,
+ /* 90 */ 0x6fa7, 0x6fe5, 0x7025, 0x7062, 0x70a2, 0x70e0, 0x7120, 0x715f,
+ /* 98 */ 0x719f, 0x71df, 0x721f, 0x725f, 0x729d, 0x72dd, 0x731c, 0x735c,
+ /* a0 */ 0x739c, 0x73dc, 0x741c, 0x745a, 0x749a, 0x74cf, 0x750c, 0x754c,
+ /* a8 */ 0x758c, 0x75c0, 0x75fe, 0x763e, 0x7676, 0x76b5, 0x76ef, 0x7728,
+ /* b0 */ 0x775c, 0x779b, 0x77d1, 0x780e, 0x784d, 0x7887, 0x78c0, 0x78fc,
+ /* b8 */ 0x793a, 0x7970, 0x79ad, 0x79ec, 0x7a2c, 0x7a65, 0x7aa5, 0x7ae1,
+
+ /*** Three byte table, byte #2: edxx - offset 0x00513 ***/
+
+ /* 80 */ 0x7b21, 0x7b5e, 0x7b9d, 0x7bdd, 0x7c16, 0x7c56, 0x7c93, 0x7cd3,
+ /* 88 */ 0x7d0c, 0x7d4c, 0x7d8c, 0x7dcc, 0x7e0c, 0x7e4a, 0x7e8a, 0x7ec7,
+ /* 90 */ 0x7f07, 0x7f47, 0x7f87, 0x7fbb, 0x7ff9, 0x8039, 0x8076, 0x80ae,
+ /* 98 */ 0x80ee, 0x812e, 0x816b, 0x81a7, 0x81e7, 0x8224, 0x8263,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x00532 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x82a3, 0x82e3, 0x8323, 0x8363,
+ /* a8 */ 0x83a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x83e2, 0x8422, 0x0000, 0x8462,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00572 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1aa, 0x0000, 0x0000,
+ /* 98 */ 0xa1ae, 0xa1af, 0x0000, 0x0000, 0xa1b0, 0xa1b1, 0x0000, 0x0000,
+ /* a0 */ 0xa2d3, 0xa2d4, 0x0000, 0x0000, 0x0000, 0xa1a5, 0xa1a6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa2b6, 0x0000, 0xa1c7, 0xa1c8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1d8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e281xx - offset 0x005ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9f9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9fa,
+
+ /*** Three byte table, leaf: e282xx - offset 0x005ee ***/
+
+ /* 80 */ 0x0000, 0xa9fb, 0xa9fc, 0xa9fd, 0xa9fe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x0062b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xa1c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa2b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa7a4, 0x0000, 0x0000, 0xa2e0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa2e5, 0xa2e2, 0x0000, 0x0000, 0x0000, 0xa7d9, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa1ca, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00658 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa8f7, 0xa8f8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa8fb, 0xa8fc, 0xa8fd, 0xa8fe, 0x0000,
+ /* a0 */ 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7,
+ /* a8 */ 0xa5b8, 0xa5b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7, 0xa5a8,
+ /* b8 */ 0xa5a9, 0xa5aa,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00692 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa1e7, 0xa1e8, 0xa1e6, 0xa1e9, 0xa1ea, 0xa2d5, 0xa2d8, 0xa2d6,
+ /* 98 */ 0xa2d9, 0xa2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x006c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa2a1, 0x0000, 0xa2a2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x00700 ***/
+
+ /* 80 */ 0xa2a3, 0x0000, 0xa1d3, 0xa2a4, 0x0000, 0x0000, 0x0000, 0xa1d4,
+ /* 88 */ 0xa1f4, 0x0000, 0x0000, 0xa1f5, 0x0000, 0x0000, 0x0000, 0xa2b3,
+ /* 90 */ 0x0000, 0xa2b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa1ee, 0x0000, 0x0000, 0xa1f0, 0xa1c4, 0x0000,
+ /* a0 */ 0xa1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ab, 0x0000, 0xa1fc,
+ /* a8 */ 0xa1fd, 0xa1fb, 0xa1fa, 0xa1f2, 0xa1f3, 0x0000, 0xa2b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c5, 0xa1f1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ad, 0xa1ef,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0073e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1c1, 0xa1d5, 0x0000, 0x0000, 0xa1c2, 0xa1c3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xa1ec, 0xa1ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x0077c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xa1f8, 0xa1f9, 0x0000, 0x0000, 0xa1f6, 0xa1f7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa2c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x007aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x007ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8e7, 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, 0xa8ed, 0xa8ee,
+ /* a8 */ 0xa8ef, 0xa8f0, 0xa8f1, 0xa8f2, 0xa8f3, 0xa8f4, 0xa8f5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9e7, 0xa9e8, 0xa9e9, 0xa9ea,
+ /* b8 */ 0xa9eb, 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0xa9f0, 0xa9f1, 0xa9f2,
+
+ /*** Three byte table, leaf: e292xx - offset 0x0080a ***/
+
+ /* 80 */ 0xa9f3, 0xa9f4, 0xa9f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0,
+ /* a0 */ 0xa9d1, 0xa9d2, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8,
+ /* a8 */ 0xa9d9, 0xa9da, 0xa9db, 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0,
+ /* b0 */ 0xa9e1, 0xa9e2, 0xa9e3, 0xa9e4, 0xa9e5, 0xa9e6,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e293xx - offset 0x00840 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa8cd, 0xa8ce, 0xa8cf, 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4,
+ /* 98 */ 0xa8d5, 0xa8d6, 0xa8d7, 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc,
+ /* a0 */ 0xa8dd, 0xa8de, 0xa8df, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4,
+ /* a8 */ 0xa8e5, 0xa8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00880 ***/
+
+ /* 80 */ 0xa6a1, 0xa6ac, 0xa6a2, 0xa6ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa6a3, 0xa6c8, 0xa6c7, 0xa6ae,
+ /* 90 */ 0xa6a4, 0xa6c2, 0xa6c1, 0xa6af, 0xa6a6, 0xa6c6, 0xa6c5, 0xa6b1,
+ /* 98 */ 0xa6a5, 0xa6c4, 0xa6c3, 0xa6b0, 0xa6a7, 0xa6bc, 0xa6c9, 0xa6ca,
+ /* a0 */ 0xa6b7, 0xa6cb, 0xa6cc, 0xa6b2, 0xa6a9, 0xa6be, 0xa6cd, 0xa6ce,
+ /* a8 */ 0xa6b9, 0xa6cf, 0xa6d0, 0xa6b4, 0xa6a8, 0xa6d1, 0xa6d2, 0xa6b8,
+ /* b0 */ 0xa6bd, 0xa6d3, 0xa6d4, 0xa6b3, 0xa6aa, 0xa6d5, 0xa6d6, 0xa6ba,
+ /* b8 */ 0xa6bf, 0xa6d7, 0xa6d8, 0xa6b5, 0xa6ab, 0xa6d9, 0xa6da, 0xa6bb,
+
+ /*** Three byte table, leaf: e295xx - offset 0x008c0 ***/
+
+ /* 80 */ 0xa6db, 0xa6dc, 0xa6c0, 0xa6dd, 0xa6de, 0xa6df, 0xa6e0, 0xa6e1,
+ /* 88 */ 0xa6e2, 0xa6e3, 0xa6e4, 0xa6b6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x008ee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa2c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1e1, 0xa1e0, 0x0000, 0xa2c3, 0xa2c7, 0xa2c8, 0xa2cb, 0xa2ca,
+ /* a8 */ 0xa2c9, 0xa2cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1e3, 0xa1e2, 0x0000, 0x0000, 0xa2ba, 0xa2b9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e5, 0xa1e4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e297xx - offset 0x0092e ***/
+
+ /* 80 */ 0xa2b8, 0xa2b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1df, 0xa1de,
+ /* 88 */ 0xa2c2, 0x0000, 0x0000, 0xa1db, 0x0000, 0x0000, 0xa1dd, 0xa1dc,
+ /* 90 */ 0xa2c4, 0xa2c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x00969 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1da, 0xa1d9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2cf, 0xa2ce,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2d0, 0x0000, 0xa2d1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x009a9 ***/
+
+ /* 80 */ 0xa1cf, 0x0000, 0xa1ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2bc, 0xa2bd, 0x0000, 0xa2c0, 0xa2bb, 0xa2be, 0x0000, 0xa2bf,
+ /* a8 */ 0xa2cd, 0xa2db, 0xa2dc, 0x0000, 0xa2dd, 0xa2da, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x009e9 ***/
+
+ /* 80 */ 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
+ /* 90 */ 0xa1bc, 0xa1bd, 0x0000, 0xa1eb, 0xa1b2, 0xa1b3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00a28 ***/
+
+ /* 80 */ 0x0000, 0xaaa1, 0xaaa2, 0xaaa3, 0xaaa4, 0xaaa5, 0xaaa6, 0xaaa7,
+ /* 88 */ 0xaaa8, 0xaaa9, 0xaaaa, 0xaaab, 0xaaac, 0xaaad, 0xaaae, 0xaaaf,
+ /* 90 */ 0xaab0, 0xaab1, 0xaab2, 0xaab3, 0xaab4, 0xaab5, 0xaab6, 0xaab7,
+ /* 98 */ 0xaab8, 0xaab9, 0xaaba, 0xaabb, 0xaabc, 0xaabd, 0xaabe, 0xaabf,
+ /* a0 */ 0xaac0, 0xaac1, 0xaac2, 0xaac3, 0xaac4, 0xaac5, 0xaac6, 0xaac7,
+ /* a8 */ 0xaac8, 0xaac9, 0xaaca, 0xaacb, 0xaacc, 0xaacd, 0xaace, 0xaacf,
+ /* b0 */ 0xaad0, 0xaad1, 0xaad2, 0xaad3, 0xaad4, 0xaad5, 0xaad6, 0xaad7,
+ /* b8 */ 0xaad8, 0xaad9, 0xaada, 0xaadb, 0xaadc, 0xaadd, 0xaade, 0xaadf,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00a68 ***/
+
+ /* 80 */ 0xaae0, 0xaae1, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7,
+ /* 88 */ 0xaae8, 0xaae9, 0xaaea, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef,
+ /* 90 */ 0xaaf0, 0xaaf1, 0xaaf2, 0xaaf3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xaba1, 0xaba2, 0xaba3, 0xaba4, 0xaba5, 0xaba6, 0xaba7,
+ /* a8 */ 0xaba8, 0xaba9, 0xabaa, 0xabab, 0xabac, 0xabad, 0xabae, 0xabaf,
+ /* b0 */ 0xabb0, 0xabb1, 0xabb2, 0xabb3, 0xabb4, 0xabb5, 0xabb6, 0xabb7,
+ /* b8 */ 0xabb8, 0xabb9, 0xabba, 0xabbb, 0xabbc, 0xabbd, 0xabbe, 0xabbf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00aa8 ***/
+
+ /* 80 */ 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc4, 0xabc5, 0xabc6, 0xabc7,
+ /* 88 */ 0xabc8, 0xabc9, 0xabca, 0xabcb, 0xabcc, 0xabcd, 0xabce, 0xabcf,
+ /* 90 */ 0xabd0, 0xabd1, 0xabd2, 0xabd3, 0xabd4, 0xabd5, 0xabd6, 0xabd7,
+ /* 98 */ 0xabd8, 0xabd9, 0xabda, 0xabdb, 0xabdc, 0xabdd, 0xabde, 0xabdf,
+ /* a0 */ 0xabe0, 0xabe1, 0xabe2, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7,
+ /* a8 */ 0xabe8, 0xabe9, 0xabea, 0xabeb, 0xabec, 0xabed, 0xabee, 0xabef,
+ /* b0 */ 0xabf0, 0xabf1, 0xabf2, 0xabf3, 0xabf4, 0xabf5, 0xabf6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x00adf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7,
+ /* b8 */ 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af,
+
+ /*** Three byte table, leaf: e385xx - offset 0x00b1f ***/
+
+ /* 80 */ 0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7,
+ /* 88 */ 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf,
+ /* 90 */ 0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7,
+ /* 98 */ 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf,
+ /* a0 */ 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7,
+ /* a8 */ 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df,
+ /* b0 */ 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7,
+ /* b8 */ 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef,
+
+ /*** Three byte table, leaf: e386xx - offset 0x00b5f ***/
+
+ /* 80 */ 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0xa4f4, 0xa4f5, 0xa4f6, 0xa4f7,
+ /* 88 */ 0xa4f8, 0xa4f9, 0xa4fa, 0xa4fb, 0xa4fc, 0xa4fd, 0xa4fe, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e388xx - offset 0x00b9f ***/
+
+ /* 80 */ 0xa9b1, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8,
+ /* 88 */ 0xa9b9, 0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0,
+ /* 90 */ 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8,
+ /* 98 */ 0xa9c9, 0xa9ca, 0xa9cb, 0xa9cc, 0xa2df, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e389xx - offset 0x00bbf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8b1, 0xa8b2, 0xa8b3, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8,
+ /* a8 */ 0xa8b9, 0xa8ba, 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, 0xa8c0,
+ /* b0 */ 0xa8c1, 0xa8c2, 0xa8c3, 0xa8c4, 0xa8c5, 0xa8c6, 0xa8c7, 0xa8c8,
+ /* b8 */ 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0x0000, 0x0000, 0xa2e8, 0xa2de,
+
+ /*** Three byte table, leaf: e38exx - offset 0x00bff ***/
+
+ /* 80 */ 0xa7c9, 0xa7ca, 0xa7cb, 0xa7cc, 0xa7cd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa7ba, 0xa7bb, 0xa7dc, 0xa7dd, 0xa7de, 0xa7b6, 0xa7b7, 0xa7b8,
+ /* 90 */ 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d7, 0xa7d8, 0xa7a1, 0xa7a2, 0xa7a3,
+ /* 98 */ 0xa7a5, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1,
+ /* a0 */ 0xa7b2, 0xa7b3, 0xa7b4, 0xa7a7, 0xa7a8, 0xa7a9, 0xa7aa, 0xa7bd,
+ /* a8 */ 0xa7be, 0xa7e5, 0xa7e6, 0xa7e7, 0xa7e8, 0xa7e1, 0xa7e2, 0xa7e3,
+ /* b0 */ 0xa7bf, 0xa7c0, 0xa7c1, 0xa7c2, 0xa7c3, 0xa7c4, 0xa7c5, 0xa7c6,
+ /* b8 */ 0xa7c7, 0xa7c8, 0xa7ce, 0xa7cf, 0xa7d0, 0xa7d1, 0xa7d2, 0xa7d3,
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00c3f ***/
+
+ /* 80 */ 0xa7da, 0xa7db, 0xa2e3, 0xa7ec, 0xa7a6, 0xa7e0, 0xa7ef, 0xa2e1,
+ /* 88 */ 0xa7bc, 0xa7ed, 0xa7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7b9,
+ /* 90 */ 0xa7ea, 0x0000, 0x0000, 0xa7eb, 0x0000, 0x0000, 0xa7df, 0x0000,
+ /* 98 */ 0xa2e4, 0x0000, 0x0000, 0xa7e4, 0xa7ee, 0xa7e9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00c7f ***/
+
+ /* 80 */ 0xece9, 0xefcb, 0x0000, 0xf6d2, 0x0000, 0x0000, 0x0000, 0xd8b2,
+ /* 88 */ 0xeddb, 0xdfb2, 0xdfbe, 0xf9bb, 0x0000, 0xdcf4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5e4, 0x0000, 0x0000, 0xf3a6, 0xdde0, 0xe1a6, 0x0000,
+ /* 98 */ 0xcef8, 0xdcb0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3aa, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcdfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfcaf, 0xd3a1, 0x0000, 0xf1ab, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00cbd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7d1, 0xd2ac, 0x0000, 0xcef9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf1fd, 0x0000, 0xdebf, 0xfbba, 0xf9b9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xced2, 0x0000,
+ /* 98 */ 0xe3ab, 0xebe0, 0x0000, 0x0000, 0x0000, 0xcefa, 0xcbf7, 0xe5a5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcae1, 0x0000, 0xd4cc, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeae1, 0x0000, 0x0000, 0xdce3, 0xdfad,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbeb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00cfc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5af, 0x0000, 0x0000, 0x0000, 0xd6f5, 0x0000,
+ /* 88 */ 0xe5f8, 0x0000, 0x0000, 0xdec0, 0xeca3, 0x0000, 0xe9cd, 0x0000,
+ /* 90 */ 0xeaa7, 0xe9f6, 0xfbbb, 0x0000, 0xe7e9, 0xefcc, 0x0000, 0x0000,
+ /* 98 */ 0xd0e6, 0x0000, 0x0000, 0xdec1, 0x0000, 0x0000, 0xe4ac, 0x0000,
+ /* a0 */ 0x0000, 0xd8cc, 0xf9f1, 0x0000, 0xcedf, 0xfaa4, 0xe6b2, 0x0000,
+ /* a8 */ 0xfafb, 0x0000, 0x0000, 0xfabd, 0xccc8, 0xefcd, 0xd5d5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xecd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00d3c ***/
+
+ /* 80 */ 0xe4a7, 0xecd2, 0x0000, 0x0000, 0xf6b1, 0x0000, 0x0000, 0xcefb,
+ /* 88 */ 0x0000, 0x0000, 0xd0d1, 0xcbbf, 0x0000, 0xeda4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeda8, 0xdec2, 0xf6e2, 0xeddc,
+ /* 98 */ 0xdcf5, 0xe0b9, 0x0000, 0x0000, 0x0000, 0xd4ce, 0x0000, 0xf4b5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd3db, 0xd6b5, 0xeca4, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe4e6, 0x0000, 0xf1ea, 0x0000, 0x0000, 0x0000, 0xcbec, 0xcbc0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xecf2, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00d7b ***/
+
+ /* 80 */ 0x0000, 0xd0ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf9f2, 0xeca5, 0xd0df, 0x0000, 0xe7ea, 0xd0eb, 0xdcd1,
+ /* 90 */ 0xdbe9, 0xfdcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbd7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdae1, 0x0000, 0xd6b6, 0x0000,
+ /* b8 */ 0xe3df, 0x0000, 0xdec3, 0x0000, 0xdec4, 0xcaa1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00db9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeeec, 0x0000, 0x0000, 0xd3a3, 0xeeb7,
+ /* 88 */ 0xf8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac8, 0xeeb8, 0xf1ac,
+ /* 90 */ 0xf1a5, 0xe9ce, 0x0000, 0x0000, 0x0000, 0xf9bc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe5f9, 0xecea, 0xddd6, 0xedc2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ba,
+ /* b0 */ 0xdbd8, 0x0000, 0x0000, 0xcaa2, 0x0000, 0x0000, 0xd1cd, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xeeed, 0x0000, 0x0000, 0x0000, 0xeceb, 0xdec5,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00df9 ***/
+
+ /* 80 */ 0x0000, 0xe3e0, 0x0000, 0xcac9, 0xf2e9, 0x0000, 0xd5ce, 0x0000,
+ /* 88 */ 0xf6b6, 0x0000, 0xcec2, 0xd6c7, 0x0000, 0xe3b4, 0x0000, 0xf1ad,
+ /* 90 */ 0x0000, 0xeae2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7c2, 0x0000,
+ /* 98 */ 0xf3a7, 0x0000, 0x0000, 0xcdea, 0x0000, 0xebee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9b2, 0xfda5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d5, 0xd5e2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b5,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00e39 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xccf5, 0xf5b5, 0xe4ad, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe7eb, 0xf1d5, 0x0000, 0x0000, 0x0000, 0xf0bb, 0x0000,
+ /* 90 */ 0x0000, 0xe9b5, 0x0000, 0xccc9, 0xfad5, 0x0000, 0x0000, 0xe1d4,
+ /* 98 */ 0x0000, 0x0000, 0xd7d6, 0x0000, 0x0000, 0xdcc1, 0x0000, 0xdec6,
+ /* a0 */ 0xfaef, 0xe3e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f3, 0xdcf6,
+ /* b0 */ 0x0000, 0xcefc, 0x0000, 0xdbc4, 0x0000, 0xf8f1, 0x0000, 0x0000,
+ /* b8 */ 0xdce4, 0x0000, 0xe5ef, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e580xx - offset 0x00e77 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdcb1, 0x0000, 0x0000, 0x0000, 0xd5d6, 0x0000,
+ /* 88 */ 0x0000, 0xf3da, 0x0000, 0xcbc1, 0x0000, 0xdbc3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9fa, 0xd3ee, 0x0000, 0x0000, 0x0000, 0xfab8, 0x0000,
+ /* 98 */ 0x0000, 0xfda6, 0xebef, 0x0000, 0xf4a6, 0x0000, 0xccca, 0xf3a8,
+ /* a0 */ 0x0000, 0xf3db, 0x0000, 0xdba7, 0xf6b7, 0x0000, 0xcfe6, 0xf0f2,
+ /* a8 */ 0xcbda, 0x0000, 0xe7d2, 0xd7c3, 0xf6f0, 0xe8de, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe5a6, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e581xx - offset 0x00eb4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe5e7, 0x0000, 0x0000, 0x0000, 0xcaa3,
+ /* 88 */ 0xcca7, 0xeac9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b6,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaa5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1ae, 0x0000, 0xefce, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbed, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6b0, 0xefcf, 0xe9cf, 0x0000,
+ /* b8 */ 0xf7de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00ef4 ***/
+
+ /* 80 */ 0xced3, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcf7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdba8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcbf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xdfa1, 0xdde1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ca, 0xe9b6, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe7ec, 0xeeee, 0x0000, 0xf3f0, 0x0000, 0xdfbf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcccb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x00f33 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf4d2, 0xe0ba, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfc0,
+ /* 90 */ 0x0000, 0xcee0, 0x0000, 0x0000, 0x0000, 0xdcd2, 0xfdea, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6f6, 0x0000, 0x0000, 0x0000, 0xeaca, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e9, 0x0000, 0xe3ac,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3d0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xcaa4, 0x0000, 0xdbf8, 0x0000, 0x0000, 0x0000, 0xdec7,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00f73 ***/
+
+ /* 80 */ 0xebf0, 0xf1d6, 0x0000, 0x0000, 0xe5e2, 0x0000, 0xcccc, 0x0000,
+ /* 88 */ 0x0000, 0xcbfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeae3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfc1,
+ /* a0 */ 0x0000, 0xd6ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe9d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeeb9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e3,
+ /* b8 */ 0x0000, 0x0000, 0xd1d3, 0x0000, 0xe5f0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00fb3 ***/
+
+ /* 80 */ 0xe8b4, 0xebc3, 0x0000, 0xeaaa, 0xfafc, 0xf5f6, 0xf0bc, 0xfdd4,
+ /* 88 */ 0xe0bb, 0xcec3, 0x0000, 0xd0ba, 0xf7ba, 0xd8f3, 0xf7cd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe4ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4df, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd0e7, 0x0000, 0x0000, 0xecfd, 0x0000, 0xd2ae,
+ /* a8 */ 0xeeef, 0xd5d7, 0xeae4, 0xf8a2, 0xcdeb, 0xd7bf, 0xfbb1, 0x0000,
+ /* b0 */ 0x0000, 0xcdec, 0x0000, 0x0000, 0x0000, 0xdcb2, 0xd0ec, 0xcefd,
+ /* b8 */ 0xeef0, 0x0000, 0x0000, 0x0000, 0xccc2, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00ff3 ***/
+
+ /* 80 */ 0xd0ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3fc, 0x0000, 0x0000, 0xeea2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd9b3, 0x0000, 0x0000, 0xd8f4, 0x0000, 0xe9b7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xceae, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd8f1, 0x0000, 0xd4cf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a7, 0xd5d2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a9,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x01031 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a2, 0x0000, 0xf1d7, 0x0000,
+ /* 88 */ 0x0000, 0xd5d8, 0x0000, 0xf0bd, 0xd7d0, 0xd4d0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7cf, 0xebea, 0xfdeb, 0x0000,
+ /* a0 */ 0x0000, 0xdbed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcc5, 0xcbc2, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd5, 0x0000,
+ /* b8 */ 0xf4c8, 0xe8ea, 0xf5f3, 0x0000, 0x0000, 0xf9de, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x01071 ***/
+
+ /* 80 */ 0xd3ef, 0x0000, 0x0000, 0xecd3, 0x0000, 0x0000, 0xddc2, 0xefb7,
+ /* 88 */ 0xe7d4, 0x0000, 0xcaca, 0x0000, 0x0000, 0x0000, 0xd9fb, 0x0000,
+ /* 90 */ 0x0000, 0xfafd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6aa,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f7, 0xdcac, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd7d7, 0xdfa2, 0x0000, 0x0000, 0x0000, 0xcebe, 0x0000,
+ /* b0 */ 0xd3f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a4, 0xe1ec,
+ /* b8 */ 0xcfe7, 0xf3cb, 0xeda9, 0xcabe, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x010ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf4ef, 0x0000, 0x0000, 0x0000, 0xf6ce,
+ /* 88 */ 0x0000, 0x0000, 0xdefb, 0xd0bb, 0xd5b7, 0xeef1, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a8, 0x0000, 0xdcf8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcba7, 0x0000, 0xdace, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe0e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeda5, 0xeef2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcf9,
+ /* b0 */ 0x0000, 0x0000, 0xf9dc, 0x0000, 0x0000, 0xf3dc, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8f2, 0x0000, 0xf4f9,
+
+ /*** Three byte table, leaf: e58axx - offset 0x010ee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfcf1, 0x0000, 0x0000, 0x0000, 0xd0bc,
+ /* 88 */ 0xdbf9, 0xd7b1, 0x0000, 0x0000, 0x0000, 0xcbfc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf0a5, 0xcbfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5f4, 0x0000, 0x0000, 0x0000, 0xcded,
+ /* a0 */ 0xcaa5, 0x0000, 0x0000, 0xd6ab, 0xd0c2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf0be, 0xd2bd, 0xcca4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfab6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58bxx - offset 0x0112d ***/
+
+ /* 80 */ 0x0000, 0xcccd, 0x0000, 0xdafa, 0x0000, 0xf6cf, 0x0000, 0xe9b8,
+ /* 88 */ 0x0000, 0xd8f5, 0x0000, 0x0000, 0x0000, 0xccce, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd7cd, 0x0000, 0x0000, 0xd4d1, 0xe9ed, 0x0000,
+ /* 98 */ 0xcaeb, 0xd9e2, 0x0000, 0xfdb2, 0x0000, 0xe3ad, 0xd6cc, 0xd9b4,
+ /* a0 */ 0x0000, 0x0000, 0xe1a7, 0xeed3, 0xd0c3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfdb3, 0x0000, 0xd5e4, 0x0000, 0x0000,
+ /* b8 */ 0xcfe8, 0x0000, 0xedc3, 0xd0b2, 0x0000, 0x0000, 0xcefe, 0xdaa8,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x0116d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d0, 0x0000, 0x0000,
+ /* 88 */ 0xfdd6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d1, 0x0000, 0xf8d2,
+ /* 90 */ 0xdcd3, 0x0000, 0x0000, 0x0000, 0x0000, 0xdde2, 0xfbf9, 0xddc1,
+ /* 98 */ 0x0000, 0xe3b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeddd, 0xcec4, 0x0000, 0xcba1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdde3, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcdd,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2fb,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x011ad ***/
+
+ /* 80 */ 0xcfa1, 0xe4a8, 0x0000, 0xf4b6, 0xecfe, 0x0000, 0x0000, 0xe3ae,
+ /* 88 */ 0xe7ed, 0xfdc1, 0xdae2, 0x0000, 0x0000, 0xd8b3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdde4, 0xf0ef, 0xf6f1, 0xfaf0, 0x0000, 0x0000, 0xd1f5,
+ /* 98 */ 0x0000, 0x0000, 0xdacf, 0x0000, 0xdcd4, 0x0000, 0xdca6, 0x0000,
+ /* a0 */ 0xefbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcecf, 0x0000,
+ /* a8 */ 0xe0d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d6,
+ /* b0 */ 0xecd4, 0xeacb, 0x0000, 0x0000, 0xcabf, 0xd5b0, 0x0000, 0xcfe9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ed, 0x0000, 0xcccf,
+
+ /*** Three byte table, leaf: e58exx - offset 0x011ed ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe4ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd7d8, 0x0000, 0xfda7, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaab,
+ /* a0 */ 0xf6b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff0, 0xf9bd, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xcbdb, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x0122a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf3d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe9d1, 0xf3a9, 0xd0e0, 0xe9d2, 0x0000, 0xdae3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d2, 0x0000, 0xf6a2, 0xe1f4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdae4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe7d5, 0xf5bf, 0xcfa2, 0xcdaf, 0xcfa3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcdb0, 0xf1fe, 0xd0a3, 0xe1af, 0xf8a3, 0x0000, 0xcaa6,
+ /* b0 */ 0xf7bb, 0xf2ea, 0xdec8, 0xe9d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdec9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x01267 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfdde, 0xcac0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9ea, 0xd1ce, 0xeed4, 0x0000, 0xd4d2, 0xd9a3, 0xfda8, 0xd7d9,
+ /* 90 */ 0xf7ce, 0xfabe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcfd6, 0x0000, 0xd7f0, 0x0000, 0xebe1,
+ /* a0 */ 0xf8c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcfa, 0x0000,
+ /* a8 */ 0x0000, 0xddc3, 0x0000, 0xf9df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe7ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfde5, 0xf6a3, 0x0000, 0xd9fc, 0xfda9, 0x0000, 0xe7ee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e591xx - offset 0x012a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xefd0, 0x0000, 0xcdb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1b2, 0x0000, 0xf1b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcdb2, 0x0000, 0xdaab, 0x0000, 0xcaa7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe3e2, 0xfbbc, 0xd9a4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e592xx - offset 0x012e6 ***/
+
+ /* 80 */ 0xeeba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d3, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfa, 0x0000, 0xcfa4, 0x0000,
+ /* 90 */ 0xdcfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xedaa, 0x0000, 0x0000, 0xf2a1, 0xcee1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfaa6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf9e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd6, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01326 ***/
+
+ /* 80 */ 0xe4ee, 0xf9a1, 0x0000, 0x0000, 0xfbef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9eb, 0xeea3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeaac, 0x0000, 0x0000, 0x0000, 0xcaa8, 0x0000, 0x0000,
+ /* a8 */ 0xf4fa, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd6, 0xfcf6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf4c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf8d4, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e594xx - offset 0x01362 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8a6, 0x0000, 0xdeca, 0xf2c6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7da, 0x0000,
+ /* 90 */ 0xd3d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8c5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeae6,
+ /* b0 */ 0x0000, 0xf3dd, 0x0000, 0x0000, 0x0000, 0xe4da, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e595xx - offset 0x013a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f2, 0x0000, 0xdfc2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9fd,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xccf6, 0x0000, 0x0000, 0xd3ba, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4af, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf9e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a6, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x013e1 ***/
+
+ /* 80 */ 0xcbd3, 0x0000, 0x0000, 0x0000, 0xe0bc, 0x0000, 0xf4ca, 0xd4fa,
+ /* 88 */ 0x0000, 0xfdaa, 0xf9e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf4b7, 0xfdc2, 0xfcb0, 0x0000, 0xfdec, 0xcae2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdbd,
+ /* a8 */ 0x0000, 0xeae7, 0xdfc3, 0xd1d2, 0xcee2, 0x0000, 0xd3a4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e597xx - offset 0x0141c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdab, 0x0000, 0xdfe0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe7f0, 0x0000, 0xd0ee, 0x0000, 0x0000, 0xf3aa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdecb, 0xf6b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f5, 0xf1b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x0145b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a3, 0x0000,
+ /* 88 */ 0x0000, 0xcaa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa5, 0x0000, 0x0000, 0xdfc4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b0,
+ /* b0 */ 0x0000, 0x0000, 0xf0bf, 0x0000, 0xf6a4, 0x0000, 0xe3b6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e599xx - offset 0x01492 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfac6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd0ef, 0x0000, 0x0000, 0xfded, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddc4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59axx - offset 0x014cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcf7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6bf, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdead, 0x0000, 0xfabf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedc4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59bxx - offset 0x01509 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd2a5, 0x0000, 0x0000, 0xfdee, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe1f6, 0xdecc, 0x0000, 0x0000, 0xfcde, 0x0000,
+ /* a0 */ 0xecd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xcddd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd6b7, 0xcdb3, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59cxx - offset 0x01546 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf8d5, 0xe5d8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcfea, 0x0000, 0x0000, 0xcfd0, 0x0000, 0xeacc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeaae, 0xeaad, 0x0000, 0x0000, 0xd3f1, 0x0000,
+ /* 98 */ 0xd3a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7cf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeea4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a4, 0x0000, 0x0000,
+ /* b0 */ 0xf2a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd0f0, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01586 ***/
+
+ /* 80 */ 0xf2a3, 0x0000, 0xf7f8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b3,
+ /* 88 */ 0x0000, 0x0000, 0xdba9, 0x0000, 0x0000, 0xd3bb, 0xcaec, 0x0000,
+ /* 90 */ 0xf1a6, 0xcbd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf7e7, 0x0000, 0x0000, 0xcdde, 0x0000, 0xf7a4, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8c0, 0x0000, 0x0000, 0x0000, 0xd3dd, 0x0000,
+ /* b0 */ 0xccd0, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f3, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59exx - offset 0x015c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd3dc, 0x0000, 0x0000, 0xfafe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfaa7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xebd9, 0x0000, 0xcfa7, 0xeaaf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59fxx - offset 0x01601 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4ef, 0x0000, 0x0000, 0x0000, 0xe9b9,
+ /* 88 */ 0xf1d8, 0x0000, 0x0000, 0xd8d8, 0x0000, 0x0000, 0xe0f2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6b4,
+ /* a0 */ 0xdcfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf3f1, 0x0000, 0x0000, 0x0000, 0xe3d0, 0x0000, 0x0000, 0xf2fb,
+ /* b8 */ 0x0000, 0xdbc6, 0xd0f1, 0x0000, 0xd0f2, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x01641 ***/
+
+ /* 80 */ 0xcfdc, 0x0000, 0xd3d1, 0x0000, 0x0000, 0xccb1, 0xf7d8, 0x0000,
+ /* 88 */ 0xcba8, 0xebbc, 0xe4be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4dc, 0x0000,
+ /* a0 */ 0x0000, 0xdcc2, 0x0000, 0x0000, 0xf0a7, 0x0000, 0x0000, 0xe6c0,
+ /* a8 */ 0x0000, 0x0000, 0xcaed, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8eb,
+ /* b0 */ 0xe5e8, 0xdcc3, 0x0000, 0x0000, 0xedde, 0xd3f2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xccf7,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x0167c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xced4, 0xe7ab, 0x0000, 0x0000, 0x0000, 0xcbc3,
+ /* 90 */ 0x0000, 0xe1b1, 0x0000, 0x0000, 0xf7b2, 0x0000, 0x0000, 0xd3f3,
+ /* 98 */ 0xd3d2, 0x0000, 0xf5c0, 0x0000, 0x0000, 0x0000, 0xdfdd, 0x0000,
+ /* a0 */ 0x0000, 0xeef3, 0xe7f1, 0x0000, 0xfdb4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf3d2, 0x0000, 0x0000, 0xeef4, 0x0000, 0xe2d3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x016bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xccd1, 0x0000, 0xdfea, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe9ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd9d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5cd, 0x0000, 0xf1f2, 0xfac7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd9f8, 0xd4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xddc5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe7f2, 0xeddf, 0x0000, 0x0000, 0xcacb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x016fa ***/
+
+ /* 80 */ 0x0000, 0xdbfa, 0x0000, 0x0000, 0x0000, 0xe8b5, 0x0000, 0xd3a6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb5, 0x0000,
+ /* 90 */ 0x0000, 0xf9c9, 0x0000, 0xe4e2, 0x0000, 0xfbbd, 0x0000, 0x0000,
+ /* 98 */ 0xd7a4, 0xcec5, 0x0000, 0x0000, 0x0000, 0x0000, 0xced5, 0xd6e6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5bd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xdecd, 0xecf3, 0x0000, 0x0000, 0xede0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xecec, 0xfbbe, 0xdfeb, 0x0000, 0xe1f8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x01738 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9be,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0f3, 0xe0aa, 0xe8e2, 0x0000,
+ /* 98 */ 0x0000, 0xe2d4, 0xd2fd, 0x0000, 0xe5a8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd9d3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3de,
+ /* a8 */ 0x0000, 0xf4b8, 0xf7bc, 0xdcfd, 0x0000, 0xe8ec, 0xe4e7, 0x0000,
+ /* b0 */ 0x0000, 0xe3f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaf1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x01777 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f2, 0x0000, 0x0000, 0xd0f4,
+ /* 88 */ 0xd2af, 0xdce5, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a5, 0xf1b4,
+ /* 90 */ 0xfcb1, 0xccf8, 0x0000, 0x0000, 0xddc6, 0xfad1, 0x0000, 0xf7df,
+ /* 98 */ 0x0000, 0x0000, 0xfaa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeef5, 0x0000, 0xdece, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f3,
+ /* a8 */ 0x0000, 0x0000, 0xf7ac, 0xebc4, 0xede1, 0xe0ab, 0xddc7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd2b3, 0xd2bf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcacc, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbbf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x017b5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5fd, 0xdde5, 0xd8cd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xecf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd0f5, 0x0000, 0x0000, 0xe8ed, 0xd0d2,
+ /* 98 */ 0x0000, 0xd9d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e6, 0x0000, 0x0000,
+ /* a8 */ 0xdbaa, 0x0000, 0x0000, 0x0000, 0xf7e0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd8d9, 0x0000, 0xf4a3, 0x0000, 0x0000, 0xf4dd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x017f4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xefd1, 0x0000, 0x0000, 0xd9b5, 0x0000,
+ /* 88 */ 0x0000, 0xedab, 0x0000, 0xe3b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeebb, 0xcdb4, 0x0000, 0xe0f3, 0xeacd, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xecf5, 0xe8ee, 0x0000, 0xcba9, 0xf1af, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcacd, 0x0000,
+ /* a8 */ 0xeca9, 0x0000, 0xf2eb, 0x0000, 0xfdef, 0x0000, 0xf9f3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6c1, 0x0000, 0x0000, 0xecd8, 0x0000, 0x0000, 0x0000, 0xedac,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x01834 ***/
+
+ /* 80 */ 0x0000, 0xeace, 0x0000, 0xe8df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdecf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd2a6, 0x0000, 0x0000, 0xe7f4, 0xd1d6, 0x0000, 0x0000, 0xe6c2,
+ /* a0 */ 0xe3e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4b0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd8b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a5, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3de, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01873 ***/
+
+ /* 80 */ 0x0000, 0xd7a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e8, 0x0000,
+ /* 88 */ 0x0000, 0xe8c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfbe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdde6, 0x0000, 0x0000, 0x0000, 0xdcfe, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x018a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdaac, 0xeab0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5abxx - offset 0x018e0 ***/
+
+ /* 80 */ 0x0000, 0xcaaa, 0xe1f9, 0x0000, 0xeab1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2ec, 0x0000, 0x0000, 0xfaee, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeed5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f4, 0x0000,
+ /* a8 */ 0x0000, 0xd2ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5acxx - offset 0x0191b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfb, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfdf0, 0x0000, 0xe0bd, 0xcee3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8c6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdeae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x0195b ***/
+
+ /* 80 */ 0xdfc5, 0x0000, 0x0000, 0xe5be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xedad, 0xfaea, 0x0000, 0x0000, 0xcdee, 0xeda6, 0x0000, 0xedae,
+ /* 98 */ 0xf0ed, 0x0000, 0xdda1, 0x0000, 0xedaf, 0xfcf8, 0x0000, 0xd8eb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xccf9, 0xcdb5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfaa9, 0x0000, 0xe1dd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe2d5, 0xedcf, 0x0000, 0x0000, 0x0000, 0xdda2, 0x0000, 0x0000,
+ /* b8 */ 0xf9ca, 0x0000, 0xeae8, 0x0000, 0xe5ed,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01998 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3eb, 0x0000, 0xe9d4,
+ /* 88 */ 0xe1fa, 0xe4cc, 0x0000, 0xe1e4, 0xe8c7, 0x0000, 0x0000, 0xcedb,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xdcd5, 0x0000, 0xf7b5, 0xfcf3, 0xf0f3,
+ /* 98 */ 0xceaf, 0xf1b5, 0xefd2, 0xe8c8, 0xebf1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcbd4, 0xe0be, 0xe3f8, 0xeae9, 0xfcb2, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f4, 0x0000, 0xcfe0, 0x0000,
+ /* b0 */ 0xeea5, 0x0000, 0x0000, 0xfaaa, 0xe6c3, 0xe1b2, 0xcaab, 0x0000,
+ /* b8 */ 0xe3e4, 0xe9bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d6,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x019d8 ***/
+
+ /* 80 */ 0xf3f2, 0x0000, 0xeed6, 0xeab2, 0xd0f6, 0xecd9, 0xdacb, 0xcfa8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdda3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd8db, 0x0000, 0xf9ce, 0xe9d5, 0xe3d1, 0x0000, 0x0000, 0xd2bc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ac, 0xf3cc,
+ /* a0 */ 0x0000, 0xcdfb, 0xf6d6, 0x0000, 0xe7f5, 0xe8ef, 0xe3f9, 0xd2bb,
+ /* a8 */ 0xf3f3, 0xe3fb, 0x0000, 0xded0, 0xceb0, 0x0000, 0xd6f7, 0xf1d9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c1, 0xdcc4, 0x0000,
+ /* b8 */ 0xf5bb, 0x0000, 0xded1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x01a17 ***/
+
+ /* 80 */ 0x0000, 0xdce6, 0x0000, 0x0000, 0xded2, 0x0000, 0x0000, 0xede2,
+ /* 88 */ 0xeef6, 0xeacf, 0xf0ee, 0xe3fc, 0x0000, 0xd3df, 0xd3f4, 0xe1b3,
+ /* 90 */ 0x0000, 0xe1b4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d3, 0x0000,
+ /* 98 */ 0x0000, 0xdfc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9d6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdbab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf6a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe3b9, 0xebc5, 0xf4a9, 0xcdb6, 0xd2f9, 0x0000, 0xdaad, 0xd2e3,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01a57 ***/
+
+ /* 80 */ 0xcfd1, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbdc, 0xccfa, 0x0000,
+ /* 88 */ 0xcfdd, 0x0000, 0x0000, 0xe8a9, 0x0000, 0xe3bb, 0xe3ba, 0x0000,
+ /* 90 */ 0x0000, 0xe0da, 0x0000, 0x0000, 0x0000, 0xeef7, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdcb3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd3f5, 0x0000, 0xd7a6, 0x0000, 0xf6b5, 0xd7db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d5, 0x0000, 0x0000, 0xd4ea,
+ /* b0 */ 0x0000, 0xdfa3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfddf,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01a91 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd0f7, 0xedd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcbaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe4db, 0x0000, 0xe1fb, 0xcba2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd3e0, 0x0000, 0xe4bf, 0x0000, 0xfbc0, 0x0000, 0xdabe,
+ /* b8 */ 0xe4cd, 0x0000, 0xd6b9, 0x0000, 0x0000, 0x0000, 0xefc0, 0x0000,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x01ad1 ***/
+
+ /* 80 */ 0xe1fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf6b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdfc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce7,
+ /* b0 */ 0xdce8, 0x0000, 0x0000, 0x0000, 0xfad6, 0x0000, 0xd3f6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf1da, 0x0000, 0xfaf2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x01b0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2fd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cf, 0xd0f8, 0x0000,
+ /* 90 */ 0x0000, 0xcddf, 0x0000, 0x0000, 0xf5cb, 0x0000, 0xe4f0, 0xcbab,
+ /* 98 */ 0x0000, 0xd7c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2fe,
+ /* a8 */ 0x0000, 0xddda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01b44 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdaae, 0xcaee, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd5b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe3a1, 0x0000, 0x0000, 0xe8e3, 0x0000, 0x0000, 0xf3ab,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01b7d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd3f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f1, 0x0000, 0x0000,
+ /* a0 */ 0xcee4, 0x0000, 0xe8f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe5f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe7ae, 0x0000, 0xd6ba, 0x0000, 0xdfec, 0xe4c0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01bbb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8b5, 0x0000, 0x0000, 0x0000, 0xe4dc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4b9, 0xf1b6, 0x0000,
+ /* a0 */ 0x0000, 0xe2de, 0xe1b5, 0x0000, 0x0000, 0xcdef, 0xf1a7, 0xcee5,
+ /* a8 */ 0xcbdd, 0x0000, 0x0000, 0xd9e3, 0x0000, 0x0000, 0xf3ac, 0x0000,
+ /* b0 */ 0x0000, 0xd0f9, 0xecab, 0xded3, 0xf7e9, 0x0000, 0x0000, 0xf9f5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1de, 0xcbee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01bfa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe3bc, 0xf8d6, 0x0000, 0x0000, 0xdbee, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdf1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4de, 0x0000,
+ /* 98 */ 0x0000, 0xf2ed, 0x0000, 0xdbd9, 0x0000, 0xf0a8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1fd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xded4, 0x0000, 0xe0ac, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xede3, 0x0000, 0x0000, 0xd3e1, 0x0000,
+ /* b8 */ 0xdfc8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9b6, 0x0000, 0xfdac,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01c3a ***/
+
+ /* 80 */ 0xefd3, 0x0000, 0x0000, 0x0000, 0xe4c1, 0xf8eb, 0x0000, 0xdbac,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ad, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ba,
+ /* a0 */ 0x0000, 0xdbdf, 0xd3d3, 0xf8c7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcace, 0xf8c1, 0xd2b4, 0x0000, 0x0000, 0xdcb4,
+ /* b8 */ 0xfab9, 0xcacf, 0x0000, 0xfcb3, 0xeaea, 0xeaeb, 0xd0fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01c79 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xede4, 0x0000, 0x0000, 0xdde7,
+ /* 88 */ 0x0000, 0x0000, 0xdfc9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfed,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeebc, 0x0000, 0xefc1,
+ /* 98 */ 0x0000, 0x0000, 0xccd2, 0x0000, 0xdda4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdfca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3f8, 0xf1a8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcdb7, 0x0000, 0xefd4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4dd, 0xdfee, 0xcbac,
+ /* b8 */ 0xe9bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaec,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01cb8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdfcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9bf, 0xd6af, 0xd5c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcfaa, 0x0000, 0x0000, 0xcea9, 0x0000, 0x0000, 0xd6f8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1b7, 0xeef8, 0x0000, 0x0000, 0x0000, 0xd9d9,
+ /* a0 */ 0xf3df, 0x0000, 0xf8c8, 0xcec6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf4e6, 0x0000, 0x0000, 0xe6c5, 0xefd5,
+ /* b8 */ 0x0000, 0x0000, 0xcbef, 0xfcdf, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01cf7 ***/
+
+ /* 80 */ 0x0000, 0xdca7, 0x0000, 0x0000, 0xd6e7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf8c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d2,
+ /* 90 */ 0x0000, 0xe3bd, 0x0000, 0xcfe1, 0xf0c0, 0xecda, 0x0000, 0xddd7,
+ /* 98 */ 0xfbf0, 0x0000, 0x0000, 0xecac, 0x0000, 0x0000, 0x0000, 0xf0a9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfad7, 0xfbc1,
+ /* a8 */ 0x0000, 0xd2c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe5b0, 0x0000, 0x0000, 0x0000, 0xede5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcbad, 0x0000, 0xf9b0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01d34 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7a5, 0x0000, 0xcbae, 0x0000, 0xdaaf, 0x0000, 0xd8b6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a7, 0xfbb2,
+ /* 98 */ 0x0000, 0xfdc4, 0x0000, 0xecad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfba1, 0x0000, 0x0000, 0x0000, 0xe5e9, 0xe9ee,
+ /* a8 */ 0x0000, 0xf3f4, 0xf8f3, 0xf0c1, 0xdeaf, 0xf8b0, 0x0000, 0x0000,
+ /* b0 */ 0xf3e0, 0xe7af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbad,
+ /* b8 */ 0x0000, 0xe6b5, 0x0000, 0x0000, 0xf9a8, 0x0000, 0x0000, 0xddd8,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01d74 ***/
+
+ /* 80 */ 0xe8d9, 0xefd6, 0x0000, 0x0000, 0x0000, 0xd3e2, 0x0000, 0xe2df,
+ /* 88 */ 0x0000, 0x0000, 0xfce0, 0xd7c8, 0xfdad, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdfef, 0xccd3, 0xd3f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f0,
+ /* 98 */ 0xdbc7, 0xded5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f4, 0x0000,
+ /* a0 */ 0xd5d0, 0xe5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xfcc7, 0xdcd6, 0xe2e0, 0x0000, 0x0000, 0x0000, 0xdab0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a3, 0x0000, 0xd3ec,
+ /* b8 */ 0x0000, 0xf4cb, 0x0000, 0x0000, 0x0000, 0xfdc5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01db2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe3fd, 0x0000, 0xf9b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fb, 0xecdb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5bc, 0xf2a4,
+ /* 98 */ 0xd8ce, 0xd8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf6e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2b7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbec, 0x0000, 0xddc8,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01df2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e8,
+ /* 90 */ 0x0000, 0x0000, 0xd2c1, 0x0000, 0x0000, 0x0000, 0xf8d7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6bb, 0xded6, 0x0000, 0x0000,
+ /* a0 */ 0xf7bd, 0xecae, 0x0000, 0x0000, 0x0000, 0xd0e1, 0x0000, 0xe0f5,
+ /* a8 */ 0xeab3, 0x0000, 0xced6, 0x0000, 0x0000, 0x0000, 0x0000, 0xcca5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x01e31 ***/
+
+ /* 80 */ 0x0000, 0xecf6, 0xe2e1, 0xe3be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc8, 0x0000, 0x0000,
+ /* 90 */ 0xcdf0, 0x0000, 0xf9f6, 0x0000, 0x0000, 0xdff0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe5bf, 0x0000, 0x0000, 0x0000, 0xcebf, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfce1, 0xedb0, 0xfdd1, 0xf6bb, 0x0000, 0x0000,
+ /* a8 */ 0xf9cf, 0xebda, 0xcac1, 0x0000, 0xd2b8, 0xcdf1, 0x0000, 0xe3d3,
+ /* b0 */ 0xfde6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e682xx - offset 0x01e6c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ed, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe3fa, 0x0000, 0x0000, 0xf0aa, 0xf9d0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfce2, 0x0000, 0xf8a7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe1e5, 0xeef9, 0x0000, 0x0000, 0x0000, 0xe7f6,
+ /* a0 */ 0xeaed, 0x0000, 0x0000, 0xfcb4, 0xf5c2, 0x0000, 0x0000, 0xd7dc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf0f5, 0x0000, 0xdde8, 0xd3ed, 0xf5fc, 0x0000, 0xdabf, 0x0000,
+ /* b8 */ 0xccfb, 0x0000, 0x0000, 0x0000, 0xd3fa, 0xf4a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01eaa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefd7, 0x0000, 0xd4c3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfbe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfbed, 0x0000, 0xe0ad, 0x0000, 0x0000, 0xeaee,
+ /* a0 */ 0xfbb3, 0xe4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf6e7, 0xd2dd, 0x0000, 0xdfcc, 0x0000, 0x0000, 0xfcc9, 0x0000,
+ /* b8 */ 0x0000, 0xe5a9, 0xe0f6, 0xf6b3, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e684xx - offset 0x01ee9 ***/
+
+ /* 80 */ 0x0000, 0xe1fe, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf0, 0x0000,
+ /* 88 */ 0xeaef, 0xeaf0, 0x0000, 0x0000, 0x0000, 0xdac0, 0xf8b4, 0xebf2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe9d7, 0xe4f1, 0x0000, 0x0000, 0x0000, 0xcaef,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xced7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcca, 0x0000, 0x0000, 0x0000, 0xf3e1, 0x0000, 0x0000, 0xcbc4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3e5, 0x0000, 0xcbc5, 0xeab4,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01f29 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9bd, 0x0000, 0xd7c9, 0x0000, 0x0000, 0xebdb,
+ /* 88 */ 0xedb1, 0x0000, 0xccc3, 0xf7be, 0xfccb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf8f4, 0x0000, 0xd9b7, 0x0000, 0x0000,
+ /* 98 */ 0xf3d3, 0xf3d4, 0x0000, 0x0000, 0x0000, 0xf7e4, 0x0000, 0xf7d1,
+ /* a0 */ 0x0000, 0x0000, 0xd8b7, 0xceb1, 0xcac2, 0x0000, 0x0000, 0xfbb4,
+ /* a8 */ 0xcbc6, 0x0000, 0x0000, 0xf0f6, 0x0000, 0x0000, 0xd5e7, 0x0000,
+ /* b0 */ 0xead0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccd4, 0xcbaf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4aa, 0xe9af,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x01f68 ***/
+
+ /* 80 */ 0x0000, 0xf5c3, 0xe9d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdde9, 0x0000, 0x0000, 0x0000, 0xf1f3, 0x0000,
+ /* 90 */ 0xd5fb, 0xdebb, 0x0000, 0x0000, 0xf4fb, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfdf3, 0xfdf2, 0xf7a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddc9, 0x0000, 0x0000, 0xd4d3,
+ /* a8 */ 0x0000, 0xcca8, 0x0000, 0xdac1, 0xccd5, 0x0000, 0xd9e4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfaca, 0x0000, 0x0000, 0x0000, 0xe5e3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd3bc, 0x0000, 0x0000, 0x0000, 0xcaf0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x01fa7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd0c4, 0x0000, 0x0000, 0x0000, 0xcad0,
+ /* 88 */ 0xfaab, 0xebeb, 0xe7f8, 0xd9e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1d7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf3a4, 0x0000, 0x0000, 0x0000, 0xd4fb, 0xfce3,
+ /* b8 */ 0xfad8, 0x0000, 0xf3d5, 0x0000, 0xcfab, 0x0000, 0x0000, 0xebf3,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01fe7 ***/
+
+ /* 80 */ 0xd5fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3d4,
+ /* 88 */ 0xcdfc, 0x0000, 0xd9e6, 0x0000, 0xe2f9, 0xe2a1, 0xebd4, 0x0000,
+ /* 90 */ 0xe0f7, 0xe4b2, 0xccfc, 0x0000, 0x0000, 0x0000, 0xfbe4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf4ab, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0bd,
+ /* a0 */ 0x0000, 0xcaf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xefb8, 0x0000, 0x0000, 0x0000, 0xd7c0, 0x0000,
+ /* b0 */ 0xeefa, 0xfdf4, 0x0000, 0x0000, 0xd3e3, 0x0000, 0xfbc2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e8, 0xdbae,
+
+ /*** Three byte table, leaf: e689xx - offset 0x02027 ***/
+
+ /* 80 */ 0xe1b6, 0xf8b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0bf,
+ /* 88 */ 0xfbc3, 0xddea, 0x0000, 0xe2a2, 0x0000, 0xeea6, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf6e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf6f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddca, 0x0000,
+ /* b0 */ 0x0000, 0xd0e2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdda6, 0x0000,
+ /* b8 */ 0x0000, 0xddeb, 0x0000, 0x0000, 0xe4f9, 0x0000, 0x0000, 0xe3af,
+
+ /*** Three byte table, leaf: e68axx - offset 0x02067 ***/
+
+ /* 80 */ 0xd0fc, 0x0000, 0x0000, 0x0000, 0xf4fc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xccbc, 0xf7ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe5e4, 0xdff1, 0x0000, 0x0000, 0xf7e1, 0x0000, 0xf9f7,
+ /* 98 */ 0xefb9, 0x0000, 0x0000, 0xf8d8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf9a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf8d9, 0x0000, 0x0000, 0x0000, 0xeebd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd8c6, 0x0000, 0x0000, 0xe4e3, 0xf5ce,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x020a5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xddd9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e7,
+ /* 88 */ 0xd2b9, 0xd5c3, 0x0000, 0x0000, 0xdae5, 0xdad0, 0x0000, 0xd1d9,
+ /* 90 */ 0xced8, 0x0000, 0xcbde, 0xf4ac, 0xdafb, 0x0000, 0xf6e9, 0xe8f3,
+ /* 98 */ 0xcfac, 0xf0f0, 0x0000, 0xf4fd, 0xdbc8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcec0, 0xe3d4, 0xd1cf, 0xf1f5,
+ /* b0 */ 0x0000, 0xcdf2, 0x0000, 0xcfeb, 0x0000, 0x0000, 0x0000, 0xcdb8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a6, 0xd1da,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x020e5 ***/
+
+ /* 80 */ 0x0000, 0xf2a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a6,
+ /* 88 */ 0x0000, 0xe4ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd3fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1a9, 0x0000, 0x0000, 0x0000, 0xf2c9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xefd8, 0xe6c9, 0x0000, 0xd8b8, 0xfaf3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68dxx - offset 0x02124 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf3b5, 0x0000, 0x0000, 0xf8a4, 0x0000, 0x0000, 0xd1f3,
+ /* 90 */ 0xe6c8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8da, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce9,
+ /* a8 */ 0xded7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbdf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcfec, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4df,
+ /* b8 */ 0x0000, 0x0000, 0xd1f4, 0xd2ba, 0x0000, 0x0000, 0x0000, 0xdff2,
+
+ /*** Three byte table, leaf: e68exx - offset 0x02164 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe1b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe2a3, 0xd3fc, 0x0000, 0x0000, 0xede6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdbc9, 0x0000, 0x0000, 0x0000, 0xe4fa, 0x0000,
+ /* 98 */ 0xcfde, 0x0000, 0x0000, 0xced0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd5d3, 0xf3f5, 0xf7ae, 0x0000, 0x0000, 0xefc8, 0x0000, 0xcdf3,
+ /* a8 */ 0xf5cf, 0xe5f3, 0xf0c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x021a4 ***/
+
+ /* 80 */ 0xcad1, 0x0000, 0x0000, 0x0000, 0xeaf1, 0x0000, 0xd0a6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9da,
+ /* 90 */ 0xf0ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebe7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5c0, 0xfcb5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe4c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcca9, 0xfdc6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeab5, 0x0000, 0xe5aa, 0xdfba,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x021dc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1df, 0x0000, 0xdad1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b8, 0x0000, 0xe8f4, 0xd3fd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf2ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdae6, 0xf7b3, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfdcd, 0x0000, 0x0000, 0x0000, 0xf3b6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x0221b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeed7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd8a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd9b8, 0xd9b9, 0xefc9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x02256 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7cb, 0xdfae, 0xe8f5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd2b5, 0x0000, 0x0000, 0x0000, 0xd3d5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4cc, 0xdafc, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd9e8, 0x0000, 0xf7eb, 0xf5c9, 0x0000,
+ /* b0 */ 0xf3bc, 0x0000, 0xdad2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd3b5, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e693xx - offset 0x02295 ***/
+
+ /* 80 */ 0x0000, 0xe8b6, 0x0000, 0x0000, 0xd6cf, 0xf4ba, 0x0000, 0xf7c9,
+ /* 88 */ 0x0000, 0x0000, 0xccaa, 0x0000, 0x0000, 0xf0c3, 0xccd6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd0d3, 0x0000, 0xd3bd, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xdbfb, 0x0000, 0xcbe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd3e4, 0xf6f7, 0x0000, 0x0000, 0xd5ba, 0xf3cd, 0xcbe1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebf4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf4ad, 0x0000, 0xfcaa, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf7ec, 0x0000, 0x0000, 0x0000, 0xe8f6, 0x0000,
+
+ /*** Three byte table, leaf: e694xx - offset 0x022d5 ***/
+
+ /* 80 */ 0xdae7, 0x0000, 0x0000, 0x0000, 0xf7cc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe5c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd5fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcee6, 0xfcab, 0xd5bb, 0x0000, 0x0000, 0xf2a8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a5, 0xcdb9,
+ /* b8 */ 0xeaf2, 0xcbc7, 0x0000, 0xcdf4, 0x0000, 0x0000, 0xdbaf, 0xefd9,
+
+ /*** Three byte table, leaf: e695xx - offset 0x02315 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdba, 0x0000, 0x0000,
+ /* 88 */ 0xfcf9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdff3, 0xcee7, 0xdac2,
+ /* 90 */ 0x0000, 0xcfad, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f9, 0xf8a8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e2, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcaf2, 0xdfa4, 0x0000, 0x0000, 0xd4c4, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccd7, 0xe5c2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcdbb, 0x0000, 0xefda, 0xeed8, 0x0000, 0xdda7,
+ /* b8 */ 0xe2a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x02354 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd6b0, 0xf8ca, 0x0000, 0xfcfa, 0x0000, 0xd9fe,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xddec, 0xdae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e0,
+ /* 98 */ 0x0000, 0xd6f9, 0x0000, 0xcdd7, 0xded8, 0x0000, 0x0000, 0xf2f8,
+ /* a0 */ 0x0000, 0xe4d6, 0x0000, 0x0000, 0xd0c5, 0xf4ae, 0x0000, 0xdda8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedc5, 0xf3d6, 0x0000, 0x0000, 0xded9,
+ /* b0 */ 0xe3e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a8,
+ /* b8 */ 0x0000, 0xdbb0, 0x0000, 0x0000, 0xe5da, 0xe3bf, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e697xx - offset 0x02393 ***/
+
+ /* 80 */ 0x0000, 0xdbb1, 0x0000, 0x0000, 0x0000, 0xd5e9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe0c1, 0xefdb, 0x0000, 0x0000, 0xf0e9,
+ /* 90 */ 0x0000, 0x0000, 0xd7b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd9e9, 0x0000, 0x0000, 0xd0fe, 0x0000, 0xeced, 0xd3a9, 0x0000,
+ /* a8 */ 0xf2a9, 0xf0c4, 0x0000, 0x0000, 0xe2e2, 0xe9ef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf9d1, 0x0000, 0x0000, 0xe9d9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe8da, 0xdac3, 0xdac4, 0xd4c5, 0x0000, 0xe7fa,
+
+ /*** Three byte table, leaf: e698xx - offset 0x023d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde0, 0xe3b0,
+ /* 88 */ 0x0000, 0xdbb2, 0xfbc4, 0x0000, 0xf3e3, 0x0000, 0xd9a5, 0xfbe7,
+ /* 90 */ 0xddcb, 0xd0d4, 0x0000, 0xe6b6, 0xe0ae, 0xfdda, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcb5, 0xe0f8,
+ /* a0 */ 0xe7b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f0, 0x0000, 0xd8dc,
+ /* a8 */ 0xedc6, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b9, 0x0000, 0xe3c0,
+ /* b0 */ 0xf9c0, 0xe9f0, 0x0000, 0x0000, 0xd9db, 0x0000, 0xf3e4, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xdcb6, 0xe4e9, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e699xx - offset 0x02412 ***/
+
+ /* 80 */ 0x0000, 0xf0c5, 0xe3c1, 0xfccc, 0xfccd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2cb, 0x0000, 0xf2cc, 0x0000, 0x0000, 0x0000, 0xe4cf,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf1db, 0x0000, 0xfad9, 0x0000, 0xf1b8, 0xfdf5, 0xe0f9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fb, 0xfcb7, 0xfce4, 0xfbc5,
+ /* a8 */ 0xe3e7, 0xd8b9, 0x0000, 0xf6f8, 0x0000, 0x0000, 0xdcc5, 0xccd8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0af, 0xf4e7, 0x0000, 0xefdc, 0xcffc,
+ /* b8 */ 0xefdd, 0x0000, 0xf2aa, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69axx - offset 0x0244e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdbe, 0x0000, 0x0000, 0xcaac,
+ /* 88 */ 0xfdbb, 0xfdc7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b2, 0x0000,
+ /* 90 */ 0xead1, 0xdff4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1ec, 0xe4de,
+ /* 98 */ 0xe5c3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a6, 0x0000, 0x0000,
+ /* a0 */ 0xcdbc, 0x0000, 0xf3e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedd5, 0x0000, 0x0000, 0xd9ba, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xede7, 0xfbb5, 0xf8ec, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe0e7, 0x0000, 0xccd9, 0x0000, 0x0000, 0xd4c6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69bxx - offset 0x0248d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a5, 0x0000, 0xd5f5, 0xd3be,
+ /* 88 */ 0x0000, 0xfcfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f2, 0x0000,
+ /* 98 */ 0x0000, 0xdff5, 0x0000, 0x0000, 0xe8f8, 0xf8ed, 0x0000, 0x0000,
+ /* a0 */ 0xcec7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdf6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8d8, 0x0000, 0xcdd8, 0xe7d6, 0xccda, 0x0000, 0x0000, 0xcae3,
+ /* b8 */ 0xdff6, 0xf0c7, 0xf0c6, 0x0000, 0xd8ba, 0x0000, 0xf1f4, 0xf4f0,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x024cd ***/
+
+ /* 80 */ 0xf5cc, 0x0000, 0x0000, 0xfce5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeac5, 0xeaf3, 0x0000, 0xdddb, 0x0000, 0xdcd7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdefd, 0xf2f9, 0x0000, 0xd5c7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd8d0, 0x0000, 0xf0c8, 0xd1a1, 0xd1a2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d4, 0xd6e8,
+ /* a8 */ 0xd9ca, 0x0000, 0xdab1, 0xd8c7, 0xdce2, 0xf3ce, 0xf5f4, 0x0000,
+ /* b0 */ 0x0000, 0xf1b9, 0x0000, 0x0000, 0xdad3, 0x0000, 0xf6ea, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcff5, 0x0000, 0x0000, 0xfdae,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69dxx - offset 0x0250b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad2, 0x0000,
+ /* 88 */ 0x0000, 0xdfb4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7dd, 0xfaba,
+ /* 90 */ 0xeea7, 0xf5bd, 0x0000, 0xf8f5, 0x0000, 0x0000, 0xede8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e1, 0x0000, 0xd1a3, 0xe1d6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f8, 0x0000, 0xdbca,
+ /* b0 */ 0xcbf9, 0xd4d4, 0x0000, 0xd9dc, 0x0000, 0xeebe, 0x0000, 0xf7ed,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd2ee, 0x0000, 0x0000, 0xe1e6, 0xf7f9,
+
+ /*** Three byte table, leaf: e69exx - offset 0x0254b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdded,
+ /* 88 */ 0x0000, 0xe8db, 0x0000, 0xdbb3, 0x0000, 0x0000, 0x0000, 0xd1f7,
+ /* 90 */ 0xe0b0, 0x0000, 0x0000, 0xd4e2, 0x0000, 0xf6d7, 0x0000, 0xd7f9,
+ /* 98 */ 0x0000, 0x0000, 0xd8dd, 0x0000, 0xcdfd, 0xf2ab, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdbd,
+ /* b0 */ 0xf8c2, 0x0000, 0x0000, 0xf2ac, 0x0000, 0x0000, 0xcaad, 0xcaae,
+ /* b8 */ 0xcfae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69fxx - offset 0x0258a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdcb7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbda,
+ /* 90 */ 0xd9bb, 0xcaf3, 0xf6d3, 0xe6f8, 0xeaf5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeaf6, 0x0000, 0x0000, 0xf6f9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcfaf, 0x0000, 0x0000, 0xcad3, 0x0000, 0x0000, 0xcaaf,
+ /* b0 */ 0xd2b0, 0xf1ba, 0x0000, 0xd7b3, 0xe3c3, 0xf3fd, 0xdeda, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdedb, 0x0000, 0x0000, 0xefde,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x025c9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe2e3, 0xeefb, 0x0000, 0x0000, 0xdff7, 0xd7ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcee8, 0xdbdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfab7, 0xd0c6, 0x0000, 0x0000, 0xccab, 0xeea8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02609 ***/
+
+ /* 80 */ 0xcbfa, 0xf9f9, 0xccfd, 0xd3fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe4d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ee, 0x0000,
+ /* 90 */ 0xd4d5, 0xdfcd, 0x0000, 0xfcb8, 0xd1d0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2cd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad4,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02649 ***/
+
+ /* 80 */ 0x0000, 0xd5d9, 0x0000, 0x0000, 0x0000, 0xd8de, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xeea9, 0xf6bc, 0x0000, 0x0000, 0xccdb,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0c9, 0x0000, 0xfcfc,
+ /* a0 */ 0x0000, 0xe8c9, 0xf4fe, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fc,
+ /* a8 */ 0xd7de, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedc, 0x0000, 0xf0ac,
+ /* b0 */ 0xccfe, 0xcde1, 0x0000, 0xe1ba, 0x0000, 0xdbef, 0xdab2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02685 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd1a5, 0xdcb8, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd8f6, 0x0000, 0xd1a4, 0x0000, 0xcde2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdcea, 0x0000, 0x0000, 0xf0f7, 0x0000, 0xf0ca,
+ /* 98 */ 0xd0be, 0x0000, 0xdddc, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4d6,
+ /* a0 */ 0xd3d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd0,
+ /* a8 */ 0xcda1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfb5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd4a1, 0xceb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x026c5 ***/
+
+ /* 80 */ 0xe8ca, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d5, 0xf5d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe5ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6cb, 0x0000, 0xf5f1,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02705 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe5c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9a3, 0xe0db, 0xf6eb, 0x0000, 0xcbf1,
+ /* 98 */ 0x0000, 0xd9ea, 0xf5a2, 0x0000, 0x0000, 0x0000, 0xd7d1, 0x0000,
+ /* a0 */ 0xd1f8, 0xeaf8, 0xeaf9, 0xdab3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xefdf, 0x0000, 0x0000, 0xf1ef, 0x0000, 0xe5f6, 0xeebf, 0xe2e4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0bf, 0x0000, 0xfaac,
+ /* b8 */ 0xf5d1, 0xe7b3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x0273f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9be, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf2ce, 0xdbb4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcce, 0x0000, 0xddee,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf7b4, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x0277e ***/
+
+ /* 80 */ 0x0000, 0xcdbe, 0x0000, 0xdae9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xcfb0, 0xf7d9, 0xf3e6, 0x0000, 0x0000,
+ /* 90 */ 0xced9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xceaa, 0x0000, 0xcbc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd0a7, 0x0000, 0xf0cb, 0x0000, 0xd0c7,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x027be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe4c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdbe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd5da, 0x0000, 0xd7a7, 0x0000, 0x0000, 0x0000, 0xeec0,
+ /* 98 */ 0x0000, 0xf8f6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d2, 0xede9,
+ /* a0 */ 0x0000, 0xd9bc, 0x0000, 0xe5c6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a3, 0x0000, 0x0000,
+ /* b8 */ 0xdad4, 0xe2a7, 0xfbfc, 0x0000, 0x0000, 0xf1dc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x027fc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcaf4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe8fa, 0x0000, 0x0000, 0xcee9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe9f8, 0xe2e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd0b9, 0xd4f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1a6,
+ /* a0 */ 0x0000, 0xdfce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfcf4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x0283c ***/
+
+ /* 80 */ 0xd3aa, 0x0000, 0x0000, 0x0000, 0xccac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xefe0, 0x0000, 0x0000, 0x0000, 0xe5e5, 0xd0d5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbfc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfce6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcbfe, 0xedea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdeb1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf9e3, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x0287a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd4a2, 0xcff6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd6d0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd5ea, 0xf1ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfacb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe5a1,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x028b6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcfed, 0x0000, 0xedeb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd5b2, 0x0000, 0x0000, 0x0000, 0xd5bc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfde2, 0xf3ad, 0x0000, 0xfddb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe9b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd1a7, 0x0000, 0x0000, 0xfde3, 0xceb3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x028f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfde4, 0xface,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcab0, 0x0000, 0xf7a7, 0x0000,
+ /* 90 */ 0xcfb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a2,
+ /* a0 */ 0x0000, 0xfcb6, 0xf2ad, 0xefe1, 0xf3ae, 0xdcc6, 0xd9eb, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe8e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe1a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5f6,
+ /* b8 */ 0xcffd, 0x0000, 0x0000, 0xdedd, 0x0000, 0x0000, 0x0000, 0xd9d1,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02935 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4ea, 0xf2cf, 0x0000, 0xf7bf, 0x0000,
+ /* 88 */ 0x0000, 0xe2e6, 0xe2a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d6, 0x0000,
+ /* 98 */ 0xedd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6b1, 0xdeb2,
+ /* b0 */ 0x0000, 0x0000, 0xe0e8, 0x0000, 0x0000, 0xd3ab, 0x0000, 0xebdc,
+ /* b8 */ 0x0000, 0x0000, 0xdfaf, 0x0000, 0xcac3, 0x0000, 0x0000, 0xeefc,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x02975 ***/
+
+ /* 80 */ 0x0000, 0xfdc3, 0x0000, 0x0000, 0x0000, 0xebf6, 0xcfb2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd9ec, 0x0000, 0xd9bd, 0x0000, 0xd8df,
+ /* 90 */ 0x0000, 0x0000, 0xd4b8, 0xebbe, 0xddef, 0x0000, 0xddf0, 0xddf1,
+ /* 98 */ 0xddf2, 0x0000, 0x0000, 0xd9be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbc6, 0xcfb3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x029ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeefd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ab,
+ /* 90 */ 0x0000, 0xdac5, 0x0000, 0xd8ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd1a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a9, 0x0000, 0x0000, 0xdebc,
+ /* b8 */ 0xe7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbf0, 0x0000,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x029ed ***/
+
+ /* 80 */ 0xefe2, 0xf1f0, 0xcfb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbf1, 0x0000,
+ /* 90 */ 0xe0b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa5, 0x0000, 0xf9d2,
+ /* 98 */ 0x0000, 0x0000, 0xe7fd, 0x0000, 0x0000, 0xe6a3, 0xfbf1, 0xcbb0,
+ /* a0 */ 0xf2ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcde7, 0x0000, 0xe8dc, 0x0000, 0x0000, 0xe7d7, 0x0000, 0x0000,
+ /* b0 */ 0xf7c0, 0x0000, 0xd0e3, 0x0000, 0x0000, 0x0000, 0xdaa1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xccbd, 0x0000, 0x0000, 0xd1a9, 0xddcc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02a2c ***/
+
+ /* 80 */ 0x0000, 0xe3fe, 0xd1aa, 0xe8aa, 0x0000, 0xeab6, 0xf9fa, 0xe6cc,
+ /* 88 */ 0xf6d8, 0x0000, 0x0000, 0x0000, 0xd4c7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd9cb, 0x0000, 0xd9d2, 0xd3cb, 0xd8f7, 0xdaa9, 0xf5f8, 0x0000,
+ /* 98 */ 0x0000, 0xdede, 0xf2af, 0xf8a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd8c8, 0x0000, 0x0000, 0xeec1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf9c1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xddf3, 0xeafa, 0x0000, 0xf6bd, 0xe1bb, 0xcdbf, 0xf4d4, 0xe6cd,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02a6c ***/
+
+ /* 80 */ 0x0000, 0xfccf, 0xfba2, 0x0000, 0xe0dc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf4bb, 0xdad5, 0x0000, 0xf9b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfbf2, 0x0000, 0xdbf6, 0x0000, 0xdedf,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdbf2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf8dc, 0xf7ee, 0xebe8, 0x0000, 0xd2fa, 0x0000, 0x0000,
+ /* a8 */ 0xf1bc, 0x0000, 0x0000, 0xfada, 0x0000, 0x0000, 0xdaea, 0xdac6,
+ /* b0 */ 0xf7c1, 0x0000, 0x0000, 0xe7b6, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x02aa1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe5c7, 0xd6ac, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdcc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a9,
+ /* 98 */ 0x0000, 0xe2aa, 0x0000, 0xd5a6, 0x0000, 0x0000, 0xd4d7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d0, 0x0000, 0xeafb,
+ /* a8 */ 0x0000, 0xe0dd, 0xfbf3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf1bd, 0x0000, 0x0000, 0xe2e7, 0xfdd7, 0x0000,
+ /* b8 */ 0xcec8, 0xeab7, 0x0000, 0xfcc0, 0x0000, 0xfde7, 0xf7ef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x02ae0 ***/
+
+ /* 80 */ 0x0000, 0xd7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xefba, 0xf1dd, 0x0000, 0xdeb3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe8cb, 0x0000, 0x0000, 0xf8dd, 0x0000,
+ /* a8 */ 0x0000, 0xfbc7, 0xd5c8, 0x0000, 0xd7df, 0x0000, 0xdda9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9b1, 0x0000, 0x0000, 0xfaad,
+ /* b8 */ 0xf6d9, 0xfaf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8aa,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02b20 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ee, 0x0000, 0xccdc,
+ /* 88 */ 0xe1bc, 0xe0ef, 0x0000, 0x0000, 0xe9bf, 0xfcfd, 0xe6ce, 0x0000,
+ /* 90 */ 0x0000, 0xe1d7, 0x0000, 0xe6cf, 0x0000, 0xf4f1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f3,
+ /* b0 */ 0x0000, 0x0000, 0xe4fb, 0x0000, 0x0000, 0xf9e4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02b60 ***/
+
+ /* 80 */ 0xefe3, 0x0000, 0x0000, 0xcfee, 0xf6be, 0xe0b2, 0xfcfe, 0xd1ab,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7fa, 0x0000, 0x0000, 0x0000, 0xfbc8,
+ /* 90 */ 0x0000, 0xe2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd4a3, 0xf0f8, 0xd7a8, 0x0000, 0x0000, 0x0000, 0xe1e7, 0x0000,
+ /* a0 */ 0x0000, 0xd3bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xefe4, 0x0000, 0xd7c5, 0xebe2, 0x0000, 0x0000, 0xfce7, 0x0000,
+ /* b0 */ 0x0000, 0xe4a2, 0x0000, 0xe2e8, 0x0000, 0xe6d0, 0x0000, 0xfbe8,
+ /* b8 */ 0xf4e8, 0xe5f4, 0xf4bc, 0xf4d5,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02b9c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfb6,
+ /* 98 */ 0x0000, 0xfcb9, 0xeec2, 0xcaf5, 0x0000, 0x0000, 0x0000, 0xefe5,
+ /* a0 */ 0xcbe2, 0xd4a4, 0x0000, 0xdee0, 0xdafd, 0xe4c6, 0xe8be, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe0de, 0xf6b4, 0xead2, 0x0000, 0xf9fb,
+ /* b0 */ 0x0000, 0x0000, 0xe0c2, 0x0000, 0xcae4, 0x0000, 0xe7b7, 0x0000,
+ /* b8 */ 0xeafd, 0x0000, 0xd9dd, 0x0000, 0xdab4, 0xeeaa, 0xfbe9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02bdb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xdbcb, 0xdab5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1be, 0x0000, 0x0000, 0xd3ac, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbc9, 0x0000,
+ /* 98 */ 0xdfcf, 0x0000, 0x0000, 0xd3c0, 0xe3d7, 0x0000, 0xefe6, 0xfcd0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf5d3, 0x0000, 0x0000, 0xecdc, 0xf7b7,
+ /* b0 */ 0x0000, 0x0000, 0xeab8, 0xd1f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xdcc8,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02c16 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeab9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1de, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b6, 0xcfb5, 0x0000, 0xd9a8,
+ /* a0 */ 0x0000, 0x0000, 0xecee, 0x0000, 0x0000, 0xddaa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcda2, 0xe8ae, 0x0000, 0x0000, 0x0000, 0xe1bd,
+ /* b0 */ 0x0000, 0xf2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd2fc, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02c54 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdbb5, 0x0000, 0xf3e7, 0xd8fe, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfcd1, 0x0000, 0xedb2, 0xf4af, 0x0000, 0xfba3, 0x0000,
+ /* 90 */ 0x0000, 0xfcc1, 0x0000, 0xeeab, 0xd4a5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeed9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfbca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde3, 0xd8bb,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02c94 ***/
+
+ /* 80 */ 0x0000, 0xe5db, 0xf8f7, 0x0000, 0x0000, 0x0000, 0xf6d4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a9,
+ /* 90 */ 0x0000, 0xcbc9, 0x0000, 0x0000, 0xe6d1, 0xf0cc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd8ae, 0x0000, 0xf9d3, 0xd5fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd8bc, 0xf2b0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe2ab, 0xf3e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xefc2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedec,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02cd4 ***/
+
+ /* 80 */ 0x0000, 0xe7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdafe, 0x0000, 0x0000, 0xccbe, 0x0000, 0x0000, 0xf2fc,
+ /* 98 */ 0xdaeb, 0x0000, 0xe2d8, 0xedd6, 0x0000, 0x0000, 0xd6d1, 0xe0b3,
+ /* a0 */ 0x0000, 0x0000, 0xfcd2, 0x0000, 0xebc8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3c1, 0xf0cd, 0x0000,
+ /* b0 */ 0xcff7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xedd2, 0x0000, 0xd4d8, 0xdcc9, 0xd7f1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02d13 ***/
+
+ /* 80 */ 0x0000, 0xdfbb, 0x0000, 0x0000, 0xf3a5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf4cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1bf, 0xf8b1, 0x0000,
+ /* 90 */ 0xe9fa, 0x0000, 0x0000, 0x0000, 0xfbcb, 0x0000, 0x0000, 0xcad5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf9d4, 0xf7ca, 0x0000, 0x0000, 0xd6c8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfce8, 0xf3bd,
+ /* b0 */ 0x0000, 0xeefe, 0x0000, 0xe7fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd3c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3b6, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02d53 ***/
+
+ /* 80 */ 0xccad, 0xf6fa, 0xd6b2, 0xd2d8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe7d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe7b9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ad,
+ /* a0 */ 0xfbcc, 0xeba1, 0x0000, 0x0000, 0xd4a6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfbcd, 0x0000, 0xd5bd, 0xf1df, 0x0000, 0x0000, 0xf6fb,
+ /* b0 */ 0x0000, 0xdeb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e780xx - offset 0x02d92 ***/
+
+ /* 80 */ 0x0000, 0xe5c8, 0x0000, 0x0000, 0x0000, 0xfba4, 0xd4b9, 0x0000,
+ /* 88 */ 0x0000, 0xdee1, 0x0000, 0xe4a3, 0x0000, 0x0000, 0x0000, 0xd7b7,
+ /* 90 */ 0x0000, 0xf8ee, 0x0000, 0x0000, 0x0000, 0xdeb5, 0x0000, 0x0000,
+ /* 98 */ 0xd6d2, 0x0000, 0xf9d5, 0xe7ba, 0xebd5, 0xd5f7, 0xefe7, 0xe1be,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfaae, 0x0000, 0x0000, 0x0000, 0xd6e9,
+ /* a8 */ 0xd6ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7bb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeccb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02dd1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xceb4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfba5, 0xe1ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf7a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbce, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd8bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbfd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfce9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcfb6, 0x0000, 0x0000, 0x0000, 0xedc7, 0xeeac,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02e0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccdd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf6a7, 0x0000, 0x0000, 0x0000, 0xe6fa, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfddc, 0xedb3, 0xcec9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xefe8, 0x0000, 0x0000, 0xe1bf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfadb, 0xcbe3, 0xf7a9, 0x0000, 0xfba6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdcb9, 0x0000, 0x0000, 0x0000, 0xf1c0,
+ /* b8 */ 0xedc8, 0xefc3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02e49 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6ad, 0x0000, 0x0000, 0xfdce, 0x0000, 0x0000, 0x0000, 0xe8a1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfbf4, 0xd5a7, 0x0000, 0x0000, 0x0000, 0xf1f6, 0x0000, 0xe6d3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xccde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf8b2, 0x0000, 0x0000, 0x0000, 0xdceb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02e87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe5ea, 0x0000, 0x0000, 0xf1e0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdbcc, 0xddcd, 0x0000, 0x0000, 0x0000, 0xd4c8, 0x0000,
+ /* a0 */ 0x0000, 0xd9ed, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe6fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d4, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02ec0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdc8,
+ /* 88 */ 0x0000, 0xd6a1, 0xfdbf, 0x0000, 0xfcd3, 0x0000, 0xefa1, 0x0000,
+ /* 90 */ 0xe7bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1ee, 0x0000,
+ /* 98 */ 0x0000, 0xe6d5, 0x0000, 0x0000, 0xe9f2, 0x0000, 0xdfb0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8e0, 0xfcba, 0xfdaf, 0xf0ce,
+ /* a8 */ 0x0000, 0xdbe1, 0x0000, 0x0000, 0xe5c9, 0x0000, 0xedb4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c3,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e786xx - offset 0x02efe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe9fb, 0xeaa8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb7,
+ /* 90 */ 0x0000, 0x0000, 0xfba7, 0x0000, 0xe9c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfdf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d9,
+ /* a0 */ 0x0000, 0x0000, 0xdcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe6f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfdf8, 0xfdf9, 0x0000, 0x0000, 0x0000, 0xf6bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x02f3d ***/
+
+ /* 80 */ 0x0000, 0xe7a7, 0x0000, 0xe6d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd4f3, 0xd4c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6fa, 0x0000,
+ /* 90 */ 0xd7f2, 0x0000, 0xe1c0, 0x0000, 0xdbe2, 0xe6d8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7bd,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0cf, 0xf3be, 0xe2ac,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b7, 0xe0f0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfdb8, 0xe3e8, 0x0000, 0xd4a7, 0xe8fc,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02f7d ***/
+
+ /* 80 */ 0xfad2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ef, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd6d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf0d0, 0x0000, 0xf7f0, 0xeeb3, 0x0000, 0x0000,
+ /* b0 */ 0xeaba, 0x0000, 0xead3, 0x0000, 0x0000, 0xedc9, 0xddab, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe5ac, 0xfda1, 0x0000, 0xdfd0, 0xecb3, 0x0000,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02fbd ***/
+
+ /* 80 */ 0xdfd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeded, 0xf8b8,
+ /* 88 */ 0xf7fa, 0x0000, 0x0000, 0x0000, 0xf8ab, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd4ba, 0xe4b3, 0x0000, 0xe9da, 0x0000, 0xdeb6, 0x0000, 0xd9bf,
+ /* a0 */ 0x0000, 0xd9c0, 0xd6ef, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cc,
+ /* a8 */ 0x0000, 0xdaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdfe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7e5, 0x0000, 0x0000, 0x0000, 0xccb2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02ffd ***/
+
+ /* 80 */ 0xdff9, 0xd7e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd4bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdfa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccb3, 0x0000, 0x0000, 0xdbf3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x0303d ***/
+
+ /* 80 */ 0xdfd2, 0x0000, 0xceca, 0x0000, 0xeeda, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e4, 0x0000,
+ /* 90 */ 0xfbcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfb7,
+ /* 98 */ 0x0000, 0xeec3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xceea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd7e1, 0xfaf5, 0x0000, 0x0000, 0xd5c9, 0xf8ac,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x0307b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe7d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd8ed, 0xe3c4, 0xf0f1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e5, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe0fa, 0xeec4, 0xd9de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba2, 0xeba3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc2, 0xeabb,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x030bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ab, 0xdee2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xedef, 0x0000, 0xe8a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd4bc, 0x0000, 0xfcea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe7be, 0x0000, 0xfcf2, 0x0000, 0x0000, 0xd6b4, 0x0000, 0x0000,
+ /* b8 */ 0xe2ae, 0x0000, 0xd3b7, 0xfacc,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x030f7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfadc, 0x0000, 0xedb5, 0xe1e3,
+ /* 88 */ 0x0000, 0xe8ac, 0x0000, 0xe8dd, 0x0000, 0x0000, 0xefe9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4bd, 0x0000, 0xcfb8, 0xe9db,
+ /* 98 */ 0xd1ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdac7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebc9,
+ /* a8 */ 0x0000, 0xe8cc, 0x0000, 0x0000, 0x0000, 0xdeb7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd6bc, 0xd3e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfadd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x03137 ***/
+
+ /* 80 */ 0xdad6, 0x0000, 0xcab1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdac8, 0xdfa6, 0x0000, 0xf9b3, 0xf2d2, 0x0000, 0xcac4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcecb, 0x0000,
+ /* 98 */ 0x0000, 0xcdf5, 0x0000, 0x0000, 0x0000, 0xfdb0, 0xd5a8, 0x0000,
+ /* a0 */ 0xf1c1, 0x0000, 0x0000, 0xe2e9, 0xdcca, 0xecb4, 0xfac0, 0x0000,
+ /* a8 */ 0x0000, 0xfba8, 0xd0a8, 0x0000, 0x0000, 0xdaec, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ee,
+ /* b8 */ 0x0000, 0xe0fb, 0x0000, 0x0000, 0x0000, 0xefea, 0xfade,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x03176 ***/
+
+ /* 80 */ 0x0000, 0xe0c4, 0x0000, 0xcfb9, 0x0000, 0xd5ca, 0xd7e2, 0xe2af,
+ /* 88 */ 0x0000, 0xd7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe8cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf6da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xefa2, 0xe2da, 0xf6fc, 0x0000, 0x0000, 0xfbd0, 0xd1ad, 0x0000,
+ /* a8 */ 0xcde4, 0x0000, 0xd1ae, 0xdced, 0xe8ce, 0x0000, 0xf0f9, 0xceb5,
+ /* b0 */ 0xe6fc, 0x0000, 0x0000, 0xd7fb, 0xd0d6, 0xddf5, 0xf7f1, 0x0000,
+ /* b8 */ 0xf6fd, 0x0000, 0xdbf7, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbea,
+
+ /*** Three byte table, leaf: e791xx - offset 0x031b6 ***/
+
+ /* 80 */ 0xe9dc, 0xd9c1, 0x0000, 0xf5f2, 0xe0c5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xead4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c2, 0x0000, 0xeabc,
+ /* 98 */ 0x0000, 0xd2c5, 0xfbd1, 0xe7c0, 0xeba5, 0x0000, 0xdffa, 0xe3a2,
+ /* a0 */ 0xd7b9, 0x0000, 0xe9c3, 0x0000, 0xe8fd, 0xe8af, 0x0000, 0x0000,
+ /* a8 */ 0xf2d3, 0xfba9, 0xd8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x031f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd1af, 0xd7e3, 0x0000, 0x0000, 0x0000, 0xe0c6,
+ /* 88 */ 0x0000, 0xd6a2, 0x0000, 0xedf0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd7f3, 0x0000, 0x0000, 0x0000, 0xfcd4, 0x0000, 0xdad7, 0xccdf,
+ /* a0 */ 0x0000, 0xf2d4, 0x0000, 0xd1b0, 0x0000, 0xcce0, 0x0000, 0xdbfd,
+ /* a8 */ 0xf3bf, 0x0000, 0xf0d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcbb, 0x0000, 0xe2b0, 0x0000, 0x0000, 0xe6a5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe2db, 0x0000, 0x0000, 0x0000, 0xdfde, 0x0000, 0xe0c7,
+
+ /*** Three byte table, leaf: e793xx - offset 0x03235 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ef, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcce1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6ea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xceb6, 0x0000, 0xf3c0, 0x0000, 0xcdfe, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfbd2, 0x0000, 0xf8f8, 0xf7fb, 0x0000, 0x0000, 0xe8bf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedb6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e794xx - offset 0x03274 ***/
+
+ /* 80 */ 0x0000, 0xdcba, 0x0000, 0x0000, 0xccb4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf1f7, 0x0000, 0x0000, 0x0000, 0xe8b8, 0x0000, 0x0000,
+ /* 98 */ 0xcaf6, 0x0000, 0xe4a4, 0xf4d6, 0x0000, 0x0000, 0x0000, 0xdfe6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdfa7, 0x0000, 0xdfe7, 0xe1c1, 0x0000,
+ /* a8 */ 0xe9c4, 0x0000, 0x0000, 0xdccb, 0xe9c5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xefa3, 0xeba6, 0xcba3, 0xe3e9, 0x0000, 0x0000, 0x0000, 0xd1fb,
+ /* b8 */ 0xefa4, 0x0000, 0xefeb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e795xx - offset 0x032af ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcda3, 0x0000, 0x0000, 0xe8e6,
+ /* 90 */ 0x0000, 0xefa5, 0x0000, 0xd3cc, 0xdaed, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd7ba, 0x0000, 0xf2d5, 0xf5e5, 0xd9ef, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf9b4, 0x0000, 0x0000, 0xd5d4, 0xfdcf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbe3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e1,
+ /* b0 */ 0xecb6, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfe, 0xd3d7, 0x0000,
+ /* b8 */ 0xd1b1, 0x0000, 0xcbb1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1b2,
+
+ /*** Three byte table, leaf: e796xx - offset 0x032ef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbb2, 0xf1c2,
+ /* 88 */ 0x0000, 0x0000, 0xf4e1, 0xf9b5, 0x0000, 0x0000, 0xe1c3, 0xe1c2,
+ /* 90 */ 0x0000, 0xebf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe6b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf8de, 0xf9aa, 0xcaf7, 0x0000, 0xedb7, 0x0000, 0x0000,
+ /* b8 */ 0xd3b8, 0xf2d6, 0x0000, 0x0000, 0xd4d9, 0xeec5, 0xf2f0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e797xx - offset 0x0332e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xcab2, 0x0000, 0x0000, 0xdcbb, 0x0000, 0xf1f8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecb7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5ca, 0x0000, 0xf6c0, 0xfddd, 0x0000, 0x0000,
+ /* 98 */ 0xd4e3, 0xcce2, 0x0000, 0xf7d4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd7e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd3c3, 0x0000, 0xd8a6, 0x0000, 0xf6c1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xddf6, 0x0000, 0xcdc0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e798xx - offset 0x0336e ***/
+
+ /* 80 */ 0xe5dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe1c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b0,
+ /* a0 */ 0xf4b0, 0xf3ea, 0xdaee, 0x0000, 0xd7bb, 0x0000, 0xe2b1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd7aa, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x033ac ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd6fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4df, 0x0000, 0xcad6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeba8, 0x0000, 0x0000, 0x0000, 0xdbfe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf6c2, 0x0000, 0x0000, 0xefbb, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd4fd, 0x0000, 0x0000, 0xe0c8, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8b9, 0x0000, 0xefa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcda4, 0x0000, 0x0000, 0xd4f4, 0xdba1, 0xdbdc, 0xdbdd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79axx - offset 0x033eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeedc, 0x0000, 0xcbcb, 0xfcd5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xceeb, 0x0000,
+ /* 90 */ 0xcdc1, 0x0000, 0x0000, 0xfbd3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ab, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a9,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x0342b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9dd, 0xdbcd, 0x0000, 0x0000, 0xddce, 0x0000,
+ /* 88 */ 0xe7c3, 0x0000, 0xeccc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf9ec, 0x0000, 0x0000, 0x0000, 0xcbcc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0fc, 0xd4a8, 0x0000, 0xedd3, 0xd8ef,
+ /* a0 */ 0x0000, 0xf2d7, 0x0000, 0xcaf8, 0xdaef, 0x0000, 0x0000, 0xd6d4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cd, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd8ee, 0x0000, 0xf2c1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdfd3, 0x0000, 0x0000, 0x0000, 0xdaf0, 0x0000, 0xe2ea,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x0346a ***/
+
+ /* 80 */ 0x0000, 0xe0fd, 0x0000, 0x0000, 0xd8f8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7af, 0xdab6, 0x0000, 0xcad7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d8, 0x0000,
+ /* a0 */ 0xd8f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfadf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfef,
+ /* b8 */ 0xd9c2, 0x0000, 0xf0d2, 0x0000, 0xe4d1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x034aa ***/
+
+ /* 80 */ 0xf3b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfae0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xefec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe2b2, 0x0000, 0xd4bd, 0x0000, 0x0000, 0xd9ce, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf4e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd4a9, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc2, 0xe7da,
+
+ /*** Three byte table, leaf: e79exx - offset 0x034ea ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf2d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8be, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcad, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2eb, 0xd6fc, 0x0000, 0x0000,
+ /* b0 */ 0xcaf9, 0x0000, 0x0000, 0xd4da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf4d7, 0xcca1, 0x0000, 0x0000, 0xcfba,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x0352a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd9c3, 0xd0e8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe3c5, 0xebf8, 0x0000, 0xf2b1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcfbb, 0x0000, 0x0000, 0x0000, 0xd3ad, 0xe8e1, 0xceec,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x03568 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdee3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xddf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2b2, 0xf3f6, 0xf6db,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7fe, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf8df, 0x0000, 0xf7f2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x035a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6da,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd7bc, 0xcce3, 0x0000, 0x0000, 0xe6db,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdddd, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x035e2 ***/
+
+ /* 80 */ 0x0000, 0xd1b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefed,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6de, 0xe4f4, 0xe1ef, 0x0000,
+ /* 90 */ 0x0000, 0xddf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8cf,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcae5, 0x0000, 0x0000, 0x0000, 0xdca1,
+ /* a8 */ 0x0000, 0xe0b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfcac, 0xfcad, 0xd8a7, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x03621 ***/
+
+ /* 80 */ 0x0000, 0xedb8, 0x0000, 0x0000, 0x0000, 0xdbb6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd6f0, 0xf3af, 0x0000, 0x0000, 0xcda5, 0x0000,
+ /* 90 */ 0xdaf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd8a8, 0x0000, 0x0000, 0x0000, 0xcce4, 0x0000, 0x0000, 0xd1b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdaf2, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x03660 ***/
+
+ /* 80 */ 0x0000, 0xf5a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd5ec, 0xd5f8, 0xdaf3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe3c6, 0x0000, 0x0000, 0x0000, 0xdee4, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x036a0 ***/
+
+ /* 80 */ 0xdee5, 0xd1b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1b6,
+ /* 88 */ 0xd1b7, 0xf2b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe9de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d3, 0xf2b4,
+ /* 98 */ 0x0000, 0x0000, 0xf0d4, 0xcbe4, 0xfbd4, 0xf5e6, 0xe3ea, 0x0000,
+ /* a0 */ 0xdee6, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfd4, 0x0000, 0x0000,
+ /* a8 */ 0xf8f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd1b8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6df,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x036e0 ***/
+
+ /* 80 */ 0x0000, 0xd0d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfca1, 0xefee, 0xdcd8,
+ /* 90 */ 0x0000, 0xe9df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5dd, 0xfdfb,
+ /* a8 */ 0x0000, 0x0000, 0xe0c9, 0x0000, 0x0000, 0x0000, 0xd6c9, 0x0000,
+ /* b0 */ 0x0000, 0xd4aa, 0x0000, 0xe5cc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe9e0, 0x0000, 0x0000, 0x0000, 0xd0d8, 0xfca2, 0xd4be,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x03720 ***/
+
+ /* 80 */ 0xe2b3, 0xdee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdcbc, 0xd2b6, 0xf5d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcea1, 0xf5a9, 0x0000, 0x0000, 0xddf9, 0x0000, 0x0000,
+ /* 98 */ 0xddfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6df, 0x0000, 0xf2da, 0xe4eb,
+ /* a8 */ 0x0000, 0xf2f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xecb9, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x03760 ***/
+
+ /* 80 */ 0xfdfc, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1aa, 0x0000, 0x0000,
+ /* 88 */ 0xcad9, 0x0000, 0x0000, 0xefef, 0x0000, 0xf5aa, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecf9, 0x0000, 0x0000, 0xf8ad,
+ /* 98 */ 0x0000, 0xf2c2, 0xf6c3, 0x0000, 0xd7d2, 0x0000, 0x0000, 0xf9a2,
+ /* a0 */ 0xf0d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fa, 0x0000,
+ /* b0 */ 0x0000, 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f3, 0xf2c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd4ab, 0xcab3, 0xcda6, 0x0000, 0xcdc3,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x037a0 ***/
+
+ /* 80 */ 0xcdda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cf, 0x0000,
+ /* 88 */ 0x0000, 0xf6c4, 0x0000, 0x0000, 0x0000, 0xeedd, 0xe7c4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdfe2, 0xe7db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8b1, 0x0000, 0xfcae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe5cd, 0x0000, 0x0000, 0x0000, 0xfaeb, 0x0000, 0xcfbc, 0x0000,
+ /* b8 */ 0x0000, 0xcfe2, 0xcdf6, 0x0000, 0x0000, 0xeff0, 0x0000, 0xf4be,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x037e0 ***/
+
+ /* 80 */ 0x0000, 0xd4cd, 0x0000, 0x0000, 0xf3b8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe9a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf2f2, 0xf3eb, 0x0000, 0xf0d7, 0x0000, 0x0000,
+ /* 98 */ 0xcfd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfdf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8c0, 0xe8c1, 0x0000, 0x0000, 0x0000, 0xcfe3, 0xe9a2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd0aa, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7abxx - offset 0x0381c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c1, 0xd0ab, 0x0000, 0xd4e4,
+ /* 88 */ 0x0000, 0x0000, 0xefbc, 0xd8a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9df,
+ /* 98 */ 0x0000, 0xf3d7, 0x0000, 0x0000, 0x0000, 0xdcbd, 0x0000, 0xcce5,
+ /* a0 */ 0xedf1, 0x0000, 0x0000, 0xf1e2, 0x0000, 0xd4db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe2b5, 0x0000, 0x0000, 0xcae6, 0x0000, 0xd3ae,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcce6, 0x0000,
+ /* b8 */ 0x0000, 0xf1d3, 0xf5e7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcada,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x0385c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbee,
+ /* 90 */ 0x0000, 0xe1c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdfe9, 0x0000, 0xeede, 0x0000, 0x0000, 0xf7c2, 0x0000,
+ /* a0 */ 0xd8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddac, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0af, 0xd6bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1ab,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x03896 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9b6, 0x0000,
+ /* 88 */ 0x0000, 0xd4f5, 0x0000, 0xd0c9, 0xefa7, 0xe2ec, 0x0000, 0xdbea,
+ /* 90 */ 0xcecc, 0xf5e8, 0xf7d5, 0x0000, 0xd3cd, 0x0000, 0xf3fe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd0b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fe, 0x0000, 0xdffb, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6dd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x038d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbcd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xefa8, 0x0000, 0x0000, 0x0000, 0xeeb4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdad8, 0xd1b9, 0x0000, 0xdfa9,
+ /* 98 */ 0x0000, 0x0000, 0xf3b0, 0x0000, 0x0000, 0xccc4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xceb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefa9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdfd5, 0x0000, 0x0000, 0xedd7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xeec6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03914 ***/
+
+ /* 80 */ 0xefbd, 0xfcd6, 0x0000, 0x0000, 0xdbf4, 0x0000, 0xefaa, 0xf8b9,
+ /* 88 */ 0x0000, 0xf5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1c6, 0x0000, 0x0000, 0x0000, 0xd4bf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdee8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x0394d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ea,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf3c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3af, 0x0000,
+ /* a0 */ 0x0000, 0xcadb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcd7,
+ /* a8 */ 0x0000, 0x0000, 0xedd8, 0xe1c7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d8, 0xd6b3, 0xddad,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x0398d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd5be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c3, 0xeedf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd6eb, 0x0000, 0x0000, 0x0000, 0xf4d9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdab7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x039ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xddfb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xddcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8a3, 0x0000, 0x0000, 0xdad9, 0x0000, 0xf0d8,
+ /* 98 */ 0xefc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d4, 0x0000, 0xedf2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5db, 0x0000,
+ /* b0 */ 0x0000, 0xd5dc, 0xf3c4, 0xcbd7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe2b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03a09 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfbd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3d8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddd0, 0xf0d9,
+ /* a0 */ 0xcbb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5dd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xcda7, 0x0000, 0x0000, 0xd0ac, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03a49 ***/
+
+ /* 80 */ 0xd1ba, 0x0000, 0xf1c4, 0x0000, 0xe5b3, 0xfbf5, 0xe9e1, 0xfde0,
+ /* 88 */ 0xfcbc, 0x0000, 0xdaa2, 0xdaa3, 0x0000, 0xd2a1, 0x0000, 0x0000,
+ /* 90 */ 0xd2ef, 0x0000, 0x0000, 0x0000, 0xe2ed, 0x0000, 0x0000, 0xdee9,
+ /* 98 */ 0xcedc, 0xf2b5, 0xd0e4, 0xddd1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1c8, 0xdbb7, 0xdfe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedb9, 0xf1c5, 0x0000, 0xf3cf, 0xd7ab,
+ /* b0 */ 0xe1ac, 0x0000, 0x0000, 0xe3eb, 0x0000, 0xeec7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1c9, 0xcafa, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03a87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf0fb, 0xfae1, 0xf0da, 0xcce7, 0xdaf4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xccbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xceed, 0x0000,
+ /* a0 */ 0x0000, 0xd5a9, 0xfae2, 0x0000, 0x0000, 0x0000, 0xd0e5, 0x0000,
+ /* a8 */ 0xebd6, 0x0000, 0xecdf, 0x0000, 0x0000, 0x0000, 0xdffc, 0x0000,
+ /* b0 */ 0x0000, 0xf7d6, 0xdeea, 0xcbb4, 0x0000, 0x0000, 0xefbe, 0x0000,
+ /* b8 */ 0x0000, 0xccb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfbd,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03ac7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff2, 0xe2b7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcce8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd6e0, 0x0000, 0xf1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b8, 0xebab, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcbb5, 0xd8d1, 0x0000, 0xf4ce, 0xf3f7, 0x0000, 0x0000,
+ /* b8 */ 0xd7c6, 0x0000, 0xd1bb, 0xf7aa, 0x0000, 0xedca, 0xd7d3, 0xd8fa,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03b07 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c5,
+ /* 88 */ 0x0000, 0x0000, 0xd1cc, 0xddfc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdffd, 0x0000,
+ /* 98 */ 0xf9e5, 0x0000, 0xe0ca, 0x0000, 0x0000, 0xf2fd, 0xd3b0, 0x0000,
+ /* a0 */ 0xf4f3, 0xdac9, 0x0000, 0xe6de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8ba, 0xe8d0, 0x0000, 0x0000, 0xd8fb, 0x0000, 0x0000, 0xead5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf6c6,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x03b43 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2db, 0xe4fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdada, 0x0000, 0xf2dc, 0xfbd6, 0xe9b2,
+ /* a0 */ 0x0000, 0xeead, 0x0000, 0xfae3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xdcee, 0x0000, 0x0000, 0xf5ea, 0xe6e0,
+ /* b0 */ 0x0000, 0xf0fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ac,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c5, 0xeee0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03b82 ***/
+
+ /* 80 */ 0x0000, 0xdbe5, 0x0000, 0xddde, 0x0000, 0x0000, 0xd9f0, 0xe9a3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf1f9, 0x0000, 0xf2c4, 0xe0cb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a4, 0x0000,
+ /* a0 */ 0x0000, 0xe2b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe3b1, 0xfceb, 0xcda8, 0x0000, 0xccb6, 0x0000, 0x0000,
+ /* b0 */ 0xf0db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe6ba, 0x0000, 0x0000, 0xcda9, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03bc0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf3c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d9, 0x0000, 0x0000, 0xefab,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe7c5, 0x0000, 0x0000, 0xe0e9, 0x0000,
+ /* 98 */ 0xf3c5, 0x0000, 0x0000, 0xd4c0, 0xd5bf,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03bdd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddae, 0x0000,
+ /* b8 */ 0xf9fc, 0x0000, 0xccc0,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03c18 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xceb8, 0x0000, 0x0000, 0x0000, 0xd8d2, 0xf9d6, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1aa, 0xced1, 0x0000, 0x0000, 0xf6c7, 0x0000,
+ /* b0 */ 0xdbeb, 0x0000, 0xdffe, 0x0000, 0x0000, 0xd8e1, 0x0000, 0xf7f3,
+ /* b8 */ 0x0000, 0xd7e7, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03c53 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4fe, 0x0000, 0x0000,
+ /* 88 */ 0xd1bc, 0x0000, 0xe5cf, 0x0000, 0xcbb6, 0x0000, 0xdab8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6be, 0x0000, 0x0000, 0x0000, 0xe2ba, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfd8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe0cc, 0xebf9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfdfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd7e8, 0xcbd8, 0x0000, 0x0000, 0x0000, 0xe9e2, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03c92 ***/
+
+ /* 80 */ 0x0000, 0xe8ba, 0x0000, 0x0000, 0x0000, 0xe3c7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeccd, 0x0000, 0xecce, 0x0000, 0xd6bf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3a7, 0x0000, 0xdfd6, 0xfde8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee1,
+ /* a0 */ 0xf6a8, 0xddfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf8bb, 0x0000, 0xe8d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf9d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xceee, 0x0000, 0x0000, 0xeccf, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03cd2 ***/
+
+ /* 80 */ 0xe9a5, 0xd6d5, 0x0000, 0xcdc5, 0x0000, 0xedba, 0xd1bd, 0x0000,
+ /* 88 */ 0x0000, 0xcfbe, 0x0000, 0x0000, 0xecbb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd2b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xcce9, 0x0000, 0xd9c4,
+ /* 98 */ 0xe9fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1be, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecbc, 0x0000, 0x0000, 0xe5ad, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b0, 0x0000, 0xccea,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03d12 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd3c4, 0x0000, 0x0000, 0xd6c0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd6fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a1, 0x0000,
+ /* 98 */ 0xdebd, 0x0000, 0xf6a9, 0x0000, 0x0000, 0x0000, 0xdaa4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a4,
+ /* b0 */ 0xf5c6, 0x0000, 0xe1a2, 0xe9c6, 0x0000, 0x0000, 0x0000, 0xf2c5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4e9, 0xd6ec, 0xebd3,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03d52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecbd, 0xe2dc, 0xdeeb, 0xf0dc,
+ /* 88 */ 0x0000, 0xebbf, 0x0000, 0xd7ce, 0xd1bf, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ab, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf9fd, 0x0000, 0xcadc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcdc6, 0xf2b6, 0x0000, 0x0000, 0xddfe, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xccb7, 0xdbb8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0e9,
+ /* b0 */ 0x0000, 0xcedd, 0xebc0, 0x0000, 0xfda2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf8cb, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03d8f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xead6, 0xf1b0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdbce, 0x0000, 0xf7c3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdbcf, 0xcba4, 0x0000, 0x0000, 0xf8e0, 0x0000,
+ /* a0 */ 0x0000, 0xfbd7, 0x0000, 0x0000, 0xebca, 0xe0a1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcecd, 0x0000, 0x0000, 0xd4dc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfdd8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2f6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03dcd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf2b7, 0x0000, 0x0000, 0xfaf6, 0xf6aa, 0xfaf7,
+ /* 88 */ 0xd8e6, 0x0000, 0xf4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe8d2, 0x0000, 0xcac5, 0xcceb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe2ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2bb, 0x0000, 0xf7ad, 0x0000, 0x0000, 0x0000, 0xf8e1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf3ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xdea1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03e0c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4fd, 0x0000, 0x0000, 0xe3ec, 0x0000,
+ /* 90 */ 0xddaf, 0xddb0, 0x0000, 0x0000, 0xcbb7, 0xe8d3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a3, 0xd2e0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf0fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe9a6, 0xcbf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xedf3, 0xdcd9, 0xe0cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7da,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03e4c ***/
+
+ /* 80 */ 0xdbb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xccae, 0x0000, 0xdadb, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xddb1, 0x0000, 0xd8af, 0xe3a3, 0x0000, 0x0000,
+ /* a0 */ 0xceef, 0x0000, 0x0000, 0xf2f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0ce, 0x0000, 0xf5fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xebec, 0x0000, 0x0000, 0xd3c5, 0xfcec, 0xd2db,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03e8c ***/
+
+ /* 80 */ 0xd4eb, 0x0000, 0xdea2, 0x0000, 0x0000, 0x0000, 0xe5e6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedf4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3ed, 0x0000, 0xe8c2, 0x0000, 0xedf5,
+ /* a8 */ 0xd7fc, 0x0000, 0xedbb, 0x0000, 0x0000, 0xf6ab, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf2b8, 0xf6c8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd3e6, 0xf2dd, 0xcfbf, 0x0000, 0xebac,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e888xx - offset 0x03ecb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfc0, 0x0000, 0xe6a8,
+ /* 88 */ 0xfde9, 0x0000, 0xcfc1, 0x0000, 0xe0df, 0xdeec, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe0a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf4bf, 0xe2ef, 0x0000, 0xd9f1, 0xf1c7,
+ /* a0 */ 0x0000, 0xcbb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf9fe, 0xdbba, 0xdaf5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ec, 0xdadc, 0xfae4,
+ /* b8 */ 0x0000, 0xe0cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03f0b ***/
+
+ /* 80 */ 0xddb2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a9, 0x0000, 0xeff3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf3ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebfa, 0x0000, 0xf9e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcadd, 0xd5de,
+ /* b0 */ 0x0000, 0xcade, 0xdfe4, 0x0000, 0x0000, 0x0000, 0xe6fd, 0x0000,
+ /* b8 */ 0xf5ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88axx - offset 0x03f4a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe9e3, 0x0000, 0xedcb, 0xcfe4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xddb3, 0xd4ec, 0x0000, 0x0000, 0xf2b9, 0x0000, 0xdfb7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbce, 0xfbd8, 0x0000,
+ /* a8 */ 0x0000, 0xd0d9, 0x0000, 0x0000, 0xddd2, 0xf7f4, 0xe7dc, 0xe4a5,
+ /* b0 */ 0x0000, 0xfca3, 0x0000, 0xdbbb, 0x0000, 0x0000, 0x0000, 0xf2ba,
+ /* b8 */ 0xe9fd, 0xd0ca, 0x0000, 0xf5d6, 0xd9c5, 0xe4b4, 0x0000, 0xeda7,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03f8a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xeabd, 0xe6fe, 0x0000, 0xf7c4, 0xf5ad, 0x0000, 0xd9e0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcab4, 0x0000, 0x0000, 0xf8e2, 0xcfc2,
+ /* a0 */ 0x0000, 0xecbe, 0x0000, 0x0000, 0x0000, 0xe5b4, 0xcdc8, 0xeec8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe7c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc9, 0xf9b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03fc9 ***/
+
+ /* 80 */ 0x0000, 0xf1e8, 0xd9f2, 0xdbf5, 0xcab5, 0xd9c6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd8c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ab,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xedbc, 0x0000, 0x0000, 0xd8d4, 0x0000, 0x0000, 0x0000, 0xdcda,
+ /* b0 */ 0x0000, 0xe2bc, 0x0000, 0x0000, 0xfced, 0xece0, 0xd2fe, 0x0000,
+ /* b8 */ 0xe9c7, 0xe6aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x04009 ***/
+
+ /* 80 */ 0xe2f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfabb,
+ /* 88 */ 0x0000, 0xf5ae, 0xfbaa, 0x0000, 0x0000, 0x0000, 0x0000, 0xecfb,
+ /* 90 */ 0x0000, 0xecbf, 0xfcd8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd4e5, 0x0000, 0x0000, 0x0000, 0xf9c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeee2,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88exx - offset 0x04045 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd7e9, 0xedf6, 0x0000, 0x0000, 0x0000, 0xdeed, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccec, 0x0000,
+ /* 98 */ 0xe3ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8d4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfaf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xddb4, 0xe4b5, 0xd8b0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8d5, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88fxx - offset 0x04084 ***/
+
+ /* 80 */ 0x0000, 0xf4ea, 0x0000, 0x0000, 0x0000, 0xceb9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd6e1, 0xcfd2, 0x0000, 0xd0b6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcea2, 0x0000, 0x0000, 0xf3ee, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3f8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdccc, 0x0000, 0xd0cb, 0x0000, 0x0000, 0x0000, 0xfca4,
+ /* b0 */ 0xcdca, 0xd7d4, 0xdea3, 0x0000, 0xe4e0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeec9, 0x0000, 0x0000, 0x0000, 0xe2dd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x040c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf5fe, 0xd4ac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd5d1, 0x0000, 0xd8f0, 0xf8c3, 0xead7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf5d7, 0x0000, 0x0000, 0xd8bf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfdc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xebad, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5aa,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x04100 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe7a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcae7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf8e3, 0x0000, 0xd4dd, 0x0000, 0x0000, 0xead8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbd9, 0xedf7, 0x0000, 0x0000, 0xe5b5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0ad, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf1f1,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x0413b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe2bd, 0x0000, 0x0000, 0x0000, 0xe3c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd9d5, 0x0000, 0x0000, 0xdfaa, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdbbc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf8e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf1fa, 0x0000, 0x0000, 0xe5b6, 0xf3ef, 0x0000, 0x0000, 0xfbda,
+
+ /*** Three byte table, leaf: e893xx - offset 0x0417b ***/
+
+ /* 80 */ 0xe1e0, 0x0000, 0xd9ac, 0x0000, 0xf5eb, 0x0000, 0xe0b6, 0x0000,
+ /* 88 */ 0x0000, 0xe9c8, 0x0000, 0xcbcf, 0x0000, 0xe3c9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdeee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe2be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdcef, 0x0000, 0xd6a5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6fe,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e894xx - offset 0x041b8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9a1, 0x0000, 0xd8c0, 0xdcdb, 0x0000, 0x0000, 0xedbd,
+ /* 98 */ 0xdfb8, 0x0000, 0xeaa5, 0x0000, 0x0000, 0x0000, 0xd7ad, 0x0000,
+ /* a0 */ 0x0000, 0xf3f9, 0x0000, 0xedf8, 0x0000, 0xf5c7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ca, 0xebe3, 0x0000, 0xf2de,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8cc, 0x0000, 0xead9,
+
+ /*** Three byte table, leaf: e895xx - offset 0x041f8 ***/
+
+ /* 80 */ 0x0000, 0xd3c6, 0x0000, 0xdbe6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf5af, 0x0000, 0x0000, 0x0000, 0x0000, 0xcef0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe9fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfbb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe2f2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcff2, 0xf7b9, 0xd9f3, 0x0000, 0x0000, 0xe1cb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e896xx - offset 0x04234 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdadd, 0x0000, 0x0000, 0xdab9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebfb,
+ /* 90 */ 0x0000, 0xcbb9, 0x0000, 0x0000, 0xedf9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0e0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c0, 0x0000,
+ /* a8 */ 0xfdbc, 0xdfb1, 0xe3ef, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a3,
+ /* b0 */ 0xfdb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf0b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x04273 ***/
+
+ /* 80 */ 0x0000, 0xcdcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xedbe, 0x0000, 0x0000, 0x0000, 0xd5c0, 0xe3f0, 0xedfa,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5ed, 0xe7dd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f6, 0xe5b7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdbe7, 0xe2bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeecb,
+ /* b8 */ 0x0000, 0x0000, 0xd7f4, 0xf0dd, 0x0000, 0x0000, 0x0000, 0xceab,
+
+ /*** Three byte table, leaf: e898xx - offset 0x042b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7de, 0x0000, 0x0000, 0x0000, 0xd6d6, 0xe1cc,
+ /* 88 */ 0x0000, 0x0000, 0xe8b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ee, 0xdca2,
+ /* 98 */ 0x0000, 0x0000, 0xe0d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a1,
+
+ /*** Three byte table, leaf: e899xx - offset 0x042f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbdb, 0x0000,
+ /* 90 */ 0xf9cb, 0x0000, 0x0000, 0x0000, 0xcbf3, 0xf4a5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfac8, 0xd6d7, 0x0000, 0xe9e5, 0xfbdc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfbf6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x0432d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdaa5, 0x0000, 0xdbbd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xece2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcdf7, 0xf0de, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf6c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x04366 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeef,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd3b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcee, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe8c3, 0x0000, 0xf1c8, 0x0000, 0x0000, 0x0000, 0xcef1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ed, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4b6, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x043a6 ***/
+
+ /* 80 */ 0xf5b9, 0x0000, 0xdcf0, 0xe3f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf2bb, 0x0000, 0xdea4, 0x0000, 0xdacc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89dxx - offset 0x043d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcae9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3da, 0x0000, 0xfcd9,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeada,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c4, 0x0000,
+ /* a8 */ 0xe3a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbdd, 0x0000, 0xefca, 0x0000,
+ /* b8 */ 0xe8c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x04416 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebd7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ad,
+ /* a0 */ 0x0000, 0x0000, 0xfbab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd3d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd5a2, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89fxx - offset 0x04452 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6de, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdaf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d1, 0x0000, 0x0000, 0xe9a8,
+ /* b0 */ 0x0000, 0x0000, 0xf5f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfaaf, 0x0000, 0xebfc, 0x0000, 0x0000, 0xe0ea,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x04491 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c5,
+ /* a0 */ 0x0000, 0x0000, 0xf1e3, 0xd5ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcdcc, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd9, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8c1, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x044d1 ***/
+
+ /* 80 */ 0xfaec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1eb, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfabc, 0xe6e2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfae5, 0xe2fa, 0x0000, 0x0000, 0x0000, 0xcab6,
+ /* 98 */ 0x0000, 0xe4b7, 0x0000, 0xeadb, 0x0000, 0xf5fa, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfbac, 0xcfc3, 0xebfd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8fa, 0x0000, 0x0000, 0xdfb9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe1f1, 0x0000, 0xd2a4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5fb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0da, 0xd0db,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x04511 ***/
+
+ /* 80 */ 0x0000, 0xeabe, 0xd9b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcab7, 0x0000, 0x0000, 0xd3e7, 0x0000, 0xf8e5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd3b2, 0x0000, 0x0000, 0x0000, 0xe2c0, 0xf2df,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf9ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdcd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x04550 ***/
+
+ /* 80 */ 0x0000, 0xeeae, 0xd6ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e0, 0xebae, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xcfd9, 0x0000, 0x0000, 0xdccd, 0xedfb, 0x0000, 0xdef0,
+ /* a0 */ 0x0000, 0xd7eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdea5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdfd7, 0xdbd0, 0xdbd1, 0x0000, 0x0000,
+ /* b8 */ 0xd5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x0458e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcdc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcae8, 0x0000, 0xf8e6, 0xdcce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeadc, 0xdbd2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9b3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf7db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a8, 0x0000,
+ /* b8 */ 0xd7ae, 0x0000, 0x0000, 0xe0e1, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x045cd ***/
+
+ /* 80 */ 0x0000, 0xcbba, 0x0000, 0x0000, 0xe5d1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0dc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd8ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe3a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a4,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x0460d ***/
+
+ /* 80 */ 0x0000, 0xe9a9, 0x0000, 0xd3c7, 0x0000, 0x0000, 0xdcdd, 0xf8ae,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xccb8, 0x0000, 0x0000, 0x0000, 0xd0ae,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd8f2, 0x0000, 0x0000, 0xe3ca, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xccaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd4ad, 0xf6d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd0cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcac6, 0x0000, 0x0000, 0xd5c2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x0464d ***/
+
+ /* 80 */ 0xceba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xcac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfab0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdfd8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x0468d ***/
+
+ /* 80 */ 0xe5eb, 0x0000, 0xeff4, 0xddb5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcdaa, 0x0000, 0xe3f2, 0x0000, 0xfbf7, 0x0000, 0xf7d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfdba, 0x0000, 0x0000, 0xfde1, 0xf6fe,
+ /* 98 */ 0xd1c0, 0x0000, 0x0000, 0xe8c5, 0x0000, 0xe4b8, 0x0000, 0xe1e8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xccc1, 0x0000, 0xd2ed, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbbe, 0x0000, 0x0000, 0xe0e2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfac9, 0x0000, 0x0000, 0xe1cd, 0x0000, 0xcab8, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf2e0, 0xf1c9,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x046c9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdef1, 0x0000, 0x0000, 0x0000, 0xf0df, 0xf8c4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeecc, 0x0000, 0x0000, 0xdef2, 0x0000,
+ /* a0 */ 0xe7c9, 0x0000, 0xe2f3, 0xe7e1, 0x0000, 0x0000, 0xe3cb, 0x0000,
+ /* a8 */ 0x0000, 0xe3cc, 0x0000, 0x0000, 0x0000, 0xcff8, 0xefac, 0x0000,
+ /* b0 */ 0xfdfe, 0xfca5, 0xfab1, 0xdfd9, 0x0000, 0xe0d2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf4da, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04704 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ca, 0x0000, 0xcea3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2bc, 0xece3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe0a5, 0x0000, 0xf7ab, 0x0000, 0x0000,
+ /* 98 */ 0xebaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5de, 0x0000,
+ /* a0 */ 0xe1a4, 0xcdab, 0x0000, 0xd9f4, 0xe8a6, 0xcdce, 0xe1e9, 0x0000,
+ /* a8 */ 0xfcef, 0x0000, 0xe0e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe2c1, 0x0000, 0xcea4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdea6, 0x0000, 0x0000, 0xebfe, 0x0000, 0xebdd, 0xf0e0,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04744 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf4db, 0x0000, 0xe2f4, 0x0000, 0x0000, 0xd3c8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf4eb, 0x0000, 0xeeb5, 0x0000, 0xf5d8,
+ /* 90 */ 0x0000, 0x0000, 0xd5df, 0x0000, 0x0000, 0x0000, 0xd6e5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xebb0, 0xf4e3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe3cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f4, 0xfab2,
+ /* a8 */ 0x0000, 0x0000, 0xeff5, 0xcadf, 0x0000, 0xebb1, 0xedbf, 0x0000,
+ /* b0 */ 0x0000, 0xfdc9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a6, 0xf9a4,
+ /* b8 */ 0xf0b3, 0x0000, 0xe5ec, 0x0000, 0x0000, 0x0000, 0xd1e7, 0x0000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x04784 ***/
+
+ /* 80 */ 0xd9c7, 0xe4d7, 0xeadd, 0x0000, 0xd4f7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaba, 0x0000,
+ /* 90 */ 0xdacd, 0x0000, 0x0000, 0x0000, 0xf9cc, 0x0000, 0xe1da, 0xdbbf,
+ /* 98 */ 0x0000, 0xccc5, 0xecd0, 0xcbbb, 0x0000, 0xdef3, 0x0000, 0x0000,
+ /* a0 */ 0xe9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd9c8, 0x0000, 0x0000, 0xeee3, 0xd7bd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xcfc4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd0cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x047c3 ***/
+
+ /* 80 */ 0x0000, 0xfca6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf1fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd2, 0xd1c1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe3db, 0x0000, 0xd3c9, 0x0000, 0xdccf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcced, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdea7, 0x0000, 0x0000, 0xe6bb,
+ /* b0 */ 0xeca1, 0x0000, 0x0000, 0x0000, 0xccb9, 0x0000, 0x0000, 0xfbde,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04803 ***/
+
+ /* 80 */ 0xd4c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdca8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe2c2, 0x0000, 0xf3d8, 0xe5d3, 0x0000, 0x0000, 0xf3d9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3c6,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x0481e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcddb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdac,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x0485e ***/
+
+ /* 80 */ 0x0000, 0xfcc3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e7, 0x0000,
+ /* 88 */ 0xd1c2, 0x0000, 0xf9a5, 0x0000, 0xe8d5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ce, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd4ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdfda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xfbdf, 0xe7e3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf8fb, 0xe3cf, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x0489c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf5b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd8e7, 0x0000, 0xd9c9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8af, 0xeff6, 0x0000,
+ /* a0 */ 0xddb6, 0xeeaf, 0xcdf8, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb8,
+ /* a8 */ 0xfca7, 0xf7fc, 0xf7b1, 0xcebb, 0xf4a1, 0x0000, 0x0000, 0xeecd,
+ /* b0 */ 0xe1ae, 0x0000, 0x0000, 0xecc3, 0xcffe, 0x0000, 0xf8bf, 0xd8e2,
+ /* b8 */ 0xd3e8, 0x0000, 0x0000, 0xdea8, 0xf4e4, 0xecc2, 0x0000, 0xd9f5,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x048dc ***/
+
+ /* 80 */ 0xf9c5, 0xddd3, 0xd6f1, 0xecfc, 0xfcf0, 0x0000, 0x0000, 0xedc0,
+ /* 88 */ 0xcab9, 0x0000, 0xeee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf2e1, 0x0000, 0xdeb9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6f2, 0x0000, 0xdef4, 0x0000, 0xdfdb, 0x0000,
+ /* a0 */ 0xdbd3, 0x0000, 0xfae7, 0xd8e3, 0xf4c1, 0x0000, 0xddb7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf2f5, 0x0000, 0x0000, 0xd4ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6f3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xddb8, 0xcfc5, 0xdfdf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x0491a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2be, 0xf6a1, 0x0000, 0xebcb,
+ /* 88 */ 0xf1fc, 0x0000, 0xf3c7, 0x0000, 0x0000, 0xe0eb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xedfc, 0x0000, 0x0000, 0xe1db, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04936 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeee5, 0x0000, 0xdef5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfad3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf1cb, 0x0000, 0x0000, 0xd0af, 0xddb9, 0x0000, 0x0000, 0xd1c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04971 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf0e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf6ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf0eb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xddba, 0x0000, 0x0000, 0x0000, 0xf2bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x049b0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdba2, 0xf2f6, 0x0000, 0x0000, 0xcaba,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf7f5, 0x0000, 0xcbe5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeee6, 0x0000, 0xe0d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcea5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6d8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd4af, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x049e6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe9c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3ce,
+ /* 90 */ 0xf4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbe6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebb2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1a2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04a24 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xebb3, 0x0000, 0xf0b4, 0x0000, 0x0000, 0xcbf4,
+ /* 88 */ 0xd4b0, 0xf3b2, 0xfbb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf5ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee7,
+ /* a0 */ 0xf4b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ed, 0x0000, 0xcff3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04a63 ***/
+
+ /* 80 */ 0x0000, 0xf0e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeece,
+ /* 88 */ 0x0000, 0x0000, 0xf1cc, 0x0000, 0x0000, 0xe5b8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd7f5, 0xe3f3, 0xcfe5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04aa3 ***/
+
+ /* 80 */ 0xcfc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3b3, 0xe4d8, 0xcff9, 0xcfda, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfacd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf2e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ee, 0x0000, 0x0000, 0xcabb, 0x0000, 0x0000, 0xe3dc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x04ae2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xcef2, 0x0000, 0xd6d9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeeb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4e5, 0xd8c2, 0xdcd0, 0xccee, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5e0, 0xf6ca, 0xfdca, 0xd8d6, 0xf4cf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a6, 0xdcbe,
+ /* a8 */ 0x0000, 0xdbd4, 0xd7c7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fe,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf1cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe2c3, 0xdcde, 0x0000, 0xdcdf, 0x0000, 0x0000, 0xefad, 0xe6ab,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04b22 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9dd, 0xeabf, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xefae, 0x0000, 0x0000, 0x0000, 0xf4d0, 0xcef3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ac, 0x0000, 0xcede,
+ /* a0 */ 0x0000, 0x0000, 0xd5f9, 0x0000, 0x0000,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04b47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe3f4, 0xcdd0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd5b8, 0x0000, 0x0000, 0xf7fd, 0x0000,
+ /* a8 */ 0xdca9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdef6, 0x0000, 0xdcaa,
+ /* b0 */ 0xf2e3, 0xe9b4, 0xd2dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04b85 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9e6, 0x0000, 0x0000, 0xe3f6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ca, 0x0000,
+ /* 90 */ 0x0000, 0xd0ce, 0x0000, 0x0000, 0xdaf7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcabc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xeee8, 0xdade, 0x0000, 0xf2f7, 0x0000, 0x0000,
+ /* b0 */ 0xe2fb, 0x0000, 0xcca6, 0x0000, 0x0000, 0x0000, 0x0000, 0xdabb,
+ /* b8 */ 0x0000, 0xeee9, 0x0000, 0x0000, 0x0000, 0xf5da, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x04bc5 ***/
+
+ /* 80 */ 0xf7dc, 0xe1ea, 0xcec1, 0xd4b1, 0x0000, 0xfdb1, 0xe6bd, 0x0000,
+ /* 88 */ 0xfbad, 0x0000, 0x0000, 0xf8e7, 0x0000, 0xe1ce, 0x0000, 0xf7e2,
+ /* 90 */ 0xf5ef, 0xcfc7, 0x0000, 0x0000, 0xd4b2, 0xccef, 0x0000, 0xd4e8,
+ /* 98 */ 0x0000, 0xeecf, 0xf7d7, 0x0000, 0x0000, 0xe0a6, 0xd6c1, 0xe1dc,
+ /* a0 */ 0xf0e3, 0xf1e4, 0xdcf1, 0xd6a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f5, 0x0000,
+ /* b0 */ 0x0000, 0xf1ce, 0xf2e4, 0x0000, 0x0000, 0xd0b0, 0x0000, 0x0000,
+ /* b8 */ 0xecef, 0x0000, 0x0000, 0x0000, 0xf9ba, 0x0000, 0xebb5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x04c04 ***/
+
+ /* 80 */ 0x0000, 0xd4ed, 0xe2c4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e7,
+ /* 88 */ 0x0000, 0x0000, 0xebb4, 0xeaa1, 0x0000, 0xf8bc, 0xcea6, 0x0000,
+ /* 90 */ 0xf9c6, 0xfcda, 0x0000, 0xd4b3, 0xd3b9, 0xeade, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe9ab, 0x0000, 0x0000, 0xe1e1, 0xd3cf, 0xf4f6, 0x0000,
+ /* a0 */ 0xeac0, 0xe1cf, 0x0000, 0xccba, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeeea, 0x0000, 0x0000, 0x0000, 0xf0e4, 0xf3b4, 0xd4ee,
+ /* b0 */ 0x0000, 0x0000, 0xf2c0, 0x0000, 0x0000, 0xf1e5, 0x0000, 0xf4c3,
+ /* b8 */ 0xe0d4, 0x0000, 0xebb6, 0x0000, 0xd7a1, 0xcbe8, 0x0000, 0xf9ad,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04c44 ***/
+
+ /* 80 */ 0xe9ad, 0xd8e4, 0xfab3, 0xe2c5, 0xfcbd, 0x0000, 0x0000, 0xecc4,
+ /* 88 */ 0xd8b1, 0x0000, 0xdcab, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a4,
+ /* 90 */ 0x0000, 0xebe9, 0x0000, 0x0000, 0x0000, 0xe8bb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd8d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfbae, 0xd1e1, 0x0000, 0x0000, 0xdbc0, 0x0000,
+ /* a8 */ 0xf5be, 0x0000, 0xdef7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafb,
+ /* b0 */ 0xf7c6, 0xcfc8, 0x0000, 0x0000, 0x0000, 0xe1d0, 0x0000, 0x0000,
+ /* b8 */ 0xeed0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x04c83 ***/
+
+ /* 80 */ 0x0000, 0xe9f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcef4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cd, 0x0000,
+ /* a0 */ 0x0000, 0xcfdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xddbb, 0x0000, 0x0000, 0x0000, 0x0000, 0xceac, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e984xx - offset 0x04cc1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe4c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5db, 0x0000, 0x0000, 0xfac1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdea9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd3b3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x04cf8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xebb7, 0xeff8, 0xf5dc, 0xedcc, 0xdbd5, 0xf1cf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf5b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd9ae, 0xd5ac, 0x0000, 0xe2c6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda3, 0x0000, 0xfbe5,
+ /* b8 */ 0xdfab,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x04d31 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f5,
+ /* 88 */ 0x0000, 0xf6ad, 0x0000, 0xf5b3, 0x0000, 0xf0b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5dd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xeca2, 0xedfd, 0x0000, 0xf5b4, 0xfbb8,
+ /* b0 */ 0x0000, 0xdba3, 0x0000, 0x0000, 0xd6ca, 0xcbd9, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04d71 ***/
+
+ /* 80 */ 0xe5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fa,
+ /* 88 */ 0x0000, 0xebb8, 0x0000, 0xe0b7, 0xd7ec, 0xf1ec, 0xe5af, 0xd5e1,
+ /* 90 */ 0xd7ed, 0xd1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f2,
+ /* 98 */ 0xeff9, 0x0000, 0x0000, 0x0000, 0xddbc, 0xf6dc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf0e5, 0x0000, 0x0000, 0x0000, 0xf4c4,
+ /* a8 */ 0x0000, 0x0000, 0xe9e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fb,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e988xx - offset 0x04da7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4ef, 0x0000, 0x0000,
+ /* 90 */ 0xcca2, 0xf7fe, 0xdfbc, 0x0000, 0x0000, 0x0000, 0x0000, 0xebcd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6c2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe8ad, 0x0000, 0x0000, 0x0000, 0x0000, 0xefaf,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04de7 ***/
+
+ /* 80 */ 0xcba5, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbe9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccc6,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe6e7, 0x0000, 0x0000, 0xeac7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdba4, 0x0000, 0xcfc9, 0xe2fc, 0xeffa, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04e27 ***/
+
+ /* 80 */ 0xebde, 0x0000, 0x0000, 0xf5c8, 0x0000, 0xd4de, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe0d5, 0x0000, 0xefb0, 0x0000, 0x0000, 0xe2c7, 0x0000,
+ /* 98 */ 0xd9af, 0x0000, 0x0000, 0x0000, 0xf9e7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe7e5, 0x0000, 0x0000, 0xcfca, 0xe1d1,
+ /* b8 */ 0x0000, 0xe2c8,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04e61 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeffb, 0x0000, 0x0000, 0xfaf9,
+ /* 90 */ 0x0000, 0x0000, 0xdcf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcbea, 0x0000, 0x0000, 0x0000, 0xcbbc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04e9e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6e2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf5de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf5df, 0x0000, 0xeeb6, 0x0000, 0x0000, 0x0000, 0xe2f6, 0xd3ca,
+ /* a0 */ 0xeffc, 0xd1c4, 0xefb1, 0x0000, 0xd1c5, 0x0000, 0xd0de, 0x0000,
+ /* a8 */ 0xd9e1, 0x0000, 0x0000, 0xe0b8, 0x0000, 0x0000, 0xcdd1, 0xf3b9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04ed6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe7cc, 0x0000, 0xd6a8, 0xcea7, 0x0000, 0xd4b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd3b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6dd, 0x0000, 0xf1a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x04f15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccc7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ca, 0x0000, 0xe1f0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfbaf, 0x0000, 0x0000, 0x0000, 0xcbd1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe0, 0xf2e5, 0x0000, 0x0000,
+ /* b0 */ 0xecf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04f52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf0ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xeeeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9cb, 0x0000,
+ /* a0 */ 0x0000, 0xccf0, 0x0000, 0x0000, 0xd7af, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04f8e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcf5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf1a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xefb2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d1, 0x0000, 0x0000,
+ /* b8 */ 0xf7a1, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x04fca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcafc, 0xcafd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcece, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c8, 0x0000, 0xf3ba,
+
+ /*** Three byte table, leaf: e995xx - offset 0x0500a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedfe,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x0504a ***/
+
+ /* 80 */ 0xdaa6, 0x0000, 0x0000, 0xe0ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf8cd, 0x0000, 0xcbd2, 0x0000, 0x0000, 0x0000, 0xebce,
+ /* 90 */ 0x0000, 0xf9d8, 0xf9d9, 0xcae0, 0xdaca, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcba6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcac8, 0xf9ee, 0xdbec, 0x0000, 0x0000,
+ /* a8 */ 0xd0b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5ef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe7a2, 0xe4d9,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x05087 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e1,
+ /* 88 */ 0x0000, 0x0000, 0xfcc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ef, 0xcff4, 0xf7e6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcebc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf4c5, 0xdca3, 0x0000,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x050ab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddbd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf4c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8a1, 0x0000, 0x0000, 0x0000, 0xe8d6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdbc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf0e6, 0x0000, 0x0000, 0x0000, 0xe4b9,
+
+ /*** Three byte table, leaf: e999xx - offset 0x050eb ***/
+
+ /* 80 */ 0xf6ed, 0x0000, 0xf9ae, 0x0000, 0xddbe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7b0, 0xd8e8, 0xcbbd, 0x0000, 0x0000,
+ /* 90 */ 0xf9da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf8ce, 0xf9f0, 0xe0ed, 0xe3b3, 0xf4b3,
+ /* a0 */ 0x0000, 0x0000, 0xeac2, 0xf2e6, 0xf0b6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbd6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebe4, 0x0000, 0x0000, 0xf2e7, 0x0000, 0xd7d5, 0xd4b6, 0xf9e8,
+ /* b8 */ 0xd7c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x05129 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ea, 0xd7cc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd3e9, 0xe2c9, 0x0000, 0xfcdb, 0xcdad, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccb0, 0xeaa2, 0x0000, 0x0000,
+ /* 98 */ 0xe4f6, 0xd0c0, 0x0000, 0xf0b7, 0xeea1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd7f6, 0x0000, 0x0000, 0x0000, 0xe2ca,
+ /* a8 */ 0xe2cb, 0x0000, 0xfacf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xebdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf4b4, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x05169 ***/
+
+ /* 80 */ 0xedcd, 0xe4d2, 0x0000, 0x0000, 0xeaa9, 0xe4ba, 0xf3a2, 0xcdd2,
+ /* 88 */ 0x0000, 0xf6cb, 0x0000, 0xf1e6, 0xedc1, 0xe8bc, 0xeed1, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e7, 0xe2cc, 0x0000,
+ /* 98 */ 0x0000, 0xe4aa, 0x0000, 0xf5e1, 0xedda, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd7ee, 0xd1f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe9eb, 0xe9ec, 0xe0e4, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaa7,
+ /* b0 */ 0xddd4, 0x0000, 0xeaa3, 0x0000, 0x0000, 0x0000, 0xd6c3, 0xd6f4,
+ /* b8 */ 0x0000, 0xdadf, 0x0000, 0xefb3, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x051a9 ***/
+
+ /* 80 */ 0xe2cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeffd, 0xf2e8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xefc5, 0x0000, 0xe7e7, 0x0000, 0x0000, 0xd7fd, 0x0000,
+ /* 98 */ 0x0000, 0xe7ce, 0x0000, 0x0000, 0xdfdc, 0x0000, 0xf9c7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9f6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdfac, 0x0000, 0xd6da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdca4, 0x0000, 0x0000, 0x0000, 0xf0b8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x051e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5fa, 0x0000, 0xe4f7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf4ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xeffe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a1, 0x0000, 0xdeaa, 0x0000,
+ /* a0 */ 0x0000, 0xdabc, 0xd8fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfad4, 0x0000, 0x0000, 0x0000, 0xece5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfca8, 0x0000, 0x0000, 0xece6,
+ /* b8 */ 0x0000, 0x0000, 0xd8cb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x05222 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xfbb9, 0x0000, 0xe4d3, 0x0000, 0xcdf9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcfd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcaea, 0x0000, 0x0000, 0xcfd4, 0x0000, 0xf8bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x0525c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xeadf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xebe5, 0x0000, 0x0000, 0xe1d2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeaa4, 0x0000, 0x0000, 0x0000, 0xfac2,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x0529c ***/
+
+ /* 80 */ 0xfbe1, 0xfaed, 0xf0a2, 0xccf1, 0x0000, 0xfaa3, 0xe2f7, 0x0000,
+ /* 88 */ 0xe2ce, 0x0000, 0xe9f5, 0x0000, 0xe1eb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe7e8, 0xe8d7, 0xdaf8, 0xd4cb, 0x0000, 0x0000, 0x0000, 0xf7f6,
+ /* 98 */ 0xd6c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e9, 0x0000, 0x0000,
+ /* b0 */ 0xfafa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xccf2, 0xf7dd, 0x0000, 0xdeba,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x052d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcea8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b9, 0xe4fe, 0xe4c9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeac3, 0x0000, 0xefb4, 0x0000, 0x0000, 0x0000, 0xd7be, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe2, 0x0000, 0xcdd3,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xefb5, 0x0000, 0x0000, 0x0000, 0xfae9,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05308 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf9a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfbd,
+ /* b0 */ 0x0000, 0xf7c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05344 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8fd, 0x0000, 0x0000, 0xf8fc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdeab, 0xdbe8, 0x0000, 0x0000, 0xe3dd,
+ /* a0 */ 0x0000, 0xe1e2, 0xd1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d0, 0xebe6, 0xdaf9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecc7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdef8, 0xf8e9, 0xe3de,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x05383 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xcef5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfac3, 0xe5d7, 0x0000, 0xecc8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf3c9, 0x0000, 0x0000, 0xe4bb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefb6, 0x0000,
+ /* a0 */ 0xdcbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcebd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x053be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8c3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd0cf, 0x0000, 0xcffa, 0xf3ca, 0xe0d7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd1c7, 0xe9ae, 0x0000, 0xe8bd, 0x0000, 0x0000, 0xfac4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x053e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2cf, 0x0000,
+ /* 98 */ 0x0000, 0xfac5, 0x0000, 0x0000, 0x0000, 0xf9b8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce0, 0x0000, 0x0000,
+ /* a8 */ 0xfbb0, 0x0000, 0x0000, 0x0000, 0xd8a9, 0xe5df, 0xf9a7, 0x0000,
+ /* b0 */ 0x0000, 0xf6ee, 0x0000, 0xf6cc, 0xe2f8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xecf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x05427 ***/
+
+ /* 80 */ 0x0000, 0xdae0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf1d2, 0xd2cc, 0xcfcb, 0x0000, 0x0000, 0xcabd, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xddbf, 0x0000, 0x0000, 0x0000, 0xf6ef, 0x0000, 0xdef9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfab4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd5ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e7,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x05467 ***/
+
+ /* 80 */ 0x0000, 0xdebe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdcc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1c8, 0xd1c9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcbf6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd4f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e2, 0xe1d3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x054a7 ***/
+
+ /* 80 */ 0xd8e9, 0x0000, 0x0000, 0xf8fe, 0x0000, 0xcfcc, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcef6, 0x0000, 0xfad0,
+ /* 98 */ 0x0000, 0x0000, 0xccf3, 0xe6be, 0x0000, 0x0000, 0x0000, 0xf6ae,
+ /* a0 */ 0x0000, 0x0000, 0xd5f0, 0x0000, 0x0000, 0xd1ca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfcbe, 0xd5f1,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x054d2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcde9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfab5,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9abxx - offset 0x0550b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe2d0, 0xf4f7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcdd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdba5,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x0553a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a2,
+ /* a8 */ 0x0000, 0x0000, 0xf7e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xeaa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a1, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x05579 ***/
+
+ /* 80 */ 0x0000, 0xceda, 0xfbeb, 0xdba6, 0xdbde, 0xd8e5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeae0,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8aa, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6db,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x055ab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefc6, 0x0000,
+ /* 90 */ 0x0000, 0xf8ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcef7, 0x0000, 0x0000, 0xe0d8, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9afxx - offset 0x055e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd7ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ed, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcde6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xccf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x05615 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e3, 0x0000, 0x0000,
+ /* 90 */ 0xe4ca, 0x0000, 0xdce1, 0x0000, 0x0000, 0xf9c8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcbf, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe8a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8c4,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x05651 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbbe,
+ /* 88 */ 0x0000, 0xdcae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7f7,
+ /* 98 */ 0x0000, 0x0000, 0x0000,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x0566c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e8, 0x0000, 0xddc0,
+ /* a8 */ 0x0000, 0xcfcd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdcf3, 0xd9b0, 0x0000, 0xe6e9,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x056a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe4bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeac4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ec, 0x0000,
+ /* a8 */ 0xe4e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfbf8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x056df ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xccbb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4bd, 0x0000, 0x0000,
+ /* a0 */ 0xcddc, 0xd9f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdddf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xedce,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x05712 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd9d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9cd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x0574e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdae, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfce,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf6af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfdd3, 0xebed, 0xd6dc,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x05789 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5a4, 0x0000, 0x0000, 0x0000, 0xd5b6,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x057a8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6dd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9e9, 0x0000, 0x0000, 0x0000, 0xe7a4, 0x0000, 0xd6e3,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x057e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd1cb, 0xd6e4, 0x0000, 0x0000, 0x0000, 0xd5f2,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdefa, 0x0000, 0xd7f8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ea, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfd5, 0xd8fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8ab, 0x0000, 0x0000, 0xfdcb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x05827 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfcdc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a8, 0xd5f3, 0x0000,
+ /* 90 */ 0x0000, 0xfdd9, 0x0000, 0x0000, 0xcca3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd9f9, 0x0000, 0x0000, 0xd3ea, 0xf5f5, 0x0000, 0xefc7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd3da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdabd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x05860 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a8,
+ /* 88 */ 0xdcaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcdd5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe0a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdeac,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x0589c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf0ba, 0xeeb1, 0x0000, 0x0000, 0xeeb2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf6cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeed2,
+ /* a0 */ 0x0000, 0xd6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e5,
+ /* a8 */ 0x0000, 0x0000, 0xf3bb, 0x0000, 0xe5e1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cb,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x058d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a3, 0x0000, 0x0000,
+ /* 90 */ 0xdbc2, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafe, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfcf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab0xx - offset 0x05914 ***/
+
+ /* 80 */ 0xb0a1, 0xb0a2, 0x0000, 0x0000, 0xb0a3, 0x0000, 0x0000, 0xb0a4,
+ /* 88 */ 0xb0a5, 0xb0a6, 0xb0a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb0a8, 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af,
+ /* 98 */ 0x0000, 0xb0b0, 0xb0b1, 0xb0b2, 0xb0b3, 0xb0b4, 0x0000, 0x0000,
+ /* a0 */ 0xb0b5, 0x0000, 0x0000, 0x0000, 0xb0b6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0b7, 0xb0b8, 0x0000, 0xb0b9,
+ /* b0 */ 0xb0ba, 0xb0bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb0bc, 0xb0bd, 0x0000, 0x0000, 0xb0be, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab1xx - offset 0x05954 ***/
+
+ /* 80 */ 0xb0bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb0c0, 0x0000, 0xb0c1, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb0c3, 0x0000, 0x0000, 0x0000, 0xb0c4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb0c5, 0xb0c6, 0x0000, 0x0000, 0xb0c7, 0x0000, 0x0000, 0xb0c8,
+ /* b8 */ 0xb0c9, 0x0000, 0xb0ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab2xx - offset 0x05994 ***/
+
+ /* 80 */ 0xb0cb, 0xb0cc, 0x0000, 0xb0cd, 0xb0ce, 0xb0cf, 0xb0d0, 0x0000,
+ /* 88 */ 0x0000, 0xb0d1, 0xb0d2, 0xb0d3, 0xb0d4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb0d5, 0x0000, 0x0000, 0x0000, 0xb0d6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0d7, 0xb0d8, 0x0000, 0xb0d9,
+ /* a0 */ 0xb0da, 0xb0db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb0dc, 0xb0dd, 0xb0de, 0x0000, 0xb0df, 0x0000, 0x0000, 0xb0e0,
+ /* b0 */ 0xb0e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb0e2, 0xb0e3, 0x0000, 0xb0e4, 0xb0e5, 0xb0e6, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eab3xx - offset 0x059d3 ***/
+
+ /* 80 */ 0x0000, 0xb0e7, 0x0000, 0x0000, 0xb0e8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb0e9, 0x0000, 0x0000, 0x0000, 0xb0ea, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0eb, 0x0000, 0xb0ec,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb0ed, 0xb0ee, 0x0000, 0x0000, 0xb0ef, 0x0000, 0x0000, 0xb0f0,
+ /* a8 */ 0xb0f1, 0x0000, 0xb0f2, 0x0000, 0xb0f3, 0x0000, 0x0000, 0xb0f4,
+ /* b0 */ 0xb0f5, 0xb0f6, 0x0000, 0xb0f7, 0x0000, 0xb0f8, 0xb0f9, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb0fa, 0xb0fb, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab4xx - offset 0x05a13 ***/
+
+ /* 80 */ 0xb0fc, 0x0000, 0x0000, 0x0000, 0xb0fd, 0x0000, 0xb0fe, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1a1, 0xb1a2, 0x0000, 0xb1a3,
+ /* 90 */ 0x0000, 0xb1a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb1a5, 0x0000, 0x0000, 0x0000, 0xb1a6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb1a8, 0x0000, 0x0000, 0xb1a9, 0xb1aa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1ab, 0xb1ac, 0x0000, 0x0000,
+ /* b8 */ 0xb1ad, 0x0000, 0x0000, 0x0000, 0xb1ae,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eab5xx - offset 0x05a50 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1af, 0xb1b0, 0x0000, 0xb1b1,
+ /* 88 */ 0x0000, 0xb1b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb1b3, 0x0000, 0x0000, 0x0000, 0xb1b4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb1b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xb1b6, 0x0000, 0xb1b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1b8, 0xb1b9, 0x0000, 0x0000,
+ /* b0 */ 0xb1ba, 0x0000, 0x0000, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb1bf, 0xb1c0, 0xb1c1, 0x0000, 0xb1c2,
+
+ /*** Three byte table, leaf: eab6xx - offset 0x05a90 ***/
+
+ /* 80 */ 0x0000, 0xb1c3, 0xb1c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb1c5, 0xb1c6, 0x0000, 0x0000, 0xb1c7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb1c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1c9, 0xb1ca, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1cb, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1cc,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab7xx - offset 0x05ad0 ***/
+
+ /* 80 */ 0xb1cd, 0xb1ce, 0x0000, 0x0000, 0xb1cf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb1d1, 0xb1d2, 0x0000, 0xb1d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1d4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb1d5, 0x0000, 0x0000, 0x0000, 0xb1d6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb1d7, 0xb1d8, 0x0000, 0x0000, 0xb1d9, 0x0000, 0x0000, 0xb1da,
+
+ /*** Three byte table, leaf: eab8xx - offset 0x05b10 ***/
+
+ /* 80 */ 0xb1db, 0xb1dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb1dd, 0xb1de, 0x0000, 0xb1df, 0x0000, 0xb1e0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1e1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb1e2, 0xb1e3, 0x0000, 0x0000, 0xb1e4, 0x0000, 0x0000, 0xb1e5,
+ /* b8 */ 0xb1e6, 0x0000, 0xb1e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab9xx - offset 0x05b50 ***/
+
+ /* 80 */ 0xb1e8, 0xb1e9, 0x0000, 0xb1ea, 0x0000, 0xb1eb, 0xb1ec, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xb1ed, 0x0000, 0xb1ee, 0xb1ef, 0xb1f0, 0x0000,
+ /* 90 */ 0xb1f1, 0x0000, 0x0000, 0x0000, 0xb1f2, 0x0000, 0xb1f3, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb1f4, 0xb1f5, 0x0000, 0xb1f6,
+ /* a0 */ 0xb1f7, 0xb1f8, 0x0000, 0x0000, 0x0000, 0xb1f9, 0x0000, 0x0000,
+ /* a8 */ 0xb1fa, 0xb1fb, 0x0000, 0x0000, 0xb1fc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb1fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb1fe, 0xb2a1, 0x0000, 0xb2a2, 0xb2a3, 0xb2a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eabaxx - offset 0x05b8e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2a5, 0xb2a6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2a7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2a8, 0xb2a9, 0xb2aa, 0x0000,
+
+ /*** Three byte table, leaf: eabbxx - offset 0x05bce ***/
+
+ /* 80 */ 0xb2ab, 0x0000, 0x0000, 0x0000, 0xb2ac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2ad, 0xb2ae, 0x0000, 0xb2af,
+ /* 90 */ 0xb2b0, 0xb2b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb2b2, 0xb2b3, 0x0000, 0x0000, 0xb2b4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb2b5, 0x0000, 0x0000, 0xb2b6, 0x0000, 0xb2b7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2b8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb2b9, 0x0000, 0x0000, 0x0000, 0xb2ba,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eabcxx - offset 0x05c0b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2bb,
+ /* 88 */ 0xb2bc, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2bd, 0x0000, 0x0000,
+ /* 90 */ 0xb2be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2bf, 0xb2c0, 0x0000, 0x0000,
+ /* b0 */ 0xb2c1, 0x0000, 0xb2c2, 0x0000, 0xb2c3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2c4, 0xb2c5, 0x0000, 0xb2c6,
+
+ /*** Three byte table, leaf: eabdxx - offset 0x05c4b ***/
+
+ /* 80 */ 0x0000, 0xb2c7, 0xb2c8, 0xb2c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb2ca, 0xb2cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb2cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2cd, 0xb2ce, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2cf, 0xb2d0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eabexx - offset 0x05c8b ***/
+
+ /* 80 */ 0xb2d2, 0x0000, 0x0000, 0x0000, 0xb2d3, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb2d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb2d5, 0xb2d6, 0x0000, 0x0000, 0x0000, 0xb2d7, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2d8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb2d9, 0xb2da, 0x0000, 0x0000, 0xb2db, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eabfxx - offset 0x05ccb ***/
+
+ /* 80 */ 0xb2dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2dd,
+ /* 88 */ 0xb2de, 0xb2df, 0x0000, 0xb2e0, 0x0000, 0xb2e1, 0xb2e2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb2e5, 0xb2e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb2e7, 0xb2e8, 0x0000, 0x0000, 0xb2e9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb2ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb80xx - offset 0x05d0b ***/
+
+ /* 80 */ 0xb2eb, 0xb2ec, 0x0000, 0x0000, 0xb2ed, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2ee, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb2ef, 0x0000, 0x0000, 0x0000, 0xb2f0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2f1, 0xb2f2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb2f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb81xx - offset 0x05d47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb2f4, 0xb2f5, 0x0000, 0x0000,
+ /* 88 */ 0xb2f6, 0x0000, 0xb2f7, 0x0000, 0xb2f8, 0x0000, 0xb2f9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xb2fa, 0xb2fb, 0xb2fc, 0x0000, 0xb2fd,
+ /* 98 */ 0x0000, 0xb2fe, 0x0000, 0x0000, 0x0000, 0xb3a1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3a2, 0xb3a3, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb82xx - offset 0x05d87 ***/
+
+ /* 80 */ 0xb3a4, 0x0000, 0x0000, 0x0000, 0xb3a5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3a6, 0xb3a7, 0x0000, 0xb3a8,
+ /* 90 */ 0x0000, 0xb3a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb3aa, 0xb3ab, 0xb3ac, 0x0000, 0xb3ad, 0x0000, 0x0000, 0xb3ae,
+ /* a0 */ 0xb3af, 0xb3b0, 0xb3b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb3b2, 0xb3b3, 0x0000, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8,
+ /* b0 */ 0x0000, 0xb3b9, 0x0000, 0xb3ba, 0xb3bb, 0xb3bc, 0x0000, 0x0000,
+ /* b8 */ 0xb3bd, 0x0000, 0x0000, 0x0000, 0xb3be,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb83xx - offset 0x05dc4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3bf, 0xb3c0, 0x0000, 0xb3c1,
+ /* 88 */ 0xb3c2, 0xb3c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb3c4, 0xb3c5, 0x0000, 0x0000, 0xb3c6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb3c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb3c8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb3c9, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb84xx - offset 0x05dfc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb3ca, 0xb3cb, 0x0000, 0xb3cc, 0xb3cd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb3ce, 0x0000, 0xb3cf, 0xb3d0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb3d1, 0xb3d2, 0x0000, 0xb3d3, 0xb3d4, 0xb3d5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xb3d6, 0xb3d7, 0xb3d8, 0x0000, 0x0000,
+ /* a8 */ 0xb3d9, 0x0000, 0x0000, 0x0000, 0xb3da, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3db, 0xb3dc, 0x0000, 0xb3dd,
+ /* b8 */ 0xb3de, 0xb3df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb85xx - offset 0x05e3c ***/
+
+ /* 80 */ 0xb3e0, 0xb3e1, 0x0000, 0x0000, 0xb3e2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb3e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb3e4, 0xb3e5, 0x0000, 0x0000, 0xb3e6, 0xb3e7, 0x0000, 0x0000,
+ /* 98 */ 0xb3e8, 0x0000, 0x0000, 0x0000, 0xb3e9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb3ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb3eb, 0xb3ec, 0x0000, 0x0000, 0xb3ed, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb86xx - offset 0x05e7c ***/
+
+ /* 80 */ 0xb3ee, 0x0000, 0xb3ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb3f0, 0xb3f1, 0x0000, 0xb3f2, 0x0000, 0xb3f3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xb3f4, 0xb3f5, 0xb3f6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb3f7, 0x0000, 0x0000, 0x0000, 0xb3f8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb3f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb87xx - offset 0x05eb0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3fa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb3fb, 0x0000, 0x0000, 0x0000, 0xb3fc, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb3fd, 0xb3fe, 0x0000, 0xb4a1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb4a2, 0xb4a3, 0x0000, 0x0000, 0xb4a4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb4a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xb4a6, 0x0000, 0xb4a7, 0x0000, 0xb4a8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb88xx - offset 0x05eee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4a9, 0xb4aa, 0x0000, 0x0000,
+ /* 88 */ 0xb4ab, 0x0000, 0x0000, 0xb4ac, 0xb4ad, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4ae, 0xb4af, 0x0000, 0xb4b0,
+ /* 98 */ 0x0000, 0xb4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb4b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4b3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4b4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb89xx - offset 0x05f2b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb4b5, 0x0000, 0x0000, 0x0000, 0xb4b6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb4b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb4b8, 0xb4b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4ba, 0xb4bb, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4bc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb8axx - offset 0x05f68 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4bd, 0xb4be, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xb4bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb4c0, 0xb4c1, 0x0000, 0x0000, 0xb4c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb4c3, 0xb4c4, 0xb4c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb4c6, 0xb4c7, 0x0000, 0xb4c8, 0x0000, 0xb4c9, 0xb4ca, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xb4cb, 0x0000, 0xb4cc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb4cd, 0x0000, 0x0000, 0x0000, 0xb4ce, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb8bxx - offset 0x05fa0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb4cf, 0xb4d0, 0x0000, 0x0000, 0xb4d1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb4d2, 0x0000, 0xb4d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb4d4, 0xb4d5, 0x0000, 0xb4d6, 0x0000, 0xb4d7, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xb4d8, 0x0000, 0xb4d9, 0xb4da, 0xb4db, 0x0000,
+ /* a8 */ 0xb4dc, 0x0000, 0x0000, 0xb4dd, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xb4e2, 0xb4e3, 0xb4e4, 0x0000, 0xb4e5,
+ /* b8 */ 0xb4e6, 0xb4e7, 0xb4e8, 0xb4e9, 0x0000, 0x0000, 0x0000, 0xb4ea,
+
+ /*** Three byte table, leaf: eb8cxx - offset 0x05fe0 ***/
+
+ /* 80 */ 0xb4eb, 0xb4ec, 0x0000, 0x0000, 0xb4ed, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb4ef, 0xb4f0, 0x0000, 0xb4f1, 0xb4f2, 0xb4f3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4f4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb8dxx - offset 0x0600c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4f5, 0xb4f6, 0xb4f7, 0x0000,
+ /* 98 */ 0xb4f8, 0x0000, 0x0000, 0xb4f9, 0xb4fa, 0x0000, 0xb4fb, 0xb4fc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb4fd, 0xb4fe, 0x0000, 0xb5a1,
+ /* a8 */ 0x0000, 0xb5a2, 0x0000, 0xb5a3, 0x0000, 0x0000, 0xb5a4, 0x0000,
+ /* b0 */ 0xb5a5, 0xb5a6, 0x0000, 0x0000, 0xb5a7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb5a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb8exx - offset 0x0604c ***/
+
+ /* 80 */ 0xb5a9, 0xb5aa, 0x0000, 0xb5ab, 0xb5ac, 0xb5ad, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ae, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb5af, 0x0000, 0x0000, 0x0000, 0xb5b0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb5b1, 0xb5b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb5b3, 0x0000, 0x0000, 0x0000, 0xb5b4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb8fxx - offset 0x06088 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5b5, 0xb5b6, 0x0000, 0x0000,
+ /* 88 */ 0xb5b7, 0x0000, 0x0000, 0xb5b8, 0xb5b9, 0x0000, 0xb5ba, 0x0000,
+ /* 90 */ 0xb5bb, 0x0000, 0x0000, 0x0000, 0xb5bc, 0xb5bd, 0x0000, 0xb5be,
+ /* 98 */ 0x0000, 0xb5bf, 0x0000, 0xb5c0, 0x0000, 0xb5c1, 0x0000, 0x0000,
+ /* a0 */ 0xb5c2, 0x0000, 0x0000, 0x0000, 0xb5c3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5c5,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb90xx - offset 0x060c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb5c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb5c7, 0x0000, 0x0000, 0x0000, 0xb5c8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb5c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb5ca, 0xb5cb, 0x0000, 0xb5cc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5cd,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb91xx - offset 0x060fa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb5ce, 0xb5cf, 0x0000, 0x0000, 0xb5d0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb5d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb5d2, 0xb5d3, 0x0000, 0xb5d4, 0x0000, 0xb5d5, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5d6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb92xx - offset 0x0613a ***/
+
+ /* 80 */ 0xb5d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb5d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5d9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5da, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb5db, 0x0000, 0x0000, 0x0000, 0xb5dc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5dd, 0x0000, 0xb5de,
+ /* b8 */ 0x0000, 0xb5df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb93xx - offset 0x0617a ***/
+
+ /* 80 */ 0xb5e0, 0x0000, 0x0000, 0x0000, 0xb5e1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb5e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb5e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5e4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5e5, 0xb5e6, 0x0000, 0x0000,
+ /* a0 */ 0xb5e7, 0x0000, 0x0000, 0xb5e8, 0xb5e9, 0x0000, 0xb5ea, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5eb, 0xb5ec, 0x0000, 0xb5ed,
+ /* b0 */ 0x0000, 0xb5ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb5ef,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb94xx - offset 0x061b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5f0, 0xb5f1, 0x0000, 0x0000,
+ /* 98 */ 0xb5f2, 0x0000, 0x0000, 0xb5f3, 0xb5f4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5f5, 0xb5f6, 0x0000, 0xb5f7,
+ /* a8 */ 0xb5f8, 0xb5f9, 0xb5fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb5fb, 0xb5fc, 0x0000, 0x0000, 0xb5fd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb5fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb95xx - offset 0x061f3 ***/
+
+ /* 80 */ 0xb6a1, 0xb6a2, 0x0000, 0xb6a3, 0xb6a4, 0xb6a5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xb6a6, 0xb6a7, 0xb6a8, 0x0000, 0x0000,
+ /* 90 */ 0xb6a9, 0x0000, 0x0000, 0x0000, 0xb6aa, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6ab, 0xb6ac, 0x0000, 0xb6ad,
+ /* a0 */ 0xb6ae, 0xb6af,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb96xx - offset 0x06215 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb6b0, 0xb6b1, 0x0000, 0x0000, 0xb6b2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb6b3, 0x0000, 0xb6b4, 0xb6b5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb6b6, 0xb6b7, 0x0000, 0xb6b8, 0xb6b9, 0xb6ba, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xb6bb, 0xb6bc, 0xb6bd, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb97xx - offset 0x06255 ***/
+
+ /* 80 */ 0xb6be, 0x0000, 0x0000, 0x0000, 0xb6bf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6c0, 0xb6c1, 0x0000, 0xb6c2,
+ /* 90 */ 0xb6c3, 0xb6c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb6c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6c6, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb98xx - offset 0x06285 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb6c7, 0xb6c8, 0x0000, 0x0000, 0xb6c9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb6ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6cb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6cc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6cd, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb99xx - offset 0x062bd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb6ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6cf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb6d0,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb9axx - offset 0x062e6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6d1, 0xb6d2, 0x0000, 0x0000,
+ /* a0 */ 0xb6d3, 0x0000, 0x0000, 0x0000, 0xb6d4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xb6d5, 0xb6d6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xb6d7,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb9bxx - offset 0x06318 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6d8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb6d9, 0x0000, 0x0000, 0x0000, 0xb6da, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb6db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb9cxx - offset 0x06358 ***/
+
+ /* 80 */ 0xb6dc, 0xb6dd, 0x0000, 0x0000, 0x0000, 0xb6de, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb6df, 0xb6e0, 0x0000, 0x0000, 0xb6e1, 0x0000, 0x0000, 0xb6e2,
+ /* b0 */ 0xb6e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb6e4, 0xb6e5, 0x0000, 0xb6e6,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb9dxx - offset 0x06394 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6e7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb6e8, 0x0000, 0x0000, 0x0000, 0xb6e9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6ea, 0xb6eb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb6ec, 0x0000, 0x0000, 0x0000, 0xb6ed, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb6ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb6ef, 0xb6f0, 0x0000, 0xb6f1, 0x0000, 0xb6f2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6f3, 0xb6f4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eb9exx - offset 0x063d4 ***/
+
+ /* 80 */ 0xb6f5, 0x0000, 0x0000, 0x0000, 0xb6f6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb6f7, 0xb6f8, 0x0000, 0xb6f9,
+ /* 90 */ 0xb6fa, 0xb6fb, 0xb6fc, 0x0000, 0x0000, 0x0000, 0xb6fd, 0xb6fe,
+ /* 98 */ 0xb7a1, 0xb7a2, 0x0000, 0x0000, 0xb7a3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb7a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb7a5, 0xb7a6, 0x0000, 0xb7a7, 0xb7a8, 0xb7a9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7aa, 0xb7ab, 0x0000, 0x0000,
+ /* b8 */ 0xb7ac,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eb9fxx - offset 0x0640d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7ad,
+ /* 88 */ 0x0000, 0xb7ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7af, 0xb7b0, 0x0000, 0x0000,
+ /* b0 */ 0xb7b1, 0x0000, 0x0000, 0x0000, 0xb7b2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7b3, 0xb7b4, 0x0000, 0xb7b5,
+
+ /*** Three byte table, leaf: eba0xx - offset 0x0644d ***/
+
+ /* 80 */ 0xb7b6, 0xb7b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7b8,
+ /* 88 */ 0xb7b9, 0xb7ba, 0x0000, 0x0000, 0xb7bb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb7bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb7bd, 0xb7be, 0x0000, 0xb7bf, 0x0000, 0xb7c0, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7c1, 0xb7c2, 0x0000, 0x0000,
+ /* a8 */ 0xb7c3, 0x0000, 0x0000, 0x0000, 0xb7c4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7c5, 0xb7c6, 0x0000, 0xb7c7,
+ /* b8 */ 0xb7c8, 0xb7c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eba1xx - offset 0x0648d ***/
+
+ /* 80 */ 0xb7ca, 0x0000, 0x0000, 0x0000, 0xb7cb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xb7cc, 0x0000, 0xb7cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7ce, 0xb7cf, 0x0000, 0x0000,
+ /* a0 */ 0xb7d0, 0x0000, 0x0000, 0x0000, 0xb7d1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7d2, 0xb7d3, 0x0000, 0xb7d4,
+ /* b0 */ 0x0000, 0xb7d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb7d6, 0x0000, 0x0000, 0x0000, 0xb7d7,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eba2xx - offset 0x064ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7d8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb7d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb7da, 0x0000, 0x0000, 0x0000, 0xb7db, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb7dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eba3xx - offset 0x0650a ***/
+
+ /* 80 */ 0xb7dd, 0xb7de, 0x0000, 0xb7df, 0x0000, 0xb7e0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb7e2, 0x0000, 0x0000, 0x0000, 0xb7e3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e4, 0x0000, 0xb7e5,
+ /* a0 */ 0x0000, 0xb7e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb7e7, 0xb7e8, 0x0000, 0x0000, 0xb7e9, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb7ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb7eb, 0xb7ec, 0x0000, 0xb7ed, 0x0000, 0xb7ee,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eba4xx - offset 0x06548 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7ef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb7f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb7f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7f2, 0xb7f3, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eba5xx - offset 0x06588 ***/
+
+ /* 80 */ 0xb7f4, 0x0000, 0x0000, 0x0000, 0xb7f5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb7f6, 0x0000, 0x0000, 0xb7f7,
+ /* 90 */ 0x0000, 0xb7f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb7f9, 0xb7fa, 0x0000, 0x0000, 0xb7fb, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb7fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb7fd, 0xb7fe, 0x0000, 0xb8a1, 0x0000, 0xb8a2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8a3, 0xb8a4, 0x0000, 0x0000,
+ /* b8 */ 0xb8a5, 0x0000, 0x0000, 0x0000, 0xb8a6,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eba6xx - offset 0x065c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8a7, 0xb8a8, 0x0000, 0xb8a9,
+ /* 88 */ 0x0000, 0xb8aa, 0xb8ab, 0x0000, 0x0000, 0xb8ac, 0xb8ad, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8ae, 0xb8af, 0x0000, 0x0000,
+ /* b0 */ 0xb8b0, 0x0000, 0x0000, 0x0000, 0xb8b1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8b2, 0xb8b3, 0x0000, 0xb8b4,
+
+ /*** Three byte table, leaf: eba7xx - offset 0x06605 ***/
+
+ /* 80 */ 0x0000, 0xb8b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb8b6, 0xb8b7, 0x0000, 0x0000, 0xb8b8, 0x0000, 0xb8b9, 0xb8ba,
+ /* 90 */ 0xb8bb, 0xb8bc, 0xb8bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb8be, 0xb8bf, 0x0000, 0xb8c0, 0x0000, 0xb8c1, 0xb8c2, 0x0000,
+ /* a0 */ 0x0000, 0xb8c3, 0x0000, 0xb8c4, 0xb8c5, 0xb8c6, 0x0000, 0x0000,
+ /* a8 */ 0xb8c7, 0x0000, 0x0000, 0x0000, 0xb8c8, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8c9, 0xb8ca, 0x0000, 0xb8cb,
+ /* b8 */ 0xb8cc, 0xb8cd, 0xb8ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eba8xx - offset 0x06645 ***/
+
+ /* 80 */ 0xb8cf, 0xb8d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb8d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8d2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb8d3, 0xb8d4, 0x0000, 0x0000, 0xb8d5, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eba9xx - offset 0x06685 ***/
+
+ /* 80 */ 0xb8d6, 0x0000, 0xb8d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb8d8, 0xb8d9, 0x0000, 0xb8da, 0x0000, 0xb8db, 0xb8dc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xb8dd, 0xb8de, 0xb8df, 0x0000, 0x0000,
+ /* 98 */ 0xb8e0, 0x0000, 0x0000, 0x0000, 0xb8e1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8e2, 0xb8e3, 0x0000, 0xb8e4,
+ /* a8 */ 0xb8e5, 0xb8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb8e7, 0xb8e8, 0x0000, 0x0000, 0xb8e9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb8ea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebaaxx - offset 0x066c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xb8eb, 0xb8ec, 0xb8ed, 0x0000, 0xb8ee,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8ef, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb8f0, 0xb8f1, 0x0000, 0xb8f2, 0xb8f3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xb8f4, 0x0000, 0xb8f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb8f6, 0xb8f7, 0x0000, 0xb8f8, 0x0000, 0xb8f9,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebabxx - offset 0x06700 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8fa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb8fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb8fc, 0xb8fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb8fe, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebacxx - offset 0x06740 ***/
+
+ /* 80 */ 0xb9a1, 0x0000, 0x0000, 0x0000, 0xb9a2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9a3, 0x0000, 0xb9a4,
+ /* 90 */ 0x0000, 0xb9a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb9a6, 0x0000, 0x0000, 0x0000, 0xb9a7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xb9a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xb9a9, 0x0000, 0xb9aa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9ab, 0xb9ac, 0xb9ad, 0x0000,
+ /* b8 */ 0xb9ae, 0x0000, 0x0000, 0xb9af, 0xb9b0, 0xb9b1, 0xb9b2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebadxx - offset 0x0677f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9b3, 0xb9b4, 0x0000, 0xb9b5,
+ /* 88 */ 0x0000, 0xb9b6, 0x0000, 0x0000, 0x0000, 0xb9b7, 0x0000, 0xb9b8,
+ /* 90 */ 0xb9b9, 0x0000, 0x0000, 0x0000, 0xb9ba, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xb9bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xb9bc, 0x0000, 0xb9bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9be, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebaexx - offset 0x067b7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb9bf, 0x0000, 0x0000, 0x0000, 0xb9c0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb9c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9c2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xb9c3, 0x0000, 0x0000, 0x0000, 0xb9c4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9c5, 0x0000, 0x0000, 0xb9c6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebafxx - offset 0x067f7 ***/
+
+ /* 80 */ 0xb9c7, 0x0000, 0x0000, 0x0000, 0xb9c8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb9c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xb9ca, 0x0000, 0x0000, 0xb9cb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb9cc, 0xb9cd, 0x0000, 0x0000, 0xb9ce, 0x0000, 0x0000, 0xb9cf,
+
+ /*** Three byte table, leaf: ebb0xx - offset 0x06837 ***/
+
+ /* 80 */ 0xb9d0, 0x0000, 0xb9d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xb9d2, 0xb9d3, 0x0000, 0xb9d4, 0xb9d5, 0xb9d6, 0x0000, 0xb9d7,
+ /* 90 */ 0x0000, 0xb9d8, 0x0000, 0x0000, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc,
+ /* 98 */ 0xb9dd, 0x0000, 0x0000, 0xb9de, 0xb9df, 0xb9e0, 0xb9e1, 0xb9e2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9e3, 0xb9e4, 0x0000, 0xb9e5,
+ /* a8 */ 0x0000, 0xb9e6, 0x0000, 0x0000, 0x0000, 0xb9e7, 0x0000, 0x0000,
+ /* b0 */ 0xb9e8, 0xb9e9, 0x0000, 0x0000, 0xb9ea, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xb9eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebb1xx - offset 0x06877 ***/
+
+ /* 80 */ 0xb9ec, 0xb9ed, 0x0000, 0xb9ee, 0xb9ef, 0xb9f0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xb9f1, 0x0000, 0x0000, 0xb9f2, 0xb9f3, 0x0000, 0x0000,
+ /* 90 */ 0xb9f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9f5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebb2xx - offset 0x068b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9f6, 0xb9f7, 0x0000, 0x0000,
+ /* 88 */ 0xb9f8, 0x0000, 0x0000, 0xb9f9, 0xb9fa, 0x0000, 0xb9fb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xb9fc, 0xb9fd, 0x0000, 0xb9fe,
+ /* 98 */ 0x0000, 0xbaa1, 0xbaa2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbaa3, 0xbaa4, 0x0000, 0x0000, 0xbaa5, 0x0000, 0x0000, 0xbaa6,
+ /* a8 */ 0xbaa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbaa8, 0xbaa9, 0x0000, 0xbaaa, 0xbaab, 0xbaac, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaad, 0xbaae, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebb3xx - offset 0x068f3 ***/
+
+ /* 80 */ 0xbaaf, 0x0000, 0x0000, 0x0000, 0xbab0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbab1, 0x0000, 0xbab2,
+ /* 90 */ 0xbab3, 0xbab4, 0x0000, 0x0000, 0x0000, 0xbab5, 0x0000, 0x0000,
+ /* 98 */ 0xbab6, 0x0000, 0x0000, 0x0000, 0xbab7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbab8, 0xbab9, 0xbaba, 0x0000,
+ /* b8 */ 0xbabb, 0x0000, 0x0000, 0x0000, 0xbabc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebb4xx - offset 0x06930 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbabd, 0xbabe, 0x0000, 0xbabf,
+ /* 88 */ 0x0000, 0xbac0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbac1, 0x0000, 0x0000, 0x0000, 0xbac2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbac3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbac4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebb5xx - offset 0x06970 ***/
+
+ /* 80 */ 0xbac5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbac6, 0xbac7, 0x0000, 0x0000, 0xbac8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbac9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbaca, 0xbacb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbacc, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbacd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebb6xx - offset 0x069b0 ***/
+
+ /* 80 */ 0xbace, 0xbacf, 0x0000, 0x0000, 0xbad0, 0x0000, 0x0000, 0xbad1,
+ /* 88 */ 0xbad2, 0xbad3, 0xbad4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbad5, 0xbad6, 0x0000, 0xbad7, 0x0000, 0xbad8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xbad9, 0xbada, 0x0000, 0xbadb, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbadc, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbadd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbade,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebb7xx - offset 0x069e9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbadf, 0xbae0, 0x0000, 0x0000,
+ /* 98 */ 0xbae1, 0x0000, 0x0000, 0x0000, 0xbae2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xbae3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbae4, 0x0000, 0x0000, 0x0000, 0xbae5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbae6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebb8xx - offset 0x06a29 ***/
+
+ /* 80 */ 0xbae7, 0x0000, 0x0000, 0xbae8, 0x0000, 0xbae9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaea, 0xbaeb, 0x0000, 0x0000,
+ /* 90 */ 0xbaec, 0x0000, 0x0000, 0x0000, 0xbaed, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaee, 0xbaef, 0x0000, 0xbaf0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebb9xx - offset 0x06a65 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaf1, 0xbaf2, 0x0000, 0x0000,
+ /* 88 */ 0xbaf3, 0x0000, 0x0000, 0x0000, 0xbaf4, 0x0000, 0xbaf5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbaf6, 0xbaf7, 0x0000, 0xbaf8,
+ /* 98 */ 0x0000, 0xbaf9, 0xbafa, 0xbafb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbafc, 0xbafd, 0x0000, 0x0000, 0xbafe, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbba1, 0x0000, 0xbba2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbba3, 0xbba4, 0x0000, 0xbba5, 0xbba6, 0xbba7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xbba8, 0xbba9, 0xbbaa, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebbaxx - offset 0x06aa5 ***/
+
+ /* 80 */ 0xbbab, 0x0000, 0x0000, 0x0000, 0xbbac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbad, 0xbbae, 0x0000, 0xbbaf,
+ /* 90 */ 0xbbb0, 0xbbb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbbb2, 0xbbb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbbb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebbbxx - offset 0x06ad5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbbb5, 0xbbb6, 0x0000, 0x0000, 0xbbb7, 0x0000, 0x0000, 0xbbb8,
+ /* 98 */ 0xbbb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbbba, 0x0000, 0x0000, 0xbbbb, 0xbbbc, 0xbbbd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbbe, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebbcxx - offset 0x06b14 ***/
+
+ /* 80 */ 0x0000, 0xbbbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbbc0, 0xbbc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbbc2, 0xbbc3, 0x0000, 0xbbc4, 0xbbc5, 0xbbc6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ebbdxx - offset 0x06b54 ***/
+
+ /* 80 */ 0xbbc7, 0xbbc8, 0x0000, 0x0000, 0xbbc9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbbca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbbcb, 0xbbcc, 0x0000, 0x0000, 0x0000, 0xbbcd, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebbexx - offset 0x06b80 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbce, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbbcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ebbfxx - offset 0x06bbb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbbd0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbd1, 0xbbd2, 0x0000, 0x0000,
+ /* 90 */ 0xbbd3, 0x0000, 0x0000, 0x0000, 0xbbd4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbd5, 0x0000, 0x0000, 0xbbd6,
+ /* a0 */ 0x0000, 0xbbd7,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec80xx - offset 0x06bdd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbd8,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec81xx - offset 0x06c1a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xbbd9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbbda, 0x0000, 0x0000, 0x0000, 0xbbdb, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbbdc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbbdd, 0xbbde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec82xx - offset 0x06c4a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbbdf, 0xbbe0, 0x0000, 0x0000, 0xbbe1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbbe2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbbe3, 0xbbe4, 0x0000, 0xbbe5, 0x0000, 0xbbe6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbe7, 0xbbe8, 0x0000, 0xbbe9,
+ /* b0 */ 0xbbea, 0x0000, 0x0000, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbef, 0xbbf0, 0x0000, 0xbbf1,
+
+ /*** Three byte table, leaf: ec83xx - offset 0x06c8a ***/
+
+ /* 80 */ 0xbbf2, 0xbbf3, 0x0000, 0x0000, 0x0000, 0xbbf4, 0x0000, 0x0000,
+ /* 88 */ 0xbbf5, 0xbbf6, 0x0000, 0x0000, 0xbbf7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbbf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbbf9, 0xbbfa, 0x0000, 0xbbfb, 0xbbfc, 0xbbfd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbbfe, 0xbca1, 0x0000, 0x0000,
+ /* a8 */ 0xbca2, 0x0000, 0x0000, 0x0000, 0xbca3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbca4, 0xbca5, 0x0000, 0xbca6,
+ /* b8 */ 0x0000, 0xbca7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec84xx - offset 0x06cca ***/
+
+ /* 80 */ 0xbca8, 0x0000, 0x0000, 0x0000, 0xbca9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbcaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbcab, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcac, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcad, 0xbcae, 0xbcaf, 0xbcb0,
+ /* a0 */ 0xbcb1, 0x0000, 0x0000, 0xbcb2, 0xbcb3, 0x0000, 0xbcb4, 0xbcb5,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcb6, 0xbcb7, 0x0000, 0xbcb8,
+ /* b0 */ 0xbcb9, 0xbcba, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcbb, 0x0000,
+ /* b8 */ 0xbcbc, 0xbcbd, 0x0000, 0x0000, 0xbcbe, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec85xx - offset 0x06d0a ***/
+
+ /* 80 */ 0xbcbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbcc0, 0xbcc1, 0x0000, 0xbcc2, 0xbcc3, 0xbcc4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcc5, 0xbcc6, 0x0000, 0x0000,
+ /* 98 */ 0xbcc7, 0x0000, 0x0000, 0x0000, 0xbcc8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcc9, 0xbcca, 0x0000, 0xbccb,
+ /* a8 */ 0xbccc, 0xbccd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbcce, 0x0000, 0x0000, 0x0000, 0xbccf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbcd0, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec86xx - offset 0x06d45 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcd1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcd2, 0xbcd3, 0xbcd4, 0x0000,
+ /* 90 */ 0xbcd5, 0x0000, 0x0000, 0x0000, 0xbcd6, 0x0000, 0xbcd7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcd8, 0xbcd9, 0x0000, 0xbcda,
+ /* a0 */ 0x0000, 0xbcdb, 0x0000, 0x0000, 0x0000, 0xbcdc, 0x0000, 0x0000,
+ /* a8 */ 0xbcdd, 0xbcde, 0x0000, 0x0000, 0xbcdf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbce0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbce1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec87xx - offset 0x06d83 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbce2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbce3, 0x0000, 0x0000, 0x0000, 0xbce4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbce5, 0x0000, 0x0000, 0xbce6,
+ /* 98 */ 0xbce7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbce8, 0x0000, 0x0000, 0x0000, 0xbce9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbcea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbceb, 0xbcec, 0x0000, 0xbced, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcee, 0xbcef, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec88xx - offset 0x06dc3 ***/
+
+ /* 80 */ 0xbcf0, 0x0000, 0x0000, 0x0000, 0xbcf1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbcf2, 0xbcf3, 0x0000, 0xbcf4,
+ /* 90 */ 0x0000, 0xbcf5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbcf6, 0xbcf7, 0x0000, 0x0000, 0xbcf8, 0x0000, 0x0000, 0xbcf9,
+ /* a0 */ 0xbcfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbcfb, 0xbcfc, 0x0000, 0xbcfd, 0x0000, 0xbcfe, 0x0000, 0xbda1,
+ /* b0 */ 0x0000, 0xbda2, 0xbda3, 0x0000, 0xbda4, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec89xx - offset 0x06dfb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbda5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbda6, 0xbda7, 0x0000, 0x0000, 0xbda8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbda9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbdaa, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdab, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdac, 0xbdad, 0x0000, 0x0000,
+ /* b0 */ 0xbdae, 0x0000, 0x0000, 0x0000, 0xbdaf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdb0, 0xbdb1, 0x0000, 0xbdb2,
+
+ /*** Three byte table, leaf: ec8axx - offset 0x06e3b ***/
+
+ /* 80 */ 0x0000, 0xbdb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbdb4, 0xbdb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbdb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbdb7, 0x0000, 0x0000, 0xbdb8, 0x0000, 0xbdb9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdba, 0xbdbb, 0x0000, 0x0000,
+ /* a8 */ 0xbdbc, 0x0000, 0x0000, 0x0000, 0xbdbd, 0xbdbe, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdbf, 0xbdc0, 0x0000, 0xbdc1,
+ /* b8 */ 0x0000, 0xbdc2,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec8bxx - offset 0x06e75 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdc3, 0xbdc4, 0x0000, 0x0000,
+ /* a0 */ 0xbdc5, 0x0000, 0x0000, 0xbdc6, 0xbdc7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xbdc8, 0xbdc9, 0xbdca, 0x0000, 0xbdcb,
+ /* b0 */ 0x0000, 0xbdcc, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdcd, 0x0000,
+ /* b8 */ 0xbdce, 0xbdcf, 0x0000, 0xbdd0, 0xbdd1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec8cxx - offset 0x06eb5 ***/
+
+ /* 80 */ 0xbdd2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbdd3, 0xbdd4, 0x0000, 0x0000, 0xbdd5, 0xbdd6, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xbdd7, 0xbdd8, 0xbdd9, 0x0000, 0x0000,
+ /* 98 */ 0xbdda, 0x0000, 0x0000, 0x0000, 0xbddb, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbddc, 0xbddd, 0x0000, 0x0000,
+ /* a8 */ 0xbdde, 0xbddf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec8dxx - offset 0x06ef0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbde0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbde1, 0xbde2, 0x0000, 0x0000, 0xbde3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbde4, 0x0000, 0xbde5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbde6, 0xbde7, 0x0000, 0x0000, 0xbde8, 0xbde9,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec8exx - offset 0x06f2e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdea, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbdeb, 0x0000, 0x0000, 0x0000, 0xbdec, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec8fxx - offset 0x06f6e ***/
+
+ /* 80 */ 0xbded, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbdee, 0xbdef, 0x0000, 0x0000, 0xbdf0, 0x0000, 0x0000, 0xbdf1,
+ /* a0 */ 0xbdf2, 0x0000, 0xbdf3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbdf4, 0xbdf5, 0x0000, 0x0000, 0x0000, 0xbdf6, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdf7, 0xbdf8, 0x0000, 0x0000,
+ /* b8 */ 0xbdf9,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec90xx - offset 0x06fa7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbdfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbdfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdfc, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbdfd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbdfe, 0x0000, 0x0000, 0x0000, 0xbea1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbea2, 0xbea3,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec91xx - offset 0x06fe5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbea4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbea5, 0xbea6, 0x0000, 0x0000,
+ /* a8 */ 0xbea7, 0x0000, 0x0000, 0x0000, 0xbea8, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbea9, 0xbeaa, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xbeab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec92xx - offset 0x07025 ***/
+
+ /* 80 */ 0xbeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbead, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbeae, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbeaf, 0x0000, 0x0000, 0x0000, 0xbeb0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec93xx - offset 0x07062 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xbeb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbeb2, 0xbeb3, 0x0000, 0x0000, 0xbeb4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbeb5, 0x0000, 0xbeb6, 0x0000, 0x0000, 0x0000, 0x0000, 0xbeb7,
+
+ /*** Three byte table, leaf: ec94xx - offset 0x070a2 ***/
+
+ /* 80 */ 0xbeb8, 0xbeb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbeba, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbebb, 0x0000, 0x0000, 0x0000, 0xbebc, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbebd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbebe, 0xbebf, 0x0000, 0x0000, 0xbec0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbec2, 0xbec3, 0x0000, 0xbec4, 0x0000, 0xbec5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec95xx - offset 0x070e0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbec6, 0xbec7, 0x0000, 0x0000,
+ /* 88 */ 0xbec8, 0xbec9, 0xbeca, 0x0000, 0xbecb, 0xbecc, 0xbecd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xbece, 0xbecf, 0xbed0, 0x0000, 0xbed1,
+ /* 98 */ 0xbed2, 0xbed3, 0x0000, 0x0000, 0x0000, 0xbed4, 0xbed5, 0x0000,
+ /* a0 */ 0xbed6, 0xbed7, 0x0000, 0x0000, 0xbed8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbed9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbeda, 0xbedb, 0x0000, 0xbedc, 0xbedd, 0xbede, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbedf, 0xbee0, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec96xx - offset 0x07120 ***/
+
+ /* 80 */ 0xbee1, 0x0000, 0x0000, 0x0000, 0xbee2, 0x0000, 0x0000, 0xbee3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbee4, 0xbee5, 0x0000, 0xbee6,
+ /* 90 */ 0x0000, 0xbee7, 0x0000, 0x0000, 0x0000, 0xbee8, 0x0000, 0xbee9,
+ /* 98 */ 0xbeea, 0x0000, 0x0000, 0x0000, 0xbeeb, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbeec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xbeed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbeee, 0xbeef, 0x0000, 0x0000,
+ /* b8 */ 0xbef0, 0xbef1, 0x0000, 0xbef2, 0xbef3, 0xbef4, 0xbef5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec97xx - offset 0x0715f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbef6, 0xbef7, 0xbef8, 0xbef9,
+ /* 88 */ 0xbefa, 0xbefb, 0xbefc, 0x0000, 0xbefd, 0x0000, 0xbefe, 0x0000,
+ /* 90 */ 0xbfa1, 0xbfa2, 0x0000, 0x0000, 0xbfa3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbfa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xbfa5, 0xbfa6, 0x0000, 0xbfa7, 0x0000, 0xbfa8, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfa9, 0xbfaa, 0xbfab, 0x0000,
+ /* b0 */ 0xbfac, 0x0000, 0x0000, 0x0000, 0xbfad, 0x0000, 0xbfae, 0xbfaf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfb0, 0xbfb1, 0xbfb2, 0xbfb3,
+
+ /*** Three byte table, leaf: ec98xx - offset 0x0719f ***/
+
+ /* 80 */ 0xbfb4, 0xbfb5, 0x0000, 0x0000, 0x0000, 0xbfb6, 0xbfb7, 0xbfb8,
+ /* 88 */ 0xbfb9, 0x0000, 0x0000, 0x0000, 0xbfba, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbfbb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xbfbc, 0xbfbd, 0x0000, 0xbfbe, 0xbfbf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfc0, 0xbfc1, 0x0000, 0x0000,
+ /* a8 */ 0xbfc2, 0x0000, 0x0000, 0x0000, 0xbfc3, 0xbfc4, 0xbfc5, 0x0000,
+ /* b0 */ 0xbfc6, 0x0000, 0x0000, 0xbfc7, 0xbfc8, 0xbfc9, 0x0000, 0xbfca,
+ /* b8 */ 0x0000, 0xbfcb, 0x0000, 0xbfcc, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec99xx - offset 0x071df ***/
+
+ /* 80 */ 0xbfcd, 0xbfce, 0x0000, 0x0000, 0xbfcf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbfd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xbfd1, 0xbfd2, 0x0000, 0xbfd3, 0xbfd4, 0xbfd5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfd6, 0xbfd7, 0x0000, 0x0000,
+ /* a0 */ 0xbfd8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfd9, 0x0000, 0x0000, 0xbfda,
+ /* b0 */ 0x0000, 0xbfdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbfdc, 0xbfdd, 0x0000, 0x0000, 0xbfde, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec9axx - offset 0x0721f ***/
+
+ /* 80 */ 0xbfdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xbfe0, 0xbfe1, 0x0000, 0xbfe2, 0x0000, 0xbfe3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfe4, 0xbfe5, 0x0000, 0x0000,
+ /* 98 */ 0xbfe6, 0x0000, 0x0000, 0x0000, 0xbfe7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbfe8, 0xbfe9, 0x0000, 0xbfea,
+ /* a8 */ 0x0000, 0xbfeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xbfec, 0xbfed, 0x0000, 0x0000, 0xbfee, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xbfef, 0xbff0, 0xbff1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec9bxx - offset 0x0725f ***/
+
+ /* 80 */ 0xbff2, 0xbff3, 0x0000, 0xbff4, 0x0000, 0xbff5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbff6, 0xbff7, 0x0000, 0x0000,
+ /* 90 */ 0xbff8, 0x0000, 0x0000, 0x0000, 0xbff9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xbffa, 0xbffb, 0x0000, 0x0000,
+ /* a0 */ 0xbffc, 0xbffd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xbffe, 0xc0a1, 0x0000, 0x0000, 0xc0a2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc0a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc0a4, 0xc0a5, 0x0000, 0x0000, 0x0000, 0xc0a6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec9cxx - offset 0x0729d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0a7, 0xc0a8, 0x0000, 0x0000,
+ /* 88 */ 0xc0a9, 0x0000, 0x0000, 0x0000, 0xc0aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0ab, 0xc0ac, 0x0000, 0xc0ad,
+ /* 98 */ 0x0000, 0xc0ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc0af, 0xc0b0, 0x0000, 0x0000, 0xc0b1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc0b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc0b3, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0000, 0xc0b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0b8, 0xc0b9, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ec9dxx - offset 0x072dd ***/
+
+ /* 80 */ 0xc0ba, 0x0000, 0x0000, 0x0000, 0xc0bb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xc0bc, 0x0000, 0xc0bd, 0xc0be, 0x0000, 0xc0bf,
+ /* 90 */ 0x0000, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c5, 0xc0c6,
+ /* 98 */ 0xc0c7, 0x0000, 0x0000, 0x0000, 0xc0c8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc0c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc0ca, 0x0000, 0x0000, 0xc0cb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0cc, 0xc0cd, 0x0000, 0x0000,
+ /* b8 */ 0xc0ce, 0x0000, 0x0000, 0x0000, 0xc0cf, 0xc0d0, 0xc0d1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ec9exx - offset 0x0731c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc0d2, 0xc0d3, 0xc0d4, 0x0000, 0xc0d5,
+ /* 88 */ 0xc0d6, 0xc0d7, 0xc0d8, 0x0000, 0x0000, 0x0000, 0xc0d9, 0x0000,
+ /* 90 */ 0xc0da, 0xc0db, 0x0000, 0x0000, 0xc0dc, 0x0000, 0xc0dd, 0xc0de,
+ /* 98 */ 0xc0df, 0x0000, 0xc0e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc0e1, 0xc0e2, 0x0000, 0xc0e3, 0xc0e4, 0xc0e5, 0xc0e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0e7, 0xc0e8, 0x0000, 0x0000,
+ /* b0 */ 0xc0e9, 0x0000, 0x0000, 0x0000, 0xc0ea, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0eb, 0xc0ec, 0x0000, 0xc0ed,
+
+ /*** Three byte table, leaf: ec9fxx - offset 0x0735c ***/
+
+ /* 80 */ 0xc0ee, 0xc0ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc0f0, 0xc0f1, 0x0000, 0x0000, 0xc0f2, 0x0000, 0xc0f3, 0x0000,
+ /* 90 */ 0xc0f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc0f5, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0f6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc0f7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc0f8, 0x0000, 0x0000, 0x0000, 0xc0f9, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca0xx - offset 0x0739c ***/
+
+ /* 80 */ 0xc0fa, 0xc0fb, 0x0000, 0x0000, 0xc0fc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc0fd, 0x0000, 0xc0fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc1a1, 0xc1a2, 0x0000, 0xc1a3, 0x0000, 0xc1a4, 0xc1a5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1a6, 0xc1a7, 0x0000, 0x0000,
+ /* a0 */ 0xc1a8, 0x0000, 0x0000, 0x0000, 0xc1a9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1aa, 0xc1ab, 0x0000, 0xc1ac,
+ /* b0 */ 0x0000, 0xc1ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc1ae, 0x0000, 0x0000, 0x0000, 0xc1af, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca1xx - offset 0x073dc ***/
+
+ /* 80 */ 0xc1b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc1b1, 0xc1b2, 0x0000, 0x0000, 0xc1b3, 0xc1b4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1b5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc1b6, 0xc1b7, 0x0000, 0x0000, 0xc1b8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc1b9, 0x0000, 0xc1ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca2xx - offset 0x0741c ***/
+
+ /* 80 */ 0xc1bb, 0xc1bc, 0x0000, 0xc1bd, 0x0000, 0xc1be, 0xc1bf, 0xc1c0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xc1c1, 0xc1c2, 0xc1c3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c5, 0x0000, 0xc1c6,
+ /* a0 */ 0x0000, 0xc1c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc1c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c9, 0xc1ca,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eca3xx - offset 0x0745a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1cb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc1cc, 0x0000, 0x0000, 0x0000, 0xc1cd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1ce, 0xc1cf, 0x0000, 0xc1d0,
+ /* 98 */ 0x0000, 0xc1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc1d2, 0xc1d3, 0x0000, 0x0000, 0xc1d4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1d5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1d6, 0xc1d7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca4xx - offset 0x0749a ***/
+
+ /* 80 */ 0xc1d8, 0x0000, 0x0000, 0x0000, 0xc1d9, 0xc1da, 0xc1db, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1dc, 0xc1dd, 0x0000, 0xc1de,
+ /* 90 */ 0x0000, 0xc1df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc1e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1e1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1e2,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eca5xx - offset 0x074cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc1e3, 0xc1e4, 0x0000, 0x0000, 0xc1e5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc1e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc1e7, 0xc1e8, 0x0000, 0xc1e9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1ea, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc1eb, 0x0000, 0x0000, 0x0000, 0xc1ec, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc1ed,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eca6xx - offset 0x0750c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc1ee, 0xc1ef, 0x0000, 0x0000, 0xc1f0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc1f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc1f2, 0xc1f3, 0x0000, 0xc1f4, 0x0000, 0xc1f5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca7xx - offset 0x0754c ***/
+
+ /* 80 */ 0xc1f6, 0xc1f7, 0x0000, 0x0000, 0xc1f8, 0x0000, 0x0000, 0xc1f9,
+ /* 88 */ 0xc1fa, 0x0000, 0xc1fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc1fc, 0xc1fd, 0x0000, 0xc1fe, 0x0000, 0xc2a1, 0xc2a2, 0x0000,
+ /* 98 */ 0x0000, 0xc2a3, 0xc2a4, 0x0000, 0xc2a5, 0xc2a6, 0x0000, 0x0000,
+ /* a0 */ 0xc2a7, 0x0000, 0xc2a8, 0x0000, 0xc2a9, 0x0000, 0x0000, 0xc2aa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2ab, 0xc2ac, 0x0000, 0xc2ad,
+ /* b0 */ 0xc2ae, 0xc2af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc2b0, 0xc2b1, 0x0000, 0x0000, 0xc2b2, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eca8xx - offset 0x0758c ***/
+
+ /* 80 */ 0xc2b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc2b4, 0xc2b5, 0x0000, 0xc2b6, 0xc2b7, 0xc2b8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2b9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc2ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc2bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: eca9xx - offset 0x075c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2bc, 0xc2bd, 0x0000, 0x0000,
+ /* 90 */ 0xc2be, 0x0000, 0x0000, 0x0000, 0xc2bf, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c0, 0xc2c1, 0x0000, 0xc2c2,
+ /* a0 */ 0xc2c3, 0xc2c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc2c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecaaxx - offset 0x075fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc2c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c9, 0xc2ca, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ecabxx - offset 0x0763e ***/
+
+ /* 80 */ 0xc2cb, 0x0000, 0x0000, 0x0000, 0xc2cc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2cd, 0xc2ce, 0x0000, 0xc2cf,
+ /* 90 */ 0x0000, 0xc2d0, 0x0000, 0xc2d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc2d2, 0xc2d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc2d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2d5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2d6, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecacxx - offset 0x07676 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc2d8, 0x0000, 0x0000, 0x0000, 0xc2d9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc2da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc2db, 0xc2dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecadxx - offset 0x076b5 ***/
+
+ /* 80 */ 0x0000, 0xc2dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc2de, 0xc2df, 0x0000, 0x0000, 0xc2e0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc2e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc2e2, 0xc2e3, 0x0000, 0x0000, 0x0000, 0xc2e4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2e5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc2e6, 0xc2e7,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecaexx - offset 0x076ef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2e8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc2e9,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecafxx - offset 0x07728 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2ea, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2eb, 0x0000, 0x0000, 0xc2ec,
+ /* a8 */ 0x0000, 0xc2ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb0xx - offset 0x0775c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2ee, 0xc2ef, 0x0000, 0x0000,
+ /* 90 */ 0xc2f0, 0x0000, 0x0000, 0x0000, 0xc2f1, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc2f2, 0xc2f3, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xc2f4, 0xc2f5, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2f6,
+ /* a8 */ 0xc2f7, 0xc2f8, 0x0000, 0x0000, 0xc2f9, 0x0000, 0xc2fa, 0x0000,
+ /* b0 */ 0xc2fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc2fc, 0xc2fd, 0x0000, 0xc2fe, 0xc3a1, 0xc3a2, 0xc3a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb1xx - offset 0x0779b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3a4, 0xc3a5, 0x0000, 0x0000,
+ /* 88 */ 0xc3a6, 0x0000, 0x0000, 0x0000, 0xc3a7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3a8, 0xc3a9, 0x0000, 0xc3aa,
+ /* 98 */ 0xc3ab, 0xc3ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc3ad, 0x0000, 0x0000, 0x0000, 0xc3ae, 0x0000, 0xc3af, 0x0000,
+ /* a8 */ 0xc3b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc3b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xc3b2,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb2xx - offset 0x077d1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc3b3, 0xc3b4, 0x0000, 0x0000, 0xc3b5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc3b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc3b7, 0xc3b8, 0x0000, 0xc3b9, 0xc3ba, 0xc3bb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3bc, 0xc3bd, 0x0000, 0x0000,
+ /* b8 */ 0xc3be, 0x0000, 0x0000, 0x0000, 0xc3bf,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb3xx - offset 0x0780e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3c0, 0xc3c1, 0x0000, 0xc3c2,
+ /* 88 */ 0x0000, 0xc3c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc3c4, 0x0000, 0x0000, 0x0000, 0xc3c5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3c6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3c7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc3c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb4xx - offset 0x0784d ***/
+
+ /* 80 */ 0x0000, 0xc3c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc3ca, 0xc3cb, 0x0000, 0x0000, 0xc3cc, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc3cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc3ce, 0xc3cf, 0x0000, 0xc3d0, 0x0000, 0xc3d1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3d2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc3d3, 0x0000, 0x0000, 0x0000, 0xc3d4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc3d5,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb5xx - offset 0x07887 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3d6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc3d7, 0x0000, 0x0000, 0x0000, 0xc3d8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3d9, 0xc3da, 0x0000, 0xc3db,
+ /* b0 */ 0x0000, 0xc3dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc3dd,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb6xx - offset 0x078c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc3de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3df, 0xc3e0, 0x0000, 0x0000,
+ /* 98 */ 0xc3e1, 0x0000, 0x0000, 0x0000, 0xc3e2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3e3, 0xc3e4, 0x0000, 0xc3e5,
+ /* a8 */ 0x0000, 0xc3e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc3e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb7xx - offset 0x078fc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3e8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3e9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc3ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc3eb, 0x0000, 0x0000, 0x0000, 0xc3ec, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc3ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc3ee, 0xc3ef, 0x0000, 0xc3f0, 0x0000, 0xc3f1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb8xx - offset 0x0793a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3f2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc3f3, 0x0000, 0x0000, 0x0000, 0xc3f4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc3f5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xc3f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc3f7, 0xc3f8, 0x0000, 0x0000, 0xc3f9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc3fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc3fb, 0xc3fc, 0x0000, 0xc3fd, 0x0000, 0xc3fe,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecb9xx - offset 0x07970 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc4a1, 0xc4a2, 0x0000, 0x0000, 0xc4a3, 0x0000, 0x0000, 0xc4a4,
+ /* a0 */ 0xc4a5, 0xc4a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc4a7, 0xc4a8, 0x0000, 0xc4a9, 0x0000, 0xc4aa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4ab, 0xc4ac, 0x0000, 0x0000,
+ /* b8 */ 0xc4ad, 0x0000, 0x0000, 0x0000, 0xc4ae,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecbaxx - offset 0x079ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4af, 0xc4b0, 0x0000, 0xc4b1,
+ /* 88 */ 0x0000, 0xc4b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc4b3, 0xc4b4, 0x0000, 0x0000, 0xc4b5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc4b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc4b7, 0xc4b8, 0x0000, 0xc4b9, 0xc4ba, 0xc4bb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4bc, 0xc4bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecbbxx - offset 0x079ec ***/
+
+ /* 80 */ 0x0000, 0xc4be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4bf, 0xc4c0, 0x0000, 0x0000,
+ /* a8 */ 0xc4c1, 0x0000, 0x0000, 0xc4c2, 0xc4c3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4c4, 0xc4c5, 0x0000, 0xc4c6,
+ /* b8 */ 0xc4c7, 0xc4c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ecbcxx - offset 0x07a2c ***/
+
+ /* 80 */ 0xc4c9, 0xc4ca, 0x0000, 0x0000, 0xc4cb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc4cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc4cd, 0xc4ce, 0x0000, 0xc4cf, 0x0000, 0xc4d0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4d1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc4d2, 0x0000, 0x0000, 0x0000, 0xc4d3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4d4, 0xc4d5, 0x0000, 0xc4d6,
+ /* b0 */ 0xc4d7, 0xc4d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc4d9,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecbdxx - offset 0x07a65 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4da, 0xc4db, 0x0000, 0x0000,
+ /* 98 */ 0xc4dc, 0x0000, 0x0000, 0x0000, 0xc4dd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4de, 0xc4df, 0x0000, 0xc4e0,
+ /* a8 */ 0x0000, 0xc4e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc4e2, 0xc4e3, 0x0000, 0x0000, 0xc4e4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc4e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ecbexx - offset 0x07aa5 ***/
+
+ /* 80 */ 0xc4e6, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4e7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4e8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xc4e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc4ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc4eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ecbfxx - offset 0x07ae1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4ec, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc4ed, 0xc4ee, 0x0000, 0x0000, 0xc4ef, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc4f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc4f1, 0xc4f2, 0x0000, 0xc4f3, 0x0000, 0xc4f4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4f5, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed80xx - offset 0x07b21 ***/
+
+ /* 80 */ 0xc4f6, 0x0000, 0x0000, 0x0000, 0xc4f7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc4f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc4f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4fa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc4fb, 0xc4fc, 0x0000, 0x0000,
+ /* b8 */ 0xc4fd, 0x0000, 0x0000, 0x0000, 0xc4fe,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed81xx - offset 0x07b5e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5a1, 0xc5a2, 0x0000, 0xc5a3,
+ /* 88 */ 0x0000, 0xc5a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc5a5, 0x0000, 0x0000, 0x0000, 0xc5a6, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc5a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc5a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5a9, 0xc5aa, 0x0000, 0x0000,
+ /* b0 */ 0xc5ab, 0x0000, 0x0000, 0x0000, 0xc5ac, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5ad, 0xc5ae, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed82xx - offset 0x07b9d ***/
+
+ /* 80 */ 0x0000, 0xc5af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5b0, 0xc5b1, 0x0000, 0x0000,
+ /* a8 */ 0xc5b2, 0x0000, 0x0000, 0x0000, 0xc5b3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5b4, 0xc5b5, 0x0000, 0xc5b6,
+ /* b8 */ 0x0000, 0xc5b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed83xx - offset 0x07bdd ***/
+
+ /* 80 */ 0xc5b8, 0xc5b9, 0x0000, 0x0000, 0xc5ba, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc5bb, 0xc5bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc5bd, 0xc5be, 0x0000, 0xc5bf, 0xc5c0, 0xc5c1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5c2, 0xc5c3, 0x0000, 0x0000,
+ /* a0 */ 0xc5c4, 0x0000, 0x0000, 0x0000, 0xc5c5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5c6, 0xc5c7, 0x0000, 0xc5c8,
+ /* b0 */ 0xc5c9, 0xc5ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc5cb,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed84xx - offset 0x07c16 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5cc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc5cd, 0xc5ce, 0x0000, 0x0000, 0xc5cf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc5d0, 0x0000, 0xc5d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed85xx - offset 0x07c56 ***/
+
+ /* 80 */ 0xc5d2, 0xc5d3, 0x0000, 0xc5d4, 0xc5d5, 0xc5d6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5d7, 0xc5d8, 0x0000, 0x0000,
+ /* 90 */ 0xc5d9, 0x0000, 0x0000, 0x0000, 0xc5da, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5db, 0xc5dc, 0x0000, 0xc5dd,
+ /* a0 */ 0x0000, 0xc5de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc5df, 0x0000, 0x0000, 0x0000, 0xc5e0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5e1,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed86xx - offset 0x07c93 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5e2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc5e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc5e4, 0xc5e5, 0x0000, 0x0000, 0xc5e6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc5e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc5e8, 0xc5e9, 0x0000, 0xc5ea, 0x0000, 0xc5eb, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xc5ec, 0x0000, 0xc5ed, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed87xx - offset 0x07cd3 ***/
+
+ /* 80 */ 0xc5ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc5ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc5f1,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed88xx - offset 0x07d0c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f2,
+ /* 88 */ 0x0000, 0xc5f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc5f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f5, 0xc5f6, 0x0000, 0x0000,
+ /* b0 */ 0xc5f7, 0x0000, 0x0000, 0x0000, 0xc5f8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5f9, 0xc5fa, 0x0000, 0xc5fb,
+
+ /*** Three byte table, leaf: ed89xx - offset 0x07d4c ***/
+
+ /* 80 */ 0x0000, 0xc5fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc5fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc5fe, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed8axx - offset 0x07d8c ***/
+
+ /* 80 */ 0xc6a2, 0xc6a3, 0x0000, 0x0000, 0xc6a4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc6a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc6a6, 0xc6a7, 0x0000, 0x0000, 0x0000, 0xc6a8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6a9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc6aa, 0x0000, 0x0000, 0x0000, 0xc6ab, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ac, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xc6ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc6ae, 0xc6af, 0x0000, 0x0000, 0xc6b0, 0x0000, 0x0000, 0xc6b1,
+
+ /*** Three byte table, leaf: ed8bxx - offset 0x07dcc ***/
+
+ /* 80 */ 0xc6b2, 0x0000, 0xc6b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc6b4, 0xc6b5, 0x0000, 0xc6b6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6b7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc6b8, 0x0000, 0x0000, 0x0000, 0xc6b9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ba, 0xc6bb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc6bc, 0xc6bd, 0x0000, 0x0000, 0xc6be, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc6bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed8cxx - offset 0x07e0c ***/
+
+ /* 80 */ 0xc6c0, 0xc6c1, 0x0000, 0xc6c2, 0x0000, 0xc6c3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6c4, 0xc6c5, 0xc6c6, 0x0000,
+ /* 90 */ 0xc6c7, 0x0000, 0x0000, 0x0000, 0xc6c8, 0x0000, 0xc6c9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ca, 0xc6cb, 0x0000, 0xc6cc,
+ /* a0 */ 0xc6cd, 0xc6ce, 0x0000, 0x0000, 0x0000, 0xc6cf, 0x0000, 0x0000,
+ /* a8 */ 0xc6d0, 0xc6d1, 0x0000, 0x0000, 0xc6d2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc6d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc6d4, 0xc6d5, 0x0000, 0xc6d6, 0xc6d7, 0xc6d8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed8dxx - offset 0x07e4a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6d9, 0xc6da, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6db, 0xc6dc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed8exx - offset 0x07e8a ***/
+
+ /* 80 */ 0xc6dd, 0x0000, 0x0000, 0x0000, 0xc6de, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6df, 0xc6e0, 0x0000, 0xc6e1,
+ /* 90 */ 0xc6e2, 0xc6e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc6e4, 0xc6e5, 0x0000, 0x0000, 0xc6e6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc6e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc6e8, 0xc6e9, 0x0000, 0xc6ea, 0x0000, 0xc6eb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ec, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc6ed, 0x0000, 0x0000, 0x0000, 0xc6ee,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed8fxx - offset 0x07ec7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6ef, 0xc6f0, 0x0000, 0x0000,
+ /* 88 */ 0xc6f1, 0xc6f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc6f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xc6f5, 0x0000, 0xc6f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6f7, 0xc6f8, 0x0000, 0x0000,
+ /* b0 */ 0xc6f9, 0x0000, 0x0000, 0x0000, 0xc6fa, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc6fb, 0xc6fc, 0x0000, 0xc6fd,
+
+ /*** Three byte table, leaf: ed90xx - offset 0x07f07 ***/
+
+ /* 80 */ 0x0000, 0xc6fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc7a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7a2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed91xx - offset 0x07f47 ***/
+
+ /* 80 */ 0xc7a3, 0x0000, 0x0000, 0x0000, 0xc7a4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7a5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc7a6, 0x0000, 0x0000, 0x0000, 0xc7a7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7a8, 0x0000, 0xc7a9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc7aa, 0xc7ab, 0x0000, 0x0000, 0xc7ac, 0x0000, 0x0000, 0xc7ad,
+
+ /*** Three byte table, leaf: ed92xx - offset 0x07f87 ***/
+
+ /* 80 */ 0xc7ae, 0x0000, 0xc7af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc7b0, 0xc7b1, 0x0000, 0xc7b2, 0x0000, 0xc7b3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7b4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed93xx - offset 0x07fbb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7b6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc7b7, 0x0000, 0x0000, 0x0000, 0xc7b8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7b9, 0x0000, 0x0000, 0xc7ba,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc7bb, 0x0000, 0x0000, 0x0000, 0xc7bc, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc7bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc7be, 0x0000, 0x0000, 0xc7bf, 0x0000, 0xc7c0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed94xx - offset 0x07ff9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7c1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc7c2, 0x0000, 0x0000, 0x0000, 0xc7c3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7c4, 0xc7c5, 0x0000, 0xc7c6,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7c7, 0xc7c8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed95xx - offset 0x08039 ***/
+
+ /* 80 */ 0xc7c9, 0x0000, 0x0000, 0x0000, 0xc7ca, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7cb, 0xc7cc, 0x0000, 0xc7cd,
+ /* 90 */ 0x0000, 0xc7ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc7cf, 0xc7d0, 0x0000, 0x0000, 0xc7d1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc7d2, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7d3, 0x0000, 0x0000,
+ /* a8 */ 0xc7d4, 0xc7d5, 0x0000, 0xc7d6, 0x0000, 0xc7d7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7d8, 0xc7d9, 0x0000, 0x0000,
+ /* b8 */ 0xc7da, 0x0000, 0x0000, 0x0000, 0xc7db,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed96xx - offset 0x08076 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7dc, 0xc7dd, 0x0000, 0xc7de,
+ /* 88 */ 0xc7df, 0xc7e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc7e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc7e2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed97xx - offset 0x080ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc7e3, 0xc7e4, 0x0000, 0x0000, 0xc7e5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc7e6, 0x0000, 0xc7e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc7e8, 0xc7e9, 0x0000, 0xc7ea, 0x0000, 0xc7eb, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7ec, 0xc7ed, 0x0000, 0x0000,
+ /* a8 */ 0xc7ee, 0x0000, 0x0000, 0x0000, 0xc7ef, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7f0, 0xc7f1, 0x0000, 0xc7f2,
+ /* b8 */ 0x0000, 0xc7f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed98xx - offset 0x080ee ***/
+
+ /* 80 */ 0xc7f4, 0xc7f5, 0x0000, 0x0000, 0xc7f6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc7f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc7f8, 0xc7f9, 0x0000, 0xc7fa, 0xc7fb, 0xc7fc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc7fd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc7fe, 0x0000, 0x0000, 0x0000, 0xc8a1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8a2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xc8a3, 0xc8a4, 0x0000, 0x0000, 0xc8a5, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed99xx - offset 0x0812e ***/
+
+ /* 80 */ 0xc8a6, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8a7, 0x0000, 0x0000,
+ /* 88 */ 0xc8a8, 0xc8a9, 0x0000, 0xc8aa, 0x0000, 0xc8ab, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc8ac, 0x0000, 0x0000, 0xc8ad, 0xc8ae, 0x0000, 0x0000,
+ /* 98 */ 0xc8af, 0x0000, 0x0000, 0x0000, 0xc8b0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8b1,
+ /* a8 */ 0x0000, 0xc8b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc8b3, 0xc8b4, 0x0000, 0x0000, 0xc8b5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed9axx - offset 0x0816b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xc8b6, 0x0000, 0xc8b7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8b8, 0xc8b9, 0x0000, 0x0000,
+ /* 90 */ 0xc8ba, 0x0000, 0x0000, 0x0000, 0xc8bb, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8bc, 0x0000, 0xc8bd,
+ /* a0 */ 0x0000, 0xc8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc8bf, 0x0000, 0x0000, 0x0000, 0xc8c0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc8c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xc8c2, 0x0000, 0xc8c3,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed9bxx - offset 0x081a7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c4, 0xc8c5, 0x0000, 0x0000,
+ /* 88 */ 0xc8c6, 0x0000, 0x0000, 0x0000, 0xc8c7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc8c8, 0x0000, 0x0000, 0xc8c9, 0x0000, 0x0000, 0xc8ca,
+ /* 98 */ 0x0000, 0xc8cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc8cc, 0x0000, 0x0000, 0x0000, 0xc8cd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc8ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8d0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8d1, 0xc8d2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ed9cxx - offset 0x081e7 ***/
+
+ /* 80 */ 0xc8d3, 0x0000, 0x0000, 0x0000, 0xc8d4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xc8d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc8d6, 0xc8d7, 0x0000, 0x0000, 0xc8d8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc8d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xc8da, 0xc8db, 0x0000, 0xc8dc, 0x0000, 0xc8dd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8de, 0xc8df, 0x0000, 0x0000,
+ /* b8 */ 0xc8e0, 0x0000, 0x0000, 0x0000, 0xc8e1,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed9dxx - offset 0x08224 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8e2, 0x0000, 0x0000, 0xc8e3,
+ /* 88 */ 0x0000, 0xc8e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc8e5, 0xc8e6, 0x0000, 0x0000, 0xc8e7, 0x0000, 0xc8e8, 0xc8e9,
+ /* 98 */ 0xc8ea, 0xc8eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xc8ec, 0xc8ed, 0x0000, 0xc8ee, 0x0000, 0xc8ef, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xc8f0, 0x0000, 0x0000, 0xc8f1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xc8f2, 0x0000, 0x0000, 0x0000, 0xc8f3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xc8f4, 0xc8f5, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: ed9exx - offset 0x08263 ***/
+
+ /* 80 */ 0x0000, 0xc8f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xc8f7, 0xc8f8, 0x0000, 0x0000, 0xc8f9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xc8fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xc8fb, 0xc8fc, 0x0000, 0xc8fd, 0x0000, 0xc8fe, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efa4xx - offset 0x082a3 ***/
+
+ /* 80 */ 0xcbd0, 0xcbd6, 0xcbe7, 0xcdcf, 0xcde8, 0xcead, 0xcffb, 0xd0a2,
+ /* 88 */ 0xd0b8, 0xd0d0, 0xd0dd, 0xd1d4, 0xd1d5, 0xd1d8, 0xd1db, 0xd1dc,
+ /* 90 */ 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5,
+ /* 98 */ 0xd1e6, 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ed, 0xd1ef, 0xd1f0,
+ /* a0 */ 0xd1f2, 0xd1f6, 0xd1fa, 0xd1fc, 0xd1fd, 0xd1fe, 0xd2a2, 0xd2a3,
+ /* a8 */ 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ad, 0xd2b2, 0xd2be,
+ /* b0 */ 0xd2c2, 0xd2c3, 0xd2c4, 0xd2c6, 0xd2c7, 0xd2c8, 0xd2c9, 0xd2ca,
+ /* b8 */ 0xd2cb, 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3,
+
+ /*** Three byte table, leaf: efa5xx - offset 0x082e3 ***/
+
+ /* 80 */ 0xd2d4, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d9, 0xd2da, 0xd2de, 0xd2df,
+ /* 88 */ 0xd2e1, 0xd2e2, 0xd2e4, 0xd2e5, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9,
+ /* 90 */ 0xd2ea, 0xd2eb, 0xd2f0, 0xd2f1, 0xd2f2, 0xd2f3, 0xd2f4, 0xd2f5,
+ /* 98 */ 0xd2f7, 0xd2f8, 0xd4e6, 0xd4fc, 0xd5a5, 0xd5ab, 0xd5ae, 0xd6b8,
+ /* a0 */ 0xd6cd, 0xd7cb, 0xd7e4, 0xdbc5, 0xdbe4, 0xdca5, 0xdda5, 0xddd5,
+ /* a8 */ 0xddf4, 0xdefc, 0xdefe, 0xdfb3, 0xdfe1, 0xdfe8, 0xe0f1, 0xe1ad,
+ /* b0 */ 0xe1ed, 0xe3f5, 0xe4a1, 0xe4a9, 0xe5ae, 0xe5b1, 0xe5b2, 0xe5b9,
+ /* b8 */ 0xe5bb, 0xe5bc, 0xe5c4, 0xe5ce, 0xe5d0, 0xe5d2, 0xe5d6, 0xe5fa,
+
+ /*** Three byte table, leaf: efa6xx - offset 0x08323 ***/
+
+ /* 80 */ 0xe5fb, 0xe5fc, 0xe5fe, 0xe6a1, 0xe6a4, 0xe6a7, 0xe6ad, 0xe6af,
+ /* 88 */ 0xe6b0, 0xe6b1, 0xe6b3, 0xe6b7, 0xe6b8, 0xe6bc, 0xe6c4, 0xe6c6,
+ /* 90 */ 0xe6c7, 0xe6ca, 0xe6d2, 0xe6d6, 0xe6d9, 0xe6dc, 0xe6df, 0xe6e1,
+ /* 98 */ 0xe6e4, 0xe6e5, 0xe6e6, 0xe6e8, 0xe6ea, 0xe6eb, 0xe6ec, 0xe6ef,
+ /* a0 */ 0xe6f1, 0xe6f2, 0xe6f5, 0xe6f6, 0xe6f7, 0xe6f9, 0xe7a1, 0xe7a6,
+ /* a8 */ 0xe7a9, 0xe7aa, 0xe7ac, 0xe7ad, 0xe7b0, 0xe7bf, 0xe7c1, 0xe7c6,
+ /* b0 */ 0xe7c7, 0xe7cb, 0xe7cd, 0xe7cf, 0xe7d0, 0xe7d3, 0xe7df, 0xe7e4,
+ /* b8 */ 0xe7e6, 0xe7f7, 0xe8e7, 0xe8e8, 0xe8f0, 0xe8f1, 0xe8f7, 0xe8f9,
+
+ /*** Three byte table, leaf: efa7xx - offset 0x08363 ***/
+
+ /* 80 */ 0xe8fb, 0xe8fe, 0xe9a7, 0xe9ac, 0xe9cc, 0xe9f7, 0xeac1, 0xeae5,
+ /* 88 */ 0xeaf4, 0xeaf7, 0xeafc, 0xeafe, 0xeba4, 0xeba7, 0xeba9, 0xebaa,
+ /* 90 */ 0xebba, 0xebbb, 0xebbd, 0xebc1, 0xebc2, 0xebc6, 0xebc7, 0xebcc,
+ /* 98 */ 0xebcf, 0xebd0, 0xebd1, 0xebd2, 0xebd8, 0xeca6, 0xeca7, 0xecaa,
+ /* a0 */ 0xecaf, 0xecb0, 0xecb1, 0xecb2, 0xecb5, 0xecb8, 0xecba, 0xecc0,
+ /* a8 */ 0xecc1, 0xecc5, 0xecc6, 0xecc9, 0xecca, 0xecd5, 0xecdd, 0xecde,
+ /* b0 */ 0xece1, 0xece4, 0xece7, 0xece8, 0xecf7, 0xecf8, 0xecfa, 0xeda1,
+ /* b8 */ 0xeda2, 0xeda3, 0xedee, 0xeedb, 0xf2bd, 0xf2fa, 0xf3b1, 0xf4a7,
+
+ /*** Three byte table, leaf: efa8xx - offset 0x083a3 ***/
+
+ /* 80 */ 0xf4ee, 0xf6f4, 0xf6f6, 0xf7b8, 0xf7c8, 0xf7d3, 0xf8db, 0xf8f0,
+ /* 88 */ 0xfaa1, 0xfaa2, 0xfae6, 0xfca9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x083e2 ***/
+
+ /* 80 */ 0x0000, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7,
+ /* 88 */ 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af,
+ /* 90 */ 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
+ /* 98 */ 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf,
+ /* a0 */ 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
+ /* a8 */ 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
+ /* b0 */ 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
+ /* b8 */ 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa1ac, 0xa3dd, 0xa3de, 0xa3df,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x08422 ***/
+
+ /* 80 */ 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
+ /* 88 */ 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
+ /* 90 */ 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
+ /* 98 */ 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa2a6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x08462 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1cb, 0xa1cc, 0xa1fe, 0xa3fe, 0x0000, 0xa1cd, 0xa3dc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_euc_tw.map b/src/backend/utils/mb/Unicode/utf8_to_euc_tw.map
new file mode 100644
index 0000000..25b196f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_euc_tw.map
@@ -0,0 +1,6865 @@
+/* src/backend/utils/mb/Unicode/utf8_to_euc_tw.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl */
+
+static const uint32 euc_tw_from_unicode_tree_table[22640];
+
+static const pg_mb_radix_tree euc_tw_from_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ euc_tw_from_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcf, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x016e, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 euc_tw_from_unicode_tree_table[22640] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 04 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 08 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 0c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 10 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 14 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 18 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 1c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 20 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 24 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 28 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 2c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 30 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 34 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 38 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 3c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0000004e, 0x00000086, 0x00000000, 0x00000000,
+ /* c6 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ca */ 0x00000000, 0x000000bf, 0x00000000, 0x00000000,
+ /* ce */ 0x000000ee, 0x0000012e,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004e ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1f0,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000a2f8, 0x0000a2b4, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1b1,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00086 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a2b2,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a2b3,
+ /* b8 */ 0x00000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x000bf ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a5ef,
+ /* 88 */ 0x00000000, 0x0000a5ed, 0x0000a5ee, 0x0000a5f0,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x0000a5ec, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x000ee ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000a4f5, 0x0000a4f6, 0x0000a4f7,
+ /* 94 */ 0x0000a4f8, 0x0000a4f9, 0x0000a4fa, 0x0000a4fb,
+ /* 98 */ 0x0000a4fc, 0x0000a4fd, 0x0000a4fe, 0x0000a5a1,
+ /* 9c */ 0x0000a5a2, 0x0000a5a3, 0x0000a5a4, 0x0000a5a5,
+ /* a0 */ 0x0000a5a6, 0x0000a5a7, 0x00000000, 0x0000a5a8,
+ /* a4 */ 0x0000a5a9, 0x0000a5aa, 0x0000a5ab, 0x0000a5ac,
+ /* a8 */ 0x0000a5ad, 0x0000a5ae, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x0000a5af, 0x0000a5b0, 0x0000a5b1,
+ /* b4 */ 0x0000a5b2, 0x0000a5b3, 0x0000a5b4, 0x0000a5b5,
+ /* b8 */ 0x0000a5b6, 0x0000a5b7, 0x0000a5b8, 0x0000a5b9,
+ /* bc */ 0x0000a5ba, 0x0000a5bb, 0x0000a5bc, 0x0000a5bd,
+
+ /*** Two byte table, leaf: cfxx - offset 0x0012e ***/
+
+ /* 80 */ 0x0000a5be, 0x0000a5bf, 0x00000000, 0x0000a5c0,
+ /* 84 */ 0x0000a5c1, 0x0000a5c2, 0x0000a5c3, 0x0000a5c4,
+ /* 88 */ 0x0000a5c5, 0x0000a5c6, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0016e ***/
+
+ /* e2 */ 0x0000017c, 0x000001bc, 0x000001cc, 0x0000020c,
+ /* e6 */ 0x0000024c, 0x0000028c, 0x000002cc, 0x0000030c,
+ /* ea */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ee */ 0x00000000, 0x0000034b,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0017c ***/
+
+ /* 80 */ 0x0000038b, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x000003ca, 0x000003ea, 0x00000424, 0x00000000,
+ /* 88 */ 0x0000044f, 0x0000048c, 0x000004b4, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x000004f4, 0x00000516, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000556, 0x00000593, 0x000005d2, 0x00000610,
+ /* 98 */ 0x0000064b, 0x0000068b, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x001bc ***/
+
+ /* 80 */ 0x000006cb, 0x00000000, 0x00000000, 0x000006f5,
+ /* 84 */ 0x00000731, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x0000075b, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000078d, 0x000007c9,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x001cc ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000809, 0x00000849, 0x00000889, 0x000008c9,
+ /* bc */ 0x00000909, 0x00000949, 0x00000989, 0x000009c9,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x0020c ***/
+
+ /* 80 */ 0x00000a09, 0x00000a49, 0x00000a89, 0x00000ac9,
+ /* 84 */ 0x00000b09, 0x00000b49, 0x00000b89, 0x00000bc8,
+ /* 88 */ 0x00000c08, 0x00000c47, 0x00000c87, 0x00000cc7,
+ /* 8c */ 0x00000d07, 0x00000d47, 0x00000d87, 0x00000dc6,
+ /* 90 */ 0x00000e06, 0x00000e46, 0x00000e86, 0x00000ec6,
+ /* 94 */ 0x00000f06, 0x00000f46, 0x00000f86, 0x00000fc6,
+ /* 98 */ 0x00001006, 0x00001046, 0x00001086, 0x000010c6,
+ /* 9c */ 0x00001106, 0x00001146, 0x00001186, 0x000011c6,
+ /* a0 */ 0x00001206, 0x00001246, 0x00001286, 0x000012c6,
+ /* a4 */ 0x00001306, 0x00001346, 0x00001386, 0x000013c6,
+ /* a8 */ 0x00001406, 0x00001446, 0x00001486, 0x000014c6,
+ /* ac */ 0x00001506, 0x00001546, 0x00001586, 0x000015c6,
+ /* b0 */ 0x00001606, 0x00001646, 0x00001686, 0x000016c5,
+ /* b4 */ 0x00001705, 0x00001745, 0x00001785, 0x000017c5,
+ /* b8 */ 0x00001805, 0x00001845, 0x00001885, 0x000018c5,
+ /* bc */ 0x00001905, 0x00001945, 0x00001985, 0x000019c5,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x0024c ***/
+
+ /* 80 */ 0x00001a05, 0x00001a45, 0x00001a85, 0x00001ac5,
+ /* 84 */ 0x00001b05, 0x00001b45, 0x00001b85, 0x00001bc5,
+ /* 88 */ 0x00001c05, 0x00001c45, 0x00001c85, 0x00001cc5,
+ /* 8c */ 0x00001d05, 0x00001d45, 0x00001d85, 0x00001dc5,
+ /* 90 */ 0x00001e04, 0x00001e44, 0x00001e84, 0x00001ec4,
+ /* 94 */ 0x00001f04, 0x00001f44, 0x00001f84, 0x00001fc4,
+ /* 98 */ 0x00002004, 0x00002044, 0x00002084, 0x000020c4,
+ /* 9c */ 0x00002104, 0x00002144, 0x00002184, 0x000021c4,
+ /* a0 */ 0x00002204, 0x00002244, 0x00002284, 0x000022c3,
+ /* a4 */ 0x00002303, 0x00002343, 0x00002381, 0x000023c1,
+ /* a8 */ 0x00002401, 0x00002441, 0x00002481, 0x000024c1,
+ /* ac */ 0x00002501, 0x00002541, 0x00002581, 0x000025c1,
+ /* b0 */ 0x00002601, 0x00002641, 0x00002681, 0x000026c1,
+ /* b4 */ 0x00002701, 0x00002741, 0x00002781, 0x000027c1,
+ /* b8 */ 0x00002801, 0x00002841, 0x00002881, 0x000028c1,
+ /* bc */ 0x00002901, 0x00002941, 0x00002981, 0x000029c1,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x0028c ***/
+
+ /* 80 */ 0x00002a01, 0x00002a41, 0x00002a80, 0x00002ac0,
+ /* 84 */ 0x00002b00, 0x00002b40, 0x00002b80, 0x00002bc0,
+ /* 88 */ 0x00002c00, 0x00002c40, 0x00002c80, 0x00002cc0,
+ /* 8c */ 0x00002d00, 0x00002d40, 0x00002d80, 0x00002dc0,
+ /* 90 */ 0x00002e00, 0x00002e40, 0x00002e80, 0x00002ec0,
+ /* 94 */ 0x00002f00, 0x00002f40, 0x00002f80, 0x00002fc0,
+ /* 98 */ 0x00003000, 0x0000303e, 0x0000307e, 0x000030be,
+ /* 9c */ 0x000030fe, 0x0000313e, 0x0000317e, 0x000031be,
+ /* a0 */ 0x000031fc, 0x0000323a, 0x0000327a, 0x000032ba,
+ /* a4 */ 0x000032fa, 0x0000333a, 0x0000337a, 0x000033ba,
+ /* a8 */ 0x000033fa, 0x0000343a, 0x0000347a, 0x000034ba,
+ /* ac */ 0x000034fa, 0x0000353a, 0x00003579, 0x000035b9,
+ /* b0 */ 0x000035f9, 0x00003639, 0x00003679, 0x000036b9,
+ /* b4 */ 0x000036f9, 0x00003739, 0x00003779, 0x000037b9,
+ /* b8 */ 0x000037f9, 0x00003839, 0x00003879, 0x00000000,
+ /* bc */ 0x00003898, 0x000038d8, 0x00003918, 0x00003958,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x002cc ***/
+
+ /* 80 */ 0x00003998, 0x000039d8, 0x00003a18, 0x00003a56,
+ /* 84 */ 0x00003a96, 0x00003ad6, 0x00003b16, 0x00003b56,
+ /* 88 */ 0x00003b96, 0x00003bd6, 0x00003c16, 0x00003c56,
+ /* 8c */ 0x00003c96, 0x00003cd6, 0x00003d16, 0x00003d56,
+ /* 90 */ 0x00003d96, 0x00003dd6, 0x00003e16, 0x00003e56,
+ /* 94 */ 0x00003e96, 0x00003ed6, 0x00003f16, 0x00003f56,
+ /* 98 */ 0x00003f96, 0x00003fd6, 0x00004014, 0x00004054,
+ /* 9c */ 0x00004094, 0x000040d4, 0x00004113, 0x00004153,
+ /* a0 */ 0x00004193, 0x000041d3, 0x00004213, 0x00004253,
+ /* a4 */ 0x00004293, 0x000042d3, 0x00004313, 0x00004353,
+ /* a8 */ 0x00004393, 0x000043d3, 0x00004413, 0x00004453,
+ /* ac */ 0x00004493, 0x000044d3, 0x00004513, 0x00000000,
+ /* b0 */ 0x00004533, 0x00004573, 0x000045b3, 0x000045f3,
+ /* b4 */ 0x00004633, 0x00004650, 0x00004690, 0x000046d0,
+ /* b8 */ 0x00004710, 0x00004750, 0x0000478f, 0x000047cf,
+ /* bc */ 0x0000480f, 0x0000484f, 0x00004875, 0x000048b5,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x0030c ***/
+
+ /* 80 */ 0x000048f5, 0x00004935, 0x00004975, 0x000049b5,
+ /* 84 */ 0x000049f5, 0x00004a35, 0x00004a75, 0x00004ab5,
+ /* 88 */ 0x00004af5, 0x00004b35, 0x00004b75, 0x00004bb5,
+ /* 8c */ 0x00004bf5, 0x00004c35, 0x00004c75, 0x00004cb5,
+ /* 90 */ 0x00004cf5, 0x00004d35, 0x00004d75, 0x00000000,
+ /* 94 */ 0x00000000, 0x00004d7e, 0x00004dbe, 0x00004dfe,
+ /* 98 */ 0x00004e26, 0x00004e66, 0x00004ea6, 0x00004ee6,
+ /* 9c */ 0x00004f26, 0x00004f66, 0x00004fa6, 0x00004fe6,
+ /* a0 */ 0x00005026, 0x00005066, 0x0000509b, 0x000050db,
+ /* a4 */ 0x0000511b, 0x0000515b, 0x00005185, 0x000051c5,
+ /* a8 */ 0x00005205, 0x00005245, 0x00005271, 0x000052b1,
+ /* ac */ 0x000052f1, 0x00005331, 0x00005371, 0x000053b1,
+ /* b0 */ 0x000053f1, 0x00005431, 0x00000000, 0x0000546d,
+ /* b4 */ 0x000054ad, 0x000054ed, 0x0000552d, 0x0000556d,
+ /* b8 */ 0x000055ad, 0x000055cc, 0x0000560c, 0x0000564c,
+ /* bc */ 0x0000568c, 0x000056cc, 0x0000570b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0034b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00005731, 0x00005771, 0x00000000, 0x00000000,
+ /* bc */ 0x000057b0, 0x000057f0, 0x00000000, 0x00005830,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0038b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1b9,
+ /* 94 */ 0x0000a1b7, 0x00000000, 0x0000a2dd, 0x00000000,
+ /* 98 */ 0x0000a1e4, 0x0000a1e5, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000a1e6, 0x0000a1e7, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x0000a1ad, 0x0000a1ac, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x0000a1ea, 0x00000000,
+ /* b4 */ 0x00000000, 0x0000a1eb, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1ef,
+ /* bc */ 0x00000000, 0x00000000, 0x0000a2a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x003ca ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a2ea,
+ /* 84 */ 0x00000000, 0x0000a2a2, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x0000a2eb, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x003ea ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000a4ab, 0x0000a4ac, 0x0000a4ad, 0x0000a4ae,
+ /* a4 */ 0x0000a4af, 0x0000a4b0, 0x0000a4b1, 0x0000a4b2,
+ /* a8 */ 0x0000a4b3, 0x0000a4b4, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000a6b5, 0x0000a6b6, 0x0000a6b7, 0x0000a6b8,
+ /* b4 */ 0x0000a6b9, 0x0000a6ba, 0x0000a6bb, 0x0000a6bc,
+ /* b8 */ 0x0000a6bd, 0x0000a6be,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00424 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x0000a2d8, 0x0000a2d5, 0x0000a2d7, 0x0000a2d6,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000a2d9, 0x0000a2da,
+ /* 98 */ 0x0000a2dc, 0x0000a2db, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e288xx - offset 0x0044f ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x0000a2e1, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x0000a2b5, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x0000a2bc, 0x0000a2c9,
+ /* a0 */ 0x0000a2c8, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x0000a2c5, 0x0000a2c6, 0x0000a2cd,
+ /* ac */ 0x00000000, 0x00000000, 0x0000a2ce, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x0000a2d0, 0x0000a2cf, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x0000a2c4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0048c ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x0000a2bd, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000a2bb, 0x0000a2be, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x0000a2b9, 0x0000a2ba,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x004b4 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x0000a2c7, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x0000a2ca,
+
+ /*** Three byte table, leaf: e290xx - offset 0x004f4 ***/
+
+ /* 80 */ 0x0000c2a1, 0x0000c2a2, 0x0000c2a3, 0x0000c2a4,
+ /* 84 */ 0x0000c2a5, 0x0000c2a6, 0x0000c2a7, 0x0000c2a8,
+ /* 88 */ 0x0000c2a9, 0x0000c2aa, 0x0000c2ab, 0x0000c2ac,
+ /* 8c */ 0x0000c2ad, 0x0000c2ae, 0x0000c2af, 0x0000c2b0,
+ /* 90 */ 0x0000c2b1, 0x0000c2b2, 0x0000c2b3, 0x0000c2b4,
+ /* 94 */ 0x0000c2b5, 0x0000c2b6, 0x0000c2b7, 0x0000c2b8,
+ /* 98 */ 0x0000c2b9, 0x0000c2ba, 0x0000c2bb, 0x0000c2bc,
+ /* 9c */ 0x0000c2bd, 0x0000c2be, 0x0000c2bf, 0x0000c2c0,
+ /* a0 */ 0x00000000, 0x0000c2c1,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x00516 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000a6a1, 0x0000a6a2, 0x0000a6a3, 0x0000a6a4,
+ /* a4 */ 0x0000a6a5, 0x0000a6a6, 0x0000a6a7, 0x0000a6a8,
+ /* a8 */ 0x0000a6a9, 0x0000a6aa, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x0000a6ab, 0x0000a6ac, 0x0000a6ad, 0x0000a6ae,
+ /* b8 */ 0x0000a6af, 0x0000a6b0, 0x0000a6b1, 0x0000a6b2,
+ /* bc */ 0x0000a6b3, 0x0000a6b4, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00556 ***/
+
+ /* 80 */ 0x0000a3b9, 0x00000000, 0x0000a3ba, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x0000a3bc, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x0000a3bd, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000a3be, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x0000a3bf, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000a3b7, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x0000a3b6, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x0000a3b5, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x0000a3b4, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x0000a3b3,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e295xx - offset 0x00593 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x0000a3c4, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x0000a3c5, 0x00000000,
+ /* a0 */ 0x00000000, 0x0000a3c7, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x0000a3c6, 0x00000000,
+ /* ac */ 0x00000000, 0x0000a3c0, 0x0000a3c1, 0x0000a3c3,
+ /* b0 */ 0x0000a3c2, 0x0000a3cc, 0x0000a3cd, 0x0000a3ce,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x005d2 ***/
+
+ /* 80 */ 0x00000000, 0x0000a3a4, 0x0000a3a5, 0x0000a3a6,
+ /* 84 */ 0x0000a3a7, 0x0000a3a8, 0x0000a3a9, 0x0000a3aa,
+ /* 88 */ 0x0000a3ab, 0x0000a3b2, 0x0000a3b1, 0x0000a3b0,
+ /* 8c */ 0x0000a3af, 0x0000a3ae, 0x0000a3ad, 0x0000a3ac,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000a3b8, 0x0000a3bb, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000a1fc, 0x0000a1fb, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x0000a1f5, 0x0000a1f4,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x0000a1fe, 0x0000a1fd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x00610 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x0000a1fa, 0x0000a1f9,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1f2,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000a1f6, 0x0000a1f3,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x0000a3c8, 0x0000a3c9,
+ /* a4 */ 0x0000a3cb, 0x0000a3ca, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x0064b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x0000a1f8, 0x0000a1f7, 0x00000000,
+ /* 88 */ 0x00000000, 0x0000a2d4, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x0068b ***/
+
+ /* 80 */ 0x0000a2d1, 0x0000a2d3, 0x0000a2d2, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x006cb ***/
+
+ /* 80 */ 0x0000a1a1, 0x0000a1a3, 0x0000a1a4, 0x0000a1f1,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x0000a1d2, 0x0000a1d3, 0x0000a1ce, 0x0000a1cf,
+ /* 8c */ 0x0000a1d6, 0x0000a1d7, 0x0000a1da, 0x0000a1db,
+ /* 90 */ 0x0000a1ca, 0x0000a1cb, 0x0000a2e5, 0x00000000,
+ /* 94 */ 0x0000a1c6, 0x0000a1c7, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x0000a1e8, 0x0000a1e9, 0x00000000,
+ /* a0 */ 0x00000000, 0x0000a4b5, 0x0000a4b6, 0x0000a4b7,
+ /* a4 */ 0x0000a4b8, 0x0000a4b9, 0x0000a4ba, 0x0000a4bb,
+ /* a8 */ 0x0000a4bc, 0x0000a4bd,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e383xx - offset 0x006f5 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a1a6,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x00731 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x0000a5c7, 0x0000a5c8, 0x0000a5c9,
+ /* 88 */ 0x0000a5ca, 0x0000a5cb, 0x0000a5cc, 0x0000a5cd,
+ /* 8c */ 0x0000a5ce, 0x0000a5cf, 0x0000a5d0, 0x0000a5d1,
+ /* 90 */ 0x0000a5d2, 0x0000a5d3, 0x0000a5d4, 0x0000a5d5,
+ /* 94 */ 0x0000a5d6, 0x0000a5d7, 0x0000a5d8, 0x0000a5d9,
+ /* 98 */ 0x0000a5da, 0x0000a5db, 0x0000a5dc, 0x0000a5dd,
+ /* 9c */ 0x0000a5de, 0x0000a5df, 0x0000a5e0, 0x0000a5e1,
+ /* a0 */ 0x0000a5e2, 0x0000a5e3, 0x0000a5e4, 0x0000a5e5,
+ /* a4 */ 0x0000a5e6, 0x0000a5e7, 0x0000a5e8, 0x0000a5e9,
+ /* a8 */ 0x0000a5ea, 0x0000a5eb,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x0075b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x0000a2a1,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x0078d ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000a2f5, 0x0000a2f6,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000a2f0, 0x0000a2f1, 0x0000a2f2, 0x00000000,
+ /* a0 */ 0x00000000, 0x0000a2f4, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x007c9 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x0000a2f7, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000a2f3, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000a2cc, 0x0000a2cb, 0x00000000,
+ /* 94 */ 0x00000000, 0x0000a2ef, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00809 ***/
+
+ /* 80 */ 0x0000c4a1, 0x0000c4a3, 0x00000000, 0x0000c4a4,
+ /* 84 */ 0x8eaea1a6, 0x8eaea1a5, 0x00000000, 0x8ea2a1a6,
+ /* 88 */ 0x0000c4b7, 0x0000c4b5, 0x0000c4b8, 0x0000c4b6,
+ /* 8c */ 0x8ea2a1a7, 0x0000c4e2, 0x8ea2a1af, 0x8ea2a1ad,
+ /* 90 */ 0x0000c4e1, 0x0000c4e0, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000c5e2, 0x0000c5e1, 0x0000c5e0, 0x00000000,
+ /* 98 */ 0x0000c5e3, 0x0000c5df, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x0000c7a2, 0x0000c7a3,
+ /* a0 */ 0x8eaea2e2, 0x8eaea2e1, 0x8eaea2e3, 0x00000000,
+ /* a4 */ 0x8eaea4bf, 0x00000000, 0x0000cbe4, 0x00000000,
+ /* a8 */ 0x8eaea1a1, 0x00000000, 0x8eaea1ac, 0x0000c4b9,
+ /* ac */ 0x00000000, 0x0000c4e3, 0x8ea2a1b0, 0x00000000,
+ /* b0 */ 0x0000c4e4, 0x8ea2a1c3, 0x0000c8eb, 0x8ea2a5b1,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaea1a2, 0x00000000,
+ /* b8 */ 0x0000c4ba, 0x0000c4e5, 0x00000000, 0x0000c5e4,
+ /* bc */ 0x8ea2a1c4, 0x8eaea7c0, 0x00000000, 0x8eaea1a3,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00849 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8ea2a1a1, 0x0000c4a5,
+ /* 84 */ 0x00000000, 0x0000c4bc, 0x8eaea1b0, 0x8ea2a1a8,
+ /* 88 */ 0x0000c4bd, 0x8eaea1ae, 0x00000000, 0x0000c4e6,
+ /* 8c */ 0x00000000, 0x0000c5e5, 0x0000c5e7, 0x0000c5e6,
+ /* 90 */ 0x00000000, 0x00000000, 0x0000c7a4, 0x0000c7a5,
+ /* 94 */ 0x8eaea3c5, 0x00000000, 0x0000cbe5, 0x8eaeaba2,
+ /* 98 */ 0x0000d3fd, 0x0000c4a2, 0x00000000, 0x00000000,
+ /* 9c */ 0x8ea2a1a2, 0x0000c4a6, 0x0000c4bf, 0x0000c4be,
+ /* a0 */ 0x00000000, 0x00000000, 0x8eaea1c6, 0x8eaea1c5,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x8eaea2e4, 0x0000c7a6, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x8eaea4c0, 0x00000000, 0x0000cbe6,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaeaba3, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x0000d8f1, 0x8ea2b3ce,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00889 ***/
+
+ /* 80 */ 0x8eaeb9ec, 0x8eaeb9ee, 0x0000e3aa, 0x8ea2c1d6,
+ /* 84 */ 0x8ea2c1d7, 0x8eaea1a4, 0x0000c4a7, 0x8eaea1ad,
+ /* 88 */ 0x0000c4e8, 0x8eaea2e5, 0x00000000, 0x0000cbe7,
+ /* 8c */ 0x0000c4a8, 0x8ea2a1a9, 0x0000c4c0, 0x8eaea1b1,
+ /* 90 */ 0x00000000, 0x0000c4e9, 0x0000c4eb, 0x8ea2a1b1,
+ /* 94 */ 0x0000c4ec, 0x0000c4ea, 0x00000000, 0x8eaea1ec,
+ /* 98 */ 0x8eaea2e6, 0x0000c7a7, 0x00000000, 0x0000cbe8,
+ /* 9c */ 0x8eaea4c2, 0x8eaea7c2, 0x0000cbe9, 0x0000cfe7,
+ /* a0 */ 0x00000000, 0x0000c4c1, 0x0000c4ed, 0x8eaea1c7,
+ /* a4 */ 0x0000c7a8, 0x0000c7aa, 0x0000c7a9, 0x00000000,
+ /* a8 */ 0x0000c8ec, 0x00000000, 0x00000000, 0x0000cbea,
+ /* ac */ 0x0000cbeb, 0x0000cfe8, 0x0000cfe9, 0x8eaeaba6,
+ /* b0 */ 0x8eaeaba5, 0x8eaeaba7, 0x8eaeaba4, 0x0000d3fe,
+ /* b4 */ 0x00000000, 0x00000000, 0x8ea2c1d8, 0x8eaec0b3,
+ /* b8 */ 0x00000000, 0x8ea2edc4, 0x0000c4a9, 0x00000000,
+ /* bc */ 0x8eaea1b2, 0x00000000, 0x8eaea1b3, 0x00000000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x008c9 ***/
+
+ /* 80 */ 0x0000c4ef, 0x0000c4ee, 0x8ea2a1b2, 0x0000c4f0,
+ /* 84 */ 0x0000c4f6, 0x8eaea1c9, 0x0000c4f1, 0x0000c4f2,
+ /* 88 */ 0x8ea2a1b4, 0x8ea2a1b3, 0x0000c4f4, 0x0000c4f5,
+ /* 8c */ 0x8eaea1cc, 0x0000c4f3, 0x8eaea1cb, 0x8eaea1ca,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000c5ea, 0x0000c5eb, 0x0000c5ec, 0x0000c5ed,
+ /* 98 */ 0x0000c5e9, 0x0000c5f0, 0x8ea2a1ca, 0x00000000,
+ /* 9c */ 0x8ea2a1c6, 0x8ea2a1c9, 0x0000c5f1, 0x0000c6a3,
+ /* a0 */ 0x8eaea1ed, 0x8ea2a1c8, 0x00000000, 0x0000c5ee,
+ /* a4 */ 0x0000c5ef, 0x0000c5e8, 0x8eaea1f2, 0x8eaea1f0,
+ /* a8 */ 0x8ea2a1c5, 0x8ea2a1c7, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaea2ef, 0x8eaea2e8,
+ /* b0 */ 0x0000c7b7, 0x8ea2a1ef, 0x0000c7b4, 0x0000c7b8,
+ /* b4 */ 0x8ea2a1f9, 0x8ea2a1ed, 0x0000c7b5, 0x8ea2a1f1,
+ /* b8 */ 0x8eaea2eb, 0x8eaea2e7, 0x8eaea2f6, 0x0000c7b6,
+ /* bc */ 0x8eaea2ee, 0x0000c7b9, 0x00000000, 0x0000c7ab,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00909 ***/
+
+ /* 80 */ 0x8ea2a1f0, 0x0000c7ba, 0x8ea2a1f4, 0x8eaea2ed,
+ /* 84 */ 0x8ea2a1f8, 0x8ea2a1f5, 0x8eaea2ec, 0x8eaea2f4,
+ /* 88 */ 0x8ea2a1f2, 0x0000c7ac, 0x0000c7ae, 0x0000c7bb,
+ /* 8c */ 0x00000000, 0x0000c7b0, 0x8ea2a1ea, 0x0000c7b3,
+ /* 90 */ 0x0000c7b1, 0x0000c7b2, 0x8ea2a1fa, 0x8ea2a1f7,
+ /* 94 */ 0x8ea2a1ee, 0x0000c7af, 0x8eaea2f0, 0x8eaea2f7,
+ /* 98 */ 0x8ea2a1eb, 0x0000c7ad, 0x8eaea2f5, 0x00000000,
+ /* 9c */ 0x8eaea2f3, 0x8ea2a1f3, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x8ea2a1f6, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x8eaea2f2, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2a1ec, 0x8ea2a3a8, 0x00000000, 0x0000c9a4,
+ /* b0 */ 0x0000c8f5, 0x8eaea4d0, 0x8eaea4c8, 0x8ea2a3a9,
+ /* b4 */ 0x0000c8f2, 0x8eaea4cf, 0x0000c9a6, 0x8eaea4c6,
+ /* b8 */ 0x0000c8fa, 0x8eaea4c5, 0x0000c8f9, 0x8ea2a2fb,
+ /* bc */ 0x0000c8fd, 0x0000c8f8, 0x8ea2a3a2, 0x8ea2a3aa,
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00949 ***/
+
+ /* 80 */ 0x8eaea4ce, 0x8ea2a3a6, 0x8eaea4c9, 0x0000c8fb,
+ /* 84 */ 0x8eaea4cb, 0x8eaea4c3, 0x0000c8fe, 0x0000c8ef,
+ /* 88 */ 0x0000c9a9, 0x8ea2a2fd, 0x8eaea4c4, 0x8eaea4cc,
+ /* 8c */ 0x8ea2a5bd, 0x0000c8ed, 0x0000c9a5, 0x0000c8ee,
+ /* 90 */ 0x0000c8f6, 0x0000c8f7, 0x8ea2a3a4, 0x8ea2a2fe,
+ /* 94 */ 0x0000c8fc, 0x0000c8f4, 0x8ea2a2fa, 0x0000c8f0,
+ /* 98 */ 0x8ea2a3a7, 0x0000c9a7, 0x0000c9aa, 0x0000c8f3,
+ /* 9c */ 0x0000c9a2, 0x0000c9a8, 0x0000c8f1, 0x8ea2a3a5,
+ /* a0 */ 0x0000c9a3, 0x8ea2a3ab, 0x8ea2a2fc, 0x0000c9a1,
+ /* a4 */ 0x8ea2a3a1, 0x00000000, 0x8eaee4c8, 0x8ea2a3a3,
+ /* a8 */ 0x8eaee4c9, 0x0000cbf9, 0x8ea2a5bf, 0x8ea2a5cb,
+ /* ac */ 0x0000cbf1, 0x8eaea7c7, 0x8ea2a5cc, 0x0000cbec,
+ /* b0 */ 0x0000cbf6, 0x00000000, 0x8eaea7cf, 0x0000cbef,
+ /* b4 */ 0x8ea2a5b9, 0x0000cbf7, 0x8ea2a5b8, 0x8ea2a5bc,
+ /* b8 */ 0x8ea2a5c3, 0x8ea2a5c1, 0x0000cca1, 0x0000cbfa,
+ /* bc */ 0x8ea2a5b3, 0x8ea2a5b5, 0x0000cbfc, 0x0000cbf0,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00989 ***/
+
+ /* 80 */ 0x8ea2a5b6, 0x8ea2a5c2, 0x8ea2a5c9, 0x0000cbf5,
+ /* 84 */ 0x8ea2a5bb, 0x8ea2a5b4, 0x0000cbf4, 0x8ea2a5b7,
+ /* 88 */ 0x0000cbf8, 0x8ea2a5ba, 0x8eaea7c4, 0x0000cbf3,
+ /* 8c */ 0x8eaea7d1, 0x0000cbee, 0x8eaea7c8, 0x0000cbfd,
+ /* 90 */ 0x8ea2a5c4, 0x0000cbfe, 0x8ea2a5c8, 0x8eaea7c3,
+ /* 94 */ 0x8ea2a5c6, 0x8ea2a5ca, 0x0000cbfb, 0x8ea2a5be,
+ /* 98 */ 0x8ea2a5b2, 0x00000000, 0x8ea2a5c0, 0x0000cbf2,
+ /* 9c */ 0x8ea2a5c5, 0x0000cbed, 0x8ea2a5c7, 0x8eaea7cc,
+ /* a0 */ 0x8eaea7c9, 0x8eaea7cb, 0x8eaea7ca, 0x8eaea7cd,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x0000cff8, 0x0000cfec,
+ /* b0 */ 0x8eaeabad, 0x8eaeabae, 0x8ea2a9a2, 0x8ea2a9aa,
+ /* b4 */ 0x8eaeabb6, 0x0000cfeb, 0x0000cff3, 0x0000d0a1,
+ /* b8 */ 0x8eaeabac, 0x8ea2a9b0, 0x8ea2a9ae, 0x8ea2a9a9,
+ /* bc */ 0x00000000, 0x8eaee2e3, 0x8eaeabab, 0x0000cfed,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x009c9 ***/
+
+ /* 80 */ 0x8ea2a9af, 0x8ea2a9a5, 0x0000cffb, 0x0000cff2,
+ /* 84 */ 0x0000cffa, 0x8ea2a8fe, 0x8eaeabb2, 0x8ea2a9ac,
+ /* 88 */ 0x8eaeabaf, 0x8ea2a9a3, 0x0000cff6, 0x8ea2a9a4,
+ /* 8c */ 0x8eaeabb3, 0x8ea2a8fd, 0x0000cffd, 0x0000cff0,
+ /* 90 */ 0x0000cff9, 0x0000cfef, 0x8eaeaba8, 0x8ea2a9a1,
+ /* 94 */ 0x8ea2a9a6, 0x8eaeaba9, 0x8ea2a9ad, 0x0000cff7,
+ /* 98 */ 0x0000cff4, 0x8ea2a9a8, 0x0000cffc, 0x8ea2a9ab,
+ /* 9c */ 0x8ea2a9a7, 0x0000cff1, 0x0000cffe, 0x0000cff5,
+ /* a0 */ 0x0000cfee, 0x0000cfea, 0x00000000, 0x8eaeabb5,
+ /* a4 */ 0x00000000, 0x8eaeabb4, 0x00000000, 0x8eaee4ca,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2a9b1, 0x00000000, 0x0000d4ba, 0x0000d4a4,
+ /* b0 */ 0x8eaeafc8, 0x0000d4b4, 0x8eaeafcd, 0x0000d4b9,
+ /* b4 */ 0x8ea2adf1, 0x8ea2adf0, 0x8ea2adf5, 0x8ea2adf6,
+ /* b8 */ 0x0000d4a7, 0x8eaeafc4, 0x0000d4b0, 0x8eaeafd8,
+ /* bc */ 0x8eaeafcc, 0x8eaeafd6, 0x0000d4bd, 0x8eaeafc6,
+
+ /*** Three byte table, leaf: e580xx - offset 0x00a09 ***/
+
+ /* 80 */ 0x0000d4b1, 0x00000000, 0x8eaeafcb, 0x8eaeafc9,
+ /* 84 */ 0x8eaeafc7, 0x8ea2adea, 0x0000d4aa, 0x8ea2adeb,
+ /* 88 */ 0x8eaeafcf, 0x0000d4bf, 0x00000000, 0x0000d4b6,
+ /* 8c */ 0x0000d4a1, 0x0000d4a2, 0x8ea2adfe, 0x0000d9a4,
+ /* 90 */ 0x8eaeafd3, 0x0000d4af, 0x0000d4ae, 0x8ea2adec,
+ /* 94 */ 0x0000d4b2, 0x8ea2b3de, 0x0000d4a9, 0x8ea2adf7,
+ /* 98 */ 0x0000d4b8, 0x0000d4b7, 0x0000d4ad, 0x8ea2adef,
+ /* 9c */ 0x8ea2adf8, 0x8eaeafc5, 0x8ea2ade9, 0x0000d4ac,
+ /* a0 */ 0x8ea2adf9, 0x0000d4b5, 0x8ea2aded, 0x0000d4a3,
+ /* a4 */ 0x8eaeafce, 0x0000d4a6, 0x0000d4a5, 0x8ea2adfa,
+ /* a8 */ 0x0000d4b3, 0x0000d4a8, 0x0000d4bc, 0x0000d4be,
+ /* ac */ 0x8ea2adf4, 0x0000d4bb, 0x8eaeafd1, 0x8ea2adfc,
+ /* b0 */ 0x8ea2adee, 0x8ea2adfd, 0x8eaeafc3, 0x8ea2adf2,
+ /* b4 */ 0x00000000, 0x8ea2adfb, 0x8eaeafd0, 0x8ea2adf3,
+ /* b8 */ 0x8eaeafd4, 0x8eaeafd5, 0x00000000, 0x00000000,
+ /* bc */ 0x0000d4ab, 0x00000000, 0x00000000, 0x8eaee4cb,
+
+ /*** Three byte table, leaf: e581xx - offset 0x00a49 ***/
+
+ /* 80 */ 0x8ea2b3e6, 0x8ea2b3da, 0x8eaeb4bc, 0x0000d8f6,
+ /* 84 */ 0x8eaeb4bf, 0x8ea2b3df, 0x8ea2b3e5, 0x0000d8f5,
+ /* 88 */ 0x8ea2b3d8, 0x0000d8f9, 0x8ea2b3dc, 0x8ea2b3d5,
+ /* 8c */ 0x0000d8f7, 0x8ea2b3d9, 0x0000d8fc, 0x0000d9a3,
+ /* 90 */ 0x8eaeb4c4, 0x8ea2b3ea, 0x8eaeb4c1, 0x8ea2b3d4,
+ /* 94 */ 0x8eaeb4c2, 0x0000d8fd, 0x8eaeafd7, 0x8ea2b3e9,
+ /* 98 */ 0x8eaeb4c7, 0x8eaeb4bd, 0x0000d8f8, 0x8ea2b3db,
+ /* 9c */ 0x0000d8f4, 0x8ea2b3d6, 0x8ea2b3d2, 0x8ea2b3e0,
+ /* a0 */ 0x8ea2b3d3, 0x8ea2b3d1, 0x8ea2b3dd, 0x8ea2b3e3,
+ /* a4 */ 0x8ea2b3e4, 0x0000d8fa, 0x8eaeb4c0, 0x00000000,
+ /* a8 */ 0x8ea2babf, 0x8ea2b3e1, 0x8ea2b3d0, 0x8ea2b3e2,
+ /* ac */ 0x8eaeb4cb, 0x0000d9a6, 0x8ea2b3e7, 0x0000d9a5,
+ /* b0 */ 0x8ea2b3cf, 0x8eaeb4c3, 0x8ea2b3d7, 0x8ea2b3e8,
+ /* b4 */ 0x0000d9a1, 0x0000d8fe, 0x0000d8fb, 0x0000d9a2,
+ /* b8 */ 0x8eaeb4cc, 0x8eaeb4ca, 0x0000d8f2, 0x8eaeb4c5,
+ /* bc */ 0x8eaeb4c6, 0x0000d8f3, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00a89 ***/
+
+ /* 80 */ 0x0000deae, 0x8eaeb9f5, 0x8ea2bac2, 0x8ea2babb,
+ /* 84 */ 0x00000000, 0x0000deab, 0x00000000, 0x8ea2bac3,
+ /* 88 */ 0x8eaeb9f1, 0x8eaeb9f2, 0x00000000, 0x8ea2bab9,
+ /* 8c */ 0x8ea2babc, 0x0000deaa, 0x8ea2babd, 0x8eaeb9ef,
+ /* 90 */ 0x00000000, 0x0000dead, 0x8ea2bac1, 0x00000000,
+ /* 94 */ 0x8ea2bab7, 0x8ea2bab6, 0x0000deaf, 0x8eaeb9f0,
+ /* 98 */ 0x0000deb0, 0x0000deac, 0x0000deb1, 0x8ea2bab5,
+ /* 9c */ 0x8ea2bac0, 0x8ea2babe, 0x8ea2bab8, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x0000dea9, 0x8ea2baba,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaee4cd, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x8eaec0b9, 0x8eaec0bc,
+ /* ac */ 0x0000e3b1, 0x0000e3ab, 0x8ea2c1dc, 0x0000e3b4,
+ /* b0 */ 0x8ea2c1e2, 0x8ea2c1e5, 0x0000e3ad, 0x0000e3ae,
+ /* b4 */ 0x8ea2c1df, 0x0000e3ac, 0x8ea2c1e8, 0x0000e3b2,
+ /* b8 */ 0x8ea2c1e9, 0x8eaec0ba, 0x8ea2c1e4, 0x0000e3b3,
+ /* bc */ 0x8eaec0b7, 0x8ea2c1d9, 0x0000e3b0, 0x8ea2c1da,
+
+ /*** Three byte table, leaf: e583xx - offset 0x00ac9 ***/
+
+ /* 80 */ 0x00000000, 0x8ea2c1e3, 0x8ea2c1e1, 0x8eaec0bd,
+ /* 84 */ 0x8ea2c1dd, 0x0000e3af, 0x8ea2c1db, 0x0000e3b5,
+ /* 88 */ 0x8ea2c1e0, 0x8ea2c1e7, 0x8ea2c1de, 0x8ea2c1e6,
+ /* 8c */ 0x8eaec0b6, 0x8eaec0be, 0x0000e7fc, 0x0000e7f9,
+ /* 90 */ 0x8eaec5eb, 0x0000e7fa, 0x8eaee3cc, 0x8ea2c9a1,
+ /* 94 */ 0x8ea2c8f7, 0x0000e7f8, 0x0000e7f5, 0x8ea2c8f8,
+ /* 98 */ 0x8eaec5ee, 0x8eaec5ec, 0x0000e7f7, 0x8ea2c8fb,
+ /* 9c */ 0x8eaec5ed, 0x8ea2c8fd, 0x8eaec5f6, 0x8eaee3cd,
+ /* a0 */ 0x8ea2c9a6, 0x8eaec5f0, 0x8eaec5f5, 0x8ea2c9a5,
+ /* a4 */ 0x8ea2c8fe, 0x0000e7f4, 0x8ea2c8f6, 0x0000e7f2,
+ /* a8 */ 0x8ea2c8f9, 0x0000e7fd, 0x8ea2c8fc, 0x8eaec5f1,
+ /* ac */ 0x8ea2c9a2, 0x0000e7f6, 0x0000e7f3, 0x8ea2c9a4,
+ /* b0 */ 0x8ea2c9a3, 0x0000e7fb, 0x00000000, 0x8ea2c8fa,
+ /* b4 */ 0x8eaec5f4, 0x0000eca3, 0x8ea2cfd4, 0x8eaecba9,
+ /* b8 */ 0x8ea2cfd1, 0x0000eca4, 0x00000000, 0x0000eca2,
+ /* bc */ 0x8eaecbab, 0x8ea2cfd8, 0x8ea2cfd5, 0x8ea2cfce,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00b09 ***/
+
+ /* 80 */ 0x0000eca1, 0x8eaecbad, 0x0000eca5, 0x8ea2cfcf,
+ /* 84 */ 0x0000ebfe, 0x0000eca8, 0x8ea2cfd2, 0x8ea2cfd3,
+ /* 88 */ 0x0000eca6, 0x0000eca7, 0x8ea2cfd9, 0x8ea2cfd6,
+ /* 8c */ 0x8ea2cfd7, 0x8eaecbac, 0x8eaecba7, 0x8eaee4ce,
+ /* 90 */ 0x0000f0b3, 0x8ea2d6c3, 0x0000f0b0, 0x8ea2d6c0,
+ /* 94 */ 0x0000f0b2, 0x0000f0b4, 0x8eaed0b1, 0x8ea2d6c1,
+ /* 98 */ 0x0000f0b1, 0x00000000, 0x8ea2d6c2, 0x8eaed0b5,
+ /* 9c */ 0x8ea2d6bf, 0x8eaed0b0, 0x8eaed0b4, 0x0000f3c1,
+ /* a0 */ 0x8ea2dcc9, 0x0000f3c2, 0x8ea2dcc7, 0x00000000,
+ /* a4 */ 0x8ea2dcc8, 0x8ea2dcc6, 0x8ea2dcc5, 0x8eaed4c1,
+ /* a8 */ 0x8eaed4c0, 0x8ea2dcca, 0x0000f3c0, 0x8eaed0b3,
+ /* ac */ 0x00000000, 0x8ea2e1c4, 0x8ea2e1c5, 0x8eaed7d2,
+ /* b0 */ 0x8ea2cfd0, 0x8ea2e1c3, 0x0000f3c3, 0x0000f8ab,
+ /* b4 */ 0x8ea2e5b7, 0x8ea2e5b8, 0x8eaedcb2, 0x0000fae2,
+ /* b8 */ 0x0000fae3, 0x8ea2ebcf, 0x8ea2ebce, 0x0000fbd8,
+ /* bc */ 0x0000fbd7, 0x8ea2eefd, 0x8eaee0ef, 0x0000c4aa,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00b49 ***/
+
+ /* 80 */ 0x0000c4c2, 0x0000c4f8, 0x00000000, 0x0000c4f7,
+ /* 84 */ 0x0000c5f3, 0x0000c5f2, 0x0000c7be, 0x0000c7bd,
+ /* 88 */ 0x0000c7bf, 0x0000c7bc, 0x8eaea2f8, 0x0000c9ac,
+ /* 8c */ 0x0000c9ab, 0x0000c9ad, 0x8eaea4d4, 0x00000000,
+ /* 90 */ 0x8eaea4d3, 0x8eaea4d1, 0x0000cca3, 0x00000000,
+ /* 94 */ 0x0000cca2, 0x0000cca4, 0x8eaea7d2, 0x0000d0a2,
+ /* 98 */ 0x00000000, 0x0000a2f9, 0x8ea2aea1, 0x0000a2fa,
+ /* 9c */ 0x0000d9a7, 0x0000a2fc, 0x0000a2fb, 0x8ea2bac4,
+ /* a0 */ 0x8eaeb9f6, 0x0000a2fd, 0x0000e7fe, 0x0000a2fe,
+ /* a4 */ 0x8eaedea5, 0x0000c4ab, 0x8eaea1b4, 0x0000c4f9,
+ /* a8 */ 0x0000c7c0, 0x0000cca5, 0x8eaeabb7, 0x0000c4ac,
+ /* ac */ 0x0000c4fc, 0x0000c4fa, 0x0000c4fb, 0x00000000,
+ /* b0 */ 0x00000000, 0x0000c7c1, 0x8eaea2fa, 0x00000000,
+ /* b4 */ 0x00000000, 0x0000c9ae, 0x0000cca7, 0x0000cca6,
+ /* b8 */ 0x0000cca8, 0x8eaeaefb, 0x00000000, 0x00000000,
+ /* bc */ 0x0000d4c0, 0x00000000, 0x8eaec0bf, 0x8eaee4d3,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00b89 ***/
+
+ /* 80 */ 0x0000f0b5, 0x00000000, 0x8eaea1a7, 0x00000000,
+ /* 84 */ 0x8eaea1cd, 0x8eaea1c8, 0x8eaea1ce, 0x8ea2a1ae,
+ /* 88 */ 0x00000000, 0x0000c5f4, 0x0000c5f5, 0x8eaea1f8,
+ /* 8c */ 0x8eaea1f9, 0x0000c7c2, 0x00000000, 0x8ea2a3ac,
+ /* 90 */ 0x8eaea7d5, 0x0000d0a4, 0x0000d0a3, 0x8ea2aea3,
+ /* 94 */ 0x8ea2aea2, 0x0000d9a8, 0x8eaea1a8, 0x0000c4fd,
+ /* 98 */ 0x8ea2a1b5, 0x8eaea1fa, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x8eaea4d7, 0x8ea2a5cd, 0x8eaeabb9,
+ /* a0 */ 0x0000d0a5, 0x8eaeafdb, 0x0000d4c3, 0x8eaeafd9,
+ /* a4 */ 0x0000d4c1, 0x0000d4c2, 0x8eaeafda, 0x00000000,
+ /* a8 */ 0x8eaeb4cd, 0x00000000, 0x0000f0b6, 0x00000000,
+ /* ac */ 0x0000c5f6, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000c7c3, 0x8ea2a1fb, 0x8eaea2fe, 0x8eaea2fd,
+ /* b4 */ 0x8eaea2fc, 0x8eaea4d9, 0x0000c9af, 0x0000c9b0,
+ /* b8 */ 0x8eaea4da, 0x8ea2a3ad, 0x00000000, 0x00000000,
+ /* bc */ 0x8ea2a5ce, 0x0000cca9, 0x8ea2a5cf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x00bc8 ***/
+
+ /* 80 */ 0x00000000, 0x8eaeabbb, 0x8eaeabbd, 0x8eaeabbe,
+ /* 84 */ 0x8ea2aea5, 0x8ea2aea6, 0x0000d4c6, 0x8eaeafde,
+ /* 88 */ 0x8ea2aea7, 0x8eaeafdf, 0x8ea2aea4, 0x0000d4c7,
+ /* 8c */ 0x0000d4c5, 0x0000d4c4, 0x8ea2aea8, 0x8eaeb4cf,
+ /* 90 */ 0x8ea2b3eb, 0x8eaeb4ce, 0x8eaeb9fd, 0x8eaeb9fa,
+ /* 94 */ 0x8ea2bac5, 0x00000000, 0x8eaeb9fe, 0x8ea2c1ea,
+ /* 98 */ 0x8ea2c9a7, 0x8eaecbaf, 0x8eaecbae, 0x8eaecbb0,
+ /* 9c */ 0x0000eca9, 0x0000f0b7, 0x8ea2d6c4, 0x8eaed4c2,
+ /* a0 */ 0x0000c4ad, 0x0000c4bb, 0x8eaea1af, 0x8eaea1b5,
+ /* a4 */ 0x8eaea1d1, 0x8eaea1fb, 0x00000000, 0x00000000,
+ /* a8 */ 0x8eaea3a2, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaea4db, 0x8eaea7d9, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000d9a9, 0x0000deb3, 0x00000000, 0x0000e8a1,
+ /* b4 */ 0x8eaec5fa, 0x8ea2a1a3, 0x0000c4fe, 0x00000000,
+ /* b8 */ 0x0000c5f9, 0x0000c5f7, 0x0000c5f8, 0x00000000,
+ /* bc */ 0x00000000, 0x0000ccaa, 0x8eaea7da, 0x00000000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00c08 ***/
+
+ /* 80 */ 0x0000c4ae, 0x0000c4af, 0x00000000, 0x0000c4c3,
+ /* 84 */ 0x8eaea1b6, 0x8eaea1d2, 0x0000c5a1, 0x0000c5a2,
+ /* 88 */ 0x0000c5a3, 0x8ea2a1cc, 0x0000c5fa, 0x8eaea1fd,
+ /* 8c */ 0x8ea2a1cb, 0x00000000, 0x0000c7c7, 0x8eaea3a5,
+ /* 90 */ 0x8ea2a1fd, 0x0000c7c5, 0x0000c7c6, 0x8ea2a1fc,
+ /* 94 */ 0x8eaea3a4, 0x8eaea3a6, 0x0000c7c8, 0x0000c7c4,
+ /* 98 */ 0x8eaea3a7, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x8ea2a3ae, 0x0000cfcf, 0x8ea2a3af, 0x8eaea4df,
+ /* a0 */ 0x8eaea4e1, 0x8ea2a3b0, 0x00000000, 0x8eaea4dc,
+ /* a4 */ 0x0000c9b2, 0x0000c9b1, 0x8eaea4de, 0x8eaea4dd,
+ /* a8 */ 0x0000c9b5, 0x0000c9b3, 0x0000c9b4, 0x8eaea4e0,
+ /* ac */ 0x00000000, 0x00000000, 0x0000ccb0, 0x8eaea7db,
+ /* b0 */ 0x0000ccaf, 0x8ea2a5d4, 0x8ea2a5d1, 0x8ea2a5d2,
+ /* b4 */ 0x8eaea7de, 0x8ea2a5d0, 0x0000ccb1, 0x0000ccad,
+ /* b8 */ 0x0000ccac, 0x8eaea7df, 0x0000ccae, 0x0000ccab,
+ /* bc */ 0x8eaea7dd, 0x00000000, 0x8eaee4cf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x00c47 ***/
+
+ /* 80 */ 0x00000000, 0x0000ccb2, 0x00000000, 0x0000d0a7,
+ /* 84 */ 0x8ea2a9b2, 0x8eaeabbf, 0x8ea2a5d3, 0x0000d0ac,
+ /* 88 */ 0x8eaeabc0, 0x8ea2a9b3, 0x0000d0a8, 0x0000d0ab,
+ /* 8c */ 0x0000d0aa, 0x0000d0a9, 0x0000d0a6, 0x8eaeabc3,
+ /* 90 */ 0x00000000, 0x00000000, 0x8ea2aeab, 0x8eaeafe8,
+ /* 94 */ 0x0000d4ca, 0x8ea2aeae, 0x0000d4c8, 0x8eaeafe5,
+ /* 98 */ 0x00000000, 0x8eaeafe2, 0x8ea2aeaa, 0x0000d4cb,
+ /* 9c */ 0x0000d4c9, 0x0000d4cc, 0x8ea2aeac, 0x8ea2aead,
+ /* a0 */ 0x8eaeafe0, 0x8ea2aea9, 0x8ea2aeaf, 0x8eaeafe6,
+ /* a4 */ 0x8eaeafe1, 0x8eaeafe3, 0x00000000, 0x8eaeafe4,
+ /* a8 */ 0x8eaeb4d0, 0x0000deb7, 0x0000d9aa, 0x8ea2b3ec,
+ /* ac */ 0x8ea2b3ee, 0x8ea2b3ed, 0x8ea2b3ef, 0x0000d9ab,
+ /* b0 */ 0x8eaebaa3, 0x00000000, 0x0000deb4, 0x8eaebaa1,
+ /* b4 */ 0x0000deb5, 0x0000deb6, 0x8eaeb4d1, 0x0000e3b7,
+ /* b8 */ 0x8ea2c1ec, 0x8eaec0c1, 0x8ea2c1eb, 0x8ea2c1ed,
+ /* bc */ 0x8ea2c1ee, 0x0000e3b8, 0x8eaec0c0, 0x0000e3b6,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00c87 ***/
+
+ /* 80 */ 0x8ea2c9a8, 0x8ea2c9a9, 0x0000e8a3, 0x0000e8a2,
+ /* 84 */ 0x8ea2cce1, 0x00000000, 0x8eaecbb1, 0x0000ecaa,
+ /* 88 */ 0x0000ecab, 0x0000ecac, 0x0000ecae, 0x8ea2cfda,
+ /* 8c */ 0x8ea2cfdb, 0x0000ecad, 0x8eaecbb2, 0x00000000,
+ /* 90 */ 0x8eaed0b6, 0x0000f0b8, 0x00000000, 0x0000f0b9,
+ /* 94 */ 0x8eaed0b7, 0x00000000, 0x8ea2e5b9, 0x8ea2ebd1,
+ /* 98 */ 0x8ea2ebd0, 0x8ea2eefe, 0x8eaee0ac, 0x0000c4b0,
+ /* 9c */ 0x8eaea1b7, 0x8eaea1d4, 0x8eaea1d3, 0x0000c5fc,
+ /* a0 */ 0x0000c5fb, 0x00000000, 0x00000000, 0x0000c7c9,
+ /* a4 */ 0x00000000, 0x00000000, 0x8ea2a1fe, 0x00000000,
+ /* a8 */ 0x8eaea3a8, 0x0000c9b7, 0x0000c9b8, 0x0000c9b6,
+ /* ac */ 0x0000c9b9, 0x8ea2a3b1, 0x8ea2a3b2, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaea4e3,
+ /* b4 */ 0x8eaea4e2, 0x8eaea7e1, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaea7e0, 0x00000000, 0x0000ccb4,
+ /* bc */ 0x8ea2a5d5, 0x8eaee2da, 0x0000ccb3, 0x8eaea7e2,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00cc7 ***/
+
+ /* 80 */ 0x8ea2a9b4, 0x0000d0b0, 0x8ea2a9b5, 0x0000d0af,
+ /* 84 */ 0x8eaeabc8, 0x8eaeabc6, 0x00000000, 0x0000d0ad,
+ /* 88 */ 0x00000000, 0x0000d0ae, 0x8eaeabc7, 0x00000000,
+ /* 8c */ 0x8eaeafef, 0x8ea2aeb0, 0x8eaeafec, 0x8eaeafea,
+ /* 90 */ 0x8eaeafed, 0x8eaeafee, 0x0000d9ac, 0x8ea2b3f1,
+ /* 94 */ 0x8eaeb4d2, 0x0000d9af, 0x8ea2b3f0, 0x0000dbab,
+ /* 98 */ 0x0000d9ae, 0x0000d9ad, 0x00000000, 0x0000deba,
+ /* 9c */ 0x00000000, 0x0000deb9, 0x0000deb8, 0x0000e3b9,
+ /* a0 */ 0x8eaec0c5, 0x8eaec0c4, 0x0000e3bc, 0x0000e3bd,
+ /* a4 */ 0x0000e3bb, 0x00000000, 0x0000e3ba, 0x8eaec0c6,
+ /* a8 */ 0x00000000, 0x8ea2c9aa, 0x8eaec6a1, 0x8ea2c9ab,
+ /* ac */ 0x00000000, 0x8eaec5fe, 0x8eaecbb3, 0x8ea2cfdd,
+ /* b0 */ 0x0000ecaf, 0x8ea2cfdc, 0x8eaecdac, 0x0000f0ba,
+ /* b4 */ 0x8ea2dccb, 0x0000f3c4, 0x00000000, 0x8ea2e5ba,
+ /* b8 */ 0x0000f9e1, 0x00000000, 0x0000c4c4, 0x0000c5a4,
+ /* bc */ 0x8ea2a1b6, 0x8eaea1d5, 0x0000c5a5, 0x0000c5a6,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00d07 ***/
+
+ /* 80 */ 0x8eaea1d6, 0x00000000, 0x00000000, 0x8eaea2a3,
+ /* 84 */ 0x8eaea2a2, 0x0000c5fd, 0x0000c5fe, 0x8eaea2a4,
+ /* 88 */ 0x0000c7ca, 0x8ea2a3b3, 0x8ea2a5d6, 0x8ea2a5d7,
+ /* 8c */ 0x00000000, 0x0000d0b1, 0x8ea2aeb1, 0x0000d9b1,
+ /* 90 */ 0x0000d9b0, 0x8ea2bac7, 0x8ea2bac6, 0x00000000,
+ /* 94 */ 0x8eaed0b8, 0x0000c4b1, 0x0000c5a7, 0x0000c6a1,
+ /* 98 */ 0x00000000, 0x0000d9b2, 0x8ea2a1a4, 0x00000000,
+ /* 9c */ 0x8ea2a1cd, 0x0000c6a2, 0x8eaea2a6, 0x8ea2a2a2,
+ /* a0 */ 0x0000c7cc, 0x0000c7cb, 0x8ea2a2a1, 0x0000c9ba,
+ /* a4 */ 0x8eaee4d0, 0x8eaea4e5, 0x00000000, 0x8eaeabc9,
+ /* a8 */ 0x00000000, 0x00000000, 0x0000d4cd, 0x00000000,
+ /* ac */ 0x00000000, 0x8ea2b3f2, 0x00000000, 0x0000e3be,
+ /* b0 */ 0x8ea2c9ac, 0x0000e8a4, 0x8eaec6a3, 0x8eaecbb4,
+ /* b4 */ 0x8ea2d6c5, 0x8eaed4c4, 0x8eaedcb4, 0x8ea2e8ea,
+ /* b8 */ 0x8eaea1a9, 0x0000c5a8, 0x8eaea1d7, 0x8eaea4e6,
+ /* bc */ 0x8ea2a5d8, 0x8ea2a9b6, 0x0000d9b5, 0x0000d9b3,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x00d47 ***/
+
+ /* 80 */ 0x0000d9b4, 0x0000c4b2, 0x00000000, 0x0000c4c5,
+ /* 84 */ 0x0000a4bf, 0x0000c5ab, 0x8eaea1d9, 0x0000c5aa,
+ /* 88 */ 0x0000c5a9, 0x0000c6a5, 0x0000c6a4, 0x8eaea3aa,
+ /* 8c */ 0x8ea2a1ce, 0x8ea2a2a3, 0x00000000, 0x8eaea3ab,
+ /* 90 */ 0x8eaea3ad, 0x0000ccb8, 0x0000ccb5, 0x0000ccb7,
+ /* 94 */ 0x0000ccb6, 0x8eaea7e3, 0x00000000, 0x0000d0b2,
+ /* 98 */ 0x8eaeabca, 0x00000000, 0x0000debb, 0x00000000,
+ /* 9c */ 0x0000c4b3, 0x8eaea1da, 0x0000c5ac, 0x8eaea2a7,
+ /* a0 */ 0x0000c6a7, 0x0000c6a6, 0x00000000, 0x8ea2a3b4,
+ /* a4 */ 0x00000000, 0x8eaee4d1, 0x0000ccb9, 0x8eaeaadc,
+ /* a8 */ 0x00000000, 0x8eaea1aa, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2a1b7, 0x8eaea2a8, 0x0000c6a9, 0x0000c6a8,
+ /* b0 */ 0x0000c7cd, 0x0000c7ce, 0x8ea2a3b5, 0x0000c9bb,
+ /* b4 */ 0x8eaea4e7, 0x0000c9bc, 0x8eaea7e5, 0x0000ccba,
+ /* b8 */ 0x0000ccbb, 0x0000ccbc, 0x8eaea7e6, 0x0000d0b3,
+ /* bc */ 0x8ea2a9b7, 0x8eaeabcb, 0x00000000, 0x0000d4ce,
+
+ /*** Three byte table, leaf: e58exx - offset 0x00d87 ***/
+
+ /* 80 */ 0x8eaec0c7, 0x00000000, 0x8ea2a1a5, 0x00000000,
+ /* 84 */ 0x0000c5ad, 0x00000000, 0x8eaea1db, 0x00000000,
+ /* 88 */ 0x00000000, 0x8eaea2a9, 0x8ea2a2a4, 0x8eaea3af,
+ /* 8c */ 0x00000000, 0x00000000, 0x8ea2a3b6, 0x8ea2a3b7,
+ /* 90 */ 0x00000000, 0x00000000, 0x8ea2a5d9, 0x8eaea7e7,
+ /* 94 */ 0x8ea2a5da, 0x00000000, 0x8ea2a9b9, 0x8ea2a9b8,
+ /* 98 */ 0x8ea2a9bb, 0x8ea2a9ba, 0x0000d0b4, 0x8eaee4d2,
+ /* 9c */ 0x8ea2b3f3, 0x0000d4d0, 0x8ea2aeb2, 0x0000d4cf,
+ /* a0 */ 0x8eaeb4d4, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x8ea2bac8, 0x0000debc, 0x8eaebaa8, 0x8ea2bac9,
+ /* a8 */ 0x8eaebaa7, 0x8eaec0ca, 0x8eaec0c9, 0x8eaec0c8,
+ /* ac */ 0x8ea2c9ad, 0x0000e8a5, 0x8eaec6a5, 0x00000000,
+ /* b0 */ 0x8eaec6a6, 0x8eaecbb5, 0x0000ecb0, 0x8eaed4c5,
+ /* b4 */ 0x8ea2e5bb, 0x00000000, 0x8eaea1ab, 0x8eaea1dc,
+ /* b8 */ 0x00000000, 0x8ea2a1b8, 0x8eaea2aa, 0x0000c6aa,
+ /* bc */ 0x00000000, 0x00000000, 0x8eaea3b1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x00dc6 ***/
+
+ /* 80 */ 0x00000000, 0x8eaea7e9, 0x8eaea7ea, 0x0000d9b6,
+ /* 84 */ 0x8eaeb4d5, 0x8eaebaa9, 0x00000000, 0x00000000,
+ /* 88 */ 0x0000c4b4, 0x0000c4c6, 0x0000c5af, 0x0000c5ae,
+ /* 8c */ 0x8eaea1de, 0x0000c5b0, 0x8eaea1e0, 0x00000000,
+ /* 90 */ 0x8eaea2ab, 0x00000000, 0x8eaea3b3, 0x00000000,
+ /* 94 */ 0x0000ccbe, 0x8eaea7eb, 0x0000ccbd, 0x0000ccbf,
+ /* 98 */ 0x00000000, 0x8eaeabd0, 0x8eaeabcf, 0x0000d0b5,
+ /* 9c */ 0x8eaeabce, 0x8eaeabcd, 0x00000000, 0x0000d4d1,
+ /* a0 */ 0x8eaec0cb, 0x8ea2d6c6, 0x0000f6bb, 0x0000c4c7,
+ /* a4 */ 0x0000c6ac, 0x0000c6bb, 0x0000c6b6, 0x00000000,
+ /* a8 */ 0x0000c6b1, 0x0000c6b0, 0x0000c6b7, 0x0000c6b5,
+ /* ac */ 0x0000c6ae, 0x0000c6bc, 0x0000c6af, 0x0000c6ab,
+ /* b0 */ 0x0000c6ba, 0x0000c6b9, 0x0000c6b8, 0x0000c6ad,
+ /* b4 */ 0x8eaea2b1, 0x0000c6b4, 0x8eaea2ad, 0x8eaea2ae,
+ /* b8 */ 0x0000c6b3, 0x8eaea2af, 0x00000000, 0x0000c6bd,
+ /* bc */ 0x0000c6b2, 0x00000000, 0x00000000, 0x8eaea3b5,
+
+ /*** Three byte table, leaf: e590xx - offset 0x00e06 ***/
+
+ /* 80 */ 0x8eaea3b7, 0x0000c7d4, 0x00000000, 0x0000c7da,
+ /* 84 */ 0x0000c7d6, 0x8eaea3b9, 0x0000c7dc, 0x8ea2a2a5,
+ /* 88 */ 0x0000c7d9, 0x0000c7cf, 0x0000c7d2, 0x0000c7d5,
+ /* 8c */ 0x0000c7d1, 0x0000c7d8, 0x0000c7db, 0x0000c7d0,
+ /* 90 */ 0x0000c7d3, 0x0000c7d7, 0x0000c7dd, 0x8eaea3ba,
+ /* 94 */ 0x00000000, 0x8eaea3bb, 0x8eaea3b4, 0x00000000,
+ /* 98 */ 0x8ea2a3c0, 0x8ea2a3bd, 0x8eaea4f6, 0x0000c9c9,
+ /* 9c */ 0x8ea2a3be, 0x0000c9bd, 0x0000c9bf, 0x0000c9d7,
+ /* a0 */ 0x0000c9d2, 0x8eaea4f9, 0x8eaea4fe, 0x8eaea4f5,
+ /* a4 */ 0x8ea2a3c5, 0x8ea2a3bf, 0x0000c9c1, 0x0000c9c3,
+ /* a8 */ 0x8ea2a3c4, 0x0000c9ca, 0x8ea2a3ba, 0x0000c9d6,
+ /* ac */ 0x0000c9d8, 0x0000c9be, 0x0000c9cf, 0x8eaea5a4,
+ /* b0 */ 0x8ea2a3b8, 0x0000c9d5, 0x8eaea4f7, 0x0000c9c6,
+ /* b4 */ 0x8eaea4fb, 0x0000c9d0, 0x0000c9d1, 0x8ea2a3b9,
+ /* b8 */ 0x0000c9ce, 0x0000c9cc, 0x8eaea4f0, 0x0000c9cd,
+ /* bc */ 0x0000c9d3, 0x8ea2a3c1, 0x0000c9c0, 0x8eaea5a1,
+
+ /*** Three byte table, leaf: e591xx - offset 0x00e46 ***/
+
+ /* 80 */ 0x0000c9d4, 0x8ea2a3c3, 0x0000c9c8, 0x0000c9c5,
+ /* 84 */ 0x8eaea4f3, 0x8ea2a3bc, 0x0000c9c4, 0x8ea2a3c6,
+ /* 88 */ 0x0000c9c7, 0x8eaea4fc, 0x0000c9cb, 0x8eaea4f8,
+ /* 8c */ 0x8eaea4f4, 0x8eaea4ed, 0x0000c9c2, 0x8ea2a3c2,
+ /* 90 */ 0x8eaea4fd, 0x8eaea5a2, 0x00000000, 0x00000000,
+ /* 94 */ 0x8ea2a3bb, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x8eaea5a3, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x8eaea7ee,
+ /* a0 */ 0x8ea2a5eb, 0x8ea2a5ea, 0x0000ccd1, 0x8ea2a5ed,
+ /* a4 */ 0x8ea2a5ef, 0x8ea2a5e4, 0x8ea2a5e7, 0x8ea2a5ee,
+ /* a8 */ 0x0000ccd2, 0x8eaea7f4, 0x8eaea7f8, 0x8ea2a5e1,
+ /* ac */ 0x8ea2a5e5, 0x8eaea7f5, 0x00000000, 0x8ea2a5e9,
+ /* b0 */ 0x8ea2a9ca, 0x0000cccd, 0x8ea2a9ce, 0x0000ccc0,
+ /* b4 */ 0x8ea2a5e6, 0x0000ccc1, 0x0000ccce, 0x0000ccc7,
+ /* b8 */ 0x0000ccc3, 0x8eaea7f1, 0x8ea2a5e2, 0x0000ccc6,
+ /* bc */ 0x0000cccb, 0x0000ccd4, 0x8ea2a5e3, 0x8ea2a5dc,
+
+ /*** Three byte table, leaf: e592xx - offset 0x00e86 ***/
+
+ /* 80 */ 0x0000ccc5, 0x8ea2a5dd, 0x8ea2a5df, 0x00000000,
+ /* 84 */ 0x0000ccc8, 0x8eaea7ec, 0x0000ccca, 0x8ea2a5db,
+ /* 88 */ 0x8ea2a5e0, 0x8eaea7f0, 0x8eaea7f9, 0x0000ccd3,
+ /* 8c */ 0x0000cccf, 0x8ea2a5e8, 0x0000ccd5, 0x8eaea7f3,
+ /* 90 */ 0x0000cccc, 0x8ea2a5de, 0x0000ccc9, 0x8eaea7ef,
+ /* 94 */ 0x8eaea7f7, 0x0000ccc4, 0x0000ccc2, 0x00000000,
+ /* 98 */ 0x8ea2a5ec, 0x00000000, 0x0000ccd0, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaeabdc, 0x8eaeabdd,
+ /* a0 */ 0x8ea2a9c9, 0x8ea2a9bd, 0x8ea2a9cc, 0x8eaeabd7,
+ /* a4 */ 0x8eaeabd9, 0x8ea2a9bf, 0x0000d0bc, 0x0000d0ca,
+ /* a8 */ 0x0000d0b8, 0x0000d0c9, 0x0000d0c1, 0x0000d0c6,
+ /* ac */ 0x0000d0b6, 0x8ea2a9be, 0x8ea2a9c4, 0x0000d0c5,
+ /* b0 */ 0x8ea2a9d0, 0x0000d0c7, 0x8eaeabdb, 0x0000d0bd,
+ /* b4 */ 0x8eaeabd4, 0x8eaeabde, 0x8ea2a9c6, 0x8ea2a9c3,
+ /* b8 */ 0x0000d0bb, 0x8eaeabd1, 0x8ea2a9bc, 0x0000d0c8,
+ /* bc */ 0x8ea2a9cb, 0x0000d0c0, 0x8ea2a9cd, 0x0000d0cb,
+
+ /*** Three byte table, leaf: e593xx - offset 0x00ec6 ***/
+
+ /* 80 */ 0x0000d0b7, 0x0000d0c2, 0x0000d0bf, 0x8ea2a9c1,
+ /* 84 */ 0x0000d0c3, 0x8ea2a9c7, 0x8ea2a9c8, 0x0000d0be,
+ /* 88 */ 0x0000d0c4, 0x0000d0ba, 0x8eaeabd5, 0x8eaee4d4,
+ /* 8c */ 0x8eaeabe3, 0x8eaeabe1, 0x0000d0b9, 0x8ea2a9c0,
+ /* 90 */ 0x8eaeabd3, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x8ea2a9c5, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x8eaeabd8, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2a9cf, 0x00000000,
+ /* a0 */ 0x8ea2aec6, 0x0000d4de, 0x8ea2aeb4, 0x00000000,
+ /* a4 */ 0x8ea2aeb9, 0x0000d4d7, 0x0000d4e2, 0x8ea2aeb7,
+ /* a8 */ 0x0000d4d2, 0x0000d4dc, 0x0000d4e1, 0x8ea2aebe,
+ /* ac */ 0x00000000, 0x0000d4dd, 0x0000d4e0, 0x8eaeaff7,
+ /* b0 */ 0x8eaeb0a1, 0x8ea2aec1, 0x0000d4d8, 0x8ea2aeb8,
+ /* b4 */ 0x8eaeaff4, 0x8eaeaff8, 0x8eaeb0a2, 0x8ea2aec4,
+ /* b8 */ 0x8ea2aec5, 0x8eaeaff9, 0x0000d4da, 0x8ea2aec3,
+ /* bc */ 0x0000d4d6, 0x0000d4e5, 0x00000000, 0x8ea2aebb,
+
+ /*** Three byte table, leaf: e594xx - offset 0x00f06 ***/
+
+ /* 80 */ 0x8eaeaffb, 0x0000d4d4, 0x8eaeaffa, 0x8ea2aec8,
+ /* 84 */ 0x8ea2aebc, 0x8ea2aec0, 0x0000d4d9, 0x0000d4e4,
+ /* 88 */ 0x8ea2aebd, 0x0000d4df, 0x8ea2aec2, 0x8ea2aec9,
+ /* 8c */ 0x8ea2b4a4, 0x8eaeaff3, 0x8ea2aec7, 0x0000d4e6,
+ /* 90 */ 0x0000d4d3, 0x8ea2aebf, 0x8ea2aeb6, 0x8eaeaff6,
+ /* 94 */ 0x0000d4db, 0x00000000, 0x00000000, 0x8ea2aeb5,
+ /* 98 */ 0x8eaeaffe, 0x8eaeb0a5, 0x8ea2aeba, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x8ea2aeb3, 0x0000d4e3,
+ /* a8 */ 0x8eaee7a1, 0x8eaeb4df, 0x8ea2b3fa, 0x8eaeb4e8,
+ /* ac */ 0x0000d9c9, 0x8ea2b4aa, 0x0000d9c7, 0x0000d9c4,
+ /* b0 */ 0x8ea2b4a1, 0x0000d9c0, 0x8ea2b4a5, 0x0000d9cb,
+ /* b4 */ 0x8ea2b3f9, 0x8ea2b3fe, 0x8ea2b3fd, 0x0000d4d5,
+ /* b8 */ 0x0000d9c6, 0x8ea2b4a8, 0x8eaeb4e6, 0x8ea2b4ab,
+ /* bc */ 0x8ea2b3f6, 0x00000000, 0x0000dece, 0x8eaeb4e7,
+
+ /*** Three byte table, leaf: e595xx - offset 0x00f46 ***/
+
+ /* 80 */ 0x8ea2b4ac, 0x0000d9cc, 0x00000000, 0x0000d9be,
+ /* 84 */ 0x0000d9bb, 0x8ea2b4a3, 0x0000d9b8, 0x00000000,
+ /* 88 */ 0x8ea2b4a9, 0x8eaeb4db, 0x0000d9bf, 0x8ea2b4ad,
+ /* 8c */ 0x8eaeb4d8, 0x8ea2b3f7, 0x8ea2b4a7, 0x0000d9c2,
+ /* 90 */ 0x8ea2b3f8, 0x8ea2b3fb, 0x8ea2b4a2, 0x8eaeb4e2,
+ /* 94 */ 0x8eaeb4e1, 0x0000d9c3, 0x0000d9c1, 0x0000d9cd,
+ /* 98 */ 0x8eaeb4d7, 0x8eaebab6, 0x8eaeb4e4, 0x00000000,
+ /* 9c */ 0x0000d9c8, 0x8eaeb4de, 0x0000d9bc, 0x0000daf6,
+ /* a0 */ 0x00000000, 0x0000d9bd, 0x8ea2b3fc, 0x0000d9ca,
+ /* a4 */ 0x0000d9c5, 0x8ea2b4a6, 0x0000d9ba, 0x00000000,
+ /* a8 */ 0x8eaeb4d9, 0x00000000, 0x0000d9b9, 0x8eaee4d7,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x8eaee4d6, 0x8eaee7a2, 0x8eaee4d5,
+ /* b4 */ 0x00000000, 0x8ea2b3f4, 0x8ea2b3f5, 0x8ea2bace,
+ /* b8 */ 0x00000000, 0x00000000, 0x8eaebabc, 0x0000debd,
+ /* bc */ 0x0000dec0, 0x8ea2bad9, 0x0000ded4, 0x8ea2badc,
+
+ /*** Three byte table, leaf: e596xx - offset 0x00f86 ***/
+
+ /* 80 */ 0x0000debe, 0x8ea2bad5, 0x0000dec4, 0x0000deca,
+ /* 84 */ 0x0000e1c3, 0x8eaebab1, 0x8eaebab8, 0x0000dec8,
+ /* 88 */ 0x8ea2bad2, 0x0000ded5, 0x0000dec1, 0x0000dec9,
+ /* 8c */ 0x8ea2bada, 0x8ea2c1fc, 0x8ea2badf, 0x8ea2bad3,
+ /* 90 */ 0x00000000, 0x8ea2baca, 0x8ea2bad7, 0x8ea2bad1,
+ /* 94 */ 0x0000dec7, 0x8ea2badd, 0x8eaebaae, 0x8eaebaaa,
+ /* 98 */ 0x0000dec3, 0x0000ded7, 0x0000ded0, 0x8eaebab3,
+ /* 9c */ 0x0000dec5, 0x0000dec2, 0x8eaebac0, 0x0000decd,
+ /* a0 */ 0x8eaebab4, 0x8ea2bade, 0x8ea2bad0, 0x8ea2bad6,
+ /* a4 */ 0x8ea2bad8, 0x8ea2bacc, 0x8ea2badb, 0x0000debf,
+ /* a8 */ 0x8ea2bacb, 0x8eaebac2, 0x0000dec6, 0x0000ded6,
+ /* ac */ 0x0000ded2, 0x8ea2bacd, 0x0000decc, 0x8eaebabb,
+ /* b0 */ 0x00000000, 0x0000ded3, 0x0000decf, 0x0000decb,
+ /* b4 */ 0x8eaebaaf, 0x8ea2bad4, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x8eaee7a3, 0x0000ded1,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2c1fa,
+
+ /*** Three byte table, leaf: e597xx - offset 0x00fc6 ***/
+
+ /* 80 */ 0x8ea2c1f6, 0x8eaec0d1, 0x8ea2c2a7, 0x8ea2c1ef,
+ /* 84 */ 0x8ea2c1f8, 0x0000e3cc, 0x0000e3cd, 0x0000e3c5,
+ /* 88 */ 0x8ea2c2a3, 0x0000e3cf, 0x8ea2c1f4, 0x8ea2c1f3,
+ /* 8c */ 0x8ea2c1f1, 0x8ea2c2a5, 0x0000e3c3, 0x8ea2c1fd,
+ /* 90 */ 0x8ea2c1f2, 0x0000e3c6, 0x8ea2c1fb, 0x0000e3c1,
+ /* 94 */ 0x8ea2c1f7, 0x8ea2c1fe, 0x8ea2c2a2, 0x8eaec0ce,
+ /* 98 */ 0x00000000, 0x8ea2c2a6, 0x0000e3ca, 0x8ea2c1f0,
+ /* 9c */ 0x0000e3c4, 0x8ea2c1f5, 0x8eaebaab, 0x0000e3bf,
+ /* a0 */ 0x00000000, 0x0000e3cb, 0x8ea2c2a1, 0x0000e3c7,
+ /* a4 */ 0x0000e3c8, 0x0000e3ce, 0x0000e3c2, 0x0000a3a1,
+ /* a8 */ 0x0000e3c0, 0x8ea2c1f9, 0x8eaec0cc, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaee7a5, 0x0000e3c9,
+ /* b0 */ 0x8eaee7a4, 0x00000000, 0x8ea2c2a4, 0x00000000,
+ /* b4 */ 0x8eaee4d8, 0x00000000, 0x0000e8b5, 0x0000e8b0,
+ /* b8 */ 0x8eaec6ae, 0x8ea2c9bc, 0x8ea2c9b8, 0x8eaec6a8,
+ /* bc */ 0x8ea2c9b2, 0x0000e8aa, 0x0000e8a6, 0x8ea2c9bb,
+
+ /*** Three byte table, leaf: e598xx - offset 0x01006 ***/
+
+ /* 80 */ 0x0000e8a7, 0x8ea2c9b5, 0x8ea2c9b7, 0x8eaec6a9,
+ /* 84 */ 0x8ea2c9ba, 0x8eaec6b6, 0x0000e8ac, 0x8eaec6ac,
+ /* 88 */ 0x0000e8b3, 0x0000e8ad, 0x00000000, 0x8eaec6aa,
+ /* 8c */ 0x8ea2c9b0, 0x0000e8ae, 0x0000e8af, 0x8ea2c9b3,
+ /* 90 */ 0x0000e8b4, 0x8eaec6b4, 0x8ea2c9b1, 0x8ea2c9b6,
+ /* 94 */ 0x0000e8ab, 0x8ea2c9af, 0x0000e8b1, 0x0000e8a9,
+ /* 98 */ 0x8eaec6b3, 0x00000000, 0x00000000, 0x0000e8a8,
+ /* 9c */ 0x8ea2c9b4, 0x8ea2c9b9, 0x8eaec6b1, 0x0000e8b2,
+ /* a0 */ 0x8eaee4da, 0x00000000, 0x8eaee4d9, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaec6d0, 0x8ea2c9ae,
+ /* a8 */ 0x8eaec6b0, 0x0000ecb7, 0x8ea2cfee, 0x8eaecbc1,
+ /* ac */ 0x8ea2cfeb, 0x8eaecbb8, 0x0000ecb1, 0x0000ecbd,
+ /* b0 */ 0x0000ecbe, 0x8eaecbbd, 0x0000ecb4, 0x8ea2cfe9,
+ /* b4 */ 0x0000ecb6, 0x8ea2cfe1, 0x0000ecbc, 0x8eaecbc4,
+ /* b8 */ 0x8ea2cfed, 0x0000ecb3, 0x8ea2cfef, 0x0000ecb2,
+ /* bc */ 0x00000000, 0x8ea2cfea, 0x8ea2cfec, 0x0000ecb5,
+
+ /*** Three byte table, leaf: e599xx - offset 0x01046 ***/
+
+ /* 80 */ 0x8ea2cfe8, 0x8ea2cfe2, 0x8ea2cfdf, 0x00000000,
+ /* 84 */ 0x8eaecbbe, 0x8ea2bacf, 0x8ea2cfe5, 0x8eaecbb7,
+ /* 88 */ 0x8ea2cfde, 0x8ea2cfe4, 0x8ea2cfe3, 0x8eaecbbb,
+ /* 8c */ 0x8ea2cfe0, 0x8eaecbc3, 0x0000ecb9, 0x8eaecbc5,
+ /* 90 */ 0x8eaecbc0, 0x8eaec6b5, 0x8eaecbbc, 0x0000ecb8,
+ /* 94 */ 0x8eaecbb9, 0x00000000, 0x8eaecbbf, 0x0000ecba,
+ /* 98 */ 0x8ea2cfe6, 0x0000f0bb, 0x8ea2cfe7, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2d6cf, 0x8eaed0bf,
+ /* a0 */ 0x8ea2d6c8, 0x8eaed0c0, 0x0000f0c7, 0x8ea2d6cc,
+ /* a4 */ 0x0000f0bf, 0x0000f0c3, 0x8ea2d6cb, 0x8eaed0bb,
+ /* a8 */ 0x0000f0c2, 0x0000f0be, 0x0000f0c1, 0x0000f0bc,
+ /* ac */ 0x0000f0c6, 0x8ea2d6cd, 0x8ea2d6c9, 0x0000f0c5,
+ /* b0 */ 0x8ea2d6c7, 0x0000f0c4, 0x8ea2d6ce, 0x8ea2d6ca,
+ /* b4 */ 0x0000ecbb, 0x00000000, 0x0000f0c8, 0x8ea2d6d0,
+ /* b8 */ 0x0000f0c0, 0x0000f0bd, 0x00000000, 0x8eaed0bd,
+ /* bc */ 0x00000000, 0x8eaed4c8, 0x8ea2dcd2, 0x8ea2dcd4,
+
+ /*** Three byte table, leaf: e59axx - offset 0x01086 ***/
+
+ /* 80 */ 0x0000f3c6, 0x8ea2dcd5, 0x8ea2dcd3, 0x8ea2dcd1,
+ /* 84 */ 0x8ea2dcd0, 0x0000f3c8, 0x8ea2dccf, 0x0000f3c9,
+ /* 88 */ 0x00000000, 0x8eaed4c9, 0x8eaed4c7, 0x00000000,
+ /* 8c */ 0x8ea2dccd, 0x8ea2dcce, 0x0000f3c5, 0x0000f3ca,
+ /* 90 */ 0x0000f3c7, 0x8eaee4dd, 0x8eaee4db, 0x8ea2dccc,
+ /* 94 */ 0x8eaed7db, 0x0000f6bc, 0x8eaed7da, 0x8ea2e1c8,
+ /* 98 */ 0x8ea2e1c6, 0x8ea2e1cb, 0x8ea2e1c9, 0x8eaed7d8,
+ /* 9c */ 0x8ea2e1c7, 0x8ea2e1ca, 0x8eaed7d9, 0x8eaed7d7,
+ /* a0 */ 0x8eaed7dc, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x0000f8ac, 0x8ea2e5be, 0x8ea2e5bf,
+ /* a8 */ 0x0000f8ad, 0x00000000, 0x8ea2e5c0, 0x8ea2e5bc,
+ /* ac */ 0x8ea2e5c1, 0x8ea2e5bd, 0x0000f6bd, 0x8eaedaad,
+ /* b0 */ 0x8eaee4de, 0x00000000, 0x8ea2e8eb, 0x8ea2e8ed,
+ /* b4 */ 0x0000f9e4, 0x8ea2e8ec, 0x0000f9e3, 0x0000f9e2,
+ /* b8 */ 0x8eaee7a6, 0x8eaee7a7, 0x8eaee4dc, 0x8eaedea6,
+ /* bc */ 0x0000f9e5, 0x8ea2ebd3, 0x8ea2ebd4, 0x00000000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x010c6 ***/
+
+ /* 80 */ 0x0000fae5, 0x0000fae4, 0x0000fae6, 0x8ea2ebd2,
+ /* 84 */ 0x8eaee7a8, 0x8ea2edc6, 0x8ea2edc5, 0x8eaedfc0,
+ /* 88 */ 0x0000fbd9, 0x0000fbdb, 0x0000fbda, 0x8ea2edc7,
+ /* 8c */ 0x0000fcb4, 0x8ea2f0b4, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000fcdd, 0x8eaee0f1, 0x8ea2f0b3,
+ /* 94 */ 0x8ea2f0fc, 0x00000000, 0x00000000, 0x8ea2a1aa,
+ /* 98 */ 0x8eaea1f7, 0x00000000, 0x0000c6bf, 0x0000c6be,
+ /* 9c */ 0x00000000, 0x0000c7e0, 0x0000c7df, 0x8ea2a2a7,
+ /* a0 */ 0x0000c7de, 0x8ea2a2a6, 0x00000000, 0x8eaea3be,
+ /* a4 */ 0x0000c9db, 0x8ea2a3c9, 0x8eaea5ac, 0x8ea2a3c8,
+ /* a8 */ 0x00000000, 0x8eaea5a6, 0x0000c9d9, 0x0000c9dc,
+ /* ac */ 0x8eaea5ab, 0x8eaea5aa, 0x8ea2a3c7, 0x8eaea5a9,
+ /* b0 */ 0x0000c9da, 0x8eaea5c8, 0x8eaea5a7, 0x8eaea5a8,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaea8a2, 0x8ea2a5f0,
+ /* b8 */ 0x8eaea7fd, 0x8ea2a5f1, 0x0000ccd6, 0x8eaea7fc,
+ /* bc */ 0x8eaea8a1, 0x8eaea7fb, 0x00000000, 0x0000d0cc,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x01106 ***/
+
+ /* 80 */ 0x8eaeabe5, 0x8ea2aeca, 0x8ea2aecb, 0x0000d4e7,
+ /* 84 */ 0x0000d4e8, 0x8eaeb0a7, 0x00000000, 0x8ea2b4af,
+ /* 88 */ 0x0000d9ce, 0x0000d9d0, 0x8ea2b4ae, 0x0000d9cf,
+ /* 8c */ 0x8ea2bae0, 0x0000ded8, 0x8eaebac4, 0x8eaebac3,
+ /* 90 */ 0x00000000, 0x00000000, 0x0000e3d0, 0x0000e3d1,
+ /* 94 */ 0x8ea2c2a8, 0x8eaec0d2, 0x0000e8b7, 0x8eaec6b7,
+ /* 98 */ 0x0000e8b6, 0x00000000, 0x8ea2cff0, 0x8ea2d6d2,
+ /* 9c */ 0x8ea2d6d1, 0x8eaedfc1, 0x8ea2f1da, 0x0000c4c8,
+ /* a0 */ 0x8ea2a1b9, 0x8eaea1e1, 0x8ea2a1cf, 0x8ea2a1d0,
+ /* a4 */ 0x8eaea2b4, 0x00000000, 0x00000000, 0x8eaee2c9,
+ /* a8 */ 0x0000c7e3, 0x0000c7e7, 0x8ea2a2a9, 0x00000000,
+ /* ac */ 0x0000c7e5, 0x0000c7e4, 0x8ea2a2a8, 0x0000c7e6,
+ /* b0 */ 0x0000c7e2, 0x8eaea3c1, 0x8eaea3c2, 0x0000c7e1,
+ /* b4 */ 0x8ea2a2aa, 0x8eaea3bf, 0x8eaea3c0, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x0000c9e6,
+ /* bc */ 0x8eaea5b1, 0x8eaea5be, 0x0000c9e3, 0x8eaea5b0,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01146 ***/
+
+ /* 80 */ 0x0000c9df, 0x8ea2a3ca, 0x8eaea5c0, 0x8eaea5b6,
+ /* 84 */ 0x8eaea5af, 0x8ea2a3cb, 0x8eaea5bc, 0x0000c9e1,
+ /* 88 */ 0x8eaea5ad, 0x8ea2a3cd, 0x0000c9dd, 0x8ea2a3ce,
+ /* 8c */ 0x8ea2a3cc, 0x0000c9e0, 0x0000c9e2, 0x0000c9e5,
+ /* 90 */ 0x0000c9e4, 0x0000c9de, 0x8ea2a3cf, 0x8eaea5b2,
+ /* 94 */ 0x8eaea5c1, 0x8eaea5c2, 0x8eaea5b3, 0x8eaea5b8,
+ /* 98 */ 0x8eaea5b7, 0x8eaee4df, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x8eaea5b5,
+ /* a0 */ 0x00000000, 0x0000ccdb, 0x8ea2a5fe, 0x8eaea8a5,
+ /* a4 */ 0x0000ccdd, 0x8eaea8a3, 0x0000ccdc, 0x8eaea8a6,
+ /* a8 */ 0x8ea2a6a1, 0x0000ccda, 0x0000ccd9, 0x8ea2a5f5,
+ /* ac */ 0x00000000, 0x8ea2a5f4, 0x8eaea8a8, 0x8ea2a5f2,
+ /* b0 */ 0x8ea2a5f7, 0x8ea2a5f6, 0x8ea2a5f3, 0x8ea2a5fc,
+ /* b4 */ 0x8ea2a5fd, 0x8ea2a5fa, 0x8ea2a5f8, 0x0000ccd8,
+ /* b8 */ 0x8eaea8a9, 0x00000000, 0x00000000, 0x8ea2a5fb,
+ /* bc */ 0x0000ccde, 0x8ea2a6a2, 0x00000000, 0x8eaea8aa,
+
+ /*** Three byte table, leaf: e59exx - offset 0x01186 ***/
+
+ /* 80 */ 0x8ea2a5f9, 0x8eaea8a4, 0x0000d0cd, 0x0000ccd7,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x8eaee4e0, 0x0000d0ce,
+ /* 8c */ 0x8ea2a9d5, 0x8eaeabe9, 0x8eaeabe8, 0x8ea2a9db,
+ /* 90 */ 0x8eaeabec, 0x8eaeabe7, 0x8eaeabea, 0x0000d0d4,
+ /* 94 */ 0x8ea2a9d9, 0x8ea2a9df, 0x8eaeabf1, 0x8ea2a9d6,
+ /* 98 */ 0x8ea2a9da, 0x8ea2a9dc, 0x8ea2a9de, 0x8ea2a9d8,
+ /* 9c */ 0x8eaeabf0, 0x8ea2a9d7, 0x8ea2a9d2, 0x8ea2a9d3,
+ /* a0 */ 0x0000d0cf, 0x8eaeabeb, 0x0000d0d1, 0x0000d0d0,
+ /* a4 */ 0x8ea2a9d4, 0x8ea2a9dd, 0x8eaeabed, 0x8eaeabf2,
+ /* a8 */ 0x8eaeabee, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaeabe6, 0x00000000, 0x0000d0d3, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x8ea2a9d1, 0x8ea2aed5, 0x8eaeb0aa,
+ /* b8 */ 0x8ea2aed4, 0x8ea2aed9, 0x8ea2aed0, 0x8eaeb0b0,
+ /* bc */ 0x8ea2aed3, 0x8ea2aed2, 0x8eaeb0af, 0x8ea2aed6,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x011c6 ***/
+
+ /* 80 */ 0x8eaeb0b8, 0x8ea2aeda, 0x0000d4e9, 0x0000d4ec,
+ /* 84 */ 0x8eaeb0b4, 0x8eaeb0b5, 0x8ea2aed1, 0x8ea2aed7,
+ /* 88 */ 0x8eaeb0b3, 0x8eaeb0a8, 0x8eaeb0b7, 0x0000d4eb,
+ /* 8c */ 0x8ea2aecc, 0x8eaeb0ab, 0x0000d0d2, 0x8ea2b4bd,
+ /* 90 */ 0x8ea2aed8, 0x8eaeb0b6, 0x8ea2aecf, 0x00000000,
+ /* 94 */ 0x0000d4ea, 0x8ea2aece, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb0b2,
+ /* 9c */ 0x8ea2b4b4, 0x8eaeb4ee, 0x8eaeb4f1, 0x0000d9d1,
+ /* a0 */ 0x0000d9d5, 0x8ea2b4c4, 0x8ea2b4b2, 0x8ea2b4c0,
+ /* a4 */ 0x0000d9d6, 0x8ea2b4c2, 0x8eaeb4f2, 0x8ea2b4c8,
+ /* a8 */ 0x8eaeb4f4, 0x8ea2b4cc, 0x8eaeb4e9, 0x00000000,
+ /* ac */ 0x8ea2b4c3, 0x8ea2b4b7, 0x8ea2b4bf, 0x8eaeb4eb,
+ /* b0 */ 0x8ea2b4cd, 0x8ea2b4cb, 0x8ea2b4c1, 0x8ea2b4bc,
+ /* b4 */ 0x8ea2b4b5, 0x8ea2bae8, 0x8ea2b4b3, 0x0000d9da,
+ /* b8 */ 0x8ea2b4ba, 0x0000d9db, 0x0000d9d7, 0x8ea2b4b0,
+ /* bc */ 0x8ea2b4c6, 0x8ea2b4b8, 0x8eaeb4ef, 0x8eaeb4f5,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x01206 ***/
+
+ /* 80 */ 0x8ea2b4b6, 0x8ea2b4c9, 0x0000d9d8, 0x8eaeb4f6,
+ /* 84 */ 0x8ea2b4cf, 0x0000d9d2, 0x0000d9d4, 0x8ea2b4be,
+ /* 88 */ 0x8ea2b4b9, 0x0000d4ed, 0x0000d9d3, 0x8ea2b4bb,
+ /* 8c */ 0x8ea2b4ca, 0x8ea2b4ce, 0x8ea2b4c5, 0x8eaee4e1,
+ /* 90 */ 0x8ea2b4c7, 0x00000000, 0x8eaee4e2, 0x8eaee4e3,
+ /* 94 */ 0x8ea2b4b1, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x8eaebaca, 0x8ea2bae3, 0x8eaebac5, 0x8ea2baec,
+ /* 9c */ 0x8ea2baeb, 0x0000dee0, 0x8ea2bae4, 0x8eaebac7,
+ /* a0 */ 0x0000dee1, 0x0000dedf, 0x8eaebad0, 0x8ea2bae6,
+ /* a4 */ 0x0000dedc, 0x8ea2baea, 0x8eaebacc, 0x8ea2bae5,
+ /* a8 */ 0x8ea2bae7, 0x8ea2bae1, 0x0000deda, 0x8eaee3b6,
+ /* ac */ 0x8ea2baf4, 0x8ea2baf3, 0x8ea2baf0, 0x0000ded9,
+ /* b0 */ 0x0000dedd, 0x0000dede, 0x8ea2aecd, 0x8ea2baed,
+ /* b4 */ 0x0000dedb, 0x0000d9d9, 0x8ea2baef, 0x8ea2bae2,
+ /* b8 */ 0x8ea2baf2, 0x8ea2baf1, 0x8eaebace, 0x8ea2baf5,
+ /* bc */ 0x8eaebac9, 0x8ea2c2b6, 0x8eaebacb, 0x8ea2baee,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x01246 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x8eaee3b7, 0x00000000, 0x8eaee4e4,
+ /* 88 */ 0x8ea2bae9, 0x8ea2c2ae, 0x0000e3db, 0x0000e3de,
+ /* 8c */ 0x0000e3d9, 0x8ea2c2ad, 0x8ea2c2b1, 0x8ea2c2ac,
+ /* 90 */ 0x8eaec0d7, 0x0000e3d3, 0x0000e3dd, 0x8ea2c2a9,
+ /* 94 */ 0x0000e3d7, 0x8ea2c2b0, 0x8eaec0db, 0x0000e3d5,
+ /* 98 */ 0x0000e3d4, 0x8ea2c2b3, 0x0000e3d6, 0x8ea2c2b5,
+ /* 9c */ 0x8eaec0d6, 0x8ea2c2b2, 0x0000e3d2, 0x8eaec0de,
+ /* a0 */ 0x8eaec0dc, 0x8eaec0d8, 0x0000e3dc, 0x8ea2c2b7,
+ /* a4 */ 0x8ea2c2ab, 0x8ea2c2b4, 0x8eaec0dd, 0x8eaee3c3,
+ /* a8 */ 0x8ea2c2aa, 0x8eaec0da, 0x8eaec0d9, 0x0000e3d8,
+ /* ac */ 0x8eaec0d4, 0x0000e3da, 0x00000000, 0x8ea2c2af,
+ /* b0 */ 0x00000000, 0x8ea2c2b8, 0x8eaec6c3, 0x8eaec6be,
+ /* b4 */ 0x8ea2c9c4, 0x0000e8b8, 0x8ea2c9ca, 0x8eaec6c2,
+ /* b8 */ 0x8eaec6bc, 0x0000e8bd, 0x8ea2c9c6, 0x8ea2c9cd,
+ /* bc */ 0x8ea2c9be, 0x0000e8bf, 0x0000e8b9, 0x8ea2c9c3,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x01286 ***/
+
+ /* 80 */ 0x0000ecbf, 0x8ea2c9c2, 0x8ea2c9cb, 0x0000e8ba,
+ /* 84 */ 0x8eaec6bd, 0x0000e8be, 0x8ea2c9c1, 0x8ea2c9c7,
+ /* 88 */ 0x8ea2c9cc, 0x8ea2c9bd, 0x0000e8bc, 0x8ea2c9c5,
+ /* 8c */ 0x8eaec6ba, 0x8eaec6c5, 0x8ea2c9c9, 0x8ea2c9cf,
+ /* 90 */ 0x8ea2c9bf, 0x8ea2c9c8, 0x8eaec6b8, 0x0000e8bb,
+ /* 94 */ 0x8ea2c9ce, 0x8eaec6c1, 0x8eaec6c4, 0x8eaec6c0,
+ /* 98 */ 0x8ea2c9c0, 0x00000000, 0x00000000, 0x8eaee4e5,
+ /* 9c */ 0x0000ecc3, 0x8ea2cff2, 0x0000ecc1, 0x0000ecc0,
+ /* a0 */ 0x8ea2cff4, 0x8ea2cff9, 0x8eaecbc6, 0x8ea2cff5,
+ /* a4 */ 0x8eaecbd0, 0x8ea2cff8, 0x0000ecc6, 0x8eaecbd1,
+ /* a8 */ 0x0000f0ae, 0x0000ecc5, 0x8eaecbcb, 0x8ea2cff1,
+ /* ac */ 0x8ea2cff7, 0x8eaec6bf, 0x0000ecc4, 0x8ea2cff6,
+ /* b0 */ 0x8eaecbcd, 0x8ea2cff3, 0x8eaecbc9, 0x0000ecc2,
+ /* b4 */ 0x8eaecbcf, 0x8eaecbcc, 0x00000000, 0x8eaecbc7,
+ /* b8 */ 0x00000000, 0x00000000, 0x8ea2d6d7, 0x8eaed0ca,
+ /* bc */ 0x8ea2d6d9, 0x8ea2d6d4, 0x0000f0ca, 0x8ea2d6d6,
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x012c6 ***/
+
+ /* 80 */ 0x8eaed0cb, 0x0000f0c9, 0x8ea2d6d8, 0x8eaed0c8,
+ /* 84 */ 0x8eaed0cc, 0x0000f0cc, 0x8ea2d6da, 0x0000f0cb,
+ /* 88 */ 0x8ea2d6d3, 0x8ea2d6d5, 0x8eaed0c9, 0x00000000,
+ /* 8c */ 0x00000000, 0x8eaed4cb, 0x0000f3ce, 0x8ea2dcd8,
+ /* 90 */ 0x8eaed4cc, 0x0000f3cd, 0x8ea2dcd9, 0x0000f3cc,
+ /* 94 */ 0x8ea2dcd7, 0x0000f3cb, 0x8ea2dcd6, 0x00000000,
+ /* 98 */ 0x0000f6bf, 0x0000f6be, 0x8ea2e5c2, 0x8ea2e5c4,
+ /* 9c */ 0x8eaedaaf, 0x8ea2e5c3, 0x0000f8ae, 0x0000f8af,
+ /* a0 */ 0x8eaedaae, 0x00000000, 0x0000f8b0, 0x8ea2e8ee,
+ /* a4 */ 0x0000f9e6, 0x00000000, 0x8eaedea8, 0x8ea2efa2,
+ /* a8 */ 0x8ea2efa1, 0x0000fcde, 0x00000000, 0x0000c4c9,
+ /* ac */ 0x0000c5b1, 0x00000000, 0x8eaea3c3, 0x0000c9e7,
+ /* b0 */ 0x8eaea5c5, 0x8eaea5c3, 0x8eaea5c4, 0x8eaea8ad,
+ /* b4 */ 0x8ea2a9e0, 0x8eaeabf7, 0x00000000, 0x8eaeb4f7,
+ /* b8 */ 0x00000000, 0x0000dee2, 0x0000dee3, 0x8eaebad2,
+ /* bc */ 0x8ea2c2b9, 0x0000e8c0, 0x8ea2c9d0, 0x8ea2cffa,
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x01306 ***/
+
+ /* 80 */ 0x8eaee4e6, 0x8eaed0cd, 0x8eaea1b9, 0x8ea2a1ba,
+ /* 84 */ 0x8eaea2b5, 0x8eaea3c4, 0x8ea2a3d0, 0x00000000,
+ /* 88 */ 0x8eaeabfa, 0x8eaeabf9, 0x8eaea1ba, 0x8eaea5c6,
+ /* 8c */ 0x8ea2a6a3, 0x8ea2a9e1, 0x8ea2aedb, 0x0000d4ee,
+ /* 90 */ 0x8eaec6c6, 0x8eaee5e0, 0x8ea2e5c5, 0x00000000,
+ /* 94 */ 0x0000fae7, 0x0000c4ca, 0x0000c6c0, 0x8ea2a1d1,
+ /* 98 */ 0x8eaea2b6, 0x0000c7e8, 0x0000c7e9, 0x00000000,
+ /* 9c */ 0x0000ccdf, 0x00000000, 0x00000000, 0x8eaeb4f9,
+ /* a0 */ 0x0000d9dc, 0x00000000, 0x0000e8c2, 0x8eaec0df,
+ /* a4 */ 0x0000e8c3, 0x0000e8c1, 0x8eaecbd3, 0x0000c4cb,
+ /* a8 */ 0x00000000, 0x0000c5b2, 0x0000c5b4, 0x0000c5b3,
+ /* ac */ 0x8ea2a1bb, 0x0000c5b5, 0x0000c6c1, 0x8ea2a1d2,
+ /* b0 */ 0x8eaea2b8, 0x0000c6c2, 0x8eaea2b7, 0x00000000,
+ /* b4 */ 0x8eaea2b9, 0x00000000, 0x8eaea3c7, 0x0000c7ea,
+ /* b8 */ 0x0000c7eb, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x8ea2a2ab, 0x8eaea5c9, 0x0000c9e8, 0x00000000,
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x01346 ***/
+
+ /* 80 */ 0x8ea2a3d1, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x0000cce3, 0x8ea2a6a4, 0x00000000, 0x0000cce1,
+ /* 88 */ 0x0000cce2, 0x0000cce0, 0x8ea2aedc, 0x8eaea8ae,
+ /* 8c */ 0x8eaea8af, 0x8eaee4e7, 0x0000d0d8, 0x0000d0d7,
+ /* 90 */ 0x0000d0d9, 0x0000d0d6, 0x8eaeabfc, 0x8ea2a9e2,
+ /* 94 */ 0x0000cce4, 0x0000d0d5, 0x00000000, 0x0000d4ef,
+ /* 98 */ 0x0000d4f0, 0x00000000, 0x0000d4f1, 0x8eaeb4fb,
+ /* 9c */ 0x8ea2b4d0, 0x8eaeb4fc, 0x8eaeb4fd, 0x00000000,
+ /* a0 */ 0x0000dee4, 0x8ea2baf6, 0x0000d9dd, 0x8eaebad3,
+ /* a4 */ 0x8eaebad4, 0x00000000, 0x8eaec0e0, 0x0000e3df,
+ /* a8 */ 0x8eaec0e1, 0x0000e8c5, 0x0000e8c4, 0x8ea2c9d1,
+ /* ac */ 0x8eaec6c8, 0x0000ecc7, 0x0000f0cd, 0x00000000,
+ /* b0 */ 0x8ea2e1cc, 0x8ea2edc8, 0x8ea2efa3, 0x0000c4cc,
+ /* b4 */ 0x0000c6c3, 0x8eaea2bb, 0x0000c6c4, 0x8ea2a2b1,
+ /* b8 */ 0x0000c7ed, 0x0000c7f0, 0x8eaea3cb, 0x8ea2a2af,
+ /* bc */ 0x8ea2a2ad, 0x0000c7ef, 0x8ea2a2b0, 0x8ea2a2b2,
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x01386 ***/
+
+ /* 80 */ 0x8ea2a2ac, 0x0000c7f2, 0x0000c7f1, 0x0000c7ee,
+ /* 84 */ 0x0000c7ec, 0x8ea2a2ae, 0x8eaea3cd, 0x00000000,
+ /* 88 */ 0x00000000, 0x8eaea5d5, 0x0000c9f3, 0x00000000,
+ /* 8c */ 0x8eaea5cc, 0x0000c9f0, 0x8ea2a3d6, 0x8ea2a3d9,
+ /* 90 */ 0x8ea2a3d8, 0x00000000, 0x0000c9ea, 0x0000c9f2,
+ /* 94 */ 0x8eaea5cb, 0x00000000, 0x0000c9ef, 0x8ea2a3d5,
+ /* 98 */ 0x8ea2a3d3, 0x0000c9ee, 0x8eaea5d6, 0x8eaea5d3,
+ /* 9c */ 0x8eaea5ce, 0x0000c9e9, 0x0000c9ec, 0x8eaea5d1,
+ /* a0 */ 0x8ea2a3d4, 0x8ea2a3db, 0x8ea2a3d7, 0x0000c9ed,
+ /* a4 */ 0x0000c9f1, 0x0000c9f4, 0x8ea2a3d2, 0x8ea2a3da,
+ /* a8 */ 0x0000c9eb, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaea8c1, 0x8eaea8b3, 0x0000cce9, 0x0000ccf1,
+ /* b0 */ 0x8eaea8b8, 0x8ea2a6b0, 0x8ea2a6a9, 0x0000ccf2,
+ /* b4 */ 0x8ea2a6b4, 0x8ea2a6a5, 0x8ea2a6ac, 0x8eaea8c5,
+ /* b8 */ 0x8eaea8c0, 0x0000cce8, 0x8ea2a6a6, 0x0000cce6,
+ /* bc */ 0x8ea2a6ad, 0x8ea2a6b1, 0x0000cce5, 0x8eaea8bd,
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x013c6 ***/
+
+ /* 80 */ 0x8ea2a6b2, 0x8ea2a6ab, 0x8eaea8b7, 0x8ea2a6ae,
+ /* 84 */ 0x8eaea8b5, 0x0000ccf4, 0x0000cceb, 0x8ea2a6b5,
+ /* 88 */ 0x8ea2a6b3, 0x8eaea8bf, 0x0000ccf0, 0x0000ccee,
+ /* 8c */ 0x8ea2a6aa, 0x0000cced, 0x8ea2a6a8, 0x8ea2a6a7,
+ /* 90 */ 0x0000ccec, 0x0000ccea, 0x0000ccf3, 0x0000ccef,
+ /* 94 */ 0x0000cce7, 0x8eaeaca6, 0x8ea2a6af, 0x8eaea8c6,
+ /* 98 */ 0x0000d0db, 0x8eaeacad, 0x0000d0e2, 0x8ea2a9f0,
+ /* 9c */ 0x0000d0da, 0x8ea2a9e8, 0x8ea2a9e4, 0x8eaeaca1,
+ /* a0 */ 0x8ea2a9f4, 0x8ea2a9e3, 0x8eaeacac, 0x0000d0dd,
+ /* a4 */ 0x8ea2a9ed, 0x0000d0e0, 0x0000d0e3, 0x8eaeacae,
+ /* a8 */ 0x0000d0de, 0x8ea2a9f1, 0x0000d0e1, 0x8eaeaca3,
+ /* ac */ 0x0000d4f8, 0x8ea2a9f7, 0x8ea2a9e5, 0x8eaeaca4,
+ /* b0 */ 0x8eaeaca5, 0x8ea2a9e7, 0x8ea2a9ee, 0x8ea2a9f2,
+ /* b4 */ 0x8ea2a9f6, 0x8ea2a9f3, 0x8ea2a9ec, 0x8ea2a9ef,
+ /* b8 */ 0x8eaeacab, 0x8eaeaca9, 0x8ea2a9e9, 0x0000d0e5,
+ /* bc */ 0x8ea2a9eb, 0x8ea2a9ea, 0x8ea2a9f5, 0x0000d0dc,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x01406 ***/
+
+ /* 80 */ 0x8ea2a9e6, 0x0000d0e4, 0x8eaeacaa, 0x0000d0df,
+ /* 84 */ 0x8eaeaca8, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x0000d4fe, 0x8ea2aee4, 0x8eaeb0c0,
+ /* 8c */ 0x0000d4fd, 0x8eaeaca7, 0x00000000, 0x8ea2aee2,
+ /* 90 */ 0x8eaee2f0, 0x0000d4f2, 0x8eaeb0cf, 0x0000d4f7,
+ /* 94 */ 0x8eaeb0ca, 0x8ea2aee1, 0x8ea2aede, 0x8ea2aee3,
+ /* 98 */ 0x0000d4f3, 0x8ea2aedd, 0x8eaeb0ce, 0x0000d4f6,
+ /* 9c */ 0x0000d4f4, 0x8eaeb0be, 0x8ea2aee5, 0x0000d4f5,
+ /* a0 */ 0x0000d4f9, 0x8eaeb0bb, 0x8eaeb0c5, 0x0000d4fa,
+ /* a4 */ 0x8eaeb0c8, 0x0000d4fc, 0x8eaeb0d2, 0x00000000,
+ /* a8 */ 0x00000000, 0x0000d4fb, 0x8eaeb0bc, 0x8eaeb5a2,
+ /* ac */ 0x8eaeb5b8, 0x8ea2aedf, 0x8ea2aee0, 0x8eaeb0cd,
+ /* b0 */ 0x00000000, 0x8eaeb0cb, 0x00000000, 0x8ea2aee6,
+ /* b4 */ 0x00000000, 0x8ea2b4d7, 0x0000d9de, 0x8ea2bba6,
+ /* b8 */ 0x8ea2b4d6, 0x8ea2b4e9, 0x8eaeb5a8, 0x8eaeb5a4,
+ /* bc */ 0x0000d9e4, 0x8eaeb5b1, 0x8ea2b4e7, 0x8eaeb5b3,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01446 ***/
+
+ /* 80 */ 0x0000d9e3, 0x0000d9df, 0x8ea2b4f0, 0x8ea2b4e0,
+ /* 84 */ 0x8ea2b4e3, 0x8eaeb5ae, 0x0000d9e7, 0x8ea2b4ed,
+ /* 88 */ 0x8ea2b4e5, 0x0000d9e0, 0x0000d9e8, 0x8eaeb5aa,
+ /* 8c */ 0x8ea2b4ea, 0x8ea2b4e8, 0x8eaeb5af, 0x8eaeb5bb,
+ /* 90 */ 0x8ea2b4d9, 0x8ea2b4ee, 0x8ea2b4e2, 0x8ea2b4dd,
+ /* 94 */ 0x8eaeb5ba, 0x8ea2b4d3, 0x8ea2b4ef, 0x8ea2b4df,
+ /* 98 */ 0x8ea2b4d2, 0x8eaeb5b9, 0x0000d9e6, 0x8ea2b4e4,
+ /* 9c */ 0x8ea2b4f1, 0x8ea2b4e1, 0x8ea2b4d5, 0x8ea2b4da,
+ /* a0 */ 0x8ea2b4d1, 0x8eaeb5a7, 0x0000d9e5, 0x8eaeb5bc,
+ /* a4 */ 0x8ea2b4de, 0x8ea2b4db, 0x0000d9e1, 0x8ea2b4d4,
+ /* a8 */ 0x8eaeb5b0, 0x8ea2b4ec, 0x0000d9e2, 0x8eaeb5ab,
+ /* ac */ 0x8ea2b4dc, 0x8ea2b4d8, 0x8eaeb5a9, 0x8eaeb5b4,
+ /* b0 */ 0x8ea2b4eb, 0x8eaeb5b2, 0x00000000, 0x8eaeb5b7,
+ /* b4 */ 0x00000000, 0x8eaeb5b5, 0x00000000, 0x0000dee5,
+ /* b8 */ 0x8ea2bafd, 0x8eaebaf5, 0x8ea2bafa, 0x8ea2bbad,
+ /* bc */ 0x8ea2bba1, 0x8ea2bbae, 0x8eaebafc, 0x0000dee7,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x01486 ***/
+
+ /* 80 */ 0x8eaebae3, 0x8eaebae1, 0x8eaebad8, 0x8ea2bbaa,
+ /* 84 */ 0x8ea2bba7, 0x8eaebadb, 0x8eaebaf7, 0x8eaebaf2,
+ /* 88 */ 0x8eaebad9, 0x8eaebae0, 0x8ea2bba8, 0x8ea2bbab,
+ /* 8c */ 0x8ea2bbaf, 0x8eaebafb, 0x8ea2b4e6, 0x8ea2bbb1,
+ /* 90 */ 0x8ea2c2cd, 0x8eaebae6, 0x0000dee8, 0x8ea2bbb2,
+ /* 94 */ 0x8ea2baf8, 0x8ea2bba4, 0x8eaebae2, 0x8ea2bba9,
+ /* 98 */ 0x8eaebadc, 0x8eaebade, 0x0000dee6, 0x0000dee9,
+ /* 9c */ 0x8ea2bbb0, 0x8ea2bbb3, 0x8ea2bafc, 0x8ea2baf9,
+ /* a0 */ 0x8eaebaf3, 0x8eaebada, 0x8ea2bafb, 0x8eaebad7,
+ /* a4 */ 0x8eaebafa, 0x8ea2bba2, 0x8ea2bafe, 0x0000deea,
+ /* a8 */ 0x8eaebad6, 0x8ea2bbac, 0x8eaebaf9, 0x8eaebaf8,
+ /* ac */ 0x8ea2bba3, 0x00000000, 0x8ea2bba5, 0x8ea2baf7,
+ /* b0 */ 0x8ea2c2c1, 0x8ea2c2bf, 0x0000e3e8, 0x0000e3e6,
+ /* b4 */ 0x8ea2c2c9, 0x8ea2c2c0, 0x8ea2c2ca, 0x8ea2c2c6,
+ /* b8 */ 0x8ea2c2be, 0x8ea2c2cc, 0x8ea2c2bd, 0x8ea2c2c4,
+ /* bc */ 0x0000e3e5, 0x0000e3e4, 0x0000e3e3, 0x8ea2c2c2,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x014c6 ***/
+
+ /* 80 */ 0x8ea2c2c7, 0x0000e3e0, 0x0000e3e7, 0x8eaec0e7,
+ /* 84 */ 0x8ea2c2bb, 0x8eaec0e6, 0x8ea2c2c5, 0x8ea2c2ba,
+ /* 88 */ 0x8ea2c2c3, 0x0000e3e1, 0x8ea2c2c8, 0x8ea2c2bc,
+ /* 8c */ 0x0000e3e2, 0x8ea2c2cb, 0x8eaec0e4, 0x8eaebaeb,
+ /* 90 */ 0x8eaec0ea, 0x8eaee4e8, 0x00000000, 0x8eaee4e9,
+ /* 94 */ 0x00000000, 0x8ea2c9d5, 0x0000e8ca, 0x0000e8c9,
+ /* 98 */ 0x0000e8cb, 0x8ea2c9e1, 0x8ea2c9d7, 0x8ea2c9dd,
+ /* 9c */ 0x8ea2c9d2, 0x8ea2c9e0, 0x8ea2c9df, 0x8ea2c9e3,
+ /* a0 */ 0x8ea2c9dc, 0x0000e8c6, 0x8ea2c9db, 0x0000e8cc,
+ /* a4 */ 0x8eaec6cc, 0x8ea2c9d4, 0x0000e8c7, 0x8eaec6ca,
+ /* a8 */ 0x8ea2c9e2, 0x0000e8c8, 0x8ea2c9d6, 0x8ea2c9d9,
+ /* ac */ 0x8ea2c9de, 0x8ea2c9d8, 0x8ea2c9d3, 0x8eaec6cf,
+ /* b0 */ 0x8eaec6d3, 0x00000000, 0x00000000, 0x8ea2c9da,
+ /* b4 */ 0x8ea2cffc, 0x0000eccb, 0x8ea2d0a1, 0x8ea2cffe,
+ /* b8 */ 0x8ea2d0a3, 0x8ea2d0a5, 0x8eaecbdc, 0x0000ecc9,
+ /* bc */ 0x8eaecbd8, 0x8ea2cffd, 0x8eaecbd4, 0x8ea2cffb,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x01506 ***/
+
+ /* 80 */ 0x8eaecbde, 0x8ea2d0a6, 0x8ea2d0a4, 0x8ea2d0a2,
+ /* 84 */ 0x8eaecbd6, 0x8ea2d0a8, 0x8eaecbda, 0x8ea2d0a7,
+ /* 88 */ 0x0000eccd, 0x0000ecc8, 0x8eaecbdb, 0x0000ecca,
+ /* 8c */ 0x0000eccc, 0x8eaecbdd, 0x8eaecbdf, 0x8ea2d0a9,
+ /* 90 */ 0x8ea2d6e1, 0x8eaed0d0, 0x8eaed0d3, 0x8ea2d6e0,
+ /* 94 */ 0x8ea2d6df, 0x8eaed0d1, 0x8ea2d6e2, 0x8ea2d6db,
+ /* 98 */ 0x8eaed0cf, 0x8ea2d6dc, 0x8ea2d6e4, 0x8ea2d6dd,
+ /* 9c */ 0x8eaed0d4, 0x0000f0ce, 0x8ea2d6e6, 0x8eaed0ce,
+ /* a0 */ 0x8ea2d6e5, 0x8ea2d6de, 0x8eaed0d6, 0x8ea2dcdd,
+ /* a4 */ 0x0000f3d1, 0x8ea2dcdb, 0x8ea2dce0, 0x8ea2dcdf,
+ /* a8 */ 0x8ea2d6e3, 0x8eaed4d0, 0x0000f3d0, 0x8eaed4ce,
+ /* ac */ 0x8ea2dcde, 0x8ea2dcda, 0x8ea2dce2, 0x8ea2dce1,
+ /* b0 */ 0x0000f3cf, 0x8eaed4d2, 0x8ea2dcdc, 0x8eaed4cf,
+ /* b4 */ 0x0000f0cf, 0x8eaed4d1, 0x00000000, 0x8eaed4d3,
+ /* b8 */ 0x0000f6c0, 0x8eaedab1, 0x8eaed7e1, 0x8eaed7de,
+ /* bc */ 0x8ea2e1cd, 0x8ea2e5c6, 0x8ea2e5c7, 0x8ea2e5c8,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01546 ***/
+
+ /* 80 */ 0x0000f9e7, 0x00000000, 0x8eaedcb6, 0x0000f9e8,
+ /* 84 */ 0x8eaedcb9, 0x8ea2e8ef, 0x8eaedcba, 0x8ea2ebd6,
+ /* 88 */ 0x8ea2ebd5, 0x8eaedea9, 0x8eaedfc2, 0x8ea2edc9,
+ /* 8c */ 0x8ea2edca, 0x8ea2efa4, 0x8ea2f0b5, 0x8eaee0f3,
+ /* 90 */ 0x0000c4cd, 0x0000c4ce, 0x00000000, 0x0000c4cf,
+ /* 94 */ 0x0000c5b6, 0x0000c6c5, 0x8ea2a2b3, 0x0000c7f3,
+ /* 98 */ 0x0000c7f4, 0x00000000, 0x0000c9f7, 0x0000c9f8,
+ /* 9c */ 0x0000c9f6, 0x0000c9f5, 0x00000000, 0x0000ccf5,
+ /* a0 */ 0x8eaea8c8, 0x00000000, 0x8ea2a6b6, 0x0000ccf7,
+ /* a4 */ 0x0000ccf6, 0x8ea2a6b7, 0x8eaee2dc, 0x8eaee4ea,
+ /* a8 */ 0x00000000, 0x0000d0e6, 0x8eaeacaf, 0x0000d5a1,
+ /* ac */ 0x8ea2aee7, 0x00000000, 0x8ea2b4f3, 0x00000000,
+ /* b0 */ 0x0000d9e9, 0x0000deec, 0x8ea2b4f2, 0x0000deeb,
+ /* b4 */ 0x8eaec0f1, 0x0000e8cd, 0x8eaec0f2, 0x8ea2c9e4,
+ /* b8 */ 0x0000f0d0, 0x8eaed0d7, 0x0000f3d2, 0x8ea2dce3,
+ /* bc */ 0x8eaedab4, 0x0000f9e9, 0x8eaedcbb, 0x0000fbdc,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01586 ***/
+
+ /* 80 */ 0x8eaea1bb, 0x8ea2a1d3, 0x8eaea2bd, 0x0000c6c6,
+ /* 84 */ 0x8ea2a1d4, 0x0000c7f7, 0x8eaea3d0, 0x0000c7f5,
+ /* 88 */ 0x0000c7f6, 0x0000c7f8, 0x00000000, 0x0000c9fa,
+ /* 8c */ 0x0000c9f9, 0x8eaea5da, 0x8ea2a3dc, 0x0000c9fb,
+ /* 90 */ 0x00000000, 0x00000000, 0x8ea2a3dd, 0x8ea2a6b8,
+ /* 94 */ 0x8eaea8cc, 0x8ea2a6b9, 0x8eaea8ca, 0x0000ccf8,
+ /* 98 */ 0x0000ccfa, 0x0000ccfc, 0x0000ccf9, 0x0000ccfd,
+ /* 9c */ 0x0000ccfb, 0x8eaea8ce, 0x8eaea8cb, 0x8eaea8cd,
+ /* a0 */ 0x00000000, 0x00000000, 0x0000d0ea, 0x0000d0e7,
+ /* a4 */ 0x0000d0e9, 0x0000d0eb, 0x0000d0e8, 0x8ea2aee8,
+ /* a8 */ 0x8ea2a9f8, 0x00000000, 0x00000000, 0x8eaeacb2,
+ /* ac */ 0x8ea2aeea, 0x8ea2aee9, 0x0000d5a7, 0x00000000,
+ /* b0 */ 0x0000d5a3, 0x00000000, 0x00000000, 0x0000d5a4,
+ /* b4 */ 0x0000d5a6, 0x0000d5a8, 0x0000d5a5, 0x8eaeb0d7,
+ /* b8 */ 0x0000d5aa, 0x0000d5a9, 0x00000000, 0x8eaeb0d6,
+ /* bc */ 0x8eaeb0d5, 0x00000000, 0x00000000, 0x0000d9ee,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x015c6 ***/
+
+ /* 80 */ 0x8ea2b4f5, 0x8ea2b4f4, 0x0000d9ed, 0x8eaeb5c1,
+ /* 84 */ 0x0000d9ec, 0x0000d9eb, 0x0000d9ef, 0x0000d9ea,
+ /* 88 */ 0x8eaeb5bf, 0x00000000, 0x8ea2bbb9, 0x8ea2bbb6,
+ /* 8c */ 0x0000deee, 0x8ea2bbb5, 0x8ea2bbba, 0x00000000,
+ /* 90 */ 0x0000def0, 0x8ea2bbb8, 0x0000deed, 0x0000deef,
+ /* 94 */ 0x8ea2bbb7, 0x8eaebafe, 0x8ea2c2ce, 0x8eaec0f4,
+ /* 98 */ 0x8ea2c2cf, 0x8ea2c2d0, 0x8eaec0f5, 0x8eaec0f6,
+ /* 9c */ 0x8eaec0f3, 0x8eaee3c5, 0x0000e8ce, 0x0000e8d6,
+ /* a0 */ 0x8ea2c9e5, 0x0000e8d0, 0x0000e8d4, 0x8ea2c9e6,
+ /* a4 */ 0x0000e8d5, 0x0000e8d1, 0x0000e8d2, 0x0000e8cf,
+ /* a8 */ 0x0000e8d3, 0x0000ecd0, 0x8ea2bbb4, 0x0000ecd1,
+ /* ac */ 0x0000eccf, 0x00000000, 0x0000ecce, 0x8ea2d6e7,
+ /* b0 */ 0x0000f0d1, 0x8ea2dce4, 0x8ea2dce5, 0x8eaedab5,
+ /* b4 */ 0x00000000, 0x0000f8b1, 0x0000f9ea, 0x8eaedeaa,
+ /* b8 */ 0x0000c4d0, 0x8eaea2be, 0x0000c7f9, 0x00000000,
+ /* bc */ 0x00000000, 0x8eaea5de, 0x8eaea5dc, 0x8eaea5dd,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x01606 ***/
+
+ /* 80 */ 0x8eaea8d0, 0x0000d0ec, 0x00000000, 0x8ea2aeeb,
+ /* 84 */ 0x0000d5ab, 0x8eaeb0d8, 0x8eaeb0d9, 0x0000d9f2,
+ /* 88 */ 0x0000d9f1, 0x0000d9f0, 0x0000def1, 0x0000def2,
+ /* 8c */ 0x8ea2bbbb, 0x0000e8d7, 0x0000f0d2, 0x0000c4d1,
+ /* 90 */ 0x8ea2a1bc, 0x0000c5b7, 0x8ea2a1d5, 0x8eaee2ca,
+ /* 94 */ 0x8eaea2bf, 0x8ea2a2b4, 0x0000c7fa, 0x00000000,
+ /* 98 */ 0x8eaea3d2, 0x8eaea8d1, 0x0000ccfe, 0x8eaeacb4,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaebba4, 0x8ea2c2d1,
+ /* a0 */ 0x8eaec0f8, 0x8eaee5a5, 0x0000c4d2, 0x00000000,
+ /* a4 */ 0x0000c5b8, 0x8ea2a2b5, 0x00000000, 0x00000000,
+ /* a8 */ 0x8ea2a3de, 0x00000000, 0x8ea2a3df, 0x8eaea5df,
+ /* ac */ 0x0000c9fc, 0x00000000, 0x00000000, 0x8eaeacb5,
+ /* b0 */ 0x8ea2bbbc, 0x0000def3, 0x00000000, 0x8ea2c2d2,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaed4d4, 0x0000f3d3,
+ /* b8 */ 0x0000c4d3, 0x0000c4e7, 0x0000c5b9, 0x8ea2a1d6,
+ /* bc */ 0x0000c6c7, 0x8eaea3d4, 0x0000caa2, 0x0000caa1,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01646 ***/
+
+ /* 80 */ 0x0000c9fd, 0x0000c9fe, 0x00000000, 0x00000000,
+ /* 84 */ 0x8ea2a6ba, 0x0000cda2, 0x0000cda3, 0x8ea2a6bb,
+ /* 88 */ 0x0000cda1, 0x8eaea8d4, 0x8eaea8d5, 0x0000d0f0,
+ /* 8c */ 0x8ea2a9f9, 0x0000d0ef, 0x0000d0ed, 0x0000d0ee,
+ /* 90 */ 0x0000d5ae, 0x0000d5ac, 0x8eaeb0da, 0x8eaeb0db,
+ /* 94 */ 0x8ea2aeed, 0x0000d5ad, 0x8ea2aeec, 0x8eaee4eb,
+ /* 98 */ 0x0000d5a2, 0x8ea2b4f6, 0x00000000, 0x8eaeb5c3,
+ /* 9c */ 0x0000d9f4, 0x0000d9f5, 0x8eaebba6, 0x8eaebba5,
+ /* a0 */ 0x0000d9f3, 0x8eaeb5c4, 0x0000e8d8, 0x8ea2c9e7,
+ /* a4 */ 0x0000ecd2, 0x0000ecd3, 0x00000000, 0x8ea2d0aa,
+ /* a8 */ 0x0000f3d4, 0x8ea2e1ce, 0x8ea2e1cf, 0x8eaedab8,
+ /* ac */ 0x0000fae8, 0x8ea2f0b6, 0x8ea2a1ab, 0x0000c5ba,
+ /* b0 */ 0x00000000, 0x0000c4d4, 0x00000000, 0x8ea2a1d8,
+ /* b4 */ 0x8ea2a1d7, 0x00000000, 0x00000000, 0x8eaee4ec,
+ /* b8 */ 0x8eaea3d5, 0x0000c7fb, 0x8ea2a2b7, 0x8ea2a2b8,
+ /* bc */ 0x8ea2a2b6, 0x00000000, 0x8ea2a2b9, 0x00000000,
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01686 ***/
+
+ /* 80 */ 0x8eaea3da, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaea5e1, 0x8eaea5e6, 0x8ea2a3e7, 0x00000000,
+ /* 88 */ 0x8ea2a3e2, 0x8ea2a3e4, 0x8ea2a3e6, 0x8ea2a3e3,
+ /* 8c */ 0x0000caa6, 0x8ea2a3e0, 0x8eaea5e2, 0x8ea2a3e1,
+ /* 90 */ 0x0000caa3, 0x0000caa4, 0x8ea2a3e5, 0x8ea2a3e8,
+ /* 94 */ 0x0000caa5, 0x8ea2a3e9, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x8eaea5e3, 0x8ea2a6c9, 0x8eaea8dd, 0x8ea2a6c3,
+ /* a0 */ 0x8ea2a6be, 0x0000cda5, 0x8ea2a6c6, 0x8ea2a6c4,
+ /* a4 */ 0x8ea2a6bd, 0x8ea2a6ca, 0x8ea2a6cd, 0x8ea2a6c8,
+ /* a8 */ 0x8ea2a6c1, 0x0000cda7, 0x8ea2a6c7, 0x0000cda8,
+ /* ac */ 0x8ea2a6c2, 0x8ea2a6c5, 0x8ea2a6bc, 0x8ea2a6c0,
+ /* b0 */ 0x8ea2a6cc, 0x0000cda9, 0x00000000, 0x0000cdaa,
+ /* b4 */ 0x8eaea8de, 0x8ea2a6bf, 0x8ea2a6cb, 0x0000cda4,
+ /* b8 */ 0x0000cda6, 0x8eaea8dc, 0x8eaea8df, 0x8eaea8d7,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x016c5 ***/
+
+ /* 80 */ 0x00000000, 0x8eaea8d8, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x8ea2aaac, 0x8ea2aaa5,
+ /* 88 */ 0x8ea2aaab, 0x8ea2aaa4, 0x8ea2aaa6, 0x8ea2a9fe,
+ /* 8c */ 0x8ea2a9fc, 0x8eaeacbf, 0x8ea2aaad, 0x8ea2aaaa,
+ /* 90 */ 0x8ea2a9fa, 0x8eaeacbb, 0x0000d0f2, 0x8ea2aaa8,
+ /* 94 */ 0x8ea2aaa9, 0x8eaee4ed, 0x8ea2aaa7, 0x8ea2a9fd,
+ /* 98 */ 0x8ea2a9fb, 0x0000d0f1, 0x8ea2aaa3, 0x8ea2aaa1,
+ /* 9c */ 0x8eaeacbc, 0x8eaeacc2, 0x8ea2aaa2, 0x8ea2aaae,
+ /* a0 */ 0x00000000, 0x8eaeacbe, 0x8eaeacc1, 0x00000000,
+ /* a4 */ 0x00000000, 0x8eaeacc3, 0x8eaeacbd, 0x00000000,
+ /* a8 */ 0x0000d5b3, 0x8eaeb0e3, 0x0000d5b2, 0x8eaeb0df,
+ /* ac */ 0x8ea2aeee, 0x0000d5af, 0x8ea2aef0, 0x8eaeb0e4,
+ /* b0 */ 0x0000d5b4, 0x8ea2aef1, 0x00000000, 0x8eaeb0e1,
+ /* b4 */ 0x0000d5b7, 0x8eaeb0e2, 0x0000d5b5, 0x8ea2aef2,
+ /* b8 */ 0x8ea2aaaf, 0x8ea2aef4, 0x8eaeb0de, 0x0000d5b1,
+ /* bc */ 0x8eaee2f1, 0x0000d5b0, 0x8eaee2f2, 0x8ea2aeef,
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x01705 ***/
+
+ /* 80 */ 0x8ea2aef3, 0x0000d5b6, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x0000d9f7, 0x0000d9f6,
+ /* 88 */ 0x8eaeb5cb, 0x8eaeb5c8, 0x8eaeb5c7, 0x8ea2b4f8,
+ /* 8c */ 0x8ea2b4fc, 0x8ea2b4fe, 0x0000d9f8, 0x8ea2b5a3,
+ /* 90 */ 0x8eaeb5d1, 0x0000d9fc, 0x8ea2b5a5, 0x8eaeb5d2,
+ /* 94 */ 0x0000d9fe, 0x8eaeb5cf, 0x0000d9fa, 0x0000daa4,
+ /* 98 */ 0x8eaeb5d5, 0x0000daa1, 0x8ea2b4fa, 0x0000d9f9,
+ /* 9c */ 0x8eaebbab, 0x8ea2b4f9, 0x8ea2b4f7, 0x8ea2b5a7,
+ /* a0 */ 0x8ea2b4fb, 0x8eaeb5c6, 0x0000d9fb, 0x8ea2b5a6,
+ /* a4 */ 0x0000daa2, 0x8ea2b5a2, 0x8ea2b5a1, 0x0000daa3,
+ /* a8 */ 0x8ea2b4fd, 0x0000d9fd, 0x8eaeb5ce, 0x00000000,
+ /* ac */ 0x8eaeb5ca, 0x00000000, 0x8ea2b5a8, 0x8eaeb5d4,
+ /* b0 */ 0x8ea2b5a4, 0x8ea2bbcb, 0x8ea2bbd2, 0x8ea2bbc7,
+ /* b4 */ 0x0000def6, 0x8ea2bbc3, 0x8ea2bbd3, 0x8ea2bbbd,
+ /* b8 */ 0x8ea2bbd0, 0x8ea2bbce, 0x8ea2bbc8, 0x8eaebbb6,
+ /* bc */ 0x8ea2bbd1, 0x8ea2bbca, 0x8eaebba8, 0x8ea2bbc2,
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01745 ***/
+
+ /* 80 */ 0x8ea2bbd4, 0x8ea2bbc0, 0x8ea2bbcd, 0x8ea2bbbe,
+ /* 84 */ 0x8eaebba7, 0x8ea2bbd5, 0x8eaebbb7, 0x0000def7,
+ /* 88 */ 0x8eaebbaa, 0x8ea2bbcf, 0x8ea2c2d5, 0x8ea2bbc1,
+ /* 8c */ 0x0000def4, 0x8eaebbae, 0x8ea2bbc5, 0x8eaebbb4,
+ /* 90 */ 0x0000def5, 0x8ea2bbc4, 0x8ea2bbc9, 0x8eaebbb3,
+ /* 94 */ 0x00000000, 0x8ea2bbc6, 0x00000000, 0x8eaebbb1,
+ /* 98 */ 0x00000000, 0x8ea2bbcc, 0x00000000, 0x8eaebbad,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2c2d9, 0x00000000,
+ /* a0 */ 0x8eaec1a1, 0x00000000, 0x8ea2c2dc, 0x8ea2c2d4,
+ /* a4 */ 0x8eaec0fc, 0x8ea2c2d6, 0x8eaec0fa, 0x8ea2c2db,
+ /* a8 */ 0x8ea2c2da, 0x0000e3e9, 0x00000000, 0x8ea2bbbf,
+ /* ac */ 0x8ea2c2d8, 0x8eaec0f9, 0x8eaec0fd, 0x0000e3ea,
+ /* b0 */ 0x00000000, 0x8ea2c2d3, 0x8ea2c2d7, 0x00000000,
+ /* b4 */ 0x00000000, 0x8eaee4ee, 0x00000000, 0x8ea2c9ee,
+ /* b8 */ 0x8eaec6dc, 0x8ea2c9f5, 0x8ea2c9ec, 0x8eaec6d4,
+ /* bc */ 0x8ea2c9f3, 0x8ea2c9ea, 0x8ea2c9f2, 0x8ea2c9f6,
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01785 ***/
+
+ /* 80 */ 0x8ea2c9e9, 0x8ea2c9ed, 0x8ea2c9e8, 0x8eaec6d6,
+ /* 84 */ 0x0000e8d9, 0x00000000, 0x8ea2c9eb, 0x0000e8da,
+ /* 88 */ 0x8ea2c9f1, 0x8ea2c9f0, 0x8ea2c9ef, 0x8eaec6d9,
+ /* 8c */ 0x8eaec6da, 0x8ea2c9f4, 0x8eaee4ef, 0x8eaecbe5,
+ /* 90 */ 0x8eaecbe6, 0x8eaecbe3, 0x8ea2d0ae, 0x8ea2d0b0,
+ /* 94 */ 0x0000ecd5, 0x8ea2d0b1, 0x8eaecbeb, 0x8ea2d0ac,
+ /* 98 */ 0x8eaecbe7, 0x8ea2d0ab, 0x8ea2d0b5, 0x8eaecbe9,
+ /* 9c */ 0x8ea2d0b3, 0x0000ecd4, 0x8ea2d0b6, 0x8ea2d0ad,
+ /* a0 */ 0x8ea2d0b2, 0x8ea2d0b4, 0x8ea2d0af, 0x8eaecbea,
+ /* a4 */ 0x8eaecbe8, 0x8eaee4f0, 0x8eaed0d8, 0x8ea2d6eb,
+ /* a8 */ 0x8ea2d6f0, 0x8ea2d6ea, 0x8ea2d6ef, 0x8eaed0db,
+ /* ac */ 0x8ea2d6e8, 0x8ea2d6f2, 0x8ea2d6ee, 0x8ea2d6f3,
+ /* b0 */ 0x8ea2d6ed, 0x8ea2d6e9, 0x8ea2d6f1, 0x8eaed0da,
+ /* b4 */ 0x8ea2d6f4, 0x8ea2d6ec, 0x8eaee4f1, 0x8ea2dce6,
+ /* b8 */ 0x0000f3d8, 0x8eaed4d7, 0x0000f3d6, 0x8eaed4d9,
+ /* bc */ 0x0000f3d5, 0x0000f3d7, 0x8eaed4d5, 0x8eaee4f2,
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x017c5 ***/
+
+ /* 80 */ 0x8ea2e1d0, 0x8eaed7e2, 0x8ea2e4be, 0x8ea2e5c9,
+ /* 84 */ 0x8eaedab9, 0x00000000, 0x8ea2e8f0, 0x8ea2e8f1,
+ /* 88 */ 0x8eaedcbd, 0x0000f9eb, 0x8eaedcbc, 0x8ea2ebd7,
+ /* 8c */ 0x8eaedcbe, 0x0000fae9, 0x00000000, 0x8ea2ebd8,
+ /* 90 */ 0x8eaedead, 0x8ea2edcc, 0x0000fbde, 0x8eaedfc3,
+ /* 94 */ 0x0000fbdd, 0x8ea2edcb, 0x0000fcb5, 0x8eaee0b0,
+ /* 98 */ 0x8ea2efa5, 0x00000000, 0x00000000, 0x8eaea1bc,
+ /* 9c */ 0x00000000, 0x0000c4d5, 0x0000c7fc, 0x8ea2a2ba,
+ /* a0 */ 0x8ea2a3ea, 0x0000cbd6, 0x0000daa5, 0x8eaeb5d7,
+ /* a4 */ 0x8eaecbec, 0x0000c4d6, 0x0000c6ca, 0x0000c6c9,
+ /* a8 */ 0x0000c6c8, 0x00000000, 0x00000000, 0x0000caa7,
+ /* ac */ 0x00000000, 0x00000000, 0x0000d5b8, 0x00000000,
+ /* b0 */ 0x8ea2c2dd, 0x0000c4d7, 0x0000c4d8, 0x0000c4d9,
+ /* b4 */ 0x0000c5bb, 0x8eaea5e7, 0x8eaea8e0, 0x0000d0f3,
+ /* b8 */ 0x00000000, 0x8ea2aab0, 0x8eaeacc5, 0x8eaeacc4,
+ /* bc */ 0x00000000, 0x0000def8, 0x0000c4da, 0x8ea2a1bd,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01805 ***/
+
+ /* 80 */ 0x8eaea1e3, 0x00000000, 0x0000c6cb, 0x0000c6cc,
+ /* 84 */ 0x8ea2a1d9, 0x00000000, 0x0000c7fd, 0x00000000,
+ /* 88 */ 0x8eaea3dc, 0x8eaea5e8, 0x8ea2a3eb, 0x8eaea5eb,
+ /* 8c */ 0x0000caa8, 0x00000000, 0x8ea2a3ec, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000cdb0, 0x8eaea8e2, 0x8eaea8e1,
+ /* 94 */ 0x8ea2a6cf, 0x0000cdae, 0x0000cdad, 0x8ea2a6ce,
+ /* 98 */ 0x0000cdab, 0x8ea2a6d0, 0x0000cdac, 0x0000cdaf,
+ /* 9c */ 0x00000000, 0x0000d0f4, 0x8eaeacc6, 0x0000d0f6,
+ /* a0 */ 0x8ea2aab4, 0x8ea2aab1, 0x8ea2aab2, 0x8ea2aab3,
+ /* a4 */ 0x8ea2aab5, 0x0000d0f5, 0x00000000, 0x00000000,
+ /* a8 */ 0x8ea2aef6, 0x8ea2aef5, 0x8eaeb0e6, 0x0000d5ba,
+ /* ac */ 0x8eaeb0e9, 0x0000d5b9, 0x8eaeb0e8, 0x8eaeb0ea,
+ /* b0 */ 0x8eaeb0e7, 0x00000000, 0x8eaeb5db, 0x0000daa8,
+ /* b4 */ 0x8ea2b5aa, 0x8eaeb5d9, 0x0000daa7, 0x0000daa9,
+ /* b8 */ 0x0000daa6, 0x8eaeb5d8, 0x8eaeb5da, 0x00000000,
+ /* bc */ 0x00000000, 0x0000defa, 0x8ea2b5a9, 0x00000000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01845 ***/
+
+ /* 80 */ 0x0000defb, 0x8ea2bbd7, 0x8eaeb9f9, 0x0000defc,
+ /* 84 */ 0x8ea2bbd6, 0x0000def9, 0x8eaebbba, 0x8eaebbbb,
+ /* 88 */ 0x8eaebbbd, 0x00000000, 0x8ea2c2e0, 0x8ea2c2e2,
+ /* 8c */ 0x0000e3eb, 0x8ea2c2e1, 0x8ea2c2df, 0x8ea2c2de,
+ /* 90 */ 0x00000000, 0x00000000, 0x8eaec6dd, 0x8ea2c9f9,
+ /* 94 */ 0x0000e8df, 0x0000e8dd, 0x00000000, 0x0000e8de,
+ /* 98 */ 0x8ea2c9f7, 0x8ea2c9f8, 0x8eaecbed, 0x0000e8db,
+ /* 9c */ 0x8ea2d0ba, 0x8ea2d0b8, 0x8eaecbf0, 0x0000ecd7,
+ /* a0 */ 0x8ea2d0b9, 0x0000ecd8, 0x0000ecd6, 0x0000e8dc,
+ /* a4 */ 0x00000000, 0x8eaee4f3, 0x8ea2d6f7, 0x8ea2d6f5,
+ /* a8 */ 0x8ea2d6f6, 0x8ea2d0b7, 0x8ea2dce8, 0x0000f3d9,
+ /* ac */ 0x8ea2dce7, 0x8ea2e1d1, 0x8ea2e1d2, 0x8ea2d6f8,
+ /* b0 */ 0x8ea2e5ca, 0x8eaee6f7, 0x0000c4db, 0x0000c6cd,
+ /* b4 */ 0x0000c8a1, 0x8ea2a2bb, 0x0000c7fe, 0x8eaea8e3,
+ /* b8 */ 0x0000cdb1, 0x0000e3ec, 0x8eaea1bd, 0x0000c5bc,
+ /* bc */ 0x0000c6ce, 0x0000d0f7, 0x0000defd, 0x8eaea1be,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01885 ***/
+
+ /* 80 */ 0x8ea2a1da, 0x8eaea2c7, 0x8ea2a1db, 0x8eaea2c8,
+ /* 84 */ 0x8ea2a2bc, 0x8eaee6f8, 0x00000000, 0x0000caaa,
+ /* 88 */ 0x8ea2a3f0, 0x8ea2a3ee, 0x0000caab, 0x8ea2a3ed,
+ /* 8c */ 0x8ea2a3ef, 0x8ea2a3f1, 0x00000000, 0x0000caa9,
+ /* 90 */ 0x8eaea5ee, 0x00000000, 0x8eaea5ed, 0x00000000,
+ /* 94 */ 0x00000000, 0x0000cdb5, 0x0000cdb6, 0x0000cdb3,
+ /* 98 */ 0x8eaea8e5, 0x8eaea8e7, 0x0000cdb2, 0x8ea2aab9,
+ /* 9c */ 0x0000cdb4, 0x8eaea8e8, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000d0f8, 0x8eaeacc8, 0x8ea2aab8, 0x8ea2aaba,
+ /* a4 */ 0x8ea2aab7, 0x8ea2aabb, 0x0000d0f9, 0x0000d5bd,
+ /* a8 */ 0x8ea2aef7, 0x8eaeb0ec, 0x8ea2aef9, 0x0000d5bb,
+ /* ac */ 0x8ea2aefa, 0x0000d5bc, 0x8ea2aef8, 0x8eaeb0eb,
+ /* b0 */ 0x8ea2aab6, 0x8ea2b5ab, 0x8ea2b5ae, 0x8ea2b5af,
+ /* b4 */ 0x8ea2b5ac, 0x0000daad, 0x0000daac, 0x0000daaa,
+ /* b8 */ 0x0000daab, 0x8ea2b5ad, 0x8eaeb5e1, 0x8eaeb5e0,
+ /* bc */ 0x00000000, 0x8eaebbbf, 0x0000daae, 0x8eaebbc0,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x018c5 ***/
+
+ /* 80 */ 0x8eaebbbe, 0x0000dfa1, 0x0000dfa2, 0x00000000,
+ /* 84 */ 0x0000dfa3, 0x8ea2c2e3, 0x8ea2c2e5, 0x8ea2c2e7,
+ /* 88 */ 0x0000e3ee, 0x0000e3ed, 0x0000defe, 0x8ea2c2e6,
+ /* 8c */ 0x8ea2c2e4, 0x8eaee4f4, 0x8ea2c9fd, 0x8eaec6e1,
+ /* 90 */ 0x8eaec6e0, 0x8ea2c9fb, 0x8ea2caa3, 0x0000e8e0,
+ /* 94 */ 0x8ea2caa4, 0x8ea2caa1, 0x0000e8e1, 0x8ea2c9fc,
+ /* 98 */ 0x8ea2c9fa, 0x8ea2caa2, 0x0000ecda, 0x8ea2d0bc,
+ /* 9c */ 0x8ea2c9fe, 0x0000ecdc, 0x8ea2d0bd, 0x0000ecdb,
+ /* a0 */ 0x0000ecde, 0x8ea2d0be, 0x0000ecd9, 0x0000ecdd,
+ /* a4 */ 0x00000000, 0x8ea2d6fd, 0x8ea2d6fb, 0x8ea2d6fa,
+ /* a8 */ 0x8ea2d6fc, 0x8ea2d6f9, 0x8eaed0dc, 0x00000000,
+ /* ac */ 0x0000f8b3, 0x8eaee4f5, 0x8ea2e8f2, 0x8ea2e8f3,
+ /* b0 */ 0x8eaedcbf, 0x8ea2ebd9, 0x8ea2edcd, 0x0000fda2,
+ /* b4 */ 0x8eaea1bf, 0x8eaea3e1, 0x0000cdb7, 0x0000caac,
+ /* b8 */ 0x8eaea8e9, 0x8eaea8eb, 0x0000d0fa, 0x8eaeaccc,
+ /* bc */ 0x8eaeaccb, 0x8eaeb0ee, 0x0000c4dc, 0x0000c5bd,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01905 ***/
+
+ /* 80 */ 0x00000000, 0x0000c6cf, 0x8ea2a2bd, 0x8eaea5ef,
+ /* 84 */ 0x0000caad, 0x8ea2a3f2, 0x8eaea8ed, 0x8ea2aabc,
+ /* 88 */ 0x0000d0fb, 0x00000000, 0x0000e8e2, 0x0000c4dd,
+ /* 8c */ 0x8eaea1e4, 0x8eaea2c9, 0x8eaea3e2, 0x0000c8a2,
+ /* 90 */ 0x00000000, 0x8eaebbc2, 0x0000e3ef, 0x0000c4de,
+ /* 94 */ 0x0000c5be, 0x0000c5bf, 0x00000000, 0x0000c6d1,
+ /* 98 */ 0x0000c6d0, 0x00000000, 0x8ea2a2be, 0x0000c8a3,
+ /* 9c */ 0x00000000, 0x8ea2a3f3, 0x8eaea5f1, 0x0000caae,
+ /* a0 */ 0x00000000, 0x8eaea8ee, 0x8ea2a6d2, 0x8ea2a6d3,
+ /* a4 */ 0x8ea2a6d4, 0x8eaea8f0, 0x0000cdb8, 0x0000cdb9,
+ /* a8 */ 0x8ea2a6d1, 0x0000cdba, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x0000d0fc, 0x8ea2aabd, 0x8eaeaccd,
+ /* b0 */ 0x8ea2aefc, 0x0000d5be, 0x8eaeb0ef, 0x8ea2aefb,
+ /* b4 */ 0x8eaeb5e2, 0x0000daaf, 0x8ea2b5b0, 0x0000dab0,
+ /* b8 */ 0x8ea2b5b1, 0x8eaeb5e3, 0x8eaebbc7, 0x8eaebbc5,
+ /* bc */ 0x0000dfa4, 0x00000000, 0x8eaebbc4, 0x00000000,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01945 ***/
+
+ /* 80 */ 0x8ea2c2e8, 0x00000000, 0x8eaec1a2, 0x8ea2caa6,
+ /* 84 */ 0x8ea2caa5, 0x00000000, 0x0000e8e3, 0x00000000,
+ /* 88 */ 0x0000ecdf, 0x8ea2d0bf, 0x0000f0d3, 0x8ea2d6fe,
+ /* 8c */ 0x0000f3da, 0x8eaed7e3, 0x0000fbdf, 0x8ea2efa7,
+ /* 90 */ 0x8eaea1c0, 0x8eaea1c1, 0x8eaea2ca, 0x8eaea3d1,
+ /* 94 */ 0x8ea2a6d5, 0x8eaea8f1, 0x8ea2aabe, 0x0000dab1,
+ /* 98 */ 0x8ea2bbd8, 0x0000e3f0, 0x8eaec1a3, 0x8eaed0de,
+ /* 9c */ 0x00000000, 0x8eaed7e4, 0x0000f6c1, 0x00000000,
+ /* a0 */ 0x8eaee1e4, 0x8eaea1c2, 0x0000cab0, 0x8eaea5f2,
+ /* a4 */ 0x0000caaf, 0x0000d0fd, 0x8eaeacd0, 0x8ea2aefd,
+ /* a8 */ 0x00000000, 0x0000dab3, 0x0000dda9, 0x0000dab4,
+ /* ac */ 0x0000dab2, 0x0000dfa5, 0x8eaec1a4, 0x8ea2caa7,
+ /* b0 */ 0x0000e8e4, 0x0000ece0, 0x8eaedfc5, 0x8ea2a1ac,
+ /* b4 */ 0x8ea2a2bf, 0x00000000, 0x8ea2a3f5, 0x0000cab1,
+ /* b8 */ 0x8ea2a3f4, 0x0000cab2, 0x00000000, 0x00000000,
+ /* bc */ 0x0000cdbe, 0x8ea2a6d8, 0x8ea2a6d7, 0x0000cdbd,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01985 ***/
+
+ /* 80 */ 0x0000cdbb, 0x0000cdbc, 0x8ea2a6d6, 0x8eaea8f6,
+ /* 84 */ 0x8eaea8f5, 0x0000d1a1, 0x8ea2aabf, 0x0000d1a4,
+ /* 88 */ 0x0000d0fe, 0x0000d1a6, 0x0000d1a2, 0x0000d1a3,
+ /* 8c */ 0x0000d1a5, 0x8eaee2e4, 0x8eaeb0f0, 0x8eaeb0f2,
+ /* 90 */ 0x0000d5c1, 0x0000d5c0, 0x0000d5bf, 0x8eaeb0f1,
+ /* 94 */ 0x8eaee4f6, 0x00000000, 0x8ea2b5b3, 0x0000dab5,
+ /* 98 */ 0x0000dab8, 0x0000dab6, 0x8eaee4f7, 0x8ea2b5b2,
+ /* 9c */ 0x0000dabb, 0x00000000, 0x0000dab7, 0x8ea2b5b4,
+ /* a0 */ 0x0000daba, 0x0000dab9, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x8ea2bbda, 0x8ea2bbd9, 0x8eaebbcb,
+ /* a8 */ 0x0000dfa8, 0x0000dfa6, 0x0000dfa7, 0x8ea2bbdb,
+ /* ac */ 0x0000e3f1, 0x8ea2c2ea, 0x0000e3f2, 0x8ea2c2e9,
+ /* b0 */ 0x00000000, 0x00000000, 0x8ea2d0c0, 0x8eaec6e3,
+ /* b4 */ 0x8eaec6e4, 0x0000ece2, 0x8ea2caa8, 0x0000ece1,
+ /* b8 */ 0x8eaecbf2, 0x0000e8e5, 0x8eaee4f8, 0x8ea2d7a2,
+ /* bc */ 0x8ea2d7a1, 0x0000f3db, 0x8ea2dce9, 0x8ea2e5cb,
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x019c5 ***/
+
+ /* 80 */ 0x8ea2e8f4, 0x8ea2e8f5, 0x8eaedeaf, 0x0000c5c0,
+ /* 84 */ 0x00000000, 0x0000c6d2, 0x00000000, 0x8eaea2cd,
+ /* 88 */ 0x8eaee2d1, 0x8ea2a1dc, 0x8eaea2cc, 0x00000000,
+ /* 8c */ 0x0000cab4, 0x0000cab6, 0x8eaea5f8, 0x8ea2a2c2,
+ /* 90 */ 0x8ea2a3f8, 0x8ea2a3f7, 0x8ea2a3f6, 0x8eaea3e6,
+ /* 94 */ 0x8ea2a2c1, 0x8ea2a2c0, 0x0000c8a5, 0x0000cab5,
+ /* 98 */ 0x0000cab3, 0x0000c8a4, 0x8eaea3e7, 0x8eaea3e9,
+ /* 9c */ 0x8eaea5f7, 0x0000cdbf, 0x8ea2a6d9, 0x8eaea5fb,
+ /* a0 */ 0x0000cdc0, 0x8ea2a3fd, 0x00000000, 0x8ea2a4a1,
+ /* a4 */ 0x8ea2a3fe, 0x8ea2a6da, 0x8eaea5f6, 0x8eaea5f4,
+ /* a8 */ 0x8ea2a3fa, 0x8eaea8fe, 0x0000caba, 0x0000cab8,
+ /* ac */ 0x8eaea5fc, 0x8ea2a3f9, 0x8ea2a3fb, 0x8ea2a4a3,
+ /* b0 */ 0x8eaea6a2, 0x0000cab7, 0x8eaea6a1, 0x8ea2a3fc,
+ /* b4 */ 0x8ea2a4a7, 0x0000cdc2, 0x8eaea5fd, 0x8ea2a4a4,
+ /* b8 */ 0x0000cab9, 0x8eaea6a3, 0x8ea2a4a2, 0x8ea2a4a5,
+ /* bc */ 0x8eaea5fa, 0x0000cdc1, 0x8eaea5f5, 0x0000cdc3,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01a05 ***/
+
+ /* 80 */ 0x8ea2a4a6, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaea8f8,
+ /* 88 */ 0x8eaea9a2, 0x8ea2a6ee, 0x8ea2a6e1, 0x8ea2a6df,
+ /* 8c */ 0x8ea2a6ed, 0x8ea2a6e8, 0x0000d1ab, 0x0000cdc4,
+ /* 90 */ 0x8ea2a6e9, 0x8ea2a6ec, 0x0000d1a7, 0x8ea2a6eb,
+ /* 94 */ 0x0000cdc5, 0x0000cdca, 0x0000cdc8, 0x8ea2a6e2,
+ /* 98 */ 0x8eaee2e6, 0x8ea2a6dd, 0x8ea2a6e4, 0x0000cdcf,
+ /* 9c */ 0x8ea2a6ef, 0x0000d1a8, 0x8ea2a6e5, 0x00000000,
+ /* a0 */ 0x0000d1a9, 0x0000cdcb, 0x8ea2a6e7, 0x8eaeacda,
+ /* a4 */ 0x8ea2aace, 0x0000d1aa, 0x8ea2a6dc, 0x0000cdcc,
+ /* a8 */ 0x0000d1ac, 0x0000cdcd, 0x0000cdc9, 0x0000cdce,
+ /* ac */ 0x8ea2a6e6, 0x8ea2a6db, 0x8ea2a6ea, 0x0000cdc6,
+ /* b0 */ 0x8eaea8f7, 0x8eaeacdb, 0x8ea2a6de, 0x8ea2a6e3,
+ /* b4 */ 0x8ea2a6e0, 0x0000cdc7, 0x8eaea8fa, 0x8ea2aac0,
+ /* b8 */ 0x00000000, 0x8ea2aac1, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x8eaea9a1, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e681xx - offset 0x01a45 ***/
+
+ /* 80 */ 0x8ea2aacb, 0x8ea2afa3, 0x8ea2aacc, 0x0000d1b2,
+ /* 84 */ 0x8ea2aacf, 0x8ea2aac5, 0x0000d1b1, 0x8ea2aac7,
+ /* 88 */ 0x8eaee2e7, 0x8ea2aac8, 0x8eaeace0, 0x8eaeb0f9,
+ /* 8c */ 0x8ea2aaca, 0x0000d1ad, 0x8eaeacd6, 0x8eaeb0f3,
+ /* 90 */ 0x0000d5c5, 0x8eaeacd7, 0x8eaeacdd, 0x8ea2aac6,
+ /* 94 */ 0x8ea2aac2, 0x0000d5c6, 0x8eaeb0fe, 0x00000000,
+ /* 98 */ 0x8ea2aad0, 0x0000d5c2, 0x8ea2afa1, 0x8ea2aac9,
+ /* 9c */ 0x8eaeacd4, 0x8ea2aefe, 0x8ea2aac4, 0x8ea2aacd,
+ /* a0 */ 0x8eaeacdf, 0x8eaeace1, 0x0000d1b0, 0x0000d5c3,
+ /* a4 */ 0x0000d1b6, 0x0000d5c4, 0x8ea2aad1, 0x8ea2afa2,
+ /* a8 */ 0x0000d1af, 0x0000d5c8, 0x0000d1b5, 0x0000d1b4,
+ /* ac */ 0x0000d1b3, 0x0000d5c7, 0x8ea2aad2, 0x0000d5c9,
+ /* b0 */ 0x0000d1ae, 0x00000000, 0x8ea2aac3, 0x8eaeb0fa,
+ /* b4 */ 0x8eaeb0f8, 0x8eaeb0fb, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x8eaeacdc, 0x00000000, 0x8eaeb0f6, 0x0000dabc,
+
+ /*** Three byte table, leaf: e682xx - offset 0x01a85 ***/
+
+ /* 80 */ 0x8ea2afa6, 0x8ea2afa8, 0x00000000, 0x8ea2afaa,
+ /* 84 */ 0x0000d5ca, 0x0000d5d0, 0x8ea2b5b7, 0x8ea2afae,
+ /* 88 */ 0x8ea2afa5, 0x0000dabe, 0x8ea2b5b5, 0x8eaeb1a2,
+ /* 8c */ 0x0000d5cf, 0x0000d5cd, 0x8ea2afb0, 0x00000000,
+ /* 90 */ 0x8ea2b5b6, 0x00000000, 0x8ea2afa7, 0x8eaeb1a5,
+ /* 94 */ 0x0000d5ce, 0x8ea2afab, 0x0000d5d1, 0x8ea2afad,
+ /* 98 */ 0x8eaeb5e8, 0x8eaeb0f4, 0x0000d5cc, 0x8ea2afac,
+ /* 9c */ 0x8ea2afaf, 0x8ea2afa9, 0x8eaeb1a7, 0x0000d5cb,
+ /* a0 */ 0x0000dabf, 0x8eaeb5f1, 0x8ea2afa4, 0x0000dabd,
+ /* a4 */ 0x8eaeb5f2, 0x00000000, 0x8eaeb1a3, 0x8eaeb1a8,
+ /* a8 */ 0x0000dac0, 0x8eaeb1a1, 0x8eaeb5ef, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaeb1a6, 0x00000000,
+ /* b0 */ 0x8ea2b5b9, 0x8ea2b5c2, 0x0000dfab, 0x8eaebbd4,
+ /* b4 */ 0x0000dac2, 0x0000dac7, 0x0000dfac, 0x8ea2b5c4,
+ /* b8 */ 0x0000dace, 0x8ea2bbdd, 0x8ea2b5ba, 0x0000dac6,
+ /* bc */ 0x0000dac9, 0x0000dac4, 0x8ea2b5b8, 0x8ea2b5c6,
+
+ /*** Three byte table, leaf: e683xx - offset 0x01ac5 ***/
+
+ /* 80 */ 0x8ea2b5c9, 0x8ea2bbec, 0x00000000, 0x8ea2b5c7,
+ /* 84 */ 0x8ea2bbe1, 0x0000dac5, 0x0000dacc, 0x0000dad0,
+ /* 88 */ 0x8ea2b5c1, 0x8ea2bbdc, 0x8ea2b5c5, 0x0000dac1,
+ /* 8c */ 0x8ea2bbde, 0x8ea2b5c8, 0x8ea2bbe0, 0x8ea2b5bd,
+ /* 90 */ 0x8eaeb5ea, 0x0000dfa9, 0x8eaebbd6, 0x8ea2b5bb,
+ /* 94 */ 0x8ea2b5bc, 0x0000dacb, 0x8eaebbd5, 0x8eaeb5ee,
+ /* 98 */ 0x0000daca, 0x8ea2b5bf, 0x0000dacf, 0x8ea2b5c3,
+ /* 9c */ 0x0000dac8, 0x8ea2b5c0, 0x8eaeb5f9, 0x0000dacd,
+ /* a0 */ 0x0000dfad, 0x0000dfaa, 0x8ea2bbdf, 0x8eaebbd8,
+ /* a4 */ 0x8ea2b5be, 0x8eaebbd9, 0x0000dac3, 0x8eaeb5f6,
+ /* a8 */ 0x00000000, 0x8eaebbda, 0x8eaebbcd, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaeb5f4, 0x00000000,
+ /* b0 */ 0x0000dfb2, 0x0000dfb6, 0x8ea2bbe3, 0x0000e3f7,
+ /* b4 */ 0x0000dfb4, 0x8ea2bbe7, 0x0000dfb8, 0x8ea2c2eb,
+ /* b8 */ 0x8ea2bbe9, 0x0000e3f9, 0x0000dfb0, 0x0000dfb3,
+ /* bc */ 0x8ea2bbea, 0x8eaebbde, 0x8ea2bbeb, 0x8ea2bbf1,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01b05 ***/
+
+ /* 80 */ 0x0000dfba, 0x0000e3fa, 0x00000000, 0x8ea2bbed,
+ /* 84 */ 0x8ea2bbf2, 0x8ea2bbe6, 0x0000e4a6, 0x8eaebbcf,
+ /* 88 */ 0x0000e3fb, 0x0000dfb9, 0x8ea2bbe4, 0x8ea2bbf3,
+ /* 8c */ 0x8eaebbd1, 0x0000e4a5, 0x0000dfb7, 0x0000e3f4,
+ /* 90 */ 0x8ea2bbf0, 0x8eaebbdd, 0x0000dfbb, 0x8ea2bbe8,
+ /* 94 */ 0x8ea2bbe2, 0x0000dfb1, 0x8ea2bbe5, 0x00000000,
+ /* 98 */ 0x8ea2bbee, 0x8eaec1ab, 0x0000e3f3, 0x0000e3f8,
+ /* 9c */ 0x0000dfae, 0x8ea2bbef, 0x8eaebbe1, 0x0000e3f6,
+ /* a0 */ 0x8eaebbe2, 0x8eaebbe3, 0x8eaebbd0, 0x0000dfaf,
+ /* a4 */ 0x00000000, 0x8eaee4f9, 0x00000000, 0x0000e4a4,
+ /* a8 */ 0x8ea2caaa, 0x8ea2c2f6, 0x8eaec1a9, 0x8ea2c2ee,
+ /* ac */ 0x8ea2caa9, 0x00000000, 0x8ea2c2f2, 0x8ea2c2f4,
+ /* b0 */ 0x8eaec1a7, 0x8eaec1ac, 0x8ea2c2f1, 0x8eaec6ef,
+ /* b4 */ 0x0000e4a3, 0x00000000, 0x8ea2c2f0, 0x0000e4a7,
+ /* b8 */ 0x8eaec6ee, 0x00000000, 0x8eaec1a8, 0x8ea2cab9,
+ /* bc */ 0x8eaec6ec, 0x8eaec1ae, 0x0000e4a2, 0x0000e8e7,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01b45 ***/
+
+ /* 80 */ 0x8ea2c2f7, 0x8ea2caab, 0x8eaec6ed, 0x8eaec1aa,
+ /* 84 */ 0x0000e3fe, 0x8ea2c2ef, 0x8ea2c2f3, 0x0000e8e6,
+ /* 88 */ 0x0000e3f5, 0x8ea2c2ec, 0x8ea2c2ed, 0x0000e8e8,
+ /* 8c */ 0x0000e3fd, 0x0000e4a1, 0x0000e3fc, 0x8ea2c2f5,
+ /* 90 */ 0x8eaee4fa, 0x00000000, 0x8ea2caaf, 0x8ea2cab0,
+ /* 94 */ 0x8ea2cab5, 0x0000ece7, 0x8ea2cabc, 0x8eaecbf3,
+ /* 98 */ 0x0000e8ee, 0x8eaecbfe, 0x0000e8ed, 0x8ea2cab7,
+ /* 9c */ 0x8eaecbf4, 0x0000ece6, 0x8ea2caac, 0x0000e8ec,
+ /* a0 */ 0x8eaec6f1, 0x8ea2cabb, 0x0000e8ea, 0x0000e8eb,
+ /* a4 */ 0x8eaecbfc, 0x8ea2cab8, 0x8ea2d0d1, 0x0000ece4,
+ /* a8 */ 0x0000dfb5, 0x8eaec6f2, 0x8ea2caba, 0x0000eceb,
+ /* ac */ 0x8ea2cab2, 0x00000000, 0x0000ece5, 0x8eaec6ea,
+ /* b0 */ 0x0000ecea, 0x8ea2caad, 0x8ea2cab1, 0x8ea2caae,
+ /* b4 */ 0x8ea2cab4, 0x0000e8ef, 0x0000ece3, 0x0000e8e9,
+ /* b8 */ 0x8eaecca1, 0x8ea2d0c3, 0x8ea2cab6, 0x8eaec6e8,
+ /* bc */ 0x0000ece9, 0x8eaec6f3, 0x0000ecec, 0x00000000,
+
+ /*** Three byte table, leaf: e686xx - offset 0x01b85 ***/
+
+ /* 80 */ 0x8ea2cab3, 0x8eaec6eb, 0x0000ece8, 0x8ea2d0c2,
+ /* 84 */ 0x00000000, 0x8eaecca3, 0x8eaec6f4, 0x8eaecca4,
+ /* 88 */ 0x8eaecbf7, 0x8ea2d0c7, 0x0000f0d7, 0x8ea2d0c1,
+ /* 8c */ 0x8ea2d7ae, 0x8ea2d0d0, 0x0000ecf0, 0x8eaecbfa,
+ /* 90 */ 0x0000ecee, 0x0000f0d5, 0x8ea2d0cd, 0x8ea2d0c9,
+ /* 94 */ 0x0000ecf4, 0x8eaecbf6, 0x8ea2d7a5, 0x8eaed0e8,
+ /* 98 */ 0x8eaecca8, 0x8eaed0e7, 0x0000ecf2, 0x8ea2d0c8,
+ /* 9c */ 0x8eaecca9, 0x8ea2d7a3, 0x8eaecca5, 0x8ea2d0cc,
+ /* a0 */ 0x00000000, 0x8ea2d0cf, 0x8ea2d0c6, 0x8eaecbf9,
+ /* a4 */ 0x0000ecf3, 0x00000000, 0x8eaecbf5, 0x0000eced,
+ /* a8 */ 0x8ea2d7a4, 0x0000f0d6, 0x8ea2d0ce, 0x0000ecef,
+ /* ac */ 0x0000ecf1, 0x8ea2d0cb, 0x0000ecf5, 0x8ea2d0ca,
+ /* b0 */ 0x8ea2d0c5, 0x8ea2d0c4, 0x0000f0d4, 0x8ea2d0d2,
+ /* b4 */ 0x8ea2d7a7, 0x8ea2dceb, 0x0000f0d9, 0x8eaed0e1,
+ /* b8 */ 0x8ea2d7ad, 0x8eaed0e3, 0x8ea2d7ab, 0x8eaed0ea,
+ /* bc */ 0x8ea2dcec, 0x8eaed0e4, 0x0000f0da, 0x8ea2d7ac,
+
+ /*** Three byte table, leaf: e687xx - offset 0x01bc5 ***/
+
+ /* 80 */ 0x8eaed0e6, 0x8ea2d7a9, 0x0000f3dd, 0x8ea2dcea,
+ /* 84 */ 0x8eaed0ec, 0x8ea2d7a6, 0x8ea2d7a8, 0x0000f3de,
+ /* 88 */ 0x0000f0dc, 0x0000f3dc, 0x0000f0db, 0x0000f3e0,
+ /* 8c */ 0x8ea2d7aa, 0x0000f0d8, 0x8eaed0e2, 0x8eaed0e5,
+ /* 90 */ 0x8eaed0eb, 0x00000000, 0x00000000, 0x8eaee6f9,
+ /* 94 */ 0x00000000, 0x00000000, 0x8ea2e1db, 0x00000000,
+ /* 98 */ 0x8ea2e1d3, 0x8eaed4e1, 0x8eaed4df, 0x8eaed4dc,
+ /* 9c */ 0x8eaed4de, 0x8eaed4dd, 0x8ea2dcf2, 0x8ea2e1d4,
+ /* a0 */ 0x8ea2dcee, 0x00000000, 0x8eaed4db, 0x0000f6c2,
+ /* a4 */ 0x8ea2dcf0, 0x8ea2dcef, 0x0000f3df, 0x8ea2dced,
+ /* a8 */ 0x8ea2dcf1, 0x8ea2e1dc, 0x8ea2e1d8, 0x8ea2e1da,
+ /* ac */ 0x00000000, 0x8ea2e1d5, 0x8ea2e1d6, 0x00000000,
+ /* b0 */ 0x8ea2e1d9, 0x8ea2e1d7, 0x0000f8b4, 0x8eaed7e5,
+ /* b4 */ 0x00000000, 0x0000f8b7, 0x0000f8b6, 0x0000f8b5,
+ /* b8 */ 0x0000f9ec, 0x8ea2e8f6, 0x0000f9ed, 0x8ea2e5cc,
+ /* bc */ 0x0000faea, 0x8ea2ebda, 0x0000faeb, 0x0000fbe0,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01c05 ***/
+
+ /* 80 */ 0x0000fcb6, 0x8ea2efa8, 0x8eaedfc6, 0x8ea2efa9,
+ /* 84 */ 0x8ea2efaa, 0x8eaee1be, 0x00000000, 0x8ea2f2aa,
+ /* 88 */ 0x0000c5c1, 0x8ea2a1dd, 0x0000c6d3, 0x00000000,
+ /* 8c */ 0x0000c8a7, 0x0000c8a8, 0x0000c8a6, 0x8eaea3eb,
+ /* 90 */ 0x0000c8a9, 0x0000cabc, 0x0000cabb, 0x8eaea6a5,
+ /* 94 */ 0x8ea2a6f0, 0x0000cdd1, 0x0000cdd0, 0x00000000,
+ /* 98 */ 0x8eaeace3, 0x8ea2afb1, 0x0000dad1, 0x0000dad2,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaebbe4, 0x0000dfbc,
+ /* a0 */ 0x8ea2c2f8, 0x0000e4a8, 0x0000e4a9, 0x8ea2c2fa,
+ /* a4 */ 0x8ea2c2fc, 0x8ea2c2fb, 0x00000000, 0x8ea2cabe,
+ /* a8 */ 0x8eaec6f6, 0x8ea2cabd, 0x0000e8f0, 0x8ea2cabf,
+ /* ac */ 0x8eaec6f5, 0x8ea2d0d3, 0x0000ecf6, 0x8eaeccac,
+ /* b0 */ 0x0000f0dd, 0x8eaed0ed, 0x0000f3e1, 0x0000f6c3,
+ /* b4 */ 0x0000f3e2, 0x8eaedfc8, 0x0000c5c2, 0x8eaea1e5,
+ /* b8 */ 0x8eaea1e6, 0x8eaea2ce, 0x8ea2a4a8, 0x8eaea6a8,
+ /* bc */ 0x8eaea6a9, 0x8ea2a6f1, 0x0000cdd3, 0x0000cdd2,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01c45 ***/
+
+ /* 80 */ 0x0000cdd4, 0x0000d1b7, 0x8ea2aad3, 0x8ea2aad4,
+ /* 84 */ 0x00000000, 0x8eaeb1a9, 0x8ea2afb2, 0x0000d5d2,
+ /* 88 */ 0x0000dad3, 0x0000dfbd, 0x8ea2bbf4, 0x0000c5c3,
+ /* 8c */ 0x00000000, 0x0000c4df, 0x0000c5c4, 0x8eaea2d0,
+ /* 90 */ 0x8ea2a1de, 0x0000c6d7, 0x0000c6d6, 0x0000c6d4,
+ /* 94 */ 0x0000c6d5, 0x00000000, 0x00000000, 0x8eaea3ef,
+ /* 98 */ 0x0000c8ac, 0x8ea2a2c9, 0x8ea2a2cb, 0x0000c8ab,
+ /* 9c */ 0x8ea2a2c3, 0x8eaea3ec, 0x8ea2a2c4, 0x8eaea3ed,
+ /* a0 */ 0x8ea2a2ca, 0x8ea2a2c6, 0x8ea2a2c8, 0x0000c8aa,
+ /* a4 */ 0x8ea2a2c5, 0x8ea2a2cc, 0x8ea2a2c7, 0x8eaea3ee,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x0000cac3, 0x0000cacc, 0x0000caca,
+ /* b0 */ 0x8ea2a4b2, 0x8ea2a4af, 0x8ea2a4b7, 0x0000cac8,
+ /* b4 */ 0x8ea2a4b8, 0x8eaea6b9, 0x0000cac1, 0x8ea2a4b5,
+ /* b8 */ 0x8eaea6ae, 0x0000cac7, 0x8ea2a4b1, 0x8ea2a4b0,
+ /* bc */ 0x0000cac5, 0x8ea2a4b6, 0x0000cac6, 0x0000cdd5,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01c85 ***/
+
+ /* 80 */ 0x0000cac0, 0x8ea2a4b3, 0x8eaea6aa, 0x8ea2a4a9,
+ /* 84 */ 0x0000cabd, 0x8eaea6b7, 0x0000cad0, 0x8ea2a4ae,
+ /* 88 */ 0x8ea2a4b4, 0x0000cac2, 0x0000cac4, 0x8eaea6af,
+ /* 8c */ 0x8ea2a4aa, 0x8eaea6b6, 0x8ea2a4ab, 0x8ea2a4ac,
+ /* 90 */ 0x00000000, 0x0000cacf, 0x0000cac9, 0x0000cace,
+ /* 94 */ 0x8ea2a4ad, 0x0000cacd, 0x0000cabf, 0x0000cabe,
+ /* 98 */ 0x0000cacb, 0x8eaea6b5, 0x00000000, 0x8eaea6b3,
+ /* 9c */ 0x8eaea6b4, 0x8eaea6b8, 0x8eaea6b1, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaee4fb,
+ /* a4 */ 0x00000000, 0x8eaea6b2, 0x8eaea9b1, 0x8eaea9aa,
+ /* a8 */ 0x0000cde3, 0x8ea2a6fd, 0x8ea2a6f6, 0x0000cdde,
+ /* ac */ 0x0000cdf1, 0x8ea2a6f2, 0x8ea2a6f9, 0x8ea2a6fb,
+ /* b0 */ 0x8ea2a6fe, 0x0000cdec, 0x8eaea9a6, 0x8ea2a6fa,
+ /* b4 */ 0x8ea2a6f3, 0x0000cdea, 0x8ea2a6f7, 0x8eaea9a8,
+ /* b8 */ 0x8ea2a7a1, 0x0000cddb, 0x8eaea9a5, 0x8ea2a6fc,
+ /* bc */ 0x0000cde5, 0x0000cde4, 0x8ea2a6f5, 0x0000cdd9,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01cc5 ***/
+
+ /* 80 */ 0x8eaea9b4, 0x8eaea9b2, 0x0000cdda, 0x00000000,
+ /* 84 */ 0x0000cdd8, 0x8eaea9b3, 0x0000cdf0, 0x0000cde8,
+ /* 88 */ 0x0000cde2, 0x0000cdd6, 0x8ea2a6f8, 0x0000cde1,
+ /* 8c */ 0x0000cdd7, 0x0000cde9, 0x0000cdf2, 0x8ea2aad5,
+ /* 90 */ 0x0000cde6, 0x8ea2a6f4, 0x0000cddc, 0x0000cddf,
+ /* 94 */ 0x0000cde0, 0x8eaea9ae, 0x0000cdee, 0x0000cdef,
+ /* 98 */ 0x0000cded, 0x0000cde7, 0x0000cdeb, 0x0000cddd,
+ /* 9c */ 0x0000d1b8, 0x8eaea9b0, 0x8eaea9b7, 0x8eaea9b5,
+ /* a0 */ 0x8eaea9b6, 0x8eaea9af, 0x00000000, 0x00000000,
+ /* a4 */ 0x8eaea9a9, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x8eaeaced, 0x8ea2aadb,
+ /* ac */ 0x0000d1c4, 0x0000d1bc, 0x0000d1be, 0x0000d1c3,
+ /* b0 */ 0x8ea2aae7, 0x0000d1c1, 0x8ea2afb3, 0x0000d5d3,
+ /* b4 */ 0x0000d1c6, 0x8ea2aad8, 0x8ea2aae0, 0x0000d1c2,
+ /* b8 */ 0x8ea2aadf, 0x8ea2aadc, 0x8ea2aae4, 0x8ea2aae6,
+ /* bc */ 0x0000d1bb, 0x0000d1bf, 0x0000d1c5, 0x0000d5d5,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01d05 ***/
+
+ /* 80 */ 0x8ea2aae1, 0x0000d1bd, 0x0000d1c8, 0x8ea2aada,
+ /* 84 */ 0x8eaeacef, 0x8eaeacf0, 0x00000000, 0x0000d1c0,
+ /* 88 */ 0x0000d5d4, 0x0000d1ba, 0x00000000, 0x8ea2aad7,
+ /* 8c */ 0x8ea2aade, 0x8ea2aad6, 0x8ea2aad9, 0x8ea2aadd,
+ /* 90 */ 0x8ea2afb4, 0x0000d1c7, 0x00000000, 0x8ea2aae2,
+ /* 94 */ 0x8ea2aae3, 0x8ea2aae5, 0x0000d1b9, 0x8eaeacec,
+ /* 98 */ 0x00000000, 0x8eaeb1b2, 0x00000000, 0x8eaeb1b3,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeaceb,
+ /* a0 */ 0x00000000, 0x8eaeacee, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x0000d5e3, 0x8ea2afc0, 0x0000d5e1, 0x0000d5e2,
+ /* ac */ 0x8ea2afb6, 0x8ea2afc6, 0x8eaeb1ac, 0x0000d5d8,
+ /* b0 */ 0x8eaeb1af, 0x8eaeb1b5, 0x8ea2b5ca, 0x8ea2afc8,
+ /* b4 */ 0x8ea2afc2, 0x8eaeb1b8, 0x8ea2afb9, 0x8eaeb1b7,
+ /* b8 */ 0x8ea2afcb, 0x8ea2afbc, 0x0000d5de, 0x8ea2b5e1,
+ /* bc */ 0x8ea2afbf, 0x0000d5e0, 0x0000d5d7, 0x8eaeb1bc,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x01d45 ***/
+
+ /* 80 */ 0x8ea2afcd, 0x8ea2afc1, 0x0000d5da, 0x8ea2afba,
+ /* 84 */ 0x8ea2afb7, 0x8ea2afb8, 0x0000d5db, 0x8ea2afc7,
+ /* 88 */ 0x8ea2afce, 0x0000d5dd, 0x8ea2afbe, 0x8ea2afbd,
+ /* 8c */ 0x0000d5e5, 0x0000d5e4, 0x0000d5d6, 0x0000d5dc,
+ /* 90 */ 0x0000d5df, 0x8ea2afca, 0x8eaeb1ae, 0x8eaeb1b9,
+ /* 94 */ 0x8ea2afc4, 0x0000d5d9, 0x8ea2afb5, 0x8ea2afcc,
+ /* 98 */ 0x8ea2afc3, 0x8ea2afc5, 0x8ea2afc9, 0x8eaeb1b0,
+ /* 9c */ 0x8eaeb1bb, 0x8eaeb1b6, 0x00000000, 0x00000000,
+ /* a0 */ 0x8eaee4fc, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x8eaee4fd, 0x8ea2b5cb, 0x8eaeb6b1, 0x0000dadb,
+ /* a8 */ 0x0000daef, 0x0000daee, 0x8eaeb6a7, 0x0000dae3,
+ /* ac */ 0x8eaeb6a9, 0x8ea2b5dd, 0x8ea2b5d9, 0x8ea2b5d6,
+ /* b0 */ 0x8ea2b5e8, 0x0000dade, 0x0000dad6, 0x8eaeb6a6,
+ /* b4 */ 0x8eaeb6b2, 0x8ea2b5db, 0x0000dfcd, 0x0000dada,
+ /* b8 */ 0x8ea2b5e3, 0x8eaeb6a2, 0x0000daf0, 0x0000daed,
+ /* bc */ 0x8ea2b5df, 0x8ea2b5ce, 0x8eaeb5fc, 0x8eaeb6ab,
+
+ /*** Three byte table, leaf: e68exx - offset 0x01d85 ***/
+
+ /* 80 */ 0x0000daec, 0x8ea2b5e5, 0x8ea2b5cd, 0x0000dae1,
+ /* 84 */ 0x0000dae5, 0x8ea2b5e4, 0x8eaeb6a3, 0x8ea2b5d7,
+ /* 88 */ 0x0000dae6, 0x0000dae0, 0x8ea2b5cc, 0x8eaeb5fd,
+ /* 8c */ 0x0000dfbf, 0x8ea2b5e7, 0x8ea2b5d5, 0x0000daeb,
+ /* 90 */ 0x8ea2b5d8, 0x8ea2b5e6, 0x0000daea, 0x8eaeb6a4,
+ /* 94 */ 0x8ea2bbf5, 0x00000000, 0x0000dad7, 0x8ea2b5d3,
+ /* 98 */ 0x0000dadc, 0x0000dae7, 0x00000000, 0x0000dae2,
+ /* 9c */ 0x8ea2b5dc, 0x8ea2b5d2, 0x8ea2b5d0, 0x8ea2b5e2,
+ /* a0 */ 0x0000dad4, 0x0000dae8, 0x0000dad8, 0x0000dfbe,
+ /* a4 */ 0x8ea2b5e0, 0x0000dad9, 0x00000000, 0x0000dad5,
+ /* a8 */ 0x0000dae4, 0x0000dadf, 0x0000dadd, 0x8ea2b5d4,
+ /* ac */ 0x0000dae9, 0x8ea2b5d1, 0x8ea2b5de, 0x8ea2b5da,
+ /* b0 */ 0x8ea2bbf7, 0x8ea2bbf6, 0x8eaeb6ad, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaee4fe, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x8eaeb6ae, 0x00000000,
+ /* bc */ 0x00000000, 0x8ea2b5cf, 0x8ea2bca9, 0x8eaebbf1,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x01dc5 ***/
+
+ /* 80 */ 0x0000dfc1, 0x8eaebbf0, 0x8ea2bcaf, 0x8ea2bbfc,
+ /* 84 */ 0x8ea2bcac, 0x8ea2c2fd, 0x0000dfc4, 0x8ea2bcb0,
+ /* 88 */ 0x8ea2bcb3, 0x0000dfc3, 0x8ea2bca1, 0x8ea2bcb2,
+ /* 8c */ 0x8ea2bcb1, 0x0000dfc5, 0x8ea2bbf8, 0x0000dfc0,
+ /* 90 */ 0x0000dfc8, 0x8eaebbf3, 0x0000dfc6, 0x8ea2bcae,
+ /* 94 */ 0x00000000, 0x8ea2bca4, 0x0000dfca, 0x8ea2bcb5,
+ /* 98 */ 0x8ea2bcad, 0x8ea2bcb6, 0x0000dfd2, 0x0000dfd0,
+ /* 9c */ 0x8ea2bcab, 0x8ea2bcaa, 0x8eaebbe7, 0x8ea2bca8,
+ /* a0 */ 0x8ea2bca2, 0x0000dfc9, 0x8eaebbe6, 0x0000dfc7,
+ /* a4 */ 0x8ea2afbb, 0x8ea2bbf9, 0x8eaebbe8, 0x8ea2c3bd,
+ /* a8 */ 0x8ea2bbfa, 0x0000dfc2, 0x0000dfcf, 0x8ea2c3a1,
+ /* ac */ 0x00000000, 0x0000dfcb, 0x0000dfcc, 0x8ea2bbfb,
+ /* b0 */ 0x8ea2bcb4, 0x8ea2c2fe, 0x8ea2bca5, 0x8ea2bbfe,
+ /* b4 */ 0x0000dfce, 0x8ea2bca6, 0x8ea2bca3, 0x8eaebbf2,
+ /* b8 */ 0x8eaebbed, 0x0000dfd3, 0x8eaee3b9, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x8eaebbef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x01e04 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaee5a1,
+ /* 84 */ 0x00000000, 0x00000000, 0x0000e4b8, 0x8eaec1c9,
+ /* 88 */ 0x8eaec1b2, 0x8ea2c3a4, 0x8ea2c3b7, 0x8ea2c3bc,
+ /* 8c */ 0x8ea2c3b0, 0x0000e4b4, 0x8ea2c3c1, 0x0000e4b1,
+ /* 90 */ 0x8ea2c3a2, 0x8eaec1ba, 0x8ea2c3a3, 0x0000e4aa,
+ /* 94 */ 0x0000e4b3, 0x8ea2c3aa, 0x0000e4b6, 0x0000e4b7,
+ /* 98 */ 0x8ea2c3ab, 0x8eaec1b8, 0x8ea2c3b8, 0x8ea2c3be,
+ /* 9c */ 0x0000e4b2, 0x8eaec1be, 0x0000e4ac, 0x8ea2c3a9,
+ /* a0 */ 0x8ea2c3a5, 0x8ea2c3c0, 0x8ea2c3ae, 0x8ea2c3af,
+ /* a4 */ 0x8ea2c3a6, 0x8ea2c3ba, 0x8ea2c3b1, 0x8ea2c3bb,
+ /* a8 */ 0x8ea2c3b3, 0x8eaec1bd, 0x0000e4ad, 0x8ea2cac0,
+ /* ac */ 0x0000e4b0, 0x0000e4ae, 0x8ea2c3bf, 0x8ea2c3b6,
+ /* b0 */ 0x8ea2c3b2, 0x8eaec1b6, 0x8eaec1b3, 0x8ea2c3a7,
+ /* b4 */ 0x0000e8fa, 0x8ea2c3b5, 0x0000e4b5, 0x8ea2c3ad,
+ /* b8 */ 0x8eaec1b4, 0x8ea2c3ac, 0x8eaec1c8, 0x8eaec7a5,
+ /* bc */ 0x8eaec1c2, 0x0000e4af, 0x0000e4ab, 0x8ea2cad5,
+
+ /*** Three byte table, leaf: e691xx - offset 0x01e44 ***/
+
+ /* 80 */ 0x8ea2c3b9, 0x8ea2c3b4, 0x00000000, 0x8ea2c3a8,
+ /* 84 */ 0x00000000, 0x00000000, 0x8eaec1c4, 0x8eaec1c5,
+ /* 88 */ 0x00000000, 0x8eaee6f6, 0x00000000, 0x8ea2cad0,
+ /* 8c */ 0x8eaec6f8, 0x8ea2cac1, 0x8ea2cacc, 0x8eaec7a8,
+ /* 90 */ 0x8ea2cad3, 0x0000e8f8, 0x0000dfd1, 0x8ea2cad1,
+ /* 94 */ 0x0000e8f3, 0x8eaec6fe, 0x8eaec7a4, 0x8eaec6fa,
+ /* 98 */ 0x0000e8f2, 0x8ea2cad8, 0x00000000, 0x8ea2cac2,
+ /* 9c */ 0x8ea2cacf, 0x8ea2cac3, 0x8ea2cace, 0x0000e8f6,
+ /* a0 */ 0x8ea2cad2, 0x8ea2bca7, 0x8eaec7a1, 0x00000000,
+ /* a4 */ 0x8eaec7aa, 0x8ea2cad9, 0x8ea2caca, 0x0000e8f9,
+ /* a8 */ 0x8ea2d0e1, 0x0000ecf7, 0x8eaec7a3, 0x8ea2cad7,
+ /* ac */ 0x8ea2cad6, 0x0000e8fb, 0x8ea2d0d4, 0x0000ecf8,
+ /* b0 */ 0x8ea2d0d5, 0x8eaec7a2, 0x8ea2cac6, 0x8ea2cac7,
+ /* b4 */ 0x8ea2cac4, 0x8ea2cac9, 0x8ea2cac5, 0x8ea2cada,
+ /* b8 */ 0x0000e8f5, 0x0000ecf9, 0x0000e8f7, 0x0000e8fc,
+ /* bc */ 0x8eaec6fb, 0x8ea2cac8, 0x8eaec7a9, 0x8ea2cad4,
+
+ /*** Three byte table, leaf: e692xx - offset 0x01e84 ***/
+
+ /* 80 */ 0x8eaeccad, 0x8eaec7a6, 0x8ea2cacd, 0x8eaeccb5,
+ /* 84 */ 0x00000000, 0x8ea2d0d8, 0x8eaeccb8, 0x0000e8f1,
+ /* 88 */ 0x0000ecfc, 0x8ea2d7b5, 0x8ea2d0dd, 0x8ea2d0dc,
+ /* 8c */ 0x8ea2d0de, 0x8eaeccb0, 0x8eaeccaf, 0x8ea2d0db,
+ /* 90 */ 0x0000ecfd, 0x8eaeccbb, 0x0000eda5, 0x0000eda2,
+ /* 94 */ 0x8eaeccb1, 0x0000eda3, 0x8ea2d0d6, 0x8ea2d0d9,
+ /* 98 */ 0x8ea2d0e3, 0x0000edab, 0x0000eda9, 0x8eaeccae,
+ /* 9c */ 0x8ea2d0da, 0x8ea2bbfd, 0x0000ecfa, 0x8ea2d0e0,
+ /* a0 */ 0x8ea2d0d7, 0x8eaeccbe, 0x0000edac, 0x8ea2d0df,
+ /* a4 */ 0x0000e8f4, 0x0000eda1, 0x8ea2cacb, 0x8eaeccbf,
+ /* a8 */ 0x8eaeccb4, 0x0000eda4, 0x8eaeccbd, 0x0000eda8,
+ /* ac */ 0x0000edaa, 0x0000eda7, 0x0000eda6, 0x8eaeccba,
+ /* b0 */ 0x0000ecfe, 0x8ea2d0e2, 0x0000ecfb, 0x0000edad,
+ /* b4 */ 0x8eaeccb9, 0x00000000, 0x8eaee5a2, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaeccb7, 0x00000000, 0x0000f0e1,
+ /* bc */ 0x0000f0e2, 0x8ea2d7b4, 0x0000f0eb, 0x0000f0e8,
+
+ /*** Three byte table, leaf: e693xx - offset 0x01ec4 ***/
+
+ /* 80 */ 0x8eaed0f0, 0x0000f0df, 0x0000f0e6, 0x8ea2d7b6,
+ /* 84 */ 0x0000f0e4, 0x0000f0de, 0x8eaeccb2, 0x0000f0e5,
+ /* 88 */ 0x8eaed0f7, 0x8ea2d7b3, 0x0000f3e4, 0x0000f0e0,
+ /* 8c */ 0x00000000, 0x0000f0e7, 0x0000f3e3, 0x8ea2d7b2,
+ /* 90 */ 0x8ea2d7b1, 0x8eaed0f6, 0x0000f0e9, 0x8eaed0ef,
+ /* 94 */ 0x0000f0ea, 0x8eaed0f9, 0x8ea2d7b0, 0x8ea2d7af,
+ /* 98 */ 0x0000f3e5, 0x8ea2d7b9, 0x0000f0e3, 0x8ea2d7b7,
+ /* 9c */ 0x8eaed0f5, 0x00000000, 0x00000000, 0x8eaed4e4,
+ /* a0 */ 0x0000f3e6, 0x8eaed4e7, 0x0000f3eb, 0x8ea2dcf5,
+ /* a4 */ 0x8ea2dcf7, 0x8eaed7eb, 0x0000f3e8, 0x8eaed7ed,
+ /* a8 */ 0x8ea2dcf8, 0x8ea2dcf4, 0x8eaed7ec, 0x8ea2dcf6,
+ /* ac */ 0x0000f3e9, 0x0000f3ec, 0x8eaed4e9, 0x8ea2dcf3,
+ /* b0 */ 0x0000f3e7, 0x0000f3ea, 0x0000f6c5, 0x8ea2d7b8,
+ /* b4 */ 0x0000f6c4, 0x00000000, 0x8eaed7ea, 0x0000f6ca,
+ /* b8 */ 0x8ea2e1e0, 0x8eaed7f0, 0x0000f6c8, 0x0000f6c9,
+ /* bc */ 0x8ea2e1e3, 0x8ea2e1df, 0x0000f6c6, 0x8ea2e1dd,
+
+ /*** Three byte table, leaf: e694xx - offset 0x01f04 ***/
+
+ /* 80 */ 0x0000f8b8, 0x8ea2e1e1, 0x00000000, 0x8ea2e1e2,
+ /* 84 */ 0x8ea2e1de, 0x8eaed7ee, 0x0000f6c7, 0x8ea2e5cd,
+ /* 88 */ 0x8eaedabb, 0x8ea2e5d0, 0x8eaedabc, 0x8eaedaba,
+ /* 8c */ 0x8ea2e5d1, 0x8ea2e5cf, 0x8ea2e5d2, 0x0000f8b9,
+ /* 90 */ 0x8ea2e5ce, 0x8eaedeb1, 0x00000000, 0x8ea2e8fa,
+ /* 94 */ 0x0000f9ef, 0x8ea2e8f9, 0x8ea2e8f8, 0x8ea2e8f7,
+ /* 98 */ 0x0000f9ee, 0x0000f9f0, 0x8eaee5a3, 0x8ea2ebdb,
+ /* 9c */ 0x0000faed, 0x0000faec, 0x8eaedfca, 0x8eaedfcb,
+ /* a0 */ 0x8ea2edcf, 0x8ea2edce, 0x8ea2edd1, 0x0000fcb7,
+ /* a4 */ 0x0000fbe1, 0x8ea2efac, 0x8ea2edd0, 0x8eaedfc9,
+ /* a8 */ 0x8eaee0b2, 0x8ea2efab, 0x0000fcb9, 0x0000fcb8,
+ /* ac */ 0x0000fcdf, 0x8ea2f0b7, 0x8ea2f0fd, 0x0000c5c5,
+ /* b0 */ 0x00000000, 0x8eaeacf2, 0x8ea2bcb7, 0x8ea2d7ba,
+ /* b4 */ 0x8eaea1e7, 0x8eaea1e8, 0x0000c8ad, 0x8ea2a2cd,
+ /* b8 */ 0x0000cad3, 0x0000cad1, 0x00000000, 0x0000cad2,
+ /* bc */ 0x00000000, 0x8ea2a7a2, 0x0000cdf3, 0x0000d1c9,
+
+ /*** Three byte table, leaf: e695xx - offset 0x01f44 ***/
+
+ /* 80 */ 0x8eaeacf4, 0x8ea2aae8, 0x8eaeacf6, 0x8ea2aae9,
+ /* 84 */ 0x8eaeacf3, 0x0000d1ca, 0x8ea2afd0, 0x00000000,
+ /* 88 */ 0x0000d5e6, 0x0000d5e7, 0x8ea2afcf, 0x8eaeb1bd,
+ /* 8c */ 0x00000000, 0x8eaeb6b7, 0x8eaeb6b6, 0x0000daf7,
+ /* 90 */ 0x00000000, 0x0000daf3, 0x00000000, 0x8ea2b5e9,
+ /* 94 */ 0x0000dafa, 0x0000daf9, 0x0000daf2, 0x0000daf5,
+ /* 98 */ 0x0000daf8, 0x0000daf4, 0x8eaeb6b4, 0x00000000,
+ /* 9c */ 0x8ea2bcbb, 0x0000daf1, 0x0000dfd4, 0x8eaebbf4,
+ /* a0 */ 0x8eaebbf5, 0x8eaebbf6, 0x0000dfd6, 0x0000dfd7,
+ /* a4 */ 0x8ea2bcba, 0x8ea2bcbd, 0x0000dfd5, 0x8ea2bcb8,
+ /* a8 */ 0x8ea2bcbc, 0x00000000, 0x8ea2bcb9, 0x8eaec1cb,
+ /* ac */ 0x0000e4b9, 0x8eaec1ce, 0x8eaee3c6, 0x8ea2c3c2,
+ /* b0 */ 0x8eaec1cd, 0x8eaec7b0, 0x0000e8fd, 0x8ea2cadb,
+ /* b4 */ 0x0000f0ec, 0x0000edae, 0x8ea2d0e4, 0x0000edaf,
+ /* b8 */ 0x0000edb0, 0x8ea2d0e6, 0x8ea2d0e5, 0x8ea2d0e7,
+ /* bc */ 0x8ea2d7bc, 0x00000000, 0x00000000, 0x8ea2d7bb,
+
+ /*** Three byte table, leaf: e696xx - offset 0x01f84 ***/
+
+ /* 80 */ 0x8ea2dcfa, 0x8ea2dcf9, 0x0000f3ed, 0x0000f3ee,
+ /* 84 */ 0x8ea2e5d3, 0x8eaedcc1, 0x00000000, 0x0000c5c6,
+ /* 88 */ 0x8eaea5d8, 0x8eaea9b9, 0x00000000, 0x8eaeb1c0,
+ /* 8c */ 0x8ea2bcbe, 0x8eaeb6b8, 0x8eaeb6b9, 0x00000000,
+ /* 90 */ 0x0000dfd9, 0x0000dfd8, 0x8ea2c3c3, 0x00000000,
+ /* 94 */ 0x8ea2e1e4, 0x0000faee, 0x8ea2efad, 0x0000c5c7,
+ /* 98 */ 0x00000000, 0x0000d5e8, 0x8eaeb1c2, 0x0000dafc,
+ /* 9c */ 0x0000dafb, 0x8ea2bcbf, 0x8ea2bcc0, 0x0000e4ba,
+ /* a0 */ 0x8ea2cadc, 0x0000e8fe, 0x8ea2d7bd, 0x00000000,
+ /* a4 */ 0x0000c5c8, 0x0000c6d8, 0x8eaea9bb, 0x0000cdf4,
+ /* a8 */ 0x8ea2a7a3, 0x00000000, 0x8ea2aaea, 0x0000d1cb,
+ /* ac */ 0x0000dafd, 0x8eaeb6ba, 0x8ea2bcc1, 0x0000dfda,
+ /* b0 */ 0x0000e4bb, 0x00000000, 0x8ea2d0e8, 0x8ea2d0e9,
+ /* b4 */ 0x00000000, 0x8eaed4eb, 0x8ea2dcfb, 0x0000f6cb,
+ /* b8 */ 0x8ea2f0fe, 0x0000c5c9, 0x8eaea9bc, 0x8ea2a7a4,
+ /* bc */ 0x0000cdf5, 0x0000d1cc, 0x8eaeacf7, 0x8ea2aaeb,
+
+ /*** Three byte table, leaf: e697xx - offset 0x01fc4 ***/
+
+ /* 80 */ 0x00000000, 0x0000d5e9, 0x8ea2afd4, 0x8ea2afd2,
+ /* 84 */ 0x8ea2afd3, 0x0000d5ea, 0x8ea2afd1, 0x8eaeb6bc,
+ /* 88 */ 0x00000000, 0x8eaeb6bf, 0x8eaeb6bd, 0x0000dba1,
+ /* 8c */ 0x0000dba2, 0x8ea2b5ea, 0x0000dba3, 0x0000dafe,
+ /* 90 */ 0x8ea2bcc2, 0x8eaebbf9, 0x8ea2bcc3, 0x8ea2c3c4,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000e9a2, 0x0000e9a1,
+ /* 98 */ 0x00000000, 0x00000000, 0x8ea2dcfc, 0x8ea2e1e5,
+ /* 9c */ 0x8eaedabf, 0x8ea2e5d5, 0x8ea2e5d4, 0x8ea2e8fb,
+ /* a0 */ 0x8eaea1e9, 0x8ea2a1be, 0x0000d1cd, 0x8eaeb6c1,
+ /* a4 */ 0x8eaec1d0, 0x0000c5ca, 0x0000c6d9, 0x8eaea2d1,
+ /* a8 */ 0x0000c8af, 0x0000c8ae, 0x8eaea3f3, 0x8eaea3f2,
+ /* ac */ 0x0000c8b0, 0x0000c8b1, 0x8ea2a2cf, 0x8ea2a2ce,
+ /* b0 */ 0x8ea2a4b9, 0x0000cad4, 0x8ea2a4bc, 0x8ea2a4bb,
+ /* b4 */ 0x8ea2a4ba, 0x8ea2a4bd, 0x8eaea6bd, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaee2de, 0x0000cdf6, 0x8ea2a7aa,
+ /* bc */ 0x8ea2a7a6, 0x8ea2a7af, 0x8eaea9c3, 0x8eaea9be,
+
+ /*** Three byte table, leaf: e698xx - offset 0x02004 ***/
+
+ /* 80 */ 0x0000cdfd, 0x8eaea9c2, 0x0000cdfb, 0x8ea2a7ab,
+ /* 84 */ 0x8ea2a7a7, 0x8ea2a7ae, 0x0000cdfa, 0x0000cea3,
+ /* 88 */ 0x8ea2a7a9, 0x8ea2a7a5, 0x0000cea2, 0x8ea2a7ac,
+ /* 8c */ 0x0000cdf9, 0x8ea2a7ad, 0x0000cdfc, 0x0000cdfe,
+ /* 90 */ 0x8ea2a7b1, 0x8ea2a7b0, 0x8ea2a7a8, 0x0000cdf8,
+ /* 94 */ 0x0000cdf7, 0x0000cea1, 0x00000000, 0x8eaea9c0,
+ /* 98 */ 0x8eaea9c1, 0x00000000, 0x8eaeacfe, 0x8eaeacfa,
+ /* 9c */ 0x8ea2aaf0, 0x8ea2aaf6, 0x8eaeada3, 0x0000d1d3,
+ /* a0 */ 0x0000d1d0, 0x8ea2aaed, 0x8ea2aaf2, 0x8eaeacfc,
+ /* a4 */ 0x0000d1d6, 0x0000d1ce, 0x8ea2aaf1, 0x0000d1d1,
+ /* a8 */ 0x0000d1d4, 0x8eaeacf9, 0x00000000, 0x8ea2aaf4,
+ /* ac */ 0x8eaeacfd, 0x0000d1cf, 0x8ea2aaf9, 0x0000d1d2,
+ /* b0 */ 0x8eaeada1, 0x0000d1d5, 0x8ea2aaee, 0x8ea2aaf3,
+ /* b4 */ 0x8ea2aaf7, 0x8ea2aaef, 0x8ea2aaec, 0x8eaeada4,
+ /* b8 */ 0x8eaeada5, 0x8ea2aaf8, 0x8ea2aaf5, 0x8eaeada2,
+ /* bc */ 0x8eaeacb7, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e699xx - offset 0x02044 ***/
+
+ /* 80 */ 0x8eaeb1c6, 0x0000d5f2, 0x0000d5eb, 0x0000d5ee,
+ /* 84 */ 0x8eaeb1cc, 0x0000d5f1, 0x8eaeb1c4, 0x8ea2afd7,
+ /* 88 */ 0x8eaeb1c9, 0x0000d5ec, 0x8ea2afd5, 0x8eaeb1c8,
+ /* 8c */ 0x0000d5f0, 0x8eaeb1cd, 0x8eaeb1c5, 0x0000d5ed,
+ /* 90 */ 0x8eaeb1c3, 0x8ea2afd8, 0x0000d5ef, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb6c2,
+ /* 98 */ 0x00000000, 0x8ea2b5ee, 0x0000dba5, 0x8ea2b5ed,
+ /* 9c */ 0x8ea2b5ef, 0x0000dba4, 0x0000dba9, 0x8ea2afd6,
+ /* a0 */ 0x8eaeb1cb, 0x8ea2b5ec, 0x8ea2b5f0, 0x8eaeb6c4,
+ /* a4 */ 0x0000dba6, 0x8ea2b5eb, 0x0000dba8, 0x8eaeb6c5,
+ /* a8 */ 0x0000dba7, 0x8eaebca6, 0x8ea2bcca, 0x8eaebbfd,
+ /* ac */ 0x8ea2bcc5, 0x8eaebca5, 0x0000dfdb, 0x0000dfdf,
+ /* b0 */ 0x0000dfdc, 0x8ea2bcc8, 0x8ea2bccb, 0x8eaebca3,
+ /* b4 */ 0x0000dfdd, 0x00000000, 0x0000dfde, 0x0000dfe3,
+ /* b8 */ 0x8ea2c3cd, 0x8ea2bcc9, 0x0000dfe1, 0x8ea2bcc6,
+ /* bc */ 0x8ea2bcc4, 0x8eaebbfc, 0x0000dfe2, 0x8eaebbfe,
+
+ /*** Three byte table, leaf: e69axx - offset 0x02084 ***/
+
+ /* 80 */ 0x8ea2bcc7, 0x8eaebca4, 0x00000000, 0x00000000,
+ /* 84 */ 0x0000e4c1, 0x00000000, 0x8ea2c3c5, 0x0000e4be,
+ /* 88 */ 0x0000e4bf, 0x0000e4bd, 0x8ea2c3ca, 0x8ea2c3c9,
+ /* 8c */ 0x8ea2c3c6, 0x0000e4c3, 0x8eaec1db, 0x8eaec1d6,
+ /* 90 */ 0x8ea2c3c8, 0x0000dfe0, 0x8eaec1d9, 0x8eaec1d1,
+ /* 94 */ 0x8ea2c3cc, 0x8ea2c3c7, 0x0000e4c0, 0x0000e4bc,
+ /* 98 */ 0x0000e4c2, 0x8ea2c3cb, 0x8eaec7b4, 0x00000000,
+ /* 9c */ 0x8eaec7b5, 0x0000e9a5, 0x00000000, 0x8ea2cadf,
+ /* a0 */ 0x8ea2cade, 0x8ea2cadd, 0x0000e9a3, 0x00000000,
+ /* a4 */ 0x8eaec7b9, 0x8eaec7b3, 0x8eaec7b7, 0x00000000,
+ /* a8 */ 0x0000e9a4, 0x8ea2d0ec, 0x8ea2d0ef, 0x0000edb2,
+ /* ac */ 0x8eaeccc4, 0x8eaeccc6, 0x0000edb1, 0x8ea2d0f0,
+ /* b0 */ 0x8ea2d0eb, 0x0000edb4, 0x8ea2d0ed, 0x8eaeccc1,
+ /* b4 */ 0x0000edb3, 0x8ea2d0ea, 0x8eaeccc0, 0x8ea2d0ee,
+ /* b8 */ 0x0000f0f2, 0x0000f0ef, 0x8ea2d7c6, 0x8ea2d7c5,
+ /* bc */ 0x8eaeccc3, 0x8ea2d7c4, 0x8ea2d7bf, 0x8eaed0fd,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x020c4 ***/
+
+ /* 80 */ 0x8ea2d7c0, 0x8eaed1a3, 0x00000000, 0x8eaed0fa,
+ /* 84 */ 0x0000f0f0, 0x8eaed0fe, 0x0000f0ed, 0x0000f0f1,
+ /* 88 */ 0x8ea2d7be, 0x0000f0ee, 0x8ea2d7c1, 0x8ea2d7c2,
+ /* 8c */ 0x8ea2d7c7, 0x8eaed1a2, 0x8eaed4f1, 0x8ea2d7c3,
+ /* 90 */ 0x8eaed4ef, 0x8eaed4f0, 0x8ea2dcfd, 0x00000000,
+ /* 94 */ 0x8eaed4ec, 0x8eaed4ed, 0x0000f3f0, 0x8eaed4f2,
+ /* 98 */ 0x8ea2e1e8, 0x0000f3ef, 0x8ea2e1e6, 0x8ea2e1e7,
+ /* 9c */ 0x0000f6cc, 0x0000f8bb, 0x8ea2e5d6, 0x8eaedac3,
+ /* a0 */ 0x0000f8ba, 0x8eaedac2, 0x8eaee5a6, 0x8ea2e8fd,
+ /* a4 */ 0x8ea2e8fe, 0x8eaedcc2, 0x0000f9f1, 0x8eaedcc3,
+ /* a8 */ 0x8ea2e8fc, 0x0000faef, 0x00000000, 0x8ea2efae,
+ /* ac */ 0x0000fcba, 0x8ea2f0b8, 0x8ea2f0b9, 0x8eaee1bf,
+ /* b0 */ 0x0000c5cb, 0x00000000, 0x0000c8b2, 0x0000c8b3,
+ /* b4 */ 0x0000cad5, 0x8eaea6c1, 0x8ea2a7b2, 0x0000d1d7,
+ /* b8 */ 0x0000d5f3, 0x0000dbaa, 0x00000000, 0x00000000,
+ /* bc */ 0x0000d9b7, 0x00000000, 0x0000dfe4, 0x0000dfe5,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x02104 ***/
+
+ /* 80 */ 0x0000deb2, 0x8ea2bccc, 0x8eaee5a7, 0x0000e4c4,
+ /* 84 */ 0x8ea2cae1, 0x8ea2cae0, 0x8eaed1a4, 0x00000000,
+ /* 88 */ 0x0000c5cc, 0x0000c8b4, 0x8ea2a7b3, 0x0000cea5,
+ /* 8c */ 0x8eaea9c5, 0x0000cea4, 0x8eaeada7, 0x8ea2aafa,
+ /* 90 */ 0x8ea2aafb, 0x8eaee6b2, 0x8ea2afd9, 0x8ea2afda,
+ /* 94 */ 0x0000d5f4, 0x0000d5f5, 0x8eaeb6c8, 0x0000d5f6,
+ /* 98 */ 0x8ea2b5f1, 0x8eaeb6c7, 0x8eaeb6c6, 0x0000dbac,
+ /* 9c */ 0x00000000, 0x0000dfe7, 0x8eaebca9, 0x0000dfe6,
+ /* a0 */ 0x8ea2c3ce, 0x8ea2c6c1, 0x8ea2cae2, 0x8ea2d7c8,
+ /* a4 */ 0x8eaed1a6, 0x8eaee6b3, 0x0000f6cd, 0x0000f9f2,
+ /* a8 */ 0x0000c5cd, 0x00000000, 0x0000c6dc, 0x0000c6dd,
+ /* ac */ 0x0000c6db, 0x0000c6de, 0x0000c6da, 0x8eaea2d2,
+ /* b0 */ 0x00000000, 0x0000c8b7, 0x8eaea3f7, 0x8ea2a2d7,
+ /* b4 */ 0x0000c8b6, 0x0000c8b8, 0x8eaea3f8, 0x8eaea3f5,
+ /* b8 */ 0x8ea2a2d2, 0x8ea2a2d1, 0x8ea2a2d4, 0x8ea2a2d3,
+ /* bc */ 0x8ea2a2d6, 0x0000c8b5, 0x8ea2a2d0, 0x8ea2a2d5,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x02144 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaea6c8, 0x8ea2a4be, 0x0000cadf, 0x8ea2a4bf,
+ /* 88 */ 0x8ea2a4c3, 0x0000cade, 0x8eaea6c9, 0x8ea2a4c7,
+ /* 8c */ 0x8ea2a4c2, 0x8ea2a4c5, 0x0000cad7, 0x0000cad8,
+ /* 90 */ 0x0000cad9, 0x0000cada, 0x8eaea6c5, 0x0000cae1,
+ /* 94 */ 0x8eaea6c4, 0x8ea2a4c1, 0x0000cadc, 0x0000cae2,
+ /* 98 */ 0x8eaea6c7, 0x8ea2a4c0, 0x8ea2a4c6, 0x8eaea6c2,
+ /* 9c */ 0x0000cadb, 0x8ea2a4c4, 0x0000cadd, 0x0000cad6,
+ /* a0 */ 0x0000cae0, 0x8eaea6ca, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x8eaee2d7, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x0000ceba, 0x8eaea9c7,
+ /* ac */ 0x8ea2a7b5, 0x0000cea6, 0x00000000, 0x0000ceb0,
+ /* b0 */ 0x0000ceb1, 0x0000cea9, 0x0000cebb, 0x0000ceab,
+ /* b4 */ 0x8ea2a7bd, 0x0000ceb6, 0x8ea2a7b8, 0x0000ceac,
+ /* b8 */ 0x8ea2a7c7, 0x8ea2a7c8, 0x8ea2a7c0, 0x8ea2a7b9,
+ /* bc */ 0x0000ceb9, 0x8ea2a7c5, 0x0000ceb4, 0x0000ceb2,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02184 ***/
+
+ /* 80 */ 0x8eaea9d2, 0x8ea2a7c6, 0x8eaea9c9, 0x8ea2a7c4,
+ /* 84 */ 0x8ea2a7bc, 0x8ea2a7b4, 0x8ea2a7bb, 0x0000cead,
+ /* 88 */ 0x8eaee2df, 0x0000ceb3, 0x8eaea9ca, 0x0000cea7,
+ /* 8c */ 0x8ea2a7bf, 0x8ea2a7be, 0x8ea2a7b6, 0x8eaea9cf,
+ /* 90 */ 0x0000ceb5, 0x8ea2a7c2, 0x8ea2a7b7, 0x0000ceb8,
+ /* 94 */ 0x8ea2a7c9, 0x0000cea8, 0x8eaea9c8, 0x0000ceaf,
+ /* 98 */ 0x8ea2a7ba, 0x8ea2a7c3, 0x0000ceb7, 0x00000000,
+ /* 9c */ 0x0000ceaa, 0x0000ceae, 0x00000000, 0x8ea2a7c1,
+ /* a0 */ 0x00000000, 0x00000000, 0x8eaea9ce, 0x8eaea9cc,
+ /* a4 */ 0x8eaee5a8, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaee5a9, 0x00000000, 0x8ea2abbd, 0x0000d1df,
+ /* b0 */ 0x0000d1ec, 0x8eaeadb6, 0x8ea2abb8, 0x8ea2abae,
+ /* b4 */ 0x0000d1e5, 0x8ea2abac, 0x0000d1de, 0x8ea2aba7,
+ /* b8 */ 0x0000d1e8, 0x8ea2abb4, 0x8ea2aba1, 0x8ea2aba3,
+ /* bc */ 0x8eaeadae, 0x00000000, 0x00000000, 0x8eaeadb0,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x021c4 ***/
+
+ /* 80 */ 0x8ea2aba6, 0x8ea2aafc, 0x8ea2abb3, 0x8ea2abc3,
+ /* 84 */ 0x0000d1e3, 0x8ea2aba8, 0x8ea2abba, 0x8eaeadad,
+ /* 88 */ 0x8ea2aafe, 0x8ea2abc1, 0x8ea2abc2, 0x8ea2abc5,
+ /* 8c */ 0x8ea2abbc, 0x8ea2abad, 0x8ea2abb5, 0x0000d1e9,
+ /* 90 */ 0x0000d1dc, 0x0000d1e4, 0x0000d1f0, 0x0000d1d9,
+ /* 94 */ 0x0000d1db, 0x8eaeadb1, 0x8eaeadab, 0x8eaeadba,
+ /* 98 */ 0x8ea2aba5, 0x0000d1ed, 0x0000d1e6, 0x8ea2abbf,
+ /* 9c */ 0x8ea2aba2, 0x0000d1ef, 0x0000d1ea, 0x8ea2abab,
+ /* a0 */ 0x00000000, 0x00000000, 0x0000d1ee, 0x8ea2abb2,
+ /* a4 */ 0x8ea2abaa, 0x0000d1e7, 0x8ea2abbe, 0x8ea2abb6,
+ /* a8 */ 0x8eaeadaa, 0x0000d1e1, 0x8ea2abc4, 0x8ea2aba9,
+ /* ac */ 0x0000d1dd, 0x8ea2abbb, 0x8ea2abb1, 0x0000d1e2,
+ /* b0 */ 0x8ea2abb7, 0x0000d1da, 0x8ea2aafd, 0x0000d1eb,
+ /* b4 */ 0x0000d6a7, 0x0000d1e0, 0x8ea2abb0, 0x8ea2abaf,
+ /* b8 */ 0x8ea2aba4, 0x8eaea9d1, 0x8ea2abc0, 0x8eaeadb4,
+ /* bc */ 0x8ea2abb9, 0x00000000, 0x8eaeadb2, 0x0000d1d8,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x02204 ***/
+
+ /* 80 */ 0x8eaeadb9, 0x8eaeadb7, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x8eaeadb8, 0x8eaee5ab, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x8eaee5aa, 0x00000000, 0x8ea2afee, 0x0000d6ae,
+ /* 94 */ 0x8ea2afef, 0x8eaeb1dd, 0x8ea2afe3, 0x0000d6a3,
+ /* 98 */ 0x0000d6af, 0x8eaeb1d7, 0x8ea2afdc, 0x8eaeb1d3,
+ /* 9c */ 0x8ea2afe5, 0x8ea2afed, 0x8eaeb1db, 0x8ea2afdb,
+ /* a0 */ 0x8ea2aff6, 0x0000d5f7, 0x8eaeb1de, 0x8eaeb1e4,
+ /* a4 */ 0x8eaeb1d0, 0x8ea2aff5, 0x8ea2aff0, 0x8eaeb1df,
+ /* a8 */ 0x8ea2aff1, 0x0000d6a1, 0x0000d6ac, 0x8ea2afe7,
+ /* ac */ 0x8eaeb1d6, 0x8ea2afe8, 0x8ea2aff2, 0x8ea2afe9,
+ /* b0 */ 0x8eaeb1e3, 0x8ea2afe4, 0x8ea2afde, 0x8ea2afdf,
+ /* b4 */ 0x8ea2afec, 0x8ea2afe6, 0x8eaeb1d4, 0x8eaeb1cf,
+ /* b8 */ 0x0000d5f8, 0x0000d5fc, 0x8ea2aff4, 0x8ea2afe0,
+ /* bc */ 0x0000d6aa, 0x0000d6a6, 0x8eaeb1da, 0x00000000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02244 ***/
+
+ /* 80 */ 0x0000d6a9, 0x0000d6b0, 0x0000d5fd, 0x0000d6ab,
+ /* 84 */ 0x8ea2afeb, 0x0000d6ad, 0x0000d5fa, 0x8eaeb1d9,
+ /* 88 */ 0x0000d5f9, 0x8ea2afdd, 0x00000000, 0x8ea2afe1,
+ /* 8c */ 0x0000d6a4, 0x8ea2aff3, 0x8ea2afea, 0x8ea2afe2,
+ /* 90 */ 0x0000d6a8, 0x0000d6a5, 0x8eaeadaf, 0x0000d5fb,
+ /* 94 */ 0x0000d5fe, 0x8eaeb1e2, 0x8eaeb1d8, 0x00000000,
+ /* 98 */ 0x8eaeb1e1, 0x8eaeb1e0, 0x8eaee5ad, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaee5ac, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2b6a8,
+ /* ac */ 0x8eaeb6d5, 0x8ea2b5f6, 0x8ea2b5f7, 0x8ea2b5fb,
+ /* b0 */ 0x8eaeb6e0, 0x8ea2b6ac, 0x8ea2b6a9, 0x8eaeb6ce,
+ /* b4 */ 0x8ea2b6a2, 0x8ea2b6a1, 0x0000dbb3, 0x8ea2b6a5,
+ /* b8 */ 0x8ea2b6b4, 0x8ea2b5f2, 0x8eaeb6db, 0x8ea2b6b5,
+ /* bc */ 0x8ea2b6a7, 0x8ea2b6b9, 0x8ea2b6ad, 0x0000dbb2,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02284 ***/
+
+ /* 80 */ 0x8ea2b6ab, 0x0000dbad, 0x0000dbc2, 0x0000dbb8,
+ /* 84 */ 0x8eaeb6d7, 0x0000dbbc, 0x0000dbbb, 0x8ea2b5f3,
+ /* 88 */ 0x00000000, 0x8ea2b6b2, 0x8ea2b6b8, 0x8ea2b6b0,
+ /* 8c */ 0x8ea2b6b7, 0x00000000, 0x8eaeb6d1, 0x8ea2b6a4,
+ /* 90 */ 0x8ea2b5f4, 0x8ea2b6b6, 0x8ea2b6a6, 0x0000dbb0,
+ /* 94 */ 0x0000dbbd, 0x8eaeb6da, 0x8ea2b6af, 0x0000dbb6,
+ /* 98 */ 0x8eaeb6cd, 0x8eaeb6dc, 0x8eaeb6d0, 0x8ea2b6ae,
+ /* 9c */ 0x8ea2b5f5, 0x0000dbbe, 0x8eaeb6cb, 0x0000dbc0,
+ /* a0 */ 0x8ea2b6b1, 0x0000dbc1, 0x0000dbaf, 0x8ea2b5fc,
+ /* a4 */ 0x8ea2b6b3, 0x8eaeb6d4, 0x8eaeb4f8, 0x0000dbb5,
+ /* a8 */ 0x0000dbbf, 0x8ea2b5fe, 0x8ea2b6aa, 0x8ea2b5f9,
+ /* ac */ 0x8ea2b5fd, 0x0000dbba, 0x8ea2b5f8, 0x0000dbae,
+ /* b0 */ 0x0000dbb7, 0x0000dbb4, 0x8ea2b6a3, 0x0000d6a2,
+ /* b4 */ 0x8ea2bce3, 0x0000dbb1, 0x8eaeb6cc, 0x8eaeb6d2,
+ /* b8 */ 0x8eaeb6de, 0x8eaeb6df, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x022c3 ***/
+
+ /* 80 */ 0x00000000, 0x8eaeb6d6, 0x00000000, 0x8eaebcc5,
+ /* 84 */ 0x0000dbb9, 0x8eaebcc1, 0x8ea2bce6, 0x8ea2bcfc,
+ /* 88 */ 0x8ea2bcf1, 0x0000dffb, 0x8eaebcb8, 0x0000dff6,
+ /* 8c */ 0x8ea2bce0, 0x0000dff7, 0x8ea2bcf0, 0x8eaebcbe,
+ /* 90 */ 0x8ea2bce9, 0x8ea2bcf6, 0x0000dff3, 0x8ea2bcce,
+ /* 94 */ 0x8ea2bcf8, 0x0000dfe9, 0x8ea2bcd6, 0x0000dfec,
+ /* 98 */ 0x0000dfeb, 0x00000000, 0x0000dffc, 0x8eaeb6d3,
+ /* 9c */ 0x8ea2bcd0, 0x8ea2bcf2, 0x8ea2bcf3, 0x0000dfee,
+ /* a0 */ 0x0000dfea, 0x8ea2bcde, 0x8eaebcbd, 0x0000dff5,
+ /* a4 */ 0x8ea2bcd9, 0x8eaebcb2, 0x8ea2bcf4, 0x0000dff1,
+ /* a8 */ 0x8ea2bcec, 0x8ea2bcf9, 0x8ea2bcd3, 0x8ea2bcd8,
+ /* ac */ 0x8ea2bcd2, 0x8eaebcaa, 0x0000dff0, 0x8ea2bce5,
+ /* b0 */ 0x8ea2c3e4, 0x8ea2bcd4, 0x0000dff4, 0x8ea2bcdd,
+ /* b4 */ 0x8ea2bcf5, 0x0000dfef, 0x8ea2bcda, 0x8ea2bcd7,
+ /* b8 */ 0x8ea2bce8, 0x0000dff2, 0x0000dfe8, 0x0000dffe,
+ /* bc */ 0x8ea2bceb, 0x8ea2bcea, 0x8eaebcb1, 0x8eaebcc2,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x02303 ***/
+
+ /* 80 */ 0x8eaebcb9, 0x8eaebcbb, 0x8eaebcb4, 0x8eaebcaf,
+ /* 84 */ 0x8ea2bccf, 0x0000dfed, 0x8ea2bcf7, 0x8ea2bcdf,
+ /* 88 */ 0x8ea2bce1, 0x8eaebcb7, 0x8ea2bcee, 0x8ea2bced,
+ /* 8c */ 0x8ea2bccd, 0x0000dff8, 0x0000dffa, 0x8ea2bcd5,
+ /* 90 */ 0x8ea2bcdc, 0x8ea2bce4, 0x0000dff9, 0x8ea2bcdb,
+ /* 94 */ 0x8ea2bce7, 0x8ea2bcfa, 0x00000000, 0x8ea2bcef,
+ /* 98 */ 0x8eaebcbc, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x8eaebcc4, 0x00000000, 0x8eaebcb3, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x8ea2bcfb, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x8eaee5af, 0x8ea2bcd1, 0x00000000,
+ /* ac */ 0x8eaee5ae, 0x00000000, 0x8eaebcc0, 0x8ea2c3f8,
+ /* b0 */ 0x0000e4cc, 0x8eaec1e5, 0x8ea2c3f6, 0x8ea2c3e1,
+ /* b4 */ 0x8ea2c3e6, 0x8ea2c3df, 0x8eaec1f7, 0x8ea2c3f2,
+ /* b8 */ 0x8ea2c3d1, 0x8ea2c3d8, 0x00000000, 0x8ea2c3f0,
+ /* bc */ 0x8ea2c3fa, 0x8ea2c3e2, 0x8eaec1e8, 0x8ea2c3d5,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02343 ***/
+
+ /* 80 */ 0x8ea2c3e8, 0x8ea2c3ed, 0x8ea2c3d9, 0x8eaec1eb,
+ /* 84 */ 0x8ea2c3ea, 0x8ea2c3d6, 0x8eaec1dd, 0x8eaec1f5,
+ /* 88 */ 0x8ea2c3dd, 0x8ea2c3de, 0x0000e4ce, 0x8ea2c3f1,
+ /* 8c */ 0x8ea2c3ef, 0x8eaec1f3, 0x8ea2c3d2, 0x8ea2c3f4,
+ /* 90 */ 0x8eaec1f4, 0x8ea2c3f5, 0x8ea2c3f7, 0x0000e4d2,
+ /* 94 */ 0x0000e4ca, 0x8eaec1ef, 0x8ea2b5fa, 0x8ea2c3da,
+ /* 98 */ 0x8ea2c3ec, 0x8ea2c3db, 0x0000e4c7, 0x0000e4d7,
+ /* 9c */ 0x8ea2c3f3, 0x0000e4d5, 0x0000e4d1, 0x8ea2c3d0,
+ /* a0 */ 0x0000e4c9, 0x8eaec1f9, 0x8ea2c3d3, 0x0000e4d6,
+ /* a4 */ 0x8eaec1f8, 0x8ea2c3e3, 0x8ea2c3cf, 0x8eaec1f6,
+ /* a8 */ 0x0000e4cf, 0x8ea2c3e7, 0x8ea2c3d7, 0x0000e4d0,
+ /* ac */ 0x8ea2c3e0, 0x0000e4c6, 0x0000dffd, 0x8ea2c3e9,
+ /* b0 */ 0x8ea2bce2, 0x8ea2c3d4, 0x00000000, 0x8eaec1ed,
+ /* b4 */ 0x8ea2c3ee, 0x0000e4cb, 0x8ea2c3eb, 0x0000e4c8,
+ /* b8 */ 0x8ea2c3e5, 0x0000e4d3, 0x8ea2c3dc, 0x8ea2c3f9,
+ /* bc */ 0x8eaec1ea, 0x8eaec1fb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02381 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x0000e4cd, 0x8ea2c5ac,
+ /* 84 */ 0x00000000, 0x8eaec1f2, 0x0000e4d4, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x8ea2caf0, 0x8ea2caee, 0x8eaec7ba,
+ /* 90 */ 0x8ea2cba6, 0x8ea2caec, 0x8eaec7bd, 0x8ea2cafe,
+ /* 94 */ 0x0000e4c5, 0x0000e9a8, 0x8ea2cae8, 0x8ea2cba5,
+ /* 98 */ 0x8eaec7d1, 0x8ea2caed, 0x8ea2cafb, 0x0000e9ad,
+ /* 9c */ 0x0000e9a6, 0x8eaec7ce, 0x8ea2cba3, 0x8eaec7c6,
+ /* a0 */ 0x8ea2cae6, 0x8ea2cba2, 0x8eaec7c7, 0x0000e9b8,
+ /* a4 */ 0x8ea2caf7, 0x8ea2cba9, 0x0000e9b6, 0x8ea2caef,
+ /* a8 */ 0x0000e9a7, 0x8ea2caf1, 0x8ea2cba1, 0x0000e9b0,
+ /* ac */ 0x8ea2caea, 0x0000e9b4, 0x0000e9aa, 0x8ea2caf3,
+ /* b0 */ 0x8ea2cae9, 0x8ea2cae3, 0x8eaec7be, 0x8ea2cafd,
+ /* b4 */ 0x0000e9b1, 0x8ea2cba8, 0x8ea2cae4, 0x0000e9ae,
+ /* b8 */ 0x00000000, 0x8ea2caf9, 0x8eaee3d2, 0x0000e9af,
+ /* bc */ 0x8ea2caeb, 0x8ea2caf6, 0x8ea2caf2, 0x8ea2caf4,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x023c1 ***/
+
+ /* 80 */ 0x8eaec7c3, 0x0000e9a9, 0x8ea2cba7, 0x0000e9b7,
+ /* 84 */ 0x8ea2caf5, 0x8eaec7bb, 0x8ea2cbaa, 0x00000000,
+ /* 88 */ 0x8eaec7bc, 0x8ea2cae5, 0x8ea2cafa, 0x0000e9ac,
+ /* 8c */ 0x0000e9b5, 0x0000e9b3, 0x8ea2cae7, 0x8ea2cafc,
+ /* 90 */ 0x0000e9b2, 0x8eaec7c5, 0x8eaec7c8, 0x0000e9ab,
+ /* 94 */ 0x8ea2caf8, 0x8eaec7cd, 0x8eaec7c4, 0x00000000,
+ /* 98 */ 0x8eaeccd4, 0x8ea2cba4, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x8eaec7cc, 0x8ea2d0fc, 0x8eaec7c2,
+ /* a4 */ 0x8ea2d0f8, 0x8ea2d0f4, 0x8ea2d1aa, 0x8ea2d1a7,
+ /* a8 */ 0x0000edb7, 0x8eaecce4, 0x8eaecce0, 0x8ea2d1ae,
+ /* ac */ 0x8ea2d0fb, 0x0000edc2, 0x8ea2d1a4, 0x8eaecccf,
+ /* b0 */ 0x8eaeccd1, 0x8ea2d0f7, 0x8ea2d1a3, 0x0000edbf,
+ /* b4 */ 0x8ea2d1b7, 0x00000000, 0x8ea2d1b4, 0x8ea2d1a6,
+ /* b8 */ 0x8ea2d0f5, 0x8eaeccdf, 0x8eaeccd7, 0x8ea2d1ab,
+ /* bc */ 0x8ea2d1ad, 0x0000edbb, 0x8ea2d1a1, 0x8ea2d0fa,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x02401 ***/
+
+ /* 80 */ 0x8ea2d0f1, 0x0000edb8, 0x0000edc0, 0x00000000,
+ /* 84 */ 0x8ea2d1b0, 0x0000edc1, 0x8ea2d0f2, 0x8ea2d1b6,
+ /* 88 */ 0x8ea2d1a9, 0x8ea2d1af, 0x0000edbe, 0x8eaecccd,
+ /* 8c */ 0x8eaeccd0, 0x8ea2d1ac, 0x8eaeccc7, 0x8ea2d1b3,
+ /* 90 */ 0x8eaeccdb, 0x0000edc3, 0x8eaeccd6, 0x0000edbd,
+ /* 94 */ 0x8ea2d1a5, 0x8ea2d0f6, 0x8ea2d1b8, 0x8ea2d0f3,
+ /* 98 */ 0x8ea2d1b1, 0x0000edba, 0x8eaeccca, 0x8ea2d0fd,
+ /* 9c */ 0x8eaeccc9, 0x8ea2d0fe, 0x0000edb9, 0x0000edb6,
+ /* a0 */ 0x8ea2d0f9, 0x0000edbc, 0x8eaeccd2, 0x0000edb5,
+ /* a4 */ 0x8eaecce2, 0x8ea2d1b2, 0x8ea2d1b5, 0x8ea2d1a2,
+ /* a8 */ 0x8ea2d7d5, 0x8eaeccde, 0x8eaeccd9, 0x00000000,
+ /* ac */ 0x8eaecce1, 0x8eaee5b0, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x8ea2d7cd, 0x8eaed1ac,
+ /* b4 */ 0x8ea2d7c9, 0x0000f1a1, 0x8eaed1bc, 0x8eaed1b8,
+ /* b8 */ 0x0000f0f4, 0x0000f0f9, 0x0000f0f5, 0x8ea2d7d7,
+ /* bc */ 0x8ea2d7e2, 0x0000f0f3, 0x8ea2d7cf, 0x8ea2d7d8,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x02441 ***/
+
+ /* 80 */ 0x8ea2d1a8, 0x8ea2d7d9, 0x8eaed1a8, 0x8eaed1ab,
+ /* 84 */ 0x0000f0fa, 0x8eaed1c0, 0x8ea2d7e8, 0x0000f0fe,
+ /* 88 */ 0x0000f1a3, 0x8ea2d7cb, 0x8eaed1bb, 0x0000f0fd,
+ /* 8c */ 0x8eaed1b1, 0x8ea2d7e6, 0x8ea2d7e7, 0x8ea2d7dd,
+ /* 90 */ 0x8ea2d7dc, 0x8ea2d7d4, 0x8eaed1a9, 0x8eaed1be,
+ /* 94 */ 0x8ea2d7de, 0x8ea2d7e5, 0x8ea2d7e4, 0x8eaed1af,
+ /* 98 */ 0x0000f0f8, 0x0000f0f6, 0x8ea2d7d6, 0x8ea2d7d3,
+ /* 9c */ 0x8eaed1c4, 0x8ea2d7d0, 0x8ea2d7e3, 0x0000f1a2,
+ /* a0 */ 0x8ea2d7e1, 0x0000f0fc, 0x0000f0fb, 0x8eaed1a7,
+ /* a4 */ 0x8ea2d7db, 0x00000000, 0x8ea2d7ca, 0x8ea2d7cc,
+ /* a8 */ 0x8ea2d7ce, 0x8ea2d7e0, 0x8ea2d7da, 0x0000f0f7,
+ /* ac */ 0x8eaed1ae, 0x8ea2d7d1, 0x8eaed1b2, 0x8ea2d7df,
+ /* b0 */ 0x8eaed1c1, 0x8eaed1ba, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x8ea2d7d2, 0x8eaee5b1,
+ /* b8 */ 0x00000000, 0x00000000, 0x8eaee5b2, 0x00000000,
+ /* bc */ 0x00000000, 0x8eaed4f5, 0x0000f3f8, 0x8ea2ddb1,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02481 ***/
+
+ /* 80 */ 0x0000f3f1, 0x8ea2dda2, 0x8eaed4fb, 0x8ea2ddad,
+ /* 84 */ 0x0000f3f3, 0x8ea2ddb4, 0x8eaed5a1, 0x8ea2dda9,
+ /* 88 */ 0x8eaed4fc, 0x8ea2dda4, 0x8eaed4f6, 0x00000000,
+ /* 8c */ 0x8ea2ddb5, 0x8ea2dcfe, 0x8ea2ddab, 0x8eaed5a7,
+ /* 90 */ 0x0000f3fa, 0x8ea2ddb0, 0x8ea2ddb6, 0x8ea2ddaa,
+ /* 94 */ 0x0000f3f2, 0x8ea2ddac, 0x8ea2dda1, 0x0000f3f9,
+ /* 98 */ 0x8eaed5a3, 0x8eaed4fa, 0x8ea2ddb3, 0x8ea2dda6,
+ /* 9c */ 0x0000f3f5, 0x8eaed5a4, 0x8ea2dda8, 0x8ea2dda5,
+ /* a0 */ 0x0000f3fb, 0x8ea2dda7, 0x0000f3f4, 0x0000f3f7,
+ /* a4 */ 0x8ea2ddaf, 0x8ea2dda3, 0x8ea2ddb2, 0x8eaed4f8,
+ /* a8 */ 0x8ea2ddae, 0x00000000, 0x8eaed5a9, 0x8eaed7f4,
+ /* ac */ 0x0000f6cf, 0x8ea2e1f3, 0x0000f6d4, 0x0000f6d5,
+ /* b0 */ 0x8eaed7f7, 0x8eaed8a1, 0x8eaed7f6, 0x0000f6ce,
+ /* b4 */ 0x8ea2e1f2, 0x8eaed7f8, 0x8ea2e1ef, 0x8ea2e1f0,
+ /* b8 */ 0x0000f6d2, 0x8ea2e1ea, 0x8ea2e1ee, 0x0000f6d1,
+ /* bc */ 0x8eaed7fe, 0x8ea2e1eb, 0x8eaed7f9, 0x8eaed8a3,
+
+ /*** Three byte table, leaf: e6abxx - offset 0x024c1 ***/
+
+ /* 80 */ 0x8eaed7fd, 0x8eaed7fa, 0x0000f6d3, 0x0000f6d0,
+ /* 84 */ 0x8eaed8a2, 0x8ea2e1e9, 0x8ea2e1ed, 0x8ea2e1f1,
+ /* 88 */ 0x8eaed7fb, 0x00000000, 0x8eaee5b3, 0x8ea2e5dc,
+ /* 8c */ 0x8ea2e5d9, 0x8ea2e5e2, 0x8eaedac4, 0x8ea2e5e1,
+ /* 90 */ 0x8ea2e5df, 0x8ea2e5da, 0x8eaedacf, 0x0000f8bf,
+ /* 94 */ 0x8eaedac5, 0x8eaedace, 0x00000000, 0x8eaedac7,
+ /* 98 */ 0x8eaedacd, 0x8ea2e5db, 0x0000f8be, 0x0000f3f6,
+ /* 9c */ 0x8ea2e5de, 0x0000f8bd, 0x8ea2e5e3, 0x8ea2e5dd,
+ /* a0 */ 0x8ea2e5d8, 0x8ea2e1ec, 0x8eaedac8, 0x8eaedac6,
+ /* a4 */ 0x00000000, 0x0000f8bc, 0x8eaee5b4, 0x8ea2e5d7,
+ /* a8 */ 0x8ea2e9a4, 0x8eaedcc9, 0x8ea2e9a3, 0x8ea2e5e0,
+ /* ac */ 0x0000f9f3, 0x8eaed7f5, 0x8ea2e9a7, 0x8ea2e9a8,
+ /* b0 */ 0x8ea2e9a2, 0x8ea2e9a6, 0x00000000, 0x8ea2e9a1,
+ /* b4 */ 0x8eaedcc7, 0x8eaee5b5, 0x00000000, 0x00000000,
+ /* b8 */ 0x8ea2ebdf, 0x8ea2e9a5, 0x0000faf2, 0x0000faf0,
+ /* bc */ 0x8ea2ebdd, 0x8eaedeb5, 0x8eaedeb4, 0x8eaedeb3,
+
+ /*** Three byte table, leaf: e6acxx - offset 0x02501 ***/
+
+ /* 80 */ 0x8ea2ebe0, 0x8eaedeb7, 0x8ea2ebdc, 0x8ea2ebde,
+ /* 84 */ 0x0000faf1, 0x00000000, 0x8eaedfcf, 0x8eaedfce,
+ /* 88 */ 0x8ea2edd3, 0x8ea2edd4, 0x0000fbe2, 0x8ea2edd2,
+ /* 8c */ 0x00000000, 0x8eaee5b6, 0x8eaee5b7, 0x8ea2efb1,
+ /* 90 */ 0x0000fcbb, 0x8ea2efaf, 0x8ea2efb0, 0x8ea2f0ba,
+ /* 94 */ 0x8eaee0f4, 0x00000000, 0x0000fda3, 0x8ea2f1a3,
+ /* 98 */ 0x8ea2f1a1, 0x8ea2f1a2, 0x8ea2f1a4, 0x8eaee1c0,
+ /* 9c */ 0x8eaee1e5, 0x8eaee1c1, 0x8ea2f2ab, 0x00000000,
+ /* a0 */ 0x0000c5ce, 0x0000c8b9, 0x8eaea3f9, 0x0000cebc,
+ /* a4 */ 0x00000000, 0x8ea2a7ca, 0x8eaea9d3, 0x8eaea9d4,
+ /* a8 */ 0x8ea2abc6, 0x8eaee2e9, 0x8eaeadbc, 0x8eaeb1e6,
+ /* ac */ 0x8ea2aff7, 0x8ea2aff9, 0x8eaeb1e5, 0x8ea2aff8,
+ /* b0 */ 0x8eaeb1e7, 0x8ea2affa, 0x0000dbc3, 0x8ea2b6bb,
+ /* b4 */ 0x8ea2affb, 0x8eaeb6e2, 0x8ea2b6ba, 0x8ea2b6bc,
+ /* b8 */ 0x8ea2b6bd, 0x8ea2bcfd, 0x0000e0a2, 0x8ea2bcfe,
+ /* bc */ 0x8ea2bda2, 0x0000e0a3, 0x0000e0a1, 0x8ea2bda1,
+
+ /*** Three byte table, leaf: e6adxx - offset 0x02541 ***/
+
+ /* 80 */ 0x8eaec1fd, 0x8ea2c4a2, 0x8ea2c3fe, 0x8ea2c3fd,
+ /* 84 */ 0x8eaec1fc, 0x8ea2c3fc, 0x8ea2c3fb, 0x0000e4d8,
+ /* 88 */ 0x8ea2c4a1, 0x0000e9b9, 0x8ea2cbab, 0x8ea2cbad,
+ /* 8c */ 0x0000e9ba, 0x8ea2cbac, 0x0000edc5, 0x8eaecce6,
+ /* 90 */ 0x0000edc4, 0x8ea2d1b9, 0x8eaecce5, 0x8eaecce7,
+ /* 94 */ 0x8ea2d7ea, 0x8ea2d7e9, 0x8ea2d7eb, 0x8eaed1c6,
+ /* 98 */ 0x8eaed1c5, 0x0000f1a4, 0x00000000, 0x8ea2ddb7,
+ /* 9c */ 0x0000f3fc, 0x8eaed5ab, 0x8ea2e1f4, 0x0000f6d6,
+ /* a0 */ 0x8ea2e5e4, 0x0000fbe3, 0x0000c5cf, 0x0000c6df,
+ /* a4 */ 0x0000c8ba, 0x0000cae3, 0x0000cebd, 0x0000cebe,
+ /* a8 */ 0x8eaea9d5, 0x8eaea9d6, 0x0000d1f1, 0x8eaeadbd,
+ /* ac */ 0x8eaeb1e8, 0x8ea2affc, 0x8eaebcc9, 0x8eaebcc7,
+ /* b0 */ 0x00000000, 0x8eaec1fe, 0x0000e4d9, 0x8eaec2a1,
+ /* b4 */ 0x8eaec7d3, 0x00000000, 0x8ea2d2d9, 0x0000f1a5,
+ /* b8 */ 0x0000f6d7, 0x0000c5d0, 0x8eaea2d3, 0x0000c8bb,
+ /* bc */ 0x00000000, 0x00000000, 0x8ea2a7cc, 0x0000cebf,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02581 ***/
+
+ /* 80 */ 0x8ea2a7cb, 0x8eaea9d8, 0x8ea2abc7, 0x0000d1f2,
+ /* 84 */ 0x8ea2abc8, 0x00000000, 0x0000d1f3, 0x00000000,
+ /* 88 */ 0x8ea2affe, 0x0000d6b2, 0x0000d6b1, 0x8eaeb1ea,
+ /* 8c */ 0x8ea2b6c2, 0x8ea2b6c0, 0x8ea2b6c1, 0x8ea2b6bf,
+ /* 90 */ 0x8eaeb6e4, 0x8ea2b6be, 0x00000000, 0x00000000,
+ /* 94 */ 0x8ea2bda3, 0x8ea2bda6, 0x0000e0a5, 0x8ea2bda4,
+ /* 98 */ 0x0000e0a4, 0x8ea2bda5, 0x00000000, 0x8ea2c4a3,
+ /* 9c */ 0x8eaec2a2, 0x8eaee3d4, 0x8ea2cbae, 0x8ea2cbaf,
+ /* a0 */ 0x8ea2cbb0, 0x8eaec7d4, 0x8ea2d1bc, 0x8ea2d1bb,
+ /* a4 */ 0x0000edc6, 0x8ea2d1ba, 0x8ea2d1bd, 0x8ea2d7ec,
+ /* a8 */ 0x00000000, 0x00000000, 0x8ea2d7ed, 0x8ea2d7ee,
+ /* ac */ 0x00000000, 0x8ea2ddb8, 0x0000f3fd, 0x0000f6d8,
+ /* b0 */ 0x8ea2e5e5, 0x00000000, 0x0000faf3, 0x8ea2a1bf,
+ /* b4 */ 0x8eaea9d9, 0x0000d1f4, 0x8ea2abc9, 0x0000d6b3,
+ /* b8 */ 0x00000000, 0x00000000, 0x0000dbc4, 0x8eaeb6e5,
+ /* bc */ 0x0000e0a6, 0x8ea2bda7, 0x8eaebccb, 0x0000e4db,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x025c1 ***/
+
+ /* 80 */ 0x0000e4da, 0x8eaec2a6, 0x00000000, 0x8ea2cbb1,
+ /* 84 */ 0x8ea2cbb2, 0x0000edc7, 0x0000edc8, 0x8ea2d7f0,
+ /* 88 */ 0x8ea2d7ef, 0x8ea2e1f5, 0x8ea2efb2, 0x0000c5d1,
+ /* 8c */ 0x8ea2a1c0, 0x0000c6e0, 0x8eaea3fa, 0x0000cae4,
+ /* 90 */ 0x8ea2a4c8, 0x8eaea9da, 0x0000d1f5, 0x0000e4dc,
+ /* 94 */ 0x0000c5d2, 0x00000000, 0x8ea2abca, 0x0000d1f6,
+ /* 98 */ 0x8ea2abcb, 0x00000000, 0x0000f3fe, 0x0000c5d3,
+ /* 9c */ 0x8eaee5b8, 0x8eaee5b9, 0x8ea2a7cd, 0x00000000,
+ /* a0 */ 0x8ea2abcc, 0x8eaeadc2, 0x8ea2b0a5, 0x8ea2b0a4,
+ /* a4 */ 0x8ea2b0a2, 0x8eaeb1ee, 0x8ea2b0a1, 0x8ea2b0a6,
+ /* a8 */ 0x8ea2b0a3, 0x8eaeb1ec, 0x8eaeb1ed, 0x0000dbc5,
+ /* ac */ 0x0000dbc6, 0x8eaeb6e6, 0x00000000, 0x0000e0a7,
+ /* b0 */ 0x8ea2bda8, 0x00000000, 0x8ea2bda9, 0x8ea2bdaa,
+ /* b4 */ 0x8eaebccd, 0x00000000, 0x8eaee5ba, 0x8ea2c4a7,
+ /* b8 */ 0x8ea2c4a8, 0x8ea2c4a6, 0x8eaec2a8, 0x8ea2c4a4,
+ /* bc */ 0x8ea2c4a5, 0x0000e4dd, 0x8ea2cbb3, 0x8ea2d1c0,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x02601 ***/
+
+ /* 80 */ 0x8ea2d1bf, 0x8ea2d1be, 0x8ea2d1c1, 0x8ea2d7f2,
+ /* 84 */ 0x8ea2d7f1, 0x0000f1a6, 0x8ea2d7f3, 0x00000000,
+ /* 88 */ 0x0000f4a1, 0x8ea2ddb9, 0x8eaed5ad, 0x8ea2e1f6,
+ /* 8c */ 0x8ea2e5e6, 0x8ea2edd5, 0x00000000, 0x0000c5d4,
+ /* 90 */ 0x0000c6e2, 0x0000c6e1, 0x00000000, 0x0000cec0,
+ /* 94 */ 0x8ea2a1c1, 0x8ea2a1df, 0x0000c8bc, 0x00000000,
+ /* 98 */ 0x8ea2a2d8, 0x8ea2a4c9, 0x8ea2a4ca, 0x0000cec1,
+ /* 9c */ 0x8eaea9dd, 0x8ea2a7ce, 0x8eaee5bb, 0x0000d1f7,
+ /* a0 */ 0x8ea2abcd, 0x8ea2abce, 0x00000000, 0x0000d6b4,
+ /* a4 */ 0x0000d6b8, 0x8ea2b0a7, 0x0000d6b7, 0x0000d6b5,
+ /* a8 */ 0x0000d6b6, 0x00000000, 0x8ea2b6c3, 0x0000dbc7,
+ /* ac */ 0x0000e0aa, 0x8eaebcce, 0x0000e0a8, 0x0000e0a9,
+ /* b0 */ 0x8ea2bdab, 0x8eaec2a9, 0x8eaec2aa, 0x0000e9bb,
+ /* b4 */ 0x0000c5d5, 0x00000000, 0x8ea2a1e0, 0x8eaea2d7,
+ /* b8 */ 0x0000c6e3, 0x8eaea2d4, 0x00000000, 0x8ea2a1e3,
+ /* bc */ 0x8eaea4a1, 0x00000000, 0x0000c6e6, 0x8ea2a1e2,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x02641 ***/
+
+ /* 80 */ 0x0000c6e5, 0x0000c6e4, 0x0000cae5, 0x8ea2a1e1,
+ /* 84 */ 0x8eaea2d8, 0x8eaea2d9, 0x8ea2a2d9, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x8ea2a2dd, 0x8ea2a2df,
+ /* 8c */ 0x8ea2a2e0, 0x0000c8c6, 0x0000c8c7, 0x8ea2a2dc,
+ /* 90 */ 0x0000c8c2, 0x8eaea3fd, 0x8ea2a2da, 0x8eaea4a5,
+ /* 94 */ 0x8ea2a2de, 0x0000c8c3, 0x8eaea6d5, 0x0000c8be,
+ /* 98 */ 0x8eaea3fc, 0x0000c8bf, 0x8eaea4a3, 0x0000c8c5,
+ /* 9c */ 0x8ea2a2db, 0x0000c8bd, 0x0000cae6, 0x0000c8c0,
+ /* a0 */ 0x0000c8c1, 0x0000c8c4, 0x00000000, 0x8eaee5bc,
+ /* a4 */ 0x00000000, 0x8ea2a4db, 0x8ea2a4d9, 0x8ea2a4cc,
+ /* a8 */ 0x0000caf2, 0x8ea2a4d3, 0x0000caed, 0x8ea2a4cd,
+ /* ac */ 0x8eaea9e4, 0x8ea2a4d5, 0x8eaea6d0, 0x8ea2a4d2,
+ /* b0 */ 0x0000caf0, 0x8ea2a4d1, 0x0000caf7, 0x8ea2a4da,
+ /* b4 */ 0x0000caf9, 0x8eaea6d3, 0x0000cafb, 0x8eaea3fe,
+ /* b8 */ 0x8ea2a4cb, 0x8eaea6d7, 0x0000caee, 0x8ea2a4dc,
+ /* bc */ 0x8eaea6d1, 0x0000caf5, 0x0000caf8, 0x8eaea6cc,
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02681 ***/
+
+ /* 80 */ 0x8ea2a7e5, 0x0000cae8, 0x0000cba1, 0x0000caf6,
+ /* 84 */ 0x8ea2a4ce, 0x0000caeb, 0x0000cafa, 0x8ea2a4d6,
+ /* 88 */ 0x0000cae9, 0x0000caea, 0x8ea2a7e3, 0x8ea2a4cf,
+ /* 8c */ 0x0000caf1, 0x0000cafc, 0x8ea2a4dd, 0x8ea2a4d0,
+ /* 90 */ 0x0000caef, 0x8eaea6cd, 0x0000caf4, 0x8ea2a7cf,
+ /* 94 */ 0x0000cafd, 0x8ea2a4d7, 0x0000caf3, 0x8eaea9e3,
+ /* 98 */ 0x0000cafe, 0x0000cae7, 0x8ea2a4d4, 0x0000caec,
+ /* 9c */ 0x8ea2a4d8, 0x8ea2a7e4, 0x8eaea6ce, 0x8eaea6d2,
+ /* a0 */ 0x8eaea6dc, 0x8eaea6d9, 0x8eaea6d6, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x8eaea6db, 0x0000cecd,
+ /* ac */ 0x0000cedd, 0x8ea2a7d6, 0x0000ced4, 0x8eaeadce,
+ /* b0 */ 0x8ea2a7eb, 0x0000cec5, 0x8eaea9eb, 0x0000cec8,
+ /* b4 */ 0x8ea2a7e2, 0x00000000, 0x8ea2a7d4, 0x8ea2a7d8,
+ /* b8 */ 0x0000ced0, 0x0000ced2, 0x8ea2a7db, 0x0000ced9,
+ /* bc */ 0x0000cecb, 0x0000cec9, 0x0000ceca, 0x0000ced8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x026c1 ***/
+
+ /* 80 */ 0x8ea2a7e7, 0x0000ced3, 0x8ea2a7da, 0x8ea2a7dc,
+ /* 84 */ 0x0000ced1, 0x0000ced6, 0x8ea2a7dd, 0x8ea2a7ea,
+ /* 88 */ 0x8eaea9ed, 0x0000d1f8, 0x0000cedc, 0x8eaee2e1,
+ /* 8c */ 0x0000cec6, 0x8ea2a7e9, 0x8eaea9ec, 0x8ea2a7ed,
+ /* 90 */ 0x8ea2a7d9, 0x8ea2a7ef, 0x8ea2a7e0, 0x0000cecf,
+ /* 94 */ 0x8ea2a7d5, 0x0000cece, 0x0000cee0, 0x0000ced5,
+ /* 98 */ 0x8eaea9ea, 0x8ea2a7d3, 0x8ea2abd7, 0x0000cedb,
+ /* 9c */ 0x0000cedf, 0x8ea2a7e1, 0x8ea2a7e6, 0x8eaea9e5,
+ /* a0 */ 0x0000cee1, 0x0000ceda, 0x0000cecc, 0x0000cec2,
+ /* a4 */ 0x8eaea9e9, 0x0000cec7, 0x8eaee2e0, 0x8ea2a7d7,
+ /* a8 */ 0x0000cec3, 0x8ea2a7ee, 0x8eaea9e7, 0x8ea2a7d1,
+ /* ac */ 0x8ea2a7d0, 0x8ea2a7de, 0x8ea2a7d2, 0x0000cede,
+ /* b0 */ 0x0000d6b9, 0x0000ced7, 0x8ea2a7df, 0x0000cec4,
+ /* b4 */ 0x8eaeadcf, 0x0000d2a9, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x8ea2a7ec, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeadc6,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x02701 ***/
+
+ /* 80 */ 0x8ea2abde, 0x8ea2abe1, 0x8eaeadd0, 0x8ea2abe4,
+ /* 84 */ 0x8ea2abd9, 0x8eaeadc8, 0x8eaeadca, 0x8ea2abe7,
+ /* 88 */ 0x8ea2abea, 0x8ea2abec, 0x8ea2abd6, 0x0000d1f9,
+ /* 8c */ 0x0000d1fe, 0x8ea2b0ac, 0x0000d2b0, 0x8ea2abe5,
+ /* 90 */ 0x8ea2abed, 0x8ea2abdd, 0x8ea2abd5, 0x8eaeadc9,
+ /* 94 */ 0x8eaeadc7, 0x8eaeadcd, 0x8ea2b0c7, 0x0000d2a3,
+ /* 98 */ 0x8ea2abe2, 0x8ea2abda, 0x8ea2abdc, 0x0000d2a8,
+ /* 9c */ 0x8eaeb1fa, 0x8ea2abdf, 0x0000d2a2, 0x8ea2abd2,
+ /* a0 */ 0x8ea2abe8, 0x8eaeadcb, 0x8ea2abeb, 0x8eaeadc5,
+ /* a4 */ 0x8eaeadd7, 0x0000d1fd, 0x8eaeadd3, 0x0000d2ab,
+ /* a8 */ 0x8ea2abcf, 0x0000d2ad, 0x0000d1fb, 0x0000d2b1,
+ /* ac */ 0x8ea2abe9, 0x8ea2abd1, 0x0000d2ae, 0x8ea2b0c1,
+ /* b0 */ 0x8ea2a7e8, 0x0000d2a1, 0x0000d1fa, 0x8ea2abd8,
+ /* b4 */ 0x8ea2abd0, 0x0000d2af, 0x0000d2a7, 0x8ea2abe3,
+ /* b8 */ 0x0000d2ac, 0x0000d2aa, 0x8ea2abdb, 0x0000d2a4,
+ /* bc */ 0x8ea2abd3, 0x0000d2a5, 0x0000d2a6, 0x8ea2abd4,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x02741 ***/
+
+ /* 80 */ 0x8ea2abe6, 0x0000d1fc, 0x8ea2abe0, 0x00000000,
+ /* 84 */ 0x8eaeadd5, 0x8eaeadd1, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x8eaeb1f7, 0x8eaeb1f3,
+ /* 98 */ 0x8ea2b0af, 0x0000d6c1, 0x0000d6c6, 0x8eaeb1f9,
+ /* 9c */ 0x8eaeb2a6, 0x8eaeb1f6, 0x8ea2b0b8, 0x8ea2b0be,
+ /* a0 */ 0x8ea2b0ba, 0x8ea2b0ad, 0x8ea2b0b0, 0x8ea2b0a9,
+ /* a4 */ 0x8ea2b0aa, 0x0000d6cd, 0x0000d6be, 0x8ea2b0b9,
+ /* a8 */ 0x8ea2b0c2, 0x0000d6c8, 0x0000d6ba, 0x8eaeb1ef,
+ /* ac */ 0x0000d6c3, 0x8ea2b0b1, 0x0000d6c5, 0x8ea2b0b2,
+ /* b0 */ 0x8ea2b0bc, 0x8eaeb2a2, 0x8eaeb2a5, 0x8eaeb1f2,
+ /* b4 */ 0x0000d6c7, 0x8ea2b0cb, 0x8ea2b0ab, 0x0000d6c0,
+ /* b8 */ 0x0000d6bf, 0x0000d6cb, 0x8ea2b0a8, 0x8ea2b0c9,
+ /* bc */ 0x8ea2b0bd, 0x8ea2b0ca, 0x8ea2b0c4, 0x8ea2b0b6,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02781 ***/
+
+ /* 80 */ 0x8ea2b0c5, 0x8eaeb2a1, 0x8ea2b0bf, 0x8ea2b0c8,
+ /* 84 */ 0x8ea2b0c6, 0x0000d6cc, 0x8ea2b0b7, 0x0000d6bd,
+ /* 88 */ 0x0000d6bc, 0x0000d6c4, 0x0000d6ca, 0x8ea2b0c3,
+ /* 8c */ 0x0000d6c9, 0x8ea2b0b4, 0x0000dbc8, 0x8eaeb1f8,
+ /* 90 */ 0x8ea2b0cc, 0x8ea2b0b3, 0x8ea2b0ae, 0x0000d6c2,
+ /* 94 */ 0x0000d6ce, 0x0000d6bb, 0x8eaeb2a7, 0x8ea2b0bb,
+ /* 98 */ 0x8ea2b0c0, 0x8eaeb1fd, 0x8eaeb1fb, 0x8eaeb1fc,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x8eaee5bd, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x0000dbea, 0x8ea2b6c5,
+ /* ac */ 0x8ea2b6c9, 0x8eaeb6ef, 0x0000dbd7, 0x0000dbd5,
+ /* b0 */ 0x8eaeb6fa, 0x8eaeb7a1, 0x0000dbcc, 0x8ea2b6c7,
+ /* b4 */ 0x8ea2b6c6, 0x0000dbe0, 0x8eaebcd0, 0x8ea2b6cc,
+ /* b8 */ 0x0000dbda, 0x8eaeb6f2, 0x8ea2b6de, 0x8ea2b6ea,
+ /* bc */ 0x0000dbc9, 0x8ea2b6db, 0x8ea2b6d4, 0x0000dbec,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x027c1 ***/
+
+ /* 80 */ 0x8ea2b6c4, 0x8eaeb6ea, 0x8ea2b6e0, 0x8eaeb6eb,
+ /* 84 */ 0x0000dbe9, 0x0000dbdd, 0x0000dbe8, 0x0000dbd3,
+ /* 88 */ 0x8ea2b6d0, 0x8ea2b6e2, 0x8ea2b6da, 0x0000dbd4,
+ /* 8c */ 0x0000dbce, 0x8ea2b6e8, 0x8eaeb6ec, 0x8ea2b6e1,
+ /* 90 */ 0x8ea2b6e3, 0x0000dbd6, 0x0000dbde, 0x8ea2b6e5,
+ /* 94 */ 0x8ea2b6ce, 0x8ea2b6df, 0x8ea2b6d3, 0x8ea2b6e7,
+ /* 98 */ 0x0000dbe3, 0x0000dbcb, 0x0000dbe1, 0x8ea2b6d8,
+ /* 9c */ 0x8ea2b6d6, 0x8ea2b6d7, 0x0000dbd8, 0x8ea2b6d2,
+ /* a0 */ 0x8ea2b6d1, 0x0000dbcd, 0x8ea2b6cb, 0x8ea2b6e9,
+ /* a4 */ 0x0000dbcf, 0x8ea2b6d5, 0x0000dbed, 0x8eaeb6f4,
+ /* a8 */ 0x0000dbe7, 0x8ea2b6ca, 0x0000dbe4, 0x0000dbe2,
+ /* ac */ 0x0000dbeb, 0x8ea2b6dc, 0x0000dbe6, 0x8ea2b0b5,
+ /* b0 */ 0x8ea2b6dd, 0x0000dbe5, 0x8ea2b6e4, 0x0000dbca,
+ /* b4 */ 0x8ea2b6d9, 0x0000dbdc, 0x8ea2b6cd, 0x0000dbdb,
+ /* b8 */ 0x8eaeb6fc, 0x0000dbd9, 0x0000dbd1, 0x0000dbd0,
+ /* bc */ 0x8ea2bdac, 0x8ea2b6e6, 0x8eaebcdd, 0x8eaeb7a8,
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02801 ***/
+
+ /* 80 */ 0x8ea2b6cf, 0x8eaeb7a6, 0x8eaeb7a3, 0x8ea2bdc1,
+ /* 84 */ 0x8eaeb6f0, 0x0000dbd2, 0x8eaeb6f7, 0x8eaeb7a4,
+ /* 88 */ 0x8eaeb6f6, 0x8eaeb7a5, 0x8eaeb6f9, 0x00000000,
+ /* 8c */ 0x8eaeb6fd, 0x00000000, 0x00000000, 0x8eaee5be,
+ /* 90 */ 0x00000000, 0x00000000, 0x8eaeb7a9, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb7a7,
+ /* 98 */ 0x8eaebcd4, 0x0000e0c7, 0x0000dbdf, 0x0000e0b5,
+ /* 9c */ 0x8ea2bdbb, 0x0000e0c3, 0x8eaebcd2, 0x8ea2bdaf,
+ /* a0 */ 0x0000e0b2, 0x0000e0ae, 0x8ea2bdcd, 0x0000e0b4,
+ /* a4 */ 0x0000e0b8, 0x0000e0b3, 0x0000e0bc, 0x8ea2bdd1,
+ /* a8 */ 0x8ea2bdc8, 0x8eaebceb, 0x8eaebced, 0x8ea2bdb6,
+ /* ac */ 0x0000e0c1, 0x0000e0bb, 0x8ea2bdc2, 0x0000e0ab,
+ /* b0 */ 0x8ea2bdce, 0x8ea2bdc7, 0x0000e0af, 0x8ea2bdbc,
+ /* b4 */ 0x0000e0be, 0x8ea2bdd9, 0x8ea2bdda, 0x00000000,
+ /* b8 */ 0x0000e0ac, 0x8ea2bdcc, 0x0000e0c0, 0x8ea2bdc0,
+ /* bc */ 0x8ea2bdb2, 0x8ea2bdb3, 0x0000e0c4, 0x8ea2bdb7,
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02841 ***/
+
+ /* 80 */ 0x8ea2bdbe, 0x8ea2bdb8, 0x8eaebcda, 0x0000e0c2,
+ /* 84 */ 0x0000e0ca, 0x8ea2bdb4, 0x8ea2bdad, 0x8ea2bdae,
+ /* 88 */ 0x8eaebcd6, 0x8ea2bdb0, 0x0000e0b1, 0x8ea2bdbd,
+ /* 8c */ 0x8eaebcee, 0x0000e0bf, 0x0000e0c8, 0x8eaebcd8,
+ /* 90 */ 0x8eaebce9, 0x8ea2bdbf, 0x8ea2bdd7, 0x8ea2bdcf,
+ /* 94 */ 0x0000e0ad, 0x8ea2bdd5, 0x0000e0b9, 0x8eaebce6,
+ /* 98 */ 0x0000e0b7, 0x8eaebce4, 0x8ea2bddb, 0x0000e0b6,
+ /* 9c */ 0x8ea2bdc5, 0x8ea2bdb9, 0x8ea2bdc3, 0x0000e0cd,
+ /* a0 */ 0x8ea2bdc9, 0x8ea2bdc6, 0x8ea2bdb5, 0x0000e0c9,
+ /* a4 */ 0x8ea2bdd3, 0x8ea2bdd0, 0x8ea2bdd8, 0x0000e0b0,
+ /* a8 */ 0x8ea2bdc4, 0x0000e0cc, 0x8eaebcdb, 0x8ea2bdcb,
+ /* ac */ 0x8eaec2ba, 0x8eaebce0, 0x0000e0ba, 0x0000e0bd,
+ /* b0 */ 0x8eaebcdc, 0x8ea2bdca, 0x0000e0cb, 0x8ea2bdba,
+ /* b4 */ 0x8ea2b6c8, 0x8eaebcd1, 0x8eaebcec, 0x8ea2bdd4,
+ /* b8 */ 0x8ea2bdd2, 0x8ea2bdd6, 0x00000000, 0x8eaebce2,
+ /* bc */ 0x8eaee5c2, 0x00000000, 0x8eaebce3, 0x00000000,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02881 ***/
+
+ /* 80 */ 0x8eaebce8, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaee5c0, 0x00000000, 0x8eaee3bd, 0x00000000,
+ /* 88 */ 0x8ea2bdb1, 0x0000e0c6, 0x8eaee5bf, 0x8eaee5c1,
+ /* 8c */ 0x00000000, 0x8ea2c4c7, 0x8ea2c4c6, 0x8ea2c4ac,
+ /* 90 */ 0x0000e4e3, 0x8eaec2b0, 0x8ea2c4c5, 0x8ea2c4af,
+ /* 94 */ 0x8ea2c4b0, 0x00000000, 0x0000e4ed, 0x8ea2c4ce,
+ /* 98 */ 0x0000e4e8, 0x8ea2c4c4, 0x8eaec2b3, 0x8ea2c4a9,
+ /* 9c */ 0x0000e4ee, 0x0000e4e4, 0x8ea2c4b8, 0x8ea2c4ae,
+ /* a0 */ 0x8ea2c4b1, 0x8ea2c4c9, 0x0000e4de, 0x8ea2c4d0,
+ /* a4 */ 0x8ea2c4c8, 0x0000e4e7, 0x8ea2c4bd, 0x0000e4f2,
+ /* a8 */ 0x8eaec2ae, 0x8eaec2b6, 0x0000e4f1, 0x0000e4eb,
+ /* ac */ 0x8eaec2c0, 0x00000000, 0x8ea2c4cf, 0x0000e4df,
+ /* b0 */ 0x8ea2c4bb, 0x8ea2c4b2, 0x8ea2c4bf, 0x8ea2c4cb,
+ /* b4 */ 0x0000e4f3, 0x8eaec2b9, 0x0000e4e1, 0x8ea2c4ba,
+ /* b8 */ 0x8eaec2ad, 0x8ea2c4b3, 0x0000e4ea, 0x8eaec2b1,
+ /* bc */ 0x0000e4e9, 0x8ea2c4b6, 0x8ea2c4c0, 0x8ea2c4ca,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x028c1 ***/
+
+ /* 80 */ 0x8ea2c4ad, 0x8ea2c4b7, 0x0000e4e2, 0x8ea2c4c1,
+ /* 84 */ 0x0000e4ef, 0x0000e4e6, 0x8ea2c4b4, 0x0000e4e5,
+ /* 88 */ 0x8ea2c4ab, 0x8ea2c4b9, 0x8ea2c4cd, 0x0000e0c5,
+ /* 8c */ 0x0000e9d7, 0x8ea2c4bc, 0x8ea2cbb4, 0x8ea2c4be,
+ /* 90 */ 0x8ea2c4cc, 0x0000e4ec, 0x8ea2c4b5, 0x0000e4e0,
+ /* 94 */ 0x0000e4f0, 0x0000edda, 0x8ea2c4aa, 0x00000000,
+ /* 98 */ 0x8ea2c4c3, 0x8eaec2c4, 0x8eaec2be, 0x8eaec2c7,
+ /* 9c */ 0x8ea2c4c2, 0x8eaec2bd, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaec2c5,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaec2bf, 0x00000000,
+ /* a8 */ 0x8eaec2bb, 0x8eaec2c6, 0x00000000, 0x8ea2cbd0,
+ /* ac */ 0x0000e9d4, 0x8ea2cbc5, 0x8ea2cbca, 0x0000e9c9,
+ /* b0 */ 0x8eaec7d6, 0x8ea2cbb6, 0x0000e9d6, 0x8eaec7d7,
+ /* b4 */ 0x0000e9c0, 0x8ea2cbb5, 0x8ea2cbd6, 0x0000e9d8,
+ /* b8 */ 0x8ea2cbb9, 0x8ea2cbc9, 0x8eaec7e5, 0x8ea2cbbb,
+ /* bc */ 0x8ea2cbd9, 0x8ea2cbd5, 0x0000e9be, 0x0000e9c8,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02901 ***/
+
+ /* 80 */ 0x8ea2d1db, 0x0000e9d5, 0x0000e9c6, 0x8ea2cbb7,
+ /* 84 */ 0x8eaec7e3, 0x8ea2cbd4, 0x0000e9ca, 0x8ea2cbd1,
+ /* 88 */ 0x8ea2cbde, 0x8ea2cbbd, 0x8ea2cbc6, 0x8eaeccf8,
+ /* 8c */ 0x8eaec7db, 0x8ea2cbdc, 0x8ea2cbd2, 0x0000e9c5,
+ /* 90 */ 0x8eaeccea, 0x8eaec7e4, 0x8ea2cbc4, 0x0000e9bf,
+ /* 94 */ 0x0000e9bd, 0x0000e9cf, 0x00000000, 0x8eaec7df,
+ /* 98 */ 0x8ea2cbc2, 0x8ea2cbbf, 0x8ea2cbc0, 0x8eaec7da,
+ /* 9c */ 0x8ea2cbd8, 0x8eaec7dc, 0x8ea2cbdd, 0x8ea2cbdb,
+ /* a0 */ 0x0000e9c3, 0x8ea2cbdf, 0x0000e9c7, 0x0000e9ce,
+ /* a4 */ 0x00000000, 0x8ea2cbb8, 0x8ea2d1c3, 0x8ea2cbc1,
+ /* a8 */ 0x8eaec7de, 0x0000e9c1, 0x0000e9d3, 0x0000e9d0,
+ /* ac */ 0x0000e9c4, 0x8ea2cbcb, 0x8ea2cbbc, 0x0000e9d1,
+ /* b0 */ 0x8ea2cbcd, 0x0000e9cb, 0x0000e9cd, 0x0000e9bc,
+ /* b4 */ 0x8eaec7dd, 0x8ea2cbcf, 0x8ea2cbc7, 0x8ea2cbba,
+ /* b8 */ 0x0000e9cc, 0x8ea2cbd7, 0x8ea2cbda, 0x8ea2cbc3,
+ /* bc */ 0x8ea2cbce, 0x8eaeccf4, 0x0000e9c2, 0x0000edc9,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02941 ***/
+
+ /* 80 */ 0x8ea2cbcc, 0x8ea2d1c2, 0x8eaec7e2, 0x8ea2cbd3,
+ /* 84 */ 0x8eaec7e1, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x8eaee5c4, 0x8eaee5c5, 0x8eaec7e6, 0x00000000,
+ /* 8c */ 0x8eaee5c3, 0x00000000, 0x8ea2cbbe, 0x8ea2d1cc,
+ /* 90 */ 0x8ea2d1d6, 0x0000edcc, 0x8ea2d1d5, 0x8ea2d1e1,
+ /* 94 */ 0x0000edce, 0x8ea2d1d3, 0x00000000, 0x8ea2d1d7,
+ /* 98 */ 0x0000edd9, 0x8eaeccfd, 0x8ea2d1ce, 0x0000edd1,
+ /* 9c */ 0x8eaeccf3, 0x8ea2d1da, 0x8ea2d7fb, 0x0000eddd,
+ /* a0 */ 0x0000eddc, 0x8ea2d1dc, 0x8ea2d1cb, 0x8ea2d1e6,
+ /* a4 */ 0x0000edd7, 0x8eaecceb, 0x0000edcd, 0x8ea2d1df,
+ /* a8 */ 0x00000000, 0x8ea2d1e3, 0x8ea2d1e8, 0x8ea2d1dd,
+ /* ac */ 0x8ea2d1d1, 0x0000edd0, 0x0000edd3, 0x0000eddb,
+ /* b0 */ 0x0000edd6, 0x8eaeccf5, 0x8ea2d1d4, 0x8ea2cbc8,
+ /* b4 */ 0x8eaeccfe, 0x8eaeccec, 0x8ea2d1d0, 0x8ea2d1e7,
+ /* b8 */ 0x0000edd2, 0x8eaeccf9, 0x0000edd5, 0x8ea2d1e9,
+ /* bc */ 0x0000edca, 0x8ea2d1de, 0x8ea2d1c4, 0x8ea2d1e4,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02981 ***/
+
+ /* 80 */ 0x0000f4aa, 0x8eaeccfa, 0x8ea2d1d2, 0x00000000,
+ /* 84 */ 0x0000edcb, 0x8ea2d1cd, 0x0000edcf, 0x8ea2d1c5,
+ /* 88 */ 0x0000e9d2, 0x8ea2d1c9, 0x8eaee3e3, 0x8ea2d1e2,
+ /* 8c */ 0x8ea2d1ca, 0x8ea2d1c8, 0x0000edd4, 0x8eaeccfb,
+ /* 90 */ 0x8ea2d1e0, 0x8eaeccf7, 0x8ea2d1c7, 0x8ea2d1d9,
+ /* 94 */ 0x8ea2d1d8, 0x8ea2d1e5, 0x8ea2d1cf, 0x0000edd8,
+ /* 98 */ 0x00000000, 0x8eaee5c7, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x8eaee5c6, 0x8ea2d7fe, 0x8eaed1d6,
+ /* a0 */ 0x0000f1b3, 0x0000f1a9, 0x8ea2d8ac, 0x8ea2d7f6,
+ /* a4 */ 0x0000f1ab, 0x8ea2d8a4, 0x0000f1b2, 0x0000f1ad,
+ /* a8 */ 0x8ea2d8a2, 0x8ea2ddbb, 0x8ea2d8a8, 0x8ea2d8ae,
+ /* ac */ 0x8ea2d8a7, 0x8ea2d7f4, 0x8ea2d8a5, 0x8ea2d8b0,
+ /* b0 */ 0x8ea2d8b2, 0x0000f1a8, 0x8ea2d8b1, 0x0000f1ae,
+ /* b4 */ 0x0000f1b4, 0x8eaed1d4, 0x0000f1b1, 0x8eaed1d8,
+ /* b8 */ 0x8ea2d8ab, 0x0000f1b0, 0x8ea2d8a6, 0x8eaed1cd,
+ /* bc */ 0x8ea2d7f8, 0x8ea2d7fd, 0x8eaed1d0, 0x8ea2d8aa,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x029c1 ***/
+
+ /* 80 */ 0x0000f1af, 0x0000f1ac, 0x0000f1a7, 0x0000f1aa,
+ /* 84 */ 0x8ea2d7fc, 0x00000000, 0x8ea2d1c6, 0x8ea2d7f7,
+ /* 88 */ 0x8ea2d7fa, 0x8ea2d8ad, 0x8ea2d8a1, 0x8ea2d7f5,
+ /* 8c */ 0x8ea2ddba, 0x8ea2d8af, 0x8ea2d7f9, 0x8ea2d8a9,
+ /* 90 */ 0x8eaeccf1, 0x00000000, 0x00000000, 0x8eaed1d5,
+ /* 94 */ 0x8ea2ddbd, 0x0000f4ae, 0x8eaed5b0, 0x8eaed5af,
+ /* 98 */ 0x0000f4a2, 0x8eaed5b5, 0x8eaed5b6, 0x0000f4a6,
+ /* 9c */ 0x8ea2ddbf, 0x8ea2ddc5, 0x8ea2ddc3, 0x0000f4a4,
+ /* a0 */ 0x0000f4a5, 0x0000f4ac, 0x8ea2ddc6, 0x8ea2ddbe,
+ /* a4 */ 0x0000f4a7, 0x8eaed5b1, 0x8ea2ddc2, 0x8ea2ddc1,
+ /* a8 */ 0x8ea2ddc7, 0x0000f4ad, 0x8eaed5b7, 0x0000f4a8,
+ /* ac */ 0x0000f4ab, 0x8ea2ddc0, 0x0000f4af, 0x0000f4a9,
+ /* b0 */ 0x0000f4b0, 0x0000f4a3, 0x8ea2ddc4, 0x8eaedad5,
+ /* b4 */ 0x8ea2ddbc, 0x8eaed1d9, 0x8eaed5b9, 0x8ea2e2a5,
+ /* b8 */ 0x8eaee5c8, 0x00000000, 0x0000f6dd, 0x8ea2e2a2,
+ /* bc */ 0x8ea2e2a4, 0x8eaed8a8, 0x0000f6db, 0x8ea2e1fe,
+
+ /*** Three byte table, leaf: e780xx - offset 0x02a01 ***/
+
+ /* 80 */ 0x8ea2e2a1, 0x8ea2e1fa, 0x8eaed8aa, 0x8eaed8a7,
+ /* 84 */ 0x8ea2d8a3, 0x8ea2e1fb, 0x0000f6dc, 0x8ea2e1f7,
+ /* 88 */ 0x8eaed8a6, 0x0000f6d9, 0x8ea2e2a6, 0x0000f6da,
+ /* 8c */ 0x8ea2e1f8, 0x8ea2e1f9, 0x8ea2e1fd, 0x0000f6df,
+ /* 90 */ 0x8eaed8a9, 0x0000f6de, 0x00000000, 0x8eaed8ab,
+ /* 94 */ 0x8ea2e1fc, 0x0000f8c5, 0x8ea2e5ea, 0x8ea2e5f0,
+ /* 98 */ 0x0000f8c6, 0x8ea2e5e7, 0x0000f8c3, 0x0000f8c0,
+ /* 9c */ 0x8ea2e5f2, 0x0000f8c4, 0x8eaedad2, 0x0000f8c1,
+ /* a0 */ 0x8ea2e5e9, 0x8ea2e5ec, 0x8ea2e5ed, 0x8ea2e5ee,
+ /* a4 */ 0x8ea2e5f1, 0x8eaedad4, 0x8ea2e2a3, 0x8ea2e5e8,
+ /* a8 */ 0x0000f8c2, 0x8ea2e5ef, 0x8ea2e9b4, 0x8ea2e5eb,
+ /* ac */ 0x8eaedad3, 0x8eaee5ca, 0x8eaee5c9, 0x8ea2e9ab,
+ /* b0 */ 0x0000f9f5, 0x8ea2e9ae, 0x0000f9f6, 0x8ea2e9b7,
+ /* b4 */ 0x8ea2e9ad, 0x8ea2e9aa, 0x8eaedcd1, 0x8ea2e9ac,
+ /* b8 */ 0x8ea2e9b0, 0x8ea2e9b3, 0x8ea2e9b2, 0x8ea2e9b6,
+ /* bc */ 0x8ea2e9a9, 0x8eaedccf, 0x0000f9f4, 0x8ea2e9b1,
+
+ /*** Three byte table, leaf: e781xx - offset 0x02a41 ***/
+
+ /* 80 */ 0x8ea2e9b5, 0x8ea2e9b8, 0x8ea2e9af, 0x8ea2ebe1,
+ /* 84 */ 0x8ea2ebe2, 0x8ea2ebe6, 0x8ea2ebe7, 0x8eaedebc,
+ /* 88 */ 0x8ea2ebe4, 0x8ea2ebe5, 0x8ea2ebe3, 0x8eaedeba,
+ /* 8c */ 0x0000faf4, 0x8eaedebb, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000fbe4, 0x8ea2edd9, 0x8eaee0b6,
+ /* 94 */ 0x8eaedfd2, 0x8ea2edd6, 0x8ea2edd7, 0x8ea2edd8,
+ /* 98 */ 0x0000fbe5, 0x8eaee0b7, 0x8ea2efb4, 0x8ea2efb3,
+ /* 9c */ 0x8eaee5cb, 0x8ea2f0bd, 0x0000fce0, 0x8ea2f0bb,
+ /* a0 */ 0x8ea2f0be, 0x8ea2f0bc, 0x8ea2f1a5, 0x0000fda4,
+ /* a4 */ 0x0000fdb2, 0x8ea2f1f1, 0x8ea2f1db, 0x8eaee1f9,
+ /* a8 */ 0x8ea2f1f0, 0x8ea2f2be, 0x8ea2f2bf, 0x0000c5d6,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaea4a8, 0x8eaea4a6,
+ /* b0 */ 0x0000c8c8, 0x8ea2a2e1, 0x8eaea4a7, 0x8eaea4ab,
+ /* b4 */ 0x8ea2a4de, 0x8eaea6e2, 0x0000cba2, 0x8eaea6df,
+ /* b8 */ 0x0000cba5, 0x8eaea6de, 0x8ea2a4df, 0x8eaea6e3,
+ /* bc */ 0x0000cba3, 0x0000cba4, 0x8eaea6e0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02a80 ***/
+
+ /* 80 */ 0x00000000, 0x8eaea9f7, 0x8ea2a7f8, 0x8ea2a7fa,
+ /* 84 */ 0x8ea2a7f5, 0x8ea2a7f2, 0x8ea2a7f4, 0x8eaea9f4,
+ /* 88 */ 0x8eaea9f0, 0x8eaea9f5, 0x0000cee5, 0x8eaea9ef,
+ /* 8c */ 0x8eaea9f9, 0x8eaea9f6, 0x0000cee3, 0x8eaea9f2,
+ /* 90 */ 0x8eaea9f1, 0x8ea2a7f6, 0x0000cee4, 0x8ea2a7f3,
+ /* 94 */ 0x8ea2a7f0, 0x0000cee2, 0x8ea2a7f7, 0x00000000,
+ /* 98 */ 0x8ea2a7f1, 0x0000cee6, 0x8ea2a7f9, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2abef,
+ /* a0 */ 0x8eaeadde, 0x8ea2abf3, 0x8eaeaddc, 0x8eaeadda,
+ /* a4 */ 0x0000d2ba, 0x8eaeadd8, 0x8eaee2ea, 0x8eaeade5,
+ /* a8 */ 0x8eaeade2, 0x8ea2abf6, 0x8eaeaddf, 0x0000d2b2,
+ /* ac */ 0x0000d2b5, 0x0000d2b7, 0x0000d2b9, 0x0000d2b6,
+ /* b0 */ 0x8ea2abf2, 0x8ea2abf1, 0x8eaeade4, 0x0000d2b4,
+ /* b4 */ 0x8ea2abf4, 0x8ea2abf5, 0x8eaeade3, 0x8ea2abee,
+ /* b8 */ 0x0000d2b8, 0x8eaeade8, 0x0000d2b3, 0x8eaeaddd,
+ /* bc */ 0x00000000, 0x00000000, 0x8ea2abf0, 0x8eaee5cd,
+
+ /*** Three byte table, leaf: e783xx - offset 0x02ac0 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaeb2a8, 0x8ea2b0da, 0x8ea2b0db, 0x8ea2b0dc,
+ /* 88 */ 0x0000d6d3, 0x8eaee2f9, 0x0000d6cf, 0x8ea2b0d1,
+ /* 8c */ 0x8eaeb2aa, 0x8ea2b0d9, 0x8ea2b0de, 0x0000d6d4,
+ /* 90 */ 0x8eaeb2ab, 0x8ea2b0cf, 0x8ea2b0d5, 0x8ea2b0ce,
+ /* 94 */ 0x8ea2b0d8, 0x8eaeb2b1, 0x8eaeb2af, 0x8ea2b0d4,
+ /* 98 */ 0x0000d6d0, 0x0000d6d2, 0x8ea2b0dd, 0x8eaeb2a9,
+ /* 9c */ 0x8ea2b0cd, 0x8ea2b0d0, 0x8ea2b0d6, 0x8eaeb2ad,
+ /* a0 */ 0x8ea2b0d7, 0x8ea2b0df, 0x8ea2b0d3, 0x8eaeb2ac,
+ /* a4 */ 0x0000d6d1, 0x8eaee5cf, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x8eaee5ce, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaeb2b0, 0x0000dbf2,
+ /* b0 */ 0x8ea2b6f1, 0x8eaeb7b0, 0x8eaeb7b2, 0x8ea2b6f3,
+ /* b4 */ 0x8ea2b6ef, 0x8eaeb7af, 0x8ea2b6fb, 0x8ea2b6ed,
+ /* b8 */ 0x8ea2b6fa, 0x0000dbee, 0x8ea2b6eb, 0x8ea2bddf,
+ /* bc */ 0x8ea2b6f5, 0x0000dbf1, 0x8eaeb7b5, 0x8ea2b6f6,
+
+ /*** Three byte table, leaf: e784xx - offset 0x02b00 ***/
+
+ /* 80 */ 0x8ea2b6f9, 0x8eaeb7ae, 0x8ea2b6fd, 0x8eaeb7ac,
+ /* 84 */ 0x8ea2b6f2, 0x00000000, 0x8ea2b6f7, 0x8eaeb7ad,
+ /* 88 */ 0x8eaeb7b1, 0x0000dbef, 0x0000dbf0, 0x8ea2b6fc,
+ /* 8c */ 0x8ea2b6f0, 0x8ea2b6ec, 0x8ea2b6fe, 0x8eaeb7b3,
+ /* 90 */ 0x8ea2b6f4, 0x8eaee5d0, 0x8eaee5d1, 0x8ea2b6f8,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2b6ee,
+ /* 98 */ 0x00000000, 0x0000e0ce, 0x0000e0cf, 0x8ea2bde9,
+ /* 9c */ 0x0000e0d5, 0x8eaebcf4, 0x8ea2bddd, 0x8ea2bde6,
+ /* a0 */ 0x8ea2bddc, 0x0000e0d2, 0x8ea2bde4, 0x8ea2bde2,
+ /* a4 */ 0x8eaebcfd, 0x8ea2bde3, 0x0000e0d0, 0x8eaebcfc,
+ /* a8 */ 0x8ea2bde7, 0x00000000, 0x8eaebcef, 0x8eaebcfa,
+ /* ac */ 0x8eaebcf2, 0x8eaebda1, 0x8ea2bde0, 0x8ea2bdde,
+ /* b0 */ 0x0000e0d1, 0x8ea2bde1, 0x8ea2bde5, 0x8eaebcfb,
+ /* b4 */ 0x8eaebcf9, 0x8eaebcf1, 0x0000e0d3, 0x8eaebcf3,
+ /* b8 */ 0x8eaebcf7, 0x8eaee5d3, 0x8ea2bde8, 0x8eaee5d4,
+ /* bc */ 0x00000000, 0x8eaee5d5, 0x00000000, 0x8eaee5d2,
+
+ /*** Three byte table, leaf: e785xx - offset 0x02b40 ***/
+
+ /* 80 */ 0x00000000, 0x8ea2c4d6, 0x8ea2c4dd, 0x8ea2c4df,
+ /* 84 */ 0x8ea2c4e5, 0x8eaec2d7, 0x0000e5a2, 0x8ea2c4d1,
+ /* 88 */ 0x8eaec2cc, 0x0000e4f8, 0x8eaec2ce, 0x8ea2c4e0,
+ /* 8c */ 0x0000e4fd, 0x8ea2c4e6, 0x0000e4f4, 0x8eaec2d1,
+ /* 90 */ 0x8ea2c4e3, 0x8eaec2d8, 0x8ea2c4d3, 0x8ea2c4e4,
+ /* 94 */ 0x8ea2c4d2, 0x00000000, 0x0000e5a4, 0x8eaec2d2,
+ /* 98 */ 0x8ea2c4de, 0x0000e4f5, 0x8ea2c4e7, 0x8eaec8bc,
+ /* 9c */ 0x0000e4fa, 0x8ea2c4d7, 0x0000e5a1, 0x8ea2c4e2,
+ /* a0 */ 0x8ea2c4d5, 0x8ea2c4dc, 0x8ea2c4d8, 0x8ea2c4d4,
+ /* a4 */ 0x0000e4f7, 0x0000e4fe, 0x0000e4fc, 0x0000e4f9,
+ /* a8 */ 0x0000e5a3, 0x0000e4f6, 0x8ea2c4db, 0x8eaec2cf,
+ /* ac */ 0x0000e4fb, 0x8eaec2d9, 0x0000e0d4, 0x8eaec2c9,
+ /* b0 */ 0x8ea2c4e1, 0x8eaee5d9, 0x8ea2c4d9, 0x00000000,
+ /* b4 */ 0x8eaec2d3, 0x8eaee5d7, 0x8eaee5d8, 0x8eaee5d6,
+ /* b8 */ 0x8ea2c4da, 0x00000000, 0x00000000, 0x8ea2cbe7,
+ /* bc */ 0x8eaec7ef, 0x0000e9db, 0x8eaec7ee, 0x8eaec7ec,
+
+ /*** Three byte table, leaf: e786xx - offset 0x02b80 ***/
+
+ /* 80 */ 0x8ea2cbe3, 0x8ea2cbe9, 0x8ea2cbe5, 0x8eaec7f0,
+ /* 84 */ 0x0000e9dd, 0x8ea2cbe4, 0x8ea2cbe8, 0x8ea2cbe0,
+ /* 88 */ 0x8eaec7f2, 0x8ea2cbe2, 0x0000e9dc, 0x8eaec7ea,
+ /* 8c */ 0x8eaec7ed, 0x8eaec7eb, 0x8eaec7e8, 0x8ea2cbe6,
+ /* 90 */ 0x8ea2cbe1, 0x8eaec7e7, 0x0000e9de, 0x8eaee5db,
+ /* 94 */ 0x0000e9d9, 0x00000000, 0x8eaee5da, 0x8ea2cbea,
+ /* 98 */ 0x00000000, 0x0000e9da, 0x8ea2d1ef, 0x8ea2d1ec,
+ /* 9c */ 0x8ea2d1f8, 0x8ea2d1f2, 0x8ea2d1f4, 0x0000edde,
+ /* a0 */ 0x8ea2d1ee, 0x8ea2d1f6, 0x8eaecdaa, 0x8eaecda4,
+ /* a4 */ 0x8ea2d1f5, 0x8ea2d1f3, 0x8eaecda9, 0x8ea2d1f9,
+ /* a8 */ 0x0000ede1, 0x8ea2d1f0, 0x8ea2d1f7, 0x8eaecda8,
+ /* ac */ 0x0000eddf, 0x8eaecda5, 0x8eaecda2, 0x8ea2d1eb,
+ /* b0 */ 0x8ea2d1ed, 0x0000ede0, 0x8ea2d1ea, 0x8ea2d1fa,
+ /* b4 */ 0x8eaee5dc, 0x8ea2d1f1, 0x8eaed1e2, 0x8eaed1da,
+ /* b8 */ 0x8ea2d8b6, 0x0000f1bb, 0x8eaed1e0, 0x8eaed1dc,
+ /* bc */ 0x8ea2d8c1, 0x8ea2d8bf, 0x0000f1b5, 0x8ea2d8b5,
+
+ /*** Three byte table, leaf: e787xx - offset 0x02bc0 ***/
+
+ /* 80 */ 0x8ea2d8b8, 0x8ea2d8b9, 0x8ea2d8b4, 0x0000f1bf,
+ /* 84 */ 0x0000f1c0, 0x8ea2d8b3, 0x8ea2d8c2, 0x8ea2d8bd,
+ /* 88 */ 0x0000f1b9, 0x0000f1b6, 0x8ea2d8bc, 0x8ea2d8ba,
+ /* 8c */ 0x8eaed1e3, 0x8eaee3f4, 0x0000f1bc, 0x8ea2d8be,
+ /* 90 */ 0x0000f1b7, 0x8eaed1de, 0x0000f1b8, 0x8eaed1e6,
+ /* 94 */ 0x8ea2d8bb, 0x0000f1ba, 0x8ea2d8b7, 0x00000000,
+ /* 98 */ 0x8ea2d8c0, 0x0000f1bd, 0x8ea2d8c3, 0x8ea2d8c4,
+ /* 9c */ 0x0000f1be, 0x8eaee5dd, 0x8eaee5de, 0x0000f4b2,
+ /* a0 */ 0x0000f4b9, 0x8ea2ddc8, 0x8ea2ddce, 0x8eaed5bc,
+ /* a4 */ 0x8ea2ddcc, 0x0000f4b5, 0x0000f4b4, 0x0000f4b1,
+ /* a8 */ 0x8ea2ddca, 0x8eaed5be, 0x8eaed5c3, 0x8eaed5c0,
+ /* ac */ 0x0000f4b7, 0x0000f4b6, 0x0000f4b3, 0x8eaed5c1,
+ /* b0 */ 0x8ea2ddcd, 0x8ea2ddc9, 0x8ea2ddcb, 0x8eaed5c2,
+ /* b4 */ 0x0000f4b8, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x0000f6e3, 0x8ea2e2a9, 0x8eaed8ad, 0x0000f6e0,
+ /* bc */ 0x0000f6e1, 0x8ea2e2ab, 0x0000f6e2, 0x8ea2e2a8,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02c00 ***/
+
+ /* 80 */ 0x8eaed8ae, 0x8ea2e2a7, 0x8ea2e5f6, 0x8ea2e2aa,
+ /* 84 */ 0x8eaedad6, 0x8ea2e5f7, 0x0000f8c7, 0x8ea2e5f5,
+ /* 88 */ 0x8eaedad7, 0x00000000, 0x8ea2e5f4, 0x8eaedcd9,
+ /* 8c */ 0x8ea2e5f3, 0x0000f8c8, 0x8eaee5df, 0x8eaedcd6,
+ /* 90 */ 0x0000f9f7, 0x8eaedcd8, 0x8eaedcd5, 0x8ea2e9b9,
+ /* 94 */ 0x8ea2e9ba, 0x8eaedad8, 0x8eaedcd3, 0x8eaedcd7,
+ /* 98 */ 0x8eaee5e1, 0x8ea2ebea, 0x8ea2ebe9, 0x0000faf5,
+ /* 9c */ 0x8eaedfd3, 0x8ea2ebe8, 0x8ea2edda, 0x8ea2eddb,
+ /* a0 */ 0x8eaedfd4, 0x8eaee0b9, 0x8ea2efb5, 0x8ea2f0bf,
+ /* a4 */ 0x8eaee1c3, 0x8eaee1c2, 0x8ea2f1a6, 0x8ea2f2ac,
+ /* a8 */ 0x0000fdc6, 0x8ea2f2c0, 0x0000c5d7, 0x00000000,
+ /* ac */ 0x0000cee7, 0x0000cee8, 0x8eaeade9, 0x00000000,
+ /* b0 */ 0x0000d2bb, 0x00000000, 0x8eaebda2, 0x00000000,
+ /* b4 */ 0x00000000, 0x0000f4ba, 0x0000c5d8, 0x00000000,
+ /* b8 */ 0x0000cee9, 0x0000d6d5, 0x0000e5a5, 0x0000c5d9,
+ /* bc */ 0x8eaeadeb, 0x0000dbf3, 0x0000e9df, 0x8ea2a1c2,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02c40 ***/
+
+ /* 80 */ 0x8eaea9fc, 0x8ea2abf7, 0x8ea2b0e0, 0x00000000,
+ /* 84 */ 0x8ea2cbeb, 0x00000000, 0x0000f4bb, 0x0000c5da,
+ /* 88 */ 0x0000ceea, 0x8ea2abf8, 0x8ea2abf9, 0x8ea2bdea,
+ /* 8c */ 0x0000e0d6, 0x00000000, 0x8eaec2dd, 0x8ea2c4e8,
+ /* 90 */ 0x8eaec2dc, 0x8eaec2db, 0x0000e5a6, 0x8ea2cbec,
+ /* 94 */ 0x00000000, 0x8eaecdae, 0x0000ede2, 0x8eaecdad,
+ /* 98 */ 0x0000f8c9, 0x0000c5db, 0x8ea2bdeb, 0x0000c5dc,
+ /* 9c */ 0x00000000, 0x0000c8ca, 0x8ea2a2e2, 0x0000c8c9,
+ /* a0 */ 0x0000cba8, 0x0000cba7, 0x0000cba6, 0x8ea2a4e0,
+ /* a4 */ 0x8eaea6e4, 0x8eaeaaa1, 0x8eaeaaa2, 0x0000ceeb,
+ /* a8 */ 0x8eaeaaa3, 0x0000ceec, 0x8ea2a7fb, 0x00000000,
+ /* ac */ 0x8ea2abfa, 0x8eaeaded, 0x8ea2abfd, 0x0000d2bd,
+ /* b0 */ 0x8ea2abfb, 0x00000000, 0x0000d2bc, 0x8ea2abfc,
+ /* b4 */ 0x0000d2be, 0x00000000, 0x8ea2b0e3, 0x8ea2b0e2,
+ /* b8 */ 0x8ea2b0e1, 0x0000d6d6, 0x8eaeb2b6, 0x8ea2b7a2,
+ /* bc */ 0x8ea2b7a3, 0x0000dbf4, 0x8ea2b7a1, 0x8ea2b7a4,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02c80 ***/
+
+ /* 80 */ 0x0000e0d8, 0x0000dbf5, 0x8eaebda4, 0x8eaebda3,
+ /* 84 */ 0x0000e0d7, 0x8ea2bdef, 0x8ea2bdee, 0x8eaebda5,
+ /* 88 */ 0x8ea2bdec, 0x8ea2bded, 0x00000000, 0x8ea2bdf0,
+ /* 8c */ 0x8ea2c4ea, 0x8ea2c4e9, 0x8ea2c4ed, 0x00000000,
+ /* 90 */ 0x8ea2c4ec, 0x8ea2c4eb, 0x0000e9e0, 0x8ea2cbef,
+ /* 94 */ 0x8eaec7f5, 0x8ea2cbee, 0x0000e9e1, 0x8ea2cbed,
+ /* 98 */ 0x8ea2d1fb, 0x8eaecdaf, 0x8ea2d1fc, 0x0000ede3,
+ /* 9c */ 0x00000000, 0x8ea2d8c5, 0x8ea2d8c6, 0x00000000,
+ /* a0 */ 0x00000000, 0x8ea2e5fc, 0x0000f8ca, 0x8ea2e5fb,
+ /* a4 */ 0x8ea2e5fa, 0x8ea2e5f8, 0x8ea2e5f9, 0x0000faf6,
+ /* a8 */ 0x8ea2e9bb, 0x8ea2eddc, 0x8ea2f1a7, 0x8eaee1fb,
+ /* ac */ 0x0000c5dd, 0x00000000, 0x8ea2a1e4, 0x0000c6e7,
+ /* b0 */ 0x8ea2a1e5, 0x8eaea4ac, 0x8eaea4ad, 0x00000000,
+ /* b4 */ 0x8ea2a2e3, 0x8ea2a2e4, 0x8eaea6eb, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaea6e9, 0x8ea2a4e6, 0x8eaea6e6,
+ /* bc */ 0x8eaea6e7, 0x8ea2a4e2, 0x8eaea6ea, 0x8ea2a4e1,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02cc0 ***/
+
+ /* 80 */ 0x0000ceed, 0x8ea2a4e5, 0x0000cbaa, 0x8ea2a4e3,
+ /* 84 */ 0x0000cba9, 0x8ea2a4e7, 0x8ea2a4e4, 0x8eaea6e8,
+ /* 88 */ 0x00000000, 0x8ea2a8a1, 0x8ea2abfe, 0x8ea2a7fd,
+ /* 8c */ 0x8ea2a8a6, 0x8eaeaaa6, 0x0000ceee, 0x8eaeaaaa,
+ /* 90 */ 0x0000cef1, 0x8ea2a8a7, 0x8ea2a8a3, 0x8eaeaaa7,
+ /* 94 */ 0x8ea2a8a4, 0x00000000, 0x8ea2a7fc, 0x0000cef0,
+ /* 98 */ 0x8ea2a7fe, 0x0000ceef, 0x8ea2a8a5, 0x8eaeaaa8,
+ /* 9c */ 0x8ea2a8a2, 0x00000000, 0x00000000, 0x8ea2aca4,
+ /* a0 */ 0x0000d2c0, 0x0000d2c1, 0x8eaeadf5, 0x8ea2aca7,
+ /* a4 */ 0x8ea2aca1, 0x8eaeadf4, 0x8ea2aca6, 0x8eaeadf0,
+ /* a8 */ 0x8ea2aca2, 0x0000d2bf, 0x8ea2aca5, 0x8ea2aca3,
+ /* ac */ 0x8eaeadf3, 0x8eaeadf1, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2b0e9,
+ /* b4 */ 0x8ea2b0e6, 0x8eaeb2b8, 0x8ea2b0e8, 0x0000d6db,
+ /* b8 */ 0x0000d6da, 0x0000d6d8, 0x8ea2b0e5, 0x8ea2b0ea,
+ /* bc */ 0x0000d6d7, 0x0000d6d9, 0x8ea2b0e7, 0x8ea2b7ac,
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02d00 ***/
+
+ /* 80 */ 0x8ea2b0e4, 0x8ea2b0eb, 0x8eaeb2b9, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x8eaebda6, 0x8ea2b7a7,
+ /* 88 */ 0x8ea2b7ab, 0x00000000, 0x8ea2b7aa, 0x8ea2bdf2,
+ /* 8c */ 0x8ea2bdfd, 0x00000000, 0x8eaeb7bb, 0x8ea2b7ad,
+ /* 90 */ 0x8eaeb7ba, 0x8ea2b7a8, 0x8ea2bdf1, 0x0000dbf9,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000dbf8, 0x8ea2b7a6,
+ /* 98 */ 0x8ea2b7a9, 0x0000dbfa, 0x8eaeb7b9, 0x0000dbf7,
+ /* 9c */ 0x0000dbf6, 0x8ea2b7a5, 0x8ea2b7ae, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x8ea2bdf4, 0x8ea2bdfb,
+ /* a4 */ 0x8eaebda7, 0x0000e0da, 0x8ea2bdfa, 0x8ea2bdf7,
+ /* a8 */ 0x8eaebdae, 0x0000e0dc, 0x8eaebda9, 0x8eaebdab,
+ /* ac */ 0x8eaebdaa, 0x8ea2bdf9, 0x8eaec2e1, 0x8eaebdad,
+ /* b0 */ 0x8ea2bdf3, 0x8ea2bdf5, 0x8ea2bdf8, 0x8ea2bdf6,
+ /* b4 */ 0x0000e0db, 0x8ea2bdfc, 0x0000e0d9, 0x0000e5a7,
+ /* b8 */ 0x8eaebda8, 0x00000000, 0x8ea2c4f1, 0x8ea2c4f0,
+ /* bc */ 0x8ea2c4ee, 0x00000000, 0x0000e5aa, 0x0000e5a9,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x02d40 ***/
+
+ /* 80 */ 0x8ea2c4f2, 0x8eaec2df, 0x8ea2c4ef, 0x8ea2cbf0,
+ /* 84 */ 0x0000e9e2, 0x0000e5a8, 0x8eaec2e2, 0x8eaee5e2,
+ /* 88 */ 0x8eaee5e3, 0x8ea2c4f4, 0x8ea2c4f3, 0x8eaecdb0,
+ /* 8c */ 0x8ea2cbf3, 0x8ea2cbf1, 0x0000ede4, 0x8eaec7f9,
+ /* 90 */ 0x0000e9e3, 0x8ea2cbf2, 0x8ea2d1fe, 0x8eaec7f8,
+ /* 94 */ 0x8eaec7fa, 0x8eaec7f7, 0x00000000, 0x0000ede5,
+ /* 98 */ 0x8ea2d1fd, 0x8ea2d2a8, 0x8ea2d2a7, 0x8ea2d2a5,
+ /* 9c */ 0x00000000, 0x8ea2d2a4, 0x8ea2d2a1, 0x8ea2d2a2,
+ /* a0 */ 0x8ea2d2a3, 0x8ea2d2a6, 0x8ea2d2a9, 0x00000000,
+ /* a4 */ 0x00000000, 0x8ea2d8cb, 0x8ea2d8c8, 0x8ea2d8c9,
+ /* a8 */ 0x0000f1c1, 0x8ea2d8c7, 0x8ea2d8cd, 0x8ea2d8cc,
+ /* ac */ 0x8ea2d8ca, 0x00000000, 0x8ea2ddd0, 0x8ea2ddd1,
+ /* b0 */ 0x0000f4bc, 0x8eaed5c9, 0x0000f4bd, 0x8ea2ddcf,
+ /* b4 */ 0x00000000, 0x0000f6e5, 0x8ea2e2ac, 0x0000f6e4,
+ /* b8 */ 0x0000f8cb, 0x00000000, 0x0000f8cc, 0x0000f9f8,
+ /* bc */ 0x8ea2e9bd, 0x8ea2e9bc, 0x8ea2ebeb, 0x8ea2eddd,
+
+ /*** Three byte table, leaf: e78exx - offset 0x02d80 ***/
+
+ /* 80 */ 0x0000fbe6, 0x8ea2efb7, 0x8ea2efb6, 0x8ea2efb8,
+ /* 84 */ 0x0000c6e8, 0x8ea2aca8, 0x0000d6dc, 0x0000dbfb,
+ /* 88 */ 0x8ea2b7af, 0x0000c6e9, 0x8ea2a1e6, 0x0000c5de,
+ /* 8c */ 0x8eaea2da, 0x8eaea1eb, 0x8ea2a2e5, 0x8eaea4af,
+ /* 90 */ 0x00000000, 0x00000000, 0x8ea2a4ec, 0x8ea2a4ea,
+ /* 94 */ 0x8ea2a4eb, 0x8ea2a4e8, 0x0000cbab, 0x8ea2a4e9,
+ /* 98 */ 0x8eaea6ee, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x8eaeaab3, 0x8ea2a8af, 0x8eaeaaad, 0x0000cef4,
+ /* a0 */ 0x8ea2a8ad, 0x8ea2a8a9, 0x8ea2a8ac, 0x8eaeaaac,
+ /* a4 */ 0x8ea2a8a8, 0x0000cef6, 0x8ea2a8ab, 0x8eaeaaab,
+ /* a8 */ 0x0000cef3, 0x0000cef2, 0x8eaeaab2, 0x0000cef5,
+ /* ac */ 0x8ea2a8ae, 0x8ea2a8aa, 0x00000000, 0x8eaeaaaf,
+ /* b0 */ 0x00000000, 0x00000000, 0x0000d2c5, 0x0000d2c8,
+ /* b4 */ 0x8ea2acb0, 0x8ea2acaf, 0x8ea2acae, 0x0000d2c2,
+ /* b8 */ 0x8ea2acb7, 0x8ea2acad, 0x00000000, 0x0000d2c4,
+ /* bc */ 0x8ea2b0f0, 0x8eaeadf8, 0x8ea2acb4, 0x8ea2acb2,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x02dc0 ***/
+
+ /* 80 */ 0x0000d2c7, 0x8eaeadfb, 0x8ea2acaa, 0x8ea2acb5,
+ /* 84 */ 0x8eaeadf7, 0x8ea2acac, 0x8ea2acb6, 0x8ea2acb3,
+ /* 88 */ 0x8ea2acab, 0x8eaeadfa, 0x0000d2c3, 0x8ea2acb8,
+ /* 8c */ 0x8ea2aca9, 0x0000d2c6, 0x8eaeadfe, 0x8eaeadf9,
+ /* 90 */ 0x8eaeadfc, 0x00000000, 0x8ea2b0f5, 0x8ea2b0ec,
+ /* 94 */ 0x8ea2b0f7, 0x8eaeb2be, 0x8ea2b0ef, 0x8ea2b0fa,
+ /* 98 */ 0x8ea2b0fb, 0x8ea2b0ed, 0x8ea2b0f9, 0x8ea2b0f6,
+ /* 9c */ 0x8ea2b0f4, 0x8ea2b0f8, 0x0000d6e2, 0x8eaeb2c0,
+ /* a0 */ 0x0000d6e0, 0x8eaeb2c7, 0x8eaeb2bc, 0x8ea2b0f2,
+ /* a4 */ 0x8eaeb2c6, 0x8ea2b0ee, 0x8eaeb2c1, 0x8ea2b0f1,
+ /* a8 */ 0x8ea2b0fc, 0x8ea2b0f3, 0x0000d6e1, 0x8ea2acb1,
+ /* ac */ 0x8eaeb2bd, 0x0000d6dd, 0x0000d6df, 0x8eaee5e4,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb7bd,
+ /* b4 */ 0x8ea2b7bd, 0x8ea2b7b2, 0x8ea2b7b0, 0x8eaebdb8,
+ /* b8 */ 0x8ea2b7b1, 0x8eaeb2bf, 0x8ea2b7b8, 0x8eaeb7c0,
+ /* bc */ 0x8ea2b7b9, 0x8ea2b7b5, 0x0000dca2, 0x8ea2b7ba,
+
+ /*** Three byte table, leaf: e790xx - offset 0x02e00 ***/
+
+ /* 80 */ 0x8ea2b7b7, 0x8ea2b7b4, 0x8eaeb7bc, 0x0000dbfe,
+ /* 84 */ 0x8ea2b7b3, 0x0000dbfc, 0x0000dca1, 0x8ea2b7b6,
+ /* 88 */ 0x8ea2b7be, 0x0000d6de, 0x0000dbfd, 0x8ea2b7bc,
+ /* 8c */ 0x8ea2b7bb, 0x0000dca3, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x8eaee5e5, 0x00000000,
+ /* 94 */ 0x8eaebdb6, 0x8eaebdba, 0x8ea2bea4, 0x8eaebdaf,
+ /* 98 */ 0x8eaebdbb, 0x8eaebdb2, 0x8ea2bea5, 0x0000e0e6,
+ /* 9c */ 0x8eaebdb9, 0x8ea2beab, 0x8eaec2ed, 0x8eaebdb5,
+ /* a0 */ 0x8ea2bead, 0x8ea2bea6, 0x0000e0e0, 0x8ea2beaa,
+ /* a4 */ 0x8ea2bea9, 0x0000e0e1, 0x0000e0e7, 0x8eaec2e4,
+ /* a8 */ 0x0000e0e8, 0x8ea2beac, 0x0000e0de, 0x8ea2bea3,
+ /* ac */ 0x8ea2bea1, 0x8ea2bea7, 0x8ea2bdfe, 0x0000e0e5,
+ /* b0 */ 0x8ea2bea2, 0x8ea2bea8, 0x8ea2beae, 0x0000e0df,
+ /* b4 */ 0x0000e0e4, 0x0000e0e2, 0x0000e0e3, 0x00000000,
+ /* b8 */ 0x8eaebdb3, 0x8eaebdbc, 0x0000e0dd, 0x8eaee5e6,
+ /* bc */ 0x8eaebdb7, 0x8eaec2e8, 0x8eaec2f5, 0x0000e5b1,
+
+ /*** Three byte table, leaf: e791xx - offset 0x02e40 ***/
+
+ /* 80 */ 0x8ea2c4fb, 0x0000e5b0, 0x8ea2c5a1, 0x8eaec2ef,
+ /* 84 */ 0x8ea2c4f5, 0x8eaec2f4, 0x8ea2c5a2, 0x8eaec2ee,
+ /* 88 */ 0x8eaec2e6, 0x8eaec2f1, 0x8ea2c4f6, 0x8ea2c4f7,
+ /* 8c */ 0x8eaec2f3, 0x8ea2c5a3, 0x8ea2c4fe, 0x8ea2c4fc,
+ /* 90 */ 0x8ea2c4fd, 0x8ea2c4f9, 0x8ea2c4f8, 0x8eaec2e7,
+ /* 94 */ 0x8ea2c5a4, 0x0000e5ad, 0x8eaec2eb, 0x8ea2c4fa,
+ /* 98 */ 0x8eaec2f0, 0x0000e5b2, 0x0000e5ac, 0x0000e5b3,
+ /* 9c */ 0x0000e5b4, 0x8eaec2ea, 0x0000e5af, 0x0000e5ae,
+ /* a0 */ 0x8eaec8a5, 0x8eaec7fe, 0x8ea2cbf4, 0x0000e9e5,
+ /* a4 */ 0x0000e9e4, 0x8eaec7fc, 0x8eaec7fd, 0x8ea2cbf9,
+ /* a8 */ 0x8eaec8a2, 0x0000ede6, 0x0000e9e6, 0x8eaec8a1,
+ /* ac */ 0x8eaec7fb, 0x0000e9e8, 0x8ea2cbfa, 0x0000e5ab,
+ /* b0 */ 0x0000e9e7, 0x8ea2cbf6, 0x8ea2cbf8, 0x8ea2cbf5,
+ /* b4 */ 0x8eaec8a7, 0x8ea2cbf7, 0x8eaec8a3, 0x00000000,
+ /* b8 */ 0x00000000, 0x8ea2d2b3, 0x8eaecdb1, 0x8eaecdbb,
+ /* bc */ 0x8ea2d2b2, 0x8ea2d2af, 0x0000ede9, 0x8ea2d8ce,
+
+ /*** Three byte table, leaf: e792xx - offset 0x02e80 ***/
+
+ /* 80 */ 0x0000edea, 0x8ea2d2ae, 0x8eaecdb9, 0x0000ede8,
+ /* 84 */ 0x8eaecdb6, 0x8ea2d2b0, 0x8ea2d2ad, 0x8ea2d2aa,
+ /* 88 */ 0x8ea2d2b1, 0x8ea2d2ab, 0x8ea2d2ac, 0x0000ede7,
+ /* 8c */ 0x8eaecdb5, 0x8eaee5e8, 0x00000000, 0x00000000,
+ /* 90 */ 0x8ea2ddd5, 0x00000000, 0x8ea2d8d2, 0x8eaecdba,
+ /* 94 */ 0x8ea2d8d1, 0x8ea2d8d3, 0x8eaed1ea, 0x8ea2ddd2,
+ /* 98 */ 0x0000f1c4, 0x8eaee3f5, 0x8ea2d8cf, 0x8eaed1e7,
+ /* 9c */ 0x0000f1c2, 0x8eaed1ec, 0x0000f1c6, 0x0000f1c5,
+ /* a0 */ 0x8ea2d8d0, 0x8ea2d8d4, 0x8eaed1eb, 0x0000f1c3,
+ /* a4 */ 0x8eaee5e7, 0x8ea2ddd9, 0x0000f4c0, 0x0000f6e6,
+ /* a8 */ 0x0000f4c1, 0x0000f4be, 0x8ea2ddd6, 0x8ea2ddd4,
+ /* ac */ 0x8eaed5cf, 0x8ea2ddd7, 0x8eaed5cb, 0x8ea2ddda,
+ /* b0 */ 0x0000f4bf, 0x8ea2ddd8, 0x8ea2ddd3, 0x8eaed5cd,
+ /* b4 */ 0x8eaee5e9, 0x8ea2e2af, 0x8ea2e2b2, 0x8ea2e6a1,
+ /* b8 */ 0x8ea2e2ad, 0x8eaed8af, 0x8ea2e9be, 0x8ea2e2b3,
+ /* bc */ 0x8eaed8b0, 0x0000f8cd, 0x8ea2e2b1, 0x0000f6e7,
+
+ /*** Three byte table, leaf: e793xx - offset 0x02ec0 ***/
+
+ /* 80 */ 0x8ea2e2ae, 0x8ea2e2b0, 0x8ea2e2b4, 0x8ea2e6a2,
+ /* 84 */ 0x8eaedada, 0x8ea2e5fe, 0x00000000, 0x8eaedadc,
+ /* 88 */ 0x8eaedadd, 0x8eaedadb, 0x0000f8ce, 0x8ea2e5fd,
+ /* 8c */ 0x8eaedcde, 0x8eaedcdc, 0x8eaedcdf, 0x0000f9f9,
+ /* 90 */ 0x8eaedcdd, 0x8eaedce0, 0x00000000, 0x8eaedebd,
+ /* 94 */ 0x0000faf8, 0x8ea2eddf, 0x0000faf7, 0x8ea2ede1,
+ /* 98 */ 0x8ea2edde, 0x8ea2ede0, 0x0000fcbc, 0x8ea2f0c0,
+ /* 9c */ 0x0000c6ea, 0x8ea2a8b0, 0x8ea2b0fd, 0x8ea2b0fe,
+ /* a0 */ 0x0000dca4, 0x8ea2c5a5, 0x0000f1c7, 0x0000f8cf,
+ /* a4 */ 0x0000fbe7, 0x8ea2f0c1, 0x0000c6eb, 0x00000000,
+ /* a8 */ 0x8ea2a8b1, 0x0000a3a2, 0x00000000, 0x8eaeaea2,
+ /* ac */ 0x8ea2acb9, 0x8eaeaea1, 0x8ea2acba, 0x8eaeaea4,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb2c8,
+ /* b4 */ 0x8ea2b1a1, 0x8ea2b1a2, 0x0000dca5, 0x0000dca6,
+ /* b8 */ 0x00000000, 0x8eaebdbd, 0x00000000, 0x8ea2beaf,
+ /* bc */ 0x00000000, 0x8ea2c5a8, 0x8ea2c5a7, 0x8ea2c5a6,
+
+ /*** Three byte table, leaf: e794xx - offset 0x02f00 ***/
+
+ /* 80 */ 0x8ea2cbfb, 0x8eaec2f7, 0x8ea2cbfc, 0x8ea2cbfd,
+ /* 84 */ 0x0000e9e9, 0x00000000, 0x8eaec8a8, 0x8ea2d2b5,
+ /* 88 */ 0x8ea2d2b4, 0x8eaecdbd, 0x8eaed1ed, 0x8ea2d8d5,
+ /* 8c */ 0x0000f1c8, 0x0000f1c9, 0x8eaed1ee, 0x8ea2ddde,
+ /* 90 */ 0x8ea2dddb, 0x8ea2dddc, 0x8ea2dddd, 0x8ea2e2b6,
+ /* 94 */ 0x8ea2e2b5, 0x0000f6e8, 0x8ea2e6a3, 0x8ea2ebec,
+ /* 98 */ 0x0000c6ec, 0x00000000, 0x0000d2c9, 0x8eaeb7c4,
+ /* 9c */ 0x0000dca7, 0x8ea2c5a9, 0x8eaec2f8, 0x0000c6ed,
+ /* a0 */ 0x00000000, 0x8ea2b1a3, 0x0000dca8, 0x8eaeb7c5,
+ /* a4 */ 0x8eaebdbe, 0x0000e0e9, 0x0000e0ea, 0x00000000,
+ /* a8 */ 0x0000c6ee, 0x0000c6ef, 0x8ea2a2e6, 0x0000cbad,
+ /* ac */ 0x0000cbac, 0x0000d2ca, 0x8ea2acbb, 0x8ea2beb0,
+ /* b0 */ 0x0000c6f0, 0x0000c6f1, 0x0000c6f2, 0x0000c6f3,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000cbae,
+ /* b8 */ 0x0000cbaf, 0x8ea2a4ee, 0x8ea2a4ed, 0x8eaeaab7,
+ /* bc */ 0x00000000, 0x0000cef7, 0x8ea2a8b4, 0x8ea2a8b2,
+
+ /*** Three byte table, leaf: e795xx - offset 0x02f40 ***/
+
+ /* 80 */ 0x8ea2a8b3, 0x8eaeaab8, 0x8eaeaab5, 0x00000000,
+ /* 84 */ 0x8eaeaab6, 0x00000000, 0x8eaeaea7, 0x8ea2acbc,
+ /* 88 */ 0x8ea2acbd, 0x8eaeaea5, 0x8eaeaea8, 0x0000d2ce,
+ /* 8c */ 0x0000d2cc, 0x8eaeaeaa, 0x0000d2cd, 0x0000d2cb,
+ /* 90 */ 0x8eaeaea6, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000d6e3, 0x8eaeb2ce, 0x8eaeb2cd, 0x8eaeb2d0,
+ /* 98 */ 0x8eaeb2cf, 0x0000d6e7, 0x0000d6e6, 0x8ea2b1a4,
+ /* 9c */ 0x0000d6e5, 0x0000d6e4, 0x8eaeb2d1, 0x8ea2b1a5,
+ /* a0 */ 0x00000000, 0x8eaeb7c6, 0x0000dcab, 0x8ea2b7c0,
+ /* a4 */ 0x8ea2b7bf, 0x0000dca9, 0x0000dcaa, 0x8eaeb7c9,
+ /* a8 */ 0x8eaeb7c7, 0x00000000, 0x0000e0ec, 0x0000e0eb,
+ /* ac */ 0x8ea2beb2, 0x8eaebdc3, 0x8eaebdc2, 0x8ea2beb1,
+ /* b0 */ 0x0000dcac, 0x8eaebdc4, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x0000e5b5, 0x8ea2c5ab,
+ /* b8 */ 0x0000e5b6, 0x8ea2c5aa, 0x8eaec2fb, 0x00000000,
+ /* bc */ 0x00000000, 0x8ea2cbfe, 0x8ea2d2b6, 0x0000edeb,
+
+ /*** Three byte table, leaf: e796xx - offset 0x02f80 ***/
+
+ /* 80 */ 0x8ea2d8d6, 0x8eaed1f0, 0x00000000, 0x8eaed5d2,
+ /* 84 */ 0x8ea2dddf, 0x00000000, 0x0000f8d1, 0x0000f8d0,
+ /* 88 */ 0x00000000, 0x8eaedce2, 0x0000fbe8, 0x0000c6f4,
+ /* 8c */ 0x8ea2a8b5, 0x00000000, 0x8eaebdc5, 0x0000dcad,
+ /* 90 */ 0x8ea2cca1, 0x0000e9ea, 0x8eaea2db, 0x8eaea6f3,
+ /* 94 */ 0x8ea2a4ef, 0x8ea2a4f0, 0x00000000, 0x00000000,
+ /* 98 */ 0x8ea2a8b6, 0x0000cef9, 0x0000cefa, 0x8eaeaaba,
+ /* 9c */ 0x00000000, 0x0000cef8, 0x8eaeaabb, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x0000d2d2, 0x0000d2d3,
+ /* a4 */ 0x0000d2d0, 0x0000d2d1, 0x8eaeaeab, 0x8ea2acbe,
+ /* a8 */ 0x8eaeaeaf, 0x00000000, 0x8ea2acbf, 0x0000d2cf,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x8ea2b1a6, 0x8eaeb2d7, 0x0000d6eb, 0x0000d6ec,
+ /* b4 */ 0x8eaeb2d5, 0x0000dcb0, 0x8ea2b1ac, 0x00000000,
+ /* b8 */ 0x0000d6f1, 0x0000d6ef, 0x8ea2b1ad, 0x8ea2b1a8,
+ /* bc */ 0x0000d6ee, 0x0000d6ed, 0x0000d6e8, 0x8ea2b1ab,
+
+ /*** Three byte table, leaf: e797xx - offset 0x02fc0 ***/
+
+ /* 80 */ 0x8ea2b1aa, 0x8ea2b1a7, 0x0000d6f0, 0x8eaeb2d2,
+ /* 84 */ 0x8ea2b1a9, 0x0000d6e9, 0x00000000, 0x0000d6ea,
+ /* 88 */ 0x00000000, 0x00000000, 0x0000dcb1, 0x8ea2b7c4,
+ /* 8c */ 0x8ea2b7c5, 0x0000dcb2, 0x8ea2b7c1, 0x8ea2b7c3,
+ /* 90 */ 0x8ea2b7c7, 0x8ea2b7c6, 0x8ea2b7c2, 0x8eaeb7ca,
+ /* 94 */ 0x0000dcae, 0x0000dcaf, 0x00000000, 0x8ea2beba,
+ /* 98 */ 0x0000e0f1, 0x0000e0f0, 0x8ea2beb4, 0x0000e0ee,
+ /* 9c */ 0x00000000, 0x8ea2beb7, 0x0000e0f2, 0x8ea2beb8,
+ /* a0 */ 0x0000e0f3, 0x8ea2beb5, 0x0000e0ed, 0x0000e0ef,
+ /* a4 */ 0x8ea2beb9, 0x8eaebdc7, 0x8ea2beb6, 0x8ea2beb3,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x8ea2c5b8, 0x8eaec2fc, 0x8ea2c5ad,
+ /* b0 */ 0x0000e5b8, 0x0000e5bb, 0x0000e5ba, 0x0000e5bf,
+ /* b4 */ 0x0000e5be, 0x8ea2c5b9, 0x8ea2c5b7, 0x8ea2c5b0,
+ /* b8 */ 0x8ea2c5b4, 0x8ea2c5b3, 0x0000e5bc, 0x8ea2c5b6,
+ /* bc */ 0x8ea2c5b2, 0x8ea2c5ba, 0x8ea2c5b1, 0x0000e5bd,
+
+ /*** Three byte table, leaf: e798xx - offset 0x03000 ***/
+
+ /* 80 */ 0x0000e5b7, 0x0000e5b9, 0x8eaec2fd, 0x8ea2c5af,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaec8ab,
+ /* 88 */ 0x8ea2cca3, 0x0000e9ee, 0x8ea2cca7, 0x0000e9ed,
+ /* 8c */ 0x8ea2cca4, 0x0000e9ec, 0x8eaec8a9, 0x8ea2c5ae,
+ /* 90 */ 0x8ea2c5b5, 0x8ea2cca6, 0x00000000, 0x0000e9ef,
+ /* 94 */ 0x8ea2cca8, 0x8ea2cca5, 0x8ea2cca2, 0x00000000,
+ /* 98 */ 0x00000000, 0x8ea2d2b9, 0x8ea2d2bd, 0x8ea2d2bf,
+ /* 9c */ 0x8ea2d2bb, 0x8ea2d2ba, 0x8ea2d2b8, 0x0000edee,
+ /* a0 */ 0x0000edec, 0x0000edf1, 0x0000edf2, 0x8ea2d2bc,
+ /* a4 */ 0x0000edef, 0x8ea2d2b7, 0x0000edf0, 0x0000e9eb,
+ /* a8 */ 0x8ea2d2be, 0x0000eded, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaed1f1, 0x8ea2d8d8, 0x00000000, 0x8ea2d8d7,
+ /* b0 */ 0x8ea2d8df, 0x8ea2d8d9, 0x8ea2d8de, 0x8ea2d8db,
+ /* b4 */ 0x0000f1ca, 0x8ea2d8dd, 0x8eaed1f3, 0x8eaed1f2,
+ /* b8 */ 0x0000f1cb, 0x00000000, 0x0000f1cc, 0x8eaed1f4,
+ /* bc */ 0x8ea2d8dc, 0x8ea2d8da,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x0303e ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x0000f4c3, 0x8ea2dde0,
+ /* 84 */ 0x8eaed5d5, 0x8eaed5d3, 0x0000f4c2, 0x8ea2dde3,
+ /* 88 */ 0x8ea2dde1, 0x8ea2dde2, 0x00000000, 0x00000000,
+ /* 8c */ 0x0000f4c4, 0x00000000, 0x8eaed5d4, 0x8eaed8b4,
+ /* 90 */ 0x8ea2e2ba, 0x8eaed8b3, 0x0000f6eb, 0x8ea2e2bb,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000f6e9, 0x8ea2e2bc,
+ /* 98 */ 0x0000f6ea, 0x8ea2e2b9, 0x8ea2e2bd, 0x8eaed8b2,
+ /* 9c */ 0x8ea2e2b7, 0x00000000, 0x00000000, 0x0000f8d2,
+ /* a0 */ 0x8ea2e6a4, 0x0000f8d3, 0x0000f9fa, 0x00000000,
+ /* a4 */ 0x8ea2e2b8, 0x0000f9fb, 0x00000000, 0x8eaedebf,
+ /* a8 */ 0x8eaedebe, 0x0000faf9, 0x8ea2ebed, 0x00000000,
+ /* ac */ 0x0000fbea, 0x8ea2ede2, 0x0000fbe9, 0x8eaee0bb,
+ /* b0 */ 0x8ea2efb9, 0x0000fce1, 0x0000fce2, 0x8eaee5ea,
+ /* b4 */ 0x00000000, 0x8ea2f2ba, 0x8eaea2dc, 0x8eaee5eb,
+ /* b8 */ 0x0000d2d4, 0x8ea2acc0, 0x00000000, 0x0000e0f4,
+ /* bc */ 0x0000e0f5, 0x0000c6f5, 0x0000c8cb, 0x8ea2a2e7,
+
+ /*** Three byte table, leaf: e79axx - offset 0x0307e ***/
+
+ /* 80 */ 0x8eaea6f4, 0x8ea2a4f1, 0x0000cbb0, 0x8eaea6f6,
+ /* 84 */ 0x0000cefb, 0x00000000, 0x0000d2d5, 0x0000d2d6,
+ /* 88 */ 0x0000d2d7, 0x8ea2b7c9, 0x8ea2b1ae, 0x0000d6f2,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000dcb3, 0x8ea2b7c8,
+ /* 90 */ 0x8eaeb7cd, 0x00000000, 0x8ea2bebc, 0x0000e0f7,
+ /* 94 */ 0x8eaebdcc, 0x8ea2bebb, 0x0000e0f6, 0x8eaec2fe,
+ /* 98 */ 0x8eaec3a1, 0x8ea2c5bb, 0x0000edf3, 0x8ea2d2c3,
+ /* 9c */ 0x8ea2d2c0, 0x8ea2d2c1, 0x8ea2d2c2, 0x00000000,
+ /* a0 */ 0x00000000, 0x8eaed1f6, 0x00000000, 0x8eaed5d6,
+ /* a4 */ 0x8ea2dde4, 0x8eaed5d7, 0x8ea2e2be, 0x00000000,
+ /* a8 */ 0x00000000, 0x8eaedade, 0x8ea2e9c0, 0x8ea2e9bf,
+ /* ac */ 0x00000000, 0x8ea2ede3, 0x0000c6f6, 0x8ea2a8b7,
+ /* b0 */ 0x0000d6f3, 0x00000000, 0x00000000, 0x8eaebdcd,
+ /* b4 */ 0x0000e0f8, 0x8ea2c5bc, 0x00000000, 0x8eaec8b0,
+ /* b8 */ 0x8ea2cca9, 0x8eaec8ae, 0x0000edf4, 0x8ea2d8e0,
+ /* bc */ 0x8eaee5ec, 0x8ea2e2bf, 0x8ea2e9c1, 0x0000c6f7,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x030be ***/
+
+ /* 80 */ 0x8eaea6f7, 0x8eaea6f8, 0x0000cefc, 0x0000d2da,
+ /* 84 */ 0x8ea2acc1, 0x0000d2db, 0x0000d2d9, 0x8eaeaeb2,
+ /* 88 */ 0x0000d2d8, 0x8ea2b1af, 0x0000d6f4, 0x8eaeb2da,
+ /* 8c */ 0x8eaeb2db, 0x0000d6f5, 0x0000d6f6, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x0000dcb5, 0x8ea2b7ca,
+ /* 94 */ 0x0000dcb4, 0x8eaeb7d0, 0x8eaeb7d2, 0x8eaeb7d1,
+ /* 98 */ 0x00000000, 0x8eaebdcf, 0x8ea2bebd, 0x0000dcb6,
+ /* 9c */ 0x0000e0f9, 0x8ea2c5bd, 0x0000e5c0, 0x0000e5c1,
+ /* a0 */ 0x00000000, 0x0000e9f0, 0x8eaec8b1, 0x0000e9f1,
+ /* a4 */ 0x0000edf5, 0x0000f1ce, 0x8ea2d8e1, 0x0000f1cd,
+ /* a8 */ 0x00000000, 0x8ea2dde5, 0x0000f4c5, 0x8eaed8b5,
+ /* ac */ 0x8ea2e2c0, 0x8ea2e9c2, 0x0000c6f8, 0x0000cbb1,
+ /* b0 */ 0x8ea2a8ba, 0x8ea2a8b9, 0x0000cefd, 0x8ea2a8b8,
+ /* b4 */ 0x0000cefe, 0x8ea2a8bb, 0x00000000, 0x8ea2acc7,
+ /* b8 */ 0x0000d2de, 0x0000d2dd, 0x8ea2acc9, 0x8ea2acc8,
+ /* bc */ 0x0000d2e2, 0x8eaeaeb5, 0x0000d2e1, 0x8eaeaeb3,
+
+ /*** Three byte table, leaf: e79cxx - offset 0x030fe ***/
+
+ /* 80 */ 0x00000000, 0x0000d2dc, 0x00000000, 0x8ea2acc3,
+ /* 84 */ 0x8ea2acc4, 0x8ea2acc5, 0x8eaee2ec, 0x0000d2e3,
+ /* 88 */ 0x8ea2acc2, 0x0000d2df, 0x8ea2acc6, 0x0000d2e0,
+ /* 8c */ 0x00000000, 0x00000000, 0x8eaeb2e4, 0x8eaeb2df,
+ /* 90 */ 0x8ea2b1b2, 0x8ea2b1b6, 0x8ea2b1b4, 0x8ea2b1b3,
+ /* 94 */ 0x00000000, 0x8ea2b1b7, 0x8eaeb2de, 0x00000000,
+ /* 98 */ 0x8eaeb2e8, 0x8ea2b1b8, 0x8ea2b1b9, 0x8ea2b1b1,
+ /* 9c */ 0x00000000, 0x8ea2b1b0, 0x8eaeb7d9, 0x0000d6f8,
+ /* a0 */ 0x0000d6f9, 0x8eaeb2e7, 0x8ea2b1ba, 0x8ea2b1b5,
+ /* a4 */ 0x8eaeb2e5, 0x8ea2b7d3, 0x8eaeb7d5, 0x8ea2b1bb,
+ /* a8 */ 0x0000d6fa, 0x0000d6f7, 0x8eaeb2dc, 0x8eaeb2e3,
+ /* ac */ 0x00000000, 0x8ea2b7cd, 0x00000000, 0x8ea2b7cc,
+ /* b0 */ 0x8eaeb7d3, 0x8ea2b7ce, 0x8ea2b7cf, 0x8ea2b7d1,
+ /* b4 */ 0x8ea2b7d0, 0x8ea2b7d5, 0x0000dcba, 0x0000dcb7,
+ /* b8 */ 0x0000dcbb, 0x8ea2b7cb, 0x0000dcbc, 0x8ea2b7d4,
+ /* bc */ 0x0000dcb9, 0x8ea2b7d2, 0x0000dcb8, 0x8eaeb2e2,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x0313e ***/
+
+ /* 80 */ 0x8eaeb7d7, 0x00000000, 0x8eaebdd6, 0x8eaebdd3,
+ /* 84 */ 0x8ea2bec0, 0x8ea2bec2, 0x8ea2bebe, 0x8ea2bebf,
+ /* 88 */ 0x8eaebdd1, 0x8eaebdd2, 0x8ea2bec3, 0x8ea2bec5,
+ /* 8c */ 0x8ea2bec6, 0x8ea2bec1, 0x8ea2bec4, 0x0000e0fa,
+ /* 90 */ 0x00000000, 0x00000000, 0x8ea2c5c1, 0x8eaec3a7,
+ /* 94 */ 0x8ea2c5c6, 0x8ea2c5be, 0x8ea2c5c2, 0x00000000,
+ /* 98 */ 0x8eaec3a8, 0x8ea2c5c7, 0x8ea2c5c3, 0x0000e5c2,
+ /* 9c */ 0x0000e5ca, 0x8eaec3a5, 0x0000e5c5, 0x8ea2c5bf,
+ /* a0 */ 0x8ea2c5c0, 0x0000e9f5, 0x0000e5cd, 0x0000e5c6,
+ /* a4 */ 0x8eaec3a6, 0x0000e5cb, 0x0000e5c4, 0x8ea2c5c5,
+ /* a8 */ 0x0000e5cc, 0x8ea2c5c4, 0x0000e5c8, 0x0000e5c3,
+ /* ac */ 0x0000e5c9, 0x8ea2c5c8, 0x8ea2ccae, 0x8ea2ccb0,
+ /* b0 */ 0x00000000, 0x8eaec8b9, 0x00000000, 0x00000000,
+ /* b4 */ 0x8eaec8b3, 0x8eaec8b6, 0x8eaec8b5, 0x8eaec8b4,
+ /* b8 */ 0x8eaec8b8, 0x0000e5c7, 0x8eaec8bb, 0x8eaec8bd,
+ /* bc */ 0x8ea2ccab, 0x0000e9f3, 0x8ea2ccb1, 0x0000e9f4,
+
+ /*** Three byte table, leaf: e79exx - offset 0x0317e ***/
+
+ /* 80 */ 0x8ea2ccaf, 0x8ea2ccaa, 0x8ea2ccad, 0x8ea2ccb2,
+ /* 84 */ 0x0000e9f2, 0x8ea2ccac, 0x00000000, 0x0000edf7,
+ /* 88 */ 0x8ea2d2c7, 0x8ea2d2c6, 0x8eaecdc4, 0x0000edfa,
+ /* 8c */ 0x0000edf8, 0x8ea2d2c4, 0x0000edf6, 0x8ea2d2c5,
+ /* 90 */ 0x8eaecdc6, 0x0000edf9, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x8ea2d8e9, 0x8eaed1fb, 0x8ea2d8eb,
+ /* 98 */ 0x8eaed1f9, 0x8ea2d8ea, 0x8ea2d8e2, 0x8ea2d8e6,
+ /* 9c */ 0x8ea2d8e5, 0x8ea2d8e3, 0x0000f1d0, 0x0000f1d1,
+ /* a0 */ 0x0000f1cf, 0x8ea2d8e4, 0x8ea2d8e7, 0x8ea2d8e8,
+ /* a4 */ 0x8eaed5d9, 0x0000f1d2, 0x8eaed5d8, 0x0000f4ca,
+ /* a8 */ 0x8ea2dded, 0x8eaed5db, 0x0000f4c7, 0x8ea2dde7,
+ /* ac */ 0x0000f4c9, 0x0000f4cb, 0x00000000, 0x8eaed5dc,
+ /* b0 */ 0x0000f4c8, 0x8ea2ddec, 0x8ea2dde8, 0x0000f4c6,
+ /* b4 */ 0x8ea2ddeb, 0x8ea2dde6, 0x8ea2ddea, 0x8ea2dde9,
+ /* b8 */ 0x8eaed8b6, 0x8eaed8b8, 0x8ea2e2c2, 0x0000f6ee,
+ /* bc */ 0x0000f6ef, 0x0000f6ec, 0x8eaed8bb, 0x0000f6ed,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x031be ***/
+
+ /* 80 */ 0x8eaed8ba, 0x8eaed8b9, 0x8ea2e2c1, 0x00000000,
+ /* 84 */ 0x8ea2e6a7, 0x8eaedae0, 0x8eaedadf, 0x0000f8d4,
+ /* 88 */ 0x00000000, 0x8ea2e6a5, 0x8ea2e6a6, 0x00000000,
+ /* 8c */ 0x8ea2e9c3, 0x8ea2e9c6, 0x8ea2e9c4, 0x8ea2e9c5,
+ /* 90 */ 0x8ea2ebee, 0x8eaedec2, 0x00000000, 0x0000fafa,
+ /* 94 */ 0x8ea2efba, 0x8ea2f0c2, 0x8eaee4b2, 0x0000fce3,
+ /* 98 */ 0x8ea2f1a8, 0x8ea2f1a9, 0x0000fdb3, 0x0000c6f9,
+ /* 9c */ 0x0000d2e4, 0x8eaeb2e9, 0x8ea2bec7, 0x8eaebdd7,
+ /* a0 */ 0x8ea2c5c9, 0x00000000, 0x0000c6fa, 0x0000cbb2,
+ /* a4 */ 0x00000000, 0x0000cfa1, 0x8eaeaeb6, 0x8ea2acca,
+ /* a8 */ 0x8ea2accb, 0x0000d6fb, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2bec8, 0x0000e0fb, 0x0000e5ce, 0x0000f4cc,
+ /* b0 */ 0x8ea2ddee, 0x8ea2e6a8, 0x8ea2e9c7, 0x0000c6fb,
+ /* b4 */ 0x8eaea6fb, 0x8eaea6fc, 0x00000000, 0x8ea2a8c1,
+ /* b8 */ 0x8ea2a8bc, 0x8ea2a8be, 0x8ea2a8c0, 0x8ea2a8bf,
+ /* bc */ 0x8ea2a8bd, 0x0000cfa2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x031fc ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x0000d2e5, 0x8ea2acd4,
+ /* 84 */ 0x8eaeaeb9, 0x8ea2accf, 0x8ea2accc, 0x8eaeaebb,
+ /* 88 */ 0x8eaeaebe, 0x8ea2acd3, 0x8eaeaeb7, 0x8eaeaeba,
+ /* 8c */ 0x0000d2e7, 0x0000d2e8, 0x8ea2acd2, 0x8ea2acd1,
+ /* 90 */ 0x8ea2acd0, 0x8ea2accd, 0x8ea2acce, 0x8ea2acd5,
+ /* 94 */ 0x0000d2e6, 0x8eaeaebd, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x8eaee5ed, 0x00000000, 0x8eaee5ee,
+ /* 9c */ 0x00000000, 0x0000d7a1, 0x8eaee6fc, 0x0000d7a7,
+ /* a0 */ 0x0000d7a6, 0x8ea2b1c4, 0x8ea2b1be, 0x8ea2b1bc,
+ /* a4 */ 0x8eaeb2ec, 0x0000d7a4, 0x8ea2b7dc, 0x0000d6fd,
+ /* a8 */ 0x8ea2b1c1, 0x8ea2b1c5, 0x8ea2b1c7, 0x8ea2b1c3,
+ /* ac */ 0x8ea2b1bd, 0x0000d7a5, 0x8ea2b1c2, 0x8ea2b1c0,
+ /* b0 */ 0x0000d6fc, 0x8ea2b1c8, 0x0000d7a8, 0x8ea2b1c6,
+ /* b4 */ 0x0000d7a2, 0x8ea2b1bf, 0x8eaeb2ed, 0x0000d7a3,
+ /* b8 */ 0x0000d6fe, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x8eaee5ef,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x0323a ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8eaeb7e2, 0x0000dcbe,
+ /* 84 */ 0x00000000, 0x8ea2b7dd, 0x8eaeb7e3, 0x8eaeb7dd,
+ /* 88 */ 0x8ea2b7d6, 0x8ea2b7d8, 0x8ea2b7da, 0x8eaeb7df,
+ /* 8c */ 0x8ea2b7db, 0x8ea2b7d9, 0x0000dcbf, 0x8eaeb7e1,
+ /* 90 */ 0x8ea2b7de, 0x8eaeb7e0, 0x8ea2b7d7, 0x8eaee5f0,
+ /* 94 */ 0x8eaee5f1, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x8eaee5f2, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x8ea2becc, 0x0000e0fc, 0x8ea2bed4, 0x8eaebddc,
+ /* a0 */ 0x8ea2bec9, 0x00000000, 0x8ea2bed5, 0x8eaebdd9,
+ /* a4 */ 0x8ea2beca, 0x8ea2becb, 0x8eaebddd, 0x00000000,
+ /* a8 */ 0x8ea2bed3, 0x8ea2bed2, 0x8ea2becf, 0x0000dcbd,
+ /* ac */ 0x0000e0fd, 0x8ea2becd, 0x8ea2bed0, 0x0000e0fe,
+ /* b0 */ 0x8ea2bed1, 0x8ea2bece, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaebdda, 0x00000000,
+ /* b8 */ 0x8eaec3b1, 0x8ea2c5d4, 0x8eaec3ad, 0x8ea2c5d8,
+ /* bc */ 0x0000e5d5, 0x8eaec3ae, 0x8ea2ccb8, 0x0000e5d8,
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0327a ***/
+
+ /* 80 */ 0x8ea2c5d6, 0x8eaec3b7, 0x8eaec3a9, 0x8ea2c5d3,
+ /* 84 */ 0x8ea2c5ce, 0x8ea2c5d0, 0x8ea2c5d1, 0x8ea2c5ca,
+ /* 88 */ 0x8eaec3b5, 0x0000e5d4, 0x8eaec3ab, 0x8eaec3b0,
+ /* 8c */ 0x0000e5d3, 0x8eaec3b4, 0x0000e5cf, 0x8ea2c5cd,
+ /* 90 */ 0x8eaec3aa, 0x0000e5d6, 0x8eaec3b6, 0x0000e5d7,
+ /* 94 */ 0x8ea2c5cc, 0x8ea2c5cf, 0x8ea2c5d7, 0x0000e5d1,
+ /* 98 */ 0x0000e5d2, 0x8ea2c5d5, 0x8ea2c5cb, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2ccba, 0x0000e9f7,
+ /* a0 */ 0x8ea2ccbc, 0x8ea2c5d2, 0x8ea2ccbe, 0x0000e9fb,
+ /* a4 */ 0x8ea2ccbf, 0x8ea2ccbb, 0x8eaec8be, 0x0000e9f8,
+ /* a8 */ 0x8ea2ccb7, 0x0000e9fa, 0x8ea2ccb4, 0x8ea2ccb9,
+ /* ac */ 0x8ea2ccbd, 0x8ea2ccb6, 0x8eaec8bf, 0x8eaec8c5,
+ /* b0 */ 0x0000e5d0, 0x8eaec8c4, 0x8ea2ccb3, 0x0000e9f9,
+ /* b4 */ 0x8ea2ccb5, 0x00000000, 0x00000000, 0x8eaee5f3,
+ /* b8 */ 0x8eaec8c0, 0x00000000, 0x0000edfd, 0x8ea2d2c9,
+ /* bc */ 0x0000eea3, 0x00000000, 0x0000eea1, 0x00000000,
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x032ba ***/
+
+ /* 80 */ 0x8eaecdca, 0x0000e9f6, 0x8eaecdcd, 0x8ea2d2d0,
+ /* 84 */ 0x8ea2d2d1, 0x0000edfc, 0x8eaecdc8, 0x8eaecdcc,
+ /* 88 */ 0x8ea2d2cf, 0x8ea2d2d2, 0x0000edfe, 0x0000edfb,
+ /* 8c */ 0x8ea2d2cb, 0x8ea2d2c8, 0x8ea2d2cd, 0x8ea2d2ca,
+ /* 90 */ 0x0000eea4, 0x8ea2d2cc, 0x8eaecdcb, 0x8eaecdc9,
+ /* 94 */ 0x8ea2d2ce, 0x0000eea2, 0x8eaed2a1, 0x00000000,
+ /* 98 */ 0x8eaee5f4, 0x00000000, 0x0000f1d4, 0x8ea2d8f2,
+ /* 9c */ 0x8eaed2a4, 0x8ea2d8ec, 0x8ea2d8f0, 0x8ea2d8f6,
+ /* a0 */ 0x8ea2d8f7, 0x8ea2d8f3, 0x8ea2d8f4, 0x8ea2d8f1,
+ /* a4 */ 0x00000000, 0x8ea2d8ee, 0x00000000, 0x0000f1d6,
+ /* a8 */ 0x0000f1d3, 0x8ea2d8ed, 0x8ea2d8ef, 0x8eaed2a2,
+ /* ac */ 0x0000f1d5, 0x8ea2d8f5, 0x8eaee5f5, 0x0000f4d0,
+ /* b0 */ 0x8eaed5e0, 0x8eaed5e2, 0x8ea2ddf5, 0x8ea2ddef,
+ /* b4 */ 0x0000f4cf, 0x00000000, 0x00000000, 0x0000f4cd,
+ /* b8 */ 0x8eaed5e1, 0x8ea2ddf7, 0x0000f4ce, 0x8ea2ddf2,
+ /* bc */ 0x8ea2ddf3, 0x8ea2ddf0, 0x8ea2ddf8, 0x8ea2ddf4,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x032fa ***/
+
+ /* 80 */ 0x00000000, 0x0000f4d1, 0x8ea2ddf1, 0x00000000,
+ /* 84 */ 0x8ea2ddf9, 0x8ea2ddf6, 0x8eaed8c3, 0x8eaed8be,
+ /* 88 */ 0x8eaed8c0, 0x8ea2e2c6, 0x8eaed8bf, 0x8eaed8bc,
+ /* 8c */ 0x8ea2e2c3, 0x8eaed8c2, 0x0000f6f0, 0x00000000,
+ /* 90 */ 0x8ea2e2c7, 0x8ea2e2c9, 0x8ea2e2c8, 0x8ea2e2c4,
+ /* 94 */ 0x8ea2e2c5, 0x8eaed8c4, 0x00000000, 0x8ea2e6ad,
+ /* 98 */ 0x8eaedae1, 0x0000f8d5, 0x8eaedae2, 0x8ea2e6aa,
+ /* 9c */ 0x8ea2e6ac, 0x8ea2e6a9, 0x8ea2e6ae, 0x00000000,
+ /* a0 */ 0x8eaedae3, 0x8ea2e6ab, 0x8eaee5f6, 0x8ea2e9c9,
+ /* a4 */ 0x8ea2e9cc, 0x8ea2e9c8, 0x0000f9fc, 0x8ea2e9ca,
+ /* a8 */ 0x8ea2e9cb, 0x8ea2e9cd, 0x0000f9fd, 0x0000faa1,
+ /* ac */ 0x0000f9fe, 0x8ea2ebef, 0x8eaedec5, 0x8ea2ebf1,
+ /* b0 */ 0x8eaedec3, 0x8ea2ebf0, 0x8eaedec4, 0x00000000,
+ /* b4 */ 0x00000000, 0x8ea2ede4, 0x00000000, 0x8eaee0bc,
+ /* b8 */ 0x8ea2f0c3, 0x8ea2f1aa, 0x0000c6fc, 0x00000000,
+ /* bc */ 0x8eaea4b3, 0x8ea2a4f2, 0x0000cfa3, 0x8ea2a8c3,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x0333a ***/
+
+ /* 80 */ 0x0000cfa4, 0x0000cfa5, 0x8ea2a8c2, 0x00000000,
+ /* 84 */ 0x8ea2acda, 0x8ea2acd9, 0x0000d2e9, 0x0000d2ec,
+ /* 88 */ 0x0000d2eb, 0x0000d2ea, 0x8ea2acd6, 0x8ea2acd8,
+ /* 8c */ 0x8ea2acd7, 0x8eaee5f7, 0x00000000, 0x8ea2b1cb,
+ /* 90 */ 0x0000d7aa, 0x8ea2b1cf, 0x8ea2b1ce, 0x8ea2b1cd,
+ /* 94 */ 0x8ea2b1c9, 0x0000d7a9, 0x0000d7ad, 0x0000d7b0,
+ /* 98 */ 0x8eaeb2ef, 0x8eaeb2f0, 0x0000d7b1, 0x8ea2b1ca,
+ /* 9c */ 0x8ea2b1cc, 0x0000d7af, 0x0000d7ae, 0x0000d7ac,
+ /* a0 */ 0x0000d7ab, 0x8ea2b7e5, 0x8eaeb2f2, 0x8ea2b7e3,
+ /* a4 */ 0x8ea2b7df, 0x0000dcc0, 0x8eaebdde, 0x8ea2b7e0,
+ /* a8 */ 0x0000dcc1, 0x8ea2b7e1, 0x8ea2b7e2, 0x8ea2b7e4,
+ /* ac */ 0x8eaeb7e6, 0x0000dcc2, 0x8eaeb7e5, 0x00000000,
+ /* b0 */ 0x8ea2bed9, 0x8eaebddf, 0x8ea2bed8, 0x8ea2bed7,
+ /* b4 */ 0x8ea2bed6, 0x8eaebde4, 0x8eaebde2, 0x00000000,
+ /* b8 */ 0x00000000, 0x8ea2c5dc, 0x0000e5d9, 0x00000000,
+ /* bc */ 0x8ea2c5d9, 0x8ea2c5db, 0x8eaec3b8, 0x0000e5da,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x0337a ***/
+
+ /* 80 */ 0x8eaec3bd, 0x0000e5db, 0x8ea2c5da, 0x8eaec3b9,
+ /* 84 */ 0x8eaebde3, 0x00000000, 0x8eaee5f8, 0x8eaec8c8,
+ /* 88 */ 0x8ea2ccc8, 0x8eaec8c7, 0x8ea2ccc1, 0x8ea2ccc2,
+ /* 8c */ 0x00000000, 0x0000e9fe, 0x0000e9fc, 0x0000e9fd,
+ /* 90 */ 0x8ea2ccca, 0x00000000, 0x8ea2ccc9, 0x8ea2ccc6,
+ /* 94 */ 0x8ea2ccc5, 0x8ea2ccc4, 0x8ea2ccc3, 0x8ea2ccc7,
+ /* 98 */ 0x8ea2ccc0, 0x8eaee5f9, 0x8ea2d2d3, 0x8ea2d2d8,
+ /* 9c */ 0x8ea2d2d6, 0x8eaecdd0, 0x8eaecdd1, 0x8eaecdcf,
+ /* a0 */ 0x8ea2d2d5, 0x8ea2d2d4, 0x8ea2d2d7, 0x8eaee5fa,
+ /* a4 */ 0x8ea2d8f8, 0x8eaed2a6, 0x0000f1d7, 0x0000f4d2,
+ /* a8 */ 0x8ea2ddfb, 0x8eaed2a7, 0x0000f4d3, 0x8ea2ddfa,
+ /* ac */ 0x8ea2e2cb, 0x8ea2e2ca, 0x0000f6f1, 0x8eaed8c5,
+ /* b0 */ 0x8ea2e6af, 0x0000f8d6, 0x8ea2e9ce, 0x0000fbeb,
+ /* b4 */ 0x8ea2ede5, 0x8eaee0bd, 0x8ea2f0c5, 0x8ea2f0c4,
+ /* b8 */ 0x8ea2a1e7, 0x0000d2ed, 0x0000d2ee, 0x8ea2b7e6,
+ /* bc */ 0x8eaee5fb, 0x0000e5dd, 0x0000c6fd, 0x0000cbb5,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x033ba ***/
+
+ /* 80 */ 0x0000cbb4, 0x0000cbb3, 0x00000000, 0x8eaeaabe,
+ /* 84 */ 0x8eaeaabd, 0x8ea2a8c4, 0x8eaeaabf, 0x8eaeaac2,
+ /* 88 */ 0x0000cfa7, 0x0000cfa6, 0x8eaeaac4, 0x0000d2f1,
+ /* 8c */ 0x8eaee5cc, 0x8ea2acdc, 0x8ea2acdf, 0x8ea2acdd,
+ /* 90 */ 0x8eaeaec2, 0x0000d2ef, 0x0000d2f0, 0x8eaeaec0,
+ /* 94 */ 0x8eaeaec1, 0x8ea2acdb, 0x8ea2acde, 0x8eaeaec3,
+ /* 98 */ 0x0000d7b8, 0x8eaeb2f4, 0x8eaeb2f3, 0x8eaeb2f9,
+ /* 9c */ 0x8ea2b1d6, 0x8ea2b1d8, 0x8ea2b1d7, 0x0000d7b5,
+ /* a0 */ 0x8ea2b1d2, 0x8eaeb2f6, 0x8eaeb2fb, 0x0000d7b3,
+ /* a4 */ 0x0000d7b2, 0x8eaeb2f7, 0x0000d7b6, 0x0000d7b4,
+ /* a8 */ 0x8eaeb2f8, 0x0000d7b7, 0x8ea2b1d5, 0x8ea2b1d0,
+ /* ac */ 0x8ea2b1d1, 0x8ea2b1d4, 0x8ea2b1d3, 0x00000000,
+ /* b0 */ 0x8eaeb2fc, 0x8eaeb7e9, 0x8eaeb7e7, 0x8eaeb7eb,
+ /* b4 */ 0x00000000, 0x8eaeb7ea, 0x8ea2b7e9, 0x8ea2b7ea,
+ /* b8 */ 0x8ea2b7e8, 0x8eaeb7ec, 0x8ea2b7e7, 0x0000dcc3,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x8eaebde5,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x033fa ***/
+
+ /* 80 */ 0x0000e1a5, 0x00000000, 0x8ea2beda, 0x8ea2bedc,
+ /* 84 */ 0x8ea2bede, 0x0000e1a4, 0x00000000, 0x8eaebde6,
+ /* 88 */ 0x0000e1a2, 0x8eaebde9, 0x8ea2bedb, 0x0000e1a3,
+ /* 8c */ 0x8ea2bedd, 0x0000e1a1, 0x8eaebde8, 0x8eaec3c1,
+ /* 90 */ 0x8ea2c5e6, 0x8ea2c5dd, 0x8ea2c5e0, 0x8ea2c5e4,
+ /* 94 */ 0x0000e5e1, 0x8ea2c5e2, 0x00000000, 0x8ea2c5e1,
+ /* 98 */ 0x8ea2c5de, 0x8ea2c5df, 0x0000e5df, 0x8ea2c5e5,
+ /* 9c */ 0x0000e5de, 0x8eaec3c4, 0x0000e5e3, 0x0000e5e2,
+ /* a0 */ 0x0000e5e0, 0x00000000, 0x8ea2c5e3, 0x00000000,
+ /* a4 */ 0x00000000, 0x8eaee5a4, 0x8ea2ccd0, 0x00000000,
+ /* a8 */ 0x8ea2cccf, 0x8eaec8cb, 0x8eaec8cd, 0x8ea2cccb,
+ /* ac */ 0x8eaec8d0, 0x8eaec8cf, 0x0000eaa1, 0x8ea2ccce,
+ /* b0 */ 0x8ea2cccd, 0x0000eaa2, 0x8eaec8d2, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000eea9,
+ /* b8 */ 0x8eaecdd5, 0x8ea2d2da, 0x8eaecdd6, 0x0000eeaa,
+ /* bc */ 0x0000eea6, 0x0000eea8, 0x8eaecdda, 0x0000eea5,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x0343a ***/
+
+ /* 80 */ 0x0000eea7, 0x8eaecdd3, 0x8eaecdd7, 0x00000000,
+ /* 84 */ 0x8ea2d8f9, 0x8eaed2aa, 0x0000f1da, 0x8ea2d8fb,
+ /* 88 */ 0x8ea2d8fa, 0x8eaed5e4, 0x8ea2cccc, 0x0000f1dc,
+ /* 8c */ 0x0000f1db, 0x0000f1d8, 0x0000f1d9, 0x8eaed2ac,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaed2a9,
+ /* 94 */ 0x8ea2dea2, 0x00000000, 0x8ea2ddfe, 0x0000f4d4,
+ /* 98 */ 0x8ea2dea1, 0x00000000, 0x8ea2dea3, 0x8ea2ddfd,
+ /* 9c */ 0x8ea2ddfc, 0x00000000, 0x00000000, 0x8ea2e2cc,
+ /* a0 */ 0x0000f6f4, 0x0000f6f2, 0x0000f6f3, 0x00000000,
+ /* a4 */ 0x8eaedae6, 0x00000000, 0x8eaedae5, 0x8ea2e6b0,
+ /* a8 */ 0x8ea2e6b1, 0x0000f8d8, 0x8eaedae7, 0x0000f8d7,
+ /* ac */ 0x8ea2e9d0, 0x8ea2e9d1, 0x8ea2e9cf, 0x8eaedce4,
+ /* b0 */ 0x8ea2ede6, 0x8ea2ede7, 0x8eaee0f6, 0x8eaee0f7,
+ /* b4 */ 0x0000c6fe, 0x8ea2a2e8, 0x0000cbb6, 0x00000000,
+ /* b8 */ 0x8ea2a8c5, 0x0000cfa9, 0x0000cfa8, 0x8ea2a8c6,
+ /* bc */ 0x8eaeaec4, 0x8eaeaec7, 0x8ea2ace1, 0x0000d2f2,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x0347a ***/
+
+ /* 80 */ 0x8ea2ace0, 0x0000d2f3, 0x8eaeaec9, 0x8eaeaec8,
+ /* 84 */ 0x0000d7b9, 0x8ea2b1db, 0x8ea2b1d9, 0x8ea2b1df,
+ /* 88 */ 0x0000d7ba, 0x8ea2b1da, 0x8ea2b1de, 0x8ea2b1dc,
+ /* 8c */ 0x8ea2b1dd, 0x00000000, 0x00000000, 0x8ea2b7eb,
+ /* 90 */ 0x8ea2b7ed, 0x8eaeb7f2, 0x0000dcc4, 0x8eaeb7f1,
+ /* 94 */ 0x8ea2b7ec, 0x0000dcc5, 0x0000e1a8, 0x0000e1a7,
+ /* 98 */ 0x0000e1a6, 0x8ea2bedf, 0x8eaeb7f0, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2c5e9, 0x0000e5e4,
+ /* a0 */ 0x0000e5e5, 0x8eaec3c6, 0x8ea2c5e8, 0x8ea2c5e7,
+ /* a4 */ 0x8eaec3c7, 0x00000000, 0x00000000, 0x8eaee5fc,
+ /* a8 */ 0x8ea2ccd1, 0x0000eaa4, 0x0000eaa3, 0x8ea2ccd2,
+ /* ac */ 0x8ea2ccd3, 0x00000000, 0x0000eeac, 0x0000eeab,
+ /* b0 */ 0x8eaecddb, 0x8ea2d9a1, 0x8ea2d2db, 0x8ea2d2dd,
+ /* b4 */ 0x8ea2d2dc, 0x8ea2d8fe, 0x8ea2d8fc, 0x8ea2d9a2,
+ /* b8 */ 0x8ea2d8fd, 0x00000000, 0x0000f1dd, 0x8eaed2af,
+ /* bc */ 0x00000000, 0x8eaed2ae, 0x8ea2dea4, 0x0000f4d5,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x034ba ***/
+
+ /* 80 */ 0x8ea2dea5, 0x8ea2dea6, 0x8eaed5e8, 0x00000000,
+ /* 84 */ 0x0000f6f5, 0x0000f6f6, 0x00000000, 0x0000faa2,
+ /* 88 */ 0x8eaedec9, 0x8eaedec8, 0x0000fcbd, 0x0000c7a1,
+ /* 8c */ 0x8eaea6fe, 0x8eaea7a1, 0x00000000, 0x8eaeaac7,
+ /* 90 */ 0x8eaeaece, 0x8ea2ace2, 0x8eaeaecf, 0x8eaeaecd,
+ /* 94 */ 0x8eaeaecb, 0x8eaeaecc, 0x00000000, 0x00000000,
+ /* 98 */ 0x8ea2b1e0, 0x0000d7bb, 0x8eaeb3a3, 0x8eaeb3a6,
+ /* 9c */ 0x8eaeb3a7, 0x8eaeb3a4, 0x00000000, 0x0000ddfe,
+ /* a0 */ 0x0000ddfd, 0x8eaeb7f3, 0x8eaebdf1, 0x0000e1aa,
+ /* a4 */ 0x8ea2bee1, 0x0000e1a9, 0x8ea2bee0, 0x8eaebdf0,
+ /* a8 */ 0x00000000, 0x8eaec3c9, 0x8eaec3ca, 0x8ea2c5ea,
+ /* ac */ 0x8eaec8d4, 0x0000eaa5, 0x8ea2ccd4, 0x0000eaa6,
+ /* b0 */ 0x8eaec8d5, 0x8eaed2b0, 0x8eaed5e9, 0x8eaed5ea,
+ /* b4 */ 0x00000000, 0x8eaed8c9, 0x0000faa3, 0x8ea2e9d2,
+ /* b8 */ 0x8eaedfd5, 0x0000c8cc, 0x0000cfaa, 0x8ea2a8c7,
+ /* bc */ 0x8eaeaed1, 0x0000d2f5, 0x8eaeaed0, 0x0000d2f4,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x034fa ***/
+
+ /* 80 */ 0x8ea2ace3, 0x8ea2ace4, 0x00000000, 0x00000000,
+ /* 84 */ 0x8ea2b1e2, 0x8ea2b1e4, 0x0000d7bc, 0x00000000,
+ /* 88 */ 0x8ea2b1e6, 0x8ea2b1e9, 0x8ea2b1e7, 0x8eaeb3ab,
+ /* 8c */ 0x00000000, 0x8eaeb3aa, 0x8ea2b1e8, 0x8ea2b1e5,
+ /* 90 */ 0x8ea2b1e1, 0x0000d7bd, 0x8ea2b1ea, 0x8ea2b1e3,
+ /* 94 */ 0x8eaeb3ac, 0x00000000, 0x8eaeb7f8, 0x8eaeb7f9,
+ /* 98 */ 0x8ea2b7f6, 0x0000dccb, 0x8ea2b8a1, 0x0000dcc8,
+ /* 9c */ 0x8eaeb7f7, 0x8ea2b7f8, 0x0000dccc, 0x8eaeb7fb,
+ /* a0 */ 0x0000dcc6, 0x8eaeb7f6, 0x8ea2b7f3, 0x8ea2b8a2,
+ /* a4 */ 0x8ea2b7f4, 0x8ea2b7f1, 0x0000dcca, 0x00000000,
+ /* a8 */ 0x0000dcc7, 0x8eaee3ad, 0x8ea2b7f7, 0x8ea2b7fa,
+ /* ac */ 0x0000dcc9, 0x8ea2b7fb, 0x0000dccd, 0x8ea2b7fc,
+ /* b0 */ 0x8ea2b7f2, 0x8ea2b7f9, 0x8ea2b7fd, 0x8ea2b7f5,
+ /* b4 */ 0x8ea2b7f0, 0x8ea2b7ee, 0x8eaeb7fa, 0x8eaee5fd,
+ /* b8 */ 0x8ea2b7fe, 0x00000000, 0x00000000, 0x8ea2b7ef,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e7adxx - offset 0x0353a ***/
+
+ /* 80 */ 0x8ea2bee8, 0x8eaebdfb, 0x8eaebdf8, 0x8eaebdf5,
+ /* 84 */ 0x8ea2bee4, 0x8ea2beea, 0x0000e1ad, 0x8ea2bee3,
+ /* 88 */ 0x8ea2bee5, 0x0000e1ab, 0x8ea2bee2, 0x0000e1b2,
+ /* 8c */ 0x8ea2bee6, 0x0000e1b1, 0x8ea2bee7, 0x0000e1b3,
+ /* 90 */ 0x0000e1ae, 0x0000e1b4, 0x0000e1af, 0x8eaebdf9,
+ /* 94 */ 0x0000e1b0, 0x8eaebdf2, 0x0000e1ac, 0x8eaebdf6,
+ /* 98 */ 0x8ea2bee9, 0x8eaee5fe, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaec3cf, 0x00000000,
+ /* a0 */ 0x0000e5e8, 0x8ea2c5f5, 0x8eaec3cc, 0x8ea2c5f8,
+ /* a4 */ 0x8ea2c5ec, 0x8ea2c5f1, 0x8ea2c5eb, 0x0000e5ea,
+ /* a8 */ 0x8eaec3d5, 0x8ea2c5ef, 0x00000000, 0x8eaec3cd,
+ /* ac */ 0x8eaebdf7, 0x8ea2c5ed, 0x0000e5e9, 0x8eaec3d4,
+ /* b0 */ 0x8ea2c5f4, 0x8ea2c5f3, 0x8ea2c5f0, 0x8ea2c5f2,
+ /* b4 */ 0x8ea2c5ee, 0x0000eaaa, 0x8ea2c5f7, 0x0000e5e6,
+ /* b8 */ 0x8ea2c5f6, 0x8eaec3d1, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x03579 ***/
+
+ /* 80 */ 0x00000000, 0x8eaec8d6, 0x8ea2cce4, 0x8eaec8d8,
+ /* 84 */ 0x0000eab1, 0x8ea2ccdf, 0x8eaec8e0, 0x0000eab0,
+ /* 88 */ 0x8ea2ccd5, 0x00000000, 0x8ea2ccd7, 0x0000eaa9,
+ /* 8c */ 0x8ea2ccdc, 0x8ea2ccdb, 0x8ea2ccde, 0x0000eaae,
+ /* 90 */ 0x8ea2ccd9, 0x8ea2ccd8, 0x8eaec8da, 0x8eaec8de,
+ /* 94 */ 0x0000eaad, 0x0000eaa8, 0x8ea2ccda, 0x0000eaab,
+ /* 98 */ 0x8ea2cce0, 0x8ea2cce2, 0x00000000, 0x8ea2ccdd,
+ /* 9c */ 0x8ea2ccd6, 0x0000eaac, 0x8eaec8d7, 0x8eaec8dd,
+ /* a0 */ 0x0000eeb4, 0x0000eaa7, 0x00000000, 0x8eaec8dc,
+ /* a4 */ 0x8ea2cce3, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2d2e1, 0x0000eead, 0x8eaecddc, 0x8ea2d2e3,
+ /* b0 */ 0x00000000, 0x0000eeae, 0x8eaecde5, 0x8eaecddd,
+ /* b4 */ 0x0000eeb0, 0x8ea2d2e6, 0x00000000, 0x8ea2d2de,
+ /* b8 */ 0x0000eaaf, 0x8ea2d2e4, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x8ea2d2e0, 0x8eaecde0,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x035b9 ***/
+
+ /* 80 */ 0x0000e5e7, 0x0000eeb3, 0x8eaee3e7, 0x8eaee3e6,
+ /* 84 */ 0x0000eeaf, 0x00000000, 0x0000eeb1, 0x0000eeb2,
+ /* 88 */ 0x00000000, 0x0000f1e0, 0x8ea2d2e5, 0x8ea2d2df,
+ /* 8c */ 0x0000eeb5, 0x8eaecde3, 0x8ea2d2e2, 0x00000000,
+ /* 90 */ 0x8eaee6a1, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x8ea2d9ac, 0x8ea2d9a7, 0x00000000, 0x00000000,
+ /* 98 */ 0x8ea2d9b1, 0x0000f1de, 0x8ea2d9a9, 0x0000f1e2,
+ /* 9c */ 0x8ea2d9af, 0x8ea2d9a6, 0x8ea2d9a3, 0x8ea2d9b2,
+ /* a0 */ 0x0000f4db, 0x0000f1e3, 0x8ea2d9ae, 0x8ea2d9a4,
+ /* a4 */ 0x0000f1e1, 0x8ea2d9a8, 0x0000f1e5, 0x8ea2d9a5,
+ /* a8 */ 0x8ea2d9aa, 0x0000f1e4, 0x8ea2d9ad, 0x8ea2d9b0,
+ /* ac */ 0x8eaed2b3, 0x8eaed2b4, 0x00000000, 0x00000000,
+ /* b0 */ 0x8ea2deb8, 0x8ea2deb9, 0x8ea2dea9, 0x8ea2deb0,
+ /* b4 */ 0x8ea2deae, 0x00000000, 0x8eaed5ed, 0x0000f4d9,
+ /* b8 */ 0x8ea2deb5, 0x8ea2d9ab, 0x8eaed5eb, 0x8ea2deac,
+ /* bc */ 0x8eaed5ee, 0x8ea2deb6, 0x0000f4d8, 0x8ea2deab,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x035f9 ***/
+
+ /* 80 */ 0x8ea2deaa, 0x8ea2deb4, 0x8ea2deb1, 0x8ea2deb3,
+ /* 84 */ 0x00000000, 0x8ea2dea7, 0x8ea2deb7, 0x0000f4d6,
+ /* 88 */ 0x8eaed5f0, 0x8ea2deb2, 0x8ea2debb, 0x8ea2deaf,
+ /* 8c */ 0x0000f4da, 0x0000f4d7, 0x8ea2dead, 0x8ea2dea8,
+ /* 90 */ 0x8ea2deba, 0x0000f1df, 0x8eaed5f1, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x8eaed5ef, 0x8ea2e2cf, 0x8eaed8d0, 0x8eaed8ce,
+ /* 9c */ 0x8ea2e2cd, 0x8ea2e2d3, 0x0000f6fa, 0x8ea2e2d1,
+ /* a0 */ 0x8ea2e2d0, 0x0000f6fc, 0x8ea2e2d6, 0x0000f6fb,
+ /* a4 */ 0x8eaed8d1, 0x8ea2e2d7, 0x8ea2e2d4, 0x0000f6f8,
+ /* a8 */ 0x8ea2e2d5, 0x8ea2e2ce, 0x0000f6f9, 0x0000f6f7,
+ /* ac */ 0x8ea2e6b5, 0x8ea2e2d2, 0x8eaed8cc, 0x8eaee6a2,
+ /* b0 */ 0x8ea2e2d8, 0x00000000, 0x8eaee6a3, 0x8ea2e6b2,
+ /* b4 */ 0x8eaedaef, 0x8eaedaee, 0x00000000, 0x0000f8dd,
+ /* b8 */ 0x0000f8db, 0x8ea2e6b4, 0x00000000, 0x8ea2e6b6,
+ /* bc */ 0x8ea2e6b3, 0x0000f8dc, 0x0000f8d9, 0x0000f8da,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x03639 ***/
+
+ /* 80 */ 0x0000f8de, 0x00000000, 0x8eaee6a4, 0x0000faa5,
+ /* 84 */ 0x8eaedce6, 0x8ea2e9d7, 0x00000000, 0x8ea2e9d6,
+ /* 88 */ 0x8ea2e9d4, 0x8ea2e9d3, 0x8ea2e9d5, 0x8eaedce5,
+ /* 8c */ 0x0000faa4, 0x0000faa6, 0x8eaee6a5, 0x00000000,
+ /* 90 */ 0x0000fafb, 0x8eaedecc, 0x00000000, 0x8ea2ebf3,
+ /* 94 */ 0x8ea2ebf2, 0x00000000, 0x8eaedecb, 0x8ea2ede8,
+ /* 98 */ 0x8eaedfd8, 0x8ea2edea, 0x8ea2edec, 0x8ea2edeb,
+ /* 9c */ 0x8ea2ede9, 0x8eaedfd7, 0x8eaee0bf, 0x0000fbed,
+ /* a0 */ 0x0000fbec, 0x00000000, 0x8eaee0be, 0x0000fcbf,
+ /* a4 */ 0x0000fcbe, 0x0000fcc0, 0x8ea2efbc, 0x8ea2efbb,
+ /* a8 */ 0x8eaee6a6, 0x8ea2f1ab, 0x8ea2f0c6, 0x8ea2f1ac,
+ /* ac */ 0x0000fda5, 0x8eaee1c4, 0x0000fda6, 0x8ea2f1dc,
+ /* b0 */ 0x00000000, 0x8eaee2ba, 0x0000fdcb, 0x0000c8cd,
+ /* b4 */ 0x8eaeaac9, 0x8ea2a8c8, 0x8eaeaac8, 0x8eaeaed2,
+ /* b8 */ 0x8ea2ace6, 0x8ea2ace7, 0x8ea2ace5, 0x8eaeaed4,
+ /* bc */ 0x8eaeaed3, 0x0000d2f6, 0x00000000, 0x8ea2ace8,
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x03679 ***/
+
+ /* 80 */ 0x8ea2ace9, 0x8ea2acea, 0x00000000, 0x8eaeb3b1,
+ /* 84 */ 0x8ea2b1eb, 0x8ea2b1f1, 0x8eaeb3ae, 0x8eaeb3b0,
+ /* 88 */ 0x8ea2b1ef, 0x0000d7be, 0x8ea2b1ed, 0x8eaeb3b2,
+ /* 8c */ 0x8ea2b1ee, 0x8ea2b1f0, 0x8eaeb3ad, 0x00000000,
+ /* 90 */ 0x00000000, 0x8ea2b1ec, 0x0000dcce, 0x8eaeb7fd,
+ /* 94 */ 0x8ea2b8a3, 0x0000dcd0, 0x8ea2b8a5, 0x0000dccf,
+ /* 98 */ 0x8ea2b8a4, 0x8eaeb7fe, 0x8eaeb8a1, 0x8eaeb8be,
+ /* 9c */ 0x8eaeb8a2, 0x00000000, 0x8ea2beec, 0x0000e1b5,
+ /* a0 */ 0x8eaebea1, 0x8ea2beee, 0x8ea2beeb, 0x8ea2b8a6,
+ /* a4 */ 0x8eaebea3, 0x0000e1b6, 0x8eaebea2, 0x8eaebdfe,
+ /* a8 */ 0x8ea2beed, 0x8eaee6a7, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaec3d8, 0x8ea2c5fb,
+ /* b0 */ 0x8eaec3dc, 0x0000e5eb, 0x8ea2c5f9, 0x0000e5ec,
+ /* b4 */ 0x8ea2c5fa, 0x0000e5ed, 0x00000000, 0x8eaec8e2,
+ /* b8 */ 0x8eaec8e1, 0x0000eab2, 0x8ea2cce8, 0x8ea2cce5,
+ /* bc */ 0x8ea2cce7, 0x0000eab3, 0x0000eab4, 0x8ea2cce6,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x036b9 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8eaecdef, 0x8eaecdf1,
+ /* 84 */ 0x8eaecded, 0x8ea2d2e7, 0x8eaecdf0, 0x8eaecdf3,
+ /* 88 */ 0x8ea2d2e8, 0x8eaecdf2, 0x0000eeb6, 0x8ea2d2ea,
+ /* 8c */ 0x8ea2d2e9, 0x8eaecdee, 0x0000a3a3, 0x00000000,
+ /* 90 */ 0x8ea2d9b6, 0x8ea2d9b7, 0x8ea2d9b3, 0x8eaed2b7,
+ /* 94 */ 0x8ea2d9b4, 0x0000f1e6, 0x0000f1e7, 0x8ea2d9b5,
+ /* 98 */ 0x00000000, 0x0000f4e1, 0x8eaed5f5, 0x8eaed5f4,
+ /* 9c */ 0x0000f4dd, 0x0000f4e2, 0x0000f4de, 0x0000f4e0,
+ /* a0 */ 0x0000f4dc, 0x8eaed2b9, 0x0000f4df, 0x8eaed8d5,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaed8d4, 0x0000f6fd,
+ /* a8 */ 0x8ea2debc, 0x00000000, 0x8ea2e6b8, 0x00000000,
+ /* ac */ 0x8ea2e6b7, 0x8eaee6a8, 0x8ea2e9d8, 0x0000faa7,
+ /* b0 */ 0x0000faa8, 0x8ea2edee, 0x8ea2ebf4, 0x8eaee1e9,
+ /* b4 */ 0x8ea2eded, 0x8eaee0c0, 0x8ea2f1ad, 0x8ea2f1f2,
+ /* b8 */ 0x0000c8ce, 0x00000000, 0x8eaea7a2, 0x0000cbb7,
+ /* bc */ 0x8eaeaacb, 0x8ea2a8c9, 0x0000cfab, 0x8eaeaaca,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x036f9 ***/
+
+ /* 80 */ 0x0000d2f9, 0x8ea2aced, 0x0000d2f7, 0x8ea2aceb,
+ /* 84 */ 0x0000d2fc, 0x0000d2f8, 0x0000d2fd, 0x0000d2fb,
+ /* 88 */ 0x8ea2acec, 0x0000d2fa, 0x0000d7c2, 0x0000d7c1,
+ /* 8c */ 0x8ea2b1fc, 0x0000d7ca, 0x8ea2b1f5, 0x8ea2b1fb,
+ /* 90 */ 0x0000d7c6, 0x8ea2b1f4, 0x8ea2b1fa, 0x8ea2b1f8,
+ /* 94 */ 0x0000d7c5, 0x0000d7c7, 0x8ea2b1f7, 0x0000d7c0,
+ /* 98 */ 0x8ea2b1f6, 0x0000d7cb, 0x0000d7c8, 0x0000d7cc,
+ /* 9c */ 0x0000d7c9, 0x8ea2b1f3, 0x8ea2b1f2, 0x8ea2b1f9,
+ /* a0 */ 0x0000d7c3, 0x0000d7bf, 0x0000d7c4, 0x00000000,
+ /* a4 */ 0x8eaeb3b7, 0x8eaeb3bb, 0x00000000, 0x00000000,
+ /* a8 */ 0x8ea2b8b5, 0x8ea2b8ae, 0x00000000, 0x0000e1bb,
+ /* ac */ 0x8ea2b8ad, 0x8eaeb8a9, 0x0000dcd4, 0x0000dcdb,
+ /* b0 */ 0x0000dcd8, 0x0000dcde, 0x0000dcdd, 0x0000dcd9,
+ /* b4 */ 0x8eaeb8a6, 0x8ea2b8a7, 0x8ea2b8aa, 0x8eaeb8a7,
+ /* b8 */ 0x8ea2b8a9, 0x0000dcd5, 0x8ea2b8ab, 0x8ea2b8b4,
+ /* bc */ 0x0000dcd6, 0x8ea2b8a8, 0x8ea2b8b1, 0x8ea2b8b2,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03739 ***/
+
+ /* 80 */ 0x0000dcd7, 0x8ea2b8af, 0x0000dcdc, 0x0000dcd2,
+ /* 84 */ 0x0000dcda, 0x8ea2b8ac, 0x0000dcd1, 0x8ea2b8b0,
+ /* 88 */ 0x8eaeb8ae, 0x8eaeb8a4, 0x8ea2b8b3, 0x00000000,
+ /* 8c */ 0x8eaeb8ab, 0x8eaebeb4, 0x8ea2bfa1, 0x8ea2bef6,
+ /* 90 */ 0x0000e1b8, 0x8ea2befd, 0x8ea2befa, 0x8ea2bef2,
+ /* 94 */ 0x8ea2befb, 0x0000e1ba, 0x8ea2bef3, 0x8eaebea9,
+ /* 98 */ 0x8ea2beef, 0x8eaebea6, 0x8eaebeae, 0x0000e5f3,
+ /* 9c */ 0x8ea2bef8, 0x8eaebeaf, 0x0000e1b7, 0x8ea2befe,
+ /* a0 */ 0x8eaebea8, 0x0000e1be, 0x0000e1c0, 0x8ea2bef1,
+ /* a4 */ 0x8eaebeac, 0x00000000, 0x0000e1bf, 0x8ea2bef4,
+ /* a8 */ 0x0000e1b9, 0x8ea2befc, 0x8ea2bef5, 0x8ea2bef9,
+ /* ac */ 0x8eaebeaa, 0x8ea2bef7, 0x0000e1bc, 0x8ea2bef0,
+ /* b0 */ 0x0000e1c1, 0x0000dcd3, 0x0000e1bd, 0x0000e1c2,
+ /* b4 */ 0x8eaebea4, 0x8eaebeb5, 0x8eaebeb3, 0x00000000,
+ /* b8 */ 0x8eaec3e7, 0x0000e5ef, 0x8ea2c6a4, 0x8ea2c6a6,
+ /* bc */ 0x8ea2c6a8, 0x8ea2c6ac, 0x8eaebeab, 0x8ea2c6a2,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03779 ***/
+
+ /* 80 */ 0x8ea2c5fe, 0x0000e5f1, 0x00000000, 0x8ea2c6a7,
+ /* 84 */ 0x8ea2c6ab, 0x8ea2c6a3, 0x8ea2c5fd, 0x8eaec3e6,
+ /* 88 */ 0x8ea2c5fc, 0x8eaec3e9, 0x8eaec3e0, 0x8eaec3e2,
+ /* 8c */ 0x8ea2c6a9, 0x8ea2c6a1, 0x8ea2c6a5, 0x0000e5f2,
+ /* 90 */ 0x8eaec3de, 0x0000e5f0, 0x8ea2c6ad, 0x0000e5ee,
+ /* 94 */ 0x8ea2c6aa, 0x8eaec3e4, 0x8ea2ccf9, 0x8eaec3e8,
+ /* 98 */ 0x8eaec3ea, 0x8eaec3e3, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000eab7, 0x8ea2ccf1, 0x0000eec3, 0x8ea2ccfb,
+ /* a0 */ 0x0000eaba, 0x8ea2cda1, 0x0000eac0, 0x8ea2ccec,
+ /* a4 */ 0x8eaec8f4, 0x00000000, 0x8ea2ccfc, 0x8ea2cce9,
+ /* a8 */ 0x8eaec8ed, 0x8ea2ccfe, 0x8ea2cced, 0x8eaec8ee,
+ /* ac */ 0x0000eac7, 0x0000eac4, 0x8ea2ccfd, 0x8ea2ccf7,
+ /* b0 */ 0x0000eab6, 0x0000eabe, 0x0000eabd, 0x8eaec8f0,
+ /* b4 */ 0x0000eabc, 0x0000eac2, 0x8eaec8e9, 0x8ea2ccea,
+ /* b8 */ 0x0000eac3, 0x8ea2ccf8, 0x0000eabf, 0x0000eab5,
+ /* bc */ 0x8ea2ccfa, 0x0000eab8, 0x0000eab9, 0x0000eac1,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x037b9 ***/
+
+ /* 80 */ 0x8ea2ccef, 0x8ea2ccee, 0x8ea2cceb, 0x00000000,
+ /* 84 */ 0x8ea2ccf3, 0x8ea2ccf0, 0x8ea2ccf4, 0x0000eac6,
+ /* 88 */ 0x8eaec8e8, 0x8ea2cda2, 0x0000eabb, 0x8ea2ccf5,
+ /* 8c */ 0x8ea2ccf6, 0x8eaec8f1, 0x8ea2ccf2, 0x8eaec8f3,
+ /* 90 */ 0x8eaee6a9, 0x8eaec8eb, 0x0000eac5, 0x8eaee6ab,
+ /* 94 */ 0x00000000, 0x00000000, 0x8eaecea2, 0x8ea2d2ef,
+ /* 98 */ 0x0000eebb, 0x0000eec4, 0x0000eec0, 0x8ea2d2ec,
+ /* 9c */ 0x8eaecdfc, 0x0000eebd, 0x0000eec1, 0x8ea2d2f8,
+ /* a0 */ 0x0000eeb7, 0x8ea2d2f0, 0x8eaecdf8, 0x0000eebf,
+ /* a4 */ 0x8eaecea4, 0x8eaeceaf, 0x8ea2d2f3, 0x8ea2d2ee,
+ /* a8 */ 0x0000eebe, 0x0000eec2, 0x8ea2d2ed, 0x8eaeceae,
+ /* ac */ 0x0000eebc, 0x8eaecdf7, 0x8ea2d2f7, 0x0000eeb9,
+ /* b0 */ 0x8ea2d2f6, 0x8ea2d2f5, 0x0000eec5, 0x8ea2d0bb,
+ /* b4 */ 0x0000eeb8, 0x8eaeceab, 0x8ea2d2f4, 0x8ea2d2eb,
+ /* b8 */ 0x8eaecdf5, 0x0000eec6, 0x8ea2d2f2, 0x0000eeba,
+ /* bc */ 0x8eaecea8, 0x8eaecea9, 0x8eaecea5, 0x8eaeceac,
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x037f9 ***/
+
+ /* 80 */ 0x8eaecea7, 0x8eaecdfe, 0x8eaecdfd, 0x8ea2d2f1,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaee6aa,
+ /* 88 */ 0x0000f1ea, 0x0000f1ef, 0x0000f1e8, 0x8ea2d9c4,
+ /* 8c */ 0x8ea2d9bb, 0x8ea2d9c7, 0x8ea2d9bf, 0x8ea2d9c5,
+ /* 90 */ 0x0000f1f0, 0x0000f1e9, 0x8ea2d9b8, 0x8ea2d9be,
+ /* 94 */ 0x8ea2d9c8, 0x8ea2d9c1, 0x8ea2d9c6, 0x8ea2d9ba,
+ /* 98 */ 0x00000000, 0x8eaed2bb, 0x8ea2d9c2, 0x0000f1eb,
+ /* 9c */ 0x8ea2d9c0, 0x0000f1ee, 0x0000f1ed, 0x8ea2d9bc,
+ /* a0 */ 0x8ea2d9bd, 0x8ea2d9b9, 0x8ea2d9c3, 0x0000f1ec,
+ /* a4 */ 0x8ea2d9ca, 0x8ea2d9c9, 0x8eaed2c0, 0x8eaed2bf,
+ /* a8 */ 0x00000000, 0x8ea2dec7, 0x8ea2dec3, 0x0000f4e9,
+ /* ac */ 0x8eaed5f9, 0x8ea2debd, 0x0000f4e3, 0x0000f4f3,
+ /* b0 */ 0x8ea2dec9, 0x0000f4eb, 0x0000f4e7, 0x8ea2dec0,
+ /* b4 */ 0x0000f4ee, 0x0000f4f1, 0x8ea2decb, 0x0000f4e6,
+ /* b8 */ 0x8ea2dec2, 0x0000f4ef, 0x8ea2decd, 0x8ea2deca,
+ /* bc */ 0x8ea2debe, 0x0000f4ea, 0x0000f4e4, 0x0000f4f2,
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03839 ***/
+
+ /* 80 */ 0x8ea2dec5, 0x0000f4ed, 0x8ea2debf, 0x0000f4e8,
+ /* 84 */ 0x8ea2decc, 0x0000f4ec, 0x0000f4e5, 0x8ea2dec6,
+ /* 88 */ 0x0000f4f0, 0x8ea2dec4, 0x00000000, 0x00000000,
+ /* 8c */ 0x8ea2dec8, 0x8eaed5fa, 0x00000000, 0x8eaed8d9,
+ /* 90 */ 0x8ea2e2da, 0x8ea2e2e0, 0x0000f7a5, 0x8ea2e2e3,
+ /* 94 */ 0x0000f6fe, 0x0000f7a1, 0x8ea2e2db, 0x8ea2e2e2,
+ /* 98 */ 0x8ea2e2dd, 0x0000f7a6, 0x0000f7a3, 0x8eaed8db,
+ /* 9c */ 0x8ea2e2d9, 0x8eaed8d8, 0x0000f7a2, 0x8ea2e2df,
+ /* a0 */ 0x8ea2e2e1, 0x0000f7a4, 0x8ea2e2de, 0x8ea2e2dc,
+ /* a4 */ 0x8eaee6ac, 0x00000000, 0x8eaed8da, 0x00000000,
+ /* a8 */ 0x8ea2e6c2, 0x0000f8e2, 0x0000f8e3, 0x0000f8df,
+ /* ac */ 0x8eaedaf2, 0x0000f8e0, 0x8eaedaf4, 0x8ea2e6be,
+ /* b0 */ 0x8ea2e6bc, 0x8eaedaf5, 0x8ea2e6c0, 0x0000f8e4,
+ /* b4 */ 0x8ea2e6c1, 0x8ea2e6ba, 0x8ea2e6b9, 0x8ea2e6bd,
+ /* b8 */ 0x8ea2e6bb, 0x0000f8e1, 0x8ea2e6bf, 0x8ea2e9d9,
+ /* bc */ 0x0000faab, 0x0000faaa, 0x8ea2e9da, 0x8eaedcec,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03879 ***/
+
+ /* 80 */ 0x8ea2e9dc, 0x8ea2e9db, 0x0000faac, 0x00000000,
+ /* 84 */ 0x8eaeded3, 0x8eaeded0, 0x8ea2ebf9, 0x8ea2ebf6,
+ /* 88 */ 0x8ea2ebf7, 0x8eaeded1, 0x8ea2ebf5, 0x8ea2ebf8,
+ /* 8c */ 0x0000fafd, 0x8ea2ebfa, 0x8eaeded2, 0x0000fafc,
+ /* 90 */ 0x00000000, 0x8ea2edef, 0x8eaedfda, 0x0000fcc1,
+ /* 94 */ 0x0000fcc3, 0x8ea2efbd, 0x0000fcc2, 0x8ea2f0c7,
+ /* 98 */ 0x8ea2f1af, 0x8ea2f1b1, 0x8ea2f1ae, 0x8ea2f1b0,
+ /* 9c */ 0x0000fdb9, 0x00000000, 0x8eaee2b5,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03898 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x0000c8cf, 0x00000000,
+ /* b8 */ 0x0000d2fe, 0x8ea2b0d2, 0x0000d7cd, 0x8eaeb8b1,
+ /* bc */ 0x00000000, 0x0000dcdf, 0x8ea2bfa2, 0x8ea2bfa3,
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x038d8 ***/
+
+ /* 80 */ 0x8eaee6ad, 0x8eaec8f7, 0x00000000, 0x8ea2d9cb,
+ /* 84 */ 0x0000f4f4, 0x8ea2dece, 0x8eaed5fd, 0x8eaed8dc,
+ /* 88 */ 0x0000f7a7, 0x00000000, 0x8ea2e6c4, 0x8ea2e6c3,
+ /* 8c */ 0x0000faad, 0x8ea2ebfb, 0x8eaedfdb, 0x8ea2edf0,
+ /* 90 */ 0x0000fce4, 0x8ea2a2e9, 0x00000000, 0x00000000,
+ /* 94 */ 0x0000cfac, 0x0000cbb8, 0x00000000, 0x00000000,
+ /* 98 */ 0x8ea2acee, 0x8eaeaace, 0x00000000, 0x8ea2b2a4,
+ /* 9c */ 0x8ea2b1fd, 0x8ea2b2a3, 0x8ea2b2a1, 0x0000d7ce,
+ /* a0 */ 0x8ea2b2a2, 0x8ea2b1fe, 0x8eaeb3bc, 0x8ea2b8b6,
+ /* a4 */ 0x00000000, 0x8ea2bfa4, 0x8ea2bfa5, 0x8ea2c6b0,
+ /* a8 */ 0x8ea2c6b1, 0x0000e5f5, 0x0000e5f6, 0x8ea2c6af,
+ /* ac */ 0x8ea2c6b2, 0x8ea2c6ae, 0x0000e5f4, 0x8eaec8f8,
+ /* b0 */ 0x0000eac8, 0x8eaec8f9, 0x0000e5f7, 0x8ea2cda3,
+ /* b4 */ 0x00000000, 0x0000eec7, 0x8ea2d2f9, 0x0000eec8,
+ /* b8 */ 0x8eaeceb0, 0x0000f1f1, 0x8ea2d9ce, 0x8ea2d9cc,
+ /* bc */ 0x8ea2d9cd, 0x8ea2ded1, 0x8ea2ded0, 0x8ea2decf,
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03918 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2e6c5,
+ /* 84 */ 0x8eaee4a2, 0x0000f8e5, 0x8ea2e6c6, 0x8ea2edf1,
+ /* 88 */ 0x0000fce5, 0x8ea2f0c8, 0x0000c8d0, 0x0000cfae,
+ /* 8c */ 0x0000cfad, 0x8ea2acf0, 0x0000d3a1, 0x8eaeaedd,
+ /* 90 */ 0x00000000, 0x8ea2acef, 0x8ea2b2a6, 0x8eaeb3bd,
+ /* 94 */ 0x0000d7cf, 0x8ea2b8b7, 0x8ea2b2a5, 0x8eaeb3bf,
+ /* 98 */ 0x00000000, 0x8eaeb3be, 0x0000dce1, 0x8ea2b8ba,
+ /* 9c */ 0x8ea2b8b8, 0x8ea2b8b9, 0x0000dce0, 0x00000000,
+ /* a0 */ 0x8ea2bfa7, 0x8ea2bfa8, 0x8ea2bfa6, 0x8eaec3ee,
+ /* a4 */ 0x0000e5fa, 0x8ea2c6b4, 0x8ea2c6b3, 0x8ea2c6b5,
+ /* a8 */ 0x0000e5f9, 0x0000e5f8, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2d2fa, 0x8ea2d2fc, 0x8eaeceb1, 0x0000eec9,
+ /* b0 */ 0x8ea2d2fb, 0x8ea2d9cf, 0x0000f1f2, 0x8ea2e2e5,
+ /* b4 */ 0x8eaed8dd, 0x8ea2e2e4, 0x0000f8e6, 0x8ea2e6c7,
+ /* b8 */ 0x0000f8e8, 0x0000f8e7, 0x8ea2e9dd, 0x8ea2ebfc,
+ /* bc */ 0x0000fafe, 0x0000c8d1, 0x8ea2acf1, 0x0000d3a2,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03958 ***/
+
+ /* 80 */ 0x8ea2b2a9, 0x0000d7d1, 0x8ea2b2a8, 0x8ea2b2a7,
+ /* 84 */ 0x8eaeb3c2, 0x0000d7d0, 0x8eaeb3c3, 0x8ea2b8c0,
+ /* 88 */ 0x00000000, 0x8ea2b8c2, 0x8ea2b8bb, 0x8ea2b8bc,
+ /* 8c */ 0x0000dce2, 0x8ea2b8bd, 0x0000dce3, 0x8ea2b8c1,
+ /* 90 */ 0x8ea2b8be, 0x8ea2b8bf, 0x0000dce4, 0x8eaebeb7,
+ /* 94 */ 0x0000e1c4, 0x0000e1c5, 0x8eaebeb8, 0x8ea2bfa9,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2c6b6,
+ /* 9c */ 0x8ea2c6b7, 0x8eaec3f2, 0x8ea2cda7, 0x0000eacb,
+ /* a0 */ 0x0000eac9, 0x0000eaca, 0x8ea2cda4, 0x8ea2cda5,
+ /* a4 */ 0x00000000, 0x8ea2cda6, 0x8ea2d3a3, 0x8eaeceb2,
+ /* a8 */ 0x8ea2d3a4, 0x0000eeca, 0x8ea2d3a1, 0x8ea2d2fe,
+ /* ac */ 0x8ea2d3a2, 0x8ea2d2fd, 0x0000f1f5, 0x8ea2d9d0,
+ /* b0 */ 0x0000f1f3, 0x0000f1f4, 0x8ea2ded3, 0x0000f4f5,
+ /* b4 */ 0x8ea2ded2, 0x8ea2e1b4, 0x8eaed5fe, 0x8ea2e2e6,
+ /* b8 */ 0x8ea2e2e7, 0x0000f7a8, 0x8eaed8e1, 0x0000f7a9,
+ /* bc */ 0x0000f4f6, 0x8ea2e6c8, 0x8ea2e6c9, 0x8ea2e9de,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03998 ***/
+
+ /* 80 */ 0x0000faae, 0x0000c8d2, 0x8eaee6fb, 0x0000c8d3,
+ /* 84 */ 0x0000d7d3, 0x0000cfaf, 0x0000d7d2, 0x8ea2acf2,
+ /* 88 */ 0x8eaeb8b6, 0x00000000, 0x8eaeb3c4, 0x0000e1c6,
+ /* 8c */ 0x0000c8d4, 0x0000d3a4, 0x8ea2acf3, 0x8ea2acf4,
+ /* 90 */ 0x0000d3a3, 0x0000d3a5, 0x0000c8d5, 0x00000000,
+ /* 94 */ 0x8ea2acf5, 0x0000d7d5, 0x8ea2b2aa, 0x0000d7d7,
+ /* 98 */ 0x0000d7d4, 0x0000d7d6, 0x8eaeb8b7, 0x8ea2b8c5,
+ /* 9c */ 0x0000dce5, 0x8eaeb8b9, 0x8ea2b8c4, 0x8ea2b8c3,
+ /* a0 */ 0x00000000, 0x8ea2c6b8, 0x00000000, 0x8eaec9a2,
+ /* a4 */ 0x8ea2cda8, 0x00000000, 0x0000eecb, 0x00000000,
+ /* a8 */ 0x0000f1f6, 0x8ea2d9d2, 0x8ea2d9d1, 0x8eaed6a1,
+ /* ac */ 0x8ea2ded4, 0x00000000, 0x8eaed8e2, 0x8eaedcef,
+ /* b0 */ 0x8ea2ebfd, 0x00000000, 0x00000000, 0x0000c8d6,
+ /* b4 */ 0x8ea2a4f3, 0x8ea2a8ca, 0x0000d3a6, 0x8ea2acf6,
+ /* b8 */ 0x00000000, 0x8ea2b2ac, 0x00000000, 0x8eaeb3c9,
+ /* bc */ 0x8eaeb3c8, 0x0000d7d8, 0x8ea2b2ab, 0x0000d7d9,
+
+ /*** Three byte table, leaf: e881xx - offset 0x039d8 ***/
+
+ /* 80 */ 0x8eaeb3c7, 0x8eaee6af, 0x00000000, 0x8ea2b8c7,
+ /* 84 */ 0x8eaeb8bd, 0x8eaeb8bc, 0x0000dce7, 0x8ea2b8c6,
+ /* 88 */ 0x8ea2b8c8, 0x8eaeb8bb, 0x0000dce6, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x8eaebebc, 0x8ea2bfab,
+ /* 90 */ 0x8ea2bfac, 0x8ea2bfaa, 0x0000e1c7, 0x8eaee7a9,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000e5fb, 0x8eaec3f3,
+ /* 98 */ 0x0000e5fc, 0x8eaee3d6, 0x0000eacd, 0x8eaec9a3,
+ /* 9c */ 0x8ea2cdaa, 0x8ea2cda9, 0x0000eacc, 0x8eaec9a6,
+ /* a0 */ 0x8eaebebb, 0x8eaec9a5, 0x00000000, 0x8eaee6b0,
+ /* a4 */ 0x8ea2d3a5, 0x8eaeceb4, 0x8eaeceb6, 0x8ea2d3a6,
+ /* a8 */ 0x8eaeceb7, 0x00000000, 0x8eaeceb5, 0x8eaeceb8,
+ /* ac */ 0x8ea2d9d3, 0x00000000, 0x8eaed2c3, 0x0000f4fa,
+ /* b0 */ 0x0000f4f9, 0x0000f4f7, 0x0000f4f8, 0x0000f4fb,
+ /* b4 */ 0x8eaed6a2, 0x8ea2e2e8, 0x0000f7ab, 0x0000f7aa,
+ /* b8 */ 0x8ea2e6ca, 0x8ea2e9df, 0x8eaedcf0, 0x8eaedcf1,
+ /* bc */ 0x8eaedcf2, 0x0000fbef, 0x0000fbee, 0x0000c8d7,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03a18 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8ea2affd, 0x00000000,
+ /* 84 */ 0x0000e5fe, 0x0000e1c8, 0x0000e5fd, 0x0000eace,
+ /* 88 */ 0x00000000, 0x0000c8d8, 0x8ea2a1e8, 0x0000c8d9,
+ /* 8c */ 0x0000c8da, 0x8eaea4b5, 0x8eaea4b6, 0x8ea2a8cb,
+ /* 90 */ 0x8ea2a4f6, 0x8eaea7a4, 0x8ea2a4f7, 0x0000cbba,
+ /* 94 */ 0x8eaea7a6, 0x8ea2a4f4, 0x0000cbb9, 0x8eaea7a5,
+ /* 98 */ 0x0000cbbc, 0x8ea2a4f5, 0x0000cbbe, 0x0000cbbd,
+ /* 9c */ 0x8ea2a4f8, 0x0000cbbb, 0x00000000, 0x8eaea7a3,
+ /* a0 */ 0x00000000, 0x0000cfb4, 0x0000cfb2, 0x8ea2a8cd,
+ /* a4 */ 0x8eaeaad6, 0x0000cfb1, 0x8eaeaadb, 0x8eaeaad8,
+ /* a8 */ 0x8eaeaacf, 0x0000cfb6, 0x0000cfb8, 0x0000cfb5,
+ /* ac */ 0x8eaeaad9, 0x8ea2a8d0, 0x8ea2a8cc, 0x0000cfb9,
+ /* b0 */ 0x8eaeaad2, 0x0000cfb3, 0x0000cbbf, 0x8eaeaad4,
+ /* b4 */ 0x0000cfb7, 0x8ea2a8cf, 0x8eaeaad7, 0x00000000,
+ /* b8 */ 0x8ea2a8ce, 0x00000000, 0x0000cfb0, 0x8eaee6b1,
+ /* bc */ 0x00000000, 0x00000000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03a56 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8ea2acfc, 0x0000d3aa,
+ /* 84 */ 0x0000d3ab, 0x8ea2acfe, 0x8eaeaee6, 0x8ea2acf8,
+ /* 88 */ 0x8ea2acfb, 0x8ea2ada6, 0x8ea2ada4, 0x8eaeaee0,
+ /* 8c */ 0x0000d3ac, 0x8ea2adaa, 0x0000d3af, 0x8ea2ada7,
+ /* 90 */ 0x8ea2acfd, 0x8ea2acfa, 0x8eaeaee1, 0x8eaeaede,
+ /* 94 */ 0x8ea2bfae, 0x8ea2ada5, 0x0000d3a7, 0x8ea2ada8,
+ /* 98 */ 0x8ea2acf7, 0x8ea2ada2, 0x0000d3a9, 0x0000d3ae,
+ /* 9c */ 0x8ea2ada3, 0x0000d3b2, 0x0000d3b0, 0x8eaeaee5,
+ /* a0 */ 0x8ea2acf9, 0x0000d3ad, 0x8eaeaee4, 0x8ea2ada1,
+ /* a4 */ 0x0000d3b1, 0x0000d3a8, 0x8ea2ada9, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x0000d7de, 0x8eaeb3cc, 0x0000d7e7,
+ /* b0 */ 0x0000d7dc, 0x0000d7da, 0x8ea2b2ae, 0x0000d7e2,
+ /* b4 */ 0x0000d7df, 0x8ea2b2b0, 0x8eaeb3ca, 0x8eaeb3d2,
+ /* b8 */ 0x0000d7e1, 0x8ea2b2af, 0x8ea2b2ad, 0x8ea2b2b2,
+ /* bc */ 0x0000d7e6, 0x0000d7e4, 0x8ea2bfad, 0x8eaeb3cb,
+
+ /*** Three byte table, leaf: e884xx - offset 0x03a96 ***/
+
+ /* 80 */ 0x8ea2b2b3, 0x8ea2b2b1, 0x0000d7db, 0x8eaeb3ce,
+ /* 84 */ 0x8eaeb3cd, 0x0000d7dd, 0x0000d7e0, 0x8eaeb3cf,
+ /* 88 */ 0x0000d7e3, 0x8eaeaee3, 0x0000d7e5, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x8eaebec4, 0x8ea2b8d2, 0x0000dce9, 0x8eaeb8c9,
+ /* 98 */ 0x8ea2b8c9, 0x8ea2b8cb, 0x8eaeb8c7, 0x8ea2b8cc,
+ /* 9c */ 0x00000000, 0x8ea2b8d4, 0x8ea2b8d0, 0x8ea2b8ce,
+ /* a0 */ 0x00000000, 0x8ea2b8d1, 0x8ea2b8d5, 0x0000dcea,
+ /* a4 */ 0x0000dcee, 0x8ea2b8ca, 0x00000000, 0x8ea2b8d3,
+ /* a8 */ 0x8eaee3ae, 0x0000dcec, 0x8eaeb8c1, 0x0000dceb,
+ /* ac */ 0x8ea2b8cf, 0x8ea2b8cd, 0x8eaeb8c2, 0x0000dce8,
+ /* b0 */ 0x0000dced, 0x8eaeb8c5, 0x00000000, 0x00000000,
+ /* b4 */ 0x8eaeb8c8, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x0000e1ce, 0x8ea2bfb6, 0x8eaebebe,
+ /* bc */ 0x00000000, 0x8ea2bfb4, 0x0000e1d0, 0x00000000,
+
+ /*** Three byte table, leaf: e885xx - offset 0x03ad6 ***/
+
+ /* 80 */ 0x8eaebec3, 0x8eaebec5, 0x8eaebec1, 0x8ea2bfaf,
+ /* 84 */ 0x8ea2c6c6, 0x8eaebebd, 0x0000e1cf, 0x8ea2bfb3,
+ /* 88 */ 0x8eaebec0, 0x8eaebec2, 0x8ea2bfb0, 0x0000e1cb,
+ /* 8c */ 0x0000e1d1, 0x8ea2bfb5, 0x0000e1cd, 0x8ea2bfb2,
+ /* 90 */ 0x0000eacf, 0x0000e1cc, 0x8ea2bfb1, 0x0000e1d2,
+ /* 94 */ 0x0000e1ca, 0x0000e1c9, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2c6be,
+ /* 9c */ 0x8ea2c6bc, 0x8eaec3fb, 0x8ea2c6c2, 0x8eaec3fe,
+ /* a0 */ 0x8ea2c6ba, 0x8ea2c6c7, 0x8ea2c6bf, 0x8eaec3f5,
+ /* a4 */ 0x8ea2c6b9, 0x0000e6a4, 0x0000e6aa, 0x8ea2c6c4,
+ /* a8 */ 0x00000000, 0x8ea2c6bd, 0x8eaec3f6, 0x0000e6a7,
+ /* ac */ 0x8eaec3f7, 0x8eaec4a3, 0x0000e6a5, 0x8ea2c6c5,
+ /* b0 */ 0x0000e6a2, 0x0000e6a1, 0x8ea2c6c0, 0x0000e6a6,
+ /* b4 */ 0x0000e1d3, 0x8eaec3fc, 0x8ea2c6c3, 0x8ea2c6bb,
+ /* b8 */ 0x0000e6a3, 0x0000e6a8, 0x0000e6a9, 0x00000000,
+ /* bc */ 0x00000000, 0x8eaec4a2, 0x00000000, 0x0000ead4,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03b16 ***/
+
+ /* 80 */ 0x0000ead0, 0x8eaec9a7, 0x0000ead5, 0x8ea2cdad,
+ /* 84 */ 0x8eaec9aa, 0x00000000, 0x8ea2cdac, 0x8ea2cdae,
+ /* 88 */ 0x0000ead2, 0x8ea2cdab, 0x0000ead3, 0x8ea2cdb1,
+ /* 8c */ 0x8ea2cdb0, 0x8ea2cdaf, 0x00000000, 0x0000ead1,
+ /* 90 */ 0x00000000, 0x00000000, 0x8eaecebb, 0x8eaecebd,
+ /* 94 */ 0x8eaeceb9, 0x8ea2d3aa, 0x8eaecebc, 0x8ea2d3ad,
+ /* 98 */ 0x0000eed1, 0x8ea2d3ac, 0x0000eed0, 0x0000eecc,
+ /* 9c */ 0x0000eecd, 0x0000eece, 0x8ea2d3a9, 0x8ea2d3a8,
+ /* a0 */ 0x0000eecf, 0x8eaeceba, 0x8ea2d3ab, 0x8ea2d3a7,
+ /* a4 */ 0x00000000, 0x00000000, 0x8ea2d9d5, 0x8ea2d9df,
+ /* a8 */ 0x0000f1f9, 0x0000f1f8, 0x8eaed2c9, 0x8ea2d9d9,
+ /* ac */ 0x8ea2d9db, 0x8eaed2c7, 0x8ea2d9d6, 0x8eaed2c4,
+ /* b0 */ 0x8ea2d9da, 0x8ea2d9d4, 0x8ea2d9dd, 0x0000f1f7,
+ /* b4 */ 0x8ea2d9dc, 0x8ea2d9d8, 0x00000000, 0x8ea2d9de,
+ /* b8 */ 0x8eaed6a3, 0x8ea2d9d7, 0x0000f4fe, 0x8ea2ded5,
+ /* bc */ 0x8ea2dedb, 0x0000f5a4, 0x0000f5a6, 0x0000f5a3,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03b56 ***/
+
+ /* 80 */ 0x0000f5a2, 0x00000000, 0x0000f5a1, 0x0000f4fd,
+ /* 84 */ 0x8ea2ded6, 0x8ea2ded9, 0x0000f4fc, 0x8ea2deda,
+ /* 88 */ 0x8eaed6a4, 0x0000f5a5, 0x8ea2ded8, 0x00000000,
+ /* 8c */ 0x8ea2ded7, 0x0000f7ac, 0x8eaed8e5, 0x0000f7ad,
+ /* 90 */ 0x8ea2e2eb, 0x8ea2e2e9, 0x8ea2e2ea, 0x00000000,
+ /* 94 */ 0x8eaedaf7, 0x8ea2e6cc, 0x8eaedaf8, 0x8ea2e6cb,
+ /* 98 */ 0x0000f8e9, 0x8ea2e9e1, 0x0000faaf, 0x8ea2e9e0,
+ /* 9c */ 0x00000000, 0x8ea2ebfe, 0x8ea2edf2, 0x0000fbf0,
+ /* a0 */ 0x8ea2f1b2, 0x8ea2f1b3, 0x0000fcc4, 0x0000c8db,
+ /* a4 */ 0x00000000, 0x0000cfba, 0x8ea2bfb7, 0x0000ead6,
+ /* a8 */ 0x0000f5a7, 0x8ea2dedc, 0x0000c8dc, 0x00000000,
+ /* ac */ 0x0000d7e9, 0x0000d7e8, 0x8ea2bfb8, 0x8eaebec7,
+ /* b0 */ 0x00000000, 0x00000000, 0x8ea2d9e0, 0x0000c8dd,
+ /* b4 */ 0x0000d3b3, 0x00000000, 0x8eaebec8, 0x8ea2bfb9,
+ /* b8 */ 0x8ea2bfba, 0x8ea2bfbb, 0x0000ead7, 0x0000f1fa,
+ /* bc */ 0x0000c8de, 0x00000000, 0x0000cfbb, 0x8ea2adab,
+
+ /*** Three byte table, leaf: e888xx - offset 0x03b96 ***/
+
+ /* 80 */ 0x0000d7ea, 0x8ea2b2b4, 0x0000dcef, 0x8eaebec9,
+ /* 84 */ 0x8ea2bfbc, 0x0000e6ab, 0x00000000, 0x0000ead8,
+ /* 88 */ 0x0000f1fb, 0x0000f5a8, 0x0000f7ae, 0x8ea2e6cd,
+ /* 8c */ 0x0000c8df, 0x0000cfbc, 0x8eaeaadd, 0x00000000,
+ /* 90 */ 0x0000d7eb, 0x8ea2b8d6, 0x0000e1d4, 0x8eaec9ab,
+ /* 94 */ 0x0000ead9, 0x8ea2cdb2, 0x8ea2d3ae, 0x00000000,
+ /* 98 */ 0x8eaed2ca, 0x8eaed8e8, 0x8eaedaf9, 0x0000c8e0,
+ /* 9c */ 0x0000e1d5, 0x8ea2c6c8, 0x0000eada, 0x0000c8e1,
+ /* a0 */ 0x8ea2a8d1, 0x8ea2adac, 0x0000d3b4, 0x00000000,
+ /* a4 */ 0x8eaeaee8, 0x8ea2b2b6, 0x00000000, 0x8eaeb3d7,
+ /* a8 */ 0x0000d7ee, 0x8eaeb3d8, 0x0000d7ec, 0x0000d7ed,
+ /* ac */ 0x0000d7ef, 0x8eaeb3d5, 0x00000000, 0x8ea2b2b5,
+ /* b0 */ 0x00000000, 0x00000000, 0x8ea2b8db, 0x8ea2b8d8,
+ /* b4 */ 0x8ea2b8da, 0x0000dcf0, 0x0000dcf2, 0x0000dcf1,
+ /* b8 */ 0x8ea2b8d7, 0x0000dcf3, 0x8ea2b8d9, 0x00000000,
+ /* bc */ 0x8ea2bfbd, 0x8ea2bfbe, 0x00000000, 0x8ea2bfbf,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03bd6 ***/
+
+ /* 80 */ 0x8ea2c6cb, 0x8eaec4a6, 0x8ea2c6cc, 0x00000000,
+ /* 84 */ 0x8ea2c6ca, 0x8ea2c6cd, 0x00000000, 0x0000e6ac,
+ /* 88 */ 0x8eaee6b4, 0x8ea2c6c9, 0x8eaec9ad, 0x0000eadb,
+ /* 8c */ 0x8eaec9ae, 0x00000000, 0x8ea2d3b3, 0x8ea2d3af,
+ /* 90 */ 0x8ea2d3b2, 0x8ea2d3b4, 0x8ea2d3b1, 0x8ea2d3b0,
+ /* 94 */ 0x00000000, 0x8ea2d9e1, 0x8ea2d9e2, 0x8ea2d9e3,
+ /* 98 */ 0x0000f1fc, 0x0000f1fd, 0x8ea2dede, 0x8ea2dedd,
+ /* 9c */ 0x8ea2dedf, 0x00000000, 0x8ea2e2ed, 0x8ea2e2ec,
+ /* a0 */ 0x00000000, 0x8ea2e6cf, 0x8eaedafa, 0x8ea2e6d0,
+ /* a4 */ 0x8ea2e6ce, 0x8eaedafb, 0x0000fab0, 0x00000000,
+ /* a8 */ 0x8ea2e9e2, 0x8ea2e9e3, 0x8eaeded5, 0x8ea2edf3,
+ /* ac */ 0x8ea2efbe, 0x8ea2f0c9, 0x0000c8e2, 0x0000cbc0,
+ /* b0 */ 0x00000000, 0x0000f5a9, 0x0000c8e3, 0x00000000,
+ /* b4 */ 0x8ea2b8dc, 0x8ea2bfc0, 0x8eaedafc, 0x0000fcec,
+ /* b8 */ 0x8ea2a2ea, 0x00000000, 0x00000000, 0x8eaea4b8,
+ /* bc */ 0x8ea2a2eb, 0x8ea2a2ed, 0x0000c8e4, 0x8ea2a2ee,
+
+ /*** Three byte table, leaf: e88axx - offset 0x03c16 ***/
+
+ /* 80 */ 0x8ea2a2ec, 0x00000000, 0x00000000, 0x8ea2a5a2,
+ /* 84 */ 0x8ea2a5a3, 0x8ea2a4fb, 0x8eaea7a8, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x8ea2a5a1, 0x0000cbc2,
+ /* 8c */ 0x8eaea7a9, 0x0000cbc3, 0x8ea2a4fc, 0x8ea2a4fa,
+ /* 90 */ 0x8ea2a4f9, 0x8ea2a4fd, 0x0000cbc1, 0x8ea2a4fe,
+ /* 94 */ 0x8ea2adad, 0x8eaea7ab, 0x00000000, 0x00000000,
+ /* 98 */ 0x8ea2a8d6, 0x0000cfbf, 0x8ea2a8d5, 0x8ea2a8d7,
+ /* 9c */ 0x8eaeaae0, 0x0000cfbe, 0x8ea2a8dc, 0x0000cfc2,
+ /* a0 */ 0x8ea2a8d2, 0x8ea2a8e0, 0x8ea2a8e6, 0x0000cfc9,
+ /* a4 */ 0x8ea2a8e3, 0x0000cfc6, 0x8eaeaaeb, 0x8ea2a8d9,
+ /* a8 */ 0x8ea2a8df, 0x8ea2a8e1, 0x8eaeaae6, 0x8ea2a8d4,
+ /* ac */ 0x0000cfc5, 0x0000cfc0, 0x8ea2a8da, 0x0000cfc7,
+ /* b0 */ 0x0000cfca, 0x0000cfc4, 0x8eaeaaec, 0x0000cfbd,
+ /* b4 */ 0x8ea2a8de, 0x8ea2a8d8, 0x8ea2a8e5, 0x0000cfcc,
+ /* b8 */ 0x0000cfc8, 0x0000cfc3, 0x8ea2a8dd, 0x0000d7f0,
+ /* bc */ 0x8ea2a8db, 0x0000cfc1, 0x0000cfcb, 0x00000000,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03c56 ***/
+
+ /* 80 */ 0x8ea2a8d3, 0x00000000, 0x8ea2a8e2, 0x8ea2a8e4,
+ /* 84 */ 0x8eaeaade, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x8eaeaae8, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x8eaeaef6, 0x0000d3c5, 0x0000d3bf, 0x0000d3c7,
+ /* 94 */ 0x0000d3c4, 0x8ea2adb4, 0x8ea2adb7, 0x0000d3c0,
+ /* 98 */ 0x8eaeaeea, 0x8ea2adae, 0x00000000, 0x0000d3b9,
+ /* 9c */ 0x0000d3c3, 0x8eaeaeeb, 0x0000d3c6, 0x0000d3c8,
+ /* a0 */ 0x8ea2adc3, 0x8ea2adba, 0x8eaeaef8, 0x0000d3b8,
+ /* a4 */ 0x8ea2adc2, 0x0000d3bc, 0x0000d3ba, 0x0000d3b5,
+ /* a8 */ 0x8ea2adb2, 0x8eaeaef2, 0x8ea2adc1, 0x8ea2adb6,
+ /* ac */ 0x8ea2adb9, 0x8ea2adc6, 0x8eaeaef4, 0x0000d3c9,
+ /* b0 */ 0x8ea2adc0, 0x0000d3c1, 0x8ea2adbb, 0x8ea2adc5,
+ /* b4 */ 0x8ea2adb8, 0x8ea2adbc, 0x8ea2adbf, 0x8eaeaee9,
+ /* b8 */ 0x8eaeaeee, 0x8ea2adb0, 0x8ea2adc4, 0x8ea2adbe,
+ /* bc */ 0x8eaeaeef, 0x8eaeaefa, 0x8ea2adaf, 0x00000000,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03c96 ***/
+
+ /* 80 */ 0x8ea2adb3, 0x0000d3c2, 0x0000d3bd, 0x0000d3b6,
+ /* 84 */ 0x0000d3bb, 0x0000d3b7, 0x0000d3ca, 0x8ea2adb1,
+ /* 88 */ 0x8ea2b2c7, 0x0000d3be, 0x00000000, 0x8eaeaef9,
+ /* 8c */ 0x8ea2adbd, 0x8ea2a9c2, 0x8eaeaef7, 0x00000000,
+ /* 90 */ 0x8eaee6b5, 0x00000000, 0x8eaee6b7, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x8ea2b2ca, 0x0000d7fe,
+ /* 98 */ 0x8eaeb3e2, 0x8ea2b2ba, 0x00000000, 0x8ea2b2c5,
+ /* 9c */ 0x8ea2b2c1, 0x8eaeb8cd, 0x8ea2b2d4, 0x8eaeb3d9,
+ /* a0 */ 0x8ea2b2cc, 0x8eaeb3df, 0x8ea2b2c2, 0x8eaeb8db,
+ /* a4 */ 0x8ea2b2cb, 0x8ea2b2bc, 0x8ea2b2c0, 0x8ea2b2d7,
+ /* a8 */ 0x0000d8a3, 0x8ea2b2cf, 0x8ea2b2c6, 0x0000d7f1,
+ /* ac */ 0x8ea2b2d5, 0x8ea2b2b8, 0x00000000, 0x8ea2b2ce,
+ /* b0 */ 0x00000000, 0x0000d8a2, 0x0000d7fb, 0x8ea2b2b7,
+ /* b4 */ 0x0000d7f9, 0x0000d7f8, 0x0000d7fd, 0x8ea2b2cd,
+ /* b8 */ 0x0000d7f5, 0x0000d7fc, 0x8ea2adb5, 0x8ea2bfc1,
+ /* bc */ 0x8ea2b2c8, 0x00000000, 0x8eaeaadf, 0x8ea2b2be,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x03cd6 ***/
+
+ /* 80 */ 0x0000d8a1, 0x8ea2b2bf, 0x8ea2b2c3, 0x0000d8a4,
+ /* 84 */ 0x8ea2b2b9, 0x8ea2b2d1, 0x8eaebed7, 0x8ea2b2d0,
+ /* 88 */ 0x8ea2b2d8, 0x0000d7f7, 0x0000d7f4, 0x8ea2b2d6,
+ /* 8c */ 0x8ea2b2d2, 0x8ea2b2c9, 0x8ea2b2c4, 0x0000d7fa,
+ /* 90 */ 0x0000d7f6, 0x8ea2b2bb, 0x0000d7f2, 0x8ea2b2d3,
+ /* 94 */ 0x0000d7f3, 0x00000000, 0x8ea2b2bd, 0x8eaeb3da,
+ /* 98 */ 0x8eaeb3e3, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x8eaee6b6, 0x8eaeadb3,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x8eaeb8ce, 0x8eaeb8d1, 0x8ea2b8e2,
+ /* b4 */ 0x8ea2b8e4, 0x8ea2b8e9, 0x8ea2b8fd, 0x0000dda3,
+ /* b8 */ 0x0000dcf7, 0x8eaeb8d4, 0x8ea2b8e1, 0x0000dda4,
+ /* bc */ 0x0000dda5, 0x8ea2b8ec, 0x8ea2b8f3, 0x8ea2b8f9,
+
+ /*** Three byte table, leaf: e88exx - offset 0x03d16 ***/
+
+ /* 80 */ 0x8eaeb8d0, 0x8ea2b8e6, 0x00000000, 0x8ea2b8ed,
+ /* 84 */ 0x8eaeb8cf, 0x8eaeb8dd, 0x0000dda6, 0x8ea2b8fb,
+ /* 88 */ 0x8ea2b8f6, 0x0000dda1, 0x0000dcfd, 0x8ea2b8f2,
+ /* 8c */ 0x8ea2b8ee, 0x8ea2b8e0, 0x0000dcf4, 0x8ea2b8e5,
+ /* 90 */ 0x8ea2b8dd, 0x8eaeb8d5, 0x0000dcfc, 0x0000dcfe,
+ /* 94 */ 0x8ea2b8ea, 0x8ea2b8e7, 0x0000dcf9, 0x8ea2b8f7,
+ /* 98 */ 0x0000dcf6, 0x8ea2b8e8, 0x8ea2bfea, 0x8ea2b8f0,
+ /* 9c */ 0x8eaeb8de, 0x8ea2b8ef, 0x0000dcf5, 0x8eaeb8d7,
+ /* a0 */ 0x0000dda2, 0x8eaeb8d2, 0x0000dcf8, 0x8ea2b8de,
+ /* a4 */ 0x8ea2b8e3, 0x8ea2b8f4, 0x8ea2b8fa, 0x0000dda7,
+ /* a8 */ 0x8ea2b8df, 0x8ea2b8eb, 0x8ea2b8f1, 0x0000dcfb,
+ /* ac */ 0x00000000, 0x8eaeb8d8, 0x8ea2b8fc, 0x8ea2b8f5,
+ /* b0 */ 0x8ea2b8f8, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeb8df,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x0000dcfa, 0x00000000, 0x8ea2bfd1,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x03d56 ***/
+
+ /* 80 */ 0x8ea2bfc5, 0x0000e1dd, 0x8ea2bfe2, 0x8ea2bfeb,
+ /* 84 */ 0x8ea2bfee, 0x0000e1db, 0x8ea2bfcd, 0x8ea2bfe6,
+ /* 88 */ 0x8ea2bfce, 0x8ea2bfdc, 0x0000e1e8, 0x8ea2bfd8,
+ /* 8c */ 0x0000e1e5, 0x8eaebede, 0x8ea2bfd9, 0x8ea2bfc2,
+ /* 90 */ 0x00000000, 0x8ea2bfe7, 0x8eaebecf, 0x8eaebed9,
+ /* 94 */ 0x0000e1ee, 0x8ea2bfe4, 0x8ea2bfda, 0x8ea2bff0,
+ /* 98 */ 0x8ea2bfd5, 0x8ea2c6ed, 0x8eaebecd, 0x8ea2bff3,
+ /* 9c */ 0x0000e1ec, 0x8ea2bfd3, 0x8ea2bfdf, 0x0000e1ef,
+ /* a0 */ 0x0000e1da, 0x8ea2bfd7, 0x8ea2bff1, 0x8ea2bfd0,
+ /* a4 */ 0x8ea2bfc9, 0x8ea2bfd4, 0x8eaebedf, 0x8ea2bfc8,
+ /* a8 */ 0x8ea2bfc6, 0x0000e1d6, 0x8ea2bfe8, 0x8ea2bfcf,
+ /* ac */ 0x8ea2bfec, 0x8eaebecb, 0x8ea2bfed, 0x0000e1de,
+ /* b0 */ 0x0000e1e3, 0x0000e1df, 0x0000e1e7, 0x8ea2bfe3,
+ /* b4 */ 0x0000e1e0, 0x8ea2bfdb, 0x8ea2bfcb, 0x00000000,
+ /* b8 */ 0x0000e1d8, 0x8ea2bfc3, 0x8ea2bfe5, 0x8ea2bfef,
+ /* bc */ 0x8ea2bfca, 0x0000e1e6, 0x8ea2bff4, 0x8ea2bfd6,
+
+ /*** Three byte table, leaf: e890xx - offset 0x03d96 ***/
+
+ /* 80 */ 0x8eaebed2, 0x8ea2bfd2, 0x8eaebedc, 0x0000e1d7,
+ /* 84 */ 0x0000e1eb, 0x8eaebeda, 0x8ea2bfe1, 0x0000e1ed,
+ /* 88 */ 0x8eaebed0, 0x8ea2bfdd, 0x0000e1e2, 0x0000e1dc,
+ /* 8c */ 0x0000e1e4, 0x0000e1d9, 0x0000e1ea, 0x8ea2bfde,
+ /* 90 */ 0x8ea2bfcc, 0x8ea2bfe0, 0x8ea2bfc7, 0x8ea2bfe9,
+ /* 94 */ 0x8eaebed8, 0x00000000, 0x8eaebedd, 0x8eaebed6,
+ /* 98 */ 0x8eaebece, 0x00000000, 0x00000000, 0x8ea2bff2,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaee6b9, 0x8eaebedb,
+ /* a0 */ 0x00000000, 0x8eaee6b8, 0x00000000, 0x8ea2bfc4,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x8ea2c6ec, 0x8eaec4ad, 0x8ea2c7a4,
+ /* ac */ 0x0000e5dc, 0x8ea2c6f1, 0x8eaec4b1, 0x8ea2c6ef,
+ /* b0 */ 0x8ea2c6da, 0x0000e6b0, 0x8ea2c6ea, 0x8ea2c6fe,
+ /* b4 */ 0x8ea2c6e6, 0x0000e6b8, 0x8ea2c6fd, 0x8ea2c6e4,
+ /* b8 */ 0x0000e1e9, 0x8ea2c6f4, 0x8ea2c6e5, 0x8ea2c6fb,
+ /* bc */ 0x0000e6b7, 0x0000e6af, 0x8eaec4ba, 0x8ea2c6cf,
+
+ /*** Three byte table, leaf: e891xx - offset 0x03dd6 ***/
+
+ /* 80 */ 0x8ea2c6d7, 0x8eaec4b5, 0x8ea2c6f0, 0x8ea2c6e8,
+ /* 84 */ 0x8ea2c7a3, 0x8ea2c6eb, 0x0000e6bd, 0x8ea2c6fc,
+ /* 88 */ 0x8eaec4ac, 0x0000e6b4, 0x8eaec4be, 0x8ea2c6ee,
+ /* 8c */ 0x8ea2c6f6, 0x8ea2c6db, 0x8ea2c6f5, 0x8eaec4a7,
+ /* 90 */ 0x8ea2c7a8, 0x8ea2c6d6, 0x8ea2c6f7, 0x8eaec4b3,
+ /* 94 */ 0x8ea2c7a6, 0x8eaec4bf, 0x8ea2c6d0, 0x0000e1e1,
+ /* 98 */ 0x8eaec4c0, 0x8ea2c6de, 0x8ea2c6dd, 0x0000e6b6,
+ /* 9c */ 0x8eaec4b2, 0x8ea2c6e1, 0x8ea2c6e3, 0x8ea2c6f2,
+ /* a0 */ 0x8ea2c7a5, 0x0000e6b9, 0x8eaec4b8, 0x0000e6ba,
+ /* a4 */ 0x8eaec4b0, 0x8ea2c6d5, 0x0000e6b2, 0x8ea2c6d9,
+ /* a8 */ 0x8ea2c7a1, 0x0000e6bb, 0x00000000, 0x0000e6b3,
+ /* ac */ 0x0000e6b5, 0x0000e6bc, 0x8ea2c7a7, 0x8ea2c6f8,
+ /* b0 */ 0x8ea2c6f3, 0x8eaec4bc, 0x8eaec4af, 0x8ea2c6e0,
+ /* b4 */ 0x8ea2c6df, 0x0000e6b1, 0x8ea2c6d1, 0x0000e6ae,
+ /* b8 */ 0x8ea2c6e9, 0x8ea2c6d2, 0x8ea2c6e7, 0x8eaec4ae,
+ /* bc */ 0x00000000, 0x8ea2c6dc, 0x8ea2c7a2, 0x8eaec4aa,
+
+ /*** Three byte table, leaf: e892xx - offset 0x03e16 ***/
+
+ /* 80 */ 0x8eaec4b9, 0x00000000, 0x0000e6ad, 0x8eaec4bb,
+ /* 84 */ 0x8eaec4a8, 0x00000000, 0x8ea2c6d8, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x8ea2c6d4, 0x8ea2c6fa, 0x8ea2c6d3,
+ /* 90 */ 0x0000eae8, 0x8ea2cdda, 0x8eaec9b5, 0x8eaec9c4,
+ /* 94 */ 0x8ea2cdc9, 0x8eaec9b3, 0x8eaec9b8, 0x8ea2cdb3,
+ /* 98 */ 0x8ea2cdd1, 0x0000eae0, 0x8ea2cdc2, 0x8ea2cdcc,
+ /* 9c */ 0x0000eae3, 0x8ea2cdc5, 0x0000eae1, 0x8ea2cdb6,
+ /* a0 */ 0x8ea2cdd4, 0x8ea2cdb5, 0x8ea2cdc8, 0x8eaec9bc,
+ /* a4 */ 0x8ea2cdb4, 0x8eaec9b9, 0x00000000, 0x8ea2cdc6,
+ /* a8 */ 0x8ea2cdcf, 0x8ea2cdcd, 0x8ea2cdc1, 0x8ea2cdbc,
+ /* ac */ 0x8ea2cdba, 0x8eaec9c2, 0x8ea2cdbb, 0x8ea2cdce,
+ /* b0 */ 0x8ea2cdd9, 0x8ea2cdc3, 0x0000eae2, 0x8eaec9bb,
+ /* b4 */ 0x8ea2cdbe, 0x8eaec9ba, 0x8ea2cdd2, 0x8eaec9c1,
+ /* b8 */ 0x0000eae5, 0x8ea2cdbd, 0x8ea2cdb7, 0x8ea2cdc7,
+ /* bc */ 0x0000eae9, 0x8eaec9b2, 0x00000000, 0x0000eadd,
+
+ /*** Three byte table, leaf: e893xx - offset 0x03e56 ***/
+
+ /* 80 */ 0x0000eae6, 0x8ea2cdbf, 0x8ea2cdb9, 0x8eaec9b6,
+ /* 84 */ 0x0000eadf, 0x8ea2c6f9, 0x0000eade, 0x8ea2cdca,
+ /* 88 */ 0x8eaec4b6, 0x0000eadc, 0x0000eaeb, 0x0000eae4,
+ /* 8c */ 0x8ea2cdcb, 0x8ea2cdc0, 0x8ea2cdb8, 0x8ea2cdd3,
+ /* 90 */ 0x8ea2cdc4, 0x0000eaea, 0x8ea2cdd7, 0x0000eae7,
+ /* 94 */ 0x8ea2cdd6, 0x8eaec9bf, 0x8ea2cdd0, 0x8ea2cdd5,
+ /* 98 */ 0x8eaec9be, 0x00000000, 0x8eaec9c3, 0x8ea2cdd8,
+ /* 9c */ 0x00000000, 0x00000000, 0x8eaee6bb, 0x00000000,
+ /* a0 */ 0x00000000, 0x8eaee6bc, 0x8eaee6ba, 0x00000000,
+ /* a4 */ 0x8eaec9bd, 0x00000000, 0x00000000, 0x8ea2d3dc,
+ /* a8 */ 0x8ea2d3dd, 0x8ea2d3d0, 0x8ea2d3cf, 0x8ea2d3cb,
+ /* ac */ 0x0000eedd, 0x8eaececf, 0x0000eed5, 0x8ea2d3df,
+ /* b0 */ 0x8ea2d3de, 0x8ea2c6ce, 0x8ea2d3c8, 0x8ea2d3cc,
+ /* b4 */ 0x8ea2d3c6, 0x8eaecec4, 0x8ea2d3d9, 0x8ea2d3ca,
+ /* b8 */ 0x8eaecec2, 0x8ea2d3e0, 0x8ea2d3c3, 0x8ea2d3c1,
+ /* bc */ 0x8ea2d3cd, 0x8ea2d3d7, 0x8ea2d3d2, 0x0000eedf,
+
+ /*** Three byte table, leaf: e894xx - offset 0x03e96 ***/
+
+ /* 80 */ 0x8ea2d3b8, 0x8eaecec0, 0x8ea2d3d6, 0x8eaececc,
+ /* 84 */ 0x8eaecec6, 0x8eaeced4, 0x0000eee0, 0x8ea2c6e2,
+ /* 88 */ 0x8ea2d3c4, 0x8ea2d3bb, 0x8ea2d3be, 0x8ea2d3e4,
+ /* 8c */ 0x8ea2d3c5, 0x8ea2d3bc, 0x8ea2d3ba, 0x8ea2d3b7,
+ /* 90 */ 0x00000000, 0x0000eed9, 0x8ea2d3ce, 0x0000eed8,
+ /* 94 */ 0x0000eedc, 0x8ea2d3c9, 0x8ea2d3d1, 0x0000eed2,
+ /* 98 */ 0x8ea2d3e1, 0x8ea2d3e5, 0x0000eed4, 0x8eaececb,
+ /* 9c */ 0x8ea2d3c0, 0x8ea2d3d4, 0x8ea2d3d8, 0x8ea2d3bd,
+ /* a0 */ 0x8ea2d3e2, 0x0000eedb, 0x00000000, 0x0000eeda,
+ /* a4 */ 0x8ea2d3b5, 0x0000eede, 0x8ea2d3db, 0x8ea2d3bf,
+ /* a8 */ 0x8ea2d3d3, 0x8ea2d3b9, 0x8ea2d3c7, 0x8ea2d3c2,
+ /* ac */ 0x0000eed6, 0x0000eed7, 0x8ea2d3d5, 0x8ea2d3e6,
+ /* b0 */ 0x8ea2d3e3, 0x8ea2d3da, 0x00000000, 0x8eaececd,
+ /* b4 */ 0x8eaecece, 0x8eaeced2, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2d3b6,
+ /* bc */ 0x00000000, 0x0000eed3, 0x8ea2d9f4, 0x8eaed2da,
+
+ /*** Three byte table, leaf: e895xx - offset 0x03ed6 ***/
+
+ /* 80 */ 0x8ea2d9eb, 0x8ea2d9ee, 0x8eaed2d2, 0x0000f2a5,
+ /* 84 */ 0x8ea2d9f0, 0x8ea2d9e5, 0x8ea2d9ec, 0x8ea2d9f2,
+ /* 88 */ 0x0000f2a2, 0x0000f2a6, 0x0000f1fe, 0x8eaed2d9,
+ /* 8c */ 0x8eaed2d0, 0x8ea2d9e7, 0x8ea2d9f7, 0x00000000,
+ /* 90 */ 0x00000000, 0x8ea2d9f1, 0x00000000, 0x8ea2d9e8,
+ /* 94 */ 0x8ea2daa2, 0x8ea2d9fa, 0x8ea2d9e4, 0x8ea2def2,
+ /* 98 */ 0x8ea2d9ea, 0x0000f2a1, 0x8eaed2d8, 0x8ea2d9f5,
+ /* 9c */ 0x8eaed2d4, 0x8ea2daa1, 0x0000f2a9, 0x8eaed2d6,
+ /* a0 */ 0x8ea2d9fc, 0x8ea2d9e9, 0x8ea2d9ef, 0x8ea2d9f3,
+ /* a4 */ 0x8ea2d9ed, 0x8ea2daa3, 0x8ea2d9fe, 0x8ea2d9fb,
+ /* a8 */ 0x0000f2a3, 0x0000f2a4, 0x0000f2a8, 0x8ea2d9e6,
+ /* ac */ 0x8ea2daa4, 0x0000f2a7, 0x8ea2d9f8, 0x8eaed2cf,
+ /* b0 */ 0x8eaed2d5, 0x8ea2d9f6, 0x00000000, 0x8eaee6bd,
+ /* b4 */ 0x00000000, 0x8ea2d9f9, 0x8ea2dfa1, 0x8ea2deec,
+ /* b8 */ 0x8ea2def1, 0x8ea2defe, 0x8ea2def0, 0x8ea2dee8,
+ /* bc */ 0x8ea2deed, 0x00000000, 0x0000f5ac, 0x8eaed6ab,
+
+ /*** Three byte table, leaf: e896xx - offset 0x03f16 ***/
+
+ /* 80 */ 0x8ea2dee1, 0x8ea2def9, 0x8ea2defb, 0x8ea2dee0,
+ /* 84 */ 0x0000f5ab, 0x8ea2defd, 0x8ea2def5, 0x0000f5b2,
+ /* 88 */ 0x8ea2defc, 0x8ea2deee, 0x0000f5b4, 0x8ea2dee6,
+ /* 8c */ 0x8ea2d9fd, 0x8ea2def6, 0x8ea2def3, 0x8ea2dee2,
+ /* 90 */ 0x8ea2dfa3, 0x0000f5ae, 0x8eaed6a8, 0x8eaed6a9,
+ /* 94 */ 0x0000f5af, 0x8ea2dee4, 0x8ea2def4, 0x8eaed6ad,
+ /* 98 */ 0x8ea2dfa2, 0x8ea2def7, 0x8ea2deea, 0x0000f5b1,
+ /* 9c */ 0x0000f5ad, 0x8ea2def8, 0x8ea2deeb, 0x8ea2dfa4,
+ /* a0 */ 0x8ea2dee5, 0x8ea2deef, 0x8ea2defa, 0x8ea2dee7,
+ /* a4 */ 0x8ea2dee9, 0x00000000, 0x0000f5b5, 0x8ea2dee3,
+ /* a8 */ 0x0000f5b3, 0x0000f7b0, 0x0000f5aa, 0x8eaed6ac,
+ /* ac */ 0x8eaed6b0, 0x00000000, 0x00000000, 0x0000f5b0,
+ /* b0 */ 0x0000f7b4, 0x8ea2e2fd, 0x8eaed8ec, 0x8ea2e2f3,
+ /* b4 */ 0x8ea2e2ee, 0x8ea2e2f4, 0x8ea2e2fe, 0x8ea2e3a4,
+ /* b8 */ 0x8ea2e3a3, 0x0000f7b6, 0x0000f7b5, 0x8eaed8ee,
+ /* bc */ 0x00000000, 0x8ea2e2f5, 0x8ea2e3a5, 0x8ea2e2f8,
+
+ /*** Three byte table, leaf: e897xx - offset 0x03f56 ***/
+
+ /* 80 */ 0x8ea2e2f0, 0x8eaed8ef, 0x8ea2e2f2, 0x8ea2e2f1,
+ /* 84 */ 0x8ea2e2f7, 0x8ea2e2fc, 0x8ea2e2ef, 0x8ea2e2f6,
+ /* 88 */ 0x8ea2e2fb, 0x0000f7b3, 0x00000000, 0x8ea2e2f9,
+ /* 8c */ 0x8eaed8eb, 0x0000f7b1, 0x8ea2e2fa, 0x0000f7af,
+ /* 90 */ 0x0000f7b2, 0x8ea2e6e0, 0x8ea2e3a1, 0x00000000,
+ /* 94 */ 0x8eaee6be, 0x0000f8ed, 0x8eaedafe, 0x8ea2e6d8,
+ /* 98 */ 0x8ea2e6dc, 0x8ea2e6d4, 0x8ea2e6d7, 0x8eaedafd,
+ /* 9c */ 0x8ea2e6df, 0x0000f8eb, 0x8ea2e6e4, 0x8ea2e6dd,
+ /* a0 */ 0x00000000, 0x8ea2e6d5, 0x8ea2e6e5, 0x8ea2e6de,
+ /* a4 */ 0x0000f8ee, 0x0000f8ef, 0x8ea2e6e2, 0x8eaedba2,
+ /* a8 */ 0x8ea2e6d6, 0x0000f8ea, 0x0000f8ec, 0x8ea2e6d1,
+ /* ac */ 0x8ea2e6d9, 0x8ea2e6d3, 0x8eaedcfb, 0x8ea2e6e3,
+ /* b0 */ 0x8ea2e6e1, 0x8ea2e6d2, 0x8ea2e6da, 0x00000000,
+ /* b4 */ 0x8eaedba5, 0x8eaee6bf, 0x8ea2e9ea, 0x0000f8f0,
+ /* b8 */ 0x8ea2e6db, 0x0000fab2, 0x0000fab4, 0x0000fab1,
+ /* bc */ 0x8eaedcf6, 0x8ea2e9ef, 0x8ea2e9e7, 0x8ea2e9e5,
+
+ /*** Three byte table, leaf: e898xx - offset 0x03f96 ***/
+
+ /* 80 */ 0x8ea2e9e9, 0x8ea2e9e6, 0x8eaedcf8, 0x8eaedcfc,
+ /* 84 */ 0x8ea2e9eb, 0x8ea2e9ed, 0x0000fab5, 0x0000fab7,
+ /* 88 */ 0x8eaedda2, 0x8ea2e9ec, 0x0000fab8, 0x0000fab6,
+ /* 8c */ 0x8ea2e9ee, 0x8eaedcfe, 0x00000000, 0x8eaedda3,
+ /* 90 */ 0x8eaedcf7, 0x0000fab3, 0x00000000, 0x8eaedda1,
+ /* 94 */ 0x00000000, 0x8eaededb, 0x8eaededa, 0x0000fba1,
+ /* 98 */ 0x8ea2eca1, 0x8ea2eca7, 0x0000fba3, 0x8ea2e9e8,
+ /* 9c */ 0x8ea2eca6, 0x8eaededc, 0x8ea2ecad, 0x8ea2eca4,
+ /* a0 */ 0x8ea2ecab, 0x8ea2ecaa, 0x8ea2e9e4, 0x8ea2eca5,
+ /* a4 */ 0x8ea2e3a2, 0x8ea2ecae, 0x8ea2eca3, 0x8ea2eca8,
+ /* a8 */ 0x8eaeded8, 0x8ea2ecac, 0x8ea2eca2, 0x8eaeded6,
+ /* ac */ 0x8ea2edf7, 0x0000fba2, 0x8ea2eca9, 0x8eaeded7,
+ /* b0 */ 0x00000000, 0x8ea2efc3, 0x8ea2edf8, 0x8ea2edf6,
+ /* b4 */ 0x8ea2edf4, 0x8ea2edf5, 0x8ea2edf9, 0x8eaee6c0,
+ /* b8 */ 0x0000fcc5, 0x8ea2efc1, 0x8ea2efbf, 0x8ea2efc4,
+ /* bc */ 0x8ea2efc2, 0x8eaee0c3, 0x8ea2efc5, 0x0000fcc6,
+
+ /*** Three byte table, leaf: e899xx - offset 0x03fd6 ***/
+
+ /* 80 */ 0x8ea2efc0, 0x8eaee0af, 0x8eaee1c6, 0x8ea2f0ca,
+ /* 84 */ 0x00000000, 0x8eaee6c1, 0x8ea2f1b4, 0x8ea2f1b5,
+ /* 88 */ 0x8ea2f1b6, 0x8eaee1c7, 0x8eaee1fc, 0x8ea2f2b5,
+ /* 8c */ 0x8ea2f2ad, 0x8ea2a2ef, 0x0000cfcd, 0x00000000,
+ /* 90 */ 0x0000d3cb, 0x00000000, 0x8ea2b2da, 0x8ea2b2d9,
+ /* 94 */ 0x0000d8a5, 0x0000dda8, 0x8ea2b9a1, 0x8eaeb8e3,
+ /* 98 */ 0x8eaeb8e0, 0x8ea2b8fe, 0x8eaeb8e1, 0x0000e1f0,
+ /* 9c */ 0x0000e6bf, 0x8eaebee1, 0x0000e6be, 0x0000e6c0,
+ /* a0 */ 0x00000000, 0x8ea2cddb, 0x8ea2d3e7, 0x8ea2daa5,
+ /* a4 */ 0x8ea2daa7, 0x8ea2daa6, 0x00000000, 0x0000f5b6,
+ /* a8 */ 0x8ea2dfa5, 0x8ea2e3a6, 0x8ea2f1f3, 0x0000c8e5,
+ /* ac */ 0x8eaea7ad, 0x8ea2a8e9, 0x8ea2a8ea, 0x8ea2a8e8,
+ /* b0 */ 0x8ea2a8e7, 0x0000cfce, 0x8eaee6c2, 0x8ea2adca,
+ /* b4 */ 0x8ea2adc8, 0x8eaeafa3, 0x8eaeaefc, 0x8ea2adc7,
+ /* b8 */ 0x8eaeaefe, 0x0000d3cc, 0x0000d3ce, 0x0000d3cd,
+ /* bc */ 0x8ea2adc9, 0x8eaeafa4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x04014 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaeb3e9, 0x8ea2b2e6, 0x8ea2b2e3, 0x8ea2b2e1,
+ /* 88 */ 0x00000000, 0x8eaeb3ec, 0x0000d8a6, 0x8ea2b2e4,
+ /* 8c */ 0x0000d8ab, 0x8ea2b2de, 0x8ea2b2ed, 0x8eaeb3ef,
+ /* 90 */ 0x8ea2b2ef, 0x8ea2b2df, 0x8eaeb3ee, 0x0000d8a8,
+ /* 94 */ 0x8ea2b2f0, 0x8ea2b2eb, 0x8ea2b2dd, 0x8ea2b2e2,
+ /* 98 */ 0x8ea2b2ec, 0x8ea2b2e8, 0x8ea2b2e5, 0x8eaeb3eb,
+ /* 9c */ 0x0000d8ad, 0x8ea2b2ee, 0x8ea2b2e0, 0x8eaeb3ea,
+ /* a0 */ 0x8eaeb3f0, 0x8ea2b2e9, 0x8ea2b2db, 0x0000d8ac,
+ /* a4 */ 0x0000d8a9, 0x8ea2b2e7, 0x8eaeb3ed, 0x8ea2b2ea,
+ /* a8 */ 0x8ea2b2dc, 0x0000d8aa, 0x0000d8a7, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x8eaeb8e6, 0x0000ddb2,
+ /* b0 */ 0x8ea2b9a8, 0x0000ddb1, 0x8eaeb8e4, 0x8ea2b9ab,
+ /* b4 */ 0x8ea2b9ae, 0x0000ddae, 0x0000ddac, 0x8ea2b9a3,
+ /* b8 */ 0x8ea2b9ac, 0x8ea2b9aa, 0x8ea2b9a7, 0x8ea2b9af,
+ /* bc */ 0x8ea2b9b0, 0x8ea2b9b2, 0x8ea2b9b3, 0x8ea2b9a2,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x04054 ***/
+
+ /* 80 */ 0x0000ddab, 0x8ea2b9a5, 0x8ea2b9a4, 0x8ea2b9b1,
+ /* 84 */ 0x0000ddad, 0x8ea2b9a6, 0x0000ddaf, 0x0000ddaa,
+ /* 88 */ 0x8ea2b9a9, 0x0000ddb3, 0x00000000, 0x0000ddb0,
+ /* 8c */ 0x8ea2b9ad, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x0000e1f7, 0x8ea2c0a5, 0x00000000, 0x8ea2bff8,
+ /* 94 */ 0x0000e1f4, 0x8eaebee2, 0x8ea2c7ae, 0x8ea2c0a3,
+ /* 98 */ 0x8ea2bff5, 0x0000e1f2, 0x8ea2bffa, 0x0000e1f5,
+ /* 9c */ 0x8ea2bffe, 0x8ea2bffc, 0x0000e1f8, 0x0000e1f1,
+ /* a0 */ 0x00000000, 0x8eaebee3, 0x8ea2bff6, 0x8ea2bff9,
+ /* a4 */ 0x0000e1f6, 0x00000000, 0x8ea2bff7, 0x00000000,
+ /* a8 */ 0x8ea2c0a4, 0x8ea2c0a2, 0x8ea2bffb, 0x8ea2bffd,
+ /* ac */ 0x8ea2c0a1, 0x0000e1f3, 0x8eaebee8, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x8ea2c7af, 0x8ea2c7b5, 0x8ea2c7ab,
+ /* b8 */ 0x8ea2c7b1, 0x0000e6c1, 0x8ea2c7ad, 0x0000e6c7,
+ /* bc */ 0x8eaec4c4, 0x8eaec4c5, 0x0000e6c6, 0x8eaec4c9,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x04094 ***/
+
+ /* 80 */ 0x0000e6c5, 0x8ea2c7b4, 0x0000e6c8, 0x0000e6c9,
+ /* 84 */ 0x8ea2c7aa, 0x8ea2c7b7, 0x0000e6ca, 0x0000e6c4,
+ /* 88 */ 0x0000e6c3, 0x8ea2c7b3, 0x0000e6cb, 0x8ea2c7a9,
+ /* 8c */ 0x8ea2c7ac, 0x8ea2c7b6, 0x8ea2c7b2, 0x00000000,
+ /* 90 */ 0x00000000, 0x8ea2cdfb, 0x8ea2cdf0, 0x0000e6c2,
+ /* 94 */ 0x00000000, 0x8eaec4c6, 0x8eaec4c8, 0x00000000,
+ /* 98 */ 0x0000eaf2, 0x8ea2cde4, 0x8ea2cdf9, 0x8ea2cde5,
+ /* 9c */ 0x0000eaed, 0x8eaec9cf, 0x8ea2cde2, 0x00000000,
+ /* a0 */ 0x8ea2cdeb, 0x8ea2cde3, 0x0000eaef, 0x8ea2cddd,
+ /* a4 */ 0x8ea2cdf8, 0x0000eaf0, 0x8ea2cdf5, 0x8ea2cdf6,
+ /* a8 */ 0x8ea2cdde, 0x0000eaf5, 0x8ea2cded, 0x8eaec9ca,
+ /* ac */ 0x8ea2cde7, 0x8ea2cdee, 0x8ea2cde1, 0x00000000,
+ /* b0 */ 0x8ea2cdfa, 0x8ea2cdf2, 0x8ea2cdec, 0x8ea2cddc,
+ /* b4 */ 0x0000eaf1, 0x8ea2cdf3, 0x8eaec9c5, 0x0000eaf4,
+ /* b8 */ 0x8ea2cdf7, 0x8eaec9cc, 0x8ea2cdf1, 0x0000eaee,
+ /* bc */ 0x8ea2cdef, 0x8eaec9c9, 0x8ea2cde9, 0x0000eaec,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x040d4 ***/
+
+ /* 80 */ 0x8ea2cde0, 0x8ea2cde8, 0x8ea2cdf4, 0x8ea2cde6,
+ /* 84 */ 0x00000000, 0x8eaec9ce, 0x8ea2cdea, 0x8eaec9cb,
+ /* 88 */ 0x00000000, 0x00000000, 0x8eaee6c3, 0x00000000,
+ /* 8c */ 0x0000eeea, 0x8ea2c7b0, 0x8ea2d3f9, 0x8ea2d4a4,
+ /* 90 */ 0x8ea2d3f8, 0x8ea2d3f4, 0x8ea2d3f1, 0x0000eeeb,
+ /* 94 */ 0x8ea2d3ef, 0x0000eaf3, 0x8ea2d3e8, 0x0000eee9,
+ /* 98 */ 0x8ea2d3ee, 0x0000eee8, 0x8ea2d3f3, 0x8ea2d3f0,
+ /* 9c */ 0x8ea2d4a2, 0x8ea2d3fb, 0x8ea2d3f5, 0x8ea2d3fa,
+ /* a0 */ 0x0000eee4, 0x8ea2d3f2, 0x8ea2d4a7, 0x8ea2d3e9,
+ /* a4 */ 0x8ea2d3ea, 0x8ea2d4a3, 0x0000eee5, 0x8ea2d4a8,
+ /* a8 */ 0x0000eee7, 0x8ea2d4a9, 0x8ea2d3f7, 0x8ea2cddf,
+ /* ac */ 0x8ea2d3fd, 0x8ea2d3f6, 0x8ea2d4a1, 0x8ea2d3fc,
+ /* b0 */ 0x00000000, 0x8eaecedd, 0x00000000, 0x8ea2d3ed,
+ /* b4 */ 0x0000eee2, 0x8ea2d4a6, 0x0000eee3, 0x8ea2d3eb,
+ /* b8 */ 0x0000eee6, 0x8ea2dab2, 0x8ea2d3fe, 0x8ea2d4a5,
+ /* bc */ 0x00000000, 0x8eaeced9, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x04113 ***/
+
+ /* 80 */ 0x00000000, 0x8ea2daaf, 0x0000eee1, 0x0000f2aa,
+ /* 84 */ 0x8ea2dab9, 0x8ea2dab5, 0x00000000, 0x8ea2dab3,
+ /* 88 */ 0x8ea2daae, 0x8ea2dabd, 0x8eaed2db, 0x8eaed2dd,
+ /* 8c */ 0x00000000, 0x0000f2ae, 0x8eaed2df, 0x8ea2daaa,
+ /* 90 */ 0x8ea2dab6, 0x8ea2dab7, 0x8ea2daad, 0x8ea2daac,
+ /* 94 */ 0x8ea2daba, 0x00000000, 0x8ea2dab0, 0x8ea2daab,
+ /* 98 */ 0x8ea2dab1, 0x8eaed2e2, 0x8ea2dabc, 0x8ea2daa9,
+ /* 9c */ 0x8ea2dabb, 0x8ea2dab8, 0x0000f2ac, 0x0000f2ab,
+ /* a0 */ 0x00000000, 0x8eaed2de, 0x0000f2ad, 0x8ea2dab4,
+ /* a4 */ 0x8ea2daa8, 0x8eaee6c5, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x8eaee6c4, 0x8ea2dfa7, 0x0000f5bc,
+ /* ac */ 0x8ea2dfab, 0x8ea2dfa8, 0x8ea2dfaf, 0x8ea2dfb5,
+ /* b0 */ 0x8ea2dfaa, 0x8eaed6ba, 0x8ea2dfbe, 0x0000f5b9,
+ /* b4 */ 0x8ea2dfb8, 0x8ea2dfad, 0x8ea2dfb9, 0x8ea2dfb4,
+ /* b8 */ 0x8ea2dfbb, 0x8ea2dfac, 0x0000f5be, 0x0000f5bd,
+ /* bc */ 0x8ea2dfae, 0x8ea2dfbc, 0x8ea2dfa6, 0x8ea2dfba,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x04153 ***/
+
+ /* 80 */ 0x0000f5b7, 0x8eaed6b9, 0x8ea2dfb2, 0x8ea2dfb1,
+ /* 84 */ 0x8ea2dfb6, 0x8ea2dfa9, 0x0000f5bb, 0x8eaed6bb,
+ /* 88 */ 0x0000f5bf, 0x8ea2dfb0, 0x8ea2dfb7, 0x0000f5c0,
+ /* 8c */ 0x8ea2dfb3, 0x8eaed6b6, 0x8eaed6b4, 0x00000000,
+ /* 90 */ 0x00000000, 0x0000f5b8, 0x0000f5ba, 0x8ea2e3b3,
+ /* 94 */ 0x8ea2e3b1, 0x8eaedba8, 0x8eaed8f6, 0x8ea2e3b7,
+ /* 98 */ 0x8ea2e3b5, 0x8ea2e3b8, 0x8eaed8f8, 0x8ea2e3aa,
+ /* 9c */ 0x8ea2e3b2, 0x8ea2e3bc, 0x8ea2dfbd, 0x8ea2e3ae,
+ /* a0 */ 0x0000f7ba, 0x8ea2d3ec, 0x8ea2e3a9, 0x8ea2e3b6,
+ /* a4 */ 0x8ea2e3b0, 0x8ea2e3ad, 0x8ea2e3a8, 0x8ea2e3a7,
+ /* a8 */ 0x8ea2e3bb, 0x8eaed8f3, 0x8ea2e3ac, 0x8ea2e3ab,
+ /* ac */ 0x0000f7b8, 0x8ea2e3b4, 0x8eaed8f4, 0x0000f7b7,
+ /* b0 */ 0x8eaed8f5, 0x00000000, 0x0000f7b9, 0x8ea2e3af,
+ /* b4 */ 0x8ea2e3ba, 0x8eaee6c6, 0x8ea2e6e9, 0x8ea2e6ea,
+ /* b8 */ 0x8eaedbac, 0x0000f8f4, 0x8ea2e6e7, 0x0000f8f1,
+ /* bc */ 0x8ea2e6ef, 0x8eaedba7, 0x0000f8f5, 0x8ea2e6f1,
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x04193 ***/
+
+ /* 80 */ 0x8ea2e6e6, 0x8ea2e3b9, 0x8ea2e6f3, 0x8ea2e6e8,
+ /* 84 */ 0x00000000, 0x0000f8f2, 0x8ea2e6ee, 0x8eaedba9,
+ /* 88 */ 0x8ea2e6f0, 0x8ea2e6eb, 0x8ea2e6f2, 0x8ea2e6ed,
+ /* 8c */ 0x8ea2e6ec, 0x0000f8f3, 0x8eaed8f7, 0x8eaedbab,
+ /* 90 */ 0x8ea2e9f1, 0x8ea2e9f2, 0x8eaedda5, 0x8ea2e9f4,
+ /* 94 */ 0x0000fab9, 0x0000faba, 0x8ea2e9f5, 0x8ea2e9f3,
+ /* 98 */ 0x8eaedda4, 0x8ea2e9f0, 0x8eaededd, 0x8ea2ecb1,
+ /* 9c */ 0x8ea2ecb4, 0x8ea2ecb0, 0x00000000, 0x0000fba7,
+ /* a0 */ 0x8ea2ecb2, 0x0000fba6, 0x0000fba5, 0x0000fba4,
+ /* a4 */ 0x8ea2ecb3, 0x8ea2edfe, 0x8ea2edfc, 0x8eaedfdf,
+ /* a8 */ 0x8ea2edfb, 0x8ea2ecaf, 0x8ea2edfd, 0x8ea2ecb5,
+ /* ac */ 0x8ea2edfa, 0x8eaee0c5, 0x8ea2efc8, 0x8ea2efa6,
+ /* b0 */ 0x8ea2efc6, 0x0000fcc7, 0x8ea2efc7, 0x8ea2efc9,
+ /* b4 */ 0x8eaee6c7, 0x8ea2f0cd, 0x0000fce6, 0x8ea2f0cc,
+ /* b8 */ 0x8ea2f0cb, 0x0000fce7, 0x00000000, 0x0000fda7,
+ /* bc */ 0x8ea2f1dd, 0x8ea2f1f5, 0x8ea2f1f4, 0x8ea2f1f6,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x041d3 ***/
+
+ /* 80 */ 0x0000c8e6, 0x8ea2adcb, 0x8eaeafa6, 0x8ea2b2f1,
+ /* 84 */ 0x8ea2b2f2, 0x8eaeb8ea, 0x8eaebeea, 0x8eaebee9,
+ /* 88 */ 0x8ea2c0a6, 0x00000000, 0x8ea2ecb6, 0x8ea2f0ce,
+ /* 8c */ 0x0000c8e7, 0x0000d3cf, 0x8ea2adcc, 0x8eaeb3f1,
+ /* 90 */ 0x8eaee6c8, 0x00000000, 0x8ea2b9b4, 0x0000ddb4,
+ /* 94 */ 0x00000000, 0x8ea2c0a8, 0x8ea2c0a7, 0x0000e1f9,
+ /* 98 */ 0x8eaec4cd, 0x0000e6cc, 0x8ea2d4aa, 0x0000eeec,
+ /* 9c */ 0x8eaecedf, 0x0000eeed, 0x8eaed2e3, 0x8eaed2e4,
+ /* a0 */ 0x00000000, 0x0000f2af, 0x0000fce8, 0x0000c8e8,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaeafa7, 0x8ea2adcd,
+ /* a8 */ 0x0000cfd0, 0x8ea2adcf, 0x8ea2adce, 0x0000d3d0,
+ /* ac */ 0x00000000, 0x8ea2b2f3, 0x8eaeb3f4, 0x8ea2b2fa,
+ /* b0 */ 0x0000d8ae, 0x8ea2b2f8, 0x8ea2b2f6, 0x8eaeb3f7,
+ /* b4 */ 0x8ea2b2fd, 0x8ea2b2f4, 0x8ea2b2f5, 0x0000d8af,
+ /* b8 */ 0x8eaeb3f2, 0x0000d8b3, 0x8eaeb3f3, 0x8eaeb3f5,
+ /* bc */ 0x8ea2b2fe, 0x0000d8b2, 0x8ea2b2fc, 0x8ea2b2f9,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x04213 ***/
+
+ /* 80 */ 0x8ea2b2f7, 0x0000d8b0, 0x0000d8b1, 0x8ea2b2fb,
+ /* 84 */ 0x8eaeb3f6, 0x00000000, 0x00000000, 0x8eaee6c9,
+ /* 88 */ 0x0000ddb6, 0x8ea2b9b5, 0x8eaeb8f2, 0x0000ddbb,
+ /* 8c */ 0x8ea2b9c5, 0x0000ddba, 0x8ea2b9c7, 0x8eaeb8ee,
+ /* 90 */ 0x8eaeb8f4, 0x8ea2b9bb, 0x0000ddb8, 0x8ea2b9c6,
+ /* 94 */ 0x8eaeb8ec, 0x8ea2b9b6, 0x0000ddb9, 0x8ea2b9c2,
+ /* 98 */ 0x8ea2b9be, 0x8ea2b9c0, 0x8ea2b9ba, 0x8ea2b9c1,
+ /* 9c */ 0x8eaeb8eb, 0x00000000, 0x0000ddb5, 0x8ea2b9bd,
+ /* a0 */ 0x8eaeb8f3, 0x8ea2b9bc, 0x8ea2b9b8, 0x8eaeb8ed,
+ /* a4 */ 0x8ea2b9c3, 0x8eaeb8ef, 0x8eaeb8f1, 0x8ea2b9bf,
+ /* a8 */ 0x8ea2b9b7, 0x8eaeb8f0, 0x8ea2b9b9, 0x0000ddb7,
+ /* ac */ 0x8ea2b9c4, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x0000e1fc, 0x8ea2c0b3, 0x00000000,
+ /* b4 */ 0x8eaebef0, 0x8eaebef2, 0x8ea2c0af, 0x8ea2c0b1,
+ /* b8 */ 0x8ea2c0ac, 0x8ea2c0ab, 0x8ea2c0a9, 0x8eaebeed,
+ /* bc */ 0x8ea2c0b0, 0x8ea2c0b2, 0x8ea2c0ae, 0x8eaebeef,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x04253 ***/
+
+ /* 80 */ 0x8ea2c0ad, 0x0000e1fa, 0x0000e1fb, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x8ea2c0b5, 0x0000e6d4, 0x8ea2c7b9,
+ /* 8c */ 0x8ea2c7bf, 0x8ea2c7ba, 0x8ea2c7bb, 0x8eaec4ce,
+ /* 90 */ 0x8ea2c7c0, 0x00000000, 0x0000e6d6, 0x00000000,
+ /* 94 */ 0x0000e6ce, 0x0000e6d5, 0x8ea2c7b8, 0x8ea2c0aa,
+ /* 98 */ 0x0000e6d1, 0x0000e6cf, 0x8ea2c7be, 0x8ea2c7bd,
+ /* 9c */ 0x0000e6d0, 0x0000e6d2, 0x8ea2c7bc, 0x0000e6cd,
+ /* a0 */ 0x8eaec4cf, 0x0000e6d3, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaecee0, 0x8ea2cdfd,
+ /* a8 */ 0x0000eafc, 0x8eaec9d9, 0x8eaec9d2, 0x8ea2ceaa,
+ /* ac */ 0x8ea2cea9, 0x8eaec9d7, 0x8ea2cea4, 0x0000eafe,
+ /* b0 */ 0x8ea2cea8, 0x8ea2cdfe, 0x8ea2cea1, 0x0000eaf6,
+ /* b4 */ 0x0000eaf8, 0x8eaec9d4, 0x8ea2cea6, 0x8ea2cdfc,
+ /* b8 */ 0x0000eafa, 0x0000eaf9, 0x8ea2cea2, 0x8ea2cea7,
+ /* bc */ 0x8ea2cea5, 0x0000eafb, 0x8ea2cea3, 0x8eaec9d1,
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x04293 ***/
+
+ /* 80 */ 0x8eaec9d6, 0x8ea2c0b4, 0x0000eaf7, 0x8eaec9d8,
+ /* 84 */ 0x00000000, 0x8ea2d4ab, 0x8ea2d4b2, 0x0000eeef,
+ /* 88 */ 0x00000000, 0x8ea2d4b6, 0x0000eef3, 0x8ea2d4ae,
+ /* 8c */ 0x8ea2d4ac, 0x00000000, 0x8ea2d4b5, 0x8eaecee1,
+ /* 90 */ 0x0000eeee, 0x8ea2d4b4, 0x0000eef0, 0x0000eef1,
+ /* 94 */ 0x8ea2d4ad, 0x0000eef2, 0x8ea2d4b3, 0x8ea2d4af,
+ /* 98 */ 0x8ea2d4b0, 0x8ea2d4b1, 0x0000eafd, 0x8eaecee2,
+ /* 9c */ 0x00000000, 0x00000000, 0x8ea2dabe, 0x8ea2daca,
+ /* a0 */ 0x00000000, 0x0000f2b4, 0x8ea2dac5, 0x8ea2dac7,
+ /* a4 */ 0x8eaed2e5, 0x0000f2b2, 0x8ea2dabf, 0x8ea2dac3,
+ /* a8 */ 0x00000000, 0x8ea2dac6, 0x0000f2b0, 0x0000f2b3,
+ /* ac */ 0x8ea2dac9, 0x8ea2dac1, 0x8ea2dac2, 0x8ea2dac8,
+ /* b0 */ 0x8ea2dac0, 0x8ea2dac4, 0x0000f2b1, 0x8ea2dfc0,
+ /* b4 */ 0x00000000, 0x8ea2dfbf, 0x0000f5c2, 0x8ea2dfc5,
+ /* b8 */ 0x0000f5c4, 0x8eaed6c0, 0x00000000, 0x0000f5c1,
+ /* bc */ 0x8ea2dfc1, 0x0000f5c5, 0x8ea2dfc2, 0x8eaed6bf,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x042d3 ***/
+
+ /* 80 */ 0x8eaed6bd, 0x8ea2dfc3, 0x8ea2dfc6, 0x8eaed6c2,
+ /* 84 */ 0x0000f5c3, 0x00000000, 0x8ea2e3c1, 0x00000000,
+ /* 88 */ 0x8eaed8f9, 0x8ea2e3c4, 0x8eaed8fa, 0x8ea2e3be,
+ /* 8c */ 0x8ea2e3c0, 0x8eaed8fc, 0x8eaed8fb, 0x8ea2e3bf,
+ /* 90 */ 0x8ea2e3c2, 0x8ea2e3c3, 0x8ea2dfc4, 0x8ea2e3bd,
+ /* 94 */ 0x8eaee6ca, 0x00000000, 0x0000f8f8, 0x8ea2e6f7,
+ /* 98 */ 0x8ea2e6fa, 0x8ea2e6fc, 0x8ea2e6f5, 0x8ea2e6f6,
+ /* 9c */ 0x8ea2e6f9, 0x8ea2e6fb, 0x0000f8f9, 0x0000f8f7,
+ /* a0 */ 0x0000f8f6, 0x8ea2e6f8, 0x8ea2e6f4, 0x8ea2e9f6,
+ /* a4 */ 0x0000fabb, 0x8eaedda9, 0x8ea2e9f7, 0x8eaedda8,
+ /* a8 */ 0x00000000, 0x8ea2ecb8, 0x0000fba8, 0x8ea2ecba,
+ /* ac */ 0x0000fba9, 0x8ea2ecb7, 0x8ea2ecb9, 0x0000fbf2,
+ /* b0 */ 0x00000000, 0x8ea2eea1, 0x0000fbf1, 0x8ea2efcc,
+ /* b4 */ 0x8ea2efcb, 0x00000000, 0x8ea2efca, 0x00000000,
+ /* b8 */ 0x8eaee1c9, 0x8ea2f1b7, 0x8ea2f1b8, 0x8ea2f1ba,
+ /* bc */ 0x8ea2f1b9, 0x8eaee1fd, 0x8ea2a2f0, 0x0000c8e9,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x04313 ***/
+
+ /* 80 */ 0x00000000, 0x0000d3d1, 0x8ea2b9c8, 0x0000e1fd,
+ /* 84 */ 0x8eaee6cb, 0x8ea2c7c1, 0x0000f7bb, 0x8eaedbaf,
+ /* 88 */ 0x8ea2e6fd, 0x8eaee0c6, 0x8eaee1ca, 0x0000cbc4,
+ /* 8c */ 0x8eaeafa9, 0x00000000, 0x00000000, 0x0000ddbd,
+ /* 90 */ 0x00000000, 0x8eaeb8f6, 0x8eaeb8f5, 0x0000ddbc,
+ /* 94 */ 0x8eaeb8f7, 0x8ea2c0b6, 0x0000e1fe, 0x8ea2c0b8,
+ /* 98 */ 0x8ea2c0b7, 0x00000000, 0x8eaebef4, 0x8ea2c7c2,
+ /* 9c */ 0x0000e6d7, 0x8ea2ceab, 0x8ea2ceae, 0x8ea2cead,
+ /* a0 */ 0x00000000, 0x8ea2ceac, 0x8ea2d4b7, 0x8ea2d4b9,
+ /* a4 */ 0x8ea2d4b8, 0x8eaecee5, 0x0000f2b6, 0x8eaed2e6,
+ /* a8 */ 0x00000000, 0x8eaecee4, 0x0000f2b5, 0x8eaed6c6,
+ /* ac */ 0x0000f5c6, 0x8ea2dfc7, 0x8ea2dfc9, 0x8ea2dfc8,
+ /* b0 */ 0x8eaed8fe, 0x8eaed8fd, 0x0000f7bc, 0x8eaed9a1,
+ /* b4 */ 0x00000000, 0x8eaedbb1, 0x8ea2e7a1, 0x8ea2e6fe,
+ /* b8 */ 0x00000000, 0x8ea2e9f8, 0x0000fabc, 0x8eaeddaa,
+ /* bc */ 0x8eaedee1, 0x0000fbaa, 0x8ea2eea3, 0x8ea2eea2,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x04353 ***/
+
+ /* 80 */ 0x0000fda8, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x0000cbc5, 0x8ea2add0,
+ /* 94 */ 0x0000d3d2, 0x8ea2b9cb, 0x8ea2b9c9, 0x00000000,
+ /* 98 */ 0x00000000, 0x8ea2b9ca, 0x8ea2c0ba, 0x8ea2c0bb,
+ /* 9c */ 0x8ea2c7c9, 0x8ea2c0b9, 0x00000000, 0x8ea2c7c3,
+ /* a0 */ 0x8ea2c7c7, 0x8ea2c7c6, 0x8ea2c7c8, 0x0000e6d8,
+ /* a4 */ 0x8ea2c7c5, 0x8ea2c7c4, 0x8ea2c7ca, 0x8eaec4d4,
+ /* a8 */ 0x8ea2ceb1, 0x8ea2ceaf, 0x8eaec9dc, 0x8ea2ceb0,
+ /* ac */ 0x8ea2d4bc, 0x8ea2d4ba, 0x8eaecee6, 0x00000000,
+ /* b0 */ 0x8ea2d4bb, 0x8ea2dacb, 0x8ea2dfca, 0x8ea2dfcb,
+ /* b4 */ 0x0000f7bd, 0x8eaedbb2, 0x8ea2e7a2, 0x8ea2e9f9,
+ /* b8 */ 0x0000fabd, 0x00000000, 0x8ea2ecbb, 0x8ea2eea4,
+ /* bc */ 0x0000fbf3, 0x00000000, 0x8ea2efcd, 0x8ea2f1bb,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x04393 ***/
+
+ /* 80 */ 0x0000cbc6, 0x00000000, 0x0000d3d4, 0x0000d3d5,
+ /* 84 */ 0x8ea2add1, 0x8eaeafaa, 0x8eaeafac, 0x8ea2add2,
+ /* 88 */ 0x0000d3d3, 0x00000000, 0x0000d8b9, 0x8eaeb3fb,
+ /* 8c */ 0x0000d8b7, 0x8eaeb3fa, 0x0000d8b6, 0x0000d8bd,
+ /* 90 */ 0x0000d8b5, 0x0000d8be, 0x8ea2b3a1, 0x0000d8bb,
+ /* 94 */ 0x00000000, 0x0000d8b8, 0x0000d8bc, 0x0000d8ba,
+ /* 98 */ 0x0000d8b4, 0x8eaeb3fc, 0x00000000, 0x0000ddc5,
+ /* 9c */ 0x8eaeb8fe, 0x0000ddbf, 0x8ea2b9cf, 0x0000ddc4,
+ /* a0 */ 0x8eaeb9a3, 0x8eaeb9a9, 0x0000ddc6, 0x0000ddc0,
+ /* a4 */ 0x00000000, 0x0000ddc1, 0x8eaeb8f9, 0x8ea2b9cd,
+ /* a8 */ 0x8eaeb8fb, 0x8eaeb9a5, 0x0000ddbe, 0x8eaeb9a2,
+ /* ac */ 0x8ea2b9ce, 0x0000ddc3, 0x8eaee3b0, 0x00000000,
+ /* b0 */ 0x8ea2b9cc, 0x0000ddc2, 0x8eaeb8fa, 0x00000000,
+ /* b4 */ 0x0000e2ab, 0x8eaebefc, 0x0000e2ad, 0x00000000,
+ /* b8 */ 0x8eaebefd, 0x8ea2c0be, 0x0000e2ac, 0x0000e2a1,
+ /* bc */ 0x0000e2a5, 0x8eaebfa4, 0x0000e6eb, 0x8ea2c7cf,
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x043d3 ***/
+
+ /* 80 */ 0x8ea2c0c0, 0x0000e2a6, 0x8eaebefe, 0x8eaebef5,
+ /* 84 */ 0x8ea2c0c3, 0x8ea2c0c4, 0x0000e2aa, 0x00000000,
+ /* 88 */ 0x8ea2c0c6, 0x8eaebfa1, 0x8ea2c0c8, 0x8eaebfa3,
+ /* 8c */ 0x8ea2c0c9, 0x8ea2c0bd, 0x8ea2c0bc, 0x8ea2c0ca,
+ /* 90 */ 0x0000e2a9, 0x8ea2c0c7, 0x8ea2c0c5, 0x00000000,
+ /* 94 */ 0x0000e2a7, 0x0000e2a3, 0x0000e2ae, 0x8ea2c0c1,
+ /* 98 */ 0x8ea2c0c2, 0x8ea2c0bf, 0x8eaebef8, 0x0000e2a8,
+ /* 9c */ 0x00000000, 0x8eaebfa2, 0x0000e2a4, 0x00000000,
+ /* a0 */ 0x0000e2a2, 0x8ea2c7ce, 0x0000e6e6, 0x0000e6e1,
+ /* a4 */ 0x8eaec4e0, 0x8eaec4d9, 0x0000e6dc, 0x8eaec4e3,
+ /* a8 */ 0x0000e6ec, 0x0000e6dd, 0x8eaec4d5, 0x0000e6d9,
+ /* ac */ 0x0000e6e8, 0x0000e6e5, 0x0000e6e7, 0x8eaec4d8,
+ /* b0 */ 0x0000e6de, 0x0000e6e3, 0x0000e6da, 0x0000e6db,
+ /* b4 */ 0x8ea2c7d6, 0x8ea2c7d3, 0x8ea2c7cb, 0x8ea2c7d0,
+ /* b8 */ 0x8eaec4db, 0x0000e6e9, 0x8ea2c7d7, 0x0000e6ea,
+ /* bc */ 0x0000e6e0, 0x8eaec4dc, 0x8eaec4e1, 0x8ea2c7cd,
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04413 ***/
+
+ /* 80 */ 0x8eaec4d6, 0x8ea2c7d5, 0x8ea2c7d1, 0x8ea2c7d4,
+ /* 84 */ 0x8ea2c7d2, 0x0000e6e4, 0x8ea2c7cc, 0x0000e6df,
+ /* 88 */ 0x8eaec4dd, 0x00000000, 0x00000000, 0x8ea2ceb4,
+ /* 8c */ 0x0000eba2, 0x0000eba5, 0x8eaec9df, 0x8ea2ceb6,
+ /* 90 */ 0x8eaec9e4, 0x0000ebad, 0x8ea2ceb5, 0x0000eba7,
+ /* 94 */ 0x8eaec9e3, 0x0000eef8, 0x8ea2ceb7, 0x00000000,
+ /* 98 */ 0x0000ebac, 0x8ea2ceb3, 0x0000ebae, 0x8eaec9de,
+ /* 9c */ 0x8eaec9e2, 0x8eaec9eb, 0x0000eba3, 0x8eaec9e8,
+ /* a0 */ 0x0000e6e2, 0x0000eba6, 0x8eaec9e0, 0x0000eba4,
+ /* a4 */ 0x0000eba8, 0x0000ebaa, 0x0000eba1, 0x0000ebaf,
+ /* a8 */ 0x0000ebab, 0x8eaec9e5, 0x0000eba9, 0x8ea2ceb2,
+ /* ac */ 0x8eaec9e6, 0x00000000, 0x00000000, 0x8eaecef4,
+ /* b0 */ 0x0000efa1, 0x8eaecee7, 0x0000eefb, 0x8eaecef2,
+ /* b4 */ 0x8eaecef0, 0x8eaeceee, 0x0000efa4, 0x8eaeceec,
+ /* b8 */ 0x8ea2d4bf, 0x0000efa5, 0x8ea2d4cb, 0x8ea2d4c4,
+ /* bc */ 0x0000eef4, 0x8ea2d4cc, 0x8ea2d4c6, 0x0000eefe,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04453 ***/
+
+ /* 80 */ 0x8ea2d4c7, 0x8eaecef3, 0x0000eefd, 0x8ea2d4ca,
+ /* 84 */ 0x0000eef7, 0x8ea2d4c8, 0x8ea2d4be, 0x0000eef6,
+ /* 88 */ 0x8ea2dad6, 0x0000eefc, 0x8eaecef5, 0x0000eef9,
+ /* 8c */ 0x8eaecee9, 0x0000efa3, 0x8eaeceea, 0x8ea2d4bd,
+ /* 90 */ 0x8eaecef6, 0x8ea2d4c1, 0x0000eef5, 0x8ea2d4c0,
+ /* 94 */ 0x8ea2d4c2, 0x8ea2d4c3, 0x0000efa2, 0x8ea2d4c5,
+ /* 98 */ 0x8ea2d4c9, 0x8ea2d4cd, 0x00000000, 0x0000efa6,
+ /* 9c */ 0x0000f2bc, 0x8ea2dad1, 0x8ea2dad7, 0x8ea2dad4,
+ /* a0 */ 0x8ea2dacc, 0x8ea2dad8, 0x8ea2dacd, 0x8eaed2ea,
+ /* a4 */ 0x8ea2dad3, 0x8eaed2eb, 0x0000f2b7, 0x0000f2bd,
+ /* a8 */ 0x8ea2dad9, 0x8eaeceef, 0x8eaed2e7, 0x0000f2b9,
+ /* ac */ 0x8eaed2ee, 0x0000f2c3, 0x0000f2be, 0x8ea2dadb,
+ /* b0 */ 0x8ea2dad5, 0x0000f2ba, 0x8ea2dace, 0x0000f2c4,
+ /* b4 */ 0x8ea2dacf, 0x8ea2dad0, 0x0000f2c5, 0x0000f2c2,
+ /* b8 */ 0x0000eefa, 0x8eaed2e9, 0x0000f2b8, 0x8ea2dadc,
+ /* bc */ 0x0000f2c6, 0x8eaed2e8, 0x0000f2bf, 0x8ea2dada,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x04493 ***/
+
+ /* 80 */ 0x0000f2bb, 0x0000f2c0, 0x0000f2c1, 0x8eaee6cc,
+ /* 84 */ 0x0000f5ce, 0x8ea2dfd0, 0x8ea2dfd9, 0x8ea2dfd6,
+ /* 88 */ 0x8ea2dfd8, 0x8eaed6c9, 0x0000f5cb, 0x8ea2dfd1,
+ /* 8c */ 0x8eaed6ca, 0x8ea2dfd7, 0x0000f5c7, 0x8ea2dfd3,
+ /* 90 */ 0x0000f5cf, 0x8ea2dfcf, 0x8ea2dfd4, 0x8ea2dfdb,
+ /* 94 */ 0x8ea2dad2, 0x8ea2dfd5, 0x8ea2dfce, 0x0000f5c8,
+ /* 98 */ 0x8ea2dfcd, 0x0000f5c9, 0x8ea2dfdc, 0x0000f5ca,
+ /* 9c */ 0x8ea2dfda, 0x0000f5cd, 0x8ea2dfcc, 0x8eaed6c8,
+ /* a0 */ 0x0000f5cc, 0x00000000, 0x8ea2dfd2, 0x8ea2e3c7,
+ /* a4 */ 0x8ea2e3d5, 0x8ea2e3d0, 0x8ea2e3d2, 0x8ea2e3c6,
+ /* a8 */ 0x0000f7be, 0x8eaed9aa, 0x8ea2e3c5, 0x0000f7c1,
+ /* ac */ 0x0000f7c0, 0x8eaed9a6, 0x8ea2e3d4, 0x8ea2e3cc,
+ /* b0 */ 0x8ea2e3c9, 0x8ea2e3cf, 0x8eaed9a4, 0x8ea2e3c8,
+ /* b4 */ 0x8eaed9a8, 0x8ea2e3ca, 0x8ea2e3d3, 0x8ea2e3d1,
+ /* b8 */ 0x8eaed9a3, 0x0000f7bf, 0x8ea2e3d8, 0x8ea2e3d6,
+ /* bc */ 0x8ea2e3cd, 0x8ea2e3d7, 0x8ea2e3ce, 0x8eaedbb4,
+
+ /*** Three byte table, leaf: e8adxx - offset 0x044d3 ***/
+
+ /* 80 */ 0x8ea2e7a6, 0x0000f8fa, 0x8ea2e7ad, 0x8eaedbb5,
+ /* 84 */ 0x00000000, 0x8ea2ecbe, 0x0000f9a3, 0x8ea2e3cb,
+ /* 88 */ 0x8ea2e7a4, 0x0000f8fd, 0x8ea2e7a5, 0x8ea2e7aa,
+ /* 8c */ 0x8eaedbb6, 0x8eaeddb3, 0x0000f9a1, 0x0000f9a2,
+ /* 90 */ 0x8ea2e7a3, 0x8ea2e7ac, 0x8ea2e7ae, 0x8ea2e7a7,
+ /* 94 */ 0x8ea2e7a9, 0x8ea2e7ab, 0x8ea2e7a8, 0x8ea2e7af,
+ /* 98 */ 0x0000f8fc, 0x0000f9a4, 0x0000f8fe, 0x00000000,
+ /* 9c */ 0x0000f8fb, 0x8ea2e9fc, 0x00000000, 0x0000fac2,
+ /* a0 */ 0x8ea2e9fa, 0x8eaeddb0, 0x8eaeddac, 0x8ea2e9fe,
+ /* a4 */ 0x8eaeddb2, 0x8ea2eaa1, 0x0000fac0, 0x8ea2eaa2,
+ /* a8 */ 0x8ea2e9fd, 0x8eaeddab, 0x8ea2e9fb, 0x0000fac3,
+ /* ac */ 0x0000fabf, 0x8ea2eaa3, 0x8eaeddae, 0x0000fac1,
+ /* b0 */ 0x0000fabe, 0x8eaedced, 0x00000000, 0x8eaee4ad,
+ /* b4 */ 0x0000fbab, 0x8eaedee2, 0x00000000, 0x0000fbac,
+ /* b8 */ 0x8ea2ecbd, 0x8ea2ecbc, 0x8ea2ecbf, 0x8ea2ecc0,
+ /* bc */ 0x8eaedee3, 0x0000fbad, 0x8ea2eea5, 0x8ea2eeaa,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04513 ***/
+
+ /* 80 */ 0x0000fbf4, 0x8eaedfe1, 0x8ea2eea7, 0x8eaedfe2,
+ /* 84 */ 0x8ea2eea6, 0x8ea2eea9, 0x8ea2eea8, 0x8eaee0c8,
+ /* 88 */ 0x8ea2efd1, 0x00000000, 0x0000fcc8, 0x8ea2efd0,
+ /* 8c */ 0x8ea2efce, 0x8eaee0c7, 0x8ea2efcf, 0x00000000,
+ /* 90 */ 0x8eaee0c9, 0x8eaee0fb, 0x0000fcea, 0x0000fce9,
+ /* 94 */ 0x8ea2f0cf, 0x8ea2f0d0, 0x0000fceb, 0x8eaee1cb,
+ /* 98 */ 0x8ea2f1bc, 0x8ea2f1bd, 0x0000fdb4, 0x8eaee1eb,
+ /* 9c */ 0x0000fdba, 0x8eaee1fe, 0x8ea2f1f7, 0x8ea2f2b6,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x04533 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000cbc7,
+ /* b8 */ 0x00000000, 0x8ea2b9d0, 0x8eaeb9aa, 0x8ea2b9d1,
+ /* bc */ 0x8ea2c7d8, 0x8ea2ceb8, 0x8ea2d4ce, 0x0000f5d1,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x04573 ***/
+
+ /* 80 */ 0x8eaed6cd, 0x0000f5d0, 0x8ea2e3d9, 0x8ea2e7b0,
+ /* 84 */ 0x8eaedfe4, 0x8ea2efd2, 0x0000cbc8, 0x8ea2b3a2,
+ /* 88 */ 0x0000d8bf, 0x0000ddc7, 0x8ea2c7da, 0x8ea2c7d9,
+ /* 8c */ 0x0000efa7, 0x8ea2d4cf, 0x0000efa8, 0x8ea2dfdd,
+ /* 90 */ 0x0000f7c2, 0x8eaeddb4, 0x8eaee6cd, 0x8eaee2a1,
+ /* 94 */ 0x0000fdc3, 0x0000cbc9, 0x8ea2a8eb, 0x8ea2b3a3,
+ /* 98 */ 0x8eaeb9ad, 0x00000000, 0x0000ddc8, 0x8eaeb9ac,
+ /* 9c */ 0x8ea2b9d2, 0x8ea2b9d3, 0x8eaebfaa, 0x8ea2c0cb,
+ /* a0 */ 0x8eaebfa9, 0x0000e2af, 0x0000e6ed, 0x8eaec4e4,
+ /* a4 */ 0x8ea2c7dc, 0x8ea2c7db, 0x8ea2c7dd, 0x8eaec9ed,
+ /* a8 */ 0x8ea2ceb9, 0x8ea2ceba, 0x0000ebb0, 0x0000f2c7,
+ /* ac */ 0x0000efa9, 0x0000f2c8, 0x00000000, 0x8ea2dfe1,
+ /* b0 */ 0x8ea2dfde, 0x8ea2dfe0, 0x8ea2dfdf, 0x0000f5d2,
+ /* b4 */ 0x8eaed9ab, 0x8ea2e3da, 0x8ea2e7b2, 0x8ea2e7b1,
+ /* b8 */ 0x8ea2a5a4, 0x0000d8c1, 0x0000d8c0, 0x8ea2b3a4,
+ /* bc */ 0x8eaeb9ae, 0x8ea2b9d4, 0x8eaebfac, 0x8eaebfab,
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x045b3 ***/
+
+ /* 80 */ 0x8ea2c0cd, 0x8ea2c0cc, 0x0000e2b0, 0x8eaebfad,
+ /* 84 */ 0x8ea2c7df, 0x8ea2c7e0, 0x8ea2c7de, 0x8eaee3ca,
+ /* 88 */ 0x8eaec4e5, 0x0000e6ef, 0x0000e6ee, 0x00000000,
+ /* 8c */ 0x0000ebb2, 0x0000ebb1, 0x8eaecefa, 0x8ea2d4d0,
+ /* 90 */ 0x8ea2dadf, 0x8ea2dadd, 0x8ea2dade, 0x0000f2c9,
+ /* 94 */ 0x8ea2dfe3, 0x8ea2dfe2, 0x8eaed6cf, 0x8ea2e3dd,
+ /* 98 */ 0x8ea2e3dc, 0x8ea2e3db, 0x8ea2e7b3, 0x8eaee1cd,
+ /* 9c */ 0x8ea2f1f8, 0x0000cbca, 0x0000d3d6, 0x8eaeafae,
+ /* a0 */ 0x0000d3d7, 0x0000d8c2, 0x0000d8c3, 0x8ea2b3a6,
+ /* a4 */ 0x8ea2b3a5, 0x8ea2b9d5, 0x8eaeb9b0, 0x0000ddce,
+ /* a8 */ 0x0000ddcc, 0x0000ddc9, 0x0000ddcd, 0x0000ddcb,
+ /* ac */ 0x0000ddca, 0x8eaeb9b2, 0x8eaeb9b1, 0x0000e2b1,
+ /* b0 */ 0x8ea2c0d0, 0x8eaebfaf, 0x0000e6f4, 0x0000e2b3,
+ /* b4 */ 0x0000e2b8, 0x8ea2c0d2, 0x0000e2ba, 0x0000e2b9,
+ /* b8 */ 0x0000e2bc, 0x8ea2c0d1, 0x8ea2c0ce, 0x0000e2b6,
+ /* bc */ 0x0000e2b2, 0x0000e2b4, 0x8ea2c0cf, 0x0000e2bb,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x045f3 ***/
+
+ /* 80 */ 0x0000e2b7, 0x0000e2b5, 0x0000e6f6, 0x0000e6f5,
+ /* 84 */ 0x0000e6f3, 0x0000e6f7, 0x00000000, 0x0000e6f1,
+ /* 88 */ 0x0000e6f2, 0x8eaec4e9, 0x0000e6f0, 0x00000000,
+ /* 8c */ 0x8ea2c7e1, 0x8eaec4e7, 0x00000000, 0x8ea2cebc,
+ /* 90 */ 0x8eaec9f0, 0x0000ebb4, 0x0000ebb5, 0x0000ebb3,
+ /* 94 */ 0x8eaec9f2, 0x8ea2cebb, 0x8eaec9f1, 0x8ea2cebd,
+ /* 98 */ 0x8eaee6ce, 0x8ea2d4d3, 0x8ea2d4d5, 0x8eaecefe,
+ /* 9c */ 0x0000efb2, 0x8ea2d4d6, 0x0000efab, 0x8ea2d4d2,
+ /* a0 */ 0x0000efaa, 0x0000efb4, 0x0000efb0, 0x0000efb1,
+ /* a4 */ 0x0000efad, 0x8ea2d4d1, 0x0000efac, 0x8ea2d4d7,
+ /* a8 */ 0x8ea2d4d4, 0x8eaecefd, 0x0000efb3, 0x8eaecfa2,
+ /* ac */ 0x0000efae, 0x0000efaf, 0x8ea2dae1, 0x8eaed2f5,
+ /* b0 */ 0x8ea2dae3, 0x8ea2dae2, 0x8eaed2f3, 0x8ea2dae4,
+ /* b4 */ 0x0000f2ca, 0x8ea2dae0, 0x8eaed6d1, 0x8eaed6d2,
+ /* b8 */ 0x0000f5d6, 0x8ea2dfe4, 0x0000f5d3, 0x0000f5d7,
+ /* bc */ 0x0000f5d5, 0x0000f5d4, 0x8ea2e3de, 0x00000000,
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x04633 ***/
+
+ /* 80 */ 0x8ea2e3e1, 0x00000000, 0x8ea2e3e0, 0x8eaed9ae,
+ /* 84 */ 0x8ea2e3df, 0x0000f7c3, 0x8ea2e7b4, 0x8ea2e7b5,
+ /* 88 */ 0x0000f9a5, 0x8ea2e7b6, 0x0000f9a6, 0x8eaedbb8,
+ /* 8c */ 0x8eaee6cf, 0x0000fac5, 0x8eaee4a8, 0x0000fac4,
+ /* 90 */ 0x8ea2ecc1, 0x8eaedee5, 0x8eaedee6, 0x0000fbae,
+ /* 94 */ 0x8ea2ecc2, 0x8ea2eeab, 0x0000fbf5, 0x0000fbf6,
+ /* 98 */ 0x8eaee6d0, 0x8ea2efd3, 0x8eaee0ca, 0x0000fced,
+ /* 9c */ 0x8eaee1ce,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04650 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x0000cbcb, 0x8eaeb9b3, 0x0000ddd0, 0x0000ddcf,
+ /* a8 */ 0x8ea2c7e2, 0x8ea2c7e3, 0x00000000, 0x0000ebb6,
+ /* ac */ 0x8ea2dae5, 0x0000efb5, 0x8ea2dae6, 0x8ea2dfe5,
+ /* b0 */ 0x0000cbcc, 0x8eaea4ba, 0x8ea2add3, 0x0000d3d9,
+ /* b4 */ 0x0000d3d8, 0x00000000, 0x8ea2b3a7, 0x0000d8c4,
+ /* b8 */ 0x8ea2b3a8, 0x8ea2b9d8, 0x8eaeb9b9, 0x8ea2b9d7,
+ /* bc */ 0x8eaeb9b7, 0x8ea2b9d6, 0x8eaeb9b5, 0x8eaeb9b8,
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04690 ***/
+
+ /* 80 */ 0x8ea2c0d4, 0x0000e2bf, 0x8eaebfb9, 0x8eaebfb4,
+ /* 84 */ 0x8ea2c0d3, 0x0000e2be, 0x8eaebfb7, 0x8eaebfb0,
+ /* 88 */ 0x8eaebfb3, 0x8ea2c0d5, 0x0000e2bd, 0x8eaebfb8,
+ /* 8c */ 0x8ea2c7e5, 0x8ea2c7e8, 0x8ea2c7e6, 0x8ea2c7e7,
+ /* 90 */ 0x8ea2c7eb, 0x8ea2c7e4, 0x8ea2c7ec, 0x8ea2c7e9,
+ /* 94 */ 0x8ea2c7ea, 0x0000ebb8, 0x8ea2cebe, 0x8eaec9f5,
+ /* 98 */ 0x8eaec9f3, 0x0000ebb7, 0x8eaec9f4, 0x8ea2d4db,
+ /* 9c */ 0x8ea2d4d9, 0x8eaecfa6, 0x00000000, 0x0000efb6,
+ /* a0 */ 0x8ea2d4d8, 0x8ea2d4da, 0x8eaecfa5, 0x0000efb7,
+ /* a4 */ 0x8eaecfa3, 0x8ea2dae7, 0x8eaed2f7, 0x8ea2dae8,
+ /* a8 */ 0x0000f5d8, 0x8eaed9b1, 0x8ea2e7b8, 0x8ea2e7ba,
+ /* ac */ 0x8ea2e7b7, 0x8ea2e7b9, 0x8ea2eaa4, 0x8ea2ecc3,
+ /* b0 */ 0x8eaee6d1, 0x00000000, 0x8ea2f1de, 0x0000cbcd,
+ /* b4 */ 0x0000d3da, 0x8ea2b3a9, 0x8ea2b3ab, 0x8ea2b3aa,
+ /* b8 */ 0x00000000, 0x8ea2b9db, 0x0000ddd2, 0x8eaeb9be,
+ /* bc */ 0x8ea2b9d9, 0x8eaeb9ba, 0x0000ddd1, 0x8ea2b9dc,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x046d0 ***/
+
+ /* 80 */ 0x8eaeb9bd, 0x8ea2b9dd, 0x8ea2b9da, 0x00000000,
+ /* 84 */ 0x00000000, 0x8ea2c0e1, 0x0000e2c7, 0x8ea2c0d9,
+ /* 88 */ 0x8ea2c0df, 0x8eaebfbf, 0x8eaebfba, 0x0000e2c2,
+ /* 8c */ 0x0000e2c5, 0x8ea2c0d8, 0x0000e2c0, 0x8ea2c0dc,
+ /* 90 */ 0x8ea2c7f2, 0x0000e2c4, 0x8eaebfbb, 0x8ea2c0d7,
+ /* 94 */ 0x8eaebfbe, 0x8ea2c0dd, 0x8ea2c0da, 0x8ea2c0e0,
+ /* 98 */ 0x8ea2c0d6, 0x8ea2c0de, 0x0000e2c3, 0x0000e2c6,
+ /* 9c */ 0x8ea2c0db, 0x0000e2c1, 0x00000000, 0x0000e6f9,
+ /* a0 */ 0x8ea2c7ee, 0x0000e6f8, 0x8ea2c7f5, 0x8ea2c7f4,
+ /* a4 */ 0x0000e7a1, 0x00000000, 0x0000e7a2, 0x8ea2c7f6,
+ /* a8 */ 0x0000e6fa, 0x8ea2c7f3, 0x0000e6fe, 0x8ea2c7f8,
+ /* ac */ 0x8ea2c7ef, 0x8eaec4eb, 0x8ea2c7f1, 0x0000e6fb,
+ /* b0 */ 0x8ea2c7ed, 0x8ea2c7f0, 0x8ea2c7f7, 0x0000e6fc,
+ /* b4 */ 0x8ea2c7f9, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x0000e6fd, 0x00000000,
+ /* bc */ 0x0000ebb9, 0x8ea2cec3, 0x8ea2cec9, 0x8ea2cec1,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x04710 ***/
+
+ /* 80 */ 0x8ea2ceca, 0x8eaec9fb, 0x8ea2cec0, 0x8ea2cec5,
+ /* 84 */ 0x8ea2cecb, 0x8ea2cec8, 0x8ea2cec7, 0x8ea2cec6,
+ /* 88 */ 0x8eaec9fa, 0x8ea2cebf, 0x8ea2cec4, 0x8eaec9f9,
+ /* 8c */ 0x00000000, 0x8ea2cec2, 0x00000000, 0x0000efbc,
+ /* 90 */ 0x0000efb9, 0x8ea2d4e4, 0x8ea2d4e9, 0x8ea2d4eb,
+ /* 94 */ 0x8ea2d4e8, 0x8ea2d4e1, 0x8ea2d4e3, 0x8ea2d4ed,
+ /* 98 */ 0x8ea2d4ea, 0x8ea2d4e5, 0x8ea2d4ee, 0x8ea2d4e2,
+ /* 9c */ 0x8ea2d4ec, 0x0000efba, 0x0000efc0, 0x0000efbe,
+ /* a0 */ 0x8ea2d4dc, 0x0000efbf, 0x0000efbb, 0x8ea2d4dd,
+ /* a4 */ 0x8ea2d4df, 0x8ea2d4de, 0x8ea2d4e6, 0x8ea2d4e7,
+ /* a8 */ 0x8eaecfac, 0x0000efbd, 0x8eaecfab, 0x0000efb8,
+ /* ac */ 0x00000000, 0x00000000, 0x8ea2d4e0, 0x00000000,
+ /* b0 */ 0x8ea2daf2, 0x0000f2cc, 0x8eaed2fe, 0x8ea2dae9,
+ /* b4 */ 0x0000f2cd, 0x0000f2d0, 0x8ea2daee, 0x00000000,
+ /* b8 */ 0x8ea2daeb, 0x0000f2cf, 0x00000000, 0x8eaed2fb,
+ /* bc */ 0x8ea2daef, 0x8ea2daf0, 0x8ea2daea, 0x8ea2daf3,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04750 ***/
+
+ /* 80 */ 0x8ea2daec, 0x8ea2daf1, 0x0000f2ce, 0x8eaed2fc,
+ /* 84 */ 0x0000f2cb, 0x8ea2daed, 0x8eaed6d4, 0x8ea2dfeb,
+ /* 88 */ 0x0000f5db, 0x0000f5d9, 0x0000f5dc, 0x0000f5da,
+ /* 8c */ 0x8ea2dfea, 0x8ea2dfe7, 0x8ea2dfe6, 0x8eaed6d5,
+ /* 90 */ 0x8ea2dfe9, 0x00000000, 0x00000000, 0x8ea2dfe8,
+ /* 94 */ 0x8ea2e3ef, 0x0000f7c9, 0x8ea2e3e6, 0x8ea2e3e5,
+ /* 98 */ 0x8eaed9b2, 0x0000f7c4, 0x8ea2e3eb, 0x8ea2e3ea,
+ /* 9c */ 0x8ea2e3e2, 0x8ea2e3ed, 0x8ea2e3e7, 0x0000f7c8,
+ /* a0 */ 0x8ea2e3e4, 0x8ea2e3ec, 0x8ea2e3e3, 0x0000f7c5,
+ /* a4 */ 0x0000f7c7, 0x8ea2e3e8, 0x0000f7c6, 0x8ea2e3e9,
+ /* a8 */ 0x8eaedbba, 0x8ea2e3ee, 0x8ea2e7be, 0x8eaedbb9,
+ /* ac */ 0x0000f9ab, 0x8ea2e7bb, 0x00000000, 0x8ea2e7bf,
+ /* b0 */ 0x8eaedbbb, 0x00000000, 0x0000f9a8, 0x8ea2e7bd,
+ /* b4 */ 0x0000f9ad, 0x8eaedbbc, 0x0000f9aa, 0x8eaedbbd,
+ /* b8 */ 0x8ea2e7bc, 0x00000000, 0x0000f9ac, 0x8ea2e7c0,
+ /* bc */ 0x0000f9a7, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x0478f ***/
+
+ /* 80 */ 0x00000000, 0x0000fac7, 0x0000fac9, 0x8eaeddb7,
+ /* 84 */ 0x8ea2eaa7, 0x0000fac8, 0x8ea2eaa5, 0x0000f9a9,
+ /* 88 */ 0x8ea2eaa6, 0x0000fac6, 0x0000fbaf, 0x0000fbb1,
+ /* 8c */ 0x8ea2ecc5, 0x0000fbb0, 0x8ea2ecc4, 0x00000000,
+ /* 90 */ 0x8ea2eeb0, 0x0000fbf7, 0x8ea2eeaf, 0x0000fbf8,
+ /* 94 */ 0x8ea2eead, 0x8ea2eeac, 0x8ea2eeb1, 0x8ea2eeb2,
+ /* 98 */ 0x8ea2efd4, 0x8eaee0cb, 0x8ea2eeae, 0x00000000,
+ /* 9c */ 0x00000000, 0x8ea2f0d4, 0x8ea2f0d1, 0x8ea2f0d2,
+ /* a0 */ 0x8ea2f0d3, 0x0000fda9, 0x8eaee1d0, 0x8ea2f1c0,
+ /* a4 */ 0x8ea2f1bf, 0x8ea2f1be, 0x8ea2f1df, 0x8eaee1ec,
+ /* a8 */ 0x8ea2f2ae, 0x8ea2f1f9, 0x0000fdbb, 0x0000cbce,
+ /* ac */ 0x0000d8c5, 0x8eaeb9bf, 0x00000000, 0x8eaeb9c0,
+ /* b0 */ 0x8eaebfc0, 0x8eaec4f3, 0x0000e7a3, 0x8eaec9fd,
+ /* b4 */ 0x8eaec9fc, 0x00000000, 0x8eaecfb0, 0x8eaecfb2,
+ /* b8 */ 0x8eaecfaf, 0x8eaecfb1, 0x0000efc1, 0x00000000,
+ /* bc */ 0x8eaee6d2, 0x8ea2daf4, 0x00000000, 0x8eaed9b5,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x047cf ***/
+
+ /* 80 */ 0x0000f7ca, 0x8eaed9b6, 0x8ea2e7c1, 0x8eaedbbf,
+ /* 84 */ 0x00000000, 0x00000000, 0x8eaeddb8, 0x00000000,
+ /* 88 */ 0x00000000, 0x8ea2f1fa, 0x0000cbcf, 0x0000cfd1,
+ /* 8c */ 0x0000d3dc, 0x0000d3db, 0x00000000, 0x0000d8c8,
+ /* 90 */ 0x00000000, 0x8ea2b3ac, 0x0000d8c6, 0x8ea2b3ad,
+ /* 94 */ 0x0000d8c7, 0x8eaee6d3, 0x8eaeb9c1, 0x8ea2b9e2,
+ /* 98 */ 0x8ea2b9de, 0x8eaeb9c7, 0x00000000, 0x0000ddd3,
+ /* 9c */ 0x8ea2b9e1, 0x8ea2b9e0, 0x8ea2b9df, 0x0000ddd4,
+ /* a0 */ 0x8ea2b9e3, 0x8ea2b9e4, 0x00000000, 0x00000000,
+ /* a4 */ 0x8eaebfc5, 0x8ea2c0e8, 0x8ea2c0e6, 0x8ea2c0ea,
+ /* a8 */ 0x8ea2c0eb, 0x8ea2c0f1, 0x8eaebfc7, 0x8ea2c0ed,
+ /* ac */ 0x8ea2c0ef, 0x00000000, 0x8ea2c0e7, 0x8ea2c0e2,
+ /* b0 */ 0x00000000, 0x8ea2c0ee, 0x8eaebfc4, 0x8eaebfc6,
+ /* b4 */ 0x8ea2c0f0, 0x8ea2c0e9, 0x8ea2c0ec, 0x8ea2c0e3,
+ /* b8 */ 0x0000e2c9, 0x8ea2c0e5, 0x8ea2c0e4, 0x0000e2c8,
+ /* bc */ 0x0000e2ca, 0x8eaebfc9, 0x0000e7a6, 0x8ea2c7fb,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x0480f ***/
+
+ /* 80 */ 0x8ea2c7fd, 0x8ea2c7fc, 0x8ea2c8a3, 0x0000e7a4,
+ /* 84 */ 0x8eaec4f6, 0x8ea2c7fe, 0x8ea2c7fa, 0x8ea2c8a1,
+ /* 88 */ 0x8ea2c8a2, 0x0000e7a5, 0x0000e7a7, 0x8ea2c8a4,
+ /* 8c */ 0x00000000, 0x8ea2cecf, 0x8ea2cece, 0x00000000,
+ /* 90 */ 0x8ea2cecc, 0x8ea2cecd, 0x0000ebbb, 0x0000ebbd,
+ /* 94 */ 0x0000ebba, 0x0000ebbc, 0x8ea2d4f5, 0x8ea2d4f6,
+ /* 98 */ 0x8ea2d4f1, 0x8eaecfb6, 0x8ea2d4f2, 0x0000efc3,
+ /* 9c */ 0x0000efc8, 0x0000efc2, 0x0000efc9, 0x0000efc4,
+ /* a0 */ 0x8ea2d4f3, 0x00000000, 0x8eaecfb3, 0x8ea2d4f4,
+ /* a4 */ 0x8ea2d4f0, 0x0000efca, 0x0000efc6, 0x8eaecfb5,
+ /* a8 */ 0x00000000, 0x0000efc5, 0x0000efc7, 0x8eaecfb4,
+ /* ac */ 0x8ea2d4ef, 0x8eaed3a4, 0x8ea2daf6, 0x0000f2d2,
+ /* b0 */ 0x8eaed3a2, 0x8eaed3a1, 0x8ea2daf8, 0x0000f2d4,
+ /* b4 */ 0x8ea2dafb, 0x8ea2daf7, 0x8ea2daf5, 0x8ea2dafa,
+ /* b8 */ 0x0000f2d3, 0x8ea2daf9, 0x00000000, 0x0000f2d1,
+ /* bc */ 0x8eaed3a5, 0x8eaed6d9, 0x0000f5de, 0x0000f5e1,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x0484f ***/
+
+ /* 80 */ 0x8ea2dfed, 0x8eaed6da, 0x0000f5df, 0x8ea2dfec,
+ /* 84 */ 0x0000f5dd, 0x0000f5e0, 0x8ea2e3f0, 0x8ea2e3f1,
+ /* 88 */ 0x8ea2e3f2, 0x0000f7cb, 0x8eaed9b7, 0x8ea2e3f3,
+ /* 8c */ 0x00000000, 0x0000f7cc, 0x0000f9af, 0x8ea2e7c4,
+ /* 90 */ 0x8ea2e7c5, 0x8ea2e7c3, 0x8ea2e7c2, 0x8ea2e7c6,
+ /* 94 */ 0x0000f9ae, 0x8ea2eaab, 0x8ea2eaa9, 0x8ea2eaaa,
+ /* 98 */ 0x8ea2eaac, 0x8ea2eaa8, 0x8ea2eaad, 0x8ea2ecc7,
+ /* 9c */ 0x8eaedee7, 0x8ea2ecc8, 0x8ea2ecc6, 0x0000fbb2,
+ /* a0 */ 0x8ea2eeb3, 0x0000fbf9, 0x8ea2eeb4, 0x8ea2efd6,
+ /* a4 */ 0x8ea2efd5, 0x8eaee2a2,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04875 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x0000cbd0,
+ /* 9c */ 0x0000e2cb, 0x8eaebfcb, 0x8eaec4f7, 0x0000e7a8,
+ /* a0 */ 0x8eaec4f8, 0x8eaecaa1, 0x8eaecaa2, 0x0000ebbe,
+ /* a4 */ 0x8eaecfb7, 0x8eaed3a7, 0x0000f2d6, 0x8eaed3a6,
+ /* a8 */ 0x0000f2d5, 0x00000000, 0x8eaee6d4, 0x00000000,
+ /* ac */ 0x8eaed9b8, 0x0000f9b0, 0x0000faa9, 0x0000fbb3,
+ /* b0 */ 0x0000cbd1, 0x0000d8c9, 0x0000e7a9, 0x8eaecfb9,
+ /* b4 */ 0x8ea2e7c7, 0x8eaea7af, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x8eaea4bb, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x8eaea7b0, 0x8ea2a5a6,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x048b5 ***/
+
+ /* 80 */ 0x00000000, 0x8eaea7b3, 0x0000cbd2, 0x00000000,
+ /* 84 */ 0x0000cbd5, 0x0000cbd4, 0x0000cbd3, 0x8eaea7b1,
+ /* 88 */ 0x00000000, 0x8ea2a5a5, 0x8eaeaaf2, 0x8ea2a8ed,
+ /* 8c */ 0x8eaeaaf0, 0x8ea2a8ef, 0x0000cfd2, 0x8eaeaaf4,
+ /* 90 */ 0x00000000, 0x0000cfd4, 0x8ea2a8ec, 0x8ea2a8ee,
+ /* 94 */ 0x0000cfd3, 0x8ea2a8f1, 0x8ea2a8f0, 0x8ea2a8f2,
+ /* 98 */ 0x8eaeaaf3, 0x8eaeaaf1, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x8ea2add7, 0x8ea2add5, 0x0000d3df, 0x8ea2add4,
+ /* a4 */ 0x0000d3e4, 0x0000d3e1, 0x0000d3de, 0x8eaeafb1,
+ /* a8 */ 0x0000d3e5, 0x8eaeafb2, 0x0000d3e0, 0x0000d3e3,
+ /* ac */ 0x00000000, 0x0000d3e2, 0x8ea2add6, 0x8eaeafb3,
+ /* b0 */ 0x0000d3dd, 0x8eaeafb0, 0x00000000, 0x00000000,
+ /* b4 */ 0x0000d8cf, 0x8ea2b3af, 0x8ea2b3b5, 0x0000d8cc,
+ /* b8 */ 0x0000d8d3, 0x8eaeb4a5, 0x0000d8ce, 0x8ea2b3b2,
+ /* bc */ 0x8ea2b3b4, 0x0000d8d1, 0x8ea2b3ae, 0x8ea2b3b1,
+
+ /*** Three byte table, leaf: e980xx - offset 0x048f5 ***/
+
+ /* 80 */ 0x0000d8cd, 0x0000d8ca, 0x8ea2b3b0, 0x0000d8d0,
+ /* 84 */ 0x8ea2b3b3, 0x0000d8d2, 0x0000d8cb, 0x00000000,
+ /* 88 */ 0x8eaeb4a7, 0x8eaeb4a6, 0x00000000, 0x8ea2b9e6,
+ /* 8c */ 0x8ea2b9e9, 0x0000ddd6, 0x8eaeb9cb, 0x0000dde0,
+ /* 90 */ 0x0000dddc, 0x8ea2b9e7, 0x8eaeb9ca, 0x8eaeb9ce,
+ /* 94 */ 0x0000dde4, 0x0000dddd, 0x0000dde2, 0x0000ddd8,
+ /* 98 */ 0x00000000, 0x0000ddd5, 0x0000ddd7, 0x0000dde3,
+ /* 9c */ 0x8ea2b9e8, 0x0000dddb, 0x0000ddde, 0x0000ddda,
+ /* a0 */ 0x0000dddf, 0x8ea2b9ea, 0x0000dde1, 0x0000ddd9,
+ /* a4 */ 0x8ea2b9e5, 0x8eaeb9cc, 0x00000000, 0x00000000,
+ /* a8 */ 0x8eaebfcf, 0x8eaebfd0, 0x8eaebfcd, 0x8eaebfcc,
+ /* ac */ 0x8eaebfd1, 0x8ea2c0f2, 0x0000e2cc, 0x8ea2c0f4,
+ /* b0 */ 0x8eaebfd5, 0x0000e2ce, 0x0000e2d0, 0x00000000,
+ /* b4 */ 0x8ea2c0f3, 0x0000e2cd, 0x0000e2d1, 0x8eaebfd6,
+ /* b8 */ 0x0000e2cf, 0x00000000, 0x8eaebfd4, 0x8eaebfd7,
+ /* bc */ 0x0000e7af, 0x8ea2c8a9, 0x0000e7b7, 0x8ea2c8a6,
+
+ /*** Three byte table, leaf: e981xx - offset 0x04935 ***/
+
+ /* 80 */ 0x8eaec4fd, 0x0000e7b8, 0x0000e7ad, 0x8eaec4f9,
+ /* 84 */ 0x8ea2c8a7, 0x8eaec4fc, 0x8eaec4fa, 0x0000e7b2,
+ /* 88 */ 0x8eaec4fb, 0x8ea2c8a8, 0x0000e7ab, 0x0000e7aa,
+ /* 8c */ 0x8eaec4fe, 0x0000e7b5, 0x0000e7b4, 0x0000e7b3,
+ /* 90 */ 0x0000e7b1, 0x0000e7b6, 0x8ea2c8a5, 0x0000e7ac,
+ /* 94 */ 0x0000e7ae, 0x0000e7b0, 0x00000000, 0x00000000,
+ /* 98 */ 0x0000ebc0, 0x0000ebc3, 0x8eaecaa4, 0x0000ebc7,
+ /* 9c */ 0x0000ebc1, 0x0000ebc6, 0x0000ebc4, 0x8eaecaa7,
+ /* a0 */ 0x0000ebbf, 0x8eaecaa6, 0x0000ebc5, 0x0000ebc2,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x8ea2d4fa,
+ /* a8 */ 0x0000efcd, 0x0000efcb, 0x8eaecfbc, 0x8ea2d4fb,
+ /* ac */ 0x00000000, 0x0000efce, 0x0000efcc, 0x8ea2d4f9,
+ /* b0 */ 0x8ea2d4f8, 0x8eaecfbb, 0x0000f2da, 0x8ea2d4f7,
+ /* b4 */ 0x0000f2d8, 0x0000f2d7, 0x8ea2dafc, 0x0000efcf,
+ /* b8 */ 0x0000f2d9, 0x8ea2dafd, 0x0000f2dc, 0x8ea2dafe,
+ /* bc */ 0x0000f2db, 0x0000f5e3, 0x8ea2dfef, 0x0000f5e2,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04975 ***/
+
+ /* 80 */ 0x0000f5e7, 0x0000f5e5, 0x0000f5e6, 0x0000f7ce,
+ /* 84 */ 0x0000f5e4, 0x8ea2dfee, 0x8ea2dba1, 0x0000f7cd,
+ /* 88 */ 0x0000f7cf, 0x8eaed9ba, 0x0000f9b1, 0x0000f9b2,
+ /* 8c */ 0x00000000, 0x8ea2eaae, 0x00000000, 0x0000fcca,
+ /* 90 */ 0x0000fcc9, 0x0000cbd7, 0x8eaea2de, 0x8eaea2dd,
+ /* 94 */ 0x8ea2a2f5, 0x0000d8d4, 0x8eaea4bc, 0x8ea2a2f2,
+ /* 98 */ 0x8ea2a2f3, 0x8ea2a2f1, 0x8eaea4bd, 0x8ea2a2f4,
+ /* 9c */ 0x8eaee6d5, 0x00000000, 0x8ea2a5aa, 0x8ea2a5a7,
+ /* a0 */ 0x8ea2a5ac, 0x8ea2a5a8, 0x0000cbd8, 0x0000cbdb,
+ /* a4 */ 0x8eaea7b5, 0x8ea2a5a9, 0x0000cbda, 0x8ea2a5ab,
+ /* a8 */ 0x8eaea7b9, 0x8eaea7b4, 0x0000cbd9, 0x8eaeb9d1,
+ /* ac */ 0x00000000, 0x8eaeaaf7, 0x00000000, 0x8ea2a8f5,
+ /* b0 */ 0x8ea2a8f7, 0x0000cfd7, 0x8ea2a8f3, 0x8ea2a8f6,
+ /* b4 */ 0x8ea2a8f4, 0x0000cfd5, 0x0000cfd8, 0x8eaeaaf5,
+ /* b8 */ 0x0000cfd6, 0x8eaeaaf8, 0x00000000, 0x00000000,
+ /* bc */ 0x8eaeafb5, 0x8ea2add9, 0x8ea2addd, 0x8ea2adda,
+
+ /*** Three byte table, leaf: e983xx - offset 0x049b5 ***/
+
+ /* 80 */ 0x8eaeafb8, 0x0000d3e8, 0x8eaeafb4, 0x0000d3e9,
+ /* 84 */ 0x8eaeafbe, 0x8ea2addc, 0x8eaeafb7, 0x8ea2adde,
+ /* 88 */ 0x8ea2ade0, 0x8eaeafbc, 0x0000d3e6, 0x8ea2addf,
+ /* 8c */ 0x00000000, 0x8eaeafbb, 0x0000d3e7, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x8ea2b9f1, 0x8ea2addb, 0x8ea2b3b6, 0x8ea2b3bf,
+ /* 98 */ 0x8ea2b3bd, 0x8ea2b3b8, 0x8ea2b3b9, 0x8ea2b3be,
+ /* 9c */ 0x8ea2b3c0, 0x0000d8d6, 0x8eaeb4a9, 0x8ea2b3bb,
+ /* a0 */ 0x8ea2b3b7, 0x0000d8d5, 0x0000d8d7, 0x8ea2b3ba,
+ /* a4 */ 0x8ea2b3c1, 0x8ea2b3bc, 0x00000000, 0x00000000,
+ /* a8 */ 0x0000dde5, 0x8ea2b9f4, 0x8ea2b9ec, 0x8ea2b9f2,
+ /* ac */ 0x8ea2b9f3, 0x0000dde6, 0x8eaeb9cf, 0x8ea2b9eb,
+ /* b0 */ 0x8ea2b9ed, 0x8ea2add8, 0x8ea2b9ef, 0x8ea2b9f0,
+ /* b4 */ 0x8ea2b9ee, 0x0000e2d3, 0x8eaee3ec, 0x8eaeb9d2,
+ /* b8 */ 0x00000000, 0x8ea2c0fb, 0x8ea2dba2, 0x8ea2c0fc,
+ /* bc */ 0x8ea2c0f9, 0x0000dde7, 0x0000e2d5, 0x8ea2c0f8,
+
+ /*** Three byte table, leaf: e984xx - offset 0x049f5 ***/
+
+ /* 80 */ 0x8ea2c0fe, 0x8ea2c0fd, 0x0000e2d2, 0x8ea2c1a3,
+ /* 84 */ 0x8ea2c0f7, 0x8ea2c1a2, 0x8ea2c0f5, 0x8ea2c1a1,
+ /* 88 */ 0x8ea2c0fa, 0x0000e2d4, 0x8eaebfd9, 0x8ea2c8b0,
+ /* 8c */ 0x8eaec5a3, 0x8ea2c8ab, 0x8ea2c8b1, 0x8ea2c8ac,
+ /* 90 */ 0x8ea2c8aa, 0x8ea2c8ad, 0x0000e7b9, 0x8eaec5a4,
+ /* 94 */ 0x8ea2c8af, 0x8eaec5a5, 0x8ea2c8ae, 0x0000e7ba,
+ /* 98 */ 0x0000ebc9, 0x0000ebc8, 0x8ea2ced6, 0x8ea2ced9,
+ /* 9c */ 0x8ea2ced1, 0x8ea2ced5, 0x0000ebca, 0x8ea2ced4,
+ /* a0 */ 0x8ea2ced2, 0x8ea2ced8, 0x8ea2ced3, 0x8ea2ced0,
+ /* a4 */ 0x8ea2ced7, 0x8eaecaaa, 0x8ea2d5a3, 0x0000efd2,
+ /* a8 */ 0x8ea2e3f4, 0x8ea2d4fe, 0x8ea2d5a1, 0x8ea2d4fd,
+ /* ac */ 0x8ea2c0f6, 0x0000efd1, 0x8ea2d5a4, 0x8ea2d4fc,
+ /* b0 */ 0x0000efd0, 0x0000efd3, 0x8ea2d5a2, 0x8ea2dba3,
+ /* b4 */ 0x0000f2dd, 0x8ea2dba4, 0x8ea2dba5, 0x8eaed3ab,
+ /* b8 */ 0x8ea2dff0, 0x0000f5e8, 0x8ea2e3f5, 0x8ea2e3f6,
+ /* bc */ 0x8eaed9bc, 0x8eaed9bb, 0x8ea2e3f7, 0x8ea2e7c9,
+
+ /*** Three byte table, leaf: e985xx - offset 0x04a35 ***/
+
+ /* 80 */ 0x8ea2e7c8, 0x8ea2eab0, 0x00000000, 0x8ea2eaaf,
+ /* 84 */ 0x8ea2ecca, 0x8ea2eccb, 0x8ea2ecc9, 0x8ea2eeb5,
+ /* 88 */ 0x0000fbfa, 0x0000cbdc, 0x0000d3eb, 0x0000d3ea,
+ /* 8c */ 0x0000d8da, 0x0000d8d9, 0x8ea2b3c3, 0x8ea2b3c4,
+ /* 90 */ 0x8ea2b3c2, 0x8eaeb4aa, 0x0000d8d8, 0x8ea2b9f8,
+ /* 94 */ 0x8eaeb9d5, 0x8ea2b9f9, 0x8ea2b9f5, 0x0000dde8,
+ /* 98 */ 0x8ea2b9f6, 0x8eaeb9d4, 0x8ea2b9f7, 0x00000000,
+ /* 9c */ 0x8eaee6d7, 0x00000000, 0x00000000, 0x8ea2c1a6,
+ /* a0 */ 0x8ea2c1a8, 0x8ea2c1a4, 0x8ea2c1a7, 0x0000e2d6,
+ /* a4 */ 0x8ea2c1a5, 0x0000e2d7, 0x00000000, 0x8eaec5a8,
+ /* a8 */ 0x8ea2c2f9, 0x0000e7bd, 0x0000e7bc, 0x8eaec5a7,
+ /* ac */ 0x0000e7bb, 0x00000000, 0x8ea2c8b2, 0x8ea2c8b3,
+ /* b0 */ 0x00000000, 0x00000000, 0x8ea2cedb, 0x8ea2cedd,
+ /* b4 */ 0x0000ebce, 0x0000ebcb, 0x8eaecaac, 0x0000ebcd,
+ /* b8 */ 0x0000ebcc, 0x8ea2cedc, 0x8ea2ceda, 0x8eaecaab,
+ /* bc */ 0x8eaecaad, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e986xx - offset 0x04a75 ***/
+
+ /* 80 */ 0x8ea2d5ab, 0x8ea2d5a8, 0x8ea2d5a9, 0x0000efd7,
+ /* 84 */ 0x8ea2d5aa, 0x8ea2d5a5, 0x8ea2d5a6, 0x0000efd4,
+ /* 88 */ 0x8eaecfbf, 0x0000efd5, 0x8ea2d5a7, 0x0000efd6,
+ /* 8c */ 0x8eaecfc0, 0x8ea2dba9, 0x8eaed3ad, 0x8ea2dbaa,
+ /* 90 */ 0x8ea2dba7, 0x8ea2dba8, 0x0000f2de, 0x8ea2dba6,
+ /* 94 */ 0x00000000, 0x8eaed3ac, 0x8eaed3af, 0x00000000,
+ /* 98 */ 0x00000000, 0x8ea2dff4, 0x8ea2dff1, 0x8ea2dff3,
+ /* 9c */ 0x0000f5eb, 0x8ea2dff7, 0x0000f5ea, 0x8ea2dff5,
+ /* a0 */ 0x8ea2dff8, 0x8ea2dff6, 0x8ea2dff2, 0x0000f5e9,
+ /* a4 */ 0x00000000, 0x8ea2e3f9, 0x00000000, 0x8ea2e3fa,
+ /* a8 */ 0x8ea2e3f8, 0x8eaed9bd, 0x8ea2e3fc, 0x0000f7d0,
+ /* ac */ 0x0000f7d1, 0x8ea2e7cb, 0x0000f9b4, 0x8ea2e3fb,
+ /* b0 */ 0x8ea2e7ca, 0x0000f9b3, 0x8ea2eab3, 0x8ea2eab4,
+ /* b4 */ 0x0000faca, 0x8ea2eab2, 0x00000000, 0x8ea2eab1,
+ /* b8 */ 0x00000000, 0x8ea2eccc, 0x0000fbb4, 0x8eaedee8,
+ /* bc */ 0x8ea2efd7, 0x8ea2f0d6, 0x8ea2f0d5, 0x8eaee0fe,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04ab5 ***/
+
+ /* 80 */ 0x0000fcee, 0x0000fdaa, 0x8ea2f0d7, 0x8ea2f1e0,
+ /* 84 */ 0x8eaee1ed, 0x0000fdbc, 0x0000cbdd, 0x0000cfd9,
+ /* 88 */ 0x00000000, 0x0000e7be, 0x00000000, 0x0000facb,
+ /* 8c */ 0x0000cbde, 0x0000d3ec, 0x0000dde9, 0x0000e2d8,
+ /* 90 */ 0x0000f7d2, 0x0000cfda, 0x00000000, 0x8ea2ade2,
+ /* 94 */ 0x8ea2ade1, 0x8ea2b3c5, 0x8eaeb4b0, 0x0000d8dd,
+ /* 98 */ 0x0000d8db, 0x0000d8df, 0x8ea2b3c7, 0x8eaeb4ad,
+ /* 9c */ 0x0000d8de, 0x0000d8dc, 0x8eaeb4af, 0x8eaeb4ae,
+ /* a0 */ 0x8eaeb4b1, 0x00000000, 0x8ea2b3c6, 0x0000ddec,
+ /* a4 */ 0x8ea2baa1, 0x8eaeb9d8, 0x0000ddeb, 0x0000dded,
+ /* a8 */ 0x8ea2baa6, 0x0000ddef, 0x8ea2baa3, 0x8ea2baa4,
+ /* ac */ 0x8ea2b9fa, 0x0000ddee, 0x8ea2baa7, 0x00000000,
+ /* b0 */ 0x8eaeb9d7, 0x8ea2b9fc, 0x8eaeb9d6, 0x8ea2b9fd,
+ /* b4 */ 0x8ea2b9fb, 0x0000ddea, 0x8eaeb9d9, 0x8ea2baa5,
+ /* b8 */ 0x8ea2b9fe, 0x8ea2baa2, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x8ea2c1b4, 0x8eaebfdd, 0x8ea2c1b3,
+
+ /*** Three byte table, leaf: e988xx - offset 0x04af5 ***/
+
+ /* 80 */ 0x8ea2c1b1, 0x8ea2c1a9, 0x8ea2c1b8, 0x8ea2c1ac,
+ /* 84 */ 0x8ea2c1b6, 0x8ea2c1bd, 0x8ea2c1b5, 0x0000e2e0,
+ /* 88 */ 0x8eaebfe6, 0x0000e2dc, 0x8ea2c1aa, 0x8eaebfe0,
+ /* 8c */ 0x8ea2c1b0, 0x0000e2de, 0x8eaebfe8, 0x8ea2c1af,
+ /* 90 */ 0x0000e2df, 0x0000e2e1, 0x8ea2c1b2, 0x8eaebfe9,
+ /* 94 */ 0x0000e2d9, 0x0000e2da, 0x8ea2c1be, 0x8ea2c1bc,
+ /* 98 */ 0x8eaebfe2, 0x8ea2c1bb, 0x8ea2c1ad, 0x8eaebfe5,
+ /* 9c */ 0x8ea2c1b9, 0x00000000, 0x0000e2dd, 0x00000000,
+ /* a0 */ 0x8eaebfde, 0x8eaee6d9, 0x8eaebfe3, 0x0000e2db,
+ /* a4 */ 0x8ea2c1ba, 0x8ea2c1ab, 0x8ea2c1ae, 0x8ea2c1b7,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaee6d8,
+ /* ac */ 0x00000000, 0x8ea2cfa2, 0x8ea2c8bd, 0x8eaec5ae,
+ /* b0 */ 0x8ea2c8b6, 0x8ea2c8c9, 0x8ea2c8d2, 0x8ea2c8b9,
+ /* b4 */ 0x0000e7c9, 0x8eaec5ab, 0x8ea2c8c6, 0x0000e7bf,
+ /* b8 */ 0x0000e7c1, 0x0000e7cd, 0x8ea2c8b7, 0x8eaec5b7,
+ /* bc */ 0x8eaec5af, 0x0000e7c2, 0x0000e7c4, 0x0000e7ce,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04b35 ***/
+
+ /* 80 */ 0x0000e7c3, 0x8eaec5b9, 0x00000000, 0x00000000,
+ /* 84 */ 0x8eaec5b8, 0x0000e7cc, 0x8ea2c8bf, 0x00000000,
+ /* 88 */ 0x8ea2c8b4, 0x0000e7ca, 0x8ea2c8be, 0x0000e7c6,
+ /* 8c */ 0x8ea2c8d0, 0x0000e7cb, 0x8ea2c8ce, 0x8ea2c8c2,
+ /* 90 */ 0x8ea2c8cc, 0x0000e7c8, 0x8ea2c8b5, 0x8ea2c8cf,
+ /* 94 */ 0x8ea2c8ca, 0x8eaec5aa, 0x8ea2c8d1, 0x0000e7c0,
+ /* 98 */ 0x00000000, 0x8eaec5ad, 0x0000e7cf, 0x0000e7c5,
+ /* 9c */ 0x8eaec5b1, 0x8eaec5a9, 0x8ea2c8bb, 0x8eaec5b4,
+ /* a0 */ 0x8ea2c8c3, 0x8ea2c8c7, 0x8eaec5b3, 0x8ea2c8cb,
+ /* a4 */ 0x0000e7c7, 0x8ea2c8ba, 0x8ea2c8b8, 0x8ea2c8c4,
+ /* a8 */ 0x00000000, 0x00000000, 0x8eaec5b2, 0x8eaec5b5,
+ /* ac */ 0x8ea2c8c1, 0x8ea2c8c0, 0x8eaec5b6, 0x8ea2c8c5,
+ /* b0 */ 0x8ea2c8c8, 0x00000000, 0x8ea2c8cd, 0x8eaee6da,
+ /* b4 */ 0x00000000, 0x00000000, 0x8ea2cee0, 0x00000000,
+ /* b8 */ 0x0000ebcf, 0x8ea2ceea, 0x8ea2cee2, 0x0000ebd5,
+ /* bc */ 0x0000ebd9, 0x8ea2cef3, 0x8ea2cefb, 0x8ea2ceec,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04b75 ***/
+
+ /* 80 */ 0x0000ebd1, 0x8eaecab4, 0x8ea2cef0, 0x8ea2c8bc,
+ /* 84 */ 0x8eaecab5, 0x0000ebd2, 0x8ea2cef7, 0x8ea2cefc,
+ /* 88 */ 0x8ea2cef4, 0x8eaecaaf, 0x8ea2cef6, 0x8ea2cfa1,
+ /* 8c */ 0x8ea2cef8, 0x8ea2cee6, 0x8ea2ceef, 0x8eaec5b0,
+ /* 90 */ 0x8eaecab8, 0x0000ebda, 0x8eaecab3, 0x0000ebd6,
+ /* 94 */ 0x8ea2cee4, 0x8ea2cef1, 0x0000ebd4, 0x8ea2ceeb,
+ /* 98 */ 0x0000ebd3, 0x8ea2cef9, 0x8ea2cee8, 0x8ea2cee1,
+ /* 9c */ 0x0000ebd7, 0x8ea2cefe, 0x8eaecab9, 0x00000000,
+ /* a0 */ 0x8ea2cee3, 0x8ea2cef5, 0x8ea2cef2, 0x8ea2ceed,
+ /* a4 */ 0x8ea2cedf, 0x8ea2cede, 0x8ea2cee7, 0x8ea2cefa,
+ /* a8 */ 0x0000ebd8, 0x8ea2cefd, 0x8ea2cee5, 0x8ea2cee9,
+ /* ac */ 0x0000ebd0, 0x8eaecab2, 0x8eaecab7, 0x00000000,
+ /* b0 */ 0x8eaee7aa, 0x8eaecab1, 0x0000efe3, 0x0000efde,
+ /* b4 */ 0x8ea2d5cd, 0x8ea2d5c9, 0x8ea2d5b1, 0x0000efda,
+ /* b8 */ 0x8eaecfc2, 0x8eaecfd0, 0x00000000, 0x0000efd9,
+ /* bc */ 0x0000efdf, 0x00000000, 0x8eaecfc3, 0x8eaecfc1,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04bb5 ***/
+
+ /* 80 */ 0x8ea2d5af, 0x0000efdd, 0x8ea2d5bb, 0x8ea2d5ad,
+ /* 84 */ 0x8ea2d5ae, 0x0000efd8, 0x8ea2d5cc, 0x0000efe1,
+ /* 88 */ 0x8ea2d5be, 0x8ea2d5c3, 0x8ea2d5bd, 0x8ea2dbbc,
+ /* 8c */ 0x8ea2d5b9, 0x8ea2d5c1, 0x8ea2d5bf, 0x8ea2d5b2,
+ /* 90 */ 0x8ea2d5ac, 0x8ea2d5c7, 0x0000efe0, 0x8ea2d5c8,
+ /* 94 */ 0x8eaecfc8, 0x8ea2d5c2, 0x8eaecfc9, 0x8ea2d5b7,
+ /* 98 */ 0x8ea2d5b5, 0x8ea2d5b0, 0x8eaecfcb, 0x8eaecfce,
+ /* 9c */ 0x8eaecfc4, 0x8ea2d5b8, 0x8ea2d5c5, 0x8ea2d5b4,
+ /* a0 */ 0x8ea2d5c4, 0x8ea2d5ca, 0x8eaecfd1, 0x00000000,
+ /* a4 */ 0x0000efdc, 0x8eaecfc5, 0x8ea2d5c0, 0x8ea2d5c6,
+ /* a8 */ 0x8ea2d5bc, 0x8ea2d5b6, 0x0000efdb, 0x8eaecfd2,
+ /* ac */ 0x00000000, 0x8eaecfcc, 0x8ea2ceee, 0x8ea2d5ba,
+ /* b0 */ 0x0000efe2, 0x8ea2d5b3, 0x00000000, 0x8eaecfcd,
+ /* b4 */ 0x8eaee6db, 0x8eaee6dc, 0x8eaecab0, 0x8ea2dbc1,
+ /* b8 */ 0x0000f2e1, 0x8ea2dbc0, 0x8ea2dbbe, 0x8ea2dbd0,
+ /* bc */ 0x0000f2e5, 0x8eaed3b5, 0x8ea2dbcd, 0x8ea2dbc5,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04bf5 ***/
+
+ /* 80 */ 0x8ea2dbcf, 0x8ea2dbb7, 0x8ea2dbc3, 0x8eaed3bd,
+ /* 84 */ 0x0000f2e7, 0x8eaed3be, 0x8ea2dbaf, 0x8eaed3b8,
+ /* 88 */ 0x8ea2dbad, 0x8ea2dbce, 0x8eaed3b2, 0x8ea2dbcc,
+ /* 8c */ 0x8ea2dbcb, 0x8ea2dbbb, 0x8ea2dbba, 0x8ea2dbb0,
+ /* 90 */ 0x0000f2e9, 0x00000000, 0x8ea2dbb6, 0x8ea2dbbf,
+ /* 94 */ 0x8ea2dbca, 0x0000f2ec, 0x8ea2dbd1, 0x8eaed3b6,
+ /* 98 */ 0x0000f5f3, 0x0000f2ee, 0x0000f2e8, 0x8ea2dbb4,
+ /* 9c */ 0x8eaed3b7, 0x8ea2dbbd, 0x8ea2dbac, 0x8ea2dbae,
+ /* a0 */ 0x0000f2df, 0x0000f2eb, 0x0000f2e4, 0x8ea2dbb5,
+ /* a4 */ 0x8ea2dbc4, 0x8ea2d5cb, 0x0000f2ea, 0x8ea2dbab,
+ /* a8 */ 0x0000f5ee, 0x8ea2dbc6, 0x8ea2dbc9, 0x0000f2e6,
+ /* ac */ 0x8eaed3bb, 0x8ea2dbb9, 0x0000f2ed, 0x0000f2e3,
+ /* b0 */ 0x8eaed3bc, 0x8eaed3b9, 0x8eaed3ba, 0x0000f2e2,
+ /* b4 */ 0x8ea2dbc2, 0x8ea2dbc8, 0x0000f2e0, 0x00000000,
+ /* b8 */ 0x8ea2dbb2, 0x8ea2dbc7, 0x00000000, 0x00000000,
+ /* bc */ 0x8ea2dbb3, 0x00000000, 0x00000000, 0x8eaee6dd,
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04c35 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x8eaee6de, 0x00000000,
+ /* 84 */ 0x00000000, 0x8eaed3b1, 0x8ea2dbb8, 0x8ea2dffe,
+ /* 88 */ 0x8eaed6e5, 0x8ea2e0a5, 0x0000f5f0, 0x0000f5f2,
+ /* 8c */ 0x8ea2e0ab, 0x0000f5ec, 0x8ea2e0b9, 0x8ea2e0b1,
+ /* 90 */ 0x8ea2e0a6, 0x8ea2e0a7, 0x8ea2e0b0, 0x8eaed6e6,
+ /* 94 */ 0x0000f5f9, 0x8ea2e0af, 0x8ea2dffd, 0x8ea2e0ae,
+ /* 98 */ 0x8ea2e0a2, 0x8ea2e0ba, 0x0000f5f8, 0x0000f5f6,
+ /* 9c */ 0x8ea2e0a3, 0x8eaed6dd, 0x8ea2e0b6, 0x8eaed6e7,
+ /* a0 */ 0x8ea2e0a8, 0x8ea2e0b5, 0x8eaed6e4, 0x8ea2e0b7,
+ /* a4 */ 0x8ea2dffc, 0x0000f5f1, 0x8eaed6db, 0x8ea2e0b8,
+ /* a8 */ 0x8eaed6e8, 0x8eaed6de, 0x8ea2e0ac, 0x8eaed6eb,
+ /* ac */ 0x0000f5f5, 0x8ea2e0a9, 0x8eaed6e1, 0x00000000,
+ /* b0 */ 0x0000f5f7, 0x8ea2e0b2, 0x8eaed6e2, 0x8eaed6e3,
+ /* b4 */ 0x8eaed6df, 0x0000f5ef, 0x8ea2e0a4, 0x8ea2e0b3,
+ /* b8 */ 0x8eaed6dc, 0x8ea2e0ad, 0x8ea2dbb1, 0x8ea2e0b4,
+ /* bc */ 0x8ea2e0a1, 0x8eaed6e0, 0x0000f5f4, 0x8eaed6ea,
+
+ /*** Three byte table, leaf: e98exx - offset 0x04c75 ***/
+
+ /* 80 */ 0x8ea2e4af, 0x00000000, 0x0000f5ed, 0x8ea2dffa,
+ /* 84 */ 0x00000000, 0x00000000, 0x8eaee6df, 0x00000000,
+ /* 88 */ 0x8ea2e4ac, 0x8ea2e4a5, 0x0000f7d4, 0x8eaed9c3,
+ /* 8c */ 0x8ea2e3fe, 0x8ea2e4b0, 0x8ea2e4a7, 0x8ea2e0aa,
+ /* 90 */ 0x8eaed9c0, 0x8ea2e4b2, 0x8ea2e4a1, 0x8eaed9c2,
+ /* 94 */ 0x0000f7d3, 0x8ea2e4ab, 0x0000f7d5, 0x0000f7dd,
+ /* 98 */ 0x0000f7db, 0x8ea2e4ad, 0x0000f7dc, 0x8ea2e4a3,
+ /* 9c */ 0x8eaed9c9, 0x8ea2e4a4, 0x8ea2e4a9, 0x8ea2e4ae,
+ /* a0 */ 0x8eaed9be, 0x8ea2dff9, 0x0000f7d6, 0x8ea2e4b7,
+ /* a4 */ 0x8ea2e4b4, 0x8ea2e7e1, 0x8ea2e4aa, 0x8ea2e4a6,
+ /* a8 */ 0x8ea2e4b5, 0x8ea2e7d6, 0x8ea2e4a8, 0x00000000,
+ /* ac */ 0x0000f7d9, 0x8eaed9c4, 0x0000f7d8, 0x8ea2dffb,
+ /* b0 */ 0x0000f7da, 0x8ea2e4b1, 0x8ea2e4b3, 0x0000f7d7,
+ /* b4 */ 0x8ea2e4b6, 0x8ea2e3fd, 0x00000000, 0x8ea2e4a2,
+ /* b8 */ 0x8eaed9c6, 0x00000000, 0x00000000, 0x8eaed9c5,
+ /* bc */ 0x8eaee6e1, 0x8eaee6e2, 0x8eaee6e0, 0x00000000,
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04cb5 ***/
+
+ /* 80 */ 0x8ea2e7df, 0x8eaedbd0, 0x8ea2e7cf, 0x0000f9b8,
+ /* 84 */ 0x8ea2e7dd, 0x8eaedbc4, 0x8eaedbc5, 0x8ea2e7cd,
+ /* 88 */ 0x0000f9b9, 0x00000000, 0x8ea2e7d8, 0x8eaedbc3,
+ /* 8c */ 0x8ea2e7d4, 0x0000f9be, 0x8ea2e7de, 0x8ea2e7ce,
+ /* 90 */ 0x8ea2e7d1, 0x0000f9b6, 0x8ea2e7e0, 0x8eaedbc8,
+ /* 94 */ 0x8ea2e7d9, 0x8ea2e7dc, 0x0000f9bc, 0x0000f9c1,
+ /* 98 */ 0x0000f9bf, 0x8ea2e7d5, 0x8ea2e7d0, 0x8eaedbcd,
+ /* 9c */ 0x0000f9ba, 0x0000f9bb, 0x8ea2e7cc, 0x0000f9b7,
+ /* a0 */ 0x8eaedbcf, 0x0000f9b5, 0x0000f9bd, 0x8ea2e7db,
+ /* a4 */ 0x0000f9c0, 0x8eaedbca, 0x8ea2e7d7, 0x8ea2e7e2,
+ /* a8 */ 0x0000f9c2, 0x8eaedbc1, 0x8eaedbc2, 0x8eaedbce,
+ /* ac */ 0x8ea2e7d3, 0x8eaedbc7, 0x8ea2e7da, 0x8eaee6e5,
+ /* b0 */ 0x00000000, 0x8eaee6e3, 0x8eaee6e4, 0x8eaeddc1,
+ /* b4 */ 0x8eaedeea, 0x8ea2eac1, 0x8ea2ead0, 0x8ea2eac3,
+ /* b8 */ 0x8ea2eaca, 0x8ea2e7d2, 0x8ea2eac8, 0x8ea2eab7,
+ /* bc */ 0x8ea2eace, 0x0000face, 0x8ea2eabb, 0x8ea2eacd,
+
+ /*** Three byte table, leaf: e990xx - offset 0x04cf5 ***/
+
+ /* 80 */ 0x8ea2eac2, 0x00000000, 0x8eaeddc3, 0x0000facd,
+ /* 84 */ 0x8eaeddbc, 0x8eaeddbf, 0x8ea2ead2, 0x8ea2eac4,
+ /* 88 */ 0x8eaeddbe, 0x8ea2eac9, 0x8ea2eacc, 0x8ea2eab5,
+ /* 8c */ 0x8ea2eacf, 0x8ea2eac0, 0x8ea2eac5, 0x8ea2eab9,
+ /* 90 */ 0x8ea2eabd, 0x8ea2ead1, 0x8ea2eac7, 0x8ea2eab6,
+ /* 94 */ 0x8ea2eaba, 0x8ea2eabc, 0x8ea2eac6, 0x8eaeddbd,
+ /* 98 */ 0x0000facc, 0x8ea2eabf, 0x8eaeddc4, 0x8eaeddc5,
+ /* 9c */ 0x8eaeddc7, 0x00000000, 0x8eaeddc2, 0x8eaeddba,
+ /* a0 */ 0x8ea2eab8, 0x00000000, 0x8eaee6e6, 0x8eaee6e7,
+ /* a4 */ 0x8eaee6e8, 0x00000000, 0x00000000, 0x8eaeddc6,
+ /* a8 */ 0x8ea2eabe, 0x8ea2ecd0, 0x8ea2ecd4, 0x0000fbbb,
+ /* ac */ 0x8ea2ecd6, 0x8eaedeed, 0x0000fbb5, 0x00000000,
+ /* b0 */ 0x8ea2ecd2, 0x8ea2ecd8, 0x0000fbba, 0x0000fbb6,
+ /* b4 */ 0x00000000, 0x0000fbb7, 0x8ea2eccf, 0x8ea2ecd5,
+ /* b8 */ 0x0000fbb9, 0x8ea2ecd3, 0x0000fbb8, 0x8ea2ecce,
+ /* bc */ 0x8ea2eacb, 0x8ea2ecd1, 0x00000000, 0x8ea2eccd,
+
+ /*** Three byte table, leaf: e991xx - offset 0x04d35 ***/
+
+ /* 80 */ 0x8ea2ecd7, 0x00000000, 0x8eaedfe9, 0x8eaedfee,
+ /* 84 */ 0x0000fbfb, 0x8ea2eebc, 0x8ea2eebf, 0x8ea2eebb,
+ /* 88 */ 0x8ea2eebd, 0x8ea2eebe, 0x8ea2eeb8, 0x8ea2eeb9,
+ /* 8c */ 0x8ea2eeb6, 0x8eaedfea, 0x8eaedfec, 0x8ea2eeba,
+ /* 90 */ 0x8ea2eeb7, 0x0000fbfc, 0x0000fbfd, 0x00000000,
+ /* 94 */ 0x8eaedfeb, 0x8ea2efd9, 0x8eaee0d2, 0x8ea2efdb,
+ /* 98 */ 0x8eaee4b1, 0x00000000, 0x8eaee0d5, 0x8eaee0d4,
+ /* 9c */ 0x8eaee0d6, 0x8ea2efda, 0x8ea2efdc, 0x8eaee0cf,
+ /* a0 */ 0x0000fccc, 0x8eaee0d3, 0x8ea2efd8, 0x0000fccb,
+ /* a4 */ 0x0000fccd, 0x8eaee0d7, 0x8eaee6ea, 0x8eaee6e9,
+ /* a8 */ 0x8ea2f0d9, 0x8ea2f0da, 0x0000fcef, 0x8ea2f0d8,
+ /* ac */ 0x8eaee1a2, 0x8ea2f1c2, 0x8ea2f1c1, 0x8ea2f1c3,
+ /* b0 */ 0x0000fdac, 0x8ea2f1c4, 0x0000fdab, 0x8ea2f1c5,
+ /* b4 */ 0x8ea2f1e1, 0x8ea2f1e4, 0x8ea2f1e3, 0x0000fdb5,
+ /* b8 */ 0x8ea2f1e2, 0x00000000, 0x8eaee1ef, 0x8eaee2a3,
+ /* bc */ 0x0000fdbf, 0x0000fdbd, 0x0000fdbe, 0x0000fdc4,
+
+ /*** Three byte table, leaf: e992xx - offset 0x04d75 ***/
+
+ /* 80 */ 0x8ea2f2b0, 0x8ea2f2b1, 0x8ea2f2af, 0x8ea2f2b7,
+ /* 84 */ 0x8eaee2b6, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x04d7e ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000cfdb,
+ /* b8 */ 0x00000000, 0x8eaee3a3, 0x8ea2baa8, 0x8ea2c1bf,
+ /* bc */ 0x8ea2d5ce, 0x8ea2e7e3, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x04dbe ***/
+
+ /* 80 */ 0x0000cfdc, 0x8eaeafc0, 0x0000d3ed, 0x0000d8e0,
+ /* 84 */ 0x00000000, 0x8eaeb4b2, 0x8ea2baa9, 0x8eaeb9dc,
+ /* 88 */ 0x8ea2baaa, 0x0000ddf0, 0x00000000, 0x0000e2e4,
+ /* 8c */ 0x8ea2c1c1, 0x8ea2c1c0, 0x0000e2e8, 0x0000e2e3,
+ /* 90 */ 0x8ea2c1c2, 0x0000e2e5, 0x0000e2e7, 0x0000e2e6,
+ /* 94 */ 0x0000e2e2, 0x8eaebfec, 0x00000000, 0x8eaee6eb,
+ /* 98 */ 0x0000e7d0, 0x8eaec5bc, 0x8eaec5ba, 0x8ea2c8d6,
+ /* 9c */ 0x8ea2c8d4, 0x00000000, 0x8ea2c8d5, 0x8ea2c8d3,
+ /* a0 */ 0x00000000, 0x0000ebdb, 0x8eaecabd, 0x0000ebde,
+ /* a4 */ 0x0000ebe0, 0x0000ebdf, 0x00000000, 0x8eaecabe,
+ /* a8 */ 0x0000ebdc, 0x0000ebdd, 0x00000000, 0x8ea2d5d0,
+ /* ac */ 0x8ea2d5cf, 0x0000efe4, 0x8ea2d5d1, 0x8eaecfd3,
+ /* b0 */ 0x8ea2d5d2, 0x0000efe5, 0x8eaecfd5, 0x8eaecfd6,
+ /* b4 */ 0x00000000, 0x8ea2dbd9, 0x8ea2dbd7, 0x8ea2e0c0,
+ /* b8 */ 0x8eaed3c2, 0x8ea2dbd5, 0x8ea2dbd6, 0x0000f2ef,
+ /* bc */ 0x8ea2dbd2, 0x8ea2dbda, 0x8ea2dbd4, 0x8ea2dbd8,
+
+ /*** Three byte table, leaf: e997xx - offset 0x04dfe ***/
+
+ /* 80 */ 0x8ea2e0bc, 0x8eaed3c4, 0x8eaed3c0, 0x8ea2e0be,
+ /* 84 */ 0x8eaed6ed, 0x8ea2e0bf, 0x0000f5fe, 0x8ea2e0bb,
+ /* 88 */ 0x0000f5fd, 0x8ea2e0bd, 0x0000f5fa, 0x0000f5fb,
+ /* 8c */ 0x0000f5fc, 0x8ea2dbd3, 0x8eaee6ec, 0x00000000,
+ /* 90 */ 0x0000f7e0, 0x8ea2e4ba, 0x8ea2e4b8, 0x8ea2e4b9,
+ /* 94 */ 0x0000f7de, 0x0000f7e1, 0x0000f7df, 0x8eaed9cb,
+ /* 98 */ 0x8eaed9ca, 0x00000000, 0x8ea2e7e4, 0x8ea2e7e5,
+ /* 9c */ 0x0000f9c3, 0x8eaedbd3, 0x8ea2ead3, 0x8ea2ead5,
+ /* a0 */ 0x8ea2ead4, 0x0000facf, 0x0000fbbc, 0x8ea2ecdb,
+ /* a4 */ 0x8ea2ecda, 0x8ea2ecd9, 0x00000000, 0x8eaee6ed,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x04e26 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000cfdd, 0x8eaea1c3, 0x8ea2a1e9, 0x00000000,
+ /* a0 */ 0x8ea2a2f8, 0x0000c8ea, 0x8ea2a2f6, 0x8ea2a2f9,
+ /* a4 */ 0x8ea2a2f7, 0x00000000, 0x8eaea7bb, 0x8eaea7ba,
+ /* a8 */ 0x8ea2a5ae, 0x8eaea7bf, 0x0000cbe2, 0x8eaea7bc,
+ /* ac */ 0x0000cbe3, 0x8ea2a5b0, 0x0000cbe0, 0x8ea2a5af,
+ /* b0 */ 0x8ea2a5ad, 0x0000cbe1, 0x0000cbdf, 0x8eaea7bd,
+ /* b4 */ 0x8eaea7be, 0x00000000, 0x00000000, 0x8eaeaaf9,
+ /* b8 */ 0x00000000, 0x8ea2a8f8, 0x8ea2a8fb, 0x0000cfe0,
+ /* bc */ 0x8ea2a8fa, 0x8ea2a8f9, 0x8eaeaafc, 0x0000cfdf,
+
+ /*** Three byte table, leaf: e999xx - offset 0x04e66 ***/
+
+ /* 80 */ 0x0000cfde, 0x8eaeaafb, 0x0000cfe2, 0x8ea2a8fc,
+ /* 84 */ 0x0000cfe1, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x8ea2ade7, 0x0000d3ef,
+ /* 8c */ 0x0000d3f0, 0x0000d3f1, 0x8ea2ade8, 0x8ea2ade4,
+ /* 90 */ 0x0000d3ee, 0x8ea2ade5, 0x00000000, 0x8ea2ade6,
+ /* 94 */ 0x8ea2ade3, 0x00000000, 0x8eaeb4b6, 0x00000000,
+ /* 98 */ 0x0000d8e7, 0x8eaeb4b4, 0x8eaeb9de, 0x0000d8e4,
+ /* 9c */ 0x8ea2b3c8, 0x0000d8e5, 0x0000d8e8, 0x8ea2b3c9,
+ /* a0 */ 0x8eaeb4b3, 0x0000d8e3, 0x0000d8e1, 0x0000d8e2,
+ /* a4 */ 0x0000d8e6, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x0000ddf1, 0x8ea2baad,
+ /* ac */ 0x0000ddf9, 0x8ea2baac, 0x8eaeb9e1, 0x8ea2baaf,
+ /* b0 */ 0x0000ddf5, 0x8ea2baae, 0x0000e2f0, 0x0000ddf3,
+ /* b4 */ 0x0000ddf6, 0x0000ddf2, 0x0000ddf7, 0x0000ddf8,
+ /* b8 */ 0x0000ddf4, 0x8eaeb9e5, 0x00000000, 0x8eaebff1,
+ /* bc */ 0x8ea2baab, 0x0000e2ec, 0x8ea2c1c4, 0x8eaebff2,
+
+ /*** Three byte table, leaf: e99axx - offset 0x04ea6 ***/
+
+ /* 80 */ 0x8ea2c1c8, 0x8eaebff3, 0x8eaebff5, 0x8ea2c1c7,
+ /* 84 */ 0x0000e2f1, 0x0000e2ed, 0x0000e2ee, 0x8ea2c1c3,
+ /* 88 */ 0x8ea2c1c5, 0x8ea2c1c6, 0x0000e2e9, 0x0000e2eb,
+ /* 8c */ 0x8eaebff0, 0x0000e2ef, 0x0000e2ea, 0x8eaec5c0,
+ /* 90 */ 0x00000000, 0x8ea2c8d9, 0x8ea2c8d7, 0x8ea2c8d8,
+ /* 94 */ 0x0000e7d2, 0x0000e7d3, 0x8eaec5c2, 0x8ea2c8da,
+ /* 98 */ 0x0000e7d1, 0x0000ebe1, 0x00000000, 0x0000ebe3,
+ /* 9c */ 0x0000ebe2, 0x8eaecac5, 0x8ea2cfa3, 0x8eaecac6,
+ /* a0 */ 0x8eaecac4, 0x8ea2cfa4, 0x8ea2d5d4, 0x8eaecfda,
+ /* a4 */ 0x8ea2d5d3, 0x8eaecfdb, 0x00000000, 0x0000f2f0,
+ /* a8 */ 0x0000f2f1, 0x8ea2dbdb, 0x0000f2f2, 0x8eaed3c8,
+ /* ac */ 0x8ea2e0c3, 0x8eaed6f0, 0x8ea2e0c1, 0x8eaed6ef,
+ /* b0 */ 0x8ea2e0c2, 0x0000f6a1, 0x8eaed6f1, 0x8ea2e4bb,
+ /* b4 */ 0x0000f9c4, 0x8eaeddc9, 0x8eaeaafd, 0x8eaed3c9,
+ /* b8 */ 0x0000f6a2, 0x0000cfe3, 0x8eaee3a5, 0x0000d8e9,
+ /* bc */ 0x8ea2b3ca, 0x8eaeb4b9, 0x00000000, 0x8ea2bab0,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x04ee6 ***/
+
+ /* 80 */ 0x0000ddfa, 0x0000e2f2, 0x8ea2c1c9, 0x8ea2c1cb,
+ /* 84 */ 0x0000e2f4, 0x0000e2f3, 0x0000e2f5, 0x0000e2f6,
+ /* 88 */ 0x8ea2c1ca, 0x0000e7d6, 0x0000e7d7, 0x0000e7d5,
+ /* 8c */ 0x0000ebe4, 0x0000e7d4, 0x8ea2c8db, 0x00000000,
+ /* 90 */ 0x8eaecac7, 0x8eaecac9, 0x0000ebe5, 0x8ea2d5d5,
+ /* 94 */ 0x8ea2dbdc, 0x0000f2f3, 0x0000f6a3, 0x8ea2e4bc,
+ /* 98 */ 0x8ea2e4c0, 0x0000f7e4, 0x8ea2e4bd, 0x0000f7e5,
+ /* 9c */ 0x0000f7e3, 0x8ea2e4c1, 0x0000f7e6, 0x8ea2e4bf,
+ /* a0 */ 0x00000000, 0x8ea2e7e6, 0x0000f7e2, 0x0000f9c5,
+ /* a4 */ 0x8eaedef0, 0x8ea2f0db, 0x8eaee1a5, 0x8eaee2af,
+ /* a8 */ 0x0000cfe4, 0x0000ddfc, 0x0000ddfb, 0x00000000,
+ /* ac */ 0x8eaebffe, 0x8eaebffc, 0x8eaebffb, 0x0000e2f7,
+ /* b0 */ 0x8ea2c1cd, 0x8ea2c1cc, 0x0000e2f8, 0x00000000,
+ /* b4 */ 0x8eaec5c6, 0x8ea2c8df, 0x0000e7db, 0x0000e7d8,
+ /* b8 */ 0x8ea2c8de, 0x0000e7da, 0x8ea2c8dc, 0x0000e7d9,
+ /* bc */ 0x8eaec5c7, 0x8ea2c8dd, 0x00000000, 0x8ea2cfa5,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x04f26 ***/
+
+ /* 80 */ 0x0000ebe6, 0x00000000, 0x8ea2d5d8, 0x00000000,
+ /* 84 */ 0x0000efe6, 0x8ea2d5d6, 0x0000efe7, 0x0000efe8,
+ /* 88 */ 0x8ea2d5d7, 0x0000efe9, 0x8eaecfe0, 0x8ea2dbdd,
+ /* 8c */ 0x8eaed3d0, 0x0000f2f7, 0x0000f2f4, 0x0000f2f9,
+ /* 90 */ 0x8ea2dbdf, 0x0000f2f5, 0x8ea2dbde, 0x0000f2f8,
+ /* 94 */ 0x8eaed3cd, 0x8eaed3cc, 0x0000f2f6, 0x8eaed3d1,
+ /* 98 */ 0x8ea2e0c6, 0x8ea2e0c8, 0x8eaed6f4, 0x8eaed6f5,
+ /* 9c */ 0x0000f6a4, 0x8ea2e0c7, 0x0000f6a5, 0x8ea2e0c5,
+ /* a0 */ 0x8ea2e0c4, 0x00000000, 0x8ea2e4c3, 0x8ea2e4c2,
+ /* a4 */ 0x0000f7e7, 0x8ea2e4c4, 0x8ea2e7eb, 0x0000f9c7,
+ /* a8 */ 0x8ea2e7ea, 0x8ea2e7e7, 0x0000f9c6, 0x8ea2e7e8,
+ /* ac */ 0x8ea2e7e9, 0x00000000, 0x8ea2ead6, 0x8ea2ead7,
+ /* b0 */ 0x0000fad0, 0x8eaeddcf, 0x0000fbbf, 0x8eaeddcc,
+ /* b4 */ 0x8eaeddce, 0x8ea2ecdc, 0x8eaedef2, 0x8eaedef1,
+ /* b8 */ 0x0000fbbd, 0x0000fbbe, 0x8ea2ecdd, 0x8eaee6ee,
+ /* bc */ 0x8eaedff1, 0x0000fbfe, 0x0000fca1, 0x8ea2eec0,
+
+ /*** Three byte table, leaf: e99dxx - offset 0x04f66 ***/
+
+ /* 80 */ 0x8eaedff2, 0x8eaee0d9, 0x0000fcf0, 0x8ea2f0dd,
+ /* 84 */ 0x0000fcf2, 0x8eaee1a6, 0x8ea2f0dc, 0x8ea2f0de,
+ /* 88 */ 0x0000fcf1, 0x8ea2f1c6, 0x00000000, 0x8ea2f1fb,
+ /* 8c */ 0x00000000, 0x8eaee6ef, 0x00000000, 0x00000000,
+ /* 90 */ 0x8eaee2c5, 0x8eaeaafe, 0x0000cfe5, 0x00000000,
+ /* 94 */ 0x00000000, 0x8eaec5c9, 0x0000e7dc, 0x00000000,
+ /* 98 */ 0x8ea2cfa6, 0x8eaecacc, 0x8ea2d5d9, 0x0000f2fa,
+ /* 9c */ 0x0000f2fb, 0x8eaed9cf, 0x0000cfe6, 0x8eaec0a1,
+ /* a0 */ 0x0000efea, 0x0000f9c8, 0x0000d3f2, 0x8eaeaba1,
+ /* a4 */ 0x8eaecace, 0x00000000, 0x0000f2fc, 0x8eaedef3,
+ /* a8 */ 0x0000fcce, 0x0000d3f3, 0x8ea2bab1, 0x00000000,
+ /* ac */ 0x8ea2c1ce, 0x8eaec0a4, 0x8ea2c1d0, 0x8eaec0a2,
+ /* b0 */ 0x8ea2c1cf, 0x00000000, 0x8ea2c8e3, 0x8ea2c8e0,
+ /* b4 */ 0x0000e7dd, 0x00000000, 0x0000e7de, 0x8ea2c8e1,
+ /* b8 */ 0x8ea2c8e2, 0x8eaec5cb, 0x8ea2cfa8, 0x8ea2cfad,
+ /* bc */ 0x0000ebe7, 0x8ea2cfa7, 0x8ea2cfa9, 0x8ea2cfb0,
+
+ /*** Three byte table, leaf: e99exx - offset 0x04fa6 ***/
+
+ /* 80 */ 0x8ea2cfab, 0x8ea2cfaf, 0x8ea2cfac, 0x8ea2cfaa,
+ /* 84 */ 0x8ea2cfae, 0x0000ebe8, 0x00000000, 0x8eaecfe2,
+ /* 88 */ 0x8ea2d5dc, 0x8eaecfe3, 0x8ea2d5da, 0x0000efec,
+ /* 8c */ 0x8eaecfe4, 0x0000efeb, 0x8ea2d5db, 0x0000efed,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaed3d3,
+ /* 94 */ 0x8ea2dbe2, 0x00000000, 0x00000000, 0x8ea2dbe1,
+ /* 98 */ 0x0000f2fd, 0x8ea2dbe0, 0x8ea2e0c9, 0x8eaed6fa,
+ /* 9c */ 0x8ea2e0cb, 0x8ea2e0cd, 0x8ea2e0cc, 0x8eaed6fb,
+ /* a0 */ 0x0000f6a6, 0x8ea2e0ca, 0x8ea2e4cb, 0x0000f7e8,
+ /* a4 */ 0x8ea2e4c9, 0x8ea2e4cc, 0x0000f7e9, 0x00000000,
+ /* a8 */ 0x8ea2e4c7, 0x8eaed9d0, 0x8ea2e4ca, 0x8ea2e4c8,
+ /* ac */ 0x8ea2e4c5, 0x0000f7ea, 0x8ea2e4c6, 0x00000000,
+ /* b0 */ 0x00000000, 0x8eaedbdf, 0x8eaedbdd, 0x8ea2e7ec,
+ /* b4 */ 0x8eaedbde, 0x8eaedbe0, 0x8ea2e7ee, 0x8ea2e7ed,
+ /* b8 */ 0x8eaeddd0, 0x8ea2ead8, 0x8eaeddd1, 0x8ea2ead9,
+ /* bc */ 0x00000000, 0x8eaedef5, 0x8eaedef4, 0x8ea2ecde,
+
+ /*** Three byte table, leaf: e99fxx - offset 0x04fe6 ***/
+
+ /* 80 */ 0x8eaedff3, 0x0000fca3, 0x00000000, 0x0000fca2,
+ /* 84 */ 0x8ea2efdd, 0x8ea2efde, 0x0000fcf3, 0x8ea2f0df,
+ /* 88 */ 0x8eaee1a8, 0x0000fdb6, 0x8eaee2bb, 0x0000d3f4,
+ /* 8c */ 0x0000e2f9, 0x8ea2cfb2, 0x8ea2cfb1, 0x8ea2d5de,
+ /* 90 */ 0x8ea2d5dd, 0x00000000, 0x8eaed3d5, 0x0000f6a7,
+ /* 94 */ 0x8ea2e0cf, 0x8ea2e0ce, 0x8ea2e4cf, 0x8ea2e4cd,
+ /* 98 */ 0x8ea2e4d0, 0x8ea2e4ce, 0x8eaed9d1, 0x00000000,
+ /* 9c */ 0x0000f9c9, 0x8ea2e7ef, 0x8ea2e7f0, 0x8ea2e7f1,
+ /* a0 */ 0x00000000, 0x8ea2ecdf, 0x8eaedef6, 0x8ea2eec1,
+ /* a4 */ 0x8eaee1a9, 0x8ea2f0e0, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x0000d3f5, 0x8eaec5cf, 0x8eaecfe5,
+ /* b0 */ 0x8ea2dbe3, 0x8ea2e0d0, 0x8eaedbe1, 0x0000d3f6,
+ /* b4 */ 0x00000000, 0x8eaec5d0, 0x0000ebe9, 0x00000000,
+ /* b8 */ 0x8ea2dbe4, 0x0000f7eb, 0x8ea2e4d1, 0x0000f9ca,
+ /* bc */ 0x8eaeddd3, 0x8ea2eada, 0x8ea2eadb, 0x0000fbc0,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x05026 ***/
+
+ /* 80 */ 0x8ea2efdf, 0x0000d3f7, 0x0000dea1, 0x0000dea2,
+ /* 84 */ 0x8ea2bab2, 0x0000e2fa, 0x0000e2fb, 0x8ea2c1d1,
+ /* 88 */ 0x0000e2fc, 0x00000000, 0x0000e7e2, 0x8eaec5d2,
+ /* 8c */ 0x0000e7e4, 0x8ea2c8e5, 0x8ea2c8e6, 0x8ea2c8e4,
+ /* 90 */ 0x0000e7df, 0x0000e7e0, 0x0000e7e3, 0x0000e7e1,
+ /* 94 */ 0x8eaecad4, 0x8eaecad5, 0x8ea2cfb3, 0x0000ebea,
+ /* 98 */ 0x0000ebeb, 0x8eaecad2, 0x8eaecad6, 0x8ea2d5e5,
+ /* 9c */ 0x0000eff0, 0x8ea2d5e0, 0x8ea2d5df, 0x8eaecfe9,
+ /* a0 */ 0x8ea2d5e4, 0x0000efee, 0x8eaecfe7, 0x8eaee3ee,
+ /* a4 */ 0x0000f3a6, 0x00000000, 0x8ea2d5e1, 0x8ea2d5e6,
+ /* a8 */ 0x8ea2d5e3, 0x8ea2d5e2, 0x8eaecfe6, 0x0000efef,
+ /* ac */ 0x00000000, 0x0000f3a4, 0x8eaed3dc, 0x8ea2dbe6,
+ /* b0 */ 0x0000f2fe, 0x8eaed3d9, 0x8ea2dbe7, 0x8eaed3da,
+ /* b4 */ 0x8eaed2a8, 0x8ea2dbe5, 0x8eaed3d8, 0x0000f3a3,
+ /* b8 */ 0x0000f3a1, 0x0000f3a5, 0x8eaed3dd, 0x0000f3a2,
+ /* bc */ 0x8eaed3db, 0x8eaed3df, 0x00000000, 0x8eaed9db,
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x05066 ***/
+
+ /* 80 */ 0x8eaed7a6, 0x8ea2e0d1, 0x8eaee3fb, 0x8ea2e0d6,
+ /* 84 */ 0x8ea2e0d2, 0x8ea2e0d5, 0x0000f6a8, 0x8eaed7a8,
+ /* 88 */ 0x8ea2dec1, 0x8ea2e0d4, 0x8ea2e0d3, 0x8eaed9d9,
+ /* 8c */ 0x0000f7ee, 0x0000f7ec, 0x0000f7ef, 0x0000f7ed,
+ /* 90 */ 0x8ea2e4d2, 0x8ea2e4d3, 0x8ea2e4d4, 0x0000f7f0,
+ /* 94 */ 0x8eaed9d6, 0x8eaed9d8, 0x8eaedbe5, 0x8ea2e7f5,
+ /* 98 */ 0x0000f9cc, 0x8ea2e7f3, 0x00000000, 0x0000f9cd,
+ /* 9c */ 0x8ea2e7f2, 0x8ea2e7f4, 0x0000f9cb, 0x8ea2eadf,
+ /* a0 */ 0x8ea2eadc, 0x8eaee4aa, 0x8ea2eadd, 0x8ea2eade,
+ /* a4 */ 0x8ea2ece0, 0x0000fbc2, 0x8eaedef8, 0x0000fbc1,
+ /* a8 */ 0x8eaedef7, 0x8ea2eec3, 0x8ea2eec2, 0x0000fca4,
+ /* ac */ 0x8eaee0dd, 0x8eaee0de, 0x8eaee0dc, 0x0000fccf,
+ /* b0 */ 0x0000fcf4, 0x0000fdad, 0x8ea2f1c7, 0x8ea2f1fc,
+ /* b4 */ 0x8ea2f1fd,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x0509b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x0000d3f8, 0x8ea2c1d2, 0x00000000, 0x00000000,
+ /* ac */ 0x8ea2c8e7, 0x8ea2cfb4, 0x8ea2cfb5, 0x0000ebec,
+ /* b0 */ 0x00000000, 0x0000ebed, 0x8ea2d5e7, 0x0000eff1,
+ /* b4 */ 0x00000000, 0x8eaed3e1, 0x0000f6a9, 0x8eaed7aa,
+ /* b8 */ 0x8ea2e4d5, 0x8eaed9dc, 0x0000f7f1, 0x8ea2e7f8,
+ /* bc */ 0x0000f9ce, 0x8ea2e7f7, 0x8ea2e7f9, 0x8ea2e7f6,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x050db ***/
+
+ /* 80 */ 0x8ea2ece3, 0x8ea2eae0, 0x8ea2eae1, 0x8eaeddd6,
+ /* 84 */ 0x0000fad1, 0x00000000, 0x8ea2ece2, 0x8eaedefb,
+ /* 88 */ 0x8eaedef9, 0x8ea2ece1, 0x8eaedefa, 0x8ea2eec4,
+ /* 8c */ 0x8ea2f1fe, 0x8eaee2a5, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x0000d3f9,
+ /* 9c */ 0x8eaedefc, 0x8eaee2a6, 0x00000000, 0x0000d3fa,
+ /* a0 */ 0x00000000, 0x8eaeb9e7, 0x0000d8ea, 0x8ea2b3cb,
+ /* a4 */ 0x8eaee6f0, 0x8ea2bab3, 0x8eaeb9e8, 0x0000e2fd,
+ /* a8 */ 0x00000000, 0x0000e3a2, 0x0000e2fe, 0x8ea2c1d3,
+ /* ac */ 0x8eaec5db, 0x0000e3a4, 0x00000000, 0x0000e3a1,
+ /* b0 */ 0x8eaec0ab, 0x8eaec5dc, 0x0000e3a3, 0x8eaec5d4,
+ /* b4 */ 0x0000e7e6, 0x8eaec5d9, 0x8ea2c8e8, 0x8eaec5d7,
+ /* b8 */ 0x8eaecadd, 0x8ea2c8e9, 0x8ea2d5e9, 0x00000000,
+ /* bc */ 0x0000e7e5, 0x0000e7e7, 0x0000e7e8, 0x8eaec5d8,
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x0511b ***/
+
+ /* 80 */ 0x8ea2cfb7, 0x8eaecade, 0x8ea2cfb6, 0x0000ebee,
+ /* 84 */ 0x00000000, 0x0000ebef, 0x8eaecadb, 0x8ea2cfb8,
+ /* 88 */ 0x8ea2d5e8, 0x0000ebf1, 0x0000eff2, 0x00000000,
+ /* 8c */ 0x0000ebf0, 0x00000000, 0x8eaee6fa, 0x00000000,
+ /* 90 */ 0x0000f3a7, 0x8ea2d5ea, 0x0000eff4, 0x0000eff3,
+ /* 94 */ 0x8ea2d5eb, 0x8ea2d5ee, 0x8ea2d5ec, 0x8ea2d5ed,
+ /* 98 */ 0x0000eff5, 0x8eaecfeb, 0x0000f3ac, 0x0000f3aa,
+ /* 9c */ 0x8eaed3e5, 0x8eaed3e6, 0x0000f3a9, 0x8ea2dbe9,
+ /* a0 */ 0x8eaed3e4, 0x0000f3ab, 0x8eaed3e2, 0x8eaed3e3,
+ /* a4 */ 0x8ea2dbe8, 0x8ea2e0d7, 0x00000000, 0x8ea2dbea,
+ /* a8 */ 0x0000f3a8, 0x8ea2dbeb, 0x8ea2e0da, 0x8ea2e0d8,
+ /* ac */ 0x8ea2e0d9, 0x8ea2e0de, 0x0000f7f5, 0x8ea2e0dd,
+ /* b0 */ 0x8ea2e0e0, 0x8ea2e0df, 0x8ea2e0dc, 0x8ea2e0db,
+ /* b4 */ 0x00000000, 0x0000f6aa, 0x8eaed9e2, 0x00000000,
+ /* b8 */ 0x8eaed9e1, 0x8eaed9e6, 0x8ea2e4d8, 0x8eaed9e5,
+ /* bc */ 0x8ea2e4d7, 0x0000f7f4, 0x0000f7f2, 0x0000f7f3,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x0515b ***/
+
+ /* 80 */ 0x8eaed9e3, 0x8ea2e4d6, 0x8eaee6f1, 0x8ea2e7fc,
+ /* 84 */ 0x8eaedbe9, 0x0000f9cf, 0x00000000, 0x8ea2e7fb,
+ /* 88 */ 0x8ea2e7fa, 0x0000f9d0, 0x00000000, 0x8ea2eae6,
+ /* 8c */ 0x8ea2eae5, 0x8eaeddd8, 0x8ea2eae3, 0x8eaedefe,
+ /* 90 */ 0x8ea2eae2, 0x0000fad3, 0x0000fad2, 0x8ea2eae7,
+ /* 94 */ 0x8ea2eec5, 0x0000fca5, 0x8ea2ece5, 0x0000fbc3,
+ /* 98 */ 0x8ea2ece4, 0x8ea2eae4, 0x8eaedff8, 0x8ea2eec6,
+ /* 9c */ 0x0000fcd0, 0x8eaee1aa, 0x0000fdae, 0x8ea2f1c8,
+ /* a0 */ 0x00000000, 0x8ea2f2a1, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x05185 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000d3fb, 0x8ea2bab4,
+ /* 98 */ 0x8ea2e0e1, 0x0000d3fc, 0x8eaec5df, 0x00000000,
+ /* 9c */ 0x8ea2cfba, 0x8ea2cfb9, 0x8ea2dbec, 0x00000000,
+ /* a0 */ 0x8eaed3e8, 0x8ea2e0e3, 0x8eaed7b0, 0x8ea2e0e2,
+ /* a4 */ 0x8eaed9e7, 0x0000f7f6, 0x8ea2e7fd, 0x8ea2e7fe,
+ /* a8 */ 0x0000fad4, 0x8eaedfa1, 0x8eaee0e0, 0x8ea2f2a2,
+ /* ac */ 0x0000d8eb, 0x0000e3a6, 0x0000e3a5, 0x8ea2c8ea,
+ /* b0 */ 0x8ea2c8ec, 0x0000e7ea, 0x8ea2c8eb, 0x0000e7e9,
+ /* b4 */ 0x0000e7eb, 0x8ea2c8ed, 0x8eaecae3, 0x8eaecae2,
+ /* b8 */ 0x8eaecae6, 0x8ea2cfbc, 0x8ea2cfbe, 0x8ea2cfbd,
+ /* bc */ 0x8eaecae1, 0x8ea2cfc0, 0x8eaecae0, 0x8eaecaec,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x051c5 ***/
+
+ /* 80 */ 0x8eaecae4, 0x0000ebf2, 0x8ea2cfbf, 0x8ea2cfbb,
+ /* 84 */ 0x8eaecaea, 0x00000000, 0x00000000, 0x8ea2cfc1,
+ /* 88 */ 0x8eaecff3, 0x8ea2d5f5, 0x8eaecfed, 0x8ea2d5f8,
+ /* 8c */ 0x8ea2d5fa, 0x8ea2d5f0, 0x8ea2d5f4, 0x8ea2d5f1,
+ /* 90 */ 0x0000eff7, 0x0000effa, 0x0000effc, 0x8ea2d5f2,
+ /* 94 */ 0x8ea2d5f3, 0x0000effb, 0x8ea2d5f6, 0x8ea2d5f9,
+ /* 98 */ 0x8ea2d5f7, 0x0000effd, 0x8eaecfee, 0x0000eff9,
+ /* 9c */ 0x8ea2d5ef, 0x0000eff6, 0x8eaecff2, 0x0000eff8,
+ /* a0 */ 0x8eaecff4, 0x8eaed3f0, 0x0000f3ae, 0x8ea2dbf2,
+ /* a4 */ 0x8ea2dbf0, 0x8ea2dbef, 0x8eaed3f1, 0x8ea2dbf5,
+ /* a8 */ 0x8eaed3eb, 0x8ea2dbf4, 0x8ea2dbf3, 0x8eaed3ec,
+ /* ac */ 0x8ea2dbee, 0x0000f3ad, 0x8ea2dbed, 0x8eaed3ea,
+ /* b0 */ 0x8ea2dbf1, 0x0000f3af, 0x00000000, 0x8eaed7b4,
+ /* b4 */ 0x8ea2e0e6, 0x8eaed7b7, 0x8ea2e0ea, 0x8ea2e0e7,
+ /* b8 */ 0x8ea2e0e9, 0x8ea2e0e8, 0x8ea2e0e5, 0x8ea2e0eb,
+ /* bc */ 0x8ea2e0ee, 0x8ea2e0ec, 0x8ea2e0ed, 0x0000f6ac,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x05205 ***/
+
+ /* 80 */ 0x8eaed7b3, 0x0000f6ab, 0x8ea2e0e4, 0x8ea2e0ef,
+ /* 84 */ 0x8ea2e4dd, 0x8ea2e4e0, 0x8ea2e4e2, 0x8ea2e4e1,
+ /* 88 */ 0x8eaed9ea, 0x8ea2e4db, 0x8ea2e4df, 0x8ea2e4da,
+ /* 8c */ 0x8eaed9eb, 0x8ea2e4dc, 0x0000f7f7, 0x8ea2e4d9,
+ /* 90 */ 0x8eaed9ed, 0x8ea2e4de, 0x00000000, 0x00000000,
+ /* 94 */ 0x8ea2e8ad, 0x8ea2e8a2, 0x0000f9d1, 0x8eaedbef,
+ /* 98 */ 0x8eaedbed, 0x0000f9d2, 0x8ea2e8a1, 0x8ea2e8a6,
+ /* 9c */ 0x8ea2e8ac, 0x8ea2e8a4, 0x8ea2e8ab, 0x8eaedbec,
+ /* a0 */ 0x8ea2e8a8, 0x8eaedbee, 0x8ea2e8a7, 0x8ea2e8aa,
+ /* a4 */ 0x8ea2e8a5, 0x8ea2e8a3, 0x8eaedbeb, 0x8ea2e8a9,
+ /* a8 */ 0x00000000, 0x8ea2eaee, 0x8ea2eaec, 0x0000fad5,
+ /* ac */ 0x8ea2eaeb, 0x8ea2eaf1, 0x8ea2eaef, 0x8eaeddda,
+ /* b0 */ 0x0000fad6, 0x8ea2eaea, 0x8ea2eae8, 0x00000000,
+ /* b4 */ 0x8ea2eae9, 0x0000fad8, 0x8ea2eaed, 0x0000fad7,
+ /* b8 */ 0x8ea2eaf0, 0x8ea2ece6, 0x8ea2ecec, 0x8eaedfa4,
+ /* bc */ 0x8eaedfa2, 0x8ea2ece7, 0x0000fbc7, 0x8ea2eced,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x05245 ***/
+
+ /* 80 */ 0x0000fbc6, 0x8ea2eceb, 0x8ea2ecea, 0x0000fbc5,
+ /* 84 */ 0x8ea2ece9, 0x0000fbc4, 0x8ea2ece8, 0x00000000,
+ /* 88 */ 0x8ea2eecc, 0x8ea2eece, 0x8ea2eecd, 0x00000000,
+ /* 8c */ 0x8ea2eeca, 0x0000fca7, 0x8ea2eec7, 0x8ea2eecb,
+ /* 90 */ 0x8ea2eed0, 0x8eaedff9, 0x8ea2eecf, 0x8ea2eec8,
+ /* 94 */ 0x8ea2eec9, 0x0000fca6, 0x8ea2efe0, 0x0000fcd3,
+ /* 98 */ 0x8eaee0e2, 0x8ea2efe1, 0x0000fcd1, 0x0000fcd2,
+ /* 9c */ 0x8eaee0e1, 0x00000000, 0x8ea2f0e1, 0x0000fcf5,
+ /* a0 */ 0x8ea2f1e5, 0x8eaee1f2, 0x0000fdb7, 0x8eaee1f3,
+ /* a4 */ 0x8ea2f2a3, 0x0000fdb8, 0x8ea2f2a4, 0x8ea2f2a5,
+ /* a8 */ 0x8ea2f2b3, 0x8ea2f2b2, 0x0000fdc7, 0x8ea2f2bb,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x05271 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x0000d8ec, 0x8eaec0af, 0x00000000, 0x8ea2c8ef,
+ /* ac */ 0x00000000, 0x8ea2c8ee, 0x00000000, 0x0000ebf3,
+ /* b0 */ 0x0000ebf4, 0x8ea2cfc2, 0x00000000, 0x8ea2d5fb,
+ /* b4 */ 0x8ea2dbf8, 0x8eaecff7, 0x8eaecff6, 0x0000effe,
+ /* b8 */ 0x0000f3b0, 0x8ea2dbf6, 0x00000000, 0x8ea2dbf9,
+ /* bc */ 0x0000f3b1, 0x8eaed7ba, 0x8ea2e0f0, 0x8ea2dbf7,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x052b1 ***/
+
+ /* 80 */ 0x8ea2e4e3, 0x0000f7f8, 0x8ea2e8ae, 0x00000000,
+ /* 84 */ 0x8eaedde1, 0x00000000, 0x8ea2eaf4, 0x8ea2eaf2,
+ /* 88 */ 0x8eaedde0, 0x8eaeddde, 0x8ea2eaf3, 0x00000000,
+ /* 8c */ 0x00000000, 0x8ea2ecee, 0x8eaedfa5, 0x0000fbc8,
+ /* 90 */ 0x8ea2eed1, 0x0000fcd6, 0x0000fca8, 0x0000fcd4,
+ /* 94 */ 0x0000fcd5, 0x8ea2f0e2, 0x0000fdaf, 0x8eaee1f4,
+ /* 98 */ 0x0000d8ed, 0x8eaee3b4, 0x8eaecaee, 0x00000000,
+ /* 9c */ 0x8ea2e4e4, 0x8eaedffb, 0x8eaee0e3, 0x8ea2b3cc,
+ /* a0 */ 0x8eaec0b2, 0x0000e7ec, 0x8eaec5e1, 0x8ea2cfc3,
+ /* a4 */ 0x8eaecaef, 0x8eaecaf3, 0x0000ebf5, 0x8ea2cfc4,
+ /* a8 */ 0x8eaecaf1, 0x8eaecaf0, 0x8eaecaf2, 0x8ea2d5fd,
+ /* ac */ 0x8ea2d5fc, 0x0000f3b3, 0x0000f0a1, 0x0000f0a2,
+ /* b0 */ 0x00000000, 0x8ea2d6a2, 0x8ea2d6a1, 0x8ea2d5fe,
+ /* b4 */ 0x8eaecff9, 0x8eaed3f5, 0x8ea2dbfa, 0x8ea2dbfd,
+ /* b8 */ 0x8eaed3f4, 0x8ea2dbfc, 0x8ea2dbfb, 0x0000f3b2,
+ /* bc */ 0x8ea2e0f4, 0x8ea2e0f2, 0x8ea2e0f1, 0x00000000,
+
+ /*** Three byte table, leaf: e9acxx - offset 0x052f1 ***/
+
+ /* 80 */ 0x8eaed7bb, 0x8ea2e0f3, 0x8eaed7bc, 0x0000f7f9,
+ /* 84 */ 0x8ea2e4e6, 0x8ea2e4e7, 0x0000f7fa, 0x8eaed9ef,
+ /* 88 */ 0x8ea2e4e5, 0x8eaedbf1, 0x8ea2e8b0, 0x8ea2e8af,
+ /* 8c */ 0x8ea2e8b2, 0x0000f9d3, 0x8ea2e8b1, 0x00000000,
+ /* 90 */ 0x8ea2eaf5, 0x8ea2eaf7, 0x8ea2eaf6, 0x00000000,
+ /* 94 */ 0x8eaedfa7, 0x8ea2ecef, 0x8ea2ecf2, 0x8ea2ecf0,
+ /* 98 */ 0x8ea2ecf1, 0x8ea2eed2, 0x0000fca9, 0x00000000,
+ /* 9c */ 0x00000000, 0x8eaee6f2, 0x8ea2efe2, 0x8ea2efe3,
+ /* a0 */ 0x8ea2efe4, 0x8eaee1ac, 0x0000fcf6, 0x0000fdb0,
+ /* a4 */ 0x8ea2f2a6, 0x0000d8ee, 0x8eaecaf5, 0x0000f0a3,
+ /* a8 */ 0x0000f3b4, 0x8ea2e4e8, 0x8eaedde2, 0x8ea2eed3,
+ /* ac */ 0x8eaee1ae, 0x8eaee4b3, 0x8ea2f1e6, 0x8ea2b3cd,
+ /* b0 */ 0x8eaee2a8, 0x0000fdc8, 0x0000d8ef, 0x8ea2dbfe,
+ /* b4 */ 0x8eaed7be, 0x8ea2e4e9, 0x00000000, 0x8ea2e8b3,
+ /* b8 */ 0x8eaedde3, 0x00000000, 0x8ea2ecf3, 0x8ea2eed4,
+ /* bc */ 0x0000d8f0, 0x8eaec5e2, 0x8ea2cfc5, 0x8ea2cfc6,
+
+ /*** Three byte table, leaf: e9adxx - offset 0x05331 ***/
+
+ /* 80 */ 0x8eaecaf8, 0x0000ebf6, 0x0000ebf7, 0x8ea2d6a4,
+ /* 84 */ 0x0000f0a5, 0x0000f0a4, 0x8ea2d6a3, 0x00000000,
+ /* 88 */ 0x8ea2e0f5, 0x8eaed7bf, 0x8ea2e4ea, 0x8ea2e4ec,
+ /* 8c */ 0x8ea2e4eb, 0x0000f7fd, 0x0000f7fc, 0x0000f7fb,
+ /* 90 */ 0x8eaedde4, 0x0000fbca, 0x8ea2ecf4, 0x8eaedfa8,
+ /* 94 */ 0x0000fbc9, 0x8ea2eed6, 0x8ea2eed5, 0x8eaee1af,
+ /* 98 */ 0x0000fcf7, 0x8ea2f0e3, 0x0000dea3, 0x8ea2c8f0,
+ /* 9c */ 0x00000000, 0x8eaec5e3, 0x00000000, 0x8ea2cfc9,
+ /* a0 */ 0x8ea2cfc7, 0x8ea2cfc8, 0x00000000, 0x8eaecffe,
+ /* a4 */ 0x8ea2d6ad, 0x00000000, 0x8ea2d6a8, 0x8ea2d6a5,
+ /* a8 */ 0x8ea2d6ac, 0x8eaecffc, 0x00000000, 0x8eaecffb,
+ /* ac */ 0x8ea2d6ae, 0x00000000, 0x00000000, 0x0000f0a7,
+ /* b0 */ 0x8ea2d6ab, 0x8ea2d6a7, 0x8eaecffd, 0x00000000,
+ /* b4 */ 0x8ea2d6a6, 0x8ea2d6aa, 0x8ea2d6a9, 0x0000f0a6,
+ /* b8 */ 0x00000000, 0x00000000, 0x8ea2dcab, 0x8ea2dca6,
+ /* bc */ 0x8ea2dca4, 0x8ea2dcad, 0x8ea2dca5, 0x00000000,
+
+ /*** Three byte table, leaf: e9aexx - offset 0x05371 ***/
+
+ /* 80 */ 0x8ea2dca1, 0x00000000, 0x8ea2dca7, 0x8eaed3f8,
+ /* 84 */ 0x8eaed3fa, 0x8ea2dca2, 0x8ea2e0fe, 0x8ea2dca3,
+ /* 88 */ 0x8ea2dcae, 0x8eaed4a3, 0x00000000, 0x8eaed3fc,
+ /* 8c */ 0x8eaed4a1, 0x00000000, 0x8eaed4a5, 0x8eaed3fd,
+ /* 90 */ 0x8ea2dcaa, 0x0000f3b5, 0x8ea2dca9, 0x8ea2dca8,
+ /* 94 */ 0x8eaed3f9, 0x8ea2dcac, 0x00000000, 0x00000000,
+ /* 98 */ 0x8eaee6f3, 0x8eaed7c4, 0x8ea2e0f6, 0x8ea2e0f9,
+ /* 9c */ 0x00000000, 0x8eaed7c5, 0x8ea2e0f8, 0x8eaed7c0,
+ /* a0 */ 0x8ea2e1a2, 0x8ea2e0fb, 0x8ea2e1a1, 0x8eaed7c2,
+ /* a4 */ 0x8ea2e0fd, 0x8ea2e0fc, 0x8ea2e0fa, 0x00000000,
+ /* a8 */ 0x8ea2e0f7, 0x00000000, 0x0000f6af, 0x0000f6ae,
+ /* ac */ 0x00000000, 0x0000f6b0, 0x0000f6ad, 0x8ea2e1a3,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x8ea2e4f2, 0x8ea2e4f5, 0x00000000,
+ /* b8 */ 0x8ea2e4f3, 0x8ea2e4f7, 0x00000000, 0x8eaed9f4,
+ /* bc */ 0x00000000, 0x8ea2e4f8, 0x00000000, 0x8ea2e4f0,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x053b1 ***/
+
+ /* 80 */ 0x0000f8a4, 0x8ea2e4f1, 0x8eaed9f3, 0x8ea2e4ef,
+ /* 84 */ 0x8ea2e4f6, 0x8eaedbf4, 0x8ea2e4ee, 0x8ea2e4ed,
+ /* 88 */ 0x0000f8a3, 0x0000f8a1, 0x0000f7fe, 0x8eaed9f6,
+ /* 8c */ 0x8eaed9f5, 0x8eaed7c3, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x8eaed9f1, 0x8ea2e4f4,
+ /* 94 */ 0x8ea2e8bc, 0x8ea2e8c2, 0x0000f9d6, 0x8ea2e8bd,
+ /* 98 */ 0x00000000, 0x8ea2e8c0, 0x8ea2e8c4, 0x0000f9d7,
+ /* 9c */ 0x8ea2e8bf, 0x00000000, 0x8ea2e8b7, 0x8eaedbf5,
+ /* a0 */ 0x8ea2e8b6, 0x8ea2e8c3, 0x8ea2e8ba, 0x8eaedbf7,
+ /* a4 */ 0x8ea2e8b8, 0x8ea2e8c1, 0x8ea2e8b9, 0x0000f9d5,
+ /* a8 */ 0x0000f9d4, 0x8eaedbf9, 0x8ea2e8b4, 0x8ea2e8b5,
+ /* ac */ 0x8ea2e8be, 0x00000000, 0x8eaedbfa, 0x00000000,
+ /* b0 */ 0x8ea2e8bb, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x8eaeddef, 0x8ea2eafa,
+ /* b8 */ 0x8ea2eafd, 0x8eaeddf1, 0x00000000, 0x8eaedde7,
+ /* bc */ 0x8eaedde9, 0x0000f8a2, 0x8eaeddea, 0x8eaeddf4,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x053f1 ***/
+
+ /* 80 */ 0x8eaeddf5, 0x00000000, 0x8eaeddee, 0x00000000,
+ /* 84 */ 0x8eaedde8, 0x8ea2eafb, 0x8ea2eba3, 0x8ea2eba1,
+ /* 88 */ 0x8ea2eaf9, 0x8ea2eba6, 0x8eaedde6, 0x8ea2eaf8,
+ /* 8c */ 0x8eaeddf6, 0x0000fada, 0x8ea2eba2, 0x00000000,
+ /* 90 */ 0x8eaeddf3, 0x00000000, 0x8ea2eafc, 0x0000fad9,
+ /* 94 */ 0x8ea2eba5, 0x8eaeddf2, 0x00000000, 0x8ea2eba4,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x8eaeddf0,
+ /* 9c */ 0x8ea2ecf7, 0x8ea2ecf6, 0x00000000, 0x8eaedfac,
+ /* a0 */ 0x00000000, 0x8ea2ecfd, 0x00000000, 0x8ea2ecf9,
+ /* a4 */ 0x8ea2ecfc, 0x0000fbcc, 0x00000000, 0x8eaee4af,
+ /* a8 */ 0x8ea2ecfa, 0x8ea2ecfb, 0x00000000, 0x8ea2ecf5,
+ /* ac */ 0x8ea2ecf8, 0x0000fbcb, 0x8eaedfaa, 0x00000000,
+ /* b0 */ 0x00000000, 0x0000fcab, 0x8ea2eee1, 0x8ea2eedc,
+ /* b4 */ 0x8ea2eee0, 0x8eaee0a5, 0x8ea2eee3, 0x8ea2eedf,
+ /* b8 */ 0x8eaedffe, 0x8ea2eedb, 0x8eaee0a3, 0x0000fcad,
+ /* bc */ 0x8ea2eede, 0x8ea2eee2, 0x0000fcac, 0x8ea2eed9,
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x05431 ***/
+
+ /* 80 */ 0x8ea2eafe, 0x8ea2eedd, 0x00000000, 0x00000000,
+ /* 84 */ 0x8ea2eeda, 0x8eaee0a2, 0x8ea2eed7, 0x00000000,
+ /* 88 */ 0x8ea2eed8, 0x0000fcaa, 0x8ea2efe8, 0x8ea2efea,
+ /* 8c */ 0x8ea2efed, 0x8ea2efe9, 0x8ea2efee, 0x8eaee0e5,
+ /* 90 */ 0x8ea2efe7, 0x8eaee0e6, 0x8ea2efe5, 0x8eaee0e8,
+ /* 94 */ 0x0000fcd7, 0x8ea2efeb, 0x0000fcd9, 0x0000fcd8,
+ /* 98 */ 0x8ea2efe6, 0x8ea2efec, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x8eaee1b2, 0x8ea2f0e8, 0x0000fcf8,
+ /* a0 */ 0x8ea2f0e9, 0x8eaee1b3, 0x8ea2f0e7, 0x8ea2f0e4,
+ /* a4 */ 0x00000000, 0x8eaee1b4, 0x8ea2f0e6, 0x8ea2f0e5,
+ /* a8 */ 0x8ea2f1c9, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x8eaee1d9, 0x8ea2f1cb, 0x8ea2f1ca, 0x8eaee1db,
+ /* b0 */ 0x00000000, 0x8ea2f1e9, 0x00000000, 0x8ea2f1e8,
+ /* b4 */ 0x8ea2f1e7, 0x8ea2f1ea, 0x8eaee1f5, 0x0000fdc0,
+ /* b8 */ 0x0000fdc1, 0x8ea2f2b8, 0x8ea2f2bc, 0x8eaee2c1,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x0546d ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x0000dea4, 0x8ea2c1d4, 0x8ea2c8f3,
+ /* a8 */ 0x8eaec5e4, 0x0000e7ed, 0x8ea2c8f1, 0x8eaec5e6,
+ /* ac */ 0x8eaeafc2, 0x8ea2c8f2, 0x8eaec5e8, 0x8eaec5e7,
+ /* b0 */ 0x00000000, 0x8ea2cfca, 0x8ea2cfcb, 0x0000ebfa,
+ /* b4 */ 0x0000ebf8, 0x8ea2cfcc, 0x0000ebf9, 0x8ea2d6b3,
+ /* b8 */ 0x8eaed0a7, 0x8ea2d6b6, 0x8ea2d6b0, 0x8ea2d6b7,
+ /* bc */ 0x8ea2d6af, 0x8ea2d6b1, 0x8eaed0aa, 0x8ea2d6b2,
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x054ad ***/
+
+ /* 80 */ 0x8ea2d6b5, 0x8eaed0a4, 0x8eaed0ab, 0x0000f0aa,
+ /* 84 */ 0x8ea2d6ba, 0x8ea2d6b9, 0x0000f0a8, 0x8ea2d6b4,
+ /* 88 */ 0x8ea2d6b8, 0x0000f0a9, 0x8eaed4ad, 0x00000000,
+ /* 8c */ 0x8eaed0a5, 0x8eaed0a2, 0x00000000, 0x8eaed4aa,
+ /* 90 */ 0x8ea2dcb8, 0x00000000, 0x0000f3ba, 0x8eaed4ac,
+ /* 94 */ 0x8ea2dcb3, 0x0000f3b6, 0x8eaed4b6, 0x8ea2dcb0,
+ /* 98 */ 0x8ea2dcb6, 0x8ea2dcb9, 0x8eaed4b3, 0x0000f3bb,
+ /* 9c */ 0x00000000, 0x8ea2dcb5, 0x8ea2dcb2, 0x8ea2dcba,
+ /* a0 */ 0x8ea2dcb1, 0x8eaed4b7, 0x8ea2dcb7, 0x0000f3b7,
+ /* a4 */ 0x8eaed4a9, 0x8ea2dcaf, 0x0000f3b8, 0x8eaed4b5,
+ /* a8 */ 0x0000f3b9, 0x8ea2dcb4, 0x8eaed4b2, 0x00000000,
+ /* ac */ 0x00000000, 0x8ea2e1b5, 0x8ea2e1a8, 0x8ea2e1a9,
+ /* b0 */ 0x8ea2e1ac, 0x8ea2e1aa, 0x00000000, 0x8ea2e1a4,
+ /* b4 */ 0x00000000, 0x8eaed7cd, 0x8ea2e1a7, 0x8ea2e1b1,
+ /* b8 */ 0x8ea2e1ab, 0x8eaed7c8, 0x00000000, 0x0000f6b1,
+ /* bc */ 0x00000000, 0x8ea2e1b3, 0x8ea2e1b0, 0x0000f6b2,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x054ed ***/
+
+ /* 80 */ 0x8ea2e1b2, 0x8ea2e1a5, 0x8ea2e1ae, 0x8ea2e1af,
+ /* 84 */ 0x8eaed7ca, 0x8ea2e1ad, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x8eaee6f5, 0x8ea2e4fc, 0x8ea2e4fe,
+ /* 8c */ 0x8ea2e5a3, 0x8eaed9f9, 0x8eaed9fb, 0x8ea2e4fb,
+ /* 90 */ 0x8eaed9fd, 0x0000f8a5, 0x8ea2e5a5, 0x8ea2e4fa,
+ /* 94 */ 0x8ea2e5a6, 0x8eaed9fe, 0x8ea2e5a2, 0x8ea2e5a4,
+ /* 98 */ 0x8ea2e5a8, 0x8ea2e5a1, 0x8ea2e5a9, 0x8ea2e4fd,
+ /* 9c */ 0x8ea2e4f9, 0x0000f8a6, 0x8eaedaa2, 0x8ea2e5a7,
+ /* a0 */ 0x0000f8a7, 0x0000f9d9, 0x00000000, 0x8eaed9fa,
+ /* a4 */ 0x00000000, 0x00000000, 0x8eaedbfd, 0x8ea2e1a6,
+ /* a8 */ 0x8ea2e8de, 0x8ea2e8d5, 0x0000f9db, 0x8ea2e8d1,
+ /* ac */ 0x0000f9dc, 0x8eaedca7, 0x8eaedca2, 0x8ea2e8da,
+ /* b0 */ 0x8ea2e8d4, 0x8ea2e8ca, 0x0000f9da, 0x8ea2e8d7,
+ /* b4 */ 0x8ea2e8d2, 0x8ea2e8d3, 0x8eaedca5, 0x8ea2e8c5,
+ /* b8 */ 0x8ea2e8cc, 0x8ea2e8db, 0x8eaedbfe, 0x8ea2e8d8,
+ /* bc */ 0x00000000, 0x8ea2e8d0, 0x8eaedca6, 0x8ea2e8dc,
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x0552d ***/
+
+ /* 80 */ 0x8ea2e8cb, 0x8ea2e8c6, 0x8ea2e8d9, 0x8eaedca4,
+ /* 84 */ 0x8ea2e8c8, 0x8ea2e8d6, 0x8ea2e8cd, 0x8ea2e8dd,
+ /* 88 */ 0x8ea2e8c9, 0x0000f9d8, 0x8ea2e8c7, 0x8ea2e8ce,
+ /* 8c */ 0x8ea2e8cf, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x8ea2ebad, 0x8eaedca3, 0x8ea2ebab, 0x00000000,
+ /* 94 */ 0x8ea2ebb0, 0x8eaeddf9, 0x8ea2ebbc, 0x8ea2ebb3,
+ /* 98 */ 0x8ea2ebac, 0x8ea2eba8, 0x8ea2ebb5, 0x8ea2ebae,
+ /* 9c */ 0x8ea2ebb1, 0x8ea2ebaa, 0x8ea2ebb8, 0x8ea2eba7,
+ /* a0 */ 0x8ea2ebaf, 0x8ea2ebb4, 0x8ea2ebb6, 0x8ea2ebb9,
+ /* a4 */ 0x8ea2eba9, 0x8eaeddfa, 0x8ea2ebbd, 0x8ea2ebbe,
+ /* a8 */ 0x8ea2ebb7, 0x8ea2ebbb, 0x8ea2ebb2, 0x00000000,
+ /* ac */ 0x8ea2edaf, 0x8ea2edb2, 0x8eaedfb5, 0x0000fbcd,
+ /* b0 */ 0x8eaedfb1, 0x8ea2edb1, 0x8ea2edb6, 0x8ea2edb4,
+ /* b4 */ 0x0000fbce, 0x8ea2edab, 0x8ea2eda1, 0x8ea2ecfe,
+ /* b8 */ 0x0000fbd0, 0x8ea2edad, 0x8ea2edae, 0x8ea2edaa,
+ /* bc */ 0x8ea2eda2, 0x8eaedfb2, 0x8ea2eda7, 0x8ea2ebba,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x0556d ***/
+
+ /* 80 */ 0x00000000, 0x8ea2eda3, 0x0000fbcf, 0x8ea2eda9,
+ /* 84 */ 0x8eaedfb6, 0x8ea2eda8, 0x00000000, 0x8ea2eda4,
+ /* 88 */ 0x8ea2edb0, 0x00000000, 0x8ea2eda5, 0x8ea2eee8,
+ /* 8c */ 0x8ea2edb3, 0x8ea2edb5, 0x8ea2edac, 0x8ea2eda6,
+ /* 90 */ 0x8ea2eee9, 0x8ea2eeeb, 0x8ea2eee5, 0x0000fcae,
+ /* 94 */ 0x00000000, 0x8ea2eef2, 0x8ea2eef0, 0x0000fcaf,
+ /* 98 */ 0x8ea2eeef, 0x8ea2eeee, 0x8ea2eee7, 0x8ea2eee4,
+ /* 9c */ 0x8ea2eeea, 0x8ea2eef3, 0x8ea2eee6, 0x8ea2eeec,
+ /* a0 */ 0x00000000, 0x8ea2eff7, 0x8ea2effc, 0x8ea2eff2,
+ /* a4 */ 0x8ea2eff5, 0x0000fcda, 0x8ea2eff9, 0x00000000,
+ /* a8 */ 0x8ea2f0a2, 0x8ea2eeed, 0x00000000, 0x8ea2eff3,
+ /* ac */ 0x8ea2effd, 0x8ea2f0a3, 0x8ea2eff8, 0x8ea2eff1,
+ /* b0 */ 0x8ea2effb, 0x00000000, 0x8ea2effa, 0x8ea2f0a1,
+ /* b4 */ 0x8ea2effe, 0x8ea2eef1, 0x8ea2eff6, 0x8ea2eff0,
+ /* b8 */ 0x8ea2eff4, 0x0000fcf9, 0x0000fcfa, 0x8ea2efef,
+ /* bc */ 0x8eaee0ec, 0x8ea2f0f4, 0x8ea2f0eb, 0x8ea2f0f3,
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x055ad ***/
+
+ /* 80 */ 0x8ea2f0f0, 0x8ea2f0f1, 0x8ea2f0ea, 0x8ea2f0ed,
+ /* 84 */ 0x8ea2f0f5, 0x8ea2f0ef, 0x8ea2f0ee, 0x8ea2f0ec,
+ /* 88 */ 0x8eaee1b5, 0x8ea2f0f2, 0x00000000, 0x8ea2f1cc,
+ /* 8c */ 0x00000000, 0x8ea2f1cd, 0x8eaee1dd, 0x8ea2f1cf,
+ /* 90 */ 0x8ea2f1ce, 0x8ea2f1d1, 0x8ea2f1d0, 0x8ea2f1ec,
+ /* 94 */ 0x8ea2f1eb, 0x8ea2f2a7, 0x8eaee2a9, 0x8ea2f2a8,
+ /* 98 */ 0x8eaee2b0, 0x8ea2f2b4, 0x0000fdc5, 0x0000fdc9,
+ /* 9c */ 0x8eaee2b8, 0x8ea2f2bd, 0x0000fdca,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x055cc ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x0000dea5, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x0000fadb, 0x8ea2edb7, 0x8eaedfb7,
+ /* bc */ 0x0000fcfb, 0x0000fcfc, 0x00000000, 0x0000dea6,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x0560c ***/
+
+ /* 80 */ 0x8ea2c8f4, 0x8eaec5e9, 0x0000e7ee, 0x8ea2d6bb,
+ /* 84 */ 0x8eaed0ac, 0x8eaed4b9, 0x8ea2dcbc, 0x8ea2dcbd,
+ /* 88 */ 0x8ea2dcbb, 0x8ea2e1b7, 0x8ea2e1b6, 0x0000f6b3,
+ /* 8c */ 0x8ea2e5ab, 0x8ea2e1b8, 0x8ea2e5aa, 0x00000000,
+ /* 90 */ 0x8eaedaa4, 0x8ea2e8e0, 0x0000f9dd, 0x0000f9df,
+ /* 94 */ 0x8ea2e8df, 0x8eaedca9, 0x00000000, 0x0000f9de,
+ /* 98 */ 0x8eaedea1, 0x8ea2ebbf, 0x8ea2ebc1, 0x8ea2ebc0,
+ /* 9c */ 0x8ea2edb8, 0x0000fbd1, 0x8eaedfba, 0x0000fcdb,
+ /* a0 */ 0x8ea2f0f6, 0x8ea2f1d2, 0x8eaee2b1, 0x8eaee2bf,
+ /* a4 */ 0x8ea2f2c1, 0x0000dea7, 0x8eaea5c7, 0x8ea2cfcd,
+ /* a8 */ 0x00000000, 0x0000f0ab, 0x8eaed0af, 0x8eaed0ae,
+ /* ac */ 0x8eaed4ba, 0x8ea2dcbf, 0x8ea2dcbe, 0x8eaed7d0,
+ /* b0 */ 0x8ea2e1b9, 0x8eaedaa6, 0x8eaedaa5, 0x00000000,
+ /* b4 */ 0x0000f9e0, 0x0000fadc, 0x8ea2eef4, 0x8ea2f2b9,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x0000dea8,
+ /* bc */ 0x0000ebfb, 0x8eaecba2, 0x0000f0ac, 0x00000000,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x0564c ***/
+
+ /* 80 */ 0x8ea2e8e1, 0x8eaedea2, 0x8ea2f0a4, 0x0000e3a7,
+ /* 84 */ 0x8eaeb9ea, 0x8eaed4bc, 0x8eaed4bb, 0x00000000,
+ /* 88 */ 0x8ea2e1ba, 0x00000000, 0x8eaedaa8, 0x00000000,
+ /* 8c */ 0x0000fdb1, 0x0000e3a8, 0x0000f0ad, 0x0000f6b4,
+ /* 90 */ 0x8ea2f0a5, 0x0000e3a9, 0x8eaeb9eb, 0x8ea2d6bc,
+ /* 94 */ 0x0000f3bd, 0x8ea2dcc0, 0x8ea2dcc1, 0x8eaed4bd,
+ /* 98 */ 0x0000f3bc, 0x00000000, 0x8ea2e1bb, 0x0000f6b8,
+ /* 9c */ 0x0000f6b6, 0x0000f6b7, 0x0000f6b5, 0x8ea2e5ac,
+ /* a0 */ 0x0000f8a8, 0x00000000, 0x00000000, 0x8eaedcaa,
+ /* a4 */ 0x8ea2ebc3, 0x8ea2ebc2, 0x8ea2ebc5, 0x8ea2ebc4,
+ /* a8 */ 0x0000fadd, 0x00000000, 0x00000000, 0x8ea2edb9,
+ /* ac */ 0x00000000, 0x8ea2edbb, 0x8ea2edba, 0x0000fbd2,
+ /* b0 */ 0x8ea2eef5, 0x8eaee0a9, 0x8ea2f0a6, 0x8ea2f0a7,
+ /* b4 */ 0x0000fcdc, 0x8ea2f1d3, 0x8ea2f1ed, 0x0000fdc2,
+ /* b8 */ 0x00000000, 0x8ea2c1d5, 0x8ea2dcc2, 0x8ea2e1bc,
+ /* bc */ 0x8ea2e8e2, 0x8ea2c8f5, 0x8eaea7f2, 0x8ea2e1bd,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x0568c ***/
+
+ /* 80 */ 0x8ea2e5ae, 0x8ea2e5ad, 0x8eaedaa9, 0x8eaedcad,
+ /* 84 */ 0x8eaedcae, 0x8eaedfbc, 0x8ea2f0a8, 0x0000fcfd,
+ /* 88 */ 0x8eaee1df, 0x8ea2f1d4, 0x8ea2f1ee, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x0000e7ef, 0x8ea2d6bd,
+ /* 90 */ 0x8ea2d6be, 0x00000000, 0x8ea2dcc3, 0x0000e7f0,
+ /* 94 */ 0x8eaec5ea, 0x0000f8a9, 0x8ea2e5af, 0x8eaedcb0,
+ /* 98 */ 0x8ea2edbd, 0x0000fbd3, 0x8ea2edbe, 0x8ea2edbc,
+ /* 9c */ 0x8ea2f0a9, 0x8eaee1e0, 0x8ea2f0f7, 0x00000000,
+ /* a0 */ 0x0000e7f1, 0x00000000, 0x8ea2e1c0, 0x8ea2e1bf,
+ /* a4 */ 0x8ea2e1be, 0x8ea2e5b0, 0x8eaedaab, 0x8eaedaaa,
+ /* a8 */ 0x8ea2e5b4, 0x8ea2e5b3, 0x8ea2e5b2, 0x8ea2e5b1,
+ /* ac */ 0x0000f8aa, 0x8ea2e8e3, 0x8ea2ebc7, 0x0000fade,
+ /* b0 */ 0x8ea2ebc6, 0x8ea2edbf, 0x8ea2eef8, 0x8ea2eef7,
+ /* b4 */ 0x0000fcb0, 0x8ea2eef6, 0x8ea2f0ac, 0x8ea2f0ab,
+ /* b8 */ 0x8ea2f0aa, 0x8eaee0ed, 0x00000000, 0x0000ebfc,
+ /* bc */ 0x00000000, 0x8ea2dcc4, 0x0000f6b9, 0x00000000,
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x056cc ***/
+
+ /* 80 */ 0x8ea2e8e4, 0x8ea2e8e5, 0x8ea2eef9, 0x8ea2f0ad,
+ /* 84 */ 0x00000000, 0x8eaee1bb, 0x8ea2f0f8, 0x8ea2f1d5,
+ /* 88 */ 0x8ea2f2a9, 0x8ea2f2c3, 0x0000ebfd, 0x0000f6ba,
+ /* 8c */ 0x8ea2e5b5, 0x8ea2e8e6, 0x8ea2edc0, 0x8ea2f0ae,
+ /* 90 */ 0x8eaea3f0, 0x00000000, 0x0000f0af, 0x8eaed4be,
+ /* 94 */ 0x8ea2e1c1, 0x8ea2e5b6, 0x8ea2e8e7, 0x8ea2e8e8,
+ /* 98 */ 0x8ea2e8e9, 0x8ea2ebcc, 0x8eaedea4, 0x8ea2ebc8,
+ /* 9c */ 0x0000fbd4, 0x8ea2ebcb, 0x8ea2ebca, 0x0000fadf,
+ /* a0 */ 0x8ea2ebc9, 0x0000fae1, 0x00000000, 0x0000fae0,
+ /* a4 */ 0x8ea2edc2, 0x8ea2edc1, 0x0000fbd5, 0x0000fbd6,
+ /* a8 */ 0x00000000, 0x8eaedfbe, 0x0000fcb2, 0x8ea2eefa,
+ /* ac */ 0x0000fcb1, 0x00000000, 0x8ea2f0b1, 0x8ea2f0b2,
+ /* b0 */ 0x8ea2f0b0, 0x8ea2f0af, 0x0000fda1, 0x00000000,
+ /* b4 */ 0x8ea2f0f9, 0x8ea2f0fa, 0x8ea2f0fb, 0x0000fcfe,
+ /* b8 */ 0x8ea2f1d6, 0x8ea2f1d9, 0x8ea2f1d8, 0x8ea2f1d7,
+ /* bc */ 0x8eaee2b3, 0x00000000, 0x8ea2f2c2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x0570b ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x0000f3be, 0x8eaed7d5, 0x00000000,
+ /* 90 */ 0x0000f8b2, 0x8ea2ebcd, 0x8ea2edc3, 0x8eaee0ab,
+ /* 94 */ 0x0000fcb3, 0x8ea2eefb, 0x00000000, 0x8eaee2c2,
+ /* 98 */ 0x8ea2f2c4, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x0000f3bf, 0x8eaedec7, 0x00000000, 0x00000000,
+ /* a0 */ 0x8ea2e1c2, 0x8eaedfbf, 0x8ea2eefc, 0x8eaee1e1,
+ /* a4 */ 0x8ea2f1ef, 0x8eaee1f7,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb8xx - offset 0x05731 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000a1ab, 0x0000a1b6, 0x0000a1b8, 0x00000000,
+ /* b4 */ 0x00000000, 0x0000a1c0, 0x0000a1c1, 0x0000a1c4,
+ /* b8 */ 0x0000a1c5, 0x0000a1c8, 0x0000a1c9, 0x0000a1cc,
+ /* bc */ 0x0000a1cd, 0x0000a1d0, 0x0000a1d1, 0x0000a1d4,
+
+ /*** Three byte table, leaf: efb9xx - offset 0x05771 ***/
+
+ /* 80 */ 0x0000a1d5, 0x0000a1d8, 0x0000a1d9, 0x0000a1dc,
+ /* 84 */ 0x0000a1dd, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x0000a2a7, 0x0000a2a8, 0x0000a2ab,
+ /* 8c */ 0x0000a2ac, 0x0000a2a9, 0x0000a2aa, 0x00000000,
+ /* 90 */ 0x0000a1ae, 0x0000a1af, 0x0000a1b0, 0x00000000,
+ /* 94 */ 0x0000a1b2, 0x0000a1b3, 0x0000a1b4, 0x0000a1b5,
+ /* 98 */ 0x00000000, 0x0000a1de, 0x0000a1df, 0x0000a1e0,
+ /* 9c */ 0x0000a1e1, 0x0000a1e2, 0x0000a1e3, 0x0000a2ad,
+ /* a0 */ 0x0000a2ae, 0x0000a2af, 0x0000a2bf, 0x0000a2c0,
+ /* a4 */ 0x0000a2c1, 0x0000a2c3, 0x0000a2c2, 0x00000000,
+ /* a8 */ 0x0000a2e2, 0x0000a2ec, 0x0000a2ed, 0x0000a2ee,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x057b0 ***/
+
+ /* 80 */ 0x00000000, 0x0000a1aa, 0x00000000, 0x0000a1ec,
+ /* 84 */ 0x0000a2e3, 0x0000a2e8, 0x0000a1ed, 0x00000000,
+ /* 88 */ 0x0000a1be, 0x0000a1bf, 0x0000a1ee, 0x0000a2b0,
+ /* 8c */ 0x0000a1a2, 0x0000a2b1, 0x0000a1a5, 0x0000a2df,
+ /* 90 */ 0x0000a4a1, 0x0000a4a2, 0x0000a4a3, 0x0000a4a4,
+ /* 94 */ 0x0000a4a5, 0x0000a4a6, 0x0000a4a7, 0x0000a4a8,
+ /* 98 */ 0x0000a4a9, 0x0000a4aa, 0x0000a1a8, 0x0000a1a7,
+ /* 9c */ 0x0000a2b6, 0x0000a2b8, 0x0000a2b7, 0x0000a1a9,
+ /* a0 */ 0x0000a2e9, 0x0000a4c1, 0x0000a4c2, 0x0000a4c3,
+ /* a4 */ 0x0000a4c4, 0x0000a4c5, 0x0000a4c6, 0x0000a4c7,
+ /* a8 */ 0x0000a4c8, 0x0000a4c9, 0x0000a4ca, 0x0000a4cb,
+ /* ac */ 0x0000a4cc, 0x0000a4cd, 0x0000a4ce, 0x0000a4cf,
+ /* b0 */ 0x0000a4d0, 0x0000a4d1, 0x0000a4d2, 0x0000a4d3,
+ /* b4 */ 0x0000a4d4, 0x0000a4d5, 0x0000a4d6, 0x0000a4d7,
+ /* b8 */ 0x0000a4d8, 0x0000a4d9, 0x0000a4da, 0x00000000,
+ /* bc */ 0x0000a2e0, 0x00000000, 0x00000000, 0x0000a2a5,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x057f0 ***/
+
+ /* 80 */ 0x00000000, 0x0000a4db, 0x0000a4dc, 0x0000a4dd,
+ /* 84 */ 0x0000a4de, 0x0000a4df, 0x0000a4e0, 0x0000a4e1,
+ /* 88 */ 0x0000a4e2, 0x0000a4e3, 0x0000a4e4, 0x0000a4e5,
+ /* 8c */ 0x0000a4e6, 0x0000a4e7, 0x0000a4e8, 0x0000a4e9,
+ /* 90 */ 0x0000a4ea, 0x0000a4eb, 0x0000a4ec, 0x0000a4ed,
+ /* 94 */ 0x0000a4ee, 0x0000a4ef, 0x0000a4f0, 0x0000a4f1,
+ /* 98 */ 0x0000a4f2, 0x0000a4f3, 0x0000a4f4, 0x0000a1c2,
+ /* 9c */ 0x0000a2de, 0x0000a1c3, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x05830 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x0000a2e6, 0x0000a2e7, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x0000a2e4, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_gb18030.map b/src/backend/utils/mb/Unicode/utf8_to_gb18030.map
new file mode 100644
index 0000000..6c6b660
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_gb18030.map
@@ -0,0 +1,9561 @@
+/* src/backend/utils/mb/Unicode/utf8_to_gb18030.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_GB18030.pl */
+
+static const uint32 gb18030_from_unicode_tree_table[31972];
+
+static const pg_mb_radix_tree gb18030_from_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ gb18030_from_unicode_tree_table,
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0450, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 gb18030_from_unicode_tree_table[31972] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 04 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 08 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 0c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 10 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 14 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 18 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 1c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 20 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 24 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 28 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 2c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 30 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 34 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 38 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 3c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x00000050, 0x00000090, 0x000000d0, 0x00000110,
+ /* c6 */ 0x00000150, 0x00000190, 0x000001d0, 0x00000210,
+ /* ca */ 0x00000250, 0x00000290, 0x000002d0, 0x00000310,
+ /* ce */ 0x00000350, 0x00000390, 0x000003d0, 0x00000410,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x81308130, 0x81308131, 0x81308132, 0x81308133,
+ /* 84 */ 0x81308134, 0x81308135, 0x81308136, 0x81308137,
+ /* 88 */ 0x81308138, 0x81308139, 0x81308230, 0x81308231,
+ /* 8c */ 0x81308232, 0x81308233, 0x81308234, 0x81308235,
+ /* 90 */ 0x81308236, 0x81308237, 0x81308238, 0x81308239,
+ /* 94 */ 0x81308330, 0x81308331, 0x81308332, 0x81308333,
+ /* 98 */ 0x81308334, 0x81308335, 0x81308336, 0x81308337,
+ /* 9c */ 0x81308338, 0x81308339, 0x81308430, 0x81308431,
+ /* a0 */ 0x81308432, 0x81308433, 0x81308434, 0x81308435,
+ /* a4 */ 0x0000a1e8, 0x81308436, 0x81308437, 0x0000a1ec,
+ /* a8 */ 0x0000a1a7, 0x81308438, 0x81308439, 0x81308530,
+ /* ac */ 0x81308531, 0x81308532, 0x81308533, 0x81308534,
+ /* b0 */ 0x0000a1e3, 0x0000a1c0, 0x81308535, 0x81308536,
+ /* b4 */ 0x81308537, 0x81308538, 0x81308539, 0x0000a1a4,
+ /* b8 */ 0x81308630, 0x81308631, 0x81308632, 0x81308633,
+ /* bc */ 0x81308634, 0x81308635, 0x81308636, 0x81308637,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x81308638, 0x81308639, 0x81308730, 0x81308731,
+ /* 84 */ 0x81308732, 0x81308733, 0x81308734, 0x81308735,
+ /* 88 */ 0x81308736, 0x81308737, 0x81308738, 0x81308739,
+ /* 8c */ 0x81308830, 0x81308831, 0x81308832, 0x81308833,
+ /* 90 */ 0x81308834, 0x81308835, 0x81308836, 0x81308837,
+ /* 94 */ 0x81308838, 0x81308839, 0x81308930, 0x0000a1c1,
+ /* 98 */ 0x81308931, 0x81308932, 0x81308933, 0x81308934,
+ /* 9c */ 0x81308935, 0x81308936, 0x81308937, 0x81308938,
+ /* a0 */ 0x0000a8a4, 0x0000a8a2, 0x81308939, 0x81308a30,
+ /* a4 */ 0x81308a31, 0x81308a32, 0x81308a33, 0x81308a34,
+ /* a8 */ 0x0000a8a8, 0x0000a8a6, 0x0000a8ba, 0x81308a35,
+ /* ac */ 0x0000a8ac, 0x0000a8aa, 0x81308a36, 0x81308a37,
+ /* b0 */ 0x81308a38, 0x81308a39, 0x0000a8b0, 0x0000a8ae,
+ /* b4 */ 0x81308b30, 0x81308b31, 0x81308b32, 0x0000a1c2,
+ /* b8 */ 0x81308b33, 0x0000a8b4, 0x0000a8b2, 0x81308b34,
+ /* bc */ 0x0000a8b9, 0x81308b35, 0x81308b36, 0x81308b37,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000d0 ***/
+
+ /* 80 */ 0x81308b38, 0x0000a8a1, 0x81308b39, 0x81308c30,
+ /* 84 */ 0x81308c31, 0x81308c32, 0x81308c33, 0x81308c34,
+ /* 88 */ 0x81308c35, 0x81308c36, 0x81308c37, 0x81308c38,
+ /* 8c */ 0x81308c39, 0x81308d30, 0x81308d31, 0x81308d32,
+ /* 90 */ 0x81308d33, 0x81308d34, 0x81308d35, 0x0000a8a5,
+ /* 94 */ 0x81308d36, 0x81308d37, 0x81308d38, 0x81308d39,
+ /* 98 */ 0x81308e30, 0x81308e31, 0x81308e32, 0x0000a8a7,
+ /* 9c */ 0x81308e33, 0x81308e34, 0x81308e35, 0x81308e36,
+ /* a0 */ 0x81308e37, 0x81308e38, 0x81308e39, 0x81308f30,
+ /* a4 */ 0x81308f31, 0x81308f32, 0x81308f33, 0x81308f34,
+ /* a8 */ 0x81308f35, 0x81308f36, 0x81308f37, 0x0000a8a9,
+ /* ac */ 0x81308f38, 0x81308f39, 0x81309030, 0x81309031,
+ /* b0 */ 0x81309032, 0x81309033, 0x81309034, 0x81309035,
+ /* b4 */ 0x81309036, 0x81309037, 0x81309038, 0x81309039,
+ /* b8 */ 0x81309130, 0x81309131, 0x81309132, 0x81309133,
+ /* bc */ 0x81309134, 0x81309135, 0x81309136, 0x81309137,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00110 ***/
+
+ /* 80 */ 0x81309138, 0x81309139, 0x81309230, 0x81309231,
+ /* 84 */ 0x0000a8bd, 0x81309232, 0x81309233, 0x81309234,
+ /* 88 */ 0x0000a8be, 0x81309235, 0x81309236, 0x81309237,
+ /* 8c */ 0x81309238, 0x0000a8ad, 0x81309239, 0x81309330,
+ /* 90 */ 0x81309331, 0x81309332, 0x81309333, 0x81309334,
+ /* 94 */ 0x81309335, 0x81309336, 0x81309337, 0x81309338,
+ /* 98 */ 0x81309339, 0x81309430, 0x81309431, 0x81309432,
+ /* 9c */ 0x81309433, 0x81309434, 0x81309435, 0x81309436,
+ /* a0 */ 0x81309437, 0x81309438, 0x81309439, 0x81309530,
+ /* a4 */ 0x81309531, 0x81309532, 0x81309533, 0x81309534,
+ /* a8 */ 0x81309535, 0x81309536, 0x81309537, 0x0000a8b1,
+ /* ac */ 0x81309538, 0x81309539, 0x81309630, 0x81309631,
+ /* b0 */ 0x81309632, 0x81309633, 0x81309634, 0x81309635,
+ /* b4 */ 0x81309636, 0x81309637, 0x81309638, 0x81309639,
+ /* b8 */ 0x81309730, 0x81309731, 0x81309732, 0x81309733,
+ /* bc */ 0x81309734, 0x81309735, 0x81309736, 0x81309737,
+
+ /*** Two byte table, leaf: c6xx - offset 0x00150 ***/
+
+ /* 80 */ 0x81309738, 0x81309739, 0x81309830, 0x81309831,
+ /* 84 */ 0x81309832, 0x81309833, 0x81309834, 0x81309835,
+ /* 88 */ 0x81309836, 0x81309837, 0x81309838, 0x81309839,
+ /* 8c */ 0x81309930, 0x81309931, 0x81309932, 0x81309933,
+ /* 90 */ 0x81309934, 0x81309935, 0x81309936, 0x81309937,
+ /* 94 */ 0x81309938, 0x81309939, 0x81309a30, 0x81309a31,
+ /* 98 */ 0x81309a32, 0x81309a33, 0x81309a34, 0x81309a35,
+ /* 9c */ 0x81309a36, 0x81309a37, 0x81309a38, 0x81309a39,
+ /* a0 */ 0x81309b30, 0x81309b31, 0x81309b32, 0x81309b33,
+ /* a4 */ 0x81309b34, 0x81309b35, 0x81309b36, 0x81309b37,
+ /* a8 */ 0x81309b38, 0x81309b39, 0x81309c30, 0x81309c31,
+ /* ac */ 0x81309c32, 0x81309c33, 0x81309c34, 0x81309c35,
+ /* b0 */ 0x81309c36, 0x81309c37, 0x81309c38, 0x81309c39,
+ /* b4 */ 0x81309d30, 0x81309d31, 0x81309d32, 0x81309d33,
+ /* b8 */ 0x81309d34, 0x81309d35, 0x81309d36, 0x81309d37,
+ /* bc */ 0x81309d38, 0x81309d39, 0x81309e30, 0x81309e31,
+
+ /*** Two byte table, leaf: c7xx - offset 0x00190 ***/
+
+ /* 80 */ 0x81309e32, 0x81309e33, 0x81309e34, 0x81309e35,
+ /* 84 */ 0x81309e36, 0x81309e37, 0x81309e38, 0x81309e39,
+ /* 88 */ 0x81309f30, 0x81309f31, 0x81309f32, 0x81309f33,
+ /* 8c */ 0x81309f34, 0x81309f35, 0x0000a8a3, 0x81309f36,
+ /* 90 */ 0x0000a8ab, 0x81309f37, 0x0000a8af, 0x81309f38,
+ /* 94 */ 0x0000a8b3, 0x81309f39, 0x0000a8b5, 0x8130a030,
+ /* 98 */ 0x0000a8b6, 0x8130a031, 0x0000a8b7, 0x8130a032,
+ /* 9c */ 0x0000a8b8, 0x8130a033, 0x8130a034, 0x8130a035,
+ /* a0 */ 0x8130a036, 0x8130a037, 0x8130a038, 0x8130a039,
+ /* a4 */ 0x8130a130, 0x8130a131, 0x8130a132, 0x8130a133,
+ /* a8 */ 0x8130a134, 0x8130a135, 0x8130a136, 0x8130a137,
+ /* ac */ 0x8130a138, 0x8130a139, 0x8130a230, 0x8130a231,
+ /* b0 */ 0x8130a232, 0x8130a233, 0x8130a234, 0x8130a235,
+ /* b4 */ 0x8130a236, 0x8130a237, 0x8130a238, 0x8130a239,
+ /* b8 */ 0x8130a330, 0x0000a8bf, 0x8130a331, 0x8130a332,
+ /* bc */ 0x8130a333, 0x8130a334, 0x8130a335, 0x8130a336,
+
+ /*** Two byte table, leaf: c8xx - offset 0x001d0 ***/
+
+ /* 80 */ 0x8130a337, 0x8130a338, 0x8130a339, 0x8130a430,
+ /* 84 */ 0x8130a431, 0x8130a432, 0x8130a433, 0x8130a434,
+ /* 88 */ 0x8130a435, 0x8130a436, 0x8130a437, 0x8130a438,
+ /* 8c */ 0x8130a439, 0x8130a530, 0x8130a531, 0x8130a532,
+ /* 90 */ 0x8130a533, 0x8130a534, 0x8130a535, 0x8130a536,
+ /* 94 */ 0x8130a537, 0x8130a538, 0x8130a539, 0x8130a630,
+ /* 98 */ 0x8130a631, 0x8130a632, 0x8130a633, 0x8130a634,
+ /* 9c */ 0x8130a635, 0x8130a636, 0x8130a637, 0x8130a638,
+ /* a0 */ 0x8130a639, 0x8130a730, 0x8130a731, 0x8130a732,
+ /* a4 */ 0x8130a733, 0x8130a734, 0x8130a735, 0x8130a736,
+ /* a8 */ 0x8130a737, 0x8130a738, 0x8130a739, 0x8130a830,
+ /* ac */ 0x8130a831, 0x8130a832, 0x8130a833, 0x8130a834,
+ /* b0 */ 0x8130a835, 0x8130a836, 0x8130a837, 0x8130a838,
+ /* b4 */ 0x8130a839, 0x8130a930, 0x8130a931, 0x8130a932,
+ /* b8 */ 0x8130a933, 0x8130a934, 0x8130a935, 0x8130a936,
+ /* bc */ 0x8130a937, 0x8130a938, 0x8130a939, 0x8130aa30,
+
+ /*** Two byte table, leaf: c9xx - offset 0x00210 ***/
+
+ /* 80 */ 0x8130aa31, 0x8130aa32, 0x8130aa33, 0x8130aa34,
+ /* 84 */ 0x8130aa35, 0x8130aa36, 0x8130aa37, 0x8130aa38,
+ /* 88 */ 0x8130aa39, 0x8130ab30, 0x8130ab31, 0x8130ab32,
+ /* 8c */ 0x8130ab33, 0x8130ab34, 0x8130ab35, 0x8130ab36,
+ /* 90 */ 0x8130ab37, 0x0000a8bb, 0x8130ab38, 0x8130ab39,
+ /* 94 */ 0x8130ac30, 0x8130ac31, 0x8130ac32, 0x8130ac33,
+ /* 98 */ 0x8130ac34, 0x8130ac35, 0x8130ac36, 0x8130ac37,
+ /* 9c */ 0x8130ac38, 0x8130ac39, 0x8130ad30, 0x8130ad31,
+ /* a0 */ 0x8130ad32, 0x0000a8c0, 0x8130ad33, 0x8130ad34,
+ /* a4 */ 0x8130ad35, 0x8130ad36, 0x8130ad37, 0x8130ad38,
+ /* a8 */ 0x8130ad39, 0x8130ae30, 0x8130ae31, 0x8130ae32,
+ /* ac */ 0x8130ae33, 0x8130ae34, 0x8130ae35, 0x8130ae36,
+ /* b0 */ 0x8130ae37, 0x8130ae38, 0x8130ae39, 0x8130af30,
+ /* b4 */ 0x8130af31, 0x8130af32, 0x8130af33, 0x8130af34,
+ /* b8 */ 0x8130af35, 0x8130af36, 0x8130af37, 0x8130af38,
+ /* bc */ 0x8130af39, 0x8130b030, 0x8130b031, 0x8130b032,
+
+ /*** Two byte table, leaf: caxx - offset 0x00250 ***/
+
+ /* 80 */ 0x8130b033, 0x8130b034, 0x8130b035, 0x8130b036,
+ /* 84 */ 0x8130b037, 0x8130b038, 0x8130b039, 0x8130b130,
+ /* 88 */ 0x8130b131, 0x8130b132, 0x8130b133, 0x8130b134,
+ /* 8c */ 0x8130b135, 0x8130b136, 0x8130b137, 0x8130b138,
+ /* 90 */ 0x8130b139, 0x8130b230, 0x8130b231, 0x8130b232,
+ /* 94 */ 0x8130b233, 0x8130b234, 0x8130b235, 0x8130b236,
+ /* 98 */ 0x8130b237, 0x8130b238, 0x8130b239, 0x8130b330,
+ /* 9c */ 0x8130b331, 0x8130b332, 0x8130b333, 0x8130b334,
+ /* a0 */ 0x8130b335, 0x8130b336, 0x8130b337, 0x8130b338,
+ /* a4 */ 0x8130b339, 0x8130b430, 0x8130b431, 0x8130b432,
+ /* a8 */ 0x8130b433, 0x8130b434, 0x8130b435, 0x8130b436,
+ /* ac */ 0x8130b437, 0x8130b438, 0x8130b439, 0x8130b530,
+ /* b0 */ 0x8130b531, 0x8130b532, 0x8130b533, 0x8130b534,
+ /* b4 */ 0x8130b535, 0x8130b536, 0x8130b537, 0x8130b538,
+ /* b8 */ 0x8130b539, 0x8130b630, 0x8130b631, 0x8130b632,
+ /* bc */ 0x8130b633, 0x8130b634, 0x8130b635, 0x8130b636,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00290 ***/
+
+ /* 80 */ 0x8130b637, 0x8130b638, 0x8130b639, 0x8130b730,
+ /* 84 */ 0x8130b731, 0x8130b732, 0x8130b733, 0x0000a1a6,
+ /* 88 */ 0x8130b734, 0x0000a1a5, 0x0000a840, 0x0000a841,
+ /* 8c */ 0x8130b735, 0x8130b736, 0x8130b737, 0x8130b738,
+ /* 90 */ 0x8130b739, 0x8130b830, 0x8130b831, 0x8130b832,
+ /* 94 */ 0x8130b833, 0x8130b834, 0x8130b835, 0x8130b836,
+ /* 98 */ 0x8130b837, 0x0000a842, 0x8130b838, 0x8130b839,
+ /* 9c */ 0x8130b930, 0x8130b931, 0x8130b932, 0x8130b933,
+ /* a0 */ 0x8130b934, 0x8130b935, 0x8130b936, 0x8130b937,
+ /* a4 */ 0x8130b938, 0x8130b939, 0x8130ba30, 0x8130ba31,
+ /* a8 */ 0x8130ba32, 0x8130ba33, 0x8130ba34, 0x8130ba35,
+ /* ac */ 0x8130ba36, 0x8130ba37, 0x8130ba38, 0x8130ba39,
+ /* b0 */ 0x8130bb30, 0x8130bb31, 0x8130bb32, 0x8130bb33,
+ /* b4 */ 0x8130bb34, 0x8130bb35, 0x8130bb36, 0x8130bb37,
+ /* b8 */ 0x8130bb38, 0x8130bb39, 0x8130bc30, 0x8130bc31,
+ /* bc */ 0x8130bc32, 0x8130bc33, 0x8130bc34, 0x8130bc35,
+
+ /*** Two byte table, leaf: ccxx - offset 0x002d0 ***/
+
+ /* 80 */ 0x8130bc36, 0x8130bc37, 0x8130bc38, 0x8130bc39,
+ /* 84 */ 0x8130bd30, 0x8130bd31, 0x8130bd32, 0x8130bd33,
+ /* 88 */ 0x8130bd34, 0x8130bd35, 0x8130bd36, 0x8130bd37,
+ /* 8c */ 0x8130bd38, 0x8130bd39, 0x8130be30, 0x8130be31,
+ /* 90 */ 0x8130be32, 0x8130be33, 0x8130be34, 0x8130be35,
+ /* 94 */ 0x8130be36, 0x8130be37, 0x8130be38, 0x8130be39,
+ /* 98 */ 0x8130bf30, 0x8130bf31, 0x8130bf32, 0x8130bf33,
+ /* 9c */ 0x8130bf34, 0x8130bf35, 0x8130bf36, 0x8130bf37,
+ /* a0 */ 0x8130bf38, 0x8130bf39, 0x8130c030, 0x8130c031,
+ /* a4 */ 0x8130c032, 0x8130c033, 0x8130c034, 0x8130c035,
+ /* a8 */ 0x8130c036, 0x8130c037, 0x8130c038, 0x8130c039,
+ /* ac */ 0x8130c130, 0x8130c131, 0x8130c132, 0x8130c133,
+ /* b0 */ 0x8130c134, 0x8130c135, 0x8130c136, 0x8130c137,
+ /* b4 */ 0x8130c138, 0x8130c139, 0x8130c230, 0x8130c231,
+ /* b8 */ 0x8130c232, 0x8130c233, 0x8130c234, 0x8130c235,
+ /* bc */ 0x8130c236, 0x8130c237, 0x8130c238, 0x8130c239,
+
+ /*** Two byte table, leaf: cdxx - offset 0x00310 ***/
+
+ /* 80 */ 0x8130c330, 0x8130c331, 0x8130c332, 0x8130c333,
+ /* 84 */ 0x8130c334, 0x8130c335, 0x8130c336, 0x8130c337,
+ /* 88 */ 0x8130c338, 0x8130c339, 0x8130c430, 0x8130c431,
+ /* 8c */ 0x8130c432, 0x8130c433, 0x8130c434, 0x8130c435,
+ /* 90 */ 0x8130c436, 0x8130c437, 0x8130c438, 0x8130c439,
+ /* 94 */ 0x8130c530, 0x8130c531, 0x8130c532, 0x8130c533,
+ /* 98 */ 0x8130c534, 0x8130c535, 0x8130c536, 0x8130c537,
+ /* 9c */ 0x8130c538, 0x8130c539, 0x8130c630, 0x8130c631,
+ /* a0 */ 0x8130c632, 0x8130c633, 0x8130c634, 0x8130c635,
+ /* a4 */ 0x8130c636, 0x8130c637, 0x8130c638, 0x8130c639,
+ /* a8 */ 0x8130c730, 0x8130c731, 0x8130c732, 0x8130c733,
+ /* ac */ 0x8130c734, 0x8130c735, 0x8130c736, 0x8130c737,
+ /* b0 */ 0x8130c738, 0x8130c739, 0x8130c830, 0x8130c831,
+ /* b4 */ 0x8130c832, 0x8130c833, 0x8130c834, 0x8130c835,
+ /* b8 */ 0x8130c836, 0x8130c837, 0x8130c838, 0x8130c839,
+ /* bc */ 0x8130c930, 0x8130c931, 0x8130c932, 0x8130c933,
+
+ /*** Two byte table, leaf: cexx - offset 0x00350 ***/
+
+ /* 80 */ 0x8130c934, 0x8130c935, 0x8130c936, 0x8130c937,
+ /* 84 */ 0x8130c938, 0x8130c939, 0x8130ca30, 0x8130ca31,
+ /* 88 */ 0x8130ca32, 0x8130ca33, 0x8130ca34, 0x8130ca35,
+ /* 8c */ 0x8130ca36, 0x8130ca37, 0x8130ca38, 0x8130ca39,
+ /* 90 */ 0x8130cb30, 0x0000a6a1, 0x0000a6a2, 0x0000a6a3,
+ /* 94 */ 0x0000a6a4, 0x0000a6a5, 0x0000a6a6, 0x0000a6a7,
+ /* 98 */ 0x0000a6a8, 0x0000a6a9, 0x0000a6aa, 0x0000a6ab,
+ /* 9c */ 0x0000a6ac, 0x0000a6ad, 0x0000a6ae, 0x0000a6af,
+ /* a0 */ 0x0000a6b0, 0x0000a6b1, 0x8130cb31, 0x0000a6b2,
+ /* a4 */ 0x0000a6b3, 0x0000a6b4, 0x0000a6b5, 0x0000a6b6,
+ /* a8 */ 0x0000a6b7, 0x0000a6b8, 0x8130cb32, 0x8130cb33,
+ /* ac */ 0x8130cb34, 0x8130cb35, 0x8130cb36, 0x8130cb37,
+ /* b0 */ 0x8130cb38, 0x0000a6c1, 0x0000a6c2, 0x0000a6c3,
+ /* b4 */ 0x0000a6c4, 0x0000a6c5, 0x0000a6c6, 0x0000a6c7,
+ /* b8 */ 0x0000a6c8, 0x0000a6c9, 0x0000a6ca, 0x0000a6cb,
+ /* bc */ 0x0000a6cc, 0x0000a6cd, 0x0000a6ce, 0x0000a6cf,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00390 ***/
+
+ /* 80 */ 0x0000a6d0, 0x0000a6d1, 0x8130cb39, 0x0000a6d2,
+ /* 84 */ 0x0000a6d3, 0x0000a6d4, 0x0000a6d5, 0x0000a6d6,
+ /* 88 */ 0x0000a6d7, 0x0000a6d8, 0x8130cc30, 0x8130cc31,
+ /* 8c */ 0x8130cc32, 0x8130cc33, 0x8130cc34, 0x8130cc35,
+ /* 90 */ 0x8130cc36, 0x8130cc37, 0x8130cc38, 0x8130cc39,
+ /* 94 */ 0x8130cd30, 0x8130cd31, 0x8130cd32, 0x8130cd33,
+ /* 98 */ 0x8130cd34, 0x8130cd35, 0x8130cd36, 0x8130cd37,
+ /* 9c */ 0x8130cd38, 0x8130cd39, 0x8130ce30, 0x8130ce31,
+ /* a0 */ 0x8130ce32, 0x8130ce33, 0x8130ce34, 0x8130ce35,
+ /* a4 */ 0x8130ce36, 0x8130ce37, 0x8130ce38, 0x8130ce39,
+ /* a8 */ 0x8130cf30, 0x8130cf31, 0x8130cf32, 0x8130cf33,
+ /* ac */ 0x8130cf34, 0x8130cf35, 0x8130cf36, 0x8130cf37,
+ /* b0 */ 0x8130cf38, 0x8130cf39, 0x8130d030, 0x8130d031,
+ /* b4 */ 0x8130d032, 0x8130d033, 0x8130d034, 0x8130d035,
+ /* b8 */ 0x8130d036, 0x8130d037, 0x8130d038, 0x8130d039,
+ /* bc */ 0x8130d130, 0x8130d131, 0x8130d132, 0x8130d133,
+
+ /*** Two byte table, leaf: d0xx - offset 0x003d0 ***/
+
+ /* 80 */ 0x8130d134, 0x0000a7a7, 0x8130d135, 0x8130d136,
+ /* 84 */ 0x8130d137, 0x8130d138, 0x8130d139, 0x8130d230,
+ /* 88 */ 0x8130d231, 0x8130d232, 0x8130d233, 0x8130d234,
+ /* 8c */ 0x8130d235, 0x8130d236, 0x8130d237, 0x8130d238,
+ /* 90 */ 0x0000a7a1, 0x0000a7a2, 0x0000a7a3, 0x0000a7a4,
+ /* 94 */ 0x0000a7a5, 0x0000a7a6, 0x0000a7a8, 0x0000a7a9,
+ /* 98 */ 0x0000a7aa, 0x0000a7ab, 0x0000a7ac, 0x0000a7ad,
+ /* 9c */ 0x0000a7ae, 0x0000a7af, 0x0000a7b0, 0x0000a7b1,
+ /* a0 */ 0x0000a7b2, 0x0000a7b3, 0x0000a7b4, 0x0000a7b5,
+ /* a4 */ 0x0000a7b6, 0x0000a7b7, 0x0000a7b8, 0x0000a7b9,
+ /* a8 */ 0x0000a7ba, 0x0000a7bb, 0x0000a7bc, 0x0000a7bd,
+ /* ac */ 0x0000a7be, 0x0000a7bf, 0x0000a7c0, 0x0000a7c1,
+ /* b0 */ 0x0000a7d1, 0x0000a7d2, 0x0000a7d3, 0x0000a7d4,
+ /* b4 */ 0x0000a7d5, 0x0000a7d6, 0x0000a7d8, 0x0000a7d9,
+ /* b8 */ 0x0000a7da, 0x0000a7db, 0x0000a7dc, 0x0000a7dd,
+ /* bc */ 0x0000a7de, 0x0000a7df, 0x0000a7e0, 0x0000a7e1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00410 ***/
+
+ /* 80 */ 0x0000a7e2, 0x0000a7e3, 0x0000a7e4, 0x0000a7e5,
+ /* 84 */ 0x0000a7e6, 0x0000a7e7, 0x0000a7e8, 0x0000a7e9,
+ /* 88 */ 0x0000a7ea, 0x0000a7eb, 0x0000a7ec, 0x0000a7ed,
+ /* 8c */ 0x0000a7ee, 0x0000a7ef, 0x0000a7f0, 0x0000a7f1,
+ /* 90 */ 0x8130d239, 0x0000a7d7, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00450 ***/
+
+ /* e2 */ 0x0000045e, 0x0000049e, 0x000004dd, 0x0000051d,
+ /* e6 */ 0x0000055d, 0x0000059d, 0x000005dd, 0x0000061d,
+ /* ea */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ee */ 0x0000065d, 0x0000067f,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0045e ***/
+
+ /* 80 */ 0x000006bf, 0x000006ff, 0x0000073f, 0x0000077f,
+ /* 84 */ 0x000007bf, 0x000007ff, 0x0000083f, 0x0000087f,
+ /* 88 */ 0x000008bf, 0x000008ff, 0x0000093f, 0x0000097f,
+ /* 8c */ 0x000009bf, 0x000009ff, 0x00000a3f, 0x00000a7f,
+ /* 90 */ 0x00000abf, 0x00000aff, 0x00000b3f, 0x00000b7f,
+ /* 94 */ 0x00000bbf, 0x00000bff, 0x00000c3f, 0x00000c7f,
+ /* 98 */ 0x00000cbf, 0x00000cff, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000d3e, 0x00000d7e,
+ /* bc */ 0x00000dbe, 0x00000dfe, 0x00000e3e, 0x00000e7e,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x0049e ***/
+
+ /* 80 */ 0x00000ebe, 0x00000efe, 0x00000f3e, 0x00000f7e,
+ /* 84 */ 0x00000fbe, 0x00000ffe, 0x0000103e, 0x0000107e,
+ /* 88 */ 0x000010be, 0x000010fe, 0x0000113e, 0x0000117e,
+ /* 8c */ 0x000011be, 0x000011fe, 0x0000123e, 0x0000127e,
+ /* 90 */ 0x000012be, 0x000012fe, 0x0000133e, 0x0000137e,
+ /* 94 */ 0x000013be, 0x000013fe, 0x0000143e, 0x0000147e,
+ /* 98 */ 0x000014be, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x000014e6, 0x00001526, 0x00001566, 0x000015a6,
+ /* a8 */ 0x000015e6, 0x00001626, 0x00001666, 0x000016a6,
+ /* ac */ 0x000016e6, 0x00001726, 0x00001766, 0x000017a6,
+ /* b0 */ 0x000017e6, 0x00001826, 0x00001866, 0x000018a6,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x004dd ***/
+
+ /* 80 */ 0x00000000, 0x000018d0, 0x00001910, 0x00001950,
+ /* 84 */ 0x00001990, 0x000019d0, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x000019f0, 0x00001a30, 0x00001a70, 0x00001ab0,
+ /* 90 */ 0x00001af0, 0x00001b30, 0x00001b70, 0x00001bb0,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00001be4, 0x00001c24, 0x00001c64,
+ /* 9c */ 0x00001ca4, 0x00001ce4, 0x00001d24, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00001d5d, 0x00001d9d, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00001dd5, 0x00001e15, 0x00001e55,
+ /* b4 */ 0x00001e95, 0x00001ed5, 0x00001f15, 0x00001f55,
+ /* b8 */ 0x00001f95, 0x00001fd5, 0x00002015, 0x00002055,
+ /* bc */ 0x00002095, 0x000020d5, 0x00002115, 0x00002155,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x0051d ***/
+
+ /* 80 */ 0x00002195, 0x000021d5, 0x00002215, 0x00002255,
+ /* 84 */ 0x00002295, 0x000022d5, 0x00002315, 0x00002355,
+ /* 88 */ 0x00002395, 0x000023d5, 0x00002415, 0x00002455,
+ /* 8c */ 0x00002495, 0x000024d5, 0x00002515, 0x00002555,
+ /* 90 */ 0x00002595, 0x000025d5, 0x00002615, 0x00002655,
+ /* 94 */ 0x00002695, 0x000026d5, 0x00002715, 0x00002755,
+ /* 98 */ 0x00002795, 0x000027d5, 0x00002815, 0x00002855,
+ /* 9c */ 0x00002895, 0x000028d5, 0x00002915, 0x00002955,
+ /* a0 */ 0x00002995, 0x000029d5, 0x00002a15, 0x00002a55,
+ /* a4 */ 0x00002a95, 0x00002ad5, 0x00002b15, 0x00002b55,
+ /* a8 */ 0x00002b95, 0x00002bd5, 0x00002c15, 0x00002c55,
+ /* ac */ 0x00002c95, 0x00002cd5, 0x00002d15, 0x00002d55,
+ /* b0 */ 0x00002d95, 0x00002dd5, 0x00002e15, 0x00002e55,
+ /* b4 */ 0x00002e95, 0x00002ed5, 0x00002f15, 0x00002f55,
+ /* b8 */ 0x00002f95, 0x00002fd5, 0x00003015, 0x00003055,
+ /* bc */ 0x00003095, 0x000030d5, 0x00003115, 0x00003155,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x0055d ***/
+
+ /* 80 */ 0x00003195, 0x000031d5, 0x00003215, 0x00003255,
+ /* 84 */ 0x00003295, 0x000032d5, 0x00003315, 0x00003355,
+ /* 88 */ 0x00003395, 0x000033d5, 0x00003415, 0x00003455,
+ /* 8c */ 0x00003495, 0x000034d5, 0x00003515, 0x00003555,
+ /* 90 */ 0x00003595, 0x000035d5, 0x00003615, 0x00003655,
+ /* 94 */ 0x00003695, 0x000036d5, 0x00003715, 0x00003755,
+ /* 98 */ 0x00003795, 0x000037d5, 0x00003815, 0x00003855,
+ /* 9c */ 0x00003895, 0x000038d5, 0x00003915, 0x00003955,
+ /* a0 */ 0x00003995, 0x000039d5, 0x00003a15, 0x00003a55,
+ /* a4 */ 0x00003a95, 0x00003ad5, 0x00003b15, 0x00003b55,
+ /* a8 */ 0x00003b95, 0x00003bd5, 0x00003c15, 0x00003c55,
+ /* ac */ 0x00003c95, 0x00003cd5, 0x00003d15, 0x00003d55,
+ /* b0 */ 0x00003d95, 0x00003dd5, 0x00003e15, 0x00003e55,
+ /* b4 */ 0x00003e95, 0x00003ed5, 0x00003f15, 0x00003f55,
+ /* b8 */ 0x00003f95, 0x00003fd5, 0x00004015, 0x00004055,
+ /* bc */ 0x00004095, 0x000040d5, 0x00004115, 0x00004155,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x0059d ***/
+
+ /* 80 */ 0x00004195, 0x000041d5, 0x00004215, 0x00004255,
+ /* 84 */ 0x00004295, 0x000042d5, 0x00004315, 0x00004355,
+ /* 88 */ 0x00004395, 0x000043d5, 0x00004415, 0x00004455,
+ /* 8c */ 0x00004495, 0x000044d5, 0x00004515, 0x00004555,
+ /* 90 */ 0x00004595, 0x000045d5, 0x00004615, 0x00004655,
+ /* 94 */ 0x00004695, 0x000046d5, 0x00004715, 0x00004755,
+ /* 98 */ 0x00004795, 0x000047d5, 0x00004815, 0x00004855,
+ /* 9c */ 0x00004895, 0x000048d5, 0x00004915, 0x00004955,
+ /* a0 */ 0x00004995, 0x000049d5, 0x00004a15, 0x00004a55,
+ /* a4 */ 0x00004a95, 0x00004ad5, 0x00004b15, 0x00004b55,
+ /* a8 */ 0x00004b95, 0x00004bd5, 0x00004c15, 0x00004c55,
+ /* ac */ 0x00004c95, 0x00004cd5, 0x00004d15, 0x00004d55,
+ /* b0 */ 0x00004d95, 0x00004dd5, 0x00004e15, 0x00004e55,
+ /* b4 */ 0x00004e95, 0x00004ed5, 0x00004f15, 0x00004f55,
+ /* b8 */ 0x00004f95, 0x00004fd5, 0x00005015, 0x00005055,
+ /* bc */ 0x00005095, 0x000050d5, 0x00005115, 0x00005155,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x005dd ***/
+
+ /* 80 */ 0x00005195, 0x000051d5, 0x00005215, 0x00005255,
+ /* 84 */ 0x00005295, 0x000052d5, 0x00005315, 0x00005355,
+ /* 88 */ 0x00005395, 0x000053d5, 0x00005415, 0x00005455,
+ /* 8c */ 0x00005495, 0x000054d5, 0x00005515, 0x00005555,
+ /* 90 */ 0x00005595, 0x000055d5, 0x00005615, 0x00005655,
+ /* 94 */ 0x00005695, 0x000056d5, 0x00005715, 0x00005755,
+ /* 98 */ 0x00005795, 0x000057d5, 0x00005815, 0x00005855,
+ /* 9c */ 0x00005895, 0x000058d5, 0x00005915, 0x00005955,
+ /* a0 */ 0x00005995, 0x000059d5, 0x00005a15, 0x00005a55,
+ /* a4 */ 0x00005a95, 0x00005ad5, 0x00005b15, 0x00005b55,
+ /* a8 */ 0x00005b95, 0x00005bd5, 0x00005c15, 0x00005c55,
+ /* ac */ 0x00005c95, 0x00005cd5, 0x00005d15, 0x00005d55,
+ /* b0 */ 0x00005d95, 0x00005dd5, 0x00005e15, 0x00005e55,
+ /* b4 */ 0x00005e95, 0x00005ed5, 0x00005f15, 0x00005f55,
+ /* b8 */ 0x00005f95, 0x00005fd5, 0x00006015, 0x00006055,
+ /* bc */ 0x00006095, 0x000060d5, 0x00006115, 0x00006155,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x0061d ***/
+
+ /* 80 */ 0x00006195, 0x000061d5, 0x00006215, 0x00006255,
+ /* 84 */ 0x00006295, 0x000062d5, 0x00006315, 0x00006355,
+ /* 88 */ 0x00006395, 0x000063d5, 0x00006415, 0x00006455,
+ /* 8c */ 0x00006495, 0x000064d5, 0x00006515, 0x00006555,
+ /* 90 */ 0x00006595, 0x000065d5, 0x00006615, 0x00006655,
+ /* 94 */ 0x00006695, 0x000066d5, 0x00006715, 0x00006755,
+ /* 98 */ 0x00006795, 0x000067d5, 0x00006815, 0x00006855,
+ /* 9c */ 0x00006895, 0x000068d5, 0x00006915, 0x00006955,
+ /* a0 */ 0x00006995, 0x000069d5, 0x00006a15, 0x00006a55,
+ /* a4 */ 0x00006a95, 0x00006ad5, 0x00006b15, 0x00006b55,
+ /* a8 */ 0x00006b95, 0x00006bd5, 0x00006c15, 0x00006c55,
+ /* ac */ 0x00006c95, 0x00006cd5, 0x00006d15, 0x00006d55,
+ /* b0 */ 0x00006d95, 0x00006dd5, 0x00006e15, 0x00006e55,
+ /* b4 */ 0x00006e95, 0x00006ed5, 0x00006f15, 0x00006f55,
+ /* b8 */ 0x00006f95, 0x00006fd5, 0x00007015, 0x00007055,
+ /* bc */ 0x00007095, 0x000070d5, 0x00007115, 0x00000000,
+
+ /*** Three byte table, byte #2: eexx - offset 0x0065d ***/
+
+ /* 80 */ 0x00007155, 0x00007195, 0x000071d5, 0x00007215,
+ /* 84 */ 0x00007255, 0x00007295, 0x000072d5, 0x00007315,
+ /* 88 */ 0x00007355, 0x00007395, 0x000073d5, 0x00007415,
+ /* 8c */ 0x00007455, 0x00007495, 0x000074d5, 0x00007515,
+ /* 90 */ 0x00007555, 0x00007595, 0x000075d5, 0x00007615,
+ /* 94 */ 0x00007655, 0x00007695, 0x000076d5, 0x00007715,
+ /* 98 */ 0x00007755, 0x00007795, 0x000077d5, 0x00007815,
+ /* 9c */ 0x00007855, 0x00007895, 0x000078d5, 0x00007915,
+ /* a0 */ 0x00007955, 0x00007995,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0067f ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x000079ba, 0x000079fa, 0x00007a3a, 0x00007a7a,
+ /* a8 */ 0x00007aba, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00007ae4, 0x00007b24, 0x00007b64, 0x00007ba4,
+ /* bc */ 0x00007be4, 0x00007c24, 0x00007c64, 0x00007ca4,
+
+ /*** Three byte table, leaf: e280xx - offset 0x006bf ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x0000a95c, 0x8136a532, 0x8136a533, 0x0000a843,
+ /* 94 */ 0x0000a1aa, 0x0000a844, 0x0000a1ac, 0x8136a534,
+ /* 98 */ 0x0000a1ae, 0x0000a1af, 0x8136a535, 0x8136a536,
+ /* 9c */ 0x0000a1b0, 0x0000a1b1, 0x8136a537, 0x8136a538,
+ /* a0 */ 0x8136a539, 0x8136a630, 0x8136a631, 0x8136a632,
+ /* a4 */ 0x8136a633, 0x0000a845, 0x0000a1ad, 0x8136a634,
+ /* a8 */ 0x8136a635, 0x8136a636, 0x8136a637, 0x8136a638,
+ /* ac */ 0x8136a639, 0x8136a730, 0x8136a731, 0x8136a732,
+ /* b0 */ 0x0000a1eb, 0x8136a733, 0x0000a1e4, 0x0000a1e5,
+ /* b4 */ 0x8136a734, 0x0000a846, 0x8136a735, 0x8136a736,
+ /* b8 */ 0x8136a737, 0x8136a738, 0x8136a739, 0x0000a1f9,
+ /* bc */ 0x8136a830, 0x8136a831, 0x8136a832, 0x8136a833,
+
+ /*** Three byte table, leaf: e281xx - offset 0x006ff ***/
+
+ /* 80 */ 0x8136a834, 0x8136a835, 0x8136a836, 0x8136a837,
+ /* 84 */ 0x8136a838, 0x8136a839, 0x8136a930, 0x8136a931,
+ /* 88 */ 0x8136a932, 0x8136a933, 0x8136a934, 0x8136a935,
+ /* 8c */ 0x8136a936, 0x8136a937, 0x8136a938, 0x8136a939,
+ /* 90 */ 0x8136aa30, 0x8136aa31, 0x8136aa32, 0x8136aa33,
+ /* 94 */ 0x8136aa34, 0x8136aa35, 0x8136aa36, 0x8136aa37,
+ /* 98 */ 0x8136aa38, 0x8136aa39, 0x8136ab30, 0x8136ab31,
+ /* 9c */ 0x8136ab32, 0x8136ab33, 0x8136ab34, 0x8136ab35,
+ /* a0 */ 0x8136ab36, 0x8136ab37, 0x8136ab38, 0x8136ab39,
+ /* a4 */ 0x8136ac30, 0x8136ac31, 0x8136ac32, 0x8136ac33,
+ /* a8 */ 0x8136ac34, 0x8136ac35, 0x8136ac36, 0x8136ac37,
+ /* ac */ 0x8136ac38, 0x8136ac39, 0x8136ad30, 0x8136ad31,
+ /* b0 */ 0x8136ad32, 0x8136ad33, 0x8136ad34, 0x8136ad35,
+ /* b4 */ 0x8136ad36, 0x8136ad37, 0x8136ad38, 0x8136ad39,
+ /* b8 */ 0x8136ae30, 0x8136ae31, 0x8136ae32, 0x8136ae33,
+ /* bc */ 0x8136ae34, 0x8136ae35, 0x8136ae36, 0x8136ae37,
+
+ /*** Three byte table, leaf: e282xx - offset 0x0073f ***/
+
+ /* 80 */ 0x8136ae38, 0x8136ae39, 0x8136af30, 0x8136af31,
+ /* 84 */ 0x8136af32, 0x8136af33, 0x8136af34, 0x8136af35,
+ /* 88 */ 0x8136af36, 0x8136af37, 0x8136af38, 0x8136af39,
+ /* 8c */ 0x8136b030, 0x8136b031, 0x8136b032, 0x8136b033,
+ /* 90 */ 0x8136b034, 0x8136b035, 0x8136b036, 0x8136b037,
+ /* 94 */ 0x8136b038, 0x8136b039, 0x8136b130, 0x8136b131,
+ /* 98 */ 0x8136b132, 0x8136b133, 0x8136b134, 0x8136b135,
+ /* 9c */ 0x8136b136, 0x8136b137, 0x8136b138, 0x8136b139,
+ /* a0 */ 0x8136b230, 0x8136b231, 0x8136b232, 0x8136b233,
+ /* a4 */ 0x8136b234, 0x8136b235, 0x8136b236, 0x8136b237,
+ /* a8 */ 0x8136b238, 0x8136b239, 0x8136b330, 0x8136b331,
+ /* ac */ 0x0000a2e3, 0x8136b332, 0x8136b333, 0x8136b334,
+ /* b0 */ 0x8136b335, 0x8136b336, 0x8136b337, 0x8136b338,
+ /* b4 */ 0x8136b339, 0x8136b430, 0x8136b431, 0x8136b432,
+ /* b8 */ 0x8136b433, 0x8136b434, 0x8136b435, 0x8136b436,
+ /* bc */ 0x8136b437, 0x8136b438, 0x8136b439, 0x8136b530,
+
+ /*** Three byte table, leaf: e283xx - offset 0x0077f ***/
+
+ /* 80 */ 0x8136b531, 0x8136b532, 0x8136b533, 0x8136b534,
+ /* 84 */ 0x8136b535, 0x8136b536, 0x8136b537, 0x8136b538,
+ /* 88 */ 0x8136b539, 0x8136b630, 0x8136b631, 0x8136b632,
+ /* 8c */ 0x8136b633, 0x8136b634, 0x8136b635, 0x8136b636,
+ /* 90 */ 0x8136b637, 0x8136b638, 0x8136b639, 0x8136b730,
+ /* 94 */ 0x8136b731, 0x8136b732, 0x8136b733, 0x8136b734,
+ /* 98 */ 0x8136b735, 0x8136b736, 0x8136b737, 0x8136b738,
+ /* 9c */ 0x8136b739, 0x8136b830, 0x8136b831, 0x8136b832,
+ /* a0 */ 0x8136b833, 0x8136b834, 0x8136b835, 0x8136b836,
+ /* a4 */ 0x8136b837, 0x8136b838, 0x8136b839, 0x8136b930,
+ /* a8 */ 0x8136b931, 0x8136b932, 0x8136b933, 0x8136b934,
+ /* ac */ 0x8136b935, 0x8136b936, 0x8136b937, 0x8136b938,
+ /* b0 */ 0x8136b939, 0x8136ba30, 0x8136ba31, 0x8136ba32,
+ /* b4 */ 0x8136ba33, 0x8136ba34, 0x8136ba35, 0x8136ba36,
+ /* b8 */ 0x8136ba37, 0x8136ba38, 0x8136ba39, 0x8136bb30,
+ /* bc */ 0x8136bb31, 0x8136bb32, 0x8136bb33, 0x8136bb34,
+
+ /*** Three byte table, leaf: e284xx - offset 0x007bf ***/
+
+ /* 80 */ 0x8136bb35, 0x8136bb36, 0x8136bb37, 0x0000a1e6,
+ /* 84 */ 0x8136bb38, 0x0000a847, 0x8136bb39, 0x8136bc30,
+ /* 88 */ 0x8136bc31, 0x0000a848, 0x8136bc32, 0x8136bc33,
+ /* 8c */ 0x8136bc34, 0x8136bc35, 0x8136bc36, 0x8136bc37,
+ /* 90 */ 0x8136bc38, 0x8136bc39, 0x8136bd30, 0x8136bd31,
+ /* 94 */ 0x8136bd32, 0x8136bd33, 0x0000a1ed, 0x8136bd34,
+ /* 98 */ 0x8136bd35, 0x8136bd36, 0x8136bd37, 0x8136bd38,
+ /* 9c */ 0x8136bd39, 0x8136be30, 0x8136be31, 0x8136be32,
+ /* a0 */ 0x8136be33, 0x0000a959, 0x8136be34, 0x8136be35,
+ /* a4 */ 0x8136be36, 0x8136be37, 0x8136be38, 0x8136be39,
+ /* a8 */ 0x8136bf30, 0x8136bf31, 0x8136bf32, 0x8136bf33,
+ /* ac */ 0x8136bf34, 0x8136bf35, 0x8136bf36, 0x8136bf37,
+ /* b0 */ 0x8136bf38, 0x8136bf39, 0x8136c030, 0x8136c031,
+ /* b4 */ 0x8136c032, 0x8136c033, 0x8136c034, 0x8136c035,
+ /* b8 */ 0x8136c036, 0x8136c037, 0x8136c038, 0x8136c039,
+ /* bc */ 0x8136c130, 0x8136c131, 0x8136c132, 0x8136c133,
+
+ /*** Three byte table, leaf: e285xx - offset 0x007ff ***/
+
+ /* 80 */ 0x8136c134, 0x8136c135, 0x8136c136, 0x8136c137,
+ /* 84 */ 0x8136c138, 0x8136c139, 0x8136c230, 0x8136c231,
+ /* 88 */ 0x8136c232, 0x8136c233, 0x8136c234, 0x8136c235,
+ /* 8c */ 0x8136c236, 0x8136c237, 0x8136c238, 0x8136c239,
+ /* 90 */ 0x8136c330, 0x8136c331, 0x8136c332, 0x8136c333,
+ /* 94 */ 0x8136c334, 0x8136c335, 0x8136c336, 0x8136c337,
+ /* 98 */ 0x8136c338, 0x8136c339, 0x8136c430, 0x8136c431,
+ /* 9c */ 0x8136c432, 0x8136c433, 0x8136c434, 0x8136c435,
+ /* a0 */ 0x0000a2f1, 0x0000a2f2, 0x0000a2f3, 0x0000a2f4,
+ /* a4 */ 0x0000a2f5, 0x0000a2f6, 0x0000a2f7, 0x0000a2f8,
+ /* a8 */ 0x0000a2f9, 0x0000a2fa, 0x0000a2fb, 0x0000a2fc,
+ /* ac */ 0x8136c436, 0x8136c437, 0x8136c438, 0x8136c439,
+ /* b0 */ 0x0000a2a1, 0x0000a2a2, 0x0000a2a3, 0x0000a2a4,
+ /* b4 */ 0x0000a2a5, 0x0000a2a6, 0x0000a2a7, 0x0000a2a8,
+ /* b8 */ 0x0000a2a9, 0x0000a2aa, 0x8136c530, 0x8136c531,
+ /* bc */ 0x8136c532, 0x8136c533, 0x8136c534, 0x8136c535,
+
+ /*** Three byte table, leaf: e286xx - offset 0x0083f ***/
+
+ /* 80 */ 0x8136c536, 0x8136c537, 0x8136c538, 0x8136c539,
+ /* 84 */ 0x8136c630, 0x8136c631, 0x8136c632, 0x8136c633,
+ /* 88 */ 0x8136c634, 0x8136c635, 0x8136c636, 0x8136c637,
+ /* 8c */ 0x8136c638, 0x8136c639, 0x8136c730, 0x8136c731,
+ /* 90 */ 0x0000a1fb, 0x0000a1fc, 0x0000a1fa, 0x0000a1fd,
+ /* 94 */ 0x8136c732, 0x8136c733, 0x0000a849, 0x0000a84a,
+ /* 98 */ 0x0000a84b, 0x0000a84c, 0x8136c734, 0x8136c735,
+ /* 9c */ 0x8136c736, 0x8136c737, 0x8136c738, 0x8136c739,
+ /* a0 */ 0x8136c830, 0x8136c831, 0x8136c832, 0x8136c833,
+ /* a4 */ 0x8136c834, 0x8136c835, 0x8136c836, 0x8136c837,
+ /* a8 */ 0x8136c838, 0x8136c839, 0x8136c930, 0x8136c931,
+ /* ac */ 0x8136c932, 0x8136c933, 0x8136c934, 0x8136c935,
+ /* b0 */ 0x8136c936, 0x8136c937, 0x8136c938, 0x8136c939,
+ /* b4 */ 0x8136ca30, 0x8136ca31, 0x8136ca32, 0x8136ca33,
+ /* b8 */ 0x8136ca34, 0x8136ca35, 0x8136ca36, 0x8136ca37,
+ /* bc */ 0x8136ca38, 0x8136ca39, 0x8136cb30, 0x8136cb31,
+
+ /*** Three byte table, leaf: e287xx - offset 0x0087f ***/
+
+ /* 80 */ 0x8136cb32, 0x8136cb33, 0x8136cb34, 0x8136cb35,
+ /* 84 */ 0x8136cb36, 0x8136cb37, 0x8136cb38, 0x8136cb39,
+ /* 88 */ 0x8136cc30, 0x8136cc31, 0x8136cc32, 0x8136cc33,
+ /* 8c */ 0x8136cc34, 0x8136cc35, 0x8136cc36, 0x8136cc37,
+ /* 90 */ 0x8136cc38, 0x8136cc39, 0x8136cd30, 0x8136cd31,
+ /* 94 */ 0x8136cd32, 0x8136cd33, 0x8136cd34, 0x8136cd35,
+ /* 98 */ 0x8136cd36, 0x8136cd37, 0x8136cd38, 0x8136cd39,
+ /* 9c */ 0x8136ce30, 0x8136ce31, 0x8136ce32, 0x8136ce33,
+ /* a0 */ 0x8136ce34, 0x8136ce35, 0x8136ce36, 0x8136ce37,
+ /* a4 */ 0x8136ce38, 0x8136ce39, 0x8136cf30, 0x8136cf31,
+ /* a8 */ 0x8136cf32, 0x8136cf33, 0x8136cf34, 0x8136cf35,
+ /* ac */ 0x8136cf36, 0x8136cf37, 0x8136cf38, 0x8136cf39,
+ /* b0 */ 0x8136d030, 0x8136d031, 0x8136d032, 0x8136d033,
+ /* b4 */ 0x8136d034, 0x8136d035, 0x8136d036, 0x8136d037,
+ /* b8 */ 0x8136d038, 0x8136d039, 0x8136d130, 0x8136d131,
+ /* bc */ 0x8136d132, 0x8136d133, 0x8136d134, 0x8136d135,
+
+ /*** Three byte table, leaf: e288xx - offset 0x008bf ***/
+
+ /* 80 */ 0x8136d136, 0x8136d137, 0x8136d138, 0x8136d139,
+ /* 84 */ 0x8136d230, 0x8136d231, 0x8136d232, 0x8136d233,
+ /* 88 */ 0x0000a1ca, 0x8136d234, 0x8136d235, 0x8136d236,
+ /* 8c */ 0x8136d237, 0x8136d238, 0x8136d239, 0x0000a1c7,
+ /* 90 */ 0x8136d330, 0x0000a1c6, 0x8136d331, 0x8136d332,
+ /* 94 */ 0x8136d333, 0x0000a84d, 0x8136d334, 0x8136d335,
+ /* 98 */ 0x8136d336, 0x8136d337, 0x0000a1cc, 0x8136d338,
+ /* 9c */ 0x8136d339, 0x0000a1d8, 0x0000a1de, 0x0000a84e,
+ /* a0 */ 0x0000a1cf, 0x8136d430, 0x8136d431, 0x0000a84f,
+ /* a4 */ 0x8136d432, 0x0000a1ce, 0x8136d433, 0x0000a1c4,
+ /* a8 */ 0x0000a1c5, 0x0000a1c9, 0x0000a1c8, 0x0000a1d2,
+ /* ac */ 0x8136d434, 0x8136d435, 0x0000a1d3, 0x8136d436,
+ /* b0 */ 0x8136d437, 0x8136d438, 0x8136d439, 0x8136d530,
+ /* b4 */ 0x0000a1e0, 0x0000a1df, 0x0000a1c3, 0x0000a1cb,
+ /* b8 */ 0x8136d531, 0x8136d532, 0x8136d533, 0x8136d534,
+ /* bc */ 0x8136d535, 0x0000a1d7, 0x8136d536, 0x8136d537,
+
+ /*** Three byte table, leaf: e289xx - offset 0x008ff ***/
+
+ /* 80 */ 0x8136d538, 0x8136d539, 0x8136d630, 0x8136d631,
+ /* 84 */ 0x8136d632, 0x8136d633, 0x8136d634, 0x8136d635,
+ /* 88 */ 0x0000a1d6, 0x8136d636, 0x8136d637, 0x8136d638,
+ /* 8c */ 0x0000a1d5, 0x8136d639, 0x8136d730, 0x8136d731,
+ /* 90 */ 0x8136d732, 0x8136d733, 0x0000a850, 0x8136d734,
+ /* 94 */ 0x8136d735, 0x8136d736, 0x8136d737, 0x8136d738,
+ /* 98 */ 0x8136d739, 0x8136d830, 0x8136d831, 0x8136d832,
+ /* 9c */ 0x8136d833, 0x8136d834, 0x8136d835, 0x8136d836,
+ /* a0 */ 0x0000a1d9, 0x0000a1d4, 0x8136d837, 0x8136d838,
+ /* a4 */ 0x0000a1dc, 0x0000a1dd, 0x0000a851, 0x0000a852,
+ /* a8 */ 0x8136d839, 0x8136d930, 0x8136d931, 0x8136d932,
+ /* ac */ 0x8136d933, 0x8136d934, 0x0000a1da, 0x0000a1db,
+ /* b0 */ 0x8136d935, 0x8136d936, 0x8136d937, 0x8136d938,
+ /* b4 */ 0x8136d939, 0x8136da30, 0x8136da31, 0x8136da32,
+ /* b8 */ 0x8136da33, 0x8136da34, 0x8136da35, 0x8136da36,
+ /* bc */ 0x8136da37, 0x8136da38, 0x8136da39, 0x8136db30,
+
+ /*** Three byte table, leaf: e28axx - offset 0x0093f ***/
+
+ /* 80 */ 0x8136db31, 0x8136db32, 0x8136db33, 0x8136db34,
+ /* 84 */ 0x8136db35, 0x8136db36, 0x8136db37, 0x8136db38,
+ /* 88 */ 0x8136db39, 0x8136dc30, 0x8136dc31, 0x8136dc32,
+ /* 8c */ 0x8136dc33, 0x8136dc34, 0x8136dc35, 0x8136dc36,
+ /* 90 */ 0x8136dc37, 0x8136dc38, 0x8136dc39, 0x8136dd30,
+ /* 94 */ 0x8136dd31, 0x0000a892, 0x8136dd32, 0x8136dd33,
+ /* 98 */ 0x8136dd34, 0x0000a1d1, 0x8136dd35, 0x8136dd36,
+ /* 9c */ 0x8136dd37, 0x8136dd38, 0x8136dd39, 0x8136de30,
+ /* a0 */ 0x8136de31, 0x8136de32, 0x8136de33, 0x8136de34,
+ /* a4 */ 0x8136de35, 0x0000a1cd, 0x8136de36, 0x8136de37,
+ /* a8 */ 0x8136de38, 0x8136de39, 0x8136df30, 0x8136df31,
+ /* ac */ 0x8136df32, 0x8136df33, 0x8136df34, 0x8136df35,
+ /* b0 */ 0x8136df36, 0x8136df37, 0x8136df38, 0x8136df39,
+ /* b4 */ 0x8136e030, 0x8136e031, 0x8136e032, 0x8136e033,
+ /* b8 */ 0x8136e034, 0x8136e035, 0x8136e036, 0x8136e037,
+ /* bc */ 0x8136e038, 0x8136e039, 0x8136e130, 0x0000a853,
+
+ /*** Three byte table, leaf: e28bxx - offset 0x0097f ***/
+
+ /* 80 */ 0x8136e131, 0x8136e132, 0x8136e133, 0x8136e134,
+ /* 84 */ 0x8136e135, 0x8136e136, 0x8136e137, 0x8136e138,
+ /* 88 */ 0x8136e139, 0x8136e230, 0x8136e231, 0x8136e232,
+ /* 8c */ 0x8136e233, 0x8136e234, 0x8136e235, 0x8136e236,
+ /* 90 */ 0x8136e237, 0x8136e238, 0x8136e239, 0x8136e330,
+ /* 94 */ 0x8136e331, 0x8136e332, 0x8136e333, 0x8136e334,
+ /* 98 */ 0x8136e335, 0x8136e336, 0x8136e337, 0x8136e338,
+ /* 9c */ 0x8136e339, 0x8136e430, 0x8136e431, 0x8136e432,
+ /* a0 */ 0x8136e433, 0x8136e434, 0x8136e435, 0x8136e436,
+ /* a4 */ 0x8136e437, 0x8136e438, 0x8136e439, 0x8136e530,
+ /* a8 */ 0x8136e531, 0x8136e532, 0x8136e533, 0x8136e534,
+ /* ac */ 0x8136e535, 0x8136e536, 0x8136e537, 0x8136e538,
+ /* b0 */ 0x8136e539, 0x8136e630, 0x8136e631, 0x8136e632,
+ /* b4 */ 0x8136e633, 0x8136e634, 0x8136e635, 0x8136e636,
+ /* b8 */ 0x8136e637, 0x8136e638, 0x8136e639, 0x8136e730,
+ /* bc */ 0x8136e731, 0x8136e732, 0x8136e733, 0x8136e734,
+
+ /*** Three byte table, leaf: e28cxx - offset 0x009bf ***/
+
+ /* 80 */ 0x8136e735, 0x8136e736, 0x8136e737, 0x8136e738,
+ /* 84 */ 0x8136e739, 0x8136e830, 0x8136e831, 0x8136e832,
+ /* 88 */ 0x8136e833, 0x8136e834, 0x8136e835, 0x8136e836,
+ /* 8c */ 0x8136e837, 0x8136e838, 0x8136e839, 0x8136e930,
+ /* 90 */ 0x8136e931, 0x8136e932, 0x0000a1d0, 0x8136e933,
+ /* 94 */ 0x8136e934, 0x8136e935, 0x8136e936, 0x8136e937,
+ /* 98 */ 0x8136e938, 0x8136e939, 0x8136ea30, 0x8136ea31,
+ /* 9c */ 0x8136ea32, 0x8136ea33, 0x8136ea34, 0x8136ea35,
+ /* a0 */ 0x8136ea36, 0x8136ea37, 0x8136ea38, 0x8136ea39,
+ /* a4 */ 0x8136eb30, 0x8136eb31, 0x8136eb32, 0x8136eb33,
+ /* a8 */ 0x8136eb34, 0x8136eb35, 0x8136eb36, 0x8136eb37,
+ /* ac */ 0x8136eb38, 0x8136eb39, 0x8136ec30, 0x8136ec31,
+ /* b0 */ 0x8136ec32, 0x8136ec33, 0x8136ec34, 0x8136ec35,
+ /* b4 */ 0x8136ec36, 0x8136ec37, 0x8136ec38, 0x8136ec39,
+ /* b8 */ 0x8136ed30, 0x8136ed31, 0x8136ed32, 0x8136ed33,
+ /* bc */ 0x8136ed34, 0x8136ed35, 0x8136ed36, 0x8136ed37,
+
+ /*** Three byte table, leaf: e28dxx - offset 0x009ff ***/
+
+ /* 80 */ 0x8136ed38, 0x8136ed39, 0x8136ee30, 0x8136ee31,
+ /* 84 */ 0x8136ee32, 0x8136ee33, 0x8136ee34, 0x8136ee35,
+ /* 88 */ 0x8136ee36, 0x8136ee37, 0x8136ee38, 0x8136ee39,
+ /* 8c */ 0x8136ef30, 0x8136ef31, 0x8136ef32, 0x8136ef33,
+ /* 90 */ 0x8136ef34, 0x8136ef35, 0x8136ef36, 0x8136ef37,
+ /* 94 */ 0x8136ef38, 0x8136ef39, 0x8136f030, 0x8136f031,
+ /* 98 */ 0x8136f032, 0x8136f033, 0x8136f034, 0x8136f035,
+ /* 9c */ 0x8136f036, 0x8136f037, 0x8136f038, 0x8136f039,
+ /* a0 */ 0x8136f130, 0x8136f131, 0x8136f132, 0x8136f133,
+ /* a4 */ 0x8136f134, 0x8136f135, 0x8136f136, 0x8136f137,
+ /* a8 */ 0x8136f138, 0x8136f139, 0x8136f230, 0x8136f231,
+ /* ac */ 0x8136f232, 0x8136f233, 0x8136f234, 0x8136f235,
+ /* b0 */ 0x8136f236, 0x8136f237, 0x8136f238, 0x8136f239,
+ /* b4 */ 0x8136f330, 0x8136f331, 0x8136f332, 0x8136f333,
+ /* b8 */ 0x8136f334, 0x8136f335, 0x8136f336, 0x8136f337,
+ /* bc */ 0x8136f338, 0x8136f339, 0x8136f430, 0x8136f431,
+
+ /*** Three byte table, leaf: e28exx - offset 0x00a3f ***/
+
+ /* 80 */ 0x8136f432, 0x8136f433, 0x8136f434, 0x8136f435,
+ /* 84 */ 0x8136f436, 0x8136f437, 0x8136f438, 0x8136f439,
+ /* 88 */ 0x8136f530, 0x8136f531, 0x8136f532, 0x8136f533,
+ /* 8c */ 0x8136f534, 0x8136f535, 0x8136f536, 0x8136f537,
+ /* 90 */ 0x8136f538, 0x8136f539, 0x8136f630, 0x8136f631,
+ /* 94 */ 0x8136f632, 0x8136f633, 0x8136f634, 0x8136f635,
+ /* 98 */ 0x8136f636, 0x8136f637, 0x8136f638, 0x8136f639,
+ /* 9c */ 0x8136f730, 0x8136f731, 0x8136f732, 0x8136f733,
+ /* a0 */ 0x8136f734, 0x8136f735, 0x8136f736, 0x8136f737,
+ /* a4 */ 0x8136f738, 0x8136f739, 0x8136f830, 0x8136f831,
+ /* a8 */ 0x8136f832, 0x8136f833, 0x8136f834, 0x8136f835,
+ /* ac */ 0x8136f836, 0x8136f837, 0x8136f838, 0x8136f839,
+ /* b0 */ 0x8136f930, 0x8136f931, 0x8136f932, 0x8136f933,
+ /* b4 */ 0x8136f934, 0x8136f935, 0x8136f936, 0x8136f937,
+ /* b8 */ 0x8136f938, 0x8136f939, 0x8136fa30, 0x8136fa31,
+ /* bc */ 0x8136fa32, 0x8136fa33, 0x8136fa34, 0x8136fa35,
+
+ /*** Three byte table, leaf: e28fxx - offset 0x00a7f ***/
+
+ /* 80 */ 0x8136fa36, 0x8136fa37, 0x8136fa38, 0x8136fa39,
+ /* 84 */ 0x8136fb30, 0x8136fb31, 0x8136fb32, 0x8136fb33,
+ /* 88 */ 0x8136fb34, 0x8136fb35, 0x8136fb36, 0x8136fb37,
+ /* 8c */ 0x8136fb38, 0x8136fb39, 0x8136fc30, 0x8136fc31,
+ /* 90 */ 0x8136fc32, 0x8136fc33, 0x8136fc34, 0x8136fc35,
+ /* 94 */ 0x8136fc36, 0x8136fc37, 0x8136fc38, 0x8136fc39,
+ /* 98 */ 0x8136fd30, 0x8136fd31, 0x8136fd32, 0x8136fd33,
+ /* 9c */ 0x8136fd34, 0x8136fd35, 0x8136fd36, 0x8136fd37,
+ /* a0 */ 0x8136fd38, 0x8136fd39, 0x8136fe30, 0x8136fe31,
+ /* a4 */ 0x8136fe32, 0x8136fe33, 0x8136fe34, 0x8136fe35,
+ /* a8 */ 0x8136fe36, 0x8136fe37, 0x8136fe38, 0x8136fe39,
+ /* ac */ 0x81378130, 0x81378131, 0x81378132, 0x81378133,
+ /* b0 */ 0x81378134, 0x81378135, 0x81378136, 0x81378137,
+ /* b4 */ 0x81378138, 0x81378139, 0x81378230, 0x81378231,
+ /* b8 */ 0x81378232, 0x81378233, 0x81378234, 0x81378235,
+ /* bc */ 0x81378236, 0x81378237, 0x81378238, 0x81378239,
+
+ /*** Three byte table, leaf: e290xx - offset 0x00abf ***/
+
+ /* 80 */ 0x81378330, 0x81378331, 0x81378332, 0x81378333,
+ /* 84 */ 0x81378334, 0x81378335, 0x81378336, 0x81378337,
+ /* 88 */ 0x81378338, 0x81378339, 0x81378430, 0x81378431,
+ /* 8c */ 0x81378432, 0x81378433, 0x81378434, 0x81378435,
+ /* 90 */ 0x81378436, 0x81378437, 0x81378438, 0x81378439,
+ /* 94 */ 0x81378530, 0x81378531, 0x81378532, 0x81378533,
+ /* 98 */ 0x81378534, 0x81378535, 0x81378536, 0x81378537,
+ /* 9c */ 0x81378538, 0x81378539, 0x81378630, 0x81378631,
+ /* a0 */ 0x81378632, 0x81378633, 0x81378634, 0x81378635,
+ /* a4 */ 0x81378636, 0x81378637, 0x81378638, 0x81378639,
+ /* a8 */ 0x81378730, 0x81378731, 0x81378732, 0x81378733,
+ /* ac */ 0x81378734, 0x81378735, 0x81378736, 0x81378737,
+ /* b0 */ 0x81378738, 0x81378739, 0x81378830, 0x81378831,
+ /* b4 */ 0x81378832, 0x81378833, 0x81378834, 0x81378835,
+ /* b8 */ 0x81378836, 0x81378837, 0x81378838, 0x81378839,
+ /* bc */ 0x81378930, 0x81378931, 0x81378932, 0x81378933,
+
+ /*** Three byte table, leaf: e291xx - offset 0x00aff ***/
+
+ /* 80 */ 0x81378934, 0x81378935, 0x81378936, 0x81378937,
+ /* 84 */ 0x81378938, 0x81378939, 0x81378a30, 0x81378a31,
+ /* 88 */ 0x81378a32, 0x81378a33, 0x81378a34, 0x81378a35,
+ /* 8c */ 0x81378a36, 0x81378a37, 0x81378a38, 0x81378a39,
+ /* 90 */ 0x81378b30, 0x81378b31, 0x81378b32, 0x81378b33,
+ /* 94 */ 0x81378b34, 0x81378b35, 0x81378b36, 0x81378b37,
+ /* 98 */ 0x81378b38, 0x81378b39, 0x81378c30, 0x81378c31,
+ /* 9c */ 0x81378c32, 0x81378c33, 0x81378c34, 0x81378c35,
+ /* a0 */ 0x0000a2d9, 0x0000a2da, 0x0000a2db, 0x0000a2dc,
+ /* a4 */ 0x0000a2dd, 0x0000a2de, 0x0000a2df, 0x0000a2e0,
+ /* a8 */ 0x0000a2e1, 0x0000a2e2, 0x81378c36, 0x81378c37,
+ /* ac */ 0x81378c38, 0x81378c39, 0x81378d30, 0x81378d31,
+ /* b0 */ 0x81378d32, 0x81378d33, 0x81378d34, 0x81378d35,
+ /* b4 */ 0x0000a2c5, 0x0000a2c6, 0x0000a2c7, 0x0000a2c8,
+ /* b8 */ 0x0000a2c9, 0x0000a2ca, 0x0000a2cb, 0x0000a2cc,
+ /* bc */ 0x0000a2cd, 0x0000a2ce, 0x0000a2cf, 0x0000a2d0,
+
+ /*** Three byte table, leaf: e292xx - offset 0x00b3f ***/
+
+ /* 80 */ 0x0000a2d1, 0x0000a2d2, 0x0000a2d3, 0x0000a2d4,
+ /* 84 */ 0x0000a2d5, 0x0000a2d6, 0x0000a2d7, 0x0000a2d8,
+ /* 88 */ 0x0000a2b1, 0x0000a2b2, 0x0000a2b3, 0x0000a2b4,
+ /* 8c */ 0x0000a2b5, 0x0000a2b6, 0x0000a2b7, 0x0000a2b8,
+ /* 90 */ 0x0000a2b9, 0x0000a2ba, 0x0000a2bb, 0x0000a2bc,
+ /* 94 */ 0x0000a2bd, 0x0000a2be, 0x0000a2bf, 0x0000a2c0,
+ /* 98 */ 0x0000a2c1, 0x0000a2c2, 0x0000a2c3, 0x0000a2c4,
+ /* 9c */ 0x81378d36, 0x81378d37, 0x81378d38, 0x81378d39,
+ /* a0 */ 0x81378e30, 0x81378e31, 0x81378e32, 0x81378e33,
+ /* a4 */ 0x81378e34, 0x81378e35, 0x81378e36, 0x81378e37,
+ /* a8 */ 0x81378e38, 0x81378e39, 0x81378f30, 0x81378f31,
+ /* ac */ 0x81378f32, 0x81378f33, 0x81378f34, 0x81378f35,
+ /* b0 */ 0x81378f36, 0x81378f37, 0x81378f38, 0x81378f39,
+ /* b4 */ 0x81379030, 0x81379031, 0x81379032, 0x81379033,
+ /* b8 */ 0x81379034, 0x81379035, 0x81379036, 0x81379037,
+ /* bc */ 0x81379038, 0x81379039, 0x81379130, 0x81379131,
+
+ /*** Three byte table, leaf: e293xx - offset 0x00b7f ***/
+
+ /* 80 */ 0x81379132, 0x81379133, 0x81379134, 0x81379135,
+ /* 84 */ 0x81379136, 0x81379137, 0x81379138, 0x81379139,
+ /* 88 */ 0x81379230, 0x81379231, 0x81379232, 0x81379233,
+ /* 8c */ 0x81379234, 0x81379235, 0x81379236, 0x81379237,
+ /* 90 */ 0x81379238, 0x81379239, 0x81379330, 0x81379331,
+ /* 94 */ 0x81379332, 0x81379333, 0x81379334, 0x81379335,
+ /* 98 */ 0x81379336, 0x81379337, 0x81379338, 0x81379339,
+ /* 9c */ 0x81379430, 0x81379431, 0x81379432, 0x81379433,
+ /* a0 */ 0x81379434, 0x81379435, 0x81379436, 0x81379437,
+ /* a4 */ 0x81379438, 0x81379439, 0x81379530, 0x81379531,
+ /* a8 */ 0x81379532, 0x81379533, 0x81379534, 0x81379535,
+ /* ac */ 0x81379536, 0x81379537, 0x81379538, 0x81379539,
+ /* b0 */ 0x81379630, 0x81379631, 0x81379632, 0x81379633,
+ /* b4 */ 0x81379634, 0x81379635, 0x81379636, 0x81379637,
+ /* b8 */ 0x81379638, 0x81379639, 0x81379730, 0x81379731,
+ /* bc */ 0x81379732, 0x81379733, 0x81379734, 0x81379735,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00bbf ***/
+
+ /* 80 */ 0x0000a9a4, 0x0000a9a5, 0x0000a9a6, 0x0000a9a7,
+ /* 84 */ 0x0000a9a8, 0x0000a9a9, 0x0000a9aa, 0x0000a9ab,
+ /* 88 */ 0x0000a9ac, 0x0000a9ad, 0x0000a9ae, 0x0000a9af,
+ /* 8c */ 0x0000a9b0, 0x0000a9b1, 0x0000a9b2, 0x0000a9b3,
+ /* 90 */ 0x0000a9b4, 0x0000a9b5, 0x0000a9b6, 0x0000a9b7,
+ /* 94 */ 0x0000a9b8, 0x0000a9b9, 0x0000a9ba, 0x0000a9bb,
+ /* 98 */ 0x0000a9bc, 0x0000a9bd, 0x0000a9be, 0x0000a9bf,
+ /* 9c */ 0x0000a9c0, 0x0000a9c1, 0x0000a9c2, 0x0000a9c3,
+ /* a0 */ 0x0000a9c4, 0x0000a9c5, 0x0000a9c6, 0x0000a9c7,
+ /* a4 */ 0x0000a9c8, 0x0000a9c9, 0x0000a9ca, 0x0000a9cb,
+ /* a8 */ 0x0000a9cc, 0x0000a9cd, 0x0000a9ce, 0x0000a9cf,
+ /* ac */ 0x0000a9d0, 0x0000a9d1, 0x0000a9d2, 0x0000a9d3,
+ /* b0 */ 0x0000a9d4, 0x0000a9d5, 0x0000a9d6, 0x0000a9d7,
+ /* b4 */ 0x0000a9d8, 0x0000a9d9, 0x0000a9da, 0x0000a9db,
+ /* b8 */ 0x0000a9dc, 0x0000a9dd, 0x0000a9de, 0x0000a9df,
+ /* bc */ 0x0000a9e0, 0x0000a9e1, 0x0000a9e2, 0x0000a9e3,
+
+ /*** Three byte table, leaf: e295xx - offset 0x00bff ***/
+
+ /* 80 */ 0x0000a9e4, 0x0000a9e5, 0x0000a9e6, 0x0000a9e7,
+ /* 84 */ 0x0000a9e8, 0x0000a9e9, 0x0000a9ea, 0x0000a9eb,
+ /* 88 */ 0x0000a9ec, 0x0000a9ed, 0x0000a9ee, 0x0000a9ef,
+ /* 8c */ 0x81379736, 0x81379737, 0x81379738, 0x81379739,
+ /* 90 */ 0x0000a854, 0x0000a855, 0x0000a856, 0x0000a857,
+ /* 94 */ 0x0000a858, 0x0000a859, 0x0000a85a, 0x0000a85b,
+ /* 98 */ 0x0000a85c, 0x0000a85d, 0x0000a85e, 0x0000a85f,
+ /* 9c */ 0x0000a860, 0x0000a861, 0x0000a862, 0x0000a863,
+ /* a0 */ 0x0000a864, 0x0000a865, 0x0000a866, 0x0000a867,
+ /* a4 */ 0x0000a868, 0x0000a869, 0x0000a86a, 0x0000a86b,
+ /* a8 */ 0x0000a86c, 0x0000a86d, 0x0000a86e, 0x0000a86f,
+ /* ac */ 0x0000a870, 0x0000a871, 0x0000a872, 0x0000a873,
+ /* b0 */ 0x0000a874, 0x0000a875, 0x0000a876, 0x0000a877,
+ /* b4 */ 0x81379830, 0x81379831, 0x81379832, 0x81379833,
+ /* b8 */ 0x81379834, 0x81379835, 0x81379836, 0x81379837,
+ /* bc */ 0x81379838, 0x81379839, 0x81379930, 0x81379931,
+
+ /*** Three byte table, leaf: e296xx - offset 0x00c3f ***/
+
+ /* 80 */ 0x81379932, 0x0000a878, 0x0000a879, 0x0000a87a,
+ /* 84 */ 0x0000a87b, 0x0000a87c, 0x0000a87d, 0x0000a87e,
+ /* 88 */ 0x0000a880, 0x0000a881, 0x0000a882, 0x0000a883,
+ /* 8c */ 0x0000a884, 0x0000a885, 0x0000a886, 0x0000a887,
+ /* 90 */ 0x81379933, 0x81379934, 0x81379935, 0x0000a888,
+ /* 94 */ 0x0000a889, 0x0000a88a, 0x81379936, 0x81379937,
+ /* 98 */ 0x81379938, 0x81379939, 0x81379a30, 0x81379a31,
+ /* 9c */ 0x81379a32, 0x81379a33, 0x81379a34, 0x81379a35,
+ /* a0 */ 0x0000a1f6, 0x0000a1f5, 0x81379a36, 0x81379a37,
+ /* a4 */ 0x81379a38, 0x81379a39, 0x81379b30, 0x81379b31,
+ /* a8 */ 0x81379b32, 0x81379b33, 0x81379b34, 0x81379b35,
+ /* ac */ 0x81379b36, 0x81379b37, 0x81379b38, 0x81379b39,
+ /* b0 */ 0x81379c30, 0x81379c31, 0x0000a1f8, 0x0000a1f7,
+ /* b4 */ 0x81379c32, 0x81379c33, 0x81379c34, 0x81379c35,
+ /* b8 */ 0x81379c36, 0x81379c37, 0x81379c38, 0x81379c39,
+ /* bc */ 0x0000a88b, 0x0000a88c, 0x81379d30, 0x81379d31,
+
+ /*** Three byte table, leaf: e297xx - offset 0x00c7f ***/
+
+ /* 80 */ 0x81379d32, 0x81379d33, 0x81379d34, 0x81379d35,
+ /* 84 */ 0x81379d36, 0x81379d37, 0x0000a1f4, 0x0000a1f3,
+ /* 88 */ 0x81379d38, 0x81379d39, 0x81379e30, 0x0000a1f0,
+ /* 8c */ 0x81379e31, 0x81379e32, 0x0000a1f2, 0x0000a1f1,
+ /* 90 */ 0x81379e33, 0x81379e34, 0x81379e35, 0x81379e36,
+ /* 94 */ 0x81379e37, 0x81379e38, 0x81379e39, 0x81379f30,
+ /* 98 */ 0x81379f31, 0x81379f32, 0x81379f33, 0x81379f34,
+ /* 9c */ 0x81379f35, 0x81379f36, 0x81379f37, 0x81379f38,
+ /* a0 */ 0x81379f39, 0x8137a030, 0x0000a88d, 0x0000a88e,
+ /* a4 */ 0x0000a88f, 0x0000a890, 0x8137a031, 0x8137a032,
+ /* a8 */ 0x8137a033, 0x8137a034, 0x8137a035, 0x8137a036,
+ /* ac */ 0x8137a037, 0x8137a038, 0x8137a039, 0x8137a130,
+ /* b0 */ 0x8137a131, 0x8137a132, 0x8137a133, 0x8137a134,
+ /* b4 */ 0x8137a135, 0x8137a136, 0x8137a137, 0x8137a138,
+ /* b8 */ 0x8137a139, 0x8137a230, 0x8137a231, 0x8137a232,
+ /* bc */ 0x8137a233, 0x8137a234, 0x8137a235, 0x8137a236,
+
+ /*** Three byte table, leaf: e298xx - offset 0x00cbf ***/
+
+ /* 80 */ 0x8137a237, 0x8137a238, 0x8137a239, 0x8137a330,
+ /* 84 */ 0x8137a331, 0x0000a1ef, 0x0000a1ee, 0x8137a332,
+ /* 88 */ 0x8137a333, 0x0000a891, 0x8137a334, 0x8137a335,
+ /* 8c */ 0x8137a336, 0x8137a337, 0x8137a338, 0x8137a339,
+ /* 90 */ 0x8137a430, 0x8137a431, 0x8137a432, 0x8137a433,
+ /* 94 */ 0x8137a434, 0x8137a435, 0x8137a436, 0x8137a437,
+ /* 98 */ 0x8137a438, 0x8137a439, 0x8137a530, 0x8137a531,
+ /* 9c */ 0x8137a532, 0x8137a533, 0x8137a534, 0x8137a535,
+ /* a0 */ 0x8137a536, 0x8137a537, 0x8137a538, 0x8137a539,
+ /* a4 */ 0x8137a630, 0x8137a631, 0x8137a632, 0x8137a633,
+ /* a8 */ 0x8137a634, 0x8137a635, 0x8137a636, 0x8137a637,
+ /* ac */ 0x8137a638, 0x8137a639, 0x8137a730, 0x8137a731,
+ /* b0 */ 0x8137a732, 0x8137a733, 0x8137a734, 0x8137a735,
+ /* b4 */ 0x8137a736, 0x8137a737, 0x8137a738, 0x8137a739,
+ /* b8 */ 0x8137a830, 0x8137a831, 0x8137a832, 0x8137a833,
+ /* bc */ 0x8137a834, 0x8137a835, 0x8137a836, 0x8137a837,
+
+ /*** Three byte table, leaf: e299xx - offset 0x00cff ***/
+
+ /* 80 */ 0x0000a1e2, 0x8137a838, 0x0000a1e1, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e2baxx - offset 0x00d3e ***/
+
+ /* 80 */ 0x00000000, 0x0000fe50, 0x8138fd39, 0x8138fe30,
+ /* 84 */ 0x0000fe54, 0x8138fe31, 0x8138fe32, 0x8138fe33,
+ /* 88 */ 0x0000fe57, 0x8138fe34, 0x8138fe35, 0x0000fe58,
+ /* 8c */ 0x0000fe5d, 0x8138fe36, 0x8138fe37, 0x8138fe38,
+ /* 90 */ 0x8138fe39, 0x81398130, 0x81398131, 0x81398132,
+ /* 94 */ 0x81398133, 0x81398134, 0x81398135, 0x0000fe5e,
+ /* 98 */ 0x81398136, 0x81398137, 0x81398138, 0x81398139,
+ /* 9c */ 0x81398230, 0x81398231, 0x81398232, 0x81398233,
+ /* a0 */ 0x81398234, 0x81398235, 0x81398236, 0x81398237,
+ /* a4 */ 0x81398238, 0x81398239, 0x81398330, 0x0000fe6b,
+ /* a8 */ 0x81398331, 0x81398332, 0x0000fe6e, 0x81398333,
+ /* ac */ 0x81398334, 0x81398335, 0x0000fe71, 0x81398336,
+ /* b0 */ 0x81398337, 0x81398338, 0x81398339, 0x0000fe73,
+ /* b4 */ 0x81398430, 0x81398431, 0x0000fe74, 0x0000fe75,
+ /* b8 */ 0x81398432, 0x81398433, 0x81398434, 0x0000fe79,
+ /* bc */ 0x81398435, 0x81398436, 0x81398437, 0x81398438,
+
+ /*** Three byte table, leaf: e2bbxx - offset 0x00d7e ***/
+
+ /* 80 */ 0x81398439, 0x81398530, 0x81398531, 0x81398532,
+ /* 84 */ 0x81398533, 0x81398534, 0x81398535, 0x81398536,
+ /* 88 */ 0x81398537, 0x81398538, 0x0000fe84, 0x81398539,
+ /* 8c */ 0x81398630, 0x81398631, 0x81398632, 0x81398633,
+ /* 90 */ 0x81398634, 0x81398635, 0x81398636, 0x81398637,
+ /* 94 */ 0x81398638, 0x81398639, 0x81398730, 0x81398731,
+ /* 98 */ 0x81398732, 0x81398733, 0x81398734, 0x81398735,
+ /* 9c */ 0x81398736, 0x81398737, 0x81398738, 0x81398739,
+ /* a0 */ 0x81398830, 0x81398831, 0x81398832, 0x81398833,
+ /* a4 */ 0x81398834, 0x81398835, 0x81398836, 0x81398837,
+ /* a8 */ 0x81398838, 0x81398839, 0x81398930, 0x81398931,
+ /* ac */ 0x81398932, 0x81398933, 0x81398934, 0x81398935,
+ /* b0 */ 0x81398936, 0x81398937, 0x81398938, 0x81398939,
+ /* b4 */ 0x81398a30, 0x81398a31, 0x81398a32, 0x81398a33,
+ /* b8 */ 0x81398a34, 0x81398a35, 0x81398a36, 0x81398a37,
+ /* bc */ 0x81398a38, 0x81398a39, 0x81398b30, 0x81398b31,
+
+ /*** Three byte table, leaf: e2bcxx - offset 0x00dbe ***/
+
+ /* 80 */ 0x81398b32, 0x81398b33, 0x81398b34, 0x81398b35,
+ /* 84 */ 0x81398b36, 0x81398b37, 0x81398b38, 0x81398b39,
+ /* 88 */ 0x81398c30, 0x81398c31, 0x81398c32, 0x81398c33,
+ /* 8c */ 0x81398c34, 0x81398c35, 0x81398c36, 0x81398c37,
+ /* 90 */ 0x81398c38, 0x81398c39, 0x81398d30, 0x81398d31,
+ /* 94 */ 0x81398d32, 0x81398d33, 0x81398d34, 0x81398d35,
+ /* 98 */ 0x81398d36, 0x81398d37, 0x81398d38, 0x81398d39,
+ /* 9c */ 0x81398e30, 0x81398e31, 0x81398e32, 0x81398e33,
+ /* a0 */ 0x81398e34, 0x81398e35, 0x81398e36, 0x81398e37,
+ /* a4 */ 0x81398e38, 0x81398e39, 0x81398f30, 0x81398f31,
+ /* a8 */ 0x81398f32, 0x81398f33, 0x81398f34, 0x81398f35,
+ /* ac */ 0x81398f36, 0x81398f37, 0x81398f38, 0x81398f39,
+ /* b0 */ 0x81399030, 0x81399031, 0x81399032, 0x81399033,
+ /* b4 */ 0x81399034, 0x81399035, 0x81399036, 0x81399037,
+ /* b8 */ 0x81399038, 0x81399039, 0x81399130, 0x81399131,
+ /* bc */ 0x81399132, 0x81399133, 0x81399134, 0x81399135,
+
+ /*** Three byte table, leaf: e2bdxx - offset 0x00dfe ***/
+
+ /* 80 */ 0x81399136, 0x81399137, 0x81399138, 0x81399139,
+ /* 84 */ 0x81399230, 0x81399231, 0x81399232, 0x81399233,
+ /* 88 */ 0x81399234, 0x81399235, 0x81399236, 0x81399237,
+ /* 8c */ 0x81399238, 0x81399239, 0x81399330, 0x81399331,
+ /* 90 */ 0x81399332, 0x81399333, 0x81399334, 0x81399335,
+ /* 94 */ 0x81399336, 0x81399337, 0x81399338, 0x81399339,
+ /* 98 */ 0x81399430, 0x81399431, 0x81399432, 0x81399433,
+ /* 9c */ 0x81399434, 0x81399435, 0x81399436, 0x81399437,
+ /* a0 */ 0x81399438, 0x81399439, 0x81399530, 0x81399531,
+ /* a4 */ 0x81399532, 0x81399533, 0x81399534, 0x81399535,
+ /* a8 */ 0x81399536, 0x81399537, 0x81399538, 0x81399539,
+ /* ac */ 0x81399630, 0x81399631, 0x81399632, 0x81399633,
+ /* b0 */ 0x81399634, 0x81399635, 0x81399636, 0x81399637,
+ /* b4 */ 0x81399638, 0x81399639, 0x81399730, 0x81399731,
+ /* b8 */ 0x81399732, 0x81399733, 0x81399734, 0x81399735,
+ /* bc */ 0x81399736, 0x81399737, 0x81399738, 0x81399739,
+
+ /*** Three byte table, leaf: e2bexx - offset 0x00e3e ***/
+
+ /* 80 */ 0x81399830, 0x81399831, 0x81399832, 0x81399833,
+ /* 84 */ 0x81399834, 0x81399835, 0x81399836, 0x81399837,
+ /* 88 */ 0x81399838, 0x81399839, 0x81399930, 0x81399931,
+ /* 8c */ 0x81399932, 0x81399933, 0x81399934, 0x81399935,
+ /* 90 */ 0x81399936, 0x81399937, 0x81399938, 0x81399939,
+ /* 94 */ 0x81399a30, 0x81399a31, 0x81399a32, 0x81399a33,
+ /* 98 */ 0x81399a34, 0x81399a35, 0x81399a36, 0x81399a37,
+ /* 9c */ 0x81399a38, 0x81399a39, 0x81399b30, 0x81399b31,
+ /* a0 */ 0x81399b32, 0x81399b33, 0x81399b34, 0x81399b35,
+ /* a4 */ 0x81399b36, 0x81399b37, 0x81399b38, 0x81399b39,
+ /* a8 */ 0x81399c30, 0x81399c31, 0x81399c32, 0x81399c33,
+ /* ac */ 0x81399c34, 0x81399c35, 0x81399c36, 0x81399c37,
+ /* b0 */ 0x81399c38, 0x81399c39, 0x81399d30, 0x81399d31,
+ /* b4 */ 0x81399d32, 0x81399d33, 0x81399d34, 0x81399d35,
+ /* b8 */ 0x81399d36, 0x81399d37, 0x81399d38, 0x81399d39,
+ /* bc */ 0x81399e30, 0x81399e31, 0x81399e32, 0x81399e33,
+
+ /*** Three byte table, leaf: e2bfxx - offset 0x00e7e ***/
+
+ /* 80 */ 0x81399e34, 0x81399e35, 0x81399e36, 0x81399e37,
+ /* 84 */ 0x81399e38, 0x81399e39, 0x81399f30, 0x81399f31,
+ /* 88 */ 0x81399f32, 0x81399f33, 0x81399f34, 0x81399f35,
+ /* 8c */ 0x81399f36, 0x81399f37, 0x81399f38, 0x81399f39,
+ /* 90 */ 0x8139a030, 0x8139a031, 0x8139a032, 0x8139a033,
+ /* 94 */ 0x8139a034, 0x8139a035, 0x8139a036, 0x8139a037,
+ /* 98 */ 0x8139a038, 0x8139a039, 0x8139a130, 0x8139a131,
+ /* 9c */ 0x8139a132, 0x8139a133, 0x8139a134, 0x8139a135,
+ /* a0 */ 0x8139a136, 0x8139a137, 0x8139a138, 0x8139a139,
+ /* a4 */ 0x8139a230, 0x8139a231, 0x8139a232, 0x8139a233,
+ /* a8 */ 0x8139a234, 0x8139a235, 0x8139a236, 0x8139a237,
+ /* ac */ 0x8139a238, 0x8139a239, 0x8139a330, 0x8139a331,
+ /* b0 */ 0x0000a98a, 0x0000a98b, 0x0000a98c, 0x0000a98d,
+ /* b4 */ 0x0000a98e, 0x0000a98f, 0x0000a990, 0x0000a991,
+ /* b8 */ 0x0000a992, 0x0000a993, 0x0000a994, 0x0000a995,
+ /* bc */ 0x8139a332, 0x8139a333, 0x8139a334, 0x8139a335,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00ebe ***/
+
+ /* 80 */ 0x0000a1a1, 0x0000a1a2, 0x0000a1a3, 0x0000a1a8,
+ /* 84 */ 0x8139a336, 0x0000a1a9, 0x0000a965, 0x0000a996,
+ /* 88 */ 0x0000a1b4, 0x0000a1b5, 0x0000a1b6, 0x0000a1b7,
+ /* 8c */ 0x0000a1b8, 0x0000a1b9, 0x0000a1ba, 0x0000a1bb,
+ /* 90 */ 0x0000a1be, 0x0000a1bf, 0x0000a893, 0x0000a1fe,
+ /* 94 */ 0x0000a1b2, 0x0000a1b3, 0x0000a1bc, 0x0000a1bd,
+ /* 98 */ 0x8139a337, 0x8139a338, 0x8139a339, 0x8139a430,
+ /* 9c */ 0x8139a431, 0x0000a894, 0x0000a895, 0x8139a432,
+ /* a0 */ 0x8139a433, 0x0000a940, 0x0000a941, 0x0000a942,
+ /* a4 */ 0x0000a943, 0x0000a944, 0x0000a945, 0x0000a946,
+ /* a8 */ 0x0000a947, 0x0000a948, 0x8139a434, 0x8139a435,
+ /* ac */ 0x8139a436, 0x8139a437, 0x8139a438, 0x8139a439,
+ /* b0 */ 0x8139a530, 0x8139a531, 0x8139a532, 0x8139a533,
+ /* b4 */ 0x8139a534, 0x8139a535, 0x8139a536, 0x8139a537,
+ /* b8 */ 0x8139a538, 0x8139a539, 0x8139a630, 0x8139a631,
+ /* bc */ 0x8139a632, 0x8139a633, 0x0000a989, 0x8139a634,
+
+ /*** Three byte table, leaf: e381xx - offset 0x00efe ***/
+
+ /* 80 */ 0x8139a635, 0x0000a4a1, 0x0000a4a2, 0x0000a4a3,
+ /* 84 */ 0x0000a4a4, 0x0000a4a5, 0x0000a4a6, 0x0000a4a7,
+ /* 88 */ 0x0000a4a8, 0x0000a4a9, 0x0000a4aa, 0x0000a4ab,
+ /* 8c */ 0x0000a4ac, 0x0000a4ad, 0x0000a4ae, 0x0000a4af,
+ /* 90 */ 0x0000a4b0, 0x0000a4b1, 0x0000a4b2, 0x0000a4b3,
+ /* 94 */ 0x0000a4b4, 0x0000a4b5, 0x0000a4b6, 0x0000a4b7,
+ /* 98 */ 0x0000a4b8, 0x0000a4b9, 0x0000a4ba, 0x0000a4bb,
+ /* 9c */ 0x0000a4bc, 0x0000a4bd, 0x0000a4be, 0x0000a4bf,
+ /* a0 */ 0x0000a4c0, 0x0000a4c1, 0x0000a4c2, 0x0000a4c3,
+ /* a4 */ 0x0000a4c4, 0x0000a4c5, 0x0000a4c6, 0x0000a4c7,
+ /* a8 */ 0x0000a4c8, 0x0000a4c9, 0x0000a4ca, 0x0000a4cb,
+ /* ac */ 0x0000a4cc, 0x0000a4cd, 0x0000a4ce, 0x0000a4cf,
+ /* b0 */ 0x0000a4d0, 0x0000a4d1, 0x0000a4d2, 0x0000a4d3,
+ /* b4 */ 0x0000a4d4, 0x0000a4d5, 0x0000a4d6, 0x0000a4d7,
+ /* b8 */ 0x0000a4d8, 0x0000a4d9, 0x0000a4da, 0x0000a4db,
+ /* bc */ 0x0000a4dc, 0x0000a4dd, 0x0000a4de, 0x0000a4df,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00f3e ***/
+
+ /* 80 */ 0x0000a4e0, 0x0000a4e1, 0x0000a4e2, 0x0000a4e3,
+ /* 84 */ 0x0000a4e4, 0x0000a4e5, 0x0000a4e6, 0x0000a4e7,
+ /* 88 */ 0x0000a4e8, 0x0000a4e9, 0x0000a4ea, 0x0000a4eb,
+ /* 8c */ 0x0000a4ec, 0x0000a4ed, 0x0000a4ee, 0x0000a4ef,
+ /* 90 */ 0x0000a4f0, 0x0000a4f1, 0x0000a4f2, 0x0000a4f3,
+ /* 94 */ 0x8139a636, 0x8139a637, 0x8139a638, 0x8139a639,
+ /* 98 */ 0x8139a730, 0x8139a731, 0x8139a732, 0x0000a961,
+ /* 9c */ 0x0000a962, 0x0000a966, 0x0000a967, 0x8139a733,
+ /* a0 */ 0x8139a734, 0x0000a5a1, 0x0000a5a2, 0x0000a5a3,
+ /* a4 */ 0x0000a5a4, 0x0000a5a5, 0x0000a5a6, 0x0000a5a7,
+ /* a8 */ 0x0000a5a8, 0x0000a5a9, 0x0000a5aa, 0x0000a5ab,
+ /* ac */ 0x0000a5ac, 0x0000a5ad, 0x0000a5ae, 0x0000a5af,
+ /* b0 */ 0x0000a5b0, 0x0000a5b1, 0x0000a5b2, 0x0000a5b3,
+ /* b4 */ 0x0000a5b4, 0x0000a5b5, 0x0000a5b6, 0x0000a5b7,
+ /* b8 */ 0x0000a5b8, 0x0000a5b9, 0x0000a5ba, 0x0000a5bb,
+ /* bc */ 0x0000a5bc, 0x0000a5bd, 0x0000a5be, 0x0000a5bf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00f7e ***/
+
+ /* 80 */ 0x0000a5c0, 0x0000a5c1, 0x0000a5c2, 0x0000a5c3,
+ /* 84 */ 0x0000a5c4, 0x0000a5c5, 0x0000a5c6, 0x0000a5c7,
+ /* 88 */ 0x0000a5c8, 0x0000a5c9, 0x0000a5ca, 0x0000a5cb,
+ /* 8c */ 0x0000a5cc, 0x0000a5cd, 0x0000a5ce, 0x0000a5cf,
+ /* 90 */ 0x0000a5d0, 0x0000a5d1, 0x0000a5d2, 0x0000a5d3,
+ /* 94 */ 0x0000a5d4, 0x0000a5d5, 0x0000a5d6, 0x0000a5d7,
+ /* 98 */ 0x0000a5d8, 0x0000a5d9, 0x0000a5da, 0x0000a5db,
+ /* 9c */ 0x0000a5dc, 0x0000a5dd, 0x0000a5de, 0x0000a5df,
+ /* a0 */ 0x0000a5e0, 0x0000a5e1, 0x0000a5e2, 0x0000a5e3,
+ /* a4 */ 0x0000a5e4, 0x0000a5e5, 0x0000a5e6, 0x0000a5e7,
+ /* a8 */ 0x0000a5e8, 0x0000a5e9, 0x0000a5ea, 0x0000a5eb,
+ /* ac */ 0x0000a5ec, 0x0000a5ed, 0x0000a5ee, 0x0000a5ef,
+ /* b0 */ 0x0000a5f0, 0x0000a5f1, 0x0000a5f2, 0x0000a5f3,
+ /* b4 */ 0x0000a5f4, 0x0000a5f5, 0x0000a5f6, 0x8139a735,
+ /* b8 */ 0x8139a736, 0x8139a737, 0x8139a738, 0x8139a739,
+ /* bc */ 0x0000a960, 0x0000a963, 0x0000a964, 0x8139a830,
+
+ /*** Three byte table, leaf: e384xx - offset 0x00fbe ***/
+
+ /* 80 */ 0x8139a831, 0x8139a832, 0x8139a833, 0x8139a834,
+ /* 84 */ 0x8139a835, 0x0000a8c5, 0x0000a8c6, 0x0000a8c7,
+ /* 88 */ 0x0000a8c8, 0x0000a8c9, 0x0000a8ca, 0x0000a8cb,
+ /* 8c */ 0x0000a8cc, 0x0000a8cd, 0x0000a8ce, 0x0000a8cf,
+ /* 90 */ 0x0000a8d0, 0x0000a8d1, 0x0000a8d2, 0x0000a8d3,
+ /* 94 */ 0x0000a8d4, 0x0000a8d5, 0x0000a8d6, 0x0000a8d7,
+ /* 98 */ 0x0000a8d8, 0x0000a8d9, 0x0000a8da, 0x0000a8db,
+ /* 9c */ 0x0000a8dc, 0x0000a8dd, 0x0000a8de, 0x0000a8df,
+ /* a0 */ 0x0000a8e0, 0x0000a8e1, 0x0000a8e2, 0x0000a8e3,
+ /* a4 */ 0x0000a8e4, 0x0000a8e5, 0x0000a8e6, 0x0000a8e7,
+ /* a8 */ 0x0000a8e8, 0x0000a8e9, 0x8139a836, 0x8139a837,
+ /* ac */ 0x8139a838, 0x8139a839, 0x8139a930, 0x8139a931,
+ /* b0 */ 0x8139a932, 0x8139a933, 0x8139a934, 0x8139a935,
+ /* b4 */ 0x8139a936, 0x8139a937, 0x8139a938, 0x8139a939,
+ /* b8 */ 0x8139aa30, 0x8139aa31, 0x8139aa32, 0x8139aa33,
+ /* bc */ 0x8139aa34, 0x8139aa35, 0x8139aa36, 0x8139aa37,
+
+ /*** Three byte table, leaf: e385xx - offset 0x00ffe ***/
+
+ /* 80 */ 0x8139aa38, 0x8139aa39, 0x8139ab30, 0x8139ab31,
+ /* 84 */ 0x8139ab32, 0x8139ab33, 0x8139ab34, 0x8139ab35,
+ /* 88 */ 0x8139ab36, 0x8139ab37, 0x8139ab38, 0x8139ab39,
+ /* 8c */ 0x8139ac30, 0x8139ac31, 0x8139ac32, 0x8139ac33,
+ /* 90 */ 0x8139ac34, 0x8139ac35, 0x8139ac36, 0x8139ac37,
+ /* 94 */ 0x8139ac38, 0x8139ac39, 0x8139ad30, 0x8139ad31,
+ /* 98 */ 0x8139ad32, 0x8139ad33, 0x8139ad34, 0x8139ad35,
+ /* 9c */ 0x8139ad36, 0x8139ad37, 0x8139ad38, 0x8139ad39,
+ /* a0 */ 0x8139ae30, 0x8139ae31, 0x8139ae32, 0x8139ae33,
+ /* a4 */ 0x8139ae34, 0x8139ae35, 0x8139ae36, 0x8139ae37,
+ /* a8 */ 0x8139ae38, 0x8139ae39, 0x8139af30, 0x8139af31,
+ /* ac */ 0x8139af32, 0x8139af33, 0x8139af34, 0x8139af35,
+ /* b0 */ 0x8139af36, 0x8139af37, 0x8139af38, 0x8139af39,
+ /* b4 */ 0x8139b030, 0x8139b031, 0x8139b032, 0x8139b033,
+ /* b8 */ 0x8139b034, 0x8139b035, 0x8139b036, 0x8139b037,
+ /* bc */ 0x8139b038, 0x8139b039, 0x8139b130, 0x8139b131,
+
+ /*** Three byte table, leaf: e386xx - offset 0x0103e ***/
+
+ /* 80 */ 0x8139b132, 0x8139b133, 0x8139b134, 0x8139b135,
+ /* 84 */ 0x8139b136, 0x8139b137, 0x8139b138, 0x8139b139,
+ /* 88 */ 0x8139b230, 0x8139b231, 0x8139b232, 0x8139b233,
+ /* 8c */ 0x8139b234, 0x8139b235, 0x8139b236, 0x8139b237,
+ /* 90 */ 0x8139b238, 0x8139b239, 0x8139b330, 0x8139b331,
+ /* 94 */ 0x8139b332, 0x8139b333, 0x8139b334, 0x8139b335,
+ /* 98 */ 0x8139b336, 0x8139b337, 0x8139b338, 0x8139b339,
+ /* 9c */ 0x8139b430, 0x8139b431, 0x8139b432, 0x8139b433,
+ /* a0 */ 0x8139b434, 0x8139b435, 0x8139b436, 0x8139b437,
+ /* a4 */ 0x8139b438, 0x8139b439, 0x8139b530, 0x8139b531,
+ /* a8 */ 0x8139b532, 0x8139b533, 0x8139b534, 0x8139b535,
+ /* ac */ 0x8139b536, 0x8139b537, 0x8139b538, 0x8139b539,
+ /* b0 */ 0x8139b630, 0x8139b631, 0x8139b632, 0x8139b633,
+ /* b4 */ 0x8139b634, 0x8139b635, 0x8139b636, 0x8139b637,
+ /* b8 */ 0x8139b638, 0x8139b639, 0x8139b730, 0x8139b731,
+ /* bc */ 0x8139b732, 0x8139b733, 0x8139b734, 0x8139b735,
+
+ /*** Three byte table, leaf: e387xx - offset 0x0107e ***/
+
+ /* 80 */ 0x8139b736, 0x8139b737, 0x8139b738, 0x8139b739,
+ /* 84 */ 0x8139b830, 0x8139b831, 0x8139b832, 0x8139b833,
+ /* 88 */ 0x8139b834, 0x8139b835, 0x8139b836, 0x8139b837,
+ /* 8c */ 0x8139b838, 0x8139b839, 0x8139b930, 0x8139b931,
+ /* 90 */ 0x8139b932, 0x8139b933, 0x8139b934, 0x8139b935,
+ /* 94 */ 0x8139b936, 0x8139b937, 0x8139b938, 0x8139b939,
+ /* 98 */ 0x8139ba30, 0x8139ba31, 0x8139ba32, 0x8139ba33,
+ /* 9c */ 0x8139ba34, 0x8139ba35, 0x8139ba36, 0x8139ba37,
+ /* a0 */ 0x8139ba38, 0x8139ba39, 0x8139bb30, 0x8139bb31,
+ /* a4 */ 0x8139bb32, 0x8139bb33, 0x8139bb34, 0x8139bb35,
+ /* a8 */ 0x8139bb36, 0x8139bb37, 0x8139bb38, 0x8139bb39,
+ /* ac */ 0x8139bc30, 0x8139bc31, 0x8139bc32, 0x8139bc33,
+ /* b0 */ 0x8139bc34, 0x8139bc35, 0x8139bc36, 0x8139bc37,
+ /* b4 */ 0x8139bc38, 0x8139bc39, 0x8139bd30, 0x8139bd31,
+ /* b8 */ 0x8139bd32, 0x8139bd33, 0x8139bd34, 0x8139bd35,
+ /* bc */ 0x8139bd36, 0x8139bd37, 0x8139bd38, 0x8139bd39,
+
+ /*** Three byte table, leaf: e388xx - offset 0x010be ***/
+
+ /* 80 */ 0x8139be30, 0x8139be31, 0x8139be32, 0x8139be33,
+ /* 84 */ 0x8139be34, 0x8139be35, 0x8139be36, 0x8139be37,
+ /* 88 */ 0x8139be38, 0x8139be39, 0x8139bf30, 0x8139bf31,
+ /* 8c */ 0x8139bf32, 0x8139bf33, 0x8139bf34, 0x8139bf35,
+ /* 90 */ 0x8139bf36, 0x8139bf37, 0x8139bf38, 0x8139bf39,
+ /* 94 */ 0x8139c030, 0x8139c031, 0x8139c032, 0x8139c033,
+ /* 98 */ 0x8139c034, 0x8139c035, 0x8139c036, 0x8139c037,
+ /* 9c */ 0x8139c038, 0x8139c039, 0x8139c130, 0x8139c131,
+ /* a0 */ 0x0000a2e5, 0x0000a2e6, 0x0000a2e7, 0x0000a2e8,
+ /* a4 */ 0x0000a2e9, 0x0000a2ea, 0x0000a2eb, 0x0000a2ec,
+ /* a8 */ 0x0000a2ed, 0x0000a2ee, 0x8139c132, 0x8139c133,
+ /* ac */ 0x8139c134, 0x8139c135, 0x8139c136, 0x8139c137,
+ /* b0 */ 0x8139c138, 0x0000a95a, 0x8139c139, 0x8139c230,
+ /* b4 */ 0x8139c231, 0x8139c232, 0x8139c233, 0x8139c234,
+ /* b8 */ 0x8139c235, 0x8139c236, 0x8139c237, 0x8139c238,
+ /* bc */ 0x8139c239, 0x8139c330, 0x8139c331, 0x8139c332,
+
+ /*** Three byte table, leaf: e389xx - offset 0x010fe ***/
+
+ /* 80 */ 0x8139c333, 0x8139c334, 0x8139c335, 0x8139c336,
+ /* 84 */ 0x8139c337, 0x8139c338, 0x8139c339, 0x8139c430,
+ /* 88 */ 0x8139c431, 0x8139c432, 0x8139c433, 0x8139c434,
+ /* 8c */ 0x8139c435, 0x8139c436, 0x8139c437, 0x8139c438,
+ /* 90 */ 0x8139c439, 0x8139c530, 0x8139c531, 0x8139c532,
+ /* 94 */ 0x8139c533, 0x8139c534, 0x8139c535, 0x8139c536,
+ /* 98 */ 0x8139c537, 0x8139c538, 0x8139c539, 0x8139c630,
+ /* 9c */ 0x8139c631, 0x8139c632, 0x8139c633, 0x8139c634,
+ /* a0 */ 0x8139c635, 0x8139c636, 0x8139c637, 0x8139c638,
+ /* a4 */ 0x8139c639, 0x8139c730, 0x8139c731, 0x8139c732,
+ /* a8 */ 0x8139c733, 0x8139c734, 0x8139c735, 0x8139c736,
+ /* ac */ 0x8139c737, 0x8139c738, 0x8139c739, 0x8139c830,
+ /* b0 */ 0x8139c831, 0x8139c832, 0x8139c833, 0x8139c834,
+ /* b4 */ 0x8139c835, 0x8139c836, 0x8139c837, 0x8139c838,
+ /* b8 */ 0x8139c839, 0x8139c930, 0x8139c931, 0x8139c932,
+ /* bc */ 0x8139c933, 0x8139c934, 0x8139c935, 0x8139c936,
+
+ /*** Three byte table, leaf: e38axx - offset 0x0113e ***/
+
+ /* 80 */ 0x8139c937, 0x8139c938, 0x8139c939, 0x8139ca30,
+ /* 84 */ 0x8139ca31, 0x8139ca32, 0x8139ca33, 0x8139ca34,
+ /* 88 */ 0x8139ca35, 0x8139ca36, 0x8139ca37, 0x8139ca38,
+ /* 8c */ 0x8139ca39, 0x8139cb30, 0x8139cb31, 0x8139cb32,
+ /* 90 */ 0x8139cb33, 0x8139cb34, 0x8139cb35, 0x8139cb36,
+ /* 94 */ 0x8139cb37, 0x8139cb38, 0x8139cb39, 0x8139cc30,
+ /* 98 */ 0x8139cc31, 0x8139cc32, 0x8139cc33, 0x8139cc34,
+ /* 9c */ 0x8139cc35, 0x8139cc36, 0x8139cc37, 0x8139cc38,
+ /* a0 */ 0x8139cc39, 0x8139cd30, 0x8139cd31, 0x0000a949,
+ /* a4 */ 0x8139cd32, 0x8139cd33, 0x8139cd34, 0x8139cd35,
+ /* a8 */ 0x8139cd36, 0x8139cd37, 0x8139cd38, 0x8139cd39,
+ /* ac */ 0x8139ce30, 0x8139ce31, 0x8139ce32, 0x8139ce33,
+ /* b0 */ 0x8139ce34, 0x8139ce35, 0x8139ce36, 0x8139ce37,
+ /* b4 */ 0x8139ce38, 0x8139ce39, 0x8139cf30, 0x8139cf31,
+ /* b8 */ 0x8139cf32, 0x8139cf33, 0x8139cf34, 0x8139cf35,
+ /* bc */ 0x8139cf36, 0x8139cf37, 0x8139cf38, 0x8139cf39,
+
+ /*** Three byte table, leaf: e38bxx - offset 0x0117e ***/
+
+ /* 80 */ 0x8139d030, 0x8139d031, 0x8139d032, 0x8139d033,
+ /* 84 */ 0x8139d034, 0x8139d035, 0x8139d036, 0x8139d037,
+ /* 88 */ 0x8139d038, 0x8139d039, 0x8139d130, 0x8139d131,
+ /* 8c */ 0x8139d132, 0x8139d133, 0x8139d134, 0x8139d135,
+ /* 90 */ 0x8139d136, 0x8139d137, 0x8139d138, 0x8139d139,
+ /* 94 */ 0x8139d230, 0x8139d231, 0x8139d232, 0x8139d233,
+ /* 98 */ 0x8139d234, 0x8139d235, 0x8139d236, 0x8139d237,
+ /* 9c */ 0x8139d238, 0x8139d239, 0x8139d330, 0x8139d331,
+ /* a0 */ 0x8139d332, 0x8139d333, 0x8139d334, 0x8139d335,
+ /* a4 */ 0x8139d336, 0x8139d337, 0x8139d338, 0x8139d339,
+ /* a8 */ 0x8139d430, 0x8139d431, 0x8139d432, 0x8139d433,
+ /* ac */ 0x8139d434, 0x8139d435, 0x8139d436, 0x8139d437,
+ /* b0 */ 0x8139d438, 0x8139d439, 0x8139d530, 0x8139d531,
+ /* b4 */ 0x8139d532, 0x8139d533, 0x8139d534, 0x8139d535,
+ /* b8 */ 0x8139d536, 0x8139d537, 0x8139d538, 0x8139d539,
+ /* bc */ 0x8139d630, 0x8139d631, 0x8139d632, 0x8139d633,
+
+ /*** Three byte table, leaf: e38cxx - offset 0x011be ***/
+
+ /* 80 */ 0x8139d634, 0x8139d635, 0x8139d636, 0x8139d637,
+ /* 84 */ 0x8139d638, 0x8139d639, 0x8139d730, 0x8139d731,
+ /* 88 */ 0x8139d732, 0x8139d733, 0x8139d734, 0x8139d735,
+ /* 8c */ 0x8139d736, 0x8139d737, 0x8139d738, 0x8139d739,
+ /* 90 */ 0x8139d830, 0x8139d831, 0x8139d832, 0x8139d833,
+ /* 94 */ 0x8139d834, 0x8139d835, 0x8139d836, 0x8139d837,
+ /* 98 */ 0x8139d838, 0x8139d839, 0x8139d930, 0x8139d931,
+ /* 9c */ 0x8139d932, 0x8139d933, 0x8139d934, 0x8139d935,
+ /* a0 */ 0x8139d936, 0x8139d937, 0x8139d938, 0x8139d939,
+ /* a4 */ 0x8139da30, 0x8139da31, 0x8139da32, 0x8139da33,
+ /* a8 */ 0x8139da34, 0x8139da35, 0x8139da36, 0x8139da37,
+ /* ac */ 0x8139da38, 0x8139da39, 0x8139db30, 0x8139db31,
+ /* b0 */ 0x8139db32, 0x8139db33, 0x8139db34, 0x8139db35,
+ /* b4 */ 0x8139db36, 0x8139db37, 0x8139db38, 0x8139db39,
+ /* b8 */ 0x8139dc30, 0x8139dc31, 0x8139dc32, 0x8139dc33,
+ /* bc */ 0x8139dc34, 0x8139dc35, 0x8139dc36, 0x8139dc37,
+
+ /*** Three byte table, leaf: e38dxx - offset 0x011fe ***/
+
+ /* 80 */ 0x8139dc38, 0x8139dc39, 0x8139dd30, 0x8139dd31,
+ /* 84 */ 0x8139dd32, 0x8139dd33, 0x8139dd34, 0x8139dd35,
+ /* 88 */ 0x8139dd36, 0x8139dd37, 0x8139dd38, 0x8139dd39,
+ /* 8c */ 0x8139de30, 0x8139de31, 0x8139de32, 0x8139de33,
+ /* 90 */ 0x8139de34, 0x8139de35, 0x8139de36, 0x8139de37,
+ /* 94 */ 0x8139de38, 0x8139de39, 0x8139df30, 0x8139df31,
+ /* 98 */ 0x8139df32, 0x8139df33, 0x8139df34, 0x8139df35,
+ /* 9c */ 0x8139df36, 0x8139df37, 0x8139df38, 0x8139df39,
+ /* a0 */ 0x8139e030, 0x8139e031, 0x8139e032, 0x8139e033,
+ /* a4 */ 0x8139e034, 0x8139e035, 0x8139e036, 0x8139e037,
+ /* a8 */ 0x8139e038, 0x8139e039, 0x8139e130, 0x8139e131,
+ /* ac */ 0x8139e132, 0x8139e133, 0x8139e134, 0x8139e135,
+ /* b0 */ 0x8139e136, 0x8139e137, 0x8139e138, 0x8139e139,
+ /* b4 */ 0x8139e230, 0x8139e231, 0x8139e232, 0x8139e233,
+ /* b8 */ 0x8139e234, 0x8139e235, 0x8139e236, 0x8139e237,
+ /* bc */ 0x8139e238, 0x8139e239, 0x8139e330, 0x8139e331,
+
+ /*** Three byte table, leaf: e38exx - offset 0x0123e ***/
+
+ /* 80 */ 0x8139e332, 0x8139e333, 0x8139e334, 0x8139e335,
+ /* 84 */ 0x8139e336, 0x8139e337, 0x8139e338, 0x8139e339,
+ /* 88 */ 0x8139e430, 0x8139e431, 0x8139e432, 0x8139e433,
+ /* 8c */ 0x8139e434, 0x8139e435, 0x0000a94a, 0x0000a94b,
+ /* 90 */ 0x8139e436, 0x8139e437, 0x8139e438, 0x8139e439,
+ /* 94 */ 0x8139e530, 0x8139e531, 0x8139e532, 0x8139e533,
+ /* 98 */ 0x8139e534, 0x8139e535, 0x8139e536, 0x8139e537,
+ /* 9c */ 0x0000a94c, 0x0000a94d, 0x0000a94e, 0x8139e538,
+ /* a0 */ 0x8139e539, 0x0000a94f, 0x8139e630, 0x8139e631,
+ /* a4 */ 0x8139e632, 0x8139e633, 0x8139e634, 0x8139e635,
+ /* a8 */ 0x8139e636, 0x8139e637, 0x8139e638, 0x8139e639,
+ /* ac */ 0x8139e730, 0x8139e731, 0x8139e732, 0x8139e733,
+ /* b0 */ 0x8139e734, 0x8139e735, 0x8139e736, 0x8139e737,
+ /* b4 */ 0x8139e738, 0x8139e739, 0x8139e830, 0x8139e831,
+ /* b8 */ 0x8139e832, 0x8139e833, 0x8139e834, 0x8139e835,
+ /* bc */ 0x8139e836, 0x8139e837, 0x8139e838, 0x8139e839,
+
+ /*** Three byte table, leaf: e38fxx - offset 0x0127e ***/
+
+ /* 80 */ 0x8139e930, 0x8139e931, 0x8139e932, 0x8139e933,
+ /* 84 */ 0x0000a950, 0x8139e934, 0x8139e935, 0x8139e936,
+ /* 88 */ 0x8139e937, 0x8139e938, 0x8139e939, 0x8139ea30,
+ /* 8c */ 0x8139ea31, 0x8139ea32, 0x0000a951, 0x8139ea33,
+ /* 90 */ 0x8139ea34, 0x0000a952, 0x0000a953, 0x8139ea35,
+ /* 94 */ 0x8139ea36, 0x0000a954, 0x8139ea37, 0x8139ea38,
+ /* 98 */ 0x8139ea39, 0x8139eb30, 0x8139eb31, 0x8139eb32,
+ /* 9c */ 0x8139eb33, 0x8139eb34, 0x8139eb35, 0x8139eb36,
+ /* a0 */ 0x8139eb37, 0x8139eb38, 0x8139eb39, 0x8139ec30,
+ /* a4 */ 0x8139ec31, 0x8139ec32, 0x8139ec33, 0x8139ec34,
+ /* a8 */ 0x8139ec35, 0x8139ec36, 0x8139ec37, 0x8139ec38,
+ /* ac */ 0x8139ec39, 0x8139ed30, 0x8139ed31, 0x8139ed32,
+ /* b0 */ 0x8139ed33, 0x8139ed34, 0x8139ed35, 0x8139ed36,
+ /* b4 */ 0x8139ed37, 0x8139ed38, 0x8139ed39, 0x8139ee30,
+ /* b8 */ 0x8139ee31, 0x8139ee32, 0x8139ee33, 0x8139ee34,
+ /* bc */ 0x8139ee35, 0x8139ee36, 0x8139ee37, 0x8139ee38,
+
+ /*** Three byte table, leaf: e390xx - offset 0x012be ***/
+
+ /* 80 */ 0x8139ee39, 0x8139ef30, 0x8139ef31, 0x8139ef32,
+ /* 84 */ 0x8139ef33, 0x8139ef34, 0x8139ef35, 0x8139ef36,
+ /* 88 */ 0x8139ef37, 0x8139ef38, 0x8139ef39, 0x8139f030,
+ /* 8c */ 0x8139f031, 0x8139f032, 0x8139f033, 0x8139f034,
+ /* 90 */ 0x8139f035, 0x8139f036, 0x8139f037, 0x8139f038,
+ /* 94 */ 0x8139f039, 0x8139f130, 0x8139f131, 0x8139f132,
+ /* 98 */ 0x8139f133, 0x8139f134, 0x8139f135, 0x8139f136,
+ /* 9c */ 0x8139f137, 0x8139f138, 0x8139f139, 0x8139f230,
+ /* a0 */ 0x8139f231, 0x8139f232, 0x8139f233, 0x8139f234,
+ /* a4 */ 0x8139f235, 0x8139f236, 0x8139f237, 0x8139f238,
+ /* a8 */ 0x8139f239, 0x8139f330, 0x8139f331, 0x8139f332,
+ /* ac */ 0x8139f333, 0x8139f334, 0x8139f335, 0x8139f336,
+ /* b0 */ 0x8139f337, 0x8139f338, 0x8139f339, 0x8139f430,
+ /* b4 */ 0x8139f431, 0x8139f432, 0x8139f433, 0x8139f434,
+ /* b8 */ 0x8139f435, 0x8139f436, 0x8139f437, 0x8139f438,
+ /* bc */ 0x8139f439, 0x8139f530, 0x8139f531, 0x8139f532,
+
+ /*** Three byte table, leaf: e391xx - offset 0x012fe ***/
+
+ /* 80 */ 0x8139f533, 0x8139f534, 0x8139f535, 0x8139f536,
+ /* 84 */ 0x8139f537, 0x8139f538, 0x8139f539, 0x0000fe56,
+ /* 88 */ 0x8139f630, 0x8139f631, 0x8139f632, 0x8139f633,
+ /* 8c */ 0x8139f634, 0x8139f635, 0x8139f636, 0x8139f637,
+ /* 90 */ 0x8139f638, 0x8139f639, 0x8139f730, 0x8139f731,
+ /* 94 */ 0x8139f732, 0x8139f733, 0x8139f734, 0x8139f735,
+ /* 98 */ 0x8139f736, 0x8139f737, 0x8139f738, 0x8139f739,
+ /* 9c */ 0x8139f830, 0x8139f831, 0x8139f832, 0x8139f833,
+ /* a0 */ 0x8139f834, 0x8139f835, 0x8139f836, 0x8139f837,
+ /* a4 */ 0x8139f838, 0x8139f839, 0x8139f930, 0x8139f931,
+ /* a8 */ 0x8139f932, 0x8139f933, 0x8139f934, 0x8139f935,
+ /* ac */ 0x8139f936, 0x8139f937, 0x8139f938, 0x8139f939,
+ /* b0 */ 0x8139fa30, 0x8139fa31, 0x8139fa32, 0x0000fe55,
+ /* b4 */ 0x8139fa33, 0x8139fa34, 0x8139fa35, 0x8139fa36,
+ /* b8 */ 0x8139fa37, 0x8139fa38, 0x8139fa39, 0x8139fb30,
+ /* bc */ 0x8139fb31, 0x8139fb32, 0x8139fb33, 0x8139fb34,
+
+ /*** Three byte table, leaf: e392xx - offset 0x0133e ***/
+
+ /* 80 */ 0x8139fb35, 0x8139fb36, 0x8139fb37, 0x8139fb38,
+ /* 84 */ 0x8139fb39, 0x8139fc30, 0x8139fc31, 0x8139fc32,
+ /* 88 */ 0x8139fc33, 0x8139fc34, 0x8139fc35, 0x8139fc36,
+ /* 8c */ 0x8139fc37, 0x8139fc38, 0x8139fc39, 0x8139fd30,
+ /* 90 */ 0x8139fd31, 0x8139fd32, 0x8139fd33, 0x8139fd34,
+ /* 94 */ 0x8139fd35, 0x8139fd36, 0x8139fd37, 0x8139fd38,
+ /* 98 */ 0x8139fd39, 0x8139fe30, 0x8139fe31, 0x8139fe32,
+ /* 9c */ 0x8139fe33, 0x8139fe34, 0x8139fe35, 0x8139fe36,
+ /* a0 */ 0x8139fe37, 0x8139fe38, 0x8139fe39, 0x82308130,
+ /* a4 */ 0x82308131, 0x82308132, 0x82308133, 0x82308134,
+ /* a8 */ 0x82308135, 0x82308136, 0x82308137, 0x82308138,
+ /* ac */ 0x82308139, 0x82308230, 0x82308231, 0x82308232,
+ /* b0 */ 0x82308233, 0x82308234, 0x82308235, 0x82308236,
+ /* b4 */ 0x82308237, 0x82308238, 0x82308239, 0x82308330,
+ /* b8 */ 0x82308331, 0x82308332, 0x82308333, 0x82308334,
+ /* bc */ 0x82308335, 0x82308336, 0x82308337, 0x82308338,
+
+ /*** Three byte table, leaf: e393xx - offset 0x0137e ***/
+
+ /* 80 */ 0x82308339, 0x82308430, 0x82308431, 0x82308432,
+ /* 84 */ 0x82308433, 0x82308434, 0x82308435, 0x82308436,
+ /* 88 */ 0x82308437, 0x82308438, 0x82308439, 0x82308530,
+ /* 8c */ 0x82308531, 0x82308532, 0x82308533, 0x82308534,
+ /* 90 */ 0x82308535, 0x82308536, 0x82308537, 0x82308538,
+ /* 94 */ 0x82308539, 0x82308630, 0x82308631, 0x82308632,
+ /* 98 */ 0x82308633, 0x82308634, 0x82308635, 0x82308636,
+ /* 9c */ 0x82308637, 0x82308638, 0x82308639, 0x82308730,
+ /* a0 */ 0x82308731, 0x82308732, 0x82308733, 0x82308734,
+ /* a4 */ 0x82308735, 0x82308736, 0x82308737, 0x82308738,
+ /* a8 */ 0x82308739, 0x82308830, 0x82308831, 0x82308832,
+ /* ac */ 0x82308833, 0x82308834, 0x82308835, 0x82308836,
+ /* b0 */ 0x82308837, 0x82308838, 0x82308839, 0x82308930,
+ /* b4 */ 0x82308931, 0x82308932, 0x82308933, 0x82308934,
+ /* b8 */ 0x82308935, 0x82308936, 0x82308937, 0x82308938,
+ /* bc */ 0x82308939, 0x82308a30, 0x82308a31, 0x82308a32,
+
+ /*** Three byte table, leaf: e394xx - offset 0x013be ***/
+
+ /* 80 */ 0x82308a33, 0x82308a34, 0x82308a35, 0x82308a36,
+ /* 84 */ 0x82308a37, 0x82308a38, 0x82308a39, 0x82308b30,
+ /* 88 */ 0x82308b31, 0x82308b32, 0x82308b33, 0x82308b34,
+ /* 8c */ 0x82308b35, 0x82308b36, 0x82308b37, 0x82308b38,
+ /* 90 */ 0x82308b39, 0x82308c30, 0x82308c31, 0x82308c32,
+ /* 94 */ 0x82308c33, 0x82308c34, 0x82308c35, 0x82308c36,
+ /* 98 */ 0x82308c37, 0x82308c38, 0x82308c39, 0x82308d30,
+ /* 9c */ 0x82308d31, 0x82308d32, 0x82308d33, 0x82308d34,
+ /* a0 */ 0x82308d35, 0x82308d36, 0x82308d37, 0x82308d38,
+ /* a4 */ 0x82308d39, 0x82308e30, 0x82308e31, 0x82308e32,
+ /* a8 */ 0x82308e33, 0x82308e34, 0x82308e35, 0x82308e36,
+ /* ac */ 0x82308e37, 0x82308e38, 0x82308e39, 0x82308f30,
+ /* b0 */ 0x82308f31, 0x82308f32, 0x82308f33, 0x82308f34,
+ /* b4 */ 0x82308f35, 0x82308f36, 0x82308f37, 0x82308f38,
+ /* b8 */ 0x82308f39, 0x82309030, 0x82309031, 0x82309032,
+ /* bc */ 0x82309033, 0x82309034, 0x82309035, 0x82309036,
+
+ /*** Three byte table, leaf: e395xx - offset 0x013fe ***/
+
+ /* 80 */ 0x82309037, 0x82309038, 0x82309039, 0x82309130,
+ /* 84 */ 0x82309131, 0x82309132, 0x82309133, 0x82309134,
+ /* 88 */ 0x82309135, 0x82309136, 0x82309137, 0x82309138,
+ /* 8c */ 0x82309139, 0x82309230, 0x82309231, 0x82309232,
+ /* 90 */ 0x82309233, 0x82309234, 0x82309235, 0x82309236,
+ /* 94 */ 0x82309237, 0x82309238, 0x82309239, 0x82309330,
+ /* 98 */ 0x82309331, 0x82309332, 0x82309333, 0x82309334,
+ /* 9c */ 0x82309335, 0x82309336, 0x82309337, 0x82309338,
+ /* a0 */ 0x82309339, 0x82309430, 0x82309431, 0x82309432,
+ /* a4 */ 0x82309433, 0x82309434, 0x82309435, 0x82309436,
+ /* a8 */ 0x82309437, 0x82309438, 0x82309439, 0x82309530,
+ /* ac */ 0x82309531, 0x82309532, 0x82309533, 0x82309534,
+ /* b0 */ 0x82309535, 0x82309536, 0x82309537, 0x82309538,
+ /* b4 */ 0x82309539, 0x82309630, 0x82309631, 0x82309632,
+ /* b8 */ 0x82309633, 0x82309634, 0x82309635, 0x82309636,
+ /* bc */ 0x82309637, 0x82309638, 0x82309639, 0x82309730,
+
+ /*** Three byte table, leaf: e396xx - offset 0x0143e ***/
+
+ /* 80 */ 0x82309731, 0x82309732, 0x82309733, 0x82309734,
+ /* 84 */ 0x82309735, 0x82309736, 0x82309737, 0x82309738,
+ /* 88 */ 0x82309739, 0x82309830, 0x82309831, 0x82309832,
+ /* 8c */ 0x82309833, 0x82309834, 0x82309835, 0x82309836,
+ /* 90 */ 0x82309837, 0x82309838, 0x82309839, 0x82309930,
+ /* 94 */ 0x82309931, 0x82309932, 0x82309933, 0x82309934,
+ /* 98 */ 0x82309935, 0x82309936, 0x82309937, 0x82309938,
+ /* 9c */ 0x82309939, 0x82309a30, 0x0000fe5a, 0x82309a31,
+ /* a0 */ 0x82309a32, 0x82309a33, 0x82309a34, 0x82309a35,
+ /* a4 */ 0x82309a36, 0x82309a37, 0x82309a38, 0x82309a39,
+ /* a8 */ 0x82309b30, 0x82309b31, 0x82309b32, 0x82309b33,
+ /* ac */ 0x82309b34, 0x82309b35, 0x82309b36, 0x82309b37,
+ /* b0 */ 0x82309b38, 0x82309b39, 0x82309c30, 0x82309c31,
+ /* b4 */ 0x82309c32, 0x82309c33, 0x82309c34, 0x82309c35,
+ /* b8 */ 0x82309c36, 0x82309c37, 0x82309c38, 0x82309c39,
+ /* bc */ 0x82309d30, 0x82309d31, 0x82309d32, 0x82309d33,
+
+ /*** Three byte table, leaf: e397xx - offset 0x0147e ***/
+
+ /* 80 */ 0x82309d34, 0x82309d35, 0x82309d36, 0x82309d37,
+ /* 84 */ 0x82309d38, 0x82309d39, 0x82309e30, 0x82309e31,
+ /* 88 */ 0x82309e32, 0x82309e33, 0x82309e34, 0x82309e35,
+ /* 8c */ 0x82309e36, 0x82309e37, 0x82309e38, 0x82309e39,
+ /* 90 */ 0x82309f30, 0x82309f31, 0x82309f32, 0x82309f33,
+ /* 94 */ 0x82309f34, 0x82309f35, 0x82309f36, 0x82309f37,
+ /* 98 */ 0x82309f38, 0x82309f39, 0x8230a030, 0x8230a031,
+ /* 9c */ 0x8230a032, 0x8230a033, 0x8230a034, 0x8230a035,
+ /* a0 */ 0x8230a036, 0x8230a037, 0x8230a038, 0x8230a039,
+ /* a4 */ 0x8230a130, 0x8230a131, 0x8230a132, 0x8230a133,
+ /* a8 */ 0x8230a134, 0x8230a135, 0x8230a136, 0x8230a137,
+ /* ac */ 0x8230a138, 0x8230a139, 0x8230a230, 0x8230a231,
+ /* b0 */ 0x8230a232, 0x8230a233, 0x8230a234, 0x8230a235,
+ /* b4 */ 0x8230a236, 0x8230a237, 0x8230a238, 0x8230a239,
+ /* b8 */ 0x8230a330, 0x8230a331, 0x8230a332, 0x8230a333,
+ /* bc */ 0x8230a334, 0x8230a335, 0x8230a336, 0x8230a337,
+
+ /*** Three byte table, leaf: e398xx - offset 0x014be ***/
+
+ /* 80 */ 0x8230a338, 0x8230a339, 0x8230a430, 0x8230a431,
+ /* 84 */ 0x8230a432, 0x8230a433, 0x8230a434, 0x8230a435,
+ /* 88 */ 0x8230a436, 0x8230a437, 0x8230a438, 0x8230a439,
+ /* 8c */ 0x8230a530, 0x8230a531, 0x0000fe5c, 0x8230a532,
+ /* 90 */ 0x8230a533, 0x8230a534, 0x8230a535, 0x8230a536,
+ /* 94 */ 0x8230a537, 0x8230a538, 0x8230a539, 0x8230a630,
+ /* 98 */ 0x8230a631, 0x8230a632, 0x0000fe5b, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a4xx - offset 0x014e6 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x0000fe60, 0x8230f238, 0x8230f239, 0x8230f330,
+ /* 9c */ 0x8230f331, 0x8230f332, 0x8230f333, 0x8230f334,
+ /* a0 */ 0x8230f335, 0x8230f336, 0x8230f337, 0x8230f338,
+ /* a4 */ 0x8230f339, 0x8230f430, 0x8230f431, 0x8230f432,
+ /* a8 */ 0x8230f433, 0x8230f434, 0x8230f435, 0x8230f436,
+ /* ac */ 0x8230f437, 0x8230f438, 0x8230f439, 0x8230f530,
+ /* b0 */ 0x8230f531, 0x8230f532, 0x8230f533, 0x8230f534,
+ /* b4 */ 0x8230f535, 0x8230f536, 0x8230f537, 0x8230f538,
+ /* b8 */ 0x8230f539, 0x8230f630, 0x8230f631, 0x8230f632,
+ /* bc */ 0x8230f633, 0x8230f634, 0x8230f635, 0x8230f636,
+
+ /*** Three byte table, leaf: e3a5xx - offset 0x01526 ***/
+
+ /* 80 */ 0x8230f637, 0x8230f638, 0x8230f639, 0x8230f730,
+ /* 84 */ 0x8230f731, 0x8230f732, 0x8230f733, 0x8230f734,
+ /* 88 */ 0x8230f735, 0x8230f736, 0x8230f737, 0x8230f738,
+ /* 8c */ 0x8230f739, 0x8230f830, 0x8230f831, 0x8230f832,
+ /* 90 */ 0x8230f833, 0x8230f834, 0x8230f835, 0x8230f836,
+ /* 94 */ 0x8230f837, 0x8230f838, 0x8230f839, 0x8230f930,
+ /* 98 */ 0x8230f931, 0x8230f932, 0x8230f933, 0x8230f934,
+ /* 9c */ 0x8230f935, 0x8230f936, 0x8230f937, 0x8230f938,
+ /* a0 */ 0x8230f939, 0x8230fa30, 0x8230fa31, 0x8230fa32,
+ /* a4 */ 0x8230fa33, 0x8230fa34, 0x8230fa35, 0x8230fa36,
+ /* a8 */ 0x8230fa37, 0x8230fa38, 0x8230fa39, 0x8230fb30,
+ /* ac */ 0x8230fb31, 0x8230fb32, 0x0000fe5f, 0x8230fb33,
+ /* b0 */ 0x8230fb34, 0x8230fb35, 0x8230fb36, 0x8230fb37,
+ /* b4 */ 0x8230fb38, 0x8230fb39, 0x8230fc30, 0x8230fc31,
+ /* b8 */ 0x8230fc32, 0x8230fc33, 0x8230fc34, 0x8230fc35,
+ /* bc */ 0x8230fc36, 0x8230fc37, 0x8230fc38, 0x8230fc39,
+
+ /*** Three byte table, leaf: e3a6xx - offset 0x01566 ***/
+
+ /* 80 */ 0x8230fd30, 0x8230fd31, 0x8230fd32, 0x8230fd33,
+ /* 84 */ 0x8230fd34, 0x8230fd35, 0x8230fd36, 0x8230fd37,
+ /* 88 */ 0x8230fd38, 0x8230fd39, 0x8230fe30, 0x8230fe31,
+ /* 8c */ 0x8230fe32, 0x8230fe33, 0x8230fe34, 0x8230fe35,
+ /* 90 */ 0x8230fe36, 0x8230fe37, 0x8230fe38, 0x8230fe39,
+ /* 94 */ 0x82318130, 0x82318131, 0x82318132, 0x82318133,
+ /* 98 */ 0x82318134, 0x82318135, 0x82318136, 0x82318137,
+ /* 9c */ 0x82318138, 0x82318139, 0x82318230, 0x82318231,
+ /* a0 */ 0x82318232, 0x82318233, 0x82318234, 0x82318235,
+ /* a4 */ 0x82318236, 0x82318237, 0x82318238, 0x82318239,
+ /* a8 */ 0x82318330, 0x82318331, 0x82318332, 0x82318333,
+ /* ac */ 0x82318334, 0x82318335, 0x82318336, 0x82318337,
+ /* b0 */ 0x82318338, 0x82318339, 0x82318430, 0x82318431,
+ /* b4 */ 0x82318432, 0x82318433, 0x82318434, 0x82318435,
+ /* b8 */ 0x82318436, 0x82318437, 0x82318438, 0x82318439,
+ /* bc */ 0x82318530, 0x82318531, 0x82318532, 0x82318533,
+
+ /*** Three byte table, leaf: e3a7xx - offset 0x015a6 ***/
+
+ /* 80 */ 0x82318534, 0x82318535, 0x82318536, 0x82318537,
+ /* 84 */ 0x82318538, 0x82318539, 0x82318630, 0x82318631,
+ /* 88 */ 0x82318632, 0x82318633, 0x82318634, 0x82318635,
+ /* 8c */ 0x82318636, 0x82318637, 0x82318638, 0x0000fe62,
+ /* 90 */ 0x0000fe65, 0x82318639, 0x82318730, 0x82318731,
+ /* 94 */ 0x82318732, 0x82318733, 0x82318734, 0x82318735,
+ /* 98 */ 0x82318736, 0x82318737, 0x82318738, 0x82318739,
+ /* 9c */ 0x82318830, 0x82318831, 0x82318832, 0x0000fe63,
+ /* a0 */ 0x82318833, 0x82318834, 0x82318835, 0x82318836,
+ /* a4 */ 0x82318837, 0x82318838, 0x82318839, 0x82318930,
+ /* a8 */ 0x82318931, 0x82318932, 0x82318933, 0x82318934,
+ /* ac */ 0x82318935, 0x82318936, 0x82318937, 0x82318938,
+ /* b0 */ 0x82318939, 0x82318a30, 0x82318a31, 0x82318a32,
+ /* b4 */ 0x82318a33, 0x82318a34, 0x82318a35, 0x82318a36,
+ /* b8 */ 0x82318a37, 0x82318a38, 0x82318a39, 0x82318b30,
+ /* bc */ 0x82318b31, 0x82318b32, 0x82318b33, 0x82318b34,
+
+ /*** Three byte table, leaf: e3a8xx - offset 0x015e6 ***/
+
+ /* 80 */ 0x82318b35, 0x82318b36, 0x82318b37, 0x82318b38,
+ /* 84 */ 0x82318b39, 0x82318c30, 0x82318c31, 0x82318c32,
+ /* 88 */ 0x82318c33, 0x82318c34, 0x82318c35, 0x82318c36,
+ /* 8c */ 0x82318c37, 0x82318c38, 0x82318c39, 0x82318d30,
+ /* 90 */ 0x82318d31, 0x82318d32, 0x82318d33, 0x82318d34,
+ /* 94 */ 0x82318d35, 0x82318d36, 0x82318d37, 0x82318d38,
+ /* 98 */ 0x82318d39, 0x82318e30, 0x82318e31, 0x82318e32,
+ /* 9c */ 0x82318e33, 0x82318e34, 0x82318e35, 0x82318e36,
+ /* a0 */ 0x82318e37, 0x82318e38, 0x82318e39, 0x82318f30,
+ /* a4 */ 0x82318f31, 0x82318f32, 0x82318f33, 0x82318f34,
+ /* a8 */ 0x82318f35, 0x82318f36, 0x82318f37, 0x82318f38,
+ /* ac */ 0x82318f39, 0x82319030, 0x82319031, 0x82319032,
+ /* b0 */ 0x82319033, 0x82319034, 0x82319035, 0x82319036,
+ /* b4 */ 0x82319037, 0x82319038, 0x82319039, 0x82319130,
+ /* b8 */ 0x82319131, 0x82319132, 0x82319133, 0x82319134,
+ /* bc */ 0x82319135, 0x82319136, 0x82319137, 0x82319138,
+
+ /*** Three byte table, leaf: e3a9xx - offset 0x01626 ***/
+
+ /* 80 */ 0x82319139, 0x82319230, 0x82319231, 0x82319232,
+ /* 84 */ 0x82319233, 0x82319234, 0x82319235, 0x82319236,
+ /* 88 */ 0x82319237, 0x82319238, 0x82319239, 0x82319330,
+ /* 8c */ 0x82319331, 0x82319332, 0x82319333, 0x82319334,
+ /* 90 */ 0x82319335, 0x82319336, 0x82319337, 0x82319338,
+ /* 94 */ 0x82319339, 0x82319430, 0x82319431, 0x82319432,
+ /* 98 */ 0x82319433, 0x82319434, 0x82319435, 0x82319436,
+ /* 9c */ 0x82319437, 0x82319438, 0x82319439, 0x82319530,
+ /* a0 */ 0x82319531, 0x82319532, 0x82319533, 0x82319534,
+ /* a4 */ 0x82319535, 0x82319536, 0x82319537, 0x82319538,
+ /* a8 */ 0x82319539, 0x82319630, 0x82319631, 0x82319632,
+ /* ac */ 0x82319633, 0x82319634, 0x82319635, 0x82319636,
+ /* b0 */ 0x82319637, 0x82319638, 0x82319639, 0x0000fe64,
+ /* b4 */ 0x82319730, 0x82319731, 0x82319732, 0x82319733,
+ /* b8 */ 0x82319734, 0x82319735, 0x82319736, 0x82319737,
+ /* bc */ 0x82319738, 0x82319739, 0x82319830, 0x82319831,
+
+ /*** Three byte table, leaf: e3aaxx - offset 0x01666 ***/
+
+ /* 80 */ 0x82319832, 0x82319833, 0x82319834, 0x82319835,
+ /* 84 */ 0x82319836, 0x82319837, 0x82319838, 0x82319839,
+ /* 88 */ 0x82319930, 0x82319931, 0x82319932, 0x82319933,
+ /* 8c */ 0x82319934, 0x82319935, 0x82319936, 0x82319937,
+ /* 90 */ 0x82319938, 0x82319939, 0x82319a30, 0x82319a31,
+ /* 94 */ 0x82319a32, 0x82319a33, 0x82319a34, 0x82319a35,
+ /* 98 */ 0x82319a36, 0x82319a37, 0x82319a38, 0x82319a39,
+ /* 9c */ 0x82319b30, 0x82319b31, 0x82319b32, 0x82319b33,
+ /* a0 */ 0x82319b34, 0x82319b35, 0x82319b36, 0x82319b37,
+ /* a4 */ 0x82319b38, 0x82319b39, 0x82319c30, 0x82319c31,
+ /* a8 */ 0x82319c32, 0x82319c33, 0x82319c34, 0x82319c35,
+ /* ac */ 0x82319c36, 0x82319c37, 0x82319c38, 0x82319c39,
+ /* b0 */ 0x82319d30, 0x82319d31, 0x82319d32, 0x82319d33,
+ /* b4 */ 0x82319d34, 0x82319d35, 0x82319d36, 0x82319d37,
+ /* b8 */ 0x82319d38, 0x82319d39, 0x82319e30, 0x82319e31,
+ /* bc */ 0x82319e32, 0x82319e33, 0x82319e34, 0x82319e35,
+
+ /*** Three byte table, leaf: e3abxx - offset 0x016a6 ***/
+
+ /* 80 */ 0x82319e36, 0x82319e37, 0x82319e38, 0x82319e39,
+ /* 84 */ 0x82319f30, 0x82319f31, 0x82319f32, 0x82319f33,
+ /* 88 */ 0x82319f34, 0x82319f35, 0x82319f36, 0x82319f37,
+ /* 8c */ 0x82319f38, 0x82319f39, 0x8231a030, 0x8231a031,
+ /* 90 */ 0x8231a032, 0x8231a033, 0x8231a034, 0x8231a035,
+ /* 94 */ 0x8231a036, 0x8231a037, 0x8231a038, 0x8231a039,
+ /* 98 */ 0x8231a130, 0x8231a131, 0x8231a132, 0x8231a133,
+ /* 9c */ 0x8231a134, 0x8231a135, 0x8231a136, 0x8231a137,
+ /* a0 */ 0x8231a138, 0x8231a139, 0x8231a230, 0x8231a231,
+ /* a4 */ 0x8231a232, 0x8231a233, 0x8231a234, 0x8231a235,
+ /* a8 */ 0x8231a236, 0x8231a237, 0x8231a238, 0x8231a239,
+ /* ac */ 0x8231a330, 0x8231a331, 0x8231a332, 0x8231a333,
+ /* b0 */ 0x8231a334, 0x8231a335, 0x8231a336, 0x8231a337,
+ /* b4 */ 0x8231a338, 0x8231a339, 0x8231a430, 0x8231a431,
+ /* b8 */ 0x8231a432, 0x8231a433, 0x8231a434, 0x8231a435,
+ /* bc */ 0x8231a436, 0x8231a437, 0x8231a438, 0x8231a439,
+
+ /*** Three byte table, leaf: e3acxx - offset 0x016e6 ***/
+
+ /* 80 */ 0x8231a530, 0x8231a531, 0x8231a532, 0x8231a533,
+ /* 84 */ 0x8231a534, 0x8231a535, 0x8231a536, 0x8231a537,
+ /* 88 */ 0x8231a538, 0x8231a539, 0x8231a630, 0x8231a631,
+ /* 8c */ 0x8231a632, 0x8231a633, 0x8231a634, 0x8231a635,
+ /* 90 */ 0x8231a636, 0x8231a637, 0x8231a638, 0x8231a639,
+ /* 94 */ 0x8231a730, 0x8231a731, 0x8231a732, 0x8231a733,
+ /* 98 */ 0x8231a734, 0x8231a735, 0x8231a736, 0x8231a737,
+ /* 9c */ 0x8231a738, 0x8231a739, 0x8231a830, 0x8231a831,
+ /* a0 */ 0x8231a832, 0x8231a833, 0x8231a834, 0x8231a835,
+ /* a4 */ 0x8231a836, 0x8231a837, 0x8231a838, 0x8231a839,
+ /* a8 */ 0x8231a930, 0x8231a931, 0x8231a932, 0x8231a933,
+ /* ac */ 0x8231a934, 0x8231a935, 0x8231a936, 0x8231a937,
+ /* b0 */ 0x8231a938, 0x8231a939, 0x8231aa30, 0x8231aa31,
+ /* b4 */ 0x8231aa32, 0x8231aa33, 0x8231aa34, 0x8231aa35,
+ /* b8 */ 0x8231aa36, 0x8231aa37, 0x8231aa38, 0x8231aa39,
+ /* bc */ 0x8231ab30, 0x8231ab31, 0x8231ab32, 0x8231ab33,
+
+ /*** Three byte table, leaf: e3adxx - offset 0x01726 ***/
+
+ /* 80 */ 0x8231ab34, 0x8231ab35, 0x8231ab36, 0x8231ab37,
+ /* 84 */ 0x8231ab38, 0x8231ab39, 0x8231ac30, 0x8231ac31,
+ /* 88 */ 0x8231ac32, 0x8231ac33, 0x8231ac34, 0x8231ac35,
+ /* 8c */ 0x8231ac36, 0x8231ac37, 0x0000fe68, 0x8231ac38,
+ /* 90 */ 0x8231ac39, 0x8231ad30, 0x8231ad31, 0x8231ad32,
+ /* 94 */ 0x8231ad33, 0x8231ad34, 0x8231ad35, 0x8231ad36,
+ /* 98 */ 0x8231ad37, 0x8231ad38, 0x8231ad39, 0x8231ae30,
+ /* 9c */ 0x8231ae31, 0x8231ae32, 0x8231ae33, 0x8231ae34,
+ /* a0 */ 0x8231ae35, 0x8231ae36, 0x8231ae37, 0x8231ae38,
+ /* a4 */ 0x8231ae39, 0x8231af30, 0x8231af31, 0x8231af32,
+ /* a8 */ 0x8231af33, 0x8231af34, 0x8231af35, 0x8231af36,
+ /* ac */ 0x8231af37, 0x8231af38, 0x8231af39, 0x8231b030,
+ /* b0 */ 0x8231b031, 0x8231b032, 0x8231b033, 0x8231b034,
+ /* b4 */ 0x8231b035, 0x8231b036, 0x8231b037, 0x8231b038,
+ /* b8 */ 0x8231b039, 0x8231b130, 0x8231b131, 0x8231b132,
+ /* bc */ 0x8231b133, 0x8231b134, 0x8231b135, 0x8231b136,
+
+ /*** Three byte table, leaf: e3aexx - offset 0x01766 ***/
+
+ /* 80 */ 0x8231b137, 0x8231b138, 0x8231b139, 0x8231b230,
+ /* 84 */ 0x8231b231, 0x8231b232, 0x8231b233, 0x8231b234,
+ /* 88 */ 0x8231b235, 0x8231b236, 0x8231b237, 0x8231b238,
+ /* 8c */ 0x8231b239, 0x8231b330, 0x8231b331, 0x8231b332,
+ /* 90 */ 0x8231b333, 0x8231b334, 0x8231b335, 0x8231b336,
+ /* 94 */ 0x8231b337, 0x8231b338, 0x8231b339, 0x8231b430,
+ /* 98 */ 0x8231b431, 0x8231b432, 0x8231b433, 0x8231b434,
+ /* 9c */ 0x8231b435, 0x8231b436, 0x8231b437, 0x8231b438,
+ /* a0 */ 0x8231b439, 0x8231b530, 0x8231b531, 0x8231b532,
+ /* a4 */ 0x8231b533, 0x8231b534, 0x8231b535, 0x8231b536,
+ /* a8 */ 0x8231b537, 0x8231b538, 0x8231b539, 0x8231b630,
+ /* ac */ 0x8231b631, 0x8231b632, 0x8231b633, 0x8231b634,
+ /* b0 */ 0x8231b635, 0x8231b636, 0x8231b637, 0x8231b638,
+ /* b4 */ 0x8231b639, 0x8231b730, 0x8231b731, 0x8231b732,
+ /* b8 */ 0x8231b733, 0x8231b734, 0x8231b735, 0x8231b736,
+ /* bc */ 0x8231b737, 0x8231b738, 0x8231b739, 0x8231b830,
+
+ /*** Three byte table, leaf: e3afxx - offset 0x017a6 ***/
+
+ /* 80 */ 0x8231b831, 0x8231b832, 0x8231b833, 0x8231b834,
+ /* 84 */ 0x8231b835, 0x8231b836, 0x8231b837, 0x8231b838,
+ /* 88 */ 0x8231b839, 0x8231b930, 0x8231b931, 0x8231b932,
+ /* 8c */ 0x8231b933, 0x8231b934, 0x8231b935, 0x8231b936,
+ /* 90 */ 0x8231b937, 0x8231b938, 0x8231b939, 0x8231ba30,
+ /* 94 */ 0x8231ba31, 0x8231ba32, 0x8231ba33, 0x8231ba34,
+ /* 98 */ 0x8231ba35, 0x8231ba36, 0x8231ba37, 0x8231ba38,
+ /* 9c */ 0x8231ba39, 0x8231bb30, 0x8231bb31, 0x8231bb32,
+ /* a0 */ 0x8231bb33, 0x8231bb34, 0x8231bb35, 0x8231bb36,
+ /* a4 */ 0x8231bb37, 0x8231bb38, 0x8231bb39, 0x8231bc30,
+ /* a8 */ 0x8231bc31, 0x8231bc32, 0x8231bc33, 0x8231bc34,
+ /* ac */ 0x8231bc35, 0x8231bc36, 0x8231bc37, 0x8231bc38,
+ /* b0 */ 0x8231bc39, 0x8231bd30, 0x8231bd31, 0x8231bd32,
+ /* b4 */ 0x8231bd33, 0x8231bd34, 0x8231bd35, 0x8231bd36,
+ /* b8 */ 0x8231bd37, 0x8231bd38, 0x8231bd39, 0x8231be30,
+ /* bc */ 0x8231be31, 0x8231be32, 0x8231be33, 0x8231be34,
+
+ /*** Three byte table, leaf: e3b0xx - offset 0x017e6 ***/
+
+ /* 80 */ 0x8231be35, 0x8231be36, 0x8231be37, 0x8231be38,
+ /* 84 */ 0x8231be39, 0x8231bf30, 0x8231bf31, 0x8231bf32,
+ /* 88 */ 0x8231bf33, 0x8231bf34, 0x8231bf35, 0x8231bf36,
+ /* 8c */ 0x8231bf37, 0x8231bf38, 0x8231bf39, 0x8231c030,
+ /* 90 */ 0x8231c031, 0x8231c032, 0x8231c033, 0x8231c034,
+ /* 94 */ 0x8231c035, 0x8231c036, 0x8231c037, 0x8231c038,
+ /* 98 */ 0x8231c039, 0x8231c130, 0x8231c131, 0x8231c132,
+ /* 9c */ 0x8231c133, 0x8231c134, 0x8231c135, 0x8231c136,
+ /* a0 */ 0x8231c137, 0x8231c138, 0x8231c139, 0x8231c230,
+ /* a4 */ 0x8231c231, 0x8231c232, 0x8231c233, 0x8231c234,
+ /* a8 */ 0x8231c235, 0x8231c236, 0x8231c237, 0x8231c238,
+ /* ac */ 0x8231c239, 0x8231c330, 0x8231c331, 0x8231c332,
+ /* b0 */ 0x8231c333, 0x8231c334, 0x8231c335, 0x8231c336,
+ /* b4 */ 0x8231c337, 0x8231c338, 0x8231c339, 0x8231c430,
+ /* b8 */ 0x8231c431, 0x8231c432, 0x8231c433, 0x8231c434,
+ /* bc */ 0x8231c435, 0x8231c436, 0x8231c437, 0x8231c438,
+
+ /*** Three byte table, leaf: e3b1xx - offset 0x01826 ***/
+
+ /* 80 */ 0x8231c439, 0x8231c530, 0x8231c531, 0x8231c532,
+ /* 84 */ 0x8231c533, 0x8231c534, 0x8231c535, 0x8231c536,
+ /* 88 */ 0x8231c537, 0x8231c538, 0x8231c539, 0x8231c630,
+ /* 8c */ 0x8231c631, 0x8231c632, 0x8231c633, 0x8231c634,
+ /* 90 */ 0x8231c635, 0x8231c636, 0x8231c637, 0x8231c638,
+ /* 94 */ 0x8231c639, 0x8231c730, 0x8231c731, 0x8231c732,
+ /* 98 */ 0x8231c733, 0x8231c734, 0x8231c735, 0x8231c736,
+ /* 9c */ 0x8231c737, 0x8231c738, 0x8231c739, 0x8231c830,
+ /* a0 */ 0x8231c831, 0x8231c832, 0x8231c833, 0x8231c834,
+ /* a4 */ 0x8231c835, 0x8231c836, 0x8231c837, 0x8231c838,
+ /* a8 */ 0x8231c839, 0x8231c930, 0x8231c931, 0x8231c932,
+ /* ac */ 0x8231c933, 0x8231c934, 0x0000fe69, 0x8231c935,
+ /* b0 */ 0x8231c936, 0x8231c937, 0x8231c938, 0x8231c939,
+ /* b4 */ 0x8231ca30, 0x8231ca31, 0x8231ca32, 0x8231ca33,
+ /* b8 */ 0x8231ca34, 0x8231ca35, 0x8231ca36, 0x8231ca37,
+ /* bc */ 0x8231ca38, 0x8231ca39, 0x8231cb30, 0x8231cb31,
+
+ /*** Three byte table, leaf: e3b2xx - offset 0x01866 ***/
+
+ /* 80 */ 0x8231cb32, 0x8231cb33, 0x8231cb34, 0x8231cb35,
+ /* 84 */ 0x8231cb36, 0x8231cb37, 0x8231cb38, 0x8231cb39,
+ /* 88 */ 0x8231cc30, 0x8231cc31, 0x8231cc32, 0x8231cc33,
+ /* 8c */ 0x8231cc34, 0x8231cc35, 0x8231cc36, 0x8231cc37,
+ /* 90 */ 0x8231cc38, 0x8231cc39, 0x8231cd30, 0x8231cd31,
+ /* 94 */ 0x8231cd32, 0x8231cd33, 0x8231cd34, 0x8231cd35,
+ /* 98 */ 0x8231cd36, 0x8231cd37, 0x8231cd38, 0x8231cd39,
+ /* 9c */ 0x8231ce30, 0x8231ce31, 0x8231ce32, 0x8231ce33,
+ /* a0 */ 0x8231ce34, 0x8231ce35, 0x8231ce36, 0x8231ce37,
+ /* a4 */ 0x8231ce38, 0x8231ce39, 0x8231cf30, 0x8231cf31,
+ /* a8 */ 0x8231cf32, 0x8231cf33, 0x8231cf34, 0x8231cf35,
+ /* ac */ 0x8231cf36, 0x8231cf37, 0x8231cf38, 0x8231cf39,
+ /* b0 */ 0x8231d030, 0x8231d031, 0x8231d032, 0x8231d033,
+ /* b4 */ 0x8231d034, 0x8231d035, 0x8231d036, 0x8231d037,
+ /* b8 */ 0x8231d038, 0x8231d039, 0x8231d130, 0x8231d131,
+ /* bc */ 0x8231d132, 0x8231d133, 0x8231d134, 0x8231d135,
+
+ /*** Three byte table, leaf: e3b3xx - offset 0x018a6 ***/
+
+ /* 80 */ 0x8231d136, 0x8231d137, 0x8231d138, 0x8231d139,
+ /* 84 */ 0x8231d230, 0x8231d231, 0x8231d232, 0x8231d233,
+ /* 88 */ 0x8231d234, 0x8231d235, 0x8231d236, 0x8231d237,
+ /* 8c */ 0x8231d238, 0x8231d239, 0x8231d330, 0x8231d331,
+ /* 90 */ 0x8231d332, 0x8231d333, 0x8231d334, 0x8231d335,
+ /* 94 */ 0x8231d336, 0x8231d337, 0x8231d338, 0x8231d339,
+ /* 98 */ 0x8231d430, 0x8231d431, 0x8231d432, 0x8231d433,
+ /* 9c */ 0x8231d434, 0x8231d435, 0x8231d436, 0x8231d437,
+ /* a0 */ 0x0000fe6a, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e481xx - offset 0x018d0 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x0000fe6f, 0x8232af33,
+ /* 98 */ 0x8232af34, 0x8232af35, 0x8232af36, 0x8232af37,
+ /* 9c */ 0x8232af38, 0x8232af39, 0x8232b030, 0x8232b031,
+ /* a0 */ 0x8232b032, 0x8232b033, 0x8232b034, 0x8232b035,
+ /* a4 */ 0x8232b036, 0x8232b037, 0x8232b038, 0x8232b039,
+ /* a8 */ 0x8232b130, 0x8232b131, 0x8232b132, 0x8232b133,
+ /* ac */ 0x8232b134, 0x8232b135, 0x8232b136, 0x8232b137,
+ /* b0 */ 0x8232b138, 0x8232b139, 0x8232b230, 0x8232b231,
+ /* b4 */ 0x8232b232, 0x8232b233, 0x8232b234, 0x8232b235,
+ /* b8 */ 0x8232b236, 0x8232b237, 0x8232b238, 0x8232b239,
+ /* bc */ 0x8232b330, 0x8232b331, 0x8232b332, 0x8232b333,
+
+ /*** Three byte table, leaf: e482xx - offset 0x01910 ***/
+
+ /* 80 */ 0x8232b334, 0x8232b335, 0x8232b336, 0x8232b337,
+ /* 84 */ 0x8232b338, 0x8232b339, 0x8232b430, 0x8232b431,
+ /* 88 */ 0x8232b432, 0x8232b433, 0x8232b434, 0x8232b435,
+ /* 8c */ 0x8232b436, 0x8232b437, 0x8232b438, 0x8232b439,
+ /* 90 */ 0x8232b530, 0x8232b531, 0x8232b532, 0x8232b533,
+ /* 94 */ 0x8232b534, 0x8232b535, 0x8232b536, 0x8232b537,
+ /* 98 */ 0x8232b538, 0x8232b539, 0x8232b630, 0x8232b631,
+ /* 9c */ 0x8232b632, 0x8232b633, 0x8232b634, 0x8232b635,
+ /* a0 */ 0x8232b636, 0x8232b637, 0x8232b638, 0x8232b639,
+ /* a4 */ 0x8232b730, 0x8232b731, 0x8232b732, 0x8232b733,
+ /* a8 */ 0x8232b734, 0x8232b735, 0x8232b736, 0x8232b737,
+ /* ac */ 0x8232b738, 0x8232b739, 0x8232b830, 0x8232b831,
+ /* b0 */ 0x8232b832, 0x8232b833, 0x8232b834, 0x8232b835,
+ /* b4 */ 0x8232b836, 0x8232b837, 0x8232b838, 0x8232b839,
+ /* b8 */ 0x8232b930, 0x8232b931, 0x8232b932, 0x8232b933,
+ /* bc */ 0x8232b934, 0x8232b935, 0x8232b936, 0x8232b937,
+
+ /*** Three byte table, leaf: e483xx - offset 0x01950 ***/
+
+ /* 80 */ 0x8232b938, 0x8232b939, 0x8232ba30, 0x8232ba31,
+ /* 84 */ 0x8232ba32, 0x8232ba33, 0x8232ba34, 0x8232ba35,
+ /* 88 */ 0x8232ba36, 0x8232ba37, 0x8232ba38, 0x8232ba39,
+ /* 8c */ 0x8232bb30, 0x8232bb31, 0x8232bb32, 0x8232bb33,
+ /* 90 */ 0x8232bb34, 0x8232bb35, 0x8232bb36, 0x8232bb37,
+ /* 94 */ 0x8232bb38, 0x8232bb39, 0x8232bc30, 0x8232bc31,
+ /* 98 */ 0x8232bc32, 0x8232bc33, 0x8232bc34, 0x8232bc35,
+ /* 9c */ 0x8232bc36, 0x8232bc37, 0x8232bc38, 0x8232bc39,
+ /* a0 */ 0x8232bd30, 0x8232bd31, 0x8232bd32, 0x8232bd33,
+ /* a4 */ 0x8232bd34, 0x8232bd35, 0x8232bd36, 0x8232bd37,
+ /* a8 */ 0x8232bd38, 0x8232bd39, 0x8232be30, 0x8232be31,
+ /* ac */ 0x8232be32, 0x8232be33, 0x8232be34, 0x8232be35,
+ /* b0 */ 0x8232be36, 0x8232be37, 0x8232be38, 0x8232be39,
+ /* b4 */ 0x8232bf30, 0x8232bf31, 0x8232bf32, 0x8232bf33,
+ /* b8 */ 0x8232bf34, 0x8232bf35, 0x8232bf36, 0x8232bf37,
+ /* bc */ 0x8232bf38, 0x8232bf39, 0x8232c030, 0x8232c031,
+
+ /*** Three byte table, leaf: e484xx - offset 0x01990 ***/
+
+ /* 80 */ 0x8232c032, 0x8232c033, 0x8232c034, 0x8232c035,
+ /* 84 */ 0x8232c036, 0x8232c037, 0x8232c038, 0x8232c039,
+ /* 88 */ 0x8232c130, 0x8232c131, 0x8232c132, 0x8232c133,
+ /* 8c */ 0x8232c134, 0x8232c135, 0x8232c136, 0x8232c137,
+ /* 90 */ 0x8232c138, 0x8232c139, 0x8232c230, 0x8232c231,
+ /* 94 */ 0x8232c232, 0x8232c233, 0x8232c234, 0x8232c235,
+ /* 98 */ 0x8232c236, 0x8232c237, 0x8232c238, 0x8232c239,
+ /* 9c */ 0x8232c330, 0x8232c331, 0x8232c332, 0x8232c333,
+ /* a0 */ 0x8232c334, 0x8232c335, 0x8232c336, 0x8232c337,
+ /* a4 */ 0x8232c338, 0x8232c339, 0x8232c430, 0x8232c431,
+ /* a8 */ 0x8232c432, 0x8232c433, 0x8232c434, 0x8232c435,
+ /* ac */ 0x8232c436, 0x8232c437, 0x8232c438, 0x8232c439,
+ /* b0 */ 0x8232c530, 0x8232c531, 0x8232c532, 0x8232c533,
+ /* b4 */ 0x8232c534, 0x8232c535, 0x8232c536, 0x8232c537,
+ /* b8 */ 0x8232c538, 0x8232c539, 0x8232c630, 0x8232c631,
+ /* bc */ 0x8232c632, 0x8232c633, 0x8232c634, 0x8232c635,
+
+ /*** Three byte table, leaf: e485xx - offset 0x019d0 ***/
+
+ /* 80 */ 0x8232c636, 0x8232c637, 0x8232c638, 0x8232c639,
+ /* 84 */ 0x8232c730, 0x8232c731, 0x8232c732, 0x8232c733,
+ /* 88 */ 0x8232c734, 0x8232c735, 0x8232c736, 0x8232c737,
+ /* 8c */ 0x8232c738, 0x8232c739, 0x8232c830, 0x8232c831,
+ /* 90 */ 0x8232c832, 0x8232c833, 0x8232c834, 0x8232c835,
+ /* 94 */ 0x8232c836, 0x8232c837, 0x8232c838, 0x8232c839,
+ /* 98 */ 0x8232c930, 0x8232c931, 0x8232c932, 0x8232c933,
+ /* 9c */ 0x8232c934, 0x8232c935, 0x8232c936, 0x0000fe70,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48cxx - offset 0x019f0 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000fe72,
+ /* b8 */ 0x8232f838, 0x8232f839, 0x8232f930, 0x8232f931,
+ /* bc */ 0x8232f932, 0x8232f933, 0x8232f934, 0x8232f935,
+
+ /*** Three byte table, leaf: e48dxx - offset 0x01a30 ***/
+
+ /* 80 */ 0x8232f936, 0x8232f937, 0x8232f938, 0x8232f939,
+ /* 84 */ 0x8232fa30, 0x8232fa31, 0x8232fa32, 0x8232fa33,
+ /* 88 */ 0x8232fa34, 0x8232fa35, 0x8232fa36, 0x8232fa37,
+ /* 8c */ 0x8232fa38, 0x8232fa39, 0x8232fb30, 0x8232fb31,
+ /* 90 */ 0x8232fb32, 0x8232fb33, 0x8232fb34, 0x8232fb35,
+ /* 94 */ 0x8232fb36, 0x8232fb37, 0x8232fb38, 0x8232fb39,
+ /* 98 */ 0x8232fc30, 0x8232fc31, 0x8232fc32, 0x8232fc33,
+ /* 9c */ 0x8232fc34, 0x8232fc35, 0x8232fc36, 0x8232fc37,
+ /* a0 */ 0x8232fc38, 0x8232fc39, 0x8232fd30, 0x8232fd31,
+ /* a4 */ 0x8232fd32, 0x8232fd33, 0x8232fd34, 0x8232fd35,
+ /* a8 */ 0x8232fd36, 0x8232fd37, 0x8232fd38, 0x8232fd39,
+ /* ac */ 0x8232fe30, 0x8232fe31, 0x8232fe32, 0x8232fe33,
+ /* b0 */ 0x8232fe34, 0x8232fe35, 0x8232fe36, 0x8232fe37,
+ /* b4 */ 0x8232fe38, 0x8232fe39, 0x82338130, 0x82338131,
+ /* b8 */ 0x82338132, 0x82338133, 0x82338134, 0x82338135,
+ /* bc */ 0x82338136, 0x82338137, 0x82338138, 0x82338139,
+
+ /*** Three byte table, leaf: e48exx - offset 0x01a70 ***/
+
+ /* 80 */ 0x82338230, 0x82338231, 0x82338232, 0x82338233,
+ /* 84 */ 0x82338234, 0x82338235, 0x82338236, 0x82338237,
+ /* 88 */ 0x82338238, 0x82338239, 0x82338330, 0x82338331,
+ /* 8c */ 0x82338332, 0x82338333, 0x82338334, 0x82338335,
+ /* 90 */ 0x82338336, 0x82338337, 0x82338338, 0x82338339,
+ /* 94 */ 0x82338430, 0x82338431, 0x82338432, 0x82338433,
+ /* 98 */ 0x82338434, 0x82338435, 0x82338436, 0x82338437,
+ /* 9c */ 0x82338438, 0x82338439, 0x82338530, 0x82338531,
+ /* a0 */ 0x82338532, 0x82338533, 0x82338534, 0x82338535,
+ /* a4 */ 0x82338536, 0x82338537, 0x82338538, 0x82338539,
+ /* a8 */ 0x82338630, 0x82338631, 0x82338632, 0x82338633,
+ /* ac */ 0x0000fe78, 0x82338634, 0x82338635, 0x82338636,
+ /* b0 */ 0x82338637, 0x0000fe77, 0x82338638, 0x82338639,
+ /* b4 */ 0x82338730, 0x82338731, 0x82338732, 0x82338733,
+ /* b8 */ 0x82338734, 0x82338735, 0x82338736, 0x82338737,
+ /* bc */ 0x82338738, 0x82338739, 0x82338830, 0x82338831,
+
+ /*** Three byte table, leaf: e48fxx - offset 0x01ab0 ***/
+
+ /* 80 */ 0x82338832, 0x82338833, 0x82338834, 0x82338835,
+ /* 84 */ 0x82338836, 0x82338837, 0x82338838, 0x82338839,
+ /* 88 */ 0x82338930, 0x82338931, 0x82338932, 0x82338933,
+ /* 8c */ 0x82338934, 0x82338935, 0x82338936, 0x82338937,
+ /* 90 */ 0x82338938, 0x82338939, 0x82338a30, 0x82338a31,
+ /* 94 */ 0x82338a32, 0x82338a33, 0x82338a34, 0x82338a35,
+ /* 98 */ 0x82338a36, 0x82338a37, 0x82338a38, 0x82338a39,
+ /* 9c */ 0x82338b30, 0x0000fe7a, 0x82338b31, 0x82338b32,
+ /* a0 */ 0x82338b33, 0x82338b34, 0x82338b35, 0x82338b36,
+ /* a4 */ 0x82338b37, 0x82338b38, 0x82338b39, 0x82338c30,
+ /* a8 */ 0x82338c31, 0x82338c32, 0x82338c33, 0x82338c34,
+ /* ac */ 0x82338c35, 0x82338c36, 0x82338c37, 0x82338c38,
+ /* b0 */ 0x82338c39, 0x82338d30, 0x82338d31, 0x82338d32,
+ /* b4 */ 0x82338d33, 0x82338d34, 0x82338d35, 0x82338d36,
+ /* b8 */ 0x82338d37, 0x82338d38, 0x82338d39, 0x82338e30,
+ /* bc */ 0x82338e31, 0x82338e32, 0x82338e33, 0x82338e34,
+
+ /*** Three byte table, leaf: e490xx - offset 0x01af0 ***/
+
+ /* 80 */ 0x82338e35, 0x82338e36, 0x82338e37, 0x82338e38,
+ /* 84 */ 0x82338e39, 0x82338f30, 0x82338f31, 0x82338f32,
+ /* 88 */ 0x82338f33, 0x82338f34, 0x82338f35, 0x82338f36,
+ /* 8c */ 0x82338f37, 0x82338f38, 0x82338f39, 0x82339030,
+ /* 90 */ 0x82339031, 0x82339032, 0x82339033, 0x82339034,
+ /* 94 */ 0x82339035, 0x82339036, 0x82339037, 0x82339038,
+ /* 98 */ 0x82339039, 0x82339130, 0x82339131, 0x82339132,
+ /* 9c */ 0x82339133, 0x82339134, 0x82339135, 0x82339136,
+ /* a0 */ 0x82339137, 0x82339138, 0x82339139, 0x82339230,
+ /* a4 */ 0x82339231, 0x82339232, 0x82339233, 0x82339234,
+ /* a8 */ 0x82339235, 0x82339236, 0x82339237, 0x82339238,
+ /* ac */ 0x82339239, 0x82339330, 0x82339331, 0x82339332,
+ /* b0 */ 0x82339333, 0x82339334, 0x82339335, 0x82339336,
+ /* b4 */ 0x82339337, 0x82339338, 0x82339339, 0x82339430,
+ /* b8 */ 0x82339431, 0x82339432, 0x82339433, 0x82339434,
+ /* bc */ 0x82339435, 0x82339436, 0x82339437, 0x82339438,
+
+ /*** Three byte table, leaf: e491xx - offset 0x01b30 ***/
+
+ /* 80 */ 0x82339439, 0x82339530, 0x82339531, 0x82339532,
+ /* 84 */ 0x82339533, 0x82339534, 0x82339535, 0x82339536,
+ /* 88 */ 0x82339537, 0x82339538, 0x82339539, 0x82339630,
+ /* 8c */ 0x82339631, 0x82339632, 0x82339633, 0x82339634,
+ /* 90 */ 0x82339635, 0x82339636, 0x82339637, 0x82339638,
+ /* 94 */ 0x82339639, 0x82339730, 0x82339731, 0x82339732,
+ /* 98 */ 0x82339733, 0x82339734, 0x82339735, 0x82339736,
+ /* 9c */ 0x82339737, 0x82339738, 0x82339739, 0x82339830,
+ /* a0 */ 0x82339831, 0x82339832, 0x82339833, 0x82339834,
+ /* a4 */ 0x82339835, 0x82339836, 0x82339837, 0x82339838,
+ /* a8 */ 0x82339839, 0x82339930, 0x82339931, 0x82339932,
+ /* ac */ 0x82339933, 0x82339934, 0x82339935, 0x82339936,
+ /* b0 */ 0x82339937, 0x82339938, 0x82339939, 0x82339a30,
+ /* b4 */ 0x82339a31, 0x82339a32, 0x82339a33, 0x82339a34,
+ /* b8 */ 0x82339a35, 0x82339a36, 0x82339a37, 0x82339a38,
+ /* bc */ 0x82339a39, 0x82339b30, 0x82339b31, 0x82339b32,
+
+ /*** Three byte table, leaf: e492xx - offset 0x01b70 ***/
+
+ /* 80 */ 0x82339b33, 0x82339b34, 0x82339b35, 0x82339b36,
+ /* 84 */ 0x82339b37, 0x82339b38, 0x82339b39, 0x82339c30,
+ /* 88 */ 0x82339c31, 0x82339c32, 0x82339c33, 0x82339c34,
+ /* 8c */ 0x82339c35, 0x82339c36, 0x82339c37, 0x82339c38,
+ /* 90 */ 0x82339c39, 0x82339d30, 0x82339d31, 0x82339d32,
+ /* 94 */ 0x82339d33, 0x82339d34, 0x82339d35, 0x82339d36,
+ /* 98 */ 0x82339d37, 0x82339d38, 0x82339d39, 0x82339e30,
+ /* 9c */ 0x82339e31, 0x82339e32, 0x82339e33, 0x82339e34,
+ /* a0 */ 0x82339e35, 0x82339e36, 0x82339e37, 0x82339e38,
+ /* a4 */ 0x82339e39, 0x82339f30, 0x82339f31, 0x82339f32,
+ /* a8 */ 0x82339f33, 0x82339f34, 0x82339f35, 0x82339f36,
+ /* ac */ 0x82339f37, 0x82339f38, 0x82339f39, 0x8233a030,
+ /* b0 */ 0x8233a031, 0x8233a032, 0x8233a033, 0x8233a034,
+ /* b4 */ 0x8233a035, 0x8233a036, 0x8233a037, 0x8233a038,
+ /* b8 */ 0x8233a039, 0x8233a130, 0x8233a131, 0x8233a132,
+ /* bc */ 0x8233a133, 0x8233a134, 0x8233a135, 0x8233a136,
+
+ /*** Three byte table, leaf: e493xx - offset 0x01bb0 ***/
+
+ /* 80 */ 0x8233a137, 0x8233a138, 0x8233a139, 0x8233a230,
+ /* 84 */ 0x8233a231, 0x8233a232, 0x8233a233, 0x8233a234,
+ /* 88 */ 0x8233a235, 0x8233a236, 0x8233a237, 0x8233a238,
+ /* 8c */ 0x8233a239, 0x8233a330, 0x8233a331, 0x8233a332,
+ /* 90 */ 0x8233a333, 0x8233a334, 0x8233a335, 0x8233a336,
+ /* 94 */ 0x8233a337, 0x8233a338, 0x0000fe7b, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e499xx - offset 0x01be4 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x0000fe7d, 0x8233c932, 0x8233c933, 0x8233c934,
+ /* 90 */ 0x8233c935, 0x8233c936, 0x8233c937, 0x8233c938,
+ /* 94 */ 0x8233c939, 0x8233ca30, 0x8233ca31, 0x8233ca32,
+ /* 98 */ 0x8233ca33, 0x8233ca34, 0x8233ca35, 0x8233ca36,
+ /* 9c */ 0x8233ca37, 0x8233ca38, 0x8233ca39, 0x8233cb30,
+ /* a0 */ 0x8233cb31, 0x0000fe7c, 0x8233cb32, 0x8233cb33,
+ /* a4 */ 0x8233cb34, 0x8233cb35, 0x8233cb36, 0x8233cb37,
+ /* a8 */ 0x8233cb38, 0x8233cb39, 0x8233cc30, 0x8233cc31,
+ /* ac */ 0x8233cc32, 0x8233cc33, 0x8233cc34, 0x8233cc35,
+ /* b0 */ 0x8233cc36, 0x8233cc37, 0x8233cc38, 0x8233cc39,
+ /* b4 */ 0x8233cd30, 0x8233cd31, 0x8233cd32, 0x8233cd33,
+ /* b8 */ 0x8233cd34, 0x8233cd35, 0x8233cd36, 0x8233cd37,
+ /* bc */ 0x8233cd38, 0x8233cd39, 0x8233ce30, 0x8233ce31,
+
+ /*** Three byte table, leaf: e49axx - offset 0x01c24 ***/
+
+ /* 80 */ 0x8233ce32, 0x8233ce33, 0x8233ce34, 0x8233ce35,
+ /* 84 */ 0x8233ce36, 0x8233ce37, 0x8233ce38, 0x8233ce39,
+ /* 88 */ 0x8233cf30, 0x8233cf31, 0x8233cf32, 0x8233cf33,
+ /* 8c */ 0x8233cf34, 0x8233cf35, 0x8233cf36, 0x8233cf37,
+ /* 90 */ 0x8233cf38, 0x8233cf39, 0x8233d030, 0x8233d031,
+ /* 94 */ 0x8233d032, 0x8233d033, 0x8233d034, 0x8233d035,
+ /* 98 */ 0x8233d036, 0x8233d037, 0x8233d038, 0x8233d039,
+ /* 9c */ 0x8233d130, 0x8233d131, 0x8233d132, 0x8233d133,
+ /* a0 */ 0x8233d134, 0x8233d135, 0x8233d136, 0x8233d137,
+ /* a4 */ 0x8233d138, 0x8233d139, 0x8233d230, 0x8233d231,
+ /* a8 */ 0x8233d232, 0x8233d233, 0x8233d234, 0x8233d235,
+ /* ac */ 0x8233d236, 0x8233d237, 0x8233d238, 0x8233d239,
+ /* b0 */ 0x8233d330, 0x8233d331, 0x8233d332, 0x8233d333,
+ /* b4 */ 0x8233d334, 0x8233d335, 0x8233d336, 0x8233d337,
+ /* b8 */ 0x8233d338, 0x8233d339, 0x8233d430, 0x8233d431,
+ /* bc */ 0x8233d432, 0x8233d433, 0x8233d434, 0x8233d435,
+
+ /*** Three byte table, leaf: e49bxx - offset 0x01c64 ***/
+
+ /* 80 */ 0x8233d436, 0x8233d437, 0x8233d438, 0x8233d439,
+ /* 84 */ 0x8233d530, 0x8233d531, 0x8233d532, 0x8233d533,
+ /* 88 */ 0x8233d534, 0x8233d535, 0x8233d536, 0x8233d537,
+ /* 8c */ 0x8233d538, 0x8233d539, 0x8233d630, 0x8233d631,
+ /* 90 */ 0x8233d632, 0x8233d633, 0x8233d634, 0x8233d635,
+ /* 94 */ 0x8233d636, 0x8233d637, 0x8233d638, 0x8233d639,
+ /* 98 */ 0x8233d730, 0x8233d731, 0x8233d732, 0x8233d733,
+ /* 9c */ 0x8233d734, 0x8233d735, 0x8233d736, 0x8233d737,
+ /* a0 */ 0x8233d738, 0x8233d739, 0x8233d830, 0x8233d831,
+ /* a4 */ 0x8233d832, 0x8233d833, 0x8233d834, 0x8233d835,
+ /* a8 */ 0x8233d836, 0x8233d837, 0x8233d838, 0x8233d839,
+ /* ac */ 0x8233d930, 0x8233d931, 0x8233d932, 0x8233d933,
+ /* b0 */ 0x8233d934, 0x8233d935, 0x8233d936, 0x8233d937,
+ /* b4 */ 0x8233d938, 0x8233d939, 0x8233da30, 0x8233da31,
+ /* b8 */ 0x8233da32, 0x8233da33, 0x8233da34, 0x8233da35,
+ /* bc */ 0x8233da36, 0x8233da37, 0x8233da38, 0x8233da39,
+
+ /*** Three byte table, leaf: e49cxx - offset 0x01ca4 ***/
+
+ /* 80 */ 0x8233db30, 0x8233db31, 0x8233db32, 0x8233db33,
+ /* 84 */ 0x8233db34, 0x8233db35, 0x8233db36, 0x8233db37,
+ /* 88 */ 0x8233db38, 0x8233db39, 0x8233dc30, 0x8233dc31,
+ /* 8c */ 0x8233dc32, 0x8233dc33, 0x8233dc34, 0x8233dc35,
+ /* 90 */ 0x8233dc36, 0x8233dc37, 0x8233dc38, 0x8233dc39,
+ /* 94 */ 0x8233dd30, 0x8233dd31, 0x8233dd32, 0x8233dd33,
+ /* 98 */ 0x8233dd34, 0x8233dd35, 0x8233dd36, 0x8233dd37,
+ /* 9c */ 0x8233dd38, 0x8233dd39, 0x8233de30, 0x8233de31,
+ /* a0 */ 0x8233de32, 0x8233de33, 0x8233de34, 0x0000fe80,
+ /* a4 */ 0x8233de35, 0x8233de36, 0x8233de37, 0x8233de38,
+ /* a8 */ 0x8233de39, 0x0000fe81, 0x8233df30, 0x8233df31,
+ /* ac */ 0x8233df32, 0x8233df33, 0x8233df34, 0x8233df35,
+ /* b0 */ 0x8233df36, 0x8233df37, 0x8233df38, 0x8233df39,
+ /* b4 */ 0x8233e030, 0x8233e031, 0x8233e032, 0x8233e033,
+ /* b8 */ 0x8233e034, 0x8233e035, 0x8233e036, 0x8233e037,
+ /* bc */ 0x8233e038, 0x8233e039, 0x8233e130, 0x8233e131,
+
+ /*** Three byte table, leaf: e49dxx - offset 0x01ce4 ***/
+
+ /* 80 */ 0x8233e132, 0x8233e133, 0x8233e134, 0x8233e135,
+ /* 84 */ 0x8233e136, 0x8233e137, 0x8233e138, 0x8233e139,
+ /* 88 */ 0x8233e230, 0x8233e231, 0x8233e232, 0x8233e233,
+ /* 8c */ 0x8233e234, 0x8233e235, 0x8233e236, 0x8233e237,
+ /* 90 */ 0x8233e238, 0x8233e239, 0x8233e330, 0x8233e331,
+ /* 94 */ 0x8233e332, 0x8233e333, 0x8233e334, 0x8233e335,
+ /* 98 */ 0x8233e336, 0x8233e337, 0x8233e338, 0x8233e339,
+ /* 9c */ 0x8233e430, 0x8233e431, 0x8233e432, 0x8233e433,
+ /* a0 */ 0x8233e434, 0x8233e435, 0x8233e436, 0x8233e437,
+ /* a4 */ 0x8233e438, 0x8233e439, 0x8233e530, 0x8233e531,
+ /* a8 */ 0x8233e532, 0x8233e533, 0x8233e534, 0x8233e535,
+ /* ac */ 0x8233e536, 0x8233e537, 0x8233e538, 0x8233e539,
+ /* b0 */ 0x8233e630, 0x8233e631, 0x8233e632, 0x8233e633,
+ /* b4 */ 0x8233e634, 0x8233e635, 0x8233e636, 0x8233e637,
+ /* b8 */ 0x8233e638, 0x8233e639, 0x8233e730, 0x8233e731,
+ /* bc */ 0x0000fe82, 0x8233e732, 0x8233e733, 0x8233e734,
+
+ /*** Three byte table, leaf: e49exx - offset 0x01d24 ***/
+
+ /* 80 */ 0x8233e735, 0x8233e736, 0x8233e737, 0x8233e738,
+ /* 84 */ 0x8233e739, 0x8233e830, 0x8233e831, 0x8233e832,
+ /* 88 */ 0x8233e833, 0x8233e834, 0x8233e835, 0x8233e836,
+ /* 8c */ 0x8233e837, 0x0000fe83, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a5xx - offset 0x01d5d ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x0000fe85,
+ /* 88 */ 0x82349639, 0x82349730, 0x82349731, 0x82349732,
+ /* 8c */ 0x82349733, 0x82349734, 0x82349735, 0x82349736,
+ /* 90 */ 0x82349737, 0x82349738, 0x82349739, 0x82349830,
+ /* 94 */ 0x82349831, 0x82349832, 0x82349833, 0x82349834,
+ /* 98 */ 0x82349835, 0x82349836, 0x82349837, 0x82349838,
+ /* 9c */ 0x82349839, 0x82349930, 0x82349931, 0x82349932,
+ /* a0 */ 0x82349933, 0x82349934, 0x82349935, 0x82349936,
+ /* a4 */ 0x82349937, 0x82349938, 0x82349939, 0x82349a30,
+ /* a8 */ 0x82349a31, 0x82349a32, 0x82349a33, 0x82349a34,
+ /* ac */ 0x82349a35, 0x82349a36, 0x82349a37, 0x82349a38,
+ /* b0 */ 0x82349a39, 0x82349b30, 0x82349b31, 0x82349b32,
+ /* b4 */ 0x82349b33, 0x82349b34, 0x82349b35, 0x82349b36,
+ /* b8 */ 0x82349b37, 0x82349b38, 0x0000fe86, 0x82349b39,
+ /* bc */ 0x82349c30, 0x0000fe87, 0x82349c31, 0x82349c32,
+
+ /*** Three byte table, leaf: e4a6xx - offset 0x01d9d ***/
+
+ /* 80 */ 0x82349c33, 0x82349c34, 0x0000fe88, 0x0000fe89,
+ /* 84 */ 0x82349c35, 0x0000fe8a, 0x0000fe8b, 0x82349c36,
+ /* 88 */ 0x82349c37, 0x82349c38, 0x82349c39, 0x82349d30,
+ /* 8c */ 0x82349d31, 0x82349d32, 0x82349d33, 0x82349d34,
+ /* 90 */ 0x82349d35, 0x82349d36, 0x82349d37, 0x82349d38,
+ /* 94 */ 0x82349d39, 0x82349e30, 0x82349e31, 0x82349e32,
+ /* 98 */ 0x82349e33, 0x82349e34, 0x82349e35, 0x0000fe8d,
+ /* 9c */ 0x82349e36, 0x82349e37, 0x82349e38, 0x0000fe8c,
+ /* a0 */ 0x82349e39, 0x82349f30, 0x82349f31, 0x82349f32,
+ /* a4 */ 0x82349f33, 0x82349f34, 0x82349f35, 0x82349f36,
+ /* a8 */ 0x82349f37, 0x82349f38, 0x82349f39, 0x8234a030,
+ /* ac */ 0x8234a031, 0x8234a032, 0x8234a033, 0x8234a034,
+ /* b0 */ 0x8234a035, 0x8234a036, 0x8234a037, 0x8234a038,
+ /* b4 */ 0x8234a039, 0x8234a130, 0x0000fe8f, 0x0000fe8e,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b1xx - offset 0x01dd5 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x0000fe96,
+ /* b8 */ 0x8234e734, 0x8234e735, 0x8234e736, 0x8234e737,
+ /* bc */ 0x8234e738, 0x8234e739, 0x8234e830, 0x8234e831,
+
+ /*** Three byte table, leaf: e4b2xx - offset 0x01e15 ***/
+
+ /* 80 */ 0x8234e832, 0x8234e833, 0x8234e834, 0x8234e835,
+ /* 84 */ 0x8234e836, 0x8234e837, 0x8234e838, 0x8234e839,
+ /* 88 */ 0x8234e930, 0x8234e931, 0x8234e932, 0x8234e933,
+ /* 8c */ 0x8234e934, 0x8234e935, 0x8234e936, 0x8234e937,
+ /* 90 */ 0x8234e938, 0x8234e939, 0x8234ea30, 0x8234ea31,
+ /* 94 */ 0x8234ea32, 0x8234ea33, 0x8234ea34, 0x8234ea35,
+ /* 98 */ 0x8234ea36, 0x8234ea37, 0x8234ea38, 0x8234ea39,
+ /* 9c */ 0x8234eb30, 0x8234eb31, 0x8234eb32, 0x0000fe93,
+ /* a0 */ 0x0000fe94, 0x0000fe95, 0x0000fe97, 0x0000fe92,
+ /* a4 */ 0x8234eb33, 0x8234eb34, 0x8234eb35, 0x8234eb36,
+ /* a8 */ 0x8234eb37, 0x8234eb38, 0x8234eb39, 0x8234ec30,
+ /* ac */ 0x8234ec31, 0x8234ec32, 0x8234ec33, 0x8234ec34,
+ /* b0 */ 0x8234ec35, 0x8234ec36, 0x8234ec37, 0x8234ec38,
+ /* b4 */ 0x8234ec39, 0x8234ed30, 0x8234ed31, 0x8234ed32,
+ /* b8 */ 0x8234ed33, 0x8234ed34, 0x8234ed35, 0x8234ed36,
+ /* bc */ 0x8234ed37, 0x8234ed38, 0x8234ed39, 0x8234ee30,
+
+ /*** Three byte table, leaf: e4b3xx - offset 0x01e55 ***/
+
+ /* 80 */ 0x8234ee31, 0x8234ee32, 0x8234ee33, 0x8234ee34,
+ /* 84 */ 0x8234ee35, 0x8234ee36, 0x8234ee37, 0x8234ee38,
+ /* 88 */ 0x8234ee39, 0x8234ef30, 0x8234ef31, 0x8234ef32,
+ /* 8c */ 0x8234ef33, 0x8234ef34, 0x8234ef35, 0x8234ef36,
+ /* 90 */ 0x8234ef37, 0x8234ef38, 0x8234ef39, 0x8234f030,
+ /* 94 */ 0x8234f031, 0x8234f032, 0x8234f033, 0x8234f034,
+ /* 98 */ 0x8234f035, 0x8234f036, 0x8234f037, 0x8234f038,
+ /* 9c */ 0x8234f039, 0x8234f130, 0x8234f131, 0x8234f132,
+ /* a0 */ 0x8234f133, 0x8234f134, 0x8234f135, 0x8234f136,
+ /* a4 */ 0x8234f137, 0x8234f138, 0x8234f139, 0x8234f230,
+ /* a8 */ 0x8234f231, 0x8234f232, 0x8234f233, 0x8234f234,
+ /* ac */ 0x8234f235, 0x8234f236, 0x8234f237, 0x8234f238,
+ /* b0 */ 0x8234f239, 0x8234f330, 0x8234f331, 0x8234f332,
+ /* b4 */ 0x8234f333, 0x8234f334, 0x8234f335, 0x8234f336,
+ /* b8 */ 0x8234f337, 0x8234f338, 0x8234f339, 0x8234f430,
+ /* bc */ 0x8234f431, 0x8234f432, 0x8234f433, 0x8234f434,
+
+ /*** Three byte table, leaf: e4b4xx - offset 0x01e95 ***/
+
+ /* 80 */ 0x8234f435, 0x8234f436, 0x8234f437, 0x8234f438,
+ /* 84 */ 0x8234f439, 0x8234f530, 0x8234f531, 0x8234f532,
+ /* 88 */ 0x8234f533, 0x8234f534, 0x8234f535, 0x8234f536,
+ /* 8c */ 0x8234f537, 0x8234f538, 0x8234f539, 0x8234f630,
+ /* 90 */ 0x8234f631, 0x8234f632, 0x8234f633, 0x0000fe98,
+ /* 94 */ 0x0000fe99, 0x0000fe9a, 0x0000fe9b, 0x0000fe9c,
+ /* 98 */ 0x0000fe9d, 0x0000fe9e, 0x8234f634, 0x8234f635,
+ /* 9c */ 0x8234f636, 0x8234f637, 0x8234f638, 0x8234f639,
+ /* a0 */ 0x8234f730, 0x8234f731, 0x8234f732, 0x8234f733,
+ /* a4 */ 0x8234f734, 0x8234f735, 0x8234f736, 0x8234f737,
+ /* a8 */ 0x8234f738, 0x8234f739, 0x8234f830, 0x8234f831,
+ /* ac */ 0x8234f832, 0x8234f833, 0x8234f834, 0x8234f835,
+ /* b0 */ 0x8234f836, 0x8234f837, 0x8234f838, 0x8234f839,
+ /* b4 */ 0x8234f930, 0x8234f931, 0x8234f932, 0x8234f933,
+ /* b8 */ 0x8234f934, 0x8234f935, 0x8234f936, 0x8234f937,
+ /* bc */ 0x8234f938, 0x8234f939, 0x8234fa30, 0x8234fa31,
+
+ /*** Three byte table, leaf: e4b5xx - offset 0x01ed5 ***/
+
+ /* 80 */ 0x8234fa32, 0x8234fa33, 0x8234fa34, 0x8234fa35,
+ /* 84 */ 0x8234fa36, 0x8234fa37, 0x8234fa38, 0x8234fa39,
+ /* 88 */ 0x8234fb30, 0x8234fb31, 0x8234fb32, 0x8234fb33,
+ /* 8c */ 0x8234fb34, 0x8234fb35, 0x8234fb36, 0x8234fb37,
+ /* 90 */ 0x8234fb38, 0x8234fb39, 0x8234fc30, 0x8234fc31,
+ /* 94 */ 0x8234fc32, 0x8234fc33, 0x8234fc34, 0x8234fc35,
+ /* 98 */ 0x8234fc36, 0x8234fc37, 0x8234fc38, 0x8234fc39,
+ /* 9c */ 0x8234fd30, 0x8234fd31, 0x8234fd32, 0x8234fd33,
+ /* a0 */ 0x8234fd34, 0x8234fd35, 0x8234fd36, 0x8234fd37,
+ /* a4 */ 0x8234fd38, 0x8234fd39, 0x8234fe30, 0x8234fe31,
+ /* a8 */ 0x8234fe32, 0x8234fe33, 0x8234fe34, 0x8234fe35,
+ /* ac */ 0x8234fe36, 0x8234fe37, 0x8234fe38, 0x8234fe39,
+ /* b0 */ 0x82358130, 0x82358131, 0x82358132, 0x82358133,
+ /* b4 */ 0x82358134, 0x82358135, 0x82358136, 0x82358137,
+ /* b8 */ 0x82358138, 0x82358139, 0x82358230, 0x82358231,
+ /* bc */ 0x82358232, 0x82358233, 0x82358234, 0x82358235,
+
+ /*** Three byte table, leaf: e4b6xx - offset 0x01f15 ***/
+
+ /* 80 */ 0x82358236, 0x82358237, 0x82358238, 0x82358239,
+ /* 84 */ 0x82358330, 0x82358331, 0x82358332, 0x82358333,
+ /* 88 */ 0x82358334, 0x82358335, 0x82358336, 0x82358337,
+ /* 8c */ 0x82358338, 0x82358339, 0x82358430, 0x82358431,
+ /* 90 */ 0x82358432, 0x82358433, 0x82358434, 0x82358435,
+ /* 94 */ 0x82358436, 0x82358437, 0x82358438, 0x82358439,
+ /* 98 */ 0x82358530, 0x82358531, 0x82358532, 0x82358533,
+ /* 9c */ 0x82358534, 0x82358535, 0x82358536, 0x82358537,
+ /* a0 */ 0x82358538, 0x82358539, 0x82358630, 0x82358631,
+ /* a4 */ 0x82358632, 0x82358633, 0x82358634, 0x82358635,
+ /* a8 */ 0x82358636, 0x82358637, 0x82358638, 0x82358639,
+ /* ac */ 0x82358730, 0x82358731, 0x0000fe9f, 0x82358732,
+ /* b0 */ 0x82358733, 0x82358734, 0x82358735, 0x82358736,
+ /* b4 */ 0x82358737, 0x82358738, 0x82358739, 0x82358830,
+ /* b8 */ 0x82358831, 0x82358832, 0x82358833, 0x82358834,
+ /* bc */ 0x82358835, 0x82358836, 0x82358837, 0x82358838,
+
+ /*** Three byte table, leaf: e4b7xx - offset 0x01f55 ***/
+
+ /* 80 */ 0x82358839, 0x82358930, 0x82358931, 0x82358932,
+ /* 84 */ 0x82358933, 0x82358934, 0x82358935, 0x82358936,
+ /* 88 */ 0x82358937, 0x82358938, 0x82358939, 0x82358a30,
+ /* 8c */ 0x82358a31, 0x82358a32, 0x82358a33, 0x82358a34,
+ /* 90 */ 0x82358a35, 0x82358a36, 0x82358a37, 0x82358a38,
+ /* 94 */ 0x82358a39, 0x82358b30, 0x82358b31, 0x82358b32,
+ /* 98 */ 0x82358b33, 0x82358b34, 0x82358b35, 0x82358b36,
+ /* 9c */ 0x82358b37, 0x82358b38, 0x82358b39, 0x82358c30,
+ /* a0 */ 0x82358c31, 0x82358c32, 0x82358c33, 0x82358c34,
+ /* a4 */ 0x82358c35, 0x82358c36, 0x82358c37, 0x82358c38,
+ /* a8 */ 0x82358c39, 0x82358d30, 0x82358d31, 0x82358d32,
+ /* ac */ 0x82358d33, 0x82358d34, 0x82358d35, 0x82358d36,
+ /* b0 */ 0x82358d37, 0x82358d38, 0x82358d39, 0x82358e30,
+ /* b4 */ 0x82358e31, 0x82358e32, 0x82358e33, 0x82358e34,
+ /* b8 */ 0x82358e35, 0x82358e36, 0x82358e37, 0x82358e38,
+ /* bc */ 0x82358e39, 0x82358f30, 0x82358f31, 0x82358f32,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x01f95 ***/
+
+ /* 80 */ 0x0000d2bb, 0x0000b6a1, 0x00008140, 0x0000c6df,
+ /* 84 */ 0x00008141, 0x00008142, 0x00008143, 0x0000cdf2,
+ /* 88 */ 0x0000d5c9, 0x0000c8fd, 0x0000c9cf, 0x0000cfc2,
+ /* 8c */ 0x0000d8a2, 0x0000b2bb, 0x0000d3eb, 0x00008144,
+ /* 90 */ 0x0000d8a4, 0x0000b3f3, 0x00008145, 0x0000d7a8,
+ /* 94 */ 0x0000c7d2, 0x0000d8a7, 0x0000cac0, 0x00008146,
+ /* 98 */ 0x0000c7f0, 0x0000b1fb, 0x0000d2b5, 0x0000b4d4,
+ /* 9c */ 0x0000b6ab, 0x0000cbbf, 0x0000d8a9, 0x00008147,
+ /* a0 */ 0x00008148, 0x00008149, 0x0000b6aa, 0x0000814a,
+ /* a4 */ 0x0000c1bd, 0x0000d1cf, 0x0000814b, 0x0000c9a5,
+ /* a8 */ 0x0000d8ad, 0x0000814c, 0x0000b8f6, 0x0000d1be,
+ /* ac */ 0x0000e3dc, 0x0000d6d0, 0x0000814d, 0x0000814e,
+ /* b0 */ 0x0000b7e1, 0x0000814f, 0x0000b4ae, 0x00008150,
+ /* b4 */ 0x0000c1d9, 0x00008151, 0x0000d8bc, 0x00008152,
+ /* b8 */ 0x0000cde8, 0x0000b5a4, 0x0000ceaa, 0x0000d6f7,
+ /* bc */ 0x00008153, 0x0000c0f6, 0x0000bed9, 0x0000d8af,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x01fd5 ***/
+
+ /* 80 */ 0x00008154, 0x00008155, 0x00008156, 0x0000c4cb,
+ /* 84 */ 0x00008157, 0x0000bec3, 0x00008158, 0x0000d8b1,
+ /* 88 */ 0x0000c3b4, 0x0000d2e5, 0x00008159, 0x0000d6ae,
+ /* 8c */ 0x0000ceda, 0x0000d5a7, 0x0000baf5, 0x0000b7a6,
+ /* 90 */ 0x0000c0d6, 0x0000815a, 0x0000c6b9, 0x0000c5d2,
+ /* 94 */ 0x0000c7c7, 0x0000815b, 0x0000b9d4, 0x0000815c,
+ /* 98 */ 0x0000b3cb, 0x0000d2d2, 0x0000815d, 0x0000815e,
+ /* 9c */ 0x0000d8bf, 0x0000bec5, 0x0000c6f2, 0x0000d2b2,
+ /* a0 */ 0x0000cfb0, 0x0000cfe7, 0x0000815f, 0x00008160,
+ /* a4 */ 0x00008161, 0x00008162, 0x0000cae9, 0x00008163,
+ /* a8 */ 0x00008164, 0x0000d8c0, 0x00008165, 0x00008166,
+ /* ac */ 0x00008167, 0x00008168, 0x00008169, 0x0000816a,
+ /* b0 */ 0x0000c2f2, 0x0000c2d2, 0x0000816b, 0x0000c8e9,
+ /* b4 */ 0x0000816c, 0x0000816d, 0x0000816e, 0x0000816f,
+ /* b8 */ 0x00008170, 0x00008171, 0x00008172, 0x00008173,
+ /* bc */ 0x00008174, 0x00008175, 0x0000c7ac, 0x00008176,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x02015 ***/
+
+ /* 80 */ 0x00008177, 0x00008178, 0x00008179, 0x0000817a,
+ /* 84 */ 0x0000817b, 0x0000817c, 0x0000c1cb, 0x0000817d,
+ /* 88 */ 0x0000d3e8, 0x0000d5f9, 0x0000817e, 0x0000cac2,
+ /* 8c */ 0x0000b6fe, 0x0000d8a1, 0x0000d3da, 0x0000bff7,
+ /* 90 */ 0x00008180, 0x0000d4c6, 0x0000bba5, 0x0000d8c1,
+ /* 94 */ 0x0000cee5, 0x0000beae, 0x00008181, 0x00008182,
+ /* 98 */ 0x0000d8a8, 0x00008183, 0x0000d1c7, 0x0000d0a9,
+ /* 9c */ 0x00008184, 0x00008185, 0x00008186, 0x0000d8bd,
+ /* a0 */ 0x0000d9ef, 0x0000cdf6, 0x0000bfba, 0x00008187,
+ /* a4 */ 0x0000bdbb, 0x0000baa5, 0x0000d2e0, 0x0000b2fa,
+ /* a8 */ 0x0000bae0, 0x0000c4b6, 0x00008188, 0x0000cfed,
+ /* ac */ 0x0000bea9, 0x0000cda4, 0x0000c1c1, 0x00008189,
+ /* b0 */ 0x0000818a, 0x0000818b, 0x0000c7d7, 0x0000d9f1,
+ /* b4 */ 0x0000818c, 0x0000d9f4, 0x0000818d, 0x0000818e,
+ /* b8 */ 0x0000818f, 0x00008190, 0x0000c8cb, 0x0000d8e9,
+ /* bc */ 0x00008191, 0x00008192, 0x00008193, 0x0000d2da,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x02055 ***/
+
+ /* 80 */ 0x0000cab2, 0x0000c8ca, 0x0000d8ec, 0x0000d8ea,
+ /* 84 */ 0x0000d8c6, 0x0000bdf6, 0x0000c6cd, 0x0000b3f0,
+ /* 88 */ 0x00008194, 0x0000d8eb, 0x0000bdf1, 0x0000bde9,
+ /* 8c */ 0x00008195, 0x0000c8d4, 0x0000b4d3, 0x00008196,
+ /* 90 */ 0x00008197, 0x0000c2d8, 0x00008198, 0x0000b2d6,
+ /* 94 */ 0x0000d7d0, 0x0000cacb, 0x0000cbfb, 0x0000d5cc,
+ /* 98 */ 0x0000b8b6, 0x0000cfc9, 0x00008199, 0x0000819a,
+ /* 9c */ 0x0000819b, 0x0000d9da, 0x0000d8f0, 0x0000c7aa,
+ /* a0 */ 0x0000819c, 0x0000d8ee, 0x0000819d, 0x0000b4fa,
+ /* a4 */ 0x0000c1ee, 0x0000d2d4, 0x0000819e, 0x0000819f,
+ /* a8 */ 0x0000d8ed, 0x000081a0, 0x0000d2c7, 0x0000d8ef,
+ /* ac */ 0x0000c3c7, 0x000081a1, 0x000081a2, 0x000081a3,
+ /* b0 */ 0x0000d1f6, 0x000081a4, 0x0000d6d9, 0x0000d8f2,
+ /* b4 */ 0x000081a5, 0x0000d8f5, 0x0000bcfe, 0x0000bcdb,
+ /* b8 */ 0x000081a6, 0x000081a7, 0x000081a8, 0x0000c8ce,
+ /* bc */ 0x000081a9, 0x0000b7dd, 0x000081aa, 0x0000b7c2,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x02095 ***/
+
+ /* 80 */ 0x000081ab, 0x0000c6f3, 0x000081ac, 0x000081ad,
+ /* 84 */ 0x000081ae, 0x000081af, 0x000081b0, 0x000081b1,
+ /* 88 */ 0x000081b2, 0x0000d8f8, 0x0000d2c1, 0x000081b3,
+ /* 8c */ 0x000081b4, 0x0000cee9, 0x0000bcbf, 0x0000b7fc,
+ /* 90 */ 0x0000b7a5, 0x0000d0dd, 0x000081b5, 0x000081b6,
+ /* 94 */ 0x000081b7, 0x000081b8, 0x000081b9, 0x0000d6da,
+ /* 98 */ 0x0000d3c5, 0x0000bbef, 0x0000bbe1, 0x0000d8f1,
+ /* 9c */ 0x000081ba, 0x000081bb, 0x0000c9a1, 0x0000ceb0,
+ /* a0 */ 0x0000b4ab, 0x000081bc, 0x0000d8f3, 0x000081bd,
+ /* a4 */ 0x0000c9cb, 0x0000d8f6, 0x0000c2d7, 0x0000d8f7,
+ /* a8 */ 0x000081be, 0x000081bf, 0x0000ceb1, 0x0000d8f9,
+ /* ac */ 0x000081c0, 0x000081c1, 0x000081c2, 0x0000b2ae,
+ /* b0 */ 0x0000b9c0, 0x000081c3, 0x0000d9a3, 0x000081c4,
+ /* b4 */ 0x0000b0e9, 0x000081c5, 0x0000c1e6, 0x000081c6,
+ /* b8 */ 0x0000c9ec, 0x000081c7, 0x0000cbc5, 0x000081c8,
+ /* bc */ 0x0000cbc6, 0x0000d9a4, 0x000081c9, 0x000081ca,
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x020d5 ***/
+
+ /* 80 */ 0x000081cb, 0x000081cc, 0x000081cd, 0x0000b5e8,
+ /* 84 */ 0x000081ce, 0x000081cf, 0x0000b5ab, 0x000081d0,
+ /* 88 */ 0x000081d1, 0x000081d2, 0x000081d3, 0x000081d4,
+ /* 8c */ 0x000081d5, 0x0000cebb, 0x0000b5cd, 0x0000d7a1,
+ /* 90 */ 0x0000d7f4, 0x0000d3d3, 0x000081d6, 0x0000cce5,
+ /* 94 */ 0x000081d7, 0x0000bace, 0x000081d8, 0x0000d9a2,
+ /* 98 */ 0x0000d9dc, 0x0000d3e0, 0x0000d8fd, 0x0000b7f0,
+ /* 9c */ 0x0000d7f7, 0x0000d8fe, 0x0000d8fa, 0x0000d9a1,
+ /* a0 */ 0x0000c4e3, 0x000081d9, 0x000081da, 0x0000d3b6,
+ /* a4 */ 0x0000d8f4, 0x0000d9dd, 0x000081db, 0x0000d8fb,
+ /* a8 */ 0x000081dc, 0x0000c5e5, 0x000081dd, 0x000081de,
+ /* ac */ 0x0000c0d0, 0x000081df, 0x000081e0, 0x0000d1f0,
+ /* b0 */ 0x0000b0db, 0x000081e1, 0x000081e2, 0x0000bcd1,
+ /* b4 */ 0x0000d9a6, 0x000081e3, 0x0000d9a5, 0x000081e4,
+ /* b8 */ 0x000081e5, 0x000081e6, 0x000081e7, 0x0000d9ac,
+ /* bc */ 0x0000d9ae, 0x000081e8, 0x0000d9ab, 0x0000cab9,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x02115 ***/
+
+ /* 80 */ 0x000081e9, 0x000081ea, 0x000081eb, 0x0000d9a9,
+ /* 84 */ 0x0000d6b6, 0x000081ec, 0x000081ed, 0x000081ee,
+ /* 88 */ 0x0000b3de, 0x0000d9a8, 0x000081ef, 0x0000c0fd,
+ /* 8c */ 0x000081f0, 0x0000cacc, 0x000081f1, 0x0000d9aa,
+ /* 90 */ 0x000081f2, 0x0000d9a7, 0x000081f3, 0x000081f4,
+ /* 94 */ 0x0000d9b0, 0x000081f5, 0x000081f6, 0x0000b6b1,
+ /* 98 */ 0x000081f7, 0x000081f8, 0x000081f9, 0x0000b9a9,
+ /* 9c */ 0x000081fa, 0x0000d2c0, 0x000081fb, 0x000081fc,
+ /* a0 */ 0x0000cfc0, 0x000081fd, 0x000081fe, 0x0000c2c2,
+ /* a4 */ 0x00008240, 0x0000bdc4, 0x0000d5ec, 0x0000b2e0,
+ /* a8 */ 0x0000c7c8, 0x0000bfeb, 0x0000d9ad, 0x00008241,
+ /* ac */ 0x0000d9af, 0x00008242, 0x0000ceea, 0x0000baee,
+ /* b0 */ 0x00008243, 0x00008244, 0x00008245, 0x00008246,
+ /* b4 */ 0x00008247, 0x0000c7d6, 0x00008248, 0x00008249,
+ /* b8 */ 0x0000824a, 0x0000824b, 0x0000824c, 0x0000824d,
+ /* bc */ 0x0000824e, 0x0000824f, 0x00008250, 0x0000b1e3,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x02155 ***/
+
+ /* 80 */ 0x00008251, 0x00008252, 0x00008253, 0x0000b4d9,
+ /* 84 */ 0x0000b6ed, 0x0000d9b4, 0x00008254, 0x00008255,
+ /* 88 */ 0x00008256, 0x00008257, 0x0000bfa1, 0x00008258,
+ /* 8c */ 0x00008259, 0x0000825a, 0x0000d9de, 0x0000c7ce,
+ /* 90 */ 0x0000c0fe, 0x0000d9b8, 0x0000825b, 0x0000825c,
+ /* 94 */ 0x0000825d, 0x0000825e, 0x0000825f, 0x0000cbd7,
+ /* 98 */ 0x0000b7fd, 0x00008260, 0x0000d9b5, 0x00008261,
+ /* 9c */ 0x0000d9b7, 0x0000b1a3, 0x0000d3e1, 0x0000d9b9,
+ /* a0 */ 0x00008262, 0x0000d0c5, 0x00008263, 0x0000d9b6,
+ /* a4 */ 0x00008264, 0x00008265, 0x0000d9b1, 0x00008266,
+ /* a8 */ 0x0000d9b2, 0x0000c1a9, 0x0000d9b3, 0x00008267,
+ /* ac */ 0x00008268, 0x0000bcf3, 0x0000d0de, 0x0000b8a9,
+ /* b0 */ 0x00008269, 0x0000bee3, 0x0000826a, 0x0000d9bd,
+ /* b4 */ 0x0000826b, 0x0000826c, 0x0000826d, 0x0000826e,
+ /* b8 */ 0x0000d9ba, 0x0000826f, 0x0000b0b3, 0x00008270,
+ /* bc */ 0x00008271, 0x00008272, 0x0000d9c2, 0x00008273,
+
+ /*** Three byte table, leaf: e580xx - offset 0x02195 ***/
+
+ /* 80 */ 0x00008274, 0x00008275, 0x00008276, 0x00008277,
+ /* 84 */ 0x00008278, 0x00008279, 0x0000827a, 0x0000827b,
+ /* 88 */ 0x0000827c, 0x0000827d, 0x0000827e, 0x00008280,
+ /* 8c */ 0x0000d9c4, 0x0000b1b6, 0x00008281, 0x0000d9bf,
+ /* 90 */ 0x00008282, 0x00008283, 0x0000b5b9, 0x00008284,
+ /* 94 */ 0x0000bef3, 0x00008285, 0x00008286, 0x00008287,
+ /* 98 */ 0x0000ccc8, 0x0000baf2, 0x0000d2d0, 0x00008288,
+ /* 9c */ 0x0000d9c3, 0x00008289, 0x0000828a, 0x0000bde8,
+ /* a0 */ 0x0000828b, 0x0000b3ab, 0x0000828c, 0x0000828d,
+ /* a4 */ 0x0000828e, 0x0000d9c5, 0x0000beeb, 0x0000828f,
+ /* a8 */ 0x0000d9c6, 0x0000d9bb, 0x0000c4df, 0x00008290,
+ /* ac */ 0x0000d9be, 0x0000d9c1, 0x0000d9c0, 0x00008291,
+ /* b0 */ 0x00008292, 0x00008293, 0x00008294, 0x00008295,
+ /* b4 */ 0x00008296, 0x00008297, 0x00008298, 0x00008299,
+ /* b8 */ 0x0000829a, 0x0000829b, 0x0000d5ae, 0x0000829c,
+ /* bc */ 0x0000d6b5, 0x0000829d, 0x0000c7e3, 0x0000829e,
+
+ /*** Three byte table, leaf: e581xx - offset 0x021d5 ***/
+
+ /* 80 */ 0x0000829f, 0x000082a0, 0x000082a1, 0x0000d9c8,
+ /* 84 */ 0x000082a2, 0x000082a3, 0x000082a4, 0x0000bcd9,
+ /* 88 */ 0x0000d9ca, 0x000082a5, 0x000082a6, 0x000082a7,
+ /* 8c */ 0x0000d9bc, 0x000082a8, 0x0000d9cb, 0x0000c6ab,
+ /* 90 */ 0x000082a9, 0x000082aa, 0x000082ab, 0x000082ac,
+ /* 94 */ 0x000082ad, 0x0000d9c9, 0x000082ae, 0x000082af,
+ /* 98 */ 0x000082b0, 0x000082b1, 0x0000d7f6, 0x000082b2,
+ /* 9c */ 0x0000cda3, 0x000082b3, 0x000082b4, 0x000082b5,
+ /* a0 */ 0x000082b6, 0x000082b7, 0x000082b8, 0x000082b9,
+ /* a4 */ 0x000082ba, 0x0000bda1, 0x000082bb, 0x000082bc,
+ /* a8 */ 0x000082bd, 0x000082be, 0x000082bf, 0x000082c0,
+ /* ac */ 0x0000d9cc, 0x000082c1, 0x000082c2, 0x000082c3,
+ /* b0 */ 0x000082c4, 0x000082c5, 0x000082c6, 0x000082c7,
+ /* b4 */ 0x000082c8, 0x000082c9, 0x0000c5bc, 0x0000cdb5,
+ /* b8 */ 0x000082ca, 0x000082cb, 0x000082cc, 0x0000d9cd,
+ /* bc */ 0x000082cd, 0x000082ce, 0x0000d9c7, 0x0000b3a5,
+
+ /*** Three byte table, leaf: e582xx - offset 0x02215 ***/
+
+ /* 80 */ 0x0000bffe, 0x000082cf, 0x000082d0, 0x000082d1,
+ /* 84 */ 0x000082d2, 0x0000b8b5, 0x000082d3, 0x000082d4,
+ /* 88 */ 0x0000c0fc, 0x000082d5, 0x000082d6, 0x000082d7,
+ /* 8c */ 0x000082d8, 0x0000b0f8, 0x000082d9, 0x000082da,
+ /* 90 */ 0x000082db, 0x000082dc, 0x000082dd, 0x000082de,
+ /* 94 */ 0x000082df, 0x000082e0, 0x000082e1, 0x000082e2,
+ /* 98 */ 0x000082e3, 0x000082e4, 0x000082e5, 0x000082e6,
+ /* 9c */ 0x000082e7, 0x000082e8, 0x000082e9, 0x000082ea,
+ /* a0 */ 0x000082eb, 0x000082ec, 0x000082ed, 0x0000b4f6,
+ /* a4 */ 0x000082ee, 0x0000d9ce, 0x000082ef, 0x0000d9cf,
+ /* a8 */ 0x0000b4a2, 0x0000d9d0, 0x000082f0, 0x000082f1,
+ /* ac */ 0x0000b4df, 0x000082f2, 0x000082f3, 0x000082f4,
+ /* b0 */ 0x000082f5, 0x000082f6, 0x0000b0c1, 0x000082f7,
+ /* b4 */ 0x000082f8, 0x000082f9, 0x000082fa, 0x000082fb,
+ /* b8 */ 0x000082fc, 0x000082fd, 0x0000d9d1, 0x0000c9b5,
+ /* bc */ 0x000082fe, 0x00008340, 0x00008341, 0x00008342,
+
+ /*** Three byte table, leaf: e583xx - offset 0x02255 ***/
+
+ /* 80 */ 0x00008343, 0x00008344, 0x00008345, 0x00008346,
+ /* 84 */ 0x00008347, 0x00008348, 0x00008349, 0x0000834a,
+ /* 88 */ 0x0000834b, 0x0000834c, 0x0000834d, 0x0000834e,
+ /* 8c */ 0x0000834f, 0x00008350, 0x00008351, 0x0000cff1,
+ /* 90 */ 0x00008352, 0x00008353, 0x00008354, 0x00008355,
+ /* 94 */ 0x00008356, 0x00008357, 0x0000d9d2, 0x00008358,
+ /* 98 */ 0x00008359, 0x0000835a, 0x0000c1c5, 0x0000835b,
+ /* 9c */ 0x0000835c, 0x0000835d, 0x0000835e, 0x0000835f,
+ /* a0 */ 0x00008360, 0x00008361, 0x00008362, 0x00008363,
+ /* a4 */ 0x00008364, 0x00008365, 0x0000d9d6, 0x0000c9ae,
+ /* a8 */ 0x00008366, 0x00008367, 0x00008368, 0x00008369,
+ /* ac */ 0x0000d9d5, 0x0000d9d4, 0x0000d9d7, 0x0000836a,
+ /* b0 */ 0x0000836b, 0x0000836c, 0x0000836d, 0x0000cbdb,
+ /* b4 */ 0x0000836e, 0x0000bda9, 0x0000836f, 0x00008370,
+ /* b8 */ 0x00008371, 0x00008372, 0x00008373, 0x0000c6a7,
+ /* bc */ 0x00008374, 0x00008375, 0x00008376, 0x00008377,
+
+ /*** Three byte table, leaf: e584xx - offset 0x02295 ***/
+
+ /* 80 */ 0x00008378, 0x00008379, 0x0000837a, 0x0000837b,
+ /* 84 */ 0x0000837c, 0x0000837d, 0x0000d9d3, 0x0000d9d8,
+ /* 88 */ 0x0000837e, 0x00008380, 0x00008381, 0x0000d9d9,
+ /* 8c */ 0x00008382, 0x00008383, 0x00008384, 0x00008385,
+ /* 90 */ 0x00008386, 0x00008387, 0x0000c8e5, 0x00008388,
+ /* 94 */ 0x00008389, 0x0000838a, 0x0000838b, 0x0000838c,
+ /* 98 */ 0x0000838d, 0x0000838e, 0x0000838f, 0x00008390,
+ /* 9c */ 0x00008391, 0x00008392, 0x00008393, 0x00008394,
+ /* a0 */ 0x00008395, 0x0000c0dc, 0x00008396, 0x00008397,
+ /* a4 */ 0x00008398, 0x00008399, 0x0000839a, 0x0000839b,
+ /* a8 */ 0x0000839c, 0x0000839d, 0x0000839e, 0x0000839f,
+ /* ac */ 0x000083a0, 0x000083a1, 0x000083a2, 0x000083a3,
+ /* b0 */ 0x000083a4, 0x000083a5, 0x000083a6, 0x000083a7,
+ /* b4 */ 0x000083a8, 0x000083a9, 0x000083aa, 0x000083ab,
+ /* b8 */ 0x000083ac, 0x000083ad, 0x000083ae, 0x000083af,
+ /* bc */ 0x000083b0, 0x000083b1, 0x000083b2, 0x0000b6f9,
+
+ /*** Three byte table, leaf: e585xx - offset 0x022d5 ***/
+
+ /* 80 */ 0x0000d8a3, 0x0000d4ca, 0x000083b3, 0x0000d4aa,
+ /* 84 */ 0x0000d0d6, 0x0000b3e4, 0x0000d5d7, 0x000083b4,
+ /* 88 */ 0x0000cfc8, 0x0000b9e2, 0x000083b5, 0x0000bfcb,
+ /* 8c */ 0x000083b6, 0x0000c3e2, 0x000083b7, 0x000083b8,
+ /* 90 */ 0x000083b9, 0x0000b6d2, 0x000083ba, 0x000083bb,
+ /* 94 */ 0x0000cdc3, 0x0000d9ee, 0x0000d9f0, 0x000083bc,
+ /* 98 */ 0x000083bd, 0x000083be, 0x0000b5b3, 0x000083bf,
+ /* 9c */ 0x0000b6b5, 0x000083c0, 0x000083c1, 0x000083c2,
+ /* a0 */ 0x000083c3, 0x000083c4, 0x0000bea4, 0x000083c5,
+ /* a4 */ 0x000083c6, 0x0000c8eb, 0x000083c7, 0x000083c8,
+ /* a8 */ 0x0000c8ab, 0x000083c9, 0x000083ca, 0x0000b0cb,
+ /* ac */ 0x0000b9ab, 0x0000c1f9, 0x0000d9e2, 0x000083cb,
+ /* b0 */ 0x0000c0bc, 0x0000b9b2, 0x000083cc, 0x0000b9d8,
+ /* b4 */ 0x0000d0cb, 0x0000b1f8, 0x0000c6e4, 0x0000bedf,
+ /* b8 */ 0x0000b5e4, 0x0000d7c8, 0x000083cd, 0x0000d1f8,
+ /* bc */ 0x0000bce6, 0x0000cade, 0x000083ce, 0x000083cf,
+
+ /*** Three byte table, leaf: e586xx - offset 0x02315 ***/
+
+ /* 80 */ 0x0000bcbd, 0x0000d9e6, 0x0000d8e7, 0x000083d0,
+ /* 84 */ 0x000083d1, 0x0000c4da, 0x000083d2, 0x000083d3,
+ /* 88 */ 0x0000b8d4, 0x0000c8bd, 0x000083d4, 0x000083d5,
+ /* 8c */ 0x0000b2e1, 0x0000d4d9, 0x000083d6, 0x000083d7,
+ /* 90 */ 0x000083d8, 0x000083d9, 0x0000c3b0, 0x000083da,
+ /* 94 */ 0x000083db, 0x0000c3e1, 0x0000daa2, 0x0000c8df,
+ /* 98 */ 0x000083dc, 0x0000d0b4, 0x000083dd, 0x0000befc,
+ /* 9c */ 0x0000c5a9, 0x000083de, 0x000083df, 0x000083e0,
+ /* a0 */ 0x0000b9da, 0x000083e1, 0x0000daa3, 0x000083e2,
+ /* a4 */ 0x0000d4a9, 0x0000daa4, 0x000083e3, 0x000083e4,
+ /* a8 */ 0x000083e5, 0x000083e6, 0x000083e7, 0x0000d9fb,
+ /* ac */ 0x0000b6ac, 0x000083e8, 0x000083e9, 0x0000b7eb,
+ /* b0 */ 0x0000b1f9, 0x0000d9fc, 0x0000b3e5, 0x0000bef6,
+ /* b4 */ 0x000083ea, 0x0000bff6, 0x0000d2b1, 0x0000c0e4,
+ /* b8 */ 0x000083eb, 0x000083ec, 0x000083ed, 0x0000b6b3,
+ /* bc */ 0x0000d9fe, 0x0000d9fd, 0x000083ee, 0x000083ef,
+
+ /*** Three byte table, leaf: e587xx - offset 0x02355 ***/
+
+ /* 80 */ 0x0000bebb, 0x000083f0, 0x000083f1, 0x000083f2,
+ /* 84 */ 0x0000c6e0, 0x000083f3, 0x0000d7bc, 0x0000daa1,
+ /* 88 */ 0x000083f4, 0x0000c1b9, 0x000083f5, 0x0000b5f2,
+ /* 8c */ 0x0000c1e8, 0x000083f6, 0x000083f7, 0x0000bcf5,
+ /* 90 */ 0x000083f8, 0x0000b4d5, 0x000083f9, 0x000083fa,
+ /* 94 */ 0x000083fb, 0x000083fc, 0x000083fd, 0x000083fe,
+ /* 98 */ 0x00008440, 0x00008441, 0x00008442, 0x0000c1dd,
+ /* 9c */ 0x00008443, 0x0000c4fd, 0x00008444, 0x00008445,
+ /* a0 */ 0x0000bcb8, 0x0000b7b2, 0x00008446, 0x00008447,
+ /* a4 */ 0x0000b7ef, 0x00008448, 0x00008449, 0x0000844a,
+ /* a8 */ 0x0000844b, 0x0000844c, 0x0000844d, 0x0000d9ec,
+ /* ac */ 0x0000844e, 0x0000c6be, 0x0000844f, 0x0000bfad,
+ /* b0 */ 0x0000bbcb, 0x00008450, 0x00008451, 0x0000b5ca,
+ /* b4 */ 0x00008452, 0x0000dbc9, 0x0000d0d7, 0x00008453,
+ /* b8 */ 0x0000cdb9, 0x0000b0bc, 0x0000b3f6, 0x0000bbf7,
+ /* bc */ 0x0000dbca, 0x0000baaf, 0x00008454, 0x0000d4e4,
+
+ /*** Three byte table, leaf: e588xx - offset 0x02395 ***/
+
+ /* 80 */ 0x0000b5b6, 0x0000b5f3, 0x0000d8d6, 0x0000c8d0,
+ /* 84 */ 0x00008455, 0x00008456, 0x0000b7d6, 0x0000c7d0,
+ /* 88 */ 0x0000d8d7, 0x00008457, 0x0000bfaf, 0x00008458,
+ /* 8c */ 0x00008459, 0x0000dbbb, 0x0000d8d8, 0x0000845a,
+ /* 90 */ 0x0000845b, 0x0000d0cc, 0x0000bbae, 0x0000845c,
+ /* 94 */ 0x0000845d, 0x0000845e, 0x0000ebbe, 0x0000c1d0,
+ /* 98 */ 0x0000c1f5, 0x0000d4f2, 0x0000b8d5, 0x0000b4b4,
+ /* 9c */ 0x0000845f, 0x0000b3f5, 0x00008460, 0x00008461,
+ /* a0 */ 0x0000c9be, 0x00008462, 0x00008463, 0x00008464,
+ /* a4 */ 0x0000c5d0, 0x00008465, 0x00008466, 0x00008467,
+ /* a8 */ 0x0000c5d9, 0x0000c0fb, 0x00008468, 0x0000b1f0,
+ /* ac */ 0x00008469, 0x0000d8d9, 0x0000b9ce, 0x0000846a,
+ /* b0 */ 0x0000b5bd, 0x0000846b, 0x0000846c, 0x0000d8da,
+ /* b4 */ 0x0000846d, 0x0000846e, 0x0000d6c6, 0x0000cba2,
+ /* b8 */ 0x0000c8af, 0x0000c9b2, 0x0000b4cc, 0x0000bfcc,
+ /* bc */ 0x0000846f, 0x0000b9f4, 0x00008470, 0x0000d8db,
+
+ /*** Three byte table, leaf: e589xx - offset 0x023d5 ***/
+
+ /* 80 */ 0x0000d8dc, 0x0000b6e7, 0x0000bcc1, 0x0000ccea,
+ /* 84 */ 0x00008471, 0x00008472, 0x00008473, 0x00008474,
+ /* 88 */ 0x00008475, 0x00008476, 0x0000cff7, 0x00008477,
+ /* 8c */ 0x0000d8dd, 0x0000c7b0, 0x00008478, 0x00008479,
+ /* 90 */ 0x0000b9d0, 0x0000bda3, 0x0000847a, 0x0000847b,
+ /* 94 */ 0x0000ccde, 0x0000847c, 0x0000c6ca, 0x0000847d,
+ /* 98 */ 0x0000847e, 0x00008480, 0x00008481, 0x00008482,
+ /* 9c */ 0x0000d8e0, 0x00008483, 0x0000d8de, 0x00008484,
+ /* a0 */ 0x00008485, 0x0000d8df, 0x00008486, 0x00008487,
+ /* a4 */ 0x00008488, 0x0000b0fe, 0x00008489, 0x0000bee7,
+ /* a8 */ 0x0000848a, 0x0000caa3, 0x0000bcf4, 0x0000848b,
+ /* ac */ 0x0000848c, 0x0000848d, 0x0000848e, 0x0000b8b1,
+ /* b0 */ 0x0000848f, 0x00008490, 0x0000b8ee, 0x00008491,
+ /* b4 */ 0x00008492, 0x00008493, 0x00008494, 0x00008495,
+ /* b8 */ 0x00008496, 0x00008497, 0x00008498, 0x00008499,
+ /* bc */ 0x0000849a, 0x0000d8e2, 0x0000849b, 0x0000bdcb,
+
+ /*** Three byte table, leaf: e58axx - offset 0x02415 ***/
+
+ /* 80 */ 0x0000849c, 0x0000d8e4, 0x0000d8e3, 0x0000849d,
+ /* 84 */ 0x0000849e, 0x0000849f, 0x000084a0, 0x000084a1,
+ /* 88 */ 0x0000c5fc, 0x000084a2, 0x000084a3, 0x000084a4,
+ /* 8c */ 0x000084a5, 0x000084a6, 0x000084a7, 0x000084a8,
+ /* 90 */ 0x0000d8e5, 0x000084a9, 0x000084aa, 0x0000d8e6,
+ /* 94 */ 0x000084ab, 0x000084ac, 0x000084ad, 0x000084ae,
+ /* 98 */ 0x000084af, 0x000084b0, 0x000084b1, 0x0000c1a6,
+ /* 9c */ 0x000084b2, 0x0000c8b0, 0x0000b0ec, 0x0000b9a6,
+ /* a0 */ 0x0000bcd3, 0x0000cef1, 0x0000dbbd, 0x0000c1d3,
+ /* a4 */ 0x000084b3, 0x000084b4, 0x000084b5, 0x000084b6,
+ /* a8 */ 0x0000b6af, 0x0000d6fa, 0x0000c5ac, 0x0000bdd9,
+ /* ac */ 0x0000dbbe, 0x0000dbbf, 0x000084b7, 0x000084b8,
+ /* b0 */ 0x000084b9, 0x0000c0f8, 0x0000bea2, 0x0000c0cd,
+ /* b4 */ 0x000084ba, 0x000084bb, 0x000084bc, 0x000084bd,
+ /* b8 */ 0x000084be, 0x000084bf, 0x000084c0, 0x000084c1,
+ /* bc */ 0x000084c2, 0x000084c3, 0x0000dbc0, 0x0000cac6,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x02455 ***/
+
+ /* 80 */ 0x000084c4, 0x000084c5, 0x000084c6, 0x0000b2aa,
+ /* 84 */ 0x000084c7, 0x000084c8, 0x000084c9, 0x0000d3c2,
+ /* 88 */ 0x000084ca, 0x0000c3e3, 0x000084cb, 0x0000d1ab,
+ /* 8c */ 0x000084cc, 0x000084cd, 0x000084ce, 0x000084cf,
+ /* 90 */ 0x0000dbc2, 0x000084d0, 0x0000c0d5, 0x000084d1,
+ /* 94 */ 0x000084d2, 0x000084d3, 0x0000dbc3, 0x000084d4,
+ /* 98 */ 0x0000bfb1, 0x000084d5, 0x000084d6, 0x000084d7,
+ /* 9c */ 0x000084d8, 0x000084d9, 0x000084da, 0x0000c4bc,
+ /* a0 */ 0x000084db, 0x000084dc, 0x000084dd, 0x000084de,
+ /* a4 */ 0x0000c7da, 0x000084df, 0x000084e0, 0x000084e1,
+ /* a8 */ 0x000084e2, 0x000084e3, 0x000084e4, 0x000084e5,
+ /* ac */ 0x000084e6, 0x000084e7, 0x000084e8, 0x000084e9,
+ /* b0 */ 0x0000dbc4, 0x000084ea, 0x000084eb, 0x000084ec,
+ /* b4 */ 0x000084ed, 0x000084ee, 0x000084ef, 0x000084f0,
+ /* b8 */ 0x000084f1, 0x0000d9e8, 0x0000c9d7, 0x000084f2,
+ /* bc */ 0x000084f3, 0x000084f4, 0x0000b9b4, 0x0000cef0,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x02495 ***/
+
+ /* 80 */ 0x0000d4c8, 0x000084f5, 0x000084f6, 0x000084f7,
+ /* 84 */ 0x000084f8, 0x0000b0fc, 0x0000b4d2, 0x000084f9,
+ /* 88 */ 0x0000d0d9, 0x000084fa, 0x000084fb, 0x000084fc,
+ /* 8c */ 0x000084fd, 0x0000d9e9, 0x000084fe, 0x0000decb,
+ /* 90 */ 0x0000d9eb, 0x00008540, 0x00008541, 0x00008542,
+ /* 94 */ 0x00008543, 0x0000d8b0, 0x0000bbaf, 0x0000b1b1,
+ /* 98 */ 0x00008544, 0x0000b3d7, 0x0000d8ce, 0x00008545,
+ /* 9c */ 0x00008546, 0x0000d4d1, 0x00008547, 0x00008548,
+ /* a0 */ 0x0000bdb3, 0x0000bfef, 0x00008549, 0x0000cfbb,
+ /* a4 */ 0x0000854a, 0x0000854b, 0x0000d8d0, 0x0000854c,
+ /* a8 */ 0x0000854d, 0x0000854e, 0x0000b7cb, 0x0000854f,
+ /* ac */ 0x00008550, 0x00008551, 0x0000d8d1, 0x00008552,
+ /* b0 */ 0x00008553, 0x00008554, 0x00008555, 0x00008556,
+ /* b4 */ 0x00008557, 0x00008558, 0x00008559, 0x0000855a,
+ /* b8 */ 0x0000855b, 0x0000c6a5, 0x0000c7f8, 0x0000d2bd,
+ /* bc */ 0x0000855c, 0x0000855d, 0x0000d8d2, 0x0000c4e4,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x024d5 ***/
+
+ /* 80 */ 0x0000855e, 0x0000caae, 0x0000855f, 0x0000c7a7,
+ /* 84 */ 0x00008560, 0x0000d8a6, 0x00008561, 0x0000c9fd,
+ /* 88 */ 0x0000cee7, 0x0000bbdc, 0x0000b0eb, 0x00008562,
+ /* 8c */ 0x00008563, 0x00008564, 0x0000bbaa, 0x0000d0ad,
+ /* 90 */ 0x00008565, 0x0000b1b0, 0x0000d7e4, 0x0000d7bf,
+ /* 94 */ 0x00008566, 0x0000b5a5, 0x0000c2f4, 0x0000c4cf,
+ /* 98 */ 0x00008567, 0x00008568, 0x0000b2a9, 0x00008569,
+ /* 9c */ 0x0000b2b7, 0x0000856a, 0x0000b1e5, 0x0000dfb2,
+ /* a0 */ 0x0000d5bc, 0x0000bfa8, 0x0000c2ac, 0x0000d8d5,
+ /* a4 */ 0x0000c2b1, 0x0000856b, 0x0000d8d4, 0x0000ced4,
+ /* a8 */ 0x0000856c, 0x0000dae0, 0x0000856d, 0x0000cec0,
+ /* ac */ 0x0000856e, 0x0000856f, 0x0000d8b4, 0x0000c3ae,
+ /* b0 */ 0x0000d3a1, 0x0000cea3, 0x00008570, 0x0000bcb4,
+ /* b4 */ 0x0000c8b4, 0x0000c2d1, 0x00008571, 0x0000beed,
+ /* b8 */ 0x0000d0b6, 0x00008572, 0x0000dae1, 0x00008573,
+ /* bc */ 0x00008574, 0x00008575, 0x00008576, 0x0000c7e4,
+
+ /*** Three byte table, leaf: e58exx - offset 0x02515 ***/
+
+ /* 80 */ 0x00008577, 0x00008578, 0x0000b3a7, 0x00008579,
+ /* 84 */ 0x0000b6f2, 0x0000ccfc, 0x0000c0fa, 0x0000857a,
+ /* 88 */ 0x0000857b, 0x0000c0f7, 0x0000857c, 0x0000d1b9,
+ /* 8c */ 0x0000d1e1, 0x0000d8c7, 0x0000857d, 0x0000857e,
+ /* 90 */ 0x00008580, 0x00008581, 0x00008582, 0x00008583,
+ /* 94 */ 0x00008584, 0x0000b2de, 0x00008585, 0x00008586,
+ /* 98 */ 0x0000c0e5, 0x00008587, 0x0000baf1, 0x00008588,
+ /* 9c */ 0x00008589, 0x0000d8c8, 0x0000858a, 0x0000d4ad,
+ /* a0 */ 0x0000858b, 0x0000858c, 0x0000cfe1, 0x0000d8c9,
+ /* a4 */ 0x0000858d, 0x0000d8ca, 0x0000cfc3, 0x0000858e,
+ /* a8 */ 0x0000b3f8, 0x0000bec7, 0x0000858f, 0x00008590,
+ /* ac */ 0x00008591, 0x00008592, 0x0000d8cb, 0x00008593,
+ /* b0 */ 0x00008594, 0x00008595, 0x00008596, 0x00008597,
+ /* b4 */ 0x00008598, 0x00008599, 0x0000dbcc, 0x0000859a,
+ /* b8 */ 0x0000859b, 0x0000859c, 0x0000859d, 0x0000c8a5,
+ /* bc */ 0x0000859e, 0x0000859f, 0x000085a0, 0x0000cfd8,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x02555 ***/
+
+ /* 80 */ 0x000085a1, 0x0000c8fe, 0x0000b2ce, 0x000085a2,
+ /* 84 */ 0x000085a3, 0x000085a4, 0x000085a5, 0x000085a6,
+ /* 88 */ 0x0000d3d6, 0x0000b2e6, 0x0000bcb0, 0x0000d3d1,
+ /* 8c */ 0x0000cbab, 0x0000b7b4, 0x000085a7, 0x000085a8,
+ /* 90 */ 0x000085a9, 0x0000b7a2, 0x000085aa, 0x000085ab,
+ /* 94 */ 0x0000cae5, 0x000085ac, 0x0000c8a1, 0x0000cadc,
+ /* 98 */ 0x0000b1e4, 0x0000d0f0, 0x000085ad, 0x0000c5d1,
+ /* 9c */ 0x000085ae, 0x000085af, 0x000085b0, 0x0000dbc5,
+ /* a0 */ 0x0000b5fe, 0x000085b1, 0x000085b2, 0x0000bfda,
+ /* a4 */ 0x0000b9c5, 0x0000bee4, 0x0000c1ed, 0x000085b3,
+ /* a8 */ 0x0000dfb6, 0x0000dfb5, 0x0000d6bb, 0x0000bdd0,
+ /* ac */ 0x0000d5d9, 0x0000b0c8, 0x0000b6a3, 0x0000bfc9,
+ /* b0 */ 0x0000cca8, 0x0000dfb3, 0x0000cab7, 0x0000d3d2,
+ /* b4 */ 0x000085b4, 0x0000d8cf, 0x0000d2b6, 0x0000bac5,
+ /* b8 */ 0x0000cbbe, 0x0000ccbe, 0x000085b5, 0x0000dfb7,
+ /* bc */ 0x0000b5f0, 0x0000dfb4, 0x000085b6, 0x000085b7,
+
+ /*** Three byte table, leaf: e590xx - offset 0x02595 ***/
+
+ /* 80 */ 0x000085b8, 0x0000d3f5, 0x000085b9, 0x0000b3d4,
+ /* 84 */ 0x0000b8f7, 0x000085ba, 0x0000dfba, 0x000085bb,
+ /* 88 */ 0x0000bacf, 0x0000bcaa, 0x0000b5f5, 0x000085bc,
+ /* 8c */ 0x0000cdac, 0x0000c3fb, 0x0000baf3, 0x0000c0f4,
+ /* 90 */ 0x0000cdc2, 0x0000cff2, 0x0000dfb8, 0x0000cfc5,
+ /* 94 */ 0x000085bd, 0x0000c2c0, 0x0000dfb9, 0x0000c2f0,
+ /* 98 */ 0x000085be, 0x000085bf, 0x000085c0, 0x0000befd,
+ /* 9c */ 0x000085c1, 0x0000c1df, 0x0000cdcc, 0x0000d2f7,
+ /* a0 */ 0x0000b7cd, 0x0000dfc1, 0x000085c2, 0x0000dfc4,
+ /* a4 */ 0x000085c3, 0x000085c4, 0x0000b7f1, 0x0000b0c9,
+ /* a8 */ 0x0000b6d6, 0x0000b7d4, 0x000085c5, 0x0000baac,
+ /* ac */ 0x0000ccfd, 0x0000bfd4, 0x0000cbb1, 0x0000c6f4,
+ /* b0 */ 0x000085c6, 0x0000d6a8, 0x0000dfc5, 0x000085c7,
+ /* b4 */ 0x0000cee2, 0x0000b3b3, 0x000085c8, 0x000085c9,
+ /* b8 */ 0x0000cefc, 0x0000b4b5, 0x000085ca, 0x0000cec7,
+ /* bc */ 0x0000baf0, 0x000085cb, 0x0000cee1, 0x000085cc,
+
+ /*** Three byte table, leaf: e591xx - offset 0x025d5 ***/
+
+ /* 80 */ 0x0000d1bd, 0x000085cd, 0x000085ce, 0x0000dfc0,
+ /* 84 */ 0x000085cf, 0x000085d0, 0x0000b4f4, 0x000085d1,
+ /* 88 */ 0x0000b3ca, 0x000085d2, 0x0000b8e6, 0x0000dfbb,
+ /* 8c */ 0x000085d3, 0x000085d4, 0x000085d5, 0x000085d6,
+ /* 90 */ 0x0000c4c5, 0x000085d7, 0x0000dfbc, 0x0000dfbd,
+ /* 94 */ 0x0000dfbe, 0x0000c5bb, 0x0000dfbf, 0x0000dfc2,
+ /* 98 */ 0x0000d4b1, 0x0000dfc3, 0x000085d8, 0x0000c7ba,
+ /* 9c */ 0x0000ced8, 0x000085d9, 0x000085da, 0x000085db,
+ /* a0 */ 0x000085dc, 0x000085dd, 0x0000c4d8, 0x000085de,
+ /* a4 */ 0x0000dfca, 0x000085df, 0x0000dfcf, 0x000085e0,
+ /* a8 */ 0x0000d6dc, 0x000085e1, 0x000085e2, 0x000085e3,
+ /* ac */ 0x000085e4, 0x000085e5, 0x000085e6, 0x000085e7,
+ /* b0 */ 0x000085e8, 0x0000dfc9, 0x0000dfda, 0x0000ceb6,
+ /* b4 */ 0x000085e9, 0x0000bac7, 0x0000dfce, 0x0000dfc8,
+ /* b8 */ 0x0000c5de, 0x000085ea, 0x000085eb, 0x0000c9eb,
+ /* bc */ 0x0000baf4, 0x0000c3fc, 0x000085ec, 0x000085ed,
+
+ /*** Three byte table, leaf: e592xx - offset 0x02615 ***/
+
+ /* 80 */ 0x0000bed7, 0x000085ee, 0x0000dfc6, 0x000085ef,
+ /* 84 */ 0x0000dfcd, 0x000085f0, 0x0000c5d8, 0x000085f1,
+ /* 88 */ 0x000085f2, 0x000085f3, 0x000085f4, 0x0000d5a6,
+ /* 8c */ 0x0000bacd, 0x000085f5, 0x0000becc, 0x0000d3bd,
+ /* 90 */ 0x0000b8c0, 0x000085f6, 0x0000d6e4, 0x000085f7,
+ /* 94 */ 0x0000dfc7, 0x0000b9be, 0x0000bfa7, 0x000085f8,
+ /* 98 */ 0x000085f9, 0x0000c1fc, 0x0000dfcb, 0x0000dfcc,
+ /* 9c */ 0x000085fa, 0x0000dfd0, 0x000085fb, 0x000085fc,
+ /* a0 */ 0x000085fd, 0x000085fe, 0x00008640, 0x0000dfdb,
+ /* a4 */ 0x0000dfe5, 0x00008641, 0x0000dfd7, 0x0000dfd6,
+ /* a8 */ 0x0000d7c9, 0x0000dfe3, 0x0000dfe4, 0x0000e5eb,
+ /* ac */ 0x0000d2a7, 0x0000dfd2, 0x00008642, 0x0000bfa9,
+ /* b0 */ 0x00008643, 0x0000d4db, 0x00008644, 0x0000bfc8,
+ /* b4 */ 0x0000dfd4, 0x00008645, 0x00008646, 0x00008647,
+ /* b8 */ 0x0000cfcc, 0x00008648, 0x00008649, 0x0000dfdd,
+ /* bc */ 0x0000864a, 0x0000d1ca, 0x0000864b, 0x0000dfde,
+
+ /*** Three byte table, leaf: e593xx - offset 0x02655 ***/
+
+ /* 80 */ 0x0000b0a7, 0x0000c6b7, 0x0000dfd3, 0x0000864c,
+ /* 84 */ 0x0000bae5, 0x0000864d, 0x0000b6df, 0x0000cddb,
+ /* 88 */ 0x0000b9fe, 0x0000d4d5, 0x0000864e, 0x0000864f,
+ /* 8c */ 0x0000dfdf, 0x0000cfec, 0x0000b0a5, 0x0000dfe7,
+ /* 90 */ 0x0000dfd1, 0x0000d1c6, 0x0000dfd5, 0x0000dfd8,
+ /* 94 */ 0x0000dfd9, 0x0000dfdc, 0x00008650, 0x0000bba9,
+ /* 98 */ 0x00008651, 0x0000dfe0, 0x0000dfe1, 0x00008652,
+ /* 9c */ 0x0000dfe2, 0x0000dfe6, 0x0000dfe8, 0x0000d3b4,
+ /* a0 */ 0x00008653, 0x00008654, 0x00008655, 0x00008656,
+ /* a4 */ 0x00008657, 0x0000b8e7, 0x0000c5b6, 0x0000dfea,
+ /* a8 */ 0x0000c9da, 0x0000c1a8, 0x0000c4c4, 0x00008658,
+ /* ac */ 0x00008659, 0x0000bfde, 0x0000cff8, 0x0000865a,
+ /* b0 */ 0x0000865b, 0x0000865c, 0x0000d5dc, 0x0000dfee,
+ /* b4 */ 0x0000865d, 0x0000865e, 0x0000865f, 0x00008660,
+ /* b8 */ 0x00008661, 0x00008662, 0x0000b2b8, 0x00008663,
+ /* bc */ 0x0000badf, 0x0000dfec, 0x00008664, 0x0000dbc1,
+
+ /*** Three byte table, leaf: e594xx - offset 0x02695 ***/
+
+ /* 80 */ 0x00008665, 0x0000d1e4, 0x00008666, 0x00008667,
+ /* 84 */ 0x00008668, 0x00008669, 0x0000cbf4, 0x0000b4bd,
+ /* 88 */ 0x0000866a, 0x0000b0a6, 0x0000866b, 0x0000866c,
+ /* 8c */ 0x0000866d, 0x0000866e, 0x0000866f, 0x0000dff1,
+ /* 90 */ 0x0000ccc6, 0x0000dff2, 0x00008670, 0x00008671,
+ /* 94 */ 0x0000dfed, 0x00008672, 0x00008673, 0x00008674,
+ /* 98 */ 0x00008675, 0x00008676, 0x00008677, 0x0000dfe9,
+ /* 9c */ 0x00008678, 0x00008679, 0x0000867a, 0x0000867b,
+ /* a0 */ 0x0000dfeb, 0x0000867c, 0x0000dfef, 0x0000dff0,
+ /* a4 */ 0x0000bbbd, 0x0000867d, 0x0000867e, 0x0000dff3,
+ /* a8 */ 0x00008680, 0x00008681, 0x0000dff4, 0x00008682,
+ /* ac */ 0x0000bba3, 0x00008683, 0x0000cadb, 0x0000cea8,
+ /* b0 */ 0x0000e0a7, 0x0000b3aa, 0x00008684, 0x0000e0a6,
+ /* b4 */ 0x00008685, 0x00008686, 0x00008687, 0x0000e0a1,
+ /* b8 */ 0x00008688, 0x00008689, 0x0000868a, 0x0000868b,
+ /* bc */ 0x0000dffe, 0x0000868c, 0x0000cdd9, 0x0000dffc,
+
+ /*** Three byte table, leaf: e595xx - offset 0x026d5 ***/
+
+ /* 80 */ 0x0000868d, 0x0000dffa, 0x0000868e, 0x0000bfd0,
+ /* 84 */ 0x0000d7c4, 0x0000868f, 0x0000c9cc, 0x00008690,
+ /* 88 */ 0x00008691, 0x0000dff8, 0x0000b0a1, 0x00008692,
+ /* 8c */ 0x00008693, 0x00008694, 0x00008695, 0x00008696,
+ /* 90 */ 0x0000dffd, 0x00008697, 0x00008698, 0x00008699,
+ /* 94 */ 0x0000869a, 0x0000dffb, 0x0000e0a2, 0x0000869b,
+ /* 98 */ 0x0000869c, 0x0000869d, 0x0000869e, 0x0000869f,
+ /* 9c */ 0x0000e0a8, 0x000086a0, 0x000086a1, 0x000086a2,
+ /* a0 */ 0x000086a3, 0x0000b7c8, 0x000086a4, 0x000086a5,
+ /* a4 */ 0x0000c6a1, 0x0000c9b6, 0x0000c0b2, 0x0000dff5,
+ /* a8 */ 0x000086a6, 0x000086a7, 0x0000c5be, 0x000086a8,
+ /* ac */ 0x0000d8c4, 0x0000dff9, 0x0000c4f6, 0x000086a9,
+ /* b0 */ 0x000086aa, 0x000086ab, 0x000086ac, 0x000086ad,
+ /* b4 */ 0x000086ae, 0x0000e0a3, 0x0000e0a4, 0x0000e0a5,
+ /* b8 */ 0x0000d0a5, 0x000086af, 0x000086b0, 0x0000e0b4,
+ /* bc */ 0x0000cce4, 0x000086b1, 0x0000e0b1, 0x000086b2,
+
+ /*** Three byte table, leaf: e596xx - offset 0x02715 ***/
+
+ /* 80 */ 0x0000bfa6, 0x0000e0af, 0x0000ceb9, 0x0000e0ab,
+ /* 84 */ 0x0000c9c6, 0x000086b3, 0x000086b4, 0x0000c0ae,
+ /* 88 */ 0x0000e0ae, 0x0000baed, 0x0000bab0, 0x0000e0a9,
+ /* 8c */ 0x000086b5, 0x000086b6, 0x000086b7, 0x0000dff6,
+ /* 90 */ 0x000086b8, 0x0000e0b3, 0x000086b9, 0x000086ba,
+ /* 94 */ 0x0000e0b8, 0x000086bb, 0x000086bc, 0x000086bd,
+ /* 98 */ 0x0000b4ad, 0x0000e0b9, 0x000086be, 0x000086bf,
+ /* 9c */ 0x0000cfb2, 0x0000bac8, 0x000086c0, 0x0000e0b0,
+ /* a0 */ 0x000086c1, 0x000086c2, 0x000086c3, 0x000086c4,
+ /* a4 */ 0x000086c5, 0x000086c6, 0x000086c7, 0x0000d0fa,
+ /* a8 */ 0x000086c8, 0x000086c9, 0x000086ca, 0x000086cb,
+ /* ac */ 0x000086cc, 0x000086cd, 0x000086ce, 0x000086cf,
+ /* b0 */ 0x000086d0, 0x0000e0ac, 0x000086d1, 0x0000d4fb,
+ /* b4 */ 0x000086d2, 0x0000dff7, 0x000086d3, 0x0000c5e7,
+ /* b8 */ 0x000086d4, 0x0000e0ad, 0x000086d5, 0x0000d3f7,
+ /* bc */ 0x000086d6, 0x0000e0b6, 0x0000e0b7, 0x000086d7,
+
+ /*** Three byte table, leaf: e597xx - offset 0x02755 ***/
+
+ /* 80 */ 0x000086d8, 0x000086d9, 0x000086da, 0x000086db,
+ /* 84 */ 0x0000e0c4, 0x0000d0e1, 0x000086dc, 0x000086dd,
+ /* 88 */ 0x000086de, 0x0000e0bc, 0x000086df, 0x000086e0,
+ /* 8c */ 0x0000e0c9, 0x0000e0ca, 0x000086e1, 0x000086e2,
+ /* 90 */ 0x000086e3, 0x0000e0be, 0x0000e0aa, 0x0000c9a4,
+ /* 94 */ 0x0000e0c1, 0x000086e4, 0x0000e0b2, 0x000086e5,
+ /* 98 */ 0x000086e6, 0x000086e7, 0x000086e8, 0x000086e9,
+ /* 9c */ 0x0000cac8, 0x0000e0c3, 0x000086ea, 0x0000e0b5,
+ /* a0 */ 0x000086eb, 0x0000cecb, 0x000086ec, 0x0000cbc3,
+ /* a4 */ 0x0000e0cd, 0x0000e0c6, 0x0000e0c2, 0x000086ed,
+ /* a8 */ 0x0000e0cb, 0x000086ee, 0x0000e0ba, 0x0000e0bf,
+ /* ac */ 0x0000e0c0, 0x000086ef, 0x000086f0, 0x0000e0c5,
+ /* b0 */ 0x000086f1, 0x000086f2, 0x0000e0c7, 0x0000e0c8,
+ /* b4 */ 0x000086f3, 0x0000e0cc, 0x000086f4, 0x0000e0bb,
+ /* b8 */ 0x000086f5, 0x000086f6, 0x000086f7, 0x000086f8,
+ /* bc */ 0x000086f9, 0x0000cbd4, 0x0000e0d5, 0x000086fa,
+
+ /*** Three byte table, leaf: e598xx - offset 0x02795 ***/
+
+ /* 80 */ 0x0000e0d6, 0x0000e0d2, 0x000086fb, 0x000086fc,
+ /* 84 */ 0x000086fd, 0x000086fe, 0x00008740, 0x00008741,
+ /* 88 */ 0x0000e0d0, 0x0000bcce, 0x00008742, 0x00008743,
+ /* 8c */ 0x0000e0d1, 0x00008744, 0x0000b8c2, 0x0000d8c5,
+ /* 90 */ 0x00008745, 0x00008746, 0x00008747, 0x00008748,
+ /* 94 */ 0x00008749, 0x0000874a, 0x0000874b, 0x0000874c,
+ /* 98 */ 0x0000d0ea, 0x0000874d, 0x0000874e, 0x0000c2ef,
+ /* 9c */ 0x0000874f, 0x00008750, 0x0000e0cf, 0x0000e0bd,
+ /* a0 */ 0x00008751, 0x00008752, 0x00008753, 0x0000e0d4,
+ /* a4 */ 0x0000e0d3, 0x00008754, 0x00008755, 0x0000e0d7,
+ /* a8 */ 0x00008756, 0x00008757, 0x00008758, 0x00008759,
+ /* ac */ 0x0000e0dc, 0x0000e0d8, 0x0000875a, 0x0000875b,
+ /* b0 */ 0x0000875c, 0x0000d6f6, 0x0000b3b0, 0x0000875d,
+ /* b4 */ 0x0000d7ec, 0x0000875e, 0x0000cbbb, 0x0000875f,
+ /* b8 */ 0x00008760, 0x0000e0da, 0x00008761, 0x0000cefb,
+ /* bc */ 0x00008762, 0x00008763, 0x00008764, 0x0000bad9,
+
+ /*** Three byte table, leaf: e599xx - offset 0x027d5 ***/
+
+ /* 80 */ 0x00008765, 0x00008766, 0x00008767, 0x00008768,
+ /* 84 */ 0x00008769, 0x0000876a, 0x0000876b, 0x0000876c,
+ /* 88 */ 0x0000876d, 0x0000876e, 0x0000876f, 0x00008770,
+ /* 8c */ 0x0000e0e1, 0x0000e0dd, 0x0000d2ad, 0x00008771,
+ /* 90 */ 0x00008772, 0x00008773, 0x00008774, 0x00008775,
+ /* 94 */ 0x0000e0e2, 0x00008776, 0x00008777, 0x0000e0db,
+ /* 98 */ 0x0000e0d9, 0x0000e0df, 0x00008778, 0x00008779,
+ /* 9c */ 0x0000e0e0, 0x0000877a, 0x0000877b, 0x0000877c,
+ /* a0 */ 0x0000877d, 0x0000877e, 0x0000e0de, 0x00008780,
+ /* a4 */ 0x0000e0e4, 0x00008781, 0x00008782, 0x00008783,
+ /* a8 */ 0x0000c6f7, 0x0000d8ac, 0x0000d4eb, 0x0000e0e6,
+ /* ac */ 0x0000cac9, 0x00008784, 0x00008785, 0x00008786,
+ /* b0 */ 0x00008787, 0x0000e0e5, 0x00008788, 0x00008789,
+ /* b4 */ 0x0000878a, 0x0000878b, 0x0000b8c1, 0x0000878c,
+ /* b8 */ 0x0000878d, 0x0000878e, 0x0000878f, 0x0000e0e7,
+ /* bc */ 0x0000e0e8, 0x00008790, 0x00008791, 0x00008792,
+
+ /*** Three byte table, leaf: e59axx - offset 0x02815 ***/
+
+ /* 80 */ 0x00008793, 0x00008794, 0x00008795, 0x00008796,
+ /* 84 */ 0x00008797, 0x0000e0e9, 0x0000e0e3, 0x00008798,
+ /* 88 */ 0x00008799, 0x0000879a, 0x0000879b, 0x0000879c,
+ /* 8c */ 0x0000879d, 0x0000879e, 0x0000babf, 0x0000cce7,
+ /* 90 */ 0x0000879f, 0x000087a0, 0x000087a1, 0x0000e0ea,
+ /* 94 */ 0x000087a2, 0x000087a3, 0x000087a4, 0x000087a5,
+ /* 98 */ 0x000087a6, 0x000087a7, 0x000087a8, 0x000087a9,
+ /* 9c */ 0x000087aa, 0x000087ab, 0x000087ac, 0x000087ad,
+ /* a0 */ 0x000087ae, 0x000087af, 0x000087b0, 0x0000cff9,
+ /* a4 */ 0x000087b1, 0x000087b2, 0x000087b3, 0x000087b4,
+ /* a8 */ 0x000087b5, 0x000087b6, 0x000087b7, 0x000087b8,
+ /* ac */ 0x000087b9, 0x000087ba, 0x000087bb, 0x0000e0eb,
+ /* b0 */ 0x000087bc, 0x000087bd, 0x000087be, 0x000087bf,
+ /* b4 */ 0x000087c0, 0x000087c1, 0x000087c2, 0x0000c8c2,
+ /* b8 */ 0x000087c3, 0x000087c4, 0x000087c5, 0x000087c6,
+ /* bc */ 0x0000bdc0, 0x000087c7, 0x000087c8, 0x000087c9,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x02855 ***/
+
+ /* 80 */ 0x000087ca, 0x000087cb, 0x000087cc, 0x000087cd,
+ /* 84 */ 0x000087ce, 0x000087cf, 0x000087d0, 0x000087d1,
+ /* 88 */ 0x000087d2, 0x000087d3, 0x0000c4d2, 0x000087d4,
+ /* 8c */ 0x000087d5, 0x000087d6, 0x000087d7, 0x000087d8,
+ /* 90 */ 0x000087d9, 0x000087da, 0x000087db, 0x000087dc,
+ /* 94 */ 0x0000e0ec, 0x000087dd, 0x000087de, 0x0000e0ed,
+ /* 98 */ 0x000087df, 0x000087e0, 0x0000c7f4, 0x0000cbc4,
+ /* 9c */ 0x000087e1, 0x0000e0ee, 0x0000bbd8, 0x0000d8b6,
+ /* a0 */ 0x0000d2f2, 0x0000e0ef, 0x0000cdc5, 0x000087e2,
+ /* a4 */ 0x0000b6da, 0x000087e3, 0x000087e4, 0x000087e5,
+ /* a8 */ 0x000087e6, 0x000087e7, 0x000087e8, 0x0000e0f1,
+ /* ac */ 0x000087e9, 0x0000d4b0, 0x000087ea, 0x000087eb,
+ /* b0 */ 0x0000c0a7, 0x0000b4d1, 0x000087ec, 0x000087ed,
+ /* b4 */ 0x0000cea7, 0x0000e0f0, 0x000087ee, 0x000087ef,
+ /* b8 */ 0x000087f0, 0x0000e0f2, 0x0000b9cc, 0x000087f1,
+ /* bc */ 0x000087f2, 0x0000b9fa, 0x0000cdbc, 0x0000e0f3,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x02895 ***/
+
+ /* 80 */ 0x000087f3, 0x000087f4, 0x000087f5, 0x0000c6d4,
+ /* 84 */ 0x0000e0f4, 0x000087f6, 0x0000d4b2, 0x000087f7,
+ /* 88 */ 0x0000c8a6, 0x0000e0f6, 0x0000e0f5, 0x000087f8,
+ /* 8c */ 0x000087f9, 0x000087fa, 0x000087fb, 0x000087fc,
+ /* 90 */ 0x000087fd, 0x000087fe, 0x00008840, 0x00008841,
+ /* 94 */ 0x00008842, 0x00008843, 0x00008844, 0x00008845,
+ /* 98 */ 0x00008846, 0x00008847, 0x00008848, 0x00008849,
+ /* 9c */ 0x0000e0f7, 0x0000884a, 0x0000884b, 0x0000cdc1,
+ /* a0 */ 0x0000884c, 0x0000884d, 0x0000884e, 0x0000caa5,
+ /* a4 */ 0x0000884f, 0x00008850, 0x00008851, 0x00008852,
+ /* a8 */ 0x0000d4da, 0x0000dbd7, 0x0000dbd9, 0x00008853,
+ /* ac */ 0x0000dbd8, 0x0000b9e7, 0x0000dbdc, 0x0000dbdd,
+ /* b0 */ 0x0000b5d8, 0x00008854, 0x00008855, 0x0000dbda,
+ /* b4 */ 0x00008856, 0x00008857, 0x00008858, 0x00008859,
+ /* b8 */ 0x0000885a, 0x0000dbdb, 0x0000b3a1, 0x0000dbdf,
+ /* bc */ 0x0000885b, 0x0000885c, 0x0000bbf8, 0x0000885d,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x028d5 ***/
+
+ /* 80 */ 0x0000d6b7, 0x0000885e, 0x0000dbe0, 0x0000885f,
+ /* 84 */ 0x00008860, 0x00008861, 0x00008862, 0x0000bef9,
+ /* 88 */ 0x00008863, 0x00008864, 0x0000b7bb, 0x00008865,
+ /* 8c */ 0x0000dbd0, 0x0000ccae, 0x0000bfb2, 0x0000bbb5,
+ /* 90 */ 0x0000d7f8, 0x0000bfd3, 0x00008866, 0x00008867,
+ /* 94 */ 0x00008868, 0x00008869, 0x0000886a, 0x0000bfe9,
+ /* 98 */ 0x0000886b, 0x0000886c, 0x0000bce1, 0x0000ccb3,
+ /* 9c */ 0x0000dbde, 0x0000b0d3, 0x0000ceeb, 0x0000b7d8,
+ /* a0 */ 0x0000d7b9, 0x0000c6c2, 0x0000886d, 0x0000886e,
+ /* a4 */ 0x0000c0a4, 0x0000886f, 0x0000ccb9, 0x00008870,
+ /* a8 */ 0x0000dbe7, 0x0000dbe1, 0x0000c6ba, 0x0000dbe3,
+ /* ac */ 0x00008871, 0x0000dbe8, 0x00008872, 0x0000c5f7,
+ /* b0 */ 0x00008873, 0x00008874, 0x00008875, 0x0000dbea,
+ /* b4 */ 0x00008876, 0x00008877, 0x0000dbe9, 0x0000bfc0,
+ /* b8 */ 0x00008878, 0x00008879, 0x0000887a, 0x0000dbe6,
+ /* bc */ 0x0000dbe5, 0x0000887b, 0x0000887c, 0x0000887d,
+
+ /*** Three byte table, leaf: e59exx - offset 0x02915 ***/
+
+ /* 80 */ 0x0000887e, 0x00008880, 0x0000b4b9, 0x0000c0ac,
+ /* 84 */ 0x0000c2a2, 0x0000dbe2, 0x0000dbe4, 0x00008881,
+ /* 88 */ 0x00008882, 0x00008883, 0x00008884, 0x0000d0cd,
+ /* 8c */ 0x0000dbed, 0x00008885, 0x00008886, 0x00008887,
+ /* 90 */ 0x00008888, 0x00008889, 0x0000c0dd, 0x0000dbf2,
+ /* 94 */ 0x0000888a, 0x0000888b, 0x0000888c, 0x0000888d,
+ /* 98 */ 0x0000888e, 0x0000888f, 0x00008890, 0x0000b6e2,
+ /* 9c */ 0x00008891, 0x00008892, 0x00008893, 0x00008894,
+ /* a0 */ 0x0000dbf3, 0x0000dbd2, 0x0000b9b8, 0x0000d4ab,
+ /* a4 */ 0x0000dbec, 0x00008895, 0x0000bfd1, 0x0000dbf0,
+ /* a8 */ 0x00008896, 0x0000dbd1, 0x00008897, 0x0000b5e6,
+ /* ac */ 0x00008898, 0x0000dbeb, 0x0000bfe5, 0x00008899,
+ /* b0 */ 0x0000889a, 0x0000889b, 0x0000dbee, 0x0000889c,
+ /* b4 */ 0x0000dbf1, 0x0000889d, 0x0000889e, 0x0000889f,
+ /* b8 */ 0x0000dbf9, 0x000088a0, 0x000088a1, 0x000088a2,
+ /* bc */ 0x000088a3, 0x000088a4, 0x000088a5, 0x000088a6,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x02955 ***/
+
+ /* 80 */ 0x000088a7, 0x000088a8, 0x0000b9a1, 0x0000b0a3,
+ /* 84 */ 0x000088a9, 0x000088aa, 0x000088ab, 0x000088ac,
+ /* 88 */ 0x000088ad, 0x000088ae, 0x000088af, 0x0000c2f1,
+ /* 8c */ 0x000088b0, 0x000088b1, 0x0000b3c7, 0x0000dbef,
+ /* 90 */ 0x000088b2, 0x000088b3, 0x0000dbf8, 0x000088b4,
+ /* 94 */ 0x0000c6d2, 0x0000dbf4, 0x000088b5, 0x000088b6,
+ /* 98 */ 0x0000dbf5, 0x0000dbf7, 0x0000dbf6, 0x000088b7,
+ /* 9c */ 0x000088b8, 0x0000dbfe, 0x000088b9, 0x0000d3f2,
+ /* a0 */ 0x0000b2ba, 0x000088ba, 0x000088bb, 0x000088bc,
+ /* a4 */ 0x0000dbfd, 0x000088bd, 0x000088be, 0x000088bf,
+ /* a8 */ 0x000088c0, 0x000088c1, 0x000088c2, 0x000088c3,
+ /* ac */ 0x000088c4, 0x0000dca4, 0x000088c5, 0x0000dbfb,
+ /* b0 */ 0x000088c6, 0x000088c7, 0x000088c8, 0x000088c9,
+ /* b4 */ 0x0000dbfa, 0x000088ca, 0x000088cb, 0x000088cc,
+ /* b8 */ 0x0000dbfc, 0x0000c5e0, 0x0000bbf9, 0x000088cd,
+ /* bc */ 0x000088ce, 0x0000dca3, 0x000088cf, 0x000088d0,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x02995 ***/
+
+ /* 80 */ 0x0000dca5, 0x000088d1, 0x0000ccc3, 0x000088d2,
+ /* 84 */ 0x000088d3, 0x000088d4, 0x0000b6d1, 0x0000ddc0,
+ /* 88 */ 0x000088d5, 0x000088d6, 0x000088d7, 0x0000dca1,
+ /* 8c */ 0x000088d8, 0x0000dca2, 0x000088d9, 0x000088da,
+ /* 90 */ 0x000088db, 0x0000c7b5, 0x000088dc, 0x000088dd,
+ /* 94 */ 0x000088de, 0x0000b6e9, 0x000088df, 0x000088e0,
+ /* 98 */ 0x000088e1, 0x0000dca7, 0x000088e2, 0x000088e3,
+ /* 9c */ 0x000088e4, 0x000088e5, 0x0000dca6, 0x000088e6,
+ /* a0 */ 0x0000dca9, 0x0000b1a4, 0x000088e7, 0x000088e8,
+ /* a4 */ 0x0000b5cc, 0x000088e9, 0x000088ea, 0x000088eb,
+ /* a8 */ 0x000088ec, 0x000088ed, 0x0000bfb0, 0x000088ee,
+ /* ac */ 0x000088ef, 0x000088f0, 0x000088f1, 0x000088f2,
+ /* b0 */ 0x0000d1df, 0x000088f3, 0x000088f4, 0x000088f5,
+ /* b4 */ 0x000088f6, 0x0000b6c2, 0x000088f7, 0x000088f8,
+ /* b8 */ 0x000088f9, 0x000088fa, 0x000088fb, 0x000088fc,
+ /* bc */ 0x000088fd, 0x000088fe, 0x00008940, 0x00008941,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x029d5 ***/
+
+ /* 80 */ 0x00008942, 0x00008943, 0x00008944, 0x00008945,
+ /* 84 */ 0x0000dca8, 0x00008946, 0x00008947, 0x00008948,
+ /* 88 */ 0x00008949, 0x0000894a, 0x0000894b, 0x0000894c,
+ /* 8c */ 0x0000cbfa, 0x0000ebf3, 0x0000894d, 0x0000894e,
+ /* 90 */ 0x0000894f, 0x0000cbdc, 0x00008950, 0x00008951,
+ /* 94 */ 0x0000cbfe, 0x00008952, 0x00008953, 0x00008954,
+ /* 98 */ 0x0000ccc1, 0x00008955, 0x00008956, 0x00008957,
+ /* 9c */ 0x00008958, 0x00008959, 0x0000c8fb, 0x0000895a,
+ /* a0 */ 0x0000895b, 0x0000895c, 0x0000895d, 0x0000895e,
+ /* a4 */ 0x0000895f, 0x0000dcaa, 0x00008960, 0x00008961,
+ /* a8 */ 0x00008962, 0x00008963, 0x00008964, 0x0000ccee,
+ /* ac */ 0x0000dcab, 0x00008965, 0x00008966, 0x00008967,
+ /* b0 */ 0x00008968, 0x00008969, 0x0000896a, 0x0000896b,
+ /* b4 */ 0x0000896c, 0x0000896d, 0x0000896e, 0x0000896f,
+ /* b8 */ 0x00008970, 0x00008971, 0x00008972, 0x00008973,
+ /* bc */ 0x00008974, 0x00008975, 0x0000dbd3, 0x00008976,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x02a15 ***/
+
+ /* 80 */ 0x0000dcaf, 0x0000dcac, 0x00008977, 0x0000beb3,
+ /* 84 */ 0x00008978, 0x0000cafb, 0x00008979, 0x0000897a,
+ /* 88 */ 0x0000897b, 0x0000dcad, 0x0000897c, 0x0000897d,
+ /* 8c */ 0x0000897e, 0x00008980, 0x00008981, 0x00008982,
+ /* 90 */ 0x00008983, 0x00008984, 0x0000c9ca, 0x0000c4b9,
+ /* 94 */ 0x00008985, 0x00008986, 0x00008987, 0x00008988,
+ /* 98 */ 0x00008989, 0x0000c7bd, 0x0000dcae, 0x0000898a,
+ /* 9c */ 0x0000898b, 0x0000898c, 0x0000d4f6, 0x0000d0e6,
+ /* a0 */ 0x0000898d, 0x0000898e, 0x0000898f, 0x00008990,
+ /* a4 */ 0x00008991, 0x00008992, 0x00008993, 0x00008994,
+ /* a8 */ 0x0000c4ab, 0x0000b6d5, 0x00008995, 0x00008996,
+ /* ac */ 0x00008997, 0x00008998, 0x00008999, 0x0000899a,
+ /* b0 */ 0x0000899b, 0x0000899c, 0x0000899d, 0x0000899e,
+ /* b4 */ 0x0000899f, 0x000089a0, 0x000089a1, 0x000089a2,
+ /* b8 */ 0x000089a3, 0x000089a4, 0x000089a5, 0x000089a6,
+ /* bc */ 0x0000dbd4, 0x000089a7, 0x000089a8, 0x000089a9,
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x02a55 ***/
+
+ /* 80 */ 0x000089aa, 0x0000b1da, 0x000089ab, 0x000089ac,
+ /* 84 */ 0x000089ad, 0x0000dbd5, 0x000089ae, 0x000089af,
+ /* 88 */ 0x000089b0, 0x000089b1, 0x000089b2, 0x000089b3,
+ /* 8c */ 0x000089b4, 0x000089b5, 0x000089b6, 0x000089b7,
+ /* 90 */ 0x000089b8, 0x0000dbd6, 0x000089b9, 0x000089ba,
+ /* 94 */ 0x000089bb, 0x0000babe, 0x000089bc, 0x000089bd,
+ /* 98 */ 0x000089be, 0x000089bf, 0x000089c0, 0x000089c1,
+ /* 9c */ 0x000089c2, 0x000089c3, 0x000089c4, 0x000089c5,
+ /* a0 */ 0x000089c6, 0x000089c7, 0x000089c8, 0x000089c9,
+ /* a4 */ 0x0000c8c0, 0x000089ca, 0x000089cb, 0x000089cc,
+ /* a8 */ 0x000089cd, 0x000089ce, 0x000089cf, 0x0000cabf,
+ /* ac */ 0x0000c8c9, 0x000089d0, 0x0000d7b3, 0x000089d1,
+ /* b0 */ 0x0000c9f9, 0x000089d2, 0x000089d3, 0x0000bfc7,
+ /* b4 */ 0x000089d4, 0x000089d5, 0x0000baf8, 0x000089d6,
+ /* b8 */ 0x000089d7, 0x0000d2bc, 0x000089d8, 0x000089d9,
+ /* bc */ 0x000089da, 0x000089db, 0x000089dc, 0x000089dd,
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x02a95 ***/
+
+ /* 80 */ 0x000089de, 0x000089df, 0x0000e2ba, 0x000089e0,
+ /* 84 */ 0x0000b4a6, 0x000089e1, 0x000089e2, 0x0000b1b8,
+ /* 88 */ 0x000089e3, 0x000089e4, 0x000089e5, 0x000089e6,
+ /* 8c */ 0x000089e7, 0x0000b8b4, 0x000089e8, 0x0000cfc4,
+ /* 90 */ 0x000089e9, 0x000089ea, 0x000089eb, 0x000089ec,
+ /* 94 */ 0x0000d9e7, 0x0000cfa6, 0x0000cde2, 0x000089ed,
+ /* 98 */ 0x000089ee, 0x0000d9ed, 0x0000b6e0, 0x000089ef,
+ /* 9c */ 0x0000d2b9, 0x000089f0, 0x000089f1, 0x0000b9bb,
+ /* a0 */ 0x000089f2, 0x000089f3, 0x000089f4, 0x000089f5,
+ /* a4 */ 0x0000e2b9, 0x0000e2b7, 0x000089f6, 0x0000b4f3,
+ /* a8 */ 0x000089f7, 0x0000ccec, 0x0000ccab, 0x0000b7f2,
+ /* ac */ 0x000089f8, 0x0000d8b2, 0x0000d1eb, 0x0000babb,
+ /* b0 */ 0x000089f9, 0x0000caa7, 0x000089fa, 0x000089fb,
+ /* b4 */ 0x0000cdb7, 0x000089fc, 0x000089fd, 0x0000d2c4,
+ /* b8 */ 0x0000bfe4, 0x0000bcd0, 0x0000b6e1, 0x000089fe,
+ /* bc */ 0x0000dec5, 0x00008a40, 0x00008a41, 0x00008a42,
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x02ad5 ***/
+
+ /* 80 */ 0x00008a43, 0x0000dec6, 0x0000dbbc, 0x00008a44,
+ /* 84 */ 0x0000d1d9, 0x00008a45, 0x00008a46, 0x0000c6e6,
+ /* 88 */ 0x0000c4ce, 0x0000b7ee, 0x00008a47, 0x0000b7dc,
+ /* 8c */ 0x00008a48, 0x00008a49, 0x0000bffc, 0x0000d7e0,
+ /* 90 */ 0x00008a4a, 0x0000c6f5, 0x00008a4b, 0x00008a4c,
+ /* 94 */ 0x0000b1bc, 0x0000dec8, 0x0000bdb1, 0x0000ccd7,
+ /* 98 */ 0x0000deca, 0x00008a4d, 0x0000dec9, 0x00008a4e,
+ /* 9c */ 0x00008a4f, 0x00008a50, 0x00008a51, 0x00008a52,
+ /* a0 */ 0x0000b5ec, 0x00008a53, 0x0000c9dd, 0x00008a54,
+ /* a4 */ 0x00008a55, 0x0000b0c2, 0x00008a56, 0x00008a57,
+ /* a8 */ 0x00008a58, 0x00008a59, 0x00008a5a, 0x00008a5b,
+ /* ac */ 0x00008a5c, 0x00008a5d, 0x00008a5e, 0x00008a5f,
+ /* b0 */ 0x00008a60, 0x00008a61, 0x00008a62, 0x0000c5ae,
+ /* b4 */ 0x0000c5ab, 0x00008a63, 0x0000c4cc, 0x00008a64,
+ /* b8 */ 0x0000bce9, 0x0000cbfd, 0x00008a65, 0x00008a66,
+ /* bc */ 0x00008a67, 0x0000bac3, 0x00008a68, 0x00008a69,
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x02b15 ***/
+
+ /* 80 */ 0x00008a6a, 0x0000e5f9, 0x0000c8e7, 0x0000e5fa,
+ /* 84 */ 0x0000cdfd, 0x00008a6b, 0x0000d7b1, 0x0000b8be,
+ /* 88 */ 0x0000c2e8, 0x00008a6c, 0x0000c8d1, 0x00008a6d,
+ /* 8c */ 0x00008a6e, 0x0000e5fb, 0x00008a6f, 0x00008a70,
+ /* 90 */ 0x00008a71, 0x00008a72, 0x0000b6ca, 0x0000bccb,
+ /* 94 */ 0x00008a73, 0x00008a74, 0x0000d1fd, 0x0000e6a1,
+ /* 98 */ 0x00008a75, 0x0000c3ee, 0x00008a76, 0x00008a77,
+ /* 9c */ 0x00008a78, 0x00008a79, 0x0000e6a4, 0x00008a7a,
+ /* a0 */ 0x00008a7b, 0x00008a7c, 0x00008a7d, 0x0000e5fe,
+ /* a4 */ 0x0000e6a5, 0x0000cdd7, 0x00008a7e, 0x00008a80,
+ /* a8 */ 0x0000b7c1, 0x0000e5fc, 0x0000e5fd, 0x0000e6a3,
+ /* ac */ 0x00008a81, 0x00008a82, 0x0000c4dd, 0x0000e6a8,
+ /* b0 */ 0x00008a83, 0x00008a84, 0x0000e6a7, 0x00008a85,
+ /* b4 */ 0x00008a86, 0x00008a87, 0x00008a88, 0x00008a89,
+ /* b8 */ 0x00008a8a, 0x0000c3c3, 0x00008a8b, 0x0000c6de,
+ /* bc */ 0x00008a8c, 0x00008a8d, 0x0000e6aa, 0x00008a8e,
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x02b55 ***/
+
+ /* 80 */ 0x00008a8f, 0x00008a90, 0x00008a91, 0x00008a92,
+ /* 84 */ 0x00008a93, 0x00008a94, 0x0000c4b7, 0x00008a95,
+ /* 88 */ 0x00008a96, 0x00008a97, 0x0000e6a2, 0x0000cabc,
+ /* 8c */ 0x00008a98, 0x00008a99, 0x00008a9a, 0x00008a9b,
+ /* 90 */ 0x0000bde3, 0x0000b9c3, 0x0000e6a6, 0x0000d0d5,
+ /* 94 */ 0x0000ceaf, 0x00008a9c, 0x00008a9d, 0x0000e6a9,
+ /* 98 */ 0x0000e6b0, 0x00008a9e, 0x0000d2a6, 0x00008a9f,
+ /* 9c */ 0x0000bdaa, 0x0000e6ad, 0x00008aa0, 0x00008aa1,
+ /* a0 */ 0x00008aa2, 0x00008aa3, 0x00008aa4, 0x0000e6af,
+ /* a4 */ 0x00008aa5, 0x0000c0d1, 0x00008aa6, 0x00008aa7,
+ /* a8 */ 0x0000d2cc, 0x00008aa8, 0x00008aa9, 0x00008aaa,
+ /* ac */ 0x0000bca7, 0x00008aab, 0x00008aac, 0x00008aad,
+ /* b0 */ 0x00008aae, 0x00008aaf, 0x00008ab0, 0x00008ab1,
+ /* b4 */ 0x00008ab2, 0x00008ab3, 0x00008ab4, 0x00008ab5,
+ /* b8 */ 0x00008ab6, 0x0000e6b1, 0x00008ab7, 0x0000d2f6,
+ /* bc */ 0x00008ab8, 0x00008ab9, 0x00008aba, 0x0000d7cb,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x02b95 ***/
+
+ /* 80 */ 0x00008abb, 0x0000cdfe, 0x00008abc, 0x0000cdde,
+ /* 84 */ 0x0000c2a6, 0x0000e6ab, 0x0000e6ac, 0x0000bdbf,
+ /* 88 */ 0x0000e6ae, 0x0000e6b3, 0x00008abd, 0x00008abe,
+ /* 8c */ 0x0000e6b2, 0x00008abf, 0x00008ac0, 0x00008ac1,
+ /* 90 */ 0x00008ac2, 0x0000e6b6, 0x00008ac3, 0x0000e6b8,
+ /* 94 */ 0x00008ac4, 0x00008ac5, 0x00008ac6, 0x00008ac7,
+ /* 98 */ 0x0000c4ef, 0x00008ac8, 0x00008ac9, 0x00008aca,
+ /* 9c */ 0x0000c4c8, 0x00008acb, 0x00008acc, 0x0000beea,
+ /* a0 */ 0x0000c9ef, 0x00008acd, 0x00008ace, 0x0000e6b7,
+ /* a4 */ 0x00008acf, 0x0000b6f0, 0x00008ad0, 0x00008ad1,
+ /* a8 */ 0x00008ad2, 0x0000c3e4, 0x00008ad3, 0x00008ad4,
+ /* ac */ 0x00008ad5, 0x00008ad6, 0x00008ad7, 0x00008ad8,
+ /* b0 */ 0x00008ad9, 0x0000d3e9, 0x0000e6b4, 0x00008ada,
+ /* b4 */ 0x0000e6b5, 0x00008adb, 0x0000c8a2, 0x00008adc,
+ /* b8 */ 0x00008add, 0x00008ade, 0x00008adf, 0x00008ae0,
+ /* bc */ 0x0000e6bd, 0x00008ae1, 0x00008ae2, 0x00008ae3,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x02bd5 ***/
+
+ /* 80 */ 0x0000e6b9, 0x00008ae4, 0x00008ae5, 0x00008ae6,
+ /* 84 */ 0x00008ae7, 0x00008ae8, 0x0000c6c5, 0x00008ae9,
+ /* 88 */ 0x00008aea, 0x0000cdf1, 0x0000e6bb, 0x00008aeb,
+ /* 8c */ 0x00008aec, 0x00008aed, 0x00008aee, 0x00008aef,
+ /* 90 */ 0x00008af0, 0x00008af1, 0x00008af2, 0x00008af3,
+ /* 94 */ 0x00008af4, 0x0000e6bc, 0x00008af5, 0x00008af6,
+ /* 98 */ 0x00008af7, 0x00008af8, 0x0000bbe9, 0x00008af9,
+ /* 9c */ 0x00008afa, 0x00008afb, 0x00008afc, 0x00008afd,
+ /* a0 */ 0x00008afe, 0x00008b40, 0x0000e6be, 0x00008b41,
+ /* a4 */ 0x00008b42, 0x00008b43, 0x00008b44, 0x0000e6ba,
+ /* a8 */ 0x00008b45, 0x00008b46, 0x0000c0b7, 0x00008b47,
+ /* ac */ 0x00008b48, 0x00008b49, 0x00008b4a, 0x00008b4b,
+ /* b0 */ 0x00008b4c, 0x00008b4d, 0x00008b4e, 0x00008b4f,
+ /* b4 */ 0x0000d3a4, 0x0000e6bf, 0x0000c9f4, 0x0000e6c3,
+ /* b8 */ 0x00008b50, 0x00008b51, 0x0000e6c4, 0x00008b52,
+ /* bc */ 0x00008b53, 0x00008b54, 0x00008b55, 0x0000d0f6,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x02c15 ***/
+
+ /* 80 */ 0x00008b56, 0x00008b57, 0x00008b58, 0x00008b59,
+ /* 84 */ 0x00008b5a, 0x00008b5b, 0x00008b5c, 0x00008b5d,
+ /* 88 */ 0x00008b5e, 0x00008b5f, 0x00008b60, 0x00008b61,
+ /* 8c */ 0x00008b62, 0x00008b63, 0x00008b64, 0x00008b65,
+ /* 90 */ 0x00008b66, 0x00008b67, 0x0000c3bd, 0x00008b68,
+ /* 94 */ 0x00008b69, 0x00008b6a, 0x00008b6b, 0x00008b6c,
+ /* 98 */ 0x00008b6d, 0x00008b6e, 0x0000c3c4, 0x0000e6c2,
+ /* 9c */ 0x00008b6f, 0x00008b70, 0x00008b71, 0x00008b72,
+ /* a0 */ 0x00008b73, 0x00008b74, 0x00008b75, 0x00008b76,
+ /* a4 */ 0x00008b77, 0x00008b78, 0x00008b79, 0x00008b7a,
+ /* a8 */ 0x00008b7b, 0x00008b7c, 0x0000e6c1, 0x00008b7d,
+ /* ac */ 0x00008b7e, 0x00008b80, 0x00008b81, 0x00008b82,
+ /* b0 */ 0x00008b83, 0x00008b84, 0x0000e6c7, 0x0000cfb1,
+ /* b4 */ 0x00008b85, 0x0000ebf4, 0x00008b86, 0x00008b87,
+ /* b8 */ 0x0000e6ca, 0x00008b88, 0x00008b89, 0x00008b8a,
+ /* bc */ 0x00008b8b, 0x00008b8c, 0x0000e6c5, 0x00008b8d,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x02c55 ***/
+
+ /* 80 */ 0x00008b8e, 0x0000bcde, 0x0000c9a9, 0x00008b8f,
+ /* 84 */ 0x00008b90, 0x00008b91, 0x00008b92, 0x00008b93,
+ /* 88 */ 0x00008b94, 0x0000bcb5, 0x00008b95, 0x00008b96,
+ /* 8c */ 0x0000cfd3, 0x00008b97, 0x00008b98, 0x00008b99,
+ /* 90 */ 0x00008b9a, 0x00008b9b, 0x0000e6c8, 0x00008b9c,
+ /* 94 */ 0x0000e6c9, 0x00008b9d, 0x0000e6ce, 0x00008b9e,
+ /* 98 */ 0x0000e6d0, 0x00008b9f, 0x00008ba0, 0x00008ba1,
+ /* 9c */ 0x0000e6d1, 0x00008ba2, 0x00008ba3, 0x00008ba4,
+ /* a0 */ 0x0000e6cb, 0x0000b5d5, 0x00008ba5, 0x0000e6cc,
+ /* a4 */ 0x00008ba6, 0x00008ba7, 0x0000e6cf, 0x00008ba8,
+ /* a8 */ 0x00008ba9, 0x0000c4db, 0x00008baa, 0x0000e6c6,
+ /* ac */ 0x00008bab, 0x00008bac, 0x00008bad, 0x00008bae,
+ /* b0 */ 0x00008baf, 0x0000e6cd, 0x00008bb0, 0x00008bb1,
+ /* b4 */ 0x00008bb2, 0x00008bb3, 0x00008bb4, 0x00008bb5,
+ /* b8 */ 0x00008bb6, 0x00008bb7, 0x00008bb8, 0x00008bb9,
+ /* bc */ 0x00008bba, 0x00008bbb, 0x00008bbc, 0x00008bbd,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x02c95 ***/
+
+ /* 80 */ 0x00008bbe, 0x00008bbf, 0x00008bc0, 0x00008bc1,
+ /* 84 */ 0x00008bc2, 0x00008bc3, 0x00008bc4, 0x00008bc5,
+ /* 88 */ 0x00008bc6, 0x0000e6d2, 0x00008bc7, 0x00008bc8,
+ /* 8c */ 0x00008bc9, 0x00008bca, 0x00008bcb, 0x00008bcc,
+ /* 90 */ 0x00008bcd, 0x00008bce, 0x00008bcf, 0x00008bd0,
+ /* 94 */ 0x00008bd1, 0x00008bd2, 0x0000e6d4, 0x0000e6d3,
+ /* 98 */ 0x00008bd3, 0x00008bd4, 0x00008bd5, 0x00008bd6,
+ /* 9c */ 0x00008bd7, 0x00008bd8, 0x00008bd9, 0x00008bda,
+ /* a0 */ 0x00008bdb, 0x00008bdc, 0x00008bdd, 0x00008bde,
+ /* a4 */ 0x00008bdf, 0x00008be0, 0x00008be1, 0x00008be2,
+ /* a8 */ 0x00008be3, 0x00008be4, 0x00008be5, 0x00008be6,
+ /* ac */ 0x00008be7, 0x00008be8, 0x00008be9, 0x00008bea,
+ /* b0 */ 0x00008beb, 0x00008bec, 0x0000e6d5, 0x00008bed,
+ /* b4 */ 0x0000d9f8, 0x00008bee, 0x00008bef, 0x0000e6d6,
+ /* b8 */ 0x00008bf0, 0x00008bf1, 0x00008bf2, 0x00008bf3,
+ /* bc */ 0x00008bf4, 0x00008bf5, 0x00008bf6, 0x00008bf7,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x02cd5 ***/
+
+ /* 80 */ 0x0000e6d7, 0x00008bf8, 0x00008bf9, 0x00008bfa,
+ /* 84 */ 0x00008bfb, 0x00008bfc, 0x00008bfd, 0x00008bfe,
+ /* 88 */ 0x00008c40, 0x00008c41, 0x00008c42, 0x00008c43,
+ /* 8c */ 0x00008c44, 0x00008c45, 0x00008c46, 0x00008c47,
+ /* 90 */ 0x0000d7d3, 0x0000e6dd, 0x00008c48, 0x0000e6de,
+ /* 94 */ 0x0000bfd7, 0x0000d4d0, 0x00008c49, 0x0000d7d6,
+ /* 98 */ 0x0000b4e6, 0x0000cbef, 0x0000e6da, 0x0000d8c3,
+ /* 9c */ 0x0000d7ce, 0x0000d0a2, 0x00008c4a, 0x0000c3cf,
+ /* a0 */ 0x00008c4b, 0x00008c4c, 0x0000e6df, 0x0000bcbe,
+ /* a4 */ 0x0000b9c2, 0x0000e6db, 0x0000d1a7, 0x00008c4d,
+ /* a8 */ 0x00008c4e, 0x0000baa2, 0x0000c2cf, 0x00008c4f,
+ /* ac */ 0x0000d8ab, 0x00008c50, 0x00008c51, 0x00008c52,
+ /* b0 */ 0x0000caeb, 0x0000e5ee, 0x00008c53, 0x0000e6dc,
+ /* b4 */ 0x00008c54, 0x0000b7f5, 0x00008c55, 0x00008c56,
+ /* b8 */ 0x00008c57, 0x00008c58, 0x0000c8e6, 0x00008c59,
+ /* bc */ 0x00008c5a, 0x0000c4f5, 0x00008c5b, 0x00008c5c,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x02d15 ***/
+
+ /* 80 */ 0x0000e5b2, 0x0000c4fe, 0x00008c5d, 0x0000cbfc,
+ /* 84 */ 0x0000e5b3, 0x0000d5ac, 0x00008c5e, 0x0000d3ee,
+ /* 88 */ 0x0000cad8, 0x0000b0b2, 0x00008c5f, 0x0000cbce,
+ /* 8c */ 0x0000cdea, 0x00008c60, 0x00008c61, 0x0000baea,
+ /* 90 */ 0x00008c62, 0x00008c63, 0x00008c64, 0x0000e5b5,
+ /* 94 */ 0x00008c65, 0x0000e5b4, 0x00008c66, 0x0000d7da,
+ /* 98 */ 0x0000b9d9, 0x0000d6e6, 0x0000b6a8, 0x0000cdf0,
+ /* 9c */ 0x0000d2cb, 0x0000b1a6, 0x0000cab5, 0x00008c67,
+ /* a0 */ 0x0000b3e8, 0x0000c9f3, 0x0000bfcd, 0x0000d0fb,
+ /* a4 */ 0x0000cad2, 0x0000e5b6, 0x0000bbc2, 0x00008c68,
+ /* a8 */ 0x00008c69, 0x00008c6a, 0x0000cfdc, 0x0000b9ac,
+ /* ac */ 0x00008c6b, 0x00008c6c, 0x00008c6d, 0x00008c6e,
+ /* b0 */ 0x0000d4d7, 0x00008c6f, 0x00008c70, 0x0000baa6,
+ /* b4 */ 0x0000d1e7, 0x0000cffc, 0x0000bcd2, 0x00008c71,
+ /* b8 */ 0x0000e5b7, 0x0000c8dd, 0x00008c72, 0x00008c73,
+ /* bc */ 0x00008c74, 0x0000bfed, 0x0000b1f6, 0x0000cbde,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x02d55 ***/
+
+ /* 80 */ 0x00008c75, 0x00008c76, 0x0000bcc5, 0x00008c77,
+ /* 84 */ 0x0000bcc4, 0x0000d2fa, 0x0000c3dc, 0x0000bfdc,
+ /* 88 */ 0x00008c78, 0x00008c79, 0x00008c7a, 0x00008c7b,
+ /* 8c */ 0x0000b8bb, 0x00008c7c, 0x00008c7d, 0x00008c7e,
+ /* 90 */ 0x0000c3c2, 0x00008c80, 0x0000baae, 0x0000d4a2,
+ /* 94 */ 0x00008c81, 0x00008c82, 0x00008c83, 0x00008c84,
+ /* 98 */ 0x00008c85, 0x00008c86, 0x00008c87, 0x00008c88,
+ /* 9c */ 0x00008c89, 0x0000c7de, 0x0000c4af, 0x0000b2ec,
+ /* a0 */ 0x00008c8a, 0x0000b9d1, 0x00008c8b, 0x00008c8c,
+ /* a4 */ 0x0000e5bb, 0x0000c1c8, 0x00008c8d, 0x00008c8e,
+ /* a8 */ 0x0000d5af, 0x00008c8f, 0x00008c90, 0x00008c91,
+ /* ac */ 0x00008c92, 0x00008c93, 0x0000e5bc, 0x00008c94,
+ /* b0 */ 0x0000e5be, 0x00008c95, 0x00008c96, 0x00008c97,
+ /* b4 */ 0x00008c98, 0x00008c99, 0x00008c9a, 0x00008c9b,
+ /* b8 */ 0x0000b4e7, 0x0000b6d4, 0x0000cbc2, 0x0000d1b0,
+ /* bc */ 0x0000b5bc, 0x00008c9c, 0x00008c9d, 0x0000cad9,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x02d95 ***/
+
+ /* 80 */ 0x00008c9e, 0x0000b7e2, 0x00008c9f, 0x00008ca0,
+ /* 84 */ 0x0000c9e4, 0x00008ca1, 0x0000bdab, 0x00008ca2,
+ /* 88 */ 0x00008ca3, 0x0000cebe, 0x0000d7f0, 0x00008ca4,
+ /* 8c */ 0x00008ca5, 0x00008ca6, 0x00008ca7, 0x0000d0a1,
+ /* 90 */ 0x00008ca8, 0x0000c9d9, 0x00008ca9, 0x00008caa,
+ /* 94 */ 0x0000b6fb, 0x0000e6d8, 0x0000bce2, 0x00008cab,
+ /* 98 */ 0x0000b3be, 0x00008cac, 0x0000c9d0, 0x00008cad,
+ /* 9c */ 0x0000e6d9, 0x0000b3a2, 0x00008cae, 0x00008caf,
+ /* a0 */ 0x00008cb0, 0x00008cb1, 0x0000decc, 0x00008cb2,
+ /* a4 */ 0x0000d3c8, 0x0000decd, 0x00008cb3, 0x0000d2a2,
+ /* a8 */ 0x00008cb4, 0x00008cb5, 0x00008cb6, 0x00008cb7,
+ /* ac */ 0x0000dece, 0x00008cb8, 0x00008cb9, 0x00008cba,
+ /* b0 */ 0x00008cbb, 0x0000becd, 0x00008cbc, 0x00008cbd,
+ /* b4 */ 0x0000decf, 0x00008cbe, 0x00008cbf, 0x00008cc0,
+ /* b8 */ 0x0000caac, 0x0000d2fc, 0x0000b3df, 0x0000e5ea,
+ /* bc */ 0x0000c4e1, 0x0000bea1, 0x0000ceb2, 0x0000c4f2,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x02dd5 ***/
+
+ /* 80 */ 0x0000bed6, 0x0000c6a8, 0x0000b2e3, 0x00008cc1,
+ /* 84 */ 0x00008cc2, 0x0000bed3, 0x00008cc3, 0x00008cc4,
+ /* 88 */ 0x0000c7fc, 0x0000cceb, 0x0000bdec, 0x0000cedd,
+ /* 8c */ 0x00008cc5, 0x00008cc6, 0x0000caba, 0x0000c6c1,
+ /* 90 */ 0x0000e5ec, 0x0000d0bc, 0x00008cc7, 0x00008cc8,
+ /* 94 */ 0x00008cc9, 0x0000d5b9, 0x00008cca, 0x00008ccb,
+ /* 98 */ 0x00008ccc, 0x0000e5ed, 0x00008ccd, 0x00008cce,
+ /* 9c */ 0x00008ccf, 0x00008cd0, 0x0000caf4, 0x00008cd1,
+ /* a0 */ 0x0000cdc0, 0x0000c2c5, 0x00008cd2, 0x0000e5ef,
+ /* a4 */ 0x00008cd3, 0x0000c2c4, 0x0000e5f0, 0x00008cd4,
+ /* a8 */ 0x00008cd5, 0x00008cd6, 0x00008cd7, 0x00008cd8,
+ /* ac */ 0x00008cd9, 0x00008cda, 0x0000e5f8, 0x0000cdcd,
+ /* b0 */ 0x00008cdb, 0x0000c9bd, 0x00008cdc, 0x00008cdd,
+ /* b4 */ 0x00008cde, 0x00008cdf, 0x00008ce0, 0x00008ce1,
+ /* b8 */ 0x00008ce2, 0x0000d2d9, 0x0000e1a8, 0x00008ce3,
+ /* bc */ 0x00008ce4, 0x00008ce5, 0x00008ce6, 0x0000d3ec,
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x02e15 ***/
+
+ /* 80 */ 0x00008ce7, 0x0000cbea, 0x0000c6f1, 0x00008ce8,
+ /* 84 */ 0x00008ce9, 0x00008cea, 0x00008ceb, 0x00008cec,
+ /* 88 */ 0x0000e1ac, 0x00008ced, 0x00008cee, 0x00008cef,
+ /* 8c */ 0x0000e1a7, 0x0000e1a9, 0x00008cf0, 0x00008cf1,
+ /* 90 */ 0x0000e1aa, 0x0000e1af, 0x00008cf2, 0x00008cf3,
+ /* 94 */ 0x0000b2ed, 0x00008cf4, 0x0000e1ab, 0x0000b8da,
+ /* 98 */ 0x0000e1ad, 0x0000e1ae, 0x0000e1b0, 0x0000b5ba,
+ /* 9c */ 0x0000e1b1, 0x00008cf5, 0x00008cf6, 0x00008cf7,
+ /* a0 */ 0x00008cf8, 0x00008cf9, 0x0000e1b3, 0x0000e1b8,
+ /* a4 */ 0x00008cfa, 0x00008cfb, 0x00008cfc, 0x00008cfd,
+ /* a8 */ 0x00008cfe, 0x0000d1d2, 0x00008d40, 0x0000e1b6,
+ /* ac */ 0x0000e1b5, 0x0000c1eb, 0x00008d41, 0x00008d42,
+ /* b0 */ 0x00008d43, 0x0000e1b7, 0x00008d44, 0x0000d4c0,
+ /* b4 */ 0x00008d45, 0x0000e1b2, 0x00008d46, 0x0000e1ba,
+ /* b8 */ 0x0000b0b6, 0x00008d47, 0x00008d48, 0x00008d49,
+ /* bc */ 0x00008d4a, 0x0000e1b4, 0x00008d4b, 0x0000bff9,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x02e55 ***/
+
+ /* 80 */ 0x00008d4c, 0x0000e1b9, 0x00008d4d, 0x00008d4e,
+ /* 84 */ 0x0000e1bb, 0x00008d4f, 0x00008d50, 0x00008d51,
+ /* 88 */ 0x00008d52, 0x00008d53, 0x00008d54, 0x0000e1be,
+ /* 8c */ 0x00008d55, 0x00008d56, 0x00008d57, 0x00008d58,
+ /* 90 */ 0x00008d59, 0x00008d5a, 0x0000e1bc, 0x00008d5b,
+ /* 94 */ 0x00008d5c, 0x00008d5d, 0x00008d5e, 0x00008d5f,
+ /* 98 */ 0x00008d60, 0x0000d6c5, 0x00008d61, 0x00008d62,
+ /* 9c */ 0x00008d63, 0x00008d64, 0x00008d65, 0x00008d66,
+ /* a0 */ 0x00008d67, 0x0000cfbf, 0x00008d68, 0x00008d69,
+ /* a4 */ 0x0000e1bd, 0x0000e1bf, 0x0000c2cd, 0x00008d6a,
+ /* a8 */ 0x0000b6eb, 0x00008d6b, 0x0000d3f8, 0x00008d6c,
+ /* ac */ 0x00008d6d, 0x0000c7cd, 0x00008d6e, 0x00008d6f,
+ /* b0 */ 0x0000b7e5, 0x00008d70, 0x00008d71, 0x00008d72,
+ /* b4 */ 0x00008d73, 0x00008d74, 0x00008d75, 0x00008d76,
+ /* b8 */ 0x00008d77, 0x00008d78, 0x00008d79, 0x0000befe,
+ /* bc */ 0x00008d7a, 0x00008d7b, 0x00008d7c, 0x00008d7d,
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x02e95 ***/
+
+ /* 80 */ 0x00008d7e, 0x00008d80, 0x0000e1c0, 0x0000e1c1,
+ /* 84 */ 0x00008d81, 0x00008d82, 0x0000e1c7, 0x0000b3e7,
+ /* 88 */ 0x00008d83, 0x00008d84, 0x00008d85, 0x00008d86,
+ /* 8c */ 0x00008d87, 0x00008d88, 0x0000c6e9, 0x00008d89,
+ /* 90 */ 0x00008d8a, 0x00008d8b, 0x00008d8c, 0x00008d8d,
+ /* 94 */ 0x0000b4de, 0x00008d8e, 0x0000d1c2, 0x00008d8f,
+ /* 98 */ 0x00008d90, 0x00008d91, 0x00008d92, 0x0000e1c8,
+ /* 9c */ 0x00008d93, 0x00008d94, 0x0000e1c6, 0x00008d95,
+ /* a0 */ 0x00008d96, 0x00008d97, 0x00008d98, 0x00008d99,
+ /* a4 */ 0x0000e1c5, 0x00008d9a, 0x0000e1c3, 0x0000e1c2,
+ /* a8 */ 0x00008d9b, 0x0000b1c0, 0x00008d9c, 0x00008d9d,
+ /* ac */ 0x00008d9e, 0x0000d5b8, 0x0000e1c4, 0x00008d9f,
+ /* b0 */ 0x00008da0, 0x00008da1, 0x00008da2, 0x00008da3,
+ /* b4 */ 0x0000e1cb, 0x00008da4, 0x00008da5, 0x00008da6,
+ /* b8 */ 0x00008da7, 0x00008da8, 0x00008da9, 0x00008daa,
+ /* bc */ 0x00008dab, 0x0000e1cc, 0x0000e1ca, 0x00008dac,
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x02ed5 ***/
+
+ /* 80 */ 0x00008dad, 0x00008dae, 0x00008daf, 0x00008db0,
+ /* 84 */ 0x00008db1, 0x00008db2, 0x00008db3, 0x0000effa,
+ /* 88 */ 0x00008db4, 0x00008db5, 0x0000e1d3, 0x0000e1d2,
+ /* 8c */ 0x0000c7b6, 0x00008db6, 0x00008db7, 0x00008db8,
+ /* 90 */ 0x00008db9, 0x00008dba, 0x00008dbb, 0x00008dbc,
+ /* 94 */ 0x00008dbd, 0x00008dbe, 0x00008dbf, 0x00008dc0,
+ /* 98 */ 0x0000e1c9, 0x00008dc1, 0x00008dc2, 0x0000e1ce,
+ /* 9c */ 0x00008dc3, 0x0000e1d0, 0x00008dc4, 0x00008dc5,
+ /* a0 */ 0x00008dc6, 0x00008dc7, 0x00008dc8, 0x00008dc9,
+ /* a4 */ 0x00008dca, 0x00008dcb, 0x00008dcc, 0x00008dcd,
+ /* a8 */ 0x00008dce, 0x0000e1d4, 0x00008dcf, 0x0000e1d1,
+ /* ac */ 0x0000e1cd, 0x00008dd0, 0x00008dd1, 0x0000e1cf,
+ /* b0 */ 0x00008dd2, 0x00008dd3, 0x00008dd4, 0x00008dd5,
+ /* b4 */ 0x0000e1d5, 0x00008dd6, 0x00008dd7, 0x00008dd8,
+ /* b8 */ 0x00008dd9, 0x00008dda, 0x00008ddb, 0x00008ddc,
+ /* bc */ 0x00008ddd, 0x00008dde, 0x00008ddf, 0x00008de0,
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x02f15 ***/
+
+ /* 80 */ 0x00008de1, 0x00008de2, 0x0000e1d6, 0x00008de3,
+ /* 84 */ 0x00008de4, 0x00008de5, 0x00008de6, 0x00008de7,
+ /* 88 */ 0x00008de8, 0x00008de9, 0x00008dea, 0x00008deb,
+ /* 8c */ 0x00008dec, 0x00008ded, 0x00008dee, 0x00008def,
+ /* 90 */ 0x00008df0, 0x00008df1, 0x00008df2, 0x00008df3,
+ /* 94 */ 0x00008df4, 0x00008df5, 0x00008df6, 0x00008df7,
+ /* 98 */ 0x00008df8, 0x0000e1d7, 0x00008df9, 0x00008dfa,
+ /* 9c */ 0x00008dfb, 0x0000e1d8, 0x00008dfc, 0x00008dfd,
+ /* a0 */ 0x00008dfe, 0x00008e40, 0x00008e41, 0x00008e42,
+ /* a4 */ 0x00008e43, 0x00008e44, 0x00008e45, 0x00008e46,
+ /* a8 */ 0x00008e47, 0x00008e48, 0x00008e49, 0x00008e4a,
+ /* ac */ 0x00008e4b, 0x00008e4c, 0x00008e4d, 0x00008e4e,
+ /* b0 */ 0x00008e4f, 0x00008e50, 0x00008e51, 0x00008e52,
+ /* b4 */ 0x00008e53, 0x00008e54, 0x00008e55, 0x0000e1da,
+ /* b8 */ 0x00008e56, 0x00008e57, 0x00008e58, 0x00008e59,
+ /* bc */ 0x00008e5a, 0x00008e5b, 0x00008e5c, 0x00008e5d,
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x02f55 ***/
+
+ /* 80 */ 0x00008e5e, 0x00008e5f, 0x00008e60, 0x00008e61,
+ /* 84 */ 0x00008e62, 0x0000e1db, 0x00008e63, 0x00008e64,
+ /* 88 */ 0x00008e65, 0x00008e66, 0x00008e67, 0x00008e68,
+ /* 8c */ 0x00008e69, 0x0000cea1, 0x00008e6a, 0x00008e6b,
+ /* 90 */ 0x00008e6c, 0x00008e6d, 0x00008e6e, 0x00008e6f,
+ /* 94 */ 0x00008e70, 0x00008e71, 0x00008e72, 0x00008e73,
+ /* 98 */ 0x00008e74, 0x00008e75, 0x00008e76, 0x0000e7dd,
+ /* 9c */ 0x00008e77, 0x0000b4a8, 0x0000d6dd, 0x00008e78,
+ /* a0 */ 0x00008e79, 0x0000d1b2, 0x0000b3b2, 0x00008e7a,
+ /* a4 */ 0x00008e7b, 0x0000b9a4, 0x0000d7f3, 0x0000c7c9,
+ /* a8 */ 0x0000bede, 0x0000b9ae, 0x00008e7c, 0x0000ced7,
+ /* ac */ 0x00008e7d, 0x00008e7e, 0x0000b2ee, 0x0000dbcf,
+ /* b0 */ 0x00008e80, 0x0000bcba, 0x0000d2d1, 0x0000cbc8,
+ /* b4 */ 0x0000b0cd, 0x00008e81, 0x00008e82, 0x0000cfef,
+ /* b8 */ 0x00008e83, 0x00008e84, 0x00008e85, 0x00008e86,
+ /* bc */ 0x00008e87, 0x0000d9e3, 0x0000bded, 0x00008e88,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x02f95 ***/
+
+ /* 80 */ 0x00008e89, 0x0000b1d2, 0x0000cad0, 0x0000b2bc,
+ /* 84 */ 0x00008e8a, 0x0000cba7, 0x0000b7ab, 0x00008e8b,
+ /* 88 */ 0x0000caa6, 0x00008e8c, 0x00008e8d, 0x00008e8e,
+ /* 8c */ 0x0000cfa3, 0x00008e8f, 0x00008e90, 0x0000e0f8,
+ /* 90 */ 0x0000d5ca, 0x0000e0fb, 0x00008e91, 0x00008e92,
+ /* 94 */ 0x0000e0fa, 0x0000c5c1, 0x0000ccfb, 0x00008e93,
+ /* 98 */ 0x0000c1b1, 0x0000e0f9, 0x0000d6e3, 0x0000b2af,
+ /* 9c */ 0x0000d6c4, 0x0000b5db, 0x00008e94, 0x00008e95,
+ /* a0 */ 0x00008e96, 0x00008e97, 0x00008e98, 0x00008e99,
+ /* a4 */ 0x00008e9a, 0x00008e9b, 0x0000b4f8, 0x0000d6a1,
+ /* a8 */ 0x00008e9c, 0x00008e9d, 0x00008e9e, 0x00008e9f,
+ /* ac */ 0x00008ea0, 0x0000cfaf, 0x0000b0ef, 0x00008ea1,
+ /* b0 */ 0x00008ea2, 0x0000e0fc, 0x00008ea3, 0x00008ea4,
+ /* b4 */ 0x00008ea5, 0x00008ea6, 0x00008ea7, 0x0000e1a1,
+ /* b8 */ 0x0000b3a3, 0x00008ea8, 0x00008ea9, 0x0000e0fd,
+ /* bc */ 0x0000e0fe, 0x0000c3b1, 0x00008eaa, 0x00008eab,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x02fd5 ***/
+
+ /* 80 */ 0x00008eac, 0x00008ead, 0x0000c3dd, 0x00008eae,
+ /* 84 */ 0x0000e1a2, 0x0000b7f9, 0x00008eaf, 0x00008eb0,
+ /* 88 */ 0x00008eb1, 0x00008eb2, 0x00008eb3, 0x00008eb4,
+ /* 8c */ 0x0000bbcf, 0x00008eb5, 0x00008eb6, 0x00008eb7,
+ /* 90 */ 0x00008eb8, 0x00008eb9, 0x00008eba, 0x00008ebb,
+ /* 94 */ 0x0000e1a3, 0x0000c4bb, 0x00008ebc, 0x00008ebd,
+ /* 98 */ 0x00008ebe, 0x00008ebf, 0x00008ec0, 0x0000e1a4,
+ /* 9c */ 0x00008ec1, 0x00008ec2, 0x0000e1a5, 0x00008ec3,
+ /* a0 */ 0x00008ec4, 0x0000e1a6, 0x0000b4b1, 0x00008ec5,
+ /* a4 */ 0x00008ec6, 0x00008ec7, 0x00008ec8, 0x00008ec9,
+ /* a8 */ 0x00008eca, 0x00008ecb, 0x00008ecc, 0x00008ecd,
+ /* ac */ 0x00008ece, 0x00008ecf, 0x00008ed0, 0x00008ed1,
+ /* b0 */ 0x00008ed2, 0x00008ed3, 0x0000b8c9, 0x0000c6bd,
+ /* b4 */ 0x0000c4ea, 0x00008ed4, 0x0000b2a2, 0x00008ed5,
+ /* b8 */ 0x0000d0d2, 0x00008ed6, 0x0000e7db, 0x0000bbc3,
+ /* bc */ 0x0000d3d7, 0x0000d3c4, 0x00008ed7, 0x0000b9e3,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x03015 ***/
+
+ /* 80 */ 0x0000e2cf, 0x00008ed8, 0x00008ed9, 0x00008eda,
+ /* 84 */ 0x0000d7af, 0x00008edb, 0x0000c7ec, 0x0000b1d3,
+ /* 88 */ 0x00008edc, 0x00008edd, 0x0000b4b2, 0x0000e2d1,
+ /* 8c */ 0x00008ede, 0x00008edf, 0x00008ee0, 0x0000d0f2,
+ /* 90 */ 0x0000c2ae, 0x0000e2d0, 0x00008ee1, 0x0000bfe2,
+ /* 94 */ 0x0000d3a6, 0x0000b5d7, 0x0000e2d2, 0x0000b5ea,
+ /* 98 */ 0x00008ee2, 0x0000c3ed, 0x0000b8fd, 0x00008ee3,
+ /* 9c */ 0x0000b8ae, 0x00008ee4, 0x0000c5d3, 0x0000b7cf,
+ /* a0 */ 0x0000e2d4, 0x00008ee5, 0x00008ee6, 0x00008ee7,
+ /* a4 */ 0x00008ee8, 0x0000e2d3, 0x0000b6c8, 0x0000d7f9,
+ /* a8 */ 0x00008ee9, 0x00008eea, 0x00008eeb, 0x00008eec,
+ /* ac */ 0x00008eed, 0x0000cda5, 0x00008eee, 0x00008eef,
+ /* b0 */ 0x00008ef0, 0x00008ef1, 0x00008ef2, 0x0000e2d8,
+ /* b4 */ 0x00008ef3, 0x0000e2d6, 0x0000cafc, 0x0000bfb5,
+ /* b8 */ 0x0000d3b9, 0x0000e2d5, 0x00008ef4, 0x00008ef5,
+ /* bc */ 0x00008ef6, 0x00008ef7, 0x0000e2d7, 0x00008ef8,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x03055 ***/
+
+ /* 80 */ 0x00008ef9, 0x00008efa, 0x00008efb, 0x00008efc,
+ /* 84 */ 0x00008efd, 0x00008efe, 0x00008f40, 0x00008f41,
+ /* 88 */ 0x00008f42, 0x0000c1ae, 0x0000c0c8, 0x00008f43,
+ /* 8c */ 0x00008f44, 0x00008f45, 0x00008f46, 0x00008f47,
+ /* 90 */ 0x00008f48, 0x0000e2db, 0x0000e2da, 0x0000c0aa,
+ /* 94 */ 0x00008f49, 0x00008f4a, 0x0000c1ce, 0x00008f4b,
+ /* 98 */ 0x00008f4c, 0x00008f4d, 0x00008f4e, 0x0000e2dc,
+ /* 9c */ 0x00008f4f, 0x00008f50, 0x00008f51, 0x00008f52,
+ /* a0 */ 0x00008f53, 0x00008f54, 0x00008f55, 0x00008f56,
+ /* a4 */ 0x00008f57, 0x00008f58, 0x00008f59, 0x00008f5a,
+ /* a8 */ 0x0000e2dd, 0x00008f5b, 0x0000e2de, 0x00008f5c,
+ /* ac */ 0x00008f5d, 0x00008f5e, 0x00008f5f, 0x00008f60,
+ /* b0 */ 0x00008f61, 0x00008f62, 0x00008f63, 0x00008f64,
+ /* b4 */ 0x0000dbc8, 0x00008f65, 0x0000d1d3, 0x0000cda2,
+ /* b8 */ 0x00008f66, 0x00008f67, 0x0000bda8, 0x00008f68,
+ /* bc */ 0x00008f69, 0x00008f6a, 0x0000dec3, 0x0000d8a5,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x03095 ***/
+
+ /* 80 */ 0x0000bfaa, 0x0000dbcd, 0x0000d2ec, 0x0000c6fa,
+ /* 84 */ 0x0000c5aa, 0x00008f6b, 0x00008f6c, 0x00008f6d,
+ /* 88 */ 0x0000dec4, 0x00008f6e, 0x0000b1d7, 0x0000dfae,
+ /* 8c */ 0x00008f6f, 0x00008f70, 0x00008f71, 0x0000cabd,
+ /* 90 */ 0x00008f72, 0x0000dfb1, 0x00008f73, 0x0000b9ad,
+ /* 94 */ 0x00008f74, 0x0000d2fd, 0x00008f75, 0x0000b8a5,
+ /* 98 */ 0x0000baeb, 0x00008f76, 0x00008f77, 0x0000b3da,
+ /* 9c */ 0x00008f78, 0x00008f79, 0x00008f7a, 0x0000b5dc,
+ /* a0 */ 0x0000d5c5, 0x00008f7b, 0x00008f7c, 0x00008f7d,
+ /* a4 */ 0x00008f7e, 0x0000c3d6, 0x0000cfd2, 0x0000bba1,
+ /* a8 */ 0x00008f80, 0x0000e5f3, 0x0000e5f2, 0x00008f81,
+ /* ac */ 0x00008f82, 0x0000e5f4, 0x00008f83, 0x0000cde4,
+ /* b0 */ 0x00008f84, 0x0000c8f5, 0x00008f85, 0x00008f86,
+ /* b4 */ 0x00008f87, 0x00008f88, 0x00008f89, 0x00008f8a,
+ /* b8 */ 0x00008f8b, 0x0000b5af, 0x0000c7bf, 0x00008f8c,
+ /* bc */ 0x0000e5f6, 0x00008f8d, 0x00008f8e, 0x00008f8f,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x030d5 ***/
+
+ /* 80 */ 0x0000ecb0, 0x00008f90, 0x00008f91, 0x00008f92,
+ /* 84 */ 0x00008f93, 0x00008f94, 0x00008f95, 0x00008f96,
+ /* 88 */ 0x00008f97, 0x00008f98, 0x00008f99, 0x00008f9a,
+ /* 8c */ 0x00008f9b, 0x00008f9c, 0x00008f9d, 0x00008f9e,
+ /* 90 */ 0x0000e5e6, 0x00008f9f, 0x0000b9e9, 0x0000b5b1,
+ /* 94 */ 0x00008fa0, 0x0000c2bc, 0x0000e5e8, 0x0000e5e7,
+ /* 98 */ 0x0000e5e9, 0x00008fa1, 0x00008fa2, 0x00008fa3,
+ /* 9c */ 0x00008fa4, 0x0000d2cd, 0x00008fa5, 0x00008fa6,
+ /* a0 */ 0x00008fa7, 0x0000e1ea, 0x0000d0ce, 0x00008fa8,
+ /* a4 */ 0x0000cdae, 0x00008fa9, 0x0000d1e5, 0x00008faa,
+ /* a8 */ 0x00008fab, 0x0000b2ca, 0x0000b1eb, 0x00008fac,
+ /* ac */ 0x0000b1f2, 0x0000c5ed, 0x00008fad, 0x00008fae,
+ /* b0 */ 0x0000d5c3, 0x0000d3b0, 0x00008faf, 0x0000e1dc,
+ /* b4 */ 0x00008fb0, 0x00008fb1, 0x00008fb2, 0x0000e1dd,
+ /* b8 */ 0x00008fb3, 0x0000d2db, 0x00008fb4, 0x0000b3b9,
+ /* bc */ 0x0000b1cb, 0x00008fb5, 0x00008fb6, 0x00008fb7,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x03115 ***/
+
+ /* 80 */ 0x0000cdf9, 0x0000d5f7, 0x0000e1de, 0x00008fb8,
+ /* 84 */ 0x0000beb6, 0x0000b4fd, 0x00008fb9, 0x0000e1df,
+ /* 88 */ 0x0000badc, 0x0000e1e0, 0x0000bbb2, 0x0000c2c9,
+ /* 8c */ 0x0000e1e1, 0x00008fba, 0x00008fbb, 0x00008fbc,
+ /* 90 */ 0x0000d0ec, 0x00008fbd, 0x0000cdbd, 0x00008fbe,
+ /* 94 */ 0x00008fbf, 0x0000e1e2, 0x00008fc0, 0x0000b5c3,
+ /* 98 */ 0x0000c5c7, 0x0000e1e3, 0x00008fc1, 0x00008fc2,
+ /* 9c */ 0x0000e1e4, 0x00008fc3, 0x00008fc4, 0x00008fc5,
+ /* a0 */ 0x00008fc6, 0x0000d3f9, 0x00008fc7, 0x00008fc8,
+ /* a4 */ 0x00008fc9, 0x00008fca, 0x00008fcb, 0x00008fcc,
+ /* a8 */ 0x0000e1e5, 0x00008fcd, 0x0000d1ad, 0x00008fce,
+ /* ac */ 0x00008fcf, 0x0000e1e6, 0x0000cea2, 0x00008fd0,
+ /* b0 */ 0x00008fd1, 0x00008fd2, 0x00008fd3, 0x00008fd4,
+ /* b4 */ 0x00008fd5, 0x0000e1e7, 0x00008fd6, 0x0000b5c2,
+ /* b8 */ 0x00008fd7, 0x00008fd8, 0x00008fd9, 0x00008fda,
+ /* bc */ 0x0000e1e8, 0x0000bbd5, 0x00008fdb, 0x00008fdc,
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x03155 ***/
+
+ /* 80 */ 0x00008fdd, 0x00008fde, 0x00008fdf, 0x0000d0c4,
+ /* 84 */ 0x0000e2e0, 0x0000b1d8, 0x0000d2e4, 0x00008fe0,
+ /* 88 */ 0x00008fe1, 0x0000e2e1, 0x00008fe2, 0x00008fe3,
+ /* 8c */ 0x0000bcc9, 0x0000c8cc, 0x00008fe4, 0x0000e2e3,
+ /* 90 */ 0x0000ecfe, 0x0000ecfd, 0x0000dfaf, 0x00008fe5,
+ /* 94 */ 0x00008fe6, 0x00008fe7, 0x0000e2e2, 0x0000d6be,
+ /* 98 */ 0x0000cdfc, 0x0000c3a6, 0x00008fe8, 0x00008fe9,
+ /* 9c */ 0x00008fea, 0x0000e3c3, 0x00008feb, 0x00008fec,
+ /* a0 */ 0x0000d6d2, 0x0000e2e7, 0x00008fed, 0x00008fee,
+ /* a4 */ 0x0000e2e8, 0x00008fef, 0x00008ff0, 0x0000d3c7,
+ /* a8 */ 0x00008ff1, 0x00008ff2, 0x0000e2ec, 0x0000bfec,
+ /* ac */ 0x00008ff3, 0x0000e2ed, 0x0000e2e5, 0x00008ff4,
+ /* b0 */ 0x00008ff5, 0x0000b3c0, 0x00008ff6, 0x00008ff7,
+ /* b4 */ 0x00008ff8, 0x0000c4ee, 0x00008ff9, 0x00008ffa,
+ /* b8 */ 0x0000e2ee, 0x00008ffb, 0x00008ffc, 0x0000d0c3,
+ /* bc */ 0x00008ffd, 0x0000baf6, 0x0000e2e9, 0x0000b7de,
+
+ /*** Three byte table, leaf: e680xx - offset 0x03195 ***/
+
+ /* 80 */ 0x0000bbb3, 0x0000ccac, 0x0000cbcb, 0x0000e2e4,
+ /* 84 */ 0x0000e2e6, 0x0000e2ea, 0x0000e2eb, 0x00008ffe,
+ /* 88 */ 0x00009040, 0x00009041, 0x0000e2f7, 0x00009042,
+ /* 8c */ 0x00009043, 0x0000e2f4, 0x0000d4f5, 0x0000e2f3,
+ /* 90 */ 0x00009044, 0x00009045, 0x0000c5ad, 0x00009046,
+ /* 94 */ 0x0000d5fa, 0x0000c5c2, 0x0000b2c0, 0x00009047,
+ /* 98 */ 0x00009048, 0x0000e2ef, 0x00009049, 0x0000e2f2,
+ /* 9c */ 0x0000c1af, 0x0000cbbc, 0x0000904a, 0x0000904b,
+ /* a0 */ 0x0000b5a1, 0x0000e2f9, 0x0000904c, 0x0000904d,
+ /* a4 */ 0x0000904e, 0x0000bcb1, 0x0000e2f1, 0x0000d0d4,
+ /* a8 */ 0x0000d4b9, 0x0000e2f5, 0x0000b9d6, 0x0000e2f6,
+ /* ac */ 0x0000904f, 0x00009050, 0x00009051, 0x0000c7d3,
+ /* b0 */ 0x00009052, 0x00009053, 0x00009054, 0x00009055,
+ /* b4 */ 0x00009056, 0x0000e2f0, 0x00009057, 0x00009058,
+ /* b8 */ 0x00009059, 0x0000905a, 0x0000905b, 0x0000d7dc,
+ /* bc */ 0x0000eda1, 0x0000905c, 0x0000905d, 0x0000e2f8,
+
+ /*** Three byte table, leaf: e681xx - offset 0x031d5 ***/
+
+ /* 80 */ 0x0000905e, 0x0000eda5, 0x0000e2fe, 0x0000cad1,
+ /* 84 */ 0x0000905f, 0x00009060, 0x00009061, 0x00009062,
+ /* 88 */ 0x00009063, 0x00009064, 0x00009065, 0x0000c1b5,
+ /* 8c */ 0x00009066, 0x0000bbd0, 0x00009067, 0x00009068,
+ /* 90 */ 0x0000bfd6, 0x00009069, 0x0000bae3, 0x0000906a,
+ /* 94 */ 0x0000906b, 0x0000cba1, 0x0000906c, 0x0000906d,
+ /* 98 */ 0x0000906e, 0x0000eda6, 0x0000eda3, 0x0000906f,
+ /* 9c */ 0x00009070, 0x0000eda2, 0x00009071, 0x00009072,
+ /* a0 */ 0x00009073, 0x00009074, 0x0000bbd6, 0x0000eda7,
+ /* a4 */ 0x0000d0f4, 0x00009075, 0x00009076, 0x0000eda4,
+ /* a8 */ 0x0000bade, 0x0000b6f7, 0x0000e3a1, 0x0000b6b2,
+ /* ac */ 0x0000ccf1, 0x0000b9a7, 0x00009077, 0x0000cfa2,
+ /* b0 */ 0x0000c7a1, 0x00009078, 0x00009079, 0x0000bfd2,
+ /* b4 */ 0x0000907a, 0x0000907b, 0x0000b6f1, 0x0000907c,
+ /* b8 */ 0x0000e2fa, 0x0000e2fb, 0x0000e2fd, 0x0000e2fc,
+ /* bc */ 0x0000c4d5, 0x0000e3a2, 0x0000907d, 0x0000d3c1,
+
+ /*** Three byte table, leaf: e682xx - offset 0x03215 ***/
+
+ /* 80 */ 0x0000907e, 0x00009080, 0x00009081, 0x0000e3a7,
+ /* 84 */ 0x0000c7c4, 0x00009082, 0x00009083, 0x00009084,
+ /* 88 */ 0x00009085, 0x0000cfa4, 0x00009086, 0x00009087,
+ /* 8c */ 0x0000e3a9, 0x0000bab7, 0x00009088, 0x00009089,
+ /* 90 */ 0x0000908a, 0x0000908b, 0x0000e3a8, 0x0000908c,
+ /* 94 */ 0x0000bbda, 0x0000908d, 0x0000e3a3, 0x0000908e,
+ /* 98 */ 0x0000908f, 0x00009090, 0x0000e3a4, 0x0000e3aa,
+ /* 9c */ 0x00009091, 0x0000e3a6, 0x00009092, 0x0000cef2,
+ /* a0 */ 0x0000d3c6, 0x00009093, 0x00009094, 0x0000bbbc,
+ /* a4 */ 0x00009095, 0x00009096, 0x0000d4c3, 0x00009097,
+ /* a8 */ 0x0000c4fa, 0x00009098, 0x00009099, 0x0000eda8,
+ /* ac */ 0x0000d0fc, 0x0000e3a5, 0x0000909a, 0x0000c3f5,
+ /* b0 */ 0x0000909b, 0x0000e3ad, 0x0000b1af, 0x0000909c,
+ /* b4 */ 0x0000e3b2, 0x0000909d, 0x0000909e, 0x0000909f,
+ /* b8 */ 0x0000bcc2, 0x000090a0, 0x000090a1, 0x0000e3ac,
+ /* bc */ 0x0000b5bf, 0x000090a2, 0x000090a3, 0x000090a4,
+
+ /*** Three byte table, leaf: e683xx - offset 0x03255 ***/
+
+ /* 80 */ 0x000090a5, 0x000090a6, 0x000090a7, 0x000090a8,
+ /* 84 */ 0x000090a9, 0x0000c7e9, 0x0000e3b0, 0x000090aa,
+ /* 88 */ 0x000090ab, 0x000090ac, 0x0000beaa, 0x0000cdef,
+ /* 8c */ 0x000090ad, 0x000090ae, 0x000090af, 0x000090b0,
+ /* 90 */ 0x000090b1, 0x0000bbf3, 0x000090b2, 0x000090b3,
+ /* 94 */ 0x000090b4, 0x0000cce8, 0x000090b5, 0x000090b6,
+ /* 98 */ 0x0000e3af, 0x000090b7, 0x0000e3b1, 0x000090b8,
+ /* 9c */ 0x0000cfa7, 0x0000e3ae, 0x000090b9, 0x0000cea9,
+ /* a0 */ 0x0000bbdd, 0x000090ba, 0x000090bb, 0x000090bc,
+ /* a4 */ 0x000090bd, 0x000090be, 0x0000b5eb, 0x0000bee5,
+ /* a8 */ 0x0000b2d2, 0x0000b3cd, 0x000090bf, 0x0000b1b9,
+ /* ac */ 0x0000e3ab, 0x0000b2d1, 0x0000b5ac, 0x0000b9df,
+ /* b0 */ 0x0000b6e8, 0x000090c0, 0x000090c1, 0x0000cfeb,
+ /* b4 */ 0x0000e3b7, 0x000090c2, 0x0000bbcc, 0x000090c3,
+ /* b8 */ 0x000090c4, 0x0000c8c7, 0x0000d0ca, 0x000090c5,
+ /* bc */ 0x000090c6, 0x000090c7, 0x000090c8, 0x000090c9,
+
+ /*** Three byte table, leaf: e684xx - offset 0x03295 ***/
+
+ /* 80 */ 0x0000e3b8, 0x0000b3ee, 0x000090ca, 0x000090cb,
+ /* 84 */ 0x000090cc, 0x000090cd, 0x0000eda9, 0x000090ce,
+ /* 88 */ 0x0000d3fa, 0x0000d3e4, 0x000090cf, 0x000090d0,
+ /* 8c */ 0x000090d1, 0x0000edaa, 0x0000e3b9, 0x0000d2e2,
+ /* 90 */ 0x000090d2, 0x000090d3, 0x000090d4, 0x000090d5,
+ /* 94 */ 0x000090d6, 0x0000e3b5, 0x000090d7, 0x000090d8,
+ /* 98 */ 0x000090d9, 0x000090da, 0x0000d3de, 0x000090db,
+ /* 9c */ 0x000090dc, 0x000090dd, 0x000090de, 0x0000b8d0,
+ /* a0 */ 0x0000e3b3, 0x000090df, 0x000090e0, 0x0000e3b6,
+ /* a4 */ 0x0000b7df, 0x000090e1, 0x0000e3b4, 0x0000c0a2,
+ /* a8 */ 0x000090e2, 0x000090e3, 0x000090e4, 0x0000e3ba,
+ /* ac */ 0x000090e5, 0x000090e6, 0x000090e7, 0x000090e8,
+ /* b0 */ 0x000090e9, 0x000090ea, 0x000090eb, 0x000090ec,
+ /* b4 */ 0x000090ed, 0x000090ee, 0x000090ef, 0x000090f0,
+ /* b8 */ 0x000090f1, 0x000090f2, 0x000090f3, 0x000090f4,
+ /* bc */ 0x000090f5, 0x000090f6, 0x000090f7, 0x0000d4b8,
+
+ /*** Three byte table, leaf: e685xx - offset 0x032d5 ***/
+
+ /* 80 */ 0x000090f8, 0x000090f9, 0x000090fa, 0x000090fb,
+ /* 84 */ 0x000090fc, 0x000090fd, 0x000090fe, 0x00009140,
+ /* 88 */ 0x0000b4c8, 0x00009141, 0x0000e3bb, 0x00009142,
+ /* 8c */ 0x0000bbc5, 0x00009143, 0x0000c9f7, 0x00009144,
+ /* 90 */ 0x00009145, 0x0000c9e5, 0x00009146, 0x00009147,
+ /* 94 */ 0x00009148, 0x0000c4bd, 0x00009149, 0x0000914a,
+ /* 98 */ 0x0000914b, 0x0000914c, 0x0000914d, 0x0000914e,
+ /* 9c */ 0x0000914f, 0x0000edab, 0x00009150, 0x00009151,
+ /* a0 */ 0x00009152, 0x00009153, 0x0000c2fd, 0x00009154,
+ /* a4 */ 0x00009155, 0x00009156, 0x00009157, 0x0000bbdb,
+ /* a8 */ 0x0000bfae, 0x00009158, 0x00009159, 0x0000915a,
+ /* ac */ 0x0000915b, 0x0000915c, 0x0000915d, 0x0000915e,
+ /* b0 */ 0x0000cebf, 0x0000915f, 0x00009160, 0x00009161,
+ /* b4 */ 0x00009162, 0x0000e3bc, 0x00009163, 0x0000bfb6,
+ /* b8 */ 0x00009164, 0x00009165, 0x00009166, 0x00009167,
+ /* bc */ 0x00009168, 0x00009169, 0x0000916a, 0x0000916b,
+
+ /*** Three byte table, leaf: e686xx - offset 0x03315 ***/
+
+ /* 80 */ 0x0000916c, 0x0000916d, 0x0000916e, 0x0000916f,
+ /* 84 */ 0x00009170, 0x00009171, 0x00009172, 0x00009173,
+ /* 88 */ 0x00009174, 0x00009175, 0x00009176, 0x0000b1ef,
+ /* 8c */ 0x00009177, 0x00009178, 0x0000d4f7, 0x00009179,
+ /* 90 */ 0x0000917a, 0x0000917b, 0x0000917c, 0x0000917d,
+ /* 94 */ 0x0000e3be, 0x0000917e, 0x00009180, 0x00009181,
+ /* 98 */ 0x00009182, 0x00009183, 0x00009184, 0x00009185,
+ /* 9c */ 0x00009186, 0x0000edad, 0x00009187, 0x00009188,
+ /* a0 */ 0x00009189, 0x0000918a, 0x0000918b, 0x0000918c,
+ /* a4 */ 0x0000918d, 0x0000918e, 0x0000918f, 0x0000e3bf,
+ /* a8 */ 0x0000baa9, 0x0000edac, 0x00009190, 0x00009191,
+ /* ac */ 0x0000e3bd, 0x00009192, 0x00009193, 0x00009194,
+ /* b0 */ 0x00009195, 0x00009196, 0x00009197, 0x00009198,
+ /* b4 */ 0x00009199, 0x0000919a, 0x0000919b, 0x0000e3c0,
+ /* b8 */ 0x0000919c, 0x0000919d, 0x0000919e, 0x0000919f,
+ /* bc */ 0x000091a0, 0x000091a1, 0x0000bab6, 0x000091a2,
+
+ /*** Three byte table, leaf: e687xx - offset 0x03355 ***/
+
+ /* 80 */ 0x000091a3, 0x000091a4, 0x0000b6ae, 0x000091a5,
+ /* 84 */ 0x000091a6, 0x000091a7, 0x000091a8, 0x000091a9,
+ /* 88 */ 0x0000d0b8, 0x000091aa, 0x0000b0c3, 0x0000edae,
+ /* 8c */ 0x000091ab, 0x000091ac, 0x000091ad, 0x000091ae,
+ /* 90 */ 0x000091af, 0x0000edaf, 0x0000c0c1, 0x000091b0,
+ /* 94 */ 0x0000e3c1, 0x000091b1, 0x000091b2, 0x000091b3,
+ /* 98 */ 0x000091b4, 0x000091b5, 0x000091b6, 0x000091b7,
+ /* 9c */ 0x000091b8, 0x000091b9, 0x000091ba, 0x000091bb,
+ /* a0 */ 0x000091bc, 0x000091bd, 0x000091be, 0x000091bf,
+ /* a4 */ 0x000091c0, 0x000091c1, 0x0000c5b3, 0x000091c2,
+ /* a8 */ 0x000091c3, 0x000091c4, 0x000091c5, 0x000091c6,
+ /* ac */ 0x000091c7, 0x000091c8, 0x000091c9, 0x000091ca,
+ /* b0 */ 0x000091cb, 0x000091cc, 0x000091cd, 0x000091ce,
+ /* b4 */ 0x000091cf, 0x0000e3c2, 0x000091d0, 0x000091d1,
+ /* b8 */ 0x000091d2, 0x000091d3, 0x000091d4, 0x000091d5,
+ /* bc */ 0x000091d6, 0x000091d7, 0x000091d8, 0x0000dcb2,
+
+ /*** Three byte table, leaf: e688xx - offset 0x03395 ***/
+
+ /* 80 */ 0x000091d9, 0x000091da, 0x000091db, 0x000091dc,
+ /* 84 */ 0x000091dd, 0x000091de, 0x0000edb0, 0x000091df,
+ /* 88 */ 0x0000b8ea, 0x000091e0, 0x0000ceec, 0x0000eaa7,
+ /* 8c */ 0x0000d0e7, 0x0000caf9, 0x0000c8d6, 0x0000cfb7,
+ /* 90 */ 0x0000b3c9, 0x0000ced2, 0x0000bde4, 0x000091e1,
+ /* 94 */ 0x000091e2, 0x0000e3de, 0x0000bbf2, 0x0000eaa8,
+ /* 98 */ 0x0000d5bd, 0x000091e3, 0x0000c6dd, 0x0000eaa9,
+ /* 9c */ 0x000091e4, 0x000091e5, 0x000091e6, 0x0000eaaa,
+ /* a0 */ 0x000091e7, 0x0000eaac, 0x0000eaab, 0x000091e8,
+ /* a4 */ 0x0000eaae, 0x0000eaad, 0x000091e9, 0x000091ea,
+ /* a8 */ 0x000091eb, 0x000091ec, 0x0000bdd8, 0x000091ed,
+ /* ac */ 0x0000eaaf, 0x000091ee, 0x0000c2be, 0x000091ef,
+ /* b0 */ 0x000091f0, 0x000091f1, 0x000091f2, 0x0000b4c1,
+ /* b4 */ 0x0000b4f7, 0x000091f3, 0x000091f4, 0x0000bba7,
+ /* b8 */ 0x000091f5, 0x000091f6, 0x000091f7, 0x000091f8,
+ /* bc */ 0x000091f9, 0x0000ece6, 0x0000ece5, 0x0000b7bf,
+
+ /*** Three byte table, leaf: e689xx - offset 0x033d5 ***/
+
+ /* 80 */ 0x0000cbf9, 0x0000b1e2, 0x000091fa, 0x0000ece7,
+ /* 84 */ 0x000091fb, 0x000091fc, 0x000091fd, 0x0000c9c8,
+ /* 88 */ 0x0000ece8, 0x0000ece9, 0x000091fe, 0x0000cad6,
+ /* 8c */ 0x0000ded0, 0x0000b2c5, 0x0000d4fa, 0x00009240,
+ /* 90 */ 0x00009241, 0x0000c6cb, 0x0000b0c7, 0x0000b4f2,
+ /* 94 */ 0x0000c8d3, 0x00009242, 0x00009243, 0x00009244,
+ /* 98 */ 0x0000cdd0, 0x00009245, 0x00009246, 0x0000bfb8,
+ /* 9c */ 0x00009247, 0x00009248, 0x00009249, 0x0000924a,
+ /* a0 */ 0x0000924b, 0x0000924c, 0x0000924d, 0x0000bfdb,
+ /* a4 */ 0x0000924e, 0x0000924f, 0x0000c7a4, 0x0000d6b4,
+ /* a8 */ 0x00009250, 0x0000c0a9, 0x0000ded1, 0x0000c9a8,
+ /* ac */ 0x0000d1ef, 0x0000c5a4, 0x0000b0e7, 0x0000b3b6,
+ /* b0 */ 0x0000c8c5, 0x00009251, 0x00009252, 0x0000b0e2,
+ /* b4 */ 0x00009253, 0x00009254, 0x0000b7f6, 0x00009255,
+ /* b8 */ 0x00009256, 0x0000c5fa, 0x00009257, 0x00009258,
+ /* bc */ 0x0000b6f3, 0x00009259, 0x0000d5d2, 0x0000b3d0,
+
+ /*** Three byte table, leaf: e68axx - offset 0x03415 ***/
+
+ /* 80 */ 0x0000bcbc, 0x0000925a, 0x0000925b, 0x0000925c,
+ /* 84 */ 0x0000b3ad, 0x0000925d, 0x0000925e, 0x0000925f,
+ /* 88 */ 0x00009260, 0x0000bef1, 0x0000b0d1, 0x00009261,
+ /* 8c */ 0x00009262, 0x00009263, 0x00009264, 0x00009265,
+ /* 90 */ 0x00009266, 0x0000d2d6, 0x0000cae3, 0x0000d7a5,
+ /* 94 */ 0x00009267, 0x0000cdb6, 0x0000b6b6, 0x0000bfb9,
+ /* 98 */ 0x0000d5db, 0x00009268, 0x0000b8a7, 0x0000c5d7,
+ /* 9c */ 0x00009269, 0x0000926a, 0x0000926b, 0x0000ded2,
+ /* a0 */ 0x0000bfd9, 0x0000c2d5, 0x0000c7c0, 0x0000926c,
+ /* a4 */ 0x0000bba4, 0x0000b1a8, 0x0000926d, 0x0000926e,
+ /* a8 */ 0x0000c5ea, 0x0000926f, 0x00009270, 0x0000c5fb,
+ /* ac */ 0x0000cca7, 0x00009271, 0x00009272, 0x00009273,
+ /* b0 */ 0x00009274, 0x0000b1a7, 0x00009275, 0x00009276,
+ /* b4 */ 0x00009277, 0x0000b5d6, 0x00009278, 0x00009279,
+ /* b8 */ 0x0000927a, 0x0000c4a8, 0x0000927b, 0x0000ded3,
+ /* bc */ 0x0000d1ba, 0x0000b3e9, 0x0000927c, 0x0000c3f2,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x03455 ***/
+
+ /* 80 */ 0x0000927d, 0x0000927e, 0x0000b7f7, 0x00009280,
+ /* 84 */ 0x0000d6f4, 0x0000b5a3, 0x0000b2f0, 0x0000c4b4,
+ /* 88 */ 0x0000c4e9, 0x0000c0ad, 0x0000ded4, 0x00009281,
+ /* 8c */ 0x0000b0e8, 0x0000c5c4, 0x0000c1e0, 0x00009282,
+ /* 90 */ 0x0000b9d5, 0x00009283, 0x0000bedc, 0x0000cdd8,
+ /* 94 */ 0x0000b0ce, 0x00009284, 0x0000cdcf, 0x0000ded6,
+ /* 98 */ 0x0000bed0, 0x0000d7be, 0x0000ded5, 0x0000d5d0,
+ /* 9c */ 0x0000b0dd, 0x00009285, 0x00009286, 0x0000c4e2,
+ /* a0 */ 0x00009287, 0x00009288, 0x0000c2a3, 0x0000bcf0,
+ /* a4 */ 0x00009289, 0x0000d3b5, 0x0000c0b9, 0x0000c5a1,
+ /* a8 */ 0x0000b2a6, 0x0000d4f1, 0x0000928a, 0x0000928b,
+ /* ac */ 0x0000c0a8, 0x0000cac3, 0x0000ded7, 0x0000d5fc,
+ /* b0 */ 0x0000928c, 0x0000b9b0, 0x0000928d, 0x0000c8ad,
+ /* b4 */ 0x0000cba9, 0x0000928e, 0x0000ded9, 0x0000bfbd,
+ /* b8 */ 0x0000928f, 0x00009290, 0x00009291, 0x00009292,
+ /* bc */ 0x0000c6b4, 0x0000d7a7, 0x0000cab0, 0x0000c4c3,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x03495 ***/
+
+ /* 80 */ 0x00009293, 0x0000b3d6, 0x0000b9d2, 0x00009294,
+ /* 84 */ 0x00009295, 0x00009296, 0x00009297, 0x0000d6b8,
+ /* 88 */ 0x0000eafc, 0x0000b0b4, 0x00009298, 0x00009299,
+ /* 8c */ 0x0000929a, 0x0000929b, 0x0000bfe6, 0x0000929c,
+ /* 90 */ 0x0000929d, 0x0000ccf4, 0x0000929e, 0x0000929f,
+ /* 94 */ 0x000092a0, 0x000092a1, 0x0000cdda, 0x000092a2,
+ /* 98 */ 0x000092a3, 0x000092a4, 0x0000d6bf, 0x0000c2ce,
+ /* 9c */ 0x000092a5, 0x0000cece, 0x0000cca2, 0x0000d0ae,
+ /* a0 */ 0x0000c4d3, 0x0000b5b2, 0x0000ded8, 0x0000d5f5,
+ /* a4 */ 0x0000bcb7, 0x0000bbd3, 0x000092a6, 0x000092a7,
+ /* a8 */ 0x0000b0a4, 0x000092a8, 0x0000c5b2, 0x0000b4ec,
+ /* ac */ 0x000092a9, 0x000092aa, 0x000092ab, 0x0000d5f1,
+ /* b0 */ 0x000092ac, 0x000092ad, 0x0000eafd, 0x000092ae,
+ /* b4 */ 0x000092af, 0x000092b0, 0x000092b1, 0x000092b2,
+ /* b8 */ 0x000092b3, 0x0000deda, 0x0000cda6, 0x000092b4,
+ /* bc */ 0x000092b5, 0x0000cdec, 0x000092b6, 0x000092b7,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x034d5 ***/
+
+ /* 80 */ 0x000092b8, 0x000092b9, 0x0000cee6, 0x0000dedc,
+ /* 84 */ 0x000092ba, 0x0000cdb1, 0x0000c0a6, 0x000092bb,
+ /* 88 */ 0x000092bc, 0x0000d7bd, 0x000092bd, 0x0000dedb,
+ /* 8c */ 0x0000b0c6, 0x0000bab4, 0x0000c9d3, 0x0000c4f3,
+ /* 90 */ 0x0000bee8, 0x000092be, 0x000092bf, 0x000092c0,
+ /* 94 */ 0x000092c1, 0x0000b2b6, 0x000092c2, 0x000092c3,
+ /* 98 */ 0x000092c4, 0x000092c5, 0x000092c6, 0x000092c7,
+ /* 9c */ 0x000092c8, 0x000092c9, 0x0000c0cc, 0x0000cbf0,
+ /* a0 */ 0x000092ca, 0x0000bcf1, 0x0000bbbb, 0x0000b5b7,
+ /* a4 */ 0x000092cb, 0x000092cc, 0x000092cd, 0x0000c5f5,
+ /* a8 */ 0x000092ce, 0x0000dee6, 0x000092cf, 0x000092d0,
+ /* ac */ 0x000092d1, 0x0000dee3, 0x0000bedd, 0x000092d2,
+ /* b0 */ 0x000092d3, 0x0000dedf, 0x000092d4, 0x000092d5,
+ /* b4 */ 0x000092d6, 0x000092d7, 0x0000b4b7, 0x0000bddd,
+ /* b8 */ 0x000092d8, 0x000092d9, 0x0000dee0, 0x0000c4ed,
+ /* bc */ 0x000092da, 0x000092db, 0x000092dc, 0x000092dd,
+
+ /*** Three byte table, leaf: e68exx - offset 0x03515 ***/
+
+ /* 80 */ 0x0000cfc6, 0x000092de, 0x0000b5e0, 0x000092df,
+ /* 84 */ 0x000092e0, 0x000092e1, 0x000092e2, 0x0000b6de,
+ /* 88 */ 0x0000cada, 0x0000b5f4, 0x0000dee5, 0x000092e3,
+ /* 8c */ 0x0000d5c6, 0x000092e4, 0x0000dee1, 0x0000cccd,
+ /* 90 */ 0x0000c6fe, 0x000092e5, 0x0000c5c5, 0x000092e6,
+ /* 94 */ 0x000092e7, 0x000092e8, 0x0000d2b4, 0x000092e9,
+ /* 98 */ 0x0000bef2, 0x000092ea, 0x000092eb, 0x000092ec,
+ /* 9c */ 0x000092ed, 0x000092ee, 0x000092ef, 0x000092f0,
+ /* a0 */ 0x0000c2d3, 0x000092f1, 0x0000ccbd, 0x0000b3b8,
+ /* a4 */ 0x000092f2, 0x0000bdd3, 0x000092f3, 0x0000bfd8,
+ /* a8 */ 0x0000cdc6, 0x0000d1da, 0x0000b4eb, 0x000092f4,
+ /* ac */ 0x0000dee4, 0x0000dedd, 0x0000dee7, 0x000092f5,
+ /* b0 */ 0x0000eafe, 0x000092f6, 0x000092f7, 0x0000c2b0,
+ /* b4 */ 0x0000dee2, 0x000092f8, 0x000092f9, 0x0000d6c0,
+ /* b8 */ 0x0000b5a7, 0x000092fa, 0x0000b2f4, 0x000092fb,
+ /* bc */ 0x0000dee8, 0x000092fc, 0x0000def2, 0x000092fd,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x03555 ***/
+
+ /* 80 */ 0x000092fe, 0x00009340, 0x00009341, 0x00009342,
+ /* 84 */ 0x0000deed, 0x00009343, 0x0000def1, 0x00009344,
+ /* 88 */ 0x00009345, 0x0000c8e0, 0x00009346, 0x00009347,
+ /* 8c */ 0x00009348, 0x0000d7e1, 0x0000deef, 0x0000c3e8,
+ /* 90 */ 0x0000cce1, 0x00009349, 0x0000b2e5, 0x0000934a,
+ /* 94 */ 0x0000934b, 0x0000934c, 0x0000d2be, 0x0000934d,
+ /* 98 */ 0x0000934e, 0x0000934f, 0x00009350, 0x00009351,
+ /* 9c */ 0x00009352, 0x00009353, 0x0000deee, 0x00009354,
+ /* a0 */ 0x0000deeb, 0x0000ced5, 0x00009355, 0x0000b4a7,
+ /* a4 */ 0x00009356, 0x00009357, 0x00009358, 0x00009359,
+ /* a8 */ 0x0000935a, 0x0000bfab, 0x0000bebe, 0x0000935b,
+ /* ac */ 0x0000935c, 0x0000bdd2, 0x0000935d, 0x0000935e,
+ /* b0 */ 0x0000935f, 0x00009360, 0x0000dee9, 0x00009361,
+ /* b4 */ 0x0000d4ae, 0x00009362, 0x0000dede, 0x00009363,
+ /* b8 */ 0x0000deea, 0x00009364, 0x00009365, 0x00009366,
+ /* bc */ 0x00009367, 0x0000c0bf, 0x00009368, 0x0000deec,
+
+ /*** Three byte table, leaf: e690xx - offset 0x03595 ***/
+
+ /* 80 */ 0x0000b2f3, 0x0000b8e9, 0x0000c2a7, 0x00009369,
+ /* 84 */ 0x0000936a, 0x0000bdc1, 0x0000936b, 0x0000936c,
+ /* 88 */ 0x0000936d, 0x0000936e, 0x0000936f, 0x0000def5,
+ /* 8c */ 0x0000def8, 0x00009370, 0x00009371, 0x0000b2ab,
+ /* 90 */ 0x0000b4a4, 0x00009372, 0x00009373, 0x0000b4ea,
+ /* 94 */ 0x0000c9a6, 0x00009374, 0x00009375, 0x00009376,
+ /* 98 */ 0x00009377, 0x00009378, 0x00009379, 0x0000def6,
+ /* 9c */ 0x0000cbd1, 0x0000937a, 0x0000b8e3, 0x0000937b,
+ /* a0 */ 0x0000def7, 0x0000defa, 0x0000937c, 0x0000937d,
+ /* a4 */ 0x0000937e, 0x00009380, 0x0000def9, 0x00009381,
+ /* a8 */ 0x00009382, 0x00009383, 0x0000ccc2, 0x00009384,
+ /* ac */ 0x0000b0e1, 0x0000b4ee, 0x00009385, 0x00009386,
+ /* b0 */ 0x00009387, 0x00009388, 0x00009389, 0x0000938a,
+ /* b4 */ 0x0000e5ba, 0x0000938b, 0x0000938c, 0x0000938d,
+ /* b8 */ 0x0000938e, 0x0000938f, 0x0000d0af, 0x00009390,
+ /* bc */ 0x00009391, 0x0000b2eb, 0x00009392, 0x0000eba1,
+
+ /*** Three byte table, leaf: e691xx - offset 0x035d5 ***/
+
+ /* 80 */ 0x00009393, 0x0000def4, 0x00009394, 0x00009395,
+ /* 84 */ 0x0000c9e3, 0x0000def3, 0x0000b0da, 0x0000d2a1,
+ /* 88 */ 0x0000b1f7, 0x00009396, 0x0000ccaf, 0x00009397,
+ /* 8c */ 0x00009398, 0x00009399, 0x0000939a, 0x0000939b,
+ /* 90 */ 0x0000939c, 0x0000939d, 0x0000def0, 0x0000939e,
+ /* 94 */ 0x0000cba4, 0x0000939f, 0x000093a0, 0x000093a1,
+ /* 98 */ 0x0000d5aa, 0x000093a2, 0x000093a3, 0x000093a4,
+ /* 9c */ 0x000093a5, 0x000093a6, 0x0000defb, 0x000093a7,
+ /* a0 */ 0x000093a8, 0x000093a9, 0x000093aa, 0x000093ab,
+ /* a4 */ 0x000093ac, 0x000093ad, 0x000093ae, 0x0000b4dd,
+ /* a8 */ 0x000093af, 0x0000c4a6, 0x000093b0, 0x000093b1,
+ /* ac */ 0x000093b2, 0x0000defd, 0x000093b3, 0x000093b4,
+ /* b0 */ 0x000093b5, 0x000093b6, 0x000093b7, 0x000093b8,
+ /* b4 */ 0x000093b9, 0x000093ba, 0x000093bb, 0x000093bc,
+ /* b8 */ 0x0000c3fe, 0x0000c4a1, 0x0000dfa1, 0x000093bd,
+ /* bc */ 0x000093be, 0x000093bf, 0x000093c0, 0x000093c1,
+
+ /*** Three byte table, leaf: e692xx - offset 0x03615 ***/
+
+ /* 80 */ 0x000093c2, 0x000093c3, 0x0000c1cc, 0x000093c4,
+ /* 84 */ 0x0000defc, 0x0000beef, 0x000093c5, 0x0000c6b2,
+ /* 88 */ 0x000093c6, 0x000093c7, 0x000093c8, 0x000093c9,
+ /* 8c */ 0x000093ca, 0x000093cb, 0x000093cc, 0x000093cd,
+ /* 90 */ 0x000093ce, 0x0000b3c5, 0x0000c8f6, 0x000093cf,
+ /* 94 */ 0x000093d0, 0x0000cbba, 0x0000defe, 0x000093d1,
+ /* 98 */ 0x000093d2, 0x0000dfa4, 0x000093d3, 0x000093d4,
+ /* 9c */ 0x000093d5, 0x000093d6, 0x0000d7b2, 0x000093d7,
+ /* a0 */ 0x000093d8, 0x000093d9, 0x000093da, 0x000093db,
+ /* a4 */ 0x0000b3b7, 0x000093dc, 0x000093dd, 0x000093de,
+ /* a8 */ 0x000093df, 0x0000c1c3, 0x000093e0, 0x000093e1,
+ /* ac */ 0x0000c7cb, 0x0000b2a5, 0x0000b4e9, 0x000093e2,
+ /* b0 */ 0x0000d7ab, 0x000093e3, 0x000093e4, 0x000093e5,
+ /* b4 */ 0x000093e6, 0x0000c4ec, 0x000093e7, 0x0000dfa2,
+ /* b8 */ 0x0000dfa3, 0x000093e8, 0x0000dfa5, 0x000093e9,
+ /* bc */ 0x0000bab3, 0x000093ea, 0x000093eb, 0x000093ec,
+
+ /*** Three byte table, leaf: e693xx - offset 0x03655 ***/
+
+ /* 80 */ 0x0000dfa6, 0x000093ed, 0x0000c0de, 0x000093ee,
+ /* 84 */ 0x000093ef, 0x0000c9c3, 0x000093f0, 0x000093f1,
+ /* 88 */ 0x000093f2, 0x000093f3, 0x000093f4, 0x000093f5,
+ /* 8c */ 0x000093f6, 0x0000b2d9, 0x0000c7e6, 0x000093f7,
+ /* 90 */ 0x0000dfa7, 0x000093f8, 0x0000c7dc, 0x000093f9,
+ /* 94 */ 0x000093fa, 0x000093fb, 0x000093fc, 0x0000dfa8,
+ /* 98 */ 0x0000eba2, 0x000093fd, 0x000093fe, 0x00009440,
+ /* 9c */ 0x00009441, 0x00009442, 0x0000cbd3, 0x00009443,
+ /* a0 */ 0x00009444, 0x00009445, 0x0000dfaa, 0x00009446,
+ /* a4 */ 0x0000dfa9, 0x00009447, 0x0000b2c1, 0x00009448,
+ /* a8 */ 0x00009449, 0x0000944a, 0x0000944b, 0x0000944c,
+ /* ac */ 0x0000944d, 0x0000944e, 0x0000944f, 0x00009450,
+ /* b0 */ 0x00009451, 0x00009452, 0x00009453, 0x00009454,
+ /* b4 */ 0x00009455, 0x00009456, 0x00009457, 0x00009458,
+ /* b8 */ 0x00009459, 0x0000945a, 0x0000945b, 0x0000945c,
+ /* bc */ 0x0000945d, 0x0000945e, 0x0000945f, 0x00009460,
+
+ /*** Three byte table, leaf: e694xx - offset 0x03695 ***/
+
+ /* 80 */ 0x0000c5ca, 0x00009461, 0x00009462, 0x00009463,
+ /* 84 */ 0x00009464, 0x00009465, 0x00009466, 0x00009467,
+ /* 88 */ 0x00009468, 0x0000dfab, 0x00009469, 0x0000946a,
+ /* 8c */ 0x0000946b, 0x0000946c, 0x0000946d, 0x0000946e,
+ /* 90 */ 0x0000946f, 0x00009470, 0x0000d4dc, 0x00009471,
+ /* 94 */ 0x00009472, 0x00009473, 0x00009474, 0x00009475,
+ /* 98 */ 0x0000c8c1, 0x00009476, 0x00009477, 0x00009478,
+ /* 9c */ 0x00009479, 0x0000947a, 0x0000947b, 0x0000947c,
+ /* a0 */ 0x0000947d, 0x0000947e, 0x00009480, 0x00009481,
+ /* a4 */ 0x00009482, 0x0000dfac, 0x00009483, 0x00009484,
+ /* a8 */ 0x00009485, 0x00009486, 0x00009487, 0x0000bef0,
+ /* ac */ 0x00009488, 0x00009489, 0x0000dfad, 0x0000d6a7,
+ /* b0 */ 0x0000948a, 0x0000948b, 0x0000948c, 0x0000948d,
+ /* b4 */ 0x0000eab7, 0x0000ebb6, 0x0000cad5, 0x0000948e,
+ /* b8 */ 0x0000d8fc, 0x0000b8c4, 0x0000948f, 0x0000b9a5,
+ /* bc */ 0x00009490, 0x00009491, 0x0000b7c5, 0x0000d5fe,
+
+ /*** Three byte table, leaf: e695xx - offset 0x036d5 ***/
+
+ /* 80 */ 0x00009492, 0x00009493, 0x00009494, 0x00009495,
+ /* 84 */ 0x00009496, 0x0000b9ca, 0x00009497, 0x00009498,
+ /* 88 */ 0x0000d0a7, 0x0000f4cd, 0x00009499, 0x0000949a,
+ /* 8c */ 0x0000b5d0, 0x0000949b, 0x0000949c, 0x0000c3f4,
+ /* 90 */ 0x0000949d, 0x0000bec8, 0x0000949e, 0x0000949f,
+ /* 94 */ 0x000094a0, 0x0000ebb7, 0x0000b0bd, 0x000094a1,
+ /* 98 */ 0x000094a2, 0x0000bdcc, 0x000094a3, 0x0000c1b2,
+ /* 9c */ 0x000094a4, 0x0000b1d6, 0x0000b3a8, 0x000094a5,
+ /* a0 */ 0x000094a6, 0x000094a7, 0x0000b8d2, 0x0000c9a2,
+ /* a4 */ 0x000094a8, 0x000094a9, 0x0000b6d8, 0x000094aa,
+ /* a8 */ 0x000094ab, 0x000094ac, 0x000094ad, 0x0000ebb8,
+ /* ac */ 0x0000beb4, 0x000094ae, 0x000094af, 0x000094b0,
+ /* b0 */ 0x0000cafd, 0x000094b1, 0x0000c7c3, 0x000094b2,
+ /* b4 */ 0x0000d5fb, 0x000094b3, 0x000094b4, 0x0000b7f3,
+ /* b8 */ 0x000094b5, 0x000094b6, 0x000094b7, 0x000094b8,
+ /* bc */ 0x000094b9, 0x000094ba, 0x000094bb, 0x000094bc,
+
+ /*** Three byte table, leaf: e696xx - offset 0x03715 ***/
+
+ /* 80 */ 0x000094bd, 0x000094be, 0x000094bf, 0x000094c0,
+ /* 84 */ 0x000094c1, 0x000094c2, 0x000094c3, 0x0000cec4,
+ /* 88 */ 0x000094c4, 0x000094c5, 0x000094c6, 0x0000d5ab,
+ /* 8c */ 0x0000b1f3, 0x000094c7, 0x000094c8, 0x000094c9,
+ /* 90 */ 0x0000ecb3, 0x0000b0df, 0x000094ca, 0x0000ecb5,
+ /* 94 */ 0x000094cb, 0x000094cc, 0x000094cd, 0x0000b6b7,
+ /* 98 */ 0x000094ce, 0x0000c1cf, 0x000094cf, 0x0000f5fa,
+ /* 9c */ 0x0000d0b1, 0x000094d0, 0x000094d1, 0x0000d5e5,
+ /* a0 */ 0x000094d2, 0x0000ced3, 0x000094d3, 0x000094d4,
+ /* a4 */ 0x0000bdef, 0x0000b3e2, 0x000094d5, 0x0000b8ab,
+ /* a8 */ 0x000094d6, 0x0000d5b6, 0x000094d7, 0x0000edbd,
+ /* ac */ 0x000094d8, 0x0000b6cf, 0x000094d9, 0x0000cbb9,
+ /* b0 */ 0x0000d0c2, 0x000094da, 0x000094db, 0x000094dc,
+ /* b4 */ 0x000094dd, 0x000094de, 0x000094df, 0x000094e0,
+ /* b8 */ 0x000094e1, 0x0000b7bd, 0x000094e2, 0x000094e3,
+ /* bc */ 0x0000ecb6, 0x0000caa9, 0x000094e4, 0x000094e5,
+
+ /*** Three byte table, leaf: e697xx - offset 0x03755 ***/
+
+ /* 80 */ 0x000094e6, 0x0000c5d4, 0x000094e7, 0x0000ecb9,
+ /* 84 */ 0x0000ecb8, 0x0000c2c3, 0x0000ecb7, 0x000094e8,
+ /* 88 */ 0x000094e9, 0x000094ea, 0x000094eb, 0x0000d0fd,
+ /* 8c */ 0x0000ecba, 0x000094ec, 0x0000ecbb, 0x0000d7e5,
+ /* 90 */ 0x000094ed, 0x000094ee, 0x0000ecbc, 0x000094ef,
+ /* 94 */ 0x000094f0, 0x000094f1, 0x0000ecbd, 0x0000c6ec,
+ /* 98 */ 0x000094f2, 0x000094f3, 0x000094f4, 0x000094f5,
+ /* 9c */ 0x000094f6, 0x000094f7, 0x000094f8, 0x000094f9,
+ /* a0 */ 0x0000cede, 0x000094fa, 0x0000bcc8, 0x000094fb,
+ /* a4 */ 0x000094fc, 0x0000c8d5, 0x0000b5a9, 0x0000bec9,
+ /* a8 */ 0x0000d6bc, 0x0000d4e7, 0x000094fd, 0x000094fe,
+ /* ac */ 0x0000d1ae, 0x0000d0f1, 0x0000eab8, 0x0000eab9,
+ /* b0 */ 0x0000eaba, 0x0000bab5, 0x00009540, 0x00009541,
+ /* b4 */ 0x00009542, 0x00009543, 0x0000cab1, 0x0000bff5,
+ /* b8 */ 0x00009544, 0x00009545, 0x0000cdfa, 0x00009546,
+ /* bc */ 0x00009547, 0x00009548, 0x00009549, 0x0000954a,
+
+ /*** Three byte table, leaf: e698xx - offset 0x03795 ***/
+
+ /* 80 */ 0x0000eac0, 0x0000954b, 0x0000b0ba, 0x0000eabe,
+ /* 84 */ 0x0000954c, 0x0000954d, 0x0000c0a5, 0x0000954e,
+ /* 88 */ 0x0000954f, 0x00009550, 0x0000eabb, 0x00009551,
+ /* 8c */ 0x0000b2fd, 0x00009552, 0x0000c3f7, 0x0000bbe8,
+ /* 90 */ 0x00009553, 0x00009554, 0x00009555, 0x0000d2d7,
+ /* 94 */ 0x0000cef4, 0x0000eabf, 0x00009556, 0x00009557,
+ /* 98 */ 0x00009558, 0x0000eabc, 0x00009559, 0x0000955a,
+ /* 9c */ 0x0000955b, 0x0000eac3, 0x0000955c, 0x0000d0c7,
+ /* a0 */ 0x0000d3b3, 0x0000955d, 0x0000955e, 0x0000955f,
+ /* a4 */ 0x00009560, 0x0000b4ba, 0x00009561, 0x0000c3c1,
+ /* a8 */ 0x0000d7f2, 0x00009562, 0x00009563, 0x00009564,
+ /* ac */ 0x00009565, 0x0000d5d1, 0x00009566, 0x0000cac7,
+ /* b0 */ 0x00009567, 0x0000eac5, 0x00009568, 0x00009569,
+ /* b4 */ 0x0000eac4, 0x0000eac7, 0x0000eac6, 0x0000956a,
+ /* b8 */ 0x0000956b, 0x0000956c, 0x0000956d, 0x0000956e,
+ /* bc */ 0x0000d6e7, 0x0000956f, 0x0000cfd4, 0x00009570,
+
+ /*** Three byte table, leaf: e699xx - offset 0x037d5 ***/
+
+ /* 80 */ 0x00009571, 0x0000eacb, 0x00009572, 0x0000bbce,
+ /* 84 */ 0x00009573, 0x00009574, 0x00009575, 0x00009576,
+ /* 88 */ 0x00009577, 0x00009578, 0x00009579, 0x0000bdfa,
+ /* 8c */ 0x0000c9ce, 0x0000957a, 0x0000957b, 0x0000eacc,
+ /* 90 */ 0x0000957c, 0x0000957d, 0x0000c9b9, 0x0000cffe,
+ /* 94 */ 0x0000eaca, 0x0000d4ce, 0x0000eacd, 0x0000eacf,
+ /* 98 */ 0x0000957e, 0x00009580, 0x0000cded, 0x00009581,
+ /* 9c */ 0x00009582, 0x00009583, 0x00009584, 0x0000eac9,
+ /* a0 */ 0x00009585, 0x0000eace, 0x00009586, 0x00009587,
+ /* a4 */ 0x0000ceee, 0x00009588, 0x0000bbde, 0x00009589,
+ /* a8 */ 0x0000b3bf, 0x0000958a, 0x0000958b, 0x0000958c,
+ /* ac */ 0x0000958d, 0x0000958e, 0x0000c6d5, 0x0000beb0,
+ /* b0 */ 0x0000cefa, 0x0000958f, 0x00009590, 0x00009591,
+ /* b4 */ 0x0000c7e7, 0x00009592, 0x0000bea7, 0x0000ead0,
+ /* b8 */ 0x00009593, 0x00009594, 0x0000d6c7, 0x00009595,
+ /* bc */ 0x00009596, 0x00009597, 0x0000c1c0, 0x00009598,
+
+ /*** Three byte table, leaf: e69axx - offset 0x03815 ***/
+
+ /* 80 */ 0x00009599, 0x0000959a, 0x0000d4dd, 0x0000959b,
+ /* 84 */ 0x0000ead1, 0x0000959c, 0x0000959d, 0x0000cfbe,
+ /* 88 */ 0x0000959e, 0x0000959f, 0x000095a0, 0x000095a1,
+ /* 8c */ 0x0000ead2, 0x000095a2, 0x000095a3, 0x000095a4,
+ /* 90 */ 0x000095a5, 0x0000caee, 0x000095a6, 0x000095a7,
+ /* 94 */ 0x000095a8, 0x000095a9, 0x0000c5af, 0x0000b0b5,
+ /* 98 */ 0x000095aa, 0x000095ab, 0x000095ac, 0x000095ad,
+ /* 9c */ 0x000095ae, 0x0000ead4, 0x000095af, 0x000095b0,
+ /* a0 */ 0x000095b1, 0x000095b2, 0x000095b3, 0x000095b4,
+ /* a4 */ 0x000095b5, 0x000095b6, 0x000095b7, 0x0000ead3,
+ /* a8 */ 0x0000f4df, 0x000095b8, 0x000095b9, 0x000095ba,
+ /* ac */ 0x000095bb, 0x000095bc, 0x0000c4ba, 0x000095bd,
+ /* b0 */ 0x000095be, 0x000095bf, 0x000095c0, 0x000095c1,
+ /* b4 */ 0x0000b1a9, 0x000095c2, 0x000095c3, 0x000095c4,
+ /* b8 */ 0x000095c5, 0x0000e5df, 0x000095c6, 0x000095c7,
+ /* bc */ 0x000095c8, 0x000095c9, 0x0000ead5, 0x000095ca,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x03855 ***/
+
+ /* 80 */ 0x000095cb, 0x000095cc, 0x000095cd, 0x000095ce,
+ /* 84 */ 0x000095cf, 0x000095d0, 0x000095d1, 0x000095d2,
+ /* 88 */ 0x000095d3, 0x000095d4, 0x000095d5, 0x000095d6,
+ /* 8c */ 0x000095d7, 0x000095d8, 0x000095d9, 0x000095da,
+ /* 90 */ 0x000095db, 0x000095dc, 0x000095dd, 0x000095de,
+ /* 94 */ 0x000095df, 0x000095e0, 0x000095e1, 0x000095e2,
+ /* 98 */ 0x000095e3, 0x0000caef, 0x000095e4, 0x0000ead6,
+ /* 9c */ 0x0000ead7, 0x0000c6d8, 0x000095e5, 0x000095e6,
+ /* a0 */ 0x000095e7, 0x000095e8, 0x000095e9, 0x000095ea,
+ /* a4 */ 0x000095eb, 0x000095ec, 0x0000ead8, 0x000095ed,
+ /* a8 */ 0x000095ee, 0x0000ead9, 0x000095ef, 0x000095f0,
+ /* ac */ 0x000095f1, 0x000095f2, 0x000095f3, 0x000095f4,
+ /* b0 */ 0x0000d4bb, 0x000095f5, 0x0000c7fa, 0x0000d2b7,
+ /* b4 */ 0x0000b8fc, 0x000095f6, 0x000095f7, 0x0000eac2,
+ /* b8 */ 0x000095f8, 0x0000b2dc, 0x000095f9, 0x000095fa,
+ /* bc */ 0x0000c2fc, 0x000095fb, 0x0000d4f8, 0x0000cce6,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x03895 ***/
+
+ /* 80 */ 0x0000d7ee, 0x000095fc, 0x000095fd, 0x000095fe,
+ /* 84 */ 0x00009640, 0x00009641, 0x00009642, 0x00009643,
+ /* 88 */ 0x0000d4c2, 0x0000d3d0, 0x0000ebc3, 0x0000c5f3,
+ /* 8c */ 0x00009644, 0x0000b7fe, 0x00009645, 0x00009646,
+ /* 90 */ 0x0000ebd4, 0x00009647, 0x00009648, 0x00009649,
+ /* 94 */ 0x0000cbb7, 0x0000ebde, 0x0000964a, 0x0000c0ca,
+ /* 98 */ 0x0000964b, 0x0000964c, 0x0000964d, 0x0000cdfb,
+ /* 9c */ 0x0000964e, 0x0000b3af, 0x0000964f, 0x0000c6da,
+ /* a0 */ 0x00009650, 0x00009651, 0x00009652, 0x00009653,
+ /* a4 */ 0x00009654, 0x00009655, 0x0000ebfc, 0x00009656,
+ /* a8 */ 0x0000c4be, 0x00009657, 0x0000ceb4, 0x0000c4a9,
+ /* ac */ 0x0000b1be, 0x0000d4fd, 0x00009658, 0x0000caf5,
+ /* b0 */ 0x00009659, 0x0000d6ec, 0x0000965a, 0x0000965b,
+ /* b4 */ 0x0000c6d3, 0x0000b6e4, 0x0000965c, 0x0000965d,
+ /* b8 */ 0x0000965e, 0x0000965f, 0x0000bbfa, 0x00009660,
+ /* bc */ 0x00009661, 0x0000d0e0, 0x00009662, 0x00009663,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x038d5 ***/
+
+ /* 80 */ 0x0000c9b1, 0x00009664, 0x0000d4d3, 0x0000c8a8,
+ /* 84 */ 0x00009665, 0x00009666, 0x0000b8cb, 0x00009667,
+ /* 88 */ 0x0000e8be, 0x0000c9bc, 0x00009668, 0x00009669,
+ /* 8c */ 0x0000e8bb, 0x0000966a, 0x0000c0ee, 0x0000d0d3,
+ /* 90 */ 0x0000b2c4, 0x0000b4e5, 0x0000966b, 0x0000e8bc,
+ /* 94 */ 0x0000966c, 0x0000966d, 0x0000d5c8, 0x0000966e,
+ /* 98 */ 0x0000966f, 0x00009670, 0x00009671, 0x00009672,
+ /* 9c */ 0x0000b6c5, 0x00009673, 0x0000e8bd, 0x0000caf8,
+ /* a0 */ 0x0000b8dc, 0x0000ccf5, 0x00009674, 0x00009675,
+ /* a4 */ 0x00009676, 0x0000c0b4, 0x00009677, 0x00009678,
+ /* a8 */ 0x0000d1ee, 0x0000e8bf, 0x0000e8c2, 0x00009679,
+ /* ac */ 0x0000967a, 0x0000babc, 0x0000967b, 0x0000b1ad,
+ /* b0 */ 0x0000bddc, 0x0000967c, 0x0000eabd, 0x0000e8c3,
+ /* b4 */ 0x0000967d, 0x0000e8c6, 0x0000967e, 0x0000e8cb,
+ /* b8 */ 0x00009680, 0x00009681, 0x00009682, 0x00009683,
+ /* bc */ 0x0000e8cc, 0x00009684, 0x0000cbc9, 0x0000b0e5,
+
+ /*** Three byte table, leaf: e69exx - offset 0x03915 ***/
+
+ /* 80 */ 0x00009685, 0x0000bcab, 0x00009686, 0x00009687,
+ /* 84 */ 0x0000b9b9, 0x00009688, 0x00009689, 0x0000e8c1,
+ /* 88 */ 0x0000968a, 0x0000cdf7, 0x0000968b, 0x0000e8ca,
+ /* 8c */ 0x0000968c, 0x0000968d, 0x0000968e, 0x0000968f,
+ /* 90 */ 0x0000cef6, 0x00009690, 0x00009691, 0x00009692,
+ /* 94 */ 0x00009693, 0x0000d5ed, 0x00009694, 0x0000c1d6,
+ /* 98 */ 0x0000e8c4, 0x00009695, 0x0000c3b6, 0x00009696,
+ /* 9c */ 0x0000b9fb, 0x0000d6a6, 0x0000e8c8, 0x00009697,
+ /* a0 */ 0x00009698, 0x00009699, 0x0000cae0, 0x0000d4e6,
+ /* a4 */ 0x0000969a, 0x0000e8c0, 0x0000969b, 0x0000e8c5,
+ /* a8 */ 0x0000e8c7, 0x0000969c, 0x0000c7b9, 0x0000b7e3,
+ /* ac */ 0x0000969d, 0x0000e8c9, 0x0000969e, 0x0000bfdd,
+ /* b0 */ 0x0000e8d2, 0x0000969f, 0x000096a0, 0x0000e8d7,
+ /* b4 */ 0x000096a1, 0x0000e8d5, 0x0000bcdc, 0x0000bccf,
+ /* b8 */ 0x0000e8db, 0x000096a2, 0x000096a3, 0x000096a4,
+ /* bc */ 0x000096a5, 0x000096a6, 0x000096a7, 0x000096a8,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x03955 ***/
+
+ /* 80 */ 0x000096a9, 0x0000e8de, 0x000096aa, 0x0000e8da,
+ /* 84 */ 0x0000b1fa, 0x000096ab, 0x000096ac, 0x000096ad,
+ /* 88 */ 0x000096ae, 0x000096af, 0x000096b0, 0x000096b1,
+ /* 8c */ 0x000096b2, 0x000096b3, 0x000096b4, 0x0000b0d8,
+ /* 90 */ 0x0000c4b3, 0x0000b8cc, 0x0000c6e2, 0x0000c8be,
+ /* 94 */ 0x0000c8e1, 0x000096b5, 0x000096b6, 0x000096b7,
+ /* 98 */ 0x0000e8cf, 0x0000e8d4, 0x0000e8d6, 0x000096b8,
+ /* 9c */ 0x0000b9f1, 0x0000e8d8, 0x0000d7f5, 0x000096b9,
+ /* a0 */ 0x0000c4fb, 0x000096ba, 0x0000e8dc, 0x000096bb,
+ /* a4 */ 0x000096bc, 0x0000b2e9, 0x000096bd, 0x000096be,
+ /* a8 */ 0x000096bf, 0x0000e8d1, 0x000096c0, 0x000096c1,
+ /* ac */ 0x0000bced, 0x000096c2, 0x000096c3, 0x0000bfc2,
+ /* b0 */ 0x0000e8cd, 0x0000d6f9, 0x000096c4, 0x0000c1f8,
+ /* b4 */ 0x0000b2f1, 0x000096c5, 0x000096c6, 0x000096c7,
+ /* b8 */ 0x000096c8, 0x000096c9, 0x000096ca, 0x000096cb,
+ /* bc */ 0x000096cc, 0x0000e8df, 0x000096cd, 0x0000cac1,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x03995 ***/
+
+ /* 80 */ 0x0000e8d9, 0x000096ce, 0x000096cf, 0x000096d0,
+ /* 84 */ 0x000096d1, 0x0000d5a4, 0x000096d2, 0x0000b1ea,
+ /* 88 */ 0x0000d5bb, 0x0000e8ce, 0x0000e8d0, 0x0000b6b0,
+ /* 8c */ 0x0000e8d3, 0x000096d3, 0x0000e8dd, 0x0000c0b8,
+ /* 90 */ 0x000096d4, 0x0000caf7, 0x000096d5, 0x0000cba8,
+ /* 94 */ 0x000096d6, 0x000096d7, 0x0000c6dc, 0x0000c0f5,
+ /* 98 */ 0x000096d8, 0x000096d9, 0x000096da, 0x000096db,
+ /* 9c */ 0x000096dc, 0x0000e8e9, 0x000096dd, 0x000096de,
+ /* a0 */ 0x000096df, 0x0000d0a3, 0x000096e0, 0x000096e1,
+ /* a4 */ 0x000096e2, 0x000096e3, 0x000096e4, 0x000096e5,
+ /* a8 */ 0x000096e6, 0x0000e8f2, 0x0000d6ea, 0x000096e7,
+ /* ac */ 0x000096e8, 0x000096e9, 0x000096ea, 0x000096eb,
+ /* b0 */ 0x000096ec, 0x000096ed, 0x0000e8e0, 0x0000e8e1,
+ /* b4 */ 0x000096ee, 0x000096ef, 0x000096f0, 0x0000d1f9,
+ /* b8 */ 0x0000bacb, 0x0000b8f9, 0x000096f1, 0x000096f2,
+ /* bc */ 0x0000b8f1, 0x0000d4d4, 0x0000e8ef, 0x000096f3,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x039d5 ***/
+
+ /* 80 */ 0x0000e8ee, 0x0000e8ec, 0x0000b9f0, 0x0000ccd2,
+ /* 84 */ 0x0000e8e6, 0x0000cea6, 0x0000bff2, 0x000096f4,
+ /* 88 */ 0x0000b0b8, 0x0000e8f1, 0x0000e8f0, 0x000096f5,
+ /* 8c */ 0x0000d7c0, 0x000096f6, 0x0000e8e4, 0x000096f7,
+ /* 90 */ 0x0000cda9, 0x0000c9a3, 0x000096f8, 0x0000bbb8,
+ /* 94 */ 0x0000bddb, 0x0000e8ea, 0x000096f9, 0x000096fa,
+ /* 98 */ 0x000096fb, 0x000096fc, 0x000096fd, 0x000096fe,
+ /* 9c */ 0x00009740, 0x00009741, 0x00009742, 0x00009743,
+ /* a0 */ 0x0000e8e2, 0x0000e8e3, 0x0000e8e5, 0x0000b5b5,
+ /* a4 */ 0x0000e8e7, 0x0000c7c5, 0x0000e8eb, 0x0000e8ed,
+ /* a8 */ 0x0000bdb0, 0x0000d7ae, 0x00009744, 0x0000e8f8,
+ /* ac */ 0x00009745, 0x00009746, 0x00009747, 0x00009748,
+ /* b0 */ 0x00009749, 0x0000974a, 0x0000974b, 0x0000974c,
+ /* b4 */ 0x0000e8f5, 0x0000974d, 0x0000cdb0, 0x0000e8f6,
+ /* b8 */ 0x0000974e, 0x0000974f, 0x00009750, 0x00009751,
+ /* bc */ 0x00009752, 0x00009753, 0x00009754, 0x00009755,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x03a15 ***/
+
+ /* 80 */ 0x00009756, 0x0000c1ba, 0x00009757, 0x0000e8e8,
+ /* 84 */ 0x00009758, 0x0000c3b7, 0x0000b0f0, 0x00009759,
+ /* 88 */ 0x0000975a, 0x0000975b, 0x0000975c, 0x0000975d,
+ /* 8c */ 0x0000975e, 0x0000975f, 0x00009760, 0x0000e8f4,
+ /* 90 */ 0x00009761, 0x00009762, 0x00009763, 0x0000e8f7,
+ /* 94 */ 0x00009764, 0x00009765, 0x00009766, 0x0000b9a3,
+ /* 98 */ 0x00009767, 0x00009768, 0x00009769, 0x0000976a,
+ /* 9c */ 0x0000976b, 0x0000976c, 0x0000976d, 0x0000976e,
+ /* a0 */ 0x0000976f, 0x00009770, 0x0000c9d2, 0x00009771,
+ /* a4 */ 0x00009772, 0x00009773, 0x0000c3ce, 0x0000cee0,
+ /* a8 */ 0x0000c0e6, 0x00009774, 0x00009775, 0x00009776,
+ /* ac */ 0x00009777, 0x0000cbf3, 0x00009778, 0x0000ccdd,
+ /* b0 */ 0x0000d0b5, 0x00009779, 0x0000977a, 0x0000cae1,
+ /* b4 */ 0x0000977b, 0x0000e8f3, 0x0000977c, 0x0000977d,
+ /* b8 */ 0x0000977e, 0x00009780, 0x00009781, 0x00009782,
+ /* bc */ 0x00009783, 0x00009784, 0x00009785, 0x00009786,
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x03a55 ***/
+
+ /* 80 */ 0x0000bcec, 0x00009787, 0x0000e8f9, 0x00009788,
+ /* 84 */ 0x00009789, 0x0000978a, 0x0000978b, 0x0000978c,
+ /* 88 */ 0x0000978d, 0x0000c3de, 0x0000978e, 0x0000c6e5,
+ /* 8c */ 0x0000978f, 0x0000b9f7, 0x00009790, 0x00009791,
+ /* 90 */ 0x00009792, 0x00009793, 0x0000b0f4, 0x00009794,
+ /* 94 */ 0x00009795, 0x0000d7d8, 0x00009796, 0x00009797,
+ /* 98 */ 0x0000bcac, 0x00009798, 0x0000c5ef, 0x00009799,
+ /* 9c */ 0x0000979a, 0x0000979b, 0x0000979c, 0x0000979d,
+ /* a0 */ 0x0000ccc4, 0x0000979e, 0x0000979f, 0x0000e9a6,
+ /* a4 */ 0x000097a0, 0x000097a1, 0x000097a2, 0x000097a3,
+ /* a8 */ 0x000097a4, 0x000097a5, 0x000097a6, 0x000097a7,
+ /* ac */ 0x000097a8, 0x000097a9, 0x0000c9ad, 0x000097aa,
+ /* b0 */ 0x0000e9a2, 0x0000c0e2, 0x000097ab, 0x000097ac,
+ /* b4 */ 0x000097ad, 0x0000bfc3, 0x000097ae, 0x000097af,
+ /* b8 */ 0x000097b0, 0x0000e8fe, 0x0000b9d7, 0x000097b1,
+ /* bc */ 0x0000e8fb, 0x000097b2, 0x000097b3, 0x000097b4,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x03a95 ***/
+
+ /* 80 */ 0x000097b5, 0x0000e9a4, 0x000097b6, 0x000097b7,
+ /* 84 */ 0x000097b8, 0x0000d2ce, 0x000097b9, 0x000097ba,
+ /* 88 */ 0x000097bb, 0x000097bc, 0x000097bd, 0x0000e9a3,
+ /* 8c */ 0x000097be, 0x0000d6b2, 0x0000d7b5, 0x000097bf,
+ /* 90 */ 0x0000e9a7, 0x000097c0, 0x0000bdb7, 0x000097c1,
+ /* 94 */ 0x000097c2, 0x000097c3, 0x000097c4, 0x000097c5,
+ /* 98 */ 0x000097c6, 0x000097c7, 0x000097c8, 0x000097c9,
+ /* 9c */ 0x000097ca, 0x000097cb, 0x000097cc, 0x0000e8fc,
+ /* a0 */ 0x0000e8fd, 0x000097cd, 0x000097ce, 0x000097cf,
+ /* a4 */ 0x0000e9a1, 0x000097d0, 0x000097d1, 0x000097d2,
+ /* a8 */ 0x000097d3, 0x000097d4, 0x000097d5, 0x000097d6,
+ /* ac */ 0x000097d7, 0x0000cdd6, 0x000097d8, 0x000097d9,
+ /* b0 */ 0x0000d2ac, 0x000097da, 0x000097db, 0x000097dc,
+ /* b4 */ 0x0000e9b2, 0x000097dd, 0x000097de, 0x000097df,
+ /* b8 */ 0x000097e0, 0x0000e9a9, 0x000097e1, 0x000097e2,
+ /* bc */ 0x000097e3, 0x0000b4aa, 0x000097e4, 0x0000b4bb,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x03ad5 ***/
+
+ /* 80 */ 0x000097e5, 0x000097e6, 0x0000e9ab, 0x000097e7,
+ /* 84 */ 0x000097e8, 0x000097e9, 0x000097ea, 0x000097eb,
+ /* 88 */ 0x000097ec, 0x000097ed, 0x000097ee, 0x000097ef,
+ /* 8c */ 0x000097f0, 0x000097f1, 0x000097f2, 0x000097f3,
+ /* 90 */ 0x000097f4, 0x000097f5, 0x000097f6, 0x000097f7,
+ /* 94 */ 0x0000d0a8, 0x000097f8, 0x000097f9, 0x0000e9a5,
+ /* 98 */ 0x000097fa, 0x000097fb, 0x0000b3fe, 0x000097fc,
+ /* 9c */ 0x000097fd, 0x0000e9ac, 0x0000c0e3, 0x000097fe,
+ /* a0 */ 0x0000e9aa, 0x00009840, 0x00009841, 0x0000e9b9,
+ /* a4 */ 0x00009842, 0x00009843, 0x0000e9b8, 0x00009844,
+ /* a8 */ 0x00009845, 0x00009846, 0x00009847, 0x0000e9ae,
+ /* ac */ 0x00009848, 0x00009849, 0x0000e8fa, 0x0000984a,
+ /* b0 */ 0x0000984b, 0x0000e9a8, 0x0000984c, 0x0000984d,
+ /* b4 */ 0x0000984e, 0x0000984f, 0x00009850, 0x0000bfac,
+ /* b8 */ 0x0000e9b1, 0x0000e9ba, 0x00009851, 0x00009852,
+ /* bc */ 0x0000c2a5, 0x00009853, 0x00009854, 0x00009855,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x03b15 ***/
+
+ /* 80 */ 0x0000e9af, 0x00009856, 0x0000b8c5, 0x00009857,
+ /* 84 */ 0x0000e9ad, 0x00009858, 0x0000d3dc, 0x0000e9b4,
+ /* 88 */ 0x0000e9b5, 0x0000e9b7, 0x00009859, 0x0000985a,
+ /* 8c */ 0x0000985b, 0x0000e9c7, 0x0000985c, 0x0000985d,
+ /* 90 */ 0x0000985e, 0x0000985f, 0x00009860, 0x00009861,
+ /* 94 */ 0x0000c0c6, 0x0000e9c5, 0x00009862, 0x00009863,
+ /* 98 */ 0x0000e9b0, 0x00009864, 0x00009865, 0x0000e9bb,
+ /* 9c */ 0x0000b0f1, 0x00009866, 0x00009867, 0x00009868,
+ /* a0 */ 0x00009869, 0x0000986a, 0x0000986b, 0x0000986c,
+ /* a4 */ 0x0000986d, 0x0000986e, 0x0000986f, 0x0000e9bc,
+ /* a8 */ 0x0000d5a5, 0x00009870, 0x00009871, 0x0000e9be,
+ /* ac */ 0x00009872, 0x0000e9bf, 0x00009873, 0x00009874,
+ /* b0 */ 0x00009875, 0x0000e9c1, 0x00009876, 0x00009877,
+ /* b4 */ 0x0000c1f1, 0x00009878, 0x00009879, 0x0000c8b6,
+ /* b8 */ 0x0000987a, 0x0000987b, 0x0000987c, 0x0000e9bd,
+ /* bc */ 0x0000987d, 0x0000987e, 0x00009880, 0x00009881,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x03b55 ***/
+
+ /* 80 */ 0x00009882, 0x0000e9c2, 0x00009883, 0x00009884,
+ /* 84 */ 0x00009885, 0x00009886, 0x00009887, 0x00009888,
+ /* 88 */ 0x00009889, 0x0000988a, 0x0000e9c3, 0x0000988b,
+ /* 8c */ 0x0000e9b3, 0x0000988c, 0x0000e9b6, 0x0000988d,
+ /* 90 */ 0x0000bbb1, 0x0000988e, 0x0000988f, 0x00009890,
+ /* 94 */ 0x0000e9c0, 0x00009891, 0x00009892, 0x00009893,
+ /* 98 */ 0x00009894, 0x00009895, 0x00009896, 0x0000bcf7,
+ /* 9c */ 0x00009897, 0x00009898, 0x00009899, 0x0000e9c4,
+ /* a0 */ 0x0000e9c6, 0x0000989a, 0x0000989b, 0x0000989c,
+ /* a4 */ 0x0000989d, 0x0000989e, 0x0000989f, 0x000098a0,
+ /* a8 */ 0x000098a1, 0x000098a2, 0x000098a3, 0x000098a4,
+ /* ac */ 0x000098a5, 0x0000e9ca, 0x000098a6, 0x000098a7,
+ /* b0 */ 0x000098a8, 0x000098a9, 0x0000e9ce, 0x000098aa,
+ /* b4 */ 0x000098ab, 0x000098ac, 0x000098ad, 0x000098ae,
+ /* b8 */ 0x000098af, 0x000098b0, 0x000098b1, 0x000098b2,
+ /* bc */ 0x000098b3, 0x0000b2db, 0x000098b4, 0x0000e9c8,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x03b95 ***/
+
+ /* 80 */ 0x000098b5, 0x000098b6, 0x000098b7, 0x000098b8,
+ /* 84 */ 0x000098b9, 0x000098ba, 0x000098bb, 0x000098bc,
+ /* 88 */ 0x000098bd, 0x000098be, 0x0000b7ae, 0x000098bf,
+ /* 8c */ 0x000098c0, 0x000098c1, 0x000098c2, 0x000098c3,
+ /* 90 */ 0x000098c4, 0x000098c5, 0x000098c6, 0x000098c7,
+ /* 94 */ 0x000098c8, 0x000098c9, 0x000098ca, 0x0000e9cb,
+ /* 98 */ 0x0000e9cc, 0x000098cb, 0x000098cc, 0x000098cd,
+ /* 9c */ 0x000098ce, 0x000098cf, 0x000098d0, 0x0000d5c1,
+ /* a0 */ 0x000098d1, 0x0000c4a3, 0x000098d2, 0x000098d3,
+ /* a4 */ 0x000098d4, 0x000098d5, 0x000098d6, 0x000098d7,
+ /* a8 */ 0x0000e9d8, 0x000098d8, 0x0000bae1, 0x000098d9,
+ /* ac */ 0x000098da, 0x000098db, 0x000098dc, 0x0000e9c9,
+ /* b0 */ 0x000098dd, 0x0000d3a3, 0x000098de, 0x000098df,
+ /* b4 */ 0x000098e0, 0x0000e9d4, 0x000098e1, 0x000098e2,
+ /* b8 */ 0x000098e3, 0x000098e4, 0x000098e5, 0x000098e6,
+ /* bc */ 0x000098e7, 0x0000e9d7, 0x0000e9d0, 0x000098e8,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x03bd5 ***/
+
+ /* 80 */ 0x000098e9, 0x000098ea, 0x000098eb, 0x000098ec,
+ /* 84 */ 0x0000e9cf, 0x000098ed, 0x000098ee, 0x0000c7c1,
+ /* 88 */ 0x000098ef, 0x000098f0, 0x000098f1, 0x000098f2,
+ /* 8c */ 0x000098f3, 0x000098f4, 0x000098f5, 0x000098f6,
+ /* 90 */ 0x0000e9d2, 0x000098f7, 0x000098f8, 0x000098f9,
+ /* 94 */ 0x000098fa, 0x000098fb, 0x000098fc, 0x000098fd,
+ /* 98 */ 0x0000e9d9, 0x0000b3c8, 0x000098fe, 0x0000e9d3,
+ /* 9c */ 0x00009940, 0x00009941, 0x00009942, 0x00009943,
+ /* a0 */ 0x00009944, 0x0000cff0, 0x00009945, 0x00009946,
+ /* a4 */ 0x00009947, 0x0000e9cd, 0x00009948, 0x00009949,
+ /* a8 */ 0x0000994a, 0x0000994b, 0x0000994c, 0x0000994d,
+ /* ac */ 0x0000994e, 0x0000994f, 0x00009950, 0x00009951,
+ /* b0 */ 0x00009952, 0x0000b3f7, 0x00009953, 0x00009954,
+ /* b4 */ 0x00009955, 0x00009956, 0x00009957, 0x00009958,
+ /* b8 */ 0x00009959, 0x0000e9d6, 0x0000995a, 0x0000995b,
+ /* bc */ 0x0000e9da, 0x0000995c, 0x0000995d, 0x0000995e,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x03c15 ***/
+
+ /* 80 */ 0x0000ccb4, 0x0000995f, 0x00009960, 0x00009961,
+ /* 84 */ 0x0000cfad, 0x00009962, 0x00009963, 0x00009964,
+ /* 88 */ 0x00009965, 0x00009966, 0x00009967, 0x00009968,
+ /* 8c */ 0x00009969, 0x0000996a, 0x0000e9d5, 0x0000996b,
+ /* 90 */ 0x0000e9dc, 0x0000e9db, 0x0000996c, 0x0000996d,
+ /* 94 */ 0x0000996e, 0x0000996f, 0x00009970, 0x0000e9de,
+ /* 98 */ 0x00009971, 0x00009972, 0x00009973, 0x00009974,
+ /* 9c */ 0x00009975, 0x00009976, 0x00009977, 0x00009978,
+ /* a0 */ 0x0000e9d1, 0x00009979, 0x0000997a, 0x0000997b,
+ /* a4 */ 0x0000997c, 0x0000997d, 0x0000997e, 0x00009980,
+ /* a8 */ 0x00009981, 0x0000e9dd, 0x00009982, 0x0000e9df,
+ /* ac */ 0x0000c3ca, 0x00009983, 0x00009984, 0x00009985,
+ /* b0 */ 0x00009986, 0x00009987, 0x00009988, 0x00009989,
+ /* b4 */ 0x0000998a, 0x0000998b, 0x0000998c, 0x0000998d,
+ /* b8 */ 0x0000998e, 0x0000998f, 0x00009990, 0x00009991,
+ /* bc */ 0x00009992, 0x00009993, 0x00009994, 0x00009995,
+
+ /*** Three byte table, leaf: e6abxx - offset 0x03c55 ***/
+
+ /* 80 */ 0x00009996, 0x00009997, 0x00009998, 0x00009999,
+ /* 84 */ 0x0000999a, 0x0000999b, 0x0000999c, 0x0000999d,
+ /* 88 */ 0x0000999e, 0x0000999f, 0x000099a0, 0x000099a1,
+ /* 8c */ 0x000099a2, 0x000099a3, 0x000099a4, 0x000099a5,
+ /* 90 */ 0x000099a6, 0x000099a7, 0x000099a8, 0x000099a9,
+ /* 94 */ 0x000099aa, 0x000099ab, 0x000099ac, 0x000099ad,
+ /* 98 */ 0x000099ae, 0x000099af, 0x000099b0, 0x000099b1,
+ /* 9c */ 0x000099b2, 0x000099b3, 0x000099b4, 0x000099b5,
+ /* a0 */ 0x000099b6, 0x000099b7, 0x000099b8, 0x000099b9,
+ /* a4 */ 0x000099ba, 0x000099bb, 0x000099bc, 0x000099bd,
+ /* a8 */ 0x000099be, 0x000099bf, 0x000099c0, 0x000099c1,
+ /* ac */ 0x000099c2, 0x000099c3, 0x000099c4, 0x000099c5,
+ /* b0 */ 0x000099c6, 0x000099c7, 0x000099c8, 0x000099c9,
+ /* b4 */ 0x000099ca, 0x000099cb, 0x000099cc, 0x000099cd,
+ /* b8 */ 0x000099ce, 0x000099cf, 0x000099d0, 0x000099d1,
+ /* bc */ 0x000099d2, 0x000099d3, 0x000099d4, 0x000099d5,
+
+ /*** Three byte table, leaf: e6acxx - offset 0x03c95 ***/
+
+ /* 80 */ 0x000099d6, 0x000099d7, 0x000099d8, 0x000099d9,
+ /* 84 */ 0x000099da, 0x000099db, 0x000099dc, 0x000099dd,
+ /* 88 */ 0x000099de, 0x000099df, 0x000099e0, 0x000099e1,
+ /* 8c */ 0x000099e2, 0x000099e3, 0x000099e4, 0x000099e5,
+ /* 90 */ 0x000099e6, 0x000099e7, 0x000099e8, 0x000099e9,
+ /* 94 */ 0x000099ea, 0x000099eb, 0x000099ec, 0x000099ed,
+ /* 98 */ 0x000099ee, 0x000099ef, 0x000099f0, 0x000099f1,
+ /* 9c */ 0x000099f2, 0x000099f3, 0x000099f4, 0x000099f5,
+ /* a0 */ 0x0000c7b7, 0x0000b4ce, 0x0000bbb6, 0x0000d0c0,
+ /* a4 */ 0x0000eca3, 0x000099f6, 0x000099f7, 0x0000c5b7,
+ /* a8 */ 0x000099f8, 0x000099f9, 0x000099fa, 0x000099fb,
+ /* ac */ 0x000099fc, 0x000099fd, 0x000099fe, 0x00009a40,
+ /* b0 */ 0x00009a41, 0x00009a42, 0x0000d3fb, 0x00009a43,
+ /* b4 */ 0x00009a44, 0x00009a45, 0x00009a46, 0x0000eca4,
+ /* b8 */ 0x00009a47, 0x0000eca5, 0x0000c6db, 0x00009a48,
+ /* bc */ 0x00009a49, 0x00009a4a, 0x0000bfee, 0x00009a4b,
+
+ /*** Three byte table, leaf: e6adxx - offset 0x03cd5 ***/
+
+ /* 80 */ 0x00009a4c, 0x00009a4d, 0x00009a4e, 0x0000eca6,
+ /* 84 */ 0x00009a4f, 0x00009a50, 0x0000eca7, 0x0000d0aa,
+ /* 88 */ 0x00009a51, 0x0000c7b8, 0x00009a52, 0x00009a53,
+ /* 8c */ 0x0000b8e8, 0x00009a54, 0x00009a55, 0x00009a56,
+ /* 90 */ 0x00009a57, 0x00009a58, 0x00009a59, 0x00009a5a,
+ /* 94 */ 0x00009a5b, 0x00009a5c, 0x00009a5d, 0x00009a5e,
+ /* 98 */ 0x00009a5f, 0x0000eca8, 0x00009a60, 0x00009a61,
+ /* 9c */ 0x00009a62, 0x00009a63, 0x00009a64, 0x00009a65,
+ /* a0 */ 0x00009a66, 0x00009a67, 0x0000d6b9, 0x0000d5fd,
+ /* a4 */ 0x0000b4cb, 0x0000b2bd, 0x0000cee4, 0x0000c6e7,
+ /* a8 */ 0x00009a68, 0x00009a69, 0x0000cde1, 0x00009a6a,
+ /* ac */ 0x00009a6b, 0x00009a6c, 0x00009a6d, 0x00009a6e,
+ /* b0 */ 0x00009a6f, 0x00009a70, 0x00009a71, 0x00009a72,
+ /* b4 */ 0x00009a73, 0x00009a74, 0x00009a75, 0x00009a76,
+ /* b8 */ 0x00009a77, 0x0000b4f5, 0x00009a78, 0x0000cbc0,
+ /* bc */ 0x0000bcdf, 0x00009a79, 0x00009a7a, 0x00009a7b,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x03d15 ***/
+
+ /* 80 */ 0x00009a7c, 0x0000e9e2, 0x0000e9e3, 0x0000d1ea,
+ /* 84 */ 0x0000e9e5, 0x00009a7d, 0x0000b4f9, 0x0000e9e4,
+ /* 88 */ 0x00009a7e, 0x0000d1b3, 0x0000cae2, 0x0000b2d0,
+ /* 8c */ 0x00009a80, 0x0000e9e8, 0x00009a81, 0x00009a82,
+ /* 90 */ 0x00009a83, 0x00009a84, 0x0000e9e6, 0x0000e9e7,
+ /* 94 */ 0x00009a85, 0x00009a86, 0x0000d6b3, 0x00009a87,
+ /* 98 */ 0x00009a88, 0x00009a89, 0x0000e9e9, 0x0000e9ea,
+ /* 9c */ 0x00009a8a, 0x00009a8b, 0x00009a8c, 0x00009a8d,
+ /* a0 */ 0x00009a8e, 0x0000e9eb, 0x00009a8f, 0x00009a90,
+ /* a4 */ 0x00009a91, 0x00009a92, 0x00009a93, 0x00009a94,
+ /* a8 */ 0x00009a95, 0x00009a96, 0x0000e9ec, 0x00009a97,
+ /* ac */ 0x00009a98, 0x00009a99, 0x00009a9a, 0x00009a9b,
+ /* b0 */ 0x00009a9c, 0x00009a9d, 0x00009a9e, 0x0000ecaf,
+ /* b4 */ 0x0000c5b9, 0x0000b6ce, 0x00009a9f, 0x0000d2f3,
+ /* b8 */ 0x00009aa0, 0x00009aa1, 0x00009aa2, 0x00009aa3,
+ /* bc */ 0x00009aa4, 0x00009aa5, 0x00009aa6, 0x0000b5ee,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x03d55 ***/
+
+ /* 80 */ 0x00009aa7, 0x0000bbd9, 0x0000ecb1, 0x00009aa8,
+ /* 84 */ 0x00009aa9, 0x0000d2e3, 0x00009aaa, 0x00009aab,
+ /* 88 */ 0x00009aac, 0x00009aad, 0x00009aae, 0x0000cee3,
+ /* 8c */ 0x00009aaf, 0x0000c4b8, 0x00009ab0, 0x0000c3bf,
+ /* 90 */ 0x00009ab1, 0x00009ab2, 0x0000b6be, 0x0000d8b9,
+ /* 94 */ 0x0000b1c8, 0x0000b1cf, 0x0000b1d1, 0x0000c5fe,
+ /* 98 */ 0x00009ab3, 0x0000b1d0, 0x00009ab4, 0x0000c3ab,
+ /* 9c */ 0x00009ab5, 0x00009ab6, 0x00009ab7, 0x00009ab8,
+ /* a0 */ 0x00009ab9, 0x0000d5b1, 0x00009aba, 0x00009abb,
+ /* a4 */ 0x00009abc, 0x00009abd, 0x00009abe, 0x00009abf,
+ /* a8 */ 0x00009ac0, 0x00009ac1, 0x0000eba4, 0x0000bac1,
+ /* ac */ 0x00009ac2, 0x00009ac3, 0x00009ac4, 0x0000ccba,
+ /* b0 */ 0x00009ac5, 0x00009ac6, 0x00009ac7, 0x0000eba5,
+ /* b4 */ 0x00009ac8, 0x0000eba7, 0x00009ac9, 0x00009aca,
+ /* b8 */ 0x00009acb, 0x0000eba8, 0x00009acc, 0x00009acd,
+ /* bc */ 0x00009ace, 0x0000eba6, 0x00009acf, 0x00009ad0,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x03d95 ***/
+
+ /* 80 */ 0x00009ad1, 0x00009ad2, 0x00009ad3, 0x00009ad4,
+ /* 84 */ 0x00009ad5, 0x0000eba9, 0x0000ebab, 0x0000ebaa,
+ /* 88 */ 0x00009ad6, 0x00009ad7, 0x00009ad8, 0x00009ad9,
+ /* 8c */ 0x00009ada, 0x0000ebac, 0x00009adb, 0x0000cacf,
+ /* 90 */ 0x0000d8b5, 0x0000c3f1, 0x00009adc, 0x0000c3a5,
+ /* 94 */ 0x0000c6f8, 0x0000ebad, 0x0000c4ca, 0x00009add,
+ /* 98 */ 0x0000ebae, 0x0000ebaf, 0x0000ebb0, 0x0000b7d5,
+ /* 9c */ 0x00009ade, 0x00009adf, 0x00009ae0, 0x0000b7fa,
+ /* a0 */ 0x00009ae1, 0x0000ebb1, 0x0000c7e2, 0x00009ae2,
+ /* a4 */ 0x0000ebb3, 0x00009ae3, 0x0000baa4, 0x0000d1f5,
+ /* a8 */ 0x0000b0b1, 0x0000ebb2, 0x0000ebb4, 0x00009ae4,
+ /* ac */ 0x00009ae5, 0x00009ae6, 0x0000b5aa, 0x0000c2c8,
+ /* b0 */ 0x0000c7e8, 0x00009ae7, 0x0000ebb5, 0x00009ae8,
+ /* b4 */ 0x0000cbae, 0x0000e3df, 0x00009ae9, 0x00009aea,
+ /* b8 */ 0x0000d3c0, 0x00009aeb, 0x00009aec, 0x00009aed,
+ /* bc */ 0x00009aee, 0x0000d9db, 0x00009aef, 0x00009af0,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x03dd5 ***/
+
+ /* 80 */ 0x0000cda1, 0x0000d6ad, 0x0000c7f3, 0x00009af1,
+ /* 84 */ 0x00009af2, 0x00009af3, 0x0000d9e0, 0x0000bbe3,
+ /* 88 */ 0x00009af4, 0x0000baba, 0x0000e3e2, 0x00009af5,
+ /* 8c */ 0x00009af6, 0x00009af7, 0x00009af8, 0x00009af9,
+ /* 90 */ 0x0000cfab, 0x00009afa, 0x00009afb, 0x00009afc,
+ /* 94 */ 0x0000e3e0, 0x0000c9c7, 0x00009afd, 0x0000bab9,
+ /* 98 */ 0x00009afe, 0x00009b40, 0x00009b41, 0x0000d1b4,
+ /* 9c */ 0x0000e3e1, 0x0000c8ea, 0x0000b9af, 0x0000bdad,
+ /* a0 */ 0x0000b3d8, 0x0000cedb, 0x00009b42, 0x00009b43,
+ /* a4 */ 0x0000ccc0, 0x00009b44, 0x00009b45, 0x00009b46,
+ /* a8 */ 0x0000e3e8, 0x0000e3e9, 0x0000cdf4, 0x00009b47,
+ /* ac */ 0x00009b48, 0x00009b49, 0x00009b4a, 0x00009b4b,
+ /* b0 */ 0x0000ccad, 0x00009b4c, 0x0000bcb3, 0x00009b4d,
+ /* b4 */ 0x0000e3ea, 0x00009b4e, 0x0000e3eb, 0x00009b4f,
+ /* b8 */ 0x00009b50, 0x0000d0da, 0x00009b51, 0x00009b52,
+ /* bc */ 0x00009b53, 0x0000c6fb, 0x0000b7da, 0x00009b54,
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x03e15 ***/
+
+ /* 80 */ 0x00009b55, 0x0000c7df, 0x0000d2ca, 0x0000ced6,
+ /* 84 */ 0x00009b56, 0x0000e3e4, 0x0000e3ec, 0x00009b57,
+ /* 88 */ 0x0000c9f2, 0x0000b3c1, 0x00009b58, 0x00009b59,
+ /* 8c */ 0x0000e3e7, 0x00009b5a, 0x00009b5b, 0x0000c6e3,
+ /* 90 */ 0x0000e3e5, 0x00009b5c, 0x00009b5d, 0x0000edb3,
+ /* 94 */ 0x0000e3e6, 0x00009b5e, 0x00009b5f, 0x00009b60,
+ /* 98 */ 0x00009b61, 0x0000c9b3, 0x00009b62, 0x0000c5e6,
+ /* 9c */ 0x00009b63, 0x00009b64, 0x00009b65, 0x0000b9b5,
+ /* a0 */ 0x00009b66, 0x0000c3bb, 0x00009b67, 0x0000e3e3,
+ /* a4 */ 0x0000c5bd, 0x0000c1a4, 0x0000c2d9, 0x0000b2d7,
+ /* a8 */ 0x00009b68, 0x0000e3ed, 0x0000bba6, 0x0000c4ad,
+ /* ac */ 0x00009b69, 0x0000e3f0, 0x0000beda, 0x00009b6a,
+ /* b0 */ 0x00009b6b, 0x0000e3fb, 0x0000e3f5, 0x0000bad3,
+ /* b4 */ 0x00009b6c, 0x00009b6d, 0x00009b6e, 0x00009b6f,
+ /* b8 */ 0x0000b7d0, 0x0000d3cd, 0x00009b70, 0x0000d6ce,
+ /* bc */ 0x0000d5d3, 0x0000b9c1, 0x0000d5b4, 0x0000d1d8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x03e55 ***/
+
+ /* 80 */ 0x00009b71, 0x00009b72, 0x00009b73, 0x00009b74,
+ /* 84 */ 0x0000d0b9, 0x0000c7f6, 0x00009b75, 0x00009b76,
+ /* 88 */ 0x00009b77, 0x0000c8aa, 0x0000b2b4, 0x00009b78,
+ /* 8c */ 0x0000c3da, 0x00009b79, 0x00009b7a, 0x00009b7b,
+ /* 90 */ 0x0000e3ee, 0x00009b7c, 0x00009b7d, 0x0000e3fc,
+ /* 94 */ 0x0000e3ef, 0x0000b7a8, 0x0000e3f7, 0x0000e3f4,
+ /* 98 */ 0x00009b7e, 0x00009b80, 0x00009b81, 0x0000b7ba,
+ /* 9c */ 0x00009b82, 0x00009b83, 0x0000c5a2, 0x00009b84,
+ /* a0 */ 0x0000e3f6, 0x0000c5dd, 0x0000b2a8, 0x0000c6fc,
+ /* a4 */ 0x00009b85, 0x0000c4e0, 0x00009b86, 0x00009b87,
+ /* a8 */ 0x0000d7a2, 0x00009b88, 0x0000c0e1, 0x0000e3f9,
+ /* ac */ 0x00009b89, 0x00009b8a, 0x0000e3fa, 0x0000e3fd,
+ /* b0 */ 0x0000cca9, 0x0000e3f3, 0x00009b8b, 0x0000d3be,
+ /* b4 */ 0x00009b8c, 0x0000b1c3, 0x0000edb4, 0x0000e3f1,
+ /* b8 */ 0x0000e3f2, 0x00009b8d, 0x0000e3f8, 0x0000d0ba,
+ /* bc */ 0x0000c6c3, 0x0000d4f3, 0x0000e3fe, 0x00009b8e,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x03e95 ***/
+
+ /* 80 */ 0x00009b8f, 0x0000bde0, 0x00009b90, 0x00009b91,
+ /* 84 */ 0x0000e4a7, 0x00009b92, 0x00009b93, 0x0000e4a6,
+ /* 88 */ 0x00009b94, 0x00009b95, 0x00009b96, 0x0000d1f3,
+ /* 8c */ 0x0000e4a3, 0x00009b97, 0x0000e4a9, 0x00009b98,
+ /* 90 */ 0x00009b99, 0x00009b9a, 0x0000c8f7, 0x00009b9b,
+ /* 94 */ 0x00009b9c, 0x00009b9d, 0x00009b9e, 0x0000cfb4,
+ /* 98 */ 0x00009b9f, 0x0000e4a8, 0x0000e4ae, 0x0000c2e5,
+ /* 9c */ 0x00009ba0, 0x00009ba1, 0x0000b6b4, 0x00009ba2,
+ /* a0 */ 0x00009ba3, 0x00009ba4, 0x00009ba5, 0x00009ba6,
+ /* a4 */ 0x00009ba7, 0x0000bdf2, 0x00009ba8, 0x0000e4a2,
+ /* a8 */ 0x00009ba9, 0x00009baa, 0x0000bae9, 0x0000e4aa,
+ /* ac */ 0x00009bab, 0x00009bac, 0x0000e4ac, 0x00009bad,
+ /* b0 */ 0x00009bae, 0x0000b6fd, 0x0000d6de, 0x0000e4b2,
+ /* b4 */ 0x00009baf, 0x0000e4ad, 0x00009bb0, 0x00009bb1,
+ /* b8 */ 0x00009bb2, 0x0000e4a1, 0x00009bb3, 0x0000bbee,
+ /* bc */ 0x0000cddd, 0x0000c7a2, 0x0000c5c9, 0x00009bb4,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x03ed5 ***/
+
+ /* 80 */ 0x00009bb5, 0x0000c1f7, 0x00009bb6, 0x0000e4a4,
+ /* 84 */ 0x00009bb7, 0x0000c7b3, 0x0000bdac, 0x0000bdbd,
+ /* 88 */ 0x0000e4a5, 0x00009bb8, 0x0000d7c7, 0x0000b2e2,
+ /* 8c */ 0x00009bb9, 0x0000e4ab, 0x0000bcc3, 0x0000e4af,
+ /* 90 */ 0x00009bba, 0x0000bbeb, 0x0000e4b0, 0x0000c5a8,
+ /* 94 */ 0x0000e4b1, 0x00009bbb, 0x00009bbc, 0x00009bbd,
+ /* 98 */ 0x00009bbe, 0x0000d5e3, 0x0000bfa3, 0x00009bbf,
+ /* 9c */ 0x0000e4ba, 0x00009bc0, 0x0000e4b7, 0x00009bc1,
+ /* a0 */ 0x0000e4bb, 0x00009bc2, 0x00009bc3, 0x0000e4bd,
+ /* a4 */ 0x00009bc4, 0x00009bc5, 0x0000c6d6, 0x00009bc6,
+ /* a8 */ 0x00009bc7, 0x0000bac6, 0x0000c0cb, 0x00009bc8,
+ /* ac */ 0x00009bc9, 0x00009bca, 0x0000b8a1, 0x0000e4b4,
+ /* b0 */ 0x00009bcb, 0x00009bcc, 0x00009bcd, 0x00009bce,
+ /* b4 */ 0x0000d4a1, 0x00009bcf, 0x00009bd0, 0x0000baa3,
+ /* b8 */ 0x0000bdfe, 0x00009bd1, 0x00009bd2, 0x00009bd3,
+ /* bc */ 0x0000e4bc, 0x00009bd4, 0x00009bd5, 0x00009bd6,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x03f15 ***/
+
+ /* 80 */ 0x00009bd7, 0x00009bd8, 0x0000cdbf, 0x00009bd9,
+ /* 84 */ 0x00009bda, 0x0000c4f9, 0x00009bdb, 0x00009bdc,
+ /* 88 */ 0x0000cffb, 0x0000c9e6, 0x00009bdd, 0x00009bde,
+ /* 8c */ 0x0000d3bf, 0x00009bdf, 0x0000cfd1, 0x00009be0,
+ /* 90 */ 0x00009be1, 0x0000e4b3, 0x00009be2, 0x0000e4b8,
+ /* 94 */ 0x0000e4b9, 0x0000cce9, 0x00009be3, 0x00009be4,
+ /* 98 */ 0x00009be5, 0x00009be6, 0x00009be7, 0x0000ccce,
+ /* 9c */ 0x00009be8, 0x0000c0d4, 0x0000e4b5, 0x0000c1b0,
+ /* a0 */ 0x0000e4b6, 0x0000ced0, 0x00009be9, 0x0000bbc1,
+ /* a4 */ 0x0000b5d3, 0x00009bea, 0x0000c8f3, 0x0000bda7,
+ /* a8 */ 0x0000d5c7, 0x0000c9ac, 0x0000b8a2, 0x0000e4ca,
+ /* ac */ 0x00009beb, 0x00009bec, 0x0000e4cc, 0x0000d1c4,
+ /* b0 */ 0x00009bed, 0x00009bee, 0x0000d2ba, 0x00009bef,
+ /* b4 */ 0x00009bf0, 0x0000baad, 0x00009bf1, 0x00009bf2,
+ /* b8 */ 0x0000bad4, 0x00009bf3, 0x00009bf4, 0x00009bf5,
+ /* bc */ 0x00009bf6, 0x00009bf7, 0x00009bf8, 0x0000e4c3,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x03f55 ***/
+
+ /* 80 */ 0x0000b5ed, 0x00009bf9, 0x00009bfa, 0x00009bfb,
+ /* 84 */ 0x0000d7cd, 0x0000e4c0, 0x0000cffd, 0x0000e4bf,
+ /* 88 */ 0x00009bfc, 0x00009bfd, 0x00009bfe, 0x0000c1dc,
+ /* 8c */ 0x0000ccca, 0x00009c40, 0x00009c41, 0x00009c42,
+ /* 90 */ 0x00009c43, 0x0000cae7, 0x00009c44, 0x00009c45,
+ /* 94 */ 0x00009c46, 0x00009c47, 0x0000c4d7, 0x00009c48,
+ /* 98 */ 0x0000ccd4, 0x0000e4c8, 0x00009c49, 0x00009c4a,
+ /* 9c */ 0x00009c4b, 0x0000e4c7, 0x0000e4c1, 0x00009c4c,
+ /* a0 */ 0x0000e4c4, 0x0000b5ad, 0x00009c4d, 0x00009c4e,
+ /* a4 */ 0x0000d3d9, 0x00009c4f, 0x0000e4c6, 0x00009c50,
+ /* a8 */ 0x00009c51, 0x00009c52, 0x00009c53, 0x0000d2f9,
+ /* ac */ 0x0000b4e3, 0x00009c54, 0x0000bbb4, 0x00009c55,
+ /* b0 */ 0x00009c56, 0x0000c9ee, 0x00009c57, 0x0000b4be,
+ /* b4 */ 0x00009c58, 0x00009c59, 0x00009c5a, 0x0000bbec,
+ /* b8 */ 0x00009c5b, 0x0000d1cd, 0x00009c5c, 0x0000cced,
+ /* bc */ 0x0000edb5, 0x00009c5d, 0x00009c5e, 0x00009c5f,
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x03f95 ***/
+
+ /* 80 */ 0x00009c60, 0x00009c61, 0x00009c62, 0x00009c63,
+ /* 84 */ 0x00009c64, 0x0000c7e5, 0x00009c65, 0x00009c66,
+ /* 88 */ 0x00009c67, 0x00009c68, 0x0000d4a8, 0x00009c69,
+ /* 8c */ 0x0000e4cb, 0x0000d7d5, 0x0000e4c2, 0x00009c6a,
+ /* 90 */ 0x0000bda5, 0x0000e4c5, 0x00009c6b, 0x00009c6c,
+ /* 94 */ 0x0000d3e6, 0x00009c6d, 0x0000e4c9, 0x0000c9f8,
+ /* 98 */ 0x00009c6e, 0x00009c6f, 0x0000e4be, 0x00009c70,
+ /* 9c */ 0x00009c71, 0x0000d3e5, 0x00009c72, 0x00009c73,
+ /* a0 */ 0x0000c7fe, 0x0000b6c9, 0x00009c74, 0x0000d4fc,
+ /* a4 */ 0x0000b2b3, 0x0000e4d7, 0x00009c75, 0x00009c76,
+ /* a8 */ 0x00009c77, 0x0000cec2, 0x00009c78, 0x0000e4cd,
+ /* ac */ 0x00009c79, 0x0000cebc, 0x00009c7a, 0x0000b8db,
+ /* b0 */ 0x00009c7b, 0x00009c7c, 0x0000e4d6, 0x00009c7d,
+ /* b4 */ 0x0000bfca, 0x00009c7e, 0x00009c80, 0x00009c81,
+ /* b8 */ 0x0000d3ce, 0x00009c82, 0x0000c3ec, 0x00009c83,
+ /* bc */ 0x00009c84, 0x00009c85, 0x00009c86, 0x00009c87,
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x03fd5 ***/
+
+ /* 80 */ 0x00009c88, 0x00009c89, 0x00009c8a, 0x0000c5c8,
+ /* 84 */ 0x0000e4d8, 0x00009c8b, 0x00009c8c, 0x00009c8d,
+ /* 88 */ 0x00009c8e, 0x00009c8f, 0x00009c90, 0x00009c91,
+ /* 8c */ 0x00009c92, 0x0000cdc4, 0x0000e4cf, 0x00009c93,
+ /* 90 */ 0x00009c94, 0x00009c95, 0x00009c96, 0x0000e4d4,
+ /* 94 */ 0x0000e4d5, 0x00009c97, 0x0000bafe, 0x00009c98,
+ /* 98 */ 0x0000cfe6, 0x00009c99, 0x00009c9a, 0x0000d5bf,
+ /* 9c */ 0x00009c9b, 0x00009c9c, 0x00009c9d, 0x0000e4d2,
+ /* a0 */ 0x00009c9e, 0x00009c9f, 0x00009ca0, 0x00009ca1,
+ /* a4 */ 0x00009ca2, 0x00009ca3, 0x00009ca4, 0x00009ca5,
+ /* a8 */ 0x00009ca6, 0x00009ca7, 0x00009ca8, 0x0000e4d0,
+ /* ac */ 0x00009ca9, 0x00009caa, 0x0000e4ce, 0x00009cab,
+ /* b0 */ 0x00009cac, 0x00009cad, 0x00009cae, 0x00009caf,
+ /* b4 */ 0x00009cb0, 0x00009cb1, 0x00009cb2, 0x00009cb3,
+ /* b8 */ 0x00009cb4, 0x00009cb5, 0x00009cb6, 0x00009cb7,
+ /* bc */ 0x00009cb8, 0x00009cb9, 0x0000cde5, 0x0000caaa,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x04015 ***/
+
+ /* 80 */ 0x00009cba, 0x00009cbb, 0x00009cbc, 0x0000c0a3,
+ /* 84 */ 0x00009cbd, 0x0000bda6, 0x0000e4d3, 0x00009cbe,
+ /* 88 */ 0x00009cbf, 0x0000b8c8, 0x00009cc0, 0x00009cc1,
+ /* 8c */ 0x00009cc2, 0x00009cc3, 0x00009cc4, 0x0000e4e7,
+ /* 90 */ 0x0000d4b4, 0x00009cc5, 0x00009cc6, 0x00009cc7,
+ /* 94 */ 0x00009cc8, 0x00009cc9, 0x00009cca, 0x00009ccb,
+ /* 98 */ 0x0000e4db, 0x00009ccc, 0x00009ccd, 0x00009cce,
+ /* 9c */ 0x0000c1ef, 0x00009ccf, 0x00009cd0, 0x0000e4e9,
+ /* a0 */ 0x00009cd1, 0x00009cd2, 0x0000d2e7, 0x00009cd3,
+ /* a4 */ 0x00009cd4, 0x0000e4df, 0x00009cd5, 0x0000e4e0,
+ /* a8 */ 0x00009cd6, 0x00009cd7, 0x0000cfaa, 0x00009cd8,
+ /* ac */ 0x00009cd9, 0x00009cda, 0x00009cdb, 0x0000cbdd,
+ /* b0 */ 0x00009cdc, 0x0000e4da, 0x0000e4d1, 0x00009cdd,
+ /* b4 */ 0x0000e4e5, 0x00009cde, 0x0000c8dc, 0x0000e4e3,
+ /* b8 */ 0x00009cdf, 0x00009ce0, 0x0000c4e7, 0x0000e4e2,
+ /* bc */ 0x00009ce1, 0x0000e4e1, 0x00009ce2, 0x00009ce3,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x04055 ***/
+
+ /* 80 */ 0x00009ce4, 0x0000b3fc, 0x0000e4e8, 0x00009ce5,
+ /* 84 */ 0x00009ce6, 0x00009ce7, 0x00009ce8, 0x0000b5e1,
+ /* 88 */ 0x00009ce9, 0x00009cea, 0x00009ceb, 0x0000d7cc,
+ /* 8c */ 0x00009cec, 0x00009ced, 0x00009cee, 0x0000e4e6,
+ /* 90 */ 0x00009cef, 0x0000bbac, 0x00009cf0, 0x0000d7d2,
+ /* 94 */ 0x0000cccf, 0x0000ebf8, 0x00009cf1, 0x0000e4e4,
+ /* 98 */ 0x00009cf2, 0x00009cf3, 0x0000b9f6, 0x00009cf4,
+ /* 9c */ 0x00009cf5, 0x00009cf6, 0x0000d6cd, 0x0000e4d9,
+ /* a0 */ 0x0000e4dc, 0x0000c2fa, 0x0000e4de, 0x00009cf7,
+ /* a4 */ 0x0000c2cb, 0x0000c0c4, 0x0000c2d0, 0x00009cf8,
+ /* a8 */ 0x0000b1f5, 0x0000ccb2, 0x00009cf9, 0x00009cfa,
+ /* ac */ 0x00009cfb, 0x00009cfc, 0x00009cfd, 0x00009cfe,
+ /* b0 */ 0x00009d40, 0x00009d41, 0x00009d42, 0x00009d43,
+ /* b4 */ 0x0000b5ce, 0x00009d44, 0x00009d45, 0x00009d46,
+ /* b8 */ 0x00009d47, 0x0000e4ef, 0x00009d48, 0x00009d49,
+ /* bc */ 0x00009d4a, 0x00009d4b, 0x00009d4c, 0x00009d4d,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x04095 ***/
+
+ /* 80 */ 0x00009d4e, 0x00009d4f, 0x0000c6af, 0x00009d50,
+ /* 84 */ 0x00009d51, 0x00009d52, 0x0000c6e1, 0x00009d53,
+ /* 88 */ 0x00009d54, 0x0000e4f5, 0x00009d55, 0x00009d56,
+ /* 8c */ 0x00009d57, 0x00009d58, 0x00009d59, 0x0000c2a9,
+ /* 90 */ 0x00009d5a, 0x00009d5b, 0x00009d5c, 0x0000c0ec,
+ /* 94 */ 0x0000d1dd, 0x0000e4ee, 0x00009d5d, 0x00009d5e,
+ /* 98 */ 0x00009d5f, 0x00009d60, 0x00009d61, 0x00009d62,
+ /* 9c */ 0x00009d63, 0x00009d64, 0x00009d65, 0x00009d66,
+ /* a0 */ 0x0000c4ae, 0x00009d67, 0x00009d68, 0x00009d69,
+ /* a4 */ 0x0000e4ed, 0x00009d6a, 0x00009d6b, 0x00009d6c,
+ /* a8 */ 0x00009d6d, 0x0000e4f6, 0x0000e4f4, 0x0000c2fe,
+ /* ac */ 0x00009d6e, 0x0000e4dd, 0x00009d6f, 0x0000e4f0,
+ /* b0 */ 0x00009d70, 0x0000cafe, 0x00009d71, 0x0000d5c4,
+ /* b4 */ 0x00009d72, 0x00009d73, 0x0000e4f1, 0x00009d74,
+ /* b8 */ 0x00009d75, 0x00009d76, 0x00009d77, 0x00009d78,
+ /* bc */ 0x00009d79, 0x00009d7a, 0x0000d1fa, 0x00009d7b,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x040d5 ***/
+
+ /* 80 */ 0x00009d7c, 0x00009d7d, 0x00009d7e, 0x00009d80,
+ /* 84 */ 0x00009d81, 0x00009d82, 0x0000e4eb, 0x0000e4ec,
+ /* 88 */ 0x00009d83, 0x00009d84, 0x00009d85, 0x0000e4f2,
+ /* 8c */ 0x00009d86, 0x0000ceab, 0x00009d87, 0x00009d88,
+ /* 90 */ 0x00009d89, 0x00009d8a, 0x00009d8b, 0x00009d8c,
+ /* 94 */ 0x00009d8d, 0x00009d8e, 0x00009d8f, 0x00009d90,
+ /* 98 */ 0x0000c5cb, 0x00009d91, 0x00009d92, 0x00009d93,
+ /* 9c */ 0x0000c7b1, 0x00009d94, 0x0000c2ba, 0x00009d95,
+ /* a0 */ 0x00009d96, 0x00009d97, 0x0000e4ea, 0x00009d98,
+ /* a4 */ 0x00009d99, 0x00009d9a, 0x0000c1ca, 0x00009d9b,
+ /* a8 */ 0x00009d9c, 0x00009d9d, 0x00009d9e, 0x00009d9f,
+ /* ac */ 0x00009da0, 0x0000ccb6, 0x0000b3b1, 0x00009da1,
+ /* b0 */ 0x00009da2, 0x00009da3, 0x0000e4fb, 0x00009da4,
+ /* b4 */ 0x0000e4f3, 0x00009da5, 0x00009da6, 0x00009da7,
+ /* b8 */ 0x0000e4fa, 0x00009da8, 0x0000e4fd, 0x00009da9,
+ /* bc */ 0x0000e4fc, 0x00009daa, 0x00009dab, 0x00009dac,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x04115 ***/
+
+ /* 80 */ 0x00009dad, 0x00009dae, 0x00009daf, 0x00009db0,
+ /* 84 */ 0x0000b3ce, 0x00009db1, 0x00009db2, 0x00009db3,
+ /* 88 */ 0x0000b3ba, 0x0000e4f7, 0x00009db4, 0x00009db5,
+ /* 8c */ 0x0000e4f9, 0x0000e4f8, 0x0000c5ec, 0x00009db6,
+ /* 90 */ 0x00009db7, 0x00009db8, 0x00009db9, 0x00009dba,
+ /* 94 */ 0x00009dbb, 0x00009dbc, 0x00009dbd, 0x00009dbe,
+ /* 98 */ 0x00009dbf, 0x00009dc0, 0x00009dc1, 0x00009dc2,
+ /* 9c */ 0x0000c0bd, 0x00009dc3, 0x00009dc4, 0x00009dc5,
+ /* a0 */ 0x00009dc6, 0x0000d4e8, 0x00009dc7, 0x00009dc8,
+ /* a4 */ 0x00009dc9, 0x00009dca, 0x00009dcb, 0x0000e5a2,
+ /* a8 */ 0x00009dcc, 0x00009dcd, 0x00009dce, 0x00009dcf,
+ /* ac */ 0x00009dd0, 0x00009dd1, 0x00009dd2, 0x00009dd3,
+ /* b0 */ 0x00009dd4, 0x00009dd5, 0x00009dd6, 0x0000b0c4,
+ /* b4 */ 0x00009dd7, 0x00009dd8, 0x0000e5a4, 0x00009dd9,
+ /* b8 */ 0x00009dda, 0x0000e5a3, 0x00009ddb, 0x00009ddc,
+ /* bc */ 0x00009ddd, 0x00009dde, 0x00009ddf, 0x00009de0,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x04155 ***/
+
+ /* 80 */ 0x0000bca4, 0x00009de1, 0x0000e5a5, 0x00009de2,
+ /* 84 */ 0x00009de3, 0x00009de4, 0x00009de5, 0x00009de6,
+ /* 88 */ 0x00009de7, 0x0000e5a1, 0x00009de8, 0x00009de9,
+ /* 8c */ 0x00009dea, 0x00009deb, 0x00009dec, 0x00009ded,
+ /* 90 */ 0x00009dee, 0x0000e4fe, 0x0000b1f4, 0x00009def,
+ /* 94 */ 0x00009df0, 0x00009df1, 0x00009df2, 0x00009df3,
+ /* 98 */ 0x00009df4, 0x00009df5, 0x00009df6, 0x00009df7,
+ /* 9c */ 0x00009df8, 0x00009df9, 0x0000e5a8, 0x00009dfa,
+ /* a0 */ 0x0000e5a9, 0x0000e5a6, 0x00009dfb, 0x00009dfc,
+ /* a4 */ 0x00009dfd, 0x00009dfe, 0x00009e40, 0x00009e41,
+ /* a8 */ 0x00009e42, 0x00009e43, 0x00009e44, 0x00009e45,
+ /* ac */ 0x00009e46, 0x00009e47, 0x0000e5a7, 0x0000e5aa,
+ /* b0 */ 0x00009e48, 0x00009e49, 0x00009e4a, 0x00009e4b,
+ /* b4 */ 0x00009e4c, 0x00009e4d, 0x00009e4e, 0x00009e4f,
+ /* b8 */ 0x00009e50, 0x00009e51, 0x00009e52, 0x00009e53,
+ /* bc */ 0x00009e54, 0x00009e55, 0x00009e56, 0x00009e57,
+
+ /*** Three byte table, leaf: e780xx - offset 0x04195 ***/
+
+ /* 80 */ 0x00009e58, 0x00009e59, 0x00009e5a, 0x00009e5b,
+ /* 84 */ 0x00009e5c, 0x00009e5d, 0x00009e5e, 0x00009e5f,
+ /* 88 */ 0x00009e60, 0x00009e61, 0x00009e62, 0x00009e63,
+ /* 8c */ 0x00009e64, 0x00009e65, 0x00009e66, 0x00009e67,
+ /* 90 */ 0x00009e68, 0x0000c6d9, 0x00009e69, 0x00009e6a,
+ /* 94 */ 0x00009e6b, 0x00009e6c, 0x00009e6d, 0x00009e6e,
+ /* 98 */ 0x00009e6f, 0x00009e70, 0x0000e5ab, 0x0000e5ad,
+ /* 9c */ 0x00009e71, 0x00009e72, 0x00009e73, 0x00009e74,
+ /* a0 */ 0x00009e75, 0x00009e76, 0x00009e77, 0x0000e5ac,
+ /* a4 */ 0x00009e78, 0x00009e79, 0x00009e7a, 0x00009e7b,
+ /* a8 */ 0x00009e7c, 0x00009e7d, 0x00009e7e, 0x00009e80,
+ /* ac */ 0x00009e81, 0x00009e82, 0x00009e83, 0x00009e84,
+ /* b0 */ 0x00009e85, 0x00009e86, 0x00009e87, 0x00009e88,
+ /* b4 */ 0x00009e89, 0x0000e5af, 0x00009e8a, 0x00009e8b,
+ /* b8 */ 0x00009e8c, 0x0000e5ae, 0x00009e8d, 0x00009e8e,
+ /* bc */ 0x00009e8f, 0x00009e90, 0x00009e91, 0x00009e92,
+
+ /*** Three byte table, leaf: e781xx - offset 0x041d5 ***/
+
+ /* 80 */ 0x00009e93, 0x00009e94, 0x00009e95, 0x00009e96,
+ /* 84 */ 0x00009e97, 0x00009e98, 0x00009e99, 0x00009e9a,
+ /* 88 */ 0x00009e9b, 0x00009e9c, 0x00009e9d, 0x00009e9e,
+ /* 8c */ 0x0000b9e0, 0x00009e9f, 0x00009ea0, 0x0000e5b0,
+ /* 90 */ 0x00009ea1, 0x00009ea2, 0x00009ea3, 0x00009ea4,
+ /* 94 */ 0x00009ea5, 0x00009ea6, 0x00009ea7, 0x00009ea8,
+ /* 98 */ 0x00009ea9, 0x00009eaa, 0x00009eab, 0x00009eac,
+ /* 9c */ 0x00009ead, 0x00009eae, 0x0000e5b1, 0x00009eaf,
+ /* a0 */ 0x00009eb0, 0x00009eb1, 0x00009eb2, 0x00009eb3,
+ /* a4 */ 0x00009eb4, 0x00009eb5, 0x00009eb6, 0x00009eb7,
+ /* a8 */ 0x00009eb8, 0x00009eb9, 0x00009eba, 0x0000bbf0,
+ /* ac */ 0x0000ece1, 0x0000c3f0, 0x00009ebb, 0x0000b5c6,
+ /* b0 */ 0x0000bbd2, 0x00009ebc, 0x00009ebd, 0x00009ebe,
+ /* b4 */ 0x00009ebf, 0x0000c1e9, 0x0000d4ee, 0x00009ec0,
+ /* b8 */ 0x0000bec4, 0x00009ec1, 0x00009ec2, 0x00009ec3,
+ /* bc */ 0x0000d7c6, 0x00009ec4, 0x0000d4d6, 0x0000b2d3,
+
+ /*** Three byte table, leaf: e782xx - offset 0x04215 ***/
+
+ /* 80 */ 0x0000ecbe, 0x00009ec5, 0x00009ec6, 0x00009ec7,
+ /* 84 */ 0x00009ec8, 0x0000eac1, 0x00009ec9, 0x00009eca,
+ /* 88 */ 0x00009ecb, 0x0000c2af, 0x0000b4b6, 0x00009ecc,
+ /* 8c */ 0x00009ecd, 0x00009ece, 0x0000d1d7, 0x00009ecf,
+ /* 90 */ 0x00009ed0, 0x00009ed1, 0x0000b3b4, 0x00009ed2,
+ /* 94 */ 0x0000c8b2, 0x0000bfbb, 0x0000ecc0, 0x00009ed3,
+ /* 98 */ 0x00009ed4, 0x0000d6cb, 0x00009ed5, 0x00009ed6,
+ /* 9c */ 0x0000ecbf, 0x0000ecc1, 0x00009ed7, 0x00009ed8,
+ /* a0 */ 0x00009ed9, 0x00009eda, 0x00009edb, 0x00009edc,
+ /* a4 */ 0x00009edd, 0x00009ede, 0x00009edf, 0x00009ee0,
+ /* a8 */ 0x00009ee1, 0x00009ee2, 0x00009ee3, 0x0000ecc5,
+ /* ac */ 0x0000bee6, 0x0000ccbf, 0x0000c5da, 0x0000bebc,
+ /* b0 */ 0x00009ee4, 0x0000ecc6, 0x00009ee5, 0x0000b1fe,
+ /* b4 */ 0x00009ee6, 0x00009ee7, 0x00009ee8, 0x0000ecc4,
+ /* b8 */ 0x0000d5a8, 0x0000b5e3, 0x00009ee9, 0x0000ecc2,
+ /* bc */ 0x0000c1b6, 0x0000b3e3, 0x00009eea, 0x00009eeb,
+
+ /*** Three byte table, leaf: e783xx - offset 0x04255 ***/
+
+ /* 80 */ 0x0000ecc3, 0x0000cbb8, 0x0000c0c3, 0x0000ccfe,
+ /* 84 */ 0x00009eec, 0x00009eed, 0x00009eee, 0x00009eef,
+ /* 88 */ 0x0000c1d2, 0x00009ef0, 0x0000ecc8, 0x00009ef1,
+ /* 8c */ 0x00009ef2, 0x00009ef3, 0x00009ef4, 0x00009ef5,
+ /* 90 */ 0x00009ef6, 0x00009ef7, 0x00009ef8, 0x00009ef9,
+ /* 94 */ 0x00009efa, 0x00009efb, 0x00009efc, 0x00009efd,
+ /* 98 */ 0x0000bae6, 0x0000c0d3, 0x00009efe, 0x0000d6f2,
+ /* 9c */ 0x00009f40, 0x00009f41, 0x00009f42, 0x0000d1cc,
+ /* a0 */ 0x00009f43, 0x00009f44, 0x00009f45, 0x00009f46,
+ /* a4 */ 0x0000bfbe, 0x00009f47, 0x0000b7b3, 0x0000c9d5,
+ /* a8 */ 0x0000ecc7, 0x0000bbe2, 0x00009f48, 0x0000cccc,
+ /* ac */ 0x0000bdfd, 0x0000c8c8, 0x00009f49, 0x0000cfa9,
+ /* b0 */ 0x00009f4a, 0x00009f4b, 0x00009f4c, 0x00009f4d,
+ /* b4 */ 0x00009f4e, 0x00009f4f, 0x00009f50, 0x0000cde9,
+ /* b8 */ 0x00009f51, 0x0000c5eb, 0x00009f52, 0x00009f53,
+ /* bc */ 0x00009f54, 0x0000b7e9, 0x00009f55, 0x00009f56,
+
+ /*** Three byte table, leaf: e784xx - offset 0x04295 ***/
+
+ /* 80 */ 0x00009f57, 0x00009f58, 0x00009f59, 0x00009f5a,
+ /* 84 */ 0x00009f5b, 0x00009f5c, 0x00009f5d, 0x00009f5e,
+ /* 88 */ 0x00009f5f, 0x0000d1c9, 0x0000bab8, 0x00009f60,
+ /* 8c */ 0x00009f61, 0x00009f62, 0x00009f63, 0x00009f64,
+ /* 90 */ 0x0000ecc9, 0x00009f65, 0x00009f66, 0x0000ecca,
+ /* 94 */ 0x00009f67, 0x0000bbc0, 0x0000eccb, 0x00009f68,
+ /* 98 */ 0x0000ece2, 0x0000b1ba, 0x0000b7d9, 0x00009f69,
+ /* 9c */ 0x00009f6a, 0x00009f6b, 0x00009f6c, 0x00009f6d,
+ /* a0 */ 0x00009f6e, 0x00009f6f, 0x00009f70, 0x00009f71,
+ /* a4 */ 0x00009f72, 0x00009f73, 0x0000bdb9, 0x00009f74,
+ /* a8 */ 0x00009f75, 0x00009f76, 0x00009f77, 0x00009f78,
+ /* ac */ 0x00009f79, 0x00009f7a, 0x00009f7b, 0x0000eccc,
+ /* b0 */ 0x0000d1e6, 0x0000eccd, 0x00009f7c, 0x00009f7d,
+ /* b4 */ 0x00009f7e, 0x00009f80, 0x0000c8bb, 0x00009f81,
+ /* b8 */ 0x00009f82, 0x00009f83, 0x00009f84, 0x00009f85,
+ /* bc */ 0x00009f86, 0x00009f87, 0x00009f88, 0x00009f89,
+
+ /*** Three byte table, leaf: e785xx - offset 0x042d5 ***/
+
+ /* 80 */ 0x00009f8a, 0x00009f8b, 0x00009f8c, 0x00009f8d,
+ /* 84 */ 0x00009f8e, 0x0000ecd1, 0x00009f8f, 0x00009f90,
+ /* 88 */ 0x00009f91, 0x00009f92, 0x0000ecd3, 0x00009f93,
+ /* 8c */ 0x0000bbcd, 0x00009f94, 0x0000bce5, 0x00009f95,
+ /* 90 */ 0x00009f96, 0x00009f97, 0x00009f98, 0x00009f99,
+ /* 94 */ 0x00009f9a, 0x00009f9b, 0x00009f9c, 0x00009f9d,
+ /* 98 */ 0x00009f9e, 0x00009f9f, 0x00009fa0, 0x00009fa1,
+ /* 9c */ 0x0000eccf, 0x00009fa2, 0x0000c9b7, 0x00009fa3,
+ /* a0 */ 0x00009fa4, 0x00009fa5, 0x00009fa6, 0x00009fa7,
+ /* a4 */ 0x0000c3ba, 0x00009fa8, 0x0000ece3, 0x0000d5d5,
+ /* a8 */ 0x0000ecd0, 0x00009fa9, 0x00009faa, 0x00009fab,
+ /* ac */ 0x00009fac, 0x00009fad, 0x0000d6f3, 0x00009fae,
+ /* b0 */ 0x00009faf, 0x00009fb0, 0x0000ecd2, 0x0000ecce,
+ /* b4 */ 0x00009fb1, 0x00009fb2, 0x00009fb3, 0x00009fb4,
+ /* b8 */ 0x0000ecd4, 0x00009fb5, 0x0000ecd5, 0x00009fb6,
+ /* bc */ 0x00009fb7, 0x0000c9bf, 0x00009fb8, 0x00009fb9,
+
+ /*** Three byte table, leaf: e786xx - offset 0x04315 ***/
+
+ /* 80 */ 0x00009fba, 0x00009fbb, 0x00009fbc, 0x00009fbd,
+ /* 84 */ 0x0000cfa8, 0x00009fbe, 0x00009fbf, 0x00009fc0,
+ /* 88 */ 0x00009fc1, 0x00009fc2, 0x0000d0dc, 0x00009fc3,
+ /* 8c */ 0x00009fc4, 0x00009fc5, 0x00009fc6, 0x0000d1ac,
+ /* 90 */ 0x00009fc7, 0x00009fc8, 0x00009fc9, 0x00009fca,
+ /* 94 */ 0x0000c8db, 0x00009fcb, 0x00009fcc, 0x00009fcd,
+ /* 98 */ 0x0000ecd6, 0x0000cef5, 0x00009fce, 0x00009fcf,
+ /* 9c */ 0x00009fd0, 0x00009fd1, 0x00009fd2, 0x0000caec,
+ /* a0 */ 0x0000ecda, 0x00009fd3, 0x00009fd4, 0x00009fd5,
+ /* a4 */ 0x00009fd6, 0x00009fd7, 0x00009fd8, 0x00009fd9,
+ /* a8 */ 0x0000ecd9, 0x00009fda, 0x00009fdb, 0x00009fdc,
+ /* ac */ 0x0000b0be, 0x00009fdd, 0x00009fde, 0x00009fdf,
+ /* b0 */ 0x00009fe0, 0x00009fe1, 0x00009fe2, 0x0000ecd7,
+ /* b4 */ 0x00009fe3, 0x0000ecd8, 0x00009fe4, 0x00009fe5,
+ /* b8 */ 0x00009fe6, 0x0000ece4, 0x00009fe7, 0x00009fe8,
+ /* bc */ 0x00009fe9, 0x00009fea, 0x00009feb, 0x00009fec,
+
+ /*** Three byte table, leaf: e787xx - offset 0x04355 ***/
+
+ /* 80 */ 0x00009fed, 0x00009fee, 0x00009fef, 0x0000c8bc,
+ /* 84 */ 0x00009ff0, 0x00009ff1, 0x00009ff2, 0x00009ff3,
+ /* 88 */ 0x00009ff4, 0x00009ff5, 0x00009ff6, 0x00009ff7,
+ /* 8c */ 0x00009ff8, 0x00009ff9, 0x0000c1c7, 0x00009ffa,
+ /* 90 */ 0x00009ffb, 0x00009ffc, 0x00009ffd, 0x00009ffe,
+ /* 94 */ 0x0000ecdc, 0x0000d1e0, 0x0000a040, 0x0000a041,
+ /* 98 */ 0x0000a042, 0x0000a043, 0x0000a044, 0x0000a045,
+ /* 9c */ 0x0000a046, 0x0000a047, 0x0000a048, 0x0000a049,
+ /* a0 */ 0x0000ecdb, 0x0000a04a, 0x0000a04b, 0x0000a04c,
+ /* a4 */ 0x0000a04d, 0x0000d4ef, 0x0000a04e, 0x0000ecdd,
+ /* a8 */ 0x0000a04f, 0x0000a050, 0x0000a051, 0x0000a052,
+ /* ac */ 0x0000a053, 0x0000a054, 0x0000dbc6, 0x0000a055,
+ /* b0 */ 0x0000a056, 0x0000a057, 0x0000a058, 0x0000a059,
+ /* b4 */ 0x0000a05a, 0x0000a05b, 0x0000a05c, 0x0000a05d,
+ /* b8 */ 0x0000a05e, 0x0000ecde, 0x0000a05f, 0x0000a060,
+ /* bc */ 0x0000a061, 0x0000a062, 0x0000a063, 0x0000a064,
+
+ /*** Three byte table, leaf: e788xx - offset 0x04395 ***/
+
+ /* 80 */ 0x0000a065, 0x0000a066, 0x0000a067, 0x0000a068,
+ /* 84 */ 0x0000a069, 0x0000a06a, 0x0000b1ac, 0x0000a06b,
+ /* 88 */ 0x0000a06c, 0x0000a06d, 0x0000a06e, 0x0000a06f,
+ /* 8c */ 0x0000a070, 0x0000a071, 0x0000a072, 0x0000a073,
+ /* 90 */ 0x0000a074, 0x0000a075, 0x0000a076, 0x0000a077,
+ /* 94 */ 0x0000a078, 0x0000a079, 0x0000a07a, 0x0000a07b,
+ /* 98 */ 0x0000a07c, 0x0000a07d, 0x0000a07e, 0x0000a080,
+ /* 9c */ 0x0000a081, 0x0000ecdf, 0x0000a082, 0x0000a083,
+ /* a0 */ 0x0000a084, 0x0000a085, 0x0000a086, 0x0000a087,
+ /* a4 */ 0x0000a088, 0x0000a089, 0x0000a08a, 0x0000a08b,
+ /* a8 */ 0x0000ece0, 0x0000a08c, 0x0000d7a6, 0x0000a08d,
+ /* ac */ 0x0000c5c0, 0x0000a08e, 0x0000a08f, 0x0000a090,
+ /* b0 */ 0x0000ebbc, 0x0000b0ae, 0x0000a091, 0x0000a092,
+ /* b4 */ 0x0000a093, 0x0000bef4, 0x0000b8b8, 0x0000d2af,
+ /* b8 */ 0x0000b0d6, 0x0000b5f9, 0x0000a094, 0x0000d8b3,
+ /* bc */ 0x0000a095, 0x0000cbac, 0x0000a096, 0x0000e3dd,
+
+ /*** Three byte table, leaf: e789xx - offset 0x043d5 ***/
+
+ /* 80 */ 0x0000a097, 0x0000a098, 0x0000a099, 0x0000a09a,
+ /* 84 */ 0x0000a09b, 0x0000a09c, 0x0000a09d, 0x0000c6ac,
+ /* 88 */ 0x0000b0e6, 0x0000a09e, 0x0000a09f, 0x0000a0a0,
+ /* 8c */ 0x0000c5c6, 0x0000ebb9, 0x0000a0a1, 0x0000a0a2,
+ /* 90 */ 0x0000a0a3, 0x0000a0a4, 0x0000ebba, 0x0000a0a5,
+ /* 94 */ 0x0000a0a6, 0x0000a0a7, 0x0000ebbb, 0x0000a0a8,
+ /* 98 */ 0x0000a0a9, 0x0000d1c0, 0x0000a0aa, 0x0000c5a3,
+ /* 9c */ 0x0000a0ab, 0x0000eaf2, 0x0000a0ac, 0x0000c4b2,
+ /* a0 */ 0x0000a0ad, 0x0000c4b5, 0x0000c0ce, 0x0000a0ae,
+ /* a4 */ 0x0000a0af, 0x0000a0b0, 0x0000eaf3, 0x0000c4c1,
+ /* a8 */ 0x0000a0b1, 0x0000ceef, 0x0000a0b2, 0x0000a0b3,
+ /* ac */ 0x0000a0b4, 0x0000a0b5, 0x0000eaf0, 0x0000eaf4,
+ /* b0 */ 0x0000a0b6, 0x0000a0b7, 0x0000c9fc, 0x0000a0b8,
+ /* b4 */ 0x0000a0b9, 0x0000c7a3, 0x0000a0ba, 0x0000a0bb,
+ /* b8 */ 0x0000a0bc, 0x0000ccd8, 0x0000cefe, 0x0000a0bd,
+ /* bc */ 0x0000a0be, 0x0000a0bf, 0x0000eaf5, 0x0000eaf6,
+
+ /*** Three byte table, leaf: e78axx - offset 0x04415 ***/
+
+ /* 80 */ 0x0000cfac, 0x0000c0e7, 0x0000a0c0, 0x0000a0c1,
+ /* 84 */ 0x0000eaf7, 0x0000a0c2, 0x0000a0c3, 0x0000a0c4,
+ /* 88 */ 0x0000a0c5, 0x0000a0c6, 0x0000b6bf, 0x0000eaf8,
+ /* 8c */ 0x0000a0c7, 0x0000eaf9, 0x0000a0c8, 0x0000eafa,
+ /* 90 */ 0x0000a0c9, 0x0000a0ca, 0x0000eafb, 0x0000a0cb,
+ /* 94 */ 0x0000a0cc, 0x0000a0cd, 0x0000a0ce, 0x0000a0cf,
+ /* 98 */ 0x0000a0d0, 0x0000a0d1, 0x0000a0d2, 0x0000a0d3,
+ /* 9c */ 0x0000a0d4, 0x0000a0d5, 0x0000a0d6, 0x0000eaf1,
+ /* a0 */ 0x0000a0d7, 0x0000a0d8, 0x0000a0d9, 0x0000a0da,
+ /* a4 */ 0x0000a0db, 0x0000a0dc, 0x0000a0dd, 0x0000a0de,
+ /* a8 */ 0x0000a0df, 0x0000a0e0, 0x0000a0e1, 0x0000a0e2,
+ /* ac */ 0x0000c8ae, 0x0000e1eb, 0x0000a0e3, 0x0000b7b8,
+ /* b0 */ 0x0000e1ec, 0x0000a0e4, 0x0000a0e5, 0x0000a0e6,
+ /* b4 */ 0x0000e1ed, 0x0000a0e7, 0x0000d7b4, 0x0000e1ee,
+ /* b8 */ 0x0000e1ef, 0x0000d3cc, 0x0000a0e8, 0x0000a0e9,
+ /* bc */ 0x0000a0ea, 0x0000a0eb, 0x0000a0ec, 0x0000a0ed,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x04455 ***/
+
+ /* 80 */ 0x0000a0ee, 0x0000e1f1, 0x0000bff1, 0x0000e1f0,
+ /* 84 */ 0x0000b5d2, 0x0000a0ef, 0x0000a0f0, 0x0000a0f1,
+ /* 88 */ 0x0000b1b7, 0x0000a0f2, 0x0000a0f3, 0x0000a0f4,
+ /* 8c */ 0x0000a0f5, 0x0000e1f3, 0x0000e1f2, 0x0000a0f6,
+ /* 90 */ 0x0000bafc, 0x0000a0f7, 0x0000e1f4, 0x0000a0f8,
+ /* 94 */ 0x0000a0f9, 0x0000a0fa, 0x0000a0fb, 0x0000b9b7,
+ /* 98 */ 0x0000a0fc, 0x0000bed1, 0x0000a0fd, 0x0000a0fe,
+ /* 9c */ 0x0000aa40, 0x0000aa41, 0x0000c4fc, 0x0000aa42,
+ /* a0 */ 0x0000badd, 0x0000bdc6, 0x0000aa43, 0x0000aa44,
+ /* a4 */ 0x0000aa45, 0x0000aa46, 0x0000aa47, 0x0000aa48,
+ /* a8 */ 0x0000e1f5, 0x0000e1f7, 0x0000aa49, 0x0000aa4a,
+ /* ac */ 0x0000b6c0, 0x0000cfc1, 0x0000caa8, 0x0000e1f6,
+ /* b0 */ 0x0000d5f8, 0x0000d3fc, 0x0000e1f8, 0x0000e1fc,
+ /* b4 */ 0x0000e1f9, 0x0000aa4b, 0x0000aa4c, 0x0000e1fa,
+ /* b8 */ 0x0000c0ea, 0x0000aa4d, 0x0000e1fe, 0x0000e2a1,
+ /* bc */ 0x0000c0c7, 0x0000aa4e, 0x0000aa4f, 0x0000aa50,
+
+ /*** Three byte table, leaf: e78cxx - offset 0x04495 ***/
+
+ /* 80 */ 0x0000aa51, 0x0000e1fb, 0x0000aa52, 0x0000e1fd,
+ /* 84 */ 0x0000aa53, 0x0000aa54, 0x0000aa55, 0x0000aa56,
+ /* 88 */ 0x0000aa57, 0x0000aa58, 0x0000e2a5, 0x0000aa59,
+ /* 8c */ 0x0000aa5a, 0x0000aa5b, 0x0000c1d4, 0x0000aa5c,
+ /* 90 */ 0x0000aa5d, 0x0000aa5e, 0x0000aa5f, 0x0000e2a3,
+ /* 94 */ 0x0000aa60, 0x0000e2a8, 0x0000b2fe, 0x0000e2a2,
+ /* 98 */ 0x0000aa61, 0x0000aa62, 0x0000aa63, 0x0000c3cd,
+ /* 9c */ 0x0000b2c2, 0x0000e2a7, 0x0000e2a6, 0x0000aa64,
+ /* a0 */ 0x0000aa65, 0x0000e2a4, 0x0000e2a9, 0x0000aa66,
+ /* a4 */ 0x0000aa67, 0x0000e2ab, 0x0000aa68, 0x0000aa69,
+ /* a8 */ 0x0000aa6a, 0x0000d0c9, 0x0000d6ed, 0x0000c3a8,
+ /* ac */ 0x0000e2ac, 0x0000aa6b, 0x0000cfd7, 0x0000aa6c,
+ /* b0 */ 0x0000aa6d, 0x0000e2ae, 0x0000aa6e, 0x0000aa6f,
+ /* b4 */ 0x0000baef, 0x0000aa70, 0x0000aa71, 0x0000e9e0,
+ /* b8 */ 0x0000e2ad, 0x0000e2aa, 0x0000aa72, 0x0000aa73,
+ /* bc */ 0x0000aa74, 0x0000aa75, 0x0000bbab, 0x0000d4b3,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x044d5 ***/
+
+ /* 80 */ 0x0000aa76, 0x0000aa77, 0x0000aa78, 0x0000aa79,
+ /* 84 */ 0x0000aa7a, 0x0000aa7b, 0x0000aa7c, 0x0000aa7d,
+ /* 88 */ 0x0000aa7e, 0x0000aa80, 0x0000aa81, 0x0000aa82,
+ /* 8c */ 0x0000aa83, 0x0000e2b0, 0x0000aa84, 0x0000aa85,
+ /* 90 */ 0x0000e2af, 0x0000aa86, 0x0000e9e1, 0x0000aa87,
+ /* 94 */ 0x0000aa88, 0x0000aa89, 0x0000aa8a, 0x0000e2b1,
+ /* 98 */ 0x0000aa8b, 0x0000aa8c, 0x0000aa8d, 0x0000aa8e,
+ /* 9c */ 0x0000aa8f, 0x0000aa90, 0x0000aa91, 0x0000aa92,
+ /* a0 */ 0x0000e2b2, 0x0000aa93, 0x0000aa94, 0x0000aa95,
+ /* a4 */ 0x0000aa96, 0x0000aa97, 0x0000aa98, 0x0000aa99,
+ /* a8 */ 0x0000aa9a, 0x0000aa9b, 0x0000aa9c, 0x0000aa9d,
+ /* ac */ 0x0000e2b3, 0x0000cca1, 0x0000aa9e, 0x0000e2b4,
+ /* b0 */ 0x0000aa9f, 0x0000aaa0, 0x0000ab40, 0x0000ab41,
+ /* b4 */ 0x0000ab42, 0x0000ab43, 0x0000ab44, 0x0000ab45,
+ /* b8 */ 0x0000ab46, 0x0000ab47, 0x0000ab48, 0x0000ab49,
+ /* bc */ 0x0000ab4a, 0x0000ab4b, 0x0000e2b5, 0x0000ab4c,
+
+ /*** Three byte table, leaf: e78exx - offset 0x04515 ***/
+
+ /* 80 */ 0x0000ab4d, 0x0000ab4e, 0x0000ab4f, 0x0000ab50,
+ /* 84 */ 0x0000d0fe, 0x0000ab51, 0x0000ab52, 0x0000c2ca,
+ /* 88 */ 0x0000ab53, 0x0000d3f1, 0x0000ab54, 0x0000cdf5,
+ /* 8c */ 0x0000ab55, 0x0000ab56, 0x0000e7e0, 0x0000ab57,
+ /* 90 */ 0x0000ab58, 0x0000e7e1, 0x0000ab59, 0x0000ab5a,
+ /* 94 */ 0x0000ab5b, 0x0000ab5c, 0x0000bec1, 0x0000ab5d,
+ /* 98 */ 0x0000ab5e, 0x0000ab5f, 0x0000ab60, 0x0000c2ea,
+ /* 9c */ 0x0000ab61, 0x0000ab62, 0x0000ab63, 0x0000e7e4,
+ /* a0 */ 0x0000ab64, 0x0000ab65, 0x0000e7e3, 0x0000ab66,
+ /* a4 */ 0x0000ab67, 0x0000ab68, 0x0000ab69, 0x0000ab6a,
+ /* a8 */ 0x0000ab6b, 0x0000cde6, 0x0000ab6c, 0x0000c3b5,
+ /* ac */ 0x0000ab6d, 0x0000ab6e, 0x0000e7e2, 0x0000bbb7,
+ /* b0 */ 0x0000cfd6, 0x0000ab6f, 0x0000c1e1, 0x0000e7e9,
+ /* b4 */ 0x0000ab70, 0x0000ab71, 0x0000ab72, 0x0000e7e8,
+ /* b8 */ 0x0000ab73, 0x0000ab74, 0x0000e7f4, 0x0000b2a3,
+ /* bc */ 0x0000ab75, 0x0000ab76, 0x0000ab77, 0x0000ab78,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x04555 ***/
+
+ /* 80 */ 0x0000e7ea, 0x0000ab79, 0x0000e7e6, 0x0000ab7a,
+ /* 84 */ 0x0000ab7b, 0x0000ab7c, 0x0000ab7d, 0x0000ab7e,
+ /* 88 */ 0x0000e7ec, 0x0000e7eb, 0x0000c9ba, 0x0000ab80,
+ /* 8c */ 0x0000ab81, 0x0000d5e4, 0x0000ab82, 0x0000e7e5,
+ /* 90 */ 0x0000b7a9, 0x0000e7e7, 0x0000ab83, 0x0000ab84,
+ /* 94 */ 0x0000ab85, 0x0000ab86, 0x0000ab87, 0x0000ab88,
+ /* 98 */ 0x0000ab89, 0x0000e7ee, 0x0000ab8a, 0x0000ab8b,
+ /* 9c */ 0x0000ab8c, 0x0000ab8d, 0x0000e7f3, 0x0000ab8e,
+ /* a0 */ 0x0000d6e9, 0x0000ab8f, 0x0000ab90, 0x0000ab91,
+ /* a4 */ 0x0000ab92, 0x0000e7ed, 0x0000ab93, 0x0000e7f2,
+ /* a8 */ 0x0000ab94, 0x0000e7f1, 0x0000ab95, 0x0000ab96,
+ /* ac */ 0x0000ab97, 0x0000b0e0, 0x0000ab98, 0x0000ab99,
+ /* b0 */ 0x0000ab9a, 0x0000ab9b, 0x0000e7f5, 0x0000ab9c,
+ /* b4 */ 0x0000ab9d, 0x0000ab9e, 0x0000ab9f, 0x0000aba0,
+ /* b8 */ 0x0000ac40, 0x0000ac41, 0x0000ac42, 0x0000ac43,
+ /* bc */ 0x0000ac44, 0x0000ac45, 0x0000ac46, 0x0000ac47,
+
+ /*** Three byte table, leaf: e790xx - offset 0x04595 ***/
+
+ /* 80 */ 0x0000ac48, 0x0000ac49, 0x0000ac4a, 0x0000c7f2,
+ /* 84 */ 0x0000ac4b, 0x0000c0c5, 0x0000c0ed, 0x0000ac4c,
+ /* 88 */ 0x0000ac4d, 0x0000c1f0, 0x0000e7f0, 0x0000ac4e,
+ /* 8c */ 0x0000ac4f, 0x0000ac50, 0x0000ac51, 0x0000e7f6,
+ /* 90 */ 0x0000cbf6, 0x0000ac52, 0x0000ac53, 0x0000ac54,
+ /* 94 */ 0x0000ac55, 0x0000ac56, 0x0000ac57, 0x0000ac58,
+ /* 98 */ 0x0000ac59, 0x0000ac5a, 0x0000e8a2, 0x0000e8a1,
+ /* 9c */ 0x0000ac5b, 0x0000ac5c, 0x0000ac5d, 0x0000ac5e,
+ /* a0 */ 0x0000ac5f, 0x0000ac60, 0x0000d7c1, 0x0000ac61,
+ /* a4 */ 0x0000ac62, 0x0000e7fa, 0x0000e7f9, 0x0000ac63,
+ /* a8 */ 0x0000e7fb, 0x0000ac64, 0x0000e7f7, 0x0000ac65,
+ /* ac */ 0x0000e7fe, 0x0000ac66, 0x0000e7fd, 0x0000ac67,
+ /* b0 */ 0x0000e7fc, 0x0000ac68, 0x0000ac69, 0x0000c1d5,
+ /* b4 */ 0x0000c7d9, 0x0000c5fd, 0x0000c5c3, 0x0000ac6a,
+ /* b8 */ 0x0000ac6b, 0x0000ac6c, 0x0000ac6d, 0x0000ac6e,
+ /* bc */ 0x0000c7ed, 0x0000ac6f, 0x0000ac70, 0x0000ac71,
+
+ /*** Three byte table, leaf: e791xx - offset 0x045d5 ***/
+
+ /* 80 */ 0x0000ac72, 0x0000e8a3, 0x0000ac73, 0x0000ac74,
+ /* 84 */ 0x0000ac75, 0x0000ac76, 0x0000ac77, 0x0000ac78,
+ /* 88 */ 0x0000ac79, 0x0000ac7a, 0x0000ac7b, 0x0000ac7c,
+ /* 8c */ 0x0000ac7d, 0x0000ac7e, 0x0000ac80, 0x0000ac81,
+ /* 90 */ 0x0000ac82, 0x0000ac83, 0x0000ac84, 0x0000ac85,
+ /* 94 */ 0x0000ac86, 0x0000e8a6, 0x0000ac87, 0x0000e8a5,
+ /* 98 */ 0x0000ac88, 0x0000e8a7, 0x0000baf7, 0x0000e7f8,
+ /* 9c */ 0x0000e8a4, 0x0000ac89, 0x0000c8f0, 0x0000c9aa,
+ /* a0 */ 0x0000ac8a, 0x0000ac8b, 0x0000ac8c, 0x0000ac8d,
+ /* a4 */ 0x0000ac8e, 0x0000ac8f, 0x0000ac90, 0x0000ac91,
+ /* a8 */ 0x0000ac92, 0x0000ac93, 0x0000ac94, 0x0000ac95,
+ /* ac */ 0x0000ac96, 0x0000e8a9, 0x0000ac97, 0x0000ac98,
+ /* b0 */ 0x0000b9e5, 0x0000ac99, 0x0000ac9a, 0x0000ac9b,
+ /* b4 */ 0x0000ac9c, 0x0000ac9d, 0x0000d1fe, 0x0000e8a8,
+ /* b8 */ 0x0000ac9e, 0x0000ac9f, 0x0000aca0, 0x0000ad40,
+ /* bc */ 0x0000ad41, 0x0000ad42, 0x0000e8aa, 0x0000ad43,
+
+ /*** Three byte table, leaf: e792xx - offset 0x04615 ***/
+
+ /* 80 */ 0x0000e8ad, 0x0000e8ae, 0x0000ad44, 0x0000c1a7,
+ /* 84 */ 0x0000ad45, 0x0000ad46, 0x0000ad47, 0x0000e8af,
+ /* 88 */ 0x0000ad48, 0x0000ad49, 0x0000ad4a, 0x0000e8b0,
+ /* 8c */ 0x0000ad4b, 0x0000ad4c, 0x0000e8ac, 0x0000ad4d,
+ /* 90 */ 0x0000e8b4, 0x0000ad4e, 0x0000ad4f, 0x0000ad50,
+ /* 94 */ 0x0000ad51, 0x0000ad52, 0x0000ad53, 0x0000ad54,
+ /* 98 */ 0x0000ad55, 0x0000ad56, 0x0000ad57, 0x0000ad58,
+ /* 9c */ 0x0000e8ab, 0x0000ad59, 0x0000e8b1, 0x0000ad5a,
+ /* a0 */ 0x0000ad5b, 0x0000ad5c, 0x0000ad5d, 0x0000ad5e,
+ /* a4 */ 0x0000ad5f, 0x0000ad60, 0x0000ad61, 0x0000e8b5,
+ /* a8 */ 0x0000e8b2, 0x0000e8b3, 0x0000ad62, 0x0000ad63,
+ /* ac */ 0x0000ad64, 0x0000ad65, 0x0000ad66, 0x0000ad67,
+ /* b0 */ 0x0000ad68, 0x0000ad69, 0x0000ad6a, 0x0000ad6b,
+ /* b4 */ 0x0000ad6c, 0x0000ad6d, 0x0000ad6e, 0x0000ad6f,
+ /* b8 */ 0x0000ad70, 0x0000ad71, 0x0000e8b7, 0x0000ad72,
+ /* bc */ 0x0000ad73, 0x0000ad74, 0x0000ad75, 0x0000ad76,
+
+ /*** Three byte table, leaf: e793xx - offset 0x04655 ***/
+
+ /* 80 */ 0x0000ad77, 0x0000ad78, 0x0000ad79, 0x0000ad7a,
+ /* 84 */ 0x0000ad7b, 0x0000ad7c, 0x0000ad7d, 0x0000ad7e,
+ /* 88 */ 0x0000ad80, 0x0000ad81, 0x0000ad82, 0x0000ad83,
+ /* 8c */ 0x0000ad84, 0x0000ad85, 0x0000ad86, 0x0000ad87,
+ /* 90 */ 0x0000ad88, 0x0000ad89, 0x0000e8b6, 0x0000ad8a,
+ /* 94 */ 0x0000ad8b, 0x0000ad8c, 0x0000ad8d, 0x0000ad8e,
+ /* 98 */ 0x0000ad8f, 0x0000ad90, 0x0000ad91, 0x0000ad92,
+ /* 9c */ 0x0000b9cf, 0x0000ad93, 0x0000f0ac, 0x0000ad94,
+ /* a0 */ 0x0000f0ad, 0x0000ad95, 0x0000c6b0, 0x0000b0ea,
+ /* a4 */ 0x0000c8bf, 0x0000ad96, 0x0000cddf, 0x0000ad97,
+ /* a8 */ 0x0000ad98, 0x0000ad99, 0x0000ad9a, 0x0000ad9b,
+ /* ac */ 0x0000ad9c, 0x0000ad9d, 0x0000cecd, 0x0000eab1,
+ /* b0 */ 0x0000ad9e, 0x0000ad9f, 0x0000ada0, 0x0000ae40,
+ /* b4 */ 0x0000eab2, 0x0000ae41, 0x0000c6bf, 0x0000b4c9,
+ /* b8 */ 0x0000ae42, 0x0000ae43, 0x0000ae44, 0x0000ae45,
+ /* bc */ 0x0000ae46, 0x0000ae47, 0x0000ae48, 0x0000eab3,
+
+ /*** Three byte table, leaf: e794xx - offset 0x04695 ***/
+
+ /* 80 */ 0x0000ae49, 0x0000ae4a, 0x0000ae4b, 0x0000ae4c,
+ /* 84 */ 0x0000d5e7, 0x0000ae4d, 0x0000ae4e, 0x0000ae4f,
+ /* 88 */ 0x0000ae50, 0x0000ae51, 0x0000ae52, 0x0000ae53,
+ /* 8c */ 0x0000ae54, 0x0000ddf9, 0x0000ae55, 0x0000eab4,
+ /* 90 */ 0x0000ae56, 0x0000eab5, 0x0000ae57, 0x0000eab6,
+ /* 94 */ 0x0000ae58, 0x0000ae59, 0x0000ae5a, 0x0000ae5b,
+ /* 98 */ 0x0000b8ca, 0x0000dfb0, 0x0000c9f5, 0x0000ae5c,
+ /* 9c */ 0x0000ccf0, 0x0000ae5d, 0x0000ae5e, 0x0000c9fa,
+ /* a0 */ 0x0000ae5f, 0x0000ae60, 0x0000ae61, 0x0000ae62,
+ /* a4 */ 0x0000ae63, 0x0000c9fb, 0x0000ae64, 0x0000ae65,
+ /* a8 */ 0x0000d3c3, 0x0000cba6, 0x0000ae66, 0x0000b8a6,
+ /* ac */ 0x0000f0ae, 0x0000b1c2, 0x0000ae67, 0x0000e5b8,
+ /* b0 */ 0x0000ccef, 0x0000d3c9, 0x0000bcd7, 0x0000c9ea,
+ /* b4 */ 0x0000ae68, 0x0000b5e7, 0x0000ae69, 0x0000c4d0,
+ /* b8 */ 0x0000b5e9, 0x0000ae6a, 0x0000eeae, 0x0000bbad,
+ /* bc */ 0x0000ae6b, 0x0000ae6c, 0x0000e7de, 0x0000ae6d,
+
+ /*** Three byte table, leaf: e795xx - offset 0x046d5 ***/
+
+ /* 80 */ 0x0000eeaf, 0x0000ae6e, 0x0000ae6f, 0x0000ae70,
+ /* 84 */ 0x0000ae71, 0x0000b3a9, 0x0000ae72, 0x0000ae73,
+ /* 88 */ 0x0000eeb2, 0x0000ae74, 0x0000ae75, 0x0000eeb1,
+ /* 8c */ 0x0000bde7, 0x0000ae76, 0x0000eeb0, 0x0000ceb7,
+ /* 90 */ 0x0000ae77, 0x0000ae78, 0x0000ae79, 0x0000ae7a,
+ /* 94 */ 0x0000c5cf, 0x0000ae7b, 0x0000ae7c, 0x0000ae7d,
+ /* 98 */ 0x0000ae7e, 0x0000c1f4, 0x0000dbce, 0x0000eeb3,
+ /* 9c */ 0x0000d0f3, 0x0000ae80, 0x0000ae81, 0x0000ae82,
+ /* a0 */ 0x0000ae83, 0x0000ae84, 0x0000ae85, 0x0000ae86,
+ /* a4 */ 0x0000ae87, 0x0000c2d4, 0x0000c6e8, 0x0000ae88,
+ /* a8 */ 0x0000ae89, 0x0000ae8a, 0x0000b7ac, 0x0000ae8b,
+ /* ac */ 0x0000ae8c, 0x0000ae8d, 0x0000ae8e, 0x0000ae8f,
+ /* b0 */ 0x0000ae90, 0x0000ae91, 0x0000eeb4, 0x0000ae92,
+ /* b4 */ 0x0000b3eb, 0x0000ae93, 0x0000ae94, 0x0000ae95,
+ /* b8 */ 0x0000bbfb, 0x0000eeb5, 0x0000ae96, 0x0000ae97,
+ /* bc */ 0x0000ae98, 0x0000ae99, 0x0000ae9a, 0x0000e7dc,
+
+ /*** Three byte table, leaf: e796xx - offset 0x04715 ***/
+
+ /* 80 */ 0x0000ae9b, 0x0000ae9c, 0x0000ae9d, 0x0000eeb6,
+ /* 84 */ 0x0000ae9e, 0x0000ae9f, 0x0000bdae, 0x0000aea0,
+ /* 88 */ 0x0000af40, 0x0000af41, 0x0000af42, 0x0000f1e2,
+ /* 8c */ 0x0000af43, 0x0000af44, 0x0000af45, 0x0000cae8,
+ /* 90 */ 0x0000af46, 0x0000d2c9, 0x0000f0da, 0x0000af47,
+ /* 94 */ 0x0000f0db, 0x0000af48, 0x0000f0dc, 0x0000c1c6,
+ /* 98 */ 0x0000af49, 0x0000b8ed, 0x0000bece, 0x0000af4a,
+ /* 9c */ 0x0000af4b, 0x0000f0de, 0x0000af4c, 0x0000c5b1,
+ /* a0 */ 0x0000f0dd, 0x0000d1f1, 0x0000af4d, 0x0000f0e0,
+ /* a4 */ 0x0000b0cc, 0x0000bdea, 0x0000af4e, 0x0000af4f,
+ /* a8 */ 0x0000af50, 0x0000af51, 0x0000af52, 0x0000d2df,
+ /* ac */ 0x0000f0df, 0x0000af53, 0x0000b4af, 0x0000b7e8,
+ /* b0 */ 0x0000f0e6, 0x0000f0e5, 0x0000c6a3, 0x0000f0e1,
+ /* b4 */ 0x0000f0e2, 0x0000b4c3, 0x0000af54, 0x0000af55,
+ /* b8 */ 0x0000f0e3, 0x0000d5ee, 0x0000af56, 0x0000af57,
+ /* bc */ 0x0000ccdb, 0x0000bed2, 0x0000bcb2, 0x0000af58,
+
+ /*** Three byte table, leaf: e797xx - offset 0x04755 ***/
+
+ /* 80 */ 0x0000af59, 0x0000af5a, 0x0000f0e8, 0x0000f0e7,
+ /* 84 */ 0x0000f0e4, 0x0000b2a1, 0x0000af5b, 0x0000d6a2,
+ /* 88 */ 0x0000d3b8, 0x0000beb7, 0x0000c8ac, 0x0000af5c,
+ /* 8c */ 0x0000af5d, 0x0000f0ea, 0x0000af5e, 0x0000af5f,
+ /* 90 */ 0x0000af60, 0x0000af61, 0x0000d1f7, 0x0000af62,
+ /* 94 */ 0x0000d6cc, 0x0000badb, 0x0000f0e9, 0x0000af63,
+ /* 98 */ 0x0000b6bb, 0x0000af64, 0x0000af65, 0x0000cdb4,
+ /* 9c */ 0x0000af66, 0x0000af67, 0x0000c6a6, 0x0000af68,
+ /* a0 */ 0x0000af69, 0x0000af6a, 0x0000c1a1, 0x0000f0eb,
+ /* a4 */ 0x0000f0ee, 0x0000af6b, 0x0000f0ed, 0x0000f0f0,
+ /* a8 */ 0x0000f0ec, 0x0000af6c, 0x0000bbbe, 0x0000f0ef,
+ /* ac */ 0x0000af6d, 0x0000af6e, 0x0000af6f, 0x0000af70,
+ /* b0 */ 0x0000ccb5, 0x0000f0f2, 0x0000af71, 0x0000af72,
+ /* b4 */ 0x0000b3d5, 0x0000af73, 0x0000af74, 0x0000af75,
+ /* b8 */ 0x0000af76, 0x0000b1d4, 0x0000af77, 0x0000af78,
+ /* bc */ 0x0000f0f3, 0x0000af79, 0x0000af7a, 0x0000f0f4,
+
+ /*** Three byte table, leaf: e798xx - offset 0x04795 ***/
+
+ /* 80 */ 0x0000f0f6, 0x0000b4e1, 0x0000af7b, 0x0000f0f1,
+ /* 84 */ 0x0000af7c, 0x0000f0f7, 0x0000af7d, 0x0000af7e,
+ /* 88 */ 0x0000af80, 0x0000af81, 0x0000f0fa, 0x0000af82,
+ /* 8c */ 0x0000f0f8, 0x0000af83, 0x0000af84, 0x0000af85,
+ /* 90 */ 0x0000f0f5, 0x0000af86, 0x0000af87, 0x0000af88,
+ /* 94 */ 0x0000af89, 0x0000f0fd, 0x0000af8a, 0x0000f0f9,
+ /* 98 */ 0x0000f0fc, 0x0000f0fe, 0x0000af8b, 0x0000f1a1,
+ /* 9c */ 0x0000af8c, 0x0000af8d, 0x0000af8e, 0x0000cec1,
+ /* a0 */ 0x0000f1a4, 0x0000af8f, 0x0000f1a3, 0x0000af90,
+ /* a4 */ 0x0000c1f6, 0x0000f0fb, 0x0000cadd, 0x0000af91,
+ /* a8 */ 0x0000af92, 0x0000b4f1, 0x0000b1f1, 0x0000ccb1,
+ /* ac */ 0x0000af93, 0x0000f1a6, 0x0000af94, 0x0000af95,
+ /* b0 */ 0x0000f1a7, 0x0000af96, 0x0000af97, 0x0000f1ac,
+ /* b4 */ 0x0000d5ce, 0x0000f1a9, 0x0000af98, 0x0000af99,
+ /* b8 */ 0x0000c8b3, 0x0000af9a, 0x0000af9b, 0x0000af9c,
+ /* bc */ 0x0000f1a2, 0x0000af9d, 0x0000f1ab, 0x0000f1a8,
+
+ /*** Three byte table, leaf: e799xx - offset 0x047d5 ***/
+
+ /* 80 */ 0x0000f1a5, 0x0000af9e, 0x0000af9f, 0x0000f1aa,
+ /* 84 */ 0x0000afa0, 0x0000b040, 0x0000b041, 0x0000b042,
+ /* 88 */ 0x0000b043, 0x0000b044, 0x0000b045, 0x0000b046,
+ /* 8c */ 0x0000b0a9, 0x0000f1ad, 0x0000b047, 0x0000b048,
+ /* 90 */ 0x0000b049, 0x0000b04a, 0x0000b04b, 0x0000b04c,
+ /* 94 */ 0x0000f1af, 0x0000b04d, 0x0000f1b1, 0x0000b04e,
+ /* 98 */ 0x0000b04f, 0x0000b050, 0x0000b051, 0x0000b052,
+ /* 9c */ 0x0000f1b0, 0x0000b053, 0x0000f1ae, 0x0000b054,
+ /* a0 */ 0x0000b055, 0x0000b056, 0x0000b057, 0x0000d1a2,
+ /* a4 */ 0x0000b058, 0x0000b059, 0x0000b05a, 0x0000b05b,
+ /* a8 */ 0x0000b05c, 0x0000b05d, 0x0000b05e, 0x0000f1b2,
+ /* ac */ 0x0000b05f, 0x0000b060, 0x0000b061, 0x0000f1b3,
+ /* b0 */ 0x0000b062, 0x0000b063, 0x0000b064, 0x0000b065,
+ /* b4 */ 0x0000b066, 0x0000b067, 0x0000b068, 0x0000b069,
+ /* b8 */ 0x0000b9ef, 0x0000b06a, 0x0000b06b, 0x0000b5c7,
+ /* bc */ 0x0000b06c, 0x0000b0d7, 0x0000b0d9, 0x0000b06d,
+
+ /*** Three byte table, leaf: e79axx - offset 0x04815 ***/
+
+ /* 80 */ 0x0000b06e, 0x0000b06f, 0x0000d4ed, 0x0000b070,
+ /* 84 */ 0x0000b5c4, 0x0000b071, 0x0000bdd4, 0x0000bbca,
+ /* 88 */ 0x0000f0a7, 0x0000b072, 0x0000b073, 0x0000b8de,
+ /* 8c */ 0x0000b074, 0x0000b075, 0x0000f0a8, 0x0000b076,
+ /* 90 */ 0x0000b077, 0x0000b0a8, 0x0000b078, 0x0000f0a9,
+ /* 94 */ 0x0000b079, 0x0000b07a, 0x0000cdee, 0x0000b07b,
+ /* 98 */ 0x0000b07c, 0x0000f0aa, 0x0000b07d, 0x0000b07e,
+ /* 9c */ 0x0000b080, 0x0000b081, 0x0000b082, 0x0000b083,
+ /* a0 */ 0x0000b084, 0x0000b085, 0x0000b086, 0x0000b087,
+ /* a4 */ 0x0000f0ab, 0x0000b088, 0x0000b089, 0x0000b08a,
+ /* a8 */ 0x0000b08b, 0x0000b08c, 0x0000b08d, 0x0000b08e,
+ /* ac */ 0x0000b08f, 0x0000b090, 0x0000c6a4, 0x0000b091,
+ /* b0 */ 0x0000b092, 0x0000d6e5, 0x0000f1e4, 0x0000b093,
+ /* b4 */ 0x0000f1e5, 0x0000b094, 0x0000b095, 0x0000b096,
+ /* b8 */ 0x0000b097, 0x0000b098, 0x0000b099, 0x0000b09a,
+ /* bc */ 0x0000b09b, 0x0000b09c, 0x0000b09d, 0x0000c3f3,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x04855 ***/
+
+ /* 80 */ 0x0000b09e, 0x0000b09f, 0x0000d3db, 0x0000b0a0,
+ /* 84 */ 0x0000b140, 0x0000d6d1, 0x0000c5e8, 0x0000b141,
+ /* 88 */ 0x0000d3af, 0x0000b142, 0x0000d2e6, 0x0000b143,
+ /* 8c */ 0x0000b144, 0x0000eec1, 0x0000b0bb, 0x0000d5b5,
+ /* 90 */ 0x0000d1ce, 0x0000bce0, 0x0000bad0, 0x0000b145,
+ /* 94 */ 0x0000bff8, 0x0000b146, 0x0000b8c7, 0x0000b5c1,
+ /* 98 */ 0x0000c5cc, 0x0000b147, 0x0000b148, 0x0000caa2,
+ /* 9c */ 0x0000b149, 0x0000b14a, 0x0000b14b, 0x0000c3cb,
+ /* a0 */ 0x0000b14c, 0x0000b14d, 0x0000b14e, 0x0000b14f,
+ /* a4 */ 0x0000b150, 0x0000eec2, 0x0000b151, 0x0000b152,
+ /* a8 */ 0x0000b153, 0x0000b154, 0x0000b155, 0x0000b156,
+ /* ac */ 0x0000b157, 0x0000b158, 0x0000c4bf, 0x0000b6a2,
+ /* b0 */ 0x0000b159, 0x0000edec, 0x0000c3a4, 0x0000b15a,
+ /* b4 */ 0x0000d6b1, 0x0000b15b, 0x0000b15c, 0x0000b15d,
+ /* b8 */ 0x0000cfe0, 0x0000edef, 0x0000b15e, 0x0000b15f,
+ /* bc */ 0x0000c5ce, 0x0000b160, 0x0000b6dc, 0x0000b161,
+
+ /*** Three byte table, leaf: e79cxx - offset 0x04895 ***/
+
+ /* 80 */ 0x0000b162, 0x0000caa1, 0x0000b163, 0x0000b164,
+ /* 84 */ 0x0000eded, 0x0000b165, 0x0000b166, 0x0000edf0,
+ /* 88 */ 0x0000edf1, 0x0000c3bc, 0x0000b167, 0x0000bfb4,
+ /* 8c */ 0x0000b168, 0x0000edee, 0x0000b169, 0x0000b16a,
+ /* 90 */ 0x0000b16b, 0x0000b16c, 0x0000b16d, 0x0000b16e,
+ /* 94 */ 0x0000b16f, 0x0000b170, 0x0000b171, 0x0000b172,
+ /* 98 */ 0x0000b173, 0x0000edf4, 0x0000edf2, 0x0000b174,
+ /* 9c */ 0x0000b175, 0x0000b176, 0x0000b177, 0x0000d5e6,
+ /* a0 */ 0x0000c3df, 0x0000b178, 0x0000edf3, 0x0000b179,
+ /* a4 */ 0x0000b17a, 0x0000b17b, 0x0000edf6, 0x0000b17c,
+ /* a8 */ 0x0000d5a3, 0x0000d1a3, 0x0000b17d, 0x0000b17e,
+ /* ac */ 0x0000b180, 0x0000edf5, 0x0000b181, 0x0000c3d0,
+ /* b0 */ 0x0000b182, 0x0000b183, 0x0000b184, 0x0000b185,
+ /* b4 */ 0x0000b186, 0x0000edf7, 0x0000bff4, 0x0000beec,
+ /* b8 */ 0x0000edf8, 0x0000b187, 0x0000ccf7, 0x0000b188,
+ /* bc */ 0x0000d1db, 0x0000b189, 0x0000b18a, 0x0000b18b,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x048d5 ***/
+
+ /* 80 */ 0x0000d7c5, 0x0000d5f6, 0x0000b18c, 0x0000edfc,
+ /* 84 */ 0x0000b18d, 0x0000b18e, 0x0000b18f, 0x0000edfb,
+ /* 88 */ 0x0000b190, 0x0000b191, 0x0000b192, 0x0000b193,
+ /* 8c */ 0x0000b194, 0x0000b195, 0x0000b196, 0x0000b197,
+ /* 90 */ 0x0000edf9, 0x0000edfa, 0x0000b198, 0x0000b199,
+ /* 94 */ 0x0000b19a, 0x0000b19b, 0x0000b19c, 0x0000b19d,
+ /* 98 */ 0x0000b19e, 0x0000b19f, 0x0000edfd, 0x0000bea6,
+ /* 9c */ 0x0000b1a0, 0x0000b240, 0x0000b241, 0x0000b242,
+ /* a0 */ 0x0000b243, 0x0000cbaf, 0x0000eea1, 0x0000b6bd,
+ /* a4 */ 0x0000b244, 0x0000eea2, 0x0000c4c0, 0x0000b245,
+ /* a8 */ 0x0000edfe, 0x0000b246, 0x0000b247, 0x0000bdde,
+ /* ac */ 0x0000b2c7, 0x0000b248, 0x0000b249, 0x0000b24a,
+ /* b0 */ 0x0000b24b, 0x0000b24c, 0x0000b24d, 0x0000b24e,
+ /* b4 */ 0x0000b24f, 0x0000b250, 0x0000b251, 0x0000b252,
+ /* b8 */ 0x0000b253, 0x0000b6c3, 0x0000b254, 0x0000b255,
+ /* bc */ 0x0000b256, 0x0000eea5, 0x0000d8ba, 0x0000eea3,
+
+ /*** Three byte table, leaf: e79exx - offset 0x04915 ***/
+
+ /* 80 */ 0x0000eea6, 0x0000b257, 0x0000b258, 0x0000b259,
+ /* 84 */ 0x0000c3e9, 0x0000b3f2, 0x0000b25a, 0x0000b25b,
+ /* 88 */ 0x0000b25c, 0x0000b25d, 0x0000b25e, 0x0000b25f,
+ /* 8c */ 0x0000eea7, 0x0000eea4, 0x0000cfb9, 0x0000b260,
+ /* 90 */ 0x0000b261, 0x0000eea8, 0x0000c2f7, 0x0000b262,
+ /* 94 */ 0x0000b263, 0x0000b264, 0x0000b265, 0x0000b266,
+ /* 98 */ 0x0000b267, 0x0000b268, 0x0000b269, 0x0000b26a,
+ /* 9c */ 0x0000b26b, 0x0000b26c, 0x0000b26d, 0x0000eea9,
+ /* a0 */ 0x0000eeaa, 0x0000b26e, 0x0000deab, 0x0000b26f,
+ /* a4 */ 0x0000b270, 0x0000c6b3, 0x0000b271, 0x0000c7c6,
+ /* a8 */ 0x0000b272, 0x0000d6f5, 0x0000b5c9, 0x0000b273,
+ /* ac */ 0x0000cbb2, 0x0000b274, 0x0000b275, 0x0000b276,
+ /* b0 */ 0x0000eeab, 0x0000b277, 0x0000b278, 0x0000cdab,
+ /* b4 */ 0x0000b279, 0x0000eeac, 0x0000b27a, 0x0000b27b,
+ /* b8 */ 0x0000b27c, 0x0000b27d, 0x0000b27e, 0x0000d5b0,
+ /* bc */ 0x0000b280, 0x0000eead, 0x0000b281, 0x0000f6c4,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x04955 ***/
+
+ /* 80 */ 0x0000b282, 0x0000b283, 0x0000b284, 0x0000b285,
+ /* 84 */ 0x0000b286, 0x0000b287, 0x0000b288, 0x0000b289,
+ /* 88 */ 0x0000b28a, 0x0000b28b, 0x0000b28c, 0x0000b28d,
+ /* 8c */ 0x0000b28e, 0x0000dbc7, 0x0000b28f, 0x0000b290,
+ /* 90 */ 0x0000b291, 0x0000b292, 0x0000b293, 0x0000b294,
+ /* 94 */ 0x0000b295, 0x0000b296, 0x0000b297, 0x0000b4a3,
+ /* 98 */ 0x0000b298, 0x0000b299, 0x0000b29a, 0x0000c3ac,
+ /* 9c */ 0x0000f1e6, 0x0000b29b, 0x0000b29c, 0x0000b29d,
+ /* a0 */ 0x0000b29e, 0x0000b29f, 0x0000cab8, 0x0000d2d3,
+ /* a4 */ 0x0000b2a0, 0x0000d6aa, 0x0000b340, 0x0000eff2,
+ /* a8 */ 0x0000b341, 0x0000bed8, 0x0000b342, 0x0000bdc3,
+ /* ac */ 0x0000eff3, 0x0000b6cc, 0x0000b0ab, 0x0000b343,
+ /* b0 */ 0x0000b344, 0x0000b345, 0x0000b346, 0x0000caaf,
+ /* b4 */ 0x0000b347, 0x0000b348, 0x0000edb6, 0x0000b349,
+ /* b8 */ 0x0000edb7, 0x0000b34a, 0x0000b34b, 0x0000b34c,
+ /* bc */ 0x0000b34d, 0x0000cef9, 0x0000b7af, 0x0000bff3,
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x04995 ***/
+
+ /* 80 */ 0x0000edb8, 0x0000c2eb, 0x0000c9b0, 0x0000b34e,
+ /* 84 */ 0x0000b34f, 0x0000b350, 0x0000b351, 0x0000b352,
+ /* 88 */ 0x0000b353, 0x0000edb9, 0x0000b354, 0x0000b355,
+ /* 8c */ 0x0000c6f6, 0x0000bfb3, 0x0000b356, 0x0000b357,
+ /* 90 */ 0x0000b358, 0x0000edbc, 0x0000c5f8, 0x0000b359,
+ /* 94 */ 0x0000d1d0, 0x0000b35a, 0x0000d7a9, 0x0000edba,
+ /* 98 */ 0x0000edbb, 0x0000b35b, 0x0000d1e2, 0x0000b35c,
+ /* 9c */ 0x0000edbf, 0x0000edc0, 0x0000b35d, 0x0000edc4,
+ /* a0 */ 0x0000b35e, 0x0000b35f, 0x0000b360, 0x0000edc8,
+ /* a4 */ 0x0000b361, 0x0000edc6, 0x0000edce, 0x0000d5e8,
+ /* a8 */ 0x0000b362, 0x0000edc9, 0x0000b363, 0x0000b364,
+ /* ac */ 0x0000edc7, 0x0000edbe, 0x0000b365, 0x0000b366,
+ /* b0 */ 0x0000c5e9, 0x0000b367, 0x0000b368, 0x0000b369,
+ /* b4 */ 0x0000c6c6, 0x0000b36a, 0x0000b36b, 0x0000c9e9,
+ /* b8 */ 0x0000d4d2, 0x0000edc1, 0x0000edc2, 0x0000edc3,
+ /* bc */ 0x0000edc5, 0x0000b36c, 0x0000c0f9, 0x0000b36d,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x049d5 ***/
+
+ /* 80 */ 0x0000b4a1, 0x0000b36e, 0x0000b36f, 0x0000b370,
+ /* 84 */ 0x0000b371, 0x0000b9e8, 0x0000b372, 0x0000edd0,
+ /* 88 */ 0x0000b373, 0x0000b374, 0x0000b375, 0x0000b376,
+ /* 8c */ 0x0000edd1, 0x0000b377, 0x0000edca, 0x0000b378,
+ /* 90 */ 0x0000edcf, 0x0000b379, 0x0000cef8, 0x0000b37a,
+ /* 94 */ 0x0000b37b, 0x0000cbb6, 0x0000edcc, 0x0000edcd,
+ /* 98 */ 0x0000b37c, 0x0000b37d, 0x0000b37e, 0x0000b380,
+ /* 9c */ 0x0000b381, 0x0000cff5, 0x0000b382, 0x0000b383,
+ /* a0 */ 0x0000b384, 0x0000b385, 0x0000b386, 0x0000b387,
+ /* a4 */ 0x0000b388, 0x0000b389, 0x0000b38a, 0x0000b38b,
+ /* a8 */ 0x0000b38c, 0x0000b38d, 0x0000edd2, 0x0000c1f2,
+ /* ac */ 0x0000d3b2, 0x0000edcb, 0x0000c8b7, 0x0000b38e,
+ /* b0 */ 0x0000b38f, 0x0000b390, 0x0000b391, 0x0000b392,
+ /* b4 */ 0x0000b393, 0x0000b394, 0x0000b395, 0x0000bcef,
+ /* b8 */ 0x0000b396, 0x0000b397, 0x0000b398, 0x0000b399,
+ /* bc */ 0x0000c5f0, 0x0000b39a, 0x0000b39b, 0x0000b39c,
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x04a15 ***/
+
+ /* 80 */ 0x0000b39d, 0x0000b39e, 0x0000b39f, 0x0000b3a0,
+ /* 84 */ 0x0000b440, 0x0000b441, 0x0000b442, 0x0000edd6,
+ /* 88 */ 0x0000b443, 0x0000b5ef, 0x0000b444, 0x0000b445,
+ /* 8c */ 0x0000c2b5, 0x0000b0ad, 0x0000cbe9, 0x0000b446,
+ /* 90 */ 0x0000b447, 0x0000b1ae, 0x0000b448, 0x0000edd4,
+ /* 94 */ 0x0000b449, 0x0000b44a, 0x0000b44b, 0x0000cdeb,
+ /* 98 */ 0x0000b5e2, 0x0000b44c, 0x0000edd5, 0x0000edd3,
+ /* 9c */ 0x0000edd7, 0x0000b44d, 0x0000b44e, 0x0000b5fa,
+ /* a0 */ 0x0000b44f, 0x0000edd8, 0x0000b450, 0x0000edd9,
+ /* a4 */ 0x0000b451, 0x0000eddc, 0x0000b452, 0x0000b1cc,
+ /* a8 */ 0x0000b453, 0x0000b454, 0x0000b455, 0x0000b456,
+ /* ac */ 0x0000b457, 0x0000b458, 0x0000b459, 0x0000b45a,
+ /* b0 */ 0x0000c5f6, 0x0000bcee, 0x0000edda, 0x0000ccbc,
+ /* b4 */ 0x0000b2ea, 0x0000b45b, 0x0000b45c, 0x0000b45d,
+ /* b8 */ 0x0000b45e, 0x0000eddb, 0x0000b45f, 0x0000b460,
+ /* bc */ 0x0000b461, 0x0000b462, 0x0000c4eb, 0x0000b463,
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x04a55 ***/
+
+ /* 80 */ 0x0000b464, 0x0000b4c5, 0x0000b465, 0x0000b466,
+ /* 84 */ 0x0000b467, 0x0000b0f5, 0x0000b468, 0x0000b469,
+ /* 88 */ 0x0000b46a, 0x0000eddf, 0x0000c0da, 0x0000b4e8,
+ /* 8c */ 0x0000b46b, 0x0000b46c, 0x0000b46d, 0x0000b46e,
+ /* 90 */ 0x0000c5cd, 0x0000b46f, 0x0000b470, 0x0000b471,
+ /* 94 */ 0x0000eddd, 0x0000bfc4, 0x0000b472, 0x0000b473,
+ /* 98 */ 0x0000b474, 0x0000edde, 0x0000b475, 0x0000b476,
+ /* 9c */ 0x0000b477, 0x0000b478, 0x0000b479, 0x0000b47a,
+ /* a0 */ 0x0000b47b, 0x0000b47c, 0x0000b47d, 0x0000b47e,
+ /* a4 */ 0x0000b480, 0x0000b481, 0x0000b482, 0x0000b483,
+ /* a8 */ 0x0000c4a5, 0x0000b484, 0x0000b485, 0x0000b486,
+ /* ac */ 0x0000ede0, 0x0000b487, 0x0000b488, 0x0000b489,
+ /* b0 */ 0x0000b48a, 0x0000b48b, 0x0000ede1, 0x0000b48c,
+ /* b4 */ 0x0000ede3, 0x0000b48d, 0x0000b48e, 0x0000c1d7,
+ /* b8 */ 0x0000b48f, 0x0000b490, 0x0000bbc7, 0x0000b491,
+ /* bc */ 0x0000b492, 0x0000b493, 0x0000b494, 0x0000b495,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x04a95 ***/
+
+ /* 80 */ 0x0000b496, 0x0000bdb8, 0x0000b497, 0x0000b498,
+ /* 84 */ 0x0000b499, 0x0000ede2, 0x0000b49a, 0x0000b49b,
+ /* 88 */ 0x0000b49c, 0x0000b49d, 0x0000b49e, 0x0000b49f,
+ /* 8c */ 0x0000b4a0, 0x0000b540, 0x0000b541, 0x0000b542,
+ /* 90 */ 0x0000b543, 0x0000b544, 0x0000b545, 0x0000ede4,
+ /* 94 */ 0x0000b546, 0x0000b547, 0x0000b548, 0x0000b549,
+ /* 98 */ 0x0000b54a, 0x0000b54b, 0x0000b54c, 0x0000b54d,
+ /* 9c */ 0x0000b54e, 0x0000b54f, 0x0000ede6, 0x0000b550,
+ /* a0 */ 0x0000b551, 0x0000b552, 0x0000b553, 0x0000b554,
+ /* a4 */ 0x0000ede5, 0x0000b555, 0x0000b556, 0x0000b557,
+ /* a8 */ 0x0000b558, 0x0000b559, 0x0000b55a, 0x0000b55b,
+ /* ac */ 0x0000b55c, 0x0000b55d, 0x0000b55e, 0x0000b55f,
+ /* b0 */ 0x0000b560, 0x0000b561, 0x0000b562, 0x0000b563,
+ /* b4 */ 0x0000ede7, 0x0000b564, 0x0000b565, 0x0000b566,
+ /* b8 */ 0x0000b567, 0x0000b568, 0x0000cabe, 0x0000ecea,
+ /* bc */ 0x0000c0f1, 0x0000b569, 0x0000c9e7, 0x0000b56a,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x04ad5 ***/
+
+ /* 80 */ 0x0000eceb, 0x0000c6ee, 0x0000b56b, 0x0000b56c,
+ /* 84 */ 0x0000b56d, 0x0000b56e, 0x0000ecec, 0x0000b56f,
+ /* 88 */ 0x0000c6ed, 0x0000eced, 0x0000b570, 0x0000b571,
+ /* 8c */ 0x0000b572, 0x0000b573, 0x0000b574, 0x0000b575,
+ /* 90 */ 0x0000b576, 0x0000b577, 0x0000b578, 0x0000ecf0,
+ /* 94 */ 0x0000b579, 0x0000b57a, 0x0000d7e6, 0x0000ecf3,
+ /* 98 */ 0x0000b57b, 0x0000b57c, 0x0000ecf1, 0x0000ecee,
+ /* 9c */ 0x0000ecef, 0x0000d7a3, 0x0000c9f1, 0x0000cbee,
+ /* a0 */ 0x0000ecf4, 0x0000b57d, 0x0000ecf2, 0x0000b57e,
+ /* a4 */ 0x0000b580, 0x0000cfe9, 0x0000b581, 0x0000ecf6,
+ /* a8 */ 0x0000c6b1, 0x0000b582, 0x0000b583, 0x0000b584,
+ /* ac */ 0x0000b585, 0x0000bcc0, 0x0000b586, 0x0000ecf5,
+ /* b0 */ 0x0000b587, 0x0000b588, 0x0000b589, 0x0000b58a,
+ /* b4 */ 0x0000b58b, 0x0000b58c, 0x0000b58d, 0x0000b5bb,
+ /* b8 */ 0x0000bbf6, 0x0000b58e, 0x0000ecf7, 0x0000b58f,
+ /* bc */ 0x0000b590, 0x0000b591, 0x0000b592, 0x0000b593,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x04b15 ***/
+
+ /* 80 */ 0x0000d9f7, 0x0000bdfb, 0x0000b594, 0x0000b595,
+ /* 84 */ 0x0000c2bb, 0x0000ecf8, 0x0000b596, 0x0000b597,
+ /* 88 */ 0x0000b598, 0x0000b599, 0x0000ecf9, 0x0000b59a,
+ /* 8c */ 0x0000b59b, 0x0000b59c, 0x0000b59d, 0x0000b8a3,
+ /* 90 */ 0x0000b59e, 0x0000b59f, 0x0000b5a0, 0x0000b640,
+ /* 94 */ 0x0000b641, 0x0000b642, 0x0000b643, 0x0000b644,
+ /* 98 */ 0x0000b645, 0x0000b646, 0x0000ecfa, 0x0000b647,
+ /* 9c */ 0x0000b648, 0x0000b649, 0x0000b64a, 0x0000b64b,
+ /* a0 */ 0x0000b64c, 0x0000b64d, 0x0000b64e, 0x0000b64f,
+ /* a4 */ 0x0000b650, 0x0000b651, 0x0000b652, 0x0000ecfb,
+ /* a8 */ 0x0000b653, 0x0000b654, 0x0000b655, 0x0000b656,
+ /* ac */ 0x0000b657, 0x0000b658, 0x0000b659, 0x0000b65a,
+ /* b0 */ 0x0000b65b, 0x0000b65c, 0x0000b65d, 0x0000ecfc,
+ /* b4 */ 0x0000b65e, 0x0000b65f, 0x0000b660, 0x0000b661,
+ /* b8 */ 0x0000b662, 0x0000d3ed, 0x0000d8ae, 0x0000c0eb,
+ /* bc */ 0x0000b663, 0x0000c7dd, 0x0000bacc, 0x0000b664,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x04b55 ***/
+
+ /* 80 */ 0x0000d0e3, 0x0000cbbd, 0x0000b665, 0x0000cdba,
+ /* 84 */ 0x0000b666, 0x0000b667, 0x0000b8d1, 0x0000b668,
+ /* 88 */ 0x0000b669, 0x0000b1fc, 0x0000b66a, 0x0000c7ef,
+ /* 8c */ 0x0000b66b, 0x0000d6d6, 0x0000b66c, 0x0000b66d,
+ /* 90 */ 0x0000b66e, 0x0000bfc6, 0x0000c3eb, 0x0000b66f,
+ /* 94 */ 0x0000b670, 0x0000eff5, 0x0000b671, 0x0000b672,
+ /* 98 */ 0x0000c3d8, 0x0000b673, 0x0000b674, 0x0000b675,
+ /* 9c */ 0x0000b676, 0x0000b677, 0x0000b678, 0x0000d7e2,
+ /* a0 */ 0x0000b679, 0x0000b67a, 0x0000b67b, 0x0000eff7,
+ /* a4 */ 0x0000b3d3, 0x0000b67c, 0x0000c7d8, 0x0000d1ed,
+ /* a8 */ 0x0000b67d, 0x0000d6c8, 0x0000b67e, 0x0000eff8,
+ /* ac */ 0x0000b680, 0x0000eff6, 0x0000b681, 0x0000bbfd,
+ /* b0 */ 0x0000b3c6, 0x0000b682, 0x0000b683, 0x0000b684,
+ /* b4 */ 0x0000b685, 0x0000b686, 0x0000b687, 0x0000b688,
+ /* b8 */ 0x0000bdd5, 0x0000b689, 0x0000b68a, 0x0000d2c6,
+ /* bc */ 0x0000b68b, 0x0000bbe0, 0x0000b68c, 0x0000b68d,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x04b95 ***/
+
+ /* 80 */ 0x0000cfa1, 0x0000b68e, 0x0000effc, 0x0000effb,
+ /* 84 */ 0x0000b68f, 0x0000b690, 0x0000eff9, 0x0000b691,
+ /* 88 */ 0x0000b692, 0x0000b693, 0x0000b694, 0x0000b3cc,
+ /* 8c */ 0x0000b695, 0x0000c9d4, 0x0000cbb0, 0x0000b696,
+ /* 90 */ 0x0000b697, 0x0000b698, 0x0000b699, 0x0000b69a,
+ /* 94 */ 0x0000effe, 0x0000b69b, 0x0000b69c, 0x0000b0de,
+ /* 98 */ 0x0000b69d, 0x0000b69e, 0x0000d6c9, 0x0000b69f,
+ /* 9c */ 0x0000b6a0, 0x0000b740, 0x0000effd, 0x0000b741,
+ /* a0 */ 0x0000b3ed, 0x0000b742, 0x0000b743, 0x0000f6d5,
+ /* a4 */ 0x0000b744, 0x0000b745, 0x0000b746, 0x0000b747,
+ /* a8 */ 0x0000b748, 0x0000b749, 0x0000b74a, 0x0000b74b,
+ /* ac */ 0x0000b74c, 0x0000b74d, 0x0000b74e, 0x0000b74f,
+ /* b0 */ 0x0000b750, 0x0000b751, 0x0000b752, 0x0000cec8,
+ /* b4 */ 0x0000b753, 0x0000b754, 0x0000b755, 0x0000f0a2,
+ /* b8 */ 0x0000b756, 0x0000f0a1, 0x0000b757, 0x0000b5be,
+ /* bc */ 0x0000bcda, 0x0000bbfc, 0x0000b758, 0x0000b8e5,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x04bd5 ***/
+
+ /* 80 */ 0x0000b759, 0x0000b75a, 0x0000b75b, 0x0000b75c,
+ /* 84 */ 0x0000b75d, 0x0000b75e, 0x0000c4c2, 0x0000b75f,
+ /* 88 */ 0x0000b760, 0x0000b761, 0x0000b762, 0x0000b763,
+ /* 8c */ 0x0000b764, 0x0000b765, 0x0000b766, 0x0000b767,
+ /* 90 */ 0x0000b768, 0x0000f0a3, 0x0000b769, 0x0000b76a,
+ /* 94 */ 0x0000b76b, 0x0000b76c, 0x0000b76d, 0x0000cbeb,
+ /* 98 */ 0x0000b76e, 0x0000b76f, 0x0000b770, 0x0000b771,
+ /* 9c */ 0x0000b772, 0x0000b773, 0x0000b774, 0x0000b775,
+ /* a0 */ 0x0000b776, 0x0000b777, 0x0000b778, 0x0000b779,
+ /* a4 */ 0x0000b77a, 0x0000b77b, 0x0000b77c, 0x0000b77d,
+ /* a8 */ 0x0000b77e, 0x0000b780, 0x0000b781, 0x0000b782,
+ /* ac */ 0x0000b783, 0x0000b784, 0x0000b785, 0x0000b786,
+ /* b0 */ 0x0000f0a6, 0x0000b787, 0x0000b788, 0x0000b789,
+ /* b4 */ 0x0000d1a8, 0x0000b78a, 0x0000bebf, 0x0000c7ee,
+ /* b8 */ 0x0000f1b6, 0x0000f1b7, 0x0000bfd5, 0x0000b78b,
+ /* bc */ 0x0000b78c, 0x0000b78d, 0x0000b78e, 0x0000b4a9,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x04c15 ***/
+
+ /* 80 */ 0x0000f1b8, 0x0000cdbb, 0x0000b78f, 0x0000c7d4,
+ /* 84 */ 0x0000d5ad, 0x0000b790, 0x0000f1b9, 0x0000b791,
+ /* 88 */ 0x0000f1ba, 0x0000b792, 0x0000b793, 0x0000b794,
+ /* 8c */ 0x0000b795, 0x0000c7cf, 0x0000b796, 0x0000b797,
+ /* 90 */ 0x0000b798, 0x0000d2a4, 0x0000d6cf, 0x0000b799,
+ /* 94 */ 0x0000b79a, 0x0000f1bb, 0x0000bdd1, 0x0000b4b0,
+ /* 98 */ 0x0000bebd, 0x0000b79b, 0x0000b79c, 0x0000b79d,
+ /* 9c */ 0x0000b4dc, 0x0000ced1, 0x0000b79e, 0x0000bfdf,
+ /* a0 */ 0x0000f1bd, 0x0000b79f, 0x0000b7a0, 0x0000b840,
+ /* a4 */ 0x0000b841, 0x0000bffa, 0x0000f1bc, 0x0000b842,
+ /* a8 */ 0x0000f1bf, 0x0000b843, 0x0000b844, 0x0000b845,
+ /* ac */ 0x0000f1be, 0x0000f1c0, 0x0000b846, 0x0000b847,
+ /* b0 */ 0x0000b848, 0x0000b849, 0x0000b84a, 0x0000f1c1,
+ /* b4 */ 0x0000b84b, 0x0000b84c, 0x0000b84d, 0x0000b84e,
+ /* b8 */ 0x0000b84f, 0x0000b850, 0x0000b851, 0x0000b852,
+ /* bc */ 0x0000b853, 0x0000b854, 0x0000b855, 0x0000c1fe,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x04c55 ***/
+
+ /* 80 */ 0x0000b856, 0x0000b857, 0x0000b858, 0x0000b859,
+ /* 84 */ 0x0000b85a, 0x0000b85b, 0x0000b85c, 0x0000b85d,
+ /* 88 */ 0x0000b85e, 0x0000b85f, 0x0000b860, 0x0000c1a2,
+ /* 8c */ 0x0000b861, 0x0000b862, 0x0000b863, 0x0000b864,
+ /* 90 */ 0x0000b865, 0x0000b866, 0x0000b867, 0x0000b868,
+ /* 94 */ 0x0000b869, 0x0000b86a, 0x0000cafa, 0x0000b86b,
+ /* 98 */ 0x0000b86c, 0x0000d5be, 0x0000b86d, 0x0000b86e,
+ /* 9c */ 0x0000b86f, 0x0000b870, 0x0000beba, 0x0000beb9,
+ /* a0 */ 0x0000d5c2, 0x0000b871, 0x0000b872, 0x0000bfa2,
+ /* a4 */ 0x0000b873, 0x0000cdaf, 0x0000f1b5, 0x0000b874,
+ /* a8 */ 0x0000b875, 0x0000b876, 0x0000b877, 0x0000b878,
+ /* ac */ 0x0000b879, 0x0000bddf, 0x0000b87a, 0x0000b6cb,
+ /* b0 */ 0x0000b87b, 0x0000b87c, 0x0000b87d, 0x0000b87e,
+ /* b4 */ 0x0000b880, 0x0000b881, 0x0000b882, 0x0000b883,
+ /* b8 */ 0x0000b884, 0x0000d6f1, 0x0000f3c3, 0x0000b885,
+ /* bc */ 0x0000b886, 0x0000f3c4, 0x0000b887, 0x0000b8cd,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x04c95 ***/
+
+ /* 80 */ 0x0000b888, 0x0000b889, 0x0000b88a, 0x0000f3c6,
+ /* 84 */ 0x0000f3c7, 0x0000b88b, 0x0000b0ca, 0x0000b88c,
+ /* 88 */ 0x0000f3c5, 0x0000b88d, 0x0000f3c9, 0x0000cbf1,
+ /* 8c */ 0x0000b88e, 0x0000b88f, 0x0000b890, 0x0000f3cb,
+ /* 90 */ 0x0000b891, 0x0000d0a6, 0x0000b892, 0x0000b893,
+ /* 94 */ 0x0000b1ca, 0x0000f3c8, 0x0000b894, 0x0000b895,
+ /* 98 */ 0x0000b896, 0x0000f3cf, 0x0000b897, 0x0000b5d1,
+ /* 9c */ 0x0000b898, 0x0000b899, 0x0000f3d7, 0x0000b89a,
+ /* a0 */ 0x0000f3d2, 0x0000b89b, 0x0000b89c, 0x0000b89d,
+ /* a4 */ 0x0000f3d4, 0x0000f3d3, 0x0000b7fb, 0x0000b89e,
+ /* a8 */ 0x0000b1bf, 0x0000b89f, 0x0000f3ce, 0x0000f3ca,
+ /* ac */ 0x0000b5da, 0x0000b8a0, 0x0000f3d0, 0x0000b940,
+ /* b0 */ 0x0000b941, 0x0000f3d1, 0x0000b942, 0x0000f3d5,
+ /* b4 */ 0x0000b943, 0x0000b944, 0x0000b945, 0x0000b946,
+ /* b8 */ 0x0000f3cd, 0x0000b947, 0x0000bce3, 0x0000b948,
+ /* bc */ 0x0000c1fd, 0x0000b949, 0x0000f3d6, 0x0000b94a,
+
+ /*** Three byte table, leaf: e7adxx - offset 0x04cd5 ***/
+
+ /* 80 */ 0x0000b94b, 0x0000b94c, 0x0000b94d, 0x0000b94e,
+ /* 84 */ 0x0000b94f, 0x0000f3da, 0x0000b950, 0x0000f3cc,
+ /* 88 */ 0x0000b951, 0x0000b5c8, 0x0000b952, 0x0000bdee,
+ /* 8c */ 0x0000f3dc, 0x0000b953, 0x0000b954, 0x0000b7a4,
+ /* 90 */ 0x0000bff0, 0x0000d6fe, 0x0000cdb2, 0x0000b955,
+ /* 94 */ 0x0000b4f0, 0x0000b956, 0x0000b2df, 0x0000b957,
+ /* 98 */ 0x0000f3d8, 0x0000b958, 0x0000f3d9, 0x0000c9b8,
+ /* 9c */ 0x0000b959, 0x0000f3dd, 0x0000b95a, 0x0000b95b,
+ /* a0 */ 0x0000f3de, 0x0000b95c, 0x0000f3e1, 0x0000b95d,
+ /* a4 */ 0x0000b95e, 0x0000b95f, 0x0000b960, 0x0000b961,
+ /* a8 */ 0x0000b962, 0x0000b963, 0x0000b964, 0x0000b965,
+ /* ac */ 0x0000b966, 0x0000b967, 0x0000f3df, 0x0000b968,
+ /* b0 */ 0x0000b969, 0x0000f3e3, 0x0000f3e2, 0x0000b96a,
+ /* b4 */ 0x0000b96b, 0x0000f3db, 0x0000b96c, 0x0000bfea,
+ /* b8 */ 0x0000b96d, 0x0000b3ef, 0x0000b96e, 0x0000f3e0,
+ /* bc */ 0x0000b96f, 0x0000b970, 0x0000c7a9, 0x0000b971,
+
+ /*** Three byte table, leaf: e7aexx - offset 0x04d15 ***/
+
+ /* 80 */ 0x0000bcf2, 0x0000b972, 0x0000b973, 0x0000b974,
+ /* 84 */ 0x0000b975, 0x0000f3eb, 0x0000b976, 0x0000b977,
+ /* 88 */ 0x0000b978, 0x0000b979, 0x0000b97a, 0x0000b97b,
+ /* 8c */ 0x0000b97c, 0x0000b9bf, 0x0000b97d, 0x0000b97e,
+ /* 90 */ 0x0000f3e4, 0x0000b980, 0x0000b981, 0x0000b982,
+ /* 94 */ 0x0000b2ad, 0x0000bbfe, 0x0000b983, 0x0000cbe3,
+ /* 98 */ 0x0000b984, 0x0000b985, 0x0000b986, 0x0000b987,
+ /* 9c */ 0x0000f3ed, 0x0000f3e9, 0x0000b988, 0x0000b989,
+ /* a0 */ 0x0000b98a, 0x0000b9dc, 0x0000f3ee, 0x0000b98b,
+ /* a4 */ 0x0000b98c, 0x0000b98d, 0x0000f3e5, 0x0000f3e6,
+ /* a8 */ 0x0000f3ea, 0x0000c2e1, 0x0000f3ec, 0x0000f3ef,
+ /* ac */ 0x0000f3e8, 0x0000bcfd, 0x0000b98e, 0x0000b98f,
+ /* b0 */ 0x0000b990, 0x0000cfe4, 0x0000b991, 0x0000b992,
+ /* b4 */ 0x0000f3f0, 0x0000b993, 0x0000b994, 0x0000b995,
+ /* b8 */ 0x0000f3e7, 0x0000b996, 0x0000b997, 0x0000b998,
+ /* bc */ 0x0000b999, 0x0000b99a, 0x0000b99b, 0x0000b99c,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x04d55 ***/
+
+ /* 80 */ 0x0000b99d, 0x0000f3f2, 0x0000b99e, 0x0000b99f,
+ /* 84 */ 0x0000b9a0, 0x0000ba40, 0x0000d7ad, 0x0000c6aa,
+ /* 88 */ 0x0000ba41, 0x0000ba42, 0x0000ba43, 0x0000ba44,
+ /* 8c */ 0x0000f3f3, 0x0000ba45, 0x0000ba46, 0x0000ba47,
+ /* 90 */ 0x0000ba48, 0x0000f3f1, 0x0000ba49, 0x0000c2a8,
+ /* 94 */ 0x0000ba4a, 0x0000ba4b, 0x0000ba4c, 0x0000ba4d,
+ /* 98 */ 0x0000ba4e, 0x0000b8dd, 0x0000f3f5, 0x0000ba4f,
+ /* 9c */ 0x0000ba50, 0x0000f3f4, 0x0000ba51, 0x0000ba52,
+ /* a0 */ 0x0000ba53, 0x0000b4db, 0x0000ba54, 0x0000ba55,
+ /* a4 */ 0x0000ba56, 0x0000f3f6, 0x0000f3f7, 0x0000ba57,
+ /* a8 */ 0x0000ba58, 0x0000ba59, 0x0000f3f8, 0x0000ba5a,
+ /* ac */ 0x0000ba5b, 0x0000ba5c, 0x0000c0ba, 0x0000ba5d,
+ /* b0 */ 0x0000ba5e, 0x0000c0e9, 0x0000ba5f, 0x0000ba60,
+ /* b4 */ 0x0000ba61, 0x0000ba62, 0x0000ba63, 0x0000c5f1,
+ /* b8 */ 0x0000ba64, 0x0000ba65, 0x0000ba66, 0x0000ba67,
+ /* bc */ 0x0000f3fb, 0x0000ba68, 0x0000f3fa, 0x0000ba69,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x04d95 ***/
+
+ /* 80 */ 0x0000ba6a, 0x0000ba6b, 0x0000ba6c, 0x0000ba6d,
+ /* 84 */ 0x0000ba6e, 0x0000ba6f, 0x0000ba70, 0x0000b4d8,
+ /* 88 */ 0x0000ba71, 0x0000ba72, 0x0000ba73, 0x0000f3fe,
+ /* 8c */ 0x0000f3f9, 0x0000ba74, 0x0000ba75, 0x0000f3fc,
+ /* 90 */ 0x0000ba76, 0x0000ba77, 0x0000ba78, 0x0000ba79,
+ /* 94 */ 0x0000ba7a, 0x0000ba7b, 0x0000f3fd, 0x0000ba7c,
+ /* 98 */ 0x0000ba7d, 0x0000ba7e, 0x0000ba80, 0x0000ba81,
+ /* 9c */ 0x0000ba82, 0x0000ba83, 0x0000ba84, 0x0000f4a1,
+ /* a0 */ 0x0000ba85, 0x0000ba86, 0x0000ba87, 0x0000ba88,
+ /* a4 */ 0x0000ba89, 0x0000ba8a, 0x0000f4a3, 0x0000bbc9,
+ /* a8 */ 0x0000ba8b, 0x0000ba8c, 0x0000f4a2, 0x0000ba8d,
+ /* ac */ 0x0000ba8e, 0x0000ba8f, 0x0000ba90, 0x0000ba91,
+ /* b0 */ 0x0000ba92, 0x0000ba93, 0x0000ba94, 0x0000ba95,
+ /* b4 */ 0x0000ba96, 0x0000ba97, 0x0000ba98, 0x0000ba99,
+ /* b8 */ 0x0000f4a4, 0x0000ba9a, 0x0000ba9b, 0x0000ba9c,
+ /* bc */ 0x0000ba9d, 0x0000ba9e, 0x0000ba9f, 0x0000b2be,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x04dd5 ***/
+
+ /* 80 */ 0x0000f4a6, 0x0000f4a5, 0x0000baa0, 0x0000bb40,
+ /* 84 */ 0x0000bb41, 0x0000bb42, 0x0000bb43, 0x0000bb44,
+ /* 88 */ 0x0000bb45, 0x0000bb46, 0x0000bb47, 0x0000bb48,
+ /* 8c */ 0x0000bb49, 0x0000bcae, 0x0000bb4a, 0x0000bb4b,
+ /* 90 */ 0x0000bb4c, 0x0000bb4d, 0x0000bb4e, 0x0000bb4f,
+ /* 94 */ 0x0000bb50, 0x0000bb51, 0x0000bb52, 0x0000bb53,
+ /* 98 */ 0x0000bb54, 0x0000bb55, 0x0000bb56, 0x0000bb57,
+ /* 9c */ 0x0000bb58, 0x0000bb59, 0x0000bb5a, 0x0000bb5b,
+ /* a0 */ 0x0000bb5c, 0x0000bb5d, 0x0000bb5e, 0x0000bb5f,
+ /* a4 */ 0x0000bb60, 0x0000bb61, 0x0000bb62, 0x0000bb63,
+ /* a8 */ 0x0000bb64, 0x0000bb65, 0x0000bb66, 0x0000bb67,
+ /* ac */ 0x0000bb68, 0x0000bb69, 0x0000bb6a, 0x0000bb6b,
+ /* b0 */ 0x0000bb6c, 0x0000bb6d, 0x0000bb6e, 0x0000c3d7,
+ /* b4 */ 0x0000d9e1, 0x0000bb6f, 0x0000bb70, 0x0000bb71,
+ /* b8 */ 0x0000bb72, 0x0000bb73, 0x0000bb74, 0x0000c0e0,
+ /* bc */ 0x0000f4cc, 0x0000d7d1, 0x0000bb75, 0x0000bb76,
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x04e15 ***/
+
+ /* 80 */ 0x0000bb77, 0x0000bb78, 0x0000bb79, 0x0000bb7a,
+ /* 84 */ 0x0000bb7b, 0x0000bb7c, 0x0000bb7d, 0x0000bb7e,
+ /* 88 */ 0x0000bb80, 0x0000b7db, 0x0000bb81, 0x0000bb82,
+ /* 8c */ 0x0000bb83, 0x0000bb84, 0x0000bb85, 0x0000bb86,
+ /* 90 */ 0x0000bb87, 0x0000f4ce, 0x0000c1a3, 0x0000bb88,
+ /* 94 */ 0x0000bb89, 0x0000c6c9, 0x0000bb8a, 0x0000b4d6,
+ /* 98 */ 0x0000d5b3, 0x0000bb8b, 0x0000bb8c, 0x0000bb8d,
+ /* 9c */ 0x0000f4d0, 0x0000f4cf, 0x0000f4d1, 0x0000cbda,
+ /* a0 */ 0x0000bb8e, 0x0000bb8f, 0x0000f4d2, 0x0000bb90,
+ /* a4 */ 0x0000d4c1, 0x0000d6e0, 0x0000bb91, 0x0000bb92,
+ /* a8 */ 0x0000bb93, 0x0000bb94, 0x0000b7e0, 0x0000bb95,
+ /* ac */ 0x0000bb96, 0x0000bb97, 0x0000c1b8, 0x0000bb98,
+ /* b0 */ 0x0000bb99, 0x0000c1bb, 0x0000f4d3, 0x0000beac,
+ /* b4 */ 0x0000bb9a, 0x0000bb9b, 0x0000bb9c, 0x0000bb9d,
+ /* b8 */ 0x0000bb9e, 0x0000b4e2, 0x0000bb9f, 0x0000bba0,
+ /* bc */ 0x0000f4d4, 0x0000f4d5, 0x0000beab, 0x0000bc40,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x04e55 ***/
+
+ /* 80 */ 0x0000bc41, 0x0000f4d6, 0x0000bc42, 0x0000bc43,
+ /* 84 */ 0x0000bc44, 0x0000f4db, 0x0000bc45, 0x0000f4d7,
+ /* 88 */ 0x0000f4da, 0x0000bc46, 0x0000bafd, 0x0000bc47,
+ /* 8c */ 0x0000f4d8, 0x0000f4d9, 0x0000bc48, 0x0000bc49,
+ /* 90 */ 0x0000bc4a, 0x0000bc4b, 0x0000bc4c, 0x0000bc4d,
+ /* 94 */ 0x0000bc4e, 0x0000b8e2, 0x0000ccc7, 0x0000f4dc,
+ /* 98 */ 0x0000bc4f, 0x0000b2da, 0x0000bc50, 0x0000bc51,
+ /* 9c */ 0x0000c3d3, 0x0000bc52, 0x0000bc53, 0x0000d4e3,
+ /* a0 */ 0x0000bfb7, 0x0000bc54, 0x0000bc55, 0x0000bc56,
+ /* a4 */ 0x0000bc57, 0x0000bc58, 0x0000bc59, 0x0000bc5a,
+ /* a8 */ 0x0000f4dd, 0x0000bc5b, 0x0000bc5c, 0x0000bc5d,
+ /* ac */ 0x0000bc5e, 0x0000bc5f, 0x0000bc60, 0x0000c5b4,
+ /* b0 */ 0x0000bc61, 0x0000bc62, 0x0000bc63, 0x0000bc64,
+ /* b4 */ 0x0000bc65, 0x0000bc66, 0x0000bc67, 0x0000bc68,
+ /* b8 */ 0x0000f4e9, 0x0000bc69, 0x0000bc6a, 0x0000cfb5,
+ /* bc */ 0x0000bc6b, 0x0000bc6c, 0x0000bc6d, 0x0000bc6e,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x04e95 ***/
+
+ /* 80 */ 0x0000bc6f, 0x0000bc70, 0x0000bc71, 0x0000bc72,
+ /* 84 */ 0x0000bc73, 0x0000bc74, 0x0000bc75, 0x0000bc76,
+ /* 88 */ 0x0000bc77, 0x0000bc78, 0x0000cec9, 0x0000bc79,
+ /* 8c */ 0x0000bc7a, 0x0000bc7b, 0x0000bc7c, 0x0000bc7d,
+ /* 90 */ 0x0000bc7e, 0x0000bc80, 0x0000bc81, 0x0000bc82,
+ /* 94 */ 0x0000bc83, 0x0000bc84, 0x0000bc85, 0x0000bc86,
+ /* 98 */ 0x0000bc87, 0x0000bc88, 0x0000bc89, 0x0000bc8a,
+ /* 9c */ 0x0000bc8b, 0x0000bc8c, 0x0000bc8d, 0x0000bc8e,
+ /* a0 */ 0x0000cbd8, 0x0000bc8f, 0x0000cbf7, 0x0000bc90,
+ /* a4 */ 0x0000bc91, 0x0000bc92, 0x0000bc93, 0x0000bdf4,
+ /* a8 */ 0x0000bc94, 0x0000bc95, 0x0000bc96, 0x0000d7cf,
+ /* ac */ 0x0000bc97, 0x0000bc98, 0x0000bc99, 0x0000c0db,
+ /* b0 */ 0x0000bc9a, 0x0000bc9b, 0x0000bc9c, 0x0000bc9d,
+ /* b4 */ 0x0000bc9e, 0x0000bc9f, 0x0000bca0, 0x0000bd40,
+ /* b8 */ 0x0000bd41, 0x0000bd42, 0x0000bd43, 0x0000bd44,
+ /* bc */ 0x0000bd45, 0x0000bd46, 0x0000bd47, 0x0000bd48,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x04ed5 ***/
+
+ /* 80 */ 0x0000bd49, 0x0000bd4a, 0x0000bd4b, 0x0000bd4c,
+ /* 84 */ 0x0000bd4d, 0x0000bd4e, 0x0000bd4f, 0x0000bd50,
+ /* 88 */ 0x0000bd51, 0x0000bd52, 0x0000bd53, 0x0000bd54,
+ /* 8c */ 0x0000bd55, 0x0000bd56, 0x0000bd57, 0x0000bd58,
+ /* 90 */ 0x0000bd59, 0x0000bd5a, 0x0000bd5b, 0x0000bd5c,
+ /* 94 */ 0x0000bd5d, 0x0000bd5e, 0x0000bd5f, 0x0000bd60,
+ /* 98 */ 0x0000bd61, 0x0000bd62, 0x0000bd63, 0x0000bd64,
+ /* 9c */ 0x0000bd65, 0x0000bd66, 0x0000bd67, 0x0000bd68,
+ /* a0 */ 0x0000bd69, 0x0000bd6a, 0x0000bd6b, 0x0000bd6c,
+ /* a4 */ 0x0000bd6d, 0x0000bd6e, 0x0000bd6f, 0x0000bd70,
+ /* a8 */ 0x0000bd71, 0x0000bd72, 0x0000bd73, 0x0000bd74,
+ /* ac */ 0x0000bd75, 0x0000bd76, 0x0000d0f5, 0x0000bd77,
+ /* b0 */ 0x0000bd78, 0x0000bd79, 0x0000bd7a, 0x0000bd7b,
+ /* b4 */ 0x0000bd7c, 0x0000bd7d, 0x0000bd7e, 0x0000f4ea,
+ /* b8 */ 0x0000bd80, 0x0000bd81, 0x0000bd82, 0x0000bd83,
+ /* bc */ 0x0000bd84, 0x0000bd85, 0x0000bd86, 0x0000bd87,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x04f15 ***/
+
+ /* 80 */ 0x0000bd88, 0x0000bd89, 0x0000bd8a, 0x0000bd8b,
+ /* 84 */ 0x0000bd8c, 0x0000bd8d, 0x0000bd8e, 0x0000bd8f,
+ /* 88 */ 0x0000bd90, 0x0000bd91, 0x0000bd92, 0x0000bd93,
+ /* 8c */ 0x0000bd94, 0x0000bd95, 0x0000bd96, 0x0000bd97,
+ /* 90 */ 0x0000bd98, 0x0000bd99, 0x0000bd9a, 0x0000bd9b,
+ /* 94 */ 0x0000bd9c, 0x0000bd9d, 0x0000bd9e, 0x0000bd9f,
+ /* 98 */ 0x0000bda0, 0x0000be40, 0x0000be41, 0x0000be42,
+ /* 9c */ 0x0000be43, 0x0000be44, 0x0000be45, 0x0000be46,
+ /* a0 */ 0x0000be47, 0x0000be48, 0x0000be49, 0x0000be4a,
+ /* a4 */ 0x0000be4b, 0x0000be4c, 0x0000f4eb, 0x0000be4d,
+ /* a8 */ 0x0000be4e, 0x0000be4f, 0x0000be50, 0x0000be51,
+ /* ac */ 0x0000be52, 0x0000be53, 0x0000f4ec, 0x0000be54,
+ /* b0 */ 0x0000be55, 0x0000be56, 0x0000be57, 0x0000be58,
+ /* b4 */ 0x0000be59, 0x0000be5a, 0x0000be5b, 0x0000be5c,
+ /* b8 */ 0x0000be5d, 0x0000be5e, 0x0000be5f, 0x0000be60,
+ /* bc */ 0x0000be61, 0x0000be62, 0x0000be63, 0x0000be64,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x04f55 ***/
+
+ /* 80 */ 0x0000be65, 0x0000be66, 0x0000be67, 0x0000be68,
+ /* 84 */ 0x0000be69, 0x0000be6a, 0x0000be6b, 0x0000be6c,
+ /* 88 */ 0x0000be6d, 0x0000be6e, 0x0000be6f, 0x0000be70,
+ /* 8c */ 0x0000be71, 0x0000be72, 0x0000be73, 0x0000be74,
+ /* 90 */ 0x0000be75, 0x0000be76, 0x0000be77, 0x0000be78,
+ /* 94 */ 0x0000be79, 0x0000be7a, 0x0000be7b, 0x0000be7c,
+ /* 98 */ 0x0000be7d, 0x0000be7e, 0x0000be80, 0x0000be81,
+ /* 9c */ 0x0000be82, 0x0000be83, 0x0000be84, 0x0000be85,
+ /* a0 */ 0x0000be86, 0x0000be87, 0x0000be88, 0x0000be89,
+ /* a4 */ 0x0000be8a, 0x0000be8b, 0x0000be8c, 0x0000be8d,
+ /* a8 */ 0x0000be8e, 0x0000be8f, 0x0000be90, 0x0000be91,
+ /* ac */ 0x0000be92, 0x0000be93, 0x0000be94, 0x0000be95,
+ /* b0 */ 0x0000be96, 0x0000be97, 0x0000be98, 0x0000be99,
+ /* b4 */ 0x0000be9a, 0x0000be9b, 0x0000be9c, 0x0000be9d,
+ /* b8 */ 0x0000be9e, 0x0000be9f, 0x0000bea0, 0x0000bf40,
+ /* bc */ 0x0000bf41, 0x0000bf42, 0x0000bf43, 0x0000bf44,
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x04f95 ***/
+
+ /* 80 */ 0x0000bf45, 0x0000bf46, 0x0000bf47, 0x0000bf48,
+ /* 84 */ 0x0000bf49, 0x0000bf4a, 0x0000bf4b, 0x0000bf4c,
+ /* 88 */ 0x0000bf4d, 0x0000bf4e, 0x0000bf4f, 0x0000bf50,
+ /* 8c */ 0x0000bf51, 0x0000bf52, 0x0000bf53, 0x0000bf54,
+ /* 90 */ 0x0000bf55, 0x0000bf56, 0x0000bf57, 0x0000bf58,
+ /* 94 */ 0x0000bf59, 0x0000bf5a, 0x0000bf5b, 0x0000bf5c,
+ /* 98 */ 0x0000bf5d, 0x0000bf5e, 0x0000bf5f, 0x0000bf60,
+ /* 9c */ 0x0000bf61, 0x0000bf62, 0x0000bf63, 0x0000bf64,
+ /* a0 */ 0x0000bf65, 0x0000bf66, 0x0000bf67, 0x0000bf68,
+ /* a4 */ 0x0000bf69, 0x0000bf6a, 0x0000bf6b, 0x0000bf6c,
+ /* a8 */ 0x0000bf6d, 0x0000bf6e, 0x0000bf6f, 0x0000bf70,
+ /* ac */ 0x0000bf71, 0x0000bf72, 0x0000bf73, 0x0000bf74,
+ /* b0 */ 0x0000bf75, 0x0000bf76, 0x0000bf77, 0x0000bf78,
+ /* b4 */ 0x0000bf79, 0x0000bf7a, 0x0000bf7b, 0x0000bf7c,
+ /* b8 */ 0x0000bf7d, 0x0000bf7e, 0x0000bf80, 0x0000f7e3,
+ /* bc */ 0x0000bf81, 0x0000bf82, 0x0000bf83, 0x0000bf84,
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x04fd5 ***/
+
+ /* 80 */ 0x0000bf85, 0x0000b7b1, 0x0000bf86, 0x0000bf87,
+ /* 84 */ 0x0000bf88, 0x0000bf89, 0x0000bf8a, 0x0000f4ed,
+ /* 88 */ 0x0000bf8b, 0x0000bf8c, 0x0000bf8d, 0x0000bf8e,
+ /* 8c */ 0x0000bf8f, 0x0000bf90, 0x0000bf91, 0x0000bf92,
+ /* 90 */ 0x0000bf93, 0x0000bf94, 0x0000bf95, 0x0000bf96,
+ /* 94 */ 0x0000bf97, 0x0000bf98, 0x0000bf99, 0x0000bf9a,
+ /* 98 */ 0x0000bf9b, 0x0000bf9c, 0x0000bf9d, 0x0000bf9e,
+ /* 9c */ 0x0000bf9f, 0x0000bfa0, 0x0000c040, 0x0000c041,
+ /* a0 */ 0x0000c042, 0x0000c043, 0x0000c044, 0x0000c045,
+ /* a4 */ 0x0000c046, 0x0000c047, 0x0000c048, 0x0000c049,
+ /* a8 */ 0x0000c04a, 0x0000c04b, 0x0000c04c, 0x0000c04d,
+ /* ac */ 0x0000c04e, 0x0000c04f, 0x0000c050, 0x0000c051,
+ /* b0 */ 0x0000c052, 0x0000c053, 0x0000c054, 0x0000c055,
+ /* b4 */ 0x0000c056, 0x0000c057, 0x0000c058, 0x0000c059,
+ /* b8 */ 0x0000c05a, 0x0000c05b, 0x0000c05c, 0x0000c05d,
+ /* bc */ 0x0000c05e, 0x0000c05f, 0x0000c060, 0x0000c061,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x05015 ***/
+
+ /* 80 */ 0x0000c062, 0x0000c063, 0x0000d7eb, 0x0000c064,
+ /* 84 */ 0x0000c065, 0x0000c066, 0x0000c067, 0x0000c068,
+ /* 88 */ 0x0000c069, 0x0000c06a, 0x0000c06b, 0x0000c06c,
+ /* 8c */ 0x0000c06d, 0x0000c06e, 0x0000c06f, 0x0000c070,
+ /* 90 */ 0x0000c071, 0x0000c072, 0x0000c073, 0x0000c074,
+ /* 94 */ 0x0000c075, 0x0000c076, 0x0000c077, 0x0000c078,
+ /* 98 */ 0x0000c079, 0x0000c07a, 0x0000c07b, 0x0000f4ee,
+ /* 9c */ 0x0000c07c, 0x0000c07d, 0x0000c07e, 0x0000e6f9,
+ /* a0 */ 0x0000bec0, 0x0000e6fa, 0x0000baec, 0x0000e6fb,
+ /* a4 */ 0x0000cfcb, 0x0000e6fc, 0x0000d4bc, 0x0000bcb6,
+ /* a8 */ 0x0000e6fd, 0x0000e6fe, 0x0000bccd, 0x0000c8d2,
+ /* ac */ 0x0000ceb3, 0x0000e7a1, 0x0000c080, 0x0000b4bf,
+ /* b0 */ 0x0000e7a2, 0x0000c9b4, 0x0000b8d9, 0x0000c4c9,
+ /* b4 */ 0x0000c081, 0x0000d7dd, 0x0000c2da, 0x0000b7d7,
+ /* b8 */ 0x0000d6bd, 0x0000cec6, 0x0000b7c4, 0x0000c082,
+ /* bc */ 0x0000c083, 0x0000c5a6, 0x0000e7a3, 0x0000cfdf,
+
+ /*** Three byte table, leaf: e7bbxx - offset 0x05055 ***/
+
+ /* 80 */ 0x0000e7a4, 0x0000e7a5, 0x0000e7a6, 0x0000c1b7,
+ /* 84 */ 0x0000d7e9, 0x0000c9f0, 0x0000cfb8, 0x0000d6af,
+ /* 88 */ 0x0000d6d5, 0x0000e7a7, 0x0000b0ed, 0x0000e7a8,
+ /* 8c */ 0x0000e7a9, 0x0000c9dc, 0x0000d2ef, 0x0000bead,
+ /* 90 */ 0x0000e7aa, 0x0000b0f3, 0x0000c8de, 0x0000bde1,
+ /* 94 */ 0x0000e7ab, 0x0000c8c6, 0x0000c084, 0x0000e7ac,
+ /* 98 */ 0x0000bbe6, 0x0000b8f8, 0x0000d1a4, 0x0000e7ad,
+ /* 9c */ 0x0000c2e7, 0x0000bef8, 0x0000bdca, 0x0000cdb3,
+ /* a0 */ 0x0000e7ae, 0x0000e7af, 0x0000beee, 0x0000d0e5,
+ /* a4 */ 0x0000c085, 0x0000cbe7, 0x0000ccd0, 0x0000bccc,
+ /* a8 */ 0x0000e7b0, 0x0000bca8, 0x0000d0f7, 0x0000e7b1,
+ /* ac */ 0x0000c086, 0x0000d0f8, 0x0000e7b2, 0x0000e7b3,
+ /* b0 */ 0x0000b4c2, 0x0000e7b4, 0x0000e7b5, 0x0000c9fe,
+ /* b4 */ 0x0000ceac, 0x0000c3e0, 0x0000e7b7, 0x0000b1c1,
+ /* b8 */ 0x0000b3f1, 0x0000c087, 0x0000e7b8, 0x0000e7b9,
+ /* bc */ 0x0000d7db, 0x0000d5c0, 0x0000e7ba, 0x0000c2cc,
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x05095 ***/
+
+ /* 80 */ 0x0000d7ba, 0x0000e7bb, 0x0000e7bc, 0x0000e7bd,
+ /* 84 */ 0x0000bcea, 0x0000c3e5, 0x0000c0c2, 0x0000e7be,
+ /* 88 */ 0x0000e7bf, 0x0000bca9, 0x0000c088, 0x0000e7c0,
+ /* 8c */ 0x0000e7c1, 0x0000e7b6, 0x0000b6d0, 0x0000e7c2,
+ /* 90 */ 0x0000c089, 0x0000e7c3, 0x0000e7c4, 0x0000bbba,
+ /* 94 */ 0x0000b5de, 0x0000c2c6, 0x0000b1e0, 0x0000e7c5,
+ /* 98 */ 0x0000d4b5, 0x0000e7c6, 0x0000b8bf, 0x0000e7c8,
+ /* 9c */ 0x0000e7c7, 0x0000b7ec, 0x0000c08a, 0x0000e7c9,
+ /* a0 */ 0x0000b2f8, 0x0000e7ca, 0x0000e7cb, 0x0000e7cc,
+ /* a4 */ 0x0000e7cd, 0x0000e7ce, 0x0000e7cf, 0x0000e7d0,
+ /* a8 */ 0x0000d3a7, 0x0000cbf5, 0x0000e7d1, 0x0000e7d2,
+ /* ac */ 0x0000e7d3, 0x0000e7d4, 0x0000c9c9, 0x0000e7d5,
+ /* b0 */ 0x0000e7d6, 0x0000e7d7, 0x0000e7d8, 0x0000e7d9,
+ /* b4 */ 0x0000bdc9, 0x0000e7da, 0x0000f3be, 0x0000c08b,
+ /* b8 */ 0x0000b8d7, 0x0000c08c, 0x0000c8b1, 0x0000c08d,
+ /* bc */ 0x0000c08e, 0x0000c08f, 0x0000c090, 0x0000c091,
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x050d5 ***/
+
+ /* 80 */ 0x0000c092, 0x0000c093, 0x0000f3bf, 0x0000c094,
+ /* 84 */ 0x0000f3c0, 0x0000f3c1, 0x0000c095, 0x0000c096,
+ /* 88 */ 0x0000c097, 0x0000c098, 0x0000c099, 0x0000c09a,
+ /* 8c */ 0x0000c09b, 0x0000c09c, 0x0000c09d, 0x0000c09e,
+ /* 90 */ 0x0000b9de, 0x0000cdf8, 0x0000c09f, 0x0000c0a0,
+ /* 94 */ 0x0000d8e8, 0x0000bab1, 0x0000c140, 0x0000c2de,
+ /* 98 */ 0x0000eeb7, 0x0000c141, 0x0000b7a3, 0x0000c142,
+ /* 9c */ 0x0000c143, 0x0000c144, 0x0000c145, 0x0000eeb9,
+ /* a0 */ 0x0000c146, 0x0000eeb8, 0x0000b0d5, 0x0000c147,
+ /* a4 */ 0x0000c148, 0x0000c149, 0x0000c14a, 0x0000c14b,
+ /* a8 */ 0x0000eebb, 0x0000d5d6, 0x0000d7ef, 0x0000c14c,
+ /* ac */ 0x0000c14d, 0x0000c14e, 0x0000d6c3, 0x0000c14f,
+ /* b0 */ 0x0000c150, 0x0000eebd, 0x0000caf0, 0x0000c151,
+ /* b4 */ 0x0000eebc, 0x0000c152, 0x0000c153, 0x0000c154,
+ /* b8 */ 0x0000c155, 0x0000eebe, 0x0000c156, 0x0000c157,
+ /* bc */ 0x0000c158, 0x0000c159, 0x0000eec0, 0x0000c15a,
+
+ /*** Three byte table, leaf: e7bexx - offset 0x05115 ***/
+
+ /* 80 */ 0x0000c15b, 0x0000eebf, 0x0000c15c, 0x0000c15d,
+ /* 84 */ 0x0000c15e, 0x0000c15f, 0x0000c160, 0x0000c161,
+ /* 88 */ 0x0000c162, 0x0000c163, 0x0000d1f2, 0x0000c164,
+ /* 8c */ 0x0000c7bc, 0x0000c165, 0x0000c3c0, 0x0000c166,
+ /* 90 */ 0x0000c167, 0x0000c168, 0x0000c169, 0x0000c16a,
+ /* 94 */ 0x0000b8e1, 0x0000c16b, 0x0000c16c, 0x0000c16d,
+ /* 98 */ 0x0000c16e, 0x0000c16f, 0x0000c1e7, 0x0000c170,
+ /* 9c */ 0x0000c171, 0x0000f4c6, 0x0000d0df, 0x0000f4c7,
+ /* a0 */ 0x0000c172, 0x0000cfdb, 0x0000c173, 0x0000c174,
+ /* a4 */ 0x0000c8ba, 0x0000c175, 0x0000c176, 0x0000f4c8,
+ /* a8 */ 0x0000c177, 0x0000c178, 0x0000c179, 0x0000c17a,
+ /* ac */ 0x0000c17b, 0x0000c17c, 0x0000c17d, 0x0000f4c9,
+ /* b0 */ 0x0000f4ca, 0x0000c17e, 0x0000f4cb, 0x0000c180,
+ /* b4 */ 0x0000c181, 0x0000c182, 0x0000c183, 0x0000c184,
+ /* b8 */ 0x0000d9fa, 0x0000b8fe, 0x0000c185, 0x0000c186,
+ /* bc */ 0x0000e5f1, 0x0000d3f0, 0x0000c187, 0x0000f4e0,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x05155 ***/
+
+ /* 80 */ 0x0000c188, 0x0000cecc, 0x0000c189, 0x0000c18a,
+ /* 84 */ 0x0000c18b, 0x0000b3e1, 0x0000c18c, 0x0000c18d,
+ /* 88 */ 0x0000c18e, 0x0000c18f, 0x0000f1b4, 0x0000c190,
+ /* 8c */ 0x0000d2ee, 0x0000c191, 0x0000f4e1, 0x0000c192,
+ /* 90 */ 0x0000c193, 0x0000c194, 0x0000c195, 0x0000c196,
+ /* 94 */ 0x0000cfe8, 0x0000f4e2, 0x0000c197, 0x0000c198,
+ /* 98 */ 0x0000c7cc, 0x0000c199, 0x0000c19a, 0x0000c19b,
+ /* 9c */ 0x0000c19c, 0x0000c19d, 0x0000c19e, 0x0000b5d4,
+ /* a0 */ 0x0000b4e4, 0x0000f4e4, 0x0000c19f, 0x0000c1a0,
+ /* a4 */ 0x0000c240, 0x0000f4e3, 0x0000f4e5, 0x0000c241,
+ /* a8 */ 0x0000c242, 0x0000f4e6, 0x0000c243, 0x0000c244,
+ /* ac */ 0x0000c245, 0x0000c246, 0x0000f4e7, 0x0000c247,
+ /* b0 */ 0x0000bab2, 0x0000b0bf, 0x0000c248, 0x0000f4e8,
+ /* b4 */ 0x0000c249, 0x0000c24a, 0x0000c24b, 0x0000c24c,
+ /* b8 */ 0x0000c24d, 0x0000c24e, 0x0000c24f, 0x0000b7ad,
+ /* bc */ 0x0000d2ed, 0x0000c250, 0x0000c251, 0x0000c252,
+
+ /*** Three byte table, leaf: e880xx - offset 0x05195 ***/
+
+ /* 80 */ 0x0000d2ab, 0x0000c0cf, 0x0000c253, 0x0000bfbc,
+ /* 84 */ 0x0000eba3, 0x0000d5df, 0x0000eac8, 0x0000c254,
+ /* 88 */ 0x0000c255, 0x0000c256, 0x0000c257, 0x0000f1f3,
+ /* 8c */ 0x0000b6f8, 0x0000cba3, 0x0000c258, 0x0000c259,
+ /* 90 */ 0x0000c4cd, 0x0000c25a, 0x0000f1e7, 0x0000c25b,
+ /* 94 */ 0x0000f1e8, 0x0000b8fb, 0x0000f1e9, 0x0000bac4,
+ /* 98 */ 0x0000d4c5, 0x0000b0d2, 0x0000c25c, 0x0000c25d,
+ /* 9c */ 0x0000f1ea, 0x0000c25e, 0x0000c25f, 0x0000c260,
+ /* a0 */ 0x0000f1eb, 0x0000c261, 0x0000f1ec, 0x0000c262,
+ /* a4 */ 0x0000c263, 0x0000f1ed, 0x0000f1ee, 0x0000f1ef,
+ /* a8 */ 0x0000f1f1, 0x0000f1f0, 0x0000c5d5, 0x0000c264,
+ /* ac */ 0x0000c265, 0x0000c266, 0x0000c267, 0x0000c268,
+ /* b0 */ 0x0000c269, 0x0000f1f2, 0x0000c26a, 0x0000b6fa,
+ /* b4 */ 0x0000c26b, 0x0000f1f4, 0x0000d2ae, 0x0000dec7,
+ /* b8 */ 0x0000cbca, 0x0000c26c, 0x0000c26d, 0x0000b3dc,
+ /* bc */ 0x0000c26e, 0x0000b5a2, 0x0000c26f, 0x0000b9a2,
+
+ /*** Three byte table, leaf: e881xx - offset 0x051d5 ***/
+
+ /* 80 */ 0x0000c270, 0x0000c271, 0x0000c4f4, 0x0000f1f5,
+ /* 84 */ 0x0000c272, 0x0000c273, 0x0000f1f6, 0x0000c274,
+ /* 88 */ 0x0000c275, 0x0000c276, 0x0000c1c4, 0x0000c1fb,
+ /* 8c */ 0x0000d6b0, 0x0000f1f7, 0x0000c277, 0x0000c278,
+ /* 90 */ 0x0000c279, 0x0000c27a, 0x0000f1f8, 0x0000c27b,
+ /* 94 */ 0x0000c1aa, 0x0000c27c, 0x0000c27d, 0x0000c27e,
+ /* 98 */ 0x0000c6b8, 0x0000c280, 0x0000bedb, 0x0000c281,
+ /* 9c */ 0x0000c282, 0x0000c283, 0x0000c284, 0x0000c285,
+ /* a0 */ 0x0000c286, 0x0000c287, 0x0000c288, 0x0000c289,
+ /* a4 */ 0x0000c28a, 0x0000c28b, 0x0000c28c, 0x0000c28d,
+ /* a8 */ 0x0000c28e, 0x0000f1f9, 0x0000b4cf, 0x0000c28f,
+ /* ac */ 0x0000c290, 0x0000c291, 0x0000c292, 0x0000c293,
+ /* b0 */ 0x0000c294, 0x0000f1fa, 0x0000c295, 0x0000c296,
+ /* b4 */ 0x0000c297, 0x0000c298, 0x0000c299, 0x0000c29a,
+ /* b8 */ 0x0000c29b, 0x0000c29c, 0x0000c29d, 0x0000c29e,
+ /* bc */ 0x0000c29f, 0x0000c2a0, 0x0000c340, 0x0000edb2,
+
+ /*** Three byte table, leaf: e882xx - offset 0x05215 ***/
+
+ /* 80 */ 0x0000edb1, 0x0000c341, 0x0000c342, 0x0000cbe0,
+ /* 84 */ 0x0000d2de, 0x0000c343, 0x0000cbc1, 0x0000d5d8,
+ /* 88 */ 0x0000c344, 0x0000c8e2, 0x0000c345, 0x0000c0df,
+ /* 8c */ 0x0000bca1, 0x0000c346, 0x0000c347, 0x0000c348,
+ /* 90 */ 0x0000c349, 0x0000c34a, 0x0000c34b, 0x0000ebc1,
+ /* 94 */ 0x0000c34c, 0x0000c34d, 0x0000d0a4, 0x0000c34e,
+ /* 98 */ 0x0000d6e2, 0x0000c34f, 0x0000b6c7, 0x0000b8d8,
+ /* 9c */ 0x0000ebc0, 0x0000b8ce, 0x0000c350, 0x0000ebbf,
+ /* a0 */ 0x0000b3a6, 0x0000b9c9, 0x0000d6ab, 0x0000c351,
+ /* a4 */ 0x0000b7f4, 0x0000b7ca, 0x0000c352, 0x0000c353,
+ /* a8 */ 0x0000c354, 0x0000bce7, 0x0000b7be, 0x0000ebc6,
+ /* ac */ 0x0000c355, 0x0000ebc7, 0x0000b0b9, 0x0000bfcf,
+ /* b0 */ 0x0000c356, 0x0000ebc5, 0x0000d3fd, 0x0000c357,
+ /* b4 */ 0x0000ebc8, 0x0000c358, 0x0000c359, 0x0000ebc9,
+ /* b8 */ 0x0000c35a, 0x0000c35b, 0x0000b7ce, 0x0000c35c,
+ /* bc */ 0x0000ebc2, 0x0000ebc4, 0x0000c9f6, 0x0000d6d7,
+
+ /*** Three byte table, leaf: e883xx - offset 0x05255 ***/
+
+ /* 80 */ 0x0000d5cd, 0x0000d0b2, 0x0000ebcf, 0x0000ceb8,
+ /* 84 */ 0x0000ebd0, 0x0000c35d, 0x0000b5a8, 0x0000c35e,
+ /* 88 */ 0x0000c35f, 0x0000c360, 0x0000c361, 0x0000c362,
+ /* 8c */ 0x0000b1b3, 0x0000ebd2, 0x0000cca5, 0x0000c363,
+ /* 90 */ 0x0000c364, 0x0000c365, 0x0000c366, 0x0000c367,
+ /* 94 */ 0x0000c368, 0x0000c369, 0x0000c5d6, 0x0000ebd3,
+ /* 98 */ 0x0000c36a, 0x0000ebd1, 0x0000c5df, 0x0000ebce,
+ /* 9c */ 0x0000caa4, 0x0000ebd5, 0x0000b0fb, 0x0000c36b,
+ /* a0 */ 0x0000c36c, 0x0000bafa, 0x0000c36d, 0x0000c36e,
+ /* a4 */ 0x0000d8b7, 0x0000f1e3, 0x0000c36f, 0x0000ebca,
+ /* a8 */ 0x0000ebcb, 0x0000ebcc, 0x0000ebcd, 0x0000ebd6,
+ /* ac */ 0x0000e6c0, 0x0000ebd9, 0x0000c370, 0x0000bfe8,
+ /* b0 */ 0x0000d2c8, 0x0000ebd7, 0x0000ebdc, 0x0000b8ec,
+ /* b4 */ 0x0000ebd8, 0x0000c371, 0x0000bdba, 0x0000c372,
+ /* b8 */ 0x0000d0d8, 0x0000c373, 0x0000b0b7, 0x0000c374,
+ /* bc */ 0x0000ebdd, 0x0000c4dc, 0x0000c375, 0x0000c376,
+
+ /*** Three byte table, leaf: e884xx - offset 0x05295 ***/
+
+ /* 80 */ 0x0000c377, 0x0000c378, 0x0000d6ac, 0x0000c379,
+ /* 84 */ 0x0000c37a, 0x0000c37b, 0x0000b4e0, 0x0000c37c,
+ /* 88 */ 0x0000c37d, 0x0000c2f6, 0x0000bcb9, 0x0000c37e,
+ /* 8c */ 0x0000c380, 0x0000ebda, 0x0000ebdb, 0x0000d4e0,
+ /* 90 */ 0x0000c6ea, 0x0000c4d4, 0x0000ebdf, 0x0000c5a7,
+ /* 94 */ 0x0000d9f5, 0x0000c381, 0x0000b2b1, 0x0000c382,
+ /* 98 */ 0x0000ebe4, 0x0000c383, 0x0000bdc5, 0x0000c384,
+ /* 9c */ 0x0000c385, 0x0000c386, 0x0000ebe2, 0x0000c387,
+ /* a0 */ 0x0000c388, 0x0000c389, 0x0000c38a, 0x0000c38b,
+ /* a4 */ 0x0000c38c, 0x0000c38d, 0x0000c38e, 0x0000c38f,
+ /* a8 */ 0x0000c390, 0x0000c391, 0x0000c392, 0x0000c393,
+ /* ac */ 0x0000ebe3, 0x0000c394, 0x0000c395, 0x0000b8ac,
+ /* b0 */ 0x0000c396, 0x0000cdd1, 0x0000ebe5, 0x0000c397,
+ /* b4 */ 0x0000c398, 0x0000c399, 0x0000ebe1, 0x0000c39a,
+ /* b8 */ 0x0000c1b3, 0x0000c39b, 0x0000c39c, 0x0000c39d,
+ /* bc */ 0x0000c39e, 0x0000c39f, 0x0000c6a2, 0x0000c3a0,
+
+ /*** Three byte table, leaf: e885xx - offset 0x052d5 ***/
+
+ /* 80 */ 0x0000c440, 0x0000c441, 0x0000c442, 0x0000c443,
+ /* 84 */ 0x0000c444, 0x0000c445, 0x0000ccf3, 0x0000c446,
+ /* 88 */ 0x0000ebe6, 0x0000c447, 0x0000c0b0, 0x0000d2b8,
+ /* 8c */ 0x0000ebe7, 0x0000c448, 0x0000c449, 0x0000c44a,
+ /* 90 */ 0x0000b8af, 0x0000b8ad, 0x0000c44b, 0x0000ebe8,
+ /* 94 */ 0x0000c7bb, 0x0000cdf3, 0x0000c44c, 0x0000c44d,
+ /* 98 */ 0x0000c44e, 0x0000ebea, 0x0000ebeb, 0x0000c44f,
+ /* 9c */ 0x0000c450, 0x0000c451, 0x0000c452, 0x0000c453,
+ /* a0 */ 0x0000ebed, 0x0000c454, 0x0000c455, 0x0000c456,
+ /* a4 */ 0x0000c457, 0x0000d0c8, 0x0000c458, 0x0000ebf2,
+ /* a8 */ 0x0000c459, 0x0000ebee, 0x0000c45a, 0x0000c45b,
+ /* ac */ 0x0000c45c, 0x0000ebf1, 0x0000c8f9, 0x0000c45d,
+ /* b0 */ 0x0000d1fc, 0x0000ebec, 0x0000c45e, 0x0000c45f,
+ /* b4 */ 0x0000ebe9, 0x0000c460, 0x0000c461, 0x0000c462,
+ /* b8 */ 0x0000c463, 0x0000b8b9, 0x0000cfd9, 0x0000c4e5,
+ /* bc */ 0x0000ebef, 0x0000ebf0, 0x0000ccda, 0x0000cdc8,
+
+ /*** Three byte table, leaf: e886xx - offset 0x05315 ***/
+
+ /* 80 */ 0x0000b0f2, 0x0000c464, 0x0000ebf6, 0x0000c465,
+ /* 84 */ 0x0000c466, 0x0000c467, 0x0000c468, 0x0000c469,
+ /* 88 */ 0x0000ebf5, 0x0000c46a, 0x0000b2b2, 0x0000c46b,
+ /* 8c */ 0x0000c46c, 0x0000c46d, 0x0000c46e, 0x0000b8e0,
+ /* 90 */ 0x0000c46f, 0x0000ebf7, 0x0000c470, 0x0000c471,
+ /* 94 */ 0x0000c472, 0x0000c473, 0x0000c474, 0x0000c475,
+ /* 98 */ 0x0000b1ec, 0x0000c476, 0x0000c477, 0x0000ccc5,
+ /* 9c */ 0x0000c4a4, 0x0000cfa5, 0x0000c478, 0x0000c479,
+ /* a0 */ 0x0000c47a, 0x0000c47b, 0x0000c47c, 0x0000ebf9,
+ /* a4 */ 0x0000c47d, 0x0000c47e, 0x0000eca2, 0x0000c480,
+ /* a8 */ 0x0000c5f2, 0x0000c481, 0x0000ebfa, 0x0000c482,
+ /* ac */ 0x0000c483, 0x0000c484, 0x0000c485, 0x0000c486,
+ /* b0 */ 0x0000c487, 0x0000c488, 0x0000c489, 0x0000c9c5,
+ /* b4 */ 0x0000c48a, 0x0000c48b, 0x0000c48c, 0x0000c48d,
+ /* b8 */ 0x0000c48e, 0x0000c48f, 0x0000e2df, 0x0000ebfe,
+ /* bc */ 0x0000c490, 0x0000c491, 0x0000c492, 0x0000c493,
+
+ /*** Three byte table, leaf: e887xx - offset 0x05355 ***/
+
+ /* 80 */ 0x0000cdce, 0x0000eca1, 0x0000b1db, 0x0000d3b7,
+ /* 84 */ 0x0000c494, 0x0000c495, 0x0000d2dc, 0x0000c496,
+ /* 88 */ 0x0000c497, 0x0000c498, 0x0000ebfd, 0x0000c499,
+ /* 8c */ 0x0000ebfb, 0x0000c49a, 0x0000c49b, 0x0000c49c,
+ /* 90 */ 0x0000c49d, 0x0000c49e, 0x0000c49f, 0x0000c4a0,
+ /* 94 */ 0x0000c540, 0x0000c541, 0x0000c542, 0x0000c543,
+ /* 98 */ 0x0000c544, 0x0000c545, 0x0000c546, 0x0000c547,
+ /* 9c */ 0x0000c548, 0x0000c549, 0x0000c54a, 0x0000c54b,
+ /* a0 */ 0x0000c54c, 0x0000c54d, 0x0000c54e, 0x0000b3bc,
+ /* a4 */ 0x0000c54f, 0x0000c550, 0x0000c551, 0x0000eab0,
+ /* a8 */ 0x0000c552, 0x0000c553, 0x0000d7d4, 0x0000c554,
+ /* ac */ 0x0000f4ab, 0x0000b3f4, 0x0000c555, 0x0000c556,
+ /* b0 */ 0x0000c557, 0x0000c558, 0x0000c559, 0x0000d6c1,
+ /* b4 */ 0x0000d6c2, 0x0000c55a, 0x0000c55b, 0x0000c55c,
+ /* b8 */ 0x0000c55d, 0x0000c55e, 0x0000c55f, 0x0000d5e9,
+ /* bc */ 0x0000beca, 0x0000c560, 0x0000f4a7, 0x0000c561,
+
+ /*** Three byte table, leaf: e888xx - offset 0x05395 ***/
+
+ /* 80 */ 0x0000d2a8, 0x0000f4a8, 0x0000f4a9, 0x0000c562,
+ /* 84 */ 0x0000f4aa, 0x0000becb, 0x0000d3df, 0x0000c563,
+ /* 88 */ 0x0000c564, 0x0000c565, 0x0000c566, 0x0000c567,
+ /* 8c */ 0x0000c9e0, 0x0000c9e1, 0x0000c568, 0x0000c569,
+ /* 90 */ 0x0000f3c2, 0x0000c56a, 0x0000cae6, 0x0000c56b,
+ /* 94 */ 0x0000ccf2, 0x0000c56c, 0x0000c56d, 0x0000c56e,
+ /* 98 */ 0x0000c56f, 0x0000c570, 0x0000c571, 0x0000e2b6,
+ /* 9c */ 0x0000cbb4, 0x0000c572, 0x0000cee8, 0x0000d6db,
+ /* a0 */ 0x0000c573, 0x0000f4ad, 0x0000f4ae, 0x0000f4af,
+ /* a4 */ 0x0000c574, 0x0000c575, 0x0000c576, 0x0000c577,
+ /* a8 */ 0x0000f4b2, 0x0000c578, 0x0000babd, 0x0000f4b3,
+ /* ac */ 0x0000b0e3, 0x0000f4b0, 0x0000c579, 0x0000f4b1,
+ /* b0 */ 0x0000bda2, 0x0000b2d5, 0x0000c57a, 0x0000f4b6,
+ /* b4 */ 0x0000f4b7, 0x0000b6e6, 0x0000b2b0, 0x0000cfcf,
+ /* b8 */ 0x0000f4b4, 0x0000b4ac, 0x0000c57b, 0x0000f4b5,
+ /* bc */ 0x0000c57c, 0x0000c57d, 0x0000f4b8, 0x0000c57e,
+
+ /*** Three byte table, leaf: e889xx - offset 0x053d5 ***/
+
+ /* 80 */ 0x0000c580, 0x0000c581, 0x0000c582, 0x0000c583,
+ /* 84 */ 0x0000f4b9, 0x0000c584, 0x0000c585, 0x0000cda7,
+ /* 88 */ 0x0000c586, 0x0000f4ba, 0x0000c587, 0x0000f4bb,
+ /* 8c */ 0x0000c588, 0x0000c589, 0x0000c58a, 0x0000f4bc,
+ /* 90 */ 0x0000c58b, 0x0000c58c, 0x0000c58d, 0x0000c58e,
+ /* 94 */ 0x0000c58f, 0x0000c590, 0x0000c591, 0x0000c592,
+ /* 98 */ 0x0000cbd2, 0x0000c593, 0x0000f4bd, 0x0000c594,
+ /* 9c */ 0x0000c595, 0x0000c596, 0x0000c597, 0x0000f4be,
+ /* a0 */ 0x0000c598, 0x0000c599, 0x0000c59a, 0x0000c59b,
+ /* a4 */ 0x0000c59c, 0x0000c59d, 0x0000c59e, 0x0000c59f,
+ /* a8 */ 0x0000f4bf, 0x0000c5a0, 0x0000c640, 0x0000c641,
+ /* ac */ 0x0000c642, 0x0000c643, 0x0000f4de, 0x0000c1bc,
+ /* b0 */ 0x0000bce8, 0x0000c644, 0x0000c9ab, 0x0000d1de,
+ /* b4 */ 0x0000e5f5, 0x0000c645, 0x0000c646, 0x0000c647,
+ /* b8 */ 0x0000c648, 0x0000dcb3, 0x0000d2d5, 0x0000c649,
+ /* bc */ 0x0000c64a, 0x0000dcb4, 0x0000b0ac, 0x0000dcb5,
+
+ /*** Three byte table, leaf: e88axx - offset 0x05415 ***/
+
+ /* 80 */ 0x0000c64b, 0x0000c64c, 0x0000bdda, 0x0000c64d,
+ /* 84 */ 0x0000dcb9, 0x0000c64e, 0x0000c64f, 0x0000c650,
+ /* 88 */ 0x0000d8c2, 0x0000c651, 0x0000dcb7, 0x0000d3f3,
+ /* 8c */ 0x0000c652, 0x0000c9d6, 0x0000dcba, 0x0000dcb6,
+ /* 90 */ 0x0000c653, 0x0000dcbb, 0x0000c3a2, 0x0000c654,
+ /* 94 */ 0x0000c655, 0x0000c656, 0x0000c657, 0x0000dcbc,
+ /* 98 */ 0x0000dcc5, 0x0000dcbd, 0x0000c658, 0x0000c659,
+ /* 9c */ 0x0000cedf, 0x0000d6a5, 0x0000c65a, 0x0000dccf,
+ /* a0 */ 0x0000c65b, 0x0000dccd, 0x0000c65c, 0x0000c65d,
+ /* a4 */ 0x0000dcd2, 0x0000bde6, 0x0000c2ab, 0x0000c65e,
+ /* a8 */ 0x0000dcb8, 0x0000dccb, 0x0000dcce, 0x0000dcbe,
+ /* ac */ 0x0000b7d2, 0x0000b0c5, 0x0000dcc7, 0x0000d0be,
+ /* b0 */ 0x0000dcc1, 0x0000bba8, 0x0000c65f, 0x0000b7bc,
+ /* b4 */ 0x0000dccc, 0x0000c660, 0x0000c661, 0x0000dcc6,
+ /* b8 */ 0x0000dcbf, 0x0000c7db, 0x0000c662, 0x0000c663,
+ /* bc */ 0x0000c664, 0x0000d1bf, 0x0000dcc0, 0x0000c665,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x05455 ***/
+
+ /* 80 */ 0x0000c666, 0x0000dcca, 0x0000c667, 0x0000c668,
+ /* 84 */ 0x0000dcd0, 0x0000c669, 0x0000c66a, 0x0000cead,
+ /* 88 */ 0x0000dcc2, 0x0000c66b, 0x0000dcc3, 0x0000dcc8,
+ /* 8c */ 0x0000dcc9, 0x0000b2d4, 0x0000dcd1, 0x0000cbd5,
+ /* 90 */ 0x0000c66c, 0x0000d4b7, 0x0000dcdb, 0x0000dcdf,
+ /* 94 */ 0x0000cca6, 0x0000dce6, 0x0000c66d, 0x0000c3e7,
+ /* 98 */ 0x0000dcdc, 0x0000c66e, 0x0000c66f, 0x0000bfc1,
+ /* 9c */ 0x0000dcd9, 0x0000c670, 0x0000b0fa, 0x0000b9b6,
+ /* a0 */ 0x0000dce5, 0x0000dcd3, 0x0000c671, 0x0000dcc4,
+ /* a4 */ 0x0000dcd6, 0x0000c8f4, 0x0000bfe0, 0x0000c672,
+ /* a8 */ 0x0000c673, 0x0000c674, 0x0000c675, 0x0000c9bb,
+ /* ac */ 0x0000c676, 0x0000c677, 0x0000c678, 0x0000b1bd,
+ /* b0 */ 0x0000c679, 0x0000d3a2, 0x0000c67a, 0x0000c67b,
+ /* b4 */ 0x0000dcda, 0x0000c67c, 0x0000c67d, 0x0000dcd5,
+ /* b8 */ 0x0000c67e, 0x0000c6bb, 0x0000c680, 0x0000dcde,
+ /* bc */ 0x0000c681, 0x0000c682, 0x0000c683, 0x0000c684,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x05495 ***/
+
+ /* 80 */ 0x0000c685, 0x0000d7c2, 0x0000c3af, 0x0000b7b6,
+ /* 84 */ 0x0000c7d1, 0x0000c3a9, 0x0000dce2, 0x0000dcd8,
+ /* 88 */ 0x0000dceb, 0x0000dcd4, 0x0000c686, 0x0000c687,
+ /* 8c */ 0x0000dcdd, 0x0000c688, 0x0000bea5, 0x0000dcd7,
+ /* 90 */ 0x0000c689, 0x0000dce0, 0x0000c68a, 0x0000c68b,
+ /* 94 */ 0x0000dce3, 0x0000dce4, 0x0000c68c, 0x0000dcf8,
+ /* 98 */ 0x0000c68d, 0x0000c68e, 0x0000dce1, 0x0000dda2,
+ /* 9c */ 0x0000dce7, 0x0000c68f, 0x0000c690, 0x0000c691,
+ /* a0 */ 0x0000c692, 0x0000c693, 0x0000c694, 0x0000c695,
+ /* a4 */ 0x0000c696, 0x0000c697, 0x0000c698, 0x0000bceb,
+ /* a8 */ 0x0000b4c4, 0x0000c699, 0x0000c69a, 0x0000c3a3,
+ /* ac */ 0x0000b2e7, 0x0000dcfa, 0x0000c69b, 0x0000dcf2,
+ /* b0 */ 0x0000c69c, 0x0000dcef, 0x0000c69d, 0x0000dcfc,
+ /* b4 */ 0x0000dcee, 0x0000d2f0, 0x0000b2e8, 0x0000c69e,
+ /* b8 */ 0x0000c8d7, 0x0000c8e3, 0x0000dcfb, 0x0000c69f,
+ /* bc */ 0x0000dced, 0x0000c6a0, 0x0000c740, 0x0000c741,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x054d5 ***/
+
+ /* 80 */ 0x0000dcf7, 0x0000c742, 0x0000c743, 0x0000dcf5,
+ /* 84 */ 0x0000c744, 0x0000c745, 0x0000bea3, 0x0000dcf4,
+ /* 88 */ 0x0000c746, 0x0000b2dd, 0x0000c747, 0x0000c748,
+ /* 8c */ 0x0000c749, 0x0000c74a, 0x0000c74b, 0x0000dcf3,
+ /* 90 */ 0x0000bcf6, 0x0000dce8, 0x0000bbc4, 0x0000c74c,
+ /* 94 */ 0x0000c0f3, 0x0000c74d, 0x0000c74e, 0x0000c74f,
+ /* 98 */ 0x0000c750, 0x0000c751, 0x0000bcd4, 0x0000dce9,
+ /* 9c */ 0x0000dcea, 0x0000c752, 0x0000dcf1, 0x0000dcf6,
+ /* a0 */ 0x0000dcf9, 0x0000b5b4, 0x0000c753, 0x0000c8d9,
+ /* a4 */ 0x0000bbe7, 0x0000dcfe, 0x0000dcfd, 0x0000d3ab,
+ /* a8 */ 0x0000dda1, 0x0000dda3, 0x0000dda5, 0x0000d2f1,
+ /* ac */ 0x0000dda4, 0x0000dda6, 0x0000dda7, 0x0000d2a9,
+ /* b0 */ 0x0000c754, 0x0000c755, 0x0000c756, 0x0000c757,
+ /* b4 */ 0x0000c758, 0x0000c759, 0x0000c75a, 0x0000bac9,
+ /* b8 */ 0x0000dda9, 0x0000c75b, 0x0000c75c, 0x0000ddb6,
+ /* bc */ 0x0000ddb1, 0x0000ddb4, 0x0000c75d, 0x0000c75e,
+
+ /*** Three byte table, leaf: e88exx - offset 0x05515 ***/
+
+ /* 80 */ 0x0000c75f, 0x0000c760, 0x0000c761, 0x0000c762,
+ /* 84 */ 0x0000c763, 0x0000ddb0, 0x0000c6ce, 0x0000c764,
+ /* 88 */ 0x0000c765, 0x0000c0f2, 0x0000c766, 0x0000c767,
+ /* 8c */ 0x0000c768, 0x0000c769, 0x0000c9af, 0x0000c76a,
+ /* 90 */ 0x0000c76b, 0x0000c76c, 0x0000dcec, 0x0000ddae,
+ /* 94 */ 0x0000c76d, 0x0000c76e, 0x0000c76f, 0x0000c770,
+ /* 98 */ 0x0000ddb7, 0x0000c771, 0x0000c772, 0x0000dcf0,
+ /* 9c */ 0x0000ddaf, 0x0000c773, 0x0000ddb8, 0x0000c774,
+ /* a0 */ 0x0000ddac, 0x0000c775, 0x0000c776, 0x0000c777,
+ /* a4 */ 0x0000c778, 0x0000c779, 0x0000c77a, 0x0000c77b,
+ /* a8 */ 0x0000ddb9, 0x0000ddb3, 0x0000ddad, 0x0000c4aa,
+ /* ac */ 0x0000c77c, 0x0000c77d, 0x0000c77e, 0x0000c780,
+ /* b0 */ 0x0000dda8, 0x0000c0b3, 0x0000c1ab, 0x0000ddaa,
+ /* b4 */ 0x0000ddab, 0x0000c781, 0x0000ddb2, 0x0000bbf1,
+ /* b8 */ 0x0000ddb5, 0x0000d3a8, 0x0000ddba, 0x0000c782,
+ /* bc */ 0x0000ddbb, 0x0000c3a7, 0x0000c783, 0x0000c784,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x05555 ***/
+
+ /* 80 */ 0x0000ddd2, 0x0000ddbc, 0x0000c785, 0x0000c786,
+ /* 84 */ 0x0000c787, 0x0000ddd1, 0x0000c788, 0x0000b9bd,
+ /* 88 */ 0x0000c789, 0x0000c78a, 0x0000bed5, 0x0000c78b,
+ /* 8c */ 0x0000befa, 0x0000c78c, 0x0000c78d, 0x0000baca,
+ /* 90 */ 0x0000c78e, 0x0000c78f, 0x0000c790, 0x0000c791,
+ /* 94 */ 0x0000ddca, 0x0000c792, 0x0000ddc5, 0x0000c793,
+ /* 98 */ 0x0000ddbf, 0x0000c794, 0x0000c795, 0x0000c796,
+ /* 9c */ 0x0000b2cb, 0x0000ddc3, 0x0000c797, 0x0000ddcb,
+ /* a0 */ 0x0000b2a4, 0x0000ddd5, 0x0000c798, 0x0000c799,
+ /* a4 */ 0x0000c79a, 0x0000ddbe, 0x0000c79b, 0x0000c79c,
+ /* a8 */ 0x0000c79d, 0x0000c6d0, 0x0000ddd0, 0x0000c79e,
+ /* ac */ 0x0000c79f, 0x0000c7a0, 0x0000c840, 0x0000c841,
+ /* b0 */ 0x0000ddd4, 0x0000c1e2, 0x0000b7c6, 0x0000c842,
+ /* b4 */ 0x0000c843, 0x0000c844, 0x0000c845, 0x0000c846,
+ /* b8 */ 0x0000ddce, 0x0000ddcf, 0x0000c847, 0x0000c848,
+ /* bc */ 0x0000c849, 0x0000ddc4, 0x0000c84a, 0x0000c84b,
+
+ /*** Three byte table, leaf: e890xx - offset 0x05595 ***/
+
+ /* 80 */ 0x0000c84c, 0x0000ddbd, 0x0000c84d, 0x0000ddcd,
+ /* 84 */ 0x0000ccd1, 0x0000c84e, 0x0000ddc9, 0x0000c84f,
+ /* 88 */ 0x0000c850, 0x0000c851, 0x0000c852, 0x0000ddc2,
+ /* 8c */ 0x0000c3c8, 0x0000c6bc, 0x0000ceae, 0x0000ddcc,
+ /* 90 */ 0x0000c853, 0x0000ddc8, 0x0000c854, 0x0000c855,
+ /* 94 */ 0x0000c856, 0x0000c857, 0x0000c858, 0x0000c859,
+ /* 98 */ 0x0000ddc1, 0x0000c85a, 0x0000c85b, 0x0000c85c,
+ /* 9c */ 0x0000ddc6, 0x0000c2dc, 0x0000c85d, 0x0000c85e,
+ /* a0 */ 0x0000c85f, 0x0000c860, 0x0000c861, 0x0000c862,
+ /* a4 */ 0x0000d3a9, 0x0000d3aa, 0x0000ddd3, 0x0000cff4,
+ /* a8 */ 0x0000c8f8, 0x0000c863, 0x0000c864, 0x0000c865,
+ /* ac */ 0x0000c866, 0x0000c867, 0x0000c868, 0x0000c869,
+ /* b0 */ 0x0000c86a, 0x0000dde6, 0x0000c86b, 0x0000c86c,
+ /* b4 */ 0x0000c86d, 0x0000c86e, 0x0000c86f, 0x0000c870,
+ /* b8 */ 0x0000ddc7, 0x0000c871, 0x0000c872, 0x0000c873,
+ /* bc */ 0x0000dde0, 0x0000c2e4, 0x0000c874, 0x0000c875,
+
+ /*** Three byte table, leaf: e891xx - offset 0x055d5 ***/
+
+ /* 80 */ 0x0000c876, 0x0000c877, 0x0000c878, 0x0000c879,
+ /* 84 */ 0x0000c87a, 0x0000c87b, 0x0000dde1, 0x0000c87c,
+ /* 88 */ 0x0000c87d, 0x0000c87e, 0x0000c880, 0x0000c881,
+ /* 8c */ 0x0000c882, 0x0000c883, 0x0000c884, 0x0000c885,
+ /* 90 */ 0x0000c886, 0x0000ddd7, 0x0000c887, 0x0000c888,
+ /* 94 */ 0x0000c889, 0x0000c88a, 0x0000c88b, 0x0000d6f8,
+ /* 98 */ 0x0000c88c, 0x0000ddd9, 0x0000ddd8, 0x0000b8f0,
+ /* 9c */ 0x0000ddd6, 0x0000c88d, 0x0000c88e, 0x0000c88f,
+ /* a0 */ 0x0000c890, 0x0000c6cf, 0x0000c891, 0x0000b6ad,
+ /* a4 */ 0x0000c892, 0x0000c893, 0x0000c894, 0x0000c895,
+ /* a8 */ 0x0000c896, 0x0000dde2, 0x0000c897, 0x0000baf9,
+ /* ac */ 0x0000d4e1, 0x0000dde7, 0x0000c898, 0x0000c899,
+ /* b0 */ 0x0000c89a, 0x0000b4d0, 0x0000c89b, 0x0000ddda,
+ /* b4 */ 0x0000c89c, 0x0000bffb, 0x0000dde3, 0x0000c89d,
+ /* b8 */ 0x0000dddf, 0x0000c89e, 0x0000dddd, 0x0000c89f,
+ /* bc */ 0x0000c8a0, 0x0000c940, 0x0000c941, 0x0000c942,
+
+ /*** Three byte table, leaf: e892xx - offset 0x05615 ***/
+
+ /* 80 */ 0x0000c943, 0x0000c944, 0x0000b5d9, 0x0000c945,
+ /* 84 */ 0x0000c946, 0x0000c947, 0x0000c948, 0x0000dddb,
+ /* 88 */ 0x0000dddc, 0x0000ddde, 0x0000c949, 0x0000bdaf,
+ /* 8c */ 0x0000dde4, 0x0000c94a, 0x0000dde5, 0x0000c94b,
+ /* 90 */ 0x0000c94c, 0x0000c94d, 0x0000c94e, 0x0000c94f,
+ /* 94 */ 0x0000c950, 0x0000c951, 0x0000c952, 0x0000ddf5,
+ /* 98 */ 0x0000c953, 0x0000c3c9, 0x0000c954, 0x0000c955,
+ /* 9c */ 0x0000cbe2, 0x0000c956, 0x0000c957, 0x0000c958,
+ /* a0 */ 0x0000c959, 0x0000ddf2, 0x0000c95a, 0x0000c95b,
+ /* a4 */ 0x0000c95c, 0x0000c95d, 0x0000c95e, 0x0000c95f,
+ /* a8 */ 0x0000c960, 0x0000c961, 0x0000c962, 0x0000c963,
+ /* ac */ 0x0000c964, 0x0000c965, 0x0000c966, 0x0000d8e1,
+ /* b0 */ 0x0000c967, 0x0000c968, 0x0000c6d1, 0x0000c969,
+ /* b4 */ 0x0000ddf4, 0x0000c96a, 0x0000c96b, 0x0000c96c,
+ /* b8 */ 0x0000d5f4, 0x0000ddf3, 0x0000ddf0, 0x0000c96d,
+ /* bc */ 0x0000c96e, 0x0000ddec, 0x0000c96f, 0x0000ddef,
+
+ /*** Three byte table, leaf: e893xx - offset 0x05655 ***/
+
+ /* 80 */ 0x0000c970, 0x0000dde8, 0x0000c971, 0x0000c972,
+ /* 84 */ 0x0000d0ee, 0x0000c973, 0x0000c974, 0x0000c975,
+ /* 88 */ 0x0000c976, 0x0000c8d8, 0x0000ddee, 0x0000c977,
+ /* 8c */ 0x0000c978, 0x0000dde9, 0x0000c979, 0x0000c97a,
+ /* 90 */ 0x0000ddea, 0x0000cbf2, 0x0000c97b, 0x0000dded,
+ /* 94 */ 0x0000c97c, 0x0000c97d, 0x0000b1cd, 0x0000c97e,
+ /* 98 */ 0x0000c980, 0x0000c981, 0x0000c982, 0x0000c983,
+ /* 9c */ 0x0000c984, 0x0000c0b6, 0x0000c985, 0x0000bcbb,
+ /* a0 */ 0x0000ddf1, 0x0000c986, 0x0000c987, 0x0000ddf7,
+ /* a4 */ 0x0000c988, 0x0000ddf6, 0x0000ddeb, 0x0000c989,
+ /* a8 */ 0x0000c98a, 0x0000c98b, 0x0000c98c, 0x0000c98d,
+ /* ac */ 0x0000c5ee, 0x0000c98e, 0x0000c98f, 0x0000c990,
+ /* b0 */ 0x0000ddfb, 0x0000c991, 0x0000c992, 0x0000c993,
+ /* b4 */ 0x0000c994, 0x0000c995, 0x0000c996, 0x0000c997,
+ /* b8 */ 0x0000c998, 0x0000c999, 0x0000c99a, 0x0000c99b,
+ /* bc */ 0x0000dea4, 0x0000c99c, 0x0000c99d, 0x0000dea3,
+
+ /*** Three byte table, leaf: e894xx - offset 0x05695 ***/
+
+ /* 80 */ 0x0000c99e, 0x0000c99f, 0x0000c9a0, 0x0000ca40,
+ /* 84 */ 0x0000ca41, 0x0000ca42, 0x0000ca43, 0x0000ca44,
+ /* 88 */ 0x0000ca45, 0x0000ca46, 0x0000ca47, 0x0000ca48,
+ /* 8c */ 0x0000ddf8, 0x0000ca49, 0x0000ca4a, 0x0000ca4b,
+ /* 90 */ 0x0000ca4c, 0x0000c3ef, 0x0000ca4d, 0x0000c2fb,
+ /* 94 */ 0x0000ca4e, 0x0000ca4f, 0x0000ca50, 0x0000d5e1,
+ /* 98 */ 0x0000ca51, 0x0000ca52, 0x0000ceb5, 0x0000ca53,
+ /* 9c */ 0x0000ca54, 0x0000ca55, 0x0000ca56, 0x0000ddfd,
+ /* a0 */ 0x0000ca57, 0x0000b2cc, 0x0000ca58, 0x0000ca59,
+ /* a4 */ 0x0000ca5a, 0x0000ca5b, 0x0000ca5c, 0x0000ca5d,
+ /* a8 */ 0x0000ca5e, 0x0000ca5f, 0x0000ca60, 0x0000c4e8,
+ /* ac */ 0x0000cadf, 0x0000ca61, 0x0000ca62, 0x0000ca63,
+ /* b0 */ 0x0000ca64, 0x0000ca65, 0x0000ca66, 0x0000ca67,
+ /* b4 */ 0x0000ca68, 0x0000ca69, 0x0000ca6a, 0x0000c7be,
+ /* b8 */ 0x0000ddfa, 0x0000ddfc, 0x0000ddfe, 0x0000dea2,
+ /* bc */ 0x0000b0aa, 0x0000b1ce, 0x0000ca6b, 0x0000ca6c,
+
+ /*** Three byte table, leaf: e895xx - offset 0x056d5 ***/
+
+ /* 80 */ 0x0000ca6d, 0x0000ca6e, 0x0000ca6f, 0x0000deac,
+ /* 84 */ 0x0000ca70, 0x0000ca71, 0x0000ca72, 0x0000ca73,
+ /* 88 */ 0x0000dea6, 0x0000bdb6, 0x0000c8ef, 0x0000ca74,
+ /* 8c */ 0x0000ca75, 0x0000ca76, 0x0000ca77, 0x0000ca78,
+ /* 90 */ 0x0000ca79, 0x0000ca7a, 0x0000ca7b, 0x0000ca7c,
+ /* 94 */ 0x0000ca7d, 0x0000ca7e, 0x0000dea1, 0x0000ca80,
+ /* 98 */ 0x0000ca81, 0x0000dea5, 0x0000ca82, 0x0000ca83,
+ /* 9c */ 0x0000ca84, 0x0000ca85, 0x0000dea9, 0x0000ca86,
+ /* a0 */ 0x0000ca87, 0x0000ca88, 0x0000ca89, 0x0000ca8a,
+ /* a4 */ 0x0000dea8, 0x0000ca8b, 0x0000ca8c, 0x0000ca8d,
+ /* a8 */ 0x0000dea7, 0x0000ca8e, 0x0000ca8f, 0x0000ca90,
+ /* ac */ 0x0000ca91, 0x0000ca92, 0x0000ca93, 0x0000ca94,
+ /* b0 */ 0x0000ca95, 0x0000ca96, 0x0000dead, 0x0000ca97,
+ /* b4 */ 0x0000d4cc, 0x0000ca98, 0x0000ca99, 0x0000ca9a,
+ /* b8 */ 0x0000ca9b, 0x0000deb3, 0x0000deaa, 0x0000deae,
+ /* bc */ 0x0000ca9c, 0x0000ca9d, 0x0000c0d9, 0x0000ca9e,
+
+ /*** Three byte table, leaf: e896xx - offset 0x05715 ***/
+
+ /* 80 */ 0x0000ca9f, 0x0000caa0, 0x0000cb40, 0x0000cb41,
+ /* 84 */ 0x0000b1a1, 0x0000deb6, 0x0000cb42, 0x0000deb1,
+ /* 88 */ 0x0000cb43, 0x0000cb44, 0x0000cb45, 0x0000cb46,
+ /* 8c */ 0x0000cb47, 0x0000cb48, 0x0000cb49, 0x0000deb2,
+ /* 90 */ 0x0000cb4a, 0x0000cb4b, 0x0000cb4c, 0x0000cb4d,
+ /* 94 */ 0x0000cb4e, 0x0000cb4f, 0x0000cb50, 0x0000cb51,
+ /* 98 */ 0x0000cb52, 0x0000cb53, 0x0000cb54, 0x0000d1a6,
+ /* 9c */ 0x0000deb5, 0x0000cb55, 0x0000cb56, 0x0000cb57,
+ /* a0 */ 0x0000cb58, 0x0000cb59, 0x0000cb5a, 0x0000cb5b,
+ /* a4 */ 0x0000deaf, 0x0000cb5c, 0x0000cb5d, 0x0000cb5e,
+ /* a8 */ 0x0000deb0, 0x0000cb5f, 0x0000d0bd, 0x0000cb60,
+ /* ac */ 0x0000cb61, 0x0000cb62, 0x0000deb4, 0x0000caed,
+ /* b0 */ 0x0000deb9, 0x0000cb63, 0x0000cb64, 0x0000cb65,
+ /* b4 */ 0x0000cb66, 0x0000cb67, 0x0000cb68, 0x0000deb8,
+ /* b8 */ 0x0000cb69, 0x0000deb7, 0x0000cb6a, 0x0000cb6b,
+ /* bc */ 0x0000cb6c, 0x0000cb6d, 0x0000cb6e, 0x0000cb6f,
+
+ /*** Three byte table, leaf: e897xx - offset 0x05755 ***/
+
+ /* 80 */ 0x0000cb70, 0x0000debb, 0x0000cb71, 0x0000cb72,
+ /* 84 */ 0x0000cb73, 0x0000cb74, 0x0000cb75, 0x0000cb76,
+ /* 88 */ 0x0000cb77, 0x0000bde5, 0x0000cb78, 0x0000cb79,
+ /* 8c */ 0x0000cb7a, 0x0000cb7b, 0x0000cb7c, 0x0000b2d8,
+ /* 90 */ 0x0000c3ea, 0x0000cb7d, 0x0000cb7e, 0x0000deba,
+ /* 94 */ 0x0000cb80, 0x0000c5ba, 0x0000cb81, 0x0000cb82,
+ /* 98 */ 0x0000cb83, 0x0000cb84, 0x0000cb85, 0x0000cb86,
+ /* 9c */ 0x0000debc, 0x0000cb87, 0x0000cb88, 0x0000cb89,
+ /* a0 */ 0x0000cb8a, 0x0000cb8b, 0x0000cb8c, 0x0000cb8d,
+ /* a4 */ 0x0000ccd9, 0x0000cb8e, 0x0000cb8f, 0x0000cb90,
+ /* a8 */ 0x0000cb91, 0x0000b7aa, 0x0000cb92, 0x0000cb93,
+ /* ac */ 0x0000cb94, 0x0000cb95, 0x0000cb96, 0x0000cb97,
+ /* b0 */ 0x0000cb98, 0x0000cb99, 0x0000cb9a, 0x0000cb9b,
+ /* b4 */ 0x0000cb9c, 0x0000cb9d, 0x0000cb9e, 0x0000cb9f,
+ /* b8 */ 0x0000cba0, 0x0000cc40, 0x0000cc41, 0x0000d4e5,
+ /* bc */ 0x0000cc42, 0x0000cc43, 0x0000cc44, 0x0000debd,
+
+ /*** Three byte table, leaf: e898xx - offset 0x05795 ***/
+
+ /* 80 */ 0x0000cc45, 0x0000cc46, 0x0000cc47, 0x0000cc48,
+ /* 84 */ 0x0000cc49, 0x0000debf, 0x0000cc4a, 0x0000cc4b,
+ /* 88 */ 0x0000cc4c, 0x0000cc4d, 0x0000cc4e, 0x0000cc4f,
+ /* 8c */ 0x0000cc50, 0x0000cc51, 0x0000cc52, 0x0000cc53,
+ /* 90 */ 0x0000cc54, 0x0000c4a2, 0x0000cc55, 0x0000cc56,
+ /* 94 */ 0x0000cc57, 0x0000cc58, 0x0000dec1, 0x0000cc59,
+ /* 98 */ 0x0000cc5a, 0x0000cc5b, 0x0000cc5c, 0x0000cc5d,
+ /* 9c */ 0x0000cc5e, 0x0000cc5f, 0x0000cc60, 0x0000cc61,
+ /* a0 */ 0x0000cc62, 0x0000cc63, 0x0000cc64, 0x0000cc65,
+ /* a4 */ 0x0000cc66, 0x0000cc67, 0x0000cc68, 0x0000debe,
+ /* a8 */ 0x0000cc69, 0x0000dec0, 0x0000cc6a, 0x0000cc6b,
+ /* ac */ 0x0000cc6c, 0x0000cc6d, 0x0000cc6e, 0x0000cc6f,
+ /* b0 */ 0x0000cc70, 0x0000cc71, 0x0000cc72, 0x0000cc73,
+ /* b4 */ 0x0000cc74, 0x0000cc75, 0x0000cc76, 0x0000cc77,
+ /* b8 */ 0x0000d5ba, 0x0000cc78, 0x0000cc79, 0x0000cc7a,
+ /* bc */ 0x0000dec2, 0x0000cc7b, 0x0000cc7c, 0x0000cc7d,
+
+ /*** Three byte table, leaf: e899xx - offset 0x057d5 ***/
+
+ /* 80 */ 0x0000cc7e, 0x0000cc80, 0x0000cc81, 0x0000cc82,
+ /* 84 */ 0x0000cc83, 0x0000cc84, 0x0000cc85, 0x0000cc86,
+ /* 88 */ 0x0000cc87, 0x0000cc88, 0x0000cc89, 0x0000cc8a,
+ /* 8c */ 0x0000cc8b, 0x0000f2ae, 0x0000bba2, 0x0000c2b2,
+ /* 90 */ 0x0000c5b0, 0x0000c2c7, 0x0000cc8c, 0x0000cc8d,
+ /* 94 */ 0x0000f2af, 0x0000cc8e, 0x0000cc8f, 0x0000cc90,
+ /* 98 */ 0x0000cc91, 0x0000cc92, 0x0000d0e9, 0x0000cc93,
+ /* 9c */ 0x0000cc94, 0x0000cc95, 0x0000d3dd, 0x0000cc96,
+ /* a0 */ 0x0000cc97, 0x0000cc98, 0x0000ebbd, 0x0000cc99,
+ /* a4 */ 0x0000cc9a, 0x0000cc9b, 0x0000cc9c, 0x0000cc9d,
+ /* a8 */ 0x0000cc9e, 0x0000cc9f, 0x0000cca0, 0x0000b3e6,
+ /* ac */ 0x0000f2b0, 0x0000cd40, 0x0000f2b1, 0x0000cd41,
+ /* b0 */ 0x0000cd42, 0x0000caad, 0x0000cd43, 0x0000cd44,
+ /* b4 */ 0x0000cd45, 0x0000cd46, 0x0000cd47, 0x0000cd48,
+ /* b8 */ 0x0000cd49, 0x0000bae7, 0x0000f2b3, 0x0000f2b5,
+ /* bc */ 0x0000f2b4, 0x0000cbe4, 0x0000cfba, 0x0000f2b2,
+
+ /*** Three byte table, leaf: e89axx - offset 0x05815 ***/
+
+ /* 80 */ 0x0000cab4, 0x0000d2cf, 0x0000c2ec, 0x0000cd4a,
+ /* 84 */ 0x0000cd4b, 0x0000cd4c, 0x0000cd4d, 0x0000cd4e,
+ /* 88 */ 0x0000cd4f, 0x0000cd50, 0x0000cec3, 0x0000f2b8,
+ /* 8c */ 0x0000b0f6, 0x0000f2b7, 0x0000cd51, 0x0000cd52,
+ /* 90 */ 0x0000cd53, 0x0000cd54, 0x0000cd55, 0x0000f2be,
+ /* 94 */ 0x0000cd56, 0x0000b2cf, 0x0000cd57, 0x0000cd58,
+ /* 98 */ 0x0000cd59, 0x0000cd5a, 0x0000cd5b, 0x0000cd5c,
+ /* 9c */ 0x0000d1c1, 0x0000f2ba, 0x0000cd5d, 0x0000cd5e,
+ /* a0 */ 0x0000cd5f, 0x0000cd60, 0x0000cd61, 0x0000f2bc,
+ /* a4 */ 0x0000d4e9, 0x0000cd62, 0x0000cd63, 0x0000f2bb,
+ /* a8 */ 0x0000f2b6, 0x0000f2bf, 0x0000f2bd, 0x0000cd64,
+ /* ac */ 0x0000f2b9, 0x0000cd65, 0x0000cd66, 0x0000f2c7,
+ /* b0 */ 0x0000f2c4, 0x0000f2c6, 0x0000cd67, 0x0000cd68,
+ /* b4 */ 0x0000f2ca, 0x0000f2c2, 0x0000f2c0, 0x0000cd69,
+ /* b8 */ 0x0000cd6a, 0x0000cd6b, 0x0000f2c5, 0x0000cd6c,
+ /* bc */ 0x0000cd6d, 0x0000cd6e, 0x0000cd6f, 0x0000cd70,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x05855 ***/
+
+ /* 80 */ 0x0000d6fb, 0x0000cd71, 0x0000cd72, 0x0000cd73,
+ /* 84 */ 0x0000f2c1, 0x0000cd74, 0x0000c7f9, 0x0000c9df,
+ /* 88 */ 0x0000cd75, 0x0000f2c8, 0x0000b9c6, 0x0000b5b0,
+ /* 8c */ 0x0000cd76, 0x0000cd77, 0x0000f2c3, 0x0000f2c9,
+ /* 90 */ 0x0000f2d0, 0x0000f2d6, 0x0000cd78, 0x0000cd79,
+ /* 94 */ 0x0000bbd7, 0x0000cd7a, 0x0000cd7b, 0x0000cd7c,
+ /* 98 */ 0x0000f2d5, 0x0000cddc, 0x0000cd7d, 0x0000d6eb,
+ /* 9c */ 0x0000cd7e, 0x0000cd80, 0x0000f2d2, 0x0000f2d4,
+ /* a0 */ 0x0000cd81, 0x0000cd82, 0x0000cd83, 0x0000cd84,
+ /* a4 */ 0x0000b8f2, 0x0000cd85, 0x0000cd86, 0x0000cd87,
+ /* a8 */ 0x0000cd88, 0x0000f2cb, 0x0000cd89, 0x0000cd8a,
+ /* ac */ 0x0000cd8b, 0x0000f2ce, 0x0000c2f9, 0x0000cd8c,
+ /* b0 */ 0x0000d5dd, 0x0000f2cc, 0x0000f2cd, 0x0000f2cf,
+ /* b4 */ 0x0000f2d3, 0x0000cd8d, 0x0000cd8e, 0x0000cd8f,
+ /* b8 */ 0x0000f2d9, 0x0000d3bc, 0x0000cd90, 0x0000cd91,
+ /* bc */ 0x0000cd92, 0x0000cd93, 0x0000b6ea, 0x0000cd94,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x05895 ***/
+
+ /* 80 */ 0x0000caf1, 0x0000cd95, 0x0000b7e4, 0x0000f2d7,
+ /* 84 */ 0x0000cd96, 0x0000cd97, 0x0000cd98, 0x0000f2d8,
+ /* 88 */ 0x0000f2da, 0x0000f2dd, 0x0000f2db, 0x0000cd99,
+ /* 8c */ 0x0000cd9a, 0x0000f2dc, 0x0000cd9b, 0x0000cd9c,
+ /* 90 */ 0x0000cd9d, 0x0000cd9e, 0x0000d1d1, 0x0000f2d1,
+ /* 94 */ 0x0000cd9f, 0x0000cdc9, 0x0000cda0, 0x0000cecf,
+ /* 98 */ 0x0000d6a9, 0x0000ce40, 0x0000f2e3, 0x0000ce41,
+ /* 9c */ 0x0000c3db, 0x0000ce42, 0x0000f2e0, 0x0000ce43,
+ /* a0 */ 0x0000ce44, 0x0000c0af, 0x0000f2ec, 0x0000f2de,
+ /* a4 */ 0x0000ce45, 0x0000f2e1, 0x0000ce46, 0x0000ce47,
+ /* a8 */ 0x0000ce48, 0x0000f2e8, 0x0000ce49, 0x0000ce4a,
+ /* ac */ 0x0000ce4b, 0x0000ce4c, 0x0000f2e2, 0x0000ce4d,
+ /* b0 */ 0x0000ce4e, 0x0000f2e7, 0x0000ce4f, 0x0000ce50,
+ /* b4 */ 0x0000f2e6, 0x0000ce51, 0x0000ce52, 0x0000f2e9,
+ /* b8 */ 0x0000ce53, 0x0000ce54, 0x0000ce55, 0x0000f2df,
+ /* bc */ 0x0000ce56, 0x0000ce57, 0x0000f2e4, 0x0000f2ea,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x058d5 ***/
+
+ /* 80 */ 0x0000ce58, 0x0000ce59, 0x0000ce5a, 0x0000ce5b,
+ /* 84 */ 0x0000ce5c, 0x0000ce5d, 0x0000ce5e, 0x0000d3ac,
+ /* 88 */ 0x0000f2e5, 0x0000b2f5, 0x0000ce5f, 0x0000ce60,
+ /* 8c */ 0x0000f2f2, 0x0000ce61, 0x0000d0ab, 0x0000ce62,
+ /* 90 */ 0x0000ce63, 0x0000ce64, 0x0000ce65, 0x0000f2f5,
+ /* 94 */ 0x0000ce66, 0x0000ce67, 0x0000ce68, 0x0000bbc8,
+ /* 98 */ 0x0000ce69, 0x0000f2f9, 0x0000ce6a, 0x0000ce6b,
+ /* 9c */ 0x0000ce6c, 0x0000ce6d, 0x0000ce6e, 0x0000ce6f,
+ /* a0 */ 0x0000f2f0, 0x0000ce70, 0x0000ce71, 0x0000f2f6,
+ /* a4 */ 0x0000f2f8, 0x0000f2fa, 0x0000ce72, 0x0000ce73,
+ /* a8 */ 0x0000ce74, 0x0000ce75, 0x0000ce76, 0x0000ce77,
+ /* ac */ 0x0000ce78, 0x0000ce79, 0x0000f2f3, 0x0000ce7a,
+ /* b0 */ 0x0000f2f1, 0x0000ce7b, 0x0000ce7c, 0x0000ce7d,
+ /* b4 */ 0x0000bafb, 0x0000ce7e, 0x0000b5fb, 0x0000ce80,
+ /* b8 */ 0x0000ce81, 0x0000ce82, 0x0000ce83, 0x0000f2ef,
+ /* bc */ 0x0000f2f7, 0x0000f2ed, 0x0000f2ee, 0x0000ce84,
+
+ /*** Three byte table, leaf: e89exx - offset 0x05915 ***/
+
+ /* 80 */ 0x0000ce85, 0x0000ce86, 0x0000f2eb, 0x0000f3a6,
+ /* 84 */ 0x0000ce87, 0x0000f3a3, 0x0000ce88, 0x0000ce89,
+ /* 88 */ 0x0000f3a2, 0x0000ce8a, 0x0000ce8b, 0x0000f2f4,
+ /* 8c */ 0x0000ce8c, 0x0000c8da, 0x0000ce8d, 0x0000ce8e,
+ /* 90 */ 0x0000ce8f, 0x0000ce90, 0x0000ce91, 0x0000f2fb,
+ /* 94 */ 0x0000ce92, 0x0000ce93, 0x0000ce94, 0x0000f3a5,
+ /* 98 */ 0x0000ce95, 0x0000ce96, 0x0000ce97, 0x0000ce98,
+ /* 9c */ 0x0000ce99, 0x0000ce9a, 0x0000ce9b, 0x0000c3f8,
+ /* a0 */ 0x0000ce9c, 0x0000ce9d, 0x0000ce9e, 0x0000ce9f,
+ /* a4 */ 0x0000cea0, 0x0000cf40, 0x0000cf41, 0x0000cf42,
+ /* a8 */ 0x0000f2fd, 0x0000cf43, 0x0000cf44, 0x0000f3a7,
+ /* ac */ 0x0000f3a9, 0x0000f3a4, 0x0000cf45, 0x0000f2fc,
+ /* b0 */ 0x0000cf46, 0x0000cf47, 0x0000cf48, 0x0000f3ab,
+ /* b4 */ 0x0000cf49, 0x0000f3aa, 0x0000cf4a, 0x0000cf4b,
+ /* b8 */ 0x0000cf4c, 0x0000cf4d, 0x0000c2dd, 0x0000cf4e,
+ /* bc */ 0x0000cf4f, 0x0000f3ae, 0x0000cf50, 0x0000cf51,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x05955 ***/
+
+ /* 80 */ 0x0000f3b0, 0x0000cf52, 0x0000cf53, 0x0000cf54,
+ /* 84 */ 0x0000cf55, 0x0000cf56, 0x0000f3a1, 0x0000cf57,
+ /* 88 */ 0x0000cf58, 0x0000cf59, 0x0000f3b1, 0x0000f3ac,
+ /* 8c */ 0x0000cf5a, 0x0000cf5b, 0x0000cf5c, 0x0000cf5d,
+ /* 90 */ 0x0000cf5e, 0x0000f3af, 0x0000f2fe, 0x0000f3ad,
+ /* 94 */ 0x0000cf5f, 0x0000cf60, 0x0000cf61, 0x0000cf62,
+ /* 98 */ 0x0000cf63, 0x0000cf64, 0x0000cf65, 0x0000f3b2,
+ /* 9c */ 0x0000cf66, 0x0000cf67, 0x0000cf68, 0x0000cf69,
+ /* a0 */ 0x0000f3b4, 0x0000cf6a, 0x0000cf6b, 0x0000cf6c,
+ /* a4 */ 0x0000cf6d, 0x0000f3a8, 0x0000cf6e, 0x0000cf6f,
+ /* a8 */ 0x0000cf70, 0x0000cf71, 0x0000f3b3, 0x0000cf72,
+ /* ac */ 0x0000cf73, 0x0000cf74, 0x0000f3b5, 0x0000cf75,
+ /* b0 */ 0x0000cf76, 0x0000cf77, 0x0000cf78, 0x0000cf79,
+ /* b4 */ 0x0000cf7a, 0x0000cf7b, 0x0000cf7c, 0x0000cf7d,
+ /* b8 */ 0x0000cf7e, 0x0000d0b7, 0x0000cf80, 0x0000cf81,
+ /* bc */ 0x0000cf82, 0x0000cf83, 0x0000f3b8, 0x0000cf84,
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x05995 ***/
+
+ /* 80 */ 0x0000cf85, 0x0000cf86, 0x0000cf87, 0x0000d9f9,
+ /* 84 */ 0x0000cf88, 0x0000cf89, 0x0000cf8a, 0x0000cf8b,
+ /* 88 */ 0x0000cf8c, 0x0000cf8d, 0x0000f3b9, 0x0000cf8e,
+ /* 8c */ 0x0000cf8f, 0x0000cf90, 0x0000cf91, 0x0000cf92,
+ /* 90 */ 0x0000cf93, 0x0000cf94, 0x0000cf95, 0x0000f3b7,
+ /* 94 */ 0x0000cf96, 0x0000c8e4, 0x0000f3b6, 0x0000cf97,
+ /* 98 */ 0x0000cf98, 0x0000cf99, 0x0000cf9a, 0x0000f3ba,
+ /* 9c */ 0x0000cf9b, 0x0000cf9c, 0x0000cf9d, 0x0000cf9e,
+ /* a0 */ 0x0000cf9f, 0x0000f3bb, 0x0000b4c0, 0x0000cfa0,
+ /* a4 */ 0x0000d040, 0x0000d041, 0x0000d042, 0x0000d043,
+ /* a8 */ 0x0000d044, 0x0000d045, 0x0000d046, 0x0000d047,
+ /* ac */ 0x0000d048, 0x0000d049, 0x0000d04a, 0x0000d04b,
+ /* b0 */ 0x0000d04c, 0x0000d04d, 0x0000eec3, 0x0000d04e,
+ /* b4 */ 0x0000d04f, 0x0000d050, 0x0000d051, 0x0000d052,
+ /* b8 */ 0x0000d053, 0x0000f3bc, 0x0000d054, 0x0000d055,
+ /* bc */ 0x0000f3bd, 0x0000d056, 0x0000d057, 0x0000d058,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x059d5 ***/
+
+ /* 80 */ 0x0000d1aa, 0x0000d059, 0x0000d05a, 0x0000d05b,
+ /* 84 */ 0x0000f4ac, 0x0000d0c6, 0x0000d05c, 0x0000d05d,
+ /* 88 */ 0x0000d05e, 0x0000d05f, 0x0000d060, 0x0000d061,
+ /* 8c */ 0x0000d0d0, 0x0000d1dc, 0x0000d062, 0x0000d063,
+ /* 90 */ 0x0000d064, 0x0000d065, 0x0000d066, 0x0000d067,
+ /* 94 */ 0x0000cfce, 0x0000d068, 0x0000d069, 0x0000bdd6,
+ /* 98 */ 0x0000d06a, 0x0000d1c3, 0x0000d06b, 0x0000d06c,
+ /* 9c */ 0x0000d06d, 0x0000d06e, 0x0000d06f, 0x0000d070,
+ /* a0 */ 0x0000d071, 0x0000bae2, 0x0000e1e9, 0x0000d2c2,
+ /* a4 */ 0x0000f1c2, 0x0000b2b9, 0x0000d072, 0x0000d073,
+ /* a8 */ 0x0000b1ed, 0x0000f1c3, 0x0000d074, 0x0000c9c0,
+ /* ac */ 0x0000b3c4, 0x0000d075, 0x0000d9f2, 0x0000d076,
+ /* b0 */ 0x0000cba5, 0x0000d077, 0x0000f1c4, 0x0000d078,
+ /* b4 */ 0x0000d079, 0x0000d07a, 0x0000d07b, 0x0000d6d4,
+ /* b8 */ 0x0000d07c, 0x0000d07d, 0x0000d07e, 0x0000d080,
+ /* bc */ 0x0000d081, 0x0000f1c5, 0x0000f4c0, 0x0000f1c6,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x05a15 ***/
+
+ /* 80 */ 0x0000d082, 0x0000d4ac, 0x0000f1c7, 0x0000d083,
+ /* 84 */ 0x0000b0c0, 0x0000f4c1, 0x0000d084, 0x0000d085,
+ /* 88 */ 0x0000f4c2, 0x0000d086, 0x0000d087, 0x0000b4fc,
+ /* 8c */ 0x0000d088, 0x0000c5db, 0x0000d089, 0x0000d08a,
+ /* 90 */ 0x0000d08b, 0x0000d08c, 0x0000ccbb, 0x0000d08d,
+ /* 94 */ 0x0000d08e, 0x0000d08f, 0x0000d0e4, 0x0000d090,
+ /* 98 */ 0x0000d091, 0x0000d092, 0x0000d093, 0x0000d094,
+ /* 9c */ 0x0000cde0, 0x0000d095, 0x0000d096, 0x0000d097,
+ /* a0 */ 0x0000d098, 0x0000d099, 0x0000f1c8, 0x0000d09a,
+ /* a4 */ 0x0000d9f3, 0x0000d09b, 0x0000d09c, 0x0000d09d,
+ /* a8 */ 0x0000d09e, 0x0000d09f, 0x0000d0a0, 0x0000b1bb,
+ /* ac */ 0x0000d140, 0x0000cfae, 0x0000d141, 0x0000d142,
+ /* b0 */ 0x0000d143, 0x0000b8a4, 0x0000d144, 0x0000d145,
+ /* b4 */ 0x0000d146, 0x0000d147, 0x0000d148, 0x0000f1ca,
+ /* b8 */ 0x0000d149, 0x0000d14a, 0x0000d14b, 0x0000d14c,
+ /* bc */ 0x0000f1cb, 0x0000d14d, 0x0000d14e, 0x0000d14f,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x05a55 ***/
+
+ /* 80 */ 0x0000d150, 0x0000b2c3, 0x0000c1d1, 0x0000d151,
+ /* 84 */ 0x0000d152, 0x0000d7b0, 0x0000f1c9, 0x0000d153,
+ /* 88 */ 0x0000d154, 0x0000f1cc, 0x0000d155, 0x0000d156,
+ /* 8c */ 0x0000d157, 0x0000d158, 0x0000f1ce, 0x0000d159,
+ /* 90 */ 0x0000d15a, 0x0000d15b, 0x0000d9f6, 0x0000d15c,
+ /* 94 */ 0x0000d2e1, 0x0000d4a3, 0x0000d15d, 0x0000d15e,
+ /* 98 */ 0x0000f4c3, 0x0000c8b9, 0x0000d15f, 0x0000d160,
+ /* 9c */ 0x0000d161, 0x0000d162, 0x0000d163, 0x0000f4c4,
+ /* a0 */ 0x0000d164, 0x0000d165, 0x0000f1cd, 0x0000f1cf,
+ /* a4 */ 0x0000bfe3, 0x0000f1d0, 0x0000d166, 0x0000d167,
+ /* a8 */ 0x0000f1d4, 0x0000d168, 0x0000d169, 0x0000d16a,
+ /* ac */ 0x0000d16b, 0x0000d16c, 0x0000d16d, 0x0000d16e,
+ /* b0 */ 0x0000f1d6, 0x0000f1d1, 0x0000d16f, 0x0000c9d1,
+ /* b4 */ 0x0000c5e1, 0x0000d170, 0x0000d171, 0x0000d172,
+ /* b8 */ 0x0000c2e3, 0x0000b9fc, 0x0000d173, 0x0000d174,
+ /* bc */ 0x0000f1d3, 0x0000d175, 0x0000f1d5, 0x0000d176,
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x05a95 ***/
+
+ /* 80 */ 0x0000d177, 0x0000d178, 0x0000b9d3, 0x0000d179,
+ /* 84 */ 0x0000d17a, 0x0000d17b, 0x0000d17c, 0x0000d17d,
+ /* 88 */ 0x0000d17e, 0x0000d180, 0x0000f1db, 0x0000d181,
+ /* 8c */ 0x0000d182, 0x0000d183, 0x0000d184, 0x0000d185,
+ /* 90 */ 0x0000bad6, 0x0000d186, 0x0000b0fd, 0x0000f1d9,
+ /* 94 */ 0x0000d187, 0x0000d188, 0x0000d189, 0x0000d18a,
+ /* 98 */ 0x0000d18b, 0x0000f1d8, 0x0000f1d2, 0x0000f1da,
+ /* 9c */ 0x0000d18c, 0x0000d18d, 0x0000d18e, 0x0000d18f,
+ /* a0 */ 0x0000d190, 0x0000f1d7, 0x0000d191, 0x0000d192,
+ /* a4 */ 0x0000d193, 0x0000c8ec, 0x0000d194, 0x0000d195,
+ /* a8 */ 0x0000d196, 0x0000d197, 0x0000cdca, 0x0000f1dd,
+ /* ac */ 0x0000d198, 0x0000d199, 0x0000d19a, 0x0000d19b,
+ /* b0 */ 0x0000e5bd, 0x0000d19c, 0x0000d19d, 0x0000d19e,
+ /* b4 */ 0x0000f1dc, 0x0000d19f, 0x0000f1de, 0x0000d1a0,
+ /* b8 */ 0x0000d240, 0x0000d241, 0x0000d242, 0x0000d243,
+ /* bc */ 0x0000d244, 0x0000d245, 0x0000d246, 0x0000d247,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x05ad5 ***/
+
+ /* 80 */ 0x0000d248, 0x0000f1df, 0x0000d249, 0x0000d24a,
+ /* 84 */ 0x0000cfe5, 0x0000d24b, 0x0000d24c, 0x0000d24d,
+ /* 88 */ 0x0000d24e, 0x0000d24f, 0x0000d250, 0x0000d251,
+ /* 8c */ 0x0000d252, 0x0000d253, 0x0000d254, 0x0000d255,
+ /* 90 */ 0x0000d256, 0x0000d257, 0x0000d258, 0x0000d259,
+ /* 94 */ 0x0000d25a, 0x0000d25b, 0x0000d25c, 0x0000d25d,
+ /* 98 */ 0x0000d25e, 0x0000d25f, 0x0000d260, 0x0000d261,
+ /* 9c */ 0x0000d262, 0x0000d263, 0x0000f4c5, 0x0000bdf3,
+ /* a0 */ 0x0000d264, 0x0000d265, 0x0000d266, 0x0000d267,
+ /* a4 */ 0x0000d268, 0x0000d269, 0x0000f1e0, 0x0000d26a,
+ /* a8 */ 0x0000d26b, 0x0000d26c, 0x0000d26d, 0x0000d26e,
+ /* ac */ 0x0000d26f, 0x0000d270, 0x0000d271, 0x0000d272,
+ /* b0 */ 0x0000d273, 0x0000d274, 0x0000d275, 0x0000d276,
+ /* b4 */ 0x0000d277, 0x0000d278, 0x0000d279, 0x0000d27a,
+ /* b8 */ 0x0000d27b, 0x0000d27c, 0x0000d27d, 0x0000f1e1,
+ /* bc */ 0x0000d27e, 0x0000d280, 0x0000d281, 0x0000cef7,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x05b15 ***/
+
+ /* 80 */ 0x0000d282, 0x0000d2aa, 0x0000d283, 0x0000f1fb,
+ /* 84 */ 0x0000d284, 0x0000d285, 0x0000b8b2, 0x0000d286,
+ /* 88 */ 0x0000d287, 0x0000d288, 0x0000d289, 0x0000d28a,
+ /* 8c */ 0x0000d28b, 0x0000d28c, 0x0000d28d, 0x0000d28e,
+ /* 90 */ 0x0000d28f, 0x0000d290, 0x0000d291, 0x0000d292,
+ /* 94 */ 0x0000d293, 0x0000d294, 0x0000d295, 0x0000d296,
+ /* 98 */ 0x0000d297, 0x0000d298, 0x0000d299, 0x0000d29a,
+ /* 9c */ 0x0000d29b, 0x0000d29c, 0x0000d29d, 0x0000d29e,
+ /* a0 */ 0x0000d29f, 0x0000d2a0, 0x0000d340, 0x0000d341,
+ /* a4 */ 0x0000d342, 0x0000d343, 0x0000d344, 0x0000d345,
+ /* a8 */ 0x0000d346, 0x0000d347, 0x0000d348, 0x0000d349,
+ /* ac */ 0x0000d34a, 0x0000d34b, 0x0000d34c, 0x0000d34d,
+ /* b0 */ 0x0000d34e, 0x0000d34f, 0x0000d350, 0x0000d351,
+ /* b4 */ 0x0000d352, 0x0000d353, 0x0000d354, 0x0000d355,
+ /* b8 */ 0x0000d356, 0x0000d357, 0x0000d358, 0x0000d359,
+ /* bc */ 0x0000d35a, 0x0000d35b, 0x0000d35c, 0x0000d35d,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x05b55 ***/
+
+ /* 80 */ 0x0000d35e, 0x0000bcfb, 0x0000b9db, 0x0000d35f,
+ /* 84 */ 0x0000b9e6, 0x0000c3d9, 0x0000cad3, 0x0000eae8,
+ /* 88 */ 0x0000c0c0, 0x0000bef5, 0x0000eae9, 0x0000eaea,
+ /* 8c */ 0x0000eaeb, 0x0000d360, 0x0000eaec, 0x0000eaed,
+ /* 90 */ 0x0000eaee, 0x0000eaef, 0x0000bdc7, 0x0000d361,
+ /* 94 */ 0x0000d362, 0x0000d363, 0x0000f5fb, 0x0000d364,
+ /* 98 */ 0x0000d365, 0x0000d366, 0x0000f5fd, 0x0000d367,
+ /* 9c */ 0x0000f5fe, 0x0000d368, 0x0000f5fc, 0x0000d369,
+ /* a0 */ 0x0000d36a, 0x0000d36b, 0x0000d36c, 0x0000bde2,
+ /* a4 */ 0x0000d36d, 0x0000f6a1, 0x0000b4a5, 0x0000d36e,
+ /* a8 */ 0x0000d36f, 0x0000d370, 0x0000d371, 0x0000f6a2,
+ /* ac */ 0x0000d372, 0x0000d373, 0x0000d374, 0x0000f6a3,
+ /* b0 */ 0x0000d375, 0x0000d376, 0x0000d377, 0x0000ecb2,
+ /* b4 */ 0x0000d378, 0x0000d379, 0x0000d37a, 0x0000d37b,
+ /* b8 */ 0x0000d37c, 0x0000d37d, 0x0000d37e, 0x0000d380,
+ /* bc */ 0x0000d381, 0x0000d382, 0x0000d383, 0x0000d384,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x05b95 ***/
+
+ /* 80 */ 0x0000d1d4, 0x0000d385, 0x0000d386, 0x0000d387,
+ /* 84 */ 0x0000d388, 0x0000d389, 0x0000d38a, 0x0000d9ea,
+ /* 88 */ 0x0000d38b, 0x0000d38c, 0x0000d38d, 0x0000d38e,
+ /* 8c */ 0x0000d38f, 0x0000d390, 0x0000d391, 0x0000d392,
+ /* 90 */ 0x0000d393, 0x0000d394, 0x0000d395, 0x0000d396,
+ /* 94 */ 0x0000d397, 0x0000d398, 0x0000d399, 0x0000d39a,
+ /* 98 */ 0x0000d39b, 0x0000d39c, 0x0000d39d, 0x0000d39e,
+ /* 9c */ 0x0000d39f, 0x0000d3a0, 0x0000d440, 0x0000d441,
+ /* a0 */ 0x0000d442, 0x0000d443, 0x0000d444, 0x0000d445,
+ /* a4 */ 0x0000d446, 0x0000d447, 0x0000d448, 0x0000d449,
+ /* a8 */ 0x0000d44a, 0x0000d44b, 0x0000d44c, 0x0000d44d,
+ /* ac */ 0x0000d44e, 0x0000d44f, 0x0000d450, 0x0000d451,
+ /* b0 */ 0x0000d452, 0x0000d453, 0x0000d454, 0x0000d455,
+ /* b4 */ 0x0000d456, 0x0000d457, 0x0000d458, 0x0000d459,
+ /* b8 */ 0x0000d45a, 0x0000d45b, 0x0000d45c, 0x0000d45d,
+ /* bc */ 0x0000d45e, 0x0000d45f, 0x0000f6a4, 0x0000d460,
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x05bd5 ***/
+
+ /* 80 */ 0x0000d461, 0x0000d462, 0x0000d463, 0x0000d464,
+ /* 84 */ 0x0000d465, 0x0000d466, 0x0000d467, 0x0000d468,
+ /* 88 */ 0x0000eeba, 0x0000d469, 0x0000d46a, 0x0000d46b,
+ /* 8c */ 0x0000d46c, 0x0000d46d, 0x0000d46e, 0x0000d46f,
+ /* 90 */ 0x0000d470, 0x0000d471, 0x0000d472, 0x0000d473,
+ /* 94 */ 0x0000d474, 0x0000d475, 0x0000d476, 0x0000d477,
+ /* 98 */ 0x0000d478, 0x0000d479, 0x0000d47a, 0x0000d47b,
+ /* 9c */ 0x0000d47c, 0x0000d47d, 0x0000d47e, 0x0000d480,
+ /* a0 */ 0x0000d481, 0x0000d482, 0x0000d483, 0x0000d484,
+ /* a4 */ 0x0000d485, 0x0000d486, 0x0000d487, 0x0000d488,
+ /* a8 */ 0x0000d489, 0x0000d48a, 0x0000d48b, 0x0000d48c,
+ /* ac */ 0x0000d48d, 0x0000d48e, 0x0000d48f, 0x0000d490,
+ /* b0 */ 0x0000d491, 0x0000d492, 0x0000d493, 0x0000d494,
+ /* b4 */ 0x0000d495, 0x0000d496, 0x0000d497, 0x0000d498,
+ /* b8 */ 0x0000d499, 0x0000d5b2, 0x0000d49a, 0x0000d49b,
+ /* bc */ 0x0000d49c, 0x0000d49d, 0x0000d49e, 0x0000d49f,
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x05c15 ***/
+
+ /* 80 */ 0x0000d4a0, 0x0000d540, 0x0000d541, 0x0000d542,
+ /* 84 */ 0x0000d543, 0x0000d544, 0x0000d545, 0x0000d546,
+ /* 88 */ 0x0000d547, 0x0000d3fe, 0x0000ccdc, 0x0000d548,
+ /* 8c */ 0x0000d549, 0x0000d54a, 0x0000d54b, 0x0000d54c,
+ /* 90 */ 0x0000d54d, 0x0000d54e, 0x0000d54f, 0x0000cac4,
+ /* 94 */ 0x0000d550, 0x0000d551, 0x0000d552, 0x0000d553,
+ /* 98 */ 0x0000d554, 0x0000d555, 0x0000d556, 0x0000d557,
+ /* 9c */ 0x0000d558, 0x0000d559, 0x0000d55a, 0x0000d55b,
+ /* a0 */ 0x0000d55c, 0x0000d55d, 0x0000d55e, 0x0000d55f,
+ /* a4 */ 0x0000d560, 0x0000d561, 0x0000d562, 0x0000d563,
+ /* a8 */ 0x0000d564, 0x0000d565, 0x0000d566, 0x0000d567,
+ /* ac */ 0x0000d568, 0x0000d569, 0x0000d56a, 0x0000d56b,
+ /* b0 */ 0x0000d56c, 0x0000d56d, 0x0000d56e, 0x0000d56f,
+ /* b4 */ 0x0000d570, 0x0000d571, 0x0000d572, 0x0000d573,
+ /* b8 */ 0x0000d574, 0x0000d575, 0x0000d576, 0x0000d577,
+ /* bc */ 0x0000d578, 0x0000d579, 0x0000d57a, 0x0000d57b,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x05c55 ***/
+
+ /* 80 */ 0x0000d57c, 0x0000d57d, 0x0000d57e, 0x0000d580,
+ /* 84 */ 0x0000d581, 0x0000d582, 0x0000d583, 0x0000d584,
+ /* 88 */ 0x0000d585, 0x0000d586, 0x0000d587, 0x0000d588,
+ /* 8c */ 0x0000d589, 0x0000d58a, 0x0000d58b, 0x0000d58c,
+ /* 90 */ 0x0000d58d, 0x0000d58e, 0x0000d58f, 0x0000d590,
+ /* 94 */ 0x0000d591, 0x0000d592, 0x0000d593, 0x0000d594,
+ /* 98 */ 0x0000d595, 0x0000d596, 0x0000d597, 0x0000d598,
+ /* 9c */ 0x0000d599, 0x0000d59a, 0x0000d59b, 0x0000d59c,
+ /* a0 */ 0x0000d59d, 0x0000d59e, 0x0000d59f, 0x0000d5a0,
+ /* a4 */ 0x0000d640, 0x0000d641, 0x0000d642, 0x0000d643,
+ /* a8 */ 0x0000d644, 0x0000d645, 0x0000d646, 0x0000d647,
+ /* ac */ 0x0000d648, 0x0000d649, 0x0000d64a, 0x0000d64b,
+ /* b0 */ 0x0000d64c, 0x0000d64d, 0x0000d64e, 0x0000d64f,
+ /* b4 */ 0x0000d650, 0x0000d651, 0x0000d652, 0x0000d653,
+ /* b8 */ 0x0000d654, 0x0000d655, 0x0000d656, 0x0000d657,
+ /* bc */ 0x0000d658, 0x0000d659, 0x0000d65a, 0x0000d65b,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x05c95 ***/
+
+ /* 80 */ 0x0000d65c, 0x0000d65d, 0x0000d65e, 0x0000d65f,
+ /* 84 */ 0x0000d660, 0x0000d661, 0x0000d662, 0x0000e5c0,
+ /* 88 */ 0x0000d663, 0x0000d664, 0x0000d665, 0x0000d666,
+ /* 8c */ 0x0000d667, 0x0000d668, 0x0000d669, 0x0000d66a,
+ /* 90 */ 0x0000d66b, 0x0000d66c, 0x0000d66d, 0x0000d66e,
+ /* 94 */ 0x0000d66f, 0x0000d670, 0x0000d671, 0x0000d672,
+ /* 98 */ 0x0000d673, 0x0000d674, 0x0000d675, 0x0000d676,
+ /* 9c */ 0x0000d677, 0x0000d678, 0x0000d679, 0x0000d67a,
+ /* a0 */ 0x0000d67b, 0x0000d67c, 0x0000d67d, 0x0000d67e,
+ /* a4 */ 0x0000d680, 0x0000d681, 0x0000f6a5, 0x0000d682,
+ /* a8 */ 0x0000d683, 0x0000d684, 0x0000d685, 0x0000d686,
+ /* ac */ 0x0000d687, 0x0000d688, 0x0000d689, 0x0000d68a,
+ /* b0 */ 0x0000d68b, 0x0000d68c, 0x0000d68d, 0x0000d68e,
+ /* b4 */ 0x0000d68f, 0x0000d690, 0x0000d691, 0x0000d692,
+ /* b8 */ 0x0000d693, 0x0000d694, 0x0000d695, 0x0000d696,
+ /* bc */ 0x0000d697, 0x0000d698, 0x0000d699, 0x0000d69a,
+
+ /*** Three byte table, leaf: e8adxx - offset 0x05cd5 ***/
+
+ /* 80 */ 0x0000d69b, 0x0000d69c, 0x0000d69d, 0x0000d69e,
+ /* 84 */ 0x0000d69f, 0x0000d6a0, 0x0000d740, 0x0000d741,
+ /* 88 */ 0x0000d742, 0x0000d743, 0x0000d744, 0x0000d745,
+ /* 8c */ 0x0000d746, 0x0000d747, 0x0000d748, 0x0000d749,
+ /* 90 */ 0x0000d74a, 0x0000d74b, 0x0000d74c, 0x0000d74d,
+ /* 94 */ 0x0000d74e, 0x0000d74f, 0x0000d750, 0x0000d751,
+ /* 98 */ 0x0000d752, 0x0000d753, 0x0000d754, 0x0000d755,
+ /* 9c */ 0x0000d756, 0x0000d757, 0x0000d758, 0x0000d759,
+ /* a0 */ 0x0000d75a, 0x0000d75b, 0x0000d75c, 0x0000d75d,
+ /* a4 */ 0x0000d75e, 0x0000d75f, 0x0000beaf, 0x0000d760,
+ /* a8 */ 0x0000d761, 0x0000d762, 0x0000d763, 0x0000d764,
+ /* ac */ 0x0000c6a9, 0x0000d765, 0x0000d766, 0x0000d767,
+ /* b0 */ 0x0000d768, 0x0000d769, 0x0000d76a, 0x0000d76b,
+ /* b4 */ 0x0000d76c, 0x0000d76d, 0x0000d76e, 0x0000d76f,
+ /* b8 */ 0x0000d770, 0x0000d771, 0x0000d772, 0x0000d773,
+ /* bc */ 0x0000d774, 0x0000d775, 0x0000d776, 0x0000d777,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x05d15 ***/
+
+ /* 80 */ 0x0000d778, 0x0000d779, 0x0000d77a, 0x0000d77b,
+ /* 84 */ 0x0000d77c, 0x0000d77d, 0x0000d77e, 0x0000d780,
+ /* 88 */ 0x0000d781, 0x0000d782, 0x0000d783, 0x0000d784,
+ /* 8c */ 0x0000d785, 0x0000d786, 0x0000d787, 0x0000d788,
+ /* 90 */ 0x0000d789, 0x0000d78a, 0x0000d78b, 0x0000d78c,
+ /* 94 */ 0x0000d78d, 0x0000d78e, 0x0000d78f, 0x0000d790,
+ /* 98 */ 0x0000d791, 0x0000d792, 0x0000d793, 0x0000d794,
+ /* 9c */ 0x0000d795, 0x0000d796, 0x0000d797, 0x0000d798,
+ /* a0 */ 0x0000daa5, 0x0000bcc6, 0x0000b6a9, 0x0000b8bc,
+ /* a4 */ 0x0000c8cf, 0x0000bca5, 0x0000daa6, 0x0000daa7,
+ /* a8 */ 0x0000ccd6, 0x0000c8c3, 0x0000daa8, 0x0000c6fd,
+ /* ac */ 0x0000d799, 0x0000d1b5, 0x0000d2e9, 0x0000d1b6,
+ /* b0 */ 0x0000bcc7, 0x0000d79a, 0x0000bdb2, 0x0000bbe4,
+ /* b4 */ 0x0000daa9, 0x0000daaa, 0x0000d1c8, 0x0000daab,
+ /* b8 */ 0x0000d0ed, 0x0000b6ef, 0x0000c2db, 0x0000d79b,
+ /* bc */ 0x0000cbcf, 0x0000b7ed, 0x0000c9e8, 0x0000b7c3,
+
+ /*** Three byte table, leaf: e8afxx - offset 0x05d55 ***/
+
+ /* 80 */ 0x0000bef7, 0x0000d6a4, 0x0000daac, 0x0000daad,
+ /* 84 */ 0x0000c6c0, 0x0000d7e7, 0x0000cab6, 0x0000d79c,
+ /* 88 */ 0x0000d5a9, 0x0000cbdf, 0x0000d5ef, 0x0000daae,
+ /* 8c */ 0x0000d6df, 0x0000b4ca, 0x0000dab0, 0x0000daaf,
+ /* 90 */ 0x0000d79d, 0x0000d2eb, 0x0000dab1, 0x0000dab2,
+ /* 94 */ 0x0000dab3, 0x0000cad4, 0x0000dab4, 0x0000caab,
+ /* 98 */ 0x0000dab5, 0x0000dab6, 0x0000b3cf, 0x0000d6ef,
+ /* 9c */ 0x0000dab7, 0x0000bbb0, 0x0000b5ae, 0x0000dab8,
+ /* a0 */ 0x0000dab9, 0x0000b9ee, 0x0000d1af, 0x0000d2e8,
+ /* a4 */ 0x0000daba, 0x0000b8c3, 0x0000cfea, 0x0000b2ef,
+ /* a8 */ 0x0000dabb, 0x0000dabc, 0x0000d79e, 0x0000bdeb,
+ /* ac */ 0x0000cedc, 0x0000d3ef, 0x0000dabd, 0x0000cef3,
+ /* b0 */ 0x0000dabe, 0x0000d3d5, 0x0000bbe5, 0x0000dabf,
+ /* b4 */ 0x0000cbb5, 0x0000cbd0, 0x0000dac0, 0x0000c7eb,
+ /* b8 */ 0x0000d6ee, 0x0000dac1, 0x0000c5b5, 0x0000b6c1,
+ /* bc */ 0x0000dac2, 0x0000b7cc, 0x0000bfce, 0x0000dac3,
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x05d95 ***/
+
+ /* 80 */ 0x0000dac4, 0x0000cbad, 0x0000dac5, 0x0000b5f7,
+ /* 84 */ 0x0000dac6, 0x0000c1c2, 0x0000d7bb, 0x0000dac7,
+ /* 88 */ 0x0000ccb8, 0x0000d79f, 0x0000d2ea, 0x0000c4b1,
+ /* 8c */ 0x0000dac8, 0x0000b5fd, 0x0000bbd1, 0x0000dac9,
+ /* 90 */ 0x0000d0b3, 0x0000daca, 0x0000dacb, 0x0000cebd,
+ /* 94 */ 0x0000dacc, 0x0000dacd, 0x0000dace, 0x0000b2f7,
+ /* 98 */ 0x0000dad1, 0x0000dacf, 0x0000d1e8, 0x0000dad0,
+ /* 9c */ 0x0000c3d5, 0x0000dad2, 0x0000d7a0, 0x0000dad3,
+ /* a0 */ 0x0000dad4, 0x0000dad5, 0x0000d0bb, 0x0000d2a5,
+ /* a4 */ 0x0000b0f9, 0x0000dad6, 0x0000c7ab, 0x0000dad7,
+ /* a8 */ 0x0000bdf7, 0x0000c3a1, 0x0000dad8, 0x0000dad9,
+ /* ac */ 0x0000c3fd, 0x0000ccb7, 0x0000dada, 0x0000dadb,
+ /* b0 */ 0x0000c0be, 0x0000c6d7, 0x0000dadc, 0x0000dadd,
+ /* b4 */ 0x0000c7b4, 0x0000dade, 0x0000dadf, 0x0000b9c8,
+ /* b8 */ 0x0000d840, 0x0000d841, 0x0000d842, 0x0000d843,
+ /* bc */ 0x0000d844, 0x0000d845, 0x0000d846, 0x0000d847,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x05dd5 ***/
+
+ /* 80 */ 0x0000d848, 0x0000bbed, 0x0000d849, 0x0000d84a,
+ /* 84 */ 0x0000d84b, 0x0000d84c, 0x0000b6b9, 0x0000f4f8,
+ /* 88 */ 0x0000d84d, 0x0000f4f9, 0x0000d84e, 0x0000d84f,
+ /* 8c */ 0x0000cde3, 0x0000d850, 0x0000d851, 0x0000d852,
+ /* 90 */ 0x0000d853, 0x0000d854, 0x0000d855, 0x0000d856,
+ /* 94 */ 0x0000d857, 0x0000f5b9, 0x0000d858, 0x0000d859,
+ /* 98 */ 0x0000d85a, 0x0000d85b, 0x0000ebe0, 0x0000d85c,
+ /* 9c */ 0x0000d85d, 0x0000d85e, 0x0000d85f, 0x0000d860,
+ /* a0 */ 0x0000d861, 0x0000cff3, 0x0000bbbf, 0x0000d862,
+ /* a4 */ 0x0000d863, 0x0000d864, 0x0000d865, 0x0000d866,
+ /* a8 */ 0x0000d867, 0x0000d868, 0x0000bac0, 0x0000d4a5,
+ /* ac */ 0x0000d869, 0x0000d86a, 0x0000d86b, 0x0000d86c,
+ /* b0 */ 0x0000d86d, 0x0000d86e, 0x0000d86f, 0x0000e1d9,
+ /* b4 */ 0x0000d870, 0x0000d871, 0x0000d872, 0x0000d873,
+ /* b8 */ 0x0000f5f4, 0x0000b1aa, 0x0000b2f2, 0x0000d874,
+ /* bc */ 0x0000d875, 0x0000d876, 0x0000d877, 0x0000d878,
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x05e15 ***/
+
+ /* 80 */ 0x0000d879, 0x0000d87a, 0x0000f5f5, 0x0000d87b,
+ /* 84 */ 0x0000d87c, 0x0000f5f7, 0x0000d87d, 0x0000d87e,
+ /* 88 */ 0x0000d880, 0x0000bad1, 0x0000f5f6, 0x0000d881,
+ /* 8c */ 0x0000c3b2, 0x0000d882, 0x0000d883, 0x0000d884,
+ /* 90 */ 0x0000d885, 0x0000d886, 0x0000d887, 0x0000d888,
+ /* 94 */ 0x0000f5f9, 0x0000d889, 0x0000d88a, 0x0000d88b,
+ /* 98 */ 0x0000f5f8, 0x0000d88c, 0x0000d88d, 0x0000d88e,
+ /* 9c */ 0x0000d88f, 0x0000d890, 0x0000d891, 0x0000d892,
+ /* a0 */ 0x0000d893, 0x0000d894, 0x0000d895, 0x0000d896,
+ /* a4 */ 0x0000d897, 0x0000d898, 0x0000d899, 0x0000d89a,
+ /* a8 */ 0x0000d89b, 0x0000d89c, 0x0000d89d, 0x0000d89e,
+ /* ac */ 0x0000d89f, 0x0000d8a0, 0x0000d940, 0x0000d941,
+ /* b0 */ 0x0000d942, 0x0000d943, 0x0000d944, 0x0000d945,
+ /* b4 */ 0x0000d946, 0x0000d947, 0x0000d948, 0x0000d949,
+ /* b8 */ 0x0000d94a, 0x0000d94b, 0x0000d94c, 0x0000d94d,
+ /* bc */ 0x0000d94e, 0x0000d94f, 0x0000d950, 0x0000d951,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x05e55 ***/
+
+ /* 80 */ 0x0000d952, 0x0000d953, 0x0000d954, 0x0000d955,
+ /* 84 */ 0x0000d956, 0x0000d957, 0x0000d958, 0x0000d959,
+ /* 88 */ 0x0000d95a, 0x0000d95b, 0x0000d95c, 0x0000d95d,
+ /* 8c */ 0x0000d95e, 0x0000d95f, 0x0000d960, 0x0000d961,
+ /* 90 */ 0x0000d962, 0x0000d963, 0x0000d964, 0x0000d965,
+ /* 94 */ 0x0000d966, 0x0000d967, 0x0000d968, 0x0000d969,
+ /* 98 */ 0x0000d96a, 0x0000d96b, 0x0000d96c, 0x0000d96d,
+ /* 9c */ 0x0000d96e, 0x0000d96f, 0x0000d970, 0x0000d971,
+ /* a0 */ 0x0000d972, 0x0000d973, 0x0000d974, 0x0000d975,
+ /* a4 */ 0x0000d976, 0x0000d977, 0x0000d978, 0x0000d979,
+ /* a8 */ 0x0000d97a, 0x0000d97b, 0x0000d97c, 0x0000d97d,
+ /* ac */ 0x0000d97e, 0x0000d980, 0x0000d981, 0x0000d982,
+ /* b0 */ 0x0000d983, 0x0000d984, 0x0000d985, 0x0000d986,
+ /* b4 */ 0x0000d987, 0x0000d988, 0x0000d989, 0x0000d98a,
+ /* b8 */ 0x0000d98b, 0x0000d98c, 0x0000d98d, 0x0000d98e,
+ /* bc */ 0x0000d98f, 0x0000d990, 0x0000d991, 0x0000d992,
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x05e95 ***/
+
+ /* 80 */ 0x0000d993, 0x0000d994, 0x0000d995, 0x0000d996,
+ /* 84 */ 0x0000d997, 0x0000d998, 0x0000d999, 0x0000d99a,
+ /* 88 */ 0x0000d99b, 0x0000d99c, 0x0000d99d, 0x0000d99e,
+ /* 8c */ 0x0000d99f, 0x0000d9a0, 0x0000da40, 0x0000da41,
+ /* 90 */ 0x0000da42, 0x0000da43, 0x0000da44, 0x0000da45,
+ /* 94 */ 0x0000da46, 0x0000da47, 0x0000da48, 0x0000da49,
+ /* 98 */ 0x0000da4a, 0x0000da4b, 0x0000da4c, 0x0000da4d,
+ /* 9c */ 0x0000da4e, 0x0000b1b4, 0x0000d5ea, 0x0000b8ba,
+ /* a0 */ 0x0000da4f, 0x0000b9b1, 0x0000b2c6, 0x0000d4f0,
+ /* a4 */ 0x0000cfcd, 0x0000b0dc, 0x0000d5cb, 0x0000bbf5,
+ /* a8 */ 0x0000d6ca, 0x0000b7b7, 0x0000ccb0, 0x0000c6b6,
+ /* ac */ 0x0000b1e1, 0x0000b9ba, 0x0000d6fc, 0x0000b9e1,
+ /* b0 */ 0x0000b7a1, 0x0000bcfa, 0x0000eada, 0x0000eadb,
+ /* b4 */ 0x0000ccf9, 0x0000b9f3, 0x0000eadc, 0x0000b4fb,
+ /* b8 */ 0x0000c3b3, 0x0000b7d1, 0x0000bad8, 0x0000eadd,
+ /* bc */ 0x0000d4f4, 0x0000eade, 0x0000bcd6, 0x0000bbdf,
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x05ed5 ***/
+
+ /* 80 */ 0x0000eadf, 0x0000c1de, 0x0000c2b8, 0x0000d4df,
+ /* 84 */ 0x0000d7ca, 0x0000eae0, 0x0000eae1, 0x0000eae4,
+ /* 88 */ 0x0000eae2, 0x0000eae3, 0x0000c9de, 0x0000b8b3,
+ /* 8c */ 0x0000b6c4, 0x0000eae5, 0x0000caea, 0x0000c9cd,
+ /* 90 */ 0x0000b4cd, 0x0000da50, 0x0000da51, 0x0000e2d9,
+ /* 94 */ 0x0000c5e2, 0x0000eae6, 0x0000c0b5, 0x0000da52,
+ /* 98 */ 0x0000d7b8, 0x0000eae7, 0x0000d7ac, 0x0000c8fc,
+ /* 9c */ 0x0000d8d3, 0x0000d8cd, 0x0000d4de, 0x0000da53,
+ /* a0 */ 0x0000d4f9, 0x0000c9c4, 0x0000d3ae, 0x0000b8d3,
+ /* a4 */ 0x0000b3e0, 0x0000da54, 0x0000c9e2, 0x0000f4f6,
+ /* a8 */ 0x0000da55, 0x0000da56, 0x0000da57, 0x0000bad5,
+ /* ac */ 0x0000da58, 0x0000f4f7, 0x0000da59, 0x0000da5a,
+ /* b0 */ 0x0000d7df, 0x0000da5b, 0x0000da5c, 0x0000f4f1,
+ /* b4 */ 0x0000b8b0, 0x0000d5d4, 0x0000b8cf, 0x0000c6f0,
+ /* b8 */ 0x0000da5d, 0x0000da5e, 0x0000da5f, 0x0000da60,
+ /* bc */ 0x0000da61, 0x0000da62, 0x0000da63, 0x0000da64,
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x05f15 ***/
+
+ /* 80 */ 0x0000da65, 0x0000b3c3, 0x0000da66, 0x0000da67,
+ /* 84 */ 0x0000f4f2, 0x0000b3ac, 0x0000da68, 0x0000da69,
+ /* 88 */ 0x0000da6a, 0x0000da6b, 0x0000d4bd, 0x0000c7f7,
+ /* 8c */ 0x0000da6c, 0x0000da6d, 0x0000da6e, 0x0000da6f,
+ /* 90 */ 0x0000da70, 0x0000f4f4, 0x0000da71, 0x0000da72,
+ /* 94 */ 0x0000f4f3, 0x0000da73, 0x0000da74, 0x0000da75,
+ /* 98 */ 0x0000da76, 0x0000da77, 0x0000da78, 0x0000da79,
+ /* 9c */ 0x0000da7a, 0x0000da7b, 0x0000da7c, 0x0000cccb,
+ /* a0 */ 0x0000da7d, 0x0000da7e, 0x0000da80, 0x0000c8a4,
+ /* a4 */ 0x0000da81, 0x0000da82, 0x0000da83, 0x0000da84,
+ /* a8 */ 0x0000da85, 0x0000da86, 0x0000da87, 0x0000da88,
+ /* ac */ 0x0000da89, 0x0000da8a, 0x0000da8b, 0x0000da8c,
+ /* b0 */ 0x0000da8d, 0x0000f4f5, 0x0000da8e, 0x0000d7e3,
+ /* b4 */ 0x0000c5bf, 0x0000f5c0, 0x0000da8f, 0x0000da90,
+ /* b8 */ 0x0000f5bb, 0x0000da91, 0x0000f5c3, 0x0000da92,
+ /* bc */ 0x0000f5c2, 0x0000da93, 0x0000d6ba, 0x0000f5c1,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x05f55 ***/
+
+ /* 80 */ 0x0000da94, 0x0000da95, 0x0000da96, 0x0000d4be,
+ /* 84 */ 0x0000f5c4, 0x0000da97, 0x0000f5cc, 0x0000da98,
+ /* 88 */ 0x0000da99, 0x0000da9a, 0x0000da9b, 0x0000b0cf,
+ /* 8c */ 0x0000b5f8, 0x0000da9c, 0x0000f5c9, 0x0000f5ca,
+ /* 90 */ 0x0000da9d, 0x0000c5dc, 0x0000da9e, 0x0000da9f,
+ /* 94 */ 0x0000daa0, 0x0000db40, 0x0000f5c5, 0x0000f5c6,
+ /* 98 */ 0x0000db41, 0x0000db42, 0x0000f5c7, 0x0000f5cb,
+ /* 9c */ 0x0000db43, 0x0000bee0, 0x0000f5c8, 0x0000b8fa,
+ /* a0 */ 0x0000db44, 0x0000db45, 0x0000db46, 0x0000f5d0,
+ /* a4 */ 0x0000f5d3, 0x0000db47, 0x0000db48, 0x0000db49,
+ /* a8 */ 0x0000bfe7, 0x0000db4a, 0x0000b9f2, 0x0000f5bc,
+ /* ac */ 0x0000f5cd, 0x0000db4b, 0x0000db4c, 0x0000c2b7,
+ /* b0 */ 0x0000db4d, 0x0000db4e, 0x0000db4f, 0x0000ccf8,
+ /* b4 */ 0x0000db50, 0x0000bcf9, 0x0000db51, 0x0000f5ce,
+ /* b8 */ 0x0000f5cf, 0x0000f5d1, 0x0000b6e5, 0x0000f5d2,
+ /* bc */ 0x0000db52, 0x0000f5d5, 0x0000db53, 0x0000db54,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x05f95 ***/
+
+ /* 80 */ 0x0000db55, 0x0000db56, 0x0000db57, 0x0000db58,
+ /* 84 */ 0x0000db59, 0x0000f5bd, 0x0000db5a, 0x0000db5b,
+ /* 88 */ 0x0000db5c, 0x0000f5d4, 0x0000d3bb, 0x0000db5d,
+ /* 8c */ 0x0000b3ec, 0x0000db5e, 0x0000db5f, 0x0000cca4,
+ /* 90 */ 0x0000db60, 0x0000db61, 0x0000db62, 0x0000db63,
+ /* 94 */ 0x0000f5d6, 0x0000db64, 0x0000db65, 0x0000db66,
+ /* 98 */ 0x0000db67, 0x0000db68, 0x0000db69, 0x0000db6a,
+ /* 9c */ 0x0000db6b, 0x0000f5d7, 0x0000bee1, 0x0000f5d8,
+ /* a0 */ 0x0000db6c, 0x0000db6d, 0x0000ccdf, 0x0000f5db,
+ /* a4 */ 0x0000db6e, 0x0000db6f, 0x0000db70, 0x0000db71,
+ /* a8 */ 0x0000db72, 0x0000b2c8, 0x0000d7d9, 0x0000db73,
+ /* ac */ 0x0000f5d9, 0x0000db74, 0x0000f5da, 0x0000f5dc,
+ /* b0 */ 0x0000db75, 0x0000f5e2, 0x0000db76, 0x0000db77,
+ /* b4 */ 0x0000db78, 0x0000f5e0, 0x0000db79, 0x0000db7a,
+ /* b8 */ 0x0000db7b, 0x0000f5df, 0x0000f5dd, 0x0000db7c,
+ /* bc */ 0x0000db7d, 0x0000f5e1, 0x0000db7e, 0x0000db80,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x05fd5 ***/
+
+ /* 80 */ 0x0000f5de, 0x0000f5e4, 0x0000f5e5, 0x0000db81,
+ /* 84 */ 0x0000cce3, 0x0000db82, 0x0000db83, 0x0000e5bf,
+ /* 88 */ 0x0000b5b8, 0x0000f5e3, 0x0000f5e8, 0x0000cca3,
+ /* 8c */ 0x0000db84, 0x0000db85, 0x0000db86, 0x0000db87,
+ /* 90 */ 0x0000db88, 0x0000f5e6, 0x0000f5e7, 0x0000db89,
+ /* 94 */ 0x0000db8a, 0x0000db8b, 0x0000db8c, 0x0000db8d,
+ /* 98 */ 0x0000db8e, 0x0000f5be, 0x0000db8f, 0x0000db90,
+ /* 9c */ 0x0000db91, 0x0000db92, 0x0000db93, 0x0000db94,
+ /* a0 */ 0x0000db95, 0x0000db96, 0x0000db97, 0x0000db98,
+ /* a4 */ 0x0000db99, 0x0000db9a, 0x0000b1c4, 0x0000db9b,
+ /* a8 */ 0x0000db9c, 0x0000f5bf, 0x0000db9d, 0x0000db9e,
+ /* ac */ 0x0000b5c5, 0x0000b2e4, 0x0000db9f, 0x0000f5ec,
+ /* b0 */ 0x0000f5e9, 0x0000dba0, 0x0000b6d7, 0x0000dc40,
+ /* b4 */ 0x0000f5ed, 0x0000dc41, 0x0000f5ea, 0x0000dc42,
+ /* b8 */ 0x0000dc43, 0x0000dc44, 0x0000dc45, 0x0000dc46,
+ /* bc */ 0x0000f5eb, 0x0000dc47, 0x0000dc48, 0x0000b4da,
+
+ /*** Three byte table, leaf: e8baxx - offset 0x06015 ***/
+
+ /* 80 */ 0x0000dc49, 0x0000d4ea, 0x0000dc4a, 0x0000dc4b,
+ /* 84 */ 0x0000dc4c, 0x0000f5ee, 0x0000dc4d, 0x0000b3f9,
+ /* 88 */ 0x0000dc4e, 0x0000dc4f, 0x0000dc50, 0x0000dc51,
+ /* 8c */ 0x0000dc52, 0x0000dc53, 0x0000dc54, 0x0000f5ef,
+ /* 90 */ 0x0000f5f1, 0x0000dc55, 0x0000dc56, 0x0000dc57,
+ /* 94 */ 0x0000f5f0, 0x0000dc58, 0x0000dc59, 0x0000dc5a,
+ /* 98 */ 0x0000dc5b, 0x0000dc5c, 0x0000dc5d, 0x0000dc5e,
+ /* 9c */ 0x0000f5f2, 0x0000dc5f, 0x0000f5f3, 0x0000dc60,
+ /* a0 */ 0x0000dc61, 0x0000dc62, 0x0000dc63, 0x0000dc64,
+ /* a4 */ 0x0000dc65, 0x0000dc66, 0x0000dc67, 0x0000dc68,
+ /* a8 */ 0x0000dc69, 0x0000dc6a, 0x0000dc6b, 0x0000c9ed,
+ /* ac */ 0x0000b9aa, 0x0000dc6c, 0x0000dc6d, 0x0000c7fb,
+ /* b0 */ 0x0000dc6e, 0x0000dc6f, 0x0000b6e3, 0x0000dc70,
+ /* b4 */ 0x0000dc71, 0x0000dc72, 0x0000dc73, 0x0000dc74,
+ /* b8 */ 0x0000dc75, 0x0000dc76, 0x0000ccc9, 0x0000dc77,
+ /* bc */ 0x0000dc78, 0x0000dc79, 0x0000dc7a, 0x0000dc7b,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x06055 ***/
+
+ /* 80 */ 0x0000dc7c, 0x0000dc7d, 0x0000dc7e, 0x0000dc80,
+ /* 84 */ 0x0000dc81, 0x0000dc82, 0x0000dc83, 0x0000dc84,
+ /* 88 */ 0x0000dc85, 0x0000dc86, 0x0000dc87, 0x0000dc88,
+ /* 8c */ 0x0000dc89, 0x0000dc8a, 0x0000eaa6, 0x0000dc8b,
+ /* 90 */ 0x0000dc8c, 0x0000dc8d, 0x0000dc8e, 0x0000dc8f,
+ /* 94 */ 0x0000dc90, 0x0000dc91, 0x0000dc92, 0x0000dc93,
+ /* 98 */ 0x0000dc94, 0x0000dc95, 0x0000dc96, 0x0000dc97,
+ /* 9c */ 0x0000dc98, 0x0000dc99, 0x0000dc9a, 0x0000dc9b,
+ /* a0 */ 0x0000dc9c, 0x0000dc9d, 0x0000dc9e, 0x0000dc9f,
+ /* a4 */ 0x0000dca0, 0x0000dd40, 0x0000dd41, 0x0000dd42,
+ /* a8 */ 0x0000dd43, 0x0000dd44, 0x0000dd45, 0x0000dd46,
+ /* ac */ 0x0000dd47, 0x0000dd48, 0x0000dd49, 0x0000dd4a,
+ /* b0 */ 0x0000dd4b, 0x0000dd4c, 0x0000dd4d, 0x0000dd4e,
+ /* b4 */ 0x0000dd4f, 0x0000dd50, 0x0000dd51, 0x0000dd52,
+ /* b8 */ 0x0000dd53, 0x0000dd54, 0x0000dd55, 0x0000dd56,
+ /* bc */ 0x0000dd57, 0x0000dd58, 0x0000dd59, 0x0000dd5a,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x06095 ***/
+
+ /* 80 */ 0x0000dd5b, 0x0000dd5c, 0x0000dd5d, 0x0000dd5e,
+ /* 84 */ 0x0000dd5f, 0x0000dd60, 0x0000dd61, 0x0000dd62,
+ /* 88 */ 0x0000dd63, 0x0000dd64, 0x0000dd65, 0x0000dd66,
+ /* 8c */ 0x0000dd67, 0x0000dd68, 0x0000dd69, 0x0000dd6a,
+ /* 90 */ 0x0000dd6b, 0x0000dd6c, 0x0000dd6d, 0x0000dd6e,
+ /* 94 */ 0x0000dd6f, 0x0000dd70, 0x0000dd71, 0x0000dd72,
+ /* 98 */ 0x0000dd73, 0x0000dd74, 0x0000dd75, 0x0000dd76,
+ /* 9c */ 0x0000dd77, 0x0000dd78, 0x0000dd79, 0x0000dd7a,
+ /* a0 */ 0x0000dd7b, 0x0000dd7c, 0x0000dd7d, 0x0000dd7e,
+ /* a4 */ 0x0000dd80, 0x0000dd81, 0x0000dd82, 0x0000dd83,
+ /* a8 */ 0x0000dd84, 0x0000dd85, 0x0000dd86, 0x0000dd87,
+ /* ac */ 0x0000dd88, 0x0000dd89, 0x0000dd8a, 0x0000dd8b,
+ /* b0 */ 0x0000dd8c, 0x0000dd8d, 0x0000dd8e, 0x0000dd8f,
+ /* b4 */ 0x0000dd90, 0x0000dd91, 0x0000dd92, 0x0000dd93,
+ /* b8 */ 0x0000dd94, 0x0000dd95, 0x0000dd96, 0x0000dd97,
+ /* bc */ 0x0000dd98, 0x0000dd99, 0x0000dd9a, 0x0000dd9b,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x060d5 ***/
+
+ /* 80 */ 0x0000dd9c, 0x0000dd9d, 0x0000dd9e, 0x0000dd9f,
+ /* 84 */ 0x0000dda0, 0x0000de40, 0x0000de41, 0x0000de42,
+ /* 88 */ 0x0000de43, 0x0000de44, 0x0000de45, 0x0000de46,
+ /* 8c */ 0x0000de47, 0x0000de48, 0x0000de49, 0x0000de4a,
+ /* 90 */ 0x0000de4b, 0x0000de4c, 0x0000de4d, 0x0000de4e,
+ /* 94 */ 0x0000de4f, 0x0000de50, 0x0000de51, 0x0000de52,
+ /* 98 */ 0x0000de53, 0x0000de54, 0x0000de55, 0x0000de56,
+ /* 9c */ 0x0000de57, 0x0000de58, 0x0000de59, 0x0000de5a,
+ /* a0 */ 0x0000de5b, 0x0000de5c, 0x0000de5d, 0x0000de5e,
+ /* a4 */ 0x0000de5f, 0x0000de60, 0x0000b3b5, 0x0000d4fe,
+ /* a8 */ 0x0000b9ec, 0x0000d0f9, 0x0000de61, 0x0000e9ed,
+ /* ac */ 0x0000d7aa, 0x0000e9ee, 0x0000c2d6, 0x0000c8ed,
+ /* b0 */ 0x0000bae4, 0x0000e9ef, 0x0000e9f0, 0x0000e9f1,
+ /* b4 */ 0x0000d6e1, 0x0000e9f2, 0x0000e9f3, 0x0000e9f5,
+ /* b8 */ 0x0000e9f4, 0x0000e9f6, 0x0000e9f7, 0x0000c7e1,
+ /* bc */ 0x0000e9f8, 0x0000d4d8, 0x0000e9f9, 0x0000bdce,
+
+ /*** Three byte table, leaf: e8bexx - offset 0x06115 ***/
+
+ /* 80 */ 0x0000de62, 0x0000e9fa, 0x0000e9fb, 0x0000bdcf,
+ /* 84 */ 0x0000e9fc, 0x0000b8a8, 0x0000c1be, 0x0000e9fd,
+ /* 88 */ 0x0000b1b2, 0x0000bbd4, 0x0000b9f5, 0x0000e9fe,
+ /* 8c */ 0x0000de63, 0x0000eaa1, 0x0000eaa2, 0x0000eaa3,
+ /* 90 */ 0x0000b7f8, 0x0000bcad, 0x0000de64, 0x0000cae4,
+ /* 94 */ 0x0000e0ce, 0x0000d4af, 0x0000cfbd, 0x0000d5b7,
+ /* 98 */ 0x0000eaa4, 0x0000d5de, 0x0000eaa5, 0x0000d0c1,
+ /* 9c */ 0x0000b9bc, 0x0000de65, 0x0000b4c7, 0x0000b1d9,
+ /* a0 */ 0x0000de66, 0x0000de67, 0x0000de68, 0x0000c0b1,
+ /* a4 */ 0x0000de69, 0x0000de6a, 0x0000de6b, 0x0000de6c,
+ /* a8 */ 0x0000b1e6, 0x0000b1e7, 0x0000de6d, 0x0000b1e8,
+ /* ac */ 0x0000de6e, 0x0000de6f, 0x0000de70, 0x0000de71,
+ /* b0 */ 0x0000b3bd, 0x0000c8e8, 0x0000de72, 0x0000de73,
+ /* b4 */ 0x0000de74, 0x0000de75, 0x0000e5c1, 0x0000de76,
+ /* b8 */ 0x0000de77, 0x0000b1df, 0x0000de78, 0x0000de79,
+ /* bc */ 0x0000de7a, 0x0000c1c9, 0x0000b4ef, 0x0000de7b,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x06155 ***/
+
+ /* 80 */ 0x0000de7c, 0x0000c7a8, 0x0000d3d8, 0x0000de7d,
+ /* 84 */ 0x0000c6f9, 0x0000d1b8, 0x0000de7e, 0x0000b9fd,
+ /* 88 */ 0x0000c2f5, 0x0000de80, 0x0000de81, 0x0000de82,
+ /* 8c */ 0x0000de83, 0x0000de84, 0x0000d3ad, 0x0000de85,
+ /* 90 */ 0x0000d4cb, 0x0000bdfc, 0x0000de86, 0x0000e5c2,
+ /* 94 */ 0x0000b7b5, 0x0000e5c3, 0x0000de87, 0x0000de88,
+ /* 98 */ 0x0000bbb9, 0x0000d5e2, 0x0000de89, 0x0000bdf8,
+ /* 9c */ 0x0000d4b6, 0x0000cea5, 0x0000c1ac, 0x0000b3d9,
+ /* a0 */ 0x0000de8a, 0x0000de8b, 0x0000ccf6, 0x0000de8c,
+ /* a4 */ 0x0000e5c6, 0x0000e5c4, 0x0000e5c8, 0x0000de8d,
+ /* a8 */ 0x0000e5ca, 0x0000e5c7, 0x0000b5cf, 0x0000c6c8,
+ /* ac */ 0x0000de8e, 0x0000b5fc, 0x0000e5c5, 0x0000de8f,
+ /* b0 */ 0x0000caf6, 0x0000de90, 0x0000de91, 0x0000e5c9,
+ /* b4 */ 0x0000de92, 0x0000de93, 0x0000de94, 0x0000c3d4,
+ /* b8 */ 0x0000b1c5, 0x0000bca3, 0x0000de95, 0x0000de96,
+ /* bc */ 0x0000de97, 0x0000d7b7, 0x0000de98, 0x0000de99,
+
+ /*** Three byte table, leaf: e980xx - offset 0x06195 ***/
+
+ /* 80 */ 0x0000cdcb, 0x0000cbcd, 0x0000caca, 0x0000ccd3,
+ /* 84 */ 0x0000e5cc, 0x0000e5cb, 0x0000c4e6, 0x0000de9a,
+ /* 88 */ 0x0000de9b, 0x0000d1a1, 0x0000d1b7, 0x0000e5cd,
+ /* 8c */ 0x0000de9c, 0x0000e5d0, 0x0000de9d, 0x0000cdb8,
+ /* 90 */ 0x0000d6f0, 0x0000e5cf, 0x0000b5dd, 0x0000de9e,
+ /* 94 */ 0x0000cdbe, 0x0000de9f, 0x0000e5d1, 0x0000b6ba,
+ /* 98 */ 0x0000dea0, 0x0000df40, 0x0000cda8, 0x0000b9e4,
+ /* 9c */ 0x0000df41, 0x0000cac5, 0x0000b3d1, 0x0000cbd9,
+ /* a0 */ 0x0000d4ec, 0x0000e5d2, 0x0000b7ea, 0x0000df42,
+ /* a4 */ 0x0000df43, 0x0000df44, 0x0000e5ce, 0x0000df45,
+ /* a8 */ 0x0000df46, 0x0000df47, 0x0000df48, 0x0000df49,
+ /* ac */ 0x0000df4a, 0x0000e5d5, 0x0000b4fe, 0x0000e5d6,
+ /* b0 */ 0x0000df4b, 0x0000df4c, 0x0000df4d, 0x0000df4e,
+ /* b4 */ 0x0000df4f, 0x0000e5d3, 0x0000e5d4, 0x0000df50,
+ /* b8 */ 0x0000d2dd, 0x0000df51, 0x0000df52, 0x0000c2df,
+ /* bc */ 0x0000b1c6, 0x0000df53, 0x0000d3e2, 0x0000df54,
+
+ /*** Three byte table, leaf: e981xx - offset 0x061d5 ***/
+
+ /* 80 */ 0x0000df55, 0x0000b6dd, 0x0000cbec, 0x0000df56,
+ /* 84 */ 0x0000e5d7, 0x0000df57, 0x0000df58, 0x0000d3f6,
+ /* 88 */ 0x0000df59, 0x0000df5a, 0x0000df5b, 0x0000df5c,
+ /* 8c */ 0x0000df5d, 0x0000b1e9, 0x0000df5e, 0x0000b6f4,
+ /* 90 */ 0x0000e5da, 0x0000e5d8, 0x0000e5d9, 0x0000b5c0,
+ /* 94 */ 0x0000df5f, 0x0000df60, 0x0000df61, 0x0000d2c5,
+ /* 98 */ 0x0000e5dc, 0x0000df62, 0x0000df63, 0x0000e5de,
+ /* 9c */ 0x0000df64, 0x0000df65, 0x0000df66, 0x0000df67,
+ /* a0 */ 0x0000df68, 0x0000df69, 0x0000e5dd, 0x0000c7b2,
+ /* a4 */ 0x0000df6a, 0x0000d2a3, 0x0000df6b, 0x0000df6c,
+ /* a8 */ 0x0000e5db, 0x0000df6d, 0x0000df6e, 0x0000df6f,
+ /* ac */ 0x0000df70, 0x0000d4e2, 0x0000d5da, 0x0000df71,
+ /* b0 */ 0x0000df72, 0x0000df73, 0x0000df74, 0x0000df75,
+ /* b4 */ 0x0000e5e0, 0x0000d7f1, 0x0000df76, 0x0000df77,
+ /* b8 */ 0x0000df78, 0x0000df79, 0x0000df7a, 0x0000df7b,
+ /* bc */ 0x0000df7c, 0x0000e5e1, 0x0000df7d, 0x0000b1dc,
+
+ /*** Three byte table, leaf: e982xx - offset 0x06215 ***/
+
+ /* 80 */ 0x0000d1fb, 0x0000df7e, 0x0000e5e2, 0x0000e5e4,
+ /* 84 */ 0x0000df80, 0x0000df81, 0x0000df82, 0x0000df83,
+ /* 88 */ 0x0000e5e3, 0x0000df84, 0x0000df85, 0x0000e5e5,
+ /* 8c */ 0x0000df86, 0x0000df87, 0x0000df88, 0x0000df89,
+ /* 90 */ 0x0000df8a, 0x0000d2d8, 0x0000df8b, 0x0000b5cb,
+ /* 94 */ 0x0000df8c, 0x0000e7df, 0x0000df8d, 0x0000daf5,
+ /* 98 */ 0x0000df8e, 0x0000daf8, 0x0000df8f, 0x0000daf6,
+ /* 9c */ 0x0000df90, 0x0000daf7, 0x0000df91, 0x0000df92,
+ /* a0 */ 0x0000df93, 0x0000dafa, 0x0000d0cf, 0x0000c4c7,
+ /* a4 */ 0x0000df94, 0x0000df95, 0x0000b0ee, 0x0000df96,
+ /* a8 */ 0x0000df97, 0x0000df98, 0x0000d0b0, 0x0000df99,
+ /* ac */ 0x0000daf9, 0x0000df9a, 0x0000d3ca, 0x0000baaa,
+ /* b0 */ 0x0000dba2, 0x0000c7f1, 0x0000df9b, 0x0000dafc,
+ /* b4 */ 0x0000dafb, 0x0000c9db, 0x0000dafd, 0x0000df9c,
+ /* b8 */ 0x0000dba1, 0x0000d7de, 0x0000dafe, 0x0000c1da,
+ /* bc */ 0x0000df9d, 0x0000df9e, 0x0000dba5, 0x0000df9f,
+
+ /*** Three byte table, leaf: e983xx - offset 0x06255 ***/
+
+ /* 80 */ 0x0000dfa0, 0x0000d3f4, 0x0000e040, 0x0000e041,
+ /* 84 */ 0x0000dba7, 0x0000dba4, 0x0000e042, 0x0000dba8,
+ /* 88 */ 0x0000e043, 0x0000e044, 0x0000bdbc, 0x0000e045,
+ /* 8c */ 0x0000e046, 0x0000e047, 0x0000c0c9, 0x0000dba3,
+ /* 90 */ 0x0000dba6, 0x0000d6a3, 0x0000e048, 0x0000dba9,
+ /* 94 */ 0x0000e049, 0x0000e04a, 0x0000e04b, 0x0000dbad,
+ /* 98 */ 0x0000e04c, 0x0000e04d, 0x0000e04e, 0x0000dbae,
+ /* 9c */ 0x0000dbac, 0x0000bac2, 0x0000e04f, 0x0000e050,
+ /* a0 */ 0x0000e051, 0x0000bfa4, 0x0000dbab, 0x0000e052,
+ /* a4 */ 0x0000e053, 0x0000e054, 0x0000dbaa, 0x0000d4c7,
+ /* a8 */ 0x0000b2bf, 0x0000e055, 0x0000e056, 0x0000dbaf,
+ /* ac */ 0x0000e057, 0x0000b9f9, 0x0000e058, 0x0000dbb0,
+ /* b0 */ 0x0000e059, 0x0000e05a, 0x0000e05b, 0x0000e05c,
+ /* b4 */ 0x0000b3bb, 0x0000e05d, 0x0000e05e, 0x0000e05f,
+ /* b8 */ 0x0000b5a6, 0x0000e060, 0x0000e061, 0x0000e062,
+ /* bc */ 0x0000e063, 0x0000b6bc, 0x0000dbb1, 0x0000e064,
+
+ /*** Three byte table, leaf: e984xx - offset 0x06295 ***/
+
+ /* 80 */ 0x0000e065, 0x0000e066, 0x0000b6f5, 0x0000e067,
+ /* 84 */ 0x0000dbb2, 0x0000e068, 0x0000e069, 0x0000e06a,
+ /* 88 */ 0x0000e06b, 0x0000e06c, 0x0000e06d, 0x0000e06e,
+ /* 8c */ 0x0000e06f, 0x0000e070, 0x0000e071, 0x0000e072,
+ /* 90 */ 0x0000e073, 0x0000e074, 0x0000e075, 0x0000e076,
+ /* 94 */ 0x0000e077, 0x0000e078, 0x0000e079, 0x0000e07a,
+ /* 98 */ 0x0000e07b, 0x0000b1c9, 0x0000e07c, 0x0000e07d,
+ /* 9c */ 0x0000e07e, 0x0000e080, 0x0000dbb4, 0x0000e081,
+ /* a0 */ 0x0000e082, 0x0000e083, 0x0000dbb3, 0x0000dbb5,
+ /* a4 */ 0x0000e084, 0x0000e085, 0x0000e086, 0x0000e087,
+ /* a8 */ 0x0000e088, 0x0000e089, 0x0000e08a, 0x0000e08b,
+ /* ac */ 0x0000e08c, 0x0000e08d, 0x0000e08e, 0x0000dbb7,
+ /* b0 */ 0x0000e08f, 0x0000dbb6, 0x0000e090, 0x0000e091,
+ /* b4 */ 0x0000e092, 0x0000e093, 0x0000e094, 0x0000e095,
+ /* b8 */ 0x0000e096, 0x0000dbb8, 0x0000e097, 0x0000e098,
+ /* bc */ 0x0000e099, 0x0000e09a, 0x0000e09b, 0x0000e09c,
+
+ /*** Three byte table, leaf: e985xx - offset 0x062d5 ***/
+
+ /* 80 */ 0x0000e09d, 0x0000e09e, 0x0000e09f, 0x0000dbb9,
+ /* 84 */ 0x0000e0a0, 0x0000e140, 0x0000dbba, 0x0000e141,
+ /* 88 */ 0x0000e142, 0x0000d3cf, 0x0000f4fa, 0x0000c7f5,
+ /* 8c */ 0x0000d7c3, 0x0000c5e4, 0x0000f4fc, 0x0000f4fd,
+ /* 90 */ 0x0000f4fb, 0x0000e143, 0x0000bec6, 0x0000e144,
+ /* 94 */ 0x0000e145, 0x0000e146, 0x0000e147, 0x0000d0ef,
+ /* 98 */ 0x0000e148, 0x0000e149, 0x0000b7d3, 0x0000e14a,
+ /* 9c */ 0x0000e14b, 0x0000d4cd, 0x0000ccaa, 0x0000e14c,
+ /* a0 */ 0x0000e14d, 0x0000f5a2, 0x0000f5a1, 0x0000baa8,
+ /* a4 */ 0x0000f4fe, 0x0000cbd6, 0x0000e14e, 0x0000e14f,
+ /* a8 */ 0x0000e150, 0x0000f5a4, 0x0000c0d2, 0x0000e151,
+ /* ac */ 0x0000b3ea, 0x0000e152, 0x0000cdaa, 0x0000f5a5,
+ /* b0 */ 0x0000f5a3, 0x0000bdb4, 0x0000f5a8, 0x0000e153,
+ /* b4 */ 0x0000f5a9, 0x0000bdcd, 0x0000c3b8, 0x0000bfe1,
+ /* b8 */ 0x0000cbe1, 0x0000f5aa, 0x0000e154, 0x0000e155,
+ /* bc */ 0x0000e156, 0x0000f5a6, 0x0000f5a7, 0x0000c4f0,
+
+ /*** Three byte table, leaf: e986xx - offset 0x06315 ***/
+
+ /* 80 */ 0x0000e157, 0x0000e158, 0x0000e159, 0x0000e15a,
+ /* 84 */ 0x0000e15b, 0x0000f5ac, 0x0000e15c, 0x0000b4bc,
+ /* 88 */ 0x0000e15d, 0x0000d7ed, 0x0000e15e, 0x0000b4d7,
+ /* 8c */ 0x0000f5ab, 0x0000f5ae, 0x0000e15f, 0x0000e160,
+ /* 90 */ 0x0000f5ad, 0x0000f5af, 0x0000d0d1, 0x0000e161,
+ /* 94 */ 0x0000e162, 0x0000e163, 0x0000e164, 0x0000e165,
+ /* 98 */ 0x0000e166, 0x0000e167, 0x0000c3d1, 0x0000c8a9,
+ /* 9c */ 0x0000e168, 0x0000e169, 0x0000e16a, 0x0000e16b,
+ /* a0 */ 0x0000e16c, 0x0000e16d, 0x0000f5b0, 0x0000f5b1,
+ /* a4 */ 0x0000e16e, 0x0000e16f, 0x0000e170, 0x0000e171,
+ /* a8 */ 0x0000e172, 0x0000e173, 0x0000f5b2, 0x0000e174,
+ /* ac */ 0x0000e175, 0x0000f5b3, 0x0000f5b4, 0x0000f5b5,
+ /* b0 */ 0x0000e176, 0x0000e177, 0x0000e178, 0x0000e179,
+ /* b4 */ 0x0000f5b7, 0x0000f5b6, 0x0000e17a, 0x0000e17b,
+ /* b8 */ 0x0000e17c, 0x0000e17d, 0x0000f5b8, 0x0000e17e,
+ /* bc */ 0x0000e180, 0x0000e181, 0x0000e182, 0x0000e183,
+
+ /*** Three byte table, leaf: e987xx - offset 0x06355 ***/
+
+ /* 80 */ 0x0000e184, 0x0000e185, 0x0000e186, 0x0000e187,
+ /* 84 */ 0x0000e188, 0x0000e189, 0x0000e18a, 0x0000b2c9,
+ /* 88 */ 0x0000e18b, 0x0000d3d4, 0x0000cacd, 0x0000e18c,
+ /* 8c */ 0x0000c0ef, 0x0000d6d8, 0x0000d2b0, 0x0000c1bf,
+ /* 90 */ 0x0000e18d, 0x0000bdf0, 0x0000e18e, 0x0000e18f,
+ /* 94 */ 0x0000e190, 0x0000e191, 0x0000e192, 0x0000e193,
+ /* 98 */ 0x0000e194, 0x0000e195, 0x0000e196, 0x0000e197,
+ /* 9c */ 0x0000b8aa, 0x0000e198, 0x0000e199, 0x0000e19a,
+ /* a0 */ 0x0000e19b, 0x0000e19c, 0x0000e19d, 0x0000e19e,
+ /* a4 */ 0x0000e19f, 0x0000e1a0, 0x0000e240, 0x0000e241,
+ /* a8 */ 0x0000e242, 0x0000e243, 0x0000e244, 0x0000e245,
+ /* ac */ 0x0000e246, 0x0000e247, 0x0000e248, 0x0000e249,
+ /* b0 */ 0x0000e24a, 0x0000e24b, 0x0000e24c, 0x0000e24d,
+ /* b4 */ 0x0000e24e, 0x0000e24f, 0x0000e250, 0x0000e251,
+ /* b8 */ 0x0000e252, 0x0000e253, 0x0000e254, 0x0000e255,
+ /* bc */ 0x0000e256, 0x0000e257, 0x0000e258, 0x0000e259,
+
+ /*** Three byte table, leaf: e988xx - offset 0x06395 ***/
+
+ /* 80 */ 0x0000e25a, 0x0000e25b, 0x0000e25c, 0x0000e25d,
+ /* 84 */ 0x0000e25e, 0x0000e25f, 0x0000e260, 0x0000e261,
+ /* 88 */ 0x0000e262, 0x0000e263, 0x0000e264, 0x0000e265,
+ /* 8c */ 0x0000e266, 0x0000e267, 0x0000e268, 0x0000e269,
+ /* 90 */ 0x0000e26a, 0x0000e26b, 0x0000e26c, 0x0000e26d,
+ /* 94 */ 0x0000e26e, 0x0000e26f, 0x0000e270, 0x0000e271,
+ /* 98 */ 0x0000e272, 0x0000e273, 0x0000e274, 0x0000e275,
+ /* 9c */ 0x0000e276, 0x0000e277, 0x0000e278, 0x0000e279,
+ /* a0 */ 0x0000e27a, 0x0000e27b, 0x0000e27c, 0x0000e27d,
+ /* a4 */ 0x0000e27e, 0x0000e280, 0x0000e281, 0x0000e282,
+ /* a8 */ 0x0000e283, 0x0000e284, 0x0000e285, 0x0000e286,
+ /* ac */ 0x0000e287, 0x0000e288, 0x0000e289, 0x0000e28a,
+ /* b0 */ 0x0000e28b, 0x0000e28c, 0x0000e28d, 0x0000e28e,
+ /* b4 */ 0x0000e28f, 0x0000e290, 0x0000e291, 0x0000e292,
+ /* b8 */ 0x0000e293, 0x0000e294, 0x0000e295, 0x0000e296,
+ /* bc */ 0x0000e297, 0x0000e298, 0x0000e299, 0x0000e29a,
+
+ /*** Three byte table, leaf: e989xx - offset 0x063d5 ***/
+
+ /* 80 */ 0x0000e29b, 0x0000e29c, 0x0000e29d, 0x0000e29e,
+ /* 84 */ 0x0000e29f, 0x0000e2a0, 0x0000e340, 0x0000e341,
+ /* 88 */ 0x0000e342, 0x0000e343, 0x0000e344, 0x0000e345,
+ /* 8c */ 0x0000e346, 0x0000e347, 0x0000e348, 0x0000e349,
+ /* 90 */ 0x0000e34a, 0x0000e34b, 0x0000e34c, 0x0000e34d,
+ /* 94 */ 0x0000e34e, 0x0000e34f, 0x0000e350, 0x0000e351,
+ /* 98 */ 0x0000e352, 0x0000e353, 0x0000e354, 0x0000e355,
+ /* 9c */ 0x0000e356, 0x0000e357, 0x0000e358, 0x0000e359,
+ /* a0 */ 0x0000e35a, 0x0000e35b, 0x0000e35c, 0x0000e35d,
+ /* a4 */ 0x0000e35e, 0x0000e35f, 0x0000e360, 0x0000e361,
+ /* a8 */ 0x0000e362, 0x0000e363, 0x0000e364, 0x0000e365,
+ /* ac */ 0x0000e366, 0x0000e367, 0x0000e368, 0x0000e369,
+ /* b0 */ 0x0000e36a, 0x0000e36b, 0x0000e36c, 0x0000e36d,
+ /* b4 */ 0x0000bcf8, 0x0000e36e, 0x0000e36f, 0x0000e370,
+ /* b8 */ 0x0000e371, 0x0000e372, 0x0000e373, 0x0000e374,
+ /* bc */ 0x0000e375, 0x0000e376, 0x0000e377, 0x0000e378,
+
+ /*** Three byte table, leaf: e98axx - offset 0x06415 ***/
+
+ /* 80 */ 0x0000e379, 0x0000e37a, 0x0000e37b, 0x0000e37c,
+ /* 84 */ 0x0000e37d, 0x0000e37e, 0x0000e380, 0x0000e381,
+ /* 88 */ 0x0000e382, 0x0000e383, 0x0000e384, 0x0000e385,
+ /* 8c */ 0x0000e386, 0x0000e387, 0x0000f6c6, 0x0000e388,
+ /* 90 */ 0x0000e389, 0x0000e38a, 0x0000e38b, 0x0000e38c,
+ /* 94 */ 0x0000e38d, 0x0000e38e, 0x0000e38f, 0x0000e390,
+ /* 98 */ 0x0000e391, 0x0000e392, 0x0000e393, 0x0000e394,
+ /* 9c */ 0x0000e395, 0x0000e396, 0x0000e397, 0x0000e398,
+ /* a0 */ 0x0000e399, 0x0000e39a, 0x0000e39b, 0x0000e39c,
+ /* a4 */ 0x0000e39d, 0x0000e39e, 0x0000e39f, 0x0000e3a0,
+ /* a8 */ 0x0000e440, 0x0000e441, 0x0000e442, 0x0000e443,
+ /* ac */ 0x0000e444, 0x0000e445, 0x0000f6c7, 0x0000e446,
+ /* b0 */ 0x0000e447, 0x0000e448, 0x0000e449, 0x0000e44a,
+ /* b4 */ 0x0000e44b, 0x0000e44c, 0x0000e44d, 0x0000e44e,
+ /* b8 */ 0x0000e44f, 0x0000e450, 0x0000e451, 0x0000e452,
+ /* bc */ 0x0000e453, 0x0000e454, 0x0000e455, 0x0000e456,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x06455 ***/
+
+ /* 80 */ 0x0000e457, 0x0000e458, 0x0000e459, 0x0000e45a,
+ /* 84 */ 0x0000e45b, 0x0000e45c, 0x0000e45d, 0x0000e45e,
+ /* 88 */ 0x0000f6c8, 0x0000e45f, 0x0000e460, 0x0000e461,
+ /* 8c */ 0x0000e462, 0x0000e463, 0x0000e464, 0x0000e465,
+ /* 90 */ 0x0000e466, 0x0000e467, 0x0000e468, 0x0000e469,
+ /* 94 */ 0x0000e46a, 0x0000e46b, 0x0000e46c, 0x0000e46d,
+ /* 98 */ 0x0000e46e, 0x0000e46f, 0x0000e470, 0x0000e471,
+ /* 9c */ 0x0000e472, 0x0000e473, 0x0000e474, 0x0000e475,
+ /* a0 */ 0x0000e476, 0x0000e477, 0x0000e478, 0x0000e479,
+ /* a4 */ 0x0000e47a, 0x0000e47b, 0x0000e47c, 0x0000e47d,
+ /* a8 */ 0x0000e47e, 0x0000e480, 0x0000e481, 0x0000e482,
+ /* ac */ 0x0000e483, 0x0000e484, 0x0000e485, 0x0000e486,
+ /* b0 */ 0x0000e487, 0x0000e488, 0x0000e489, 0x0000e48a,
+ /* b4 */ 0x0000e48b, 0x0000e48c, 0x0000e48d, 0x0000e48e,
+ /* b8 */ 0x0000e48f, 0x0000e490, 0x0000e491, 0x0000e492,
+ /* bc */ 0x0000e493, 0x0000e494, 0x0000e495, 0x0000e496,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x06495 ***/
+
+ /* 80 */ 0x0000e497, 0x0000e498, 0x0000e499, 0x0000e49a,
+ /* 84 */ 0x0000e49b, 0x0000e49c, 0x0000e49d, 0x0000e49e,
+ /* 88 */ 0x0000e49f, 0x0000e4a0, 0x0000e540, 0x0000e541,
+ /* 8c */ 0x0000e542, 0x0000e543, 0x0000e544, 0x0000e545,
+ /* 90 */ 0x0000e546, 0x0000e547, 0x0000e548, 0x0000e549,
+ /* 94 */ 0x0000e54a, 0x0000e54b, 0x0000e54c, 0x0000e54d,
+ /* 98 */ 0x0000e54e, 0x0000e54f, 0x0000e550, 0x0000e551,
+ /* 9c */ 0x0000e552, 0x0000e553, 0x0000e554, 0x0000e555,
+ /* a0 */ 0x0000e556, 0x0000e557, 0x0000e558, 0x0000e559,
+ /* a4 */ 0x0000e55a, 0x0000e55b, 0x0000e55c, 0x0000e55d,
+ /* a8 */ 0x0000e55e, 0x0000e55f, 0x0000e560, 0x0000e561,
+ /* ac */ 0x0000e562, 0x0000e563, 0x0000e564, 0x0000e565,
+ /* b0 */ 0x0000e566, 0x0000e567, 0x0000e568, 0x0000e569,
+ /* b4 */ 0x0000e56a, 0x0000e56b, 0x0000e56c, 0x0000e56d,
+ /* b8 */ 0x0000e56e, 0x0000e56f, 0x0000e570, 0x0000e571,
+ /* bc */ 0x0000e572, 0x0000e573, 0x0000f6c9, 0x0000e574,
+
+ /*** Three byte table, leaf: e98dxx - offset 0x064d5 ***/
+
+ /* 80 */ 0x0000e575, 0x0000e576, 0x0000e577, 0x0000e578,
+ /* 84 */ 0x0000e579, 0x0000e57a, 0x0000e57b, 0x0000e57c,
+ /* 88 */ 0x0000e57d, 0x0000e57e, 0x0000e580, 0x0000e581,
+ /* 8c */ 0x0000e582, 0x0000e583, 0x0000e584, 0x0000e585,
+ /* 90 */ 0x0000e586, 0x0000e587, 0x0000e588, 0x0000e589,
+ /* 94 */ 0x0000e58a, 0x0000e58b, 0x0000e58c, 0x0000e58d,
+ /* 98 */ 0x0000e58e, 0x0000e58f, 0x0000e590, 0x0000e591,
+ /* 9c */ 0x0000e592, 0x0000e593, 0x0000e594, 0x0000e595,
+ /* a0 */ 0x0000e596, 0x0000e597, 0x0000e598, 0x0000e599,
+ /* a4 */ 0x0000e59a, 0x0000e59b, 0x0000e59c, 0x0000e59d,
+ /* a8 */ 0x0000e59e, 0x0000e59f, 0x0000f6ca, 0x0000e5a0,
+ /* ac */ 0x0000e640, 0x0000e641, 0x0000e642, 0x0000e643,
+ /* b0 */ 0x0000e644, 0x0000e645, 0x0000e646, 0x0000e647,
+ /* b4 */ 0x0000e648, 0x0000e649, 0x0000e64a, 0x0000e64b,
+ /* b8 */ 0x0000e64c, 0x0000e64d, 0x0000e64e, 0x0000e64f,
+ /* bc */ 0x0000e650, 0x0000e651, 0x0000e652, 0x0000e653,
+
+ /*** Three byte table, leaf: e98exx - offset 0x06515 ***/
+
+ /* 80 */ 0x0000e654, 0x0000e655, 0x0000e656, 0x0000e657,
+ /* 84 */ 0x0000e658, 0x0000e659, 0x0000e65a, 0x0000e65b,
+ /* 88 */ 0x0000e65c, 0x0000e65d, 0x0000e65e, 0x0000e65f,
+ /* 8c */ 0x0000e660, 0x0000e661, 0x0000e662, 0x0000f6cc,
+ /* 90 */ 0x0000e663, 0x0000e664, 0x0000e665, 0x0000e666,
+ /* 94 */ 0x0000e667, 0x0000e668, 0x0000e669, 0x0000e66a,
+ /* 98 */ 0x0000e66b, 0x0000e66c, 0x0000e66d, 0x0000e66e,
+ /* 9c */ 0x0000e66f, 0x0000e670, 0x0000e671, 0x0000e672,
+ /* a0 */ 0x0000e673, 0x0000e674, 0x0000e675, 0x0000e676,
+ /* a4 */ 0x0000e677, 0x0000e678, 0x0000e679, 0x0000e67a,
+ /* a8 */ 0x0000e67b, 0x0000e67c, 0x0000e67d, 0x0000e67e,
+ /* ac */ 0x0000e680, 0x0000e681, 0x0000e682, 0x0000e683,
+ /* b0 */ 0x0000e684, 0x0000e685, 0x0000e686, 0x0000e687,
+ /* b4 */ 0x0000e688, 0x0000e689, 0x0000e68a, 0x0000e68b,
+ /* b8 */ 0x0000e68c, 0x0000e68d, 0x0000e68e, 0x0000e68f,
+ /* bc */ 0x0000e690, 0x0000e691, 0x0000e692, 0x0000e693,
+
+ /*** Three byte table, leaf: e98fxx - offset 0x06555 ***/
+
+ /* 80 */ 0x0000e694, 0x0000e695, 0x0000e696, 0x0000e697,
+ /* 84 */ 0x0000e698, 0x0000e699, 0x0000e69a, 0x0000e69b,
+ /* 88 */ 0x0000e69c, 0x0000e69d, 0x0000f6cb, 0x0000e69e,
+ /* 8c */ 0x0000e69f, 0x0000e6a0, 0x0000e740, 0x0000e741,
+ /* 90 */ 0x0000e742, 0x0000e743, 0x0000e744, 0x0000e745,
+ /* 94 */ 0x0000e746, 0x0000e747, 0x0000f7e9, 0x0000e748,
+ /* 98 */ 0x0000e749, 0x0000e74a, 0x0000e74b, 0x0000e74c,
+ /* 9c */ 0x0000e74d, 0x0000e74e, 0x0000e74f, 0x0000e750,
+ /* a0 */ 0x0000e751, 0x0000e752, 0x0000e753, 0x0000e754,
+ /* a4 */ 0x0000e755, 0x0000e756, 0x0000e757, 0x0000e758,
+ /* a8 */ 0x0000e759, 0x0000e75a, 0x0000e75b, 0x0000e75c,
+ /* ac */ 0x0000e75d, 0x0000e75e, 0x0000e75f, 0x0000e760,
+ /* b0 */ 0x0000e761, 0x0000e762, 0x0000e763, 0x0000e764,
+ /* b4 */ 0x0000e765, 0x0000e766, 0x0000e767, 0x0000e768,
+ /* b8 */ 0x0000e769, 0x0000e76a, 0x0000e76b, 0x0000e76c,
+ /* bc */ 0x0000e76d, 0x0000e76e, 0x0000e76f, 0x0000e770,
+
+ /*** Three byte table, leaf: e990xx - offset 0x06595 ***/
+
+ /* 80 */ 0x0000e771, 0x0000e772, 0x0000e773, 0x0000e774,
+ /* 84 */ 0x0000e775, 0x0000e776, 0x0000e777, 0x0000e778,
+ /* 88 */ 0x0000e779, 0x0000e77a, 0x0000e77b, 0x0000e77c,
+ /* 8c */ 0x0000e77d, 0x0000e77e, 0x0000e780, 0x0000e781,
+ /* 90 */ 0x0000e782, 0x0000e783, 0x0000e784, 0x0000e785,
+ /* 94 */ 0x0000e786, 0x0000e787, 0x0000e788, 0x0000e789,
+ /* 98 */ 0x0000e78a, 0x0000e78b, 0x0000e78c, 0x0000e78d,
+ /* 9c */ 0x0000e78e, 0x0000e78f, 0x0000e790, 0x0000e791,
+ /* a0 */ 0x0000e792, 0x0000e793, 0x0000e794, 0x0000e795,
+ /* a4 */ 0x0000e796, 0x0000e797, 0x0000e798, 0x0000e799,
+ /* a8 */ 0x0000e79a, 0x0000e79b, 0x0000e79c, 0x0000e79d,
+ /* ac */ 0x0000e79e, 0x0000e79f, 0x0000e7a0, 0x0000e840,
+ /* b0 */ 0x0000e841, 0x0000e842, 0x0000e843, 0x0000e844,
+ /* b4 */ 0x0000e845, 0x0000e846, 0x0000e847, 0x0000e848,
+ /* b8 */ 0x0000e849, 0x0000e84a, 0x0000e84b, 0x0000e84c,
+ /* bc */ 0x0000e84d, 0x0000e84e, 0x0000f6cd, 0x0000e84f,
+
+ /*** Three byte table, leaf: e991xx - offset 0x065d5 ***/
+
+ /* 80 */ 0x0000e850, 0x0000e851, 0x0000e852, 0x0000e853,
+ /* 84 */ 0x0000e854, 0x0000e855, 0x0000e856, 0x0000e857,
+ /* 88 */ 0x0000e858, 0x0000e859, 0x0000e85a, 0x0000e85b,
+ /* 8c */ 0x0000e85c, 0x0000e85d, 0x0000e85e, 0x0000e85f,
+ /* 90 */ 0x0000e860, 0x0000e861, 0x0000e862, 0x0000e863,
+ /* 94 */ 0x0000e864, 0x0000e865, 0x0000e866, 0x0000e867,
+ /* 98 */ 0x0000e868, 0x0000e869, 0x0000e86a, 0x0000e86b,
+ /* 9c */ 0x0000e86c, 0x0000e86d, 0x0000e86e, 0x0000e86f,
+ /* a0 */ 0x0000e870, 0x0000e871, 0x0000e872, 0x0000e873,
+ /* a4 */ 0x0000e874, 0x0000e875, 0x0000e876, 0x0000e877,
+ /* a8 */ 0x0000e878, 0x0000e879, 0x0000e87a, 0x0000f6ce,
+ /* ac */ 0x0000e87b, 0x0000e87c, 0x0000e87d, 0x0000e87e,
+ /* b0 */ 0x0000e880, 0x0000e881, 0x0000e882, 0x0000e883,
+ /* b4 */ 0x0000e884, 0x0000e885, 0x0000e886, 0x0000e887,
+ /* b8 */ 0x0000e888, 0x0000e889, 0x0000e88a, 0x0000e88b,
+ /* bc */ 0x0000e88c, 0x0000e88d, 0x0000e88e, 0x0000e88f,
+
+ /*** Three byte table, leaf: e992xx - offset 0x06615 ***/
+
+ /* 80 */ 0x0000e890, 0x0000e891, 0x0000e892, 0x0000e893,
+ /* 84 */ 0x0000e894, 0x0000eec4, 0x0000eec5, 0x0000eec6,
+ /* 88 */ 0x0000d5eb, 0x0000b6a4, 0x0000eec8, 0x0000eec7,
+ /* 8c */ 0x0000eec9, 0x0000eeca, 0x0000c7a5, 0x0000eecb,
+ /* 90 */ 0x0000eecc, 0x0000e895, 0x0000b7b0, 0x0000b5f6,
+ /* 94 */ 0x0000eecd, 0x0000eecf, 0x0000e896, 0x0000eece,
+ /* 98 */ 0x0000e897, 0x0000b8c6, 0x0000eed0, 0x0000eed1,
+ /* 9c */ 0x0000eed2, 0x0000b6db, 0x0000b3ae, 0x0000d6d3,
+ /* a0 */ 0x0000c4c6, 0x0000b1b5, 0x0000b8d6, 0x0000eed3,
+ /* a4 */ 0x0000eed4, 0x0000d4bf, 0x0000c7d5, 0x0000befb,
+ /* a8 */ 0x0000ced9, 0x0000b9b3, 0x0000eed6, 0x0000eed5,
+ /* ac */ 0x0000eed8, 0x0000eed7, 0x0000c5a5, 0x0000eed9,
+ /* b0 */ 0x0000eeda, 0x0000c7ae, 0x0000eedb, 0x0000c7af,
+ /* b4 */ 0x0000eedc, 0x0000b2a7, 0x0000eedd, 0x0000eede,
+ /* b8 */ 0x0000eedf, 0x0000eee0, 0x0000eee1, 0x0000d7ea,
+ /* bc */ 0x0000eee2, 0x0000eee3, 0x0000bcd8, 0x0000eee4,
+
+ /*** Three byte table, leaf: e993xx - offset 0x06655 ***/
+
+ /* 80 */ 0x0000d3cb, 0x0000ccfa, 0x0000b2ac, 0x0000c1e5,
+ /* 84 */ 0x0000eee5, 0x0000c7a6, 0x0000c3ad, 0x0000e898,
+ /* 88 */ 0x0000eee6, 0x0000eee7, 0x0000eee8, 0x0000eee9,
+ /* 8c */ 0x0000eeea, 0x0000eeeb, 0x0000eeec, 0x0000e899,
+ /* 90 */ 0x0000eeed, 0x0000eeee, 0x0000eeef, 0x0000e89a,
+ /* 94 */ 0x0000e89b, 0x0000eef0, 0x0000eef1, 0x0000eef2,
+ /* 98 */ 0x0000eef4, 0x0000eef3, 0x0000e89c, 0x0000eef5,
+ /* 9c */ 0x0000cdad, 0x0000c2c1, 0x0000eef6, 0x0000eef7,
+ /* a0 */ 0x0000eef8, 0x0000d5a1, 0x0000eef9, 0x0000cfb3,
+ /* a4 */ 0x0000eefa, 0x0000eefb, 0x0000e89d, 0x0000eefc,
+ /* a8 */ 0x0000eefd, 0x0000efa1, 0x0000eefe, 0x0000efa2,
+ /* ac */ 0x0000b8f5, 0x0000c3fa, 0x0000efa3, 0x0000efa4,
+ /* b0 */ 0x0000bdc2, 0x0000d2bf, 0x0000b2f9, 0x0000efa5,
+ /* b4 */ 0x0000efa6, 0x0000efa7, 0x0000d2f8, 0x0000efa8,
+ /* b8 */ 0x0000d6fd, 0x0000efa9, 0x0000c6cc, 0x0000e89e,
+ /* bc */ 0x0000efaa, 0x0000efab, 0x0000c1b4, 0x0000efac,
+
+ /*** Three byte table, leaf: e994xx - offset 0x06695 ***/
+
+ /* 80 */ 0x0000cffa, 0x0000cbf8, 0x0000efae, 0x0000efad,
+ /* 84 */ 0x0000b3fa, 0x0000b9f8, 0x0000efaf, 0x0000efb0,
+ /* 88 */ 0x0000d0e2, 0x0000efb1, 0x0000efb2, 0x0000b7e6,
+ /* 8c */ 0x0000d0bf, 0x0000efb3, 0x0000efb4, 0x0000efb5,
+ /* 90 */ 0x0000c8f1, 0x0000cce0, 0x0000efb6, 0x0000efb7,
+ /* 94 */ 0x0000efb8, 0x0000efb9, 0x0000efba, 0x0000d5e0,
+ /* 98 */ 0x0000efbb, 0x0000b4ed, 0x0000c3aa, 0x0000efbc,
+ /* 9c */ 0x0000e89f, 0x0000efbd, 0x0000efbe, 0x0000efbf,
+ /* a0 */ 0x0000e8a0, 0x0000cefd, 0x0000efc0, 0x0000c2e0,
+ /* a4 */ 0x0000b4b8, 0x0000d7b6, 0x0000bdf5, 0x0000e940,
+ /* a8 */ 0x0000cfc7, 0x0000efc3, 0x0000efc1, 0x0000efc2,
+ /* ac */ 0x0000efc4, 0x0000b6a7, 0x0000bcfc, 0x0000bee2,
+ /* b0 */ 0x0000c3cc, 0x0000efc5, 0x0000efc6, 0x0000e941,
+ /* b4 */ 0x0000efc7, 0x0000efcf, 0x0000efc8, 0x0000efc9,
+ /* b8 */ 0x0000efca, 0x0000c7c2, 0x0000eff1, 0x0000b6cd,
+ /* bc */ 0x0000efcb, 0x0000e942, 0x0000efcc, 0x0000efcd,
+
+ /*** Three byte table, leaf: e995xx - offset 0x066d5 ***/
+
+ /* 80 */ 0x0000b6c6, 0x0000c3be, 0x0000efce, 0x0000e943,
+ /* 84 */ 0x0000efd0, 0x0000efd1, 0x0000efd2, 0x0000d5f2,
+ /* 88 */ 0x0000e944, 0x0000efd3, 0x0000c4f7, 0x0000e945,
+ /* 8c */ 0x0000efd4, 0x0000c4f8, 0x0000efd5, 0x0000efd6,
+ /* 90 */ 0x0000b8e4, 0x0000b0f7, 0x0000efd7, 0x0000efd8,
+ /* 94 */ 0x0000efd9, 0x0000e946, 0x0000efda, 0x0000efdb,
+ /* 98 */ 0x0000efdc, 0x0000efdd, 0x0000e947, 0x0000efde,
+ /* 9c */ 0x0000beb5, 0x0000efe1, 0x0000efdf, 0x0000efe0,
+ /* a0 */ 0x0000e948, 0x0000efe2, 0x0000efe3, 0x0000c1cd,
+ /* a4 */ 0x0000efe4, 0x0000efe5, 0x0000efe6, 0x0000efe7,
+ /* a8 */ 0x0000efe8, 0x0000efe9, 0x0000efea, 0x0000efeb,
+ /* ac */ 0x0000efec, 0x0000c0d8, 0x0000e949, 0x0000efed,
+ /* b0 */ 0x0000c1ad, 0x0000efee, 0x0000efef, 0x0000eff0,
+ /* b4 */ 0x0000e94a, 0x0000e94b, 0x0000cfe2, 0x0000e94c,
+ /* b8 */ 0x0000e94d, 0x0000e94e, 0x0000e94f, 0x0000e950,
+ /* bc */ 0x0000e951, 0x0000e952, 0x0000e953, 0x0000b3a4,
+
+ /*** Three byte table, leaf: e996xx - offset 0x06715 ***/
+
+ /* 80 */ 0x0000e954, 0x0000e955, 0x0000e956, 0x0000e957,
+ /* 84 */ 0x0000e958, 0x0000e959, 0x0000e95a, 0x0000e95b,
+ /* 88 */ 0x0000e95c, 0x0000e95d, 0x0000e95e, 0x0000e95f,
+ /* 8c */ 0x0000e960, 0x0000e961, 0x0000e962, 0x0000e963,
+ /* 90 */ 0x0000e964, 0x0000e965, 0x0000e966, 0x0000e967,
+ /* 94 */ 0x0000e968, 0x0000e969, 0x0000e96a, 0x0000e96b,
+ /* 98 */ 0x0000e96c, 0x0000e96d, 0x0000e96e, 0x0000e96f,
+ /* 9c */ 0x0000e970, 0x0000e971, 0x0000e972, 0x0000e973,
+ /* a0 */ 0x0000e974, 0x0000e975, 0x0000e976, 0x0000e977,
+ /* a4 */ 0x0000e978, 0x0000e979, 0x0000e97a, 0x0000e97b,
+ /* a8 */ 0x0000e97c, 0x0000e97d, 0x0000e97e, 0x0000e980,
+ /* ac */ 0x0000e981, 0x0000e982, 0x0000e983, 0x0000e984,
+ /* b0 */ 0x0000e985, 0x0000e986, 0x0000e987, 0x0000e988,
+ /* b4 */ 0x0000e989, 0x0000e98a, 0x0000e98b, 0x0000e98c,
+ /* b8 */ 0x0000e98d, 0x0000e98e, 0x0000e98f, 0x0000e990,
+ /* bc */ 0x0000e991, 0x0000e992, 0x0000e993, 0x0000e994,
+
+ /*** Three byte table, leaf: e997xx - offset 0x06755 ***/
+
+ /* 80 */ 0x0000e995, 0x0000e996, 0x0000e997, 0x0000e998,
+ /* 84 */ 0x0000e999, 0x0000e99a, 0x0000e99b, 0x0000e99c,
+ /* 88 */ 0x0000e99d, 0x0000e99e, 0x0000e99f, 0x0000e9a0,
+ /* 8c */ 0x0000ea40, 0x0000ea41, 0x0000ea42, 0x0000ea43,
+ /* 90 */ 0x0000ea44, 0x0000ea45, 0x0000ea46, 0x0000ea47,
+ /* 94 */ 0x0000ea48, 0x0000ea49, 0x0000ea4a, 0x0000ea4b,
+ /* 98 */ 0x0000ea4c, 0x0000ea4d, 0x0000ea4e, 0x0000ea4f,
+ /* 9c */ 0x0000ea50, 0x0000ea51, 0x0000ea52, 0x0000ea53,
+ /* a0 */ 0x0000ea54, 0x0000ea55, 0x0000ea56, 0x0000ea57,
+ /* a4 */ 0x0000ea58, 0x0000ea59, 0x0000ea5a, 0x0000ea5b,
+ /* a8 */ 0x0000c3c5, 0x0000e3c5, 0x0000c9c1, 0x0000e3c6,
+ /* ac */ 0x0000ea5c, 0x0000b1d5, 0x0000ceca, 0x0000b4b3,
+ /* b0 */ 0x0000c8f2, 0x0000e3c7, 0x0000cfd0, 0x0000e3c8,
+ /* b4 */ 0x0000bce4, 0x0000e3c9, 0x0000e3ca, 0x0000c3c6,
+ /* b8 */ 0x0000d5a2, 0x0000c4d6, 0x0000b9eb, 0x0000cec5,
+ /* bc */ 0x0000e3cb, 0x0000c3f6, 0x0000e3cc, 0x0000ea5d,
+
+ /*** Three byte table, leaf: e998xx - offset 0x06795 ***/
+
+ /* 80 */ 0x0000b7a7, 0x0000b8f3, 0x0000bad2, 0x0000e3cd,
+ /* 84 */ 0x0000e3ce, 0x0000d4c4, 0x0000e3cf, 0x0000ea5e,
+ /* 88 */ 0x0000e3d0, 0x0000d1cb, 0x0000e3d1, 0x0000e3d2,
+ /* 8c */ 0x0000e3d3, 0x0000e3d4, 0x0000d1d6, 0x0000e3d5,
+ /* 90 */ 0x0000b2fb, 0x0000c0bb, 0x0000e3d6, 0x0000ea5f,
+ /* 94 */ 0x0000c0ab, 0x0000e3d7, 0x0000e3d8, 0x0000e3d9,
+ /* 98 */ 0x0000ea60, 0x0000e3da, 0x0000e3db, 0x0000ea61,
+ /* 9c */ 0x0000b8b7, 0x0000dae2, 0x0000ea62, 0x0000b6d3,
+ /* a0 */ 0x0000ea63, 0x0000dae4, 0x0000dae3, 0x0000ea64,
+ /* a4 */ 0x0000ea65, 0x0000ea66, 0x0000ea67, 0x0000ea68,
+ /* a8 */ 0x0000ea69, 0x0000ea6a, 0x0000dae6, 0x0000ea6b,
+ /* ac */ 0x0000ea6c, 0x0000ea6d, 0x0000c8ee, 0x0000ea6e,
+ /* b0 */ 0x0000ea6f, 0x0000dae5, 0x0000b7c0, 0x0000d1f4,
+ /* b4 */ 0x0000d2f5, 0x0000d5f3, 0x0000bdd7, 0x0000ea70,
+ /* b8 */ 0x0000ea71, 0x0000ea72, 0x0000ea73, 0x0000d7e8,
+ /* bc */ 0x0000dae8, 0x0000dae7, 0x0000ea74, 0x0000b0a2,
+
+ /*** Three byte table, leaf: e999xx - offset 0x067d5 ***/
+
+ /* 80 */ 0x0000cdd3, 0x0000ea75, 0x0000dae9, 0x0000ea76,
+ /* 84 */ 0x0000b8bd, 0x0000bcca, 0x0000c2bd, 0x0000c2a4,
+ /* 88 */ 0x0000b3c2, 0x0000daea, 0x0000ea77, 0x0000c2aa,
+ /* 8c */ 0x0000c4b0, 0x0000bdb5, 0x0000ea78, 0x0000ea79,
+ /* 90 */ 0x0000cfde, 0x0000ea7a, 0x0000ea7b, 0x0000ea7c,
+ /* 94 */ 0x0000daeb, 0x0000c9c2, 0x0000ea7d, 0x0000ea7e,
+ /* 98 */ 0x0000ea80, 0x0000ea81, 0x0000ea82, 0x0000b1dd,
+ /* 9c */ 0x0000ea83, 0x0000ea84, 0x0000ea85, 0x0000daec,
+ /* a0 */ 0x0000ea86, 0x0000b6b8, 0x0000d4ba, 0x0000ea87,
+ /* a4 */ 0x0000b3fd, 0x0000ea88, 0x0000ea89, 0x0000daed,
+ /* a8 */ 0x0000d4c9, 0x0000cfd5, 0x0000c5e3, 0x0000ea8a,
+ /* ac */ 0x0000daee, 0x0000ea8b, 0x0000ea8c, 0x0000ea8d,
+ /* b0 */ 0x0000ea8e, 0x0000ea8f, 0x0000daef, 0x0000ea90,
+ /* b4 */ 0x0000daf0, 0x0000c1ea, 0x0000ccd5, 0x0000cfdd,
+ /* b8 */ 0x0000ea91, 0x0000ea92, 0x0000ea93, 0x0000ea94,
+ /* bc */ 0x0000ea95, 0x0000ea96, 0x0000ea97, 0x0000ea98,
+
+ /*** Three byte table, leaf: e99axx - offset 0x06815 ***/
+
+ /* 80 */ 0x0000ea99, 0x0000ea9a, 0x0000ea9b, 0x0000ea9c,
+ /* 84 */ 0x0000ea9d, 0x0000d3e7, 0x0000c2a1, 0x0000ea9e,
+ /* 88 */ 0x0000daf1, 0x0000ea9f, 0x0000eaa0, 0x0000cbe5,
+ /* 8c */ 0x0000eb40, 0x0000daf2, 0x0000eb41, 0x0000cbe6,
+ /* 90 */ 0x0000d2fe, 0x0000eb42, 0x0000eb43, 0x0000eb44,
+ /* 94 */ 0x0000b8f4, 0x0000eb45, 0x0000eb46, 0x0000daf3,
+ /* 98 */ 0x0000b0af, 0x0000cfb6, 0x0000eb47, 0x0000eb48,
+ /* 9c */ 0x0000d5cf, 0x0000eb49, 0x0000eb4a, 0x0000eb4b,
+ /* a0 */ 0x0000eb4c, 0x0000eb4d, 0x0000eb4e, 0x0000eb4f,
+ /* a4 */ 0x0000eb50, 0x0000eb51, 0x0000eb52, 0x0000cbed,
+ /* a8 */ 0x0000eb53, 0x0000eb54, 0x0000eb55, 0x0000eb56,
+ /* ac */ 0x0000eb57, 0x0000eb58, 0x0000eb59, 0x0000eb5a,
+ /* b0 */ 0x0000daf4, 0x0000eb5b, 0x0000eb5c, 0x0000e3c4,
+ /* b4 */ 0x0000eb5d, 0x0000eb5e, 0x0000c1a5, 0x0000eb5f,
+ /* b8 */ 0x0000eb60, 0x0000f6bf, 0x0000eb61, 0x0000eb62,
+ /* bc */ 0x0000f6c0, 0x0000f6c1, 0x0000c4d1, 0x0000eb63,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x06855 ***/
+
+ /* 80 */ 0x0000c8b8, 0x0000d1e3, 0x0000eb64, 0x0000eb65,
+ /* 84 */ 0x0000d0db, 0x0000d1c5, 0x0000bcaf, 0x0000b9cd,
+ /* 88 */ 0x0000eb66, 0x0000eff4, 0x0000eb67, 0x0000eb68,
+ /* 8c */ 0x0000b4c6, 0x0000d3ba, 0x0000f6c2, 0x0000b3fb,
+ /* 90 */ 0x0000eb69, 0x0000eb6a, 0x0000f6c3, 0x0000eb6b,
+ /* 94 */ 0x0000eb6c, 0x0000b5f1, 0x0000eb6d, 0x0000eb6e,
+ /* 98 */ 0x0000eb6f, 0x0000eb70, 0x0000eb71, 0x0000eb72,
+ /* 9c */ 0x0000eb73, 0x0000eb74, 0x0000eb75, 0x0000eb76,
+ /* a0 */ 0x0000f6c5, 0x0000eb77, 0x0000eb78, 0x0000eb79,
+ /* a4 */ 0x0000eb7a, 0x0000eb7b, 0x0000eb7c, 0x0000eb7d,
+ /* a8 */ 0x0000d3ea, 0x0000f6a7, 0x0000d1a9, 0x0000eb7e,
+ /* ac */ 0x0000eb80, 0x0000eb81, 0x0000eb82, 0x0000f6a9,
+ /* b0 */ 0x0000eb83, 0x0000eb84, 0x0000eb85, 0x0000f6a8,
+ /* b4 */ 0x0000eb86, 0x0000eb87, 0x0000c1e3, 0x0000c0d7,
+ /* b8 */ 0x0000eb88, 0x0000b1a2, 0x0000eb89, 0x0000eb8a,
+ /* bc */ 0x0000eb8b, 0x0000eb8c, 0x0000ceed, 0x0000eb8d,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x06895 ***/
+
+ /* 80 */ 0x0000d0e8, 0x0000f6ab, 0x0000eb8e, 0x0000eb8f,
+ /* 84 */ 0x0000cff6, 0x0000eb90, 0x0000f6aa, 0x0000d5f0,
+ /* 88 */ 0x0000f6ac, 0x0000c3b9, 0x0000eb91, 0x0000eb92,
+ /* 8c */ 0x0000eb93, 0x0000bbf4, 0x0000f6ae, 0x0000f6ad,
+ /* 90 */ 0x0000eb94, 0x0000eb95, 0x0000eb96, 0x0000c4de,
+ /* 94 */ 0x0000eb97, 0x0000eb98, 0x0000c1d8, 0x0000eb99,
+ /* 98 */ 0x0000eb9a, 0x0000eb9b, 0x0000eb9c, 0x0000eb9d,
+ /* 9c */ 0x0000cbaa, 0x0000eb9e, 0x0000cfbc, 0x0000eb9f,
+ /* a0 */ 0x0000eba0, 0x0000ec40, 0x0000ec41, 0x0000ec42,
+ /* a4 */ 0x0000ec43, 0x0000ec44, 0x0000ec45, 0x0000ec46,
+ /* a8 */ 0x0000ec47, 0x0000ec48, 0x0000f6af, 0x0000ec49,
+ /* ac */ 0x0000ec4a, 0x0000f6b0, 0x0000ec4b, 0x0000ec4c,
+ /* b0 */ 0x0000f6b1, 0x0000ec4d, 0x0000c2b6, 0x0000ec4e,
+ /* b4 */ 0x0000ec4f, 0x0000ec50, 0x0000ec51, 0x0000ec52,
+ /* b8 */ 0x0000b0d4, 0x0000c5f9, 0x0000ec53, 0x0000ec54,
+ /* bc */ 0x0000ec55, 0x0000ec56, 0x0000f6b2, 0x0000ec57,
+
+ /*** Three byte table, leaf: e99dxx - offset 0x068d5 ***/
+
+ /* 80 */ 0x0000ec58, 0x0000ec59, 0x0000ec5a, 0x0000ec5b,
+ /* 84 */ 0x0000ec5c, 0x0000ec5d, 0x0000ec5e, 0x0000ec5f,
+ /* 88 */ 0x0000ec60, 0x0000ec61, 0x0000ec62, 0x0000ec63,
+ /* 8c */ 0x0000ec64, 0x0000ec65, 0x0000ec66, 0x0000ec67,
+ /* 90 */ 0x0000ec68, 0x0000ec69, 0x0000c7e0, 0x0000f6a6,
+ /* 94 */ 0x0000ec6a, 0x0000ec6b, 0x0000beb8, 0x0000ec6c,
+ /* 98 */ 0x0000ec6d, 0x0000beb2, 0x0000ec6e, 0x0000b5e5,
+ /* 9c */ 0x0000ec6f, 0x0000ec70, 0x0000b7c7, 0x0000ec71,
+ /* a0 */ 0x0000bfbf, 0x0000c3d2, 0x0000c3e6, 0x0000ec72,
+ /* a4 */ 0x0000ec73, 0x0000d8cc, 0x0000ec74, 0x0000ec75,
+ /* a8 */ 0x0000ec76, 0x0000b8ef, 0x0000ec77, 0x0000ec78,
+ /* ac */ 0x0000ec79, 0x0000ec7a, 0x0000ec7b, 0x0000ec7c,
+ /* b0 */ 0x0000ec7d, 0x0000ec7e, 0x0000ec80, 0x0000bdf9,
+ /* b4 */ 0x0000d1a5, 0x0000ec81, 0x0000b0d0, 0x0000ec82,
+ /* b8 */ 0x0000ec83, 0x0000ec84, 0x0000ec85, 0x0000ec86,
+ /* bc */ 0x0000f7b0, 0x0000ec87, 0x0000ec88, 0x0000ec89,
+
+ /*** Three byte table, leaf: e99exx - offset 0x06915 ***/
+
+ /* 80 */ 0x0000ec8a, 0x0000ec8b, 0x0000ec8c, 0x0000ec8d,
+ /* 84 */ 0x0000ec8e, 0x0000f7b1, 0x0000ec8f, 0x0000ec90,
+ /* 88 */ 0x0000ec91, 0x0000ec92, 0x0000ec93, 0x0000d0ac,
+ /* 8c */ 0x0000ec94, 0x0000b0b0, 0x0000ec95, 0x0000ec96,
+ /* 90 */ 0x0000ec97, 0x0000f7b2, 0x0000f7b3, 0x0000ec98,
+ /* 94 */ 0x0000f7b4, 0x0000ec99, 0x0000ec9a, 0x0000ec9b,
+ /* 98 */ 0x0000c7ca, 0x0000ec9c, 0x0000ec9d, 0x0000ec9e,
+ /* 9c */ 0x0000ec9f, 0x0000eca0, 0x0000ed40, 0x0000ed41,
+ /* a0 */ 0x0000becf, 0x0000ed42, 0x0000ed43, 0x0000f7b7,
+ /* a4 */ 0x0000ed44, 0x0000ed45, 0x0000ed46, 0x0000ed47,
+ /* a8 */ 0x0000ed48, 0x0000ed49, 0x0000ed4a, 0x0000f7b6,
+ /* ac */ 0x0000ed4b, 0x0000b1de, 0x0000ed4c, 0x0000f7b5,
+ /* b0 */ 0x0000ed4d, 0x0000ed4e, 0x0000f7b8, 0x0000ed4f,
+ /* b4 */ 0x0000f7b9, 0x0000ed50, 0x0000ed51, 0x0000ed52,
+ /* b8 */ 0x0000ed53, 0x0000ed54, 0x0000ed55, 0x0000ed56,
+ /* bc */ 0x0000ed57, 0x0000ed58, 0x0000ed59, 0x0000ed5a,
+
+ /*** Three byte table, leaf: e99fxx - offset 0x06955 ***/
+
+ /* 80 */ 0x0000ed5b, 0x0000ed5c, 0x0000ed5d, 0x0000ed5e,
+ /* 84 */ 0x0000ed5f, 0x0000ed60, 0x0000ed61, 0x0000ed62,
+ /* 88 */ 0x0000ed63, 0x0000ed64, 0x0000ed65, 0x0000ed66,
+ /* 8c */ 0x0000ed67, 0x0000ed68, 0x0000ed69, 0x0000ed6a,
+ /* 90 */ 0x0000ed6b, 0x0000ed6c, 0x0000ed6d, 0x0000ed6e,
+ /* 94 */ 0x0000ed6f, 0x0000ed70, 0x0000ed71, 0x0000ed72,
+ /* 98 */ 0x0000ed73, 0x0000ed74, 0x0000ed75, 0x0000ed76,
+ /* 9c */ 0x0000ed77, 0x0000ed78, 0x0000ed79, 0x0000ed7a,
+ /* a0 */ 0x0000ed7b, 0x0000ed7c, 0x0000ed7d, 0x0000ed7e,
+ /* a4 */ 0x0000ed80, 0x0000ed81, 0x0000cea4, 0x0000c8cd,
+ /* a8 */ 0x0000ed82, 0x0000baab, 0x0000e8b8, 0x0000e8b9,
+ /* ac */ 0x0000e8ba, 0x0000bec2, 0x0000ed83, 0x0000ed84,
+ /* b0 */ 0x0000ed85, 0x0000ed86, 0x0000ed87, 0x0000d2f4,
+ /* b4 */ 0x0000ed88, 0x0000d4cf, 0x0000c9d8, 0x0000ed89,
+ /* b8 */ 0x0000ed8a, 0x0000ed8b, 0x0000ed8c, 0x0000ed8d,
+ /* bc */ 0x0000ed8e, 0x0000ed8f, 0x0000ed90, 0x0000ed91,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x06995 ***/
+
+ /* 80 */ 0x0000ed92, 0x0000ed93, 0x0000ed94, 0x0000ed95,
+ /* 84 */ 0x0000ed96, 0x0000ed97, 0x0000ed98, 0x0000ed99,
+ /* 88 */ 0x0000ed9a, 0x0000ed9b, 0x0000ed9c, 0x0000ed9d,
+ /* 8c */ 0x0000ed9e, 0x0000ed9f, 0x0000eda0, 0x0000ee40,
+ /* 90 */ 0x0000ee41, 0x0000ee42, 0x0000ee43, 0x0000ee44,
+ /* 94 */ 0x0000ee45, 0x0000ee46, 0x0000ee47, 0x0000ee48,
+ /* 98 */ 0x0000ee49, 0x0000ee4a, 0x0000ee4b, 0x0000ee4c,
+ /* 9c */ 0x0000ee4d, 0x0000ee4e, 0x0000ee4f, 0x0000ee50,
+ /* a0 */ 0x0000ee51, 0x0000ee52, 0x0000ee53, 0x0000ee54,
+ /* a4 */ 0x0000ee55, 0x0000ee56, 0x0000ee57, 0x0000ee58,
+ /* a8 */ 0x0000ee59, 0x0000ee5a, 0x0000ee5b, 0x0000ee5c,
+ /* ac */ 0x0000ee5d, 0x0000ee5e, 0x0000ee5f, 0x0000ee60,
+ /* b0 */ 0x0000ee61, 0x0000ee62, 0x0000ee63, 0x0000ee64,
+ /* b4 */ 0x0000ee65, 0x0000ee66, 0x0000ee67, 0x0000ee68,
+ /* b8 */ 0x0000ee69, 0x0000ee6a, 0x0000ee6b, 0x0000ee6c,
+ /* bc */ 0x0000ee6d, 0x0000ee6e, 0x0000ee6f, 0x0000ee70,
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x069d5 ***/
+
+ /* 80 */ 0x0000ee71, 0x0000ee72, 0x0000ee73, 0x0000ee74,
+ /* 84 */ 0x0000ee75, 0x0000ee76, 0x0000ee77, 0x0000ee78,
+ /* 88 */ 0x0000ee79, 0x0000ee7a, 0x0000ee7b, 0x0000ee7c,
+ /* 8c */ 0x0000ee7d, 0x0000ee7e, 0x0000ee80, 0x0000ee81,
+ /* 90 */ 0x0000ee82, 0x0000ee83, 0x0000ee84, 0x0000ee85,
+ /* 94 */ 0x0000ee86, 0x0000ee87, 0x0000ee88, 0x0000ee89,
+ /* 98 */ 0x0000ee8a, 0x0000ee8b, 0x0000ee8c, 0x0000ee8d,
+ /* 9c */ 0x0000ee8e, 0x0000ee8f, 0x0000ee90, 0x0000ee91,
+ /* a0 */ 0x0000ee92, 0x0000ee93, 0x0000ee94, 0x0000ee95,
+ /* a4 */ 0x0000ee96, 0x0000ee97, 0x0000ee98, 0x0000ee99,
+ /* a8 */ 0x0000ee9a, 0x0000ee9b, 0x0000ee9c, 0x0000ee9d,
+ /* ac */ 0x0000ee9e, 0x0000ee9f, 0x0000eea0, 0x0000ef40,
+ /* b0 */ 0x0000ef41, 0x0000ef42, 0x0000ef43, 0x0000ef44,
+ /* b4 */ 0x0000ef45, 0x0000d2b3, 0x0000b6a5, 0x0000c7ea,
+ /* b8 */ 0x0000f1fc, 0x0000cfee, 0x0000cbb3, 0x0000d0eb,
+ /* bc */ 0x0000e7ef, 0x0000cde7, 0x0000b9cb, 0x0000b6d9,
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x06a15 ***/
+
+ /* 80 */ 0x0000f1fd, 0x0000b0e4, 0x0000cbcc, 0x0000f1fe,
+ /* 84 */ 0x0000d4a4, 0x0000c2ad, 0x0000c1ec, 0x0000c6c4,
+ /* 88 */ 0x0000beb1, 0x0000f2a1, 0x0000bcd5, 0x0000ef46,
+ /* 8c */ 0x0000f2a2, 0x0000f2a3, 0x0000ef47, 0x0000f2a4,
+ /* 90 */ 0x0000d2c3, 0x0000c6b5, 0x0000ef48, 0x0000cdc7,
+ /* 94 */ 0x0000f2a5, 0x0000ef49, 0x0000d3b1, 0x0000bfc5,
+ /* 98 */ 0x0000cce2, 0x0000ef4a, 0x0000f2a6, 0x0000f2a7,
+ /* 9c */ 0x0000d1d5, 0x0000b6ee, 0x0000f2a8, 0x0000f2a9,
+ /* a0 */ 0x0000b5df, 0x0000f2aa, 0x0000f2ab, 0x0000ef4b,
+ /* a4 */ 0x0000b2fc, 0x0000f2ac, 0x0000f2ad, 0x0000c8a7,
+ /* a8 */ 0x0000ef4c, 0x0000ef4d, 0x0000ef4e, 0x0000ef4f,
+ /* ac */ 0x0000ef50, 0x0000ef51, 0x0000ef52, 0x0000ef53,
+ /* b0 */ 0x0000ef54, 0x0000ef55, 0x0000ef56, 0x0000ef57,
+ /* b4 */ 0x0000ef58, 0x0000ef59, 0x0000ef5a, 0x0000ef5b,
+ /* b8 */ 0x0000ef5c, 0x0000ef5d, 0x0000ef5e, 0x0000ef5f,
+ /* bc */ 0x0000ef60, 0x0000ef61, 0x0000ef62, 0x0000ef63,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x06a55 ***/
+
+ /* 80 */ 0x0000ef64, 0x0000ef65, 0x0000ef66, 0x0000ef67,
+ /* 84 */ 0x0000ef68, 0x0000ef69, 0x0000ef6a, 0x0000ef6b,
+ /* 88 */ 0x0000ef6c, 0x0000ef6d, 0x0000ef6e, 0x0000ef6f,
+ /* 8c */ 0x0000ef70, 0x0000ef71, 0x0000b7e7, 0x0000ef72,
+ /* 90 */ 0x0000ef73, 0x0000eca9, 0x0000ecaa, 0x0000ecab,
+ /* 94 */ 0x0000ef74, 0x0000ecac, 0x0000ef75, 0x0000ef76,
+ /* 98 */ 0x0000c6ae, 0x0000ecad, 0x0000ecae, 0x0000ef77,
+ /* 9c */ 0x0000ef78, 0x0000ef79, 0x0000b7c9, 0x0000cab3,
+ /* a0 */ 0x0000ef7a, 0x0000ef7b, 0x0000ef7c, 0x0000ef7d,
+ /* a4 */ 0x0000ef7e, 0x0000ef80, 0x0000ef81, 0x0000e2b8,
+ /* a8 */ 0x0000f7cf, 0x0000ef82, 0x0000ef83, 0x0000ef84,
+ /* ac */ 0x0000ef85, 0x0000ef86, 0x0000ef87, 0x0000ef88,
+ /* b0 */ 0x0000ef89, 0x0000ef8a, 0x0000ef8b, 0x0000ef8c,
+ /* b4 */ 0x0000ef8d, 0x0000ef8e, 0x0000ef8f, 0x0000ef90,
+ /* b8 */ 0x0000ef91, 0x0000ef92, 0x0000ef93, 0x0000ef94,
+ /* bc */ 0x0000ef95, 0x0000ef96, 0x0000ef97, 0x0000ef98,
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x06a95 ***/
+
+ /* 80 */ 0x0000ef99, 0x0000ef9a, 0x0000ef9b, 0x0000ef9c,
+ /* 84 */ 0x0000ef9d, 0x0000ef9e, 0x0000ef9f, 0x0000efa0,
+ /* 88 */ 0x0000f040, 0x0000f041, 0x0000f042, 0x0000f043,
+ /* 8c */ 0x0000f044, 0x0000f7d0, 0x0000f045, 0x0000f046,
+ /* 90 */ 0x0000b2cd, 0x0000f047, 0x0000f048, 0x0000f049,
+ /* 94 */ 0x0000f04a, 0x0000f04b, 0x0000f04c, 0x0000f04d,
+ /* 98 */ 0x0000f04e, 0x0000f04f, 0x0000f050, 0x0000f051,
+ /* 9c */ 0x0000f052, 0x0000f053, 0x0000f054, 0x0000f055,
+ /* a0 */ 0x0000f056, 0x0000f057, 0x0000f058, 0x0000f059,
+ /* a4 */ 0x0000f05a, 0x0000f05b, 0x0000f05c, 0x0000f05d,
+ /* a8 */ 0x0000f05e, 0x0000f05f, 0x0000f060, 0x0000f061,
+ /* ac */ 0x0000f062, 0x0000f063, 0x0000f7d1, 0x0000f064,
+ /* b0 */ 0x0000f065, 0x0000f066, 0x0000f067, 0x0000f068,
+ /* b4 */ 0x0000f069, 0x0000f06a, 0x0000f06b, 0x0000f06c,
+ /* b8 */ 0x0000f06d, 0x0000f06e, 0x0000f06f, 0x0000f070,
+ /* bc */ 0x0000f071, 0x0000f072, 0x0000f073, 0x0000f074,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x06ad5 ***/
+
+ /* 80 */ 0x0000f075, 0x0000f076, 0x0000f077, 0x0000f078,
+ /* 84 */ 0x0000f079, 0x0000f07a, 0x0000f07b, 0x0000f07c,
+ /* 88 */ 0x0000f07d, 0x0000f07e, 0x0000f080, 0x0000f081,
+ /* 8c */ 0x0000f082, 0x0000f083, 0x0000f084, 0x0000f085,
+ /* 90 */ 0x0000f086, 0x0000f087, 0x0000f088, 0x0000f089,
+ /* 94 */ 0x0000f7d3, 0x0000f7d2, 0x0000f08a, 0x0000f08b,
+ /* 98 */ 0x0000f08c, 0x0000f08d, 0x0000f08e, 0x0000f08f,
+ /* 9c */ 0x0000f090, 0x0000f091, 0x0000f092, 0x0000f093,
+ /* a0 */ 0x0000f094, 0x0000f095, 0x0000f096, 0x0000e2bb,
+ /* a4 */ 0x0000f097, 0x0000bca2, 0x0000f098, 0x0000e2bc,
+ /* a8 */ 0x0000e2bd, 0x0000e2be, 0x0000e2bf, 0x0000e2c0,
+ /* ac */ 0x0000e2c1, 0x0000b7b9, 0x0000d2fb, 0x0000bda4,
+ /* b0 */ 0x0000cace, 0x0000b1a5, 0x0000cbc7, 0x0000f099,
+ /* b4 */ 0x0000e2c2, 0x0000b6fc, 0x0000c8c4, 0x0000e2c3,
+ /* b8 */ 0x0000f09a, 0x0000f09b, 0x0000bdc8, 0x0000f09c,
+ /* bc */ 0x0000b1fd, 0x0000e2c4, 0x0000f09d, 0x0000b6f6,
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x06b15 ***/
+
+ /* 80 */ 0x0000e2c5, 0x0000c4d9, 0x0000f09e, 0x0000f09f,
+ /* 84 */ 0x0000e2c6, 0x0000cfda, 0x0000b9dd, 0x0000e2c7,
+ /* 88 */ 0x0000c0a1, 0x0000f0a0, 0x0000e2c8, 0x0000b2f6,
+ /* 8c */ 0x0000f140, 0x0000e2c9, 0x0000f141, 0x0000c1f3,
+ /* 90 */ 0x0000e2ca, 0x0000e2cb, 0x0000c2f8, 0x0000e2cc,
+ /* 94 */ 0x0000e2cd, 0x0000e2ce, 0x0000cad7, 0x0000d8b8,
+ /* 98 */ 0x0000d9e5, 0x0000cfe3, 0x0000f142, 0x0000f143,
+ /* 9c */ 0x0000f144, 0x0000f145, 0x0000f146, 0x0000f147,
+ /* a0 */ 0x0000f148, 0x0000f149, 0x0000f14a, 0x0000f14b,
+ /* a4 */ 0x0000f14c, 0x0000f0a5, 0x0000f14d, 0x0000f14e,
+ /* a8 */ 0x0000dcb0, 0x0000f14f, 0x0000f150, 0x0000f151,
+ /* ac */ 0x0000f152, 0x0000f153, 0x0000f154, 0x0000f155,
+ /* b0 */ 0x0000f156, 0x0000f157, 0x0000f158, 0x0000f159,
+ /* b4 */ 0x0000f15a, 0x0000f15b, 0x0000f15c, 0x0000f15d,
+ /* b8 */ 0x0000f15e, 0x0000f15f, 0x0000f160, 0x0000f161,
+ /* bc */ 0x0000f162, 0x0000f163, 0x0000f164, 0x0000f165,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x06b55 ***/
+
+ /* 80 */ 0x0000f166, 0x0000f167, 0x0000f168, 0x0000f169,
+ /* 84 */ 0x0000f16a, 0x0000f16b, 0x0000f16c, 0x0000f16d,
+ /* 88 */ 0x0000f16e, 0x0000f16f, 0x0000f170, 0x0000f171,
+ /* 8c */ 0x0000f172, 0x0000f173, 0x0000f174, 0x0000f175,
+ /* 90 */ 0x0000f176, 0x0000f177, 0x0000f178, 0x0000f179,
+ /* 94 */ 0x0000f17a, 0x0000f17b, 0x0000f17c, 0x0000f17d,
+ /* 98 */ 0x0000f17e, 0x0000f180, 0x0000f181, 0x0000f182,
+ /* 9c */ 0x0000f183, 0x0000f184, 0x0000f185, 0x0000f186,
+ /* a0 */ 0x0000f187, 0x0000f188, 0x0000f189, 0x0000f18a,
+ /* a4 */ 0x0000f18b, 0x0000f18c, 0x0000f18d, 0x0000f18e,
+ /* a8 */ 0x0000f18f, 0x0000f190, 0x0000f191, 0x0000f192,
+ /* ac */ 0x0000f193, 0x0000f194, 0x0000f195, 0x0000f196,
+ /* b0 */ 0x0000f197, 0x0000f198, 0x0000f199, 0x0000f19a,
+ /* b4 */ 0x0000f19b, 0x0000f19c, 0x0000f19d, 0x0000f19e,
+ /* b8 */ 0x0000f19f, 0x0000f1a0, 0x0000f240, 0x0000f241,
+ /* bc */ 0x0000f242, 0x0000f243, 0x0000f244, 0x0000f245,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x06b95 ***/
+
+ /* 80 */ 0x0000f246, 0x0000f247, 0x0000f248, 0x0000f249,
+ /* 84 */ 0x0000f24a, 0x0000f24b, 0x0000f24c, 0x0000f24d,
+ /* 88 */ 0x0000f24e, 0x0000f24f, 0x0000f250, 0x0000f251,
+ /* 8c */ 0x0000f252, 0x0000f253, 0x0000f254, 0x0000f255,
+ /* 90 */ 0x0000f256, 0x0000f257, 0x0000f258, 0x0000f259,
+ /* 94 */ 0x0000f25a, 0x0000f25b, 0x0000f25c, 0x0000f25d,
+ /* 98 */ 0x0000f25e, 0x0000f25f, 0x0000f260, 0x0000f261,
+ /* 9c */ 0x0000f262, 0x0000f263, 0x0000f264, 0x0000f265,
+ /* a0 */ 0x0000f266, 0x0000f267, 0x0000f268, 0x0000f269,
+ /* a4 */ 0x0000f26a, 0x0000f26b, 0x0000f26c, 0x0000f26d,
+ /* a8 */ 0x0000f26e, 0x0000f26f, 0x0000f270, 0x0000f271,
+ /* ac */ 0x0000f272, 0x0000f273, 0x0000f274, 0x0000f275,
+ /* b0 */ 0x0000f276, 0x0000f277, 0x0000f278, 0x0000f279,
+ /* b4 */ 0x0000f27a, 0x0000f27b, 0x0000f27c, 0x0000f27d,
+ /* b8 */ 0x0000f27e, 0x0000f280, 0x0000f281, 0x0000f282,
+ /* bc */ 0x0000f283, 0x0000f284, 0x0000f285, 0x0000f286,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x06bd5 ***/
+
+ /* 80 */ 0x0000f287, 0x0000f288, 0x0000f289, 0x0000f28a,
+ /* 84 */ 0x0000f28b, 0x0000f28c, 0x0000f28d, 0x0000f28e,
+ /* 88 */ 0x0000f28f, 0x0000f290, 0x0000f291, 0x0000f292,
+ /* 8c */ 0x0000f293, 0x0000f294, 0x0000f295, 0x0000f296,
+ /* 90 */ 0x0000f297, 0x0000f298, 0x0000f299, 0x0000f29a,
+ /* 94 */ 0x0000f29b, 0x0000f29c, 0x0000f29d, 0x0000f29e,
+ /* 98 */ 0x0000f29f, 0x0000f2a0, 0x0000f340, 0x0000f341,
+ /* 9c */ 0x0000f342, 0x0000f343, 0x0000f344, 0x0000f345,
+ /* a0 */ 0x0000f346, 0x0000f347, 0x0000f348, 0x0000f349,
+ /* a4 */ 0x0000f34a, 0x0000f34b, 0x0000f34c, 0x0000f34d,
+ /* a8 */ 0x0000f34e, 0x0000f34f, 0x0000f350, 0x0000f351,
+ /* ac */ 0x0000c2ed, 0x0000d4a6, 0x0000cdd4, 0x0000d1b1,
+ /* b0 */ 0x0000b3db, 0x0000c7fd, 0x0000f352, 0x0000b2b5,
+ /* b4 */ 0x0000c2bf, 0x0000e6e0, 0x0000cabb, 0x0000e6e1,
+ /* b8 */ 0x0000e6e2, 0x0000bed4, 0x0000e6e3, 0x0000d7a4,
+ /* bc */ 0x0000cdd5, 0x0000e6e5, 0x0000bcdd, 0x0000e6e4,
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x06c15 ***/
+
+ /* 80 */ 0x0000e6e6, 0x0000e6e7, 0x0000c2ee, 0x0000f353,
+ /* 84 */ 0x0000bdbe, 0x0000e6e8, 0x0000c2e6, 0x0000baa7,
+ /* 88 */ 0x0000e6e9, 0x0000f354, 0x0000e6ea, 0x0000b3d2,
+ /* 8c */ 0x0000d1e9, 0x0000f355, 0x0000f356, 0x0000bfa5,
+ /* 90 */ 0x0000e6eb, 0x0000c6ef, 0x0000e6ec, 0x0000e6ed,
+ /* 94 */ 0x0000f357, 0x0000f358, 0x0000e6ee, 0x0000c6ad,
+ /* 98 */ 0x0000e6ef, 0x0000f359, 0x0000c9a7, 0x0000e6f0,
+ /* 9c */ 0x0000e6f1, 0x0000e6f2, 0x0000e5b9, 0x0000e6f3,
+ /* a0 */ 0x0000e6f4, 0x0000c2e2, 0x0000e6f5, 0x0000e6f6,
+ /* a4 */ 0x0000d6e8, 0x0000e6f7, 0x0000f35a, 0x0000e6f8,
+ /* a8 */ 0x0000b9c7, 0x0000f35b, 0x0000f35c, 0x0000f35d,
+ /* ac */ 0x0000f35e, 0x0000f35f, 0x0000f360, 0x0000f361,
+ /* b0 */ 0x0000f7bb, 0x0000f7ba, 0x0000f362, 0x0000f363,
+ /* b4 */ 0x0000f364, 0x0000f365, 0x0000f7be, 0x0000f7bc,
+ /* b8 */ 0x0000baa1, 0x0000f366, 0x0000f7bf, 0x0000f367,
+ /* bc */ 0x0000f7c0, 0x0000f368, 0x0000f369, 0x0000f36a,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x06c55 ***/
+
+ /* 80 */ 0x0000f7c2, 0x0000f7c1, 0x0000f7c4, 0x0000f36b,
+ /* 84 */ 0x0000f36c, 0x0000f7c3, 0x0000f36d, 0x0000f36e,
+ /* 88 */ 0x0000f36f, 0x0000f370, 0x0000f371, 0x0000f7c5,
+ /* 8c */ 0x0000f7c6, 0x0000f372, 0x0000f373, 0x0000f374,
+ /* 90 */ 0x0000f375, 0x0000f7c7, 0x0000f376, 0x0000cbe8,
+ /* 94 */ 0x0000f377, 0x0000f378, 0x0000f379, 0x0000f37a,
+ /* 98 */ 0x0000b8df, 0x0000f37b, 0x0000f37c, 0x0000f37d,
+ /* 9c */ 0x0000f37e, 0x0000f380, 0x0000f381, 0x0000f7d4,
+ /* a0 */ 0x0000f382, 0x0000f7d5, 0x0000f383, 0x0000f384,
+ /* a4 */ 0x0000f385, 0x0000f386, 0x0000f7d6, 0x0000f387,
+ /* a8 */ 0x0000f388, 0x0000f389, 0x0000f38a, 0x0000f7d8,
+ /* ac */ 0x0000f38b, 0x0000f7da, 0x0000f38c, 0x0000f7d7,
+ /* b0 */ 0x0000f38d, 0x0000f38e, 0x0000f38f, 0x0000f390,
+ /* b4 */ 0x0000f391, 0x0000f392, 0x0000f393, 0x0000f394,
+ /* b8 */ 0x0000f395, 0x0000f7db, 0x0000f396, 0x0000f7d9,
+ /* bc */ 0x0000f397, 0x0000f398, 0x0000f399, 0x0000f39a,
+
+ /*** Three byte table, leaf: e9acxx - offset 0x06c95 ***/
+
+ /* 80 */ 0x0000f39b, 0x0000f39c, 0x0000f39d, 0x0000d7d7,
+ /* 84 */ 0x0000f39e, 0x0000f39f, 0x0000f3a0, 0x0000f440,
+ /* 88 */ 0x0000f7dc, 0x0000f441, 0x0000f442, 0x0000f443,
+ /* 8c */ 0x0000f444, 0x0000f445, 0x0000f446, 0x0000f7dd,
+ /* 90 */ 0x0000f447, 0x0000f448, 0x0000f449, 0x0000f7de,
+ /* 94 */ 0x0000f44a, 0x0000f44b, 0x0000f44c, 0x0000f44d,
+ /* 98 */ 0x0000f44e, 0x0000f44f, 0x0000f450, 0x0000f451,
+ /* 9c */ 0x0000f452, 0x0000f453, 0x0000f454, 0x0000f7df,
+ /* a0 */ 0x0000f455, 0x0000f456, 0x0000f457, 0x0000f7e0,
+ /* a4 */ 0x0000f458, 0x0000f459, 0x0000f45a, 0x0000f45b,
+ /* a8 */ 0x0000f45c, 0x0000f45d, 0x0000f45e, 0x0000f45f,
+ /* ac */ 0x0000f460, 0x0000f461, 0x0000f462, 0x0000dbcb,
+ /* b0 */ 0x0000f463, 0x0000f464, 0x0000d8aa, 0x0000f465,
+ /* b4 */ 0x0000f466, 0x0000f467, 0x0000f468, 0x0000f469,
+ /* b8 */ 0x0000f46a, 0x0000f46b, 0x0000f46c, 0x0000e5f7,
+ /* bc */ 0x0000b9ed, 0x0000f46d, 0x0000f46e, 0x0000f46f,
+
+ /*** Three byte table, leaf: e9adxx - offset 0x06cd5 ***/
+
+ /* 80 */ 0x0000f470, 0x0000bffd, 0x0000bbea, 0x0000f7c9,
+ /* 84 */ 0x0000c6c7, 0x0000f7c8, 0x0000f471, 0x0000f7ca,
+ /* 88 */ 0x0000f7cc, 0x0000f7cb, 0x0000f472, 0x0000f473,
+ /* 8c */ 0x0000f474, 0x0000f7cd, 0x0000f475, 0x0000ceba,
+ /* 90 */ 0x0000f476, 0x0000f7ce, 0x0000f477, 0x0000f478,
+ /* 94 */ 0x0000c4a7, 0x0000f479, 0x0000f47a, 0x0000f47b,
+ /* 98 */ 0x0000f47c, 0x0000f47d, 0x0000f47e, 0x0000f480,
+ /* 9c */ 0x0000f481, 0x0000f482, 0x0000f483, 0x0000f484,
+ /* a0 */ 0x0000f485, 0x0000f486, 0x0000f487, 0x0000f488,
+ /* a4 */ 0x0000f489, 0x0000f48a, 0x0000f48b, 0x0000f48c,
+ /* a8 */ 0x0000f48d, 0x0000f48e, 0x0000f48f, 0x0000f490,
+ /* ac */ 0x0000f491, 0x0000f492, 0x0000f493, 0x0000f494,
+ /* b0 */ 0x0000f495, 0x0000f496, 0x0000f497, 0x0000f498,
+ /* b4 */ 0x0000f499, 0x0000f49a, 0x0000f49b, 0x0000f49c,
+ /* b8 */ 0x0000f49d, 0x0000f49e, 0x0000f49f, 0x0000f4a0,
+ /* bc */ 0x0000f540, 0x0000f541, 0x0000f542, 0x0000f543,
+
+ /*** Three byte table, leaf: e9aexx - offset 0x06d15 ***/
+
+ /* 80 */ 0x0000f544, 0x0000f545, 0x0000f546, 0x0000f547,
+ /* 84 */ 0x0000f548, 0x0000f549, 0x0000f54a, 0x0000f54b,
+ /* 88 */ 0x0000f54c, 0x0000f54d, 0x0000f54e, 0x0000f54f,
+ /* 8c */ 0x0000f550, 0x0000f551, 0x0000f552, 0x0000f553,
+ /* 90 */ 0x0000f554, 0x0000f555, 0x0000f556, 0x0000f557,
+ /* 94 */ 0x0000f558, 0x0000f559, 0x0000f55a, 0x0000f55b,
+ /* 98 */ 0x0000f55c, 0x0000f55d, 0x0000f55e, 0x0000f55f,
+ /* 9c */ 0x0000f560, 0x0000f561, 0x0000f562, 0x0000f563,
+ /* a0 */ 0x0000f564, 0x0000f565, 0x0000f566, 0x0000f567,
+ /* a4 */ 0x0000f568, 0x0000f569, 0x0000f56a, 0x0000f56b,
+ /* a8 */ 0x0000f56c, 0x0000f56d, 0x0000f56e, 0x0000f56f,
+ /* ac */ 0x0000f570, 0x0000f571, 0x0000f572, 0x0000f573,
+ /* b0 */ 0x0000f574, 0x0000f575, 0x0000f576, 0x0000f577,
+ /* b4 */ 0x0000f578, 0x0000f579, 0x0000f57a, 0x0000f57b,
+ /* b8 */ 0x0000f57c, 0x0000f57d, 0x0000f57e, 0x0000f580,
+ /* bc */ 0x0000f581, 0x0000f582, 0x0000f583, 0x0000f584,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x06d55 ***/
+
+ /* 80 */ 0x0000f585, 0x0000f586, 0x0000f587, 0x0000f588,
+ /* 84 */ 0x0000f589, 0x0000f58a, 0x0000f58b, 0x0000f58c,
+ /* 88 */ 0x0000f58d, 0x0000f58e, 0x0000f58f, 0x0000f590,
+ /* 8c */ 0x0000f591, 0x0000f592, 0x0000f593, 0x0000f594,
+ /* 90 */ 0x0000f595, 0x0000f596, 0x0000f597, 0x0000f598,
+ /* 94 */ 0x0000f599, 0x0000f59a, 0x0000f59b, 0x0000f59c,
+ /* 98 */ 0x0000f59d, 0x0000f59e, 0x0000f59f, 0x0000f5a0,
+ /* 9c */ 0x0000f640, 0x0000f641, 0x0000f642, 0x0000f643,
+ /* a0 */ 0x0000f644, 0x0000f645, 0x0000f646, 0x0000f647,
+ /* a4 */ 0x0000f648, 0x0000f649, 0x0000f64a, 0x0000f64b,
+ /* a8 */ 0x0000f64c, 0x0000f64d, 0x0000f64e, 0x0000f64f,
+ /* ac */ 0x0000f650, 0x0000f651, 0x0000f652, 0x0000f653,
+ /* b0 */ 0x0000f654, 0x0000f655, 0x0000f656, 0x0000f657,
+ /* b4 */ 0x0000f658, 0x0000f659, 0x0000f65a, 0x0000f65b,
+ /* b8 */ 0x0000f65c, 0x0000f65d, 0x0000f65e, 0x0000f65f,
+ /* bc */ 0x0000f660, 0x0000f661, 0x0000f662, 0x0000f663,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x06d95 ***/
+
+ /* 80 */ 0x0000f664, 0x0000f665, 0x0000f666, 0x0000f667,
+ /* 84 */ 0x0000f668, 0x0000f669, 0x0000f66a, 0x0000f66b,
+ /* 88 */ 0x0000f66c, 0x0000f66d, 0x0000f66e, 0x0000f66f,
+ /* 8c */ 0x0000f670, 0x0000f671, 0x0000f672, 0x0000f673,
+ /* 90 */ 0x0000f674, 0x0000f675, 0x0000f676, 0x0000f677,
+ /* 94 */ 0x0000f678, 0x0000f679, 0x0000f67a, 0x0000f67b,
+ /* 98 */ 0x0000f67c, 0x0000f67d, 0x0000f67e, 0x0000f680,
+ /* 9c */ 0x0000f681, 0x0000f682, 0x0000f683, 0x0000f684,
+ /* a0 */ 0x0000f685, 0x0000f686, 0x0000f687, 0x0000f688,
+ /* a4 */ 0x0000f689, 0x0000f68a, 0x0000f68b, 0x0000f68c,
+ /* a8 */ 0x0000f68d, 0x0000f68e, 0x0000f68f, 0x0000f690,
+ /* ac */ 0x0000f691, 0x0000f692, 0x0000f693, 0x0000f694,
+ /* b0 */ 0x0000f695, 0x0000f696, 0x0000f697, 0x0000f698,
+ /* b4 */ 0x0000f699, 0x0000f69a, 0x0000f69b, 0x0000f69c,
+ /* b8 */ 0x0000f69d, 0x0000f69e, 0x0000f69f, 0x0000f6a0,
+ /* bc */ 0x0000f740, 0x0000f741, 0x0000f742, 0x0000f743,
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x06dd5 ***/
+
+ /* 80 */ 0x0000f744, 0x0000f745, 0x0000f746, 0x0000f747,
+ /* 84 */ 0x0000f748, 0x0000f749, 0x0000f74a, 0x0000f74b,
+ /* 88 */ 0x0000f74c, 0x0000f74d, 0x0000f74e, 0x0000f74f,
+ /* 8c */ 0x0000f750, 0x0000f751, 0x0000f752, 0x0000f753,
+ /* 90 */ 0x0000f754, 0x0000f755, 0x0000f756, 0x0000f757,
+ /* 94 */ 0x0000f758, 0x0000f759, 0x0000f75a, 0x0000f75b,
+ /* 98 */ 0x0000f75c, 0x0000f75d, 0x0000f75e, 0x0000f75f,
+ /* 9c */ 0x0000f760, 0x0000f761, 0x0000f762, 0x0000f763,
+ /* a0 */ 0x0000f764, 0x0000f765, 0x0000f766, 0x0000f767,
+ /* a4 */ 0x0000f768, 0x0000f769, 0x0000f76a, 0x0000f76b,
+ /* a8 */ 0x0000f76c, 0x0000f76d, 0x0000f76e, 0x0000f76f,
+ /* ac */ 0x0000f770, 0x0000f771, 0x0000f772, 0x0000f773,
+ /* b0 */ 0x0000f774, 0x0000f775, 0x0000f776, 0x0000f777,
+ /* b4 */ 0x0000f778, 0x0000f779, 0x0000f77a, 0x0000f77b,
+ /* b8 */ 0x0000f77c, 0x0000f77d, 0x0000f77e, 0x0000f780,
+ /* bc */ 0x0000d3e3, 0x0000f781, 0x0000f782, 0x0000f6cf,
+
+ /*** Three byte table, leaf: e9b2xx - offset 0x06e15 ***/
+
+ /* 80 */ 0x0000f783, 0x0000c2b3, 0x0000f6d0, 0x0000f784,
+ /* 84 */ 0x0000f785, 0x0000f6d1, 0x0000f6d2, 0x0000f6d3,
+ /* 88 */ 0x0000f6d4, 0x0000f786, 0x0000f787, 0x0000f6d6,
+ /* 8c */ 0x0000f788, 0x0000b1ab, 0x0000f6d7, 0x0000f789,
+ /* 90 */ 0x0000f6d8, 0x0000f6d9, 0x0000f6da, 0x0000f78a,
+ /* 94 */ 0x0000f6db, 0x0000f6dc, 0x0000f78b, 0x0000f78c,
+ /* 98 */ 0x0000f78d, 0x0000f78e, 0x0000f6dd, 0x0000f6de,
+ /* 9c */ 0x0000cfca, 0x0000f78f, 0x0000f6df, 0x0000f6e0,
+ /* a0 */ 0x0000f6e1, 0x0000f6e2, 0x0000f6e3, 0x0000f6e4,
+ /* a4 */ 0x0000c0f0, 0x0000f6e5, 0x0000f6e6, 0x0000f6e7,
+ /* a8 */ 0x0000f6e8, 0x0000f6e9, 0x0000f790, 0x0000f6ea,
+ /* ac */ 0x0000f791, 0x0000f6eb, 0x0000f6ec, 0x0000f792,
+ /* b0 */ 0x0000f6ed, 0x0000f6ee, 0x0000f6ef, 0x0000f6f0,
+ /* b4 */ 0x0000f6f1, 0x0000f6f2, 0x0000f6f3, 0x0000f6f4,
+ /* b8 */ 0x0000bea8, 0x0000f793, 0x0000f6f5, 0x0000f6f6,
+ /* bc */ 0x0000f6f7, 0x0000f6f8, 0x0000f794, 0x0000f795,
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x06e55 ***/
+
+ /* 80 */ 0x0000f796, 0x0000f797, 0x0000f798, 0x0000c8fa,
+ /* 84 */ 0x0000f6f9, 0x0000f6fa, 0x0000f6fb, 0x0000f6fc,
+ /* 88 */ 0x0000f799, 0x0000f79a, 0x0000f6fd, 0x0000f6fe,
+ /* 8c */ 0x0000f7a1, 0x0000f7a2, 0x0000f7a3, 0x0000f7a4,
+ /* 90 */ 0x0000f7a5, 0x0000f79b, 0x0000f79c, 0x0000f7a6,
+ /* 94 */ 0x0000f7a7, 0x0000f7a8, 0x0000b1ee, 0x0000f7a9,
+ /* 98 */ 0x0000f7aa, 0x0000f7ab, 0x0000f79d, 0x0000f79e,
+ /* 9c */ 0x0000f7ac, 0x0000f7ad, 0x0000c1db, 0x0000f7ae,
+ /* a0 */ 0x0000f79f, 0x0000f7a0, 0x0000f7af, 0x0000f840,
+ /* a4 */ 0x0000f841, 0x0000f842, 0x0000f843, 0x0000f844,
+ /* a8 */ 0x0000f845, 0x0000f846, 0x0000f847, 0x0000f848,
+ /* ac */ 0x0000f849, 0x0000f84a, 0x0000f84b, 0x0000f84c,
+ /* b0 */ 0x0000f84d, 0x0000f84e, 0x0000f84f, 0x0000f850,
+ /* b4 */ 0x0000f851, 0x0000f852, 0x0000f853, 0x0000f854,
+ /* b8 */ 0x0000f855, 0x0000f856, 0x0000f857, 0x0000f858,
+ /* bc */ 0x0000f859, 0x0000f85a, 0x0000f85b, 0x0000f85c,
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x06e95 ***/
+
+ /* 80 */ 0x0000f85d, 0x0000f85e, 0x0000f85f, 0x0000f860,
+ /* 84 */ 0x0000f861, 0x0000f862, 0x0000f863, 0x0000f864,
+ /* 88 */ 0x0000f865, 0x0000f866, 0x0000f867, 0x0000f868,
+ /* 8c */ 0x0000f869, 0x0000f86a, 0x0000f86b, 0x0000f86c,
+ /* 90 */ 0x0000f86d, 0x0000f86e, 0x0000f86f, 0x0000f870,
+ /* 94 */ 0x0000f871, 0x0000f872, 0x0000f873, 0x0000f874,
+ /* 98 */ 0x0000f875, 0x0000f876, 0x0000f877, 0x0000f878,
+ /* 9c */ 0x0000f879, 0x0000f87a, 0x0000f87b, 0x0000f87c,
+ /* a0 */ 0x0000f87d, 0x0000f87e, 0x0000f880, 0x0000f881,
+ /* a4 */ 0x0000f882, 0x0000f883, 0x0000f884, 0x0000f885,
+ /* a8 */ 0x0000f886, 0x0000f887, 0x0000f888, 0x0000f889,
+ /* ac */ 0x0000f88a, 0x0000f88b, 0x0000f88c, 0x0000f88d,
+ /* b0 */ 0x0000f88e, 0x0000f88f, 0x0000f890, 0x0000f891,
+ /* b4 */ 0x0000f892, 0x0000f893, 0x0000f894, 0x0000f895,
+ /* b8 */ 0x0000f896, 0x0000f897, 0x0000f898, 0x0000f899,
+ /* bc */ 0x0000f89a, 0x0000f89b, 0x0000f89c, 0x0000f89d,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x06ed5 ***/
+
+ /* 80 */ 0x0000f89e, 0x0000f89f, 0x0000f8a0, 0x0000f940,
+ /* 84 */ 0x0000f941, 0x0000f942, 0x0000f943, 0x0000f944,
+ /* 88 */ 0x0000f945, 0x0000f946, 0x0000f947, 0x0000f948,
+ /* 8c */ 0x0000f949, 0x0000f94a, 0x0000f94b, 0x0000f94c,
+ /* 90 */ 0x0000f94d, 0x0000f94e, 0x0000f94f, 0x0000f950,
+ /* 94 */ 0x0000f951, 0x0000f952, 0x0000f953, 0x0000f954,
+ /* 98 */ 0x0000f955, 0x0000f956, 0x0000f957, 0x0000f958,
+ /* 9c */ 0x0000f959, 0x0000f95a, 0x0000f95b, 0x0000f95c,
+ /* a0 */ 0x0000f95d, 0x0000f95e, 0x0000f95f, 0x0000f960,
+ /* a4 */ 0x0000f961, 0x0000f962, 0x0000f963, 0x0000f964,
+ /* a8 */ 0x0000f965, 0x0000f966, 0x0000f967, 0x0000f968,
+ /* ac */ 0x0000f969, 0x0000f96a, 0x0000f96b, 0x0000f96c,
+ /* b0 */ 0x0000f96d, 0x0000f96e, 0x0000f96f, 0x0000f970,
+ /* b4 */ 0x0000f971, 0x0000f972, 0x0000f973, 0x0000f974,
+ /* b8 */ 0x0000f975, 0x0000f976, 0x0000f977, 0x0000f978,
+ /* bc */ 0x0000f979, 0x0000f97a, 0x0000f97b, 0x0000f97c,
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x06f15 ***/
+
+ /* 80 */ 0x0000f97d, 0x0000f97e, 0x0000f980, 0x0000f981,
+ /* 84 */ 0x0000f982, 0x0000f983, 0x0000f984, 0x0000f985,
+ /* 88 */ 0x0000f986, 0x0000f987, 0x0000f988, 0x0000f989,
+ /* 8c */ 0x0000f98a, 0x0000f98b, 0x0000f98c, 0x0000f98d,
+ /* 90 */ 0x0000f98e, 0x0000f98f, 0x0000f990, 0x0000f991,
+ /* 94 */ 0x0000f992, 0x0000f993, 0x0000f994, 0x0000f995,
+ /* 98 */ 0x0000f996, 0x0000f997, 0x0000f998, 0x0000f999,
+ /* 9c */ 0x0000f99a, 0x0000f99b, 0x0000f99c, 0x0000f99d,
+ /* a0 */ 0x0000f99e, 0x0000f99f, 0x0000f9a0, 0x0000fa40,
+ /* a4 */ 0x0000fa41, 0x0000fa42, 0x0000fa43, 0x0000fa44,
+ /* a8 */ 0x0000fa45, 0x0000fa46, 0x0000fa47, 0x0000fa48,
+ /* ac */ 0x0000fa49, 0x0000fa4a, 0x0000fa4b, 0x0000fa4c,
+ /* b0 */ 0x0000fa4d, 0x0000fa4e, 0x0000fa4f, 0x0000fa50,
+ /* b4 */ 0x0000fa51, 0x0000fa52, 0x0000fa53, 0x0000fa54,
+ /* b8 */ 0x0000fa55, 0x0000fa56, 0x0000fa57, 0x0000fa58,
+ /* bc */ 0x0000fa59, 0x0000fa5a, 0x0000fa5b, 0x0000fa5c,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x06f55 ***/
+
+ /* 80 */ 0x0000fa5d, 0x0000fa5e, 0x0000fa5f, 0x0000fa60,
+ /* 84 */ 0x0000fa61, 0x0000fa62, 0x0000fa63, 0x0000fa64,
+ /* 88 */ 0x0000fa65, 0x0000fa66, 0x0000fa67, 0x0000fa68,
+ /* 8c */ 0x0000fa69, 0x0000fa6a, 0x0000fa6b, 0x0000fa6c,
+ /* 90 */ 0x0000fa6d, 0x0000fa6e, 0x0000fa6f, 0x0000fa70,
+ /* 94 */ 0x0000fa71, 0x0000fa72, 0x0000fa73, 0x0000fa74,
+ /* 98 */ 0x0000fa75, 0x0000fa76, 0x0000fa77, 0x0000fa78,
+ /* 9c */ 0x0000fa79, 0x0000fa7a, 0x0000fa7b, 0x0000fa7c,
+ /* a0 */ 0x0000fa7d, 0x0000fa7e, 0x0000fa80, 0x0000fa81,
+ /* a4 */ 0x0000fa82, 0x0000fa83, 0x0000fa84, 0x0000fa85,
+ /* a8 */ 0x0000fa86, 0x0000fa87, 0x0000fa88, 0x0000fa89,
+ /* ac */ 0x0000fa8a, 0x0000fa8b, 0x0000fa8c, 0x0000fa8d,
+ /* b0 */ 0x0000fa8e, 0x0000fa8f, 0x0000fa90, 0x0000fa91,
+ /* b4 */ 0x0000fa92, 0x0000fa93, 0x0000fa94, 0x0000fa95,
+ /* b8 */ 0x0000fa96, 0x0000fa97, 0x0000fa98, 0x0000fa99,
+ /* bc */ 0x0000fa9a, 0x0000fa9b, 0x0000fa9c, 0x0000fa9d,
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x06f95 ***/
+
+ /* 80 */ 0x0000fa9e, 0x0000fa9f, 0x0000faa0, 0x0000fb40,
+ /* 84 */ 0x0000fb41, 0x0000fb42, 0x0000fb43, 0x0000fb44,
+ /* 88 */ 0x0000fb45, 0x0000fb46, 0x0000fb47, 0x0000fb48,
+ /* 8c */ 0x0000fb49, 0x0000fb4a, 0x0000fb4b, 0x0000fb4c,
+ /* 90 */ 0x0000fb4d, 0x0000fb4e, 0x0000fb4f, 0x0000fb50,
+ /* 94 */ 0x0000fb51, 0x0000fb52, 0x0000fb53, 0x0000fb54,
+ /* 98 */ 0x0000fb55, 0x0000fb56, 0x0000fb57, 0x0000fb58,
+ /* 9c */ 0x0000fb59, 0x0000fb5a, 0x0000fb5b, 0x0000c4f1,
+ /* a0 */ 0x0000f0af, 0x0000bca6, 0x0000f0b0, 0x0000c3f9,
+ /* a4 */ 0x0000fb5c, 0x0000c5b8, 0x0000d1bb, 0x0000fb5d,
+ /* a8 */ 0x0000f0b1, 0x0000f0b2, 0x0000f0b3, 0x0000f0b4,
+ /* ac */ 0x0000f0b5, 0x0000d1bc, 0x0000fb5e, 0x0000d1ec,
+ /* b0 */ 0x0000fb5f, 0x0000f0b7, 0x0000f0b6, 0x0000d4a7,
+ /* b4 */ 0x0000fb60, 0x0000cdd2, 0x0000f0b8, 0x0000f0ba,
+ /* b8 */ 0x0000f0b9, 0x0000f0bb, 0x0000f0bc, 0x0000fb61,
+ /* bc */ 0x0000fb62, 0x0000b8eb, 0x0000f0bd, 0x0000bae8,
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x06fd5 ***/
+
+ /* 80 */ 0x0000fb63, 0x0000f0be, 0x0000f0bf, 0x0000bee9,
+ /* 84 */ 0x0000f0c0, 0x0000b6ec, 0x0000f0c1, 0x0000f0c2,
+ /* 88 */ 0x0000f0c3, 0x0000f0c4, 0x0000c8b5, 0x0000f0c5,
+ /* 8c */ 0x0000f0c6, 0x0000fb64, 0x0000f0c7, 0x0000c5f4,
+ /* 90 */ 0x0000fb65, 0x0000f0c8, 0x0000fb66, 0x0000fb67,
+ /* 94 */ 0x0000fb68, 0x0000f0c9, 0x0000fb69, 0x0000f0ca,
+ /* 98 */ 0x0000f7bd, 0x0000fb6a, 0x0000f0cb, 0x0000f0cc,
+ /* 9c */ 0x0000f0cd, 0x0000fb6b, 0x0000f0ce, 0x0000fb6c,
+ /* a0 */ 0x0000fb6d, 0x0000fb6e, 0x0000fb6f, 0x0000f0cf,
+ /* a4 */ 0x0000bad7, 0x0000fb70, 0x0000f0d0, 0x0000f0d1,
+ /* a8 */ 0x0000f0d2, 0x0000f0d3, 0x0000f0d4, 0x0000f0d5,
+ /* ac */ 0x0000f0d6, 0x0000f0d8, 0x0000fb71, 0x0000fb72,
+ /* b0 */ 0x0000d3a5, 0x0000f0d7, 0x0000fb73, 0x0000f0d9,
+ /* b4 */ 0x0000fb74, 0x0000fb75, 0x0000fb76, 0x0000fb77,
+ /* b8 */ 0x0000fb78, 0x0000fb79, 0x0000fb7a, 0x0000fb7b,
+ /* bc */ 0x0000fb7c, 0x0000fb7d, 0x0000f5ba, 0x0000c2b9,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x07015 ***/
+
+ /* 80 */ 0x0000fb7e, 0x0000fb80, 0x0000f7e4, 0x0000fb81,
+ /* 84 */ 0x0000fb82, 0x0000fb83, 0x0000fb84, 0x0000f7e5,
+ /* 88 */ 0x0000f7e6, 0x0000fb85, 0x0000fb86, 0x0000f7e7,
+ /* 8c */ 0x0000fb87, 0x0000fb88, 0x0000fb89, 0x0000fb8a,
+ /* 90 */ 0x0000fb8b, 0x0000fb8c, 0x0000f7e8, 0x0000c2b4,
+ /* 94 */ 0x0000fb8d, 0x0000fb8e, 0x0000fb8f, 0x0000fb90,
+ /* 98 */ 0x0000fb91, 0x0000fb92, 0x0000fb93, 0x0000fb94,
+ /* 9c */ 0x0000fb95, 0x0000f7ea, 0x0000fb96, 0x0000f7eb,
+ /* a0 */ 0x0000fb97, 0x0000fb98, 0x0000fb99, 0x0000fb9a,
+ /* a4 */ 0x0000fb9b, 0x0000fb9c, 0x0000c2f3, 0x0000fb9d,
+ /* a8 */ 0x0000fb9e, 0x0000fb9f, 0x0000fba0, 0x0000fc40,
+ /* ac */ 0x0000fc41, 0x0000fc42, 0x0000fc43, 0x0000fc44,
+ /* b0 */ 0x0000fc45, 0x0000fc46, 0x0000fc47, 0x0000fc48,
+ /* b4 */ 0x0000f4f0, 0x0000fc49, 0x0000fc4a, 0x0000fc4b,
+ /* b8 */ 0x0000f4ef, 0x0000fc4c, 0x0000fc4d, 0x0000c2e9,
+ /* bc */ 0x0000fc4e, 0x0000f7e1, 0x0000f7e2, 0x0000fc4f,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x07055 ***/
+
+ /* 80 */ 0x0000fc50, 0x0000fc51, 0x0000fc52, 0x0000fc53,
+ /* 84 */ 0x0000bbc6, 0x0000fc54, 0x0000fc55, 0x0000fc56,
+ /* 88 */ 0x0000fc57, 0x0000d9e4, 0x0000fc58, 0x0000fc59,
+ /* 8c */ 0x0000fc5a, 0x0000caf2, 0x0000c0e8, 0x0000f0a4,
+ /* 90 */ 0x0000fc5b, 0x0000bada, 0x0000fc5c, 0x0000fc5d,
+ /* 94 */ 0x0000c7ad, 0x0000fc5e, 0x0000fc5f, 0x0000fc60,
+ /* 98 */ 0x0000c4ac, 0x0000fc61, 0x0000fc62, 0x0000f7ec,
+ /* 9c */ 0x0000f7ed, 0x0000f7ee, 0x0000fc63, 0x0000f7f0,
+ /* a0 */ 0x0000f7ef, 0x0000fc64, 0x0000f7f1, 0x0000fc65,
+ /* a4 */ 0x0000fc66, 0x0000f7f4, 0x0000fc67, 0x0000f7f3,
+ /* a8 */ 0x0000fc68, 0x0000f7f2, 0x0000f7f5, 0x0000fc69,
+ /* ac */ 0x0000fc6a, 0x0000fc6b, 0x0000fc6c, 0x0000f7f6,
+ /* b0 */ 0x0000fc6d, 0x0000fc6e, 0x0000fc6f, 0x0000fc70,
+ /* b4 */ 0x0000fc71, 0x0000fc72, 0x0000fc73, 0x0000fc74,
+ /* b8 */ 0x0000fc75, 0x0000ede9, 0x0000fc76, 0x0000edea,
+ /* bc */ 0x0000edeb, 0x0000fc77, 0x0000f6bc, 0x0000fc78,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x07095 ***/
+
+ /* 80 */ 0x0000fc79, 0x0000fc7a, 0x0000fc7b, 0x0000fc7c,
+ /* 84 */ 0x0000fc7d, 0x0000fc7e, 0x0000fc80, 0x0000fc81,
+ /* 88 */ 0x0000fc82, 0x0000fc83, 0x0000fc84, 0x0000f6bd,
+ /* 8c */ 0x0000fc85, 0x0000f6be, 0x0000b6a6, 0x0000fc86,
+ /* 90 */ 0x0000d8be, 0x0000fc87, 0x0000fc88, 0x0000b9c4,
+ /* 94 */ 0x0000fc89, 0x0000fc8a, 0x0000fc8b, 0x0000d8bb,
+ /* 98 */ 0x0000fc8c, 0x0000dcb1, 0x0000fc8d, 0x0000fc8e,
+ /* 9c */ 0x0000fc8f, 0x0000fc90, 0x0000fc91, 0x0000fc92,
+ /* a0 */ 0x0000caf3, 0x0000fc93, 0x0000f7f7, 0x0000fc94,
+ /* a4 */ 0x0000fc95, 0x0000fc96, 0x0000fc97, 0x0000fc98,
+ /* a8 */ 0x0000fc99, 0x0000fc9a, 0x0000fc9b, 0x0000fc9c,
+ /* ac */ 0x0000f7f8, 0x0000fc9d, 0x0000fc9e, 0x0000f7f9,
+ /* b0 */ 0x0000fc9f, 0x0000fca0, 0x0000fd40, 0x0000fd41,
+ /* b4 */ 0x0000fd42, 0x0000fd43, 0x0000fd44, 0x0000f7fb,
+ /* b8 */ 0x0000fd45, 0x0000f7fa, 0x0000fd46, 0x0000b1c7,
+ /* bc */ 0x0000fd47, 0x0000f7fc, 0x0000f7fd, 0x0000fd48,
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x070d5 ***/
+
+ /* 80 */ 0x0000fd49, 0x0000fd4a, 0x0000fd4b, 0x0000fd4c,
+ /* 84 */ 0x0000f7fe, 0x0000fd4d, 0x0000fd4e, 0x0000fd4f,
+ /* 88 */ 0x0000fd50, 0x0000fd51, 0x0000fd52, 0x0000fd53,
+ /* 8c */ 0x0000fd54, 0x0000fd55, 0x0000fd56, 0x0000fd57,
+ /* 90 */ 0x0000c6eb, 0x0000ecb4, 0x0000fd58, 0x0000fd59,
+ /* 94 */ 0x0000fd5a, 0x0000fd5b, 0x0000fd5c, 0x0000fd5d,
+ /* 98 */ 0x0000fd5e, 0x0000fd5f, 0x0000fd60, 0x0000fd61,
+ /* 9c */ 0x0000fd62, 0x0000fd63, 0x0000fd64, 0x0000fd65,
+ /* a0 */ 0x0000fd66, 0x0000fd67, 0x0000fd68, 0x0000fd69,
+ /* a4 */ 0x0000fd6a, 0x0000fd6b, 0x0000fd6c, 0x0000fd6d,
+ /* a8 */ 0x0000fd6e, 0x0000fd6f, 0x0000fd70, 0x0000fd71,
+ /* ac */ 0x0000fd72, 0x0000fd73, 0x0000fd74, 0x0000fd75,
+ /* b0 */ 0x0000fd76, 0x0000fd77, 0x0000fd78, 0x0000fd79,
+ /* b4 */ 0x0000fd7a, 0x0000fd7b, 0x0000fd7c, 0x0000fd7d,
+ /* b8 */ 0x0000fd7e, 0x0000fd80, 0x0000fd81, 0x0000fd82,
+ /* bc */ 0x0000fd83, 0x0000fd84, 0x0000fd85, 0x0000b3dd,
+
+ /*** Three byte table, leaf: e9bexx - offset 0x07115 ***/
+
+ /* 80 */ 0x0000f6b3, 0x0000fd86, 0x0000fd87, 0x0000f6b4,
+ /* 84 */ 0x0000c1e4, 0x0000f6b5, 0x0000f6b6, 0x0000f6b7,
+ /* 88 */ 0x0000f6b8, 0x0000f6b9, 0x0000f6ba, 0x0000c8a3,
+ /* 8c */ 0x0000f6bb, 0x0000fd88, 0x0000fd89, 0x0000fd8a,
+ /* 90 */ 0x0000fd8b, 0x0000fd8c, 0x0000fd8d, 0x0000fd8e,
+ /* 94 */ 0x0000fd8f, 0x0000fd90, 0x0000fd91, 0x0000fd92,
+ /* 98 */ 0x0000fd93, 0x0000c1fa, 0x0000b9a8, 0x0000ede8,
+ /* 9c */ 0x0000fd94, 0x0000fd95, 0x0000fd96, 0x0000b9ea,
+ /* a0 */ 0x0000d9df, 0x0000fd97, 0x0000fd98, 0x0000fd99,
+ /* a4 */ 0x0000fd9a, 0x0000fd9b, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+
+ /*** Three byte table, leaf: ee80xx - offset 0x07155 ***/
+
+ /* 80 */ 0x0000aaa1, 0x0000aaa2, 0x0000aaa3, 0x0000aaa4,
+ /* 84 */ 0x0000aaa5, 0x0000aaa6, 0x0000aaa7, 0x0000aaa8,
+ /* 88 */ 0x0000aaa9, 0x0000aaaa, 0x0000aaab, 0x0000aaac,
+ /* 8c */ 0x0000aaad, 0x0000aaae, 0x0000aaaf, 0x0000aab0,
+ /* 90 */ 0x0000aab1, 0x0000aab2, 0x0000aab3, 0x0000aab4,
+ /* 94 */ 0x0000aab5, 0x0000aab6, 0x0000aab7, 0x0000aab8,
+ /* 98 */ 0x0000aab9, 0x0000aaba, 0x0000aabb, 0x0000aabc,
+ /* 9c */ 0x0000aabd, 0x0000aabe, 0x0000aabf, 0x0000aac0,
+ /* a0 */ 0x0000aac1, 0x0000aac2, 0x0000aac3, 0x0000aac4,
+ /* a4 */ 0x0000aac5, 0x0000aac6, 0x0000aac7, 0x0000aac8,
+ /* a8 */ 0x0000aac9, 0x0000aaca, 0x0000aacb, 0x0000aacc,
+ /* ac */ 0x0000aacd, 0x0000aace, 0x0000aacf, 0x0000aad0,
+ /* b0 */ 0x0000aad1, 0x0000aad2, 0x0000aad3, 0x0000aad4,
+ /* b4 */ 0x0000aad5, 0x0000aad6, 0x0000aad7, 0x0000aad8,
+ /* b8 */ 0x0000aad9, 0x0000aada, 0x0000aadb, 0x0000aadc,
+ /* bc */ 0x0000aadd, 0x0000aade, 0x0000aadf, 0x0000aae0,
+
+ /*** Three byte table, leaf: ee81xx - offset 0x07195 ***/
+
+ /* 80 */ 0x0000aae1, 0x0000aae2, 0x0000aae3, 0x0000aae4,
+ /* 84 */ 0x0000aae5, 0x0000aae6, 0x0000aae7, 0x0000aae8,
+ /* 88 */ 0x0000aae9, 0x0000aaea, 0x0000aaeb, 0x0000aaec,
+ /* 8c */ 0x0000aaed, 0x0000aaee, 0x0000aaef, 0x0000aaf0,
+ /* 90 */ 0x0000aaf1, 0x0000aaf2, 0x0000aaf3, 0x0000aaf4,
+ /* 94 */ 0x0000aaf5, 0x0000aaf6, 0x0000aaf7, 0x0000aaf8,
+ /* 98 */ 0x0000aaf9, 0x0000aafa, 0x0000aafb, 0x0000aafc,
+ /* 9c */ 0x0000aafd, 0x0000aafe, 0x0000aba1, 0x0000aba2,
+ /* a0 */ 0x0000aba3, 0x0000aba4, 0x0000aba5, 0x0000aba6,
+ /* a4 */ 0x0000aba7, 0x0000aba8, 0x0000aba9, 0x0000abaa,
+ /* a8 */ 0x0000abab, 0x0000abac, 0x0000abad, 0x0000abae,
+ /* ac */ 0x0000abaf, 0x0000abb0, 0x0000abb1, 0x0000abb2,
+ /* b0 */ 0x0000abb3, 0x0000abb4, 0x0000abb5, 0x0000abb6,
+ /* b4 */ 0x0000abb7, 0x0000abb8, 0x0000abb9, 0x0000abba,
+ /* b8 */ 0x0000abbb, 0x0000abbc, 0x0000abbd, 0x0000abbe,
+ /* bc */ 0x0000abbf, 0x0000abc0, 0x0000abc1, 0x0000abc2,
+
+ /*** Three byte table, leaf: ee82xx - offset 0x071d5 ***/
+
+ /* 80 */ 0x0000abc3, 0x0000abc4, 0x0000abc5, 0x0000abc6,
+ /* 84 */ 0x0000abc7, 0x0000abc8, 0x0000abc9, 0x0000abca,
+ /* 88 */ 0x0000abcb, 0x0000abcc, 0x0000abcd, 0x0000abce,
+ /* 8c */ 0x0000abcf, 0x0000abd0, 0x0000abd1, 0x0000abd2,
+ /* 90 */ 0x0000abd3, 0x0000abd4, 0x0000abd5, 0x0000abd6,
+ /* 94 */ 0x0000abd7, 0x0000abd8, 0x0000abd9, 0x0000abda,
+ /* 98 */ 0x0000abdb, 0x0000abdc, 0x0000abdd, 0x0000abde,
+ /* 9c */ 0x0000abdf, 0x0000abe0, 0x0000abe1, 0x0000abe2,
+ /* a0 */ 0x0000abe3, 0x0000abe4, 0x0000abe5, 0x0000abe6,
+ /* a4 */ 0x0000abe7, 0x0000abe8, 0x0000abe9, 0x0000abea,
+ /* a8 */ 0x0000abeb, 0x0000abec, 0x0000abed, 0x0000abee,
+ /* ac */ 0x0000abef, 0x0000abf0, 0x0000abf1, 0x0000abf2,
+ /* b0 */ 0x0000abf3, 0x0000abf4, 0x0000abf5, 0x0000abf6,
+ /* b4 */ 0x0000abf7, 0x0000abf8, 0x0000abf9, 0x0000abfa,
+ /* b8 */ 0x0000abfb, 0x0000abfc, 0x0000abfd, 0x0000abfe,
+ /* bc */ 0x0000aca1, 0x0000aca2, 0x0000aca3, 0x0000aca4,
+
+ /*** Three byte table, leaf: ee83xx - offset 0x07215 ***/
+
+ /* 80 */ 0x0000aca5, 0x0000aca6, 0x0000aca7, 0x0000aca8,
+ /* 84 */ 0x0000aca9, 0x0000acaa, 0x0000acab, 0x0000acac,
+ /* 88 */ 0x0000acad, 0x0000acae, 0x0000acaf, 0x0000acb0,
+ /* 8c */ 0x0000acb1, 0x0000acb2, 0x0000acb3, 0x0000acb4,
+ /* 90 */ 0x0000acb5, 0x0000acb6, 0x0000acb7, 0x0000acb8,
+ /* 94 */ 0x0000acb9, 0x0000acba, 0x0000acbb, 0x0000acbc,
+ /* 98 */ 0x0000acbd, 0x0000acbe, 0x0000acbf, 0x0000acc0,
+ /* 9c */ 0x0000acc1, 0x0000acc2, 0x0000acc3, 0x0000acc4,
+ /* a0 */ 0x0000acc5, 0x0000acc6, 0x0000acc7, 0x0000acc8,
+ /* a4 */ 0x0000acc9, 0x0000acca, 0x0000accb, 0x0000accc,
+ /* a8 */ 0x0000accd, 0x0000acce, 0x0000accf, 0x0000acd0,
+ /* ac */ 0x0000acd1, 0x0000acd2, 0x0000acd3, 0x0000acd4,
+ /* b0 */ 0x0000acd5, 0x0000acd6, 0x0000acd7, 0x0000acd8,
+ /* b4 */ 0x0000acd9, 0x0000acda, 0x0000acdb, 0x0000acdc,
+ /* b8 */ 0x0000acdd, 0x0000acde, 0x0000acdf, 0x0000ace0,
+ /* bc */ 0x0000ace1, 0x0000ace2, 0x0000ace3, 0x0000ace4,
+
+ /*** Three byte table, leaf: ee84xx - offset 0x07255 ***/
+
+ /* 80 */ 0x0000ace5, 0x0000ace6, 0x0000ace7, 0x0000ace8,
+ /* 84 */ 0x0000ace9, 0x0000acea, 0x0000aceb, 0x0000acec,
+ /* 88 */ 0x0000aced, 0x0000acee, 0x0000acef, 0x0000acf0,
+ /* 8c */ 0x0000acf1, 0x0000acf2, 0x0000acf3, 0x0000acf4,
+ /* 90 */ 0x0000acf5, 0x0000acf6, 0x0000acf7, 0x0000acf8,
+ /* 94 */ 0x0000acf9, 0x0000acfa, 0x0000acfb, 0x0000acfc,
+ /* 98 */ 0x0000acfd, 0x0000acfe, 0x0000ada1, 0x0000ada2,
+ /* 9c */ 0x0000ada3, 0x0000ada4, 0x0000ada5, 0x0000ada6,
+ /* a0 */ 0x0000ada7, 0x0000ada8, 0x0000ada9, 0x0000adaa,
+ /* a4 */ 0x0000adab, 0x0000adac, 0x0000adad, 0x0000adae,
+ /* a8 */ 0x0000adaf, 0x0000adb0, 0x0000adb1, 0x0000adb2,
+ /* ac */ 0x0000adb3, 0x0000adb4, 0x0000adb5, 0x0000adb6,
+ /* b0 */ 0x0000adb7, 0x0000adb8, 0x0000adb9, 0x0000adba,
+ /* b4 */ 0x0000adbb, 0x0000adbc, 0x0000adbd, 0x0000adbe,
+ /* b8 */ 0x0000adbf, 0x0000adc0, 0x0000adc1, 0x0000adc2,
+ /* bc */ 0x0000adc3, 0x0000adc4, 0x0000adc5, 0x0000adc6,
+
+ /*** Three byte table, leaf: ee85xx - offset 0x07295 ***/
+
+ /* 80 */ 0x0000adc7, 0x0000adc8, 0x0000adc9, 0x0000adca,
+ /* 84 */ 0x0000adcb, 0x0000adcc, 0x0000adcd, 0x0000adce,
+ /* 88 */ 0x0000adcf, 0x0000add0, 0x0000add1, 0x0000add2,
+ /* 8c */ 0x0000add3, 0x0000add4, 0x0000add5, 0x0000add6,
+ /* 90 */ 0x0000add7, 0x0000add8, 0x0000add9, 0x0000adda,
+ /* 94 */ 0x0000addb, 0x0000addc, 0x0000addd, 0x0000adde,
+ /* 98 */ 0x0000addf, 0x0000ade0, 0x0000ade1, 0x0000ade2,
+ /* 9c */ 0x0000ade3, 0x0000ade4, 0x0000ade5, 0x0000ade6,
+ /* a0 */ 0x0000ade7, 0x0000ade8, 0x0000ade9, 0x0000adea,
+ /* a4 */ 0x0000adeb, 0x0000adec, 0x0000aded, 0x0000adee,
+ /* a8 */ 0x0000adef, 0x0000adf0, 0x0000adf1, 0x0000adf2,
+ /* ac */ 0x0000adf3, 0x0000adf4, 0x0000adf5, 0x0000adf6,
+ /* b0 */ 0x0000adf7, 0x0000adf8, 0x0000adf9, 0x0000adfa,
+ /* b4 */ 0x0000adfb, 0x0000adfc, 0x0000adfd, 0x0000adfe,
+ /* b8 */ 0x0000aea1, 0x0000aea2, 0x0000aea3, 0x0000aea4,
+ /* bc */ 0x0000aea5, 0x0000aea6, 0x0000aea7, 0x0000aea8,
+
+ /*** Three byte table, leaf: ee86xx - offset 0x072d5 ***/
+
+ /* 80 */ 0x0000aea9, 0x0000aeaa, 0x0000aeab, 0x0000aeac,
+ /* 84 */ 0x0000aead, 0x0000aeae, 0x0000aeaf, 0x0000aeb0,
+ /* 88 */ 0x0000aeb1, 0x0000aeb2, 0x0000aeb3, 0x0000aeb4,
+ /* 8c */ 0x0000aeb5, 0x0000aeb6, 0x0000aeb7, 0x0000aeb8,
+ /* 90 */ 0x0000aeb9, 0x0000aeba, 0x0000aebb, 0x0000aebc,
+ /* 94 */ 0x0000aebd, 0x0000aebe, 0x0000aebf, 0x0000aec0,
+ /* 98 */ 0x0000aec1, 0x0000aec2, 0x0000aec3, 0x0000aec4,
+ /* 9c */ 0x0000aec5, 0x0000aec6, 0x0000aec7, 0x0000aec8,
+ /* a0 */ 0x0000aec9, 0x0000aeca, 0x0000aecb, 0x0000aecc,
+ /* a4 */ 0x0000aecd, 0x0000aece, 0x0000aecf, 0x0000aed0,
+ /* a8 */ 0x0000aed1, 0x0000aed2, 0x0000aed3, 0x0000aed4,
+ /* ac */ 0x0000aed5, 0x0000aed6, 0x0000aed7, 0x0000aed8,
+ /* b0 */ 0x0000aed9, 0x0000aeda, 0x0000aedb, 0x0000aedc,
+ /* b4 */ 0x0000aedd, 0x0000aede, 0x0000aedf, 0x0000aee0,
+ /* b8 */ 0x0000aee1, 0x0000aee2, 0x0000aee3, 0x0000aee4,
+ /* bc */ 0x0000aee5, 0x0000aee6, 0x0000aee7, 0x0000aee8,
+
+ /*** Three byte table, leaf: ee87xx - offset 0x07315 ***/
+
+ /* 80 */ 0x0000aee9, 0x0000aeea, 0x0000aeeb, 0x0000aeec,
+ /* 84 */ 0x0000aeed, 0x0000aeee, 0x0000aeef, 0x0000aef0,
+ /* 88 */ 0x0000aef1, 0x0000aef2, 0x0000aef3, 0x0000aef4,
+ /* 8c */ 0x0000aef5, 0x0000aef6, 0x0000aef7, 0x0000aef8,
+ /* 90 */ 0x0000aef9, 0x0000aefa, 0x0000aefb, 0x0000aefc,
+ /* 94 */ 0x0000aefd, 0x0000aefe, 0x0000afa1, 0x0000afa2,
+ /* 98 */ 0x0000afa3, 0x0000afa4, 0x0000afa5, 0x0000afa6,
+ /* 9c */ 0x0000afa7, 0x0000afa8, 0x0000afa9, 0x0000afaa,
+ /* a0 */ 0x0000afab, 0x0000afac, 0x0000afad, 0x0000afae,
+ /* a4 */ 0x0000afaf, 0x0000afb0, 0x0000afb1, 0x0000afb2,
+ /* a8 */ 0x0000afb3, 0x0000afb4, 0x0000afb5, 0x0000afb6,
+ /* ac */ 0x0000afb7, 0x0000afb8, 0x0000afb9, 0x0000afba,
+ /* b0 */ 0x0000afbb, 0x0000afbc, 0x0000afbd, 0x0000afbe,
+ /* b4 */ 0x0000afbf, 0x0000afc0, 0x0000afc1, 0x0000afc2,
+ /* b8 */ 0x0000afc3, 0x0000afc4, 0x0000afc5, 0x0000afc6,
+ /* bc */ 0x0000afc7, 0x0000afc8, 0x0000afc9, 0x0000afca,
+
+ /*** Three byte table, leaf: ee88xx - offset 0x07355 ***/
+
+ /* 80 */ 0x0000afcb, 0x0000afcc, 0x0000afcd, 0x0000afce,
+ /* 84 */ 0x0000afcf, 0x0000afd0, 0x0000afd1, 0x0000afd2,
+ /* 88 */ 0x0000afd3, 0x0000afd4, 0x0000afd5, 0x0000afd6,
+ /* 8c */ 0x0000afd7, 0x0000afd8, 0x0000afd9, 0x0000afda,
+ /* 90 */ 0x0000afdb, 0x0000afdc, 0x0000afdd, 0x0000afde,
+ /* 94 */ 0x0000afdf, 0x0000afe0, 0x0000afe1, 0x0000afe2,
+ /* 98 */ 0x0000afe3, 0x0000afe4, 0x0000afe5, 0x0000afe6,
+ /* 9c */ 0x0000afe7, 0x0000afe8, 0x0000afe9, 0x0000afea,
+ /* a0 */ 0x0000afeb, 0x0000afec, 0x0000afed, 0x0000afee,
+ /* a4 */ 0x0000afef, 0x0000aff0, 0x0000aff1, 0x0000aff2,
+ /* a8 */ 0x0000aff3, 0x0000aff4, 0x0000aff5, 0x0000aff6,
+ /* ac */ 0x0000aff7, 0x0000aff8, 0x0000aff9, 0x0000affa,
+ /* b0 */ 0x0000affb, 0x0000affc, 0x0000affd, 0x0000affe,
+ /* b4 */ 0x0000f8a1, 0x0000f8a2, 0x0000f8a3, 0x0000f8a4,
+ /* b8 */ 0x0000f8a5, 0x0000f8a6, 0x0000f8a7, 0x0000f8a8,
+ /* bc */ 0x0000f8a9, 0x0000f8aa, 0x0000f8ab, 0x0000f8ac,
+
+ /*** Three byte table, leaf: ee89xx - offset 0x07395 ***/
+
+ /* 80 */ 0x0000f8ad, 0x0000f8ae, 0x0000f8af, 0x0000f8b0,
+ /* 84 */ 0x0000f8b1, 0x0000f8b2, 0x0000f8b3, 0x0000f8b4,
+ /* 88 */ 0x0000f8b5, 0x0000f8b6, 0x0000f8b7, 0x0000f8b8,
+ /* 8c */ 0x0000f8b9, 0x0000f8ba, 0x0000f8bb, 0x0000f8bc,
+ /* 90 */ 0x0000f8bd, 0x0000f8be, 0x0000f8bf, 0x0000f8c0,
+ /* 94 */ 0x0000f8c1, 0x0000f8c2, 0x0000f8c3, 0x0000f8c4,
+ /* 98 */ 0x0000f8c5, 0x0000f8c6, 0x0000f8c7, 0x0000f8c8,
+ /* 9c */ 0x0000f8c9, 0x0000f8ca, 0x0000f8cb, 0x0000f8cc,
+ /* a0 */ 0x0000f8cd, 0x0000f8ce, 0x0000f8cf, 0x0000f8d0,
+ /* a4 */ 0x0000f8d1, 0x0000f8d2, 0x0000f8d3, 0x0000f8d4,
+ /* a8 */ 0x0000f8d5, 0x0000f8d6, 0x0000f8d7, 0x0000f8d8,
+ /* ac */ 0x0000f8d9, 0x0000f8da, 0x0000f8db, 0x0000f8dc,
+ /* b0 */ 0x0000f8dd, 0x0000f8de, 0x0000f8df, 0x0000f8e0,
+ /* b4 */ 0x0000f8e1, 0x0000f8e2, 0x0000f8e3, 0x0000f8e4,
+ /* b8 */ 0x0000f8e5, 0x0000f8e6, 0x0000f8e7, 0x0000f8e8,
+ /* bc */ 0x0000f8e9, 0x0000f8ea, 0x0000f8eb, 0x0000f8ec,
+
+ /*** Three byte table, leaf: ee8axx - offset 0x073d5 ***/
+
+ /* 80 */ 0x0000f8ed, 0x0000f8ee, 0x0000f8ef, 0x0000f8f0,
+ /* 84 */ 0x0000f8f1, 0x0000f8f2, 0x0000f8f3, 0x0000f8f4,
+ /* 88 */ 0x0000f8f5, 0x0000f8f6, 0x0000f8f7, 0x0000f8f8,
+ /* 8c */ 0x0000f8f9, 0x0000f8fa, 0x0000f8fb, 0x0000f8fc,
+ /* 90 */ 0x0000f8fd, 0x0000f8fe, 0x0000f9a1, 0x0000f9a2,
+ /* 94 */ 0x0000f9a3, 0x0000f9a4, 0x0000f9a5, 0x0000f9a6,
+ /* 98 */ 0x0000f9a7, 0x0000f9a8, 0x0000f9a9, 0x0000f9aa,
+ /* 9c */ 0x0000f9ab, 0x0000f9ac, 0x0000f9ad, 0x0000f9ae,
+ /* a0 */ 0x0000f9af, 0x0000f9b0, 0x0000f9b1, 0x0000f9b2,
+ /* a4 */ 0x0000f9b3, 0x0000f9b4, 0x0000f9b5, 0x0000f9b6,
+ /* a8 */ 0x0000f9b7, 0x0000f9b8, 0x0000f9b9, 0x0000f9ba,
+ /* ac */ 0x0000f9bb, 0x0000f9bc, 0x0000f9bd, 0x0000f9be,
+ /* b0 */ 0x0000f9bf, 0x0000f9c0, 0x0000f9c1, 0x0000f9c2,
+ /* b4 */ 0x0000f9c3, 0x0000f9c4, 0x0000f9c5, 0x0000f9c6,
+ /* b8 */ 0x0000f9c7, 0x0000f9c8, 0x0000f9c9, 0x0000f9ca,
+ /* bc */ 0x0000f9cb, 0x0000f9cc, 0x0000f9cd, 0x0000f9ce,
+
+ /*** Three byte table, leaf: ee8bxx - offset 0x07415 ***/
+
+ /* 80 */ 0x0000f9cf, 0x0000f9d0, 0x0000f9d1, 0x0000f9d2,
+ /* 84 */ 0x0000f9d3, 0x0000f9d4, 0x0000f9d5, 0x0000f9d6,
+ /* 88 */ 0x0000f9d7, 0x0000f9d8, 0x0000f9d9, 0x0000f9da,
+ /* 8c */ 0x0000f9db, 0x0000f9dc, 0x0000f9dd, 0x0000f9de,
+ /* 90 */ 0x0000f9df, 0x0000f9e0, 0x0000f9e1, 0x0000f9e2,
+ /* 94 */ 0x0000f9e3, 0x0000f9e4, 0x0000f9e5, 0x0000f9e6,
+ /* 98 */ 0x0000f9e7, 0x0000f9e8, 0x0000f9e9, 0x0000f9ea,
+ /* 9c */ 0x0000f9eb, 0x0000f9ec, 0x0000f9ed, 0x0000f9ee,
+ /* a0 */ 0x0000f9ef, 0x0000f9f0, 0x0000f9f1, 0x0000f9f2,
+ /* a4 */ 0x0000f9f3, 0x0000f9f4, 0x0000f9f5, 0x0000f9f6,
+ /* a8 */ 0x0000f9f7, 0x0000f9f8, 0x0000f9f9, 0x0000f9fa,
+ /* ac */ 0x0000f9fb, 0x0000f9fc, 0x0000f9fd, 0x0000f9fe,
+ /* b0 */ 0x0000faa1, 0x0000faa2, 0x0000faa3, 0x0000faa4,
+ /* b4 */ 0x0000faa5, 0x0000faa6, 0x0000faa7, 0x0000faa8,
+ /* b8 */ 0x0000faa9, 0x0000faaa, 0x0000faab, 0x0000faac,
+ /* bc */ 0x0000faad, 0x0000faae, 0x0000faaf, 0x0000fab0,
+
+ /*** Three byte table, leaf: ee8cxx - offset 0x07455 ***/
+
+ /* 80 */ 0x0000fab1, 0x0000fab2, 0x0000fab3, 0x0000fab4,
+ /* 84 */ 0x0000fab5, 0x0000fab6, 0x0000fab7, 0x0000fab8,
+ /* 88 */ 0x0000fab9, 0x0000faba, 0x0000fabb, 0x0000fabc,
+ /* 8c */ 0x0000fabd, 0x0000fabe, 0x0000fabf, 0x0000fac0,
+ /* 90 */ 0x0000fac1, 0x0000fac2, 0x0000fac3, 0x0000fac4,
+ /* 94 */ 0x0000fac5, 0x0000fac6, 0x0000fac7, 0x0000fac8,
+ /* 98 */ 0x0000fac9, 0x0000faca, 0x0000facb, 0x0000facc,
+ /* 9c */ 0x0000facd, 0x0000face, 0x0000facf, 0x0000fad0,
+ /* a0 */ 0x0000fad1, 0x0000fad2, 0x0000fad3, 0x0000fad4,
+ /* a4 */ 0x0000fad5, 0x0000fad6, 0x0000fad7, 0x0000fad8,
+ /* a8 */ 0x0000fad9, 0x0000fada, 0x0000fadb, 0x0000fadc,
+ /* ac */ 0x0000fadd, 0x0000fade, 0x0000fadf, 0x0000fae0,
+ /* b0 */ 0x0000fae1, 0x0000fae2, 0x0000fae3, 0x0000fae4,
+ /* b4 */ 0x0000fae5, 0x0000fae6, 0x0000fae7, 0x0000fae8,
+ /* b8 */ 0x0000fae9, 0x0000faea, 0x0000faeb, 0x0000faec,
+ /* bc */ 0x0000faed, 0x0000faee, 0x0000faef, 0x0000faf0,
+
+ /*** Three byte table, leaf: ee8dxx - offset 0x07495 ***/
+
+ /* 80 */ 0x0000faf1, 0x0000faf2, 0x0000faf3, 0x0000faf4,
+ /* 84 */ 0x0000faf5, 0x0000faf6, 0x0000faf7, 0x0000faf8,
+ /* 88 */ 0x0000faf9, 0x0000fafa, 0x0000fafb, 0x0000fafc,
+ /* 8c */ 0x0000fafd, 0x0000fafe, 0x0000fba1, 0x0000fba2,
+ /* 90 */ 0x0000fba3, 0x0000fba4, 0x0000fba5, 0x0000fba6,
+ /* 94 */ 0x0000fba7, 0x0000fba8, 0x0000fba9, 0x0000fbaa,
+ /* 98 */ 0x0000fbab, 0x0000fbac, 0x0000fbad, 0x0000fbae,
+ /* 9c */ 0x0000fbaf, 0x0000fbb0, 0x0000fbb1, 0x0000fbb2,
+ /* a0 */ 0x0000fbb3, 0x0000fbb4, 0x0000fbb5, 0x0000fbb6,
+ /* a4 */ 0x0000fbb7, 0x0000fbb8, 0x0000fbb9, 0x0000fbba,
+ /* a8 */ 0x0000fbbb, 0x0000fbbc, 0x0000fbbd, 0x0000fbbe,
+ /* ac */ 0x0000fbbf, 0x0000fbc0, 0x0000fbc1, 0x0000fbc2,
+ /* b0 */ 0x0000fbc3, 0x0000fbc4, 0x0000fbc5, 0x0000fbc6,
+ /* b4 */ 0x0000fbc7, 0x0000fbc8, 0x0000fbc9, 0x0000fbca,
+ /* b8 */ 0x0000fbcb, 0x0000fbcc, 0x0000fbcd, 0x0000fbce,
+ /* bc */ 0x0000fbcf, 0x0000fbd0, 0x0000fbd1, 0x0000fbd2,
+
+ /*** Three byte table, leaf: ee8exx - offset 0x074d5 ***/
+
+ /* 80 */ 0x0000fbd3, 0x0000fbd4, 0x0000fbd5, 0x0000fbd6,
+ /* 84 */ 0x0000fbd7, 0x0000fbd8, 0x0000fbd9, 0x0000fbda,
+ /* 88 */ 0x0000fbdb, 0x0000fbdc, 0x0000fbdd, 0x0000fbde,
+ /* 8c */ 0x0000fbdf, 0x0000fbe0, 0x0000fbe1, 0x0000fbe2,
+ /* 90 */ 0x0000fbe3, 0x0000fbe4, 0x0000fbe5, 0x0000fbe6,
+ /* 94 */ 0x0000fbe7, 0x0000fbe8, 0x0000fbe9, 0x0000fbea,
+ /* 98 */ 0x0000fbeb, 0x0000fbec, 0x0000fbed, 0x0000fbee,
+ /* 9c */ 0x0000fbef, 0x0000fbf0, 0x0000fbf1, 0x0000fbf2,
+ /* a0 */ 0x0000fbf3, 0x0000fbf4, 0x0000fbf5, 0x0000fbf6,
+ /* a4 */ 0x0000fbf7, 0x0000fbf8, 0x0000fbf9, 0x0000fbfa,
+ /* a8 */ 0x0000fbfb, 0x0000fbfc, 0x0000fbfd, 0x0000fbfe,
+ /* ac */ 0x0000fca1, 0x0000fca2, 0x0000fca3, 0x0000fca4,
+ /* b0 */ 0x0000fca5, 0x0000fca6, 0x0000fca7, 0x0000fca8,
+ /* b4 */ 0x0000fca9, 0x0000fcaa, 0x0000fcab, 0x0000fcac,
+ /* b8 */ 0x0000fcad, 0x0000fcae, 0x0000fcaf, 0x0000fcb0,
+ /* bc */ 0x0000fcb1, 0x0000fcb2, 0x0000fcb3, 0x0000fcb4,
+
+ /*** Three byte table, leaf: ee8fxx - offset 0x07515 ***/
+
+ /* 80 */ 0x0000fcb5, 0x0000fcb6, 0x0000fcb7, 0x0000fcb8,
+ /* 84 */ 0x0000fcb9, 0x0000fcba, 0x0000fcbb, 0x0000fcbc,
+ /* 88 */ 0x0000fcbd, 0x0000fcbe, 0x0000fcbf, 0x0000fcc0,
+ /* 8c */ 0x0000fcc1, 0x0000fcc2, 0x0000fcc3, 0x0000fcc4,
+ /* 90 */ 0x0000fcc5, 0x0000fcc6, 0x0000fcc7, 0x0000fcc8,
+ /* 94 */ 0x0000fcc9, 0x0000fcca, 0x0000fccb, 0x0000fccc,
+ /* 98 */ 0x0000fccd, 0x0000fcce, 0x0000fccf, 0x0000fcd0,
+ /* 9c */ 0x0000fcd1, 0x0000fcd2, 0x0000fcd3, 0x0000fcd4,
+ /* a0 */ 0x0000fcd5, 0x0000fcd6, 0x0000fcd7, 0x0000fcd8,
+ /* a4 */ 0x0000fcd9, 0x0000fcda, 0x0000fcdb, 0x0000fcdc,
+ /* a8 */ 0x0000fcdd, 0x0000fcde, 0x0000fcdf, 0x0000fce0,
+ /* ac */ 0x0000fce1, 0x0000fce2, 0x0000fce3, 0x0000fce4,
+ /* b0 */ 0x0000fce5, 0x0000fce6, 0x0000fce7, 0x0000fce8,
+ /* b4 */ 0x0000fce9, 0x0000fcea, 0x0000fceb, 0x0000fcec,
+ /* b8 */ 0x0000fced, 0x0000fcee, 0x0000fcef, 0x0000fcf0,
+ /* bc */ 0x0000fcf1, 0x0000fcf2, 0x0000fcf3, 0x0000fcf4,
+
+ /*** Three byte table, leaf: ee90xx - offset 0x07555 ***/
+
+ /* 80 */ 0x0000fcf5, 0x0000fcf6, 0x0000fcf7, 0x0000fcf8,
+ /* 84 */ 0x0000fcf9, 0x0000fcfa, 0x0000fcfb, 0x0000fcfc,
+ /* 88 */ 0x0000fcfd, 0x0000fcfe, 0x0000fda1, 0x0000fda2,
+ /* 8c */ 0x0000fda3, 0x0000fda4, 0x0000fda5, 0x0000fda6,
+ /* 90 */ 0x0000fda7, 0x0000fda8, 0x0000fda9, 0x0000fdaa,
+ /* 94 */ 0x0000fdab, 0x0000fdac, 0x0000fdad, 0x0000fdae,
+ /* 98 */ 0x0000fdaf, 0x0000fdb0, 0x0000fdb1, 0x0000fdb2,
+ /* 9c */ 0x0000fdb3, 0x0000fdb4, 0x0000fdb5, 0x0000fdb6,
+ /* a0 */ 0x0000fdb7, 0x0000fdb8, 0x0000fdb9, 0x0000fdba,
+ /* a4 */ 0x0000fdbb, 0x0000fdbc, 0x0000fdbd, 0x0000fdbe,
+ /* a8 */ 0x0000fdbf, 0x0000fdc0, 0x0000fdc1, 0x0000fdc2,
+ /* ac */ 0x0000fdc3, 0x0000fdc4, 0x0000fdc5, 0x0000fdc6,
+ /* b0 */ 0x0000fdc7, 0x0000fdc8, 0x0000fdc9, 0x0000fdca,
+ /* b4 */ 0x0000fdcb, 0x0000fdcc, 0x0000fdcd, 0x0000fdce,
+ /* b8 */ 0x0000fdcf, 0x0000fdd0, 0x0000fdd1, 0x0000fdd2,
+ /* bc */ 0x0000fdd3, 0x0000fdd4, 0x0000fdd5, 0x0000fdd6,
+
+ /*** Three byte table, leaf: ee91xx - offset 0x07595 ***/
+
+ /* 80 */ 0x0000fdd7, 0x0000fdd8, 0x0000fdd9, 0x0000fdda,
+ /* 84 */ 0x0000fddb, 0x0000fddc, 0x0000fddd, 0x0000fdde,
+ /* 88 */ 0x0000fddf, 0x0000fde0, 0x0000fde1, 0x0000fde2,
+ /* 8c */ 0x0000fde3, 0x0000fde4, 0x0000fde5, 0x0000fde6,
+ /* 90 */ 0x0000fde7, 0x0000fde8, 0x0000fde9, 0x0000fdea,
+ /* 94 */ 0x0000fdeb, 0x0000fdec, 0x0000fded, 0x0000fdee,
+ /* 98 */ 0x0000fdef, 0x0000fdf0, 0x0000fdf1, 0x0000fdf2,
+ /* 9c */ 0x0000fdf3, 0x0000fdf4, 0x0000fdf5, 0x0000fdf6,
+ /* a0 */ 0x0000fdf7, 0x0000fdf8, 0x0000fdf9, 0x0000fdfa,
+ /* a4 */ 0x0000fdfb, 0x0000fdfc, 0x0000fdfd, 0x0000fdfe,
+ /* a8 */ 0x0000fea1, 0x0000fea2, 0x0000fea3, 0x0000fea4,
+ /* ac */ 0x0000fea5, 0x0000fea6, 0x0000fea7, 0x0000fea8,
+ /* b0 */ 0x0000fea9, 0x0000feaa, 0x0000feab, 0x0000feac,
+ /* b4 */ 0x0000fead, 0x0000feae, 0x0000feaf, 0x0000feb0,
+ /* b8 */ 0x0000feb1, 0x0000feb2, 0x0000feb3, 0x0000feb4,
+ /* bc */ 0x0000feb5, 0x0000feb6, 0x0000feb7, 0x0000feb8,
+
+ /*** Three byte table, leaf: ee92xx - offset 0x075d5 ***/
+
+ /* 80 */ 0x0000feb9, 0x0000feba, 0x0000febb, 0x0000febc,
+ /* 84 */ 0x0000febd, 0x0000febe, 0x0000febf, 0x0000fec0,
+ /* 88 */ 0x0000fec1, 0x0000fec2, 0x0000fec3, 0x0000fec4,
+ /* 8c */ 0x0000fec5, 0x0000fec6, 0x0000fec7, 0x0000fec8,
+ /* 90 */ 0x0000fec9, 0x0000feca, 0x0000fecb, 0x0000fecc,
+ /* 94 */ 0x0000fecd, 0x0000fece, 0x0000fecf, 0x0000fed0,
+ /* 98 */ 0x0000fed1, 0x0000fed2, 0x0000fed3, 0x0000fed4,
+ /* 9c */ 0x0000fed5, 0x0000fed6, 0x0000fed7, 0x0000fed8,
+ /* a0 */ 0x0000fed9, 0x0000feda, 0x0000fedb, 0x0000fedc,
+ /* a4 */ 0x0000fedd, 0x0000fede, 0x0000fedf, 0x0000fee0,
+ /* a8 */ 0x0000fee1, 0x0000fee2, 0x0000fee3, 0x0000fee4,
+ /* ac */ 0x0000fee5, 0x0000fee6, 0x0000fee7, 0x0000fee8,
+ /* b0 */ 0x0000fee9, 0x0000feea, 0x0000feeb, 0x0000feec,
+ /* b4 */ 0x0000feed, 0x0000feee, 0x0000feef, 0x0000fef0,
+ /* b8 */ 0x0000fef1, 0x0000fef2, 0x0000fef3, 0x0000fef4,
+ /* bc */ 0x0000fef5, 0x0000fef6, 0x0000fef7, 0x0000fef8,
+
+ /*** Three byte table, leaf: ee93xx - offset 0x07615 ***/
+
+ /* 80 */ 0x0000fef9, 0x0000fefa, 0x0000fefb, 0x0000fefc,
+ /* 84 */ 0x0000fefd, 0x0000fefe, 0x0000a140, 0x0000a141,
+ /* 88 */ 0x0000a142, 0x0000a143, 0x0000a144, 0x0000a145,
+ /* 8c */ 0x0000a146, 0x0000a147, 0x0000a148, 0x0000a149,
+ /* 90 */ 0x0000a14a, 0x0000a14b, 0x0000a14c, 0x0000a14d,
+ /* 94 */ 0x0000a14e, 0x0000a14f, 0x0000a150, 0x0000a151,
+ /* 98 */ 0x0000a152, 0x0000a153, 0x0000a154, 0x0000a155,
+ /* 9c */ 0x0000a156, 0x0000a157, 0x0000a158, 0x0000a159,
+ /* a0 */ 0x0000a15a, 0x0000a15b, 0x0000a15c, 0x0000a15d,
+ /* a4 */ 0x0000a15e, 0x0000a15f, 0x0000a160, 0x0000a161,
+ /* a8 */ 0x0000a162, 0x0000a163, 0x0000a164, 0x0000a165,
+ /* ac */ 0x0000a166, 0x0000a167, 0x0000a168, 0x0000a169,
+ /* b0 */ 0x0000a16a, 0x0000a16b, 0x0000a16c, 0x0000a16d,
+ /* b4 */ 0x0000a16e, 0x0000a16f, 0x0000a170, 0x0000a171,
+ /* b8 */ 0x0000a172, 0x0000a173, 0x0000a174, 0x0000a175,
+ /* bc */ 0x0000a176, 0x0000a177, 0x0000a178, 0x0000a179,
+
+ /*** Three byte table, leaf: ee94xx - offset 0x07655 ***/
+
+ /* 80 */ 0x0000a17a, 0x0000a17b, 0x0000a17c, 0x0000a17d,
+ /* 84 */ 0x0000a17e, 0x0000a180, 0x0000a181, 0x0000a182,
+ /* 88 */ 0x0000a183, 0x0000a184, 0x0000a185, 0x0000a186,
+ /* 8c */ 0x0000a187, 0x0000a188, 0x0000a189, 0x0000a18a,
+ /* 90 */ 0x0000a18b, 0x0000a18c, 0x0000a18d, 0x0000a18e,
+ /* 94 */ 0x0000a18f, 0x0000a190, 0x0000a191, 0x0000a192,
+ /* 98 */ 0x0000a193, 0x0000a194, 0x0000a195, 0x0000a196,
+ /* 9c */ 0x0000a197, 0x0000a198, 0x0000a199, 0x0000a19a,
+ /* a0 */ 0x0000a19b, 0x0000a19c, 0x0000a19d, 0x0000a19e,
+ /* a4 */ 0x0000a19f, 0x0000a1a0, 0x0000a240, 0x0000a241,
+ /* a8 */ 0x0000a242, 0x0000a243, 0x0000a244, 0x0000a245,
+ /* ac */ 0x0000a246, 0x0000a247, 0x0000a248, 0x0000a249,
+ /* b0 */ 0x0000a24a, 0x0000a24b, 0x0000a24c, 0x0000a24d,
+ /* b4 */ 0x0000a24e, 0x0000a24f, 0x0000a250, 0x0000a251,
+ /* b8 */ 0x0000a252, 0x0000a253, 0x0000a254, 0x0000a255,
+ /* bc */ 0x0000a256, 0x0000a257, 0x0000a258, 0x0000a259,
+
+ /*** Three byte table, leaf: ee95xx - offset 0x07695 ***/
+
+ /* 80 */ 0x0000a25a, 0x0000a25b, 0x0000a25c, 0x0000a25d,
+ /* 84 */ 0x0000a25e, 0x0000a25f, 0x0000a260, 0x0000a261,
+ /* 88 */ 0x0000a262, 0x0000a263, 0x0000a264, 0x0000a265,
+ /* 8c */ 0x0000a266, 0x0000a267, 0x0000a268, 0x0000a269,
+ /* 90 */ 0x0000a26a, 0x0000a26b, 0x0000a26c, 0x0000a26d,
+ /* 94 */ 0x0000a26e, 0x0000a26f, 0x0000a270, 0x0000a271,
+ /* 98 */ 0x0000a272, 0x0000a273, 0x0000a274, 0x0000a275,
+ /* 9c */ 0x0000a276, 0x0000a277, 0x0000a278, 0x0000a279,
+ /* a0 */ 0x0000a27a, 0x0000a27b, 0x0000a27c, 0x0000a27d,
+ /* a4 */ 0x0000a27e, 0x0000a280, 0x0000a281, 0x0000a282,
+ /* a8 */ 0x0000a283, 0x0000a284, 0x0000a285, 0x0000a286,
+ /* ac */ 0x0000a287, 0x0000a288, 0x0000a289, 0x0000a28a,
+ /* b0 */ 0x0000a28b, 0x0000a28c, 0x0000a28d, 0x0000a28e,
+ /* b4 */ 0x0000a28f, 0x0000a290, 0x0000a291, 0x0000a292,
+ /* b8 */ 0x0000a293, 0x0000a294, 0x0000a295, 0x0000a296,
+ /* bc */ 0x0000a297, 0x0000a298, 0x0000a299, 0x0000a29a,
+
+ /*** Three byte table, leaf: ee96xx - offset 0x076d5 ***/
+
+ /* 80 */ 0x0000a29b, 0x0000a29c, 0x0000a29d, 0x0000a29e,
+ /* 84 */ 0x0000a29f, 0x0000a2a0, 0x0000a340, 0x0000a341,
+ /* 88 */ 0x0000a342, 0x0000a343, 0x0000a344, 0x0000a345,
+ /* 8c */ 0x0000a346, 0x0000a347, 0x0000a348, 0x0000a349,
+ /* 90 */ 0x0000a34a, 0x0000a34b, 0x0000a34c, 0x0000a34d,
+ /* 94 */ 0x0000a34e, 0x0000a34f, 0x0000a350, 0x0000a351,
+ /* 98 */ 0x0000a352, 0x0000a353, 0x0000a354, 0x0000a355,
+ /* 9c */ 0x0000a356, 0x0000a357, 0x0000a358, 0x0000a359,
+ /* a0 */ 0x0000a35a, 0x0000a35b, 0x0000a35c, 0x0000a35d,
+ /* a4 */ 0x0000a35e, 0x0000a35f, 0x0000a360, 0x0000a361,
+ /* a8 */ 0x0000a362, 0x0000a363, 0x0000a364, 0x0000a365,
+ /* ac */ 0x0000a366, 0x0000a367, 0x0000a368, 0x0000a369,
+ /* b0 */ 0x0000a36a, 0x0000a36b, 0x0000a36c, 0x0000a36d,
+ /* b4 */ 0x0000a36e, 0x0000a36f, 0x0000a370, 0x0000a371,
+ /* b8 */ 0x0000a372, 0x0000a373, 0x0000a374, 0x0000a375,
+ /* bc */ 0x0000a376, 0x0000a377, 0x0000a378, 0x0000a379,
+
+ /*** Three byte table, leaf: ee97xx - offset 0x07715 ***/
+
+ /* 80 */ 0x0000a37a, 0x0000a37b, 0x0000a37c, 0x0000a37d,
+ /* 84 */ 0x0000a37e, 0x0000a380, 0x0000a381, 0x0000a382,
+ /* 88 */ 0x0000a383, 0x0000a384, 0x0000a385, 0x0000a386,
+ /* 8c */ 0x0000a387, 0x0000a388, 0x0000a389, 0x0000a38a,
+ /* 90 */ 0x0000a38b, 0x0000a38c, 0x0000a38d, 0x0000a38e,
+ /* 94 */ 0x0000a38f, 0x0000a390, 0x0000a391, 0x0000a392,
+ /* 98 */ 0x0000a393, 0x0000a394, 0x0000a395, 0x0000a396,
+ /* 9c */ 0x0000a397, 0x0000a398, 0x0000a399, 0x0000a39a,
+ /* a0 */ 0x0000a39b, 0x0000a39c, 0x0000a39d, 0x0000a39e,
+ /* a4 */ 0x0000a39f, 0x0000a3a0, 0x0000a440, 0x0000a441,
+ /* a8 */ 0x0000a442, 0x0000a443, 0x0000a444, 0x0000a445,
+ /* ac */ 0x0000a446, 0x0000a447, 0x0000a448, 0x0000a449,
+ /* b0 */ 0x0000a44a, 0x0000a44b, 0x0000a44c, 0x0000a44d,
+ /* b4 */ 0x0000a44e, 0x0000a44f, 0x0000a450, 0x0000a451,
+ /* b8 */ 0x0000a452, 0x0000a453, 0x0000a454, 0x0000a455,
+ /* bc */ 0x0000a456, 0x0000a457, 0x0000a458, 0x0000a459,
+
+ /*** Three byte table, leaf: ee98xx - offset 0x07755 ***/
+
+ /* 80 */ 0x0000a45a, 0x0000a45b, 0x0000a45c, 0x0000a45d,
+ /* 84 */ 0x0000a45e, 0x0000a45f, 0x0000a460, 0x0000a461,
+ /* 88 */ 0x0000a462, 0x0000a463, 0x0000a464, 0x0000a465,
+ /* 8c */ 0x0000a466, 0x0000a467, 0x0000a468, 0x0000a469,
+ /* 90 */ 0x0000a46a, 0x0000a46b, 0x0000a46c, 0x0000a46d,
+ /* 94 */ 0x0000a46e, 0x0000a46f, 0x0000a470, 0x0000a471,
+ /* 98 */ 0x0000a472, 0x0000a473, 0x0000a474, 0x0000a475,
+ /* 9c */ 0x0000a476, 0x0000a477, 0x0000a478, 0x0000a479,
+ /* a0 */ 0x0000a47a, 0x0000a47b, 0x0000a47c, 0x0000a47d,
+ /* a4 */ 0x0000a47e, 0x0000a480, 0x0000a481, 0x0000a482,
+ /* a8 */ 0x0000a483, 0x0000a484, 0x0000a485, 0x0000a486,
+ /* ac */ 0x0000a487, 0x0000a488, 0x0000a489, 0x0000a48a,
+ /* b0 */ 0x0000a48b, 0x0000a48c, 0x0000a48d, 0x0000a48e,
+ /* b4 */ 0x0000a48f, 0x0000a490, 0x0000a491, 0x0000a492,
+ /* b8 */ 0x0000a493, 0x0000a494, 0x0000a495, 0x0000a496,
+ /* bc */ 0x0000a497, 0x0000a498, 0x0000a499, 0x0000a49a,
+
+ /*** Three byte table, leaf: ee99xx - offset 0x07795 ***/
+
+ /* 80 */ 0x0000a49b, 0x0000a49c, 0x0000a49d, 0x0000a49e,
+ /* 84 */ 0x0000a49f, 0x0000a4a0, 0x0000a540, 0x0000a541,
+ /* 88 */ 0x0000a542, 0x0000a543, 0x0000a544, 0x0000a545,
+ /* 8c */ 0x0000a546, 0x0000a547, 0x0000a548, 0x0000a549,
+ /* 90 */ 0x0000a54a, 0x0000a54b, 0x0000a54c, 0x0000a54d,
+ /* 94 */ 0x0000a54e, 0x0000a54f, 0x0000a550, 0x0000a551,
+ /* 98 */ 0x0000a552, 0x0000a553, 0x0000a554, 0x0000a555,
+ /* 9c */ 0x0000a556, 0x0000a557, 0x0000a558, 0x0000a559,
+ /* a0 */ 0x0000a55a, 0x0000a55b, 0x0000a55c, 0x0000a55d,
+ /* a4 */ 0x0000a55e, 0x0000a55f, 0x0000a560, 0x0000a561,
+ /* a8 */ 0x0000a562, 0x0000a563, 0x0000a564, 0x0000a565,
+ /* ac */ 0x0000a566, 0x0000a567, 0x0000a568, 0x0000a569,
+ /* b0 */ 0x0000a56a, 0x0000a56b, 0x0000a56c, 0x0000a56d,
+ /* b4 */ 0x0000a56e, 0x0000a56f, 0x0000a570, 0x0000a571,
+ /* b8 */ 0x0000a572, 0x0000a573, 0x0000a574, 0x0000a575,
+ /* bc */ 0x0000a576, 0x0000a577, 0x0000a578, 0x0000a579,
+
+ /*** Three byte table, leaf: ee9axx - offset 0x077d5 ***/
+
+ /* 80 */ 0x0000a57a, 0x0000a57b, 0x0000a57c, 0x0000a57d,
+ /* 84 */ 0x0000a57e, 0x0000a580, 0x0000a581, 0x0000a582,
+ /* 88 */ 0x0000a583, 0x0000a584, 0x0000a585, 0x0000a586,
+ /* 8c */ 0x0000a587, 0x0000a588, 0x0000a589, 0x0000a58a,
+ /* 90 */ 0x0000a58b, 0x0000a58c, 0x0000a58d, 0x0000a58e,
+ /* 94 */ 0x0000a58f, 0x0000a590, 0x0000a591, 0x0000a592,
+ /* 98 */ 0x0000a593, 0x0000a594, 0x0000a595, 0x0000a596,
+ /* 9c */ 0x0000a597, 0x0000a598, 0x0000a599, 0x0000a59a,
+ /* a0 */ 0x0000a59b, 0x0000a59c, 0x0000a59d, 0x0000a59e,
+ /* a4 */ 0x0000a59f, 0x0000a5a0, 0x0000a640, 0x0000a641,
+ /* a8 */ 0x0000a642, 0x0000a643, 0x0000a644, 0x0000a645,
+ /* ac */ 0x0000a646, 0x0000a647, 0x0000a648, 0x0000a649,
+ /* b0 */ 0x0000a64a, 0x0000a64b, 0x0000a64c, 0x0000a64d,
+ /* b4 */ 0x0000a64e, 0x0000a64f, 0x0000a650, 0x0000a651,
+ /* b8 */ 0x0000a652, 0x0000a653, 0x0000a654, 0x0000a655,
+ /* bc */ 0x0000a656, 0x0000a657, 0x0000a658, 0x0000a659,
+
+ /*** Three byte table, leaf: ee9bxx - offset 0x07815 ***/
+
+ /* 80 */ 0x0000a65a, 0x0000a65b, 0x0000a65c, 0x0000a65d,
+ /* 84 */ 0x0000a65e, 0x0000a65f, 0x0000a660, 0x0000a661,
+ /* 88 */ 0x0000a662, 0x0000a663, 0x0000a664, 0x0000a665,
+ /* 8c */ 0x0000a666, 0x0000a667, 0x0000a668, 0x0000a669,
+ /* 90 */ 0x0000a66a, 0x0000a66b, 0x0000a66c, 0x0000a66d,
+ /* 94 */ 0x0000a66e, 0x0000a66f, 0x0000a670, 0x0000a671,
+ /* 98 */ 0x0000a672, 0x0000a673, 0x0000a674, 0x0000a675,
+ /* 9c */ 0x0000a676, 0x0000a677, 0x0000a678, 0x0000a679,
+ /* a0 */ 0x0000a67a, 0x0000a67b, 0x0000a67c, 0x0000a67d,
+ /* a4 */ 0x0000a67e, 0x0000a680, 0x0000a681, 0x0000a682,
+ /* a8 */ 0x0000a683, 0x0000a684, 0x0000a685, 0x0000a686,
+ /* ac */ 0x0000a687, 0x0000a688, 0x0000a689, 0x0000a68a,
+ /* b0 */ 0x0000a68b, 0x0000a68c, 0x0000a68d, 0x0000a68e,
+ /* b4 */ 0x0000a68f, 0x0000a690, 0x0000a691, 0x0000a692,
+ /* b8 */ 0x0000a693, 0x0000a694, 0x0000a695, 0x0000a696,
+ /* bc */ 0x0000a697, 0x0000a698, 0x0000a699, 0x0000a69a,
+
+ /*** Three byte table, leaf: ee9cxx - offset 0x07855 ***/
+
+ /* 80 */ 0x0000a69b, 0x0000a69c, 0x0000a69d, 0x0000a69e,
+ /* 84 */ 0x0000a69f, 0x0000a6a0, 0x0000a740, 0x0000a741,
+ /* 88 */ 0x0000a742, 0x0000a743, 0x0000a744, 0x0000a745,
+ /* 8c */ 0x0000a746, 0x0000a747, 0x0000a748, 0x0000a749,
+ /* 90 */ 0x0000a74a, 0x0000a74b, 0x0000a74c, 0x0000a74d,
+ /* 94 */ 0x0000a74e, 0x0000a74f, 0x0000a750, 0x0000a751,
+ /* 98 */ 0x0000a752, 0x0000a753, 0x0000a754, 0x0000a755,
+ /* 9c */ 0x0000a756, 0x0000a757, 0x0000a758, 0x0000a759,
+ /* a0 */ 0x0000a75a, 0x0000a75b, 0x0000a75c, 0x0000a75d,
+ /* a4 */ 0x0000a75e, 0x0000a75f, 0x0000a760, 0x0000a761,
+ /* a8 */ 0x0000a762, 0x0000a763, 0x0000a764, 0x0000a765,
+ /* ac */ 0x0000a766, 0x0000a767, 0x0000a768, 0x0000a769,
+ /* b0 */ 0x0000a76a, 0x0000a76b, 0x0000a76c, 0x0000a76d,
+ /* b4 */ 0x0000a76e, 0x0000a76f, 0x0000a770, 0x0000a771,
+ /* b8 */ 0x0000a772, 0x0000a773, 0x0000a774, 0x0000a775,
+ /* bc */ 0x0000a776, 0x0000a777, 0x0000a778, 0x0000a779,
+
+ /*** Three byte table, leaf: ee9dxx - offset 0x07895 ***/
+
+ /* 80 */ 0x0000a77a, 0x0000a77b, 0x0000a77c, 0x0000a77d,
+ /* 84 */ 0x0000a77e, 0x0000a780, 0x0000a781, 0x0000a782,
+ /* 88 */ 0x0000a783, 0x0000a784, 0x0000a785, 0x0000a786,
+ /* 8c */ 0x0000a787, 0x0000a788, 0x0000a789, 0x0000a78a,
+ /* 90 */ 0x0000a78b, 0x0000a78c, 0x0000a78d, 0x0000a78e,
+ /* 94 */ 0x0000a78f, 0x0000a790, 0x0000a791, 0x0000a792,
+ /* 98 */ 0x0000a793, 0x0000a794, 0x0000a795, 0x0000a796,
+ /* 9c */ 0x0000a797, 0x0000a798, 0x0000a799, 0x0000a79a,
+ /* a0 */ 0x0000a79b, 0x0000a79c, 0x0000a79d, 0x0000a79e,
+ /* a4 */ 0x0000a79f, 0x0000a7a0, 0x0000a2ab, 0x0000a2ac,
+ /* a8 */ 0x0000a2ad, 0x0000a2ae, 0x0000a2af, 0x0000a2b0,
+ /* ac */ 0x8336c739, 0x0000a2e4, 0x0000a2ef, 0x0000a2f0,
+ /* b0 */ 0x0000a2fd, 0x0000a2fe, 0x0000a4f4, 0x0000a4f5,
+ /* b4 */ 0x0000a4f6, 0x0000a4f7, 0x0000a4f8, 0x0000a4f9,
+ /* b8 */ 0x0000a4fa, 0x0000a4fb, 0x0000a4fc, 0x0000a4fd,
+ /* bc */ 0x0000a4fe, 0x0000a5f7, 0x0000a5f8, 0x0000a5f9,
+
+ /*** Three byte table, leaf: ee9exx - offset 0x078d5 ***/
+
+ /* 80 */ 0x0000a5fa, 0x0000a5fb, 0x0000a5fc, 0x0000a5fd,
+ /* 84 */ 0x0000a5fe, 0x0000a6b9, 0x0000a6ba, 0x0000a6bb,
+ /* 88 */ 0x0000a6bc, 0x0000a6bd, 0x0000a6be, 0x0000a6bf,
+ /* 8c */ 0x0000a6c0, 0x0000a6d9, 0x0000a6da, 0x0000a6db,
+ /* 90 */ 0x0000a6dc, 0x0000a6dd, 0x0000a6de, 0x0000a6df,
+ /* 94 */ 0x0000a6ec, 0x0000a6ed, 0x0000a6f3, 0x0000a6f6,
+ /* 98 */ 0x0000a6f7, 0x0000a6f8, 0x0000a6f9, 0x0000a6fa,
+ /* 9c */ 0x0000a6fb, 0x0000a6fc, 0x0000a6fd, 0x0000a6fe,
+ /* a0 */ 0x0000a7c2, 0x0000a7c3, 0x0000a7c4, 0x0000a7c5,
+ /* a4 */ 0x0000a7c6, 0x0000a7c7, 0x0000a7c8, 0x0000a7c9,
+ /* a8 */ 0x0000a7ca, 0x0000a7cb, 0x0000a7cc, 0x0000a7cd,
+ /* ac */ 0x0000a7ce, 0x0000a7cf, 0x0000a7d0, 0x0000a7f2,
+ /* b0 */ 0x0000a7f3, 0x0000a7f4, 0x0000a7f5, 0x0000a7f6,
+ /* b4 */ 0x0000a7f7, 0x0000a7f8, 0x0000a7f9, 0x0000a7fa,
+ /* b8 */ 0x0000a7fb, 0x0000a7fc, 0x0000a7fd, 0x0000a7fe,
+ /* bc */ 0x0000a896, 0x0000a897, 0x0000a898, 0x0000a899,
+
+ /*** Three byte table, leaf: ee9fxx - offset 0x07915 ***/
+
+ /* 80 */ 0x0000a89a, 0x0000a89b, 0x0000a89c, 0x0000a89d,
+ /* 84 */ 0x0000a89e, 0x0000a89f, 0x0000a8a0, 0x0000a8bc,
+ /* 88 */ 0x8336c830, 0x0000a8c1, 0x0000a8c2, 0x0000a8c3,
+ /* 8c */ 0x0000a8c4, 0x0000a8ea, 0x0000a8eb, 0x0000a8ec,
+ /* 90 */ 0x0000a8ed, 0x0000a8ee, 0x0000a8ef, 0x0000a8f0,
+ /* 94 */ 0x0000a8f1, 0x0000a8f2, 0x0000a8f3, 0x0000a8f4,
+ /* 98 */ 0x0000a8f5, 0x0000a8f6, 0x0000a8f7, 0x0000a8f8,
+ /* 9c */ 0x0000a8f9, 0x0000a8fa, 0x0000a8fb, 0x0000a8fc,
+ /* a0 */ 0x0000a8fd, 0x0000a8fe, 0x0000a958, 0x0000a95b,
+ /* a4 */ 0x0000a95d, 0x0000a95e, 0x0000a95f, 0x8336c831,
+ /* a8 */ 0x8336c832, 0x8336c833, 0x8336c834, 0x8336c835,
+ /* ac */ 0x8336c836, 0x8336c837, 0x8336c838, 0x8336c839,
+ /* b0 */ 0x8336c930, 0x8336c931, 0x8336c932, 0x8336c933,
+ /* b4 */ 0x0000a997, 0x0000a998, 0x0000a999, 0x0000a99a,
+ /* b8 */ 0x0000a99b, 0x0000a99c, 0x0000a99d, 0x0000a99e,
+ /* bc */ 0x0000a99f, 0x0000a9a0, 0x0000a9a1, 0x0000a9a2,
+
+ /*** Three byte table, leaf: eea0xx - offset 0x07955 ***/
+
+ /* 80 */ 0x0000a9a3, 0x0000a9f0, 0x0000a9f1, 0x0000a9f2,
+ /* 84 */ 0x0000a9f3, 0x0000a9f4, 0x0000a9f5, 0x0000a9f6,
+ /* 88 */ 0x0000a9f7, 0x0000a9f8, 0x0000a9f9, 0x0000a9fa,
+ /* 8c */ 0x0000a9fb, 0x0000a9fc, 0x0000a9fd, 0x0000a9fe,
+ /* 90 */ 0x0000d7fa, 0x0000d7fb, 0x0000d7fc, 0x0000d7fd,
+ /* 94 */ 0x0000d7fe, 0x8336c934, 0x0000fe51, 0x0000fe52,
+ /* 98 */ 0x0000fe53, 0x8336c935, 0x8336c936, 0x8336c937,
+ /* 9c */ 0x8336c938, 0x8336c939, 0x0000fe59, 0x8336ca30,
+ /* a0 */ 0x8336ca31, 0x8336ca32, 0x8336ca33, 0x8336ca34,
+ /* a4 */ 0x8336ca35, 0x8336ca36, 0x0000fe61, 0x8336ca37,
+ /* a8 */ 0x8336ca38, 0x8336ca39, 0x8336cb30, 0x0000fe66,
+ /* ac */ 0x0000fe67, 0x8336cb31, 0x8336cb32, 0x8336cb33,
+ /* b0 */ 0x8336cb34, 0x0000fe6c, 0x0000fe6d, 0x8336cb35,
+ /* b4 */ 0x8336cb36, 0x8336cb37, 0x8336cb38, 0x8336cb39,
+ /* b8 */ 0x8336cc30, 0x8336cc31, 0x8336cc32, 0x0000fe76,
+ /* bc */ 0x8336cc33, 0x8336cc34, 0x8336cc35, 0x8336cc36,
+
+ /*** Three byte table, leaf: eea1xx - offset 0x07995 ***/
+
+ /* 80 */ 0x8336cc37, 0x8336cc38, 0x8336cc39, 0x0000fe7e,
+ /* 84 */ 0x8336cd30, 0x8336cd31, 0x8336cd32, 0x8336cd33,
+ /* 88 */ 0x8336cd34, 0x8336cd35, 0x8336cd36, 0x8336cd37,
+ /* 8c */ 0x8336cd38, 0x8336cd39, 0x8336ce30, 0x8336ce31,
+ /* 90 */ 0x8336ce32, 0x8336ce33, 0x8336ce34, 0x8336ce35,
+ /* 94 */ 0x0000fe90, 0x0000fe91, 0x8336ce36, 0x8336ce37,
+ /* 98 */ 0x8336ce38, 0x8336ce39, 0x8336cf30, 0x8336cf31,
+ /* 9c */ 0x8336cf32, 0x8336cf33, 0x8336cf34, 0x8336cf35,
+ /* a0 */ 0x8336cf36, 0x8336cf37, 0x8336cf38, 0x8336cf39,
+ /* a4 */ 0x0000fea0,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x079ba ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x0000fd9c, 0x84308535, 0x84308536, 0x84308537,
+ /* b0 */ 0x84308538, 0x84308539, 0x84308630, 0x84308631,
+ /* b4 */ 0x84308632, 0x84308633, 0x84308634, 0x84308635,
+ /* b8 */ 0x84308636, 0x84308637, 0x84308638, 0x84308639,
+ /* bc */ 0x84308730, 0x84308731, 0x84308732, 0x84308733,
+
+ /*** Three byte table, leaf: efa5xx - offset 0x079fa ***/
+
+ /* 80 */ 0x84308734, 0x84308735, 0x84308736, 0x84308737,
+ /* 84 */ 0x84308738, 0x84308739, 0x84308830, 0x84308831,
+ /* 88 */ 0x84308832, 0x84308833, 0x84308834, 0x84308835,
+ /* 8c */ 0x84308836, 0x84308837, 0x84308838, 0x84308839,
+ /* 90 */ 0x84308930, 0x84308931, 0x84308932, 0x84308933,
+ /* 94 */ 0x84308934, 0x84308935, 0x84308936, 0x84308937,
+ /* 98 */ 0x84308938, 0x84308939, 0x84308a30, 0x84308a31,
+ /* 9c */ 0x84308a32, 0x84308a33, 0x84308a34, 0x84308a35,
+ /* a0 */ 0x84308a36, 0x84308a37, 0x84308a38, 0x84308a39,
+ /* a4 */ 0x84308b30, 0x84308b31, 0x84308b32, 0x84308b33,
+ /* a8 */ 0x84308b34, 0x84308b35, 0x84308b36, 0x84308b37,
+ /* ac */ 0x84308b38, 0x84308b39, 0x84308c30, 0x84308c31,
+ /* b0 */ 0x84308c32, 0x84308c33, 0x84308c34, 0x84308c35,
+ /* b4 */ 0x84308c36, 0x84308c37, 0x84308c38, 0x84308c39,
+ /* b8 */ 0x84308d30, 0x0000fd9d, 0x84308d31, 0x84308d32,
+ /* bc */ 0x84308d33, 0x84308d34, 0x84308d35, 0x84308d36,
+
+ /*** Three byte table, leaf: efa6xx - offset 0x07a3a ***/
+
+ /* 80 */ 0x84308d37, 0x84308d38, 0x84308d39, 0x84308e30,
+ /* 84 */ 0x84308e31, 0x84308e32, 0x84308e33, 0x84308e34,
+ /* 88 */ 0x84308e35, 0x84308e36, 0x84308e37, 0x84308e38,
+ /* 8c */ 0x84308e39, 0x84308f30, 0x84308f31, 0x84308f32,
+ /* 90 */ 0x84308f33, 0x84308f34, 0x84308f35, 0x84308f36,
+ /* 94 */ 0x84308f37, 0x0000fd9e, 0x84308f38, 0x84308f39,
+ /* 98 */ 0x84309030, 0x84309031, 0x84309032, 0x84309033,
+ /* 9c */ 0x84309034, 0x84309035, 0x84309036, 0x84309037,
+ /* a0 */ 0x84309038, 0x84309039, 0x84309130, 0x84309131,
+ /* a4 */ 0x84309132, 0x84309133, 0x84309134, 0x84309135,
+ /* a8 */ 0x84309136, 0x84309137, 0x84309138, 0x84309139,
+ /* ac */ 0x84309230, 0x84309231, 0x84309232, 0x84309233,
+ /* b0 */ 0x84309234, 0x84309235, 0x84309236, 0x84309237,
+ /* b4 */ 0x84309238, 0x84309239, 0x84309330, 0x84309331,
+ /* b8 */ 0x84309332, 0x84309333, 0x84309334, 0x84309335,
+ /* bc */ 0x84309336, 0x84309337, 0x84309338, 0x84309339,
+
+ /*** Three byte table, leaf: efa7xx - offset 0x07a7a ***/
+
+ /* 80 */ 0x84309430, 0x84309431, 0x84309432, 0x84309433,
+ /* 84 */ 0x84309434, 0x84309435, 0x84309436, 0x84309437,
+ /* 88 */ 0x84309438, 0x84309439, 0x84309530, 0x84309531,
+ /* 8c */ 0x84309532, 0x84309533, 0x84309534, 0x84309535,
+ /* 90 */ 0x84309536, 0x84309537, 0x84309538, 0x84309539,
+ /* 94 */ 0x84309630, 0x84309631, 0x84309632, 0x84309633,
+ /* 98 */ 0x84309634, 0x84309635, 0x84309636, 0x84309637,
+ /* 9c */ 0x84309638, 0x84309639, 0x84309730, 0x84309731,
+ /* a0 */ 0x84309732, 0x84309733, 0x84309734, 0x84309735,
+ /* a4 */ 0x84309736, 0x84309737, 0x84309738, 0x0000fd9f,
+ /* a8 */ 0x84309739, 0x84309830, 0x84309831, 0x84309832,
+ /* ac */ 0x84309833, 0x84309834, 0x84309835, 0x84309836,
+ /* b0 */ 0x84309837, 0x0000fda0, 0x84309838, 0x84309839,
+ /* b4 */ 0x84309930, 0x84309931, 0x84309932, 0x84309933,
+ /* b8 */ 0x84309934, 0x84309935, 0x84309936, 0x84309937,
+ /* bc */ 0x84309938, 0x84309939, 0x84309a30, 0x84309a31,
+
+ /*** Three byte table, leaf: efa8xx - offset 0x07aba ***/
+
+ /* 80 */ 0x84309a32, 0x84309a33, 0x84309a34, 0x84309a35,
+ /* 84 */ 0x84309a36, 0x84309a37, 0x84309a38, 0x84309a39,
+ /* 88 */ 0x84309b30, 0x84309b31, 0x84309b32, 0x84309b33,
+ /* 8c */ 0x0000fe40, 0x0000fe41, 0x0000fe42, 0x0000fe43,
+ /* 90 */ 0x84309b34, 0x0000fe44, 0x84309b35, 0x0000fe45,
+ /* 94 */ 0x0000fe46, 0x84309b36, 0x84309b37, 0x84309b38,
+ /* 98 */ 0x0000fe47, 0x84309b39, 0x84309c30, 0x84309c31,
+ /* 9c */ 0x84309c32, 0x84309c33, 0x84309c34, 0x0000fe48,
+ /* a0 */ 0x0000fe49, 0x0000fe4a, 0x84309c35, 0x0000fe4b,
+ /* a4 */ 0x0000fe4c, 0x84309c36, 0x84309c37, 0x0000fe4d,
+ /* a8 */ 0x0000fe4e, 0x0000fe4f,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb8xx - offset 0x07ae4 ***/
+
+ /* 80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 84 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 88 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 8c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 90 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 94 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 98 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* 9c */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x0000a955, 0x0000a6f2, 0x84318538, 0x0000a6f4,
+ /* b4 */ 0x0000a6f5, 0x0000a6e0, 0x0000a6e1, 0x0000a6f0,
+ /* b8 */ 0x0000a6f1, 0x0000a6e2, 0x0000a6e3, 0x0000a6ee,
+ /* bc */ 0x0000a6ef, 0x0000a6e6, 0x0000a6e7, 0x0000a6e4,
+
+ /*** Three byte table, leaf: efb9xx - offset 0x07b24 ***/
+
+ /* 80 */ 0x0000a6e5, 0x0000a6e8, 0x0000a6e9, 0x0000a6ea,
+ /* 84 */ 0x0000a6eb, 0x84318539, 0x84318630, 0x84318631,
+ /* 88 */ 0x84318632, 0x0000a968, 0x0000a969, 0x0000a96a,
+ /* 8c */ 0x0000a96b, 0x0000a96c, 0x0000a96d, 0x0000a96e,
+ /* 90 */ 0x0000a96f, 0x0000a970, 0x0000a971, 0x84318633,
+ /* 94 */ 0x0000a972, 0x0000a973, 0x0000a974, 0x0000a975,
+ /* 98 */ 0x84318634, 0x0000a976, 0x0000a977, 0x0000a978,
+ /* 9c */ 0x0000a979, 0x0000a97a, 0x0000a97b, 0x0000a97c,
+ /* a0 */ 0x0000a97d, 0x0000a97e, 0x0000a980, 0x0000a981,
+ /* a4 */ 0x0000a982, 0x0000a983, 0x0000a984, 0x84318635,
+ /* a8 */ 0x0000a985, 0x0000a986, 0x0000a987, 0x0000a988,
+ /* ac */ 0x84318636, 0x84318637, 0x84318638, 0x84318639,
+ /* b0 */ 0x84318730, 0x84318731, 0x84318732, 0x84318733,
+ /* b4 */ 0x84318734, 0x84318735, 0x84318736, 0x84318737,
+ /* b8 */ 0x84318738, 0x84318739, 0x84318830, 0x84318831,
+ /* bc */ 0x84318832, 0x84318833, 0x84318834, 0x84318835,
+
+ /*** Three byte table, leaf: efbaxx - offset 0x07b64 ***/
+
+ /* 80 */ 0x84318836, 0x84318837, 0x84318838, 0x84318839,
+ /* 84 */ 0x84318930, 0x84318931, 0x84318932, 0x84318933,
+ /* 88 */ 0x84318934, 0x84318935, 0x84318936, 0x84318937,
+ /* 8c */ 0x84318938, 0x84318939, 0x84318a30, 0x84318a31,
+ /* 90 */ 0x84318a32, 0x84318a33, 0x84318a34, 0x84318a35,
+ /* 94 */ 0x84318a36, 0x84318a37, 0x84318a38, 0x84318a39,
+ /* 98 */ 0x84318b30, 0x84318b31, 0x84318b32, 0x84318b33,
+ /* 9c */ 0x84318b34, 0x84318b35, 0x84318b36, 0x84318b37,
+ /* a0 */ 0x84318b38, 0x84318b39, 0x84318c30, 0x84318c31,
+ /* a4 */ 0x84318c32, 0x84318c33, 0x84318c34, 0x84318c35,
+ /* a8 */ 0x84318c36, 0x84318c37, 0x84318c38, 0x84318c39,
+ /* ac */ 0x84318d30, 0x84318d31, 0x84318d32, 0x84318d33,
+ /* b0 */ 0x84318d34, 0x84318d35, 0x84318d36, 0x84318d37,
+ /* b4 */ 0x84318d38, 0x84318d39, 0x84318e30, 0x84318e31,
+ /* b8 */ 0x84318e32, 0x84318e33, 0x84318e34, 0x84318e35,
+ /* bc */ 0x84318e36, 0x84318e37, 0x84318e38, 0x84318e39,
+
+ /*** Three byte table, leaf: efbbxx - offset 0x07ba4 ***/
+
+ /* 80 */ 0x84318f30, 0x84318f31, 0x84318f32, 0x84318f33,
+ /* 84 */ 0x84318f34, 0x84318f35, 0x84318f36, 0x84318f37,
+ /* 88 */ 0x84318f38, 0x84318f39, 0x84319030, 0x84319031,
+ /* 8c */ 0x84319032, 0x84319033, 0x84319034, 0x84319035,
+ /* 90 */ 0x84319036, 0x84319037, 0x84319038, 0x84319039,
+ /* 94 */ 0x84319130, 0x84319131, 0x84319132, 0x84319133,
+ /* 98 */ 0x84319134, 0x84319135, 0x84319136, 0x84319137,
+ /* 9c */ 0x84319138, 0x84319139, 0x84319230, 0x84319231,
+ /* a0 */ 0x84319232, 0x84319233, 0x84319234, 0x84319235,
+ /* a4 */ 0x84319236, 0x84319237, 0x84319238, 0x84319239,
+ /* a8 */ 0x84319330, 0x84319331, 0x84319332, 0x84319333,
+ /* ac */ 0x84319334, 0x84319335, 0x84319336, 0x84319337,
+ /* b0 */ 0x84319338, 0x84319339, 0x84319430, 0x84319431,
+ /* b4 */ 0x84319432, 0x84319433, 0x84319434, 0x84319435,
+ /* b8 */ 0x84319436, 0x84319437, 0x84319438, 0x84319439,
+ /* bc */ 0x84319530, 0x84319531, 0x84319532, 0x84319533,
+
+ /*** Three byte table, leaf: efbcxx - offset 0x07be4 ***/
+
+ /* 80 */ 0x84319534, 0x0000a3a1, 0x0000a3a2, 0x0000a3a3,
+ /* 84 */ 0x0000a1e7, 0x0000a3a5, 0x0000a3a6, 0x0000a3a7,
+ /* 88 */ 0x0000a3a8, 0x0000a3a9, 0x0000a3aa, 0x0000a3ab,
+ /* 8c */ 0x0000a3ac, 0x0000a3ad, 0x0000a3ae, 0x0000a3af,
+ /* 90 */ 0x0000a3b0, 0x0000a3b1, 0x0000a3b2, 0x0000a3b3,
+ /* 94 */ 0x0000a3b4, 0x0000a3b5, 0x0000a3b6, 0x0000a3b7,
+ /* 98 */ 0x0000a3b8, 0x0000a3b9, 0x0000a3ba, 0x0000a3bb,
+ /* 9c */ 0x0000a3bc, 0x0000a3bd, 0x0000a3be, 0x0000a3bf,
+ /* a0 */ 0x0000a3c0, 0x0000a3c1, 0x0000a3c2, 0x0000a3c3,
+ /* a4 */ 0x0000a3c4, 0x0000a3c5, 0x0000a3c6, 0x0000a3c7,
+ /* a8 */ 0x0000a3c8, 0x0000a3c9, 0x0000a3ca, 0x0000a3cb,
+ /* ac */ 0x0000a3cc, 0x0000a3cd, 0x0000a3ce, 0x0000a3cf,
+ /* b0 */ 0x0000a3d0, 0x0000a3d1, 0x0000a3d2, 0x0000a3d3,
+ /* b4 */ 0x0000a3d4, 0x0000a3d5, 0x0000a3d6, 0x0000a3d7,
+ /* b8 */ 0x0000a3d8, 0x0000a3d9, 0x0000a3da, 0x0000a3db,
+ /* bc */ 0x0000a3dc, 0x0000a3dd, 0x0000a3de, 0x0000a3df,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x07c24 ***/
+
+ /* 80 */ 0x0000a3e0, 0x0000a3e1, 0x0000a3e2, 0x0000a3e3,
+ /* 84 */ 0x0000a3e4, 0x0000a3e5, 0x0000a3e6, 0x0000a3e7,
+ /* 88 */ 0x0000a3e8, 0x0000a3e9, 0x0000a3ea, 0x0000a3eb,
+ /* 8c */ 0x0000a3ec, 0x0000a3ed, 0x0000a3ee, 0x0000a3ef,
+ /* 90 */ 0x0000a3f0, 0x0000a3f1, 0x0000a3f2, 0x0000a3f3,
+ /* 94 */ 0x0000a3f4, 0x0000a3f5, 0x0000a3f6, 0x0000a3f7,
+ /* 98 */ 0x0000a3f8, 0x0000a3f9, 0x0000a3fa, 0x0000a3fb,
+ /* 9c */ 0x0000a3fc, 0x0000a3fd, 0x0000a1ab, 0x84319535,
+ /* a0 */ 0x84319536, 0x84319537, 0x84319538, 0x84319539,
+ /* a4 */ 0x84319630, 0x84319631, 0x84319632, 0x84319633,
+ /* a8 */ 0x84319634, 0x84319635, 0x84319636, 0x84319637,
+ /* ac */ 0x84319638, 0x84319639, 0x84319730, 0x84319731,
+ /* b0 */ 0x84319732, 0x84319733, 0x84319734, 0x84319735,
+ /* b4 */ 0x84319736, 0x84319737, 0x84319738, 0x84319739,
+ /* b8 */ 0x84319830, 0x84319831, 0x84319832, 0x84319833,
+ /* bc */ 0x84319834, 0x84319835, 0x84319836, 0x84319837,
+
+ /*** Three byte table, leaf: efbexx - offset 0x07c64 ***/
+
+ /* 80 */ 0x84319838, 0x84319839, 0x84319930, 0x84319931,
+ /* 84 */ 0x84319932, 0x84319933, 0x84319934, 0x84319935,
+ /* 88 */ 0x84319936, 0x84319937, 0x84319938, 0x84319939,
+ /* 8c */ 0x84319a30, 0x84319a31, 0x84319a32, 0x84319a33,
+ /* 90 */ 0x84319a34, 0x84319a35, 0x84319a36, 0x84319a37,
+ /* 94 */ 0x84319a38, 0x84319a39, 0x84319b30, 0x84319b31,
+ /* 98 */ 0x84319b32, 0x84319b33, 0x84319b34, 0x84319b35,
+ /* 9c */ 0x84319b36, 0x84319b37, 0x84319b38, 0x84319b39,
+ /* a0 */ 0x84319c30, 0x84319c31, 0x84319c32, 0x84319c33,
+ /* a4 */ 0x84319c34, 0x84319c35, 0x84319c36, 0x84319c37,
+ /* a8 */ 0x84319c38, 0x84319c39, 0x84319d30, 0x84319d31,
+ /* ac */ 0x84319d32, 0x84319d33, 0x84319d34, 0x84319d35,
+ /* b0 */ 0x84319d36, 0x84319d37, 0x84319d38, 0x84319d39,
+ /* b4 */ 0x84319e30, 0x84319e31, 0x84319e32, 0x84319e33,
+ /* b8 */ 0x84319e34, 0x84319e35, 0x84319e36, 0x84319e37,
+ /* bc */ 0x84319e38, 0x84319e39, 0x84319f30, 0x84319f31,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x07ca4 ***/
+
+ /* 80 */ 0x84319f32, 0x84319f33, 0x84319f34, 0x84319f35,
+ /* 84 */ 0x84319f36, 0x84319f37, 0x84319f38, 0x84319f39,
+ /* 88 */ 0x8431a030, 0x8431a031, 0x8431a032, 0x8431a033,
+ /* 8c */ 0x8431a034, 0x8431a035, 0x8431a036, 0x8431a037,
+ /* 90 */ 0x8431a038, 0x8431a039, 0x8431a130, 0x8431a131,
+ /* 94 */ 0x8431a132, 0x8431a133, 0x8431a134, 0x8431a135,
+ /* 98 */ 0x8431a136, 0x8431a137, 0x8431a138, 0x8431a139,
+ /* 9c */ 0x8431a230, 0x8431a231, 0x8431a232, 0x8431a233,
+ /* a0 */ 0x0000a1e9, 0x0000a1ea, 0x0000a956, 0x0000a3fe,
+ /* a4 */ 0x0000a957, 0x0000a3a4, 0x00000000, 0x00000000,
+ /* a8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* ac */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b4 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* b8 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ /* bc */ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_gbk.map b/src/backend/utils/mb/Unicode/utf8_to_gbk.map
new file mode 100644
index 0000000..cf12b4a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_gbk.map
@@ -0,0 +1,4271 @@
+/* src/backend/utils/mb/Unicode/utf8_to_gbk.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 gbk_from_unicode_tree_table[24198];
+
+static const pg_mb_radix_tree gbk_from_unicode_tree =
+{
+ gbk_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x02cb, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 gbk_from_unicode_tree_table[24198] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0088, 0x00c7, 0x0103, 0x0000, 0x0135, 0x0000, 0x0164,
+ /* ca */ 0x0000, 0x019d, 0x0000, 0x0000, 0x01cc, 0x020c, 0x024b, 0x028b,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e8, 0x0000, 0x0000, 0xa1ec,
+ /* a8 */ 0xa1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa1e3, 0xa1c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a4,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00088 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8a4, 0xa8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xa8a8, 0xa8a6, 0xa8ba, 0x0000, 0xa8ac, 0xa8aa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa8b0, 0xa8ae, 0x0000, 0x0000, 0x0000, 0xa1c2,
+ /* b8 */ 0x0000, 0xa8b4, 0xa8b2, 0x0000, 0xa8b9, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c7 ***/
+
+ /* 80 */ 0x0000, 0xa8a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa8a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa8a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa8a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x00103 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ad, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa8b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x00135 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a3, 0x0000,
+ /* 90 */ 0xa8ab, 0x0000, 0xa8af, 0x0000, 0xa8b3, 0x0000, 0xa8b5, 0x0000,
+ /* 98 */ 0xa8b6, 0x0000, 0xa8b7, 0x0000, 0xa8b8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c9xx - offset 0x00164 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x0019d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a6,
+ /* 88 */ 0x0000, 0xa1a5, 0xa840, 0xa841, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x001cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6, 0xa6a7,
+ /* 98 */ 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae, 0xa6af,
+ /* a0 */ 0xa6b0, 0xa6b1, 0x0000, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6,
+ /* a8 */ 0xa6b7, 0xa6b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7,
+ /* b8 */ 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf,
+
+ /*** Two byte table, leaf: cfxx - offset 0x0020c ***/
+
+ /* 80 */ 0xa6d0, 0xa6d1, 0x0000, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6,
+ /* 88 */ 0xa6d7, 0xa6d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0024b ***/
+
+ /* 80 */ 0x0000, 0xa7a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4, 0xa7a5, 0xa7a6, 0xa7a8, 0xa7a9,
+ /* 98 */ 0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1,
+ /* a0 */ 0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5, 0xa7b6, 0xa7b7, 0xa7b8, 0xa7b9,
+ /* a8 */ 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd, 0xa7be, 0xa7bf, 0xa7c0, 0xa7c1,
+ /* b0 */ 0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d8, 0xa7d9,
+ /* b8 */ 0xa7da, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de, 0xa7df, 0xa7e0, 0xa7e1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x0028b ***/
+
+ /* 80 */ 0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0xa7e7, 0xa7e8, 0xa7e9,
+ /* 88 */ 0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed, 0xa7ee, 0xa7ef, 0xa7f0, 0xa7f1,
+ /* 90 */ 0x0000, 0xa7d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x002cb ***/
+
+ /* e2 */ 0x02d9, 0x0319, 0x0329, 0x0369, 0x03a9, 0x03e9, 0x0429, 0x0469,
+ /* ea */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04a8,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x002d9 ***/
+
+ /* 80 */ 0x04e8, 0x0000, 0x0524, 0x0000, 0x0561, 0x0583, 0x05bd, 0x0000,
+ /* 88 */ 0x05f5, 0x0633, 0x0663, 0x0000, 0x06a3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x06c3, 0x0703, 0x0000, 0x0743, 0x0783, 0x07c2, 0x0800,
+ /* 98 */ 0x083b, 0x087b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x00319 ***/
+
+ /* 80 */ 0x08bb, 0x08fa, 0x093a, 0x097a, 0x09b9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x09e3, 0x0000, 0x0a15, 0x0000, 0x0000, 0x0000, 0x0a47, 0x0a83,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x00329 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0ac3, 0x0b03, 0x0b43, 0x0b83, 0x0bc3, 0x0c03, 0x0c43, 0x0c83,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00369 ***/
+
+ /* 80 */ 0x0cc3, 0x0d03, 0x0d43, 0x0d83, 0x0dc3, 0x0e03, 0x0e43, 0x0e83,
+ /* 88 */ 0x0ec3, 0x0f03, 0x0f43, 0x0f83, 0x0fc3, 0x1003, 0x1043, 0x1083,
+ /* 90 */ 0x10c3, 0x1103, 0x1143, 0x1183, 0x11c3, 0x1203, 0x1243, 0x1283,
+ /* 98 */ 0x12c3, 0x1303, 0x1343, 0x1383, 0x13c3, 0x1403, 0x1443, 0x1483,
+ /* a0 */ 0x14c3, 0x1503, 0x1543, 0x1583, 0x15c3, 0x1603, 0x1643, 0x1683,
+ /* a8 */ 0x16c3, 0x1703, 0x1743, 0x1783, 0x17c3, 0x1803, 0x1843, 0x1883,
+ /* b0 */ 0x18c3, 0x1903, 0x1943, 0x1983, 0x19c3, 0x1a03, 0x1a43, 0x1a83,
+ /* b8 */ 0x1ac3, 0x1b03, 0x1b43, 0x1b83, 0x1bc3, 0x1c03, 0x1c43, 0x1c83,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x003a9 ***/
+
+ /* 80 */ 0x1cc3, 0x1d03, 0x1d43, 0x1d83, 0x1dc3, 0x1e03, 0x1e43, 0x1e83,
+ /* 88 */ 0x1ec3, 0x1f03, 0x1f43, 0x1f83, 0x1fc3, 0x2003, 0x2043, 0x2083,
+ /* 90 */ 0x20c3, 0x2103, 0x2143, 0x2183, 0x21c3, 0x2203, 0x2243, 0x2283,
+ /* 98 */ 0x22c3, 0x2303, 0x2343, 0x2383, 0x23c3, 0x2403, 0x2443, 0x2483,
+ /* a0 */ 0x24c3, 0x2503, 0x2543, 0x2583, 0x25c3, 0x2603, 0x2643, 0x2683,
+ /* a8 */ 0x26c3, 0x2703, 0x2743, 0x2783, 0x27c3, 0x2803, 0x2843, 0x2883,
+ /* b0 */ 0x28c3, 0x2903, 0x2943, 0x2983, 0x29c3, 0x2a03, 0x2a43, 0x2a83,
+ /* b8 */ 0x2ac3, 0x2b03, 0x2b43, 0x2b83, 0x2bc3, 0x2c03, 0x2c43, 0x2c83,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x003e9 ***/
+
+ /* 80 */ 0x2cc3, 0x2d03, 0x2d43, 0x2d83, 0x2dc3, 0x2e03, 0x2e43, 0x2e83,
+ /* 88 */ 0x2ec3, 0x2f03, 0x2f43, 0x2f83, 0x2fc3, 0x3003, 0x3043, 0x3083,
+ /* 90 */ 0x30c3, 0x3103, 0x3143, 0x3183, 0x31c3, 0x3203, 0x3243, 0x3283,
+ /* 98 */ 0x32c3, 0x3303, 0x3343, 0x3383, 0x33c3, 0x3403, 0x3443, 0x3483,
+ /* a0 */ 0x34c3, 0x3503, 0x3543, 0x3583, 0x35c3, 0x3603, 0x3643, 0x3683,
+ /* a8 */ 0x36c3, 0x3703, 0x3743, 0x3783, 0x37c3, 0x3803, 0x3843, 0x3883,
+ /* b0 */ 0x38c3, 0x3903, 0x3943, 0x3983, 0x39c3, 0x3a03, 0x3a43, 0x3a83,
+ /* b8 */ 0x3ac3, 0x3b03, 0x3b43, 0x3b83, 0x3bc3, 0x3c03, 0x3c43, 0x3c83,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x00429 ***/
+
+ /* 80 */ 0x3cc3, 0x3d03, 0x3d43, 0x3d83, 0x3dc3, 0x3e03, 0x3e43, 0x3e83,
+ /* 88 */ 0x3ec3, 0x3f03, 0x3f43, 0x3f83, 0x3fc3, 0x4003, 0x4043, 0x4083,
+ /* 90 */ 0x40c3, 0x4103, 0x4143, 0x4183, 0x41c3, 0x4203, 0x4243, 0x4283,
+ /* 98 */ 0x42c3, 0x4303, 0x4343, 0x4383, 0x43c3, 0x4403, 0x4443, 0x4483,
+ /* a0 */ 0x44c3, 0x4503, 0x4543, 0x4583, 0x45c3, 0x4603, 0x4643, 0x4683,
+ /* a8 */ 0x46c3, 0x4703, 0x4743, 0x4783, 0x47c3, 0x4803, 0x4843, 0x4883,
+ /* b0 */ 0x48c3, 0x4903, 0x4943, 0x4983, 0x49c3, 0x4a03, 0x4a43, 0x4a83,
+ /* b8 */ 0x4ac3, 0x4b03, 0x4b43, 0x4b83, 0x4bc3, 0x4c03, 0x4c43, 0x4c83,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00469 ***/
+
+ /* 80 */ 0x4cc3, 0x4d03, 0x4d43, 0x4d83, 0x4dc3, 0x4e03, 0x4e43, 0x4e83,
+ /* 88 */ 0x4ec3, 0x4f03, 0x4f43, 0x4f83, 0x4fc3, 0x5003, 0x5043, 0x5083,
+ /* 90 */ 0x50c3, 0x5103, 0x5143, 0x5183, 0x51c3, 0x5203, 0x5243, 0x5283,
+ /* 98 */ 0x52c3, 0x5303, 0x5343, 0x5383, 0x53c3, 0x5403, 0x5443, 0x5483,
+ /* a0 */ 0x54c3, 0x5503, 0x5543, 0x5583, 0x55c3, 0x5603, 0x5643, 0x5683,
+ /* a8 */ 0x56c3, 0x5703, 0x5743, 0x5783, 0x57c3, 0x5803, 0x5843, 0x5883,
+ /* b0 */ 0x58c3, 0x5903, 0x5943, 0x5983, 0x59c3, 0x5a03, 0x5a43, 0x5a83,
+ /* b8 */ 0x5ac3, 0x5b03, 0x5b43, 0x5b83, 0x5bc3, 0x5c03, 0x5c43,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x004a8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x5c69, 0x5c96, 0x5cd0, 0x5ce9,
+ /* a8 */ 0x5d1d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x5d47, 0x5d87, 0x0000, 0x0000, 0x5dc6, 0x5e06, 0x0000, 0x5e46,
+
+ /*** Three byte table, leaf: e280xx - offset 0x004e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa95c, 0x0000, 0x0000, 0xa843, 0xa1aa, 0xa844, 0xa1ac, 0x0000,
+ /* 98 */ 0xa1ae, 0xa1af, 0x0000, 0x0000, 0xa1b0, 0xa1b1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa845, 0xa1ad, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa1eb, 0x0000, 0xa1e4, 0xa1e5, 0x0000, 0xa846, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1f9,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e282xx - offset 0x00524 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x00561 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xa1e6, 0x0000, 0xa847, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ed, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa959,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00583 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8,
+ /* a8 */ 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa2a1, 0xa2a2, 0xa2a3, 0xa2a4, 0xa2a5, 0xa2a6, 0xa2a7, 0xa2a8,
+ /* b8 */ 0xa2a9, 0xa2aa,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x005bd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa1fb, 0xa1fc, 0xa1fa, 0xa1fd, 0x0000, 0x0000, 0xa849, 0xa84a,
+ /* 98 */ 0xa84b, 0xa84c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e288xx - offset 0x005f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c7,
+ /* 90 */ 0x0000, 0xa1c6, 0x0000, 0x0000, 0x0000, 0xa84d, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa1cc, 0x0000, 0x0000, 0xa1d8, 0xa1de, 0xa84e,
+ /* a0 */ 0xa1cf, 0x0000, 0x0000, 0xa84f, 0x0000, 0xa1ce, 0x0000, 0xa1c4,
+ /* a8 */ 0xa1c5, 0xa1c9, 0xa1c8, 0xa1d2, 0x0000, 0x0000, 0xa1d3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e0, 0xa1df, 0xa1c3, 0xa1cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d7,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x00633 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1d6, 0x0000, 0x0000, 0x0000, 0xa1d5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1d9, 0xa1d4, 0x0000, 0x0000, 0xa1dc, 0xa1dd, 0xa851, 0xa852,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1da, 0xa1db,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x00663 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa892, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1cd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa853,
+
+ /*** Three byte table, leaf: e28cxx - offset 0x006a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x006c3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0,
+ /* a8 */ 0xa2e1, 0xa2e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8,
+ /* b8 */ 0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0,
+
+ /*** Three byte table, leaf: e292xx - offset 0x00703 ***/
+
+ /* 80 */ 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8,
+ /* 88 */ 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8,
+ /* 90 */ 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0,
+ /* 98 */ 0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00743 ***/
+
+ /* 80 */ 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8, 0xa9a9, 0xa9aa, 0xa9ab,
+ /* 88 */ 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b1, 0xa9b2, 0xa9b3,
+ /* 90 */ 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb,
+ /* 98 */ 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9c1, 0xa9c2, 0xa9c3,
+ /* a0 */ 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb,
+ /* a8 */ 0xa9cc, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d2, 0xa9d3,
+ /* b0 */ 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9, 0xa9da, 0xa9db,
+ /* b8 */ 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0, 0xa9e1, 0xa9e2, 0xa9e3,
+
+ /*** Three byte table, leaf: e295xx - offset 0x00783 ***/
+
+ /* 80 */ 0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, 0xa9e8, 0xa9e9, 0xa9ea, 0xa9eb,
+ /* 88 */ 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b,
+ /* 98 */ 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863,
+ /* a0 */ 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b,
+ /* a8 */ 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873,
+ /* b0 */ 0xa874, 0xa875, 0xa876, 0xa877, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x007c2 ***/
+
+ /* 80 */ 0x0000, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e,
+ /* 88 */ 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa888, 0xa889, 0xa88a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1f6, 0xa1f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1f8, 0xa1f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa88b, 0xa88c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x00800 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1f4, 0xa1f3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xa1f0, 0x0000, 0x0000, 0xa1f2, 0xa1f1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x0083b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ef, 0xa1ee, 0x0000,
+ /* 88 */ 0x0000, 0xa891, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x0087b ***/
+
+ /* 80 */ 0xa1e2, 0x0000, 0xa1e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x008bb ***/
+
+ /* 80 */ 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0x0000, 0xa1a9, 0xa965, 0xa996,
+ /* 88 */ 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
+ /* 90 */ 0xa1be, 0xa1bf, 0xa893, 0xa1fe, 0xa1b2, 0xa1b3, 0xa1bc, 0xa1bd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa894, 0xa895, 0x0000,
+ /* a0 */ 0x0000, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946,
+ /* a8 */ 0xa947, 0xa948, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x008fa ***/
+
+ /* 80 */ 0x0000, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7,
+ /* 88 */ 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af,
+ /* 90 */ 0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7,
+ /* 98 */ 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf,
+ /* a0 */ 0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7,
+ /* a8 */ 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf,
+ /* b0 */ 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7,
+ /* b8 */ 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df,
+
+ /*** Three byte table, leaf: e382xx - offset 0x0093a ***/
+
+ /* 80 */ 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7,
+ /* 88 */ 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef,
+ /* 90 */ 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa961, 0xa962, 0xa966, 0xa967, 0x0000,
+ /* a0 */ 0x0000, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7,
+ /* a8 */ 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae, 0xa5af,
+ /* b0 */ 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7,
+ /* b8 */ 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be, 0xa5bf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x0097a ***/
+
+ /* 80 */ 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7,
+ /* 88 */ 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf,
+ /* 90 */ 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7,
+ /* 98 */ 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de, 0xa5df,
+ /* a0 */ 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7,
+ /* a8 */ 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef,
+ /* b0 */ 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa960, 0xa963, 0xa964,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x009b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8c5, 0xa8c6, 0xa8c7,
+ /* 88 */ 0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0xa8cd, 0xa8ce, 0xa8cf,
+ /* 90 */ 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7,
+ /* 98 */ 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc, 0xa8dd, 0xa8de, 0xa8df,
+ /* a0 */ 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7,
+ /* a8 */ 0xa8e8, 0xa8e9,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e388xx - offset 0x009e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec,
+ /* a8 */ 0xa2ed, 0xa2ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa95a,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x00a15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xa949, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00a47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa94a, 0xa94b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa94c, 0xa94d, 0xa94e, 0x0000,
+ /* a0 */ 0x0000, 0xa94f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00a83 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa950, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa951, 0x0000,
+ /* 90 */ 0x0000, 0xa952, 0xa953, 0x0000, 0x0000, 0xa954, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00ac3 ***/
+
+ /* 80 */ 0xd2bb, 0xb6a1, 0x8140, 0xc6df, 0x8141, 0x8142, 0x8143, 0xcdf2,
+ /* 88 */ 0xd5c9, 0xc8fd, 0xc9cf, 0xcfc2, 0xd8a2, 0xb2bb, 0xd3eb, 0x8144,
+ /* 90 */ 0xd8a4, 0xb3f3, 0x8145, 0xd7a8, 0xc7d2, 0xd8a7, 0xcac0, 0x8146,
+ /* 98 */ 0xc7f0, 0xb1fb, 0xd2b5, 0xb4d4, 0xb6ab, 0xcbbf, 0xd8a9, 0x8147,
+ /* a0 */ 0x8148, 0x8149, 0xb6aa, 0x814a, 0xc1bd, 0xd1cf, 0x814b, 0xc9a5,
+ /* a8 */ 0xd8ad, 0x814c, 0xb8f6, 0xd1be, 0xe3dc, 0xd6d0, 0x814d, 0x814e,
+ /* b0 */ 0xb7e1, 0x814f, 0xb4ae, 0x8150, 0xc1d9, 0x8151, 0xd8bc, 0x8152,
+ /* b8 */ 0xcde8, 0xb5a4, 0xceaa, 0xd6f7, 0x8153, 0xc0f6, 0xbed9, 0xd8af,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00b03 ***/
+
+ /* 80 */ 0x8154, 0x8155, 0x8156, 0xc4cb, 0x8157, 0xbec3, 0x8158, 0xd8b1,
+ /* 88 */ 0xc3b4, 0xd2e5, 0x8159, 0xd6ae, 0xceda, 0xd5a7, 0xbaf5, 0xb7a6,
+ /* 90 */ 0xc0d6, 0x815a, 0xc6b9, 0xc5d2, 0xc7c7, 0x815b, 0xb9d4, 0x815c,
+ /* 98 */ 0xb3cb, 0xd2d2, 0x815d, 0x815e, 0xd8bf, 0xbec5, 0xc6f2, 0xd2b2,
+ /* a0 */ 0xcfb0, 0xcfe7, 0x815f, 0x8160, 0x8161, 0x8162, 0xcae9, 0x8163,
+ /* a8 */ 0x8164, 0xd8c0, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a,
+ /* b0 */ 0xc2f2, 0xc2d2, 0x816b, 0xc8e9, 0x816c, 0x816d, 0x816e, 0x816f,
+ /* b8 */ 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0xc7ac, 0x8176,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00b43 ***/
+
+ /* 80 */ 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0xc1cb, 0x817d,
+ /* 88 */ 0xd3e8, 0xd5f9, 0x817e, 0xcac2, 0xb6fe, 0xd8a1, 0xd3da, 0xbff7,
+ /* 90 */ 0x8180, 0xd4c6, 0xbba5, 0xd8c1, 0xcee5, 0xbeae, 0x8181, 0x8182,
+ /* 98 */ 0xd8a8, 0x8183, 0xd1c7, 0xd0a9, 0x8184, 0x8185, 0x8186, 0xd8bd,
+ /* a0 */ 0xd9ef, 0xcdf6, 0xbfba, 0x8187, 0xbdbb, 0xbaa5, 0xd2e0, 0xb2fa,
+ /* a8 */ 0xbae0, 0xc4b6, 0x8188, 0xcfed, 0xbea9, 0xcda4, 0xc1c1, 0x8189,
+ /* b0 */ 0x818a, 0x818b, 0xc7d7, 0xd9f1, 0x818c, 0xd9f4, 0x818d, 0x818e,
+ /* b8 */ 0x818f, 0x8190, 0xc8cb, 0xd8e9, 0x8191, 0x8192, 0x8193, 0xd2da,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00b83 ***/
+
+ /* 80 */ 0xcab2, 0xc8ca, 0xd8ec, 0xd8ea, 0xd8c6, 0xbdf6, 0xc6cd, 0xb3f0,
+ /* 88 */ 0x8194, 0xd8eb, 0xbdf1, 0xbde9, 0x8195, 0xc8d4, 0xb4d3, 0x8196,
+ /* 90 */ 0x8197, 0xc2d8, 0x8198, 0xb2d6, 0xd7d0, 0xcacb, 0xcbfb, 0xd5cc,
+ /* 98 */ 0xb8b6, 0xcfc9, 0x8199, 0x819a, 0x819b, 0xd9da, 0xd8f0, 0xc7aa,
+ /* a0 */ 0x819c, 0xd8ee, 0x819d, 0xb4fa, 0xc1ee, 0xd2d4, 0x819e, 0x819f,
+ /* a8 */ 0xd8ed, 0x81a0, 0xd2c7, 0xd8ef, 0xc3c7, 0x81a1, 0x81a2, 0x81a3,
+ /* b0 */ 0xd1f6, 0x81a4, 0xd6d9, 0xd8f2, 0x81a5, 0xd8f5, 0xbcfe, 0xbcdb,
+ /* b8 */ 0x81a6, 0x81a7, 0x81a8, 0xc8ce, 0x81a9, 0xb7dd, 0x81aa, 0xb7c2,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00bc3 ***/
+
+ /* 80 */ 0x81ab, 0xc6f3, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1,
+ /* 88 */ 0x81b2, 0xd8f8, 0xd2c1, 0x81b3, 0x81b4, 0xcee9, 0xbcbf, 0xb7fc,
+ /* 90 */ 0xb7a5, 0xd0dd, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0xd6da,
+ /* 98 */ 0xd3c5, 0xbbef, 0xbbe1, 0xd8f1, 0x81ba, 0x81bb, 0xc9a1, 0xceb0,
+ /* a0 */ 0xb4ab, 0x81bc, 0xd8f3, 0x81bd, 0xc9cb, 0xd8f6, 0xc2d7, 0xd8f7,
+ /* a8 */ 0x81be, 0x81bf, 0xceb1, 0xd8f9, 0x81c0, 0x81c1, 0x81c2, 0xb2ae,
+ /* b0 */ 0xb9c0, 0x81c3, 0xd9a3, 0x81c4, 0xb0e9, 0x81c5, 0xc1e6, 0x81c6,
+ /* b8 */ 0xc9ec, 0x81c7, 0xcbc5, 0x81c8, 0xcbc6, 0xd9a4, 0x81c9, 0x81ca,
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00c03 ***/
+
+ /* 80 */ 0x81cb, 0x81cc, 0x81cd, 0xb5e8, 0x81ce, 0x81cf, 0xb5ab, 0x81d0,
+ /* 88 */ 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0xcebb, 0xb5cd, 0xd7a1,
+ /* 90 */ 0xd7f4, 0xd3d3, 0x81d6, 0xcce5, 0x81d7, 0xbace, 0x81d8, 0xd9a2,
+ /* 98 */ 0xd9dc, 0xd3e0, 0xd8fd, 0xb7f0, 0xd7f7, 0xd8fe, 0xd8fa, 0xd9a1,
+ /* a0 */ 0xc4e3, 0x81d9, 0x81da, 0xd3b6, 0xd8f4, 0xd9dd, 0x81db, 0xd8fb,
+ /* a8 */ 0x81dc, 0xc5e5, 0x81dd, 0x81de, 0xc0d0, 0x81df, 0x81e0, 0xd1f0,
+ /* b0 */ 0xb0db, 0x81e1, 0x81e2, 0xbcd1, 0xd9a6, 0x81e3, 0xd9a5, 0x81e4,
+ /* b8 */ 0x81e5, 0x81e6, 0x81e7, 0xd9ac, 0xd9ae, 0x81e8, 0xd9ab, 0xcab9,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00c43 ***/
+
+ /* 80 */ 0x81e9, 0x81ea, 0x81eb, 0xd9a9, 0xd6b6, 0x81ec, 0x81ed, 0x81ee,
+ /* 88 */ 0xb3de, 0xd9a8, 0x81ef, 0xc0fd, 0x81f0, 0xcacc, 0x81f1, 0xd9aa,
+ /* 90 */ 0x81f2, 0xd9a7, 0x81f3, 0x81f4, 0xd9b0, 0x81f5, 0x81f6, 0xb6b1,
+ /* 98 */ 0x81f7, 0x81f8, 0x81f9, 0xb9a9, 0x81fa, 0xd2c0, 0x81fb, 0x81fc,
+ /* a0 */ 0xcfc0, 0x81fd, 0x81fe, 0xc2c2, 0x8240, 0xbdc4, 0xd5ec, 0xb2e0,
+ /* a8 */ 0xc7c8, 0xbfeb, 0xd9ad, 0x8241, 0xd9af, 0x8242, 0xceea, 0xbaee,
+ /* b0 */ 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xc7d6, 0x8248, 0x8249,
+ /* b8 */ 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0xb1e3,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00c83 ***/
+
+ /* 80 */ 0x8251, 0x8252, 0x8253, 0xb4d9, 0xb6ed, 0xd9b4, 0x8254, 0x8255,
+ /* 88 */ 0x8256, 0x8257, 0xbfa1, 0x8258, 0x8259, 0x825a, 0xd9de, 0xc7ce,
+ /* 90 */ 0xc0fe, 0xd9b8, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0xcbd7,
+ /* 98 */ 0xb7fd, 0x8260, 0xd9b5, 0x8261, 0xd9b7, 0xb1a3, 0xd3e1, 0xd9b9,
+ /* a0 */ 0x8262, 0xd0c5, 0x8263, 0xd9b6, 0x8264, 0x8265, 0xd9b1, 0x8266,
+ /* a8 */ 0xd9b2, 0xc1a9, 0xd9b3, 0x8267, 0x8268, 0xbcf3, 0xd0de, 0xb8a9,
+ /* b0 */ 0x8269, 0xbee3, 0x826a, 0xd9bd, 0x826b, 0x826c, 0x826d, 0x826e,
+ /* b8 */ 0xd9ba, 0x826f, 0xb0b3, 0x8270, 0x8271, 0x8272, 0xd9c2, 0x8273,
+
+ /*** Three byte table, leaf: e580xx - offset 0x00cc3 ***/
+
+ /* 80 */ 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b,
+ /* 88 */ 0x827c, 0x827d, 0x827e, 0x8280, 0xd9c4, 0xb1b6, 0x8281, 0xd9bf,
+ /* 90 */ 0x8282, 0x8283, 0xb5b9, 0x8284, 0xbef3, 0x8285, 0x8286, 0x8287,
+ /* 98 */ 0xccc8, 0xbaf2, 0xd2d0, 0x8288, 0xd9c3, 0x8289, 0x828a, 0xbde8,
+ /* a0 */ 0x828b, 0xb3ab, 0x828c, 0x828d, 0x828e, 0xd9c5, 0xbeeb, 0x828f,
+ /* a8 */ 0xd9c6, 0xd9bb, 0xc4df, 0x8290, 0xd9be, 0xd9c1, 0xd9c0, 0x8291,
+ /* b0 */ 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299,
+ /* b8 */ 0x829a, 0x829b, 0xd5ae, 0x829c, 0xd6b5, 0x829d, 0xc7e3, 0x829e,
+
+ /*** Three byte table, leaf: e581xx - offset 0x00d03 ***/
+
+ /* 80 */ 0x829f, 0x82a0, 0x82a1, 0xd9c8, 0x82a2, 0x82a3, 0x82a4, 0xbcd9,
+ /* 88 */ 0xd9ca, 0x82a5, 0x82a6, 0x82a7, 0xd9bc, 0x82a8, 0xd9cb, 0xc6ab,
+ /* 90 */ 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0xd9c9, 0x82ae, 0x82af,
+ /* 98 */ 0x82b0, 0x82b1, 0xd7f6, 0x82b2, 0xcda3, 0x82b3, 0x82b4, 0x82b5,
+ /* a0 */ 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0xbda1, 0x82bb, 0x82bc,
+ /* a8 */ 0x82bd, 0x82be, 0x82bf, 0x82c0, 0xd9cc, 0x82c1, 0x82c2, 0x82c3,
+ /* b0 */ 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0xc5bc, 0xcdb5,
+ /* b8 */ 0x82ca, 0x82cb, 0x82cc, 0xd9cd, 0x82cd, 0x82ce, 0xd9c7, 0xb3a5,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00d43 ***/
+
+ /* 80 */ 0xbffe, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0xb8b5, 0x82d3, 0x82d4,
+ /* 88 */ 0xc0fc, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0xb0f8, 0x82d9, 0x82da,
+ /* 90 */ 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2,
+ /* 98 */ 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea,
+ /* a0 */ 0x82eb, 0x82ec, 0x82ed, 0xb4f6, 0x82ee, 0xd9ce, 0x82ef, 0xd9cf,
+ /* a8 */ 0xb4a2, 0xd9d0, 0x82f0, 0x82f1, 0xb4df, 0x82f2, 0x82f3, 0x82f4,
+ /* b0 */ 0x82f5, 0x82f6, 0xb0c1, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb,
+ /* b8 */ 0x82fc, 0x82fd, 0xd9d1, 0xc9b5, 0x82fe, 0x8340, 0x8341, 0x8342,
+
+ /*** Three byte table, leaf: e583xx - offset 0x00d83 ***/
+
+ /* 80 */ 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a,
+ /* 88 */ 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0xcff1,
+ /* 90 */ 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0xd9d2, 0x8358,
+ /* 98 */ 0x8359, 0x835a, 0xc1c5, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f,
+ /* a0 */ 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0xd9d6, 0xc9ae,
+ /* a8 */ 0x8366, 0x8367, 0x8368, 0x8369, 0xd9d5, 0xd9d4, 0xd9d7, 0x836a,
+ /* b0 */ 0x836b, 0x836c, 0x836d, 0xcbdb, 0x836e, 0xbda9, 0x836f, 0x8370,
+ /* b8 */ 0x8371, 0x8372, 0x8373, 0xc6a7, 0x8374, 0x8375, 0x8376, 0x8377,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00dc3 ***/
+
+ /* 80 */ 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0xd9d3, 0xd9d8,
+ /* 88 */ 0x837e, 0x8380, 0x8381, 0xd9d9, 0x8382, 0x8383, 0x8384, 0x8385,
+ /* 90 */ 0x8386, 0x8387, 0xc8e5, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c,
+ /* 98 */ 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394,
+ /* a0 */ 0x8395, 0xc0dc, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b,
+ /* a8 */ 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3,
+ /* b0 */ 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab,
+ /* b8 */ 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0xb6f9,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00e03 ***/
+
+ /* 80 */ 0xd8a3, 0xd4ca, 0x83b3, 0xd4aa, 0xd0d6, 0xb3e4, 0xd5d7, 0x83b4,
+ /* 88 */ 0xcfc8, 0xb9e2, 0x83b5, 0xbfcb, 0x83b6, 0xc3e2, 0x83b7, 0x83b8,
+ /* 90 */ 0x83b9, 0xb6d2, 0x83ba, 0x83bb, 0xcdc3, 0xd9ee, 0xd9f0, 0x83bc,
+ /* 98 */ 0x83bd, 0x83be, 0xb5b3, 0x83bf, 0xb6b5, 0x83c0, 0x83c1, 0x83c2,
+ /* a0 */ 0x83c3, 0x83c4, 0xbea4, 0x83c5, 0x83c6, 0xc8eb, 0x83c7, 0x83c8,
+ /* a8 */ 0xc8ab, 0x83c9, 0x83ca, 0xb0cb, 0xb9ab, 0xc1f9, 0xd9e2, 0x83cb,
+ /* b0 */ 0xc0bc, 0xb9b2, 0x83cc, 0xb9d8, 0xd0cb, 0xb1f8, 0xc6e4, 0xbedf,
+ /* b8 */ 0xb5e4, 0xd7c8, 0x83cd, 0xd1f8, 0xbce6, 0xcade, 0x83ce, 0x83cf,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00e43 ***/
+
+ /* 80 */ 0xbcbd, 0xd9e6, 0xd8e7, 0x83d0, 0x83d1, 0xc4da, 0x83d2, 0x83d3,
+ /* 88 */ 0xb8d4, 0xc8bd, 0x83d4, 0x83d5, 0xb2e1, 0xd4d9, 0x83d6, 0x83d7,
+ /* 90 */ 0x83d8, 0x83d9, 0xc3b0, 0x83da, 0x83db, 0xc3e1, 0xdaa2, 0xc8df,
+ /* 98 */ 0x83dc, 0xd0b4, 0x83dd, 0xbefc, 0xc5a9, 0x83de, 0x83df, 0x83e0,
+ /* a0 */ 0xb9da, 0x83e1, 0xdaa3, 0x83e2, 0xd4a9, 0xdaa4, 0x83e3, 0x83e4,
+ /* a8 */ 0x83e5, 0x83e6, 0x83e7, 0xd9fb, 0xb6ac, 0x83e8, 0x83e9, 0xb7eb,
+ /* b0 */ 0xb1f9, 0xd9fc, 0xb3e5, 0xbef6, 0x83ea, 0xbff6, 0xd2b1, 0xc0e4,
+ /* b8 */ 0x83eb, 0x83ec, 0x83ed, 0xb6b3, 0xd9fe, 0xd9fd, 0x83ee, 0x83ef,
+
+ /*** Three byte table, leaf: e587xx - offset 0x00e83 ***/
+
+ /* 80 */ 0xbebb, 0x83f0, 0x83f1, 0x83f2, 0xc6e0, 0x83f3, 0xd7bc, 0xdaa1,
+ /* 88 */ 0x83f4, 0xc1b9, 0x83f5, 0xb5f2, 0xc1e8, 0x83f6, 0x83f7, 0xbcf5,
+ /* 90 */ 0x83f8, 0xb4d5, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe,
+ /* 98 */ 0x8440, 0x8441, 0x8442, 0xc1dd, 0x8443, 0xc4fd, 0x8444, 0x8445,
+ /* a0 */ 0xbcb8, 0xb7b2, 0x8446, 0x8447, 0xb7ef, 0x8448, 0x8449, 0x844a,
+ /* a8 */ 0x844b, 0x844c, 0x844d, 0xd9ec, 0x844e, 0xc6be, 0x844f, 0xbfad,
+ /* b0 */ 0xbbcb, 0x8450, 0x8451, 0xb5ca, 0x8452, 0xdbc9, 0xd0d7, 0x8453,
+ /* b8 */ 0xcdb9, 0xb0bc, 0xb3f6, 0xbbf7, 0xdbca, 0xbaaf, 0x8454, 0xd4e4,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00ec3 ***/
+
+ /* 80 */ 0xb5b6, 0xb5f3, 0xd8d6, 0xc8d0, 0x8455, 0x8456, 0xb7d6, 0xc7d0,
+ /* 88 */ 0xd8d7, 0x8457, 0xbfaf, 0x8458, 0x8459, 0xdbbb, 0xd8d8, 0x845a,
+ /* 90 */ 0x845b, 0xd0cc, 0xbbae, 0x845c, 0x845d, 0x845e, 0xebbe, 0xc1d0,
+ /* 98 */ 0xc1f5, 0xd4f2, 0xb8d5, 0xb4b4, 0x845f, 0xb3f5, 0x8460, 0x8461,
+ /* a0 */ 0xc9be, 0x8462, 0x8463, 0x8464, 0xc5d0, 0x8465, 0x8466, 0x8467,
+ /* a8 */ 0xc5d9, 0xc0fb, 0x8468, 0xb1f0, 0x8469, 0xd8d9, 0xb9ce, 0x846a,
+ /* b0 */ 0xb5bd, 0x846b, 0x846c, 0xd8da, 0x846d, 0x846e, 0xd6c6, 0xcba2,
+ /* b8 */ 0xc8af, 0xc9b2, 0xb4cc, 0xbfcc, 0x846f, 0xb9f4, 0x8470, 0xd8db,
+
+ /*** Three byte table, leaf: e589xx - offset 0x00f03 ***/
+
+ /* 80 */ 0xd8dc, 0xb6e7, 0xbcc1, 0xccea, 0x8471, 0x8472, 0x8473, 0x8474,
+ /* 88 */ 0x8475, 0x8476, 0xcff7, 0x8477, 0xd8dd, 0xc7b0, 0x8478, 0x8479,
+ /* 90 */ 0xb9d0, 0xbda3, 0x847a, 0x847b, 0xccde, 0x847c, 0xc6ca, 0x847d,
+ /* 98 */ 0x847e, 0x8480, 0x8481, 0x8482, 0xd8e0, 0x8483, 0xd8de, 0x8484,
+ /* a0 */ 0x8485, 0xd8df, 0x8486, 0x8487, 0x8488, 0xb0fe, 0x8489, 0xbee7,
+ /* a8 */ 0x848a, 0xcaa3, 0xbcf4, 0x848b, 0x848c, 0x848d, 0x848e, 0xb8b1,
+ /* b0 */ 0x848f, 0x8490, 0xb8ee, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495,
+ /* b8 */ 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0xd8e2, 0x849b, 0xbdcb,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00f43 ***/
+
+ /* 80 */ 0x849c, 0xd8e4, 0xd8e3, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1,
+ /* 88 */ 0xc5fc, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8,
+ /* 90 */ 0xd8e5, 0x84a9, 0x84aa, 0xd8e6, 0x84ab, 0x84ac, 0x84ad, 0x84ae,
+ /* 98 */ 0x84af, 0x84b0, 0x84b1, 0xc1a6, 0x84b2, 0xc8b0, 0xb0ec, 0xb9a6,
+ /* a0 */ 0xbcd3, 0xcef1, 0xdbbd, 0xc1d3, 0x84b3, 0x84b4, 0x84b5, 0x84b6,
+ /* a8 */ 0xb6af, 0xd6fa, 0xc5ac, 0xbdd9, 0xdbbe, 0xdbbf, 0x84b7, 0x84b8,
+ /* b0 */ 0x84b9, 0xc0f8, 0xbea2, 0xc0cd, 0x84ba, 0x84bb, 0x84bc, 0x84bd,
+ /* b8 */ 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0xdbc0, 0xcac6,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00f83 ***/
+
+ /* 80 */ 0x84c4, 0x84c5, 0x84c6, 0xb2aa, 0x84c7, 0x84c8, 0x84c9, 0xd3c2,
+ /* 88 */ 0x84ca, 0xc3e3, 0x84cb, 0xd1ab, 0x84cc, 0x84cd, 0x84ce, 0x84cf,
+ /* 90 */ 0xdbc2, 0x84d0, 0xc0d5, 0x84d1, 0x84d2, 0x84d3, 0xdbc3, 0x84d4,
+ /* 98 */ 0xbfb1, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0xc4bc,
+ /* a0 */ 0x84db, 0x84dc, 0x84dd, 0x84de, 0xc7da, 0x84df, 0x84e0, 0x84e1,
+ /* a8 */ 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9,
+ /* b0 */ 0xdbc4, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0,
+ /* b8 */ 0x84f1, 0xd9e8, 0xc9d7, 0x84f2, 0x84f3, 0x84f4, 0xb9b4, 0xcef0,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00fc3 ***/
+
+ /* 80 */ 0xd4c8, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0xb0fc, 0xb4d2, 0x84f9,
+ /* 88 */ 0xd0d9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0xd9e9, 0x84fe, 0xdecb,
+ /* 90 */ 0xd9eb, 0x8540, 0x8541, 0x8542, 0x8543, 0xd8b0, 0xbbaf, 0xb1b1,
+ /* 98 */ 0x8544, 0xb3d7, 0xd8ce, 0x8545, 0x8546, 0xd4d1, 0x8547, 0x8548,
+ /* a0 */ 0xbdb3, 0xbfef, 0x8549, 0xcfbb, 0x854a, 0x854b, 0xd8d0, 0x854c,
+ /* a8 */ 0x854d, 0x854e, 0xb7cb, 0x854f, 0x8550, 0x8551, 0xd8d1, 0x8552,
+ /* b0 */ 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a,
+ /* b8 */ 0x855b, 0xc6a5, 0xc7f8, 0xd2bd, 0x855c, 0x855d, 0xd8d2, 0xc4e4,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x01003 ***/
+
+ /* 80 */ 0x855e, 0xcaae, 0x855f, 0xc7a7, 0x8560, 0xd8a6, 0x8561, 0xc9fd,
+ /* 88 */ 0xcee7, 0xbbdc, 0xb0eb, 0x8562, 0x8563, 0x8564, 0xbbaa, 0xd0ad,
+ /* 90 */ 0x8565, 0xb1b0, 0xd7e4, 0xd7bf, 0x8566, 0xb5a5, 0xc2f4, 0xc4cf,
+ /* 98 */ 0x8567, 0x8568, 0xb2a9, 0x8569, 0xb2b7, 0x856a, 0xb1e5, 0xdfb2,
+ /* a0 */ 0xd5bc, 0xbfa8, 0xc2ac, 0xd8d5, 0xc2b1, 0x856b, 0xd8d4, 0xced4,
+ /* a8 */ 0x856c, 0xdae0, 0x856d, 0xcec0, 0x856e, 0x856f, 0xd8b4, 0xc3ae,
+ /* b0 */ 0xd3a1, 0xcea3, 0x8570, 0xbcb4, 0xc8b4, 0xc2d1, 0x8571, 0xbeed,
+ /* b8 */ 0xd0b6, 0x8572, 0xdae1, 0x8573, 0x8574, 0x8575, 0x8576, 0xc7e4,
+
+ /*** Three byte table, leaf: e58exx - offset 0x01043 ***/
+
+ /* 80 */ 0x8577, 0x8578, 0xb3a7, 0x8579, 0xb6f2, 0xccfc, 0xc0fa, 0x857a,
+ /* 88 */ 0x857b, 0xc0f7, 0x857c, 0xd1b9, 0xd1e1, 0xd8c7, 0x857d, 0x857e,
+ /* 90 */ 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0xb2de, 0x8585, 0x8586,
+ /* 98 */ 0xc0e5, 0x8587, 0xbaf1, 0x8588, 0x8589, 0xd8c8, 0x858a, 0xd4ad,
+ /* a0 */ 0x858b, 0x858c, 0xcfe1, 0xd8c9, 0x858d, 0xd8ca, 0xcfc3, 0x858e,
+ /* a8 */ 0xb3f8, 0xbec7, 0x858f, 0x8590, 0x8591, 0x8592, 0xd8cb, 0x8593,
+ /* b0 */ 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0xdbcc, 0x859a,
+ /* b8 */ 0x859b, 0x859c, 0x859d, 0xc8a5, 0x859e, 0x859f, 0x85a0, 0xcfd8,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x01083 ***/
+
+ /* 80 */ 0x85a1, 0xc8fe, 0xb2ce, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6,
+ /* 88 */ 0xd3d6, 0xb2e6, 0xbcb0, 0xd3d1, 0xcbab, 0xb7b4, 0x85a7, 0x85a8,
+ /* 90 */ 0x85a9, 0xb7a2, 0x85aa, 0x85ab, 0xcae5, 0x85ac, 0xc8a1, 0xcadc,
+ /* 98 */ 0xb1e4, 0xd0f0, 0x85ad, 0xc5d1, 0x85ae, 0x85af, 0x85b0, 0xdbc5,
+ /* a0 */ 0xb5fe, 0x85b1, 0x85b2, 0xbfda, 0xb9c5, 0xbee4, 0xc1ed, 0x85b3,
+ /* a8 */ 0xdfb6, 0xdfb5, 0xd6bb, 0xbdd0, 0xd5d9, 0xb0c8, 0xb6a3, 0xbfc9,
+ /* b0 */ 0xcca8, 0xdfb3, 0xcab7, 0xd3d2, 0x85b4, 0xd8cf, 0xd2b6, 0xbac5,
+ /* b8 */ 0xcbbe, 0xccbe, 0x85b5, 0xdfb7, 0xb5f0, 0xdfb4, 0x85b6, 0x85b7,
+
+ /*** Three byte table, leaf: e590xx - offset 0x010c3 ***/
+
+ /* 80 */ 0x85b8, 0xd3f5, 0x85b9, 0xb3d4, 0xb8f7, 0x85ba, 0xdfba, 0x85bb,
+ /* 88 */ 0xbacf, 0xbcaa, 0xb5f5, 0x85bc, 0xcdac, 0xc3fb, 0xbaf3, 0xc0f4,
+ /* 90 */ 0xcdc2, 0xcff2, 0xdfb8, 0xcfc5, 0x85bd, 0xc2c0, 0xdfb9, 0xc2f0,
+ /* 98 */ 0x85be, 0x85bf, 0x85c0, 0xbefd, 0x85c1, 0xc1df, 0xcdcc, 0xd2f7,
+ /* a0 */ 0xb7cd, 0xdfc1, 0x85c2, 0xdfc4, 0x85c3, 0x85c4, 0xb7f1, 0xb0c9,
+ /* a8 */ 0xb6d6, 0xb7d4, 0x85c5, 0xbaac, 0xccfd, 0xbfd4, 0xcbb1, 0xc6f4,
+ /* b0 */ 0x85c6, 0xd6a8, 0xdfc5, 0x85c7, 0xcee2, 0xb3b3, 0x85c8, 0x85c9,
+ /* b8 */ 0xcefc, 0xb4b5, 0x85ca, 0xcec7, 0xbaf0, 0x85cb, 0xcee1, 0x85cc,
+
+ /*** Three byte table, leaf: e591xx - offset 0x01103 ***/
+
+ /* 80 */ 0xd1bd, 0x85cd, 0x85ce, 0xdfc0, 0x85cf, 0x85d0, 0xb4f4, 0x85d1,
+ /* 88 */ 0xb3ca, 0x85d2, 0xb8e6, 0xdfbb, 0x85d3, 0x85d4, 0x85d5, 0x85d6,
+ /* 90 */ 0xc4c5, 0x85d7, 0xdfbc, 0xdfbd, 0xdfbe, 0xc5bb, 0xdfbf, 0xdfc2,
+ /* 98 */ 0xd4b1, 0xdfc3, 0x85d8, 0xc7ba, 0xced8, 0x85d9, 0x85da, 0x85db,
+ /* a0 */ 0x85dc, 0x85dd, 0xc4d8, 0x85de, 0xdfca, 0x85df, 0xdfcf, 0x85e0,
+ /* a8 */ 0xd6dc, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7,
+ /* b0 */ 0x85e8, 0xdfc9, 0xdfda, 0xceb6, 0x85e9, 0xbac7, 0xdfce, 0xdfc8,
+ /* b8 */ 0xc5de, 0x85ea, 0x85eb, 0xc9eb, 0xbaf4, 0xc3fc, 0x85ec, 0x85ed,
+
+ /*** Three byte table, leaf: e592xx - offset 0x01143 ***/
+
+ /* 80 */ 0xbed7, 0x85ee, 0xdfc6, 0x85ef, 0xdfcd, 0x85f0, 0xc5d8, 0x85f1,
+ /* 88 */ 0x85f2, 0x85f3, 0x85f4, 0xd5a6, 0xbacd, 0x85f5, 0xbecc, 0xd3bd,
+ /* 90 */ 0xb8c0, 0x85f6, 0xd6e4, 0x85f7, 0xdfc7, 0xb9be, 0xbfa7, 0x85f8,
+ /* 98 */ 0x85f9, 0xc1fc, 0xdfcb, 0xdfcc, 0x85fa, 0xdfd0, 0x85fb, 0x85fc,
+ /* a0 */ 0x85fd, 0x85fe, 0x8640, 0xdfdb, 0xdfe5, 0x8641, 0xdfd7, 0xdfd6,
+ /* a8 */ 0xd7c9, 0xdfe3, 0xdfe4, 0xe5eb, 0xd2a7, 0xdfd2, 0x8642, 0xbfa9,
+ /* b0 */ 0x8643, 0xd4db, 0x8644, 0xbfc8, 0xdfd4, 0x8645, 0x8646, 0x8647,
+ /* b8 */ 0xcfcc, 0x8648, 0x8649, 0xdfdd, 0x864a, 0xd1ca, 0x864b, 0xdfde,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01183 ***/
+
+ /* 80 */ 0xb0a7, 0xc6b7, 0xdfd3, 0x864c, 0xbae5, 0x864d, 0xb6df, 0xcddb,
+ /* 88 */ 0xb9fe, 0xd4d5, 0x864e, 0x864f, 0xdfdf, 0xcfec, 0xb0a5, 0xdfe7,
+ /* 90 */ 0xdfd1, 0xd1c6, 0xdfd5, 0xdfd8, 0xdfd9, 0xdfdc, 0x8650, 0xbba9,
+ /* 98 */ 0x8651, 0xdfe0, 0xdfe1, 0x8652, 0xdfe2, 0xdfe6, 0xdfe8, 0xd3b4,
+ /* a0 */ 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0xb8e7, 0xc5b6, 0xdfea,
+ /* a8 */ 0xc9da, 0xc1a8, 0xc4c4, 0x8658, 0x8659, 0xbfde, 0xcff8, 0x865a,
+ /* b0 */ 0x865b, 0x865c, 0xd5dc, 0xdfee, 0x865d, 0x865e, 0x865f, 0x8660,
+ /* b8 */ 0x8661, 0x8662, 0xb2b8, 0x8663, 0xbadf, 0xdfec, 0x8664, 0xdbc1,
+
+ /*** Three byte table, leaf: e594xx - offset 0x011c3 ***/
+
+ /* 80 */ 0x8665, 0xd1e4, 0x8666, 0x8667, 0x8668, 0x8669, 0xcbf4, 0xb4bd,
+ /* 88 */ 0x866a, 0xb0a6, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0xdff1,
+ /* 90 */ 0xccc6, 0xdff2, 0x8670, 0x8671, 0xdfed, 0x8672, 0x8673, 0x8674,
+ /* 98 */ 0x8675, 0x8676, 0x8677, 0xdfe9, 0x8678, 0x8679, 0x867a, 0x867b,
+ /* a0 */ 0xdfeb, 0x867c, 0xdfef, 0xdff0, 0xbbbd, 0x867d, 0x867e, 0xdff3,
+ /* a8 */ 0x8680, 0x8681, 0xdff4, 0x8682, 0xbba3, 0x8683, 0xcadb, 0xcea8,
+ /* b0 */ 0xe0a7, 0xb3aa, 0x8684, 0xe0a6, 0x8685, 0x8686, 0x8687, 0xe0a1,
+ /* b8 */ 0x8688, 0x8689, 0x868a, 0x868b, 0xdffe, 0x868c, 0xcdd9, 0xdffc,
+
+ /*** Three byte table, leaf: e595xx - offset 0x01203 ***/
+
+ /* 80 */ 0x868d, 0xdffa, 0x868e, 0xbfd0, 0xd7c4, 0x868f, 0xc9cc, 0x8690,
+ /* 88 */ 0x8691, 0xdff8, 0xb0a1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696,
+ /* 90 */ 0xdffd, 0x8697, 0x8698, 0x8699, 0x869a, 0xdffb, 0xe0a2, 0x869b,
+ /* 98 */ 0x869c, 0x869d, 0x869e, 0x869f, 0xe0a8, 0x86a0, 0x86a1, 0x86a2,
+ /* a0 */ 0x86a3, 0xb7c8, 0x86a4, 0x86a5, 0xc6a1, 0xc9b6, 0xc0b2, 0xdff5,
+ /* a8 */ 0x86a6, 0x86a7, 0xc5be, 0x86a8, 0xd8c4, 0xdff9, 0xc4f6, 0x86a9,
+ /* b0 */ 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0xe0a3, 0xe0a4, 0xe0a5,
+ /* b8 */ 0xd0a5, 0x86af, 0x86b0, 0xe0b4, 0xcce4, 0x86b1, 0xe0b1, 0x86b2,
+
+ /*** Three byte table, leaf: e596xx - offset 0x01243 ***/
+
+ /* 80 */ 0xbfa6, 0xe0af, 0xceb9, 0xe0ab, 0xc9c6, 0x86b3, 0x86b4, 0xc0ae,
+ /* 88 */ 0xe0ae, 0xbaed, 0xbab0, 0xe0a9, 0x86b5, 0x86b6, 0x86b7, 0xdff6,
+ /* 90 */ 0x86b8, 0xe0b3, 0x86b9, 0x86ba, 0xe0b8, 0x86bb, 0x86bc, 0x86bd,
+ /* 98 */ 0xb4ad, 0xe0b9, 0x86be, 0x86bf, 0xcfb2, 0xbac8, 0x86c0, 0xe0b0,
+ /* a0 */ 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0xd0fa,
+ /* a8 */ 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf,
+ /* b0 */ 0x86d0, 0xe0ac, 0x86d1, 0xd4fb, 0x86d2, 0xdff7, 0x86d3, 0xc5e7,
+ /* b8 */ 0x86d4, 0xe0ad, 0x86d5, 0xd3f7, 0x86d6, 0xe0b6, 0xe0b7, 0x86d7,
+
+ /*** Three byte table, leaf: e597xx - offset 0x01283 ***/
+
+ /* 80 */ 0x86d8, 0x86d9, 0x86da, 0x86db, 0xe0c4, 0xd0e1, 0x86dc, 0x86dd,
+ /* 88 */ 0x86de, 0xe0bc, 0x86df, 0x86e0, 0xe0c9, 0xe0ca, 0x86e1, 0x86e2,
+ /* 90 */ 0x86e3, 0xe0be, 0xe0aa, 0xc9a4, 0xe0c1, 0x86e4, 0xe0b2, 0x86e5,
+ /* 98 */ 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0xcac8, 0xe0c3, 0x86ea, 0xe0b5,
+ /* a0 */ 0x86eb, 0xcecb, 0x86ec, 0xcbc3, 0xe0cd, 0xe0c6, 0xe0c2, 0x86ed,
+ /* a8 */ 0xe0cb, 0x86ee, 0xe0ba, 0xe0bf, 0xe0c0, 0x86ef, 0x86f0, 0xe0c5,
+ /* b0 */ 0x86f1, 0x86f2, 0xe0c7, 0xe0c8, 0x86f3, 0xe0cc, 0x86f4, 0xe0bb,
+ /* b8 */ 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0xcbd4, 0xe0d5, 0x86fa,
+
+ /*** Three byte table, leaf: e598xx - offset 0x012c3 ***/
+
+ /* 80 */ 0xe0d6, 0xe0d2, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741,
+ /* 88 */ 0xe0d0, 0xbcce, 0x8742, 0x8743, 0xe0d1, 0x8744, 0xb8c2, 0xd8c5,
+ /* 90 */ 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c,
+ /* 98 */ 0xd0ea, 0x874d, 0x874e, 0xc2ef, 0x874f, 0x8750, 0xe0cf, 0xe0bd,
+ /* a0 */ 0x8751, 0x8752, 0x8753, 0xe0d4, 0xe0d3, 0x8754, 0x8755, 0xe0d7,
+ /* a8 */ 0x8756, 0x8757, 0x8758, 0x8759, 0xe0dc, 0xe0d8, 0x875a, 0x875b,
+ /* b0 */ 0x875c, 0xd6f6, 0xb3b0, 0x875d, 0xd7ec, 0x875e, 0xcbbb, 0x875f,
+ /* b8 */ 0x8760, 0xe0da, 0x8761, 0xcefb, 0x8762, 0x8763, 0x8764, 0xbad9,
+
+ /*** Three byte table, leaf: e599xx - offset 0x01303 ***/
+
+ /* 80 */ 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c,
+ /* 88 */ 0x876d, 0x876e, 0x876f, 0x8770, 0xe0e1, 0xe0dd, 0xd2ad, 0x8771,
+ /* 90 */ 0x8772, 0x8773, 0x8774, 0x8775, 0xe0e2, 0x8776, 0x8777, 0xe0db,
+ /* 98 */ 0xe0d9, 0xe0df, 0x8778, 0x8779, 0xe0e0, 0x877a, 0x877b, 0x877c,
+ /* a0 */ 0x877d, 0x877e, 0xe0de, 0x8780, 0xe0e4, 0x8781, 0x8782, 0x8783,
+ /* a8 */ 0xc6f7, 0xd8ac, 0xd4eb, 0xe0e6, 0xcac9, 0x8784, 0x8785, 0x8786,
+ /* b0 */ 0x8787, 0xe0e5, 0x8788, 0x8789, 0x878a, 0x878b, 0xb8c1, 0x878c,
+ /* b8 */ 0x878d, 0x878e, 0x878f, 0xe0e7, 0xe0e8, 0x8790, 0x8791, 0x8792,
+
+ /*** Three byte table, leaf: e59axx - offset 0x01343 ***/
+
+ /* 80 */ 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0xe0e9, 0xe0e3, 0x8798,
+ /* 88 */ 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0xbabf, 0xcce7,
+ /* 90 */ 0x879f, 0x87a0, 0x87a1, 0xe0ea, 0x87a2, 0x87a3, 0x87a4, 0x87a5,
+ /* 98 */ 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad,
+ /* a0 */ 0x87ae, 0x87af, 0x87b0, 0xcff9, 0x87b1, 0x87b2, 0x87b3, 0x87b4,
+ /* a8 */ 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0xe0eb,
+ /* b0 */ 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0xc8c2,
+ /* b8 */ 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0xbdc0, 0x87c7, 0x87c8, 0x87c9,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x01383 ***/
+
+ /* 80 */ 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1,
+ /* 88 */ 0x87d2, 0x87d3, 0xc4d2, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8,
+ /* 90 */ 0x87d9, 0x87da, 0x87db, 0x87dc, 0xe0ec, 0x87dd, 0x87de, 0xe0ed,
+ /* 98 */ 0x87df, 0x87e0, 0xc7f4, 0xcbc4, 0x87e1, 0xe0ee, 0xbbd8, 0xd8b6,
+ /* a0 */ 0xd2f2, 0xe0ef, 0xcdc5, 0x87e2, 0xb6da, 0x87e3, 0x87e4, 0x87e5,
+ /* a8 */ 0x87e6, 0x87e7, 0x87e8, 0xe0f1, 0x87e9, 0xd4b0, 0x87ea, 0x87eb,
+ /* b0 */ 0xc0a7, 0xb4d1, 0x87ec, 0x87ed, 0xcea7, 0xe0f0, 0x87ee, 0x87ef,
+ /* b8 */ 0x87f0, 0xe0f2, 0xb9cc, 0x87f1, 0x87f2, 0xb9fa, 0xcdbc, 0xe0f3,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x013c3 ***/
+
+ /* 80 */ 0x87f3, 0x87f4, 0x87f5, 0xc6d4, 0xe0f4, 0x87f6, 0xd4b2, 0x87f7,
+ /* 88 */ 0xc8a6, 0xe0f6, 0xe0f5, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc,
+ /* 90 */ 0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845,
+ /* 98 */ 0x8846, 0x8847, 0x8848, 0x8849, 0xe0f7, 0x884a, 0x884b, 0xcdc1,
+ /* a0 */ 0x884c, 0x884d, 0x884e, 0xcaa5, 0x884f, 0x8850, 0x8851, 0x8852,
+ /* a8 */ 0xd4da, 0xdbd7, 0xdbd9, 0x8853, 0xdbd8, 0xb9e7, 0xdbdc, 0xdbdd,
+ /* b0 */ 0xb5d8, 0x8854, 0x8855, 0xdbda, 0x8856, 0x8857, 0x8858, 0x8859,
+ /* b8 */ 0x885a, 0xdbdb, 0xb3a1, 0xdbdf, 0x885b, 0x885c, 0xbbf8, 0x885d,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01403 ***/
+
+ /* 80 */ 0xd6b7, 0x885e, 0xdbe0, 0x885f, 0x8860, 0x8861, 0x8862, 0xbef9,
+ /* 88 */ 0x8863, 0x8864, 0xb7bb, 0x8865, 0xdbd0, 0xccae, 0xbfb2, 0xbbb5,
+ /* 90 */ 0xd7f8, 0xbfd3, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0xbfe9,
+ /* 98 */ 0x886b, 0x886c, 0xbce1, 0xccb3, 0xdbde, 0xb0d3, 0xceeb, 0xb7d8,
+ /* a0 */ 0xd7b9, 0xc6c2, 0x886d, 0x886e, 0xc0a4, 0x886f, 0xccb9, 0x8870,
+ /* a8 */ 0xdbe7, 0xdbe1, 0xc6ba, 0xdbe3, 0x8871, 0xdbe8, 0x8872, 0xc5f7,
+ /* b0 */ 0x8873, 0x8874, 0x8875, 0xdbea, 0x8876, 0x8877, 0xdbe9, 0xbfc0,
+ /* b8 */ 0x8878, 0x8879, 0x887a, 0xdbe6, 0xdbe5, 0x887b, 0x887c, 0x887d,
+
+ /*** Three byte table, leaf: e59exx - offset 0x01443 ***/
+
+ /* 80 */ 0x887e, 0x8880, 0xb4b9, 0xc0ac, 0xc2a2, 0xdbe2, 0xdbe4, 0x8881,
+ /* 88 */ 0x8882, 0x8883, 0x8884, 0xd0cd, 0xdbed, 0x8885, 0x8886, 0x8887,
+ /* 90 */ 0x8888, 0x8889, 0xc0dd, 0xdbf2, 0x888a, 0x888b, 0x888c, 0x888d,
+ /* 98 */ 0x888e, 0x888f, 0x8890, 0xb6e2, 0x8891, 0x8892, 0x8893, 0x8894,
+ /* a0 */ 0xdbf3, 0xdbd2, 0xb9b8, 0xd4ab, 0xdbec, 0x8895, 0xbfd1, 0xdbf0,
+ /* a8 */ 0x8896, 0xdbd1, 0x8897, 0xb5e6, 0x8898, 0xdbeb, 0xbfe5, 0x8899,
+ /* b0 */ 0x889a, 0x889b, 0xdbee, 0x889c, 0xdbf1, 0x889d, 0x889e, 0x889f,
+ /* b8 */ 0xdbf9, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x01483 ***/
+
+ /* 80 */ 0x88a7, 0x88a8, 0xb9a1, 0xb0a3, 0x88a9, 0x88aa, 0x88ab, 0x88ac,
+ /* 88 */ 0x88ad, 0x88ae, 0x88af, 0xc2f1, 0x88b0, 0x88b1, 0xb3c7, 0xdbef,
+ /* 90 */ 0x88b2, 0x88b3, 0xdbf8, 0x88b4, 0xc6d2, 0xdbf4, 0x88b5, 0x88b6,
+ /* 98 */ 0xdbf5, 0xdbf7, 0xdbf6, 0x88b7, 0x88b8, 0xdbfe, 0x88b9, 0xd3f2,
+ /* a0 */ 0xb2ba, 0x88ba, 0x88bb, 0x88bc, 0xdbfd, 0x88bd, 0x88be, 0x88bf,
+ /* a8 */ 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0xdca4, 0x88c5, 0xdbfb,
+ /* b0 */ 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0xdbfa, 0x88ca, 0x88cb, 0x88cc,
+ /* b8 */ 0xdbfc, 0xc5e0, 0xbbf9, 0x88cd, 0x88ce, 0xdca3, 0x88cf, 0x88d0,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x014c3 ***/
+
+ /* 80 */ 0xdca5, 0x88d1, 0xccc3, 0x88d2, 0x88d3, 0x88d4, 0xb6d1, 0xddc0,
+ /* 88 */ 0x88d5, 0x88d6, 0x88d7, 0xdca1, 0x88d8, 0xdca2, 0x88d9, 0x88da,
+ /* 90 */ 0x88db, 0xc7b5, 0x88dc, 0x88dd, 0x88de, 0xb6e9, 0x88df, 0x88e0,
+ /* 98 */ 0x88e1, 0xdca7, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0xdca6, 0x88e6,
+ /* a0 */ 0xdca9, 0xb1a4, 0x88e7, 0x88e8, 0xb5cc, 0x88e9, 0x88ea, 0x88eb,
+ /* a8 */ 0x88ec, 0x88ed, 0xbfb0, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2,
+ /* b0 */ 0xd1df, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0xb6c2, 0x88f7, 0x88f8,
+ /* b8 */ 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x01503 ***/
+
+ /* 80 */ 0x8942, 0x8943, 0x8944, 0x8945, 0xdca8, 0x8946, 0x8947, 0x8948,
+ /* 88 */ 0x8949, 0x894a, 0x894b, 0x894c, 0xcbfa, 0xebf3, 0x894d, 0x894e,
+ /* 90 */ 0x894f, 0xcbdc, 0x8950, 0x8951, 0xcbfe, 0x8952, 0x8953, 0x8954,
+ /* 98 */ 0xccc1, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0xc8fb, 0x895a,
+ /* a0 */ 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0xdcaa, 0x8960, 0x8961,
+ /* a8 */ 0x8962, 0x8963, 0x8964, 0xccee, 0xdcab, 0x8965, 0x8966, 0x8967,
+ /* b0 */ 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f,
+ /* b8 */ 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0xdbd3, 0x8976,
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x01543 ***/
+
+ /* 80 */ 0xdcaf, 0xdcac, 0x8977, 0xbeb3, 0x8978, 0xcafb, 0x8979, 0x897a,
+ /* 88 */ 0x897b, 0xdcad, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982,
+ /* 90 */ 0x8983, 0x8984, 0xc9ca, 0xc4b9, 0x8985, 0x8986, 0x8987, 0x8988,
+ /* 98 */ 0x8989, 0xc7bd, 0xdcae, 0x898a, 0x898b, 0x898c, 0xd4f6, 0xd0e6,
+ /* a0 */ 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994,
+ /* a8 */ 0xc4ab, 0xb6d5, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a,
+ /* b0 */ 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2,
+ /* b8 */ 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0xdbd4, 0x89a7, 0x89a8, 0x89a9,
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x01583 ***/
+
+ /* 80 */ 0x89aa, 0xb1da, 0x89ab, 0x89ac, 0x89ad, 0xdbd5, 0x89ae, 0x89af,
+ /* 88 */ 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7,
+ /* 90 */ 0x89b8, 0xdbd6, 0x89b9, 0x89ba, 0x89bb, 0xbabe, 0x89bc, 0x89bd,
+ /* 98 */ 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5,
+ /* a0 */ 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0xc8c0, 0x89ca, 0x89cb, 0x89cc,
+ /* a8 */ 0x89cd, 0x89ce, 0x89cf, 0xcabf, 0xc8c9, 0x89d0, 0xd7b3, 0x89d1,
+ /* b0 */ 0xc9f9, 0x89d2, 0x89d3, 0xbfc7, 0x89d4, 0x89d5, 0xbaf8, 0x89d6,
+ /* b8 */ 0x89d7, 0xd2bc, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd,
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x015c3 ***/
+
+ /* 80 */ 0x89de, 0x89df, 0xe2ba, 0x89e0, 0xb4a6, 0x89e1, 0x89e2, 0xb1b8,
+ /* 88 */ 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0xb8b4, 0x89e8, 0xcfc4,
+ /* 90 */ 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0xd9e7, 0xcfa6, 0xcde2, 0x89ed,
+ /* 98 */ 0x89ee, 0xd9ed, 0xb6e0, 0x89ef, 0xd2b9, 0x89f0, 0x89f1, 0xb9bb,
+ /* a0 */ 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0xe2b9, 0xe2b7, 0x89f6, 0xb4f3,
+ /* a8 */ 0x89f7, 0xccec, 0xccab, 0xb7f2, 0x89f8, 0xd8b2, 0xd1eb, 0xbabb,
+ /* b0 */ 0x89f9, 0xcaa7, 0x89fa, 0x89fb, 0xcdb7, 0x89fc, 0x89fd, 0xd2c4,
+ /* b8 */ 0xbfe4, 0xbcd0, 0xb6e1, 0x89fe, 0xdec5, 0x8a40, 0x8a41, 0x8a42,
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x01603 ***/
+
+ /* 80 */ 0x8a43, 0xdec6, 0xdbbc, 0x8a44, 0xd1d9, 0x8a45, 0x8a46, 0xc6e6,
+ /* 88 */ 0xc4ce, 0xb7ee, 0x8a47, 0xb7dc, 0x8a48, 0x8a49, 0xbffc, 0xd7e0,
+ /* 90 */ 0x8a4a, 0xc6f5, 0x8a4b, 0x8a4c, 0xb1bc, 0xdec8, 0xbdb1, 0xccd7,
+ /* 98 */ 0xdeca, 0x8a4d, 0xdec9, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52,
+ /* a0 */ 0xb5ec, 0x8a53, 0xc9dd, 0x8a54, 0x8a55, 0xb0c2, 0x8a56, 0x8a57,
+ /* a8 */ 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f,
+ /* b0 */ 0x8a60, 0x8a61, 0x8a62, 0xc5ae, 0xc5ab, 0x8a63, 0xc4cc, 0x8a64,
+ /* b8 */ 0xbce9, 0xcbfd, 0x8a65, 0x8a66, 0x8a67, 0xbac3, 0x8a68, 0x8a69,
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x01643 ***/
+
+ /* 80 */ 0x8a6a, 0xe5f9, 0xc8e7, 0xe5fa, 0xcdfd, 0x8a6b, 0xd7b1, 0xb8be,
+ /* 88 */ 0xc2e8, 0x8a6c, 0xc8d1, 0x8a6d, 0x8a6e, 0xe5fb, 0x8a6f, 0x8a70,
+ /* 90 */ 0x8a71, 0x8a72, 0xb6ca, 0xbccb, 0x8a73, 0x8a74, 0xd1fd, 0xe6a1,
+ /* 98 */ 0x8a75, 0xc3ee, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0xe6a4, 0x8a7a,
+ /* a0 */ 0x8a7b, 0x8a7c, 0x8a7d, 0xe5fe, 0xe6a5, 0xcdd7, 0x8a7e, 0x8a80,
+ /* a8 */ 0xb7c1, 0xe5fc, 0xe5fd, 0xe6a3, 0x8a81, 0x8a82, 0xc4dd, 0xe6a8,
+ /* b0 */ 0x8a83, 0x8a84, 0xe6a7, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89,
+ /* b8 */ 0x8a8a, 0xc3c3, 0x8a8b, 0xc6de, 0x8a8c, 0x8a8d, 0xe6aa, 0x8a8e,
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x01683 ***/
+
+ /* 80 */ 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0xc4b7, 0x8a95,
+ /* 88 */ 0x8a96, 0x8a97, 0xe6a2, 0xcabc, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b,
+ /* 90 */ 0xbde3, 0xb9c3, 0xe6a6, 0xd0d5, 0xceaf, 0x8a9c, 0x8a9d, 0xe6a9,
+ /* 98 */ 0xe6b0, 0x8a9e, 0xd2a6, 0x8a9f, 0xbdaa, 0xe6ad, 0x8aa0, 0x8aa1,
+ /* a0 */ 0x8aa2, 0x8aa3, 0x8aa4, 0xe6af, 0x8aa5, 0xc0d1, 0x8aa6, 0x8aa7,
+ /* a8 */ 0xd2cc, 0x8aa8, 0x8aa9, 0x8aaa, 0xbca7, 0x8aab, 0x8aac, 0x8aad,
+ /* b0 */ 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5,
+ /* b8 */ 0x8ab6, 0xe6b1, 0x8ab7, 0xd2f6, 0x8ab8, 0x8ab9, 0x8aba, 0xd7cb,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x016c3 ***/
+
+ /* 80 */ 0x8abb, 0xcdfe, 0x8abc, 0xcdde, 0xc2a6, 0xe6ab, 0xe6ac, 0xbdbf,
+ /* 88 */ 0xe6ae, 0xe6b3, 0x8abd, 0x8abe, 0xe6b2, 0x8abf, 0x8ac0, 0x8ac1,
+ /* 90 */ 0x8ac2, 0xe6b6, 0x8ac3, 0xe6b8, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7,
+ /* 98 */ 0xc4ef, 0x8ac8, 0x8ac9, 0x8aca, 0xc4c8, 0x8acb, 0x8acc, 0xbeea,
+ /* a0 */ 0xc9ef, 0x8acd, 0x8ace, 0xe6b7, 0x8acf, 0xb6f0, 0x8ad0, 0x8ad1,
+ /* a8 */ 0x8ad2, 0xc3e4, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8,
+ /* b0 */ 0x8ad9, 0xd3e9, 0xe6b4, 0x8ada, 0xe6b5, 0x8adb, 0xc8a2, 0x8adc,
+ /* b8 */ 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0xe6bd, 0x8ae1, 0x8ae2, 0x8ae3,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01703 ***/
+
+ /* 80 */ 0xe6b9, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0xc6c5, 0x8ae9,
+ /* 88 */ 0x8aea, 0xcdf1, 0xe6bb, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef,
+ /* 90 */ 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0xe6bc, 0x8af5, 0x8af6,
+ /* 98 */ 0x8af7, 0x8af8, 0xbbe9, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd,
+ /* a0 */ 0x8afe, 0x8b40, 0xe6be, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0xe6ba,
+ /* a8 */ 0x8b45, 0x8b46, 0xc0b7, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b,
+ /* b0 */ 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0xd3a4, 0xe6bf, 0xc9f4, 0xe6c3,
+ /* b8 */ 0x8b50, 0x8b51, 0xe6c4, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0xd0f6,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x01743 ***/
+
+ /* 80 */ 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d,
+ /* 88 */ 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65,
+ /* 90 */ 0x8b66, 0x8b67, 0xc3bd, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c,
+ /* 98 */ 0x8b6d, 0x8b6e, 0xc3c4, 0xe6c2, 0x8b6f, 0x8b70, 0x8b71, 0x8b72,
+ /* a0 */ 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a,
+ /* a8 */ 0x8b7b, 0x8b7c, 0xe6c1, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82,
+ /* b0 */ 0x8b83, 0x8b84, 0xe6c7, 0xcfb1, 0x8b85, 0xebf4, 0x8b86, 0x8b87,
+ /* b8 */ 0xe6ca, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0xe6c5, 0x8b8d,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x01783 ***/
+
+ /* 80 */ 0x8b8e, 0xbcde, 0xc9a9, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93,
+ /* 88 */ 0x8b94, 0xbcb5, 0x8b95, 0x8b96, 0xcfd3, 0x8b97, 0x8b98, 0x8b99,
+ /* 90 */ 0x8b9a, 0x8b9b, 0xe6c8, 0x8b9c, 0xe6c9, 0x8b9d, 0xe6ce, 0x8b9e,
+ /* 98 */ 0xe6d0, 0x8b9f, 0x8ba0, 0x8ba1, 0xe6d1, 0x8ba2, 0x8ba3, 0x8ba4,
+ /* a0 */ 0xe6cb, 0xb5d5, 0x8ba5, 0xe6cc, 0x8ba6, 0x8ba7, 0xe6cf, 0x8ba8,
+ /* a8 */ 0x8ba9, 0xc4db, 0x8baa, 0xe6c6, 0x8bab, 0x8bac, 0x8bad, 0x8bae,
+ /* b0 */ 0x8baf, 0xe6cd, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5,
+ /* b8 */ 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x017c3 ***/
+
+ /* 80 */ 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5,
+ /* 88 */ 0x8bc6, 0xe6d2, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc,
+ /* 90 */ 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0xe6d4, 0xe6d3,
+ /* 98 */ 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda,
+ /* a0 */ 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2,
+ /* a8 */ 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea,
+ /* b0 */ 0x8beb, 0x8bec, 0xe6d5, 0x8bed, 0xd9f8, 0x8bee, 0x8bef, 0xe6d6,
+ /* b8 */ 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01803 ***/
+
+ /* 80 */ 0xe6d7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe,
+ /* 88 */ 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47,
+ /* 90 */ 0xd7d3, 0xe6dd, 0x8c48, 0xe6de, 0xbfd7, 0xd4d0, 0x8c49, 0xd7d6,
+ /* 98 */ 0xb4e6, 0xcbef, 0xe6da, 0xd8c3, 0xd7ce, 0xd0a2, 0x8c4a, 0xc3cf,
+ /* a0 */ 0x8c4b, 0x8c4c, 0xe6df, 0xbcbe, 0xb9c2, 0xe6db, 0xd1a7, 0x8c4d,
+ /* a8 */ 0x8c4e, 0xbaa2, 0xc2cf, 0x8c4f, 0xd8ab, 0x8c50, 0x8c51, 0x8c52,
+ /* b0 */ 0xcaeb, 0xe5ee, 0x8c53, 0xe6dc, 0x8c54, 0xb7f5, 0x8c55, 0x8c56,
+ /* b8 */ 0x8c57, 0x8c58, 0xc8e6, 0x8c59, 0x8c5a, 0xc4f5, 0x8c5b, 0x8c5c,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01843 ***/
+
+ /* 80 */ 0xe5b2, 0xc4fe, 0x8c5d, 0xcbfc, 0xe5b3, 0xd5ac, 0x8c5e, 0xd3ee,
+ /* 88 */ 0xcad8, 0xb0b2, 0x8c5f, 0xcbce, 0xcdea, 0x8c60, 0x8c61, 0xbaea,
+ /* 90 */ 0x8c62, 0x8c63, 0x8c64, 0xe5b5, 0x8c65, 0xe5b4, 0x8c66, 0xd7da,
+ /* 98 */ 0xb9d9, 0xd6e6, 0xb6a8, 0xcdf0, 0xd2cb, 0xb1a6, 0xcab5, 0x8c67,
+ /* a0 */ 0xb3e8, 0xc9f3, 0xbfcd, 0xd0fb, 0xcad2, 0xe5b6, 0xbbc2, 0x8c68,
+ /* a8 */ 0x8c69, 0x8c6a, 0xcfdc, 0xb9ac, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e,
+ /* b0 */ 0xd4d7, 0x8c6f, 0x8c70, 0xbaa6, 0xd1e7, 0xcffc, 0xbcd2, 0x8c71,
+ /* b8 */ 0xe5b7, 0xc8dd, 0x8c72, 0x8c73, 0x8c74, 0xbfed, 0xb1f6, 0xcbde,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x01883 ***/
+
+ /* 80 */ 0x8c75, 0x8c76, 0xbcc5, 0x8c77, 0xbcc4, 0xd2fa, 0xc3dc, 0xbfdc,
+ /* 88 */ 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0xb8bb, 0x8c7c, 0x8c7d, 0x8c7e,
+ /* 90 */ 0xc3c2, 0x8c80, 0xbaae, 0xd4a2, 0x8c81, 0x8c82, 0x8c83, 0x8c84,
+ /* 98 */ 0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0xc7de, 0xc4af, 0xb2ec,
+ /* a0 */ 0x8c8a, 0xb9d1, 0x8c8b, 0x8c8c, 0xe5bb, 0xc1c8, 0x8c8d, 0x8c8e,
+ /* a8 */ 0xd5af, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0xe5bc, 0x8c94,
+ /* b0 */ 0xe5be, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b,
+ /* b8 */ 0xb4e7, 0xb6d4, 0xcbc2, 0xd1b0, 0xb5bc, 0x8c9c, 0x8c9d, 0xcad9,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x018c3 ***/
+
+ /* 80 */ 0x8c9e, 0xb7e2, 0x8c9f, 0x8ca0, 0xc9e4, 0x8ca1, 0xbdab, 0x8ca2,
+ /* 88 */ 0x8ca3, 0xcebe, 0xd7f0, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0xd0a1,
+ /* 90 */ 0x8ca8, 0xc9d9, 0x8ca9, 0x8caa, 0xb6fb, 0xe6d8, 0xbce2, 0x8cab,
+ /* 98 */ 0xb3be, 0x8cac, 0xc9d0, 0x8cad, 0xe6d9, 0xb3a2, 0x8cae, 0x8caf,
+ /* a0 */ 0x8cb0, 0x8cb1, 0xdecc, 0x8cb2, 0xd3c8, 0xdecd, 0x8cb3, 0xd2a2,
+ /* a8 */ 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0xdece, 0x8cb8, 0x8cb9, 0x8cba,
+ /* b0 */ 0x8cbb, 0xbecd, 0x8cbc, 0x8cbd, 0xdecf, 0x8cbe, 0x8cbf, 0x8cc0,
+ /* b8 */ 0xcaac, 0xd2fc, 0xb3df, 0xe5ea, 0xc4e1, 0xbea1, 0xceb2, 0xc4f2,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01903 ***/
+
+ /* 80 */ 0xbed6, 0xc6a8, 0xb2e3, 0x8cc1, 0x8cc2, 0xbed3, 0x8cc3, 0x8cc4,
+ /* 88 */ 0xc7fc, 0xcceb, 0xbdec, 0xcedd, 0x8cc5, 0x8cc6, 0xcaba, 0xc6c1,
+ /* 90 */ 0xe5ec, 0xd0bc, 0x8cc7, 0x8cc8, 0x8cc9, 0xd5b9, 0x8cca, 0x8ccb,
+ /* 98 */ 0x8ccc, 0xe5ed, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0xcaf4, 0x8cd1,
+ /* a0 */ 0xcdc0, 0xc2c5, 0x8cd2, 0xe5ef, 0x8cd3, 0xc2c4, 0xe5f0, 0x8cd4,
+ /* a8 */ 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0xe5f8, 0xcdcd,
+ /* b0 */ 0x8cdb, 0xc9bd, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1,
+ /* b8 */ 0x8ce2, 0xd2d9, 0xe1a8, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0xd3ec,
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01943 ***/
+
+ /* 80 */ 0x8ce7, 0xcbea, 0xc6f1, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec,
+ /* 88 */ 0xe1ac, 0x8ced, 0x8cee, 0x8cef, 0xe1a7, 0xe1a9, 0x8cf0, 0x8cf1,
+ /* 90 */ 0xe1aa, 0xe1af, 0x8cf2, 0x8cf3, 0xb2ed, 0x8cf4, 0xe1ab, 0xb8da,
+ /* 98 */ 0xe1ad, 0xe1ae, 0xe1b0, 0xb5ba, 0xe1b1, 0x8cf5, 0x8cf6, 0x8cf7,
+ /* a0 */ 0x8cf8, 0x8cf9, 0xe1b3, 0xe1b8, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd,
+ /* a8 */ 0x8cfe, 0xd1d2, 0x8d40, 0xe1b6, 0xe1b5, 0xc1eb, 0x8d41, 0x8d42,
+ /* b0 */ 0x8d43, 0xe1b7, 0x8d44, 0xd4c0, 0x8d45, 0xe1b2, 0x8d46, 0xe1ba,
+ /* b8 */ 0xb0b6, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0xe1b4, 0x8d4b, 0xbff9,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x01983 ***/
+
+ /* 80 */ 0x8d4c, 0xe1b9, 0x8d4d, 0x8d4e, 0xe1bb, 0x8d4f, 0x8d50, 0x8d51,
+ /* 88 */ 0x8d52, 0x8d53, 0x8d54, 0xe1be, 0x8d55, 0x8d56, 0x8d57, 0x8d58,
+ /* 90 */ 0x8d59, 0x8d5a, 0xe1bc, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f,
+ /* 98 */ 0x8d60, 0xd6c5, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66,
+ /* a0 */ 0x8d67, 0xcfbf, 0x8d68, 0x8d69, 0xe1bd, 0xe1bf, 0xc2cd, 0x8d6a,
+ /* a8 */ 0xb6eb, 0x8d6b, 0xd3f8, 0x8d6c, 0x8d6d, 0xc7cd, 0x8d6e, 0x8d6f,
+ /* b0 */ 0xb7e5, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76,
+ /* b8 */ 0x8d77, 0x8d78, 0x8d79, 0xbefe, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d,
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x019c3 ***/
+
+ /* 80 */ 0x8d7e, 0x8d80, 0xe1c0, 0xe1c1, 0x8d81, 0x8d82, 0xe1c7, 0xb3e7,
+ /* 88 */ 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0xc6e9, 0x8d89,
+ /* 90 */ 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0xb4de, 0x8d8e, 0xd1c2, 0x8d8f,
+ /* 98 */ 0x8d90, 0x8d91, 0x8d92, 0xe1c8, 0x8d93, 0x8d94, 0xe1c6, 0x8d95,
+ /* a0 */ 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0xe1c5, 0x8d9a, 0xe1c3, 0xe1c2,
+ /* a8 */ 0x8d9b, 0xb1c0, 0x8d9c, 0x8d9d, 0x8d9e, 0xd5b8, 0xe1c4, 0x8d9f,
+ /* b0 */ 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0xe1cb, 0x8da4, 0x8da5, 0x8da6,
+ /* b8 */ 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0xe1cc, 0xe1ca, 0x8dac,
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01a03 ***/
+
+ /* 80 */ 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0xeffa,
+ /* 88 */ 0x8db4, 0x8db5, 0xe1d3, 0xe1d2, 0xc7b6, 0x8db6, 0x8db7, 0x8db8,
+ /* 90 */ 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0,
+ /* 98 */ 0xe1c9, 0x8dc1, 0x8dc2, 0xe1ce, 0x8dc3, 0xe1d0, 0x8dc4, 0x8dc5,
+ /* a0 */ 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd,
+ /* a8 */ 0x8dce, 0xe1d4, 0x8dcf, 0xe1d1, 0xe1cd, 0x8dd0, 0x8dd1, 0xe1cf,
+ /* b0 */ 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0xe1d5, 0x8dd6, 0x8dd7, 0x8dd8,
+ /* b8 */ 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0,
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01a43 ***/
+
+ /* 80 */ 0x8de1, 0x8de2, 0xe1d6, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7,
+ /* 88 */ 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def,
+ /* 90 */ 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7,
+ /* 98 */ 0x8df8, 0xe1d7, 0x8df9, 0x8dfa, 0x8dfb, 0xe1d8, 0x8dfc, 0x8dfd,
+ /* a0 */ 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46,
+ /* a8 */ 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e,
+ /* b0 */ 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0xe1da,
+ /* b8 */ 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d,
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01a83 ***/
+
+ /* 80 */ 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0xe1db, 0x8e63, 0x8e64,
+ /* 88 */ 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0xcea1, 0x8e6a, 0x8e6b,
+ /* 90 */ 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73,
+ /* 98 */ 0x8e74, 0x8e75, 0x8e76, 0xe7dd, 0x8e77, 0xb4a8, 0xd6dd, 0x8e78,
+ /* a0 */ 0x8e79, 0xd1b2, 0xb3b2, 0x8e7a, 0x8e7b, 0xb9a4, 0xd7f3, 0xc7c9,
+ /* a8 */ 0xbede, 0xb9ae, 0x8e7c, 0xced7, 0x8e7d, 0x8e7e, 0xb2ee, 0xdbcf,
+ /* b0 */ 0x8e80, 0xbcba, 0xd2d1, 0xcbc8, 0xb0cd, 0x8e81, 0x8e82, 0xcfef,
+ /* b8 */ 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0xd9e3, 0xbded, 0x8e88,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01ac3 ***/
+
+ /* 80 */ 0x8e89, 0xb1d2, 0xcad0, 0xb2bc, 0x8e8a, 0xcba7, 0xb7ab, 0x8e8b,
+ /* 88 */ 0xcaa6, 0x8e8c, 0x8e8d, 0x8e8e, 0xcfa3, 0x8e8f, 0x8e90, 0xe0f8,
+ /* 90 */ 0xd5ca, 0xe0fb, 0x8e91, 0x8e92, 0xe0fa, 0xc5c1, 0xccfb, 0x8e93,
+ /* 98 */ 0xc1b1, 0xe0f9, 0xd6e3, 0xb2af, 0xd6c4, 0xb5db, 0x8e94, 0x8e95,
+ /* a0 */ 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0xb4f8, 0xd6a1,
+ /* a8 */ 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0xcfaf, 0xb0ef, 0x8ea1,
+ /* b0 */ 0x8ea2, 0xe0fc, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0xe1a1,
+ /* b8 */ 0xb3a3, 0x8ea8, 0x8ea9, 0xe0fd, 0xe0fe, 0xc3b1, 0x8eaa, 0x8eab,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01b03 ***/
+
+ /* 80 */ 0x8eac, 0x8ead, 0xc3dd, 0x8eae, 0xe1a2, 0xb7f9, 0x8eaf, 0x8eb0,
+ /* 88 */ 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0xbbcf, 0x8eb5, 0x8eb6, 0x8eb7,
+ /* 90 */ 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0xe1a3, 0xc4bb, 0x8ebc, 0x8ebd,
+ /* 98 */ 0x8ebe, 0x8ebf, 0x8ec0, 0xe1a4, 0x8ec1, 0x8ec2, 0xe1a5, 0x8ec3,
+ /* a0 */ 0x8ec4, 0xe1a6, 0xb4b1, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9,
+ /* a8 */ 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1,
+ /* b0 */ 0x8ed2, 0x8ed3, 0xb8c9, 0xc6bd, 0xc4ea, 0x8ed4, 0xb2a2, 0x8ed5,
+ /* b8 */ 0xd0d2, 0x8ed6, 0xe7db, 0xbbc3, 0xd3d7, 0xd3c4, 0x8ed7, 0xb9e3,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01b43 ***/
+
+ /* 80 */ 0xe2cf, 0x8ed8, 0x8ed9, 0x8eda, 0xd7af, 0x8edb, 0xc7ec, 0xb1d3,
+ /* 88 */ 0x8edc, 0x8edd, 0xb4b2, 0xe2d1, 0x8ede, 0x8edf, 0x8ee0, 0xd0f2,
+ /* 90 */ 0xc2ae, 0xe2d0, 0x8ee1, 0xbfe2, 0xd3a6, 0xb5d7, 0xe2d2, 0xb5ea,
+ /* 98 */ 0x8ee2, 0xc3ed, 0xb8fd, 0x8ee3, 0xb8ae, 0x8ee4, 0xc5d3, 0xb7cf,
+ /* a0 */ 0xe2d4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0xe2d3, 0xb6c8, 0xd7f9,
+ /* a8 */ 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0xcda5, 0x8eee, 0x8eef,
+ /* b0 */ 0x8ef0, 0x8ef1, 0x8ef2, 0xe2d8, 0x8ef3, 0xe2d6, 0xcafc, 0xbfb5,
+ /* b8 */ 0xd3b9, 0xe2d5, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0xe2d7, 0x8ef8,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01b83 ***/
+
+ /* 80 */ 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f40, 0x8f41,
+ /* 88 */ 0x8f42, 0xc1ae, 0xc0c8, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47,
+ /* 90 */ 0x8f48, 0xe2db, 0xe2da, 0xc0aa, 0x8f49, 0x8f4a, 0xc1ce, 0x8f4b,
+ /* 98 */ 0x8f4c, 0x8f4d, 0x8f4e, 0xe2dc, 0x8f4f, 0x8f50, 0x8f51, 0x8f52,
+ /* a0 */ 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a,
+ /* a8 */ 0xe2dd, 0x8f5b, 0xe2de, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60,
+ /* b0 */ 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0xdbc8, 0x8f65, 0xd1d3, 0xcda2,
+ /* b8 */ 0x8f66, 0x8f67, 0xbda8, 0x8f68, 0x8f69, 0x8f6a, 0xdec3, 0xd8a5,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01bc3 ***/
+
+ /* 80 */ 0xbfaa, 0xdbcd, 0xd2ec, 0xc6fa, 0xc5aa, 0x8f6b, 0x8f6c, 0x8f6d,
+ /* 88 */ 0xdec4, 0x8f6e, 0xb1d7, 0xdfae, 0x8f6f, 0x8f70, 0x8f71, 0xcabd,
+ /* 90 */ 0x8f72, 0xdfb1, 0x8f73, 0xb9ad, 0x8f74, 0xd2fd, 0x8f75, 0xb8a5,
+ /* 98 */ 0xbaeb, 0x8f76, 0x8f77, 0xb3da, 0x8f78, 0x8f79, 0x8f7a, 0xb5dc,
+ /* a0 */ 0xd5c5, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0xc3d6, 0xcfd2, 0xbba1,
+ /* a8 */ 0x8f80, 0xe5f3, 0xe5f2, 0x8f81, 0x8f82, 0xe5f4, 0x8f83, 0xcde4,
+ /* b0 */ 0x8f84, 0xc8f5, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a,
+ /* b8 */ 0x8f8b, 0xb5af, 0xc7bf, 0x8f8c, 0xe5f6, 0x8f8d, 0x8f8e, 0x8f8f,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01c03 ***/
+
+ /* 80 */ 0xecb0, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96,
+ /* 88 */ 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e,
+ /* 90 */ 0xe5e6, 0x8f9f, 0xb9e9, 0xb5b1, 0x8fa0, 0xc2bc, 0xe5e8, 0xe5e7,
+ /* 98 */ 0xe5e9, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0xd2cd, 0x8fa5, 0x8fa6,
+ /* a0 */ 0x8fa7, 0xe1ea, 0xd0ce, 0x8fa8, 0xcdae, 0x8fa9, 0xd1e5, 0x8faa,
+ /* a8 */ 0x8fab, 0xb2ca, 0xb1eb, 0x8fac, 0xb1f2, 0xc5ed, 0x8fad, 0x8fae,
+ /* b0 */ 0xd5c3, 0xd3b0, 0x8faf, 0xe1dc, 0x8fb0, 0x8fb1, 0x8fb2, 0xe1dd,
+ /* b8 */ 0x8fb3, 0xd2db, 0x8fb4, 0xb3b9, 0xb1cb, 0x8fb5, 0x8fb6, 0x8fb7,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01c43 ***/
+
+ /* 80 */ 0xcdf9, 0xd5f7, 0xe1de, 0x8fb8, 0xbeb6, 0xb4fd, 0x8fb9, 0xe1df,
+ /* 88 */ 0xbadc, 0xe1e0, 0xbbb2, 0xc2c9, 0xe1e1, 0x8fba, 0x8fbb, 0x8fbc,
+ /* 90 */ 0xd0ec, 0x8fbd, 0xcdbd, 0x8fbe, 0x8fbf, 0xe1e2, 0x8fc0, 0xb5c3,
+ /* 98 */ 0xc5c7, 0xe1e3, 0x8fc1, 0x8fc2, 0xe1e4, 0x8fc3, 0x8fc4, 0x8fc5,
+ /* a0 */ 0x8fc6, 0xd3f9, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc,
+ /* a8 */ 0xe1e5, 0x8fcd, 0xd1ad, 0x8fce, 0x8fcf, 0xe1e6, 0xcea2, 0x8fd0,
+ /* b0 */ 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0xe1e7, 0x8fd6, 0xb5c2,
+ /* b8 */ 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0xe1e8, 0xbbd5, 0x8fdb, 0x8fdc,
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01c83 ***/
+
+ /* 80 */ 0x8fdd, 0x8fde, 0x8fdf, 0xd0c4, 0xe2e0, 0xb1d8, 0xd2e4, 0x8fe0,
+ /* 88 */ 0x8fe1, 0xe2e1, 0x8fe2, 0x8fe3, 0xbcc9, 0xc8cc, 0x8fe4, 0xe2e3,
+ /* 90 */ 0xecfe, 0xecfd, 0xdfaf, 0x8fe5, 0x8fe6, 0x8fe7, 0xe2e2, 0xd6be,
+ /* 98 */ 0xcdfc, 0xc3a6, 0x8fe8, 0x8fe9, 0x8fea, 0xe3c3, 0x8feb, 0x8fec,
+ /* a0 */ 0xd6d2, 0xe2e7, 0x8fed, 0x8fee, 0xe2e8, 0x8fef, 0x8ff0, 0xd3c7,
+ /* a8 */ 0x8ff1, 0x8ff2, 0xe2ec, 0xbfec, 0x8ff3, 0xe2ed, 0xe2e5, 0x8ff4,
+ /* b0 */ 0x8ff5, 0xb3c0, 0x8ff6, 0x8ff7, 0x8ff8, 0xc4ee, 0x8ff9, 0x8ffa,
+ /* b8 */ 0xe2ee, 0x8ffb, 0x8ffc, 0xd0c3, 0x8ffd, 0xbaf6, 0xe2e9, 0xb7de,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01cc3 ***/
+
+ /* 80 */ 0xbbb3, 0xccac, 0xcbcb, 0xe2e4, 0xe2e6, 0xe2ea, 0xe2eb, 0x8ffe,
+ /* 88 */ 0x9040, 0x9041, 0xe2f7, 0x9042, 0x9043, 0xe2f4, 0xd4f5, 0xe2f3,
+ /* 90 */ 0x9044, 0x9045, 0xc5ad, 0x9046, 0xd5fa, 0xc5c2, 0xb2c0, 0x9047,
+ /* 98 */ 0x9048, 0xe2ef, 0x9049, 0xe2f2, 0xc1af, 0xcbbc, 0x904a, 0x904b,
+ /* a0 */ 0xb5a1, 0xe2f9, 0x904c, 0x904d, 0x904e, 0xbcb1, 0xe2f1, 0xd0d4,
+ /* a8 */ 0xd4b9, 0xe2f5, 0xb9d6, 0xe2f6, 0x904f, 0x9050, 0x9051, 0xc7d3,
+ /* b0 */ 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xe2f0, 0x9057, 0x9058,
+ /* b8 */ 0x9059, 0x905a, 0x905b, 0xd7dc, 0xeda1, 0x905c, 0x905d, 0xe2f8,
+
+ /*** Three byte table, leaf: e681xx - offset 0x01d03 ***/
+
+ /* 80 */ 0x905e, 0xeda5, 0xe2fe, 0xcad1, 0x905f, 0x9060, 0x9061, 0x9062,
+ /* 88 */ 0x9063, 0x9064, 0x9065, 0xc1b5, 0x9066, 0xbbd0, 0x9067, 0x9068,
+ /* 90 */ 0xbfd6, 0x9069, 0xbae3, 0x906a, 0x906b, 0xcba1, 0x906c, 0x906d,
+ /* 98 */ 0x906e, 0xeda6, 0xeda3, 0x906f, 0x9070, 0xeda2, 0x9071, 0x9072,
+ /* a0 */ 0x9073, 0x9074, 0xbbd6, 0xeda7, 0xd0f4, 0x9075, 0x9076, 0xeda4,
+ /* a8 */ 0xbade, 0xb6f7, 0xe3a1, 0xb6b2, 0xccf1, 0xb9a7, 0x9077, 0xcfa2,
+ /* b0 */ 0xc7a1, 0x9078, 0x9079, 0xbfd2, 0x907a, 0x907b, 0xb6f1, 0x907c,
+ /* b8 */ 0xe2fa, 0xe2fb, 0xe2fd, 0xe2fc, 0xc4d5, 0xe3a2, 0x907d, 0xd3c1,
+
+ /*** Three byte table, leaf: e682xx - offset 0x01d43 ***/
+
+ /* 80 */ 0x907e, 0x9080, 0x9081, 0xe3a7, 0xc7c4, 0x9082, 0x9083, 0x9084,
+ /* 88 */ 0x9085, 0xcfa4, 0x9086, 0x9087, 0xe3a9, 0xbab7, 0x9088, 0x9089,
+ /* 90 */ 0x908a, 0x908b, 0xe3a8, 0x908c, 0xbbda, 0x908d, 0xe3a3, 0x908e,
+ /* 98 */ 0x908f, 0x9090, 0xe3a4, 0xe3aa, 0x9091, 0xe3a6, 0x9092, 0xcef2,
+ /* a0 */ 0xd3c6, 0x9093, 0x9094, 0xbbbc, 0x9095, 0x9096, 0xd4c3, 0x9097,
+ /* a8 */ 0xc4fa, 0x9098, 0x9099, 0xeda8, 0xd0fc, 0xe3a5, 0x909a, 0xc3f5,
+ /* b0 */ 0x909b, 0xe3ad, 0xb1af, 0x909c, 0xe3b2, 0x909d, 0x909e, 0x909f,
+ /* b8 */ 0xbcc2, 0x90a0, 0x90a1, 0xe3ac, 0xb5bf, 0x90a2, 0x90a3, 0x90a4,
+
+ /*** Three byte table, leaf: e683xx - offset 0x01d83 ***/
+
+ /* 80 */ 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0xc7e9, 0xe3b0, 0x90aa,
+ /* 88 */ 0x90ab, 0x90ac, 0xbeaa, 0xcdef, 0x90ad, 0x90ae, 0x90af, 0x90b0,
+ /* 90 */ 0x90b1, 0xbbf3, 0x90b2, 0x90b3, 0x90b4, 0xcce8, 0x90b5, 0x90b6,
+ /* 98 */ 0xe3af, 0x90b7, 0xe3b1, 0x90b8, 0xcfa7, 0xe3ae, 0x90b9, 0xcea9,
+ /* a0 */ 0xbbdd, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0xb5eb, 0xbee5,
+ /* a8 */ 0xb2d2, 0xb3cd, 0x90bf, 0xb1b9, 0xe3ab, 0xb2d1, 0xb5ac, 0xb9df,
+ /* b0 */ 0xb6e8, 0x90c0, 0x90c1, 0xcfeb, 0xe3b7, 0x90c2, 0xbbcc, 0x90c3,
+ /* b8 */ 0x90c4, 0xc8c7, 0xd0ca, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01dc3 ***/
+
+ /* 80 */ 0xe3b8, 0xb3ee, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0xeda9, 0x90ce,
+ /* 88 */ 0xd3fa, 0xd3e4, 0x90cf, 0x90d0, 0x90d1, 0xedaa, 0xe3b9, 0xd2e2,
+ /* 90 */ 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0xe3b5, 0x90d7, 0x90d8,
+ /* 98 */ 0x90d9, 0x90da, 0xd3de, 0x90db, 0x90dc, 0x90dd, 0x90de, 0xb8d0,
+ /* a0 */ 0xe3b3, 0x90df, 0x90e0, 0xe3b6, 0xb7df, 0x90e1, 0xe3b4, 0xc0a2,
+ /* a8 */ 0x90e2, 0x90e3, 0x90e4, 0xe3ba, 0x90e5, 0x90e6, 0x90e7, 0x90e8,
+ /* b0 */ 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0,
+ /* b8 */ 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0xd4b8,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01e03 ***/
+
+ /* 80 */ 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140,
+ /* 88 */ 0xb4c8, 0x9141, 0xe3bb, 0x9142, 0xbbc5, 0x9143, 0xc9f7, 0x9144,
+ /* 90 */ 0x9145, 0xc9e5, 0x9146, 0x9147, 0x9148, 0xc4bd, 0x9149, 0x914a,
+ /* 98 */ 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0xedab, 0x9150, 0x9151,
+ /* a0 */ 0x9152, 0x9153, 0xc2fd, 0x9154, 0x9155, 0x9156, 0x9157, 0xbbdb,
+ /* a8 */ 0xbfae, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e,
+ /* b0 */ 0xcebf, 0x915f, 0x9160, 0x9161, 0x9162, 0xe3bc, 0x9163, 0xbfb6,
+ /* b8 */ 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b,
+
+ /*** Three byte table, leaf: e686xx - offset 0x01e43 ***/
+
+ /* 80 */ 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173,
+ /* 88 */ 0x9174, 0x9175, 0x9176, 0xb1ef, 0x9177, 0x9178, 0xd4f7, 0x9179,
+ /* 90 */ 0x917a, 0x917b, 0x917c, 0x917d, 0xe3be, 0x917e, 0x9180, 0x9181,
+ /* 98 */ 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xedad, 0x9187, 0x9188,
+ /* a0 */ 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0xe3bf,
+ /* a8 */ 0xbaa9, 0xedac, 0x9190, 0x9191, 0xe3bd, 0x9192, 0x9193, 0x9194,
+ /* b0 */ 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0xe3c0,
+ /* b8 */ 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0xbab6, 0x91a2,
+
+ /*** Three byte table, leaf: e687xx - offset 0x01e83 ***/
+
+ /* 80 */ 0x91a3, 0x91a4, 0xb6ae, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9,
+ /* 88 */ 0xd0b8, 0x91aa, 0xb0c3, 0xedae, 0x91ab, 0x91ac, 0x91ad, 0x91ae,
+ /* 90 */ 0x91af, 0xedaf, 0xc0c1, 0x91b0, 0xe3c1, 0x91b1, 0x91b2, 0x91b3,
+ /* 98 */ 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb,
+ /* a0 */ 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0xc5b3, 0x91c2,
+ /* a8 */ 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca,
+ /* b0 */ 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0xe3c2, 0x91d0, 0x91d1,
+ /* b8 */ 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0xdcb2,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01ec3 ***/
+
+ /* 80 */ 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0xedb0, 0x91df,
+ /* 88 */ 0xb8ea, 0x91e0, 0xceec, 0xeaa7, 0xd0e7, 0xcaf9, 0xc8d6, 0xcfb7,
+ /* 90 */ 0xb3c9, 0xced2, 0xbde4, 0x91e1, 0x91e2, 0xe3de, 0xbbf2, 0xeaa8,
+ /* 98 */ 0xd5bd, 0x91e3, 0xc6dd, 0xeaa9, 0x91e4, 0x91e5, 0x91e6, 0xeaaa,
+ /* a0 */ 0x91e7, 0xeaac, 0xeaab, 0x91e8, 0xeaae, 0xeaad, 0x91e9, 0x91ea,
+ /* a8 */ 0x91eb, 0x91ec, 0xbdd8, 0x91ed, 0xeaaf, 0x91ee, 0xc2be, 0x91ef,
+ /* b0 */ 0x91f0, 0x91f1, 0x91f2, 0xb4c1, 0xb4f7, 0x91f3, 0x91f4, 0xbba7,
+ /* b8 */ 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0xece6, 0xece5, 0xb7bf,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01f03 ***/
+
+ /* 80 */ 0xcbf9, 0xb1e2, 0x91fa, 0xece7, 0x91fb, 0x91fc, 0x91fd, 0xc9c8,
+ /* 88 */ 0xece8, 0xece9, 0x91fe, 0xcad6, 0xded0, 0xb2c5, 0xd4fa, 0x9240,
+ /* 90 */ 0x9241, 0xc6cb, 0xb0c7, 0xb4f2, 0xc8d3, 0x9242, 0x9243, 0x9244,
+ /* 98 */ 0xcdd0, 0x9245, 0x9246, 0xbfb8, 0x9247, 0x9248, 0x9249, 0x924a,
+ /* a0 */ 0x924b, 0x924c, 0x924d, 0xbfdb, 0x924e, 0x924f, 0xc7a4, 0xd6b4,
+ /* a8 */ 0x9250, 0xc0a9, 0xded1, 0xc9a8, 0xd1ef, 0xc5a4, 0xb0e7, 0xb3b6,
+ /* b0 */ 0xc8c5, 0x9251, 0x9252, 0xb0e2, 0x9253, 0x9254, 0xb7f6, 0x9255,
+ /* b8 */ 0x9256, 0xc5fa, 0x9257, 0x9258, 0xb6f3, 0x9259, 0xd5d2, 0xb3d0,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01f43 ***/
+
+ /* 80 */ 0xbcbc, 0x925a, 0x925b, 0x925c, 0xb3ad, 0x925d, 0x925e, 0x925f,
+ /* 88 */ 0x9260, 0xbef1, 0xb0d1, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265,
+ /* 90 */ 0x9266, 0xd2d6, 0xcae3, 0xd7a5, 0x9267, 0xcdb6, 0xb6b6, 0xbfb9,
+ /* 98 */ 0xd5db, 0x9268, 0xb8a7, 0xc5d7, 0x9269, 0x926a, 0x926b, 0xded2,
+ /* a0 */ 0xbfd9, 0xc2d5, 0xc7c0, 0x926c, 0xbba4, 0xb1a8, 0x926d, 0x926e,
+ /* a8 */ 0xc5ea, 0x926f, 0x9270, 0xc5fb, 0xcca7, 0x9271, 0x9272, 0x9273,
+ /* b0 */ 0x9274, 0xb1a7, 0x9275, 0x9276, 0x9277, 0xb5d6, 0x9278, 0x9279,
+ /* b8 */ 0x927a, 0xc4a8, 0x927b, 0xded3, 0xd1ba, 0xb3e9, 0x927c, 0xc3f2,
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01f83 ***/
+
+ /* 80 */ 0x927d, 0x927e, 0xb7f7, 0x9280, 0xd6f4, 0xb5a3, 0xb2f0, 0xc4b4,
+ /* 88 */ 0xc4e9, 0xc0ad, 0xded4, 0x9281, 0xb0e8, 0xc5c4, 0xc1e0, 0x9282,
+ /* 90 */ 0xb9d5, 0x9283, 0xbedc, 0xcdd8, 0xb0ce, 0x9284, 0xcdcf, 0xded6,
+ /* 98 */ 0xbed0, 0xd7be, 0xded5, 0xd5d0, 0xb0dd, 0x9285, 0x9286, 0xc4e2,
+ /* a0 */ 0x9287, 0x9288, 0xc2a3, 0xbcf0, 0x9289, 0xd3b5, 0xc0b9, 0xc5a1,
+ /* a8 */ 0xb2a6, 0xd4f1, 0x928a, 0x928b, 0xc0a8, 0xcac3, 0xded7, 0xd5fc,
+ /* b0 */ 0x928c, 0xb9b0, 0x928d, 0xc8ad, 0xcba9, 0x928e, 0xded9, 0xbfbd,
+ /* b8 */ 0x928f, 0x9290, 0x9291, 0x9292, 0xc6b4, 0xd7a7, 0xcab0, 0xc4c3,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01fc3 ***/
+
+ /* 80 */ 0x9293, 0xb3d6, 0xb9d2, 0x9294, 0x9295, 0x9296, 0x9297, 0xd6b8,
+ /* 88 */ 0xeafc, 0xb0b4, 0x9298, 0x9299, 0x929a, 0x929b, 0xbfe6, 0x929c,
+ /* 90 */ 0x929d, 0xccf4, 0x929e, 0x929f, 0x92a0, 0x92a1, 0xcdda, 0x92a2,
+ /* 98 */ 0x92a3, 0x92a4, 0xd6bf, 0xc2ce, 0x92a5, 0xcece, 0xcca2, 0xd0ae,
+ /* a0 */ 0xc4d3, 0xb5b2, 0xded8, 0xd5f5, 0xbcb7, 0xbbd3, 0x92a6, 0x92a7,
+ /* a8 */ 0xb0a4, 0x92a8, 0xc5b2, 0xb4ec, 0x92a9, 0x92aa, 0x92ab, 0xd5f1,
+ /* b0 */ 0x92ac, 0x92ad, 0xeafd, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2,
+ /* b8 */ 0x92b3, 0xdeda, 0xcda6, 0x92b4, 0x92b5, 0xcdec, 0x92b6, 0x92b7,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x02003 ***/
+
+ /* 80 */ 0x92b8, 0x92b9, 0xcee6, 0xdedc, 0x92ba, 0xcdb1, 0xc0a6, 0x92bb,
+ /* 88 */ 0x92bc, 0xd7bd, 0x92bd, 0xdedb, 0xb0c6, 0xbab4, 0xc9d3, 0xc4f3,
+ /* 90 */ 0xbee8, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0xb2b6, 0x92c2, 0x92c3,
+ /* 98 */ 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0xc0cc, 0xcbf0,
+ /* a0 */ 0x92ca, 0xbcf1, 0xbbbb, 0xb5b7, 0x92cb, 0x92cc, 0x92cd, 0xc5f5,
+ /* a8 */ 0x92ce, 0xdee6, 0x92cf, 0x92d0, 0x92d1, 0xdee3, 0xbedd, 0x92d2,
+ /* b0 */ 0x92d3, 0xdedf, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0xb4b7, 0xbddd,
+ /* b8 */ 0x92d8, 0x92d9, 0xdee0, 0xc4ed, 0x92da, 0x92db, 0x92dc, 0x92dd,
+
+ /*** Three byte table, leaf: e68exx - offset 0x02043 ***/
+
+ /* 80 */ 0xcfc6, 0x92de, 0xb5e0, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0xb6de,
+ /* 88 */ 0xcada, 0xb5f4, 0xdee5, 0x92e3, 0xd5c6, 0x92e4, 0xdee1, 0xcccd,
+ /* 90 */ 0xc6fe, 0x92e5, 0xc5c5, 0x92e6, 0x92e7, 0x92e8, 0xd2b4, 0x92e9,
+ /* 98 */ 0xbef2, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0,
+ /* a0 */ 0xc2d3, 0x92f1, 0xccbd, 0xb3b8, 0x92f2, 0xbdd3, 0x92f3, 0xbfd8,
+ /* a8 */ 0xcdc6, 0xd1da, 0xb4eb, 0x92f4, 0xdee4, 0xdedd, 0xdee7, 0x92f5,
+ /* b0 */ 0xeafe, 0x92f6, 0x92f7, 0xc2b0, 0xdee2, 0x92f8, 0x92f9, 0xd6c0,
+ /* b8 */ 0xb5a7, 0x92fa, 0xb2f4, 0x92fb, 0xdee8, 0x92fc, 0xdef2, 0x92fd,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x02083 ***/
+
+ /* 80 */ 0x92fe, 0x9340, 0x9341, 0x9342, 0xdeed, 0x9343, 0xdef1, 0x9344,
+ /* 88 */ 0x9345, 0xc8e0, 0x9346, 0x9347, 0x9348, 0xd7e1, 0xdeef, 0xc3e8,
+ /* 90 */ 0xcce1, 0x9349, 0xb2e5, 0x934a, 0x934b, 0x934c, 0xd2be, 0x934d,
+ /* 98 */ 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0xdeee, 0x9354,
+ /* a0 */ 0xdeeb, 0xced5, 0x9355, 0xb4a7, 0x9356, 0x9357, 0x9358, 0x9359,
+ /* a8 */ 0x935a, 0xbfab, 0xbebe, 0x935b, 0x935c, 0xbdd2, 0x935d, 0x935e,
+ /* b0 */ 0x935f, 0x9360, 0xdee9, 0x9361, 0xd4ae, 0x9362, 0xdede, 0x9363,
+ /* b8 */ 0xdeea, 0x9364, 0x9365, 0x9366, 0x9367, 0xc0bf, 0x9368, 0xdeec,
+
+ /*** Three byte table, leaf: e690xx - offset 0x020c3 ***/
+
+ /* 80 */ 0xb2f3, 0xb8e9, 0xc2a7, 0x9369, 0x936a, 0xbdc1, 0x936b, 0x936c,
+ /* 88 */ 0x936d, 0x936e, 0x936f, 0xdef5, 0xdef8, 0x9370, 0x9371, 0xb2ab,
+ /* 90 */ 0xb4a4, 0x9372, 0x9373, 0xb4ea, 0xc9a6, 0x9374, 0x9375, 0x9376,
+ /* 98 */ 0x9377, 0x9378, 0x9379, 0xdef6, 0xcbd1, 0x937a, 0xb8e3, 0x937b,
+ /* a0 */ 0xdef7, 0xdefa, 0x937c, 0x937d, 0x937e, 0x9380, 0xdef9, 0x9381,
+ /* a8 */ 0x9382, 0x9383, 0xccc2, 0x9384, 0xb0e1, 0xb4ee, 0x9385, 0x9386,
+ /* b0 */ 0x9387, 0x9388, 0x9389, 0x938a, 0xe5ba, 0x938b, 0x938c, 0x938d,
+ /* b8 */ 0x938e, 0x938f, 0xd0af, 0x9390, 0x9391, 0xb2eb, 0x9392, 0xeba1,
+
+ /*** Three byte table, leaf: e691xx - offset 0x02103 ***/
+
+ /* 80 */ 0x9393, 0xdef4, 0x9394, 0x9395, 0xc9e3, 0xdef3, 0xb0da, 0xd2a1,
+ /* 88 */ 0xb1f7, 0x9396, 0xccaf, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b,
+ /* 90 */ 0x939c, 0x939d, 0xdef0, 0x939e, 0xcba4, 0x939f, 0x93a0, 0x93a1,
+ /* 98 */ 0xd5aa, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0xdefb, 0x93a7,
+ /* a0 */ 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0xb4dd,
+ /* a8 */ 0x93af, 0xc4a6, 0x93b0, 0x93b1, 0x93b2, 0xdefd, 0x93b3, 0x93b4,
+ /* b0 */ 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc,
+ /* b8 */ 0xc3fe, 0xc4a1, 0xdfa1, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1,
+
+ /*** Three byte table, leaf: e692xx - offset 0x02143 ***/
+
+ /* 80 */ 0x93c2, 0x93c3, 0xc1cc, 0x93c4, 0xdefc, 0xbeef, 0x93c5, 0xc6b2,
+ /* 88 */ 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd,
+ /* 90 */ 0x93ce, 0xb3c5, 0xc8f6, 0x93cf, 0x93d0, 0xcbba, 0xdefe, 0x93d1,
+ /* 98 */ 0x93d2, 0xdfa4, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0xd7b2, 0x93d7,
+ /* a0 */ 0x93d8, 0x93d9, 0x93da, 0x93db, 0xb3b7, 0x93dc, 0x93dd, 0x93de,
+ /* a8 */ 0x93df, 0xc1c3, 0x93e0, 0x93e1, 0xc7cb, 0xb2a5, 0xb4e9, 0x93e2,
+ /* b0 */ 0xd7ab, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0xc4ec, 0x93e7, 0xdfa2,
+ /* b8 */ 0xdfa3, 0x93e8, 0xdfa5, 0x93e9, 0xbab3, 0x93ea, 0x93eb, 0x93ec,
+
+ /*** Three byte table, leaf: e693xx - offset 0x02183 ***/
+
+ /* 80 */ 0xdfa6, 0x93ed, 0xc0de, 0x93ee, 0x93ef, 0xc9c3, 0x93f0, 0x93f1,
+ /* 88 */ 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0xb2d9, 0xc7e6, 0x93f7,
+ /* 90 */ 0xdfa7, 0x93f8, 0xc7dc, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0xdfa8,
+ /* 98 */ 0xeba2, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0xcbd3, 0x9443,
+ /* a0 */ 0x9444, 0x9445, 0xdfaa, 0x9446, 0xdfa9, 0x9447, 0xb2c1, 0x9448,
+ /* a8 */ 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450,
+ /* b0 */ 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458,
+ /* b8 */ 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460,
+
+ /*** Three byte table, leaf: e694xx - offset 0x021c3 ***/
+
+ /* 80 */ 0xc5ca, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467,
+ /* 88 */ 0x9468, 0xdfab, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e,
+ /* 90 */ 0x946f, 0x9470, 0xd4dc, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475,
+ /* 98 */ 0xc8c1, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c,
+ /* a0 */ 0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0xdfac, 0x9483, 0x9484,
+ /* a8 */ 0x9485, 0x9486, 0x9487, 0xbef0, 0x9488, 0x9489, 0xdfad, 0xd6a7,
+ /* b0 */ 0x948a, 0x948b, 0x948c, 0x948d, 0xeab7, 0xebb6, 0xcad5, 0x948e,
+ /* b8 */ 0xd8fc, 0xb8c4, 0x948f, 0xb9a5, 0x9490, 0x9491, 0xb7c5, 0xd5fe,
+
+ /*** Three byte table, leaf: e695xx - offset 0x02203 ***/
+
+ /* 80 */ 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xb9ca, 0x9497, 0x9498,
+ /* 88 */ 0xd0a7, 0xf4cd, 0x9499, 0x949a, 0xb5d0, 0x949b, 0x949c, 0xc3f4,
+ /* 90 */ 0x949d, 0xbec8, 0x949e, 0x949f, 0x94a0, 0xebb7, 0xb0bd, 0x94a1,
+ /* 98 */ 0x94a2, 0xbdcc, 0x94a3, 0xc1b2, 0x94a4, 0xb1d6, 0xb3a8, 0x94a5,
+ /* a0 */ 0x94a6, 0x94a7, 0xb8d2, 0xc9a2, 0x94a8, 0x94a9, 0xb6d8, 0x94aa,
+ /* a8 */ 0x94ab, 0x94ac, 0x94ad, 0xebb8, 0xbeb4, 0x94ae, 0x94af, 0x94b0,
+ /* b0 */ 0xcafd, 0x94b1, 0xc7c3, 0x94b2, 0xd5fb, 0x94b3, 0x94b4, 0xb7f3,
+ /* b8 */ 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc,
+
+ /*** Three byte table, leaf: e696xx - offset 0x02243 ***/
+
+ /* 80 */ 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0xcec4,
+ /* 88 */ 0x94c4, 0x94c5, 0x94c6, 0xd5ab, 0xb1f3, 0x94c7, 0x94c8, 0x94c9,
+ /* 90 */ 0xecb3, 0xb0df, 0x94ca, 0xecb5, 0x94cb, 0x94cc, 0x94cd, 0xb6b7,
+ /* 98 */ 0x94ce, 0xc1cf, 0x94cf, 0xf5fa, 0xd0b1, 0x94d0, 0x94d1, 0xd5e5,
+ /* a0 */ 0x94d2, 0xced3, 0x94d3, 0x94d4, 0xbdef, 0xb3e2, 0x94d5, 0xb8ab,
+ /* a8 */ 0x94d6, 0xd5b6, 0x94d7, 0xedbd, 0x94d8, 0xb6cf, 0x94d9, 0xcbb9,
+ /* b0 */ 0xd0c2, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0,
+ /* b8 */ 0x94e1, 0xb7bd, 0x94e2, 0x94e3, 0xecb6, 0xcaa9, 0x94e4, 0x94e5,
+
+ /*** Three byte table, leaf: e697xx - offset 0x02283 ***/
+
+ /* 80 */ 0x94e6, 0xc5d4, 0x94e7, 0xecb9, 0xecb8, 0xc2c3, 0xecb7, 0x94e8,
+ /* 88 */ 0x94e9, 0x94ea, 0x94eb, 0xd0fd, 0xecba, 0x94ec, 0xecbb, 0xd7e5,
+ /* 90 */ 0x94ed, 0x94ee, 0xecbc, 0x94ef, 0x94f0, 0x94f1, 0xecbd, 0xc6ec,
+ /* 98 */ 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9,
+ /* a0 */ 0xcede, 0x94fa, 0xbcc8, 0x94fb, 0x94fc, 0xc8d5, 0xb5a9, 0xbec9,
+ /* a8 */ 0xd6bc, 0xd4e7, 0x94fd, 0x94fe, 0xd1ae, 0xd0f1, 0xeab8, 0xeab9,
+ /* b0 */ 0xeaba, 0xbab5, 0x9540, 0x9541, 0x9542, 0x9543, 0xcab1, 0xbff5,
+ /* b8 */ 0x9544, 0x9545, 0xcdfa, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a,
+
+ /*** Three byte table, leaf: e698xx - offset 0x022c3 ***/
+
+ /* 80 */ 0xeac0, 0x954b, 0xb0ba, 0xeabe, 0x954c, 0x954d, 0xc0a5, 0x954e,
+ /* 88 */ 0x954f, 0x9550, 0xeabb, 0x9551, 0xb2fd, 0x9552, 0xc3f7, 0xbbe8,
+ /* 90 */ 0x9553, 0x9554, 0x9555, 0xd2d7, 0xcef4, 0xeabf, 0x9556, 0x9557,
+ /* 98 */ 0x9558, 0xeabc, 0x9559, 0x955a, 0x955b, 0xeac3, 0x955c, 0xd0c7,
+ /* a0 */ 0xd3b3, 0x955d, 0x955e, 0x955f, 0x9560, 0xb4ba, 0x9561, 0xc3c1,
+ /* a8 */ 0xd7f2, 0x9562, 0x9563, 0x9564, 0x9565, 0xd5d1, 0x9566, 0xcac7,
+ /* b0 */ 0x9567, 0xeac5, 0x9568, 0x9569, 0xeac4, 0xeac7, 0xeac6, 0x956a,
+ /* b8 */ 0x956b, 0x956c, 0x956d, 0x956e, 0xd6e7, 0x956f, 0xcfd4, 0x9570,
+
+ /*** Three byte table, leaf: e699xx - offset 0x02303 ***/
+
+ /* 80 */ 0x9571, 0xeacb, 0x9572, 0xbbce, 0x9573, 0x9574, 0x9575, 0x9576,
+ /* 88 */ 0x9577, 0x9578, 0x9579, 0xbdfa, 0xc9ce, 0x957a, 0x957b, 0xeacc,
+ /* 90 */ 0x957c, 0x957d, 0xc9b9, 0xcffe, 0xeaca, 0xd4ce, 0xeacd, 0xeacf,
+ /* 98 */ 0x957e, 0x9580, 0xcded, 0x9581, 0x9582, 0x9583, 0x9584, 0xeac9,
+ /* a0 */ 0x9585, 0xeace, 0x9586, 0x9587, 0xceee, 0x9588, 0xbbde, 0x9589,
+ /* a8 */ 0xb3bf, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0xc6d5, 0xbeb0,
+ /* b0 */ 0xcefa, 0x958f, 0x9590, 0x9591, 0xc7e7, 0x9592, 0xbea7, 0xead0,
+ /* b8 */ 0x9593, 0x9594, 0xd6c7, 0x9595, 0x9596, 0x9597, 0xc1c0, 0x9598,
+
+ /*** Three byte table, leaf: e69axx - offset 0x02343 ***/
+
+ /* 80 */ 0x9599, 0x959a, 0xd4dd, 0x959b, 0xead1, 0x959c, 0x959d, 0xcfbe,
+ /* 88 */ 0x959e, 0x959f, 0x95a0, 0x95a1, 0xead2, 0x95a2, 0x95a3, 0x95a4,
+ /* 90 */ 0x95a5, 0xcaee, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0xc5af, 0xb0b5,
+ /* 98 */ 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0xead4, 0x95af, 0x95b0,
+ /* a0 */ 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0xead3,
+ /* a8 */ 0xf4df, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0xc4ba, 0x95bd,
+ /* b0 */ 0x95be, 0x95bf, 0x95c0, 0x95c1, 0xb1a9, 0x95c2, 0x95c3, 0x95c4,
+ /* b8 */ 0x95c5, 0xe5df, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0xead5, 0x95ca,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x02383 ***/
+
+ /* 80 */ 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2,
+ /* 88 */ 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da,
+ /* 90 */ 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2,
+ /* 98 */ 0x95e3, 0xcaef, 0x95e4, 0xead6, 0xead7, 0xc6d8, 0x95e5, 0x95e6,
+ /* a0 */ 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0xead8, 0x95ed,
+ /* a8 */ 0x95ee, 0xead9, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4,
+ /* b0 */ 0xd4bb, 0x95f5, 0xc7fa, 0xd2b7, 0xb8fc, 0x95f6, 0x95f7, 0xeac2,
+ /* b8 */ 0x95f8, 0xb2dc, 0x95f9, 0x95fa, 0xc2fc, 0x95fb, 0xd4f8, 0xcce6,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x023c3 ***/
+
+ /* 80 */ 0xd7ee, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643,
+ /* 88 */ 0xd4c2, 0xd3d0, 0xebc3, 0xc5f3, 0x9644, 0xb7fe, 0x9645, 0x9646,
+ /* 90 */ 0xebd4, 0x9647, 0x9648, 0x9649, 0xcbb7, 0xebde, 0x964a, 0xc0ca,
+ /* 98 */ 0x964b, 0x964c, 0x964d, 0xcdfb, 0x964e, 0xb3af, 0x964f, 0xc6da,
+ /* a0 */ 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0xebfc, 0x9656,
+ /* a8 */ 0xc4be, 0x9657, 0xceb4, 0xc4a9, 0xb1be, 0xd4fd, 0x9658, 0xcaf5,
+ /* b0 */ 0x9659, 0xd6ec, 0x965a, 0x965b, 0xc6d3, 0xb6e4, 0x965c, 0x965d,
+ /* b8 */ 0x965e, 0x965f, 0xbbfa, 0x9660, 0x9661, 0xd0e0, 0x9662, 0x9663,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x02403 ***/
+
+ /* 80 */ 0xc9b1, 0x9664, 0xd4d3, 0xc8a8, 0x9665, 0x9666, 0xb8cb, 0x9667,
+ /* 88 */ 0xe8be, 0xc9bc, 0x9668, 0x9669, 0xe8bb, 0x966a, 0xc0ee, 0xd0d3,
+ /* 90 */ 0xb2c4, 0xb4e5, 0x966b, 0xe8bc, 0x966c, 0x966d, 0xd5c8, 0x966e,
+ /* 98 */ 0x966f, 0x9670, 0x9671, 0x9672, 0xb6c5, 0x9673, 0xe8bd, 0xcaf8,
+ /* a0 */ 0xb8dc, 0xccf5, 0x9674, 0x9675, 0x9676, 0xc0b4, 0x9677, 0x9678,
+ /* a8 */ 0xd1ee, 0xe8bf, 0xe8c2, 0x9679, 0x967a, 0xbabc, 0x967b, 0xb1ad,
+ /* b0 */ 0xbddc, 0x967c, 0xeabd, 0xe8c3, 0x967d, 0xe8c6, 0x967e, 0xe8cb,
+ /* b8 */ 0x9680, 0x9681, 0x9682, 0x9683, 0xe8cc, 0x9684, 0xcbc9, 0xb0e5,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02443 ***/
+
+ /* 80 */ 0x9685, 0xbcab, 0x9686, 0x9687, 0xb9b9, 0x9688, 0x9689, 0xe8c1,
+ /* 88 */ 0x968a, 0xcdf7, 0x968b, 0xe8ca, 0x968c, 0x968d, 0x968e, 0x968f,
+ /* 90 */ 0xcef6, 0x9690, 0x9691, 0x9692, 0x9693, 0xd5ed, 0x9694, 0xc1d6,
+ /* 98 */ 0xe8c4, 0x9695, 0xc3b6, 0x9696, 0xb9fb, 0xd6a6, 0xe8c8, 0x9697,
+ /* a0 */ 0x9698, 0x9699, 0xcae0, 0xd4e6, 0x969a, 0xe8c0, 0x969b, 0xe8c5,
+ /* a8 */ 0xe8c7, 0x969c, 0xc7b9, 0xb7e3, 0x969d, 0xe8c9, 0x969e, 0xbfdd,
+ /* b0 */ 0xe8d2, 0x969f, 0x96a0, 0xe8d7, 0x96a1, 0xe8d5, 0xbcdc, 0xbccf,
+ /* b8 */ 0xe8db, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x02483 ***/
+
+ /* 80 */ 0x96a9, 0xe8de, 0x96aa, 0xe8da, 0xb1fa, 0x96ab, 0x96ac, 0x96ad,
+ /* 88 */ 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0xb0d8,
+ /* 90 */ 0xc4b3, 0xb8cc, 0xc6e2, 0xc8be, 0xc8e1, 0x96b5, 0x96b6, 0x96b7,
+ /* 98 */ 0xe8cf, 0xe8d4, 0xe8d6, 0x96b8, 0xb9f1, 0xe8d8, 0xd7f5, 0x96b9,
+ /* a0 */ 0xc4fb, 0x96ba, 0xe8dc, 0x96bb, 0x96bc, 0xb2e9, 0x96bd, 0x96be,
+ /* a8 */ 0x96bf, 0xe8d1, 0x96c0, 0x96c1, 0xbced, 0x96c2, 0x96c3, 0xbfc2,
+ /* b0 */ 0xe8cd, 0xd6f9, 0x96c4, 0xc1f8, 0xb2f1, 0x96c5, 0x96c6, 0x96c7,
+ /* b8 */ 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0xe8df, 0x96cd, 0xcac1,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x024c3 ***/
+
+ /* 80 */ 0xe8d9, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0xd5a4, 0x96d2, 0xb1ea,
+ /* 88 */ 0xd5bb, 0xe8ce, 0xe8d0, 0xb6b0, 0xe8d3, 0x96d3, 0xe8dd, 0xc0b8,
+ /* 90 */ 0x96d4, 0xcaf7, 0x96d5, 0xcba8, 0x96d6, 0x96d7, 0xc6dc, 0xc0f5,
+ /* 98 */ 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0xe8e9, 0x96dd, 0x96de,
+ /* a0 */ 0x96df, 0xd0a3, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5,
+ /* a8 */ 0x96e6, 0xe8f2, 0xd6ea, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb,
+ /* b0 */ 0x96ec, 0x96ed, 0xe8e0, 0xe8e1, 0x96ee, 0x96ef, 0x96f0, 0xd1f9,
+ /* b8 */ 0xbacb, 0xb8f9, 0x96f1, 0x96f2, 0xb8f1, 0xd4d4, 0xe8ef, 0x96f3,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02503 ***/
+
+ /* 80 */ 0xe8ee, 0xe8ec, 0xb9f0, 0xccd2, 0xe8e6, 0xcea6, 0xbff2, 0x96f4,
+ /* 88 */ 0xb0b8, 0xe8f1, 0xe8f0, 0x96f5, 0xd7c0, 0x96f6, 0xe8e4, 0x96f7,
+ /* 90 */ 0xcda9, 0xc9a3, 0x96f8, 0xbbb8, 0xbddb, 0xe8ea, 0x96f9, 0x96fa,
+ /* 98 */ 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743,
+ /* a0 */ 0xe8e2, 0xe8e3, 0xe8e5, 0xb5b5, 0xe8e7, 0xc7c5, 0xe8eb, 0xe8ed,
+ /* a8 */ 0xbdb0, 0xd7ae, 0x9744, 0xe8f8, 0x9745, 0x9746, 0x9747, 0x9748,
+ /* b0 */ 0x9749, 0x974a, 0x974b, 0x974c, 0xe8f5, 0x974d, 0xcdb0, 0xe8f6,
+ /* b8 */ 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02543 ***/
+
+ /* 80 */ 0x9756, 0xc1ba, 0x9757, 0xe8e8, 0x9758, 0xc3b7, 0xb0f0, 0x9759,
+ /* 88 */ 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0xe8f4,
+ /* 90 */ 0x9761, 0x9762, 0x9763, 0xe8f7, 0x9764, 0x9765, 0x9766, 0xb9a3,
+ /* 98 */ 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e,
+ /* a0 */ 0x976f, 0x9770, 0xc9d2, 0x9771, 0x9772, 0x9773, 0xc3ce, 0xcee0,
+ /* a8 */ 0xc0e6, 0x9774, 0x9775, 0x9776, 0x9777, 0xcbf3, 0x9778, 0xccdd,
+ /* b0 */ 0xd0b5, 0x9779, 0x977a, 0xcae1, 0x977b, 0xe8f3, 0x977c, 0x977d,
+ /* b8 */ 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786,
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02583 ***/
+
+ /* 80 */ 0xbcec, 0x9787, 0xe8f9, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c,
+ /* 88 */ 0x978d, 0xc3de, 0x978e, 0xc6e5, 0x978f, 0xb9f7, 0x9790, 0x9791,
+ /* 90 */ 0x9792, 0x9793, 0xb0f4, 0x9794, 0x9795, 0xd7d8, 0x9796, 0x9797,
+ /* 98 */ 0xbcac, 0x9798, 0xc5ef, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d,
+ /* a0 */ 0xccc4, 0x979e, 0x979f, 0xe9a6, 0x97a0, 0x97a1, 0x97a2, 0x97a3,
+ /* a8 */ 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0xc9ad, 0x97aa,
+ /* b0 */ 0xe9a2, 0xc0e2, 0x97ab, 0x97ac, 0x97ad, 0xbfc3, 0x97ae, 0x97af,
+ /* b8 */ 0x97b0, 0xe8fe, 0xb9d7, 0x97b1, 0xe8fb, 0x97b2, 0x97b3, 0x97b4,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x025c3 ***/
+
+ /* 80 */ 0x97b5, 0xe9a4, 0x97b6, 0x97b7, 0x97b8, 0xd2ce, 0x97b9, 0x97ba,
+ /* 88 */ 0x97bb, 0x97bc, 0x97bd, 0xe9a3, 0x97be, 0xd6b2, 0xd7b5, 0x97bf,
+ /* 90 */ 0xe9a7, 0x97c0, 0xbdb7, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5,
+ /* 98 */ 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0xe8fc,
+ /* a0 */ 0xe8fd, 0x97cd, 0x97ce, 0x97cf, 0xe9a1, 0x97d0, 0x97d1, 0x97d2,
+ /* a8 */ 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0xcdd6, 0x97d8, 0x97d9,
+ /* b0 */ 0xd2ac, 0x97da, 0x97db, 0x97dc, 0xe9b2, 0x97dd, 0x97de, 0x97df,
+ /* b8 */ 0x97e0, 0xe9a9, 0x97e1, 0x97e2, 0x97e3, 0xb4aa, 0x97e4, 0xb4bb,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02603 ***/
+
+ /* 80 */ 0x97e5, 0x97e6, 0xe9ab, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb,
+ /* 88 */ 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3,
+ /* 90 */ 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0xd0a8, 0x97f8, 0x97f9, 0xe9a5,
+ /* 98 */ 0x97fa, 0x97fb, 0xb3fe, 0x97fc, 0x97fd, 0xe9ac, 0xc0e3, 0x97fe,
+ /* a0 */ 0xe9aa, 0x9840, 0x9841, 0xe9b9, 0x9842, 0x9843, 0xe9b8, 0x9844,
+ /* a8 */ 0x9845, 0x9846, 0x9847, 0xe9ae, 0x9848, 0x9849, 0xe8fa, 0x984a,
+ /* b0 */ 0x984b, 0xe9a8, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0xbfac,
+ /* b8 */ 0xe9b1, 0xe9ba, 0x9851, 0x9852, 0xc2a5, 0x9853, 0x9854, 0x9855,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02643 ***/
+
+ /* 80 */ 0xe9af, 0x9856, 0xb8c5, 0x9857, 0xe9ad, 0x9858, 0xd3dc, 0xe9b4,
+ /* 88 */ 0xe9b5, 0xe9b7, 0x9859, 0x985a, 0x985b, 0xe9c7, 0x985c, 0x985d,
+ /* 90 */ 0x985e, 0x985f, 0x9860, 0x9861, 0xc0c6, 0xe9c5, 0x9862, 0x9863,
+ /* 98 */ 0xe9b0, 0x9864, 0x9865, 0xe9bb, 0xb0f1, 0x9866, 0x9867, 0x9868,
+ /* a0 */ 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0xe9bc,
+ /* a8 */ 0xd5a5, 0x9870, 0x9871, 0xe9be, 0x9872, 0xe9bf, 0x9873, 0x9874,
+ /* b0 */ 0x9875, 0xe9c1, 0x9876, 0x9877, 0xc1f1, 0x9878, 0x9879, 0xc8b6,
+ /* b8 */ 0x987a, 0x987b, 0x987c, 0xe9bd, 0x987d, 0x987e, 0x9880, 0x9881,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x02683 ***/
+
+ /* 80 */ 0x9882, 0xe9c2, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888,
+ /* 88 */ 0x9889, 0x988a, 0xe9c3, 0x988b, 0xe9b3, 0x988c, 0xe9b6, 0x988d,
+ /* 90 */ 0xbbb1, 0x988e, 0x988f, 0x9890, 0xe9c0, 0x9891, 0x9892, 0x9893,
+ /* 98 */ 0x9894, 0x9895, 0x9896, 0xbcf7, 0x9897, 0x9898, 0x9899, 0xe9c4,
+ /* a0 */ 0xe9c6, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0,
+ /* a8 */ 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0xe9ca, 0x98a6, 0x98a7,
+ /* b0 */ 0x98a8, 0x98a9, 0xe9ce, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae,
+ /* b8 */ 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0xb2db, 0x98b4, 0xe9c8,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x026c3 ***/
+
+ /* 80 */ 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc,
+ /* 88 */ 0x98bd, 0x98be, 0xb7ae, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3,
+ /* 90 */ 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0xe9cb,
+ /* 98 */ 0xe9cc, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0xd5c1,
+ /* a0 */ 0x98d1, 0xc4a3, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7,
+ /* a8 */ 0xe9d8, 0x98d8, 0xbae1, 0x98d9, 0x98da, 0x98db, 0x98dc, 0xe9c9,
+ /* b0 */ 0x98dd, 0xd3a3, 0x98de, 0x98df, 0x98e0, 0xe9d4, 0x98e1, 0x98e2,
+ /* b8 */ 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0xe9d7, 0xe9d0, 0x98e8,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x02703 ***/
+
+ /* 80 */ 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0xe9cf, 0x98ed, 0x98ee, 0xc7c1,
+ /* 88 */ 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6,
+ /* 90 */ 0xe9d2, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd,
+ /* 98 */ 0xe9d9, 0xb3c8, 0x98fe, 0xe9d3, 0x9940, 0x9941, 0x9942, 0x9943,
+ /* a0 */ 0x9944, 0xcff0, 0x9945, 0x9946, 0x9947, 0xe9cd, 0x9948, 0x9949,
+ /* a8 */ 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951,
+ /* b0 */ 0x9952, 0xb3f7, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958,
+ /* b8 */ 0x9959, 0xe9d6, 0x995a, 0x995b, 0xe9da, 0x995c, 0x995d, 0x995e,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02743 ***/
+
+ /* 80 */ 0xccb4, 0x995f, 0x9960, 0x9961, 0xcfad, 0x9962, 0x9963, 0x9964,
+ /* 88 */ 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0xe9d5, 0x996b,
+ /* 90 */ 0xe9dc, 0xe9db, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0xe9de,
+ /* 98 */ 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978,
+ /* a0 */ 0xe9d1, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980,
+ /* a8 */ 0x9981, 0xe9dd, 0x9982, 0xe9df, 0xc3ca, 0x9983, 0x9984, 0x9985,
+ /* b0 */ 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d,
+ /* b8 */ 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995,
+
+ /*** Three byte table, leaf: e6abxx - offset 0x02783 ***/
+
+ /* 80 */ 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d,
+ /* 88 */ 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5,
+ /* 90 */ 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad,
+ /* 98 */ 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5,
+ /* a0 */ 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd,
+ /* a8 */ 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5,
+ /* b0 */ 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd,
+ /* b8 */ 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5,
+
+ /*** Three byte table, leaf: e6acxx - offset 0x027c3 ***/
+
+ /* 80 */ 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd,
+ /* 88 */ 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5,
+ /* 90 */ 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed,
+ /* 98 */ 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5,
+ /* a0 */ 0xc7b7, 0xb4ce, 0xbbb6, 0xd0c0, 0xeca3, 0x99f6, 0x99f7, 0xc5b7,
+ /* a8 */ 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40,
+ /* b0 */ 0x9a41, 0x9a42, 0xd3fb, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0xeca4,
+ /* b8 */ 0x9a47, 0xeca5, 0xc6db, 0x9a48, 0x9a49, 0x9a4a, 0xbfee, 0x9a4b,
+
+ /*** Three byte table, leaf: e6adxx - offset 0x02803 ***/
+
+ /* 80 */ 0x9a4c, 0x9a4d, 0x9a4e, 0xeca6, 0x9a4f, 0x9a50, 0xeca7, 0xd0aa,
+ /* 88 */ 0x9a51, 0xc7b8, 0x9a52, 0x9a53, 0xb8e8, 0x9a54, 0x9a55, 0x9a56,
+ /* 90 */ 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e,
+ /* 98 */ 0x9a5f, 0xeca8, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65,
+ /* a0 */ 0x9a66, 0x9a67, 0xd6b9, 0xd5fd, 0xb4cb, 0xb2bd, 0xcee4, 0xc6e7,
+ /* a8 */ 0x9a68, 0x9a69, 0xcde1, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e,
+ /* b0 */ 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76,
+ /* b8 */ 0x9a77, 0xb4f5, 0x9a78, 0xcbc0, 0xbcdf, 0x9a79, 0x9a7a, 0x9a7b,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02843 ***/
+
+ /* 80 */ 0x9a7c, 0xe9e2, 0xe9e3, 0xd1ea, 0xe9e5, 0x9a7d, 0xb4f9, 0xe9e4,
+ /* 88 */ 0x9a7e, 0xd1b3, 0xcae2, 0xb2d0, 0x9a80, 0xe9e8, 0x9a81, 0x9a82,
+ /* 90 */ 0x9a83, 0x9a84, 0xe9e6, 0xe9e7, 0x9a85, 0x9a86, 0xd6b3, 0x9a87,
+ /* 98 */ 0x9a88, 0x9a89, 0xe9e9, 0xe9ea, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d,
+ /* a0 */ 0x9a8e, 0xe9eb, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94,
+ /* a8 */ 0x9a95, 0x9a96, 0xe9ec, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b,
+ /* b0 */ 0x9a9c, 0x9a9d, 0x9a9e, 0xecaf, 0xc5b9, 0xb6ce, 0x9a9f, 0xd2f3,
+ /* b8 */ 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0xb5ee,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x02883 ***/
+
+ /* 80 */ 0x9aa7, 0xbbd9, 0xecb1, 0x9aa8, 0x9aa9, 0xd2e3, 0x9aaa, 0x9aab,
+ /* 88 */ 0x9aac, 0x9aad, 0x9aae, 0xcee3, 0x9aaf, 0xc4b8, 0x9ab0, 0xc3bf,
+ /* 90 */ 0x9ab1, 0x9ab2, 0xb6be, 0xd8b9, 0xb1c8, 0xb1cf, 0xb1d1, 0xc5fe,
+ /* 98 */ 0x9ab3, 0xb1d0, 0x9ab4, 0xc3ab, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8,
+ /* a0 */ 0x9ab9, 0xd5b1, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf,
+ /* a8 */ 0x9ac0, 0x9ac1, 0xeba4, 0xbac1, 0x9ac2, 0x9ac3, 0x9ac4, 0xccba,
+ /* b0 */ 0x9ac5, 0x9ac6, 0x9ac7, 0xeba5, 0x9ac8, 0xeba7, 0x9ac9, 0x9aca,
+ /* b8 */ 0x9acb, 0xeba8, 0x9acc, 0x9acd, 0x9ace, 0xeba6, 0x9acf, 0x9ad0,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x028c3 ***/
+
+ /* 80 */ 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0xeba9, 0xebab, 0xebaa,
+ /* 88 */ 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0xebac, 0x9adb, 0xcacf,
+ /* 90 */ 0xd8b5, 0xc3f1, 0x9adc, 0xc3a5, 0xc6f8, 0xebad, 0xc4ca, 0x9add,
+ /* 98 */ 0xebae, 0xebaf, 0xebb0, 0xb7d5, 0x9ade, 0x9adf, 0x9ae0, 0xb7fa,
+ /* a0 */ 0x9ae1, 0xebb1, 0xc7e2, 0x9ae2, 0xebb3, 0x9ae3, 0xbaa4, 0xd1f5,
+ /* a8 */ 0xb0b1, 0xebb2, 0xebb4, 0x9ae4, 0x9ae5, 0x9ae6, 0xb5aa, 0xc2c8,
+ /* b0 */ 0xc7e8, 0x9ae7, 0xebb5, 0x9ae8, 0xcbae, 0xe3df, 0x9ae9, 0x9aea,
+ /* b8 */ 0xd3c0, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0xd9db, 0x9aef, 0x9af0,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x02903 ***/
+
+ /* 80 */ 0xcda1, 0xd6ad, 0xc7f3, 0x9af1, 0x9af2, 0x9af3, 0xd9e0, 0xbbe3,
+ /* 88 */ 0x9af4, 0xbaba, 0xe3e2, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9,
+ /* 90 */ 0xcfab, 0x9afa, 0x9afb, 0x9afc, 0xe3e0, 0xc9c7, 0x9afd, 0xbab9,
+ /* 98 */ 0x9afe, 0x9b40, 0x9b41, 0xd1b4, 0xe3e1, 0xc8ea, 0xb9af, 0xbdad,
+ /* a0 */ 0xb3d8, 0xcedb, 0x9b42, 0x9b43, 0xccc0, 0x9b44, 0x9b45, 0x9b46,
+ /* a8 */ 0xe3e8, 0xe3e9, 0xcdf4, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b,
+ /* b0 */ 0xccad, 0x9b4c, 0xbcb3, 0x9b4d, 0xe3ea, 0x9b4e, 0xe3eb, 0x9b4f,
+ /* b8 */ 0x9b50, 0xd0da, 0x9b51, 0x9b52, 0x9b53, 0xc6fb, 0xb7da, 0x9b54,
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02943 ***/
+
+ /* 80 */ 0x9b55, 0xc7df, 0xd2ca, 0xced6, 0x9b56, 0xe3e4, 0xe3ec, 0x9b57,
+ /* 88 */ 0xc9f2, 0xb3c1, 0x9b58, 0x9b59, 0xe3e7, 0x9b5a, 0x9b5b, 0xc6e3,
+ /* 90 */ 0xe3e5, 0x9b5c, 0x9b5d, 0xedb3, 0xe3e6, 0x9b5e, 0x9b5f, 0x9b60,
+ /* 98 */ 0x9b61, 0xc9b3, 0x9b62, 0xc5e6, 0x9b63, 0x9b64, 0x9b65, 0xb9b5,
+ /* a0 */ 0x9b66, 0xc3bb, 0x9b67, 0xe3e3, 0xc5bd, 0xc1a4, 0xc2d9, 0xb2d7,
+ /* a8 */ 0x9b68, 0xe3ed, 0xbba6, 0xc4ad, 0x9b69, 0xe3f0, 0xbeda, 0x9b6a,
+ /* b0 */ 0x9b6b, 0xe3fb, 0xe3f5, 0xbad3, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f,
+ /* b8 */ 0xb7d0, 0xd3cd, 0x9b70, 0xd6ce, 0xd5d3, 0xb9c1, 0xd5b4, 0xd1d8,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02983 ***/
+
+ /* 80 */ 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0xd0b9, 0xc7f6, 0x9b75, 0x9b76,
+ /* 88 */ 0x9b77, 0xc8aa, 0xb2b4, 0x9b78, 0xc3da, 0x9b79, 0x9b7a, 0x9b7b,
+ /* 90 */ 0xe3ee, 0x9b7c, 0x9b7d, 0xe3fc, 0xe3ef, 0xb7a8, 0xe3f7, 0xe3f4,
+ /* 98 */ 0x9b7e, 0x9b80, 0x9b81, 0xb7ba, 0x9b82, 0x9b83, 0xc5a2, 0x9b84,
+ /* a0 */ 0xe3f6, 0xc5dd, 0xb2a8, 0xc6fc, 0x9b85, 0xc4e0, 0x9b86, 0x9b87,
+ /* a8 */ 0xd7a2, 0x9b88, 0xc0e1, 0xe3f9, 0x9b89, 0x9b8a, 0xe3fa, 0xe3fd,
+ /* b0 */ 0xcca9, 0xe3f3, 0x9b8b, 0xd3be, 0x9b8c, 0xb1c3, 0xedb4, 0xe3f1,
+ /* b8 */ 0xe3f2, 0x9b8d, 0xe3f8, 0xd0ba, 0xc6c3, 0xd4f3, 0xe3fe, 0x9b8e,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x029c3 ***/
+
+ /* 80 */ 0x9b8f, 0xbde0, 0x9b90, 0x9b91, 0xe4a7, 0x9b92, 0x9b93, 0xe4a6,
+ /* 88 */ 0x9b94, 0x9b95, 0x9b96, 0xd1f3, 0xe4a3, 0x9b97, 0xe4a9, 0x9b98,
+ /* 90 */ 0x9b99, 0x9b9a, 0xc8f7, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0xcfb4,
+ /* 98 */ 0x9b9f, 0xe4a8, 0xe4ae, 0xc2e5, 0x9ba0, 0x9ba1, 0xb6b4, 0x9ba2,
+ /* a0 */ 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0xbdf2, 0x9ba8, 0xe4a2,
+ /* a8 */ 0x9ba9, 0x9baa, 0xbae9, 0xe4aa, 0x9bab, 0x9bac, 0xe4ac, 0x9bad,
+ /* b0 */ 0x9bae, 0xb6fd, 0xd6de, 0xe4b2, 0x9baf, 0xe4ad, 0x9bb0, 0x9bb1,
+ /* b8 */ 0x9bb2, 0xe4a1, 0x9bb3, 0xbbee, 0xcddd, 0xc7a2, 0xc5c9, 0x9bb4,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x02a03 ***/
+
+ /* 80 */ 0x9bb5, 0xc1f7, 0x9bb6, 0xe4a4, 0x9bb7, 0xc7b3, 0xbdac, 0xbdbd,
+ /* 88 */ 0xe4a5, 0x9bb8, 0xd7c7, 0xb2e2, 0x9bb9, 0xe4ab, 0xbcc3, 0xe4af,
+ /* 90 */ 0x9bba, 0xbbeb, 0xe4b0, 0xc5a8, 0xe4b1, 0x9bbb, 0x9bbc, 0x9bbd,
+ /* 98 */ 0x9bbe, 0xd5e3, 0xbfa3, 0x9bbf, 0xe4ba, 0x9bc0, 0xe4b7, 0x9bc1,
+ /* a0 */ 0xe4bb, 0x9bc2, 0x9bc3, 0xe4bd, 0x9bc4, 0x9bc5, 0xc6d6, 0x9bc6,
+ /* a8 */ 0x9bc7, 0xbac6, 0xc0cb, 0x9bc8, 0x9bc9, 0x9bca, 0xb8a1, 0xe4b4,
+ /* b0 */ 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0xd4a1, 0x9bcf, 0x9bd0, 0xbaa3,
+ /* b8 */ 0xbdfe, 0x9bd1, 0x9bd2, 0x9bd3, 0xe4bc, 0x9bd4, 0x9bd5, 0x9bd6,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02a43 ***/
+
+ /* 80 */ 0x9bd7, 0x9bd8, 0xcdbf, 0x9bd9, 0x9bda, 0xc4f9, 0x9bdb, 0x9bdc,
+ /* 88 */ 0xcffb, 0xc9e6, 0x9bdd, 0x9bde, 0xd3bf, 0x9bdf, 0xcfd1, 0x9be0,
+ /* 90 */ 0x9be1, 0xe4b3, 0x9be2, 0xe4b8, 0xe4b9, 0xcce9, 0x9be3, 0x9be4,
+ /* 98 */ 0x9be5, 0x9be6, 0x9be7, 0xccce, 0x9be8, 0xc0d4, 0xe4b5, 0xc1b0,
+ /* a0 */ 0xe4b6, 0xced0, 0x9be9, 0xbbc1, 0xb5d3, 0x9bea, 0xc8f3, 0xbda7,
+ /* a8 */ 0xd5c7, 0xc9ac, 0xb8a2, 0xe4ca, 0x9beb, 0x9bec, 0xe4cc, 0xd1c4,
+ /* b0 */ 0x9bed, 0x9bee, 0xd2ba, 0x9bef, 0x9bf0, 0xbaad, 0x9bf1, 0x9bf2,
+ /* b8 */ 0xbad4, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0xe4c3,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02a83 ***/
+
+ /* 80 */ 0xb5ed, 0x9bf9, 0x9bfa, 0x9bfb, 0xd7cd, 0xe4c0, 0xcffd, 0xe4bf,
+ /* 88 */ 0x9bfc, 0x9bfd, 0x9bfe, 0xc1dc, 0xccca, 0x9c40, 0x9c41, 0x9c42,
+ /* 90 */ 0x9c43, 0xcae7, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0xc4d7, 0x9c48,
+ /* 98 */ 0xccd4, 0xe4c8, 0x9c49, 0x9c4a, 0x9c4b, 0xe4c7, 0xe4c1, 0x9c4c,
+ /* a0 */ 0xe4c4, 0xb5ad, 0x9c4d, 0x9c4e, 0xd3d9, 0x9c4f, 0xe4c6, 0x9c50,
+ /* a8 */ 0x9c51, 0x9c52, 0x9c53, 0xd2f9, 0xb4e3, 0x9c54, 0xbbb4, 0x9c55,
+ /* b0 */ 0x9c56, 0xc9ee, 0x9c57, 0xb4be, 0x9c58, 0x9c59, 0x9c5a, 0xbbec,
+ /* b8 */ 0x9c5b, 0xd1cd, 0x9c5c, 0xcced, 0xedb5, 0x9c5d, 0x9c5e, 0x9c5f,
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02ac3 ***/
+
+ /* 80 */ 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0xc7e5, 0x9c65, 0x9c66,
+ /* 88 */ 0x9c67, 0x9c68, 0xd4a8, 0x9c69, 0xe4cb, 0xd7d5, 0xe4c2, 0x9c6a,
+ /* 90 */ 0xbda5, 0xe4c5, 0x9c6b, 0x9c6c, 0xd3e6, 0x9c6d, 0xe4c9, 0xc9f8,
+ /* 98 */ 0x9c6e, 0x9c6f, 0xe4be, 0x9c70, 0x9c71, 0xd3e5, 0x9c72, 0x9c73,
+ /* a0 */ 0xc7fe, 0xb6c9, 0x9c74, 0xd4fc, 0xb2b3, 0xe4d7, 0x9c75, 0x9c76,
+ /* a8 */ 0x9c77, 0xcec2, 0x9c78, 0xe4cd, 0x9c79, 0xcebc, 0x9c7a, 0xb8db,
+ /* b0 */ 0x9c7b, 0x9c7c, 0xe4d6, 0x9c7d, 0xbfca, 0x9c7e, 0x9c80, 0x9c81,
+ /* b8 */ 0xd3ce, 0x9c82, 0xc3ec, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87,
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02b03 ***/
+
+ /* 80 */ 0x9c88, 0x9c89, 0x9c8a, 0xc5c8, 0xe4d8, 0x9c8b, 0x9c8c, 0x9c8d,
+ /* 88 */ 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0xcdc4, 0xe4cf, 0x9c93,
+ /* 90 */ 0x9c94, 0x9c95, 0x9c96, 0xe4d4, 0xe4d5, 0x9c97, 0xbafe, 0x9c98,
+ /* 98 */ 0xcfe6, 0x9c99, 0x9c9a, 0xd5bf, 0x9c9b, 0x9c9c, 0x9c9d, 0xe4d2,
+ /* a0 */ 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5,
+ /* a8 */ 0x9ca6, 0x9ca7, 0x9ca8, 0xe4d0, 0x9ca9, 0x9caa, 0xe4ce, 0x9cab,
+ /* b0 */ 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3,
+ /* b8 */ 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0xcde5, 0xcaaa,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02b43 ***/
+
+ /* 80 */ 0x9cba, 0x9cbb, 0x9cbc, 0xc0a3, 0x9cbd, 0xbda6, 0xe4d3, 0x9cbe,
+ /* 88 */ 0x9cbf, 0xb8c8, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0xe4e7,
+ /* 90 */ 0xd4b4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb,
+ /* 98 */ 0xe4db, 0x9ccc, 0x9ccd, 0x9cce, 0xc1ef, 0x9ccf, 0x9cd0, 0xe4e9,
+ /* a0 */ 0x9cd1, 0x9cd2, 0xd2e7, 0x9cd3, 0x9cd4, 0xe4df, 0x9cd5, 0xe4e0,
+ /* a8 */ 0x9cd6, 0x9cd7, 0xcfaa, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0xcbdd,
+ /* b0 */ 0x9cdc, 0xe4da, 0xe4d1, 0x9cdd, 0xe4e5, 0x9cde, 0xc8dc, 0xe4e3,
+ /* b8 */ 0x9cdf, 0x9ce0, 0xc4e7, 0xe4e2, 0x9ce1, 0xe4e1, 0x9ce2, 0x9ce3,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02b83 ***/
+
+ /* 80 */ 0x9ce4, 0xb3fc, 0xe4e8, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0xb5e1,
+ /* 88 */ 0x9ce9, 0x9cea, 0x9ceb, 0xd7cc, 0x9cec, 0x9ced, 0x9cee, 0xe4e6,
+ /* 90 */ 0x9cef, 0xbbac, 0x9cf0, 0xd7d2, 0xcccf, 0xebf8, 0x9cf1, 0xe4e4,
+ /* 98 */ 0x9cf2, 0x9cf3, 0xb9f6, 0x9cf4, 0x9cf5, 0x9cf6, 0xd6cd, 0xe4d9,
+ /* a0 */ 0xe4dc, 0xc2fa, 0xe4de, 0x9cf7, 0xc2cb, 0xc0c4, 0xc2d0, 0x9cf8,
+ /* a8 */ 0xb1f5, 0xccb2, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe,
+ /* b0 */ 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0xb5ce, 0x9d44, 0x9d45, 0x9d46,
+ /* b8 */ 0x9d47, 0xe4ef, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02bc3 ***/
+
+ /* 80 */ 0x9d4e, 0x9d4f, 0xc6af, 0x9d50, 0x9d51, 0x9d52, 0xc6e1, 0x9d53,
+ /* 88 */ 0x9d54, 0xe4f5, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0xc2a9,
+ /* 90 */ 0x9d5a, 0x9d5b, 0x9d5c, 0xc0ec, 0xd1dd, 0xe4ee, 0x9d5d, 0x9d5e,
+ /* 98 */ 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66,
+ /* a0 */ 0xc4ae, 0x9d67, 0x9d68, 0x9d69, 0xe4ed, 0x9d6a, 0x9d6b, 0x9d6c,
+ /* a8 */ 0x9d6d, 0xe4f6, 0xe4f4, 0xc2fe, 0x9d6e, 0xe4dd, 0x9d6f, 0xe4f0,
+ /* b0 */ 0x9d70, 0xcafe, 0x9d71, 0xd5c4, 0x9d72, 0x9d73, 0xe4f1, 0x9d74,
+ /* b8 */ 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0xd1fa, 0x9d7b,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02c03 ***/
+
+ /* 80 */ 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, 0xe4eb, 0xe4ec,
+ /* 88 */ 0x9d83, 0x9d84, 0x9d85, 0xe4f2, 0x9d86, 0xceab, 0x9d87, 0x9d88,
+ /* 90 */ 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90,
+ /* 98 */ 0xc5cb, 0x9d91, 0x9d92, 0x9d93, 0xc7b1, 0x9d94, 0xc2ba, 0x9d95,
+ /* a0 */ 0x9d96, 0x9d97, 0xe4ea, 0x9d98, 0x9d99, 0x9d9a, 0xc1ca, 0x9d9b,
+ /* a8 */ 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0xccb6, 0xb3b1, 0x9da1,
+ /* b0 */ 0x9da2, 0x9da3, 0xe4fb, 0x9da4, 0xe4f3, 0x9da5, 0x9da6, 0x9da7,
+ /* b8 */ 0xe4fa, 0x9da8, 0xe4fd, 0x9da9, 0xe4fc, 0x9daa, 0x9dab, 0x9dac,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02c43 ***/
+
+ /* 80 */ 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0xb3ce, 0x9db1, 0x9db2, 0x9db3,
+ /* 88 */ 0xb3ba, 0xe4f7, 0x9db4, 0x9db5, 0xe4f9, 0xe4f8, 0xc5ec, 0x9db6,
+ /* 90 */ 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe,
+ /* 98 */ 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0xc0bd, 0x9dc3, 0x9dc4, 0x9dc5,
+ /* a0 */ 0x9dc6, 0xd4e8, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0xe5a2,
+ /* a8 */ 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3,
+ /* b0 */ 0x9dd4, 0x9dd5, 0x9dd6, 0xb0c4, 0x9dd7, 0x9dd8, 0xe5a4, 0x9dd9,
+ /* b8 */ 0x9dda, 0xe5a3, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02c83 ***/
+
+ /* 80 */ 0xbca4, 0x9de1, 0xe5a5, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6,
+ /* 88 */ 0x9de7, 0xe5a1, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded,
+ /* 90 */ 0x9dee, 0xe4fe, 0xb1f4, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3,
+ /* 98 */ 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0xe5a8, 0x9dfa,
+ /* a0 */ 0xe5a9, 0xe5a6, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41,
+ /* a8 */ 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0xe5a7, 0xe5aa,
+ /* b0 */ 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f,
+ /* b8 */ 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57,
+
+ /*** Three byte table, leaf: e780xx - offset 0x02cc3 ***/
+
+ /* 80 */ 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f,
+ /* 88 */ 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67,
+ /* 90 */ 0x9e68, 0xc6d9, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e,
+ /* 98 */ 0x9e6f, 0x9e70, 0xe5ab, 0xe5ad, 0x9e71, 0x9e72, 0x9e73, 0x9e74,
+ /* a0 */ 0x9e75, 0x9e76, 0x9e77, 0xe5ac, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b,
+ /* a8 */ 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84,
+ /* b0 */ 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0xe5af, 0x9e8a, 0x9e8b,
+ /* b8 */ 0x9e8c, 0xe5ae, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92,
+
+ /*** Three byte table, leaf: e781xx - offset 0x02d03 ***/
+
+ /* 80 */ 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a,
+ /* 88 */ 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0xb9e0, 0x9e9f, 0x9ea0, 0xe5b0,
+ /* 90 */ 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8,
+ /* 98 */ 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0xe5b1, 0x9eaf,
+ /* a0 */ 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7,
+ /* a8 */ 0x9eb8, 0x9eb9, 0x9eba, 0xbbf0, 0xece1, 0xc3f0, 0x9ebb, 0xb5c6,
+ /* b0 */ 0xbbd2, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0xc1e9, 0xd4ee, 0x9ec0,
+ /* b8 */ 0xbec4, 0x9ec1, 0x9ec2, 0x9ec3, 0xd7c6, 0x9ec4, 0xd4d6, 0xb2d3,
+
+ /*** Three byte table, leaf: e782xx - offset 0x02d43 ***/
+
+ /* 80 */ 0xecbe, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0xeac1, 0x9ec9, 0x9eca,
+ /* 88 */ 0x9ecb, 0xc2af, 0xb4b6, 0x9ecc, 0x9ecd, 0x9ece, 0xd1d7, 0x9ecf,
+ /* 90 */ 0x9ed0, 0x9ed1, 0xb3b4, 0x9ed2, 0xc8b2, 0xbfbb, 0xecc0, 0x9ed3,
+ /* 98 */ 0x9ed4, 0xd6cb, 0x9ed5, 0x9ed6, 0xecbf, 0xecc1, 0x9ed7, 0x9ed8,
+ /* a0 */ 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0,
+ /* a8 */ 0x9ee1, 0x9ee2, 0x9ee3, 0xecc5, 0xbee6, 0xccbf, 0xc5da, 0xbebc,
+ /* b0 */ 0x9ee4, 0xecc6, 0x9ee5, 0xb1fe, 0x9ee6, 0x9ee7, 0x9ee8, 0xecc4,
+ /* b8 */ 0xd5a8, 0xb5e3, 0x9ee9, 0xecc2, 0xc1b6, 0xb3e3, 0x9eea, 0x9eeb,
+
+ /*** Three byte table, leaf: e783xx - offset 0x02d83 ***/
+
+ /* 80 */ 0xecc3, 0xcbb8, 0xc0c3, 0xccfe, 0x9eec, 0x9eed, 0x9eee, 0x9eef,
+ /* 88 */ 0xc1d2, 0x9ef0, 0xecc8, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5,
+ /* 90 */ 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd,
+ /* 98 */ 0xbae6, 0xc0d3, 0x9efe, 0xd6f2, 0x9f40, 0x9f41, 0x9f42, 0xd1cc,
+ /* a0 */ 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0xbfbe, 0x9f47, 0xb7b3, 0xc9d5,
+ /* a8 */ 0xecc7, 0xbbe2, 0x9f48, 0xcccc, 0xbdfd, 0xc8c8, 0x9f49, 0xcfa9,
+ /* b0 */ 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0xcde9,
+ /* b8 */ 0x9f51, 0xc5eb, 0x9f52, 0x9f53, 0x9f54, 0xb7e9, 0x9f55, 0x9f56,
+
+ /*** Three byte table, leaf: e784xx - offset 0x02dc3 ***/
+
+ /* 80 */ 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e,
+ /* 88 */ 0x9f5f, 0xd1c9, 0xbab8, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64,
+ /* 90 */ 0xecc9, 0x9f65, 0x9f66, 0xecca, 0x9f67, 0xbbc0, 0xeccb, 0x9f68,
+ /* 98 */ 0xece2, 0xb1ba, 0xb7d9, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d,
+ /* a0 */ 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0xbdb9, 0x9f74,
+ /* a8 */ 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0xeccc,
+ /* b0 */ 0xd1e6, 0xeccd, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0xc8bb, 0x9f81,
+ /* b8 */ 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89,
+
+ /*** Three byte table, leaf: e785xx - offset 0x02e03 ***/
+
+ /* 80 */ 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0xecd1, 0x9f8f, 0x9f90,
+ /* 88 */ 0x9f91, 0x9f92, 0xecd3, 0x9f93, 0xbbcd, 0x9f94, 0xbce5, 0x9f95,
+ /* 90 */ 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d,
+ /* 98 */ 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0xeccf, 0x9fa2, 0xc9b7, 0x9fa3,
+ /* a0 */ 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0xc3ba, 0x9fa8, 0xece3, 0xd5d5,
+ /* a8 */ 0xecd0, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0xd6f3, 0x9fae,
+ /* b0 */ 0x9faf, 0x9fb0, 0xecd2, 0xecce, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4,
+ /* b8 */ 0xecd4, 0x9fb5, 0xecd5, 0x9fb6, 0x9fb7, 0xc9bf, 0x9fb8, 0x9fb9,
+
+ /*** Three byte table, leaf: e786xx - offset 0x02e43 ***/
+
+ /* 80 */ 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0xcfa8, 0x9fbe, 0x9fbf, 0x9fc0,
+ /* 88 */ 0x9fc1, 0x9fc2, 0xd0dc, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0xd1ac,
+ /* 90 */ 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0xc8db, 0x9fcb, 0x9fcc, 0x9fcd,
+ /* 98 */ 0xecd6, 0xcef5, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0xcaec,
+ /* a0 */ 0xecda, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9,
+ /* a8 */ 0xecd9, 0x9fda, 0x9fdb, 0x9fdc, 0xb0be, 0x9fdd, 0x9fde, 0x9fdf,
+ /* b0 */ 0x9fe0, 0x9fe1, 0x9fe2, 0xecd7, 0x9fe3, 0xecd8, 0x9fe4, 0x9fe5,
+ /* b8 */ 0x9fe6, 0xece4, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec,
+
+ /*** Three byte table, leaf: e787xx - offset 0x02e83 ***/
+
+ /* 80 */ 0x9fed, 0x9fee, 0x9fef, 0xc8bc, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3,
+ /* 88 */ 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0xc1c7, 0x9ffa,
+ /* 90 */ 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xecdc, 0xd1e0, 0xa040, 0xa041,
+ /* 98 */ 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049,
+ /* a0 */ 0xecdb, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xd4ef, 0xa04e, 0xecdd,
+ /* a8 */ 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xdbc6, 0xa055,
+ /* b0 */ 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d,
+ /* b8 */ 0xa05e, 0xecde, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02ec3 ***/
+
+ /* 80 */ 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xb1ac, 0xa06b,
+ /* 88 */ 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073,
+ /* 90 */ 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b,
+ /* 98 */ 0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xecdf, 0xa082, 0xa083,
+ /* a0 */ 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b,
+ /* a8 */ 0xece0, 0xa08c, 0xd7a6, 0xa08d, 0xc5c0, 0xa08e, 0xa08f, 0xa090,
+ /* b0 */ 0xebbc, 0xb0ae, 0xa091, 0xa092, 0xa093, 0xbef4, 0xb8b8, 0xd2af,
+ /* b8 */ 0xb0d6, 0xb5f9, 0xa094, 0xd8b3, 0xa095, 0xcbac, 0xa096, 0xe3dd,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02f03 ***/
+
+ /* 80 */ 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xc6ac,
+ /* 88 */ 0xb0e6, 0xa09e, 0xa09f, 0xa0a0, 0xc5c6, 0xebb9, 0xa0a1, 0xa0a2,
+ /* 90 */ 0xa0a3, 0xa0a4, 0xebba, 0xa0a5, 0xa0a6, 0xa0a7, 0xebbb, 0xa0a8,
+ /* 98 */ 0xa0a9, 0xd1c0, 0xa0aa, 0xc5a3, 0xa0ab, 0xeaf2, 0xa0ac, 0xc4b2,
+ /* a0 */ 0xa0ad, 0xc4b5, 0xc0ce, 0xa0ae, 0xa0af, 0xa0b0, 0xeaf3, 0xc4c1,
+ /* a8 */ 0xa0b1, 0xceef, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xeaf0, 0xeaf4,
+ /* b0 */ 0xa0b6, 0xa0b7, 0xc9fc, 0xa0b8, 0xa0b9, 0xc7a3, 0xa0ba, 0xa0bb,
+ /* b8 */ 0xa0bc, 0xccd8, 0xcefe, 0xa0bd, 0xa0be, 0xa0bf, 0xeaf5, 0xeaf6,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02f43 ***/
+
+ /* 80 */ 0xcfac, 0xc0e7, 0xa0c0, 0xa0c1, 0xeaf7, 0xa0c2, 0xa0c3, 0xa0c4,
+ /* 88 */ 0xa0c5, 0xa0c6, 0xb6bf, 0xeaf8, 0xa0c7, 0xeaf9, 0xa0c8, 0xeafa,
+ /* 90 */ 0xa0c9, 0xa0ca, 0xeafb, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf,
+ /* 98 */ 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xeaf1,
+ /* a0 */ 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de,
+ /* a8 */ 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xc8ae, 0xe1eb, 0xa0e3, 0xb7b8,
+ /* b0 */ 0xe1ec, 0xa0e4, 0xa0e5, 0xa0e6, 0xe1ed, 0xa0e7, 0xd7b4, 0xe1ee,
+ /* b8 */ 0xe1ef, 0xd3cc, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02f83 ***/
+
+ /* 80 */ 0xa0ee, 0xe1f1, 0xbff1, 0xe1f0, 0xb5d2, 0xa0ef, 0xa0f0, 0xa0f1,
+ /* 88 */ 0xb1b7, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xe1f3, 0xe1f2, 0xa0f6,
+ /* 90 */ 0xbafc, 0xa0f7, 0xe1f4, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xb9b7,
+ /* 98 */ 0xa0fc, 0xbed1, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xc4fc, 0xaa42,
+ /* a0 */ 0xbadd, 0xbdc6, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48,
+ /* a8 */ 0xe1f5, 0xe1f7, 0xaa49, 0xaa4a, 0xb6c0, 0xcfc1, 0xcaa8, 0xe1f6,
+ /* b0 */ 0xd5f8, 0xd3fc, 0xe1f8, 0xe1fc, 0xe1f9, 0xaa4b, 0xaa4c, 0xe1fa,
+ /* b8 */ 0xc0ea, 0xaa4d, 0xe1fe, 0xe2a1, 0xc0c7, 0xaa4e, 0xaa4f, 0xaa50,
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02fc3 ***/
+
+ /* 80 */ 0xaa51, 0xe1fb, 0xaa52, 0xe1fd, 0xaa53, 0xaa54, 0xaa55, 0xaa56,
+ /* 88 */ 0xaa57, 0xaa58, 0xe2a5, 0xaa59, 0xaa5a, 0xaa5b, 0xc1d4, 0xaa5c,
+ /* 90 */ 0xaa5d, 0xaa5e, 0xaa5f, 0xe2a3, 0xaa60, 0xe2a8, 0xb2fe, 0xe2a2,
+ /* 98 */ 0xaa61, 0xaa62, 0xaa63, 0xc3cd, 0xb2c2, 0xe2a7, 0xe2a6, 0xaa64,
+ /* a0 */ 0xaa65, 0xe2a4, 0xe2a9, 0xaa66, 0xaa67, 0xe2ab, 0xaa68, 0xaa69,
+ /* a8 */ 0xaa6a, 0xd0c9, 0xd6ed, 0xc3a8, 0xe2ac, 0xaa6b, 0xcfd7, 0xaa6c,
+ /* b0 */ 0xaa6d, 0xe2ae, 0xaa6e, 0xaa6f, 0xbaef, 0xaa70, 0xaa71, 0xe9e0,
+ /* b8 */ 0xe2ad, 0xe2aa, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xbbab, 0xd4b3,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x03003 ***/
+
+ /* 80 */ 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d,
+ /* 88 */ 0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xe2b0, 0xaa84, 0xaa85,
+ /* 90 */ 0xe2af, 0xaa86, 0xe9e1, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xe2b1,
+ /* 98 */ 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92,
+ /* a0 */ 0xe2b2, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99,
+ /* a8 */ 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xe2b3, 0xcca1, 0xaa9e, 0xe2b4,
+ /* b0 */ 0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45,
+ /* b8 */ 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xe2b5, 0xab4c,
+
+ /*** Three byte table, leaf: e78exx - offset 0x03043 ***/
+
+ /* 80 */ 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xd0fe, 0xab51, 0xab52, 0xc2ca,
+ /* 88 */ 0xab53, 0xd3f1, 0xab54, 0xcdf5, 0xab55, 0xab56, 0xe7e0, 0xab57,
+ /* 90 */ 0xab58, 0xe7e1, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xbec1, 0xab5d,
+ /* 98 */ 0xab5e, 0xab5f, 0xab60, 0xc2ea, 0xab61, 0xab62, 0xab63, 0xe7e4,
+ /* a0 */ 0xab64, 0xab65, 0xe7e3, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a,
+ /* a8 */ 0xab6b, 0xcde6, 0xab6c, 0xc3b5, 0xab6d, 0xab6e, 0xe7e2, 0xbbb7,
+ /* b0 */ 0xcfd6, 0xab6f, 0xc1e1, 0xe7e9, 0xab70, 0xab71, 0xab72, 0xe7e8,
+ /* b8 */ 0xab73, 0xab74, 0xe7f4, 0xb2a3, 0xab75, 0xab76, 0xab77, 0xab78,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x03083 ***/
+
+ /* 80 */ 0xe7ea, 0xab79, 0xe7e6, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e,
+ /* 88 */ 0xe7ec, 0xe7eb, 0xc9ba, 0xab80, 0xab81, 0xd5e4, 0xab82, 0xe7e5,
+ /* 90 */ 0xb7a9, 0xe7e7, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88,
+ /* 98 */ 0xab89, 0xe7ee, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xe7f3, 0xab8e,
+ /* a0 */ 0xd6e9, 0xab8f, 0xab90, 0xab91, 0xab92, 0xe7ed, 0xab93, 0xe7f2,
+ /* a8 */ 0xab94, 0xe7f1, 0xab95, 0xab96, 0xab97, 0xb0e0, 0xab98, 0xab99,
+ /* b0 */ 0xab9a, 0xab9b, 0xe7f5, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0,
+ /* b8 */ 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47,
+
+ /*** Three byte table, leaf: e790xx - offset 0x030c3 ***/
+
+ /* 80 */ 0xac48, 0xac49, 0xac4a, 0xc7f2, 0xac4b, 0xc0c5, 0xc0ed, 0xac4c,
+ /* 88 */ 0xac4d, 0xc1f0, 0xe7f0, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xe7f6,
+ /* 90 */ 0xcbf6, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58,
+ /* 98 */ 0xac59, 0xac5a, 0xe8a2, 0xe8a1, 0xac5b, 0xac5c, 0xac5d, 0xac5e,
+ /* a0 */ 0xac5f, 0xac60, 0xd7c1, 0xac61, 0xac62, 0xe7fa, 0xe7f9, 0xac63,
+ /* a8 */ 0xe7fb, 0xac64, 0xe7f7, 0xac65, 0xe7fe, 0xac66, 0xe7fd, 0xac67,
+ /* b0 */ 0xe7fc, 0xac68, 0xac69, 0xc1d5, 0xc7d9, 0xc5fd, 0xc5c3, 0xac6a,
+ /* b8 */ 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xc7ed, 0xac6f, 0xac70, 0xac71,
+
+ /*** Three byte table, leaf: e791xx - offset 0x03103 ***/
+
+ /* 80 */ 0xac72, 0xe8a3, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78,
+ /* 88 */ 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81,
+ /* 90 */ 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xe8a6, 0xac87, 0xe8a5,
+ /* 98 */ 0xac88, 0xe8a7, 0xbaf7, 0xe7f8, 0xe8a4, 0xac89, 0xc8f0, 0xc9aa,
+ /* a0 */ 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91,
+ /* a8 */ 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xe8a9, 0xac97, 0xac98,
+ /* b0 */ 0xb9e5, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xd1fe, 0xe8a8,
+ /* b8 */ 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xe8aa, 0xad43,
+
+ /*** Three byte table, leaf: e792xx - offset 0x03143 ***/
+
+ /* 80 */ 0xe8ad, 0xe8ae, 0xad44, 0xc1a7, 0xad45, 0xad46, 0xad47, 0xe8af,
+ /* 88 */ 0xad48, 0xad49, 0xad4a, 0xe8b0, 0xad4b, 0xad4c, 0xe8ac, 0xad4d,
+ /* 90 */ 0xe8b4, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54,
+ /* 98 */ 0xad55, 0xad56, 0xad57, 0xad58, 0xe8ab, 0xad59, 0xe8b1, 0xad5a,
+ /* a0 */ 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xe8b5,
+ /* a8 */ 0xe8b2, 0xe8b3, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67,
+ /* b0 */ 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f,
+ /* b8 */ 0xad70, 0xad71, 0xe8b7, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76,
+
+ /*** Three byte table, leaf: e793xx - offset 0x03183 ***/
+
+ /* 80 */ 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e,
+ /* 88 */ 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87,
+ /* 90 */ 0xad88, 0xad89, 0xe8b6, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e,
+ /* 98 */ 0xad8f, 0xad90, 0xad91, 0xad92, 0xb9cf, 0xad93, 0xf0ac, 0xad94,
+ /* a0 */ 0xf0ad, 0xad95, 0xc6b0, 0xb0ea, 0xc8bf, 0xad96, 0xcddf, 0xad97,
+ /* a8 */ 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xcecd, 0xeab1,
+ /* b0 */ 0xad9e, 0xad9f, 0xada0, 0xae40, 0xeab2, 0xae41, 0xc6bf, 0xb4c9,
+ /* b8 */ 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xeab3,
+
+ /*** Three byte table, leaf: e794xx - offset 0x031c3 ***/
+
+ /* 80 */ 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xd5e7, 0xae4d, 0xae4e, 0xae4f,
+ /* 88 */ 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xddf9, 0xae55, 0xeab4,
+ /* 90 */ 0xae56, 0xeab5, 0xae57, 0xeab6, 0xae58, 0xae59, 0xae5a, 0xae5b,
+ /* 98 */ 0xb8ca, 0xdfb0, 0xc9f5, 0xae5c, 0xccf0, 0xae5d, 0xae5e, 0xc9fa,
+ /* a0 */ 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xc9fb, 0xae64, 0xae65,
+ /* a8 */ 0xd3c3, 0xcba6, 0xae66, 0xb8a6, 0xf0ae, 0xb1c2, 0xae67, 0xe5b8,
+ /* b0 */ 0xccef, 0xd3c9, 0xbcd7, 0xc9ea, 0xae68, 0xb5e7, 0xae69, 0xc4d0,
+ /* b8 */ 0xb5e9, 0xae6a, 0xeeae, 0xbbad, 0xae6b, 0xae6c, 0xe7de, 0xae6d,
+
+ /*** Three byte table, leaf: e795xx - offset 0x03203 ***/
+
+ /* 80 */ 0xeeaf, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xb3a9, 0xae72, 0xae73,
+ /* 88 */ 0xeeb2, 0xae74, 0xae75, 0xeeb1, 0xbde7, 0xae76, 0xeeb0, 0xceb7,
+ /* 90 */ 0xae77, 0xae78, 0xae79, 0xae7a, 0xc5cf, 0xae7b, 0xae7c, 0xae7d,
+ /* 98 */ 0xae7e, 0xc1f4, 0xdbce, 0xeeb3, 0xd0f3, 0xae80, 0xae81, 0xae82,
+ /* a0 */ 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xc2d4, 0xc6e8, 0xae88,
+ /* a8 */ 0xae89, 0xae8a, 0xb7ac, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f,
+ /* b0 */ 0xae90, 0xae91, 0xeeb4, 0xae92, 0xb3eb, 0xae93, 0xae94, 0xae95,
+ /* b8 */ 0xbbfb, 0xeeb5, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xe7dc,
+
+ /*** Three byte table, leaf: e796xx - offset 0x03243 ***/
+
+ /* 80 */ 0xae9b, 0xae9c, 0xae9d, 0xeeb6, 0xae9e, 0xae9f, 0xbdae, 0xaea0,
+ /* 88 */ 0xaf40, 0xaf41, 0xaf42, 0xf1e2, 0xaf43, 0xaf44, 0xaf45, 0xcae8,
+ /* 90 */ 0xaf46, 0xd2c9, 0xf0da, 0xaf47, 0xf0db, 0xaf48, 0xf0dc, 0xc1c6,
+ /* 98 */ 0xaf49, 0xb8ed, 0xbece, 0xaf4a, 0xaf4b, 0xf0de, 0xaf4c, 0xc5b1,
+ /* a0 */ 0xf0dd, 0xd1f1, 0xaf4d, 0xf0e0, 0xb0cc, 0xbdea, 0xaf4e, 0xaf4f,
+ /* a8 */ 0xaf50, 0xaf51, 0xaf52, 0xd2df, 0xf0df, 0xaf53, 0xb4af, 0xb7e8,
+ /* b0 */ 0xf0e6, 0xf0e5, 0xc6a3, 0xf0e1, 0xf0e2, 0xb4c3, 0xaf54, 0xaf55,
+ /* b8 */ 0xf0e3, 0xd5ee, 0xaf56, 0xaf57, 0xccdb, 0xbed2, 0xbcb2, 0xaf58,
+
+ /*** Three byte table, leaf: e797xx - offset 0x03283 ***/
+
+ /* 80 */ 0xaf59, 0xaf5a, 0xf0e8, 0xf0e7, 0xf0e4, 0xb2a1, 0xaf5b, 0xd6a2,
+ /* 88 */ 0xd3b8, 0xbeb7, 0xc8ac, 0xaf5c, 0xaf5d, 0xf0ea, 0xaf5e, 0xaf5f,
+ /* 90 */ 0xaf60, 0xaf61, 0xd1f7, 0xaf62, 0xd6cc, 0xbadb, 0xf0e9, 0xaf63,
+ /* 98 */ 0xb6bb, 0xaf64, 0xaf65, 0xcdb4, 0xaf66, 0xaf67, 0xc6a6, 0xaf68,
+ /* a0 */ 0xaf69, 0xaf6a, 0xc1a1, 0xf0eb, 0xf0ee, 0xaf6b, 0xf0ed, 0xf0f0,
+ /* a8 */ 0xf0ec, 0xaf6c, 0xbbbe, 0xf0ef, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70,
+ /* b0 */ 0xccb5, 0xf0f2, 0xaf71, 0xaf72, 0xb3d5, 0xaf73, 0xaf74, 0xaf75,
+ /* b8 */ 0xaf76, 0xb1d4, 0xaf77, 0xaf78, 0xf0f3, 0xaf79, 0xaf7a, 0xf0f4,
+
+ /*** Three byte table, leaf: e798xx - offset 0x032c3 ***/
+
+ /* 80 */ 0xf0f6, 0xb4e1, 0xaf7b, 0xf0f1, 0xaf7c, 0xf0f7, 0xaf7d, 0xaf7e,
+ /* 88 */ 0xaf80, 0xaf81, 0xf0fa, 0xaf82, 0xf0f8, 0xaf83, 0xaf84, 0xaf85,
+ /* 90 */ 0xf0f5, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xf0fd, 0xaf8a, 0xf0f9,
+ /* 98 */ 0xf0fc, 0xf0fe, 0xaf8b, 0xf1a1, 0xaf8c, 0xaf8d, 0xaf8e, 0xcec1,
+ /* a0 */ 0xf1a4, 0xaf8f, 0xf1a3, 0xaf90, 0xc1f6, 0xf0fb, 0xcadd, 0xaf91,
+ /* a8 */ 0xaf92, 0xb4f1, 0xb1f1, 0xccb1, 0xaf93, 0xf1a6, 0xaf94, 0xaf95,
+ /* b0 */ 0xf1a7, 0xaf96, 0xaf97, 0xf1ac, 0xd5ce, 0xf1a9, 0xaf98, 0xaf99,
+ /* b8 */ 0xc8b3, 0xaf9a, 0xaf9b, 0xaf9c, 0xf1a2, 0xaf9d, 0xf1ab, 0xf1a8,
+
+ /*** Three byte table, leaf: e799xx - offset 0x03303 ***/
+
+ /* 80 */ 0xf1a5, 0xaf9e, 0xaf9f, 0xf1aa, 0xafa0, 0xb040, 0xb041, 0xb042,
+ /* 88 */ 0xb043, 0xb044, 0xb045, 0xb046, 0xb0a9, 0xf1ad, 0xb047, 0xb048,
+ /* 90 */ 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xf1af, 0xb04d, 0xf1b1, 0xb04e,
+ /* 98 */ 0xb04f, 0xb050, 0xb051, 0xb052, 0xf1b0, 0xb053, 0xf1ae, 0xb054,
+ /* a0 */ 0xb055, 0xb056, 0xb057, 0xd1a2, 0xb058, 0xb059, 0xb05a, 0xb05b,
+ /* a8 */ 0xb05c, 0xb05d, 0xb05e, 0xf1b2, 0xb05f, 0xb060, 0xb061, 0xf1b3,
+ /* b0 */ 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069,
+ /* b8 */ 0xb9ef, 0xb06a, 0xb06b, 0xb5c7, 0xb06c, 0xb0d7, 0xb0d9, 0xb06d,
+
+ /*** Three byte table, leaf: e79axx - offset 0x03343 ***/
+
+ /* 80 */ 0xb06e, 0xb06f, 0xd4ed, 0xb070, 0xb5c4, 0xb071, 0xbdd4, 0xbbca,
+ /* 88 */ 0xf0a7, 0xb072, 0xb073, 0xb8de, 0xb074, 0xb075, 0xf0a8, 0xb076,
+ /* 90 */ 0xb077, 0xb0a8, 0xb078, 0xf0a9, 0xb079, 0xb07a, 0xcdee, 0xb07b,
+ /* 98 */ 0xb07c, 0xf0aa, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083,
+ /* a0 */ 0xb084, 0xb085, 0xb086, 0xb087, 0xf0ab, 0xb088, 0xb089, 0xb08a,
+ /* a8 */ 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xc6a4, 0xb091,
+ /* b0 */ 0xb092, 0xd6e5, 0xf1e4, 0xb093, 0xf1e5, 0xb094, 0xb095, 0xb096,
+ /* b8 */ 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xc3f3,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03383 ***/
+
+ /* 80 */ 0xb09e, 0xb09f, 0xd3db, 0xb0a0, 0xb140, 0xd6d1, 0xc5e8, 0xb141,
+ /* 88 */ 0xd3af, 0xb142, 0xd2e6, 0xb143, 0xb144, 0xeec1, 0xb0bb, 0xd5b5,
+ /* 90 */ 0xd1ce, 0xbce0, 0xbad0, 0xb145, 0xbff8, 0xb146, 0xb8c7, 0xb5c1,
+ /* 98 */ 0xc5cc, 0xb147, 0xb148, 0xcaa2, 0xb149, 0xb14a, 0xb14b, 0xc3cb,
+ /* a0 */ 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xeec2, 0xb151, 0xb152,
+ /* a8 */ 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xc4bf, 0xb6a2,
+ /* b0 */ 0xb159, 0xedec, 0xc3a4, 0xb15a, 0xd6b1, 0xb15b, 0xb15c, 0xb15d,
+ /* b8 */ 0xcfe0, 0xedef, 0xb15e, 0xb15f, 0xc5ce, 0xb160, 0xb6dc, 0xb161,
+
+ /*** Three byte table, leaf: e79cxx - offset 0x033c3 ***/
+
+ /* 80 */ 0xb162, 0xcaa1, 0xb163, 0xb164, 0xeded, 0xb165, 0xb166, 0xedf0,
+ /* 88 */ 0xedf1, 0xc3bc, 0xb167, 0xbfb4, 0xb168, 0xedee, 0xb169, 0xb16a,
+ /* 90 */ 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172,
+ /* 98 */ 0xb173, 0xedf4, 0xedf2, 0xb174, 0xb175, 0xb176, 0xb177, 0xd5e6,
+ /* a0 */ 0xc3df, 0xb178, 0xedf3, 0xb179, 0xb17a, 0xb17b, 0xedf6, 0xb17c,
+ /* a8 */ 0xd5a3, 0xd1a3, 0xb17d, 0xb17e, 0xb180, 0xedf5, 0xb181, 0xc3d0,
+ /* b0 */ 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xedf7, 0xbff4, 0xbeec,
+ /* b8 */ 0xedf8, 0xb187, 0xccf7, 0xb188, 0xd1db, 0xb189, 0xb18a, 0xb18b,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x03403 ***/
+
+ /* 80 */ 0xd7c5, 0xd5f6, 0xb18c, 0xedfc, 0xb18d, 0xb18e, 0xb18f, 0xedfb,
+ /* 88 */ 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197,
+ /* 90 */ 0xedf9, 0xedfa, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d,
+ /* 98 */ 0xb19e, 0xb19f, 0xedfd, 0xbea6, 0xb1a0, 0xb240, 0xb241, 0xb242,
+ /* a0 */ 0xb243, 0xcbaf, 0xeea1, 0xb6bd, 0xb244, 0xeea2, 0xc4c0, 0xb245,
+ /* a8 */ 0xedfe, 0xb246, 0xb247, 0xbdde, 0xb2c7, 0xb248, 0xb249, 0xb24a,
+ /* b0 */ 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252,
+ /* b8 */ 0xb253, 0xb6c3, 0xb254, 0xb255, 0xb256, 0xeea5, 0xd8ba, 0xeea3,
+
+ /*** Three byte table, leaf: e79exx - offset 0x03443 ***/
+
+ /* 80 */ 0xeea6, 0xb257, 0xb258, 0xb259, 0xc3e9, 0xb3f2, 0xb25a, 0xb25b,
+ /* 88 */ 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xeea7, 0xeea4, 0xcfb9, 0xb260,
+ /* 90 */ 0xb261, 0xeea8, 0xc2f7, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266,
+ /* 98 */ 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xeea9,
+ /* a0 */ 0xeeaa, 0xb26e, 0xdeab, 0xb26f, 0xb270, 0xc6b3, 0xb271, 0xc7c6,
+ /* a8 */ 0xb272, 0xd6f5, 0xb5c9, 0xb273, 0xcbb2, 0xb274, 0xb275, 0xb276,
+ /* b0 */ 0xeeab, 0xb277, 0xb278, 0xcdab, 0xb279, 0xeeac, 0xb27a, 0xb27b,
+ /* b8 */ 0xb27c, 0xb27d, 0xb27e, 0xd5b0, 0xb280, 0xeead, 0xb281, 0xf6c4,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03483 ***/
+
+ /* 80 */ 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289,
+ /* 88 */ 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xdbc7, 0xb28f, 0xb290,
+ /* 90 */ 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb4a3,
+ /* 98 */ 0xb298, 0xb299, 0xb29a, 0xc3ac, 0xf1e6, 0xb29b, 0xb29c, 0xb29d,
+ /* a0 */ 0xb29e, 0xb29f, 0xcab8, 0xd2d3, 0xb2a0, 0xd6aa, 0xb340, 0xeff2,
+ /* a8 */ 0xb341, 0xbed8, 0xb342, 0xbdc3, 0xeff3, 0xb6cc, 0xb0ab, 0xb343,
+ /* b0 */ 0xb344, 0xb345, 0xb346, 0xcaaf, 0xb347, 0xb348, 0xedb6, 0xb349,
+ /* b8 */ 0xedb7, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xcef9, 0xb7af, 0xbff3,
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x034c3 ***/
+
+ /* 80 */ 0xedb8, 0xc2eb, 0xc9b0, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352,
+ /* 88 */ 0xb353, 0xedb9, 0xb354, 0xb355, 0xc6f6, 0xbfb3, 0xb356, 0xb357,
+ /* 90 */ 0xb358, 0xedbc, 0xc5f8, 0xb359, 0xd1d0, 0xb35a, 0xd7a9, 0xedba,
+ /* 98 */ 0xedbb, 0xb35b, 0xd1e2, 0xb35c, 0xedbf, 0xedc0, 0xb35d, 0xedc4,
+ /* a0 */ 0xb35e, 0xb35f, 0xb360, 0xedc8, 0xb361, 0xedc6, 0xedce, 0xd5e8,
+ /* a8 */ 0xb362, 0xedc9, 0xb363, 0xb364, 0xedc7, 0xedbe, 0xb365, 0xb366,
+ /* b0 */ 0xc5e9, 0xb367, 0xb368, 0xb369, 0xc6c6, 0xb36a, 0xb36b, 0xc9e9,
+ /* b8 */ 0xd4d2, 0xedc1, 0xedc2, 0xedc3, 0xedc5, 0xb36c, 0xc0f9, 0xb36d,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x03503 ***/
+
+ /* 80 */ 0xb4a1, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb9e8, 0xb372, 0xedd0,
+ /* 88 */ 0xb373, 0xb374, 0xb375, 0xb376, 0xedd1, 0xb377, 0xedca, 0xb378,
+ /* 90 */ 0xedcf, 0xb379, 0xcef8, 0xb37a, 0xb37b, 0xcbb6, 0xedcc, 0xedcd,
+ /* 98 */ 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xcff5, 0xb382, 0xb383,
+ /* a0 */ 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b,
+ /* a8 */ 0xb38c, 0xb38d, 0xedd2, 0xc1f2, 0xd3b2, 0xedcb, 0xc8b7, 0xb38e,
+ /* b0 */ 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xbcef,
+ /* b8 */ 0xb396, 0xb397, 0xb398, 0xb399, 0xc5f0, 0xb39a, 0xb39b, 0xb39c,
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x03543 ***/
+
+ /* 80 */ 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xedd6,
+ /* 88 */ 0xb443, 0xb5ef, 0xb444, 0xb445, 0xc2b5, 0xb0ad, 0xcbe9, 0xb446,
+ /* 90 */ 0xb447, 0xb1ae, 0xb448, 0xedd4, 0xb449, 0xb44a, 0xb44b, 0xcdeb,
+ /* 98 */ 0xb5e2, 0xb44c, 0xedd5, 0xedd3, 0xedd7, 0xb44d, 0xb44e, 0xb5fa,
+ /* a0 */ 0xb44f, 0xedd8, 0xb450, 0xedd9, 0xb451, 0xeddc, 0xb452, 0xb1cc,
+ /* a8 */ 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a,
+ /* b0 */ 0xc5f6, 0xbcee, 0xedda, 0xccbc, 0xb2ea, 0xb45b, 0xb45c, 0xb45d,
+ /* b8 */ 0xb45e, 0xeddb, 0xb45f, 0xb460, 0xb461, 0xb462, 0xc4eb, 0xb463,
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x03583 ***/
+
+ /* 80 */ 0xb464, 0xb4c5, 0xb465, 0xb466, 0xb467, 0xb0f5, 0xb468, 0xb469,
+ /* 88 */ 0xb46a, 0xeddf, 0xc0da, 0xb4e8, 0xb46b, 0xb46c, 0xb46d, 0xb46e,
+ /* 90 */ 0xc5cd, 0xb46f, 0xb470, 0xb471, 0xeddd, 0xbfc4, 0xb472, 0xb473,
+ /* 98 */ 0xb474, 0xedde, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a,
+ /* a0 */ 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483,
+ /* a8 */ 0xc4a5, 0xb484, 0xb485, 0xb486, 0xede0, 0xb487, 0xb488, 0xb489,
+ /* b0 */ 0xb48a, 0xb48b, 0xede1, 0xb48c, 0xede3, 0xb48d, 0xb48e, 0xc1d7,
+ /* b8 */ 0xb48f, 0xb490, 0xbbc7, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x035c3 ***/
+
+ /* 80 */ 0xb496, 0xbdb8, 0xb497, 0xb498, 0xb499, 0xede2, 0xb49a, 0xb49b,
+ /* 88 */ 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542,
+ /* 90 */ 0xb543, 0xb544, 0xb545, 0xede4, 0xb546, 0xb547, 0xb548, 0xb549,
+ /* 98 */ 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xede6, 0xb550,
+ /* a0 */ 0xb551, 0xb552, 0xb553, 0xb554, 0xede5, 0xb555, 0xb556, 0xb557,
+ /* a8 */ 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f,
+ /* b0 */ 0xb560, 0xb561, 0xb562, 0xb563, 0xede7, 0xb564, 0xb565, 0xb566,
+ /* b8 */ 0xb567, 0xb568, 0xcabe, 0xecea, 0xc0f1, 0xb569, 0xc9e7, 0xb56a,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x03603 ***/
+
+ /* 80 */ 0xeceb, 0xc6ee, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xecec, 0xb56f,
+ /* 88 */ 0xc6ed, 0xeced, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575,
+ /* 90 */ 0xb576, 0xb577, 0xb578, 0xecf0, 0xb579, 0xb57a, 0xd7e6, 0xecf3,
+ /* 98 */ 0xb57b, 0xb57c, 0xecf1, 0xecee, 0xecef, 0xd7a3, 0xc9f1, 0xcbee,
+ /* a0 */ 0xecf4, 0xb57d, 0xecf2, 0xb57e, 0xb580, 0xcfe9, 0xb581, 0xecf6,
+ /* a8 */ 0xc6b1, 0xb582, 0xb583, 0xb584, 0xb585, 0xbcc0, 0xb586, 0xecf5,
+ /* b0 */ 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb5bb,
+ /* b8 */ 0xbbf6, 0xb58e, 0xecf7, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x03643 ***/
+
+ /* 80 */ 0xd9f7, 0xbdfb, 0xb594, 0xb595, 0xc2bb, 0xecf8, 0xb596, 0xb597,
+ /* 88 */ 0xb598, 0xb599, 0xecf9, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb8a3,
+ /* 90 */ 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644,
+ /* 98 */ 0xb645, 0xb646, 0xecfa, 0xb647, 0xb648, 0xb649, 0xb64a, 0xb64b,
+ /* a0 */ 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xecfb,
+ /* a8 */ 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a,
+ /* b0 */ 0xb65b, 0xb65c, 0xb65d, 0xecfc, 0xb65e, 0xb65f, 0xb660, 0xb661,
+ /* b8 */ 0xb662, 0xd3ed, 0xd8ae, 0xc0eb, 0xb663, 0xc7dd, 0xbacc, 0xb664,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x03683 ***/
+
+ /* 80 */ 0xd0e3, 0xcbbd, 0xb665, 0xcdba, 0xb666, 0xb667, 0xb8d1, 0xb668,
+ /* 88 */ 0xb669, 0xb1fc, 0xb66a, 0xc7ef, 0xb66b, 0xd6d6, 0xb66c, 0xb66d,
+ /* 90 */ 0xb66e, 0xbfc6, 0xc3eb, 0xb66f, 0xb670, 0xeff5, 0xb671, 0xb672,
+ /* 98 */ 0xc3d8, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xd7e2,
+ /* a0 */ 0xb679, 0xb67a, 0xb67b, 0xeff7, 0xb3d3, 0xb67c, 0xc7d8, 0xd1ed,
+ /* a8 */ 0xb67d, 0xd6c8, 0xb67e, 0xeff8, 0xb680, 0xeff6, 0xb681, 0xbbfd,
+ /* b0 */ 0xb3c6, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688,
+ /* b8 */ 0xbdd5, 0xb689, 0xb68a, 0xd2c6, 0xb68b, 0xbbe0, 0xb68c, 0xb68d,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x036c3 ***/
+
+ /* 80 */ 0xcfa1, 0xb68e, 0xeffc, 0xeffb, 0xb68f, 0xb690, 0xeff9, 0xb691,
+ /* 88 */ 0xb692, 0xb693, 0xb694, 0xb3cc, 0xb695, 0xc9d4, 0xcbb0, 0xb696,
+ /* 90 */ 0xb697, 0xb698, 0xb699, 0xb69a, 0xeffe, 0xb69b, 0xb69c, 0xb0de,
+ /* 98 */ 0xb69d, 0xb69e, 0xd6c9, 0xb69f, 0xb6a0, 0xb740, 0xeffd, 0xb741,
+ /* a0 */ 0xb3ed, 0xb742, 0xb743, 0xf6d5, 0xb744, 0xb745, 0xb746, 0xb747,
+ /* a8 */ 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f,
+ /* b0 */ 0xb750, 0xb751, 0xb752, 0xcec8, 0xb753, 0xb754, 0xb755, 0xf0a2,
+ /* b8 */ 0xb756, 0xf0a1, 0xb757, 0xb5be, 0xbcda, 0xbbfc, 0xb758, 0xb8e5,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x03703 ***/
+
+ /* 80 */ 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xc4c2, 0xb75f,
+ /* 88 */ 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767,
+ /* 90 */ 0xb768, 0xf0a3, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xcbeb,
+ /* 98 */ 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775,
+ /* a0 */ 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d,
+ /* a8 */ 0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786,
+ /* b0 */ 0xf0a6, 0xb787, 0xb788, 0xb789, 0xd1a8, 0xb78a, 0xbebf, 0xc7ee,
+ /* b8 */ 0xf1b6, 0xf1b7, 0xbfd5, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb4a9,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x03743 ***/
+
+ /* 80 */ 0xf1b8, 0xcdbb, 0xb78f, 0xc7d4, 0xd5ad, 0xb790, 0xf1b9, 0xb791,
+ /* 88 */ 0xf1ba, 0xb792, 0xb793, 0xb794, 0xb795, 0xc7cf, 0xb796, 0xb797,
+ /* 90 */ 0xb798, 0xd2a4, 0xd6cf, 0xb799, 0xb79a, 0xf1bb, 0xbdd1, 0xb4b0,
+ /* 98 */ 0xbebd, 0xb79b, 0xb79c, 0xb79d, 0xb4dc, 0xced1, 0xb79e, 0xbfdf,
+ /* a0 */ 0xf1bd, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xbffa, 0xf1bc, 0xb842,
+ /* a8 */ 0xf1bf, 0xb843, 0xb844, 0xb845, 0xf1be, 0xf1c0, 0xb846, 0xb847,
+ /* b0 */ 0xb848, 0xb849, 0xb84a, 0xf1c1, 0xb84b, 0xb84c, 0xb84d, 0xb84e,
+ /* b8 */ 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xc1fe,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x03783 ***/
+
+ /* 80 */ 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d,
+ /* 88 */ 0xb85e, 0xb85f, 0xb860, 0xc1a2, 0xb861, 0xb862, 0xb863, 0xb864,
+ /* 90 */ 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xcafa, 0xb86b,
+ /* 98 */ 0xb86c, 0xd5be, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xbeba, 0xbeb9,
+ /* a0 */ 0xd5c2, 0xb871, 0xb872, 0xbfa2, 0xb873, 0xcdaf, 0xf1b5, 0xb874,
+ /* a8 */ 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xbddf, 0xb87a, 0xb6cb,
+ /* b0 */ 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883,
+ /* b8 */ 0xb884, 0xd6f1, 0xf3c3, 0xb885, 0xb886, 0xf3c4, 0xb887, 0xb8cd,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x037c3 ***/
+
+ /* 80 */ 0xb888, 0xb889, 0xb88a, 0xf3c6, 0xf3c7, 0xb88b, 0xb0ca, 0xb88c,
+ /* 88 */ 0xf3c5, 0xb88d, 0xf3c9, 0xcbf1, 0xb88e, 0xb88f, 0xb890, 0xf3cb,
+ /* 90 */ 0xb891, 0xd0a6, 0xb892, 0xb893, 0xb1ca, 0xf3c8, 0xb894, 0xb895,
+ /* 98 */ 0xb896, 0xf3cf, 0xb897, 0xb5d1, 0xb898, 0xb899, 0xf3d7, 0xb89a,
+ /* a0 */ 0xf3d2, 0xb89b, 0xb89c, 0xb89d, 0xf3d4, 0xf3d3, 0xb7fb, 0xb89e,
+ /* a8 */ 0xb1bf, 0xb89f, 0xf3ce, 0xf3ca, 0xb5da, 0xb8a0, 0xf3d0, 0xb940,
+ /* b0 */ 0xb941, 0xf3d1, 0xb942, 0xf3d5, 0xb943, 0xb944, 0xb945, 0xb946,
+ /* b8 */ 0xf3cd, 0xb947, 0xbce3, 0xb948, 0xc1fd, 0xb949, 0xf3d6, 0xb94a,
+
+ /*** Three byte table, leaf: e7adxx - offset 0x03803 ***/
+
+ /* 80 */ 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xf3da, 0xb950, 0xf3cc,
+ /* 88 */ 0xb951, 0xb5c8, 0xb952, 0xbdee, 0xf3dc, 0xb953, 0xb954, 0xb7a4,
+ /* 90 */ 0xbff0, 0xd6fe, 0xcdb2, 0xb955, 0xb4f0, 0xb956, 0xb2df, 0xb957,
+ /* 98 */ 0xf3d8, 0xb958, 0xf3d9, 0xc9b8, 0xb959, 0xf3dd, 0xb95a, 0xb95b,
+ /* a0 */ 0xf3de, 0xb95c, 0xf3e1, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961,
+ /* a8 */ 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xf3df, 0xb968,
+ /* b0 */ 0xb969, 0xf3e3, 0xf3e2, 0xb96a, 0xb96b, 0xf3db, 0xb96c, 0xbfea,
+ /* b8 */ 0xb96d, 0xb3ef, 0xb96e, 0xf3e0, 0xb96f, 0xb970, 0xc7a9, 0xb971,
+
+ /*** Three byte table, leaf: e7aexx - offset 0x03843 ***/
+
+ /* 80 */ 0xbcf2, 0xb972, 0xb973, 0xb974, 0xb975, 0xf3eb, 0xb976, 0xb977,
+ /* 88 */ 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb9bf, 0xb97d, 0xb97e,
+ /* 90 */ 0xf3e4, 0xb980, 0xb981, 0xb982, 0xb2ad, 0xbbfe, 0xb983, 0xcbe3,
+ /* 98 */ 0xb984, 0xb985, 0xb986, 0xb987, 0xf3ed, 0xf3e9, 0xb988, 0xb989,
+ /* a0 */ 0xb98a, 0xb9dc, 0xf3ee, 0xb98b, 0xb98c, 0xb98d, 0xf3e5, 0xf3e6,
+ /* a8 */ 0xf3ea, 0xc2e1, 0xf3ec, 0xf3ef, 0xf3e8, 0xbcfd, 0xb98e, 0xb98f,
+ /* b0 */ 0xb990, 0xcfe4, 0xb991, 0xb992, 0xf3f0, 0xb993, 0xb994, 0xb995,
+ /* b8 */ 0xf3e7, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03883 ***/
+
+ /* 80 */ 0xb99d, 0xf3f2, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xd7ad, 0xc6aa,
+ /* 88 */ 0xba41, 0xba42, 0xba43, 0xba44, 0xf3f3, 0xba45, 0xba46, 0xba47,
+ /* 90 */ 0xba48, 0xf3f1, 0xba49, 0xc2a8, 0xba4a, 0xba4b, 0xba4c, 0xba4d,
+ /* 98 */ 0xba4e, 0xb8dd, 0xf3f5, 0xba4f, 0xba50, 0xf3f4, 0xba51, 0xba52,
+ /* a0 */ 0xba53, 0xb4db, 0xba54, 0xba55, 0xba56, 0xf3f6, 0xf3f7, 0xba57,
+ /* a8 */ 0xba58, 0xba59, 0xf3f8, 0xba5a, 0xba5b, 0xba5c, 0xc0ba, 0xba5d,
+ /* b0 */ 0xba5e, 0xc0e9, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xc5f1,
+ /* b8 */ 0xba64, 0xba65, 0xba66, 0xba67, 0xf3fb, 0xba68, 0xf3fa, 0xba69,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x038c3 ***/
+
+ /* 80 */ 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xb4d8,
+ /* 88 */ 0xba71, 0xba72, 0xba73, 0xf3fe, 0xf3f9, 0xba74, 0xba75, 0xf3fc,
+ /* 90 */ 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xf3fd, 0xba7c,
+ /* 98 */ 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xf4a1,
+ /* a0 */ 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xf4a3, 0xbbc9,
+ /* a8 */ 0xba8b, 0xba8c, 0xf4a2, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91,
+ /* b0 */ 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99,
+ /* b8 */ 0xf4a4, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xb2be,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x03903 ***/
+
+ /* 80 */ 0xf4a6, 0xf4a5, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44,
+ /* 88 */ 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbcae, 0xbb4a, 0xbb4b,
+ /* 90 */ 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53,
+ /* 98 */ 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b,
+ /* a0 */ 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63,
+ /* a8 */ 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b,
+ /* b0 */ 0xbb6c, 0xbb6d, 0xbb6e, 0xc3d7, 0xd9e1, 0xbb6f, 0xbb70, 0xbb71,
+ /* b8 */ 0xbb72, 0xbb73, 0xbb74, 0xc0e0, 0xf4cc, 0xd7d1, 0xbb75, 0xbb76,
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x03943 ***/
+
+ /* 80 */ 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e,
+ /* 88 */ 0xbb80, 0xb7db, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86,
+ /* 90 */ 0xbb87, 0xf4ce, 0xc1a3, 0xbb88, 0xbb89, 0xc6c9, 0xbb8a, 0xb4d6,
+ /* 98 */ 0xd5b3, 0xbb8b, 0xbb8c, 0xbb8d, 0xf4d0, 0xf4cf, 0xf4d1, 0xcbda,
+ /* a0 */ 0xbb8e, 0xbb8f, 0xf4d2, 0xbb90, 0xd4c1, 0xd6e0, 0xbb91, 0xbb92,
+ /* a8 */ 0xbb93, 0xbb94, 0xb7e0, 0xbb95, 0xbb96, 0xbb97, 0xc1b8, 0xbb98,
+ /* b0 */ 0xbb99, 0xc1bb, 0xf4d3, 0xbeac, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d,
+ /* b8 */ 0xbb9e, 0xb4e2, 0xbb9f, 0xbba0, 0xf4d4, 0xf4d5, 0xbeab, 0xbc40,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03983 ***/
+
+ /* 80 */ 0xbc41, 0xf4d6, 0xbc42, 0xbc43, 0xbc44, 0xf4db, 0xbc45, 0xf4d7,
+ /* 88 */ 0xf4da, 0xbc46, 0xbafd, 0xbc47, 0xf4d8, 0xf4d9, 0xbc48, 0xbc49,
+ /* 90 */ 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xb8e2, 0xccc7, 0xf4dc,
+ /* 98 */ 0xbc4f, 0xb2da, 0xbc50, 0xbc51, 0xc3d3, 0xbc52, 0xbc53, 0xd4e3,
+ /* a0 */ 0xbfb7, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a,
+ /* a8 */ 0xf4dd, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xc5b4,
+ /* b0 */ 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68,
+ /* b8 */ 0xf4e9, 0xbc69, 0xbc6a, 0xcfb5, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x039c3 ***/
+
+ /* 80 */ 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76,
+ /* 88 */ 0xbc77, 0xbc78, 0xcec9, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d,
+ /* 90 */ 0xbc7e, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86,
+ /* 98 */ 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e,
+ /* a0 */ 0xcbd8, 0xbc8f, 0xcbf7, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbdf4,
+ /* a8 */ 0xbc94, 0xbc95, 0xbc96, 0xd7cf, 0xbc97, 0xbc98, 0xbc99, 0xc0db,
+ /* b0 */ 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40,
+ /* b8 */ 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03a03 ***/
+
+ /* 80 */ 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50,
+ /* 88 */ 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58,
+ /* 90 */ 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60,
+ /* 98 */ 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68,
+ /* a0 */ 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70,
+ /* a8 */ 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xd0f5, 0xbd77,
+ /* b0 */ 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xf4ea,
+ /* b8 */ 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03a43 ***/
+
+ /* 80 */ 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f,
+ /* 88 */ 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97,
+ /* 90 */ 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f,
+ /* 98 */ 0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46,
+ /* a0 */ 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xf4eb, 0xbe4d,
+ /* a8 */ 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xf4ec, 0xbe54,
+ /* b0 */ 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c,
+ /* b8 */ 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03a83 ***/
+
+ /* 80 */ 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c,
+ /* 88 */ 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74,
+ /* 90 */ 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c,
+ /* 98 */ 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85,
+ /* a0 */ 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d,
+ /* a8 */ 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95,
+ /* b0 */ 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d,
+ /* b8 */ 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44,
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x03ac3 ***/
+
+ /* 80 */ 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c,
+ /* 88 */ 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54,
+ /* 90 */ 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c,
+ /* 98 */ 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64,
+ /* a0 */ 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c,
+ /* a8 */ 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74,
+ /* b0 */ 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c,
+ /* b8 */ 0xbf7d, 0xbf7e, 0xbf80, 0xf7e3, 0xbf81, 0xbf82, 0xbf83, 0xbf84,
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03b03 ***/
+
+ /* 80 */ 0xbf85, 0xb7b1, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xf4ed,
+ /* 88 */ 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92,
+ /* 90 */ 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a,
+ /* 98 */ 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041,
+ /* a0 */ 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049,
+ /* a8 */ 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051,
+ /* b0 */ 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059,
+ /* b8 */ 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03b43 ***/
+
+ /* 80 */ 0xc062, 0xc063, 0xd7eb, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068,
+ /* 88 */ 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070,
+ /* 90 */ 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078,
+ /* 98 */ 0xc079, 0xc07a, 0xc07b, 0xf4ee, 0xc07c, 0xc07d, 0xc07e, 0xe6f9,
+ /* a0 */ 0xbec0, 0xe6fa, 0xbaec, 0xe6fb, 0xcfcb, 0xe6fc, 0xd4bc, 0xbcb6,
+ /* a8 */ 0xe6fd, 0xe6fe, 0xbccd, 0xc8d2, 0xceb3, 0xe7a1, 0xc080, 0xb4bf,
+ /* b0 */ 0xe7a2, 0xc9b4, 0xb8d9, 0xc4c9, 0xc081, 0xd7dd, 0xc2da, 0xb7d7,
+ /* b8 */ 0xd6bd, 0xcec6, 0xb7c4, 0xc082, 0xc083, 0xc5a6, 0xe7a3, 0xcfdf,
+
+ /*** Three byte table, leaf: e7bbxx - offset 0x03b83 ***/
+
+ /* 80 */ 0xe7a4, 0xe7a5, 0xe7a6, 0xc1b7, 0xd7e9, 0xc9f0, 0xcfb8, 0xd6af,
+ /* 88 */ 0xd6d5, 0xe7a7, 0xb0ed, 0xe7a8, 0xe7a9, 0xc9dc, 0xd2ef, 0xbead,
+ /* 90 */ 0xe7aa, 0xb0f3, 0xc8de, 0xbde1, 0xe7ab, 0xc8c6, 0xc084, 0xe7ac,
+ /* 98 */ 0xbbe6, 0xb8f8, 0xd1a4, 0xe7ad, 0xc2e7, 0xbef8, 0xbdca, 0xcdb3,
+ /* a0 */ 0xe7ae, 0xe7af, 0xbeee, 0xd0e5, 0xc085, 0xcbe7, 0xccd0, 0xbccc,
+ /* a8 */ 0xe7b0, 0xbca8, 0xd0f7, 0xe7b1, 0xc086, 0xd0f8, 0xe7b2, 0xe7b3,
+ /* b0 */ 0xb4c2, 0xe7b4, 0xe7b5, 0xc9fe, 0xceac, 0xc3e0, 0xe7b7, 0xb1c1,
+ /* b8 */ 0xb3f1, 0xc087, 0xe7b8, 0xe7b9, 0xd7db, 0xd5c0, 0xe7ba, 0xc2cc,
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03bc3 ***/
+
+ /* 80 */ 0xd7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xbcea, 0xc3e5, 0xc0c2, 0xe7be,
+ /* 88 */ 0xe7bf, 0xbca9, 0xc088, 0xe7c0, 0xe7c1, 0xe7b6, 0xb6d0, 0xe7c2,
+ /* 90 */ 0xc089, 0xe7c3, 0xe7c4, 0xbbba, 0xb5de, 0xc2c6, 0xb1e0, 0xe7c5,
+ /* 98 */ 0xd4b5, 0xe7c6, 0xb8bf, 0xe7c8, 0xe7c7, 0xb7ec, 0xc08a, 0xe7c9,
+ /* a0 */ 0xb2f8, 0xe7ca, 0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, 0xe7d0,
+ /* a8 */ 0xd3a7, 0xcbf5, 0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xc9c9, 0xe7d5,
+ /* b0 */ 0xe7d6, 0xe7d7, 0xe7d8, 0xe7d9, 0xbdc9, 0xe7da, 0xf3be, 0xc08b,
+ /* b8 */ 0xb8d7, 0xc08c, 0xc8b1, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091,
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03c03 ***/
+
+ /* 80 */ 0xc092, 0xc093, 0xf3bf, 0xc094, 0xf3c0, 0xf3c1, 0xc095, 0xc096,
+ /* 88 */ 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e,
+ /* 90 */ 0xb9de, 0xcdf8, 0xc09f, 0xc0a0, 0xd8e8, 0xbab1, 0xc140, 0xc2de,
+ /* 98 */ 0xeeb7, 0xc141, 0xb7a3, 0xc142, 0xc143, 0xc144, 0xc145, 0xeeb9,
+ /* a0 */ 0xc146, 0xeeb8, 0xb0d5, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b,
+ /* a8 */ 0xeebb, 0xd5d6, 0xd7ef, 0xc14c, 0xc14d, 0xc14e, 0xd6c3, 0xc14f,
+ /* b0 */ 0xc150, 0xeebd, 0xcaf0, 0xc151, 0xeebc, 0xc152, 0xc153, 0xc154,
+ /* b8 */ 0xc155, 0xeebe, 0xc156, 0xc157, 0xc158, 0xc159, 0xeec0, 0xc15a,
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03c43 ***/
+
+ /* 80 */ 0xc15b, 0xeebf, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161,
+ /* 88 */ 0xc162, 0xc163, 0xd1f2, 0xc164, 0xc7bc, 0xc165, 0xc3c0, 0xc166,
+ /* 90 */ 0xc167, 0xc168, 0xc169, 0xc16a, 0xb8e1, 0xc16b, 0xc16c, 0xc16d,
+ /* 98 */ 0xc16e, 0xc16f, 0xc1e7, 0xc170, 0xc171, 0xf4c6, 0xd0df, 0xf4c7,
+ /* a0 */ 0xc172, 0xcfdb, 0xc173, 0xc174, 0xc8ba, 0xc175, 0xc176, 0xf4c8,
+ /* a8 */ 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xf4c9,
+ /* b0 */ 0xf4ca, 0xc17e, 0xf4cb, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184,
+ /* b8 */ 0xd9fa, 0xb8fe, 0xc185, 0xc186, 0xe5f1, 0xd3f0, 0xc187, 0xf4e0,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03c83 ***/
+
+ /* 80 */ 0xc188, 0xcecc, 0xc189, 0xc18a, 0xc18b, 0xb3e1, 0xc18c, 0xc18d,
+ /* 88 */ 0xc18e, 0xc18f, 0xf1b4, 0xc190, 0xd2ee, 0xc191, 0xf4e1, 0xc192,
+ /* 90 */ 0xc193, 0xc194, 0xc195, 0xc196, 0xcfe8, 0xf4e2, 0xc197, 0xc198,
+ /* 98 */ 0xc7cc, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xb5d4,
+ /* a0 */ 0xb4e4, 0xf4e4, 0xc19f, 0xc1a0, 0xc240, 0xf4e3, 0xf4e5, 0xc241,
+ /* a8 */ 0xc242, 0xf4e6, 0xc243, 0xc244, 0xc245, 0xc246, 0xf4e7, 0xc247,
+ /* b0 */ 0xbab2, 0xb0bf, 0xc248, 0xf4e8, 0xc249, 0xc24a, 0xc24b, 0xc24c,
+ /* b8 */ 0xc24d, 0xc24e, 0xc24f, 0xb7ad, 0xd2ed, 0xc250, 0xc251, 0xc252,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03cc3 ***/
+
+ /* 80 */ 0xd2ab, 0xc0cf, 0xc253, 0xbfbc, 0xeba3, 0xd5df, 0xeac8, 0xc254,
+ /* 88 */ 0xc255, 0xc256, 0xc257, 0xf1f3, 0xb6f8, 0xcba3, 0xc258, 0xc259,
+ /* 90 */ 0xc4cd, 0xc25a, 0xf1e7, 0xc25b, 0xf1e8, 0xb8fb, 0xf1e9, 0xbac4,
+ /* 98 */ 0xd4c5, 0xb0d2, 0xc25c, 0xc25d, 0xf1ea, 0xc25e, 0xc25f, 0xc260,
+ /* a0 */ 0xf1eb, 0xc261, 0xf1ec, 0xc262, 0xc263, 0xf1ed, 0xf1ee, 0xf1ef,
+ /* a8 */ 0xf1f1, 0xf1f0, 0xc5d5, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268,
+ /* b0 */ 0xc269, 0xf1f2, 0xc26a, 0xb6fa, 0xc26b, 0xf1f4, 0xd2ae, 0xdec7,
+ /* b8 */ 0xcbca, 0xc26c, 0xc26d, 0xb3dc, 0xc26e, 0xb5a2, 0xc26f, 0xb9a2,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03d03 ***/
+
+ /* 80 */ 0xc270, 0xc271, 0xc4f4, 0xf1f5, 0xc272, 0xc273, 0xf1f6, 0xc274,
+ /* 88 */ 0xc275, 0xc276, 0xc1c4, 0xc1fb, 0xd6b0, 0xf1f7, 0xc277, 0xc278,
+ /* 90 */ 0xc279, 0xc27a, 0xf1f8, 0xc27b, 0xc1aa, 0xc27c, 0xc27d, 0xc27e,
+ /* 98 */ 0xc6b8, 0xc280, 0xbedb, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285,
+ /* a0 */ 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d,
+ /* a8 */ 0xc28e, 0xf1f9, 0xb4cf, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293,
+ /* b0 */ 0xc294, 0xf1fa, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a,
+ /* b8 */ 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xedb2,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03d43 ***/
+
+ /* 80 */ 0xedb1, 0xc341, 0xc342, 0xcbe0, 0xd2de, 0xc343, 0xcbc1, 0xd5d8,
+ /* 88 */ 0xc344, 0xc8e2, 0xc345, 0xc0df, 0xbca1, 0xc346, 0xc347, 0xc348,
+ /* 90 */ 0xc349, 0xc34a, 0xc34b, 0xebc1, 0xc34c, 0xc34d, 0xd0a4, 0xc34e,
+ /* 98 */ 0xd6e2, 0xc34f, 0xb6c7, 0xb8d8, 0xebc0, 0xb8ce, 0xc350, 0xebbf,
+ /* a0 */ 0xb3a6, 0xb9c9, 0xd6ab, 0xc351, 0xb7f4, 0xb7ca, 0xc352, 0xc353,
+ /* a8 */ 0xc354, 0xbce7, 0xb7be, 0xebc6, 0xc355, 0xebc7, 0xb0b9, 0xbfcf,
+ /* b0 */ 0xc356, 0xebc5, 0xd3fd, 0xc357, 0xebc8, 0xc358, 0xc359, 0xebc9,
+ /* b8 */ 0xc35a, 0xc35b, 0xb7ce, 0xc35c, 0xebc2, 0xebc4, 0xc9f6, 0xd6d7,
+
+ /*** Three byte table, leaf: e883xx - offset 0x03d83 ***/
+
+ /* 80 */ 0xd5cd, 0xd0b2, 0xebcf, 0xceb8, 0xebd0, 0xc35d, 0xb5a8, 0xc35e,
+ /* 88 */ 0xc35f, 0xc360, 0xc361, 0xc362, 0xb1b3, 0xebd2, 0xcca5, 0xc363,
+ /* 90 */ 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc5d6, 0xebd3,
+ /* 98 */ 0xc36a, 0xebd1, 0xc5df, 0xebce, 0xcaa4, 0xebd5, 0xb0fb, 0xc36b,
+ /* a0 */ 0xc36c, 0xbafa, 0xc36d, 0xc36e, 0xd8b7, 0xf1e3, 0xc36f, 0xebca,
+ /* a8 */ 0xebcb, 0xebcc, 0xebcd, 0xebd6, 0xe6c0, 0xebd9, 0xc370, 0xbfe8,
+ /* b0 */ 0xd2c8, 0xebd7, 0xebdc, 0xb8ec, 0xebd8, 0xc371, 0xbdba, 0xc372,
+ /* b8 */ 0xd0d8, 0xc373, 0xb0b7, 0xc374, 0xebdd, 0xc4dc, 0xc375, 0xc376,
+
+ /*** Three byte table, leaf: e884xx - offset 0x03dc3 ***/
+
+ /* 80 */ 0xc377, 0xc378, 0xd6ac, 0xc379, 0xc37a, 0xc37b, 0xb4e0, 0xc37c,
+ /* 88 */ 0xc37d, 0xc2f6, 0xbcb9, 0xc37e, 0xc380, 0xebda, 0xebdb, 0xd4e0,
+ /* 90 */ 0xc6ea, 0xc4d4, 0xebdf, 0xc5a7, 0xd9f5, 0xc381, 0xb2b1, 0xc382,
+ /* 98 */ 0xebe4, 0xc383, 0xbdc5, 0xc384, 0xc385, 0xc386, 0xebe2, 0xc387,
+ /* a0 */ 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f,
+ /* a8 */ 0xc390, 0xc391, 0xc392, 0xc393, 0xebe3, 0xc394, 0xc395, 0xb8ac,
+ /* b0 */ 0xc396, 0xcdd1, 0xebe5, 0xc397, 0xc398, 0xc399, 0xebe1, 0xc39a,
+ /* b8 */ 0xc1b3, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc6a2, 0xc3a0,
+
+ /*** Three byte table, leaf: e885xx - offset 0x03e03 ***/
+
+ /* 80 */ 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xccf3, 0xc446,
+ /* 88 */ 0xebe6, 0xc447, 0xc0b0, 0xd2b8, 0xebe7, 0xc448, 0xc449, 0xc44a,
+ /* 90 */ 0xb8af, 0xb8ad, 0xc44b, 0xebe8, 0xc7bb, 0xcdf3, 0xc44c, 0xc44d,
+ /* 98 */ 0xc44e, 0xebea, 0xebeb, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453,
+ /* a0 */ 0xebed, 0xc454, 0xc455, 0xc456, 0xc457, 0xd0c8, 0xc458, 0xebf2,
+ /* a8 */ 0xc459, 0xebee, 0xc45a, 0xc45b, 0xc45c, 0xebf1, 0xc8f9, 0xc45d,
+ /* b0 */ 0xd1fc, 0xebec, 0xc45e, 0xc45f, 0xebe9, 0xc460, 0xc461, 0xc462,
+ /* b8 */ 0xc463, 0xb8b9, 0xcfd9, 0xc4e5, 0xebef, 0xebf0, 0xccda, 0xcdc8,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03e43 ***/
+
+ /* 80 */ 0xb0f2, 0xc464, 0xebf6, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469,
+ /* 88 */ 0xebf5, 0xc46a, 0xb2b2, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xb8e0,
+ /* 90 */ 0xc46f, 0xebf7, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475,
+ /* 98 */ 0xb1ec, 0xc476, 0xc477, 0xccc5, 0xc4a4, 0xcfa5, 0xc478, 0xc479,
+ /* a0 */ 0xc47a, 0xc47b, 0xc47c, 0xebf9, 0xc47d, 0xc47e, 0xeca2, 0xc480,
+ /* a8 */ 0xc5f2, 0xc481, 0xebfa, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486,
+ /* b0 */ 0xc487, 0xc488, 0xc489, 0xc9c5, 0xc48a, 0xc48b, 0xc48c, 0xc48d,
+ /* b8 */ 0xc48e, 0xc48f, 0xe2df, 0xebfe, 0xc490, 0xc491, 0xc492, 0xc493,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03e83 ***/
+
+ /* 80 */ 0xcdce, 0xeca1, 0xb1db, 0xd3b7, 0xc494, 0xc495, 0xd2dc, 0xc496,
+ /* 88 */ 0xc497, 0xc498, 0xebfd, 0xc499, 0xebfb, 0xc49a, 0xc49b, 0xc49c,
+ /* 90 */ 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543,
+ /* 98 */ 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b,
+ /* a0 */ 0xc54c, 0xc54d, 0xc54e, 0xb3bc, 0xc54f, 0xc550, 0xc551, 0xeab0,
+ /* a8 */ 0xc552, 0xc553, 0xd7d4, 0xc554, 0xf4ab, 0xb3f4, 0xc555, 0xc556,
+ /* b0 */ 0xc557, 0xc558, 0xc559, 0xd6c1, 0xd6c2, 0xc55a, 0xc55b, 0xc55c,
+ /* b8 */ 0xc55d, 0xc55e, 0xc55f, 0xd5e9, 0xbeca, 0xc560, 0xf4a7, 0xc561,
+
+ /*** Three byte table, leaf: e888xx - offset 0x03ec3 ***/
+
+ /* 80 */ 0xd2a8, 0xf4a8, 0xf4a9, 0xc562, 0xf4aa, 0xbecb, 0xd3df, 0xc563,
+ /* 88 */ 0xc564, 0xc565, 0xc566, 0xc567, 0xc9e0, 0xc9e1, 0xc568, 0xc569,
+ /* 90 */ 0xf3c2, 0xc56a, 0xcae6, 0xc56b, 0xccf2, 0xc56c, 0xc56d, 0xc56e,
+ /* 98 */ 0xc56f, 0xc570, 0xc571, 0xe2b6, 0xcbb4, 0xc572, 0xcee8, 0xd6db,
+ /* a0 */ 0xc573, 0xf4ad, 0xf4ae, 0xf4af, 0xc574, 0xc575, 0xc576, 0xc577,
+ /* a8 */ 0xf4b2, 0xc578, 0xbabd, 0xf4b3, 0xb0e3, 0xf4b0, 0xc579, 0xf4b1,
+ /* b0 */ 0xbda2, 0xb2d5, 0xc57a, 0xf4b6, 0xf4b7, 0xb6e6, 0xb2b0, 0xcfcf,
+ /* b8 */ 0xf4b4, 0xb4ac, 0xc57b, 0xf4b5, 0xc57c, 0xc57d, 0xf4b8, 0xc57e,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03f03 ***/
+
+ /* 80 */ 0xc580, 0xc581, 0xc582, 0xc583, 0xf4b9, 0xc584, 0xc585, 0xcda7,
+ /* 88 */ 0xc586, 0xf4ba, 0xc587, 0xf4bb, 0xc588, 0xc589, 0xc58a, 0xf4bc,
+ /* 90 */ 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592,
+ /* 98 */ 0xcbd2, 0xc593, 0xf4bd, 0xc594, 0xc595, 0xc596, 0xc597, 0xf4be,
+ /* a0 */ 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f,
+ /* a8 */ 0xf4bf, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xf4de, 0xc1bc,
+ /* b0 */ 0xbce8, 0xc644, 0xc9ab, 0xd1de, 0xe5f5, 0xc645, 0xc646, 0xc647,
+ /* b8 */ 0xc648, 0xdcb3, 0xd2d5, 0xc649, 0xc64a, 0xdcb4, 0xb0ac, 0xdcb5,
+
+ /*** Three byte table, leaf: e88axx - offset 0x03f43 ***/
+
+ /* 80 */ 0xc64b, 0xc64c, 0xbdda, 0xc64d, 0xdcb9, 0xc64e, 0xc64f, 0xc650,
+ /* 88 */ 0xd8c2, 0xc651, 0xdcb7, 0xd3f3, 0xc652, 0xc9d6, 0xdcba, 0xdcb6,
+ /* 90 */ 0xc653, 0xdcbb, 0xc3a2, 0xc654, 0xc655, 0xc656, 0xc657, 0xdcbc,
+ /* 98 */ 0xdcc5, 0xdcbd, 0xc658, 0xc659, 0xcedf, 0xd6a5, 0xc65a, 0xdccf,
+ /* a0 */ 0xc65b, 0xdccd, 0xc65c, 0xc65d, 0xdcd2, 0xbde6, 0xc2ab, 0xc65e,
+ /* a8 */ 0xdcb8, 0xdccb, 0xdcce, 0xdcbe, 0xb7d2, 0xb0c5, 0xdcc7, 0xd0be,
+ /* b0 */ 0xdcc1, 0xbba8, 0xc65f, 0xb7bc, 0xdccc, 0xc660, 0xc661, 0xdcc6,
+ /* b8 */ 0xdcbf, 0xc7db, 0xc662, 0xc663, 0xc664, 0xd1bf, 0xdcc0, 0xc665,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03f83 ***/
+
+ /* 80 */ 0xc666, 0xdcca, 0xc667, 0xc668, 0xdcd0, 0xc669, 0xc66a, 0xcead,
+ /* 88 */ 0xdcc2, 0xc66b, 0xdcc3, 0xdcc8, 0xdcc9, 0xb2d4, 0xdcd1, 0xcbd5,
+ /* 90 */ 0xc66c, 0xd4b7, 0xdcdb, 0xdcdf, 0xcca6, 0xdce6, 0xc66d, 0xc3e7,
+ /* 98 */ 0xdcdc, 0xc66e, 0xc66f, 0xbfc1, 0xdcd9, 0xc670, 0xb0fa, 0xb9b6,
+ /* a0 */ 0xdce5, 0xdcd3, 0xc671, 0xdcc4, 0xdcd6, 0xc8f4, 0xbfe0, 0xc672,
+ /* a8 */ 0xc673, 0xc674, 0xc675, 0xc9bb, 0xc676, 0xc677, 0xc678, 0xb1bd,
+ /* b0 */ 0xc679, 0xd3a2, 0xc67a, 0xc67b, 0xdcda, 0xc67c, 0xc67d, 0xdcd5,
+ /* b8 */ 0xc67e, 0xc6bb, 0xc680, 0xdcde, 0xc681, 0xc682, 0xc683, 0xc684,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03fc3 ***/
+
+ /* 80 */ 0xc685, 0xd7c2, 0xc3af, 0xb7b6, 0xc7d1, 0xc3a9, 0xdce2, 0xdcd8,
+ /* 88 */ 0xdceb, 0xdcd4, 0xc686, 0xc687, 0xdcdd, 0xc688, 0xbea5, 0xdcd7,
+ /* 90 */ 0xc689, 0xdce0, 0xc68a, 0xc68b, 0xdce3, 0xdce4, 0xc68c, 0xdcf8,
+ /* 98 */ 0xc68d, 0xc68e, 0xdce1, 0xdda2, 0xdce7, 0xc68f, 0xc690, 0xc691,
+ /* a0 */ 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xbceb,
+ /* a8 */ 0xb4c4, 0xc699, 0xc69a, 0xc3a3, 0xb2e7, 0xdcfa, 0xc69b, 0xdcf2,
+ /* b0 */ 0xc69c, 0xdcef, 0xc69d, 0xdcfc, 0xdcee, 0xd2f0, 0xb2e8, 0xc69e,
+ /* b8 */ 0xc8d7, 0xc8e3, 0xdcfb, 0xc69f, 0xdced, 0xc6a0, 0xc740, 0xc741,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x04003 ***/
+
+ /* 80 */ 0xdcf7, 0xc742, 0xc743, 0xdcf5, 0xc744, 0xc745, 0xbea3, 0xdcf4,
+ /* 88 */ 0xc746, 0xb2dd, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xdcf3,
+ /* 90 */ 0xbcf6, 0xdce8, 0xbbc4, 0xc74c, 0xc0f3, 0xc74d, 0xc74e, 0xc74f,
+ /* 98 */ 0xc750, 0xc751, 0xbcd4, 0xdce9, 0xdcea, 0xc752, 0xdcf1, 0xdcf6,
+ /* a0 */ 0xdcf9, 0xb5b4, 0xc753, 0xc8d9, 0xbbe7, 0xdcfe, 0xdcfd, 0xd3ab,
+ /* a8 */ 0xdda1, 0xdda3, 0xdda5, 0xd2f1, 0xdda4, 0xdda6, 0xdda7, 0xd2a9,
+ /* b0 */ 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xbac9,
+ /* b8 */ 0xdda9, 0xc75b, 0xc75c, 0xddb6, 0xddb1, 0xddb4, 0xc75d, 0xc75e,
+
+ /*** Three byte table, leaf: e88exx - offset 0x04043 ***/
+
+ /* 80 */ 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xddb0, 0xc6ce, 0xc764,
+ /* 88 */ 0xc765, 0xc0f2, 0xc766, 0xc767, 0xc768, 0xc769, 0xc9af, 0xc76a,
+ /* 90 */ 0xc76b, 0xc76c, 0xdcec, 0xddae, 0xc76d, 0xc76e, 0xc76f, 0xc770,
+ /* 98 */ 0xddb7, 0xc771, 0xc772, 0xdcf0, 0xddaf, 0xc773, 0xddb8, 0xc774,
+ /* a0 */ 0xddac, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b,
+ /* a8 */ 0xddb9, 0xddb3, 0xddad, 0xc4aa, 0xc77c, 0xc77d, 0xc77e, 0xc780,
+ /* b0 */ 0xdda8, 0xc0b3, 0xc1ab, 0xddaa, 0xddab, 0xc781, 0xddb2, 0xbbf1,
+ /* b8 */ 0xddb5, 0xd3a8, 0xddba, 0xc782, 0xddbb, 0xc3a7, 0xc783, 0xc784,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x04083 ***/
+
+ /* 80 */ 0xddd2, 0xddbc, 0xc785, 0xc786, 0xc787, 0xddd1, 0xc788, 0xb9bd,
+ /* 88 */ 0xc789, 0xc78a, 0xbed5, 0xc78b, 0xbefa, 0xc78c, 0xc78d, 0xbaca,
+ /* 90 */ 0xc78e, 0xc78f, 0xc790, 0xc791, 0xddca, 0xc792, 0xddc5, 0xc793,
+ /* 98 */ 0xddbf, 0xc794, 0xc795, 0xc796, 0xb2cb, 0xddc3, 0xc797, 0xddcb,
+ /* a0 */ 0xb2a4, 0xddd5, 0xc798, 0xc799, 0xc79a, 0xddbe, 0xc79b, 0xc79c,
+ /* a8 */ 0xc79d, 0xc6d0, 0xddd0, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841,
+ /* b0 */ 0xddd4, 0xc1e2, 0xb7c6, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846,
+ /* b8 */ 0xddce, 0xddcf, 0xc847, 0xc848, 0xc849, 0xddc4, 0xc84a, 0xc84b,
+
+ /*** Three byte table, leaf: e890xx - offset 0x040c3 ***/
+
+ /* 80 */ 0xc84c, 0xddbd, 0xc84d, 0xddcd, 0xccd1, 0xc84e, 0xddc9, 0xc84f,
+ /* 88 */ 0xc850, 0xc851, 0xc852, 0xddc2, 0xc3c8, 0xc6bc, 0xceae, 0xddcc,
+ /* 90 */ 0xc853, 0xddc8, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859,
+ /* 98 */ 0xddc1, 0xc85a, 0xc85b, 0xc85c, 0xddc6, 0xc2dc, 0xc85d, 0xc85e,
+ /* a0 */ 0xc85f, 0xc860, 0xc861, 0xc862, 0xd3a9, 0xd3aa, 0xddd3, 0xcff4,
+ /* a8 */ 0xc8f8, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869,
+ /* b0 */ 0xc86a, 0xdde6, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870,
+ /* b8 */ 0xddc7, 0xc871, 0xc872, 0xc873, 0xdde0, 0xc2e4, 0xc874, 0xc875,
+
+ /*** Three byte table, leaf: e891xx - offset 0x04103 ***/
+
+ /* 80 */ 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xdde1, 0xc87c,
+ /* 88 */ 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885,
+ /* 90 */ 0xc886, 0xddd7, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xd6f8,
+ /* 98 */ 0xc88c, 0xddd9, 0xddd8, 0xb8f0, 0xddd6, 0xc88d, 0xc88e, 0xc88f,
+ /* a0 */ 0xc890, 0xc6cf, 0xc891, 0xb6ad, 0xc892, 0xc893, 0xc894, 0xc895,
+ /* a8 */ 0xc896, 0xdde2, 0xc897, 0xbaf9, 0xd4e1, 0xdde7, 0xc898, 0xc899,
+ /* b0 */ 0xc89a, 0xb4d0, 0xc89b, 0xddda, 0xc89c, 0xbffb, 0xdde3, 0xc89d,
+ /* b8 */ 0xdddf, 0xc89e, 0xdddd, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942,
+
+ /*** Three byte table, leaf: e892xx - offset 0x04143 ***/
+
+ /* 80 */ 0xc943, 0xc944, 0xb5d9, 0xc945, 0xc946, 0xc947, 0xc948, 0xdddb,
+ /* 88 */ 0xdddc, 0xddde, 0xc949, 0xbdaf, 0xdde4, 0xc94a, 0xdde5, 0xc94b,
+ /* 90 */ 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xddf5,
+ /* 98 */ 0xc953, 0xc3c9, 0xc954, 0xc955, 0xcbe2, 0xc956, 0xc957, 0xc958,
+ /* a0 */ 0xc959, 0xddf2, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f,
+ /* a8 */ 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xd8e1,
+ /* b0 */ 0xc967, 0xc968, 0xc6d1, 0xc969, 0xddf4, 0xc96a, 0xc96b, 0xc96c,
+ /* b8 */ 0xd5f4, 0xddf3, 0xddf0, 0xc96d, 0xc96e, 0xddec, 0xc96f, 0xddef,
+
+ /*** Three byte table, leaf: e893xx - offset 0x04183 ***/
+
+ /* 80 */ 0xc970, 0xdde8, 0xc971, 0xc972, 0xd0ee, 0xc973, 0xc974, 0xc975,
+ /* 88 */ 0xc976, 0xc8d8, 0xddee, 0xc977, 0xc978, 0xdde9, 0xc979, 0xc97a,
+ /* 90 */ 0xddea, 0xcbf2, 0xc97b, 0xdded, 0xc97c, 0xc97d, 0xb1cd, 0xc97e,
+ /* 98 */ 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc0b6, 0xc985, 0xbcbb,
+ /* a0 */ 0xddf1, 0xc986, 0xc987, 0xddf7, 0xc988, 0xddf6, 0xddeb, 0xc989,
+ /* a8 */ 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc5ee, 0xc98e, 0xc98f, 0xc990,
+ /* b0 */ 0xddfb, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997,
+ /* b8 */ 0xc998, 0xc999, 0xc99a, 0xc99b, 0xdea4, 0xc99c, 0xc99d, 0xdea3,
+
+ /*** Three byte table, leaf: e894xx - offset 0x041c3 ***/
+
+ /* 80 */ 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44,
+ /* 88 */ 0xca45, 0xca46, 0xca47, 0xca48, 0xddf8, 0xca49, 0xca4a, 0xca4b,
+ /* 90 */ 0xca4c, 0xc3ef, 0xca4d, 0xc2fb, 0xca4e, 0xca4f, 0xca50, 0xd5e1,
+ /* 98 */ 0xca51, 0xca52, 0xceb5, 0xca53, 0xca54, 0xca55, 0xca56, 0xddfd,
+ /* a0 */ 0xca57, 0xb2cc, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d,
+ /* a8 */ 0xca5e, 0xca5f, 0xca60, 0xc4e8, 0xcadf, 0xca61, 0xca62, 0xca63,
+ /* b0 */ 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xc7be,
+ /* b8 */ 0xddfa, 0xddfc, 0xddfe, 0xdea2, 0xb0aa, 0xb1ce, 0xca6b, 0xca6c,
+
+ /*** Three byte table, leaf: e895xx - offset 0x04203 ***/
+
+ /* 80 */ 0xca6d, 0xca6e, 0xca6f, 0xdeac, 0xca70, 0xca71, 0xca72, 0xca73,
+ /* 88 */ 0xdea6, 0xbdb6, 0xc8ef, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78,
+ /* 90 */ 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xdea1, 0xca80,
+ /* 98 */ 0xca81, 0xdea5, 0xca82, 0xca83, 0xca84, 0xca85, 0xdea9, 0xca86,
+ /* a0 */ 0xca87, 0xca88, 0xca89, 0xca8a, 0xdea8, 0xca8b, 0xca8c, 0xca8d,
+ /* a8 */ 0xdea7, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94,
+ /* b0 */ 0xca95, 0xca96, 0xdead, 0xca97, 0xd4cc, 0xca98, 0xca99, 0xca9a,
+ /* b8 */ 0xca9b, 0xdeb3, 0xdeaa, 0xdeae, 0xca9c, 0xca9d, 0xc0d9, 0xca9e,
+
+ /*** Three byte table, leaf: e896xx - offset 0x04243 ***/
+
+ /* 80 */ 0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xb1a1, 0xdeb6, 0xcb42, 0xdeb1,
+ /* 88 */ 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xdeb2,
+ /* 90 */ 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51,
+ /* 98 */ 0xcb52, 0xcb53, 0xcb54, 0xd1a6, 0xdeb5, 0xcb55, 0xcb56, 0xcb57,
+ /* a0 */ 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xdeaf, 0xcb5c, 0xcb5d, 0xcb5e,
+ /* a8 */ 0xdeb0, 0xcb5f, 0xd0bd, 0xcb60, 0xcb61, 0xcb62, 0xdeb4, 0xcaed,
+ /* b0 */ 0xdeb9, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xdeb8,
+ /* b8 */ 0xcb69, 0xdeb7, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f,
+
+ /*** Three byte table, leaf: e897xx - offset 0x04283 ***/
+
+ /* 80 */ 0xcb70, 0xdebb, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76,
+ /* 88 */ 0xcb77, 0xbde5, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xb2d8,
+ /* 90 */ 0xc3ea, 0xcb7d, 0xcb7e, 0xdeba, 0xcb80, 0xc5ba, 0xcb81, 0xcb82,
+ /* 98 */ 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xdebc, 0xcb87, 0xcb88, 0xcb89,
+ /* a0 */ 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xccd9, 0xcb8e, 0xcb8f, 0xcb90,
+ /* a8 */ 0xcb91, 0xb7aa, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97,
+ /* b0 */ 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f,
+ /* b8 */ 0xcba0, 0xcc40, 0xcc41, 0xd4e5, 0xcc42, 0xcc43, 0xcc44, 0xdebd,
+
+ /*** Three byte table, leaf: e898xx - offset 0x042c3 ***/
+
+ /* 80 */ 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xdebf, 0xcc4a, 0xcc4b,
+ /* 88 */ 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53,
+ /* 90 */ 0xcc54, 0xc4a2, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xdec1, 0xcc59,
+ /* 98 */ 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61,
+ /* a0 */ 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xdebe,
+ /* a8 */ 0xcc69, 0xdec0, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f,
+ /* b0 */ 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77,
+ /* b8 */ 0xd5ba, 0xcc78, 0xcc79, 0xcc7a, 0xdec2, 0xcc7b, 0xcc7c, 0xcc7d,
+
+ /*** Three byte table, leaf: e899xx - offset 0x04303 ***/
+
+ /* 80 */ 0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86,
+ /* 88 */ 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xf2ae, 0xbba2, 0xc2b2,
+ /* 90 */ 0xc5b0, 0xc2c7, 0xcc8c, 0xcc8d, 0xf2af, 0xcc8e, 0xcc8f, 0xcc90,
+ /* 98 */ 0xcc91, 0xcc92, 0xd0e9, 0xcc93, 0xcc94, 0xcc95, 0xd3dd, 0xcc96,
+ /* a0 */ 0xcc97, 0xcc98, 0xebbd, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d,
+ /* a8 */ 0xcc9e, 0xcc9f, 0xcca0, 0xb3e6, 0xf2b0, 0xcd40, 0xf2b1, 0xcd41,
+ /* b0 */ 0xcd42, 0xcaad, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48,
+ /* b8 */ 0xcd49, 0xbae7, 0xf2b3, 0xf2b5, 0xf2b4, 0xcbe4, 0xcfba, 0xf2b2,
+
+ /*** Three byte table, leaf: e89axx - offset 0x04343 ***/
+
+ /* 80 */ 0xcab4, 0xd2cf, 0xc2ec, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e,
+ /* 88 */ 0xcd4f, 0xcd50, 0xcec3, 0xf2b8, 0xb0f6, 0xf2b7, 0xcd51, 0xcd52,
+ /* 90 */ 0xcd53, 0xcd54, 0xcd55, 0xf2be, 0xcd56, 0xb2cf, 0xcd57, 0xcd58,
+ /* 98 */ 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xd1c1, 0xf2ba, 0xcd5d, 0xcd5e,
+ /* a0 */ 0xcd5f, 0xcd60, 0xcd61, 0xf2bc, 0xd4e9, 0xcd62, 0xcd63, 0xf2bb,
+ /* a8 */ 0xf2b6, 0xf2bf, 0xf2bd, 0xcd64, 0xf2b9, 0xcd65, 0xcd66, 0xf2c7,
+ /* b0 */ 0xf2c4, 0xf2c6, 0xcd67, 0xcd68, 0xf2ca, 0xf2c2, 0xf2c0, 0xcd69,
+ /* b8 */ 0xcd6a, 0xcd6b, 0xf2c5, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70,
+
+ /*** Three byte table, leaf: e89bxx - offset 0x04383 ***/
+
+ /* 80 */ 0xd6fb, 0xcd71, 0xcd72, 0xcd73, 0xf2c1, 0xcd74, 0xc7f9, 0xc9df,
+ /* 88 */ 0xcd75, 0xf2c8, 0xb9c6, 0xb5b0, 0xcd76, 0xcd77, 0xf2c3, 0xf2c9,
+ /* 90 */ 0xf2d0, 0xf2d6, 0xcd78, 0xcd79, 0xbbd7, 0xcd7a, 0xcd7b, 0xcd7c,
+ /* 98 */ 0xf2d5, 0xcddc, 0xcd7d, 0xd6eb, 0xcd7e, 0xcd80, 0xf2d2, 0xf2d4,
+ /* a0 */ 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xb8f2, 0xcd85, 0xcd86, 0xcd87,
+ /* a8 */ 0xcd88, 0xf2cb, 0xcd89, 0xcd8a, 0xcd8b, 0xf2ce, 0xc2f9, 0xcd8c,
+ /* b0 */ 0xd5dd, 0xf2cc, 0xf2cd, 0xf2cf, 0xf2d3, 0xcd8d, 0xcd8e, 0xcd8f,
+ /* b8 */ 0xf2d9, 0xd3bc, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xb6ea, 0xcd94,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x043c3 ***/
+
+ /* 80 */ 0xcaf1, 0xcd95, 0xb7e4, 0xf2d7, 0xcd96, 0xcd97, 0xcd98, 0xf2d8,
+ /* 88 */ 0xf2da, 0xf2dd, 0xf2db, 0xcd99, 0xcd9a, 0xf2dc, 0xcd9b, 0xcd9c,
+ /* 90 */ 0xcd9d, 0xcd9e, 0xd1d1, 0xf2d1, 0xcd9f, 0xcdc9, 0xcda0, 0xcecf,
+ /* 98 */ 0xd6a9, 0xce40, 0xf2e3, 0xce41, 0xc3db, 0xce42, 0xf2e0, 0xce43,
+ /* a0 */ 0xce44, 0xc0af, 0xf2ec, 0xf2de, 0xce45, 0xf2e1, 0xce46, 0xce47,
+ /* a8 */ 0xce48, 0xf2e8, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xf2e2, 0xce4d,
+ /* b0 */ 0xce4e, 0xf2e7, 0xce4f, 0xce50, 0xf2e6, 0xce51, 0xce52, 0xf2e9,
+ /* b8 */ 0xce53, 0xce54, 0xce55, 0xf2df, 0xce56, 0xce57, 0xf2e4, 0xf2ea,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x04403 ***/
+
+ /* 80 */ 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xd3ac,
+ /* 88 */ 0xf2e5, 0xb2f5, 0xce5f, 0xce60, 0xf2f2, 0xce61, 0xd0ab, 0xce62,
+ /* 90 */ 0xce63, 0xce64, 0xce65, 0xf2f5, 0xce66, 0xce67, 0xce68, 0xbbc8,
+ /* 98 */ 0xce69, 0xf2f9, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f,
+ /* a0 */ 0xf2f0, 0xce70, 0xce71, 0xf2f6, 0xf2f8, 0xf2fa, 0xce72, 0xce73,
+ /* a8 */ 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xf2f3, 0xce7a,
+ /* b0 */ 0xf2f1, 0xce7b, 0xce7c, 0xce7d, 0xbafb, 0xce7e, 0xb5fb, 0xce80,
+ /* b8 */ 0xce81, 0xce82, 0xce83, 0xf2ef, 0xf2f7, 0xf2ed, 0xf2ee, 0xce84,
+
+ /*** Three byte table, leaf: e89exx - offset 0x04443 ***/
+
+ /* 80 */ 0xce85, 0xce86, 0xf2eb, 0xf3a6, 0xce87, 0xf3a3, 0xce88, 0xce89,
+ /* 88 */ 0xf3a2, 0xce8a, 0xce8b, 0xf2f4, 0xce8c, 0xc8da, 0xce8d, 0xce8e,
+ /* 90 */ 0xce8f, 0xce90, 0xce91, 0xf2fb, 0xce92, 0xce93, 0xce94, 0xf3a5,
+ /* 98 */ 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xc3f8,
+ /* a0 */ 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42,
+ /* a8 */ 0xf2fd, 0xcf43, 0xcf44, 0xf3a7, 0xf3a9, 0xf3a4, 0xcf45, 0xf2fc,
+ /* b0 */ 0xcf46, 0xcf47, 0xcf48, 0xf3ab, 0xcf49, 0xf3aa, 0xcf4a, 0xcf4b,
+ /* b8 */ 0xcf4c, 0xcf4d, 0xc2dd, 0xcf4e, 0xcf4f, 0xf3ae, 0xcf50, 0xcf51,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x04483 ***/
+
+ /* 80 */ 0xf3b0, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xf3a1, 0xcf57,
+ /* 88 */ 0xcf58, 0xcf59, 0xf3b1, 0xf3ac, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d,
+ /* 90 */ 0xcf5e, 0xf3af, 0xf2fe, 0xf3ad, 0xcf5f, 0xcf60, 0xcf61, 0xcf62,
+ /* 98 */ 0xcf63, 0xcf64, 0xcf65, 0xf3b2, 0xcf66, 0xcf67, 0xcf68, 0xcf69,
+ /* a0 */ 0xf3b4, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xf3a8, 0xcf6e, 0xcf6f,
+ /* a8 */ 0xcf70, 0xcf71, 0xf3b3, 0xcf72, 0xcf73, 0xcf74, 0xf3b5, 0xcf75,
+ /* b0 */ 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d,
+ /* b8 */ 0xcf7e, 0xd0b7, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xf3b8, 0xcf84,
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x044c3 ***/
+
+ /* 80 */ 0xcf85, 0xcf86, 0xcf87, 0xd9f9, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b,
+ /* 88 */ 0xcf8c, 0xcf8d, 0xf3b9, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92,
+ /* 90 */ 0xcf93, 0xcf94, 0xcf95, 0xf3b7, 0xcf96, 0xc8e4, 0xf3b6, 0xcf97,
+ /* 98 */ 0xcf98, 0xcf99, 0xcf9a, 0xf3ba, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e,
+ /* a0 */ 0xcf9f, 0xf3bb, 0xb4c0, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043,
+ /* a8 */ 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b,
+ /* b0 */ 0xd04c, 0xd04d, 0xeec3, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052,
+ /* b8 */ 0xd053, 0xf3bc, 0xd054, 0xd055, 0xf3bd, 0xd056, 0xd057, 0xd058,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x04503 ***/
+
+ /* 80 */ 0xd1aa, 0xd059, 0xd05a, 0xd05b, 0xf4ac, 0xd0c6, 0xd05c, 0xd05d,
+ /* 88 */ 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd0d0, 0xd1dc, 0xd062, 0xd063,
+ /* 90 */ 0xd064, 0xd065, 0xd066, 0xd067, 0xcfce, 0xd068, 0xd069, 0xbdd6,
+ /* 98 */ 0xd06a, 0xd1c3, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070,
+ /* a0 */ 0xd071, 0xbae2, 0xe1e9, 0xd2c2, 0xf1c2, 0xb2b9, 0xd072, 0xd073,
+ /* a8 */ 0xb1ed, 0xf1c3, 0xd074, 0xc9c0, 0xb3c4, 0xd075, 0xd9f2, 0xd076,
+ /* b0 */ 0xcba5, 0xd077, 0xf1c4, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd6d4,
+ /* b8 */ 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xf1c5, 0xf4c0, 0xf1c6,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x04543 ***/
+
+ /* 80 */ 0xd082, 0xd4ac, 0xf1c7, 0xd083, 0xb0c0, 0xf4c1, 0xd084, 0xd085,
+ /* 88 */ 0xf4c2, 0xd086, 0xd087, 0xb4fc, 0xd088, 0xc5db, 0xd089, 0xd08a,
+ /* 90 */ 0xd08b, 0xd08c, 0xccbb, 0xd08d, 0xd08e, 0xd08f, 0xd0e4, 0xd090,
+ /* 98 */ 0xd091, 0xd092, 0xd093, 0xd094, 0xcde0, 0xd095, 0xd096, 0xd097,
+ /* a0 */ 0xd098, 0xd099, 0xf1c8, 0xd09a, 0xd9f3, 0xd09b, 0xd09c, 0xd09d,
+ /* a8 */ 0xd09e, 0xd09f, 0xd0a0, 0xb1bb, 0xd140, 0xcfae, 0xd141, 0xd142,
+ /* b0 */ 0xd143, 0xb8a4, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xf1ca,
+ /* b8 */ 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xf1cb, 0xd14d, 0xd14e, 0xd14f,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x04583 ***/
+
+ /* 80 */ 0xd150, 0xb2c3, 0xc1d1, 0xd151, 0xd152, 0xd7b0, 0xf1c9, 0xd153,
+ /* 88 */ 0xd154, 0xf1cc, 0xd155, 0xd156, 0xd157, 0xd158, 0xf1ce, 0xd159,
+ /* 90 */ 0xd15a, 0xd15b, 0xd9f6, 0xd15c, 0xd2e1, 0xd4a3, 0xd15d, 0xd15e,
+ /* 98 */ 0xf4c3, 0xc8b9, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xf4c4,
+ /* a0 */ 0xd164, 0xd165, 0xf1cd, 0xf1cf, 0xbfe3, 0xf1d0, 0xd166, 0xd167,
+ /* a8 */ 0xf1d4, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e,
+ /* b0 */ 0xf1d6, 0xf1d1, 0xd16f, 0xc9d1, 0xc5e1, 0xd170, 0xd171, 0xd172,
+ /* b8 */ 0xc2e3, 0xb9fc, 0xd173, 0xd174, 0xf1d3, 0xd175, 0xf1d5, 0xd176,
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x045c3 ***/
+
+ /* 80 */ 0xd177, 0xd178, 0xb9d3, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d,
+ /* 88 */ 0xd17e, 0xd180, 0xf1db, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185,
+ /* 90 */ 0xbad6, 0xd186, 0xb0fd, 0xf1d9, 0xd187, 0xd188, 0xd189, 0xd18a,
+ /* 98 */ 0xd18b, 0xf1d8, 0xf1d2, 0xf1da, 0xd18c, 0xd18d, 0xd18e, 0xd18f,
+ /* a0 */ 0xd190, 0xf1d7, 0xd191, 0xd192, 0xd193, 0xc8ec, 0xd194, 0xd195,
+ /* a8 */ 0xd196, 0xd197, 0xcdca, 0xf1dd, 0xd198, 0xd199, 0xd19a, 0xd19b,
+ /* b0 */ 0xe5bd, 0xd19c, 0xd19d, 0xd19e, 0xf1dc, 0xd19f, 0xf1de, 0xd1a0,
+ /* b8 */ 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x04603 ***/
+
+ /* 80 */ 0xd248, 0xf1df, 0xd249, 0xd24a, 0xcfe5, 0xd24b, 0xd24c, 0xd24d,
+ /* 88 */ 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255,
+ /* 90 */ 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d,
+ /* 98 */ 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xf4c5, 0xbdf3,
+ /* a0 */ 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xf1e0, 0xd26a,
+ /* a8 */ 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272,
+ /* b0 */ 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a,
+ /* b8 */ 0xd27b, 0xd27c, 0xd27d, 0xf1e1, 0xd27e, 0xd280, 0xd281, 0xcef7,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x04643 ***/
+
+ /* 80 */ 0xd282, 0xd2aa, 0xd283, 0xf1fb, 0xd284, 0xd285, 0xb8b2, 0xd286,
+ /* 88 */ 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e,
+ /* 90 */ 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296,
+ /* 98 */ 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e,
+ /* a0 */ 0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345,
+ /* a8 */ 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d,
+ /* b0 */ 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355,
+ /* b8 */ 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x04683 ***/
+
+ /* 80 */ 0xd35e, 0xbcfb, 0xb9db, 0xd35f, 0xb9e6, 0xc3d9, 0xcad3, 0xeae8,
+ /* 88 */ 0xc0c0, 0xbef5, 0xeae9, 0xeaea, 0xeaeb, 0xd360, 0xeaec, 0xeaed,
+ /* 90 */ 0xeaee, 0xeaef, 0xbdc7, 0xd361, 0xd362, 0xd363, 0xf5fb, 0xd364,
+ /* 98 */ 0xd365, 0xd366, 0xf5fd, 0xd367, 0xf5fe, 0xd368, 0xf5fc, 0xd369,
+ /* a0 */ 0xd36a, 0xd36b, 0xd36c, 0xbde2, 0xd36d, 0xf6a1, 0xb4a5, 0xd36e,
+ /* a8 */ 0xd36f, 0xd370, 0xd371, 0xf6a2, 0xd372, 0xd373, 0xd374, 0xf6a3,
+ /* b0 */ 0xd375, 0xd376, 0xd377, 0xecb2, 0xd378, 0xd379, 0xd37a, 0xd37b,
+ /* b8 */ 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x046c3 ***/
+
+ /* 80 */ 0xd1d4, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd9ea,
+ /* 88 */ 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392,
+ /* 90 */ 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a,
+ /* 98 */ 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441,
+ /* a0 */ 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449,
+ /* a8 */ 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451,
+ /* b0 */ 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459,
+ /* b8 */ 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xf6a4, 0xd460,
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x04703 ***/
+
+ /* 80 */ 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468,
+ /* 88 */ 0xeeba, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f,
+ /* 90 */ 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477,
+ /* 98 */ 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480,
+ /* a0 */ 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488,
+ /* a8 */ 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490,
+ /* b0 */ 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498,
+ /* b8 */ 0xd499, 0xd5b2, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f,
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04743 ***/
+
+ /* 80 */ 0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546,
+ /* 88 */ 0xd547, 0xd3fe, 0xccdc, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c,
+ /* 90 */ 0xd54d, 0xd54e, 0xd54f, 0xcac4, 0xd550, 0xd551, 0xd552, 0xd553,
+ /* 98 */ 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b,
+ /* a0 */ 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563,
+ /* a8 */ 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b,
+ /* b0 */ 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573,
+ /* b8 */ 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04783 ***/
+
+ /* 80 */ 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584,
+ /* 88 */ 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c,
+ /* 90 */ 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594,
+ /* 98 */ 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c,
+ /* a0 */ 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643,
+ /* a8 */ 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b,
+ /* b0 */ 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653,
+ /* b8 */ 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x047c3 ***/
+
+ /* 80 */ 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xe5c0,
+ /* 88 */ 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a,
+ /* 90 */ 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672,
+ /* 98 */ 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a,
+ /* a0 */ 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xf6a5, 0xd682,
+ /* a8 */ 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a,
+ /* b0 */ 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692,
+ /* b8 */ 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a,
+
+ /*** Three byte table, leaf: e8adxx - offset 0x04803 ***/
+
+ /* 80 */ 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741,
+ /* 88 */ 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749,
+ /* 90 */ 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751,
+ /* 98 */ 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759,
+ /* a0 */ 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xbeaf, 0xd760,
+ /* a8 */ 0xd761, 0xd762, 0xd763, 0xd764, 0xc6a9, 0xd765, 0xd766, 0xd767,
+ /* b0 */ 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f,
+ /* b8 */ 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04843 ***/
+
+ /* 80 */ 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780,
+ /* 88 */ 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788,
+ /* 90 */ 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790,
+ /* 98 */ 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798,
+ /* a0 */ 0xdaa5, 0xbcc6, 0xb6a9, 0xb8bc, 0xc8cf, 0xbca5, 0xdaa6, 0xdaa7,
+ /* a8 */ 0xccd6, 0xc8c3, 0xdaa8, 0xc6fd, 0xd799, 0xd1b5, 0xd2e9, 0xd1b6,
+ /* b0 */ 0xbcc7, 0xd79a, 0xbdb2, 0xbbe4, 0xdaa9, 0xdaaa, 0xd1c8, 0xdaab,
+ /* b8 */ 0xd0ed, 0xb6ef, 0xc2db, 0xd79b, 0xcbcf, 0xb7ed, 0xc9e8, 0xb7c3,
+
+ /*** Three byte table, leaf: e8afxx - offset 0x04883 ***/
+
+ /* 80 */ 0xbef7, 0xd6a4, 0xdaac, 0xdaad, 0xc6c0, 0xd7e7, 0xcab6, 0xd79c,
+ /* 88 */ 0xd5a9, 0xcbdf, 0xd5ef, 0xdaae, 0xd6df, 0xb4ca, 0xdab0, 0xdaaf,
+ /* 90 */ 0xd79d, 0xd2eb, 0xdab1, 0xdab2, 0xdab3, 0xcad4, 0xdab4, 0xcaab,
+ /* 98 */ 0xdab5, 0xdab6, 0xb3cf, 0xd6ef, 0xdab7, 0xbbb0, 0xb5ae, 0xdab8,
+ /* a0 */ 0xdab9, 0xb9ee, 0xd1af, 0xd2e8, 0xdaba, 0xb8c3, 0xcfea, 0xb2ef,
+ /* a8 */ 0xdabb, 0xdabc, 0xd79e, 0xbdeb, 0xcedc, 0xd3ef, 0xdabd, 0xcef3,
+ /* b0 */ 0xdabe, 0xd3d5, 0xbbe5, 0xdabf, 0xcbb5, 0xcbd0, 0xdac0, 0xc7eb,
+ /* b8 */ 0xd6ee, 0xdac1, 0xc5b5, 0xb6c1, 0xdac2, 0xb7cc, 0xbfce, 0xdac3,
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x048c3 ***/
+
+ /* 80 */ 0xdac4, 0xcbad, 0xdac5, 0xb5f7, 0xdac6, 0xc1c2, 0xd7bb, 0xdac7,
+ /* 88 */ 0xccb8, 0xd79f, 0xd2ea, 0xc4b1, 0xdac8, 0xb5fd, 0xbbd1, 0xdac9,
+ /* 90 */ 0xd0b3, 0xdaca, 0xdacb, 0xcebd, 0xdacc, 0xdacd, 0xdace, 0xb2f7,
+ /* 98 */ 0xdad1, 0xdacf, 0xd1e8, 0xdad0, 0xc3d5, 0xdad2, 0xd7a0, 0xdad3,
+ /* a0 */ 0xdad4, 0xdad5, 0xd0bb, 0xd2a5, 0xb0f9, 0xdad6, 0xc7ab, 0xdad7,
+ /* a8 */ 0xbdf7, 0xc3a1, 0xdad8, 0xdad9, 0xc3fd, 0xccb7, 0xdada, 0xdadb,
+ /* b0 */ 0xc0be, 0xc6d7, 0xdadc, 0xdadd, 0xc7b4, 0xdade, 0xdadf, 0xb9c8,
+ /* b8 */ 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x04903 ***/
+
+ /* 80 */ 0xd848, 0xbbed, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xb6b9, 0xf4f8,
+ /* 88 */ 0xd84d, 0xf4f9, 0xd84e, 0xd84f, 0xcde3, 0xd850, 0xd851, 0xd852,
+ /* 90 */ 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xf5b9, 0xd858, 0xd859,
+ /* 98 */ 0xd85a, 0xd85b, 0xebe0, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860,
+ /* a0 */ 0xd861, 0xcff3, 0xbbbf, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866,
+ /* a8 */ 0xd867, 0xd868, 0xbac0, 0xd4a5, 0xd869, 0xd86a, 0xd86b, 0xd86c,
+ /* b0 */ 0xd86d, 0xd86e, 0xd86f, 0xe1d9, 0xd870, 0xd871, 0xd872, 0xd873,
+ /* b8 */ 0xf5f4, 0xb1aa, 0xb2f2, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878,
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x04943 ***/
+
+ /* 80 */ 0xd879, 0xd87a, 0xf5f5, 0xd87b, 0xd87c, 0xf5f7, 0xd87d, 0xd87e,
+ /* 88 */ 0xd880, 0xbad1, 0xf5f6, 0xd881, 0xc3b2, 0xd882, 0xd883, 0xd884,
+ /* 90 */ 0xd885, 0xd886, 0xd887, 0xd888, 0xf5f9, 0xd889, 0xd88a, 0xd88b,
+ /* 98 */ 0xf5f8, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892,
+ /* a0 */ 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a,
+ /* a8 */ 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941,
+ /* b0 */ 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949,
+ /* b8 */ 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x04983 ***/
+
+ /* 80 */ 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959,
+ /* 88 */ 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961,
+ /* 90 */ 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969,
+ /* 98 */ 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971,
+ /* a0 */ 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979,
+ /* a8 */ 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982,
+ /* b0 */ 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a,
+ /* b8 */ 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992,
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x049c3 ***/
+
+ /* 80 */ 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a,
+ /* 88 */ 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41,
+ /* 90 */ 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49,
+ /* 98 */ 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xb1b4, 0xd5ea, 0xb8ba,
+ /* a0 */ 0xda4f, 0xb9b1, 0xb2c6, 0xd4f0, 0xcfcd, 0xb0dc, 0xd5cb, 0xbbf5,
+ /* a8 */ 0xd6ca, 0xb7b7, 0xccb0, 0xc6b6, 0xb1e1, 0xb9ba, 0xd6fc, 0xb9e1,
+ /* b0 */ 0xb7a1, 0xbcfa, 0xeada, 0xeadb, 0xccf9, 0xb9f3, 0xeadc, 0xb4fb,
+ /* b8 */ 0xc3b3, 0xb7d1, 0xbad8, 0xeadd, 0xd4f4, 0xeade, 0xbcd6, 0xbbdf,
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04a03 ***/
+
+ /* 80 */ 0xeadf, 0xc1de, 0xc2b8, 0xd4df, 0xd7ca, 0xeae0, 0xeae1, 0xeae4,
+ /* 88 */ 0xeae2, 0xeae3, 0xc9de, 0xb8b3, 0xb6c4, 0xeae5, 0xcaea, 0xc9cd,
+ /* 90 */ 0xb4cd, 0xda50, 0xda51, 0xe2d9, 0xc5e2, 0xeae6, 0xc0b5, 0xda52,
+ /* 98 */ 0xd7b8, 0xeae7, 0xd7ac, 0xc8fc, 0xd8d3, 0xd8cd, 0xd4de, 0xda53,
+ /* a0 */ 0xd4f9, 0xc9c4, 0xd3ae, 0xb8d3, 0xb3e0, 0xda54, 0xc9e2, 0xf4f6,
+ /* a8 */ 0xda55, 0xda56, 0xda57, 0xbad5, 0xda58, 0xf4f7, 0xda59, 0xda5a,
+ /* b0 */ 0xd7df, 0xda5b, 0xda5c, 0xf4f1, 0xb8b0, 0xd5d4, 0xb8cf, 0xc6f0,
+ /* b8 */ 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64,
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04a43 ***/
+
+ /* 80 */ 0xda65, 0xb3c3, 0xda66, 0xda67, 0xf4f2, 0xb3ac, 0xda68, 0xda69,
+ /* 88 */ 0xda6a, 0xda6b, 0xd4bd, 0xc7f7, 0xda6c, 0xda6d, 0xda6e, 0xda6f,
+ /* 90 */ 0xda70, 0xf4f4, 0xda71, 0xda72, 0xf4f3, 0xda73, 0xda74, 0xda75,
+ /* 98 */ 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xcccb,
+ /* a0 */ 0xda7d, 0xda7e, 0xda80, 0xc8a4, 0xda81, 0xda82, 0xda83, 0xda84,
+ /* a8 */ 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c,
+ /* b0 */ 0xda8d, 0xf4f5, 0xda8e, 0xd7e3, 0xc5bf, 0xf5c0, 0xda8f, 0xda90,
+ /* b8 */ 0xf5bb, 0xda91, 0xf5c3, 0xda92, 0xf5c2, 0xda93, 0xd6ba, 0xf5c1,
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x04a83 ***/
+
+ /* 80 */ 0xda94, 0xda95, 0xda96, 0xd4be, 0xf5c4, 0xda97, 0xf5cc, 0xda98,
+ /* 88 */ 0xda99, 0xda9a, 0xda9b, 0xb0cf, 0xb5f8, 0xda9c, 0xf5c9, 0xf5ca,
+ /* 90 */ 0xda9d, 0xc5dc, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xf5c5, 0xf5c6,
+ /* 98 */ 0xdb41, 0xdb42, 0xf5c7, 0xf5cb, 0xdb43, 0xbee0, 0xf5c8, 0xb8fa,
+ /* a0 */ 0xdb44, 0xdb45, 0xdb46, 0xf5d0, 0xf5d3, 0xdb47, 0xdb48, 0xdb49,
+ /* a8 */ 0xbfe7, 0xdb4a, 0xb9f2, 0xf5bc, 0xf5cd, 0xdb4b, 0xdb4c, 0xc2b7,
+ /* b0 */ 0xdb4d, 0xdb4e, 0xdb4f, 0xccf8, 0xdb50, 0xbcf9, 0xdb51, 0xf5ce,
+ /* b8 */ 0xf5cf, 0xf5d1, 0xb6e5, 0xf5d2, 0xdb52, 0xf5d5, 0xdb53, 0xdb54,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x04ac3 ***/
+
+ /* 80 */ 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xf5bd, 0xdb5a, 0xdb5b,
+ /* 88 */ 0xdb5c, 0xf5d4, 0xd3bb, 0xdb5d, 0xb3ec, 0xdb5e, 0xdb5f, 0xcca4,
+ /* 90 */ 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xf5d6, 0xdb64, 0xdb65, 0xdb66,
+ /* 98 */ 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xf5d7, 0xbee1, 0xf5d8,
+ /* a0 */ 0xdb6c, 0xdb6d, 0xccdf, 0xf5db, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71,
+ /* a8 */ 0xdb72, 0xb2c8, 0xd7d9, 0xdb73, 0xf5d9, 0xdb74, 0xf5da, 0xf5dc,
+ /* b0 */ 0xdb75, 0xf5e2, 0xdb76, 0xdb77, 0xdb78, 0xf5e0, 0xdb79, 0xdb7a,
+ /* b8 */ 0xdb7b, 0xf5df, 0xf5dd, 0xdb7c, 0xdb7d, 0xf5e1, 0xdb7e, 0xdb80,
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04b03 ***/
+
+ /* 80 */ 0xf5de, 0xf5e4, 0xf5e5, 0xdb81, 0xcce3, 0xdb82, 0xdb83, 0xe5bf,
+ /* 88 */ 0xb5b8, 0xf5e3, 0xf5e8, 0xcca3, 0xdb84, 0xdb85, 0xdb86, 0xdb87,
+ /* 90 */ 0xdb88, 0xf5e6, 0xf5e7, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d,
+ /* 98 */ 0xdb8e, 0xf5be, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94,
+ /* a0 */ 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xb1c4, 0xdb9b,
+ /* a8 */ 0xdb9c, 0xf5bf, 0xdb9d, 0xdb9e, 0xb5c5, 0xb2e4, 0xdb9f, 0xf5ec,
+ /* b0 */ 0xf5e9, 0xdba0, 0xb6d7, 0xdc40, 0xf5ed, 0xdc41, 0xf5ea, 0xdc42,
+ /* b8 */ 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xf5eb, 0xdc47, 0xdc48, 0xb4da,
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04b43 ***/
+
+ /* 80 */ 0xdc49, 0xd4ea, 0xdc4a, 0xdc4b, 0xdc4c, 0xf5ee, 0xdc4d, 0xb3f9,
+ /* 88 */ 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xf5ef,
+ /* 90 */ 0xf5f1, 0xdc55, 0xdc56, 0xdc57, 0xf5f0, 0xdc58, 0xdc59, 0xdc5a,
+ /* 98 */ 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xf5f2, 0xdc5f, 0xf5f3, 0xdc60,
+ /* a0 */ 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68,
+ /* a8 */ 0xdc69, 0xdc6a, 0xdc6b, 0xc9ed, 0xb9aa, 0xdc6c, 0xdc6d, 0xc7fb,
+ /* b0 */ 0xdc6e, 0xdc6f, 0xb6e3, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74,
+ /* b8 */ 0xdc75, 0xdc76, 0xccc9, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04b83 ***/
+
+ /* 80 */ 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84,
+ /* 88 */ 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xeaa6, 0xdc8b,
+ /* 90 */ 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93,
+ /* 98 */ 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b,
+ /* a0 */ 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42,
+ /* a8 */ 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a,
+ /* b0 */ 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52,
+ /* b8 */ 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x04bc3 ***/
+
+ /* 80 */ 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62,
+ /* 88 */ 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a,
+ /* 90 */ 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72,
+ /* 98 */ 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a,
+ /* a0 */ 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83,
+ /* a8 */ 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b,
+ /* b0 */ 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93,
+ /* b8 */ 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04c03 ***/
+
+ /* 80 */ 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42,
+ /* 88 */ 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a,
+ /* 90 */ 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52,
+ /* 98 */ 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a,
+ /* a0 */ 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xb3b5, 0xd4fe,
+ /* a8 */ 0xb9ec, 0xd0f9, 0xde61, 0xe9ed, 0xd7aa, 0xe9ee, 0xc2d6, 0xc8ed,
+ /* b0 */ 0xbae4, 0xe9ef, 0xe9f0, 0xe9f1, 0xd6e1, 0xe9f2, 0xe9f3, 0xe9f5,
+ /* b8 */ 0xe9f4, 0xe9f6, 0xe9f7, 0xc7e1, 0xe9f8, 0xd4d8, 0xe9f9, 0xbdce,
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04c43 ***/
+
+ /* 80 */ 0xde62, 0xe9fa, 0xe9fb, 0xbdcf, 0xe9fc, 0xb8a8, 0xc1be, 0xe9fd,
+ /* 88 */ 0xb1b2, 0xbbd4, 0xb9f5, 0xe9fe, 0xde63, 0xeaa1, 0xeaa2, 0xeaa3,
+ /* 90 */ 0xb7f8, 0xbcad, 0xde64, 0xcae4, 0xe0ce, 0xd4af, 0xcfbd, 0xd5b7,
+ /* 98 */ 0xeaa4, 0xd5de, 0xeaa5, 0xd0c1, 0xb9bc, 0xde65, 0xb4c7, 0xb1d9,
+ /* a0 */ 0xde66, 0xde67, 0xde68, 0xc0b1, 0xde69, 0xde6a, 0xde6b, 0xde6c,
+ /* a8 */ 0xb1e6, 0xb1e7, 0xde6d, 0xb1e8, 0xde6e, 0xde6f, 0xde70, 0xde71,
+ /* b0 */ 0xb3bd, 0xc8e8, 0xde72, 0xde73, 0xde74, 0xde75, 0xe5c1, 0xde76,
+ /* b8 */ 0xde77, 0xb1df, 0xde78, 0xde79, 0xde7a, 0xc1c9, 0xb4ef, 0xde7b,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04c83 ***/
+
+ /* 80 */ 0xde7c, 0xc7a8, 0xd3d8, 0xde7d, 0xc6f9, 0xd1b8, 0xde7e, 0xb9fd,
+ /* 88 */ 0xc2f5, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xd3ad, 0xde85,
+ /* 90 */ 0xd4cb, 0xbdfc, 0xde86, 0xe5c2, 0xb7b5, 0xe5c3, 0xde87, 0xde88,
+ /* 98 */ 0xbbb9, 0xd5e2, 0xde89, 0xbdf8, 0xd4b6, 0xcea5, 0xc1ac, 0xb3d9,
+ /* a0 */ 0xde8a, 0xde8b, 0xccf6, 0xde8c, 0xe5c6, 0xe5c4, 0xe5c8, 0xde8d,
+ /* a8 */ 0xe5ca, 0xe5c7, 0xb5cf, 0xc6c8, 0xde8e, 0xb5fc, 0xe5c5, 0xde8f,
+ /* b0 */ 0xcaf6, 0xde90, 0xde91, 0xe5c9, 0xde92, 0xde93, 0xde94, 0xc3d4,
+ /* b8 */ 0xb1c5, 0xbca3, 0xde95, 0xde96, 0xde97, 0xd7b7, 0xde98, 0xde99,
+
+ /*** Three byte table, leaf: e980xx - offset 0x04cc3 ***/
+
+ /* 80 */ 0xcdcb, 0xcbcd, 0xcaca, 0xccd3, 0xe5cc, 0xe5cb, 0xc4e6, 0xde9a,
+ /* 88 */ 0xde9b, 0xd1a1, 0xd1b7, 0xe5cd, 0xde9c, 0xe5d0, 0xde9d, 0xcdb8,
+ /* 90 */ 0xd6f0, 0xe5cf, 0xb5dd, 0xde9e, 0xcdbe, 0xde9f, 0xe5d1, 0xb6ba,
+ /* 98 */ 0xdea0, 0xdf40, 0xcda8, 0xb9e4, 0xdf41, 0xcac5, 0xb3d1, 0xcbd9,
+ /* a0 */ 0xd4ec, 0xe5d2, 0xb7ea, 0xdf42, 0xdf43, 0xdf44, 0xe5ce, 0xdf45,
+ /* a8 */ 0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xe5d5, 0xb4fe, 0xe5d6,
+ /* b0 */ 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xe5d3, 0xe5d4, 0xdf50,
+ /* b8 */ 0xd2dd, 0xdf51, 0xdf52, 0xc2df, 0xb1c6, 0xdf53, 0xd3e2, 0xdf54,
+
+ /*** Three byte table, leaf: e981xx - offset 0x04d03 ***/
+
+ /* 80 */ 0xdf55, 0xb6dd, 0xcbec, 0xdf56, 0xe5d7, 0xdf57, 0xdf58, 0xd3f6,
+ /* 88 */ 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xb1e9, 0xdf5e, 0xb6f4,
+ /* 90 */ 0xe5da, 0xe5d8, 0xe5d9, 0xb5c0, 0xdf5f, 0xdf60, 0xdf61, 0xd2c5,
+ /* 98 */ 0xe5dc, 0xdf62, 0xdf63, 0xe5de, 0xdf64, 0xdf65, 0xdf66, 0xdf67,
+ /* a0 */ 0xdf68, 0xdf69, 0xe5dd, 0xc7b2, 0xdf6a, 0xd2a3, 0xdf6b, 0xdf6c,
+ /* a8 */ 0xe5db, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xd4e2, 0xd5da, 0xdf71,
+ /* b0 */ 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xe5e0, 0xd7f1, 0xdf76, 0xdf77,
+ /* b8 */ 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xe5e1, 0xdf7d, 0xb1dc,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04d43 ***/
+
+ /* 80 */ 0xd1fb, 0xdf7e, 0xe5e2, 0xe5e4, 0xdf80, 0xdf81, 0xdf82, 0xdf83,
+ /* 88 */ 0xe5e3, 0xdf84, 0xdf85, 0xe5e5, 0xdf86, 0xdf87, 0xdf88, 0xdf89,
+ /* 90 */ 0xdf8a, 0xd2d8, 0xdf8b, 0xb5cb, 0xdf8c, 0xe7df, 0xdf8d, 0xdaf5,
+ /* 98 */ 0xdf8e, 0xdaf8, 0xdf8f, 0xdaf6, 0xdf90, 0xdaf7, 0xdf91, 0xdf92,
+ /* a0 */ 0xdf93, 0xdafa, 0xd0cf, 0xc4c7, 0xdf94, 0xdf95, 0xb0ee, 0xdf96,
+ /* a8 */ 0xdf97, 0xdf98, 0xd0b0, 0xdf99, 0xdaf9, 0xdf9a, 0xd3ca, 0xbaaa,
+ /* b0 */ 0xdba2, 0xc7f1, 0xdf9b, 0xdafc, 0xdafb, 0xc9db, 0xdafd, 0xdf9c,
+ /* b8 */ 0xdba1, 0xd7de, 0xdafe, 0xc1da, 0xdf9d, 0xdf9e, 0xdba5, 0xdf9f,
+
+ /*** Three byte table, leaf: e983xx - offset 0x04d83 ***/
+
+ /* 80 */ 0xdfa0, 0xd3f4, 0xe040, 0xe041, 0xdba7, 0xdba4, 0xe042, 0xdba8,
+ /* 88 */ 0xe043, 0xe044, 0xbdbc, 0xe045, 0xe046, 0xe047, 0xc0c9, 0xdba3,
+ /* 90 */ 0xdba6, 0xd6a3, 0xe048, 0xdba9, 0xe049, 0xe04a, 0xe04b, 0xdbad,
+ /* 98 */ 0xe04c, 0xe04d, 0xe04e, 0xdbae, 0xdbac, 0xbac2, 0xe04f, 0xe050,
+ /* a0 */ 0xe051, 0xbfa4, 0xdbab, 0xe052, 0xe053, 0xe054, 0xdbaa, 0xd4c7,
+ /* a8 */ 0xb2bf, 0xe055, 0xe056, 0xdbaf, 0xe057, 0xb9f9, 0xe058, 0xdbb0,
+ /* b0 */ 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xb3bb, 0xe05d, 0xe05e, 0xe05f,
+ /* b8 */ 0xb5a6, 0xe060, 0xe061, 0xe062, 0xe063, 0xb6bc, 0xdbb1, 0xe064,
+
+ /*** Three byte table, leaf: e984xx - offset 0x04dc3 ***/
+
+ /* 80 */ 0xe065, 0xe066, 0xb6f5, 0xe067, 0xdbb2, 0xe068, 0xe069, 0xe06a,
+ /* 88 */ 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072,
+ /* 90 */ 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a,
+ /* 98 */ 0xe07b, 0xb1c9, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xdbb4, 0xe081,
+ /* a0 */ 0xe082, 0xe083, 0xdbb3, 0xdbb5, 0xe084, 0xe085, 0xe086, 0xe087,
+ /* a8 */ 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xdbb7,
+ /* b0 */ 0xe08f, 0xdbb6, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095,
+ /* b8 */ 0xe096, 0xdbb8, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c,
+
+ /*** Three byte table, leaf: e985xx - offset 0x04e03 ***/
+
+ /* 80 */ 0xe09d, 0xe09e, 0xe09f, 0xdbb9, 0xe0a0, 0xe140, 0xdbba, 0xe141,
+ /* 88 */ 0xe142, 0xd3cf, 0xf4fa, 0xc7f5, 0xd7c3, 0xc5e4, 0xf4fc, 0xf4fd,
+ /* 90 */ 0xf4fb, 0xe143, 0xbec6, 0xe144, 0xe145, 0xe146, 0xe147, 0xd0ef,
+ /* 98 */ 0xe148, 0xe149, 0xb7d3, 0xe14a, 0xe14b, 0xd4cd, 0xccaa, 0xe14c,
+ /* a0 */ 0xe14d, 0xf5a2, 0xf5a1, 0xbaa8, 0xf4fe, 0xcbd6, 0xe14e, 0xe14f,
+ /* a8 */ 0xe150, 0xf5a4, 0xc0d2, 0xe151, 0xb3ea, 0xe152, 0xcdaa, 0xf5a5,
+ /* b0 */ 0xf5a3, 0xbdb4, 0xf5a8, 0xe153, 0xf5a9, 0xbdcd, 0xc3b8, 0xbfe1,
+ /* b8 */ 0xcbe1, 0xf5aa, 0xe154, 0xe155, 0xe156, 0xf5a6, 0xf5a7, 0xc4f0,
+
+ /*** Three byte table, leaf: e986xx - offset 0x04e43 ***/
+
+ /* 80 */ 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xf5ac, 0xe15c, 0xb4bc,
+ /* 88 */ 0xe15d, 0xd7ed, 0xe15e, 0xb4d7, 0xf5ab, 0xf5ae, 0xe15f, 0xe160,
+ /* 90 */ 0xf5ad, 0xf5af, 0xd0d1, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165,
+ /* 98 */ 0xe166, 0xe167, 0xc3d1, 0xc8a9, 0xe168, 0xe169, 0xe16a, 0xe16b,
+ /* a0 */ 0xe16c, 0xe16d, 0xf5b0, 0xf5b1, 0xe16e, 0xe16f, 0xe170, 0xe171,
+ /* a8 */ 0xe172, 0xe173, 0xf5b2, 0xe174, 0xe175, 0xf5b3, 0xf5b4, 0xf5b5,
+ /* b0 */ 0xe176, 0xe177, 0xe178, 0xe179, 0xf5b7, 0xf5b6, 0xe17a, 0xe17b,
+ /* b8 */ 0xe17c, 0xe17d, 0xf5b8, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04e83 ***/
+
+ /* 80 */ 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xb2c9,
+ /* 88 */ 0xe18b, 0xd3d4, 0xcacd, 0xe18c, 0xc0ef, 0xd6d8, 0xd2b0, 0xc1bf,
+ /* 90 */ 0xe18d, 0xbdf0, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193,
+ /* 98 */ 0xe194, 0xe195, 0xe196, 0xe197, 0xb8aa, 0xe198, 0xe199, 0xe19a,
+ /* a0 */ 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241,
+ /* a8 */ 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249,
+ /* b0 */ 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251,
+ /* b8 */ 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259,
+
+ /*** Three byte table, leaf: e988xx - offset 0x04ec3 ***/
+
+ /* 80 */ 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261,
+ /* 88 */ 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269,
+ /* 90 */ 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271,
+ /* 98 */ 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279,
+ /* a0 */ 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282,
+ /* a8 */ 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a,
+ /* b0 */ 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292,
+ /* b8 */ 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04f03 ***/
+
+ /* 80 */ 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341,
+ /* 88 */ 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349,
+ /* 90 */ 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351,
+ /* 98 */ 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359,
+ /* a0 */ 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361,
+ /* a8 */ 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369,
+ /* b0 */ 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xbcf8, 0xe36e, 0xe36f, 0xe370,
+ /* b8 */ 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04f43 ***/
+
+ /* 80 */ 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381,
+ /* 88 */ 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xf6c6, 0xe388,
+ /* 90 */ 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390,
+ /* 98 */ 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398,
+ /* a0 */ 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0,
+ /* a8 */ 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xf6c7, 0xe446,
+ /* b0 */ 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e,
+ /* b8 */ 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04f83 ***/
+
+ /* 80 */ 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e,
+ /* 88 */ 0xf6c8, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465,
+ /* 90 */ 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d,
+ /* 98 */ 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475,
+ /* a0 */ 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d,
+ /* a8 */ 0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486,
+ /* b0 */ 0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e,
+ /* b8 */ 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04fc3 ***/
+
+ /* 80 */ 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e,
+ /* 88 */ 0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545,
+ /* 90 */ 0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d,
+ /* 98 */ 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555,
+ /* a0 */ 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d,
+ /* a8 */ 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565,
+ /* b0 */ 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d,
+ /* b8 */ 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xf6c9, 0xe574,
+
+ /*** Three byte table, leaf: e98dxx - offset 0x05003 ***/
+
+ /* 80 */ 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c,
+ /* 88 */ 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585,
+ /* 90 */ 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d,
+ /* 98 */ 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595,
+ /* a0 */ 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d,
+ /* a8 */ 0xe59e, 0xe59f, 0xf6ca, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643,
+ /* b0 */ 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b,
+ /* b8 */ 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653,
+
+ /*** Three byte table, leaf: e98exx - offset 0x05043 ***/
+
+ /* 80 */ 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b,
+ /* 88 */ 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xf6cc,
+ /* 90 */ 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a,
+ /* 98 */ 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672,
+ /* a0 */ 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a,
+ /* a8 */ 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683,
+ /* b0 */ 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b,
+ /* b8 */ 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693,
+
+ /*** Three byte table, leaf: e98fxx - offset 0x05083 ***/
+
+ /* 80 */ 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b,
+ /* 88 */ 0xe69c, 0xe69d, 0xf6cb, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741,
+ /* 90 */ 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xf7e9, 0xe748,
+ /* 98 */ 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750,
+ /* a0 */ 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758,
+ /* a8 */ 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760,
+ /* b0 */ 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768,
+ /* b8 */ 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770,
+
+ /*** Three byte table, leaf: e990xx - offset 0x050c3 ***/
+
+ /* 80 */ 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778,
+ /* 88 */ 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781,
+ /* 90 */ 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789,
+ /* 98 */ 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791,
+ /* a0 */ 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799,
+ /* a8 */ 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840,
+ /* b0 */ 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848,
+ /* b8 */ 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xf6cd, 0xe84f,
+
+ /*** Three byte table, leaf: e991xx - offset 0x05103 ***/
+
+ /* 80 */ 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857,
+ /* 88 */ 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f,
+ /* 90 */ 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867,
+ /* 98 */ 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f,
+ /* a0 */ 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877,
+ /* a8 */ 0xe878, 0xe879, 0xe87a, 0xf6ce, 0xe87b, 0xe87c, 0xe87d, 0xe87e,
+ /* b0 */ 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887,
+ /* b8 */ 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f,
+
+ /*** Three byte table, leaf: e992xx - offset 0x05143 ***/
+
+ /* 80 */ 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xeec4, 0xeec5, 0xeec6,
+ /* 88 */ 0xd5eb, 0xb6a4, 0xeec8, 0xeec7, 0xeec9, 0xeeca, 0xc7a5, 0xeecb,
+ /* 90 */ 0xeecc, 0xe895, 0xb7b0, 0xb5f6, 0xeecd, 0xeecf, 0xe896, 0xeece,
+ /* 98 */ 0xe897, 0xb8c6, 0xeed0, 0xeed1, 0xeed2, 0xb6db, 0xb3ae, 0xd6d3,
+ /* a0 */ 0xc4c6, 0xb1b5, 0xb8d6, 0xeed3, 0xeed4, 0xd4bf, 0xc7d5, 0xbefb,
+ /* a8 */ 0xced9, 0xb9b3, 0xeed6, 0xeed5, 0xeed8, 0xeed7, 0xc5a5, 0xeed9,
+ /* b0 */ 0xeeda, 0xc7ae, 0xeedb, 0xc7af, 0xeedc, 0xb2a7, 0xeedd, 0xeede,
+ /* b8 */ 0xeedf, 0xeee0, 0xeee1, 0xd7ea, 0xeee2, 0xeee3, 0xbcd8, 0xeee4,
+
+ /*** Three byte table, leaf: e993xx - offset 0x05183 ***/
+
+ /* 80 */ 0xd3cb, 0xccfa, 0xb2ac, 0xc1e5, 0xeee5, 0xc7a6, 0xc3ad, 0xe898,
+ /* 88 */ 0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xe899,
+ /* 90 */ 0xeeed, 0xeeee, 0xeeef, 0xe89a, 0xe89b, 0xeef0, 0xeef1, 0xeef2,
+ /* 98 */ 0xeef4, 0xeef3, 0xe89c, 0xeef5, 0xcdad, 0xc2c1, 0xeef6, 0xeef7,
+ /* a0 */ 0xeef8, 0xd5a1, 0xeef9, 0xcfb3, 0xeefa, 0xeefb, 0xe89d, 0xeefc,
+ /* a8 */ 0xeefd, 0xefa1, 0xeefe, 0xefa2, 0xb8f5, 0xc3fa, 0xefa3, 0xefa4,
+ /* b0 */ 0xbdc2, 0xd2bf, 0xb2f9, 0xefa5, 0xefa6, 0xefa7, 0xd2f8, 0xefa8,
+ /* b8 */ 0xd6fd, 0xefa9, 0xc6cc, 0xe89e, 0xefaa, 0xefab, 0xc1b4, 0xefac,
+
+ /*** Three byte table, leaf: e994xx - offset 0x051c3 ***/
+
+ /* 80 */ 0xcffa, 0xcbf8, 0xefae, 0xefad, 0xb3fa, 0xb9f8, 0xefaf, 0xefb0,
+ /* 88 */ 0xd0e2, 0xefb1, 0xefb2, 0xb7e6, 0xd0bf, 0xefb3, 0xefb4, 0xefb5,
+ /* 90 */ 0xc8f1, 0xcce0, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xd5e0,
+ /* 98 */ 0xefbb, 0xb4ed, 0xc3aa, 0xefbc, 0xe89f, 0xefbd, 0xefbe, 0xefbf,
+ /* a0 */ 0xe8a0, 0xcefd, 0xefc0, 0xc2e0, 0xb4b8, 0xd7b6, 0xbdf5, 0xe940,
+ /* a8 */ 0xcfc7, 0xefc3, 0xefc1, 0xefc2, 0xefc4, 0xb6a7, 0xbcfc, 0xbee2,
+ /* b0 */ 0xc3cc, 0xefc5, 0xefc6, 0xe941, 0xefc7, 0xefcf, 0xefc8, 0xefc9,
+ /* b8 */ 0xefca, 0xc7c2, 0xeff1, 0xb6cd, 0xefcb, 0xe942, 0xefcc, 0xefcd,
+
+ /*** Three byte table, leaf: e995xx - offset 0x05203 ***/
+
+ /* 80 */ 0xb6c6, 0xc3be, 0xefce, 0xe943, 0xefd0, 0xefd1, 0xefd2, 0xd5f2,
+ /* 88 */ 0xe944, 0xefd3, 0xc4f7, 0xe945, 0xefd4, 0xc4f8, 0xefd5, 0xefd6,
+ /* 90 */ 0xb8e4, 0xb0f7, 0xefd7, 0xefd8, 0xefd9, 0xe946, 0xefda, 0xefdb,
+ /* 98 */ 0xefdc, 0xefdd, 0xe947, 0xefde, 0xbeb5, 0xefe1, 0xefdf, 0xefe0,
+ /* a0 */ 0xe948, 0xefe2, 0xefe3, 0xc1cd, 0xefe4, 0xefe5, 0xefe6, 0xefe7,
+ /* a8 */ 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xc0d8, 0xe949, 0xefed,
+ /* b0 */ 0xc1ad, 0xefee, 0xefef, 0xeff0, 0xe94a, 0xe94b, 0xcfe2, 0xe94c,
+ /* b8 */ 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xb3a4,
+
+ /*** Three byte table, leaf: e996xx - offset 0x05243 ***/
+
+ /* 80 */ 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b,
+ /* 88 */ 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963,
+ /* 90 */ 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b,
+ /* 98 */ 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973,
+ /* a0 */ 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b,
+ /* a8 */ 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984,
+ /* b0 */ 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c,
+ /* b8 */ 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994,
+
+ /*** Three byte table, leaf: e997xx - offset 0x05283 ***/
+
+ /* 80 */ 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c,
+ /* 88 */ 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43,
+ /* 90 */ 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b,
+ /* 98 */ 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53,
+ /* a0 */ 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b,
+ /* a8 */ 0xc3c5, 0xe3c5, 0xc9c1, 0xe3c6, 0xea5c, 0xb1d5, 0xceca, 0xb4b3,
+ /* b0 */ 0xc8f2, 0xe3c7, 0xcfd0, 0xe3c8, 0xbce4, 0xe3c9, 0xe3ca, 0xc3c6,
+ /* b8 */ 0xd5a2, 0xc4d6, 0xb9eb, 0xcec5, 0xe3cb, 0xc3f6, 0xe3cc, 0xea5d,
+
+ /*** Three byte table, leaf: e998xx - offset 0x052c3 ***/
+
+ /* 80 */ 0xb7a7, 0xb8f3, 0xbad2, 0xe3cd, 0xe3ce, 0xd4c4, 0xe3cf, 0xea5e,
+ /* 88 */ 0xe3d0, 0xd1cb, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xd1d6, 0xe3d5,
+ /* 90 */ 0xb2fb, 0xc0bb, 0xe3d6, 0xea5f, 0xc0ab, 0xe3d7, 0xe3d8, 0xe3d9,
+ /* 98 */ 0xea60, 0xe3da, 0xe3db, 0xea61, 0xb8b7, 0xdae2, 0xea62, 0xb6d3,
+ /* a0 */ 0xea63, 0xdae4, 0xdae3, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68,
+ /* a8 */ 0xea69, 0xea6a, 0xdae6, 0xea6b, 0xea6c, 0xea6d, 0xc8ee, 0xea6e,
+ /* b0 */ 0xea6f, 0xdae5, 0xb7c0, 0xd1f4, 0xd2f5, 0xd5f3, 0xbdd7, 0xea70,
+ /* b8 */ 0xea71, 0xea72, 0xea73, 0xd7e8, 0xdae8, 0xdae7, 0xea74, 0xb0a2,
+
+ /*** Three byte table, leaf: e999xx - offset 0x05303 ***/
+
+ /* 80 */ 0xcdd3, 0xea75, 0xdae9, 0xea76, 0xb8bd, 0xbcca, 0xc2bd, 0xc2a4,
+ /* 88 */ 0xb3c2, 0xdaea, 0xea77, 0xc2aa, 0xc4b0, 0xbdb5, 0xea78, 0xea79,
+ /* 90 */ 0xcfde, 0xea7a, 0xea7b, 0xea7c, 0xdaeb, 0xc9c2, 0xea7d, 0xea7e,
+ /* 98 */ 0xea80, 0xea81, 0xea82, 0xb1dd, 0xea83, 0xea84, 0xea85, 0xdaec,
+ /* a0 */ 0xea86, 0xb6b8, 0xd4ba, 0xea87, 0xb3fd, 0xea88, 0xea89, 0xdaed,
+ /* a8 */ 0xd4c9, 0xcfd5, 0xc5e3, 0xea8a, 0xdaee, 0xea8b, 0xea8c, 0xea8d,
+ /* b0 */ 0xea8e, 0xea8f, 0xdaef, 0xea90, 0xdaf0, 0xc1ea, 0xccd5, 0xcfdd,
+ /* b8 */ 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98,
+
+ /*** Three byte table, leaf: e99axx - offset 0x05343 ***/
+
+ /* 80 */ 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xd3e7, 0xc2a1, 0xea9e,
+ /* 88 */ 0xdaf1, 0xea9f, 0xeaa0, 0xcbe5, 0xeb40, 0xdaf2, 0xeb41, 0xcbe6,
+ /* 90 */ 0xd2fe, 0xeb42, 0xeb43, 0xeb44, 0xb8f4, 0xeb45, 0xeb46, 0xdaf3,
+ /* 98 */ 0xb0af, 0xcfb6, 0xeb47, 0xeb48, 0xd5cf, 0xeb49, 0xeb4a, 0xeb4b,
+ /* a0 */ 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xcbed,
+ /* a8 */ 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a,
+ /* b0 */ 0xdaf4, 0xeb5b, 0xeb5c, 0xe3c4, 0xeb5d, 0xeb5e, 0xc1a5, 0xeb5f,
+ /* b8 */ 0xeb60, 0xf6bf, 0xeb61, 0xeb62, 0xf6c0, 0xf6c1, 0xc4d1, 0xeb63,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x05383 ***/
+
+ /* 80 */ 0xc8b8, 0xd1e3, 0xeb64, 0xeb65, 0xd0db, 0xd1c5, 0xbcaf, 0xb9cd,
+ /* 88 */ 0xeb66, 0xeff4, 0xeb67, 0xeb68, 0xb4c6, 0xd3ba, 0xf6c2, 0xb3fb,
+ /* 90 */ 0xeb69, 0xeb6a, 0xf6c3, 0xeb6b, 0xeb6c, 0xb5f1, 0xeb6d, 0xeb6e,
+ /* 98 */ 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76,
+ /* a0 */ 0xf6c5, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d,
+ /* a8 */ 0xd3ea, 0xf6a7, 0xd1a9, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xf6a9,
+ /* b0 */ 0xeb83, 0xeb84, 0xeb85, 0xf6a8, 0xeb86, 0xeb87, 0xc1e3, 0xc0d7,
+ /* b8 */ 0xeb88, 0xb1a2, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xceed, 0xeb8d,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x053c3 ***/
+
+ /* 80 */ 0xd0e8, 0xf6ab, 0xeb8e, 0xeb8f, 0xcff6, 0xeb90, 0xf6aa, 0xd5f0,
+ /* 88 */ 0xf6ac, 0xc3b9, 0xeb91, 0xeb92, 0xeb93, 0xbbf4, 0xf6ae, 0xf6ad,
+ /* 90 */ 0xeb94, 0xeb95, 0xeb96, 0xc4de, 0xeb97, 0xeb98, 0xc1d8, 0xeb99,
+ /* 98 */ 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xcbaa, 0xeb9e, 0xcfbc, 0xeb9f,
+ /* a0 */ 0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46,
+ /* a8 */ 0xec47, 0xec48, 0xf6af, 0xec49, 0xec4a, 0xf6b0, 0xec4b, 0xec4c,
+ /* b0 */ 0xf6b1, 0xec4d, 0xc2b6, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52,
+ /* b8 */ 0xb0d4, 0xc5f9, 0xec53, 0xec54, 0xec55, 0xec56, 0xf6b2, 0xec57,
+
+ /*** Three byte table, leaf: e99dxx - offset 0x05403 ***/
+
+ /* 80 */ 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f,
+ /* 88 */ 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67,
+ /* 90 */ 0xec68, 0xec69, 0xc7e0, 0xf6a6, 0xec6a, 0xec6b, 0xbeb8, 0xec6c,
+ /* 98 */ 0xec6d, 0xbeb2, 0xec6e, 0xb5e5, 0xec6f, 0xec70, 0xb7c7, 0xec71,
+ /* a0 */ 0xbfbf, 0xc3d2, 0xc3e6, 0xec72, 0xec73, 0xd8cc, 0xec74, 0xec75,
+ /* a8 */ 0xec76, 0xb8ef, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c,
+ /* b0 */ 0xec7d, 0xec7e, 0xec80, 0xbdf9, 0xd1a5, 0xec81, 0xb0d0, 0xec82,
+ /* b8 */ 0xec83, 0xec84, 0xec85, 0xec86, 0xf7b0, 0xec87, 0xec88, 0xec89,
+
+ /*** Three byte table, leaf: e99exx - offset 0x05443 ***/
+
+ /* 80 */ 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xf7b1, 0xec8f, 0xec90,
+ /* 88 */ 0xec91, 0xec92, 0xec93, 0xd0ac, 0xec94, 0xb0b0, 0xec95, 0xec96,
+ /* 90 */ 0xec97, 0xf7b2, 0xf7b3, 0xec98, 0xf7b4, 0xec99, 0xec9a, 0xec9b,
+ /* 98 */ 0xc7ca, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41,
+ /* a0 */ 0xbecf, 0xed42, 0xed43, 0xf7b7, 0xed44, 0xed45, 0xed46, 0xed47,
+ /* a8 */ 0xed48, 0xed49, 0xed4a, 0xf7b6, 0xed4b, 0xb1de, 0xed4c, 0xf7b5,
+ /* b0 */ 0xed4d, 0xed4e, 0xf7b8, 0xed4f, 0xf7b9, 0xed50, 0xed51, 0xed52,
+ /* b8 */ 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a,
+
+ /*** Three byte table, leaf: e99fxx - offset 0x05483 ***/
+
+ /* 80 */ 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62,
+ /* 88 */ 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a,
+ /* 90 */ 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72,
+ /* 98 */ 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a,
+ /* a0 */ 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xcea4, 0xc8cd,
+ /* a8 */ 0xed82, 0xbaab, 0xe8b8, 0xe8b9, 0xe8ba, 0xbec2, 0xed83, 0xed84,
+ /* b0 */ 0xed85, 0xed86, 0xed87, 0xd2f4, 0xed88, 0xd4cf, 0xc9d8, 0xed89,
+ /* b8 */ 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x054c3 ***/
+
+ /* 80 */ 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99,
+ /* 88 */ 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40,
+ /* 90 */ 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48,
+ /* 98 */ 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50,
+ /* a0 */ 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58,
+ /* a8 */ 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60,
+ /* b0 */ 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68,
+ /* b8 */ 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70,
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x05503 ***/
+
+ /* 80 */ 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78,
+ /* 88 */ 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81,
+ /* 90 */ 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89,
+ /* 98 */ 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91,
+ /* a0 */ 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99,
+ /* a8 */ 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40,
+ /* b0 */ 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xd2b3, 0xb6a5, 0xc7ea,
+ /* b8 */ 0xf1fc, 0xcfee, 0xcbb3, 0xd0eb, 0xe7ef, 0xcde7, 0xb9cb, 0xb6d9,
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05543 ***/
+
+ /* 80 */ 0xf1fd, 0xb0e4, 0xcbcc, 0xf1fe, 0xd4a4, 0xc2ad, 0xc1ec, 0xc6c4,
+ /* 88 */ 0xbeb1, 0xf2a1, 0xbcd5, 0xef46, 0xf2a2, 0xf2a3, 0xef47, 0xf2a4,
+ /* 90 */ 0xd2c3, 0xc6b5, 0xef48, 0xcdc7, 0xf2a5, 0xef49, 0xd3b1, 0xbfc5,
+ /* 98 */ 0xcce2, 0xef4a, 0xf2a6, 0xf2a7, 0xd1d5, 0xb6ee, 0xf2a8, 0xf2a9,
+ /* a0 */ 0xb5df, 0xf2aa, 0xf2ab, 0xef4b, 0xb2fc, 0xf2ac, 0xf2ad, 0xc8a7,
+ /* a8 */ 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53,
+ /* b0 */ 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b,
+ /* b8 */ 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05583 ***/
+
+ /* 80 */ 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b,
+ /* 88 */ 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xb7e7, 0xef72,
+ /* 90 */ 0xef73, 0xeca9, 0xecaa, 0xecab, 0xef74, 0xecac, 0xef75, 0xef76,
+ /* 98 */ 0xc6ae, 0xecad, 0xecae, 0xef77, 0xef78, 0xef79, 0xb7c9, 0xcab3,
+ /* a0 */ 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xe2b8,
+ /* a8 */ 0xf7cf, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88,
+ /* b0 */ 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90,
+ /* b8 */ 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98,
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x055c3 ***/
+
+ /* 80 */ 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0,
+ /* 88 */ 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf7d0, 0xf045, 0xf046,
+ /* 90 */ 0xb2cd, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d,
+ /* 98 */ 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055,
+ /* a0 */ 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d,
+ /* a8 */ 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf7d1, 0xf064,
+ /* b0 */ 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c,
+ /* b8 */ 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x05603 ***/
+
+ /* 80 */ 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c,
+ /* 88 */ 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085,
+ /* 90 */ 0xf086, 0xf087, 0xf088, 0xf089, 0xf7d3, 0xf7d2, 0xf08a, 0xf08b,
+ /* 98 */ 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093,
+ /* a0 */ 0xf094, 0xf095, 0xf096, 0xe2bb, 0xf097, 0xbca2, 0xf098, 0xe2bc,
+ /* a8 */ 0xe2bd, 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xb7b9, 0xd2fb, 0xbda4,
+ /* b0 */ 0xcace, 0xb1a5, 0xcbc7, 0xf099, 0xe2c2, 0xb6fc, 0xc8c4, 0xe2c3,
+ /* b8 */ 0xf09a, 0xf09b, 0xbdc8, 0xf09c, 0xb1fd, 0xe2c4, 0xf09d, 0xb6f6,
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x05643 ***/
+
+ /* 80 */ 0xe2c5, 0xc4d9, 0xf09e, 0xf09f, 0xe2c6, 0xcfda, 0xb9dd, 0xe2c7,
+ /* 88 */ 0xc0a1, 0xf0a0, 0xe2c8, 0xb2f6, 0xf140, 0xe2c9, 0xf141, 0xc1f3,
+ /* 90 */ 0xe2ca, 0xe2cb, 0xc2f8, 0xe2cc, 0xe2cd, 0xe2ce, 0xcad7, 0xd8b8,
+ /* 98 */ 0xd9e5, 0xcfe3, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147,
+ /* a0 */ 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf0a5, 0xf14d, 0xf14e,
+ /* a8 */ 0xdcb0, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155,
+ /* b0 */ 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d,
+ /* b8 */ 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x05683 ***/
+
+ /* 80 */ 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d,
+ /* 88 */ 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175,
+ /* 90 */ 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d,
+ /* 98 */ 0xf17e, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186,
+ /* a0 */ 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e,
+ /* a8 */ 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196,
+ /* b0 */ 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e,
+ /* b8 */ 0xf19f, 0xf1a0, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x056c3 ***/
+
+ /* 80 */ 0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d,
+ /* 88 */ 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255,
+ /* 90 */ 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d,
+ /* 98 */ 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265,
+ /* a0 */ 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d,
+ /* a8 */ 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275,
+ /* b0 */ 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d,
+ /* b8 */ 0xf27e, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x05703 ***/
+
+ /* 80 */ 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e,
+ /* 88 */ 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296,
+ /* 90 */ 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e,
+ /* 98 */ 0xf29f, 0xf2a0, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345,
+ /* a0 */ 0xf346, 0xf347, 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d,
+ /* a8 */ 0xf34e, 0xf34f, 0xf350, 0xf351, 0xc2ed, 0xd4a6, 0xcdd4, 0xd1b1,
+ /* b0 */ 0xb3db, 0xc7fd, 0xf352, 0xb2b5, 0xc2bf, 0xe6e0, 0xcabb, 0xe6e1,
+ /* b8 */ 0xe6e2, 0xbed4, 0xe6e3, 0xd7a4, 0xcdd5, 0xe6e5, 0xbcdd, 0xe6e4,
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x05743 ***/
+
+ /* 80 */ 0xe6e6, 0xe6e7, 0xc2ee, 0xf353, 0xbdbe, 0xe6e8, 0xc2e6, 0xbaa7,
+ /* 88 */ 0xe6e9, 0xf354, 0xe6ea, 0xb3d2, 0xd1e9, 0xf355, 0xf356, 0xbfa5,
+ /* 90 */ 0xe6eb, 0xc6ef, 0xe6ec, 0xe6ed, 0xf357, 0xf358, 0xe6ee, 0xc6ad,
+ /* 98 */ 0xe6ef, 0xf359, 0xc9a7, 0xe6f0, 0xe6f1, 0xe6f2, 0xe5b9, 0xe6f3,
+ /* a0 */ 0xe6f4, 0xc2e2, 0xe6f5, 0xe6f6, 0xd6e8, 0xe6f7, 0xf35a, 0xe6f8,
+ /* a8 */ 0xb9c7, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361,
+ /* b0 */ 0xf7bb, 0xf7ba, 0xf362, 0xf363, 0xf364, 0xf365, 0xf7be, 0xf7bc,
+ /* b8 */ 0xbaa1, 0xf366, 0xf7bf, 0xf367, 0xf7c0, 0xf368, 0xf369, 0xf36a,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x05783 ***/
+
+ /* 80 */ 0xf7c2, 0xf7c1, 0xf7c4, 0xf36b, 0xf36c, 0xf7c3, 0xf36d, 0xf36e,
+ /* 88 */ 0xf36f, 0xf370, 0xf371, 0xf7c5, 0xf7c6, 0xf372, 0xf373, 0xf374,
+ /* 90 */ 0xf375, 0xf7c7, 0xf376, 0xcbe8, 0xf377, 0xf378, 0xf379, 0xf37a,
+ /* 98 */ 0xb8df, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf7d4,
+ /* a0 */ 0xf382, 0xf7d5, 0xf383, 0xf384, 0xf385, 0xf386, 0xf7d6, 0xf387,
+ /* a8 */ 0xf388, 0xf389, 0xf38a, 0xf7d8, 0xf38b, 0xf7da, 0xf38c, 0xf7d7,
+ /* b0 */ 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394,
+ /* b8 */ 0xf395, 0xf7db, 0xf396, 0xf7d9, 0xf397, 0xf398, 0xf399, 0xf39a,
+
+ /*** Three byte table, leaf: e9acxx - offset 0x057c3 ***/
+
+ /* 80 */ 0xf39b, 0xf39c, 0xf39d, 0xd7d7, 0xf39e, 0xf39f, 0xf3a0, 0xf440,
+ /* 88 */ 0xf7dc, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf7dd,
+ /* 90 */ 0xf447, 0xf448, 0xf449, 0xf7de, 0xf44a, 0xf44b, 0xf44c, 0xf44d,
+ /* 98 */ 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf7df,
+ /* a0 */ 0xf455, 0xf456, 0xf457, 0xf7e0, 0xf458, 0xf459, 0xf45a, 0xf45b,
+ /* a8 */ 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xdbcb,
+ /* b0 */ 0xf463, 0xf464, 0xd8aa, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469,
+ /* b8 */ 0xf46a, 0xf46b, 0xf46c, 0xe5f7, 0xb9ed, 0xf46d, 0xf46e, 0xf46f,
+
+ /*** Three byte table, leaf: e9adxx - offset 0x05803 ***/
+
+ /* 80 */ 0xf470, 0xbffd, 0xbbea, 0xf7c9, 0xc6c7, 0xf7c8, 0xf471, 0xf7ca,
+ /* 88 */ 0xf7cc, 0xf7cb, 0xf472, 0xf473, 0xf474, 0xf7cd, 0xf475, 0xceba,
+ /* 90 */ 0xf476, 0xf7ce, 0xf477, 0xf478, 0xc4a7, 0xf479, 0xf47a, 0xf47b,
+ /* 98 */ 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484,
+ /* a0 */ 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c,
+ /* a8 */ 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494,
+ /* b0 */ 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c,
+ /* b8 */ 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543,
+
+ /*** Three byte table, leaf: e9aexx - offset 0x05843 ***/
+
+ /* 80 */ 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b,
+ /* 88 */ 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553,
+ /* 90 */ 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b,
+ /* 98 */ 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563,
+ /* a0 */ 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b,
+ /* a8 */ 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573,
+ /* b0 */ 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b,
+ /* b8 */ 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x05883 ***/
+
+ /* 80 */ 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c,
+ /* 88 */ 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594,
+ /* 90 */ 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c,
+ /* 98 */ 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643,
+ /* a0 */ 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b,
+ /* a8 */ 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653,
+ /* b0 */ 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b,
+ /* b8 */ 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x058c3 ***/
+
+ /* 80 */ 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b,
+ /* 88 */ 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673,
+ /* 90 */ 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b,
+ /* 98 */ 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684,
+ /* a0 */ 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c,
+ /* a8 */ 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694,
+ /* b0 */ 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c,
+ /* b8 */ 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743,
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x05903 ***/
+
+ /* 80 */ 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b,
+ /* 88 */ 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753,
+ /* 90 */ 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b,
+ /* 98 */ 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763,
+ /* a0 */ 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b,
+ /* a8 */ 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773,
+ /* b0 */ 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b,
+ /* b8 */ 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xd3e3, 0xf781, 0xf782, 0xf6cf,
+
+ /*** Three byte table, leaf: e9b2xx - offset 0x05943 ***/
+
+ /* 80 */ 0xf783, 0xc2b3, 0xf6d0, 0xf784, 0xf785, 0xf6d1, 0xf6d2, 0xf6d3,
+ /* 88 */ 0xf6d4, 0xf786, 0xf787, 0xf6d6, 0xf788, 0xb1ab, 0xf6d7, 0xf789,
+ /* 90 */ 0xf6d8, 0xf6d9, 0xf6da, 0xf78a, 0xf6db, 0xf6dc, 0xf78b, 0xf78c,
+ /* 98 */ 0xf78d, 0xf78e, 0xf6dd, 0xf6de, 0xcfca, 0xf78f, 0xf6df, 0xf6e0,
+ /* a0 */ 0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xc0f0, 0xf6e5, 0xf6e6, 0xf6e7,
+ /* a8 */ 0xf6e8, 0xf6e9, 0xf790, 0xf6ea, 0xf791, 0xf6eb, 0xf6ec, 0xf792,
+ /* b0 */ 0xf6ed, 0xf6ee, 0xf6ef, 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4,
+ /* b8 */ 0xbea8, 0xf793, 0xf6f5, 0xf6f6, 0xf6f7, 0xf6f8, 0xf794, 0xf795,
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x05983 ***/
+
+ /* 80 */ 0xf796, 0xf797, 0xf798, 0xc8fa, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc,
+ /* 88 */ 0xf799, 0xf79a, 0xf6fd, 0xf6fe, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4,
+ /* 90 */ 0xf7a5, 0xf79b, 0xf79c, 0xf7a6, 0xf7a7, 0xf7a8, 0xb1ee, 0xf7a9,
+ /* 98 */ 0xf7aa, 0xf7ab, 0xf79d, 0xf79e, 0xf7ac, 0xf7ad, 0xc1db, 0xf7ae,
+ /* a0 */ 0xf79f, 0xf7a0, 0xf7af, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844,
+ /* a8 */ 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c,
+ /* b0 */ 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854,
+ /* b8 */ 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c,
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x059c3 ***/
+
+ /* 80 */ 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864,
+ /* 88 */ 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c,
+ /* 90 */ 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874,
+ /* 98 */ 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c,
+ /* a0 */ 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885,
+ /* a8 */ 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d,
+ /* b0 */ 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895,
+ /* b8 */ 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x05a03 ***/
+
+ /* 80 */ 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944,
+ /* 88 */ 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c,
+ /* 90 */ 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954,
+ /* 98 */ 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c,
+ /* a0 */ 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964,
+ /* a8 */ 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c,
+ /* b0 */ 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974,
+ /* b8 */ 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c,
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x05a43 ***/
+
+ /* 80 */ 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985,
+ /* 88 */ 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d,
+ /* 90 */ 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995,
+ /* 98 */ 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d,
+ /* a0 */ 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44,
+ /* a8 */ 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c,
+ /* b0 */ 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54,
+ /* b8 */ 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x05a83 ***/
+
+ /* 80 */ 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64,
+ /* 88 */ 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c,
+ /* 90 */ 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74,
+ /* 98 */ 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c,
+ /* a0 */ 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85,
+ /* a8 */ 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d,
+ /* b0 */ 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95,
+ /* b8 */ 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d,
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x05ac3 ***/
+
+ /* 80 */ 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44,
+ /* 88 */ 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c,
+ /* 90 */ 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54,
+ /* 98 */ 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xc4f1,
+ /* a0 */ 0xf0af, 0xbca6, 0xf0b0, 0xc3f9, 0xfb5c, 0xc5b8, 0xd1bb, 0xfb5d,
+ /* a8 */ 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xd1bc, 0xfb5e, 0xd1ec,
+ /* b0 */ 0xfb5f, 0xf0b7, 0xf0b6, 0xd4a7, 0xfb60, 0xcdd2, 0xf0b8, 0xf0ba,
+ /* b8 */ 0xf0b9, 0xf0bb, 0xf0bc, 0xfb61, 0xfb62, 0xb8eb, 0xf0bd, 0xbae8,
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x05b03 ***/
+
+ /* 80 */ 0xfb63, 0xf0be, 0xf0bf, 0xbee9, 0xf0c0, 0xb6ec, 0xf0c1, 0xf0c2,
+ /* 88 */ 0xf0c3, 0xf0c4, 0xc8b5, 0xf0c5, 0xf0c6, 0xfb64, 0xf0c7, 0xc5f4,
+ /* 90 */ 0xfb65, 0xf0c8, 0xfb66, 0xfb67, 0xfb68, 0xf0c9, 0xfb69, 0xf0ca,
+ /* 98 */ 0xf7bd, 0xfb6a, 0xf0cb, 0xf0cc, 0xf0cd, 0xfb6b, 0xf0ce, 0xfb6c,
+ /* a0 */ 0xfb6d, 0xfb6e, 0xfb6f, 0xf0cf, 0xbad7, 0xfb70, 0xf0d0, 0xf0d1,
+ /* a8 */ 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d8, 0xfb71, 0xfb72,
+ /* b0 */ 0xd3a5, 0xf0d7, 0xfb73, 0xf0d9, 0xfb74, 0xfb75, 0xfb76, 0xfb77,
+ /* b8 */ 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xf5ba, 0xc2b9,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x05b43 ***/
+
+ /* 80 */ 0xfb7e, 0xfb80, 0xf7e4, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xf7e5,
+ /* 88 */ 0xf7e6, 0xfb85, 0xfb86, 0xf7e7, 0xfb87, 0xfb88, 0xfb89, 0xfb8a,
+ /* 90 */ 0xfb8b, 0xfb8c, 0xf7e8, 0xc2b4, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90,
+ /* 98 */ 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xf7ea, 0xfb96, 0xf7eb,
+ /* a0 */ 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xc2f3, 0xfb9d,
+ /* a8 */ 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44,
+ /* b0 */ 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xf4f0, 0xfc49, 0xfc4a, 0xfc4b,
+ /* b8 */ 0xf4ef, 0xfc4c, 0xfc4d, 0xc2e9, 0xfc4e, 0xf7e1, 0xf7e2, 0xfc4f,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x05b83 ***/
+
+ /* 80 */ 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xbbc6, 0xfc54, 0xfc55, 0xfc56,
+ /* 88 */ 0xfc57, 0xd9e4, 0xfc58, 0xfc59, 0xfc5a, 0xcaf2, 0xc0e8, 0xf0a4,
+ /* 90 */ 0xfc5b, 0xbada, 0xfc5c, 0xfc5d, 0xc7ad, 0xfc5e, 0xfc5f, 0xfc60,
+ /* 98 */ 0xc4ac, 0xfc61, 0xfc62, 0xf7ec, 0xf7ed, 0xf7ee, 0xfc63, 0xf7f0,
+ /* a0 */ 0xf7ef, 0xfc64, 0xf7f1, 0xfc65, 0xfc66, 0xf7f4, 0xfc67, 0xf7f3,
+ /* a8 */ 0xfc68, 0xf7f2, 0xf7f5, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xf7f6,
+ /* b0 */ 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74,
+ /* b8 */ 0xfc75, 0xede9, 0xfc76, 0xedea, 0xedeb, 0xfc77, 0xf6bc, 0xfc78,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x05bc3 ***/
+
+ /* 80 */ 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81,
+ /* 88 */ 0xfc82, 0xfc83, 0xfc84, 0xf6bd, 0xfc85, 0xf6be, 0xb6a6, 0xfc86,
+ /* 90 */ 0xd8be, 0xfc87, 0xfc88, 0xb9c4, 0xfc89, 0xfc8a, 0xfc8b, 0xd8bb,
+ /* 98 */ 0xfc8c, 0xdcb1, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92,
+ /* a0 */ 0xcaf3, 0xfc93, 0xf7f7, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98,
+ /* a8 */ 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xf7f8, 0xfc9d, 0xfc9e, 0xf7f9,
+ /* b0 */ 0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xf7fb,
+ /* b8 */ 0xfd45, 0xf7fa, 0xfd46, 0xb1c7, 0xfd47, 0xf7fc, 0xf7fd, 0xfd48,
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x05c03 ***/
+
+ /* 80 */ 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xf7fe, 0xfd4d, 0xfd4e, 0xfd4f,
+ /* 88 */ 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57,
+ /* 90 */ 0xc6eb, 0xecb4, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d,
+ /* 98 */ 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65,
+ /* a0 */ 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d,
+ /* a8 */ 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75,
+ /* b0 */ 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d,
+ /* b8 */ 0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xb3dd,
+
+ /*** Three byte table, leaf: e9bexx - offset 0x05c43 ***/
+
+ /* 80 */ 0xf6b3, 0xfd86, 0xfd87, 0xf6b4, 0xc1e4, 0xf6b5, 0xf6b6, 0xf6b7,
+ /* 88 */ 0xf6b8, 0xf6b9, 0xf6ba, 0xc8a3, 0xf6bb, 0xfd88, 0xfd89, 0xfd8a,
+ /* 90 */ 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92,
+ /* 98 */ 0xfd93, 0xc1fa, 0xb9a8, 0xede8, 0xfd94, 0xfd95, 0xfd96, 0xb9ea,
+ /* a0 */ 0xd9df, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x05c69 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfd9c,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa5xx - offset 0x05c96 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfd9d,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa6xx - offset 0x05cd0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd9e, 0x0000, 0x0000,
+ /* 98 */ 0x0000,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa7xx - offset 0x05ce9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd9f,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfda0, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x05d1d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfe40, 0xfe41, 0xfe42, 0xfe43,
+ /* 90 */ 0x0000, 0xfe44, 0x0000, 0xfe45, 0xfe46, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfe47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe48,
+ /* a0 */ 0xfe49, 0xfe4a, 0x0000, 0xfe4b, 0xfe4c, 0x0000, 0x0000, 0xfe4d,
+ /* a8 */ 0xfe4e, 0xfe4f,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb8xx - offset 0x05d47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa955, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0,
+ /* b8 */ 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4,
+
+ /*** Three byte table, leaf: efb9xx - offset 0x05d87 ***/
+
+ /* 80 */ 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e,
+ /* 90 */ 0xa96f, 0xa970, 0xa971, 0x0000, 0xa972, 0xa973, 0xa974, 0xa975,
+ /* 98 */ 0x0000, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c,
+ /* a0 */ 0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0x0000,
+ /* a8 */ 0xa985, 0xa986, 0xa987, 0xa988, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x05dc6 ***/
+
+ /* 80 */ 0x0000, 0xa3a1, 0xa3a2, 0xa3a3, 0xa1e7, 0xa3a5, 0xa3a6, 0xa3a7,
+ /* 88 */ 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af,
+ /* 90 */ 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
+ /* 98 */ 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf,
+ /* a0 */ 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
+ /* a8 */ 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
+ /* b0 */ 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
+ /* b8 */ 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd, 0xa3de, 0xa3df,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x05e06 ***/
+
+ /* 80 */ 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
+ /* 88 */ 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
+ /* 90 */ 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
+ /* 98 */ 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa1ab, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x05e46 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1e9, 0xa1ea, 0xa956, 0xa3fe, 0xa957, 0xa3a4, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_10.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_10.map
new file mode 100644
index 0000000..033c0dd
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_10.map
@@ -0,0 +1,114 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_10.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_10_from_unicode_tree_table[319];
+
+static const pg_mb_radix_tree iso8859_10_from_unicode_tree =
+{
+ iso8859_10_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc5, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x013c, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x80, /* b3_2_upper */
+ 0x95, /* b3_3_lower */
+ 0x95, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_10_from_unicode_tree_table[319] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0043, 0x0081, 0x00c0, 0x00fd,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00043 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x00b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00081 ***/
+
+ /* 80 */ 0x0000, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x0000,
+ /* 88 */ 0x0000, 0x00c9, 0x0000, 0x00cb, 0x0000, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x00d0, 0x0000, 0x0000, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000,
+ /* 98 */ 0x00d8, 0x0000, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* a0 */ 0x0000, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x0000,
+ /* a8 */ 0x0000, 0x00e9, 0x0000, 0x00eb, 0x0000, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x00f0, 0x0000, 0x0000, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000,
+ /* b8 */ 0x00f8, 0x0000, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c0 ***/
+
+ /* 80 */ 0x00c0, 0x00e0, 0x0000, 0x0000, 0x00a1, 0x00b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x0000, 0x0000,
+ /* 90 */ 0x00a9, 0x00b9, 0x00a2, 0x00b2, 0x0000, 0x0000, 0x00cc, 0x00ec,
+ /* 98 */ 0x00ca, 0x00ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x00a3, 0x00b3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x00a5, 0x00b5, 0x00a4, 0x00b4, 0x0000, 0x0000, 0x00c7, 0x00e7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a6, 0x00b6,
+ /* b8 */ 0x00ff, 0x0000, 0x0000, 0x00a8, 0x00b8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d1, 0x00f1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x00af, 0x00bf, 0x00d2, 0x00f2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00aa, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ab, 0x00bb,
+ /* a8 */ 0x00d7, 0x00f7, 0x00ae, 0x00be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x00d9, 0x00f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ac, 0x00bc,
+
+ /*** Three byte table, byte #1: xx - offset 0x0013c ***/
+
+ /* e2 */ 0x013d,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0013d ***/
+
+ /* 80 */ 0x013e,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0013e ***/
+
+ /* 95 */ 0x00bd
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_13.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_13.map
new file mode 100644
index 0000000..e0f0c15
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_13.map
@@ -0,0 +1,113 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_13.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_13_from_unicode_tree_table[326];
+
+static const pg_mb_radix_tree iso8859_13_from_unicode_tree =
+{
+ iso8859_13_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc5, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x013e, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x80, /* b3_2_upper */
+ 0x99, /* b3_3_lower */
+ 0x9e, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_13_from_unicode_tree_table[326] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0043, 0x0082, 0x00c1, 0x00ff,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00043 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x0000, 0x00a6, 0x00a7,
+ /* a8 */ 0x0000, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0000,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0000, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x0000, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00082 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c4, 0x00c5, 0x00af, 0x0000,
+ /* 88 */ 0x0000, 0x00c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x00d3, 0x0000, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00e4, 0x00e5, 0x00bf, 0x0000,
+ /* a8 */ 0x0000, 0x00e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x00f3, 0x0000, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x00fc, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c1 ***/
+
+ /* 80 */ 0x00c2, 0x00e2, 0x0000, 0x0000, 0x00c0, 0x00e0, 0x00c3, 0x00e3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x00c7, 0x00e7, 0x0000, 0x0000, 0x00cb, 0x00eb,
+ /* 98 */ 0x00c6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x00cc, 0x00ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x00ce, 0x00ee, 0x0000, 0x0000, 0x00c1, 0x00e1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00cd, 0x00ed,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00cf, 0x00ef, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000ff ***/
+
+ /* 80 */ 0x0000, 0x00d9, 0x00f9, 0x00d1, 0x00f1, 0x00d2, 0x00f2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00d4, 0x00f4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba,
+ /* 98 */ 0x0000, 0x0000, 0x00da, 0x00fa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00d0, 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x00db, 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x00d8, 0x00f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x00ca, 0x00ea, 0x00dd, 0x00fd, 0x00de, 0x00fe,
+
+ /*** Three byte table, byte #1: xx - offset 0x0013e ***/
+
+ /* e2 */ 0x013f,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0013f ***/
+
+ /* 80 */ 0x0140,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00140 ***/
+
+ /* 99 */ 0x00ff, 0x0000, 0x0000, 0x00b4, 0x00a1, 0x00a5
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_14.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_14.map
new file mode 100644
index 0000000..8fd1da3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_14.map
@@ -0,0 +1,146 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_14.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_14_from_unicode_tree_table[507];
+
+static const pg_mb_radix_tree iso8859_14_from_unicode_tree =
+{
+ iso8859_14_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc5, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0126, /* offset of table for 3-byte inputs */
+ 0xe1, /* b3_1_lower */
+ 0xe1, /* b3_1_upper */
+ 0xb8, /* b3_2_lower */
+ 0xbb, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xb3, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_14_from_unicode_tree_table[507] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0044, 0x0084, 0x00c4, 0x00e6,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00044 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x00a3, 0x0000, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x0000, 0x00a9, 0x0000, 0x0000, 0x0000, 0x00ad, 0x00ae, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00084 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0000, 0x00ff,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x00a4, 0x00a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00b2, 0x00b3,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000e6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00d0, 0x00f0, 0x00de, 0x00fe,
+ /* b8 */ 0x00af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00126 ***/
+
+ /* e1 */ 0x0127,
+
+ /*** Three byte table, byte #2: e1xx - offset 0x00127 ***/
+
+ /* b8 */ 0x012b, 0x015f, 0x0193, 0x01c7,
+
+ /*** Three byte table, leaf: e1b8xx - offset 0x0012b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x00a1, 0x00a2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x00a6, 0x00ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b0, 0x00b1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e1b9xx - offset 0x0015f ***/
+
+ /* 80 */ 0x00b4, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b7, 0x00b9,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00bb, 0x00bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x00d7, 0x00f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e1baxx - offset 0x00193 ***/
+
+ /* 80 */ 0x00a8, 0x00b8, 0x00aa, 0x00ba, 0x00bd, 0x00be, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e1bbxx - offset 0x001c7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x00ac, 0x00bc
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_15.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_15.map
new file mode 100644
index 0000000..e7f85a7
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_15.map
@@ -0,0 +1,101 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_15.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_15_from_unicode_tree_table[263];
+
+static const pg_mb_radix_tree iso8859_15_from_unicode_tree =
+{
+ iso8859_15_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc5, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0104, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x82, /* b3_2_lower */
+ 0x82, /* b3_2_upper */
+ 0xac, /* b3_3_lower */
+ 0xac, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_15_from_unicode_tree_table[263] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0044, 0x0084, 0x0000, 0x00c4,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00044 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x0000, 0x00a5, 0x0000, 0x00a7,
+ /* a8 */ 0x0000, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0000, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x0000, 0x00b9, 0x00ba, 0x00bb, 0x0000, 0x0000, 0x0000, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00084 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+
+ /*** Two byte table, leaf: c5xx - offset 0x000c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x00bc, 0x00bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a6, 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x00be, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b4, 0x00b8, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00104 ***/
+
+ /* e2 */ 0x0105,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00105 ***/
+
+ /* 82 */ 0x0106,
+
+ /*** Three byte table, leaf: e282xx - offset 0x00106 ***/
+
+ /* ac */ 0x00a4
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_16.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_16.map
new file mode 100644
index 0000000..0e1ffbd
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_16.map
@@ -0,0 +1,131 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_16.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_16_from_unicode_tree_table[425];
+
+static const pg_mb_radix_tree iso8859_16_from_unicode_tree =
+{
+ iso8859_16_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc8, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0185, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x82, /* b3_2_upper */
+ 0x9d, /* b3_3_lower */
+ 0xac, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_16_from_unicode_tree_table[425] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0047, 0x0087, 0x00c7, 0x0106, 0x0000, 0x0000, 0x0145,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00047 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x0000, 0x00a9, 0x0000, 0x00ab, 0x0000, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x00b0, 0x00b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b6, 0x00b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00087 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x0000, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x0000, 0x00d2, 0x00d3, 0x00d4, 0x0000, 0x00d6, 0x0000,
+ /* 98 */ 0x0000, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x0000, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x0000, 0x00f2, 0x00f3, 0x00f4, 0x0000, 0x00f6, 0x0000,
+ /* b8 */ 0x0000, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x0000, 0x00ff,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x00c3, 0x00e3, 0x00a1, 0x00a2, 0x00c5, 0x00e5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00b2, 0x00b9, 0x0000, 0x0000,
+ /* 90 */ 0x00d0, 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00dd, 0x00fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x00106 ***/
+
+ /* 80 */ 0x0000, 0x00a3, 0x00b3, 0x00d1, 0x00f1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00d5, 0x00f5, 0x00bc, 0x00bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x00d7, 0x00f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a6, 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00d8, 0x00f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x00be, 0x00ac, 0x00ae, 0x00af, 0x00bf, 0x00b4, 0x00b8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c8xx - offset 0x00145 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00aa, 0x00ba, 0x00de, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00185 ***/
+
+ /* e2 */ 0x0186,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00186 ***/
+
+ /* 80 */ 0x0189, 0x0000, 0x0199,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00189 ***/
+
+ /* 9d */ 0x00b5, 0x00a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e282xx - offset 0x00199 ***/
+
+ /* 9d */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a4
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_2.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_2.map
new file mode 100644
index 0000000..5fac57c
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_2.map
@@ -0,0 +1,114 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_2.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_2_from_unicode_tree_table[386];
+
+static const pg_mb_radix_tree iso8859_2_from_unicode_tree =
+{
+ iso8859_2_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_2_from_unicode_tree_table[386] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0049, 0x0087, 0x00c5, 0x0104, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0143,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00049 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x00b0, 0x0000, 0x0000, 0x0000, 0x00b4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00087 ***/
+
+ /* 80 */ 0x0000, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x0000, 0x0000, 0x00c7,
+ /* 88 */ 0x0000, 0x00c9, 0x0000, 0x00cb, 0x0000, 0x00cd, 0x00ce, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x00d3, 0x00d4, 0x0000, 0x00d6, 0x00d7,
+ /* 98 */ 0x0000, 0x0000, 0x00da, 0x0000, 0x00dc, 0x00dd, 0x0000, 0x00df,
+ /* a0 */ 0x0000, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x0000, 0x0000, 0x00e7,
+ /* a8 */ 0x0000, 0x00e9, 0x0000, 0x00eb, 0x0000, 0x00ed, 0x00ee, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x00f3, 0x00f4, 0x0000, 0x00f6, 0x00f7,
+ /* b8 */ 0x0000, 0x0000, 0x00fa, 0x0000, 0x00fc, 0x00fd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x00c3, 0x00e3, 0x00a1, 0x00b1, 0x00c6, 0x00e6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x00cf, 0x00ef,
+ /* 90 */ 0x00d0, 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00ca, 0x00ea, 0x00cc, 0x00ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x00c5, 0x00e5, 0x0000, 0x0000, 0x00a5, 0x00b5,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00104 ***/
+
+ /* 80 */ 0x0000, 0x00a3, 0x00b3, 0x00d1, 0x00f1, 0x0000, 0x0000, 0x00d2,
+ /* 88 */ 0x00f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00d5, 0x00f5, 0x0000, 0x0000, 0x00c0, 0x00e0, 0x0000, 0x0000,
+ /* 98 */ 0x00d8, 0x00f8, 0x00a6, 0x00b6, 0x0000, 0x0000, 0x00aa, 0x00ba,
+ /* a0 */ 0x00a9, 0x00b9, 0x00de, 0x00fe, 0x00ab, 0x00bb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d9, 0x00f9,
+ /* b0 */ 0x00db, 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x00ac, 0x00bc, 0x00af, 0x00bf, 0x00ae, 0x00be,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00143 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00a2, 0x00ff, 0x0000, 0x00b2, 0x0000, 0x00bd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_3.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_3.map
new file mode 100644
index 0000000..09b38d8
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_3.map
@@ -0,0 +1,113 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_3.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_3_from_unicode_tree_table[373];
+
+static const pg_mb_radix_tree iso8859_3_from_unicode_tree =
+{
+ iso8859_3_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003e, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbd, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_3_from_unicode_tree_table[373] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003e ***/
+
+ /* c2 */ 0x0048, 0x0086, 0x00c3, 0x00f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0137,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00048 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x00a3, 0x00a4, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x00b0, 0x0000, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0000, 0x00b7,
+ /* b8 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x00bd,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00086 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x0000, 0x0000, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0000, 0x00d6, 0x00d7,
+ /* 98 */ 0x0000, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x0000, 0x0000, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0000, 0x00f6, 0x00f7,
+ /* b8 */ 0x0000, 0x00f9, 0x00fa, 0x00fb, 0x00fc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x00c6, 0x00e6, 0x00c5, 0x00e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00d8, 0x00f8, 0x00ab, 0x00bb,
+ /* a0 */ 0x00d5, 0x00f5, 0x0000, 0x0000, 0x00a6, 0x00b6, 0x00a1, 0x00b1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00a9, 0x00b9, 0x0000, 0x0000, 0x00ac, 0x00bc,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000f9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00de, 0x00fe, 0x00aa, 0x00ba,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00dd, 0x00fd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00af, 0x00bf, 0x0000,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00137 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00a2, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_4.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_4.map
new file mode 100644
index 0000000..1f640b2
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_4.map
@@ -0,0 +1,114 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_4.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_4_from_unicode_tree_table[385];
+
+static const pg_mb_radix_tree iso8859_4_from_unicode_tree =
+{
+ iso8859_4_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_4_from_unicode_tree_table[385] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0049, 0x0087, 0x00c6, 0x0103, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0142,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00049 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x00a7,
+ /* a8 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000, 0x00af,
+ /* b0 */ 0x00b0, 0x0000, 0x0000, 0x0000, 0x00b4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00087 ***/
+
+ /* 80 */ 0x0000, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x0000,
+ /* 88 */ 0x0000, 0x00c9, 0x0000, 0x00cb, 0x0000, 0x00cd, 0x00ce, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x0000, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x0000, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x0000,
+ /* a8 */ 0x0000, 0x00e9, 0x0000, 0x00eb, 0x0000, 0x00ed, 0x00ee, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x0000, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c6 ***/
+
+ /* 80 */ 0x00c0, 0x00e0, 0x0000, 0x0000, 0x00a1, 0x00b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x0000, 0x0000,
+ /* 90 */ 0x00d0, 0x00f0, 0x00aa, 0x00ba, 0x0000, 0x0000, 0x00cc, 0x00ec,
+ /* 98 */ 0x00ca, 0x00ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x00ab, 0x00bb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x00a5, 0x00b5, 0x00cf, 0x00ef, 0x0000, 0x0000, 0x00c7, 0x00e7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d3, 0x00f3,
+ /* b8 */ 0x00a2, 0x0000, 0x0000, 0x00a6, 0x00b6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x00103 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d1, 0x00f1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x00bd, 0x00bf, 0x00d2, 0x00f2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a3, 0x00b3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a9, 0x00b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ac, 0x00bc,
+ /* a8 */ 0x00dd, 0x00fd, 0x00de, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x00d9, 0x00f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ae, 0x00be,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00142 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00b7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x00ff, 0x0000, 0x00b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_5.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_5.map
new file mode 100644
index 0000000..0628667
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_5.map
@@ -0,0 +1,103 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_5.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_5_from_unicode_tree_table[274];
+
+static const pg_mb_radix_tree iso8859_5_from_unicode_tree =
+{
+ iso8859_5_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x010f, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x84, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x96, /* b3_3_lower */
+ 0x96, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_5_from_unicode_tree_table[274] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008f, 0x00cf,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00fd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0008f ***/
+
+ /* 80 */ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* 88 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af,
+ /* 90 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* 98 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ /* a0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* a8 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* b0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* b8 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+
+ /*** Two byte table, leaf: d1xx - offset 0x000cf ***/
+
+ /* 80 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 88 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* 90 */ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* 98 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x00fe, 0x00ff,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0010f ***/
+
+ /* e2 */ 0x0110,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00110 ***/
+
+ /* 84 */ 0x0111,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00111 ***/
+
+ /* 96 */ 0x00f0
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_6.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_6.map
new file mode 100644
index 0000000..70b6e57
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_6.map
@@ -0,0 +1,90 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_6.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_6_from_unicode_tree_table[248];
+
+static const pg_mb_radix_tree iso8859_6_from_unicode_tree =
+{
+ iso8859_6_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003b, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd9, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xba, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_6_from_unicode_tree_table[248] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003b ***/
+
+ /* c2 */ 0x0053, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* d2 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x00bd,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00053 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ad, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d8xx - offset 0x00082 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00ac, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x0000, 0x0000, 0x00bf,
+ /* a0 */ 0x0000, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* a8 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* b0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* b8 */ 0x00d8, 0x00d9, 0x00da,
+
+ /*** Two byte table, leaf: d9xx - offset 0x000bd ***/
+
+ /* 80 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 88 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* 90 */ 0x00f0, 0x00f1, 0x00f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_7.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_7.map
new file mode 100644
index 0000000..f8ee0c2
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_7.map
@@ -0,0 +1,125 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_7.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_7_from_unicode_tree_table[386];
+
+static const pg_mb_radix_tree iso8859_7_from_unicode_tree =
+{
+ iso8859_7_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcf, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0148, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x82, /* b3_2_upper */
+ 0x95, /* b3_3_lower */
+ 0xaf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_7_from_unicode_tree_table[386] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x004e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x008c, 0x00c8, 0x0108,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004e ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x0000,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0000, 0x0000, 0x0000, 0x00b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x00bd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cdxx - offset 0x0008c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x00aa, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x000c8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00b4, 0x00b5, 0x00b6, 0x0000,
+ /* 88 */ 0x00b8, 0x00b9, 0x00ba, 0x0000, 0x00bc, 0x0000, 0x00be, 0x00bf,
+ /* 90 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 98 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* a0 */ 0x00d0, 0x00d1, 0x0000, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* a8 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* b0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* b8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00108 ***/
+
+ /* 80 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* 88 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00148 ***/
+
+ /* e2 */ 0x0149,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00149 ***/
+
+ /* 80 */ 0x014c, 0x0000, 0x0167,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0014c ***/
+
+ /* 95 */ 0x00af, 0x0000, 0x0000, 0x00a1, 0x00a2, 0x0000, 0x0000, 0x0000,
+ /* 9d */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ad */ 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e282xx - offset 0x00167 ***/
+
+ /* 95 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9d */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a4,
+ /* ad */ 0x0000, 0x0000, 0x00a5
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_8.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_8.map
new file mode 100644
index 0000000..abba189
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_8.map
@@ -0,0 +1,104 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_8_from_unicode_tree_table[279];
+
+static const pg_mb_radix_tree iso8859_8_from_unicode_tree =
+{
+ iso8859_8_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd7, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x010b, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x80, /* b3_2_upper */
+ 0x8e, /* b3_3_lower */
+ 0x97, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_8_from_unicode_tree_table[279] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0055, 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* d2 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00cc,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00055 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00094 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ba,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d7xx - offset 0x000cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 98 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* a0 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* a8 */ 0x00f8, 0x00f9, 0x00fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0010b ***/
+
+ /* e2 */ 0x010c,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0010c ***/
+
+ /* 80 */ 0x010d,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0010d ***/
+
+ /* 8e */ 0x00fd, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 96 */ 0x0000, 0x00df
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_iso8859_9.map b/src/backend/utils/mb/Unicode/utf8_to_iso8859_9.map
new file mode 100644
index 0000000..fe03f58
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_iso8859_9.map
@@ -0,0 +1,100 @@
+/* src/backend/utils/mb/Unicode/utf8_to_iso8859_9.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 iso8859_9_from_unicode_tree_table[324];
+
+static const pg_mb_radix_tree iso8859_9_from_unicode_tree =
+{
+ iso8859_9_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc5, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 iso8859_9_from_unicode_tree_table[324] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0044, 0x0084, 0x00c4, 0x0104,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00044 ***/
+
+ /* 80 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 88 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* 90 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* 98 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00084 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x0000, 0x00ff,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d0, 0x00f0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00dd, 0x00fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00104 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00de, 0x00fe,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_johab.map b/src/backend/utils/mb/Unicode/utf8_to_johab.map
new file mode 100644
index 0000000..42c05df
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_johab.map
@@ -0,0 +1,6333 @@
+/* src/backend/utils/mb/Unicode/utf8_to_johab.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl */
+
+static const uint16 johab_from_unicode_tree_table[34515];
+
+static const pg_mb_radix_tree johab_from_unicode_tree =
+{
+ johab_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0276, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 johab_from_unicode_tree_table[34515] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0090, 0x00cf, 0x010f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0148, 0x0000, 0x0000, 0x0177, 0x01b7, 0x01f6, 0x0236,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd9ae, 0x0000, 0x0000, 0xd9b4, 0x0000, 0x0000, 0xd967,
+ /* a8 */ 0xd937, 0x0000, 0xdca3, 0x0000, 0x0000, 0xd939, 0xd9e7, 0x0000,
+ /* b0 */ 0xd956, 0xd94e, 0xdd99, 0xdd9a, 0xd9a5, 0x0000, 0xd9d2, 0xd934,
+ /* b8 */ 0xd9ac, 0xdd98, 0xdcac, 0x0000, 0xdcf9, 0xdcf6, 0xdcfa, 0xd9af,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdca1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdca2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd94f,
+ /* 98 */ 0xdcaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcad, 0xdd3c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd31, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdd33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd950,
+ /* b8 */ 0xdd3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd3d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdd32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdca4, 0xdd34,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdd35, 0xdca6, 0xdd36, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdd37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdca8,
+
+ /*** Two byte table, leaf: c5xx - offset 0x0010f ***/
+
+ /* 80 */ 0xdd38, 0xdca9, 0xdd39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdd40, 0xdcaf, 0xdd3f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdcab, 0xdd3b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcae, 0xdd3e,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00148 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd9b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd9a8, 0xd9ab, 0xd9aa, 0xd9ad, 0x0000, 0xd9a9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x00177 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57,
+ /* 98 */ 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f,
+ /* a0 */ 0xdb60, 0xdb61, 0x0000, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66,
+ /* a8 */ 0xdb67, 0xdb68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77,
+ /* b8 */ 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb91,
+
+ /*** Two byte table, leaf: cfxx - offset 0x001b7 ***/
+
+ /* 80 */ 0xdb92, 0xdb93, 0x0000, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98,
+ /* 88 */ 0xdb99, 0xdb9a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x001f6 ***/
+
+ /* 80 */ 0x0000, 0xdea7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdea1, 0xdea2, 0xdea3, 0xdea4, 0xdea5, 0xdea6, 0xdea8, 0xdea9,
+ /* 98 */ 0xdeaa, 0xdeab, 0xdeac, 0xdead, 0xdeae, 0xdeaf, 0xdeb0, 0xdeb1,
+ /* a0 */ 0xdeb2, 0xdeb3, 0xdeb4, 0xdeb5, 0xdeb6, 0xdeb7, 0xdeb8, 0xdeb9,
+ /* a8 */ 0xdeba, 0xdebb, 0xdebc, 0xdebd, 0xdebe, 0xdebf, 0xdec0, 0xdec1,
+ /* b0 */ 0xded1, 0xded2, 0xded3, 0xded4, 0xded5, 0xded6, 0xded8, 0xded9,
+ /* b8 */ 0xdeda, 0xdedb, 0xdedc, 0xdedd, 0xdede, 0xdedf, 0xdee0, 0xdee1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00236 ***/
+
+ /* 80 */ 0xdee2, 0xdee3, 0xdee4, 0xdee5, 0xdee6, 0xdee7, 0xdee8, 0xdee9,
+ /* 88 */ 0xdeea, 0xdeeb, 0xdeec, 0xdeed, 0xdeee, 0xdeef, 0xdef0, 0xdef1,
+ /* 90 */ 0x0000, 0xded7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00276 ***/
+
+ /* e2 */ 0x0284, 0x02c4, 0x02d4, 0x0314, 0x0354, 0x0394, 0x03d4, 0x0414,
+ /* ea */ 0x0453, 0x0493, 0x04d3, 0x0513, 0x0000, 0x0532,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00284 ***/
+
+ /* 80 */ 0x0572, 0x05ae, 0x05ee, 0x0000, 0x062b, 0x0658, 0x0692, 0x06c0,
+ /* 88 */ 0x0700, 0x073e, 0x077c, 0x0000, 0x07aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x07ca, 0x080a, 0x0840, 0x0880, 0x08c0, 0x08ee, 0x092e,
+ /* 98 */ 0x0969, 0x09a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x002c4 ***/
+
+ /* 80 */ 0x09e9, 0x0a28, 0x0a68, 0x0aa8, 0x0adf, 0x0b1f, 0x0b5f, 0x0000,
+ /* 88 */ 0x0b9f, 0x0bbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bff, 0x0c3f,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x002d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0c7f, 0x0cbd, 0x0cfc, 0x0d3c, 0x0d7b, 0x0db9, 0x0df9, 0x0e39,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00314 ***/
+
+ /* 80 */ 0x0e77, 0x0eb4, 0x0ef4, 0x0f33, 0x0f73, 0x0fb3, 0x0ff3, 0x1031,
+ /* 88 */ 0x1071, 0x10ae, 0x10ee, 0x112d, 0x116d, 0x11ad, 0x11ed, 0x122a,
+ /* 90 */ 0x1267, 0x12a6, 0x12e6, 0x1326, 0x1362, 0x13a1, 0x13e1, 0x141c,
+ /* 98 */ 0x145b, 0x1492, 0x14cc, 0x1509, 0x1546, 0x1586, 0x15c4, 0x1601,
+ /* a0 */ 0x1641, 0x167c, 0x16bb, 0x16fa, 0x1738, 0x1777, 0x17b5, 0x17f4,
+ /* a8 */ 0x1834, 0x1873, 0x18a1, 0x18e0, 0x191b, 0x195b, 0x1998, 0x19d8,
+ /* b0 */ 0x1a17, 0x1a57, 0x1a91, 0x1ad1, 0x1b0f, 0x1b44, 0x1b7d, 0x1bbb,
+ /* b8 */ 0x1bfa, 0x1c3a, 0x1c79, 0x1cb8, 0x1cf7, 0x1d34, 0x1d74, 0x1db2,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x00354 ***/
+
+ /* 80 */ 0x1df2, 0x1e31, 0x1e6c, 0x1eaa, 0x1ee9, 0x1f29, 0x1f68, 0x1fa7,
+ /* 88 */ 0x1fe7, 0x2027, 0x2067, 0x20a5, 0x20e5, 0x2124, 0x2164, 0x21a4,
+ /* 90 */ 0x21dc, 0x221b, 0x2256, 0x2295, 0x22d5, 0x2315, 0x2354, 0x2393,
+ /* 98 */ 0x23d3, 0x2412, 0x244e, 0x248d, 0x24cd, 0x250b, 0x254b, 0x258a,
+ /* a0 */ 0x25c9, 0x2609, 0x2649, 0x2685, 0x26c5, 0x2705, 0x273f, 0x277e,
+ /* a8 */ 0x27be, 0x27fc, 0x283c, 0x287a, 0x28b6, 0x28f5, 0x2935, 0x2975,
+ /* b0 */ 0x29ad, 0x29ed, 0x2a2c, 0x2a6c, 0x2aa1, 0x2ae0, 0x2b20, 0x2b60,
+ /* b8 */ 0x2b9c, 0x2bdb, 0x2c16, 0x2c54, 0x2c94, 0x2cd4, 0x2d13, 0x2d53,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x00394 ***/
+
+ /* 80 */ 0x2d92, 0x2dd1, 0x2e0f, 0x2e49, 0x2e87, 0x2ec0, 0x2efe, 0x2f3d,
+ /* 88 */ 0x2f7d, 0x2fbd, 0x2ffd, 0x303d, 0x307b, 0x30bb, 0x30f7, 0x3137,
+ /* 90 */ 0x3176, 0x31b6, 0x31f5, 0x3235, 0x3274, 0x32af, 0x32ef, 0x332e,
+ /* 98 */ 0x336e, 0x33ac, 0x33eb, 0x342b, 0x346a, 0x34aa, 0x34ea, 0x352a,
+ /* a0 */ 0x3568, 0x35a3, 0x35e2, 0x3621, 0x3660, 0x36a0, 0x36e0, 0x3720,
+ /* a8 */ 0x3760, 0x37a0, 0x37e0, 0x381c, 0x385c, 0x3896, 0x38d4, 0x3914,
+ /* b0 */ 0x394d, 0x398d, 0x39ca, 0x3a09, 0x3a49, 0x3a87, 0x3ac7, 0x3b07,
+ /* b8 */ 0x3b43, 0x3b82, 0x3bc0, 0x0000, 0x3bdd, 0x3c18, 0x3c53, 0x3c92,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x003d4 ***/
+
+ /* 80 */ 0x3cd2, 0x3d12, 0x3d52, 0x3d8f, 0x3dcd, 0x3e0c, 0x3e4c, 0x3e8c,
+ /* 88 */ 0x3ecb, 0x3f0b, 0x3f4a, 0x3f8a, 0x3fc9, 0x4009, 0x4045, 0x4084,
+ /* 90 */ 0x40c2, 0x4100, 0x413b, 0x417b, 0x41b8, 0x41f8, 0x4234, 0x4273,
+ /* 98 */ 0x42b3, 0x42f3, 0x432d, 0x4366, 0x43a6, 0x43d8, 0x4416, 0x4452,
+ /* a0 */ 0x4491, 0x44d1, 0x4511, 0x4550, 0x458e, 0x45cd, 0x460d, 0x464d,
+ /* a8 */ 0x468d, 0x46c9, 0x4704, 0x4744, 0x4784, 0x47c3, 0x4803, 0x0000,
+ /* b0 */ 0x481e, 0x485e, 0x489c, 0x48dc, 0x491a, 0x4936, 0x4971, 0x49b0,
+ /* b8 */ 0x49e6, 0x4a24, 0x4a63, 0x4aa3, 0x4ae2, 0x4b22, 0x4b47, 0x4b85,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00414 ***/
+
+ /* 80 */ 0x4bc5, 0x4c04, 0x4c44, 0x4c83, 0x4cc1, 0x4cf8, 0x4d31, 0x4d71,
+ /* 88 */ 0x4da7, 0x4de7, 0x4e27, 0x4e61, 0x4e9e, 0x4ed6, 0x4f15, 0x4f52,
+ /* 90 */ 0x4f8e, 0x4fca, 0x0000, 0x0000, 0x0000, 0x500a, 0x504a, 0x5087,
+ /* 98 */ 0x50ab, 0x50eb, 0x5129, 0x5169, 0x51a9, 0x51e7, 0x5222, 0x525c,
+ /* a0 */ 0x529c, 0x52d8, 0x5308, 0x5344, 0x5383, 0x53be, 0x53e8, 0x5427,
+ /* a8 */ 0x5467, 0x54a7, 0x54d2, 0x550b, 0x553a, 0x5579, 0x55ab, 0x55e2,
+ /* b0 */ 0x5615, 0x5651, 0x0000, 0x566c, 0x56a3, 0x56df, 0x5712, 0x574e,
+ /* b8 */ 0x5789, 0x57a8, 0x57e8, 0x5827, 0x5860, 0x589c, 0x58d4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: eaxx - offset 0x00453 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x5914, 0x5954, 0x5994, 0x59d4, 0x5a14, 0x5a54, 0x5a94, 0x5ad4,
+ /* b8 */ 0x5b14, 0x5b54, 0x5b94, 0x5bd4, 0x5c14, 0x5c54, 0x5c94, 0x5cd4,
+
+ /*** Three byte table, byte #2: ebxx - offset 0x00493 ***/
+
+ /* 80 */ 0x5d14, 0x5d54, 0x5d94, 0x5dd4, 0x5e14, 0x5e54, 0x5e94, 0x5ed4,
+ /* 88 */ 0x5f14, 0x5f54, 0x5f94, 0x5fd4, 0x6014, 0x6054, 0x6094, 0x60d4,
+ /* 90 */ 0x6114, 0x6154, 0x6194, 0x61d4, 0x6214, 0x6254, 0x6294, 0x62d4,
+ /* 98 */ 0x6314, 0x6354, 0x6394, 0x63d4, 0x6414, 0x6454, 0x6494, 0x64d4,
+ /* a0 */ 0x6514, 0x6554, 0x6594, 0x65d4, 0x6614, 0x6654, 0x6694, 0x66d4,
+ /* a8 */ 0x6714, 0x6754, 0x6794, 0x67d4, 0x6814, 0x6854, 0x6894, 0x68d4,
+ /* b0 */ 0x6914, 0x6954, 0x6994, 0x69d4, 0x6a14, 0x6a54, 0x6a94, 0x6ad4,
+ /* b8 */ 0x6b14, 0x6b54, 0x6b94, 0x6bd4, 0x6c14, 0x6c54, 0x6c94, 0x6cd4,
+
+ /*** Three byte table, byte #2: ecxx - offset 0x004d3 ***/
+
+ /* 80 */ 0x6d14, 0x6d54, 0x6d94, 0x6dd4, 0x6e14, 0x6e54, 0x6e94, 0x6ed4,
+ /* 88 */ 0x6f14, 0x6f54, 0x6f94, 0x6fd4, 0x7014, 0x7054, 0x7094, 0x70d4,
+ /* 90 */ 0x7114, 0x7154, 0x7194, 0x71d4, 0x7214, 0x7254, 0x7294, 0x72d4,
+ /* 98 */ 0x7314, 0x7354, 0x7394, 0x73d4, 0x7414, 0x7454, 0x7494, 0x74d4,
+ /* a0 */ 0x7514, 0x7554, 0x7594, 0x75d4, 0x7614, 0x7654, 0x7694, 0x76d4,
+ /* a8 */ 0x7714, 0x7754, 0x7794, 0x77d4, 0x7814, 0x7854, 0x7894, 0x78d4,
+ /* b0 */ 0x7914, 0x7954, 0x7994, 0x79d4, 0x7a14, 0x7a54, 0x7a94, 0x7ad4,
+ /* b8 */ 0x7b14, 0x7b54, 0x7b94, 0x7bd4, 0x7c14, 0x7c54, 0x7c94, 0x7cd4,
+
+ /*** Three byte table, byte #2: edxx - offset 0x00513 ***/
+
+ /* 80 */ 0x7d14, 0x7d54, 0x7d94, 0x7dd4, 0x7e14, 0x7e54, 0x7e94, 0x7ed4,
+ /* 88 */ 0x7f14, 0x7f54, 0x7f94, 0x7fd4, 0x8014, 0x8054, 0x8094, 0x80d4,
+ /* 90 */ 0x8114, 0x8154, 0x8194, 0x81d4, 0x8214, 0x8254, 0x8294, 0x82d4,
+ /* 98 */ 0x8314, 0x8354, 0x8394, 0x83d4, 0x8414, 0x8454, 0x8494,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x00532 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x84d4, 0x8514, 0x8554, 0x8594,
+ /* a8 */ 0x85d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8613, 0x8653, 0x0000, 0x8693,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00572 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd93a, 0x0000, 0x0000,
+ /* 98 */ 0xd93e, 0xd93f, 0x0000, 0x0000, 0xd940, 0xd941, 0x0000, 0x0000,
+ /* a0 */ 0xd9d3, 0xd9d4, 0x0000, 0x0000, 0x0000, 0xd935, 0xd936, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd9b6, 0x0000, 0xd957, 0xd958, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd968,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e281xx - offset 0x005ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdd9b, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd9c,
+
+ /*** Three byte table, leaf: e282xx - offset 0x005ee ***/
+
+ /* 80 */ 0x0000, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x0062b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd959, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd9b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xdc34, 0x0000, 0x0000, 0xd9e0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd9e5, 0xd9e2, 0x0000, 0x0000, 0x0000, 0xdc69, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd95a, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00658 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xdcf7, 0xdcf8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdcfb, 0xdcfc, 0xdcfd, 0xdcfe, 0x0000,
+ /* a0 */ 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47,
+ /* a8 */ 0xdb48, 0xdb49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdb31, 0xdb32, 0xdb33, 0xdb34, 0xdb35, 0xdb36, 0xdb37, 0xdb38,
+ /* b8 */ 0xdb39, 0xdb3a,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00692 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd977, 0xd978, 0xd976, 0xd979, 0xd97a, 0xd9d5, 0xd9d8, 0xd9d6,
+ /* 98 */ 0xd9d9, 0xd9d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x006c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd9a1, 0x0000, 0xd9a2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x00700 ***/
+
+ /* 80 */ 0xd9a3, 0x0000, 0xd963, 0xd9a4, 0x0000, 0x0000, 0x0000, 0xd964,
+ /* 88 */ 0xd996, 0x0000, 0x0000, 0xd997, 0x0000, 0x0000, 0x0000, 0xd9b3,
+ /* 90 */ 0x0000, 0xd9b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd97e, 0x0000, 0x0000, 0xd992, 0xd954, 0x0000,
+ /* a0 */ 0xd960, 0x0000, 0x0000, 0x0000, 0x0000, 0xd93b, 0x0000, 0xd99e,
+ /* a8 */ 0xd99f, 0xd99d, 0xd99c, 0xd994, 0xd995, 0x0000, 0xd9b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd955, 0xd993, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd93d, 0xd991,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0073e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd951, 0xd965, 0x0000, 0x0000, 0xd952, 0xd953, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd97c, 0xd97d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x0077c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd99a, 0xd99b, 0x0000, 0x0000, 0xd998, 0xd999,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd9c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd961, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x007aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x007ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdce7, 0xdce8, 0xdce9, 0xdcea, 0xdceb, 0xdcec, 0xdced, 0xdcee,
+ /* a8 */ 0xdcef, 0xdcf0, 0xdcf1, 0xdcf2, 0xdcf3, 0xdcf4, 0xdcf5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdd77, 0xdd78, 0xdd79, 0xdd7a,
+ /* b8 */ 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd91, 0xdd92, 0xdd93, 0xdd94,
+
+ /*** Three byte table, leaf: e292xx - offset 0x0080a ***/
+
+ /* 80 */ 0xdd95, 0xdd96, 0xdd97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60,
+ /* a0 */ 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68,
+ /* a8 */ 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70,
+ /* b0 */ 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e293xx - offset 0x00840 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdccd, 0xdcce, 0xdccf, 0xdcd0, 0xdcd1, 0xdcd2, 0xdcd3, 0xdcd4,
+ /* 98 */ 0xdcd5, 0xdcd6, 0xdcd7, 0xdcd8, 0xdcd9, 0xdcda, 0xdcdb, 0xdcdc,
+ /* a0 */ 0xdcdd, 0xdcde, 0xdcdf, 0xdce0, 0xdce1, 0xdce2, 0xdce3, 0xdce4,
+ /* a8 */ 0xdce5, 0xdce6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00880 ***/
+
+ /* 80 */ 0xdba1, 0xdbac, 0xdba2, 0xdbad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdba3, 0xdbc8, 0xdbc7, 0xdbae,
+ /* 90 */ 0xdba4, 0xdbc2, 0xdbc1, 0xdbaf, 0xdba6, 0xdbc6, 0xdbc5, 0xdbb1,
+ /* 98 */ 0xdba5, 0xdbc4, 0xdbc3, 0xdbb0, 0xdba7, 0xdbbc, 0xdbc9, 0xdbca,
+ /* a0 */ 0xdbb7, 0xdbcb, 0xdbcc, 0xdbb2, 0xdba9, 0xdbbe, 0xdbcd, 0xdbce,
+ /* a8 */ 0xdbb9, 0xdbcf, 0xdbd0, 0xdbb4, 0xdba8, 0xdbd1, 0xdbd2, 0xdbb8,
+ /* b0 */ 0xdbbd, 0xdbd3, 0xdbd4, 0xdbb3, 0xdbaa, 0xdbd5, 0xdbd6, 0xdbba,
+ /* b8 */ 0xdbbf, 0xdbd7, 0xdbd8, 0xdbb5, 0xdbab, 0xdbd9, 0xdbda, 0xdbbb,
+
+ /*** Three byte table, leaf: e295xx - offset 0x008c0 ***/
+
+ /* 80 */ 0xdbdb, 0xdbdc, 0xdbc0, 0xdbdd, 0xdbde, 0xdbdf, 0xdbe0, 0xdbe1,
+ /* 88 */ 0xdbe2, 0xdbe3, 0xdbe4, 0xdbb6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x008ee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd9c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd971, 0xd970, 0x0000, 0xd9c3, 0xd9c7, 0xd9c8, 0xd9cb, 0xd9ca,
+ /* a8 */ 0xd9c9, 0xd9cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd973, 0xd972, 0x0000, 0x0000, 0xd9ba, 0xd9b9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd975, 0xd974, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e297xx - offset 0x0092e ***/
+
+ /* 80 */ 0xd9b8, 0xd9b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xd96f, 0xd96e,
+ /* 88 */ 0xd9c2, 0x0000, 0x0000, 0xd96b, 0x0000, 0x0000, 0xd96d, 0xd96c,
+ /* 90 */ 0xd9c4, 0xd9c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x00969 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd96a, 0xd969, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cf, 0xd9ce,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d0, 0x0000, 0xd9d1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x009a9 ***/
+
+ /* 80 */ 0xd95f, 0x0000, 0xd95e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd9bc, 0xd9bd, 0x0000, 0xd9c0, 0xd9bb, 0xd9be, 0x0000, 0xd9bf,
+ /* a8 */ 0xd9cd, 0xd9db, 0xd9dc, 0x0000, 0xd9dd, 0xd9da, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x009e9 ***/
+
+ /* 80 */ 0xd931, 0xd932, 0xd933, 0xd938, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, 0xd94a, 0xd94b,
+ /* 90 */ 0xd94c, 0xd94d, 0x0000, 0xd97b, 0xd942, 0xd943, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00a28 ***/
+
+ /* 80 */ 0x0000, 0xdda1, 0xdda2, 0xdda3, 0xdda4, 0xdda5, 0xdda6, 0xdda7,
+ /* 88 */ 0xdda8, 0xdda9, 0xddaa, 0xddab, 0xddac, 0xddad, 0xddae, 0xddaf,
+ /* 90 */ 0xddb0, 0xddb1, 0xddb2, 0xddb3, 0xddb4, 0xddb5, 0xddb6, 0xddb7,
+ /* 98 */ 0xddb8, 0xddb9, 0xddba, 0xddbb, 0xddbc, 0xddbd, 0xddbe, 0xddbf,
+ /* a0 */ 0xddc0, 0xddc1, 0xddc2, 0xddc3, 0xddc4, 0xddc5, 0xddc6, 0xddc7,
+ /* a8 */ 0xddc8, 0xddc9, 0xddca, 0xddcb, 0xddcc, 0xddcd, 0xddce, 0xddcf,
+ /* b0 */ 0xddd0, 0xddd1, 0xddd2, 0xddd3, 0xddd4, 0xddd5, 0xddd6, 0xddd7,
+ /* b8 */ 0xddd8, 0xddd9, 0xddda, 0xdddb, 0xdddc, 0xdddd, 0xddde, 0xdddf,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00a68 ***/
+
+ /* 80 */ 0xdde0, 0xdde1, 0xdde2, 0xdde3, 0xdde4, 0xdde5, 0xdde6, 0xdde7,
+ /* 88 */ 0xdde8, 0xdde9, 0xddea, 0xddeb, 0xddec, 0xdded, 0xddee, 0xddef,
+ /* 90 */ 0xddf0, 0xddf1, 0xddf2, 0xddf3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xde31, 0xde32, 0xde33, 0xde34, 0xde35, 0xde36, 0xde37,
+ /* a8 */ 0xde38, 0xde39, 0xde3a, 0xde3b, 0xde3c, 0xde3d, 0xde3e, 0xde3f,
+ /* b0 */ 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47,
+ /* b8 */ 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00aa8 ***/
+
+ /* 80 */ 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57,
+ /* 88 */ 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f,
+ /* 90 */ 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67,
+ /* 98 */ 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f,
+ /* a0 */ 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77,
+ /* a8 */ 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde91,
+ /* b0 */ 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x00adf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441,
+ /* b8 */ 0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,
+
+ /*** Three byte table, leaf: e385xx - offset 0x00b1f ***/
+
+ /* 80 */ 0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441,
+ /* 88 */ 0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461,
+ /* 90 */ 0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1,
+ /* 98 */ 0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
+ /* a0 */ 0x8741, 0x8761, 0x8781, 0x87a1, 0xdad4, 0xdad5, 0xdad6, 0xdad7,
+ /* a8 */ 0xdad8, 0xdad9, 0xdada, 0xdadb, 0xdadc, 0xdadd, 0xdade, 0xdadf,
+ /* b0 */ 0xdae0, 0xdae1, 0xdae2, 0xdae3, 0xdae4, 0xdae5, 0xdae6, 0xdae7,
+ /* b8 */ 0xdae8, 0xdae9, 0xdaea, 0xdaeb, 0xdaec, 0xdaed, 0xdaee, 0xdaef,
+
+ /*** Three byte table, leaf: e386xx - offset 0x00b5f ***/
+
+ /* 80 */ 0xdaf0, 0xdaf1, 0xdaf2, 0xdaf3, 0xdaf4, 0xdaf5, 0xdaf6, 0xdaf7,
+ /* 88 */ 0xdaf8, 0xdaf9, 0xdafa, 0xdafb, 0xdafc, 0xdafd, 0xdafe, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e388xx - offset 0x00b9f ***/
+
+ /* 80 */ 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48,
+ /* 88 */ 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50,
+ /* 90 */ 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58,
+ /* 98 */ 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xd9df, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e389xx - offset 0x00bbf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdcb1, 0xdcb2, 0xdcb3, 0xdcb4, 0xdcb5, 0xdcb6, 0xdcb7, 0xdcb8,
+ /* a8 */ 0xdcb9, 0xdcba, 0xdcbb, 0xdcbc, 0xdcbd, 0xdcbe, 0xdcbf, 0xdcc0,
+ /* b0 */ 0xdcc1, 0xdcc2, 0xdcc3, 0xdcc4, 0xdcc5, 0xdcc6, 0xdcc7, 0xdcc8,
+ /* b8 */ 0xdcc9, 0xdcca, 0xdccb, 0xdccc, 0x0000, 0x0000, 0xd9e8, 0xd9de,
+
+ /*** Three byte table, leaf: e38exx - offset 0x00bff ***/
+
+ /* 80 */ 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdc4a, 0xdc4b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc46, 0xdc47, 0xdc48,
+ /* 90 */ 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc31, 0xdc32, 0xdc33,
+ /* 98 */ 0xdc35, 0xdc3b, 0xdc3c, 0xdc3d, 0xdc3e, 0xdc3f, 0xdc40, 0xdc41,
+ /* a0 */ 0xdc42, 0xdc43, 0xdc44, 0xdc37, 0xdc38, 0xdc39, 0xdc3a, 0xdc4d,
+ /* a8 */ 0xdc4e, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc71, 0xdc72, 0xdc73,
+ /* b0 */ 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56,
+ /* b8 */ 0xdc57, 0xdc58, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63,
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00c3f ***/
+
+ /* 80 */ 0xdc6a, 0xdc6b, 0xd9e3, 0xdc7c, 0xdc36, 0xdc70, 0xdc91, 0xd9e1,
+ /* 88 */ 0xdc4c, 0xdc7d, 0xdc45, 0x0000, 0x0000, 0x0000, 0x0000, 0xdc49,
+ /* 90 */ 0xdc7a, 0x0000, 0x0000, 0xdc7b, 0x0000, 0x0000, 0xdc6f, 0x0000,
+ /* 98 */ 0xd9e4, 0x0000, 0x0000, 0xdc74, 0xdc7e, 0xdc79, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00c7f ***/
+
+ /* 80 */ 0xf179, 0xf2cb, 0x0000, 0xf662, 0x0000, 0x0000, 0x0000, 0xe742,
+ /* 88 */ 0xf1db, 0xeab2, 0xeabe, 0xf7bb, 0x0000, 0xe996, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5e4, 0x0000, 0x0000, 0xf4a6, 0xe9e0, 0xeba6, 0x0000,
+ /* 98 */ 0xe29a, 0xe940, 0x0000, 0x0000, 0x0000, 0x0000, 0xecaa, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe1fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf93f, 0xe4a1, 0x0000, 0xf3ab, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00cbd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xeed1, 0xe43c, 0x0000, 0xe29b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf3fd, 0x0000, 0xea4f, 0xf8ba, 0xf7b9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe262, 0x0000,
+ /* 98 */ 0xecab, 0xf0e0, 0x0000, 0x0000, 0x0000, 0xe29c, 0xe0f7, 0xeda5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe071, 0x0000, 0xe55c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf071, 0x0000, 0x0000, 0xe973, 0xeaad,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00cfc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5af, 0x0000, 0x0000, 0x0000, 0xe697, 0x0000,
+ /* 88 */ 0xedf8, 0x0000, 0x0000, 0xea50, 0xf133, 0x0000, 0xefcd, 0x0000,
+ /* 90 */ 0xf037, 0xeff6, 0xf8bb, 0x0000, 0xeee9, 0xf2cc, 0x0000, 0x0000,
+ /* 98 */ 0xe376, 0x0000, 0x0000, 0xea51, 0x0000, 0x0000, 0xed3c, 0x0000,
+ /* a0 */ 0x0000, 0xe75c, 0xf7f1, 0x0000, 0xe26f, 0xf834, 0xee42, 0x0000,
+ /* a8 */ 0xf89d, 0x0000, 0x0000, 0xf84d, 0xe158, 0xf2cd, 0xe5d5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf161, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00d3c ***/
+
+ /* 80 */ 0xed37, 0xf162, 0x0000, 0x0000, 0xf641, 0x0000, 0x0000, 0xe29d,
+ /* 88 */ 0x0000, 0x0000, 0xe361, 0xe0bf, 0x0000, 0xf1a4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1a8, 0xea52, 0xf672, 0xf1dc,
+ /* 98 */ 0xe997, 0xeb49, 0x0000, 0x0000, 0x0000, 0xe55e, 0x0000, 0xf545,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe4db, 0xe645, 0xf134, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xed76, 0x0000, 0xf3ea, 0x0000, 0x0000, 0x0000, 0xe0ec, 0xe0c0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf194, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00d7b ***/
+
+ /* 80 */ 0x0000, 0xe37a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf7f2, 0xf135, 0xe36f, 0x0000, 0xeeea, 0xe37b, 0xe961,
+ /* 90 */ 0xe8e9, 0xf9cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8d7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe871, 0x0000, 0xe646, 0x0000,
+ /* b8 */ 0xecdf, 0x0000, 0xea53, 0x0000, 0xea54, 0xe031,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00db9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf27c, 0x0000, 0x0000, 0xe4a3, 0xf247,
+ /* 88 */ 0xf75f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf058, 0xf248, 0xf3ac,
+ /* 90 */ 0xf3a5, 0xefce, 0x0000, 0x0000, 0x0000, 0xf7bc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xedf9, 0xf17a, 0xe9d6, 0xf1c2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf735, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedba,
+ /* b0 */ 0xe8d8, 0x0000, 0x0000, 0xe032, 0x0000, 0x0000, 0xe3cd, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf27d, 0x0000, 0x0000, 0x0000, 0xf17b, 0xea55,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00df9 ***/
+
+ /* 80 */ 0x0000, 0xece0, 0x0000, 0xe059, 0xf479, 0x0000, 0xe5ce, 0x0000,
+ /* 88 */ 0xf646, 0x0000, 0xe252, 0xe657, 0x0000, 0xecb4, 0x0000, 0xf3ad,
+ /* 90 */ 0x0000, 0xf072, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6c2, 0x0000,
+ /* 98 */ 0xf4a7, 0x0000, 0x0000, 0xe1ea, 0x0000, 0xf0ee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b2, 0xf9a5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf665, 0xe5e2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf745,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00e39 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe197, 0xf5b5, 0xed3d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeeeb, 0xf3d5, 0x0000, 0x0000, 0x0000, 0xf34b, 0x0000,
+ /* 90 */ 0x0000, 0xefb5, 0x0000, 0xe159, 0xf865, 0x0000, 0x0000, 0xebd4,
+ /* 98 */ 0x0000, 0x0000, 0xe6d6, 0x0000, 0x0000, 0xe951, 0x0000, 0xea56,
+ /* a0 */ 0xf891, 0xece1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf3, 0xe998,
+ /* b0 */ 0x0000, 0xe29e, 0x0000, 0xe8c4, 0x0000, 0xf793, 0x0000, 0x0000,
+ /* b8 */ 0xe974, 0x0000, 0xedef, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e580xx - offset 0x00e77 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe941, 0x0000, 0x0000, 0x0000, 0xe5d6, 0x0000,
+ /* 88 */ 0x0000, 0xf4da, 0x0000, 0xe0c1, 0x0000, 0xe8c3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe7fa, 0xe4ee, 0x0000, 0x0000, 0x0000, 0xf848, 0x0000,
+ /* 98 */ 0x0000, 0xf9a6, 0xf0ef, 0x0000, 0xf536, 0x0000, 0xe15a, 0xf4a8,
+ /* a0 */ 0x0000, 0xf4db, 0x0000, 0xe8a7, 0xf647, 0x0000, 0xe2e6, 0xf394,
+ /* a8 */ 0xe0da, 0x0000, 0xeed2, 0xe6c3, 0xf692, 0xef6e, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeda6, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e581xx - offset 0x00eb4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xede7, 0x0000, 0x0000, 0x0000, 0xe033,
+ /* 88 */ 0xe137, 0xf059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf746,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf835, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3ae, 0x0000, 0xf2ce, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ed, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf640, 0xf2cf, 0xefcf, 0x0000,
+ /* b8 */ 0xf6de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00ef4 ***/
+
+ /* 80 */ 0xe263, 0x0000, 0x0000, 0x0000, 0x0000, 0xe999, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe0f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeaa1, 0xe9e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ca, 0xefb6, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeeec, 0xf27e, 0x0000, 0xf4f0, 0x0000, 0xeabf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe15b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x00f33 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe351, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf562, 0xeb4a, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac0,
+ /* 90 */ 0x0000, 0xe270, 0x0000, 0x0000, 0x0000, 0xe962, 0xf9ea, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe698, 0x0000, 0x0000, 0x0000, 0xf05a, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef79, 0x0000, 0xecac,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe034, 0x0000, 0xe8f8, 0x0000, 0x0000, 0x0000, 0xea57,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00f73 ***/
+
+ /* 80 */ 0xf0f0, 0xf3d6, 0x0000, 0x0000, 0xede2, 0x0000, 0xe15c, 0x0000,
+ /* 88 */ 0x0000, 0xe0fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf073, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac1,
+ /* a0 */ 0x0000, 0xe67d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xefd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf249, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e3,
+ /* b8 */ 0x0000, 0x0000, 0xe3d3, 0x0000, 0xedf0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00fb3 ***/
+
+ /* 80 */ 0xef44, 0xf0c3, 0x0000, 0xf03a, 0xf89e, 0xf5f6, 0xf34c, 0xf9d4,
+ /* 88 */ 0xeb4b, 0xe253, 0x0000, 0xe34a, 0xf6ba, 0xe795, 0xf6cd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xed3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe56f, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe377, 0x0000, 0x0000, 0xf19f, 0x0000, 0xe43e,
+ /* a8 */ 0xf291, 0xe5d7, 0xf074, 0xf732, 0xe1eb, 0xe6bf, 0xf8b1, 0x0000,
+ /* b0 */ 0x0000, 0xe1ec, 0x0000, 0x0000, 0x0000, 0xe942, 0xe37c, 0xe29f,
+ /* b8 */ 0xf292, 0x0000, 0x0000, 0x0000, 0xe152, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00ff3 ***/
+
+ /* 80 */ 0xe37d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedf7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf4fc, 0x0000, 0x0000, 0xf232, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe7b3, 0x0000, 0x0000, 0xe796, 0x0000, 0xefb7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe23e, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe793, 0x0000, 0xe55f, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeda7, 0xe5d2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe639,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x01031 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf532, 0x0000, 0xf3d7, 0x0000,
+ /* 88 */ 0x0000, 0xe5d8, 0x0000, 0xf34d, 0xe6d0, 0xe560, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6cf, 0xf0ea, 0xf9eb, 0x0000,
+ /* a0 */ 0x0000, 0xe8ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf955, 0xe0c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d5, 0x0000,
+ /* b8 */ 0xf558, 0xef7a, 0xf5f3, 0x0000, 0x0000, 0xf7de, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x01071 ***/
+
+ /* 80 */ 0xe4ef, 0x0000, 0x0000, 0xf163, 0x0000, 0x0000, 0xe9c2, 0xf2b7,
+ /* 88 */ 0xeed4, 0x0000, 0xe05a, 0x0000, 0x0000, 0x0000, 0xe7fb, 0x0000,
+ /* 90 */ 0x0000, 0xf89f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe63a,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf59a, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f7, 0xe93c, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe6d7, 0xeaa2, 0x0000, 0x0000, 0x0000, 0xe24e, 0x0000,
+ /* b0 */ 0xe4f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf334, 0xebec,
+ /* b8 */ 0xe2e7, 0xf4cb, 0xf1a9, 0xe04e, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x010ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf591, 0x0000, 0x0000, 0x0000, 0xf65e,
+ /* 88 */ 0x0000, 0x0000, 0xea9d, 0xe34b, 0xe5b7, 0xf293, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf538, 0x0000, 0xe99a, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0a7, 0x0000, 0xe85e, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeb76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf1a5, 0xf294, 0x0000, 0x0000, 0x0000, 0x0000, 0xe99b,
+ /* b0 */ 0x0000, 0x0000, 0xf7dc, 0x0000, 0x0000, 0xf4dc, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf794, 0x0000, 0xf59b,
+
+ /*** Three byte table, leaf: e58axx - offset 0x010ee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf993, 0x0000, 0x0000, 0x0000, 0xe34c,
+ /* 88 */ 0xe8f9, 0xe6b1, 0x0000, 0x0000, 0x0000, 0xe0fc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf335, 0xe0fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe5f4, 0x0000, 0x0000, 0x0000, 0xe1ed,
+ /* a0 */ 0xe035, 0x0000, 0x0000, 0xe63b, 0xe352, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf34e, 0xe44d, 0xe134, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf846,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58bxx - offset 0x0112d ***/
+
+ /* 80 */ 0x0000, 0xe15d, 0x0000, 0xe89c, 0x0000, 0xf65f, 0x0000, 0xefb8,
+ /* 88 */ 0x0000, 0xe797, 0x0000, 0x0000, 0x0000, 0xe15e, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe6cd, 0x0000, 0x0000, 0xe561, 0xefed, 0x0000,
+ /* 98 */ 0xe07b, 0xe7e2, 0x0000, 0xf9b2, 0x0000, 0xecad, 0xe65c, 0xe7b4,
+ /* a0 */ 0x0000, 0x0000, 0xeba7, 0xf263, 0xe353, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf9b3, 0x0000, 0xe5e4, 0x0000, 0x0000,
+ /* b8 */ 0xe2e8, 0x0000, 0xf1c3, 0xe342, 0x0000, 0x0000, 0xe2a0, 0xe838,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x0116d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf760, 0x0000, 0x0000,
+ /* 88 */ 0xf9d6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf761, 0x0000, 0xf762,
+ /* 90 */ 0xe963, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e2, 0xf8f9, 0xe9c1,
+ /* 98 */ 0x0000, 0xecb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf1dd, 0xe254, 0x0000, 0xe0a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe9e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf96d,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe49d,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x011ad ***/
+
+ /* 80 */ 0xe2a1, 0xed38, 0x0000, 0xf546, 0xf1a0, 0x0000, 0x0000, 0xecae,
+ /* 88 */ 0xeeed, 0xf9c1, 0xe872, 0x0000, 0x0000, 0xe743, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe9e4, 0xf391, 0xf693, 0xf892, 0x0000, 0x0000, 0xe3f5,
+ /* 98 */ 0x0000, 0x0000, 0xe85f, 0x0000, 0xe964, 0x0000, 0xe936, 0x0000,
+ /* a0 */ 0xf2bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe25f, 0x0000,
+ /* a8 */ 0xeb69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7d6,
+ /* b0 */ 0xf164, 0xf05b, 0x0000, 0x0000, 0xe04f, 0xe5b0, 0x0000, 0xe2e9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3ed, 0x0000, 0xe15f,
+
+ /*** Three byte table, leaf: e58exx - offset 0x011ed ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed9a, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xed7d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6d8, 0x0000, 0xf9a7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf03b,
+ /* a0 */ 0xf642, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f0, 0xf7bd, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee96, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe0db, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x0122a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf4d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xefd1, 0xf4a9, 0xe370, 0xefd2, 0x0000, 0xe873, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec62, 0x0000, 0xf632, 0xebf4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe874, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeed5, 0xf5bf, 0xe2a2, 0xe1af, 0xe2a3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe1b0, 0xf3fe, 0xe333, 0xebaf, 0xf733, 0x0000, 0xe036,
+ /* b0 */ 0xf6bb, 0xf47a, 0xea58, 0xefd3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xea59, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x01267 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf9de, 0xe050, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7ea, 0xe3ce, 0xf264, 0x0000, 0xe562, 0xe7a3, 0xf9a8, 0xe6d9,
+ /* 90 */ 0xf6ce, 0xf84e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe2d6, 0x0000, 0xe6f0, 0x0000, 0xf0e1,
+ /* a0 */ 0xf755, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe99c, 0x0000,
+ /* a8 */ 0x0000, 0xe9c3, 0x0000, 0xf7df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeeef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf9e5, 0xf633, 0x0000, 0xe7fc, 0xf9a9, 0x0000, 0xeeee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e591xx - offset 0x012a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf2d0, 0x0000, 0xe1b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf6a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf3b2, 0x0000, 0xf3b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe1b2, 0x0000, 0xe83b, 0x0000, 0xe037, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xece2, 0xf8bc, 0xe7a4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e592xx - offset 0x012e6 ***/
+
+ /* 80 */ 0xf24a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf763, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8fa, 0x0000, 0xe2a4, 0x0000,
+ /* 90 */ 0xe99d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf673, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1aa, 0x0000, 0x0000, 0xf431, 0xe271, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf836, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf7e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf166, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01326 ***/
+
+ /* 80 */ 0xed7e, 0xf7a1, 0x0000, 0x0000, 0xf8ef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7eb, 0xf233, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf03c, 0x0000, 0x0000, 0x0000, 0xe038, 0x0000, 0x0000,
+ /* a8 */ 0xf59c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d6, 0xf998, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf559, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf764, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e594xx - offset 0x01362 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf736, 0x0000, 0xea5a, 0xf456,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6da, 0x0000,
+ /* 90 */ 0xe4d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe755, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf076,
+ /* b0 */ 0x0000, 0xf4dd, 0x0000, 0x0000, 0x0000, 0xed6a, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf674,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e595xx - offset 0x013a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf694, 0x0000, 0xeac2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fd,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe198, 0x0000, 0x0000, 0xe4ba, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed3f, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf7e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf336, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x013e1 ***/
+
+ /* 80 */ 0xe0d3, 0x0000, 0x0000, 0x0000, 0xeb4c, 0x0000, 0xf55a, 0xe59c,
+ /* 88 */ 0x0000, 0xf9aa, 0xf7e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf547, 0xf9c2, 0xf940, 0x0000, 0xf9ec, 0xe072, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9bd,
+ /* a8 */ 0x0000, 0xf077, 0xeac3, 0xe3d2, 0xe272, 0x0000, 0xe4a4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e597xx - offset 0x0141c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ab, 0x0000, 0xeae0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf457, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeef0, 0x0000, 0xe37e, 0x0000, 0x0000, 0xf4aa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xea5b, 0xf648, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf5, 0xf3b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x0145b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a3, 0x0000,
+ /* 88 */ 0x0000, 0xe039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a5, 0x0000, 0x0000, 0xeac4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb0,
+ /* b0 */ 0x0000, 0x0000, 0xf34f, 0x0000, 0xf634, 0x0000, 0xecb6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e599xx - offset 0x01492 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf856, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe391, 0x0000, 0x0000, 0xf9ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59axx - offset 0x014cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf999, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee4f, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea3d, 0x0000, 0xf84f, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedf1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59bxx - offset 0x01509 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe435, 0x0000, 0x0000, 0xf9ee, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xebf6, 0xea5c, 0x0000, 0x0000, 0xf96e, 0x0000,
+ /* a0 */ 0xf167, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe1dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe647, 0xe1b3, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59cxx - offset 0x01546 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf765, 0xedd8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe2ea, 0x0000, 0x0000, 0xe2d0, 0x0000, 0xf05c, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf03e, 0xf03d, 0x0000, 0x0000, 0xe4f1, 0x0000,
+ /* 98 */ 0xe4a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6cf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf234, 0x0000, 0x0000, 0x0000, 0x0000, 0xe334, 0x0000, 0x0000,
+ /* b0 */ 0xf432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe392, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x01586 ***/
+
+ /* 80 */ 0xf433, 0x0000, 0xf6f8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe343,
+ /* 88 */ 0x0000, 0x0000, 0xe8a9, 0x0000, 0x0000, 0xe4bb, 0xe07c, 0x0000,
+ /* 90 */ 0xf3a6, 0xe0d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf6e7, 0x0000, 0x0000, 0xe1de, 0x0000, 0xf6a4, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf750, 0x0000, 0x0000, 0x0000, 0xe4dd, 0x0000,
+ /* b0 */ 0xe160, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf695, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59exx - offset 0x015c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xebf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe4dc, 0x0000, 0x0000, 0xf8a0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf837, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf0d9, 0x0000, 0xe2a7, 0xf03f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59fxx - offset 0x01601 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xed91, 0x0000, 0x0000, 0x0000, 0xefb9,
+ /* 88 */ 0xf3d8, 0x0000, 0x0000, 0xe768, 0x0000, 0x0000, 0xeb94, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee44,
+ /* a0 */ 0xe99e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf4f1, 0x0000, 0x0000, 0x0000, 0xecd0, 0x0000, 0x0000, 0xf49d,
+ /* b8 */ 0x0000, 0xe8c6, 0xe393, 0x0000, 0xe394, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x01641 ***/
+
+ /* 80 */ 0xe2dc, 0x0000, 0xe4d1, 0x0000, 0x0000, 0xe141, 0xf6d8, 0x0000,
+ /* 88 */ 0xe0a8, 0xf0bc, 0xed4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf56c, 0x0000,
+ /* a0 */ 0x0000, 0xe952, 0x0000, 0x0000, 0xf337, 0x0000, 0x0000, 0xee50,
+ /* a8 */ 0x0000, 0x0000, 0xe07d, 0x0000, 0x0000, 0x0000, 0x0000, 0xef7b,
+ /* b0 */ 0xede8, 0xe953, 0x0000, 0x0000, 0xf1de, 0xe4f2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe199,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x0167c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe264, 0xeeab, 0x0000, 0x0000, 0x0000, 0xe0c3,
+ /* 90 */ 0x0000, 0xebb1, 0x0000, 0x0000, 0xf6b2, 0x0000, 0x0000, 0xe4f3,
+ /* 98 */ 0xe4d2, 0x0000, 0xf5c0, 0x0000, 0x0000, 0x0000, 0xeadd, 0x0000,
+ /* a0 */ 0x0000, 0xf295, 0xeef1, 0x0000, 0xf9b4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf458, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf4d2, 0x0000, 0x0000, 0xf296, 0x0000, 0xec63,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x016bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe161, 0x0000, 0xeaea, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xefba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe7d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5cd, 0x0000, 0xf3f2, 0xf857,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe7f8, 0xe552, 0x0000, 0x0000, 0x0000, 0x0000, 0xf675, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe9c5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xeef2, 0xf1df, 0x0000, 0x0000, 0xe05b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x016fa ***/
+
+ /* 80 */ 0x0000, 0xe8fa, 0x0000, 0x0000, 0x0000, 0xef45, 0x0000, 0xe4a6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9b5, 0x0000,
+ /* 90 */ 0x0000, 0xf7c9, 0x0000, 0xed72, 0x0000, 0xf8bd, 0x0000, 0x0000,
+ /* 98 */ 0xe6a4, 0xe255, 0x0000, 0x0000, 0x0000, 0x0000, 0xe265, 0xe676,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedbd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xea5d, 0xf195, 0x0000, 0x0000, 0xf1e0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf17c, 0xf8be, 0xeaeb, 0x0000, 0xebf8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x01738 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7be,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe395, 0xeb3a, 0xef72, 0x0000,
+ /* 98 */ 0x0000, 0xec64, 0xe49f, 0x0000, 0xeda8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe7d3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4de,
+ /* a8 */ 0x0000, 0xf548, 0xf6bc, 0xe99f, 0x0000, 0xef7c, 0xed77, 0x0000,
+ /* b0 */ 0x0000, 0xecf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf138,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf893,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x01777 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedf2, 0x0000, 0x0000, 0xe396,
+ /* 88 */ 0xe43f, 0xe975, 0x0000, 0x0000, 0x0000, 0x0000, 0xe335, 0xf3b4,
+ /* 90 */ 0xf941, 0xe19a, 0x0000, 0x0000, 0xe9c6, 0xf861, 0x0000, 0xf6df,
+ /* 98 */ 0x0000, 0x0000, 0xf838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf297, 0x0000, 0xea5e, 0x0000, 0x0000, 0x0000, 0x0000, 0xeef3,
+ /* a8 */ 0x0000, 0x0000, 0xf6ac, 0xf0c4, 0xf1e1, 0xeb3b, 0xe9c7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe443, 0xe44f, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe05c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8bf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x017b5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xedfd, 0xe9e5, 0xe75d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf196, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe397, 0x0000, 0x0000, 0xef7d, 0xe362,
+ /* 98 */ 0x0000, 0xe7d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf676, 0x0000, 0x0000,
+ /* a8 */ 0xe8aa, 0x0000, 0x0000, 0x0000, 0xf6e0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe769, 0x0000, 0xf533, 0x0000, 0x0000, 0xf56d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x017f4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf2d1, 0x0000, 0x0000, 0xe7b5, 0x0000,
+ /* 88 */ 0x0000, 0xf1ab, 0x0000, 0xecb7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf24b, 0xe1b4, 0x0000, 0xeb95, 0xf05d, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf197, 0xef7e, 0x0000, 0xe0a9, 0xf3af, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe05d, 0x0000,
+ /* a8 */ 0xf139, 0x0000, 0xf47b, 0x0000, 0xf9ef, 0x0000, 0xf7f3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xee51, 0x0000, 0x0000, 0xf168, 0x0000, 0x0000, 0x0000, 0xf1ac,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x01834 ***/
+
+ /* 80 */ 0x0000, 0xf05e, 0x0000, 0xef6f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xea5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe436, 0x0000, 0x0000, 0xeef4, 0xe3d6, 0x0000, 0x0000, 0xee52,
+ /* a0 */ 0xece3, 0x0000, 0x0000, 0x0000, 0x0000, 0xed40, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf635, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4de, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x01873 ***/
+
+ /* 80 */ 0x0000, 0xe6a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e8, 0x0000,
+ /* 88 */ 0x0000, 0xef56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe9e6, 0x0000, 0x0000, 0x0000, 0xe9a0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x018a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe76a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe83c, 0xf040, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecb8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5abxx - offset 0x018e0 ***/
+
+ /* 80 */ 0x0000, 0xe03a, 0xebf9, 0x0000, 0xf041, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf47c, 0x0000, 0x0000, 0xf87e, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf265, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f4, 0x0000,
+ /* a8 */ 0x0000, 0xe47c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5acxx - offset 0x0191b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8fb, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf9f0, 0x0000, 0xeb4d, 0xe273, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf756, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xea3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x0195b ***/
+
+ /* 80 */ 0xeac5, 0x0000, 0x0000, 0xedbe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf1ad, 0xf87a, 0x0000, 0x0000, 0xe1ee, 0xf1a6, 0x0000, 0xf1ae,
+ /* 98 */ 0xf37d, 0x0000, 0xe9a1, 0x0000, 0xf1af, 0xf99a, 0x0000, 0xe77b,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe19b, 0xe1b5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf839, 0x0000, 0xebdd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xec65, 0xf1cf, 0x0000, 0x0000, 0x0000, 0xe9a2, 0x0000, 0x0000,
+ /* b8 */ 0xf7ca, 0x0000, 0xf078, 0x0000, 0xeded,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01998 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4eb, 0x0000, 0xefd4,
+ /* 88 */ 0xebfa, 0xed5c, 0x0000, 0xebe4, 0xef57, 0x0000, 0x0000, 0xe26b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe965, 0x0000, 0xf6b5, 0xf995, 0xf395,
+ /* 98 */ 0xe23f, 0xf3b5, 0xf2d2, 0xef58, 0xf0f1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe0d4, 0xeb4e, 0xecf8, 0xf079, 0xf942, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeb96, 0x0000, 0xe2e0, 0x0000,
+ /* b0 */ 0xf235, 0x0000, 0x0000, 0xf83a, 0xee53, 0xebb2, 0xe03b, 0x0000,
+ /* b8 */ 0xece4, 0xefbb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec66,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x019d8 ***/
+
+ /* 80 */ 0xf4f2, 0x0000, 0xf266, 0xf042, 0xe398, 0xf169, 0xe85b, 0xe2a8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe76b, 0x0000, 0xf7ce, 0xefd5, 0xecd1, 0x0000, 0x0000, 0xe44c,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe73c, 0xf4cc,
+ /* a0 */ 0x0000, 0xe1fb, 0xf666, 0x0000, 0xeef5, 0xef91, 0xecf9, 0xe44b,
+ /* a8 */ 0xf4f3, 0xecfb, 0x0000, 0xea60, 0xe240, 0x0000, 0xe699, 0xf3d9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c1, 0xe954, 0x0000,
+ /* b8 */ 0xf5bb, 0x0000, 0xea61, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x01a17 ***/
+
+ /* 80 */ 0x0000, 0xe976, 0x0000, 0x0000, 0xea62, 0x0000, 0x0000, 0xf1e2,
+ /* 88 */ 0xf298, 0xf05f, 0xf37e, 0xecfc, 0x0000, 0xe4df, 0xe4f4, 0xebb3,
+ /* 90 */ 0x0000, 0xebb4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf563, 0x0000,
+ /* 98 */ 0x0000, 0xeac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xefd6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe8ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf636, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xecb9, 0xf0c5, 0xf539, 0xe1b6, 0xe49b, 0x0000, 0xe83d, 0xe473,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01a57 ***/
+
+ /* 80 */ 0xe2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0dc, 0xe19c, 0x0000,
+ /* 88 */ 0xe2dd, 0x0000, 0x0000, 0xef39, 0x0000, 0xecbb, 0xecba, 0x0000,
+ /* 90 */ 0x0000, 0xeb6a, 0x0000, 0x0000, 0x0000, 0xf299, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe943, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe4f5, 0x0000, 0xe6a6, 0x0000, 0xf645, 0xe6db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebd5, 0x0000, 0x0000, 0xe57a,
+ /* b0 */ 0x0000, 0xeaa3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9df,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01a91 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe399, 0xf1d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe0aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xed6b, 0x0000, 0xebfb, 0xe0a2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe4e0, 0x0000, 0xed4f, 0x0000, 0xf8c0, 0x0000, 0xe84e,
+ /* b8 */ 0xed5d, 0x0000, 0xe649, 0x0000, 0x0000, 0x0000, 0xf2c0, 0x0000,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x01ad1 ***/
+
+ /* 80 */ 0xebfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf649, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xed41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe977,
+ /* b0 */ 0xe978, 0x0000, 0x0000, 0x0000, 0xf866, 0x0000, 0xe4f6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf3da, 0x0000, 0xf894,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x01b0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec9f,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cf, 0xe39a, 0x0000,
+ /* 90 */ 0x0000, 0xe1df, 0x0000, 0x0000, 0xf5cb, 0x0000, 0xed92, 0xe0ab,
+ /* 98 */ 0x0000, 0xe6c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca0,
+ /* a8 */ 0x0000, 0xe9da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01b44 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe83e, 0xe07e, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe5b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeca1, 0x0000, 0x0000, 0xef73, 0x0000, 0x0000, 0xf4ab,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01b7d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe593, 0x0000, 0x0000,
+ /* a0 */ 0xe274, 0x0000, 0xef94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xedf5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xeeae, 0x0000, 0xe64a, 0x0000, 0xeaec, 0xed50,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01bbb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef74, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe745, 0x0000, 0x0000, 0x0000, 0xed6c, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf549, 0xf3b6, 0x0000,
+ /* a0 */ 0x0000, 0xec6e, 0xebb5, 0x0000, 0x0000, 0xe1ef, 0xf3a7, 0xe275,
+ /* a8 */ 0xe0dd, 0x0000, 0x0000, 0xe7e3, 0x0000, 0x0000, 0xf4ac, 0x0000,
+ /* b0 */ 0x0000, 0xe39b, 0xf13b, 0xea63, 0xf6e9, 0x0000, 0x0000, 0xf7f5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebde, 0xe0ee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01bfa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xecbc, 0xf766, 0x0000, 0x0000, 0xe8ee, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf6b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf56e, 0x0000,
+ /* 98 */ 0x0000, 0xf47d, 0x0000, 0xe8d9, 0x0000, 0xf338, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebfd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xea64, 0x0000, 0xeb3c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf1e3, 0x0000, 0x0000, 0xe4e1, 0x0000,
+ /* b8 */ 0xeac8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b6, 0x0000, 0xf9ac,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01c3a ***/
+
+ /* 80 */ 0xf2d3, 0x0000, 0x0000, 0x0000, 0xed51, 0xf77b, 0x0000, 0xe8ac,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf956, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe73d, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf64a,
+ /* a0 */ 0x0000, 0xe8df, 0xe4d3, 0xf757, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe05e, 0xf751, 0xe444, 0x0000, 0x0000, 0xe944,
+ /* b8 */ 0xf849, 0xe05f, 0x0000, 0xf943, 0xf07a, 0xf07b, 0xe39c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01c79 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e4, 0x0000, 0x0000, 0xe9e7,
+ /* 88 */ 0x0000, 0x0000, 0xeac9, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaed,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf24c, 0x0000, 0xf2c1,
+ /* 98 */ 0x0000, 0x0000, 0xe162, 0x0000, 0xe9a4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeaca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f8, 0xf3a8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe1b7, 0x0000, 0xf2d4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed6d, 0xeaee, 0xe0ac,
+ /* b8 */ 0xefbc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf07c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01cb8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xeacb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7bf, 0xe63f, 0xe5c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe2aa, 0x0000, 0x0000, 0xe239, 0x0000, 0x0000, 0xe69a, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3b7, 0xf29a, 0x0000, 0x0000, 0x0000, 0xe7d9,
+ /* a0 */ 0xf4df, 0x0000, 0xf758, 0xe256, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf576, 0x0000, 0x0000, 0xee55, 0xf2d5,
+ /* b8 */ 0x0000, 0x0000, 0xe0ef, 0xf96f, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01cf7 ***/
+
+ /* 80 */ 0x0000, 0xe937, 0x0000, 0x0000, 0xe677, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf759, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd2,
+ /* 90 */ 0x0000, 0xecbd, 0x0000, 0xe2e1, 0xf350, 0xf16a, 0x0000, 0xe9d7,
+ /* 98 */ 0xf8f0, 0x0000, 0x0000, 0xf13c, 0x0000, 0x0000, 0x0000, 0xf339,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf867, 0xf8c1,
+ /* a8 */ 0x0000, 0xe450, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xedb0, 0x0000, 0x0000, 0x0000, 0xf1e5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe0ad, 0x0000, 0xf7b0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01d34 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf6a5, 0x0000, 0xe0ae, 0x0000, 0xe83f, 0x0000, 0xe746, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a7, 0xf8b2,
+ /* 98 */ 0x0000, 0xf9c4, 0x0000, 0xf13d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf8a1, 0x0000, 0x0000, 0x0000, 0xede9, 0xefee,
+ /* a8 */ 0x0000, 0xf4f4, 0xf795, 0xf351, 0xea3f, 0xf740, 0x0000, 0x0000,
+ /* b0 */ 0xf4e0, 0xeeaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ad,
+ /* b8 */ 0x0000, 0xee45, 0x0000, 0x0000, 0xf7a8, 0x0000, 0x0000, 0xe9d8,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01d74 ***/
+
+ /* 80 */ 0xef69, 0xf2d6, 0x0000, 0x0000, 0x0000, 0xe4e2, 0x0000, 0xec6f,
+ /* 88 */ 0x0000, 0x0000, 0xf970, 0xe6c8, 0xf9ad, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeaef, 0xe163, 0xe4f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe592,
+ /* 98 */ 0xe8c7, 0xea65, 0x0000, 0x0000, 0x0000, 0x0000, 0xf396, 0x0000,
+ /* a0 */ 0xe5d0, 0xedd9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf957, 0xe966, 0xec70, 0x0000, 0x0000, 0x0000, 0xe840, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a3, 0x0000, 0xe4ec,
+ /* b8 */ 0x0000, 0xf55b, 0x0000, 0x0000, 0x0000, 0xf9c5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01db2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xecfd, 0x0000, 0xf7b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe39d, 0xf16b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5bc, 0xf434,
+ /* 98 */ 0xe75e, 0xe75f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf671, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe447, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ec, 0x0000, 0xe9c8,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01df2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed78,
+ /* 90 */ 0x0000, 0x0000, 0xe451, 0x0000, 0x0000, 0x0000, 0xf767, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe64b, 0xea66, 0x0000, 0x0000,
+ /* a0 */ 0xf6bd, 0xf13e, 0x0000, 0x0000, 0x0000, 0xe371, 0x0000, 0xeb97,
+ /* a8 */ 0xf043, 0x0000, 0xe266, 0x0000, 0x0000, 0x0000, 0x0000, 0xe135,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x01e31 ***/
+
+ /* 80 */ 0x0000, 0xf198, 0xec71, 0xecbe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf958, 0x0000, 0x0000,
+ /* 90 */ 0xe1f0, 0x0000, 0xf7f6, 0x0000, 0x0000, 0xeaf0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xedbf, 0x0000, 0x0000, 0x0000, 0xe24f, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf971, 0xf1b0, 0xf9d1, 0xf64b, 0x0000, 0x0000,
+ /* a8 */ 0xf7cf, 0xf0da, 0xe051, 0x0000, 0xe448, 0xe1f1, 0x0000, 0xecd3,
+ /* b0 */ 0xf9e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e682xx - offset 0x01e6c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee7d, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xecfa, 0x0000, 0x0000, 0xf33a, 0xf7d0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf972, 0x0000, 0xf737, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xebe5, 0xf29b, 0x0000, 0x0000, 0x0000, 0xeef6,
+ /* a0 */ 0xf07d, 0x0000, 0x0000, 0xf944, 0xf5c2, 0x0000, 0x0000, 0xe6dc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf397, 0x0000, 0xe9e8, 0xe4ed, 0xf5fc, 0x0000, 0xe84f, 0x0000,
+ /* b8 */ 0xe19d, 0x0000, 0x0000, 0x0000, 0xe4fa, 0xf534,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01eaa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d7, 0x0000, 0xe553,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf8e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf8ed, 0x0000, 0xeb3d, 0x0000, 0x0000, 0xf07e,
+ /* a0 */ 0xf8b3, 0xed52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf677, 0xe46d, 0x0000, 0xeacc, 0x0000, 0x0000, 0xf959, 0x0000,
+ /* b8 */ 0x0000, 0xeda9, 0xeb98, 0xf643, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e684xx - offset 0x01ee9 ***/
+
+ /* 80 */ 0x0000, 0xebfe, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f0, 0x0000,
+ /* 88 */ 0xf091, 0xf092, 0x0000, 0x0000, 0x0000, 0xe850, 0xf744, 0xf0f2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed53, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xefd7, 0xed93, 0x0000, 0x0000, 0x0000, 0xe091,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe267,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf95a, 0x0000, 0x0000, 0x0000, 0xf4e1, 0x0000, 0x0000, 0xe0c4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xece5, 0x0000, 0xe0c5, 0xf044,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01f29 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xefbd, 0x0000, 0xe6c9, 0x0000, 0x0000, 0xf0db,
+ /* 88 */ 0xf1b1, 0x0000, 0xe153, 0xf6be, 0xf95b, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf796, 0x0000, 0xe7b7, 0x0000, 0x0000,
+ /* 98 */ 0xf4d3, 0xf4d4, 0x0000, 0x0000, 0x0000, 0xf6e4, 0x0000, 0xf6d1,
+ /* a0 */ 0x0000, 0x0000, 0xe747, 0xe241, 0xe052, 0x0000, 0x0000, 0xf8b4,
+ /* a8 */ 0xe0c6, 0x0000, 0x0000, 0xf398, 0x0000, 0x0000, 0xe5e7, 0x0000,
+ /* b0 */ 0xf060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe164, 0xe0af,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf53a, 0xefaf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x01f68 ***/
+
+ /* 80 */ 0x0000, 0xf5c3, 0xefd8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe9e9, 0x0000, 0x0000, 0x0000, 0xf3f3, 0x0000,
+ /* 90 */ 0xe5fb, 0xea4b, 0x0000, 0x0000, 0xf59d, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf9f3, 0xf9f2, 0xf6a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c9, 0x0000, 0x0000, 0xe563,
+ /* a8 */ 0x0000, 0xe138, 0x0000, 0xe851, 0xe165, 0x0000, 0xe7e4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf85a, 0x0000, 0x0000, 0x0000, 0xede3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe4bc, 0x0000, 0x0000, 0x0000, 0xe092,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x01fa7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe354, 0x0000, 0x0000, 0x0000, 0xe060,
+ /* 88 */ 0xf83b, 0xf0eb, 0xeef8, 0xe7e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf4a4, 0x0000, 0x0000, 0x0000, 0xe59d, 0xf973,
+ /* b8 */ 0xf868, 0x0000, 0xf4d5, 0x0000, 0xe2ab, 0x0000, 0x0000, 0xf0f3,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01fe7 ***/
+
+ /* 80 */ 0xe5fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d4,
+ /* 88 */ 0xe1fc, 0x0000, 0xe7e6, 0x0000, 0xec9b, 0xec31, 0xf0d4, 0x0000,
+ /* 90 */ 0xeb99, 0xed42, 0xe19e, 0x0000, 0x0000, 0x0000, 0xf8e4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf53b, 0x0000, 0x0000, 0x0000, 0x0000, 0xe34d,
+ /* a0 */ 0x0000, 0xe093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf2b8, 0x0000, 0x0000, 0x0000, 0xe6c0, 0x0000,
+ /* b0 */ 0xf29c, 0xf9f4, 0x0000, 0x0000, 0xe4e3, 0x0000, 0xf8c2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e8, 0xe8ae,
+
+ /*** Three byte table, leaf: e689xx - offset 0x02027 ***/
+
+ /* 80 */ 0xebb6, 0xf747, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb4f,
+ /* 88 */ 0xf8c3, 0xe9ea, 0x0000, 0xec32, 0x0000, 0xf236, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf678, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf697, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ca, 0x0000,
+ /* b0 */ 0x0000, 0xe372, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a6, 0x0000,
+ /* b8 */ 0x0000, 0xe9eb, 0x0000, 0x0000, 0xed9b, 0x0000, 0x0000, 0xecaf,
+
+ /*** Three byte table, leaf: e68axx - offset 0x02067 ***/
+
+ /* 80 */ 0xe39e, 0x0000, 0x0000, 0x0000, 0xf59e, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe14c, 0xf6ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xede4, 0xeaf1, 0x0000, 0x0000, 0xf6e1, 0x0000, 0xf7f7,
+ /* 98 */ 0xf2b9, 0x0000, 0x0000, 0xf768, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf769, 0x0000, 0x0000, 0x0000, 0xf24d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe756, 0x0000, 0x0000, 0xed73, 0xf5ce,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x020a5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9d9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e7,
+ /* 88 */ 0xe449, 0xe5c3, 0x0000, 0x0000, 0xe875, 0xe860, 0x0000, 0xe3d9,
+ /* 90 */ 0xe268, 0x0000, 0xe0de, 0xf53c, 0xe89d, 0x0000, 0xf679, 0xef95,
+ /* 98 */ 0xe2ac, 0xf392, 0x0000, 0xf59f, 0xe8c8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe250, 0xecd4, 0xe3cf, 0xf3f5,
+ /* b0 */ 0x0000, 0xe1f2, 0x0000, 0xe2eb, 0x0000, 0x0000, 0x0000, 0xe1b8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca6, 0xe3da,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x020e5 ***/
+
+ /* 80 */ 0x0000, 0xf435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf436,
+ /* 88 */ 0x0000, 0xed5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe4fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf3a9, 0x0000, 0x0000, 0x0000, 0xf459,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf2d8, 0xee59, 0x0000, 0xe748, 0xf895,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68dxx - offset 0x02124 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf4b5, 0x0000, 0x0000, 0xf734, 0x0000, 0x0000, 0xe3f3,
+ /* 90 */ 0xee58, 0x0000, 0x0000, 0x0000, 0x0000, 0xf76a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe979,
+ /* a8 */ 0xea67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0df, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe2ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xf56f,
+ /* b8 */ 0x0000, 0x0000, 0xe3f4, 0xe44a, 0x0000, 0x0000, 0x0000, 0xeaf2,
+
+ /*** Three byte table, leaf: e68exx - offset 0x02164 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xebb7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xec33, 0xe4fc, 0x0000, 0x0000, 0xf1e6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe8c9, 0x0000, 0x0000, 0x0000, 0xed9c, 0x0000,
+ /* 98 */ 0xe2de, 0x0000, 0x0000, 0xe260, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe5d3, 0xf4f5, 0xf6ae, 0x0000, 0x0000, 0xf2c8, 0x0000, 0xe1f3,
+ /* a8 */ 0xf5cf, 0xedf3, 0xf352, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x021a4 ***/
+
+ /* 80 */ 0xe061, 0x0000, 0x0000, 0x0000, 0xf093, 0x0000, 0xe336, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7da,
+ /* 90 */ 0xf33b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xedc0, 0xf945, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xed54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe139, 0xf9c6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf045, 0x0000, 0xedaa, 0xeaba,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x021dc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebdf, 0x0000, 0xe861,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebb8, 0x0000, 0xef96, 0xe4fd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec34, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf45a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe876, 0xf6b3, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf9cd, 0x0000, 0x0000, 0x0000, 0xf4b6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x0221b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf267, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe734, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf437,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe7b8, 0xe7b9, 0xf2c9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x02256 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe65e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf6cb, 0xeaae, 0xef97, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe445, 0x0000, 0x0000, 0x0000, 0xe4d5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf55c, 0xe89e, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe7e8, 0x0000, 0xf6eb, 0xf5c9, 0x0000,
+ /* b0 */ 0xf4bc, 0x0000, 0xe862, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe4b5, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e693xx - offset 0x02295 ***/
+
+ /* 80 */ 0x0000, 0xef46, 0x0000, 0x0000, 0xe65f, 0xf54a, 0x0000, 0xf6c9,
+ /* 88 */ 0x0000, 0x0000, 0xe13a, 0x0000, 0x0000, 0xf353, 0xe166, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe363, 0x0000, 0xe4bd, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe8fb, 0x0000, 0xe0e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe4e4, 0xf699, 0x0000, 0x0000, 0xe5ba, 0xf4cd, 0xe0e1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf53d, 0x0000, 0xf93a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf6ec, 0x0000, 0x0000, 0x0000, 0xef98, 0x0000,
+
+ /*** Three byte table, leaf: e694xx - offset 0x022d5 ***/
+
+ /* 80 */ 0xe877, 0x0000, 0x0000, 0x0000, 0xf6cc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xedc1, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb7e, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe5fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe276, 0xf93b, 0xe5bb, 0x0000, 0x0000, 0xf438,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec35, 0xe1b9,
+ /* b8 */ 0xf094, 0xe0c7, 0x0000, 0xe1f4, 0x0000, 0x0000, 0xe8af, 0xf2d9,
+
+ /*** Three byte table, leaf: e695xx - offset 0x02315 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ba, 0x0000, 0x0000,
+ /* 88 */ 0xf99b, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaf3, 0xe277, 0xe852,
+ /* 90 */ 0x0000, 0xe2ad, 0x0000, 0x0000, 0x0000, 0x0000, 0xeef9, 0xf738,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4e2, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe094, 0xeaa4, 0x0000, 0x0000, 0xe554, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe167, 0xedc2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe1bb, 0x0000, 0xf2da, 0xf268, 0x0000, 0xe9a7,
+ /* b8 */ 0xec36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb50,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x02354 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe640, 0xf75a, 0x0000, 0xf99c, 0x0000, 0xe7fe,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea40, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe9ec, 0xe878, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe570,
+ /* 98 */ 0x0000, 0xe69b, 0x0000, 0xe1d7, 0xea68, 0x0000, 0x0000, 0xf49a,
+ /* a0 */ 0x0000, 0xed66, 0x0000, 0x0000, 0xe355, 0xf53e, 0x0000, 0xe9a8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1c5, 0xf4d6, 0x0000, 0x0000, 0xea69,
+ /* b0 */ 0xece6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a8,
+ /* b8 */ 0x0000, 0xe8b0, 0x0000, 0x0000, 0xedda, 0xecbf, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e697xx - offset 0x02393 ***/
+
+ /* 80 */ 0x0000, 0xe8b1, 0x0000, 0x0000, 0x0000, 0xe5e9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xeb51, 0xf2db, 0x0000, 0x0000, 0xf379,
+ /* 90 */ 0x0000, 0x0000, 0xe6b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe39f,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe7e9, 0x0000, 0x0000, 0xe3a0, 0x0000, 0xf17d, 0xe4a9, 0x0000,
+ /* a8 */ 0xf439, 0xf354, 0x0000, 0x0000, 0xec72, 0xefef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf7d1, 0x0000, 0x0000, 0xefd9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xef6a, 0xe853, 0xe854, 0xe555, 0x0000, 0xeefa,
+
+ /*** Three byte table, leaf: e698xx - offset 0x023d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e0, 0xecb0,
+ /* 88 */ 0x0000, 0xe8b2, 0xf8c4, 0x0000, 0xf4e3, 0x0000, 0xe7a5, 0xf8e7,
+ /* 90 */ 0xe9cb, 0xe364, 0x0000, 0xee46, 0xeb3e, 0xf9da, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe945, 0xeb9a,
+ /* a0 */ 0xeeb1, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f0, 0x0000, 0xe76c,
+ /* a8 */ 0xf1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb9, 0x0000, 0xecc0,
+ /* b0 */ 0xf7c0, 0xeff0, 0x0000, 0x0000, 0xe7db, 0x0000, 0xf4e4, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe946, 0xed79, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e699xx - offset 0x02412 ***/
+
+ /* 80 */ 0x0000, 0xf355, 0xecc1, 0xf95c, 0xf95d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf45b, 0x0000, 0xf45c, 0x0000, 0x0000, 0x0000, 0xed5f,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf3db, 0x0000, 0xf869, 0x0000, 0xf3b8, 0xf9f5, 0xeb9b,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeefb, 0xf947, 0xf974, 0xf8c5,
+ /* a8 */ 0xece7, 0xe749, 0x0000, 0xf69a, 0x0000, 0x0000, 0xe955, 0xe168,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeb3f, 0xf577, 0x0000, 0xf2dc, 0xe2fc,
+ /* b8 */ 0xf2dd, 0x0000, 0xf43a, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69axx - offset 0x0244e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9be, 0x0000, 0x0000, 0xe03c,
+ /* 88 */ 0xf9bb, 0xf9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeb2, 0x0000,
+ /* 90 */ 0xf061, 0xeaf4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ec, 0xed6e,
+ /* 98 */ 0xedc3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a6, 0x0000, 0x0000,
+ /* a0 */ 0xe1bc, 0x0000, 0xf4e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1d5, 0x0000, 0x0000, 0xe7ba, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf1e7, 0xf8b5, 0xf77c, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeb77, 0x0000, 0xe169, 0x0000, 0x0000, 0xe556,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69bxx - offset 0x0248d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeea5, 0x0000, 0xe5f5, 0xe4be,
+ /* 88 */ 0x0000, 0xf99d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed94, 0x0000,
+ /* 98 */ 0x0000, 0xeaf5, 0x0000, 0x0000, 0xef9a, 0xf77d, 0x0000, 0x0000,
+ /* a0 */ 0xe257, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xef68, 0x0000, 0xe1d8, 0xeed6, 0xe16a, 0x0000, 0x0000, 0xe073,
+ /* b8 */ 0xeaf6, 0xf357, 0xf356, 0x0000, 0xe74a, 0x0000, 0xf3f4, 0xf592,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x024cd ***/
+
+ /* 80 */ 0xf5cc, 0x0000, 0x0000, 0xf975, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf055, 0xf095, 0x0000, 0xe9db, 0x0000, 0xe967, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea9f, 0xf49b, 0x0000, 0xe5c7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe760, 0x0000, 0xf358, 0xe3a1, 0xe3a2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7d4, 0xe678,
+ /* a8 */ 0xe7ca, 0x0000, 0xe841, 0xe757, 0xe972, 0xf4ce, 0xf5f4, 0x0000,
+ /* b0 */ 0x0000, 0xf3b9, 0x0000, 0x0000, 0xe863, 0x0000, 0xf67a, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe2f5, 0x0000, 0x0000, 0xf9ae,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69dxx - offset 0x0250b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe062, 0x0000,
+ /* 88 */ 0x0000, 0xeab4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6dd, 0xf84a,
+ /* 90 */ 0xf237, 0xf5bd, 0x0000, 0xf797, 0x0000, 0x0000, 0xf1e8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe571, 0x0000, 0xe3a3, 0xebd6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f8, 0x0000, 0xe8ca,
+ /* b0 */ 0xe0f9, 0xe564, 0x0000, 0xe7dc, 0x0000, 0xf24e, 0x0000, 0xf6ed,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe47e, 0x0000, 0x0000, 0xebe6, 0xf6f9,
+
+ /*** Three byte table, leaf: e69exx - offset 0x0254b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ed,
+ /* 88 */ 0x0000, 0xef6b, 0x0000, 0xe8b3, 0x0000, 0x0000, 0x0000, 0xe3f7,
+ /* 90 */ 0xeb40, 0x0000, 0x0000, 0xe572, 0x0000, 0xf667, 0x0000, 0xe6f9,
+ /* 98 */ 0x0000, 0x0000, 0xe76d, 0x0000, 0xe1fd, 0xf43b, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1bd,
+ /* b0 */ 0xf752, 0x0000, 0x0000, 0xf43c, 0x0000, 0x0000, 0xe03d, 0xe03e,
+ /* b8 */ 0xe2ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecc2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69fxx - offset 0x0258a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe947, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8da,
+ /* 90 */ 0xe7bb, 0xe095, 0xf663, 0xee9a, 0xf097, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf098, 0x0000, 0x0000, 0xf69b, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2af, 0x0000, 0x0000, 0xe063, 0x0000, 0x0000, 0xe03f,
+ /* b0 */ 0xe440, 0xf3ba, 0x0000, 0xe6b3, 0xecc3, 0xf4fd, 0xea6a, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xea6b, 0x0000, 0x0000, 0xf2de,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x025c9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xec73, 0xf29d, 0x0000, 0x0000, 0xeaf7, 0xe6ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe278, 0xe8db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf3bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf847, 0xe356, 0x0000, 0x0000, 0xe13b, 0xf238, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02609 ***/
+
+ /* 80 */ 0xe0fa, 0xf7f9, 0xe19f, 0xe4fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xed60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf47e, 0x0000,
+ /* 90 */ 0xe565, 0xeacd, 0x0000, 0xf948, 0xe3d0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf45d, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe064,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02649 ***/
+
+ /* 80 */ 0x0000, 0xe5d9, 0x0000, 0x0000, 0x0000, 0xe76e, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf239, 0xf64c, 0x0000, 0x0000, 0xe16b,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf359, 0x0000, 0xf99e,
+ /* a0 */ 0x0000, 0xef59, 0xf5a0, 0x0000, 0x0000, 0x0000, 0x0000, 0xeefc,
+ /* a8 */ 0xe6de, 0x0000, 0x0000, 0x0000, 0x0000, 0xea6c, 0x0000, 0xf33c,
+ /* b0 */ 0xe1a0, 0xe1e1, 0x0000, 0xebba, 0x0000, 0xe8ef, 0xe842, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02685 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a5, 0xe948, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe798, 0x0000, 0xe3a4, 0x0000, 0xe1e2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe97a, 0x0000, 0x0000, 0xf399, 0x0000, 0xf35a,
+ /* 98 */ 0xe34e, 0x0000, 0xe9dc, 0x0000, 0x0000, 0x0000, 0x0000, 0xe566,
+ /* a0 */ 0xe4d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d0,
+ /* a8 */ 0xe1a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeab5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeaf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe531, 0xe242, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x026c5 ***/
+
+ /* 80 */ 0xef5a, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd5, 0xf5d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xedab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee5b, 0x0000, 0xf5f1,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02705 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xedc5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf7a3, 0xeb6b, 0xf67b, 0x0000, 0xe0f1,
+ /* 98 */ 0x0000, 0xe7ea, 0xf5a2, 0x0000, 0x0000, 0x0000, 0xe6d1, 0x0000,
+ /* a0 */ 0xe3f8, 0xf09a, 0xf09b, 0xe843, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf2df, 0x0000, 0x0000, 0xf3ef, 0x0000, 0xedf6, 0xf24f, 0xec74,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe34f, 0x0000, 0xf83c,
+ /* b8 */ 0xf5d1, 0xeeb3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x0273f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefbe, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf45e, 0xe8b4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf95e, 0x0000, 0xe9ee,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeb4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6b4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf6b4, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x0277e ***/
+
+ /* 80 */ 0x0000, 0xe1be, 0x0000, 0xe879, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe2b0, 0xf6d9, 0xf4e6, 0x0000, 0x0000,
+ /* 90 */ 0xe269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe23a, 0x0000, 0xe0c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe337, 0x0000, 0xf35b, 0x0000, 0xe357,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x027be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xed55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe8e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe5da, 0x0000, 0xe6a7, 0x0000, 0x0000, 0x0000, 0xf250,
+ /* 98 */ 0x0000, 0xf798, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d2, 0xf1e9,
+ /* a0 */ 0x0000, 0xe7bc, 0x0000, 0xedc6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a3, 0x0000, 0x0000,
+ /* b8 */ 0xe864, 0xec37, 0xf8fc, 0x0000, 0x0000, 0xf3dc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x027fc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe096, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xef9c, 0x0000, 0x0000, 0xe279, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeff8, 0xec75, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe349, 0xe594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a6,
+ /* a0 */ 0x0000, 0xeace, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf996, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x0283c ***/
+
+ /* 80 */ 0xe4aa, 0x0000, 0x0000, 0x0000, 0xe13c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2e0, 0x0000, 0x0000, 0x0000, 0xede5, 0xe365, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8fc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf976, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe0fe, 0xf1ea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xea41, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf7e3, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x0287a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe532, 0xe2f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe660, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5ea, 0xf3ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf85b, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeda1,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x028b6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe2ed, 0x0000, 0xf1eb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5b2, 0x0000, 0x0000, 0x0000, 0xe5bc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf9e2, 0xf4ad, 0x0000, 0xf9db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xefb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe3a7, 0x0000, 0x0000, 0xf9e3, 0xe243,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x028f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9e4, 0xf85e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe040, 0x0000, 0xf6a7, 0x0000,
+ /* 90 */ 0xe2b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee32,
+ /* a0 */ 0x0000, 0xf946, 0xf43d, 0xf2e1, 0xf4ae, 0xe956, 0xe7eb, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xef70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeba8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f6,
+ /* b8 */ 0xe2fd, 0x0000, 0x0000, 0xea6d, 0x0000, 0x0000, 0x0000, 0xe7d1,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02935 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xed7a, 0xf45f, 0x0000, 0xf6bf, 0x0000,
+ /* 88 */ 0x0000, 0xec76, 0xec38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd6, 0x0000,
+ /* 98 */ 0xf1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe641, 0xea42,
+ /* b0 */ 0x0000, 0x0000, 0xeb78, 0x0000, 0x0000, 0xe4ab, 0x0000, 0xf0dc,
+ /* b8 */ 0x0000, 0x0000, 0xeaaf, 0x0000, 0xe053, 0x0000, 0x0000, 0xf29e,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x02975 ***/
+
+ /* 80 */ 0x0000, 0xf9c3, 0x0000, 0x0000, 0x0000, 0xf0f6, 0xe2b2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe7ec, 0x0000, 0xe7bd, 0x0000, 0xe76f,
+ /* 90 */ 0x0000, 0x0000, 0xe548, 0xf0be, 0xe9ef, 0x0000, 0xe9f0, 0xe9f1,
+ /* 98 */ 0xe9f2, 0x0000, 0x0000, 0xe7be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf8c6, 0xe2b3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x029ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf29f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed3b,
+ /* 90 */ 0x0000, 0xe855, 0x0000, 0xe77c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec39, 0x0000, 0x0000, 0xea4c,
+ /* b8 */ 0xeeb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f0, 0x0000,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x029ed ***/
+
+ /* 80 */ 0xf2e2, 0xf3f0, 0xe2b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f1, 0x0000,
+ /* 90 */ 0xeb41, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaa5, 0x0000, 0xf7d2,
+ /* 98 */ 0x0000, 0x0000, 0xeefd, 0x0000, 0x0000, 0xee33, 0xf8f1, 0xe0b0,
+ /* a0 */ 0xf43e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe1e7, 0x0000, 0xef6c, 0x0000, 0x0000, 0xeed7, 0x0000, 0x0000,
+ /* b0 */ 0xf6c0, 0x0000, 0xe373, 0x0000, 0x0000, 0x0000, 0xe831, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe14d, 0x0000, 0x0000, 0xe3a9, 0xe9cc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02a2c ***/
+
+ /* 80 */ 0x0000, 0xecfe, 0xe3aa, 0xef3a, 0x0000, 0xf046, 0xf7fa, 0xee5c,
+ /* 88 */ 0xf668, 0x0000, 0x0000, 0x0000, 0xe557, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe7cb, 0x0000, 0xe7d2, 0xe4cb, 0xe799, 0xe839, 0xf5f8, 0x0000,
+ /* 98 */ 0x0000, 0xea6e, 0xf43f, 0xf739, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe758, 0x0000, 0x0000, 0xf251, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf7c1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe9f3, 0xf09c, 0x0000, 0xf64d, 0xebbb, 0xe1bf, 0xf564, 0xee5d,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02a6c ***/
+
+ /* 80 */ 0x0000, 0xf95f, 0xf8a2, 0x0000, 0xeb6c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf54b, 0xe865, 0x0000, 0xf7b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf8f2, 0x0000, 0xe8f6, 0x0000, 0xea6f,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe8f2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf76c, 0xf6ee, 0xf0e8, 0x0000, 0xe49c, 0x0000, 0x0000,
+ /* a8 */ 0xf3bc, 0x0000, 0x0000, 0xf86a, 0x0000, 0x0000, 0xe87a, 0xe856,
+ /* b0 */ 0xf6c1, 0x0000, 0x0000, 0xeeb6, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x02aa1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xedc7, 0xe63c, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba9,
+ /* 98 */ 0x0000, 0xec3a, 0x0000, 0xe5a6, 0x0000, 0x0000, 0xe567, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf460, 0x0000, 0xf09d,
+ /* a8 */ 0x0000, 0xeb6d, 0xf8f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf3bd, 0x0000, 0x0000, 0xec77, 0xf9d7, 0x0000,
+ /* b8 */ 0xe258, 0xf047, 0x0000, 0xf950, 0x0000, 0xf9e7, 0xf6ef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x02ae0 ***/
+
+ /* 80 */ 0x0000, 0xe6b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf2ba, 0xf3dd, 0x0000, 0xea43, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xef5b, 0x0000, 0x0000, 0xf76d, 0x0000,
+ /* a8 */ 0x0000, 0xf8c7, 0xe5c8, 0x0000, 0xe6df, 0x0000, 0xe9a9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xefb1, 0x0000, 0x0000, 0xf83d,
+ /* b8 */ 0xf669, 0xf896, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf73a,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02b20 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee7e, 0x0000, 0xe16c,
+ /* 88 */ 0xebbc, 0xeb91, 0x0000, 0x0000, 0xefbf, 0xf99f, 0xee5e, 0x0000,
+ /* 90 */ 0x0000, 0xebd7, 0x0000, 0xee5f, 0x0000, 0xf593, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed95,
+ /* b0 */ 0x0000, 0x0000, 0xed9d, 0x0000, 0x0000, 0xf7e4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02b60 ***/
+
+ /* 80 */ 0xf2e3, 0x0000, 0x0000, 0xe2ee, 0xf64e, 0xeb42, 0xf9a0, 0xe3ab,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe6fa, 0x0000, 0x0000, 0x0000, 0xf8c8,
+ /* 90 */ 0x0000, 0xec67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe533, 0xf39a, 0xe6a8, 0x0000, 0x0000, 0x0000, 0xebe7, 0x0000,
+ /* a0 */ 0x0000, 0xe4bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf2e4, 0x0000, 0xe6c5, 0xf0e2, 0x0000, 0x0000, 0xf977, 0x0000,
+ /* b0 */ 0x0000, 0xed32, 0x0000, 0xec78, 0x0000, 0xee60, 0x0000, 0xf8e8,
+ /* b8 */ 0xf578, 0xedf4, 0xf54c, 0xf565,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02b9c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeab6,
+ /* 98 */ 0x0000, 0xf949, 0xf252, 0xe097, 0x0000, 0x0000, 0x0000, 0xf2e5,
+ /* a0 */ 0xe0e2, 0xe534, 0x0000, 0xea70, 0xe89f, 0xed56, 0xef4e, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xeb6e, 0xf644, 0xf062, 0x0000, 0xf7fb,
+ /* b0 */ 0x0000, 0x0000, 0xeb52, 0x0000, 0xe074, 0x0000, 0xeeb7, 0x0000,
+ /* b8 */ 0xf09f, 0x0000, 0xe7dd, 0x0000, 0xe844, 0xf23a, 0xf8e9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02bdb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe8cb, 0xe845, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3be, 0x0000, 0x0000, 0xe4ac, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8c9, 0x0000,
+ /* 98 */ 0xeacf, 0x0000, 0x0000, 0xe4c0, 0xecd7, 0x0000, 0xf2e6, 0xf960,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefc0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf5d3, 0x0000, 0x0000, 0xf16c, 0xf6b7,
+ /* b0 */ 0x0000, 0x0000, 0xf048, 0xe3f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe958,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02c16 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3de, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6b6, 0xe2b5, 0x0000, 0xe7a8,
+ /* a0 */ 0x0000, 0x0000, 0xf17e, 0x0000, 0x0000, 0xe9aa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe1a2, 0xef3e, 0x0000, 0x0000, 0x0000, 0xebbd,
+ /* b0 */ 0x0000, 0xf461, 0x0000, 0x0000, 0x0000, 0x0000, 0xefc1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe49e, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02c54 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe8b5, 0x0000, 0xf4e7, 0xe7a0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf961, 0x0000, 0xf1b2, 0xf53f, 0x0000, 0xf8a3, 0x0000,
+ /* 90 */ 0x0000, 0xf951, 0x0000, 0xf23b, 0xe535, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf594,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf269, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf8ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e3, 0xe74b,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02c94 ***/
+
+ /* 80 */ 0x0000, 0xeddb, 0xf799, 0x0000, 0x0000, 0x0000, 0xf664, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a9,
+ /* 90 */ 0x0000, 0xe0c9, 0x0000, 0x0000, 0xee61, 0xf35c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe73e, 0x0000, 0xf7d3, 0xe5fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe74c, 0xf440, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xec3b, 0xf4e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf2c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ec,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02cd4 ***/
+
+ /* 80 */ 0x0000, 0xeeb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe8a0, 0x0000, 0x0000, 0xe14e, 0x0000, 0x0000, 0xf49e,
+ /* 98 */ 0xe87b, 0x0000, 0xec68, 0xf1d6, 0x0000, 0x0000, 0xe661, 0xeb43,
+ /* a0 */ 0x0000, 0x0000, 0xf962, 0x0000, 0xf0c8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c1, 0xf35d, 0x0000,
+ /* b0 */ 0xe2f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf1d2, 0x0000, 0xe568, 0xe959, 0xe6f1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02d13 ***/
+
+ /* 80 */ 0x0000, 0xeabb, 0x0000, 0x0000, 0xf4a5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf55d, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3bf, 0xf741, 0x0000,
+ /* 90 */ 0xeffa, 0x0000, 0x0000, 0x0000, 0xf8cb, 0x0000, 0x0000, 0xe065,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf7d4, 0xf6ca, 0x0000, 0x0000, 0xe658,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf978, 0xf4bd,
+ /* b0 */ 0x0000, 0xf2a0, 0x0000, 0xeefe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4b6, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02d53 ***/
+
+ /* 80 */ 0xe13d, 0xf69c, 0xe642, 0xe468, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeed8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeeb9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf33d,
+ /* a0 */ 0xf8cc, 0xf0a1, 0x0000, 0x0000, 0xe536, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf8cd, 0x0000, 0xe5bd, 0xf3df, 0x0000, 0x0000, 0xf69d,
+ /* b0 */ 0x0000, 0xea44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e780xx - offset 0x02d92 ***/
+
+ /* 80 */ 0x0000, 0xedc8, 0x0000, 0x0000, 0x0000, 0xf8a4, 0xe549, 0x0000,
+ /* 88 */ 0x0000, 0xea71, 0x0000, 0xed33, 0x0000, 0x0000, 0x0000, 0xe6b7,
+ /* 90 */ 0x0000, 0xf77e, 0x0000, 0x0000, 0x0000, 0xea45, 0x0000, 0x0000,
+ /* 98 */ 0xe662, 0x0000, 0xf7d5, 0xeeba, 0xf0d5, 0xe5f7, 0xf2e7, 0xebbe,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf83e, 0x0000, 0x0000, 0x0000, 0xe679,
+ /* a8 */ 0xe67e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeebb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf15b,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02dd1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe244, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf8a5, 0xebee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf6a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ce, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe74d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf8fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe2b6, 0x0000, 0x0000, 0x0000, 0xf1c7, 0xf23c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02e0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe16d, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf637, 0x0000, 0x0000, 0x0000, 0xee9c, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf9dc, 0xf1b3, 0xe259, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf2e8, 0x0000, 0x0000, 0xebbf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf86b, 0xe0e3, 0xf6a9, 0x0000, 0xf8a6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe949, 0x0000, 0x0000, 0x0000, 0xf3c0,
+ /* b8 */ 0xf1c8, 0xf2c3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02e49 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe63d, 0x0000, 0x0000, 0xf9ce, 0x0000, 0x0000, 0x0000, 0xef31,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf8f4, 0xe5a7, 0x0000, 0x0000, 0x0000, 0xf3f6, 0x0000, 0xee63,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe16e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf742, 0x0000, 0x0000, 0x0000, 0xe97b,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02e87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9b6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xedea, 0x0000, 0x0000, 0xf3e0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe8cc, 0xe9cd, 0x0000, 0x0000, 0x0000, 0xe558, 0x0000,
+ /* a0 */ 0x0000, 0xe7ed, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xee9d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee64, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02ec0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c8,
+ /* 88 */ 0x0000, 0xe631, 0xf9bf, 0x0000, 0xf963, 0x0000, 0xf2a1, 0x0000,
+ /* 90 */ 0xeebc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ee, 0x0000,
+ /* 98 */ 0x0000, 0xee65, 0x0000, 0x0000, 0xeff2, 0x0000, 0xeab0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe770, 0xf94a, 0xf9af, 0xf35e,
+ /* a8 */ 0x0000, 0xe8e1, 0x0000, 0x0000, 0xedc9, 0x0000, 0xf1b4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb53,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e786xx - offset 0x02efe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecd8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeffb, 0xf038, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9b7,
+ /* 90 */ 0x0000, 0x0000, 0xf8a7, 0x0000, 0xefc2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf9f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec69,
+ /* a0 */ 0x0000, 0x0000, 0xe97c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xef32, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xee92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9f8, 0xf9f9, 0x0000, 0x0000, 0x0000, 0xf64f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x02f3d ***/
+
+ /* 80 */ 0x0000, 0xeea7, 0x0000, 0xee67, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe595, 0xe559, 0x0000, 0x0000, 0x0000, 0x0000, 0xe69c, 0x0000,
+ /* 90 */ 0xe6f2, 0x0000, 0xebc0, 0x0000, 0xe8e2, 0xee68, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeebd,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf35f, 0xf4be, 0xec3c,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b7, 0xeb92, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf9b8, 0xece8, 0x0000, 0xe537, 0xef9e,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02f7d ***/
+
+ /* 80 */ 0xf862, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf791, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe663, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe5b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf360, 0x0000, 0xf6f0, 0xf243, 0x0000, 0x0000,
+ /* b0 */ 0xf04a, 0x0000, 0xf063, 0x0000, 0x0000, 0xf1c9, 0xe9ab, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xedac, 0xf9a1, 0x0000, 0xead0, 0xf143, 0x0000,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02fbd ***/
+
+ /* 80 */ 0xead1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ed, 0xf748,
+ /* 88 */ 0xf6fa, 0x0000, 0x0000, 0x0000, 0xf73b, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf570, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe54a, 0xed43, 0x0000, 0xefda, 0x0000, 0xea46, 0x0000, 0xe7bf,
+ /* a0 */ 0x0000, 0xe7c0, 0xe691, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7cc,
+ /* a8 */ 0x0000, 0xe83a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeae5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf6e5, 0x0000, 0x0000, 0x0000, 0xe142, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02ffd ***/
+
+ /* 80 */ 0xeaf9, 0xe6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe54b, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9fa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe143, 0x0000, 0x0000, 0xe8f3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x0303d ***/
+
+ /* 80 */ 0xead2, 0x0000, 0xe25a, 0x0000, 0xf26a, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed74, 0x0000,
+ /* 90 */ 0xf8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b7,
+ /* 98 */ 0x0000, 0xf253, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe27a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xec3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6e1, 0xf897, 0x0000, 0x0000, 0xe5c9, 0xf73c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x0307b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeed9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4e9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe77d, 0xecc4, 0xf393, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef75, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeb9c, 0xf254, 0xe7de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a2, 0xf0a3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf952, 0xf04b,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x030bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xef3b, 0xea72, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf1ef, 0x0000, 0xef33, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe54c, 0x0000, 0xf97a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xeebe, 0x0000, 0xf994, 0x0000, 0x0000, 0xe644, 0x0000, 0x0000,
+ /* b8 */ 0xec3e, 0x0000, 0xe4b7, 0xf85c,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x030f7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf86c, 0x0000, 0xf1b5, 0xebe3,
+ /* 88 */ 0x0000, 0xef3c, 0x0000, 0xef6d, 0x0000, 0x0000, 0xf2e9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf54d, 0x0000, 0xe2b8, 0xefdb,
+ /* 98 */ 0xe3ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe857,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0c9,
+ /* a8 */ 0x0000, 0xef5c, 0x0000, 0x0000, 0x0000, 0xea47, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe64c, 0xe4e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf86d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x03137 ***/
+
+ /* 80 */ 0xe866, 0x0000, 0xe041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe858, 0xeaa6, 0x0000, 0xf7b3, 0xf462, 0x0000, 0xe054,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe25b, 0x0000,
+ /* 98 */ 0x0000, 0xe1f5, 0x0000, 0x0000, 0x0000, 0xf9b0, 0xe5a8, 0x0000,
+ /* a0 */ 0xf3c1, 0x0000, 0x0000, 0xec79, 0xe95a, 0xf144, 0xf850, 0x0000,
+ /* a8 */ 0x0000, 0xf8a8, 0xe338, 0x0000, 0x0000, 0xe87c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ee,
+ /* b8 */ 0x0000, 0xeb9d, 0x0000, 0x0000, 0x0000, 0xf2ea, 0xf86e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x03176 ***/
+
+ /* 80 */ 0x0000, 0xeb54, 0x0000, 0xe2b9, 0x0000, 0xe5ca, 0xe6e2, 0xec3f,
+ /* 88 */ 0x0000, 0xe6b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xef5d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf66a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf2a2, 0xec6a, 0xf69e, 0x0000, 0x0000, 0xf8d0, 0xe3ad, 0x0000,
+ /* a8 */ 0xe1e4, 0x0000, 0xe3ae, 0xe97d, 0xef5e, 0x0000, 0xf39b, 0xe245,
+ /* b0 */ 0xee9e, 0x0000, 0x0000, 0xe6fb, 0xe366, 0xe9f5, 0xf6f1, 0x0000,
+ /* b8 */ 0xf69f, 0x0000, 0xe8f7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ea,
+
+ /*** Three byte table, leaf: e791xx - offset 0x031b6 ***/
+
+ /* 80 */ 0xefdc, 0xe7c1, 0x0000, 0xf5f2, 0xeb55, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf064, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c2, 0x0000, 0xf04c,
+ /* 98 */ 0x0000, 0xe455, 0xf8d1, 0xeec0, 0xf0a5, 0x0000, 0xeafa, 0xeca2,
+ /* a0 */ 0xe6b9, 0x0000, 0xefc3, 0x0000, 0xef9f, 0xef3f, 0x0000, 0x0000,
+ /* a8 */ 0xf463, 0xf8a9, 0xe735, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe358,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x031f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe3af, 0xe6e3, 0x0000, 0x0000, 0x0000, 0xeb56,
+ /* 88 */ 0x0000, 0xe632, 0x0000, 0xf1f0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6f3, 0x0000, 0x0000, 0x0000, 0xf964, 0x0000, 0xe867, 0xe16f,
+ /* a0 */ 0x0000, 0xf464, 0x0000, 0xe3b0, 0x0000, 0xe170, 0x0000, 0xe8fd,
+ /* a8 */ 0xf4bf, 0x0000, 0xf361, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf94b, 0x0000, 0xec40, 0x0000, 0x0000, 0xee35, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xec6b, 0x0000, 0x0000, 0x0000, 0xeade, 0x0000, 0xeb57,
+
+ /*** Three byte table, leaf: e793xx - offset 0x03235 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf491, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe171, 0x0000, 0x0000, 0x0000, 0x0000, 0xe67a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeec2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe246, 0x0000, 0xf4c0, 0x0000, 0xe1fe, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf8d2, 0x0000, 0xf79a, 0xf6fb, 0x0000, 0x0000, 0xef4f, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef47, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1b6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e794xx - offset 0x03274 ***/
+
+ /* 80 */ 0x0000, 0xe94a, 0x0000, 0x0000, 0xe144, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf3f7, 0x0000, 0x0000, 0x0000, 0xef48, 0x0000, 0x0000,
+ /* 98 */ 0xe098, 0x0000, 0xed34, 0xf566, 0x0000, 0x0000, 0x0000, 0xeae6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xeaa7, 0x0000, 0xeae7, 0xebc1, 0x0000,
+ /* a8 */ 0xefc4, 0x0000, 0x0000, 0xe95b, 0xefc5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf2a3, 0xf0a6, 0xe0a3, 0xece9, 0x0000, 0x0000, 0x0000, 0xe3fb,
+ /* b8 */ 0xf2a4, 0x0000, 0xf2eb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e795xx - offset 0x032af ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe344,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a3, 0x0000, 0x0000, 0xef76,
+ /* 90 */ 0x0000, 0xf2a5, 0x0000, 0xe4cc, 0xe87d, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe6ba, 0x0000, 0xf465, 0xf5e5, 0xe7ef, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf7b4, 0x0000, 0x0000, 0xe5d4, 0xf9cf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe8e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e1,
+ /* b0 */ 0xf146, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8fe, 0xe4d7, 0x0000,
+ /* b8 */ 0xe3b1, 0x0000, 0xe0b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b2,
+
+ /*** Three byte table, leaf: e796xx - offset 0x032ef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0b2, 0xf3c2,
+ /* 88 */ 0x0000, 0x0000, 0xf571, 0xf7b5, 0x0000, 0x0000, 0xebc3, 0xebc2,
+ /* 90 */ 0x0000, 0xf0f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaa8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xee49, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf76e, 0xf7aa, 0xe099, 0x0000, 0xf1b7, 0x0000, 0x0000,
+ /* b8 */ 0xe4b8, 0xf466, 0x0000, 0x0000, 0xe569, 0xf255, 0xf492,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e797xx - offset 0x0332e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe042, 0x0000, 0x0000, 0xe94b, 0x0000, 0xf3f8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf147, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xedca, 0x0000, 0xf650, 0xf9dd, 0x0000, 0x0000,
+ /* 98 */ 0xe573, 0xe172, 0x0000, 0xf6d4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe6e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe4c3, 0x0000, 0xe736, 0x0000, 0xf651, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe9f6, 0x0000, 0xe1c0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e798xx - offset 0x0336e ***/
+
+ /* 80 */ 0xeddc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedcb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xebc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef40,
+ /* a0 */ 0xf540, 0xf4ea, 0xe87e, 0x0000, 0xe6bb, 0x0000, 0xec41, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe6aa, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x033ac ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe69d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed6f, 0x0000, 0xe066, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf0a8, 0x0000, 0x0000, 0x0000, 0xe8fe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf652, 0x0000, 0x0000, 0xf2bb, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe59f, 0x0000, 0x0000, 0xeb58, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xef49, 0x0000, 0xf2a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe1a4, 0x0000, 0x0000, 0xe596, 0xe8a1, 0xe8dc, 0xe8dd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79axx - offset 0x033eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf26c, 0x0000, 0xe0cb, 0xf965,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe27b, 0x0000,
+ /* 90 */ 0xe1c1, 0x0000, 0x0000, 0xf8d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7ab, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a9,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x0342b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xefdd, 0xe8cd, 0x0000, 0x0000, 0xe9ce, 0x0000,
+ /* 88 */ 0xeec3, 0x0000, 0xf15c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf7ec, 0x0000, 0x0000, 0x0000, 0xe0cc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeb9e, 0xe538, 0x0000, 0xf1d3, 0xe791,
+ /* a0 */ 0x0000, 0xf467, 0x0000, 0xe09a, 0xe891, 0x0000, 0x0000, 0xe664,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7cd, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe77e, 0x0000, 0xf451, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xead3, 0x0000, 0x0000, 0x0000, 0xe892, 0x0000, 0xec7a,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x0346a ***/
+
+ /* 80 */ 0x0000, 0xeb9f, 0x0000, 0x0000, 0xe79a, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf6af, 0xe846, 0x0000, 0xe067, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf468, 0x0000,
+ /* a0 */ 0xe79b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf86f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2ef,
+ /* b8 */ 0xe7c2, 0x0000, 0xf362, 0x0000, 0xed61, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x034aa ***/
+
+ /* 80 */ 0xf4b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf870, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf2ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xec42, 0x0000, 0xe54d, 0x0000, 0x0000, 0xe7ce, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf572, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe539, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c2, 0xeeda,
+
+ /*** Three byte table, leaf: e79exx - offset 0x034ea ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf469, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe7aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe74e, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe93d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec7b, 0xe69e, 0x0000, 0x0000,
+ /* b0 */ 0xe09b, 0x0000, 0x0000, 0xe56a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf567, 0xe131, 0x0000, 0x0000, 0xe2ba,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x0352a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe7c3, 0xe378, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xecc5, 0xf0f8, 0x0000, 0xf441, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2bb, 0x0000, 0x0000, 0x0000, 0xe4ad, 0xef71, 0xe27c,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeb44, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x03568 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xea73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe9f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf442, 0xf4f6, 0xf66b,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6fe, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf76f, 0x0000, 0xf6f2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x035a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe339, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee6a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe6bc, 0xe173, 0x0000, 0x0000, 0xee6b,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9dd, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x035e2 ***/
+
+ /* 80 */ 0x0000, 0xe3b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ed,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe66e, 0xed96, 0xebef, 0x0000,
+ /* 90 */ 0x0000, 0xe9f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef5f,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe075, 0x0000, 0x0000, 0x0000, 0xe931,
+ /* a8 */ 0x0000, 0xeb45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf93c, 0xf93d, 0xe737, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x03621 ***/
+
+ /* 80 */ 0x0000, 0xf1b8, 0x0000, 0x0000, 0x0000, 0xe8b6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe692, 0xf4af, 0x0000, 0x0000, 0xe1a5, 0x0000,
+ /* 90 */ 0xe893, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe738, 0x0000, 0x0000, 0x0000, 0xe174, 0x0000, 0x0000, 0xe3b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe068, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe894, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x03660 ***/
+
+ /* 80 */ 0x0000, 0xf5a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee36, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe5ec, 0xe5f8, 0xe895, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xecc6, 0x0000, 0x0000, 0x0000, 0xea74, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x036a0 ***/
+
+ /* 80 */ 0xea75, 0xe3b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b6,
+ /* 88 */ 0xe3b7, 0xf443, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xefde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf363, 0xf444,
+ /* 98 */ 0x0000, 0x0000, 0xf364, 0xe0e4, 0xf8d4, 0xf5e6, 0xecea, 0x0000,
+ /* a0 */ 0xea76, 0x0000, 0x0000, 0x0000, 0x0000, 0xead4, 0x0000, 0x0000,
+ /* a8 */ 0xf79b, 0x0000, 0x0000, 0x0000, 0x0000, 0xf33e, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe3b8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe66f,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x036e0 ***/
+
+ /* 80 */ 0x0000, 0xe367, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf931, 0xf2ee, 0xe968,
+ /* 90 */ 0x0000, 0xefdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeddd, 0xf9fb,
+ /* a8 */ 0x0000, 0x0000, 0xeb59, 0x0000, 0x0000, 0x0000, 0xe659, 0x0000,
+ /* b0 */ 0x0000, 0xe53a, 0x0000, 0xedcc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xefe0, 0x0000, 0x0000, 0x0000, 0xe368, 0xf932, 0xe54e,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x03720 ***/
+
+ /* 80 */ 0xec43, 0xea77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe94c, 0xe446, 0xf5d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe231, 0xf5a9, 0x0000, 0x0000, 0xe9f9, 0x0000, 0x0000,
+ /* 98 */ 0xe9fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf365,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf66f, 0x0000, 0xf46a, 0xed7b,
+ /* a8 */ 0x0000, 0xf493, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf149, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x03760 ***/
+
+ /* 80 */ 0xf9fc, 0x0000, 0x0000, 0x0000, 0x0000, 0xebaa, 0x0000, 0x0000,
+ /* 88 */ 0xe069, 0x0000, 0x0000, 0xf2ef, 0x0000, 0xf5aa, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf19b, 0x0000, 0x0000, 0xf73d,
+ /* 98 */ 0x0000, 0xf452, 0xf653, 0x0000, 0xe6d2, 0x0000, 0x0000, 0xf7a2,
+ /* a0 */ 0xf366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf39c, 0x0000,
+ /* b0 */ 0x0000, 0xf670, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff3, 0xf453,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe53b, 0xe043, 0xe1a6, 0x0000, 0xe1c3,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x037a0 ***/
+
+ /* 80 */ 0xe1da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7cf, 0x0000,
+ /* 88 */ 0x0000, 0xf654, 0x0000, 0x0000, 0x0000, 0xf26d, 0xeec4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec44,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeae2, 0xeedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xef41, 0x0000, 0xf93e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xedcd, 0x0000, 0x0000, 0x0000, 0xf87b, 0x0000, 0xe2bc, 0x0000,
+ /* b8 */ 0x0000, 0xe2e2, 0xe1f6, 0x0000, 0x0000, 0xf2f0, 0x0000, 0xf54e,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x037e0 ***/
+
+ /* 80 */ 0x0000, 0xe55d, 0x0000, 0x0000, 0xf4b8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xefa1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf494, 0xf4eb, 0x0000, 0xf367, 0x0000, 0x0000,
+ /* 98 */ 0xe2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2df,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xef50, 0xef51, 0x0000, 0x0000, 0x0000, 0xe2e3, 0xefa2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe33a, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7abxx - offset 0x0381c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c1, 0xe33b, 0x0000, 0xe574,
+ /* 88 */ 0x0000, 0x0000, 0xf2bc, 0xe731, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7df,
+ /* 98 */ 0x0000, 0xf4d7, 0x0000, 0x0000, 0x0000, 0xe94d, 0x0000, 0xe175,
+ /* a0 */ 0xf1f1, 0x0000, 0x0000, 0xf3e2, 0x0000, 0xe56b, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xec45, 0x0000, 0x0000, 0xe076, 0x0000, 0xe4ae,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe176, 0x0000,
+ /* b8 */ 0x0000, 0xf3d3, 0xf5e7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe06a,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x0385c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ee,
+ /* 90 */ 0x0000, 0xebc5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeae9, 0x0000, 0xf26e, 0x0000, 0x0000, 0xf6c2, 0x0000,
+ /* a0 */ 0xe732, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ac, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf33f, 0xe64d, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xebab,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x03896 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b6, 0x0000,
+ /* 88 */ 0x0000, 0xe597, 0x0000, 0xe359, 0xf2a7, 0xec7c, 0x0000, 0xe8ea,
+ /* 90 */ 0xe25c, 0xf5e8, 0xf6d5, 0x0000, 0xe4cd, 0x0000, 0xf4fe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeba0, 0x0000, 0xeafb, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee6d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef34,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x038d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0cd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf2a8, 0x0000, 0x0000, 0x0000, 0xf244,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe868, 0xe3b9, 0x0000, 0xeaa9,
+ /* 98 */ 0x0000, 0x0000, 0xf4b0, 0x0000, 0x0000, 0xe154, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe247, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xead5, 0x0000, 0x0000, 0xf1d7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf256, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03914 ***/
+
+ /* 80 */ 0xf2bd, 0xf966, 0x0000, 0x0000, 0xe8f4, 0x0000, 0xf2aa, 0xf749,
+ /* 88 */ 0x0000, 0xf5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xecd9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xebc6, 0x0000, 0x0000, 0x0000, 0xe54f, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xea78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x0394d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf37a,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4af, 0x0000,
+ /* a0 */ 0x0000, 0xe06b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf967,
+ /* a8 */ 0x0000, 0x0000, 0xf1d8, 0xebc7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf568, 0xe643, 0xe9ad,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x0398d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe5be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c3, 0xf26f, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe67b, 0x0000, 0x0000, 0x0000, 0xf569, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe847, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x039ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe9fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe9cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe733, 0x0000, 0x0000, 0xe869, 0x0000, 0xf368,
+ /* 98 */ 0xf2c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebd8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3d4, 0x0000, 0xf1f2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5db, 0x0000,
+ /* b0 */ 0x0000, 0xe5dc, 0xf4c4, 0xe0d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xec46, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03a09 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf8d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9d0, 0xf369,
+ /* a0 */ 0xe0b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5dd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe1a7, 0x0000, 0x0000, 0xe33c, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03a49 ***/
+
+ /* 80 */ 0xe3ba, 0x0000, 0xf3c4, 0x0000, 0xedb3, 0xf8f5, 0xefe1, 0xf9e0,
+ /* 88 */ 0xf94c, 0x0000, 0xe832, 0xe833, 0x0000, 0xe431, 0x0000, 0x0000,
+ /* 90 */ 0xe491, 0x0000, 0x0000, 0x0000, 0xec7d, 0x0000, 0x0000, 0xea79,
+ /* 98 */ 0xe26c, 0xf445, 0xe374, 0xe9d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xebc8, 0xe8b7, 0xeae3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1b9, 0xf3c5, 0x0000, 0xf4cf, 0xe6ab,
+ /* b0 */ 0xebac, 0x0000, 0x0000, 0xeceb, 0x0000, 0xf257, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xebc9, 0xe09c, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03a87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf39d, 0xf871, 0xf36a, 0xe177, 0xe896, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe14f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe27d, 0x0000,
+ /* a0 */ 0x0000, 0xe5a9, 0xf872, 0x0000, 0x0000, 0x0000, 0xe375, 0x0000,
+ /* a8 */ 0xf0d6, 0x0000, 0xf16f, 0x0000, 0x0000, 0x0000, 0xeafc, 0x0000,
+ /* b0 */ 0x0000, 0xf6d6, 0xea7a, 0xe0b4, 0x0000, 0x0000, 0xf2be, 0x0000,
+ /* b8 */ 0x0000, 0xe145, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2bd,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03ac7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f2, 0xec47,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe178, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf39e, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe670, 0x0000, 0xf3c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec48, 0xf0ab, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe0b5, 0xe761, 0x0000, 0xf55e, 0xf4f7, 0x0000, 0x0000,
+ /* b8 */ 0xe6c6, 0x0000, 0xe3bb, 0xf6aa, 0x0000, 0xf1ca, 0xe6d3, 0xe79c,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03b07 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf655,
+ /* 88 */ 0x0000, 0x0000, 0xe3cc, 0xe9fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeafd, 0x0000,
+ /* 98 */ 0xf7e5, 0x0000, 0xeb5a, 0x0000, 0x0000, 0xf49f, 0xe4b0, 0x0000,
+ /* a0 */ 0xf595, 0xe859, 0x0000, 0xee6e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf74a, 0xef60, 0x0000, 0x0000, 0xe79d, 0x0000, 0x0000, 0xf065,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe633, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf656,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x03b43 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf46b, 0xed9e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef42, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe86a, 0x0000, 0xf46c, 0xf8d6, 0xefb2,
+ /* a0 */ 0x0000, 0xf23d, 0x0000, 0xf873, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe97e, 0x0000, 0x0000, 0xf5ea, 0xee70,
+ /* b0 */ 0x0000, 0xf39f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ac,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c5, 0xf270,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03b82 ***/
+
+ /* 80 */ 0x0000, 0xe8e5, 0x0000, 0xe9de, 0x0000, 0x0000, 0xe7f0, 0xefa3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf3f9, 0x0000, 0xf454, 0xeb5b, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefa4, 0x0000,
+ /* a0 */ 0x0000, 0xec49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xecb1, 0xf97b, 0xe1a8, 0x0000, 0xe146, 0x0000, 0x0000,
+ /* b0 */ 0xf36b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xee4a, 0x0000, 0x0000, 0xe1a9, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03bc0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf4c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebd9, 0x0000, 0x0000, 0xf2ab,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xeec5, 0x0000, 0x0000, 0xeb79, 0x0000,
+ /* 98 */ 0xf4c5, 0x0000, 0x0000, 0xe550, 0xe5bf,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03bdd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ae, 0x0000,
+ /* b8 */ 0xf7fc, 0x0000, 0xe150,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03c18 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeda2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe248, 0x0000, 0x0000, 0x0000, 0xe762, 0xf7d6, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf3aa, 0xe261, 0x0000, 0x0000, 0xf657, 0x0000,
+ /* b0 */ 0xe8eb, 0x0000, 0xeafe, 0x0000, 0x0000, 0xe771, 0x0000, 0xf6f3,
+ /* b8 */ 0x0000, 0xe6e7, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03c53 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a0, 0x0000, 0x0000,
+ /* 88 */ 0xe3bc, 0x0000, 0xedcf, 0x0000, 0xe0b6, 0x0000, 0xe848, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe64e, 0x0000, 0x0000, 0x0000, 0xec4a, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeb5c, 0xf0f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf9fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6e8, 0xe0d8, 0x0000, 0x0000, 0x0000, 0xefe2, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03c92 ***/
+
+ /* 80 */ 0x0000, 0xef4a, 0x0000, 0x0000, 0x0000, 0xecc7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf15d, 0x0000, 0xf15e, 0x0000, 0xe64f, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeca7, 0x0000, 0xead6, 0xf9e8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf271,
+ /* a0 */ 0xf638, 0xe9fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf74b, 0x0000, 0xef61, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf7d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe27e, 0x0000, 0x0000, 0xf15f, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03cd2 ***/
+
+ /* 80 */ 0xefa5, 0xe665, 0x0000, 0xe1c5, 0x0000, 0xf1ba, 0xe3bd, 0x0000,
+ /* 88 */ 0x0000, 0xe2be, 0x0000, 0x0000, 0xf14b, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe441, 0x0000, 0x0000, 0x0000, 0x0000, 0xe179, 0x0000, 0xe7c4,
+ /* 98 */ 0xeffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3be, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf14c, 0x0000, 0x0000, 0xedad, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6b0, 0x0000, 0xe17a,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03d12 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4c4, 0x0000, 0x0000, 0xe650, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe69f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba1, 0x0000,
+ /* 98 */ 0xea4d, 0x0000, 0xf639, 0x0000, 0x0000, 0x0000, 0xe834, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe634,
+ /* b0 */ 0xf5c6, 0x0000, 0xeba2, 0xefc6, 0x0000, 0x0000, 0x0000, 0xf455,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf579, 0xe67c, 0xf0d3,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03d52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf14d, 0xec6c, 0xea7b, 0xf36c,
+ /* 88 */ 0x0000, 0xf0bf, 0x0000, 0xe6ce, 0xe3bf, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ab, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf7fd, 0x0000, 0xe06c, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe1c6, 0xf446, 0x0000, 0x0000, 0xe9fe, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe147, 0xe8b8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe379,
+ /* b0 */ 0x0000, 0xe26d, 0xf0c0, 0x0000, 0xf9a2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf75b, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03d8f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf066, 0xf3b0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ce, 0x0000, 0xf6c3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe8cf, 0xe0a4, 0x0000, 0x0000, 0xf770, 0x0000,
+ /* a0 */ 0x0000, 0xf8d7, 0x0000, 0x0000, 0xf0ca, 0xeb31, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe25d, 0x0000, 0x0000, 0xe56c, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf9d8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe498,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03dcd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf447, 0x0000, 0x0000, 0xf898, 0xf63a, 0xf899,
+ /* 88 */ 0xe776, 0x0000, 0xf541, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xef62, 0x0000, 0xe055, 0xe17b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xec7e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xec4b, 0x0000, 0xf6ad, 0x0000, 0x0000, 0x0000, 0xf771,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf4ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xea31,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03e0c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xed9f, 0x0000, 0x0000, 0xecec, 0x0000,
+ /* 90 */ 0xe9af, 0xe9b0, 0x0000, 0x0000, 0xe0b7, 0xef63, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba3, 0xe470, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf3a0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xefa6, 0xe0f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf1f3, 0xe969, 0xeb5d, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6da,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03e4c ***/
+
+ /* 80 */ 0xe8b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe13e, 0x0000, 0xe86b, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe9b1, 0x0000, 0xe73f, 0xeca3, 0x0000, 0x0000,
+ /* a0 */ 0xe291, 0x0000, 0x0000, 0xf495, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf743, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeb5e, 0x0000, 0xf5fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf0ec, 0x0000, 0x0000, 0xe4c5, 0xf97c, 0xe46b,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03e8c ***/
+
+ /* 80 */ 0xe57b, 0x0000, 0xea32, 0x0000, 0x0000, 0x0000, 0xede6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf340, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1f4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xeced, 0x0000, 0xef52, 0x0000, 0xf1f5,
+ /* a8 */ 0xe6fc, 0x0000, 0xf1bb, 0x0000, 0x0000, 0xf63b, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf448, 0xf658, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe4e6, 0xf46d, 0xe2bf, 0x0000, 0xf0ac,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e888xx - offset 0x03ecb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2c0, 0x0000, 0xee38,
+ /* 88 */ 0xf9e9, 0x0000, 0xe2c1, 0x0000, 0xeb6f, 0xea7c, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeb32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf54f, 0xec91, 0x0000, 0xe7f1, 0xf3c7,
+ /* a0 */ 0x0000, 0xe0b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf7fe, 0xe8ba, 0xe897, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf67c, 0xe86c, 0xf874,
+ /* b8 */ 0x0000, 0xeb5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03f0b ***/
+
+ /* 80 */ 0xe9b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xee39, 0x0000, 0xf2f3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf4ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fa, 0x0000, 0xf7e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe06d, 0xe5de,
+ /* b0 */ 0x0000, 0xe06e, 0xeae4, 0x0000, 0x0000, 0x0000, 0xee9f, 0x0000,
+ /* b8 */ 0xf5ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed97,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88axx - offset 0x03f4a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xefe3, 0x0000, 0xf1cb, 0xe2e4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe763, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe9b3, 0xe57c, 0x0000, 0x0000, 0xf449, 0x0000, 0xeab7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ce, 0xf8d8, 0x0000,
+ /* a8 */ 0x0000, 0xe369, 0x0000, 0x0000, 0xe9d2, 0xf6f4, 0xeedc, 0xed35,
+ /* b0 */ 0x0000, 0xf933, 0x0000, 0xe8bb, 0x0000, 0x0000, 0x0000, 0xf44a,
+ /* b8 */ 0xeffd, 0xe35a, 0x0000, 0xf5d6, 0xe7c5, 0xed44, 0x0000, 0xf1a7,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03f8a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf04d, 0xeea0, 0x0000, 0xf6c4, 0xf5ad, 0x0000, 0xe7e0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe044, 0x0000, 0x0000, 0xf772, 0xe2c2,
+ /* a0 */ 0x0000, 0xf14e, 0x0000, 0x0000, 0x0000, 0xedb4, 0xe1c8, 0xf258,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xeec8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c9, 0xf7b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03fc9 ***/
+
+ /* 80 */ 0x0000, 0xf3e8, 0xe7f2, 0xe8f5, 0xe045, 0xe7c6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ab,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1bc, 0x0000, 0x0000, 0xe764, 0x0000, 0x0000, 0x0000, 0xe96a,
+ /* b0 */ 0x0000, 0xec4c, 0x0000, 0x0000, 0xf97d, 0xf170, 0xe4a0, 0x0000,
+ /* b8 */ 0xefc7, 0xee3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x04009 ***/
+
+ /* 80 */ 0xec92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf84b,
+ /* 88 */ 0x0000, 0xf5ae, 0xf8aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xf19d,
+ /* 90 */ 0x0000, 0xf14f, 0xf968, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe575, 0x0000, 0x0000, 0x0000, 0xf7c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf272,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88exx - offset 0x04045 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe6e9, 0xf1f6, 0x0000, 0x0000, 0x0000, 0xea7d, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe17c, 0x0000,
+ /* 98 */ 0xecee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef64, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf89a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe9b4, 0xed45, 0xe740, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe765, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88fxx - offset 0x04084 ***/
+
+ /* 80 */ 0x0000, 0xf57a, 0x0000, 0x0000, 0x0000, 0xe249, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe671, 0xe2d2, 0x0000, 0xe346, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe232, 0x0000, 0x0000, 0xf4ee, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe95c, 0x0000, 0xe35b, 0x0000, 0x0000, 0x0000, 0xf934,
+ /* b0 */ 0xe1ca, 0xe6d4, 0xea33, 0x0000, 0xed70, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf259, 0x0000, 0x0000, 0x0000, 0xec6d,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x040c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf5fe, 0xe53c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe5d1, 0x0000, 0xe792, 0xf753, 0xf067, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf5d7, 0x0000, 0x0000, 0xe74f, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf9c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf0ad, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5aa,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x04100 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeea8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf25a,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe077, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf773, 0x0000, 0xe56d, 0x0000, 0x0000, 0xf068, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf8d9, 0xf1f7, 0x0000, 0x0000, 0xedb5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe33d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf3f1,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x0413b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xec4d, 0x0000, 0x0000, 0x0000, 0xecc8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe7d5, 0x0000, 0x0000, 0xeaaa, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe8bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf3fa, 0x0000, 0x0000, 0xedb6, 0xf4ef, 0x0000, 0x0000, 0xf8da,
+
+ /*** Three byte table, leaf: e893xx - offset 0x0417b ***/
+
+ /* 80 */ 0xebe0, 0x0000, 0xe7ac, 0x0000, 0xf5eb, 0x0000, 0xeb46, 0x0000,
+ /* 88 */ 0x0000, 0xefc8, 0x0000, 0xe0cf, 0x0000, 0xecc9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xea7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xec4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe991, 0x0000, 0xe635, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec93, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e894xx - offset 0x041b8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe7a1, 0x0000, 0xe750, 0xe96b, 0x0000, 0x0000, 0xf1bd,
+ /* 98 */ 0xeab8, 0x0000, 0xf035, 0x0000, 0x0000, 0x0000, 0xe6ad, 0x0000,
+ /* a0 */ 0x0000, 0xf4f9, 0x0000, 0xf1f8, 0x0000, 0xf5c7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebca, 0xf0e3, 0x0000, 0xf46e,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf75c, 0x0000, 0xf069,
+
+ /*** Three byte table, leaf: e895xx - offset 0x041f8 ***/
+
+ /* 80 */ 0x0000, 0xe4c6, 0x0000, 0xe8e6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf5af, 0x0000, 0x0000, 0x0000, 0x0000, 0xe292, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xeffe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf8b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xec94, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe2f2, 0xf6b9, 0xe7f3, 0x0000, 0x0000, 0xebcb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e896xx - offset 0x04234 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe86d, 0x0000, 0x0000, 0xe849,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fb,
+ /* 90 */ 0x0000, 0xe0b9, 0x0000, 0x0000, 0xf1f9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeb70, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf550, 0x0000,
+ /* a8 */ 0xf9bc, 0xeab1, 0xecef, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb33,
+ /* b0 */ 0xf9b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf341, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x04273 ***/
+
+ /* 80 */ 0x0000, 0xe1cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf1be, 0x0000, 0x0000, 0x0000, 0xe5c0, 0xecf0, 0xf1fa,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefe4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ed, 0xeedd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe598, 0xedb7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8e7, 0xec4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf25b,
+ /* b8 */ 0x0000, 0x0000, 0xe6f4, 0xf36d, 0x0000, 0x0000, 0x0000, 0xe23b,
+
+ /*** Three byte table, leaf: e898xx - offset 0x042b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xeede, 0x0000, 0x0000, 0x0000, 0xe666, 0xebcc,
+ /* 88 */ 0x0000, 0x0000, 0xef43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedee, 0xe932,
+ /* 98 */ 0x0000, 0x0000, 0xeb60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a1,
+
+ /*** Three byte table, leaf: e899xx - offset 0x042f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8db, 0x0000,
+ /* 90 */ 0xf7cb, 0x0000, 0x0000, 0x0000, 0xe0f3, 0xf535, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf858, 0xe667, 0x0000, 0xefe5, 0xf8dc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf8f6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x0432d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe835, 0x0000, 0xe8bd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf172, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe1f7, 0xf36e, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf659, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x04366 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea91,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf97e, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xef53, 0x0000, 0xf3c8, 0x0000, 0x0000, 0x0000, 0xe293,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7ed, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf496, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed46, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x043a6 ***/
+
+ /* 80 */ 0xf5b9, 0x0000, 0xe992, 0xecf1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xef35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf44b, 0x0000, 0xea34, 0x0000, 0xe85c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89dxx - offset 0x043d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe079, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecda, 0x0000, 0xf969,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf06a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c4, 0x0000,
+ /* a8 */ 0xeca4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8dd, 0x0000, 0xf2ca, 0x0000,
+ /* b8 */ 0xef54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x04416 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ad,
+ /* a0 */ 0x0000, 0x0000, 0xf8ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe4d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe5a2, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89fxx - offset 0x04452 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf66e, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeb61, 0x0000, 0x0000, 0xefa8,
+ /* b0 */ 0x0000, 0x0000, 0xf5f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf83f, 0x0000, 0xf0fc, 0x0000, 0x0000, 0xeb7a,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x04491 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecb2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5c5,
+ /* a0 */ 0x0000, 0x0000, 0xf3e3, 0xe5ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe1cc, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d9, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe751, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x044d1 ***/
+
+ /* 80 */ 0xf87c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3eb, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf84c, 0xee72, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf875, 0xec9c, 0x0000, 0x0000, 0x0000, 0xe046,
+ /* 98 */ 0x0000, 0xed47, 0x0000, 0xf06b, 0x0000, 0xf5fa, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf8ac, 0xe2c3, 0xf0fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf79c, 0x0000, 0x0000, 0xeab9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebf1, 0x0000, 0xe434, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5fb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe36a, 0xe36b,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x04511 ***/
+
+ /* 80 */ 0x0000, 0xf04e, 0xe7b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe047, 0x0000, 0x0000, 0xe4e7, 0x0000, 0xf775, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe4b2, 0x0000, 0x0000, 0x0000, 0xec50, 0xf46f,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1cd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x04550 ***/
+
+ /* 80 */ 0x0000, 0xf23e, 0xe63e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeee0, 0xf0ae, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe2d9, 0x0000, 0x0000, 0xe95d, 0xf1fb, 0x0000, 0xea92,
+ /* a0 */ 0x0000, 0xe6eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xea35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xead7, 0xe8d0, 0xe8d1, 0x0000, 0x0000,
+ /* b8 */ 0xe5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf342,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x0458e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe96c,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe078, 0x0000, 0xf776, 0xe95e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf06c, 0xe8d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefb3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf6db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca8, 0x0000,
+ /* b8 */ 0xe6ae, 0x0000, 0x0000, 0xeb71, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x045cd ***/
+
+ /* 80 */ 0x0000, 0xe0ba, 0x0000, 0x0000, 0xedd1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe36c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5c1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe75a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeca9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb34,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x0460d ***/
+
+ /* 80 */ 0x0000, 0xefa9, 0x0000, 0xe4c7, 0x0000, 0x0000, 0xe96d, 0xf73e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe148, 0x0000, 0x0000, 0x0000, 0xe33e,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe794, 0x0000, 0x0000, 0xecca, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe13f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe53d, 0xf661, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe35c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe056, 0x0000, 0x0000, 0xe5c2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x0464d ***/
+
+ /* 80 */ 0xe24a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe057, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf840, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xead8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x0468d ***/
+
+ /* 80 */ 0xedeb, 0x0000, 0xf2f4, 0xe9b5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe1aa, 0x0000, 0xecf2, 0x0000, 0xf8f7, 0x0000, 0xf6d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9ba, 0x0000, 0x0000, 0xf9e1, 0xf6a0,
+ /* 98 */ 0xe3c0, 0x0000, 0x0000, 0xef55, 0x0000, 0xed48, 0x0000, 0xebe8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe151, 0x0000, 0xe47d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe8be, 0x0000, 0x0000, 0xeb72, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf859, 0x0000, 0x0000, 0xebcd, 0x0000, 0xe048, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf470, 0xf3c9,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x046c9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xea93, 0x0000, 0x0000, 0x0000, 0xf36f, 0xf754, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf25c, 0x0000, 0x0000, 0xea94, 0x0000,
+ /* a0 */ 0xeec9, 0x0000, 0xec95, 0xeee1, 0x0000, 0x0000, 0xeccb, 0x0000,
+ /* a8 */ 0x0000, 0xeccc, 0x0000, 0x0000, 0x0000, 0xe2f8, 0xf2ac, 0x0000,
+ /* b0 */ 0xf9fe, 0xf935, 0xf841, 0xead9, 0x0000, 0xeb62, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf56a, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04704 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3ca, 0x0000, 0xe233,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf44c, 0xf173, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xeb35, 0x0000, 0xf6ab, 0x0000, 0x0000,
+ /* 98 */ 0xf0af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedde, 0x0000,
+ /* a0 */ 0xeba4, 0xe1ab, 0x0000, 0xe7f4, 0xef36, 0xe1ce, 0xebe9, 0x0000,
+ /* a8 */ 0xf991, 0x0000, 0xeb73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xec51, 0x0000, 0xe234, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xea36, 0x0000, 0x0000, 0xf0fe, 0x0000, 0xf0dd, 0xf370,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04744 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf56b, 0x0000, 0xec96, 0x0000, 0x0000, 0xe4c8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf57b, 0x0000, 0xf245, 0x0000, 0xf5d8,
+ /* 90 */ 0x0000, 0x0000, 0xe5df, 0x0000, 0x0000, 0x0000, 0xe675, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf0b0, 0xf573, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeccd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf596, 0xf842,
+ /* a8 */ 0x0000, 0x0000, 0xf2f5, 0xe06f, 0x0000, 0xf0b1, 0xf1bf, 0x0000,
+ /* b0 */ 0x0000, 0xf9c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xed36, 0xf7a4,
+ /* b8 */ 0xf343, 0x0000, 0xedec, 0x0000, 0x0000, 0x0000, 0xe3e7, 0x0000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x04784 ***/
+
+ /* 80 */ 0xe7c7, 0xed67, 0xf06d, 0x0000, 0xe599, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe84a, 0x0000,
+ /* 90 */ 0xe85d, 0x0000, 0x0000, 0x0000, 0xf7cc, 0x0000, 0xebda, 0xe8bf,
+ /* 98 */ 0x0000, 0xe155, 0xf160, 0xe0bb, 0x0000, 0xea95, 0x0000, 0x0000,
+ /* a0 */ 0xefaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe7c8, 0x0000, 0x0000, 0xf273, 0xe6bd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe2c4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe35d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x047c3 ***/
+
+ /* 80 */ 0x0000, 0xf936, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf3fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d2, 0xe3c1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xecdb, 0x0000, 0xe4c9, 0x0000, 0xe95f, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe17d, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea37, 0x0000, 0x0000, 0xee4b,
+ /* b0 */ 0xf131, 0x0000, 0x0000, 0x0000, 0xe149, 0x0000, 0x0000, 0xf8de,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04803 ***/
+
+ /* 80 */ 0xe551, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe938, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xec52, 0x0000, 0xf4d8, 0xedd3, 0x0000, 0x0000, 0xf4d9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf4c6,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x0481e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1db,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ac,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x0485e ***/
+
+ /* 80 */ 0x0000, 0xf953, 0x0000, 0x0000, 0x0000, 0x0000, 0xe577, 0x0000,
+ /* 88 */ 0xe3c2, 0x0000, 0xf7a5, 0x0000, 0xef65, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecce, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe55a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeada, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8df, 0xeee3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf79d, 0xeccf, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x0489c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf5b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe777, 0x0000, 0xe7c9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf73f, 0xf2f6, 0x0000,
+ /* a0 */ 0xe9b6, 0xf23f, 0xe1f8, 0x0000, 0x0000, 0x0000, 0x0000, 0xea48,
+ /* a8 */ 0xf937, 0xf6fc, 0xf6b1, 0xe24b, 0xf531, 0x0000, 0x0000, 0xf25d,
+ /* b0 */ 0xebae, 0x0000, 0x0000, 0xf153, 0xe2fe, 0x0000, 0xf74f, 0xe772,
+ /* b8 */ 0xe4e8, 0x0000, 0x0000, 0xea38, 0xf574, 0xf152, 0x0000, 0xe7f5,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x048dc ***/
+
+ /* 80 */ 0xf7c5, 0xe9d3, 0xe693, 0xf19e, 0xf992, 0x0000, 0x0000, 0xf1c0,
+ /* 88 */ 0xe049, 0x0000, 0xf274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf471, 0x0000, 0xea49, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe694, 0x0000, 0xea96, 0x0000, 0xeadb, 0x0000,
+ /* a0 */ 0xe8d3, 0x0000, 0xf877, 0xe773, 0xf551, 0x0000, 0xe9b7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf497, 0x0000, 0x0000, 0xe53e, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe695, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe9b8, 0xe2c5, 0xeadf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x0491a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf44e, 0xf631, 0x0000, 0xf0cb,
+ /* 88 */ 0xf3fc, 0x0000, 0xf4c7, 0x0000, 0x0000, 0xeb7b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf1fc, 0x0000, 0x0000, 0xebdb, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04936 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf275, 0x0000, 0xea97, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf863, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf3cb, 0x0000, 0x0000, 0xe33f, 0xe9b9, 0x0000, 0x0000, 0xe3c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04971 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf371, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf63c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf37b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe9ba, 0x0000, 0x0000, 0x0000, 0xf44f,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x049b0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8a2, 0xf498, 0x0000, 0x0000, 0xe04a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf6f5, 0x0000, 0xe0e5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf276, 0x0000, 0xeb63, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe235, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe668,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe53f, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x049e6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xefc9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ce,
+ /* 90 */ 0xf552, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf3a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf0b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04a24 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf0b3, 0x0000, 0xf344, 0x0000, 0x0000, 0xe0f4,
+ /* 88 */ 0xe540, 0xf4b2, 0xf8b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf5ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf277,
+ /* a0 */ 0xf542, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ed, 0x0000, 0xe2f3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04a63 ***/
+
+ /* 80 */ 0x0000, 0xf372, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf25e,
+ /* 88 */ 0x0000, 0x0000, 0xf3cc, 0x0000, 0x0000, 0xedb8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe6f5, 0xecf3, 0xe2e5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04aa3 ***/
+
+ /* 80 */ 0xe2c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf4b3, 0xed68, 0xe2f9, 0xe2da, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf85d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee73,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf472, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ee, 0x0000, 0x0000, 0xe04b, 0x0000, 0x0000, 0xecdc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x04ae2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe294, 0x0000, 0xe669, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf575, 0xe752, 0xe960, 0xe17e, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe5e0, 0xf65a, 0xf9ca, 0xe766, 0xf55f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe636, 0xe94e,
+ /* a8 */ 0x0000, 0xe8d4, 0xe6c7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf3cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xec53, 0xe96e, 0x0000, 0xe96f, 0x0000, 0x0000, 0xf2ad, 0xee3b,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04b22 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7dd, 0xf04f, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2ae, 0x0000, 0x0000, 0x0000, 0xf560, 0xe295, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee3c, 0x0000, 0xe26e,
+ /* a0 */ 0x0000, 0x0000, 0xe5f9, 0x0000, 0x0000,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04b47 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xecf4, 0xe1d0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe5b8, 0x0000, 0x0000, 0xf6fd, 0x0000,
+ /* a8 */ 0xe939, 0x0000, 0x0000, 0x0000, 0x0000, 0xea98, 0x0000, 0xe93a,
+ /* b0 */ 0xf473, 0xefb4, 0xe46c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04b85 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xefe6, 0x0000, 0x0000, 0xecf6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeca, 0x0000,
+ /* 90 */ 0x0000, 0xe35e, 0x0000, 0x0000, 0xe899, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe04c, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf278, 0xe86e, 0x0000, 0xf499, 0x0000, 0x0000,
+ /* b0 */ 0xec9d, 0x0000, 0xe136, 0x0000, 0x0000, 0x0000, 0x0000, 0xe84b,
+ /* b8 */ 0x0000, 0xf279, 0x0000, 0x0000, 0x0000, 0xf5da, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x04bc5 ***/
+
+ /* 80 */ 0xf6dc, 0xebea, 0xe251, 0xe541, 0x0000, 0xf9b1, 0xee4d, 0x0000,
+ /* 88 */ 0xf8ad, 0x0000, 0x0000, 0xf777, 0x0000, 0xebce, 0x0000, 0xf6e2,
+ /* 90 */ 0xf5ef, 0xe2c7, 0x0000, 0x0000, 0xe542, 0xe191, 0x0000, 0xe578,
+ /* 98 */ 0x0000, 0xf25f, 0xf6d7, 0x0000, 0x0000, 0xeb36, 0xe651, 0xebdc,
+ /* a0 */ 0xf373, 0xf3e4, 0xe993, 0xe637, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf597, 0x0000,
+ /* b0 */ 0x0000, 0xf3ce, 0xf474, 0x0000, 0x0000, 0xe340, 0x0000, 0x0000,
+ /* b8 */ 0xf191, 0x0000, 0x0000, 0x0000, 0xf7ba, 0x0000, 0xf0b5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x04c04 ***/
+
+ /* 80 */ 0x0000, 0xe57d, 0xec54, 0x0000, 0x0000, 0x0000, 0x0000, 0xefe7,
+ /* 88 */ 0x0000, 0x0000, 0xf0b4, 0xf031, 0x0000, 0xf74c, 0xe236, 0x0000,
+ /* 90 */ 0xf7c6, 0xf96a, 0x0000, 0xe543, 0xe4b9, 0xf06e, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xefab, 0x0000, 0x0000, 0xebe1, 0xe4cf, 0xf598, 0x0000,
+ /* a0 */ 0xf050, 0xebcf, 0x0000, 0xe14a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf27a, 0x0000, 0x0000, 0x0000, 0xf374, 0xf4b4, 0xe57e,
+ /* b0 */ 0x0000, 0x0000, 0xf450, 0x0000, 0x0000, 0xf3e5, 0x0000, 0xf553,
+ /* b8 */ 0xeb64, 0x0000, 0xf0b6, 0x0000, 0xe6a1, 0xe0e8, 0x0000, 0xf7ad,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04c44 ***/
+
+ /* 80 */ 0xefad, 0xe774, 0xf843, 0xec55, 0xf94d, 0x0000, 0x0000, 0xf154,
+ /* 88 */ 0xe741, 0x0000, 0xe93b, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a4,
+ /* 90 */ 0x0000, 0xf0e9, 0x0000, 0x0000, 0x0000, 0xef4b, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf8ae, 0xe3e1, 0x0000, 0x0000, 0xe8c0, 0x0000,
+ /* a8 */ 0xf5be, 0x0000, 0xea99, 0x0000, 0x0000, 0x0000, 0x0000, 0xe09d,
+ /* b0 */ 0xf6c6, 0xe2c8, 0x0000, 0x0000, 0x0000, 0xebd0, 0x0000, 0x0000,
+ /* b8 */ 0xf260, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x04c83 ***/
+
+ /* 80 */ 0x0000, 0xeff4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe296, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cd, 0x0000,
+ /* a0 */ 0x0000, 0xe2db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe9bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xe23c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefe8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe544,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e984xx - offset 0x04cc1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xed57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5db, 0x0000, 0x0000, 0xf851, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xea39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe59a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe4b3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x04cf8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf0b7, 0xf2f8, 0xf5dc, 0xf1cc, 0xe8d5, 0xf3cf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf3d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf5b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe7ae, 0xe5ac, 0x0000, 0xec56, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9a3, 0x0000, 0xf8e5,
+ /* b8 */ 0xeaab,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x04d31 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec97,
+ /* 88 */ 0x0000, 0xf63d, 0x0000, 0xf5b3, 0x0000, 0xf345, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeba5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5dd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf132, 0xf1fd, 0x0000, 0xf5b4, 0xf8b8,
+ /* b0 */ 0x0000, 0xe8a3, 0x0000, 0x0000, 0xe65a, 0xe0d9, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04d71 ***/
+
+ /* 80 */ 0xedd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4fa,
+ /* 88 */ 0x0000, 0xf0b8, 0x0000, 0xeb47, 0xe6ec, 0xf3ec, 0xedaf, 0xe5e1,
+ /* 90 */ 0xe6ed, 0xe3d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf2,
+ /* 98 */ 0xf2f9, 0x0000, 0x0000, 0x0000, 0xe9bc, 0xf66c, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf375, 0x0000, 0x0000, 0x0000, 0xf554,
+ /* a8 */ 0x0000, 0x0000, 0xefe9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4fb,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e988xx - offset 0x04da7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe591, 0x0000, 0x0000,
+ /* 90 */ 0xe132, 0xf6fe, 0xeabc, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0cd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe347, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe652, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xef3d, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2af,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04de7 ***/
+
+ /* 80 */ 0xe0a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf878, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe156,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xee77, 0x0000, 0x0000, 0xf057, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe8a4, 0x0000, 0xe2c9, 0xec9e, 0xf2fa, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04e27 ***/
+
+ /* 80 */ 0xf0de, 0x0000, 0x0000, 0xf5c8, 0x0000, 0xe56e, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xeb65, 0x0000, 0xf2b0, 0x0000, 0x0000, 0xec57, 0x0000,
+ /* 98 */ 0xe7af, 0x0000, 0x0000, 0x0000, 0xf7e7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeee5, 0x0000, 0x0000, 0xe2ca, 0xebd1,
+ /* b8 */ 0x0000, 0xec58,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04e61 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fb, 0x0000, 0x0000, 0xf89b,
+ /* 90 */ 0x0000, 0x0000, 0xe994, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeb37, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf778, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe0ea, 0x0000, 0x0000, 0x0000, 0xe0bc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04e9e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe672, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf5de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf5df, 0x0000, 0xf246, 0x0000, 0x0000, 0x0000, 0xec98, 0xe4ca,
+ /* a0 */ 0xf2fc, 0xe3c4, 0xf2b1, 0x0000, 0xe3c5, 0x0000, 0xe36e, 0x0000,
+ /* a8 */ 0xe7e1, 0x0000, 0x0000, 0xeb48, 0x0000, 0x0000, 0xe1d1, 0xf4b9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04ed6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeecc, 0x0000, 0xe638, 0xe237, 0x0000, 0xe545, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed58, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe4b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf66d, 0x0000, 0xf3a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x04f15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe157, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xefca, 0x0000, 0xebf0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf8af, 0x0000, 0x0000, 0x0000, 0xe0d1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8e0, 0xf475, 0x0000, 0x0000,
+ /* b0 */ 0xf192, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04f52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf37c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf27b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefcb, 0x0000,
+ /* a0 */ 0x0000, 0xe192, 0x0000, 0x0000, 0xe6af, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04f8e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf997, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf3a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb66, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf2b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf561, 0x0000, 0x0000,
+ /* b8 */ 0xf6a1, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x04fca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3d1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe09e, 0xe09f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe25e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c8, 0x0000, 0xf4ba,
+
+ /*** Three byte table, leaf: e995xx - offset 0x0500a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1fe,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x0504a ***/
+
+ /* 80 */ 0xe836, 0x0000, 0x0000, 0xeb7c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf75d, 0x0000, 0xe0d2, 0x0000, 0x0000, 0x0000, 0xf0ce,
+ /* 90 */ 0x0000, 0xf7d8, 0xf7d9, 0xe070, 0xe85a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe0a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe058, 0xf7ee, 0xe8ec, 0x0000, 0x0000,
+ /* a8 */ 0xe341, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xee95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeea2, 0xed69,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x05087 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed71,
+ /* 88 */ 0x0000, 0x0000, 0xf954, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7ef, 0xe2f4, 0xf6e6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe24c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf555, 0xe933, 0x0000,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x050ab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9bd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf556, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf731, 0x0000, 0x0000, 0x0000, 0xef66, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe8c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf376, 0x0000, 0x0000, 0x0000, 0xed49,
+
+ /*** Three byte table, leaf: e999xx - offset 0x050eb ***/
+
+ /* 80 */ 0xf67d, 0x0000, 0xf7ae, 0x0000, 0xe9be, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe6b0, 0xe778, 0xe0bd, 0x0000, 0x0000,
+ /* 90 */ 0xf7da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf75e, 0xf7f0, 0xeb7d, 0xecb3, 0xf543,
+ /* a0 */ 0x0000, 0x0000, 0xf052, 0xf476, 0xf346, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe8d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf0e4, 0x0000, 0x0000, 0xf477, 0x0000, 0xe6d5, 0xe546, 0xf7e8,
+ /* b8 */ 0xe6c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x05129 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefea, 0xe6cc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe4e9, 0xec59, 0x0000, 0xf96b, 0xe1ad, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe140, 0xf032, 0x0000, 0x0000,
+ /* 98 */ 0xed98, 0xe350, 0x0000, 0xf347, 0xf231, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe6f6, 0x0000, 0x0000, 0x0000, 0xec5a,
+ /* a8 */ 0xec5b, 0x0000, 0xf85f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf0df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe65b,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf544, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x05169 ***/
+
+ /* 80 */ 0xf1cd, 0xed62, 0x0000, 0x0000, 0xf039, 0xed4a, 0xf4a2, 0xe1d2,
+ /* 88 */ 0x0000, 0xf65b, 0x0000, 0xf3e6, 0xf1c1, 0xef4c, 0xf261, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf377, 0xec5c, 0x0000,
+ /* 98 */ 0x0000, 0xed3a, 0x0000, 0xf5e1, 0xf1da, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe6ee, 0xe3f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xefeb, 0xefec, 0xeb74, 0x0000, 0x0000, 0x0000, 0x0000, 0xe837,
+ /* b0 */ 0xe9d4, 0x0000, 0xf033, 0x0000, 0x0000, 0x0000, 0xe653, 0xe696,
+ /* b8 */ 0x0000, 0xe86f, 0x0000, 0xf2b3, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x051a9 ***/
+
+ /* 80 */ 0xec5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fd, 0xf478,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf2c5, 0x0000, 0xeee7, 0x0000, 0x0000, 0xe6fd, 0x0000,
+ /* 98 */ 0x0000, 0xeece, 0x0000, 0x0000, 0xeadc, 0x0000, 0xf7c7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xeaac, 0x0000, 0xe66a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe934, 0x0000, 0x0000, 0x0000, 0xf348,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x051e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5fa, 0x0000, 0xed99, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe654, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf57c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf331, 0x0000, 0xea3a, 0x0000,
+ /* a0 */ 0x0000, 0xe84c, 0xe79e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf864, 0x0000, 0x0000, 0x0000, 0xf175, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf938, 0x0000, 0x0000, 0xf176,
+ /* b8 */ 0x0000, 0x0000, 0xe75b,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x05222 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf8b9, 0x0000, 0xed63, 0x0000, 0xe1f9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe2d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe07a, 0x0000, 0x0000, 0xe2d4, 0x0000, 0xf74d, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x0525c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf557, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf06f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf7db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe547, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf0e5, 0x0000, 0x0000, 0xebd2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf034, 0x0000, 0x0000, 0x0000, 0xf852,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x0529c ***/
+
+ /* 80 */ 0xf8e1, 0xf87d, 0xf332, 0xe193, 0x0000, 0xf833, 0xec99, 0x0000,
+ /* 88 */ 0xec5e, 0x0000, 0xeff5, 0x0000, 0xebeb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeee8, 0xef67, 0xe89a, 0xe55b, 0x0000, 0x0000, 0x0000, 0xf6f6,
+ /* 98 */ 0xe655, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe579, 0x0000, 0x0000,
+ /* b0 */ 0xf89c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe194, 0xf6dd, 0x0000, 0xea4a,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x052d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe238, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf349, 0xeda0, 0xed59, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed64, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf053, 0x0000, 0xf2b4, 0x0000, 0x0000, 0x0000, 0xe6be, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8e2, 0x0000, 0xe1d3,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf2b5, 0x0000, 0x0000, 0x0000, 0xf879,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05308 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf7a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeabd,
+ /* b0 */ 0x0000, 0xf6c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05344 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf79f, 0x0000, 0x0000, 0xf79e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xea3b, 0xe8e8, 0x0000, 0x0000, 0xecdd,
+ /* a0 */ 0x0000, 0xebe2, 0xe3c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf660, 0xf0e6, 0xe89b,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf157, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea9a, 0xf779, 0xecde,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x05383 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe297, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf853, 0xedd7, 0x0000, 0xf158, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf4c9, 0x0000, 0x0000, 0xed4b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xee3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2b6, 0x0000,
+ /* a0 */ 0xe94f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe24d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x053be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe753, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe35f, 0x0000, 0xe2fa, 0xf4ca, 0xeb67, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe3c7, 0xefae, 0x0000, 0xef4d, 0x0000, 0x0000, 0xf854,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x053e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec5f, 0x0000,
+ /* 98 */ 0x0000, 0xf855, 0x0000, 0x0000, 0x0000, 0xf7b8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe970, 0x0000, 0x0000,
+ /* a8 */ 0xf8b0, 0x0000, 0x0000, 0x0000, 0xe739, 0xeddf, 0xf7a7, 0x0000,
+ /* b0 */ 0x0000, 0xf67e, 0x0000, 0xf65c, 0xec9a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf193, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x05427 ***/
+
+ /* 80 */ 0x0000, 0xe870, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf3d2, 0xe45c, 0xe2cb, 0x0000, 0x0000, 0xe04d, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe9bf, 0x0000, 0x0000, 0x0000, 0xf691, 0x0000, 0xea9b,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf844, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe5ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e7,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x05467 ***/
+
+ /* 80 */ 0x0000, 0xea4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe950, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c8, 0xe3c9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf74e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe0f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe59b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e2, 0xebd3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x054a7 ***/
+
+ /* 80 */ 0xe779, 0x0000, 0x0000, 0xf7a0, 0x0000, 0xe2cc, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9a4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe298, 0x0000, 0xf860,
+ /* 98 */ 0x0000, 0x0000, 0xe195, 0xee4e, 0x0000, 0x0000, 0x0000, 0xf63e,
+ /* a0 */ 0x0000, 0x0000, 0xe5f0, 0x0000, 0x0000, 0xe3ca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf94e, 0xe5f1,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x054d2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe1e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf845,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9abxx - offset 0x0550b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xec60, 0xf599, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe1d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeea3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a5,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x0553a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xec61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a2,
+ /* a8 */ 0x0000, 0x0000, 0xf6e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe331, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x05579 ***/
+
+ /* 80 */ 0x0000, 0xe26a, 0xf8eb, 0xe8a6, 0xe8de, 0xe775, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf070,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe73a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xede0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe66b,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x055ab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c6, 0x0000,
+ /* 90 */ 0x0000, 0xf77a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed65,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe299, 0x0000, 0x0000, 0xeb68, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9afxx - offset 0x055e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe6ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf57d, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe196, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x05615 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e3, 0x0000, 0x0000,
+ /* 90 */ 0xed5a, 0x0000, 0xe971, 0x0000, 0x0000, 0xf7c8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf94f, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xef37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe754,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x05651 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0be,
+ /* 88 */ 0x0000, 0xe93e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f7,
+ /* 98 */ 0x0000, 0x0000, 0x0000,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x0566c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf378, 0x0000, 0xe9c0,
+ /* a8 */ 0x0000, 0xe2cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe995, 0xe7b0, 0x0000, 0xee79,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x056a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xed4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf054, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed7c, 0x0000,
+ /* a8 */ 0xed75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf8f8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x056df ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe14b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed4d, 0x0000, 0x0000,
+ /* a0 */ 0xe1dc, 0xe7f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9df, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf1ce,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x05712 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe7d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeda3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7cd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x0574e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ae, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2ce,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf63f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf9d3, 0xf0ed, 0xe66c,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x05789 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeda4, 0x0000, 0x0000, 0x0000, 0xe5b6,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x057a8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe66d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7e9, 0x0000, 0x0000, 0x0000, 0xeea4, 0x0000, 0xe673,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x057e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3cb, 0xe674, 0x0000, 0x0000, 0x0000, 0xe5f2,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea9c, 0x0000, 0xe6f8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe77a, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d5, 0xe79f, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe73b, 0x0000, 0x0000, 0xf9cb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x05827 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf96c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb38, 0xe5f3, 0x0000,
+ /* 90 */ 0x0000, 0xf9d9, 0x0000, 0x0000, 0xe133, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe7f9, 0x0000, 0x0000, 0xe4ea, 0xf5f5, 0x0000, 0xf2c7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe4da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe84d, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x05860 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef38,
+ /* 88 */ 0xe93f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf333, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe1d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeb39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xea3c,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x0589c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf34a, 0xf241, 0x0000, 0x0000, 0xf242, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf65d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf262,
+ /* a0 */ 0x0000, 0xe656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb75,
+ /* a8 */ 0x0000, 0x0000, 0xf4bb, 0x0000, 0xede1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed5b,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x058d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a3, 0x0000, 0x0000,
+ /* 90 */ 0xe8c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2cf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab0xx - offset 0x05914 ***/
+
+ /* 80 */ 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868,
+ /* 88 */ 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870,
+ /* 90 */ 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879,
+ /* 98 */ 0x887a, 0x887b, 0x887c, 0x887d, 0x8881, 0x8882, 0x8883, 0x8884,
+ /* a0 */ 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888a, 0x888b, 0x888c,
+ /* a8 */ 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895,
+ /* b0 */ 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d,
+ /* b8 */ 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8,
+
+ /*** Three byte table, leaf: eab1xx - offset 0x05954 ***/
+
+ /* 80 */ 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0,
+ /* 88 */ 0x88b1, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9,
+ /* 90 */ 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88c1, 0x88c2, 0x88c3, 0x88c4,
+ /* 98 */ 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc,
+ /* a0 */ 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d4, 0x88d5,
+ /* a8 */ 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd,
+ /* b0 */ 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8,
+ /* b8 */ 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0,
+
+ /*** Three byte table, leaf: eab2xx - offset 0x05994 ***/
+
+ /* 80 */ 0x88f1, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9,
+ /* 88 */ 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x8941, 0x8942, 0x8943, 0x8944,
+ /* 90 */ 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c,
+ /* 98 */ 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8953, 0x8954, 0x8955,
+ /* a0 */ 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d,
+ /* a8 */ 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968,
+ /* b0 */ 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970,
+ /* b8 */ 0x8971, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979,
+
+ /*** Three byte table, leaf: eab3xx - offset 0x059d4 ***/
+
+ /* 80 */ 0x897a, 0x897b, 0x897c, 0x897d, 0x8981, 0x8982, 0x8983, 0x8984,
+ /* 88 */ 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c,
+ /* 90 */ 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8993, 0x8994, 0x8995,
+ /* 98 */ 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d,
+ /* a0 */ 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8,
+ /* a8 */ 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0,
+ /* b0 */ 0x89b1, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9,
+ /* b8 */ 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89c1, 0x89c2, 0x89c3, 0x89c4,
+
+ /*** Three byte table, leaf: eab4xx - offset 0x05a14 ***/
+
+ /* 80 */ 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc,
+ /* 88 */ 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d3, 0x89d4, 0x89d5,
+ /* 90 */ 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd,
+ /* 98 */ 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8,
+ /* a0 */ 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0,
+ /* a8 */ 0x89f1, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9,
+ /* b0 */ 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x8a41, 0x8a42, 0x8a43, 0x8a44,
+ /* b8 */ 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c,
+
+ /*** Three byte table, leaf: eab5xx - offset 0x05a54 ***/
+
+ /* 80 */ 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a53, 0x8a54, 0x8a55,
+ /* 88 */ 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d,
+ /* 90 */ 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68,
+ /* 98 */ 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70,
+ /* a0 */ 0x8a71, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79,
+ /* a8 */ 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a81, 0x8a82, 0x8a83, 0x8a84,
+ /* b0 */ 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c,
+ /* b8 */ 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a93, 0x8a94, 0x8a95,
+
+ /*** Three byte table, leaf: eab6xx - offset 0x05a94 ***/
+
+ /* 80 */ 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d,
+ /* 88 */ 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8,
+ /* 90 */ 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0,
+ /* 98 */ 0x8ab1, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9,
+ /* a0 */ 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4,
+ /* a8 */ 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc,
+ /* b0 */ 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5,
+ /* b8 */ 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add,
+
+ /*** Three byte table, leaf: eab7xx - offset 0x05ad4 ***/
+
+ /* 80 */ 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8,
+ /* 88 */ 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0,
+ /* 90 */ 0x8af1, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9,
+ /* 98 */ 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8b41, 0x8b42, 0x8b43, 0x8b44,
+ /* a0 */ 0x8b45, 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c,
+ /* a8 */ 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b53, 0x8b54, 0x8b55,
+ /* b0 */ 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d,
+ /* b8 */ 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68,
+
+ /*** Three byte table, leaf: eab8xx - offset 0x05b14 ***/
+
+ /* 80 */ 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70,
+ /* 88 */ 0x8b71, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79,
+ /* 90 */ 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b81, 0x8b82, 0x8b83, 0x8b84,
+ /* 98 */ 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c,
+ /* a0 */ 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b93, 0x8b94, 0x8b95,
+ /* a8 */ 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d,
+ /* b0 */ 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8,
+ /* b8 */ 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0,
+
+ /*** Three byte table, leaf: eab9xx - offset 0x05b54 ***/
+
+ /* 80 */ 0x8bb1, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9,
+ /* 88 */ 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8c61, 0x8c62, 0x8c63, 0x8c64,
+ /* 90 */ 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c,
+ /* 98 */ 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c73, 0x8c74, 0x8c75,
+ /* a0 */ 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d,
+ /* a8 */ 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88,
+ /* b0 */ 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90,
+ /* b8 */ 0x8c91, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99,
+
+ /*** Three byte table, leaf: eabaxx - offset 0x05b94 ***/
+
+ /* 80 */ 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4,
+ /* 88 */ 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac,
+ /* 90 */ 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb3, 0x8cb4, 0x8cb5,
+ /* 98 */ 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd,
+ /* a0 */ 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8,
+ /* a8 */ 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0,
+ /* b0 */ 0x8cd1, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9,
+ /* b8 */ 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4,
+
+ /*** Three byte table, leaf: eabbxx - offset 0x05bd4 ***/
+
+ /* 80 */ 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec,
+ /* 88 */ 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf3, 0x8cf4, 0x8cf5,
+ /* 90 */ 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd,
+ /* 98 */ 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48,
+ /* a0 */ 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50,
+ /* a8 */ 0x8d51, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59,
+ /* b0 */ 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d61, 0x8d62, 0x8d63, 0x8d64,
+ /* b8 */ 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c,
+
+ /*** Three byte table, leaf: eabcxx - offset 0x05c14 ***/
+
+ /* 80 */ 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d73, 0x8d74, 0x8d75,
+ /* 88 */ 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d,
+ /* 90 */ 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88,
+ /* 98 */ 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90,
+ /* a0 */ 0x8d91, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99,
+ /* a8 */ 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8da1, 0x8da2, 0x8da3, 0x8da4,
+ /* b0 */ 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac,
+ /* b8 */ 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db3, 0x8db4, 0x8db5,
+
+ /*** Three byte table, leaf: eabdxx - offset 0x05c54 ***/
+
+ /* 80 */ 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd,
+ /* 88 */ 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8,
+ /* 90 */ 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0,
+ /* 98 */ 0x8dd1, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9,
+ /* a0 */ 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8de1, 0x8de2, 0x8de3, 0x8de4,
+ /* a8 */ 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec,
+ /* b0 */ 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df3, 0x8df4, 0x8df5,
+ /* b8 */ 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd,
+
+ /*** Three byte table, leaf: eabexx - offset 0x05c94 ***/
+
+ /* 80 */ 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48,
+ /* 88 */ 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50,
+ /* 90 */ 0x8e51, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59,
+ /* 98 */ 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e61, 0x8e62, 0x8e63, 0x8e64,
+ /* a0 */ 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c,
+ /* a8 */ 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e73, 0x8e74, 0x8e75,
+ /* b0 */ 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d,
+ /* b8 */ 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88,
+
+ /*** Three byte table, leaf: eabfxx - offset 0x05cd4 ***/
+
+ /* 80 */ 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90,
+ /* 88 */ 0x8e91, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99,
+ /* 90 */ 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4,
+ /* 98 */ 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac,
+ /* a0 */ 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb3, 0x8eb4, 0x8eb5,
+ /* a8 */ 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd,
+ /* b0 */ 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8,
+ /* b8 */ 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0,
+
+ /*** Three byte table, leaf: eb80xx - offset 0x05d14 ***/
+
+ /* 80 */ 0x8ed1, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9,
+ /* 88 */ 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4,
+ /* 90 */ 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec,
+ /* 98 */ 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef3, 0x8ef4, 0x8ef5,
+ /* a0 */ 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd,
+ /* a8 */ 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, 0x8f48,
+ /* b0 */ 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50,
+ /* b8 */ 0x8f51, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59,
+
+ /*** Three byte table, leaf: eb81xx - offset 0x05d54 ***/
+
+ /* 80 */ 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f61, 0x8f62, 0x8f63, 0x8f64,
+ /* 88 */ 0x8f65, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c,
+ /* 90 */ 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f73, 0x8f74, 0x8f75,
+ /* 98 */ 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d,
+ /* a0 */ 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, 0x8f88,
+ /* a8 */ 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90,
+ /* b0 */ 0x8f91, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99,
+ /* b8 */ 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4,
+
+ /*** Three byte table, leaf: eb82xx - offset 0x05d94 ***/
+
+ /* 80 */ 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac,
+ /* 88 */ 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb3, 0x8fb4, 0x8fb5,
+ /* 90 */ 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd,
+ /* 98 */ 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068,
+ /* a0 */ 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070,
+ /* a8 */ 0x9071, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079,
+ /* b0 */ 0x907a, 0x907b, 0x907c, 0x907d, 0x9081, 0x9082, 0x9083, 0x9084,
+ /* b8 */ 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908a, 0x908b, 0x908c,
+
+ /*** Three byte table, leaf: eb83xx - offset 0x05dd4 ***/
+
+ /* 80 */ 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9093, 0x9094, 0x9095,
+ /* 88 */ 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d,
+ /* 90 */ 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8,
+ /* 98 */ 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0,
+ /* a0 */ 0x90b1, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9,
+ /* a8 */ 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90c1, 0x90c2, 0x90c3, 0x90c4,
+ /* b0 */ 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc,
+ /* b8 */ 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d3, 0x90d4, 0x90d5,
+
+ /*** Three byte table, leaf: eb84xx - offset 0x05e14 ***/
+
+ /* 80 */ 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd,
+ /* 88 */ 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8,
+ /* 90 */ 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0,
+ /* 98 */ 0x90f1, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9,
+ /* a0 */ 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x9141, 0x9142, 0x9143, 0x9144,
+ /* a8 */ 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b, 0x914c,
+ /* b0 */ 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9153, 0x9154, 0x9155,
+ /* b8 */ 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d,
+
+ /*** Three byte table, leaf: eb85xx - offset 0x05e54 ***/
+
+ /* 80 */ 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168,
+ /* 88 */ 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170,
+ /* 90 */ 0x9171, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179,
+ /* 98 */ 0x917a, 0x917b, 0x917c, 0x917d, 0x9181, 0x9182, 0x9183, 0x9184,
+ /* a0 */ 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c,
+ /* a8 */ 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9193, 0x9194, 0x9195,
+ /* b0 */ 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d,
+ /* b8 */ 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8,
+
+ /*** Three byte table, leaf: eb86xx - offset 0x05e94 ***/
+
+ /* 80 */ 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0,
+ /* 88 */ 0x91b1, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9,
+ /* 90 */ 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91c1, 0x91c2, 0x91c3, 0x91c4,
+ /* 98 */ 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc,
+ /* a0 */ 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d3, 0x91d4, 0x91d5,
+ /* a8 */ 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd,
+ /* b0 */ 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8,
+ /* b8 */ 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0,
+
+ /*** Three byte table, leaf: eb87xx - offset 0x05ed4 ***/
+
+ /* 80 */ 0x91f1, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9,
+ /* 88 */ 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x9241, 0x9242, 0x9243, 0x9244,
+ /* 90 */ 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c,
+ /* 98 */ 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9253, 0x9254, 0x9255,
+ /* a0 */ 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d,
+ /* a8 */ 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268,
+ /* b0 */ 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270,
+ /* b8 */ 0x9271, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279,
+
+ /*** Three byte table, leaf: eb88xx - offset 0x05f14 ***/
+
+ /* 80 */ 0x927a, 0x927b, 0x927c, 0x927d, 0x9281, 0x9282, 0x9283, 0x9284,
+ /* 88 */ 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c,
+ /* 90 */ 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9293, 0x9294, 0x9295,
+ /* 98 */ 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d,
+ /* a0 */ 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8,
+ /* a8 */ 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0x92af, 0x92b0,
+ /* b0 */ 0x92b1, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9,
+ /* b8 */ 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92c1, 0x92c2, 0x92c3, 0x92c4,
+
+ /*** Three byte table, leaf: eb89xx - offset 0x05f54 ***/
+
+ /* 80 */ 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc,
+ /* 88 */ 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d3, 0x92d4, 0x92d5,
+ /* 90 */ 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd,
+ /* 98 */ 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8,
+ /* a0 */ 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0,
+ /* a8 */ 0x92f1, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9,
+ /* b0 */ 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x9341, 0x9342, 0x9343, 0x9344,
+ /* b8 */ 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c,
+
+ /*** Three byte table, leaf: eb8axx - offset 0x05f94 ***/
+
+ /* 80 */ 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9353, 0x9354, 0x9355,
+ /* 88 */ 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d,
+ /* 90 */ 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368,
+ /* 98 */ 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370,
+ /* a0 */ 0x9371, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,
+ /* a8 */ 0x937a, 0x937b, 0x937c, 0x937d, 0x9381, 0x9382, 0x9383, 0x9384,
+ /* b0 */ 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c,
+ /* b8 */ 0x938d, 0x938e, 0x938f, 0x9390, 0x9391, 0x9393, 0x9394, 0x9395,
+
+ /*** Three byte table, leaf: eb8bxx - offset 0x05fd4 ***/
+
+ /* 80 */ 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d,
+ /* 88 */ 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8,
+ /* 90 */ 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0,
+ /* 98 */ 0x93b1, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9,
+ /* a0 */ 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x9461, 0x9462, 0x9463, 0x9464,
+ /* a8 */ 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c,
+ /* b0 */ 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9473, 0x9474, 0x9475,
+ /* b8 */ 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d,
+
+ /*** Three byte table, leaf: eb8cxx - offset 0x06014 ***/
+
+ /* 80 */ 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488,
+ /* 88 */ 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490,
+ /* 90 */ 0x9491, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499,
+ /* 98 */ 0x949a, 0x949b, 0x949c, 0x949d, 0x94a1, 0x94a2, 0x94a3, 0x94a4,
+ /* a0 */ 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac,
+ /* a8 */ 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b3, 0x94b4, 0x94b5,
+ /* b0 */ 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd,
+ /* b8 */ 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8,
+
+ /*** Three byte table, leaf: eb8dxx - offset 0x06054 ***/
+
+ /* 80 */ 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0,
+ /* 88 */ 0x94d1, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9,
+ /* 90 */ 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94e1, 0x94e2, 0x94e3, 0x94e4,
+ /* 98 */ 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec,
+ /* a0 */ 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f3, 0x94f4, 0x94f5,
+ /* a8 */ 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd,
+ /* b0 */ 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548,
+ /* b8 */ 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550,
+
+ /*** Three byte table, leaf: eb8exx - offset 0x06094 ***/
+
+ /* 80 */ 0x9551, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559,
+ /* 88 */ 0x955a, 0x955b, 0x955c, 0x955d, 0x9561, 0x9562, 0x9563, 0x9564,
+ /* 90 */ 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c,
+ /* 98 */ 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9573, 0x9574, 0x9575,
+ /* a0 */ 0x9576, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d,
+ /* a8 */ 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588,
+ /* b0 */ 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590,
+ /* b8 */ 0x9591, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599,
+
+ /*** Three byte table, leaf: eb8fxx - offset 0x060d4 ***/
+
+ /* 80 */ 0x959a, 0x959b, 0x959c, 0x959d, 0x95a1, 0x95a2, 0x95a3, 0x95a4,
+ /* 88 */ 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac,
+ /* 90 */ 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b3, 0x95b4, 0x95b5,
+ /* 98 */ 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd,
+ /* a0 */ 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8,
+ /* a8 */ 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0,
+ /* b0 */ 0x95d1, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9,
+ /* b8 */ 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95e1, 0x95e2, 0x95e3, 0x95e4,
+
+ /*** Three byte table, leaf: eb90xx - offset 0x06114 ***/
+
+ /* 80 */ 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec,
+ /* 88 */ 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f3, 0x95f4, 0x95f5,
+ /* 90 */ 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd,
+ /* 98 */ 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648,
+ /* a0 */ 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650,
+ /* a8 */ 0x9651, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659,
+ /* b0 */ 0x965a, 0x965b, 0x965c, 0x965d, 0x9661, 0x9662, 0x9663, 0x9664,
+ /* b8 */ 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c,
+
+ /*** Three byte table, leaf: eb91xx - offset 0x06154 ***/
+
+ /* 80 */ 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673, 0x9674, 0x9675,
+ /* 88 */ 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d,
+ /* 90 */ 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688,
+ /* 98 */ 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690,
+ /* a0 */ 0x9691, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699,
+ /* a8 */ 0x969a, 0x969b, 0x969c, 0x969d, 0x96a1, 0x96a2, 0x96a3, 0x96a4,
+ /* b0 */ 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac,
+ /* b8 */ 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b3, 0x96b4, 0x96b5,
+
+ /*** Three byte table, leaf: eb92xx - offset 0x06194 ***/
+
+ /* 80 */ 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd,
+ /* 88 */ 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8,
+ /* 90 */ 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0,
+ /* 98 */ 0x96d1, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9,
+ /* a0 */ 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96e1, 0x96e2, 0x96e3, 0x96e4,
+ /* a8 */ 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec,
+ /* b0 */ 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f3, 0x96f4, 0x96f5,
+ /* b8 */ 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd,
+
+ /*** Three byte table, leaf: eb93xx - offset 0x061d4 ***/
+
+ /* 80 */ 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748,
+ /* 88 */ 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750,
+ /* 90 */ 0x9751, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759,
+ /* 98 */ 0x975a, 0x975b, 0x975c, 0x975d, 0x9761, 0x9762, 0x9763, 0x9764,
+ /* a0 */ 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c,
+ /* a8 */ 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9773, 0x9774, 0x9775,
+ /* b0 */ 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d,
+ /* b8 */ 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788,
+
+ /*** Three byte table, leaf: eb94xx - offset 0x06214 ***/
+
+ /* 80 */ 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790,
+ /* 88 */ 0x9791, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799,
+ /* 90 */ 0x979a, 0x979b, 0x979c, 0x979d, 0x97a1, 0x97a2, 0x97a3, 0x97a4,
+ /* 98 */ 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac,
+ /* a0 */ 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b3, 0x97b4, 0x97b5,
+ /* a8 */ 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd,
+ /* b0 */ 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868,
+ /* b8 */ 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870,
+
+ /*** Three byte table, leaf: eb95xx - offset 0x06254 ***/
+
+ /* 80 */ 0x9871, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879,
+ /* 88 */ 0x987a, 0x987b, 0x987c, 0x987d, 0x9881, 0x9882, 0x9883, 0x9884,
+ /* 90 */ 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c,
+ /* 98 */ 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9893, 0x9894, 0x9895,
+ /* a0 */ 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d,
+ /* a8 */ 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8,
+ /* b0 */ 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0,
+ /* b8 */ 0x98b1, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9,
+
+ /*** Three byte table, leaf: eb96xx - offset 0x06294 ***/
+
+ /* 80 */ 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98c1, 0x98c2, 0x98c3, 0x98c4,
+ /* 88 */ 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc,
+ /* 90 */ 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d3, 0x98d4, 0x98d5,
+ /* 98 */ 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd,
+ /* a0 */ 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8,
+ /* a8 */ 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0,
+ /* b0 */ 0x98f1, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9,
+ /* b8 */ 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x9941, 0x9942, 0x9943, 0x9944,
+
+ /*** Three byte table, leaf: eb97xx - offset 0x062d4 ***/
+
+ /* 80 */ 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c,
+ /* 88 */ 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9953, 0x9954, 0x9955,
+ /* 90 */ 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d,
+ /* 98 */ 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968,
+ /* a0 */ 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970,
+ /* a8 */ 0x9971, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979,
+ /* b0 */ 0x997a, 0x997b, 0x997c, 0x997d, 0x9981, 0x9982, 0x9983, 0x9984,
+ /* b8 */ 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c,
+
+ /*** Three byte table, leaf: eb98xx - offset 0x06314 ***/
+
+ /* 80 */ 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995,
+ /* 88 */ 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d,
+ /* 90 */ 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8,
+ /* 98 */ 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0,
+ /* a0 */ 0x99b1, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9,
+ /* a8 */ 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99c1, 0x99c2, 0x99c3, 0x99c4,
+ /* b0 */ 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc,
+ /* b8 */ 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d3, 0x99d4, 0x99d5,
+
+ /*** Three byte table, leaf: eb99xx - offset 0x06354 ***/
+
+ /* 80 */ 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd,
+ /* 88 */ 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8,
+ /* 90 */ 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0,
+ /* 98 */ 0x99f1, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9,
+ /* a0 */ 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x9a41, 0x9a42, 0x9a43, 0x9a44,
+ /* a8 */ 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c,
+ /* b0 */ 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a53, 0x9a54, 0x9a55,
+ /* b8 */ 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d,
+
+ /*** Three byte table, leaf: eb9axx - offset 0x06394 ***/
+
+ /* 80 */ 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68,
+ /* 88 */ 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70,
+ /* 90 */ 0x9a71, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79,
+ /* 98 */ 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a81, 0x9a82, 0x9a83, 0x9a84,
+ /* a0 */ 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c,
+ /* a8 */ 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a93, 0x9a94, 0x9a95,
+ /* b0 */ 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d,
+ /* b8 */ 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8,
+
+ /*** Three byte table, leaf: eb9bxx - offset 0x063d4 ***/
+
+ /* 80 */ 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0,
+ /* 88 */ 0x9ab1, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9,
+ /* 90 */ 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4,
+ /* 98 */ 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc,
+ /* a0 */ 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ad5,
+ /* a8 */ 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add,
+ /* b0 */ 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8,
+ /* b8 */ 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0,
+
+ /*** Three byte table, leaf: eb9cxx - offset 0x06414 ***/
+
+ /* 80 */ 0x9af1, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9,
+ /* 88 */ 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9b41, 0x9b42, 0x9b43, 0x9b44,
+ /* 90 */ 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c,
+ /* 98 */ 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b53, 0x9b54, 0x9b55,
+ /* a0 */ 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d,
+ /* a8 */ 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68,
+ /* b0 */ 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70,
+ /* b8 */ 0x9b71, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79,
+
+ /*** Three byte table, leaf: eb9dxx - offset 0x06454 ***/
+
+ /* 80 */ 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b81, 0x9b82, 0x9b83, 0x9b84,
+ /* 88 */ 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c,
+ /* 90 */ 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b93, 0x9b94, 0x9b95,
+ /* 98 */ 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d,
+ /* a0 */ 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8,
+ /* a8 */ 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0,
+ /* b0 */ 0x9bb1, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9,
+ /* b8 */ 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9c61, 0x9c62, 0x9c63, 0x9c64,
+
+ /*** Three byte table, leaf: eb9exx - offset 0x06494 ***/
+
+ /* 80 */ 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c,
+ /* 88 */ 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c73, 0x9c74, 0x9c75,
+ /* 90 */ 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d,
+ /* 98 */ 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88,
+ /* a0 */ 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90,
+ /* a8 */ 0x9c91, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99,
+ /* b0 */ 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4,
+ /* b8 */ 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac,
+
+ /*** Three byte table, leaf: eb9fxx - offset 0x064d4 ***/
+
+ /* 80 */ 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb3, 0x9cb4, 0x9cb5,
+ /* 88 */ 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd,
+ /* 90 */ 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8,
+ /* 98 */ 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0,
+ /* a0 */ 0x9cd1, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9,
+ /* a8 */ 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4,
+ /* b0 */ 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec,
+ /* b8 */ 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf3, 0x9cf4, 0x9cf5,
+
+ /*** Three byte table, leaf: eba0xx - offset 0x06514 ***/
+
+ /* 80 */ 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd,
+ /* 88 */ 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48,
+ /* 90 */ 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50,
+ /* 98 */ 0x9d51, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59,
+ /* a0 */ 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d61, 0x9d62, 0x9d63, 0x9d64,
+ /* a8 */ 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c,
+ /* b0 */ 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d73, 0x9d74, 0x9d75,
+ /* b8 */ 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d,
+
+ /*** Three byte table, leaf: eba1xx - offset 0x06554 ***/
+
+ /* 80 */ 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88,
+ /* 88 */ 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90,
+ /* 90 */ 0x9d91, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99,
+ /* 98 */ 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9da1, 0x9da2, 0x9da3, 0x9da4,
+ /* a0 */ 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac,
+ /* a8 */ 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db3, 0x9db4, 0x9db5,
+ /* b0 */ 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd,
+ /* b8 */ 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8,
+
+ /*** Three byte table, leaf: eba2xx - offset 0x06594 ***/
+
+ /* 80 */ 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0,
+ /* 88 */ 0x9dd1, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9,
+ /* 90 */ 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9de1, 0x9de2, 0x9de3, 0x9de4,
+ /* 98 */ 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec,
+ /* a0 */ 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df3, 0x9df4, 0x9df5,
+ /* a8 */ 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd,
+ /* b0 */ 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48,
+ /* b8 */ 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50,
+
+ /*** Three byte table, leaf: eba3xx - offset 0x065d4 ***/
+
+ /* 80 */ 0x9e51, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59,
+ /* 88 */ 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e61, 0x9e62, 0x9e63, 0x9e64,
+ /* 90 */ 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c,
+ /* 98 */ 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e73, 0x9e74, 0x9e75,
+ /* a0 */ 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d,
+ /* a8 */ 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, 0x9e88,
+ /* b0 */ 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90,
+ /* b8 */ 0x9e91, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99,
+
+ /*** Three byte table, leaf: eba4xx - offset 0x06614 ***/
+
+ /* 80 */ 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4,
+ /* 88 */ 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac,
+ /* 90 */ 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb3, 0x9eb4, 0x9eb5,
+ /* 98 */ 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd,
+ /* a0 */ 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8,
+ /* a8 */ 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0,
+ /* b0 */ 0x9ed1, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9,
+ /* b8 */ 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4,
+
+ /*** Three byte table, leaf: eba5xx - offset 0x06654 ***/
+
+ /* 80 */ 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec,
+ /* 88 */ 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef3, 0x9ef4, 0x9ef5,
+ /* 90 */ 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd,
+ /* 98 */ 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f48,
+ /* a0 */ 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50,
+ /* a8 */ 0x9f51, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59,
+ /* b0 */ 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f61, 0x9f62, 0x9f63, 0x9f64,
+ /* b8 */ 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c,
+
+ /*** Three byte table, leaf: eba6xx - offset 0x06694 ***/
+
+ /* 80 */ 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f74, 0x9f75,
+ /* 88 */ 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d,
+ /* 90 */ 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88,
+ /* 98 */ 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90,
+ /* a0 */ 0x9f91, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99,
+ /* a8 */ 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4,
+ /* b0 */ 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac,
+ /* b8 */ 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb3, 0x9fb4, 0x9fb5,
+
+ /*** Three byte table, leaf: eba7xx - offset 0x066d4 ***/
+
+ /* 80 */ 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd,
+ /* 88 */ 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068,
+ /* 90 */ 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070,
+ /* 98 */ 0xa071, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079,
+ /* a0 */ 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa081, 0xa082, 0xa083, 0xa084,
+ /* a8 */ 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c,
+ /* b0 */ 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa093, 0xa094, 0xa095,
+ /* b8 */ 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d,
+
+ /*** Three byte table, leaf: eba8xx - offset 0x06714 ***/
+
+ /* 80 */ 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8,
+ /* 88 */ 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0,
+ /* 90 */ 0xa0b1, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9,
+ /* 98 */ 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4,
+ /* a0 */ 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc,
+ /* a8 */ 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d3, 0xa0d4, 0xa0d5,
+ /* b0 */ 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd,
+ /* b8 */ 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8,
+
+ /*** Three byte table, leaf: eba9xx - offset 0x06754 ***/
+
+ /* 80 */ 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0,
+ /* 88 */ 0xa0f1, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9,
+ /* 90 */ 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa141, 0xa142, 0xa143, 0xa144,
+ /* 98 */ 0xa145, 0xa146, 0xa147, 0xa148, 0xa149, 0xa14a, 0xa14b, 0xa14c,
+ /* a0 */ 0xa14d, 0xa14e, 0xa14f, 0xa150, 0xa151, 0xa153, 0xa154, 0xa155,
+ /* a8 */ 0xa156, 0xa157, 0xa158, 0xa159, 0xa15a, 0xa15b, 0xa15c, 0xa15d,
+ /* b0 */ 0xa161, 0xa162, 0xa163, 0xa164, 0xa165, 0xa166, 0xa167, 0xa168,
+ /* b8 */ 0xa169, 0xa16a, 0xa16b, 0xa16c, 0xa16d, 0xa16e, 0xa16f, 0xa170,
+
+ /*** Three byte table, leaf: ebaaxx - offset 0x06794 ***/
+
+ /* 80 */ 0xa171, 0xa173, 0xa174, 0xa175, 0xa176, 0xa177, 0xa178, 0xa179,
+ /* 88 */ 0xa17a, 0xa17b, 0xa17c, 0xa17d, 0xa181, 0xa182, 0xa183, 0xa184,
+ /* 90 */ 0xa185, 0xa186, 0xa187, 0xa188, 0xa189, 0xa18a, 0xa18b, 0xa18c,
+ /* 98 */ 0xa18d, 0xa18e, 0xa18f, 0xa190, 0xa191, 0xa193, 0xa194, 0xa195,
+ /* a0 */ 0xa196, 0xa197, 0xa198, 0xa199, 0xa19a, 0xa19b, 0xa19c, 0xa19d,
+ /* a8 */ 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8,
+ /* b0 */ 0xa1a9, 0xa1aa, 0xa1ab, 0xa1ac, 0xa1ad, 0xa1ae, 0xa1af, 0xa1b0,
+ /* b8 */ 0xa1b1, 0xa1b3, 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9,
+
+ /*** Three byte table, leaf: ebabxx - offset 0x067d4 ***/
+
+ /* 80 */ 0xa1ba, 0xa1bb, 0xa1bc, 0xa1bd, 0xa1c1, 0xa1c2, 0xa1c3, 0xa1c4,
+ /* 88 */ 0xa1c5, 0xa1c6, 0xa1c7, 0xa1c8, 0xa1c9, 0xa1ca, 0xa1cb, 0xa1cc,
+ /* 90 */ 0xa1cd, 0xa1ce, 0xa1cf, 0xa1d0, 0xa1d1, 0xa1d3, 0xa1d4, 0xa1d5,
+ /* 98 */ 0xa1d6, 0xa1d7, 0xa1d8, 0xa1d9, 0xa1da, 0xa1db, 0xa1dc, 0xa1dd,
+ /* a0 */ 0xa1e1, 0xa1e2, 0xa1e3, 0xa1e4, 0xa1e5, 0xa1e6, 0xa1e7, 0xa1e8,
+ /* a8 */ 0xa1e9, 0xa1ea, 0xa1eb, 0xa1ec, 0xa1ed, 0xa1ee, 0xa1ef, 0xa1f0,
+ /* b0 */ 0xa1f1, 0xa1f3, 0xa1f4, 0xa1f5, 0xa1f6, 0xa1f7, 0xa1f8, 0xa1f9,
+ /* b8 */ 0xa1fa, 0xa1fb, 0xa1fc, 0xa1fd, 0xa241, 0xa242, 0xa243, 0xa244,
+
+ /*** Three byte table, leaf: ebacxx - offset 0x06814 ***/
+
+ /* 80 */ 0xa245, 0xa246, 0xa247, 0xa248, 0xa249, 0xa24a, 0xa24b, 0xa24c,
+ /* 88 */ 0xa24d, 0xa24e, 0xa24f, 0xa250, 0xa251, 0xa253, 0xa254, 0xa255,
+ /* 90 */ 0xa256, 0xa257, 0xa258, 0xa259, 0xa25a, 0xa25b, 0xa25c, 0xa25d,
+ /* 98 */ 0xa261, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268,
+ /* a0 */ 0xa269, 0xa26a, 0xa26b, 0xa26c, 0xa26d, 0xa26e, 0xa26f, 0xa270,
+ /* a8 */ 0xa271, 0xa273, 0xa274, 0xa275, 0xa276, 0xa277, 0xa278, 0xa279,
+ /* b0 */ 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa281, 0xa282, 0xa283, 0xa284,
+ /* b8 */ 0xa285, 0xa286, 0xa287, 0xa288, 0xa289, 0xa28a, 0xa28b, 0xa28c,
+
+ /*** Three byte table, leaf: ebadxx - offset 0x06854 ***/
+
+ /* 80 */ 0xa28d, 0xa28e, 0xa28f, 0xa290, 0xa291, 0xa293, 0xa294, 0xa295,
+ /* 88 */ 0xa296, 0xa297, 0xa298, 0xa299, 0xa29a, 0xa29b, 0xa29c, 0xa29d,
+ /* 90 */ 0xa2a1, 0xa2a2, 0xa2a3, 0xa2a4, 0xa2a5, 0xa2a6, 0xa2a7, 0xa2a8,
+ /* 98 */ 0xa2a9, 0xa2aa, 0xa2ab, 0xa2ac, 0xa2ad, 0xa2ae, 0xa2af, 0xa2b0,
+ /* a0 */ 0xa2b1, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa2b9,
+ /* a8 */ 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4,
+ /* b0 */ 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc,
+ /* b8 */ 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d3, 0xa2d4, 0xa2d5,
+
+ /*** Three byte table, leaf: ebaexx - offset 0x06894 ***/
+
+ /* 80 */ 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd,
+ /* 88 */ 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8,
+ /* 90 */ 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0,
+ /* 98 */ 0xa2f1, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9,
+ /* a0 */ 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa341, 0xa342, 0xa343, 0xa344,
+ /* a8 */ 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c,
+ /* b0 */ 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa353, 0xa354, 0xa355,
+ /* b8 */ 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d,
+
+ /*** Three byte table, leaf: ebafxx - offset 0x068d4 ***/
+
+ /* 80 */ 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368,
+ /* 88 */ 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370,
+ /* 90 */ 0xa371, 0xa373, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379,
+ /* 98 */ 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa381, 0xa382, 0xa383, 0xa384,
+ /* a0 */ 0xa385, 0xa386, 0xa387, 0xa388, 0xa389, 0xa38a, 0xa38b, 0xa38c,
+ /* a8 */ 0xa38d, 0xa38e, 0xa38f, 0xa390, 0xa391, 0xa393, 0xa394, 0xa395,
+ /* b0 */ 0xa396, 0xa397, 0xa398, 0xa399, 0xa39a, 0xa39b, 0xa39c, 0xa39d,
+ /* b8 */ 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8,
+
+ /*** Three byte table, leaf: ebb0xx - offset 0x06914 ***/
+
+ /* 80 */ 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0,
+ /* 88 */ 0xa3b1, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9,
+ /* 90 */ 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa461, 0xa462, 0xa463, 0xa464,
+ /* 98 */ 0xa465, 0xa466, 0xa467, 0xa468, 0xa469, 0xa46a, 0xa46b, 0xa46c,
+ /* a0 */ 0xa46d, 0xa46e, 0xa46f, 0xa470, 0xa471, 0xa473, 0xa474, 0xa475,
+ /* a8 */ 0xa476, 0xa477, 0xa478, 0xa479, 0xa47a, 0xa47b, 0xa47c, 0xa47d,
+ /* b0 */ 0xa481, 0xa482, 0xa483, 0xa484, 0xa485, 0xa486, 0xa487, 0xa488,
+ /* b8 */ 0xa489, 0xa48a, 0xa48b, 0xa48c, 0xa48d, 0xa48e, 0xa48f, 0xa490,
+
+ /*** Three byte table, leaf: ebb1xx - offset 0x06954 ***/
+
+ /* 80 */ 0xa491, 0xa493, 0xa494, 0xa495, 0xa496, 0xa497, 0xa498, 0xa499,
+ /* 88 */ 0xa49a, 0xa49b, 0xa49c, 0xa49d, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4,
+ /* 90 */ 0xa4a5, 0xa4a6, 0xa4a7, 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac,
+ /* 98 */ 0xa4ad, 0xa4ae, 0xa4af, 0xa4b0, 0xa4b1, 0xa4b3, 0xa4b4, 0xa4b5,
+ /* a0 */ 0xa4b6, 0xa4b7, 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd,
+ /* a8 */ 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7, 0xa4c8,
+ /* b0 */ 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf, 0xa4d0,
+ /* b8 */ 0xa4d1, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, 0xa4d8, 0xa4d9,
+
+ /*** Three byte table, leaf: ebb2xx - offset 0x06994 ***/
+
+ /* 80 */ 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4,
+ /* 88 */ 0xa4e5, 0xa4e6, 0xa4e7, 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec,
+ /* 90 */ 0xa4ed, 0xa4ee, 0xa4ef, 0xa4f0, 0xa4f1, 0xa4f3, 0xa4f4, 0xa4f5,
+ /* 98 */ 0xa4f6, 0xa4f7, 0xa4f8, 0xa4f9, 0xa4fa, 0xa4fb, 0xa4fc, 0xa4fd,
+ /* a0 */ 0xa541, 0xa542, 0xa543, 0xa544, 0xa545, 0xa546, 0xa547, 0xa548,
+ /* a8 */ 0xa549, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa54e, 0xa54f, 0xa550,
+ /* b0 */ 0xa551, 0xa553, 0xa554, 0xa555, 0xa556, 0xa557, 0xa558, 0xa559,
+ /* b8 */ 0xa55a, 0xa55b, 0xa55c, 0xa55d, 0xa561, 0xa562, 0xa563, 0xa564,
+
+ /*** Three byte table, leaf: ebb3xx - offset 0x069d4 ***/
+
+ /* 80 */ 0xa565, 0xa566, 0xa567, 0xa568, 0xa569, 0xa56a, 0xa56b, 0xa56c,
+ /* 88 */ 0xa56d, 0xa56e, 0xa56f, 0xa570, 0xa571, 0xa573, 0xa574, 0xa575,
+ /* 90 */ 0xa576, 0xa577, 0xa578, 0xa579, 0xa57a, 0xa57b, 0xa57c, 0xa57d,
+ /* 98 */ 0xa581, 0xa582, 0xa583, 0xa584, 0xa585, 0xa586, 0xa587, 0xa588,
+ /* a0 */ 0xa589, 0xa58a, 0xa58b, 0xa58c, 0xa58d, 0xa58e, 0xa58f, 0xa590,
+ /* a8 */ 0xa591, 0xa593, 0xa594, 0xa595, 0xa596, 0xa597, 0xa598, 0xa599,
+ /* b0 */ 0xa59a, 0xa59b, 0xa59c, 0xa59d, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4,
+ /* b8 */ 0xa5a5, 0xa5a6, 0xa5a7, 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac,
+
+ /*** Three byte table, leaf: ebb4xx - offset 0x06a14 ***/
+
+ /* 80 */ 0xa5ad, 0xa5ae, 0xa5af, 0xa5b0, 0xa5b1, 0xa5b3, 0xa5b4, 0xa5b5,
+ /* 88 */ 0xa5b6, 0xa5b7, 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd,
+ /* 90 */ 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7, 0xa5c8,
+ /* 98 */ 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf, 0xa5d0,
+ /* a0 */ 0xa5d1, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7, 0xa5d8, 0xa5d9,
+ /* a8 */ 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4,
+ /* b0 */ 0xa5e5, 0xa5e6, 0xa5e7, 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec,
+ /* b8 */ 0xa5ed, 0xa5ee, 0xa5ef, 0xa5f0, 0xa5f1, 0xa5f3, 0xa5f4, 0xa5f5,
+
+ /*** Three byte table, leaf: ebb5xx - offset 0x06a54 ***/
+
+ /* 80 */ 0xa5f6, 0xa5f7, 0xa5f8, 0xa5f9, 0xa5fa, 0xa5fb, 0xa5fc, 0xa5fd,
+ /* 88 */ 0xa641, 0xa642, 0xa643, 0xa644, 0xa645, 0xa646, 0xa647, 0xa648,
+ /* 90 */ 0xa649, 0xa64a, 0xa64b, 0xa64c, 0xa64d, 0xa64e, 0xa64f, 0xa650,
+ /* 98 */ 0xa651, 0xa653, 0xa654, 0xa655, 0xa656, 0xa657, 0xa658, 0xa659,
+ /* a0 */ 0xa65a, 0xa65b, 0xa65c, 0xa65d, 0xa661, 0xa662, 0xa663, 0xa664,
+ /* a8 */ 0xa665, 0xa666, 0xa667, 0xa668, 0xa669, 0xa66a, 0xa66b, 0xa66c,
+ /* b0 */ 0xa66d, 0xa66e, 0xa66f, 0xa670, 0xa671, 0xa673, 0xa674, 0xa675,
+ /* b8 */ 0xa676, 0xa677, 0xa678, 0xa679, 0xa67a, 0xa67b, 0xa67c, 0xa67d,
+
+ /*** Three byte table, leaf: ebb6xx - offset 0x06a94 ***/
+
+ /* 80 */ 0xa681, 0xa682, 0xa683, 0xa684, 0xa685, 0xa686, 0xa687, 0xa688,
+ /* 88 */ 0xa689, 0xa68a, 0xa68b, 0xa68c, 0xa68d, 0xa68e, 0xa68f, 0xa690,
+ /* 90 */ 0xa691, 0xa693, 0xa694, 0xa695, 0xa696, 0xa697, 0xa698, 0xa699,
+ /* 98 */ 0xa69a, 0xa69b, 0xa69c, 0xa69d, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4,
+ /* a0 */ 0xa6a5, 0xa6a6, 0xa6a7, 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac,
+ /* a8 */ 0xa6ad, 0xa6ae, 0xa6af, 0xa6b0, 0xa6b1, 0xa6b3, 0xa6b4, 0xa6b5,
+ /* b0 */ 0xa6b6, 0xa6b7, 0xa6b8, 0xa6b9, 0xa6ba, 0xa6bb, 0xa6bc, 0xa6bd,
+ /* b8 */ 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7, 0xa6c8,
+
+ /*** Three byte table, leaf: ebb7xx - offset 0x06ad4 ***/
+
+ /* 80 */ 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf, 0xa6d0,
+ /* 88 */ 0xa6d1, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6, 0xa6d7, 0xa6d8, 0xa6d9,
+ /* 90 */ 0xa6da, 0xa6db, 0xa6dc, 0xa6dd, 0xa6e1, 0xa6e2, 0xa6e3, 0xa6e4,
+ /* 98 */ 0xa6e5, 0xa6e6, 0xa6e7, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0xa6ec,
+ /* a0 */ 0xa6ed, 0xa6ee, 0xa6ef, 0xa6f0, 0xa6f1, 0xa6f3, 0xa6f4, 0xa6f5,
+ /* a8 */ 0xa6f6, 0xa6f7, 0xa6f8, 0xa6f9, 0xa6fa, 0xa6fb, 0xa6fc, 0xa6fd,
+ /* b0 */ 0xa741, 0xa742, 0xa743, 0xa744, 0xa745, 0xa746, 0xa747, 0xa748,
+ /* b8 */ 0xa749, 0xa74a, 0xa74b, 0xa74c, 0xa74d, 0xa74e, 0xa74f, 0xa750,
+
+ /*** Three byte table, leaf: ebb8xx - offset 0x06b14 ***/
+
+ /* 80 */ 0xa751, 0xa753, 0xa754, 0xa755, 0xa756, 0xa757, 0xa758, 0xa759,
+ /* 88 */ 0xa75a, 0xa75b, 0xa75c, 0xa75d, 0xa761, 0xa762, 0xa763, 0xa764,
+ /* 90 */ 0xa765, 0xa766, 0xa767, 0xa768, 0xa769, 0xa76a, 0xa76b, 0xa76c,
+ /* 98 */ 0xa76d, 0xa76e, 0xa76f, 0xa770, 0xa771, 0xa773, 0xa774, 0xa775,
+ /* a0 */ 0xa776, 0xa777, 0xa778, 0xa779, 0xa77a, 0xa77b, 0xa77c, 0xa77d,
+ /* a8 */ 0xa781, 0xa782, 0xa783, 0xa784, 0xa785, 0xa786, 0xa787, 0xa788,
+ /* b0 */ 0xa789, 0xa78a, 0xa78b, 0xa78c, 0xa78d, 0xa78e, 0xa78f, 0xa790,
+ /* b8 */ 0xa791, 0xa793, 0xa794, 0xa795, 0xa796, 0xa797, 0xa798, 0xa799,
+
+ /*** Three byte table, leaf: ebb9xx - offset 0x06b54 ***/
+
+ /* 80 */ 0xa79a, 0xa79b, 0xa79c, 0xa79d, 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4,
+ /* 88 */ 0xa7a5, 0xa7a6, 0xa7a7, 0xa7a8, 0xa7a9, 0xa7aa, 0xa7ab, 0xa7ac,
+ /* 90 */ 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1, 0xa7b3, 0xa7b4, 0xa7b5,
+ /* 98 */ 0xa7b6, 0xa7b7, 0xa7b8, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd,
+ /* a0 */ 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868,
+ /* a8 */ 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870,
+ /* b0 */ 0xa871, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0xa878, 0xa879,
+ /* b8 */ 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa881, 0xa882, 0xa883, 0xa884,
+
+ /*** Three byte table, leaf: ebbaxx - offset 0x06b94 ***/
+
+ /* 80 */ 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c,
+ /* 88 */ 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa893, 0xa894, 0xa895,
+ /* 90 */ 0xa896, 0xa897, 0xa898, 0xa899, 0xa89a, 0xa89b, 0xa89c, 0xa89d,
+ /* 98 */ 0xa8a1, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a5, 0xa8a6, 0xa8a7, 0xa8a8,
+ /* a0 */ 0xa8a9, 0xa8aa, 0xa8ab, 0xa8ac, 0xa8ad, 0xa8ae, 0xa8af, 0xa8b0,
+ /* a8 */ 0xa8b1, 0xa8b3, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8, 0xa8b9,
+ /* b0 */ 0xa8ba, 0xa8bb, 0xa8bc, 0xa8bd, 0xa8c1, 0xa8c2, 0xa8c3, 0xa8c4,
+ /* b8 */ 0xa8c5, 0xa8c6, 0xa8c7, 0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc,
+
+ /*** Three byte table, leaf: ebbbxx - offset 0x06bd4 ***/
+
+ /* 80 */ 0xa8cd, 0xa8ce, 0xa8cf, 0xa8d0, 0xa8d1, 0xa8d3, 0xa8d4, 0xa8d5,
+ /* 88 */ 0xa8d6, 0xa8d7, 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc, 0xa8dd,
+ /* 90 */ 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7, 0xa8e8,
+ /* 98 */ 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, 0xa8ed, 0xa8ee, 0xa8ef, 0xa8f0,
+ /* a0 */ 0xa8f1, 0xa8f3, 0xa8f4, 0xa8f5, 0xa8f6, 0xa8f7, 0xa8f8, 0xa8f9,
+ /* a8 */ 0xa8fa, 0xa8fb, 0xa8fc, 0xa8fd, 0xa941, 0xa942, 0xa943, 0xa944,
+ /* b0 */ 0xa945, 0xa946, 0xa947, 0xa948, 0xa949, 0xa94a, 0xa94b, 0xa94c,
+ /* b8 */ 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa953, 0xa954, 0xa955,
+
+ /*** Three byte table, leaf: ebbcxx - offset 0x06c14 ***/
+
+ /* 80 */ 0xa956, 0xa957, 0xa958, 0xa959, 0xa95a, 0xa95b, 0xa95c, 0xa95d,
+ /* 88 */ 0xa961, 0xa962, 0xa963, 0xa964, 0xa965, 0xa966, 0xa967, 0xa968,
+ /* 90 */ 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970,
+ /* 98 */ 0xa971, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979,
+ /* a0 */ 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa981, 0xa982, 0xa983, 0xa984,
+ /* a8 */ 0xa985, 0xa986, 0xa987, 0xa988, 0xa989, 0xa98a, 0xa98b, 0xa98c,
+ /* b0 */ 0xa98d, 0xa98e, 0xa98f, 0xa990, 0xa991, 0xa993, 0xa994, 0xa995,
+ /* b8 */ 0xa996, 0xa997, 0xa998, 0xa999, 0xa99a, 0xa99b, 0xa99c, 0xa99d,
+
+ /*** Three byte table, leaf: ebbdxx - offset 0x06c54 ***/
+
+ /* 80 */ 0xa9a1, 0xa9a2, 0xa9a3, 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8,
+ /* 88 */ 0xa9a9, 0xa9aa, 0xa9ab, 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0,
+ /* 90 */ 0xa9b1, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9,
+ /* 98 */ 0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c4,
+ /* a0 */ 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb, 0xa9cc,
+ /* a8 */ 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d3, 0xa9d4, 0xa9d5,
+ /* b0 */ 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9, 0xa9da, 0xa9db, 0xa9dc, 0xa9dd,
+ /* b8 */ 0xa9e1, 0xa9e2, 0xa9e3, 0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, 0xa9e8,
+
+ /*** Three byte table, leaf: ebbexx - offset 0x06c94 ***/
+
+ /* 80 */ 0xa9e9, 0xa9ea, 0xa9eb, 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0xa9f0,
+ /* 88 */ 0xa9f1, 0xa9f3, 0xa9f4, 0xa9f5, 0xa9f6, 0xa9f7, 0xa9f8, 0xa9f9,
+ /* 90 */ 0xa9fa, 0xa9fb, 0xa9fc, 0xa9fd, 0xaa41, 0xaa42, 0xaa43, 0xaa44,
+ /* 98 */ 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c,
+ /* a0 */ 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, 0xaa53, 0xaa54, 0xaa55,
+ /* a8 */ 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d,
+ /* b0 */ 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68,
+ /* b8 */ 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70,
+
+ /*** Three byte table, leaf: ebbfxx - offset 0x06cd4 ***/
+
+ /* 80 */ 0xaa71, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79,
+ /* 88 */ 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa81, 0xaa82, 0xaa83, 0xaa84,
+ /* 90 */ 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c,
+ /* 98 */ 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa93, 0xaa94, 0xaa95,
+ /* a0 */ 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d,
+ /* a8 */ 0xaaa1, 0xaaa2, 0xaaa3, 0xaaa4, 0xaaa5, 0xaaa6, 0xaaa7, 0xaaa8,
+ /* b0 */ 0xaaa9, 0xaaaa, 0xaaab, 0xaaac, 0xaaad, 0xaaae, 0xaaaf, 0xaab0,
+ /* b8 */ 0xaab1, 0xaab3, 0xaab4, 0xaab5, 0xaab6, 0xaab7, 0xaab8, 0xaab9,
+
+ /*** Three byte table, leaf: ec80xx - offset 0x06d14 ***/
+
+ /* 80 */ 0xaaba, 0xaabb, 0xaabc, 0xaabd, 0xaac1, 0xaac2, 0xaac3, 0xaac4,
+ /* 88 */ 0xaac5, 0xaac6, 0xaac7, 0xaac8, 0xaac9, 0xaaca, 0xaacb, 0xaacc,
+ /* 90 */ 0xaacd, 0xaace, 0xaacf, 0xaad0, 0xaad1, 0xaad3, 0xaad4, 0xaad5,
+ /* 98 */ 0xaad6, 0xaad7, 0xaad8, 0xaad9, 0xaada, 0xaadb, 0xaadc, 0xaadd,
+ /* a0 */ 0xaae1, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7, 0xaae8,
+ /* a8 */ 0xaae9, 0xaaea, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef, 0xaaf0,
+ /* b0 */ 0xaaf1, 0xaaf3, 0xaaf4, 0xaaf5, 0xaaf6, 0xaaf7, 0xaaf8, 0xaaf9,
+ /* b8 */ 0xaafa, 0xaafb, 0xaafc, 0xaafd, 0xab41, 0xab42, 0xab43, 0xab44,
+
+ /*** Three byte table, leaf: ec81xx - offset 0x06d54 ***/
+
+ /* 80 */ 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c,
+ /* 88 */ 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, 0xab53, 0xab54, 0xab55,
+ /* 90 */ 0xab56, 0xab57, 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d,
+ /* 98 */ 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68,
+ /* a0 */ 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70,
+ /* a8 */ 0xab71, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79,
+ /* b0 */ 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab81, 0xab82, 0xab83, 0xab84,
+ /* b8 */ 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c,
+
+ /*** Three byte table, leaf: ec82xx - offset 0x06d94 ***/
+
+ /* 80 */ 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab93, 0xab94, 0xab95,
+ /* 88 */ 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d,
+ /* 90 */ 0xaba1, 0xaba2, 0xaba3, 0xaba4, 0xaba5, 0xaba6, 0xaba7, 0xaba8,
+ /* 98 */ 0xaba9, 0xabaa, 0xabab, 0xabac, 0xabad, 0xabae, 0xabaf, 0xabb0,
+ /* a0 */ 0xabb1, 0xabb3, 0xabb4, 0xabb5, 0xabb6, 0xabb7, 0xabb8, 0xabb9,
+ /* a8 */ 0xabba, 0xabbb, 0xabbc, 0xabbd, 0xac61, 0xac62, 0xac63, 0xac64,
+ /* b0 */ 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c,
+ /* b8 */ 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac73, 0xac74, 0xac75,
+
+ /*** Three byte table, leaf: ec83xx - offset 0x06dd4 ***/
+
+ /* 80 */ 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d,
+ /* 88 */ 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88,
+ /* 90 */ 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90,
+ /* 98 */ 0xac91, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99,
+ /* a0 */ 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xaca1, 0xaca2, 0xaca3, 0xaca4,
+ /* a8 */ 0xaca5, 0xaca6, 0xaca7, 0xaca8, 0xaca9, 0xacaa, 0xacab, 0xacac,
+ /* b0 */ 0xacad, 0xacae, 0xacaf, 0xacb0, 0xacb1, 0xacb3, 0xacb4, 0xacb5,
+ /* b8 */ 0xacb6, 0xacb7, 0xacb8, 0xacb9, 0xacba, 0xacbb, 0xacbc, 0xacbd,
+
+ /*** Three byte table, leaf: ec84xx - offset 0x06e14 ***/
+
+ /* 80 */ 0xacc1, 0xacc2, 0xacc3, 0xacc4, 0xacc5, 0xacc6, 0xacc7, 0xacc8,
+ /* 88 */ 0xacc9, 0xacca, 0xaccb, 0xaccc, 0xaccd, 0xacce, 0xaccf, 0xacd0,
+ /* 90 */ 0xacd1, 0xacd3, 0xacd4, 0xacd5, 0xacd6, 0xacd7, 0xacd8, 0xacd9,
+ /* 98 */ 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xace1, 0xace2, 0xace3, 0xace4,
+ /* a0 */ 0xace5, 0xace6, 0xace7, 0xace8, 0xace9, 0xacea, 0xaceb, 0xacec,
+ /* a8 */ 0xaced, 0xacee, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf4, 0xacf5,
+ /* b0 */ 0xacf6, 0xacf7, 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0xacfc, 0xacfd,
+ /* b8 */ 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48,
+
+ /*** Three byte table, leaf: ec85xx - offset 0x06e54 ***/
+
+ /* 80 */ 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50,
+ /* 88 */ 0xad51, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59,
+ /* 90 */ 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad61, 0xad62, 0xad63, 0xad64,
+ /* 98 */ 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c,
+ /* a0 */ 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad73, 0xad74, 0xad75,
+ /* a8 */ 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d,
+ /* b0 */ 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88,
+ /* b8 */ 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90,
+
+ /*** Three byte table, leaf: ec86xx - offset 0x06e94 ***/
+
+ /* 80 */ 0xad91, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99,
+ /* 88 */ 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xada1, 0xada2, 0xada3, 0xada4,
+ /* 90 */ 0xada5, 0xada6, 0xada7, 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac,
+ /* 98 */ 0xadad, 0xadae, 0xadaf, 0xadb0, 0xadb1, 0xadb3, 0xadb4, 0xadb5,
+ /* a0 */ 0xadb6, 0xadb7, 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd,
+ /* a8 */ 0xadc1, 0xadc2, 0xadc3, 0xadc4, 0xadc5, 0xadc6, 0xadc7, 0xadc8,
+ /* b0 */ 0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, 0xadd0,
+ /* b8 */ 0xadd1, 0xadd3, 0xadd4, 0xadd5, 0xadd6, 0xadd7, 0xadd8, 0xadd9,
+
+ /*** Three byte table, leaf: ec87xx - offset 0x06ed4 ***/
+
+ /* 80 */ 0xadda, 0xaddb, 0xaddc, 0xaddd, 0xade1, 0xade2, 0xade3, 0xade4,
+ /* 88 */ 0xade5, 0xade6, 0xade7, 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec,
+ /* 90 */ 0xaded, 0xadee, 0xadef, 0xadf0, 0xadf1, 0xadf3, 0xadf4, 0xadf5,
+ /* 98 */ 0xadf6, 0xadf7, 0xadf8, 0xadf9, 0xadfa, 0xadfb, 0xadfc, 0xadfd,
+ /* a0 */ 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48,
+ /* a8 */ 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50,
+ /* b0 */ 0xae51, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59,
+ /* b8 */ 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae61, 0xae62, 0xae63, 0xae64,
+
+ /*** Three byte table, leaf: ec88xx - offset 0x06f14 ***/
+
+ /* 80 */ 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c,
+ /* 88 */ 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae73, 0xae74, 0xae75,
+ /* 90 */ 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d,
+ /* 98 */ 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88,
+ /* a0 */ 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90,
+ /* a8 */ 0xae91, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99,
+ /* b0 */ 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xaea1, 0xaea2, 0xaea3, 0xaea4,
+ /* b8 */ 0xaea5, 0xaea6, 0xaea7, 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac,
+
+ /*** Three byte table, leaf: ec89xx - offset 0x06f54 ***/
+
+ /* 80 */ 0xaead, 0xaeae, 0xaeaf, 0xaeb0, 0xaeb1, 0xaeb3, 0xaeb4, 0xaeb5,
+ /* 88 */ 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0xaebc, 0xaebd,
+ /* 90 */ 0xaec1, 0xaec2, 0xaec3, 0xaec4, 0xaec5, 0xaec6, 0xaec7, 0xaec8,
+ /* 98 */ 0xaec9, 0xaeca, 0xaecb, 0xaecc, 0xaecd, 0xaece, 0xaecf, 0xaed0,
+ /* a0 */ 0xaed1, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, 0xaed8, 0xaed9,
+ /* a8 */ 0xaeda, 0xaedb, 0xaedc, 0xaedd, 0xaee1, 0xaee2, 0xaee3, 0xaee4,
+ /* b0 */ 0xaee5, 0xaee6, 0xaee7, 0xaee8, 0xaee9, 0xaeea, 0xaeeb, 0xaeec,
+ /* b8 */ 0xaeed, 0xaeee, 0xaeef, 0xaef0, 0xaef1, 0xaef3, 0xaef4, 0xaef5,
+
+ /*** Three byte table, leaf: ec8axx - offset 0x06f94 ***/
+
+ /* 80 */ 0xaef6, 0xaef7, 0xaef8, 0xaef9, 0xaefa, 0xaefb, 0xaefc, 0xaefd,
+ /* 88 */ 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48,
+ /* 90 */ 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50,
+ /* 98 */ 0xaf51, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59,
+ /* a0 */ 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf61, 0xaf62, 0xaf63, 0xaf64,
+ /* a8 */ 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c,
+ /* b0 */ 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf73, 0xaf74, 0xaf75,
+ /* b8 */ 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d,
+
+ /*** Three byte table, leaf: ec8bxx - offset 0x06fd4 ***/
+
+ /* 80 */ 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88,
+ /* 88 */ 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90,
+ /* 90 */ 0xaf91, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99,
+ /* 98 */ 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xafa1, 0xafa2, 0xafa3, 0xafa4,
+ /* a0 */ 0xafa5, 0xafa6, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac,
+ /* a8 */ 0xafad, 0xafae, 0xafaf, 0xafb0, 0xafb1, 0xafb3, 0xafb4, 0xafb5,
+ /* b0 */ 0xafb6, 0xafb7, 0xafb8, 0xafb9, 0xafba, 0xafbb, 0xafbc, 0xafbd,
+ /* b8 */ 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068,
+
+ /*** Three byte table, leaf: ec8cxx - offset 0x07014 ***/
+
+ /* 80 */ 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070,
+ /* 88 */ 0xb071, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079,
+ /* 90 */ 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb081, 0xb082, 0xb083, 0xb084,
+ /* 98 */ 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c,
+ /* a0 */ 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb093, 0xb094, 0xb095,
+ /* a8 */ 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d,
+ /* b0 */ 0xb0a1, 0xb0a2, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0a8,
+ /* b8 */ 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, 0xb0b0,
+
+ /*** Three byte table, leaf: ec8dxx - offset 0x07054 ***/
+
+ /* 80 */ 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b6, 0xb0b7, 0xb0b8, 0xb0b9,
+ /* 88 */ 0xb0ba, 0xb0bb, 0xb0bc, 0xb0bd, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c4,
+ /* 90 */ 0xb0c5, 0xb0c6, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0ca, 0xb0cb, 0xb0cc,
+ /* 98 */ 0xb0cd, 0xb0ce, 0xb0cf, 0xb0d0, 0xb0d1, 0xb0d3, 0xb0d4, 0xb0d5,
+ /* a0 */ 0xb0d6, 0xb0d7, 0xb0d8, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd,
+ /* a8 */ 0xb0e1, 0xb0e2, 0xb0e3, 0xb0e4, 0xb0e5, 0xb0e6, 0xb0e7, 0xb0e8,
+ /* b0 */ 0xb0e9, 0xb0ea, 0xb0eb, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, 0xb0f0,
+ /* b8 */ 0xb0f1, 0xb0f3, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, 0xb0f8, 0xb0f9,
+
+ /*** Three byte table, leaf: ec8exx - offset 0x07094 ***/
+
+ /* 80 */ 0xb0fa, 0xb0fb, 0xb0fc, 0xb0fd, 0xb141, 0xb142, 0xb143, 0xb144,
+ /* 88 */ 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c,
+ /* 90 */ 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb153, 0xb154, 0xb155,
+ /* 98 */ 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d,
+ /* a0 */ 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168,
+ /* a8 */ 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170,
+ /* b0 */ 0xb171, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179,
+ /* b8 */ 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb181, 0xb182, 0xb183, 0xb184,
+
+ /*** Three byte table, leaf: ec8fxx - offset 0x070d4 ***/
+
+ /* 80 */ 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c,
+ /* 88 */ 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb193, 0xb194, 0xb195,
+ /* 90 */ 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d,
+ /* 98 */ 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0xb1a5, 0xb1a6, 0xb1a7, 0xb1a8,
+ /* a0 */ 0xb1a9, 0xb1aa, 0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, 0xb1b0,
+ /* a8 */ 0xb1b1, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, 0xb1b8, 0xb1b9,
+ /* b0 */ 0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4,
+ /* b8 */ 0xb1c5, 0xb1c6, 0xb1c7, 0xb1c8, 0xb1c9, 0xb1ca, 0xb1cb, 0xb1cc,
+
+ /*** Three byte table, leaf: ec90xx - offset 0x07114 ***/
+
+ /* 80 */ 0xb1cd, 0xb1ce, 0xb1cf, 0xb1d0, 0xb1d1, 0xb1d3, 0xb1d4, 0xb1d5,
+ /* 88 */ 0xb1d6, 0xb1d7, 0xb1d8, 0xb1d9, 0xb1da, 0xb1db, 0xb1dc, 0xb1dd,
+ /* 90 */ 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, 0xb1e8,
+ /* 98 */ 0xb1e9, 0xb1ea, 0xb1eb, 0xb1ec, 0xb1ed, 0xb1ee, 0xb1ef, 0xb1f0,
+ /* a0 */ 0xb1f1, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, 0xb1f8, 0xb1f9,
+ /* a8 */ 0xb1fa, 0xb1fb, 0xb1fc, 0xb1fd, 0xb241, 0xb242, 0xb243, 0xb244,
+ /* b0 */ 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c,
+ /* b8 */ 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb253, 0xb254, 0xb255,
+
+ /*** Three byte table, leaf: ec91xx - offset 0x07154 ***/
+
+ /* 80 */ 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d,
+ /* 88 */ 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268,
+ /* 90 */ 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270,
+ /* 98 */ 0xb271, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279,
+ /* a0 */ 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb281, 0xb282, 0xb283, 0xb284,
+ /* a8 */ 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c,
+ /* b0 */ 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb293, 0xb294, 0xb295,
+ /* b8 */ 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d,
+
+ /*** Three byte table, leaf: ec92xx - offset 0x07194 ***/
+
+ /* 80 */ 0xb2a1, 0xb2a2, 0xb2a3, 0xb2a4, 0xb2a5, 0xb2a6, 0xb2a7, 0xb2a8,
+ /* 88 */ 0xb2a9, 0xb2aa, 0xb2ab, 0xb2ac, 0xb2ad, 0xb2ae, 0xb2af, 0xb2b0,
+ /* 90 */ 0xb2b1, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0xb2b9,
+ /* 98 */ 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bd, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4,
+ /* a0 */ 0xb2c5, 0xb2c6, 0xb2c7, 0xb2c8, 0xb2c9, 0xb2ca, 0xb2cb, 0xb2cc,
+ /* a8 */ 0xb2cd, 0xb2ce, 0xb2cf, 0xb2d0, 0xb2d1, 0xb2d3, 0xb2d4, 0xb2d5,
+ /* b0 */ 0xb2d6, 0xb2d7, 0xb2d8, 0xb2d9, 0xb2da, 0xb2db, 0xb2dc, 0xb2dd,
+ /* b8 */ 0xb2e1, 0xb2e2, 0xb2e3, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e7, 0xb2e8,
+
+ /*** Three byte table, leaf: ec93xx - offset 0x071d4 ***/
+
+ /* 80 */ 0xb2e9, 0xb2ea, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f0,
+ /* 88 */ 0xb2f1, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f6, 0xb2f7, 0xb2f8, 0xb2f9,
+ /* 90 */ 0xb2fa, 0xb2fb, 0xb2fc, 0xb2fd, 0xb341, 0xb342, 0xb343, 0xb344,
+ /* 98 */ 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c,
+ /* a0 */ 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb353, 0xb354, 0xb355,
+ /* a8 */ 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d,
+ /* b0 */ 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368,
+ /* b8 */ 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370,
+
+ /*** Three byte table, leaf: ec94xx - offset 0x07214 ***/
+
+ /* 80 */ 0xb371, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379,
+ /* 88 */ 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb381, 0xb382, 0xb383, 0xb384,
+ /* 90 */ 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c,
+ /* 98 */ 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb393, 0xb394, 0xb395,
+ /* a0 */ 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d,
+ /* a8 */ 0xb3a1, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a6, 0xb3a7, 0xb3a8,
+ /* b0 */ 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ac, 0xb3ad, 0xb3ae, 0xb3af, 0xb3b0,
+ /* b8 */ 0xb3b1, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8, 0xb3b9,
+
+ /*** Three byte table, leaf: ec95xx - offset 0x07254 ***/
+
+ /* 80 */ 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb461, 0xb462, 0xb463, 0xb464,
+ /* 88 */ 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c,
+ /* 90 */ 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb473, 0xb474, 0xb475,
+ /* 98 */ 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d,
+ /* a0 */ 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488,
+ /* a8 */ 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490,
+ /* b0 */ 0xb491, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499,
+ /* b8 */ 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb4a1, 0xb4a2, 0xb4a3, 0xb4a4,
+
+ /*** Three byte table, leaf: ec96xx - offset 0x07294 ***/
+
+ /* 80 */ 0xb4a5, 0xb4a6, 0xb4a7, 0xb4a8, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ac,
+ /* 88 */ 0xb4ad, 0xb4ae, 0xb4af, 0xb4b0, 0xb4b1, 0xb4b3, 0xb4b4, 0xb4b5,
+ /* 90 */ 0xb4b6, 0xb4b7, 0xb4b8, 0xb4b9, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd,
+ /* 98 */ 0xb4c1, 0xb4c2, 0xb4c3, 0xb4c4, 0xb4c5, 0xb4c6, 0xb4c7, 0xb4c8,
+ /* a0 */ 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, 0xb4d0,
+ /* a8 */ 0xb4d1, 0xb4d3, 0xb4d4, 0xb4d5, 0xb4d6, 0xb4d7, 0xb4d8, 0xb4d9,
+ /* b0 */ 0xb4da, 0xb4db, 0xb4dc, 0xb4dd, 0xb4e1, 0xb4e2, 0xb4e3, 0xb4e4,
+ /* b8 */ 0xb4e5, 0xb4e6, 0xb4e7, 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb, 0xb4ec,
+
+ /*** Three byte table, leaf: ec97xx - offset 0x072d4 ***/
+
+ /* 80 */ 0xb4ed, 0xb4ee, 0xb4ef, 0xb4f0, 0xb4f1, 0xb4f3, 0xb4f4, 0xb4f5,
+ /* 88 */ 0xb4f6, 0xb4f7, 0xb4f8, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd,
+ /* 90 */ 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548,
+ /* 98 */ 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550,
+ /* a0 */ 0xb551, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559,
+ /* a8 */ 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb561, 0xb562, 0xb563, 0xb564,
+ /* b0 */ 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c,
+ /* b8 */ 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb573, 0xb574, 0xb575,
+
+ /*** Three byte table, leaf: ec98xx - offset 0x07314 ***/
+
+ /* 80 */ 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d,
+ /* 88 */ 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588,
+ /* 90 */ 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590,
+ /* 98 */ 0xb591, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599,
+ /* a0 */ 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb5a1, 0xb5a2, 0xb5a3, 0xb5a4,
+ /* a8 */ 0xb5a5, 0xb5a6, 0xb5a7, 0xb5a8, 0xb5a9, 0xb5aa, 0xb5ab, 0xb5ac,
+ /* b0 */ 0xb5ad, 0xb5ae, 0xb5af, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5,
+ /* b8 */ 0xb5b6, 0xb5b7, 0xb5b8, 0xb5b9, 0xb5ba, 0xb5bb, 0xb5bc, 0xb5bd,
+
+ /*** Three byte table, leaf: ec99xx - offset 0x07354 ***/
+
+ /* 80 */ 0xb5c1, 0xb5c2, 0xb5c3, 0xb5c4, 0xb5c5, 0xb5c6, 0xb5c7, 0xb5c8,
+ /* 88 */ 0xb5c9, 0xb5ca, 0xb5cb, 0xb5cc, 0xb5cd, 0xb5ce, 0xb5cf, 0xb5d0,
+ /* 90 */ 0xb5d1, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7, 0xb5d8, 0xb5d9,
+ /* 98 */ 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4,
+ /* a0 */ 0xb5e5, 0xb5e6, 0xb5e7, 0xb5e8, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ec,
+ /* a8 */ 0xb5ed, 0xb5ee, 0xb5ef, 0xb5f0, 0xb5f1, 0xb5f3, 0xb5f4, 0xb5f5,
+ /* b0 */ 0xb5f6, 0xb5f7, 0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd,
+ /* b8 */ 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648,
+
+ /*** Three byte table, leaf: ec9axx - offset 0x07394 ***/
+
+ /* 80 */ 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650,
+ /* 88 */ 0xb651, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659,
+ /* 90 */ 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb661, 0xb662, 0xb663, 0xb664,
+ /* 98 */ 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c,
+ /* a0 */ 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb673, 0xb674, 0xb675,
+ /* a8 */ 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d,
+ /* b0 */ 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688,
+ /* b8 */ 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690,
+
+ /*** Three byte table, leaf: ec9bxx - offset 0x073d4 ***/
+
+ /* 80 */ 0xb691, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699,
+ /* 88 */ 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a4,
+ /* 90 */ 0xb6a5, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a9, 0xb6aa, 0xb6ab, 0xb6ac,
+ /* 98 */ 0xb6ad, 0xb6ae, 0xb6af, 0xb6b0, 0xb6b1, 0xb6b3, 0xb6b4, 0xb6b5,
+ /* a0 */ 0xb6b6, 0xb6b7, 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bd,
+ /* a8 */ 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, 0xb6c8,
+ /* b0 */ 0xb6c9, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, 0xb6d0,
+ /* b8 */ 0xb6d1, 0xb6d3, 0xb6d4, 0xb6d5, 0xb6d6, 0xb6d7, 0xb6d8, 0xb6d9,
+
+ /*** Three byte table, leaf: ec9cxx - offset 0x07414 ***/
+
+ /* 80 */ 0xb6da, 0xb6db, 0xb6dc, 0xb6dd, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4,
+ /* 88 */ 0xb6e5, 0xb6e6, 0xb6e7, 0xb6e8, 0xb6e9, 0xb6ea, 0xb6eb, 0xb6ec,
+ /* 90 */ 0xb6ed, 0xb6ee, 0xb6ef, 0xb6f0, 0xb6f1, 0xb6f3, 0xb6f4, 0xb6f5,
+ /* 98 */ 0xb6f6, 0xb6f7, 0xb6f8, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fd,
+ /* a0 */ 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748,
+ /* a8 */ 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750,
+ /* b0 */ 0xb751, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759,
+ /* b8 */ 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb761, 0xb762, 0xb763, 0xb764,
+
+ /*** Three byte table, leaf: ec9dxx - offset 0x07454 ***/
+
+ /* 80 */ 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c,
+ /* 88 */ 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb773, 0xb774, 0xb775,
+ /* 90 */ 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d,
+ /* 98 */ 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788,
+ /* a0 */ 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790,
+ /* a8 */ 0xb791, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799,
+ /* b0 */ 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4,
+ /* b8 */ 0xb7a5, 0xb7a6, 0xb7a7, 0xb7a8, 0xb7a9, 0xb7aa, 0xb7ab, 0xb7ac,
+
+ /*** Three byte table, leaf: ec9exx - offset 0x07494 ***/
+
+ /* 80 */ 0xb7ad, 0xb7ae, 0xb7af, 0xb7b0, 0xb7b1, 0xb7b3, 0xb7b4, 0xb7b5,
+ /* 88 */ 0xb7b6, 0xb7b7, 0xb7b8, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd,
+ /* 90 */ 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868,
+ /* 98 */ 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870,
+ /* a0 */ 0xb871, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879,
+ /* a8 */ 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb881, 0xb882, 0xb883, 0xb884,
+ /* b0 */ 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c,
+ /* b8 */ 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb893, 0xb894, 0xb895,
+
+ /*** Three byte table, leaf: ec9fxx - offset 0x074d4 ***/
+
+ /* 80 */ 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d,
+ /* 88 */ 0xb8a1, 0xb8a2, 0xb8a3, 0xb8a4, 0xb8a5, 0xb8a6, 0xb8a7, 0xb8a8,
+ /* 90 */ 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, 0xb8b0,
+ /* 98 */ 0xb8b1, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb8b7, 0xb8b8, 0xb8b9,
+ /* a0 */ 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8c1, 0xb8c2, 0xb8c3, 0xb8c4,
+ /* a8 */ 0xb8c5, 0xb8c6, 0xb8c7, 0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0xb8cc,
+ /* b0 */ 0xb8cd, 0xb8ce, 0xb8cf, 0xb8d0, 0xb8d1, 0xb8d3, 0xb8d4, 0xb8d5,
+ /* b8 */ 0xb8d6, 0xb8d7, 0xb8d8, 0xb8d9, 0xb8da, 0xb8db, 0xb8dc, 0xb8dd,
+
+ /*** Three byte table, leaf: eca0xx - offset 0x07514 ***/
+
+ /* 80 */ 0xb8e1, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, 0xb8e8,
+ /* 88 */ 0xb8e9, 0xb8ea, 0xb8eb, 0xb8ec, 0xb8ed, 0xb8ee, 0xb8ef, 0xb8f0,
+ /* 90 */ 0xb8f1, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, 0xb8f8, 0xb8f9,
+ /* 98 */ 0xb8fa, 0xb8fb, 0xb8fc, 0xb8fd, 0xb941, 0xb942, 0xb943, 0xb944,
+ /* a0 */ 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c,
+ /* a8 */ 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb953, 0xb954, 0xb955,
+ /* b0 */ 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d,
+ /* b8 */ 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968,
+
+ /*** Three byte table, leaf: eca1xx - offset 0x07554 ***/
+
+ /* 80 */ 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970,
+ /* 88 */ 0xb971, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979,
+ /* 90 */ 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb981, 0xb982, 0xb983, 0xb984,
+ /* 98 */ 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c,
+ /* a0 */ 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb993, 0xb994, 0xb995,
+ /* a8 */ 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d,
+ /* b0 */ 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6, 0xb9a7, 0xb9a8,
+ /* b8 */ 0xb9a9, 0xb9aa, 0xb9ab, 0xb9ac, 0xb9ad, 0xb9ae, 0xb9af, 0xb9b0,
+
+ /*** Three byte table, leaf: eca2xx - offset 0x07594 ***/
+
+ /* 80 */ 0xb9b1, 0xb9b3, 0xb9b4, 0xb9b5, 0xb9b6, 0xb9b7, 0xb9b8, 0xb9b9,
+ /* 88 */ 0xb9ba, 0xb9bb, 0xb9bc, 0xb9bd, 0xb9c1, 0xb9c2, 0xb9c3, 0xb9c4,
+ /* 90 */ 0xb9c5, 0xb9c6, 0xb9c7, 0xb9c8, 0xb9c9, 0xb9ca, 0xb9cb, 0xb9cc,
+ /* 98 */ 0xb9cd, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d3, 0xb9d4, 0xb9d5,
+ /* a0 */ 0xb9d6, 0xb9d7, 0xb9d8, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc, 0xb9dd,
+ /* a8 */ 0xb9e1, 0xb9e2, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e6, 0xb9e7, 0xb9e8,
+ /* b0 */ 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ec, 0xb9ed, 0xb9ee, 0xb9ef, 0xb9f0,
+ /* b8 */ 0xb9f1, 0xb9f3, 0xb9f4, 0xb9f5, 0xb9f6, 0xb9f7, 0xb9f8, 0xb9f9,
+
+ /*** Three byte table, leaf: eca3xx - offset 0x075d4 ***/
+
+ /* 80 */ 0xb9fa, 0xb9fb, 0xb9fc, 0xb9fd, 0xba41, 0xba42, 0xba43, 0xba44,
+ /* 88 */ 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c,
+ /* 90 */ 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba53, 0xba54, 0xba55,
+ /* 98 */ 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d,
+ /* a0 */ 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68,
+ /* a8 */ 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70,
+ /* b0 */ 0xba71, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79,
+ /* b8 */ 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba81, 0xba82, 0xba83, 0xba84,
+
+ /*** Three byte table, leaf: eca4xx - offset 0x07614 ***/
+
+ /* 80 */ 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c,
+ /* 88 */ 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba93, 0xba94, 0xba95,
+ /* 90 */ 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d,
+ /* 98 */ 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, 0xbaa8,
+ /* a0 */ 0xbaa9, 0xbaaa, 0xbaab, 0xbaac, 0xbaad, 0xbaae, 0xbaaf, 0xbab0,
+ /* a8 */ 0xbab1, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, 0xbab8, 0xbab9,
+ /* b0 */ 0xbaba, 0xbabb, 0xbabc, 0xbabd, 0xbac1, 0xbac2, 0xbac3, 0xbac4,
+ /* b8 */ 0xbac5, 0xbac6, 0xbac7, 0xbac8, 0xbac9, 0xbaca, 0xbacb, 0xbacc,
+
+ /*** Three byte table, leaf: eca5xx - offset 0x07654 ***/
+
+ /* 80 */ 0xbacd, 0xbace, 0xbacf, 0xbad0, 0xbad1, 0xbad3, 0xbad4, 0xbad5,
+ /* 88 */ 0xbad6, 0xbad7, 0xbad8, 0xbad9, 0xbada, 0xbadb, 0xbadc, 0xbadd,
+ /* 90 */ 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6, 0xbae7, 0xbae8,
+ /* 98 */ 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, 0xbaf0,
+ /* a0 */ 0xbaf1, 0xbaf3, 0xbaf4, 0xbaf5, 0xbaf6, 0xbaf7, 0xbaf8, 0xbaf9,
+ /* a8 */ 0xbafa, 0xbafb, 0xbafc, 0xbafd, 0xbb41, 0xbb42, 0xbb43, 0xbb44,
+ /* b0 */ 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c,
+ /* b8 */ 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb53, 0xbb54, 0xbb55,
+
+ /*** Three byte table, leaf: eca6xx - offset 0x07694 ***/
+
+ /* 80 */ 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d,
+ /* 88 */ 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68,
+ /* 90 */ 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70,
+ /* 98 */ 0xbb71, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79,
+ /* a0 */ 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb81, 0xbb82, 0xbb83, 0xbb84,
+ /* a8 */ 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c,
+ /* b0 */ 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb93, 0xbb94, 0xbb95,
+ /* b8 */ 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d,
+
+ /*** Three byte table, leaf: eca7xx - offset 0x076d4 ***/
+
+ /* 80 */ 0xbba1, 0xbba2, 0xbba3, 0xbba4, 0xbba5, 0xbba6, 0xbba7, 0xbba8,
+ /* 88 */ 0xbba9, 0xbbaa, 0xbbab, 0xbbac, 0xbbad, 0xbbae, 0xbbaf, 0xbbb0,
+ /* 90 */ 0xbbb1, 0xbbb3, 0xbbb4, 0xbbb5, 0xbbb6, 0xbbb7, 0xbbb8, 0xbbb9,
+ /* 98 */ 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbc61, 0xbc62, 0xbc63, 0xbc64,
+ /* a0 */ 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c,
+ /* a8 */ 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc73, 0xbc74, 0xbc75,
+ /* b0 */ 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d,
+ /* b8 */ 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88,
+
+ /*** Three byte table, leaf: eca8xx - offset 0x07714 ***/
+
+ /* 80 */ 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90,
+ /* 88 */ 0xbc91, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99,
+ /* 90 */ 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbca1, 0xbca2, 0xbca3, 0xbca4,
+ /* 98 */ 0xbca5, 0xbca6, 0xbca7, 0xbca8, 0xbca9, 0xbcaa, 0xbcab, 0xbcac,
+ /* a0 */ 0xbcad, 0xbcae, 0xbcaf, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5,
+ /* a8 */ 0xbcb6, 0xbcb7, 0xbcb8, 0xbcb9, 0xbcba, 0xbcbb, 0xbcbc, 0xbcbd,
+ /* b0 */ 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc4, 0xbcc5, 0xbcc6, 0xbcc7, 0xbcc8,
+ /* b8 */ 0xbcc9, 0xbcca, 0xbccb, 0xbccc, 0xbccd, 0xbcce, 0xbccf, 0xbcd0,
+
+ /*** Three byte table, leaf: eca9xx - offset 0x07754 ***/
+
+ /* 80 */ 0xbcd1, 0xbcd3, 0xbcd4, 0xbcd5, 0xbcd6, 0xbcd7, 0xbcd8, 0xbcd9,
+ /* 88 */ 0xbcda, 0xbcdb, 0xbcdc, 0xbcdd, 0xbce1, 0xbce2, 0xbce3, 0xbce4,
+ /* 90 */ 0xbce5, 0xbce6, 0xbce7, 0xbce8, 0xbce9, 0xbcea, 0xbceb, 0xbcec,
+ /* 98 */ 0xbced, 0xbcee, 0xbcef, 0xbcf0, 0xbcf1, 0xbcf3, 0xbcf4, 0xbcf5,
+ /* a0 */ 0xbcf6, 0xbcf7, 0xbcf8, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfc, 0xbcfd,
+ /* a8 */ 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48,
+ /* b0 */ 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50,
+ /* b8 */ 0xbd51, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59,
+
+ /*** Three byte table, leaf: ecaaxx - offset 0x07794 ***/
+
+ /* 80 */ 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd61, 0xbd62, 0xbd63, 0xbd64,
+ /* 88 */ 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c,
+ /* 90 */ 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd73, 0xbd74, 0xbd75,
+ /* 98 */ 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d,
+ /* a0 */ 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88,
+ /* a8 */ 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90,
+ /* b0 */ 0xbd91, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99,
+ /* b8 */ 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbda1, 0xbda2, 0xbda3, 0xbda4,
+
+ /*** Three byte table, leaf: ecabxx - offset 0x077d4 ***/
+
+ /* 80 */ 0xbda5, 0xbda6, 0xbda7, 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac,
+ /* 88 */ 0xbdad, 0xbdae, 0xbdaf, 0xbdb0, 0xbdb1, 0xbdb3, 0xbdb4, 0xbdb5,
+ /* 90 */ 0xbdb6, 0xbdb7, 0xbdb8, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd,
+ /* 98 */ 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, 0xbdc8,
+ /* a0 */ 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc, 0xbdcd, 0xbdce, 0xbdcf, 0xbdd0,
+ /* a8 */ 0xbdd1, 0xbdd3, 0xbdd4, 0xbdd5, 0xbdd6, 0xbdd7, 0xbdd8, 0xbdd9,
+ /* b0 */ 0xbdda, 0xbddb, 0xbddc, 0xbddd, 0xbde1, 0xbde2, 0xbde3, 0xbde4,
+ /* b8 */ 0xbde5, 0xbde6, 0xbde7, 0xbde8, 0xbde9, 0xbdea, 0xbdeb, 0xbdec,
+
+ /*** Three byte table, leaf: ecacxx - offset 0x07814 ***/
+
+ /* 80 */ 0xbded, 0xbdee, 0xbdef, 0xbdf0, 0xbdf1, 0xbdf3, 0xbdf4, 0xbdf5,
+ /* 88 */ 0xbdf6, 0xbdf7, 0xbdf8, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd,
+ /* 90 */ 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48,
+ /* 98 */ 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50,
+ /* a0 */ 0xbe51, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59,
+ /* a8 */ 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe61, 0xbe62, 0xbe63, 0xbe64,
+ /* b0 */ 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c,
+ /* b8 */ 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75,
+
+ /*** Three byte table, leaf: ecadxx - offset 0x07854 ***/
+
+ /* 80 */ 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d,
+ /* 88 */ 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88,
+ /* 90 */ 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90,
+ /* 98 */ 0xbe91, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99,
+ /* a0 */ 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbea1, 0xbea2, 0xbea3, 0xbea4,
+ /* a8 */ 0xbea5, 0xbea6, 0xbea7, 0xbea8, 0xbea9, 0xbeaa, 0xbeab, 0xbeac,
+ /* b0 */ 0xbead, 0xbeae, 0xbeaf, 0xbeb0, 0xbeb1, 0xbeb3, 0xbeb4, 0xbeb5,
+ /* b8 */ 0xbeb6, 0xbeb7, 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd,
+
+ /*** Three byte table, leaf: ecaexx - offset 0x07894 ***/
+
+ /* 80 */ 0xbec1, 0xbec2, 0xbec3, 0xbec4, 0xbec5, 0xbec6, 0xbec7, 0xbec8,
+ /* 88 */ 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, 0xbed0,
+ /* 90 */ 0xbed1, 0xbed3, 0xbed4, 0xbed5, 0xbed6, 0xbed7, 0xbed8, 0xbed9,
+ /* 98 */ 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbee1, 0xbee2, 0xbee3, 0xbee4,
+ /* a0 */ 0xbee5, 0xbee6, 0xbee7, 0xbee8, 0xbee9, 0xbeea, 0xbeeb, 0xbeec,
+ /* a8 */ 0xbeed, 0xbeee, 0xbeef, 0xbef0, 0xbef1, 0xbef3, 0xbef4, 0xbef5,
+ /* b0 */ 0xbef6, 0xbef7, 0xbef8, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0xbefd,
+ /* b8 */ 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48,
+
+ /*** Three byte table, leaf: ecafxx - offset 0x078d4 ***/
+
+ /* 80 */ 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50,
+ /* 88 */ 0xbf51, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59,
+ /* 90 */ 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf61, 0xbf62, 0xbf63, 0xbf64,
+ /* 98 */ 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c,
+ /* a0 */ 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf73, 0xbf74, 0xbf75,
+ /* a8 */ 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d,
+ /* b0 */ 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88,
+ /* b8 */ 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90,
+
+ /*** Three byte table, leaf: ecb0xx - offset 0x07914 ***/
+
+ /* 80 */ 0xbf91, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99,
+ /* 88 */ 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4,
+ /* 90 */ 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac,
+ /* 98 */ 0xbfad, 0xbfae, 0xbfaf, 0xbfb0, 0xbfb1, 0xbfb3, 0xbfb4, 0xbfb5,
+ /* a0 */ 0xbfb6, 0xbfb7, 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd,
+ /* a8 */ 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068,
+ /* b0 */ 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070,
+ /* b8 */ 0xc071, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079,
+
+ /*** Three byte table, leaf: ecb1xx - offset 0x07954 ***/
+
+ /* 80 */ 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc081, 0xc082, 0xc083, 0xc084,
+ /* 88 */ 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c,
+ /* 90 */ 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc093, 0xc094, 0xc095,
+ /* 98 */ 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d,
+ /* a0 */ 0xc0a1, 0xc0a2, 0xc0a3, 0xc0a4, 0xc0a5, 0xc0a6, 0xc0a7, 0xc0a8,
+ /* a8 */ 0xc0a9, 0xc0aa, 0xc0ab, 0xc0ac, 0xc0ad, 0xc0ae, 0xc0af, 0xc0b0,
+ /* b0 */ 0xc0b1, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0b7, 0xc0b8, 0xc0b9,
+ /* b8 */ 0xc0ba, 0xc0bb, 0xc0bc, 0xc0bd, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4,
+
+ /*** Three byte table, leaf: ecb2xx - offset 0x07994 ***/
+
+ /* 80 */ 0xc0c5, 0xc0c6, 0xc0c7, 0xc0c8, 0xc0c9, 0xc0ca, 0xc0cb, 0xc0cc,
+ /* 88 */ 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d0, 0xc0d1, 0xc0d3, 0xc0d4, 0xc0d5,
+ /* 90 */ 0xc0d6, 0xc0d7, 0xc0d8, 0xc0d9, 0xc0da, 0xc0db, 0xc0dc, 0xc0dd,
+ /* 98 */ 0xc0e1, 0xc0e2, 0xc0e3, 0xc0e4, 0xc0e5, 0xc0e6, 0xc0e7, 0xc0e8,
+ /* a0 */ 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ec, 0xc0ed, 0xc0ee, 0xc0ef, 0xc0f0,
+ /* a8 */ 0xc0f1, 0xc0f3, 0xc0f4, 0xc0f5, 0xc0f6, 0xc0f7, 0xc0f8, 0xc0f9,
+ /* b0 */ 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc141, 0xc142, 0xc143, 0xc144,
+ /* b8 */ 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c,
+
+ /*** Three byte table, leaf: ecb3xx - offset 0x079d4 ***/
+
+ /* 80 */ 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc153, 0xc154, 0xc155,
+ /* 88 */ 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d,
+ /* 90 */ 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168,
+ /* 98 */ 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170,
+ /* a0 */ 0xc171, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179,
+ /* a8 */ 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc181, 0xc182, 0xc183, 0xc184,
+ /* b0 */ 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c,
+ /* b8 */ 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc193, 0xc194, 0xc195,
+
+ /*** Three byte table, leaf: ecb4xx - offset 0x07a14 ***/
+
+ /* 80 */ 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d,
+ /* 88 */ 0xc1a1, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a5, 0xc1a6, 0xc1a7, 0xc1a8,
+ /* 90 */ 0xc1a9, 0xc1aa, 0xc1ab, 0xc1ac, 0xc1ad, 0xc1ae, 0xc1af, 0xc1b0,
+ /* 98 */ 0xc1b1, 0xc1b3, 0xc1b4, 0xc1b5, 0xc1b6, 0xc1b7, 0xc1b8, 0xc1b9,
+ /* a0 */ 0xc1ba, 0xc1bb, 0xc1bc, 0xc1bd, 0xc1c1, 0xc1c2, 0xc1c3, 0xc1c4,
+ /* a8 */ 0xc1c5, 0xc1c6, 0xc1c7, 0xc1c8, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cc,
+ /* b0 */ 0xc1cd, 0xc1ce, 0xc1cf, 0xc1d0, 0xc1d1, 0xc1d3, 0xc1d4, 0xc1d5,
+ /* b8 */ 0xc1d6, 0xc1d7, 0xc1d8, 0xc1d9, 0xc1da, 0xc1db, 0xc1dc, 0xc1dd,
+
+ /*** Three byte table, leaf: ecb5xx - offset 0x07a54 ***/
+
+ /* 80 */ 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e4, 0xc1e5, 0xc1e6, 0xc1e7, 0xc1e8,
+ /* 88 */ 0xc1e9, 0xc1ea, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f0,
+ /* 90 */ 0xc1f1, 0xc1f3, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9,
+ /* 98 */ 0xc1fa, 0xc1fb, 0xc1fc, 0xc1fd, 0xc241, 0xc242, 0xc243, 0xc244,
+ /* a0 */ 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c,
+ /* a8 */ 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc253, 0xc254, 0xc255,
+ /* b0 */ 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d,
+ /* b8 */ 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268,
+
+ /*** Three byte table, leaf: ecb6xx - offset 0x07a94 ***/
+
+ /* 80 */ 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270,
+ /* 88 */ 0xc271, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279,
+ /* 90 */ 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc281, 0xc282, 0xc283, 0xc284,
+ /* 98 */ 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c,
+ /* a0 */ 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc293, 0xc294, 0xc295,
+ /* a8 */ 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d,
+ /* b0 */ 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a4, 0xc2a5, 0xc2a6, 0xc2a7, 0xc2a8,
+ /* b8 */ 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ac, 0xc2ad, 0xc2ae, 0xc2af, 0xc2b0,
+
+ /*** Three byte table, leaf: ecb7xx - offset 0x07ad4 ***/
+
+ /* 80 */ 0xc2b1, 0xc2b3, 0xc2b4, 0xc2b5, 0xc2b6, 0xc2b7, 0xc2b8, 0xc2b9,
+ /* 88 */ 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4,
+ /* 90 */ 0xc2c5, 0xc2c6, 0xc2c7, 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc,
+ /* 98 */ 0xc2cd, 0xc2ce, 0xc2cf, 0xc2d0, 0xc2d1, 0xc2d3, 0xc2d4, 0xc2d5,
+ /* a0 */ 0xc2d6, 0xc2d7, 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0xc2dc, 0xc2dd,
+ /* a8 */ 0xc2e1, 0xc2e2, 0xc2e3, 0xc2e4, 0xc2e5, 0xc2e6, 0xc2e7, 0xc2e8,
+ /* b0 */ 0xc2e9, 0xc2ea, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ee, 0xc2ef, 0xc2f0,
+ /* b8 */ 0xc2f1, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f6, 0xc2f7, 0xc2f8, 0xc2f9,
+
+ /*** Three byte table, leaf: ecb8xx - offset 0x07b14 ***/
+
+ /* 80 */ 0xc2fa, 0xc2fb, 0xc2fc, 0xc2fd, 0xc341, 0xc342, 0xc343, 0xc344,
+ /* 88 */ 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c,
+ /* 90 */ 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc353, 0xc354, 0xc355,
+ /* 98 */ 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d,
+ /* a0 */ 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368,
+ /* a8 */ 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370,
+ /* b0 */ 0xc371, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379,
+ /* b8 */ 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc381, 0xc382, 0xc383, 0xc384,
+
+ /*** Three byte table, leaf: ecb9xx - offset 0x07b54 ***/
+
+ /* 80 */ 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c,
+ /* 88 */ 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc393, 0xc394, 0xc395,
+ /* 90 */ 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d,
+ /* 98 */ 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7, 0xc3a8,
+ /* a0 */ 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, 0xc3b0,
+ /* a8 */ 0xc3b1, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9,
+ /* b0 */ 0xc3ba, 0xc3bb, 0xc3bc, 0xc3bd, 0xc461, 0xc462, 0xc463, 0xc464,
+ /* b8 */ 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c,
+
+ /*** Three byte table, leaf: ecbaxx - offset 0x07b94 ***/
+
+ /* 80 */ 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc473, 0xc474, 0xc475,
+ /* 88 */ 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d,
+ /* 90 */ 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488,
+ /* 98 */ 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490,
+ /* a0 */ 0xc491, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499,
+ /* a8 */ 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4,
+ /* b0 */ 0xc4a5, 0xc4a6, 0xc4a7, 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac,
+ /* b8 */ 0xc4ad, 0xc4ae, 0xc4af, 0xc4b0, 0xc4b1, 0xc4b3, 0xc4b4, 0xc4b5,
+
+ /*** Three byte table, leaf: ecbbxx - offset 0x07bd4 ***/
+
+ /* 80 */ 0xc4b6, 0xc4b7, 0xc4b8, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bc, 0xc4bd,
+ /* 88 */ 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5, 0xc4c6, 0xc4c7, 0xc4c8,
+ /* 90 */ 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, 0xc4d0,
+ /* 98 */ 0xc4d1, 0xc4d3, 0xc4d4, 0xc4d5, 0xc4d6, 0xc4d7, 0xc4d8, 0xc4d9,
+ /* a0 */ 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4e1, 0xc4e2, 0xc4e3, 0xc4e4,
+ /* a8 */ 0xc4e5, 0xc4e6, 0xc4e7, 0xc4e8, 0xc4e9, 0xc4ea, 0xc4eb, 0xc4ec,
+ /* b0 */ 0xc4ed, 0xc4ee, 0xc4ef, 0xc4f0, 0xc4f1, 0xc4f3, 0xc4f4, 0xc4f5,
+ /* b8 */ 0xc4f6, 0xc4f7, 0xc4f8, 0xc4f9, 0xc4fa, 0xc4fb, 0xc4fc, 0xc4fd,
+
+ /*** Three byte table, leaf: ecbcxx - offset 0x07c14 ***/
+
+ /* 80 */ 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548,
+ /* 88 */ 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550,
+ /* 90 */ 0xc551, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559,
+ /* 98 */ 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc561, 0xc562, 0xc563, 0xc564,
+ /* a0 */ 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c,
+ /* a8 */ 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575,
+ /* b0 */ 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d,
+ /* b8 */ 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588,
+
+ /*** Three byte table, leaf: ecbdxx - offset 0x07c54 ***/
+
+ /* 80 */ 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590,
+ /* 88 */ 0xc591, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599,
+ /* 90 */ 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4,
+ /* 98 */ 0xc5a5, 0xc5a6, 0xc5a7, 0xc5a8, 0xc5a9, 0xc5aa, 0xc5ab, 0xc5ac,
+ /* a0 */ 0xc5ad, 0xc5ae, 0xc5af, 0xc5b0, 0xc5b1, 0xc5b3, 0xc5b4, 0xc5b5,
+ /* a8 */ 0xc5b6, 0xc5b7, 0xc5b8, 0xc5b9, 0xc5ba, 0xc5bb, 0xc5bc, 0xc5bd,
+ /* b0 */ 0xc5c1, 0xc5c2, 0xc5c3, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8,
+ /* b8 */ 0xc5c9, 0xc5ca, 0xc5cb, 0xc5cc, 0xc5cd, 0xc5ce, 0xc5cf, 0xc5d0,
+
+ /*** Three byte table, leaf: ecbexx - offset 0x07c94 ***/
+
+ /* 80 */ 0xc5d1, 0xc5d3, 0xc5d4, 0xc5d5, 0xc5d6, 0xc5d7, 0xc5d8, 0xc5d9,
+ /* 88 */ 0xc5da, 0xc5db, 0xc5dc, 0xc5dd, 0xc5e1, 0xc5e2, 0xc5e3, 0xc5e4,
+ /* 90 */ 0xc5e5, 0xc5e6, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ec,
+ /* 98 */ 0xc5ed, 0xc5ee, 0xc5ef, 0xc5f0, 0xc5f1, 0xc5f3, 0xc5f4, 0xc5f5,
+ /* a0 */ 0xc5f6, 0xc5f7, 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc5fc, 0xc5fd,
+ /* a8 */ 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648,
+ /* b0 */ 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650,
+ /* b8 */ 0xc651, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659,
+
+ /*** Three byte table, leaf: ecbfxx - offset 0x07cd4 ***/
+
+ /* 80 */ 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc661, 0xc662, 0xc663, 0xc664,
+ /* 88 */ 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c,
+ /* 90 */ 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc673, 0xc674, 0xc675,
+ /* 98 */ 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d,
+ /* a0 */ 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688,
+ /* a8 */ 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690,
+ /* b0 */ 0xc691, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699,
+ /* b8 */ 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4,
+
+ /*** Three byte table, leaf: ed80xx - offset 0x07d14 ***/
+
+ /* 80 */ 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac,
+ /* 88 */ 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b3, 0xc6b4, 0xc6b5,
+ /* 90 */ 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd,
+ /* 98 */ 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8,
+ /* a0 */ 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0,
+ /* a8 */ 0xc6d1, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9,
+ /* b0 */ 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4,
+ /* b8 */ 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec,
+
+ /*** Three byte table, leaf: ed81xx - offset 0x07d54 ***/
+
+ /* 80 */ 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f3, 0xc6f4, 0xc6f5,
+ /* 88 */ 0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd,
+ /* 90 */ 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748,
+ /* 98 */ 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750,
+ /* a0 */ 0xc751, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759,
+ /* a8 */ 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc761, 0xc762, 0xc763, 0xc764,
+ /* b0 */ 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c,
+ /* b8 */ 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc773, 0xc774, 0xc775,
+
+ /*** Three byte table, leaf: ed82xx - offset 0x07d94 ***/
+
+ /* 80 */ 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d,
+ /* 88 */ 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788,
+ /* 90 */ 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790,
+ /* 98 */ 0xc791, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799,
+ /* a0 */ 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4,
+ /* a8 */ 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac,
+ /* b0 */ 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b3, 0xc7b4, 0xc7b5,
+ /* b8 */ 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd,
+
+ /*** Three byte table, leaf: ed83xx - offset 0x07dd4 ***/
+
+ /* 80 */ 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868,
+ /* 88 */ 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870,
+ /* 90 */ 0xc871, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879,
+ /* 98 */ 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc881, 0xc882, 0xc883, 0xc884,
+ /* a0 */ 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c,
+ /* a8 */ 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc893, 0xc894, 0xc895,
+ /* b0 */ 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d,
+ /* b8 */ 0xc8a1, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0xc8a8,
+
+ /*** Three byte table, leaf: ed84xx - offset 0x07e14 ***/
+
+ /* 80 */ 0xc8a9, 0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0,
+ /* 88 */ 0xc8b1, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8, 0xc8b9,
+ /* 90 */ 0xc8ba, 0xc8bb, 0xc8bc, 0xc8bd, 0xc8c1, 0xc8c2, 0xc8c3, 0xc8c4,
+ /* 98 */ 0xc8c5, 0xc8c6, 0xc8c7, 0xc8c8, 0xc8c9, 0xc8ca, 0xc8cb, 0xc8cc,
+ /* a0 */ 0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1, 0xc8d3, 0xc8d4, 0xc8d5,
+ /* a8 */ 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd,
+ /* b0 */ 0xc8e1, 0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8,
+ /* b8 */ 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0,
+
+ /*** Three byte table, leaf: ed85xx - offset 0x07e54 ***/
+
+ /* 80 */ 0xc8f1, 0xc8f3, 0xc8f4, 0xc8f5, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9,
+ /* 88 */ 0xc8fa, 0xc8fb, 0xc8fc, 0xc8fd, 0xc941, 0xc942, 0xc943, 0xc944,
+ /* 90 */ 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c,
+ /* 98 */ 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc953, 0xc954, 0xc955,
+ /* a0 */ 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d,
+ /* a8 */ 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968,
+ /* b0 */ 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970,
+ /* b8 */ 0xc971, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979,
+
+ /*** Three byte table, leaf: ed86xx - offset 0x07e94 ***/
+
+ /* 80 */ 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc981, 0xc982, 0xc983, 0xc984,
+ /* 88 */ 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c,
+ /* 90 */ 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc993, 0xc994, 0xc995,
+ /* 98 */ 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d,
+ /* a0 */ 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8,
+ /* a8 */ 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0,
+ /* b0 */ 0xc9b1, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7, 0xc9b8, 0xc9b9,
+ /* b8 */ 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9c1, 0xc9c2, 0xc9c3, 0xc9c4,
+
+ /*** Three byte table, leaf: ed87xx - offset 0x07ed4 ***/
+
+ /* 80 */ 0xc9c5, 0xc9c6, 0xc9c7, 0xc9c8, 0xc9c9, 0xc9ca, 0xc9cb, 0xc9cc,
+ /* 88 */ 0xc9cd, 0xc9ce, 0xc9cf, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d4, 0xc9d5,
+ /* 90 */ 0xc9d6, 0xc9d7, 0xc9d8, 0xc9d9, 0xc9da, 0xc9db, 0xc9dc, 0xc9dd,
+ /* 98 */ 0xc9e1, 0xc9e2, 0xc9e3, 0xc9e4, 0xc9e5, 0xc9e6, 0xc9e7, 0xc9e8,
+ /* a0 */ 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ec, 0xc9ed, 0xc9ee, 0xc9ef, 0xc9f0,
+ /* a8 */ 0xc9f1, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0xc9f8, 0xc9f9,
+ /* b0 */ 0xc9fa, 0xc9fb, 0xc9fc, 0xc9fd, 0xca41, 0xca42, 0xca43, 0xca44,
+ /* b8 */ 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c,
+
+ /*** Three byte table, leaf: ed88xx - offset 0x07f14 ***/
+
+ /* 80 */ 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca53, 0xca54, 0xca55,
+ /* 88 */ 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d,
+ /* 90 */ 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68,
+ /* 98 */ 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70,
+ /* a0 */ 0xca71, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79,
+ /* a8 */ 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca81, 0xca82, 0xca83, 0xca84,
+ /* b0 */ 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c,
+ /* b8 */ 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca93, 0xca94, 0xca95,
+
+ /*** Three byte table, leaf: ed89xx - offset 0x07f54 ***/
+
+ /* 80 */ 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d,
+ /* 88 */ 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, 0xcaa8,
+ /* 90 */ 0xcaa9, 0xcaaa, 0xcaab, 0xcaac, 0xcaad, 0xcaae, 0xcaaf, 0xcab0,
+ /* 98 */ 0xcab1, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, 0xcab8, 0xcab9,
+ /* a0 */ 0xcaba, 0xcabb, 0xcabc, 0xcabd, 0xcac1, 0xcac2, 0xcac3, 0xcac4,
+ /* a8 */ 0xcac5, 0xcac6, 0xcac7, 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcacc,
+ /* b0 */ 0xcacd, 0xcace, 0xcacf, 0xcad0, 0xcad1, 0xcad3, 0xcad4, 0xcad5,
+ /* b8 */ 0xcad6, 0xcad7, 0xcad8, 0xcad9, 0xcada, 0xcadb, 0xcadc, 0xcadd,
+
+ /*** Three byte table, leaf: ed8axx - offset 0x07f94 ***/
+
+ /* 80 */ 0xcae1, 0xcae2, 0xcae3, 0xcae4, 0xcae5, 0xcae6, 0xcae7, 0xcae8,
+ /* 88 */ 0xcae9, 0xcaea, 0xcaeb, 0xcaec, 0xcaed, 0xcaee, 0xcaef, 0xcaf0,
+ /* 90 */ 0xcaf1, 0xcaf3, 0xcaf4, 0xcaf5, 0xcaf6, 0xcaf7, 0xcaf8, 0xcaf9,
+ /* 98 */ 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcb41, 0xcb42, 0xcb43, 0xcb44,
+ /* a0 */ 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c,
+ /* a8 */ 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb53, 0xcb54, 0xcb55,
+ /* b0 */ 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d,
+ /* b8 */ 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68,
+
+ /*** Three byte table, leaf: ed8bxx - offset 0x07fd4 ***/
+
+ /* 80 */ 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70,
+ /* 88 */ 0xcb71, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79,
+ /* 90 */ 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb81, 0xcb82, 0xcb83, 0xcb84,
+ /* 98 */ 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c,
+ /* a0 */ 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb93, 0xcb94, 0xcb95,
+ /* a8 */ 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d,
+ /* b0 */ 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, 0xcba8,
+ /* b8 */ 0xcba9, 0xcbaa, 0xcbab, 0xcbac, 0xcbad, 0xcbae, 0xcbaf, 0xcbb0,
+
+ /*** Three byte table, leaf: ed8cxx - offset 0x08014 ***/
+
+ /* 80 */ 0xcbb1, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, 0xcbb8, 0xcbb9,
+ /* 88 */ 0xcbba, 0xcbbb, 0xcbbc, 0xcbbd, 0xcc61, 0xcc62, 0xcc63, 0xcc64,
+ /* 90 */ 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c,
+ /* 98 */ 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc73, 0xcc74, 0xcc75,
+ /* a0 */ 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d,
+ /* a8 */ 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88,
+ /* b0 */ 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90,
+ /* b8 */ 0xcc91, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99,
+
+ /*** Three byte table, leaf: ed8dxx - offset 0x08054 ***/
+
+ /* 80 */ 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcca1, 0xcca2, 0xcca3, 0xcca4,
+ /* 88 */ 0xcca5, 0xcca6, 0xcca7, 0xcca8, 0xcca9, 0xccaa, 0xccab, 0xccac,
+ /* 90 */ 0xccad, 0xccae, 0xccaf, 0xccb0, 0xccb1, 0xccb3, 0xccb4, 0xccb5,
+ /* 98 */ 0xccb6, 0xccb7, 0xccb8, 0xccb9, 0xccba, 0xccbb, 0xccbc, 0xccbd,
+ /* a0 */ 0xccc1, 0xccc2, 0xccc3, 0xccc4, 0xccc5, 0xccc6, 0xccc7, 0xccc8,
+ /* a8 */ 0xccc9, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, 0xccd0,
+ /* b0 */ 0xccd1, 0xccd3, 0xccd4, 0xccd5, 0xccd6, 0xccd7, 0xccd8, 0xccd9,
+ /* b8 */ 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xcce1, 0xcce2, 0xcce3, 0xcce4,
+
+ /*** Three byte table, leaf: ed8exx - offset 0x08094 ***/
+
+ /* 80 */ 0xcce5, 0xcce6, 0xcce7, 0xcce8, 0xcce9, 0xccea, 0xcceb, 0xccec,
+ /* 88 */ 0xcced, 0xccee, 0xccef, 0xccf0, 0xccf1, 0xccf3, 0xccf4, 0xccf5,
+ /* 90 */ 0xccf6, 0xccf7, 0xccf8, 0xccf9, 0xccfa, 0xccfb, 0xccfc, 0xccfd,
+ /* 98 */ 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48,
+ /* a0 */ 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50,
+ /* a8 */ 0xcd51, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59,
+ /* b0 */ 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd61, 0xcd62, 0xcd63, 0xcd64,
+ /* b8 */ 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c,
+
+ /*** Three byte table, leaf: ed8fxx - offset 0x080d4 ***/
+
+ /* 80 */ 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd73, 0xcd74, 0xcd75,
+ /* 88 */ 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d,
+ /* 90 */ 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88,
+ /* 98 */ 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90,
+ /* a0 */ 0xcd91, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99,
+ /* a8 */ 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcda1, 0xcda2, 0xcda3, 0xcda4,
+ /* b0 */ 0xcda5, 0xcda6, 0xcda7, 0xcda8, 0xcda9, 0xcdaa, 0xcdab, 0xcdac,
+ /* b8 */ 0xcdad, 0xcdae, 0xcdaf, 0xcdb0, 0xcdb1, 0xcdb3, 0xcdb4, 0xcdb5,
+
+ /*** Three byte table, leaf: ed90xx - offset 0x08114 ***/
+
+ /* 80 */ 0xcdb6, 0xcdb7, 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc, 0xcdbd,
+ /* 88 */ 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, 0xcdc6, 0xcdc7, 0xcdc8,
+ /* 90 */ 0xcdc9, 0xcdca, 0xcdcb, 0xcdcc, 0xcdcd, 0xcdce, 0xcdcf, 0xcdd0,
+ /* 98 */ 0xcdd1, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, 0xcdd8, 0xcdd9,
+ /* a0 */ 0xcdda, 0xcddb, 0xcddc, 0xcddd, 0xcde1, 0xcde2, 0xcde3, 0xcde4,
+ /* a8 */ 0xcde5, 0xcde6, 0xcde7, 0xcde8, 0xcde9, 0xcdea, 0xcdeb, 0xcdec,
+ /* b0 */ 0xcded, 0xcdee, 0xcdef, 0xcdf0, 0xcdf1, 0xcdf3, 0xcdf4, 0xcdf5,
+ /* b8 */ 0xcdf6, 0xcdf7, 0xcdf8, 0xcdf9, 0xcdfa, 0xcdfb, 0xcdfc, 0xcdfd,
+
+ /*** Three byte table, leaf: ed91xx - offset 0x08154 ***/
+
+ /* 80 */ 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48,
+ /* 88 */ 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50,
+ /* 90 */ 0xce51, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59,
+ /* 98 */ 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce61, 0xce62, 0xce63, 0xce64,
+ /* a0 */ 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c,
+ /* a8 */ 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce73, 0xce74, 0xce75,
+ /* b0 */ 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d,
+ /* b8 */ 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88,
+
+ /*** Three byte table, leaf: ed92xx - offset 0x08194 ***/
+
+ /* 80 */ 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90,
+ /* 88 */ 0xce91, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99,
+ /* 90 */ 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xcea1, 0xcea2, 0xcea3, 0xcea4,
+ /* 98 */ 0xcea5, 0xcea6, 0xcea7, 0xcea8, 0xcea9, 0xceaa, 0xceab, 0xceac,
+ /* a0 */ 0xcead, 0xceae, 0xceaf, 0xceb0, 0xceb1, 0xceb3, 0xceb4, 0xceb5,
+ /* a8 */ 0xceb6, 0xceb7, 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0xcebd,
+ /* b0 */ 0xcec1, 0xcec2, 0xcec3, 0xcec4, 0xcec5, 0xcec6, 0xcec7, 0xcec8,
+ /* b8 */ 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, 0xced0,
+
+ /*** Three byte table, leaf: ed93xx - offset 0x081d4 ***/
+
+ /* 80 */ 0xced1, 0xced3, 0xced4, 0xced5, 0xced6, 0xced7, 0xced8, 0xced9,
+ /* 88 */ 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcee1, 0xcee2, 0xcee3, 0xcee4,
+ /* 90 */ 0xcee5, 0xcee6, 0xcee7, 0xcee8, 0xcee9, 0xceea, 0xceeb, 0xceec,
+ /* 98 */ 0xceed, 0xceee, 0xceef, 0xcef0, 0xcef1, 0xcef3, 0xcef4, 0xcef5,
+ /* a0 */ 0xcef6, 0xcef7, 0xcef8, 0xcef9, 0xcefa, 0xcefb, 0xcefc, 0xcefd,
+ /* a8 */ 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48,
+ /* b0 */ 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50,
+ /* b8 */ 0xcf51, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59,
+
+ /*** Three byte table, leaf: ed94xx - offset 0x08214 ***/
+
+ /* 80 */ 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf61, 0xcf62, 0xcf63, 0xcf64,
+ /* 88 */ 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c,
+ /* 90 */ 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf73, 0xcf74, 0xcf75,
+ /* 98 */ 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d,
+ /* a0 */ 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88,
+ /* a8 */ 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90,
+ /* b0 */ 0xcf91, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99,
+ /* b8 */ 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcfa1, 0xcfa2, 0xcfa3, 0xcfa4,
+
+ /*** Three byte table, leaf: ed95xx - offset 0x08254 ***/
+
+ /* 80 */ 0xcfa5, 0xcfa6, 0xcfa7, 0xcfa8, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac,
+ /* 88 */ 0xcfad, 0xcfae, 0xcfaf, 0xcfb0, 0xcfb1, 0xcfb3, 0xcfb4, 0xcfb5,
+ /* 90 */ 0xcfb6, 0xcfb7, 0xcfb8, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd,
+ /* 98 */ 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068,
+ /* a0 */ 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070,
+ /* a8 */ 0xd071, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079,
+ /* b0 */ 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd081, 0xd082, 0xd083, 0xd084,
+ /* b8 */ 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c,
+
+ /*** Three byte table, leaf: ed96xx - offset 0x08294 ***/
+
+ /* 80 */ 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd093, 0xd094, 0xd095,
+ /* 88 */ 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d,
+ /* 90 */ 0xd0a1, 0xd0a2, 0xd0a3, 0xd0a4, 0xd0a5, 0xd0a6, 0xd0a7, 0xd0a8,
+ /* 98 */ 0xd0a9, 0xd0aa, 0xd0ab, 0xd0ac, 0xd0ad, 0xd0ae, 0xd0af, 0xd0b0,
+ /* a0 */ 0xd0b1, 0xd0b3, 0xd0b4, 0xd0b5, 0xd0b6, 0xd0b7, 0xd0b8, 0xd0b9,
+ /* a8 */ 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0c1, 0xd0c2, 0xd0c3, 0xd0c4,
+ /* b0 */ 0xd0c5, 0xd0c6, 0xd0c7, 0xd0c8, 0xd0c9, 0xd0ca, 0xd0cb, 0xd0cc,
+ /* b8 */ 0xd0cd, 0xd0ce, 0xd0cf, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5,
+
+ /*** Three byte table, leaf: ed97xx - offset 0x082d4 ***/
+
+ /* 80 */ 0xd0d6, 0xd0d7, 0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0xd0dc, 0xd0dd,
+ /* 88 */ 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e4, 0xd0e5, 0xd0e6, 0xd0e7, 0xd0e8,
+ /* 90 */ 0xd0e9, 0xd0ea, 0xd0eb, 0xd0ec, 0xd0ed, 0xd0ee, 0xd0ef, 0xd0f0,
+ /* 98 */ 0xd0f1, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, 0xd0f8, 0xd0f9,
+ /* a0 */ 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd141, 0xd142, 0xd143, 0xd144,
+ /* a8 */ 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c,
+ /* b0 */ 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd153, 0xd154, 0xd155,
+ /* b8 */ 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d,
+
+ /*** Three byte table, leaf: ed98xx - offset 0x08314 ***/
+
+ /* 80 */ 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168,
+ /* 88 */ 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170,
+ /* 90 */ 0xd171, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179,
+ /* 98 */ 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd181, 0xd182, 0xd183, 0xd184,
+ /* a0 */ 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c,
+ /* a8 */ 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd193, 0xd194, 0xd195,
+ /* b0 */ 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d,
+ /* b8 */ 0xd1a1, 0xd1a2, 0xd1a3, 0xd1a4, 0xd1a5, 0xd1a6, 0xd1a7, 0xd1a8,
+
+ /*** Three byte table, leaf: ed99xx - offset 0x08354 ***/
+
+ /* 80 */ 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, 0xd1b0,
+ /* 88 */ 0xd1b1, 0xd1b3, 0xd1b4, 0xd1b5, 0xd1b6, 0xd1b7, 0xd1b8, 0xd1b9,
+ /* 90 */ 0xd1ba, 0xd1bb, 0xd1bc, 0xd1bd, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4,
+ /* 98 */ 0xd1c5, 0xd1c6, 0xd1c7, 0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc,
+ /* a0 */ 0xd1cd, 0xd1ce, 0xd1cf, 0xd1d0, 0xd1d1, 0xd1d3, 0xd1d4, 0xd1d5,
+ /* a8 */ 0xd1d6, 0xd1d7, 0xd1d8, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd,
+ /* b0 */ 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0xd1e7, 0xd1e8,
+ /* b8 */ 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, 0xd1f0,
+
+ /*** Three byte table, leaf: ed9axx - offset 0x08394 ***/
+
+ /* 80 */ 0xd1f1, 0xd1f3, 0xd1f4, 0xd1f5, 0xd1f6, 0xd1f7, 0xd1f8, 0xd1f9,
+ /* 88 */ 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd241, 0xd242, 0xd243, 0xd244,
+ /* 90 */ 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c,
+ /* 98 */ 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd253, 0xd254, 0xd255,
+ /* a0 */ 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d,
+ /* a8 */ 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268,
+ /* b0 */ 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270,
+ /* b8 */ 0xd271, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279,
+
+ /*** Three byte table, leaf: ed9bxx - offset 0x083d4 ***/
+
+ /* 80 */ 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd281, 0xd282, 0xd283, 0xd284,
+ /* 88 */ 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c,
+ /* 90 */ 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd293, 0xd294, 0xd295,
+ /* 98 */ 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d,
+ /* a0 */ 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a4, 0xd2a5, 0xd2a6, 0xd2a7, 0xd2a8,
+ /* a8 */ 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ac, 0xd2ad, 0xd2ae, 0xd2af, 0xd2b0,
+ /* b0 */ 0xd2b1, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6, 0xd2b7, 0xd2b8, 0xd2b9,
+ /* b8 */ 0xd2ba, 0xd2bb, 0xd2bc, 0xd2bd, 0xd2c1, 0xd2c2, 0xd2c3, 0xd2c4,
+
+ /*** Three byte table, leaf: ed9cxx - offset 0x08414 ***/
+
+ /* 80 */ 0xd2c5, 0xd2c6, 0xd2c7, 0xd2c8, 0xd2c9, 0xd2ca, 0xd2cb, 0xd2cc,
+ /* 88 */ 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d3, 0xd2d4, 0xd2d5,
+ /* 90 */ 0xd2d6, 0xd2d7, 0xd2d8, 0xd2d9, 0xd2da, 0xd2db, 0xd2dc, 0xd2dd,
+ /* 98 */ 0xd2e1, 0xd2e2, 0xd2e3, 0xd2e4, 0xd2e5, 0xd2e6, 0xd2e7, 0xd2e8,
+ /* a0 */ 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, 0xd2f0,
+ /* a8 */ 0xd2f1, 0xd2f3, 0xd2f4, 0xd2f5, 0xd2f6, 0xd2f7, 0xd2f8, 0xd2f9,
+ /* b0 */ 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd341, 0xd342, 0xd343, 0xd344,
+ /* b8 */ 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c,
+
+ /*** Three byte table, leaf: ed9dxx - offset 0x08454 ***/
+
+ /* 80 */ 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd353, 0xd354, 0xd355,
+ /* 88 */ 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d,
+ /* 90 */ 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368,
+ /* 98 */ 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370,
+ /* a0 */ 0xd371, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379,
+ /* a8 */ 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd381, 0xd382, 0xd383, 0xd384,
+ /* b0 */ 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c,
+ /* b8 */ 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd393, 0xd394, 0xd395,
+
+ /*** Three byte table, leaf: ed9exx - offset 0x08494 ***/
+
+ /* 80 */ 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d,
+ /* 88 */ 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4, 0xd3a5, 0xd3a6, 0xd3a7, 0xd3a8,
+ /* 90 */ 0xd3a9, 0xd3aa, 0xd3ab, 0xd3ac, 0xd3ad, 0xd3ae, 0xd3af, 0xd3b0,
+ /* 98 */ 0xd3b1, 0xd3b3, 0xd3b4, 0xd3b5, 0xd3b6, 0xd3b7, 0xd3b8, 0xd3b9,
+ /* a0 */ 0xd3ba, 0xd3bb, 0xd3bc, 0xd3bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efa4xx - offset 0x084d4 ***/
+
+ /* 80 */ 0xe0d0, 0xe0d6, 0xe0e7, 0xe1cf, 0xe1e8, 0xe23d, 0xe2fb, 0xe332,
+ /* 88 */ 0xe348, 0xe360, 0xe36d, 0xe3d4, 0xe3d5, 0xe3d8, 0xe3db, 0xe3dc,
+ /* 90 */ 0xe3dd, 0xe3de, 0xe3df, 0xe3e0, 0xe3e2, 0xe3e3, 0xe3e4, 0xe3e5,
+ /* 98 */ 0xe3e6, 0xe3e8, 0xe3e9, 0xe3ea, 0xe3eb, 0xe3ed, 0xe3ef, 0xe3f0,
+ /* a0 */ 0xe3f2, 0xe3f6, 0xe3fa, 0xe3fc, 0xe3fd, 0xe3fe, 0xe432, 0xe433,
+ /* a8 */ 0xe437, 0xe438, 0xe439, 0xe43a, 0xe43b, 0xe43d, 0xe442, 0xe44e,
+ /* b0 */ 0xe452, 0xe453, 0xe454, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a,
+ /* b8 */ 0xe45b, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463,
+
+ /*** Three byte table, leaf: efa5xx - offset 0x08514 ***/
+
+ /* 80 */ 0xe464, 0xe465, 0xe466, 0xe467, 0xe469, 0xe46a, 0xe46e, 0xe46f,
+ /* 88 */ 0xe471, 0xe472, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479,
+ /* 90 */ 0xe47a, 0xe47b, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497,
+ /* 98 */ 0xe499, 0xe49a, 0xe576, 0xe59e, 0xe5a5, 0xe5ab, 0xe5ae, 0xe648,
+ /* a0 */ 0xe65d, 0xe6cb, 0xe6e4, 0xe8c5, 0xe8e4, 0xe935, 0xe9a5, 0xe9d5,
+ /* a8 */ 0xe9f4, 0xea9e, 0xeaa0, 0xeab3, 0xeae1, 0xeae8, 0xeb93, 0xebad,
+ /* b0 */ 0xebed, 0xecf5, 0xed31, 0xed39, 0xedae, 0xedb1, 0xedb2, 0xedb9,
+ /* b8 */ 0xedbb, 0xedbc, 0xedc4, 0xedce, 0xedd0, 0xedd2, 0xedd6, 0xedfa,
+
+ /*** Three byte table, leaf: efa6xx - offset 0x08554 ***/
+
+ /* 80 */ 0xedfb, 0xedfc, 0xedfe, 0xee31, 0xee34, 0xee37, 0xee3d, 0xee3f,
+ /* 88 */ 0xee40, 0xee41, 0xee43, 0xee47, 0xee48, 0xee4c, 0xee54, 0xee56,
+ /* 90 */ 0xee57, 0xee5a, 0xee62, 0xee66, 0xee69, 0xee6c, 0xee6f, 0xee71,
+ /* 98 */ 0xee74, 0xee75, 0xee76, 0xee78, 0xee7a, 0xee7b, 0xee7c, 0xee91,
+ /* a0 */ 0xee93, 0xee94, 0xee97, 0xee98, 0xee99, 0xee9b, 0xeea1, 0xeea6,
+ /* a8 */ 0xeea9, 0xeeaa, 0xeeac, 0xeead, 0xeeb0, 0xeebf, 0xeec1, 0xeec6,
+ /* b0 */ 0xeec7, 0xeecb, 0xeecd, 0xeecf, 0xeed0, 0xeed3, 0xeedf, 0xeee4,
+ /* b8 */ 0xeee6, 0xeef7, 0xef77, 0xef78, 0xef92, 0xef93, 0xef99, 0xef9b,
+
+ /*** Three byte table, leaf: efa7xx - offset 0x08594 ***/
+
+ /* 80 */ 0xef9d, 0xefa0, 0xefa7, 0xefac, 0xefcc, 0xeff7, 0xf051, 0xf075,
+ /* 88 */ 0xf096, 0xf099, 0xf09e, 0xf0a0, 0xf0a4, 0xf0a7, 0xf0a9, 0xf0aa,
+ /* 90 */ 0xf0ba, 0xf0bb, 0xf0bd, 0xf0c1, 0xf0c2, 0xf0c6, 0xf0c7, 0xf0cc,
+ /* 98 */ 0xf0cf, 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d8, 0xf136, 0xf137, 0xf13a,
+ /* a0 */ 0xf13f, 0xf140, 0xf141, 0xf142, 0xf145, 0xf148, 0xf14a, 0xf150,
+ /* a8 */ 0xf151, 0xf155, 0xf156, 0xf159, 0xf15a, 0xf165, 0xf16d, 0xf16e,
+ /* b0 */ 0xf171, 0xf174, 0xf177, 0xf178, 0xf199, 0xf19a, 0xf19c, 0xf1a1,
+ /* b8 */ 0xf1a2, 0xf1a3, 0xf1ee, 0xf26b, 0xf44d, 0xf49c, 0xf4b1, 0xf537,
+
+ /*** Three byte table, leaf: efa8xx - offset 0x085d4 ***/
+
+ /* 80 */ 0xf57e, 0xf696, 0xf698, 0xf6b8, 0xf6c8, 0xf6d3, 0xf76b, 0xf792,
+ /* 88 */ 0xf831, 0xf832, 0xf876, 0xf939, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x08613 ***/
+
+ /* 80 */ 0x0000, 0xda31, 0xda32, 0xda33, 0xda34, 0xda35, 0xda36, 0xda37,
+ /* 88 */ 0xda38, 0xda39, 0xda3a, 0xda3b, 0xda3c, 0xda3d, 0xda3e, 0xda3f,
+ /* 90 */ 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47,
+ /* 98 */ 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f,
+ /* a0 */ 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57,
+ /* a8 */ 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f,
+ /* b0 */ 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67,
+ /* b8 */ 0xda68, 0xda69, 0xda6a, 0xda6b, 0xd93c, 0xda6d, 0xda6e, 0xda6f,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x08653 ***/
+
+ /* 80 */ 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77,
+ /* 88 */ 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda91,
+ /* 90 */ 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99,
+ /* 98 */ 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xd9a6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x08693 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd95b, 0xd95c, 0xd9a0, 0xdaa0, 0x0000, 0xd95d, 0xda6c, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_koi8r.map b/src/backend/utils/mb/Unicode/utf8_to_koi8r.map
new file mode 100644
index 0000000..05d6866
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_koi8r.map
@@ -0,0 +1,175 @@
+/* src/backend/utils/mb/Unicode/utf8_to_koi8r.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 koi8r_from_unicode_tree_table[678];
+
+static const pg_mb_radix_tree koi8r_from_unicode_tree =
+{
+ koi8r_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0147, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x88, /* b3_2_lower */
+ 0x96, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbc, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 koi8r_from_unicode_tree_table[678] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0088, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c7, 0x0107,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x00bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x009c, 0x0000, 0x009d, 0x0000, 0x0000, 0x0000, 0x0000, 0x009e,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00088 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009f,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x000c7 ***/
+
+ /* 80 */ 0x0000, 0x00b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00e1, 0x00e2, 0x00f7, 0x00e7, 0x00e4, 0x00e5, 0x00f6, 0x00fa,
+ /* 98 */ 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0,
+ /* a0 */ 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00e6, 0x00e8, 0x00e3, 0x00fe,
+ /* a8 */ 0x00fb, 0x00fd, 0x00ff, 0x00f9, 0x00f8, 0x00fc, 0x00e0, 0x00f1,
+ /* b0 */ 0x00c1, 0x00c2, 0x00d7, 0x00c7, 0x00c4, 0x00c5, 0x00d6, 0x00da,
+ /* b8 */ 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00107 ***/
+
+ /* 80 */ 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00c6, 0x00c8, 0x00c3, 0x00de,
+ /* 88 */ 0x00db, 0x00dd, 0x00df, 0x00d9, 0x00d8, 0x00dc, 0x00c0, 0x00d1,
+ /* 90 */ 0x0000, 0x00a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00147 ***/
+
+ /* e2 */ 0x0148,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00148 ***/
+
+ /* 88 */ 0x0157, 0x018c, 0x0000, 0x0000, 0x01b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x01ef, 0x022c, 0x0269,
+
+ /*** Three byte table, leaf: e288xx - offset 0x00157 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0095, 0x0096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0018c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0097, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098, 0x0099,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x001b2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0093, 0x009b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x001ef ***/
+
+ /* 80 */ 0x0080, 0x0000, 0x0081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0083, 0x0000, 0x0000, 0x0000, 0x0084, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0085, 0x0000, 0x0000, 0x0000, 0x0086, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0087, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x008a,
+
+ /*** Three byte table, leaf: e295xx - offset 0x0022c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00a0, 0x00a1, 0x00a2, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8,
+ /* 98 */ 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0,
+ /* a0 */ 0x00b1, 0x00b2, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9,
+ /* a8 */ 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e296xx - offset 0x00269 ***/
+
+ /* 80 */ 0x008b, 0x0000, 0x0000, 0x0000, 0x008c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x008d, 0x0000, 0x0000, 0x0000, 0x008e, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x008f, 0x0090, 0x0091, 0x0092, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_koi8u.map b/src/backend/utils/mb/Unicode/utf8_to_koi8u.map
new file mode 100644
index 0000000..ecb022a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_koi8u.map
@@ -0,0 +1,186 @@
+/* src/backend/utils/mb/Unicode/utf8_to_koi8u.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 koi8u_from_unicode_tree_table[727];
+
+static const pg_mb_radix_tree koi8u_from_unicode_tree =
+{
+ koi8u_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd2, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0178, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x88, /* b3_2_lower */
+ 0x96, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbc, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 koi8u_from_unicode_tree_table[727] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0051, 0x0089, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x0108,
+ /* d2 */ 0x0138,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00051 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x00bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x009c, 0x0000, 0x009d, 0x0000, 0x0000, 0x0000, 0x0000, 0x009e,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00089 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009f,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x000c8 ***/
+
+ /* 80 */ 0x0000, 0x00b3, 0x0000, 0x0000, 0x00b4, 0x0000, 0x00b6, 0x00b7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00e1, 0x00e2, 0x00f7, 0x00e7, 0x00e4, 0x00e5, 0x00f6, 0x00fa,
+ /* 98 */ 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0,
+ /* a0 */ 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00e6, 0x00e8, 0x00e3, 0x00fe,
+ /* a8 */ 0x00fb, 0x00fd, 0x00ff, 0x00f9, 0x00f8, 0x00fc, 0x00e0, 0x00f1,
+ /* b0 */ 0x00c1, 0x00c2, 0x00d7, 0x00c7, 0x00c4, 0x00c5, 0x00d6, 0x00da,
+ /* b8 */ 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00108 ***/
+
+ /* 80 */ 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00c6, 0x00c8, 0x00c3, 0x00de,
+ /* 88 */ 0x00db, 0x00dd, 0x00df, 0x00d9, 0x00d8, 0x00dc, 0x00c0, 0x00d1,
+ /* 90 */ 0x0000, 0x00a3, 0x0000, 0x0000, 0x00a4, 0x0000, 0x00a6, 0x00a7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d2xx - offset 0x00138 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00bd, 0x00ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00178 ***/
+
+ /* e2 */ 0x0179,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00179 ***/
+
+ /* 88 */ 0x0188, 0x01bd, 0x0000, 0x0000, 0x01e3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0220, 0x025d, 0x029a,
+
+ /*** Three byte table, leaf: e288xx - offset 0x00188 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0095, 0x0096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x001bd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0097, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098, 0x0099,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x001e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0093, 0x009b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00220 ***/
+
+ /* 80 */ 0x0080, 0x0000, 0x0081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0082, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0083, 0x0000, 0x0000, 0x0000, 0x0084, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0085, 0x0000, 0x0000, 0x0000, 0x0086, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0087, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x008a,
+
+ /*** Three byte table, leaf: e295xx - offset 0x0025d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00a0, 0x00a1, 0x00a2, 0x0000, 0x00a5, 0x0000, 0x0000, 0x00a8,
+ /* 98 */ 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0,
+ /* a0 */ 0x00b1, 0x00b2, 0x0000, 0x00b5, 0x0000, 0x0000, 0x00b8, 0x00b9,
+ /* a8 */ 0x00ba, 0x00bb, 0x00bc, 0x0000, 0x00be, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e296xx - offset 0x0029a ***/
+
+ /* 80 */ 0x008b, 0x0000, 0x0000, 0x0000, 0x008c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x008d, 0x0000, 0x0000, 0x0000, 0x008e, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x008f, 0x0090, 0x0091, 0x0092, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_shift_jis_2004.map b/src/backend/utils/mb/Unicode/utf8_to_shift_jis_2004.map
new file mode 100644
index 0000000..8d9c9cc
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_shift_jis_2004.map
@@ -0,0 +1,7685 @@
+/* src/backend/utils/mb/Unicode/utf8_to_shift_jis_2004.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl */
+
+static const uint16 shift_jis_2004_from_unicode_tree_table[39196];
+
+static const pg_mb_radix_tree shift_jis_2004_from_unicode_tree =
+{
+ shift_jis_2004_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x03ee, /* offset of table for 3-byte inputs */
+ 0xe1, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x6fe2, /* offset of table for 4-byte inputs */
+ 0xf0, /* b4_1_lower */
+ 0xf0, /* b4_1_upper */
+ 0xa0, /* b4_2_lower */
+ 0xaa, /* b4_2_upper */
+ 0x80, /* b4_3_lower */
+ 0xbf, /* b4_3_upper */
+ 0x80, /* b4_4_lower */
+ 0xbf /* b4_4_upper */
+};
+
+static const uint16 shift_jis_2004_from_unicode_tree_table[39196] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0090, 0x00d0, 0x010f, 0x014e, 0x018c, 0x0000, 0x01ca,
+ /* ca */ 0x0209, 0x0242, 0x0282, 0x02c0, 0x02ef, 0x032f, 0x036e, 0x03ae,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8541, 0x8542, 0x8191, 0x8192, 0x8543, 0x005c, 0x8544, 0x8198,
+ /* a8 */ 0x814e, 0x8545, 0x8546, 0x8547, 0x81ca, 0x8548, 0x8549, 0x854a,
+ /* b0 */ 0x818b, 0x817d, 0x854b, 0x854c, 0x814c, 0x0000, 0x81f7, 0x854d,
+ /* b8 */ 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d,
+ /* 88 */ 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565,
+ /* 90 */ 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x817e,
+ /* 98 */ 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574,
+ /* a0 */ 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c,
+ /* a8 */ 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585,
+ /* b0 */ 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x8180,
+ /* b8 */ 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000d0 ***/
+
+ /* 80 */ 0x8595, 0x859a, 0x85b8, 0x85c7, 0x859f, 0x85aa, 0x85ba, 0x85c9,
+ /* 88 */ 0x85d7, 0x85dd, 0x0000, 0x0000, 0x85bb, 0x85ca, 0x85be, 0x85cd,
+ /* 90 */ 0x0000, 0x85ce, 0x8598, 0x859d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x85bc, 0x85cb, 0x85bd, 0x85cc, 0x85d8, 0x85de, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x85d9, 0x85df, 0x0000, 0x85fb,
+ /* a8 */ 0x0000, 0x0000, 0x8596, 0x859b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x85da, 0x85e0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x85b9, 0x85c8, 0x0000, 0x0000, 0x85a2, 0x85ad,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x0010f ***/
+
+ /* 80 */ 0x0000, 0x85a1, 0x85ac, 0x85bf, 0x85cf, 0x0000, 0x0000, 0x85c0,
+ /* 88 */ 0x85d0, 0x0000, 0x0000, 0x85f8, 0x8599, 0x859e, 0x0000, 0x0000,
+ /* 90 */ 0x85c1, 0x85d1, 0x864a, 0x8649, 0x85b7, 0x85c6, 0x0000, 0x0000,
+ /* 98 */ 0x85c2, 0x85d2, 0x85a3, 0x85ae, 0x85db, 0x85e1, 0x85a5, 0x85b1,
+ /* a0 */ 0x85a4, 0x85b0, 0x85c5, 0x85d5, 0x85a6, 0x85b2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8597, 0x859c, 0x85dc, 0x85e2, 0x85c3, 0x85d3,
+ /* b0 */ 0x85c4, 0x85d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x85a7, 0x85b3, 0x85a9, 0x85b6, 0x85a8, 0x85b5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x0014e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8648, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c7xx - offset 0x0018c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8643, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84ed, 0x84ee, 0x0000,
+ /* 90 */ 0x84ef, 0x84f4, 0x84f5, 0x0000, 0x84f6, 0x0000, 0x84f7, 0x0000,
+ /* 98 */ 0x84f8, 0x0000, 0x84f9, 0x0000, 0x84fa, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x84f2, 0x84f3, 0x0000, 0x0000, 0x0000, 0x8664,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c9xx - offset 0x001ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8652, 0x8658, 0x8659, 0x8644, 0x8657, 0x865e, 0x85ec, 0x8645,
+ /* 98 */ 0x864d, 0x864f, 0x8662, 0x0000, 0x8650, 0x0000, 0x8651, 0x85f3,
+ /* a0 */ 0x8647, 0x85f7, 0x0000, 0x0000, 0x8655, 0x865b, 0x8641, 0x8661,
+ /* a8 */ 0x864b, 0x0000, 0x0000, 0x0000, 0x85e8, 0x85f2, 0x85e9, 0x8653,
+ /* b0 */ 0x85f9, 0x85e3, 0x85f4, 0x85ed, 0x0000, 0x864e, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x85ea, 0x8660, 0x85f1, 0x0000, 0x85ee, 0x85e5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: caxx - offset 0x00209 ***/
+
+ /* 80 */ 0x0000, 0x85fa, 0x85ef, 0x85e6, 0x8646, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x85eb, 0x864c, 0x8654, 0x85e4, 0x8656, 0x865a, 0x85f6, 0x0000,
+ /* 90 */ 0x85f0, 0x865f, 0x85e7, 0x0000, 0x8640, 0x85fc, 0x0000, 0x0000,
+ /* 98 */ 0x8642, 0x0000, 0x0000, 0x0000, 0x0000, 0x85f5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x865d, 0x865c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00242 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85af,
+ /* 88 */ 0x8672, 0x0000, 0x0000, 0x0000, 0x8673, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8674, 0x8675, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x85a0, 0x85d6, 0x0000, 0x85ab, 0x0000, 0x85b4, 0x8691, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8680, 0x8681, 0x8682,
+ /* a8 */ 0x8683, 0x8684, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: ccxx - offset 0x00282 ***/
+
+ /* 80 */ 0x867b, 0x8679, 0x867e, 0x869d, 0x867a, 0x0000, 0x8676, 0x0000,
+ /* 88 */ 0x868d, 0x0000, 0x0000, 0x8678, 0x867d, 0x0000, 0x0000, 0x867c,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8698, 0x8699, 0x869e, 0x0000, 0x868a, 0x8696, 0x8697, 0x868b,
+ /* a0 */ 0x868c, 0x0000, 0x0000, 0x0000, 0x8692, 0x8687, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x868f, 0x869a, 0x0000, 0x8688, 0x0000, 0x0000, 0x8690,
+ /* b0 */ 0x8693, 0x0000, 0x0000, 0x0000, 0x8695, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8689, 0x869b, 0x869c, 0x8694, 0x868e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cdxx - offset 0x002c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8671, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x002ef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5,
+ /* 98 */ 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad,
+ /* a0 */ 0x83ae, 0x83af, 0x0000, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4,
+ /* a8 */ 0x83b5, 0x83b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5,
+ /* b8 */ 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd,
+
+ /*** Two byte table, leaf: cfxx - offset 0x0032f ***/
+
+ /* 80 */ 0x83ce, 0x83cf, 0x83d7, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4,
+ /* 88 */ 0x83d5, 0x83d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0036e ***/
+
+ /* 80 */ 0x0000, 0x8446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448,
+ /* 98 */ 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450,
+ /* a0 */ 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458,
+ /* a8 */ 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460,
+ /* b0 */ 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8477, 0x8478,
+ /* b8 */ 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481,
+
+ /*** Two byte table, leaf: d1xx - offset 0x003ae ***/
+
+ /* 80 */ 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489,
+ /* 88 */ 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491,
+ /* 90 */ 0x0000, 0x8476, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x003ee ***/
+
+ /* e1 */ 0x03fd, 0x043d, 0x047d, 0x04bd, 0x04fd, 0x053d, 0x057d, 0x05bd,
+ /* e9 */ 0x05fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x063c,
+
+ /*** Three byte table, byte #2: e1xx - offset 0x003fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x067c, 0x0000, 0x0000, 0x0000, 0x0000, 0x06bc, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0043d ***/
+
+ /* 80 */ 0x06f0, 0x0730, 0x0744, 0x0000, 0x0781, 0x07b7, 0x07f3, 0x082f,
+ /* 88 */ 0x086f, 0x08ad, 0x08eb, 0x092b, 0x0966, 0x0000, 0x097f, 0x09bf,
+ /* 90 */ 0x09dc, 0x0a00, 0x0000, 0x0a34, 0x0a74, 0x0ab4, 0x0ad4, 0x0b14,
+ /* 98 */ 0x0b54, 0x0b94, 0x0000, 0x0000, 0x0bc4, 0x0bee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0c2e, 0x0000, 0x0c64, 0x0ca4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x0047d ***/
+
+ /* 80 */ 0x0ce4, 0x0d23, 0x0d63, 0x0da3, 0x0000, 0x0000, 0x0000, 0x0de3,
+ /* 88 */ 0x0e23, 0x0e5d, 0x0e7d, 0x0ebd, 0x0efa, 0x0f36, 0x0f75, 0x0fb1,
+ /* 90 */ 0x0fef, 0x101e, 0x104c, 0x108b, 0x10ac, 0x10cf, 0x10fe, 0x1139,
+ /* 98 */ 0x1174, 0x11aa, 0x11d9, 0x120a, 0x0000, 0x1229, 0x125f, 0x129e,
+ /* a0 */ 0x12de, 0x131e, 0x0000, 0x1340, 0x137b, 0x1396, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x13c6, 0x0000, 0x13fa, 0x142c, 0x144f, 0x1488, 0x14c5,
+ /* b0 */ 0x14f6, 0x0000, 0x0000, 0x1533, 0x1562, 0x1581, 0x15a7, 0x15e7,
+ /* b8 */ 0x1622, 0x1662, 0x169f, 0x0000, 0x0000, 0x16c8, 0x1700, 0x1737,
+
+ /*** Three byte table, byte #2: e4xx - offset 0x004bd ***/
+
+ /* 80 */ 0x174f, 0x1789, 0x17b6, 0x0000, 0x17f1, 0x1829, 0x184d, 0x188d,
+ /* 88 */ 0x18c6, 0x18e2, 0x0000, 0x191c, 0x195a, 0x1997, 0x0000, 0x19a9,
+ /* 90 */ 0x19e1, 0x1a0e, 0x1a49, 0x1a88, 0x1ac0, 0x1afd, 0x1b20, 0x1b59,
+ /* 98 */ 0x1b8a, 0x1bc9, 0x1bef, 0x0000, 0x1c23, 0x1c3f, 0x0000, 0x1c64,
+ /* a0 */ 0x1ca2, 0x1cde, 0x1ced, 0x0000, 0x0000, 0x0000, 0x1d23, 0x1d54,
+ /* a8 */ 0x1d90, 0x0000, 0x1dba, 0x0000, 0x1df7, 0x0000, 0x0000, 0x1e35,
+ /* b0 */ 0x1e5e, 0x0000, 0x0000, 0x1e9a, 0x1ed3, 0x1edc, 0x0000, 0x0000,
+ /* b8 */ 0x1f1c, 0x1f5c, 0x1f9c, 0x1fdc, 0x201c, 0x205b, 0x209b, 0x20db,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x004fd ***/
+
+ /* 80 */ 0x211b, 0x215b, 0x219b, 0x21da, 0x221a, 0x225a, 0x229a, 0x22d8,
+ /* 88 */ 0x2318, 0x2355, 0x2395, 0x23d4, 0x2414, 0x2454, 0x2494, 0x24d4,
+ /* 90 */ 0x2513, 0x2553, 0x2593, 0x25d3, 0x2613, 0x2653, 0x2693, 0x26d3,
+ /* 98 */ 0x2712, 0x2752, 0x2792, 0x27d2, 0x2812, 0x2852, 0x2892, 0x28d2,
+ /* a0 */ 0x2912, 0x2952, 0x2991, 0x29d0, 0x2a0e, 0x2a4d, 0x2a8c, 0x2acb,
+ /* a8 */ 0x2b0b, 0x2b4b, 0x2b8b, 0x2bcb, 0x2c0b, 0x2c4b, 0x2c8b, 0x2ccb,
+ /* b0 */ 0x2d0b, 0x2d4b, 0x2d88, 0x2dc7, 0x2e05, 0x2e43, 0x2e82, 0x2ec0,
+ /* b8 */ 0x2f00, 0x2f40, 0x2f80, 0x2fc0, 0x3000, 0x3040, 0x3080, 0x30be,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x0053d ***/
+
+ /* 80 */ 0x30fe, 0x313d, 0x317d, 0x31bc, 0x31fc, 0x323c, 0x327b, 0x32ba,
+ /* 88 */ 0x32fa, 0x333a, 0x337a, 0x33b8, 0x33f8, 0x3438, 0x3478, 0x34b8,
+ /* 90 */ 0x34f3, 0x3532, 0x3570, 0x35b0, 0x35f0, 0x3630, 0x366f, 0x36af,
+ /* 98 */ 0x36ef, 0x372f, 0x376f, 0x37af, 0x37ef, 0x382f, 0x386f, 0x38af,
+ /* a0 */ 0x38ef, 0x392f, 0x396f, 0x39ac, 0x39ec, 0x3a2c, 0x3a6c, 0x3aac,
+ /* a8 */ 0x3aec, 0x3b2c, 0x3b6c, 0x3bab, 0x3be9, 0x3c28, 0x3c68, 0x3ca8,
+ /* b0 */ 0x3ce8, 0x3d28, 0x3d67, 0x3da7, 0x3de7, 0x3e27, 0x3e67, 0x3ea7,
+ /* b8 */ 0x3ee4, 0x3f23, 0x3f63, 0x3fa3, 0x3fe3, 0x4023, 0x4063, 0x40a3,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x0057d ***/
+
+ /* 80 */ 0x40e3, 0x4122, 0x4161, 0x419d, 0x41db, 0x4218, 0x4258, 0x4297,
+ /* 88 */ 0x42d7, 0x4317, 0x4357, 0x4397, 0x43d5, 0x4415, 0x4454, 0x4494,
+ /* 90 */ 0x44d3, 0x4513, 0x4552, 0x4592, 0x45d2, 0x4612, 0x4652, 0x4692,
+ /* 98 */ 0x46d2, 0x4711, 0x4751, 0x4791, 0x47d0, 0x4810, 0x4850, 0x4890,
+ /* a0 */ 0x48ce, 0x490e, 0x494d, 0x498c, 0x49cc, 0x4a0c, 0x4a4c, 0x4a8c,
+ /* a8 */ 0x4acc, 0x4b0c, 0x4b4c, 0x4b8c, 0x4bcc, 0x4c0b, 0x4c4b, 0x4c8b,
+ /* b0 */ 0x4ccb, 0x4d0b, 0x4d4a, 0x4d8a, 0x4dca, 0x4e0a, 0x4e4a, 0x4e8a,
+ /* b8 */ 0x4ec9, 0x4f08, 0x4f48, 0x0000, 0x4f65, 0x4fa4, 0x4fe3, 0x5023,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x005bd ***/
+
+ /* 80 */ 0x5063, 0x50a3, 0x50e3, 0x5120, 0x515e, 0x519d, 0x51dd, 0x521d,
+ /* 88 */ 0x525d, 0x529d, 0x52dd, 0x531d, 0x535d, 0x539d, 0x53dd, 0x541d,
+ /* 90 */ 0x545c, 0x549a, 0x54d9, 0x5519, 0x5559, 0x5599, 0x55d9, 0x5618,
+ /* 98 */ 0x5658, 0x5698, 0x56d4, 0x5713, 0x5753, 0x5793, 0x57d3, 0x5813,
+ /* a0 */ 0x5852, 0x5892, 0x58d2, 0x5912, 0x5951, 0x5991, 0x59d1, 0x5a11,
+ /* a8 */ 0x5a51, 0x5a90, 0x5ace, 0x5b0e, 0x5b4e, 0x5b8d, 0x5bcd, 0x0000,
+ /* b0 */ 0x5bec, 0x5c2c, 0x5c6a, 0x5caa, 0x5ce9, 0x5d05, 0x5d44, 0x5d83,
+ /* b8 */ 0x5dc3, 0x5e01, 0x5e40, 0x5e80, 0x5ec0, 0x5f00, 0x5f25, 0x5f65,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x005fd ***/
+
+ /* 80 */ 0x5fa5, 0x5fe4, 0x6024, 0x6063, 0x60a3, 0x60e1, 0x611f, 0x615f,
+ /* 88 */ 0x619f, 0x61df, 0x621f, 0x625f, 0x629f, 0x62db, 0x631a, 0x6359,
+ /* 90 */ 0x6397, 0x63d6, 0x6416, 0x0000, 0x0000, 0x641f, 0x645f, 0x649e,
+ /* 98 */ 0x64c4, 0x6504, 0x6542, 0x6582, 0x65c2, 0x6601, 0x6640, 0x667f,
+ /* a0 */ 0x66bf, 0x66fd, 0x6732, 0x6772, 0x67b1, 0x67f1, 0x681b, 0x685b,
+ /* a8 */ 0x689b, 0x68db, 0x6907, 0x6947, 0x6985, 0x69c4, 0x6a01, 0x6a41,
+ /* b0 */ 0x6a81, 0x6ac0, 0x0000, 0x6afb, 0x6b39, 0x6b79, 0x6bb8, 0x6bf8,
+ /* b8 */ 0x6c36, 0x6c55, 0x6c95, 0x6cd5, 0x6d15, 0x6d54, 0x6d8c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0063c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x6daf, 0x6de6, 0x0000, 0x6e17,
+ /* a8 */ 0x6e48, 0x6e88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x6ec3, 0x0000, 0x0000, 0x6f02, 0x6f42, 0x6f82, 0x6fa2,
+
+ /*** Three byte table, leaf: e1b8xx - offset 0x0067c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84f0, 0x84f1,
+
+ /*** Three byte table, leaf: e1bdxx - offset 0x006bc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8665, 0x8666, 0x866f, 0x8670,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e280xx - offset 0x006f0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x815d, 0x0000, 0x0000, 0x829c, 0x815c, 0x0000, 0x8161, 0x0000,
+ /* 98 */ 0x8165, 0x8166, 0x0000, 0x0000, 0x8167, 0x8168, 0x0000, 0x0000,
+ /* a0 */ 0x81f5, 0x81f6, 0x825f, 0x0000, 0x0000, 0x8164, 0x8163, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x81f1, 0x0000, 0x818c, 0x818d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x81a6, 0x84e9, 0x0000, 0x007e, 0x8677,
+
+ /*** Three byte table, leaf: e281xx - offset 0x00730 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x86fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x84ea,
+ /* 88 */ 0x84eb, 0x84ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x86fb, 0x0000, 0x0000,
+ /* 44 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e282xx - offset 0x00744 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8540, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x00781 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x818e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x827c,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x827e, 0x0000, 0x0000, 0x8782, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8784, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8280,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x81f0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x827b,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x007b7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8498, 0x8499, 0x849a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b,
+ /* a8 */ 0x875c, 0x875d, 0x875e, 0x8776, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba,
+ /* b8 */ 0x86bb, 0x86bc, 0x86bd, 0x86be,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x007f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x81a9, 0x81aa, 0x81a8, 0x81ab, 0x81ef, 0x0000, 0x8246, 0x8244,
+ /* 98 */ 0x8245, 0x8247, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x0082f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8248, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81cb, 0x0000, 0x81cc, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x824a, 0x824b,
+ /* a8 */ 0x8249, 0x824c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x0086f ***/
+
+ /* 80 */ 0x81cd, 0x0000, 0x81dd, 0x81ce, 0x0000, 0x81c5, 0x0000, 0x81de,
+ /* 88 */ 0x81b8, 0x81c4, 0x0000, 0x81b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x817c, 0x827a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x81e3, 0x0000, 0x0000, 0x81e5, 0x8187, 0x8798,
+ /* a0 */ 0x81da, 0x0000, 0x0000, 0x0000, 0x0000, 0x81d2, 0x81d3, 0x81c8,
+ /* a8 */ 0x81c9, 0x81bf, 0x81be, 0x81e7, 0x81e8, 0x0000, 0x8793, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8188, 0x81e6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81e4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x008ad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x81ea, 0x0000, 0x81eb, 0x0000, 0x0000,
+ /* 88 */ 0x81ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8182, 0x81df, 0x81e9, 0x0000, 0x0000, 0x0000, 0x8185, 0x8186,
+ /* a8 */ 0x0000, 0x0000, 0x81e1, 0x81e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ed, 0x81ee,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x008eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x81bc, 0x81bd, 0x81c0, 0x81c1, 0x81ba, 0x81bb,
+ /* 88 */ 0x0000, 0x0000, 0x81c2, 0x81c3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81cf, 0x81d0, 0x81d1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8799,
+
+ /*** Three byte table, leaf: e28bxx - offset 0x0092b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8496, 0x8497, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x00966 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81c6, 0x81c7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x849c,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28exx - offset 0x0097f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8461, 0x8462,
+
+ /*** Three byte table, leaf: e28fxx - offset 0x009bf ***/
+
+ /* 80 */ 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a,
+ /* 88 */ 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x0000, 0x849e, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e290xx - offset 0x009dc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x849d,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x00a00 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747,
+ /* a8 */ 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f,
+ /* b0 */ 0x8750, 0x8751, 0x8752, 0x8753,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e293xx - offset 0x00a34 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6,
+ /* 98 */ 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce,
+ /* a0 */ 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6,
+ /* a8 */ 0x86d7, 0x86d8, 0x0000, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad,
+ /* b0 */ 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x83d8, 0x83d9, 0x83da,
+ /* b8 */ 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00a74 ***/
+
+ /* 80 */ 0x849f, 0x84aa, 0x84a0, 0x84ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x84a1, 0x0000, 0x0000, 0x84ac,
+ /* 90 */ 0x84a2, 0x0000, 0x0000, 0x84ad, 0x84a4, 0x0000, 0x0000, 0x84af,
+ /* 98 */ 0x84a3, 0x0000, 0x0000, 0x84ae, 0x84a5, 0x84ba, 0x0000, 0x0000,
+ /* a0 */ 0x84b5, 0x0000, 0x0000, 0x84b0, 0x84a7, 0x84bc, 0x0000, 0x0000,
+ /* a8 */ 0x84b7, 0x0000, 0x0000, 0x84b2, 0x84a6, 0x0000, 0x0000, 0x84b6,
+ /* b0 */ 0x84bb, 0x0000, 0x0000, 0x84b1, 0x84a8, 0x0000, 0x0000, 0x84b8,
+ /* b8 */ 0x84bd, 0x0000, 0x0000, 0x84b3, 0x84a9, 0x0000, 0x0000, 0x84b9,
+
+ /*** Three byte table, leaf: e295xx - offset 0x00ab4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x84be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x84b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x00ad4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x81a1, 0x81a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x83eb, 0x81a3, 0x81a2, 0x0000, 0x0000, 0x8241, 0x8240,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x81a5, 0x81a4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e297xx - offset 0x00b14 ***/
+
+ /* 80 */ 0x8243, 0x8242, 0x0000, 0x0000, 0x0000, 0x0000, 0x819f, 0x819e,
+ /* 88 */ 0x0000, 0x825a, 0x0000, 0x819b, 0x0000, 0x0000, 0x819d, 0x819c,
+ /* 90 */ 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x825e, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81fc,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e298xx - offset 0x00b54 ***/
+
+ /* 80 */ 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x0000, 0x819a, 0x8199, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83e5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83e2, 0x83e3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879e, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x00b94 ***/
+
+ /* 80 */ 0x818a, 0x0000, 0x8189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x83b8, 0x83bb, 0x83b9, 0x83be, 0x83b7, 0x83bc, 0x83ba, 0x83bd,
+ /* a8 */ 0x83ea, 0x81fb, 0x81f4, 0x81f9, 0x81fa, 0x81f3, 0x81f8, 0x81f2,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e29cxx - offset 0x00bc4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x849b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e29dxx - offset 0x00bee ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879d, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x869f, 0x86a0,
+ /* b8 */ 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8,
+
+ /*** Three byte table, leaf: e2a4xx - offset 0x00c2e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x824d, 0x824e,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e2a6xx - offset 0x00c64 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8259,
+
+ /*** Three byte table, leaf: e2a7xx - offset 0x00ca4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x829d, 0x829e, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00ce4 ***/
+
+ /* 80 */ 0x8140, 0x8141, 0x8142, 0x8156, 0x0000, 0x8158, 0x8159, 0x815a,
+ /* 88 */ 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178,
+ /* 90 */ 0x8179, 0x817a, 0x81a7, 0x81ac, 0x816b, 0x816c, 0x81d8, 0x81d9,
+ /* 98 */ 0x81d6, 0x81d7, 0x0000, 0x0000, 0x8160, 0x8780, 0x0000, 0x8781,
+ /* a0 */ 0x83e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x81b1, 0x81b2, 0x81b3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x81b4, 0x81b5, 0x825b, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00d23 ***/
+
+ /* 80 */ 0x0000, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5,
+ /* 88 */ 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad,
+ /* 90 */ 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5,
+ /* 98 */ 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd,
+ /* a0 */ 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5,
+ /* a8 */ 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd,
+ /* b0 */ 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5,
+ /* b8 */ 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00d63 ***/
+
+ /* 80 */ 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5,
+ /* 88 */ 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed,
+ /* 90 */ 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x814a, 0x814b, 0x8154, 0x8155, 0x81b7,
+ /* a0 */ 0x829b, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346,
+ /* a8 */ 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e,
+ /* b0 */ 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356,
+ /* b8 */ 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00da3 ***/
+
+ /* 80 */ 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366,
+ /* 88 */ 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e,
+ /* 90 */ 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376,
+ /* 98 */ 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e,
+ /* a0 */ 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387,
+ /* a8 */ 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f,
+ /* b0 */ 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8492,
+ /* b8 */ 0x8493, 0x8494, 0x8495, 0x8145, 0x815b, 0x8152, 0x8153, 0x81b6,
+
+ /*** Three byte table, leaf: e387xx - offset 0x00de3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3,
+ /* b8 */ 0x83f4, 0x83f5, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc,
+
+ /*** Three byte table, leaf: e388xx - offset 0x00e23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x878a, 0x878b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x878c,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e389xx - offset 0x00e5d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5,
+ /* 98 */ 0x84c6, 0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x00e7d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8785, 0x8786, 0x8787, 0x8788,
+ /* a8 */ 0x8789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4,
+ /* b8 */ 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc,
+
+ /*** Three byte table, leaf: e38bxx - offset 0x00ebd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0,
+ /* 98 */ 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8,
+ /* a0 */ 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x0000, 0x86ef, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x86ee, 0x0000, 0x0000, 0x86f1, 0x86f0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x86ed, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38cxx - offset 0x00efa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8765, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8769, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8760, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8763, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8761, 0x876b, 0x0000, 0x0000, 0x876a, 0x8764,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x876c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8766, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x876e,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38dxx - offset 0x00f36 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x875f, 0x876d, 0x0000, 0x0000, 0x8762, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8768,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x877e, 0x878f, 0x878e, 0x878d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00f75 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8772, 0x8773,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x876f, 0x8770, 0x8771, 0x0000,
+ /* a0 */ 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00fb1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x827d, 0x0000, 0x8783, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e390xx - offset 0x00fef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x87a1, 0x0000, 0x0000, 0x0000, 0xf04c, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf051, 0x0000, 0xf052,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e391xx - offset 0x0101e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf07d, 0x0000, 0xf075, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e392xx - offset 0x0104c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf09e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87d1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf14a, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e393xx - offset 0x0108b ***/
+
+ /* 80 */ 0x0000, 0xf7e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf14e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x87d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e394xx - offset 0x010ac ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf167,
+ /* a0 */ 0x0000, 0x0000, 0x0000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e395xx - offset 0x010cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf17c, 0xf17d, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf181, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf187,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e396xx - offset 0x010fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1a1, 0x0000,
+ /* a8 */ 0xf1a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e397xx - offset 0x01139 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ad, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e398xx - offset 0x01174 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c8, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e399xx - offset 0x011aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39axx - offset 0x011d9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf25e, 0x0000, 0x0000, 0x0000, 0x0000, 0xf262, 0x0000,
+ /* 98 */ 0x0000, 0xf260, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39bxx - offset 0x0120a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf276,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39dxx - offset 0x01229 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf0a1, 0xf0a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf0a7, 0xf0a6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0aa,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39exx - offset 0x0125f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x987e, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e39fxx - offset 0x0129e ***/
+
+ /* 80 */ 0x0000, 0xf0bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x988f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf0d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0da, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e3a0xx - offset 0x012de ***/
+
+ /* 80 */ 0xf0dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ed,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ef, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e3a1xx - offset 0x0131e ***/
+
+ /* 80 */ 0xf0f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf0f9,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a3xx - offset 0x01340 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf2b9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a4xx - offset 0x0137b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c4,
+ /* 98 */ 0x0000, 0x0000, 0xf2c8,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a5xx - offset 0x01396 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2de,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3a9xx - offset 0x013c6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf37a, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf37e,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3abxx - offset 0x013fa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf391, 0xf3b4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf39c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3acxx - offset 0x0142c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3ac, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3b0, 0x0000, 0xf3b2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xeb68,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3adxx - offset 0x0144f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3eb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e3,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3aexx - offset 0x01488 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf447,
+ /* 88 */ 0xf448, 0x0000, 0x0000, 0x0000, 0x0000, 0xf44b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf453, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb9e, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3afxx - offset 0x014c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeb9f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf467, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf47c,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b0xx - offset 0x014f6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf497, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b3xx - offset 0x01533 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf4b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b4xx - offset 0x01562 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf4ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4fc,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b5xx - offset 0x01581 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf55f, 0x0000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b6xx - offset 0x015a7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf573, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e3b7xx - offset 0x015e7 ***/
+
+ /* 80 */ 0xf590, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf597, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3b8xx - offset 0x01622 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec86,
+
+ /*** Three byte table, leaf: e3b9xx - offset 0x01662 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5bf, 0x0000,
+ /* a8 */ 0xf5c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3baxx - offset 0x0169f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf5c7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ce, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bdxx - offset 0x016c8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf653,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeccb, 0x0000, 0x0000, 0xf665, 0x0000, 0xf667,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bexx - offset 0x01700 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf67b, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e3bfxx - offset 0x01737 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf687, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf68c,
+ /* 40 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e480xx - offset 0x0174f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf6a0,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e481xx - offset 0x01789 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf6ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e482xx - offset 0x017b6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf6b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e484xx - offset 0x017f1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e485xx - offset 0x01829 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf6f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f5,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf6fb,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e486xx - offset 0x0184d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf752, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf756,
+
+ /*** Three byte table, leaf: e487xx - offset 0x0188d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf766, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf76a, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf767, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e488xx - offset 0x018c6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf772,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf776, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e489xx - offset 0x018e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed8d, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48bxx - offset 0x0191c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48cxx - offset 0x0195a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf7cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48dxx - offset 0x01997 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf7df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000,
+ /* 46 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e48fxx - offset 0x019a9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf85d, 0x0000,
+ /* b0 */ 0xf861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e490xx - offset 0x019e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf867, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf869,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf86b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf86e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e491xx - offset 0x01a0e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xedd7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xedd8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf88c, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf88e,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e492xx - offset 0x01a49 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf897, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf8b3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e493xx - offset 0x01a88 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e494xx - offset 0x01ac0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf8d7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8eb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e495xx - offset 0x01afd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf8ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e496xx - offset 0x01b20 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee70, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf96e,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e497xx - offset 0x01b59 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf98c, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xee80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e498xx - offset 0x01b8a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9a2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e499xx - offset 0x01bc9 ***/
+
+ /* 80 */ 0x0000, 0xf9b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c1,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49axx - offset 0x01bef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf9cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49cxx - offset 0x01c23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9e9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49dxx - offset 0x01c3f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa48,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e49fxx - offset 0x01c64 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa5e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a0xx - offset 0x01ca2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa68, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a1xx - offset 0x01cde ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeec9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa7b,
+ /* 49 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a2xx - offset 0x01ced ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaa5,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a6xx - offset 0x01d23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xef77,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a7xx - offset 0x01d54 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb8a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfb90, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4a8xx - offset 0x01d90 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb95, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfb98,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4aaxx - offset 0x01dba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbb5,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4acxx - offset 0x01df7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfbd3, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4afxx - offset 0x01e35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfc45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfc47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfc49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xfc50,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b0xx - offset 0x01e5e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefbc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfc5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b3xx - offset 0x01e9a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfca8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfcab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b4xx - offset 0x01ed3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc9,
+ /* 88 */ 0x0000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b5xx - offset 0x01edc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcde,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x01f1c ***/
+
+ /* 80 */ 0x88ea, 0x929a, 0xf041, 0x8eb5, 0x0000, 0x0000, 0x0000, 0x969c,
+ /* 88 */ 0x8fe4, 0x8e4f, 0x8fe3, 0x89ba, 0x0000, 0x9573, 0x975e, 0xf042,
+ /* 90 */ 0x98a0, 0x894e, 0xf043, 0x0000, 0x8a8e, 0x98a1, 0x90a2, 0x99c0,
+ /* 98 */ 0x8b75, 0x95b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fe5, 0x0000,
+ /* a0 */ 0x0000, 0x97bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c0, 0x0000,
+ /* a8 */ 0x87a2, 0xf044, 0x98a2, 0xf045, 0xf5ac, 0x9286, 0xf046, 0x87a3,
+ /* b0 */ 0x87a4, 0x98a3, 0x8bf8, 0x0000, 0x0000, 0x0000, 0x98a4, 0x0000,
+ /* b8 */ 0x8adb, 0x924f, 0x0000, 0x8ee5, 0x98a5, 0x0000, 0x0000, 0x98a6,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x01f5c ***/
+
+ /* 80 */ 0xf047, 0x0000, 0x98a7, 0x9454, 0x0000, 0x8b76, 0x0000, 0xf048,
+ /* 88 */ 0xf049, 0x0000, 0x0000, 0x9456, 0x0000, 0x93e1, 0x8cc1, 0x9652,
+ /* 90 */ 0x0000, 0xf04b, 0x0000, 0x0000, 0x0000, 0xe568, 0x98a8, 0x8fe6,
+ /* 98 */ 0x98a9, 0x89b3, 0xf04e, 0x0000, 0x0000, 0x8be3, 0x8cee, 0x96e7,
+ /* a0 */ 0x0000, 0x0000, 0x9ba4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf04f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9790, 0x0000, 0x93fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aa3, 0x0000,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x01f9c ***/
+
+ /* 80 */ 0x8b54, 0x0000, 0x98aa, 0x0000, 0x0000, 0x98ab, 0x97b9, 0x0000,
+ /* 88 */ 0x975c, 0x9188, 0x98ad, 0x8e96, 0x93f1, 0x87a5, 0x98b0, 0x0000,
+ /* 90 */ 0x0000, 0x895d, 0x8cdd, 0x0000, 0x8cdc, 0x88e4, 0x0000, 0x0000,
+ /* 98 */ 0x986a, 0x9869, 0x0000, 0x8db1, 0x889f, 0xf050, 0x98b1, 0x98b2,
+ /* a0 */ 0x98b3, 0x9653, 0x98b4, 0x0000, 0x8cf0, 0x88e5, 0x9692, 0x0000,
+ /* a8 */ 0x8b9c, 0x0000, 0x0000, 0x8b9d, 0x8b9e, 0x92e0, 0x97ba, 0x0000,
+ /* b0 */ 0x98b5, 0x0000, 0x0000, 0x98b6, 0x0000, 0x0000, 0x98b7, 0x0000,
+ /* b8 */ 0x0000, 0xf053, 0x906c, 0xf054, 0xf056, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x01fdc ***/
+
+ /* 80 */ 0x8f59, 0x906d, 0x98bc, 0xf057, 0x98ba, 0x0000, 0x98bb, 0x8b77,
+ /* 88 */ 0xf058, 0x0000, 0x8da1, 0x89ee, 0x0000, 0x98b9, 0x98b8, 0x95a7,
+ /* 90 */ 0xf059, 0x0000, 0x0000, 0x0000, 0x8e65, 0x8e64, 0x91bc, 0x98bd,
+ /* 98 */ 0x9574, 0x90e5, 0xf05b, 0x0000, 0x0000, 0x8157, 0x98be, 0x98c0,
+ /* a0 */ 0x0000, 0x87a6, 0x0000, 0x91e3, 0x97df, 0x88c8, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf05a, 0x0000, 0x98bf, 0x89bc, 0x0000,
+ /* b0 */ 0x8bc2, 0xf05c, 0x9287, 0x0000, 0x0000, 0xf05d, 0x8c8f, 0x98c1,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9443, 0x0000, 0x87a7, 0x0000, 0x87a8,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x0201c ***/
+
+ /* 80 */ 0xf05e, 0x8ae9, 0x0000, 0x87a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x98c2, 0x88c9, 0x87aa, 0x0000, 0x8cde, 0x8aea, 0x959a,
+ /* 90 */ 0x94b0, 0x8b78, 0x0000, 0x0000, 0x0000, 0x0000, 0xf05f, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x89ef, 0x0000, 0x98e5, 0x9360, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x948c,
+ /* b0 */ 0x98c4, 0x0000, 0x0000, 0x0000, 0x94ba, 0x0000, 0x97e0, 0xf061,
+ /* b8 */ 0x904c, 0x0000, 0x8e66, 0x0000, 0x8e97, 0x89be, 0xf062,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x0205b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x92cf, 0x0000, 0x0000, 0x9241, 0x98c8,
+ /* 88 */ 0x87ac, 0x87ad, 0x0000, 0x0000, 0x0000, 0x88ca, 0x92e1, 0x8f5a,
+ /* 90 */ 0x8db2, 0x9743, 0x0000, 0x91cc, 0xf063, 0x89bd, 0x87ae, 0x98c7,
+ /* 98 */ 0xf064, 0x975d, 0x98c3, 0x98c5, 0x8dec, 0x98c6, 0x9b43, 0x87af,
+ /* a0 */ 0x87ab, 0x0000, 0x0000, 0x0000, 0xf060, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x98ce, 0x87b0, 0x0000, 0x87b1, 0x0000, 0x0000, 0x98d1,
+ /* b0 */ 0x98cf, 0x0000, 0x0000, 0x89c0, 0x0000, 0x95b9, 0x98c9, 0xf066,
+ /* b8 */ 0xf067, 0x0000, 0xf068, 0x98cd, 0x8cf1, 0xf069, 0x87b2, 0x8e67,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x0209b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf06a, 0x8aa4, 0x0000, 0xf06b, 0x98d2, 0x0000,
+ /* 88 */ 0x98ca, 0x0000, 0x87b3, 0x97e1, 0x0000, 0x8e98, 0x0000, 0x98cb,
+ /* 90 */ 0x0000, 0x98d0, 0xf06c, 0x0000, 0x87b4, 0x0000, 0x98d3, 0x87b5,
+ /* 98 */ 0x98cc, 0x0000, 0xf06d, 0x8b9f, 0x0000, 0x88cb, 0x0000, 0x0000,
+ /* a0 */ 0x8ba0, 0x89bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9b44, 0x0000, 0x9699, 0x958e, 0x8cf2,
+ /* b0 */ 0x0000, 0x0000, 0xf06f, 0x0000, 0x0000, 0x904e, 0x97b5, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf070, 0x95d6,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x020db ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8c57, 0x91a3, 0x89e2, 0xf071, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x87b7, 0x8f72, 0xf072, 0x0000, 0x0000, 0x98d7, 0xf073,
+ /* 90 */ 0x98dc, 0x98da, 0xf074, 0x0000, 0x98d5, 0x0000, 0x0000, 0x91ad,
+ /* 98 */ 0x98d8, 0x0000, 0x98db, 0x98d9, 0x0000, 0x95db, 0x0000, 0x98d6,
+ /* a0 */ 0x87b8, 0x904d, 0x0000, 0x9693, 0x98dd, 0x98de, 0xf06e, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f43, 0x98eb,
+ /* b0 */ 0x0000, 0x879f, 0xf076, 0x946f, 0x0000, 0x9555, 0x98e6, 0x0000,
+ /* b8 */ 0x95ee, 0x0000, 0x89b4, 0x0000, 0x0000, 0x0000, 0x98ea, 0x0000,
+
+ /*** Three byte table, leaf: e580xx - offset 0x0211b ***/
+
+ /* 80 */ 0xf077, 0x87b9, 0x87ba, 0x0000, 0x0000, 0x98e4, 0x98ed, 0x0000,
+ /* 88 */ 0x0000, 0x9171, 0x0000, 0x8cc2, 0x0000, 0x947b, 0x87bb, 0xe0c5,
+ /* 90 */ 0xf078, 0x98ec, 0x937c, 0xf079, 0x98e1, 0x0000, 0x8cf4, 0x0000,
+ /* 98 */ 0x87bc, 0x8cf3, 0x98df, 0x0000, 0xf07a, 0x0000, 0xf07b, 0x8ed8,
+ /* a0 */ 0x0000, 0x98e7, 0xf07c, 0x95ed, 0x926c, 0x98e3, 0x8c91, 0x87bd,
+ /* a8 */ 0x98e0, 0x98e8, 0x98e2, 0x97cf, 0x98e9, 0x9860, 0x87be, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be4, 0x0000,
+ /* b8 */ 0x0000, 0x8c90, 0x0000, 0x87c0, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e581xx - offset 0x0215b ***/
+
+ /* 80 */ 0x87bf, 0x87c1, 0xf07e, 0x98ee, 0x0000, 0x0000, 0xf080, 0x98ef,
+ /* 88 */ 0x98f3, 0x88cc, 0x0000, 0x0000, 0x0000, 0x0000, 0xf081, 0x95ce,
+ /* 90 */ 0x98f2, 0x0000, 0x0000, 0xf082, 0x0000, 0x98f1, 0x98f5, 0xf083,
+ /* 98 */ 0x0000, 0x0000, 0x98f4, 0x0000, 0x92e2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf084, 0x0000, 0x8c92, 0xf085, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf086, 0x0000, 0x98f6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf087, 0x0000, 0x8ec3, 0x0000, 0x91a4, 0x92e3, 0x8bf4, 0x0000,
+ /* b8 */ 0x98f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b55, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x0219b ***/
+
+ /* 80 */ 0x98f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x98fa, 0x0000, 0x0000,
+ /* 88 */ 0xf089, 0x0000, 0x0000, 0x0000, 0x0000, 0x9654, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8c86, 0xf08a, 0xf08b, 0x87c2, 0xf08c, 0xf08d, 0x0000,
+ /* 98 */ 0x8e50, 0x94f5, 0x98f9, 0x0000, 0xf08e, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf088, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf08f, 0x0000, 0x8dc3, 0x9762, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf091, 0x98fc, 0x9942, 0x98fb, 0x8dc2, 0x0000, 0x8f9d,
+ /* b8 */ 0x0000, 0x0000, 0xf092, 0xf093, 0x0000, 0x0000, 0x8c58,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x021da ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9943, 0x0000, 0xf094, 0x8bcd, 0x0000, 0xf095,
+ /* 88 */ 0x0000, 0x9940, 0x9941, 0x0000, 0x87c3, 0x93ad, 0xf098, 0x919c,
+ /* 90 */ 0x87c5, 0x8ba1, 0x0000, 0x0000, 0xf09a, 0x966c, 0x9944, 0x0000,
+ /* 98 */ 0x0000, 0xf09b, 0x97bb, 0x0000, 0x0000, 0x0000, 0x9945, 0x0000,
+ /* a0 */ 0x0000, 0xf09c, 0x0000, 0x9948, 0x0000, 0x9946, 0x87c6, 0x916d,
+ /* a8 */ 0x0000, 0xf09d, 0x0000, 0x0000, 0x0000, 0x9947, 0x9949, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x87c4, 0xf096, 0x0000, 0x994b, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x994a, 0x0000, 0x95c6, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e584xx - offset 0x0221a ***/
+
+ /* 80 */ 0x8b56, 0x994d, 0x994e, 0x87c9, 0x89ad, 0x0000, 0x87c8, 0x0000,
+ /* 88 */ 0xf140, 0x994c, 0x0000, 0x87ca, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8ef2, 0x0000, 0x9951, 0x9950, 0x994f, 0xf142,
+ /* 98 */ 0x98d4, 0x0000, 0x9952, 0xf143, 0x0000, 0x0000, 0x87cb, 0x8f9e,
+ /* a0 */ 0x0000, 0x9953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x96d7, 0x0000, 0x0000, 0x87cc, 0x0000, 0x9955,
+ /* b8 */ 0x0000, 0x0000, 0x9954, 0x9957, 0x9956, 0x0000, 0x0000, 0x9958,
+
+ /*** Three byte table, leaf: e585xx - offset 0x0225a ***/
+
+ /* 80 */ 0x9959, 0x88f2, 0x0000, 0x8cb3, 0x8c5a, 0x8f5b, 0x929b, 0x8ba2,
+ /* 88 */ 0x90e6, 0x8cf5, 0x87cd, 0x8d8e, 0x995b, 0x96c6, 0x9365, 0x0000,
+ /* 90 */ 0x8e99, 0x0000, 0x995a, 0x0000, 0x995c, 0x87cf, 0x0000, 0x87d0,
+ /* 98 */ 0x0000, 0x0000, 0x937d, 0x0000, 0x8a95, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf145, 0x0000, 0x995d, 0x0000, 0x0000, 0x93fc, 0x0000, 0x0000,
+ /* a8 */ 0x9153, 0x995f, 0x9960, 0x94aa, 0x8cf6, 0x985a, 0x9961, 0x0000,
+ /* b0 */ 0x0000, 0x8ba4, 0x0000, 0xf147, 0x0000, 0x95ba, 0x91b4, 0x8bef,
+ /* b8 */ 0x9354, 0x0000, 0x0000, 0xf7f2, 0x8c93, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x0229a ***/
+
+ /* 80 */ 0x9962, 0x0000, 0x9963, 0xf148, 0x0000, 0x93e0, 0x897e, 0x0000,
+ /* 88 */ 0x0000, 0x9966, 0x8dfb, 0xf149, 0x9965, 0x8dc4, 0x0000, 0x9967,
+ /* 90 */ 0xe3ec, 0x9968, 0x9660, 0x9969, 0x0000, 0x996a, 0x996b, 0x8fe7,
+ /* 98 */ 0xf14b, 0x8eca, 0x0000, 0x0000, 0x0000, 0x87d2, 0x0000, 0x0000,
+ /* a0 */ 0x8aa5, 0x0000, 0x996e, 0xf14c, 0x996c, 0x96bb, 0x996d, 0x0000,
+ /* a8 */ 0x9579, 0x996f, 0x9970, 0x9971, 0x937e, 0xf14d, 0x0000, 0x0000,
+ /* b0 */ 0x9975, 0x9973, 0x9974, 0x9972, 0x8de1, 0x9976, 0x96e8, 0x97e2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf14f, 0x9977,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x022d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x87d3, 0x90a6, 0x9978, 0x8f79, 0x0000,
+ /* 88 */ 0x0000, 0x9979, 0x87d4, 0x929c, 0x97bd, 0x9380, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99c3, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x997a, 0xeaa3, 0x8bc3, 0x87d5, 0x0000,
+ /* a0 */ 0x997b, 0x967d, 0x87d6, 0x0000, 0x0000, 0x0000, 0x8f88, 0x91fa,
+ /* a8 */ 0x0000, 0x997d, 0x93e2, 0x0000, 0x0000, 0x997e, 0x87d7, 0x0000,
+ /* b0 */ 0x9980, 0x8a4d, 0x0000, 0xf152, 0xf153, 0x9981, 0x8ba5, 0x0000,
+ /* b8 */ 0x93ca, 0x899a, 0x8f6f, 0x0000, 0x0000, 0x949f, 0x9982, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x02318 ***/
+
+ /* 80 */ 0x9381, 0x87d8, 0xf154, 0x906e, 0x9983, 0x0000, 0x95aa, 0x90d8,
+ /* 88 */ 0x8aa0, 0x0000, 0x8aa7, 0x9984, 0x0000, 0x0000, 0x9986, 0x0000,
+ /* 90 */ 0x0000, 0x8c59, 0xf155, 0x87da, 0x9985, 0x87db, 0xf156, 0x97f1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f89, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x94bb, 0x95ca, 0x0000, 0x9987,
+ /* a8 */ 0x0000, 0x9798, 0x9988, 0x0000, 0x0000, 0x0000, 0x9989, 0x0000,
+ /* b0 */ 0x939e, 0x0000, 0x0000, 0x998a, 0x0000, 0x0000, 0x90a7, 0x8dfc,
+ /* b8 */ 0x8c94, 0x998b, 0x8e68, 0x8d8f, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x02355 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x92e4, 0x998d, 0x0000, 0x0000, 0x91a5,
+ /* 88 */ 0x0000, 0x87dc, 0x8ded, 0x998e, 0x998f, 0x914f, 0x0000, 0x998c,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9991, 0xf158, 0x9655, 0x87dd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8d84, 0xf159, 0x889e, 0x9990, 0x0000,
+ /* a0 */ 0x0000, 0x87de, 0x0000, 0x8c95, 0x8ddc, 0x948d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9994, 0x9992, 0x0000, 0xf15a, 0x0000, 0x0000, 0x959b,
+ /* b0 */ 0x8fe8, 0x999b, 0x8a84, 0x9995, 0x9993, 0x916e, 0x0000, 0xf15b,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9997, 0x0000, 0x9996,
+
+ /*** Three byte table, leaf: e58axx - offset 0x02395 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf15d, 0x8a63, 0xf15c, 0x0000, 0x0000, 0x8c80,
+ /* 88 */ 0x999c, 0x97ab, 0x0000, 0x0000, 0x0000, 0x9998, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x999d, 0x999a, 0x87df, 0x9999, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf15f, 0x0000, 0x0000, 0x97cd, 0x0000, 0x0000, 0x0000, 0x8cf7,
+ /* a0 */ 0x89c1, 0x0000, 0x0000, 0x97f2, 0xf161, 0x0000, 0xf162, 0x0000,
+ /* a8 */ 0x0000, 0x8f95, 0x9377, 0x8d85, 0x99a0, 0x99a1, 0x0000, 0xf163,
+ /* b0 */ 0x0000, 0x97e3, 0x0000, 0x0000, 0x984a, 0x99a3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8cf8, 0xf164, 0xf165, 0x99a2, 0x0000, 0x8a4e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58bxx - offset 0x023d4 ***/
+
+ /* 80 */ 0x0000, 0x99a4, 0x0000, 0x9675, 0x0000, 0x92ba, 0x0000, 0x9745,
+ /* 88 */ 0x87e0, 0x95d7, 0xf166, 0x0000, 0x87e2, 0x99a5, 0x0000, 0x0000,
+ /* 90 */ 0x87e3, 0xf168, 0xe8d3, 0x0000, 0x0000, 0x93ae, 0x87e4, 0x99a6,
+ /* 98 */ 0x8aa8, 0x96b1, 0x0000, 0x87e5, 0x0000, 0x8f9f, 0x99a7, 0x95e5,
+ /* a0 */ 0x99ab, 0x0000, 0x90a8, 0x99a8, 0x8bce, 0x0000, 0x99a9, 0x8aa9,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x87e7, 0x0000, 0x8c4d, 0x99ac, 0x0000, 0x99ad, 0x0000, 0xf16a,
+ /* b8 */ 0x99ae, 0x99af, 0x8ed9, 0x87e8, 0x0000, 0x0000, 0x8cf9, 0x96dc,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x02414 ***/
+
+ /* 80 */ 0x87e9, 0x96e6, 0x93f5, 0x0000, 0x0000, 0x95ef, 0x99b0, 0x87ea,
+ /* 88 */ 0x99b1, 0x0000, 0xf16b, 0xf16c, 0x0000, 0x99b3, 0x0000, 0x99b5,
+ /* 90 */ 0x99b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x99b6, 0x89bb, 0x966b,
+ /* 98 */ 0x0000, 0x8dfa, 0x99b7, 0x0000, 0x87eb, 0x9178, 0x0000, 0x0000,
+ /* a0 */ 0x8fa0, 0x8ba7, 0x0000, 0x99b8, 0xf16d, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x94d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x99b9,
+ /* b0 */ 0x0000, 0x99ba, 0x0000, 0x99bb, 0x0000, 0xf16e, 0x0000, 0x0000,
+ /* b8 */ 0x99bc, 0x9543, 0x8be6, 0x88e3, 0x0000, 0x0000, 0xf16f, 0x93bd,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x02454 ***/
+
+ /* 80 */ 0x99bd, 0x8f5c, 0xf170, 0x90e7, 0x0000, 0x99bf, 0x99be, 0x8fa1,
+ /* 88 */ 0x8cdf, 0x99c1, 0x94bc, 0x0000, 0x0000, 0x99c2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x94da, 0x91b2, 0x91ec, 0x8ba6, 0x0000, 0x0000, 0x93ec,
+ /* 98 */ 0x9250, 0x0000, 0x948e, 0x0000, 0x966d, 0x0000, 0x99c4, 0x0000,
+ /* a0 */ 0x90e8, 0x87ed, 0x0000, 0x87ee, 0x0000, 0x0000, 0x8c54, 0xf173,
+ /* a8 */ 0x0000, 0x99c5, 0x0000, 0x0000, 0xf174, 0x0000, 0x99c6, 0x894b,
+ /* b0 */ 0x88f3, 0x8aeb, 0x0000, 0x91a6, 0x8b70, 0x9791, 0x0000, 0x99c9,
+ /* b8 */ 0x89b5, 0x0000, 0xf175, 0x99c8, 0x0000, 0x87ef, 0x0000, 0x8ba8,
+
+ /*** Three byte table, leaf: e58exx - offset 0x02494 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x99ca, 0x0000, 0x96ef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x87f0, 0x0000, 0x0000, 0x99cb, 0x0000,
+ /* 98 */ 0x97d0, 0x0000, 0x8cfa, 0x0000, 0x0000, 0x87f1, 0x0000, 0x8cb4,
+ /* a0 */ 0x99cc, 0x0000, 0x0000, 0x0000, 0xf176, 0x99ce, 0x99cd, 0x0000,
+ /* a8 */ 0x907e, 0x8958, 0x0000, 0x0000, 0x0000, 0x897d, 0x99cf, 0x0000,
+ /* b0 */ 0x99d0, 0x0000, 0x87f2, 0x8cb5, 0xf177, 0x0000, 0x99d1, 0xf179,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8b8e, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e58fxx - offset 0x024d4 ***/
+
+ /* 80 */ 0xf17a, 0x0000, 0x8e51, 0x99d2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9694, 0x8db3, 0x8b79, 0x9746, 0x916f, 0x94bd, 0x8efb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f66, 0xf17e, 0x8ee6, 0x8ef3,
+ /* 98 */ 0x0000, 0x8f96, 0xf180, 0x94be, 0x0000, 0x0000, 0x0000, 0x99d5,
+ /* a0 */ 0x0000, 0x8962, 0x9170, 0x8cfb, 0x8cc3, 0x8be5, 0x0000, 0x0000,
+ /* a8 */ 0x99d9, 0x9240, 0x91fc, 0x8ba9, 0x8fa2, 0x99da, 0x99d8, 0x89c2,
+ /* b0 */ 0x91e4, 0x8eb6, 0x8e6a, 0x8945, 0xf182, 0xf183, 0x8a90, 0x8d86,
+ /* b8 */ 0x8e69, 0x0000, 0x99db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x02513 ***/
+
+ /* 80 */ 0x0000, 0x99dc, 0x0000, 0x8b68, 0x8a65, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8d87, 0x8b67, 0x92dd, 0x8944, 0x93af, 0x96bc, 0x8d40, 0x9799,
+ /* 90 */ 0x9366, 0x8cfc, 0x87f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8c4e, 0x0000, 0x99e5, 0x989e, 0x8be1,
+ /* a0 */ 0x9669, 0x0000, 0x0000, 0x0000, 0xf185, 0x0000, 0x94db, 0x87f4,
+ /* a8 */ 0xf186, 0x99e4, 0x0000, 0x8adc, 0x99df, 0x99e0, 0x99e2, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99e3, 0x0000,
+ /* b8 */ 0x8b7a, 0x9081, 0x0000, 0x95ab, 0x99e1, 0x99dd, 0x8ce1, 0x0000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x02553 ***/
+
+ /* 80 */ 0x99de, 0x0000, 0x9843, 0xf188, 0x0000, 0x0000, 0x95f0, 0x0000,
+ /* 88 */ 0x92e6, 0x8ce0, 0x8d90, 0x0000, 0x0000, 0x87f5, 0x99e6, 0x0000,
+ /* 90 */ 0x0000, 0x93db, 0x0000, 0x0000, 0x0000, 0xf184, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99ea,
+ /* a0 */ 0x0000, 0x0000, 0xf189, 0x0000, 0x0000, 0x0000, 0xf18a, 0x0000,
+ /* a8 */ 0x8efc, 0x0000, 0x8ef4, 0x87f7, 0xf18b, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x99ed, 0x99eb, 0x0000, 0x96a1, 0x87f8, 0x99e8, 0x99f1, 0x99ec,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x99ef, 0x8cc4, 0x96bd, 0x0000, 0x87f9,
+
+ /*** Three byte table, leaf: e592xx - offset 0x02593 ***/
+
+ /* 80 */ 0x99f0, 0x0000, 0x0000, 0x0000, 0x99f2, 0x0000, 0x99f4, 0x0000,
+ /* 88 */ 0x87fa, 0x0000, 0xf18c, 0x8dee, 0x9861, 0xf18d, 0x99e9, 0x99e7,
+ /* 90 */ 0x99f3, 0x0000, 0x99ee, 0x0000, 0x0000, 0xf18e, 0x87fb, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x87f6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf18f, 0x87fc, 0x99f6, 0x0000, 0x9a42, 0x99f8, 0xf190, 0x0000,
+ /* a8 */ 0x99fc, 0x8840, 0x0000, 0x9a40, 0x99f9, 0xf191, 0xf192, 0x9a5d,
+ /* b0 */ 0x0000, 0x0000, 0x8de7, 0x8a50, 0x0000, 0x0000, 0x0000, 0xf193,
+ /* b8 */ 0x99f7, 0x0000, 0xf194, 0x0000, 0x9a44, 0x88f4, 0x9a43, 0xf195,
+
+ /*** Three byte table, leaf: e593xx - offset 0x025d3 ***/
+
+ /* 80 */ 0x88a3, 0x9569, 0x9a41, 0xf196, 0x99fa, 0x0000, 0x8841, 0x99f5,
+ /* 88 */ 0x99fb, 0x8dc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x88f5, 0x9a4e, 0x0000, 0x0000, 0x9a46, 0x9a47, 0x0000,
+ /* a8 */ 0x8fa3, 0x9689, 0x0000, 0x0000, 0xf198, 0x9a4c, 0x9a4b, 0xf199,
+ /* b0 */ 0x0000, 0xf19a, 0x934e, 0xf19b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9a4d, 0x0000, 0x0000, 0x9a4a, 0x0000, 0x8842,
+
+ /*** Three byte table, leaf: e594xx - offset 0x02613 ***/
+
+ /* 80 */ 0xf19c, 0xf19d, 0x0000, 0x0000, 0x8953, 0x0000, 0x8db4, 0x904f,
+ /* 88 */ 0x0000, 0xf19e, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x9a48,
+ /* 90 */ 0x9382, 0x0000, 0x0000, 0x0000, 0x9a49, 0x0000, 0x88a0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x9a53, 0x9742,
+ /* b0 */ 0x0000, 0x8fa5, 0x0000, 0x9a59, 0x0000, 0x8845, 0x0000, 0x0000,
+ /* b8 */ 0x9a58, 0x9a4f, 0x0000, 0x0000, 0xf19f, 0x0000, 0x91c1, 0x0000,
+
+ /*** Three byte table, leaf: e595xx - offset 0x02653 ***/
+
+ /* 80 */ 0x9a50, 0xf1a0, 0x0000, 0x0000, 0x91ed, 0x9a55, 0x8fa4, 0xf1a2,
+ /* 88 */ 0x0000, 0x0000, 0xf1a3, 0x0000, 0x9a52, 0x0000, 0x0000, 0x96e2,
+ /* 90 */ 0x8846, 0x0000, 0x0000, 0x8c5b, 0x0000, 0x0000, 0x9a56, 0x9a57,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a54, 0x9a5a, 0x8847, 0x0000,
+ /* a0 */ 0xf1a5, 0xf1a6, 0x0000, 0x9a51, 0xf1a7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9a60, 0x9a65, 0xf1a9, 0x9a61, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x02693 ***/
+
+ /* 80 */ 0x9a5c, 0x8848, 0xf1aa, 0x9a66, 0x9150, 0x0000, 0x8849, 0x9a68,
+ /* 88 */ 0xf1ab, 0x8d41, 0x9a5e, 0x929d, 0x0000, 0x0000, 0x884a, 0x0000,
+ /* 90 */ 0x0000, 0xf1ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9a62, 0x9a5b, 0x8aab, 0x0000, 0x8aec, 0x8a85, 0x9a63, 0x9a5f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c96,
+ /* a8 */ 0x9a69, 0x9a67, 0x9172, 0x8b69, 0x8baa, 0x884c, 0x9a64, 0x0000,
+ /* b0 */ 0x8bf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1b1,
+
+ /*** Three byte table, leaf: e597xx - offset 0x026d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a6d, 0x9a6b, 0x0000, 0x9aa5,
+ /* 88 */ 0x0000, 0xf1b2, 0x0000, 0x0000, 0xf1b3, 0x0000, 0x884d, 0x0000,
+ /* 90 */ 0x0000, 0xf1b4, 0xf1ae, 0x0000, 0x9a70, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9a6a, 0x0000, 0x9a6e, 0xf1b5, 0x0000, 0x9a6c,
+ /* a0 */ 0x0000, 0x0000, 0xf1b7, 0x8e6b, 0x9a6f, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf1b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a72,
+ /* b8 */ 0x0000, 0x9a77, 0x0000, 0x0000, 0x0000, 0x9a75, 0x9a74,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x02712 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9251, 0xf1bc,
+ /* 88 */ 0x884f, 0x89c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000,
+ /* 90 */ 0xf1bd, 0x0000, 0x0000, 0x0000, 0x9a71, 0x0000, 0x9a73, 0x8fa6,
+ /* 98 */ 0x8952, 0x0000, 0x0000, 0x9a76, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1ba, 0x89dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a82,
+ /* b0 */ 0xf1be, 0x8ffa, 0x9a7d, 0x0000, 0x9a7b, 0x0000, 0x9a7c, 0xf1bf,
+ /* b8 */ 0x9a7e, 0x0000, 0x0000, 0x8851, 0x0000, 0xf1c1, 0x0000, 0xf1c2,
+
+ /*** Three byte table, leaf: e599xx - offset 0x02752 ***/
+
+ /* 80 */ 0xf1c3, 0x0000, 0x895c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c4,
+ /* 88 */ 0x0000, 0x8852, 0x0000, 0x0000, 0x9158, 0x0000, 0x9a78, 0x0000,
+ /* 90 */ 0x9a79, 0x0000, 0x0000, 0xeaa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8a9a, 0x0000, 0x0000, 0xf1c5, 0x0000,
+ /* a0 */ 0xf1c6, 0x0000, 0x0000, 0x0000, 0x9a81, 0x0000, 0x8854, 0x0000,
+ /* a8 */ 0x8aed, 0x0000, 0x9a84, 0x9a80, 0x9a83, 0xf1c7, 0x0000, 0x8856,
+ /* b0 */ 0x0000, 0x8857, 0x8858, 0x0000, 0x95ac, 0x0000, 0x8853, 0x0000,
+ /* b8 */ 0x93d3, 0x0000, 0x94b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59axx - offset 0x02792 ***/
+
+ /* 80 */ 0x9a86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a85, 0x8a64,
+ /* 88 */ 0xf1c9, 0x0000, 0x9a87, 0x0000, 0xf1ca, 0x0000, 0x0000, 0x9a8a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a89, 0xf1cb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x8859, 0xf1cc, 0x0000, 0x0000, 0xf1cd, 0x885a, 0x0000,
+ /* a0 */ 0x9a88, 0x0000, 0x9458, 0x0000, 0x0000, 0x9a8b, 0x0000, 0x0000,
+ /* a8 */ 0xf1ce, 0x885b, 0x0000, 0x0000, 0x885c, 0xf1cf, 0x9a8c, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf1d0, 0x885d, 0x9a8e, 0x0000, 0x9a8d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a90, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x027d2 ***/
+
+ /* 80 */ 0x9a93, 0x9a91, 0x9a8f, 0x9a92, 0x0000, 0xf1d1, 0x0000, 0x0000,
+ /* 88 */ 0x9a94, 0x885e, 0x885f, 0x0000, 0x0000, 0xf1d2, 0x9a95, 0x0000,
+ /* 90 */ 0x0000, 0x9a96, 0x0000, 0x9a97, 0x0000, 0x0000, 0x0000, 0x9a98,
+ /* 98 */ 0x9964, 0x0000, 0x8efa, 0x8e6c, 0x0000, 0x0000, 0x89f1, 0xf1d3,
+ /* a0 */ 0x88f6, 0x0000, 0x0000, 0x9263, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a99, 0x0000,
+ /* b0 */ 0x8da2, 0x0000, 0x88cd, 0x907d, 0x0000, 0x0000, 0xf1d5, 0xf1d6,
+ /* b8 */ 0x0000, 0x9a9a, 0x8cc5, 0x0000, 0x0000, 0x8d91, 0x0000, 0x9a9c,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x02812 ***/
+
+ /* 80 */ 0x9a9b, 0x0000, 0x0000, 0x95de, 0x9a9d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9a9f, 0x9a9e, 0x8860, 0x9aa0, 0x0000, 0x9aa1, 0x0000, 0x8c97,
+ /* 90 */ 0x0000, 0x0000, 0x8980, 0x9aa2, 0x0000, 0xf1d8, 0x9aa4, 0x0000,
+ /* 98 */ 0x9aa3, 0x0000, 0x0000, 0x0000, 0x9aa6, 0x0000, 0x0000, 0x9379,
+ /* a0 */ 0x0000, 0x8862, 0x0000, 0xf1d9, 0x0000, 0x0000, 0x9aa7, 0x88b3,
+ /* a8 */ 0x8ddd, 0xf1db, 0x0000, 0x0000, 0x0000, 0x8c5c, 0x0000, 0x8863,
+ /* b0 */ 0x926e, 0x0000, 0x0000, 0x8864, 0x8865, 0x0000, 0x0000, 0x9aa8,
+ /* b8 */ 0x9aa9, 0x0000, 0x0000, 0x9aab, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x02852 ***/
+
+ /* 80 */ 0x9aac, 0x0000, 0x8de2, 0x0000, 0x0000, 0xf1dd, 0xf1de, 0x8bcf,
+ /* 88 */ 0x0000, 0x0000, 0x9656, 0x0000, 0xf1df, 0xf1e0, 0x9aaa, 0x9aad,
+ /* 90 */ 0x8dbf, 0x8d42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9ab1, 0x0000, 0x0000, 0x8da3, 0x0000, 0x9252, 0x0000,
+ /* a8 */ 0xf1e2, 0x9aae, 0x92d8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e3,
+ /* b0 */ 0x8866, 0x0000, 0x0000, 0xf1e4, 0xf1e5, 0xf1e6, 0x0000, 0x8867,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf1e7, 0x8868, 0x0000, 0x0000, 0x9ab2,
+
+ /*** Three byte table, leaf: e59exx - offset 0x02892 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9ab0, 0x9ab3, 0x0000, 0x8c5e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9ab4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1eb, 0x0000, 0x8869, 0xf1ec, 0xf1ed, 0x0000,
+ /* a0 */ 0x9ab5, 0x0000, 0x8d43, 0x8a5f, 0x9ab7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1ee, 0x0000, 0x9ab8, 0x0000, 0xf1ea, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ab9, 0x0000, 0x0000, 0x9ab6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x886c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x028d2 ***/
+
+ /* 80 */ 0x9aaf, 0x0000, 0x0000, 0x9aba, 0x0000, 0x0000, 0x9abb, 0x886d,
+ /* 88 */ 0x886e, 0x0000, 0x0000, 0x9684, 0xf1f1, 0x0000, 0x8fe9, 0x886f,
+ /* 90 */ 0x0000, 0x0000, 0x9abd, 0x9abe, 0x9abc, 0x0000, 0x9ac0, 0xf1ef,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9457, 0x0000, 0xf1f4, 0x88e6,
+ /* a0 */ 0x9575, 0x0000, 0x0000, 0x9ac1, 0x8870, 0x0000, 0xf1f5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000,
+ /* b0 */ 0xf1f6, 0x0000, 0x0000, 0x0000, 0x8ffb, 0x8872, 0x8873, 0x8eb7,
+ /* b8 */ 0xf1f8, 0x947c, 0x8aee, 0xf1f9, 0x8de9, 0xf1fa, 0x0000, 0x8874,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x02912 ***/
+
+ /* 80 */ 0x9678, 0x0000, 0x93b0, 0x0000, 0xf1fb, 0x8c98, 0x91cd, 0x0000,
+ /* 88 */ 0x0000, 0x8875, 0x9abf, 0x9ac2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91c2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9ac3, 0x0000, 0x0000, 0x0000, 0x9ac4, 0xf1fc, 0x0000,
+ /* a0 */ 0xf240, 0x9ac6, 0x0000, 0x0000, 0x92e7, 0x0000, 0x0000, 0xf241,
+ /* a8 */ 0x0000, 0x0000, 0x8aac, 0x0000, 0x0000, 0x0000, 0x0000, 0xea9f,
+ /* b0 */ 0x8981, 0x95f1, 0xf242, 0x0000, 0x8fea, 0x9367, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf243, 0x8de4, 0x0000, 0x0000, 0x9acc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x02952 ***/
+
+ /* 80 */ 0x95bb, 0x97db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf245, 0x89f2, 0x9ac8, 0xf246, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9159, 0x9acb, 0x0000, 0x9383, 0x0000, 0x0000, 0x9368,
+ /* 98 */ 0x9384, 0x94b7, 0x92cb, 0x0000, 0x0000, 0x0000, 0x8dc7, 0x0000,
+ /* a0 */ 0x0000, 0x8877, 0x9ac7, 0x0000, 0x8878, 0x0000, 0x0000, 0xf247,
+ /* a8 */ 0x0000, 0x8996, 0x0000, 0x9355, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ac9, 0x0000, 0x9ac5, 0x0000, 0x0000, 0x906f, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9acd, 0x0000, 0x0000, 0x887a, 0x0000, 0x8f6d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x02991 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8bab, 0x0000, 0x9ace, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x887b, 0xf248, 0xf249, 0x0000, 0xf24a, 0x0000, 0xf24b,
+ /* 90 */ 0xf24c, 0x0000, 0x0000, 0x95e6, 0xf24d, 0x0000, 0x0000, 0x919d,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x92c4, 0xf24e, 0x887c, 0x9ad0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x966e, 0x887e, 0xf24f, 0x9ad1, 0x0000, 0x0000, 0x9ad6, 0x0000,
+ /* b0 */ 0x0000, 0xf250, 0x0000, 0x95ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9ad5, 0x9acf, 0x9ad2, 0x9ad4, 0x0000, 0x0000, 0x8da4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x029d0 ***/
+
+ /* 80 */ 0x0000, 0x95c7, 0x0000, 0xf252, 0x0000, 0x9ad7, 0x0000, 0x9264,
+ /* 88 */ 0x0000, 0x0000, 0x89f3, 0x0000, 0x8feb, 0xf253, 0x8882, 0x0000,
+ /* 90 */ 0x0000, 0x9ad9, 0x8881, 0x9ad8, 0x8883, 0x8d88, 0x0000, 0x9ada,
+ /* 98 */ 0x9adc, 0x9adb, 0x8884, 0x0000, 0x9ade, 0x0000, 0x9ad3, 0x9ae0,
+ /* a0 */ 0x8885, 0x0000, 0xf254, 0x0000, 0x9adf, 0x9add, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8886, 0x0000, 0x8e6d, 0x9070, 0x0000, 0x9173, 0x9ae1,
+ /* b0 */ 0x90ba, 0x88eb, 0x9484, 0xf255, 0xf256, 0x0000, 0x0000, 0x92d9,
+ /* b8 */ 0x0000, 0x9ae3, 0x9ae2, 0x9ae4, 0x9ae5, 0x9ae6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x02a0e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9ae7, 0x0000, 0x0000, 0xf257, 0xf258, 0x0000,
+ /* 88 */ 0x0000, 0x95cf, 0x9ae8, 0xf259, 0x8887, 0xf25a, 0x0000, 0x89c4,
+ /* 90 */ 0x9ae9, 0x0000, 0x0000, 0x0000, 0xf25b, 0x975b, 0x8a4f, 0x0000,
+ /* 98 */ 0x99c7, 0x8f67, 0x91bd, 0x9aea, 0x96e9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x96b2, 0x0000, 0xf25c, 0x9aec, 0x0000, 0x91e5,
+ /* a8 */ 0x0000, 0x9356, 0x91be, 0x9576, 0x9aed, 0x9aee, 0x899b, 0x0000,
+ /* b0 */ 0x0000, 0x8eb8, 0x9aef, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ce,
+ /* b8 */ 0x9af0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf25f, 0x9af1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x02a4d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x0000, 0xf261, 0x8aef,
+ /* 88 */ 0x93de, 0x95f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x9af5, 0x9174,
+ /* 90 */ 0x9af4, 0x8c5f, 0x0000, 0x0000, 0x967a, 0x9af3, 0x0000, 0x9385,
+ /* 98 */ 0x9af7, 0x0000, 0x9af6, 0xf264, 0x0000, 0x8889, 0x0000, 0xf265,
+ /* a0 */ 0x9af9, 0x0000, 0x9af8, 0x0000, 0x0000, 0x899c, 0x0000, 0x9afa,
+ /* a8 */ 0x8fa7, 0x9afc, 0x9244, 0x0000, 0x9afb, 0x888a, 0x95b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8f97, 0x937a, 0xf267, 0xf268, 0x0000,
+ /* b8 */ 0x9b40, 0x0000, 0x0000, 0x0000, 0xf269, 0x8d44, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x02a8c ***/
+
+ /* 80 */ 0x0000, 0x9b41, 0x9440, 0x94dc, 0x96cf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9444, 0x888b, 0x0000, 0x9b4a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x888c, 0x8b57, 0x0000, 0x0000, 0x9764, 0x0000,
+ /* 98 */ 0x0000, 0x96ad, 0x0000, 0x9baa, 0x0000, 0x9b42, 0x0000, 0xf26a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9b45, 0x888d, 0x91c3, 0x0000, 0x0000,
+ /* a8 */ 0x9657, 0x0000, 0x0000, 0x0000, 0x9369, 0x0000, 0xf26b, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9b46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9685, 0x0000, 0x8dc8, 0xf26c, 0x0000, 0x8fa8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x02acb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x888e, 0x0000, 0x0000, 0x9b47, 0x0000,
+ /* 88 */ 0xf26d, 0x8e6f, 0x0000, 0x8e6e, 0x0000, 0xf26e, 0x0000, 0x0000,
+ /* 90 */ 0x88b7, 0x8cc6, 0x888f, 0x90a9, 0x88cf, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9b4b, 0x9b4c, 0x0000, 0x9b49, 0x8890, 0xf26f, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf270, 0xf271, 0x8957, 0x8aad, 0xf272,
+ /* a8 */ 0x9b48, 0x0000, 0x96c3, 0x9550, 0x0000, 0x0000, 0xf273, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88a6, 0x0000,
+ /* b8 */ 0xeff8, 0x0000, 0x0000, 0x88f7, 0x0000, 0x0000, 0x0000, 0x8e70,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x02b0b ***/
+
+ /* 80 */ 0x0000, 0x88d0, 0x0000, 0x88a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9b51, 0x0000, 0x0000, 0xf277, 0xf278, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9b4f, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000, 0xf279,
+ /* 98 */ 0x96ba, 0x0000, 0x9b52, 0x0000, 0x9b50, 0x0000, 0x0000, 0x9b4e,
+ /* a0 */ 0x9050, 0x0000, 0x0000, 0x8892, 0x0000, 0x9b4d, 0x0000, 0xf27a,
+ /* a8 */ 0x0000, 0x95d8, 0x0000, 0x0000, 0x0000, 0xf27b, 0x0000, 0x8ce2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b56, 0x9b57, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8fa9, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x02b4b ***/
+
+ /* 80 */ 0x9b53, 0x984b, 0x0000, 0x0000, 0x0000, 0x0000, 0x946b, 0x0000,
+ /* 88 */ 0x0000, 0x9b55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf27c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8da5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9b58, 0x0000, 0x0000, 0xf27d, 0x9577, 0x8893,
+ /* a8 */ 0x0000, 0x0000, 0x9b59, 0x0000, 0x9b54, 0x8894, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895,
+ /* b8 */ 0x0000, 0x0000, 0xf27e, 0x0000, 0x0000, 0x0000, 0x8896, 0x96b9,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x02b8b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf280, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x947d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9b5a, 0x9551, 0xf281, 0x0000, 0x8898, 0xf282,
+ /* a0 */ 0xf283, 0x0000, 0xf284, 0x0000, 0x0000, 0x0000, 0x0000, 0x8899,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf285, 0x0000, 0xf286, 0x0000, 0xf287, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf288, 0x0000, 0x9b5b, 0x9b5f, 0x9b5c, 0xf289,
+
+ /*** Three byte table, leaf: e5abxx - offset 0x02bcb ***/
+
+ /* 80 */ 0x0000, 0x89c5, 0x9b5e, 0x0000, 0x889a, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8eb9, 0x0000, 0x9b5d, 0x8c99, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9b6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b64, 0x9b61,
+ /* 98 */ 0x0000, 0x0000, 0xf28a, 0x0000, 0xf28b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf28c, 0x9284, 0x0000, 0x9b60, 0x0000, 0xf28d, 0x9b62, 0x0000,
+ /* a8 */ 0x0000, 0x9b63, 0x0000, 0x0000, 0x0000, 0x0000, 0xf28f, 0x0000,
+ /* b0 */ 0xf28e, 0x0000, 0x0000, 0x0000, 0x0000, 0xf290, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9b65, 0x9b66, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5acxx - offset 0x02c0b ***/
+
+ /* 80 */ 0xf291, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf292, 0x8af0, 0x0000, 0x9b68, 0x9b67, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b69, 0xf293,
+ /* 98 */ 0x0000, 0x889c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8fec, 0x0000, 0x0000, 0x889d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9b6c, 0x0000, 0x92da, 0xf295, 0x0000, 0x0000,
+ /* b0 */ 0x8964, 0x0000, 0x9b6a, 0x0000, 0xf294, 0x0000, 0x9b6d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b6e, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x02c4b ***/
+
+ /* 80 */ 0x9b71, 0x9874, 0x0000, 0x9b6f, 0x0000, 0x9b70, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf296, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8e71, 0x9b72, 0xf297, 0x0000, 0x8d45, 0x9b73, 0x9875, 0x8e9a,
+ /* 98 */ 0x91b6, 0x0000, 0x9b74, 0x9b75, 0x8e79, 0x8d46, 0x0000, 0x96d0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8b47, 0x8cc7, 0x9b76, 0x8a77, 0x0000,
+ /* a8 */ 0xf298, 0x9b77, 0x0000, 0x91b7, 0x0000, 0x0000, 0x0000, 0xf299,
+ /* b0 */ 0x9b78, 0x9ba1, 0x0000, 0x9b79, 0x0000, 0x9b7a, 0x0000, 0x0000,
+ /* b8 */ 0x9b7b, 0x0000, 0x9b7d, 0x0000, 0xf29a, 0x9876, 0x0000, 0xf29b,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x02c8b ***/
+
+ /* 80 */ 0x9b7e, 0xf29c, 0x0000, 0x9b80, 0xf29d, 0x91ee, 0x0000, 0x8946,
+ /* 88 */ 0x8ee7, 0x88c0, 0x0000, 0x9176, 0x8aae, 0x8eb3, 0x0000, 0x8d47,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9877, 0x0000, 0x9386, 0xf09f, 0x8f40,
+ /* 98 */ 0x8aaf, 0x9288, 0x92e8, 0x88b6, 0x8b58, 0x95f3, 0x0000, 0x8ec0,
+ /* a0 */ 0x0000, 0x0000, 0x8b71, 0x90e9, 0x8eba, 0x9747, 0x9b81, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a0, 0x0000, 0x8b7b, 0x0000,
+ /* b0 */ 0x8dc9, 0x0000, 0x0000, 0x8a51, 0x8983, 0x8faa, 0x89c6, 0x0000,
+ /* b8 */ 0x9b82, 0x9765, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f68,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x02ccb ***/
+
+ /* 80 */ 0xf0a2, 0x0000, 0x8ee2, 0x9b83, 0x8af1, 0x93d0, 0x96a7, 0x9b84,
+ /* 88 */ 0x0000, 0x9b85, 0x0000, 0x0000, 0x9578, 0x0000, 0xf0a4, 0x0000,
+ /* 90 */ 0x9b87, 0x0000, 0x8aa6, 0x8bf5, 0x9b86, 0x0000, 0xf0a5, 0x0000,
+ /* 98 */ 0x9878, 0x0000, 0x0000, 0x8ab0, 0x0000, 0x9051, 0x9b8b, 0x8e40,
+ /* a0 */ 0x0000, 0x89c7, 0x9b8a, 0x0000, 0x9b88, 0x9b8c, 0x9b89, 0x944a,
+ /* a8 */ 0x9ecb, 0x9052, 0x0000, 0x9b8d, 0x9879, 0x0000, 0x97be, 0x0000,
+ /* b0 */ 0x9b8e, 0xf0a8, 0x0000, 0x9b90, 0x0000, 0x929e, 0x9b8f, 0x0000,
+ /* b8 */ 0x90a1, 0x0000, 0x8e9b, 0x0000, 0x0000, 0xf0a9, 0x91ce, 0x8ef5,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x02d0b ***/
+
+ /* 80 */ 0x0000, 0x9595, 0x90ea, 0xf0ab, 0x8ecb, 0x9b91, 0x8fab, 0x9b92,
+ /* 88 */ 0x9b93, 0x88d1, 0x91b8, 0x9071, 0x0000, 0x9b94, 0x93b1, 0x8fac,
+ /* 90 */ 0x0000, 0x8fad, 0x987a, 0x9b95, 0x0000, 0x0000, 0x90eb, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8fae, 0x0000, 0x0000, 0x0000, 0x987b, 0x0000,
+ /* a0 */ 0x9b96, 0x0000, 0x9b97, 0x987c, 0x96de, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9b98, 0xf0ac, 0x0000, 0x987d, 0x0000, 0x8bc4, 0x0000, 0x0000,
+ /* b0 */ 0xf0ad, 0x8f41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9b99, 0x9b9a, 0x8eda, 0x904b, 0x93f2, 0x9073, 0x94f6, 0x9441,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x02d4b ***/
+
+ /* 80 */ 0x8bc7, 0x9b9b, 0x0000, 0x0000, 0x0000, 0x8b8f, 0x9b9c, 0x0000,
+ /* 88 */ 0x8bfc, 0x0000, 0x93cd, 0x89ae, 0x0000, 0x8e72, 0x9b9d, 0x9ba0,
+ /* 90 */ 0x9b9f, 0x8bfb, 0x0000, 0x9b9e, 0x0000, 0x9357, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeff9, 0x0000, 0x0000, 0x91ae, 0xf0af,
+ /* a0 */ 0x936a, 0x8ec6, 0x9880, 0xf0b0, 0x9177, 0x979a, 0x0000, 0xf0b1,
+ /* a8 */ 0xf0b2, 0xf0b3, 0x0000, 0x0000, 0x9ba2, 0x0000, 0x9ba3, 0x93d4,
+ /* b0 */ 0xf0b4, 0x8e52, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ba5, 0x0000,
+ /* b8 */ 0x0000, 0x9ba6, 0x9884, 0x0000, 0xf0b7,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x02d88 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf0ba, 0x0000, 0xf0bb, 0x0000, 0x9ba7, 0x0000, 0x0000, 0x9885,
+ /* 90 */ 0x8af2, 0x9ba8, 0x0000, 0x0000, 0x9ba9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9886,
+ /* a0 */ 0xf0bf, 0x89aa, 0xf0c0, 0x9887, 0x0000, 0x0000, 0xf0c1, 0xf0c2,
+ /* a8 */ 0x915a, 0x8ae2, 0x9888, 0x9bab, 0x96a6, 0xf0c4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x91d0, 0x0000, 0x8a78, 0x0000, 0xf0c5, 0x9bad, 0x9baf,
+ /* b8 */ 0x8add, 0x0000, 0x9889, 0x9bac, 0x9bae, 0x0000, 0x9bb1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x02dc7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bb0, 0x0000, 0x9bb2,
+ /* 88 */ 0x0000, 0xf0c7, 0x0000, 0x988a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x988b, 0x0000, 0x988c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9bb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x93bb, 0x8bac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x89e3, 0x9bb4, 0x9bb9, 0x0000, 0x0000, 0x9bb7, 0x0000, 0x95f5,
+ /* b0 */ 0x95f4, 0x0000, 0x0000, 0x0000, 0x988d, 0x0000, 0x9387, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9bb6, 0x8f73, 0x0000, 0x9bb5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x02e05 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ca, 0x9092,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9bba, 0x0000, 0x9890, 0x8de8, 0x0000,
+ /* 90 */ 0xf0cb, 0x9bc0, 0x0000, 0x0000, 0x9bc1, 0x9bbb, 0x8a52, 0x9bbc,
+ /* 98 */ 0x9bc5, 0x9bc4, 0x9bc3, 0x9bbf, 0x0000, 0xf0cd, 0x0000, 0x9bbe,
+ /* a0 */ 0xf0ce, 0x0000, 0x9bc2, 0x0000, 0xf0cf, 0x0000, 0xf0d0, 0x9891,
+ /* a8 */ 0x0000, 0x95f6, 0x0000, 0xf0cc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf0d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf0d2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x02e43 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf0d3, 0x0000, 0x0000, 0x0000, 0x9893, 0x9894,
+ /* 88 */ 0x0000, 0x0000, 0x9896, 0x9bc9, 0x9bc6, 0x0000, 0x9bc8, 0x0000,
+ /* 90 */ 0x9792, 0x0000, 0x9bc7, 0x9895, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bbd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf0d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9093, 0xf0d6, 0x0000, 0x9bca, 0x9897, 0x0000, 0x8db5,
+ /* b0 */ 0xf0d8, 0x0000, 0x0000, 0x9bcb, 0x0000, 0x0000, 0x9bcc, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x02e82 ***/
+
+ /* 80 */ 0x0000, 0x9898, 0x9bcf, 0x0000, 0x9bce, 0x0000, 0x0000, 0x9bcd,
+ /* 88 */ 0xf0db, 0x0000, 0x0000, 0x9388, 0x9bb8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9bd5, 0x0000, 0xf0dd, 0x0000, 0xf0de, 0x0000, 0x0000, 0xf0df,
+ /* 98 */ 0x0000, 0xf0e0, 0x0000, 0x0000, 0x0000, 0x9bd1, 0x0000, 0x0000,
+ /* a0 */ 0x9899, 0x0000, 0x9bd0, 0x0000, 0x989a, 0x0000, 0x0000, 0x989b,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bd2, 0x0000, 0x9bd3, 0x0000,
+ /* b0 */ 0xf0e1, 0x0000, 0xf0e2, 0x0000, 0xf0e3, 0x0000, 0x0000, 0x9bd6,
+ /* b8 */ 0x989c, 0xf0e5, 0x97e4, 0x0000, 0x9bd7, 0x9bd4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x02ec0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9bd8, 0x0000, 0x989d, 0x8ade, 0x9bd9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf0e6, 0x9bdb, 0x9bda, 0x0000, 0x0000, 0x9bdc, 0xf0e7,
+ /* 98 */ 0xf0e8, 0x0000, 0x0000, 0x9bdd, 0x0000, 0x90ec, 0x8f42, 0x0000,
+ /* a0 */ 0xf0e9, 0x8f84, 0xeaa6, 0x9183, 0xf0eb, 0x8d48, 0x8db6, 0x8d49,
+ /* a8 */ 0x8b90, 0xf0ec, 0x0000, 0x9bde, 0x0000, 0x0000, 0x8db7, 0x0000,
+ /* b0 */ 0x0000, 0x8cc8, 0x9bdf, 0x96a4, 0x9462, 0x9be0, 0x0000, 0x8d4a,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8aaa, 0x0000, 0x9246, 0x8bd0, 0x0000,
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x02f00 ***/
+
+ /* 80 */ 0xf0ee, 0x0000, 0x8e73, 0x957a, 0x0000, 0x0000, 0x94bf, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9be1, 0x8af3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9be4, 0xf0f0, 0x0000, 0xeaa7, 0xf0f1, 0x929f, 0x0000,
+ /* 98 */ 0xeaa8, 0x9be3, 0x9be2, 0x9be5, 0x0000, 0x92e9, 0x0000, 0xf0f3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9083, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e74, 0x0000, 0x90c8, 0xf0f4, 0x91d1,
+ /* b0 */ 0x8b41, 0x0000, 0x0000, 0x92a0, 0x0000, 0x0000, 0x9be6, 0x9be7,
+ /* b8 */ 0x8fed, 0x0000, 0x0000, 0x0000, 0x0000, 0x9658, 0xf0f5, 0x0000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x02f40 ***/
+
+ /* 80 */ 0x9bea, 0x0000, 0x0000, 0x9be9, 0x9be8, 0x959d, 0x0000, 0x9bf1,
+ /* 88 */ 0x0000, 0xf0f6, 0x0000, 0x0000, 0x9679, 0x0000, 0x9beb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bed, 0x968b, 0xf0f8, 0x9bec,
+ /* 98 */ 0xeaa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaaa, 0x9bee,
+ /* a0 */ 0x0000, 0x94a6, 0x9bef, 0x95bc, 0x9bf0, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf0fa, 0xf0fb, 0xf0fc, 0xf29f, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8ab1, 0x95bd, 0x944e, 0x9bf2, 0x9bf3, 0xeffa,
+ /* b8 */ 0x8d4b, 0x8ab2, 0x9bf4, 0x8cb6, 0x9763, 0x9748, 0x8af4, 0x9bf6,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x02f80 ***/
+
+ /* 80 */ 0x0000, 0x92a1, 0x0000, 0x8d4c, 0x8faf, 0x0000, 0x0000, 0x94dd,
+ /* 88 */ 0x0000, 0x0000, 0x8fb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f98,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92ea, 0x95f7, 0x9358,
+ /* 98 */ 0x0000, 0x0000, 0x8d4d, 0x0000, 0x957b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9bf7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a1, 0x9378, 0x8dc0,
+ /* a8 */ 0x0000, 0x0000, 0xf2a2, 0x8cc9, 0xf2a3, 0x92eb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88c1, 0x8f8e, 0x8d4e,
+ /* b8 */ 0x9766, 0xf2a4, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaab, 0xf2a5,
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x02fc0 ***/
+
+ /* 80 */ 0x0000, 0x9bf8, 0x9bf9, 0x9470, 0x0000, 0x0000, 0xf2a6, 0x0000,
+ /* 88 */ 0x9bfa, 0x97f5, 0x984c, 0xeaad, 0x0000, 0x0000, 0x0000, 0x9bfc,
+ /* 90 */ 0x9bfb, 0x0000, 0xf2a7, 0x8a66, 0x0000, 0x0000, 0x9c40, 0x0000,
+ /* 98 */ 0x0000, 0xf2a8, 0x9c43, 0x9c44, 0x0000, 0x9c42, 0x0000, 0x955f,
+ /* a0 */ 0x8fb1, 0x9c46, 0x9c45, 0x9c41, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9c47, 0x9c48, 0x0000, 0x0000, 0x9c49, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9c4c, 0x9c4a, 0x0000, 0x9c4b, 0x9c4d, 0x0000, 0x8984, 0x92ec,
+ /* b8 */ 0x9c4e, 0xeaae, 0x8c9a, 0x89f4, 0x9455, 0xf2aa, 0x9c4f, 0x93f9,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x03000 ***/
+
+ /* 80 */ 0xeaaf, 0x95d9, 0xeab0, 0x9c50, 0x984d, 0x0000, 0x0000, 0xeab1,
+ /* 88 */ 0xf2ab, 0x9c51, 0x95be, 0x9c54, 0x989f, 0x98af, 0xf2ac, 0x8eae,
+ /* 90 */ 0x93f3, 0x9c55, 0x0000, 0x8b7c, 0x92a2, 0x88f8, 0x9c56, 0x95a4,
+ /* 98 */ 0x8d4f, 0x0000, 0x0000, 0x926f, 0xf2ad, 0xeab2, 0xf2af, 0x92ed,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xeab3, 0x0000, 0x96ed, 0x8cb7, 0x8cca,
+ /* a8 */ 0x0000, 0x9c57, 0x0000, 0x0000, 0x0000, 0x9c58, 0x0000, 0x9c5e,
+ /* b0 */ 0x0000, 0x8ee3, 0x0000, 0x0000, 0xeab4, 0x92a3, 0xeab5, 0x8bad,
+ /* b8 */ 0x9c59, 0x0000, 0x0000, 0x0000, 0x954a, 0xeab6, 0x9265, 0x0000,
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x03040 ***/
+
+ /* 80 */ 0xeab7, 0x9c5a, 0x0000, 0x0000, 0x0000, 0xeab8, 0x0000, 0xf2b0,
+ /* 88 */ 0x9c5b, 0x0000, 0x8bae, 0x0000, 0x9c5c, 0x0000, 0x9c5d, 0x0000,
+ /* 90 */ 0x0000, 0x9c5f, 0x0000, 0x9396, 0xeab9, 0x0000, 0x9c60, 0x9c61,
+ /* 98 */ 0xeaba, 0x9c62, 0x0000, 0x0000, 0x9c53, 0x9c52, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9c63, 0x8c60, 0xf2b1, 0xeabb, 0x0000, 0x9546, 0xeabc,
+ /* a8 */ 0x0000, 0x8dca, 0x9556, 0x92a4, 0x956a, 0x9c64, 0x0000, 0x0000,
+ /* b0 */ 0x8fb2, 0x8965, 0xf2b2, 0x9c65, 0x0000, 0x0000, 0x0000, 0x9c66,
+ /* b8 */ 0x0000, 0x96f0, 0x0000, 0x0000, 0x94de, 0xeabd, 0xf2b3, 0x9c69,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x03080 ***/
+
+ /* 80 */ 0x899d, 0x90aa, 0x9c68, 0x9c67, 0x8c61, 0x91d2, 0x0000, 0x9c6d,
+ /* 88 */ 0x9c6b, 0xeabe, 0x9c6a, 0x97a5, 0x8ce3, 0x0000, 0x0000, 0xf2b4,
+ /* 90 */ 0x8f99, 0x9c6c, 0x936b, 0x8f5d, 0x0000, 0x0000, 0x0000, 0x93be,
+ /* 98 */ 0x9c70, 0x9c6f, 0x0000, 0x0000, 0xeabf, 0x0000, 0x9c6e, 0x0000,
+ /* a0 */ 0x9c71, 0x8ce4, 0xf2b5, 0x0000, 0xf2b6, 0x0000, 0x0000, 0xeac0,
+ /* a8 */ 0x9c72, 0x959c, 0x8f7a, 0x0000, 0x0000, 0x9c73, 0x94f7, 0xeac1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x93bf, 0x92a5, 0xeac2, 0x0000, 0xeac3,
+ /* b8 */ 0xf2b7, 0x934f, 0x0000, 0x0000, 0x9c74, 0x8b4a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x030be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9053, 0xf2b8, 0x954b, 0x0000, 0xf2ba,
+ /* 88 */ 0x0000, 0xeac4, 0x0000, 0xf2bb, 0x8af5, 0x9445, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf2bc, 0xf2bd, 0xf2be, 0x0000, 0x9c75, 0x8e75,
+ /* 98 */ 0x9659, 0x965a, 0x0000, 0x0000, 0x899e, 0x9c7a, 0xeac5, 0x0000,
+ /* a0 */ 0x9289, 0xeac6, 0xf2bf, 0x0000, 0x9c77, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeac7, 0x0000, 0x89f5, 0x0000, 0x0000, 0xf2c0, 0xf2c1,
+ /* b0 */ 0x9cab, 0x9c79, 0x0000, 0xf2c2, 0x0000, 0x944f, 0x0000, 0x0000,
+ /* b8 */ 0x9c78, 0x0000, 0x0000, 0x9c76, 0xf2c3, 0x8d9a, 0x0000, 0x9c7c,
+
+ /*** Three byte table, leaf: e680xx - offset 0x030fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac8, 0x9c83, 0x9c89,
+ /* 90 */ 0x9c81, 0x0000, 0x937b, 0x0000, 0xeac9, 0x9c86, 0x957c, 0xf2c5,
+ /* 98 */ 0xeaca, 0x9c80, 0x0000, 0x9c85, 0x97e5, 0x8e76, 0x0000, 0x0000,
+ /* a0 */ 0x91d3, 0x9c7d, 0xf2c6, 0x0000, 0xf2c7, 0x8b7d, 0x9c88, 0x90ab,
+ /* a8 */ 0x8985, 0x9c82, 0x89f6, 0x9c87, 0x0000, 0x0000, 0x0000, 0x8baf,
+ /* b0 */ 0x0000, 0x9c84, 0x0000, 0xeacb, 0x0000, 0xeacc, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9c8a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x0313d ***/
+
+ /* 80 */ 0x0000, 0x9c8c, 0x9c96, 0x9c94, 0x0000, 0x0000, 0x9c91, 0xeacd,
+ /* 88 */ 0x0000, 0x0000, 0x9c90, 0x97f6, 0xf2c9, 0x9c92, 0x0000, 0x0000,
+ /* 90 */ 0x8bb0, 0x0000, 0x8d50, 0x0000, 0x0000, 0x8f9a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9c99, 0x9c8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c8f,
+ /* a0 */ 0x9c7e, 0x0000, 0x89f8, 0x9c93, 0x9c95, 0x9270, 0x0000, 0x0000,
+ /* a8 */ 0x8da6, 0x89b6, 0x9c8d, 0x9c98, 0x9c97, 0x8bb1, 0x0000, 0x91a7,
+ /* b0 */ 0x8a86, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c62, 0x0000, 0x9c8e,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ca,
+
+ /*** Three byte table, leaf: e682xx - offset 0x0317d ***/
+
+ /* 80 */ 0x0000, 0x9c9a, 0x0000, 0x9c9d, 0x9c9f, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8ebb, 0xf2cb, 0x9ca5, 0x92ee, 0x9c9b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9ca3, 0x0000, 0x89f7, 0xf2cc, 0x9ca1, 0x9ca2,
+ /* 98 */ 0x0000, 0x0000, 0x9c9e, 0x9ca0, 0x0000, 0xeacf, 0xead0, 0x8ce5,
+ /* a0 */ 0x9749, 0x0000, 0x0000, 0x8ab3, 0x0000, 0x0000, 0x8978, 0x9ca4,
+ /* a8 */ 0xf2cd, 0x9459, 0x88ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf2cf, 0xf2d0, 0x94df, 0x9c7b, 0x9caa, 0x9cae, 0x96e3, 0x0000,
+ /* b8 */ 0x9ca7, 0x0000, 0x0000, 0x0000, 0x9389, 0x9cac, 0xf2d1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x031bc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fee, 0x9cad, 0x93d5,
+ /* 88 */ 0xf2d2, 0x0000, 0x0000, 0xead1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9866, 0x0000, 0x9ca9, 0xead2, 0xead3, 0x0000, 0x0000,
+ /* 98 */ 0x9caf, 0xf2d3, 0x8d9b, 0xf2d4, 0x90c9, 0xead4, 0x0000, 0x88d2,
+ /* a0 */ 0x9ca8, 0x9ca6, 0x0000, 0x9179, 0x0000, 0x0000, 0x0000, 0x9c9c,
+ /* a8 */ 0x8e53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d5, 0x0000,
+ /* b0 */ 0x91c4, 0x9cbb, 0xf2d6, 0x917a, 0x9cb6, 0xf2d7, 0x9cb3, 0x9cb4,
+ /* b8 */ 0xead5, 0x8ee4, 0x9cb7, 0x9cba, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e684xx - offset 0x031fc ***/
+
+ /* 80 */ 0x9cb5, 0x8f44, 0x0000, 0x9cb8, 0x0000, 0x0000, 0x9cb2, 0x0000,
+ /* 88 */ 0x96fa, 0x96f9, 0x0000, 0x0000, 0x0000, 0x9cbc, 0x9cbd, 0x88d3,
+ /* 90 */ 0xf2d8, 0x0000, 0xf2d9, 0xf2da, 0x0000, 0x9cb1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf2db, 0x8bf0, 0x88a4, 0xead6, 0x0000, 0xf2dc, 0x8ab4,
+ /* a0 */ 0x0000, 0x9cb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cc1,
+ /* a8 */ 0x9cc0, 0x0000, 0x0000, 0xead7, 0x9cc5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xead8, 0x0000, 0x0000, 0x0000, 0x9cc6, 0x0000, 0x0000, 0xead9,
+ /* b8 */ 0x0000, 0x0000, 0xf2dd, 0x0000, 0x9cc4, 0x9cc7, 0x9cbf, 0x9cc3,
+
+ /*** Three byte table, leaf: e685xx - offset 0x0323c ***/
+
+ /* 80 */ 0x0000, 0xf2df, 0x9cc8, 0x0000, 0x9cc9, 0x0000, 0xf2e0, 0x9cbe,
+ /* 88 */ 0x8e9c, 0x0000, 0x9cc2, 0x91d4, 0x8d51, 0x9cb0, 0x9054, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9cd6, 0x0000, 0x95e7, 0x0000, 0x0000,
+ /* 98 */ 0x9ccc, 0x9ccd, 0x9cce, 0x0000, 0x0000, 0x9cd5, 0x0000, 0x9cd4,
+ /* a0 */ 0xf2e1, 0x0000, 0x969d, 0x8ab5, 0x0000, 0x9cd2, 0x0000, 0x8c64,
+ /* a8 */ 0x8a53, 0x0000, 0x0000, 0x9ccf, 0x0000, 0x0000, 0x97b6, 0x9cd1,
+ /* b0 */ 0x88d4, 0x9cd3, 0x0000, 0x9cca, 0x9cd0, 0x9cd7, 0x8c63, 0x9ccb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2e2, 0x0000, 0x977c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x0327b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x974a, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cda,
+ /* 88 */ 0x0000, 0x0000, 0x9cde, 0x0000, 0x0000, 0xeadb, 0x919e, 0x0000,
+ /* 90 */ 0x97f7, 0x9cdf, 0xf2e4, 0xf2e5, 0x9cdc, 0x0000, 0x9cd9, 0xf2e6,
+ /* 98 */ 0xf2e7, 0x9cd8, 0x9cdd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x95ae, 0xf2e8, 0x0000, 0x93b2,
+ /* a8 */ 0xf2e9, 0x8c65, 0x0000, 0x9ce0, 0x9cdb, 0xf2ea, 0x9ce1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c9b, 0x0000, 0x0000, 0x0000, 0x89af, 0x0000,
+ /* b8 */ 0x0000, 0xeade, 0x9ce9, 0x0000, 0xeadd, 0x0000, 0x8ab6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x032ba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9ce7, 0x0000, 0x0000, 0x9ce8, 0x8da7,
+ /* 88 */ 0x9ce6, 0x9ce4, 0x9ce3, 0x9cea, 0x9ce2, 0x9cec, 0x0000, 0x0000,
+ /* 90 */ 0x89f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ec, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ed, 0x0000, 0xf2ee,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9cee, 0x0000, 0x0000, 0x9ced, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x92a6, 0x0000, 0x9cf1, 0xf2ef, 0x9cef, 0x9ce5,
+ /* b8 */ 0x8c9c, 0x0000, 0x9cf0, 0x0000, 0x9cf4, 0x9cf3, 0x9cf5, 0x9cf2,
+
+ /*** Three byte table, leaf: e688xx - offset 0x032fa ***/
+
+ /* 80 */ 0x9cf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9cf7, 0x9cf8, 0x95e8, 0x0000, 0x9cfa, 0x9cf9, 0x8f5e, 0x0000,
+ /* 90 */ 0x90ac, 0x89e4, 0x89fa, 0x0000, 0x9cfb, 0xf2f1, 0x88bd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x90ca, 0x9cfc, 0x0000, 0xe6c1, 0x9d40, 0x8c81,
+ /* a0 */ 0x0000, 0x9d41, 0xeae0, 0xf2f2, 0x0000, 0x0000, 0x90ed, 0x0000,
+ /* a8 */ 0x0000, 0xf2f3, 0x9d42, 0x0000, 0x0000, 0x0000, 0x9d43, 0x8b59,
+ /* b0 */ 0x9d44, 0x0000, 0x9d45, 0x9d46, 0x91d5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8ccb, 0x0000, 0x0000, 0x96df, 0x0000, 0x0000, 0xeae1, 0x965b,
+
+ /*** Three byte table, leaf: e689xx - offset 0x0333a ***/
+
+ /* 80 */ 0x8f8a, 0x9d47, 0x0000, 0xeae2, 0x0000, 0x0000, 0xf2f4, 0x90ee,
+ /* 88 */ 0xe7bb, 0x94e0, 0x0000, 0x8ee8, 0xf2f5, 0x8dcb, 0x9d48, 0x0000,
+ /* 90 */ 0x0000, 0xf2f6, 0xf2f7, 0x91c5, 0x0000, 0x95a5, 0xeae3, 0x0000,
+ /* 98 */ 0x91ef, 0x0000, 0xeae4, 0x9d4b, 0x0000, 0x0000, 0x9d49, 0x0000,
+ /* a0 */ 0x9d4c, 0xf2f8, 0x0000, 0x9d4a, 0xf2f9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9d4d, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fb, 0x95af, 0xeae5,
+ /* b0 */ 0x0000, 0x88b5, 0x0000, 0xf2fc, 0x0000, 0x0000, 0x957d, 0x0000,
+ /* b8 */ 0x0000, 0x94e1, 0x0000, 0xf2fa, 0x9d4e, 0x0000, 0x9d51, 0x8fb3,
+
+ /*** Three byte table, leaf: e68axx - offset 0x0337a ***/
+
+ /* 80 */ 0x8b5a, 0x0000, 0x9d4f, 0x9d56, 0x8fb4, 0xeae6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9d50, 0x9463, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x977d, 0x9d52, 0x9d53, 0x9d57, 0x938a, 0x9d54, 0x8d52,
+ /* 98 */ 0x90dc, 0xf340, 0x0000, 0x9d65, 0x94b2, 0x0000, 0x91f0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf341, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x94e2, 0x9dab, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x95f8, 0x0000, 0x0000, 0x0000, 0x92ef, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9695, 0x0000, 0x9d5a, 0x899f, 0x928a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x033b8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9d63, 0x0000, 0xeae7, 0x9253, 0x9d5d, 0x9d64,
+ /* 88 */ 0x9d5f, 0x9d66, 0x9d62, 0x0000, 0x9d61, 0x948f, 0x0000, 0x9d5b,
+ /* 90 */ 0x89fb, 0x9d59, 0x8b91, 0x91f1, 0x9d55, 0xf342, 0xeae8, 0x9d58,
+ /* 98 */ 0x8d53, 0x90d9, 0x0000, 0x8fb5, 0x9d60, 0x9471, 0x0000, 0x0000,
+ /* a0 */ 0x8b92, 0x8a67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8a87, 0x9040, 0x9d68, 0x9d6d,
+ /* b0 */ 0x0000, 0x9d69, 0x0000, 0x8c9d, 0x0000, 0x9d6e, 0x8e41, 0x8d89,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeae9, 0xf344, 0x8f45, 0x9d5c,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x033f8 ***/
+
+ /* 80 */ 0x0000, 0x8e9d, 0x9d6b, 0xf345, 0x0000, 0x0000, 0x0000, 0x8e77,
+ /* 88 */ 0x9d6c, 0x88c2, 0xeaea, 0x0000, 0x9d67, 0xf346, 0x0000, 0x0000,
+ /* 90 */ 0xf347, 0x92a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeaeb, 0x8b93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bb2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d6a,
+ /* a8 */ 0x88a5, 0x0000, 0x0000, 0x8dc1, 0x0000, 0x0000, 0x0000, 0x9055,
+ /* b0 */ 0x0000, 0x0000, 0xf34a, 0x0000, 0x0000, 0xf34b, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeaec, 0x92f0, 0xf34c, 0xf34d, 0x94d2, 0x9d70, 0x917d,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x03438 ***/
+
+ /* 80 */ 0x0000, 0xf34e, 0x0000, 0xeaed, 0xf34f, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x91a8, 0x0000, 0x0000, 0x8e4a, 0x9d71, 0xf350, 0x9d73,
+ /* 90 */ 0x9d6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x95df, 0x0000, 0x92bb,
+ /* 98 */ 0x0000, 0xf352, 0x0000, 0x0000, 0x917b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaee, 0x0000, 0x95f9,
+ /* a8 */ 0x8ecc, 0x9d80, 0x0000, 0x9d7e, 0xf355, 0x0000, 0x9098, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c9e, 0x0000, 0x0000, 0x0000, 0x9d78, 0x8fb7,
+ /* b8 */ 0x0000, 0x0000, 0x93e6, 0x9450, 0xeaef, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68exx - offset 0x03478 ***/
+
+ /* 80 */ 0x9d76, 0x0000, 0x0000, 0x917c, 0xf356, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8ef6, 0x9d7b, 0x0000, 0x0000, 0x8fb6, 0x0000, 0x9d75, 0x9d7a,
+ /* 90 */ 0x0000, 0x0000, 0x9472, 0x0000, 0xf359, 0x0000, 0x9d74, 0x0000,
+ /* 98 */ 0x8c40, 0xf357, 0x0000, 0x8a7c, 0x0000, 0x0000, 0x0000, 0x9d7c,
+ /* a0 */ 0x97a9, 0x8dcc, 0x9254, 0x9d79, 0x0000, 0x90da, 0x0000, 0x8d54,
+ /* a8 */ 0x9084, 0x8986, 0x915b, 0x9d77, 0x8b64, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c66, 0x0000, 0x92cd, 0x9d7d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x917e, 0x0000, 0xf35a, 0x9d81, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x034b8 ***/
+
+ /* 80 */ 0x9d83, 0x0000, 0x0000, 0x91b5, 0x9d89, 0x0000, 0x9d84, 0x0000,
+ /* 88 */ 0x0000, 0x9d86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9560,
+ /* 90 */ 0x92f1, 0x0000, 0x9d87, 0x0000, 0xf35c, 0xf35d, 0x974b, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9767, 0x8ab7, 0xf35e, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf35f, 0x88ac, 0x0000, 0x9d85, 0x0000, 0xeaf0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9d82, 0x0000, 0xf360, 0xf361, 0xeaf1, 0x8af6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf362, 0x0000, 0x8987, 0xeaf2, 0x9d88, 0xf35b,
+ /* b8 */ 0x0000, 0x0000, 0x9768,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x034f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d8c, 0x0000,
+ /* 88 */ 0x0000, 0xf363, 0x0000, 0x0000, 0x0000, 0x91b9, 0x0000, 0x9d93,
+ /* 90 */ 0xeaf3, 0x0000, 0x0000, 0x9d8d, 0xeaf4, 0x0000, 0x9d8a, 0x9d91,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9d72, 0x0000, 0xf364, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xeaf5, 0x0000, 0x0000, 0xf365, 0x9d8e, 0x0000,
+ /* a8 */ 0x9d92, 0xf366, 0x0000, 0x0000, 0x94c0, 0x938b, 0x0000, 0xf367,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9d8b, 0x0000, 0x9d8f, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8c67, 0x0000, 0x0000, 0x0000, 0x8def,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x03532 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x90db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d97, 0x0000,
+ /* 90 */ 0x0000, 0xeaf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9345, 0x0000, 0xf368, 0xf369, 0x0000, 0xf36a, 0x0000, 0x0000,
+ /* a0 */ 0xeaf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d94,
+ /* a8 */ 0x0000, 0x9680, 0x0000, 0x0000, 0x0000, 0xeaf9, 0x0000, 0x9d95,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf36b, 0x0000, 0x0000, 0x9d96, 0x0000,
+ /* b8 */ 0x96cc, 0xeaf6, 0x90a0, 0x0000, 0x0000, 0xf36c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x03570 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8c82, 0x0000, 0x0000, 0x0000, 0xf36d,
+ /* 88 */ 0x9d9d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf36e, 0x8e54, 0x9d9a, 0x0000, 0x9d99, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9451, 0x0000, 0x0000, 0xf36f, 0x93b3, 0xf370,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9350, 0x9d9b, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9d9c, 0x0000, 0x958f, 0x0000, 0x9464, 0x8e42, 0x0000,
+ /* b0 */ 0x90ef, 0x0000, 0x966f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8a68, 0x0000, 0x9da3, 0x9d9e, 0x0000, 0xeafb, 0xeafc,
+
+ /*** Three byte table, leaf: e693xx - offset 0x035b0 ***/
+
+ /* 80 */ 0x0000, 0x9769, 0x9da5, 0x0000, 0xeb40, 0x9da1, 0x0000, 0x9da2,
+ /* 88 */ 0x0000, 0x0000, 0xeb41, 0xf371, 0xf372, 0x9180, 0xeafa, 0x0000,
+ /* 90 */ 0xeb42, 0x0000, 0x9da0, 0x0000, 0x9d5e, 0xf373, 0x0000, 0xf374,
+ /* 98 */ 0x9da4, 0x0000, 0x9d9f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9da9, 0x9daa, 0x9346, 0x9dac, 0xf376, 0xf377, 0x8e43, 0x9da7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8b5b, 0x0000, 0x0000, 0x9dad,
+ /* b0 */ 0x0000, 0x9da6, 0x9db1, 0x0000, 0x9db0, 0x0000, 0x9daf, 0xeb43,
+ /* b8 */ 0x0000, 0x0000, 0x9db2, 0xeb44, 0x0000, 0x9db4, 0x8fef, 0xf378,
+
+ /*** Three byte table, leaf: e694xx - offset 0x035f0 ***/
+
+ /* 80 */ 0x9db3, 0x0000, 0x0000, 0x0000, 0xf379, 0x9db7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf37b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf37c, 0x0000, 0xf37d, 0x0000,
+ /* 98 */ 0x9db5, 0x0000, 0x0000, 0x0000, 0x9db6, 0x9d90, 0xf380, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xeb45, 0x9db9, 0x9db8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeb46, 0x9d98, 0x9dba, 0x9dae, 0x0000, 0x0000, 0x8e78,
+ /* b0 */ 0x0000, 0x0000, 0xf381, 0x0000, 0x9dbb, 0x9dbc, 0x9dbe, 0x9dbd,
+ /* b8 */ 0x9dbf, 0x89fc, 0x0000, 0x8d55, 0x0000, 0x0000, 0x95fa, 0x90ad,
+
+ /*** Three byte table, leaf: e695xx - offset 0x03630 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf382, 0x8ccc, 0x0000, 0x0000,
+ /* 88 */ 0x9dc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dc4, 0x0000, 0x9571,
+ /* 90 */ 0x0000, 0x8b7e, 0x0000, 0x0000, 0xf383, 0x9dc3, 0x9dc2, 0x9473,
+ /* 98 */ 0x9dc5, 0x8bb3, 0x0000, 0x0000, 0x0000, 0x9dc7, 0x9dc6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8ab8, 0x8e55, 0x0000, 0x0000, 0x93d6, 0xeb48,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf384, 0x8c68, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9094, 0x0000, 0x9dc8, 0x0000, 0x90ae, 0x9347, 0x0000, 0x957e,
+ /* b8 */ 0x9dc9, 0x0000, 0xf385, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x0366f ***/
+
+ /* 80 */ 0x0000, 0xf386, 0x9dca, 0x9dcb, 0xf387, 0xf388, 0x0000, 0x95b6,
+ /* 88 */ 0x9b7c, 0x90c4, 0xf389, 0x0000, 0x956b, 0x0000, 0x8dd6, 0x0000,
+ /* 90 */ 0x94e3, 0x94c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x936c,
+ /* 98 */ 0x0000, 0x97bf, 0x0000, 0x9dcd, 0x8ece, 0xeb49, 0x0000, 0x9dce,
+ /* a0 */ 0x0000, 0x88b4, 0x0000, 0x0000, 0x8bd2, 0x90cb, 0x0000, 0x9580,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9dcf, 0x8e61, 0x9266, 0x0000, 0x8e7a,
+ /* b0 */ 0x9056, 0x0000, 0xf38a, 0x0000, 0x0000, 0xf38b, 0x0000, 0x9dd0,
+ /* b8 */ 0xf38c, 0x95fb, 0x0000, 0x0000, 0x8997, 0x8e7b, 0x0000, 0xf38d,
+
+ /*** Three byte table, leaf: e697xx - offset 0x036af ***/
+
+ /* 80 */ 0x0000, 0x9dd3, 0xf38e, 0x9dd1, 0x9dd4, 0x97b7, 0x9dd2, 0x0000,
+ /* 88 */ 0x0000, 0xf38f, 0x0000, 0x90f9, 0x9dd5, 0x0000, 0x0000, 0x91b0,
+ /* 90 */ 0x0000, 0x0000, 0x9dd6, 0x0000, 0xf390, 0x0000, 0x0000, 0x8af8,
+ /* 98 */ 0x0000, 0x9dd8, 0x0000, 0x9dd7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9dd9, 0x9dda, 0x8af9, 0x0000, 0x0000, 0x93fa, 0x9255, 0x8b8c,
+ /* a8 */ 0x8e7c, 0x9181, 0x0000, 0x0000, 0x8f7b, 0x88ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9ddb, 0xf392, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf393, 0x89a0, 0x9ddf, 0xf394, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e698xx - offset 0x036ef ***/
+
+ /* 80 */ 0xeb4b, 0x0000, 0x8d56, 0x9dde, 0xf395, 0x0000, 0x8da9, 0x8fb8,
+ /* 88 */ 0xf396, 0xeb4c, 0x9ddd, 0x0000, 0x8fb9, 0x0000, 0x96be, 0x8da8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x88d5, 0x90cc, 0xeb4d, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9de4, 0x0000, 0xeb4e, 0x90af,
+ /* a0 */ 0x8966, 0xf397, 0xeb50, 0x0000, 0xeb51, 0x8f74, 0x0000, 0x9686,
+ /* a8 */ 0x8df0, 0x0000, 0xf398, 0xeb52, 0x0000, 0x8fba, 0x0000, 0x90a5,
+ /* b0 */ 0xeb53, 0xeb54, 0x0000, 0xeb55, 0x9de3, 0x9de1, 0x9de2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xeb4f, 0x0000, 0x928b, 0x0000, 0x0000, 0x9e45,
+
+ /*** Three byte table, leaf: e699xx - offset 0x0372f ***/
+
+ /* 80 */ 0x0000, 0x9de8, 0x8e9e, 0x8d57, 0x9de6, 0xf399, 0x0000, 0x0000,
+ /* 88 */ 0xeb57, 0x9de7, 0x0000, 0x9057, 0xeb58, 0x0000, 0xf39b, 0x9de5,
+ /* 90 */ 0x0000, 0xf39a, 0x8e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0xf39e,
+ /* 98 */ 0x0000, 0xeb5a, 0xeb5b, 0xf39f, 0x0000, 0x9dea, 0x9de9, 0x9dee,
+ /* a0 */ 0x0000, 0xeb5c, 0x9def, 0xf3a0, 0x9deb, 0xeb5d, 0x8a41, 0x9dec,
+ /* a8 */ 0x9ded, 0x94d3, 0xf3a3, 0xf3a4, 0xf3a5, 0xf3a6, 0x9581, 0x8c69,
+ /* b0 */ 0x9df0, 0x0000, 0x0000, 0xeb5e, 0x90b0, 0x0000, 0x8fbb, 0xeb5f,
+ /* b8 */ 0xeb60, 0x0000, 0x9271, 0xf3a7, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e69axx - offset 0x0376f ***/
+
+ /* 80 */ 0xf3a8, 0x8bc5, 0x0000, 0x9df1, 0x9df5, 0x0000, 0x0000, 0x89c9,
+ /* 88 */ 0x9df2, 0x9df4, 0x0000, 0x0000, 0x0000, 0xeb61, 0x9df3, 0x0000,
+ /* 90 */ 0xf3a9, 0x8f8b, 0xf3aa, 0x0000, 0x0000, 0x0000, 0x9267, 0x88c3,
+ /* 98 */ 0x9df6, 0xf3ab, 0x0000, 0x0000, 0x0000, 0x9df7, 0x0000, 0x0000,
+ /* a0 */ 0xeb63, 0x0000, 0x92a8, 0x0000, 0x0000, 0x0000, 0x97ef, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e62, 0x0000, 0xf3ad, 0x95e9, 0x0000,
+ /* b0 */ 0x0000, 0xf3ae, 0xeb64, 0x0000, 0x965c, 0xf3af, 0x0000, 0x0000,
+ /* b8 */ 0x9e41, 0x9df9, 0x0000, 0xeb65, 0x9dfc, 0x0000, 0x9dfb, 0xf3b1,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x037af ***/
+
+ /* 80 */ 0x0000, 0x9df8, 0x0000, 0x0000, 0x9e40, 0x0000, 0xeb66, 0x93dc,
+ /* 88 */ 0xeb67, 0x9dfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e42, 0x0000,
+ /* 98 */ 0x0000, 0x8f8c, 0x9e43, 0xeb69, 0x976a, 0x9498, 0x0000, 0x0000,
+ /* a0 */ 0x9e44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e46, 0x0000,
+ /* a8 */ 0xeb6a, 0x9e47, 0x0000, 0x0000, 0xf3b3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9e48, 0x0000, 0x8bc8, 0x8967, 0x8d58, 0x9e49, 0x0000, 0x9e4a,
+ /* b8 */ 0x8f91, 0x9182, 0xeb6b, 0xeb56, 0x99d6, 0x915d, 0x915c, 0x91d6,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x037ef ***/
+
+ /* 80 */ 0x8dc5, 0xf3b5, 0x0000, 0x98f0, 0x0000, 0xf3b6, 0x0000, 0x0000,
+ /* 88 */ 0x8c8e, 0x974c, 0x0000, 0x95fc, 0x0000, 0x959e, 0x0000, 0x9e4b,
+ /* 90 */ 0x0000, 0x0000, 0xf3b7, 0xeb6c, 0x8df1, 0x92bd, 0x9e4c, 0x984e,
+ /* 98 */ 0x0000, 0xf3b9, 0x0000, 0x965d, 0x0000, 0x92a9, 0x9e4d, 0x8afa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e4e, 0x9e4f,
+ /* a8 */ 0x96d8, 0x0000, 0x96a2, 0x9696, 0x967b, 0x8e44, 0x9e51, 0x0000,
+ /* b0 */ 0x0000, 0x8ee9, 0x0000, 0xeb6e, 0x9670, 0x0000, 0x9e53, 0x9e56,
+ /* b8 */ 0x9e55, 0x0000, 0x8af7, 0x0000, 0x0000, 0x8b80, 0x0000, 0x9e52,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x0382f ***/
+
+ /* 80 */ 0x0000, 0x9e54, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e57, 0xeb70,
+ /* 88 */ 0xeb71, 0x9099, 0x0000, 0x0000, 0xf3bc, 0xf3bd, 0x979b, 0x88c7,
+ /* 90 */ 0x8dde, 0x91ba, 0x0000, 0x8edb, 0xf3be, 0x0000, 0x8ff1, 0x0000,
+ /* 98 */ 0x0000, 0x9e5a, 0x0000, 0x0000, 0x936d, 0xf3bf, 0x9e58, 0x91a9,
+ /* a0 */ 0x9e59, 0x8ff0, 0x96db, 0x9e5b, 0x9e5c, 0x9788, 0xeb6f, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9e61, 0x0000, 0x0000, 0x8d59, 0x0000, 0x9474,
+ /* b0 */ 0x9e5e, 0x938c, 0x9ddc, 0x9de0, 0xf3c3, 0x8b6e, 0xf3c4, 0x9466,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeb72, 0x9e60, 0x0000, 0x8fbc, 0x94c2,
+
+ /*** Three byte table, leaf: e69exx - offset 0x0386f ***/
+
+ /* 80 */ 0x0000, 0xeb73, 0x0000, 0x0000, 0x0000, 0x9e66, 0x0000, 0x94f8,
+ /* 88 */ 0x0000, 0x9e5d, 0x0000, 0x9e63, 0x9e62, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x90cd, 0x0000, 0xf3c6, 0xeb74, 0x0000, 0x968d, 0x0000, 0x97d1,
+ /* 98 */ 0xeb75, 0x0000, 0x9687, 0xeb76, 0x89ca, 0x8e7d, 0x0000, 0x0000,
+ /* a0 */ 0x9867, 0x9e65, 0x9095, 0x0000, 0x0000, 0x0000, 0x9e64, 0x0000,
+ /* a8 */ 0x0000, 0x9e5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ccd,
+ /* b0 */ 0xf3ca, 0x0000, 0xf3cb, 0x9e6b, 0x9e69, 0x0000, 0x89cb, 0x9e67,
+ /* b8 */ 0x9e6d, 0x9e73, 0x0000, 0xeb77, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x038af ***/
+
+ /* 80 */ 0xeb79, 0x91c6, 0x0000, 0xf3cc, 0x95bf, 0x0000, 0x9e75, 0x0000,
+ /* 88 */ 0xf3cd, 0x0000, 0x9541, 0x0000, 0x0000, 0x0000, 0x9e74, 0x9490,
+ /* 90 */ 0x965e, 0x8ab9, 0xf3ce, 0x90f5, 0x8f5f, 0x0000, 0x0000, 0xeb7a,
+ /* 98 */ 0x92d1, 0xf3cf, 0x974d, 0xf3d0, 0x0000, 0x9e70, 0x9e6f, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9e71, 0x0000, 0x9e6e, 0x0000, 0x0000, 0x9e76,
+ /* a8 */ 0x0000, 0x9e6c, 0x0000, 0x0000, 0x9e6a, 0x0000, 0x9e72, 0x9e68,
+ /* b0 */ 0xf3d1, 0x928c, 0x0000, 0x96f6, 0x8ec4, 0x8df2, 0x0000, 0xf3d2,
+ /* b8 */ 0x0000, 0xeb78, 0x0000, 0x8db8, 0xeb7b, 0x0000, 0x968f, 0x8a60,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x038ef ***/
+
+ /* 80 */ 0x0000, 0xeb7c, 0x92cc, 0x93c8, 0x8968, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf3c9, 0x0000, 0x0000, 0x90f0, 0x0000, 0x0000, 0x90b2, 0x8c49,
+ /* 98 */ 0xf3d6, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb7e, 0x9e78, 0xf3d7,
+ /* a0 */ 0x0000, 0x8d5a, 0x8a9c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9e7a, 0x8a94, 0x9e81, 0xeb80, 0xf3d8, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xeb81, 0x9e7d, 0xf3da, 0x90f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8a6a, 0x8daa, 0x0000, 0xf3db, 0x8a69, 0x8dcd, 0xf3dc, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x0392f ***/
+
+ /* 80 */ 0x9e7b, 0x8c85, 0x8c6a, 0x938d, 0xf3dd, 0xf3de, 0x9e79, 0x0000,
+ /* 88 */ 0x88c4, 0xf3df, 0x0000, 0x0000, 0xf3e0, 0x9e7c, 0x9e7e, 0x0000,
+ /* 90 */ 0x8bcb, 0x8c4b, 0xeb7d, 0x8aba, 0x8b6a, 0xf3e1, 0x0000, 0xf3e2,
+ /* 98 */ 0x0000, 0x9e82, 0x0000, 0xeb82, 0x8df7, 0x9691, 0x0000, 0x8e56,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9e83, 0x0000, 0x0000, 0x0000, 0x954f,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf3e4, 0x0000, 0x0000, 0xf3e5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeb83, 0x0000, 0x9e8f, 0xeb84, 0x89b1, 0x9e84,
+ /* b8 */ 0x0000, 0x0000, 0xf3e6, 0x0000, 0xf3e7, 0x0000, 0x9e95, 0x9e85,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x0396f ***/
+
+ /* 80 */ 0x0000, 0x97c0, 0xf3e8, 0x9e8c, 0x0000, 0x947e, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e94, 0x0000, 0x9e87,
+ /* 90 */ 0xf3e9, 0x0000, 0x0000, 0x88b2, 0x9e89, 0x0000, 0xf3ea, 0x8d5b,
+ /* 98 */ 0xf3ec, 0xf3ed, 0xf3ee, 0x9e8b, 0xf3ef, 0x9e8a, 0x0000, 0x9e86,
+ /* a0 */ 0x9e91, 0x0000, 0x8fbd, 0xeb86, 0x0000, 0xeb87, 0x9aeb, 0x8ce6,
+ /* a8 */ 0x979c, 0x0000, 0xf3f0, 0xf3f1, 0x0000, 0x9e88, 0x0000, 0x92f2,
+ /* b0 */ 0x8a42, 0x8dab, 0xeb88, 0x9e80, 0xf3f2, 0x9e90, 0x8a81, 0x0000,
+ /* b8 */ 0x0000, 0x9e8e, 0x9e92, 0xf3f3, 0x938e,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x039ac ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf3f8, 0x8afc, 0xf3f9, 0x9eb0, 0x0000,
+ /* 88 */ 0xeb89, 0x96c7, 0x9e97, 0x8afb, 0xf3fa, 0x9e9e, 0x0000, 0xf3fb,
+ /* 90 */ 0xeb8a, 0x0000, 0x965f, 0x0000, 0x9e9f, 0x9ea1, 0xf3fc, 0x9ea5,
+ /* 98 */ 0x9e99, 0xf440, 0x9249, 0x0000, 0x0000, 0x0000, 0x0000, 0x938f,
+ /* a0 */ 0x9ea9, 0x9e9c, 0x0000, 0x9ea6, 0xf441, 0xf442, 0x0000, 0x9ea0,
+ /* a8 */ 0xeb8b, 0x0000, 0x0000, 0x0000, 0xf443, 0xeb8c, 0x9058, 0x9eaa,
+ /* b0 */ 0xeb8d, 0xeb8e, 0x90b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xf444,
+ /* b8 */ 0x0000, 0x9ea8, 0x8abb, 0xf3f4, 0xeb8f, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x039ec ***/
+
+ /* 80 */ 0x986f, 0x9e96, 0x0000, 0xf445, 0x9ea4, 0x88d6, 0x0000, 0xf446,
+ /* 88 */ 0x9e98, 0x0000, 0xeb90, 0x96b8, 0x9e9d, 0x9041, 0x92c5, 0x9e93,
+ /* 90 */ 0x0000, 0x0000, 0x9ea3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x909a, 0x9ead, 0x8a91, 0x8c9f, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9eaf, 0x9e9a, 0x9eae, 0x0000, 0x9ea7, 0x9e9b, 0x0000,
+ /* a8 */ 0x9eab, 0x0000, 0x9eac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ebd, 0x0000, 0x0000, 0x0000, 0x93cc, 0xeb93, 0x9ea2, 0x0000,
+ /* b8 */ 0x0000, 0x9eb9, 0x0000, 0xf44a, 0x0000, 0x9ebb, 0x0000, 0x92d6,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x03a2c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xeb94, 0x0000, 0x0000, 0x0000, 0xf44c, 0x0000,
+ /* 88 */ 0x0000, 0xeb91, 0x976b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9596, 0x9eb6, 0x91c8, 0x0000, 0xeb95,
+ /* 98 */ 0x0000, 0x9ebc, 0x915e, 0x0000, 0x9eb3, 0x9ec0, 0x9ebf, 0x0000,
+ /* a0 */ 0x93ed, 0x9ebe, 0x93e8, 0xeb96, 0xeb97, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeb98, 0xf44d, 0x9ec2, 0x9eb5, 0xf44e, 0x8bc6, 0x9eb8, 0x8f7c,
+ /* b0 */ 0x0000, 0x0000, 0xf44f, 0x9480, 0x9eba, 0x8bc9, 0x0000, 0x9eb2,
+ /* b8 */ 0x9eb4, 0x9eb1, 0xf450, 0x0000, 0x984f, 0x8a79, 0x9eb7, 0xf451,
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x03a6c ***/
+
+ /* 80 */ 0xeb99, 0x9ec1, 0x8a54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x8de5, 0x0000, 0x0000, 0x0000, 0x897c, 0x0000,
+ /* 90 */ 0x0000, 0x9ed2, 0xf452, 0x0000, 0x9850, 0x9ed5, 0xf454, 0x0000,
+ /* 98 */ 0xf455, 0x0000, 0x0000, 0x9059, 0x9ed4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9ed3, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb9b, 0xf456, 0x9ed0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb9c, 0x9ec4, 0x0000,
+ /* b0 */ 0xf457, 0x9ee1, 0x9ec3, 0x0000, 0x9ed6, 0x0000, 0x0000, 0xf458,
+ /* b8 */ 0x0000, 0x0000, 0xf459, 0x9ece, 0xf45a, 0x0000, 0x9ec9, 0x9ec6,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x03aac ***/
+
+ /* 80 */ 0xf45b, 0x9ec7, 0x0000, 0x9ecf, 0x0000, 0x0000, 0x0000, 0xeaa0,
+ /* 88 */ 0x0000, 0x0000, 0x9ecc, 0x8d5c, 0x92c6, 0x9184, 0x9eca, 0xeb9d,
+ /* 90 */ 0x9ec5, 0xf45c, 0x0000, 0x9ec8, 0x0000, 0x0000, 0xf45d, 0x0000,
+ /* 98 */ 0x976c, 0x968a, 0x0000, 0x0000, 0x0000, 0x9ecd, 0x9ed7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xeba0, 0xf463, 0x0000, 0x0000, 0x0000, 0x9edf,
+ /* a8 */ 0x9ed8, 0xeba1, 0xeba2, 0x9ee5, 0x0000, 0x9ee3, 0xf464, 0xf465,
+ /* b0 */ 0x0000, 0x0000, 0x9ede, 0xf466, 0xf468, 0xeba3, 0xeba4, 0x0000,
+ /* b8 */ 0x0000, 0x9edd, 0x0000, 0x92ce, 0x0000, 0x9185, 0xf469, 0x9edb,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x03aec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9ed9, 0x0000, 0x0000, 0x9ee0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9ee6, 0x94f3, 0x9eec, 0x0000, 0x0000, 0xeba5,
+ /* 90 */ 0x0000, 0xf46a, 0x9ee7, 0x9eea, 0x9ee4, 0xeba6, 0x0000, 0x9294,
+ /* 98 */ 0x0000, 0x9557, 0xf46b, 0x9eda, 0x0000, 0xf46c, 0x9ee2, 0x8fbe,
+ /* a0 */ 0x0000, 0x96cd, 0x9ef6, 0x9ee9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8ca0, 0x89a1, 0x8a7e, 0x0000, 0x0000, 0x9ed1, 0x0000,
+ /* b0 */ 0xf460, 0x0000, 0xf46e, 0xf46f, 0xf470, 0x8fbf, 0x9eee, 0x0000,
+ /* b8 */ 0x9ef5, 0x8ef7, 0x8a92, 0xeba8, 0x0000, 0x924d, 0xeba9, 0xf471,
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x03b2c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9eeb, 0xebaa, 0xf472, 0x9ef0,
+ /* 88 */ 0x9ef4, 0xf473, 0x0000, 0x8bb4, 0x0000, 0x0000, 0xf475, 0x0000,
+ /* 90 */ 0xebab, 0x0000, 0xf476, 0x0000, 0x0000, 0x0000, 0xebac, 0x0000,
+ /* 98 */ 0x8b6b, 0x9ef2, 0x0000, 0xebad, 0x0000, 0x0000, 0x0000, 0x8b40,
+ /* a0 */ 0x0000, 0x93c9, 0x9ef1, 0x0000, 0xf477, 0x0000, 0x9ef3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xebae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9eed, 0xebaf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9eef, 0x0000, 0xf474, 0x0000, 0x0000, 0x0000, 0xf479, 0x8a80,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x03b6c ***/
+
+ /* 80 */ 0x9268, 0x0000, 0x0000, 0xf47a, 0x9efa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xebb1, 0x0000, 0xf47b, 0x0000, 0x9ef8, 0x8ce7, 0x0000,
+ /* 90 */ 0x9ef7, 0xf47d, 0x0000, 0x0000, 0xebb2, 0x0000, 0x0000, 0x9f40,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9e77, 0xebb3, 0xebb4, 0xf47e,
+ /* a0 */ 0x9ef9, 0xf480, 0x9efb, 0x9efc, 0x0000, 0xebb5, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9f4b, 0xf482, 0x9f47, 0x0000, 0x9e8d, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9f46, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9f45, 0x0000, 0x0000, 0x9f42, 0x0000, 0xf483, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x03bab ***/
+
+ /* 80 */ 0x0000, 0x9ee8, 0x9f44, 0x9f43, 0x0000, 0x0000, 0xf484, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf486, 0x9f49, 0x0000, 0x9845, 0xf485, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9f4c, 0x8bf9, 0xf487, 0xf488, 0x9f48, 0x9f4a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebb6, 0x0000, 0x0000, 0xebb7,
+ /* a8 */ 0x94a5, 0x0000, 0x9f4d, 0x0000, 0xf48b, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf48c, 0xf48d, 0xf48e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9f51, 0x9f4e, 0x0000, 0xf48f,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x03be9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9793, 0x9f4f, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9edc, 0xf491, 0x0000, 0x0000, 0x0000, 0xf492,
+ /* 90 */ 0xf493, 0xf494, 0x9f52, 0x0000, 0x0000, 0x0000, 0x9f53, 0xf496,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xebba, 0x0000, 0x8954, 0xebbb, 0x9f55,
+ /* a0 */ 0x8c87, 0x8e9f, 0x0000, 0x8bd3, 0x0000, 0x0000, 0x0000, 0x89a2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebbc, 0x0000, 0x0000, 0xf498,
+ /* b0 */ 0x0000, 0x0000, 0x977e, 0x0000, 0x0000, 0xebbd, 0x0000, 0x9f57,
+ /* b8 */ 0x9f56, 0x9f59, 0x8b5c, 0x0000, 0x0000, 0x8bd4, 0x8abc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x03c28 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9f5c, 0x0000, 0x0000, 0xebbe, 0x9f5b,
+ /* 88 */ 0x0000, 0x9f5d, 0xf499, 0x0000, 0x89cc, 0x0000, 0x9256, 0x0000,
+ /* 90 */ 0x9f5e, 0x0000, 0x0000, 0x8abd, 0x9f60, 0x0000, 0xebbf, 0x0000,
+ /* 98 */ 0xf49a, 0x9f5f, 0x0000, 0x9f61, 0x0000, 0x0000, 0x0000, 0x9f62,
+ /* a0 */ 0xebc0, 0x9f63, 0x8e7e, 0x90b3, 0x8d9f, 0xebc1, 0x9590, 0xebc2,
+ /* a8 */ 0x0000, 0x95e0, 0x9863, 0x0000, 0xf49b, 0x0000, 0x0000, 0x8e95,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8dce, 0x97f0, 0xf49c, 0x0000, 0xebc3,
+ /* b8 */ 0x9f64, 0x9f65, 0xf49d, 0x8e80, 0x0000, 0x0000, 0x0000, 0x9f66,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x03c68 ***/
+
+ /* 80 */ 0x9f67, 0xf49e, 0xebc4, 0x9f69, 0x9f68, 0x0000, 0x9677, 0x0000,
+ /* 88 */ 0x0000, 0x8f7d, 0x8eea, 0x8e63, 0x0000, 0x9f6a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f6c, 0x9042, 0x0000,
+ /* 98 */ 0x9f6b, 0x0000, 0x0000, 0xf49f, 0x0000, 0x0000, 0x9f6d, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9f6e, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xebc5, 0x9f6f, 0x9f70, 0x0000, 0xebc6, 0xf4a0, 0x9f71,
+ /* b0 */ 0x0000, 0x9f73, 0x9f72, 0x9f74, 0x89a3, 0x9269, 0x0000, 0x9f75,
+ /* b8 */ 0x0000, 0x0000, 0x8e45, 0x8a6b, 0x9f76, 0xf4a2, 0xf4a3, 0x9361,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x03ca8 ***/
+
+ /* 80 */ 0x9aca, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b42, 0x9f77, 0xf4a4,
+ /* 88 */ 0xf4a5, 0xf4a6, 0x0000, 0x9f78, 0x0000, 0x95ea, 0x9688, 0xebc8,
+ /* 90 */ 0x0000, 0x0000, 0x93c5, 0x9f79, 0x94e4, 0x0000, 0xebc9, 0xebca,
+ /* 98 */ 0x94f9, 0x0000, 0xf4a7, 0x96d1, 0x0000, 0x0000, 0x0000, 0x9f7a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a8, 0xf4a9,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9f7c, 0x9f7b, 0x0000, 0xf4aa, 0x9f7e,
+ /* b0 */ 0x0000, 0xf4ab, 0x0000, 0x9f7d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebcb,
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x03ce8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf4ac, 0x0000, 0x0000, 0xebcc, 0x0000, 0x0000,
+ /* 88 */ 0x9f81, 0x0000, 0xf4ad, 0x0000, 0x0000, 0x0000, 0xf4ae, 0x8e81,
+ /* 90 */ 0xebcd, 0x96af, 0x0000, 0x9f82, 0x9f83, 0x0000, 0x0000, 0x8b43,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9f84, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9f86, 0x9f85, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xebce, 0x9085, 0xf4af, 0xf4b0, 0x9558,
+ /* b8 */ 0x8969, 0x0000, 0xf4b1, 0x0000, 0x0000, 0x0000, 0x94c3, 0xf4b3,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x03d28 ***/
+
+ /* 80 */ 0x92f3, 0x8f60, 0x8b81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4b4, 0x94c4, 0x0000,
+ /* 90 */ 0x8eac, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f88, 0x0000, 0x8abe,
+ /* 98 */ 0x0000, 0xebcf, 0x8998, 0xf4b5, 0xebd0, 0x93f0, 0x9f87, 0x8d5d,
+ /* a0 */ 0x9272, 0x0000, 0x9f89, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4cd,
+ /* a8 */ 0x9f91, 0x0000, 0x9f8a, 0x0000, 0x0000, 0xf4b6, 0x0000, 0x0000,
+ /* b0 */ 0x91bf, 0x0000, 0x8b82, 0x9f92, 0xebd2, 0x0000, 0xebd3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8c88, 0x0000, 0x0000, 0x8b44, 0x9f90,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x03d67 ***/
+
+ /* 80 */ 0x0000, 0x9f8e, 0x9f8b, 0x9780, 0xf4b7, 0xebd4, 0xebd5, 0x0000,
+ /* 88 */ 0x92be, 0xf4b8, 0x0000, 0x0000, 0x93d7, 0x9f8c, 0x0000, 0x0000,
+ /* 90 */ 0x9f94, 0x0000, 0x9f93, 0x8c42, 0xf4ba, 0xf4bb, 0x89ab, 0xf4bc,
+ /* 98 */ 0xebd6, 0x8db9, 0x9f8d, 0x9f8f, 0xebd7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9676, 0x91f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xebd1, 0x9697, 0x0000, 0xf4bd, 0x9f9c, 0x0000,
+ /* b0 */ 0x0000, 0x9f9d, 0x0000, 0x89cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x95a6, 0x96fb, 0x9f9f, 0x8ea1, 0x8fc0, 0x9f98, 0x9f9e, 0x8988,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x03da7 ***/
+
+ /* 80 */ 0x0000, 0x8bb5, 0xf4be, 0x0000, 0x9f95, 0x9f9a, 0xebd9, 0x0000,
+ /* 88 */ 0x0000, 0x90f2, 0x9491, 0x0000, 0x94e5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf4bf, 0x0000, 0x0000, 0x9f97, 0xebda, 0x9640, 0xf4c1, 0x9f99,
+ /* 98 */ 0x0000, 0x9fa2, 0xf4c2, 0x9fa0, 0xf4c3, 0x9f9b, 0x0000, 0x0000,
+ /* a0 */ 0xebdb, 0x9641, 0x9467, 0x8b83, 0x0000, 0x9344, 0x0000, 0x0000,
+ /* a8 */ 0x928d, 0xf4c4, 0x9fa3, 0xebdc, 0xf4c5, 0xf4c6, 0xebdd, 0x9fa1,
+ /* b0 */ 0x91d7, 0x9f96, 0x0000, 0x896a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xebd8, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x03de7 ***/
+
+ /* 80 */ 0xf4c8, 0x0000, 0x0000, 0x0000, 0xebdf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf4c9, 0x976d, 0x9fae, 0x0000, 0xebe0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9fad, 0x0000, 0x0000, 0x0000, 0x0000, 0x90f4,
+ /* 98 */ 0x0000, 0x9faa, 0x0000, 0x978c, 0x0000, 0x0000, 0x93b4, 0x9fa4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ca, 0x92c3, 0xf4cb, 0xf4cc,
+ /* a8 */ 0x0000, 0x896b, 0x8d5e, 0x9fa7, 0x0000, 0x0000, 0xebe1, 0xf4ce,
+ /* b0 */ 0x0000, 0xebe2, 0x8f46, 0x9fac, 0xf4e3, 0x9fab, 0x9fa6, 0x0000,
+ /* b8 */ 0x9fa9, 0xebe3, 0x0000, 0x8a88, 0xf4cf, 0x9fa8, 0x9468, 0xebe4,
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x03e27 ***/
+
+ /* 80 */ 0x0000, 0x97ac, 0x0000, 0x0000, 0x8ff2, 0x90f3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xebe5, 0x9fb4, 0x9fb2, 0xf4d0, 0x956c, 0x0000, 0xf4d1, 0x0000,
+ /* a0 */ 0xf4d2, 0x0000, 0x0000, 0x9faf, 0x9fb1, 0xebe6, 0x8959, 0x0000,
+ /* a8 */ 0x0000, 0x8d5f, 0x9851, 0x0000, 0x8a5c, 0x0000, 0x9582, 0x0000,
+ /* b0 */ 0xf4d3, 0x0000, 0x0000, 0x0000, 0x9781, 0x0000, 0x0000, 0x8a43,
+ /* b8 */ 0x905a, 0x9fb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x03e67 ***/
+
+ /* 80 */ 0xf4d4, 0xf4d5, 0xebe8, 0x0000, 0x0000, 0x9fb8, 0x0000, 0xebe9,
+ /* 88 */ 0x8fc1, 0xebea, 0xf4d6, 0x0000, 0x974f, 0xf4d7, 0x9fb5, 0x0000,
+ /* 90 */ 0x0000, 0xf4d8, 0x0000, 0x9fb0, 0xebeb, 0x9fb6, 0x0000, 0x0000,
+ /* 98 */ 0xf4d9, 0x97dc, 0x0000, 0x9393, 0x93c0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xebec, 0xf4df, 0xebed, 0x0000, 0xf4e0, 0x8a55,
+ /* b0 */ 0x0000, 0x0000, 0x8974, 0x0000, 0xf4e1, 0x9fbc, 0x0000, 0x0000,
+ /* b8 */ 0x9fbf, 0x0000, 0x0000, 0x0000, 0x97c1, 0x0000, 0x0000, 0xebee,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x03ea7 ***/
+
+ /* 80 */ 0x9784, 0x0000, 0xf4e2, 0x0000, 0xebef, 0x9fc6, 0x9fc0, 0x9fbd,
+ /* 88 */ 0xf4e4, 0x0000, 0x0000, 0x97d2, 0x9fc3, 0x0000, 0xf4e5, 0xf4e6,
+ /* 90 */ 0xf4e7, 0x8f69, 0x9fc5, 0x0000, 0x0000, 0x9fca, 0xebf0, 0x0000,
+ /* 98 */ 0x9391, 0x9fc8, 0xebf1, 0xebf2, 0x0000, 0xebf3, 0x9fc2, 0xf4e8,
+ /* a0 */ 0x0000, 0x9257, 0x0000, 0x0000, 0x9fc9, 0x0000, 0x9fbe, 0x0000,
+ /* a8 */ 0x9fc4, 0xf4e9, 0x9fcb, 0x88fa, 0x9fc1, 0x0000, 0x9fcc, 0x0000,
+ /* b0 */ 0x0000, 0x905b, 0x0000, 0x8f7e, 0x0000, 0x95a3, 0xf4ea, 0x8dac,
+ /* b8 */ 0x0000, 0x9fb9, 0x9fc7, 0x9359, 0xebf4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x03ee4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90b4, 0x0000, 0x8a89,
+ /* 88 */ 0x8dcf, 0x8fc2, 0x9fbb, 0x8f61, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8c6b, 0x0000, 0x9fba, 0x0000, 0xf4db,
+ /* 98 */ 0x0000, 0x9fd0, 0x8f8d, 0x8cb8, 0x0000, 0x9fdf, 0xf4ec, 0x9fd9,
+ /* a0 */ 0x8b94, 0x936e, 0xf4ed, 0x9fd4, 0x9fdd, 0x88ad, 0x8951, 0xf4ee,
+ /* a8 */ 0x0000, 0x89b7, 0x0000, 0x9fd6, 0x91aa, 0x9fcd, 0x9fcf, 0x8d60,
+ /* b0 */ 0x0000, 0x0000, 0xf4f0, 0x0000, 0xebf6, 0x0000, 0xf4eb, 0x0000,
+ /* b8 */ 0x9fe0, 0x0000, 0x9fdb, 0x0000, 0xf4f1, 0x0000, 0x9fd3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x03f23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9fda, 0xebf7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf4f2, 0xf4f3, 0x96a9, 0xf4f4, 0xf4f5, 0x9fd8, 0x9fdc, 0xf4f6,
+ /* 90 */ 0x0000, 0xf4f7, 0x0000, 0xf4f8, 0xf4f9, 0x0000, 0x8cce, 0xf4fa,
+ /* 98 */ 0x8fc3, 0x0000, 0x0000, 0x9258, 0xebf8, 0x0000, 0xebf9, 0x9fd2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf4fb, 0x0000, 0x0000, 0x0000, 0x974e,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9fd5, 0x0000, 0x0000, 0x9fce, 0x9392,
+ /* b0 */ 0x0000, 0x0000, 0x9fd1, 0x0000, 0x0000, 0x0000, 0x9fd7, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9870, 0x8ebc,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x03f63 ***/
+
+ /* 80 */ 0x969e, 0x0000, 0x9fe1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x94ac, 0x0000, 0x0000, 0x9fed,
+ /* 90 */ 0x8cb9, 0x0000, 0x0000, 0xf540, 0x0000, 0x0000, 0x8f80, 0x0000,
+ /* 98 */ 0x9fe3, 0x0000, 0x0000, 0x0000, 0x97ad, 0x8d61, 0x0000, 0x9ff0,
+ /* a0 */ 0x0000, 0x0000, 0x88ec, 0x0000, 0x0000, 0x9fee, 0x0000, 0xf541,
+ /* a8 */ 0x0000, 0x0000, 0x9fe2, 0xebfa, 0x0000, 0x0000, 0x0000, 0x9fe8,
+ /* b0 */ 0x0000, 0xebfb, 0x9fea, 0x0000, 0xf542, 0x0000, 0x976e, 0x9fe5,
+ /* b8 */ 0x0000, 0x0000, 0x934d, 0x0000, 0x0000, 0x9fe7, 0x0000, 0xf543,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x03fa3 ***/
+
+ /* 80 */ 0x0000, 0xebfc, 0x9fef, 0xf544, 0x9fe9, 0x96c5, 0x0000, 0xec40,
+ /* 88 */ 0x0000, 0x9fe4, 0xf545, 0x8ea0, 0x9ffc, 0x0000, 0xec41, 0x0000,
+ /* 90 */ 0x0000, 0x8a8a, 0x0000, 0x9fe6, 0x9feb, 0x9fec, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf546, 0x0000, 0x0000, 0x0000, 0x91ea, 0x91d8, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf548, 0x9ff4, 0x0000, 0x0000, 0x9ffa,
+ /* b0 */ 0x0000, 0x0000, 0x9ff8, 0x0000, 0x9348, 0x0000, 0x0000, 0xe042,
+ /* b8 */ 0x9ff5, 0xf549, 0x0000, 0xf54a, 0x0000, 0x0000, 0x9ff6, 0x9fde,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x03fe3 ***/
+
+ /* 80 */ 0x0000, 0x8b99, 0x9559, 0x0000, 0x0000, 0x0000, 0x8ebd, 0x0000,
+ /* 88 */ 0x0000, 0x8d97, 0xf54b, 0x0000, 0xf54c, 0x0000, 0x0000, 0x9852,
+ /* 90 */ 0xec42, 0x9ff2, 0x0000, 0xe041, 0x8989, 0x9186, 0x0000, 0x0000,
+ /* 98 */ 0xf54d, 0x0000, 0xec43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9499, 0x0000, 0x8abf, 0x97f8, 0x0000, 0xf54e, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xec45, 0x969f, 0x92d0, 0x0000, 0x0000, 0xec46,
+ /* b0 */ 0x0000, 0x9ff9, 0x9ffb, 0xec47, 0x0000, 0xf547, 0xf54f, 0x0000,
+ /* b8 */ 0x9151, 0x0000, 0x0000, 0x0000, 0xf550, 0x0000, 0xe040, 0x9ff7,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x04023 ***/
+
+ /* 80 */ 0x0000, 0x9ff1, 0x0000, 0x0000, 0x0000, 0x8ac1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xec48, 0xf552, 0x0000, 0x8c89, 0x0000, 0x0000, 0xf553,
+ /* 98 */ 0xe04e, 0xec49, 0xf554, 0xe049, 0x90f6, 0x0000, 0xec4a, 0x8a83,
+ /* a0 */ 0xf555, 0xec4b, 0xec4c, 0x0000, 0x8f81, 0x0000, 0xe052, 0x0000,
+ /* a8 */ 0xf556, 0x0000, 0x0000, 0x0000, 0x0000, 0xe04b, 0x92aa, 0xe048,
+ /* b0 */ 0x92d7, 0x0000, 0x0000, 0x0000, 0xe06b, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe045, 0x0000, 0xe044, 0x0000, 0xe04d, 0xf558, 0xec4d, 0x0000,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x04063 ***/
+
+ /* 80 */ 0xe047, 0xe046, 0xe04c, 0x0000, 0x909f, 0x0000, 0xe043, 0x0000,
+ /* 88 */ 0xec4e, 0x0000, 0x0000, 0x0000, 0xec4f, 0xec50, 0xe04f, 0x0000,
+ /* 90 */ 0xf559, 0xe050, 0x0000, 0x0000, 0xec51, 0x0000, 0xf55a, 0x8ac0,
+ /* 98 */ 0xf557, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf55c,
+ /* a0 */ 0xec52, 0xe055, 0x0000, 0xe054, 0xe056, 0xf55d, 0x0000, 0xec53,
+ /* a8 */ 0x0000, 0x0000, 0xe059, 0x0000, 0x0000, 0x0000, 0x0000, 0xf55e,
+ /* b0 */ 0x0000, 0x9362, 0x0000, 0xe053, 0x0000, 0xf560, 0xec54, 0x0000,
+ /* b8 */ 0x0000, 0xe057, 0x0000, 0x0000, 0xec55, 0x0000, 0xf55b, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x040a3 ***/
+
+ /* 80 */ 0x8c83, 0x91f7, 0xe051, 0x945a, 0x0000, 0x0000, 0xe058, 0xec56,
+ /* 88 */ 0xf561, 0xf562, 0xec57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe05d, 0xe05b, 0x0000, 0x0000,
+ /* 98 */ 0xe05e, 0x0000, 0xf563, 0xe061, 0x0000, 0x0000, 0xf564, 0xe05a,
+ /* a0 */ 0x8d8a, 0x9447, 0x0000, 0x0000, 0x9fb7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf565, 0x0000, 0x9794, 0xe05c, 0x0000, 0xe060, 0x91f3,
+ /* b0 */ 0xec59, 0xe05f, 0x0000, 0xe04a, 0x0000, 0xec5a, 0xe889, 0x0000,
+ /* b8 */ 0x0000, 0xec58, 0xe064, 0x0000, 0xf567, 0x0000, 0xe068, 0x0000,
+
+ /*** Three byte table, leaf: e780xx - offset 0x040e3 ***/
+
+ /* 80 */ 0xf568, 0xe066, 0x0000, 0x0000, 0x0000, 0xec5b, 0xec5c, 0xf569,
+ /* 88 */ 0x0000, 0xe062, 0xf56a, 0xe063, 0x0000, 0x0000, 0x0000, 0xe067,
+ /* 90 */ 0x0000, 0xe065, 0x0000, 0x0000, 0x0000, 0x956d, 0x0000, 0x0000,
+ /* 98 */ 0xe06d, 0x0000, 0xe06a, 0xe069, 0x0000, 0xe06c, 0x93d2, 0xe06e,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf56b, 0x0000, 0x0000, 0x9295, 0x91eb,
+ /* a8 */ 0xec5d, 0x0000, 0x0000, 0x0000, 0x90a3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe06f, 0x0000, 0xe071, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf56d, 0xf56e, 0x0000, 0xf56f, 0x0000, 0xe070,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x04122 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf570, 0x0000, 0x0000, 0x0000, 0xf571,
+ /* 88 */ 0x0000, 0x0000, 0xec5e, 0xf572, 0x9ff3, 0x0000, 0xec61, 0x0000,
+ /* 90 */ 0x0000, 0xe072, 0x0000, 0x0000, 0xf574, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x93e5, 0x0000, 0x0000, 0x0000, 0x0000, 0xec5f, 0xec60, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe073, 0xec62, 0xf575, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf576, 0x0000, 0x89ce, 0xf577, 0x0000, 0xf578, 0x9394,
+ /* b0 */ 0x8a44, 0x0000, 0x0000, 0x0000, 0x0000, 0xec63, 0xf579, 0x0000,
+ /* b8 */ 0x8b84, 0x0000, 0x0000, 0x0000, 0x8edc, 0x8dd0, 0xf57a,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x04161 ***/
+
+ /* 80 */ 0x0000, 0xf57b, 0x0000, 0x0000, 0x0000, 0xec64, 0xf57c, 0x0000,
+ /* 88 */ 0x0000, 0x9846, 0x9086, 0x0000, 0x0000, 0x0000, 0x898a, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe075, 0x0000, 0x0000, 0xf57d, 0x0000, 0xf57e,
+ /* 98 */ 0x0000, 0xe074, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf582,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec65, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xec66, 0xe078, 0x9259, 0xe07b, 0xe076,
+ /* b0 */ 0x0000, 0xf583, 0x0000, 0xe07a, 0x0000, 0x0000, 0x0000, 0xec67,
+ /* b8 */ 0xe079, 0x935f, 0x88d7, 0xf580,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x0419d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x97f3, 0x0000, 0xf586, 0xe07d, 0x0000, 0x0000, 0x0000, 0x8947,
+ /* 90 */ 0x0000, 0xf587, 0x0000, 0xf588, 0xec68, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xec69, 0xe080, 0x0000, 0x0000, 0xf589, 0xe07e, 0x0000, 0xe07c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xec6a, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf585, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe077, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9642, 0x0000, 0x0000, 0x0000, 0xe082,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x041db ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf58a, 0xf58b, 0x0000, 0xf58c, 0xf58d,
+ /* 88 */ 0xf58e, 0xe081, 0x0000, 0x0000, 0xf58f, 0x0000, 0x0000, 0xec6b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x898b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe084, 0x95b0, 0x0000, 0xe083, 0x0000, 0xec6d, 0x0000,
+ /* a0 */ 0xec6e, 0x96b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xec6c, 0x0000, 0x0000, 0xec6f, 0xf591,
+ /* b0 */ 0xec70, 0xf592, 0x0000, 0x0000, 0x0000, 0x0000, 0x9152, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x04218 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec71, 0xec72,
+ /* 88 */ 0x0000, 0x97f9, 0xf594, 0x0000, 0xe08a, 0x0000, 0x90f7, 0x0000,
+ /* 90 */ 0xf593, 0xec73, 0xec75, 0xf595, 0x0000, 0xe086, 0xe08b, 0x0000,
+ /* 98 */ 0x0000, 0x898c, 0x0000, 0x0000, 0xec76, 0x0000, 0xf596, 0x0000,
+ /* a0 */ 0xec77, 0x0000, 0xe089, 0x0000, 0x9481, 0xe085, 0xe088, 0x8fc6,
+ /* a8 */ 0xec78, 0x94cf, 0x0000, 0x0000, 0xe08c, 0x0000, 0x8ecf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90f8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e786xx - offset 0x04258 ***/
+
+ /* 80 */ 0xf599, 0x0000, 0x0000, 0x0000, 0xe08f, 0xec7a, 0x0000, 0xec7b,
+ /* 88 */ 0xe087, 0x0000, 0x8c46, 0x0000, 0x0000, 0x0000, 0x0000, 0xe08d,
+ /* 90 */ 0x0000, 0x0000, 0xec7c, 0x0000, 0x976f, 0xe090, 0xf598, 0x0000,
+ /* 98 */ 0x0000, 0xeaa4, 0x0000, 0xf59a, 0x0000, 0x0000, 0x0000, 0x8f6e,
+ /* a0 */ 0xf59b, 0x0000, 0xf59c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe091, 0x0000, 0x0000, 0x0000, 0xe092, 0x0000, 0xf59d, 0xf59e,
+ /* b0 */ 0x0000, 0x944d, 0x0000, 0xf59f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe094, 0xec7e, 0x0000, 0x0000, 0x0000, 0xe095,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x04297 ***/
+
+ /* 80 */ 0x0000, 0xec7d, 0x0000, 0x9452, 0xec80, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9395, 0xe097, 0x0000, 0xf5a1, 0x0000, 0x0000, 0xe099, 0x0000,
+ /* 90 */ 0x97d3, 0x0000, 0xe096, 0xf5a2, 0xe098, 0x898d, 0x0000, 0xe093,
+ /* 98 */ 0x0000, 0xf5a3, 0x0000, 0x0000, 0xf5a4, 0x0000, 0x0000, 0x9a7a,
+ /* a0 */ 0xe09a, 0x0000, 0x0000, 0x0000, 0x0000, 0x9187, 0x8e57, 0xe09c,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe09b, 0x9043, 0x99d7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe09d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe09f, 0x0000, 0xe08e, 0xe09e, 0x0000, 0xec81, 0xe0a0,
+
+ /*** Three byte table, leaf: e788xx - offset 0x042d7 ***/
+
+ /* 80 */ 0xec82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949a, 0xf5a5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a1, 0x0000, 0x0000,
+ /* 90 */ 0xe0a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xec83, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0a3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe0a4, 0x0000, 0x92dc, 0xf5a8, 0xe0a6, 0xe0a5, 0x0000, 0x0000,
+ /* b0 */ 0xe0a7, 0x0000, 0xe0a8, 0x0000, 0xf5a9, 0x8edd, 0x9583, 0x0000,
+ /* b8 */ 0xf5aa, 0xf5ab, 0x96ea, 0xe0a9, 0xe0aa, 0x9175, 0x8ea2, 0xe0ab,
+
+ /*** Three byte table, leaf: e789xx - offset 0x04317 ***/
+
+ /* 80 */ 0xe0ac, 0x0000, 0xf5ad, 0x0000, 0x0000, 0x0000, 0xe0ad, 0x95d0,
+ /* 88 */ 0x94c5, 0x0000, 0x0000, 0xe0ae, 0x9476, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x92ab, 0xf5ae, 0x0000, 0xec84, 0xec85, 0xf5af,
+ /* 98 */ 0xe0af, 0x89e5, 0x0000, 0x8b8d, 0x0000, 0x96c4, 0x0000, 0x96b4,
+ /* a0 */ 0x0000, 0x89b2, 0x9853, 0xf5b0, 0x0000, 0x0000, 0x0000, 0x9671,
+ /* a8 */ 0x0000, 0x95a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b2, 0xf5b3,
+ /* b0 */ 0x0000, 0x0000, 0x90b5, 0x0000, 0xe0b0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5b4, 0x93c1, 0x0000, 0x0000, 0x0000, 0x8ca1, 0xe0b1, 0xf5b5,
+
+ /*** Three byte table, leaf: e78axx - offset 0x04357 ***/
+
+ /* 80 */ 0x8dd2, 0xe0b3, 0xe0b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0b4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec87, 0xf5b6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe0b5, 0x0000, 0x0000, 0x0000, 0xe0b6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xec88, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8b5d, 0x0000, 0xe0b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0b8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ca2, 0xf5b8, 0xf5b9, 0x94c6,
+ /* b0 */ 0xf5ba, 0xf5bb, 0xe0ba, 0x0000, 0x0000, 0x0000, 0x8ff3, 0x0000,
+ /* b8 */ 0x0000, 0xe0b9, 0x0000, 0x0000, 0x0000, 0x0000, 0xec89, 0x0000,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x04397 ***/
+
+ /* 80 */ 0xec8a, 0xf5bc, 0x8bb6, 0xe0bb, 0xe0bd, 0x0000, 0xe0bc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5be, 0x0000, 0xe0be, 0x0000,
+ /* 90 */ 0x8ccf, 0x0000, 0xe0bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be7,
+ /* 98 */ 0x0000, 0x915f, 0x0000, 0x8d9d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe0c1, 0xe0c2, 0xe0c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8eeb, 0x0000, 0x0000, 0x93c6, 0x8bb7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf5c1, 0x0000, 0x0000, 0x0000, 0xe0c4,
+ /* b8 */ 0x924b, 0xe0c3, 0xf5c2, 0xec8b, 0x9854, 0x9482,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x043d5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c3,
+ /* 88 */ 0x0000, 0x0000, 0xe0c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5c4, 0x0000, 0x0000, 0x0000, 0xe0c9, 0xe0c6,
+ /* 98 */ 0xf5c5, 0xf5c6, 0x0000, 0x96d2, 0xe0c8, 0xe0ca, 0x0000, 0x97c2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ce, 0x0000, 0xec8d,
+ /* a8 */ 0xec8e, 0xe0cd, 0x9296, 0x944c, 0xf5c9, 0x0000, 0x8ca3, 0xe0cc,
+ /* b0 */ 0x0000, 0xf5ca, 0x0000, 0xf5cb, 0xe0cb, 0x0000, 0x9750, 0x9751,
+ /* b8 */ 0x0000, 0xf5c8, 0x0000, 0x0000, 0x0000, 0xf5cc, 0xe0cf, 0x898e,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x04415 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8d96, 0x8e82, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d0, 0xe0d1,
+ /* 90 */ 0xec90, 0x0000, 0xf5cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8f62, 0x0000, 0x0000, 0xec91, 0x0000,
+ /* a8 */ 0xe0d5, 0x0000, 0xe0d4, 0xf5cf, 0xf5d0, 0x0000, 0xf5d2, 0xf5d3,
+ /* b0 */ 0xe0d6, 0xf5d4, 0x8a6c, 0x0000, 0x0000, 0xe0d8, 0x0000, 0xf5d5,
+ /* b8 */ 0xe0d7, 0x0000, 0xe0da, 0xe0d9, 0xec92, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x04454 ***/
+
+ /* 80 */ 0x0000, 0xf5d6, 0x0000, 0x0000, 0x8cba, 0xf5d7, 0x0000, 0x97a6,
+ /* 88 */ 0x0000, 0x8bca, 0xf5d8, 0x89a4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d9, 0xec93, 0x8be8, 0x0000,
+ /* 98 */ 0xf5da, 0x0000, 0x0000, 0x0000, 0xf5db, 0x0000, 0xf5dc, 0xec94,
+ /* a0 */ 0xec95, 0x0000, 0xec96, 0x0000, 0x0000, 0xf5dd, 0xec97, 0x0000,
+ /* a8 */ 0xf5de, 0x8adf, 0x0000, 0xec98, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x97e6, 0xe0dc, 0x0000, 0xf5df, 0x0000, 0xf5e0,
+ /* b8 */ 0x0000, 0xf5e1, 0x0000, 0xe0de, 0xf5e2, 0x0000, 0x0000, 0xf5e3,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x04494 ***/
+
+ /* 80 */ 0xe0df, 0x0000, 0x89cf, 0x0000, 0x0000, 0xf5e4, 0x0000, 0x0000,
+ /* 88 */ 0xe0db, 0xec99, 0x8e58, 0xf5e5, 0x0000, 0x92bf, 0xe0dd, 0xec9a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec9b, 0x0000,
+ /* 98 */ 0x0000, 0xec9c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e2, 0x0000,
+ /* a0 */ 0x8eec, 0xf5e6, 0x0000, 0xec9d, 0x0000, 0xe0e0, 0x0000, 0xf5e7,
+ /* a8 */ 0x0000, 0xec9e, 0x8c5d, 0x0000, 0x0000, 0x94c7, 0xe0e1, 0x0000,
+ /* b0 */ 0x0000, 0xe0fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe0e7, 0xf5e8, 0xf5ea, 0x0000, 0x0000, 0x0000, 0x8cbb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x044d3 ***/
+
+ /* 80 */ 0x0000, 0xf5eb, 0x0000, 0x8b85, 0x0000, 0xe0e4, 0x979d, 0xec9f,
+ /* 88 */ 0x0000, 0x97ae, 0xeca0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf5e9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeca1, 0xeca2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x91f4, 0x0000, 0xf5ec, 0xe0e6, 0xeca4, 0x0000,
+ /* a8 */ 0xeca5, 0x0000, 0xeca6, 0xeca7, 0xeca8, 0x0000, 0xeca9, 0xecaa,
+ /* b0 */ 0xecab, 0xf5ed, 0xe0e8, 0x97d4, 0x8bd5, 0x94fa, 0x9469, 0x0000,
+ /* b8 */ 0x0000, 0xf5ee, 0xe0e9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0eb,
+
+ /*** Three byte table, leaf: e791xx - offset 0x04513 ***/
+
+ /* 80 */ 0xf5f0, 0xe0ee, 0x0000, 0xf5f1, 0xecac, 0x0000, 0xecad, 0xecae,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xecaf, 0x0000, 0xf5f2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5f3, 0xf5ef, 0x0000, 0xe0ea, 0x0000, 0xecb0,
+ /* 98 */ 0x0000, 0xe0ed, 0x8ce8, 0x896c, 0xe0ef, 0xf5f4, 0x9090, 0xe0ec,
+ /* a0 */ 0x97da, 0x0000, 0xecb1, 0xe0f2, 0xeaa2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe0f0, 0xe0f3, 0xecb2, 0x0000, 0xecb3, 0x0000, 0xe0e5,
+ /* b0 */ 0xe0f1, 0xf5f5, 0x0000, 0x8dba, 0x0000, 0x0000, 0xe0f4, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x04552 ***/
+
+ /* 80 */ 0x0000, 0xf5f6, 0x0000, 0x979e, 0x0000, 0xf5f7, 0xecb4, 0xecb5,
+ /* 88 */ 0xf5f8, 0xecb6, 0x0000, 0xe0f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xecbb, 0x0000, 0xf5fa, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5fb,
+ /* 98 */ 0xecb7, 0xf5fc, 0x0000, 0x0000, 0xecb8, 0x0000, 0xe0f7, 0xecb9,
+ /* a0 */ 0xf640, 0xf641, 0xe0e3, 0xecba, 0x0000, 0xf642, 0xecbc, 0xe0f8,
+ /* a8 */ 0xecbd, 0xecbe, 0xf643, 0xf644, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8ac2, 0x0000, 0x0000, 0x0000, 0x0000, 0xecbf, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf645, 0xf647, 0xf646, 0x0000, 0x8ea3, 0x0000, 0xecc0,
+
+ /*** Three byte table, leaf: e793xx - offset 0x04592 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xecc1, 0xecc2, 0xe0f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fa,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fb, 0x0000, 0xf648, 0x0000,
+ /* 98 */ 0xf649, 0x0000, 0xecc3, 0x0000, 0x895a, 0x0000, 0xf64a, 0x0000,
+ /* a0 */ 0xe140, 0x0000, 0x955a, 0xe141, 0x0000, 0x0000, 0x8aa2, 0xe142,
+ /* a8 */ 0x0000, 0xe143, 0x0000, 0xf64c, 0x0000, 0x0000, 0xe144, 0xf64b,
+ /* b0 */ 0xe146, 0xe147, 0xe145, 0x0000, 0x0000, 0x0000, 0x9572, 0xe149,
+ /* b8 */ 0xe148, 0x0000, 0xf64e, 0x0000, 0x0000, 0x0000, 0x0000, 0xecc4,
+
+ /*** Three byte table, leaf: e794xx - offset 0x045d2 ***/
+
+ /* 80 */ 0x0000, 0xecc5, 0x0000, 0xe14b, 0xe14a, 0xe14c, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe14d, 0xe14f, 0xe14e, 0x0000,
+ /* 90 */ 0x0000, 0x8d99, 0x0000, 0xe151, 0x0000, 0xe150, 0x0000, 0xecc6,
+ /* 98 */ 0x8ac3, 0x0000, 0x9072, 0x0000, 0x935b, 0x0000, 0xe152, 0x90b6,
+ /* a0 */ 0xf650, 0x0000, 0x0000, 0x8e59, 0xf651, 0x8999, 0xe153, 0x0000,
+ /* a8 */ 0x9770, 0x0000, 0xf652, 0x95e1, 0xe154, 0x0000, 0x0000, 0xecc7,
+ /* b0 */ 0x9363, 0x9752, 0x8d62, 0x905c, 0x0000, 0x0000, 0x0000, 0x926a,
+ /* b8 */ 0x99b2, 0x0000, 0x92ac, 0x89e6, 0xe155, 0xf655, 0xf656, 0x0000,
+
+ /*** Three byte table, leaf: e795xx - offset 0x04612 ***/
+
+ /* 80 */ 0xf657, 0x0000, 0x0000, 0x0000, 0xe156, 0x0000, 0xe15b, 0x0000,
+ /* 88 */ 0xf658, 0xe159, 0xe158, 0x9dc0, 0x8a45, 0xe157, 0xf659, 0x88d8,
+ /* 90 */ 0xf65a, 0x94a8, 0xf65b, 0x0000, 0x94c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x97af, 0xe15c, 0xe15a, 0x927b, 0x90a4, 0x0000, 0x0000,
+ /* a0 */ 0x94a9, 0x0000, 0x954c, 0x0000, 0xe15e, 0x97aa, 0x8c6c, 0xe15f,
+ /* a8 */ 0x0000, 0xe15d, 0x94d4, 0xe160, 0xf65c, 0xe161, 0x0000, 0xecc8,
+ /* b0 */ 0x88d9, 0xf65e, 0xf65d, 0x8ff4, 0xe166, 0x0000, 0xe163, 0x93eb,
+ /* b8 */ 0xe162, 0xecc9, 0xf65f, 0x0000, 0x0000, 0xf660, 0xf661, 0x8b45,
+
+ /*** Three byte table, leaf: e796xx - offset 0x04652 ***/
+
+ /* 80 */ 0x0000, 0xf662, 0xe169, 0x0000, 0x0000, 0x0000, 0xe164, 0xe165,
+ /* 88 */ 0x0000, 0xe168, 0xe167, 0x9544, 0xf664, 0x0000, 0x9161, 0x9160,
+ /* 90 */ 0x0000, 0x8b5e, 0xecca, 0x0000, 0xe16a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe16b, 0x0000, 0x0000, 0xe16c, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf666, 0xe16e, 0x0000, 0xe16d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf668, 0xe176, 0x94e6, 0xe170, 0x0000, 0xe172, 0x0000, 0xf669,
+ /* b8 */ 0xe174, 0x905d, 0x0000, 0x0000, 0xe175, 0xe173, 0x8ebe, 0xf66a,
+
+ /*** Three byte table, leaf: e797xx - offset 0x04692 ***/
+
+ /* 80 */ 0xf66b, 0x0000, 0xe16f, 0xe171, 0x0000, 0x9561, 0xf66c, 0x8fc7,
+ /* 88 */ 0x0000, 0x0000, 0xe178, 0x0000, 0x0000, 0xe177, 0xeccc, 0xf66d,
+ /* 90 */ 0x0000, 0x0000, 0xe179, 0xf66e, 0x8ea4, 0x8dad, 0x0000, 0x0000,
+ /* 98 */ 0x9397, 0xe17a, 0x0000, 0x92c9, 0x0000, 0xf66f, 0xe17c, 0xf670,
+ /* a0 */ 0xf671, 0x0000, 0x979f, 0xe17b, 0xeccd, 0x0000, 0x0000, 0xf672,
+ /* a8 */ 0x0000, 0x9189, 0x0000, 0x0000, 0xf673, 0x0000, 0xf674, 0x0000,
+ /* b0 */ 0xe182, 0xf675, 0xe184, 0xe185, 0x9273, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf676, 0xe183, 0x0000, 0xe180, 0x0000, 0xe17d, 0xe17e,
+
+ /*** Three byte table, leaf: e798xx - offset 0x046d2 ***/
+
+ /* 80 */ 0xecce, 0xe181, 0xeccf, 0xf677, 0x0000, 0x0000, 0x0000, 0xf679,
+ /* 88 */ 0xecd0, 0xe188, 0x0000, 0xe186, 0x0000, 0xe187, 0x0000, 0xf67a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf67d, 0x0000, 0xecd1, 0xecd2, 0x0000,
+ /* 98 */ 0xf678, 0xecd3, 0x0000, 0xf67e, 0xf680, 0x0000, 0xecd4, 0xe189,
+ /* a0 */ 0xe18b, 0xe18c, 0xe18d, 0x0000, 0xe18e, 0xf682, 0xeffb, 0xe18a,
+ /* a8 */ 0xf683, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd5, 0x0000, 0x0000,
+ /* b0 */ 0xe190, 0x0000, 0x0000, 0xf685, 0xe18f, 0xecd6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe191, 0xf684, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x04711 ***/
+
+ /* 80 */ 0x0000, 0xf688, 0x97c3, 0xecd7, 0x0000, 0x0000, 0xe194, 0xe192,
+ /* 88 */ 0xe193, 0xf68a, 0x0000, 0xecd8, 0x8ae0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x96fc, 0x0000, 0x0000, 0xf68b, 0x95c8, 0x0000,
+ /* 98 */ 0xe196, 0x0000, 0x0000, 0x0000, 0xe195, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe197, 0xe198, 0x0000, 0xecd9, 0xecda, 0x0000, 0xe19c,
+ /* a8 */ 0xe199, 0xe19a, 0xe19b, 0x0000, 0xe19d, 0xecdb, 0xf68d, 0xecdc,
+ /* b0 */ 0xe19e, 0xecdd, 0xe19f, 0x0000, 0x0000, 0x0000, 0xe1a0, 0x0000,
+ /* b8 */ 0xe1a1, 0x0000, 0x94ad, 0x936f, 0xe1a2, 0x9492, 0x9553, 0x0000,
+
+ /*** Three byte table, leaf: e79axx - offset 0x04751 ***/
+
+ /* 80 */ 0xe1a3, 0xecde, 0x0000, 0xe1a4, 0x9349, 0x0000, 0x8a46, 0x8d63,
+ /* 88 */ 0xe1a5, 0x0000, 0x0000, 0xe1a6, 0x0000, 0x0000, 0xe1a7, 0x0000,
+ /* 90 */ 0x8e48, 0x0000, 0x0000, 0xe1a9, 0x0000, 0xf68e, 0xe1a8, 0x0000,
+ /* 98 */ 0x0000, 0xe1aa, 0xe1ab, 0xecdf, 0xf68f, 0xece0, 0xece1, 0x0000,
+ /* a0 */ 0xf691, 0xf690, 0x0000, 0x0000, 0x0000, 0x0000, 0xece2, 0xf692,
+ /* a8 */ 0xf693, 0x0000, 0xece3, 0x0000, 0x0000, 0x0000, 0x94e7, 0xf694,
+ /* b0 */ 0xe1ac, 0x0000, 0x0000, 0x0000, 0xe1ad, 0x0000, 0xece4, 0xea89,
+ /* b8 */ 0xe1ae, 0xe1af, 0xe1b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e4d,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x04791 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1b1, 0x9475, 0x0000, 0xece5, 0x967e, 0x0000,
+ /* 88 */ 0x896d, 0xf696, 0x8976, 0x0000, 0xece6, 0xe1b2, 0xece7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1b4, 0x0000, 0xece8, 0x0000, 0xe1b3, 0x9390,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x90b7, 0x9f58, 0x0000, 0xe1b5, 0x96bf,
+ /* a0 */ 0x0000, 0xe1b6, 0x0000, 0x8ac4, 0x94d5, 0xe1b7, 0xece9, 0xe1b8,
+ /* a8 */ 0xf698, 0x0000, 0xe1b9, 0x0000, 0xf699, 0x0000, 0x96da, 0x0000,
+ /* b0 */ 0x0000, 0xecea, 0x96d3, 0x0000, 0x92bc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x918a, 0x0000, 0x0000, 0xe1bb, 0xeceb, 0x0000, 0x8f82,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x047d0 ***/
+
+ /* 80 */ 0x0000, 0x8fc8, 0x0000, 0x0000, 0xe1be, 0x0000, 0x0000, 0xe1bd,
+ /* 88 */ 0xe1bc, 0x94fb, 0xecec, 0x8ac5, 0x8ca7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf69b,
+ /* 98 */ 0x0000, 0xeced, 0xf69c, 0xe1c4, 0x0000, 0x0000, 0xe1c1, 0x905e,
+ /* a0 */ 0x96b0, 0x0000, 0x0000, 0x0000, 0xe1c0, 0xe1c2, 0xe1c3, 0x0000,
+ /* a8 */ 0x0000, 0xe1bf, 0x0000, 0x0000, 0x0000, 0xf69d, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecee, 0xf69e, 0xecef, 0xe1c5,
+ /* b8 */ 0xe1c6, 0x0000, 0x92ad, 0x0000, 0x8ae1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x04810 ***/
+
+ /* 80 */ 0x9285, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecf0, 0xe1c7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecf1, 0xecf2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf6a3, 0x0000, 0xe1c8, 0xe1cb, 0xecf3, 0x0000, 0x0000, 0xecf4,
+ /* a0 */ 0xf6a4, 0x9087, 0xecf5, 0x93c2, 0x0000, 0xe1cc, 0x9672, 0x0000,
+ /* a8 */ 0xe1c9, 0x0000, 0xf6a5, 0xe1ca, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf6a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1cf, 0xecf6, 0x0000, 0xf6a8, 0xf6a9, 0xe1ce, 0xe1cd,
+
+ /*** Three byte table, leaf: e79exx - offset 0x04850 ***/
+
+ /* 80 */ 0xecf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe1d1, 0x0000, 0x0000, 0xe1d0, 0x0000,
+ /* 90 */ 0x0000, 0xe1d2, 0x0000, 0x0000, 0xecf8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf6ac, 0x0000, 0x0000, 0x0000, 0xe1d4, 0xf6ad,
+ /* a0 */ 0xe1d3, 0x0000, 0xf6ae, 0x0000, 0xf6af, 0x95cb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf6b0, 0xecf9, 0x0000, 0x8f75, 0x97c4, 0x0000, 0x0000,
+ /* b0 */ 0xe1d5, 0x0000, 0x0000, 0x93b5, 0x0000, 0x0000, 0xe1d6, 0x0000,
+ /* b8 */ 0x0000, 0xe1d7, 0x0000, 0xe1db, 0xe1d9, 0xe1da, 0x0000, 0xe1d8,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x04890 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1dc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1dd, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1de,
+ /* 98 */ 0x0000, 0x0000, 0xe1df, 0x96b5, 0xe1e0, 0x0000, 0xf6b1, 0xf6b2,
+ /* a0 */ 0xecfa, 0x0000, 0x96ee, 0xe1e1, 0xf6b3, 0x926d, 0xf6b4, 0x948a,
+ /* a8 */ 0x0000, 0x8be9, 0xf6b5, 0x0000, 0xf6b6, 0x925a, 0xe1e2, 0x8bb8,
+ /* b0 */ 0xf6b8, 0x0000, 0x0000, 0x90ce, 0xf6b9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf6ba, 0xe1e3, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x048ce ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8dbb, 0x0000, 0x0000, 0xf6bc, 0xf6bd, 0x0000,
+ /* 88 */ 0x0000, 0xf6be, 0x0000, 0x0000, 0xe1e4, 0xf6bf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1e5, 0x0000, 0x8ca4, 0x8dd3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf6c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1e7, 0xf6c1, 0x0000, 0x0000, 0x0000, 0x9375, 0x8dd4, 0x8b6d,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c2, 0xecfb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9643, 0x0000, 0x946a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9376, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d7b,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x0490e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xed40, 0x0000, 0xe1e9, 0x0000, 0xf6c3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed41, 0xed42,
+ /* 90 */ 0x0000, 0xed43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xed44, 0x0000, 0xf6c5, 0x97b0, 0x8d64, 0x0000, 0xed45, 0x8ca5,
+ /* b0 */ 0x0000, 0x0000, 0x94a1, 0x0000, 0xe1eb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ed, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0494d ***/
+
+ /* 80 */ 0x0000, 0x8ce9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ec, 0x92f4,
+ /* 88 */ 0x0000, 0x0000, 0xf6c7, 0x0000, 0xe1ef, 0x8a56, 0xe1ea, 0x0000,
+ /* 90 */ 0x0000, 0x94e8, 0x0000, 0x894f, 0xf6c8, 0x8dea, 0x0000, 0x9871,
+ /* 98 */ 0x0000, 0x0000, 0xe1ee, 0x0000, 0x0000, 0xf6ca, 0xf6cb, 0xf6cc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe1f0, 0xf6c9, 0x0000, 0x0000, 0x95c9,
+ /* a8 */ 0x0000, 0x90d7, 0xe1f2, 0x0000, 0x0000, 0xed49, 0x0000, 0xe1f3,
+ /* b0 */ 0xed47, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8a6d, 0xf6cd, 0xe1f9, 0x0000, 0xe1f8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0498c ***/
+
+ /* 80 */ 0x0000, 0x8ea5, 0x0000, 0x0000, 0x0000, 0xe1fa, 0xe1f5, 0x0000,
+ /* 88 */ 0xf6ce, 0x0000, 0xe1fb, 0xe1f6, 0xf6cf, 0x0000, 0xf6d0, 0x0000,
+ /* 90 */ 0x94d6, 0xe1f4, 0x0000, 0x0000, 0xe1f7, 0xf6d1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf6d2, 0xf6d3, 0x0000, 0x0000, 0xed4a, 0x0000, 0xf6d4, 0xe240,
+ /* a8 */ 0x9681, 0x0000, 0x0000, 0x0000, 0xe1fc, 0x0000, 0x0000, 0x88e9,
+ /* b0 */ 0x0000, 0x0000, 0xed4b, 0x0000, 0xe243, 0x0000, 0x0000, 0xed4d,
+ /* b8 */ 0x0000, 0xf6d5, 0xf6d6, 0xf6d7, 0x0000, 0xe242, 0xf6d8, 0x0000,
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x049cc ***/
+
+ /* 80 */ 0xed4c, 0x8fca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe244,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9162, 0x0000,
+ /* 90 */ 0xf6da, 0xe246, 0xe245, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe247, 0x0000, 0xf6db, 0xed4e, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6dd, 0xe1e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe1e8, 0xe249, 0xe248, 0x0000, 0xed4f, 0x0000,
+ /* b0 */ 0xf6dc, 0xed50, 0x0000, 0x0000, 0xed51, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8ea6, 0xf6de, 0x97e7, 0x0000, 0x8ed0, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x04a0c ***/
+
+ /* 80 */ 0xe24a, 0x8c56, 0x0000, 0x0000, 0x0000, 0xed54, 0xed55, 0x8b5f,
+ /* 88 */ 0x8b46, 0x8e83, 0xf6df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9753, 0x0000, 0x0000, 0xe250, 0x0000, 0xe24f, 0x9163, 0xe24c,
+ /* 98 */ 0xf6e0, 0x0000, 0xe24e, 0xf6e1, 0xed59, 0x8f6a, 0x905f, 0xe24d,
+ /* a0 */ 0xe24b, 0x0000, 0x9449, 0x0000, 0x0000, 0x8fcb, 0x0000, 0xf6e3,
+ /* a8 */ 0x955b, 0x0000, 0x0000, 0x0000, 0x0000, 0x8dd5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf6e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9398,
+ /* b8 */ 0x0000, 0xed5d, 0xe251, 0x0000, 0x0000, 0x0000, 0x0000, 0xe252,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x04a4c ***/
+
+ /* 80 */ 0xe268, 0x8bd6, 0x0000, 0x0000, 0x985c, 0x9154, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe253, 0x0000, 0x0000, 0x89d0, 0x92f5, 0x959f,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e5, 0xf6e6, 0xf6e7, 0x0000,
+ /* 98 */ 0xed61, 0x0000, 0x0000, 0xf6e8, 0x0000, 0xe254, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b9a, 0xe255,
+ /* a8 */ 0x0000, 0xf6ea, 0xe257, 0x0000, 0x0000, 0x0000, 0xe258, 0x0000,
+ /* b0 */ 0x9448, 0xed62, 0x0000, 0xe259, 0xf6eb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xed63, 0xe25a, 0xe25b, 0xf6ec, 0x0000, 0x8bd7, 0x89d1, 0x93c3,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x04a8c ***/
+
+ /* 80 */ 0x8f47, 0x8e84, 0xf6ed, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ee,
+ /* 88 */ 0xed64, 0xe25c, 0xed65, 0x8f48, 0xf6ef, 0xf6f0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x89c8, 0x9562, 0x0000, 0xed67, 0xe25d, 0xf6f1, 0x0000,
+ /* 98 */ 0x94e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed68, 0x9164,
+ /* a0 */ 0x0000, 0xe260, 0x0000, 0xe261, 0x9489, 0x0000, 0x9060, 0xe25e,
+ /* a8 */ 0x0000, 0x9281, 0x0000, 0xed69, 0xe25f, 0xed6a, 0x0000, 0x0000,
+ /* b0 */ 0x8fcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x88da, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x04acc ***/
+
+ /* 80 */ 0x8b48, 0x0000, 0x0000, 0xed6b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe262, 0x0000, 0xf6f6, 0x92f6, 0x0000, 0xe263, 0x90c5, 0x0000,
+ /* 90 */ 0x0000, 0xf6f7, 0x0000, 0x0000, 0x96ab, 0xf6f8, 0x0000, 0x9542,
+ /* 98 */ 0xe264, 0xe265, 0x9274, 0xf6f9, 0x97c5, 0x0000, 0xf6fa, 0xe267,
+ /* a0 */ 0xe266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fc, 0x8eed, 0x0000,
+ /* b0 */ 0x0000, 0xe269, 0x88ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xe26c,
+ /* b8 */ 0xf740, 0xed6d, 0x0000, 0xe26a, 0x89d2, 0x8c6d, 0xe26b, 0x8d65,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x04b0c ***/
+
+ /* 80 */ 0x8d92, 0x0000, 0x95e4, 0xe26d, 0x0000, 0x0000, 0x9673, 0xf741,
+ /* 88 */ 0x0000, 0xe26f, 0x0000, 0x0000, 0xf742, 0x90cf, 0x896e, 0x89b8,
+ /* 90 */ 0x88aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf743, 0xe26e,
+ /* 98 */ 0x0000, 0xf744, 0x0000, 0x0000, 0xf745, 0xed6e, 0x0000, 0xf746,
+ /* a0 */ 0xf747, 0xe270, 0xe271, 0x8ff5, 0x0000, 0x0000, 0x0000, 0xf748,
+ /* a8 */ 0x0000, 0xe272, 0xf749, 0x8a6e, 0x0000, 0xed6f, 0x0000, 0x0000,
+ /* b0 */ 0xe274, 0x0000, 0x0000, 0x0000, 0x8c8a, 0xf74a, 0x8b86, 0x0000,
+ /* b8 */ 0xf74b, 0xe275, 0x8bf3, 0x0000, 0x0000, 0xe276, 0x0000, 0x90fa,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x04b4c ***/
+
+ /* 80 */ 0x0000, 0x93cb, 0xf74c, 0x90de, 0x8df3, 0xed71, 0x0000, 0x0000,
+ /* 88 */ 0xe277, 0x0000, 0xf74d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf74e, 0x0000, 0x9282, 0x918b, 0x0000, 0xe279, 0xe27b, 0xe278,
+ /* 98 */ 0xe27a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c41,
+ /* a0 */ 0xed72, 0x0000, 0x0000, 0xf74f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe27c, 0x8c45, 0x0000, 0xf750, 0x0000, 0x8b87, 0x9771,
+ /* b0 */ 0xe27e, 0x0000, 0x0000, 0xed74, 0x0000, 0x0000, 0xe280, 0x0000,
+ /* b8 */ 0x0000, 0xf753, 0x894d, 0xed75, 0xf754, 0x0000, 0xf755, 0xe283,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x04b8c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8a96, 0xe282, 0xe281, 0x0000, 0xe285,
+ /* 88 */ 0xe27d, 0x0000, 0xe286, 0x97a7, 0xf757, 0xe287, 0xed76, 0xe288,
+ /* 90 */ 0x0000, 0xf758, 0x9af2, 0xe28a, 0x0000, 0xe289, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe28b, 0xe28c, 0x0000, 0x97b3, 0xe28d, 0x0000, 0xe8ed,
+ /* a0 */ 0x8fcd, 0xe28e, 0xe28f, 0x8f76, 0x0000, 0x93b6, 0xe290, 0xf759,
+ /* a8 */ 0xf75a, 0x0000, 0x9247, 0xed77, 0x0000, 0xe291, 0x0000, 0x925b,
+ /* b0 */ 0xe292, 0x0000, 0x0000, 0x0000, 0xf75b, 0x0000, 0x8ba3, 0x0000,
+ /* b8 */ 0x995e, 0x927c, 0x8eb1, 0x0000, 0x0000, 0xed78, 0x0000, 0x8ac6,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x04bcc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe293, 0x0000, 0xe2a0, 0x0000, 0xe296, 0xf75e,
+ /* 88 */ 0x8b88, 0x0000, 0xe295, 0xe2a2, 0x0000, 0x0000, 0x0000, 0xe294,
+ /* 90 */ 0x0000, 0x8fce, 0xed79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe298, 0xe299, 0x0000, 0x934a, 0x0000, 0x0000, 0xe29a, 0x0000,
+ /* a0 */ 0x8a7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x9079, 0x9584, 0xf761,
+ /* a8 */ 0xe29c, 0x0000, 0xf762, 0x0000, 0x91e6, 0xed7a, 0xf763, 0xf764,
+ /* b0 */ 0x0000, 0xf765, 0x0000, 0xe297, 0x0000, 0xe29b, 0xe29d, 0x0000,
+ /* b8 */ 0x0000, 0x8df9, 0x0000, 0xed7b, 0x0000, 0xf760, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x04c0b ***/
+
+ /* 80 */ 0x0000, 0xf769, 0x0000, 0x0000, 0x0000, 0xe2a4, 0x954d, 0xed7c,
+ /* 88 */ 0x94a4, 0x9399, 0x0000, 0x8bd8, 0xe2a3, 0xe2a1, 0xed7d, 0x94b3,
+ /* 90 */ 0xe29e, 0x927d, 0x939b, 0x0000, 0x939a, 0xf76b, 0x8df4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b6, 0x0000, 0x0000,
+ /* a0 */ 0xed7e, 0x0000, 0x0000, 0x0000, 0xf76d, 0xe2a6, 0xf76e, 0xe2a8,
+ /* a8 */ 0x0000, 0xf76f, 0x0000, 0x0000, 0xe2ab, 0xed80, 0xe2ac, 0xed81,
+ /* b0 */ 0xe2a9, 0xe2aa, 0xed82, 0xf770, 0xe2a7, 0xe2a5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf76c, 0xe29f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf768,
+
+ /*** Three byte table, leaf: e7aexx - offset 0x04c4b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95cd, 0x89d3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe2b3, 0x0000, 0xe2b0, 0x0000, 0xe2b5,
+ /* 90 */ 0xf773, 0xf774, 0xe2b4, 0x0000, 0x9493, 0x96a5, 0x0000, 0x8e5a,
+ /* 98 */ 0xe2ae, 0xe2b7, 0xe2b2, 0xf775, 0xe2b1, 0xe2ad, 0xed83, 0xe2af,
+ /* a0 */ 0x0000, 0x8ac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x925c, 0x0000, 0x0000, 0x90fb, 0x0000, 0xf777,
+ /* b0 */ 0x0000, 0x94a0, 0x0000, 0x0000, 0xe2bc, 0xf778, 0x0000, 0x0000,
+ /* b8 */ 0x94a2, 0x0000, 0x0000, 0x0000, 0xf779, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x04c8b ***/
+
+ /* 80 */ 0x90df, 0xe2b9, 0x0000, 0x0000, 0x94cd, 0xf77a, 0xe2bd, 0x95d1,
+ /* 88 */ 0x0000, 0x927a, 0xf77b, 0xe2b8, 0xe2ba, 0x0000, 0x0000, 0xe2bb,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf77e, 0x0000, 0xf780, 0xed85,
+ /* 98 */ 0x0000, 0xed86, 0xf781, 0x0000, 0x0000, 0xe2be, 0x0000, 0x0000,
+ /* a0 */ 0x8ec2, 0x0000, 0x0000, 0x0000, 0x93c4, 0xe2c3, 0xe2c2, 0x0000,
+ /* a8 */ 0x0000, 0xe2bf, 0xf782, 0x0000, 0x0000, 0x9855, 0x0000, 0x0000,
+ /* b0 */ 0xf783, 0x0000, 0x0000, 0xe2c8, 0x0000, 0x0000, 0xe2cc, 0xe2c9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x04ccb ***/
+
+ /* 80 */ 0xe2c5, 0xed87, 0x0000, 0xf784, 0x0000, 0x0000, 0x0000, 0xe2c6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf785, 0x0000, 0xe2cb, 0xf786, 0xf787,
+ /* 90 */ 0x0000, 0xe2c0, 0x99d3, 0xe2c7, 0xe2c1, 0x0000, 0x0000, 0xe2ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed89, 0xe2d0,
+ /* a0 */ 0xed8a, 0x8ac8, 0x0000, 0xe2cd, 0x0000, 0x0000, 0xf788, 0xe2ce,
+ /* a8 */ 0x0000, 0x0000, 0xe2cf, 0xe2d2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xed88, 0x0000, 0xed8b, 0x0000, 0x0000, 0xed8c, 0xe2d1,
+ /* b8 */ 0x94f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d3, 0x97fa, 0x95eb,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x04d0b ***/
+
+ /* 80 */ 0xe2d8, 0x0000, 0x0000, 0xe2d5, 0x0000, 0xf789, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf78a, 0x0000, 0xe2d4, 0x90d0, 0x0000, 0xe2d7,
+ /* 90 */ 0xe2d9, 0xf78b, 0x0000, 0x0000, 0xe2d6, 0x0000, 0xe2dd, 0xf78c,
+ /* 98 */ 0xe2da, 0xed8f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf78d, 0xe2db,
+ /* a0 */ 0xe2c4, 0xf78e, 0x0000, 0x0000, 0xe2dc, 0xe2de, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf78f, 0x0000, 0x0000, 0xe2df, 0xed90, 0xf790, 0xf791,
+ /* b0 */ 0xf792, 0x0000, 0x0000, 0x95c4, 0x0000, 0xe2e0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xed91, 0x0000, 0x0000, 0x0000, 0x0000, 0x96e0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x04d4a ***/
+
+ /* 80 */ 0x0000, 0x8bcc, 0x8c48, 0xe2e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x95b2, 0x0000, 0x9088, 0x0000, 0x96ae, 0x0000, 0xed92,
+ /* 90 */ 0xe2e2, 0x0000, 0x97b1, 0x0000, 0xed93, 0x9494, 0x0000, 0x9165,
+ /* 98 */ 0x9453, 0x0000, 0x0000, 0x8f6c, 0x0000, 0x0000, 0x0000, 0x88be,
+ /* a0 */ 0xed94, 0xe2e7, 0xe2e5, 0x0000, 0xe2e3, 0x8a9f, 0xf796, 0x8fcf,
+ /* a8 */ 0xe2e8, 0x0000, 0x0000, 0xe2e6, 0x0000, 0xe2e4, 0xe2ec, 0x0000,
+ /* b0 */ 0x0000, 0xe2eb, 0xe2ea, 0xe2e9, 0x0000, 0x0000, 0xf798, 0xf799,
+ /* b8 */ 0x0000, 0xe2ed, 0x0000, 0x0000, 0xed95, 0xe2ee, 0x90b8, 0xf79a,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x04d8a ***/
+
+ /* 80 */ 0xe2ef, 0x0000, 0xe2f1, 0x0000, 0xf79c, 0xe2f0, 0x0000, 0x0000,
+ /* 88 */ 0xf79e, 0x0000, 0x8cd0, 0x0000, 0x0000, 0xf79f, 0x9157, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe2f3, 0x0000, 0x0000, 0xed96, 0x939c, 0xf7a1,
+ /* 98 */ 0xe2f2, 0xed97, 0x0000, 0x0000, 0xe2f4, 0xed98, 0x95b3, 0x918c,
+ /* a0 */ 0x8d66, 0x0000, 0xe2f5, 0x0000, 0x0000, 0x0000, 0xf7a3, 0x97c6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf7a4, 0x0000, 0x0000, 0x0000, 0xe2f7,
+ /* b0 */ 0x0000, 0x0000, 0xe2f8, 0x0000, 0xe2f9, 0xf7a6, 0xe2fa, 0x0000,
+ /* b8 */ 0x8e85, 0x0000, 0xe2fb, 0x8c6e, 0x0000, 0x0000, 0x8b8a, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x04dca ***/
+
+ /* 80 */ 0x8b49, 0x0000, 0xe340, 0xf7a7, 0x96f1, 0x8d67, 0xe2fc, 0xed99,
+ /* 88 */ 0xed9a, 0xf7a8, 0xe343, 0x96e4, 0x0000, 0x945b, 0x0000, 0x0000,
+ /* 90 */ 0x9552, 0x0000, 0xf7aa, 0xed9b, 0x8f83, 0xe342, 0x0000, 0x8ed1,
+ /* 98 */ 0x8d68, 0x8e86, 0x8b89, 0x95b4, 0xe341, 0xed9c, 0xf7ab, 0x0000,
+ /* a0 */ 0x9166, 0x9661, 0x8df5, 0xed9d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e87, 0x92db, 0x0000, 0xe346, 0x97dd,
+ /* b0 */ 0x8dd7, 0xed9e, 0xe347, 0x9061, 0x0000, 0xe349, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8fd0, 0x8dae, 0x0000, 0x0000, 0xf7ae, 0xf7af, 0xe348,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x04e0a ***/
+
+ /* 80 */ 0xf7b0, 0xed9f, 0x8f49, 0x8cbc, 0x9167, 0xe344, 0xe34a, 0xf7b1,
+ /* 88 */ 0xeda0, 0x0000, 0x0000, 0xe345, 0x8c6f, 0x0000, 0xe34d, 0xe351,
+ /* 90 */ 0x8c8b, 0x0000, 0x0000, 0xeda1, 0x0000, 0x0000, 0xe34c, 0x0000,
+ /* 98 */ 0x0000, 0xf7b5, 0xf7b6, 0xe355, 0xeda2, 0x0000, 0x8d69, 0x0000,
+ /* a0 */ 0x0000, 0x978d, 0x88ba, 0xe352, 0x0000, 0x0000, 0x8b8b, 0x0000,
+ /* a8 */ 0xe34f, 0x0000, 0xf7b7, 0x0000, 0x0000, 0x0000, 0xe350, 0x0000,
+ /* b0 */ 0xf7b8, 0x939d, 0xe34e, 0xe34b, 0x0000, 0x8a47, 0x90e2, 0x0000,
+ /* b8 */ 0x0000, 0x8ca6, 0xeda3, 0x0000, 0x0000, 0xe357, 0x0000, 0xf7ba,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x04e4a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeda4, 0x0000, 0x0000, 0xf7bc, 0x0000,
+ /* 88 */ 0xf7bd, 0xe354, 0x0000, 0xeda5, 0xf7be, 0x0000, 0x0000, 0xe356,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe353, 0x0000, 0x0000, 0x0000, 0xf7bf,
+ /* 98 */ 0x0000, 0x8c70, 0x91b1, 0xe358, 0x918e, 0xf7c1, 0x0000, 0xe365,
+ /* a0 */ 0xeda6, 0x0000, 0xe361, 0xe35b, 0x0000, 0x0000, 0xeda7, 0xf7c2,
+ /* a8 */ 0x0000, 0x0000, 0xf7c3, 0xe35f, 0x8ef8, 0x88db, 0xe35a, 0xe362,
+ /* b0 */ 0xe366, 0x8d6a, 0x96d4, 0x0000, 0x92d4, 0xe35c, 0xf7c4, 0xf7c5,
+ /* b8 */ 0xe364, 0x0000, 0xe359, 0x925d, 0x0000, 0xe35e, 0x88bb, 0x96c8,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x04e8a ***/
+
+ /* 80 */ 0xf7c6, 0x0000, 0xeda8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe35d,
+ /* 88 */ 0x0000, 0x0000, 0x8bd9, 0x94ea, 0xeda9, 0x0000, 0x0000, 0x918d,
+ /* 90 */ 0x0000, 0x97ce, 0x8f8f, 0x0000, 0x0000, 0xe38e, 0xedaa, 0xf7c7,
+ /* 98 */ 0xe367, 0xf7c8, 0x90fc, 0x0000, 0xe363, 0xe368, 0xe36a, 0x0000,
+ /* a0 */ 0x92f7, 0xe36d, 0x0000, 0xedab, 0xe369, 0x0000, 0xf7c9, 0x0000,
+ /* a8 */ 0x95d2, 0x8ac9, 0x0000, 0x0000, 0x96c9, 0x0000, 0x0000, 0x88dc,
+ /* b0 */ 0x0000, 0xf7ca, 0xe36c, 0x0000, 0x97fb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7cb, 0x0000, 0xe36b, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x04ec9 ***/
+
+ /* 80 */ 0x0000, 0x898f, 0x0000, 0x0000, 0x93ea, 0xe36e, 0x0000, 0x0000,
+ /* 88 */ 0xedae, 0xe375, 0xe36f, 0xe376, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf7cf, 0xedaf, 0xe372, 0x0000, 0x0000, 0xedb0, 0x0000, 0xf7d0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x949b, 0x0000, 0xf7d1, 0x8ec8, 0xe374,
+ /* a0 */ 0xf7d2, 0xe371, 0xe377, 0xe370, 0x0000, 0x0000, 0x8f63, 0xf7d3,
+ /* a8 */ 0xedad, 0x0000, 0x0000, 0x9644, 0xf7d4, 0x0000, 0x8f6b, 0x0000,
+ /* b0 */ 0x0000, 0xe373, 0xe380, 0x0000, 0x0000, 0xe37b, 0x0000, 0xe37e,
+ /* b8 */ 0x0000, 0xe37c, 0xe381, 0xe37a, 0x0000, 0xe360, 0x90d1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x04f08 ***/
+
+ /* 80 */ 0x0000, 0x94c9, 0x0000, 0xe37d, 0x0000, 0xf7d5, 0xe378, 0xedb2,
+ /* 88 */ 0x0000, 0x0000, 0x9140, 0x8c71, 0x0000, 0x8f4a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xedb3, 0x0000, 0x9044, 0x9155, 0xe384, 0x0000,
+ /* 98 */ 0x0000, 0xe386, 0xe387, 0x0000, 0x0000, 0xe383, 0xe385, 0x0000,
+ /* a0 */ 0x0000, 0xedb4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe379, 0xe382,
+ /* a8 */ 0x0000, 0xe38a, 0xe389, 0xeffc, 0x0000, 0x969a, 0x0000, 0x0000,
+ /* b0 */ 0x8c4a, 0x0000, 0x0000, 0xf7d6, 0x0000, 0xf7d7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe388, 0x0000, 0xe38c, 0xe38b, 0xe38f, 0xf7d8, 0xe391,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x04f48 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e5b, 0xe38d, 0x0000, 0x0000, 0xf7d9, 0xf7da,
+ /* 88 */ 0xe392, 0xe393, 0xedb5, 0x0000, 0xe394, 0xedb6, 0xe39a, 0x935a,
+ /* 90 */ 0xe396, 0xf7dc, 0xe395, 0xe397, 0xe398, 0x0000, 0xe399, 0x0000,
+ /* 98 */ 0xf7dd, 0x0000, 0xf7de, 0xe39b, 0xe39c,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x04f65 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aca, 0x0000,
+ /* b8 */ 0xe39d, 0x0000, 0xe39e, 0xf7e1, 0xf7e0, 0x0000, 0xf7e2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x04fa4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf7e3, 0xf7e4, 0xe39f, 0x0000, 0xedb7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a0, 0xe3a1, 0xe3a2, 0xf7e5,
+ /* 90 */ 0xe3a3, 0xe3a4, 0xf7e8, 0x0000, 0xe3a6, 0xe3a5, 0x0000, 0x0000,
+ /* 98 */ 0xe3a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a8,
+ /* a0 */ 0xe3a9, 0xf7ea, 0x0000, 0xf7eb, 0xf7ec, 0x0000, 0x0000, 0xe3ac,
+ /* a8 */ 0xe3aa, 0xe3ab, 0x8ddf, 0x8c72, 0x0000, 0xf7ed, 0x9275, 0x0000,
+ /* b0 */ 0x94b1, 0x0000, 0x8f90, 0x0000, 0x0000, 0x946c, 0x0000, 0x94eb,
+ /* b8 */ 0xe3ad, 0x9ceb, 0x0000, 0x0000, 0x0000, 0xf7ee, 0xf7ef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x04fe3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe3ae, 0xe3b0, 0x0000, 0x9785, 0xe3af, 0xe3b2,
+ /* 88 */ 0xe3b1, 0x0000, 0x9772, 0x0000, 0xe3b3, 0x0000, 0x94fc, 0x0000,
+ /* 90 */ 0xf7f1, 0xedb9, 0x0000, 0x0000, 0xe3b4, 0x0000, 0xf7f4, 0xedba,
+ /* 98 */ 0x0000, 0x0000, 0xe3b7, 0x0000, 0xf7f5, 0xe3b6, 0xe3b5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3b8, 0x8c51, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9141, 0x8b60, 0x0000, 0x0000, 0x0000, 0xf7f6, 0xe3bc, 0xe3b9,
+ /* b0 */ 0x0000, 0x0000, 0xe3ba, 0x0000, 0x0000, 0x0000, 0xe3bd, 0x0000,
+ /* b8 */ 0xe3be, 0xe3bb, 0x0000, 0x0000, 0x0000, 0x8948, 0x0000, 0xedbb,
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x05023 ***/
+
+ /* 80 */ 0x0000, 0x89a5, 0x0000, 0xf7f8, 0x0000, 0xe3c0, 0xe3c1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe3c2, 0x0000, 0x9782, 0x0000, 0xedbc, 0xf7f9,
+ /* 90 */ 0x0000, 0x0000, 0x8f4b, 0x0000, 0xe3c4, 0xe3c3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xedbd, 0x0000, 0x0000, 0x0000, 0xedbe,
+ /* a0 */ 0x9089, 0xe3c5, 0x0000, 0xf7fa, 0x0000, 0xf7fb, 0xe3c6, 0x0000,
+ /* a8 */ 0x0000, 0xe3c7, 0x0000, 0x8ae3, 0xedbf, 0x0000, 0xedc0, 0xf7fc,
+ /* b0 */ 0x8acb, 0x0000, 0xf840, 0xe3c8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe3c9, 0xedc1, 0x967c, 0x9783, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x05063 ***/
+
+ /* 80 */ 0x9773, 0x9856, 0xf841, 0x8d6c, 0xe3cc, 0x8ed2, 0xe3cb, 0x0000,
+ /* 88 */ 0xf843, 0x0000, 0xf842, 0xe3cd, 0x8ea7, 0x0000, 0xf844, 0x0000,
+ /* 90 */ 0x91cf, 0xf845, 0xe3ce, 0x0000, 0xedc3, 0x8d6b, 0xf846, 0x96d5,
+ /* 98 */ 0xe3cf, 0xe3d0, 0x0000, 0x0000, 0xe3d1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe3d2, 0x0000, 0x0000, 0xf847, 0x0000, 0xedc4, 0x0000,
+ /* a8 */ 0xe3d3, 0x0000, 0x0000, 0x0000, 0xf848, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf849, 0x0000, 0x0000, 0x8ea8, 0x0000, 0xedc5, 0x96eb, 0xedc6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe3d5, 0xedc7, 0x925e, 0x0000, 0xe3d4,
+
+ /*** Three byte table, leaf: e881xx - offset 0x050a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf84a, 0x0000, 0x0000, 0xe3d7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe3d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3d8, 0x0000, 0x0000, 0x0000, 0x90b9, 0x0000,
+ /* 98 */ 0xe3d9, 0x0000, 0xe3da, 0x0000, 0x0000, 0x0000, 0x95b7, 0xe3db,
+ /* a0 */ 0x0000, 0x918f, 0xe3dc, 0x0000, 0x0000, 0x0000, 0xf84b, 0x0000,
+ /* a8 */ 0xe3dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97fc,
+ /* b0 */ 0xe3e0, 0xf84c, 0xe3df, 0xe3de, 0x92ae, 0xf84d, 0xe3e1, 0x9045,
+ /* b8 */ 0x0000, 0xe3e2, 0x0000, 0xf84e, 0x0000, 0xe3e3, 0x9857, 0xe3e4,
+
+ /*** Three byte table, leaf: e882xx - offset 0x050e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3e5, 0xe3e7, 0xe3e6, 0x94a3,
+ /* 88 */ 0x0000, 0x93f7, 0x0000, 0x985d, 0x94a7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe3e9, 0x0000, 0x0000, 0x8fd1, 0x0000,
+ /* 98 */ 0x9549, 0xf84f, 0xe3ea, 0xe3e8, 0xf850, 0x8acc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8cd2, 0x8e88, 0x0000, 0xf851, 0x94ec, 0x0000, 0xf852,
+ /* a8 */ 0x0000, 0x8ca8, 0x9662, 0x0000, 0xe3ed, 0xe3eb, 0x0000, 0x8d6d,
+ /* b0 */ 0x0000, 0x8d6e, 0x88e7, 0x0000, 0x8de6, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf853, 0x0000, 0x9478, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x05120 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x88dd, 0xe3f2, 0xf855, 0x925f, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xedc8, 0x0000, 0x9477, 0x0000, 0x91d9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf856, 0xe3f4, 0xedc9,
+ /* 98 */ 0xf857, 0xe3f0, 0xe3f3, 0xe3ee, 0x0000, 0xe3f1, 0x9645, 0x0000,
+ /* a0 */ 0xedca, 0x8cd3, 0x0000, 0x0000, 0x88fb, 0xe3ef, 0xf858, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3f6,
+ /* b0 */ 0x0000, 0xe3f7, 0x0000, 0xedcb, 0x93b7, 0xf85b, 0x0000, 0x0000,
+ /* b8 */ 0x8bb9, 0x0000, 0x0000, 0xf85c, 0xe445, 0x945c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x0515e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e89, 0x0000, 0x0000, 0x8bba, 0x90c6, 0x9865,
+ /* 88 */ 0x96ac, 0xe3f5, 0x90d2, 0x0000, 0x0000, 0xf85a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf85f, 0x0000,
+ /* 98 */ 0xedcc, 0x0000, 0x8b72, 0xe3f8, 0x0000, 0x0000, 0xf860, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3fa, 0xf862, 0x0000, 0x0000, 0xf863,
+ /* a8 */ 0x0000, 0xe3f9, 0x0000, 0x0000, 0xf864, 0x0000, 0x0000, 0xe3fb,
+ /* b0 */ 0x0000, 0x9245, 0x0000, 0x945d, 0x0000, 0xf85e, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x92af, 0x0000, 0x0000, 0x0000, 0xf866, 0xe442,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x0519d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe441, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xedcd, 0xe3fc, 0x0000, 0x0000, 0x9074, 0x0000,
+ /* 90 */ 0x9585, 0xe444, 0x0000, 0xe443, 0x8d6f, 0x9872, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe454,
+ /* a0 */ 0xedce, 0x0000, 0x0000, 0x0000, 0x0000, 0xe448, 0xe449, 0xedcf,
+ /* a8 */ 0xedd0, 0xf868, 0x0000, 0x8eee, 0x0000, 0xedd1, 0xe447, 0x0000,
+ /* b0 */ 0x8d98, 0xe446, 0x0000, 0x0000, 0xe44a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x92b0, 0x95a0, 0x9142, 0x0000, 0x0000, 0x0000, 0x0000, 0x91da,
+
+ /*** Three byte table, leaf: e886xx - offset 0x051dd ***/
+
+ /* 80 */ 0xe44e, 0xf86a, 0xe44f, 0xe44b, 0xf86c, 0xf86d, 0x0000, 0x0000,
+ /* 88 */ 0xe44c, 0x0000, 0xe44d, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d70,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe455, 0x0000, 0xe451, 0x0000, 0x0000,
+ /* 98 */ 0xf86f, 0x0000, 0x9586, 0x0000, 0x968c, 0x9547, 0x0000, 0x0000,
+ /* a0 */ 0xe450, 0x0000, 0x0000, 0xe453, 0xe452, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9663, 0xe456, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe457, 0x0000, 0xf870, 0x9156, 0x0000, 0xe458, 0x0000, 0x0000,
+ /* b8 */ 0xe45a, 0x0000, 0xe45e, 0xedd2, 0x0000, 0xe45b, 0xe459, 0x945e,
+
+ /*** Three byte table, leaf: e887xx - offset 0x0521d ***/
+
+ /* 80 */ 0xe45c, 0xf871, 0xe45d, 0xf872, 0x0000, 0x0000, 0x89b0, 0x0000,
+ /* 88 */ 0xe464, 0xe45f, 0xedd3, 0x0000, 0x0000, 0xe460, 0x0000, 0xedd4,
+ /* 90 */ 0x0000, 0xe461, 0x0000, 0x919f, 0x0000, 0x0000, 0xf873, 0xedd5,
+ /* 98 */ 0xe463, 0xe462, 0xe465, 0xf874, 0x0000, 0x0000, 0x0000, 0xe466,
+ /* a0 */ 0xe467, 0x0000, 0x0000, 0x9062, 0xf876, 0x89e7, 0x0000, 0xe468,
+ /* a8 */ 0x97d5, 0x0000, 0x8ea9, 0x0000, 0xf878, 0x8f4c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8e8a, 0x9276, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe469, 0xe46a, 0x8950, 0xf87a, 0xe46b, 0xf87b,
+
+ /*** Three byte table, leaf: e888xx - offset 0x0525d ***/
+
+ /* 80 */ 0x0000, 0xe46c, 0xe46d, 0x0000, 0xf87d, 0xe46e, 0x0000, 0xe46f,
+ /* 88 */ 0x8bbb, 0x9da8, 0xe470, 0x0000, 0x90e3, 0xe471, 0x8ec9, 0x0000,
+ /* 90 */ 0xe472, 0x0000, 0x98ae, 0x0000, 0x0000, 0x0000, 0xe473, 0x95dc,
+ /* 98 */ 0x8ada, 0xf880, 0x0000, 0x9143, 0x8f77, 0x0000, 0x9591, 0x8f4d,
+ /* a0 */ 0x0000, 0xf881, 0xf882, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe474, 0x8d71, 0xe475, 0x94ca, 0x0000, 0xe484, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf884, 0xe477, 0xf885, 0x91c7, 0x9495, 0x8cbd,
+ /* b8 */ 0xe476, 0x9144, 0x0000, 0x0000, 0xf886, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x0529d ***/
+
+ /* 80 */ 0xe478, 0x0000, 0x0000, 0x0000, 0x0000, 0xf889, 0xf887, 0x92f8,
+ /* 88 */ 0x0000, 0xf888, 0x0000, 0xf88b, 0x0000, 0x0000, 0x0000, 0xf88d,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf88f,
+ /* 98 */ 0xe47a, 0xe479, 0xe47c, 0x0000, 0xf891, 0xe47b, 0x0000, 0xe47d,
+ /* a0 */ 0xedd9, 0x0000, 0xe480, 0xf892, 0xe47e, 0x0000, 0x8acd, 0x0000,
+ /* a8 */ 0xe481, 0x0000, 0xe482, 0xe483, 0x0000, 0x0000, 0x8daf, 0x97c7,
+ /* b0 */ 0x0000, 0xe485, 0x9046, 0x0000, 0xedda, 0x0000, 0x8990, 0xe486,
+ /* b8 */ 0xe487, 0xf896, 0x0000, 0x0000, 0x0000, 0xf898, 0xe488, 0xf899,
+
+ /*** Three byte table, leaf: e88axx - offset 0x052dd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf89a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf89b, 0x88f0, 0x0000, 0xe489, 0xeddc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe48a, 0xf89c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9587, 0x0000, 0x0000, 0x0000, 0x8ec5, 0x0000, 0xe48c,
+ /* a0 */ 0x0000, 0xeddd, 0x0000, 0xedde, 0xeddf, 0x8a48, 0x88b0, 0xf89d,
+ /* a8 */ 0xf89e, 0xede0, 0x0000, 0xe48b, 0xe48e, 0x946d, 0xede1, 0x9063,
+ /* b0 */ 0x0000, 0x89d4, 0xf89f, 0x9646, 0xf8a0, 0x0000, 0x0000, 0xede2,
+ /* b8 */ 0x8c7c, 0x8bda, 0xf8a1, 0xe48d, 0xf8a2, 0x89e8, 0xede3, 0xede4,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x0531d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aa1, 0xede5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8991, 0xe492, 0x97e8, 0x91db, 0xede6, 0x0000, 0x9563,
+ /* 98 */ 0x0000, 0xe49e, 0x0000, 0x89d5, 0xe49c, 0x0000, 0xe49a, 0xe491,
+ /* a0 */ 0x0000, 0xe48f, 0xf8a3, 0xe490, 0x0000, 0x8ee1, 0x8bea, 0x9297,
+ /* a8 */ 0xf8a4, 0x0000, 0x0000, 0x93cf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8970, 0x0000, 0xe494, 0xe493, 0x0000, 0x0000, 0xf8a5,
+ /* b8 */ 0x0000, 0xe499, 0xe495, 0xe498, 0x0000, 0xede7, 0xede8, 0x0000,
+
+ /*** Three byte table, leaf: e88cxx - offset 0x0535d ***/
+
+ /* 80 */ 0xede9, 0xedea, 0x96ce, 0xe497, 0x89d6, 0x8a9d, 0xe49b, 0xf8a6,
+ /* 88 */ 0xf8a7, 0xe49d, 0x0000, 0x0000, 0xf8a8, 0x0000, 0x8c73, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a1, 0xe4aa,
+ /* 98 */ 0xe4ab, 0x0000, 0x0000, 0xf8aa, 0x88a9, 0xf8ab, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xedec, 0xe4b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x88ef, 0x0000, 0x0000, 0xe4a9, 0x0000, 0xeded, 0x0000, 0xe4a8,
+ /* b0 */ 0xf8ac, 0xe4a3, 0xe4a2, 0x0000, 0xe4a0, 0xe49f, 0x9283, 0x0000,
+ /* b8 */ 0x91f9, 0xe4a5, 0xedee, 0x0000, 0xf8ad, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x0539d ***/
+
+ /* 80 */ 0xe4a4, 0x0000, 0x0000, 0xedef, 0xf8ae, 0xe4a7, 0x0000, 0xedf0,
+ /* 88 */ 0x0000, 0x9190, 0x8c74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8960,
+ /* 90 */ 0xe4a6, 0xedf1, 0x8d72, 0x0000, 0xf8a9, 0xedf2, 0x0000, 0xf8af,
+ /* 98 */ 0x9191, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xedeb, 0xf3c8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe4b8, 0x0000, 0xe4b9, 0x0000, 0x89d7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x89ac, 0xe4b6, 0xedf3, 0x0000, 0xf8b1,
+
+ /*** Three byte table, leaf: e88exx - offset 0x053dd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ac, 0xedf4, 0xe4b4,
+ /* 88 */ 0x0000, 0xe4bb, 0xe4b5, 0x0000, 0x0000, 0xf8b4, 0xe4b3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xedf5, 0xe496, 0xf8b5, 0xf8b6, 0xe4b1, 0x0000,
+ /* 98 */ 0xedf6, 0x0000, 0xe4ad, 0xf8b7, 0x0000, 0xf8b8, 0x8ace, 0xe4af,
+ /* a0 */ 0xe4ba, 0x0000, 0xe4b0, 0x0000, 0x0000, 0x0000, 0x0000, 0xedf7,
+ /* a8 */ 0xe4bc, 0xedf8, 0xe4ae, 0x949c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9789, 0x0000, 0x0000, 0x0000, 0xe4b7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cd, 0x0000, 0xedf9,
+
+ /*** Three byte table, leaf: e88fxx - offset 0x0541d ***/
+
+ /* 80 */ 0xedfa, 0xe4c5, 0x0000, 0x0000, 0x0000, 0x909b, 0x0000, 0xedfb,
+ /* 88 */ 0x0000, 0xf8b9, 0x8b65, 0x0000, 0x8bdb, 0x0000, 0xe4c0, 0xedfc,
+ /* 90 */ 0xf8ba, 0xee40, 0x0000, 0x89d9, 0xf8bb, 0x0000, 0x8fd2, 0x0000,
+ /* 98 */ 0xe4c3, 0x0000, 0x0000, 0x0000, 0x8dd8, 0xf8bc, 0x0000, 0x9370,
+ /* a0 */ 0xe4c8, 0xee41, 0x0000, 0x0000, 0x0000, 0xf8bd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x95ec, 0xee42, 0xe4bf, 0x0000, 0x0000, 0x0000, 0x89d8,
+ /* b0 */ 0x8cd4, 0x9548, 0xe4c9, 0x0000, 0xe4bd, 0x0000, 0x0000, 0xe4c6,
+ /* b8 */ 0x0000, 0xf8be, 0x0000, 0xe4d0, 0x0000, 0xe4c1, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x0545c ***/
+
+ /* 80 */ 0x0000, 0xee43, 0x0000, 0xe4c2, 0x93b8, 0x0000, 0xee44, 0xe4c7,
+ /* 88 */ 0x0000, 0x0000, 0xee45, 0xe4c4, 0x9647, 0xe4ca, 0x88de, 0xf8bf,
+ /* 90 */ 0x0000, 0xf8c0, 0x0000, 0xe4be, 0x0000, 0xf8c1, 0x0000, 0xf8c3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe4cc, 0x0000, 0xe4cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x948b, 0xe4d2, 0x0000, 0xe4dd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8a9e, 0x0000, 0x0000, 0x0000, 0xe4e0, 0x0000, 0x0000,
+ /* b8 */ 0xe4ce, 0xf8c4, 0x0000, 0x0000, 0xe4d3, 0x978e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x0549a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4dc, 0x0000,
+ /* 88 */ 0xee47, 0x9774, 0xf8c5, 0x0000, 0x0000, 0x0000, 0x97a8, 0xf8c6,
+ /* 90 */ 0x0000, 0xf8c7, 0xf8c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x9298,
+ /* 98 */ 0x0000, 0xf8c9, 0xf8ca, 0x8a8b, 0xf8cb, 0x0000, 0x0000, 0xee48,
+ /* a0 */ 0x0000, 0x9592, 0xe4e2, 0x939f, 0x0000, 0xf8cd, 0x88af, 0x0000,
+ /* a8 */ 0x0000, 0xe4db, 0x0000, 0xe4d7, 0x9192, 0xe4d1, 0xe4d9, 0xe4de,
+ /* b0 */ 0xee49, 0x944b, 0x0000, 0xee4a, 0x0000, 0x88a8, 0xf8ce, 0xe4d6,
+ /* b8 */ 0xf8cf, 0xe4df, 0x9598, 0x0000, 0xf8d0, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x054d9 ***/
+
+ /* 80 */ 0x0000, 0xf8d1, 0xe4da, 0x0000, 0xe4d5, 0xee4b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x8fd3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8f4e, 0x0000, 0x0000, 0x0000, 0x8eaa, 0x0000, 0x0000, 0xf8d4,
+ /* 98 */ 0x0000, 0x96d6, 0x0000, 0x0000, 0x9566, 0x0000, 0xee4c, 0xe4e5,
+ /* a0 */ 0x0000, 0xe4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d8, 0x0000, 0xee4d,
+ /* b0 */ 0x0000, 0x0000, 0x8a97, 0x0000, 0xee4e, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8ff6, 0xe4e3, 0xee4f, 0xe4e8, 0x9193, 0x0000, 0xf8d6, 0xe4e4,
+
+ /*** Three byte table, leaf: e893xx - offset 0x05519 ***/
+
+ /* 80 */ 0xee50, 0xe4eb, 0xee51, 0x0000, 0x927e, 0x0000, 0xe4ec, 0x0000,
+ /* 88 */ 0x0000, 0x9775, 0xe4e1, 0x8a57, 0x0000, 0xe4e7, 0xf8d8, 0xf8d9,
+ /* 90 */ 0xe4ea, 0x96aa, 0x0000, 0xf8da, 0x0000, 0x0000, 0xe4ed, 0x0000,
+ /* 98 */ 0x0000, 0xe4e6, 0xe4e9, 0x0000, 0xf8d3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8dc,
+ /* a8 */ 0x0000, 0x0000, 0xf8dd, 0x0000, 0x9648, 0x0000, 0x9840, 0xf8de,
+ /* b0 */ 0xf8df, 0xf8e0, 0x0000, 0x0000, 0xe4f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf8e1, 0x0000, 0xe4f8, 0xf8e2, 0x0000, 0xe4f0,
+
+ /*** Three byte table, leaf: e894xx - offset 0x05559 ***/
+
+ /* 80 */ 0x8ec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cf, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8e3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x95cc, 0x0000, 0x96a0, 0xe4f7, 0xe4f6, 0x0000, 0xe4f2,
+ /* 98 */ 0xe4f3, 0x0000, 0x8955, 0xf8e4, 0x0000, 0x0000, 0xee54, 0xe4f5,
+ /* a0 */ 0x0000, 0xe4ef, 0x0000, 0xee55, 0xf8e5, 0xf8e6, 0x92d3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf8e7, 0xe4f4, 0x88fc, 0x0000, 0xee56,
+ /* b0 */ 0x0000, 0x0000, 0xee53, 0x0000, 0xf8e8, 0x91a0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c1, 0xf8ed, 0x0000,
+
+ /*** Three byte table, leaf: e895xx - offset 0x05599 ***/
+
+ /* 80 */ 0xe4f9, 0xe540, 0x0000, 0x94d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe4fc, 0x8fd4, 0x8ec7, 0xe542, 0x0000, 0x0000, 0x8bbc, 0xf8e9,
+ /* 90 */ 0x0000, 0xf8ee, 0x0000, 0xf8ef, 0x0000, 0xe543, 0x0000, 0x9599,
+ /* 98 */ 0xe4fb, 0xee57, 0xe4d4, 0x0000, 0x0000, 0x0000, 0xf8f0, 0x0000,
+ /* a0 */ 0x0000, 0xf8f1, 0xf8f2, 0xe4fa, 0xee58, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x986e, 0x93a0, 0x9593, 0x0000, 0x0000, 0xe54a, 0x0000, 0xf8ea,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe550,
+ /* b8 */ 0x0000, 0x0000, 0xee5b, 0xf8f4, 0x0000, 0xf8f5, 0xe551, 0xf8f6,
+
+ /*** Three byte table, leaf: e896xx - offset 0x055d9 ***/
+
+ /* 80 */ 0xe544, 0xf8f7, 0x0000, 0x0000, 0x9496, 0x0000, 0xf8f8, 0xe54e,
+ /* 88 */ 0xe546, 0x0000, 0xe548, 0x0000, 0xee5c, 0x0000, 0x0000, 0xee5d,
+ /* 90 */ 0xe552, 0xe547, 0x0000, 0xf8f9, 0xe54b, 0x0000, 0x0000, 0x8992,
+ /* 98 */ 0x0000, 0x93e3, 0x0000, 0xe54c, 0xe54f, 0xf8fa, 0x0000, 0xf8fb,
+ /* a0 */ 0x0000, 0x0000, 0xee5e, 0x0000, 0xe545, 0x0000, 0x9145, 0x0000,
+ /* a8 */ 0xe549, 0x8e46, 0x9064, 0x8c4f, 0x96f2, 0xee5a, 0x96f7, 0x8f92,
+ /* b0 */ 0xee5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf942,
+ /* b8 */ 0x0000, 0xe556, 0xe554, 0x0000, 0xf943, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x05618 ***/
+
+ /* 80 */ 0x0000, 0x986d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf944,
+ /* 88 */ 0x0000, 0xe553, 0xf945, 0xee60, 0x0000, 0x9795, 0xee61, 0xe555,
+ /* 90 */ 0xe557, 0x0000, 0x0000, 0x0000, 0x0000, 0xe558, 0x0000, 0x0000,
+ /* 98 */ 0xf946, 0xf947, 0x0000, 0x0000, 0xe55b, 0xe559, 0x0000, 0xf948,
+ /* a0 */ 0x0000, 0xf949, 0x0000, 0x0000, 0x93a1, 0xe55a, 0xf94a, 0x0000,
+ /* a8 */ 0x0000, 0x94cb, 0xe54d, 0x0000, 0x0000, 0xee62, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf94b, 0x8f93,
+ /* b8 */ 0x0000, 0xe55c, 0xe561, 0x9194, 0x0000, 0x0000, 0xe560, 0xee64,
+
+ /*** Three byte table, leaf: e898xx - offset 0x05658 ***/
+
+ /* 80 */ 0xf94c, 0x0000, 0xe541, 0x0000, 0xee65, 0xee66, 0xe562, 0x9168,
+ /* 88 */ 0x0000, 0x0000, 0xe55d, 0xe55f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xee67, 0xf94d, 0xee63, 0xe55e, 0x0000, 0x0000, 0x9f50, 0x9f41,
+ /* 98 */ 0xee69, 0x0000, 0xe564, 0x0000, 0x0000, 0x0000, 0xf94e, 0x0000,
+ /* a0 */ 0x0000, 0xf94f, 0xe563, 0x0000, 0xf950, 0x0000, 0x0000, 0xf951,
+ /* a8 */ 0x0000, 0xee6a, 0x0000, 0x0000, 0x0000, 0x9796, 0x0000, 0xe1ba,
+ /* b0 */ 0xe565, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xee6b, 0xf953, 0x0000, 0x0000, 0xf954, 0x0000, 0x0000, 0xe566,
+
+ /*** Three byte table, leaf: e899xx - offset 0x05698 ***/
+
+ /* 80 */ 0xf956, 0x8888, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe567, 0x8cd5, 0x0000,
+ /* 90 */ 0x8b73, 0x0000, 0x0000, 0xf958, 0xe569, 0x997c, 0xf959, 0xee6c,
+ /* 98 */ 0x0000, 0x0000, 0x8b95, 0xee6d, 0x97b8, 0x0000, 0x8bf1, 0xe56a,
+ /* a0 */ 0x0000, 0x0000, 0xee6f, 0x0000, 0x0000, 0x0000, 0x0000, 0xe56b,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x928e, 0xee71, 0x0000, 0x0000, 0xf95a,
+ /* b0 */ 0x0000, 0xe56c, 0x0000, 0x0000, 0x0000, 0xee72, 0x0000, 0xf95b,
+ /* b8 */ 0x0000, 0x93f8, 0xf95c, 0x88b8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x056d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf95d,
+ /* 88 */ 0x0000, 0xf95e, 0x89e1, 0xe571, 0xe572, 0xf95f, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf960, 0x0000, 0xe56d, 0x0000, 0x8e5c, 0x0000, 0x0000,
+ /* 98 */ 0xee73, 0x0000, 0x0000, 0x0000, 0xf961, 0xf962, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe56e, 0x9461, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf963, 0xe56f, 0xe570, 0xe57a, 0x0000, 0x0000, 0x0000, 0xe574,
+ /* b0 */ 0xe577, 0xf965, 0x0000, 0xf966, 0x0000, 0x0000, 0xe573, 0x0000,
+ /* b8 */ 0xee74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x05713 ***/
+
+ /* 80 */ 0x0000, 0xf967, 0x0000, 0xf968, 0xe575, 0x0000, 0xe576, 0x8ed6,
+ /* 88 */ 0x0000, 0xe578, 0x0000, 0x9260, 0x0000, 0x8c75, 0x8a61, 0x0000,
+ /* 90 */ 0x0000, 0xf969, 0x0000, 0x0000, 0xe57b, 0xf96a, 0x0000, 0xf96b,
+ /* 98 */ 0x0000, 0x8a5e, 0x0000, 0xe581, 0x0000, 0x0000, 0xe57c, 0xe580,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf96c, 0x94b8, 0x0000, 0xf96d, 0x0000,
+ /* a8 */ 0x0000, 0xe57d, 0x0000, 0x0000, 0xe57e, 0x9567, 0x94d8, 0xe582,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x91fb, 0xe58c, 0xee75, 0xe588, 0xee76, 0xee77, 0x89e9, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x05753 ***/
+
+ /* 80 */ 0xe586, 0x0000, 0x9649, 0xe587, 0x0000, 0xf96f, 0xe584, 0xf970,
+ /* 88 */ 0xe585, 0xe58a, 0xe58d, 0xee78, 0x0000, 0xe58b, 0xf971, 0x0000,
+ /* 90 */ 0xf972, 0xe589, 0xe583, 0xf973, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9277, 0xf974, 0xe594, 0x0000, 0x96a8, 0x0000, 0x0000, 0xf975,
+ /* a0 */ 0x0000, 0xf976, 0x0000, 0xf977, 0x0000, 0xe592, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe593, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf978, 0x0000, 0x0000, 0xe58e, 0x0000, 0x0000, 0xe590,
+ /* b8 */ 0x0000, 0x0000, 0xf979, 0xe591, 0x0000, 0x0000, 0xf97a, 0xe58f,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x05793 ***/
+
+ /* 80 */ 0xf97b, 0x0000, 0x0000, 0xf97c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x90e4, 0x0000, 0x9858, 0xe598, 0x0000, 0xe599, 0x0000,
+ /* 90 */ 0x0000, 0xf97d, 0x0000, 0xe59f, 0x0000, 0x9049, 0x0000, 0xe59b,
+ /* 98 */ 0xf97e, 0xe59e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe596,
+ /* a0 */ 0xe595, 0x0000, 0x0000, 0xe5a0, 0xf980, 0xf981, 0x89da, 0x0000,
+ /* a8 */ 0xe59c, 0x0000, 0xe5a1, 0x0000, 0x0000, 0x0000, 0xe59d, 0x0000,
+ /* b0 */ 0x0000, 0xee79, 0xf982, 0x0000, 0xe59a, 0x0000, 0x92b1, 0x0000,
+ /* b8 */ 0xe597, 0x0000, 0x0000, 0x0000, 0xf983, 0x0000, 0x0000, 0x9488,
+
+ /*** Three byte table, leaf: e89exx - offset 0x057d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xee7a,
+ /* 88 */ 0xee7b, 0xf987, 0x0000, 0xf988, 0x0000, 0x975a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf989, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a4,
+ /* a0 */ 0xf98a, 0x0000, 0xe5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf986,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe5ac, 0xee7c, 0xee7d, 0x0000, 0xe5a6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe5ae, 0x0000, 0xee7e, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9786, 0xe5b1, 0x0000, 0xe5a8, 0xf98d, 0x0000,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x05813 ***/
+
+ /* 80 */ 0xe5a9, 0xf98f, 0x0000, 0x0000, 0xe5ad, 0x0000, 0xe5b0, 0xe5af,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe5a7, 0x0000, 0x0000, 0xf990, 0x0000,
+ /* 90 */ 0xe5aa, 0x0000, 0xe5bb, 0x0000, 0x0000, 0x0000, 0xee81, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf992,
+ /* a0 */ 0xe5b4, 0x0000, 0x0000, 0xf994, 0x0000, 0xf995, 0xf996, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf997, 0xf998, 0xee82, 0xf999, 0x0000, 0xe5b2,
+ /* b0 */ 0x0000, 0x0000, 0xe5b3, 0x0000, 0x0000, 0xf991, 0xe5b8, 0xe5b9,
+ /* b8 */ 0x0000, 0x8a49, 0x0000, 0x8b61, 0x0000, 0x0000, 0xe5b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x05852 ***/
+
+ /* 80 */ 0x0000, 0xf99a, 0x0000, 0xf99b, 0x0000, 0xe5a2, 0xee83, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xee84, 0xf99c, 0x0000, 0xe5b6, 0xe5ba, 0xe5b5,
+ /* 90 */ 0xee85, 0xe5bc, 0x0000, 0xf99d, 0xee86, 0xe5be, 0xe5bd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee87,
+ /* a0 */ 0x0000, 0xe5c0, 0xe5bf, 0xe579, 0x0000, 0x0000, 0x0000, 0xe5c4,
+ /* a8 */ 0xf99e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf99f, 0x0000,
+ /* b0 */ 0x0000, 0xe5c1, 0xf9a0, 0x0000, 0x0000, 0x0000, 0xe5c2, 0x0000,
+ /* b8 */ 0x0000, 0xe5c3, 0x0000, 0xe5c5, 0xf9a1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x05892 ***/
+
+ /* 80 */ 0x8c8c, 0x0000, 0xe5c7, 0x0000, 0xe5c6, 0x0000, 0x8f4f, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf9a3, 0x0000, 0x8d73, 0x9fa5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5c8, 0x8f70, 0x0000, 0x0000, 0x0000, 0x8a58,
+ /* 98 */ 0xf9a4, 0xe5c9, 0x0000, 0x8971, 0x0000, 0x8fd5, 0xe5ca, 0xf9a5,
+ /* a0 */ 0x0000, 0x8d74, 0xe5cb, 0x88df, 0xf9a6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x955c, 0xf9a9, 0x0000, 0xe5cc, 0x0000, 0x0000, 0x0000, 0xf9ab,
+ /* b0 */ 0x908a, 0x0000, 0xe5d3, 0x0000, 0x0000, 0xe5d0, 0x0000, 0x928f,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d1, 0xe5ce, 0x8bdc,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x058d2 ***/
+
+ /* 80 */ 0x0000, 0xe5cd, 0xe5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8c55, 0x0000, 0x0000, 0x91dc, 0x0000, 0xe5da, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5d6, 0x0000, 0x0000, 0x0000, 0x91b3, 0xe5d5,
+ /* 98 */ 0xee88, 0xe5d8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cf, 0x0000,
+ /* a0 */ 0xf9ac, 0x0000, 0xe5d9, 0x0000, 0xe5db, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xee89, 0x94ed, 0x0000, 0x0000, 0xe5d7, 0x0000,
+ /* b0 */ 0xe5dc, 0xe5de, 0x0000, 0x0000, 0x8cd1, 0xe5d2, 0x0000, 0x88bf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ad, 0xf9ae, 0xf9af, 0xe5dd,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x05912 ***/
+
+ /* 80 */ 0xf9b0, 0x8dd9, 0x97f4, 0xe5df, 0xe5e0, 0x9195, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xee8a, 0x0000, 0x0000, 0x0000, 0xee8b, 0x97a0,
+ /* 90 */ 0x0000, 0xf9b3, 0xf9b1, 0xf9b4, 0xe5e1, 0x9754, 0x0000, 0x0000,
+ /* 98 */ 0xe5e2, 0xe5e3, 0x0000, 0xf9b5, 0x95e2, 0xe5e4, 0x0000, 0x8dbe,
+ /* a0 */ 0x0000, 0x97a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf9b6, 0xf9b7, 0xe5ea, 0x8fd6, 0xe5e8, 0xee8d, 0x0000, 0x0000,
+ /* b8 */ 0x9787, 0xe5e5, 0x0000, 0x0000, 0xe5e7, 0x90bb, 0x909e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x05951 ***/
+
+ /* 80 */ 0x0000, 0xf9b9, 0xe5e6, 0x0000, 0xe5eb, 0x0000, 0x0000, 0x95a1,
+ /* 88 */ 0x0000, 0x0000, 0xe5ed, 0x0000, 0xe5ec, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8a8c, 0x0000, 0x964a, 0xe5ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xee90, 0xee91, 0xee92, 0x0000, 0xee8e, 0xe5fa, 0xe5f0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f1, 0x0000, 0xee93,
+ /* a8 */ 0x0000, 0x0000, 0xe5f2, 0xe5f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xee94, 0x0000, 0xee95, 0x0000, 0x0000, 0x0000, 0xe5f7, 0xf9bb,
+ /* b8 */ 0xe5f8, 0xee96, 0x0000, 0xe5f6, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x05991 ***/
+
+ /* 80 */ 0xee97, 0xe5f4, 0xf9bd, 0xe5ef, 0xe5f5, 0xf9be, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf9bf, 0x0000, 0x0000, 0xe5f9, 0xe8b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89a6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5fc, 0x8bdd,
+ /* a0 */ 0xe5fb, 0x0000, 0xf9c2, 0x0000, 0xe641, 0x0000, 0xe640, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe643, 0x0000, 0x0000, 0xe642, 0x0000, 0xe644,
+ /* b0 */ 0x0000, 0x0000, 0x8f50, 0x0000, 0xe645, 0x0000, 0x0000, 0xe646,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe647, 0x90bc,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x059d1 ***/
+
+ /* 80 */ 0xf9c3, 0x9776, 0x0000, 0xe648, 0x0000, 0x0000, 0x95a2, 0x9465,
+ /* 88 */ 0xe649, 0xf9c4, 0xe64a, 0x8ca9, 0x0000, 0x0000, 0x0000, 0x8b4b,
+ /* 90 */ 0xf9c5, 0x0000, 0x0000, 0xe64b, 0xee98, 0x0000, 0x8e8b, 0x9460,
+ /* 98 */ 0xe64c, 0x0000, 0x8a6f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c6,
+ /* a0 */ 0x0000, 0xe64d, 0x0000, 0x0000, 0x0000, 0x0000, 0xe64f, 0x9797,
+ /* a8 */ 0x0000, 0xe64e, 0x9065, 0x0000, 0xe650, 0x0000, 0x0000, 0xe651,
+ /* b0 */ 0xf9c7, 0x0000, 0xe652, 0x8acf, 0x0000, 0x0000, 0x0000, 0xf9c8,
+ /* b8 */ 0x0000, 0x0000, 0xe653, 0x0000, 0x0000, 0xe654, 0x0000, 0xe655,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x05a11 ***/
+
+ /* 80 */ 0xe656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8a70, 0x0000, 0xee9a, 0x0000, 0xf9c9, 0x0000,
+ /* 98 */ 0xf9ca, 0x0000, 0xe657, 0x0000, 0xe658, 0xe659, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x89f0, 0x0000, 0xee9b, 0x9047, 0xe65a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf9cb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf9cd, 0x0000, 0xf9ce, 0xe65b, 0x0000, 0xee9c, 0x0000,
+ /* b8 */ 0xe65c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9cf, 0x0000, 0xf9d0,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x05a51 ***/
+
+ /* 80 */ 0x8cbe, 0x0000, 0x92f9, 0xe65d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8c76, 0x0000, 0x9075, 0x0000, 0xe660, 0x0000, 0x93a2, 0x0000,
+ /* 90 */ 0xe65f, 0xf9d2, 0xee9d, 0x8c50, 0xf9d3, 0xee9e, 0xe65e, 0x91f5,
+ /* 98 */ 0x8b4c, 0x0000, 0x0000, 0xe661, 0x0000, 0xe662, 0x0000, 0x8fd7,
+ /* a0 */ 0x0000, 0xf9d5, 0xee9f, 0x8c8d, 0x0000, 0xe663, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x964b, 0x0000, 0x0000, 0x90dd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8b96, 0x0000, 0x96f3, 0x9169, 0xf9d6, 0xe664, 0xeea0,
+ /* b8 */ 0x0000, 0x0000, 0x9066, 0x9290, 0x8fd8, 0x0000, 0xf9d7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x05a90 ***/
+
+ /* 80 */ 0x0000, 0xe665, 0x0000, 0x0000, 0x0000, 0xf9d8, 0xe668, 0xeea1,
+ /* 88 */ 0xe669, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d9, 0xeea2, 0x0000,
+ /* 90 */ 0x8dbc, 0x91c0, 0xe667, 0x0000, 0x8fd9, 0x955d, 0x0000, 0x0000,
+ /* 98 */ 0xf9da, 0x0000, 0x0000, 0xe666, 0x0000, 0xeea3, 0x8e8c, 0x0000,
+ /* a0 */ 0x8972, 0xeea4, 0xe66d, 0x8c77, 0x0000, 0x0000, 0x8e8e, 0x0000,
+ /* a8 */ 0x0000, 0x8e8d, 0x0000, 0x986c, 0xe66c, 0xe66b, 0x9146, 0x0000,
+ /* b0 */ 0x8b6c, 0x9862, 0x8a59, 0x8fda, 0x0000, 0xeea5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeea6, 0x0000, 0x0000, 0xe66a, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x05ace ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe66f, 0x0000, 0xe670, 0xe66e, 0x0000, 0x8cd6,
+ /* 88 */ 0x0000, 0x975f, 0x0000, 0x0000, 0x8e8f, 0x9446, 0x0000, 0x0000,
+ /* 90 */ 0xf9dc, 0xe673, 0x0000, 0x90be, 0x0000, 0x9261, 0x0000, 0x0000,
+ /* 98 */ 0x9755, 0x0000, 0xe676, 0x0000, 0x0000, 0x0000, 0x8cea, 0x0000,
+ /* a0 */ 0x90bd, 0xe672, 0x0000, 0xe677, 0x8ceb, 0xe674, 0xe675, 0xeea7,
+ /* a8 */ 0xe671, 0x0000, 0x0000, 0x0000, 0x90e0, 0x93c7, 0xf9db, 0x0000,
+ /* b0 */ 0x924e, 0x0000, 0x89db, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9dd,
+ /* b8 */ 0x0000, 0x94ee, 0x0000, 0x0000, 0x8b62, 0x0000, 0xf9de, 0x92b2,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x05b0e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe67a, 0x0000, 0xe678, 0x0000, 0x0000, 0x926b,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x90bf, 0x8ad0, 0xe679, 0x0000, 0x907a,
+ /* 90 */ 0xeea8, 0x0000, 0x97c8, 0x0000, 0x0000, 0x0000, 0x985f, 0xf9df,
+ /* 98 */ 0x0000, 0x0000, 0xe67b, 0xe687, 0x92b3, 0x0000, 0xe686, 0xeea9,
+ /* a0 */ 0xe683, 0xe68b, 0xe684, 0x0000, 0xe680, 0x0000, 0x92fa, 0xe67e,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe67c, 0x0000, 0x9740, 0x8e90, 0x0000,
+ /* b0 */ 0x0000, 0xe681, 0x0000, 0xe67d, 0xeeaa, 0x0000, 0xeeab, 0xe685,
+ /* b8 */ 0x8f94, 0x0000, 0x8cbf, 0x0000, 0xf9e0, 0x0000, 0x91f8, 0x0000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x05b4e ***/
+
+ /* 80 */ 0x9664, 0x8979, 0x88e0, 0x0000, 0x93a3, 0xf9e3, 0x0000, 0xe689,
+ /* 88 */ 0x0000, 0x0000, 0xf9e2, 0x0000, 0xe688, 0xf9e4, 0x93e4, 0x0000,
+ /* 90 */ 0xe68d, 0x0000, 0x0000, 0x0000, 0xe682, 0x0000, 0xe68c, 0xe68e,
+ /* 98 */ 0x0000, 0x8caa, 0xe68a, 0x8d75, 0xf9e5, 0x8ed3, 0x0000, 0xf9e6,
+ /* a0 */ 0xe68f, 0x9777, 0x0000, 0x0000, 0x0000, 0x0000, 0xe692, 0x0000,
+ /* a8 */ 0xe695, 0x0000, 0x0000, 0xe693, 0x9554, 0xf9e7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe690, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8bde, 0x0000, 0x0000, 0x0000, 0x0000, 0xe694,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x05b8d ***/
+
+ /* 80 */ 0x0000, 0xe696, 0x0000, 0xf9e8, 0x0000, 0x0000, 0xeeaf, 0x0000,
+ /* 88 */ 0x0000, 0xe69a, 0x0000, 0x0000, 0xe697, 0x0000, 0xe699, 0xe698,
+ /* 90 */ 0x0000, 0xf9ea, 0x0000, 0x0000, 0xeeb0, 0x0000, 0xe69b, 0x0000,
+ /* 98 */ 0x8eaf, 0xeeb1, 0xe69d, 0xe69c, 0x9588, 0x0000, 0xf9eb, 0xe69f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c78, 0x0000,
+ /* a8 */ 0x0000, 0xeeb2, 0x0000, 0xe69e, 0xe6a0, 0x0000, 0x0000, 0xe6a1,
+ /* b0 */ 0x8b63, 0xe3bf, 0x8ff7, 0x0000, 0xe6a2, 0x0000, 0xf9ec, 0x8cec,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a3, 0x0000, 0xf9ed,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x05bcd ***/
+
+ /* 80 */ 0xe6a4, 0xf9ee, 0x0000, 0x8e5d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9dcc, 0xf9ef, 0xe6a5, 0x0000, 0xe6a6, 0x0000,
+ /* 90 */ 0x8f51, 0x0000, 0xe6a7, 0xe6a8, 0xf9f0, 0xf9f1, 0xe6a9, 0x0000,
+ /* 98 */ 0x0000, 0xe6aa, 0xe6ab, 0x0000, 0xf9f2, 0xeeb3, 0xf9f3,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x05bec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x924a,
+ /* b8 */ 0x0000, 0xf9f4, 0xe6ac, 0x0000, 0x0000, 0xf9f6, 0x0000, 0xe6ae,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x05c2c ***/
+
+ /* 80 */ 0x0000, 0xe6ad, 0x0000, 0x0000, 0x0000, 0xf9f9, 0x93a4, 0xf9fa,
+ /* 88 */ 0xe6af, 0xeeb4, 0x964c, 0x0000, 0xe6b0, 0x0000, 0xe6b1, 0xf9fb,
+ /* 90 */ 0xe6b2, 0x0000, 0x0000, 0x0000, 0xf9fc, 0xe6b3, 0x0000, 0xfa40,
+ /* 98 */ 0x0000, 0x0000, 0x93d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8fdb, 0xe6b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeeb5, 0xfa41, 0x8d8b, 0x98ac, 0xe6b5, 0xfa42, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfa43, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6b6, 0x955e, 0xe6b7, 0x0000, 0xe6bf, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x05c6a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6b8, 0x0000, 0x0000, 0xe6ba, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe6b9, 0xe6bb, 0x0000, 0x9665, 0xe6bc, 0xe6bd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfa46, 0xfa45, 0xe6be, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6c0, 0xfa47, 0x0000, 0xfa49, 0x0000, 0x8a4c, 0x92e5, 0x0000,
+ /* a0 */ 0x9589, 0x8de0, 0x8d76, 0x0000, 0xfa4a, 0x0000, 0x0000, 0x956e,
+ /* a8 */ 0x89dd, 0x94cc, 0xe6c3, 0x8ad1, 0x90d3, 0xe6c2, 0xe6c7, 0x9299,
+ /* b0 */ 0x96e1, 0x0000, 0xe6c5, 0xe6c6, 0x8b4d, 0x0000, 0xe6c8, 0x9483,
+ /* b8 */ 0x91dd, 0x0000, 0x0000, 0x94ef, 0x935c, 0xe6c4, 0x0000, 0x9666,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x05caa ***/
+
+ /* 80 */ 0x89ea, 0xe6ca, 0x9847, 0x92c0, 0x9864, 0x0000, 0x0000, 0x8e91,
+ /* 88 */ 0xe6c9, 0x0000, 0x91af, 0x0000, 0x0000, 0xe6da, 0x9147, 0x0000,
+ /* 90 */ 0x0000, 0x93f6, 0x0000, 0x956f, 0x0000, 0xfa4c, 0xfa4b, 0x0000,
+ /* 98 */ 0x0000, 0xfa4d, 0xe6cd, 0x8e5e, 0x8e92, 0x0000, 0x8fdc, 0x0000,
+ /* a0 */ 0x9485, 0xeeb7, 0x8cab, 0xe6cc, 0xe6cb, 0x0000, 0x958a, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8ebf, 0x0000, 0x0000, 0x9371, 0x0000, 0x0000,
+ /* b0 */ 0xfa4f, 0xfa50, 0x0000, 0x0000, 0xeeb8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xeeb9, 0x0000, 0xe6cf, 0xe6d0, 0x8d77, 0xe6ce, 0xeeba,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x05ce9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d1, 0xe6d2, 0x0000, 0xe6d4,
+ /* 88 */ 0x91a1, 0xfa52, 0xe6d3, 0x8ae4, 0x0000, 0xe6d6, 0xfa53, 0xe6d5,
+ /* 90 */ 0xe6d7, 0x0000, 0xeebc, 0xe6d9, 0xe6db, 0x0000, 0xe6dc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeebd,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x05d05 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x90d4, 0x0000, 0x8ecd, 0xe6dd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8a71, 0xfa54, 0xe6de, 0x0000, 0x0000,
+ /* b0 */ 0x9196, 0xe6df, 0x0000, 0xe6e0, 0x958b, 0x0000, 0x0000, 0x8b4e,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x05d44 ***/
+
+ /* 80 */ 0x0000, 0xe6e1, 0x0000, 0x0000, 0xfa55, 0x92b4, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x897a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa56, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe6e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8eef, 0x0000, 0x0000, 0xfa57, 0x0000,
+ /* a8 */ 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeebe,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x91ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe6e5, 0x0000, 0x0000, 0x0000, 0xe6e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x05d83 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6e3, 0x0000, 0x0000, 0x0000, 0xfa59, 0x0000,
+ /* 88 */ 0xfa5a, 0x0000, 0x0000, 0xe6eb, 0xe6e9, 0x0000, 0xeebf, 0xe6e6,
+ /* 90 */ 0x0000, 0xeec0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e8, 0xeec1,
+ /* 98 */ 0x0000, 0xfa5b, 0xe6e7, 0xe6ea, 0x0000, 0x8b97, 0x0000, 0xe6ee,
+ /* a0 */ 0x0000, 0x90d5, 0x0000, 0xe6ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8cd7, 0x0000, 0xe6ec, 0xe6ed, 0xfa5c, 0x0000, 0x0000, 0x9848,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x92b5, 0x0000, 0x9148, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f0, 0xfa5f, 0x0000, 0xe6f3,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x05dc3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa60, 0x0000,
+ /* 88 */ 0xe6f1, 0xe6f2, 0x9778, 0x0000, 0xfa5d, 0x0000, 0x0000, 0x93a5,
+ /* 90 */ 0xe6f6, 0x0000, 0x0000, 0x0000, 0xfa62, 0x0000, 0xfa63, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f4, 0xe6f5, 0xe6f7,
+ /* a0 */ 0xeec2, 0xfa64, 0xfa65, 0xeec3, 0x0000, 0x0000, 0x0000, 0xfa66,
+ /* a8 */ 0x0000, 0x0000, 0xe748, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe6fa, 0x0000, 0x0000, 0x0000, 0xe6fb, 0xe6f9, 0xfa69, 0x0000,
+ /* b8 */ 0x0000, 0xfa6a, 0x0000, 0x0000, 0x0000, 0xeec4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x05e01 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6f8, 0x0000, 0x92fb, 0x0000, 0x0000, 0xe740,
+ /* 88 */ 0xe744, 0xe741, 0xe6fc, 0xfa6b, 0xe742, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe743, 0x0000, 0x0000, 0x0000, 0xfa6c, 0xe74a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90d6,
+ /* a0 */ 0xe747, 0x0000, 0xfa6d, 0xe749, 0xe746, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa6e, 0xfa6f, 0x0000, 0xfa70,
+ /* b0 */ 0xeec5, 0x0000, 0xe74c, 0x0000, 0x8f52, 0x0000, 0xe74b, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeec6, 0xe74d, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x05e40 ***/
+
+ /* 80 */ 0x0000, 0xe74e, 0x0000, 0x0000, 0xe751, 0xe750, 0x0000, 0xe74f,
+ /* 88 */ 0x0000, 0x0000, 0xe753, 0xe752, 0x0000, 0x96f4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe755, 0x0000, 0xe754, 0xe756, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfa71, 0xe757, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa72, 0x0000,
+ /* a0 */ 0x0000, 0xe759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe758, 0x9067, 0xe75a, 0x0000, 0xfa73, 0x8beb,
+ /* b0 */ 0xe75b, 0xe75d, 0x0000, 0xfa74, 0x0000, 0xfa75, 0xfa76, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfa77, 0x0000, 0x0000, 0xe75e, 0x0000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x05e80 ***/
+
+ /* 80 */ 0xeec8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe75f, 0xe75c, 0x0000,
+ /* 88 */ 0xe760, 0x0000, 0x8ed4, 0xe761, 0x8b4f, 0x8c52, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfa79, 0x8cac, 0x0000, 0xfa7a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe762, 0x0000, 0x0000, 0x0000, 0x93ee,
+ /* a0 */ 0x0000, 0x0000, 0x935d, 0xe763, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe766, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8eb2, 0xfa7c, 0xeeca, 0xe765, 0xe764, 0x8c79, 0xe767, 0x0000,
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x05ec0 ***/
+
+ /* 80 */ 0xfa7e, 0x0000, 0x0000, 0x8a72, 0x0000, 0xe769, 0x0000, 0x0000,
+ /* 88 */ 0xfa80, 0x8dda, 0xe768, 0x0000, 0xe771, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe76b, 0xe76d, 0x95e3, 0xe76a, 0x0000, 0xfa81,
+ /* 98 */ 0x0000, 0xe76c, 0x0000, 0xe770, 0xe76e, 0x8b50, 0xeecb, 0xe76f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe772, 0x0000,
+ /* a8 */ 0x0000, 0x9479, 0x97d6, 0xfa82, 0x0000, 0xeecc, 0x0000, 0x8f53,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe773, 0x0000, 0x0000, 0xeecd, 0x0000,
+ /* b8 */ 0x9741, 0xe775, 0x0000, 0xe774, 0x0000, 0x0000, 0xe778, 0x9760,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x05f00 ***/
+
+ /* 80 */ 0xfa83, 0x0000, 0xe777, 0x0000, 0x8a8d, 0xe776, 0xe77b, 0x0000,
+ /* 88 */ 0x0000, 0xe77a, 0xfa84, 0x0000, 0xe779, 0x9351, 0xe77c, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeece, 0x0000, 0x0000, 0xe77d,
+ /* 98 */ 0xfa85, 0x0000, 0x0000, 0x0000, 0xe77e, 0x0000, 0x0000, 0x8d8c,
+ /* a0 */ 0x0000, 0x8c44, 0xe780, 0xe781, 0xe782,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x05f25 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9068, 0xe783, 0x0000, 0x8eab, 0xe784,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe785, 0xfa87, 0x0000, 0xeed0, 0x999f,
+ /* a8 */ 0x999e, 0x0000, 0x0000, 0x0000, 0x0000, 0xe786, 0xe390, 0xe787,
+ /* b0 */ 0x9243, 0x904a, 0x945f, 0x0000, 0xfa88, 0xeed1, 0xfa8a, 0xe788,
+ /* b8 */ 0x0000, 0x0000, 0x95d3, 0x92d2, 0x8d9e, 0x0000, 0x0000, 0x9248,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x05f65 ***/
+
+ /* 80 */ 0x0000, 0xfa8c, 0x8949, 0x0000, 0x9698, 0x9076, 0xfa8d, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfa8f, 0x0000, 0x0000, 0xfa90, 0x8c7d, 0x0000,
+ /* 90 */ 0x0000, 0x8bdf, 0x0000, 0xfa91, 0x95d4, 0xfa92, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfa93, 0x0000, 0xe78b, 0x0000, 0xeed2, 0xe78a, 0x89de, 0x0000,
+ /* a8 */ 0xeed3, 0x93f4, 0xe78c, 0x9497, 0x0000, 0x9352, 0xeed4, 0xe78d,
+ /* b0 */ 0x8f71, 0xfa94, 0x0000, 0x0000, 0xe78f, 0xfa95, 0x0000, 0x96c0,
+ /* b8 */ 0xe79e, 0xe791, 0xe792, 0xfa96, 0x0000, 0x92c7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x05fa5 ***/
+
+ /* 80 */ 0x91de, 0x9197, 0xfa97, 0x93a6, 0x0000, 0xe790, 0x8b74, 0x0000,
+ /* 88 */ 0xeed5, 0x0000, 0x0000, 0xe799, 0xfa98, 0xe796, 0xe7a3, 0x93a7,
+ /* 90 */ 0x9280, 0xe793, 0x0000, 0x92fc, 0x9372, 0xe794, 0xe798, 0x9080,
+ /* 98 */ 0x0000, 0x9487, 0x92ca, 0x0000, 0x0000, 0x90c0, 0xe797, 0x91ac,
+ /* a0 */ 0x91a2, 0xe795, 0x88a7, 0x9841, 0x0000, 0x0000, 0x0000, 0xe79a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeed6, 0x91df, 0x0000,
+ /* b0 */ 0x0000, 0x8f54, 0x9069, 0x0000, 0x0000, 0xe79c, 0xe79b, 0xfa99,
+ /* b8 */ 0x88ed, 0xe79d, 0x0000, 0x0000, 0x954e, 0x0000, 0xe7a5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x05fe4 ***/
+
+ /* 80 */ 0x0000, 0x93d9, 0x908b, 0xfa9b, 0xfa9c, 0x9278, 0x0000, 0x8bf6,
+ /* 88 */ 0x0000, 0xe7a4, 0x9756, 0x895e, 0x0000, 0x95d5, 0x89df, 0xe79f,
+ /* 90 */ 0xe7a0, 0xe7a1, 0xe7a2, 0x93b9, 0x9242, 0x88e1, 0xe7a6, 0x0000,
+ /* 98 */ 0xe7a7, 0xeaa1, 0x0000, 0x0000, 0x91bb, 0xfa9d, 0xe7a8, 0x0000,
+ /* a0 */ 0x8993, 0x916b, 0x0000, 0x8cad, 0x0000, 0x9779, 0x0000, 0x0000,
+ /* a8 */ 0xe7a9, 0x934b, 0x0000, 0x0000, 0x0000, 0x9198, 0x8ed5, 0xe7aa,
+ /* b0 */ 0x0000, 0x0000, 0xe7ad, 0x0000, 0x0000, 0x8f85, 0xe7ab, 0x914a,
+ /* b8 */ 0x9149, 0x0000, 0x88e2, 0x0000, 0x97c9, 0xe7af, 0x0000, 0x94f0,
+
+ /*** Three byte table, leaf: e982xx - offset 0x06024 ***/
+
+ /* 80 */ 0xe7b1, 0xe7b0, 0xe7ae, 0xe284, 0x8ad2, 0xfaa0, 0x0000, 0xe78e,
+ /* 88 */ 0xeed8, 0xe7b3, 0xe7b2, 0x0000, 0xfaa1, 0x0000, 0x0000, 0xe7b4,
+ /* 90 */ 0xfaa2, 0x9757, 0x0000, 0x0000, 0x0000, 0xeed9, 0x0000, 0xeeda,
+ /* 98 */ 0x0000, 0xeedb, 0x0000, 0xeedc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfaa4, 0xeedd, 0x93df, 0x0000, 0x0000, 0x964d, 0x0000,
+ /* a8 */ 0xe7b5, 0x0000, 0x8ed7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b6,
+ /* b0 */ 0xfaa6, 0xe7b7, 0x0000, 0xeede, 0x0000, 0xe7b8, 0xfaa7, 0x0000,
+ /* b8 */ 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeedf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x06063 ***/
+
+ /* 80 */ 0x0000, 0x88e8, 0x0000, 0xfaa8, 0xeee0, 0xeee1, 0x0000, 0xeee2,
+ /* 88 */ 0xfaa9, 0x0000, 0x8d78, 0x0000, 0x0000, 0x0000, 0x9859, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe7bc, 0xfaab, 0xeee4, 0xeee5, 0xfaac,
+ /* a0 */ 0x0000, 0x8c53, 0xe7b9, 0x0000, 0xe7ba, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9594, 0x0000, 0x0000, 0xfab1, 0x0000, 0x8a73, 0x0000, 0xeee6,
+ /* b0 */ 0x0000, 0x0000, 0xfaaf, 0x0000, 0xeee7, 0x9758, 0xfaae, 0x8bbd,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9373, 0xfab2, 0xfab3,
+
+ /*** Three byte table, leaf: e984xx - offset 0x060a3 ***/
+
+ /* 80 */ 0xfab0, 0x0000, 0xe7bd, 0x0000, 0xfab4, 0x0000, 0xfab5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe7be, 0x0000, 0xeee9, 0xeeea, 0xeeeb, 0x0000,
+ /* 98 */ 0xfab6, 0xe7bf, 0x0000, 0x0000, 0xfab7, 0x0000, 0xfab8, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xeeec, 0xeeed, 0x0000, 0x0000, 0x0000, 0xeeee,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9341, 0x0000, 0xeeef,
+ /* b0 */ 0xe7c1, 0xeef0, 0xe7c0, 0x0000, 0xeef1, 0x0000, 0x0000, 0xfab9,
+ /* b8 */ 0x0000, 0xfaba, 0xfabb, 0x0000, 0x0000, 0xeef2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x060e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfabc, 0xfabd,
+ /* 88 */ 0xeef3, 0x93d1, 0xe7c2, 0x8f55, 0x8ede, 0x947a, 0x9291, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8ef0, 0x0000, 0x908c, 0x0000, 0xe7c3, 0xfabe,
+ /* 98 */ 0xe7c4, 0xfabf, 0x0000, 0xeef4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfac0, 0x907c, 0xe7c5, 0xfac1, 0xe7c6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe7c7, 0x978f, 0x0000, 0x8f56, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe7c9, 0xe7c8, 0xfac2, 0x8d79, 0x0000, 0x8d93,
+ /* b8 */ 0x8e5f, 0xfac3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x0611f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7cc, 0xeef5, 0x0000, 0xfac4, 0x0000, 0x8f86,
+ /* 88 */ 0x0000, 0xe7cb, 0x0000, 0xe7ca, 0x0000, 0x91e7, 0xfac5, 0x0000,
+ /* 90 */ 0x8ced, 0x0000, 0x90c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x94ae,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f58, 0x0000, 0xeef6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe7cd, 0x0000, 0x8fdd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xfac6, 0x0000, 0xe7d0, 0xe7ce, 0xeef7, 0x0000, 0xfac7, 0xe7cf,
+ /* b0 */ 0x0000, 0xeef8, 0x0000, 0xfac8, 0xe7d2, 0xe7d1, 0xfac9, 0x0000,
+ /* b8 */ 0x8ff8, 0x0000, 0xe7d3, 0x0000, 0xeef9, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x0615f ***/
+
+ /* 80 */ 0xe7d4, 0xe7d5, 0x0000, 0xfaca, 0xfacb, 0x0000, 0x94ce, 0x8dd1,
+ /* 88 */ 0x8edf, 0xe7d6, 0x0000, 0xe7d7, 0x97a2, 0x8f64, 0x96ec, 0x97ca,
+ /* 90 */ 0xe7d8, 0x8be0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7d9, 0xeefa,
+ /* 98 */ 0x9342, 0x0000, 0xfacc, 0xe7dc, 0x8a98, 0x906a, 0x0000, 0xe7da,
+ /* a0 */ 0x0000, 0xe7db, 0x0000, 0x92de, 0xeefc, 0xef40, 0x9674, 0x8bfa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfacf, 0xef41, 0xfad0, 0x0000,
+ /* b0 */ 0x0000, 0xef42, 0x0000, 0x0000, 0x0000, 0xe7de, 0xe7df, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeefb, 0xe7dd, 0x0000, 0x0000, 0xe7e1,
+
+ /*** Three byte table, leaf: e988xx - offset 0x0619f ***/
+
+ /* 80 */ 0x0000, 0xfad1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef43,
+ /* 88 */ 0x0000, 0x0000, 0xfad2, 0x0000, 0x0000, 0x93dd, 0x8a62, 0x0000,
+ /* 90 */ 0xef44, 0xe7e5, 0x0000, 0x0000, 0xe7e2, 0xe7e4, 0xfad3, 0xfad4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe86e, 0x0000, 0x0000, 0xe7e3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfad6, 0x97e9, 0x0000, 0x0000, 0x8cd8,
+ /* b8 */ 0xef45, 0xef46, 0xef47, 0x0000, 0xef48, 0x0000, 0x0000, 0xe7ed,
+
+ /*** Three byte table, leaf: e989xx - offset 0x061df ***/
+
+ /* 80 */ 0xef49, 0x0000, 0xfad7, 0xef4a, 0x9353, 0xe7e8, 0x0000, 0xfad8,
+ /* 88 */ 0xe7eb, 0xe7e9, 0xfad9, 0xe7ee, 0x0000, 0x0000, 0xfada, 0xef4b,
+ /* 90 */ 0xe7ef, 0xfadb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfadc, 0xe7e7,
+ /* 98 */ 0x0000, 0xfadd, 0xe7f4, 0x8994, 0x0000, 0x0000, 0xe7e6, 0x0000,
+ /* a0 */ 0xfade, 0xfadf, 0x94ab, 0x0000, 0xe7ea, 0xfae0, 0x8fde, 0xfae1,
+ /* a8 */ 0xfae2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8d7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xef4c, 0x0000, 0x0000, 0x0000, 0xfae5, 0xfae6, 0x9667, 0xfae7,
+
+ /*** Three byte table, leaf: e98axx - offset 0x0621f ***/
+
+ /* 80 */ 0x8be2, 0x0000, 0x0000, 0x8f65, 0x0000, 0x93ba, 0x0000, 0x0000,
+ /* 88 */ 0xef4d, 0xfae8, 0x0000, 0x0000, 0x0000, 0xfae9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x914c, 0x0000, 0xe7f2, 0x0000, 0xe7ec, 0xe7f1, 0xfaea,
+ /* 98 */ 0x96c1, 0xfaeb, 0x92b6, 0xe7f3, 0xe7f0, 0x0000, 0x0000, 0xfaec,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaed,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfaee, 0x0000, 0x914b, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfaf1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f7,
+ /* b8 */ 0x0000, 0xe7f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaf2,
+
+ /*** Three byte table, leaf: e98bxx - offset 0x0625f ***/
+
+ /* 80 */ 0xfaf3, 0x0000, 0xef4e, 0x0000, 0x0000, 0x0000, 0xfaf4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xef4f, 0xef50, 0x0000, 0xfaf5, 0xe7f5,
+ /* 90 */ 0xfaf6, 0x0000, 0x964e, 0xef51, 0x0000, 0x0000, 0x0000, 0xfaf7,
+ /* 98 */ 0x0000, 0xfaf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xef52, 0x0000, 0x0000, 0x0000, 0x8f9b, 0xfaf9, 0x0000, 0xfafa,
+ /* a8 */ 0x0000, 0xe7f8, 0x95dd, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9565, 0x9292, 0x0000, 0x0000, 0x0000, 0xfb41,
+ /* b8 */ 0x8b98, 0xfb42, 0xe7fa, 0xfb43, 0x8d7c, 0x0000, 0x0000, 0xef53,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x0629f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfb44, 0x0000, 0xef54, 0x0000, 0x8e4b, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb45, 0x0000, 0xe7f9,
+ /* 90 */ 0x908d, 0xfafb, 0x0000, 0x0000, 0x0000, 0xfb46, 0x0000, 0x0000,
+ /* 98 */ 0x908e, 0xe840, 0xe842, 0x0000, 0x0000, 0xfb47, 0xfb48, 0xef55,
+ /* a0 */ 0x8ff9, 0xef56, 0xe841, 0xe843, 0x0000, 0xef57, 0x8bd1, 0xfb49,
+ /* a8 */ 0x9564, 0xfb4a, 0x0000, 0x8ee0, 0x9842, 0x0000, 0xe7fc, 0x8df6,
+ /* b0 */ 0x0000, 0x0000, 0x985e, 0x0000, 0x0000, 0xe845, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe844, 0xe846,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x062db ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fb, 0x0000, 0x0000, 0xfb4d,
+ /* 88 */ 0xef58, 0xef59, 0xef5a, 0x93e7, 0x0000, 0x9374, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfb4e, 0x0000, 0x0000, 0x92d5, 0x0000, 0xe84b, 0xfb4f,
+ /* 98 */ 0x0000, 0x0000, 0xfb50, 0x9262, 0xe847, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe848, 0x0000, 0x0000, 0x0000, 0xef5b, 0xef5c, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xef5d, 0xfb51, 0x8c4c, 0x0000, 0xe84a, 0x0000,
+ /* b0 */ 0xef5e, 0xfb52, 0x0000, 0xfb53, 0x0000, 0x8cae, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe849, 0x0000, 0x8fdf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x0631a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xfb57, 0x0000, 0x0000, 0xfb58, 0x8a99, 0x0000, 0x0000, 0xfb59,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe84f, 0x0000, 0x8dbd, 0x9199,
+ /* 98 */ 0x0000, 0x0000, 0x92c8, 0xef5f, 0x0000, 0x0000, 0xfb5a, 0x0000,
+ /* a0 */ 0x0000, 0xfb54, 0x0000, 0xef60, 0x0000, 0x0000, 0x0000, 0x8a5a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe84d, 0xe84e, 0x92c1, 0x0000,
+ /* b0 */ 0xe84c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe850, 0xef61, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x06359 ***/
+
+ /* 80 */ 0x0000, 0xfb5f, 0x0000, 0xe856, 0x0000, 0x0000, 0xef62, 0xfb60,
+ /* 88 */ 0xe859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe858, 0x934c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe851, 0xe852,
+ /* 98 */ 0xe855, 0x0000, 0x0000, 0x0000, 0xfb61, 0xe857, 0xef63, 0xef64,
+ /* a0 */ 0x0000, 0x8bbe, 0xfb62, 0x0000, 0xe85a, 0xe854, 0x0000, 0xfb63,
+ /* a8 */ 0xe853, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfb5e, 0x0000, 0x0000, 0x0000, 0xfb5b, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfb68, 0x0000, 0xef66,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x06397 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe85e, 0xef65, 0x0000, 0x0000, 0xe85f,
+ /* 88 */ 0x0000, 0xfb64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb65,
+ /* 90 */ 0xe860, 0x0000, 0x0000, 0xe85d, 0xe85c, 0x0000, 0xfb66, 0xfb67,
+ /* 98 */ 0x8fe0, 0x93a8, 0xe85b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe862, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfb69, 0xef67, 0xfb6a, 0xe863, 0xe861, 0x0000,
+ /* b8 */ 0x91f6, 0x0000, 0xe865, 0xfb6b, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x063d6 ***/
+
+ /* 80 */ 0x0000, 0xe866, 0x0000, 0x0000, 0xe868, 0xfb6c, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xef68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8ad3, 0xe867, 0x96f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe873, 0xe869, 0x0000, 0x0000, 0xe86c, 0x0000,
+ /* a0 */ 0xe86a, 0x0000, 0xe86b, 0xef69, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe86d, 0xef6a, 0x0000, 0xfb6f, 0x0000, 0xfb70,
+ /* b0 */ 0xe86f, 0xef6b, 0xef6c, 0x0000, 0x0000, 0xe870, 0x0000, 0xe871,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe874, 0xe872, 0xe875, 0xe877,
+
+ /*** Three byte table, leaf: e992xx - offset 0x06416 ***/
+
+ /* 80 */ 0x0000, 0xe876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x0641f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b7,
+ /* b8 */ 0xfb71, 0xfb72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x0645f ***/
+
+ /* 80 */ 0x96e5, 0x0000, 0xe878, 0x914d, 0x0000, 0x0000, 0xfb73, 0xe879,
+ /* 88 */ 0x0000, 0x95c2, 0xe87a, 0x8a4a, 0xfb74, 0xfb75, 0xef6d, 0x895b,
+ /* 90 */ 0x0000, 0x8ad5, 0x0000, 0x8ad4, 0xe87b, 0x0000, 0xe87c, 0x0000,
+ /* 98 */ 0xe87d, 0xe87e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef6e,
+ /* a0 */ 0xe880, 0x0000, 0x8ad6, 0x8a74, 0x8d7d, 0x94b4, 0xef6f, 0xe882,
+ /* a8 */ 0xe881, 0xef70, 0x0000, 0xfb77, 0xef71, 0xe883, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x897b, 0x0000, 0xfb78, 0x0000, 0xef72, 0x0000,
+ /* b8 */ 0x0000, 0xe886, 0x0000, 0xe885, 0xe884, 0xef73, 0xe887,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x0649e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe88a, 0x0000, 0x0000, 0x0000, 0x88c5,
+ /* 88 */ 0xfb7a, 0x0000, 0xe888, 0xef74, 0xe88c, 0xe88b, 0x0000, 0x0000,
+ /* 90 */ 0xef75, 0x0000, 0x0000, 0xef76, 0xe88e, 0xe88d, 0xe88f, 0x0000,
+ /* 98 */ 0x93ac, 0x0000, 0xef78, 0x0000, 0xe890, 0x0000, 0xef79, 0x0000,
+ /* a0 */ 0x0000, 0xe891, 0xe893, 0x0000, 0x0000, 0xe892,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x064c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x958c, 0xfaa3, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe895, 0x0000, 0x8de3, 0x0000, 0xfb7d, 0x0000, 0xe896, 0xe897,
+ /* b0 */ 0x0000, 0x0000, 0x9668, 0xfb7e, 0xfb80, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x916a, 0xfb82, 0x0000, 0x0000, 0x88a2,
+
+ /*** Three byte table, leaf: e999xx - offset 0x06504 ***/
+
+ /* 80 */ 0x91c9, 0xfb83, 0xe898, 0x0000, 0x958d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe89b, 0xe899, 0x8d7e, 0x0000, 0xe89a,
+ /* 90 */ 0x8cc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xef7a, 0x0000, 0x0000, 0x95c3, 0xe89d, 0xe89f, 0xe89e, 0xe8a0,
+ /* a0 */ 0x0000, 0xfb84, 0x8940, 0x9077, 0x8f9c, 0x8ad7, 0xe8a1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9486, 0x0000, 0xe8a3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8941, 0x0000, 0xe8a2, 0x92c2, 0x0000, 0x97cb, 0x93a9, 0xe89c,
+ /* b8 */ 0x97a4, 0x0000, 0x8caf, 0x0000, 0x0000, 0x977a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x06542 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfb86, 0x0000, 0xef7b, 0x8bf7, 0x97b2, 0x0000,
+ /* 88 */ 0x8c47, 0x0000, 0x91e0, 0xe440, 0x0000, 0xe8a4, 0x8a4b, 0x908f,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8a75, 0xe8a6, 0x0000, 0xe8a7,
+ /* 98 */ 0xe8a5, 0x8c84, 0xfb88, 0x8ddb, 0x8fe1, 0xef7d, 0x0000, 0x0000,
+ /* a0 */ 0x8942, 0x0000, 0x0000, 0x97d7, 0xef7e, 0xef80, 0x0000, 0xe8a9,
+ /* a8 */ 0xe7ac, 0xfb8b, 0xe8a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb8c,
+ /* b0 */ 0xe8ac, 0xe8aa, 0xe8ab, 0xfb8d, 0xe8ad, 0x0000, 0xe8ae, 0x97ea,
+ /* b8 */ 0xe8af, 0xe8b0, 0xfb8e, 0x90c7, 0x94b9, 0xfb8f, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x06582 ***/
+
+ /* 80 */ 0x909d, 0x8ae5, 0x0000, 0x0000, 0x9759, 0x89eb, 0x8f57, 0x8cd9,
+ /* 88 */ 0x0000, 0xe8b3, 0x0000, 0xe8b2, 0x8e93, 0xe8b4, 0xe8b1, 0x0000,
+ /* 90 */ 0x0000, 0x8e47, 0xef81, 0x0000, 0x0000, 0xe8b8, 0xe5ab, 0x0000,
+ /* 98 */ 0xfb92, 0x99d4, 0xfb93, 0x9097, 0xe8b6, 0xfb94, 0xef82, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x97a3, 0x93ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x894a, 0xef84, 0x90e1, 0x8eb4, 0x0000, 0x0000, 0x0000, 0xef85,
+ /* b0 */ 0x95b5, 0x0000, 0x895f, 0x0000, 0x0000, 0x0000, 0x97eb, 0x978b,
+ /* b8 */ 0x0000, 0xe8b9, 0x0000, 0x9364, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x065c2 ***/
+
+ /* 80 */ 0x8ef9, 0x0000, 0x0000, 0x0000, 0xe8ba, 0x0000, 0xe8bb, 0x906b,
+ /* 88 */ 0xe8bc, 0x0000, 0x97ec, 0x0000, 0x0000, 0xe8b7, 0xe8be, 0xe8c0,
+ /* 90 */ 0x0000, 0xe8bf, 0x0000, 0xe8bd, 0xfb96, 0x0000, 0xe8c1, 0x0000,
+ /* 98 */ 0x0000, 0xe8c2, 0x0000, 0x0000, 0x919a, 0x0000, 0x89e0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfb97, 0xe8c3, 0x0000, 0x0000, 0x96b6,
+ /* a8 */ 0x0000, 0x0000, 0xe8c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8c5, 0x0000, 0x9849, 0xef86, 0x0000, 0x0000, 0xfb99, 0x0000,
+ /* b8 */ 0x9e50, 0xe8c6, 0x0000, 0xef87, 0x0000, 0xe8c7, 0xe8c8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x06601 ***/
+
+ /* 80 */ 0x0000, 0xfb9a, 0xe8cc, 0x0000, 0xe8c9, 0x0000, 0xe8ca, 0xfb9b,
+ /* 88 */ 0xe8cb, 0xe8cd, 0x0000, 0x0000, 0x0000, 0xef88, 0xef89, 0xef8a,
+ /* 90 */ 0x0000, 0x0000, 0x90c2, 0x0000, 0x0000, 0xfb9c, 0x96f5, 0xfb9d,
+ /* 98 */ 0x0000, 0x90c3, 0xef8b, 0xfb9e, 0xe8ce, 0x0000, 0x94f1, 0x0000,
+ /* a0 */ 0xe8cf, 0xea72, 0x96ca, 0x0000, 0xe8d0, 0x0000, 0xe8d1, 0x0000,
+ /* a8 */ 0xe8d2, 0x8a76, 0xfb9f, 0xe8d4, 0x0000, 0x9078, 0xef8c, 0x0000,
+ /* b0 */ 0x0000, 0xe8d5, 0x0000, 0xef8d, 0x8c43, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe8d6, 0xe8da, 0x0000, 0xe8d8, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x06640 ***/
+
+ /* 80 */ 0x0000, 0xe8d9, 0x0000, 0x0000, 0x8a93, 0xe8d7, 0xe8db, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8dc, 0x0000, 0x88c6, 0x0000, 0xe8dd,
+ /* 90 */ 0xe8de, 0x0000, 0x0000, 0x0000, 0x0000, 0xef8e, 0xfba2, 0x0000,
+ /* 98 */ 0x8fe2, 0x0000, 0xfba3, 0x0000, 0xe8df, 0x0000, 0xfba4, 0x0000,
+ /* a0 */ 0x8b66, 0x0000, 0xfba5, 0xe8e2, 0x0000, 0x0000, 0xe8e1, 0x0000,
+ /* a8 */ 0xe8e0, 0x0000, 0x0000, 0xe691, 0x0000, 0x95da, 0xef8f, 0x0000,
+ /* b0 */ 0x0000, 0xfba6, 0xfba7, 0xe8e3, 0xe8e4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xef90, 0x0000, 0x0000, 0x0000, 0xfba8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x0667f ***/
+
+ /* 80 */ 0x0000, 0xef91, 0x0000, 0xe8e5, 0x0000, 0x0000, 0xe8e6, 0x0000,
+ /* 88 */ 0xe8e7, 0xef92, 0x0000, 0xe8e8, 0xfba9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfbaa, 0x0000, 0x8ad8, 0xfbab, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfbac, 0xfbad, 0x0000, 0xef94, 0xe8e9, 0x0000, 0xef93, 0x0000,
+ /* a0 */ 0x0000, 0xfbae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ea, 0x9442, 0x0000,
+ /* b0 */ 0x0000, 0xfbaf, 0xe8ec, 0x89b9, 0xef95, 0xe8ef, 0xe8ee, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8943, 0x0000, 0x0000, 0x0000, 0x8bbf,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x066bf ***/
+
+ /* 80 */ 0x0000, 0x95c5, 0x92b8, 0x8da0, 0xfbb0, 0x8d80, 0x8f87, 0x0000,
+ /* 88 */ 0x907b, 0x0000, 0xef97, 0x0000, 0xe8f1, 0xfbb1, 0xfbb2, 0xe8f0,
+ /* 90 */ 0x9761, 0x8ae6, 0x94d0, 0x93da, 0xfbb3, 0x0000, 0xfbb4, 0x909c,
+ /* 98 */ 0x97cc, 0x0000, 0x8c7a, 0x0000, 0x0000, 0x0000, 0xef98, 0x0000,
+ /* a0 */ 0x0000, 0xe8f4, 0x0000, 0xfbb7, 0xe8f3, 0xfbba, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xef99, 0x966a, 0x93aa, 0x0000, 0x0000,
+ /* b0 */ 0xef9a, 0x0000, 0xfbb8, 0xfbb9, 0x896f, 0x0000, 0x0000, 0xe8f5,
+ /* b8 */ 0xe8f2, 0x0000, 0x0000, 0x9570, 0x978a, 0xe8f6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x066fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f7, 0xfbbb,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8f9, 0x91e8, 0x8a7a, 0x8a7b, 0xe8f8,
+ /* 90 */ 0x0000, 0x0000, 0xef9c, 0xef9d, 0x8ae7, 0x8cb0, 0xef9e, 0xef9f,
+ /* 98 */ 0x8ae8, 0xefa0, 0xefa1, 0x935e, 0x0000, 0x0000, 0x97de, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefa3, 0xfbbc, 0x8cda,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe8fa, 0xefa4, 0x0000, 0x0000, 0xe8fb,
+ /* b0 */ 0xe8fc, 0xe940, 0x0000, 0xe942, 0xe941,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x06732 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9597, 0x0000, 0xe943, 0xfbbd, 0x0000, 0xfbbe, 0x0000, 0xe944,
+ /* b0 */ 0xfbbf, 0xe945, 0x0000, 0x0000, 0x0000, 0x0000, 0xe946, 0xfbc1,
+ /* b8 */ 0xfbc2, 0x0000, 0xefa5, 0xfbc3, 0xfbc4, 0x0000, 0x0000, 0xfbc5,
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x06772 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfbc6, 0xe948, 0xe947, 0x0000, 0xe949, 0xfbc7,
+ /* 88 */ 0xefa6, 0x0000, 0x0000, 0xfbc8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x94f2, 0xe3ca, 0x0000, 0x0000, 0x9048,
+ /* a0 */ 0xfbc9, 0xfbcb, 0x8b51, 0xfbcc, 0x0000, 0xfbcd, 0x0000, 0xefa7,
+ /* a8 */ 0x0000, 0xe94a, 0xfbce, 0xe94b, 0x0000, 0x99aa, 0x9f5a, 0x94d1,
+ /* b0 */ 0xfbcf, 0xfbd0, 0x88f9, 0xfbd1, 0x88b9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8e94, 0x964f, 0x8ffc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x067b1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe94c, 0x0000, 0x96dd, 0x0000, 0x0000,
+ /* 88 */ 0xfbd2, 0xe94d, 0x977b, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8e60, 0x0000, 0xe94e, 0x89ec, 0xe94f, 0x0000, 0xfbd5, 0xfbd6,
+ /* 98 */ 0xe950, 0x0000, 0xfbd8, 0xfbd9, 0xfbda, 0xe952, 0xe953, 0x0000,
+ /* a0 */ 0xe955, 0xe951, 0x0000, 0x0000, 0xe954, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8ad9, 0x0000, 0x0000, 0x0000, 0xe956, 0x0000, 0xe957, 0x0000,
+ /* b0 */ 0x0000, 0xfbdc, 0xfbdd, 0xfbde, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfbdf, 0xfbe0, 0xfbe1, 0xe958, 0xe959, 0x0000,
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x067f1 ***/
+
+ /* 80 */ 0xfbe2, 0xfbe3, 0xe95a, 0x0000, 0x0000, 0xe95c, 0xfbe4, 0x0000,
+ /* 88 */ 0x0000, 0xe95b, 0x0000, 0xe95e, 0xe961, 0xfbe5, 0xfbe6, 0x0000,
+ /* 90 */ 0xe95d, 0xe95f, 0xe960, 0x0000, 0x0000, 0xe962, 0x0000, 0x8bc0,
+ /* 98 */ 0xefa8, 0x0000, 0x0000, 0x0000, 0xfbe7, 0x0000, 0x0000, 0xfbe8,
+ /* a0 */ 0xfbe9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x0681b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ef1, 0xe963,
+ /* 98 */ 0xe964, 0x8d81, 0x0000, 0x0000, 0x0000, 0x0000, 0xefa9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfbea, 0x0000, 0xe965, 0xfbeb, 0x0000,
+ /* a8 */ 0x8a5d, 0x0000, 0x0000, 0x0000, 0x946e, 0xe966, 0xe967, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9279, 0x93e9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfbec, 0x0000, 0x0000, 0xe968, 0xfbed, 0x0000, 0xfbee,
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x0685b ***/
+
+ /* 80 */ 0x0000, 0x949d, 0x0000, 0xfbef, 0x91ca, 0x8977, 0x8bec, 0x0000,
+ /* 88 */ 0x8bed, 0xfbf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9293, 0xe96d, 0x8bee, 0x0000, 0xfbf1, 0x89ed, 0x0000, 0x0000,
+ /* 98 */ 0xe96c, 0xfbf2, 0x0000, 0xe96a, 0x0000, 0xe96b, 0xfbf3, 0xe969,
+ /* a0 */ 0x0000, 0x0000, 0xe977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe96e, 0xe96f, 0x0000,
+ /* b0 */ 0xfbf5, 0xe970, 0xe971, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe973, 0xfbf6, 0x0000, 0xe972, 0xfbf7, 0x0000, 0x0000, 0x8f78,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x0689b ***/
+
+ /* 80 */ 0x0000, 0xe974, 0xefaa, 0xefab, 0x0000, 0xe976, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfbf8, 0x0000, 0x0000, 0x0000, 0x8b52, 0xe975,
+ /* 90 */ 0x0000, 0xfbf9, 0x919b, 0x8cb1, 0x0000, 0x0000, 0xfbfa, 0x0000,
+ /* 98 */ 0x0000, 0xe978, 0xfbfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfbfc, 0x0000, 0x0000, 0x0000, 0xefac, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x91cb, 0x0000, 0x0000, 0xe979, 0x0000, 0xefad, 0xefae, 0x0000,
+ /* b0 */ 0x93ab, 0xfc40, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc41, 0xe97a,
+ /* b8 */ 0xefaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe980, 0x0000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x068db ***/
+
+ /* 80 */ 0xe97d, 0x0000, 0xe97c, 0xe97e, 0xfc42, 0xe97b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xefb0, 0x0000, 0xfc43, 0xe982, 0xefb1, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xefb2, 0x0000, 0x0000, 0xe981, 0x0000, 0xe984,
+ /* 98 */ 0xfc44, 0x0000, 0x8bc1, 0xe983, 0x0000, 0x0000, 0x0000, 0xe985,
+ /* a0 */ 0x0000, 0x0000, 0xe986, 0x0000, 0xe988, 0xe987, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe989, 0xe98b, 0xe98a,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x06907 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8d9c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe98c, 0x0000, 0xfc46,
+ /* b0 */ 0xe98d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefb3, 0xfc48,
+ /* b8 */ 0x8a5b, 0xfc4a, 0x0000, 0x0000, 0xe98e, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x06947 ***/
+
+ /* 80 */ 0xe98f, 0xefb4, 0x0000, 0xefb5, 0x9091, 0x0000, 0xfc4c, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefb6, 0xe990,
+ /* 90 */ 0xfc4d, 0xe991, 0xfc4e, 0xe992, 0xe993, 0xfc4f, 0xefb7, 0x0000,
+ /* 98 */ 0x8d82, 0x0000, 0x0000, 0x0000, 0xfc51, 0x0000, 0xe994, 0xe995,
+ /* a0 */ 0xfc52, 0x0000, 0xe996, 0xe997, 0x0000, 0xfc53, 0xe998, 0x0000,
+ /* a8 */ 0x0000, 0xfc54, 0x94af, 0xe99a, 0x0000, 0x9545, 0xe99b, 0xe999,
+ /* b0 */ 0x0000, 0xe99d, 0x0000, 0x0000, 0xe99c, 0x0000, 0x0000, 0xe99e,
+ /* b8 */ 0x0000, 0xefb8, 0x0000, 0xe99f, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x06985 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xefb9, 0xfc55, 0x0000, 0x0000, 0xe9a0, 0x0000,
+ /* 88 */ 0xefba, 0x0000, 0x0000, 0x0000, 0xfc56, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfc57, 0x0000, 0xfc58, 0x0000, 0x0000, 0x0000, 0xfc59, 0x0000,
+ /* 98 */ 0xe9a1, 0x0000, 0xe9a2, 0x0000, 0xfc5a, 0x0000, 0x0000, 0xe9a3,
+ /* a0 */ 0xefbb, 0x0000, 0xe9a4, 0xe9a5, 0x0000, 0xe9a6, 0x0000, 0xe9a7,
+ /* a8 */ 0xe9a8, 0xe9a9, 0xe9aa, 0xfc5b, 0x0000, 0xefbd, 0xe9ab, 0xe9ac,
+ /* b0 */ 0x0000, 0x9f54, 0xe9ad, 0xfc5c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe2f6, 0x8b53, 0xfc5d, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x069c4 ***/
+
+ /* 80 */ 0x0000, 0x8a40, 0x8db0, 0xe9af, 0xe9ae, 0x96a3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xfc5f, 0x0000, 0xe9b1, 0xe9b2, 0xe9b0,
+ /* 90 */ 0x0000, 0xe9b3, 0x0000, 0x0000, 0x9682, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe9b4, 0x0000, 0x8b9b, 0x0000, 0x0000, 0x0000, 0xefbe, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfc60, 0x0000, 0xfc61, 0xefc0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfc62, 0xfc63, 0x0000, 0x0000, 0x9844,
+ /* b0 */ 0x0000, 0x0000, 0xefc1, 0xfc64, 0xe9b5, 0xefc2, 0xfc65, 0xfc66,
+ /* b8 */ 0x0000, 0xefbf, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x06a01 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe9b7, 0xefc3, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xefc4, 0x0000, 0x0000, 0x0000, 0x88bc, 0xefc5,
+ /* 90 */ 0x0000, 0xe9b8, 0x95a9, 0xe9b6, 0x0000, 0x0000, 0xe9b9, 0xe9ba,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefc6, 0xe9bb,
+ /* a0 */ 0xe9bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc67, 0xefc7,
+ /* a8 */ 0xe9bd, 0x0000, 0x968e, 0x8e4c, 0xfc68, 0x8df8, 0x914e, 0x0000,
+ /* b0 */ 0x0000, 0xfc69, 0xfc6c, 0x0000, 0xe9be, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfc6d, 0xe9c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc6e, 0x0000,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x06a41 ***/
+
+ /* 80 */ 0xe9bf, 0xefc8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c2, 0xfc6f,
+ /* 88 */ 0x0000, 0x8cef, 0xe9c0, 0x0000, 0x0000, 0x0000, 0xefc9, 0xe9c3,
+ /* 90 */ 0x0000, 0xe9c4, 0xe9c5, 0x0000, 0xe9c9, 0x0000, 0x8e49, 0x0000,
+ /* 98 */ 0xfc71, 0x0000, 0x0000, 0x91e2, 0x0000, 0xfc72, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe9ca, 0xe9c7, 0xe9c6, 0xe9c8, 0xefca, 0x0000, 0xfc73,
+ /* a8 */ 0x8c7e, 0x0000, 0xfc74, 0xfc75, 0x0000, 0x0000, 0xfc77, 0xfc76,
+ /* b0 */ 0xe9ce, 0xe9cd, 0xe9cc, 0xfc70, 0x0000, 0x88b1, 0x0000, 0xfc7b,
+ /* b8 */ 0xefcb, 0x0000, 0xfc79, 0x0000, 0x0000, 0xefcc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x06a81 ***/
+
+ /* 80 */ 0xefcd, 0x0000, 0x0000, 0x0000, 0xe9d8, 0x0000, 0xe9d4, 0x0000,
+ /* 88 */ 0xe9d5, 0xe9d1, 0xe9d7, 0x0000, 0xe9d3, 0x8a82, 0x0000, 0x0000,
+ /* 90 */ 0x986b, 0x0000, 0xe9d6, 0xe9d2, 0xe9d0, 0xe9cf, 0xfc7d, 0x0000,
+ /* 98 */ 0xfc7e, 0xfc80, 0xfc81, 0xe9da, 0x0000, 0xfc82, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe9dd, 0xfc83, 0xefce, 0xe9dc, 0xe9db, 0x0000, 0xfc84,
+ /* a8 */ 0x0000, 0xfc85, 0xfc86, 0x0000, 0x0000, 0x9568, 0xe9d9, 0x88f1,
+ /* b0 */ 0xe9de, 0xfc88, 0xe9e0, 0x0000, 0x0000, 0x0000, 0xfc89, 0xfc8a,
+ /* b8 */ 0x0000, 0x8a8f, 0xe9cb, 0x8956, 0x0000, 0x0000, 0xe9e2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x06ac0 ***/
+
+ /* 80 */ 0x0000, 0xefcf, 0x0000, 0x0000, 0x0000, 0xfc8b, 0xe9e1, 0xe9df,
+ /* 88 */ 0x924c, 0xfc8e, 0xfc8f, 0x0000, 0x0000, 0x0000, 0x0000, 0xefd0,
+ /* 90 */ 0xefd1, 0x0000, 0x9690, 0xefd2, 0xfc91, 0x0000, 0x0000, 0x97d8,
+ /* 98 */ 0xfc92, 0x0000, 0xe9e3, 0xfc93, 0xfc8c, 0xfc94, 0x0000, 0xfc95,
+ /* a0 */ 0xe9e4, 0x0000, 0x0000, 0xefd3, 0x0000, 0xefd4, 0x0000, 0xe9e5,
+ /* a8 */ 0x0000, 0xfc96, 0xfc97, 0xfc98, 0x0000, 0xfc99, 0xfc9a, 0x0000,
+ /* b0 */ 0xfc9b, 0x0000, 0xfc9c, 0x0000, 0x0000, 0xfc9d, 0xe9e6, 0xefd5,
+ /* b8 */ 0xe9e7, 0x0000, 0xfc9e,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x06afb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b9, 0xfc9f, 0xe9e8,
+ /* a8 */ 0x0000, 0x94b5, 0x0000, 0xe9ed, 0xe9e9, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe9ea, 0x0000, 0xfca0, 0x9650, 0x96c2, 0x0000, 0x93ce, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x06b39 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfca2, 0xe9ee, 0x0000, 0x0000, 0xe9ef, 0x93bc,
+ /* 88 */ 0xe9ec, 0xe9eb, 0x0000, 0xfca1, 0x0000, 0x0000, 0x89a8, 0x0000,
+ /* 90 */ 0x0000, 0xfca4, 0xe9f7, 0x0000, 0x0000, 0xe9f6, 0x0000, 0xfca5,
+ /* 98 */ 0xfca6, 0x0000, 0x0000, 0x8995, 0x0000, 0xefd6, 0xefd7, 0xe9f4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe9f3, 0x0000, 0x0000, 0xe9f1, 0x0000,
+ /* a8 */ 0x8a9b, 0x0000, 0xe9f0, 0x8eb0, 0x89a7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfcaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8d83, 0x0000, 0x0000, 0xe9fa, 0xe9f9,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x06b79 ***/
+
+ /* 80 */ 0x0000, 0xe9f8, 0xfcac, 0xefd8, 0xe9f5, 0x0000, 0xe9fb, 0xefd9,
+ /* 88 */ 0xe9fc, 0x0000, 0xfcad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xea44, 0xea43, 0xefda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xea45, 0x0000, 0x0000, 0x894c, 0xea40, 0xea41, 0xfcae,
+ /* a0 */ 0x8d94, 0x96b7, 0xfcaf, 0xefdb, 0xea42, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfcb1, 0x0000, 0xfcb2, 0x9651, 0x0000, 0x0000, 0xea4a,
+ /* b0 */ 0xefdc, 0x0000, 0xea46, 0xfcb4, 0x0000, 0x0000, 0xfcb5, 0xfcb6,
+ /* b8 */ 0x0000, 0x0000, 0xea4b, 0x0000, 0xefdd, 0x0000, 0xfcb7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x06bb8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcb8, 0x0000, 0x0000, 0xea48,
+ /* 88 */ 0x0000, 0xea47, 0xefde, 0x0000, 0x0000, 0xfcb9, 0x0000, 0x8c7b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefdf, 0x0000,
+ /* 98 */ 0x0000, 0xfcba, 0xea4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfcbb, 0x0000, 0x0000, 0xea4d, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xea4e, 0x0000, 0xea49, 0xefe1, 0x0000, 0x0000, 0xe9f2,
+ /* b0 */ 0x0000, 0x0000, 0xea4f, 0x0000, 0x92df, 0xfcbd, 0x0000, 0x0000,
+ /* b8 */ 0xea53, 0xfcbe, 0xea54, 0xea52, 0xefe2, 0xfcbf, 0x0000, 0xfcbc,
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x06bf8 ***/
+
+ /* 80 */ 0xefe0, 0xea51, 0xea57, 0xfcc0, 0xea50, 0x0000, 0xea55, 0xfcc1,
+ /* 88 */ 0x0000, 0xfcc2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea56,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xea59, 0x0000, 0x0000, 0xfcc3, 0xefe3,
+ /* 98 */ 0x0000, 0xea58, 0xfcc4, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc5,
+ /* a0 */ 0xfcc6, 0x0000, 0x0000, 0xfcc7, 0x0000, 0x0000, 0xea5b, 0xefe5,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea5c, 0x0000, 0xea5d,
+ /* b0 */ 0x0000, 0x0000, 0x9868, 0x0000, 0xfcc8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xea5a, 0x91e9, 0x8deb, 0x0000, 0x0000, 0xea5e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x06c36 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfccb, 0x0000, 0x0000, 0x0000, 0x0000, 0xefe6,
+ /* 88 */ 0x0000, 0x0000, 0xfcca, 0x0000, 0x0000, 0xfccc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefe7, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfccd, 0xea5f, 0xea60, 0xfcce, 0xfccf, 0xea61,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x06c55 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea62, 0x0000, 0x0000,
+ /* b8 */ 0x8cb2, 0xea63, 0x0000, 0xfcd0, 0xefe8, 0xea64, 0x0000, 0x8ead,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x06c95 ***/
+
+ /* 80 */ 0xfcd2, 0xea65, 0x0000, 0x0000, 0x0000, 0xfcd3, 0x0000, 0x0000,
+ /* 88 */ 0xea66, 0x0000, 0x0000, 0xea67, 0xea68, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xea6b, 0xea69, 0x985b, 0x0000, 0xea6a, 0x0000, 0x97ed,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfcd4, 0x0000, 0xea6c, 0xefe9, 0x97d9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xefea, 0xea6d, 0x949e, 0x0000,
+ /* a8 */ 0xfcd5, 0xea6e, 0xea70, 0x0000, 0xefeb, 0xea71, 0x0000, 0xefec,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xefed, 0xefee, 0x0000, 0x0000,
+ /* b8 */ 0xea6f, 0x8d8d, 0x96cb, 0x9683, 0x9bf5, 0xfcd7, 0x9f80, 0x969b,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x06cd5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xefef, 0x89a9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea73, 0x8b6f, 0xea74, 0xea75,
+ /* 90 */ 0xea76, 0xeff0, 0x8d95, 0x0000, 0xea77, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe0d2, 0x96d9, 0x0000, 0x91e1, 0xea78, 0xea7a, 0xea79, 0xfcd9,
+ /* a0 */ 0xea7b, 0x0000, 0x0000, 0x0000, 0x0000, 0xea7c, 0x0000, 0xfcda,
+ /* a8 */ 0xea7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcdb, 0xea7e,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea80, 0x0000, 0xea81, 0xea82,
+ /* b8 */ 0x0000, 0xea83, 0x0000, 0xea84, 0xea85, 0xea86, 0x0000, 0xfcdc,
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x06d15 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfcdd, 0xfcdf, 0x0000, 0x0000, 0x0000, 0xea87,
+ /* 88 */ 0xea88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9343, 0x0000,
+ /* 90 */ 0xeff1, 0x0000, 0x0000, 0x8cdb, 0x0000, 0xea8a, 0x0000, 0xfce0,
+ /* 98 */ 0x0000, 0xfce1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x916c, 0xea8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea8c, 0x0000, 0x0000, 0xfce2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfce3,
+ /* b8 */ 0x0000, 0xeff2, 0xfce4, 0x9540, 0x0000, 0xfce5, 0xea8d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x06d54 ***/
+
+ /* 80 */ 0x0000, 0xfce6, 0x0000, 0x0000, 0x0000, 0xfce7, 0xfce8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xea8e, 0xe256, 0x0000, 0x0000, 0xe6d8, 0xe8eb,
+ /* 90 */ 0x0000, 0x0000, 0xea8f, 0xfce9, 0xea90, 0xfcea, 0x0000, 0xeff3,
+ /* 98 */ 0xfceb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfced, 0x0000, 0xea92,
+ /* a0 */ 0xea93, 0xea94, 0x97ee, 0xea91, 0x0000, 0x0000, 0xea95, 0xea96,
+ /* a8 */ 0x0000, 0xfcef, 0xea98, 0x0000, 0xea97, 0xfcf1, 0x0000, 0x0000,
+ /* b0 */ 0xfcf2, 0x0000, 0xea9a, 0x0000, 0x0000, 0xfcf3, 0xea9b, 0xea99,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x06d8c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97b4, 0x0000, 0x0000,
+ /* 90 */ 0xeff4, 0x0000, 0x0000, 0x0000, 0xeff5, 0xea9c, 0x0000, 0xeff6,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea9d, 0xe273, 0x0000, 0x0000,
+ /* a0 */ 0xea9e, 0x0000, 0xeff7,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x06daf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeaac, 0xeb6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee6e,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa5xx - offset 0x06de6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebc7,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa7xx - offset 0x06e17 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xefa2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xef7c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x06e48 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886a,
+ /* 90 */ 0x8876, 0x9892, 0x0000, 0xf3f7, 0xeb9a, 0xec79, 0xec8f, 0x0000,
+ /* 98 */ 0x0000, 0xed5b, 0xed5c, 0xed60, 0x0000, 0x0000, 0x0000, 0xee59,
+ /* a0 */ 0xf957, 0xf964, 0xeeac, 0x0000, 0xfa8e, 0x0000, 0xeee8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x87b6, 0x87c7, 0x87ce, 0x87e1, 0x87e6, 0x87ec, 0x884b, 0x884e,
+ /* b8 */ 0x8855, 0x8879, 0x887d, 0x9881, 0x9882, 0xeace, 0xeada, 0xeadc,
+
+ /*** Three byte table, leaf: efa9xx - offset 0x06e88 ***/
+
+ /* 80 */ 0xeadf, 0xeb47, 0xeb4a, 0xeb62, 0xeb85, 0xebe7, 0xebf5, 0xec44,
+ /* 88 */ 0xec74, 0xf5a7, 0xeca3, 0xed46, 0xed52, 0xed53, 0xed56, 0xed57,
+ /* 90 */ 0xed58, 0xed5a, 0xed5e, 0xed5f, 0xed6c, 0xed70, 0xed84, 0xedac,
+ /* 98 */ 0xf7ce, 0xedb1, 0xedb8, 0xedc2, 0xedd6, 0xf894, 0xf895, 0xee46,
+ /* a0 */ 0xee8f, 0xee99, 0xeead, 0xeeae, 0xeeb6, 0xeebb, 0xfa89, 0xeed7,
+ /* a8 */ 0xef83, 0xef96, 0xef9b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efb9xx - offset 0x06ec3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x825d, 0x825c, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x06f02 ***/
+
+ /* 80 */ 0x0000, 0x8149, 0x81ae, 0x8194, 0x8190, 0x8193, 0x8195, 0x81ad,
+ /* 88 */ 0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x81af, 0x8144, 0x815e,
+ /* 90 */ 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256,
+ /* 98 */ 0x8257, 0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148,
+ /* a0 */ 0x8197, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266,
+ /* a8 */ 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e,
+ /* b0 */ 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276,
+ /* b8 */ 0x8277, 0x8278, 0x8279, 0x816d, 0x0000, 0x816e, 0x814f, 0x8151,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x06f42 ***/
+
+ /* 80 */ 0x814d, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287,
+ /* 88 */ 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f,
+ /* 90 */ 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297,
+ /* 98 */ 0x8298, 0x8299, 0x829a, 0x816f, 0x8162, 0x8170, 0x0000, 0x81d4,
+ /* a0 */ 0x81d5, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Three byte table, leaf: efbexx - offset 0x06f82 ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbfxx - offset 0x06fa2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8150, 0x0000, 0x818f, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Four byte table, byte #1: xx - offset 0x06fe2 ***/
+
+ /* f0 */ 0x6fe3,
+
+ /*** Four byte table, byte #2: f0xx - offset 0x06fe3 ***/
+
+ /* a0 */ 0x6fee, 0x702c, 0x706c, 0x70a6, 0x70e4, 0x7123, 0x7163, 0x71a3,
+ /* a8 */ 0x71e2, 0x7222, 0x7262,
+
+ /*** Four byte table, byte #3: f0a0xx - offset 0x06fee ***/
+
+ /* 80 */ 0x7297, 0x0000, 0x72ce, 0x0000, 0x0000, 0x0000, 0x72f3, 0x0000,
+ /* 88 */ 0x7320, 0x0000, 0x0000, 0x0000, 0x7335, 0x7361, 0x73a0, 0x73a7,
+ /* 90 */ 0x0000, 0x73e1, 0x0000, 0x0000, 0x7418, 0x0000, 0x0000, 0x7442,
+ /* 98 */ 0x745a, 0x0000, 0x0000, 0x0000, 0x0000, 0x748b, 0x0000, 0x0000,
+ /* a0 */ 0x74c4, 0x0000, 0x74ff, 0x0000, 0x0000, 0x7539, 0x7576, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x75a3, 0x75c6, 0x0000, 0x75e7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7622, 0x0000, 0x7641,
+ /* b8 */ 0x0000, 0x7663, 0x7691, 0x0000, 0x0000, 0x76b2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a1xx - offset 0x0702c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x76f1, 0x772f, 0x0000, 0x776b, 0x77a9, 0x77e5, 0x0000, 0x7821,
+ /* 90 */ 0x0000, 0x7834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7863,
+ /* 98 */ 0x0000, 0x789c, 0x78a8, 0x0000, 0x78e2, 0x7920, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x7923, 0x0000, 0x0000, 0x0000, 0x0000, 0x7961,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x798b, 0x0000, 0x0000, 0x79a2, 0x79dd, 0x7a16, 0x7a4e,
+ /* b8 */ 0x7a6f, 0x0000, 0x0000, 0x0000, 0x7aa4, 0x7ac3, 0x0000, 0x7afa,
+
+ /*** Four byte table, byte #3: f0a2xx - offset 0x0706c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b35, 0x0000, 0x0000,
+ /* 88 */ 0x7b71, 0x0000, 0x0000, 0x0000, 0x7b93, 0x0000, 0x7bb2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x7be0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x7c14, 0x7c30, 0x0000, 0x0000, 0x0000, 0x7c61, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x7c71, 0x0000, 0x0000, 0x7cab, 0x7cc5, 0x0000,
+ /* b0 */ 0x7cec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d11,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a3xx - offset 0x070a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d33, 0x7d70,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7da6, 0x0000, 0x7dd9,
+ /* 90 */ 0x0000, 0x7e0f, 0x0000, 0x7e35, 0x0000, 0x7e5b, 0x7e87, 0x7ec3,
+ /* 98 */ 0x7ecb, 0x7f06, 0x0000, 0x0000, 0x7f3a, 0x7f7a, 0x0000, 0x7f9f,
+ /* a0 */ 0x7fdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x801d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8036, 0x0000, 0x8076, 0x80b6, 0x80f6, 0x0000, 0x8123,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x815e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a4xx - offset 0x070e4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x819d, 0x0000, 0x81da, 0x0000, 0x0000, 0x8214,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8253, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8290, 0x0000, 0x82ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x82e0,
+ /* a0 */ 0x0000, 0x0000, 0x8312, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8345, 0x0000, 0x0000, 0x0000, 0x836f, 0x0000, 0x0000,
+ /* b0 */ 0x839f, 0x0000, 0x0000, 0x0000, 0x83cb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x83fd, 0x8435, 0x846a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a5xx - offset 0x07123 ***/
+
+ /* 80 */ 0x0000, 0x84a0, 0x0000, 0x0000, 0x84be, 0x0000, 0x84e1, 0x8514,
+ /* 88 */ 0x853a, 0x856e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8580, 0x0000, 0x85b2, 0x85d9, 0x860b, 0x0000, 0x8624, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x864c, 0x867e, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x86ba,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x86d7, 0x0000, 0x0000, 0x8709, 0x0000,
+ /* b0 */ 0x0000, 0x873e, 0x0000, 0x0000, 0x0000, 0x0000, 0x8763, 0x0000,
+ /* b8 */ 0x8785, 0x87b4, 0x0000, 0x87f2, 0x881b, 0x883f, 0x0000, 0x886b,
+
+ /*** Four byte table, byte #3: f0a6xx - offset 0x07163 ***/
+
+ /* 80 */ 0x88a7, 0x88c7, 0x0000, 0x88e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8916, 0x8950, 0x0000, 0x0000, 0x8984, 0x0000, 0x0000,
+ /* 90 */ 0x89c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x89c5, 0x8a04, 0x0000, 0x8a35, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8a58, 0x0000, 0x8a87, 0x0000, 0x8ab7,
+ /* a8 */ 0x8ad9, 0x8b01, 0x8b35, 0x8b6d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8bad, 0x8bd7, 0x0000, 0x8c0b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8c4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c77, 0x8c8c,
+
+ /*** Four byte table, byte #3: f0a7xx - offset 0x071a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8cc5, 0x8cfa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d34,
+ /* 90 */ 0x8d73, 0x8daa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8dd6, 0x0000, 0x8e12, 0x0000, 0x8e44, 0x8e72, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ead, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8ee9, 0x0000, 0x0000, 0x0000, 0x8ef6, 0x8f35,
+ /* b0 */ 0x0000, 0x0000, 0x8f3d, 0x0000, 0x0000, 0x0000, 0x8f76, 0x0000,
+ /* b8 */ 0x8fa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fb7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, byte #3: f0a8xx - offset 0x071e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8fef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x902b, 0x9069, 0x9076, 0x0000, 0x0000, 0x0000, 0x90aa,
+ /* 90 */ 0x90de, 0x9109, 0x0000, 0x0000, 0x0000, 0x911f, 0x0000, 0x9157,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9180, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91bb, 0x91f4, 0x0000,
+ /* a8 */ 0x9230, 0x926d, 0x929f, 0x92d2, 0x0000, 0x0000, 0x0000, 0x9311,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9341, 0x9352, 0x0000, 0x9384,
+ /* b8 */ 0x93c0, 0x0000, 0x93f7, 0x940c, 0x9438, 0x0000, 0x0000, 0x946b,
+
+ /*** Four byte table, byte #3: f0a9xx - offset 0x07222 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x94d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x9507,
+ /* 98 */ 0x0000, 0x9517, 0x0000, 0x9557, 0x9588, 0x95b8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x95f2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9633,
+ /* b8 */ 0x965e, 0x969c, 0x96d2, 0x970e, 0x0000, 0x0000, 0x0000, 0x9740,
+
+ /*** Four byte table, byte #3: f0aaxx - offset 0x07262 ***/
+
+ /* 80 */ 0x9766, 0x0000, 0x97a4, 0x97ab, 0x0000, 0x0000, 0x97e5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9819, 0x0000,
+ /* 90 */ 0x9826, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x985e,
+ /* 98 */ 0x989c, 0x0000, 0x98dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a080xx - offset 0x07297 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x87a0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a082xx - offset 0x072ce ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf04a, 0x0000, 0xf04d,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a086xx - offset 0x072f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a088xx - offset 0x07320 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf065, 0x0000,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08cxx - offset 0x07335 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf090,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08dxx - offset 0x07361 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf099, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08exx - offset 0x073a0 ***/
+
+ /* 80 */ 0x0000, 0xf097, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 57 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a08fxx - offset 0x073a7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf141,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a091xx - offset 0x073e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a094xx - offset 0x07418 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a097xx - offset 0x07442 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf150, 0x0000,
+ /* 40 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a098xx - offset 0x0745a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf151, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a09dxx - offset 0x0748b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf157,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a0xx - offset 0x074c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf15e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf160,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a2xx - offset 0x074ff ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf169,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a5xx - offset 0x07539 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf171,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0a6xx - offset 0x07576 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf172, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0abxx - offset 0x075a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf178, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0acxx - offset 0x075c6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf17b, 0x0000, 0x0000,
+ /* a0 */ 0x0000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0aexx - offset 0x075e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9873,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b5xx - offset 0x07622 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf197, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b7xx - offset 0x07641 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf1a8,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0b9xx - offset 0x07663 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1b0,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0baxx - offset 0x07691 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1af, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a0bdxx - offset 0x076b2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1bb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a188xx - offset 0x076f1 ***/
+
+ /* 80 */ 0x0000, 0xf1d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a189xx - offset 0x0772f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1da, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf1dc,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18bxx - offset 0x0776b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e9,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1f0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18cxx - offset 0x077a9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x886b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1f2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18dxx - offset 0x077e5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1f3, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a18fxx - offset 0x07821 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf244, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000,
+ /* 45 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a191xx - offset 0x07834 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf251, 0x8880,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a197xx - offset 0x07863 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf25d,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a199xx - offset 0x0789c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf266,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 52 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19axx - offset 0x078a8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9883, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19cxx - offset 0x078e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf274, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a19dxx - offset 0x07920 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf275,
+ /* 61 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1a2xx - offset 0x07923 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x889b,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1a7xx - offset 0x07961 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf29e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b1xx - offset 0x0798b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ae,
+ /* 41 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b4xx - offset 0x079a2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b5xx - offset 0x079dd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf0b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf0b8,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b6xx - offset 0x07a16 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf0c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0be, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf0bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0c6,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b7xx - offset 0x07a4e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf0c8,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1b8xx - offset 0x07a6f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf0c9, 0x988e,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bcxx - offset 0x07aa4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d9,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bdxx - offset 0x07ac3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e4,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a1bfxx - offset 0x07afa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf0ea,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a285xx - offset 0x07b35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf2a0,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a288xx - offset 0x07b71 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfcd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a28cxx - offset 0x07b93 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a9,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a28exx - offset 0x07bb2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ae,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a29bxx - offset 0x07be0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf2ce,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a1xx - offset 0x07c14 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf2e3,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a2xx - offset 0x07c30 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf2eb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2a6xx - offset 0x07c61 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f0,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2aaxx - offset 0x07c71 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf343, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2adxx - offset 0x07cab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf351, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf348,
+ /* 90 */ 0xf349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000,
+ /* 38 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2aexx - offset 0x07cc5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf354,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2b0xx - offset 0x07cec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf353, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf358,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a2b7xx - offset 0x07d11 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf375,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a386xx - offset 0x07d33 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a387xx - offset 0x07d70 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf39d, 0xeb59, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a1,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a38dxx - offset 0x07da6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf3b8,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a38fxx - offset 0x07dd9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf3c0, 0x0000, 0xf3bb, 0xf3ba, 0x0000, 0xf3c2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3c5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a391xx - offset 0x07e0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3d3, 0xf3d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf3d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3d9,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a393xx - offset 0x07e35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3f5, 0x0000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a395xx - offset 0x07e5b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a396xx - offset 0x07e87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf449, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a397xx - offset 0x07ec3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeb92, 0x0000, 0x0000, 0x0000,
+ /* 56 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a398xx - offset 0x07ecb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf461, 0xf45e, 0xf462,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a399xx - offset 0x07f06 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf45f,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a39cxx - offset 0x07f3a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf478, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf46d, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba7,
+
+ /*** Four byte table, leaf: f0a39dxx - offset 0x07f7a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xebb0, 0xf481,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a39fxx - offset 0x07f9f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf48a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf489,
+
+ /*** Four byte table, leaf: f0a3a0xx - offset 0x07fdf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf490, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf495,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3aaxx - offset 0x0801d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf4a1,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3b1xx - offset 0x08036 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4b2,
+
+ /*** Four byte table, leaf: f0a3b3xx - offset 0x08076 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebde, 0x0000,
+
+ /*** Four byte table, leaf: f0a3b4xx - offset 0x080b6 ***/
+
+ /* 80 */ 0xf4c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Four byte table, leaf: f0a3b5xx - offset 0x080f6 ***/
+
+ /* 80 */ 0xf4da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3b7xx - offset 0x08123 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf4de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf4dd, 0xf4dc,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a3bdxx - offset 0x0815e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf551,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a482xx - offset 0x0819d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf566, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a484xx - offset 0x081da ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf56c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a487xx - offset 0x08214 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf581, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf584,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a48exx - offset 0x08253 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a498xx - offset 0x08290 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf5b1,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a49axx - offset 0x082ba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b7,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a49fxx - offset 0x082e0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xec8c,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4a2xx - offset 0x08312 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d1, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4a9xx - offset 0x08345 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4adxx - offset 0x0836f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf64d, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf64f,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b0xx - offset 0x0839f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf654, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b4xx - offset 0x083cb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf663, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b8xx - offset 0x083fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf67c, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf681,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4b9xx - offset 0x08435 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf686, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a4baxx - offset 0x0846a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf689, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a581xx - offset 0x084a0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf695, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf697, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 34 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a584xx - offset 0x084be ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf69a,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a586xx - offset 0x084e1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf69f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a587xx - offset 0x08514 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a1,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a588xx - offset 0x0853a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a589xx - offset 0x0856e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000,
+ /* 46 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a590xx - offset 0x08580 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6bb, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a592xx - offset 0x085b2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecfc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a593xx - offset 0x085d9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a594xx - offset 0x0860b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xed48, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000,
+ /* 39 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a596xx - offset 0x08624 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d9,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a59dxx - offset 0x0864c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xed66,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a59exx - offset 0x0867e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5a7xx - offset 0x086ba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xed73, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf751, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5abxx - offset 0x086d7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf75d, 0xf75c, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf75f,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5aexx - offset 0x08709 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf771, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b1xx - offset 0x0873e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf77c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf77d,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b6xx - offset 0x08763 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xed8e,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b8xx - offset 0x08785 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf793,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5b9xx - offset 0x087b4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf794, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf797, 0x0000, 0x0000, 0xf795, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bbxx - offset 0x087f2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf79d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf79b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf7a0,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bcxx - offset 0x0881b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf7a2,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bdxx - offset 0x0883f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a5bfxx - offset 0x0886b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7ad, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf7ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf7b3,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a680xx - offset 0x088a7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7bb,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a681xx - offset 0x088c7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf7c0,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a683xx - offset 0x088e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7cd,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a689xx - offset 0x08916 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf7e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a68axx - offset 0x08950 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a68dxx - offset 0x08984 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a690xx - offset 0x089c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf7f7,
+ /* 61 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a699xx - offset 0x089c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf854,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a69axx - offset 0x08a04 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf859,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a69cxx - offset 0x08a35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf865, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000,
+ /* 29 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a3xx - offset 0x08a58 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf875, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf877, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a5xx - offset 0x08a87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf87c,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a7xx - offset 0x08ab7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf87e, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000,
+ /* 30 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a8xx - offset 0x08ad9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf883, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 24 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6a9xx - offset 0x08b01 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf88a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6aaxx - offset 0x08b35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf890, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf893,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6abxx - offset 0x08b6d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeddb,
+
+ /*** Four byte table, leaf: f0a6b0xx - offset 0x08bad ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf263,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6b1xx - offset 0x08bd7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf8c2,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6b3xx - offset 0x08c0b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8cc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Four byte table, leaf: f0a6b9xx - offset 0x08c4b ***/
+
+ /* 80 */ 0xee52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6bexx - offset 0x08c77 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8f3,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a6bfxx - offset 0x08c8c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf940, 0xf941,
+ /* b8 */ 0xf8fc,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a783xx - offset 0x08cc5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xee68,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a784xx - offset 0x08cfa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf952, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf955,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a78fxx - offset 0x08d34 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf985, 0xf984, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf98b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a790xx - offset 0x08d73 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf98e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a791xx - offset 0x08daa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf993, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a798xx - offset 0x08dd6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9a8, 0xf9a7, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79axx - offset 0x08e12 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xee8c, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79cxx - offset 0x08e44 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ba, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf9bc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a79dxx - offset 0x08e72 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf9c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7a6xx - offset 0x08ead ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9d4, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7aaxx - offset 0x08ee9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9e1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7aexx - offset 0x08ef6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf9f5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7afxx - offset 0x08f35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f8,
+ /* 56 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b2xx - offset 0x08f3d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfa44,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b6xx - offset 0x08f76 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfa4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7b8xx - offset 0x08fa6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfa51,
+ /* 47 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a7bexx - offset 0x08fb7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa58,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a882xx - offset 0x08fef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfa61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfa67,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a889xx - offset 0x0902b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeec7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88axx - offset 0x09069 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfa78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88bxx - offset 0x09076 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfa7d,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a88fxx - offset 0x090aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeecf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a890xx - offset 0x090de ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa86, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a891xx - offset 0x09109 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa8b,
+ /* 42 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a895xx - offset 0x0911f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfa9a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a897xx - offset 0x09157 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xfa9e, 0xfa9f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000,
+ /* 23 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a89bxx - offset 0x09180 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaaa,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfaad,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a5xx - offset 0x091bb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xface, 0x0000,
+ /* 88 */ 0x0000, 0xfacd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfad5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a6xx - offset 0x091f4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfae3,
+ /* 88 */ 0xfae4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfaef, 0xfaf0,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a8xx - offset 0x09230 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfafc, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfb40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8a9xx - offset 0x0926d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfb4c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfb4b,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8aaxx - offset 0x0929f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfb55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8abxx - offset 0x092d2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb56, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb5d, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb5c, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8afxx - offset 0x09311 ***/
+
+ /* 80 */ 0x0000, 0xfb6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb6e,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b4xx - offset 0x09341 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfb76,
+ /* 47 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b5xx - offset 0x09352 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfb79,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b7xx - offset 0x09384 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfb7b,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8b8xx - offset 0x093c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb7c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb81,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8baxx - offset 0x093f7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfb85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 43 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bbxx - offset 0x0940c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfb87,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bcxx - offset 0x09438 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfb89,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a8bfxx - offset 0x0946b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfb91,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a98axx - offset 0x094a4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfba0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfba1,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a992xx - offset 0x094d6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfbb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a997xx - offset 0x09507 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbc0,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a999xx - offset 0x09517 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbca,
+
+ /*** Four byte table, leaf: f0a99bxx - offset 0x09557 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfbd4,
+ /* 15 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a99cxx - offset 0x09588 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfbd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a99dxx - offset 0x095b8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfbdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9a3xx - offset 0x095f2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbf4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 50 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9a9xx - offset 0x09600 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfc4b,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b7xx - offset 0x09633 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfc6a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b8xx - offset 0x0965e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc78, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc6b,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9b9xx - offset 0x0969c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfc7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9baxx - offset 0x096d2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfc7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9bbxx - offset 0x0970e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfc87, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfc90, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfc8d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0a9bfxx - offset 0x09740 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfca3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa80xx - offset 0x09766 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfca9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfca7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa82xx - offset 0x097a4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfcb3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 57 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa83xx - offset 0x097ab ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfcb0,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa86xx - offset 0x097e5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xefe4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa8exx - offset 0x09819 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcd6,
+ /* 51 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa90xx - offset 0x09826 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcd8,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa97xx - offset 0x0985e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Four byte table, leaf: f0aa98xx - offset 0x0989c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfcee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfcf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Four byte table, leaf: f0aa9axx - offset 0x098dc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfcf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+/* Combined character map */
+static const pg_utf_to_local_combined ULmapSHIFT_JIS_2004_combined[25] = {
+ {0x0000c3a6, 0x0000cc80, 0x8663}, /* U+00E6+0300 [2000] */
+ {0x0000c994, 0x0000cc80, 0x8667}, /* U+0254+0300 [2000] */
+ {0x0000c994, 0x0000cc81, 0x8668}, /* U+0254+0301 [2000] */
+ {0x0000c999, 0x0000cc80, 0x866b}, /* U+0259+0300 [2000] */
+ {0x0000c999, 0x0000cc81, 0x866c}, /* U+0259+0301 [2000] */
+ {0x0000c99a, 0x0000cc80, 0x866d}, /* U+025A+0300 [2000] */
+ {0x0000c99a, 0x0000cc81, 0x866e}, /* U+025A+0301 [2000] */
+ {0x0000ca8c, 0x0000cc80, 0x8669}, /* U+028C+0300 [2000] */
+ {0x0000ca8c, 0x0000cc81, 0x866a}, /* U+028C+0301 [2000] */
+ {0x0000cba5, 0x0000cba9, 0x8686}, /* U+02E5+02E9 [2000] */
+ {0x0000cba9, 0x0000cba5, 0x8685}, /* U+02E9+02E5 [2000] */
+ {0x00e3818b, 0x00e3829a, 0x82f5}, /* U+304B+309A [2000] */
+ {0x00e3818d, 0x00e3829a, 0x82f6}, /* U+304D+309A [2000] */
+ {0x00e3818f, 0x00e3829a, 0x82f7}, /* U+304F+309A [2000] */
+ {0x00e38191, 0x00e3829a, 0x82f8}, /* U+3051+309A [2000] */
+ {0x00e38193, 0x00e3829a, 0x82f9}, /* U+3053+309A [2000] */
+ {0x00e382ab, 0x00e3829a, 0x8397}, /* U+30AB+309A [2000] */
+ {0x00e382ad, 0x00e3829a, 0x8398}, /* U+30AD+309A [2000] */
+ {0x00e382af, 0x00e3829a, 0x8399}, /* U+30AF+309A [2000] */
+ {0x00e382b1, 0x00e3829a, 0x839a}, /* U+30B1+309A [2000] */
+ {0x00e382b3, 0x00e3829a, 0x839b}, /* U+30B3+309A [2000] */
+ {0x00e382bb, 0x00e3829a, 0x839c}, /* U+30BB+309A [2000] */
+ {0x00e38384, 0x00e3829a, 0x839d}, /* U+30C4+309A [2000] */
+ {0x00e38388, 0x00e3829a, 0x839e}, /* U+30C8+309A [2000] */
+ {0x00e387b7, 0x00e3829a, 0x83f6} /* U+31F7+309A [2000] */
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_sjis.map b/src/backend/utils/mb/Unicode/utf8_to_sjis.map
new file mode 100644
index 0000000..a6c59d5
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_sjis.map
@@ -0,0 +1,4253 @@
+/* src/backend/utils/mb/Unicode/utf8_to_sjis.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_SJIS.pl */
+
+static const uint16 sjis_from_unicode_tree_table[22895];
+
+static const pg_mb_radix_tree sjis_from_unicode_tree =
+{
+ sjis_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x01be, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 sjis_from_unicode_tree_table[22895] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0087, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00bf, 0x00ff, 0x013e, 0x017e,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8191, 0x8192, 0x0000, 0x005c, 0x0000, 0x8198,
+ /* a8 */ 0x814e, 0x0000, 0x0000, 0x0000, 0x81ca, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x818b, 0x817d, 0x0000, 0x0000, 0x814c, 0x0000, 0x81f7,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c3xx - offset 0x00087 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x817e,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8180,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x000bf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5,
+ /* 98 */ 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad,
+ /* a0 */ 0x83ae, 0x83af, 0x0000, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4,
+ /* a8 */ 0x83b5, 0x83b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5,
+ /* b8 */ 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd,
+
+ /*** Two byte table, leaf: cfxx - offset 0x000ff ***/
+
+ /* 80 */ 0x83ce, 0x83cf, 0x0000, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4,
+ /* 88 */ 0x83d5, 0x83d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0013e ***/
+
+ /* 80 */ 0x0000, 0x8446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448,
+ /* 98 */ 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450,
+ /* a0 */ 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458,
+ /* a8 */ 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460,
+ /* b0 */ 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8477, 0x8478,
+ /* b8 */ 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481,
+
+ /*** Two byte table, leaf: d1xx - offset 0x0017e ***/
+
+ /* 80 */ 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489,
+ /* 88 */ 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491,
+ /* 90 */ 0x0000, 0x8476, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x001be ***/
+
+ /* e2 */ 0x01cc, 0x020c, 0x021c, 0x025c, 0x029c, 0x02dc, 0x031c, 0x035c,
+ /* ea */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x039b,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x001cc ***/
+
+ /* 80 */ 0x03db, 0x0000, 0x0000, 0x0000, 0x041a, 0x0446, 0x0480, 0x04ae,
+ /* 88 */ 0x04ee, 0x052c, 0x056a, 0x0000, 0x05aa, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x05ca, 0x0000, 0x0000, 0x060a, 0x064a, 0x066a, 0x06a8,
+ /* 98 */ 0x06e3, 0x0723, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x0020c ***/
+
+ /* 80 */ 0x0763, 0x07a2, 0x07e2, 0x0822, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0861, 0x0000, 0x089b, 0x0000, 0x08d8, 0x0914, 0x0953, 0x098f,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x0021c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x09cf, 0x0a0f, 0x0a4f, 0x0a8f, 0x0acf, 0x0b0d, 0x0b4d, 0x0b8d,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x0025c ***/
+
+ /* 80 */ 0x0bcd, 0x0c0d, 0x0c4d, 0x0c8c, 0x0ccc, 0x0d0c, 0x0d4c, 0x0d8b,
+ /* 88 */ 0x0dcb, 0x0e08, 0x0e48, 0x0e88, 0x0ec8, 0x0f08, 0x0f48, 0x0f86,
+ /* 90 */ 0x0fc5, 0x1005, 0x1045, 0x1085, 0x10c5, 0x1105, 0x1145, 0x1181,
+ /* 98 */ 0x11c0, 0x11fe, 0x123e, 0x127e, 0x12be, 0x12fe, 0x133e, 0x137e,
+ /* a0 */ 0x13be, 0x13fe, 0x143d, 0x147c, 0x14ba, 0x14f9, 0x1538, 0x1577,
+ /* a8 */ 0x15b7, 0x15f7, 0x1637, 0x1676, 0x16b2, 0x16f2, 0x1732, 0x1772,
+ /* b0 */ 0x17b2, 0x17f2, 0x182c, 0x186b, 0x18a9, 0x18e7, 0x1925, 0x1963,
+ /* b8 */ 0x19a2, 0x19e2, 0x1a22, 0x1a61, 0x1aa1, 0x1ae0, 0x1b20, 0x1b5e,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x0029c ***/
+
+ /* 80 */ 0x1b9e, 0x1bdd, 0x1c1c, 0x1c5a, 0x1c9a, 0x1cda, 0x1d19, 0x1d58,
+ /* 88 */ 0x1d98, 0x1dd8, 0x1e18, 0x1e56, 0x1e96, 0x1ed6, 0x1f16, 0x1f56,
+ /* 90 */ 0x1f91, 0x1fd0, 0x200d, 0x204c, 0x208c, 0x20cc, 0x210a, 0x2149,
+ /* 98 */ 0x2189, 0x21c9, 0x2208, 0x2248, 0x2288, 0x22c8, 0x2308, 0x2348,
+ /* a0 */ 0x2388, 0x23c8, 0x2408, 0x2445, 0x2485, 0x24c5, 0x2504, 0x2544,
+ /* a8 */ 0x2584, 0x25c2, 0x2602, 0x2641, 0x267d, 0x26bc, 0x26fc, 0x273c,
+ /* b0 */ 0x2774, 0x27b4, 0x27f3, 0x2833, 0x286f, 0x28ae, 0x28e9, 0x2929,
+ /* b8 */ 0x2966, 0x29a5, 0x29e5, 0x2a25, 0x2a65, 0x2aa5, 0x2ae5, 0x2b25,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x002dc ***/
+
+ /* 80 */ 0x2b64, 0x2ba3, 0x2be1, 0x2c1d, 0x2c5b, 0x2c98, 0x2cd6, 0x2d15,
+ /* 88 */ 0x2d55, 0x2d95, 0x2dd5, 0x2e14, 0x2e52, 0x2e92, 0x2ece, 0x2f0e,
+ /* 90 */ 0x2f4d, 0x2f8d, 0x2fcc, 0x300a, 0x3049, 0x3086, 0x30c6, 0x3105,
+ /* 98 */ 0x3145, 0x3183, 0x31c3, 0x3203, 0x3242, 0x3282, 0x32c2, 0x3302,
+ /* a0 */ 0x3340, 0x3380, 0x33bf, 0x33fe, 0x343d, 0x347d, 0x34bd, 0x34fd,
+ /* a8 */ 0x353d, 0x357d, 0x35bd, 0x35fd, 0x363d, 0x3678, 0x36b3, 0x36f3,
+ /* b0 */ 0x3733, 0x3773, 0x37b2, 0x37f2, 0x3832, 0x3872, 0x38b0, 0x38f0,
+ /* b8 */ 0x392f, 0x396e, 0x39ae, 0x0000, 0x39cb, 0x3a06, 0x3a44, 0x3a83,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x0031c ***/
+
+ /* 80 */ 0x3ac3, 0x3b03, 0x3b43, 0x3b80, 0x3bbe, 0x3bfd, 0x3c3d, 0x3c7d,
+ /* 88 */ 0x3cbc, 0x3cfc, 0x3d3b, 0x3d79, 0x3db8, 0x3df8, 0x3e38, 0x3e77,
+ /* 90 */ 0x3eb5, 0x3ef3, 0x3f31, 0x3f71, 0x3fb1, 0x3ff1, 0x4031, 0x4070,
+ /* 98 */ 0x40af, 0x40ef, 0x412b, 0x4167, 0x41a7, 0x41e7, 0x4227, 0x4267,
+ /* a0 */ 0x42a6, 0x42e6, 0x4326, 0x4366, 0x43a5, 0x43e4, 0x4424, 0x4464,
+ /* a8 */ 0x44a4, 0x44e3, 0x4521, 0x4561, 0x45a1, 0x45e0, 0x4620, 0x0000,
+ /* b0 */ 0x463b, 0x467b, 0x46b9, 0x46f9, 0x4737, 0x4753, 0x4792, 0x47d1,
+ /* b8 */ 0x4811, 0x484f, 0x488e, 0x48cd, 0x490c, 0x494c, 0x4971, 0x49b1,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x0035c ***/
+
+ /* 80 */ 0x49f1, 0x4a30, 0x4a70, 0x4aaf, 0x4aed, 0x4b24, 0x4b62, 0x4ba2,
+ /* 88 */ 0x4be2, 0x4c22, 0x4c62, 0x4c9c, 0x4cdc, 0x4d18, 0x4d57, 0x4d94,
+ /* 90 */ 0x4dd1, 0x4e10, 0x4e50, 0x0000, 0x0000, 0x4e59, 0x4e99, 0x4ed8,
+ /* 98 */ 0x4efe, 0x4f3e, 0x4f7c, 0x4fbc, 0x4ffc, 0x503b, 0x507a, 0x50b7,
+ /* a0 */ 0x50f7, 0x5135, 0x516a, 0x51a7, 0x51e6, 0x5225, 0x524f, 0x528e,
+ /* a8 */ 0x52ce, 0x530e, 0x533a, 0x537a, 0x53b6, 0x53f5, 0x5432, 0x5472,
+ /* b0 */ 0x54b2, 0x54f1, 0x0000, 0x552a, 0x5567, 0x55a7, 0x55e2, 0x5621,
+ /* b8 */ 0x565f, 0x567e, 0x56be, 0x56fe, 0x573c, 0x577b, 0x57b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0039b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x57d4, 0x0000, 0x0000, 0x57fe,
+ /* a8 */ 0x5830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x586f, 0x58af, 0x58ef, 0x592f,
+
+ /*** Three byte table, leaf: e280xx - offset 0x003db ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x815d, 0x0000, 0x0000, 0x0000, 0x0000, 0x815c, 0x8161, 0x0000,
+ /* 98 */ 0x8165, 0x8166, 0x0000, 0x0000, 0x8167, 0x8168, 0x0000, 0x0000,
+ /* a0 */ 0x81f5, 0x81f6, 0x0000, 0x0000, 0x0000, 0x8164, 0x8163, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x81f1, 0x0000, 0x818c, 0x818d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x81a6, 0x0000, 0x0000, 0x007e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x0041a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x818e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa59, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfa5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x81f0,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00446 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51,
+ /* a8 */ 0xfa52, 0xfa53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47,
+ /* b8 */ 0xfa48, 0xfa49,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x00480 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x81a9, 0x81aa, 0x81a8, 0x81ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x004ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81cb, 0x0000, 0x81cc, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x004ee ***/
+
+ /* 80 */ 0x81cd, 0x0000, 0x81dd, 0x81ce, 0x0000, 0x0000, 0x0000, 0x81de,
+ /* 88 */ 0x81b8, 0x0000, 0x0000, 0x81b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8794, 0x817c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x81e3, 0x0000, 0x0000, 0x81e5, 0x8187, 0x8798,
+ /* a0 */ 0x81da, 0x0000, 0x0000, 0x0000, 0x0000, 0x8161, 0x0000, 0x81c8,
+ /* a8 */ 0x81c9, 0x81bf, 0x81be, 0x81e7, 0x81e8, 0x0000, 0x8793, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8188, 0x81e6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81e4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0052c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8182, 0x81df, 0x0000, 0x0000, 0x0000, 0x0000, 0x8185, 0x8186,
+ /* a8 */ 0x0000, 0x0000, 0x81e1, 0x81e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x0056a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x81bc, 0x81bd, 0x0000, 0x0000, 0x81ba, 0x81bb,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8799,
+
+ /*** Three byte table, leaf: e28cxx - offset 0x005aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x81dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x005ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747,
+ /* a8 */ 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f,
+ /* b0 */ 0x8750, 0x8751, 0x8752, 0x8753, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x0060a ***/
+
+ /* 80 */ 0x849f, 0x84aa, 0x84a0, 0x84ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x84a1, 0x0000, 0x0000, 0x84ac,
+ /* 90 */ 0x84a2, 0x0000, 0x0000, 0x84ad, 0x84a4, 0x0000, 0x0000, 0x84af,
+ /* 98 */ 0x84a3, 0x0000, 0x0000, 0x84ae, 0x84a5, 0x84ba, 0x0000, 0x0000,
+ /* a0 */ 0x84b5, 0x0000, 0x0000, 0x84b0, 0x84a7, 0x84bc, 0x0000, 0x0000,
+ /* a8 */ 0x84b7, 0x0000, 0x0000, 0x84b2, 0x84a6, 0x0000, 0x0000, 0x84b6,
+ /* b0 */ 0x84bb, 0x0000, 0x0000, 0x84b1, 0x84a8, 0x0000, 0x0000, 0x84b8,
+ /* b8 */ 0x84bd, 0x0000, 0x0000, 0x84b3, 0x84a9, 0x0000, 0x0000, 0x84b9,
+
+ /*** Three byte table, leaf: e295xx - offset 0x0064a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x84be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x84b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x0066a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x81a1, 0x81a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x81a3, 0x81a2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x81a5, 0x81a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e297xx - offset 0x006a8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x819f, 0x819e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x819b, 0x0000, 0x0000, 0x819d, 0x819c,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81fc,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x006e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x819a, 0x8199, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x00723 ***/
+
+ /* 80 */ 0x818a, 0x0000, 0x8189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x81f4, 0x0000, 0x0000, 0x81f3, 0x0000, 0x81f2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00763 ***/
+
+ /* 80 */ 0x8140, 0x8141, 0x8142, 0x8156, 0x0000, 0x8158, 0x8159, 0x815a,
+ /* 88 */ 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178,
+ /* 90 */ 0x8179, 0x817a, 0x81a7, 0x81ac, 0x816b, 0x816c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8160, 0x8780, 0x0000, 0x8781,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x007a2 ***/
+
+ /* 80 */ 0x0000, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5,
+ /* 88 */ 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad,
+ /* 90 */ 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5,
+ /* 98 */ 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd,
+ /* a0 */ 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5,
+ /* a8 */ 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd,
+ /* b0 */ 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5,
+ /* b8 */ 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd,
+
+ /*** Three byte table, leaf: e382xx - offset 0x007e2 ***/
+
+ /* 80 */ 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5,
+ /* 88 */ 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed,
+ /* 90 */ 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x814a, 0x814b, 0x8154, 0x8155, 0x0000,
+ /* a0 */ 0x0000, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346,
+ /* a8 */ 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e,
+ /* b0 */ 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356,
+ /* b8 */ 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00822 ***/
+
+ /* 80 */ 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366,
+ /* 88 */ 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e,
+ /* 90 */ 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376,
+ /* 98 */ 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e,
+ /* a0 */ 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387,
+ /* a8 */ 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f,
+ /* b0 */ 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8145, 0x815b, 0x8152, 0x8153,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e388xx - offset 0x00861 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfa58, 0x878b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x878c,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38axx - offset 0x0089b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8785, 0x8786, 0x8787, 0x8788,
+ /* a8 */ 0x8789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38cxx - offset 0x008d8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8765, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8769, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8760, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8763, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8761, 0x876b, 0x0000, 0x0000, 0x876a, 0x8764,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x876c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8766, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x876e,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38dxx - offset 0x00914 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x875f, 0x876d, 0x0000, 0x0000, 0x8762, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8768,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x877e, 0x878f, 0x878e, 0x878d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38exx - offset 0x00953 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8772, 0x8773,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x876f, 0x8770, 0x8771, 0x0000,
+ /* a0 */ 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e38fxx - offset 0x0098f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x009cf ***/
+
+ /* 80 */ 0x88ea, 0x929a, 0x0000, 0x8eb5, 0x0000, 0x0000, 0x0000, 0x969c,
+ /* 88 */ 0x8fe4, 0x8e4f, 0x8fe3, 0x89ba, 0x0000, 0x9573, 0x975e, 0x0000,
+ /* 90 */ 0x98a0, 0x894e, 0x0000, 0x0000, 0x8a8e, 0x98a1, 0x90a2, 0x99c0,
+ /* 98 */ 0x8b75, 0x95b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fe5, 0x0000,
+ /* a0 */ 0x0000, 0x97bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c0, 0x0000,
+ /* a8 */ 0xfa68, 0x0000, 0x98a2, 0x0000, 0x0000, 0x9286, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x98a3, 0x8bf8, 0x0000, 0x0000, 0x0000, 0x98a4, 0x0000,
+ /* b8 */ 0x8adb, 0x924f, 0x0000, 0x8ee5, 0x98a5, 0x0000, 0x0000, 0x98a6,
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00a0f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x98a7, 0x9454, 0x0000, 0x8b76, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9456, 0x0000, 0x93e1, 0x8cc1, 0x9652,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe568, 0x98a8, 0x8fe6,
+ /* 98 */ 0x98a9, 0x89b3, 0x0000, 0x0000, 0x0000, 0x8be3, 0x8cee, 0x96e7,
+ /* a0 */ 0x0000, 0x0000, 0x9ba4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9790, 0x0000, 0x93fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aa3, 0x0000,
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00a4f ***/
+
+ /* 80 */ 0x8b54, 0x0000, 0x98aa, 0x0000, 0x0000, 0x98ab, 0x97b9, 0x0000,
+ /* 88 */ 0x975c, 0x9188, 0x98ad, 0x8e96, 0x93f1, 0x0000, 0x98b0, 0x0000,
+ /* 90 */ 0x0000, 0x895d, 0x8cdd, 0x0000, 0x8cdc, 0x88e4, 0x0000, 0x0000,
+ /* 98 */ 0x986a, 0x9869, 0x0000, 0x8db1, 0x889f, 0x0000, 0x98b1, 0x98b2,
+ /* a0 */ 0x98b3, 0x9653, 0x98b4, 0x0000, 0x8cf0, 0x88e5, 0x9692, 0x0000,
+ /* a8 */ 0x8b9c, 0x0000, 0x0000, 0x8b9d, 0x8b9e, 0x92e0, 0x97ba, 0x0000,
+ /* b0 */ 0x98b5, 0x0000, 0x0000, 0x98b6, 0x0000, 0x0000, 0x98b7, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x906c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00a8f ***/
+
+ /* 80 */ 0x8f59, 0x906d, 0x98bc, 0x0000, 0x98ba, 0x0000, 0x98bb, 0x8b77,
+ /* 88 */ 0x0000, 0x0000, 0x8da1, 0x89ee, 0x0000, 0x98b9, 0x98b8, 0x95a7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8e65, 0x8e64, 0x91bc, 0x98bd,
+ /* 98 */ 0x9574, 0x90e5, 0x0000, 0x0000, 0x0000, 0x8157, 0x98be, 0x98c0,
+ /* a0 */ 0x0000, 0xfa69, 0x0000, 0x91e3, 0x97df, 0x88c8, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98bf, 0x89bc, 0x0000,
+ /* b0 */ 0x8bc2, 0x0000, 0x9287, 0x0000, 0x0000, 0x0000, 0x8c8f, 0x98c1,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9443, 0xfa6a, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00acf ***/
+
+ /* 80 */ 0xfa6b, 0x8ae9, 0x0000, 0xfa6c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x98c2, 0x88c9, 0x0000, 0x0000, 0x8cde, 0x8aea, 0x959a,
+ /* 90 */ 0x94b0, 0x8b78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x89ef, 0x0000, 0x98e5, 0x9360, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x948c,
+ /* b0 */ 0x98c4, 0x0000, 0x0000, 0x0000, 0x94ba, 0x0000, 0x97e0, 0x0000,
+ /* b8 */ 0x904c, 0xfa6d, 0x8e66, 0x0000, 0x8e97, 0x89be,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00b0d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x92cf, 0x0000, 0x0000, 0x9241, 0x98c8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ca, 0x92e1, 0x8f5a,
+ /* 90 */ 0x8db2, 0x9743, 0x0000, 0x91cc, 0x0000, 0x89bd, 0xfa6e, 0x98c7,
+ /* 98 */ 0x0000, 0x975d, 0x98c3, 0x98c5, 0x8dec, 0x98c6, 0x9b43, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x98ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98d1,
+ /* b0 */ 0x98cf, 0x0000, 0x0000, 0x89c0, 0x0000, 0x95b9, 0x98c9, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x98cd, 0x8cf1, 0x0000, 0x0000, 0x8e67,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00b4d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8aa4, 0x0000, 0x0000, 0x98d2, 0x0000,
+ /* 88 */ 0x98ca, 0x0000, 0xfa70, 0x97e1, 0x0000, 0x8e98, 0x0000, 0x98cb,
+ /* 90 */ 0x0000, 0x98d0, 0xfa6f, 0x0000, 0xfa72, 0x0000, 0x98d3, 0x0000,
+ /* 98 */ 0x98cc, 0x0000, 0xfa71, 0x8b9f, 0x0000, 0x88cb, 0x0000, 0x0000,
+ /* a0 */ 0x8ba0, 0x89bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9b44, 0x0000, 0x9699, 0x958e, 0x8cf2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904e, 0x97b5, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95d6,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00b8d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8c57, 0x91a3, 0x89e2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfa61, 0x8f72, 0x0000, 0x0000, 0xfa73, 0x98d7, 0x0000,
+ /* 90 */ 0x98dc, 0x98da, 0x0000, 0x0000, 0x98d5, 0x0000, 0x0000, 0x91ad,
+ /* 98 */ 0x98d8, 0x0000, 0x98db, 0x98d9, 0x0000, 0x95db, 0x0000, 0x98d6,
+ /* a0 */ 0x0000, 0x904d, 0x0000, 0x9693, 0x98dd, 0x98de, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f43, 0x98eb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x946f, 0x0000, 0x9555, 0x98e6, 0x0000,
+ /* b8 */ 0x95ee, 0x0000, 0x89b4, 0x0000, 0x0000, 0x0000, 0x98ea, 0xfa76,
+
+ /*** Three byte table, leaf: e580xx - offset 0x00bcd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98e4, 0x98ed, 0x0000,
+ /* 88 */ 0x0000, 0x9171, 0x0000, 0x8cc2, 0x0000, 0x947b, 0x0000, 0xe0c5,
+ /* 90 */ 0x0000, 0x98ec, 0x937c, 0x0000, 0x98e1, 0x0000, 0x8cf4, 0x0000,
+ /* 98 */ 0x0000, 0x8cf3, 0x98df, 0x0000, 0x0000, 0x0000, 0xfa77, 0x8ed8,
+ /* a0 */ 0x0000, 0x98e7, 0xfa75, 0x95ed, 0x926c, 0x98e3, 0x8c91, 0x0000,
+ /* a8 */ 0x98e0, 0x98e8, 0x98e2, 0x97cf, 0x98e9, 0x9860, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be4, 0x0000,
+ /* b8 */ 0x0000, 0x8c90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e581xx - offset 0x00c0d ***/
+
+ /* 80 */ 0xfa74, 0x0000, 0xfa7a, 0x98ee, 0x0000, 0x0000, 0xfa78, 0x98ef,
+ /* 88 */ 0x98f3, 0x88cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95ce,
+ /* 90 */ 0x98f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x98f1, 0x98f5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x98f4, 0x0000, 0x92e2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c92, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x98f6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfa79, 0x0000, 0x8ec3, 0x0000, 0x91a4, 0x92e3, 0x8bf4, 0x0000,
+ /* b8 */ 0x98f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b55, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00c4d ***/
+
+ /* 80 */ 0x98f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x98fa, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9654, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8c86, 0x0000, 0x0000, 0xfa7b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8e50, 0x94f5, 0x98f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8dc3, 0x9762, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x98fc, 0x9942, 0x98fb, 0x8dc2, 0x0000, 0x8f9d,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c58,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x00c8c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9943, 0x0000, 0x0000, 0x8bcd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9940, 0x9941, 0x0000, 0x0000, 0x93ad, 0x0000, 0x919c,
+ /* 90 */ 0x0000, 0x8ba1, 0x0000, 0x0000, 0x0000, 0x966c, 0x9944, 0x0000,
+ /* 98 */ 0xfa7d, 0x0000, 0x97bb, 0x0000, 0x0000, 0x0000, 0x9945, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9948, 0x0000, 0x9946, 0x0000, 0x916d,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9947, 0x9949, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa7c, 0x994b, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x994a, 0x0000, 0x95c6, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00ccc ***/
+
+ /* 80 */ 0x8b56, 0x994d, 0x994e, 0x0000, 0x89ad, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x994c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8ef2, 0x0000, 0x9951, 0x9950, 0x994f, 0x0000,
+ /* 98 */ 0x98d4, 0x0000, 0x9952, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f9e,
+ /* a0 */ 0x0000, 0x9953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x96d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x9955,
+ /* b8 */ 0x0000, 0x0000, 0x9954, 0x9957, 0x9956, 0x0000, 0x0000, 0x9958,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00d0c ***/
+
+ /* 80 */ 0x9959, 0x88f2, 0x0000, 0x8cb3, 0x8c5a, 0x8f5b, 0x929b, 0x8ba2,
+ /* 88 */ 0x90e6, 0x8cf5, 0xfa7e, 0x8d8e, 0x995b, 0x96c6, 0x9365, 0x0000,
+ /* 90 */ 0x8e99, 0x0000, 0x995a, 0x0000, 0x995c, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x937d, 0x0000, 0x8a95, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x995d, 0x0000, 0xfa80, 0x93fc, 0x0000, 0x0000,
+ /* a8 */ 0x9153, 0x995f, 0x9960, 0x94aa, 0x8cf6, 0x985a, 0x9961, 0x0000,
+ /* b0 */ 0x0000, 0x8ba4, 0x0000, 0x0000, 0x0000, 0x95ba, 0x91b4, 0x8bef,
+ /* b8 */ 0x9354, 0x0000, 0x0000, 0x0000, 0x8c93, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x00d4c ***/
+
+ /* 80 */ 0x9962, 0x0000, 0x9963, 0x0000, 0x0000, 0x93e0, 0x897e, 0x0000,
+ /* 88 */ 0x0000, 0x9966, 0x8dfb, 0x0000, 0x9965, 0x8dc4, 0x0000, 0x9967,
+ /* 90 */ 0xe3ec, 0x9968, 0x9660, 0x9969, 0x0000, 0x996a, 0x996b, 0x8fe7,
+ /* 98 */ 0x0000, 0x8eca, 0x0000, 0x0000, 0x0000, 0xfa81, 0x0000, 0x0000,
+ /* a0 */ 0x8aa5, 0x0000, 0x996e, 0x0000, 0x996c, 0x96bb, 0x996d, 0x0000,
+ /* a8 */ 0x9579, 0x996f, 0x9970, 0x9971, 0x937e, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9975, 0x9973, 0x9974, 0x9972, 0x8de1, 0x9976, 0x96e8, 0x97e2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9977, 0xfa82,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x00d8b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x90a6, 0x9978, 0x8f79, 0x0000,
+ /* 88 */ 0x0000, 0x9979, 0x0000, 0x929c, 0x97bd, 0x9380, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99c3, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x997a, 0xeaa3, 0x8bc3, 0x0000, 0x0000,
+ /* a0 */ 0x997b, 0x967d, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f88, 0x91fa,
+ /* a8 */ 0x0000, 0x997d, 0x93e2, 0x0000, 0xfa83, 0x997e, 0x0000, 0x0000,
+ /* b0 */ 0x9980, 0x8a4d, 0x0000, 0x0000, 0x0000, 0x9981, 0x8ba5, 0x0000,
+ /* b8 */ 0x93ca, 0x899a, 0x8f6f, 0x0000, 0x0000, 0x949f, 0x9982, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x00dcb ***/
+
+ /* 80 */ 0x9381, 0x0000, 0x0000, 0x906e, 0x9983, 0x0000, 0x95aa, 0x90d8,
+ /* 88 */ 0x8aa0, 0x0000, 0x8aa7, 0x9984, 0x0000, 0x0000, 0x9986, 0x0000,
+ /* 90 */ 0x0000, 0x8c59, 0x0000, 0x0000, 0x9985, 0xfa84, 0x0000, 0x97f1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f89, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x94bb, 0x95ca, 0x0000, 0x9987,
+ /* a8 */ 0x0000, 0x9798, 0x9988, 0x0000, 0x0000, 0x0000, 0x9989, 0x0000,
+ /* b0 */ 0x939e, 0x0000, 0x0000, 0x998a, 0x0000, 0x0000, 0x90a7, 0x8dfc,
+ /* b8 */ 0x8c94, 0x998b, 0x8e68, 0x8d8f, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x00e08 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x92e4, 0x998d, 0x0000, 0x0000, 0x91a5,
+ /* 88 */ 0x0000, 0x0000, 0x8ded, 0x998e, 0x998f, 0x914f, 0x0000, 0x998c,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9991, 0x0000, 0x9655, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8d84, 0x0000, 0x0000, 0x9990, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8c95, 0x8ddc, 0x948d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9994, 0x9992, 0x0000, 0x0000, 0x0000, 0x0000, 0x959b,
+ /* b0 */ 0x8fe8, 0x999b, 0x8a84, 0x9995, 0x9993, 0x916e, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9997, 0x0000, 0x9996,
+
+ /*** Three byte table, leaf: e58axx - offset 0x00e48 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8a63, 0x0000, 0x0000, 0x0000, 0x8c80,
+ /* 88 */ 0x999c, 0x97ab, 0x0000, 0x0000, 0x0000, 0x9998, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x999d, 0x999a, 0x0000, 0x9999, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x97cd, 0xfa85, 0x0000, 0x0000, 0x8cf7,
+ /* a0 */ 0x89c1, 0x0000, 0x0000, 0x97f2, 0x0000, 0x0000, 0xfa86, 0x0000,
+ /* a8 */ 0x0000, 0x8f95, 0x9377, 0x8d85, 0x99a0, 0x99a1, 0x0000, 0xfb77,
+ /* b0 */ 0x0000, 0x97e3, 0x0000, 0x0000, 0x984a, 0x99a3, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8cf8, 0x0000, 0x0000, 0x99a2, 0x0000, 0x8a4e, 0x0000,
+
+ /*** Three byte table, leaf: e58bxx - offset 0x00e88 ***/
+
+ /* 80 */ 0xfa87, 0x99a4, 0x0000, 0x9675, 0x0000, 0x92ba, 0x0000, 0x9745,
+ /* 88 */ 0x0000, 0x95d7, 0x0000, 0x0000, 0x0000, 0x99a5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe8d3, 0x0000, 0x0000, 0x93ae, 0x0000, 0x99a6,
+ /* 98 */ 0x8aa8, 0x96b1, 0x0000, 0xfa88, 0x0000, 0x8f9f, 0x99a7, 0x95e5,
+ /* a0 */ 0x99ab, 0x0000, 0x90a8, 0x99a8, 0x8bce, 0x0000, 0x99a9, 0x8aa9,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c4d, 0x99ac, 0x0000, 0x99ad, 0x0000, 0x0000,
+ /* b8 */ 0x99ae, 0x99af, 0x8ed9, 0x0000, 0x0000, 0x0000, 0x8cf9, 0x96dc,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x00ec8 ***/
+
+ /* 80 */ 0xfa89, 0x96e6, 0x93f5, 0x0000, 0x0000, 0x95ef, 0x99b0, 0xfa8a,
+ /* 88 */ 0x99b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x99b3, 0x0000, 0x99b5,
+ /* 90 */ 0x99b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x99b6, 0x89bb, 0x966b,
+ /* 98 */ 0x0000, 0x8dfa, 0x99b7, 0x0000, 0x0000, 0x9178, 0x0000, 0x0000,
+ /* a0 */ 0x8fa0, 0x8ba7, 0x0000, 0x99b8, 0xfa8b, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x94d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x99b9,
+ /* b0 */ 0x0000, 0x99ba, 0x0000, 0x99bb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x99bc, 0x9543, 0x8be6, 0x88e3, 0x0000, 0x0000, 0x0000, 0x93bd,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x00f08 ***/
+
+ /* 80 */ 0x99bd, 0x8f5c, 0x0000, 0x90e7, 0x0000, 0x99bf, 0x99be, 0x8fa1,
+ /* 88 */ 0x8cdf, 0x99c1, 0x94bc, 0x0000, 0x0000, 0x99c2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x94da, 0x91b2, 0x91ec, 0x8ba6, 0x0000, 0x0000, 0x93ec,
+ /* 98 */ 0x9250, 0x0000, 0x948e, 0x0000, 0x966d, 0x0000, 0x99c4, 0x0000,
+ /* a0 */ 0x90e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c54, 0x0000,
+ /* a8 */ 0x0000, 0x99c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x99c6, 0x894b,
+ /* b0 */ 0x88f3, 0x8aeb, 0xfa8c, 0x91a6, 0x8b70, 0x9791, 0x0000, 0x99c9,
+ /* b8 */ 0x89b5, 0x0000, 0x0000, 0x99c8, 0x0000, 0x0000, 0x0000, 0x8ba8,
+
+ /*** Three byte table, leaf: e58exx - offset 0x00f48 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x99ca, 0x0000, 0x96ef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfa8d, 0x0000, 0x0000, 0x99cb, 0x0000,
+ /* 98 */ 0x97d0, 0x0000, 0x8cfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cb4,
+ /* a0 */ 0x99cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x99ce, 0x99cd, 0x0000,
+ /* a8 */ 0x907e, 0x8958, 0x0000, 0x0000, 0x0000, 0x897d, 0x99cf, 0x0000,
+ /* b0 */ 0x99d0, 0x0000, 0xfa8e, 0x8cb5, 0x0000, 0x0000, 0x99d1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8b8e, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x00f86 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e51, 0x99d2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9694, 0x8db3, 0x8b79, 0x9746, 0x916f, 0x94bd, 0x8efb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f66, 0x0000, 0x8ee6, 0x8ef3,
+ /* 98 */ 0x0000, 0x8f96, 0x0000, 0x94be, 0x0000, 0xfa8f, 0x0000, 0x99d5,
+ /* a0 */ 0x0000, 0x8962, 0x9170, 0x8cfb, 0x8cc3, 0x8be5, 0x0000, 0x0000,
+ /* a8 */ 0x99d9, 0x9240, 0x91fc, 0x8ba9, 0x8fa2, 0x99da, 0x99d8, 0x89c2,
+ /* b0 */ 0x91e4, 0x8eb6, 0x8e6a, 0x8945, 0x0000, 0x0000, 0x8a90, 0x8d86,
+ /* b8 */ 0x8e69, 0x0000, 0x99db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x00fc5 ***/
+
+ /* 80 */ 0x0000, 0x99dc, 0x0000, 0x8b68, 0x8a65, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8d87, 0x8b67, 0x92dd, 0x8944, 0x93af, 0x96bc, 0x8d40, 0x9799,
+ /* 90 */ 0x9366, 0x8cfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8c4e, 0x0000, 0x99e5, 0x0000, 0x8be1,
+ /* a0 */ 0x9669, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94db, 0x0000,
+ /* a8 */ 0x0000, 0x99e4, 0x0000, 0x8adc, 0x99df, 0x99e0, 0x99e2, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99e3, 0x0000,
+ /* b8 */ 0x8b7a, 0x9081, 0x0000, 0x95ab, 0x99e1, 0x99dd, 0x8ce1, 0x0000,
+
+ /*** Three byte table, leaf: e591xx - offset 0x01005 ***/
+
+ /* 80 */ 0x99de, 0x0000, 0x9843, 0x0000, 0x0000, 0x0000, 0x95f0, 0x0000,
+ /* 88 */ 0x92e6, 0x8ce0, 0x8d90, 0x0000, 0x0000, 0x0000, 0x99e6, 0x0000,
+ /* 90 */ 0x0000, 0x93db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99ea,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8efc, 0x0000, 0x8ef4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x99ed, 0x99eb, 0x0000, 0x96a1, 0x0000, 0x99e8, 0x99f1, 0x99ec,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x99ef, 0x8cc4, 0x96bd, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e592xx - offset 0x01045 ***/
+
+ /* 80 */ 0x99f0, 0x0000, 0x0000, 0x0000, 0x99f2, 0x0000, 0x99f4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfa92, 0x8dee, 0x9861, 0x0000, 0x99e9, 0x99e7,
+ /* 90 */ 0x99f3, 0x0000, 0x99ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa91, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x99f6, 0x0000, 0x9a42, 0x99f8, 0x0000, 0x0000,
+ /* a8 */ 0x99fc, 0xfa93, 0x0000, 0x9a40, 0x99f9, 0x0000, 0x0000, 0x9a5d,
+ /* b0 */ 0x0000, 0x0000, 0x8de7, 0x8a50, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x99f7, 0x0000, 0x0000, 0x0000, 0x9a44, 0x88f4, 0x9a43, 0x0000,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01085 ***/
+
+ /* 80 */ 0x88a3, 0x9569, 0x9a41, 0x0000, 0x99fa, 0x0000, 0x0000, 0x99f5,
+ /* 88 */ 0x99fb, 0x8dc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x88f5, 0x9a4e, 0x0000, 0x0000, 0x9a46, 0x9a47, 0x0000,
+ /* a8 */ 0x8fa3, 0x9689, 0x0000, 0x0000, 0x0000, 0x9a4c, 0x9a4b, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x934e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9a4d, 0x0000, 0x0000, 0x9a4a, 0x0000, 0xfa94,
+
+ /*** Three byte table, leaf: e594xx - offset 0x010c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8953, 0x0000, 0x8db4, 0x904f,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a48,
+ /* 90 */ 0x9382, 0x0000, 0x0000, 0x0000, 0x9a49, 0x0000, 0x88a0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a53, 0x9742,
+ /* b0 */ 0x0000, 0x8fa5, 0x0000, 0x9a59, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9a58, 0x9a4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x91c1, 0x0000,
+
+ /*** Three byte table, leaf: e595xx - offset 0x01105 ***/
+
+ /* 80 */ 0x9a50, 0x0000, 0x0000, 0x0000, 0x91ed, 0x9a55, 0x8fa4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a52, 0x0000, 0x0000, 0x96e2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8c5b, 0x0000, 0x0000, 0x9a56, 0x9a57,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a54, 0x9a5a, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9a51, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9a60, 0x9a65, 0x0000, 0x9a61, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x01145 ***/
+
+ /* 80 */ 0x9a5c, 0x0000, 0x0000, 0x9a66, 0x9150, 0x0000, 0xfa95, 0x9a68,
+ /* 88 */ 0x0000, 0x8d41, 0x9a5e, 0x929d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9a62, 0x9a5b, 0x8aab, 0x0000, 0x8aec, 0x8a85, 0x9a63, 0x9a5f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c96,
+ /* a8 */ 0x9a69, 0x9a67, 0x9172, 0x8b69, 0x8baa, 0x0000, 0x9a64, 0x0000,
+ /* b0 */ 0x8bf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e597xx - offset 0x01181 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a6d, 0x9a6b, 0x0000, 0x9aa5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a70, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9a6a, 0x0000, 0x9a6e, 0x0000, 0x0000, 0x9a6c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8e6b, 0x9a6f, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a72,
+ /* b8 */ 0x0000, 0x9a77, 0x0000, 0x0000, 0x0000, 0x9a75, 0x9a74,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x011c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9251, 0x0000,
+ /* 88 */ 0x0000, 0x89c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a71, 0x0000, 0x9a73, 0x8fa6,
+ /* 98 */ 0x8952, 0x0000, 0x0000, 0x9a76, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x89dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a82,
+ /* b0 */ 0x0000, 0x8ffa, 0x9a7d, 0x0000, 0x9a7b, 0x0000, 0x9a7c, 0x0000,
+ /* b8 */ 0x9a7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e599xx - offset 0x011fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x895c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9158, 0x0000, 0x9a78, 0x0000,
+ /* 90 */ 0x9a79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8a9a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a81, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8aed, 0x0000, 0x9a84, 0x9a80, 0x9a83, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x95ac, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x93d3, 0x0000, 0x94b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59axx - offset 0x0123e ***/
+
+ /* 80 */ 0x9a86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a85, 0x8a64,
+ /* 88 */ 0x0000, 0x0000, 0x9a87, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a8a,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a89, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9a88, 0x0000, 0x9458, 0x0000, 0x0000, 0x9a8b, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a8c, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a8e, 0x0000, 0x9a8d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9a90, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59bxx - offset 0x0127e ***/
+
+ /* 80 */ 0x9a93, 0x9a91, 0x9a8f, 0x9a92, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9a94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a95, 0x0000,
+ /* 90 */ 0x0000, 0x9a96, 0x0000, 0x9a97, 0x0000, 0x0000, 0x0000, 0x9a98,
+ /* 98 */ 0x9964, 0x0000, 0x8efa, 0x8e6c, 0x0000, 0x0000, 0x89f1, 0x0000,
+ /* a0 */ 0x88f6, 0x0000, 0x0000, 0x9263, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a99, 0x0000,
+ /* b0 */ 0x8da2, 0x0000, 0x88cd, 0x907d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9a9a, 0x8cc5, 0x0000, 0x0000, 0x8d91, 0x0000, 0x9a9c,
+
+ /*** Three byte table, leaf: e59cxx - offset 0x012be ***/
+
+ /* 80 */ 0x9a9b, 0x0000, 0x0000, 0x95de, 0x9a9d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9a9f, 0x9a9e, 0x0000, 0x9aa0, 0x0000, 0x9aa1, 0x0000, 0x8c97,
+ /* 90 */ 0x0000, 0x0000, 0x8980, 0x9aa2, 0x0000, 0x0000, 0x9aa4, 0x0000,
+ /* 98 */ 0x9aa3, 0x0000, 0x0000, 0x0000, 0x9aa6, 0x0000, 0x0000, 0x9379,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9aa7, 0x88b3,
+ /* a8 */ 0x8ddd, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c5c, 0x0000, 0x0000,
+ /* b0 */ 0x926e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9aa8,
+ /* b8 */ 0x9aa9, 0x0000, 0x0000, 0x9aab, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x012fe ***/
+
+ /* 80 */ 0x9aac, 0x0000, 0x8de2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bcf,
+ /* 88 */ 0x0000, 0x0000, 0x9656, 0x0000, 0x0000, 0x0000, 0x9aaa, 0x9aad,
+ /* 90 */ 0x8dbf, 0x8d42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfa96, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9ab1, 0x0000, 0x0000, 0x8da3, 0xfa97, 0x9252, 0x0000,
+ /* a8 */ 0x0000, 0x9aae, 0x92d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ab2,
+
+ /*** Three byte table, leaf: e59exx - offset 0x0133e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9ab0, 0x9ab3, 0x0000, 0x8c5e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9ab4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9ab5, 0x0000, 0x8d43, 0x8a5f, 0x9ab7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9ab8, 0x0000, 0xfa98, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ab9, 0x0000, 0x0000, 0x9ab6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59fxx - offset 0x0137e ***/
+
+ /* 80 */ 0x9aaf, 0x0000, 0x0000, 0x9aba, 0x0000, 0x0000, 0x9abb, 0xfa9a,
+ /* 88 */ 0xfa99, 0x0000, 0x0000, 0x9684, 0x0000, 0x0000, 0x8fe9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9abd, 0x9abe, 0x9abc, 0x0000, 0x9ac0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9457, 0x0000, 0x0000, 0x88e6,
+ /* a0 */ 0x9575, 0x0000, 0x0000, 0x9ac1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ffb, 0x0000, 0x0000, 0x8eb7,
+ /* b8 */ 0x0000, 0x947c, 0x8aee, 0x0000, 0x8de9, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x013be ***/
+
+ /* 80 */ 0x9678, 0x0000, 0x93b0, 0x0000, 0x0000, 0x8c98, 0x91cd, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9abf, 0x9ac2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91c2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9ac3, 0x0000, 0x0000, 0x0000, 0x9ac4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9ac6, 0x0000, 0x0000, 0x92e7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8aac, 0x0000, 0x0000, 0x0000, 0x0000, 0xea9f,
+ /* b0 */ 0x8981, 0x95f1, 0x0000, 0x0000, 0x8fea, 0x9367, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8de4, 0x0000, 0x0000, 0x9acc, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x013fe ***/
+
+ /* 80 */ 0x95bb, 0x97db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x89f2, 0x9ac8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9159, 0x9acb, 0x0000, 0x9383, 0x0000, 0x0000, 0x9368,
+ /* 98 */ 0x9384, 0x94b7, 0x92cb, 0x0000, 0x0000, 0x0000, 0x8dc7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9ac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8996, 0x0000, 0x9355, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ac9, 0x0000, 0x9ac5, 0x0000, 0x0000, 0x906f, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9acd, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f6d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x0143d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8bab, 0x0000, 0x9ace, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x95e6, 0x0000, 0x0000, 0x0000, 0x919d,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x92c4, 0x0000, 0xfa9d, 0x9ad0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x966e, 0x0000, 0x0000, 0x9ad1, 0x0000, 0x0000, 0x9ad6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfa9e, 0x95ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9ad5, 0x9acf, 0x9ad2, 0x9ad4, 0x0000, 0x0000, 0x8da4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x0147c ***/
+
+ /* 80 */ 0x0000, 0x95c7, 0x0000, 0x0000, 0x0000, 0x9ad7, 0x0000, 0x9264,
+ /* 88 */ 0x0000, 0x0000, 0x89f3, 0x0000, 0x8feb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9ad9, 0x0000, 0x9ad8, 0x0000, 0x8d88, 0x0000, 0x9ada,
+ /* 98 */ 0x9adc, 0x9adb, 0x0000, 0x0000, 0x9ade, 0x0000, 0x9ad3, 0x9ae0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9adf, 0x9add, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e6d, 0x9070, 0x0000, 0x9173, 0x9ae1,
+ /* b0 */ 0x90ba, 0x88eb, 0x9484, 0x0000, 0x0000, 0x0000, 0x0000, 0x92d9,
+ /* b8 */ 0x0000, 0x9ae3, 0x9ae2, 0x9ae4, 0x9ae5, 0x9ae6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x014ba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9ae7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x95cf, 0x9ae8, 0xfa9f, 0x0000, 0x0000, 0x0000, 0x89c4,
+ /* 90 */ 0x9ae9, 0x0000, 0x0000, 0x0000, 0x0000, 0x975b, 0x8a4f, 0x0000,
+ /* 98 */ 0x99c7, 0x8f67, 0x91bd, 0x9aea, 0x96e9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x96b2, 0x0000, 0x0000, 0x9aec, 0x0000, 0x91e5,
+ /* a8 */ 0x0000, 0x9356, 0x91be, 0x9576, 0x9aed, 0x9aee, 0x899b, 0x0000,
+ /* b0 */ 0x0000, 0x8eb8, 0x9aef, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ce,
+ /* b8 */ 0x9af0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9af1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x014f9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x0000, 0x0000, 0x8aef,
+ /* 88 */ 0x93de, 0x95f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x9af5, 0x9174,
+ /* 90 */ 0x9af4, 0x8c5f, 0x0000, 0xfaa0, 0x967a, 0x9af3, 0x0000, 0x9385,
+ /* 98 */ 0x9af7, 0x0000, 0x9af6, 0xfaa1, 0x0000, 0xfaa2, 0x0000, 0x0000,
+ /* a0 */ 0x9af9, 0x0000, 0x9af8, 0xfaa3, 0x0000, 0x899c, 0x0000, 0x9afa,
+ /* a8 */ 0x8fa7, 0x9afc, 0x9244, 0x0000, 0x9afb, 0x0000, 0x95b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8f97, 0x937a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9b40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d44, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x01538 ***/
+
+ /* 80 */ 0x0000, 0x9b41, 0x9440, 0x94dc, 0x96cf, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9444, 0x0000, 0x0000, 0x9b4a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8b57, 0x0000, 0x0000, 0x9764, 0x0000,
+ /* 98 */ 0x0000, 0x96ad, 0x0000, 0x9baa, 0x0000, 0x9b42, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9b45, 0xfaa4, 0x91c3, 0x0000, 0x0000,
+ /* a8 */ 0x9657, 0x0000, 0x0000, 0x0000, 0x9369, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9b46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9685, 0xfaa5, 0x8dc8, 0x0000, 0x0000, 0x8fa8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x01577 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b47, 0x0000,
+ /* 88 */ 0x0000, 0x8e6f, 0x0000, 0x8e6e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x88b7, 0x8cc6, 0x0000, 0x90a9, 0x88cf, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9b4b, 0x9b4c, 0x0000, 0x9b49, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8957, 0x8aad, 0x0000,
+ /* a8 */ 0x9b48, 0x0000, 0x96c3, 0x9550, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88a6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x88f7, 0x0000, 0x0000, 0x0000, 0x8e70,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x015b7 ***/
+
+ /* 80 */ 0x0000, 0x88d0, 0x0000, 0x88a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9b51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9b4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x96ba, 0x0000, 0x9b52, 0x0000, 0x9b50, 0x0000, 0x0000, 0x9b4e,
+ /* a0 */ 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b4d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x95d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ce2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b56, 0x9b57, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8fa9, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x015f7 ***/
+
+ /* 80 */ 0x9b53, 0x984b, 0x0000, 0x0000, 0x0000, 0x0000, 0x946b, 0x0000,
+ /* 88 */ 0x0000, 0x9b55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8da5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9b58, 0x0000, 0x0000, 0x0000, 0x9577, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9b59, 0x0000, 0x9b54, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x96b9,
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x01637 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x947d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9b5a, 0x9551, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9b5b, 0x9b5f, 0x9b5c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5abxx - offset 0x01676 ***/
+
+ /* 80 */ 0x0000, 0x89c5, 0x9b5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8eb9, 0x0000, 0x9b5d, 0x8c99, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9b6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b64, 0x9b61,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9284, 0x0000, 0x9b60, 0x0000, 0x0000, 0x9b62, 0x0000,
+ /* a8 */ 0x0000, 0x9b63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9b65, 0x9b66,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5acxx - offset 0x016b2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8af0, 0x0000, 0x9b68, 0x9b67, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b69, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8fec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9b6c, 0x0000, 0x92da, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8964, 0x0000, 0x9b6a, 0x0000, 0x0000, 0x0000, 0x9b6d, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b6e, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x016f2 ***/
+
+ /* 80 */ 0x9b71, 0x0000, 0x0000, 0x9b6f, 0x0000, 0x9b70, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8e71, 0x9b72, 0x0000, 0x0000, 0x8d45, 0x9b73, 0xfaa6, 0x8e9a,
+ /* 98 */ 0x91b6, 0x0000, 0x9b74, 0x9b75, 0x8e79, 0x8d46, 0x0000, 0x96d0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8b47, 0x8cc7, 0x9b76, 0x8a77, 0x0000,
+ /* a8 */ 0x0000, 0x9b77, 0x0000, 0x91b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9b78, 0x9ba1, 0x0000, 0x9b79, 0x0000, 0x9b7a, 0x0000, 0x0000,
+ /* b8 */ 0x9b7b, 0x0000, 0x9b7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5aexx - offset 0x01732 ***/
+
+ /* 80 */ 0x9b7e, 0x0000, 0x0000, 0x9b80, 0x0000, 0x91ee, 0x0000, 0x8946,
+ /* 88 */ 0x8ee7, 0x88c0, 0x0000, 0x9176, 0x8aae, 0x8eb3, 0x0000, 0x8d47,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9386, 0x0000, 0x8f40,
+ /* 98 */ 0x8aaf, 0x9288, 0x92e8, 0x88b6, 0x8b58, 0x95f3, 0x0000, 0x8ec0,
+ /* a0 */ 0x0000, 0x0000, 0x8b71, 0x90e9, 0x8eba, 0x9747, 0x9b81, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b7b, 0x0000,
+ /* b0 */ 0x8dc9, 0x0000, 0x0000, 0x8a51, 0x8983, 0x8faa, 0x89c6, 0x0000,
+ /* b8 */ 0x9b82, 0x9765, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f68,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x01772 ***/
+
+ /* 80 */ 0xfaa7, 0x0000, 0x8ee2, 0x9b83, 0x8af1, 0x93d0, 0x96a7, 0x9b84,
+ /* 88 */ 0x0000, 0x9b85, 0x0000, 0x0000, 0x9578, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9b87, 0x0000, 0x8aa6, 0x8bf5, 0x9b86, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfaa9, 0x0000, 0x0000, 0x8ab0, 0x0000, 0x9051, 0x9b8b, 0x8e40,
+ /* a0 */ 0x0000, 0x89c7, 0x9b8a, 0x0000, 0x9b88, 0x9b8c, 0x9b89, 0x944a,
+ /* a8 */ 0x9ecb, 0x9052, 0x0000, 0x9b8d, 0xfaaa, 0x0000, 0x97be, 0x0000,
+ /* b0 */ 0x9b8e, 0x0000, 0x0000, 0x9b90, 0x0000, 0x929e, 0x9b8f, 0x0000,
+ /* b8 */ 0x90a1, 0x0000, 0x8e9b, 0x0000, 0x0000, 0x0000, 0x91ce, 0x8ef5,
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x017b2 ***/
+
+ /* 80 */ 0x0000, 0x9595, 0x90ea, 0x0000, 0x8ecb, 0x9b91, 0x8fab, 0x9b92,
+ /* 88 */ 0x9b93, 0x88d1, 0x91b8, 0x9071, 0x0000, 0x9b94, 0x93b1, 0x8fac,
+ /* 90 */ 0x0000, 0x8fad, 0x0000, 0x9b95, 0x0000, 0x0000, 0x90eb, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8fae, 0x0000, 0x0000, 0x0000, 0xfaab, 0x0000,
+ /* a0 */ 0x9b96, 0x0000, 0x9b97, 0x0000, 0x96de, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9b98, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bc4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8f41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9b99, 0x9b9a, 0x8eda, 0x904b, 0x93f2, 0x9073, 0x94f6, 0x9441,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x017f2 ***/
+
+ /* 80 */ 0x8bc7, 0x9b9b, 0x0000, 0x0000, 0x0000, 0x8b8f, 0x9b9c, 0x0000,
+ /* 88 */ 0x8bfc, 0x0000, 0x93cd, 0x89ae, 0x0000, 0x8e72, 0x9b9d, 0x9ba0,
+ /* 90 */ 0x9b9f, 0x8bfb, 0x0000, 0x9b9e, 0x0000, 0x9357, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91ae, 0x0000,
+ /* a0 */ 0x936a, 0x8ec6, 0x0000, 0x0000, 0x9177, 0x979a, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9ba2, 0x0000, 0x9ba3, 0x93d4,
+ /* b0 */ 0x0000, 0x8e52, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ba5, 0x0000,
+ /* b8 */ 0x0000, 0x9ba6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x0182c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9ba7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8af2, 0x9ba8, 0x0000, 0x0000, 0x9ba9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x89aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaac, 0x0000,
+ /* a8 */ 0x915a, 0x8ae2, 0x0000, 0x9bab, 0x96a6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x91d0, 0x0000, 0x8a78, 0x0000, 0x0000, 0x9bad, 0x9baf,
+ /* b8 */ 0x8add, 0x0000, 0xfaad, 0x9bac, 0x9bae, 0x0000, 0x9bb1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x0186b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bb0, 0x0000, 0x9bb2,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9bb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x93bb, 0x8bac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x89e3, 0x9bb4, 0x9bb9, 0x0000, 0x0000, 0x9bb7, 0x0000, 0x95f5,
+ /* b0 */ 0x95f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaae, 0x9387, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9bb6, 0x8f73, 0x0000, 0x9bb5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x018a9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9bba, 0x0000, 0x0000, 0x8de8, 0x0000,
+ /* 90 */ 0x0000, 0x9bc0, 0x0000, 0x0000, 0x9bc1, 0x9bbb, 0x8a52, 0x9bbc,
+ /* 98 */ 0x9bc5, 0x9bc4, 0x9bc3, 0x9bbf, 0x0000, 0x0000, 0x0000, 0x9bbe,
+ /* a0 */ 0x0000, 0x0000, 0x9bc2, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaaf,
+ /* a8 */ 0x0000, 0x95f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x018e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfab2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9bc9, 0x9bc6, 0x0000, 0x9bc8, 0x0000,
+ /* 90 */ 0x9792, 0x0000, 0x9bc7, 0xfab0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bbd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9093, 0x0000, 0x0000, 0x9bca, 0xfab3, 0x0000, 0x8db5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9bcb, 0x0000, 0x0000, 0x9bcc, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01925 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9bcf, 0x0000, 0x9bce, 0x0000, 0x0000, 0x9bcd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9388, 0x9bb8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9bd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bd1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9bd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bd2, 0x0000, 0x9bd3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bd6,
+ /* b8 */ 0xfab4, 0xfab5, 0x97e4, 0x0000, 0x9bd7, 0x9bd4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01963 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9bd8, 0x0000, 0x0000, 0x8ade, 0x9bd9, 0x0000, 0x0000,
+ /* 90 */ 0xfab6, 0x0000, 0x9bdb, 0x9bda, 0x0000, 0x0000, 0x9bdc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9bdd, 0x0000, 0x90ec, 0x8f42, 0x0000,
+ /* a0 */ 0x0000, 0x8f84, 0x0000, 0x9183, 0x0000, 0x8d48, 0x8db6, 0x8d49,
+ /* a8 */ 0x8b90, 0x0000, 0x0000, 0x9bde, 0x0000, 0x0000, 0x8db7, 0x0000,
+ /* b0 */ 0x0000, 0x8cc8, 0x9bdf, 0x96a4, 0x9462, 0x9be0, 0x0000, 0x8d4a,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8aaa, 0x0000, 0x9246, 0x8bd0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x019a2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e73, 0x957a, 0x0000, 0x0000, 0x94bf, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9be1, 0x8af3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9be4, 0x0000, 0x0000, 0x0000, 0x0000, 0x929f, 0x0000,
+ /* 98 */ 0x0000, 0x9be3, 0x9be2, 0x9be5, 0x0000, 0x92e9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9083, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e74, 0x0000, 0x90c8, 0x0000, 0x91d1,
+ /* b0 */ 0x8b41, 0x0000, 0x0000, 0x92a0, 0x0000, 0x0000, 0x9be6, 0x9be7,
+ /* b8 */ 0x8fed, 0x0000, 0x0000, 0x0000, 0x0000, 0x9658, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x019e2 ***/
+
+ /* 80 */ 0x9bea, 0x0000, 0x0000, 0x9be9, 0x9be8, 0x959d, 0x0000, 0x9bf1,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9679, 0x0000, 0x9beb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9bed, 0x968b, 0x0000, 0x9bec,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bee,
+ /* a0 */ 0x0000, 0x94a6, 0x9bef, 0x95bc, 0x9bf0, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8ab1, 0x95bd, 0x944e, 0x9bf2, 0x9bf3, 0x0000,
+ /* b8 */ 0x8d4b, 0x8ab2, 0x9bf4, 0x8cb6, 0x9763, 0x9748, 0x8af4, 0x9bf6,
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01a22 ***/
+
+ /* 80 */ 0x0000, 0x92a1, 0x0000, 0x8d4c, 0x8faf, 0x0000, 0x0000, 0x94dd,
+ /* 88 */ 0x0000, 0x0000, 0x8fb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f98,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92ea, 0x95f7, 0x9358,
+ /* 98 */ 0x0000, 0x0000, 0x8d4d, 0x0000, 0x957b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9bf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9378, 0x8dc0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8cc9, 0x0000, 0x92eb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88c1, 0x8f8e, 0x8d4e,
+ /* b8 */ 0x9766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01a61 ***/
+
+ /* 80 */ 0x0000, 0x9bf8, 0x9bf9, 0x9470, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9bfa, 0x97f5, 0x984c, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bfc,
+ /* 90 */ 0x9bfb, 0x0000, 0x0000, 0x8a66, 0x0000, 0x0000, 0x9c40, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9c43, 0x9c44, 0x0000, 0x9c42, 0x0000, 0x955f,
+ /* a0 */ 0x8fb1, 0x9c46, 0x9c45, 0x9c41, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9c47, 0x9c48, 0x0000, 0x0000, 0x9c49, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9c4c, 0x9c4a, 0x0000, 0x9c4b, 0x9c4d, 0x0000, 0x8984, 0x92ec,
+ /* b8 */ 0x9c4e, 0x0000, 0x8c9a, 0x89f4, 0x9455, 0x0000, 0x9c4f, 0x93f9,
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01aa1 ***/
+
+ /* 80 */ 0x0000, 0x95d9, 0x0000, 0x9c50, 0x984d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9c51, 0x95be, 0x9c54, 0x989f, 0x98af, 0x0000, 0x8eae,
+ /* 90 */ 0x93f3, 0x9c55, 0x0000, 0x8b7c, 0x92a2, 0x88f8, 0x9c56, 0x95a4,
+ /* 98 */ 0x8d4f, 0x0000, 0x0000, 0x926f, 0x0000, 0x0000, 0x0000, 0x92ed,
+ /* a0 */ 0x0000, 0xfab7, 0x0000, 0x0000, 0x0000, 0x96ed, 0x8cb7, 0x8cca,
+ /* a8 */ 0x0000, 0x9c57, 0x0000, 0x0000, 0x0000, 0x9c58, 0x0000, 0x9c5e,
+ /* b0 */ 0x0000, 0x8ee3, 0x0000, 0x0000, 0xfab8, 0x92a3, 0x0000, 0x8bad,
+ /* b8 */ 0x9c59, 0x0000, 0x0000, 0x0000, 0x954a, 0x0000, 0x9265,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01ae0 ***/
+
+ /* 80 */ 0x0000, 0x9c5a, 0x0000, 0x0000, 0x0000, 0xfa67, 0x0000, 0x0000,
+ /* 88 */ 0x9c5b, 0x0000, 0x8bae, 0x0000, 0x9c5c, 0x0000, 0x9c5d, 0x0000,
+ /* 90 */ 0x0000, 0x9c5f, 0x0000, 0x9396, 0x0000, 0x0000, 0x9c60, 0x9c61,
+ /* 98 */ 0x0000, 0x9c62, 0x0000, 0x0000, 0x9c53, 0x9c52, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9c63, 0x8c60, 0x0000, 0x0000, 0x0000, 0x9546, 0xfab9,
+ /* a8 */ 0x0000, 0x8dca, 0x9556, 0x92a4, 0x956a, 0x9c64, 0x0000, 0x0000,
+ /* b0 */ 0x8fb2, 0x8965, 0x0000, 0x9c65, 0x0000, 0x0000, 0x0000, 0x9c66,
+ /* b8 */ 0x0000, 0x96f0, 0x0000, 0x0000, 0x94de, 0x0000, 0x0000, 0x9c69,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01b20 ***/
+
+ /* 80 */ 0x899d, 0x90aa, 0x9c68, 0x9c67, 0x8c61, 0x91d2, 0x0000, 0x9c6d,
+ /* 88 */ 0x9c6b, 0x0000, 0x9c6a, 0x97a5, 0x8ce3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8f99, 0x9c6c, 0x936b, 0x8f5d, 0x0000, 0x0000, 0x0000, 0x93be,
+ /* 98 */ 0x9c70, 0x9c6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c6e, 0x0000,
+ /* a0 */ 0x9c71, 0x8ce4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9c72, 0x959c, 0x8f7a, 0x0000, 0x0000, 0x9c73, 0x94f7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x93bf, 0x92a5, 0x0000, 0x0000, 0xfaba,
+ /* b8 */ 0x0000, 0x934f, 0x0000, 0x0000, 0x9c74, 0x8b4a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01b5e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9053, 0x0000, 0x954b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8af5, 0x9445, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c75, 0x8e75,
+ /* 98 */ 0x9659, 0x965a, 0x0000, 0x0000, 0x899e, 0x9c7a, 0xfabb, 0x0000,
+ /* a0 */ 0x9289, 0x0000, 0x0000, 0x0000, 0x9c77, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x89f5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9cab, 0x9c79, 0x0000, 0x0000, 0x0000, 0x944f, 0x0000, 0x0000,
+ /* b8 */ 0x9c78, 0x0000, 0x0000, 0x9c76, 0x0000, 0x8d9a, 0x0000, 0x9c7c,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01b9e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c83, 0x9c89,
+ /* 90 */ 0x9c81, 0x0000, 0x937b, 0x0000, 0x0000, 0x9c86, 0x957c, 0x0000,
+ /* 98 */ 0x0000, 0x9c80, 0x0000, 0x9c85, 0x97e5, 0x8e76, 0x0000, 0x0000,
+ /* a0 */ 0x91d3, 0x9c7d, 0x0000, 0x0000, 0x0000, 0x8b7d, 0x9c88, 0x90ab,
+ /* a8 */ 0x8985, 0x9c82, 0x89f6, 0x9c87, 0x0000, 0x0000, 0x0000, 0x8baf,
+ /* b0 */ 0x0000, 0x9c84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9c8a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x01bdd ***/
+
+ /* 80 */ 0x0000, 0x9c8c, 0x9c96, 0x9c94, 0x0000, 0x0000, 0x9c91, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9c90, 0x97f6, 0x0000, 0x9c92, 0x0000, 0x0000,
+ /* 90 */ 0x8bb0, 0x0000, 0x8d50, 0x0000, 0x0000, 0x8f9a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9c99, 0x9c8b, 0x0000, 0x0000, 0xfabc, 0x0000, 0x9c8f,
+ /* a0 */ 0x9c7e, 0x0000, 0x89f8, 0x9c93, 0x9c95, 0x9270, 0x0000, 0x0000,
+ /* a8 */ 0x8da6, 0x89b6, 0x9c8d, 0x9c98, 0x9c97, 0x8bb1, 0x0000, 0x91a7,
+ /* b0 */ 0x8a86, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c62, 0x0000, 0x9c8e,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e682xx - offset 0x01c1c ***/
+
+ /* 80 */ 0x0000, 0x9c9a, 0x0000, 0x9c9d, 0x9c9f, 0xfabd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8ebb, 0xfabe, 0x9ca5, 0x92ee, 0x9c9b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9ca3, 0x0000, 0x89f7, 0x0000, 0x9ca1, 0x9ca2,
+ /* 98 */ 0x0000, 0x0000, 0x9c9e, 0x9ca0, 0x0000, 0x0000, 0x0000, 0x8ce5,
+ /* a0 */ 0x9749, 0x0000, 0x0000, 0x8ab3, 0x0000, 0x0000, 0x8978, 0x9ca4,
+ /* a8 */ 0x0000, 0x9459, 0x88ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x94df, 0x9c7b, 0x9caa, 0x9cae, 0x96e3, 0x0000,
+ /* b8 */ 0x9ca7, 0x0000, 0x0000, 0x0000, 0x9389, 0x9cac,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01c5a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fee, 0x9cad, 0x93d5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9866, 0x0000, 0x9ca9, 0x0000, 0xfac0, 0x0000, 0x0000,
+ /* 98 */ 0x9caf, 0x0000, 0x8d9b, 0x0000, 0x90c9, 0x0000, 0xfabf, 0x88d2,
+ /* a0 */ 0x9ca8, 0x9ca6, 0x0000, 0x9179, 0x0000, 0x0000, 0x0000, 0x9c9c,
+ /* a8 */ 0x8e53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x91c4, 0x9cbb, 0xfac2, 0x917a, 0x9cb6, 0x0000, 0x9cb3, 0x9cb4,
+ /* b8 */ 0x0000, 0x8ee4, 0x9cb7, 0x9cba, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e684xx - offset 0x01c9a ***/
+
+ /* 80 */ 0x9cb5, 0x8f44, 0x0000, 0x9cb8, 0x0000, 0x0000, 0x9cb2, 0x0000,
+ /* 88 */ 0x96fa, 0x96f9, 0x0000, 0x0000, 0x0000, 0x9cbc, 0x9cbd, 0x88d3,
+ /* 90 */ 0x0000, 0xfac3, 0x0000, 0x0000, 0x0000, 0x9cb1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8bf0, 0x88a4, 0x0000, 0x0000, 0x0000, 0x8ab4,
+ /* a0 */ 0xfac1, 0x9cb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cc1,
+ /* a8 */ 0x9cc0, 0x0000, 0x0000, 0x0000, 0x9cc5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfac5, 0x0000, 0x0000, 0x0000, 0x9cc6, 0x0000, 0x0000, 0xfac4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9cc4, 0x9cc7, 0x9cbf, 0x9cc3,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01cda ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9cc8, 0x0000, 0x9cc9, 0x0000, 0x0000, 0x9cbe,
+ /* 88 */ 0x8e9c, 0x0000, 0x9cc2, 0x91d4, 0x8d51, 0x9cb0, 0x9054, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9cd6, 0x0000, 0x95e7, 0x0000, 0x0000,
+ /* 98 */ 0x9ccc, 0x9ccd, 0x9cce, 0x0000, 0x0000, 0x9cd5, 0x0000, 0x9cd4,
+ /* a0 */ 0x0000, 0x0000, 0x969d, 0x8ab5, 0x0000, 0x9cd2, 0x0000, 0x8c64,
+ /* a8 */ 0x8a53, 0x0000, 0x0000, 0x9ccf, 0x0000, 0x0000, 0x97b6, 0x9cd1,
+ /* b0 */ 0x88d4, 0x9cd3, 0x0000, 0x9cca, 0x9cd0, 0x9cd7, 0x8c63, 0x9ccb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x977c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x01d19 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x974a, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cda,
+ /* 88 */ 0x0000, 0x0000, 0x9cde, 0x0000, 0x0000, 0x0000, 0x919e, 0x0000,
+ /* 90 */ 0x97f7, 0x9cdf, 0x0000, 0x0000, 0x9cdc, 0x0000, 0x9cd9, 0x0000,
+ /* 98 */ 0xfac6, 0x9cd8, 0x9cdd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x95ae, 0x0000, 0x0000, 0x93b2,
+ /* a8 */ 0x0000, 0x8c65, 0x0000, 0x9ce0, 0x9cdb, 0x0000, 0x9ce1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c9b, 0x0000, 0x0000, 0x0000, 0x89af, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9ce9, 0x0000, 0x0000, 0x0000, 0x8ab6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x01d58 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9ce7, 0x0000, 0x0000, 0x9ce8, 0x8da7,
+ /* 88 */ 0x9ce6, 0x9ce4, 0x9ce3, 0x9cea, 0x9ce2, 0x9cec, 0x0000, 0x0000,
+ /* 90 */ 0x89f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9cee, 0x0000, 0x0000, 0x9ced, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x92a6, 0x0000, 0x9cf1, 0x0000, 0x9cef, 0x9ce5,
+ /* b8 */ 0x8c9c, 0x0000, 0x9cf0, 0x0000, 0x9cf4, 0x9cf3, 0x9cf5, 0x9cf2,
+
+ /*** Three byte table, leaf: e688xx - offset 0x01d98 ***/
+
+ /* 80 */ 0x9cf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9cf7, 0x9cf8, 0x95e8, 0x0000, 0x9cfa, 0x9cf9, 0x8f5e, 0x0000,
+ /* 90 */ 0x90ac, 0x89e4, 0x89fa, 0xfac7, 0x9cfb, 0x0000, 0x88bd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x90ca, 0x9cfc, 0x0000, 0xe6c1, 0x9d40, 0x8c81,
+ /* a0 */ 0x0000, 0x9d41, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ed, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9d42, 0x0000, 0x0000, 0x0000, 0x9d43, 0x8b59,
+ /* b0 */ 0x9d44, 0x0000, 0x9d45, 0x9d46, 0x91d5, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8ccb, 0x0000, 0x0000, 0x96df, 0x0000, 0x0000, 0x0000, 0x965b,
+
+ /*** Three byte table, leaf: e689xx - offset 0x01dd8 ***/
+
+ /* 80 */ 0x8f8a, 0x9d47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ee,
+ /* 88 */ 0xe7bb, 0x94e0, 0x0000, 0x8ee8, 0x0000, 0x8dcb, 0x9d48, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x91c5, 0x0000, 0x95a5, 0x0000, 0x0000,
+ /* 98 */ 0x91ef, 0x0000, 0x0000, 0x9d4b, 0x0000, 0x0000, 0x9d49, 0x0000,
+ /* a0 */ 0x9d4c, 0x0000, 0x0000, 0x9d4a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9d4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95af, 0x0000,
+ /* b0 */ 0x0000, 0x88b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x957d, 0x0000,
+ /* b8 */ 0x0000, 0x94e1, 0x0000, 0x0000, 0x9d4e, 0x0000, 0x9d51, 0x8fb3,
+
+ /*** Three byte table, leaf: e68axx - offset 0x01e18 ***/
+
+ /* 80 */ 0x8b5a, 0x0000, 0x9d4f, 0x9d56, 0x8fb4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9d50, 0x9463, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x977d, 0x9d52, 0x9d53, 0x9d57, 0x938a, 0x9d54, 0x8d52,
+ /* 98 */ 0x90dc, 0x0000, 0x0000, 0x9d65, 0x94b2, 0x0000, 0x91f0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfac8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x94e2, 0x9dab, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x95f8, 0x0000, 0x0000, 0x0000, 0x92ef, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9695, 0x0000, 0x9d5a, 0x899f, 0x928a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x01e56 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9d63, 0x0000, 0x0000, 0x9253, 0x9d5d, 0x9d64,
+ /* 88 */ 0x9d5f, 0x9d66, 0x9d62, 0x0000, 0x9d61, 0x948f, 0x0000, 0x9d5b,
+ /* 90 */ 0x89fb, 0x9d59, 0x8b91, 0x91f1, 0x9d55, 0x0000, 0x0000, 0x9d58,
+ /* 98 */ 0x8d53, 0x90d9, 0x0000, 0x8fb5, 0x9d60, 0x9471, 0x0000, 0x0000,
+ /* a0 */ 0x8b92, 0x8a67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8a87, 0x9040, 0x9d68, 0x9d6d,
+ /* b0 */ 0x0000, 0x9d69, 0x0000, 0x8c9d, 0x0000, 0x9d6e, 0x8e41, 0x8d89,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f45, 0x9d5c,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x01e96 ***/
+
+ /* 80 */ 0x0000, 0x8e9d, 0x9d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e77,
+ /* 88 */ 0x9d6c, 0x88c2, 0x0000, 0x0000, 0x9d67, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x92a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x8b93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bb2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d6a,
+ /* a8 */ 0x88a5, 0x0000, 0x0000, 0x8dc1, 0x0000, 0x0000, 0x0000, 0x9055,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x92f0, 0x0000, 0x0000, 0x94d2, 0x9d70, 0x917d,
+
+ /*** Three byte table, leaf: e68dxx - offset 0x01ed6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x91a8, 0x0000, 0x0000, 0x8e4a, 0x9d71, 0x0000, 0x9d73,
+ /* 90 */ 0x9d6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x95df, 0x0000, 0x92bb,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x917b, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95f9,
+ /* a8 */ 0x8ecc, 0x9d80, 0x0000, 0x9d7e, 0x0000, 0x0000, 0x9098, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c9e, 0x0000, 0x0000, 0x0000, 0x9d78, 0x8fb7,
+ /* b8 */ 0x0000, 0x0000, 0x93e6, 0x9450, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68exx - offset 0x01f16 ***/
+
+ /* 80 */ 0x9d76, 0x0000, 0x0000, 0x917c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8ef6, 0x9d7b, 0x0000, 0x0000, 0x8fb6, 0x0000, 0x9d75, 0x9d7a,
+ /* 90 */ 0x0000, 0x0000, 0x9472, 0x0000, 0x0000, 0x0000, 0x9d74, 0x0000,
+ /* 98 */ 0x8c40, 0x0000, 0x0000, 0x8a7c, 0x0000, 0x0000, 0x0000, 0x9d7c,
+ /* a0 */ 0x97a9, 0x8dcc, 0x9254, 0x9d79, 0x0000, 0x90da, 0x0000, 0x8d54,
+ /* a8 */ 0x9084, 0x8986, 0x915b, 0x9d77, 0x8b64, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8c66, 0x0000, 0x92cd, 0x9d7d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x917e, 0x0000, 0x0000, 0x9d81, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x01f56 ***/
+
+ /* 80 */ 0x9d83, 0x0000, 0x0000, 0x91b5, 0x9d89, 0x0000, 0x9d84, 0x0000,
+ /* 88 */ 0x0000, 0x9d86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9560,
+ /* 90 */ 0x92f1, 0x0000, 0x9d87, 0x0000, 0x0000, 0x0000, 0x974b, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9767, 0x8ab7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x88ac, 0x0000, 0x9d85, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9d82, 0x0000, 0x0000, 0x0000, 0x0000, 0x8af6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8987, 0xfac9, 0x9d88, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9768,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x01f91 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d8c, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91b9, 0x0000, 0x9d93,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9d8d, 0x0000, 0x0000, 0x9d8a, 0x9d91,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9d72, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d8e, 0x0000,
+ /* a8 */ 0x9d92, 0x0000, 0x0000, 0x0000, 0x94c0, 0x938b, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9d8b, 0x0000, 0x9d8f, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8c67, 0x0000, 0x0000, 0x0000, 0x8def,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x01fd0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x90db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d97, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfaca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d94,
+ /* a8 */ 0x0000, 0x9680, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d95,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d96, 0x0000,
+ /* b8 */ 0x96cc, 0x0000, 0x90a0, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x0200d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8c82, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9d9d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8e54, 0x9d9a, 0x0000, 0x9d99, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9451, 0x0000, 0x0000, 0xfacb, 0x93b3, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9350, 0x9d9b, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9d9c, 0x0000, 0x958f, 0x0000, 0x9464, 0x8e42, 0x0000,
+ /* b0 */ 0x90ef, 0x0000, 0x966f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8a68, 0x0000, 0x9da3, 0x9d9e, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e693xx - offset 0x0204c ***/
+
+ /* 80 */ 0x0000, 0x9769, 0x9da5, 0x0000, 0x0000, 0x9da1, 0x0000, 0x9da2,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9180, 0xfacc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9da0, 0x0000, 0x9d5e, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9da4, 0x0000, 0x9d9f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9da9, 0x9daa, 0x9346, 0x9dac, 0x0000, 0x0000, 0x8e43, 0x9da7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8b5b, 0x0000, 0x0000, 0x9dad,
+ /* b0 */ 0x0000, 0x9da6, 0x9db1, 0x0000, 0x9db0, 0x0000, 0x9daf, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9db2, 0x0000, 0x0000, 0x9db4, 0x8fef, 0x0000,
+
+ /*** Three byte table, leaf: e694xx - offset 0x0208c ***/
+
+ /* 80 */ 0x9db3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9db7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9db5, 0x0000, 0x0000, 0x0000, 0x9db6, 0x9d90, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9db9, 0x9db8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9d98, 0x9dba, 0x9dae, 0x0000, 0x0000, 0x8e78,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9dbb, 0x9dbc, 0x9dbe, 0x9dbd,
+ /* b8 */ 0x9dbf, 0x89fc, 0x0000, 0x8d55, 0x0000, 0x0000, 0x95fa, 0x90ad,
+
+ /*** Three byte table, leaf: e695xx - offset 0x020cc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ccc, 0x0000, 0x0000,
+ /* 88 */ 0x9dc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dc4, 0xfacd, 0x9571,
+ /* 90 */ 0x0000, 0x8b7e, 0x0000, 0x0000, 0x0000, 0x9dc3, 0x9dc2, 0x9473,
+ /* 98 */ 0x9dc5, 0x8bb3, 0x0000, 0x0000, 0x0000, 0x9dc7, 0x9dc6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x8ab8, 0x8e55, 0x0000, 0x0000, 0x93d6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8c68, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9094, 0x0000, 0x9dc8, 0x0000, 0x90ae, 0x9347, 0x0000, 0x957e,
+ /* b8 */ 0x9dc9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x0210a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9dca, 0x9dcb, 0x0000, 0x0000, 0x0000, 0x95b6,
+ /* 88 */ 0x9b7c, 0x90c4, 0x0000, 0x0000, 0x956b, 0x0000, 0x8dd6, 0x0000,
+ /* 90 */ 0x94e3, 0x94c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x936c,
+ /* 98 */ 0x0000, 0x97bf, 0x0000, 0x9dcd, 0x8ece, 0x0000, 0x0000, 0x9dce,
+ /* a0 */ 0x0000, 0x88b4, 0x0000, 0x0000, 0x8bd2, 0x90cb, 0x0000, 0x9580,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9dcf, 0x8e61, 0x9266, 0x0000, 0x8e7a,
+ /* b0 */ 0x9056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dd0,
+ /* b8 */ 0x0000, 0x95fb, 0x0000, 0x0000, 0x8997, 0x8e7b, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e697xx - offset 0x02149 ***/
+
+ /* 80 */ 0x0000, 0x9dd3, 0x0000, 0x9dd1, 0x9dd4, 0x97b7, 0x9dd2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x90f9, 0x9dd5, 0x0000, 0x0000, 0x91b0,
+ /* 90 */ 0x0000, 0x0000, 0x9dd6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8af8,
+ /* 98 */ 0x0000, 0x9dd8, 0x0000, 0x9dd7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9dd9, 0x9dda, 0x8af9, 0x0000, 0x0000, 0x93fa, 0x9255, 0x8b8c,
+ /* a8 */ 0x8e7c, 0x9181, 0x0000, 0x0000, 0x8f7b, 0x88ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9ddb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x89a0, 0x9ddf, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e698xx - offset 0x02189 ***/
+
+ /* 80 */ 0xface, 0x0000, 0x8d56, 0x9dde, 0x0000, 0x0000, 0x8da9, 0x8fb8,
+ /* 88 */ 0x0000, 0xfad1, 0x9ddd, 0x0000, 0x8fb9, 0x0000, 0x96be, 0x8da8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x88d5, 0x90cc, 0xfacf, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9de4, 0x0000, 0xfad3, 0x90af,
+ /* a0 */ 0x8966, 0x0000, 0x0000, 0x0000, 0xfad4, 0x8f74, 0x0000, 0x9686,
+ /* a8 */ 0x8df0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fba, 0xfad2, 0x90a5,
+ /* b0 */ 0x0000, 0xfa63, 0x0000, 0x0000, 0x9de3, 0x9de1, 0x9de2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfad0, 0x928b, 0x0000, 0x0000, 0x9e45,
+
+ /*** Three byte table, leaf: e699xx - offset 0x021c9 ***/
+
+ /* 80 */ 0x0000, 0x9de8, 0x8e9e, 0x8d57, 0x9de6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9de7, 0x0000, 0x9057, 0x0000, 0x0000, 0x0000, 0x9de5,
+ /* 90 */ 0x0000, 0x0000, 0x8e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0xfad6,
+ /* 98 */ 0x0000, 0xfad7, 0x0000, 0x0000, 0x0000, 0x9dea, 0x9de9, 0x9dee,
+ /* a0 */ 0x0000, 0x0000, 0x9def, 0x0000, 0x9deb, 0xfad5, 0x8a41, 0x9dec,
+ /* a8 */ 0x9ded, 0x94d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9581, 0x8c69,
+ /* b0 */ 0x9df0, 0x0000, 0x0000, 0xfad9, 0x90b0, 0x0000, 0x8fbb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9271, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69axx - offset 0x02208 ***/
+
+ /* 80 */ 0x0000, 0x8bc5, 0x0000, 0x9df1, 0x9df5, 0x0000, 0x0000, 0x89c9,
+ /* 88 */ 0x9df2, 0x9df4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9df3, 0x0000,
+ /* 90 */ 0x0000, 0x8f8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x9267, 0x88c3,
+ /* 98 */ 0x9df6, 0xfada, 0x0000, 0x0000, 0x0000, 0x9df7, 0x0000, 0x0000,
+ /* a0 */ 0xfadb, 0x0000, 0x92a8, 0x0000, 0x0000, 0x0000, 0x97ef, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e62, 0x0000, 0x0000, 0x95e9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfadc, 0x0000, 0x965c, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9e41, 0x9df9, 0x0000, 0x0000, 0x9dfc, 0x0000, 0x9dfb, 0xfadd,
+
+ /*** Three byte table, leaf: e69bxx - offset 0x02248 ***/
+
+ /* 80 */ 0x0000, 0x9df8, 0x0000, 0x0000, 0x9e40, 0x0000, 0x0000, 0x93dc,
+ /* 88 */ 0x0000, 0x9dfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e42, 0x0000,
+ /* 98 */ 0x0000, 0x8f8c, 0x9e43, 0x0000, 0x976a, 0x9498, 0x0000, 0x0000,
+ /* a0 */ 0x9e44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e46, 0x0000,
+ /* a8 */ 0x0000, 0x9e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9e48, 0x0000, 0x8bc8, 0x8967, 0x8d58, 0x9e49, 0x0000, 0x9e4a,
+ /* b8 */ 0x8f91, 0x9182, 0xfade, 0xfa66, 0x99d6, 0x915d, 0x915c, 0x91d6,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x02288 ***/
+
+ /* 80 */ 0x8dc5, 0x0000, 0x0000, 0x98f0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8c8e, 0x974c, 0x0000, 0x95fc, 0x0000, 0x959e, 0xfadf, 0x9e4b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8df1, 0x92bd, 0x9e4c, 0x984e,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x965d, 0x0000, 0x92a9, 0x9e4d, 0x8afa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e4e, 0x9e4f,
+ /* a8 */ 0x96d8, 0x0000, 0x96a2, 0x9696, 0x967b, 0x8e44, 0x9e51, 0x0000,
+ /* b0 */ 0x0000, 0x8ee9, 0x0000, 0x0000, 0x9670, 0x0000, 0x9e53, 0x9e56,
+ /* b8 */ 0x9e55, 0x0000, 0x8af7, 0x0000, 0x0000, 0x8b80, 0x0000, 0x9e52,
+
+ /*** Three byte table, leaf: e69dxx - offset 0x022c8 ***/
+
+ /* 80 */ 0x0000, 0x9e54, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e57, 0x0000,
+ /* 88 */ 0x0000, 0x9099, 0x0000, 0x0000, 0x0000, 0x0000, 0x979b, 0x88c7,
+ /* 90 */ 0x8dde, 0x91ba, 0x0000, 0x8edb, 0x0000, 0x0000, 0x8ff1, 0x0000,
+ /* 98 */ 0x0000, 0x9e5a, 0x0000, 0x0000, 0x936d, 0x0000, 0x9e58, 0x91a9,
+ /* a0 */ 0x9e59, 0x8ff0, 0x96db, 0x9e5b, 0x9e5c, 0x9788, 0xfae1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9e61, 0x0000, 0x0000, 0x8d59, 0x0000, 0x9474,
+ /* b0 */ 0x9e5e, 0x938c, 0x9ddc, 0x9de0, 0x0000, 0x8b6e, 0x0000, 0x9466,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9e60, 0x0000, 0x8fbc, 0x94c2,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02308 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e66, 0x0000, 0x94f8,
+ /* 88 */ 0x0000, 0x9e5d, 0x0000, 0x9e63, 0x9e62, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x90cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x968d, 0x0000, 0x97d1,
+ /* 98 */ 0x0000, 0x0000, 0x9687, 0x0000, 0x89ca, 0x8e7d, 0x0000, 0x0000,
+ /* a0 */ 0x9867, 0x9e65, 0x9095, 0x0000, 0x0000, 0x0000, 0x9e64, 0x0000,
+ /* a8 */ 0x0000, 0x9e5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ccd,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9e6b, 0x9e69, 0x0000, 0x89cb, 0x9e67,
+ /* b8 */ 0x9e6d, 0x9e73, 0x0000, 0xfae2, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e69fxx - offset 0x02348 ***/
+
+ /* 80 */ 0xfae4, 0x91c6, 0x0000, 0x0000, 0x95bf, 0x0000, 0x9e75, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9541, 0x0000, 0x0000, 0x0000, 0x9e74, 0x9490,
+ /* 90 */ 0x965e, 0x8ab9, 0x0000, 0x90f5, 0x8f5f, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x92d1, 0x0000, 0x974d, 0x0000, 0x0000, 0x9e70, 0x9e6f, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x9e71, 0x0000, 0x9e6e, 0x0000, 0x0000, 0x9e76,
+ /* a8 */ 0x0000, 0x9e6c, 0x0000, 0x0000, 0x9e6a, 0x0000, 0x9e72, 0x9e68,
+ /* b0 */ 0x0000, 0x928c, 0x0000, 0x96f6, 0x8ec4, 0x8df2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8db8, 0x0000, 0x0000, 0x968f, 0x8a60,
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x02388 ***/
+
+ /* 80 */ 0x0000, 0xfae5, 0x92cc, 0x93c8, 0x8968, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x90f0, 0x0000, 0x0000, 0x90b2, 0x8c49,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e78, 0x0000,
+ /* a0 */ 0x0000, 0x8d5a, 0x8a9c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9e7a, 0x8a94, 0x9e81, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9e7d, 0x0000, 0x90f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8a6a, 0x8daa, 0x0000, 0x0000, 0x8a69, 0x8dcd, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x023c8 ***/
+
+ /* 80 */ 0x9e7b, 0x8c85, 0x8c6a, 0x938d, 0xfae6, 0x0000, 0x9e79, 0x0000,
+ /* 88 */ 0x88c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e7c, 0x9e7e, 0x0000,
+ /* 90 */ 0x8bcb, 0x8c4b, 0xfae3, 0x8aba, 0x8b6a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9e82, 0x0000, 0x0000, 0x8df7, 0x9691, 0x0000, 0x8e56,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9e83, 0x0000, 0x0000, 0x0000, 0x954f,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9e8f, 0x0000, 0x89b1, 0x9e84,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e95, 0x9e85,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02408 ***/
+
+ /* 80 */ 0x0000, 0x97c0, 0x0000, 0x9e8c, 0x0000, 0x947e, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e94, 0x0000, 0x9e87,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x88b2, 0x9e89, 0x0000, 0x0000, 0x8d5b,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9e8b, 0x0000, 0x9e8a, 0x0000, 0x9e86,
+ /* a0 */ 0x9e91, 0x0000, 0x8fbd, 0x0000, 0x0000, 0x0000, 0x9aeb, 0x8ce6,
+ /* a8 */ 0x979c, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e88, 0x0000, 0x92f2,
+ /* b0 */ 0x8a42, 0x8dab, 0x0000, 0x9e80, 0x0000, 0x9e90, 0x8a81, 0x0000,
+ /* b8 */ 0x0000, 0x9e8e, 0x9e92, 0x0000, 0x938e,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x02445 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8afc, 0x0000, 0x9eb0, 0x0000,
+ /* 88 */ 0xfa64, 0x96c7, 0x9e97, 0x8afb, 0x0000, 0x9e9e, 0x0000, 0xfae7,
+ /* 90 */ 0x0000, 0x0000, 0x965f, 0x0000, 0x9e9f, 0x9ea1, 0x0000, 0x9ea5,
+ /* 98 */ 0x9e99, 0x0000, 0x9249, 0x0000, 0x0000, 0x0000, 0x0000, 0x938f,
+ /* a0 */ 0x9ea9, 0x9e9c, 0x0000, 0x9ea6, 0x0000, 0x0000, 0x0000, 0x9ea0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9058, 0x9eaa,
+ /* b0 */ 0x0000, 0x0000, 0x90b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9ea8, 0x8abb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x02485 ***/
+
+ /* 80 */ 0x986f, 0x9e96, 0x0000, 0x0000, 0x9ea4, 0x88d6, 0x0000, 0x0000,
+ /* 88 */ 0x9e98, 0x0000, 0x0000, 0x96b8, 0x9e9d, 0x9041, 0x92c5, 0x9e93,
+ /* 90 */ 0x0000, 0x0000, 0x9ea3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x909a, 0x9ead, 0x8a91, 0x8c9f, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9eaf, 0x9e9a, 0x9eae, 0x0000, 0x9ea7, 0x9e9b, 0x0000,
+ /* a8 */ 0x9eab, 0x0000, 0x9eac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x9ebd, 0x0000, 0x0000, 0x0000, 0x93cc, 0x0000, 0x9ea2, 0x0000,
+ /* b8 */ 0x0000, 0x9eb9, 0x0000, 0x0000, 0x0000, 0x9ebb, 0x0000, 0x92d6,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x024c5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x976b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9596, 0x9eb6, 0x91c8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9ebc, 0x915e, 0x0000, 0x9eb3, 0x9ec0, 0x9ebf, 0x0000,
+ /* a0 */ 0x93ed, 0x9ebe, 0x93e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xfae9, 0x0000, 0x9ec2, 0x9eb5, 0x0000, 0x8bc6, 0x9eb8, 0x8f7c,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9480, 0x9eba, 0x8bc9, 0x0000, 0x9eb2,
+ /* b8 */ 0x9eb4, 0x9eb1, 0x0000, 0x0000, 0x984f, 0x8a79, 0x9eb7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x02504 ***/
+
+ /* 80 */ 0x0000, 0x9ec1, 0x8a54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x8de5, 0x0000, 0x0000, 0x0000, 0x897c, 0x0000,
+ /* 90 */ 0x0000, 0x9ed2, 0x0000, 0x0000, 0x9850, 0x9ed5, 0x0000, 0x0000,
+ /* 98 */ 0xfaeb, 0x0000, 0x0000, 0x9059, 0x9ed4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9ed3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ed0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ec4, 0x0000,
+ /* b0 */ 0x0000, 0x9ee1, 0x9ec3, 0x0000, 0x9ed6, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9ece, 0x0000, 0x0000, 0x9ec9, 0x9ec6,
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x02544 ***/
+
+ /* 80 */ 0x0000, 0x9ec7, 0x0000, 0x9ecf, 0x0000, 0x0000, 0x0000, 0xeaa0,
+ /* 88 */ 0x0000, 0x0000, 0x9ecc, 0x8d5c, 0x92c6, 0x9184, 0x9eca, 0x0000,
+ /* 90 */ 0x9ec5, 0x0000, 0x0000, 0x9ec8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x976c, 0x968a, 0x0000, 0x0000, 0x0000, 0x9ecd, 0x9ed7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfaec, 0x0000, 0x0000, 0x0000, 0x0000, 0x9edf,
+ /* a8 */ 0x9ed8, 0x0000, 0x0000, 0x9ee5, 0x0000, 0x9ee3, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9ede, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9edd, 0x0000, 0x92ce, 0x0000, 0x9185, 0x0000, 0x9edb,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x02584 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9ed9, 0x0000, 0x0000, 0x9ee0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9ee6, 0x94f3, 0x9eec, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9ee7, 0x9eea, 0x9ee4, 0x0000, 0x0000, 0x9294,
+ /* 98 */ 0x0000, 0x9557, 0x0000, 0x9eda, 0x0000, 0x0000, 0x9ee2, 0x8fbe,
+ /* a0 */ 0x0000, 0x96cd, 0x9ef6, 0x9ee9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8ca0, 0x89a1, 0x8a7e, 0x0000, 0x0000, 0x9ed1, 0x0000,
+ /* b0 */ 0xfaed, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fbf, 0x9eee, 0x0000,
+ /* b8 */ 0x9ef5, 0x8ef7, 0x8a92, 0x0000, 0x0000, 0x924d,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x025c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9eeb, 0x0000, 0xfaef, 0x9ef0,
+ /* 88 */ 0x9ef4, 0x0000, 0x0000, 0x8bb4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8b6b, 0x9ef2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b40,
+ /* a0 */ 0x0000, 0x93c9, 0x9ef1, 0x0000, 0x0000, 0x0000, 0x9ef3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfaee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9eed, 0xfaf0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9eef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaf1, 0x8a80,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02602 ***/
+
+ /* 80 */ 0x9268, 0x0000, 0x0000, 0x0000, 0x9efa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ef8, 0x8ce7, 0x0000,
+ /* 90 */ 0x9ef7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f40,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9e77, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9ef9, 0x0000, 0x9efb, 0x9efc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9f4b, 0x0000, 0x9f47, 0x0000, 0x9e8d, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9f46, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9f45, 0x0000, 0x0000, 0x9f42, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x02641 ***/
+
+ /* 80 */ 0x0000, 0x9ee8, 0x9f44, 0x9f43, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x9f49, 0x0000, 0x9845, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9f4c, 0x8bf9, 0x0000, 0x0000, 0x9f48, 0x9f4a,
+ /* a0 */ 0x0000, 0x0000, 0xfaf2, 0x0000, 0xfaf3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x94a5, 0x0000, 0x9f4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9f51, 0x9f4e,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x0267d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9793, 0x9f4f, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9edc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9f52, 0x0000, 0x0000, 0x0000, 0x9f53, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8954, 0x0000, 0x9f55,
+ /* a0 */ 0x8c87, 0x8e9f, 0x0000, 0x8bd3, 0x0000, 0x0000, 0x0000, 0x89a2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x977e, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f57,
+ /* b8 */ 0x9f56, 0x9f59, 0x8b5c, 0x0000, 0x0000, 0x8bd4, 0x8abc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x026bc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9f5c, 0x0000, 0x0000, 0x0000, 0x9f5b,
+ /* 88 */ 0x0000, 0x9f5d, 0x0000, 0x0000, 0x89cc, 0x0000, 0x9256, 0x0000,
+ /* 90 */ 0x9f5e, 0x0000, 0x0000, 0x8abd, 0x9f60, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9f5f, 0x0000, 0x9f61, 0x0000, 0x0000, 0x0000, 0x9f62,
+ /* a0 */ 0x0000, 0x9f63, 0x8e7e, 0x90b3, 0x8d9f, 0x0000, 0x9590, 0x0000,
+ /* a8 */ 0x0000, 0x95e0, 0x9863, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e95,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8dce, 0x97f0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9f64, 0x9f65, 0x0000, 0x8e80, 0x0000, 0x0000, 0x0000, 0x9f66,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x026fc ***/
+
+ /* 80 */ 0x9f67, 0x0000, 0x0000, 0x9f69, 0x9f68, 0x0000, 0x9677, 0x0000,
+ /* 88 */ 0x0000, 0x8f7d, 0x8eea, 0x8e63, 0x0000, 0x9f6a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f6c, 0x9042, 0x0000,
+ /* 98 */ 0x9f6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f6d, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9f6e, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9f6f, 0x9f70, 0x0000, 0x0000, 0x0000, 0x9f71,
+ /* b0 */ 0x0000, 0x9f73, 0x9f72, 0x9f74, 0x89a3, 0x9269, 0x0000, 0x9f75,
+ /* b8 */ 0x0000, 0x0000, 0x8e45, 0x8a6b, 0x9f76, 0x0000, 0x0000, 0x9361,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x0273c ***/
+
+ /* 80 */ 0x9aca, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b42, 0x9f77, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x9f78, 0x0000, 0x95ea, 0x9688, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x93c5, 0x9f79, 0x94e4, 0x0000, 0xfaf4, 0x0000,
+ /* 98 */ 0x94f9, 0x0000, 0x0000, 0x96d1, 0x0000, 0x0000, 0x0000, 0x9f7a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9f7c, 0x9f7b, 0x0000, 0x0000, 0x9f7e,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9f7d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x02774 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9f81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e81,
+ /* 90 */ 0x0000, 0x96af, 0x0000, 0x9f82, 0x9f83, 0x0000, 0x0000, 0x8b43,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9f84, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9f86, 0x9f85, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x0000, 0x9558,
+ /* b8 */ 0x8969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94c3, 0xfaf5,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x027b4 ***/
+
+ /* 80 */ 0x92f3, 0x8f60, 0x8b81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94c4, 0x0000,
+ /* 90 */ 0x8eac, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f88, 0x0000, 0x8abe,
+ /* 98 */ 0x0000, 0x0000, 0x8998, 0x0000, 0xfaf6, 0x93f0, 0x9f87, 0x8d5d,
+ /* a0 */ 0x9272, 0x0000, 0x9f89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9f91, 0x0000, 0x9f8a, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaf8,
+ /* b0 */ 0x91bf, 0x0000, 0x8b82, 0x9f92, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8c88, 0x0000, 0x0000, 0x8b44, 0x9f90,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x027f3 ***/
+
+ /* 80 */ 0x0000, 0x9f8e, 0x9f8b, 0x9780, 0x0000, 0x0000, 0xfaf7, 0x0000,
+ /* 88 */ 0x92be, 0x0000, 0x0000, 0x0000, 0x93d7, 0x9f8c, 0x0000, 0x0000,
+ /* 90 */ 0x9f94, 0x0000, 0x9f93, 0x8c42, 0x0000, 0x0000, 0x89ab, 0x0000,
+ /* 98 */ 0x0000, 0x8db9, 0x9f8d, 0x9f8f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9676, 0x91f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9697, 0x0000, 0x0000, 0x9f9c, 0x0000,
+ /* b0 */ 0x0000, 0x9f9d, 0x0000, 0x89cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x95a6, 0x96fb, 0x9f9f, 0x8ea1, 0x8fc0, 0x9f98, 0x9f9e, 0x8988,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02833 ***/
+
+ /* 80 */ 0x0000, 0x8bb5, 0x0000, 0x0000, 0x9f95, 0x9f9a, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x90f2, 0x9491, 0x0000, 0x94e5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9f97, 0x0000, 0x9640, 0x0000, 0x9f99,
+ /* 98 */ 0x0000, 0x9fa2, 0xfaf9, 0x9fa0, 0x0000, 0x9f9b, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9641, 0x9467, 0x8b83, 0x0000, 0x9344, 0x0000, 0x0000,
+ /* a8 */ 0x928d, 0x0000, 0x9fa3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa1,
+ /* b0 */ 0x91d7, 0x9f96, 0x0000, 0x896a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x0286f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfafa, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x976d, 0x9fae, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9fad, 0x0000, 0x0000, 0x0000, 0x0000, 0x90f4,
+ /* 98 */ 0x0000, 0x9faa, 0x0000, 0x978c, 0x0000, 0x0000, 0x93b4, 0x9fa4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92c3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x896b, 0x8d5e, 0x9fa7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8f46, 0x9fac, 0x0000, 0x9fab, 0x9fa6, 0x0000,
+ /* b8 */ 0x9fa9, 0x0000, 0x0000, 0x8a88, 0x0000, 0x9fa8, 0x9468,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x028ae ***/
+
+ /* 80 */ 0x0000, 0x97ac, 0x0000, 0x0000, 0x8ff2, 0x90f3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9fb4, 0x9fb2, 0x0000, 0x956c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x9faf, 0x9fb1, 0x0000, 0x8959, 0x0000,
+ /* a8 */ 0x0000, 0x8d5f, 0x9851, 0x0000, 0x8a5c, 0x0000, 0x9582, 0xfafc,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9781, 0x0000, 0x0000, 0x8a43,
+ /* b8 */ 0x905a, 0x9fb3, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x028e9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fb8, 0x0000, 0xfafb,
+ /* 88 */ 0x8fc1, 0x0000, 0x0000, 0x0000, 0x974f, 0x0000, 0x9fb5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x9fb0, 0x0000, 0x9fb6, 0xfb40, 0x0000,
+ /* 98 */ 0x0000, 0x97dc, 0x0000, 0x9393, 0x93c0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb41, 0x0000, 0x0000, 0x8a55,
+ /* b0 */ 0x0000, 0x0000, 0x8974, 0x0000, 0x0000, 0x9fbc, 0x0000, 0x0000,
+ /* b8 */ 0x9fbf, 0x0000, 0x0000, 0x0000, 0x97c1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02929 ***/
+
+ /* 80 */ 0x9784, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fc6, 0x9fc0, 0x9fbd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x97d2, 0x9fc3, 0x0000, 0x0000, 0xfb42,
+ /* 90 */ 0x0000, 0x8f69, 0x9fc5, 0x0000, 0x0000, 0x9fca, 0x0000, 0x0000,
+ /* 98 */ 0x9391, 0x9fc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fc2, 0x0000,
+ /* a0 */ 0x0000, 0x9257, 0x0000, 0x0000, 0x9fc9, 0x0000, 0x9fbe, 0x0000,
+ /* a8 */ 0x9fc4, 0x0000, 0x9fcb, 0x88fa, 0x9fc1, 0x0000, 0x9fcc, 0x0000,
+ /* b0 */ 0x0000, 0x905b, 0xfb44, 0x8f7e, 0x0000, 0x95a3, 0x0000, 0x8dac,
+ /* b8 */ 0xfb43, 0x9fb9, 0x9fc7, 0x9359, 0xfb45,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02966 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90b4, 0x0000, 0x8a89,
+ /* 88 */ 0x8dcf, 0x8fc2, 0x9fbb, 0x8f61, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8c6b, 0x0000, 0x9fba, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9fd0, 0x8f8d, 0x8cb8, 0x0000, 0x9fdf, 0x0000, 0x9fd9,
+ /* a0 */ 0x8b94, 0x936e, 0x0000, 0x9fd4, 0x9fdd, 0x88ad, 0x8951, 0xfb48,
+ /* a8 */ 0x0000, 0x89b7, 0x0000, 0x9fd6, 0x91aa, 0x9fcd, 0x9fcf, 0x8d60,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9fe0, 0xfb46, 0x9fdb, 0x0000, 0xfb49, 0x0000, 0x9fd3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x029a5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x9fda, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x96a9, 0x0000, 0x0000, 0x9fd8, 0x9fdc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cce, 0x0000,
+ /* 98 */ 0x8fc3, 0x0000, 0x0000, 0x9258, 0xfb47, 0x0000, 0x0000, 0x9fd2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x974e,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9fd5, 0x0000, 0x0000, 0x9fce, 0x9392,
+ /* b0 */ 0x0000, 0x0000, 0x9fd1, 0x0000, 0x0000, 0x0000, 0x9fd7, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9870, 0x8ebc,
+
+ /*** Three byte table, leaf: e6baxx - offset 0x029e5 ***/
+
+ /* 80 */ 0x969e, 0x0000, 0x9fe1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x94ac, 0x0000, 0x0000, 0x9fed,
+ /* 90 */ 0x8cb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f80, 0x0000,
+ /* 98 */ 0x9fe3, 0x0000, 0x0000, 0x0000, 0x97ad, 0x8d61, 0x0000, 0x9ff0,
+ /* a0 */ 0x0000, 0x0000, 0x88ec, 0x0000, 0x0000, 0x9fee, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9fe2, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fe8,
+ /* b0 */ 0x0000, 0x0000, 0x9fea, 0x0000, 0x0000, 0x0000, 0x976e, 0x9fe5,
+ /* b8 */ 0x0000, 0x0000, 0x934d, 0x0000, 0x0000, 0x9fe7, 0x0000, 0xfb4a,
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02a25 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x9fef, 0x0000, 0x9fe9, 0x96c5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9fe4, 0x0000, 0x8ea0, 0x9ffc, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8a8a, 0x0000, 0x9fe6, 0x9feb, 0x9fec, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91ea, 0x91d8, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9ff4, 0x0000, 0x0000, 0x9ffa,
+ /* b0 */ 0x0000, 0x0000, 0x9ff8, 0x0000, 0x9348, 0x0000, 0x0000, 0xe042,
+ /* b8 */ 0x9ff5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ff6, 0x9fde,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02a65 ***/
+
+ /* 80 */ 0x0000, 0x8b99, 0x9559, 0x0000, 0x0000, 0x0000, 0x8ebd, 0x0000,
+ /* 88 */ 0x0000, 0x8d97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9852,
+ /* 90 */ 0x0000, 0x9ff2, 0x0000, 0xe041, 0x8989, 0x9186, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9499, 0x0000, 0x8abf, 0x97f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x969f, 0x92d0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9ff9, 0x9ffb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9151, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe040, 0x9ff7,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02aa5 ***/
+
+ /* 80 */ 0x0000, 0x9ff1, 0x0000, 0x0000, 0x0000, 0x8ac1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8c89, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe04e, 0x0000, 0x0000, 0xe049, 0x90f6, 0x0000, 0x0000, 0x8a83,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f81, 0x0000, 0xe052, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe04b, 0x92aa, 0xe048,
+ /* b0 */ 0x92d7, 0x0000, 0x0000, 0x0000, 0xe06b, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe045, 0x0000, 0xe044, 0x0000, 0xe04d, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02ae5 ***/
+
+ /* 80 */ 0xe047, 0xe046, 0xe04c, 0x0000, 0x909f, 0x0000, 0xe043, 0x0000,
+ /* 88 */ 0xfb4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe04f, 0x0000,
+ /* 90 */ 0x0000, 0xe050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ac0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe055, 0x0000, 0xe054, 0xe056, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9362, 0x0000, 0xe053, 0x0000, 0xfb4c, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe057, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02b25 ***/
+
+ /* 80 */ 0x8c83, 0x91f7, 0xe051, 0x945a, 0x0000, 0x0000, 0xe058, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe05d, 0xe05b, 0x0000, 0x0000,
+ /* 98 */ 0xe05e, 0x0000, 0x0000, 0xe061, 0x0000, 0x0000, 0x0000, 0xe05a,
+ /* a0 */ 0x8d8a, 0x9447, 0x0000, 0x0000, 0x9fb7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9794, 0xe05c, 0x0000, 0xe060, 0x91f3,
+ /* b0 */ 0x0000, 0xe05f, 0x0000, 0xe04a, 0x0000, 0xfb4d, 0xe889, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe064, 0x0000, 0x0000, 0x0000, 0xe068,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e780xx - offset 0x02b64 ***/
+
+ /* 80 */ 0x0000, 0xe066, 0x0000, 0x0000, 0x0000, 0xfb4e, 0x0000, 0xfb4f,
+ /* 88 */ 0x0000, 0xe062, 0x0000, 0xe063, 0x0000, 0x0000, 0x0000, 0xe067,
+ /* 90 */ 0x0000, 0xe065, 0x0000, 0x0000, 0x0000, 0x956d, 0x0000, 0x0000,
+ /* 98 */ 0xe06d, 0x0000, 0xe06a, 0xe069, 0x0000, 0xe06c, 0x93d2, 0xe06e,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9295, 0x91eb,
+ /* a8 */ 0xfb50, 0x0000, 0x0000, 0x0000, 0x90a3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe06f, 0x0000, 0xe071, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe070,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02ba3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9ff3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x93e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe073, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x89ce, 0x0000, 0x0000, 0x0000, 0x9394,
+ /* b0 */ 0x8a44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8b84, 0x0000, 0x0000, 0x0000, 0x8edc, 0x8dd0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02be1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb51, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9846, 0x9086, 0x0000, 0x0000, 0x0000, 0x898a, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe074, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfb52, 0xe078, 0x9259, 0xe07b, 0xe076,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe07a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe079, 0x935f, 0x88d7, 0xfa62,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02c1d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x97f3, 0x0000, 0x0000, 0xe07d, 0x0000, 0x0000, 0x0000, 0x8947,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe080, 0x0000, 0x0000, 0x0000, 0xe07e, 0x0000, 0xe07c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe077, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x9642, 0x0000, 0x0000, 0x0000, 0xe082,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02c5b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb54, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb53,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x898b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe084, 0x95b0, 0x0000, 0xe083, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x96b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9152, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02c98 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb56, 0xfb57,
+ /* 88 */ 0x0000, 0x97f9, 0x0000, 0x0000, 0xe08a, 0x0000, 0x90f7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe086, 0xe08b, 0x0000,
+ /* 98 */ 0x0000, 0x898c, 0x0000, 0x0000, 0xfb55, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe089, 0x0000, 0x9481, 0xe085, 0xe088, 0x8fc6,
+ /* a8 */ 0x0000, 0x94cf, 0x0000, 0x0000, 0xe08c, 0x0000, 0x8ecf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90f8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e786xx - offset 0x02cd6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe08f, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe087, 0x0000, 0x8c46, 0x0000, 0x0000, 0x0000, 0x0000, 0xe08d,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x976f, 0xe090, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xeaa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f6e,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe091, 0x0000, 0x0000, 0x0000, 0xe092, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x944d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe094, 0x0000, 0x0000, 0x0000, 0x0000, 0xe095,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x02d15 ***/
+
+ /* 80 */ 0x0000, 0xfb59, 0x0000, 0x9452, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x9395, 0xe097, 0x0000, 0x0000, 0x0000, 0x0000, 0xe099, 0x0000,
+ /* 90 */ 0x97d3, 0x0000, 0xe096, 0x0000, 0xe098, 0x898d, 0x0000, 0xe093,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a7a,
+ /* a0 */ 0xe09a, 0x0000, 0x0000, 0x0000, 0x0000, 0x9187, 0x8e57, 0xe09c,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe09b, 0x9043, 0x99d7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe09d, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe09f, 0x0000, 0xe08e, 0xe09e, 0x0000, 0xfb5a, 0xe0a0,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02d55 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949a, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a1, 0x0000, 0x0000,
+ /* 90 */ 0xe0a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0a3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe0a4, 0x0000, 0x92dc, 0x0000, 0xe0a6, 0xe0a5, 0x0000, 0x0000,
+ /* b0 */ 0xe0a7, 0x0000, 0xe0a8, 0x0000, 0x0000, 0x8edd, 0x9583, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x96ea, 0xe0a9, 0xe0aa, 0x9175, 0x8ea2, 0xe0ab,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02d95 ***/
+
+ /* 80 */ 0xe0ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ad, 0x95d0,
+ /* 88 */ 0x94c5, 0x0000, 0x0000, 0xe0ae, 0x9476, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x92ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe0af, 0x89e5, 0x0000, 0x8b8d, 0x0000, 0x96c4, 0x0000, 0x96b4,
+ /* a0 */ 0x0000, 0x89b2, 0x9853, 0x0000, 0x0000, 0x0000, 0x0000, 0x9671,
+ /* a8 */ 0x0000, 0x95a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x90b5, 0x0000, 0xe0b0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x93c1, 0x0000, 0x0000, 0x0000, 0x8ca1, 0xe0b1, 0x0000,
+
+ /*** Three byte table, leaf: e78axx - offset 0x02dd5 ***/
+
+ /* 80 */ 0x8dd2, 0xe0b3, 0xe0b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0b4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe0b5, 0x0000, 0x0000, 0x0000, 0xe0b6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8b5d, 0x0000, 0xe0b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0b8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ca2, 0x0000, 0x0000, 0x94c6,
+ /* b0 */ 0x0000, 0xfb5b, 0xe0ba, 0x0000, 0x0000, 0x0000, 0x8ff3, 0x0000,
+ /* b8 */ 0x0000, 0xe0b9, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb5c,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78bxx - offset 0x02e14 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8bb6, 0xe0bb, 0xe0bd, 0x0000, 0xe0bc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0be, 0x0000,
+ /* 90 */ 0x8ccf, 0x0000, 0xe0bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be7,
+ /* 98 */ 0x0000, 0x915f, 0x0000, 0x8d9d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe0c1, 0xe0c2, 0xe0c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8eeb, 0x0000, 0x0000, 0x93c6, 0x8bb7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c4,
+ /* b8 */ 0x924b, 0xe0c3, 0x0000, 0x0000, 0x9854, 0x9482,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x02e52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe0c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c9, 0xe0c6,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x96d2, 0xe0c8, 0xe0ca, 0x0000, 0x97c2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb5d, 0xe0ce, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe0cd, 0x9296, 0x944c, 0x0000, 0x0000, 0x8ca3, 0xe0cc,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0cb, 0x0000, 0x9750, 0x9751,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0cf, 0x898e,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x02e92 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8d96, 0x8e82, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d0, 0xe0d1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d3,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8f62, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe0d5, 0x0000, 0xe0d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe0d6, 0x0000, 0x8a6c, 0x0000, 0x0000, 0xe0d8, 0x0000, 0xfb5f,
+ /* b8 */ 0xe0d7, 0x0000, 0xe0da, 0xe0d9,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x02ece ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8cba, 0x0000, 0x0000, 0x97a6,
+ /* 88 */ 0x0000, 0x8bca, 0x0000, 0x89a4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8adf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x97e6, 0xe0dc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe0de, 0x0000, 0xfb60, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x02f0e ***/
+
+ /* 80 */ 0xe0df, 0x0000, 0x89cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe0db, 0xfb61, 0x8e58, 0x0000, 0x0000, 0x92bf, 0xe0dd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfb64, 0x0000, 0x0000, 0x0000, 0xfb62, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e2, 0x0000,
+ /* a0 */ 0x8eec, 0x0000, 0x0000, 0xfb63, 0x0000, 0xe0e0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8c5d, 0x0000, 0x0000, 0x94c7, 0xe0e1, 0x0000,
+ /* b0 */ 0x0000, 0xe0fc, 0x0000, 0x0000, 0x0000, 0xfb66, 0x0000, 0x0000,
+ /* b8 */ 0xe0e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cbb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x02f4d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8b85, 0x0000, 0xe0e4, 0x979d, 0xfb65,
+ /* 88 */ 0x0000, 0x97ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x91f4, 0x0000, 0x0000, 0xe0e6, 0xfb67, 0x0000,
+ /* a8 */ 0x0000, 0xfb69, 0xfb68, 0x0000, 0x0000, 0x0000, 0xfb6a, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe0e8, 0x97d4, 0x8bd5, 0x94fa, 0x9469, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe0e9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0eb,
+
+ /*** Three byte table, leaf: e791xx - offset 0x02f8d ***/
+
+ /* 80 */ 0x0000, 0xe0ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ea, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe0ed, 0x8ce8, 0x896c, 0xe0ef, 0x0000, 0x9090, 0xe0ec,
+ /* a0 */ 0x97da, 0x0000, 0xfb6b, 0xe0f2, 0xeaa2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe0f0, 0xe0f3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e5,
+ /* b0 */ 0xe0f1, 0x0000, 0x0000, 0x8dba, 0x0000, 0x0000, 0xe0f4, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x02fcc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x979e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfb6c, 0x0000, 0xe0f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f7, 0xfb6d,
+ /* a0 */ 0x0000, 0x0000, 0xe0e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8ac2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ea3,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e793xx - offset 0x0300a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe0f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fa,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fb, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x895a, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe140, 0x0000, 0x955a, 0xe141, 0x0000, 0x0000, 0x8aa2, 0xe142,
+ /* a8 */ 0x0000, 0xe143, 0x0000, 0x0000, 0x0000, 0x0000, 0xe144, 0x0000,
+ /* b0 */ 0xe146, 0xe147, 0xe145, 0x0000, 0x0000, 0x0000, 0x9572, 0xe149,
+ /* b8 */ 0xe148, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e794xx - offset 0x03049 ***/
+
+ /* 80 */ 0x0000, 0xfb6e, 0x0000, 0xe14b, 0xe14a, 0xe14c, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe14d, 0xe14f, 0xe14e, 0x0000,
+ /* 90 */ 0x0000, 0x8d99, 0x0000, 0xe151, 0x0000, 0xe150, 0x0000, 0x0000,
+ /* 98 */ 0x8ac3, 0x0000, 0x9072, 0x0000, 0x935b, 0x0000, 0xe152, 0x90b6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8e59, 0x0000, 0x8999, 0xe153, 0x0000,
+ /* a8 */ 0x9770, 0x0000, 0x0000, 0x95e1, 0xe154, 0x0000, 0x0000, 0xfaa8,
+ /* b0 */ 0x9363, 0x9752, 0x8d62, 0x905c, 0x0000, 0x0000, 0x0000, 0x926a,
+ /* b8 */ 0x99b2, 0x0000, 0x92ac, 0x89e6, 0xe155,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e795xx - offset 0x03086 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe156, 0x0000, 0xe15b, 0x0000,
+ /* 88 */ 0x0000, 0xe159, 0xe158, 0x9dc0, 0x8a45, 0xe157, 0x0000, 0x88d8,
+ /* 90 */ 0x0000, 0x94a8, 0x0000, 0x0000, 0x94c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x97af, 0xe15c, 0xe15a, 0x927b, 0x90a4, 0x0000, 0x0000,
+ /* a0 */ 0x94a9, 0x0000, 0x954c, 0x0000, 0xe15e, 0x97aa, 0x8c6c, 0xe15f,
+ /* a8 */ 0x0000, 0xe15d, 0x94d4, 0xe160, 0x0000, 0xe161, 0x0000, 0xfb6f,
+ /* b0 */ 0x88d9, 0x0000, 0x0000, 0x8ff4, 0xe166, 0x0000, 0xe163, 0x93eb,
+ /* b8 */ 0xe162, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b45,
+
+ /*** Three byte table, leaf: e796xx - offset 0x030c6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe169, 0x0000, 0x0000, 0x0000, 0xe164, 0xe165,
+ /* 88 */ 0x0000, 0xe168, 0xe167, 0x9544, 0x0000, 0x0000, 0x9161, 0x9160,
+ /* 90 */ 0x0000, 0x8b5e, 0x0000, 0x0000, 0xe16a, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe16b, 0x0000, 0x0000, 0xe16c, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe16e, 0x0000, 0xe16d, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe176, 0x94e6, 0xe170, 0x0000, 0xe172, 0x0000, 0x0000,
+ /* b8 */ 0xe174, 0x905d, 0x0000, 0x0000, 0xe175, 0xe173, 0x8ebe,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e797xx - offset 0x03105 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe16f, 0xe171, 0x0000, 0x9561, 0x0000, 0x8fc7,
+ /* 88 */ 0x0000, 0x0000, 0xe178, 0x0000, 0x0000, 0xe177, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe179, 0x0000, 0x8ea4, 0x8dad, 0x0000, 0x0000,
+ /* 98 */ 0x9397, 0xe17a, 0x0000, 0x92c9, 0x0000, 0x0000, 0xe17c, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x979f, 0xe17b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x9189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe182, 0x0000, 0xe184, 0xe185, 0x9273, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe183, 0x0000, 0xe180, 0x0000, 0xe17d, 0xe17e,
+
+ /*** Three byte table, leaf: e798xx - offset 0x03145 ***/
+
+ /* 80 */ 0x0000, 0xe181, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe188, 0x0000, 0xe186, 0x0000, 0xe187, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe189,
+ /* a0 */ 0xe18b, 0xe18c, 0xe18d, 0x0000, 0xe18e, 0x0000, 0x0000, 0xe18a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe190, 0x0000, 0x0000, 0x0000, 0xe18f, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe191, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x03183 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x97c3, 0x0000, 0x0000, 0x0000, 0xe194, 0xe192,
+ /* 88 */ 0xe193, 0x0000, 0x0000, 0x0000, 0x8ae0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x96fc, 0x0000, 0x0000, 0x0000, 0x95c8, 0x0000,
+ /* 98 */ 0xe196, 0x0000, 0x0000, 0x0000, 0xe195, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe197, 0xe198, 0x0000, 0x0000, 0x0000, 0x0000, 0xe19c,
+ /* a8 */ 0xe199, 0xe19a, 0xe19b, 0x0000, 0xe19d, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe19e, 0x0000, 0xe19f, 0x0000, 0x0000, 0x0000, 0xe1a0, 0x0000,
+ /* b8 */ 0xe1a1, 0x0000, 0x94ad, 0x936f, 0xe1a2, 0x9492, 0x9553, 0x0000,
+
+ /*** Three byte table, leaf: e79axx - offset 0x031c3 ***/
+
+ /* 80 */ 0xe1a3, 0x0000, 0xfb70, 0xe1a4, 0x9349, 0x0000, 0x8a46, 0x8d63,
+ /* 88 */ 0xe1a5, 0x0000, 0x0000, 0xe1a6, 0x0000, 0x0000, 0xe1a7, 0x0000,
+ /* 90 */ 0x8e48, 0x0000, 0x0000, 0xe1a9, 0x0000, 0x0000, 0xe1a8, 0x0000,
+ /* 98 */ 0x0000, 0xe1aa, 0xe1ab, 0xfb73, 0xfb71, 0x0000, 0xfb72, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb74, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94e7, 0x0000,
+ /* b0 */ 0xe1ac, 0x0000, 0x0000, 0x0000, 0xe1ad, 0x0000, 0x0000, 0xea89,
+ /* b8 */ 0xe1ae, 0xe1af, 0xe1b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e4d,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03203 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1b1, 0x9475, 0x0000, 0x0000, 0x967e, 0x0000,
+ /* 88 */ 0x896d, 0x0000, 0x8976, 0x0000, 0x0000, 0xe1b2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1b4, 0x0000, 0x0000, 0x0000, 0xe1b3, 0x9390,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x90b7, 0x9f58, 0x0000, 0xe1b5, 0x96bf,
+ /* a0 */ 0x0000, 0xe1b6, 0x0000, 0x8ac4, 0x94d5, 0xe1b7, 0x0000, 0xe1b8,
+ /* a8 */ 0x0000, 0x0000, 0xe1b9, 0x0000, 0x0000, 0x0000, 0x96da, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x96d3, 0x0000, 0x92bc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x918a, 0x0000, 0x0000, 0xe1bb, 0x0000, 0x0000, 0x8f82,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x03242 ***/
+
+ /* 80 */ 0x0000, 0x8fc8, 0x0000, 0x0000, 0xe1be, 0x0000, 0x0000, 0xe1bd,
+ /* 88 */ 0xe1bc, 0x94fb, 0x0000, 0x8ac5, 0x8ca7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe1c4, 0x0000, 0x0000, 0xe1c1, 0x905e,
+ /* a0 */ 0x96b0, 0x0000, 0x0000, 0x0000, 0xe1c0, 0xe1c2, 0xe1c3, 0x0000,
+ /* a8 */ 0x0000, 0xe1bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1c5,
+ /* b8 */ 0xe1c6, 0x0000, 0x92ad, 0x0000, 0x8ae1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x03282 ***/
+
+ /* 80 */ 0x9285, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb76, 0xe1c7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe1c8, 0xe1cb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9087, 0x0000, 0x93c2, 0x0000, 0xe1cc, 0x9672, 0x0000,
+ /* a8 */ 0xe1c9, 0x0000, 0x0000, 0xe1ca, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1cf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ce, 0xe1cd,
+
+ /*** Three byte table, leaf: e79exx - offset 0x032c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe1d1, 0x0000, 0x0000, 0xe1d0, 0x0000,
+ /* 90 */ 0x0000, 0xe1d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d4, 0x0000,
+ /* a0 */ 0xe1d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x95cb, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f75, 0x97c4, 0x0000, 0x0000,
+ /* b0 */ 0xe1d5, 0x0000, 0x0000, 0x93b5, 0x0000, 0x0000, 0xe1d6, 0x0000,
+ /* b8 */ 0x0000, 0xe1d7, 0x0000, 0xe1db, 0xe1d9, 0xe1da, 0x0000, 0xe1d8,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03302 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1dc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1dd, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1de,
+ /* 98 */ 0x0000, 0x0000, 0xe1df, 0x96b5, 0xe1e0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x96ee, 0xe1e1, 0x0000, 0x926d, 0x0000, 0x948a,
+ /* a8 */ 0x0000, 0x8be9, 0x0000, 0x0000, 0x0000, 0x925a, 0xe1e2, 0x8bb8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x90ce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e3, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x03340 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8dbb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1e5, 0x0000, 0x8ca4, 0x8dd3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1e7, 0xfb78, 0x0000, 0x0000, 0x0000, 0x9375, 0x8dd4, 0x8b6d,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9643, 0x0000, 0x946a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9376, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d7b,
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x03380 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb79, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fc9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb7a, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x97b0, 0x8d64, 0x0000, 0x0000, 0x8ca5,
+ /* b0 */ 0x0000, 0x0000, 0x94a1, 0x0000, 0xe1eb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfb7b, 0x0000, 0xe1ed, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x033bf ***/
+
+ /* 80 */ 0x0000, 0x8ce9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ec, 0x92f4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ef, 0x8a56, 0xe1ea, 0x0000,
+ /* 90 */ 0x0000, 0x94e8, 0x0000, 0x894f, 0x0000, 0x8dea, 0x0000, 0x9871,
+ /* 98 */ 0x0000, 0x0000, 0xe1ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe1f0, 0x0000, 0x0000, 0x0000, 0x95c9,
+ /* a8 */ 0x0000, 0x90d7, 0xe1f2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8a6d, 0x0000, 0xe1f9, 0x0000, 0xe1f8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x033fe ***/
+
+ /* 80 */ 0x0000, 0x8ea5, 0x0000, 0x0000, 0x0000, 0xe1fa, 0xe1f5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe1fb, 0xe1f6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x94d6, 0xe1f4, 0x0000, 0x0000, 0xe1f7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe240,
+ /* a8 */ 0x9681, 0x0000, 0x0000, 0x0000, 0xe1fc, 0x0000, 0x0000, 0x88e9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe243, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe242, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x0343d ***/
+
+ /* 80 */ 0x0000, 0x8fca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe244,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9162, 0x0000,
+ /* 90 */ 0x0000, 0xe246, 0xe245, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe247, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe1e8, 0xe249, 0xe248, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfb7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x8ea6, 0x0000, 0x97e7, 0x0000, 0x8ed0, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x0347d ***/
+
+ /* 80 */ 0xe24a, 0x8c56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b5f,
+ /* 88 */ 0x8b46, 0x8e83, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9753, 0x0000, 0x0000, 0xe250, 0x0000, 0xe24f, 0x9163, 0xe24c,
+ /* 98 */ 0x0000, 0x0000, 0xe24e, 0x0000, 0x0000, 0x8f6a, 0x905f, 0xe24d,
+ /* a0 */ 0xe24b, 0x0000, 0x9449, 0x0000, 0x0000, 0x8fcb, 0x0000, 0x0000,
+ /* a8 */ 0x955b, 0x0000, 0x0000, 0x0000, 0x0000, 0x8dd5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9398,
+ /* b8 */ 0x0000, 0x0000, 0xe251, 0x0000, 0x0000, 0x0000, 0x0000, 0xe252,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x034bd ***/
+
+ /* 80 */ 0xe268, 0x8bd6, 0x0000, 0x0000, 0x985c, 0x9154, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe253, 0x0000, 0x0000, 0x89d0, 0x92f5, 0x959f,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfb81, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfb83, 0x0000, 0xe254, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b9a, 0xe255,
+ /* a8 */ 0x0000, 0x0000, 0xe257, 0x0000, 0x0000, 0x0000, 0xe258, 0x0000,
+ /* b0 */ 0x9448, 0x0000, 0x0000, 0xe259, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe25a, 0xe25b, 0x0000, 0x0000, 0x8bd7, 0x89d1, 0x93c3,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x034fd ***/
+
+ /* 80 */ 0x8f47, 0x8e84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe25c, 0x0000, 0x8f48, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x89c8, 0x9562, 0x0000, 0x0000, 0xe25d, 0x0000, 0x0000,
+ /* 98 */ 0x94e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9164,
+ /* a0 */ 0x0000, 0xe260, 0x0000, 0xe261, 0x9489, 0x0000, 0x9060, 0xe25e,
+ /* a8 */ 0x0000, 0x9281, 0x0000, 0x0000, 0xe25f, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8fcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x88da, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x0353d ***/
+
+ /* 80 */ 0x8b48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe262, 0x0000, 0x0000, 0x92f6, 0x0000, 0xe263, 0x90c5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x96ab, 0x0000, 0x0000, 0x9542,
+ /* 98 */ 0xe264, 0xe265, 0x9274, 0x0000, 0x97c5, 0x0000, 0x0000, 0xe267,
+ /* a0 */ 0xe266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8eed, 0x0000,
+ /* b0 */ 0x0000, 0xe269, 0x88ee, 0x0000, 0x0000, 0x0000, 0x0000, 0xe26c,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe26a, 0x89d2, 0x8c6d, 0xe26b, 0x8d65,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x0357d ***/
+
+ /* 80 */ 0x8d92, 0x0000, 0x95e4, 0xe26d, 0x0000, 0x0000, 0x9673, 0x0000,
+ /* 88 */ 0x0000, 0xe26f, 0x0000, 0x0000, 0x0000, 0x90cf, 0x896e, 0x89b8,
+ /* 90 */ 0x88aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe26e,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe270, 0xe271, 0x8ff5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe272, 0x0000, 0x8a6e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe274, 0x0000, 0x0000, 0x0000, 0x8c8a, 0x0000, 0x8b86, 0x0000,
+ /* b8 */ 0x0000, 0xe275, 0x8bf3, 0x0000, 0x0000, 0xe276, 0x0000, 0x90fa,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x035bd ***/
+
+ /* 80 */ 0x0000, 0x93cb, 0x0000, 0x90de, 0x8df3, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe277, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9282, 0x918b, 0x0000, 0xe279, 0xe27b, 0xe278,
+ /* 98 */ 0xe27a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c41,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe27c, 0x8c45, 0x0000, 0x0000, 0x0000, 0x8b87, 0x9771,
+ /* b0 */ 0xe27e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe280, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x894d, 0x0000, 0x0000, 0x0000, 0x0000, 0xe283,
+
+ /*** Three byte table, leaf: e7abxx - offset 0x035fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8a96, 0xe282, 0xe281, 0x0000, 0xe285,
+ /* 88 */ 0xe27d, 0x0000, 0xe286, 0x97a7, 0x0000, 0xe287, 0x0000, 0xe288,
+ /* 90 */ 0x0000, 0xfb84, 0x9af2, 0xe28a, 0x0000, 0xe289, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe28b, 0xe28c, 0x0000, 0x97b3, 0xe28d, 0x0000, 0xe8ed,
+ /* a0 */ 0x8fcd, 0xe28e, 0xe28f, 0x8f76, 0x0000, 0x93b6, 0xe290, 0xfb85,
+ /* a8 */ 0x0000, 0x0000, 0x9247, 0xfb87, 0x0000, 0xe291, 0x0000, 0x925b,
+ /* b0 */ 0xe292, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ba3, 0x0000,
+ /* b8 */ 0x995e, 0x927c, 0x8eb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ac6,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x0363d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe293, 0x0000, 0xe2a0, 0x0000, 0xe296, 0x0000,
+ /* 88 */ 0x8b88, 0x0000, 0xe295, 0xe2a2, 0x0000, 0x0000, 0x0000, 0xe294,
+ /* 90 */ 0x0000, 0x8fce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe298, 0xe299, 0x0000, 0x934a, 0x0000, 0x0000, 0xe29a, 0x0000,
+ /* a0 */ 0x8a7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x9079, 0x9584, 0x0000,
+ /* a8 */ 0xe29c, 0x0000, 0x0000, 0x0000, 0x91e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe297, 0x0000, 0xe29b, 0xe29d, 0x0000,
+ /* b8 */ 0x0000, 0x8df9, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x03678 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a4, 0x954d, 0x0000,
+ /* 88 */ 0x94a4, 0x9399, 0x0000, 0x8bd8, 0xe2a3, 0xe2a1, 0x0000, 0x94b3,
+ /* 90 */ 0xe29e, 0x927d, 0x939b, 0x0000, 0x939a, 0x0000, 0x8df4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a6, 0x0000, 0xe2a8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2ab, 0x0000, 0xe2ac, 0x0000,
+ /* b0 */ 0xe2a9, 0xe2aa, 0x0000, 0x0000, 0xe2a7, 0xe2a5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe29f,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x036b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95cd, 0x89d3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe2b3, 0x0000, 0xe2b0, 0x0000, 0xe2b5,
+ /* 90 */ 0x0000, 0x0000, 0xe2b4, 0x0000, 0x9493, 0x96a5, 0x0000, 0x8e5a,
+ /* 98 */ 0xe2ae, 0xe2b7, 0xe2b2, 0x0000, 0xe2b1, 0xe2ad, 0xfb88, 0xe2af,
+ /* a0 */ 0x0000, 0x8ac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x925c, 0x0000, 0x0000, 0x90fb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x94a0, 0x0000, 0x0000, 0xe2bc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x94a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x036f3 ***/
+
+ /* 80 */ 0x90df, 0xe2b9, 0x0000, 0x0000, 0x94cd, 0x0000, 0xe2bd, 0x95d1,
+ /* 88 */ 0x0000, 0x927a, 0x0000, 0xe2b8, 0xe2ba, 0x0000, 0x0000, 0xe2bb,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2be, 0x0000, 0x0000,
+ /* a0 */ 0x8ec2, 0x0000, 0x0000, 0x0000, 0x93c4, 0xe2c3, 0xe2c2, 0x0000,
+ /* a8 */ 0x0000, 0xe2bf, 0x0000, 0x0000, 0x0000, 0x9855, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe2c8, 0x0000, 0x0000, 0xe2cc, 0xe2c9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x03733 ***/
+
+ /* 80 */ 0xe2c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2c6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2cb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe2c0, 0x99d3, 0xe2c7, 0xe2c1, 0x0000, 0x0000, 0xe2ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d0,
+ /* a0 */ 0x0000, 0x8ac8, 0x0000, 0xe2cd, 0x0000, 0x0000, 0x0000, 0xe2ce,
+ /* a8 */ 0x0000, 0x0000, 0xe2cf, 0xe2d2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d1,
+ /* b8 */ 0x94f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d3, 0x97fa, 0x95eb,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x03773 ***/
+
+ /* 80 */ 0xe2d8, 0x0000, 0x0000, 0xe2d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d4, 0x90d0, 0x0000, 0xe2d7,
+ /* 90 */ 0xe2d9, 0x0000, 0x0000, 0x0000, 0xe2d6, 0x0000, 0xe2dd, 0x0000,
+ /* 98 */ 0xe2da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2db,
+ /* a0 */ 0xe2c4, 0x0000, 0x0000, 0x0000, 0xe2dc, 0xe2de, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2df, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x95c4, 0x0000, 0xe2e0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x96e0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x037b2 ***/
+
+ /* 80 */ 0x0000, 0x8bcc, 0x8c48, 0xe2e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x95b2, 0x0000, 0x9088, 0x0000, 0x96ae, 0x0000, 0x0000,
+ /* 90 */ 0xe2e2, 0x0000, 0x97b1, 0x0000, 0x0000, 0x9494, 0x0000, 0x9165,
+ /* 98 */ 0x9453, 0x0000, 0x0000, 0x8f6c, 0x0000, 0x0000, 0x0000, 0x88be,
+ /* a0 */ 0x0000, 0xe2e7, 0xe2e5, 0x0000, 0xe2e3, 0x8a9f, 0x0000, 0x8fcf,
+ /* a8 */ 0xe2e8, 0x0000, 0x0000, 0xe2e6, 0x0000, 0xe2e4, 0xe2ec, 0x0000,
+ /* b0 */ 0x0000, 0xe2eb, 0xe2ea, 0xe2e9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe2ed, 0x0000, 0x0000, 0x0000, 0xe2ee, 0x90b8, 0x0000,
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x037f2 ***/
+
+ /* 80 */ 0xe2ef, 0x0000, 0xe2f1, 0x0000, 0x0000, 0xe2f0, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x8cd0, 0x0000, 0x0000, 0x0000, 0x9157, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe2f3, 0x0000, 0x0000, 0x0000, 0x939c, 0x0000,
+ /* 98 */ 0xe2f2, 0x0000, 0x0000, 0x0000, 0xe2f4, 0x0000, 0x95b3, 0x918c,
+ /* a0 */ 0x8d66, 0x0000, 0xe2f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x97c6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f7,
+ /* b0 */ 0x0000, 0x0000, 0xe2f8, 0x0000, 0xe2f9, 0x0000, 0xe2fa, 0x0000,
+ /* b8 */ 0x8e85, 0x0000, 0xe2fb, 0x8c6e, 0x0000, 0x0000, 0x8b8a, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03832 ***/
+
+ /* 80 */ 0x8b49, 0x0000, 0xe340, 0x0000, 0x96f1, 0x8d67, 0xe2fc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe343, 0x96e4, 0x0000, 0x945b, 0x0000, 0x0000,
+ /* 90 */ 0x9552, 0x0000, 0x0000, 0x0000, 0x8f83, 0xe342, 0x0000, 0x8ed1,
+ /* 98 */ 0x8d68, 0x8e86, 0x8b89, 0x95b4, 0xe341, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9166, 0x9661, 0x8df5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8e87, 0x92db, 0x0000, 0xe346, 0x97dd,
+ /* b0 */ 0x8dd7, 0x0000, 0xe347, 0x9061, 0x0000, 0xe349, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8fd0, 0x8dae, 0x0000, 0x0000, 0x0000, 0x0000, 0xe348,
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03872 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8f49, 0x8cbc, 0x9167, 0xe344, 0xe34a, 0x0000,
+ /* 88 */ 0xfb8a, 0x0000, 0x0000, 0xe345, 0x8c6f, 0x0000, 0xe34d, 0xe351,
+ /* 90 */ 0x8c8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe34c, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe355, 0xfb8b, 0x0000, 0x8d69, 0x0000,
+ /* a0 */ 0x0000, 0x978d, 0x88ba, 0xe352, 0x0000, 0x0000, 0x8b8b, 0x0000,
+ /* a8 */ 0xe34f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe350, 0x0000,
+ /* b0 */ 0x0000, 0x939d, 0xe34e, 0xe34b, 0x0000, 0x8a47, 0x90e2, 0x0000,
+ /* b8 */ 0x0000, 0x8ca6, 0x0000, 0x0000, 0x0000, 0xe357,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x038b0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe354, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe356,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe353, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x8c70, 0x91b1, 0xe358, 0x918e, 0x0000, 0x0000, 0xe365,
+ /* a0 */ 0xfb8d, 0x0000, 0xe361, 0xe35b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe35f, 0x8ef8, 0x88db, 0xe35a, 0xe362,
+ /* b0 */ 0xe366, 0x8d6a, 0x96d4, 0x0000, 0x92d4, 0xe35c, 0x0000, 0xfb8c,
+ /* b8 */ 0xe364, 0x0000, 0xe359, 0x925d, 0x0000, 0xe35e, 0x88bb, 0x96c8,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x038f0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe35d,
+ /* 88 */ 0x0000, 0x0000, 0x8bd9, 0x94ea, 0x0000, 0x0000, 0x0000, 0x918d,
+ /* 90 */ 0x0000, 0x97ce, 0x8f8f, 0x0000, 0x0000, 0xe38e, 0xfb8e, 0x0000,
+ /* 98 */ 0xe367, 0x0000, 0x90fc, 0x0000, 0xe363, 0xe368, 0xe36a, 0x0000,
+ /* a0 */ 0x92f7, 0xe36d, 0x0000, 0x0000, 0xe369, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x95d2, 0x8ac9, 0x0000, 0x0000, 0x96c9, 0x0000, 0x0000, 0x88dc,
+ /* b0 */ 0x0000, 0x0000, 0xe36c, 0x0000, 0x97fb, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe36b, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x0392f ***/
+
+ /* 80 */ 0x0000, 0x898f, 0x0000, 0x0000, 0x93ea, 0xe36e, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe375, 0xe36f, 0xe376, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe372, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x949b, 0x0000, 0x0000, 0x8ec8, 0xe374,
+ /* a0 */ 0x0000, 0xe371, 0xe377, 0xe370, 0x0000, 0x0000, 0x8f63, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x9644, 0x0000, 0x0000, 0x8f6b, 0x0000,
+ /* b0 */ 0x0000, 0xe373, 0xe380, 0x0000, 0x0000, 0xe37b, 0x0000, 0xe37e,
+ /* b8 */ 0x0000, 0xe37c, 0xe381, 0xe37a, 0x0000, 0xe360, 0x90d1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x0396e ***/
+
+ /* 80 */ 0x0000, 0x94c9, 0x0000, 0xe37d, 0x0000, 0x0000, 0xe378, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9140, 0x8c71, 0x0000, 0x8f4a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfb8f, 0x0000, 0x9044, 0x9155, 0xe384, 0x0000,
+ /* 98 */ 0x0000, 0xe386, 0xe387, 0x0000, 0x0000, 0xe383, 0xe385, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe379, 0xe382,
+ /* a8 */ 0x0000, 0xe38a, 0xe389, 0x0000, 0x0000, 0x969a, 0x0000, 0x0000,
+ /* b0 */ 0x8c4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe388, 0x0000, 0xe38c, 0xe38b, 0xe38f, 0x0000, 0xe391,
+
+ /*** Three byte table, leaf: e7baxx - offset 0x039ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e5b, 0xe38d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe392, 0xe393, 0xfa5c, 0x0000, 0xe394, 0x0000, 0xe39a, 0x935a,
+ /* 90 */ 0xe396, 0x0000, 0xe395, 0xe397, 0xe398, 0x0000, 0xe399, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe39b, 0xe39c,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x039cb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aca, 0x0000,
+ /* b8 */ 0xe39d, 0x0000, 0xe39e,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03a06 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe39f, 0x0000, 0xfb90,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a0, 0xe3a1, 0xe3a2, 0x0000,
+ /* 90 */ 0xe3a3, 0xe3a4, 0x0000, 0x0000, 0xe3a6, 0xe3a5, 0x0000, 0x0000,
+ /* 98 */ 0xe3a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a8,
+ /* a0 */ 0xe3a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ac,
+ /* a8 */ 0xe3aa, 0xe3ab, 0x8ddf, 0x8c72, 0x0000, 0x0000, 0x9275, 0x0000,
+ /* b0 */ 0x94b1, 0x0000, 0x8f90, 0x0000, 0x0000, 0x946c, 0x0000, 0x94eb,
+ /* b8 */ 0xe3ad, 0x9ceb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03a44 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe3ae, 0xe3b0, 0x0000, 0x9785, 0xe3af, 0xe3b2,
+ /* 88 */ 0xe3b1, 0x0000, 0x9772, 0x0000, 0xe3b3, 0x0000, 0x94fc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe3b7, 0x0000, 0x0000, 0xe3b6, 0xe3b5, 0x0000,
+ /* a0 */ 0x0000, 0xfb91, 0x0000, 0xe3b8, 0x8c51, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9141, 0x8b60, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3bc, 0xe3b9,
+ /* b0 */ 0x0000, 0x0000, 0xe3ba, 0x0000, 0x0000, 0x0000, 0xe3bd, 0x0000,
+ /* b8 */ 0xe3be, 0xe3bb, 0x0000, 0x0000, 0x0000, 0x8948, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03a83 ***/
+
+ /* 80 */ 0x0000, 0x89a5, 0x0000, 0x0000, 0x0000, 0xe3c0, 0xe3c1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe3c2, 0x0000, 0x9782, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8f4b, 0x0000, 0xe3c4, 0xe3c3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x9089, 0xe3c5, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c6, 0x0000,
+ /* a8 */ 0x0000, 0xe3c7, 0x0000, 0x8ae3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8acb, 0x0000, 0x0000, 0xe3c8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe3c9, 0x0000, 0x967c, 0x9783, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03ac3 ***/
+
+ /* 80 */ 0x9773, 0x9856, 0x0000, 0x8d6c, 0xe3cc, 0x8ed2, 0xe3cb, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe3cd, 0x8ea7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x91cf, 0x0000, 0xe3ce, 0x0000, 0x0000, 0x8d6b, 0x0000, 0x96d5,
+ /* 98 */ 0xe3cf, 0xe3d0, 0x0000, 0x0000, 0xe3d1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe3d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe3d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8ea8, 0x0000, 0x0000, 0x96eb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe3d5, 0x0000, 0x925e, 0x0000, 0xe3d4,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03b03 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe3d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3d8, 0x0000, 0x0000, 0x0000, 0x90b9, 0x0000,
+ /* 98 */ 0xe3d9, 0x0000, 0xe3da, 0x0000, 0x0000, 0x0000, 0x95b7, 0xe3db,
+ /* a0 */ 0x0000, 0x918f, 0xe3dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe3dd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97fc,
+ /* b0 */ 0xe3e0, 0x0000, 0xe3df, 0xe3de, 0x92ae, 0x0000, 0xe3e1, 0x9045,
+ /* b8 */ 0x0000, 0xe3e2, 0x0000, 0x0000, 0x0000, 0xe3e3, 0x9857, 0xe3e4,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03b43 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3e5, 0xe3e7, 0xe3e6, 0x94a3,
+ /* 88 */ 0x0000, 0x93f7, 0x0000, 0x985d, 0x94a7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe3e9, 0x0000, 0x0000, 0x8fd1, 0x0000,
+ /* 98 */ 0x9549, 0x0000, 0xe3ea, 0xe3e8, 0x0000, 0x8acc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8cd2, 0x8e88, 0x0000, 0x0000, 0x94ec, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x8ca8, 0x9662, 0x0000, 0xe3ed, 0xe3eb, 0x0000, 0x8d6d,
+ /* b0 */ 0x0000, 0x8d6e, 0x88e7, 0x0000, 0x8de6, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9478, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03b80 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x88dd, 0xe3f2, 0x0000, 0x925f, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9477, 0x0000, 0x91d9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3f4, 0x0000,
+ /* 98 */ 0x0000, 0xe3f0, 0xe3f3, 0xe3ee, 0x0000, 0xe3f1, 0x9645, 0x0000,
+ /* a0 */ 0x0000, 0x8cd3, 0x0000, 0x0000, 0x88fb, 0xe3ef, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3f6,
+ /* b0 */ 0x0000, 0xe3f7, 0x0000, 0x0000, 0x93b7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8bb9, 0x0000, 0x0000, 0x0000, 0xe445, 0x945c,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03bbe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8e89, 0x0000, 0x0000, 0x8bba, 0x90c6, 0x9865,
+ /* 88 */ 0x96ac, 0xe3f5, 0x90d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8b72, 0xe3f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3fa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe3f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3fb,
+ /* b0 */ 0x0000, 0x9245, 0x0000, 0x945d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x92af, 0x0000, 0x0000, 0x0000, 0x0000, 0xe442,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03bfd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe441, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe3fc, 0x0000, 0x0000, 0x9074, 0x0000,
+ /* 90 */ 0x9585, 0xe444, 0x0000, 0xe443, 0x8d6f, 0x9872, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe454,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe448, 0xe449, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8eee, 0x0000, 0x0000, 0xe447, 0x0000,
+ /* b0 */ 0x8d98, 0xe446, 0x0000, 0x0000, 0xe44a, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x92b0, 0x95a0, 0x9142, 0x0000, 0x0000, 0x0000, 0x0000, 0x91da,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03c3d ***/
+
+ /* 80 */ 0xe44e, 0x0000, 0xe44f, 0xe44b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe44c, 0x0000, 0xe44d, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d70,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe455, 0x0000, 0xe451, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x9586, 0x0000, 0x968c, 0x9547, 0x0000, 0x0000,
+ /* a0 */ 0xe450, 0x0000, 0x0000, 0xe453, 0xe452, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9663, 0xe456, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe457, 0x0000, 0x0000, 0x9156, 0x0000, 0xe458, 0x0000, 0x0000,
+ /* b8 */ 0xe45a, 0x0000, 0xe45e, 0x0000, 0x0000, 0xe45b, 0xe459, 0x945e,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03c7d ***/
+
+ /* 80 */ 0xe45c, 0x0000, 0xe45d, 0x0000, 0x0000, 0x0000, 0x89b0, 0x0000,
+ /* 88 */ 0xe464, 0xe45f, 0x0000, 0x0000, 0x0000, 0xe460, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe461, 0x0000, 0x919f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe463, 0xe462, 0xe465, 0x0000, 0x0000, 0x0000, 0x0000, 0xe466,
+ /* a0 */ 0xe467, 0x0000, 0x0000, 0x9062, 0x0000, 0x89e7, 0x0000, 0xe468,
+ /* a8 */ 0x97d5, 0x0000, 0x8ea9, 0x0000, 0x0000, 0x8f4c, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x8e8a, 0x9276, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe469, 0xe46a, 0x8950, 0x0000, 0xe46b,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e888xx - offset 0x03cbc ***/
+
+ /* 80 */ 0x0000, 0xe46c, 0xe46d, 0x0000, 0x0000, 0xe46e, 0x0000, 0xe46f,
+ /* 88 */ 0x8bbb, 0x9da8, 0xe470, 0x0000, 0x90e3, 0xe471, 0x8ec9, 0x0000,
+ /* 90 */ 0xe472, 0x0000, 0x98ae, 0x0000, 0x0000, 0x0000, 0xe473, 0x95dc,
+ /* 98 */ 0x8ada, 0x0000, 0x0000, 0x9143, 0x8f77, 0x0000, 0x9591, 0x8f4d,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe474, 0x8d71, 0xe475, 0x94ca, 0x0000, 0xe484, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe477, 0x0000, 0x91c7, 0x9495, 0x8cbd,
+ /* b8 */ 0xe476, 0x9144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03cfc ***/
+
+ /* 80 */ 0xe478, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92f8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe47a, 0xe479, 0xe47c, 0x0000, 0x0000, 0xe47b, 0x0000, 0xe47d,
+ /* a0 */ 0x0000, 0x0000, 0xe480, 0x0000, 0xe47e, 0x0000, 0x8acd, 0x0000,
+ /* a8 */ 0xe481, 0x0000, 0xe482, 0xe483, 0x0000, 0x0000, 0x8daf, 0x97c7,
+ /* b0 */ 0x0000, 0xe485, 0x9046, 0x0000, 0x0000, 0x0000, 0x8990, 0xe486,
+ /* b8 */ 0xe487, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe488,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88axx - offset 0x03d3b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x88f0, 0x0000, 0xe489, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe48a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x9587, 0x0000, 0x0000, 0x0000, 0x8ec5, 0x0000, 0xe48c,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8a48, 0x88b0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe48b, 0xe48e, 0x946d, 0x0000, 0x9063,
+ /* b0 */ 0x0000, 0x89d4, 0x0000, 0x9646, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8c7c, 0x8bda, 0x0000, 0xe48d, 0x0000, 0x89e8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03d79 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aa1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8991, 0xe492, 0x97e8, 0x91db, 0x0000, 0x0000, 0x9563,
+ /* 98 */ 0x0000, 0xe49e, 0x0000, 0x89d5, 0xe49c, 0x0000, 0xe49a, 0xe491,
+ /* a0 */ 0x0000, 0xe48f, 0x0000, 0xe490, 0x0000, 0x8ee1, 0x8bea, 0x9297,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x93cf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8970, 0x0000, 0xe494, 0xe493, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe499, 0xe495, 0xe498, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88cxx - offset 0x03db8 ***/
+
+ /* 80 */ 0x0000, 0xfb93, 0x96ce, 0xe497, 0x89d6, 0x8a9d, 0xe49b, 0x0000,
+ /* 88 */ 0x0000, 0xe49d, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c73, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a1, 0xe4aa,
+ /* 98 */ 0xe4ab, 0x0000, 0x0000, 0x0000, 0x88a9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe4b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x88ef, 0x0000, 0x0000, 0xe4a9, 0x0000, 0x0000, 0x0000, 0xe4a8,
+ /* b0 */ 0x0000, 0xe4a3, 0xe4a2, 0x0000, 0xe4a0, 0xe49f, 0x9283, 0x0000,
+ /* b8 */ 0x91f9, 0xe4a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x03df8 ***/
+
+ /* 80 */ 0xe4a4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x9190, 0x8c74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8960,
+ /* 90 */ 0xe4a6, 0x0000, 0x8d72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9191, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfb94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe4b8, 0x0000, 0xe4b9, 0x0000, 0x89d7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x89ac, 0xe4b6, 0x0000, 0x0000, 0xfb95,
+
+ /*** Three byte table, leaf: e88exx - offset 0x03e38 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ac, 0x0000, 0xe4b4,
+ /* 88 */ 0x0000, 0xe4bb, 0xe4b5, 0x0000, 0x0000, 0x0000, 0xe4b3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe496, 0x0000, 0x0000, 0xe4b1, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe4ad, 0x0000, 0x0000, 0x0000, 0x8ace, 0xe4af,
+ /* a0 */ 0xe4ba, 0x0000, 0xe4b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe4bc, 0x0000, 0xe4ae, 0x949c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x9789, 0x0000, 0x0000, 0x0000, 0xe4b7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cd, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88fxx - offset 0x03e77 ***/
+
+ /* 80 */ 0x0000, 0xe4c5, 0x0000, 0x0000, 0x0000, 0x909b, 0x0000, 0xfb96,
+ /* 88 */ 0x0000, 0x0000, 0x8b65, 0x0000, 0x8bdb, 0x0000, 0xe4c0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x89d9, 0x0000, 0x0000, 0x8fd2, 0x0000,
+ /* 98 */ 0xe4c3, 0x0000, 0x0000, 0x0000, 0x8dd8, 0x0000, 0x0000, 0x9370,
+ /* a0 */ 0xe4c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x95ec, 0x0000, 0xe4bf, 0x0000, 0x0000, 0x0000, 0x89d8,
+ /* b0 */ 0x8cd4, 0x9548, 0xe4c9, 0x0000, 0xe4bd, 0x0000, 0xfb97, 0xe4c6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe4d0, 0x0000, 0xe4c1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x03eb5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4c2, 0x93b8, 0x0000, 0x0000, 0xe4c7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4c4, 0x9647, 0xe4ca, 0x88de, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe4be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe4cc, 0x0000, 0xe4cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x948b, 0xe4d2, 0x0000, 0xe4dd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8a9e, 0x0000, 0x0000, 0x0000, 0xe4e0, 0x0000, 0x0000,
+ /* b8 */ 0xe4ce, 0x0000, 0x0000, 0x0000, 0xe4d3, 0x978e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x03ef3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4dc, 0x0000,
+ /* 88 */ 0xfb98, 0x9774, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9298,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8a8b, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x9592, 0xe4e2, 0x939f, 0x0000, 0x0000, 0x88af, 0x0000,
+ /* a8 */ 0x0000, 0xe4db, 0x0000, 0xe4d7, 0x9192, 0xe4d1, 0xe4d9, 0xe4de,
+ /* b0 */ 0x0000, 0x944b, 0x0000, 0x0000, 0x0000, 0x88a8, 0x0000, 0xe4d6,
+ /* b8 */ 0x0000, 0xe4df, 0x9598, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x03f31 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe4da, 0x0000, 0xe4d5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x8fd3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8f4e, 0x0000, 0x0000, 0x0000, 0x8eaa, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x96d6, 0x0000, 0x0000, 0x9566, 0x0000, 0x0000, 0xe4e5,
+ /* a0 */ 0x0000, 0xe4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d8, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x8a97, 0x0000, 0xfb99, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8ff6, 0xe4e3, 0x0000, 0xe4e8, 0x9193, 0x0000, 0x0000, 0xe4e4,
+
+ /*** Three byte table, leaf: e893xx - offset 0x03f71 ***/
+
+ /* 80 */ 0x0000, 0xe4eb, 0x0000, 0x0000, 0x927e, 0x0000, 0xe4ec, 0x0000,
+ /* 88 */ 0x0000, 0x9775, 0xe4e1, 0x8a57, 0x0000, 0xe4e7, 0x0000, 0x0000,
+ /* 90 */ 0xe4ea, 0x96aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ed, 0x0000,
+ /* 98 */ 0x0000, 0xe4e6, 0xe4e9, 0x0000, 0xfa60, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x9648, 0x0000, 0x9840, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f8, 0x0000, 0x0000, 0xe4f0,
+
+ /*** Three byte table, leaf: e894xx - offset 0x03fb1 ***/
+
+ /* 80 */ 0x8ec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cf, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x95cc, 0x0000, 0x96a0, 0xe4f7, 0xe4f6, 0x0000, 0xe4f2,
+ /* 98 */ 0xe4f3, 0x0000, 0x8955, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f5,
+ /* a0 */ 0x0000, 0xe4ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x92d3, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f4, 0x88fc, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91a0, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c1, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e895xx - offset 0x03ff1 ***/
+
+ /* 80 */ 0xe4f9, 0xe540, 0x0000, 0x94d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe4fc, 0x8fd4, 0x8ec7, 0xe542, 0x0000, 0x0000, 0x8bbc, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfb9a, 0x0000, 0xe543, 0x0000, 0x9599,
+ /* 98 */ 0xe4fb, 0xfb9b, 0xe4d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe4fa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x986e, 0x93a0, 0x9593, 0xfb9c, 0x0000, 0xe54a, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe550,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe551, 0x0000,
+
+ /*** Three byte table, leaf: e896xx - offset 0x04031 ***/
+
+ /* 80 */ 0xe544, 0x0000, 0x0000, 0x0000, 0x9496, 0x0000, 0x0000, 0xe54e,
+ /* 88 */ 0xe546, 0x0000, 0xe548, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe552, 0xe547, 0x0000, 0x0000, 0xe54b, 0x0000, 0x0000, 0x8992,
+ /* 98 */ 0x0000, 0x93e3, 0x0000, 0xe54c, 0xe54f, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe545, 0x0000, 0x9145, 0x0000,
+ /* a8 */ 0xe549, 0x8e46, 0x9064, 0x8c4f, 0x96f2, 0x0000, 0x96f7, 0x8f92,
+ /* b0 */ 0xfb9e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe556, 0xe554, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x04070 ***/
+
+ /* 80 */ 0x0000, 0x986d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe553, 0x0000, 0x0000, 0x0000, 0x9795, 0x0000, 0xe555,
+ /* 90 */ 0xe557, 0x0000, 0x0000, 0x0000, 0x0000, 0xe558, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe55b, 0xe559, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x93a1, 0xe55a, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x94cb, 0xe54d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f93,
+ /* b8 */ 0x0000, 0xe55c, 0xe561, 0x9194, 0x0000, 0x0000, 0xe560,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e898xx - offset 0x040af ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe541, 0x0000, 0x0000, 0x0000, 0xe562, 0x9168,
+ /* 88 */ 0x0000, 0x0000, 0xe55d, 0xe55f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe55e, 0x0000, 0x0000, 0x9f50, 0x9f41,
+ /* 98 */ 0x0000, 0x0000, 0xe564, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe563, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9796, 0x0000, 0xe1ba,
+ /* b0 */ 0xe565, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe566,
+
+ /*** Three byte table, leaf: e899xx - offset 0x040ef ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe567, 0x8cd5, 0x0000,
+ /* 90 */ 0x8b73, 0x0000, 0x0000, 0x0000, 0xe569, 0x997c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x8b95, 0x0000, 0x97b8, 0x0000, 0x8bf1, 0xe56a,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe56b,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x928e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe56c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x93f8, 0x0000, 0x88b8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x0412b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x89e1, 0xe571, 0xe572, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe56d, 0x0000, 0x8e5c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe56e, 0x9461, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe56f, 0xe570, 0xe57a, 0x0000, 0x0000, 0x0000, 0xe574,
+ /* b0 */ 0xe577, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe573, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x04167 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe575, 0x0000, 0xe576, 0x8ed6,
+ /* 88 */ 0x0000, 0xe578, 0x0000, 0x9260, 0x0000, 0x8c75, 0x8a61, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe57b, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x8a5e, 0x0000, 0xe581, 0x0000, 0x0000, 0xe57c, 0xe580,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x94b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe57d, 0x0000, 0x0000, 0xe57e, 0x9567, 0x94d8, 0xe582,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x91fb, 0xe58c, 0x0000, 0xe588, 0x0000, 0x0000, 0x89e9, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x041a7 ***/
+
+ /* 80 */ 0xe586, 0x0000, 0x9649, 0xe587, 0x0000, 0x0000, 0xe584, 0x0000,
+ /* 88 */ 0xe585, 0xe58a, 0xe58d, 0x0000, 0x0000, 0xe58b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe589, 0xe583, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x9277, 0x0000, 0xe594, 0x0000, 0x96a8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe592, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe593, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe58e, 0x0000, 0x0000, 0xe590,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe591, 0x0000, 0x0000, 0x0000, 0xe58f,
+
+ /*** Three byte table, leaf: e89dxx - offset 0x041e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x90e4, 0x0000, 0x9858, 0xe598, 0x0000, 0xe599, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe59f, 0x0000, 0x9049, 0x0000, 0xe59b,
+ /* 98 */ 0x0000, 0xe59e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe596,
+ /* a0 */ 0xe595, 0x0000, 0x0000, 0xe5a0, 0x0000, 0x0000, 0x89da, 0x0000,
+ /* a8 */ 0xe59c, 0x0000, 0xe5a1, 0x0000, 0x0000, 0x0000, 0xe59d, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe59a, 0x0000, 0x92b1, 0x0000,
+ /* b8 */ 0xe597, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9488,
+
+ /*** Three byte table, leaf: e89exx - offset 0x04227 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x975a, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a4,
+ /* a0 */ 0x0000, 0x0000, 0xe5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe5ac, 0x0000, 0x0000, 0x0000, 0xe5a6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe5ae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x9786, 0xe5b1, 0x0000, 0xe5a8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e89fxx - offset 0x04267 ***/
+
+ /* 80 */ 0xe5a9, 0x0000, 0x0000, 0x0000, 0xe5ad, 0x0000, 0xe5b0, 0xe5af,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe5a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe5aa, 0x0000, 0xe5bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe5b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b2,
+ /* b0 */ 0x0000, 0x0000, 0xe5b3, 0x0000, 0x0000, 0x0000, 0xe5b8, 0xe5b9,
+ /* b8 */ 0x0000, 0x8a49, 0x0000, 0x8b61, 0x0000, 0x0000, 0xe5b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x042a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a2, 0x0000, 0xfba1,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5b6, 0xe5ba, 0xe5b5,
+ /* 90 */ 0x0000, 0xe5bc, 0x0000, 0x0000, 0x0000, 0xe5be, 0xe5bd, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe5c0, 0xe5bf, 0xe579, 0x0000, 0x0000, 0x0000, 0xe5c4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe5c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5c2, 0x0000,
+ /* b8 */ 0x0000, 0xe5c3, 0x0000, 0xe5c5, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x042e6 ***/
+
+ /* 80 */ 0x8c8c, 0x0000, 0xe5c7, 0x0000, 0xe5c6, 0x0000, 0x8f4f, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8d73, 0x9fa5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5c8, 0x8f70, 0x0000, 0x0000, 0x0000, 0x8a58,
+ /* 98 */ 0x0000, 0xe5c9, 0x0000, 0x8971, 0x0000, 0x8fd5, 0xe5ca, 0x0000,
+ /* a0 */ 0x0000, 0x8d74, 0xe5cb, 0x88df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x955c, 0x0000, 0x0000, 0xe5cc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x908a, 0x0000, 0xe5d3, 0x0000, 0x0000, 0xe5d0, 0x0000, 0x928f,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d1, 0xe5ce, 0x8bdc,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x04326 ***/
+
+ /* 80 */ 0x0000, 0xe5cd, 0xe5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8c55, 0x0000, 0x0000, 0x91dc, 0x0000, 0xe5da, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5d6, 0x0000, 0x0000, 0x0000, 0x91b3, 0xe5d5,
+ /* 98 */ 0x0000, 0xe5d8, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cf, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe5d9, 0x0000, 0xe5db, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x94ed, 0x0000, 0x0000, 0xe5d7, 0x0000,
+ /* b0 */ 0xe5dc, 0xe5de, 0x0000, 0x0000, 0x8cd1, 0xe5d2, 0x0000, 0x88bf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5dd,
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x04366 ***/
+
+ /* 80 */ 0x0000, 0x8dd9, 0x97f4, 0xe5df, 0xe5e0, 0x9195, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a0,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5e1, 0x9754, 0x0000, 0x0000,
+ /* 98 */ 0xe5e2, 0xe5e3, 0x0000, 0x0000, 0x95e2, 0xe5e4, 0x0000, 0x8dbe,
+ /* a0 */ 0x0000, 0x97a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe5ea, 0x8fd6, 0xe5e8, 0xfba2, 0x0000, 0x0000,
+ /* b8 */ 0x9787, 0xe5e5, 0x0000, 0x0000, 0xe5e7, 0x90bb, 0x909e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x043a5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5e6, 0x0000, 0xe5eb, 0x0000, 0x0000, 0x95a1,
+ /* 88 */ 0x0000, 0x0000, 0xe5ed, 0x0000, 0xe5ec, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8a8c, 0x0000, 0x964a, 0xe5ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfa5d, 0xe5fa, 0xe5f0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe5f2, 0xe5f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f7, 0x0000,
+ /* b8 */ 0xe5f8, 0x0000, 0x0000, 0xe5f6, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x043e4 ***/
+
+ /* 80 */ 0x0000, 0xe5f4, 0x0000, 0xe5ef, 0xe5f5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f9, 0xe8b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89a6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5fc, 0x8bdd,
+ /* a0 */ 0xe5fb, 0x0000, 0x0000, 0x0000, 0xe641, 0x0000, 0xe640, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe643, 0x0000, 0x0000, 0xe642, 0x0000, 0xe644,
+ /* b0 */ 0x0000, 0x0000, 0x8f50, 0x0000, 0xe645, 0x0000, 0x0000, 0xe646,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe647, 0x90bc,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x04424 ***/
+
+ /* 80 */ 0x0000, 0x9776, 0x0000, 0xe648, 0x0000, 0x0000, 0x95a2, 0x9465,
+ /* 88 */ 0xe649, 0x0000, 0xe64a, 0x8ca9, 0x0000, 0x0000, 0x0000, 0x8b4b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe64b, 0x0000, 0x0000, 0x8e8b, 0x9460,
+ /* 98 */ 0xe64c, 0x0000, 0x8a6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe64d, 0x0000, 0x0000, 0x0000, 0x0000, 0xe64f, 0x9797,
+ /* a8 */ 0x0000, 0xe64e, 0x9065, 0x0000, 0xe650, 0x0000, 0x0000, 0xe651,
+ /* b0 */ 0x0000, 0x0000, 0xe652, 0x8acf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe653, 0x0000, 0x0000, 0xe654, 0x0000, 0xe655,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x04464 ***/
+
+ /* 80 */ 0xe656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8a70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe657, 0x0000, 0xe658, 0xe659, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x89f0, 0x0000, 0x0000, 0x9047, 0xe65a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe65b, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe65c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x044a4 ***/
+
+ /* 80 */ 0x8cbe, 0x0000, 0x92f9, 0xe65d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x8c76, 0x0000, 0x9075, 0x0000, 0xe660, 0x0000, 0x93a2, 0x0000,
+ /* 90 */ 0xe65f, 0x0000, 0xfba3, 0x8c50, 0x0000, 0x0000, 0xe65e, 0x91f5,
+ /* 98 */ 0x8b4c, 0x0000, 0x0000, 0xe661, 0x0000, 0xe662, 0x0000, 0x8fd7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8c8d, 0x0000, 0xe663, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x964b, 0x0000, 0x0000, 0x90dd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8b96, 0x0000, 0x96f3, 0x9169, 0x0000, 0xe664, 0xfba4,
+ /* b8 */ 0x0000, 0x0000, 0x9066, 0x9290, 0x8fd8, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x044e3 ***/
+
+ /* 80 */ 0x0000, 0xe665, 0x0000, 0x0000, 0x0000, 0x0000, 0xe668, 0x0000,
+ /* 88 */ 0xe669, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8dbc, 0x91c0, 0xe667, 0x0000, 0x8fd9, 0x955d, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe666, 0x0000, 0x0000, 0x8e8c, 0x0000,
+ /* a0 */ 0x8972, 0x0000, 0xe66d, 0x8c77, 0x0000, 0x0000, 0x8e8e, 0x0000,
+ /* a8 */ 0x0000, 0x8e8d, 0x0000, 0x986c, 0xe66c, 0xe66b, 0x9146, 0x0000,
+ /* b0 */ 0x8b6c, 0x9862, 0x8a59, 0x8fda, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfba5, 0x0000, 0x0000, 0xe66a, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04521 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe66f, 0x0000, 0xe670, 0xe66e, 0x0000, 0x8cd6,
+ /* 88 */ 0x0000, 0x975f, 0x0000, 0x0000, 0x8e8f, 0x9446, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe673, 0x0000, 0x90be, 0x0000, 0x9261, 0x0000, 0x0000,
+ /* 98 */ 0x9755, 0x0000, 0xe676, 0x0000, 0x0000, 0x0000, 0x8cea, 0x0000,
+ /* a0 */ 0x90bd, 0xe672, 0x0000, 0xe677, 0x8ceb, 0xe674, 0xe675, 0xfba6,
+ /* a8 */ 0xe671, 0x0000, 0x0000, 0x0000, 0x90e0, 0x93c7, 0x0000, 0x0000,
+ /* b0 */ 0x924e, 0x0000, 0x89db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x94ee, 0x0000, 0x0000, 0x8b62, 0x0000, 0xfba7, 0x92b2,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04561 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe67a, 0x0000, 0xe678, 0x0000, 0x0000, 0x926b,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x90bf, 0x8ad0, 0xe679, 0x0000, 0x907a,
+ /* 90 */ 0x0000, 0x0000, 0x97c8, 0x0000, 0x0000, 0x0000, 0x985f, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe67b, 0xe687, 0x92b3, 0x0000, 0xe686, 0xfba8,
+ /* a0 */ 0xe683, 0xe68b, 0xe684, 0x0000, 0xe680, 0x0000, 0x92fa, 0xe67e,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe67c, 0x0000, 0x9740, 0x8e90, 0x0000,
+ /* b0 */ 0x0000, 0xe681, 0x0000, 0xe67d, 0x0000, 0x0000, 0xfbaa, 0xe685,
+ /* b8 */ 0x8f94, 0x0000, 0x8cbf, 0x0000, 0x0000, 0x0000, 0x91f8, 0x0000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x045a1 ***/
+
+ /* 80 */ 0x9664, 0x8979, 0x88e0, 0x0000, 0x93a3, 0x0000, 0x0000, 0xe689,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe688, 0x0000, 0x93e4, 0x0000,
+ /* 90 */ 0xe68d, 0x0000, 0x0000, 0x0000, 0xe682, 0x0000, 0xe68c, 0xe68e,
+ /* 98 */ 0x0000, 0x8caa, 0xe68a, 0x8d75, 0x0000, 0x8ed3, 0x0000, 0x0000,
+ /* a0 */ 0xe68f, 0x9777, 0x0000, 0x0000, 0x0000, 0x0000, 0xe692, 0x0000,
+ /* a8 */ 0xe695, 0x0000, 0x0000, 0xe693, 0x9554, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe690, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8bde, 0x0000, 0x0000, 0x0000, 0x0000, 0xe694,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x045e0 ***/
+
+ /* 80 */ 0x0000, 0xe696, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe69a, 0x0000, 0x0000, 0xe697, 0x0000, 0xe699, 0xe698,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfbab, 0x0000, 0x0000, 0xe69b, 0x0000,
+ /* 98 */ 0x8eaf, 0x0000, 0xe69d, 0xe69c, 0x9588, 0x0000, 0x0000, 0xe69f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c78, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe69e, 0xe6a0, 0x0000, 0x0000, 0xe6a1,
+ /* b0 */ 0x8b63, 0xe3bf, 0x8ff7, 0x0000, 0xe6a2, 0x0000, 0x0000, 0x8cec,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a3, 0x0000, 0xfbac,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04620 ***/
+
+ /* 80 */ 0xe6a4, 0x0000, 0x0000, 0x8e5d, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x9dcc, 0x0000, 0xe6a5, 0x0000, 0xe6a6, 0x0000,
+ /* 90 */ 0x8f51, 0x0000, 0xe6a7, 0xe6a8, 0x0000, 0x0000, 0xe6a9, 0x0000,
+ /* 98 */ 0x0000, 0xe6aa, 0xe6ab,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x0463b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x924a,
+ /* b8 */ 0x0000, 0x0000, 0xe6ac, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ae,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x0467b ***/
+
+ /* 80 */ 0x0000, 0xe6ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x93a4, 0x0000,
+ /* 88 */ 0xe6af, 0x0000, 0x964c, 0x0000, 0xe6b0, 0x0000, 0xe6b1, 0x0000,
+ /* 90 */ 0xe6b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6b3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x93d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x8fdb, 0xe6b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8d8b, 0x98ac, 0xe6b5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6b6, 0x955e, 0xe6b7, 0x0000, 0xe6bf, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x046b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6b8, 0x0000, 0x0000, 0xe6ba, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe6b9, 0xe6bb, 0x0000, 0x9665, 0xe6bc, 0xe6bd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6be, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8a4c, 0x92e5, 0x0000,
+ /* a0 */ 0x9589, 0x8de0, 0x8d76, 0x0000, 0x0000, 0x0000, 0x0000, 0x956e,
+ /* a8 */ 0x89dd, 0x94cc, 0xe6c3, 0x8ad1, 0x90d3, 0xe6c2, 0xe6c7, 0x9299,
+ /* b0 */ 0x96e1, 0x0000, 0xe6c5, 0xe6c6, 0x8b4d, 0x0000, 0xe6c8, 0x9483,
+ /* b8 */ 0x91dd, 0x0000, 0x0000, 0x94ef, 0x935c, 0xe6c4, 0x0000, 0x9666,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x046f9 ***/
+
+ /* 80 */ 0x89ea, 0xe6ca, 0x9847, 0x92c0, 0x9864, 0x0000, 0x0000, 0x8e91,
+ /* 88 */ 0xe6c9, 0x0000, 0x91af, 0x0000, 0x0000, 0xe6da, 0x9147, 0x0000,
+ /* 90 */ 0x0000, 0x93f6, 0x0000, 0x956f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe6cd, 0x8e5e, 0x8e92, 0x0000, 0x8fdc, 0x0000,
+ /* a0 */ 0x9485, 0x0000, 0x8cab, 0xe6cc, 0xe6cb, 0x0000, 0x958a, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x8ebf, 0x0000, 0x0000, 0x9371, 0x0000, 0x0000,
+ /* b0 */ 0xfbad, 0x0000, 0x0000, 0x0000, 0xfbae, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe6cf, 0xe6d0, 0x8d77, 0xe6ce,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x04737 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d1, 0xe6d2, 0x0000, 0xe6d4,
+ /* 88 */ 0x91a1, 0x0000, 0xe6d3, 0x8ae4, 0x0000, 0xe6d6, 0x0000, 0xe6d5,
+ /* 90 */ 0xe6d7, 0x0000, 0xfbaf, 0xe6d9, 0xe6db, 0x0000, 0xe6dc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04753 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x90d4, 0x0000, 0x8ecd, 0xe6dd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x8a71, 0x0000, 0xe6de, 0x0000, 0x0000,
+ /* b0 */ 0x9196, 0xe6df, 0x0000, 0xe6e0, 0x958b, 0x0000, 0xfbb0, 0x8b4e,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x04792 ***/
+
+ /* 80 */ 0x0000, 0xe6e1, 0x0000, 0x0000, 0x0000, 0x92b4, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x897a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe6e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x8eef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x91ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe6e5, 0x0000, 0x0000, 0x0000, 0xe6e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x047d1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe6eb, 0xe6e9, 0x0000, 0x0000, 0xe6e6,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe6e7, 0xe6ea, 0x0000, 0x8b97, 0x0000, 0xe6ee,
+ /* a0 */ 0x0000, 0x90d5, 0x0000, 0xe6ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8cd7, 0x0000, 0xe6ec, 0xe6ed, 0x0000, 0x0000, 0x0000, 0x9848,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x92b5, 0x0000, 0x9148, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f0, 0x0000, 0x0000, 0xe6f3,
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x04811 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe6f1, 0xe6f2, 0x9778, 0x0000, 0x0000, 0x0000, 0x0000, 0x93a5,
+ /* 90 */ 0xe6f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f4, 0xe6f5, 0xe6f7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe748, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe6fa, 0x0000, 0x0000, 0x0000, 0xe6fb, 0xe6f9, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x0484f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe6f8, 0x0000, 0x92fb, 0x0000, 0x0000, 0xe740,
+ /* 88 */ 0xe744, 0xe741, 0xe6fc, 0x0000, 0xe742, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe743, 0x0000, 0x0000, 0x0000, 0x0000, 0xe74a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90d6,
+ /* a0 */ 0xe747, 0x0000, 0x0000, 0xe749, 0xe746, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe74c, 0x0000, 0x8f52, 0x0000, 0xe74b, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe74d, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x0488e ***/
+
+ /* 80 */ 0x0000, 0xe74e, 0x0000, 0x0000, 0xe751, 0xe750, 0x0000, 0xe74f,
+ /* 88 */ 0x0000, 0x0000, 0xe753, 0xe752, 0x0000, 0x96f4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe755, 0x0000, 0xe754, 0xe756, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe757, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe758, 0x9067, 0xe75a, 0x0000, 0x0000, 0x8beb,
+ /* b0 */ 0xe75b, 0xe75d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe75e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x048cd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe75f, 0xe75c, 0x0000,
+ /* 88 */ 0xe760, 0x0000, 0x8ed4, 0xe761, 0x8b4f, 0x8c52, 0x0000, 0xfbb2,
+ /* 90 */ 0x0000, 0x0000, 0x8cac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe762, 0x0000, 0x0000, 0x0000, 0x93ee,
+ /* a0 */ 0x0000, 0x0000, 0x935d, 0xe763, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe766, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8eb2, 0x0000, 0x0000, 0xe765, 0xe764, 0x8c79, 0xe767,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x0490c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x8a72, 0x0000, 0xe769, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x8dda, 0xe768, 0x0000, 0xe771, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe76b, 0xe76d, 0x95e3, 0xe76a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe76c, 0x0000, 0xe770, 0xe76e, 0x8b50, 0x0000, 0xe76f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe772, 0x0000,
+ /* a8 */ 0x0000, 0x9479, 0x97d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f53,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe773, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9741, 0xe775, 0x0000, 0xe774, 0x0000, 0x0000, 0xe778, 0x9760,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x0494c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe777, 0x0000, 0x8a8d, 0xe776, 0xe77b, 0x0000,
+ /* 88 */ 0x0000, 0xe77a, 0x0000, 0x0000, 0xe779, 0x9351, 0xe77c, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe77d,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe77e, 0x0000, 0x0000, 0x8d8c,
+ /* a0 */ 0x0000, 0x8c44, 0xe780, 0xe781, 0xe782,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04971 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9068, 0xe783, 0x0000, 0x8eab, 0xe784,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe785, 0x0000, 0x0000, 0x0000, 0x999f,
+ /* a8 */ 0x999e, 0x0000, 0x0000, 0x0000, 0x0000, 0xe786, 0xe390, 0xe787,
+ /* b0 */ 0x9243, 0x904a, 0x945f, 0x0000, 0x0000, 0x0000, 0x0000, 0xe788,
+ /* b8 */ 0x0000, 0x0000, 0x95d3, 0x92d2, 0x8d9e, 0x0000, 0x0000, 0x9248,
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x049b1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x8949, 0x0000, 0x9698, 0x9076, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c7d, 0x0000,
+ /* 90 */ 0x0000, 0x8bdf, 0x0000, 0x0000, 0x95d4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe78b, 0x0000, 0x0000, 0xe78a, 0x89de, 0x0000,
+ /* a8 */ 0x0000, 0x93f4, 0xe78c, 0x9497, 0x0000, 0x9352, 0x0000, 0xe78d,
+ /* b0 */ 0x8f71, 0x0000, 0x0000, 0x0000, 0xe78f, 0x0000, 0x0000, 0x96c0,
+ /* b8 */ 0xe79e, 0xe791, 0xe792, 0x0000, 0x0000, 0x92c7, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x049f1 ***/
+
+ /* 80 */ 0x91de, 0x9197, 0x0000, 0x93a6, 0x0000, 0xe790, 0x8b74, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe799, 0x0000, 0xe796, 0xe7a3, 0x93a7,
+ /* 90 */ 0x9280, 0xe793, 0x0000, 0x92fc, 0x9372, 0xe794, 0xe798, 0x9080,
+ /* 98 */ 0x0000, 0x9487, 0x92ca, 0x0000, 0x0000, 0x90c0, 0xe797, 0x91ac,
+ /* a0 */ 0x91a2, 0xe795, 0x88a7, 0x9841, 0x0000, 0x0000, 0x0000, 0xe79a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91df, 0x0000,
+ /* b0 */ 0x0000, 0x8f54, 0x9069, 0x0000, 0x0000, 0xe79c, 0xe79b, 0x0000,
+ /* b8 */ 0x88ed, 0xe79d, 0x0000, 0x0000, 0x954e, 0x0000, 0xe7a5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x04a30 ***/
+
+ /* 80 */ 0x0000, 0x93d9, 0x908b, 0x0000, 0x0000, 0x9278, 0x0000, 0x8bf6,
+ /* 88 */ 0x0000, 0xe7a4, 0x9756, 0x895e, 0x0000, 0x95d5, 0x89df, 0xe79f,
+ /* 90 */ 0xe7a0, 0xe7a1, 0xe7a2, 0x93b9, 0x9242, 0x88e1, 0xe7a6, 0x0000,
+ /* 98 */ 0xe7a7, 0xeaa1, 0x0000, 0x0000, 0x91bb, 0x0000, 0xe7a8, 0x0000,
+ /* a0 */ 0x8993, 0x916b, 0x0000, 0x8cad, 0x0000, 0x9779, 0x0000, 0xfbb5,
+ /* a8 */ 0xe7a9, 0x934b, 0x0000, 0x0000, 0x0000, 0x9198, 0x8ed5, 0xe7aa,
+ /* b0 */ 0x0000, 0x0000, 0xe7ad, 0x0000, 0x0000, 0x8f85, 0xe7ab, 0x914a,
+ /* b8 */ 0x9149, 0x0000, 0x88e2, 0x0000, 0x97c9, 0xe7af, 0x0000, 0x94f0,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04a70 ***/
+
+ /* 80 */ 0xe7b1, 0xe7b0, 0xe7ae, 0xe284, 0x8ad2, 0x0000, 0x0000, 0xe78e,
+ /* 88 */ 0x0000, 0xe7b3, 0xe7b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b4,
+ /* 90 */ 0x0000, 0x9757, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x93df, 0x0000, 0x0000, 0x964d, 0x0000,
+ /* a8 */ 0xe7b5, 0x0000, 0x8ed7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b6,
+ /* b0 */ 0x0000, 0xe7b7, 0x0000, 0x0000, 0x0000, 0xe7b8, 0x0000, 0x0000,
+ /* b8 */ 0x9340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x04aaf ***/
+
+ /* 80 */ 0x0000, 0x88e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x8d78, 0x0000, 0x0000, 0x0000, 0x9859, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe7bc, 0x0000, 0x0000, 0xfbb6, 0x0000,
+ /* a0 */ 0x0000, 0x8c53, 0xe7b9, 0x0000, 0xe7ba, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9594, 0x0000, 0x0000, 0x0000, 0x0000, 0x8a73, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9758, 0x0000, 0x8bbd,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9373,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e984xx - offset 0x04aed ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe7be, 0x0000, 0x0000, 0xfbb8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe7bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbb9,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9341, 0x0000, 0x0000,
+ /* b0 */ 0xe7c1, 0x0000, 0xe7c0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x04b24 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x93d1, 0xe7c2, 0x8f55, 0x8ede, 0x947a, 0x9291, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x8ef0, 0x0000, 0x908c, 0x0000, 0xe7c3, 0x0000,
+ /* 98 */ 0xe7c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x907c, 0xe7c5, 0x0000, 0xe7c6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe7c7, 0x978f, 0x0000, 0x8f56, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe7c9, 0xe7c8, 0x0000, 0x8d79, 0x0000, 0x8d93,
+ /* b8 */ 0x8e5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x04b62 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f86,
+ /* 88 */ 0x0000, 0xe7cb, 0x0000, 0xe7ca, 0x0000, 0x91e7, 0x0000, 0x0000,
+ /* 90 */ 0x8ced, 0x0000, 0x90c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x94ae,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8f58, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe7cd, 0x0000, 0x8fdd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe7d0, 0xe7ce, 0x0000, 0x0000, 0x0000, 0xe7cf,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7d2, 0xe7d1, 0x0000, 0x0000,
+ /* b8 */ 0x8ff8, 0x0000, 0xe7d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04ba2 ***/
+
+ /* 80 */ 0xe7d4, 0xe7d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x94ce, 0x8dd1,
+ /* 88 */ 0x8edf, 0xe7d6, 0x0000, 0xe7d7, 0x97a2, 0x8f64, 0x96ec, 0x97ca,
+ /* 90 */ 0xe7d8, 0x8be0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7d9, 0xfbbb,
+ /* 98 */ 0x9342, 0x0000, 0xfbba, 0xe7dc, 0x8a98, 0x906a, 0xfbbc, 0xe7da,
+ /* a0 */ 0x0000, 0xe7db, 0x0000, 0x92de, 0xfbbf, 0xfbc0, 0x9674, 0x8bfa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbbd, 0xfbbe, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7de, 0xe7df, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7dd, 0x0000, 0x0000, 0xe7e1,
+
+ /*** Three byte table, leaf: e988xx - offset 0x04be2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbc1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfbc3, 0x0000, 0x0000, 0x93dd, 0x8a62, 0x0000,
+ /* 90 */ 0xfbc2, 0xe7e5, 0x0000, 0x0000, 0xe7e2, 0xe7e4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe86e, 0x0000, 0x0000, 0xe7e3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x97e9, 0x0000, 0x0000, 0x8cd8,
+ /* b8 */ 0x0000, 0xfbca, 0xfbc4, 0x0000, 0xfbc6, 0x0000, 0x0000, 0xe7ed,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04c22 ***/
+
+ /* 80 */ 0xfbc5, 0x0000, 0x0000, 0x0000, 0x9353, 0xe7e8, 0x0000, 0x0000,
+ /* 88 */ 0xe7eb, 0xe7e9, 0x0000, 0xe7ee, 0x0000, 0x0000, 0xfbc7, 0x0000,
+ /* 90 */ 0xe7ef, 0xfbc9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e7,
+ /* 98 */ 0x0000, 0xfbc8, 0xe7f4, 0x8994, 0x0000, 0x0000, 0xe7e6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x94ab, 0x0000, 0xe7ea, 0x0000, 0x8fde, 0xfbcb,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x8d7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbcd,
+ /* b8 */ 0xfbce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9667, 0x0000,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04c62 ***/
+
+ /* 80 */ 0x8be2, 0x0000, 0x0000, 0x8f65, 0x0000, 0x93ba, 0x0000, 0x0000,
+ /* 88 */ 0xfa5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x914c, 0x0000, 0xe7f2, 0x0000, 0xe7ec, 0xe7f1, 0x0000,
+ /* 98 */ 0x96c1, 0x0000, 0x92b6, 0xe7f3, 0xe7f0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbcc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x914b, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f7,
+ /* b8 */ 0x0000, 0xe7f6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04c9c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f5,
+ /* 90 */ 0xfbd2, 0x0000, 0x964e, 0xfbd6, 0x0000, 0xfbd4, 0x0000, 0xfbd0,
+ /* 98 */ 0x0000, 0xfbd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfbd5, 0x0000, 0x0000, 0x0000, 0x8f9b, 0x0000, 0x0000, 0xfbcf,
+ /* a8 */ 0x0000, 0xe7f8, 0x95dd, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x9565, 0x9292, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8b98, 0xfa65, 0xe7fa, 0xfbd9, 0x8d7c, 0x0000, 0x0000, 0xfbdc,
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04cdc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xfbde, 0x0000, 0x0000, 0x0000, 0x8e4b, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f9,
+ /* 90 */ 0x908d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x908e, 0xe840, 0xe842, 0x0000, 0x0000, 0xfbdd, 0xfbdb, 0x0000,
+ /* a0 */ 0x8ff9, 0xfbd8, 0xe841, 0xe843, 0x0000, 0xfbd7, 0x8bd1, 0x0000,
+ /* a8 */ 0x9564, 0x0000, 0x0000, 0x8ee0, 0x9842, 0x0000, 0xe7fc, 0x8df6,
+ /* b0 */ 0x0000, 0x0000, 0x985e, 0x0000, 0x0000, 0xe845, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe844, 0xe846,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04d18 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fb, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xfa5e, 0x0000, 0x0000, 0x93e7, 0x0000, 0x9374, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x92d5, 0x0000, 0xe84b, 0xfbe0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x9262, 0xe847, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8c4c, 0x0000, 0xe84a, 0x0000,
+ /* b0 */ 0xfbdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cae, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe849, 0x0000, 0x8fdf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x04d57 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8a99, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe84f, 0x0000, 0x8dbd, 0x9199,
+ /* 98 */ 0x0000, 0x0000, 0x92c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe1, 0x0000, 0x0000, 0x8a5a,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe84d, 0xe84e, 0x92c1, 0x0000,
+ /* b0 */ 0xe84c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe850, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04d94 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe856, 0x0000, 0x0000, 0xfbe2, 0x0000,
+ /* 88 */ 0xe859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe858, 0x934c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe851, 0xe852,
+ /* 98 */ 0xe855, 0x0000, 0x0000, 0x0000, 0x0000, 0xe857, 0xfbe3, 0x0000,
+ /* a0 */ 0x0000, 0x8bbe, 0x0000, 0x0000, 0xe85a, 0xe854, 0x0000, 0x0000,
+ /* a8 */ 0xe853, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfbe4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04dd1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe85e, 0x0000, 0x0000, 0x0000, 0xe85f,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe860, 0x0000, 0x0000, 0xe85d, 0xe85c, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8fe0, 0x93a8, 0xe85b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe862, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfbe5, 0x0000, 0x0000, 0x0000, 0xe863, 0xe861, 0x0000,
+ /* b8 */ 0x91f6, 0x0000, 0xe865, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x04e10 ***/
+
+ /* 80 */ 0x0000, 0xe866, 0x0000, 0x0000, 0xe868, 0xfbe6, 0x0000, 0x0000,
+ /* 88 */ 0xfbe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x8ad3, 0xe867, 0x96f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe873, 0xe869, 0x0000, 0x0000, 0xe86c, 0x0000,
+ /* a0 */ 0xe86a, 0x0000, 0xe86b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe86d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe86f, 0x0000, 0x0000, 0x0000, 0x0000, 0xe870, 0x0000, 0xe871,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe874, 0xe872, 0xe875, 0xe877,
+
+ /*** Three byte table, leaf: e992xx - offset 0x04e50 ***/
+
+ /* 80 */ 0x0000, 0xe876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000,
+ /* 55 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e995xx - offset 0x04e59 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x04e99 ***/
+
+ /* 80 */ 0x96e5, 0x0000, 0xe878, 0x914d, 0x0000, 0x0000, 0x0000, 0xe879,
+ /* 88 */ 0x0000, 0x95c2, 0xe87a, 0x8a4a, 0x0000, 0x0000, 0x0000, 0x895b,
+ /* 90 */ 0x0000, 0x8ad5, 0xfbe8, 0x8ad4, 0xe87b, 0x0000, 0xe87c, 0x0000,
+ /* 98 */ 0xe87d, 0xe87e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe880, 0x0000, 0x8ad6, 0x8a74, 0x8d7d, 0x94b4, 0x0000, 0xe882,
+ /* a8 */ 0xe881, 0x0000, 0x0000, 0x0000, 0x0000, 0xe883, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x897b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe886, 0x0000, 0xe885, 0xe884, 0x0000, 0xe887,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x04ed8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe88a, 0x0000, 0x0000, 0x0000, 0x88c5,
+ /* 88 */ 0x0000, 0x0000, 0xe888, 0x0000, 0xe88c, 0xe88b, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe88e, 0xe88d, 0xe88f, 0x0000,
+ /* 98 */ 0x93ac, 0x0000, 0x0000, 0x0000, 0xe890, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe891, 0xe893, 0x0000, 0x0000, 0xe892,
+ /* 26 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x04efe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x958c, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe895, 0x0000, 0x8de3, 0x0000, 0x0000, 0x0000, 0xe896, 0xe897,
+ /* b0 */ 0x0000, 0x0000, 0x9668, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x916a, 0x0000, 0x0000, 0x0000, 0x88a2,
+
+ /*** Three byte table, leaf: e999xx - offset 0x04f3e ***/
+
+ /* 80 */ 0x91c9, 0x0000, 0xe898, 0x0000, 0x958d, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe89b, 0xe899, 0x8d7e, 0x0000, 0xe89a,
+ /* 90 */ 0x8cc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x95c3, 0xe89d, 0xe89f, 0xe89e, 0xe8a0,
+ /* a0 */ 0x0000, 0x0000, 0x8940, 0x9077, 0x8f9c, 0x8ad7, 0xe8a1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x9486, 0x0000, 0xe8a3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x8941, 0x0000, 0xe8a2, 0x92c2, 0x0000, 0x97cb, 0x93a9, 0xe89c,
+ /* b8 */ 0x97a4, 0x0000, 0x8caf, 0x0000, 0x0000, 0x977a,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x04f7c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bf7, 0x97b2, 0x0000,
+ /* 88 */ 0x8c47, 0x0000, 0x91e0, 0xe440, 0x0000, 0xe8a4, 0x8a4b, 0x908f,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8a75, 0xe8a6, 0x0000, 0xe8a7,
+ /* 98 */ 0xe8a5, 0x8c84, 0x0000, 0x8ddb, 0x8fe1, 0xfbeb, 0x0000, 0x0000,
+ /* a0 */ 0x8942, 0x0000, 0x0000, 0x97d7, 0x0000, 0x0000, 0x0000, 0xe8a9,
+ /* a8 */ 0xe7ac, 0x0000, 0xe8a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbec,
+ /* b0 */ 0xe8ac, 0xe8aa, 0xe8ab, 0x0000, 0xe8ad, 0x0000, 0xe8ae, 0x97ea,
+ /* b8 */ 0xe8af, 0xe8b0, 0x0000, 0x90c7, 0x94b9, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x04fbc ***/
+
+ /* 80 */ 0x909d, 0x8ae5, 0x0000, 0x0000, 0x9759, 0x89eb, 0x8f57, 0x8cd9,
+ /* 88 */ 0x0000, 0xe8b3, 0x0000, 0xe8b2, 0x8e93, 0xe8b4, 0xe8b1, 0x0000,
+ /* 90 */ 0x0000, 0x8e47, 0x0000, 0x0000, 0x0000, 0xe8b8, 0xe5ab, 0x0000,
+ /* 98 */ 0x0000, 0x99d4, 0x0000, 0x9097, 0xe8b6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x97a3, 0x93ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x894a, 0x0000, 0x90e1, 0x8eb4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x95b5, 0x0000, 0x895f, 0x0000, 0x0000, 0x0000, 0x97eb, 0x978b,
+ /* b8 */ 0x0000, 0xe8b9, 0x0000, 0x9364, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x04ffc ***/
+
+ /* 80 */ 0x8ef9, 0x0000, 0x0000, 0x0000, 0xe8ba, 0x0000, 0xe8bb, 0x906b,
+ /* 88 */ 0xe8bc, 0x0000, 0x97ec, 0x0000, 0x0000, 0xe8b7, 0xe8be, 0xe8c0,
+ /* 90 */ 0x0000, 0xe8bf, 0x0000, 0xe8bd, 0x0000, 0x0000, 0xe8c1, 0x0000,
+ /* 98 */ 0x0000, 0xe8c2, 0x0000, 0x0000, 0x919a, 0x0000, 0x89e0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8c3, 0x0000, 0x0000, 0x96b6,
+ /* a8 */ 0x0000, 0x0000, 0xe8c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8c5, 0x0000, 0x9849, 0xfbed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x9e50, 0xe8c6, 0x0000, 0xfbee, 0x0000, 0xe8c7, 0xe8c8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x0503b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe8cc, 0xfbef, 0xe8c9, 0x0000, 0xe8ca, 0x0000,
+ /* 88 */ 0xe8cb, 0xe8cd, 0x0000, 0x0000, 0x0000, 0xfbf0, 0x0000, 0xfbf1,
+ /* 90 */ 0x0000, 0xfbf2, 0x90c2, 0x0000, 0x0000, 0xfbf3, 0x96f5, 0x0000,
+ /* 98 */ 0x0000, 0x90c3, 0x0000, 0x0000, 0xe8ce, 0x0000, 0x94f1, 0x0000,
+ /* a0 */ 0xe8cf, 0xea72, 0x96ca, 0x0000, 0xe8d0, 0x0000, 0xe8d1, 0x0000,
+ /* a8 */ 0xe8d2, 0x8a76, 0x0000, 0xe8d4, 0x0000, 0x9078, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe8d5, 0x0000, 0x0000, 0x8c43, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe8d6, 0xe8da, 0x0000, 0xe8d8, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x0507a ***/
+
+ /* 80 */ 0x0000, 0xe8d9, 0x0000, 0x0000, 0x8a93, 0xe8d7, 0xe8db, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8dc, 0x0000, 0x88c6, 0x0000, 0xe8dd,
+ /* 90 */ 0xe8de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8fe2, 0x0000, 0x0000, 0x0000, 0xe8df, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8b66, 0x0000, 0x0000, 0xe8e2, 0x0000, 0x0000, 0xe8e1, 0x0000,
+ /* a8 */ 0xe8e0, 0x0000, 0x0000, 0xe691, 0x0000, 0x95da, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe8e3, 0xe8e4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x050b7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe8e5, 0x0000, 0x0000, 0xe8e6, 0x0000,
+ /* 88 */ 0xe8e7, 0x0000, 0x0000, 0xe8e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8ad8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ea, 0x9442, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe8ec, 0x89b9, 0x0000, 0xe8ef, 0xe8ee, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8943, 0x0000, 0x0000, 0x0000, 0x8bbf,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x050f7 ***/
+
+ /* 80 */ 0x0000, 0x95c5, 0x92b8, 0x8da0, 0x0000, 0x8d80, 0x8f87, 0x0000,
+ /* 88 */ 0x907b, 0x0000, 0x0000, 0x0000, 0xe8f1, 0x0000, 0x0000, 0xe8f0,
+ /* 90 */ 0x9761, 0x8ae6, 0x94d0, 0x93da, 0x0000, 0x0000, 0x0000, 0x909c,
+ /* 98 */ 0x97cc, 0x0000, 0x8c7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe8f4, 0x0000, 0x0000, 0xe8f3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x966a, 0x93aa, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x896f, 0x0000, 0x0000, 0xe8f5,
+ /* b8 */ 0xe8f2, 0x0000, 0x0000, 0x9570, 0x978a, 0xe8f6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x05135 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8f7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe8f9, 0x91e8, 0x8a7a, 0x8a7b, 0xe8f8,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ae7, 0x8cb0, 0x0000, 0xfbf4,
+ /* 98 */ 0x8ae8, 0x0000, 0x0000, 0x935e, 0x0000, 0x0000, 0x97de, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbf5, 0x0000, 0x8cda,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe8fa, 0x0000, 0x0000, 0x0000, 0xe8fb,
+ /* b0 */ 0xe8fc, 0xe940, 0x0000, 0xe942, 0xe941,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x0516a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x9597, 0x0000, 0xe943, 0x0000, 0x0000, 0x0000, 0x0000, 0xe944,
+ /* b0 */ 0x0000, 0xe945, 0x0000, 0x0000, 0x0000, 0x0000, 0xe946, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x051a7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe948, 0xe947, 0x0000, 0xe949, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x94f2, 0xe3ca, 0x0000, 0x0000, 0x9048,
+ /* a0 */ 0x0000, 0x0000, 0x8b51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe94a, 0x0000, 0xe94b, 0x0000, 0x99aa, 0x9f5a, 0x94d1,
+ /* b0 */ 0x0000, 0x0000, 0x88f9, 0x0000, 0x88b9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8e94, 0x964f, 0x8ffc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x051e6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe94c, 0x0000, 0x96dd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe94d, 0x977b, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x8e60, 0x0000, 0xe94e, 0x89ec, 0xe94f, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe950, 0x0000, 0x0000, 0x0000, 0x0000, 0xe952, 0xe953, 0x0000,
+ /* a0 */ 0xe955, 0xe951, 0x0000, 0x0000, 0xe954, 0x0000, 0x0000, 0xfbf8,
+ /* a8 */ 0x8ad9, 0x0000, 0x0000, 0x0000, 0xe956, 0x0000, 0xe957, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe958, 0xe959,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x05225 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe95a, 0x0000, 0x0000, 0xe95c, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe95b, 0x0000, 0xe95e, 0xe961, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe95d, 0xe95f, 0xe960, 0x0000, 0x0000, 0xe962, 0x0000, 0x8bc0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x0524f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ef1, 0xe963,
+ /* 98 */ 0xe964, 0x8d81, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfa, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe965, 0x0000, 0x0000,
+ /* a8 */ 0x8a5d, 0x0000, 0x0000, 0x0000, 0x946e, 0xe966, 0xe967, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x9279, 0x93e9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe968, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x0528e ***/
+
+ /* 80 */ 0x0000, 0x949d, 0x0000, 0x0000, 0x91ca, 0x8977, 0x8bec, 0x0000,
+ /* 88 */ 0x8bed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x9293, 0xe96d, 0x8bee, 0x0000, 0x0000, 0x89ed, 0x0000, 0x0000,
+ /* 98 */ 0xe96c, 0x0000, 0x0000, 0xe96a, 0x0000, 0xe96b, 0x0000, 0xe969,
+ /* a0 */ 0x0000, 0x0000, 0xe977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe96e, 0xe96f, 0x0000,
+ /* b0 */ 0x0000, 0xe970, 0xe971, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe973, 0x0000, 0x0000, 0xe972, 0x0000, 0x0000, 0x0000, 0x8f78,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x052ce ***/
+
+ /* 80 */ 0x0000, 0xe974, 0x0000, 0x0000, 0x0000, 0xe976, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b52, 0xe975,
+ /* 90 */ 0x0000, 0x0000, 0x919b, 0x8cb1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x91cb, 0x0000, 0x0000, 0xe979, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x93ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe97a,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe980, 0x0000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x0530e ***/
+
+ /* 80 */ 0xe97d, 0x0000, 0xe97c, 0xe97e, 0x0000, 0xe97b, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe982, 0xfbfb, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe981, 0x0000, 0xe984,
+ /* 98 */ 0x0000, 0x0000, 0x8bc1, 0xe983, 0x0000, 0x0000, 0x0000, 0xe985,
+ /* a0 */ 0x0000, 0x0000, 0xe986, 0x0000, 0xe988, 0xe987, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe989, 0xe98b, 0xe98a,
+ /* 20 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x0533a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8d9c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe98c, 0x0000, 0x0000,
+ /* b0 */ 0xe98d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x8a5b, 0x0000, 0x0000, 0x0000, 0xe98e, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9abxx - offset 0x0537a ***/
+
+ /* 80 */ 0xe98f, 0x0000, 0x0000, 0x0000, 0x9091, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe990,
+ /* 90 */ 0x0000, 0xe991, 0x0000, 0xe992, 0xe993, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x8d82, 0xfbfc, 0x0000, 0x0000, 0xfc40, 0x0000, 0xe994, 0xe995,
+ /* a0 */ 0x0000, 0x0000, 0xe996, 0xe997, 0x0000, 0x0000, 0xe998, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x94af, 0xe99a, 0x0000, 0x9545, 0xe99b, 0xe999,
+ /* b0 */ 0x0000, 0xe99d, 0x0000, 0x0000, 0xe99c, 0x0000, 0x0000, 0xe99e,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe99f,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x053b6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe9a1, 0x0000, 0xe9a2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a3,
+ /* a0 */ 0x0000, 0x0000, 0xe9a4, 0xe9a5, 0x0000, 0xe9a6, 0x0000, 0xe9a7,
+ /* a8 */ 0xe9a8, 0xe9a9, 0xe9aa, 0x0000, 0x0000, 0x0000, 0xe9ab, 0xe9ac,
+ /* b0 */ 0x0000, 0x9f54, 0xe9ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe2f6, 0x8b53, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x053f5 ***/
+
+ /* 80 */ 0x0000, 0x8a40, 0x8db0, 0xe9af, 0xe9ae, 0x96a3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9b1, 0xe9b2, 0xe9b0,
+ /* 90 */ 0x0000, 0xe9b3, 0x0000, 0x0000, 0x9682, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe9b4, 0x0000, 0x8b9b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9844,
+ /* b0 */ 0x0000, 0x0000, 0xfc42, 0x0000, 0xe9b5, 0xfc41, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x05432 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe9b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88bc, 0xfc43,
+ /* 90 */ 0x0000, 0xe9b8, 0x95a9, 0xe9b6, 0x0000, 0x0000, 0xe9b9, 0xe9ba,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9bb,
+ /* a0 */ 0xe9bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe9bd, 0x0000, 0x968e, 0x8e4c, 0x0000, 0x8df8, 0x914e, 0x0000,
+ /* b0 */ 0x0000, 0xfc44, 0x0000, 0x0000, 0xe9be, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe9c1, 0x0000, 0xfc45, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9afxx - offset 0x05472 ***/
+
+ /* 80 */ 0xe9bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c2, 0x0000,
+ /* 88 */ 0x0000, 0x8cef, 0xe9c0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c3,
+ /* 90 */ 0x0000, 0xe9c4, 0xe9c5, 0x0000, 0xe9c9, 0x0000, 0x8e49, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x91e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe9ca, 0xe9c7, 0xe9c6, 0xe9c8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x8c7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe9ce, 0xe9cd, 0xe9cc, 0x0000, 0x0000, 0x88b1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x054b2 ***/
+
+ /* 80 */ 0xfc46, 0x0000, 0x0000, 0x0000, 0xe9d8, 0x0000, 0xe9d4, 0x0000,
+ /* 88 */ 0xe9d5, 0xe9d1, 0xe9d7, 0x0000, 0xe9d3, 0x8a82, 0x0000, 0x0000,
+ /* 90 */ 0x986b, 0x0000, 0xe9d6, 0xe9d2, 0xe9d0, 0xe9cf, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe9da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe9dd, 0x0000, 0x0000, 0xe9dc, 0xe9db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9568, 0xe9d9, 0x88f1,
+ /* b0 */ 0xe9de, 0x0000, 0xe9e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x8a8f, 0xe9cb, 0x8956, 0x0000, 0x0000, 0xe9e2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x054f1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e1, 0xe9df,
+ /* 88 */ 0x924c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x9690, 0x0000, 0x0000, 0x0000, 0x0000, 0x97d8,
+ /* 98 */ 0x0000, 0x0000, 0xe9e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe9e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e5,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e6, 0x0000,
+ /* b8 */ 0xe9e7,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x0552a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b9, 0x0000, 0xe9e8,
+ /* a8 */ 0x0000, 0x94b5, 0x0000, 0xe9ed, 0xe9e9, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe9ea, 0x0000, 0x0000, 0x9650, 0x96c2, 0x0000, 0x93ce, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x05567 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe9ee, 0x0000, 0x0000, 0xe9ef, 0x93bc,
+ /* 88 */ 0xe9ec, 0xe9eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x89a8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe9f7, 0x0000, 0x0000, 0xe9f6, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x8995, 0x0000, 0x0000, 0x0000, 0xe9f4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe9f3, 0x0000, 0x0000, 0xe9f1, 0x0000,
+ /* a8 */ 0x8a9b, 0x0000, 0xe9f0, 0x8eb0, 0x89a7, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x8d83, 0x0000, 0x0000, 0xe9fa, 0xe9f9,
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x055a7 ***/
+
+ /* 80 */ 0x0000, 0xe9f8, 0x0000, 0x0000, 0xe9f5, 0x0000, 0xe9fb, 0x0000,
+ /* 88 */ 0xe9fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xea44, 0xea43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xea45, 0x0000, 0x0000, 0x894c, 0xea40, 0xea41, 0x0000,
+ /* a0 */ 0x8d94, 0x96b7, 0x0000, 0x0000, 0xea42, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfc48, 0x9651, 0x0000, 0x0000, 0xea4a,
+ /* b0 */ 0xfc47, 0x0000, 0xea46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xea4b,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x055e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea48,
+ /* 88 */ 0x0000, 0xea47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c7b,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xea4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea4d, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xea4e, 0x0000, 0xea49, 0x0000, 0x0000, 0x0000, 0xe9f2,
+ /* b0 */ 0x0000, 0x0000, 0xea4f, 0x0000, 0x92df, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xea53, 0x0000, 0xea54, 0xea52, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x05621 ***/
+
+ /* 80 */ 0x0000, 0xea51, 0xea57, 0x0000, 0xea50, 0x0000, 0xea55, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea56,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xea59, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xea58, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea5b, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea5c, 0x0000, 0xea5d,
+ /* b0 */ 0x0000, 0x0000, 0x9868, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xea5a, 0x91e9, 0x8deb, 0x0000, 0x0000, 0xea5e,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x0565f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfc4a, 0xea5f, 0xea60, 0x0000, 0x0000, 0xea61,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x0567e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea62, 0x0000, 0x0000,
+ /* b8 */ 0x8cb2, 0xea63, 0x0000, 0x0000, 0x0000, 0xea64, 0x0000, 0x8ead,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x056be ***/
+
+ /* 80 */ 0x0000, 0xea65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xea66, 0x0000, 0x0000, 0xea67, 0xea68, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xea6b, 0xea69, 0x985b, 0x0000, 0xea6a, 0x0000, 0x97ed,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea6c, 0x0000, 0x97d9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea6d, 0x949e, 0x0000,
+ /* a8 */ 0x0000, 0xea6e, 0xea70, 0x0000, 0x0000, 0xea71, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xea6f, 0x8d8d, 0x96cb, 0x9683, 0x9bf5, 0x0000, 0x9f80, 0x969b,
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x056fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x89a9, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea73, 0x8b6f, 0xea74, 0xea75,
+ /* 90 */ 0xea76, 0xfc4b, 0x8d95, 0x0000, 0xea77, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe0d2, 0x96d9, 0x0000, 0x91e1, 0xea78, 0xea7a, 0xea79, 0x0000,
+ /* a0 */ 0xea7b, 0x0000, 0x0000, 0x0000, 0x0000, 0xea7c, 0x0000, 0x0000,
+ /* a8 */ 0xea7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea7e,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea80, 0x0000, 0xea81, 0xea82,
+ /* b8 */ 0x0000, 0xea83, 0x0000, 0xea84, 0xea85, 0xea86,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x0573c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea87,
+ /* 88 */ 0xea88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9343, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x8cdb, 0x0000, 0xea8a, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x916c, 0xea8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea8c, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x9540, 0x0000, 0x0000, 0xea8d,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x0577b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xea8e, 0xe256, 0x0000, 0x0000, 0xe6d8, 0xe8eb,
+ /* 90 */ 0x0000, 0x0000, 0xea8f, 0x0000, 0xea90, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea92,
+ /* a0 */ 0xea93, 0xea94, 0x97ee, 0xea91, 0x0000, 0x0000, 0xea95, 0xea96,
+ /* a8 */ 0x0000, 0x0000, 0xea98, 0x0000, 0xea97, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xea9a, 0x0000, 0x0000, 0x0000, 0xea9b, 0xea99,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x057b3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97b4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xea9c, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xea9d, 0xe273, 0x0000, 0x0000,
+ /* a0 */ 0xea9e,
+ /* 31 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa4xx - offset 0x057d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfae0,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa7xx - offset 0x057fe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe9, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efa8xx - offset 0x05830 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa90, 0xfa9b,
+ /* 90 */ 0xfa9c, 0xfab1, 0xfad8, 0xfae8, 0xfaea, 0xfb58, 0xfb5e, 0xfb75,
+ /* 98 */ 0xfb7d, 0xfb7e, 0xfb80, 0xfb82, 0xfb86, 0xfb89, 0xfb92, 0xfb9d,
+ /* a0 */ 0xfb9f, 0xfba0, 0xfba9, 0xfbb1, 0xfbb3, 0xfbb4, 0xfbb7, 0xfbd3,
+ /* a8 */ 0xfbda, 0xfbea, 0xfbf6, 0xfbf7, 0xfbf9, 0xfc49, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x0586f ***/
+
+ /* 80 */ 0x0000, 0x8149, 0xfa57, 0x8194, 0x8190, 0x8193, 0x8195, 0xfa56,
+ /* 88 */ 0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x817c, 0x8144, 0x815e,
+ /* 90 */ 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256,
+ /* 98 */ 0x8257, 0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148,
+ /* a0 */ 0x8197, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266,
+ /* a8 */ 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e,
+ /* b0 */ 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276,
+ /* b8 */ 0x8277, 0x8278, 0x8279, 0x816d, 0x815f, 0x816e, 0x814f, 0x8151,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x058af ***/
+
+ /* 80 */ 0x814d, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287,
+ /* 88 */ 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f,
+ /* 90 */ 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297,
+ /* 98 */ 0x8298, 0x8299, 0x829a, 0x816f, 0x8162, 0x8170, 0x8160, 0x0000,
+ /* a0 */ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Three byte table, leaf: efbexx - offset 0x058ef ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x0592f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x8191, 0x8192, 0x81ca, 0x8150, 0xfa55, 0x818f, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_uhc.map b/src/backend/utils/mb/Unicode/utf8_to_uhc.map
new file mode 100644
index 0000000..308b2b2
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_uhc.map
@@ -0,0 +1,6377 @@
+/* src/backend/utils/mb/Unicode/utf8_to_uhc.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_UHC.pl */
+
+static const uint16 uhc_from_unicode_tree_table[34768];
+
+static const pg_mb_radix_tree uhc_from_unicode_tree =
+{
+ uhc_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0276, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xef, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xbf, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 uhc_from_unicode_tree_table[34768] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0090, 0x00cf, 0x010f, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0148, 0x0000, 0x0000, 0x0177, 0x01b7, 0x01f6, 0x0236,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa2ae, 0x0000, 0x0000, 0xa2b4, 0x0000, 0x0000, 0xa1d7,
+ /* a8 */ 0xa1a7, 0x0000, 0xa8a3, 0x0000, 0x0000, 0xa1a9, 0xa2e7, 0x0000,
+ /* b0 */ 0xa1c6, 0xa1be, 0xa9f7, 0xa9f8, 0xa2a5, 0x0000, 0xa2d2, 0xa1a4,
+ /* b8 */ 0xa2ac, 0xa9f6, 0xa8ac, 0x0000, 0xa8f9, 0xa8f6, 0xa8fa, 0xa2af,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00090 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a1, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1bf,
+ /* 98 */ 0xa8aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ad, 0xa9ac,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9a1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa9a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c0,
+ /* b8 */ 0xa9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9ad,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa9a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a4, 0xa9a4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa9a5, 0xa8a6, 0xa9a6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xa9a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a8,
+
+ /*** Two byte table, leaf: c5xx - offset 0x0010f ***/
+
+ /* 80 */ 0xa9a8, 0xa8a9, 0xa9a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa9b0, 0xa8af, 0xa9af, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa8ab, 0xa9ab, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ae, 0xa9ae,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00148 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2a7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa2b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xa2a8, 0xa2ab, 0xa2aa, 0xa2ad, 0x0000, 0xa2a9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x00177 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7,
+ /* 98 */ 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf,
+ /* a0 */ 0xa5d0, 0xa5d1, 0x0000, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6,
+ /* a8 */ 0xa5d7, 0xa5d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7,
+ /* b8 */ 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef,
+
+ /*** Two byte table, leaf: cfxx - offset 0x001b7 ***/
+
+ /* 80 */ 0xa5f0, 0xa5f1, 0x0000, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6,
+ /* 88 */ 0xa5f7, 0xa5f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x001f6 ***/
+
+ /* 80 */ 0x0000, 0xaca7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xaca1, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca8, 0xaca9,
+ /* 98 */ 0xacaa, 0xacab, 0xacac, 0xacad, 0xacae, 0xacaf, 0xacb0, 0xacb1,
+ /* a0 */ 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacb8, 0xacb9,
+ /* a8 */ 0xacba, 0xacbb, 0xacbc, 0xacbd, 0xacbe, 0xacbf, 0xacc0, 0xacc1,
+ /* b0 */ 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd5, 0xacd6, 0xacd8, 0xacd9,
+ /* b8 */ 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0xace0, 0xace1,
+
+ /*** Two byte table, leaf: d1xx - offset 0x00236 ***/
+
+ /* 80 */ 0xace2, 0xace3, 0xace4, 0xace5, 0xace6, 0xace7, 0xace8, 0xace9,
+ /* 88 */ 0xacea, 0xaceb, 0xacec, 0xaced, 0xacee, 0xacef, 0xacf0, 0xacf1,
+ /* 90 */ 0x0000, 0xacd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00276 ***/
+
+ /* e2 */ 0x0284, 0x02c4, 0x02d4, 0x0314, 0x0354, 0x0394, 0x03d4, 0x0414,
+ /* ea */ 0x0453, 0x0493, 0x04d3, 0x0513, 0x0553, 0x056f,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00284 ***/
+
+ /* 80 */ 0x05af, 0x05eb, 0x062b, 0x0000, 0x0668, 0x0695, 0x06cf, 0x06fd,
+ /* 88 */ 0x073d, 0x077b, 0x07b9, 0x0000, 0x07e7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0807, 0x0847, 0x087d, 0x08bd, 0x08fd, 0x092b, 0x096b,
+ /* 98 */ 0x09a6, 0x09e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: e3xx - offset 0x002c4 ***/
+
+ /* 80 */ 0x0a26, 0x0a65, 0x0aa5, 0x0ae5, 0x0b1c, 0x0b5c, 0x0b9c, 0x0000,
+ /* 88 */ 0x0bdc, 0x0bfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c3c, 0x0c7c,
+ /* 48 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: e4xx - offset 0x002d4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0cbc, 0x0cfa, 0x0d39, 0x0d79, 0x0db8, 0x0df6, 0x0e36, 0x0e76,
+
+ /*** Three byte table, byte #2: e5xx - offset 0x00314 ***/
+
+ /* 80 */ 0x0eb4, 0x0ef1, 0x0f31, 0x0f70, 0x0fb0, 0x0ff0, 0x1030, 0x106e,
+ /* 88 */ 0x10ae, 0x10eb, 0x112b, 0x116a, 0x11aa, 0x11ea, 0x122a, 0x1267,
+ /* 90 */ 0x12a4, 0x12e3, 0x1323, 0x1363, 0x139f, 0x13de, 0x141e, 0x1459,
+ /* 98 */ 0x1498, 0x14cf, 0x1509, 0x1546, 0x1583, 0x15c3, 0x1601, 0x163e,
+ /* a0 */ 0x167e, 0x16b9, 0x16f8, 0x1737, 0x1775, 0x17b4, 0x17f2, 0x1831,
+ /* a8 */ 0x1871, 0x18b0, 0x18de, 0x191d, 0x1958, 0x1998, 0x19d5, 0x1a15,
+ /* b0 */ 0x1a54, 0x1a94, 0x1ace, 0x1b0e, 0x1b4c, 0x1b81, 0x1bba, 0x1bf8,
+ /* b8 */ 0x1c37, 0x1c77, 0x1cb6, 0x1cf5, 0x1d34, 0x1d71, 0x1db1, 0x1def,
+
+ /*** Three byte table, byte #2: e6xx - offset 0x00354 ***/
+
+ /* 80 */ 0x1e2f, 0x1e6e, 0x1ea9, 0x1ee7, 0x1f26, 0x1f66, 0x1fa5, 0x1fe4,
+ /* 88 */ 0x2024, 0x2064, 0x20a4, 0x20e2, 0x2122, 0x2161, 0x21a1, 0x21e1,
+ /* 90 */ 0x2219, 0x2258, 0x2293, 0x22d2, 0x2312, 0x2352, 0x2391, 0x23d0,
+ /* 98 */ 0x2410, 0x244f, 0x248b, 0x24ca, 0x250a, 0x2548, 0x2588, 0x25c7,
+ /* a0 */ 0x2606, 0x2646, 0x2686, 0x26c2, 0x2702, 0x2742, 0x277c, 0x27bb,
+ /* a8 */ 0x27fb, 0x2839, 0x2879, 0x28b7, 0x28f3, 0x2932, 0x2972, 0x29b2,
+ /* b0 */ 0x29ea, 0x2a2a, 0x2a69, 0x2aa9, 0x2ade, 0x2b1d, 0x2b5d, 0x2b9d,
+ /* b8 */ 0x2bd9, 0x2c18, 0x2c53, 0x2c91, 0x2cd1, 0x2d11, 0x2d50, 0x2d90,
+
+ /*** Three byte table, byte #2: e7xx - offset 0x00394 ***/
+
+ /* 80 */ 0x2dcf, 0x2e0e, 0x2e4c, 0x2e86, 0x2ec4, 0x2efd, 0x2f3b, 0x2f7a,
+ /* 88 */ 0x2fba, 0x2ffa, 0x303a, 0x307a, 0x30b8, 0x30f8, 0x3134, 0x3174,
+ /* 90 */ 0x31b3, 0x31f3, 0x3232, 0x3272, 0x32b1, 0x32ec, 0x332c, 0x336b,
+ /* 98 */ 0x33ab, 0x33e9, 0x3428, 0x3468, 0x34a7, 0x34e7, 0x3527, 0x3567,
+ /* a0 */ 0x35a5, 0x35e0, 0x361f, 0x365e, 0x369d, 0x36dd, 0x371d, 0x375d,
+ /* a8 */ 0x379d, 0x37dd, 0x381d, 0x3859, 0x3899, 0x38d3, 0x3911, 0x3951,
+ /* b0 */ 0x398a, 0x39ca, 0x3a07, 0x3a46, 0x3a86, 0x3ac4, 0x3b04, 0x3b44,
+ /* b8 */ 0x3b80, 0x3bbf, 0x3bfd, 0x0000, 0x3c1a, 0x3c55, 0x3c90, 0x3ccf,
+
+ /*** Three byte table, byte #2: e8xx - offset 0x003d4 ***/
+
+ /* 80 */ 0x3d0f, 0x3d4f, 0x3d8f, 0x3dcc, 0x3e0a, 0x3e49, 0x3e89, 0x3ec9,
+ /* 88 */ 0x3f08, 0x3f48, 0x3f87, 0x3fc7, 0x4006, 0x4046, 0x4082, 0x40c1,
+ /* 90 */ 0x40ff, 0x413d, 0x4178, 0x41b8, 0x41f5, 0x4235, 0x4271, 0x42b0,
+ /* 98 */ 0x42f0, 0x4330, 0x436a, 0x43a3, 0x43e3, 0x4415, 0x4453, 0x448f,
+ /* a0 */ 0x44ce, 0x450e, 0x454e, 0x458d, 0x45cb, 0x460a, 0x464a, 0x468a,
+ /* a8 */ 0x46ca, 0x4706, 0x4741, 0x4781, 0x47c1, 0x4800, 0x4840, 0x0000,
+ /* b0 */ 0x485b, 0x489b, 0x48d9, 0x4919, 0x4957, 0x4973, 0x49ae, 0x49ed,
+ /* b8 */ 0x4a23, 0x4a61, 0x4aa0, 0x4ae0, 0x4b1f, 0x4b5f, 0x4b84, 0x4bc2,
+
+ /*** Three byte table, byte #2: e9xx - offset 0x00414 ***/
+
+ /* 80 */ 0x4c02, 0x4c41, 0x4c81, 0x4cc0, 0x4cfe, 0x4d35, 0x4d6e, 0x4dae,
+ /* 88 */ 0x4de4, 0x4e24, 0x4e64, 0x4e9e, 0x4edb, 0x4f13, 0x4f52, 0x4f8f,
+ /* 90 */ 0x4fcb, 0x5007, 0x0000, 0x0000, 0x0000, 0x5047, 0x5087, 0x50c4,
+ /* 98 */ 0x50e8, 0x5128, 0x5166, 0x51a6, 0x51e6, 0x5224, 0x525f, 0x5299,
+ /* a0 */ 0x52d9, 0x5315, 0x5345, 0x5381, 0x53c0, 0x53fb, 0x5425, 0x5464,
+ /* a8 */ 0x54a4, 0x54e4, 0x550f, 0x5548, 0x5577, 0x55b6, 0x55e8, 0x561f,
+ /* b0 */ 0x5652, 0x568e, 0x0000, 0x56a9, 0x56e0, 0x571c, 0x574f, 0x578b,
+ /* b8 */ 0x57c6, 0x57e5, 0x5825, 0x5864, 0x589d, 0x58d9, 0x5911,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: eaxx - offset 0x00453 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x5951, 0x5991, 0x59d1, 0x5a11, 0x5a51, 0x5a91, 0x5ad1, 0x5b11,
+ /* b8 */ 0x5b51, 0x5b91, 0x5bd1, 0x5c11, 0x5c51, 0x5c91, 0x5cd1, 0x5d11,
+
+ /*** Three byte table, byte #2: ebxx - offset 0x00493 ***/
+
+ /* 80 */ 0x5d51, 0x5d91, 0x5dd1, 0x5e11, 0x5e51, 0x5e91, 0x5ed1, 0x5f11,
+ /* 88 */ 0x5f51, 0x5f91, 0x5fd1, 0x6011, 0x6051, 0x6091, 0x60d1, 0x6111,
+ /* 90 */ 0x6151, 0x6191, 0x61d1, 0x6211, 0x6251, 0x6291, 0x62d1, 0x6311,
+ /* 98 */ 0x6351, 0x6391, 0x63d1, 0x6411, 0x6451, 0x6491, 0x64d1, 0x6511,
+ /* a0 */ 0x6551, 0x6591, 0x65d1, 0x6611, 0x6651, 0x6691, 0x66d1, 0x6711,
+ /* a8 */ 0x6751, 0x6791, 0x67d1, 0x6811, 0x6851, 0x6891, 0x68d1, 0x6911,
+ /* b0 */ 0x6951, 0x6991, 0x69d1, 0x6a11, 0x6a51, 0x6a91, 0x6ad1, 0x6b11,
+ /* b8 */ 0x6b51, 0x6b91, 0x6bd1, 0x6c11, 0x6c51, 0x6c91, 0x6cd1, 0x6d11,
+
+ /*** Three byte table, byte #2: ecxx - offset 0x004d3 ***/
+
+ /* 80 */ 0x6d51, 0x6d91, 0x6dd1, 0x6e11, 0x6e51, 0x6e91, 0x6ed1, 0x6f11,
+ /* 88 */ 0x6f51, 0x6f91, 0x6fd1, 0x7011, 0x7051, 0x7091, 0x70d1, 0x7111,
+ /* 90 */ 0x7151, 0x7191, 0x71d1, 0x7211, 0x7251, 0x7291, 0x72d1, 0x7311,
+ /* 98 */ 0x7351, 0x7391, 0x73d1, 0x7411, 0x7451, 0x7491, 0x74d1, 0x7511,
+ /* a0 */ 0x7551, 0x7591, 0x75d1, 0x7611, 0x7651, 0x7691, 0x76d1, 0x7711,
+ /* a8 */ 0x7751, 0x7791, 0x77d1, 0x7811, 0x7851, 0x7891, 0x78d1, 0x7911,
+ /* b0 */ 0x7951, 0x7991, 0x79d1, 0x7a11, 0x7a51, 0x7a91, 0x7ad1, 0x7b11,
+ /* b8 */ 0x7b51, 0x7b91, 0x7bd1, 0x7c11, 0x7c51, 0x7c91, 0x7cd1, 0x7d11,
+
+ /*** Three byte table, byte #2: edxx - offset 0x00513 ***/
+
+ /* 80 */ 0x7d51, 0x7d91, 0x7dd1, 0x7e11, 0x7e51, 0x7e91, 0x7ed1, 0x7f11,
+ /* 88 */ 0x7f51, 0x7f91, 0x7fd1, 0x8011, 0x8051, 0x8091, 0x80d1, 0x8111,
+ /* 90 */ 0x8151, 0x8191, 0x81d1, 0x8211, 0x8251, 0x8291, 0x82d1, 0x8311,
+ /* 98 */ 0x8351, 0x8391, 0x83d1, 0x8411, 0x8451, 0x8491, 0x84d1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #2: eexx - offset 0x00553 ***/
+
+ /* 80 */ 0x8511, 0x8551, 0x8591, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, byte #2: efxx - offset 0x0056f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x85d1, 0x8611, 0x8651, 0x8691,
+ /* a8 */ 0x86d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x8710, 0x8750, 0x0000, 0x8790,
+
+ /*** Three byte table, leaf: e280xx - offset 0x005af ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1aa, 0x0000, 0x0000,
+ /* 98 */ 0xa1ae, 0xa1af, 0x0000, 0x0000, 0xa1b0, 0xa1b1, 0x0000, 0x0000,
+ /* a0 */ 0xa2d3, 0xa2d4, 0x0000, 0x0000, 0x0000, 0xa1a5, 0xa1a6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa2b6, 0x0000, 0xa1c7, 0xa1c8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xa1d8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e281xx - offset 0x005eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9f9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9fa,
+
+ /*** Three byte table, leaf: e282xx - offset 0x0062b ***/
+
+ /* 80 */ 0x0000, 0xa9fb, 0xa9fc, 0xa9fd, 0xa9fe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e284xx - offset 0x00668 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xa1c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xa2b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa7a4, 0x0000, 0x0000, 0xa2e0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xa2e5, 0xa2e2, 0x0000, 0x0000, 0x0000, 0xa7d9, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xa1ca, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e285xx - offset 0x00695 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xa8f7, 0xa8f8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xa8fb, 0xa8fc, 0xa8fd, 0xa8fe, 0x0000,
+ /* a0 */ 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7,
+ /* a8 */ 0xa5b8, 0xa5b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7, 0xa5a8,
+ /* b8 */ 0xa5a9, 0xa5aa,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e286xx - offset 0x006cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa1e7, 0xa1e8, 0xa1e6, 0xa1e9, 0xa1ea, 0xa2d5, 0xa2d8, 0xa2d6,
+ /* 98 */ 0xa2d9, 0xa2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e287xx - offset 0x006fd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa2a1, 0x0000, 0xa2a2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e288xx - offset 0x0073d ***/
+
+ /* 80 */ 0xa2a3, 0x0000, 0xa1d3, 0xa2a4, 0x0000, 0x0000, 0x0000, 0xa1d4,
+ /* 88 */ 0xa1f4, 0x0000, 0x0000, 0xa1f5, 0x0000, 0x0000, 0x0000, 0xa2b3,
+ /* 90 */ 0x0000, 0xa2b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xa1ee, 0x0000, 0x0000, 0xa1f0, 0xa1c4, 0x0000,
+ /* a0 */ 0xa1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ab, 0x0000, 0xa1fc,
+ /* a8 */ 0xa1fd, 0xa1fb, 0xa1fa, 0xa1f2, 0xa1f3, 0x0000, 0xa2b1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c5, 0xa1f1, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ad, 0xa1ef,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e289xx - offset 0x0077b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1c1, 0xa1d5, 0x0000, 0x0000, 0xa1c2, 0xa1c3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xa1ec, 0xa1ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28axx - offset 0x007b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xa1f8, 0xa1f9, 0x0000, 0x0000, 0xa1f6, 0xa1f7,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xa2c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e28cxx - offset 0x007e7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa1d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e291xx - offset 0x00807 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8e7, 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, 0xa8ed, 0xa8ee,
+ /* a8 */ 0xa8ef, 0xa8f0, 0xa8f1, 0xa8f2, 0xa8f3, 0xa8f4, 0xa8f5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9e7, 0xa9e8, 0xa9e9, 0xa9ea,
+ /* b8 */ 0xa9eb, 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0xa9f0, 0xa9f1, 0xa9f2,
+
+ /*** Three byte table, leaf: e292xx - offset 0x00847 ***/
+
+ /* 80 */ 0xa9f3, 0xa9f4, 0xa9f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0,
+ /* a0 */ 0xa9d1, 0xa9d2, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8,
+ /* a8 */ 0xa9d9, 0xa9da, 0xa9db, 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0,
+ /* b0 */ 0xa9e1, 0xa9e2, 0xa9e3, 0xa9e4, 0xa9e5, 0xa9e6,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e293xx - offset 0x0087d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xa8cd, 0xa8ce, 0xa8cf, 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4,
+ /* 98 */ 0xa8d5, 0xa8d6, 0xa8d7, 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc,
+ /* a0 */ 0xa8dd, 0xa8de, 0xa8df, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4,
+ /* a8 */ 0xa8e5, 0xa8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x008bd ***/
+
+ /* 80 */ 0xa6a1, 0xa6ac, 0xa6a2, 0xa6ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa6a3, 0xa6c8, 0xa6c7, 0xa6ae,
+ /* 90 */ 0xa6a4, 0xa6c2, 0xa6c1, 0xa6af, 0xa6a6, 0xa6c6, 0xa6c5, 0xa6b1,
+ /* 98 */ 0xa6a5, 0xa6c4, 0xa6c3, 0xa6b0, 0xa6a7, 0xa6bc, 0xa6c9, 0xa6ca,
+ /* a0 */ 0xa6b7, 0xa6cb, 0xa6cc, 0xa6b2, 0xa6a9, 0xa6be, 0xa6cd, 0xa6ce,
+ /* a8 */ 0xa6b9, 0xa6cf, 0xa6d0, 0xa6b4, 0xa6a8, 0xa6d1, 0xa6d2, 0xa6b8,
+ /* b0 */ 0xa6bd, 0xa6d3, 0xa6d4, 0xa6b3, 0xa6aa, 0xa6d5, 0xa6d6, 0xa6ba,
+ /* b8 */ 0xa6bf, 0xa6d7, 0xa6d8, 0xa6b5, 0xa6ab, 0xa6d9, 0xa6da, 0xa6bb,
+
+ /*** Three byte table, leaf: e295xx - offset 0x008fd ***/
+
+ /* 80 */ 0xa6db, 0xa6dc, 0xa6c0, 0xa6dd, 0xa6de, 0xa6df, 0xa6e0, 0xa6e1,
+ /* 88 */ 0xa6e2, 0xa6e3, 0xa6e4, 0xa6b6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e296xx - offset 0x0092b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xa2c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1e1, 0xa1e0, 0x0000, 0xa2c3, 0xa2c7, 0xa2c8, 0xa2cb, 0xa2ca,
+ /* a8 */ 0xa2c9, 0xa2cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xa1e3, 0xa1e2, 0x0000, 0x0000, 0xa2ba, 0xa2b9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa1e5, 0xa1e4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e297xx - offset 0x0096b ***/
+
+ /* 80 */ 0xa2b8, 0xa2b7, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1df, 0xa1de,
+ /* 88 */ 0xa2c2, 0x0000, 0x0000, 0xa1db, 0x0000, 0x0000, 0xa1dd, 0xa1dc,
+ /* 90 */ 0xa2c4, 0xa2c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e298xx - offset 0x009a6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1da, 0xa1d9, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2cf, 0xa2ce,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xa2d0, 0x0000, 0xa2d1, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e299xx - offset 0x009e6 ***/
+
+ /* 80 */ 0xa1cf, 0x0000, 0xa1ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa2bc, 0xa2bd, 0x0000, 0xa2c0, 0xa2bb, 0xa2be, 0x0000, 0xa2bf,
+ /* a8 */ 0xa2cd, 0xa2db, 0xa2dc, 0x0000, 0xa2dd, 0xa2da, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e380xx - offset 0x00a26 ***/
+
+ /* 80 */ 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
+ /* 90 */ 0xa1bc, 0xa1bd, 0x0000, 0xa1eb, 0xa1b2, 0xa1b3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e381xx - offset 0x00a65 ***/
+
+ /* 80 */ 0x0000, 0xaaa1, 0xaaa2, 0xaaa3, 0xaaa4, 0xaaa5, 0xaaa6, 0xaaa7,
+ /* 88 */ 0xaaa8, 0xaaa9, 0xaaaa, 0xaaab, 0xaaac, 0xaaad, 0xaaae, 0xaaaf,
+ /* 90 */ 0xaab0, 0xaab1, 0xaab2, 0xaab3, 0xaab4, 0xaab5, 0xaab6, 0xaab7,
+ /* 98 */ 0xaab8, 0xaab9, 0xaaba, 0xaabb, 0xaabc, 0xaabd, 0xaabe, 0xaabf,
+ /* a0 */ 0xaac0, 0xaac1, 0xaac2, 0xaac3, 0xaac4, 0xaac5, 0xaac6, 0xaac7,
+ /* a8 */ 0xaac8, 0xaac9, 0xaaca, 0xaacb, 0xaacc, 0xaacd, 0xaace, 0xaacf,
+ /* b0 */ 0xaad0, 0xaad1, 0xaad2, 0xaad3, 0xaad4, 0xaad5, 0xaad6, 0xaad7,
+ /* b8 */ 0xaad8, 0xaad9, 0xaada, 0xaadb, 0xaadc, 0xaadd, 0xaade, 0xaadf,
+
+ /*** Three byte table, leaf: e382xx - offset 0x00aa5 ***/
+
+ /* 80 */ 0xaae0, 0xaae1, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7,
+ /* 88 */ 0xaae8, 0xaae9, 0xaaea, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef,
+ /* 90 */ 0xaaf0, 0xaaf1, 0xaaf2, 0xaaf3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xaba1, 0xaba2, 0xaba3, 0xaba4, 0xaba5, 0xaba6, 0xaba7,
+ /* a8 */ 0xaba8, 0xaba9, 0xabaa, 0xabab, 0xabac, 0xabad, 0xabae, 0xabaf,
+ /* b0 */ 0xabb0, 0xabb1, 0xabb2, 0xabb3, 0xabb4, 0xabb5, 0xabb6, 0xabb7,
+ /* b8 */ 0xabb8, 0xabb9, 0xabba, 0xabbb, 0xabbc, 0xabbd, 0xabbe, 0xabbf,
+
+ /*** Three byte table, leaf: e383xx - offset 0x00ae5 ***/
+
+ /* 80 */ 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc4, 0xabc5, 0xabc6, 0xabc7,
+ /* 88 */ 0xabc8, 0xabc9, 0xabca, 0xabcb, 0xabcc, 0xabcd, 0xabce, 0xabcf,
+ /* 90 */ 0xabd0, 0xabd1, 0xabd2, 0xabd3, 0xabd4, 0xabd5, 0xabd6, 0xabd7,
+ /* 98 */ 0xabd8, 0xabd9, 0xabda, 0xabdb, 0xabdc, 0xabdd, 0xabde, 0xabdf,
+ /* a0 */ 0xabe0, 0xabe1, 0xabe2, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7,
+ /* a8 */ 0xabe8, 0xabe9, 0xabea, 0xabeb, 0xabec, 0xabed, 0xabee, 0xabef,
+ /* b0 */ 0xabf0, 0xabf1, 0xabf2, 0xabf3, 0xabf4, 0xabf5, 0xabf6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e384xx - offset 0x00b1c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7,
+ /* b8 */ 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af,
+
+ /*** Three byte table, leaf: e385xx - offset 0x00b5c ***/
+
+ /* 80 */ 0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7,
+ /* 88 */ 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf,
+ /* 90 */ 0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7,
+ /* 98 */ 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf,
+ /* a0 */ 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7,
+ /* a8 */ 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df,
+ /* b0 */ 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7,
+ /* b8 */ 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef,
+
+ /*** Three byte table, leaf: e386xx - offset 0x00b9c ***/
+
+ /* 80 */ 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0xa4f4, 0xa4f5, 0xa4f6, 0xa4f7,
+ /* 88 */ 0xa4f8, 0xa4f9, 0xa4fa, 0xa4fb, 0xa4fc, 0xa4fd, 0xa4fe, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e388xx - offset 0x00bdc ***/
+
+ /* 80 */ 0xa9b1, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8,
+ /* 88 */ 0xa9b9, 0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0,
+ /* 90 */ 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8,
+ /* 98 */ 0xa9c9, 0xa9ca, 0xa9cb, 0xa9cc, 0xa2df, 0x0000, 0x0000, 0x0000,
+ /* 32 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e389xx - offset 0x00bfc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa8b1, 0xa8b2, 0xa8b3, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8,
+ /* a8 */ 0xa8b9, 0xa8ba, 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, 0xa8c0,
+ /* b0 */ 0xa8c1, 0xa8c2, 0xa8c3, 0xa8c4, 0xa8c5, 0xa8c6, 0xa8c7, 0xa8c8,
+ /* b8 */ 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0x0000, 0x0000, 0xa2e8, 0xa2de,
+
+ /*** Three byte table, leaf: e38exx - offset 0x00c3c ***/
+
+ /* 80 */ 0xa7c9, 0xa7ca, 0xa7cb, 0xa7cc, 0xa7cd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xa7ba, 0xa7bb, 0xa7dc, 0xa7dd, 0xa7de, 0xa7b6, 0xa7b7, 0xa7b8,
+ /* 90 */ 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d7, 0xa7d8, 0xa7a1, 0xa7a2, 0xa7a3,
+ /* 98 */ 0xa7a5, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1,
+ /* a0 */ 0xa7b2, 0xa7b3, 0xa7b4, 0xa7a7, 0xa7a8, 0xa7a9, 0xa7aa, 0xa7bd,
+ /* a8 */ 0xa7be, 0xa7e5, 0xa7e6, 0xa7e7, 0xa7e8, 0xa7e1, 0xa7e2, 0xa7e3,
+ /* b0 */ 0xa7bf, 0xa7c0, 0xa7c1, 0xa7c2, 0xa7c3, 0xa7c4, 0xa7c5, 0xa7c6,
+ /* b8 */ 0xa7c7, 0xa7c8, 0xa7ce, 0xa7cf, 0xa7d0, 0xa7d1, 0xa7d2, 0xa7d3,
+
+ /*** Three byte table, leaf: e38fxx - offset 0x00c7c ***/
+
+ /* 80 */ 0xa7da, 0xa7db, 0xa2e3, 0xa7ec, 0xa7a6, 0xa7e0, 0xa7ef, 0xa2e1,
+ /* 88 */ 0xa7bc, 0xa7ed, 0xa7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7b9,
+ /* 90 */ 0xa7ea, 0x0000, 0x0000, 0xa7eb, 0x0000, 0x0000, 0xa7df, 0x0000,
+ /* 98 */ 0xa2e4, 0x0000, 0x0000, 0xa7e4, 0xa7ee, 0xa7e9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4b8xx - offset 0x00cbc ***/
+
+ /* 80 */ 0xece9, 0xefcb, 0x0000, 0xf6d2, 0x0000, 0x0000, 0x0000, 0xd8b2,
+ /* 88 */ 0xeddb, 0xdfb2, 0xdfbe, 0xf9bb, 0x0000, 0xdcf4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5e4, 0x0000, 0x0000, 0xf3a6, 0xdde0, 0xe1a6, 0x0000,
+ /* 98 */ 0xcef8, 0xdcb0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3aa, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcdfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfcaf, 0xd3a1, 0x0000, 0xf1ab, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4b9xx - offset 0x00cfa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7d1, 0xd2ac, 0x0000, 0xcef9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf1fd, 0x0000, 0xdebf, 0xfbba, 0xf9b9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xced2, 0x0000,
+ /* 98 */ 0xe3ab, 0xebe0, 0x0000, 0x0000, 0x0000, 0xcefa, 0xcbf7, 0xe5a5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcae1, 0x0000, 0xd4cc, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xeae1, 0x0000, 0x0000, 0xdce3, 0xdfad,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbeb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4baxx - offset 0x00d39 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5af, 0x0000, 0x0000, 0x0000, 0xd6f5, 0x0000,
+ /* 88 */ 0xe5f8, 0x0000, 0x0000, 0xdec0, 0xeca3, 0x0000, 0xe9cd, 0x0000,
+ /* 90 */ 0xeaa7, 0xe9f6, 0xfbbb, 0x0000, 0xe7e9, 0xefcc, 0x0000, 0x0000,
+ /* 98 */ 0xd0e6, 0x0000, 0x0000, 0xdec1, 0x0000, 0x0000, 0xe4ac, 0x0000,
+ /* a0 */ 0x0000, 0xd8cc, 0xf9f1, 0x0000, 0xcedf, 0xfaa4, 0xe6b2, 0x0000,
+ /* a8 */ 0xfafb, 0x0000, 0x0000, 0xfabd, 0xccc8, 0xefcd, 0xd5d5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xecd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e4bbxx - offset 0x00d79 ***/
+
+ /* 80 */ 0xe4a7, 0xecd2, 0x0000, 0x0000, 0xf6b1, 0x0000, 0x0000, 0xcefb,
+ /* 88 */ 0x0000, 0x0000, 0xd0d1, 0xcbbf, 0x0000, 0xeda4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeda8, 0xdec2, 0xf6e2, 0xeddc,
+ /* 98 */ 0xdcf5, 0xe0b9, 0x0000, 0x0000, 0x0000, 0xd4ce, 0x0000, 0xf4b5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd3db, 0xd6b5, 0xeca4, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe4e6, 0x0000, 0xf1ea, 0x0000, 0x0000, 0x0000, 0xcbec, 0xcbc0,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xecf2, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bcxx - offset 0x00db8 ***/
+
+ /* 80 */ 0x0000, 0xd0ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf9f2, 0xeca5, 0xd0df, 0x0000, 0xe7ea, 0xd0eb, 0xdcd1,
+ /* 90 */ 0xdbe9, 0xfdcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbd7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdae1, 0x0000, 0xd6b6, 0x0000,
+ /* b8 */ 0xe3df, 0x0000, 0xdec3, 0x0000, 0xdec4, 0xcaa1,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e4bdxx - offset 0x00df6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xeeec, 0x0000, 0x0000, 0xd3a3, 0xeeb7,
+ /* 88 */ 0xf8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac8, 0xeeb8, 0xf1ac,
+ /* 90 */ 0xf1a5, 0xe9ce, 0x0000, 0x0000, 0x0000, 0xf9bc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe5f9, 0xecea, 0xddd6, 0xedc2, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ba,
+ /* b0 */ 0xdbd8, 0x0000, 0x0000, 0xcaa2, 0x0000, 0x0000, 0xd1cd, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xeeed, 0x0000, 0x0000, 0x0000, 0xeceb, 0xdec5,
+
+ /*** Three byte table, leaf: e4bexx - offset 0x00e36 ***/
+
+ /* 80 */ 0x0000, 0xe3e0, 0x0000, 0xcac9, 0xf2e9, 0x0000, 0xd5ce, 0x0000,
+ /* 88 */ 0xf6b6, 0x0000, 0xcec2, 0xd6c7, 0x0000, 0xe3b4, 0x0000, 0xf1ad,
+ /* 90 */ 0x0000, 0xeae2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7c2, 0x0000,
+ /* 98 */ 0xf3a7, 0x0000, 0x0000, 0xcdea, 0x0000, 0xebee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9b2, 0xfda5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d5, 0xd5e2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b5,
+
+ /*** Three byte table, leaf: e4bfxx - offset 0x00e76 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xccf5, 0xf5b5, 0xe4ad, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe7eb, 0xf1d5, 0x0000, 0x0000, 0x0000, 0xf0bb, 0x0000,
+ /* 90 */ 0x0000, 0xe9b5, 0x0000, 0xccc9, 0xfad5, 0x0000, 0x0000, 0xe1d4,
+ /* 98 */ 0x0000, 0x0000, 0xd7d6, 0x0000, 0x0000, 0xdcc1, 0x0000, 0xdec6,
+ /* a0 */ 0xfaef, 0xe3e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f3, 0xdcf6,
+ /* b0 */ 0x0000, 0xcefc, 0x0000, 0xdbc4, 0x0000, 0xf8f1, 0x0000, 0x0000,
+ /* b8 */ 0xdce4, 0x0000, 0xe5ef, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e580xx - offset 0x00eb4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdcb1, 0x0000, 0x0000, 0x0000, 0xd5d6, 0x0000,
+ /* 88 */ 0x0000, 0xf3da, 0x0000, 0xcbc1, 0x0000, 0xdbc3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9fa, 0xd3ee, 0x0000, 0x0000, 0x0000, 0xfab8, 0x0000,
+ /* 98 */ 0x0000, 0xfda6, 0xebef, 0x0000, 0xf4a6, 0x0000, 0xccca, 0xf3a8,
+ /* a0 */ 0x0000, 0xf3db, 0x0000, 0xdba7, 0xf6b7, 0x0000, 0xcfe6, 0xf0f2,
+ /* a8 */ 0xcbda, 0x0000, 0xe7d2, 0xd7c3, 0xf6f0, 0xe8de, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe5a6, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e581xx - offset 0x00ef1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe5e7, 0x0000, 0x0000, 0x0000, 0xcaa3,
+ /* 88 */ 0xcca7, 0xeac9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8b6,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaa5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1ae, 0x0000, 0xefce, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbed, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6b0, 0xefcf, 0xe9cf, 0x0000,
+ /* b8 */ 0xf7de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e582xx - offset 0x00f31 ***/
+
+ /* 80 */ 0xced3, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcf7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdba8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcbf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xdfa1, 0xdde1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ca, 0xe9b6, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe7ec, 0xeeee, 0x0000, 0xf3f0, 0x0000, 0xdfbf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcccb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e583xx - offset 0x00f70 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf4d2, 0xe0ba, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfc0,
+ /* 90 */ 0x0000, 0xcee0, 0x0000, 0x0000, 0x0000, 0xdcd2, 0xfdea, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6f6, 0x0000, 0x0000, 0x0000, 0xeaca, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e9, 0x0000, 0xe3ac,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3d0, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xcaa4, 0x0000, 0xdbf8, 0x0000, 0x0000, 0x0000, 0xdec7,
+
+ /*** Three byte table, leaf: e584xx - offset 0x00fb0 ***/
+
+ /* 80 */ 0xebf0, 0xf1d6, 0x0000, 0x0000, 0xe5e2, 0x0000, 0xcccc, 0x0000,
+ /* 88 */ 0x0000, 0xcbfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeae3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfc1,
+ /* a0 */ 0x0000, 0xd6ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe9d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xeeb9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e3,
+ /* b8 */ 0x0000, 0x0000, 0xd1d3, 0x0000, 0xe5f0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e585xx - offset 0x00ff0 ***/
+
+ /* 80 */ 0xe8b4, 0xebc3, 0x0000, 0xeaaa, 0xfafc, 0xf5f6, 0xf0bc, 0xfdd4,
+ /* 88 */ 0xe0bb, 0xcec3, 0x0000, 0xd0ba, 0xf7ba, 0xd8f3, 0xf7cd, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe4ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4df, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd0e7, 0x0000, 0x0000, 0xecfd, 0x0000, 0xd2ae,
+ /* a8 */ 0xeeef, 0xd5d7, 0xeae4, 0xf8a2, 0xcdeb, 0xd7bf, 0xfbb1, 0x0000,
+ /* b0 */ 0x0000, 0xcdec, 0x0000, 0x0000, 0x0000, 0xdcb2, 0xd0ec, 0xcefd,
+ /* b8 */ 0xeef0, 0x0000, 0x0000, 0x0000, 0xccc2, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e586xx - offset 0x01030 ***/
+
+ /* 80 */ 0xd0ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3fc, 0x0000, 0x0000, 0xeea2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd9b3, 0x0000, 0x0000, 0xd8f4, 0x0000, 0xe9b7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xceae, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a2, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd8f1, 0x0000, 0xd4cf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a7, 0xd5d2,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a9,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e587xx - offset 0x0106e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a2, 0x0000, 0xf1d7, 0x0000,
+ /* 88 */ 0x0000, 0xd5d8, 0x0000, 0xf0bd, 0xd7d0, 0xd4d0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7cf, 0xebea, 0xfdeb, 0x0000,
+ /* a0 */ 0x0000, 0xdbed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcc5, 0xcbc2, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd5, 0x0000,
+ /* b8 */ 0xf4c8, 0xe8ea, 0xf5f3, 0x0000, 0x0000, 0xf9de, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e588xx - offset 0x010ae ***/
+
+ /* 80 */ 0xd3ef, 0x0000, 0x0000, 0xecd3, 0x0000, 0x0000, 0xddc2, 0xefb7,
+ /* 88 */ 0xe7d4, 0x0000, 0xcaca, 0x0000, 0x0000, 0x0000, 0xd9fb, 0x0000,
+ /* 90 */ 0x0000, 0xfafd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6aa,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f7, 0xdcac, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd7d7, 0xdfa2, 0x0000, 0x0000, 0x0000, 0xcebe, 0x0000,
+ /* b0 */ 0xd3f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a4, 0xe1ec,
+ /* b8 */ 0xcfe7, 0xf3cb, 0xeda9, 0xcabe, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e589xx - offset 0x010eb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf4ef, 0x0000, 0x0000, 0x0000, 0xf6ce,
+ /* 88 */ 0x0000, 0x0000, 0xdefb, 0xd0bb, 0xd5b7, 0xeef1, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4a8, 0x0000, 0xdcf8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcba7, 0x0000, 0xdace, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe0e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeda5, 0xeef2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcf9,
+ /* b0 */ 0x0000, 0x0000, 0xf9dc, 0x0000, 0x0000, 0xf3dc, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8f2, 0x0000, 0xf4f9,
+
+ /*** Three byte table, leaf: e58axx - offset 0x0112b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfcf1, 0x0000, 0x0000, 0x0000, 0xd0bc,
+ /* 88 */ 0xdbf9, 0xd7b1, 0x0000, 0x0000, 0x0000, 0xcbfc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf0a5, 0xcbfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5f4, 0x0000, 0x0000, 0x0000, 0xcded,
+ /* a0 */ 0xcaa5, 0x0000, 0x0000, 0xd6ab, 0xd0c2, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf0be, 0xd2bd, 0xcca4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfab6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58bxx - offset 0x0116a ***/
+
+ /* 80 */ 0x0000, 0xcccd, 0x0000, 0xdafa, 0x0000, 0xf6cf, 0x0000, 0xe9b8,
+ /* 88 */ 0x0000, 0xd8f5, 0x0000, 0x0000, 0x0000, 0xccce, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd7cd, 0x0000, 0x0000, 0xd4d1, 0xe9ed, 0x0000,
+ /* 98 */ 0xcaeb, 0xd9e2, 0x0000, 0xfdb2, 0x0000, 0xe3ad, 0xd6cc, 0xd9b4,
+ /* a0 */ 0x0000, 0x0000, 0xe1a7, 0xeed3, 0xd0c3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfdb3, 0x0000, 0xd5e4, 0x0000, 0x0000,
+ /* b8 */ 0xcfe8, 0x0000, 0xedc3, 0xd0b2, 0x0000, 0x0000, 0xcefe, 0xdaa8,
+
+ /*** Three byte table, leaf: e58cxx - offset 0x011aa ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d0, 0x0000, 0x0000,
+ /* 88 */ 0xfdd6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d1, 0x0000, 0xf8d2,
+ /* 90 */ 0xdcd3, 0x0000, 0x0000, 0x0000, 0x0000, 0xdde2, 0xfbf9, 0xddc1,
+ /* 98 */ 0x0000, 0xe3b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeddd, 0xcec4, 0x0000, 0xcba1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdde3, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcdd,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2fb,
+
+ /*** Three byte table, leaf: e58dxx - offset 0x011ea ***/
+
+ /* 80 */ 0xcfa1, 0xe4a8, 0x0000, 0xf4b6, 0xecfe, 0x0000, 0x0000, 0xe3ae,
+ /* 88 */ 0xe7ed, 0xfdc1, 0xdae2, 0x0000, 0x0000, 0xd8b3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdde4, 0xf0ef, 0xf6f1, 0xfaf0, 0x0000, 0x0000, 0xd1f5,
+ /* 98 */ 0x0000, 0x0000, 0xdacf, 0x0000, 0xdcd4, 0x0000, 0xdca6, 0x0000,
+ /* a0 */ 0xefbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcecf, 0x0000,
+ /* a8 */ 0xe0d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d6,
+ /* b0 */ 0xecd4, 0xeacb, 0x0000, 0x0000, 0xcabf, 0xd5b0, 0x0000, 0xcfe9,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ed, 0x0000, 0xcccf,
+
+ /*** Three byte table, leaf: e58exx - offset 0x0122a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe4ed, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd7d8, 0x0000, 0xfda7, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaab,
+ /* a0 */ 0xf6b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff0, 0xf9bd, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6f4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xcbdb, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e58fxx - offset 0x01267 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf3d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe9d1, 0xf3a9, 0xd0e0, 0xe9d2, 0x0000, 0xdae3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d2, 0x0000, 0xf6a2, 0xe1f4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdae4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe7d5, 0xf5bf, 0xcfa2, 0xcdaf, 0xcfa3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcdb0, 0xf1fe, 0xd0a3, 0xe1af, 0xf8a3, 0x0000, 0xcaa6,
+ /* b0 */ 0xf7bb, 0xf2ea, 0xdec8, 0xe9d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdec9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e590xx - offset 0x012a4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfdde, 0xcac0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9ea, 0xd1ce, 0xeed4, 0x0000, 0xd4d2, 0xd9a3, 0xfda8, 0xd7d9,
+ /* 90 */ 0xf7ce, 0xfabe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcfd6, 0x0000, 0xd7f0, 0x0000, 0xebe1,
+ /* a0 */ 0xf8c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcfa, 0x0000,
+ /* a8 */ 0x0000, 0xddc3, 0x0000, 0xf9df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe7ef, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfde5, 0xf6a3, 0x0000, 0xd9fc, 0xfda9, 0x0000, 0xe7ee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e591xx - offset 0x012e3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xefd0, 0x0000, 0xcdb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf1b2, 0x0000, 0xf1b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcdb2, 0x0000, 0xdaab, 0x0000, 0xcaa7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe3e2, 0xfbbc, 0xd9a4, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e592xx - offset 0x01323 ***/
+
+ /* 80 */ 0xeeba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8d3, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfa, 0x0000, 0xcfa4, 0x0000,
+ /* 90 */ 0xdcfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e3, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xedaa, 0x0000, 0x0000, 0xf2a1, 0xcee1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xfaa6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf9e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xecd6, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e593xx - offset 0x01363 ***/
+
+ /* 80 */ 0xe4ee, 0xf9a1, 0x0000, 0x0000, 0xfbef, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9eb, 0xeea3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeaac, 0x0000, 0x0000, 0x0000, 0xcaa8, 0x0000, 0x0000,
+ /* a8 */ 0xf4fa, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd6, 0xfcf6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf4c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf8d4, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e594xx - offset 0x0139f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8a6, 0x0000, 0xdeca, 0xf2c6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7da, 0x0000,
+ /* 90 */ 0xd3d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8c5, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeae6,
+ /* b0 */ 0x0000, 0xf3dd, 0x0000, 0x0000, 0x0000, 0xe4da, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e4,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e595xx - offset 0x013de ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f2, 0x0000, 0xdfc2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9fd,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xccf6, 0x0000, 0x0000, 0xd3ba, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4af, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf9e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a6, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e596xx - offset 0x0141e ***/
+
+ /* 80 */ 0xcbd3, 0x0000, 0x0000, 0x0000, 0xe0bc, 0x0000, 0xf4ca, 0xd4fa,
+ /* 88 */ 0x0000, 0xfdaa, 0xf9e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf4b7, 0xfdc2, 0xfcb0, 0x0000, 0xfdec, 0xcae2, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdbd,
+ /* a8 */ 0x0000, 0xeae7, 0xdfc3, 0xd1d2, 0xcee2, 0x0000, 0xd3a4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e597xx - offset 0x01459 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdab, 0x0000, 0xdfe0,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe7f0, 0x0000, 0xd0ee, 0x0000, 0x0000, 0xf3aa,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdecb, 0xf6b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f5, 0xf1b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e598xx - offset 0x01498 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a3, 0x0000,
+ /* 88 */ 0x0000, 0xcaa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa5, 0x0000, 0x0000, 0xdfc4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b0,
+ /* b0 */ 0x0000, 0x0000, 0xf0bf, 0x0000, 0xf6a4, 0x0000, 0xe3b6,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e599xx - offset 0x014cf ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfac6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd0ef, 0x0000, 0x0000, 0xfded, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddc4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59axx - offset 0x01509 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcf7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6bf, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdead, 0x0000, 0xfabf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xedc4,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59bxx - offset 0x01546 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd2a5, 0x0000, 0x0000, 0xfdee, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf5b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe1f6, 0xdecc, 0x0000, 0x0000, 0xfcde, 0x0000,
+ /* a0 */ 0xecd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xcddd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd6b7, 0xcdb3, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59cxx - offset 0x01583 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf8d5, 0xe5d8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcfea, 0x0000, 0x0000, 0xcfd0, 0x0000, 0xeacc, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeaae, 0xeaad, 0x0000, 0x0000, 0xd3f1, 0x0000,
+ /* 98 */ 0xd3a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7cf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xeea4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a4, 0x0000, 0x0000,
+ /* b0 */ 0xf2a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd0f0, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e59dxx - offset 0x015c3 ***/
+
+ /* 80 */ 0xf2a3, 0x0000, 0xf7f8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b3,
+ /* 88 */ 0x0000, 0x0000, 0xdba9, 0x0000, 0x0000, 0xd3bb, 0xcaec, 0x0000,
+ /* 90 */ 0xf1a6, 0xcbd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf7e7, 0x0000, 0x0000, 0xcdde, 0x0000, 0xf7a4, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8c0, 0x0000, 0x0000, 0x0000, 0xd3dd, 0x0000,
+ /* b0 */ 0xccd0, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa6, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6f3, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59exx - offset 0x01601 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe1f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd3dc, 0x0000, 0x0000, 0xfafe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfaa7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xebd9, 0x0000, 0xcfa7, 0xeaaf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e59fxx - offset 0x0163e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4ef, 0x0000, 0x0000, 0x0000, 0xe9b9,
+ /* 88 */ 0xf1d8, 0x0000, 0x0000, 0xd8d8, 0x0000, 0x0000, 0xe0f2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6b4,
+ /* a0 */ 0xdcfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf3f1, 0x0000, 0x0000, 0x0000, 0xe3d0, 0x0000, 0x0000, 0xf2fb,
+ /* b8 */ 0x0000, 0xdbc6, 0xd0f1, 0x0000, 0xd0f2, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5a0xx - offset 0x0167e ***/
+
+ /* 80 */ 0xcfdc, 0x0000, 0xd3d1, 0x0000, 0x0000, 0xccb1, 0xf7d8, 0x0000,
+ /* 88 */ 0xcba8, 0xebbc, 0xe4be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4dc, 0x0000,
+ /* a0 */ 0x0000, 0xdcc2, 0x0000, 0x0000, 0xf0a7, 0x0000, 0x0000, 0xe6c0,
+ /* a8 */ 0x0000, 0x0000, 0xcaed, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8eb,
+ /* b0 */ 0xe5e8, 0xdcc3, 0x0000, 0x0000, 0xedde, 0xd3f2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xccf7,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a1xx - offset 0x016b9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xced4, 0xe7ab, 0x0000, 0x0000, 0x0000, 0xcbc3,
+ /* 90 */ 0x0000, 0xe1b1, 0x0000, 0x0000, 0xf7b2, 0x0000, 0x0000, 0xd3f3,
+ /* 98 */ 0xd3d2, 0x0000, 0xf5c0, 0x0000, 0x0000, 0x0000, 0xdfdd, 0x0000,
+ /* a0 */ 0x0000, 0xeef3, 0xe7f1, 0x0000, 0xfdb4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2c8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf3d2, 0x0000, 0x0000, 0xeef4, 0x0000, 0xe2d3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a2xx - offset 0x016f8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xccd1, 0x0000, 0xdfea, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe9ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd9d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5cd, 0x0000, 0xf1f2, 0xfac7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd9f8, 0xd4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xddc5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe7f2, 0xeddf, 0x0000, 0x0000, 0xcacb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a3xx - offset 0x01737 ***/
+
+ /* 80 */ 0x0000, 0xdbfa, 0x0000, 0x0000, 0x0000, 0xe8b5, 0x0000, 0xd3a6,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb5, 0x0000,
+ /* 90 */ 0x0000, 0xf9c9, 0x0000, 0xe4e2, 0x0000, 0xfbbd, 0x0000, 0x0000,
+ /* 98 */ 0xd7a4, 0xcec5, 0x0000, 0x0000, 0x0000, 0x0000, 0xced5, 0xd6e6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5bd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xdecd, 0xecf3, 0x0000, 0x0000, 0xede0,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xecec, 0xfbbe, 0xdfeb, 0x0000, 0xe1f8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a4xx - offset 0x01775 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9be,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0f3, 0xe0aa, 0xe8e2, 0x0000,
+ /* 98 */ 0x0000, 0xe2d4, 0xd2fd, 0x0000, 0xe5a8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd9d3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3de,
+ /* a8 */ 0x0000, 0xf4b8, 0xf7bc, 0xdcfd, 0x0000, 0xe8ec, 0xe4e7, 0x0000,
+ /* b0 */ 0x0000, 0xe3f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeca8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfaf1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a5xx - offset 0x017b4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5f2, 0x0000, 0x0000, 0xd0f4,
+ /* 88 */ 0xd2af, 0xdce5, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a5, 0xf1b4,
+ /* 90 */ 0xfcb1, 0xccf8, 0x0000, 0x0000, 0xddc6, 0xfad1, 0x0000, 0xf7df,
+ /* 98 */ 0x0000, 0x0000, 0xfaa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xeef5, 0x0000, 0xdece, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f3,
+ /* a8 */ 0x0000, 0x0000, 0xf7ac, 0xebc4, 0xede1, 0xe0ab, 0xddc7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd2b3, 0xd2bf, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcacc, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbbf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a6xx - offset 0x017f2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe5fd, 0xdde5, 0xd8cd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xecf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd0f5, 0x0000, 0x0000, 0xe8ed, 0xd0d2,
+ /* 98 */ 0x0000, 0xd9d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6e6, 0x0000, 0x0000,
+ /* a8 */ 0xdbaa, 0x0000, 0x0000, 0x0000, 0xf7e0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd8d9, 0x0000, 0xf4a3, 0x0000, 0x0000, 0xf4dd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a7xx - offset 0x01831 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xefd1, 0x0000, 0x0000, 0xd9b5, 0x0000,
+ /* 88 */ 0x0000, 0xedab, 0x0000, 0xe3b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeebb, 0xcdb4, 0x0000, 0xe0f3, 0xeacd, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xecf5, 0xe8ee, 0x0000, 0xcba9, 0xf1af, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcacd, 0x0000,
+ /* a8 */ 0xeca9, 0x0000, 0xf2eb, 0x0000, 0xfdef, 0x0000, 0xf9f3, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe6c1, 0x0000, 0x0000, 0xecd8, 0x0000, 0x0000, 0x0000, 0xedac,
+
+ /*** Three byte table, leaf: e5a8xx - offset 0x01871 ***/
+
+ /* 80 */ 0x0000, 0xeace, 0x0000, 0xe8df, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdecf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd2a6, 0x0000, 0x0000, 0xe7f4, 0xd1d6, 0x0000, 0x0000, 0xe6c2,
+ /* a0 */ 0xe3e3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4b0, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd8b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6a5, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3de, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5a9xx - offset 0x018b0 ***/
+
+ /* 80 */ 0x0000, 0xd7a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e8, 0x0000,
+ /* 88 */ 0x0000, 0xe8c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfbe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdde6, 0x0000, 0x0000, 0x0000, 0xdcfe, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aaxx - offset 0x018de ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdaac, 0xeab0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5abxx - offset 0x0191d ***/
+
+ /* 80 */ 0x0000, 0xcaaa, 0xe1f9, 0x0000, 0xeab1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2ec, 0x0000, 0x0000, 0xfaee, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeed5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f4, 0x0000,
+ /* a8 */ 0x0000, 0xd2ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5acxx - offset 0x01958 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfb, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfdf0, 0x0000, 0xe0bd, 0xcee3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8c6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdeae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e5adxx - offset 0x01998 ***/
+
+ /* 80 */ 0xdfc5, 0x0000, 0x0000, 0xe5be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xedad, 0xfaea, 0x0000, 0x0000, 0xcdee, 0xeda6, 0x0000, 0xedae,
+ /* 98 */ 0xf0ed, 0x0000, 0xdda1, 0x0000, 0xedaf, 0xfcf8, 0x0000, 0xd8eb,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xccf9, 0xcdb5, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfaa9, 0x0000, 0xe1dd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe2d5, 0xedcf, 0x0000, 0x0000, 0x0000, 0xdda2, 0x0000, 0x0000,
+ /* b8 */ 0xf9ca, 0x0000, 0xeae8, 0x0000, 0xe5ed,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5aexx - offset 0x019d5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3eb, 0x0000, 0xe9d4,
+ /* 88 */ 0xe1fa, 0xe4cc, 0x0000, 0xe1e4, 0xe8c7, 0x0000, 0x0000, 0xcedb,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xdcd5, 0x0000, 0xf7b5, 0xfcf3, 0xf0f3,
+ /* 98 */ 0xceaf, 0xf1b5, 0xefd2, 0xe8c8, 0xebf1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcbd4, 0xe0be, 0xe3f8, 0xeae9, 0xfcb2, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0f4, 0x0000, 0xcfe0, 0x0000,
+ /* b0 */ 0xeea5, 0x0000, 0x0000, 0xfaaa, 0xe6c3, 0xe1b2, 0xcaab, 0x0000,
+ /* b8 */ 0xe3e4, 0xe9bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d6,
+
+ /*** Three byte table, leaf: e5afxx - offset 0x01a15 ***/
+
+ /* 80 */ 0xf3f2, 0x0000, 0xeed6, 0xeab2, 0xd0f6, 0xecd9, 0xdacb, 0xcfa8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdda3, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd8db, 0x0000, 0xf9ce, 0xe9d5, 0xe3d1, 0x0000, 0x0000, 0xd2bc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ac, 0xf3cc,
+ /* a0 */ 0x0000, 0xcdfb, 0xf6d6, 0x0000, 0xe7f5, 0xe8ef, 0xe3f9, 0xd2bb,
+ /* a8 */ 0xf3f3, 0xe3fb, 0x0000, 0xded0, 0xceb0, 0x0000, 0xd6f7, 0xf1d9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c1, 0xdcc4, 0x0000,
+ /* b8 */ 0xf5bb, 0x0000, 0xded1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b0xx - offset 0x01a54 ***/
+
+ /* 80 */ 0x0000, 0xdce6, 0x0000, 0x0000, 0xded2, 0x0000, 0x0000, 0xede2,
+ /* 88 */ 0xeef6, 0xeacf, 0xf0ee, 0xe3fc, 0x0000, 0xd3df, 0xd3f4, 0xe1b3,
+ /* 90 */ 0x0000, 0xe1b4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d3, 0x0000,
+ /* 98 */ 0x0000, 0xdfc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9d6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdbab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf6a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe3b9, 0xebc5, 0xf4a9, 0xcdb6, 0xd2f9, 0x0000, 0xdaad, 0xd2e3,
+
+ /*** Three byte table, leaf: e5b1xx - offset 0x01a94 ***/
+
+ /* 80 */ 0xcfd1, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbdc, 0xccfa, 0x0000,
+ /* 88 */ 0xcfdd, 0x0000, 0x0000, 0xe8a9, 0x0000, 0xe3bb, 0xe3ba, 0x0000,
+ /* 90 */ 0x0000, 0xe0da, 0x0000, 0x0000, 0x0000, 0xeef7, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdcb3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd3f5, 0x0000, 0xd7a6, 0x0000, 0xf6b5, 0xd7db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d5, 0x0000, 0x0000, 0xd4ea,
+ /* b0 */ 0x0000, 0xdfa3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfddf,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b2xx - offset 0x01ace ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd0f7, 0xedd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcbaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe4db, 0x0000, 0xe1fb, 0xcba2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd3e0, 0x0000, 0xe4bf, 0x0000, 0xfbc0, 0x0000, 0xdabe,
+ /* b8 */ 0xe4cd, 0x0000, 0xd6b9, 0x0000, 0x0000, 0x0000, 0xefc0, 0x0000,
+
+ /*** Three byte table, leaf: e5b3xx - offset 0x01b0e ***/
+
+ /* 80 */ 0xe1fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf6b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdfc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce7,
+ /* b0 */ 0xdce8, 0x0000, 0x0000, 0x0000, 0xfad6, 0x0000, 0xd3f6, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf1da, 0x0000, 0xfaf2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b4xx - offset 0x01b4c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2fd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cf, 0xd0f8, 0x0000,
+ /* 90 */ 0x0000, 0xcddf, 0x0000, 0x0000, 0xf5cb, 0x0000, 0xe4f0, 0xcbab,
+ /* 98 */ 0x0000, 0xd7c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2fe,
+ /* a8 */ 0x0000, 0xddda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b5xx - offset 0x01b81 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdaae, 0xcaee, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd5b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe3a1, 0x0000, 0x0000, 0xe8e3, 0x0000, 0x0000, 0xf3ab,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b6xx - offset 0x01bba ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd3f7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f1, 0x0000, 0x0000,
+ /* a0 */ 0xcee4, 0x0000, 0xe8f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe5f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe7ae, 0x0000, 0xd6ba, 0x0000, 0xdfec, 0xe4c0,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b7xx - offset 0x01bf8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8b5, 0x0000, 0x0000, 0x0000, 0xe4dc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4b9, 0xf1b6, 0x0000,
+ /* a0 */ 0x0000, 0xe2de, 0xe1b5, 0x0000, 0x0000, 0xcdef, 0xf1a7, 0xcee5,
+ /* a8 */ 0xcbdd, 0x0000, 0x0000, 0xd9e3, 0x0000, 0x0000, 0xf3ac, 0x0000,
+ /* b0 */ 0x0000, 0xd0f9, 0xecab, 0xded3, 0xf7e9, 0x0000, 0x0000, 0xf9f5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1de, 0xcbee,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5b8xx - offset 0x01c37 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe3bc, 0xf8d6, 0x0000, 0x0000, 0xdbee, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdf1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4de, 0x0000,
+ /* 98 */ 0x0000, 0xf2ed, 0x0000, 0xdbd9, 0x0000, 0xf0a8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1fd, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xded4, 0x0000, 0xe0ac, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xede3, 0x0000, 0x0000, 0xd3e1, 0x0000,
+ /* b8 */ 0xdfc8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9b6, 0x0000, 0xfdac,
+
+ /*** Three byte table, leaf: e5b9xx - offset 0x01c77 ***/
+
+ /* 80 */ 0xefd3, 0x0000, 0x0000, 0x0000, 0xe4c1, 0xf8eb, 0x0000, 0xdbac,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ad, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ba,
+ /* a0 */ 0x0000, 0xdbdf, 0xd3d3, 0xf8c7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcace, 0xf8c1, 0xd2b4, 0x0000, 0x0000, 0xdcb4,
+ /* b8 */ 0xfab9, 0xcacf, 0x0000, 0xfcb3, 0xeaea, 0xeaeb, 0xd0fa,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5baxx - offset 0x01cb6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xede4, 0x0000, 0x0000, 0xdde7,
+ /* 88 */ 0x0000, 0x0000, 0xdfc9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfed,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeebc, 0x0000, 0xefc1,
+ /* 98 */ 0x0000, 0x0000, 0xccd2, 0x0000, 0xdda4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdfca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3f8, 0xf1a8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcdb7, 0x0000, 0xefd4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4dd, 0xdfee, 0xcbac,
+ /* b8 */ 0xe9bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeaec,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bbxx - offset 0x01cf5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdfcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf9bf, 0xd6af, 0xd5c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcfaa, 0x0000, 0x0000, 0xcea9, 0x0000, 0x0000, 0xd6f8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf1b7, 0xeef8, 0x0000, 0x0000, 0x0000, 0xd9d9,
+ /* a0 */ 0xf3df, 0x0000, 0xf8c8, 0xcec6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf4e6, 0x0000, 0x0000, 0xe6c5, 0xefd5,
+ /* b8 */ 0x0000, 0x0000, 0xcbef, 0xfcdf, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bcxx - offset 0x01d34 ***/
+
+ /* 80 */ 0x0000, 0xdca7, 0x0000, 0x0000, 0xd6e7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf8c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d2,
+ /* 90 */ 0x0000, 0xe3bd, 0x0000, 0xcfe1, 0xf0c0, 0xecda, 0x0000, 0xddd7,
+ /* 98 */ 0xfbf0, 0x0000, 0x0000, 0xecac, 0x0000, 0x0000, 0x0000, 0xf0a9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfad7, 0xfbc1,
+ /* a8 */ 0x0000, 0xd2c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe5b0, 0x0000, 0x0000, 0x0000, 0xede5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcbad, 0x0000, 0xf9b0,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bdxx - offset 0x01d71 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7a5, 0x0000, 0xcbae, 0x0000, 0xdaaf, 0x0000, 0xd8b6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a7, 0xfbb2,
+ /* 98 */ 0x0000, 0xfdc4, 0x0000, 0xecad, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfba1, 0x0000, 0x0000, 0x0000, 0xe5e9, 0xe9ee,
+ /* a8 */ 0x0000, 0xf3f4, 0xf8f3, 0xf0c1, 0xdeaf, 0xf8b0, 0x0000, 0x0000,
+ /* b0 */ 0xf3e0, 0xe7af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbad,
+ /* b8 */ 0x0000, 0xe6b5, 0x0000, 0x0000, 0xf9a8, 0x0000, 0x0000, 0xddd8,
+
+ /*** Three byte table, leaf: e5bexx - offset 0x01db1 ***/
+
+ /* 80 */ 0xe8d9, 0xefd6, 0x0000, 0x0000, 0x0000, 0xd3e2, 0x0000, 0xe2df,
+ /* 88 */ 0x0000, 0x0000, 0xfce0, 0xd7c8, 0xfdad, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdfef, 0xccd3, 0xd3f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f0,
+ /* 98 */ 0xdbc7, 0xded5, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0f4, 0x0000,
+ /* a0 */ 0xd5d0, 0xe5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xfcc7, 0xdcd6, 0xe2e0, 0x0000, 0x0000, 0x0000, 0xdab0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a3, 0x0000, 0xd3ec,
+ /* b8 */ 0x0000, 0xf4cb, 0x0000, 0x0000, 0x0000, 0xfdc5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e5bfxx - offset 0x01def ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe3fd, 0x0000, 0xf9b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fb, 0xecdb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5bc, 0xf2a4,
+ /* 98 */ 0xd8ce, 0xd8cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf6e1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2b7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbec, 0x0000, 0xddc8,
+
+ /*** Three byte table, leaf: e680xx - offset 0x01e2f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e8,
+ /* 90 */ 0x0000, 0x0000, 0xd2c1, 0x0000, 0x0000, 0x0000, 0xf8d7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6bb, 0xded6, 0x0000, 0x0000,
+ /* a0 */ 0xf7bd, 0xecae, 0x0000, 0x0000, 0x0000, 0xd0e1, 0x0000, 0xe0f5,
+ /* a8 */ 0xeab3, 0x0000, 0xced6, 0x0000, 0x0000, 0x0000, 0x0000, 0xcca5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e681xx - offset 0x01e6e ***/
+
+ /* 80 */ 0x0000, 0xecf6, 0xe2e1, 0xe3be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc8, 0x0000, 0x0000,
+ /* 90 */ 0xcdf0, 0x0000, 0xf9f6, 0x0000, 0x0000, 0xdff0, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe5bf, 0x0000, 0x0000, 0x0000, 0xcebf, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfce1, 0xedb0, 0xfdd1, 0xf6bb, 0x0000, 0x0000,
+ /* a8 */ 0xf9cf, 0xebda, 0xcac1, 0x0000, 0xd2b8, 0xcdf1, 0x0000, 0xe3d3,
+ /* b0 */ 0xfde6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e682xx - offset 0x01ea9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ed, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe3fa, 0x0000, 0x0000, 0xf0aa, 0xf9d0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfce2, 0x0000, 0xf8a7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe1e5, 0xeef9, 0x0000, 0x0000, 0x0000, 0xe7f6,
+ /* a0 */ 0xeaed, 0x0000, 0x0000, 0xfcb4, 0xf5c2, 0x0000, 0x0000, 0xd7dc,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf0f5, 0x0000, 0xdde8, 0xd3ed, 0xf5fc, 0x0000, 0xdabf, 0x0000,
+ /* b8 */ 0xccfb, 0x0000, 0x0000, 0x0000, 0xd3fa, 0xf4a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e683xx - offset 0x01ee7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefd7, 0x0000, 0xd4c3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xfbe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xfbed, 0x0000, 0xe0ad, 0x0000, 0x0000, 0xeaee,
+ /* a0 */ 0xfbb3, 0xe4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf6e7, 0xd2dd, 0x0000, 0xdfcc, 0x0000, 0x0000, 0xfcc9, 0x0000,
+ /* b8 */ 0x0000, 0xe5a9, 0xe0f6, 0xf6b3, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e684xx - offset 0x01f26 ***/
+
+ /* 80 */ 0x0000, 0xe1fe, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf0, 0x0000,
+ /* 88 */ 0xeaef, 0xeaf0, 0x0000, 0x0000, 0x0000, 0xdac0, 0xf8b4, 0xebf2,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe9d7, 0xe4f1, 0x0000, 0x0000, 0x0000, 0xcaef,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xced7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcca, 0x0000, 0x0000, 0x0000, 0xf3e1, 0x0000, 0x0000, 0xcbc4,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3e5, 0x0000, 0xcbc5, 0xeab4,
+
+ /*** Three byte table, leaf: e685xx - offset 0x01f66 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9bd, 0x0000, 0xd7c9, 0x0000, 0x0000, 0xebdb,
+ /* 88 */ 0xedb1, 0x0000, 0xccc3, 0xf7be, 0xfccb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf8f4, 0x0000, 0xd9b7, 0x0000, 0x0000,
+ /* 98 */ 0xf3d3, 0xf3d4, 0x0000, 0x0000, 0x0000, 0xf7e4, 0x0000, 0xf7d1,
+ /* a0 */ 0x0000, 0x0000, 0xd8b7, 0xceb1, 0xcac2, 0x0000, 0x0000, 0xfbb4,
+ /* a8 */ 0xcbc6, 0x0000, 0x0000, 0xf0f6, 0x0000, 0x0000, 0xd5e7, 0x0000,
+ /* b0 */ 0xead0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccd4, 0xcbaf,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4aa, 0xe9af,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e686xx - offset 0x01fa5 ***/
+
+ /* 80 */ 0x0000, 0xf5c3, 0xe9d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdde9, 0x0000, 0x0000, 0x0000, 0xf1f3, 0x0000,
+ /* 90 */ 0xd5fb, 0xdebb, 0x0000, 0x0000, 0xf4fb, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfdf3, 0xfdf2, 0xf7a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddc9, 0x0000, 0x0000, 0xd4d3,
+ /* a8 */ 0x0000, 0xcca8, 0x0000, 0xdac1, 0xccd5, 0x0000, 0xd9e4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfaca, 0x0000, 0x0000, 0x0000, 0xe5e3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd3bc, 0x0000, 0x0000, 0x0000, 0xcaf0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e687xx - offset 0x01fe4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd0c4, 0x0000, 0x0000, 0x0000, 0xcad0,
+ /* 88 */ 0xfaab, 0xebeb, 0xe7f8, 0xd9e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1d7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf3a4, 0x0000, 0x0000, 0x0000, 0xd4fb, 0xfce3,
+ /* b8 */ 0xfad8, 0x0000, 0xf3d5, 0x0000, 0xcfab, 0x0000, 0x0000, 0xebf3,
+
+ /*** Three byte table, leaf: e688xx - offset 0x02024 ***/
+
+ /* 80 */ 0xd5fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3d4,
+ /* 88 */ 0xcdfc, 0x0000, 0xd9e6, 0x0000, 0xe2f9, 0xe2a1, 0xebd4, 0x0000,
+ /* 90 */ 0xe0f7, 0xe4b2, 0xccfc, 0x0000, 0x0000, 0x0000, 0xfbe4, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf4ab, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0bd,
+ /* a0 */ 0x0000, 0xcaf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xefb8, 0x0000, 0x0000, 0x0000, 0xd7c0, 0x0000,
+ /* b0 */ 0xeefa, 0xfdf4, 0x0000, 0x0000, 0xd3e3, 0x0000, 0xfbc2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e8, 0xdbae,
+
+ /*** Three byte table, leaf: e689xx - offset 0x02064 ***/
+
+ /* 80 */ 0xe1b6, 0xf8b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0bf,
+ /* 88 */ 0xfbc3, 0xddea, 0x0000, 0xe2a2, 0x0000, 0xeea6, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf6e8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf6f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddca, 0x0000,
+ /* b0 */ 0x0000, 0xd0e2, 0x0000, 0x0000, 0x0000, 0x0000, 0xdda6, 0x0000,
+ /* b8 */ 0x0000, 0xddeb, 0x0000, 0x0000, 0xe4f9, 0x0000, 0x0000, 0xe3af,
+
+ /*** Three byte table, leaf: e68axx - offset 0x020a4 ***/
+
+ /* 80 */ 0xd0fc, 0x0000, 0x0000, 0x0000, 0xf4fc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xccbc, 0xf7ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe5e4, 0xdff1, 0x0000, 0x0000, 0xf7e1, 0x0000, 0xf9f7,
+ /* 98 */ 0xefb9, 0x0000, 0x0000, 0xf8d8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf9a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf8d9, 0x0000, 0x0000, 0x0000, 0xeebd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd8c6, 0x0000, 0x0000, 0xe4e3, 0xf5ce,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68bxx - offset 0x020e2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xddd9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9e7,
+ /* 88 */ 0xd2b9, 0xd5c3, 0x0000, 0x0000, 0xdae5, 0xdad0, 0x0000, 0xd1d9,
+ /* 90 */ 0xced8, 0x0000, 0xcbde, 0xf4ac, 0xdafb, 0x0000, 0xf6e9, 0xe8f3,
+ /* 98 */ 0xcfac, 0xf0f0, 0x0000, 0xf4fd, 0xdbc8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcec0, 0xe3d4, 0xd1cf, 0xf1f5,
+ /* b0 */ 0x0000, 0xcdf2, 0x0000, 0xcfeb, 0x0000, 0x0000, 0x0000, 0xcdb8,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a6, 0xd1da,
+
+ /*** Three byte table, leaf: e68cxx - offset 0x02122 ***/
+
+ /* 80 */ 0x0000, 0xf2a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a6,
+ /* 88 */ 0x0000, 0xe4ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd3fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf1a9, 0x0000, 0x0000, 0x0000, 0xf2c9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xefd8, 0xe6c9, 0x0000, 0xd8b8, 0xfaf3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e68dxx - offset 0x02161 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf3b5, 0x0000, 0x0000, 0xf8a4, 0x0000, 0x0000, 0xd1f3,
+ /* 90 */ 0xe6c8, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8da, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce9,
+ /* a8 */ 0xded7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbdf, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcfec, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4df,
+ /* b8 */ 0x0000, 0x0000, 0xd1f4, 0xd2ba, 0x0000, 0x0000, 0x0000, 0xdff2,
+
+ /*** Three byte table, leaf: e68exx - offset 0x021a1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe1b7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe2a3, 0xd3fc, 0x0000, 0x0000, 0xede6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdbc9, 0x0000, 0x0000, 0x0000, 0xe4fa, 0x0000,
+ /* 98 */ 0xcfde, 0x0000, 0x0000, 0xced0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd5d3, 0xf3f5, 0xf7ae, 0x0000, 0x0000, 0xefc8, 0x0000, 0xcdf3,
+ /* a8 */ 0xf5cf, 0xe5f3, 0xf0c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e68fxx - offset 0x021e1 ***/
+
+ /* 80 */ 0xcad1, 0x0000, 0x0000, 0x0000, 0xeaf1, 0x0000, 0xd0a6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9da,
+ /* 90 */ 0xf0ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebe7, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5c0, 0xfcb5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe4c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcca9, 0xfdc6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeab5, 0x0000, 0xe5aa, 0xdfba,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e690xx - offset 0x02219 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1df, 0x0000, 0xdad1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b8, 0x0000, 0xe8f4, 0xd3fd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf2ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdae6, 0xf7b3, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfdcd, 0x0000, 0x0000, 0x0000, 0xf3b6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e691xx - offset 0x02258 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeed7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xf5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd8a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a7,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd9b8, 0xd9b9, 0xefc9,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e692xx - offset 0x02293 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf7cb, 0xdfae, 0xe8f5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd2b5, 0x0000, 0x0000, 0x0000, 0xd3d5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4cc, 0xdafc, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd9e8, 0x0000, 0xf7eb, 0xf5c9, 0x0000,
+ /* b0 */ 0xf3bc, 0x0000, 0xdad2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd3b5, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e693xx - offset 0x022d2 ***/
+
+ /* 80 */ 0x0000, 0xe8b6, 0x0000, 0x0000, 0xd6cf, 0xf4ba, 0x0000, 0xf7c9,
+ /* 88 */ 0x0000, 0x0000, 0xccaa, 0x0000, 0x0000, 0xf0c3, 0xccd6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd0d3, 0x0000, 0xd3bd, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xdbfb, 0x0000, 0xcbe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xd3e4, 0xf6f7, 0x0000, 0x0000, 0xd5ba, 0xf3cd, 0xcbe1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebf4, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf4ad, 0x0000, 0xfcaa, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf7ec, 0x0000, 0x0000, 0x0000, 0xe8f6, 0x0000,
+
+ /*** Three byte table, leaf: e694xx - offset 0x02312 ***/
+
+ /* 80 */ 0xdae7, 0x0000, 0x0000, 0x0000, 0xf7cc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe5c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0ee, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd5fd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcee6, 0xfcab, 0xd5bb, 0x0000, 0x0000, 0xf2a8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a5, 0xcdb9,
+ /* b8 */ 0xeaf2, 0xcbc7, 0x0000, 0xcdf4, 0x0000, 0x0000, 0xdbaf, 0xefd9,
+
+ /*** Three byte table, leaf: e695xx - offset 0x02352 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdba, 0x0000, 0x0000,
+ /* 88 */ 0xfcf9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdff3, 0xcee7, 0xdac2,
+ /* 90 */ 0x0000, 0xcfad, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7f9, 0xf8a8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e2, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcaf2, 0xdfa4, 0x0000, 0x0000, 0xd4c4, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccd7, 0xe5c2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xcdbb, 0x0000, 0xefda, 0xeed8, 0x0000, 0xdda7,
+ /* b8 */ 0xe2a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e696xx - offset 0x02391 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd6b0, 0xf8ca, 0x0000, 0xfcfa, 0x0000, 0xd9fe,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xddec, 0xdae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e0,
+ /* 98 */ 0x0000, 0xd6f9, 0x0000, 0xcdd7, 0xded8, 0x0000, 0x0000, 0xf2f8,
+ /* a0 */ 0x0000, 0xe4d6, 0x0000, 0x0000, 0xd0c5, 0xf4ae, 0x0000, 0xdda8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedc5, 0xf3d6, 0x0000, 0x0000, 0xded9,
+ /* b0 */ 0xe3e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3a8,
+ /* b8 */ 0x0000, 0xdbb0, 0x0000, 0x0000, 0xe5da, 0xe3bf, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e697xx - offset 0x023d0 ***/
+
+ /* 80 */ 0x0000, 0xdbb1, 0x0000, 0x0000, 0x0000, 0xd5e9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe0c1, 0xefdb, 0x0000, 0x0000, 0xf0e9,
+ /* 90 */ 0x0000, 0x0000, 0xd7b2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0fd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd9e9, 0x0000, 0x0000, 0xd0fe, 0x0000, 0xeced, 0xd3a9, 0x0000,
+ /* a8 */ 0xf2a9, 0xf0c4, 0x0000, 0x0000, 0xe2e2, 0xe9ef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf9d1, 0x0000, 0x0000, 0xe9d9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe8da, 0xdac3, 0xdac4, 0xd4c5, 0x0000, 0xe7fa,
+
+ /*** Three byte table, leaf: e698xx - offset 0x02410 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde0, 0xe3b0,
+ /* 88 */ 0x0000, 0xdbb2, 0xfbc4, 0x0000, 0xf3e3, 0x0000, 0xd9a5, 0xfbe7,
+ /* 90 */ 0xddcb, 0xd0d4, 0x0000, 0xe6b6, 0xe0ae, 0xfdda, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcb5, 0xe0f8,
+ /* a0 */ 0xe7b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5f0, 0x0000, 0xd8dc,
+ /* a8 */ 0xedc6, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1b9, 0x0000, 0xe3c0,
+ /* b0 */ 0xf9c0, 0xe9f0, 0x0000, 0x0000, 0xd9db, 0x0000, 0xf3e4, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xdcb6, 0xe4e9, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e699xx - offset 0x0244f ***/
+
+ /* 80 */ 0x0000, 0xf0c5, 0xe3c1, 0xfccc, 0xfccd, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2cb, 0x0000, 0xf2cc, 0x0000, 0x0000, 0x0000, 0xe4cf,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf1db, 0x0000, 0xfad9, 0x0000, 0xf1b8, 0xfdf5, 0xe0f9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fb, 0xfcb7, 0xfce4, 0xfbc5,
+ /* a8 */ 0xe3e7, 0xd8b9, 0x0000, 0xf6f8, 0x0000, 0x0000, 0xdcc5, 0xccd8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0af, 0xf4e7, 0x0000, 0xefdc, 0xcffc,
+ /* b8 */ 0xefdd, 0x0000, 0xf2aa, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69axx - offset 0x0248b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdbe, 0x0000, 0x0000, 0xcaac,
+ /* 88 */ 0xfdbb, 0xfdc7, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b2, 0x0000,
+ /* 90 */ 0xead1, 0xdff4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1ec, 0xe4de,
+ /* 98 */ 0xe5c3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a6, 0x0000, 0x0000,
+ /* a0 */ 0xcdbc, 0x0000, 0xf3e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedd5, 0x0000, 0x0000, 0xd9ba, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xede7, 0xfbb5, 0xf8ec, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe0e7, 0x0000, 0xccd9, 0x0000, 0x0000, 0xd4c6,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69bxx - offset 0x024ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a5, 0x0000, 0xd5f5, 0xd3be,
+ /* 88 */ 0x0000, 0xfcfb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f2, 0x0000,
+ /* 98 */ 0x0000, 0xdff5, 0x0000, 0x0000, 0xe8f8, 0xf8ed, 0x0000, 0x0000,
+ /* a0 */ 0xcec7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdf6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8d8, 0x0000, 0xcdd8, 0xe7d6, 0xccda, 0x0000, 0x0000, 0xcae3,
+ /* b8 */ 0xdff6, 0xf0c7, 0xf0c6, 0x0000, 0xd8ba, 0x0000, 0xf1f4, 0xf4f0,
+
+ /*** Three byte table, leaf: e69cxx - offset 0x0250a ***/
+
+ /* 80 */ 0xf5cc, 0x0000, 0x0000, 0xfce5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeac5, 0xeaf3, 0x0000, 0xdddb, 0x0000, 0xdcd7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdefd, 0xf2f9, 0x0000, 0xd5c7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd8d0, 0x0000, 0xf0c8, 0xd1a1, 0xd1a2,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9d4, 0xd6e8,
+ /* a8 */ 0xd9ca, 0x0000, 0xdab1, 0xd8c7, 0xdce2, 0xf3ce, 0xf5f4, 0x0000,
+ /* b0 */ 0x0000, 0xf1b9, 0x0000, 0x0000, 0xdad3, 0x0000, 0xf6ea, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcff5, 0x0000, 0x0000, 0xfdae,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69dxx - offset 0x02548 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad2, 0x0000,
+ /* 88 */ 0x0000, 0xdfb4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7dd, 0xfaba,
+ /* 90 */ 0xeea7, 0xf5bd, 0x0000, 0xf8f5, 0x0000, 0x0000, 0xede8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e1, 0x0000, 0xd1a3, 0xe1d6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9f8, 0x0000, 0xdbca,
+ /* b0 */ 0xcbf9, 0xd4d4, 0x0000, 0xd9dc, 0x0000, 0xeebe, 0x0000, 0xf7ed,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd2ee, 0x0000, 0x0000, 0xe1e6, 0xf7f9,
+
+ /*** Three byte table, leaf: e69exx - offset 0x02588 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdded,
+ /* 88 */ 0x0000, 0xe8db, 0x0000, 0xdbb3, 0x0000, 0x0000, 0x0000, 0xd1f7,
+ /* 90 */ 0xe0b0, 0x0000, 0x0000, 0xd4e2, 0x0000, 0xf6d7, 0x0000, 0xd7f9,
+ /* 98 */ 0x0000, 0x0000, 0xd8dd, 0x0000, 0xcdfd, 0xf2ab, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdbd,
+ /* b0 */ 0xf8c2, 0x0000, 0x0000, 0xf2ac, 0x0000, 0x0000, 0xcaad, 0xcaae,
+ /* b8 */ 0xcfae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3c2,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e69fxx - offset 0x025c7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdcb7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbda,
+ /* 90 */ 0xd9bb, 0xcaf3, 0xf6d3, 0xe6f8, 0xeaf5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xeaf6, 0x0000, 0x0000, 0xf6f9, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcfaf, 0x0000, 0x0000, 0xcad3, 0x0000, 0x0000, 0xcaaf,
+ /* b0 */ 0xd2b0, 0xf1ba, 0x0000, 0xd7b3, 0xe3c3, 0xf3fd, 0xdeda, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdedb, 0x0000, 0x0000, 0xefde,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a0xx - offset 0x02606 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe2e3, 0xeefb, 0x0000, 0x0000, 0xdff7, 0xd7ca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcee8, 0xdbdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfab7, 0xd0c6, 0x0000, 0x0000, 0xccab, 0xeea8, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a1xx - offset 0x02646 ***/
+
+ /* 80 */ 0xcbfa, 0xf9f9, 0xccfd, 0xd3fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe4d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ee, 0x0000,
+ /* 90 */ 0xd4d5, 0xdfcd, 0x0000, 0xfcb8, 0xd1d0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2cd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7d2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad4,
+
+ /*** Three byte table, leaf: e6a2xx - offset 0x02686 ***/
+
+ /* 80 */ 0x0000, 0xd5d9, 0x0000, 0x0000, 0x0000, 0xd8de, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdd9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xeea9, 0xf6bc, 0x0000, 0x0000, 0xccdb,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0c9, 0x0000, 0xfcfc,
+ /* a0 */ 0x0000, 0xe8c9, 0xf4fe, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7fc,
+ /* a8 */ 0xd7de, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedc, 0x0000, 0xf0ac,
+ /* b0 */ 0xccfe, 0xcde1, 0x0000, 0xe1ba, 0x0000, 0xdbef, 0xdab2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a3xx - offset 0x026c2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd1a5, 0xdcb8, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd8f6, 0x0000, 0xd1a4, 0x0000, 0xcde2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xdcea, 0x0000, 0x0000, 0xf0f7, 0x0000, 0xf0ca,
+ /* 98 */ 0xd0be, 0x0000, 0xdddc, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4d6,
+ /* a0 */ 0xd3d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd0,
+ /* a8 */ 0xcda1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfb5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdff8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd4a1, 0xceb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6a4xx - offset 0x02702 ***/
+
+ /* 80 */ 0xe8ca, 0x0000, 0x0000, 0x0000, 0x0000, 0xebf5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d5, 0xf5d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a7,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe5ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6cb, 0x0000, 0xf5f1,
+
+ /*** Three byte table, leaf: e6a5xx - offset 0x02742 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe5c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9a3, 0xe0db, 0xf6eb, 0x0000, 0xcbf1,
+ /* 98 */ 0x0000, 0xd9ea, 0xf5a2, 0x0000, 0x0000, 0x0000, 0xd7d1, 0x0000,
+ /* a0 */ 0xd1f8, 0xeaf8, 0xeaf9, 0xdab3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xefdf, 0x0000, 0x0000, 0xf1ef, 0x0000, 0xe5f6, 0xeebf, 0xe2e4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0bf, 0x0000, 0xfaac,
+ /* b8 */ 0xf5d1, 0xe7b3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a6xx - offset 0x0277c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9be, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf2ce, 0xdbb4, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcce, 0x0000, 0xddee,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7b4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b4, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf7b4, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a7xx - offset 0x027bb ***/
+
+ /* 80 */ 0x0000, 0xcdbe, 0x0000, 0xdae9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xcfb0, 0xf7d9, 0xf3e6, 0x0000, 0x0000,
+ /* 90 */ 0xced9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xceaa, 0x0000, 0xcbc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd0a7, 0x0000, 0xf0cb, 0x0000, 0xd0c7,
+
+ /*** Three byte table, leaf: e6a8xx - offset 0x027fb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe4c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdbe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd5da, 0x0000, 0xd7a7, 0x0000, 0x0000, 0x0000, 0xeec0,
+ /* 98 */ 0x0000, 0xf8f6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5d2, 0xede9,
+ /* a0 */ 0x0000, 0xd9bc, 0x0000, 0xe5c6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a3, 0x0000, 0x0000,
+ /* b8 */ 0xdad4, 0xe2a7, 0xfbfc, 0x0000, 0x0000, 0xf1dc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6a9xx - offset 0x02839 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcaf4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe8fa, 0x0000, 0x0000, 0xcee9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe9f8, 0xe2e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd0b9, 0xd4f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1a6,
+ /* a0 */ 0x0000, 0xdfce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfcf4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6aaxx - offset 0x02879 ***/
+
+ /* 80 */ 0xd3aa, 0x0000, 0x0000, 0x0000, 0xccac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xefe0, 0x0000, 0x0000, 0x0000, 0xe5e5, 0xd0d5, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbfc,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfce6, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xcbfe, 0xedea, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdeb1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf9e3, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6abxx - offset 0x028b7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd4a2, 0xcff6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd6d0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd5ea, 0xf1ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfacb, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe5a1,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6acxx - offset 0x028f3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcfed, 0x0000, 0xedeb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd5b2, 0x0000, 0x0000, 0x0000, 0xd5bc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfde2, 0xf3ad, 0x0000, 0xfddb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe9b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd1a7, 0x0000, 0x0000, 0xfde3, 0xceb3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6adxx - offset 0x02932 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfde4, 0xface,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcab0, 0x0000, 0xf7a7, 0x0000,
+ /* 90 */ 0xcfb1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a2,
+ /* a0 */ 0x0000, 0xfcb6, 0xf2ad, 0xefe1, 0xf3ae, 0xdcc6, 0xd9eb, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe8e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe1a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5f6,
+ /* b8 */ 0xcffd, 0x0000, 0x0000, 0xdedd, 0x0000, 0x0000, 0x0000, 0xd9d1,
+
+ /*** Three byte table, leaf: e6aexx - offset 0x02972 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xe4ea, 0xf2cf, 0x0000, 0xf7bf, 0x0000,
+ /* 88 */ 0x0000, 0xe2e6, 0xe2a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d6, 0x0000,
+ /* 98 */ 0xedd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f9, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6b1, 0xdeb2,
+ /* b0 */ 0x0000, 0x0000, 0xe0e8, 0x0000, 0x0000, 0xd3ab, 0x0000, 0xebdc,
+ /* b8 */ 0x0000, 0x0000, 0xdfaf, 0x0000, 0xcac3, 0x0000, 0x0000, 0xeefc,
+
+ /*** Three byte table, leaf: e6afxx - offset 0x029b2 ***/
+
+ /* 80 */ 0x0000, 0xfdc3, 0x0000, 0x0000, 0x0000, 0xebf6, 0xcfb2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd9ec, 0x0000, 0xd9bd, 0x0000, 0xd8df,
+ /* 90 */ 0x0000, 0x0000, 0xd4b8, 0xebbe, 0xddef, 0x0000, 0xddf0, 0xddf1,
+ /* 98 */ 0xddf2, 0x0000, 0x0000, 0xd9be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbc6, 0xcfb3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b0xx - offset 0x029ea ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xeefd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ab,
+ /* 90 */ 0x0000, 0xdac5, 0x0000, 0xd8ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd1a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2a9, 0x0000, 0x0000, 0xdebc,
+ /* b8 */ 0xe7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbf0, 0x0000,
+
+ /*** Three byte table, leaf: e6b1xx - offset 0x02a2a ***/
+
+ /* 80 */ 0xefe2, 0xf1f0, 0xcfb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbf1, 0x0000,
+ /* 90 */ 0xe0b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa5, 0x0000, 0xf9d2,
+ /* 98 */ 0x0000, 0x0000, 0xe7fd, 0x0000, 0x0000, 0xe6a3, 0xfbf1, 0xcbb0,
+ /* a0 */ 0xf2ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcde7, 0x0000, 0xe8dc, 0x0000, 0x0000, 0xe7d7, 0x0000, 0x0000,
+ /* b0 */ 0xf7c0, 0x0000, 0xd0e3, 0x0000, 0x0000, 0x0000, 0xdaa1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xccbd, 0x0000, 0x0000, 0xd1a9, 0xddcc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b2xx - offset 0x02a69 ***/
+
+ /* 80 */ 0x0000, 0xe3fe, 0xd1aa, 0xe8aa, 0x0000, 0xeab6, 0xf9fa, 0xe6cc,
+ /* 88 */ 0xf6d8, 0x0000, 0x0000, 0x0000, 0xd4c7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd9cb, 0x0000, 0xd9d2, 0xd3cb, 0xd8f7, 0xdaa9, 0xf5f8, 0x0000,
+ /* 98 */ 0x0000, 0xdede, 0xf2af, 0xf8a9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd8c8, 0x0000, 0x0000, 0xeec1, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf9c1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xddf3, 0xeafa, 0x0000, 0xf6bd, 0xe1bb, 0xcdbf, 0xf4d4, 0xe6cd,
+
+ /*** Three byte table, leaf: e6b3xx - offset 0x02aa9 ***/
+
+ /* 80 */ 0x0000, 0xfccf, 0xfba2, 0x0000, 0xe0dc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf4bb, 0xdad5, 0x0000, 0xf9b2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfbf2, 0x0000, 0xdbf6, 0x0000, 0xdedf,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdbf2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf8dc, 0xf7ee, 0xebe8, 0x0000, 0xd2fa, 0x0000, 0x0000,
+ /* a8 */ 0xf1bc, 0x0000, 0x0000, 0xfada, 0x0000, 0x0000, 0xdaea, 0xdac6,
+ /* b0 */ 0xf7c1, 0x0000, 0x0000, 0xe7b6, 0x0000,
+ /* 11 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b4xx - offset 0x02ade ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe5c7, 0xd6ac, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdcc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a9,
+ /* 98 */ 0x0000, 0xe2aa, 0x0000, 0xd5a6, 0x0000, 0x0000, 0xd4d7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d0, 0x0000, 0xeafb,
+ /* a8 */ 0x0000, 0xe0dd, 0xfbf3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf1bd, 0x0000, 0x0000, 0xe2e7, 0xfdd7, 0x0000,
+ /* b8 */ 0xcec8, 0xeab7, 0x0000, 0xfcc0, 0x0000, 0xfde7, 0xf7ef,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b5xx - offset 0x02b1d ***/
+
+ /* 80 */ 0x0000, 0xd7b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xefba, 0xf1dd, 0x0000, 0xdeb3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe8cb, 0x0000, 0x0000, 0xf8dd, 0x0000,
+ /* a8 */ 0x0000, 0xfbc7, 0xd5c8, 0x0000, 0xd7df, 0x0000, 0xdda9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9b1, 0x0000, 0x0000, 0xfaad,
+ /* b8 */ 0xf6d9, 0xfaf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8aa,
+
+ /*** Three byte table, leaf: e6b6xx - offset 0x02b5d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ee, 0x0000, 0xccdc,
+ /* 88 */ 0xe1bc, 0xe0ef, 0x0000, 0x0000, 0xe9bf, 0xfcfd, 0xe6ce, 0x0000,
+ /* 90 */ 0x0000, 0xe1d7, 0x0000, 0xe6cf, 0x0000, 0xf4f1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f3,
+ /* b0 */ 0x0000, 0x0000, 0xe4fb, 0x0000, 0x0000, 0xf9e4, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e6b7xx - offset 0x02b9d ***/
+
+ /* 80 */ 0xefe3, 0x0000, 0x0000, 0xcfee, 0xf6be, 0xe0b2, 0xfcfe, 0xd1ab,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7fa, 0x0000, 0x0000, 0x0000, 0xfbc8,
+ /* 90 */ 0x0000, 0xe2d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd4a3, 0xf0f8, 0xd7a8, 0x0000, 0x0000, 0x0000, 0xe1e7, 0x0000,
+ /* a0 */ 0x0000, 0xd3bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xefe4, 0x0000, 0xd7c5, 0xebe2, 0x0000, 0x0000, 0xfce7, 0x0000,
+ /* b0 */ 0x0000, 0xe4a2, 0x0000, 0xe2e8, 0x0000, 0xe6d0, 0x0000, 0xfbe8,
+ /* b8 */ 0xf4e8, 0xe5f4, 0xf4bc, 0xf4d5,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b8xx - offset 0x02bd9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfb6,
+ /* 98 */ 0x0000, 0xfcb9, 0xeec2, 0xcaf5, 0x0000, 0x0000, 0x0000, 0xefe5,
+ /* a0 */ 0xcbe2, 0xd4a4, 0x0000, 0xdee0, 0xdafd, 0xe4c6, 0xe8be, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe0de, 0xf6b4, 0xead2, 0x0000, 0xf9fb,
+ /* b0 */ 0x0000, 0x0000, 0xe0c2, 0x0000, 0xcae4, 0x0000, 0xe7b7, 0x0000,
+ /* b8 */ 0xeafd, 0x0000, 0xd9dd, 0x0000, 0xdab4, 0xeeaa, 0xfbe9,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6b9xx - offset 0x02c18 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xdbcb, 0xdab5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf1be, 0x0000, 0x0000, 0xd3ac, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbc9, 0x0000,
+ /* 98 */ 0xdfcf, 0x0000, 0x0000, 0xd3c0, 0xe3d7, 0x0000, 0xefe6, 0xfcd0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf5d3, 0x0000, 0x0000, 0xecdc, 0xf7b7,
+ /* b0 */ 0x0000, 0x0000, 0xeab8, 0xd1f9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xdcc8,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6baxx - offset 0x02c53 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xeab9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1de, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b6, 0xcfb5, 0x0000, 0xd9a8,
+ /* a0 */ 0x0000, 0x0000, 0xecee, 0x0000, 0x0000, 0xddaa, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xcda2, 0xe8ae, 0x0000, 0x0000, 0x0000, 0xe1bd,
+ /* b0 */ 0x0000, 0xf2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9c1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd2fc, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bbxx - offset 0x02c91 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdbb5, 0x0000, 0xf3e7, 0xd8fe, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfcd1, 0x0000, 0xedb2, 0xf4af, 0x0000, 0xfba3, 0x0000,
+ /* 90 */ 0x0000, 0xfcc1, 0x0000, 0xeeab, 0xd4a5, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeed9, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfbca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde3, 0xd8bb,
+
+ /*** Three byte table, leaf: e6bcxx - offset 0x02cd1 ***/
+
+ /* 80 */ 0x0000, 0xe5db, 0xf8f7, 0x0000, 0x0000, 0x0000, 0xf6d4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a9,
+ /* 90 */ 0x0000, 0xcbc9, 0x0000, 0x0000, 0xe6d1, 0xf0cc, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd8ae, 0x0000, 0xf9d3, 0xd5fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd8bc, 0xf2b0, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe2ab, 0xf3e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xefc2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedec,
+
+ /*** Three byte table, leaf: e6bdxx - offset 0x02d11 ***/
+
+ /* 80 */ 0x0000, 0xe7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdafe, 0x0000, 0x0000, 0xccbe, 0x0000, 0x0000, 0xf2fc,
+ /* 98 */ 0xdaeb, 0x0000, 0xe2d8, 0xedd6, 0x0000, 0x0000, 0xd6d1, 0xe0b3,
+ /* a0 */ 0x0000, 0x0000, 0xfcd2, 0x0000, 0xebc8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3c1, 0xf0cd, 0x0000,
+ /* b0 */ 0xcff7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xedd2, 0x0000, 0xd4d8, 0xdcc9, 0xd7f1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e6bexx - offset 0x02d50 ***/
+
+ /* 80 */ 0x0000, 0xdfbb, 0x0000, 0x0000, 0xf3a5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf4cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1bf, 0xf8b1, 0x0000,
+ /* 90 */ 0xe9fa, 0x0000, 0x0000, 0x0000, 0xfbcb, 0x0000, 0x0000, 0xcad5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf9d4, 0xf7ca, 0x0000, 0x0000, 0xd6c8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfce8, 0xf3bd,
+ /* b0 */ 0x0000, 0xeefe, 0x0000, 0xe7fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd3c2, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3b6, 0x0000,
+
+ /*** Three byte table, leaf: e6bfxx - offset 0x02d90 ***/
+
+ /* 80 */ 0xccad, 0xf6fa, 0xd6b2, 0xd2d8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe7d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe7b9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ad,
+ /* a0 */ 0xfbcc, 0xeba1, 0x0000, 0x0000, 0xd4a6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfbcd, 0x0000, 0xd5bd, 0xf1df, 0x0000, 0x0000, 0xf6fb,
+ /* b0 */ 0x0000, 0xdeb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5eb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e780xx - offset 0x02dcf ***/
+
+ /* 80 */ 0x0000, 0xe5c8, 0x0000, 0x0000, 0x0000, 0xfba4, 0xd4b9, 0x0000,
+ /* 88 */ 0x0000, 0xdee1, 0x0000, 0xe4a3, 0x0000, 0x0000, 0x0000, 0xd7b7,
+ /* 90 */ 0x0000, 0xf8ee, 0x0000, 0x0000, 0x0000, 0xdeb5, 0x0000, 0x0000,
+ /* 98 */ 0xd6d2, 0x0000, 0xf9d5, 0xe7ba, 0xebd5, 0xd5f7, 0xefe7, 0xe1be,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfaae, 0x0000, 0x0000, 0x0000, 0xd6e9,
+ /* a8 */ 0xd6ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7bb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeccb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e781xx - offset 0x02e0e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xceb4, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xfba5, 0xe1ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf7a8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbce, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd8bd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbfd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfce9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcfb6, 0x0000, 0x0000, 0x0000, 0xedc7, 0xeeac,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e782xx - offset 0x02e4c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccdd, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf6a7, 0x0000, 0x0000, 0x0000, 0xe6fa, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfddc, 0xedb3, 0xcec9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xefe8, 0x0000, 0x0000, 0xe1bf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfadb, 0xcbe3, 0xf7a9, 0x0000, 0xfba6,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdcb9, 0x0000, 0x0000, 0x0000, 0xf1c0,
+ /* b8 */ 0xedc8, 0xefc3,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e783xx - offset 0x02e86 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6ad, 0x0000, 0x0000, 0xfdce, 0x0000, 0x0000, 0x0000, 0xe8a1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xfbf4, 0xd5a7, 0x0000, 0x0000, 0x0000, 0xf1f6, 0x0000, 0xe6d3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xccde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf8b2, 0x0000, 0x0000, 0x0000, 0xdceb,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e784xx - offset 0x02ec4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb6, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe5ea, 0x0000, 0x0000, 0xf1e0, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdbcc, 0xddcd, 0x0000, 0x0000, 0x0000, 0xd4c8, 0x0000,
+ /* a0 */ 0x0000, 0xd9ed, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe6fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6d4, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e785xx - offset 0x02efd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdc8,
+ /* 88 */ 0x0000, 0xd6a1, 0xfdbf, 0x0000, 0xfcd3, 0x0000, 0xefa1, 0x0000,
+ /* 90 */ 0xe7bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1ee, 0x0000,
+ /* 98 */ 0x0000, 0xe6d5, 0x0000, 0x0000, 0xe9f2, 0x0000, 0xdfb0, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8e0, 0xfcba, 0xfdaf, 0xf0ce,
+ /* a8 */ 0x0000, 0xdbe1, 0x0000, 0x0000, 0xe5c9, 0x0000, 0xedb4, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0c3,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e786xx - offset 0x02f3b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe3d8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe9fb, 0xeaa8, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdb7,
+ /* 90 */ 0x0000, 0x0000, 0xfba7, 0x0000, 0xe9c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfdf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2d9,
+ /* a0 */ 0x0000, 0x0000, 0xdcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe6f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfdf8, 0xfdf9, 0x0000, 0x0000, 0x0000, 0xf6bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e787xx - offset 0x02f7a ***/
+
+ /* 80 */ 0x0000, 0xe7a7, 0x0000, 0xe6d7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd4f3, 0xd4c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6fa, 0x0000,
+ /* 90 */ 0xd7f2, 0x0000, 0xe1c0, 0x0000, 0xdbe2, 0xe6d8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7bd,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0cf, 0xf3be, 0xe2ac,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b7, 0xe0f0, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfdb8, 0xe3e8, 0x0000, 0xd4a7, 0xe8fc,
+
+ /*** Three byte table, leaf: e788xx - offset 0x02fba ***/
+
+ /* 80 */ 0xfad2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8ef, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd6d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf0d0, 0x0000, 0xf7f0, 0xeeb3, 0x0000, 0x0000,
+ /* b0 */ 0xeaba, 0x0000, 0xead3, 0x0000, 0x0000, 0xedc9, 0xddab, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe5ac, 0xfda1, 0x0000, 0xdfd0, 0xecb3, 0x0000,
+
+ /*** Three byte table, leaf: e789xx - offset 0x02ffa ***/
+
+ /* 80 */ 0xdfd1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeded, 0xf8b8,
+ /* 88 */ 0xf7fa, 0x0000, 0x0000, 0x0000, 0xf8ab, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd4ba, 0xe4b3, 0x0000, 0xe9da, 0x0000, 0xdeb6, 0x0000, 0xd9bf,
+ /* a0 */ 0x0000, 0xd9c0, 0xd6ef, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cc,
+ /* a8 */ 0x0000, 0xdaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdfe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf7e5, 0x0000, 0x0000, 0x0000, 0xccb2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78axx - offset 0x0303a ***/
+
+ /* 80 */ 0xdff9, 0xd7e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd4bb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdfa,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccb3, 0x0000, 0x0000, 0xdbf3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78bxx - offset 0x0307a ***/
+
+ /* 80 */ 0xdfd2, 0x0000, 0xceca, 0x0000, 0xeeda, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e4, 0x0000,
+ /* 90 */ 0xfbcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfb7,
+ /* 98 */ 0x0000, 0xeec3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xceea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd7e1, 0xfaf5, 0x0000, 0x0000, 0xd5c9, 0xf8ac,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78cxx - offset 0x030b8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe7d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3e9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd8ed, 0xe3c4, 0xf0f1, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8e5, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe0fa, 0xeec4, 0xd9de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeba2, 0xeba3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcc2, 0xeabb,
+
+ /*** Three byte table, leaf: e78dxx - offset 0x030f8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe8ab, 0xdee2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xedef, 0x0000, 0xe8a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xcff1,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd4bc, 0x0000, 0xfcea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe7be, 0x0000, 0xfcf2, 0x0000, 0x0000, 0xd6b4, 0x0000, 0x0000,
+ /* b8 */ 0xe2ae, 0x0000, 0xd3b7, 0xfacc,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e78exx - offset 0x03134 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfadc, 0x0000, 0xedb5, 0xe1e3,
+ /* 88 */ 0x0000, 0xe8ac, 0x0000, 0xe8dd, 0x0000, 0x0000, 0xefe9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf4bd, 0x0000, 0xcfb8, 0xe9db,
+ /* 98 */ 0xd1ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdac7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebc9,
+ /* a8 */ 0x0000, 0xe8cc, 0x0000, 0x0000, 0x0000, 0xdeb7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd6bc, 0xd3e5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfadd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e78fxx - offset 0x03174 ***/
+
+ /* 80 */ 0xdad6, 0x0000, 0xcab1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdac8, 0xdfa6, 0x0000, 0xf9b3, 0xf2d2, 0x0000, 0xcac4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcecb, 0x0000,
+ /* 98 */ 0x0000, 0xcdf5, 0x0000, 0x0000, 0x0000, 0xfdb0, 0xd5a8, 0x0000,
+ /* a0 */ 0xf1c1, 0x0000, 0x0000, 0xe2e9, 0xdcca, 0xecb4, 0xfac0, 0x0000,
+ /* a8 */ 0x0000, 0xfba8, 0xd0a8, 0x0000, 0x0000, 0xdaec, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ee,
+ /* b8 */ 0x0000, 0xe0fb, 0x0000, 0x0000, 0x0000, 0xefea, 0xfade,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e790xx - offset 0x031b3 ***/
+
+ /* 80 */ 0x0000, 0xe0c4, 0x0000, 0xcfb9, 0x0000, 0xd5ca, 0xd7e2, 0xe2af,
+ /* 88 */ 0x0000, 0xd7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe8cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf6da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xefa2, 0xe2da, 0xf6fc, 0x0000, 0x0000, 0xfbd0, 0xd1ad, 0x0000,
+ /* a8 */ 0xcde4, 0x0000, 0xd1ae, 0xdced, 0xe8ce, 0x0000, 0xf0f9, 0xceb5,
+ /* b0 */ 0xe6fc, 0x0000, 0x0000, 0xd7fb, 0xd0d6, 0xddf5, 0xf7f1, 0x0000,
+ /* b8 */ 0xf6fd, 0x0000, 0xdbf7, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbea,
+
+ /*** Three byte table, leaf: e791xx - offset 0x031f3 ***/
+
+ /* 80 */ 0xe9dc, 0xd9c1, 0x0000, 0xf5f2, 0xe0c5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xead4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c2, 0x0000, 0xeabc,
+ /* 98 */ 0x0000, 0xd2c5, 0xfbd1, 0xe7c0, 0xeba5, 0x0000, 0xdffa, 0xe3a2,
+ /* a0 */ 0xd7b9, 0x0000, 0xe9c3, 0x0000, 0xe8fd, 0xe8af, 0x0000, 0x0000,
+ /* a8 */ 0xf2d3, 0xfba9, 0xd8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cb,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c8,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e792xx - offset 0x03232 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd1af, 0xd7e3, 0x0000, 0x0000, 0x0000, 0xe0c6,
+ /* 88 */ 0x0000, 0xd6a2, 0x0000, 0xedf0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd7f3, 0x0000, 0x0000, 0x0000, 0xfcd4, 0x0000, 0xdad7, 0xccdf,
+ /* a0 */ 0x0000, 0xf2d4, 0x0000, 0xd1b0, 0x0000, 0xcce0, 0x0000, 0xdbfd,
+ /* a8 */ 0xf3bf, 0x0000, 0xf0d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xfcbb, 0x0000, 0xe2b0, 0x0000, 0x0000, 0xe6a5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe2db, 0x0000, 0x0000, 0x0000, 0xdfde, 0x0000, 0xe0c7,
+
+ /*** Three byte table, leaf: e793xx - offset 0x03272 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2ef, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcce1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6ea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7c2, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xceb6, 0x0000, 0xf3c0, 0x0000, 0xcdfe, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xfbd2, 0x0000, 0xf8f8, 0xf7fb, 0x0000, 0x0000, 0xe8bf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b7, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedb6,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e794xx - offset 0x032b1 ***/
+
+ /* 80 */ 0x0000, 0xdcba, 0x0000, 0x0000, 0xccb4, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf1f7, 0x0000, 0x0000, 0x0000, 0xe8b8, 0x0000, 0x0000,
+ /* 98 */ 0xcaf6, 0x0000, 0xe4a4, 0xf4d6, 0x0000, 0x0000, 0x0000, 0xdfe6,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xdfa7, 0x0000, 0xdfe7, 0xe1c1, 0x0000,
+ /* a8 */ 0xe9c4, 0x0000, 0x0000, 0xdccb, 0xe9c5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xefa3, 0xeba6, 0xcba3, 0xe3e9, 0x0000, 0x0000, 0x0000, 0xd1fb,
+ /* b8 */ 0xefa4, 0x0000, 0xefeb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e795xx - offset 0x032ec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcda3, 0x0000, 0x0000, 0xe8e6,
+ /* 90 */ 0x0000, 0xefa5, 0x0000, 0xd3cc, 0xdaed, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd7ba, 0x0000, 0xf2d5, 0xf5e5, 0xd9ef, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf9b4, 0x0000, 0x0000, 0xd5d4, 0xfdcf, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbe3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e1,
+ /* b0 */ 0xecb6, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbfe, 0xd3d7, 0x0000,
+ /* b8 */ 0xd1b1, 0x0000, 0xcbb1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1b2,
+
+ /*** Three byte table, leaf: e796xx - offset 0x0332c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbb2, 0xf1c2,
+ /* 88 */ 0x0000, 0x0000, 0xf4e1, 0xf9b5, 0x0000, 0x0000, 0xe1c3, 0xe1c2,
+ /* 90 */ 0x0000, 0xebf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xe6b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xf8de, 0xf9aa, 0xcaf7, 0x0000, 0xedb7, 0x0000, 0x0000,
+ /* b8 */ 0xd3b8, 0xf2d6, 0x0000, 0x0000, 0xd4d9, 0xeec5, 0xf2f0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e797xx - offset 0x0336b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xcab2, 0x0000, 0x0000, 0xdcbb, 0x0000, 0xf1f8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xecb7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe5ca, 0x0000, 0xf6c0, 0xfddd, 0x0000, 0x0000,
+ /* 98 */ 0xd4e3, 0xcce2, 0x0000, 0xf7d4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd7e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd3c3, 0x0000, 0xd8a6, 0x0000, 0xf6c1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xddf6, 0x0000, 0xcdc0, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e798xx - offset 0x033ab ***/
+
+ /* 80 */ 0xe5dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5cb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe1c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b0,
+ /* a0 */ 0xf4b0, 0xf3ea, 0xdaee, 0x0000, 0xd7bb, 0x0000, 0xe2b1, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd7aa, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e799xx - offset 0x033e9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd6fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4df, 0x0000, 0xcad6, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xeba8, 0x0000, 0x0000, 0x0000, 0xdbfe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf6c2, 0x0000, 0x0000, 0xefbb, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd4fd, 0x0000, 0x0000, 0xe0c8, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe8b9, 0x0000, 0xefa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcda4, 0x0000, 0x0000, 0xd4f4, 0xdba1, 0xdbdc, 0xdbdd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79axx - offset 0x03428 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeedc, 0x0000, 0xcbcb, 0xfcd5,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xceeb, 0x0000,
+ /* 90 */ 0xcdc1, 0x0000, 0x0000, 0xfbd3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ab, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9a9,
+
+ /*** Three byte table, leaf: e79bxx - offset 0x03468 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9dd, 0xdbcd, 0x0000, 0x0000, 0xddce, 0x0000,
+ /* 88 */ 0xe7c3, 0x0000, 0xeccc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf9ec, 0x0000, 0x0000, 0x0000, 0xcbcc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0fc, 0xd4a8, 0x0000, 0xedd3, 0xd8ef,
+ /* a0 */ 0x0000, 0xf2d7, 0x0000, 0xcaf8, 0xdaef, 0x0000, 0x0000, 0xd6d4,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cd, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd8ee, 0x0000, 0xf2c1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xdfd3, 0x0000, 0x0000, 0x0000, 0xdaf0, 0x0000, 0xe2ea,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e79cxx - offset 0x034a7 ***/
+
+ /* 80 */ 0x0000, 0xe0fd, 0x0000, 0x0000, 0xd8f8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xf7af, 0xdab6, 0x0000, 0xcad7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2d8, 0x0000,
+ /* a0 */ 0xd8f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfadf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfef,
+ /* b8 */ 0xd9c2, 0x0000, 0xf0d2, 0x0000, 0xe4d1, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e79dxx - offset 0x034e7 ***/
+
+ /* 80 */ 0xf3b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfae0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xefec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe2b2, 0x0000, 0xd4bd, 0x0000, 0x0000, 0xd9ce, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf4e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd4a9, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc2, 0xe7da,
+
+ /*** Three byte table, leaf: e79exx - offset 0x03527 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf2d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8be, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcad, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2eb, 0xd6fc, 0x0000, 0x0000,
+ /* b0 */ 0xcaf9, 0x0000, 0x0000, 0xd4da, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf4d7, 0xcca1, 0x0000, 0x0000, 0xcfba,
+
+ /*** Three byte table, leaf: e79fxx - offset 0x03567 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b8,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd9c3, 0xd0e8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xe3c5, 0xebf8, 0x0000, 0xf2b1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xcfbb, 0x0000, 0x0000, 0x0000, 0xd3ad, 0xe8e1, 0xceec,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a0xx - offset 0x035a5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xdee3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xddf7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2b2, 0xf3f6, 0xf6db,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7fe, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf8df, 0x0000, 0xf7f2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a1xx - offset 0x035e0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6da,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a6, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xd7bc, 0xcce3, 0x0000, 0x0000, 0xe6db,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdddd, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a2xx - offset 0x0361f ***/
+
+ /* 80 */ 0x0000, 0xd1b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefed,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6de, 0xe4f4, 0xe1ef, 0x0000,
+ /* 90 */ 0x0000, 0xddf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8cf,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcae5, 0x0000, 0x0000, 0x0000, 0xdca1,
+ /* a8 */ 0x0000, 0xe0b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xfcac, 0xfcad, 0xd8a7, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a3xx - offset 0x0365e ***/
+
+ /* 80 */ 0x0000, 0xedb8, 0x0000, 0x0000, 0x0000, 0xdbb6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd6f0, 0xf3af, 0x0000, 0x0000, 0xcda5, 0x0000,
+ /* 90 */ 0xdaf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd8a8, 0x0000, 0x0000, 0x0000, 0xcce4, 0x0000, 0x0000, 0xd1b4,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcad8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdaf2, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7a4xx - offset 0x0369d ***/
+
+ /* 80 */ 0x0000, 0xf5a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5a8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd5ec, 0xd5f8, 0xdaf3, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe3c6, 0x0000, 0x0000, 0x0000, 0xdee4, 0x0000,
+
+ /*** Three byte table, leaf: e7a5xx - offset 0x036dd ***/
+
+ /* 80 */ 0xdee5, 0xd1b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1b6,
+ /* 88 */ 0xd1b7, 0xf2b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe9de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d3, 0xf2b4,
+ /* 98 */ 0x0000, 0x0000, 0xf0d4, 0xcbe4, 0xfbd4, 0xf5e6, 0xe3ea, 0x0000,
+ /* a0 */ 0xdee6, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfd4, 0x0000, 0x0000,
+ /* a8 */ 0xf8f9, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd1b8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6df,
+
+ /*** Three byte table, leaf: e7a6xx - offset 0x0371d ***/
+
+ /* 80 */ 0x0000, 0xd0d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfca1, 0xefee, 0xdcd8,
+ /* 90 */ 0x0000, 0xe9df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5dd, 0xfdfb,
+ /* a8 */ 0x0000, 0x0000, 0xe0c9, 0x0000, 0x0000, 0x0000, 0xd6c9, 0x0000,
+ /* b0 */ 0x0000, 0xd4aa, 0x0000, 0xe5cc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe9e0, 0x0000, 0x0000, 0x0000, 0xd0d8, 0xfca2, 0xd4be,
+
+ /*** Three byte table, leaf: e7a7xx - offset 0x0375d ***/
+
+ /* 80 */ 0xe2b3, 0xdee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xdcbc, 0xd2b6, 0xf5d5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcea1, 0xf5a9, 0x0000, 0x0000, 0xddf9, 0x0000, 0x0000,
+ /* 98 */ 0xddfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0d5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6df, 0x0000, 0xf2da, 0xe4eb,
+ /* a8 */ 0x0000, 0xf2f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xecb9, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7a8xx - offset 0x0379d ***/
+
+ /* 80 */ 0xfdfc, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1aa, 0x0000, 0x0000,
+ /* 88 */ 0xcad9, 0x0000, 0x0000, 0xefef, 0x0000, 0xf5aa, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecf9, 0x0000, 0x0000, 0xf8ad,
+ /* 98 */ 0x0000, 0xf2c2, 0xf6c3, 0x0000, 0xd7d2, 0x0000, 0x0000, 0xf9a2,
+ /* a0 */ 0xf0d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fa, 0x0000,
+ /* b0 */ 0x0000, 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9f3, 0xf2c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd4ab, 0xcab3, 0xcda6, 0x0000, 0xcdc3,
+
+ /*** Three byte table, leaf: e7a9xx - offset 0x037dd ***/
+
+ /* 80 */ 0xcdda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9cf, 0x0000,
+ /* 88 */ 0x0000, 0xf6c4, 0x0000, 0x0000, 0x0000, 0xeedd, 0xe7c4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdfe2, 0xe7db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8b1, 0x0000, 0xfcae, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe5cd, 0x0000, 0x0000, 0x0000, 0xfaeb, 0x0000, 0xcfbc, 0x0000,
+ /* b8 */ 0x0000, 0xcfe2, 0xcdf6, 0x0000, 0x0000, 0xeff0, 0x0000, 0xf4be,
+
+ /*** Three byte table, leaf: e7aaxx - offset 0x0381d ***/
+
+ /* 80 */ 0x0000, 0xd4cd, 0x0000, 0x0000, 0xf3b8, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe9a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf2f2, 0xf3eb, 0x0000, 0xf0d7, 0x0000, 0x0000,
+ /* 98 */ 0xcfd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfdf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe8c0, 0xe8c1, 0x0000, 0x0000, 0x0000, 0xcfe3, 0xe9a2,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd0aa, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7abxx - offset 0x03859 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c1, 0xd0ab, 0x0000, 0xd4e4,
+ /* 88 */ 0x0000, 0x0000, 0xefbc, 0xd8a1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9df,
+ /* 98 */ 0x0000, 0xf3d7, 0x0000, 0x0000, 0x0000, 0xdcbd, 0x0000, 0xcce5,
+ /* a0 */ 0xedf1, 0x0000, 0x0000, 0xf1e2, 0x0000, 0xd4db, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xe2b5, 0x0000, 0x0000, 0xcae6, 0x0000, 0xd3ae,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcce6, 0x0000,
+ /* b8 */ 0x0000, 0xf1d3, 0xf5e7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcada,
+
+ /*** Three byte table, leaf: e7acxx - offset 0x03899 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbee,
+ /* 90 */ 0x0000, 0xe1c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdfe9, 0x0000, 0xeede, 0x0000, 0x0000, 0xf7c2, 0x0000,
+ /* a0 */ 0xd8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddac, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0af, 0xd6bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1ab,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7adxx - offset 0x038d3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9b6, 0x0000,
+ /* 88 */ 0x0000, 0xd4f5, 0x0000, 0xd0c9, 0xefa7, 0xe2ec, 0x0000, 0xdbea,
+ /* 90 */ 0xcecc, 0xf5e8, 0xf7d5, 0x0000, 0xd3cd, 0x0000, 0xf3fe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd0b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0fe, 0x0000, 0xdffb, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6dd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7aexx - offset 0x03911 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbcd,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xefa8, 0x0000, 0x0000, 0x0000, 0xeeb4,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdad8, 0xd1b9, 0x0000, 0xdfa9,
+ /* 98 */ 0x0000, 0x0000, 0xf3b0, 0x0000, 0x0000, 0xccc4, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xceb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefa9, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xdfd5, 0x0000, 0x0000, 0xedd7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xeec6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e7afxx - offset 0x03951 ***/
+
+ /* 80 */ 0xefbd, 0xfcd6, 0x0000, 0x0000, 0xdbf4, 0x0000, 0xefaa, 0xf8b9,
+ /* 88 */ 0x0000, 0xf5e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1c6, 0x0000, 0x0000, 0x0000, 0xd4bf, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdee8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b0xx - offset 0x0398a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ea,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf3c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3af, 0x0000,
+ /* a0 */ 0x0000, 0xcadb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcd7,
+ /* a8 */ 0x0000, 0x0000, 0xedd8, 0xe1c7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d8, 0xd6b3, 0xddad,
+
+ /*** Three byte table, leaf: e7b1xx - offset 0x039ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd5be, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c3, 0xeedf, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd6eb, 0x0000, 0x0000, 0x0000, 0xf4d9, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd7e6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdab7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b2xx - offset 0x03a07 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xddfb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xddcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8a3, 0x0000, 0x0000, 0xdad9, 0x0000, 0xf0d8,
+ /* 98 */ 0xefc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d4, 0x0000, 0xedf2,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5db, 0x0000,
+ /* b0 */ 0x0000, 0xd5dc, 0xf3c4, 0xcbd7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe2b6, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b3xx - offset 0x03a46 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xfbd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3d8, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddd0, 0xf0d9,
+ /* a0 */ 0xcbb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5dd,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xcda7, 0x0000, 0x0000, 0xd0ac, 0x0000,
+
+ /*** Three byte table, leaf: e7b4xx - offset 0x03a86 ***/
+
+ /* 80 */ 0xd1ba, 0x0000, 0xf1c4, 0x0000, 0xe5b3, 0xfbf5, 0xe9e1, 0xfde0,
+ /* 88 */ 0xfcbc, 0x0000, 0xdaa2, 0xdaa3, 0x0000, 0xd2a1, 0x0000, 0x0000,
+ /* 90 */ 0xd2ef, 0x0000, 0x0000, 0x0000, 0xe2ed, 0x0000, 0x0000, 0xdee9,
+ /* 98 */ 0xcedc, 0xf2b5, 0xd0e4, 0xddd1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe1c8, 0xdbb7, 0xdfe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xedb9, 0xf1c5, 0x0000, 0xf3cf, 0xd7ab,
+ /* b0 */ 0xe1ac, 0x0000, 0x0000, 0xe3eb, 0x0000, 0xeec7, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe1c9, 0xcafa, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b5xx - offset 0x03ac4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf0fb, 0xfae1, 0xf0da, 0xcce7, 0xdaf4, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xccbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xceed, 0x0000,
+ /* a0 */ 0x0000, 0xd5a9, 0xfae2, 0x0000, 0x0000, 0x0000, 0xd0e5, 0x0000,
+ /* a8 */ 0xebd6, 0x0000, 0xecdf, 0x0000, 0x0000, 0x0000, 0xdffc, 0x0000,
+ /* b0 */ 0x0000, 0xf7d6, 0xdeea, 0xcbb4, 0x0000, 0x0000, 0xefbe, 0x0000,
+ /* b8 */ 0x0000, 0xccb5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfbd,
+
+ /*** Three byte table, leaf: e7b6xx - offset 0x03b04 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff2, 0xe2b7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcce8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0fc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xd6e0, 0x0000, 0xf1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b8, 0xebab, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcbb5, 0xd8d1, 0x0000, 0xf4ce, 0xf3f7, 0x0000, 0x0000,
+ /* b8 */ 0xd7c6, 0x0000, 0xd1bb, 0xf7aa, 0x0000, 0xedca, 0xd7d3, 0xd8fa,
+
+ /*** Three byte table, leaf: e7b7xx - offset 0x03b44 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6c5,
+ /* 88 */ 0x0000, 0x0000, 0xd1cc, 0xddfc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdffd, 0x0000,
+ /* 98 */ 0xf9e5, 0x0000, 0xe0ca, 0x0000, 0x0000, 0xf2fd, 0xd3b0, 0x0000,
+ /* a0 */ 0xf4f3, 0xdac9, 0x0000, 0xe6de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8ba, 0xe8d0, 0x0000, 0x0000, 0xd8fb, 0x0000, 0x0000, 0xead5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf6c6,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b8xx - offset 0x03b80 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf2db, 0xe4fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8b2, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdada, 0x0000, 0xf2dc, 0xfbd6, 0xe9b2,
+ /* a0 */ 0x0000, 0xeead, 0x0000, 0xfae3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xdcee, 0x0000, 0x0000, 0xf5ea, 0xe6e0,
+ /* b0 */ 0x0000, 0xf0fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ac,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5c5, 0xeee0,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7b9xx - offset 0x03bbf ***/
+
+ /* 80 */ 0x0000, 0xdbe5, 0x0000, 0xddde, 0x0000, 0x0000, 0xd9f0, 0xe9a3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf1f9, 0x0000, 0xf2c4, 0xe0cb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9a4, 0x0000,
+ /* a0 */ 0x0000, 0xe2b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe3b1, 0xfceb, 0xcda8, 0x0000, 0xccb6, 0x0000, 0x0000,
+ /* b0 */ 0xf0db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xe6ba, 0x0000, 0x0000, 0xcda9, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7baxx - offset 0x03bfd ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf3c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d9, 0x0000, 0x0000, 0xefab,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe7c5, 0x0000, 0x0000, 0xe0e9, 0x0000,
+ /* 98 */ 0xf3c5, 0x0000, 0x0000, 0xd4c0, 0xd5bf,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bcxx - offset 0x03c1a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddae, 0x0000,
+ /* b8 */ 0xf9fc, 0x0000, 0xccc0,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bdxx - offset 0x03c55 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a2, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xceb8, 0x0000, 0x0000, 0x0000, 0xd8d2, 0xf9d6, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1aa, 0xced1, 0x0000, 0x0000, 0xf6c7, 0x0000,
+ /* b0 */ 0xdbeb, 0x0000, 0xdffe, 0x0000, 0x0000, 0xd8e1, 0x0000, 0xf7f3,
+ /* b8 */ 0x0000, 0xd7e7, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bexx - offset 0x03c90 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4fe, 0x0000, 0x0000,
+ /* 88 */ 0xd1bc, 0x0000, 0xe5cf, 0x0000, 0xcbb6, 0x0000, 0xdab8, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6be, 0x0000, 0x0000, 0x0000, 0xe2ba, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfd8, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe0cc, 0xebf9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xfdfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xd7e8, 0xcbd8, 0x0000, 0x0000, 0x0000, 0xe9e2, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e7bfxx - offset 0x03ccf ***/
+
+ /* 80 */ 0x0000, 0xe8ba, 0x0000, 0x0000, 0x0000, 0xe3c7, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeccd, 0x0000, 0xecce, 0x0000, 0xd6bf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe3a7, 0x0000, 0xdfd6, 0xfde8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee1,
+ /* a0 */ 0xf6a8, 0xddfd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf8bb, 0x0000, 0xe8d1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf9d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xceee, 0x0000, 0x0000, 0xeccf, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e880xx - offset 0x03d0f ***/
+
+ /* 80 */ 0xe9a5, 0xd6d5, 0x0000, 0xcdc5, 0x0000, 0xedba, 0xd1bd, 0x0000,
+ /* 88 */ 0x0000, 0xcfbe, 0x0000, 0x0000, 0xecbb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xd2b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xcce9, 0x0000, 0xd9c4,
+ /* 98 */ 0xe9fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1be, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xecbc, 0x0000, 0x0000, 0xe5ad, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7b0, 0x0000, 0xccea,
+
+ /*** Three byte table, leaf: e881xx - offset 0x03d4f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xd3c4, 0x0000, 0x0000, 0xd6c0, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd6fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a1, 0x0000,
+ /* 98 */ 0xdebd, 0x0000, 0xf6a9, 0x0000, 0x0000, 0x0000, 0xdaa4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a4,
+ /* b0 */ 0xf5c6, 0x0000, 0xe1a2, 0xe9c6, 0x0000, 0x0000, 0x0000, 0xf2c5,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4e9, 0xd6ec, 0xebd3,
+
+ /*** Three byte table, leaf: e882xx - offset 0x03d8f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecbd, 0xe2dc, 0xdeeb, 0xf0dc,
+ /* 88 */ 0x0000, 0xebbf, 0x0000, 0xd7ce, 0xd1bf, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ab, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf9fd, 0x0000, 0xcadc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xcdc6, 0xf2b6, 0x0000, 0x0000, 0xddfe, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xccb7, 0xdbb8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0e9,
+ /* b0 */ 0x0000, 0xcedd, 0xebc0, 0x0000, 0xfda2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf8cb, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e883xx - offset 0x03dcc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xead6, 0xf1b0, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdbce, 0x0000, 0xf7c3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xdbcf, 0xcba4, 0x0000, 0x0000, 0xf8e0, 0x0000,
+ /* a0 */ 0x0000, 0xfbd7, 0x0000, 0x0000, 0xebca, 0xe0a1, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcecd, 0x0000, 0x0000, 0xd4dc, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfdd8, 0x0000, 0x0000, 0x0000, 0x0000, 0xd2f6,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e884xx - offset 0x03e0a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf2b7, 0x0000, 0x0000, 0xfaf6, 0xf6aa, 0xfaf7,
+ /* 88 */ 0xd8e6, 0x0000, 0xf4b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe8d2, 0x0000, 0xcac5, 0xcceb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe2ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xe2bb, 0x0000, 0xf7ad, 0x0000, 0x0000, 0x0000, 0xf8e1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf3ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xdea1,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e885xx - offset 0x03e49 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe4fd, 0x0000, 0x0000, 0xe3ec, 0x0000,
+ /* 90 */ 0xddaf, 0xddb0, 0x0000, 0x0000, 0xcbb7, 0xe8d3, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1a3, 0xd2e0, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf0fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe9a6, 0xcbf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xedf3, 0xdcd9, 0xe0cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7da,
+
+ /*** Three byte table, leaf: e886xx - offset 0x03e89 ***/
+
+ /* 80 */ 0xdbb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xccae, 0x0000, 0xdadb, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc7,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xddb1, 0x0000, 0xd8af, 0xe3a3, 0x0000, 0x0000,
+ /* a0 */ 0xceef, 0x0000, 0x0000, 0xf2f3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe0ce, 0x0000, 0xf5fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xebec, 0x0000, 0x0000, 0xd3c5, 0xfcec, 0xd2db,
+
+ /*** Three byte table, leaf: e887xx - offset 0x03ec9 ***/
+
+ /* 80 */ 0xd4eb, 0x0000, 0xdea2, 0x0000, 0x0000, 0x0000, 0xe5e6, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b0, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd5c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedf4,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe3ed, 0x0000, 0xe8c2, 0x0000, 0xedf5,
+ /* a8 */ 0xd7fc, 0x0000, 0xedbb, 0x0000, 0x0000, 0xf6ab, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf2b8, 0xf6c8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd3e6, 0xf2dd, 0xcfbf, 0x0000, 0xebac,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e888xx - offset 0x03f08 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfc0, 0x0000, 0xe6a8,
+ /* 88 */ 0xfde9, 0x0000, 0xcfc1, 0x0000, 0xe0df, 0xdeec, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe0a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf4bf, 0xe2ef, 0x0000, 0xd9f1, 0xf1c7,
+ /* a0 */ 0x0000, 0xcbb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf9fe, 0xdbba, 0xdaf5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ec, 0xdadc, 0xfae4,
+ /* b8 */ 0x0000, 0xe0cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e889xx - offset 0x03f48 ***/
+
+ /* 80 */ 0xddb2, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6a9, 0x0000, 0xeff3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf3ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xebfa, 0x0000, 0xf9e6, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcadd, 0xd5de,
+ /* b0 */ 0x0000, 0xcade, 0xdfe4, 0x0000, 0x0000, 0x0000, 0xe6fd, 0x0000,
+ /* b8 */ 0xf5ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4f5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88axx - offset 0x03f87 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xe9e3, 0x0000, 0xedcb, 0xcfe4, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd8d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xddb3, 0xd4ec, 0x0000, 0x0000, 0xf2b9, 0x0000, 0xdfb7,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbce, 0xfbd8, 0x0000,
+ /* a8 */ 0x0000, 0xd0d9, 0x0000, 0x0000, 0xddd2, 0xf7f4, 0xe7dc, 0xe4a5,
+ /* b0 */ 0x0000, 0xfca3, 0x0000, 0xdbbb, 0x0000, 0x0000, 0x0000, 0xf2ba,
+ /* b8 */ 0xe9fd, 0xd0ca, 0x0000, 0xf5d6, 0xd9c5, 0xe4b4, 0x0000, 0xeda7,
+
+ /*** Three byte table, leaf: e88bxx - offset 0x03fc7 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xeabd, 0xe6fe, 0x0000, 0xf7c4, 0xf5ad, 0x0000, 0xd9e0,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcab4, 0x0000, 0x0000, 0xf8e2, 0xcfc2,
+ /* a0 */ 0x0000, 0xecbe, 0x0000, 0x0000, 0x0000, 0xe5b4, 0xcdc8, 0xeec8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe7c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdc9, 0xf9b7,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88cxx - offset 0x04006 ***/
+
+ /* 80 */ 0x0000, 0xf1e8, 0xd9f2, 0xdbf5, 0xcab5, 0xd9c6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd8c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ab,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xedbc, 0x0000, 0x0000, 0xd8d4, 0x0000, 0x0000, 0x0000, 0xdcda,
+ /* b0 */ 0x0000, 0xe2bc, 0x0000, 0x0000, 0xfced, 0xece0, 0xd2fe, 0x0000,
+ /* b8 */ 0xe9c7, 0xe6aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e88dxx - offset 0x04046 ***/
+
+ /* 80 */ 0xe2f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfabb,
+ /* 88 */ 0x0000, 0xf5ae, 0xfbaa, 0x0000, 0x0000, 0x0000, 0x0000, 0xecfb,
+ /* 90 */ 0x0000, 0xecbf, 0xfcd8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd4e5, 0x0000, 0x0000, 0x0000, 0xf9c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeee2,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88exx - offset 0x04082 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd7e9, 0xedf6, 0x0000, 0x0000, 0x0000, 0xdeed, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccec, 0x0000,
+ /* 98 */ 0xe3ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8d4, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfaf8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xddb4, 0xe4b5, 0xd8b0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8d5, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e88fxx - offset 0x040c1 ***/
+
+ /* 80 */ 0x0000, 0xf4ea, 0x0000, 0x0000, 0x0000, 0xceb9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd6e1, 0xcfd2, 0x0000, 0xd0b6, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcea2, 0x0000, 0x0000, 0xf3ee, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf3f8, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdccc, 0x0000, 0xd0cb, 0x0000, 0x0000, 0x0000, 0xfca4,
+ /* b0 */ 0xcdca, 0xd7d4, 0xdea3, 0x0000, 0xe4e0, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xeec9, 0x0000, 0x0000, 0x0000, 0xe2dd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e890xx - offset 0x040ff ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf5fe, 0xd4ac, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd5d1, 0x0000, 0xd8f0, 0xf8c3, 0xead7, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf5d7, 0x0000, 0x0000, 0xd8bf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfdc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xebad, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5aa,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e891xx - offset 0x0413d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe7a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeca,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcae7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf8e3, 0x0000, 0xd4dd, 0x0000, 0x0000, 0xead8, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfbd9, 0xedf7, 0x0000, 0x0000, 0xe5b5,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0ad, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf1f1,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e892xx - offset 0x04178 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe2bd, 0x0000, 0x0000, 0x0000, 0xe3c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd9d5, 0x0000, 0x0000, 0xdfaa, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdbbc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf8e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf1fa, 0x0000, 0x0000, 0xe5b6, 0xf3ef, 0x0000, 0x0000, 0xfbda,
+
+ /*** Three byte table, leaf: e893xx - offset 0x041b8 ***/
+
+ /* 80 */ 0xe1e0, 0x0000, 0xd9ac, 0x0000, 0xf5eb, 0x0000, 0xe0b6, 0x0000,
+ /* 88 */ 0x0000, 0xe9c8, 0x0000, 0xcbcf, 0x0000, 0xe3c9, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xdeee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe2be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdcef, 0x0000, 0xd6a5, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6fe,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e894xx - offset 0x041f5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd9a1, 0x0000, 0xd8c0, 0xdcdb, 0x0000, 0x0000, 0xedbd,
+ /* 98 */ 0xdfb8, 0x0000, 0xeaa5, 0x0000, 0x0000, 0x0000, 0xd7ad, 0x0000,
+ /* a0 */ 0x0000, 0xf3f9, 0x0000, 0xedf8, 0x0000, 0xf5c7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe1ca, 0xebe3, 0x0000, 0xf2de,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8cc, 0x0000, 0xead9,
+
+ /*** Three byte table, leaf: e895xx - offset 0x04235 ***/
+
+ /* 80 */ 0x0000, 0xd3c6, 0x0000, 0xdbe6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf5af, 0x0000, 0x0000, 0x0000, 0x0000, 0xcef0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe9fe, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xfbb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xe2f2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcff2, 0xf7b9, 0xd9f3, 0x0000, 0x0000, 0xe1cb, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e896xx - offset 0x04271 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdadd, 0x0000, 0x0000, 0xdab9,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebfb,
+ /* 90 */ 0x0000, 0xcbb9, 0x0000, 0x0000, 0xedf9, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe0e0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c0, 0x0000,
+ /* a8 */ 0xfdbc, 0xdfb1, 0xe3ef, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a3,
+ /* b0 */ 0xfdb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf0b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e897xx - offset 0x042b0 ***/
+
+ /* 80 */ 0x0000, 0xcdcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xedbe, 0x0000, 0x0000, 0x0000, 0xd5c0, 0xe3f0, 0xedfa,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5ed, 0xe7dd, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f6, 0xe5b7, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xdbe7, 0xe2bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeecb,
+ /* b8 */ 0x0000, 0x0000, 0xd7f4, 0xf0dd, 0x0000, 0x0000, 0x0000, 0xceab,
+
+ /*** Three byte table, leaf: e898xx - offset 0x042f0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe7de, 0x0000, 0x0000, 0x0000, 0xd6d6, 0xe1cc,
+ /* 88 */ 0x0000, 0x0000, 0xe8b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5ee, 0xdca2,
+ /* 98 */ 0x0000, 0x0000, 0xe0d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5b5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a1,
+
+ /*** Three byte table, leaf: e899xx - offset 0x04330 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbdb, 0x0000,
+ /* 90 */ 0xf9cb, 0x0000, 0x0000, 0x0000, 0xcbf3, 0xf4a5, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xfac8, 0xd6d7, 0x0000, 0xe9e5, 0xfbdc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd0,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfbf6,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89axx - offset 0x0436a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdaa5, 0x0000, 0xdbbd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xece2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcdf7, 0xf0de, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xf6c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89bxx - offset 0x043a3 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeef,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd3b1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcee, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe8c3, 0x0000, 0xf1c8, 0x0000, 0x0000, 0x0000, 0xcef1,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ed, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2f4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4b6, 0x0000,
+
+ /*** Three byte table, leaf: e89cxx - offset 0x043e3 ***/
+
+ /* 80 */ 0xf5b9, 0x0000, 0xdcf0, 0xe3f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe8a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf2bb, 0x0000, 0xdea4, 0x0000, 0xdacc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89dxx - offset 0x04415 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcae9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3da, 0x0000, 0xfcd9,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeada,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9c4, 0x0000,
+ /* a8 */ 0xe3a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbdd, 0x0000, 0xefca, 0x0000,
+ /* b8 */ 0xe8c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89exx - offset 0x04453 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebd7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9ad,
+ /* a0 */ 0x0000, 0x0000, 0xfbab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd3d9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xd5a2, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e89fxx - offset 0x0448f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6de, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xdaf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d1, 0x0000, 0x0000, 0xe9a8,
+ /* b0 */ 0x0000, 0x0000, 0xf5f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xfaaf, 0x0000, 0xebfc, 0x0000, 0x0000, 0xe0ea,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a0xx - offset 0x044ce ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3b2, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c5,
+ /* a0 */ 0x0000, 0x0000, 0xf1e3, 0xd5ee, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xcdcc, 0x0000, 0x0000, 0x0000, 0x0000, 0xedd9, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8c1, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a1xx - offset 0x0450e ***/
+
+ /* 80 */ 0xfaec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1eb, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfabc, 0xe6e2, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfae5, 0xe2fa, 0x0000, 0x0000, 0x0000, 0xcab6,
+ /* 98 */ 0x0000, 0xe4b7, 0x0000, 0xeadb, 0x0000, 0xf5fa, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xfbac, 0xcfc3, 0xebfd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf8fa, 0x0000, 0x0000, 0xdfb9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe1f1, 0x0000, 0xd2a4, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5fb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0da, 0xd0db,
+
+ /*** Three byte table, leaf: e8a2xx - offset 0x0454e ***/
+
+ /* 80 */ 0x0000, 0xeabe, 0xd9b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcab7, 0x0000, 0x0000, 0xd3e7, 0x0000, 0xf8e5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd3b2, 0x0000, 0x0000, 0x0000, 0xe2c0, 0xf2df,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcde5, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf9ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdcd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a3xx - offset 0x0458d ***/
+
+ /* 80 */ 0x0000, 0xeeae, 0xd6ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7ea,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e0, 0xebae, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xcfd9, 0x0000, 0x0000, 0xdccd, 0xedfb, 0x0000, 0xdef0,
+ /* a0 */ 0x0000, 0xd7eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xdea5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdfd7, 0xdbd0, 0xdbd1, 0x0000, 0x0000,
+ /* b8 */ 0xd5a3, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b2,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a4xx - offset 0x045cb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdcdc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xcae8, 0x0000, 0xf8e6, 0xdcce, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeadc, 0xdbd2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9b3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf7db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3a8, 0x0000,
+ /* b8 */ 0xd7ae, 0x0000, 0x0000, 0xe0e1, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a5xx - offset 0x0460a ***/
+
+ /* 80 */ 0x0000, 0xcbba, 0x0000, 0x0000, 0xe5d1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0dc,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c1, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd8ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe3a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a4,
+
+ /*** Three byte table, leaf: e8a6xx - offset 0x0464a ***/
+
+ /* 80 */ 0x0000, 0xe9a9, 0x0000, 0xd3c7, 0x0000, 0x0000, 0xdcdd, 0xf8ae,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xccb8, 0x0000, 0x0000, 0x0000, 0xd0ae,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xd8f2, 0x0000, 0x0000, 0xe3ca, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xccaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd4ad, 0xf6d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd0cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xcac6, 0x0000, 0x0000, 0xd5c2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a7xx - offset 0x0468a ***/
+
+ /* 80 */ 0xceba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xcac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfab0, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdfd8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8a8xx - offset 0x046ca ***/
+
+ /* 80 */ 0xe5eb, 0x0000, 0xeff4, 0xddb5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xcdaa, 0x0000, 0xe3f2, 0x0000, 0xfbf7, 0x0000, 0xf7d0, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xfdba, 0x0000, 0x0000, 0xfde1, 0xf6fe,
+ /* 98 */ 0xd1c0, 0x0000, 0x0000, 0xe8c5, 0x0000, 0xe4b8, 0x0000, 0xe1e8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xccc1, 0x0000, 0xd2ed, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbbe, 0x0000, 0x0000, 0xe0e2, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xfac9, 0x0000, 0x0000, 0xe1cd, 0x0000, 0xcab8, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xf2e0, 0xf1c9,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8a9xx - offset 0x04706 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xdef1, 0x0000, 0x0000, 0x0000, 0xf0df, 0xf8c4, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeecc, 0x0000, 0x0000, 0xdef2, 0x0000,
+ /* a0 */ 0xe7c9, 0x0000, 0xe2f3, 0xe7e1, 0x0000, 0x0000, 0xe3cb, 0x0000,
+ /* a8 */ 0x0000, 0xe3cc, 0x0000, 0x0000, 0x0000, 0xcff8, 0xefac, 0x0000,
+ /* b0 */ 0xfdfe, 0xfca5, 0xfab1, 0xdfd9, 0x0000, 0xe0d2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf4da, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8aaxx - offset 0x04741 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1ca, 0x0000, 0xcea3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2bc, 0xece3, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe0a5, 0x0000, 0xf7ab, 0x0000, 0x0000,
+ /* 98 */ 0xebaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5de, 0x0000,
+ /* a0 */ 0xe1a4, 0xcdab, 0x0000, 0xd9f4, 0xe8a6, 0xcdce, 0xe1e9, 0x0000,
+ /* a8 */ 0xfcef, 0x0000, 0xe0e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xe2c1, 0x0000, 0xcea4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdea6, 0x0000, 0x0000, 0xebfe, 0x0000, 0xebdd, 0xf0e0,
+
+ /*** Three byte table, leaf: e8abxx - offset 0x04781 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf4db, 0x0000, 0xe2f4, 0x0000, 0x0000, 0xd3c8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xf4eb, 0x0000, 0xeeb5, 0x0000, 0xf5d8,
+ /* 90 */ 0x0000, 0x0000, 0xd5df, 0x0000, 0x0000, 0x0000, 0xd6e5, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xebb0, 0xf4e3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xe3cd, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f4, 0xfab2,
+ /* a8 */ 0x0000, 0x0000, 0xeff5, 0xcadf, 0x0000, 0xebb1, 0xedbf, 0x0000,
+ /* b0 */ 0x0000, 0xfdc9, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a6, 0xf9a4,
+ /* b8 */ 0xf0b3, 0x0000, 0xe5ec, 0x0000, 0x0000, 0x0000, 0xd1e7, 0x0000,
+
+ /*** Three byte table, leaf: e8acxx - offset 0x047c1 ***/
+
+ /* 80 */ 0xd9c7, 0xe4d7, 0xeadd, 0x0000, 0xd4f7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaba, 0x0000,
+ /* 90 */ 0xdacd, 0x0000, 0x0000, 0x0000, 0xf9cc, 0x0000, 0xe1da, 0xdbbf,
+ /* 98 */ 0x0000, 0xccc5, 0xecd0, 0xcbbb, 0x0000, 0xdef3, 0x0000, 0x0000,
+ /* a0 */ 0xe9aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd9c8, 0x0000, 0x0000, 0xeee3, 0xd7bd, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xcfc4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xd0cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8adxx - offset 0x04800 ***/
+
+ /* 80 */ 0x0000, 0xfca6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf1fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdd2, 0xd1c1,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe3db, 0x0000, 0xd3c9, 0x0000, 0xdccf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcced, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdea7, 0x0000, 0x0000, 0xe6bb,
+ /* b0 */ 0xeca1, 0x0000, 0x0000, 0x0000, 0xccb9, 0x0000, 0x0000, 0xfbde,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7e2, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8aexx - offset 0x04840 ***/
+
+ /* 80 */ 0xd4c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xdca8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe2c2, 0x0000, 0xf3d8, 0xe5d3, 0x0000, 0x0000, 0xf3d9, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf3c6,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b0xx - offset 0x0485b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcddb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdac,
+
+ /*** Three byte table, leaf: e8b1xx - offset 0x0489b ***/
+
+ /* 80 */ 0x0000, 0xfcc3, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e7, 0x0000,
+ /* 88 */ 0xd1c2, 0x0000, 0xf9a5, 0x0000, 0xe8d5, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ce, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd4ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xdfda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xfbdf, 0xe7e3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf8fb, 0xe3cf, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b2xx - offset 0x048d9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xf5b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd8e7, 0x0000, 0xd9c9, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf8af, 0xeff6, 0x0000,
+ /* a0 */ 0xddb6, 0xeeaf, 0xcdf8, 0x0000, 0x0000, 0x0000, 0x0000, 0xdeb8,
+ /* a8 */ 0xfca7, 0xf7fc, 0xf7b1, 0xcebb, 0xf4a1, 0x0000, 0x0000, 0xeecd,
+ /* b0 */ 0xe1ae, 0x0000, 0x0000, 0xecc3, 0xcffe, 0x0000, 0xf8bf, 0xd8e2,
+ /* b8 */ 0xd3e8, 0x0000, 0x0000, 0xdea8, 0xf4e4, 0xecc2, 0x0000, 0xd9f5,
+
+ /*** Three byte table, leaf: e8b3xx - offset 0x04919 ***/
+
+ /* 80 */ 0xf9c5, 0xddd3, 0xd6f1, 0xecfc, 0xfcf0, 0x0000, 0x0000, 0xedc0,
+ /* 88 */ 0xcab9, 0x0000, 0xeee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf2e1, 0x0000, 0xdeb9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xd6f2, 0x0000, 0xdef4, 0x0000, 0xdfdb, 0x0000,
+ /* a0 */ 0xdbd3, 0x0000, 0xfae7, 0xd8e3, 0xf4c1, 0x0000, 0xddb7, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf2f5, 0x0000, 0x0000, 0xd4ae, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6f3, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xddb8, 0xcfc5, 0xdfdf,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b4xx - offset 0x04957 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf2be, 0xf6a1, 0x0000, 0xebcb,
+ /* 88 */ 0xf1fc, 0x0000, 0xf3c7, 0x0000, 0x0000, 0xe0eb, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xedfc, 0x0000, 0x0000, 0xe1db, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 36 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b5xx - offset 0x04973 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeee5, 0x0000, 0xdef5, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xfad3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xf1cb, 0x0000, 0x0000, 0xd0af, 0xddb9, 0x0000, 0x0000, 0xd1c3,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b6xx - offset 0x049ae ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b1, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xeac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf0e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf6ac, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf5d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf0eb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xddba, 0x0000, 0x0000, 0x0000, 0xf2bf,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b7xx - offset 0x049ed ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c5, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xdba2, 0xf2f6, 0x0000, 0x0000, 0xcaba,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf7f5, 0x0000, 0xcbe5, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xeee6, 0x0000, 0xe0d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcea5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6d8,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xd4af, 0x0000, 0x0000,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b8xx - offset 0x04a23 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xe9c9, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3ce,
+ /* 90 */ 0xf4c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbe6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf1a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebb2, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1a2, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8b9xx - offset 0x04a61 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xebb3, 0x0000, 0xf0b4, 0x0000, 0x0000, 0xcbf4,
+ /* 88 */ 0xd4b0, 0xf3b2, 0xfbb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf5ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeee7,
+ /* a0 */ 0xf4b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5ed, 0x0000, 0xcff3, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8baxx - offset 0x04aa0 ***/
+
+ /* 80 */ 0x0000, 0xf0e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeece,
+ /* 88 */ 0x0000, 0x0000, 0xf1cc, 0x0000, 0x0000, 0xe5b8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xd7f5, 0xe3f3, 0xcfe5, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e8bbxx - offset 0x04ae0 ***/
+
+ /* 80 */ 0xcfc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf3b3, 0xe4d8, 0xcff9, 0xcfda, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xfacd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6e3,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xf2e2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xf5ee, 0x0000, 0x0000, 0xcabb, 0x0000, 0x0000, 0xe3dc,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bcxx - offset 0x04b1f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xcef2, 0x0000, 0xd6d9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xeeb0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf4e5, 0xd8c2, 0xdcd0, 0xccee, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd5e0, 0xf6ca, 0xfdca, 0xd8d6, 0xf4cf,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6a6, 0xdcbe,
+ /* a8 */ 0x0000, 0xdbd4, 0xd7c7, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2fe,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xf1cd, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xe2c3, 0xdcde, 0x0000, 0xdcdf, 0x0000, 0x0000, 0xefad, 0xe6ab,
+
+ /*** Three byte table, leaf: e8bdxx - offset 0x04b5f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9dd, 0xeabf, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xefae, 0x0000, 0x0000, 0x0000, 0xf4d0, 0xcef3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe6ac, 0x0000, 0xcede,
+ /* a0 */ 0x0000, 0x0000, 0xd5f9, 0x0000, 0x0000,
+ /* 27 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bexx - offset 0x04b84 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe3f4, 0xcdd0, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd5b8, 0x0000, 0x0000, 0xf7fd, 0x0000,
+ /* a8 */ 0xdca9, 0x0000, 0x0000, 0x0000, 0x0000, 0xdef6, 0x0000, 0xdcaa,
+ /* b0 */ 0xf2e3, 0xe9b4, 0xd2dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e8bfxx - offset 0x04bc2 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe9e6, 0x0000, 0x0000, 0xe3f6, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7ca, 0x0000,
+ /* 90 */ 0x0000, 0xd0ce, 0x0000, 0x0000, 0xdaf7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcabc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xeee8, 0xdade, 0x0000, 0xf2f7, 0x0000, 0x0000,
+ /* b0 */ 0xe2fb, 0x0000, 0xcca6, 0x0000, 0x0000, 0x0000, 0x0000, 0xdabb,
+ /* b8 */ 0x0000, 0xeee9, 0x0000, 0x0000, 0x0000, 0xf5da, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e980xx - offset 0x04c02 ***/
+
+ /* 80 */ 0xf7dc, 0xe1ea, 0xcec1, 0xd4b1, 0x0000, 0xfdb1, 0xe6bd, 0x0000,
+ /* 88 */ 0xfbad, 0x0000, 0x0000, 0xf8e7, 0x0000, 0xe1ce, 0x0000, 0xf7e2,
+ /* 90 */ 0xf5ef, 0xcfc7, 0x0000, 0x0000, 0xd4b2, 0xccef, 0x0000, 0xd4e8,
+ /* 98 */ 0x0000, 0xeecf, 0xf7d7, 0x0000, 0x0000, 0xe0a6, 0xd6c1, 0xe1dc,
+ /* a0 */ 0xf0e3, 0xf1e4, 0xdcf1, 0xd6a7, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4f5, 0x0000,
+ /* b0 */ 0x0000, 0xf1ce, 0xf2e4, 0x0000, 0x0000, 0xd0b0, 0x0000, 0x0000,
+ /* b8 */ 0xecef, 0x0000, 0x0000, 0x0000, 0xf9ba, 0x0000, 0xebb5,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e981xx - offset 0x04c41 ***/
+
+ /* 80 */ 0x0000, 0xd4ed, 0xe2c4, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e7,
+ /* 88 */ 0x0000, 0x0000, 0xebb4, 0xeaa1, 0x0000, 0xf8bc, 0xcea6, 0x0000,
+ /* 90 */ 0xf9c6, 0xfcda, 0x0000, 0xd4b3, 0xd3b9, 0xeade, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xe9ab, 0x0000, 0x0000, 0xe1e1, 0xd3cf, 0xf4f6, 0x0000,
+ /* a0 */ 0xeac0, 0xe1cf, 0x0000, 0xccba, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xeeea, 0x0000, 0x0000, 0x0000, 0xf0e4, 0xf3b4, 0xd4ee,
+ /* b0 */ 0x0000, 0x0000, 0xf2c0, 0x0000, 0x0000, 0xf1e5, 0x0000, 0xf4c3,
+ /* b8 */ 0xe0d4, 0x0000, 0xebb6, 0x0000, 0xd7a1, 0xcbe8, 0x0000, 0xf9ad,
+
+ /*** Three byte table, leaf: e982xx - offset 0x04c81 ***/
+
+ /* 80 */ 0xe9ad, 0xd8e4, 0xfab3, 0xe2c5, 0xfcbd, 0x0000, 0x0000, 0xecc4,
+ /* 88 */ 0xd8b1, 0x0000, 0xdcab, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a4,
+ /* 90 */ 0x0000, 0xebe9, 0x0000, 0x0000, 0x0000, 0xe8bb, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xd8d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xfbae, 0xd1e1, 0x0000, 0x0000, 0xdbc0, 0x0000,
+ /* a8 */ 0xf5be, 0x0000, 0xdef7, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafb,
+ /* b0 */ 0xf7c6, 0xcfc8, 0x0000, 0x0000, 0x0000, 0xe1d0, 0x0000, 0x0000,
+ /* b8 */ 0xeed0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e983xx - offset 0x04cc0 ***/
+
+ /* 80 */ 0x0000, 0xe9f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xcef4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5cd, 0x0000,
+ /* a0 */ 0x0000, 0xcfdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xddbb, 0x0000, 0x0000, 0x0000, 0x0000, 0xceac, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9e8, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b4,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e984xx - offset 0x04cfe ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xe4c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf5db, 0x0000, 0x0000, 0xfac1, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xdea9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4f8,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff7, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xd3b3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e985xx - offset 0x04d35 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xebb7, 0xeff8, 0xf5dc, 0xedcc, 0xdbd5, 0xf1cf, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf1d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xf5b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd9ae, 0xd5ac, 0x0000, 0xe2c6, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda3, 0x0000, 0xfbe5,
+ /* b8 */ 0xdfab,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e986xx - offset 0x04d6e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2f5,
+ /* 88 */ 0x0000, 0xf6ad, 0x0000, 0xf5b3, 0x0000, 0xf0b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xe1a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf5dd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xeca2, 0xedfd, 0x0000, 0xf5b4, 0xfbb8,
+ /* b0 */ 0x0000, 0xdba3, 0x0000, 0x0000, 0xd6ca, 0xcbd9, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e987xx - offset 0x04dae ***/
+
+ /* 80 */ 0xe5d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fa,
+ /* 88 */ 0x0000, 0xebb8, 0x0000, 0xe0b7, 0xd7ec, 0xf1ec, 0xe5af, 0xd5e1,
+ /* 90 */ 0xd7ed, 0xd1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1f2,
+ /* 98 */ 0xeff9, 0x0000, 0x0000, 0x0000, 0xddbc, 0xf6dc, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xf0e5, 0x0000, 0x0000, 0x0000, 0xf4c4,
+ /* a8 */ 0x0000, 0x0000, 0xe9e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3fb,
+ /* 10 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e988xx - offset 0x04de4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4ef, 0x0000, 0x0000,
+ /* 90 */ 0xcca2, 0xf7fe, 0xdfbc, 0x0000, 0x0000, 0x0000, 0x0000, 0xebcd,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0b7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6c2, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0xe8ad, 0x0000, 0x0000, 0x0000, 0x0000, 0xefaf,
+
+ /*** Three byte table, leaf: e989xx - offset 0x04e24 ***/
+
+ /* 80 */ 0xcba5, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbe9, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccc6,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xe6e7, 0x0000, 0x0000, 0xeac7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xdba4, 0x0000, 0xcfc9, 0xe2fc, 0xeffa, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e98axx - offset 0x04e64 ***/
+
+ /* 80 */ 0xebde, 0x0000, 0x0000, 0xf5c8, 0x0000, 0xd4de, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xe0d5, 0x0000, 0xefb0, 0x0000, 0x0000, 0xe2c7, 0x0000,
+ /* 98 */ 0xd9af, 0x0000, 0x0000, 0x0000, 0xf9e7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xe7e5, 0x0000, 0x0000, 0xcfca, 0xe1d1,
+ /* b8 */ 0x0000, 0xe2c8,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98bxx - offset 0x04e9e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xeffb, 0x0000, 0x0000, 0xfaf9,
+ /* 90 */ 0x0000, 0x0000, 0xdcf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a7, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xcbea, 0x0000, 0x0000, 0x0000, 0xcbbc,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98cxx - offset 0x04edb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd6e2, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf5de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf5df, 0x0000, 0xeeb6, 0x0000, 0x0000, 0x0000, 0xe2f6, 0xd3ca,
+ /* a0 */ 0xeffc, 0xd1c4, 0xefb1, 0x0000, 0xd1c5, 0x0000, 0xd0de, 0x0000,
+ /* a8 */ 0xd9e1, 0x0000, 0x0000, 0xe0b8, 0x0000, 0x0000, 0xcdd1, 0xf3b9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98dxx - offset 0x04f13 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xe7cc, 0x0000, 0xd6a8, 0xcea7, 0x0000, 0xd4b5, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4c8, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xd3b4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebb9, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbf5, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf6dd, 0x0000, 0xf1a3,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98exx - offset 0x04f52 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccc7, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ca, 0x0000, 0xe1f0, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xf5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xfbaf, 0x0000, 0x0000, 0x0000, 0xcbd1,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe0, 0xf2e5, 0x0000, 0x0000,
+ /* b0 */ 0xecf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e98fxx - offset 0x04f8f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xf0ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xeeeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9cb, 0x0000,
+ /* a0 */ 0x0000, 0xccf0, 0x0000, 0x0000, 0xd7af, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a1, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e990xx - offset 0x04fcb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfcf5, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xf1a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d6, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xefb2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4d1, 0x0000, 0x0000,
+ /* b8 */ 0xf7a1, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e991xx - offset 0x05007 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf1d1, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xcafc, 0xcafd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xcece, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c8, 0x0000, 0xf3ba,
+
+ /*** Three byte table, leaf: e995xx - offset 0x05047 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xedfe,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e996xx - offset 0x05087 ***/
+
+ /* 80 */ 0xdaa6, 0x0000, 0x0000, 0xe0ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xf8cd, 0x0000, 0xcbd2, 0x0000, 0x0000, 0x0000, 0xebce,
+ /* 90 */ 0x0000, 0xf9d8, 0xf9d9, 0xcae0, 0xdaca, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcba6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xcac8, 0xf9ee, 0xdbec, 0x0000, 0x0000,
+ /* a8 */ 0xd0b1, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5ef, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xe6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xe7a2, 0xe4d9,
+ /* 3 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e997xx - offset 0x050c4 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e1,
+ /* 88 */ 0x0000, 0x0000, 0xfcc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9ef, 0xcff4, 0xf7e6, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcebc, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf4c5, 0xdca3, 0x0000,
+ /* 28 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e998xx - offset 0x050e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xddbd, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0xf4c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xf8a1, 0x0000, 0x0000, 0x0000, 0xe8d6, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xdbc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf0e6, 0x0000, 0x0000, 0x0000, 0xe4b9,
+
+ /*** Three byte table, leaf: e999xx - offset 0x05128 ***/
+
+ /* 80 */ 0xf6ed, 0x0000, 0xf9ae, 0x0000, 0xddbe, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xd7b0, 0xd8e8, 0xcbbd, 0x0000, 0x0000,
+ /* 90 */ 0xf9da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xf8ce, 0xf9f0, 0xe0ed, 0xe3b3, 0xf4b3,
+ /* a0 */ 0x0000, 0x0000, 0xeac2, 0xf2e6, 0xf0b6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0xdbd6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xebe4, 0x0000, 0x0000, 0xf2e7, 0x0000, 0xd7d5, 0xd4b6, 0xf9e8,
+ /* b8 */ 0xd7c1, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5d5,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99axx - offset 0x05166 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe9ea, 0xd7cc, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xd3e9, 0xe2c9, 0x0000, 0xfcdb, 0xcdad, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xccb0, 0xeaa2, 0x0000, 0x0000,
+ /* 98 */ 0xe4f6, 0xd0c0, 0x0000, 0xf0b7, 0xeea1, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0xd7f6, 0x0000, 0x0000, 0x0000, 0xe2ca,
+ /* a8 */ 0xe2cb, 0x0000, 0xfacf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xebdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6cb,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xf4b4, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99bxx - offset 0x051a6 ***/
+
+ /* 80 */ 0xedcd, 0xe4d2, 0x0000, 0x0000, 0xeaa9, 0xe4ba, 0xf3a2, 0xcdd2,
+ /* 88 */ 0x0000, 0xf6cb, 0x0000, 0xf1e6, 0xedc1, 0xe8bc, 0xeed1, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e7, 0xe2cc, 0x0000,
+ /* 98 */ 0x0000, 0xe4aa, 0x0000, 0xf5e1, 0xedda, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0xd7ee, 0xd1f1, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xe9eb, 0xe9ec, 0xe0e4, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaa7,
+ /* b0 */ 0xddd4, 0x0000, 0xeaa3, 0x0000, 0x0000, 0x0000, 0xd6c3, 0xd6f4,
+ /* b8 */ 0x0000, 0xdadf, 0x0000, 0xefb3, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e99cxx - offset 0x051e6 ***/
+
+ /* 80 */ 0xe2cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeffd, 0xf2e8,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xefc5, 0x0000, 0xe7e7, 0x0000, 0x0000, 0xd7fd, 0x0000,
+ /* 98 */ 0x0000, 0xe7ce, 0x0000, 0x0000, 0xdfdc, 0x0000, 0xf9c7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd9f6,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xdfac, 0x0000, 0xd6da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xdca4, 0x0000, 0x0000, 0x0000, 0xf0b8,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99dxx - offset 0x05224 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0xd5fa, 0x0000, 0xe4f7, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xd6c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xf4ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xeffe, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a1, 0x0000, 0xdeaa, 0x0000,
+ /* a0 */ 0x0000, 0xdabc, 0xd8fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfad4, 0x0000, 0x0000, 0x0000, 0xece5, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xfca8, 0x0000, 0x0000, 0xece6,
+ /* b8 */ 0x0000, 0x0000, 0xd8cb,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99exx - offset 0x0525f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xfbb9, 0x0000, 0xe4d3, 0x0000, 0xcdf9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xcfd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcaea, 0x0000, 0x0000, 0xcfd4, 0x0000, 0xf8bd, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e99fxx - offset 0x05299 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4c7, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0xeadf, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xf9db, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd4b7, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xebe5, 0x0000, 0x0000, 0xe1d2, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xeaa4, 0x0000, 0x0000, 0x0000, 0xfac2,
+
+ /*** Three byte table, leaf: e9a0xx - offset 0x052d9 ***/
+
+ /* 80 */ 0xfbe1, 0xfaed, 0xf0a2, 0xccf1, 0x0000, 0xfaa3, 0xe2f7, 0x0000,
+ /* 88 */ 0xe2ce, 0x0000, 0xe9f5, 0x0000, 0xe1eb, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xe7e8, 0xe8d7, 0xdaf8, 0xd4cb, 0x0000, 0x0000, 0x0000, 0xf7f6,
+ /* 98 */ 0xd6c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e9, 0x0000, 0x0000,
+ /* b0 */ 0xfafa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xccf2, 0xf7dd, 0x0000, 0xdeba,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a1xx - offset 0x05315 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcea8, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf0b9, 0xe4fe, 0xe4c9, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d4, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xeac3, 0x0000, 0xefb4, 0x0000, 0x0000, 0x0000, 0xd7be, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe2, 0x0000, 0xcdd3,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xefb5, 0x0000, 0x0000, 0x0000, 0xfae9,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a2xx - offset 0x05345 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xf9a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfbd,
+ /* b0 */ 0x0000, 0xf7c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a3xx - offset 0x05381 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf8fd, 0x0000, 0x0000, 0xf8fc,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xdeab, 0xdbe8, 0x0000, 0x0000, 0xe3dd,
+ /* a0 */ 0x0000, 0xe1e2, 0xd1c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6d0, 0xebe6, 0xdaf9,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xecc7, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdef8, 0xf8e9, 0xe3de,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a4xx - offset 0x053c0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xcef5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xfac3, 0xe5d7, 0x0000, 0xecc8, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf3c9, 0x0000, 0x0000, 0xe4bb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xe6ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefb6, 0x0000,
+ /* a0 */ 0xdcbf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcebd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a5xx - offset 0x053fb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8c3, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd0cf, 0x0000, 0xcffa, 0xf3ca, 0xe0d7, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xd1c7, 0xe9ae, 0x0000, 0xe8bd, 0x0000, 0x0000, 0xfac4,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000,
+ /* 22 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a6xx - offset 0x05425 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2cf, 0x0000,
+ /* 98 */ 0x0000, 0xfac5, 0x0000, 0x0000, 0x0000, 0xf9b8, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdce0, 0x0000, 0x0000,
+ /* a8 */ 0xfbb0, 0x0000, 0x0000, 0x0000, 0xd8a9, 0xe5df, 0xf9a7, 0x0000,
+ /* b0 */ 0x0000, 0xf6ee, 0x0000, 0xf6cc, 0xe2f8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xecf1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9a7xx - offset 0x05464 ***/
+
+ /* 80 */ 0x0000, 0xdae0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0xf1d2, 0xd2cc, 0xcfcb, 0x0000, 0x0000, 0xcabd, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xddbf, 0x0000, 0x0000, 0x0000, 0xf6ef, 0x0000, 0xdef9,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfab4, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xd5ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e7,
+
+ /*** Three byte table, leaf: e9a8xx - offset 0x054a4 ***/
+
+ /* 80 */ 0x0000, 0xdebe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0xdcc0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1c8, 0xd1c9,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0xf8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcbf6, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0xd4f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e2, 0xe1d3,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e9a9xx - offset 0x054e4 ***/
+
+ /* 80 */ 0xd8e9, 0x0000, 0x0000, 0xf8fe, 0x0000, 0xcfcc, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcef6, 0x0000, 0xfad0,
+ /* 98 */ 0x0000, 0x0000, 0xccf3, 0xe6be, 0x0000, 0x0000, 0x0000, 0xf6ae,
+ /* a0 */ 0x0000, 0x0000, 0xd5f0, 0x0000, 0x0000, 0xd1ca, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xfcbe, 0xd5f1,
+ /* 21 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aaxx - offset 0x0550f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xcde9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfab5,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9abxx - offset 0x05548 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xe2d0, 0xf4f7, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xcdd4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe7a3, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdba5,
+ /* 17 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9acxx - offset 0x05577 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe2d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a2,
+ /* a8 */ 0x0000, 0x0000, 0xf7e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0xeaa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd0a1, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9adxx - offset 0x055b6 ***/
+
+ /* 80 */ 0x0000, 0xceda, 0xfbeb, 0xdba6, 0xdbde, 0xd8e5, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeae0,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xd8aa, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6db,
+ /* b0 */ 0x0000, 0x0000,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9aexx - offset 0x055e8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xefc6, 0x0000,
+ /* 90 */ 0x0000, 0xf8ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4d5,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0xcef7, 0x0000, 0x0000, 0xe0d8, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9afxx - offset 0x0561f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xd7ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4ed, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcde6, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xccf4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b0xx - offset 0x05652 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5e3, 0x0000, 0x0000,
+ /* 90 */ 0xe4ca, 0x0000, 0xdce1, 0x0000, 0x0000, 0xf9c8, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfcbf, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xe8a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8c4,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b1xx - offset 0x0568e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbbe,
+ /* 88 */ 0x0000, 0xdcae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7f7,
+ /* 98 */ 0x0000, 0x0000, 0x0000,
+ /* 37 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b3xx - offset 0x056a9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0e8, 0x0000, 0xddc0,
+ /* a8 */ 0x0000, 0xcfcd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0xdcf3, 0xd9b0, 0x0000, 0xe6e9,
+ /* 9 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b4xx - offset 0x056e0 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0xe4bc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0xeac4, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4ec, 0x0000,
+ /* a8 */ 0xe4e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xfbf8,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b5xx - offset 0x0571c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0xccbb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4bd, 0x0000, 0x0000,
+ /* a0 */ 0xcddc, 0xd9f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdddf, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xedce,
+ /* 13 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b6xx - offset 0x0574f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0xd9d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe5a3,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xf9cd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b7xx - offset 0x0578b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcdae, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfce,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0xf6af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0xfdd3, 0xebed, 0xd6dc,
+ /* 5 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b8xx - offset 0x057c6 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0xe5a4, 0x0000, 0x0000, 0x0000, 0xd5b6,
+ /* 33 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9b9xx - offset 0x057e5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6dd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0xf9e9, 0x0000, 0x0000, 0x0000, 0xe7a4, 0x0000, 0xd6e3,
+
+ /*** Three byte table, leaf: e9baxx - offset 0x05825 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xd1cb, 0xd6e4, 0x0000, 0x0000, 0x0000, 0xd5f2,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdefa, 0x0000, 0xd7f8,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd8ea, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfd5, 0xd8fd, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xd8ab, 0x0000, 0x0000, 0xfdcb,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bbxx - offset 0x05864 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0xfcdc, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0a8, 0xd5f3, 0x0000,
+ /* 90 */ 0x0000, 0xfdd9, 0x0000, 0x0000, 0xcca3, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0xd9f9, 0x0000, 0x0000, 0xd3ea, 0xf5f5, 0x0000, 0xefc7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0xd3da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xdabd, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bcxx - offset 0x0589d ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8a8,
+ /* 88 */ 0xdcaf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0a3, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0xcdd5, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xe0a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0xdeac,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bdxx - offset 0x058d9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0xf0ba, 0xeeb1, 0x0000, 0x0000, 0xeeb2, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0xf6cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeed2,
+ /* a0 */ 0x0000, 0xd6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0e5,
+ /* a8 */ 0x0000, 0x0000, 0xf3bb, 0x0000, 0xe5e1, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4cb,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e9bexx - offset 0x05911 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7a3, 0x0000, 0x0000,
+ /* 90 */ 0xdbc2, 0x0000, 0x0000, 0x0000, 0x0000, 0xcafe, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0xcfcf, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: eab0xx - offset 0x05951 ***/
+
+ /* 80 */ 0xb0a1, 0xb0a2, 0x8141, 0x8142, 0xb0a3, 0x8143, 0x8144, 0xb0a4,
+ /* 88 */ 0xb0a5, 0xb0a6, 0xb0a7, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149,
+ /* 90 */ 0xb0a8, 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af,
+ /* 98 */ 0x814a, 0xb0b0, 0xb0b1, 0xb0b2, 0xb0b3, 0xb0b4, 0x814b, 0x814c,
+ /* a0 */ 0xb0b5, 0x814d, 0x814e, 0x814f, 0xb0b6, 0x8150, 0x8151, 0x8152,
+ /* a8 */ 0x8153, 0x8154, 0x8155, 0x8156, 0xb0b7, 0xb0b8, 0x8157, 0xb0b9,
+ /* b0 */ 0xb0ba, 0xb0bb, 0x8158, 0x8159, 0x815a, 0x8161, 0x8162, 0x8163,
+ /* b8 */ 0xb0bc, 0xb0bd, 0x8164, 0x8165, 0xb0be, 0x8166, 0x8167, 0x8168,
+
+ /*** Three byte table, leaf: eab1xx - offset 0x05991 ***/
+
+ /* 80 */ 0xb0bf, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f,
+ /* 88 */ 0x8170, 0x8171, 0x8172, 0xb0c0, 0x8173, 0xb0c1, 0x8174, 0x8175,
+ /* 90 */ 0x8176, 0x8177, 0x8178, 0x8179, 0xb0c2, 0x817a, 0x8181, 0x8182,
+ /* 98 */ 0xb0c3, 0x8183, 0x8184, 0x8185, 0xb0c4, 0x8186, 0x8187, 0x8188,
+ /* a0 */ 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190,
+ /* a8 */ 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198,
+ /* b0 */ 0xb0c5, 0xb0c6, 0x8199, 0x819a, 0xb0c7, 0x819b, 0x819c, 0xb0c8,
+ /* b8 */ 0xb0c9, 0x819d, 0xb0ca, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2,
+
+ /*** Three byte table, leaf: eab2xx - offset 0x059d1 ***/
+
+ /* 80 */ 0xb0cb, 0xb0cc, 0x81a3, 0xb0cd, 0xb0ce, 0xb0cf, 0xb0d0, 0x81a4,
+ /* 88 */ 0x81a5, 0xb0d1, 0xb0d2, 0xb0d3, 0xb0d4, 0x81a6, 0x81a7, 0x81a8,
+ /* 90 */ 0xb0d5, 0x81a9, 0x81aa, 0x81ab, 0xb0d6, 0x81ac, 0x81ad, 0x81ae,
+ /* 98 */ 0x81af, 0x81b0, 0x81b1, 0x81b2, 0xb0d7, 0xb0d8, 0x81b3, 0xb0d9,
+ /* a0 */ 0xb0da, 0xb0db, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9,
+ /* a8 */ 0xb0dc, 0xb0dd, 0xb0de, 0x81ba, 0xb0df, 0x81bb, 0x81bc, 0xb0e0,
+ /* b0 */ 0xb0e1, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3,
+ /* b8 */ 0xb0e2, 0xb0e3, 0x81c4, 0xb0e4, 0xb0e5, 0xb0e6, 0x81c5, 0x81c6,
+
+ /*** Three byte table, leaf: eab3xx - offset 0x05a11 ***/
+
+ /* 80 */ 0x81c7, 0xb0e7, 0x81c8, 0x81c9, 0xb0e8, 0x81ca, 0x81cb, 0x81cc,
+ /* 88 */ 0xb0e9, 0x81cd, 0x81ce, 0x81cf, 0xb0ea, 0x81d0, 0x81d1, 0x81d2,
+ /* 90 */ 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0xb0eb, 0x81d8, 0xb0ec,
+ /* 98 */ 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0,
+ /* a0 */ 0xb0ed, 0xb0ee, 0x81e1, 0x81e2, 0xb0ef, 0x81e3, 0x81e4, 0xb0f0,
+ /* a8 */ 0xb0f1, 0x81e5, 0xb0f2, 0x81e6, 0xb0f3, 0x81e7, 0x81e8, 0xb0f4,
+ /* b0 */ 0xb0f5, 0xb0f6, 0x81e9, 0xb0f7, 0x81ea, 0xb0f8, 0xb0f9, 0x81eb,
+ /* b8 */ 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0xb0fa, 0xb0fb, 0x81f0, 0x81f1,
+
+ /*** Three byte table, leaf: eab4xx - offset 0x05a51 ***/
+
+ /* 80 */ 0xb0fc, 0x81f2, 0x81f3, 0x81f4, 0xb0fd, 0x81f5, 0xb0fe, 0x81f6,
+ /* 88 */ 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0xb1a1, 0xb1a2, 0x81fb, 0xb1a3,
+ /* 90 */ 0x81fc, 0xb1a4, 0x81fd, 0x81fe, 0x8241, 0x8242, 0x8243, 0x8244,
+ /* 98 */ 0xb1a5, 0x8245, 0x8246, 0x8247, 0xb1a6, 0x8248, 0x8249, 0x824a,
+ /* a0 */ 0xb1a7, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251,
+ /* a8 */ 0x8252, 0xb1a8, 0x8253, 0x8254, 0xb1a9, 0xb1aa, 0x8255, 0x8256,
+ /* b0 */ 0x8257, 0x8258, 0x8259, 0x825a, 0xb1ab, 0xb1ac, 0x8261, 0x8262,
+ /* b8 */ 0xb1ad, 0x8263, 0x8264, 0x8265, 0xb1ae, 0x8266, 0x8267, 0x8268,
+
+ /*** Three byte table, leaf: eab5xx - offset 0x05a91 ***/
+
+ /* 80 */ 0x8269, 0x826a, 0x826b, 0x826c, 0xb1af, 0xb1b0, 0x826d, 0xb1b1,
+ /* 88 */ 0x826e, 0xb1b2, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274,
+ /* 90 */ 0xb1b3, 0x8275, 0x8276, 0x8277, 0xb1b4, 0x8278, 0x8279, 0x827a,
+ /* 98 */ 0xb1b5, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287,
+ /* a0 */ 0x8288, 0xb1b6, 0x8289, 0xb1b7, 0x828a, 0x828b, 0x828c, 0x828d,
+ /* a8 */ 0x828e, 0x828f, 0x8290, 0x8291, 0xb1b8, 0xb1b9, 0x8292, 0x8293,
+ /* b0 */ 0xb1ba, 0x8294, 0x8295, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0x8296,
+ /* b8 */ 0x8297, 0x8298, 0x8299, 0xb1bf, 0xb1c0, 0xb1c1, 0x829a, 0xb1c2,
+
+ /*** Three byte table, leaf: eab6xx - offset 0x05ad1 ***/
+
+ /* 80 */ 0x829b, 0xb1c3, 0xb1c4, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0,
+ /* 88 */ 0xb1c5, 0xb1c6, 0x82a1, 0x82a2, 0xb1c7, 0x82a3, 0x82a4, 0x82a5,
+ /* 90 */ 0xb1c8, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac,
+ /* 98 */ 0x82ad, 0x82ae, 0x82af, 0x82b0, 0xb1c9, 0xb1ca, 0x82b1, 0x82b2,
+ /* a0 */ 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0xb1cb, 0x82b7, 0x82b8, 0x82b9,
+ /* a8 */ 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1,
+ /* b0 */ 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0xb1cc,
+ /* b8 */ 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0,
+
+ /*** Three byte table, leaf: eab7xx - offset 0x05b11 ***/
+
+ /* 80 */ 0xb1cd, 0xb1ce, 0x82d1, 0x82d2, 0xb1cf, 0x82d3, 0x82d4, 0x82d5,
+ /* 88 */ 0xb1d0, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc,
+ /* 90 */ 0xb1d1, 0xb1d2, 0x82dd, 0xb1d3, 0x82de, 0x82df, 0x82e0, 0x82e1,
+ /* 98 */ 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0xb1d4, 0x82e6, 0x82e7, 0x82e8,
+ /* a0 */ 0xb1d5, 0x82e9, 0x82ea, 0x82eb, 0xb1d6, 0x82ec, 0x82ed, 0x82ee,
+ /* a8 */ 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6,
+ /* b0 */ 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe,
+ /* b8 */ 0xb1d7, 0xb1d8, 0x8341, 0x8342, 0xb1d9, 0x8343, 0x8344, 0xb1da,
+
+ /*** Three byte table, leaf: eab8xx - offset 0x05b51 ***/
+
+ /* 80 */ 0xb1db, 0xb1dc, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a,
+ /* 88 */ 0xb1dd, 0xb1de, 0x834b, 0xb1df, 0x834c, 0xb1e0, 0x834d, 0x834e,
+ /* 90 */ 0x834f, 0x8350, 0x8351, 0x8352, 0xb1e1, 0x8353, 0x8354, 0x8355,
+ /* 98 */ 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x8361, 0x8362, 0x8363,
+ /* a0 */ 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b,
+ /* a8 */ 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373,
+ /* b0 */ 0xb1e2, 0xb1e3, 0x8374, 0x8375, 0xb1e4, 0x8376, 0x8377, 0xb1e5,
+ /* b8 */ 0xb1e6, 0x8378, 0xb1e7, 0x8379, 0x837a, 0x8381, 0x8382, 0x8383,
+
+ /*** Three byte table, leaf: eab9xx - offset 0x05b91 ***/
+
+ /* 80 */ 0xb1e8, 0xb1e9, 0x8384, 0xb1ea, 0x8385, 0xb1eb, 0xb1ec, 0x8386,
+ /* 88 */ 0x8387, 0x8388, 0xb1ed, 0x8389, 0xb1ee, 0xb1ef, 0xb1f0, 0x838a,
+ /* 90 */ 0xb1f1, 0x838b, 0x838c, 0x838d, 0xb1f2, 0x838e, 0xb1f3, 0x838f,
+ /* 98 */ 0x8390, 0x8391, 0x8392, 0x8393, 0xb1f4, 0xb1f5, 0x8394, 0xb1f6,
+ /* a0 */ 0xb1f7, 0xb1f8, 0x8395, 0x8396, 0x8397, 0xb1f9, 0x8398, 0x8399,
+ /* a8 */ 0xb1fa, 0xb1fb, 0x839a, 0x839b, 0xb1fc, 0x839c, 0x839d, 0x839e,
+ /* b0 */ 0xb1fd, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5,
+ /* b8 */ 0xb1fe, 0xb2a1, 0x83a6, 0xb2a2, 0xb2a3, 0xb2a4, 0x83a7, 0x83a8,
+
+ /*** Three byte table, leaf: eabaxx - offset 0x05bd1 ***/
+
+ /* 80 */ 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0xb2a5, 0xb2a6, 0x83ad, 0x83ae,
+ /* 88 */ 0x83af, 0x83b0, 0x83b1, 0x83b2, 0xb2a7, 0x83b3, 0x83b4, 0x83b5,
+ /* 90 */ 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd,
+ /* 98 */ 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5,
+ /* a0 */ 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd,
+ /* a8 */ 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5,
+ /* b0 */ 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd,
+ /* b8 */ 0x83de, 0x83df, 0x83e0, 0x83e1, 0xb2a8, 0xb2a9, 0xb2aa, 0x83e2,
+
+ /*** Three byte table, leaf: eabbxx - offset 0x05c11 ***/
+
+ /* 80 */ 0xb2ab, 0x83e3, 0x83e4, 0x83e5, 0xb2ac, 0x83e6, 0x83e7, 0x83e8,
+ /* 88 */ 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0xb2ad, 0xb2ae, 0x83ed, 0xb2af,
+ /* 90 */ 0xb2b0, 0xb2b1, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3,
+ /* 98 */ 0xb2b2, 0xb2b3, 0x83f4, 0x83f5, 0xb2b4, 0x83f6, 0x83f7, 0x83f8,
+ /* a0 */ 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x8441, 0x8442,
+ /* a8 */ 0xb2b5, 0x8443, 0x8444, 0xb2b6, 0x8445, 0xb2b7, 0x8446, 0x8447,
+ /* b0 */ 0x8448, 0x8449, 0x844a, 0x844b, 0xb2b8, 0x844c, 0x844d, 0x844e,
+ /* b8 */ 0xb2b9, 0x844f, 0x8450, 0x8451, 0xb2ba, 0x8452, 0x8453, 0x8454,
+
+ /*** Three byte table, leaf: eabcxx - offset 0x05c51 ***/
+
+ /* 80 */ 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x8461, 0xb2bb,
+ /* 88 */ 0xb2bc, 0x8462, 0x8463, 0x8464, 0x8465, 0xb2bd, 0x8466, 0x8467,
+ /* 90 */ 0xb2be, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e,
+ /* 98 */ 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476,
+ /* a0 */ 0x8477, 0x8478, 0x8479, 0x847a, 0x8481, 0x8482, 0x8483, 0x8484,
+ /* a8 */ 0x8485, 0x8486, 0x8487, 0x8488, 0xb2bf, 0xb2c0, 0x8489, 0x848a,
+ /* b0 */ 0xb2c1, 0x848b, 0xb2c2, 0x848c, 0xb2c3, 0x848d, 0x848e, 0x848f,
+ /* b8 */ 0x8490, 0x8491, 0x8492, 0x8493, 0xb2c4, 0xb2c5, 0x8494, 0xb2c6,
+
+ /*** Three byte table, leaf: eabdxx - offset 0x05c91 ***/
+
+ /* 80 */ 0x8495, 0xb2c7, 0xb2c8, 0xb2c9, 0x8496, 0x8497, 0x8498, 0x8499,
+ /* 88 */ 0xb2ca, 0xb2cb, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f,
+ /* 90 */ 0xb2cc, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6,
+ /* 98 */ 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0xb2cd, 0xb2ce, 0x84ab, 0x84ac,
+ /* a0 */ 0x84ad, 0x84ae, 0x84af, 0x84b0, 0xb2cf, 0xb2d0, 0x84b1, 0x84b2,
+ /* a8 */ 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba,
+ /* b0 */ 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2,
+ /* b8 */ 0x84c3, 0xb2d1, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84c9,
+
+ /*** Three byte table, leaf: eabexx - offset 0x05cd1 ***/
+
+ /* 80 */ 0xb2d2, 0x84ca, 0x84cb, 0x84cc, 0xb2d3, 0x84cd, 0x84ce, 0x84cf,
+ /* 88 */ 0xb2d4, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6,
+ /* 90 */ 0xb2d5, 0xb2d6, 0x84d7, 0x84d8, 0x84d9, 0xb2d7, 0x84da, 0x84db,
+ /* 98 */ 0x84dc, 0x84dd, 0x84de, 0x84df, 0xb2d8, 0x84e0, 0x84e1, 0x84e2,
+ /* a0 */ 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea,
+ /* a8 */ 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2,
+ /* b0 */ 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa,
+ /* b8 */ 0xb2d9, 0xb2da, 0x84fb, 0x84fc, 0xb2db, 0x84fd, 0x84fe, 0x8541,
+
+ /*** Three byte table, leaf: eabfxx - offset 0x05d11 ***/
+
+ /* 80 */ 0xb2dc, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0xb2dd,
+ /* 88 */ 0xb2de, 0xb2df, 0x8548, 0xb2e0, 0x8549, 0xb2e1, 0xb2e2, 0x854a,
+ /* 90 */ 0x854b, 0x854c, 0x854d, 0x854e, 0xb2e3, 0x854f, 0x8550, 0x8551,
+ /* 98 */ 0x8552, 0x8553, 0x8554, 0x8555, 0xb2e4, 0x8556, 0x8557, 0x8558,
+ /* a0 */ 0x8559, 0x855a, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566,
+ /* a8 */ 0xb2e5, 0xb2e6, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c,
+ /* b0 */ 0xb2e7, 0xb2e8, 0x856d, 0x856e, 0xb2e9, 0x856f, 0x8570, 0x8571,
+ /* b8 */ 0xb2ea, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578,
+
+ /*** Three byte table, leaf: eb80xx - offset 0x05d51 ***/
+
+ /* 80 */ 0xb2eb, 0xb2ec, 0x8579, 0x857a, 0xb2ed, 0x8581, 0x8582, 0x8583,
+ /* 88 */ 0x8584, 0x8585, 0x8586, 0x8587, 0xb2ee, 0x8588, 0x8589, 0x858a,
+ /* 90 */ 0xb2ef, 0x858b, 0x858c, 0x858d, 0xb2f0, 0x858e, 0x858f, 0x8590,
+ /* 98 */ 0x8591, 0x8592, 0x8593, 0x8594, 0xb2f1, 0xb2f2, 0x8595, 0x8596,
+ /* a0 */ 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e,
+ /* a8 */ 0xb2f3, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5,
+ /* b0 */ 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad,
+ /* b8 */ 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5,
+
+ /*** Three byte table, leaf: eb81xx - offset 0x05d91 ***/
+
+ /* 80 */ 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0xb2f4, 0xb2f5, 0x85ba, 0x85bb,
+ /* 88 */ 0xb2f6, 0x85bc, 0xb2f7, 0x85bd, 0xb2f8, 0x85be, 0xb2f9, 0x85bf,
+ /* 90 */ 0x85c0, 0x85c1, 0x85c2, 0xb2fa, 0xb2fb, 0xb2fc, 0x85c3, 0xb2fd,
+ /* 98 */ 0x85c4, 0xb2fe, 0x85c5, 0x85c6, 0x85c7, 0xb3a1, 0x85c8, 0x85c9,
+ /* a0 */ 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1,
+ /* a8 */ 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9,
+ /* b0 */ 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1,
+ /* b8 */ 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0xb3a2, 0xb3a3, 0x85e6, 0x85e7,
+
+ /*** Three byte table, leaf: eb82xx - offset 0x05dd1 ***/
+
+ /* 80 */ 0xb3a4, 0x85e8, 0x85e9, 0x85ea, 0xb3a5, 0x85eb, 0x85ec, 0x85ed,
+ /* 88 */ 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0xb3a6, 0xb3a7, 0x85f2, 0xb3a8,
+ /* 90 */ 0x85f3, 0xb3a9, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9,
+ /* 98 */ 0xb3aa, 0xb3ab, 0xb3ac, 0x85fa, 0xb3ad, 0x85fb, 0x85fc, 0xb3ae,
+ /* a0 */ 0xb3af, 0xb3b0, 0xb3b1, 0x85fd, 0x85fe, 0x8641, 0x8642, 0x8643,
+ /* a8 */ 0xb3b2, 0xb3b3, 0x8644, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8,
+ /* b0 */ 0x8645, 0xb3b9, 0x8646, 0xb3ba, 0xb3bb, 0xb3bc, 0x8647, 0x8648,
+ /* b8 */ 0xb3bd, 0x8649, 0x864a, 0x864b, 0xb3be, 0x864c, 0x864d, 0x864e,
+
+ /*** Three byte table, leaf: eb83xx - offset 0x05e11 ***/
+
+ /* 80 */ 0x864f, 0x8650, 0x8651, 0x8652, 0xb3bf, 0xb3c0, 0x8653, 0xb3c1,
+ /* 88 */ 0xb3c2, 0xb3c3, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,
+ /* 90 */ 0xb3c4, 0xb3c5, 0x865a, 0x8661, 0xb3c6, 0x8662, 0x8663, 0x8664,
+ /* 98 */ 0xb3c7, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b,
+ /* a0 */ 0xb3c8, 0x866c, 0x866d, 0x866e, 0x866f, 0xb3c9, 0x8670, 0x8671,
+ /* a8 */ 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,
+ /* b0 */ 0x867a, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687,
+ /* b8 */ 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f,
+
+ /*** Three byte table, leaf: eb84xx - offset 0x05e51 ***/
+
+ /* 80 */ 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697,
+ /* 88 */ 0xb3ca, 0xb3cb, 0x8698, 0xb3cc, 0xb3cd, 0x8699, 0x869a, 0x869b,
+ /* 90 */ 0xb3ce, 0x869c, 0xb3cf, 0xb3d0, 0x869d, 0x869e, 0x869f, 0x86a0,
+ /* 98 */ 0xb3d1, 0xb3d2, 0x86a1, 0xb3d3, 0xb3d4, 0xb3d5, 0x86a2, 0x86a3,
+ /* a0 */ 0x86a4, 0x86a5, 0x86a6, 0xb3d6, 0xb3d7, 0xb3d8, 0x86a7, 0x86a8,
+ /* a8 */ 0xb3d9, 0x86a9, 0x86aa, 0x86ab, 0xb3da, 0x86ac, 0x86ad, 0x86ae,
+ /* b0 */ 0x86af, 0x86b0, 0x86b1, 0x86b2, 0xb3db, 0xb3dc, 0x86b3, 0xb3dd,
+ /* b8 */ 0xb3de, 0xb3df, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9,
+
+ /*** Three byte table, leaf: eb85xx - offset 0x05e91 ***/
+
+ /* 80 */ 0xb3e0, 0xb3e1, 0x86ba, 0x86bb, 0xb3e2, 0x86bc, 0x86bd, 0x86be,
+ /* 88 */ 0xb3e3, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5,
+ /* 90 */ 0xb3e4, 0xb3e5, 0x86c6, 0x86c7, 0xb3e6, 0xb3e7, 0x86c8, 0x86c9,
+ /* 98 */ 0xb3e8, 0x86ca, 0x86cb, 0x86cc, 0xb3e9, 0x86cd, 0x86ce, 0x86cf,
+ /* a0 */ 0xb3ea, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6,
+ /* a8 */ 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de,
+ /* b0 */ 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6,
+ /* b8 */ 0xb3eb, 0xb3ec, 0x86e7, 0x86e8, 0xb3ed, 0x86e9, 0x86ea, 0x86eb,
+
+ /*** Three byte table, leaf: eb86xx - offset 0x05ed1 ***/
+
+ /* 80 */ 0xb3ee, 0x86ec, 0xb3ef, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1,
+ /* 88 */ 0xb3f0, 0xb3f1, 0x86f2, 0xb3f2, 0x86f3, 0xb3f3, 0x86f4, 0x86f5,
+ /* 90 */ 0x86f6, 0x86f7, 0xb3f4, 0xb3f5, 0xb3f6, 0x86f8, 0x86f9, 0x86fa,
+ /* 98 */ 0xb3f7, 0x86fb, 0x86fc, 0x86fd, 0xb3f8, 0x86fe, 0x8741, 0x8742,
+ /* a0 */ 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a,
+ /* a8 */ 0xb3f9, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751,
+ /* b0 */ 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759,
+ /* b8 */ 0x875a, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767,
+
+ /*** Three byte table, leaf: eb87xx - offset 0x05f11 ***/
+
+ /* 80 */ 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f,
+ /* 88 */ 0x8770, 0x8771, 0x8772, 0x8773, 0xb3fa, 0x8774, 0x8775, 0x8776,
+ /* 90 */ 0xb3fb, 0x8777, 0x8778, 0x8779, 0xb3fc, 0x877a, 0x8781, 0x8782,
+ /* 98 */ 0x8783, 0x8784, 0x8785, 0x8786, 0xb3fd, 0xb3fe, 0x8787, 0xb4a1,
+ /* a0 */ 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f,
+ /* a8 */ 0xb4a2, 0xb4a3, 0x8790, 0x8791, 0xb4a4, 0x8792, 0x8793, 0x8794,
+ /* b0 */ 0xb4a5, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b,
+ /* b8 */ 0x879c, 0xb4a6, 0x879d, 0xb4a7, 0x879e, 0xb4a8, 0x879f, 0x87a0,
+
+ /*** Three byte table, leaf: eb88xx - offset 0x05f51 ***/
+
+ /* 80 */ 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0xb4a9, 0xb4aa, 0x87a5, 0x87a6,
+ /* 88 */ 0xb4ab, 0x87a7, 0x87a8, 0xb4ac, 0xb4ad, 0x87a9, 0x87aa, 0x87ab,
+ /* 90 */ 0x87ac, 0x87ad, 0x87ae, 0x87af, 0xb4ae, 0xb4af, 0x87b0, 0xb4b0,
+ /* 98 */ 0x87b1, 0xb4b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7,
+ /* a0 */ 0xb4b2, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be,
+ /* a8 */ 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6,
+ /* b0 */ 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0xb4b3, 0x87cb, 0x87cc, 0x87cd,
+ /* b8 */ 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0xb4b4, 0x87d2, 0x87d3, 0x87d4,
+
+ /*** Three byte table, leaf: eb89xx - offset 0x05f91 ***/
+
+ /* 80 */ 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc,
+ /* 88 */ 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4,
+ /* 90 */ 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec,
+ /* 98 */ 0xb4b5, 0x87ed, 0x87ee, 0x87ef, 0xb4b6, 0x87f0, 0x87f1, 0x87f2,
+ /* a0 */ 0xb4b7, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9,
+ /* a8 */ 0xb4b8, 0xb4b9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8841,
+ /* b0 */ 0x8842, 0x8843, 0x8844, 0x8845, 0xb4ba, 0xb4bb, 0x8846, 0x8847,
+ /* b8 */ 0x8848, 0x8849, 0x884a, 0x884b, 0xb4bc, 0x884c, 0x884d, 0x884e,
+
+ /*** Three byte table, leaf: eb8axx - offset 0x05fd1 ***/
+
+ /* 80 */ 0x884f, 0x8850, 0x8851, 0x8852, 0xb4bd, 0xb4be, 0x8853, 0x8854,
+ /* 88 */ 0x8855, 0xb4bf, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x8861,
+ /* 90 */ 0xb4c0, 0xb4c1, 0x8862, 0x8863, 0xb4c2, 0x8864, 0x8865, 0x8866,
+ /* 98 */ 0xb4c3, 0xb4c4, 0xb4c5, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b,
+ /* a0 */ 0xb4c6, 0xb4c7, 0x886c, 0xb4c8, 0x886d, 0xb4c9, 0xb4ca, 0x886e,
+ /* a8 */ 0x886f, 0x8870, 0xb4cb, 0x8871, 0xb4cc, 0x8872, 0x8873, 0x8874,
+ /* b0 */ 0xb4cd, 0x8875, 0x8876, 0x8877, 0xb4ce, 0x8878, 0x8879, 0x887a,
+ /* b8 */ 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888,
+
+ /*** Three byte table, leaf: eb8bxx - offset 0x06011 ***/
+
+ /* 80 */ 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890,
+ /* 88 */ 0xb4cf, 0xb4d0, 0x8891, 0x8892, 0xb4d1, 0x8893, 0x8894, 0x8895,
+ /* 90 */ 0xb4d2, 0x8896, 0xb4d3, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b,
+ /* 98 */ 0xb4d4, 0xb4d5, 0x889c, 0xb4d6, 0x889d, 0xb4d7, 0x889e, 0x889f,
+ /* a0 */ 0x88a0, 0x88a1, 0xb4d8, 0x88a2, 0xb4d9, 0xb4da, 0xb4db, 0x88a3,
+ /* a8 */ 0xb4dc, 0x88a4, 0x88a5, 0xb4dd, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1,
+ /* b0 */ 0x88a6, 0x88a7, 0x88a8, 0xb4e2, 0xb4e3, 0xb4e4, 0x88a9, 0xb4e5,
+ /* b8 */ 0xb4e6, 0xb4e7, 0xb4e8, 0xb4e9, 0x88aa, 0x88ab, 0x88ac, 0xb4ea,
+
+ /*** Three byte table, leaf: eb8cxx - offset 0x06051 ***/
+
+ /* 80 */ 0xb4eb, 0xb4ec, 0x88ad, 0x88ae, 0xb4ed, 0x88af, 0x88b0, 0x88b1,
+ /* 88 */ 0xb4ee, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8,
+ /* 90 */ 0xb4ef, 0xb4f0, 0x88b9, 0xb4f1, 0xb4f2, 0xb4f3, 0x88ba, 0x88bb,
+ /* 98 */ 0x88bc, 0x88bd, 0x88be, 0x88bf, 0xb4f4, 0x88c0, 0x88c1, 0x88c2,
+ /* a0 */ 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca,
+ /* a8 */ 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2,
+ /* b0 */ 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da,
+ /* b8 */ 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2,
+
+ /*** Three byte table, leaf: eb8dxx - offset 0x06091 ***/
+
+ /* 80 */ 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea,
+ /* 88 */ 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2,
+ /* 90 */ 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0xb4f5, 0xb4f6, 0xb4f7, 0x88f7,
+ /* 98 */ 0xb4f8, 0x88f8, 0x88f9, 0xb4f9, 0xb4fa, 0x88fa, 0xb4fb, 0xb4fc,
+ /* a0 */ 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0xb4fd, 0xb4fe, 0x8941, 0xb5a1,
+ /* a8 */ 0x8942, 0xb5a2, 0x8943, 0xb5a3, 0x8944, 0x8945, 0xb5a4, 0x8946,
+ /* b0 */ 0xb5a5, 0xb5a6, 0x8947, 0x8948, 0xb5a7, 0x8949, 0x894a, 0x894b,
+ /* b8 */ 0xb5a8, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952,
+
+ /*** Three byte table, leaf: eb8exx - offset 0x060d1 ***/
+
+ /* 80 */ 0xb5a9, 0xb5aa, 0x8953, 0xb5ab, 0xb5ac, 0xb5ad, 0x8954, 0x8955,
+ /* 88 */ 0x8956, 0x8957, 0x8958, 0x8959, 0xb5ae, 0x895a, 0x8961, 0x8962,
+ /* 90 */ 0xb5af, 0x8963, 0x8964, 0x8965, 0xb5b0, 0x8966, 0x8967, 0x8968,
+ /* 98 */ 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970,
+ /* a0 */ 0xb5b1, 0xb5b2, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976,
+ /* a8 */ 0xb5b3, 0x8977, 0x8978, 0x8979, 0xb5b4, 0x897a, 0x8981, 0x8982,
+ /* b0 */ 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a,
+ /* b8 */ 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992,
+
+ /*** Three byte table, leaf: eb8fxx - offset 0x06111 ***/
+
+ /* 80 */ 0x8993, 0x8994, 0x8995, 0x8996, 0xb5b5, 0xb5b6, 0x8997, 0x8998,
+ /* 88 */ 0xb5b7, 0x8999, 0x899a, 0xb5b8, 0xb5b9, 0x899b, 0xb5ba, 0x899c,
+ /* 90 */ 0xb5bb, 0x899d, 0x899e, 0x899f, 0xb5bc, 0xb5bd, 0x89a0, 0xb5be,
+ /* 98 */ 0x89a1, 0xb5bf, 0x89a2, 0xb5c0, 0x89a3, 0xb5c1, 0x89a4, 0x89a5,
+ /* a0 */ 0xb5c2, 0x89a6, 0x89a7, 0x89a8, 0xb5c3, 0x89a9, 0x89aa, 0x89ab,
+ /* a8 */ 0xb5c4, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2,
+ /* b0 */ 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba,
+ /* b8 */ 0x89bb, 0x89bc, 0x89bd, 0x89be, 0xb5c5, 0x89bf, 0x89c0, 0x89c1,
+
+ /*** Three byte table, leaf: eb90xx - offset 0x06151 ***/
+
+ /* 80 */ 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9,
+ /* 88 */ 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1,
+ /* 90 */ 0xb5c6, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8,
+ /* 98 */ 0xb5c7, 0x89d9, 0x89da, 0x89db, 0xb5c8, 0x89dc, 0x89dd, 0x89de,
+ /* a0 */ 0xb5c9, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5,
+ /* a8 */ 0xb5ca, 0xb5cb, 0x89e6, 0xb5cc, 0x89e7, 0x89e8, 0x89e9, 0x89ea,
+ /* b0 */ 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0xb5cd, 0x89ef, 0x89f0, 0x89f1,
+ /* b8 */ 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9,
+
+ /*** Three byte table, leaf: eb91xx - offset 0x06191 ***/
+
+ /* 80 */ 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a41, 0x8a42, 0x8a43,
+ /* 88 */ 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b,
+ /* 90 */ 0xb5ce, 0xb5cf, 0x8a4c, 0x8a4d, 0xb5d0, 0x8a4e, 0x8a4f, 0x8a50,
+ /* 98 */ 0xb5d1, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57,
+ /* a0 */ 0xb5d2, 0xb5d3, 0x8a58, 0xb5d4, 0x8a59, 0xb5d5, 0x8a5a, 0x8a61,
+ /* a8 */ 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0xb5d6, 0x8a66, 0x8a67, 0x8a68,
+ /* b0 */ 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70,
+ /* b8 */ 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78,
+
+ /*** Three byte table, leaf: eb92xx - offset 0x061d1 ***/
+
+ /* 80 */ 0xb5d7, 0x8a79, 0x8a7a, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85,
+ /* 88 */ 0xb5d8, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c,
+ /* 90 */ 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94,
+ /* 98 */ 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0xb5d9, 0x8a9a, 0x8a9b,
+ /* a0 */ 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0xb5da, 0x8aa0, 0x8aa1, 0x8aa2,
+ /* a8 */ 0xb5db, 0x8aa3, 0x8aa4, 0x8aa5, 0xb5dc, 0x8aa6, 0x8aa7, 0x8aa8,
+ /* b0 */ 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0xb5dd, 0x8aae, 0xb5de,
+ /* b8 */ 0x8aaf, 0xb5df, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5,
+
+ /*** Three byte table, leaf: eb93xx - offset 0x06211 ***/
+
+ /* 80 */ 0xb5e0, 0x8ab6, 0x8ab7, 0x8ab8, 0xb5e1, 0x8ab9, 0x8aba, 0x8abb,
+ /* 88 */ 0xb5e2, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2,
+ /* 90 */ 0xb5e3, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0xb5e4, 0x8ac7, 0x8ac8,
+ /* 98 */ 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0xb5e5, 0xb5e6, 0x8acd, 0x8ace,
+ /* a0 */ 0xb5e7, 0x8acf, 0x8ad0, 0xb5e8, 0xb5e9, 0x8ad1, 0xb5ea, 0x8ad2,
+ /* a8 */ 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0xb5eb, 0xb5ec, 0x8ad7, 0xb5ed,
+ /* b0 */ 0x8ad8, 0xb5ee, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade,
+ /* b8 */ 0xb5ef, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5,
+
+ /*** Three byte table, leaf: eb94xx - offset 0x06251 ***/
+
+ /* 80 */ 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed,
+ /* 88 */ 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5,
+ /* 90 */ 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0xb5f0, 0xb5f1, 0x8afa, 0x8afb,
+ /* 98 */ 0xb5f2, 0x8afc, 0x8afd, 0xb5f3, 0xb5f4, 0x8afe, 0x8b41, 0x8b42,
+ /* a0 */ 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0xb5f5, 0xb5f6, 0x8b47, 0xb5f7,
+ /* a8 */ 0xb5f8, 0xb5f9, 0xb5fa, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c,
+ /* b0 */ 0xb5fb, 0xb5fc, 0x8b4d, 0x8b4e, 0xb5fd, 0x8b4f, 0x8b50, 0x8b51,
+ /* b8 */ 0xb5fe, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58,
+
+ /*** Three byte table, leaf: eb95xx - offset 0x06291 ***/
+
+ /* 80 */ 0xb6a1, 0xb6a2, 0x8b59, 0xb6a3, 0xb6a4, 0xb6a5, 0x8b5a, 0x8b61,
+ /* 88 */ 0x8b62, 0x8b63, 0x8b64, 0xb6a6, 0xb6a7, 0xb6a8, 0x8b65, 0x8b66,
+ /* 90 */ 0xb6a9, 0x8b67, 0x8b68, 0x8b69, 0xb6aa, 0x8b6a, 0x8b6b, 0x8b6c,
+ /* 98 */ 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0xb6ab, 0xb6ac, 0x8b71, 0xb6ad,
+ /* a0 */ 0xb6ae, 0xb6af, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77,
+ /* a8 */ 0x8b78, 0x8b79, 0x8b7a, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85,
+ /* b0 */ 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d,
+ /* b8 */ 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95,
+
+ /*** Three byte table, leaf: eb96xx - offset 0x062d1 ***/
+
+ /* 80 */ 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d,
+ /* 88 */ 0x8b9e, 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5,
+ /* 90 */ 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad,
+ /* 98 */ 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5,
+ /* a0 */ 0xb6b0, 0xb6b1, 0x8bb6, 0x8bb7, 0xb6b2, 0x8bb8, 0x8bb9, 0x8bba,
+ /* a8 */ 0xb6b3, 0x8bbb, 0xb6b4, 0xb6b5, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf,
+ /* b0 */ 0xb6b6, 0xb6b7, 0x8bc0, 0xb6b8, 0xb6b9, 0xb6ba, 0x8bc1, 0x8bc2,
+ /* b8 */ 0x8bc3, 0x8bc4, 0x8bc5, 0xb6bb, 0xb6bc, 0xb6bd, 0x8bc6, 0x8bc7,
+
+ /*** Three byte table, leaf: eb97xx - offset 0x06311 ***/
+
+ /* 80 */ 0xb6be, 0x8bc8, 0x8bc9, 0x8bca, 0xb6bf, 0x8bcb, 0x8bcc, 0x8bcd,
+ /* 88 */ 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0xb6c0, 0xb6c1, 0x8bd2, 0xb6c2,
+ /* 90 */ 0xb6c3, 0xb6c4, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8,
+ /* 98 */ 0xb6c5, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf,
+ /* a0 */ 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7,
+ /* a8 */ 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0xb6c6, 0x8bec, 0x8bed, 0x8bee,
+ /* b0 */ 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6,
+ /* b8 */ 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe,
+
+ /*** Three byte table, leaf: eb98xx - offset 0x06351 ***/
+
+ /* 80 */ 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, 0x8c48,
+ /* 88 */ 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50,
+ /* 90 */ 0xb6c7, 0xb6c8, 0x8c51, 0x8c52, 0xb6c9, 0x8c53, 0x8c54, 0x8c55,
+ /* 98 */ 0xb6ca, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c61, 0x8c62,
+ /* a0 */ 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0xb6cb, 0x8c68, 0x8c69,
+ /* a8 */ 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0xb6cc, 0x8c6e, 0x8c6f, 0x8c70,
+ /* b0 */ 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0xb6cd, 0x8c75, 0x8c76, 0x8c77,
+ /* b8 */ 0x8c78, 0x8c79, 0x8c7a, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85,
+
+ /*** Three byte table, leaf: eb99xx - offset 0x06391 ***/
+
+ /* 80 */ 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d,
+ /* 88 */ 0xb6ce, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94,
+ /* 90 */ 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c,
+ /* 98 */ 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4,
+ /* a0 */ 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0xb6cf, 0x8ca9, 0x8caa, 0x8cab,
+ /* a8 */ 0xb6d0, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2,
+ /* b0 */ 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba,
+ /* b8 */ 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2,
+
+ /*** Three byte table, leaf: eb9axx - offset 0x063d1 ***/
+
+ /* 80 */ 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca,
+ /* 88 */ 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2,
+ /* 90 */ 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda,
+ /* 98 */ 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0xb6d1, 0xb6d2, 0x8cdf, 0x8ce0,
+ /* a0 */ 0xb6d3, 0x8ce1, 0x8ce2, 0x8ce3, 0xb6d4, 0x8ce4, 0x8ce5, 0x8ce6,
+ /* a8 */ 0x8ce7, 0x8ce8, 0x8ce9, 0xb6d5, 0xb6d6, 0x8cea, 0x8ceb, 0x8cec,
+ /* b0 */ 0x8ced, 0xb6d7, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3,
+ /* b8 */ 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb,
+
+ /*** Three byte table, leaf: eb9bxx - offset 0x06411 ***/
+
+ /* 80 */ 0x8cfc, 0x8cfd, 0x8cfe, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45,
+ /* 88 */ 0x8d46, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d,
+ /* 90 */ 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0xb6d8, 0x8d52, 0x8d53, 0x8d54,
+ /* 98 */ 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d61, 0x8d62,
+ /* a0 */ 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a,
+ /* a8 */ 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72,
+ /* b0 */ 0xb6d9, 0x8d73, 0x8d74, 0x8d75, 0xb6da, 0x8d76, 0x8d77, 0x8d78,
+ /* b8 */ 0xb6db, 0x8d79, 0x8d7a, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85,
+
+ /*** Three byte table, leaf: eb9cxx - offset 0x06451 ***/
+
+ /* 80 */ 0xb6dc, 0xb6dd, 0x8d86, 0x8d87, 0x8d88, 0xb6de, 0x8d89, 0x8d8a,
+ /* 88 */ 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92,
+ /* 90 */ 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a,
+ /* 98 */ 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2,
+ /* a0 */ 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa,
+ /* a8 */ 0xb6df, 0xb6e0, 0x8dab, 0x8dac, 0xb6e1, 0x8dad, 0x8dae, 0xb6e2,
+ /* b0 */ 0xb6e3, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5,
+ /* b8 */ 0xb6e4, 0xb6e5, 0x8db6, 0xb6e6, 0x8db7, 0x8db8, 0x8db9, 0x8dba,
+
+ /*** Three byte table, leaf: eb9dxx - offset 0x06491 ***/
+
+ /* 80 */ 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0xb6e7, 0x8dbf, 0x8dc0, 0x8dc1,
+ /* 88 */ 0xb6e8, 0x8dc2, 0x8dc3, 0x8dc4, 0xb6e9, 0x8dc5, 0x8dc6, 0x8dc7,
+ /* 90 */ 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0xb6ea, 0xb6eb, 0x8dcc, 0x8dcd,
+ /* 98 */ 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5,
+ /* a0 */ 0xb6ec, 0x8dd6, 0x8dd7, 0x8dd8, 0xb6ed, 0x8dd9, 0x8dda, 0x8ddb,
+ /* a8 */ 0xb6ee, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2,
+ /* b0 */ 0xb6ef, 0xb6f0, 0x8de3, 0xb6f1, 0x8de4, 0xb6f2, 0x8de5, 0x8de6,
+ /* b8 */ 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0xb6f3, 0xb6f4, 0x8deb, 0x8dec,
+
+ /*** Three byte table, leaf: eb9exx - offset 0x064d1 ***/
+
+ /* 80 */ 0xb6f5, 0x8ded, 0x8dee, 0x8def, 0xb6f6, 0x8df0, 0x8df1, 0x8df2,
+ /* 88 */ 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0xb6f7, 0xb6f8, 0x8df7, 0xb6f9,
+ /* 90 */ 0xb6fa, 0xb6fb, 0xb6fc, 0x8df8, 0x8df9, 0x8dfa, 0xb6fd, 0xb6fe,
+ /* 98 */ 0xb7a1, 0xb7a2, 0x8dfb, 0x8dfc, 0xb7a3, 0x8dfd, 0x8dfe, 0x8e41,
+ /* a0 */ 0xb7a4, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48,
+ /* a8 */ 0xb7a5, 0xb7a6, 0x8e49, 0xb7a7, 0xb7a8, 0xb7a9, 0x8e4a, 0x8e4b,
+ /* b0 */ 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0xb7aa, 0xb7ab, 0x8e50, 0x8e51,
+ /* b8 */ 0xb7ac, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58,
+
+ /*** Three byte table, leaf: eb9fxx - offset 0x06511 ***/
+
+ /* 80 */ 0x8e59, 0x8e5a, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0xb7ad,
+ /* 88 */ 0x8e66, 0xb7ae, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c,
+ /* 90 */ 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74,
+ /* 98 */ 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e81, 0x8e82,
+ /* a0 */ 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a,
+ /* a8 */ 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0xb7af, 0xb7b0, 0x8e8f, 0x8e90,
+ /* b0 */ 0xb7b1, 0x8e91, 0x8e92, 0x8e93, 0xb7b2, 0x8e94, 0x8e95, 0x8e96,
+ /* b8 */ 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0xb7b3, 0xb7b4, 0x8e9b, 0xb7b5,
+
+ /*** Three byte table, leaf: eba0xx - offset 0x06551 ***/
+
+ /* 80 */ 0xb7b6, 0xb7b7, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0xb7b8,
+ /* 88 */ 0xb7b9, 0xb7ba, 0x8ea1, 0x8ea2, 0xb7bb, 0x8ea3, 0x8ea4, 0x8ea5,
+ /* 90 */ 0xb7bc, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac,
+ /* 98 */ 0xb7bd, 0xb7be, 0x8ead, 0xb7bf, 0x8eae, 0xb7c0, 0x8eaf, 0x8eb0,
+ /* a0 */ 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0xb7c1, 0xb7c2, 0x8eb5, 0x8eb6,
+ /* a8 */ 0xb7c3, 0x8eb7, 0x8eb8, 0x8eb9, 0xb7c4, 0x8eba, 0x8ebb, 0x8ebc,
+ /* b0 */ 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0xb7c5, 0xb7c6, 0x8ec1, 0xb7c7,
+ /* b8 */ 0xb7c8, 0xb7c9, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7,
+
+ /*** Three byte table, leaf: eba1xx - offset 0x06591 ***/
+
+ /* 80 */ 0xb7ca, 0x8ec8, 0x8ec9, 0x8eca, 0xb7cb, 0x8ecb, 0x8ecc, 0x8ecd,
+ /* 88 */ 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5,
+ /* 90 */ 0x8ed6, 0xb7cc, 0x8ed7, 0xb7cd, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb,
+ /* 98 */ 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0xb7ce, 0xb7cf, 0x8ee0, 0x8ee1,
+ /* a0 */ 0xb7d0, 0x8ee2, 0x8ee3, 0x8ee4, 0xb7d1, 0x8ee5, 0x8ee6, 0x8ee7,
+ /* a8 */ 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0xb7d2, 0xb7d3, 0x8eec, 0xb7d4,
+ /* b0 */ 0x8eed, 0xb7d5, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3,
+ /* b8 */ 0xb7d6, 0x8ef4, 0x8ef5, 0x8ef6, 0xb7d7, 0x8ef7, 0x8ef8, 0x8ef9,
+
+ /*** Three byte table, leaf: eba2xx - offset 0x065d1 ***/
+
+ /* 80 */ 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f41, 0x8f42, 0x8f43,
+ /* 88 */ 0x8f44, 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0xb7d8, 0x8f49, 0x8f4a,
+ /* 90 */ 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52,
+ /* 98 */ 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a,
+ /* a0 */ 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, 0x8f68,
+ /* a8 */ 0xb7d9, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f,
+ /* b0 */ 0xb7da, 0x8f70, 0x8f71, 0x8f72, 0xb7db, 0x8f73, 0x8f74, 0x8f75,
+ /* b8 */ 0xb7dc, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f81, 0x8f82,
+
+ /*** Three byte table, leaf: eba3xx - offset 0x06611 ***/
+
+ /* 80 */ 0xb7dd, 0xb7de, 0x8f83, 0xb7df, 0x8f84, 0xb7e0, 0x8f85, 0x8f86,
+ /* 88 */ 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0xb7e1, 0x8f8b, 0x8f8c, 0x8f8d,
+ /* 90 */ 0xb7e2, 0x8f8e, 0x8f8f, 0x8f90, 0xb7e3, 0x8f91, 0x8f92, 0x8f93,
+ /* 98 */ 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0xb7e4, 0x8f99, 0xb7e5,
+ /* a0 */ 0x8f9a, 0xb7e6, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0,
+ /* a8 */ 0xb7e7, 0xb7e8, 0x8fa1, 0x8fa2, 0xb7e9, 0x8fa3, 0x8fa4, 0x8fa5,
+ /* b0 */ 0xb7ea, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac,
+ /* b8 */ 0xb7eb, 0xb7ec, 0x8fad, 0xb7ed, 0x8fae, 0xb7ee, 0x8faf, 0x8fb0,
+
+ /*** Three byte table, leaf: eba4xx - offset 0x06651 ***/
+
+ /* 80 */ 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0xb7ef, 0x8fb5, 0x8fb6, 0x8fb7,
+ /* 88 */ 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf,
+ /* 90 */ 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7,
+ /* 98 */ 0xb7f0, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce,
+ /* a0 */ 0xb7f1, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5,
+ /* a8 */ 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd,
+ /* b0 */ 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5,
+ /* b8 */ 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0xb7f2, 0xb7f3, 0x8fea, 0x8feb,
+
+ /*** Three byte table, leaf: eba5xx - offset 0x06691 ***/
+
+ /* 80 */ 0xb7f4, 0x8fec, 0x8fed, 0x8fee, 0xb7f5, 0x8fef, 0x8ff0, 0x8ff1,
+ /* 88 */ 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0xb7f6, 0x8ff6, 0x8ff7, 0xb7f7,
+ /* 90 */ 0x8ff8, 0xb7f8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe,
+ /* 98 */ 0xb7f9, 0xb7fa, 0x9041, 0x9042, 0xb7fb, 0x9043, 0x9044, 0x9045,
+ /* a0 */ 0xb7fc, 0x9046, 0x9047, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c,
+ /* a8 */ 0xb7fd, 0xb7fe, 0x904d, 0xb8a1, 0x904e, 0xb8a2, 0x904f, 0x9050,
+ /* b0 */ 0x9051, 0x9052, 0x9053, 0x9054, 0xb8a3, 0xb8a4, 0x9055, 0x9056,
+ /* b8 */ 0xb8a5, 0x9057, 0x9058, 0x9059, 0xb8a6, 0x905a, 0x9061, 0x9062,
+
+ /*** Three byte table, leaf: eba6xx - offset 0x066d1 ***/
+
+ /* 80 */ 0x9063, 0x9064, 0x9065, 0x9066, 0xb8a7, 0xb8a8, 0x9067, 0xb8a9,
+ /* 88 */ 0x9068, 0xb8aa, 0xb8ab, 0x9069, 0x906a, 0xb8ac, 0xb8ad, 0x906b,
+ /* 90 */ 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073,
+ /* 98 */ 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x9081,
+ /* a0 */ 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089,
+ /* a8 */ 0x908a, 0x908b, 0x908c, 0x908d, 0xb8ae, 0xb8af, 0x908e, 0x908f,
+ /* b0 */ 0xb8b0, 0x9090, 0x9091, 0x9092, 0xb8b1, 0x9093, 0x9094, 0x9095,
+ /* b8 */ 0x9096, 0x9097, 0x9098, 0x9099, 0xb8b2, 0xb8b3, 0x909a, 0xb8b4,
+
+ /*** Three byte table, leaf: eba7xx - offset 0x06711 ***/
+
+ /* 80 */ 0x909b, 0xb8b5, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1,
+ /* 88 */ 0xb8b6, 0xb8b7, 0x90a2, 0x90a3, 0xb8b8, 0x90a4, 0xb8b9, 0xb8ba,
+ /* 90 */ 0xb8bb, 0xb8bc, 0xb8bd, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9,
+ /* 98 */ 0xb8be, 0xb8bf, 0x90aa, 0xb8c0, 0x90ab, 0xb8c1, 0xb8c2, 0x90ac,
+ /* a0 */ 0x90ad, 0xb8c3, 0x90ae, 0xb8c4, 0xb8c5, 0xb8c6, 0x90af, 0x90b0,
+ /* a8 */ 0xb8c7, 0x90b1, 0x90b2, 0x90b3, 0xb8c8, 0x90b4, 0x90b5, 0x90b6,
+ /* b0 */ 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0xb8c9, 0xb8ca, 0x90bb, 0xb8cb,
+ /* b8 */ 0xb8cc, 0xb8cd, 0xb8ce, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0,
+
+ /*** Three byte table, leaf: eba8xx - offset 0x06751 ***/
+
+ /* 80 */ 0xb8cf, 0xb8d0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6,
+ /* 88 */ 0xb8d1, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd,
+ /* 90 */ 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0xb8d2, 0x90d3, 0x90d4,
+ /* 98 */ 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc,
+ /* a0 */ 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4,
+ /* a8 */ 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec,
+ /* b0 */ 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4,
+ /* b8 */ 0xb8d3, 0xb8d4, 0x90f5, 0x90f6, 0xb8d5, 0x90f7, 0x90f8, 0x90f9,
+
+ /*** Three byte table, leaf: eba9xx - offset 0x06791 ***/
+
+ /* 80 */ 0xb8d6, 0x90fa, 0xb8d7, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9141,
+ /* 88 */ 0xb8d8, 0xb8d9, 0x9142, 0xb8da, 0x9143, 0xb8db, 0xb8dc, 0x9144,
+ /* 90 */ 0x9145, 0x9146, 0x9147, 0xb8dd, 0xb8de, 0xb8df, 0x9148, 0x9149,
+ /* 98 */ 0xb8e0, 0x914a, 0x914b, 0x914c, 0xb8e1, 0x914d, 0x914e, 0x914f,
+ /* a0 */ 0x9150, 0x9151, 0x9152, 0x9153, 0xb8e2, 0xb8e3, 0x9154, 0xb8e4,
+ /* a8 */ 0xb8e5, 0xb8e6, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a,
+ /* b0 */ 0xb8e7, 0xb8e8, 0x9161, 0x9162, 0xb8e9, 0x9163, 0x9164, 0x9165,
+ /* b8 */ 0xb8ea, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c,
+
+ /*** Three byte table, leaf: ebaaxx - offset 0x067d1 ***/
+
+ /* 80 */ 0x916d, 0x916e, 0x916f, 0xb8eb, 0xb8ec, 0xb8ed, 0x9170, 0xb8ee,
+ /* 88 */ 0x9171, 0x9172, 0x9173, 0x9174, 0xb8ef, 0x9175, 0x9176, 0x9177,
+ /* 90 */ 0x9178, 0x9179, 0x917a, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,
+ /* 98 */ 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d,
+ /* a0 */ 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,
+ /* a8 */ 0xb8f0, 0xb8f1, 0x9196, 0xb8f2, 0xb8f3, 0x9197, 0x9198, 0x9199,
+ /* b0 */ 0xb8f4, 0x919a, 0xb8f5, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f,
+ /* b8 */ 0xb8f6, 0xb8f7, 0x91a0, 0xb8f8, 0x91a1, 0xb8f9, 0x91a2, 0x91a3,
+
+ /*** Three byte table, leaf: ebabxx - offset 0x06811 ***/
+
+ /* 80 */ 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0xb8fa, 0x91a8, 0x91a9, 0x91aa,
+ /* 88 */ 0xb8fb, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1,
+ /* 90 */ 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9,
+ /* 98 */ 0xb8fc, 0xb8fd, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf,
+ /* a0 */ 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7,
+ /* a8 */ 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf,
+ /* b0 */ 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7,
+ /* b8 */ 0x91d8, 0x91d9, 0x91da, 0x91db, 0xb8fe, 0x91dc, 0x91dd, 0x91de,
+
+ /*** Three byte table, leaf: ebacxx - offset 0x06851 ***/
+
+ /* 80 */ 0xb9a1, 0x91df, 0x91e0, 0x91e1, 0xb9a2, 0x91e2, 0x91e3, 0x91e4,
+ /* 88 */ 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0xb9a3, 0x91ea, 0xb9a4,
+ /* 90 */ 0x91eb, 0xb9a5, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1,
+ /* 98 */ 0xb9a6, 0x91f2, 0x91f3, 0x91f4, 0xb9a7, 0x91f5, 0x91f6, 0x91f7,
+ /* a0 */ 0xb9a8, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe,
+ /* a8 */ 0x9241, 0xb9a9, 0x9242, 0xb9aa, 0x9243, 0x9244, 0x9245, 0x9246,
+ /* b0 */ 0x9247, 0x9248, 0x9249, 0x924a, 0xb9ab, 0xb9ac, 0xb9ad, 0x924b,
+ /* b8 */ 0xb9ae, 0x924c, 0x924d, 0xb9af, 0xb9b0, 0xb9b1, 0xb9b2, 0x924e,
+
+ /*** Three byte table, leaf: ebadxx - offset 0x06891 ***/
+
+ /* 80 */ 0x924f, 0x9250, 0x9251, 0x9252, 0xb9b3, 0xb9b4, 0x9253, 0xb9b5,
+ /* 88 */ 0x9254, 0xb9b6, 0x9255, 0x9256, 0x9257, 0xb9b7, 0x9258, 0xb9b8,
+ /* 90 */ 0xb9b9, 0x9259, 0x925a, 0x9261, 0xb9ba, 0x9262, 0x9263, 0x9264,
+ /* 98 */ 0xb9bb, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b,
+ /* a0 */ 0x926c, 0xb9bc, 0x926d, 0xb9bd, 0x926e, 0x926f, 0x9270, 0x9271,
+ /* a8 */ 0x9272, 0x9273, 0x9274, 0x9275, 0xb9be, 0x9276, 0x9277, 0x9278,
+ /* b0 */ 0x9279, 0x927a, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286,
+ /* b8 */ 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e,
+
+ /*** Three byte table, leaf: ebaexx - offset 0x068d1 ***/
+
+ /* 80 */ 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296,
+ /* 88 */ 0xb9bf, 0x9297, 0x9298, 0x9299, 0xb9c0, 0x929a, 0x929b, 0x929c,
+ /* 90 */ 0xb9c1, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3,
+ /* 98 */ 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab,
+ /* a0 */ 0x92ac, 0x92ad, 0x92ae, 0x92af, 0xb9c2, 0x92b0, 0x92b1, 0x92b2,
+ /* a8 */ 0xb9c3, 0x92b3, 0x92b4, 0x92b5, 0xb9c4, 0x92b6, 0x92b7, 0x92b8,
+ /* b0 */ 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0xb9c5, 0x92bd, 0x92be, 0xb9c6,
+ /* b8 */ 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6,
+
+ /*** Three byte table, leaf: ebafxx - offset 0x06911 ***/
+
+ /* 80 */ 0xb9c7, 0x92c7, 0x92c8, 0x92c9, 0xb9c8, 0x92ca, 0x92cb, 0x92cc,
+ /* 88 */ 0xb9c9, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3,
+ /* 90 */ 0xb9ca, 0x92d4, 0x92d5, 0xb9cb, 0x92d6, 0x92d7, 0x92d8, 0x92d9,
+ /* 98 */ 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1,
+ /* a0 */ 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9,
+ /* a8 */ 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1,
+ /* b0 */ 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9,
+ /* b8 */ 0xb9cc, 0xb9cd, 0x92fa, 0x92fb, 0xb9ce, 0x92fc, 0x92fd, 0xb9cf,
+
+ /*** Three byte table, leaf: ebb0xx - offset 0x06951 ***/
+
+ /* 80 */ 0xb9d0, 0x92fe, 0xb9d1, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345,
+ /* 88 */ 0xb9d2, 0xb9d3, 0x9346, 0xb9d4, 0xb9d5, 0xb9d6, 0x9347, 0xb9d7,
+ /* 90 */ 0x9348, 0xb9d8, 0x9349, 0x934a, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc,
+ /* 98 */ 0xb9dd, 0x934b, 0x934c, 0xb9de, 0xb9df, 0xb9e0, 0xb9e1, 0xb9e2,
+ /* a0 */ 0x934d, 0x934e, 0x934f, 0x9350, 0xb9e3, 0xb9e4, 0x9351, 0xb9e5,
+ /* a8 */ 0x9352, 0xb9e6, 0x9353, 0x9354, 0x9355, 0xb9e7, 0x9356, 0x9357,
+ /* b0 */ 0xb9e8, 0xb9e9, 0x9358, 0x9359, 0xb9ea, 0x935a, 0x9361, 0x9362,
+ /* b8 */ 0xb9eb, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369,
+
+ /*** Three byte table, leaf: ebb1xx - offset 0x06991 ***/
+
+ /* 80 */ 0xb9ec, 0xb9ed, 0x936a, 0xb9ee, 0xb9ef, 0xb9f0, 0x936b, 0x936c,
+ /* 88 */ 0x936d, 0xb9f1, 0x936e, 0x936f, 0xb9f2, 0xb9f3, 0x9370, 0x9371,
+ /* 90 */ 0xb9f4, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378,
+ /* 98 */ 0x9379, 0x937a, 0x9381, 0x9382, 0x9383, 0xb9f5, 0x9384, 0x9385,
+ /* a0 */ 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d,
+ /* a8 */ 0x938e, 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395,
+ /* b0 */ 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d,
+ /* b8 */ 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5,
+
+ /*** Three byte table, leaf: ebb2xx - offset 0x069d1 ***/
+
+ /* 80 */ 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0xb9f6, 0xb9f7, 0x93aa, 0x93ab,
+ /* 88 */ 0xb9f8, 0x93ac, 0x93ad, 0xb9f9, 0xb9fa, 0x93ae, 0xb9fb, 0x93af,
+ /* 90 */ 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0xb9fc, 0xb9fd, 0x93b4, 0xb9fe,
+ /* 98 */ 0x93b5, 0xbaa1, 0xbaa2, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba,
+ /* a0 */ 0xbaa3, 0xbaa4, 0x93bb, 0x93bc, 0xbaa5, 0x93bd, 0x93be, 0xbaa6,
+ /* a8 */ 0xbaa7, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5,
+ /* b0 */ 0xbaa8, 0xbaa9, 0x93c6, 0xbaaa, 0xbaab, 0xbaac, 0x93c7, 0x93c8,
+ /* b8 */ 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0xbaad, 0xbaae, 0x93cd, 0x93ce,
+
+ /*** Three byte table, leaf: ebb3xx - offset 0x06a11 ***/
+
+ /* 80 */ 0xbaaf, 0x93cf, 0x93d0, 0x93d1, 0xbab0, 0x93d2, 0x93d3, 0x93d4,
+ /* 88 */ 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0xbab1, 0x93da, 0xbab2,
+ /* 90 */ 0xbab3, 0xbab4, 0x93db, 0x93dc, 0x93dd, 0xbab5, 0x93de, 0x93df,
+ /* 98 */ 0xbab6, 0x93e0, 0x93e1, 0x93e2, 0xbab7, 0x93e3, 0x93e4, 0x93e5,
+ /* a0 */ 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed,
+ /* a8 */ 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5,
+ /* b0 */ 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0xbab8, 0xbab9, 0xbaba, 0x93fa,
+ /* b8 */ 0xbabb, 0x93fb, 0x93fc, 0x93fd, 0xbabc, 0x93fe, 0x9441, 0x9442,
+
+ /*** Three byte table, leaf: ebb4xx - offset 0x06a51 ***/
+
+ /* 80 */ 0x9443, 0x9444, 0x9445, 0x9446, 0xbabd, 0xbabe, 0x9447, 0xbabf,
+ /* 88 */ 0x9448, 0xbac0, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e,
+ /* 90 */ 0xbac1, 0x944f, 0x9450, 0x9451, 0xbac2, 0x9452, 0x9453, 0x9454,
+ /* 98 */ 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x9461, 0x9462,
+ /* a0 */ 0x9463, 0x9464, 0x9465, 0x9466, 0xbac3, 0x9467, 0x9468, 0x9469,
+ /* a8 */ 0x946a, 0x946b, 0x946c, 0x946d, 0xbac4, 0x946e, 0x946f, 0x9470,
+ /* b0 */ 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478,
+ /* b8 */ 0x9479, 0x947a, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486,
+
+ /*** Three byte table, leaf: ebb5xx - offset 0x06a91 ***/
+
+ /* 80 */ 0xbac5, 0x9487, 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d,
+ /* 88 */ 0xbac6, 0xbac7, 0x948e, 0x948f, 0xbac8, 0x9490, 0x9491, 0x9492,
+ /* 90 */ 0xbac9, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499,
+ /* 98 */ 0xbaca, 0xbacb, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f,
+ /* a0 */ 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0xbacc, 0x94a4, 0x94a5, 0x94a6,
+ /* a8 */ 0xbacd, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad,
+ /* b0 */ 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5,
+ /* b8 */ 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd,
+
+ /*** Three byte table, leaf: ebb6xx - offset 0x06ad1 ***/
+
+ /* 80 */ 0xbace, 0xbacf, 0x94be, 0x94bf, 0xbad0, 0x94c0, 0x94c1, 0xbad1,
+ /* 88 */ 0xbad2, 0xbad3, 0xbad4, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6,
+ /* 90 */ 0xbad5, 0xbad6, 0x94c7, 0xbad7, 0x94c8, 0xbad8, 0x94c9, 0x94ca,
+ /* 98 */ 0x94cb, 0xbad9, 0xbada, 0x94cc, 0xbadb, 0x94cd, 0x94ce, 0x94cf,
+ /* a0 */ 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0xbadc, 0x94d4, 0x94d5, 0x94d6,
+ /* a8 */ 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de,
+ /* b0 */ 0xbadd, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5,
+ /* b8 */ 0xbade, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec,
+
+ /*** Three byte table, leaf: ebb7xx - offset 0x06b11 ***/
+
+ /* 80 */ 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4,
+ /* 88 */ 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc,
+ /* 90 */ 0x94fd, 0x94fe, 0x9541, 0x9542, 0xbadf, 0xbae0, 0x9543, 0x9544,
+ /* 98 */ 0xbae1, 0x9545, 0x9546, 0x9547, 0xbae2, 0x9548, 0x9549, 0x954a,
+ /* a0 */ 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552,
+ /* a8 */ 0x9553, 0xbae3, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559,
+ /* b0 */ 0xbae4, 0x955a, 0x9561, 0x9562, 0xbae5, 0x9563, 0x9564, 0x9565,
+ /* b8 */ 0xbae6, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c,
+
+ /*** Three byte table, leaf: ebb8xx - offset 0x06b51 ***/
+
+ /* 80 */ 0xbae7, 0x956d, 0x956e, 0xbae8, 0x956f, 0xbae9, 0x9570, 0x9571,
+ /* 88 */ 0x9572, 0x9573, 0x9574, 0x9575, 0xbaea, 0xbaeb, 0x9576, 0x9577,
+ /* 90 */ 0xbaec, 0x9578, 0x9579, 0x957a, 0xbaed, 0x9581, 0x9582, 0x9583,
+ /* 98 */ 0x9584, 0x9585, 0x9586, 0x9587, 0xbaee, 0xbaef, 0x9588, 0xbaf0,
+ /* a0 */ 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590,
+ /* a8 */ 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598,
+ /* b0 */ 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0,
+ /* b8 */ 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8,
+
+ /*** Three byte table, leaf: ebb9xx - offset 0x06b91 ***/
+
+ /* 80 */ 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0xbaf1, 0xbaf2, 0x95ad, 0x95ae,
+ /* 88 */ 0xbaf3, 0x95af, 0x95b0, 0x95b1, 0xbaf4, 0x95b2, 0xbaf5, 0x95b3,
+ /* 90 */ 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0xbaf6, 0xbaf7, 0x95b8, 0xbaf8,
+ /* 98 */ 0x95b9, 0xbaf9, 0xbafa, 0xbafb, 0x95ba, 0x95bb, 0x95bc, 0x95bd,
+ /* a0 */ 0xbafc, 0xbafd, 0x95be, 0x95bf, 0xbafe, 0x95c0, 0x95c1, 0x95c2,
+ /* a8 */ 0xbba1, 0x95c3, 0xbba2, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8,
+ /* b0 */ 0xbba3, 0xbba4, 0x95c9, 0xbba5, 0xbba6, 0xbba7, 0x95ca, 0x95cb,
+ /* b8 */ 0x95cc, 0x95cd, 0x95ce, 0xbba8, 0xbba9, 0xbbaa, 0x95cf, 0x95d0,
+
+ /*** Three byte table, leaf: ebbaxx - offset 0x06bd1 ***/
+
+ /* 80 */ 0xbbab, 0x95d1, 0x95d2, 0x95d3, 0xbbac, 0x95d4, 0x95d5, 0x95d6,
+ /* 88 */ 0x95d7, 0x95d8, 0x95d9, 0x95da, 0xbbad, 0xbbae, 0x95db, 0xbbaf,
+ /* 90 */ 0xbbb0, 0xbbb1, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1,
+ /* 98 */ 0xbbb2, 0xbbb3, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7,
+ /* a0 */ 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef,
+ /* a8 */ 0xbbb4, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6,
+ /* b0 */ 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe,
+ /* b8 */ 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648,
+
+ /*** Three byte table, leaf: ebbbxx - offset 0x06c11 ***/
+
+ /* 80 */ 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650,
+ /* 88 */ 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658,
+ /* 90 */ 0xbbb5, 0xbbb6, 0x9659, 0x965a, 0xbbb7, 0x9661, 0x9662, 0xbbb8,
+ /* 98 */ 0xbbb9, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669,
+ /* a0 */ 0xbbba, 0x966a, 0x966b, 0xbbbb, 0xbbbc, 0xbbbd, 0x966c, 0x966d,
+ /* a8 */ 0x966e, 0x966f, 0x9670, 0x9671, 0xbbbe, 0x9672, 0x9673, 0x9674,
+ /* b0 */ 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x9681, 0x9682,
+ /* b8 */ 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a,
+
+ /*** Three byte table, leaf: ebbcxx - offset 0x06c51 ***/
+
+ /* 80 */ 0x968b, 0xbbbf, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691,
+ /* 88 */ 0xbbc0, 0xbbc1, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697,
+ /* 90 */ 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f,
+ /* 98 */ 0xbbc2, 0xbbc3, 0x96a0, 0xbbc4, 0xbbc5, 0xbbc6, 0x96a1, 0x96a2,
+ /* a0 */ 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa,
+ /* a8 */ 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2,
+ /* b0 */ 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba,
+ /* b8 */ 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2,
+
+ /*** Three byte table, leaf: ebbdxx - offset 0x06c91 ***/
+
+ /* 80 */ 0xbbc7, 0xbbc8, 0x96c3, 0x96c4, 0xbbc9, 0x96c5, 0x96c6, 0x96c7,
+ /* 88 */ 0xbbca, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce,
+ /* 90 */ 0xbbcb, 0xbbcc, 0x96cf, 0x96d0, 0x96d1, 0xbbcd, 0x96d2, 0x96d3,
+ /* 98 */ 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db,
+ /* a0 */ 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3,
+ /* a8 */ 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb,
+ /* b0 */ 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3,
+ /* b8 */ 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb,
+
+ /*** Three byte table, leaf: ebbexx - offset 0x06cd1 ***/
+
+ /* 80 */ 0x96fc, 0x96fd, 0x96fe, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745,
+ /* 88 */ 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d,
+ /* 90 */ 0x974e, 0x974f, 0x9750, 0x9751, 0xbbce, 0x9752, 0x9753, 0x9754,
+ /* 98 */ 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x9761, 0x9762,
+ /* a0 */ 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a,
+ /* a8 */ 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772,
+ /* b0 */ 0xbbcf, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779,
+ /* b8 */ 0x977a, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787,
+
+ /*** Three byte table, leaf: ebbfxx - offset 0x06d11 ***/
+
+ /* 80 */ 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0xbbd0, 0x978d, 0x978e,
+ /* 88 */ 0x978f, 0x9790, 0x9791, 0x9792, 0xbbd1, 0xbbd2, 0x9793, 0x9794,
+ /* 90 */ 0xbbd3, 0x9795, 0x9796, 0x9797, 0xbbd4, 0x9798, 0x9799, 0x979a,
+ /* 98 */ 0x979b, 0x979c, 0x979d, 0x979e, 0xbbd5, 0x979f, 0x97a0, 0xbbd6,
+ /* a0 */ 0x97a1, 0xbbd7, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7,
+ /* a8 */ 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af,
+ /* b0 */ 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7,
+ /* b8 */ 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf,
+
+ /*** Three byte table, leaf: ec80xx - offset 0x06d51 ***/
+
+ /* 80 */ 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7,
+ /* 88 */ 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf,
+ /* 90 */ 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7,
+ /* 98 */ 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df,
+ /* a0 */ 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7,
+ /* a8 */ 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef,
+ /* b0 */ 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7,
+ /* b8 */ 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0xbbd8, 0x97fc, 0x97fd, 0x97fe,
+
+ /*** Three byte table, leaf: ec81xx - offset 0x06d91 ***/
+
+ /* 80 */ 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848,
+ /* 88 */ 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850,
+ /* 90 */ 0x9851, 0xbbd9, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857,
+ /* 98 */ 0xbbda, 0x9858, 0x9859, 0x985a, 0xbbdb, 0x9861, 0x9862, 0x9863,
+ /* a0 */ 0xbbdc, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a,
+ /* a8 */ 0xbbdd, 0xbbde, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870,
+ /* b0 */ 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878,
+ /* b8 */ 0x9879, 0x987a, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886,
+
+ /*** Three byte table, leaf: ec82xx - offset 0x06dd1 ***/
+
+ /* 80 */ 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e,
+ /* 88 */ 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896,
+ /* 90 */ 0xbbdf, 0xbbe0, 0x9897, 0x9898, 0xbbe1, 0x9899, 0x989a, 0x989b,
+ /* 98 */ 0xbbe2, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2,
+ /* a0 */ 0xbbe3, 0xbbe4, 0x98a3, 0xbbe5, 0x98a4, 0xbbe6, 0x98a5, 0x98a6,
+ /* a8 */ 0x98a7, 0x98a8, 0x98a9, 0x98aa, 0xbbe7, 0xbbe8, 0x98ab, 0xbbe9,
+ /* b0 */ 0xbbea, 0x98ac, 0x98ad, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0x98ae,
+ /* b8 */ 0x98af, 0x98b0, 0x98b1, 0x98b2, 0xbbef, 0xbbf0, 0x98b3, 0xbbf1,
+
+ /*** Three byte table, leaf: ec83xx - offset 0x06e11 ***/
+
+ /* 80 */ 0xbbf2, 0xbbf3, 0x98b4, 0x98b5, 0x98b6, 0xbbf4, 0x98b7, 0x98b8,
+ /* 88 */ 0xbbf5, 0xbbf6, 0x98b9, 0x98ba, 0xbbf7, 0x98bb, 0x98bc, 0x98bd,
+ /* 90 */ 0xbbf8, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4,
+ /* 98 */ 0xbbf9, 0xbbfa, 0x98c5, 0xbbfb, 0xbbfc, 0xbbfd, 0x98c6, 0x98c7,
+ /* a0 */ 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0xbbfe, 0xbca1, 0x98cc, 0x98cd,
+ /* a8 */ 0xbca2, 0x98ce, 0x98cf, 0x98d0, 0xbca3, 0x98d1, 0x98d2, 0x98d3,
+ /* b0 */ 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0xbca4, 0xbca5, 0x98d8, 0xbca6,
+ /* b8 */ 0x98d9, 0xbca7, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df,
+
+ /*** Three byte table, leaf: ec84xx - offset 0x06e51 ***/
+
+ /* 80 */ 0xbca8, 0x98e0, 0x98e1, 0x98e2, 0xbca9, 0x98e3, 0x98e4, 0x98e5,
+ /* 88 */ 0xbcaa, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec,
+ /* 90 */ 0xbcab, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0xbcac, 0x98f1, 0x98f2,
+ /* 98 */ 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0xbcad, 0xbcae, 0xbcaf, 0xbcb0,
+ /* a0 */ 0xbcb1, 0x98f7, 0x98f8, 0xbcb2, 0xbcb3, 0x98f9, 0xbcb4, 0xbcb5,
+ /* a8 */ 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0xbcb6, 0xbcb7, 0x98fe, 0xbcb8,
+ /* b0 */ 0xbcb9, 0xbcba, 0x9941, 0x9942, 0x9943, 0x9944, 0xbcbb, 0x9945,
+ /* b8 */ 0xbcbc, 0xbcbd, 0x9946, 0x9947, 0xbcbe, 0x9948, 0x9949, 0x994a,
+
+ /*** Three byte table, leaf: ec85xx - offset 0x06e91 ***/
+
+ /* 80 */ 0xbcbf, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951,
+ /* 88 */ 0xbcc0, 0xbcc1, 0x9952, 0xbcc2, 0xbcc3, 0xbcc4, 0x9953, 0x9954,
+ /* 90 */ 0x9955, 0x9956, 0x9957, 0x9958, 0xbcc5, 0xbcc6, 0x9959, 0x995a,
+ /* 98 */ 0xbcc7, 0x9961, 0x9962, 0x9963, 0xbcc8, 0x9964, 0x9965, 0x9966,
+ /* a0 */ 0x9967, 0x9968, 0x9969, 0x996a, 0xbcc9, 0xbcca, 0x996b, 0xbccb,
+ /* a8 */ 0xbccc, 0xbccd, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971,
+ /* b0 */ 0xbcce, 0x9972, 0x9973, 0x9974, 0xbccf, 0x9975, 0x9976, 0x9977,
+ /* b8 */ 0xbcd0, 0x9978, 0x9979, 0x997a, 0x9981, 0x9982, 0x9983, 0x9984,
+
+ /*** Three byte table, leaf: ec86xx - offset 0x06ed1 ***/
+
+ /* 80 */ 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0xbcd1, 0x998a, 0x998b,
+ /* 88 */ 0x998c, 0x998d, 0x998e, 0x998f, 0xbcd2, 0xbcd3, 0xbcd4, 0x9990,
+ /* 90 */ 0xbcd5, 0x9991, 0x9992, 0x9993, 0xbcd6, 0x9994, 0xbcd7, 0x9995,
+ /* 98 */ 0x9996, 0x9997, 0x9998, 0x9999, 0xbcd8, 0xbcd9, 0x999a, 0xbcda,
+ /* a0 */ 0x999b, 0xbcdb, 0x999c, 0x999d, 0x999e, 0xbcdc, 0x999f, 0x99a0,
+ /* a8 */ 0xbcdd, 0xbcde, 0x99a1, 0x99a2, 0xbcdf, 0x99a3, 0x99a4, 0x99a5,
+ /* b0 */ 0xbce0, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac,
+ /* b8 */ 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0xbce1, 0x99b2, 0x99b3,
+
+ /*** Three byte table, leaf: ec87xx - offset 0x06f11 ***/
+
+ /* 80 */ 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0xbce2, 0x99b8, 0x99b9, 0x99ba,
+ /* 88 */ 0xbce3, 0x99bb, 0x99bc, 0x99bd, 0xbce4, 0x99be, 0x99bf, 0x99c0,
+ /* 90 */ 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0xbce5, 0x99c5, 0x99c6, 0xbce6,
+ /* 98 */ 0xbce7, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd,
+ /* a0 */ 0xbce8, 0x99ce, 0x99cf, 0x99d0, 0xbce9, 0x99d1, 0x99d2, 0x99d3,
+ /* a8 */ 0xbcea, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da,
+ /* b0 */ 0xbceb, 0xbcec, 0x99db, 0xbced, 0x99dc, 0x99dd, 0x99de, 0x99df,
+ /* b8 */ 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0xbcee, 0xbcef, 0x99e4, 0x99e5,
+
+ /*** Three byte table, leaf: ec88xx - offset 0x06f51 ***/
+
+ /* 80 */ 0xbcf0, 0x99e6, 0x99e7, 0x99e8, 0xbcf1, 0x99e9, 0x99ea, 0x99eb,
+ /* 88 */ 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0xbcf2, 0xbcf3, 0x99f0, 0xbcf4,
+ /* 90 */ 0x99f1, 0xbcf5, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7,
+ /* 98 */ 0xbcf6, 0xbcf7, 0x99f8, 0x99f9, 0xbcf8, 0x99fa, 0x99fb, 0xbcf9,
+ /* a0 */ 0xbcfa, 0x99fc, 0x99fd, 0x99fe, 0x9a41, 0x9a42, 0x9a43, 0x9a44,
+ /* a8 */ 0xbcfb, 0xbcfc, 0x9a45, 0xbcfd, 0x9a46, 0xbcfe, 0x9a47, 0xbda1,
+ /* b0 */ 0x9a48, 0xbda2, 0xbda3, 0x9a49, 0xbda4, 0x9a4a, 0x9a4b, 0x9a4c,
+ /* b8 */ 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54,
+
+ /*** Three byte table, leaf: ec89xx - offset 0x06f91 ***/
+
+ /* 80 */ 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a61, 0x9a62,
+ /* 88 */ 0xbda5, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69,
+ /* 90 */ 0xbda6, 0xbda7, 0x9a6a, 0x9a6b, 0xbda8, 0x9a6c, 0x9a6d, 0x9a6e,
+ /* 98 */ 0xbda9, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75,
+ /* a0 */ 0xbdaa, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0xbdab, 0x9a7a, 0x9a81,
+ /* a8 */ 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0xbdac, 0xbdad, 0x9a86, 0x9a87,
+ /* b0 */ 0xbdae, 0x9a88, 0x9a89, 0x9a8a, 0xbdaf, 0x9a8b, 0x9a8c, 0x9a8d,
+ /* b8 */ 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0xbdb0, 0xbdb1, 0x9a92, 0xbdb2,
+
+ /*** Three byte table, leaf: ec8axx - offset 0x06fd1 ***/
+
+ /* 80 */ 0x9a93, 0xbdb3, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99,
+ /* 88 */ 0xbdb4, 0xbdb5, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f,
+ /* 90 */ 0xbdb6, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6,
+ /* 98 */ 0xbdb7, 0x9aa7, 0x9aa8, 0xbdb8, 0x9aa9, 0xbdb9, 0x9aaa, 0x9aab,
+ /* a0 */ 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0xbdba, 0xbdbb, 0x9ab0, 0x9ab1,
+ /* a8 */ 0xbdbc, 0x9ab2, 0x9ab3, 0x9ab4, 0xbdbd, 0xbdbe, 0x9ab5, 0x9ab6,
+ /* b0 */ 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0xbdbf, 0xbdc0, 0x9abb, 0xbdc1,
+ /* b8 */ 0x9abc, 0xbdc2, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2,
+
+ /*** Three byte table, leaf: ec8bxx - offset 0x07011 ***/
+
+ /* 80 */ 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca,
+ /* 88 */ 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2,
+ /* 90 */ 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada,
+ /* 98 */ 0x9adb, 0x9adc, 0x9add, 0x9ade, 0xbdc3, 0xbdc4, 0x9adf, 0x9ae0,
+ /* a0 */ 0xbdc5, 0x9ae1, 0x9ae2, 0xbdc6, 0xbdc7, 0x9ae3, 0x9ae4, 0x9ae5,
+ /* a8 */ 0x9ae6, 0x9ae7, 0x9ae8, 0xbdc8, 0xbdc9, 0xbdca, 0x9ae9, 0xbdcb,
+ /* b0 */ 0x9aea, 0xbdcc, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0xbdcd, 0x9aef,
+ /* b8 */ 0xbdce, 0xbdcf, 0x9af0, 0xbdd0, 0xbdd1, 0x9af1, 0x9af2, 0x9af3,
+
+ /*** Three byte table, leaf: ec8cxx - offset 0x07051 ***/
+
+ /* 80 */ 0xbdd2, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa,
+ /* 88 */ 0xbdd3, 0xbdd4, 0x9afb, 0x9afc, 0xbdd5, 0xbdd6, 0x9afd, 0x9afe,
+ /* 90 */ 0x9b41, 0x9b42, 0x9b43, 0xbdd7, 0xbdd8, 0xbdd9, 0x9b44, 0x9b45,
+ /* 98 */ 0xbdda, 0x9b46, 0x9b47, 0x9b48, 0xbddb, 0x9b49, 0x9b4a, 0x9b4b,
+ /* a0 */ 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0xbddc, 0xbddd, 0x9b50, 0x9b51,
+ /* a8 */ 0xbdde, 0xbddf, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57,
+ /* b0 */ 0x9b58, 0x9b59, 0x9b5a, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65,
+ /* b8 */ 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d,
+
+ /*** Three byte table, leaf: ec8dxx - offset 0x07091 ***/
+
+ /* 80 */ 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0xbde0, 0x9b73, 0x9b74,
+ /* 88 */ 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b81, 0x9b82,
+ /* 90 */ 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a,
+ /* 98 */ 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92,
+ /* a0 */ 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a,
+ /* a8 */ 0xbde1, 0xbde2, 0x9b9b, 0x9b9c, 0xbde3, 0x9b9d, 0x9b9e, 0x9b9f,
+ /* b0 */ 0xbde4, 0x9ba0, 0xbde5, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5,
+ /* b8 */ 0xbde6, 0xbde7, 0x9ba6, 0x9ba7, 0xbde8, 0xbde9, 0x9ba8, 0x9ba9,
+
+ /*** Three byte table, leaf: ec8exx - offset 0x070d1 ***/
+
+ /* 80 */ 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0xbdea, 0x9bae, 0x9baf, 0x9bb0,
+ /* 88 */ 0xbdeb, 0x9bb1, 0x9bb2, 0x9bb3, 0xbdec, 0x9bb4, 0x9bb5, 0x9bb6,
+ /* 90 */ 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe,
+ /* 98 */ 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6,
+ /* a0 */ 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce,
+ /* a8 */ 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6,
+ /* b0 */ 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde,
+ /* b8 */ 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6,
+
+ /*** Three byte table, leaf: ec8fxx - offset 0x07111 ***/
+
+ /* 80 */ 0xbded, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed,
+ /* 88 */ 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5,
+ /* 90 */ 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd,
+ /* 98 */ 0xbdee, 0xbdef, 0x9bfe, 0x9c41, 0xbdf0, 0x9c42, 0x9c43, 0xbdf1,
+ /* a0 */ 0xbdf2, 0x9c44, 0xbdf3, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49,
+ /* a8 */ 0xbdf4, 0xbdf5, 0x9c4a, 0x9c4b, 0x9c4c, 0xbdf6, 0x9c4d, 0x9c4e,
+ /* b0 */ 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0xbdf7, 0xbdf8, 0x9c53, 0x9c54,
+ /* b8 */ 0xbdf9, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c61,
+
+ /*** Three byte table, leaf: ec90xx - offset 0x07151 ***/
+
+ /* 80 */ 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69,
+ /* 88 */ 0xbdfa, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70,
+ /* 90 */ 0xbdfb, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77,
+ /* 98 */ 0x9c78, 0x9c79, 0x9c7a, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85,
+ /* a0 */ 0x9c86, 0x9c87, 0x9c88, 0x9c89, 0xbdfc, 0x9c8a, 0x9c8b, 0x9c8c,
+ /* a8 */ 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0xbdfd, 0x9c91, 0x9c92, 0x9c93,
+ /* b0 */ 0xbdfe, 0x9c94, 0x9c95, 0x9c96, 0xbea1, 0x9c97, 0x9c98, 0x9c99,
+ /* b8 */ 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0xbea2, 0xbea3, 0x9c9e, 0x9c9f,
+
+ /*** Three byte table, leaf: ec91xx - offset 0x07191 ***/
+
+ /* 80 */ 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7,
+ /* 88 */ 0xbea4, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae,
+ /* 90 */ 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6,
+ /* 98 */ 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe,
+ /* a0 */ 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0xbea5, 0xbea6, 0x9cc3, 0x9cc4,
+ /* a8 */ 0xbea7, 0x9cc5, 0x9cc6, 0x9cc7, 0xbea8, 0x9cc8, 0x9cc9, 0x9cca,
+ /* b0 */ 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0xbea9, 0xbeaa, 0x9ccf, 0x9cd0,
+ /* b8 */ 0x9cd1, 0xbeab, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7,
+
+ /*** Three byte table, leaf: ec92xx - offset 0x071d1 ***/
+
+ /* 80 */ 0xbeac, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde,
+ /* 88 */ 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6,
+ /* 90 */ 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0xbead, 0x9ceb, 0x9cec, 0x9ced,
+ /* 98 */ 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0xbeae, 0x9cf2, 0x9cf3, 0x9cf4,
+ /* a0 */ 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc,
+ /* a8 */ 0x9cfd, 0x9cfe, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46,
+ /* b0 */ 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e,
+ /* b8 */ 0xbeaf, 0x9d4f, 0x9d50, 0x9d51, 0xbeb0, 0x9d52, 0x9d53, 0x9d54,
+
+ /*** Three byte table, leaf: ec93xx - offset 0x07211 ***/
+
+ /* 80 */ 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d61, 0x9d62,
+ /* 88 */ 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a,
+ /* 90 */ 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72,
+ /* 98 */ 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a,
+ /* a0 */ 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88,
+ /* a8 */ 0x9d89, 0xbeb1, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f,
+ /* b0 */ 0xbeb2, 0xbeb3, 0x9d90, 0x9d91, 0xbeb4, 0x9d92, 0x9d93, 0x9d94,
+ /* b8 */ 0xbeb5, 0x9d95, 0xbeb6, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0xbeb7,
+
+ /*** Three byte table, leaf: ec94xx - offset 0x07251 ***/
+
+ /* 80 */ 0xbeb8, 0xbeb9, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f,
+ /* 88 */ 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0xbeba, 0x9da4, 0x9da5, 0x9da6,
+ /* 90 */ 0xbebb, 0x9da7, 0x9da8, 0x9da9, 0xbebc, 0x9daa, 0x9dab, 0x9dac,
+ /* 98 */ 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0xbebd, 0x9db1, 0x9db2, 0x9db3,
+ /* a0 */ 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb,
+ /* a8 */ 0xbebe, 0xbebf, 0x9dbc, 0x9dbd, 0xbec0, 0x9dbe, 0x9dbf, 0x9dc0,
+ /* b0 */ 0xbec1, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7,
+ /* b8 */ 0xbec2, 0xbec3, 0x9dc8, 0xbec4, 0x9dc9, 0xbec5, 0x9dca, 0x9dcb,
+
+ /*** Three byte table, leaf: ec95xx - offset 0x07291 ***/
+
+ /* 80 */ 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0xbec6, 0xbec7, 0x9dd0, 0x9dd1,
+ /* 88 */ 0xbec8, 0xbec9, 0xbeca, 0x9dd2, 0xbecb, 0xbecc, 0xbecd, 0x9dd3,
+ /* 90 */ 0x9dd4, 0x9dd5, 0x9dd6, 0xbece, 0xbecf, 0xbed0, 0x9dd7, 0xbed1,
+ /* 98 */ 0xbed2, 0xbed3, 0x9dd8, 0x9dd9, 0x9dda, 0xbed4, 0xbed5, 0x9ddb,
+ /* a0 */ 0xbed6, 0xbed7, 0x9ddc, 0x9ddd, 0xbed8, 0x9dde, 0x9ddf, 0x9de0,
+ /* a8 */ 0xbed9, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7,
+ /* b0 */ 0xbeda, 0xbedb, 0x9de8, 0xbedc, 0xbedd, 0xbede, 0x9de9, 0x9dea,
+ /* b8 */ 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0xbedf, 0xbee0, 0x9def, 0x9df0,
+
+ /*** Three byte table, leaf: ec96xx - offset 0x072d1 ***/
+
+ /* 80 */ 0xbee1, 0x9df1, 0x9df2, 0x9df3, 0xbee2, 0x9df4, 0x9df5, 0xbee3,
+ /* 88 */ 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0xbee4, 0xbee5, 0x9dfa, 0xbee6,
+ /* 90 */ 0x9dfb, 0xbee7, 0x9dfc, 0x9dfd, 0x9dfe, 0xbee8, 0x9e41, 0xbee9,
+ /* 98 */ 0xbeea, 0x9e42, 0x9e43, 0x9e44, 0xbeeb, 0x9e45, 0x9e46, 0x9e47,
+ /* a0 */ 0xbeec, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e,
+ /* a8 */ 0x9e4f, 0xbeed, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55,
+ /* b0 */ 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0xbeee, 0xbeef, 0x9e5a, 0x9e61,
+ /* b8 */ 0xbef0, 0xbef1, 0x9e62, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0x9e63,
+
+ /*** Three byte table, leaf: ec97xx - offset 0x07311 ***/
+
+ /* 80 */ 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0xbef6, 0xbef7, 0xbef8, 0xbef9,
+ /* 88 */ 0xbefa, 0xbefb, 0xbefc, 0x9e68, 0xbefd, 0x9e69, 0xbefe, 0x9e6a,
+ /* 90 */ 0xbfa1, 0xbfa2, 0x9e6b, 0x9e6c, 0xbfa3, 0x9e6d, 0x9e6e, 0x9e6f,
+ /* 98 */ 0xbfa4, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76,
+ /* a0 */ 0xbfa5, 0xbfa6, 0x9e77, 0xbfa7, 0x9e78, 0xbfa8, 0x9e79, 0x9e7a,
+ /* a8 */ 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0xbfa9, 0xbfaa, 0xbfab, 0x9e85,
+ /* b0 */ 0xbfac, 0x9e86, 0x9e87, 0x9e88, 0xbfad, 0x9e89, 0xbfae, 0xbfaf,
+ /* b8 */ 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0xbfb0, 0xbfb1, 0xbfb2, 0xbfb3,
+
+ /*** Three byte table, leaf: ec98xx - offset 0x07351 ***/
+
+ /* 80 */ 0xbfb4, 0xbfb5, 0x9e8e, 0x9e8f, 0x9e90, 0xbfb6, 0xbfb7, 0xbfb8,
+ /* 88 */ 0xbfb9, 0x9e91, 0x9e92, 0x9e93, 0xbfba, 0x9e94, 0x9e95, 0x9e96,
+ /* 90 */ 0xbfbb, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d,
+ /* 98 */ 0xbfbc, 0xbfbd, 0x9e9e, 0xbfbe, 0xbfbf, 0x9e9f, 0x9ea0, 0x9ea1,
+ /* a0 */ 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0xbfc0, 0xbfc1, 0x9ea6, 0x9ea7,
+ /* a8 */ 0xbfc2, 0x9ea8, 0x9ea9, 0x9eaa, 0xbfc3, 0xbfc4, 0xbfc5, 0x9eab,
+ /* b0 */ 0xbfc6, 0x9eac, 0x9ead, 0xbfc7, 0xbfc8, 0xbfc9, 0x9eae, 0xbfca,
+ /* b8 */ 0x9eaf, 0xbfcb, 0x9eb0, 0xbfcc, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4,
+
+ /*** Three byte table, leaf: ec99xx - offset 0x07391 ***/
+
+ /* 80 */ 0xbfcd, 0xbfce, 0x9eb5, 0x9eb6, 0xbfcf, 0x9eb7, 0x9eb8, 0x9eb9,
+ /* 88 */ 0xbfd0, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0,
+ /* 90 */ 0xbfd1, 0xbfd2, 0x9ec1, 0xbfd3, 0xbfd4, 0xbfd5, 0x9ec2, 0x9ec3,
+ /* 98 */ 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0xbfd6, 0xbfd7, 0x9ec8, 0x9ec9,
+ /* a0 */ 0xbfd8, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0,
+ /* a8 */ 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0xbfd9, 0x9ed5, 0x9ed6, 0xbfda,
+ /* b0 */ 0x9ed7, 0xbfdb, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd,
+ /* b8 */ 0xbfdc, 0xbfdd, 0x9ede, 0x9edf, 0xbfde, 0x9ee0, 0x9ee1, 0x9ee2,
+
+ /*** Three byte table, leaf: ec9axx - offset 0x073d1 ***/
+
+ /* 80 */ 0xbfdf, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9,
+ /* 88 */ 0xbfe0, 0xbfe1, 0x9eea, 0xbfe2, 0x9eeb, 0xbfe3, 0x9eec, 0x9eed,
+ /* 90 */ 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0xbfe4, 0xbfe5, 0x9ef2, 0x9ef3,
+ /* 98 */ 0xbfe6, 0x9ef4, 0x9ef5, 0x9ef6, 0xbfe7, 0x9ef7, 0x9ef8, 0x9ef9,
+ /* a0 */ 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0xbfe8, 0xbfe9, 0x9efe, 0xbfea,
+ /* a8 */ 0x9f41, 0xbfeb, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47,
+ /* b0 */ 0xbfec, 0xbfed, 0x9f48, 0x9f49, 0xbfee, 0x9f4a, 0x9f4b, 0x9f4c,
+ /* b8 */ 0xbfef, 0xbff0, 0xbff1, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51,
+
+ /*** Three byte table, leaf: ec9bxx - offset 0x07411 ***/
+
+ /* 80 */ 0xbff2, 0xbff3, 0x9f52, 0xbff4, 0x9f53, 0xbff5, 0x9f54, 0x9f55,
+ /* 88 */ 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0xbff6, 0xbff7, 0x9f5a, 0x9f61,
+ /* 90 */ 0xbff8, 0x9f62, 0x9f63, 0x9f64, 0xbff9, 0x9f65, 0x9f66, 0x9f67,
+ /* 98 */ 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0xbffa, 0xbffb, 0x9f6c, 0x9f6d,
+ /* a0 */ 0xbffc, 0xbffd, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73,
+ /* a8 */ 0xbffe, 0xc0a1, 0x9f74, 0x9f75, 0xc0a2, 0x9f76, 0x9f77, 0x9f78,
+ /* b0 */ 0xc0a3, 0x9f79, 0x9f7a, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85,
+ /* b8 */ 0xc0a4, 0xc0a5, 0x9f86, 0x9f87, 0x9f88, 0xc0a6, 0x9f89, 0x9f8a,
+
+ /*** Three byte table, leaf: ec9cxx - offset 0x07451 ***/
+
+ /* 80 */ 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0xc0a7, 0xc0a8, 0x9f8f, 0x9f90,
+ /* 88 */ 0xc0a9, 0x9f91, 0x9f92, 0x9f93, 0xc0aa, 0x9f94, 0x9f95, 0x9f96,
+ /* 90 */ 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0xc0ab, 0xc0ac, 0x9f9b, 0xc0ad,
+ /* 98 */ 0x9f9c, 0xc0ae, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2,
+ /* a0 */ 0xc0af, 0xc0b0, 0x9fa3, 0x9fa4, 0xc0b1, 0x9fa5, 0x9fa6, 0x9fa7,
+ /* a8 */ 0xc0b2, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae,
+ /* b0 */ 0xc0b3, 0xc0b4, 0x9faf, 0xc0b5, 0x9fb0, 0xc0b6, 0x9fb1, 0xc0b7,
+ /* b8 */ 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0xc0b8, 0xc0b9, 0x9fb6, 0x9fb7,
+
+ /*** Three byte table, leaf: ec9dxx - offset 0x07491 ***/
+
+ /* 80 */ 0xc0ba, 0x9fb8, 0x9fb9, 0x9fba, 0xc0bb, 0x9fbb, 0x9fbc, 0x9fbd,
+ /* 88 */ 0x9fbe, 0x9fbf, 0xc0bc, 0x9fc0, 0xc0bd, 0xc0be, 0x9fc1, 0xc0bf,
+ /* 90 */ 0x9fc2, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c5, 0xc0c6,
+ /* 98 */ 0xc0c7, 0x9fc3, 0x9fc4, 0x9fc5, 0xc0c8, 0x9fc6, 0x9fc7, 0x9fc8,
+ /* a0 */ 0xc0c9, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf,
+ /* a8 */ 0xc0ca, 0x9fd0, 0x9fd1, 0xc0cb, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5,
+ /* b0 */ 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, 0xc0cc, 0xc0cd, 0x9fda, 0x9fdb,
+ /* b8 */ 0xc0ce, 0x9fdc, 0x9fdd, 0x9fde, 0xc0cf, 0xc0d0, 0xc0d1, 0x9fdf,
+
+ /*** Three byte table, leaf: ec9exx - offset 0x074d1 ***/
+
+ /* 80 */ 0x9fe0, 0x9fe1, 0x9fe2, 0xc0d2, 0xc0d3, 0xc0d4, 0x9fe3, 0xc0d5,
+ /* 88 */ 0xc0d6, 0xc0d7, 0xc0d8, 0x9fe4, 0x9fe5, 0x9fe6, 0xc0d9, 0x9fe7,
+ /* 90 */ 0xc0da, 0xc0db, 0x9fe8, 0x9fe9, 0xc0dc, 0x9fea, 0xc0dd, 0xc0de,
+ /* 98 */ 0xc0df, 0x9feb, 0xc0e0, 0x9fec, 0x9fed, 0x9fee, 0x9fef, 0x9ff0,
+ /* a0 */ 0xc0e1, 0xc0e2, 0x9ff1, 0xc0e3, 0xc0e4, 0xc0e5, 0xc0e6, 0x9ff2,
+ /* a8 */ 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0xc0e7, 0xc0e8, 0x9ff7, 0x9ff8,
+ /* b0 */ 0xc0e9, 0x9ff9, 0x9ffa, 0x9ffb, 0xc0ea, 0x9ffc, 0x9ffd, 0x9ffe,
+ /* b8 */ 0xa041, 0xa042, 0xa043, 0xa044, 0xc0eb, 0xc0ec, 0xa045, 0xc0ed,
+
+ /*** Three byte table, leaf: ec9fxx - offset 0x07511 ***/
+
+ /* 80 */ 0xc0ee, 0xc0ef, 0xa046, 0xa047, 0xa048, 0xa049, 0xa04a, 0xa04b,
+ /* 88 */ 0xc0f0, 0xc0f1, 0xa04c, 0xa04d, 0xc0f2, 0xa04e, 0xc0f3, 0xa04f,
+ /* 90 */ 0xc0f4, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056,
+ /* 98 */ 0xc0f5, 0xa057, 0xa058, 0xa059, 0xa05a, 0xc0f6, 0xa061, 0xa062,
+ /* a0 */ 0xa063, 0xa064, 0xa065, 0xa066, 0xc0f7, 0xa067, 0xa068, 0xa069,
+ /* a8 */ 0xc0f8, 0xa06a, 0xa06b, 0xa06c, 0xc0f9, 0xa06d, 0xa06e, 0xa06f,
+ /* b0 */ 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077,
+ /* b8 */ 0xa078, 0xa079, 0xa07a, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085,
+
+ /*** Three byte table, leaf: eca0xx - offset 0x07551 ***/
+
+ /* 80 */ 0xc0fa, 0xc0fb, 0xa086, 0xa087, 0xc0fc, 0xa088, 0xa089, 0xa08a,
+ /* 88 */ 0xc0fd, 0xa08b, 0xc0fe, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090,
+ /* 90 */ 0xc1a1, 0xc1a2, 0xa091, 0xc1a3, 0xa092, 0xc1a4, 0xc1a5, 0xa093,
+ /* 98 */ 0xa094, 0xa095, 0xa096, 0xa097, 0xc1a6, 0xc1a7, 0xa098, 0xa099,
+ /* a0 */ 0xc1a8, 0xa09a, 0xa09b, 0xa09c, 0xc1a9, 0xa09d, 0xa09e, 0xa09f,
+ /* a8 */ 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xc1aa, 0xc1ab, 0xa0a4, 0xc1ac,
+ /* b0 */ 0xa0a5, 0xc1ad, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab,
+ /* b8 */ 0xc1ae, 0xa0ac, 0xa0ad, 0xa0ae, 0xc1af, 0xa0af, 0xa0b0, 0xa0b1,
+
+ /*** Three byte table, leaf: eca1xx - offset 0x07591 ***/
+
+ /* 80 */ 0xc1b0, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8,
+ /* 88 */ 0xc1b1, 0xc1b2, 0xa0b9, 0xa0ba, 0xc1b3, 0xc1b4, 0xa0bb, 0xa0bc,
+ /* 90 */ 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xc1b5, 0xa0c1, 0xa0c2, 0xa0c3,
+ /* 98 */ 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb,
+ /* a0 */ 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3,
+ /* a8 */ 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db,
+ /* b0 */ 0xc1b6, 0xc1b7, 0xa0dc, 0xa0dd, 0xc1b8, 0xa0de, 0xa0df, 0xa0e0,
+ /* b8 */ 0xc1b9, 0xa0e1, 0xc1ba, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6,
+
+ /*** Three byte table, leaf: eca2xx - offset 0x075d1 ***/
+
+ /* 80 */ 0xc1bb, 0xc1bc, 0xa0e7, 0xc1bd, 0xa0e8, 0xc1be, 0xc1bf, 0xc1c0,
+ /* 88 */ 0xa0e9, 0xa0ea, 0xa0eb, 0xc1c1, 0xc1c2, 0xc1c3, 0xa0ec, 0xa0ed,
+ /* 90 */ 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xc1c4, 0xa0f2, 0xa0f3, 0xa0f4,
+ /* 98 */ 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xc1c5, 0xa0fa, 0xc1c6,
+ /* a0 */ 0xa0fb, 0xc1c7, 0xa0fc, 0xa0fd, 0xa0fe, 0xa141, 0xa142, 0xa143,
+ /* a8 */ 0xc1c8, 0xa144, 0xa145, 0xa146, 0xa147, 0xa148, 0xa149, 0xa14a,
+ /* b0 */ 0xa14b, 0xa14c, 0xa14d, 0xa14e, 0xa14f, 0xa150, 0xa151, 0xa152,
+ /* b8 */ 0xa153, 0xa154, 0xa155, 0xa156, 0xc1c9, 0xc1ca, 0xa157, 0xa158,
+
+ /*** Three byte table, leaf: eca3xx - offset 0x07611 ***/
+
+ /* 80 */ 0xa159, 0xa15a, 0xa161, 0xa162, 0xc1cb, 0xa163, 0xa164, 0xa165,
+ /* 88 */ 0xc1cc, 0xa166, 0xa167, 0xa168, 0xc1cd, 0xa169, 0xa16a, 0xa16b,
+ /* 90 */ 0xa16c, 0xa16d, 0xa16e, 0xa16f, 0xc1ce, 0xc1cf, 0xa170, 0xc1d0,
+ /* 98 */ 0xa171, 0xc1d1, 0xa172, 0xa173, 0xa174, 0xa175, 0xa176, 0xa177,
+ /* a0 */ 0xc1d2, 0xc1d3, 0xa178, 0xa179, 0xc1d4, 0xa17a, 0xa181, 0xa182,
+ /* a8 */ 0xa183, 0xa184, 0xa185, 0xa186, 0xa187, 0xa188, 0xa189, 0xa18a,
+ /* b0 */ 0xa18b, 0xa18c, 0xa18d, 0xa18e, 0xa18f, 0xc1d5, 0xa190, 0xa191,
+ /* b8 */ 0xa192, 0xa193, 0xa194, 0xa195, 0xc1d6, 0xc1d7, 0xa196, 0xa197,
+
+ /*** Three byte table, leaf: eca4xx - offset 0x07651 ***/
+
+ /* 80 */ 0xc1d8, 0xa198, 0xa199, 0xa19a, 0xc1d9, 0xc1da, 0xc1db, 0xa19b,
+ /* 88 */ 0xa19c, 0xa19d, 0xa19e, 0xa19f, 0xc1dc, 0xc1dd, 0xa1a0, 0xc1de,
+ /* 90 */ 0xa241, 0xc1df, 0xa242, 0xa243, 0xa244, 0xa245, 0xa246, 0xa247,
+ /* 98 */ 0xc1e0, 0xa248, 0xa249, 0xa24a, 0xa24b, 0xa24c, 0xa24d, 0xa24e,
+ /* a0 */ 0xa24f, 0xa250, 0xa251, 0xa252, 0xa253, 0xa254, 0xa255, 0xa256,
+ /* a8 */ 0xa257, 0xa258, 0xa259, 0xa25a, 0xc1e1, 0xa261, 0xa262, 0xa263,
+ /* b0 */ 0xa264, 0xa265, 0xa266, 0xa267, 0xc1e2, 0xa268, 0xa269, 0xa26a,
+ /* b8 */ 0xa26b, 0xa26c, 0xa26d, 0xa26e, 0xa26f, 0xa270, 0xa271, 0xa272,
+
+ /*** Three byte table, leaf: eca5xx - offset 0x07691 ***/
+
+ /* 80 */ 0xa273, 0xa274, 0xa275, 0xa276, 0xa277, 0xa278, 0xa279, 0xa27a,
+ /* 88 */ 0xa281, 0xa282, 0xa283, 0xa284, 0xa285, 0xa286, 0xa287, 0xa288,
+ /* 90 */ 0xc1e3, 0xc1e4, 0xa289, 0xa28a, 0xc1e5, 0xa28b, 0xa28c, 0xa28d,
+ /* 98 */ 0xc1e6, 0xa28e, 0xa28f, 0xa290, 0xa291, 0xa292, 0xa293, 0xa294,
+ /* a0 */ 0xc1e7, 0xc1e8, 0xa295, 0xc1e9, 0xa296, 0xa297, 0xa298, 0xa299,
+ /* a8 */ 0xa29a, 0xa29b, 0xa29c, 0xa29d, 0xc1ea, 0xa29e, 0xa29f, 0xa2a0,
+ /* b0 */ 0xc1eb, 0xa341, 0xa342, 0xa343, 0xc1ec, 0xa344, 0xa345, 0xa346,
+ /* b8 */ 0xa347, 0xa348, 0xa349, 0xa34a, 0xc1ed, 0xa34b, 0xa34c, 0xa34d,
+
+ /*** Three byte table, leaf: eca6xx - offset 0x076d1 ***/
+
+ /* 80 */ 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355,
+ /* 88 */ 0xc1ee, 0xc1ef, 0xa356, 0xa357, 0xc1f0, 0xa358, 0xa359, 0xa35a,
+ /* 90 */ 0xc1f1, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367,
+ /* 98 */ 0xc1f2, 0xc1f3, 0xa368, 0xc1f4, 0xa369, 0xc1f5, 0xa36a, 0xa36b,
+ /* a0 */ 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373,
+ /* a8 */ 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa381,
+ /* b0 */ 0xa382, 0xa383, 0xa384, 0xa385, 0xa386, 0xa387, 0xa388, 0xa389,
+ /* b8 */ 0xa38a, 0xa38b, 0xa38c, 0xa38d, 0xa38e, 0xa38f, 0xa390, 0xa391,
+
+ /*** Three byte table, leaf: eca7xx - offset 0x07711 ***/
+
+ /* 80 */ 0xc1f6, 0xc1f7, 0xa392, 0xa393, 0xc1f8, 0xa394, 0xa395, 0xc1f9,
+ /* 88 */ 0xc1fa, 0xa396, 0xc1fb, 0xa397, 0xa398, 0xa399, 0xa39a, 0xa39b,
+ /* 90 */ 0xc1fc, 0xc1fd, 0xa39c, 0xc1fe, 0xa39d, 0xc2a1, 0xc2a2, 0xa39e,
+ /* 98 */ 0xa39f, 0xc2a3, 0xc2a4, 0xa3a0, 0xc2a5, 0xc2a6, 0xa441, 0xa442,
+ /* a0 */ 0xc2a7, 0xa443, 0xc2a8, 0xa444, 0xc2a9, 0xa445, 0xa446, 0xc2aa,
+ /* a8 */ 0xa447, 0xa448, 0xa449, 0xa44a, 0xc2ab, 0xc2ac, 0xa44b, 0xc2ad,
+ /* b0 */ 0xc2ae, 0xc2af, 0xa44c, 0xa44d, 0xa44e, 0xa44f, 0xa450, 0xa451,
+ /* b8 */ 0xc2b0, 0xc2b1, 0xa452, 0xa453, 0xc2b2, 0xa454, 0xa455, 0xa456,
+
+ /*** Three byte table, leaf: eca8xx - offset 0x07751 ***/
+
+ /* 80 */ 0xc2b3, 0xa457, 0xa458, 0xa459, 0xa45a, 0xa461, 0xa462, 0xa463,
+ /* 88 */ 0xc2b4, 0xc2b5, 0xa464, 0xc2b6, 0xc2b7, 0xc2b8, 0xa465, 0xa466,
+ /* 90 */ 0xa467, 0xa468, 0xa469, 0xa46a, 0xc2b9, 0xa46b, 0xa46c, 0xa46d,
+ /* 98 */ 0xc2ba, 0xa46e, 0xa46f, 0xa470, 0xa471, 0xa472, 0xa473, 0xa474,
+ /* a0 */ 0xa475, 0xa476, 0xa477, 0xa478, 0xa479, 0xa47a, 0xa481, 0xa482,
+ /* a8 */ 0xa483, 0xc2bb, 0xa484, 0xa485, 0xa486, 0xa487, 0xa488, 0xa489,
+ /* b0 */ 0xa48a, 0xa48b, 0xa48c, 0xa48d, 0xa48e, 0xa48f, 0xa490, 0xa491,
+ /* b8 */ 0xa492, 0xa493, 0xa494, 0xa495, 0xa496, 0xa497, 0xa498, 0xa499,
+
+ /*** Three byte table, leaf: eca9xx - offset 0x07791 ***/
+
+ /* 80 */ 0xa49a, 0xa49b, 0xa49c, 0xa49d, 0xa49e, 0xa49f, 0xa4a0, 0xa541,
+ /* 88 */ 0xa542, 0xa543, 0xa544, 0xa545, 0xc2bc, 0xc2bd, 0xa546, 0xa547,
+ /* 90 */ 0xc2be, 0xa548, 0xa549, 0xa54a, 0xc2bf, 0xa54b, 0xa54c, 0xa54d,
+ /* 98 */ 0xa54e, 0xa54f, 0xa550, 0xa551, 0xc2c0, 0xc2c1, 0xa552, 0xc2c2,
+ /* a0 */ 0xc2c3, 0xc2c4, 0xa553, 0xa554, 0xa555, 0xa556, 0xa557, 0xa558,
+ /* a8 */ 0xc2c5, 0xa559, 0xa55a, 0xa561, 0xa562, 0xa563, 0xa564, 0xa565,
+ /* b0 */ 0xa566, 0xa567, 0xa568, 0xa569, 0xa56a, 0xa56b, 0xa56c, 0xa56d,
+ /* b8 */ 0xa56e, 0xa56f, 0xa570, 0xa571, 0xa572, 0xc2c6, 0xa573, 0xa574,
+
+ /*** Three byte table, leaf: ecaaxx - offset 0x077d1 ***/
+
+ /* 80 */ 0xa575, 0xa576, 0xa577, 0xa578, 0xc2c7, 0xa579, 0xa57a, 0xa581,
+ /* 88 */ 0xa582, 0xa583, 0xa584, 0xa585, 0xa586, 0xa587, 0xa588, 0xa589,
+ /* 90 */ 0xa58a, 0xa58b, 0xa58c, 0xa58d, 0xa58e, 0xa58f, 0xa590, 0xa591,
+ /* 98 */ 0xc2c8, 0xa592, 0xa593, 0xa594, 0xa595, 0xa596, 0xa597, 0xa598,
+ /* a0 */ 0xa599, 0xa59a, 0xa59b, 0xa59c, 0xa59d, 0xa59e, 0xa59f, 0xa5a0,
+ /* a8 */ 0xa641, 0xa642, 0xa643, 0xa644, 0xa645, 0xa646, 0xa647, 0xa648,
+ /* b0 */ 0xa649, 0xa64a, 0xa64b, 0xa64c, 0xa64d, 0xa64e, 0xa64f, 0xa650,
+ /* b8 */ 0xa651, 0xa652, 0xa653, 0xa654, 0xc2c9, 0xc2ca, 0xa655, 0xa656,
+
+ /*** Three byte table, leaf: ecabxx - offset 0x07811 ***/
+
+ /* 80 */ 0xc2cb, 0xa657, 0xa658, 0xa659, 0xc2cc, 0xa65a, 0xa661, 0xa662,
+ /* 88 */ 0xa663, 0xa664, 0xa665, 0xa666, 0xc2cd, 0xc2ce, 0xa667, 0xc2cf,
+ /* 90 */ 0xa668, 0xc2d0, 0xa669, 0xc2d1, 0xa66a, 0xa66b, 0xa66c, 0xa66d,
+ /* 98 */ 0xc2d2, 0xc2d3, 0xa66e, 0xa66f, 0xa670, 0xa671, 0xa672, 0xa673,
+ /* a0 */ 0xc2d4, 0xa674, 0xa675, 0xa676, 0xa677, 0xa678, 0xa679, 0xa67a,
+ /* a8 */ 0xa681, 0xa682, 0xa683, 0xa684, 0xc2d5, 0xa685, 0xa686, 0xa687,
+ /* b0 */ 0xa688, 0xa689, 0xa68a, 0xa68b, 0xc2d6, 0xa68c, 0xa68d, 0xa68e,
+ /* b8 */ 0xa68f, 0xa690, 0xa691, 0xa692, 0xa693, 0xa694, 0xa695, 0xa696,
+
+ /*** Three byte table, leaf: ecacxx - offset 0x07851 ***/
+
+ /* 80 */ 0xa697, 0xa698, 0xa699, 0xa69a, 0xa69b, 0xa69c, 0xa69d, 0xa69e,
+ /* 88 */ 0xc2d7, 0xa69f, 0xa6a0, 0xa741, 0xa742, 0xa743, 0xa744, 0xa745,
+ /* 90 */ 0xc2d8, 0xa746, 0xa747, 0xa748, 0xc2d9, 0xa749, 0xa74a, 0xa74b,
+ /* 98 */ 0xc2da, 0xa74c, 0xa74d, 0xa74e, 0xa74f, 0xa750, 0xa751, 0xa752,
+ /* a0 */ 0xc2db, 0xc2dc, 0xa753, 0xa754, 0xa755, 0xa756, 0xa757, 0xa758,
+ /* a8 */ 0xa759, 0xa75a, 0xa761, 0xa762, 0xa763, 0xa764, 0xa765, 0xa766,
+ /* b0 */ 0xa767, 0xa768, 0xa769, 0xa76a, 0xa76b, 0xa76c, 0xa76d, 0xa76e,
+ /* b8 */ 0xa76f, 0xa770, 0xa771, 0xa772, 0xa773, 0xa774, 0xa775, 0xa776,
+
+ /*** Three byte table, leaf: ecadxx - offset 0x07891 ***/
+
+ /* 80 */ 0xa777, 0xc2dd, 0xa778, 0xa779, 0xa77a, 0xa781, 0xa782, 0xa783,
+ /* 88 */ 0xc2de, 0xc2df, 0xa784, 0xa785, 0xc2e0, 0xa786, 0xa787, 0xa788,
+ /* 90 */ 0xc2e1, 0xa789, 0xa78a, 0xa78b, 0xa78c, 0xa78d, 0xa78e, 0xa78f,
+ /* 98 */ 0xc2e2, 0xc2e3, 0xa790, 0xa791, 0xa792, 0xc2e4, 0xa793, 0xa794,
+ /* a0 */ 0xa795, 0xa796, 0xa797, 0xa798, 0xc2e5, 0xa799, 0xa79a, 0xa79b,
+ /* a8 */ 0xa79c, 0xa79d, 0xa79e, 0xa79f, 0xa7a0, 0xa841, 0xa842, 0xa843,
+ /* b0 */ 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa849, 0xa84a, 0xa84b,
+ /* b8 */ 0xc2e6, 0xc2e7, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851,
+
+ /*** Three byte table, leaf: ecaexx - offset 0x078d1 ***/
+
+ /* 80 */ 0xa852, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859,
+ /* 88 */ 0xa85a, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867,
+ /* 90 */ 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f,
+ /* 98 */ 0xa870, 0xa871, 0xa872, 0xa873, 0xc2e8, 0xa874, 0xa875, 0xa876,
+ /* a0 */ 0xa877, 0xa878, 0xa879, 0xa87a, 0xa881, 0xa882, 0xa883, 0xa884,
+ /* a8 */ 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c,
+ /* b0 */ 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa892, 0xa893, 0xa894,
+ /* b8 */ 0xc2e9, 0xa895, 0xa896, 0xa897, 0xa898, 0xa899, 0xa89a, 0xa89b,
+
+ /*** Three byte table, leaf: ecafxx - offset 0x07911 ***/
+
+ /* 80 */ 0xa89c, 0xa89d, 0xa89e, 0xa89f, 0xa8a0, 0xa941, 0xa942, 0xa943,
+ /* 88 */ 0xa944, 0xa945, 0xa946, 0xa947, 0xa948, 0xa949, 0xa94a, 0xa94b,
+ /* 90 */ 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xc2ea, 0xa950, 0xa951, 0xa952,
+ /* 98 */ 0xa953, 0xa954, 0xa955, 0xa956, 0xa957, 0xa958, 0xa959, 0xa95a,
+ /* a0 */ 0xa961, 0xa962, 0xa963, 0xa964, 0xc2eb, 0xa965, 0xa966, 0xc2ec,
+ /* a8 */ 0xa967, 0xc2ed, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d,
+ /* b0 */ 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975,
+ /* b8 */ 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa981, 0xa982, 0xa983,
+
+ /*** Three byte table, leaf: ecb0xx - offset 0x07951 ***/
+
+ /* 80 */ 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa989, 0xa98a, 0xa98b,
+ /* 88 */ 0xa98c, 0xa98d, 0xa98e, 0xa98f, 0xc2ee, 0xc2ef, 0xa990, 0xa991,
+ /* 90 */ 0xc2f0, 0xa992, 0xa993, 0xa994, 0xc2f1, 0xa995, 0xa996, 0xa997,
+ /* 98 */ 0xa998, 0xa999, 0xa99a, 0xa99b, 0xc2f2, 0xc2f3, 0xa99c, 0xa99d,
+ /* a0 */ 0xa99e, 0xc2f4, 0xc2f5, 0xa99f, 0xa9a0, 0xaa41, 0xaa42, 0xc2f6,
+ /* a8 */ 0xc2f7, 0xc2f8, 0xaa43, 0xaa44, 0xc2f9, 0xaa45, 0xc2fa, 0xaa46,
+ /* b0 */ 0xc2fb, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d,
+ /* b8 */ 0xc2fc, 0xc2fd, 0xaa4e, 0xc2fe, 0xc3a1, 0xc3a2, 0xc3a3, 0xaa4f,
+
+ /*** Three byte table, leaf: ecb1xx - offset 0x07991 ***/
+
+ /* 80 */ 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xc3a4, 0xc3a5, 0xaa54, 0xaa55,
+ /* 88 */ 0xc3a6, 0xaa56, 0xaa57, 0xaa58, 0xc3a7, 0xaa59, 0xaa5a, 0xaa61,
+ /* 90 */ 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xc3a8, 0xc3a9, 0xaa66, 0xc3aa,
+ /* 98 */ 0xc3ab, 0xc3ac, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c,
+ /* a0 */ 0xc3ad, 0xaa6d, 0xaa6e, 0xaa6f, 0xc3ae, 0xaa70, 0xc3af, 0xaa71,
+ /* a8 */ 0xc3b0, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78,
+ /* b0 */ 0xc3b1, 0xaa79, 0xaa7a, 0xaa81, 0xaa82, 0xc3b2, 0xaa83, 0xaa84,
+ /* b8 */ 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c,
+
+ /*** Three byte table, leaf: ecb2xx - offset 0x079d1 ***/
+
+ /* 80 */ 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94,
+ /* 88 */ 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c,
+ /* 90 */ 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab41, 0xab42, 0xab43, 0xab44,
+ /* 98 */ 0xc3b3, 0xc3b4, 0xab45, 0xab46, 0xc3b5, 0xab47, 0xab48, 0xab49,
+ /* a0 */ 0xc3b6, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50,
+ /* a8 */ 0xc3b7, 0xc3b8, 0xab51, 0xc3b9, 0xc3ba, 0xc3bb, 0xab52, 0xab53,
+ /* b0 */ 0xab54, 0xab55, 0xab56, 0xab57, 0xc3bc, 0xc3bd, 0xab58, 0xab59,
+ /* b8 */ 0xc3be, 0xab5a, 0xab61, 0xab62, 0xc3bf, 0xab63, 0xab64, 0xab65,
+
+ /*** Three byte table, leaf: ecb3xx - offset 0x07a11 ***/
+
+ /* 80 */ 0xab66, 0xab67, 0xab68, 0xab69, 0xc3c0, 0xc3c1, 0xab6a, 0xc3c2,
+ /* 88 */ 0xab6b, 0xc3c3, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71,
+ /* 90 */ 0xc3c4, 0xab72, 0xab73, 0xab74, 0xc3c5, 0xab75, 0xab76, 0xab77,
+ /* 98 */ 0xab78, 0xab79, 0xab7a, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85,
+ /* a0 */ 0xab86, 0xab87, 0xab88, 0xab89, 0xc3c6, 0xab8a, 0xab8b, 0xab8c,
+ /* a8 */ 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xc3c7, 0xab91, 0xab92, 0xab93,
+ /* b0 */ 0xc3c8, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a,
+ /* b8 */ 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac41, 0xac42,
+
+ /*** Three byte table, leaf: ecb4xx - offset 0x07a51 ***/
+
+ /* 80 */ 0xac43, 0xc3c9, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49,
+ /* 88 */ 0xc3ca, 0xc3cb, 0xac4a, 0xac4b, 0xc3cc, 0xac4c, 0xac4d, 0xac4e,
+ /* 90 */ 0xc3cd, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55,
+ /* 98 */ 0xc3ce, 0xc3cf, 0xac56, 0xc3d0, 0xac57, 0xc3d1, 0xac58, 0xac59,
+ /* a0 */ 0xac5a, 0xac61, 0xac62, 0xac63, 0xc3d2, 0xac64, 0xac65, 0xac66,
+ /* a8 */ 0xc3d3, 0xac67, 0xac68, 0xac69, 0xc3d4, 0xac6a, 0xac6b, 0xac6c,
+ /* b0 */ 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74,
+ /* b8 */ 0xac75, 0xc3d5, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac81,
+
+ /*** Three byte table, leaf: ecb5xx - offset 0x07a91 ***/
+
+ /* 80 */ 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89,
+ /* 88 */ 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91,
+ /* 90 */ 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99,
+ /* 98 */ 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xc3d6, 0xac9e, 0xac9f, 0xaca0,
+ /* a0 */ 0xc3d7, 0xad41, 0xad42, 0xad43, 0xc3d8, 0xad44, 0xad45, 0xad46,
+ /* a8 */ 0xad47, 0xad48, 0xad49, 0xad4a, 0xc3d9, 0xc3da, 0xad4b, 0xc3db,
+ /* b0 */ 0xad4c, 0xc3dc, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52,
+ /* b8 */ 0xc3dd, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59,
+
+ /*** Three byte table, leaf: ecb6xx - offset 0x07ad1 ***/
+
+ /* 80 */ 0xad5a, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67,
+ /* 88 */ 0xc3de, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e,
+ /* 90 */ 0xad6f, 0xad70, 0xad71, 0xad72, 0xc3df, 0xc3e0, 0xad73, 0xad74,
+ /* 98 */ 0xc3e1, 0xad75, 0xad76, 0xad77, 0xc3e2, 0xad78, 0xad79, 0xad7a,
+ /* a0 */ 0xad81, 0xad82, 0xad83, 0xad84, 0xc3e3, 0xc3e4, 0xad85, 0xc3e5,
+ /* a8 */ 0xad86, 0xc3e6, 0xad87, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c,
+ /* b0 */ 0xc3e7, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93,
+ /* b8 */ 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b,
+
+ /*** Three byte table, leaf: ecb7xx - offset 0x07b11 ***/
+
+ /* 80 */ 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xc3e8, 0xada0, 0xae41, 0xae42,
+ /* 88 */ 0xae43, 0xae44, 0xae45, 0xae46, 0xc3e9, 0xae47, 0xae48, 0xae49,
+ /* 90 */ 0xc3ea, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50,
+ /* 98 */ 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58,
+ /* a0 */ 0xae59, 0xae5a, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66,
+ /* a8 */ 0xc3eb, 0xae67, 0xae68, 0xae69, 0xc3ec, 0xae6a, 0xae6b, 0xae6c,
+ /* b0 */ 0xc3ed, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73,
+ /* b8 */ 0xc3ee, 0xc3ef, 0xae74, 0xc3f0, 0xae75, 0xc3f1, 0xae76, 0xae77,
+
+ /*** Three byte table, leaf: ecb8xx - offset 0x07b51 ***/
+
+ /* 80 */ 0xae78, 0xae79, 0xae7a, 0xae81, 0xc3f2, 0xae82, 0xae83, 0xae84,
+ /* 88 */ 0xc3f3, 0xae85, 0xae86, 0xae87, 0xc3f4, 0xae88, 0xae89, 0xae8a,
+ /* 90 */ 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xc3f5, 0xae8f, 0xae90, 0xae91,
+ /* 98 */ 0xae92, 0xc3f6, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98,
+ /* a0 */ 0xc3f7, 0xc3f8, 0xae99, 0xae9a, 0xc3f9, 0xae9b, 0xae9c, 0xae9d,
+ /* a8 */ 0xc3fa, 0xae9e, 0xae9f, 0xaea0, 0xaf41, 0xaf42, 0xaf43, 0xaf44,
+ /* b0 */ 0xc3fb, 0xc3fc, 0xaf45, 0xc3fd, 0xaf46, 0xc3fe, 0xaf47, 0xaf48,
+ /* b8 */ 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50,
+
+ /*** Three byte table, leaf: ecb9xx - offset 0x07b91 ***/
+
+ /* 80 */ 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58,
+ /* 88 */ 0xaf59, 0xaf5a, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66,
+ /* 90 */ 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e,
+ /* 98 */ 0xc4a1, 0xc4a2, 0xaf6f, 0xaf70, 0xc4a3, 0xaf71, 0xaf72, 0xc4a4,
+ /* a0 */ 0xc4a5, 0xc4a6, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78,
+ /* a8 */ 0xc4a7, 0xc4a8, 0xaf79, 0xc4a9, 0xaf7a, 0xc4aa, 0xaf81, 0xaf82,
+ /* b0 */ 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xc4ab, 0xc4ac, 0xaf87, 0xaf88,
+ /* b8 */ 0xc4ad, 0xaf89, 0xaf8a, 0xaf8b, 0xc4ae, 0xaf8c, 0xaf8d, 0xaf8e,
+
+ /*** Three byte table, leaf: ecbaxx - offset 0x07bd1 ***/
+
+ /* 80 */ 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xc4af, 0xc4b0, 0xaf93, 0xc4b1,
+ /* 88 */ 0xaf94, 0xc4b2, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a,
+ /* 90 */ 0xc4b3, 0xc4b4, 0xaf9b, 0xaf9c, 0xc4b5, 0xaf9d, 0xaf9e, 0xaf9f,
+ /* 98 */ 0xc4b6, 0xafa0, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046,
+ /* a0 */ 0xc4b7, 0xc4b8, 0xb047, 0xc4b9, 0xc4ba, 0xc4bb, 0xb048, 0xb049,
+ /* a8 */ 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xc4bc, 0xc4bd, 0xb04e, 0xb04f,
+ /* b0 */ 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057,
+ /* b8 */ 0xb058, 0xb059, 0xb05a, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065,
+
+ /*** Three byte table, leaf: ecbbxx - offset 0x07c11 ***/
+
+ /* 80 */ 0xb066, 0xc4be, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c,
+ /* 88 */ 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074,
+ /* 90 */ 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb081, 0xb082,
+ /* 98 */ 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a,
+ /* a0 */ 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xc4bf, 0xc4c0, 0xb08f, 0xb090,
+ /* a8 */ 0xc4c1, 0xb091, 0xb092, 0xc4c2, 0xc4c3, 0xb093, 0xb094, 0xb095,
+ /* b0 */ 0xb096, 0xb097, 0xb098, 0xb099, 0xc4c4, 0xc4c5, 0xb09a, 0xc4c6,
+ /* b8 */ 0xc4c7, 0xc4c8, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0,
+
+ /*** Three byte table, leaf: ecbcxx - offset 0x07c51 ***/
+
+ /* 80 */ 0xc4c9, 0xc4ca, 0xb141, 0xb142, 0xc4cb, 0xb143, 0xb144, 0xb145,
+ /* 88 */ 0xc4cc, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c,
+ /* 90 */ 0xc4cd, 0xc4ce, 0xb14d, 0xc4cf, 0xb14e, 0xc4d0, 0xb14f, 0xb150,
+ /* 98 */ 0xb151, 0xb152, 0xb153, 0xb154, 0xc4d1, 0xb155, 0xb156, 0xb157,
+ /* a0 */ 0xc4d2, 0xb158, 0xb159, 0xb15a, 0xc4d3, 0xb161, 0xb162, 0xb163,
+ /* a8 */ 0xb164, 0xb165, 0xb166, 0xb167, 0xc4d4, 0xc4d5, 0xb168, 0xc4d6,
+ /* b0 */ 0xc4d7, 0xc4d8, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e,
+ /* b8 */ 0xc4d9, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175,
+
+ /*** Three byte table, leaf: ecbdxx - offset 0x07c91 ***/
+
+ /* 80 */ 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb181, 0xb182, 0xb183,
+ /* 88 */ 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b,
+ /* 90 */ 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xc4da, 0xc4db, 0xb190, 0xb191,
+ /* 98 */ 0xc4dc, 0xb192, 0xb193, 0xb194, 0xc4dd, 0xb195, 0xb196, 0xb197,
+ /* a0 */ 0xb198, 0xb199, 0xb19a, 0xb19b, 0xc4de, 0xc4df, 0xb19c, 0xc4e0,
+ /* a8 */ 0xb19d, 0xc4e1, 0xb19e, 0xb19f, 0xb1a0, 0xb241, 0xb242, 0xb243,
+ /* b0 */ 0xc4e2, 0xc4e3, 0xb244, 0xb245, 0xc4e4, 0xb246, 0xb247, 0xb248,
+ /* b8 */ 0xc4e5, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f,
+
+ /*** Three byte table, leaf: ecbexx - offset 0x07cd1 ***/
+
+ /* 80 */ 0xc4e6, 0xb250, 0xb251, 0xb252, 0xb253, 0xc4e7, 0xb254, 0xb255,
+ /* 88 */ 0xb256, 0xb257, 0xb258, 0xb259, 0xc4e8, 0xb25a, 0xb261, 0xb262,
+ /* 90 */ 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a,
+ /* 98 */ 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272,
+ /* a0 */ 0xb273, 0xc4e9, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279,
+ /* a8 */ 0xc4ea, 0xb27a, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286,
+ /* b0 */ 0xc4eb, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d,
+ /* b8 */ 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295,
+
+ /*** Three byte table, leaf: ecbfxx - offset 0x07d11 ***/
+
+ /* 80 */ 0xb296, 0xb297, 0xb298, 0xb299, 0xc4ec, 0xb29a, 0xb29b, 0xb29c,
+ /* 88 */ 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb341, 0xb342, 0xb343, 0xb344,
+ /* 90 */ 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c,
+ /* 98 */ 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354,
+ /* a0 */ 0xc4ed, 0xc4ee, 0xb355, 0xb356, 0xc4ef, 0xb357, 0xb358, 0xb359,
+ /* a8 */ 0xc4f0, 0xb35a, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366,
+ /* b0 */ 0xc4f1, 0xc4f2, 0xb367, 0xc4f3, 0xb368, 0xc4f4, 0xb369, 0xb36a,
+ /* b8 */ 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xc4f5, 0xb36f, 0xb370, 0xb371,
+
+ /*** Three byte table, leaf: ed80xx - offset 0x07d51 ***/
+
+ /* 80 */ 0xc4f6, 0xb372, 0xb373, 0xb374, 0xc4f7, 0xb375, 0xb376, 0xb377,
+ /* 88 */ 0xb378, 0xb379, 0xb37a, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385,
+ /* 90 */ 0xb386, 0xc4f8, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c,
+ /* 98 */ 0xc4f9, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393,
+ /* a0 */ 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b,
+ /* a8 */ 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xc4fa, 0xb441, 0xb442,
+ /* b0 */ 0xb443, 0xb444, 0xb445, 0xb446, 0xc4fb, 0xc4fc, 0xb447, 0xb448,
+ /* b8 */ 0xc4fd, 0xb449, 0xb44a, 0xb44b, 0xc4fe, 0xb44c, 0xb44d, 0xb44e,
+
+ /*** Three byte table, leaf: ed81xx - offset 0x07d91 ***/
+
+ /* 80 */ 0xb44f, 0xb450, 0xb451, 0xb452, 0xc5a1, 0xc5a2, 0xb453, 0xc5a3,
+ /* 88 */ 0xb454, 0xc5a4, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a,
+ /* 90 */ 0xc5a5, 0xb461, 0xb462, 0xb463, 0xc5a6, 0xb464, 0xb465, 0xb466,
+ /* 98 */ 0xc5a7, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d,
+ /* a0 */ 0xc5a8, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474,
+ /* a8 */ 0xb475, 0xb476, 0xb477, 0xb478, 0xc5a9, 0xc5aa, 0xb479, 0xb47a,
+ /* b0 */ 0xc5ab, 0xb481, 0xb482, 0xb483, 0xc5ac, 0xb484, 0xb485, 0xb486,
+ /* b8 */ 0xb487, 0xb488, 0xb489, 0xb48a, 0xc5ad, 0xc5ae, 0xb48b, 0xb48c,
+
+ /*** Three byte table, leaf: ed82xx - offset 0x07dd1 ***/
+
+ /* 80 */ 0xb48d, 0xc5af, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493,
+ /* 88 */ 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b,
+ /* 90 */ 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb541, 0xb542, 0xb543,
+ /* 98 */ 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b,
+ /* a0 */ 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xc5b0, 0xc5b1, 0xb550, 0xb551,
+ /* a8 */ 0xc5b2, 0xb552, 0xb553, 0xb554, 0xc5b3, 0xb555, 0xb556, 0xb557,
+ /* b0 */ 0xb558, 0xb559, 0xb55a, 0xb561, 0xc5b4, 0xc5b5, 0xb562, 0xc5b6,
+ /* b8 */ 0xb563, 0xc5b7, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569,
+
+ /*** Three byte table, leaf: ed83xx - offset 0x07e11 ***/
+
+ /* 80 */ 0xc5b8, 0xc5b9, 0xb56a, 0xb56b, 0xc5ba, 0xb56c, 0xb56d, 0xb56e,
+ /* 88 */ 0xc5bb, 0xc5bc, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574,
+ /* 90 */ 0xc5bd, 0xc5be, 0xb575, 0xc5bf, 0xc5c0, 0xc5c1, 0xb576, 0xb577,
+ /* 98 */ 0xb578, 0xb579, 0xb57a, 0xb581, 0xc5c2, 0xc5c3, 0xb582, 0xb583,
+ /* a0 */ 0xc5c4, 0xb584, 0xb585, 0xb586, 0xc5c5, 0xb587, 0xb588, 0xb589,
+ /* a8 */ 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xc5c6, 0xc5c7, 0xb58e, 0xc5c8,
+ /* b0 */ 0xc5c9, 0xc5ca, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594,
+ /* b8 */ 0xc5cb, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b,
+
+ /*** Three byte table, leaf: ed84xx - offset 0x07e51 ***/
+
+ /* 80 */ 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb641, 0xb642, 0xb643,
+ /* 88 */ 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xc5cc, 0xb649, 0xb64a,
+ /* 90 */ 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652,
+ /* 98 */ 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a,
+ /* a0 */ 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668,
+ /* a8 */ 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670,
+ /* b0 */ 0xc5cd, 0xc5ce, 0xb671, 0xb672, 0xc5cf, 0xb673, 0xb674, 0xb675,
+ /* b8 */ 0xc5d0, 0xb676, 0xc5d1, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb681,
+
+ /*** Three byte table, leaf: ed85xx - offset 0x07e91 ***/
+
+ /* 80 */ 0xc5d2, 0xc5d3, 0xb682, 0xc5d4, 0xc5d5, 0xc5d6, 0xb683, 0xb684,
+ /* 88 */ 0xb685, 0xb686, 0xb687, 0xb688, 0xc5d7, 0xc5d8, 0xb689, 0xb68a,
+ /* 90 */ 0xc5d9, 0xb68b, 0xb68c, 0xb68d, 0xc5da, 0xb68e, 0xb68f, 0xb690,
+ /* 98 */ 0xb691, 0xb692, 0xb693, 0xb694, 0xc5db, 0xc5dc, 0xb695, 0xc5dd,
+ /* a0 */ 0xb696, 0xc5de, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c,
+ /* a8 */ 0xc5df, 0xb69d, 0xb69e, 0xb69f, 0xc5e0, 0xb6a0, 0xb741, 0xb742,
+ /* b0 */ 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a,
+ /* b8 */ 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xc5e1, 0xb74f, 0xb750, 0xb751,
+
+ /*** Three byte table, leaf: ed86xx - offset 0x07ed1 ***/
+
+ /* 80 */ 0xb752, 0xb753, 0xb754, 0xb755, 0xc5e2, 0xb756, 0xb757, 0xb758,
+ /* 88 */ 0xc5e3, 0xb759, 0xb75a, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765,
+ /* 90 */ 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d,
+ /* 98 */ 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775,
+ /* a0 */ 0xc5e4, 0xc5e5, 0xb776, 0xb777, 0xc5e6, 0xb778, 0xb779, 0xb77a,
+ /* a8 */ 0xc5e7, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787,
+ /* b0 */ 0xc5e8, 0xc5e9, 0xb788, 0xc5ea, 0xb789, 0xc5eb, 0xb78a, 0xb78b,
+ /* b8 */ 0xb78c, 0xb78d, 0xc5ec, 0xb78e, 0xc5ed, 0xb78f, 0xb790, 0xb791,
+
+ /*** Three byte table, leaf: ed87xx - offset 0x07f11 ***/
+
+ /* 80 */ 0xc5ee, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798,
+ /* 88 */ 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0,
+ /* 90 */ 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848,
+ /* 98 */ 0xc5ef, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f,
+ /* a0 */ 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857,
+ /* a8 */ 0xb858, 0xb859, 0xb85a, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865,
+ /* b0 */ 0xb866, 0xb867, 0xb868, 0xb869, 0xc5f0, 0xb86a, 0xb86b, 0xb86c,
+ /* b8 */ 0xc5f1, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873,
+
+ /*** Three byte table, leaf: ed88xx - offset 0x07f51 ***/
+
+ /* 80 */ 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xc5f2,
+ /* 88 */ 0xb881, 0xc5f3, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887,
+ /* 90 */ 0xc5f4, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e,
+ /* 98 */ 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896,
+ /* a0 */ 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e,
+ /* a8 */ 0xb89f, 0xb8a0, 0xb941, 0xb942, 0xc5f5, 0xc5f6, 0xb943, 0xb944,
+ /* b0 */ 0xc5f7, 0xb945, 0xb946, 0xb947, 0xc5f8, 0xb948, 0xb949, 0xb94a,
+ /* b8 */ 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xc5f9, 0xc5fa, 0xb94f, 0xc5fb,
+
+ /*** Three byte table, leaf: ed89xx - offset 0x07f91 ***/
+
+ /* 80 */ 0xb950, 0xc5fc, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956,
+ /* 88 */ 0xc5fd, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb961, 0xb962, 0xb963,
+ /* 90 */ 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b,
+ /* 98 */ 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xc5fe, 0xb970, 0xb971, 0xb972,
+ /* a0 */ 0xb973, 0xb974, 0xb975, 0xb976, 0xc6a1, 0xb977, 0xb978, 0xb979,
+ /* a8 */ 0xb97a, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987,
+ /* b0 */ 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f,
+ /* b8 */ 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997,
+
+ /*** Three byte table, leaf: ed8axx - offset 0x07fd1 ***/
+
+ /* 80 */ 0xc6a2, 0xc6a3, 0xb998, 0xb999, 0xc6a4, 0xb99a, 0xb99b, 0xb99c,
+ /* 88 */ 0xc6a5, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba41, 0xba42, 0xba43,
+ /* 90 */ 0xc6a6, 0xc6a7, 0xba44, 0xba45, 0xba46, 0xc6a8, 0xba47, 0xba48,
+ /* 98 */ 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xc6a9, 0xba4d, 0xba4e, 0xba4f,
+ /* a0 */ 0xc6aa, 0xba50, 0xba51, 0xba52, 0xc6ab, 0xba53, 0xba54, 0xba55,
+ /* a8 */ 0xba56, 0xba57, 0xba58, 0xba59, 0xc6ac, 0xba5a, 0xba61, 0xba62,
+ /* b0 */ 0xba63, 0xc6ad, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69,
+ /* b8 */ 0xc6ae, 0xc6af, 0xba6a, 0xba6b, 0xc6b0, 0xba6c, 0xba6d, 0xc6b1,
+
+ /*** Three byte table, leaf: ed8bxx - offset 0x08011 ***/
+
+ /* 80 */ 0xc6b2, 0xba6e, 0xc6b3, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73,
+ /* 88 */ 0xc6b4, 0xc6b5, 0xba74, 0xc6b6, 0xba75, 0xba76, 0xba77, 0xba78,
+ /* 90 */ 0xba79, 0xba7a, 0xba81, 0xba82, 0xc6b7, 0xba83, 0xba84, 0xba85,
+ /* 98 */ 0xc6b8, 0xba86, 0xba87, 0xba88, 0xc6b9, 0xba89, 0xba8a, 0xba8b,
+ /* a0 */ 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xc6ba, 0xc6bb, 0xba90, 0xba91,
+ /* a8 */ 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99,
+ /* b0 */ 0xc6bc, 0xc6bd, 0xba9a, 0xba9b, 0xc6be, 0xba9c, 0xba9d, 0xba9e,
+ /* b8 */ 0xc6bf, 0xba9f, 0xbaa0, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45,
+
+ /*** Three byte table, leaf: ed8cxx - offset 0x08051 ***/
+
+ /* 80 */ 0xc6c0, 0xc6c1, 0xbb46, 0xc6c2, 0xbb47, 0xc6c3, 0xbb48, 0xbb49,
+ /* 88 */ 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xc6c4, 0xc6c5, 0xc6c6, 0xbb4e,
+ /* 90 */ 0xc6c7, 0xbb4f, 0xbb50, 0xbb51, 0xc6c8, 0xbb52, 0xc6c9, 0xbb53,
+ /* 98 */ 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xc6ca, 0xc6cb, 0xbb58, 0xc6cc,
+ /* a0 */ 0xc6cd, 0xc6ce, 0xbb59, 0xbb5a, 0xbb61, 0xc6cf, 0xbb62, 0xbb63,
+ /* a8 */ 0xc6d0, 0xc6d1, 0xbb64, 0xbb65, 0xc6d2, 0xbb66, 0xbb67, 0xbb68,
+ /* b0 */ 0xc6d3, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f,
+ /* b8 */ 0xc6d4, 0xc6d5, 0xbb70, 0xc6d6, 0xc6d7, 0xc6d8, 0xbb71, 0xbb72,
+
+ /*** Three byte table, leaf: ed8dxx - offset 0x08091 ***/
+
+ /* 80 */ 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xc6d9, 0xc6da, 0xbb77, 0xbb78,
+ /* 88 */ 0xbb79, 0xbb7a, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86,
+ /* 90 */ 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e,
+ /* 98 */ 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96,
+ /* a0 */ 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e,
+ /* a8 */ 0xbb9f, 0xbba0, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46,
+ /* b0 */ 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e,
+ /* b8 */ 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xc6db, 0xc6dc, 0xbc53, 0xbc54,
+
+ /*** Three byte table, leaf: ed8exx - offset 0x080d1 ***/
+
+ /* 80 */ 0xc6dd, 0xbc55, 0xbc56, 0xbc57, 0xc6de, 0xbc58, 0xbc59, 0xbc5a,
+ /* 88 */ 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xc6df, 0xc6e0, 0xbc65, 0xc6e1,
+ /* 90 */ 0xc6e2, 0xc6e3, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b,
+ /* 98 */ 0xc6e4, 0xc6e5, 0xbc6c, 0xbc6d, 0xc6e6, 0xbc6e, 0xbc6f, 0xbc70,
+ /* a0 */ 0xc6e7, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77,
+ /* a8 */ 0xc6e8, 0xc6e9, 0xbc78, 0xc6ea, 0xbc79, 0xc6eb, 0xbc7a, 0xbc81,
+ /* b0 */ 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xc6ec, 0xbc86, 0xbc87, 0xbc88,
+ /* b8 */ 0xc6ed, 0xbc89, 0xbc8a, 0xbc8b, 0xc6ee, 0xbc8c, 0xbc8d, 0xbc8e,
+
+ /*** Three byte table, leaf: ed8fxx - offset 0x08111 ***/
+
+ /* 80 */ 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xc6ef, 0xc6f0, 0xbc93, 0xbc94,
+ /* 88 */ 0xc6f1, 0xc6f2, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a,
+ /* 90 */ 0xc6f3, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd41,
+ /* 98 */ 0xc6f4, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48,
+ /* a0 */ 0xbd49, 0xc6f5, 0xbd4a, 0xc6f6, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e,
+ /* a8 */ 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xc6f7, 0xc6f8, 0xbd53, 0xbd54,
+ /* b0 */ 0xc6f9, 0xbd55, 0xbd56, 0xbd57, 0xc6fa, 0xbd58, 0xbd59, 0xbd5a,
+ /* b8 */ 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xc6fb, 0xc6fc, 0xbd65, 0xc6fd,
+
+ /*** Three byte table, leaf: ed90xx - offset 0x08151 ***/
+
+ /* 80 */ 0xbd66, 0xc6fe, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c,
+ /* 88 */ 0xc7a1, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73,
+ /* 90 */ 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd81,
+ /* 98 */ 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xc7a2, 0xbd87, 0xbd88,
+ /* a0 */ 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90,
+ /* a8 */ 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98,
+ /* b0 */ 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0,
+ /* b8 */ 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48,
+
+ /*** Three byte table, leaf: ed91xx - offset 0x08191 ***/
+
+ /* 80 */ 0xc7a3, 0xbe49, 0xbe4a, 0xbe4b, 0xc7a4, 0xbe4c, 0xbe4d, 0xbe4e,
+ /* 88 */ 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56,
+ /* 90 */ 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe61, 0xbe62, 0xbe63, 0xbe64,
+ /* 98 */ 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xc7a5, 0xbe69, 0xbe6a, 0xbe6b,
+ /* a0 */ 0xc7a6, 0xbe6c, 0xbe6d, 0xbe6e, 0xc7a7, 0xbe6f, 0xbe70, 0xbe71,
+ /* a8 */ 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xc7a8, 0xbe77, 0xc7a9,
+ /* b0 */ 0xbe78, 0xbe79, 0xbe7a, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85,
+ /* b8 */ 0xc7aa, 0xc7ab, 0xbe86, 0xbe87, 0xc7ac, 0xbe88, 0xbe89, 0xc7ad,
+
+ /*** Three byte table, leaf: ed92xx - offset 0x081d1 ***/
+
+ /* 80 */ 0xc7ae, 0xbe8a, 0xc7af, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f,
+ /* 88 */ 0xc7b0, 0xc7b1, 0xbe90, 0xc7b2, 0xbe91, 0xc7b3, 0xbe92, 0xbe93,
+ /* 90 */ 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xc7b4, 0xbe98, 0xbe99, 0xbe9a,
+ /* 98 */ 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf41, 0xbf42,
+ /* a0 */ 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a,
+ /* a8 */ 0xbf4b, 0xc7b5, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51,
+ /* b0 */ 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59,
+ /* b8 */ 0xbf5a, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67,
+
+ /*** Three byte table, leaf: ed93xx - offset 0x08211 ***/
+
+ /* 80 */ 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f,
+ /* 88 */ 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xc7b6, 0xbf74, 0xbf75, 0xbf76,
+ /* 90 */ 0xc7b7, 0xbf77, 0xbf78, 0xbf79, 0xc7b8, 0xbf7a, 0xbf81, 0xbf82,
+ /* 98 */ 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xc7b9, 0xbf87, 0xbf88, 0xc7ba,
+ /* a0 */ 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90,
+ /* a8 */ 0xc7bb, 0xbf91, 0xbf92, 0xbf93, 0xc7bc, 0xbf94, 0xbf95, 0xbf96,
+ /* b0 */ 0xc7bd, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d,
+ /* b8 */ 0xc7be, 0xbf9e, 0xbf9f, 0xc7bf, 0xbfa0, 0xc7c0, 0xc041, 0xc042,
+
+ /*** Three byte table, leaf: ed94xx - offset 0x08251 ***/
+
+ /* 80 */ 0xc043, 0xc044, 0xc045, 0xc046, 0xc7c1, 0xc047, 0xc048, 0xc049,
+ /* 88 */ 0xc7c2, 0xc04a, 0xc04b, 0xc04c, 0xc7c3, 0xc04d, 0xc04e, 0xc04f,
+ /* 90 */ 0xc050, 0xc051, 0xc052, 0xc053, 0xc7c4, 0xc7c5, 0xc054, 0xc7c6,
+ /* 98 */ 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc061, 0xc062,
+ /* a0 */ 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a,
+ /* a8 */ 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072,
+ /* b0 */ 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a,
+ /* b8 */ 0xc081, 0xc082, 0xc083, 0xc084, 0xc7c7, 0xc7c8, 0xc085, 0xc086,
+
+ /*** Three byte table, leaf: ed95xx - offset 0x08291 ***/
+
+ /* 80 */ 0xc7c9, 0xc087, 0xc088, 0xc089, 0xc7ca, 0xc08a, 0xc08b, 0xc08c,
+ /* 88 */ 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc7cb, 0xc7cc, 0xc091, 0xc7cd,
+ /* 90 */ 0xc092, 0xc7ce, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098,
+ /* 98 */ 0xc7cf, 0xc7d0, 0xc099, 0xc09a, 0xc7d1, 0xc09b, 0xc09c, 0xc09d,
+ /* a0 */ 0xc7d2, 0xc09e, 0xc09f, 0xc0a0, 0xc141, 0xc7d3, 0xc142, 0xc143,
+ /* a8 */ 0xc7d4, 0xc7d5, 0xc144, 0xc7d6, 0xc145, 0xc7d7, 0xc146, 0xc147,
+ /* b0 */ 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc7d8, 0xc7d9, 0xc14c, 0xc14d,
+ /* b8 */ 0xc7da, 0xc14e, 0xc14f, 0xc150, 0xc7db, 0xc151, 0xc152, 0xc153,
+
+ /*** Three byte table, leaf: ed96xx - offset 0x082d1 ***/
+
+ /* 80 */ 0xc154, 0xc155, 0xc156, 0xc157, 0xc7dc, 0xc7dd, 0xc158, 0xc7de,
+ /* 88 */ 0xc7df, 0xc7e0, 0xc159, 0xc15a, 0xc161, 0xc162, 0xc163, 0xc164,
+ /* 90 */ 0xc7e1, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b,
+ /* 98 */ 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173,
+ /* a0 */ 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc7e2, 0xc179, 0xc17a,
+ /* a8 */ 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188,
+ /* b0 */ 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190,
+ /* b8 */ 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198,
+
+ /*** Three byte table, leaf: ed97xx - offset 0x08311 ***/
+
+ /* 80 */ 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0,
+ /* 88 */ 0xc7e3, 0xc7e4, 0xc241, 0xc242, 0xc7e5, 0xc243, 0xc244, 0xc245,
+ /* 90 */ 0xc7e6, 0xc246, 0xc7e7, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b,
+ /* 98 */ 0xc7e8, 0xc7e9, 0xc24c, 0xc7ea, 0xc24d, 0xc7eb, 0xc24e, 0xc24f,
+ /* a0 */ 0xc250, 0xc251, 0xc252, 0xc253, 0xc7ec, 0xc7ed, 0xc254, 0xc255,
+ /* a8 */ 0xc7ee, 0xc256, 0xc257, 0xc258, 0xc7ef, 0xc259, 0xc25a, 0xc261,
+ /* b0 */ 0xc262, 0xc263, 0xc264, 0xc265, 0xc7f0, 0xc7f1, 0xc266, 0xc7f2,
+ /* b8 */ 0xc267, 0xc7f3, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d,
+
+ /*** Three byte table, leaf: ed98xx - offset 0x08351 ***/
+
+ /* 80 */ 0xc7f4, 0xc7f5, 0xc26e, 0xc26f, 0xc7f6, 0xc270, 0xc271, 0xc272,
+ /* 88 */ 0xc7f7, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279,
+ /* 90 */ 0xc7f8, 0xc7f9, 0xc27a, 0xc7fa, 0xc7fb, 0xc7fc, 0xc281, 0xc282,
+ /* 98 */ 0xc283, 0xc284, 0xc285, 0xc286, 0xc7fd, 0xc287, 0xc288, 0xc289,
+ /* a0 */ 0xc7fe, 0xc28a, 0xc28b, 0xc28c, 0xc8a1, 0xc28d, 0xc28e, 0xc28f,
+ /* a8 */ 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc8a2, 0xc295, 0xc296,
+ /* b0 */ 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e,
+ /* b8 */ 0xc8a3, 0xc8a4, 0xc29f, 0xc2a0, 0xc8a5, 0xc341, 0xc342, 0xc343,
+
+ /*** Three byte table, leaf: ed99xx - offset 0x08391 ***/
+
+ /* 80 */ 0xc8a6, 0xc344, 0xc345, 0xc346, 0xc347, 0xc8a7, 0xc348, 0xc349,
+ /* 88 */ 0xc8a8, 0xc8a9, 0xc34a, 0xc8aa, 0xc34b, 0xc8ab, 0xc34c, 0xc34d,
+ /* 90 */ 0xc34e, 0xc8ac, 0xc34f, 0xc350, 0xc8ad, 0xc8ae, 0xc351, 0xc352,
+ /* 98 */ 0xc8af, 0xc353, 0xc354, 0xc355, 0xc8b0, 0xc356, 0xc357, 0xc358,
+ /* a0 */ 0xc359, 0xc35a, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc8b1,
+ /* a8 */ 0xc366, 0xc8b2, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c,
+ /* b0 */ 0xc8b3, 0xc8b4, 0xc36d, 0xc36e, 0xc8b5, 0xc36f, 0xc370, 0xc371,
+ /* b8 */ 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379,
+
+ /*** Three byte table, leaf: ed9axx - offset 0x083d1 ***/
+
+ /* 80 */ 0xc37a, 0xc381, 0xc382, 0xc8b6, 0xc383, 0xc8b7, 0xc384, 0xc385,
+ /* 88 */ 0xc386, 0xc387, 0xc388, 0xc389, 0xc8b8, 0xc8b9, 0xc38a, 0xc38b,
+ /* 90 */ 0xc8ba, 0xc38c, 0xc38d, 0xc38e, 0xc8bb, 0xc38f, 0xc390, 0xc391,
+ /* 98 */ 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc8bc, 0xc397, 0xc8bd,
+ /* a0 */ 0xc398, 0xc8be, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e,
+ /* a8 */ 0xc8bf, 0xc39f, 0xc3a0, 0xc441, 0xc8c0, 0xc442, 0xc443, 0xc444,
+ /* b0 */ 0xc8c1, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449, 0xc44a, 0xc44b,
+ /* b8 */ 0xc44c, 0xc8c2, 0xc44d, 0xc8c3, 0xc44e, 0xc44f, 0xc450, 0xc451,
+
+ /*** Three byte table, leaf: ed9bxx - offset 0x08411 ***/
+
+ /* 80 */ 0xc452, 0xc453, 0xc454, 0xc455, 0xc8c4, 0xc8c5, 0xc456, 0xc457,
+ /* 88 */ 0xc8c6, 0xc458, 0xc459, 0xc45a, 0xc8c7, 0xc461, 0xc462, 0xc463,
+ /* 90 */ 0xc464, 0xc8c8, 0xc465, 0xc466, 0xc8c9, 0xc467, 0xc468, 0xc8ca,
+ /* 98 */ 0xc469, 0xc8cb, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f,
+ /* a0 */ 0xc8cc, 0xc470, 0xc471, 0xc472, 0xc8cd, 0xc473, 0xc474, 0xc475,
+ /* a8 */ 0xc8ce, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc481, 0xc482,
+ /* b0 */ 0xc8cf, 0xc483, 0xc484, 0xc485, 0xc486, 0xc8d0, 0xc487, 0xc488,
+ /* b8 */ 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc8d1, 0xc8d2, 0xc48d, 0xc48e,
+
+ /*** Three byte table, leaf: ed9cxx - offset 0x08451 ***/
+
+ /* 80 */ 0xc8d3, 0xc48f, 0xc490, 0xc491, 0xc8d4, 0xc492, 0xc493, 0xc494,
+ /* 88 */ 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c,
+ /* 90 */ 0xc49d, 0xc8d5, 0xc49e, 0xc49f, 0xc4a0, 0xc541, 0xc542, 0xc543,
+ /* 98 */ 0xc8d6, 0xc8d7, 0xc544, 0xc545, 0xc8d8, 0xc546, 0xc547, 0xc548,
+ /* a0 */ 0xc8d9, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f,
+ /* a8 */ 0xc8da, 0xc8db, 0xc550, 0xc8dc, 0xc551, 0xc8dd, 0xc552, 0xc553,
+ /* b0 */ 0xc554, 0xc555, 0xc556, 0xc557, 0xc8de, 0xc8df, 0xc558, 0xc559,
+ /* b8 */ 0xc8e0, 0xc55a, 0xc561, 0xc562, 0xc8e1, 0xc563, 0xc564, 0xc565,
+
+ /*** Three byte table, leaf: ed9dxx - offset 0x08491 ***/
+
+ /* 80 */ 0xc566, 0xc567, 0xc568, 0xc569, 0xc8e2, 0xc56a, 0xc56b, 0xc8e3,
+ /* 88 */ 0xc56c, 0xc8e4, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572,
+ /* 90 */ 0xc8e5, 0xc8e6, 0xc573, 0xc574, 0xc8e7, 0xc575, 0xc8e8, 0xc8e9,
+ /* 98 */ 0xc8ea, 0xc8eb, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc581,
+ /* a0 */ 0xc8ec, 0xc8ed, 0xc582, 0xc8ee, 0xc583, 0xc8ef, 0xc584, 0xc585,
+ /* a8 */ 0xc586, 0xc8f0, 0xc587, 0xc588, 0xc8f1, 0xc589, 0xc58a, 0xc58b,
+ /* b0 */ 0xc8f2, 0xc58c, 0xc58d, 0xc58e, 0xc8f3, 0xc58f, 0xc590, 0xc591,
+ /* b8 */ 0xc592, 0xc593, 0xc594, 0xc595, 0xc8f4, 0xc8f5, 0xc596, 0xc597,
+
+ /*** Three byte table, leaf: ed9exx - offset 0x084d1 ***/
+
+ /* 80 */ 0xc598, 0xc8f6, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e,
+ /* 88 */ 0xc8f7, 0xc8f8, 0xc59f, 0xc5a0, 0xc8f9, 0xc641, 0xc642, 0xc643,
+ /* 90 */ 0xc8fa, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a,
+ /* 98 */ 0xc8fb, 0xc8fc, 0xc64b, 0xc8fd, 0xc64c, 0xc8fe, 0xc64d, 0xc64e,
+ /* a0 */ 0xc64f, 0xc650, 0xc651, 0xc652, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: ee80xx - offset 0x08511 ***/
+
+ /* 80 */ 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8,
+ /* 88 */ 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0,
+ /* 90 */ 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7, 0xc9b8,
+ /* 98 */ 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, 0xc9c0,
+ /* a0 */ 0xc9c1, 0xc9c2, 0xc9c3, 0xc9c4, 0xc9c5, 0xc9c6, 0xc9c7, 0xc9c8,
+ /* a8 */ 0xc9c9, 0xc9ca, 0xc9cb, 0xc9cc, 0xc9cd, 0xc9ce, 0xc9cf, 0xc9d0,
+ /* b0 */ 0xc9d1, 0xc9d2, 0xc9d3, 0xc9d4, 0xc9d5, 0xc9d6, 0xc9d7, 0xc9d8,
+ /* b8 */ 0xc9d9, 0xc9da, 0xc9db, 0xc9dc, 0xc9dd, 0xc9de, 0xc9df, 0xc9e0,
+
+ /*** Three byte table, leaf: ee81xx - offset 0x08551 ***/
+
+ /* 80 */ 0xc9e1, 0xc9e2, 0xc9e3, 0xc9e4, 0xc9e5, 0xc9e6, 0xc9e7, 0xc9e8,
+ /* 88 */ 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ec, 0xc9ed, 0xc9ee, 0xc9ef, 0xc9f0,
+ /* 90 */ 0xc9f1, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0xc9f8,
+ /* 98 */ 0xc9f9, 0xc9fa, 0xc9fb, 0xc9fc, 0xc9fd, 0xc9fe, 0xfea1, 0xfea2,
+ /* a0 */ 0xfea3, 0xfea4, 0xfea5, 0xfea6, 0xfea7, 0xfea8, 0xfea9, 0xfeaa,
+ /* a8 */ 0xfeab, 0xfeac, 0xfead, 0xfeae, 0xfeaf, 0xfeb0, 0xfeb1, 0xfeb2,
+ /* b0 */ 0xfeb3, 0xfeb4, 0xfeb5, 0xfeb6, 0xfeb7, 0xfeb8, 0xfeb9, 0xfeba,
+ /* b8 */ 0xfebb, 0xfebc, 0xfebd, 0xfebe, 0xfebf, 0xfec0, 0xfec1, 0xfec2,
+
+ /*** Three byte table, leaf: ee82xx - offset 0x08591 ***/
+
+ /* 80 */ 0xfec3, 0xfec4, 0xfec5, 0xfec6, 0xfec7, 0xfec8, 0xfec9, 0xfeca,
+ /* 88 */ 0xfecb, 0xfecc, 0xfecd, 0xfece, 0xfecf, 0xfed0, 0xfed1, 0xfed2,
+ /* 90 */ 0xfed3, 0xfed4, 0xfed5, 0xfed6, 0xfed7, 0xfed8, 0xfed9, 0xfeda,
+ /* 98 */ 0xfedb, 0xfedc, 0xfedd, 0xfede, 0xfedf, 0xfee0, 0xfee1, 0xfee2,
+ /* a0 */ 0xfee3, 0xfee4, 0xfee5, 0xfee6, 0xfee7, 0xfee8, 0xfee9, 0xfeea,
+ /* a8 */ 0xfeeb, 0xfeec, 0xfeed, 0xfeee, 0xfeef, 0xfef0, 0xfef1, 0xfef2,
+ /* b0 */ 0xfef3, 0xfef4, 0xfef5, 0xfef6, 0xfef7, 0xfef8, 0xfef9, 0xfefa,
+ /* b8 */ 0xfefb, 0xfefc, 0xfefd, 0xfefe, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efa4xx - offset 0x085d1 ***/
+
+ /* 80 */ 0xcbd0, 0xcbd6, 0xcbe7, 0xcdcf, 0xcde8, 0xcead, 0xcffb, 0xd0a2,
+ /* 88 */ 0xd0b8, 0xd0d0, 0xd0dd, 0xd1d4, 0xd1d5, 0xd1d8, 0xd1db, 0xd1dc,
+ /* 90 */ 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5,
+ /* 98 */ 0xd1e6, 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ed, 0xd1ef, 0xd1f0,
+ /* a0 */ 0xd1f2, 0xd1f6, 0xd1fa, 0xd1fc, 0xd1fd, 0xd1fe, 0xd2a2, 0xd2a3,
+ /* a8 */ 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ad, 0xd2b2, 0xd2be,
+ /* b0 */ 0xd2c2, 0xd2c3, 0xd2c4, 0xd2c6, 0xd2c7, 0xd2c8, 0xd2c9, 0xd2ca,
+ /* b8 */ 0xd2cb, 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3,
+
+ /*** Three byte table, leaf: efa5xx - offset 0x08611 ***/
+
+ /* 80 */ 0xd2d4, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d9, 0xd2da, 0xd2de, 0xd2df,
+ /* 88 */ 0xd2e1, 0xd2e2, 0xd2e4, 0xd2e5, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9,
+ /* 90 */ 0xd2ea, 0xd2eb, 0xd2f0, 0xd2f1, 0xd2f2, 0xd2f3, 0xd2f4, 0xd2f5,
+ /* 98 */ 0xd2f7, 0xd2f8, 0xd4e6, 0xd4fc, 0xd5a5, 0xd5ab, 0xd5ae, 0xd6b8,
+ /* a0 */ 0xd6cd, 0xd7cb, 0xd7e4, 0xdbc5, 0xdbe4, 0xdca5, 0xdda5, 0xddd5,
+ /* a8 */ 0xddf4, 0xdefc, 0xdefe, 0xdfb3, 0xdfe1, 0xdfe8, 0xe0f1, 0xe1ad,
+ /* b0 */ 0xe1ed, 0xe3f5, 0xe4a1, 0xe4a9, 0xe5ae, 0xe5b1, 0xe5b2, 0xe5b9,
+ /* b8 */ 0xe5bb, 0xe5bc, 0xe5c4, 0xe5ce, 0xe5d0, 0xe5d2, 0xe5d6, 0xe5fa,
+
+ /*** Three byte table, leaf: efa6xx - offset 0x08651 ***/
+
+ /* 80 */ 0xe5fb, 0xe5fc, 0xe5fe, 0xe6a1, 0xe6a4, 0xe6a7, 0xe6ad, 0xe6af,
+ /* 88 */ 0xe6b0, 0xe6b1, 0xe6b3, 0xe6b7, 0xe6b8, 0xe6bc, 0xe6c4, 0xe6c6,
+ /* 90 */ 0xe6c7, 0xe6ca, 0xe6d2, 0xe6d6, 0xe6d9, 0xe6dc, 0xe6df, 0xe6e1,
+ /* 98 */ 0xe6e4, 0xe6e5, 0xe6e6, 0xe6e8, 0xe6ea, 0xe6eb, 0xe6ec, 0xe6ef,
+ /* a0 */ 0xe6f1, 0xe6f2, 0xe6f5, 0xe6f6, 0xe6f7, 0xe6f9, 0xe7a1, 0xe7a6,
+ /* a8 */ 0xe7a9, 0xe7aa, 0xe7ac, 0xe7ad, 0xe7b0, 0xe7bf, 0xe7c1, 0xe7c6,
+ /* b0 */ 0xe7c7, 0xe7cb, 0xe7cd, 0xe7cf, 0xe7d0, 0xe7d3, 0xe7df, 0xe7e4,
+ /* b8 */ 0xe7e6, 0xe7f7, 0xe8e7, 0xe8e8, 0xe8f0, 0xe8f1, 0xe8f7, 0xe8f9,
+
+ /*** Three byte table, leaf: efa7xx - offset 0x08691 ***/
+
+ /* 80 */ 0xe8fb, 0xe8fe, 0xe9a7, 0xe9ac, 0xe9cc, 0xe9f7, 0xeac1, 0xeae5,
+ /* 88 */ 0xeaf4, 0xeaf7, 0xeafc, 0xeafe, 0xeba4, 0xeba7, 0xeba9, 0xebaa,
+ /* 90 */ 0xebba, 0xebbb, 0xebbd, 0xebc1, 0xebc2, 0xebc6, 0xebc7, 0xebcc,
+ /* 98 */ 0xebcf, 0xebd0, 0xebd1, 0xebd2, 0xebd8, 0xeca6, 0xeca7, 0xecaa,
+ /* a0 */ 0xecaf, 0xecb0, 0xecb1, 0xecb2, 0xecb5, 0xecb8, 0xecba, 0xecc0,
+ /* a8 */ 0xecc1, 0xecc5, 0xecc6, 0xecc9, 0xecca, 0xecd5, 0xecdd, 0xecde,
+ /* b0 */ 0xece1, 0xece4, 0xece7, 0xece8, 0xecf7, 0xecf8, 0xecfa, 0xeda1,
+ /* b8 */ 0xeda2, 0xeda3, 0xedee, 0xeedb, 0xf2bd, 0xf2fa, 0xf3b1, 0xf4a7,
+
+ /*** Three byte table, leaf: efa8xx - offset 0x086d1 ***/
+
+ /* 80 */ 0xf4ee, 0xf6f4, 0xf6f6, 0xf7b8, 0xf7c8, 0xf7d3, 0xf8db, 0xf8f0,
+ /* 88 */ 0xfaa1, 0xfaa2, 0xfae6, 0xfca9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: efbcxx - offset 0x08710 ***/
+
+ /* 80 */ 0x0000, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7,
+ /* 88 */ 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af,
+ /* 90 */ 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
+ /* 98 */ 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf,
+ /* a0 */ 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
+ /* a8 */ 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
+ /* b0 */ 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
+ /* b8 */ 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa1ac, 0xa3dd, 0xa3de, 0xa3df,
+
+ /*** Three byte table, leaf: efbdxx - offset 0x08750 ***/
+
+ /* 80 */ 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
+ /* 88 */ 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
+ /* 90 */ 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
+ /* 98 */ 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa2a6, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: efbfxx - offset 0x08790 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0xa1cb, 0xa1cc, 0xa1fe, 0xa3fe, 0x0000, 0xa1cd, 0xa3dc, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1250.map b/src/backend/utils/mb/Unicode/utf8_to_win1250.map
new file mode 100644
index 0000000..c1ac893
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1250.map
@@ -0,0 +1,145 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1250.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1250_from_unicode_tree_table[507];
+
+static const pg_mb_radix_tree win1250_from_unicode_tree =
+{
+ win1250_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003e, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x81, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x017d, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1250_from_unicode_tree_table[507] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003e ***/
+
+ /* c2 */ 0x0048, 0x0086, 0x00c3, 0x0101, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x013f,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00048 ***/
+
+ /* 81 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 89 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 91 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 99 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a0,
+ /* a1 */ 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x00a6, 0x00a7, 0x00a8,
+ /* a9 */ 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0000, 0x00b0,
+ /* b1 */ 0x00b1, 0x0000, 0x0000, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8,
+ /* b9 */ 0x0000, 0x0000, 0x00bb, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00086 ***/
+
+ /* 81 */ 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x0000, 0x0000, 0x00c7, 0x0000,
+ /* 89 */ 0x00c9, 0x0000, 0x00cb, 0x0000, 0x00cd, 0x00ce, 0x0000, 0x0000,
+ /* 91 */ 0x0000, 0x0000, 0x00d3, 0x00d4, 0x0000, 0x00d6, 0x00d7, 0x0000,
+ /* 99 */ 0x0000, 0x00da, 0x0000, 0x00dc, 0x00dd, 0x0000, 0x00df, 0x0000,
+ /* a1 */ 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x0000, 0x0000, 0x00e7, 0x0000,
+ /* a9 */ 0x00e9, 0x0000, 0x00eb, 0x0000, 0x00ed, 0x00ee, 0x0000, 0x0000,
+ /* b1 */ 0x0000, 0x0000, 0x00f3, 0x00f4, 0x0000, 0x00f6, 0x00f7, 0x0000,
+ /* b9 */ 0x0000, 0x00fa, 0x0000, 0x00fc, 0x00fd,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c3 ***/
+
+ /* 81 */ 0x0000, 0x00c3, 0x00e3, 0x00a5, 0x00b9, 0x00c6, 0x00e6, 0x0000,
+ /* 89 */ 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x00cf, 0x00ef, 0x00d0,
+ /* 91 */ 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ca,
+ /* 99 */ 0x00ea, 0x00cc, 0x00ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a1 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b1 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b9 */ 0x00c5, 0x00e5, 0x0000, 0x0000, 0x00bc, 0x00be,
+
+ /*** Two byte table, leaf: c5xx - offset 0x00101 ***/
+
+ /* 81 */ 0x00a3, 0x00b3, 0x00d1, 0x00f1, 0x0000, 0x0000, 0x00d2, 0x00f2,
+ /* 89 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d5,
+ /* 91 */ 0x00f5, 0x0000, 0x0000, 0x00c0, 0x00e0, 0x0000, 0x0000, 0x00d8,
+ /* 99 */ 0x00f8, 0x008c, 0x009c, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x008a,
+ /* a1 */ 0x009a, 0x00de, 0x00fe, 0x008d, 0x009d, 0x0000, 0x0000, 0x0000,
+ /* a9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d9, 0x00f9, 0x00db,
+ /* b1 */ 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b9 */ 0x008f, 0x009f, 0x00af, 0x00bf, 0x008e, 0x009e,
+
+ /*** Two byte table, leaf: cbxx - offset 0x0013f ***/
+
+ /* 81 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1, 0x0000,
+ /* 89 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 91 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a2,
+ /* 99 */ 0x00ff, 0x0000, 0x00b2, 0x0000, 0x00bd, 0x0000, 0x0000, 0x0000,
+ /* a1 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b1 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0017d ***/
+
+ /* e2 */ 0x017e,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0017e ***/
+
+ /* 80 */ 0x0183, 0x0000, 0x01ab, 0x0000, 0x01d3,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00183 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x001ab ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x001d3 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1251.map b/src/backend/utils/mb/Unicode/utf8_to_win1251.map
new file mode 100644
index 0000000..2f4e25c
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1251.map
@@ -0,0 +1,134 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1251.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1251_from_unicode_tree_table[446];
+
+static const pg_mb_radix_tree win1251_from_unicode_tree =
+{
+ win1251_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd2, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0140, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1251_from_unicode_tree_table[446] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0051, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x00d0,
+ /* d2 */ 0x0100,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00051 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x00a6, 0x00a7,
+ /* a8 */ 0x0000, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0000,
+ /* b0 */ 0x00b0, 0x00b1, 0x0000, 0x0000, 0x0000, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x00090 ***/
+
+ /* 80 */ 0x0000, 0x00a8, 0x0080, 0x0081, 0x00aa, 0x00bd, 0x00b2, 0x00af,
+ /* 88 */ 0x00a3, 0x008a, 0x008c, 0x008e, 0x008d, 0x0000, 0x00a1, 0x008f,
+ /* 90 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 98 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* a0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* a8 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* b0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* b8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+
+ /*** Two byte table, leaf: d1xx - offset 0x000d0 ***/
+
+ /* 80 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* 88 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+ /* 90 */ 0x0000, 0x00b8, 0x0090, 0x0083, 0x00ba, 0x00be, 0x00b3, 0x00bf,
+ /* 98 */ 0x00bc, 0x009a, 0x009c, 0x009e, 0x009d, 0x0000, 0x00a2, 0x009f,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 16 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d2xx - offset 0x00100 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00a5, 0x00b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00140 ***/
+
+ /* e2 */ 0x0141,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00141 ***/
+
+ /* 80 */ 0x0146, 0x0000, 0x016e, 0x0000, 0x0196,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00146 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x0016e ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0088, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00196 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x00b9, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1252.map b/src/backend/utils/mb/Unicode/utf8_to_win1252.map
new file mode 100644
index 0000000..5796f33
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1252.map
@@ -0,0 +1,146 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1252.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1252_from_unicode_tree_table[513];
+
+static const pg_mb_radix_tree win1252_from_unicode_tree =
+{
+ win1252_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0183, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1252_from_unicode_tree_table[513] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x004a, 0x008a, 0x0000, 0x00ca, 0x0109, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0143,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x0008a ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+
+ /*** Two byte table, leaf: c5xx - offset 0x000ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x008c, 0x009c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x008a, 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x009f, 0x0000, 0x0000, 0x0000, 0x0000, 0x008e, 0x009e,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x00109 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00143 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00183 ***/
+
+ /* e2 */ 0x0184,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00184 ***/
+
+ /* 80 */ 0x0189, 0x0000, 0x01b1, 0x0000, 0x01d9,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00189 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x001b1 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x001d9 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1253.map b/src/backend/utils/mb/Unicode/utf8_to_win1253.map
new file mode 100644
index 0000000..724faa0
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1253.map
@@ -0,0 +1,135 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1253.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1253_from_unicode_tree_table[454];
+
+static const pg_mb_radix_tree win1253_from_unicode_tree =
+{
+ win1253_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcf, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x0148, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1253_from_unicode_tree_table[454] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x004e, 0x0000, 0x0000, 0x0000, 0x008c, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x0108,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x0000, 0x0000, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0000,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0000, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x00bd,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x0008c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 4 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cexx - offset 0x000c8 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00b4, 0x00a1, 0x00a2, 0x0000,
+ /* 88 */ 0x00b8, 0x00b9, 0x00ba, 0x0000, 0x00bc, 0x0000, 0x00be, 0x00bf,
+ /* 90 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 98 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* a0 */ 0x00d0, 0x00d1, 0x0000, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* a8 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ /* b0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* b8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+
+ /*** Two byte table, leaf: cfxx - offset 0x00108 ***/
+
+ /* 80 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* 88 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00148 ***/
+
+ /* e2 */ 0x0149,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00149 ***/
+
+ /* 80 */ 0x014e, 0x0000, 0x0176, 0x0000, 0x019e,
+
+ /*** Three byte table, leaf: e280xx - offset 0x0014e ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x00af, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x00176 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x0019e ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1254.map b/src/backend/utils/mb/Unicode/utf8_to_win1254.map
new file mode 100644
index 0000000..218bae4
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1254.map
@@ -0,0 +1,157 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1254.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1254_from_unicode_tree_table[557];
+
+static const pg_mb_radix_tree win1254_from_unicode_tree =
+{
+ win1254_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x01af, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1254_from_unicode_tree_table[557] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x004a, 0x008a, 0x00ca, 0x00fc, 0x0135, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x016f,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004a ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x0008a ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x0000, 0x00ff,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000ca ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d0, 0x00f0,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00dd, 0x00fd,
+ /* 14 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000fc ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x008c, 0x009c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00de, 0x00fe,
+ /* a0 */ 0x008a, 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x009f,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x00135 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x0016f ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x001af ***/
+
+ /* e2 */ 0x01b0,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x001b0 ***/
+
+ /* 80 */ 0x01b5, 0x0000, 0x01dd, 0x0000, 0x0205,
+
+ /*** Three byte table, leaf: e280xx - offset 0x001b5 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x001dd ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00205 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1255.map b/src/backend/utils/mb/Unicode/utf8_to_win1255.map
new file mode 100644
index 0000000..6d7d36f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1255.map
@@ -0,0 +1,157 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1255.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1255_from_unicode_tree_table[562];
+
+static const pg_mb_radix_tree win1255_from_unicode_tree =
+{
+ win1255_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd7, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x01a5, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x8e, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1255_from_unicode_tree_table[562] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0056, 0x0096, 0x0000, 0x0000, 0x00ce, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* d2 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0125, 0x0165,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00056 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x0000, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00096 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ba,
+ /* 8 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x000ce ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x00108 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098,
+ /* 35 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d6xx - offset 0x00125 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* b8 */ 0x00c8, 0x00c9, 0x0000, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+
+ /*** Two byte table, leaf: d7xx - offset 0x00165 ***/
+
+ /* 80 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 98 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* a0 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* a8 */ 0x00f8, 0x00f9, 0x00fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x001a5 ***/
+
+ /* e2 */ 0x01a6,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x001a6 ***/
+
+ /* 80 */ 0x01ab, 0x0000, 0x01d8, 0x0000, 0x0205,
+
+ /*** Three byte table, leaf: e280xx - offset 0x001ab ***/
+
+ /* 8e */ 0x00fd, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0096, 0x0097, 0x0000,
+ /* 96 */ 0x0000, 0x0000, 0x0091, 0x0092, 0x0082, 0x0000, 0x0093, 0x0094,
+ /* 9e */ 0x0084, 0x0000, 0x0086, 0x0087, 0x0095, 0x0000, 0x0000, 0x0000,
+ /* a6 */ 0x0085, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ae */ 0x0000, 0x0000, 0x0089, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b6 */ 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x001d8 ***/
+
+ /* 8e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 96 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0080, 0x0000,
+ /* ae */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00205 ***/
+
+ /* 8e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 96 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0099, 0x0000, 0x0000, 0x0000,
+ /* a6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ae */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1256.map b/src/backend/utils/mb/Unicode/utf8_to_win1256.map
new file mode 100644
index 0000000..25f459a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1256.map
@@ -0,0 +1,194 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1256.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1256_from_unicode_tree_table[765];
+
+static const pg_mb_radix_tree win1256_from_unicode_tree =
+{
+ win1256_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xdb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x026a, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x8c, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1256_from_unicode_tree_table[765] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0059, 0x0098, 0x0000, 0x00d5, 0x0102, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x013b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* d2 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016e, 0x01ad,
+ /* da */ 0x01ec, 0x022b,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00059 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00098 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d7,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00e0, 0x0000, 0x00e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0000, 0x0000, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00f4, 0x0000, 0x0000, 0x00f7,
+ /* b8 */ 0x0000, 0x00f9, 0x0000, 0x00fb, 0x00fc,
+ /* 2 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000d5 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x008c, 0x009c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x00102 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x0013b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000,
+ /* 12 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d8xx - offset 0x0016e ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x00ba, 0x0000, 0x0000, 0x0000, 0x00bf,
+ /* a0 */ 0x0000, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* a8 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* b0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d8,
+ /* b8 */ 0x00d9, 0x00da, 0x00db, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: d9xx - offset 0x001ad ***/
+
+ /* 80 */ 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e1, 0x00e3, 0x00e4, 0x00e5,
+ /* 88 */ 0x00e6, 0x00ec, 0x00ed, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f5,
+ /* 90 */ 0x00f6, 0x00f8, 0x00fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x008a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0081,
+
+ /*** Two byte table, leaf: daxx - offset 0x001ec ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008d, 0x0000,
+ /* 88 */ 0x008f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x008e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x009f, 0x0000, 0x0000, 0x0000, 0x00aa,
+
+ /*** Two byte table, leaf: dbxx - offset 0x0022b ***/
+
+ /* 80 */ 0x0000, 0x00c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0026a ***/
+
+ /* e2 */ 0x026b,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0026b ***/
+
+ /* 80 */ 0x0270, 0x0000, 0x029f, 0x0000, 0x02ce,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00270 ***/
+
+ /* 8c */ 0x009d, 0x009e, 0x00fd, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0096,
+ /* 94 */ 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082, 0x0000,
+ /* 9c */ 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095, 0x0000,
+ /* a4 */ 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ac */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000, 0x0000,
+ /* b4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x0029f ***/
+
+ /* 8c */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 94 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9c */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ac */ 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x002ce ***/
+
+ /* 8c */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 94 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9c */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099, 0x0000,
+ /* a4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ac */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1257.map b/src/backend/utils/mb/Unicode/utf8_to_win1257.map
new file mode 100644
index 0000000..47207f6
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1257.map
@@ -0,0 +1,145 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1257.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1257_from_unicode_tree_table[513];
+
+static const pg_mb_radix_tree win1257_from_unicode_tree =
+{
+ win1257_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x003f, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcb, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbe, /* b2_2_upper */
+
+ 0x0183, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1257_from_unicode_tree_table[513] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x0003f ***/
+
+ /* c2 */ 0x0049, 0x0088, 0x00c7, 0x0105, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0144,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00049 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x0000, 0x00a6, 0x00a7,
+ /* a8 */ 0x008d, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x009d,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x008f, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be,
+
+ /*** Two byte table, leaf: c3xx - offset 0x00088 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c4, 0x00c5, 0x00af, 0x0000,
+ /* 88 */ 0x0000, 0x00c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x00d3, 0x0000, 0x00d5, 0x00d6, 0x00d7,
+ /* 98 */ 0x00a8, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00e4, 0x00e5, 0x00bf, 0x0000,
+ /* a8 */ 0x0000, 0x00e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x00f3, 0x0000, 0x00f5, 0x00f6, 0x00f7,
+ /* b8 */ 0x00b8, 0x0000, 0x0000, 0x0000, 0x00fc, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000c7 ***/
+
+ /* 80 */ 0x00c2, 0x00e2, 0x0000, 0x0000, 0x00c0, 0x00e0, 0x00c3, 0x00e3,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c8, 0x00e8, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x00c7, 0x00e7, 0x0000, 0x0000, 0x00cb, 0x00eb,
+ /* 98 */ 0x00c6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x00cc, 0x00ec, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x00ce, 0x00ee, 0x0000, 0x0000, 0x00c1, 0x00e1,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00cd, 0x00ed,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x00cf, 0x00ef, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x00105 ***/
+
+ /* 80 */ 0x0000, 0x00d9, 0x00f9, 0x00d1, 0x00f1, 0x00d2, 0x00f2, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00d4, 0x00f4, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba,
+ /* 98 */ 0x0000, 0x0000, 0x00da, 0x00fa, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00d0, 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x00db, 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x00d8, 0x00f8, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x00ca, 0x00ea, 0x00dd, 0x00fd, 0x00de, 0x00fe,
+
+ /*** Two byte table, leaf: cbxx - offset 0x00144 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008e,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x00ff, 0x0000, 0x009e, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x00183 ***/
+
+ /* e2 */ 0x0184,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00184 ***/
+
+ /* 80 */ 0x0189, 0x0000, 0x01b1, 0x0000, 0x01d9,
+
+ /*** Three byte table, leaf: e280xx - offset 0x00189 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x001b1 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x001d9 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win1258.map b/src/backend/utils/mb/Unicode/utf8_to_win1258.map
new file mode 100644
index 0000000..ad19505
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win1258.map
@@ -0,0 +1,167 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win1258.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win1258_from_unicode_tree_table[618];
+
+static const pg_mb_radix_tree win1258_from_unicode_tree =
+{
+ win1258_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xcc, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x01ec, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0x84, /* b3_2_upper */
+ 0x93, /* b3_3_lower */
+ 0xba, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win1258_from_unicode_tree_table[618] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x004b, 0x008b, 0x00cb, 0x00f9, 0x0132, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x016c, 0x01ac,
+
+ /*** Two byte table, leaf: c2xx - offset 0x0004b ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* a8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* b0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* b8 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+
+ /*** Two byte table, leaf: c3xx - offset 0x0008b ***/
+
+ /* 80 */ 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* 88 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0000, 0x00cd, 0x00ce, 0x00cf,
+ /* 90 */ 0x0000, 0x00d1, 0x0000, 0x00d3, 0x00d4, 0x0000, 0x00d6, 0x00d7,
+ /* 98 */ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0000, 0x0000, 0x00df,
+ /* a0 */ 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* a8 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0000, 0x00ed, 0x00ee, 0x00ef,
+ /* b0 */ 0x0000, 0x00f1, 0x0000, 0x00f3, 0x00f4, 0x0000, 0x00f6, 0x00f7,
+ /* b8 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0000, 0x0000, 0x00ff,
+
+ /*** Two byte table, leaf: c4xx - offset 0x000cb ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x00c3, 0x00e3, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00d0, 0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c5xx - offset 0x000f9 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x008c, 0x009c, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x009f,
+ /* 7 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: c6xx - offset 0x00132 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00d5, 0x00f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dd,
+ /* b0 */ 0x00fd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000,
+ /* 6 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: cbxx - offset 0x0016c ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0088, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0098, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, leaf: ccxx - offset 0x001ac ***/
+
+ /* 80 */ 0x00cc, 0x00ec, 0x0000, 0x00de, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x00d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x00f2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x001ec ***/
+
+ /* e2 */ 0x01ed,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x001ed ***/
+
+ /* 80 */ 0x01f2, 0x0000, 0x021a, 0x0000, 0x0242,
+
+ /*** Three byte table, leaf: e280xx - offset 0x001f2 ***/
+
+ /* 93 */ 0x0096, 0x0097, 0x0000, 0x0000, 0x0000, 0x0091, 0x0092, 0x0082,
+ /* 9b */ 0x0000, 0x0093, 0x0094, 0x0084, 0x0000, 0x0086, 0x0087, 0x0095,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008b, 0x009b,
+
+ /*** Three byte table, leaf: e282xx - offset 0x0021a ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x00fe, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00242 ***/
+
+ /* 93 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 9b */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0099,
+ /* a3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ab */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win866.map b/src/backend/utils/mb/Unicode/utf8_to_win866.map
new file mode 100644
index 0000000..28ed399
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win866.map
@@ -0,0 +1,154 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win866.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win866_from_unicode_tree_table[571];
+
+static const pg_mb_radix_tree win866_from_unicode_tree =
+{
+ win866_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xd1, /* b2_1_upper */
+ 0x80, /* b2_2_lower */
+ 0xbf, /* b2_2_upper */
+
+ 0x010f, /* offset of table for 3-byte inputs */
+ 0xe2, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x84, /* b3_2_lower */
+ 0x96, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbc, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win866_from_unicode_tree_table[571] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* ca */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008f, 0x00cf,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00050 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00ff, 0x0000, 0x0000, 0x0000, 0x00fd, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x00f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00fa,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Two byte table, leaf: d0xx - offset 0x0008f ***/
+
+ /* 80 */ 0x0000, 0x00f0, 0x0000, 0x0000, 0x00f2, 0x0000, 0x0000, 0x00f4,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f6, 0x0000,
+ /* 90 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ /* 98 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ /* a0 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ /* a8 */ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ /* b0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* b8 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+
+ /*** Two byte table, leaf: d1xx - offset 0x000cf ***/
+
+ /* 80 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 88 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* 90 */ 0x0000, 0x00f1, 0x0000, 0x0000, 0x00f3, 0x0000, 0x0000, 0x00f5,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00f7, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, byte #1: xx - offset 0x0010f ***/
+
+ /* e2 */ 0x0110,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x00110 ***/
+
+ /* 84 */ 0x0123, 0x0000, 0x0000, 0x0000, 0x0147, 0x0000, 0x0000, 0x0000,
+ /* 8c */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 94 */ 0x0184, 0x01c1, 0x01fe,
+
+ /*** Three byte table, leaf: e284xx - offset 0x00123 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00fc, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 25 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e288xx - offset 0x00147 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x00f9, 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e294xx - offset 0x00184 ***/
+
+ /* 80 */ 0x00c4, 0x0000, 0x00b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00da, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00bf, 0x0000, 0x0000, 0x0000, 0x00c0, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x00d9, 0x0000, 0x0000, 0x0000, 0x00c3, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00b4, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c2, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c1, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x00c5,
+
+ /*** Three byte table, leaf: e295xx - offset 0x001c1 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00cd, 0x00ba, 0x00d5, 0x00d6, 0x00c9, 0x00b8, 0x00b7, 0x00bb,
+ /* 98 */ 0x00d4, 0x00d3, 0x00c8, 0x00be, 0x00bd, 0x00bc, 0x00c6, 0x00c7,
+ /* a0 */ 0x00cc, 0x00b5, 0x00b6, 0x00b9, 0x00d1, 0x00d2, 0x00cb, 0x00cf,
+ /* a8 */ 0x00d0, 0x00ca, 0x00d8, 0x00d7, 0x00ce, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e296xx - offset 0x001fe ***/
+
+ /* 80 */ 0x00df, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x00db, 0x0000, 0x0000, 0x0000, 0x00dd, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x00de, 0x00b0, 0x00b1, 0x00b2, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/utf8_to_win874.map b/src/backend/utils/mb/Unicode/utf8_to_win874.map
new file mode 100644
index 0000000..e5a9e8f
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/utf8_to_win874.map
@@ -0,0 +1,130 @@
+/* src/backend/utils/mb/Unicode/utf8_to_win874.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint16 win874_from_unicode_tree_table[421];
+
+static const pg_mb_radix_tree win874_from_unicode_tree =
+{
+ win874_from_unicode_tree_table,
+ NULL, /* 32-bit table not used */
+
+ 0x0000, /* offset of table for 1-byte inputs */
+ 0x00, /* b1_lower */
+ 0x00, /* b1_upper */
+
+ 0x0040, /* offset of table for 2-byte inputs */
+ 0xc2, /* b2_1_lower */
+ 0xc2, /* b2_1_upper */
+ 0xa0, /* b2_2_lower */
+ 0xa0, /* b2_2_upper */
+
+ 0x0042, /* offset of table for 3-byte inputs */
+ 0xe0, /* b3_1_lower */
+ 0xe2, /* b3_1_upper */
+ 0x80, /* b3_2_lower */
+ 0xb9, /* b3_2_upper */
+ 0x80, /* b3_3_lower */
+ 0xbf, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint16 win874_from_unicode_tree_table[421] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 08 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 10 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 18 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 20 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 28 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 30 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 38 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Two byte table, byte #1: xx - offset 0x00040 ***/
+
+ /* c2 */ 0x0041,
+
+ /*** Two byte table, leaf: c2xx - offset 0x00041 ***/
+
+ /* a0 */ 0x00a0,
+
+ /*** Three byte table, byte #1: xx - offset 0x00042 ***/
+
+ /* e0 */ 0x0045, 0x0000, 0x007f,
+
+ /*** Three byte table, byte #2: e0xx - offset 0x00045 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x00b8, 0x00f8,
+
+ /*** Three byte table, byte #2: e2xx - offset 0x0007f ***/
+
+ /* 80 */ 0x0125, 0x0000, 0x0165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000,
+ /* 1 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e0b8xx - offset 0x000b8 ***/
+
+ /* 80 */ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ /* 88 */ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ /* 90 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ /* 98 */ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ /* a0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ /* a8 */ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* b0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ /* b8 */ 0x00d8, 0x00d9, 0x00da, 0x0000, 0x0000, 0x0000, 0x0000, 0x00df,
+
+ /*** Three byte table, leaf: e0b9xx - offset 0x000f8 ***/
+
+ /* 80 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ /* 88 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* 90 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ /* 98 */ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 19 trailing zero values shared with next segment */
+
+ /*** Three byte table, leaf: e280xx - offset 0x00125 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0096, 0x0097, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0091, 0x0092, 0x0000, 0x0000, 0x0093, 0x0094, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0095, 0x0000, 0x0000, 0x0000, 0x0085, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+
+ /*** Three byte table, leaf: e282xx - offset 0x00165 ***/
+
+ /* 80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 88 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 90 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 98 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* a8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000,
+ /* b0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* b8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
diff --git a/src/backend/utils/mb/Unicode/win1250_to_utf8.map b/src/backend/utils/mb/Unicode/win1250_to_utf8.map
new file mode 100644
index 0000000..d1957a3
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1250_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1250_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1250_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1250_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1250_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1250_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x000000,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x000000, 0xe280b0, 0x00c5a0, 0xe280b9,
+ /* 8c */ 0x00c59a, 0x00c5a4, 0x00c5bd, 0x00c5b9,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x000000, 0xe284a2, 0x00c5a1, 0xe280ba,
+ /* 9c */ 0x00c59b, 0x00c5a5, 0x00c5be, 0x00c5ba,
+ /* a0 */ 0x00c2a0, 0x00cb87, 0x00cb98, 0x00c581,
+ /* a4 */ 0x00c2a4, 0x00c484, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c59e, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c5bb,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00cb9b, 0x00c582,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c485, 0x00c59f, 0x00c2bb,
+ /* bc */ 0x00c4bd, 0x00cb9d, 0x00c4be, 0x00c5bc,
+ /* c0 */ 0x00c594, 0x00c381, 0x00c382, 0x00c482,
+ /* c4 */ 0x00c384, 0x00c4b9, 0x00c486, 0x00c387,
+ /* c8 */ 0x00c48c, 0x00c389, 0x00c498, 0x00c38b,
+ /* cc */ 0x00c49a, 0x00c38d, 0x00c38e, 0x00c48e,
+ /* d0 */ 0x00c490, 0x00c583, 0x00c587, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c590, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c598, 0x00c5ae, 0x00c39a, 0x00c5b0,
+ /* dc */ 0x00c39c, 0x00c39d, 0x00c5a2, 0x00c39f,
+ /* e0 */ 0x00c595, 0x00c3a1, 0x00c3a2, 0x00c483,
+ /* e4 */ 0x00c3a4, 0x00c4ba, 0x00c487, 0x00c3a7,
+ /* e8 */ 0x00c48d, 0x00c3a9, 0x00c499, 0x00c3ab,
+ /* ec */ 0x00c49b, 0x00c3ad, 0x00c3ae, 0x00c48f,
+ /* f0 */ 0x00c491, 0x00c584, 0x00c588, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c591, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c599, 0x00c5af, 0x00c3ba, 0x00c5b1,
+ /* fc */ 0x00c3bc, 0x00c3bd, 0x00c5a3, 0x00cb99
+};
diff --git a/src/backend/utils/mb/Unicode/win1251_to_utf8.map b/src/backend/utils/mb/Unicode/win1251_to_utf8.map
new file mode 100644
index 0000000..a1f8274
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1251_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1251_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1251_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1251_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1251_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1251_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00d082, 0x00d083, 0xe2809a, 0x00d193,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0xe282ac, 0xe280b0, 0x00d089, 0xe280b9,
+ /* 8c */ 0x00d08a, 0x00d08c, 0x00d08b, 0x00d08f,
+ /* 90 */ 0x00d192, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x000000, 0xe284a2, 0x00d199, 0xe280ba,
+ /* 9c */ 0x00d19a, 0x00d19c, 0x00d19b, 0x00d19f,
+ /* a0 */ 0x00c2a0, 0x00d08e, 0x00d19e, 0x00d088,
+ /* a4 */ 0x00c2a4, 0x00d290, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00d081, 0x00c2a9, 0x00d084, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00d087,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00d086, 0x00d196,
+ /* b4 */ 0x00d291, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00d191, 0xe28496, 0x00d194, 0x00c2bb,
+ /* bc */ 0x00d198, 0x00d085, 0x00d195, 0x00d197,
+ /* c0 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* c4 */ 0x00d094, 0x00d095, 0x00d096, 0x00d097,
+ /* c8 */ 0x00d098, 0x00d099, 0x00d09a, 0x00d09b,
+ /* cc */ 0x00d09c, 0x00d09d, 0x00d09e, 0x00d09f,
+ /* d0 */ 0x00d0a0, 0x00d0a1, 0x00d0a2, 0x00d0a3,
+ /* d4 */ 0x00d0a4, 0x00d0a5, 0x00d0a6, 0x00d0a7,
+ /* d8 */ 0x00d0a8, 0x00d0a9, 0x00d0aa, 0x00d0ab,
+ /* dc */ 0x00d0ac, 0x00d0ad, 0x00d0ae, 0x00d0af,
+ /* e0 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* e4 */ 0x00d0b4, 0x00d0b5, 0x00d0b6, 0x00d0b7,
+ /* e8 */ 0x00d0b8, 0x00d0b9, 0x00d0ba, 0x00d0bb,
+ /* ec */ 0x00d0bc, 0x00d0bd, 0x00d0be, 0x00d0bf,
+ /* f0 */ 0x00d180, 0x00d181, 0x00d182, 0x00d183,
+ /* f4 */ 0x00d184, 0x00d185, 0x00d186, 0x00d187,
+ /* f8 */ 0x00d188, 0x00d189, 0x00d18a, 0x00d18b,
+ /* fc */ 0x00d18c, 0x00d18d, 0x00d18e, 0x00d18f
+};
diff --git a/src/backend/utils/mb/Unicode/win1252_to_utf8.map b/src/backend/utils/mb/Unicode/win1252_to_utf8.map
new file mode 100644
index 0000000..09113aa
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1252_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1252_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1252_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1252_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1252_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1252_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x00cb86, 0xe280b0, 0x00c5a0, 0xe280b9,
+ /* 8c */ 0x00c592, 0x000000, 0x00c5bd, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x00cb9c, 0xe284a2, 0x00c5a1, 0xe280ba,
+ /* 9c */ 0x00c593, 0x000000, 0x00c5be, 0x00c5b8,
+ /* a0 */ 0x00c2a0, 0x00c2a1, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c2aa, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00c2ba, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c2bf,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c383,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c390, 0x00c391, 0x00c392, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c395, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c398, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c39d, 0x00c39e, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c3a3,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00c3ac, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c3b0, 0x00c3b1, 0x00c3b2, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c3b8, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c3bd, 0x00c3be, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/win1253_to_utf8.map b/src/backend/utils/mb/Unicode/win1253_to_utf8.map
new file mode 100644
index 0000000..3d0d6e8
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1253_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1253_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1253_to_unicode_tree_table[254];
+
+static const pg_mb_radix_tree win1253_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1253_to_unicode_tree_table,
+
+ 0x007f, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xfe, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1253_to_unicode_tree_table[254] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x0007f ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x000000, 0xe280b0, 0x000000, 0xe280b9,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x000000, 0xe284a2, 0x000000, 0xe280ba,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c2a0, 0x00ce85, 0x00ce86, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x000000, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0xe28095,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00ce84, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00ce88, 0x00ce89, 0x00ce8a, 0x00c2bb,
+ /* bc */ 0x00ce8c, 0x00c2bd, 0x00ce8e, 0x00ce8f,
+ /* c0 */ 0x00ce90, 0x00ce91, 0x00ce92, 0x00ce93,
+ /* c4 */ 0x00ce94, 0x00ce95, 0x00ce96, 0x00ce97,
+ /* c8 */ 0x00ce98, 0x00ce99, 0x00ce9a, 0x00ce9b,
+ /* cc */ 0x00ce9c, 0x00ce9d, 0x00ce9e, 0x00ce9f,
+ /* d0 */ 0x00cea0, 0x00cea1, 0x000000, 0x00cea3,
+ /* d4 */ 0x00cea4, 0x00cea5, 0x00cea6, 0x00cea7,
+ /* d8 */ 0x00cea8, 0x00cea9, 0x00ceaa, 0x00ceab,
+ /* dc */ 0x00ceac, 0x00cead, 0x00ceae, 0x00ceaf,
+ /* e0 */ 0x00ceb0, 0x00ceb1, 0x00ceb2, 0x00ceb3,
+ /* e4 */ 0x00ceb4, 0x00ceb5, 0x00ceb6, 0x00ceb7,
+ /* e8 */ 0x00ceb8, 0x00ceb9, 0x00ceba, 0x00cebb,
+ /* ec */ 0x00cebc, 0x00cebd, 0x00cebe, 0x00cebf,
+ /* f0 */ 0x00cf80, 0x00cf81, 0x00cf82, 0x00cf83,
+ /* f4 */ 0x00cf84, 0x00cf85, 0x00cf86, 0x00cf87,
+ /* f8 */ 0x00cf88, 0x00cf89, 0x00cf8a, 0x00cf8b,
+ /* fc */ 0x00cf8c, 0x00cf8d, 0x00cf8e
+};
diff --git a/src/backend/utils/mb/Unicode/win1254_to_utf8.map b/src/backend/utils/mb/Unicode/win1254_to_utf8.map
new file mode 100644
index 0000000..9ad9c85
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1254_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1254_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1254_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1254_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1254_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1254_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x00cb86, 0xe280b0, 0x00c5a0, 0xe280b9,
+ /* 8c */ 0x00c592, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x00cb9c, 0xe284a2, 0x00c5a1, 0xe280ba,
+ /* 9c */ 0x00c593, 0x000000, 0x000000, 0x00c5b8,
+ /* a0 */ 0x00c2a0, 0x00c2a1, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c2aa, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00c2ba, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c2bf,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c383,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00c38c, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c49e, 0x00c391, 0x00c392, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c395, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c398, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c4b0, 0x00c59e, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c3a3,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00c3ac, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c49f, 0x00c3b1, 0x00c3b2, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c3b5, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c3b8, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c4b1, 0x00c59f, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/win1255_to_utf8.map b/src/backend/utils/mb/Unicode/win1255_to_utf8.map
new file mode 100644
index 0000000..2fdec17
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1255_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1255_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1255_to_unicode_tree_table[254];
+
+static const pg_mb_radix_tree win1255_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1255_to_unicode_tree_table,
+
+ 0x007f, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xfe, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1255_to_unicode_tree_table[254] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x0007f ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x00cb86, 0xe280b0, 0x000000, 0xe280b9,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x00cb9c, 0xe284a2, 0x000000, 0xe280ba,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c2a0, 0x00c2a1, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0xe282aa, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c397, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00c3b7, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c2bf,
+ /* c0 */ 0x00d6b0, 0x00d6b1, 0x00d6b2, 0x00d6b3,
+ /* c4 */ 0x00d6b4, 0x00d6b5, 0x00d6b6, 0x00d6b7,
+ /* c8 */ 0x00d6b8, 0x00d6b9, 0x000000, 0x00d6bb,
+ /* cc */ 0x00d6bc, 0x00d6bd, 0x00d6be, 0x00d6bf,
+ /* d0 */ 0x00d780, 0x00d781, 0x00d782, 0x00d783,
+ /* d4 */ 0x00d7b0, 0x00d7b1, 0x00d7b2, 0x00d7b3,
+ /* d8 */ 0x00d7b4, 0x000000, 0x000000, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* e0 */ 0x00d790, 0x00d791, 0x00d792, 0x00d793,
+ /* e4 */ 0x00d794, 0x00d795, 0x00d796, 0x00d797,
+ /* e8 */ 0x00d798, 0x00d799, 0x00d79a, 0x00d79b,
+ /* ec */ 0x00d79c, 0x00d79d, 0x00d79e, 0x00d79f,
+ /* f0 */ 0x00d7a0, 0x00d7a1, 0x00d7a2, 0x00d7a3,
+ /* f4 */ 0x00d7a4, 0x00d7a5, 0x00d7a6, 0x00d7a7,
+ /* f8 */ 0x00d7a8, 0x00d7a9, 0x00d7aa, 0x000000,
+ /* fc */ 0x000000, 0xe2808e, 0xe2808f
+};
diff --git a/src/backend/utils/mb/Unicode/win1256_to_utf8.map b/src/backend/utils/mb/Unicode/win1256_to_utf8.map
new file mode 100644
index 0000000..33142bb
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1256_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1256_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1256_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1256_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1256_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1256_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x00d9be, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x00cb86, 0xe280b0, 0x00d9b9, 0xe280b9,
+ /* 8c */ 0x00c592, 0x00da86, 0x00da98, 0x00da88,
+ /* 90 */ 0x00daaf, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x00daa9, 0xe284a2, 0x00da91, 0xe280ba,
+ /* 9c */ 0x00c593, 0xe2808c, 0xe2808d, 0x00daba,
+ /* a0 */ 0x00c2a0, 0x00d88c, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00dabe, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00d89b, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00d89f,
+ /* c0 */ 0x00db81, 0x00d8a1, 0x00d8a2, 0x00d8a3,
+ /* c4 */ 0x00d8a4, 0x00d8a5, 0x00d8a6, 0x00d8a7,
+ /* c8 */ 0x00d8a8, 0x00d8a9, 0x00d8aa, 0x00d8ab,
+ /* cc */ 0x00d8ac, 0x00d8ad, 0x00d8ae, 0x00d8af,
+ /* d0 */ 0x00d8b0, 0x00d8b1, 0x00d8b2, 0x00d8b3,
+ /* d4 */ 0x00d8b4, 0x00d8b5, 0x00d8b6, 0x00c397,
+ /* d8 */ 0x00d8b7, 0x00d8b8, 0x00d8b9, 0x00d8ba,
+ /* dc */ 0x00d980, 0x00d981, 0x00d982, 0x00d983,
+ /* e0 */ 0x00c3a0, 0x00d984, 0x00c3a2, 0x00d985,
+ /* e4 */ 0x00d986, 0x00d987, 0x00d988, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00d989, 0x00d98a, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00d98b, 0x00d98c, 0x00d98d, 0x00d98e,
+ /* f4 */ 0x00c3b4, 0x00d98f, 0x00d990, 0x00c3b7,
+ /* f8 */ 0x00d991, 0x00c3b9, 0x00d992, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0xe2808e, 0xe2808f, 0x00db92
+};
diff --git a/src/backend/utils/mb/Unicode/win1257_to_utf8.map b/src/backend/utils/mb/Unicode/win1257_to_utf8.map
new file mode 100644
index 0000000..1f79ea7
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1257_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1257_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1257_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1257_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1257_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1257_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x000000,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x000000, 0xe280b0, 0x000000, 0xe280b9,
+ /* 8c */ 0x000000, 0x00c2a8, 0x00cb87, 0x00c2b8,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x000000, 0xe284a2, 0x000000, 0xe280ba,
+ /* 9c */ 0x000000, 0x00c2af, 0x00cb9b, 0x000000,
+ /* a0 */ 0x00c2a0, 0x000000, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x000000, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c398, 0x00c2a9, 0x00c596, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c386,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c3b8, 0x00c2b9, 0x00c597, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c3a6,
+ /* c0 */ 0x00c484, 0x00c4ae, 0x00c480, 0x00c486,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c498, 0x00c492,
+ /* c8 */ 0x00c48c, 0x00c389, 0x00c5b9, 0x00c496,
+ /* cc */ 0x00c4a2, 0x00c4b6, 0x00c4aa, 0x00c4bb,
+ /* d0 */ 0x00c5a0, 0x00c583, 0x00c585, 0x00c393,
+ /* d4 */ 0x00c58c, 0x00c395, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c5b2, 0x00c581, 0x00c59a, 0x00c5aa,
+ /* dc */ 0x00c39c, 0x00c5bb, 0x00c5bd, 0x00c39f,
+ /* e0 */ 0x00c485, 0x00c4af, 0x00c481, 0x00c487,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c499, 0x00c493,
+ /* e8 */ 0x00c48d, 0x00c3a9, 0x00c5ba, 0x00c497,
+ /* ec */ 0x00c4a3, 0x00c4b7, 0x00c4ab, 0x00c4bc,
+ /* f0 */ 0x00c5a1, 0x00c584, 0x00c586, 0x00c3b3,
+ /* f4 */ 0x00c58d, 0x00c3b5, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c5b3, 0x00c582, 0x00c59b, 0x00c5ab,
+ /* fc */ 0x00c3bc, 0x00c5bc, 0x00c5be, 0x00cb99
+};
diff --git a/src/backend/utils/mb/Unicode/win1258_to_utf8.map b/src/backend/utils/mb/Unicode/win1258_to_utf8.map
new file mode 100644
index 0000000..9890004
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win1258_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win1258_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win1258_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win1258_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win1258_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win1258_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0xe2809a, 0x00c692,
+ /* 84 */ 0xe2809e, 0xe280a6, 0xe280a0, 0xe280a1,
+ /* 88 */ 0x00cb86, 0xe280b0, 0x000000, 0xe280b9,
+ /* 8c */ 0x00c592, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x00cb9c, 0xe284a2, 0x000000, 0xe280ba,
+ /* 9c */ 0x00c593, 0x000000, 0x000000, 0x00c5b8,
+ /* a0 */ 0x00c2a0, 0x00c2a1, 0x00c2a2, 0x00c2a3,
+ /* a4 */ 0x00c2a4, 0x00c2a5, 0x00c2a6, 0x00c2a7,
+ /* a8 */ 0x00c2a8, 0x00c2a9, 0x00c2aa, 0x00c2ab,
+ /* ac */ 0x00c2ac, 0x00c2ad, 0x00c2ae, 0x00c2af,
+ /* b0 */ 0x00c2b0, 0x00c2b1, 0x00c2b2, 0x00c2b3,
+ /* b4 */ 0x00c2b4, 0x00c2b5, 0x00c2b6, 0x00c2b7,
+ /* b8 */ 0x00c2b8, 0x00c2b9, 0x00c2ba, 0x00c2bb,
+ /* bc */ 0x00c2bc, 0x00c2bd, 0x00c2be, 0x00c2bf,
+ /* c0 */ 0x00c380, 0x00c381, 0x00c382, 0x00c482,
+ /* c4 */ 0x00c384, 0x00c385, 0x00c386, 0x00c387,
+ /* c8 */ 0x00c388, 0x00c389, 0x00c38a, 0x00c38b,
+ /* cc */ 0x00cc80, 0x00c38d, 0x00c38e, 0x00c38f,
+ /* d0 */ 0x00c490, 0x00c391, 0x00cc89, 0x00c393,
+ /* d4 */ 0x00c394, 0x00c6a0, 0x00c396, 0x00c397,
+ /* d8 */ 0x00c398, 0x00c399, 0x00c39a, 0x00c39b,
+ /* dc */ 0x00c39c, 0x00c6af, 0x00cc83, 0x00c39f,
+ /* e0 */ 0x00c3a0, 0x00c3a1, 0x00c3a2, 0x00c483,
+ /* e4 */ 0x00c3a4, 0x00c3a5, 0x00c3a6, 0x00c3a7,
+ /* e8 */ 0x00c3a8, 0x00c3a9, 0x00c3aa, 0x00c3ab,
+ /* ec */ 0x00cc81, 0x00c3ad, 0x00c3ae, 0x00c3af,
+ /* f0 */ 0x00c491, 0x00c3b1, 0x00cca3, 0x00c3b3,
+ /* f4 */ 0x00c3b4, 0x00c6a1, 0x00c3b6, 0x00c3b7,
+ /* f8 */ 0x00c3b8, 0x00c3b9, 0x00c3ba, 0x00c3bb,
+ /* fc */ 0x00c3bc, 0x00c6b0, 0xe282ab, 0x00c3bf
+};
diff --git a/src/backend/utils/mb/Unicode/win866_to_utf8.map b/src/backend/utils/mb/Unicode/win866_to_utf8.map
new file mode 100644
index 0000000..6880765
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win866_to_utf8.map
@@ -0,0 +1,111 @@
+/* src/backend/utils/mb/Unicode/win866_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win866_to_unicode_tree_table[256];
+
+static const pg_mb_radix_tree win866_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win866_to_unicode_tree_table,
+
+ 0x0080, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xff, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win866_to_unicode_tree_table[256] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 7c */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x00080 ***/
+
+ /* 80 */ 0x00d090, 0x00d091, 0x00d092, 0x00d093,
+ /* 84 */ 0x00d094, 0x00d095, 0x00d096, 0x00d097,
+ /* 88 */ 0x00d098, 0x00d099, 0x00d09a, 0x00d09b,
+ /* 8c */ 0x00d09c, 0x00d09d, 0x00d09e, 0x00d09f,
+ /* 90 */ 0x00d0a0, 0x00d0a1, 0x00d0a2, 0x00d0a3,
+ /* 94 */ 0x00d0a4, 0x00d0a5, 0x00d0a6, 0x00d0a7,
+ /* 98 */ 0x00d0a8, 0x00d0a9, 0x00d0aa, 0x00d0ab,
+ /* 9c */ 0x00d0ac, 0x00d0ad, 0x00d0ae, 0x00d0af,
+ /* a0 */ 0x00d0b0, 0x00d0b1, 0x00d0b2, 0x00d0b3,
+ /* a4 */ 0x00d0b4, 0x00d0b5, 0x00d0b6, 0x00d0b7,
+ /* a8 */ 0x00d0b8, 0x00d0b9, 0x00d0ba, 0x00d0bb,
+ /* ac */ 0x00d0bc, 0x00d0bd, 0x00d0be, 0x00d0bf,
+ /* b0 */ 0xe29691, 0xe29692, 0xe29693, 0xe29482,
+ /* b4 */ 0xe294a4, 0xe295a1, 0xe295a2, 0xe29596,
+ /* b8 */ 0xe29595, 0xe295a3, 0xe29591, 0xe29597,
+ /* bc */ 0xe2959d, 0xe2959c, 0xe2959b, 0xe29490,
+ /* c0 */ 0xe29494, 0xe294b4, 0xe294ac, 0xe2949c,
+ /* c4 */ 0xe29480, 0xe294bc, 0xe2959e, 0xe2959f,
+ /* c8 */ 0xe2959a, 0xe29594, 0xe295a9, 0xe295a6,
+ /* cc */ 0xe295a0, 0xe29590, 0xe295ac, 0xe295a7,
+ /* d0 */ 0xe295a8, 0xe295a4, 0xe295a5, 0xe29599,
+ /* d4 */ 0xe29598, 0xe29592, 0xe29593, 0xe295ab,
+ /* d8 */ 0xe295aa, 0xe29498, 0xe2948c, 0xe29688,
+ /* dc */ 0xe29684, 0xe2968c, 0xe29690, 0xe29680,
+ /* e0 */ 0x00d180, 0x00d181, 0x00d182, 0x00d183,
+ /* e4 */ 0x00d184, 0x00d185, 0x00d186, 0x00d187,
+ /* e8 */ 0x00d188, 0x00d189, 0x00d18a, 0x00d18b,
+ /* ec */ 0x00d18c, 0x00d18d, 0x00d18e, 0x00d18f,
+ /* f0 */ 0x00d081, 0x00d191, 0x00d084, 0x00d194,
+ /* f4 */ 0x00d087, 0x00d197, 0x00d08e, 0x00d19e,
+ /* f8 */ 0x00c2b0, 0xe28899, 0x00c2b7, 0xe2889a,
+ /* fc */ 0xe28496, 0x00c2a4, 0xe296a0, 0x00c2a0
+};
diff --git a/src/backend/utils/mb/Unicode/win874_to_utf8.map b/src/backend/utils/mb/Unicode/win874_to_utf8.map
new file mode 100644
index 0000000..a07c34a
--- /dev/null
+++ b/src/backend/utils/mb/Unicode/win874_to_utf8.map
@@ -0,0 +1,109 @@
+/* src/backend/utils/mb/Unicode/win874_to_utf8.map */
+/* This file is generated by src/backend/utils/mb/Unicode/UCS_to_most.pl */
+
+static const uint32 win874_to_unicode_tree_table[248];
+
+static const pg_mb_radix_tree win874_to_unicode_tree =
+{
+ NULL, /* 16-bit table not used */
+ win874_to_unicode_tree_table,
+
+ 0x007c, /* offset of table for 1-byte inputs */
+ 0x80, /* b1_lower */
+ 0xfb, /* b1_upper */
+
+ 0x0000, /* offset of table for 2-byte inputs */
+ 0x00, /* b2_1_lower */
+ 0x00, /* b2_1_upper */
+ 0x00, /* b2_2_lower */
+ 0x00, /* b2_2_upper */
+
+ 0x0000, /* offset of table for 3-byte inputs */
+ 0x00, /* b3_1_lower */
+ 0x00, /* b3_1_upper */
+ 0x00, /* b3_2_lower */
+ 0x00, /* b3_2_upper */
+ 0x00, /* b3_3_lower */
+ 0x00, /* b3_3_upper */
+
+ 0x0000, /* offset of table for 4-byte inputs */
+ 0x00, /* b4_1_lower */
+ 0x00, /* b4_1_upper */
+ 0x00, /* b4_2_lower */
+ 0x00, /* b4_2_upper */
+ 0x00, /* b4_3_lower */
+ 0x00, /* b4_3_upper */
+ 0x00, /* b4_4_lower */
+ 0x00 /* b4_4_upper */
+};
+
+static const uint32 win874_to_unicode_tree_table[248] =
+{
+ /*** Dummy map, for invalid values - offset 0x00000 ***/
+
+ /* 00 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 04 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 08 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 0c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 10 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 14 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 18 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 1c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 20 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 24 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 28 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 2c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 30 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 34 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 38 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 3c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 40 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 44 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 48 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 4c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 50 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 54 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 58 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 5c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 60 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 64 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 68 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 6c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 70 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 74 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 78 */ 0x000000, 0x000000, 0x000000, 0x000000,
+
+ /*** Single byte table, leaf: xx - offset 0x0007c ***/
+
+ /* 80 */ 0xe282ac, 0x000000, 0x000000, 0x000000,
+ /* 84 */ 0x000000, 0xe280a6, 0x000000, 0x000000,
+ /* 88 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 8c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 90 */ 0x000000, 0xe28098, 0xe28099, 0xe2809c,
+ /* 94 */ 0xe2809d, 0xe280a2, 0xe28093, 0xe28094,
+ /* 98 */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* 9c */ 0x000000, 0x000000, 0x000000, 0x000000,
+ /* a0 */ 0x00c2a0, 0xe0b881, 0xe0b882, 0xe0b883,
+ /* a4 */ 0xe0b884, 0xe0b885, 0xe0b886, 0xe0b887,
+ /* a8 */ 0xe0b888, 0xe0b889, 0xe0b88a, 0xe0b88b,
+ /* ac */ 0xe0b88c, 0xe0b88d, 0xe0b88e, 0xe0b88f,
+ /* b0 */ 0xe0b890, 0xe0b891, 0xe0b892, 0xe0b893,
+ /* b4 */ 0xe0b894, 0xe0b895, 0xe0b896, 0xe0b897,
+ /* b8 */ 0xe0b898, 0xe0b899, 0xe0b89a, 0xe0b89b,
+ /* bc */ 0xe0b89c, 0xe0b89d, 0xe0b89e, 0xe0b89f,
+ /* c0 */ 0xe0b8a0, 0xe0b8a1, 0xe0b8a2, 0xe0b8a3,
+ /* c4 */ 0xe0b8a4, 0xe0b8a5, 0xe0b8a6, 0xe0b8a7,
+ /* c8 */ 0xe0b8a8, 0xe0b8a9, 0xe0b8aa, 0xe0b8ab,
+ /* cc */ 0xe0b8ac, 0xe0b8ad, 0xe0b8ae, 0xe0b8af,
+ /* d0 */ 0xe0b8b0, 0xe0b8b1, 0xe0b8b2, 0xe0b8b3,
+ /* d4 */ 0xe0b8b4, 0xe0b8b5, 0xe0b8b6, 0xe0b8b7,
+ /* d8 */ 0xe0b8b8, 0xe0b8b9, 0xe0b8ba, 0x000000,
+ /* dc */ 0x000000, 0x000000, 0x000000, 0xe0b8bf,
+ /* e0 */ 0xe0b980, 0xe0b981, 0xe0b982, 0xe0b983,
+ /* e4 */ 0xe0b984, 0xe0b985, 0xe0b986, 0xe0b987,
+ /* e8 */ 0xe0b988, 0xe0b989, 0xe0b98a, 0xe0b98b,
+ /* ec */ 0xe0b98c, 0xe0b98d, 0xe0b98e, 0xe0b98f,
+ /* f0 */ 0xe0b990, 0xe0b991, 0xe0b992, 0xe0b993,
+ /* f4 */ 0xe0b994, 0xe0b995, 0xe0b996, 0xe0b997,
+ /* f8 */ 0xe0b998, 0xe0b999, 0xe0b99a, 0xe0b99b
+};
diff --git a/src/backend/utils/mb/conv.c b/src/backend/utils/mb/conv.c
new file mode 100644
index 0000000..388a67f
--- /dev/null
+++ b/src/backend/utils/mb/conv.c
@@ -0,0 +1,838 @@
+/*-------------------------------------------------------------------------
+ *
+ * Utility functions for conversion procs.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conv.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+#include "mb/pg_wchar.h"
+
+
+/*
+ * local2local: a generic single byte charset encoding
+ * conversion between two ASCII-superset encodings.
+ *
+ * l points to the source string of length len
+ * p is the output area (must be large enough!)
+ * src_encoding is the PG identifier for the source encoding
+ * dest_encoding is the PG identifier for the target encoding
+ * tab holds conversion entries for the source charset
+ * starting from 128 (0x80). each entry in the table holds the corresponding
+ * code point for the target charset, or 0 if there is no equivalent code.
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+local2local(const unsigned char *l,
+ unsigned char *p,
+ int len,
+ int src_encoding,
+ int dest_encoding,
+ const unsigned char *tab,
+ bool noError)
+{
+ const unsigned char *start = l;
+ unsigned char c1,
+ c2;
+
+ while (len > 0)
+ {
+ c1 = *l;
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(src_encoding, (const char *) l, len);
+ }
+ if (!IS_HIGHBIT_SET(c1))
+ *p++ = c1;
+ else
+ {
+ c2 = tab[c1 - HIGHBIT];
+ if (c2)
+ *p++ = c2;
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(src_encoding, dest_encoding,
+ (const char *) l, len);
+ }
+ }
+ l++;
+ len--;
+ }
+ *p = '\0';
+
+ return l - start;
+}
+
+/*
+ * LATINn ---> MIC when the charset's local codes map directly to MIC
+ *
+ * l points to the source string of length len
+ * p is the output area (must be large enough!)
+ * lc is the mule character set id for the local encoding
+ * encoding is the PG identifier for the local encoding
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+latin2mic(const unsigned char *l, unsigned char *p, int len,
+ int lc, int encoding, bool noError)
+{
+ const unsigned char *start = l;
+ int c1;
+
+ while (len > 0)
+ {
+ c1 = *l;
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(encoding, (const char *) l, len);
+ }
+ if (IS_HIGHBIT_SET(c1))
+ *p++ = lc;
+ *p++ = c1;
+ l++;
+ len--;
+ }
+ *p = '\0';
+
+ return l - start;
+}
+
+/*
+ * MIC ---> LATINn when the charset's local codes map directly to MIC
+ *
+ * mic points to the source string of length len
+ * p is the output area (must be large enough!)
+ * lc is the mule character set id for the local encoding
+ * encoding is the PG identifier for the local encoding
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+mic2latin(const unsigned char *mic, unsigned char *p, int len,
+ int lc, int encoding, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len);
+ }
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* easy for ASCII */
+ *p++ = c1;
+ mic++;
+ len--;
+ }
+ else
+ {
+ int l = pg_mule_mblen(mic);
+
+ if (len < l)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic,
+ len);
+ }
+ if (l != 2 || c1 != lc || !IS_HIGHBIT_SET(mic[1]))
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, encoding,
+ (const char *) mic, len);
+ }
+ *p++ = mic[1];
+ mic += 2;
+ len -= 2;
+ }
+ }
+ *p = '\0';
+
+ return mic - start;
+}
+
+
+/*
+ * latin2mic_with_table: a generic single byte charset encoding
+ * conversion from a local charset to the mule internal code.
+ *
+ * l points to the source string of length len
+ * p is the output area (must be large enough!)
+ * lc is the mule character set id for the local encoding
+ * encoding is the PG identifier for the local encoding
+ * tab holds conversion entries for the local charset
+ * starting from 128 (0x80). each entry in the table holds the corresponding
+ * code point for the mule encoding, or 0 if there is no equivalent code.
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+latin2mic_with_table(const unsigned char *l,
+ unsigned char *p,
+ int len,
+ int lc,
+ int encoding,
+ const unsigned char *tab,
+ bool noError)
+{
+ const unsigned char *start = l;
+ unsigned char c1,
+ c2;
+
+ while (len > 0)
+ {
+ c1 = *l;
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(encoding, (const char *) l, len);
+ }
+ if (!IS_HIGHBIT_SET(c1))
+ *p++ = c1;
+ else
+ {
+ c2 = tab[c1 - HIGHBIT];
+ if (c2)
+ {
+ *p++ = lc;
+ *p++ = c2;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(encoding, PG_MULE_INTERNAL,
+ (const char *) l, len);
+ }
+ }
+ l++;
+ len--;
+ }
+ *p = '\0';
+
+ return l - start;
+}
+
+/*
+ * mic2latin_with_table: a generic single byte charset encoding
+ * conversion from the mule internal code to a local charset.
+ *
+ * mic points to the source string of length len
+ * p is the output area (must be large enough!)
+ * lc is the mule character set id for the local encoding
+ * encoding is the PG identifier for the local encoding
+ * tab holds conversion entries for the mule internal code's second byte,
+ * starting from 128 (0x80). each entry in the table holds the corresponding
+ * code point for the local charset, or 0 if there is no equivalent code.
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+mic2latin_with_table(const unsigned char *mic,
+ unsigned char *p,
+ int len,
+ int lc,
+ int encoding,
+ const unsigned char *tab,
+ bool noError)
+{
+ const unsigned char *start = mic;
+ unsigned char c1,
+ c2;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len);
+ }
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* easy for ASCII */
+ *p++ = c1;
+ mic++;
+ len--;
+ }
+ else
+ {
+ int l = pg_mule_mblen(mic);
+
+ if (len < l)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic,
+ len);
+ }
+ if (l != 2 || c1 != lc || !IS_HIGHBIT_SET(mic[1]) ||
+ (c2 = tab[mic[1] - HIGHBIT]) == 0)
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, encoding,
+ (const char *) mic, len);
+ break; /* keep compiler quiet */
+ }
+ *p++ = c2;
+ mic += 2;
+ len -= 2;
+ }
+ }
+ *p = '\0';
+
+ return mic - start;
+}
+
+/*
+ * comparison routine for bsearch()
+ * this routine is intended for combined UTF8 -> local code
+ */
+static int
+compare3(const void *p1, const void *p2)
+{
+ uint32 s1,
+ s2,
+ d1,
+ d2;
+
+ s1 = *(const uint32 *) p1;
+ s2 = *((const uint32 *) p1 + 1);
+ d1 = ((const pg_utf_to_local_combined *) p2)->utf1;
+ d2 = ((const pg_utf_to_local_combined *) p2)->utf2;
+ return (s1 > d1 || (s1 == d1 && s2 > d2)) ? 1 : ((s1 == d1 && s2 == d2) ? 0 : -1);
+}
+
+/*
+ * comparison routine for bsearch()
+ * this routine is intended for local code -> combined UTF8
+ */
+static int
+compare4(const void *p1, const void *p2)
+{
+ uint32 v1,
+ v2;
+
+ v1 = *(const uint32 *) p1;
+ v2 = ((const pg_local_to_utf_combined *) p2)->code;
+ return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
+}
+
+/*
+ * store 32bit character representation into multibyte stream
+ */
+static inline unsigned char *
+store_coded_char(unsigned char *dest, uint32 code)
+{
+ if (code & 0xff000000)
+ *dest++ = code >> 24;
+ if (code & 0x00ff0000)
+ *dest++ = code >> 16;
+ if (code & 0x0000ff00)
+ *dest++ = code >> 8;
+ if (code & 0x000000ff)
+ *dest++ = code;
+ return dest;
+}
+
+/*
+ * Convert a character using a conversion radix tree.
+ *
+ * 'l' is the length of the input character in bytes, and b1-b4 are
+ * the input character's bytes.
+ */
+static inline uint32
+pg_mb_radix_conv(const pg_mb_radix_tree *rt,
+ int l,
+ unsigned char b1,
+ unsigned char b2,
+ unsigned char b3,
+ unsigned char b4)
+{
+ if (l == 4)
+ {
+ /* 4-byte code */
+
+ /* check code validity */
+ if (b1 < rt->b4_1_lower || b1 > rt->b4_1_upper ||
+ b2 < rt->b4_2_lower || b2 > rt->b4_2_upper ||
+ b3 < rt->b4_3_lower || b3 > rt->b4_3_upper ||
+ b4 < rt->b4_4_lower || b4 > rt->b4_4_upper)
+ return 0;
+
+ /* perform lookup */
+ if (rt->chars32)
+ {
+ uint32 idx = rt->b4root;
+
+ idx = rt->chars32[b1 + idx - rt->b4_1_lower];
+ idx = rt->chars32[b2 + idx - rt->b4_2_lower];
+ idx = rt->chars32[b3 + idx - rt->b4_3_lower];
+ return rt->chars32[b4 + idx - rt->b4_4_lower];
+ }
+ else
+ {
+ uint16 idx = rt->b4root;
+
+ idx = rt->chars16[b1 + idx - rt->b4_1_lower];
+ idx = rt->chars16[b2 + idx - rt->b4_2_lower];
+ idx = rt->chars16[b3 + idx - rt->b4_3_lower];
+ return rt->chars16[b4 + idx - rt->b4_4_lower];
+ }
+ }
+ else if (l == 3)
+ {
+ /* 3-byte code */
+
+ /* check code validity */
+ if (b2 < rt->b3_1_lower || b2 > rt->b3_1_upper ||
+ b3 < rt->b3_2_lower || b3 > rt->b3_2_upper ||
+ b4 < rt->b3_3_lower || b4 > rt->b3_3_upper)
+ return 0;
+
+ /* perform lookup */
+ if (rt->chars32)
+ {
+ uint32 idx = rt->b3root;
+
+ idx = rt->chars32[b2 + idx - rt->b3_1_lower];
+ idx = rt->chars32[b3 + idx - rt->b3_2_lower];
+ return rt->chars32[b4 + idx - rt->b3_3_lower];
+ }
+ else
+ {
+ uint16 idx = rt->b3root;
+
+ idx = rt->chars16[b2 + idx - rt->b3_1_lower];
+ idx = rt->chars16[b3 + idx - rt->b3_2_lower];
+ return rt->chars16[b4 + idx - rt->b3_3_lower];
+ }
+ }
+ else if (l == 2)
+ {
+ /* 2-byte code */
+
+ /* check code validity - first byte */
+ if (b3 < rt->b2_1_lower || b3 > rt->b2_1_upper ||
+ b4 < rt->b2_2_lower || b4 > rt->b2_2_upper)
+ return 0;
+
+ /* perform lookup */
+ if (rt->chars32)
+ {
+ uint32 idx = rt->b2root;
+
+ idx = rt->chars32[b3 + idx - rt->b2_1_lower];
+ return rt->chars32[b4 + idx - rt->b2_2_lower];
+ }
+ else
+ {
+ uint16 idx = rt->b2root;
+
+ idx = rt->chars16[b3 + idx - rt->b2_1_lower];
+ return rt->chars16[b4 + idx - rt->b2_2_lower];
+ }
+ }
+ else if (l == 1)
+ {
+ /* 1-byte code */
+
+ /* check code validity - first byte */
+ if (b4 < rt->b1_lower || b4 > rt->b1_upper)
+ return 0;
+
+ /* perform lookup */
+ if (rt->chars32)
+ return rt->chars32[b4 + rt->b1root - rt->b1_lower];
+ else
+ return rt->chars16[b4 + rt->b1root - rt->b1_lower];
+ }
+ return 0; /* shouldn't happen */
+}
+
+/*
+ * UTF8 ---> local code
+ *
+ * utf: input string in UTF8 encoding (need not be null-terminated)
+ * len: length of input string (in bytes)
+ * iso: pointer to the output area (must be large enough!)
+ (output string will be null-terminated)
+ * map: conversion map for single characters
+ * cmap: conversion map for combined characters
+ * (optional, pass NULL if none)
+ * cmapsize: number of entries in the conversion map for combined characters
+ * (optional, pass 0 if none)
+ * conv_func: algorithmic encoding conversion function
+ * (optional, pass NULL if none)
+ * encoding: PG identifier for the local encoding
+ *
+ * For each character, the cmap (if provided) is consulted first; if no match,
+ * the map is consulted next; if still no match, the conv_func (if provided)
+ * is applied. An error is raised if no match is found.
+ *
+ * See pg_wchar.h for more details about the data structures used here.
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+UtfToLocal(const unsigned char *utf, int len,
+ unsigned char *iso,
+ const pg_mb_radix_tree *map,
+ const pg_utf_to_local_combined *cmap, int cmapsize,
+ utf_local_conversion_func conv_func,
+ int encoding, bool noError)
+{
+ uint32 iutf;
+ int l;
+ const pg_utf_to_local_combined *cp;
+ const unsigned char *start = utf;
+
+ if (!PG_VALID_ENCODING(encoding))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid encoding number: %d", encoding)));
+
+ for (; len > 0; len -= l)
+ {
+ unsigned char b1 = 0;
+ unsigned char b2 = 0;
+ unsigned char b3 = 0;
+ unsigned char b4 = 0;
+
+ /* "break" cases all represent errors */
+ if (*utf == '\0')
+ break;
+
+ l = pg_utf_mblen(utf);
+ if (len < l)
+ break;
+
+ if (!pg_utf8_islegal(utf, l))
+ break;
+
+ if (l == 1)
+ {
+ /* ASCII case is easy, assume it's one-to-one conversion */
+ *iso++ = *utf++;
+ continue;
+ }
+
+ /* collect coded char of length l */
+ if (l == 2)
+ {
+ b3 = *utf++;
+ b4 = *utf++;
+ }
+ else if (l == 3)
+ {
+ b2 = *utf++;
+ b3 = *utf++;
+ b4 = *utf++;
+ }
+ else if (l == 4)
+ {
+ b1 = *utf++;
+ b2 = *utf++;
+ b3 = *utf++;
+ b4 = *utf++;
+ }
+ else
+ {
+ elog(ERROR, "unsupported character length %d", l);
+ iutf = 0; /* keep compiler quiet */
+ }
+ iutf = (b1 << 24 | b2 << 16 | b3 << 8 | b4);
+
+ /* First, try with combined map if possible */
+ if (cmap && len > l)
+ {
+ const unsigned char *utf_save = utf;
+ int len_save = len;
+ int l_save = l;
+
+ /* collect next character, same as above */
+ len -= l;
+
+ l = pg_utf_mblen(utf);
+ if (len < l)
+ {
+ /* need more data to decide if this is a combined char */
+ utf -= l_save;
+ break;
+ }
+
+ if (!pg_utf8_islegal(utf, l))
+ {
+ if (!noError)
+ report_invalid_encoding(PG_UTF8, (const char *) utf, len);
+ utf -= l_save;
+ break;
+ }
+
+ /* We assume ASCII character cannot be in combined map */
+ if (l > 1)
+ {
+ uint32 iutf2;
+ uint32 cutf[2];
+
+ if (l == 2)
+ {
+ iutf2 = *utf++ << 8;
+ iutf2 |= *utf++;
+ }
+ else if (l == 3)
+ {
+ iutf2 = *utf++ << 16;
+ iutf2 |= *utf++ << 8;
+ iutf2 |= *utf++;
+ }
+ else if (l == 4)
+ {
+ iutf2 = *utf++ << 24;
+ iutf2 |= *utf++ << 16;
+ iutf2 |= *utf++ << 8;
+ iutf2 |= *utf++;
+ }
+ else
+ {
+ elog(ERROR, "unsupported character length %d", l);
+ iutf2 = 0; /* keep compiler quiet */
+ }
+
+ cutf[0] = iutf;
+ cutf[1] = iutf2;
+
+ cp = bsearch(cutf, cmap, cmapsize,
+ sizeof(pg_utf_to_local_combined), compare3);
+
+ if (cp)
+ {
+ iso = store_coded_char(iso, cp->code);
+ continue;
+ }
+ }
+
+ /* fail, so back up to reprocess second character next time */
+ utf = utf_save;
+ len = len_save;
+ l = l_save;
+ }
+
+ /* Now check ordinary map */
+ if (map)
+ {
+ uint32 converted = pg_mb_radix_conv(map, l, b1, b2, b3, b4);
+
+ if (converted)
+ {
+ iso = store_coded_char(iso, converted);
+ continue;
+ }
+ }
+
+ /* if there's a conversion function, try that */
+ if (conv_func)
+ {
+ uint32 converted = (*conv_func) (iutf);
+
+ if (converted)
+ {
+ iso = store_coded_char(iso, converted);
+ continue;
+ }
+ }
+
+ /* failed to translate this character */
+ utf -= l;
+ if (noError)
+ break;
+ report_untranslatable_char(PG_UTF8, encoding,
+ (const char *) utf, len);
+ }
+
+ /* if we broke out of loop early, must be invalid input */
+ if (len > 0 && !noError)
+ report_invalid_encoding(PG_UTF8, (const char *) utf, len);
+
+ *iso = '\0';
+
+ return utf - start;
+}
+
+/*
+ * local code ---> UTF8
+ *
+ * iso: input string in local encoding (need not be null-terminated)
+ * len: length of input string (in bytes)
+ * utf: pointer to the output area (must be large enough!)
+ (output string will be null-terminated)
+ * map: conversion map for single characters
+ * cmap: conversion map for combined characters
+ * (optional, pass NULL if none)
+ * cmapsize: number of entries in the conversion map for combined characters
+ * (optional, pass 0 if none)
+ * conv_func: algorithmic encoding conversion function
+ * (optional, pass NULL if none)
+ * encoding: PG identifier for the local encoding
+ *
+ * For each character, the map is consulted first; if no match, the cmap
+ * (if provided) is consulted next; if still no match, the conv_func
+ * (if provided) is applied. An error is raised if no match is found.
+ *
+ * See pg_wchar.h for more details about the data structures used here.
+ *
+ * Returns the number of input bytes consumed. If noError is true, this can
+ * be less than 'len'.
+ */
+int
+LocalToUtf(const unsigned char *iso, int len,
+ unsigned char *utf,
+ const pg_mb_radix_tree *map,
+ const pg_local_to_utf_combined *cmap, int cmapsize,
+ utf_local_conversion_func conv_func,
+ int encoding,
+ bool noError)
+{
+ uint32 iiso;
+ int l;
+ const pg_local_to_utf_combined *cp;
+ const unsigned char *start = iso;
+
+ if (!PG_VALID_ENCODING(encoding))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid encoding number: %d", encoding)));
+
+ for (; len > 0; len -= l)
+ {
+ unsigned char b1 = 0;
+ unsigned char b2 = 0;
+ unsigned char b3 = 0;
+ unsigned char b4 = 0;
+
+ /* "break" cases all represent errors */
+ if (*iso == '\0')
+ break;
+
+ if (!IS_HIGHBIT_SET(*iso))
+ {
+ /* ASCII case is easy, assume it's one-to-one conversion */
+ *utf++ = *iso++;
+ l = 1;
+ continue;
+ }
+
+ l = pg_encoding_verifymbchar(encoding, (const char *) iso, len);
+ if (l < 0)
+ break;
+
+ /* collect coded char of length l */
+ if (l == 1)
+ b4 = *iso++;
+ else if (l == 2)
+ {
+ b3 = *iso++;
+ b4 = *iso++;
+ }
+ else if (l == 3)
+ {
+ b2 = *iso++;
+ b3 = *iso++;
+ b4 = *iso++;
+ }
+ else if (l == 4)
+ {
+ b1 = *iso++;
+ b2 = *iso++;
+ b3 = *iso++;
+ b4 = *iso++;
+ }
+ else
+ {
+ elog(ERROR, "unsupported character length %d", l);
+ iiso = 0; /* keep compiler quiet */
+ }
+ iiso = (b1 << 24 | b2 << 16 | b3 << 8 | b4);
+
+ if (map)
+ {
+ uint32 converted = pg_mb_radix_conv(map, l, b1, b2, b3, b4);
+
+ if (converted)
+ {
+ utf = store_coded_char(utf, converted);
+ continue;
+ }
+
+ /* If there's a combined character map, try that */
+ if (cmap)
+ {
+ cp = bsearch(&iiso, cmap, cmapsize,
+ sizeof(pg_local_to_utf_combined), compare4);
+
+ if (cp)
+ {
+ utf = store_coded_char(utf, cp->utf1);
+ utf = store_coded_char(utf, cp->utf2);
+ continue;
+ }
+ }
+ }
+
+ /* if there's a conversion function, try that */
+ if (conv_func)
+ {
+ uint32 converted = (*conv_func) (iiso);
+
+ if (converted)
+ {
+ utf = store_coded_char(utf, converted);
+ continue;
+ }
+ }
+
+ /* failed to translate this character */
+ iso -= l;
+ if (noError)
+ break;
+ report_untranslatable_char(encoding, PG_UTF8,
+ (const char *) iso, len);
+ }
+
+ /* if we broke out of loop early, must be invalid input */
+ if (len > 0 && !noError)
+ report_invalid_encoding(encoding, (const char *) iso, len);
+
+ *utf = '\0';
+
+ return iso - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile
new file mode 100644
index 0000000..3722aae
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/Makefile
@@ -0,0 +1,25 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for backend/utils/mb/conversion_procs
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/backend/utils/mb/conversion_procs/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/mb/conversion_procs
+top_builddir = ../../../../..
+include $(top_builddir)/src/Makefile.global
+
+SUBDIRS = \
+ cyrillic_and_mic euc_cn_and_mic euc_jp_and_sjis \
+ euc_kr_and_mic euc_tw_and_big5 latin2_and_win1250 latin_and_mic \
+ utf8_and_big5 utf8_and_cyrillic utf8_and_euc_cn \
+ utf8_and_euc_jp utf8_and_euc_kr utf8_and_euc_tw utf8_and_gb18030 \
+ utf8_and_gbk utf8_and_iso8859 utf8_and_iso8859_1 utf8_and_johab \
+ utf8_and_sjis utf8_and_win utf8_and_uhc \
+ utf8_and_euc2004 utf8_and_sjis2004 euc2004_sjis2004
+
+$(recurse)
diff --git a/src/backend/utils/mb/conversion_procs/README.euc_jp b/src/backend/utils/mb/conversion_procs/README.euc_jp
new file mode 100644
index 0000000..6e59b7b
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/README.euc_jp
@@ -0,0 +1,83 @@
+¿·¤·¤¤¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°ÊÑ´¹´Ø¿ô¤ÎÄɲÃÊýË¡
+
+ 2006/04/15 Tatsuo Ishii
+
+¤Ï¤¸¤á¤Ë
+
+PostgreSQL¤Ë¤Ï¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤È¥Õ¥í¥ó¥È¥¨¥ó¥É¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤¬°Û¤Ê¤ë
+¤È¤­¤Ë¡¤¼«Æ°Åª¤Ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ÎÊÑ´¹¤ò¹Ô¤¦µ¡Ç½¤¬¤¢¤ê¤Þ¤¹¡¥¤³¤Î¥Ç¥£¥ì
+¥¯¥È¥ê¤Ë¤Ï¡¤¤½¤Î¤È¤­¤Ë»È¤ï¤ì¤ë´Ø¿ô¤¬ÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥¤³¤ì¤é¤Î´Ø¿ô¤Ï¥æ¡¼
+¥¶ÄêµÁC´Ø¿ô¤È¤·¤Æ¡¤initdb¤ÎÃæ¤ÇÅÐÏ¿¤µ¤ì¤Þ¤¹¡¥¶ñÂÎŪ¤Ë¤Ï¡¤
+/usr/local/pgsql/share/conversion_create.sql ¤ÎÃæ¤ÇÅÐÏ¿¤µ¤ì¤Þ¤¹(¤³¤Î¥Õ¥¡
+¥¤¥ë¤Ï¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Çmake¤·¤¿¤È¤­¤Ë¼«Æ°À¸À®¤µ¤ì¤Þ¤¹)¡¥
+
+¤Þ¤¿¡¤¤³¤ì¤é¤Î´Ø¿ô¤Ïconvert()´Ø¿ô¤«¤é¤â¸Æ¤Ó½Ð¤µ¤ì¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡¥
+
+¤³¤ÎREADME¤Ç¤Ï¡¤C´Ø¿ô¤òÄêµÁ¤¹¤ëÊýË¡¤È¡¤¤½¤ì¤òMakefile¤Ê¤É¤ËÄɲ乤ëÊý
+Ë¡¤òÀâÌÀ¤·¤Þ¤¹¡¥
+
+o C´Ø¿ô¤Î¸Æ¤Ó½Ð¤··Á¼°
+
+ ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°ÊÑ´¹´Ø¿ô¤Î¸Æ¤Ó½Ð¤··Á¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡¥
+
+ conv_proc(
+ INTEGER, -- source encoding id
+ INTEGER, -- destination encoding id
+ CSTRING, -- source string (null terminated C string)
+ INTERNAL, -- destination string (null terminated C string)
+ INTEGER -- source string length
+ ) returns VOID;
+
+ Í£°ì¤Î½ÐÎÏ°ú¿ô¤Ï4ÈÖÌܤÎdestination string¤Ç¤¹¡¥¥æ¡¼¥¶ÄêµÁ´Ø¿ô¤ÏɬÍ×
+ ¤Ê¥á¥â¥ê¤òpalloc¤·¡¤¤½¤³¤ËÊÑ´¹·ë²Ì¤òNULL¥¿¡¼¥ß¥Í¡¼¥È¤µ¤ì¤¿Cʸ»úÎó¤È
+ ¤·¤Æ½ÐÎϤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡¥¤Þ¤¿¡¤Å¬ÀÚ¤ÊÂ礭¤µ¤Î¥á¥â¥ê¤ò³ÎÊݤ¹¤ë¤Î
+ ¤Ï¡¤¤³¤ÎC´Ø¿ô¤ÎÀÕǤ¤Ç¤¹¡¥¤È¤¤¤¦¤Î¤Ï¡¤°ìÈ̤ËÊÑ´¹¤µ¤ì¤¿Ê¸»úÎó¤ÎŤµ¤Ï
+ ¥½¡¼¥¹Ê¸»úÎó¤ÎŤµ(5ÈÖÌܤΰú¿ô¤Ç»ØÄꤵ¤ì¤Þ¤¹¡¥Ã±°Ì¤ÏNULL¥¿¡¼¥ß¥Í¡¼¥È
+ ¤ò´Þ¤Þ¤Ê¤¤¥Ð¥¤¥È¿ô¤Ç¤¹)¤È¤Ï°ìÃפ·¤Ê¤¤¤«¤é¤Ç¤¹¡¥
+
+ ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°ID¤Ïinclude/mb/pg_wchar.h¤Îtypedef enum pg_enc¤ÇÄêµÁ
+ ¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥
+
+o ´Ø¿ô¤ÎÅÐÏ¿¤È¥³¥ó¥Ñ¥¤¥ë
+
+ ºî¤Ã¤¿C´Ø¿ô¤Ï¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤òºî¤ê¡¤¤½¤ÎÃæ¤ËǼ¤á¤Þ¤¹¡¥¤½¤ÎÃæ¤Ë
+ Makefile¤âɬÍפˤʤê¤Þ¤¹¤¬¡¤Â¾¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëMakefile¤ò»²¹Í¤Ë¤¹
+ ¤ì¤Ð´Êñ¤ËºîÀ®¤Ç¤­¤ë¤Ç¤·¤ç¤¦¡¥
+
+ ¼¡¤Ë¥á¥¤¥ó¤ÎMakefile(¤³¤Î¥Õ¥¡¥¤¥ë¤¬ÃÖ¤¤¤Æ¤¢¤ëƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê
+ ¤Þ¤¹)¤Ë´Ø¿ô¤Ë´Ø¤¹¤ëµ­½Ò¤òÄɲä·¤Þ¤¹¡¥
+
+ (1) DIRS=¤Î¸å¤Ë¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê̾¤òÄɲä·¤Þ¤¹¡¥
+
+ (2) @set \ ¤Ç»Ï¤Þ¤ë¹àÌܤ˵­½Ò¤òÄɲä·¤Þ¤¹¡¥1´Ø¿ô¤Ë¤Ä¤­1¹Ô¤ÎÄɲä¬É¬Í×
+ ¤Ç¤¹¡¥
+
+ ¥³¥ó¥Ð¡¼¥¸¥ç¥ó¤Î̾Á°
+ ¥½¡¼¥¹¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾
+ ¥Ç¥¹¥Æ¥£¥Í¡¼¥·¥ç¥ó¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾
+ ´Ø¿ô̾
+ ¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë̾
+
+ ¤ò1¹Ô¤ÎÃæ¤Ë¥¹¥Ú¡¼¥¹¤Ç¶èÀڤäÆÄɲä·¤Þ¤¹¡¥
+
+o ¥Æ¥¹¥È
+
+ °Ê¾å¤¬½ª¤ï¤Ã¤¿¤é¡¤¤³¤Î¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Çmake¤·¡¤¤¹¤Ù¤Æ¤¬¤¦
+ ¤Þ¤¯¤¤¤¯¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡¥Æäˡ¤create_conversion.sql¤¬¤Á¤ã¤ó¤È¤·¤¿
+ ÆâÍƤˤʤäƤ¤¤ë¤«¤É¤¦¤«³Îǧ¤·¤Þ¤·¤ç¤¦¡¥Îɤµ¤½¤¦¤À¤Ã¤¿¤é¡¤¥Æ¥¹¥ÈÍѤË
+ ¿·¤·¤¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤òºî¤ê¡¤¤½¤³¤Ç¤³¤Î¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤·¤Þ¤¹¡¥
+
+ $ psql -e -f create_conversion.sql test
+
+ ¤³¤ì¤âÀµ¾ï¤À¤Ã¤¿¤é¡¤ºÇ¸å¤Ëregression test suite¤Ë¥Æ¥¹¥È¹àÌܤòÄɲä·
+ ¤Æ¤¯¤À¤µ¤¤¡¥¶ñÂÎŪ¤Ë¤Ï¡¤src/test/regress/sql/conversion.sql¤ËÄɲä·¡¤
+ regression test¤ò¹Ô¤¤¤Þ¤¹¡¥
+
+o Ãí°Õ»ö¹à
+
+ ¥Ç¥Õ¥©¥ë¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°ÊÑ´¹¤È¤·¤Æ»ÈÍѤǤ­¤ë¤¿¤á¤Ë¤Ï¡¤¥½¡¼¥¹¥¨¥ó
+ ¥³¡¼¥Ç¥£¥ó¥°¤È¥Ç¥¹¥Æ¥£¥Í¡¼¥·¥ç¥ó¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î´Ö¤ÇÁÐÊý¸þ¤ÎÊÑ´¹¤¬
+ ¤Ç¤­¤ë¤³¤È¤¬É¬ÍפǤ¹¡¥¤¹¤Ê¤ï¤Á¡¤¤¢¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î¥Ú¥¢¤ËÉÕ¤­¡¤2
+ ¸Ä¤Î´Ø¿ô¤ÎºîÀ®¤¬É¬ÍפǤ¹¡¥¤³¤ì¤é¤Î´Ø¿ô¤ÏÊÌ¡¹¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÅÐÏ¿
+ ¤·¤Æ¤âÎɤ¤¤Ç¤¹¤¬¡¤Ä̾ï¤Ï°ì¤Ä¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ëÃæ¤Ë2¸Ä¤Î´Ø¿ô¤ò½ñ¤¯¤³¤È
+ ¤¬Â¿¤¤¤Ç¤·¤ç¤¦¡¥
diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile
new file mode 100644
index 0000000..e7cd8e8
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/cyrillic_and_mic/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/cyrillic_and_mic
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = cyrillic_and_mic
+PGFILEDESC = "cyrillic <-> mic text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
new file mode 100644
index 0000000..f3f2b55
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
@@ -0,0 +1,624 @@
+/*-------------------------------------------------------------------------
+ *
+ * Cyrillic and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(koi8r_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_koi8r);
+PG_FUNCTION_INFO_V1(iso_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_iso);
+PG_FUNCTION_INFO_V1(win1251_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_win1251);
+PG_FUNCTION_INFO_V1(win866_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_win866);
+PG_FUNCTION_INFO_V1(koi8r_to_win1251);
+PG_FUNCTION_INFO_V1(win1251_to_koi8r);
+PG_FUNCTION_INFO_V1(koi8r_to_win866);
+PG_FUNCTION_INFO_V1(win866_to_koi8r);
+PG_FUNCTION_INFO_V1(win866_to_win1251);
+PG_FUNCTION_INFO_V1(win1251_to_win866);
+PG_FUNCTION_INFO_V1(iso_to_koi8r);
+PG_FUNCTION_INFO_V1(koi8r_to_iso);
+PG_FUNCTION_INFO_V1(iso_to_win1251);
+PG_FUNCTION_INFO_V1(win1251_to_iso);
+PG_FUNCTION_INFO_V1(iso_to_win866);
+PG_FUNCTION_INFO_V1(win866_to_iso);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+/*
+ * Cyrillic support
+ * currently supported Cyrillic encodings:
+ *
+ * KOI8-R (this is also the charset for the mule internal code for Cyrillic)
+ * ISO-8859-5
+ * Microsoft's CP1251 (windows-1251)
+ * Alternativny Variant (MS-DOS CP866)
+ */
+
+/* ISO-8859-5 to KOI8-R */
+static const unsigned char iso2koi[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
+ 0x00, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* KOI8-R to ISO-8859-5 */
+static const unsigned char koi2iso[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xEE, 0xD0, 0xD1, 0xE6, 0xD4, 0xD5, 0xE4, 0xD3,
+ 0xE5, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE,
+ 0xDF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xD6, 0xD2,
+ 0xEC, 0xEB, 0xD7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
+ 0xCE, 0xB0, 0xB1, 0xC6, 0xB4, 0xB5, 0xC4, 0xB3,
+ 0xC5, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,
+ 0xBF, 0xCF, 0xC0, 0xC1, 0xC2, 0xC3, 0xB6, 0xB2,
+ 0xCC, 0xCB, 0xB7, 0xC8, 0xCD, 0xC9, 0xC7, 0xCA
+};
+
+/* WIN1251 to KOI8-R */
+static const unsigned char win12512koi[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
+ 0xB3, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x00, 0xB7,
+ 0x00, 0x00, 0xB6, 0xA6, 0xAD, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0xA7,
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1
+};
+
+/* KOI8-R to WIN1251 */
+static const unsigned char koi2win1251[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xB8, 0xBA, 0x00, 0xB3, 0xBF,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xA8, 0xAA, 0x00, 0xB2, 0xAF,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
+ 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
+ 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
+ 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
+ 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
+ 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
+ 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
+ 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
+ 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA
+};
+
+/* WIN866 to KOI8-R */
+static const unsigned char win8662koi[] = {
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
+ 0xB3, 0xA3, 0xB4, 0xA4, 0xB7, 0xA7, 0x00, 0x00,
+ 0xB6, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* KOI8-R to WIN866 */
+static const unsigned char koi2win866[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF1, 0xF3, 0x00, 0xF9, 0xF5,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0xF2, 0x00, 0xF8, 0xF4,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
+ 0xEE, 0xA0, 0xA1, 0xE6, 0xA4, 0xA5, 0xE4, 0xA3,
+ 0xE5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE,
+ 0xAF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xA6, 0xA2,
+ 0xEC, 0xEB, 0xA7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
+ 0x9E, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83,
+ 0x95, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x9F, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82,
+ 0x9C, 0x9B, 0x87, 0x98, 0x9D, 0x99, 0x97, 0x9A
+};
+
+/* WIN866 to WIN1251 */
+static const unsigned char win8662win1251[] = {
+ 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
+ 0xA8, 0xB8, 0xAA, 0xBA, 0xAF, 0xBF, 0x00, 0x00,
+ 0xB2, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* WIN1251 to WIN866 */
+static const unsigned char win12512win866[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
+ 0xF0, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xF4,
+ 0x00, 0x00, 0xF8, 0xF9, 0xAD, 0x00, 0x00, 0x00,
+ 0xF1, 0x00, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xF5,
+ 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,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
+};
+
+/* ISO-8859-5 to WIN1251 */
+static const unsigned char iso2win1251[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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,
+ 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* WIN1251 to ISO-8859-5 */
+static const unsigned char win12512iso[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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
+};
+
+/* ISO-8859-5 to WIN866 */
+static const unsigned char iso2win866[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* WIN866 to ISO-8859-5 */
+static const unsigned char win8662iso[] = {
+ 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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xA1, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+
+Datum
+koi8r_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_MULE_INTERNAL);
+
+ converted = latin2mic(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_koi8r(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_KOI8R);
+
+ converted = mic2latin(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+iso_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_MULE_INTERNAL);
+
+ converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, iso2koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_iso(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_ISO_8859_5);
+
+ converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, koi2iso, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1251_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_MULE_INTERNAL);
+
+ converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, win12512koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_win1251(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1251);
+
+ converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, koi2win1251, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win866_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_MULE_INTERNAL);
+
+ converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, win8662koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_win866(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN866);
+
+ converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, koi2win866, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+koi8r_to_win1251(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN1251);
+
+ converted = local2local(src, dest, len, PG_KOI8R, PG_WIN1251, koi2win1251, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1251_to_koi8r(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_KOI8R);
+
+ converted = local2local(src, dest, len, PG_WIN1251, PG_KOI8R, win12512koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+koi8r_to_win866(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN866);
+
+ converted = local2local(src, dest, len, PG_KOI8R, PG_WIN866, koi2win866, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win866_to_koi8r(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_KOI8R);
+
+ converted = local2local(src, dest, len, PG_WIN866, PG_KOI8R, win8662koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win866_to_win1251(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_WIN1251);
+
+ converted = local2local(src, dest, len, PG_WIN866, PG_WIN1251, win8662win1251, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1251_to_win866(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_WIN866);
+
+ converted = local2local(src, dest, len, PG_WIN1251, PG_WIN866, win12512win866, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+iso_to_koi8r(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_KOI8R);
+
+ converted = local2local(src, dest, len, PG_ISO_8859_5, PG_KOI8R, iso2koi, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+koi8r_to_iso(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ISO_8859_5);
+
+ converted = local2local(src, dest, len, PG_KOI8R, PG_ISO_8859_5, koi2iso, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+iso_to_win1251(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN1251);
+
+ converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN1251, iso2win1251, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1251_to_iso(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ISO_8859_5);
+
+ converted = local2local(src, dest, len, PG_WIN1251, PG_ISO_8859_5, win12512iso, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+iso_to_win866(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN866);
+
+ converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN866, iso2win866, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win866_to_iso(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_ISO_8859_5);
+
+ converted = local2local(src, dest, len, PG_WIN866, PG_ISO_8859_5, win8662iso, noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/Makefile b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/Makefile
new file mode 100644
index 0000000..fe0221c
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/euc2004_sjis2004/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/euc2004_sjis2004
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = euc2004_sjis2004
+PGFILEDESC = "euc2004 <-> sjis2004 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c
new file mode 100644
index 0000000..6891600
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c
@@ -0,0 +1,401 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_JIS_2004, SHIFT_JIS_2004
+ *
+ * Copyright (c) 2007-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_jis_2004_to_shift_jis_2004);
+PG_FUNCTION_INFO_V1(shift_jis_2004_to_euc_jis_2004);
+
+static int euc_jis_20042shift_jis_2004(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int shift_jis_20042euc_jis_2004(const unsigned char *sjis, unsigned char *p, int len, bool noError);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+Datum
+euc_jis_2004_to_shift_jis_2004(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JIS_2004, PG_SHIFT_JIS_2004);
+
+ converted = euc_jis_20042shift_jis_2004(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+shift_jis_2004_to_euc_jis_2004(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_SHIFT_JIS_2004, PG_EUC_JIS_2004);
+
+ converted = shift_jis_20042euc_jis_2004(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+/*
+ * EUC_JIS_2004 -> SHIFT_JIS_2004
+ */
+static int
+euc_jis_20042shift_jis_2004(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1,
+ ku,
+ ten;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ continue;
+ }
+
+ l = pg_encoding_verifymbchar(PG_EUC_JIS_2004, (const char *) euc, len);
+
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+
+ if (c1 == SS2 && l == 2) /* JIS X 0201 kana? */
+ {
+ *p++ = euc[1];
+ }
+ else if (c1 == SS3 && l == 3) /* JIS X 0213 plane 2? */
+ {
+ ku = euc[1] - 0xa0;
+ ten = euc[2] - 0xa0;
+
+ switch (ku)
+ {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 8:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ *p++ = ((ku + 0x1df) >> 1) - (ku >> 3) * 3;
+ break;
+ default:
+ if (ku >= 78 && ku <= 94)
+ {
+ *p++ = (ku + 0x19b) >> 1;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+ }
+
+ if (ku % 2)
+ {
+ if (ten >= 1 && ten <= 63)
+ *p++ = ten + 0x3f;
+ else if (ten >= 64 && ten <= 94)
+ *p++ = ten + 0x40;
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+ }
+ else
+ *p++ = ten + 0x9e;
+ }
+
+ else if (l == 2) /* JIS X 0213 plane 1? */
+ {
+ ku = c1 - 0xa0;
+ ten = euc[1] - 0xa0;
+
+ if (ku >= 1 && ku <= 62)
+ *p++ = (ku + 0x101) >> 1;
+ else if (ku >= 63 && ku <= 94)
+ *p++ = (ku + 0x181) >> 1;
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+
+ if (ku % 2)
+ {
+ if (ten >= 1 && ten <= 63)
+ *p++ = ten + 0x3f;
+ else if (ten >= 64 && ten <= 94)
+ *p++ = ten + 0x40;
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+ }
+ else
+ *p++ = ten + 0x9e;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JIS_2004,
+ (const char *) euc, len);
+ }
+
+ euc += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * returns SHIFT_JIS_2004 "ku" code indicated by second byte
+ * *ku = 0: "ku" = even
+ * *ku = 1: "ku" = odd
+ */
+static int
+get_ten(int b, int *ku)
+{
+ int ten;
+
+ if (b >= 0x40 && b <= 0x7e)
+ {
+ ten = b - 0x3f;
+ *ku = 1;
+ }
+ else if (b >= 0x80 && b <= 0x9e)
+ {
+ ten = b - 0x40;
+ *ku = 1;
+ }
+ else if (b >= 0x9f && b <= 0xfc)
+ {
+ ten = b - 0x9e;
+ *ku = 0;
+ }
+ else
+ {
+ ten = -1; /* error */
+ *ku = 0; /* keep compiler quiet */
+ }
+ return ten;
+}
+
+/*
+ * SHIFT_JIS_2004 ---> EUC_JIS_2004
+ */
+
+static int
+shift_jis_20042euc_jis_2004(const unsigned char *sjis, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = sjis;
+ int c1;
+ int ku,
+ ten,
+ kubun;
+ int plane;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *sjis;
+
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+ *p++ = c1;
+ sjis++;
+ len--;
+ continue;
+ }
+
+ l = pg_encoding_verifymbchar(PG_SHIFT_JIS_2004, (const char *) sjis, len);
+
+ if (l < 0 || l > len)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+
+ if (c1 >= 0xa1 && c1 <= 0xdf && l == 1)
+ {
+ /* JIS X0201 (1 byte kana) */
+ *p++ = SS2;
+ *p++ = c1;
+ }
+ else if (l == 2)
+ {
+ int c2 = sjis[1];
+
+ plane = 1;
+ ku = 1;
+ ten = 1;
+
+ /*
+ * JIS X 0213
+ */
+ if (c1 >= 0x81 && c1 <= 0x9f) /* plane 1 1ku-62ku */
+ {
+ ku = (c1 << 1) - 0x100;
+ ten = get_ten(c2, &kubun);
+ if (ten < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+ ku -= kubun;
+ }
+ else if (c1 >= 0xe0 && c1 <= 0xef) /* plane 1 62ku-94ku */
+ {
+ ku = (c1 << 1) - 0x180;
+ ten = get_ten(c2, &kubun);
+ if (ten < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+ ku -= kubun;
+ }
+ else if (c1 >= 0xf0 && c1 <= 0xf3) /* plane 2
+ * 1,3,4,5,8,12,13,14,15 ku */
+ {
+ plane = 2;
+ ten = get_ten(c2, &kubun);
+ if (ten < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+ switch (c1)
+ {
+ case 0xf0:
+ ku = kubun == 0 ? 8 : 1;
+ break;
+ case 0xf1:
+ ku = kubun == 0 ? 4 : 3;
+ break;
+ case 0xf2:
+ ku = kubun == 0 ? 12 : 5;
+ break;
+ default:
+ ku = kubun == 0 ? 14 : 13;
+ break;
+ }
+ }
+ else if (c1 >= 0xf4 && c1 <= 0xfc) /* plane 2 78-94ku */
+ {
+ plane = 2;
+ ten = get_ten(c2, &kubun);
+ if (ten < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+ if (c1 == 0xf4 && kubun == 1)
+ ku = 15;
+ else
+ ku = (c1 << 1) - 0x19a - kubun;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SHIFT_JIS_2004,
+ (const char *) sjis, len);
+ }
+
+ if (plane == 2)
+ *p++ = SS3;
+
+ *p++ = ku + 0xa0;
+ *p++ = ten + 0xa0;
+ }
+ sjis += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return sjis - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile
new file mode 100644
index 0000000..cb6a83f
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/euc_cn_and_mic/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/euc_cn_and_mic
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = euc_cn_and_mic
+PGFILEDESC = "euc_cn <-> mic text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c
new file mode 100644
index 0000000..9aa49a9
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c
@@ -0,0 +1,166 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_CN and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_cn_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_euc_cn);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+static int euc_cn2mic(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int mic2euc_cn(const unsigned char *mic, unsigned char *p, int len, bool noError);
+
+Datum
+euc_cn_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_CN, PG_MULE_INTERNAL);
+
+ converted = euc_cn2mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_euc_cn(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_CN);
+
+ converted = mic2euc_cn(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+/*
+ * EUC_CN ---> MIC
+ */
+static int
+euc_cn2mic(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ if (len < 2 || !IS_HIGHBIT_SET(euc[1]))
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_CN, (const char *) euc, len);
+ }
+ *p++ = LC_GB2312_80;
+ *p++ = c1;
+ *p++ = euc[1];
+ euc += 2;
+ len -= 2;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_CN, (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * MIC ---> EUC_CN
+ */
+static int
+mic2euc_cn(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ if (c1 != LC_GB2312_80)
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_EUC_CN,
+ (const char *) mic, len);
+ }
+ if (len < 3 || !IS_HIGHBIT_SET(mic[1]) || !IS_HIGHBIT_SET(mic[2]))
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ mic++;
+ *p++ = *mic++;
+ *p++ = *mic++;
+ len -= 3;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return mic - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/Makefile b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/Makefile
new file mode 100644
index 0000000..0b1de0e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/euc_jp_and_sjis
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = euc_jp_and_sjis
+PGFILEDESC = "euc_jp <-> sjis text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c
new file mode 100644
index 0000000..93493d4
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c
@@ -0,0 +1,772 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_JP, SJIS and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+/*
+ * SJIS alternative code.
+ * this code is used if a mapping EUC -> SJIS is not defined.
+ */
+#define PGSJISALTCODE 0x81ac
+#define PGEUCALTCODE 0xa2ae
+
+/*
+ * conversion table between SJIS UDC (IBM kanji) and EUC_JP
+ */
+#include "sjis.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_jp_to_sjis);
+PG_FUNCTION_INFO_V1(sjis_to_euc_jp);
+PG_FUNCTION_INFO_V1(euc_jp_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_euc_jp);
+PG_FUNCTION_INFO_V1(sjis_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_sjis);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+static int sjis2mic(const unsigned char *sjis, unsigned char *p, int len, bool noError);
+static int mic2sjis(const unsigned char *mic, unsigned char *p, int len, bool noError);
+static int euc_jp2mic(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int mic2euc_jp(const unsigned char *mic, unsigned char *p, int len, bool noError);
+static int euc_jp2sjis(const unsigned char *mic, unsigned char *p, int len, bool noError);
+static int sjis2euc_jp(const unsigned char *mic, unsigned char *p, int len, bool noError);
+
+Datum
+euc_jp_to_sjis(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_SJIS);
+
+ converted = euc_jp2sjis(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+sjis_to_euc_jp(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_EUC_JP);
+
+ converted = sjis2euc_jp(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+euc_jp_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_MULE_INTERNAL);
+
+ converted = euc_jp2mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_euc_jp(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_JP);
+
+ converted = mic2euc_jp(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+sjis_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_MULE_INTERNAL);
+
+ converted = sjis2mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_sjis(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_SJIS);
+
+ converted = mic2sjis(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+/*
+ * SJIS ---> MIC
+ */
+static int
+sjis2mic(const unsigned char *sjis, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = sjis;
+ int c1,
+ c2,
+ i,
+ k,
+ k2;
+
+ while (len > 0)
+ {
+ c1 = *sjis;
+ if (c1 >= 0xa1 && c1 <= 0xdf)
+ {
+ /* JIS X0201 (1 byte kana) */
+ *p++ = LC_JISX0201K;
+ *p++ = c1;
+ sjis++;
+ len--;
+ }
+ else if (IS_HIGHBIT_SET(c1))
+ {
+ /*
+ * JIS X0208, X0212, user defined extended characters
+ */
+ if (len < 2 || !ISSJISHEAD(c1) || !ISSJISTAIL(sjis[1]))
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SJIS, (const char *) sjis, len);
+ }
+ c2 = sjis[1];
+ k = (c1 << 8) + c2;
+ if (k >= 0xed40 && k < 0xf040)
+ {
+ /* NEC selection IBM kanji */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].nec;
+ if (k2 == 0xffff)
+ break;
+ if (k2 == k)
+ {
+ k = ibmkanji[i].sjis;
+ c1 = (k >> 8) & 0xff;
+ c2 = k & 0xff;
+ }
+ }
+ }
+
+ if (k < 0xeb3f)
+ {
+ /* JIS X0208 */
+ *p++ = LC_JISX0208;
+ *p++ = ((c1 & 0x3f) << 1) + 0x9f + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if ((k >= 0xeb40 && k < 0xf040) || (k >= 0xfc4c && k <= 0xfcfc))
+ {
+ /* NEC selection IBM kanji - Other undecided justice */
+ *p++ = LC_JISX0208;
+ *p++ = PGEUCALTCODE >> 8;
+ *p++ = PGEUCALTCODE & 0xff;
+ }
+ else if (k >= 0xf040 && k < 0xf540)
+ {
+ /*
+ * UDC1 mapping to X0208 85 ku - 94 ku JIS code 0x7521 -
+ * 0x7e7e EUC 0xf5a1 - 0xfefe
+ */
+ *p++ = LC_JISX0208;
+ c1 -= 0x6f;
+ *p++ = ((c1 & 0x3f) << 1) + 0xf3 + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if (k >= 0xf540 && k < 0xfa40)
+ {
+ /*
+ * UDC2 mapping to X0212 85 ku - 94 ku JIS code 0x7521 -
+ * 0x7e7e EUC 0x8ff5a1 - 0x8ffefe
+ */
+ *p++ = LC_JISX0212;
+ c1 -= 0x74;
+ *p++ = ((c1 & 0x3f) << 1) + 0xf3 + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if (k >= 0xfa40)
+ {
+ /*
+ * mapping IBM kanji to X0208 and X0212
+ */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].sjis;
+ if (k2 == 0xffff)
+ break;
+ if (k2 == k)
+ {
+ k = ibmkanji[i].euc;
+ if (k >= 0x8f0000)
+ {
+ *p++ = LC_JISX0212;
+ *p++ = 0x80 | ((k & 0xff00) >> 8);
+ *p++ = 0x80 | (k & 0xff);
+ }
+ else
+ {
+ *p++ = LC_JISX0208;
+ *p++ = 0x80 | (k >> 8);
+ *p++ = 0x80 | (k & 0xff);
+ }
+ }
+ }
+ }
+ sjis += 2;
+ len -= 2;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SJIS, (const char *) sjis, len);
+ }
+ *p++ = c1;
+ sjis++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return sjis - start;
+}
+
+/*
+ * MIC ---> SJIS
+ */
+static int
+mic2sjis(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1,
+ c2,
+ k,
+ l;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_MULE_INTERNAL, (const char *) mic, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ if (c1 == LC_JISX0201K)
+ *p++ = mic[1];
+ else if (c1 == LC_JISX0208)
+ {
+ c1 = mic[1];
+ c2 = mic[2];
+ k = (c1 << 8) | (c2 & 0xff);
+ if (k >= 0xf5a1)
+ {
+ /* UDC1 */
+ c1 -= 0x54;
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1) + 0x6f;
+ }
+ else
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1);
+ *p++ = c2 - ((c1 & 1) ? ((c2 < 0xe0) ? 0x61 : 0x60) : 2);
+ }
+ else if (c1 == LC_JISX0212)
+ {
+ int i,
+ k2;
+
+ c1 = mic[1];
+ c2 = mic[2];
+ k = c1 << 8 | c2;
+ if (k >= 0xf5a1)
+ {
+ /* UDC2 */
+ c1 -= 0x54;
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1) + 0x74;
+ *p++ = c2 - ((c1 & 1) ? ((c2 < 0xe0) ? 0x61 : 0x60) : 2);
+ }
+ else
+ {
+ /* IBM kanji */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].euc & 0xffff;
+ if (k2 == 0xffff)
+ {
+ *p++ = PGSJISALTCODE >> 8;
+ *p++ = PGSJISALTCODE & 0xff;
+ break;
+ }
+ if (k2 == k)
+ {
+ k = ibmkanji[i].sjis;
+ *p++ = k >> 8;
+ *p++ = k & 0xff;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_SJIS,
+ (const char *) mic, len);
+ }
+ mic += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return mic - start;
+}
+
+/*
+ * EUC_JP ---> MIC
+ */
+static int
+euc_jp2mic(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JP,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_EUC_JP, (const char *) euc, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JP,
+ (const char *) euc, len);
+ }
+ if (c1 == SS2)
+ { /* 1 byte kana? */
+ *p++ = LC_JISX0201K;
+ *p++ = euc[1];
+ }
+ else if (c1 == SS3)
+ { /* JIS X0212 kanji? */
+ *p++ = LC_JISX0212;
+ *p++ = euc[1];
+ *p++ = euc[2];
+ }
+ else
+ { /* kanji? */
+ *p++ = LC_JISX0208;
+ *p++ = c1;
+ *p++ = euc[1];
+ }
+ euc += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * MIC ---> EUC_JP
+ */
+static int
+mic2euc_jp(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_MULE_INTERNAL, (const char *) mic, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ if (c1 == LC_JISX0201K)
+ {
+ *p++ = SS2;
+ *p++ = mic[1];
+ }
+ else if (c1 == LC_JISX0212)
+ {
+ *p++ = SS3;
+ *p++ = mic[1];
+ *p++ = mic[2];
+ }
+ else if (c1 == LC_JISX0208)
+ {
+ *p++ = mic[1];
+ *p++ = mic[2];
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_EUC_JP,
+ (const char *) mic, len);
+ }
+ mic += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return mic - start;
+}
+
+/*
+ * EUC_JP -> SJIS
+ */
+static int
+euc_jp2sjis(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1,
+ c2,
+ k;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JP,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_EUC_JP, (const char *) euc, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_JP,
+ (const char *) euc, len);
+ }
+ if (c1 == SS2)
+ {
+ /* hankaku kana? */
+ *p++ = euc[1];
+ }
+ else if (c1 == SS3)
+ {
+ /* JIS X0212 kanji? */
+ c1 = euc[1];
+ c2 = euc[2];
+ k = c1 << 8 | c2;
+ if (k >= 0xf5a1)
+ {
+ /* UDC2 */
+ c1 -= 0x54;
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1) + 0x74;
+ *p++ = c2 - ((c1 & 1) ? ((c2 < 0xe0) ? 0x61 : 0x60) : 2);
+ }
+ else
+ {
+ int i,
+ k2;
+
+ /* IBM kanji */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].euc & 0xffff;
+ if (k2 == 0xffff)
+ {
+ *p++ = PGSJISALTCODE >> 8;
+ *p++ = PGSJISALTCODE & 0xff;
+ break;
+ }
+ if (k2 == k)
+ {
+ k = ibmkanji[i].sjis;
+ *p++ = k >> 8;
+ *p++ = k & 0xff;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* JIS X0208 kanji? */
+ c2 = euc[1];
+ k = (c1 << 8) | (c2 & 0xff);
+ if (k >= 0xf5a1)
+ {
+ /* UDC1 */
+ c1 -= 0x54;
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1) + 0x6f;
+ }
+ else
+ *p++ = ((c1 - 0xa1) >> 1) + ((c1 < 0xdf) ? 0x81 : 0xc1);
+ *p++ = c2 - ((c1 & 1) ? ((c2 < 0xe0) ? 0x61 : 0x60) : 2);
+ }
+ euc += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * SJIS ---> EUC_JP
+ */
+static int
+sjis2euc_jp(const unsigned char *sjis, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = sjis;
+ int c1,
+ c2,
+ i,
+ k,
+ k2;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *sjis;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SJIS,
+ (const char *) sjis, len);
+ }
+ *p++ = c1;
+ sjis++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_SJIS, (const char *) sjis, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_SJIS,
+ (const char *) sjis, len);
+ }
+ if (c1 >= 0xa1 && c1 <= 0xdf)
+ {
+ /* JIS X0201 (1 byte kana) */
+ *p++ = SS2;
+ *p++ = c1;
+ }
+ else
+ {
+ /*
+ * JIS X0208, X0212, user defined extended characters
+ */
+ c2 = sjis[1];
+ k = (c1 << 8) + c2;
+ if (k >= 0xed40 && k < 0xf040)
+ {
+ /* NEC selection IBM kanji */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].nec;
+ if (k2 == 0xffff)
+ break;
+ if (k2 == k)
+ {
+ k = ibmkanji[i].sjis;
+ c1 = (k >> 8) & 0xff;
+ c2 = k & 0xff;
+ }
+ }
+ }
+
+ if (k < 0xeb3f)
+ {
+ /* JIS X0208 */
+ *p++ = ((c1 & 0x3f) << 1) + 0x9f + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if ((k >= 0xeb40 && k < 0xf040) || (k >= 0xfc4c && k <= 0xfcfc))
+ {
+ /* NEC selection IBM kanji - Other undecided justice */
+ *p++ = PGEUCALTCODE >> 8;
+ *p++ = PGEUCALTCODE & 0xff;
+ }
+ else if (k >= 0xf040 && k < 0xf540)
+ {
+ /*
+ * UDC1 mapping to X0208 85 ku - 94 ku JIS code 0x7521 -
+ * 0x7e7e EUC 0xf5a1 - 0xfefe
+ */
+ c1 -= 0x6f;
+ *p++ = ((c1 & 0x3f) << 1) + 0xf3 + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if (k >= 0xf540 && k < 0xfa40)
+ {
+ /*
+ * UDC2 mapping to X0212 85 ku - 94 ku JIS code 0x7521 -
+ * 0x7e7e EUC 0x8ff5a1 - 0x8ffefe
+ */
+ *p++ = SS3;
+ c1 -= 0x74;
+ *p++ = ((c1 & 0x3f) << 1) + 0xf3 + (c2 > 0x9e);
+ *p++ = c2 + ((c2 > 0x9e) ? 2 : 0x60) + (c2 < 0x80);
+ }
+ else if (k >= 0xfa40)
+ {
+ /*
+ * mapping IBM kanji to X0208 and X0212
+ *
+ */
+ for (i = 0;; i++)
+ {
+ k2 = ibmkanji[i].sjis;
+ if (k2 == 0xffff)
+ break;
+ if (k2 == k)
+ {
+ k = ibmkanji[i].euc;
+ if (k >= 0x8f0000)
+ {
+ *p++ = SS3;
+ *p++ = 0x80 | ((k & 0xff00) >> 8);
+ *p++ = 0x80 | (k & 0xff);
+ }
+ else
+ {
+ *p++ = 0x80 | (k >> 8);
+ *p++ = 0x80 | (k & 0xff);
+ }
+ }
+ }
+ }
+ }
+ sjis += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return sjis - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/sjis.map b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/sjis.map
new file mode 100644
index 0000000..1062f83
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/sjis.map
@@ -0,0 +1,396 @@
+static const struct
+{
+ unsigned short int nec; /* SJIS UDC (NEC selection IBM kanji) */
+ unsigned short int sjis; /* SJIS UDC (IBM kanji) */
+ int euc; /* EUC_JP */
+} ibmkanji[] = {
+{ 0xEEEF , 0xfa40 , 0x8ff3f3 },
+{ 0xEEF0 , 0xfa41 , 0x8ff3f4 },
+{ 0xEEF1 , 0xfa42 , 0x8ff3f5 },
+{ 0xEEF2 , 0xfa43 , 0x8ff3f6 },
+{ 0xEEF3 , 0xfa44 , 0x8ff3f7 },
+{ 0xEEF4 , 0xfa45 , 0x8ff3f8 },
+{ 0xEEF5 , 0xfa46 , 0x8ff3f9 },
+{ 0xEEF6 , 0xfa47 , 0x8ff3fa },
+{ 0xEEF7 , 0xfa48 , 0x8ff3fb },
+{ 0xEEF8 , 0xfa49 , 0x8ff3fc },
+{ 0x8754 , 0xfa4a , 0x8ff3fd },
+{ 0x8755 , 0xfa4b , 0x8ff3fe },
+{ 0x8756 , 0xfa4c , 0x8ff4a1 },
+{ 0x8757 , 0xfa4d , 0x8ff4a2 },
+{ 0x8758 , 0xfa4e , 0x8ff4a3 },
+{ 0x8759 , 0xfa4f , 0x8ff4a4 },
+{ 0x875A , 0xfa50 , 0x8ff4a5 },
+{ 0x875B , 0xfa51 , 0x8ff4a6 },
+{ 0x875C , 0xfa52 , 0x8ff4a7 },
+{ 0x875D , 0xfa53 , 0x8ff4a8 },
+{ 0xEEF9 , 0xfa54 , 0xa2cc },
+{ 0xEEFA , 0xfa55 , 0x8fa2c3 },
+{ 0xEEFB , 0xfa56 , 0x8ff4a9 },
+{ 0xEEFC , 0xfa57 , 0x8ff4aa },
+{ 0x878A , 0xfa58 , 0x8ff4ab },
+{ 0x8782 , 0xfa59 , 0x8ff4ac },
+{ 0x8784 , 0xfa5a , 0x8ff4ad },
+{ 0x879A , 0xfa5b , 0xa2e8 },
+{ 0xED40 , 0xfa5c , 0x8fd4e3 },
+{ 0xED41 , 0xfa5d , 0x8fdcdf },
+{ 0xED42 , 0xfa5e , 0x8fe4e9 },
+{ 0xED43 , 0xfa5f , 0x8fe3f8 },
+{ 0xED44 , 0xfa60 , 0x8fd9a1 },
+{ 0xED45 , 0xfa61 , 0x8fb1bb },
+{ 0xED46 , 0xfa62 , 0x8ff4ae },
+{ 0xED47 , 0xfa63 , 0x8fc2ad },
+{ 0xED48 , 0xfa64 , 0x8fc3fc },
+{ 0xED49 , 0xfa65 , 0x8fe4d0 },
+{ 0xED4A , 0xfa66 , 0x8fc2bf },
+{ 0xED4B , 0xfa67 , 0x8fbcf4 },
+{ 0xED4C , 0xfa68 , 0x8fb0a9 },
+{ 0xED4D , 0xfa69 , 0x8fb0c8 },
+{ 0xED4E , 0xfa6a , 0x8ff4af },
+{ 0xED4F , 0xfa6b , 0x8fb0d2 },
+{ 0xED50 , 0xfa6c , 0x8fb0d4 },
+{ 0xED51 , 0xfa6d , 0x8fb0e3 },
+{ 0xED52 , 0xfa6e , 0x8fb0ee },
+{ 0xED53 , 0xfa6f , 0x8fb1a7 },
+{ 0xED54 , 0xfa70 , 0x8fb1a3 },
+{ 0xED55 , 0xfa71 , 0x8fb1ac },
+{ 0xED56 , 0xfa72 , 0x8fb1a9 },
+{ 0xED57 , 0xfa73 , 0x8fb1be },
+{ 0xED58 , 0xfa74 , 0x8fb1df },
+{ 0xED59 , 0xfa75 , 0x8fb1d8 },
+{ 0xED5A , 0xfa76 , 0x8fb1c8 },
+{ 0xED5B , 0xfa77 , 0x8fb1d7 },
+{ 0xED5C , 0xfa78 , 0x8fb1e3 },
+{ 0xED5D , 0xfa79 , 0x8fb1f4 },
+{ 0xED5E , 0xfa7a , 0x8fb1e1 },
+{ 0xED5F , 0xfa7b , 0x8fb2a3 },
+{ 0xED60 , 0xfa7c , 0x8ff4b0 },
+{ 0xED61 , 0xfa7d , 0x8fb2bb },
+{ 0xED62 , 0xfa7e , 0x8fb2e6 },
+{ 0xED63 , 0xfa80 , 0x8fb2ed },
+{ 0xED64 , 0xfa81 , 0x8fb2f5 },
+{ 0xED65 , 0xfa82 , 0x8fb2fc },
+{ 0xED66 , 0xfa83 , 0x8ff4b1 },
+{ 0xED67 , 0xfa84 , 0x8fb3b5 },
+{ 0xED68 , 0xfa85 , 0x8fb3d8 },
+{ 0xED69 , 0xfa86 , 0x8fb3db },
+{ 0xED6A , 0xfa87 , 0x8fb3e5 },
+{ 0xED6B , 0xfa88 , 0x8fb3ee },
+{ 0xED6C , 0xfa89 , 0x8fb3fb },
+{ 0xED6D , 0xfa8a , 0x8ff4b2 },
+{ 0xED6E , 0xfa8b , 0x8ff4b3 },
+{ 0xED6F , 0xfa8c , 0x8fb4c0 },
+{ 0xED70 , 0xfa8d , 0x8fb4c7 },
+{ 0xED71 , 0xfa8e , 0x8fb4d0 },
+{ 0xED72 , 0xfa8f , 0x8fb4de },
+{ 0xED73 , 0xfa90 , 0x8ff4b4 },
+{ 0xED74 , 0xfa91 , 0x8fb5aa },
+{ 0xED75 , 0xfa92 , 0x8ff4b5 },
+{ 0xED76 , 0xfa93 , 0x8fb5af },
+{ 0xED77 , 0xfa94 , 0x8fb5c4 },
+{ 0xED78 , 0xfa95 , 0x8fb5e8 },
+{ 0xED79 , 0xfa96 , 0x8ff4b6 },
+{ 0xED7A , 0xfa97 , 0x8fb7c2 },
+{ 0xED7B , 0xfa98 , 0x8fb7e4 },
+{ 0xED7C , 0xfa99 , 0x8fb7e8 },
+{ 0xED7D , 0xfa9a , 0x8fb7e7 },
+{ 0xED7E , 0xfa9b , 0x8ff4b7 },
+{ 0xED80 , 0xfa9c , 0x8ff4b8 },
+{ 0xED81 , 0xfa9d , 0x8ff4b9 },
+{ 0xED82 , 0xfa9e , 0x8fb8ce },
+{ 0xED83 , 0xfa9f , 0x8fb8e1 },
+{ 0xED84 , 0xfaa0 , 0x8fb8f5 },
+{ 0xED85 , 0xfaa1 , 0x8fb8f7 },
+{ 0xED86 , 0xfaa2 , 0x8fb8f8 },
+{ 0xED87 , 0xfaa3 , 0x8fb8fc },
+{ 0xED88 , 0xfaa4 , 0x8fb9af },
+{ 0xED89 , 0xfaa5 , 0x8fb9b7 },
+{ 0xED8A , 0xfaa6 , 0x8fbabe },
+{ 0xED8B , 0xfaa7 , 0x8fbadb },
+{ 0xED8C , 0xfaa8 , 0x8fcdaa },
+{ 0xED8D , 0xfaa9 , 0x8fbae1 },
+{ 0xED8E , 0xfaaa , 0x8ff4ba },
+{ 0xED8F , 0xfaab , 0x8fbaeb },
+{ 0xED90 , 0xfaac , 0x8fbbb3 },
+{ 0xED91 , 0xfaad , 0x8fbbb8 },
+{ 0xED92 , 0xfaae , 0x8ff4bb },
+{ 0xED93 , 0xfaaf , 0x8fbbca },
+{ 0xED94 , 0xfab0 , 0x8ff4bc },
+{ 0xED95 , 0xfab1 , 0x8ff4bd },
+{ 0xED96 , 0xfab2 , 0x8fbbd0 },
+{ 0xED97 , 0xfab3 , 0x8fbbde },
+{ 0xED98 , 0xfab4 , 0x8fbbf4 },
+{ 0xED99 , 0xfab5 , 0x8fbbf5 },
+{ 0xED9A , 0xfab6 , 0x8fbbf9 },
+{ 0xED9B , 0xfab7 , 0x8fbce4 },
+{ 0xED9C , 0xfab8 , 0x8fbced },
+{ 0xED9D , 0xfab9 , 0x8fbcfe },
+{ 0xED9E , 0xfaba , 0x8ff4be },
+{ 0xED9F , 0xfabb , 0x8fbdc2 },
+{ 0xEDA0 , 0xfabc , 0x8fbde7 },
+{ 0xEDA1 , 0xfabd , 0x8ff4bf },
+{ 0xEDA2 , 0xfabe , 0x8fbdf0 },
+{ 0xEDA3 , 0xfabf , 0x8fbeb0 },
+{ 0xEDA4 , 0xfac0 , 0x8fbeac },
+{ 0xEDA5 , 0xfac1 , 0x8ff4c0 },
+{ 0xEDA6 , 0xfac2 , 0x8fbeb3 },
+{ 0xEDA7 , 0xfac3 , 0x8fbebd },
+{ 0xEDA8 , 0xfac4 , 0x8fbecd },
+{ 0xEDA9 , 0xfac5 , 0x8fbec9 },
+{ 0xEDAA , 0xfac6 , 0x8fbee4 },
+{ 0xEDAB , 0xfac7 , 0x8fbfa8 },
+{ 0xEDAC , 0xfac8 , 0x8fbfc9 },
+{ 0xEDAD , 0xfac9 , 0x8fc0c4 },
+{ 0xEDAE , 0xfaca , 0x8fc0e4 },
+{ 0xEDAF , 0xfacb , 0x8fc0f4 },
+{ 0xEDB0 , 0xfacc , 0x8fc1a6 },
+{ 0xEDB1 , 0xfacd , 0x8ff4c1 },
+{ 0xEDB2 , 0xface , 0x8fc1f5 },
+{ 0xEDB3 , 0xfacf , 0x8fc1fc },
+{ 0xEDB4 , 0xfad0 , 0x8ff4c2 },
+{ 0xEDB5 , 0xfad1 , 0x8fc1f8 },
+{ 0xEDB6 , 0xfad2 , 0x8fc2ab },
+{ 0xEDB7 , 0xfad3 , 0x8fc2a1 },
+{ 0xEDB8 , 0xfad4 , 0x8fc2a5 },
+{ 0xEDB9 , 0xfad5 , 0x8ff4c3 },
+{ 0xEDBA , 0xfad6 , 0x8fc2b8 },
+{ 0xEDBB , 0xfad7 , 0x8fc2ba },
+{ 0xEDBC , 0xfad8 , 0x8ff4c4 },
+{ 0xEDBD , 0xfad9 , 0x8fc2c4 },
+{ 0xEDBE , 0xfada , 0x8fc2d2 },
+{ 0xEDBF , 0xfadb , 0x8fc2d7 },
+{ 0xEDC0 , 0xfadc , 0x8fc2db },
+{ 0xEDC1 , 0xfadd , 0x8fc2de },
+{ 0xEDC2 , 0xfade , 0x8fc2ed },
+{ 0xEDC3 , 0xfadf , 0x8fc2f0 },
+{ 0xEDC4 , 0xfae0 , 0x8ff4c5 },
+{ 0xEDC5 , 0xfae1 , 0x8fc3a1 },
+{ 0xEDC6 , 0xfae2 , 0x8fc3b5 },
+{ 0xEDC7 , 0xfae3 , 0x8fc3c9 },
+{ 0xEDC8 , 0xfae4 , 0x8fc3b9 },
+{ 0xEDC9 , 0xfae5 , 0x8ff4c6 },
+{ 0xEDCA , 0xfae6 , 0x8fc3d8 },
+{ 0xEDCB , 0xfae7 , 0x8fc3fe },
+{ 0xEDCC , 0xfae8 , 0x8ff4c7 },
+{ 0xEDCD , 0xfae9 , 0x8fc4cc },
+{ 0xEDCE , 0xfaea , 0x8ff4c8 },
+{ 0xEDCF , 0xfaeb , 0x8fc4d9 },
+{ 0xEDD0 , 0xfaec , 0x8fc4ea },
+{ 0xEDD1 , 0xfaed , 0x8fc4fd },
+{ 0xEDD2 , 0xfaee , 0x8ff4c9 },
+{ 0xEDD3 , 0xfaef , 0x8fc5a7 },
+{ 0xEDD4 , 0xfaf0 , 0x8fc5b5 },
+{ 0xEDD5 , 0xfaf1 , 0x8fc5b6 },
+{ 0xEDD6 , 0xfaf2 , 0x8ff4ca },
+{ 0xEDD7 , 0xfaf3 , 0x8fc5d5 },
+{ 0xEDD8 , 0xfaf4 , 0x8fc6b8 },
+{ 0xEDD9 , 0xfaf5 , 0x8fc6d7 },
+{ 0xEDDA , 0xfaf6 , 0x8fc6e0 },
+{ 0xEDDB , 0xfaf7 , 0x8fc6ea },
+{ 0xEDDC , 0xfaf8 , 0x8fc6e3 },
+{ 0xEDDD , 0xfaf9 , 0x8fc7a1 },
+{ 0xEDDE , 0xfafa , 0x8fc7ab },
+{ 0xEDDF , 0xfafb , 0x8fc7c7 },
+{ 0xEDE0 , 0xfafc , 0x8fc7c3 },
+{ 0xEDE1 , 0xfb40 , 0x8fc7cb },
+{ 0xEDE2 , 0xfb41 , 0x8fc7cf },
+{ 0xEDE3 , 0xfb42 , 0x8fc7d9 },
+{ 0xEDE4 , 0xfb43 , 0x8ff4cb },
+{ 0xEDE5 , 0xfb44 , 0x8ff4cc },
+{ 0xEDE6 , 0xfb45 , 0x8fc7e6 },
+{ 0xEDE7 , 0xfb46 , 0x8fc7ee },
+{ 0xEDE8 , 0xfb47 , 0x8fc7fc },
+{ 0xEDE9 , 0xfb48 , 0x8fc7eb },
+{ 0xEDEA , 0xfb49 , 0x8fc7f0 },
+{ 0xEDEB , 0xfb4a , 0x8fc8b1 },
+{ 0xEDEC , 0xfb4b , 0x8fc8e5 },
+{ 0xEDED , 0xfb4c , 0x8fc8f8 },
+{ 0xEDEE , 0xfb4d , 0x8fc9a6 },
+{ 0xEDEF , 0xfb4e , 0x8fc9ab },
+{ 0xEDF0 , 0xfb4f , 0x8fc9ad },
+{ 0xEDF1 , 0xfb50 , 0x8ff4cd },
+{ 0xEDF2 , 0xfb51 , 0x8fc9ca },
+{ 0xEDF3 , 0xfb52 , 0x8fc9d3 },
+{ 0xEDF4 , 0xfb53 , 0x8fc9e9 },
+{ 0xEDF5 , 0xfb54 , 0x8fc9e3 },
+{ 0xEDF6 , 0xfb55 , 0x8fc9fc },
+{ 0xEDF7 , 0xfb56 , 0x8fc9f4 },
+{ 0xEDF8 , 0xfb57 , 0x8fc9f5 },
+{ 0xEDF9 , 0xfb58 , 0x8ff4ce },
+{ 0xEDFA , 0xfb59 , 0x8fcab3 },
+{ 0xEDFB , 0xfb5a , 0x8fcabd },
+{ 0xEDFC , 0xfb5b , 0x8fcaef },
+{ 0xEE40 , 0xfb5c , 0x8fcaf1 },
+{ 0xEE41 , 0xfb5d , 0x8fcbae },
+{ 0xEE42 , 0xfb5e , 0x8ff4cf },
+{ 0xEE43 , 0xfb5f , 0x8fcbca },
+{ 0xEE44 , 0xfb60 , 0x8fcbe6 },
+{ 0xEE45 , 0xfb61 , 0x8fcbea },
+{ 0xEE46 , 0xfb62 , 0x8fcbf0 },
+{ 0xEE47 , 0xfb63 , 0x8fcbf4 },
+{ 0xEE48 , 0xfb64 , 0x8fcbee },
+{ 0xEE49 , 0xfb65 , 0x8fcca5 },
+{ 0xEE4A , 0xfb66 , 0x8fcbf9 },
+{ 0xEE4B , 0xfb67 , 0x8fccab },
+{ 0xEE4C , 0xfb68 , 0x8fccae },
+{ 0xEE4D , 0xfb69 , 0x8fccad },
+{ 0xEE4E , 0xfb6a , 0x8fccb2 },
+{ 0xEE4F , 0xfb6b , 0x8fccc2 },
+{ 0xEE50 , 0xfb6c , 0x8fccd0 },
+{ 0xEE51 , 0xfb6d , 0x8fccd9 },
+{ 0xEE52 , 0xfb6e , 0x8ff4d0 },
+{ 0xEE53 , 0xfb6f , 0x8fcdbb },
+{ 0xEE54 , 0xfb70 , 0x8ff4d1 },
+{ 0xEE55 , 0xfb71 , 0x8fcebb },
+{ 0xEE56 , 0xfb72 , 0x8ff4d2 },
+{ 0xEE57 , 0xfb73 , 0x8fceba },
+{ 0xEE58 , 0xfb74 , 0x8fcec3 },
+{ 0xEE59 , 0xfb75 , 0x8ff4d3 },
+{ 0xEE5A , 0xfb76 , 0x8fcef2 },
+{ 0xEE5B , 0xfb77 , 0x8fb3dd },
+{ 0xEE5C , 0xfb78 , 0x8fcfd5 },
+{ 0xEE5D , 0xfb79 , 0x8fcfe2 },
+{ 0xEE5E , 0xfb7a , 0x8fcfe9 },
+{ 0xEE5F , 0xfb7b , 0x8fcfed },
+{ 0xEE60 , 0xfb7c , 0x8ff4d4 },
+{ 0xEE61 , 0xfb7d , 0x8ff4d5 },
+{ 0xEE62 , 0xfb7e , 0x8ff4d6 },
+{ 0xEE63 , 0xfb80 , 0x8ff4d7 },
+{ 0xEE64 , 0xfb81 , 0x8fd0e5 },
+{ 0xEE65 , 0xfb82 , 0x8ff4d8 },
+{ 0xEE66 , 0xfb83 , 0x8fd0e9 },
+{ 0xEE67 , 0xfb84 , 0x8fd1e8 },
+{ 0xEE68 , 0xfb85 , 0x8ff4d9 },
+{ 0xEE69 , 0xfb86 , 0x8ff4da },
+{ 0xEE6A , 0xfb87 , 0x8fd1ec },
+{ 0xEE6B , 0xfb88 , 0x8fd2bb },
+{ 0xEE6C , 0xfb89 , 0x8ff4db },
+{ 0xEE6D , 0xfb8a , 0x8fd3e1 },
+{ 0xEE6E , 0xfb8b , 0x8fd3e8 },
+{ 0xEE6F , 0xfb8c , 0x8fd4a7 },
+{ 0xEE70 , 0xfb8d , 0x8ff4dc },
+{ 0xEE71 , 0xfb8e , 0x8ff4dd },
+{ 0xEE72 , 0xfb8f , 0x8fd4d4 },
+{ 0xEE73 , 0xfb90 , 0x8fd4f2 },
+{ 0xEE74 , 0xfb91 , 0x8fd5ae },
+{ 0xEE75 , 0xfb92 , 0x8ff4de },
+{ 0xEE76 , 0xfb93 , 0x8fd7de },
+{ 0xEE77 , 0xfb94 , 0x8ff4df },
+{ 0xEE78 , 0xfb95 , 0x8fd8a2 },
+{ 0xEE79 , 0xfb96 , 0x8fd8b7 },
+{ 0xEE7A , 0xfb97 , 0x8fd8c1 },
+{ 0xEE7B , 0xfb98 , 0x8fd8d1 },
+{ 0xEE7C , 0xfb99 , 0x8fd8f4 },
+{ 0xEE7D , 0xfb9a , 0x8fd9c6 },
+{ 0xEE7E , 0xfb9b , 0x8fd9c8 },
+{ 0xEE80 , 0xfb9c , 0x8fd9d1 },
+{ 0xEE81 , 0xfb9d , 0x8ff4e0 },
+{ 0xEE82 , 0xfb9e , 0x8ff4e1 },
+{ 0xEE83 , 0xfb9f , 0x8ff4e2 },
+{ 0xEE84 , 0xfba0 , 0x8ff4e3 },
+{ 0xEE85 , 0xfba1 , 0x8ff4e4 },
+{ 0xEE86 , 0xfba2 , 0x8fdcd3 },
+{ 0xEE87 , 0xfba3 , 0x8fddc8 },
+{ 0xEE88 , 0xfba4 , 0x8fddd4 },
+{ 0xEE89 , 0xfba5 , 0x8fddea },
+{ 0xEE8A , 0xfba6 , 0x8fddfa },
+{ 0xEE8B , 0xfba7 , 0x8fdea4 },
+{ 0xEE8C , 0xfba8 , 0x8fdeb0 },
+{ 0xEE8D , 0xfba9 , 0x8ff4e5 },
+{ 0xEE8E , 0xfbaa , 0x8fdeb5 },
+{ 0xEE8F , 0xfbab , 0x8fdecb },
+{ 0xEE90 , 0xfbac , 0x8ff4e6 },
+{ 0xEE91 , 0xfbad , 0x8fdfb9 },
+{ 0xEE92 , 0xfbae , 0x8ff4e7 },
+{ 0xEE93 , 0xfbaf , 0x8fdfc3 },
+{ 0xEE94 , 0xfbb0 , 0x8ff4e8 },
+{ 0xEE95 , 0xfbb1 , 0x8ff4e9 },
+{ 0xEE96 , 0xfbb2 , 0x8fe0d9 },
+{ 0xEE97 , 0xfbb3 , 0x8ff4ea },
+{ 0xEE98 , 0xfbb4 , 0x8ff4eb },
+{ 0xEE99 , 0xfbb5 , 0x8fe1e2 },
+{ 0xEE9A , 0xfbb6 , 0x8ff4ec },
+{ 0xEE9B , 0xfbb7 , 0x8ff4ed },
+{ 0xEE9C , 0xfbb8 , 0x8ff4ee },
+{ 0xEE9D , 0xfbb9 , 0x8fe2c7 },
+{ 0xEE9E , 0xfbba , 0x8fe3a8 },
+{ 0xEE9F , 0xfbbb , 0x8fe3a6 },
+{ 0xEEA0 , 0xfbbc , 0x8fe3a9 },
+{ 0xEEA1 , 0xfbbd , 0x8fe3af },
+{ 0xEEA2 , 0xfbbe , 0x8fe3b0 },
+{ 0xEEA3 , 0xfbbf , 0x8fe3aa },
+{ 0xEEA4 , 0xfbc0 , 0x8fe3ab },
+{ 0xEEA5 , 0xfbc1 , 0x8fe3bc },
+{ 0xEEA6 , 0xfbc2 , 0x8fe3c1 },
+{ 0xEEA7 , 0xfbc3 , 0x8fe3bf },
+{ 0xEEA8 , 0xfbc4 , 0x8fe3d5 },
+{ 0xEEA9 , 0xfbc5 , 0x8fe3d8 },
+{ 0xEEAA , 0xfbc6 , 0x8fe3d6 },
+{ 0xEEAB , 0xfbc7 , 0x8fe3df },
+{ 0xEEAC , 0xfbc8 , 0x8fe3e3 },
+{ 0xEEAD , 0xfbc9 , 0x8fe3e1 },
+{ 0xEEAE , 0xfbca , 0x8fe3d4 },
+{ 0xEEAF , 0xfbcb , 0x8fe3e9 },
+{ 0xEEB0 , 0xfbcc , 0x8fe4a6 },
+{ 0xEEB1 , 0xfbcd , 0x8fe3f1 },
+{ 0xEEB2 , 0xfbce , 0x8fe3f2 },
+{ 0xEEB3 , 0xfbcf , 0x8fe4cb },
+{ 0xEEB4 , 0xfbd0 , 0x8fe4c1 },
+{ 0xEEB5 , 0xfbd1 , 0x8fe4c3 },
+{ 0xEEB6 , 0xfbd2 , 0x8fe4be },
+{ 0xEEB7 , 0xfbd3 , 0x8ff4ef },
+{ 0xEEB8 , 0xfbd4 , 0x8fe4c0 },
+{ 0xEEB9 , 0xfbd5 , 0x8fe4c7 },
+{ 0xEEBA , 0xfbd6 , 0x8fe4bf },
+{ 0xEEBB , 0xfbd7 , 0x8fe4e0 },
+{ 0xEEBC , 0xfbd8 , 0x8fe4de },
+{ 0xEEBD , 0xfbd9 , 0x8fe4d1 },
+{ 0xEEBE , 0xfbda , 0x8ff4f0 },
+{ 0xEEBF , 0xfbdb , 0x8fe4dc },
+{ 0xEEC0 , 0xfbdc , 0x8fe4d2 },
+{ 0xEEC1 , 0xfbdd , 0x8fe4db },
+{ 0xEEC2 , 0xfbde , 0x8fe4d4 },
+{ 0xEEC3 , 0xfbdf , 0x8fe4fa },
+{ 0xEEC4 , 0xfbe0 , 0x8fe4ef },
+{ 0xEEC5 , 0xfbe1 , 0x8fe5b3 },
+{ 0xEEC6 , 0xfbe2 , 0x8fe5bf },
+{ 0xEEC7 , 0xfbe3 , 0x8fe5c9 },
+{ 0xEEC8 , 0xfbe4 , 0x8fe5d0 },
+{ 0xEEC9 , 0xfbe5 , 0x8fe5e2 },
+{ 0xEECA , 0xfbe6 , 0x8fe5ea },
+{ 0xEECB , 0xfbe7 , 0x8fe5eb },
+{ 0xEECC , 0xfbe8 , 0x8ff4f1 },
+{ 0xEECD , 0xfbe9 , 0x8ff4f2 },
+{ 0xEECE , 0xfbea , 0x8ff4f3 },
+{ 0xEECF , 0xfbeb , 0x8fe6e8 },
+{ 0xEED0 , 0xfbec , 0x8fe6ef },
+{ 0xEED1 , 0xfbed , 0x8fe7ac },
+{ 0xEED2 , 0xfbee , 0x8ff4f4 },
+{ 0xEED3 , 0xfbef , 0x8fe7ae },
+{ 0xEED4 , 0xfbf0 , 0x8ff4f5 },
+{ 0xEED5 , 0xfbf1 , 0x8fe7b1 },
+{ 0xEED6 , 0xfbf2 , 0x8ff4f6 },
+{ 0xEED7 , 0xfbf3 , 0x8fe7b2 },
+{ 0xEED8 , 0xfbf4 , 0x8fe8b1 },
+{ 0xEED9 , 0xfbf5 , 0x8fe8b6 },
+{ 0xEEDA , 0xfbf6 , 0x8ff4f7 },
+{ 0xEEDB , 0xfbf7 , 0x8ff4f8 },
+{ 0xEEDC , 0xfbf8 , 0x8fe8dd },
+{ 0xEEDD , 0xfbf9 , 0x8ff4f9 },
+{ 0xEEDE , 0xfbfa , 0x8ff4fa },
+{ 0xEEDF , 0xfbfb , 0x8fe9d1 },
+{ 0xEEE0 , 0xfbfc , 0x8ff4fb },
+{ 0xEEE1 , 0xfc40 , 0x8fe9ed },
+{ 0xEEE2 , 0xfc41 , 0x8feacd },
+{ 0xEEE3 , 0xfc42 , 0x8ff4fc },
+{ 0xEEE4 , 0xfc43 , 0x8feadb },
+{ 0xEEE5 , 0xfc44 , 0x8feae6 },
+{ 0xEEE6 , 0xfc45 , 0x8feaea },
+{ 0xEEE7 , 0xfc46 , 0x8feba5 },
+{ 0xEEE8 , 0xfc47 , 0x8febfb },
+{ 0xEEE9 , 0xfc48 , 0x8febfa },
+{ 0xEEEA , 0xfc49 , 0x8ff4fd },
+{ 0xEEEB , 0xfc4a , 0x8fecd6 },
+{ 0xEEEC , 0xfc4b , 0x8ff4fe },
+{ 0xffff , 0xffff , 0xffff } /* Stop code */
+};
diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile
new file mode 100644
index 0000000..d43b082
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/euc_kr_and_mic/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/euc_kr_and_mic
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = euc_kr_and_mic
+PGFILEDESC = "euc_kr <-> mic text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c
new file mode 100644
index 0000000..4361624
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c
@@ -0,0 +1,174 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_KR and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_kr_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_euc_kr);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+static int euc_kr2mic(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int mic2euc_kr(const unsigned char *mic, unsigned char *p, int len, bool noError);
+
+Datum
+euc_kr_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_KR, PG_MULE_INTERNAL);
+
+ converted = euc_kr2mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_euc_kr(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_KR);
+
+ converted = mic2euc_kr(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+/*
+ * EUC_KR ---> MIC
+ */
+static int
+euc_kr2mic(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ l = pg_encoding_verifymbchar(PG_EUC_KR, (const char *) euc, len);
+ if (l != 2)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_KR,
+ (const char *) euc, len);
+ }
+ *p++ = LC_KS5601;
+ *p++ = c1;
+ *p++ = euc[1];
+ euc += 2;
+ len -= 2;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_KR,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * MIC ---> EUC_KR
+ */
+static int
+mic2euc_kr(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_MULE_INTERNAL, (const char *) mic, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ if (c1 == LC_KS5601)
+ {
+ *p++ = mic[1];
+ *p++ = mic[2];
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_EUC_KR,
+ (const char *) mic, len);
+ }
+ mic += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return mic - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/Makefile b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/Makefile
new file mode 100644
index 0000000..5ac2389
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/Makefile
@@ -0,0 +1,16 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/euc_tw_and_big5/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/euc_tw_and_big5
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = euc_tw_and_big5
+PGFILEDESC = "euc_tw <-> big5 text conversions"
+
+SRCS += big5.c
+OBJS += big5.o
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/big5.c b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/big5.c
new file mode 100644
index 0000000..68f76aa
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/big5.c
@@ -0,0 +1,377 @@
+/*
+ * conversion between BIG5 and Mule Internal Code(CNS 116643-1992
+ * plane 1 and plane 2).
+ * This program is partially copied from lv(Multilingual file viewer)
+ * and slightly modified. lv is written and copyrighted by NARITA Tomio
+ * (nrt@web.ad.jp).
+ *
+ * 1999/1/15 Tatsuo Ishii
+ *
+ * src/backend/utils/mb/conversion_procs/euc_tw_and_big5/big5.c
+ */
+
+/* can be used in either frontend or backend */
+#include "postgres_fe.h"
+
+#include "mb/pg_wchar.h"
+
+typedef struct
+{
+ unsigned short code,
+ peer;
+} codes_t;
+
+/* map Big5 Level 1 to CNS 11643-1992 Plane 1 */
+static const codes_t big5Level1ToCnsPlane1[25] = { /* range */
+ {0xA140, 0x2121},
+ {0xA1F6, 0x2258},
+ {0xA1F7, 0x2257},
+ {0xA1F8, 0x2259},
+ {0xA2AF, 0x2421},
+ {0xA3C0, 0x4221},
+ {0xa3e1, 0x0000},
+ {0xA440, 0x4421},
+ {0xACFE, 0x5753},
+ {0xacff, 0x0000},
+ {0xAD40, 0x5323},
+ {0xAFD0, 0x5754},
+ {0xBBC8, 0x6B51},
+ {0xBE52, 0x6B50},
+ {0xBE53, 0x6F5C},
+ {0xC1AB, 0x7536},
+ {0xC2CB, 0x7535},
+ {0xC2CC, 0x7737},
+ {0xC361, 0x782E},
+ {0xC3B9, 0x7865},
+ {0xC3BA, 0x7864},
+ {0xC3BB, 0x7866},
+ {0xC456, 0x782D},
+ {0xC457, 0x7962},
+ {0xc67f, 0x0000}
+};
+
+/* map CNS 11643-1992 Plane 1 to Big5 Level 1 */
+static const codes_t cnsPlane1ToBig5Level1[26] = { /* range */
+ {0x2121, 0xA140},
+ {0x2257, 0xA1F7},
+ {0x2258, 0xA1F6},
+ {0x2259, 0xA1F8},
+ {0x234f, 0x0000},
+ {0x2421, 0xA2AF},
+ {0x2571, 0x0000},
+ {0x4221, 0xA3C0},
+ {0x4242, 0x0000},
+ {0x4421, 0xA440},
+ {0x5323, 0xAD40},
+ {0x5753, 0xACFE},
+ {0x5754, 0xAFD0},
+ {0x6B50, 0xBE52},
+ {0x6B51, 0xBBC8},
+ {0x6F5C, 0xBE53},
+ {0x7535, 0xC2CB},
+ {0x7536, 0xC1AB},
+ {0x7737, 0xC2CC},
+ {0x782D, 0xC456},
+ {0x782E, 0xC361},
+ {0x7864, 0xC3BA},
+ {0x7865, 0xC3B9},
+ {0x7866, 0xC3BB},
+ {0x7962, 0xC457},
+ {0x7d4c, 0x0000}
+};
+
+/* map Big5 Level 2 to CNS 11643-1992 Plane 2 */
+static const codes_t big5Level2ToCnsPlane2[48] = { /* range */
+ {0xC940, 0x2121},
+ {0xc94a, 0x0000},
+ {0xC94B, 0x212B},
+ {0xC96C, 0x214D},
+ {0xC9BE, 0x214C},
+ {0xC9BF, 0x217D},
+ {0xC9ED, 0x224E},
+ {0xCAF7, 0x224D},
+ {0xCAF8, 0x2439},
+ {0xD77A, 0x3F6A},
+ {0xD77B, 0x387E},
+ {0xDBA7, 0x3F6B},
+ {0xDDFC, 0x4176},
+ {0xDDFD, 0x4424},
+ {0xE8A3, 0x554C},
+ {0xE976, 0x5723},
+ {0xEB5B, 0x5A29},
+ {0xEBF1, 0x554B},
+ {0xEBF2, 0x5B3F},
+ {0xECDE, 0x5722},
+ {0xECDF, 0x5C6A},
+ {0xEDAA, 0x5D75},
+ {0xEEEB, 0x642F},
+ {0xEEEC, 0x6039},
+ {0xF056, 0x5D74},
+ {0xF057, 0x6243},
+ {0xF0CB, 0x5A28},
+ {0xF0CC, 0x6337},
+ {0xF163, 0x6430},
+ {0xF16B, 0x6761},
+ {0xF16C, 0x6438},
+ {0xF268, 0x6934},
+ {0xF269, 0x6573},
+ {0xF2C3, 0x664E},
+ {0xF375, 0x6762},
+ {0xF466, 0x6935},
+ {0xF4B5, 0x664D},
+ {0xF4B6, 0x6962},
+ {0xF4FD, 0x6A4C},
+ {0xF663, 0x6A4B},
+ {0xF664, 0x6C52},
+ {0xF977, 0x7167},
+ {0xF9C4, 0x7166},
+ {0xF9C5, 0x7234},
+ {0xF9C6, 0x7240},
+ {0xF9C7, 0x7235},
+ {0xF9D2, 0x7241},
+ {0xf9d6, 0x0000}
+};
+
+/* map CNS 11643-1992 Plane 2 to Big5 Level 2 */
+static const codes_t cnsPlane2ToBig5Level2[49] = { /* range */
+ {0x2121, 0xC940},
+ {0x212B, 0xC94B},
+ {0x214C, 0xC9BE},
+ {0x214D, 0xC96C},
+ {0x217D, 0xC9BF},
+ {0x224D, 0xCAF7},
+ {0x224E, 0xC9ED},
+ {0x2439, 0xCAF8},
+ {0x387E, 0xD77B},
+ {0x3F6A, 0xD77A},
+ {0x3F6B, 0xDBA7},
+ {0x4424, 0x0000},
+ {0x4176, 0xDDFC},
+ {0x4177, 0x0000},
+ {0x4424, 0xDDFD},
+ {0x554B, 0xEBF1},
+ {0x554C, 0xE8A3},
+ {0x5722, 0xECDE},
+ {0x5723, 0xE976},
+ {0x5A28, 0xF0CB},
+ {0x5A29, 0xEB5B},
+ {0x5B3F, 0xEBF2},
+ {0x5C6A, 0xECDF},
+ {0x5D74, 0xF056},
+ {0x5D75, 0xEDAA},
+ {0x6039, 0xEEEC},
+ {0x6243, 0xF057},
+ {0x6337, 0xF0CC},
+ {0x642F, 0xEEEB},
+ {0x6430, 0xF163},
+ {0x6438, 0xF16C},
+ {0x6573, 0xF269},
+ {0x664D, 0xF4B5},
+ {0x664E, 0xF2C3},
+ {0x6761, 0xF16B},
+ {0x6762, 0xF375},
+ {0x6934, 0xF268},
+ {0x6935, 0xF466},
+ {0x6962, 0xF4B6},
+ {0x6A4B, 0xF663},
+ {0x6A4C, 0xF4FD},
+ {0x6C52, 0xF664},
+ {0x7166, 0xF9C4},
+ {0x7167, 0xF977},
+ {0x7234, 0xF9C5},
+ {0x7235, 0xF9C7},
+ {0x7240, 0xF9C6},
+ {0x7241, 0xF9D2},
+ {0x7245, 0x0000}
+};
+
+/* Big Five Level 1 Correspondence to CNS 11643-1992 Plane 4 */
+static const unsigned short b1c4[][2] = {
+ {0xC879, 0x2123},
+ {0xC87B, 0x2124},
+ {0xC87D, 0x212A},
+ {0xC8A2, 0x2152}
+};
+
+/* Big Five Level 2 Correspondence to CNS 11643-1992 Plane 3 */
+static const unsigned short b2c3[][2] = {
+ {0xF9D6, 0x4337},
+ {0xF9D7, 0x4F50},
+ {0xF9D8, 0x444E},
+ {0xF9D9, 0x504A},
+ {0xF9DA, 0x2C5D},
+ {0xF9DB, 0x3D7E},
+ {0xF9DC, 0x4B5C}
+};
+
+static unsigned short BinarySearchRange
+ (const codes_t *array, int high, unsigned short code)
+{
+ int low,
+ mid,
+ distance,
+ tmp;
+
+ low = 0;
+ mid = high >> 1;
+
+ for (; low <= high; mid = (low + high) >> 1)
+ {
+ if ((array[mid].code <= code) && (array[mid + 1].code > code))
+ {
+ if (0 == array[mid].peer)
+ return 0;
+ if (code >= 0xa140U)
+ {
+ /* big5 to cns */
+ tmp = ((code & 0xff00) - (array[mid].code & 0xff00)) >> 8;
+ high = code & 0x00ff;
+ low = array[mid].code & 0x00ff;
+
+ /*
+ * NOTE: big5 high_byte: 0xa1-0xfe, low_byte: 0x40-0x7e,
+ * 0xa1-0xfe (radicals: 0x00-0x3e, 0x3f-0x9c) big5 radix is
+ * 0x9d. [region_low, region_high] We
+ * should remember big5 has two different regions (above).
+ * There is a bias for the distance between these regions.
+ * 0xa1 - 0x7e + bias = 1 (Distance between 0xa1 and 0x7e is
+ * 1.) bias = - 0x22.
+ */
+ distance = tmp * 0x9d + high - low +
+ (high >= 0xa1 ? (low >= 0xa1 ? 0 : -0x22)
+ : (low >= 0xa1 ? +0x22 : 0));
+
+ /*
+ * NOTE: we have to convert the distance into a code point.
+ * The code point's low_byte is 0x21 plus mod_0x5e. In the
+ * first, we extract the mod_0x5e of the starting code point,
+ * subtracting 0x21, and add distance to it. Then we calculate
+ * again mod_0x5e of them, and restore the final codepoint,
+ * adding 0x21.
+ */
+ tmp = (array[mid].peer & 0x00ff) + distance - 0x21;
+ tmp = (array[mid].peer & 0xff00) + ((tmp / 0x5e) << 8)
+ + 0x21 + tmp % 0x5e;
+ return tmp;
+ }
+ else
+ {
+ /* cns to big5 */
+ tmp = ((code & 0xff00) - (array[mid].code & 0xff00)) >> 8;
+
+ /*
+ * NOTE: ISO charsets ranges between 0x21-0xfe (94charset).
+ * Its radix is 0x5e. But there is no distance bias like big5.
+ */
+ distance = tmp * 0x5e
+ + ((int) (code & 0x00ff) - (int) (array[mid].code & 0x00ff));
+
+ /*
+ * NOTE: Similar to big5 to cns conversion, we extract
+ * mod_0x9d and restore mod_0x9d into a code point.
+ */
+ low = array[mid].peer & 0x00ff;
+ tmp = low + distance - (low >= 0xa1 ? 0x62 : 0x40);
+ low = tmp % 0x9d;
+ tmp = (array[mid].peer & 0xff00) + ((tmp / 0x9d) << 8)
+ + (low > 0x3e ? 0x62 : 0x40) + low;
+ return tmp;
+ }
+ }
+ else if (array[mid].code > code)
+ high = mid - 1;
+ else
+ low = mid + 1;
+ }
+
+ return 0;
+}
+
+
+unsigned short
+BIG5toCNS(unsigned short big5, unsigned char *lc)
+{
+ unsigned short cns = 0;
+ int i;
+
+ if (big5 < 0xc940U)
+ {
+ /* level 1 */
+
+ for (i = 0; i < sizeof(b1c4) / (sizeof(unsigned short) * 2); i++)
+ {
+ if (b1c4[i][0] == big5)
+ {
+ *lc = LC_CNS11643_4;
+ return (b1c4[i][1] | 0x8080U);
+ }
+ }
+
+ if (0 < (cns = BinarySearchRange(big5Level1ToCnsPlane1, 23, big5)))
+ *lc = LC_CNS11643_1;
+ }
+ else if (big5 == 0xc94aU)
+ {
+ /* level 2 */
+ *lc = LC_CNS11643_1;
+ cns = 0x4442;
+ }
+ else
+ {
+ /* level 2 */
+ for (i = 0; i < sizeof(b2c3) / (sizeof(unsigned short) * 2); i++)
+ {
+ if (b2c3[i][0] == big5)
+ {
+ *lc = LC_CNS11643_3;
+ return (b2c3[i][1] | 0x8080U);
+ }
+ }
+
+ if (0 < (cns = BinarySearchRange(big5Level2ToCnsPlane2, 46, big5)))
+ *lc = LC_CNS11643_2;
+ }
+
+ if (0 == cns)
+ { /* no mapping Big5 to CNS 11643-1992 */
+ *lc = 0;
+ return (unsigned short) '?';
+ }
+
+ return cns | 0x8080;
+}
+
+unsigned short
+CNStoBIG5(unsigned short cns, unsigned char lc)
+{
+ int i;
+ unsigned int big5 = 0;
+
+ cns &= 0x7f7f;
+
+ switch (lc)
+ {
+ case LC_CNS11643_1:
+ big5 = BinarySearchRange(cnsPlane1ToBig5Level1, 24, cns);
+ break;
+ case LC_CNS11643_2:
+ big5 = BinarySearchRange(cnsPlane2ToBig5Level2, 47, cns);
+ break;
+ case LC_CNS11643_3:
+ for (i = 0; i < sizeof(b2c3) / (sizeof(unsigned short) * 2); i++)
+ {
+ if (b2c3[i][1] == cns)
+ return b2c3[i][0];
+ }
+ break;
+ case LC_CNS11643_4:
+ for (i = 0; i < sizeof(b1c4) / (sizeof(unsigned short) * 2); i++)
+ {
+ if (b1c4[i][1] == cns)
+ return b1c4[i][0];
+ }
+ default:
+ break;
+ }
+ return big5;
+}
diff --git a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c
new file mode 100644
index 0000000..e00a2ca
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c
@@ -0,0 +1,582 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_TW, BIG5 and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+#define ENCODING_GROWTH_RATE 4
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_tw_to_big5);
+PG_FUNCTION_INFO_V1(big5_to_euc_tw);
+PG_FUNCTION_INFO_V1(euc_tw_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_euc_tw);
+PG_FUNCTION_INFO_V1(big5_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_big5);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+static int euc_tw2big5(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int big52euc_tw(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int big52mic(const unsigned char *big5, unsigned char *p, int len, bool noError);
+static int mic2big5(const unsigned char *mic, unsigned char *p, int len, bool noError);
+static int euc_tw2mic(const unsigned char *euc, unsigned char *p, int len, bool noError);
+static int mic2euc_tw(const unsigned char *mic, unsigned char *p, int len, bool noError);
+
+Datum
+euc_tw_to_big5(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_BIG5);
+
+ converted = euc_tw2big5(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+big5_to_euc_tw(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_EUC_TW);
+
+ converted = big52euc_tw(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+euc_tw_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_MULE_INTERNAL);
+
+ converted = euc_tw2mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_euc_tw(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_EUC_TW);
+
+ converted = mic2euc_tw(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+big5_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_MULE_INTERNAL);
+
+ converted = big52mic(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_big5(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_BIG5);
+
+ converted = mic2big5(src, dest, len, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+
+/*
+ * EUC_TW ---> Big5
+ */
+static int
+euc_tw2big5(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ unsigned char c1;
+ unsigned short big5buf,
+ cnsBuf;
+ unsigned char lc;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ /* Verify and decode the next EUC_TW input character */
+ l = pg_encoding_verifymbchar(PG_EUC_TW, (const char *) euc, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_TW,
+ (const char *) euc, len);
+ }
+ if (c1 == SS2)
+ {
+ c1 = euc[1]; /* plane No. */
+ if (c1 == 0xa1)
+ lc = LC_CNS11643_1;
+ else if (c1 == 0xa2)
+ lc = LC_CNS11643_2;
+ else
+ lc = c1 - 0xa3 + LC_CNS11643_3;
+ cnsBuf = (euc[2] << 8) | euc[3];
+ }
+ else
+ { /* CNS11643-1 */
+ lc = LC_CNS11643_1;
+ cnsBuf = (c1 << 8) | euc[1];
+ }
+
+ /* Write it out in Big5 */
+ big5buf = CNStoBIG5(cnsBuf, lc);
+ if (big5buf == 0)
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_EUC_TW, PG_BIG5,
+ (const char *) euc, len);
+ }
+ *p++ = (big5buf >> 8) & 0x00ff;
+ *p++ = big5buf & 0x00ff;
+
+ euc += l;
+ len -= l;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_TW,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * Big5 ---> EUC_TW
+ */
+static int
+big52euc_tw(const unsigned char *big5, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = big5;
+ unsigned short c1;
+ unsigned short big5buf,
+ cnsBuf;
+ unsigned char lc;
+ int l;
+
+ while (len > 0)
+ {
+ /* Verify and decode the next Big5 input character */
+ c1 = *big5;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ l = pg_encoding_verifymbchar(PG_BIG5, (const char *) big5, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_BIG5,
+ (const char *) big5, len);
+ }
+ big5buf = (c1 << 8) | big5[1];
+ cnsBuf = BIG5toCNS(big5buf, &lc);
+
+ if (lc == LC_CNS11643_1)
+ {
+ *p++ = (cnsBuf >> 8) & 0x00ff;
+ *p++ = cnsBuf & 0x00ff;
+ }
+ else if (lc == LC_CNS11643_2)
+ {
+ *p++ = SS2;
+ *p++ = 0xa2;
+ *p++ = (cnsBuf >> 8) & 0x00ff;
+ *p++ = cnsBuf & 0x00ff;
+ }
+ else if (lc >= LC_CNS11643_3 && lc <= LC_CNS11643_7)
+ {
+ *p++ = SS2;
+ *p++ = lc - LC_CNS11643_3 + 0xa3;
+ *p++ = (cnsBuf >> 8) & 0x00ff;
+ *p++ = cnsBuf & 0x00ff;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_BIG5, PG_EUC_TW,
+ (const char *) big5, len);
+ }
+
+ big5 += l;
+ len -= l;
+ }
+ else
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_BIG5,
+ (const char *) big5, len);
+ }
+ *p++ = c1;
+ big5++;
+ len--;
+ continue;
+ }
+ }
+ *p = '\0';
+
+ return big5 - start;
+}
+
+/*
+ * EUC_TW ---> MIC
+ */
+static int
+euc_tw2mic(const unsigned char *euc, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = euc;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *euc;
+ if (IS_HIGHBIT_SET(c1))
+ {
+ l = pg_encoding_verifymbchar(PG_EUC_TW, (const char *) euc, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_TW,
+ (const char *) euc, len);
+ }
+ if (c1 == SS2)
+ {
+ c1 = euc[1]; /* plane No. */
+ if (c1 == 0xa1)
+ *p++ = LC_CNS11643_1;
+ else if (c1 == 0xa2)
+ *p++ = LC_CNS11643_2;
+ else
+ {
+ /* other planes are MULE private charsets */
+ *p++ = LCPRV2_B;
+ *p++ = c1 - 0xa3 + LC_CNS11643_3;
+ }
+ *p++ = euc[2];
+ *p++ = euc[3];
+ }
+ else
+ { /* CNS11643-1 */
+ *p++ = LC_CNS11643_1;
+ *p++ = c1;
+ *p++ = euc[1];
+ }
+ euc += l;
+ len -= l;
+ }
+ else
+ { /* should be ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_EUC_TW,
+ (const char *) euc, len);
+ }
+ *p++ = c1;
+ euc++;
+ len--;
+ }
+ }
+ *p = '\0';
+
+ return euc - start;
+}
+
+/*
+ * MIC ---> EUC_TW
+ */
+static int
+mic2euc_tw(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ int c1;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_MULE_INTERNAL, (const char *) mic, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ if (c1 == LC_CNS11643_1)
+ {
+ *p++ = mic[1];
+ *p++ = mic[2];
+ }
+ else if (c1 == LC_CNS11643_2)
+ {
+ *p++ = SS2;
+ *p++ = 0xa2;
+ *p++ = mic[1];
+ *p++ = mic[2];
+ }
+ else if (c1 == LCPRV2_B &&
+ mic[1] >= LC_CNS11643_3 && mic[1] <= LC_CNS11643_7)
+ {
+ *p++ = SS2;
+ *p++ = mic[1] - LC_CNS11643_3 + 0xa3;
+ *p++ = mic[2];
+ *p++ = mic[3];
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_EUC_TW,
+ (const char *) mic, len);
+ }
+ mic += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return mic - start;
+}
+
+/*
+ * Big5 ---> MIC
+ */
+static int
+big52mic(const unsigned char *big5, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = big5;
+ unsigned short c1;
+ unsigned short big5buf,
+ cnsBuf;
+ unsigned char lc;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *big5;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_BIG5,
+ (const char *) big5, len);
+ }
+ *p++ = c1;
+ big5++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_BIG5, (const char *) big5, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_BIG5,
+ (const char *) big5, len);
+ }
+ big5buf = (c1 << 8) | big5[1];
+ cnsBuf = BIG5toCNS(big5buf, &lc);
+ if (lc != 0)
+ {
+ /* Planes 3 and 4 are MULE private charsets */
+ if (lc == LC_CNS11643_3 || lc == LC_CNS11643_4)
+ *p++ = LCPRV2_B;
+ *p++ = lc; /* Plane No. */
+ *p++ = (cnsBuf >> 8) & 0x00ff;
+ *p++ = cnsBuf & 0x00ff;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_BIG5, PG_MULE_INTERNAL,
+ (const char *) big5, len);
+ }
+ big5 += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return big5 - start;
+}
+
+/*
+ * MIC ---> Big5
+ */
+static int
+mic2big5(const unsigned char *mic, unsigned char *p, int len, bool noError)
+{
+ const unsigned char *start = mic;
+ unsigned short c1;
+ unsigned short big5buf,
+ cnsBuf;
+ int l;
+
+ while (len > 0)
+ {
+ c1 = *mic;
+ if (!IS_HIGHBIT_SET(c1))
+ {
+ /* ASCII */
+ if (c1 == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ *p++ = c1;
+ mic++;
+ len--;
+ continue;
+ }
+ l = pg_encoding_verifymbchar(PG_MULE_INTERNAL, (const char *) mic, len);
+ if (l < 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_MULE_INTERNAL,
+ (const char *) mic, len);
+ }
+ if (c1 == LC_CNS11643_1 || c1 == LC_CNS11643_2 || c1 == LCPRV2_B)
+ {
+ if (c1 == LCPRV2_B)
+ {
+ c1 = mic[1]; /* get plane no. */
+ cnsBuf = (mic[2] << 8) | mic[3];
+ }
+ else
+ {
+ cnsBuf = (mic[1] << 8) | mic[2];
+ }
+ big5buf = CNStoBIG5(cnsBuf, c1);
+ if (big5buf == 0)
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_BIG5,
+ (const char *) mic, len);
+ }
+ *p++ = (big5buf >> 8) & 0x00ff;
+ *p++ = big5buf & 0x00ff;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_MULE_INTERNAL, PG_BIG5,
+ (const char *) mic, len);
+ }
+ mic += l;
+ len -= l;
+ }
+ *p = '\0';
+
+ return mic - start;
+}
diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile
new file mode 100644
index 0000000..5e48dae
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/latin2_and_win1250/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/latin2_and_win1250
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = latin2_and_win1250
+PGFILEDESC = "latin2 <-> win1250 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c
new file mode 100644
index 0000000..5a7b776
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c
@@ -0,0 +1,180 @@
+/*-------------------------------------------------------------------------
+ *
+ * LATIN2 and WIN1250
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(latin2_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_latin2);
+PG_FUNCTION_INFO_V1(win1250_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_win1250);
+PG_FUNCTION_INFO_V1(latin2_to_win1250);
+PG_FUNCTION_INFO_V1(win1250_to_latin2);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+/* WIN1250 to ISO-8859-2 */
+static const unsigned char win1250_2_iso88592[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0xA9, 0x8B, 0xA6, 0xAB, 0xAE, 0xAC,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0xB9, 0x9B, 0xB6, 0xBB, 0xBE, 0xBC,
+ 0xA0, 0xB7, 0xA2, 0xA3, 0xA4, 0xA1, 0x00, 0xA7,
+ 0xA8, 0x00, 0xAA, 0x00, 0x00, 0xAD, 0x00, 0xAF,
+ 0xB0, 0x00, 0xB2, 0xB3, 0xB4, 0x00, 0x00, 0x00,
+ 0xB8, 0xB1, 0xBA, 0x00, 0xA5, 0xBD, 0xB5, 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
+};
+
+/* ISO-8859-2 to WIN1250 */
+static const unsigned char iso88592_2_win1250[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x00,
+ 0xA0, 0xA5, 0xA2, 0xA3, 0xA4, 0xBC, 0x8C, 0xA7,
+ 0xA8, 0x8A, 0xAA, 0x8D, 0x8F, 0xAD, 0x8E, 0xAF,
+ 0xB0, 0xB9, 0xB2, 0xB3, 0xB4, 0xBE, 0x9C, 0xA1,
+ 0xB8, 0x9A, 0xBA, 0x9D, 0x9F, 0xBD, 0x9E, 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
+};
+
+
+Datum
+latin2_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN2, PG_MULE_INTERNAL);
+
+ converted = latin2mic(src, dest, len, LC_ISO8859_2, PG_LATIN2, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_latin2(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN2);
+
+ converted = mic2latin(src, dest, len, LC_ISO8859_2, PG_LATIN2, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1250_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_MULE_INTERNAL);
+
+ converted = latin2mic_with_table(src, dest, len, LC_ISO8859_2, PG_WIN1250,
+ win1250_2_iso88592, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_win1250(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1250);
+
+ converted = mic2latin_with_table(src, dest, len, LC_ISO8859_2, PG_WIN1250,
+ iso88592_2_win1250, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+latin2_to_win1250(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN2, PG_WIN1250);
+
+ converted = local2local(src, dest, len, PG_LATIN2, PG_WIN1250,
+ iso88592_2_win1250, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+win1250_to_latin2(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1250, PG_LATIN2);
+
+ converted = local2local(src, dest, len, PG_WIN1250, PG_LATIN2,
+ win1250_2_iso88592, noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile b/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile
new file mode 100644
index 0000000..c404738
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/latin_and_mic/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/latin_and_mic
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = latin_and_mic
+PGFILEDESC = "latin <-> mic text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c
new file mode 100644
index 0000000..8c10056
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c
@@ -0,0 +1,136 @@
+/*-------------------------------------------------------------------------
+ *
+ * LATINn and MULE_INTERNAL
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(latin1_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_latin1);
+PG_FUNCTION_INFO_V1(latin3_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_latin3);
+PG_FUNCTION_INFO_V1(latin4_to_mic);
+PG_FUNCTION_INFO_V1(mic_to_latin4);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+
+Datum
+latin1_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_MULE_INTERNAL);
+
+ converted = latin2mic(src, dest, len, LC_ISO8859_1, PG_LATIN1, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_latin1(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN1);
+
+ converted = mic2latin(src, dest, len, LC_ISO8859_1, PG_LATIN1, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+latin3_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN3, PG_MULE_INTERNAL);
+
+ converted = latin2mic(src, dest, len, LC_ISO8859_3, PG_LATIN3, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_latin3(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN3);
+
+ converted = mic2latin(src, dest, len, LC_ISO8859_3, PG_LATIN3, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+latin4_to_mic(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN4, PG_MULE_INTERNAL);
+
+ converted = latin2mic(src, dest, len, LC_ISO8859_4, PG_LATIN4, noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+mic_to_latin4(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN4);
+
+ converted = mic2latin(src, dest, len, LC_ISO8859_4, PG_LATIN4, noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/proc.mk b/src/backend/utils/mb/conversion_procs/proc.mk
new file mode 100644
index 0000000..e0a3b74
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/proc.mk
@@ -0,0 +1,17 @@
+SRCS += $(NAME).c
+OBJS += $(NAME).o $(WIN32RES)
+
+rpath =
+
+all: all-shared-lib
+
+include $(top_srcdir)/src/Makefile.shlib
+
+install: all installdirs install-lib
+
+installdirs: installdirs-lib
+
+uninstall: uninstall-lib
+
+clean distclean maintainer-clean: clean-lib
+ rm -f $(OBJS)
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_big5/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_big5/Makefile
new file mode 100644
index 0000000..2c274f3
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_big5/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_big5/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_big5
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_big5
+PGFILEDESC = "utf8 <-> big5 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c
new file mode 100644
index 0000000..1e64d0a
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * BIG5 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/big5_to_utf8.map"
+#include "../../Unicode/utf8_to_big5.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(big5_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_big5);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+big5_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &big5_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_BIG5,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_big5(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_BIG5);
+
+ converted = UtfToLocal(src, len, dest,
+ &big5_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_BIG5,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile
new file mode 100644
index 0000000..725281e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_cyrillic
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_cyrillic
+PGFILEDESC = "utf8 <-> cyrillic text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c
new file mode 100644
index 0000000..19cf464
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c
@@ -0,0 +1,126 @@
+/*-------------------------------------------------------------------------
+ *
+ * UTF8 and Cyrillic
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_koi8r.map"
+#include "../../Unicode/koi8r_to_utf8.map"
+#include "../../Unicode/utf8_to_koi8u.map"
+#include "../../Unicode/koi8u_to_utf8.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(utf8_to_koi8r);
+PG_FUNCTION_INFO_V1(koi8r_to_utf8);
+
+PG_FUNCTION_INFO_V1(utf8_to_koi8u);
+PG_FUNCTION_INFO_V1(koi8u_to_utf8);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+Datum
+utf8_to_koi8r(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_KOI8R);
+
+ converted = UtfToLocal(src, len, dest,
+ &koi8r_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_KOI8R,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+koi8r_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &koi8r_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_KOI8R,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_koi8u(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_KOI8U);
+
+ converted = UtfToLocal(src, len, dest,
+ &koi8u_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_KOI8U,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+koi8u_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8U, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &koi8u_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_KOI8U,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/Makefile
new file mode 100644
index 0000000..c6c537c
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_euc2004/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_euc2004
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_euc2004
+PGFILEDESC = "utf8 <-> euc2004 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c
new file mode 100644
index 0000000..5fbcf37
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_JIS_2004 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/euc_jis_2004_to_utf8.map"
+#include "../../Unicode/utf8_to_euc_jis_2004.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_jis_2004_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_euc_jis_2004);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+euc_jis_2004_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JIS_2004, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &euc_jis_2004_to_unicode_tree,
+ LUmapEUC_JIS_2004_combined, lengthof(LUmapEUC_JIS_2004_combined),
+ NULL,
+ PG_EUC_JIS_2004,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_euc_jis_2004(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_JIS_2004);
+
+ converted = UtfToLocal(src, len, dest,
+ &euc_jis_2004_from_unicode_tree,
+ ULmapEUC_JIS_2004_combined, lengthof(ULmapEUC_JIS_2004_combined),
+ NULL,
+ PG_EUC_JIS_2004,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/Makefile
new file mode 100644
index 0000000..9d0e157
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_euc_cn
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_euc_cn
+PGFILEDESC = "utf8 <-> euc_cn text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c
new file mode 100644
index 0000000..39ddd37
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_CN <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/euc_cn_to_utf8.map"
+#include "../../Unicode/utf8_to_euc_cn.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_cn_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_euc_cn);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+euc_cn_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_CN, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &euc_cn_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_CN,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_euc_cn(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_CN);
+
+ converted = UtfToLocal(src, len, dest,
+ &euc_cn_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_CN,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/Makefile
new file mode 100644
index 0000000..c5f5578
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_euc_jp
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_euc_jp
+PGFILEDESC = "utf8 <-> euc_jp text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c
new file mode 100644
index 0000000..7e64ab0
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_JP <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/euc_jp_to_utf8.map"
+#include "../../Unicode/utf8_to_euc_jp.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_jp_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_euc_jp);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+euc_jp_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JP, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &euc_jp_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_JP,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_euc_jp(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_JP);
+
+ converted = UtfToLocal(src, len, dest,
+ &euc_jp_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_JP,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/Makefile
new file mode 100644
index 0000000..a7eff9e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_euc_kr
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_euc_kr
+PGFILEDESC = "utf8 <-> euc_kr text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c
new file mode 100644
index 0000000..fb571a9
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_KR <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/euc_kr_to_utf8.map"
+#include "../../Unicode/utf8_to_euc_kr.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_kr_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_euc_kr);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+euc_kr_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_KR, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &euc_kr_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_KR,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_euc_kr(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_KR);
+
+ converted = UtfToLocal(src, len, dest,
+ &euc_kr_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_KR,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/Makefile
new file mode 100644
index 0000000..59f42dc
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_euc_tw
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_euc_tw
+PGFILEDESC = "utf8 <-> euc_tw text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c
new file mode 100644
index 0000000..eaea661
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * EUC_TW <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/euc_tw_to_utf8.map"
+#include "../../Unicode/utf8_to_euc_tw.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(euc_tw_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_euc_tw);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+euc_tw_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_TW, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &euc_tw_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_TW,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_euc_tw(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_EUC_TW);
+
+ converted = UtfToLocal(src, len, dest,
+ &euc_tw_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_EUC_TW,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/Makefile
new file mode 100644
index 0000000..17bc18c
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_gb18030/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_gb18030
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_gb18030
+PGFILEDESC = "utf8 <-> gb18030 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c
new file mode 100644
index 0000000..32d8d5e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c
@@ -0,0 +1,233 @@
+/*-------------------------------------------------------------------------
+ *
+ * GB18030 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/gb18030_to_utf8.map"
+#include "../../Unicode/utf8_to_gb18030.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(gb18030_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_gb18030);
+
+/*
+ * Convert 4-byte GB18030 characters to and from a linear code space
+ *
+ * The first and third bytes can range from 0x81 to 0xfe (126 values),
+ * while the second and fourth bytes can range from 0x30 to 0x39 (10 values).
+ */
+static inline uint32
+gb_linear(uint32 gb)
+{
+ uint32 b0 = (gb & 0xff000000) >> 24;
+ uint32 b1 = (gb & 0x00ff0000) >> 16;
+ uint32 b2 = (gb & 0x0000ff00) >> 8;
+ uint32 b3 = (gb & 0x000000ff);
+
+ return b0 * 12600 + b1 * 1260 + b2 * 10 + b3 -
+ (0x81 * 12600 + 0x30 * 1260 + 0x81 * 10 + 0x30);
+}
+
+static inline uint32
+gb_unlinear(uint32 lin)
+{
+ uint32 r0 = 0x81 + lin / 12600;
+ uint32 r1 = 0x30 + (lin / 1260) % 10;
+ uint32 r2 = 0x81 + (lin / 10) % 126;
+ uint32 r3 = 0x30 + lin % 10;
+
+ return (r0 << 24) | (r1 << 16) | (r2 << 8) | r3;
+}
+
+/*
+ * Convert word-formatted UTF8 to and from Unicode code points
+ *
+ * Probably this should be somewhere else ...
+ */
+static inline uint32
+unicode_to_utf8word(uint32 c)
+{
+ uint32 word;
+
+ if (c <= 0x7F)
+ {
+ word = c;
+ }
+ else if (c <= 0x7FF)
+ {
+ word = (0xC0 | ((c >> 6) & 0x1F)) << 8;
+ word |= 0x80 | (c & 0x3F);
+ }
+ else if (c <= 0xFFFF)
+ {
+ word = (0xE0 | ((c >> 12) & 0x0F)) << 16;
+ word |= (0x80 | ((c >> 6) & 0x3F)) << 8;
+ word |= 0x80 | (c & 0x3F);
+ }
+ else
+ {
+ word = (0xF0 | ((c >> 18) & 0x07)) << 24;
+ word |= (0x80 | ((c >> 12) & 0x3F)) << 16;
+ word |= (0x80 | ((c >> 6) & 0x3F)) << 8;
+ word |= 0x80 | (c & 0x3F);
+ }
+
+ return word;
+}
+
+static inline uint32
+utf8word_to_unicode(uint32 c)
+{
+ uint32 ucs;
+
+ if (c <= 0x7F)
+ {
+ ucs = c;
+ }
+ else if (c <= 0xFFFF)
+ {
+ ucs = ((c >> 8) & 0x1F) << 6;
+ ucs |= c & 0x3F;
+ }
+ else if (c <= 0xFFFFFF)
+ {
+ ucs = ((c >> 16) & 0x0F) << 12;
+ ucs |= ((c >> 8) & 0x3F) << 6;
+ ucs |= c & 0x3F;
+ }
+ else
+ {
+ ucs = ((c >> 24) & 0x07) << 18;
+ ucs |= ((c >> 16) & 0x3F) << 12;
+ ucs |= ((c >> 8) & 0x3F) << 6;
+ ucs |= c & 0x3F;
+ }
+
+ return ucs;
+}
+
+/*
+ * Perform mapping of GB18030 ranges to UTF8
+ *
+ * The ranges we need to convert are specified in gb-18030-2000.xml.
+ * All are ranges of 4-byte GB18030 codes.
+ */
+static uint32
+conv_18030_to_utf8(uint32 code)
+{
+#define conv18030(minunicode, mincode, maxcode) \
+ if (code >= mincode && code <= maxcode) \
+ return unicode_to_utf8word(gb_linear(code) - gb_linear(mincode) + minunicode)
+
+ conv18030(0x0452, 0x8130D330, 0x8136A531);
+ conv18030(0x2643, 0x8137A839, 0x8138FD38);
+ conv18030(0x361B, 0x8230A633, 0x8230F237);
+ conv18030(0x3CE1, 0x8231D438, 0x8232AF32);
+ conv18030(0x4160, 0x8232C937, 0x8232F837);
+ conv18030(0x44D7, 0x8233A339, 0x8233C931);
+ conv18030(0x478E, 0x8233E838, 0x82349638);
+ conv18030(0x49B8, 0x8234A131, 0x8234E733);
+ conv18030(0x9FA6, 0x82358F33, 0x8336C738);
+ conv18030(0xE865, 0x8336D030, 0x84308534);
+ conv18030(0xFA2A, 0x84309C38, 0x84318537);
+ conv18030(0xFFE6, 0x8431A234, 0x8431A439);
+ conv18030(0x10000, 0x90308130, 0xE3329A35);
+ /* No mapping exists */
+ return 0;
+}
+
+/*
+ * Perform mapping of UTF8 ranges to GB18030
+ */
+static uint32
+conv_utf8_to_18030(uint32 code)
+{
+ uint32 ucs = utf8word_to_unicode(code);
+
+#define convutf8(minunicode, maxunicode, mincode) \
+ if (ucs >= minunicode && ucs <= maxunicode) \
+ return gb_unlinear(ucs - minunicode + gb_linear(mincode))
+
+ convutf8(0x0452, 0x200F, 0x8130D330);
+ convutf8(0x2643, 0x2E80, 0x8137A839);
+ convutf8(0x361B, 0x3917, 0x8230A633);
+ convutf8(0x3CE1, 0x4055, 0x8231D438);
+ convutf8(0x4160, 0x4336, 0x8232C937);
+ convutf8(0x44D7, 0x464B, 0x8233A339);
+ convutf8(0x478E, 0x4946, 0x8233E838);
+ convutf8(0x49B8, 0x4C76, 0x8234A131);
+ convutf8(0x9FA6, 0xD7FF, 0x82358F33);
+ convutf8(0xE865, 0xF92B, 0x8336D030);
+ convutf8(0xFA2A, 0xFE2F, 0x84309C38);
+ convutf8(0xFFE6, 0xFFFF, 0x8431A234);
+ convutf8(0x10000, 0x10FFFF, 0x90308130);
+ /* No mapping exists */
+ return 0;
+}
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+gb18030_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_GB18030, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &gb18030_to_unicode_tree,
+ NULL, 0,
+ conv_18030_to_utf8,
+ PG_GB18030,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_gb18030(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_GB18030);
+
+ converted = UtfToLocal(src, len, dest,
+ &gb18030_from_unicode_tree,
+ NULL, 0,
+ conv_utf8_to_18030,
+ PG_GB18030,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/Makefile
new file mode 100644
index 0000000..eb20638
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_gbk/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_gbk
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_gbk
+PGFILEDESC = "utf8 <-> gbk text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c
new file mode 100644
index 0000000..2f7a92b
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * GBK <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/gbk_to_utf8.map"
+#include "../../Unicode/utf8_to_gbk.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(gbk_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_gbk);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+gbk_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_GBK, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &gbk_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_GBK,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_gbk(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_GBK);
+
+ converted = UtfToLocal(src, len, dest,
+ &gbk_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_GBK,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/Makefile
new file mode 100644
index 0000000..6fd0dd2
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_iso8859/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_iso8859
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_iso8859
+PGFILEDESC = "utf8 <-> iso8859 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c
new file mode 100644
index 0000000..c872fda
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c
@@ -0,0 +1,169 @@
+/*-------------------------------------------------------------------------
+ *
+ * ISO 8859 2-16 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/iso8859_10_to_utf8.map"
+#include "../../Unicode/iso8859_13_to_utf8.map"
+#include "../../Unicode/iso8859_14_to_utf8.map"
+#include "../../Unicode/iso8859_15_to_utf8.map"
+#include "../../Unicode/iso8859_2_to_utf8.map"
+#include "../../Unicode/iso8859_3_to_utf8.map"
+#include "../../Unicode/iso8859_4_to_utf8.map"
+#include "../../Unicode/iso8859_5_to_utf8.map"
+#include "../../Unicode/iso8859_6_to_utf8.map"
+#include "../../Unicode/iso8859_7_to_utf8.map"
+#include "../../Unicode/iso8859_8_to_utf8.map"
+#include "../../Unicode/iso8859_9_to_utf8.map"
+#include "../../Unicode/utf8_to_iso8859_10.map"
+#include "../../Unicode/utf8_to_iso8859_13.map"
+#include "../../Unicode/utf8_to_iso8859_14.map"
+#include "../../Unicode/utf8_to_iso8859_15.map"
+#include "../../Unicode/utf8_to_iso8859_16.map"
+#include "../../Unicode/utf8_to_iso8859_2.map"
+#include "../../Unicode/utf8_to_iso8859_3.map"
+#include "../../Unicode/utf8_to_iso8859_4.map"
+#include "../../Unicode/utf8_to_iso8859_5.map"
+#include "../../Unicode/utf8_to_iso8859_6.map"
+#include "../../Unicode/utf8_to_iso8859_7.map"
+#include "../../Unicode/utf8_to_iso8859_8.map"
+#include "../../Unicode/utf8_to_iso8859_9.map"
+#include "../../Unicode/iso8859_16_to_utf8.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(iso8859_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_iso8859);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+typedef struct
+{
+ pg_enc encoding;
+ const pg_mb_radix_tree *map1; /* to UTF8 map name */
+ const pg_mb_radix_tree *map2; /* from UTF8 map name */
+} pg_conv_map;
+
+static const pg_conv_map maps[] = {
+ {PG_LATIN2, &iso8859_2_to_unicode_tree,
+ &iso8859_2_from_unicode_tree}, /* ISO-8859-2 Latin 2 */
+ {PG_LATIN3, &iso8859_3_to_unicode_tree,
+ &iso8859_3_from_unicode_tree}, /* ISO-8859-3 Latin 3 */
+ {PG_LATIN4, &iso8859_4_to_unicode_tree,
+ &iso8859_4_from_unicode_tree}, /* ISO-8859-4 Latin 4 */
+ {PG_LATIN5, &iso8859_9_to_unicode_tree,
+ &iso8859_9_from_unicode_tree}, /* ISO-8859-9 Latin 5 */
+ {PG_LATIN6, &iso8859_10_to_unicode_tree,
+ &iso8859_10_from_unicode_tree}, /* ISO-8859-10 Latin 6 */
+ {PG_LATIN7, &iso8859_13_to_unicode_tree,
+ &iso8859_13_from_unicode_tree}, /* ISO-8859-13 Latin 7 */
+ {PG_LATIN8, &iso8859_14_to_unicode_tree,
+ &iso8859_14_from_unicode_tree}, /* ISO-8859-14 Latin 8 */
+ {PG_LATIN9, &iso8859_15_to_unicode_tree,
+ &iso8859_15_from_unicode_tree}, /* ISO-8859-15 Latin 9 */
+ {PG_LATIN10, &iso8859_16_to_unicode_tree,
+ &iso8859_16_from_unicode_tree}, /* ISO-8859-16 Latin 10 */
+ {PG_ISO_8859_5, &iso8859_5_to_unicode_tree,
+ &iso8859_5_from_unicode_tree}, /* ISO-8859-5 */
+ {PG_ISO_8859_6, &iso8859_6_to_unicode_tree,
+ &iso8859_6_from_unicode_tree}, /* ISO-8859-6 */
+ {PG_ISO_8859_7, &iso8859_7_to_unicode_tree,
+ &iso8859_7_from_unicode_tree}, /* ISO-8859-7 */
+ {PG_ISO_8859_8, &iso8859_8_to_unicode_tree,
+ &iso8859_8_from_unicode_tree}, /* ISO-8859-8 */
+};
+
+Datum
+iso8859_to_utf8(PG_FUNCTION_ARGS)
+{
+ int encoding = PG_GETARG_INT32(0);
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int i;
+
+ CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8);
+
+ for (i = 0; i < lengthof(maps); i++)
+ {
+ if (encoding == maps[i].encoding)
+ {
+ int converted;
+
+ converted = LocalToUtf(src, len, dest,
+ maps[i].map1,
+ NULL, 0,
+ NULL,
+ encoding,
+ noError);
+ PG_RETURN_INT32(converted);
+ }
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("unexpected encoding ID %d for ISO 8859 character sets",
+ encoding)));
+
+ PG_RETURN_INT32(0);
+}
+
+Datum
+utf8_to_iso8859(PG_FUNCTION_ARGS)
+{
+ int encoding = PG_GETARG_INT32(1);
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int i;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1);
+
+ for (i = 0; i < lengthof(maps); i++)
+ {
+ if (encoding == maps[i].encoding)
+ {
+ int converted;
+
+ converted = UtfToLocal(src, len, dest,
+ maps[i].map2,
+ NULL, 0,
+ NULL,
+ encoding,
+ noError);
+ PG_RETURN_INT32(converted);
+ }
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("unexpected encoding ID %d for ISO 8859 character sets",
+ encoding)));
+
+ PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/Makefile
new file mode 100644
index 0000000..0298284
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_iso8859_1
+PGFILEDESC = "utf8 <-> iso8859_1 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c
new file mode 100644
index 0000000..a44cac0
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c
@@ -0,0 +1,139 @@
+/*-------------------------------------------------------------------------
+ *
+ * ISO8859_1 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(iso8859_1_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_iso8859_1);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+Datum
+iso8859_1_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ unsigned char *start = src;
+ unsigned short c;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_UTF8);
+
+ while (len > 0)
+ {
+ c = *src;
+ if (c == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_LATIN1, (const char *) src, len);
+ }
+ if (!IS_HIGHBIT_SET(c))
+ *dest++ = c;
+ else
+ {
+ *dest++ = (c >> 6) | 0xc0;
+ *dest++ = (c & 0x003f) | HIGHBIT;
+ }
+ src++;
+ len--;
+ }
+ *dest = '\0';
+
+ PG_RETURN_INT32(src - start);
+}
+
+Datum
+utf8_to_iso8859_1(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ unsigned char *start = src;
+ unsigned short c,
+ c1;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_LATIN1);
+
+ while (len > 0)
+ {
+ c = *src;
+ if (c == 0)
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_UTF8, (const char *) src, len);
+ }
+ /* fast path for ASCII-subset characters */
+ if (!IS_HIGHBIT_SET(c))
+ {
+ *dest++ = c;
+ src++;
+ len--;
+ }
+ else
+ {
+ int l = pg_utf_mblen(src);
+
+ if (l > len || !pg_utf8_islegal(src, l))
+ {
+ if (noError)
+ break;
+ report_invalid_encoding(PG_UTF8, (const char *) src, len);
+ }
+ if (l != 2)
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_UTF8, PG_LATIN1,
+ (const char *) src, len);
+ }
+ c1 = src[1] & 0x3f;
+ c = ((c & 0x1f) << 6) | c1;
+ if (c >= 0x80 && c <= 0xff)
+ {
+ *dest++ = (unsigned char) c;
+ src += 2;
+ len -= 2;
+ }
+ else
+ {
+ if (noError)
+ break;
+ report_untranslatable_char(PG_UTF8, PG_LATIN1,
+ (const char *) src, len);
+ }
+ }
+ }
+ *dest = '\0';
+
+ PG_RETURN_INT32(src - start);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_johab/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_johab/Makefile
new file mode 100644
index 0000000..e48ef3e
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_johab/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_johab/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_johab
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_johab
+PGFILEDESC = "utf8 <-> johab text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c
new file mode 100644
index 0000000..089cdfc
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * JOHAB <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/johab_to_utf8.map"
+#include "../../Unicode/utf8_to_johab.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(johab_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_johab);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+johab_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_JOHAB, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &johab_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_JOHAB,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_johab(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_JOHAB);
+
+ converted = UtfToLocal(src, len, dest,
+ &johab_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_JOHAB,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/Makefile
new file mode 100644
index 0000000..448c5d4
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_sjis/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_sjis
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_sjis
+PGFILEDESC = "utf8 <-> sjis text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c
new file mode 100644
index 0000000..533eeed
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * SJIS <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/sjis_to_utf8.map"
+#include "../../Unicode/utf8_to_sjis.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(sjis_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_sjis);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+sjis_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_SJIS, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &sjis_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_SJIS,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_sjis(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_SJIS);
+
+ converted = UtfToLocal(src, len, dest,
+ &sjis_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_SJIS,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/Makefile
new file mode 100644
index 0000000..f7072a4
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_sjis2004
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_sjis2004
+PGFILEDESC = "utf8 <-> sjis2004 text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c
new file mode 100644
index 0000000..31e6ace
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * SHIFT_JIS_2004 <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/shift_jis_2004_to_utf8.map"
+#include "../../Unicode/utf8_to_shift_jis_2004.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(shift_jis_2004_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_shift_jis_2004);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+shift_jis_2004_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_SHIFT_JIS_2004, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &shift_jis_2004_to_unicode_tree,
+ LUmapSHIFT_JIS_2004_combined, lengthof(LUmapSHIFT_JIS_2004_combined),
+ NULL,
+ PG_SHIFT_JIS_2004,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_shift_jis_2004(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_SHIFT_JIS_2004);
+
+ converted = UtfToLocal(src, len, dest,
+ &shift_jis_2004_from_unicode_tree,
+ ULmapSHIFT_JIS_2004_combined, lengthof(ULmapSHIFT_JIS_2004_combined),
+ NULL,
+ PG_SHIFT_JIS_2004,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/Makefile
new file mode 100644
index 0000000..cc6e0a9
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_uhc/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_uhc
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_uhc
+PGFILEDESC = "utf8 <-> uhc text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c
new file mode 100644
index 0000000..1a5a2ec
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c
@@ -0,0 +1,78 @@
+/*-------------------------------------------------------------------------
+ *
+ * UHC <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/uhc_to_utf8.map"
+#include "../../Unicode/utf8_to_uhc.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(uhc_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_uhc);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+Datum
+uhc_to_utf8(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UHC, PG_UTF8);
+
+ converted = LocalToUtf(src, len, dest,
+ &uhc_to_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_UHC,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
+
+Datum
+utf8_to_uhc(PG_FUNCTION_ARGS)
+{
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int converted;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_UHC);
+
+ converted = UtfToLocal(src, len, dest,
+ &uhc_from_unicode_tree,
+ NULL, 0,
+ NULL,
+ PG_UHC,
+ noError);
+
+ PG_RETURN_INT32(converted);
+}
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win/Makefile b/src/backend/utils/mb/conversion_procs/utf8_and_win/Makefile
new file mode 100644
index 0000000..d8b18fb
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win/Makefile
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------
+#
+# src/backend/utils/mb/conversion_procs/utf8_and_win/Makefile
+#
+#-------------------------------------------------------------------------
+subdir = src/backend/utils/mb/conversion_procs/utf8_and_win
+top_builddir = ../../../../../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = utf8_and_win
+PGFILEDESC = "utf8 <-> win text conversions"
+
+include $(srcdir)/../proc.mk
diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c b/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c
new file mode 100644
index 0000000..ce4568d
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c
@@ -0,0 +1,150 @@
+/*-------------------------------------------------------------------------
+ *
+ * WIN <--> UTF8
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "fmgr.h"
+#include "mb/pg_wchar.h"
+#include "../../Unicode/utf8_to_win1250.map"
+#include "../../Unicode/utf8_to_win1251.map"
+#include "../../Unicode/utf8_to_win1252.map"
+#include "../../Unicode/utf8_to_win1253.map"
+#include "../../Unicode/utf8_to_win1254.map"
+#include "../../Unicode/utf8_to_win1255.map"
+#include "../../Unicode/utf8_to_win1256.map"
+#include "../../Unicode/utf8_to_win1257.map"
+#include "../../Unicode/utf8_to_win1258.map"
+#include "../../Unicode/utf8_to_win866.map"
+#include "../../Unicode/utf8_to_win874.map"
+#include "../../Unicode/win1250_to_utf8.map"
+#include "../../Unicode/win1251_to_utf8.map"
+#include "../../Unicode/win1252_to_utf8.map"
+#include "../../Unicode/win1253_to_utf8.map"
+#include "../../Unicode/win1254_to_utf8.map"
+#include "../../Unicode/win1255_to_utf8.map"
+#include "../../Unicode/win1256_to_utf8.map"
+#include "../../Unicode/win1257_to_utf8.map"
+#include "../../Unicode/win866_to_utf8.map"
+#include "../../Unicode/win874_to_utf8.map"
+#include "../../Unicode/win1258_to_utf8.map"
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(win_to_utf8);
+PG_FUNCTION_INFO_V1(utf8_to_win);
+
+/* ----------
+ * conv_proc(
+ * INTEGER, -- source encoding id
+ * INTEGER, -- destination encoding id
+ * CSTRING, -- source string (null terminated C string)
+ * CSTRING, -- destination string (null terminated C string)
+ * INTEGER, -- source string length
+ * BOOL -- if true, don't throw an error if conversion fails
+ * ) returns INTEGER;
+ *
+ * Returns the number of bytes successfully converted.
+ * ----------
+ */
+
+typedef struct
+{
+ pg_enc encoding;
+ const pg_mb_radix_tree *map1; /* to UTF8 map name */
+ const pg_mb_radix_tree *map2; /* from UTF8 map name */
+} pg_conv_map;
+
+static const pg_conv_map maps[] = {
+ {PG_WIN866, &win866_to_unicode_tree, &win866_from_unicode_tree},
+ {PG_WIN874, &win874_to_unicode_tree, &win874_from_unicode_tree},
+ {PG_WIN1250, &win1250_to_unicode_tree, &win1250_from_unicode_tree},
+ {PG_WIN1251, &win1251_to_unicode_tree, &win1251_from_unicode_tree},
+ {PG_WIN1252, &win1252_to_unicode_tree, &win1252_from_unicode_tree},
+ {PG_WIN1253, &win1253_to_unicode_tree, &win1253_from_unicode_tree},
+ {PG_WIN1254, &win1254_to_unicode_tree, &win1254_from_unicode_tree},
+ {PG_WIN1255, &win1255_to_unicode_tree, &win1255_from_unicode_tree},
+ {PG_WIN1256, &win1256_to_unicode_tree, &win1256_from_unicode_tree},
+ {PG_WIN1257, &win1257_to_unicode_tree, &win1257_from_unicode_tree},
+ {PG_WIN1258, &win1258_to_unicode_tree, &win1258_from_unicode_tree},
+};
+
+Datum
+win_to_utf8(PG_FUNCTION_ARGS)
+{
+ int encoding = PG_GETARG_INT32(0);
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int i;
+
+ CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8);
+
+ for (i = 0; i < lengthof(maps); i++)
+ {
+ if (encoding == maps[i].encoding)
+ {
+ int converted;
+
+ converted = LocalToUtf(src, len, dest,
+ maps[i].map1,
+ NULL, 0,
+ NULL,
+ encoding,
+ noError);
+ PG_RETURN_INT32(converted);
+ }
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("unexpected encoding ID %d for WIN character sets",
+ encoding)));
+
+ PG_RETURN_INT32(0);
+}
+
+Datum
+utf8_to_win(PG_FUNCTION_ARGS)
+{
+ int encoding = PG_GETARG_INT32(1);
+ unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
+ unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
+ int len = PG_GETARG_INT32(4);
+ bool noError = PG_GETARG_BOOL(5);
+ int i;
+
+ CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1);
+
+ for (i = 0; i < lengthof(maps); i++)
+ {
+ if (encoding == maps[i].encoding)
+ {
+ int converted;
+
+ converted = UtfToLocal(src, len, dest,
+ maps[i].map2,
+ NULL, 0,
+ NULL,
+ encoding,
+ noError);
+ PG_RETURN_INT32(converted);
+ }
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("unexpected encoding ID %d for WIN character sets",
+ encoding)));
+
+ PG_RETURN_INT32(0);
+}
diff --git a/src/backend/utils/mb/iso.c b/src/backend/utils/mb/iso.c
new file mode 100644
index 0000000..d5dae56
--- /dev/null
+++ b/src/backend/utils/mb/iso.c
@@ -0,0 +1,74 @@
+/*
+ * make KOI8->ISO8859-5 and ISO8859-5->KOI8 translation table
+ * from koi-iso.tab.
+ *
+ * Tatsuo Ishii
+ *
+ * src/backend/utils/mb/iso.c
+ */
+
+#include <stdio.h>
+
+
+main()
+{
+ int i;
+ char koitab[128],
+ isotab[128];
+ char buf[4096];
+ int koi,
+ iso;
+
+ for (i = 0; i < 128; i++)
+ koitab[i] = isotab[i] = 0;
+
+ while (fgets(buf, sizeof(buf), stdin) != NULL)
+ {
+ if (*buf == '#')
+ continue;
+ sscanf(buf, "%d %x", &koi, &iso);
+ if (koi < 128 || koi > 255 || iso < 128 || iso > 255)
+ {
+ fprintf(stderr, "invalid value %d\n", koi);
+ exit(1);
+ }
+ koitab[koi - 128] = iso;
+ isotab[iso - 128] = koi;
+ }
+
+ i = 0;
+ printf("static char koi2iso[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", koitab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+
+ i = 0;
+ printf("static char iso2koi[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", isotab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+}
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
new file mode 100644
index 0000000..0543c57
--- /dev/null
+++ b/src/backend/utils/mb/mbutils.c
@@ -0,0 +1,1778 @@
+/*-------------------------------------------------------------------------
+ *
+ * mbutils.c
+ * This file contains functions for encoding conversion.
+ *
+ * The string-conversion functions in this file share some API quirks.
+ * Note the following:
+ *
+ * The functions return a palloc'd, null-terminated string if conversion
+ * is required. However, if no conversion is performed, the given source
+ * string pointer is returned as-is.
+ *
+ * Although the presence of a length argument means that callers can pass
+ * non-null-terminated strings, care is required because the same string
+ * will be passed back if no conversion occurs. Such callers *must* check
+ * whether result == src and handle that case differently.
+ *
+ * If the source and destination encodings are the same, the source string
+ * is returned without any verification; it's assumed to be valid data.
+ * If that might not be the case, the caller is responsible for validating
+ * the string using a separate call to pg_verify_mbstr(). Whenever the
+ * source and destination encodings are different, the functions ensure that
+ * the result is validly encoded according to the destination encoding.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/mbutils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "catalog/namespace.h"
+#include "mb/pg_wchar.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/syscache.h"
+
+/*
+ * We maintain a simple linked list caching the fmgr lookup info for the
+ * currently selected conversion functions, as well as any that have been
+ * selected previously in the current session. (We remember previous
+ * settings because we must be able to restore a previous setting during
+ * transaction rollback, without doing any fresh catalog accesses.)
+ *
+ * Since we'll never release this data, we just keep it in TopMemoryContext.
+ */
+typedef struct ConvProcInfo
+{
+ int s_encoding; /* server and client encoding IDs */
+ int c_encoding;
+ FmgrInfo to_server_info; /* lookup info for conversion procs */
+ FmgrInfo to_client_info;
+} ConvProcInfo;
+
+static List *ConvProcList = NIL; /* List of ConvProcInfo */
+
+/*
+ * These variables point to the currently active conversion functions,
+ * or are NULL when no conversion is needed.
+ */
+static FmgrInfo *ToServerConvProc = NULL;
+static FmgrInfo *ToClientConvProc = NULL;
+
+/*
+ * This variable stores the conversion function to convert from UTF-8
+ * to the server encoding. It's NULL if the server encoding *is* UTF-8,
+ * or if we lack a conversion function for this.
+ */
+static FmgrInfo *Utf8ToServerConvProc = NULL;
+
+/*
+ * These variables track the currently-selected encodings.
+ */
+static const pg_enc2name *ClientEncoding = &pg_enc2name_tbl[PG_SQL_ASCII];
+static const pg_enc2name *DatabaseEncoding = &pg_enc2name_tbl[PG_SQL_ASCII];
+static const pg_enc2name *MessageEncoding = &pg_enc2name_tbl[PG_SQL_ASCII];
+
+/*
+ * During backend startup we can't set client encoding because we (a)
+ * can't look up the conversion functions, and (b) may not know the database
+ * encoding yet either. So SetClientEncoding() just accepts anything and
+ * remembers it for InitializeClientEncoding() to apply later.
+ */
+static bool backend_startup_complete = false;
+static int pending_client_encoding = PG_SQL_ASCII;
+
+
+/* Internal functions */
+static char *perform_default_encoding_conversion(const char *src,
+ int len, bool is_client_to_server);
+static int cliplen(const char *str, int len, int limit);
+
+
+/*
+ * Prepare for a future call to SetClientEncoding. Success should mean
+ * that SetClientEncoding is guaranteed to succeed for this encoding request.
+ *
+ * (But note that success before backend_startup_complete does not guarantee
+ * success after ...)
+ *
+ * Returns 0 if okay, -1 if not (bad encoding or can't support conversion)
+ */
+int
+PrepareClientEncoding(int encoding)
+{
+ int current_server_encoding;
+ ListCell *lc;
+
+ if (!PG_VALID_FE_ENCODING(encoding))
+ return -1;
+
+ /* Can't do anything during startup, per notes above */
+ if (!backend_startup_complete)
+ return 0;
+
+ current_server_encoding = GetDatabaseEncoding();
+
+ /*
+ * Check for cases that require no conversion function.
+ */
+ if (current_server_encoding == encoding ||
+ current_server_encoding == PG_SQL_ASCII ||
+ encoding == PG_SQL_ASCII)
+ return 0;
+
+ if (IsTransactionState())
+ {
+ /*
+ * If we're in a live transaction, it's safe to access the catalogs,
+ * so look up the functions. We repeat the lookup even if the info is
+ * already cached, so that we can react to changes in the contents of
+ * pg_conversion.
+ */
+ Oid to_server_proc,
+ to_client_proc;
+ ConvProcInfo *convinfo;
+ MemoryContext oldcontext;
+
+ to_server_proc = FindDefaultConversionProc(encoding,
+ current_server_encoding);
+ if (!OidIsValid(to_server_proc))
+ return -1;
+ to_client_proc = FindDefaultConversionProc(current_server_encoding,
+ encoding);
+ if (!OidIsValid(to_client_proc))
+ return -1;
+
+ /*
+ * Load the fmgr info into TopMemoryContext (could still fail here)
+ */
+ convinfo = (ConvProcInfo *) MemoryContextAlloc(TopMemoryContext,
+ sizeof(ConvProcInfo));
+ convinfo->s_encoding = current_server_encoding;
+ convinfo->c_encoding = encoding;
+ fmgr_info_cxt(to_server_proc, &convinfo->to_server_info,
+ TopMemoryContext);
+ fmgr_info_cxt(to_client_proc, &convinfo->to_client_info,
+ TopMemoryContext);
+
+ /* Attach new info to head of list */
+ oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+ ConvProcList = lcons(convinfo, ConvProcList);
+ MemoryContextSwitchTo(oldcontext);
+
+ /*
+ * We cannot yet remove any older entry for the same encoding pair,
+ * since it could still be in use. SetClientEncoding will clean up.
+ */
+
+ return 0; /* success */
+ }
+ else
+ {
+ /*
+ * If we're not in a live transaction, the only thing we can do is
+ * restore a previous setting using the cache. This covers all
+ * transaction-rollback cases. The only case it might not work for is
+ * trying to change client_encoding on the fly by editing
+ * postgresql.conf and SIGHUP'ing. Which would probably be a stupid
+ * thing to do anyway.
+ */
+ foreach(lc, ConvProcList)
+ {
+ ConvProcInfo *oldinfo = (ConvProcInfo *) lfirst(lc);
+
+ if (oldinfo->s_encoding == current_server_encoding &&
+ oldinfo->c_encoding == encoding)
+ return 0;
+ }
+
+ return -1; /* it's not cached, so fail */
+ }
+}
+
+/*
+ * Set the active client encoding and set up the conversion-function pointers.
+ * PrepareClientEncoding should have been called previously for this encoding.
+ *
+ * Returns 0 if okay, -1 if not (bad encoding or can't support conversion)
+ */
+int
+SetClientEncoding(int encoding)
+{
+ int current_server_encoding;
+ bool found;
+ ListCell *lc;
+
+ if (!PG_VALID_FE_ENCODING(encoding))
+ return -1;
+
+ /* Can't do anything during startup, per notes above */
+ if (!backend_startup_complete)
+ {
+ pending_client_encoding = encoding;
+ return 0;
+ }
+
+ current_server_encoding = GetDatabaseEncoding();
+
+ /*
+ * Check for cases that require no conversion function.
+ */
+ if (current_server_encoding == encoding ||
+ current_server_encoding == PG_SQL_ASCII ||
+ encoding == PG_SQL_ASCII)
+ {
+ ClientEncoding = &pg_enc2name_tbl[encoding];
+ ToServerConvProc = NULL;
+ ToClientConvProc = NULL;
+ return 0;
+ }
+
+ /*
+ * Search the cache for the entry previously prepared by
+ * PrepareClientEncoding; if there isn't one, we lose. While at it,
+ * release any duplicate entries so that repeated Prepare/Set cycles don't
+ * leak memory.
+ */
+ found = false;
+ foreach(lc, ConvProcList)
+ {
+ ConvProcInfo *convinfo = (ConvProcInfo *) lfirst(lc);
+
+ if (convinfo->s_encoding == current_server_encoding &&
+ convinfo->c_encoding == encoding)
+ {
+ if (!found)
+ {
+ /* Found newest entry, so set up */
+ ClientEncoding = &pg_enc2name_tbl[encoding];
+ ToServerConvProc = &convinfo->to_server_info;
+ ToClientConvProc = &convinfo->to_client_info;
+ found = true;
+ }
+ else
+ {
+ /* Duplicate entry, release it */
+ ConvProcList = foreach_delete_current(ConvProcList, lc);
+ pfree(convinfo);
+ }
+ }
+ }
+
+ if (found)
+ return 0; /* success */
+ else
+ return -1; /* it's not cached, so fail */
+}
+
+/*
+ * Initialize client encoding conversions.
+ * Called from InitPostgres() once during backend startup.
+ */
+void
+InitializeClientEncoding(void)
+{
+ int current_server_encoding;
+
+ Assert(!backend_startup_complete);
+ backend_startup_complete = true;
+
+ if (PrepareClientEncoding(pending_client_encoding) < 0 ||
+ SetClientEncoding(pending_client_encoding) < 0)
+ {
+ /*
+ * Oops, the requested conversion is not available. We couldn't fail
+ * before, but we can now.
+ */
+ ereport(FATAL,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("conversion between %s and %s is not supported",
+ pg_enc2name_tbl[pending_client_encoding].name,
+ GetDatabaseEncodingName())));
+ }
+
+ /*
+ * Also look up the UTF8-to-server conversion function if needed. Since
+ * the server encoding is fixed within any one backend process, we don't
+ * have to do this more than once.
+ */
+ current_server_encoding = GetDatabaseEncoding();
+ if (current_server_encoding != PG_UTF8 &&
+ current_server_encoding != PG_SQL_ASCII)
+ {
+ Oid utf8_to_server_proc;
+
+ Assert(IsTransactionState());
+ utf8_to_server_proc =
+ FindDefaultConversionProc(PG_UTF8,
+ current_server_encoding);
+ /* If there's no such conversion, just leave the pointer as NULL */
+ if (OidIsValid(utf8_to_server_proc))
+ {
+ FmgrInfo *finfo;
+
+ finfo = (FmgrInfo *) MemoryContextAlloc(TopMemoryContext,
+ sizeof(FmgrInfo));
+ fmgr_info_cxt(utf8_to_server_proc, finfo,
+ TopMemoryContext);
+ /* Set Utf8ToServerConvProc only after data is fully valid */
+ Utf8ToServerConvProc = finfo;
+ }
+ }
+}
+
+/*
+ * returns the current client encoding
+ */
+int
+pg_get_client_encoding(void)
+{
+ return ClientEncoding->encoding;
+}
+
+/*
+ * returns the current client encoding name
+ */
+const char *
+pg_get_client_encoding_name(void)
+{
+ return ClientEncoding->name;
+}
+
+/*
+ * Convert src string to another encoding (general case).
+ *
+ * See the notes about string conversion functions at the top of this file.
+ */
+unsigned char *
+pg_do_encoding_conversion(unsigned char *src, int len,
+ int src_encoding, int dest_encoding)
+{
+ unsigned char *result;
+ Oid proc;
+
+ if (len <= 0)
+ return src; /* empty string is always valid */
+
+ if (src_encoding == dest_encoding)
+ return src; /* no conversion required, assume valid */
+
+ if (dest_encoding == PG_SQL_ASCII)
+ return src; /* any string is valid in SQL_ASCII */
+
+ if (src_encoding == PG_SQL_ASCII)
+ {
+ /* No conversion is possible, but we must validate the result */
+ (void) pg_verify_mbstr(dest_encoding, (const char *) src, len, false);
+ return src;
+ }
+
+ if (!IsTransactionState()) /* shouldn't happen */
+ elog(ERROR, "cannot perform encoding conversion outside a transaction");
+
+ proc = FindDefaultConversionProc(src_encoding, dest_encoding);
+ if (!OidIsValid(proc))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("default conversion function for encoding \"%s\" to \"%s\" does not exist",
+ pg_encoding_to_char(src_encoding),
+ pg_encoding_to_char(dest_encoding))));
+
+ /*
+ * Allocate space for conversion result, being wary of integer overflow.
+ *
+ * len * MAX_CONVERSION_GROWTH is typically a vast overestimate of the
+ * required space, so it might exceed MaxAllocSize even though the result
+ * would actually fit. We do not want to hand back a result string that
+ * exceeds MaxAllocSize, because callers might not cope gracefully --- but
+ * if we just allocate more than that, and don't use it, that's fine.
+ */
+ if ((Size) len >= (MaxAllocHugeSize / (Size) MAX_CONVERSION_GROWTH))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("out of memory"),
+ errdetail("String of %d bytes is too long for encoding conversion.",
+ len)));
+
+ result = (unsigned char *)
+ MemoryContextAllocHuge(CurrentMemoryContext,
+ (Size) len * MAX_CONVERSION_GROWTH + 1);
+
+ (void) OidFunctionCall6(proc,
+ Int32GetDatum(src_encoding),
+ Int32GetDatum(dest_encoding),
+ CStringGetDatum(src),
+ CStringGetDatum(result),
+ Int32GetDatum(len),
+ BoolGetDatum(false));
+
+ /*
+ * If the result is large, it's worth repalloc'ing to release any extra
+ * space we asked for. The cutoff here is somewhat arbitrary, but we
+ * *must* check when len * MAX_CONVERSION_GROWTH exceeds MaxAllocSize.
+ */
+ if (len > 1000000)
+ {
+ Size resultlen = strlen((char *) result);
+
+ if (resultlen >= MaxAllocSize)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("out of memory"),
+ errdetail("String of %d bytes is too long for encoding conversion.",
+ len)));
+
+ result = (unsigned char *) repalloc(result, resultlen + 1);
+ }
+
+ return result;
+}
+
+/*
+ * Convert src string to another encoding.
+ *
+ * This function has a different API than the other conversion functions.
+ * The caller should've looked up the conversion function using
+ * FindDefaultConversionProc(). Unlike the other functions, the converted
+ * result is not palloc'd. It is written to the caller-supplied buffer
+ * instead.
+ *
+ * src_encoding - encoding to convert from
+ * dest_encoding - encoding to convert to
+ * src, srclen - input buffer and its length in bytes
+ * dest, destlen - destination buffer and its size in bytes
+ *
+ * The output is null-terminated.
+ *
+ * If destlen < srclen * MAX_CONVERSION_LENGTH + 1, the converted output
+ * wouldn't necessarily fit in the output buffer, and the function will not
+ * convert the whole input.
+ *
+ * TODO: The conversion function interface is not great. Firstly, it
+ * would be nice to pass through the destination buffer size to the
+ * conversion function, so that if you pass a shorter destination buffer, it
+ * could still continue to fill up the whole buffer. Currently, we have to
+ * assume worst case expansion and stop the conversion short, even if there
+ * is in fact space left in the destination buffer. Secondly, it would be
+ * nice to return the number of bytes written to the caller, to avoid a call
+ * to strlen().
+ */
+int
+pg_do_encoding_conversion_buf(Oid proc,
+ int src_encoding,
+ int dest_encoding,
+ unsigned char *src, int srclen,
+ unsigned char *dest, int destlen,
+ bool noError)
+{
+ Datum result;
+
+ /*
+ * If the destination buffer is not large enough to hold the result in the
+ * worst case, limit the input size passed to the conversion function.
+ */
+ if ((Size) srclen >= ((destlen - 1) / (Size) MAX_CONVERSION_GROWTH))
+ srclen = ((destlen - 1) / (Size) MAX_CONVERSION_GROWTH);
+
+ result = OidFunctionCall6(proc,
+ Int32GetDatum(src_encoding),
+ Int32GetDatum(dest_encoding),
+ CStringGetDatum(src),
+ CStringGetDatum(dest),
+ Int32GetDatum(srclen),
+ BoolGetDatum(noError));
+ return DatumGetInt32(result);
+}
+
+/*
+ * Convert string to encoding encoding_name. The source
+ * encoding is the DB encoding.
+ *
+ * BYTEA convert_to(TEXT string, NAME encoding_name) */
+Datum
+pg_convert_to(PG_FUNCTION_ARGS)
+{
+ Datum string = PG_GETARG_DATUM(0);
+ Datum dest_encoding_name = PG_GETARG_DATUM(1);
+ Datum src_encoding_name = DirectFunctionCall1(namein,
+ CStringGetDatum(DatabaseEncoding->name));
+ Datum result;
+
+ /*
+ * pg_convert expects a bytea as its first argument. We're passing it a
+ * text argument here, relying on the fact that they are both in fact
+ * varlena types, and thus structurally identical.
+ */
+ result = DirectFunctionCall3(pg_convert, string,
+ src_encoding_name, dest_encoding_name);
+
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * Convert string from encoding encoding_name. The destination
+ * encoding is the DB encoding.
+ *
+ * TEXT convert_from(BYTEA string, NAME encoding_name) */
+Datum
+pg_convert_from(PG_FUNCTION_ARGS)
+{
+ Datum string = PG_GETARG_DATUM(0);
+ Datum src_encoding_name = PG_GETARG_DATUM(1);
+ Datum dest_encoding_name = DirectFunctionCall1(namein,
+ CStringGetDatum(DatabaseEncoding->name));
+ Datum result;
+
+ result = DirectFunctionCall3(pg_convert, string,
+ src_encoding_name, dest_encoding_name);
+
+ /*
+ * pg_convert returns a bytea, which we in turn return as text, relying on
+ * the fact that they are both in fact varlena types, and thus
+ * structurally identical. Although not all bytea values are valid text,
+ * in this case it will be because we've told pg_convert to return one
+ * that is valid as text in the current database encoding.
+ */
+ PG_RETURN_DATUM(result);
+}
+
+/*
+ * Convert string between two arbitrary encodings.
+ *
+ * BYTEA convert(BYTEA string, NAME src_encoding_name, NAME dest_encoding_name)
+ */
+Datum
+pg_convert(PG_FUNCTION_ARGS)
+{
+ bytea *string = PG_GETARG_BYTEA_PP(0);
+ char *src_encoding_name = NameStr(*PG_GETARG_NAME(1));
+ int src_encoding = pg_char_to_encoding(src_encoding_name);
+ char *dest_encoding_name = NameStr(*PG_GETARG_NAME(2));
+ int dest_encoding = pg_char_to_encoding(dest_encoding_name);
+ const char *src_str;
+ char *dest_str;
+ bytea *retval;
+ int len;
+
+ if (src_encoding < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid source encoding name \"%s\"",
+ src_encoding_name)));
+ if (dest_encoding < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid destination encoding name \"%s\"",
+ dest_encoding_name)));
+
+ /* make sure that source string is valid */
+ len = VARSIZE_ANY_EXHDR(string);
+ src_str = VARDATA_ANY(string);
+ (void) pg_verify_mbstr(src_encoding, src_str, len, false);
+
+ /* perform conversion */
+ dest_str = (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, src_str),
+ len,
+ src_encoding,
+ dest_encoding);
+
+ /* update len if conversion actually happened */
+ if (dest_str != src_str)
+ len = strlen(dest_str);
+
+ /*
+ * build bytea data type structure.
+ */
+ retval = (bytea *) palloc(len + VARHDRSZ);
+ SET_VARSIZE(retval, len + VARHDRSZ);
+ memcpy(VARDATA(retval), dest_str, len);
+
+ if (dest_str != src_str)
+ pfree(dest_str);
+
+ /* free memory if allocated by the toaster */
+ PG_FREE_IF_COPY(string, 0);
+
+ PG_RETURN_BYTEA_P(retval);
+}
+
+/*
+ * get the length of the string considered as text in the specified
+ * encoding. Raises an error if the data is not valid in that
+ * encoding.
+ *
+ * INT4 length (BYTEA string, NAME src_encoding_name)
+ */
+Datum
+length_in_encoding(PG_FUNCTION_ARGS)
+{
+ bytea *string = PG_GETARG_BYTEA_PP(0);
+ char *src_encoding_name = NameStr(*PG_GETARG_NAME(1));
+ int src_encoding = pg_char_to_encoding(src_encoding_name);
+ const char *src_str;
+ int len;
+ int retval;
+
+ if (src_encoding < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid encoding name \"%s\"",
+ src_encoding_name)));
+
+ len = VARSIZE_ANY_EXHDR(string);
+ src_str = VARDATA_ANY(string);
+
+ retval = pg_verify_mbstr_len(src_encoding, src_str, len, false);
+
+ PG_RETURN_INT32(retval);
+}
+
+/*
+ * Get maximum multibyte character length in the specified encoding.
+ *
+ * Note encoding is specified numerically, not by name as above.
+ */
+Datum
+pg_encoding_max_length_sql(PG_FUNCTION_ARGS)
+{
+ int encoding = PG_GETARG_INT32(0);
+
+ if (PG_VALID_ENCODING(encoding))
+ PG_RETURN_INT32(pg_wchar_table[encoding].maxmblen);
+ else
+ PG_RETURN_NULL();
+}
+
+/*
+ * Convert client encoding to server encoding.
+ *
+ * See the notes about string conversion functions at the top of this file.
+ */
+char *
+pg_client_to_server(const char *s, int len)
+{
+ return pg_any_to_server(s, len, ClientEncoding->encoding);
+}
+
+/*
+ * Convert any encoding to server encoding.
+ *
+ * See the notes about string conversion functions at the top of this file.
+ *
+ * Unlike the other string conversion functions, this will apply validation
+ * even if encoding == DatabaseEncoding->encoding. This is because this is
+ * used to process data coming in from outside the database, and we never
+ * want to just assume validity.
+ */
+char *
+pg_any_to_server(const char *s, int len, int encoding)
+{
+ if (len <= 0)
+ return unconstify(char *, s); /* empty string is always valid */
+
+ if (encoding == DatabaseEncoding->encoding ||
+ encoding == PG_SQL_ASCII)
+ {
+ /*
+ * No conversion is needed, but we must still validate the data.
+ */
+ (void) pg_verify_mbstr(DatabaseEncoding->encoding, s, len, false);
+ return unconstify(char *, s);
+ }
+
+ if (DatabaseEncoding->encoding == PG_SQL_ASCII)
+ {
+ /*
+ * No conversion is possible, but we must still validate the data,
+ * because the client-side code might have done string escaping using
+ * the selected client_encoding. If the client encoding is ASCII-safe
+ * then we just do a straight validation under that encoding. For an
+ * ASCII-unsafe encoding we have a problem: we dare not pass such data
+ * to the parser but we have no way to convert it. We compromise by
+ * rejecting the data if it contains any non-ASCII characters.
+ */
+ if (PG_VALID_BE_ENCODING(encoding))
+ (void) pg_verify_mbstr(encoding, s, len, false);
+ else
+ {
+ int i;
+
+ for (i = 0; i < len; i++)
+ {
+ if (s[i] == '\0' || IS_HIGHBIT_SET(s[i]))
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("invalid byte value for encoding \"%s\": 0x%02x",
+ pg_enc2name_tbl[PG_SQL_ASCII].name,
+ (unsigned char) s[i])));
+ }
+ }
+ return unconstify(char *, s);
+ }
+
+ /* Fast path if we can use cached conversion function */
+ if (encoding == ClientEncoding->encoding)
+ return perform_default_encoding_conversion(s, len, true);
+
+ /* General case ... will not work outside transactions */
+ return (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, s),
+ len,
+ encoding,
+ DatabaseEncoding->encoding);
+}
+
+/*
+ * Convert server encoding to client encoding.
+ *
+ * See the notes about string conversion functions at the top of this file.
+ */
+char *
+pg_server_to_client(const char *s, int len)
+{
+ return pg_server_to_any(s, len, ClientEncoding->encoding);
+}
+
+/*
+ * Convert server encoding to any encoding.
+ *
+ * See the notes about string conversion functions at the top of this file.
+ */
+char *
+pg_server_to_any(const char *s, int len, int encoding)
+{
+ if (len <= 0)
+ return unconstify(char *, s); /* empty string is always valid */
+
+ if (encoding == DatabaseEncoding->encoding ||
+ encoding == PG_SQL_ASCII)
+ return unconstify(char *, s); /* assume data is valid */
+
+ if (DatabaseEncoding->encoding == PG_SQL_ASCII)
+ {
+ /* No conversion is possible, but we must validate the result */
+ (void) pg_verify_mbstr(encoding, s, len, false);
+ return unconstify(char *, s);
+ }
+
+ /* Fast path if we can use cached conversion function */
+ if (encoding == ClientEncoding->encoding)
+ return perform_default_encoding_conversion(s, len, false);
+
+ /* General case ... will not work outside transactions */
+ return (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, s),
+ len,
+ DatabaseEncoding->encoding,
+ encoding);
+}
+
+/*
+ * Perform default encoding conversion using cached FmgrInfo. Since
+ * this function does not access database at all, it is safe to call
+ * outside transactions. If the conversion has not been set up by
+ * SetClientEncoding(), no conversion is performed.
+ */
+static char *
+perform_default_encoding_conversion(const char *src, int len,
+ bool is_client_to_server)
+{
+ char *result;
+ int src_encoding,
+ dest_encoding;
+ FmgrInfo *flinfo;
+
+ if (is_client_to_server)
+ {
+ src_encoding = ClientEncoding->encoding;
+ dest_encoding = DatabaseEncoding->encoding;
+ flinfo = ToServerConvProc;
+ }
+ else
+ {
+ src_encoding = DatabaseEncoding->encoding;
+ dest_encoding = ClientEncoding->encoding;
+ flinfo = ToClientConvProc;
+ }
+
+ if (flinfo == NULL)
+ return unconstify(char *, src);
+
+ /*
+ * Allocate space for conversion result, being wary of integer overflow.
+ * See comments in pg_do_encoding_conversion.
+ */
+ if ((Size) len >= (MaxAllocHugeSize / (Size) MAX_CONVERSION_GROWTH))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("out of memory"),
+ errdetail("String of %d bytes is too long for encoding conversion.",
+ len)));
+
+ result = (char *)
+ MemoryContextAllocHuge(CurrentMemoryContext,
+ (Size) len * MAX_CONVERSION_GROWTH + 1);
+
+ FunctionCall6(flinfo,
+ Int32GetDatum(src_encoding),
+ Int32GetDatum(dest_encoding),
+ CStringGetDatum(src),
+ CStringGetDatum(result),
+ Int32GetDatum(len),
+ BoolGetDatum(false));
+
+ /*
+ * Release extra space if there might be a lot --- see comments in
+ * pg_do_encoding_conversion.
+ */
+ if (len > 1000000)
+ {
+ Size resultlen = strlen(result);
+
+ if (resultlen >= MaxAllocSize)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("out of memory"),
+ errdetail("String of %d bytes is too long for encoding conversion.",
+ len)));
+
+ result = (char *) repalloc(result, resultlen + 1);
+ }
+
+ return result;
+}
+
+/*
+ * Convert a single Unicode code point into a string in the server encoding.
+ *
+ * The code point given by "c" is converted and stored at *s, which must
+ * have at least MAX_UNICODE_EQUIVALENT_STRING+1 bytes available.
+ * The output will have a trailing '\0'. Throws error if the conversion
+ * cannot be performed.
+ *
+ * Note that this relies on having previously looked up any required
+ * conversion function. That's partly for speed but mostly because the parser
+ * may call this outside any transaction, or in an aborted transaction.
+ */
+void
+pg_unicode_to_server(pg_wchar c, unsigned char *s)
+{
+ unsigned char c_as_utf8[MAX_MULTIBYTE_CHAR_LEN + 1];
+ int c_as_utf8_len;
+ int server_encoding;
+
+ /*
+ * Complain if invalid Unicode code point. The choice of errcode here is
+ * debatable, but really our caller should have checked this anyway.
+ */
+ if (!is_valid_unicode_codepoint(c))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid Unicode code point")));
+
+ /* Otherwise, if it's in ASCII range, conversion is trivial */
+ if (c <= 0x7F)
+ {
+ s[0] = (unsigned char) c;
+ s[1] = '\0';
+ return;
+ }
+
+ /* If the server encoding is UTF-8, we just need to reformat the code */
+ server_encoding = GetDatabaseEncoding();
+ if (server_encoding == PG_UTF8)
+ {
+ unicode_to_utf8(c, s);
+ s[pg_utf_mblen(s)] = '\0';
+ return;
+ }
+
+ /* For all other cases, we must have a conversion function available */
+ if (Utf8ToServerConvProc == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("conversion between %s and %s is not supported",
+ pg_enc2name_tbl[PG_UTF8].name,
+ GetDatabaseEncodingName())));
+
+ /* Construct UTF-8 source string */
+ unicode_to_utf8(c, c_as_utf8);
+ c_as_utf8_len = pg_utf_mblen(c_as_utf8);
+ c_as_utf8[c_as_utf8_len] = '\0';
+
+ /* Convert, or throw error if we can't */
+ FunctionCall6(Utf8ToServerConvProc,
+ Int32GetDatum(PG_UTF8),
+ Int32GetDatum(server_encoding),
+ CStringGetDatum(c_as_utf8),
+ CStringGetDatum(s),
+ Int32GetDatum(c_as_utf8_len),
+ BoolGetDatum(false));
+}
+
+
+/* convert a multibyte string to a wchar */
+int
+pg_mb2wchar(const char *from, pg_wchar *to)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].mb2wchar_with_len((const unsigned char *) from, to, strlen(from));
+}
+
+/* convert a multibyte string to a wchar with a limited length */
+int
+pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].mb2wchar_with_len((const unsigned char *) from, to, len);
+}
+
+/* same, with any encoding */
+int
+pg_encoding_mb2wchar_with_len(int encoding,
+ const char *from, pg_wchar *to, int len)
+{
+ return pg_wchar_table[encoding].mb2wchar_with_len((const unsigned char *) from, to, len);
+}
+
+/* convert a wchar string to a multibyte */
+int
+pg_wchar2mb(const pg_wchar *from, char *to)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].wchar2mb_with_len(from, (unsigned char *) to, pg_wchar_strlen(from));
+}
+
+/* convert a wchar string to a multibyte with a limited length */
+int
+pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].wchar2mb_with_len(from, (unsigned char *) to, len);
+}
+
+/* same, with any encoding */
+int
+pg_encoding_wchar2mb_with_len(int encoding,
+ const pg_wchar *from, char *to, int len)
+{
+ return pg_wchar_table[encoding].wchar2mb_with_len(from, (unsigned char *) to, len);
+}
+
+/* returns the byte length of a multibyte character */
+int
+pg_mblen(const char *mbstr)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].mblen((const unsigned char *) mbstr);
+}
+
+/* returns the display length of a multibyte character */
+int
+pg_dsplen(const char *mbstr)
+{
+ return pg_wchar_table[DatabaseEncoding->encoding].dsplen((const unsigned char *) mbstr);
+}
+
+/* returns the length (counted in wchars) of a multibyte string */
+int
+pg_mbstrlen(const char *mbstr)
+{
+ int len = 0;
+
+ /* optimization for single byte encoding */
+ if (pg_database_encoding_max_length() == 1)
+ return strlen(mbstr);
+
+ while (*mbstr)
+ {
+ mbstr += pg_mblen(mbstr);
+ len++;
+ }
+ return len;
+}
+
+/* returns the length (counted in wchars) of a multibyte string
+ * (not necessarily NULL terminated)
+ */
+int
+pg_mbstrlen_with_len(const char *mbstr, int limit)
+{
+ int len = 0;
+
+ /* optimization for single byte encoding */
+ if (pg_database_encoding_max_length() == 1)
+ return limit;
+
+ while (limit > 0 && *mbstr)
+ {
+ int l = pg_mblen(mbstr);
+
+ limit -= l;
+ mbstr += l;
+ len++;
+ }
+ return len;
+}
+
+/*
+ * returns the byte length of a multibyte string
+ * (not necessarily NULL terminated)
+ * that is no longer than limit.
+ * this function does not break multibyte character boundary.
+ */
+int
+pg_mbcliplen(const char *mbstr, int len, int limit)
+{
+ return pg_encoding_mbcliplen(DatabaseEncoding->encoding, mbstr,
+ len, limit);
+}
+
+/*
+ * pg_mbcliplen with specified encoding
+ */
+int
+pg_encoding_mbcliplen(int encoding, const char *mbstr,
+ int len, int limit)
+{
+ mblen_converter mblen_fn;
+ int clen = 0;
+ int l;
+
+ /* optimization for single byte encoding */
+ if (pg_encoding_max_length(encoding) == 1)
+ return cliplen(mbstr, len, limit);
+
+ mblen_fn = pg_wchar_table[encoding].mblen;
+
+ while (len > 0 && *mbstr)
+ {
+ l = (*mblen_fn) ((const unsigned char *) mbstr);
+ if ((clen + l) > limit)
+ break;
+ clen += l;
+ if (clen == limit)
+ break;
+ len -= l;
+ mbstr += l;
+ }
+ return clen;
+}
+
+/*
+ * Similar to pg_mbcliplen except the limit parameter specifies the
+ * character length, not the byte length.
+ */
+int
+pg_mbcharcliplen(const char *mbstr, int len, int limit)
+{
+ int clen = 0;
+ int nch = 0;
+ int l;
+
+ /* optimization for single byte encoding */
+ if (pg_database_encoding_max_length() == 1)
+ return cliplen(mbstr, len, limit);
+
+ while (len > 0 && *mbstr)
+ {
+ l = pg_mblen(mbstr);
+ nch++;
+ if (nch > limit)
+ break;
+ clen += l;
+ len -= l;
+ mbstr += l;
+ }
+ return clen;
+}
+
+/* mbcliplen for any single-byte encoding */
+static int
+cliplen(const char *str, int len, int limit)
+{
+ int l = 0;
+
+ len = Min(len, limit);
+ while (l < len && str[l])
+ l++;
+ return l;
+}
+
+void
+SetDatabaseEncoding(int encoding)
+{
+ if (!PG_VALID_BE_ENCODING(encoding))
+ elog(ERROR, "invalid database encoding: %d", encoding);
+
+ DatabaseEncoding = &pg_enc2name_tbl[encoding];
+ Assert(DatabaseEncoding->encoding == encoding);
+}
+
+void
+SetMessageEncoding(int encoding)
+{
+ /* Some calls happen before we can elog()! */
+ Assert(PG_VALID_ENCODING(encoding));
+
+ MessageEncoding = &pg_enc2name_tbl[encoding];
+ Assert(MessageEncoding->encoding == encoding);
+}
+
+#ifdef ENABLE_NLS
+/*
+ * Make one bind_textdomain_codeset() call, translating a pg_enc to a gettext
+ * codeset. Fails for MULE_INTERNAL, an encoding unknown to gettext; can also
+ * fail for gettext-internal causes like out-of-memory.
+ */
+static bool
+raw_pg_bind_textdomain_codeset(const char *domainname, int encoding)
+{
+ bool elog_ok = (CurrentMemoryContext != NULL);
+ int i;
+
+ for (i = 0; pg_enc2gettext_tbl[i].name != NULL; i++)
+ {
+ if (pg_enc2gettext_tbl[i].encoding == encoding)
+ {
+ if (bind_textdomain_codeset(domainname,
+ pg_enc2gettext_tbl[i].name) != NULL)
+ return true;
+
+ if (elog_ok)
+ elog(LOG, "bind_textdomain_codeset failed");
+ else
+ write_stderr("bind_textdomain_codeset failed");
+
+ break;
+ }
+ }
+
+ return false;
+}
+
+/*
+ * Bind a gettext message domain to the codeset corresponding to the database
+ * encoding. For SQL_ASCII, instead bind to the codeset implied by LC_CTYPE.
+ * Return the MessageEncoding implied by the new settings.
+ *
+ * On most platforms, gettext defaults to the codeset implied by LC_CTYPE.
+ * When that matches the database encoding, we don't need to do anything. In
+ * CREATE DATABASE, we enforce or trust that the locale's codeset matches the
+ * database encoding, except for the C locale. (On Windows, we also permit a
+ * discrepancy under the UTF8 encoding.) For the C locale, explicitly bind
+ * gettext to the right codeset.
+ *
+ * On Windows, gettext defaults to the Windows ANSI code page. This is a
+ * convenient departure for software that passes the strings to Windows ANSI
+ * APIs, but we don't do that. Compel gettext to use database encoding or,
+ * failing that, the LC_CTYPE encoding as it would on other platforms.
+ *
+ * This function is called before elog() and palloc() are usable.
+ */
+int
+pg_bind_textdomain_codeset(const char *domainname)
+{
+ bool elog_ok = (CurrentMemoryContext != NULL);
+ int encoding = GetDatabaseEncoding();
+ int new_msgenc;
+
+#ifndef WIN32
+ const char *ctype = setlocale(LC_CTYPE, NULL);
+
+ if (pg_strcasecmp(ctype, "C") == 0 || pg_strcasecmp(ctype, "POSIX") == 0)
+#endif
+ if (encoding != PG_SQL_ASCII &&
+ raw_pg_bind_textdomain_codeset(domainname, encoding))
+ return encoding;
+
+ new_msgenc = pg_get_encoding_from_locale(NULL, elog_ok);
+ if (new_msgenc < 0)
+ new_msgenc = PG_SQL_ASCII;
+
+#ifdef WIN32
+ if (!raw_pg_bind_textdomain_codeset(domainname, new_msgenc))
+ /* On failure, the old message encoding remains valid. */
+ return GetMessageEncoding();
+#endif
+
+ return new_msgenc;
+}
+#endif
+
+/*
+ * The database encoding, also called the server encoding, represents the
+ * encoding of data stored in text-like data types. Affected types include
+ * cstring, text, varchar, name, xml, and json.
+ */
+int
+GetDatabaseEncoding(void)
+{
+ return DatabaseEncoding->encoding;
+}
+
+const char *
+GetDatabaseEncodingName(void)
+{
+ return DatabaseEncoding->name;
+}
+
+Datum
+getdatabaseencoding(PG_FUNCTION_ARGS)
+{
+ return DirectFunctionCall1(namein, CStringGetDatum(DatabaseEncoding->name));
+}
+
+Datum
+pg_client_encoding(PG_FUNCTION_ARGS)
+{
+ return DirectFunctionCall1(namein, CStringGetDatum(ClientEncoding->name));
+}
+
+Datum
+PG_char_to_encoding(PG_FUNCTION_ARGS)
+{
+ Name s = PG_GETARG_NAME(0);
+
+ PG_RETURN_INT32(pg_char_to_encoding(NameStr(*s)));
+}
+
+Datum
+PG_encoding_to_char(PG_FUNCTION_ARGS)
+{
+ int32 encoding = PG_GETARG_INT32(0);
+ const char *encoding_name = pg_encoding_to_char(encoding);
+
+ return DirectFunctionCall1(namein, CStringGetDatum(encoding_name));
+}
+
+/*
+ * gettext() returns messages in this encoding. This often matches the
+ * database encoding, but it differs for SQL_ASCII databases, for processes
+ * not attached to a database, and under a database encoding lacking iconv
+ * support (MULE_INTERNAL).
+ */
+int
+GetMessageEncoding(void)
+{
+ return MessageEncoding->encoding;
+}
+
+
+/*
+ * Generic character incrementer function.
+ *
+ * Not knowing anything about the properties of the encoding in use, we just
+ * keep incrementing the last byte until we get a validly-encoded result,
+ * or we run out of values to try. We don't bother to try incrementing
+ * higher-order bytes, so there's no growth in runtime for wider characters.
+ * (If we did try to do that, we'd need to consider the likelihood that 255
+ * is not a valid final byte in the encoding.)
+ */
+static bool
+pg_generic_charinc(unsigned char *charptr, int len)
+{
+ unsigned char *lastbyte = charptr + len - 1;
+ mbchar_verifier mbverify;
+
+ /* We can just invoke the character verifier directly. */
+ mbverify = pg_wchar_table[GetDatabaseEncoding()].mbverifychar;
+
+ while (*lastbyte < (unsigned char) 255)
+ {
+ (*lastbyte)++;
+ if ((*mbverify) (charptr, len) == len)
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * UTF-8 character incrementer function.
+ *
+ * For a one-byte character less than 0x7F, we just increment the byte.
+ *
+ * For a multibyte character, every byte but the first must fall between 0x80
+ * and 0xBF; and the first byte must be between 0xC0 and 0xF4. We increment
+ * the last byte that's not already at its maximum value. If we can't find a
+ * byte that's less than the maximum allowable value, we simply fail. We also
+ * need some special-case logic to skip regions used for surrogate pair
+ * handling, as those should not occur in valid UTF-8.
+ *
+ * Note that we don't reset lower-order bytes back to their minimums, since
+ * we can't afford to make an exhaustive search (see make_greater_string).
+ */
+static bool
+pg_utf8_increment(unsigned char *charptr, int length)
+{
+ unsigned char a;
+ unsigned char limit;
+
+ switch (length)
+ {
+ default:
+ /* reject lengths 5 and 6 for now */
+ return false;
+ case 4:
+ a = charptr[3];
+ if (a < 0xBF)
+ {
+ charptr[3]++;
+ break;
+ }
+ /* FALL THRU */
+ case 3:
+ a = charptr[2];
+ if (a < 0xBF)
+ {
+ charptr[2]++;
+ break;
+ }
+ /* FALL THRU */
+ case 2:
+ a = charptr[1];
+ switch (*charptr)
+ {
+ case 0xED:
+ limit = 0x9F;
+ break;
+ case 0xF4:
+ limit = 0x8F;
+ break;
+ default:
+ limit = 0xBF;
+ break;
+ }
+ if (a < limit)
+ {
+ charptr[1]++;
+ break;
+ }
+ /* FALL THRU */
+ case 1:
+ a = *charptr;
+ if (a == 0x7F || a == 0xDF || a == 0xEF || a == 0xF4)
+ return false;
+ charptr[0]++;
+ break;
+ }
+
+ return true;
+}
+
+/*
+ * EUC-JP character incrementer function.
+ *
+ * If the sequence starts with SS2 (0x8e), it must be a two-byte sequence
+ * representing JIS X 0201 characters with the second byte ranging between
+ * 0xa1 and 0xdf. We just increment the last byte if it's less than 0xdf,
+ * and otherwise rewrite the whole sequence to 0xa1 0xa1.
+ *
+ * If the sequence starts with SS3 (0x8f), it must be a three-byte sequence
+ * in which the last two bytes range between 0xa1 and 0xfe. The last byte
+ * is incremented if possible, otherwise the second-to-last byte.
+ *
+ * If the sequence starts with a value other than the above and its MSB
+ * is set, it must be a two-byte sequence representing JIS X 0208 characters
+ * with both bytes ranging between 0xa1 and 0xfe. The last byte is
+ * incremented if possible, otherwise the second-to-last byte.
+ *
+ * Otherwise, the sequence is a single-byte ASCII character. It is
+ * incremented up to 0x7f.
+ */
+static bool
+pg_eucjp_increment(unsigned char *charptr, int length)
+{
+ unsigned char c1,
+ c2;
+ int i;
+
+ c1 = *charptr;
+
+ switch (c1)
+ {
+ case SS2: /* JIS X 0201 */
+ if (length != 2)
+ return false;
+
+ c2 = charptr[1];
+
+ if (c2 >= 0xdf)
+ charptr[0] = charptr[1] = 0xa1;
+ else if (c2 < 0xa1)
+ charptr[1] = 0xa1;
+ else
+ charptr[1]++;
+ break;
+
+ case SS3: /* JIS X 0212 */
+ if (length != 3)
+ return false;
+
+ for (i = 2; i > 0; i--)
+ {
+ c2 = charptr[i];
+ if (c2 < 0xa1)
+ {
+ charptr[i] = 0xa1;
+ return true;
+ }
+ else if (c2 < 0xfe)
+ {
+ charptr[i]++;
+ return true;
+ }
+ }
+
+ /* Out of 3-byte code region */
+ return false;
+
+ default:
+ if (IS_HIGHBIT_SET(c1)) /* JIS X 0208? */
+ {
+ if (length != 2)
+ return false;
+
+ for (i = 1; i >= 0; i--)
+ {
+ c2 = charptr[i];
+ if (c2 < 0xa1)
+ {
+ charptr[i] = 0xa1;
+ return true;
+ }
+ else if (c2 < 0xfe)
+ {
+ charptr[i]++;
+ return true;
+ }
+ }
+
+ /* Out of 2 byte code region */
+ return false;
+ }
+ else
+ { /* ASCII, single byte */
+ if (c1 > 0x7e)
+ return false;
+ (*charptr)++;
+ }
+ break;
+ }
+
+ return true;
+}
+
+/*
+ * get the character incrementer for the encoding for the current database
+ */
+mbcharacter_incrementer
+pg_database_encoding_character_incrementer(void)
+{
+ /*
+ * Eventually it might be best to add a field to pg_wchar_table[], but for
+ * now we just use a switch.
+ */
+ switch (GetDatabaseEncoding())
+ {
+ case PG_UTF8:
+ return pg_utf8_increment;
+
+ case PG_EUC_JP:
+ return pg_eucjp_increment;
+
+ default:
+ return pg_generic_charinc;
+ }
+}
+
+/*
+ * fetch maximum length of the encoding for the current database
+ */
+int
+pg_database_encoding_max_length(void)
+{
+ return pg_wchar_table[GetDatabaseEncoding()].maxmblen;
+}
+
+/*
+ * Verify mbstr to make sure that it is validly encoded in the current
+ * database encoding. Otherwise same as pg_verify_mbstr().
+ */
+bool
+pg_verifymbstr(const char *mbstr, int len, bool noError)
+{
+ return pg_verify_mbstr(GetDatabaseEncoding(), mbstr, len, noError);
+}
+
+/*
+ * Verify mbstr to make sure that it is validly encoded in the specified
+ * encoding.
+ */
+bool
+pg_verify_mbstr(int encoding, const char *mbstr, int len, bool noError)
+{
+ int oklen;
+
+ Assert(PG_VALID_ENCODING(encoding));
+
+ oklen = pg_wchar_table[encoding].mbverifystr((const unsigned char *) mbstr, len);
+ if (oklen != len)
+ {
+ if (noError)
+ return false;
+ report_invalid_encoding(encoding, mbstr + oklen, len - oklen);
+ }
+ return true;
+}
+
+/*
+ * Verify mbstr to make sure that it is validly encoded in the specified
+ * encoding.
+ *
+ * mbstr is not necessarily zero terminated; length of mbstr is
+ * specified by len.
+ *
+ * If OK, return length of string in the encoding.
+ * If a problem is found, return -1 when noError is
+ * true; when noError is false, ereport() a descriptive message.
+ *
+ * Note: We cannot use the faster encoding-specific mbverifystr() function
+ * here, because we need to count the number of characters in the string.
+ */
+int
+pg_verify_mbstr_len(int encoding, const char *mbstr, int len, bool noError)
+{
+ mbchar_verifier mbverifychar;
+ int mb_len;
+
+ Assert(PG_VALID_ENCODING(encoding));
+
+ /*
+ * In single-byte encodings, we need only reject nulls (\0).
+ */
+ if (pg_encoding_max_length(encoding) <= 1)
+ {
+ const char *nullpos = memchr(mbstr, 0, len);
+
+ if (nullpos == NULL)
+ return len;
+ if (noError)
+ return -1;
+ report_invalid_encoding(encoding, nullpos, 1);
+ }
+
+ /* fetch function pointer just once */
+ mbverifychar = pg_wchar_table[encoding].mbverifychar;
+
+ mb_len = 0;
+
+ while (len > 0)
+ {
+ int l;
+
+ /* fast path for ASCII-subset characters */
+ if (!IS_HIGHBIT_SET(*mbstr))
+ {
+ if (*mbstr != '\0')
+ {
+ mb_len++;
+ mbstr++;
+ len--;
+ continue;
+ }
+ if (noError)
+ return -1;
+ report_invalid_encoding(encoding, mbstr, len);
+ }
+
+ l = (*mbverifychar) ((const unsigned char *) mbstr, len);
+
+ if (l < 0)
+ {
+ if (noError)
+ return -1;
+ report_invalid_encoding(encoding, mbstr, len);
+ }
+
+ mbstr += l;
+ len -= l;
+ mb_len++;
+ }
+ return mb_len;
+}
+
+/*
+ * check_encoding_conversion_args: check arguments of a conversion function
+ *
+ * "expected" arguments can be either an encoding ID or -1 to indicate that
+ * the caller will check whether it accepts the ID.
+ *
+ * Note: the errors here are not really user-facing, so elog instead of
+ * ereport seems sufficient. Also, we trust that the "expected" encoding
+ * arguments are valid encoding IDs, but we don't trust the actuals.
+ */
+void
+check_encoding_conversion_args(int src_encoding,
+ int dest_encoding,
+ int len,
+ int expected_src_encoding,
+ int expected_dest_encoding)
+{
+ if (!PG_VALID_ENCODING(src_encoding))
+ elog(ERROR, "invalid source encoding ID: %d", src_encoding);
+ if (src_encoding != expected_src_encoding && expected_src_encoding >= 0)
+ elog(ERROR, "expected source encoding \"%s\", but got \"%s\"",
+ pg_enc2name_tbl[expected_src_encoding].name,
+ pg_enc2name_tbl[src_encoding].name);
+ if (!PG_VALID_ENCODING(dest_encoding))
+ elog(ERROR, "invalid destination encoding ID: %d", dest_encoding);
+ if (dest_encoding != expected_dest_encoding && expected_dest_encoding >= 0)
+ elog(ERROR, "expected destination encoding \"%s\", but got \"%s\"",
+ pg_enc2name_tbl[expected_dest_encoding].name,
+ pg_enc2name_tbl[dest_encoding].name);
+ if (len < 0)
+ elog(ERROR, "encoding conversion length must not be negative");
+}
+
+/*
+ * report_invalid_encoding: complain about invalid multibyte character
+ *
+ * note: len is remaining length of string, not length of character;
+ * len must be greater than zero, as we always examine the first byte.
+ */
+void
+report_invalid_encoding(int encoding, const char *mbstr, int len)
+{
+ int l = pg_encoding_mblen(encoding, mbstr);
+ char buf[8 * 5 + 1];
+ char *p = buf;
+ int j,
+ jlimit;
+
+ jlimit = Min(l, len);
+ jlimit = Min(jlimit, 8); /* prevent buffer overrun */
+
+ for (j = 0; j < jlimit; j++)
+ {
+ p += sprintf(p, "0x%02x", (unsigned char) mbstr[j]);
+ if (j < jlimit - 1)
+ p += sprintf(p, " ");
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("invalid byte sequence for encoding \"%s\": %s",
+ pg_enc2name_tbl[encoding].name,
+ buf)));
+}
+
+/*
+ * report_untranslatable_char: complain about untranslatable character
+ *
+ * note: len is remaining length of string, not length of character;
+ * len must be greater than zero, as we always examine the first byte.
+ */
+void
+report_untranslatable_char(int src_encoding, int dest_encoding,
+ const char *mbstr, int len)
+{
+ int l = pg_encoding_mblen(src_encoding, mbstr);
+ char buf[8 * 5 + 1];
+ char *p = buf;
+ int j,
+ jlimit;
+
+ jlimit = Min(l, len);
+ jlimit = Min(jlimit, 8); /* prevent buffer overrun */
+
+ for (j = 0; j < jlimit; j++)
+ {
+ p += sprintf(p, "0x%02x", (unsigned char) mbstr[j]);
+ if (j < jlimit - 1)
+ p += sprintf(p, " ");
+ }
+
+ ereport(ERROR,
+ (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
+ errmsg("character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"",
+ buf,
+ pg_enc2name_tbl[src_encoding].name,
+ pg_enc2name_tbl[dest_encoding].name)));
+}
+
+
+#ifdef WIN32
+/*
+ * Convert from MessageEncoding to a palloc'ed, null-terminated utf16
+ * string. The character length is also passed to utf16len if not
+ * null. Returns NULL iff failed. Before MessageEncoding initialization, "str"
+ * should be ASCII-only; this will function as though MessageEncoding is UTF8.
+ */
+WCHAR *
+pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
+{
+ int msgenc = GetMessageEncoding();
+ WCHAR *utf16;
+ int dstlen;
+ UINT codepage;
+
+ if (msgenc == PG_SQL_ASCII)
+ /* No conversion is possible, and SQL_ASCII is never utf16. */
+ return NULL;
+
+ codepage = pg_enc2name_tbl[msgenc].codepage;
+
+ /*
+ * Use MultiByteToWideChar directly if there is a corresponding codepage,
+ * or double conversion through UTF8 if not. Double conversion is needed,
+ * for example, in an ENCODING=LATIN8, LC_CTYPE=C database.
+ */
+ if (codepage != 0)
+ {
+ utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1));
+ dstlen = MultiByteToWideChar(codepage, 0, str, len, utf16, len);
+ utf16[dstlen] = (WCHAR) 0;
+ }
+ else
+ {
+ char *utf8;
+
+ /*
+ * XXX pg_do_encoding_conversion() requires a transaction. In the
+ * absence of one, hope for the input to be valid UTF8.
+ */
+ if (IsTransactionState())
+ {
+ utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,
+ len,
+ msgenc,
+ PG_UTF8);
+ if (utf8 != str)
+ len = strlen(utf8);
+ }
+ else
+ utf8 = (char *) str;
+
+ utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1));
+ dstlen = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len);
+ utf16[dstlen] = (WCHAR) 0;
+
+ if (utf8 != str)
+ pfree(utf8);
+ }
+
+ if (dstlen == 0 && len > 0)
+ {
+ pfree(utf16);
+ return NULL; /* error */
+ }
+
+ if (utf16len)
+ *utf16len = dstlen;
+ return utf16;
+}
+
+#endif /* WIN32 */
diff --git a/src/backend/utils/mb/stringinfo_mb.c b/src/backend/utils/mb/stringinfo_mb.c
new file mode 100644
index 0000000..4401dfc
--- /dev/null
+++ b/src/backend/utils/mb/stringinfo_mb.c
@@ -0,0 +1,86 @@
+/*-------------------------------------------------------------------------
+ *
+ * stringinfo_mb.c
+ * Multibyte encoding-aware additional StringInfo facilities
+ *
+ * This is separate from common/stringinfo.c so that frontend users
+ * of that file need not pull in unnecessary multibyte-encoding support
+ * code.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mb/stringinfo_mb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "mb/stringinfo_mb.h"
+#include "mb/pg_wchar.h"
+
+
+/*
+ * appendStringInfoStringQuoted
+ *
+ * Append up to maxlen bytes from s to str, or the whole input string if
+ * maxlen < 0, adding single quotes around it and doubling all single quotes.
+ * Add an ellipsis if the copy is incomplete.
+ */
+void
+appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)
+{
+ char *copy = NULL;
+ const char *chunk_search_start,
+ *chunk_copy_start,
+ *chunk_end;
+ int slen;
+ bool ellipsis;
+
+ Assert(str != NULL);
+
+ slen = strlen(s);
+ if (maxlen >= 0 && maxlen < slen)
+ {
+ int finallen = pg_mbcliplen(s, slen, maxlen);
+
+ copy = pnstrdup(s, finallen);
+ chunk_search_start = copy;
+ chunk_copy_start = copy;
+
+ ellipsis = true;
+ }
+ else
+ {
+ chunk_search_start = s;
+ chunk_copy_start = s;
+
+ ellipsis = false;
+ }
+
+ appendStringInfoCharMacro(str, '\'');
+
+ while ((chunk_end = strchr(chunk_search_start, '\'')) != NULL)
+ {
+ /* copy including the found delimiting ' */
+ appendBinaryStringInfoNT(str,
+ chunk_copy_start,
+ chunk_end - chunk_copy_start + 1);
+
+ /* in order to double it, include this ' into the next chunk as well */
+ chunk_copy_start = chunk_end;
+ chunk_search_start = chunk_end + 1;
+ }
+
+ /* copy the last chunk and terminate */
+ if (ellipsis)
+ appendStringInfo(str, "%s...'", chunk_copy_start);
+ else
+ appendStringInfo(str, "%s'", chunk_copy_start);
+
+ if (copy)
+ pfree(copy);
+}
diff --git a/src/backend/utils/mb/win1251.c b/src/backend/utils/mb/win1251.c
new file mode 100644
index 0000000..75129e6
--- /dev/null
+++ b/src/backend/utils/mb/win1251.c
@@ -0,0 +1,74 @@
+/*
+ * make KOI8->CP1251(win-1251) and CP1251(win-1251)->KOI8 translation table
+ * from koi-win.tab.
+ *
+ * Tatsuo Ishii
+ *
+ * src/backend/utils/mb/win1251.c
+ */
+
+#include <stdio.h>
+
+
+main()
+{
+ int i;
+ char koitab[128],
+ wintab[128];
+ char buf[4096];
+ int koi,
+ win;
+
+ for (i = 0; i < 128; i++)
+ koitab[i] = wintab[i] = 0;
+
+ while (fgets(buf, sizeof(buf), stdin) != NULL)
+ {
+ if (*buf == '#')
+ continue;
+ sscanf(buf, "%d %d", &koi, &win);
+ if (koi < 128 || koi > 255 || win < 128 || win > 255)
+ {
+ fprintf(stderr, "invalid value %d\n", koi);
+ exit(1);
+ }
+ koitab[koi - 128] = win;
+ wintab[win - 128] = koi;
+ }
+
+ i = 0;
+ printf("static char koi2win[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", koitab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+
+ i = 0;
+ printf("static char win2koi[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", wintab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+}
diff --git a/src/backend/utils/mb/win866.c b/src/backend/utils/mb/win866.c
new file mode 100644
index 0000000..f98c376
--- /dev/null
+++ b/src/backend/utils/mb/win866.c
@@ -0,0 +1,74 @@
+/*
+ * make KOI8->CP866(ALT) and CP866(ALT)->KOI8 translation table
+ * from koi-alt.tab.
+ *
+ * Tatsuo Ishii
+ *
+ * src/backend/utils/mb/win866.c
+ */
+
+#include <stdio.h>
+
+
+main()
+{
+ int i;
+ char koitab[128],
+ alttab[128];
+ char buf[4096];
+ int koi,
+ alt;
+
+ for (i = 0; i < 128; i++)
+ koitab[i] = alttab[i] = 0;
+
+ while (fgets(buf, sizeof(buf), stdin) != NULL)
+ {
+ if (*buf == '#')
+ continue;
+ sscanf(buf, "%d %d", &koi, &alt);
+ if (koi < 128 || koi > 255 || alt < 128 || alt > 255)
+ {
+ fprintf(stderr, "invalid value %d\n", koi);
+ exit(1);
+ }
+ koitab[koi - 128] = alt;
+ alttab[alt - 128] = koi;
+ }
+
+ i = 0;
+ printf("static char koi2alt[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", koitab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+
+ i = 0;
+ printf("static char alt2koi[] = {\n");
+ while (i < 128)
+ {
+ int j = 0;
+
+ while (j < 8)
+ {
+ printf("0x%02x", alttab[i++]);
+ j++;
+ if (i >= 128)
+ break;
+ printf(", ");
+ }
+ printf("\n");
+ }
+ printf("};\n");
+}
diff --git a/src/backend/utils/mb/wstrcmp.c b/src/backend/utils/mb/wstrcmp.c
new file mode 100644
index 0000000..dad3ae0
--- /dev/null
+++ b/src/backend/utils/mb/wstrcmp.c
@@ -0,0 +1,47 @@
+/*
+ * src/backend/utils/mb/wstrcmp.c
+ *
+ *-
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* can be used in either frontend or backend */
+#include "postgres_fe.h"
+
+#include "mb/pg_wchar.h"
+
+int
+pg_char_and_wchar_strcmp(const char *s1, const pg_wchar *s2)
+{
+ while ((pg_wchar) *s1 == *s2++)
+ if (*s1++ == 0)
+ return 0;
+ return *(const unsigned char *) s1 - *(const pg_wchar *) (s2 - 1);
+}
diff --git a/src/backend/utils/mb/wstrncmp.c b/src/backend/utils/mb/wstrncmp.c
new file mode 100644
index 0000000..ea4823f
--- /dev/null
+++ b/src/backend/utils/mb/wstrncmp.c
@@ -0,0 +1,77 @@
+/*
+ * src/backend/utils/mb/wstrncmp.c
+ *
+ *
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from FreeBSD 2.2.1-RELEASE software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* can be used in either frontend or backend */
+#include "postgres_fe.h"
+
+#include "mb/pg_wchar.h"
+
+int
+pg_wchar_strncmp(const pg_wchar *s1, const pg_wchar *s2, size_t n)
+{
+ if (n == 0)
+ return 0;
+ do
+ {
+ if (*s1 != *s2++)
+ return (*s1 - *(s2 - 1));
+ if (*s1++ == 0)
+ break;
+ } while (--n != 0);
+ return 0;
+}
+
+int
+pg_char_and_wchar_strncmp(const char *s1, const pg_wchar *s2, size_t n)
+{
+ if (n == 0)
+ return 0;
+ do
+ {
+ if ((pg_wchar) ((unsigned char) *s1) != *s2++)
+ return ((pg_wchar) ((unsigned char) *s1) - *(s2 - 1));
+ if (*s1++ == 0)
+ break;
+ } while (--n != 0);
+ return 0;
+}
+
+size_t
+pg_wchar_strlen(const pg_wchar *str)
+{
+ const pg_wchar *s;
+
+ for (s = str; *s; ++s)
+ ;
+ return (s - str);
+}
diff --git a/src/backend/utils/misc/.gitignore b/src/backend/utils/misc/.gitignore
new file mode 100644
index 0000000..495b1ae
--- /dev/null
+++ b/src/backend/utils/misc/.gitignore
@@ -0,0 +1 @@
+/guc-file.c
diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
new file mode 100644
index 0000000..1d5327c
--- /dev/null
+++ b/src/backend/utils/misc/Makefile
@@ -0,0 +1,46 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/misc
+#
+# IDENTIFICATION
+# src/backend/utils/misc/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/misc
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
+
+OBJS = \
+ guc.o \
+ help_config.o \
+ pg_config.o \
+ pg_controldata.o \
+ pg_rusage.o \
+ ps_status.o \
+ queryenvironment.o \
+ queryjumble.o \
+ rls.o \
+ sampling.o \
+ superuser.o \
+ timeout.o \
+ tzparser.o
+
+# This location might depend on the installation directories. Therefore
+# we can't substitute it into pg_config.h.
+ifdef krb_srvtab
+override CPPFLAGS += -DPG_KRB_SRVTAB='"$(krb_srvtab)"'
+endif
+
+include $(top_srcdir)/src/backend/common.mk
+
+# guc-file is compiled as part of guc
+guc.o: guc-file.c
+
+# Note: guc-file.c is not deleted by 'make clean',
+# since we want to ship it in distribution tarballs.
+clean:
+ @rm -f lex.yy.c
diff --git a/src/backend/utils/misc/README b/src/backend/utils/misc/README
new file mode 100644
index 0000000..6e29438
--- /dev/null
+++ b/src/backend/utils/misc/README
@@ -0,0 +1,295 @@
+src/backend/utils/misc/README
+
+GUC Implementation Notes
+========================
+
+The GUC (Grand Unified Configuration) module implements configuration
+variables of multiple types (currently boolean, enum, int, real, and string).
+Variable settings can come from various places, with a priority ordering
+determining which setting is used.
+
+
+Per-Variable Hooks
+------------------
+
+Each variable known to GUC can optionally have a check_hook, an
+assign_hook, and/or a show_hook to provide customized behavior.
+Check hooks are used to perform validity checking on variable values
+(above and beyond what GUC can do), to compute derived settings when
+nontrivial work is needed to do that, and optionally to "canonicalize"
+user-supplied values. Assign hooks are used to update any derived state
+that needs to change when a GUC variable is set. Show hooks are used to
+modify the default SHOW display for a variable.
+
+
+If a check_hook is provided, it points to a function of the signature
+ bool check_hook(datatype *newvalue, void **extra, GucSource source)
+The "newvalue" argument is of type bool *, int *, double *, or char **
+for bool, int/enum, real, or string variables respectively. The check
+function should validate the proposed new value, and return true if it is
+OK or false if not. The function can optionally do a few other things:
+
+* When rejecting a bad proposed value, it may be useful to append some
+additional information to the generic "invalid value for parameter FOO"
+complaint that guc.c will emit. To do that, call
+ void GUC_check_errdetail(const char *format, ...)
+where the format string and additional arguments follow the rules for
+errdetail() arguments. The resulting string will be emitted as the
+DETAIL line of guc.c's error report, so it should follow the message style
+guidelines for DETAIL messages. There is also
+ void GUC_check_errhint(const char *format, ...)
+which can be used in the same way to append a HINT message.
+Occasionally it may even be appropriate to override guc.c's generic primary
+message or error code, which can be done with
+ void GUC_check_errcode(int sqlerrcode)
+ void GUC_check_errmsg(const char *format, ...)
+In general, check_hooks should avoid throwing errors directly if possible,
+though this may be impractical to avoid for some corner cases such as
+out-of-memory.
+
+* Since the newvalue is pass-by-reference, the function can modify it.
+This might be used for example to canonicalize the spelling of a string
+value, round off a buffer size to the nearest supported value, or replace
+a special value such as "-1" with a computed default value. If the
+function wishes to replace a string value, it must malloc (not palloc)
+the replacement value, and be sure to free() the previous value.
+
+* Derived information, such as the role OID represented by a user name,
+can be stored for use by the assign hook. To do this, malloc (not palloc)
+storage space for the information, and return its address at *extra.
+guc.c will automatically free() this space when the associated GUC setting
+is no longer of interest. *extra is initialized to NULL before call, so
+it can be ignored if not needed.
+
+The "source" argument indicates the source of the proposed new value,
+If it is >= PGC_S_INTERACTIVE, then we are performing an interactive
+assignment (e.g., a SET command). But when source < PGC_S_INTERACTIVE,
+we are reading a non-interactive option source, such as postgresql.conf.
+This is sometimes needed to determine whether a setting should be
+allowed. The check_hook might also look at the current actual value of
+the variable to determine what is allowed.
+
+Note that check hooks are sometimes called just to validate a value,
+without any intention of actually changing the setting. Therefore the
+check hook must *not* take any action based on the assumption that an
+assignment will occur.
+
+
+If an assign_hook is provided, it points to a function of the signature
+ void assign_hook(datatype newvalue, void *extra)
+where the type of "newvalue" matches the kind of variable, and "extra"
+is the derived-information pointer returned by the check_hook (always
+NULL if there is no check_hook). This function is called immediately
+before actually setting the variable's value (so it can look at the actual
+variable to determine the old value, for example to avoid doing work when
+the value isn't really changing).
+
+Note that there is no provision for a failure result code. assign_hooks
+should never fail except under the most dire circumstances, since a failure
+may for example result in GUC settings not being rolled back properly during
+transaction abort. In general, try to do anything that could conceivably
+fail in a check_hook instead, and pass along the results in an "extra"
+struct, so that the assign hook has little to do beyond copying the data to
+someplace. This applies particularly to catalog lookups: any required
+lookups must be done in the check_hook, since the assign_hook may be
+executed during transaction rollback when lookups will be unsafe.
+
+Note that check_hooks are sometimes called outside any transaction, too.
+This happens when processing the wired-in "bootstrap" value, values coming
+from the postmaster command line or environment, or values coming from
+postgresql.conf. Therefore, any catalog lookups done in a check_hook
+should be guarded with an IsTransactionState() test, and there must be a
+fallback path to allow derived values to be computed during the first
+subsequent use of the GUC setting within a transaction. A typical
+arrangement is for the catalog values computed by the check_hook and
+installed by the assign_hook to be used only for the remainder of the
+transaction in which the new setting is made. Each subsequent transaction
+looks up the values afresh on first use. This arrangement is useful to
+prevent use of stale catalog values, independently of the problem of
+needing to check GUC values outside a transaction.
+
+
+If a show_hook is provided, it points to a function of the signature
+ const char *show_hook(void)
+This hook allows variable-specific computation of the value displayed
+by SHOW (and other SQL features for showing GUC variable values).
+The return value can point to a static buffer, since show functions are
+not used reentrantly.
+
+
+Saving/Restoring GUC Variable Values
+------------------------------------
+
+Prior values of configuration variables must be remembered in order to deal
+with several special cases: RESET (a/k/a SET TO DEFAULT), rollback of SET
+on transaction abort, rollback of SET LOCAL at transaction end (either
+commit or abort), and save/restore around a function that has a SET option.
+RESET is defined as selecting the value that would be effective had there
+never been any SET commands in the current session.
+
+To handle these cases we must keep track of many distinct values for each
+variable. The primary values are:
+
+* actual variable contents always the current effective value
+
+* reset_val the value to use for RESET
+
+(Each GUC entry also has a boot_val which is the wired-in default value.
+This is assigned to the reset_val and the actual variable during
+InitializeGUCOptions(). The boot_val is also consulted to restore the
+correct reset_val if SIGHUP processing discovers that a variable formerly
+specified in postgresql.conf is no longer set there.)
+
+In addition to the primary values, there is a stack of former effective
+values that might need to be restored in future. Stacking and unstacking
+is controlled by the GUC "nest level", which is zero when outside any
+transaction, one at top transaction level, and incremented for each
+open subtransaction or function call with a SET option. A stack entry
+is made whenever a GUC variable is first modified at a given nesting level.
+(Note: the reset_val need not be stacked because it is only changed by
+non-transactional operations.)
+
+A stack entry has a state, a prior value of the GUC variable, a remembered
+source of that prior value, and depending on the state may also have a
+"masked" value. The masked value is needed when SET followed by SET LOCAL
+occur at the same nest level: the SET's value is masked but must be
+remembered to restore after transaction commit.
+
+During initialization we set the actual value and reset_val based on
+whichever non-interactive source has the highest priority. They will
+have the same value.
+
+The possible transactional operations on a GUC value are:
+
+Entry to a function with a SET option:
+
+ Push a stack entry with the prior variable value and state SAVE,
+ then set the variable.
+
+Plain SET command:
+
+ If no stack entry of current level:
+ Push new stack entry w/prior value and state SET
+ else if stack entry's state is SAVE, SET, or LOCAL:
+ change stack state to SET, don't change saved value
+ (here we are forgetting effects of prior set action)
+ else (entry must have state SET+LOCAL):
+ discard its masked value, change state to SET
+ (here we are forgetting effects of prior SET and SET LOCAL)
+ Now set new value.
+
+SET LOCAL command:
+
+ If no stack entry of current level:
+ Push new stack entry w/prior value and state LOCAL
+ else if stack entry's state is SAVE or LOCAL or SET+LOCAL:
+ no change to stack entry
+ (in SAVE case, SET LOCAL will be forgotten at func exit)
+ else (entry must have state SET):
+ put current active into its masked slot, set state SET+LOCAL
+ Now set new value.
+
+Transaction or subtransaction abort:
+
+ Pop stack entries, restoring prior value, until top < subxact depth
+
+Transaction or subtransaction commit (incl. successful function exit):
+
+ While stack entry level >= subxact depth
+
+ if entry's state is SAVE:
+ pop, restoring prior value
+ else if level is 1 and entry's state is SET+LOCAL:
+ pop, restoring *masked* value
+ else if level is 1 and entry's state is SET:
+ pop, discarding old value
+ else if level is 1 and entry's state is LOCAL:
+ pop, restoring prior value
+ else if there is no entry of exactly level N-1:
+ decrement entry's level, no other state change
+ else
+ merge entries of level N-1 and N as specified below
+
+The merged entry will have level N-1 and prior = older prior, so easiest
+to keep older entry and free newer. There are 12 possibilities since
+we already handled level N state = SAVE:
+
+N-1 N
+
+SAVE SET discard top prior, set state SET
+SAVE LOCAL discard top prior, no change to stack entry
+SAVE SET+LOCAL discard top prior, copy masked, state S+L
+
+SET SET discard top prior, no change to stack entry
+SET LOCAL copy top prior to masked, state S+L
+SET SET+LOCAL discard top prior, copy masked, state S+L
+
+LOCAL SET discard top prior, set state SET
+LOCAL LOCAL discard top prior, no change to stack entry
+LOCAL SET+LOCAL discard top prior, copy masked, state S+L
+
+SET+LOCAL SET discard top prior and second masked, state SET
+SET+LOCAL LOCAL discard top prior, no change to stack entry
+SET+LOCAL SET+LOCAL discard top prior, copy masked, state S+L
+
+
+RESET is executed like a SET, but using the reset_val as the desired new
+value. (We do not provide a RESET LOCAL command, but SET LOCAL TO DEFAULT
+has the same behavior that RESET LOCAL would.) The source associated with
+the reset_val also becomes associated with the actual value.
+
+If SIGHUP is received, the GUC code rereads the postgresql.conf
+configuration file (this does not happen in the signal handler, but at
+next return to main loop; note that it can be executed while within a
+transaction). New values from postgresql.conf are assigned to actual
+variable, reset_val, and stacked actual values, but only if each of
+these has a current source priority <= PGC_S_FILE. (It is thus possible
+for reset_val to track the config-file setting even if there is
+currently a different interactive value of the actual variable.)
+
+The check_hook, assign_hook and show_hook routines work only with the
+actual variable, and are not directly aware of the additional values
+maintained by GUC.
+
+
+GUC Memory Handling
+-------------------
+
+String variable values are allocated with malloc/strdup, not with the
+palloc/pstrdup mechanisms. We would need to keep them in a permanent
+context anyway, and malloc gives us more control over handling
+out-of-memory failures.
+
+We allow a string variable's actual value, reset_val, boot_val, and stacked
+values to point at the same storage. This makes it slightly harder to free
+space (we must test whether a value to be freed isn't equal to any of the
+other pointers in the GUC entry or associated stack items). The main
+advantage is that we never need to malloc during transaction commit/abort,
+so cannot cause an out-of-memory failure there.
+
+"Extra" structs returned by check_hook routines are managed in the same
+way as string values. Note that we support "extra" structs for all types
+of GUC variables, although they are mainly useful with strings.
+
+
+GUC and Null String Variables
+-----------------------------
+
+A GUC string variable can have a boot_val of NULL. guc.c handles this
+unsurprisingly, assigning the NULL to the underlying C variable. Any code
+using such a variable, as well as any hook functions for it, must then be
+prepared to deal with a NULL value.
+
+However, it is not possible to assign a NULL value to a GUC string
+variable in any other way: values coming from SET, postgresql.conf, etc,
+might be empty strings, but they'll never be NULL. And SHOW displays
+a NULL the same as an empty string. It is therefore not appropriate to
+treat a NULL value as a distinct user-visible setting. A typical use
+for a NULL boot_val is to denote that a value hasn't yet been set for
+a variable that will receive a real value later in startup.
+
+If it's undesirable for code using the underlying C variable to have to
+worry about NULL values ever, the variable can be given a non-null static
+initializer as well as a non-null boot_val. guc.c will overwrite the
+static initializer pointer with a copy of the boot_val during
+InitializeGUCOptions, but the variable will never contain a NULL.
diff --git a/src/backend/utils/misc/guc-file.c b/src/backend/utils/misc/guc-file.c
new file mode 100644
index 0000000..5425174
--- /dev/null
+++ b/src/backend/utils/misc/guc-file.c
@@ -0,0 +1,3231 @@
+#line 2 "guc-file.c"
+
+#line 4 "guc-file.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer GUC_yy_create_buffer
+#define yy_delete_buffer GUC_yy_delete_buffer
+#define yy_scan_buffer GUC_yy_scan_buffer
+#define yy_scan_string GUC_yy_scan_string
+#define yy_scan_bytes GUC_yy_scan_bytes
+#define yy_init_buffer GUC_yy_init_buffer
+#define yy_flush_buffer GUC_yy_flush_buffer
+#define yy_load_buffer_state GUC_yy_load_buffer_state
+#define yy_switch_to_buffer GUC_yy_switch_to_buffer
+#define yypush_buffer_state GUC_yypush_buffer_state
+#define yypop_buffer_state GUC_yypop_buffer_state
+#define yyensure_buffer_stack GUC_yyensure_buffer_stack
+#define yy_flex_debug GUC_yy_flex_debug
+#define yyin GUC_yyin
+#define yyleng GUC_yyleng
+#define yylex GUC_yylex
+#define yylineno GUC_yylineno
+#define yyout GUC_yyout
+#define yyrestart GUC_yyrestart
+#define yytext GUC_yytext
+#define yywrap GUC_yywrap
+#define yyalloc GUC_yyalloc
+#define yyrealloc GUC_yyrealloc
+#define yyfree GUC_yyfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define GUC_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer GUC_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define GUC_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer GUC_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define GUC_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer GUC_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define GUC_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string GUC_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define GUC_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes GUC_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define GUC_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer GUC_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define GUC_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer GUC_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define GUC_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state GUC_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define GUC_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer GUC_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define GUC_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state GUC_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define GUC_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state GUC_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define GUC_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack GUC_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define GUC_yylex_ALREADY_DEFINED
+#else
+#define yylex GUC_yylex
+#endif
+
+#ifdef yyrestart
+#define GUC_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart GUC_yyrestart
+#endif
+
+#ifdef yylex_init
+#define GUC_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init GUC_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define GUC_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra GUC_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define GUC_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy GUC_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define GUC_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug GUC_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define GUC_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug GUC_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define GUC_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra GUC_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define GUC_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra GUC_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define GUC_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in GUC_yyget_in
+#endif
+
+#ifdef yyset_in
+#define GUC_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in GUC_yyset_in
+#endif
+
+#ifdef yyget_out
+#define GUC_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out GUC_yyget_out
+#endif
+
+#ifdef yyset_out
+#define GUC_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out GUC_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define GUC_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng GUC_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define GUC_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text GUC_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define GUC_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno GUC_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define GUC_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno GUC_yyset_lineno
+#endif
+
+#ifdef yywrap
+#define GUC_yywrap_ALREADY_DEFINED
+#else
+#define yywrap GUC_yywrap
+#endif
+
+#ifdef yyalloc
+#define GUC_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc GUC_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define GUC_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc GUC_yyrealloc
+#endif
+
+#ifdef yyfree
+#define GUC_yyfree_ALREADY_DEFINED
+#else
+#define yyfree GUC_yyfree
+#endif
+
+#ifdef yytext
+#define GUC_yytext_ALREADY_DEFINED
+#else
+#define yytext GUC_yytext
+#endif
+
+#ifdef yyleng
+#define GUC_yyleng_ALREADY_DEFINED
+#else
+#define yyleng GUC_yyleng
+#endif
+
+#ifdef yyin
+#define GUC_yyin_ALREADY_DEFINED
+#else
+#define yyin GUC_yyin
+#endif
+
+#ifdef yyout
+#define GUC_yyout_ALREADY_DEFINED
+#else
+#define yyout GUC_yyout
+#endif
+
+#ifdef yy_flex_debug
+#define GUC_yy_flex_debug_ALREADY_DEFINED
+#else
+#define yy_flex_debug GUC_yy_flex_debug
+#endif
+
+#ifdef yylineno
+#define GUC_yylineno_ALREADY_DEFINED
+#else
+#define yylineno GUC_yylineno
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
+void yy_delete_buffer ( YY_BUFFER_STATE b );
+void yy_flush_buffer ( YY_BUFFER_STATE b );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
+
+void *yyalloc ( yy_size_t );
+void *yyrealloc ( void *, yy_size_t );
+void yyfree ( void * );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define GUC_yywrap() (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 12
+#define YY_END_OF_BUFFER 13
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[41] =
+ { 0,
+ 0, 0, 13, 11, 2, 1, 3, 11, 11, 9,
+ 8, 8, 10, 4, 2, 3, 0, 6, 0, 9,
+ 8, 8, 9, 0, 8, 8, 7, 7, 4, 4,
+ 0, 9, 8, 8, 7, 5, 5, 5, 5, 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 1, 4, 1, 1, 1, 5, 1,
+ 1, 1, 6, 1, 7, 8, 9, 10, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 9, 1, 1,
+ 12, 1, 1, 1, 13, 13, 13, 13, 14, 13,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 1, 16, 1, 1, 17, 1, 13, 13, 13, 13,
+
+ 14, 13, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 18,
+ 15, 15, 1, 1, 1, 1, 1, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19
+ } ;
+
+static const YY_CHAR yy_meta[20] =
+ { 0,
+ 1, 1, 2, 1, 1, 1, 3, 3, 3, 4,
+ 4, 1, 5, 6, 5, 1, 3, 5, 3
+ } ;
+
+static const flex_int16_t yy_base[48] =
+ { 0,
+ 0, 0, 50, 148, 43, 148, 0, 15, 24, 30,
+ 28, 22, 148, 40, 35, 0, 17, 25, 0, 15,
+ 0, 10, 0, 52, 0, 54, 10, 66, 79, 0,
+ 13, 15, 0, 0, 4, 90, 101, 0, 0, 148,
+ 118, 124, 127, 131, 133, 137, 141
+ } ;
+
+static const flex_int16_t yy_def[48] =
+ { 0,
+ 40, 1, 40, 40, 40, 40, 41, 42, 40, 43,
+ 40, 11, 40, 44, 40, 41, 42, 40, 42, 43,
+ 11, 11, 20, 40, 45, 40, 46, 40, 44, 29,
+ 40, 40, 26, 26, 46, 47, 47, 37, 37, 0,
+ 40, 40, 40, 40, 40, 40, 40
+ } ;
+
+static const flex_int16_t yy_nxt[168] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 9, 10, 4, 11,
+ 12, 13, 14, 14, 14, 4, 14, 14, 14, 18,
+ 35, 18, 32, 32, 32, 32, 35, 25, 24, 17,
+ 19, 20, 19, 21, 22, 20, 15, 22, 22, 25,
+ 25, 25, 25, 24, 15, 26, 27, 28, 27, 40,
+ 40, 40, 40, 40, 40, 40, 30, 31, 31, 40,
+ 40, 32, 32, 33, 33, 40, 34, 34, 25, 40,
+ 40, 25, 27, 27, 27, 27, 27, 40, 36, 36,
+ 36, 40, 37, 36, 36, 27, 28, 27, 40, 40,
+ 40, 40, 40, 40, 40, 30, 27, 27, 27, 40,
+
+ 40, 40, 40, 40, 40, 40, 39, 27, 27, 27,
+ 40, 40, 40, 40, 40, 40, 40, 39, 16, 40,
+ 16, 16, 16, 16, 17, 40, 17, 17, 17, 17,
+ 23, 40, 23, 29, 29, 29, 29, 25, 25, 27,
+ 27, 27, 27, 38, 38, 38, 38, 3, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40
+ } ;
+
+static const flex_int16_t yy_chk[168] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 8,
+ 35, 17, 31, 31, 32, 32, 27, 22, 20, 18,
+ 8, 9, 17, 9, 9, 11, 15, 11, 11, 12,
+ 11, 11, 11, 10, 5, 11, 14, 14, 14, 3,
+ 0, 0, 0, 0, 0, 0, 14, 24, 24, 0,
+ 0, 24, 24, 26, 26, 0, 26, 26, 26, 0,
+ 0, 26, 28, 28, 28, 28, 28, 0, 28, 28,
+ 28, 0, 28, 28, 28, 29, 29, 29, 0, 0,
+ 0, 0, 0, 0, 0, 29, 36, 36, 36, 0,
+
+ 0, 0, 0, 0, 0, 0, 36, 37, 37, 37,
+ 0, 0, 0, 0, 0, 0, 0, 37, 41, 0,
+ 41, 41, 41, 41, 42, 0, 42, 42, 42, 42,
+ 43, 0, 43, 44, 44, 44, 44, 45, 45, 46,
+ 46, 46, 46, 47, 47, 47, 47, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "guc-file.l"
+/* -*-pgsql-c-*- */
+/*
+ * Scanner for the configuration file
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/misc/guc-file.l
+ */
+#line 11 "guc-file.l"
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <unistd.h>
+
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "storage/fd.h"
+#include "utils/guc.h"
+
+
+/*
+ * flex emits a yy_fatal_error() function that it calls in response to
+ * critical errors like malloc failure, file I/O errors, and detection of
+ * internal inconsistency. That function prints a message and calls exit().
+ * Mutate it to instead call our handler, which jumps out of the parser.
+ */
+#undef fprintf
+#define fprintf(file, fmt, msg) GUC_flex_fatal(msg)
+
+enum
+{
+ GUC_ID = 1,
+ GUC_STRING = 2,
+ GUC_INTEGER = 3,
+ GUC_REAL = 4,
+ GUC_EQUALS = 5,
+ GUC_UNQUOTED_STRING = 6,
+ GUC_QUALIFIED_ID = 7,
+ GUC_EOL = 99,
+ GUC_ERROR = 100
+};
+
+static unsigned int ConfigFileLineno;
+static const char *GUC_flex_fatal_errmsg;
+static sigjmp_buf *GUC_flex_fatal_jmp;
+
+static void FreeConfigVariable(ConfigVariable *item);
+
+static void record_config_file_error(const char *errmsg,
+ const char *config_file,
+ int lineno,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p);
+
+static int GUC_flex_fatal(const char *msg);
+
+/* LCOV_EXCL_START */
+
+#line 809 "guc-file.c"
+#define YY_NO_INPUT 1
+#line 811 "guc-file.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in ( void );
+
+void yyset_in ( FILE * _in_str );
+
+FILE *yyget_out ( void );
+
+void yyset_out ( FILE * _out_str );
+
+ int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ {
+#line 93 "guc-file.l"
+
+
+#line 1029 "guc-file.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 41 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 40 );
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 95 "guc-file.l"
+ConfigFileLineno++; return GUC_EOL;
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 96 "guc-file.l"
+/* eat whitespace */
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 97 "guc-file.l"
+/* eat comment (.* matches anything until newline) */
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 99 "guc-file.l"
+return GUC_ID;
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 100 "guc-file.l"
+return GUC_QUALIFIED_ID;
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 101 "guc-file.l"
+return GUC_STRING;
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 102 "guc-file.l"
+return GUC_UNQUOTED_STRING;
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 103 "guc-file.l"
+return GUC_INTEGER;
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 104 "guc-file.l"
+return GUC_REAL;
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 105 "guc-file.l"
+return GUC_EQUALS;
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 107 "guc-file.l"
+return GUC_ERROR;
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 109 "guc-file.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 1143 "guc-file.c"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = (yytext_ptr);
+ int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 41 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ int yy_is_jam;
+ char *yy_cp = (yy_c_buf_p);
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 41 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 40);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf );
+
+ yyfree( (void *) b );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ *
+ */
+void yyset_lineno (int _line_number )
+{
+
+ yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str )
+{
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str )
+{
+ yyout = _out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug )
+{
+ yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = NULL;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = NULL;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 109 "guc-file.l"
+
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Exported function to read and process the configuration file. The
+ * parameter indicates in what context the file is being read --- either
+ * postmaster startup (including standalone-backend startup) or SIGHUP.
+ * All options mentioned in the configuration file are set to new values.
+ * If a hard error occurs, no values will be changed. (There can also be
+ * errors that prevent just one value from being changed.)
+ */
+void
+ProcessConfigFile(GucContext context)
+{
+ int elevel;
+ MemoryContext config_cxt;
+ MemoryContext caller_cxt;
+
+ /*
+ * Config files are processed on startup (by the postmaster only) and on
+ * SIGHUP (by the postmaster and its children)
+ */
+ Assert((context == PGC_POSTMASTER && !IsUnderPostmaster) ||
+ context == PGC_SIGHUP);
+
+ /*
+ * To avoid cluttering the log, only the postmaster bleats loudly about
+ * problems with the config file.
+ */
+ elevel = IsUnderPostmaster ? DEBUG2 : LOG;
+
+ /*
+ * This function is usually called within a process-lifespan memory
+ * context. To ensure that any memory leaked during GUC processing does
+ * not accumulate across repeated SIGHUP cycles, do the work in a private
+ * context that we can free at exit.
+ */
+ config_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "config file processing",
+ ALLOCSET_DEFAULT_SIZES);
+ caller_cxt = MemoryContextSwitchTo(config_cxt);
+
+ /*
+ * Read and apply the config file. We don't need to examine the result.
+ */
+ (void) ProcessConfigFileInternal(context, true, elevel);
+
+ /* Clean up */
+ MemoryContextSwitchTo(caller_cxt);
+ MemoryContextDelete(config_cxt);
+}
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view). In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+static ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+ bool error = false;
+ bool applying = false;
+ const char *ConfFileWithError;
+ ConfigVariable *item,
+ *head,
+ *tail;
+ int i;
+
+ /* Parse the main config file into a list of option names and values */
+ ConfFileWithError = ConfigFileName;
+ head = tail = NULL;
+
+ if (!ParseConfigFile(ConfigFileName, true,
+ NULL, 0, 0, elevel,
+ &head, &tail))
+ {
+ /* Syntax error(s) detected in the file, so bail out */
+ error = true;
+ goto bail_out;
+ }
+
+ /*
+ * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+ * replace any parameters set by ALTER SYSTEM command. Because this file
+ * is in the data directory, we can't read it until the DataDir has been
+ * set.
+ */
+ if (DataDir)
+ {
+ if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+ NULL, 0, 0, elevel,
+ &head, &tail))
+ {
+ /* Syntax error(s) detected in the file, so bail out */
+ error = true;
+ ConfFileWithError = PG_AUTOCONF_FILENAME;
+ goto bail_out;
+ }
+ }
+ else
+ {
+ /*
+ * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+ * read. In this case, we don't want to accept any settings but
+ * data_directory from postgresql.conf, because they might be
+ * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+ * will be read later. OTOH, since data_directory isn't allowed in the
+ * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+ */
+ ConfigVariable *newlist = NULL;
+
+ /*
+ * Prune all items except the last "data_directory" from the list.
+ */
+ for (item = head; item; item = item->next)
+ {
+ if (!item->ignore &&
+ strcmp(item->name, "data_directory") == 0)
+ newlist = item;
+ }
+
+ if (newlist)
+ newlist->next = NULL;
+ head = tail = newlist;
+
+ /*
+ * Quick exit if data_directory is not present in file.
+ *
+ * We need not do any further processing, in particular we don't set
+ * PgReloadTime; that will be set soon by subsequent full loading of
+ * the config file.
+ */
+ if (head == NULL)
+ goto bail_out;
+ }
+
+ /*
+ * Mark all extant GUC variables as not present in the config file. We
+ * need this so that we can tell below which ones have been removed from
+ * the file since we last processed it.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+
+ gconf->status &= ~GUC_IS_IN_FILE;
+ }
+
+ /*
+ * Check if all the supplied option names are valid, as an additional
+ * quasi-syntactic check on the validity of the config file. It is
+ * important that the postmaster and all backends agree on the results of
+ * this phase, else we will have strange inconsistencies about which
+ * processes accept a config file update and which don't. Hence, unknown
+ * custom variable names have to be accepted without complaint. For the
+ * same reason, we don't attempt to validate the options' values here.
+ *
+ * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+ * variable mentioned in the file; and we detect duplicate entries in the
+ * file and mark the earlier occurrences as ignorable.
+ */
+ for (item = head; item; item = item->next)
+ {
+ struct config_generic *record;
+
+ /* Ignore anything already marked as ignorable */
+ if (item->ignore)
+ continue;
+
+ /*
+ * Try to find the variable; but do not create a custom placeholder if
+ * it's not there already.
+ */
+ record = find_option(item->name, false, true, elevel);
+
+ if (record)
+ {
+ /* If it's already marked, then this is a duplicate entry */
+ if (record->status & GUC_IS_IN_FILE)
+ {
+ /*
+ * Mark the earlier occurrence(s) as dead/ignorable. We could
+ * avoid the O(N^2) behavior here with some additional state,
+ * but it seems unlikely to be worth the trouble.
+ */
+ ConfigVariable *pitem;
+
+ for (pitem = head; pitem != item; pitem = pitem->next)
+ {
+ if (!pitem->ignore &&
+ strcmp(pitem->name, item->name) == 0)
+ pitem->ignore = true;
+ }
+ }
+ /* Now mark it as present in file */
+ record->status |= GUC_IS_IN_FILE;
+ }
+ else if (!valid_custom_variable_name(item->name))
+ {
+ /* Invalid non-custom variable, so complain */
+ ereport(elevel,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+ item->name,
+ item->filename, item->sourceline)));
+ item->errmsg = pstrdup("unrecognized configuration parameter");
+ error = true;
+ ConfFileWithError = item->filename;
+ }
+ }
+
+ /*
+ * If we've detected any errors so far, we don't want to risk applying any
+ * changes.
+ */
+ if (error)
+ goto bail_out;
+
+ /* Otherwise, set flag that we're beginning to apply changes */
+ applying = true;
+
+ /*
+ * Check for variables having been removed from the config file, and
+ * revert their reset values (and perhaps also effective values) to the
+ * boot-time defaults. If such a variable can't be changed after startup,
+ * report that and continue.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+ GucStack *stack;
+
+ if (gconf->reset_source != PGC_S_FILE ||
+ (gconf->status & GUC_IS_IN_FILE))
+ continue;
+ if (gconf->context < PGC_SIGHUP)
+ {
+ /* The removal can't be effective without a restart */
+ gconf->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ gconf->name)));
+ record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+ gconf->name),
+ NULL, 0,
+ &head, &tail);
+ error = true;
+ continue;
+ }
+
+ /* No more to do if we're just doing show_all_file_settings() */
+ if (!applySettings)
+ continue;
+
+ /*
+ * Reset any "file" sources to "default", else set_config_option will
+ * not override those settings.
+ */
+ if (gconf->reset_source == PGC_S_FILE)
+ gconf->reset_source = PGC_S_DEFAULT;
+ if (gconf->source == PGC_S_FILE)
+ gconf->source = PGC_S_DEFAULT;
+ for (stack = gconf->stack; stack; stack = stack->prev)
+ {
+ if (stack->source == PGC_S_FILE)
+ stack->source = PGC_S_DEFAULT;
+ }
+
+ /* Now we can re-apply the wired-in default (i.e., the boot_val) */
+ if (set_config_option(gconf->name, NULL,
+ context, PGC_S_DEFAULT,
+ GUC_ACTION_SET, true, 0, false) > 0)
+ {
+ /* Log the change if appropriate */
+ if (context == PGC_SIGHUP)
+ ereport(elevel,
+ (errmsg("parameter \"%s\" removed from configuration file, reset to default",
+ gconf->name)));
+ }
+ }
+
+ /*
+ * Restore any variables determined by environment variables or
+ * dynamically-computed defaults. This is a no-op except in the case
+ * where one of these had been in the config file and is now removed.
+ *
+ * In particular, we *must not* do this during the postmaster's initial
+ * loading of the file, since the timezone functions in particular should
+ * be run only after initialization is complete.
+ *
+ * XXX this is an unmaintainable crock, because we have to know how to set
+ * (or at least what to call to set) every non-PGC_INTERNAL variable that
+ * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+ */
+ if (context == PGC_SIGHUP && applySettings)
+ {
+ InitializeGUCOptionsFromEnvironment();
+ pg_timezone_abbrev_initialize();
+ /* this selects SQL_ASCII in processes not connected to a database */
+ SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+ PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+ }
+
+ /*
+ * Now apply the values from the config file.
+ */
+ for (item = head; item; item = item->next)
+ {
+ char *pre_value = NULL;
+ int scres;
+
+ /* Ignore anything marked as ignorable */
+ if (item->ignore)
+ continue;
+
+ /* In SIGHUP cases in the postmaster, we want to report changes */
+ if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+ {
+ const char *preval = GetConfigOption(item->name, true, false);
+
+ /* If option doesn't exist yet or is NULL, treat as empty string */
+ if (!preval)
+ preval = "";
+ /* must dup, else might have dangling pointer below */
+ pre_value = pstrdup(preval);
+ }
+
+ scres = set_config_option(item->name, item->value,
+ context, PGC_S_FILE,
+ GUC_ACTION_SET, applySettings, 0, false);
+ if (scres > 0)
+ {
+ /* variable was updated, so log the change if appropriate */
+ if (pre_value)
+ {
+ const char *post_value = GetConfigOption(item->name, true, false);
+
+ if (!post_value)
+ post_value = "";
+ if (strcmp(pre_value, post_value) != 0)
+ ereport(elevel,
+ (errmsg("parameter \"%s\" changed to \"%s\"",
+ item->name, item->value)));
+ }
+ item->applied = true;
+ }
+ else if (scres == 0)
+ {
+ error = true;
+ item->errmsg = pstrdup("setting could not be applied");
+ ConfFileWithError = item->filename;
+ }
+ else
+ {
+ /* no error, but variable's active value was not changed */
+ item->applied = true;
+ }
+
+ /*
+ * We should update source location unless there was an error, since
+ * even if the active value didn't change, the reset value might have.
+ * (In the postmaster, there won't be a difference, but it does matter
+ * in backends.)
+ */
+ if (scres != 0 && applySettings)
+ set_config_sourcefile(item->name, item->filename,
+ item->sourceline);
+
+ if (pre_value)
+ pfree(pre_value);
+ }
+
+ /* Remember when we last successfully loaded the config file. */
+ if (applySettings)
+ PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+ if (error && applySettings)
+ {
+ /* During postmaster startup, any error is fatal */
+ if (context == PGC_POSTMASTER)
+ ereport(ERROR,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors",
+ ConfFileWithError)));
+ else if (applying)
+ ereport(elevel,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+ ConfFileWithError)));
+ else
+ ereport(elevel,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors; no changes were applied",
+ ConfFileWithError)));
+ }
+
+ /* Successful or otherwise, return the collected data list */
+ return head;
+}
+
+/*
+ * Given a configuration file or directory location that may be a relative
+ * path, return an absolute one. We consider the location to be relative to
+ * the directory holding the calling file, or to DataDir if no calling file.
+ */
+static char *
+AbsoluteConfigLocation(const char *location, const char *calling_file)
+{
+ char abs_path[MAXPGPATH];
+
+ if (is_absolute_path(location))
+ return pstrdup(location);
+ else
+ {
+ if (calling_file != NULL)
+ {
+ strlcpy(abs_path, calling_file, sizeof(abs_path));
+ get_parent_directory(abs_path);
+ join_path_components(abs_path, abs_path, location);
+ canonicalize_path(abs_path);
+ }
+ else
+ {
+ AssertState(DataDir);
+ join_path_components(abs_path, DataDir, location);
+ canonicalize_path(abs_path);
+ }
+ return pstrdup(abs_path);
+ }
+}
+
+/*
+ * Read and parse a single configuration file. This function recurses
+ * to handle "include" directives.
+ *
+ * If "strict" is true, treat failure to open the config file as an error,
+ * otherwise just skip the file.
+ *
+ * calling_file/calling_lineno identify the source of the request.
+ * Pass NULL/0 if not recursing from an inclusion request.
+ *
+ * See ParseConfigFp for further details. This one merely adds opening the
+ * config file rather than working from a caller-supplied file descriptor,
+ * and absolute-ifying the path name if necessary.
+ */
+bool
+ParseConfigFile(const char *config_file, bool strict,
+ const char *calling_file, int calling_lineno,
+ int depth, int elevel,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ char *abs_path;
+ bool OK = true;
+ FILE *fp;
+
+ /*
+ * Reject file name that is all-blank (including empty), as that leads to
+ * confusion --- we'd try to read the containing directory as a file.
+ */
+ if (strspn(config_file, " \t\r\n") == strlen(config_file))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("empty configuration file name: \"%s\"",
+ config_file)));
+ record_config_file_error("empty configuration file name",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ /*
+ * Reject too-deep include nesting depth. This is just a safety check to
+ * avoid dumping core due to stack overflow if an include file loops back
+ * to itself. The maximum nesting depth is pretty arbitrary.
+ */
+ if (depth > 10)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("could not open configuration file \"%s\": maximum nesting depth exceeded",
+ config_file)));
+ record_config_file_error("nesting depth exceeded",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ abs_path = AbsoluteConfigLocation(config_file, calling_file);
+
+ /*
+ * Reject direct recursion. Indirect recursion is also possible, but it's
+ * harder to detect and so doesn't seem worth the trouble. (We test at
+ * this step because the canonicalization done by AbsoluteConfigLocation
+ * makes it more likely that a simple strcmp comparison will match.)
+ */
+ if (calling_file && strcmp(abs_path, calling_file) == 0)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("configuration file recursion in \"%s\"",
+ calling_file)));
+ record_config_file_error("configuration file recursion",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ pfree(abs_path);
+ return false;
+ }
+
+ fp = AllocateFile(abs_path, "r");
+ if (!fp)
+ {
+ if (strict)
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open configuration file \"%s\": %m",
+ abs_path)));
+ record_config_file_error(psprintf("could not open file \"%s\"",
+ abs_path),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ OK = false;
+ }
+ else
+ {
+ ereport(LOG,
+ (errmsg("skipping missing configuration file \"%s\"",
+ abs_path)));
+ }
+ goto cleanup;
+ }
+
+ OK = ParseConfigFp(fp, abs_path, depth, elevel, head_p, tail_p);
+
+cleanup:
+ if (fp)
+ FreeFile(fp);
+ pfree(abs_path);
+
+ return OK;
+}
+
+/*
+ * Capture an error message in the ConfigVariable list returned by
+ * config file parsing.
+ */
+static void
+record_config_file_error(const char *errmsg,
+ const char *config_file,
+ int lineno,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ ConfigVariable *item;
+
+ item = palloc(sizeof *item);
+ item->name = NULL;
+ item->value = NULL;
+ item->errmsg = pstrdup(errmsg);
+ item->filename = config_file ? pstrdup(config_file) : NULL;
+ item->sourceline = lineno;
+ item->ignore = true;
+ item->applied = false;
+ item->next = NULL;
+ if (*head_p == NULL)
+ *head_p = item;
+ else
+ (*tail_p)->next = item;
+ *tail_p = item;
+}
+
+/*
+ * Flex fatal errors bring us here. Stash the error message and jump back to
+ * ParseConfigFp(). Assume all msg arguments point to string constants; this
+ * holds for flex 2.5.31 (earliest we support) and flex 2.5.35 (latest as of
+ * this writing). Otherwise, we would need to copy the message.
+ *
+ * We return "int" since this takes the place of calls to fprintf().
+*/
+static int
+GUC_flex_fatal(const char *msg)
+{
+ GUC_flex_fatal_errmsg = msg;
+ siglongjmp(*GUC_flex_fatal_jmp, 1);
+ return 0; /* keep compiler quiet */
+}
+
+/*
+ * Read and parse a single configuration file. This function recurses
+ * to handle "include" directives.
+ *
+ * Input parameters:
+ * fp: file pointer from AllocateFile for the configuration file to parse
+ * config_file: absolute or relative path name of the configuration file
+ * depth: recursion depth (should be 0 in the outermost call)
+ * elevel: error logging level to use
+ * Input/Output parameters:
+ * head_p, tail_p: head and tail of linked list of name/value pairs
+ *
+ * *head_p and *tail_p must be initialized, either to NULL or valid pointers
+ * to a ConfigVariable list, before calling the outer recursion level. Any
+ * name-value pairs read from the input file(s) will be appended to the list.
+ * Error reports will also be appended to the list, if elevel < ERROR.
+ *
+ * Returns TRUE if successful, FALSE if an error occurred. The error has
+ * already been ereport'd, it is only necessary for the caller to clean up
+ * its own state and release the ConfigVariable list.
+ *
+ * Note: if elevel >= ERROR then an error will not return control to the
+ * caller, so there is no need to check the return value in that case.
+ *
+ * Note: this function is used to parse not only postgresql.conf, but
+ * various other configuration files that use the same "name = value"
+ * syntax. Hence, do not do anything here or in the subsidiary routines
+ * ParseConfigFile/ParseConfigDirectory that assumes we are processing
+ * GUCs specifically.
+ */
+bool
+ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel,
+ ConfigVariable **head_p, ConfigVariable **tail_p)
+{
+ volatile bool OK = true;
+ unsigned int save_ConfigFileLineno = ConfigFileLineno;
+ sigjmp_buf *save_GUC_flex_fatal_jmp = GUC_flex_fatal_jmp;
+ sigjmp_buf flex_fatal_jmp;
+ volatile YY_BUFFER_STATE lex_buffer = NULL;
+ int errorcount;
+ int token;
+
+ if (sigsetjmp(flex_fatal_jmp, 1) == 0)
+ GUC_flex_fatal_jmp = &flex_fatal_jmp;
+ else
+ {
+ /*
+ * Regain control after a fatal, internal flex error. It may have
+ * corrupted parser state. Consequently, abandon the file, but trust
+ * that the state remains sane enough for yy_delete_buffer().
+ */
+ elog(elevel, "%s at file \"%s\" line %u",
+ GUC_flex_fatal_errmsg, config_file, ConfigFileLineno);
+ record_config_file_error(GUC_flex_fatal_errmsg,
+ config_file, ConfigFileLineno,
+ head_p, tail_p);
+ OK = false;
+ goto cleanup;
+ }
+
+ /*
+ * Parse
+ */
+ ConfigFileLineno = 1;
+ errorcount = 0;
+
+ lex_buffer = yy_create_buffer(fp, YY_BUF_SIZE);
+ yy_switch_to_buffer(lex_buffer);
+
+ /* This loop iterates once per logical line */
+ while ((token = yylex()))
+ {
+ char *opt_name = NULL;
+ char *opt_value = NULL;
+ ConfigVariable *item;
+
+ if (token == GUC_EOL) /* empty or comment line */
+ continue;
+
+ /* first token on line is option name */
+ if (token != GUC_ID && token != GUC_QUALIFIED_ID)
+ goto parse_error;
+ opt_name = pstrdup(yytext);
+
+ /* next we have an optional equal sign; discard if present */
+ token = yylex();
+ if (token == GUC_EQUALS)
+ token = yylex();
+
+ /* now we must have the option value */
+ if (token != GUC_ID &&
+ token != GUC_STRING &&
+ token != GUC_INTEGER &&
+ token != GUC_REAL &&
+ token != GUC_UNQUOTED_STRING)
+ goto parse_error;
+ if (token == GUC_STRING) /* strip quotes and escapes */
+ opt_value = DeescapeQuotedString(yytext);
+ else
+ opt_value = pstrdup(yytext);
+
+ /* now we'd like an end of line, or possibly EOF */
+ token = yylex();
+ if (token != GUC_EOL)
+ {
+ if (token != 0)
+ goto parse_error;
+ /* treat EOF like \n for line numbering purposes, cf bug 4752 */
+ ConfigFileLineno++;
+ }
+
+ /* OK, process the option name and value */
+ if (guc_name_compare(opt_name, "include_dir") == 0)
+ {
+ /*
+ * An include_dir directive isn't a variable and should be
+ * processed immediately.
+ */
+ if (!ParseConfigDirectory(opt_value,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else if (guc_name_compare(opt_name, "include_if_exists") == 0)
+ {
+ /*
+ * An include_if_exists directive isn't a variable and should be
+ * processed immediately.
+ */
+ if (!ParseConfigFile(opt_value, false,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else if (guc_name_compare(opt_name, "include") == 0)
+ {
+ /*
+ * An include directive isn't a variable and should be processed
+ * immediately.
+ */
+ if (!ParseConfigFile(opt_value, true,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else
+ {
+ /* ordinary variable, append to list */
+ item = palloc(sizeof *item);
+ item->name = opt_name;
+ item->value = opt_value;
+ item->errmsg = NULL;
+ item->filename = pstrdup(config_file);
+ item->sourceline = ConfigFileLineno - 1;
+ item->ignore = false;
+ item->applied = false;
+ item->next = NULL;
+ if (*head_p == NULL)
+ *head_p = item;
+ else
+ (*tail_p)->next = item;
+ *tail_p = item;
+ }
+
+ /* break out of loop if read EOF, else loop for next line */
+ if (token == 0)
+ break;
+ continue;
+
+parse_error:
+ /* release storage if we allocated any on this line */
+ if (opt_name)
+ pfree(opt_name);
+ if (opt_value)
+ pfree(opt_value);
+
+ /* report the error */
+ if (token == GUC_EOL || token == 0)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in file \"%s\" line %u, near end of line",
+ config_file, ConfigFileLineno - 1)));
+ record_config_file_error("syntax error",
+ config_file, ConfigFileLineno - 1,
+ head_p, tail_p);
+ }
+ else
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in file \"%s\" line %u, near token \"%s\"",
+ config_file, ConfigFileLineno, yytext)));
+ record_config_file_error("syntax error",
+ config_file, ConfigFileLineno,
+ head_p, tail_p);
+ }
+ OK = false;
+ errorcount++;
+
+ /*
+ * To avoid producing too much noise when fed a totally bogus file,
+ * give up after 100 syntax errors per file (an arbitrary number).
+ * Also, if we're only logging the errors at DEBUG level anyway, might
+ * as well give up immediately. (This prevents postmaster children
+ * from bloating the logs with duplicate complaints.)
+ */
+ if (errorcount >= 100 || elevel <= DEBUG1)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many syntax errors found, abandoning file \"%s\"",
+ config_file)));
+ break;
+ }
+
+ /* resync to next end-of-line or EOF */
+ while (token != GUC_EOL && token != 0)
+ token = yylex();
+ /* break out of loop on EOF */
+ if (token == 0)
+ break;
+ }
+
+cleanup:
+ yy_delete_buffer(lex_buffer);
+ /* Each recursion level must save and restore these static variables. */
+ ConfigFileLineno = save_ConfigFileLineno;
+ GUC_flex_fatal_jmp = save_GUC_flex_fatal_jmp;
+ return OK;
+}
+
+/*
+ * Read and parse all config files in a subdirectory in alphabetical order
+ *
+ * includedir is the absolute or relative path to the subdirectory to scan.
+ *
+ * calling_file/calling_lineno identify the source of the request.
+ * Pass NULL/0 if not recursing from an inclusion request.
+ *
+ * See ParseConfigFp for further details.
+ */
+bool
+ParseConfigDirectory(const char *includedir,
+ const char *calling_file, int calling_lineno,
+ int depth, int elevel,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ char *directory;
+ DIR *d;
+ struct dirent *de;
+ char **filenames;
+ int num_filenames;
+ int size_filenames;
+ bool status;
+
+ /*
+ * Reject directory name that is all-blank (including empty), as that
+ * leads to confusion --- we'd read the containing directory, typically
+ * resulting in recursive inclusion of the same file(s).
+ */
+ if (strspn(includedir, " \t\r\n") == strlen(includedir))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("empty configuration directory name: \"%s\"",
+ includedir)));
+ record_config_file_error("empty configuration directory name",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ /*
+ * We don't check for recursion or too-deep nesting depth here; the
+ * subsequent calls to ParseConfigFile will take care of that.
+ */
+
+ directory = AbsoluteConfigLocation(includedir, calling_file);
+ d = AllocateDir(directory);
+ if (d == NULL)
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open configuration directory \"%s\": %m",
+ directory)));
+ record_config_file_error(psprintf("could not open directory \"%s\"",
+ directory),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ status = false;
+ goto cleanup;
+ }
+
+ /*
+ * Read the directory and put the filenames in an array, so we can sort
+ * them prior to processing the contents.
+ */
+ size_filenames = 32;
+ filenames = (char **) palloc(size_filenames * sizeof(char *));
+ num_filenames = 0;
+
+ while ((de = ReadDir(d, directory)) != NULL)
+ {
+ struct stat st;
+ char filename[MAXPGPATH];
+
+ /*
+ * Only parse files with names ending in ".conf". Explicitly reject
+ * files starting with ".". This excludes things like "." and "..",
+ * as well as typical hidden files, backup files, and editor debris.
+ */
+ if (strlen(de->d_name) < 6)
+ continue;
+ if (de->d_name[0] == '.')
+ continue;
+ if (strcmp(de->d_name + strlen(de->d_name) - 5, ".conf") != 0)
+ continue;
+
+ join_path_components(filename, directory, de->d_name);
+ canonicalize_path(filename);
+ if (stat(filename, &st) == 0)
+ {
+ if (!S_ISDIR(st.st_mode))
+ {
+ /* Add file to array, increasing its size in blocks of 32 */
+ if (num_filenames >= size_filenames)
+ {
+ size_filenames += 32;
+ filenames = (char **) repalloc(filenames,
+ size_filenames * sizeof(char *));
+ }
+ filenames[num_filenames] = pstrdup(filename);
+ num_filenames++;
+ }
+ }
+ else
+ {
+ /*
+ * stat does not care about permissions, so the most likely reason
+ * a file can't be accessed now is if it was removed between the
+ * directory listing and now.
+ */
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m",
+ filename)));
+ record_config_file_error(psprintf("could not stat file \"%s\"",
+ filename),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ status = false;
+ goto cleanup;
+ }
+ }
+
+ if (num_filenames > 0)
+ {
+ int i;
+
+ qsort(filenames, num_filenames, sizeof(char *), pg_qsort_strcmp);
+ for (i = 0; i < num_filenames; i++)
+ {
+ if (!ParseConfigFile(filenames[i], true,
+ calling_file, calling_lineno,
+ depth, elevel,
+ head_p, tail_p))
+ {
+ status = false;
+ goto cleanup;
+ }
+ }
+ }
+ status = true;
+
+cleanup:
+ if (d)
+ FreeDir(d);
+ pfree(directory);
+ return status;
+}
+
+/*
+ * Free a list of ConfigVariables, including the names and the values
+ */
+void
+FreeConfigVariables(ConfigVariable *list)
+{
+ ConfigVariable *item;
+
+ item = list;
+ while (item)
+ {
+ ConfigVariable *next = item->next;
+
+ FreeConfigVariable(item);
+ item = next;
+ }
+}
+
+/*
+ * Free a single ConfigVariable
+ */
+static void
+FreeConfigVariable(ConfigVariable *item)
+{
+ if (item->name)
+ pfree(item->name);
+ if (item->value)
+ pfree(item->value);
+ if (item->errmsg)
+ pfree(item->errmsg);
+ if (item->filename)
+ pfree(item->filename);
+ pfree(item);
+}
+
+
+/*
+ * DeescapeQuotedString
+ *
+ * Strip the quotes surrounding the given string, and collapse any embedded
+ * '' sequences and backslash escapes.
+ *
+ * The string returned is palloc'd and should eventually be pfree'd by the
+ * caller.
+ *
+ * This is exported because it is also used by the bootstrap scanner.
+ */
+char *
+DeescapeQuotedString(const char *s)
+{
+ char *newStr;
+ int len,
+ i,
+ j;
+
+ /* We just Assert that there are leading and trailing quotes */
+ Assert(s != NULL && s[0] == '\'');
+ len = strlen(s);
+ Assert(len >= 2);
+ Assert(s[len - 1] == '\'');
+
+ /* Skip the leading quote; we'll handle the trailing quote below */
+ s++, len--;
+
+ /* Since len still includes trailing quote, this is enough space */
+ newStr = palloc(len);
+
+ for (i = 0, j = 0; i < len; i++)
+ {
+ if (s[i] == '\\')
+ {
+ i++;
+ switch (s[i])
+ {
+ case 'b':
+ newStr[j] = '\b';
+ break;
+ case 'f':
+ newStr[j] = '\f';
+ break;
+ case 'n':
+ newStr[j] = '\n';
+ break;
+ case 'r':
+ newStr[j] = '\r';
+ break;
+ case 't':
+ newStr[j] = '\t';
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ int k;
+ long octVal = 0;
+
+ for (k = 0;
+ s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
+ k++)
+ octVal = (octVal << 3) + (s[i + k] - '0');
+ i += k - 1;
+ newStr[j] = ((char) octVal);
+ }
+ break;
+ default:
+ newStr[j] = s[i];
+ break;
+ } /* switch */
+ }
+ else if (s[i] == '\'' && s[i + 1] == '\'')
+ {
+ /* doubled quote becomes just one quote */
+ newStr[j] = s[++i];
+ }
+ else
+ newStr[j] = s[i];
+ j++;
+ }
+
+ /* We copied the ending quote to newStr, so replace with \0 */
+ Assert(j > 0 && j <= len);
+ newStr[--j] = '\0';
+
+ return newStr;
+}
+
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
new file mode 100644
index 0000000..ce56338
--- /dev/null
+++ b/src/backend/utils/misc/guc-file.l
@@ -0,0 +1,1227 @@
+/* -*-pgsql-c-*- */
+/*
+ * Scanner for the configuration file
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/misc/guc-file.l
+ */
+
+%{
+
+#include "postgres.h"
+
+#include <ctype.h>
+#include <unistd.h>
+
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "storage/fd.h"
+#include "utils/guc.h"
+
+
+/*
+ * flex emits a yy_fatal_error() function that it calls in response to
+ * critical errors like malloc failure, file I/O errors, and detection of
+ * internal inconsistency. That function prints a message and calls exit().
+ * Mutate it to instead call our handler, which jumps out of the parser.
+ */
+#undef fprintf
+#define fprintf(file, fmt, msg) GUC_flex_fatal(msg)
+
+enum
+{
+ GUC_ID = 1,
+ GUC_STRING = 2,
+ GUC_INTEGER = 3,
+ GUC_REAL = 4,
+ GUC_EQUALS = 5,
+ GUC_UNQUOTED_STRING = 6,
+ GUC_QUALIFIED_ID = 7,
+ GUC_EOL = 99,
+ GUC_ERROR = 100
+};
+
+static unsigned int ConfigFileLineno;
+static const char *GUC_flex_fatal_errmsg;
+static sigjmp_buf *GUC_flex_fatal_jmp;
+
+static void FreeConfigVariable(ConfigVariable *item);
+
+static void record_config_file_error(const char *errmsg,
+ const char *config_file,
+ int lineno,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p);
+
+static int GUC_flex_fatal(const char *msg);
+
+/* LCOV_EXCL_START */
+
+%}
+
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="GUC_yy"
+
+
+SIGN ("-"|"+")
+DIGIT [0-9]
+HEXDIGIT [0-9a-fA-F]
+
+UNIT_LETTER [a-zA-Z]
+
+INTEGER {SIGN}?({DIGIT}+|0x{HEXDIGIT}+){UNIT_LETTER}*
+
+EXPONENT [Ee]{SIGN}?{DIGIT}+
+REAL {SIGN}?{DIGIT}*"."{DIGIT}*{EXPONENT}?
+
+LETTER [A-Za-z_\200-\377]
+LETTER_OR_DIGIT [A-Za-z_0-9\200-\377]
+
+ID {LETTER}{LETTER_OR_DIGIT}*
+QUALIFIED_ID {ID}"."{ID}
+
+UNQUOTED_STRING {LETTER}({LETTER_OR_DIGIT}|[-._:/])*
+STRING \'([^'\\\n]|\\.|\'\')*\'
+
+%%
+
+\n ConfigFileLineno++; return GUC_EOL;
+[ \t\r]+ /* eat whitespace */
+#.* /* eat comment (.* matches anything until newline) */
+
+{ID} return GUC_ID;
+{QUALIFIED_ID} return GUC_QUALIFIED_ID;
+{STRING} return GUC_STRING;
+{UNQUOTED_STRING} return GUC_UNQUOTED_STRING;
+{INTEGER} return GUC_INTEGER;
+{REAL} return GUC_REAL;
+= return GUC_EQUALS;
+
+. return GUC_ERROR;
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Exported function to read and process the configuration file. The
+ * parameter indicates in what context the file is being read --- either
+ * postmaster startup (including standalone-backend startup) or SIGHUP.
+ * All options mentioned in the configuration file are set to new values.
+ * If a hard error occurs, no values will be changed. (There can also be
+ * errors that prevent just one value from being changed.)
+ */
+void
+ProcessConfigFile(GucContext context)
+{
+ int elevel;
+ MemoryContext config_cxt;
+ MemoryContext caller_cxt;
+
+ /*
+ * Config files are processed on startup (by the postmaster only) and on
+ * SIGHUP (by the postmaster and its children)
+ */
+ Assert((context == PGC_POSTMASTER && !IsUnderPostmaster) ||
+ context == PGC_SIGHUP);
+
+ /*
+ * To avoid cluttering the log, only the postmaster bleats loudly about
+ * problems with the config file.
+ */
+ elevel = IsUnderPostmaster ? DEBUG2 : LOG;
+
+ /*
+ * This function is usually called within a process-lifespan memory
+ * context. To ensure that any memory leaked during GUC processing does
+ * not accumulate across repeated SIGHUP cycles, do the work in a private
+ * context that we can free at exit.
+ */
+ config_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "config file processing",
+ ALLOCSET_DEFAULT_SIZES);
+ caller_cxt = MemoryContextSwitchTo(config_cxt);
+
+ /*
+ * Read and apply the config file. We don't need to examine the result.
+ */
+ (void) ProcessConfigFileInternal(context, true, elevel);
+
+ /* Clean up */
+ MemoryContextSwitchTo(caller_cxt);
+ MemoryContextDelete(config_cxt);
+}
+
+/*
+ * This function handles both actual config file (re)loads and execution of
+ * show_all_file_settings() (i.e., the pg_file_settings view). In the latter
+ * case we don't apply any of the settings, but we make all the usual validity
+ * checks, and we return the ConfigVariable list so that it can be printed out
+ * by show_all_file_settings().
+ */
+static ConfigVariable *
+ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
+{
+ bool error = false;
+ bool applying = false;
+ const char *ConfFileWithError;
+ ConfigVariable *item,
+ *head,
+ *tail;
+ int i;
+
+ /* Parse the main config file into a list of option names and values */
+ ConfFileWithError = ConfigFileName;
+ head = tail = NULL;
+
+ if (!ParseConfigFile(ConfigFileName, true,
+ NULL, 0, 0, elevel,
+ &head, &tail))
+ {
+ /* Syntax error(s) detected in the file, so bail out */
+ error = true;
+ goto bail_out;
+ }
+
+ /*
+ * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
+ * replace any parameters set by ALTER SYSTEM command. Because this file
+ * is in the data directory, we can't read it until the DataDir has been
+ * set.
+ */
+ if (DataDir)
+ {
+ if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
+ NULL, 0, 0, elevel,
+ &head, &tail))
+ {
+ /* Syntax error(s) detected in the file, so bail out */
+ error = true;
+ ConfFileWithError = PG_AUTOCONF_FILENAME;
+ goto bail_out;
+ }
+ }
+ else
+ {
+ /*
+ * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
+ * read. In this case, we don't want to accept any settings but
+ * data_directory from postgresql.conf, because they might be
+ * overwritten with settings in the PG_AUTOCONF_FILENAME file which
+ * will be read later. OTOH, since data_directory isn't allowed in the
+ * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
+ */
+ ConfigVariable *newlist = NULL;
+
+ /*
+ * Prune all items except the last "data_directory" from the list.
+ */
+ for (item = head; item; item = item->next)
+ {
+ if (!item->ignore &&
+ strcmp(item->name, "data_directory") == 0)
+ newlist = item;
+ }
+
+ if (newlist)
+ newlist->next = NULL;
+ head = tail = newlist;
+
+ /*
+ * Quick exit if data_directory is not present in file.
+ *
+ * We need not do any further processing, in particular we don't set
+ * PgReloadTime; that will be set soon by subsequent full loading of
+ * the config file.
+ */
+ if (head == NULL)
+ goto bail_out;
+ }
+
+ /*
+ * Mark all extant GUC variables as not present in the config file. We
+ * need this so that we can tell below which ones have been removed from
+ * the file since we last processed it.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+
+ gconf->status &= ~GUC_IS_IN_FILE;
+ }
+
+ /*
+ * Check if all the supplied option names are valid, as an additional
+ * quasi-syntactic check on the validity of the config file. It is
+ * important that the postmaster and all backends agree on the results of
+ * this phase, else we will have strange inconsistencies about which
+ * processes accept a config file update and which don't. Hence, unknown
+ * custom variable names have to be accepted without complaint. For the
+ * same reason, we don't attempt to validate the options' values here.
+ *
+ * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
+ * variable mentioned in the file; and we detect duplicate entries in the
+ * file and mark the earlier occurrences as ignorable.
+ */
+ for (item = head; item; item = item->next)
+ {
+ struct config_generic *record;
+
+ /* Ignore anything already marked as ignorable */
+ if (item->ignore)
+ continue;
+
+ /*
+ * Try to find the variable; but do not create a custom placeholder if
+ * it's not there already.
+ */
+ record = find_option(item->name, false, true, elevel);
+
+ if (record)
+ {
+ /* If it's already marked, then this is a duplicate entry */
+ if (record->status & GUC_IS_IN_FILE)
+ {
+ /*
+ * Mark the earlier occurrence(s) as dead/ignorable. We could
+ * avoid the O(N^2) behavior here with some additional state,
+ * but it seems unlikely to be worth the trouble.
+ */
+ ConfigVariable *pitem;
+
+ for (pitem = head; pitem != item; pitem = pitem->next)
+ {
+ if (!pitem->ignore &&
+ strcmp(pitem->name, item->name) == 0)
+ pitem->ignore = true;
+ }
+ }
+ /* Now mark it as present in file */
+ record->status |= GUC_IS_IN_FILE;
+ }
+ else if (!valid_custom_variable_name(item->name))
+ {
+ /* Invalid non-custom variable, so complain */
+ ereport(elevel,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %d",
+ item->name,
+ item->filename, item->sourceline)));
+ item->errmsg = pstrdup("unrecognized configuration parameter");
+ error = true;
+ ConfFileWithError = item->filename;
+ }
+ }
+
+ /*
+ * If we've detected any errors so far, we don't want to risk applying any
+ * changes.
+ */
+ if (error)
+ goto bail_out;
+
+ /* Otherwise, set flag that we're beginning to apply changes */
+ applying = true;
+
+ /*
+ * Check for variables having been removed from the config file, and
+ * revert their reset values (and perhaps also effective values) to the
+ * boot-time defaults. If such a variable can't be changed after startup,
+ * report that and continue.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+ GucStack *stack;
+
+ if (gconf->reset_source != PGC_S_FILE ||
+ (gconf->status & GUC_IS_IN_FILE))
+ continue;
+ if (gconf->context < PGC_SIGHUP)
+ {
+ /* The removal can't be effective without a restart */
+ gconf->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ gconf->name)));
+ record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
+ gconf->name),
+ NULL, 0,
+ &head, &tail);
+ error = true;
+ continue;
+ }
+
+ /* No more to do if we're just doing show_all_file_settings() */
+ if (!applySettings)
+ continue;
+
+ /*
+ * Reset any "file" sources to "default", else set_config_option will
+ * not override those settings.
+ */
+ if (gconf->reset_source == PGC_S_FILE)
+ gconf->reset_source = PGC_S_DEFAULT;
+ if (gconf->source == PGC_S_FILE)
+ gconf->source = PGC_S_DEFAULT;
+ for (stack = gconf->stack; stack; stack = stack->prev)
+ {
+ if (stack->source == PGC_S_FILE)
+ stack->source = PGC_S_DEFAULT;
+ }
+
+ /* Now we can re-apply the wired-in default (i.e., the boot_val) */
+ if (set_config_option(gconf->name, NULL,
+ context, PGC_S_DEFAULT,
+ GUC_ACTION_SET, true, 0, false) > 0)
+ {
+ /* Log the change if appropriate */
+ if (context == PGC_SIGHUP)
+ ereport(elevel,
+ (errmsg("parameter \"%s\" removed from configuration file, reset to default",
+ gconf->name)));
+ }
+ }
+
+ /*
+ * Restore any variables determined by environment variables or
+ * dynamically-computed defaults. This is a no-op except in the case
+ * where one of these had been in the config file and is now removed.
+ *
+ * In particular, we *must not* do this during the postmaster's initial
+ * loading of the file, since the timezone functions in particular should
+ * be run only after initialization is complete.
+ *
+ * XXX this is an unmaintainable crock, because we have to know how to set
+ * (or at least what to call to set) every non-PGC_INTERNAL variable that
+ * could potentially have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source.
+ */
+ if (context == PGC_SIGHUP && applySettings)
+ {
+ InitializeGUCOptionsFromEnvironment();
+ pg_timezone_abbrev_initialize();
+ /* this selects SQL_ASCII in processes not connected to a database */
+ SetConfigOption("client_encoding", GetDatabaseEncodingName(),
+ PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
+ }
+
+ /*
+ * Now apply the values from the config file.
+ */
+ for (item = head; item; item = item->next)
+ {
+ char *pre_value = NULL;
+ int scres;
+
+ /* Ignore anything marked as ignorable */
+ if (item->ignore)
+ continue;
+
+ /* In SIGHUP cases in the postmaster, we want to report changes */
+ if (context == PGC_SIGHUP && applySettings && !IsUnderPostmaster)
+ {
+ const char *preval = GetConfigOption(item->name, true, false);
+
+ /* If option doesn't exist yet or is NULL, treat as empty string */
+ if (!preval)
+ preval = "";
+ /* must dup, else might have dangling pointer below */
+ pre_value = pstrdup(preval);
+ }
+
+ scres = set_config_option(item->name, item->value,
+ context, PGC_S_FILE,
+ GUC_ACTION_SET, applySettings, 0, false);
+ if (scres > 0)
+ {
+ /* variable was updated, so log the change if appropriate */
+ if (pre_value)
+ {
+ const char *post_value = GetConfigOption(item->name, true, false);
+
+ if (!post_value)
+ post_value = "";
+ if (strcmp(pre_value, post_value) != 0)
+ ereport(elevel,
+ (errmsg("parameter \"%s\" changed to \"%s\"",
+ item->name, item->value)));
+ }
+ item->applied = true;
+ }
+ else if (scres == 0)
+ {
+ error = true;
+ item->errmsg = pstrdup("setting could not be applied");
+ ConfFileWithError = item->filename;
+ }
+ else
+ {
+ /* no error, but variable's active value was not changed */
+ item->applied = true;
+ }
+
+ /*
+ * We should update source location unless there was an error, since
+ * even if the active value didn't change, the reset value might have.
+ * (In the postmaster, there won't be a difference, but it does matter
+ * in backends.)
+ */
+ if (scres != 0 && applySettings)
+ set_config_sourcefile(item->name, item->filename,
+ item->sourceline);
+
+ if (pre_value)
+ pfree(pre_value);
+ }
+
+ /* Remember when we last successfully loaded the config file. */
+ if (applySettings)
+ PgReloadTime = GetCurrentTimestamp();
+
+bail_out:
+ if (error && applySettings)
+ {
+ /* During postmaster startup, any error is fatal */
+ if (context == PGC_POSTMASTER)
+ ereport(ERROR,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors",
+ ConfFileWithError)));
+ else if (applying)
+ ereport(elevel,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
+ ConfFileWithError)));
+ else
+ ereport(elevel,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("configuration file \"%s\" contains errors; no changes were applied",
+ ConfFileWithError)));
+ }
+
+ /* Successful or otherwise, return the collected data list */
+ return head;
+}
+
+/*
+ * Given a configuration file or directory location that may be a relative
+ * path, return an absolute one. We consider the location to be relative to
+ * the directory holding the calling file, or to DataDir if no calling file.
+ */
+static char *
+AbsoluteConfigLocation(const char *location, const char *calling_file)
+{
+ char abs_path[MAXPGPATH];
+
+ if (is_absolute_path(location))
+ return pstrdup(location);
+ else
+ {
+ if (calling_file != NULL)
+ {
+ strlcpy(abs_path, calling_file, sizeof(abs_path));
+ get_parent_directory(abs_path);
+ join_path_components(abs_path, abs_path, location);
+ canonicalize_path(abs_path);
+ }
+ else
+ {
+ AssertState(DataDir);
+ join_path_components(abs_path, DataDir, location);
+ canonicalize_path(abs_path);
+ }
+ return pstrdup(abs_path);
+ }
+}
+
+/*
+ * Read and parse a single configuration file. This function recurses
+ * to handle "include" directives.
+ *
+ * If "strict" is true, treat failure to open the config file as an error,
+ * otherwise just skip the file.
+ *
+ * calling_file/calling_lineno identify the source of the request.
+ * Pass NULL/0 if not recursing from an inclusion request.
+ *
+ * See ParseConfigFp for further details. This one merely adds opening the
+ * config file rather than working from a caller-supplied file descriptor,
+ * and absolute-ifying the path name if necessary.
+ */
+bool
+ParseConfigFile(const char *config_file, bool strict,
+ const char *calling_file, int calling_lineno,
+ int depth, int elevel,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ char *abs_path;
+ bool OK = true;
+ FILE *fp;
+
+ /*
+ * Reject file name that is all-blank (including empty), as that leads to
+ * confusion --- we'd try to read the containing directory as a file.
+ */
+ if (strspn(config_file, " \t\r\n") == strlen(config_file))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("empty configuration file name: \"%s\"",
+ config_file)));
+ record_config_file_error("empty configuration file name",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ /*
+ * Reject too-deep include nesting depth. This is just a safety check to
+ * avoid dumping core due to stack overflow if an include file loops back
+ * to itself. The maximum nesting depth is pretty arbitrary.
+ */
+ if (depth > 10)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("could not open configuration file \"%s\": maximum nesting depth exceeded",
+ config_file)));
+ record_config_file_error("nesting depth exceeded",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ abs_path = AbsoluteConfigLocation(config_file, calling_file);
+
+ /*
+ * Reject direct recursion. Indirect recursion is also possible, but it's
+ * harder to detect and so doesn't seem worth the trouble. (We test at
+ * this step because the canonicalization done by AbsoluteConfigLocation
+ * makes it more likely that a simple strcmp comparison will match.)
+ */
+ if (calling_file && strcmp(abs_path, calling_file) == 0)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("configuration file recursion in \"%s\"",
+ calling_file)));
+ record_config_file_error("configuration file recursion",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ pfree(abs_path);
+ return false;
+ }
+
+ fp = AllocateFile(abs_path, "r");
+ if (!fp)
+ {
+ if (strict)
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open configuration file \"%s\": %m",
+ abs_path)));
+ record_config_file_error(psprintf("could not open file \"%s\"",
+ abs_path),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ OK = false;
+ }
+ else
+ {
+ ereport(LOG,
+ (errmsg("skipping missing configuration file \"%s\"",
+ abs_path)));
+ }
+ goto cleanup;
+ }
+
+ OK = ParseConfigFp(fp, abs_path, depth, elevel, head_p, tail_p);
+
+cleanup:
+ if (fp)
+ FreeFile(fp);
+ pfree(abs_path);
+
+ return OK;
+}
+
+/*
+ * Capture an error message in the ConfigVariable list returned by
+ * config file parsing.
+ */
+static void
+record_config_file_error(const char *errmsg,
+ const char *config_file,
+ int lineno,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ ConfigVariable *item;
+
+ item = palloc(sizeof *item);
+ item->name = NULL;
+ item->value = NULL;
+ item->errmsg = pstrdup(errmsg);
+ item->filename = config_file ? pstrdup(config_file) : NULL;
+ item->sourceline = lineno;
+ item->ignore = true;
+ item->applied = false;
+ item->next = NULL;
+ if (*head_p == NULL)
+ *head_p = item;
+ else
+ (*tail_p)->next = item;
+ *tail_p = item;
+}
+
+/*
+ * Flex fatal errors bring us here. Stash the error message and jump back to
+ * ParseConfigFp(). Assume all msg arguments point to string constants; this
+ * holds for flex 2.5.31 (earliest we support) and flex 2.5.35 (latest as of
+ * this writing). Otherwise, we would need to copy the message.
+ *
+ * We return "int" since this takes the place of calls to fprintf().
+*/
+static int
+GUC_flex_fatal(const char *msg)
+{
+ GUC_flex_fatal_errmsg = msg;
+ siglongjmp(*GUC_flex_fatal_jmp, 1);
+ return 0; /* keep compiler quiet */
+}
+
+/*
+ * Read and parse a single configuration file. This function recurses
+ * to handle "include" directives.
+ *
+ * Input parameters:
+ * fp: file pointer from AllocateFile for the configuration file to parse
+ * config_file: absolute or relative path name of the configuration file
+ * depth: recursion depth (should be 0 in the outermost call)
+ * elevel: error logging level to use
+ * Input/Output parameters:
+ * head_p, tail_p: head and tail of linked list of name/value pairs
+ *
+ * *head_p and *tail_p must be initialized, either to NULL or valid pointers
+ * to a ConfigVariable list, before calling the outer recursion level. Any
+ * name-value pairs read from the input file(s) will be appended to the list.
+ * Error reports will also be appended to the list, if elevel < ERROR.
+ *
+ * Returns TRUE if successful, FALSE if an error occurred. The error has
+ * already been ereport'd, it is only necessary for the caller to clean up
+ * its own state and release the ConfigVariable list.
+ *
+ * Note: if elevel >= ERROR then an error will not return control to the
+ * caller, so there is no need to check the return value in that case.
+ *
+ * Note: this function is used to parse not only postgresql.conf, but
+ * various other configuration files that use the same "name = value"
+ * syntax. Hence, do not do anything here or in the subsidiary routines
+ * ParseConfigFile/ParseConfigDirectory that assumes we are processing
+ * GUCs specifically.
+ */
+bool
+ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel,
+ ConfigVariable **head_p, ConfigVariable **tail_p)
+{
+ volatile bool OK = true;
+ unsigned int save_ConfigFileLineno = ConfigFileLineno;
+ sigjmp_buf *save_GUC_flex_fatal_jmp = GUC_flex_fatal_jmp;
+ sigjmp_buf flex_fatal_jmp;
+ volatile YY_BUFFER_STATE lex_buffer = NULL;
+ int errorcount;
+ int token;
+
+ if (sigsetjmp(flex_fatal_jmp, 1) == 0)
+ GUC_flex_fatal_jmp = &flex_fatal_jmp;
+ else
+ {
+ /*
+ * Regain control after a fatal, internal flex error. It may have
+ * corrupted parser state. Consequently, abandon the file, but trust
+ * that the state remains sane enough for yy_delete_buffer().
+ */
+ elog(elevel, "%s at file \"%s\" line %u",
+ GUC_flex_fatal_errmsg, config_file, ConfigFileLineno);
+ record_config_file_error(GUC_flex_fatal_errmsg,
+ config_file, ConfigFileLineno,
+ head_p, tail_p);
+ OK = false;
+ goto cleanup;
+ }
+
+ /*
+ * Parse
+ */
+ ConfigFileLineno = 1;
+ errorcount = 0;
+
+ lex_buffer = yy_create_buffer(fp, YY_BUF_SIZE);
+ yy_switch_to_buffer(lex_buffer);
+
+ /* This loop iterates once per logical line */
+ while ((token = yylex()))
+ {
+ char *opt_name = NULL;
+ char *opt_value = NULL;
+ ConfigVariable *item;
+
+ if (token == GUC_EOL) /* empty or comment line */
+ continue;
+
+ /* first token on line is option name */
+ if (token != GUC_ID && token != GUC_QUALIFIED_ID)
+ goto parse_error;
+ opt_name = pstrdup(yytext);
+
+ /* next we have an optional equal sign; discard if present */
+ token = yylex();
+ if (token == GUC_EQUALS)
+ token = yylex();
+
+ /* now we must have the option value */
+ if (token != GUC_ID &&
+ token != GUC_STRING &&
+ token != GUC_INTEGER &&
+ token != GUC_REAL &&
+ token != GUC_UNQUOTED_STRING)
+ goto parse_error;
+ if (token == GUC_STRING) /* strip quotes and escapes */
+ opt_value = DeescapeQuotedString(yytext);
+ else
+ opt_value = pstrdup(yytext);
+
+ /* now we'd like an end of line, or possibly EOF */
+ token = yylex();
+ if (token != GUC_EOL)
+ {
+ if (token != 0)
+ goto parse_error;
+ /* treat EOF like \n for line numbering purposes, cf bug 4752 */
+ ConfigFileLineno++;
+ }
+
+ /* OK, process the option name and value */
+ if (guc_name_compare(opt_name, "include_dir") == 0)
+ {
+ /*
+ * An include_dir directive isn't a variable and should be
+ * processed immediately.
+ */
+ if (!ParseConfigDirectory(opt_value,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else if (guc_name_compare(opt_name, "include_if_exists") == 0)
+ {
+ /*
+ * An include_if_exists directive isn't a variable and should be
+ * processed immediately.
+ */
+ if (!ParseConfigFile(opt_value, false,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else if (guc_name_compare(opt_name, "include") == 0)
+ {
+ /*
+ * An include directive isn't a variable and should be processed
+ * immediately.
+ */
+ if (!ParseConfigFile(opt_value, true,
+ config_file, ConfigFileLineno - 1,
+ depth + 1, elevel,
+ head_p, tail_p))
+ OK = false;
+ yy_switch_to_buffer(lex_buffer);
+ pfree(opt_name);
+ pfree(opt_value);
+ }
+ else
+ {
+ /* ordinary variable, append to list */
+ item = palloc(sizeof *item);
+ item->name = opt_name;
+ item->value = opt_value;
+ item->errmsg = NULL;
+ item->filename = pstrdup(config_file);
+ item->sourceline = ConfigFileLineno - 1;
+ item->ignore = false;
+ item->applied = false;
+ item->next = NULL;
+ if (*head_p == NULL)
+ *head_p = item;
+ else
+ (*tail_p)->next = item;
+ *tail_p = item;
+ }
+
+ /* break out of loop if read EOF, else loop for next line */
+ if (token == 0)
+ break;
+ continue;
+
+parse_error:
+ /* release storage if we allocated any on this line */
+ if (opt_name)
+ pfree(opt_name);
+ if (opt_value)
+ pfree(opt_value);
+
+ /* report the error */
+ if (token == GUC_EOL || token == 0)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in file \"%s\" line %u, near end of line",
+ config_file, ConfigFileLineno - 1)));
+ record_config_file_error("syntax error",
+ config_file, ConfigFileLineno - 1,
+ head_p, tail_p);
+ }
+ else
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("syntax error in file \"%s\" line %u, near token \"%s\"",
+ config_file, ConfigFileLineno, yytext)));
+ record_config_file_error("syntax error",
+ config_file, ConfigFileLineno,
+ head_p, tail_p);
+ }
+ OK = false;
+ errorcount++;
+
+ /*
+ * To avoid producing too much noise when fed a totally bogus file,
+ * give up after 100 syntax errors per file (an arbitrary number).
+ * Also, if we're only logging the errors at DEBUG level anyway, might
+ * as well give up immediately. (This prevents postmaster children
+ * from bloating the logs with duplicate complaints.)
+ */
+ if (errorcount >= 100 || elevel <= DEBUG1)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("too many syntax errors found, abandoning file \"%s\"",
+ config_file)));
+ break;
+ }
+
+ /* resync to next end-of-line or EOF */
+ while (token != GUC_EOL && token != 0)
+ token = yylex();
+ /* break out of loop on EOF */
+ if (token == 0)
+ break;
+ }
+
+cleanup:
+ yy_delete_buffer(lex_buffer);
+ /* Each recursion level must save and restore these static variables. */
+ ConfigFileLineno = save_ConfigFileLineno;
+ GUC_flex_fatal_jmp = save_GUC_flex_fatal_jmp;
+ return OK;
+}
+
+/*
+ * Read and parse all config files in a subdirectory in alphabetical order
+ *
+ * includedir is the absolute or relative path to the subdirectory to scan.
+ *
+ * calling_file/calling_lineno identify the source of the request.
+ * Pass NULL/0 if not recursing from an inclusion request.
+ *
+ * See ParseConfigFp for further details.
+ */
+bool
+ParseConfigDirectory(const char *includedir,
+ const char *calling_file, int calling_lineno,
+ int depth, int elevel,
+ ConfigVariable **head_p,
+ ConfigVariable **tail_p)
+{
+ char *directory;
+ DIR *d;
+ struct dirent *de;
+ char **filenames;
+ int num_filenames;
+ int size_filenames;
+ bool status;
+
+ /*
+ * Reject directory name that is all-blank (including empty), as that
+ * leads to confusion --- we'd read the containing directory, typically
+ * resulting in recursive inclusion of the same file(s).
+ */
+ if (strspn(includedir, " \t\r\n") == strlen(includedir))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("empty configuration directory name: \"%s\"",
+ includedir)));
+ record_config_file_error("empty configuration directory name",
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ return false;
+ }
+
+ /*
+ * We don't check for recursion or too-deep nesting depth here; the
+ * subsequent calls to ParseConfigFile will take care of that.
+ */
+
+ directory = AbsoluteConfigLocation(includedir, calling_file);
+ d = AllocateDir(directory);
+ if (d == NULL)
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open configuration directory \"%s\": %m",
+ directory)));
+ record_config_file_error(psprintf("could not open directory \"%s\"",
+ directory),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ status = false;
+ goto cleanup;
+ }
+
+ /*
+ * Read the directory and put the filenames in an array, so we can sort
+ * them prior to processing the contents.
+ */
+ size_filenames = 32;
+ filenames = (char **) palloc(size_filenames * sizeof(char *));
+ num_filenames = 0;
+
+ while ((de = ReadDir(d, directory)) != NULL)
+ {
+ struct stat st;
+ char filename[MAXPGPATH];
+
+ /*
+ * Only parse files with names ending in ".conf". Explicitly reject
+ * files starting with ".". This excludes things like "." and "..",
+ * as well as typical hidden files, backup files, and editor debris.
+ */
+ if (strlen(de->d_name) < 6)
+ continue;
+ if (de->d_name[0] == '.')
+ continue;
+ if (strcmp(de->d_name + strlen(de->d_name) - 5, ".conf") != 0)
+ continue;
+
+ join_path_components(filename, directory, de->d_name);
+ canonicalize_path(filename);
+ if (stat(filename, &st) == 0)
+ {
+ if (!S_ISDIR(st.st_mode))
+ {
+ /* Add file to array, increasing its size in blocks of 32 */
+ if (num_filenames >= size_filenames)
+ {
+ size_filenames += 32;
+ filenames = (char **) repalloc(filenames,
+ size_filenames * sizeof(char *));
+ }
+ filenames[num_filenames] = pstrdup(filename);
+ num_filenames++;
+ }
+ }
+ else
+ {
+ /*
+ * stat does not care about permissions, so the most likely reason
+ * a file can't be accessed now is if it was removed between the
+ * directory listing and now.
+ */
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m",
+ filename)));
+ record_config_file_error(psprintf("could not stat file \"%s\"",
+ filename),
+ calling_file, calling_lineno,
+ head_p, tail_p);
+ status = false;
+ goto cleanup;
+ }
+ }
+
+ if (num_filenames > 0)
+ {
+ int i;
+
+ qsort(filenames, num_filenames, sizeof(char *), pg_qsort_strcmp);
+ for (i = 0; i < num_filenames; i++)
+ {
+ if (!ParseConfigFile(filenames[i], true,
+ calling_file, calling_lineno,
+ depth, elevel,
+ head_p, tail_p))
+ {
+ status = false;
+ goto cleanup;
+ }
+ }
+ }
+ status = true;
+
+cleanup:
+ if (d)
+ FreeDir(d);
+ pfree(directory);
+ return status;
+}
+
+/*
+ * Free a list of ConfigVariables, including the names and the values
+ */
+void
+FreeConfigVariables(ConfigVariable *list)
+{
+ ConfigVariable *item;
+
+ item = list;
+ while (item)
+ {
+ ConfigVariable *next = item->next;
+
+ FreeConfigVariable(item);
+ item = next;
+ }
+}
+
+/*
+ * Free a single ConfigVariable
+ */
+static void
+FreeConfigVariable(ConfigVariable *item)
+{
+ if (item->name)
+ pfree(item->name);
+ if (item->value)
+ pfree(item->value);
+ if (item->errmsg)
+ pfree(item->errmsg);
+ if (item->filename)
+ pfree(item->filename);
+ pfree(item);
+}
+
+
+/*
+ * DeescapeQuotedString
+ *
+ * Strip the quotes surrounding the given string, and collapse any embedded
+ * '' sequences and backslash escapes.
+ *
+ * The string returned is palloc'd and should eventually be pfree'd by the
+ * caller.
+ *
+ * This is exported because it is also used by the bootstrap scanner.
+ */
+char *
+DeescapeQuotedString(const char *s)
+{
+ char *newStr;
+ int len,
+ i,
+ j;
+
+ /* We just Assert that there are leading and trailing quotes */
+ Assert(s != NULL && s[0] == '\'');
+ len = strlen(s);
+ Assert(len >= 2);
+ Assert(s[len - 1] == '\'');
+
+ /* Skip the leading quote; we'll handle the trailing quote below */
+ s++, len--;
+
+ /* Since len still includes trailing quote, this is enough space */
+ newStr = palloc(len);
+
+ for (i = 0, j = 0; i < len; i++)
+ {
+ if (s[i] == '\\')
+ {
+ i++;
+ switch (s[i])
+ {
+ case 'b':
+ newStr[j] = '\b';
+ break;
+ case 'f':
+ newStr[j] = '\f';
+ break;
+ case 'n':
+ newStr[j] = '\n';
+ break;
+ case 'r':
+ newStr[j] = '\r';
+ break;
+ case 't':
+ newStr[j] = '\t';
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ int k;
+ long octVal = 0;
+
+ for (k = 0;
+ s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
+ k++)
+ octVal = (octVal << 3) + (s[i + k] - '0');
+ i += k - 1;
+ newStr[j] = ((char) octVal);
+ }
+ break;
+ default:
+ newStr[j] = s[i];
+ break;
+ } /* switch */
+ }
+ else if (s[i] == '\'' && s[i + 1] == '\'')
+ {
+ /* doubled quote becomes just one quote */
+ newStr[j] = s[++i];
+ }
+ else
+ newStr[j] = s[i];
+ j++;
+ }
+
+ /* We copied the ending quote to newStr, so replace with \0 */
+ Assert(j > 0 && j <= len);
+ newStr[--j] = '\0';
+
+ return newStr;
+}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
new file mode 100644
index 0000000..0b5b77b
--- /dev/null
+++ b/src/backend/utils/misc/guc.c
@@ -0,0 +1,13003 @@
+/*--------------------------------------------------------------------
+ * guc.c
+ *
+ * Support for grand unified configuration scheme, including SET
+ * command, configuration file, and command line options.
+ * See src/backend/utils/misc/README for more information.
+ *
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ * Written by Peter Eisentraut <peter_e@gmx.net>.
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/guc.c
+ *
+ *--------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <math.h>
+#include <limits.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+#ifndef WIN32
+#include <sys/mman.h>
+#endif
+#include <sys/stat.h>
+#ifdef HAVE_SYSLOG
+#include <syslog.h>
+#endif
+#include <unistd.h>
+
+#include "access/commit_ts.h"
+#include "access/gin.h"
+#include "access/rmgr.h"
+#include "access/tableam.h"
+#include "access/toast_compression.h"
+#include "access/transam.h"
+#include "access/twophase.h"
+#include "access/xact.h"
+#include "access/xlog_internal.h"
+#include "access/xlogprefetcher.h"
+#include "access/xlogrecovery.h"
+#include "catalog/namespace.h"
+#include "catalog/objectaccess.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_parameter_acl.h"
+#include "catalog/storage.h"
+#include "commands/async.h"
+#include "commands/prepare.h"
+#include "commands/tablespace.h"
+#include "commands/trigger.h"
+#include "commands/user.h"
+#include "commands/vacuum.h"
+#include "commands/variable.h"
+#include "common/string.h"
+#include "funcapi.h"
+#include "jit/jit.h"
+#include "libpq/auth.h"
+#include "libpq/libpq.h"
+#include "libpq/pqformat.h"
+#include "miscadmin.h"
+#include "optimizer/cost.h"
+#include "optimizer/geqo.h"
+#include "optimizer/optimizer.h"
+#include "optimizer/paths.h"
+#include "optimizer/planmain.h"
+#include "parser/parse_expr.h"
+#include "parser/parse_type.h"
+#include "parser/parser.h"
+#include "parser/scansup.h"
+#include "pgstat.h"
+#include "postmaster/autovacuum.h"
+#include "postmaster/bgworker_internals.h"
+#include "postmaster/bgwriter.h"
+#include "postmaster/postmaster.h"
+#include "postmaster/startup.h"
+#include "postmaster/syslogger.h"
+#include "postmaster/walwriter.h"
+#include "replication/logicallauncher.h"
+#include "replication/reorderbuffer.h"
+#include "replication/slot.h"
+#include "replication/syncrep.h"
+#include "replication/walreceiver.h"
+#include "replication/walsender.h"
+#include "storage/bufmgr.h"
+#include "storage/dsm_impl.h"
+#include "storage/fd.h"
+#include "storage/large_object.h"
+#include "storage/pg_shmem.h"
+#include "storage/predicate.h"
+#include "storage/proc.h"
+#include "storage/standby.h"
+#include "tcop/tcopprot.h"
+#include "tsearch/ts_cache.h"
+#include "utils/acl.h"
+#include "utils/backend_status.h"
+#include "utils/builtins.h"
+#include "utils/bytea.h"
+#include "utils/float.h"
+#include "utils/guc_tables.h"
+#include "utils/memutils.h"
+#include "utils/pg_locale.h"
+#include "utils/pg_lsn.h"
+#include "utils/plancache.h"
+#include "utils/portal.h"
+#include "utils/ps_status.h"
+#include "utils/queryjumble.h"
+#include "utils/rls.h"
+#include "utils/snapmgr.h"
+#include "utils/tzparser.h"
+#include "utils/inval.h"
+#include "utils/varlena.h"
+#include "utils/xml.h"
+
+#ifndef PG_KRB_SRVTAB
+#define PG_KRB_SRVTAB ""
+#endif
+
+#define CONFIG_FILENAME "postgresql.conf"
+#define HBA_FILENAME "pg_hba.conf"
+#define IDENT_FILENAME "pg_ident.conf"
+
+#ifdef EXEC_BACKEND
+#define CONFIG_EXEC_PARAMS "global/config_exec_params"
+#define CONFIG_EXEC_PARAMS_NEW "global/config_exec_params.new"
+#endif
+
+/*
+ * Precision with which REAL type guc values are to be printed for GUC
+ * serialization.
+ */
+#define REALTYPE_PRECISION 17
+
+/* XXX these should appear in other modules' header files */
+extern bool Log_disconnections;
+extern int CommitDelay;
+extern int CommitSiblings;
+extern char *default_tablespace;
+extern char *temp_tablespaces;
+extern bool ignore_checksum_failure;
+extern bool ignore_invalid_pages;
+extern bool synchronize_seqscans;
+
+#ifdef TRACE_SYNCSCAN
+extern bool trace_syncscan;
+#endif
+#ifdef DEBUG_BOUNDED_SORT
+extern bool optimize_bounded_sort;
+#endif
+
+static int GUC_check_errcode_value;
+
+static List *reserved_class_prefix = NIL;
+
+/* global variables for check hook support */
+char *GUC_check_errmsg_string;
+char *GUC_check_errdetail_string;
+char *GUC_check_errhint_string;
+
+static void do_serialize(char **destptr, Size *maxbytes, const char *fmt,...) pg_attribute_printf(3, 4);
+
+static void set_config_sourcefile(const char *name, char *sourcefile,
+ int sourceline);
+static bool call_bool_check_hook(struct config_bool *conf, bool *newval,
+ void **extra, GucSource source, int elevel);
+static bool call_int_check_hook(struct config_int *conf, int *newval,
+ void **extra, GucSource source, int elevel);
+static bool call_real_check_hook(struct config_real *conf, double *newval,
+ void **extra, GucSource source, int elevel);
+static bool call_string_check_hook(struct config_string *conf, char **newval,
+ void **extra, GucSource source, int elevel);
+static bool call_enum_check_hook(struct config_enum *conf, int *newval,
+ void **extra, GucSource source, int elevel);
+
+static bool check_log_destination(char **newval, void **extra, GucSource source);
+static void assign_log_destination(const char *newval, void *extra);
+
+static bool check_wal_consistency_checking(char **newval, void **extra,
+ GucSource source);
+static void assign_wal_consistency_checking(const char *newval, void *extra);
+
+#ifdef HAVE_SYSLOG
+static int syslog_facility = LOG_LOCAL0;
+#else
+static int syslog_facility = 0;
+#endif
+
+static void assign_syslog_facility(int newval, void *extra);
+static void assign_syslog_ident(const char *newval, void *extra);
+static void assign_session_replication_role(int newval, void *extra);
+static bool check_temp_buffers(int *newval, void **extra, GucSource source);
+static bool check_bonjour(bool *newval, void **extra, GucSource source);
+static bool check_ssl(bool *newval, void **extra, GucSource source);
+static bool check_stage_log_stats(bool *newval, void **extra, GucSource source);
+static bool check_log_stats(bool *newval, void **extra, GucSource source);
+static bool check_canonical_path(char **newval, void **extra, GucSource source);
+static bool check_timezone_abbreviations(char **newval, void **extra, GucSource source);
+static void assign_timezone_abbreviations(const char *newval, void *extra);
+static void pg_timezone_abbrev_initialize(void);
+static const char *show_archive_command(void);
+static void assign_tcp_keepalives_idle(int newval, void *extra);
+static void assign_tcp_keepalives_interval(int newval, void *extra);
+static void assign_tcp_keepalives_count(int newval, void *extra);
+static void assign_tcp_user_timeout(int newval, void *extra);
+static const char *show_tcp_keepalives_idle(void);
+static const char *show_tcp_keepalives_interval(void);
+static const char *show_tcp_keepalives_count(void);
+static const char *show_tcp_user_timeout(void);
+static bool check_maxconnections(int *newval, void **extra, GucSource source);
+static bool check_max_worker_processes(int *newval, void **extra, GucSource source);
+static bool check_autovacuum_max_workers(int *newval, void **extra, GucSource source);
+static bool check_max_wal_senders(int *newval, void **extra, GucSource source);
+static bool check_autovacuum_work_mem(int *newval, void **extra, GucSource source);
+static bool check_effective_io_concurrency(int *newval, void **extra, GucSource source);
+static bool check_maintenance_io_concurrency(int *newval, void **extra, GucSource source);
+static bool check_huge_page_size(int *newval, void **extra, GucSource source);
+static bool check_client_connection_check_interval(int *newval, void **extra, GucSource source);
+static void assign_maintenance_io_concurrency(int newval, void *extra);
+static bool check_application_name(char **newval, void **extra, GucSource source);
+static void assign_application_name(const char *newval, void *extra);
+static bool check_cluster_name(char **newval, void **extra, GucSource source);
+static const char *show_unix_socket_permissions(void);
+static const char *show_log_file_mode(void);
+static const char *show_data_directory_mode(void);
+static const char *show_in_hot_standby(void);
+static bool check_backtrace_functions(char **newval, void **extra, GucSource source);
+static void assign_backtrace_functions(const char *newval, void *extra);
+static bool check_recovery_target_timeline(char **newval, void **extra, GucSource source);
+static void assign_recovery_target_timeline(const char *newval, void *extra);
+static bool check_recovery_target(char **newval, void **extra, GucSource source);
+static void assign_recovery_target(const char *newval, void *extra);
+static bool check_recovery_target_xid(char **newval, void **extra, GucSource source);
+static void assign_recovery_target_xid(const char *newval, void *extra);
+static bool check_recovery_target_time(char **newval, void **extra, GucSource source);
+static void assign_recovery_target_time(const char *newval, void *extra);
+static bool check_recovery_target_name(char **newval, void **extra, GucSource source);
+static void assign_recovery_target_name(const char *newval, void *extra);
+static bool check_recovery_target_lsn(char **newval, void **extra, GucSource source);
+static void assign_recovery_target_lsn(const char *newval, void *extra);
+static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
+static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
+
+/* Private functions in guc-file.l that need to be called from guc.c */
+static ConfigVariable *ProcessConfigFileInternal(GucContext context,
+ bool applySettings, int elevel);
+
+/*
+ * Track whether there were any deferred checks for custom resource managers
+ * specified in wal_consistency_checking.
+ */
+static bool check_wal_consistency_checking_deferred = false;
+
+/*
+ * Options for enum values defined in this module.
+ *
+ * NOTE! Option values may not contain double quotes!
+ */
+
+static const struct config_enum_entry bytea_output_options[] = {
+ {"escape", BYTEA_OUTPUT_ESCAPE, false},
+ {"hex", BYTEA_OUTPUT_HEX, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(bytea_output_options) == (BYTEA_OUTPUT_HEX + 2),
+ "array length mismatch");
+
+/*
+ * We have different sets for client and server message level options because
+ * they sort slightly different (see "log" level), and because "fatal"/"panic"
+ * aren't sensible for client_min_messages.
+ */
+static const struct config_enum_entry client_message_level_options[] = {
+ {"debug5", DEBUG5, false},
+ {"debug4", DEBUG4, false},
+ {"debug3", DEBUG3, false},
+ {"debug2", DEBUG2, false},
+ {"debug1", DEBUG1, false},
+ {"debug", DEBUG2, true},
+ {"log", LOG, false},
+ {"info", INFO, true},
+ {"notice", NOTICE, false},
+ {"warning", WARNING, false},
+ {"error", ERROR, false},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry server_message_level_options[] = {
+ {"debug5", DEBUG5, false},
+ {"debug4", DEBUG4, false},
+ {"debug3", DEBUG3, false},
+ {"debug2", DEBUG2, false},
+ {"debug1", DEBUG1, false},
+ {"debug", DEBUG2, true},
+ {"info", INFO, false},
+ {"notice", NOTICE, false},
+ {"warning", WARNING, false},
+ {"error", ERROR, false},
+ {"log", LOG, false},
+ {"fatal", FATAL, false},
+ {"panic", PANIC, false},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry intervalstyle_options[] = {
+ {"postgres", INTSTYLE_POSTGRES, false},
+ {"postgres_verbose", INTSTYLE_POSTGRES_VERBOSE, false},
+ {"sql_standard", INTSTYLE_SQL_STANDARD, false},
+ {"iso_8601", INTSTYLE_ISO_8601, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(intervalstyle_options) == (INTSTYLE_ISO_8601 + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry log_error_verbosity_options[] = {
+ {"terse", PGERROR_TERSE, false},
+ {"default", PGERROR_DEFAULT, false},
+ {"verbose", PGERROR_VERBOSE, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(log_error_verbosity_options) == (PGERROR_VERBOSE + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry log_statement_options[] = {
+ {"none", LOGSTMT_NONE, false},
+ {"ddl", LOGSTMT_DDL, false},
+ {"mod", LOGSTMT_MOD, false},
+ {"all", LOGSTMT_ALL, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(log_statement_options) == (LOGSTMT_ALL + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry isolation_level_options[] = {
+ {"serializable", XACT_SERIALIZABLE, false},
+ {"repeatable read", XACT_REPEATABLE_READ, false},
+ {"read committed", XACT_READ_COMMITTED, false},
+ {"read uncommitted", XACT_READ_UNCOMMITTED, false},
+ {NULL, 0}
+};
+
+static const struct config_enum_entry session_replication_role_options[] = {
+ {"origin", SESSION_REPLICATION_ROLE_ORIGIN, false},
+ {"replica", SESSION_REPLICATION_ROLE_REPLICA, false},
+ {"local", SESSION_REPLICATION_ROLE_LOCAL, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(session_replication_role_options) == (SESSION_REPLICATION_ROLE_LOCAL + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry syslog_facility_options[] = {
+#ifdef HAVE_SYSLOG
+ {"local0", LOG_LOCAL0, false},
+ {"local1", LOG_LOCAL1, false},
+ {"local2", LOG_LOCAL2, false},
+ {"local3", LOG_LOCAL3, false},
+ {"local4", LOG_LOCAL4, false},
+ {"local5", LOG_LOCAL5, false},
+ {"local6", LOG_LOCAL6, false},
+ {"local7", LOG_LOCAL7, false},
+#else
+ {"none", 0, false},
+#endif
+ {NULL, 0}
+};
+
+static const struct config_enum_entry track_function_options[] = {
+ {"none", TRACK_FUNC_OFF, false},
+ {"pl", TRACK_FUNC_PL, false},
+ {"all", TRACK_FUNC_ALL, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(track_function_options) == (TRACK_FUNC_ALL + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry stats_fetch_consistency[] = {
+ {"none", PGSTAT_FETCH_CONSISTENCY_NONE, false},
+ {"cache", PGSTAT_FETCH_CONSISTENCY_CACHE, false},
+ {"snapshot", PGSTAT_FETCH_CONSISTENCY_SNAPSHOT, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(stats_fetch_consistency) == (PGSTAT_FETCH_CONSISTENCY_SNAPSHOT + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry xmlbinary_options[] = {
+ {"base64", XMLBINARY_BASE64, false},
+ {"hex", XMLBINARY_HEX, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(xmlbinary_options) == (XMLBINARY_HEX + 2),
+ "array length mismatch");
+
+static const struct config_enum_entry xmloption_options[] = {
+ {"content", XMLOPTION_CONTENT, false},
+ {"document", XMLOPTION_DOCUMENT, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(xmloption_options) == (XMLOPTION_CONTENT + 2),
+ "array length mismatch");
+
+/*
+ * Although only "on", "off", and "safe_encoding" are documented, we
+ * accept all the likely variants of "on" and "off".
+ */
+static const struct config_enum_entry backslash_quote_options[] = {
+ {"safe_encoding", BACKSLASH_QUOTE_SAFE_ENCODING, false},
+ {"on", BACKSLASH_QUOTE_ON, false},
+ {"off", BACKSLASH_QUOTE_OFF, false},
+ {"true", BACKSLASH_QUOTE_ON, true},
+ {"false", BACKSLASH_QUOTE_OFF, true},
+ {"yes", BACKSLASH_QUOTE_ON, true},
+ {"no", BACKSLASH_QUOTE_OFF, true},
+ {"1", BACKSLASH_QUOTE_ON, true},
+ {"0", BACKSLASH_QUOTE_OFF, true},
+ {NULL, 0, false}
+};
+
+/*
+ * Although only "on", "off", and "auto" are documented, we accept
+ * all the likely variants of "on" and "off".
+ */
+static const struct config_enum_entry compute_query_id_options[] = {
+ {"auto", COMPUTE_QUERY_ID_AUTO, false},
+ {"regress", COMPUTE_QUERY_ID_REGRESS, false},
+ {"on", COMPUTE_QUERY_ID_ON, false},
+ {"off", COMPUTE_QUERY_ID_OFF, false},
+ {"true", COMPUTE_QUERY_ID_ON, true},
+ {"false", COMPUTE_QUERY_ID_OFF, true},
+ {"yes", COMPUTE_QUERY_ID_ON, true},
+ {"no", COMPUTE_QUERY_ID_OFF, true},
+ {"1", COMPUTE_QUERY_ID_ON, true},
+ {"0", COMPUTE_QUERY_ID_OFF, true},
+ {NULL, 0, false}
+};
+
+/*
+ * Although only "on", "off", and "partition" are documented, we
+ * accept all the likely variants of "on" and "off".
+ */
+static const struct config_enum_entry constraint_exclusion_options[] = {
+ {"partition", CONSTRAINT_EXCLUSION_PARTITION, false},
+ {"on", CONSTRAINT_EXCLUSION_ON, false},
+ {"off", CONSTRAINT_EXCLUSION_OFF, false},
+ {"true", CONSTRAINT_EXCLUSION_ON, true},
+ {"false", CONSTRAINT_EXCLUSION_OFF, true},
+ {"yes", CONSTRAINT_EXCLUSION_ON, true},
+ {"no", CONSTRAINT_EXCLUSION_OFF, true},
+ {"1", CONSTRAINT_EXCLUSION_ON, true},
+ {"0", CONSTRAINT_EXCLUSION_OFF, true},
+ {NULL, 0, false}
+};
+
+/*
+ * Although only "on", "off", "remote_apply", "remote_write", and "local" are
+ * documented, we accept all the likely variants of "on" and "off".
+ */
+static const struct config_enum_entry synchronous_commit_options[] = {
+ {"local", SYNCHRONOUS_COMMIT_LOCAL_FLUSH, false},
+ {"remote_write", SYNCHRONOUS_COMMIT_REMOTE_WRITE, false},
+ {"remote_apply", SYNCHRONOUS_COMMIT_REMOTE_APPLY, false},
+ {"on", SYNCHRONOUS_COMMIT_ON, false},
+ {"off", SYNCHRONOUS_COMMIT_OFF, false},
+ {"true", SYNCHRONOUS_COMMIT_ON, true},
+ {"false", SYNCHRONOUS_COMMIT_OFF, true},
+ {"yes", SYNCHRONOUS_COMMIT_ON, true},
+ {"no", SYNCHRONOUS_COMMIT_OFF, true},
+ {"1", SYNCHRONOUS_COMMIT_ON, true},
+ {"0", SYNCHRONOUS_COMMIT_OFF, true},
+ {NULL, 0, false}
+};
+
+/*
+ * Although only "on", "off", "try" are documented, we accept all the likely
+ * variants of "on" and "off".
+ */
+static const struct config_enum_entry huge_pages_options[] = {
+ {"off", HUGE_PAGES_OFF, false},
+ {"on", HUGE_PAGES_ON, false},
+ {"try", HUGE_PAGES_TRY, false},
+ {"true", HUGE_PAGES_ON, true},
+ {"false", HUGE_PAGES_OFF, true},
+ {"yes", HUGE_PAGES_ON, true},
+ {"no", HUGE_PAGES_OFF, true},
+ {"1", HUGE_PAGES_ON, true},
+ {"0", HUGE_PAGES_OFF, true},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry recovery_prefetch_options[] = {
+ {"off", RECOVERY_PREFETCH_OFF, false},
+ {"on", RECOVERY_PREFETCH_ON, false},
+ {"try", RECOVERY_PREFETCH_TRY, false},
+ {"true", RECOVERY_PREFETCH_ON, true},
+ {"false", RECOVERY_PREFETCH_OFF, true},
+ {"yes", RECOVERY_PREFETCH_ON, true},
+ {"no", RECOVERY_PREFETCH_OFF, true},
+ {"1", RECOVERY_PREFETCH_ON, true},
+ {"0", RECOVERY_PREFETCH_OFF, true},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry force_parallel_mode_options[] = {
+ {"off", FORCE_PARALLEL_OFF, false},
+ {"on", FORCE_PARALLEL_ON, false},
+ {"regress", FORCE_PARALLEL_REGRESS, false},
+ {"true", FORCE_PARALLEL_ON, true},
+ {"false", FORCE_PARALLEL_OFF, true},
+ {"yes", FORCE_PARALLEL_ON, true},
+ {"no", FORCE_PARALLEL_OFF, true},
+ {"1", FORCE_PARALLEL_ON, true},
+ {"0", FORCE_PARALLEL_OFF, true},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry plan_cache_mode_options[] = {
+ {"auto", PLAN_CACHE_MODE_AUTO, false},
+ {"force_generic_plan", PLAN_CACHE_MODE_FORCE_GENERIC_PLAN, false},
+ {"force_custom_plan", PLAN_CACHE_MODE_FORCE_CUSTOM_PLAN, false},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry password_encryption_options[] = {
+ {"md5", PASSWORD_TYPE_MD5, false},
+ {"scram-sha-256", PASSWORD_TYPE_SCRAM_SHA_256, false},
+ {NULL, 0, false}
+};
+
+const struct config_enum_entry ssl_protocol_versions_info[] = {
+ {"", PG_TLS_ANY, false},
+ {"TLSv1", PG_TLS1_VERSION, false},
+ {"TLSv1.1", PG_TLS1_1_VERSION, false},
+ {"TLSv1.2", PG_TLS1_2_VERSION, false},
+ {"TLSv1.3", PG_TLS1_3_VERSION, false},
+ {NULL, 0, false}
+};
+
+StaticAssertDecl(lengthof(ssl_protocol_versions_info) == (PG_TLS1_3_VERSION + 2),
+ "array length mismatch");
+
+static struct config_enum_entry recovery_init_sync_method_options[] = {
+ {"fsync", RECOVERY_INIT_SYNC_METHOD_FSYNC, false},
+#ifdef HAVE_SYNCFS
+ {"syncfs", RECOVERY_INIT_SYNC_METHOD_SYNCFS, false},
+#endif
+ {NULL, 0, false}
+};
+
+static struct config_enum_entry shared_memory_options[] = {
+#ifndef WIN32
+ {"sysv", SHMEM_TYPE_SYSV, false},
+#endif
+#ifndef EXEC_BACKEND
+ {"mmap", SHMEM_TYPE_MMAP, false},
+#endif
+#ifdef WIN32
+ {"windows", SHMEM_TYPE_WINDOWS, false},
+#endif
+ {NULL, 0, false}
+};
+
+static struct config_enum_entry default_toast_compression_options[] = {
+ {"pglz", TOAST_PGLZ_COMPRESSION, false},
+#ifdef USE_LZ4
+ {"lz4", TOAST_LZ4_COMPRESSION, false},
+#endif
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry wal_compression_options[] = {
+ {"pglz", WAL_COMPRESSION_PGLZ, false},
+#ifdef USE_LZ4
+ {"lz4", WAL_COMPRESSION_LZ4, false},
+#endif
+#ifdef USE_ZSTD
+ {"zstd", WAL_COMPRESSION_ZSTD, false},
+#endif
+ {"on", WAL_COMPRESSION_PGLZ, false},
+ {"off", WAL_COMPRESSION_NONE, false},
+ {"true", WAL_COMPRESSION_PGLZ, true},
+ {"false", WAL_COMPRESSION_NONE, true},
+ {"yes", WAL_COMPRESSION_PGLZ, true},
+ {"no", WAL_COMPRESSION_NONE, true},
+ {"1", WAL_COMPRESSION_PGLZ, true},
+ {"0", WAL_COMPRESSION_NONE, true},
+ {NULL, 0, false}
+};
+
+/*
+ * Options for enum values stored in other modules
+ */
+extern const struct config_enum_entry wal_level_options[];
+extern const struct config_enum_entry archive_mode_options[];
+extern const struct config_enum_entry recovery_target_action_options[];
+extern const struct config_enum_entry sync_method_options[];
+extern const struct config_enum_entry dynamic_shared_memory_options[];
+
+/*
+ * GUC option variables that are exported from this module
+ */
+bool log_duration = false;
+bool Debug_print_plan = false;
+bool Debug_print_parse = false;
+bool Debug_print_rewritten = false;
+bool Debug_pretty_print = true;
+
+bool log_parser_stats = false;
+bool log_planner_stats = false;
+bool log_executor_stats = false;
+bool log_statement_stats = false; /* this is sort of all three above
+ * together */
+bool log_btree_build_stats = false;
+char *event_source;
+
+bool row_security;
+bool check_function_bodies = true;
+
+/*
+ * This GUC exists solely for backward compatibility, check its definition for
+ * details.
+ */
+bool default_with_oids = false;
+bool session_auth_is_superuser;
+
+int log_min_error_statement = ERROR;
+int log_min_messages = WARNING;
+int client_min_messages = NOTICE;
+int log_min_duration_sample = -1;
+int log_min_duration_statement = -1;
+int log_parameter_max_length = -1;
+int log_parameter_max_length_on_error = 0;
+int log_temp_files = -1;
+double log_statement_sample_rate = 1.0;
+double log_xact_sample_rate = 0;
+int trace_recovery_messages = LOG;
+char *backtrace_functions;
+char *backtrace_symbol_list;
+
+int temp_file_limit = -1;
+
+int num_temp_buffers = 1024;
+
+char *cluster_name = "";
+char *ConfigFileName;
+char *HbaFileName;
+char *IdentFileName;
+char *external_pid_file;
+
+char *pgstat_temp_directory;
+
+char *application_name;
+
+int tcp_keepalives_idle;
+int tcp_keepalives_interval;
+int tcp_keepalives_count;
+int tcp_user_timeout;
+
+/*
+ * SSL renegotiation was been removed in PostgreSQL 9.5, but we tolerate it
+ * being set to zero (meaning never renegotiate) for backward compatibility.
+ * This avoids breaking compatibility with clients that have never supported
+ * renegotiation and therefore always try to zero it.
+ */
+int ssl_renegotiation_limit;
+
+/*
+ * This really belongs in pg_shmem.c, but is defined here so that it doesn't
+ * need to be duplicated in all the different implementations of pg_shmem.c.
+ */
+int huge_pages;
+int huge_page_size;
+
+/*
+ * These variables are all dummies that don't do anything, except in some
+ * cases provide the value for SHOW to display. The real state is elsewhere
+ * and is kept in sync by assign_hooks.
+ */
+static char *syslog_ident_str;
+static double phony_random_seed;
+static char *client_encoding_string;
+static char *datestyle_string;
+static char *locale_collate;
+static char *locale_ctype;
+static char *server_encoding_string;
+static char *server_version_string;
+static int server_version_num;
+static char *timezone_string;
+static char *log_timezone_string;
+static char *timezone_abbreviations_string;
+static char *data_directory;
+static char *session_authorization_string;
+static int max_function_args;
+static int max_index_keys;
+static int max_identifier_length;
+static int block_size;
+static int segment_size;
+static int shared_memory_size_mb;
+static int shared_memory_size_in_huge_pages;
+static int wal_block_size;
+static bool data_checksums;
+static bool integer_datetimes;
+static bool assert_enabled;
+static bool in_hot_standby;
+static char *recovery_target_timeline_string;
+static char *recovery_target_string;
+static char *recovery_target_xid_string;
+static char *recovery_target_name_string;
+static char *recovery_target_lsn_string;
+
+
+/* should be static, but commands/variable.c needs to get at this */
+char *role_string;
+
+
+/*
+ * Displayable names for context types (enum GucContext)
+ *
+ * Note: these strings are deliberately not localized.
+ */
+const char *const GucContext_Names[] =
+{
+ /* PGC_INTERNAL */ "internal",
+ /* PGC_POSTMASTER */ "postmaster",
+ /* PGC_SIGHUP */ "sighup",
+ /* PGC_SU_BACKEND */ "superuser-backend",
+ /* PGC_BACKEND */ "backend",
+ /* PGC_SUSET */ "superuser",
+ /* PGC_USERSET */ "user"
+};
+
+StaticAssertDecl(lengthof(GucContext_Names) == (PGC_USERSET + 1),
+ "array length mismatch");
+
+/*
+ * Displayable names for source types (enum GucSource)
+ *
+ * Note: these strings are deliberately not localized.
+ */
+const char *const GucSource_Names[] =
+{
+ /* PGC_S_DEFAULT */ "default",
+ /* PGC_S_DYNAMIC_DEFAULT */ "default",
+ /* PGC_S_ENV_VAR */ "environment variable",
+ /* PGC_S_FILE */ "configuration file",
+ /* PGC_S_ARGV */ "command line",
+ /* PGC_S_GLOBAL */ "global",
+ /* PGC_S_DATABASE */ "database",
+ /* PGC_S_USER */ "user",
+ /* PGC_S_DATABASE_USER */ "database user",
+ /* PGC_S_CLIENT */ "client",
+ /* PGC_S_OVERRIDE */ "override",
+ /* PGC_S_INTERACTIVE */ "interactive",
+ /* PGC_S_TEST */ "test",
+ /* PGC_S_SESSION */ "session"
+};
+
+StaticAssertDecl(lengthof(GucSource_Names) == (PGC_S_SESSION + 1),
+ "array length mismatch");
+
+/*
+ * Displayable names for the groupings defined in enum config_group
+ */
+const char *const config_group_names[] =
+{
+ /* UNGROUPED */
+ gettext_noop("Ungrouped"),
+ /* FILE_LOCATIONS */
+ gettext_noop("File Locations"),
+ /* CONN_AUTH_SETTINGS */
+ gettext_noop("Connections and Authentication / Connection Settings"),
+ /* CONN_AUTH_AUTH */
+ gettext_noop("Connections and Authentication / Authentication"),
+ /* CONN_AUTH_SSL */
+ gettext_noop("Connections and Authentication / SSL"),
+ /* RESOURCES_MEM */
+ gettext_noop("Resource Usage / Memory"),
+ /* RESOURCES_DISK */
+ gettext_noop("Resource Usage / Disk"),
+ /* RESOURCES_KERNEL */
+ gettext_noop("Resource Usage / Kernel Resources"),
+ /* RESOURCES_VACUUM_DELAY */
+ gettext_noop("Resource Usage / Cost-Based Vacuum Delay"),
+ /* RESOURCES_BGWRITER */
+ gettext_noop("Resource Usage / Background Writer"),
+ /* RESOURCES_ASYNCHRONOUS */
+ gettext_noop("Resource Usage / Asynchronous Behavior"),
+ /* WAL_SETTINGS */
+ gettext_noop("Write-Ahead Log / Settings"),
+ /* WAL_CHECKPOINTS */
+ gettext_noop("Write-Ahead Log / Checkpoints"),
+ /* WAL_ARCHIVING */
+ gettext_noop("Write-Ahead Log / Archiving"),
+ /* WAL_RECOVERY */
+ gettext_noop("Write-Ahead Log / Recovery"),
+ /* WAL_ARCHIVE_RECOVERY */
+ gettext_noop("Write-Ahead Log / Archive Recovery"),
+ /* WAL_RECOVERY_TARGET */
+ gettext_noop("Write-Ahead Log / Recovery Target"),
+ /* REPLICATION_SENDING */
+ gettext_noop("Replication / Sending Servers"),
+ /* REPLICATION_PRIMARY */
+ gettext_noop("Replication / Primary Server"),
+ /* REPLICATION_STANDBY */
+ gettext_noop("Replication / Standby Servers"),
+ /* REPLICATION_SUBSCRIBERS */
+ gettext_noop("Replication / Subscribers"),
+ /* QUERY_TUNING_METHOD */
+ gettext_noop("Query Tuning / Planner Method Configuration"),
+ /* QUERY_TUNING_COST */
+ gettext_noop("Query Tuning / Planner Cost Constants"),
+ /* QUERY_TUNING_GEQO */
+ gettext_noop("Query Tuning / Genetic Query Optimizer"),
+ /* QUERY_TUNING_OTHER */
+ gettext_noop("Query Tuning / Other Planner Options"),
+ /* LOGGING_WHERE */
+ gettext_noop("Reporting and Logging / Where to Log"),
+ /* LOGGING_WHEN */
+ gettext_noop("Reporting and Logging / When to Log"),
+ /* LOGGING_WHAT */
+ gettext_noop("Reporting and Logging / What to Log"),
+ /* PROCESS_TITLE */
+ gettext_noop("Reporting and Logging / Process Title"),
+ /* STATS_MONITORING */
+ gettext_noop("Statistics / Monitoring"),
+ /* STATS_CUMULATIVE */
+ gettext_noop("Statistics / Cumulative Query and Index Statistics"),
+ /* AUTOVACUUM */
+ gettext_noop("Autovacuum"),
+ /* CLIENT_CONN_STATEMENT */
+ gettext_noop("Client Connection Defaults / Statement Behavior"),
+ /* CLIENT_CONN_LOCALE */
+ gettext_noop("Client Connection Defaults / Locale and Formatting"),
+ /* CLIENT_CONN_PRELOAD */
+ gettext_noop("Client Connection Defaults / Shared Library Preloading"),
+ /* CLIENT_CONN_OTHER */
+ gettext_noop("Client Connection Defaults / Other Defaults"),
+ /* LOCK_MANAGEMENT */
+ gettext_noop("Lock Management"),
+ /* COMPAT_OPTIONS_PREVIOUS */
+ gettext_noop("Version and Platform Compatibility / Previous PostgreSQL Versions"),
+ /* COMPAT_OPTIONS_CLIENT */
+ gettext_noop("Version and Platform Compatibility / Other Platforms and Clients"),
+ /* ERROR_HANDLING */
+ gettext_noop("Error Handling"),
+ /* PRESET_OPTIONS */
+ gettext_noop("Preset Options"),
+ /* CUSTOM_OPTIONS */
+ gettext_noop("Customized Options"),
+ /* DEVELOPER_OPTIONS */
+ gettext_noop("Developer Options"),
+ /* help_config wants this array to be null-terminated */
+ NULL
+};
+
+StaticAssertDecl(lengthof(config_group_names) == (DEVELOPER_OPTIONS + 2),
+ "array length mismatch");
+
+/*
+ * Displayable names for GUC variable types (enum config_type)
+ *
+ * Note: these strings are deliberately not localized.
+ */
+const char *const config_type_names[] =
+{
+ /* PGC_BOOL */ "bool",
+ /* PGC_INT */ "integer",
+ /* PGC_REAL */ "real",
+ /* PGC_STRING */ "string",
+ /* PGC_ENUM */ "enum"
+};
+
+StaticAssertDecl(lengthof(config_type_names) == (PGC_ENUM + 1),
+ "array length mismatch");
+
+/*
+ * Unit conversion tables.
+ *
+ * There are two tables, one for memory units, and another for time units.
+ * For each supported conversion from one unit to another, we have an entry
+ * in the table.
+ *
+ * To keep things simple, and to avoid possible roundoff error,
+ * conversions are never chained. There needs to be a direct conversion
+ * between all units (of the same type).
+ *
+ * The conversions for each base unit must be kept in order from greatest to
+ * smallest human-friendly unit; convert_xxx_from_base_unit() rely on that.
+ * (The order of the base-unit groups does not matter.)
+ */
+#define MAX_UNIT_LEN 3 /* length of longest recognized unit string */
+
+typedef struct
+{
+ char unit[MAX_UNIT_LEN + 1]; /* unit, as a string, like "kB" or
+ * "min" */
+ int base_unit; /* GUC_UNIT_XXX */
+ double multiplier; /* Factor for converting unit -> base_unit */
+} unit_conversion;
+
+/* Ensure that the constants in the tables don't overflow or underflow */
+#if BLCKSZ < 1024 || BLCKSZ > (1024*1024)
+#error BLCKSZ must be between 1KB and 1MB
+#endif
+#if XLOG_BLCKSZ < 1024 || XLOG_BLCKSZ > (1024*1024)
+#error XLOG_BLCKSZ must be between 1KB and 1MB
+#endif
+
+static const char *memory_units_hint = gettext_noop("Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\".");
+
+static const unit_conversion memory_unit_conversion_table[] =
+{
+ {"TB", GUC_UNIT_BYTE, 1024.0 * 1024.0 * 1024.0 * 1024.0},
+ {"GB", GUC_UNIT_BYTE, 1024.0 * 1024.0 * 1024.0},
+ {"MB", GUC_UNIT_BYTE, 1024.0 * 1024.0},
+ {"kB", GUC_UNIT_BYTE, 1024.0},
+ {"B", GUC_UNIT_BYTE, 1.0},
+
+ {"TB", GUC_UNIT_KB, 1024.0 * 1024.0 * 1024.0},
+ {"GB", GUC_UNIT_KB, 1024.0 * 1024.0},
+ {"MB", GUC_UNIT_KB, 1024.0},
+ {"kB", GUC_UNIT_KB, 1.0},
+ {"B", GUC_UNIT_KB, 1.0 / 1024.0},
+
+ {"TB", GUC_UNIT_MB, 1024.0 * 1024.0},
+ {"GB", GUC_UNIT_MB, 1024.0},
+ {"MB", GUC_UNIT_MB, 1.0},
+ {"kB", GUC_UNIT_MB, 1.0 / 1024.0},
+ {"B", GUC_UNIT_MB, 1.0 / (1024.0 * 1024.0)},
+
+ {"TB", GUC_UNIT_BLOCKS, (1024.0 * 1024.0 * 1024.0) / (BLCKSZ / 1024)},
+ {"GB", GUC_UNIT_BLOCKS, (1024.0 * 1024.0) / (BLCKSZ / 1024)},
+ {"MB", GUC_UNIT_BLOCKS, 1024.0 / (BLCKSZ / 1024)},
+ {"kB", GUC_UNIT_BLOCKS, 1.0 / (BLCKSZ / 1024)},
+ {"B", GUC_UNIT_BLOCKS, 1.0 / BLCKSZ},
+
+ {"TB", GUC_UNIT_XBLOCKS, (1024.0 * 1024.0 * 1024.0) / (XLOG_BLCKSZ / 1024)},
+ {"GB", GUC_UNIT_XBLOCKS, (1024.0 * 1024.0) / (XLOG_BLCKSZ / 1024)},
+ {"MB", GUC_UNIT_XBLOCKS, 1024.0 / (XLOG_BLCKSZ / 1024)},
+ {"kB", GUC_UNIT_XBLOCKS, 1.0 / (XLOG_BLCKSZ / 1024)},
+ {"B", GUC_UNIT_XBLOCKS, 1.0 / XLOG_BLCKSZ},
+
+ {""} /* end of table marker */
+};
+
+static const char *time_units_hint = gettext_noop("Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\".");
+
+static const unit_conversion time_unit_conversion_table[] =
+{
+ {"d", GUC_UNIT_MS, 1000 * 60 * 60 * 24},
+ {"h", GUC_UNIT_MS, 1000 * 60 * 60},
+ {"min", GUC_UNIT_MS, 1000 * 60},
+ {"s", GUC_UNIT_MS, 1000},
+ {"ms", GUC_UNIT_MS, 1},
+ {"us", GUC_UNIT_MS, 1.0 / 1000},
+
+ {"d", GUC_UNIT_S, 60 * 60 * 24},
+ {"h", GUC_UNIT_S, 60 * 60},
+ {"min", GUC_UNIT_S, 60},
+ {"s", GUC_UNIT_S, 1},
+ {"ms", GUC_UNIT_S, 1.0 / 1000},
+ {"us", GUC_UNIT_S, 1.0 / (1000 * 1000)},
+
+ {"d", GUC_UNIT_MIN, 60 * 24},
+ {"h", GUC_UNIT_MIN, 60},
+ {"min", GUC_UNIT_MIN, 1},
+ {"s", GUC_UNIT_MIN, 1.0 / 60},
+ {"ms", GUC_UNIT_MIN, 1.0 / (1000 * 60)},
+ {"us", GUC_UNIT_MIN, 1.0 / (1000 * 1000 * 60)},
+
+ {""} /* end of table marker */
+};
+
+/*
+ * Contents of GUC tables
+ *
+ * See src/backend/utils/misc/README for design notes.
+ *
+ * TO ADD AN OPTION:
+ *
+ * 1. Declare a global variable of type bool, int, double, or char*
+ * and make use of it.
+ *
+ * 2. Decide at what times it's safe to set the option. See guc.h for
+ * details.
+ *
+ * 3. Decide on a name, a default value, upper and lower bounds (if
+ * applicable), etc.
+ *
+ * 4. Add a record below.
+ *
+ * 5. Add it to src/backend/utils/misc/postgresql.conf.sample, if
+ * appropriate.
+ *
+ * 6. Don't forget to document the option (at least in config.sgml).
+ *
+ * 7. If it's a new GUC_LIST_QUOTE option, you must add it to
+ * variable_is_guc_list_quote() in src/bin/pg_dump/dumputils.c.
+ */
+
+
+/******** option records follow ********/
+
+static struct config_bool ConfigureNamesBool[] =
+{
+ {
+ {"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of sequential-scan plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_seqscan,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_indexscan", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of index-scan plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_indexscan,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_indexonlyscan", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of index-only-scan plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_indexonlyscan,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_bitmapscan", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of bitmap-scan plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_bitmapscan,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_tidscan", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of TID scan plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_tidscan,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_sort", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of explicit sort steps."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_sort,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_incremental_sort", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of incremental sort steps."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_incremental_sort,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_hashagg", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of hashed aggregation plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_hashagg,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_material", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of materialization."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_material,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_memoize", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of memoization."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_memoize,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of nested-loop join plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_nestloop,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_mergejoin", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of merge join plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_mergejoin,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_hashjoin", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of hash join plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_hashjoin,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_gathermerge", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of gather merge plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_gathermerge,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_partitionwise_join", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables partitionwise join."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_partitionwise_join,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_partitionwise_aggregate", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables partitionwise aggregation and grouping."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_partitionwise_aggregate,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_parallel_append", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of parallel append plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_parallel_append,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_parallel_hash", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of parallel hash plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_parallel_hash,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_partition_pruning", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables plan-time and execution-time partition pruning."),
+ gettext_noop("Allows the query planner and executor to compare partition "
+ "bounds to conditions in the query to determine which "
+ "partitions must be scanned."),
+ GUC_EXPLAIN
+ },
+ &enable_partition_pruning,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"enable_async_append", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of async append plans."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &enable_async_append,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("Enables genetic query optimization."),
+ gettext_noop("This algorithm attempts to do planning without "
+ "exhaustive searching."),
+ GUC_EXPLAIN
+ },
+ &enable_geqo,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ /* Not for general use --- used by SET SESSION AUTHORIZATION */
+ {"is_superuser", PGC_INTERNAL, UNGROUPED,
+ gettext_noop("Shows whether the current user is a superuser."),
+ NULL,
+ GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &session_auth_is_superuser,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"bonjour", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Enables advertising the server via Bonjour."),
+ NULL
+ },
+ &enable_bonjour,
+ false,
+ check_bonjour, NULL, NULL
+ },
+ {
+ {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING,
+ gettext_noop("Collects transaction commit time."),
+ NULL
+ },
+ &track_commit_timestamp,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"ssl", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Enables SSL connections."),
+ NULL
+ },
+ &EnableSSL,
+ false,
+ check_ssl, NULL, NULL
+ },
+ {
+ {"ssl_passphrase_command_supports_reload", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Controls whether ssl_passphrase_command is called during server reload."),
+ NULL
+ },
+ &ssl_passphrase_command_supports_reload,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"ssl_prefer_server_ciphers", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Give priority to server ciphersuite order."),
+ NULL
+ },
+ &SSLPreferServerCiphers,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"fsync", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Forces synchronization of updates to disk."),
+ gettext_noop("The server will use the fsync() system call in several places to make "
+ "sure that updates are physically written to disk. This insures "
+ "that a database cluster will recover to a consistent state after "
+ "an operating system or hardware crash.")
+ },
+ &enableFsync,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"ignore_checksum_failure", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Continues processing after a checksum failure."),
+ gettext_noop("Detection of a checksum failure normally causes PostgreSQL to "
+ "report an error, aborting the current transaction. Setting "
+ "ignore_checksum_failure to true causes the system to ignore the failure "
+ "(but still report a warning), and continue processing. This "
+ "behavior could cause crashes or other serious problems. Only "
+ "has an effect if checksums are enabled."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &ignore_checksum_failure,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"zero_damaged_pages", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Continues processing past damaged page headers."),
+ gettext_noop("Detection of a damaged page header normally causes PostgreSQL to "
+ "report an error, aborting the current transaction. Setting "
+ "zero_damaged_pages to true causes the system to instead report a "
+ "warning, zero out the damaged page, and continue processing. This "
+ "behavior will destroy data, namely all the rows on the damaged page."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &zero_damaged_pages,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"ignore_invalid_pages", PGC_POSTMASTER, DEVELOPER_OPTIONS,
+ gettext_noop("Continues recovery after an invalid pages failure."),
+ gettext_noop("Detection of WAL records having references to "
+ "invalid pages during recovery causes PostgreSQL to "
+ "raise a PANIC-level error, aborting the recovery. "
+ "Setting ignore_invalid_pages to true causes "
+ "the system to ignore invalid page references "
+ "in WAL records (but still report a warning), "
+ "and continue recovery. This behavior may cause "
+ "crashes, data loss, propagate or hide corruption, "
+ "or other serious problems. Only has an effect "
+ "during recovery or in standby mode."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &ignore_invalid_pages,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"full_page_writes", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Writes full pages to WAL when first modified after a checkpoint."),
+ gettext_noop("A page write in process during an operating system crash might be "
+ "only partially written to disk. During recovery, the row changes "
+ "stored in WAL are not enough to recover. This option writes "
+ "pages when first modified after a checkpoint to WAL so full recovery "
+ "is possible.")
+ },
+ &fullPageWrites,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_log_hints", PGC_POSTMASTER, WAL_SETTINGS,
+ gettext_noop("Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification."),
+ NULL
+ },
+ &wal_log_hints,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_init_zero", PGC_SUSET, WAL_SETTINGS,
+ gettext_noop("Writes zeroes to new WAL files before first use."),
+ NULL
+ },
+ &wal_init_zero,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_recycle", PGC_SUSET, WAL_SETTINGS,
+ gettext_noop("Recycles WAL files by renaming them."),
+ NULL
+ },
+ &wal_recycle,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_checkpoints", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Logs each checkpoint."),
+ NULL
+ },
+ &log_checkpoints,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_connections", PGC_SU_BACKEND, LOGGING_WHAT,
+ gettext_noop("Logs each successful connection."),
+ NULL
+ },
+ &Log_connections,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_disconnections", PGC_SU_BACKEND, LOGGING_WHAT,
+ gettext_noop("Logs end of a session, including duration."),
+ NULL
+ },
+ &Log_disconnections,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_replication_commands", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Logs each replication command."),
+ NULL
+ },
+ &log_replication_commands,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_assertions", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether the running server has assertion checks enabled."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &assert_enabled,
+#ifdef USE_ASSERT_CHECKING
+ true,
+#else
+ false,
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"exit_on_error", PGC_USERSET, ERROR_HANDLING_OPTIONS,
+ gettext_noop("Terminate session on any error."),
+ NULL
+ },
+ &ExitOnAnyError,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"restart_after_crash", PGC_SIGHUP, ERROR_HANDLING_OPTIONS,
+ gettext_noop("Reinitialize server after backend crash."),
+ NULL
+ },
+ &restart_after_crash,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"remove_temp_files_after_crash", PGC_SIGHUP, DEVELOPER_OPTIONS,
+ gettext_noop("Remove temporary files after backend crash."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &remove_temp_files_after_crash,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_duration", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Logs the duration of each completed SQL statement."),
+ NULL
+ },
+ &log_duration,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_print_parse", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Logs each query's parse tree."),
+ NULL
+ },
+ &Debug_print_parse,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_print_rewritten", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Logs each query's rewritten parse tree."),
+ NULL
+ },
+ &Debug_print_rewritten,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_print_plan", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Logs each query's execution plan."),
+ NULL
+ },
+ &Debug_print_plan,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_pretty_print", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Indents parse and plan tree displays."),
+ NULL
+ },
+ &Debug_pretty_print,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_parser_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes parser performance statistics to the server log."),
+ NULL
+ },
+ &log_parser_stats,
+ false,
+ check_stage_log_stats, NULL, NULL
+ },
+ {
+ {"log_planner_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes planner performance statistics to the server log."),
+ NULL
+ },
+ &log_planner_stats,
+ false,
+ check_stage_log_stats, NULL, NULL
+ },
+ {
+ {"log_executor_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes executor performance statistics to the server log."),
+ NULL
+ },
+ &log_executor_stats,
+ false,
+ check_stage_log_stats, NULL, NULL
+ },
+ {
+ {"log_statement_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes cumulative performance statistics to the server log."),
+ NULL
+ },
+ &log_statement_stats,
+ false,
+ check_log_stats, NULL, NULL
+ },
+#ifdef BTREE_BUILD_STATS
+ {
+ {"log_btree_build_stats", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Logs system resource usage statistics (memory and CPU) on various B-tree operations."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &log_btree_build_stats,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
+ {
+ {"track_activities", PGC_SUSET, STATS_CUMULATIVE,
+ gettext_noop("Collects information about executing commands."),
+ gettext_noop("Enables the collection of information on the currently "
+ "executing command of each session, along with "
+ "the time at which that command began execution.")
+ },
+ &pgstat_track_activities,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"track_counts", PGC_SUSET, STATS_CUMULATIVE,
+ gettext_noop("Collects statistics on database activity."),
+ NULL
+ },
+ &pgstat_track_counts,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"track_io_timing", PGC_SUSET, STATS_CUMULATIVE,
+ gettext_noop("Collects timing statistics for database I/O activity."),
+ NULL
+ },
+ &track_io_timing,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"track_wal_io_timing", PGC_SUSET, STATS_CUMULATIVE,
+ gettext_noop("Collects timing statistics for WAL I/O activity."),
+ NULL
+ },
+ &track_wal_io_timing,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"update_process_title", PGC_SUSET, PROCESS_TITLE,
+ gettext_noop("Updates the process title to show the active SQL command."),
+ gettext_noop("Enables updating of the process title every time a new SQL command is received by the server.")
+ },
+ &update_process_title,
+#ifdef WIN32
+ false,
+#else
+ true,
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Starts the autovacuum subprocess."),
+ NULL
+ },
+ &autovacuum_start_daemon,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"trace_notify", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Generates debugging output for LISTEN and NOTIFY."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_notify,
+ false,
+ NULL, NULL, NULL
+ },
+
+#ifdef LOCK_DEBUG
+ {
+ {"trace_locks", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Emits information about lock usage."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_locks,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"trace_userlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Emits information about user lock usage."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_userlocks,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"trace_lwlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Emits information about lightweight lock usage."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_lwlocks,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"debug_deadlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Dumps information about all current locks when a deadlock timeout occurs."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Debug_deadlocks,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
+ {
+ {"log_lock_waits", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Logs long lock waits."),
+ NULL
+ },
+ &log_lock_waits,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_recovery_conflict_waits", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Logs standby recovery conflict waits."),
+ NULL
+ },
+ &log_recovery_conflict_waits,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_hostname", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Logs the host name in the connection logs."),
+ gettext_noop("By default, connection logs only show the IP address "
+ "of the connecting host. If you want them to show the host name you "
+ "can turn this on, but depending on your host name resolution "
+ "setup it might impose a non-negligible performance penalty.")
+ },
+ &log_hostname,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"transform_null_equals", PGC_USERSET, COMPAT_OPTIONS_CLIENT,
+ gettext_noop("Treats \"expr=NULL\" as \"expr IS NULL\"."),
+ gettext_noop("When turned on, expressions of the form expr = NULL "
+ "(or NULL = expr) are treated as expr IS NULL, that is, they "
+ "return true if expr evaluates to the null value, and false "
+ "otherwise. The correct behavior of expr = NULL is to always "
+ "return null (unknown).")
+ },
+ &Transform_null_equals,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"db_user_namespace", PGC_SIGHUP, CONN_AUTH_AUTH,
+ gettext_noop("Enables per-database user names."),
+ NULL
+ },
+ &Db_user_namespace,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"default_transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the default read-only status of new transactions."),
+ NULL,
+ GUC_REPORT
+ },
+ &DefaultXactReadOnly,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the current transaction's read-only status."),
+ NULL,
+ GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &XactReadOnly,
+ false,
+ check_transaction_read_only, NULL, NULL
+ },
+ {
+ {"default_transaction_deferrable", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the default deferrable status of new transactions."),
+ NULL
+ },
+ &DefaultXactDeferrable,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"transaction_deferrable", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures."),
+ NULL,
+ GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &XactDeferrable,
+ false,
+ check_transaction_deferrable, NULL, NULL
+ },
+ {
+ {"row_security", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Enable row security."),
+ gettext_noop("When enabled, row security will be applied to all users.")
+ },
+ &row_security,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"check_function_bodies", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE."),
+ NULL
+ },
+ &check_function_bodies,
+ true,
+ NULL, NULL, NULL
+ },
+ {
+ {"array_nulls", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Enable input of NULL elements in arrays."),
+ gettext_noop("When turned on, unquoted NULL in an array input "
+ "value means a null value; "
+ "otherwise it is taken literally.")
+ },
+ &Array_nulls,
+ true,
+ NULL, NULL, NULL
+ },
+
+ /*
+ * WITH OIDS support, and consequently default_with_oids, was removed in
+ * PostgreSQL 12, but we tolerate the parameter being set to false to
+ * avoid unnecessarily breaking older dump files.
+ */
+ {
+ {"default_with_oids", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("WITH OIDS is no longer supported; this can only be false."),
+ NULL,
+ GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+ },
+ &default_with_oids,
+ false,
+ check_default_with_oids, NULL, NULL
+ },
+ {
+ {"logging_collector", PGC_POSTMASTER, LOGGING_WHERE,
+ gettext_noop("Start a subprocess to capture stderr output and/or csvlogs into log files."),
+ NULL
+ },
+ &Logging_collector,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_truncate_on_rotation", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Truncate existing log files of same name during log rotation."),
+ NULL
+ },
+ &Log_truncate_on_rotation,
+ false,
+ NULL, NULL, NULL
+ },
+
+#ifdef TRACE_SORT
+ {
+ {"trace_sort", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Emit information about resource usage in sorting."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &trace_sort,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
+#ifdef TRACE_SYNCSCAN
+ /* this is undocumented because not exposed in a standard build */
+ {
+ {"trace_syncscan", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Generate debugging output for synchronized scanning."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &trace_syncscan,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
+#ifdef DEBUG_BOUNDED_SORT
+ /* this is undocumented because not exposed in a standard build */
+ {
+ {
+ "optimize_bounded_sort", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enable bounded sorting using heap sort."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_EXPLAIN
+ },
+ &optimize_bounded_sort,
+ true,
+ NULL, NULL, NULL
+ },
+#endif
+
+#ifdef WAL_DEBUG
+ {
+ {"wal_debug", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Emit WAL-related debugging output."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &XLOG_DEBUG,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
+
+ {
+ {"integer_datetimes", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether datetimes are integer based."),
+ NULL,
+ GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &integer_datetimes,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"krb_caseins_users", PGC_SIGHUP, CONN_AUTH_AUTH,
+ gettext_noop("Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive."),
+ NULL
+ },
+ &pg_krb_caseins_users,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"escape_string_warning", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Warn about backslash escapes in ordinary string literals."),
+ NULL
+ },
+ &escape_string_warning,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"standard_conforming_strings", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Causes '...' strings to treat backslashes literally."),
+ NULL,
+ GUC_REPORT
+ },
+ &standard_conforming_strings,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"synchronize_seqscans", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Enable synchronized sequential scans."),
+ NULL
+ },
+ &synchronize_seqscans,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_target_inclusive", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets whether to include or exclude transaction with recovery target."),
+ NULL
+ },
+ &recoveryTargetInclusive,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"hot_standby", PGC_POSTMASTER, REPLICATION_STANDBY,
+ gettext_noop("Allows connections and queries during recovery."),
+ NULL
+ },
+ &EnableHotStandby,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"hot_standby_feedback", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Allows feedback from a hot standby to the primary that will avoid query conflicts."),
+ NULL
+ },
+ &hot_standby_feedback,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"in_hot_standby", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether hot standby is currently active."),
+ NULL,
+ GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &in_hot_standby,
+ false,
+ NULL, NULL, show_in_hot_standby
+ },
+
+ {
+ {"allow_system_table_mods", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Allows modifications of the structure of system tables."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &allowSystemTableMods,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ignore_system_indexes", PGC_BACKEND, DEVELOPER_OPTIONS,
+ gettext_noop("Disables reading from system indexes."),
+ gettext_noop("It does not prevent updating the indexes, so it is safe "
+ "to use. The worst consequence is slowness."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &IgnoreSystemIndexes,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"allow_in_place_tablespaces", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Allows tablespaces directly inside pg_tblspc, for testing."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &allow_in_place_tablespaces,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"lo_compat_privileges", PGC_SUSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Enables backward compatibility mode for privilege checks on large objects."),
+ gettext_noop("Skips privilege checks when reading or modifying large objects, "
+ "for compatibility with PostgreSQL releases prior to 9.0.")
+ },
+ &lo_compat_privileges,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"quote_all_identifiers", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("When generating SQL fragments, quote all identifiers."),
+ NULL,
+ },
+ &quote_all_identifiers,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"data_checksums", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether data checksums are turned on for this cluster."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED
+ },
+ &data_checksums,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"syslog_sequence_numbers", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Add sequence number to syslog messages to avoid duplicate suppression."),
+ NULL
+ },
+ &syslog_sequence_numbers,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"syslog_split_messages", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Split messages sent to syslog by lines and to fit into 1024 bytes."),
+ NULL
+ },
+ &syslog_split_messages,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"parallel_leader_participation", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Controls whether Gather and Gather Merge also run subplans."),
+ gettext_noop("Should gather nodes also run subplans or just gather tuples?"),
+ GUC_EXPLAIN
+ },
+ &parallel_leader_participation,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Allow JIT compilation."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &jit_enabled,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_debugging_support", PGC_SU_BACKEND, DEVELOPER_OPTIONS,
+ gettext_noop("Register JIT-compiled functions with debugger."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &jit_debugging_support,
+ false,
+
+ /*
+ * This is not guaranteed to be available, but given it's a developer
+ * oriented option, it doesn't seem worth adding code checking
+ * availability.
+ */
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_dump_bitcode", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Write out LLVM bitcode to facilitate JIT debugging."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &jit_dump_bitcode,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_expressions", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Allow JIT compilation of expressions."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &jit_expressions,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_profiling_support", PGC_SU_BACKEND, DEVELOPER_OPTIONS,
+ gettext_noop("Register JIT-compiled functions with perf profiler."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &jit_profiling_support,
+ false,
+
+ /*
+ * This is not guaranteed to be available, but given it's a developer
+ * oriented option, it doesn't seem worth adding code checking
+ * availability.
+ */
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_tuple_deforming", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Allow JIT compilation of tuple deforming."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &jit_tuple_deforming,
+ true,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"data_sync_retry", PGC_POSTMASTER, ERROR_HANDLING_OPTIONS,
+ gettext_noop("Whether to continue running after a failure to sync data files."),
+ },
+ &data_sync_retry,
+ false,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_receiver_create_temp_slot", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured."),
+ },
+ &wal_receiver_create_temp_slot,
+ false,
+ NULL, NULL, NULL
+ },
+
+ /* End-of-list marker */
+ {
+ {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL, NULL
+ }
+};
+
+
+static struct config_int ConfigureNamesInt[] =
+{
+ {
+ {"archive_timeout", PGC_SIGHUP, WAL_ARCHIVING,
+ gettext_noop("Sets the amount of time to wait before forcing a "
+ "switch to the next WAL file."),
+ NULL,
+ GUC_UNIT_S
+ },
+ &XLogArchiveTimeout,
+ 0, 0, INT_MAX / 2,
+ NULL, NULL, NULL
+ },
+ {
+ {"post_auth_delay", PGC_BACKEND, DEVELOPER_OPTIONS,
+ gettext_noop("Sets the amount of time to wait after "
+ "authentication on connection startup."),
+ gettext_noop("This allows attaching a debugger to the process."),
+ GUC_NOT_IN_SAMPLE | GUC_UNIT_S
+ },
+ &PostAuthDelay,
+ 0, 0, INT_MAX / 1000000,
+ NULL, NULL, NULL
+ },
+ {
+ {"default_statistics_target", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Sets the default statistics target."),
+ gettext_noop("This applies to table columns that have not had a "
+ "column-specific target set via ALTER TABLE SET STATISTICS.")
+ },
+ &default_statistics_target,
+ 100, 1, 10000,
+ NULL, NULL, NULL
+ },
+ {
+ {"from_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Sets the FROM-list size beyond which subqueries "
+ "are not collapsed."),
+ gettext_noop("The planner will merge subqueries into upper "
+ "queries if the resulting FROM list would have no more than "
+ "this many items."),
+ GUC_EXPLAIN
+ },
+ &from_collapse_limit,
+ 8, 1, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"join_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Sets the FROM-list size beyond which JOIN "
+ "constructs are not flattened."),
+ gettext_noop("The planner will flatten explicit JOIN "
+ "constructs into lists of FROM items whenever a "
+ "list of no more than this many items would result."),
+ GUC_EXPLAIN
+ },
+ &join_collapse_limit,
+ 8, 1, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo_threshold", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("Sets the threshold of FROM items beyond which GEQO is used."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &geqo_threshold,
+ 12, 2, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("GEQO: effort is used to set the default for other GEQO parameters."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &Geqo_effort,
+ DEFAULT_GEQO_EFFORT, MIN_GEQO_EFFORT, MAX_GEQO_EFFORT,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo_pool_size", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("GEQO: number of individuals in the population."),
+ gettext_noop("Zero selects a suitable default value."),
+ GUC_EXPLAIN
+ },
+ &Geqo_pool_size,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo_generations", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("GEQO: number of iterations of the algorithm."),
+ gettext_noop("Zero selects a suitable default value."),
+ GUC_EXPLAIN
+ },
+ &Geqo_generations,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ /* This is PGC_SUSET to prevent hiding from log_lock_waits. */
+ {"deadlock_timeout", PGC_SUSET, LOCK_MANAGEMENT,
+ gettext_noop("Sets the time to wait on a lock before checking for deadlock."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &DeadlockTimeout,
+ 1000, 1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_standby_archive_delay", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &max_standby_archive_delay,
+ 30 * 1000, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_standby_streaming_delay", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &max_standby_streaming_delay,
+ 30 * 1000, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_min_apply_delay", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the minimum delay for applying changes during recovery."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &recovery_min_apply_delay,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_receiver_status_interval", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the maximum interval between WAL receiver status reports to the sending server."),
+ NULL,
+ GUC_UNIT_S
+ },
+ &wal_receiver_status_interval,
+ 10, 0, INT_MAX / 1000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_receiver_timeout", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the maximum wait time to receive data from the sending server."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &wal_receiver_timeout,
+ 60 * 1000, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the maximum number of concurrent connections."),
+ NULL
+ },
+ &MaxConnections,
+ 100, 1, MAX_BACKENDS,
+ check_maxconnections, NULL, NULL
+ },
+
+ {
+ /* see max_connections */
+ {"superuser_reserved_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the number of connection slots reserved for superusers."),
+ NULL
+ },
+ &ReservedBackends,
+ 3, 0, MAX_BACKENDS,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"min_dynamic_shared_memory", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Amount of dynamic shared memory reserved at startup."),
+ NULL,
+ GUC_UNIT_MB
+ },
+ &min_dynamic_shared_memory,
+ 0, 0, (int) Min((size_t) INT_MAX, SIZE_MAX / (1024 * 1024)),
+ NULL, NULL, NULL
+ },
+
+ /*
+ * We sometimes multiply the number of shared buffers by two without
+ * checking for overflow, so we mustn't allow more than INT_MAX / 2.
+ */
+ {
+ {"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Sets the number of shared memory buffers used by the server."),
+ NULL,
+ GUC_UNIT_BLOCKS
+ },
+ &NBuffers,
+ 16384, 16, INT_MAX / 2,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"shared_memory_size", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the size of the server's main shared memory area (rounded up to the nearest MB)."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_UNIT_MB | GUC_RUNTIME_COMPUTED
+ },
+ &shared_memory_size_mb,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"shared_memory_size_in_huge_pages", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the number of huge pages needed for the main shared memory area."),
+ gettext_noop("-1 indicates that the value could not be determined."),
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED
+ },
+ &shared_memory_size_in_huge_pages,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"temp_buffers", PGC_USERSET, RESOURCES_MEM,
+ gettext_noop("Sets the maximum number of temporary buffers used by each session."),
+ NULL,
+ GUC_UNIT_BLOCKS | GUC_EXPLAIN
+ },
+ &num_temp_buffers,
+ 1024, 100, INT_MAX / 2,
+ check_temp_buffers, NULL, NULL
+ },
+
+ {
+ {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the TCP port the server listens on."),
+ NULL
+ },
+ &PostPortNumber,
+ DEF_PGPORT, 1, 65535,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"unix_socket_permissions", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the access permissions of the Unix-domain socket."),
+ gettext_noop("Unix-domain sockets use the usual Unix file system "
+ "permission set. The parameter value is expected "
+ "to be a numeric mode specification in the form "
+ "accepted by the chmod and umask system calls. "
+ "(To use the customary octal format the number must "
+ "start with a 0 (zero).)")
+ },
+ &Unix_socket_permissions,
+ 0777, 0000, 0777,
+ NULL, NULL, show_unix_socket_permissions
+ },
+
+ {
+ {"log_file_mode", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the file permissions for log files."),
+ gettext_noop("The parameter value is expected "
+ "to be a numeric mode specification in the form "
+ "accepted by the chmod and umask system calls. "
+ "(To use the customary octal format the number must "
+ "start with a 0 (zero).)")
+ },
+ &Log_file_mode,
+ 0600, 0000, 0777,
+ NULL, NULL, show_log_file_mode
+ },
+
+
+ {
+ {"data_directory_mode", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the mode of the data directory."),
+ gettext_noop("The parameter value is a numeric mode specification "
+ "in the form accepted by the chmod and umask system "
+ "calls. (To use the customary octal format the number "
+ "must start with a 0 (zero).)"),
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED
+ },
+ &data_directory_mode,
+ 0700, 0000, 0777,
+ NULL, NULL, show_data_directory_mode
+ },
+
+ {
+ {"work_mem", PGC_USERSET, RESOURCES_MEM,
+ gettext_noop("Sets the maximum memory to be used for query workspaces."),
+ gettext_noop("This much memory can be used by each internal "
+ "sort operation and hash table before switching to "
+ "temporary disk files."),
+ GUC_UNIT_KB | GUC_EXPLAIN
+ },
+ &work_mem,
+ 4096, 64, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"maintenance_work_mem", PGC_USERSET, RESOURCES_MEM,
+ gettext_noop("Sets the maximum memory to be used for maintenance operations."),
+ gettext_noop("This includes operations such as VACUUM and CREATE INDEX."),
+ GUC_UNIT_KB
+ },
+ &maintenance_work_mem,
+ 65536, 1024, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"logical_decoding_work_mem", PGC_USERSET, RESOURCES_MEM,
+ gettext_noop("Sets the maximum memory to be used for logical decoding."),
+ gettext_noop("This much memory can be used by each internal "
+ "reorder buffer before spilling to disk."),
+ GUC_UNIT_KB
+ },
+ &logical_decoding_work_mem,
+ 65536, 64, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ /*
+ * We use the hopefully-safely-small value of 100kB as the compiled-in
+ * default for max_stack_depth. InitializeGUCOptions will increase it if
+ * possible, depending on the actual platform-specific stack limit.
+ */
+ {
+ {"max_stack_depth", PGC_SUSET, RESOURCES_MEM,
+ gettext_noop("Sets the maximum stack depth, in kilobytes."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &max_stack_depth,
+ 100, 100, MAX_KILOBYTES,
+ check_max_stack_depth, assign_max_stack_depth, NULL
+ },
+
+ {
+ {"temp_file_limit", PGC_SUSET, RESOURCES_DISK,
+ gettext_noop("Limits the total size of all temporary files used by each process."),
+ gettext_noop("-1 means no limit."),
+ GUC_UNIT_KB
+ },
+ &temp_file_limit,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_cost_page_hit", PGC_USERSET, RESOURCES_VACUUM_DELAY,
+ gettext_noop("Vacuum cost for a page found in the buffer cache."),
+ NULL
+ },
+ &VacuumCostPageHit,
+ 1, 0, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_cost_page_miss", PGC_USERSET, RESOURCES_VACUUM_DELAY,
+ gettext_noop("Vacuum cost for a page not found in the buffer cache."),
+ NULL
+ },
+ &VacuumCostPageMiss,
+ 2, 0, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_cost_page_dirty", PGC_USERSET, RESOURCES_VACUUM_DELAY,
+ gettext_noop("Vacuum cost for a page dirtied by vacuum."),
+ NULL
+ },
+ &VacuumCostPageDirty,
+ 20, 0, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_cost_limit", PGC_USERSET, RESOURCES_VACUUM_DELAY,
+ gettext_noop("Vacuum cost amount available before napping."),
+ NULL
+ },
+ &VacuumCostLimit,
+ 200, 1, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_vacuum_cost_limit", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Vacuum cost amount available before napping, for autovacuum."),
+ NULL
+ },
+ &autovacuum_vac_cost_limit,
+ -1, -1, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_files_per_process", PGC_POSTMASTER, RESOURCES_KERNEL,
+ gettext_noop("Sets the maximum number of simultaneously open files for each server process."),
+ NULL
+ },
+ &max_files_per_process,
+ 1000, 64, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ /*
+ * See also CheckRequiredParameterValues() if this parameter changes
+ */
+ {
+ {"max_prepared_transactions", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Sets the maximum number of simultaneously prepared transactions."),
+ NULL
+ },
+ &max_prepared_xacts,
+ 0, 0, MAX_BACKENDS,
+ NULL, NULL, NULL
+ },
+
+#ifdef LOCK_DEBUG
+ {
+ {"trace_lock_oidmin", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Sets the minimum OID of tables for tracking locks."),
+ gettext_noop("Is used to avoid output on system tables."),
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_lock_oidmin,
+ FirstNormalObjectId, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"trace_lock_table", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Sets the OID of the table with unconditionally lock tracing."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &Trace_lock_table,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+#endif
+
+ {
+ {"statement_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the maximum allowed duration of any statement."),
+ gettext_noop("A value of 0 turns off the timeout."),
+ GUC_UNIT_MS
+ },
+ &StatementTimeout,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"lock_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the maximum allowed duration of any wait for a lock."),
+ gettext_noop("A value of 0 turns off the timeout."),
+ GUC_UNIT_MS
+ },
+ &LockTimeout,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"idle_in_transaction_session_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the maximum allowed idle time between queries, when in a transaction."),
+ gettext_noop("A value of 0 turns off the timeout."),
+ GUC_UNIT_MS
+ },
+ &IdleInTransactionSessionTimeout,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"idle_session_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the maximum allowed idle time between queries, when not in a transaction."),
+ gettext_noop("A value of 0 turns off the timeout."),
+ GUC_UNIT_MS
+ },
+ &IdleSessionTimeout,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_freeze_min_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Minimum age at which VACUUM should freeze a table row."),
+ NULL
+ },
+ &vacuum_freeze_min_age,
+ 50000000, 0, 1000000000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_freeze_table_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Age at which VACUUM should scan whole table to freeze tuples."),
+ NULL
+ },
+ &vacuum_freeze_table_age,
+ 150000000, 0, 2000000000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_multixact_freeze_min_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Minimum age at which VACUUM should freeze a MultiXactId in a table row."),
+ NULL
+ },
+ &vacuum_multixact_freeze_min_age,
+ 5000000, 0, 1000000000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_multixact_freeze_table_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Multixact age at which VACUUM should scan whole table to freeze tuples."),
+ NULL
+ },
+ &vacuum_multixact_freeze_table_age,
+ 150000000, 0, 2000000000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"vacuum_defer_cleanup_age", PGC_SIGHUP, REPLICATION_PRIMARY,
+ gettext_noop("Number of transactions by which VACUUM and HOT cleanup should be deferred, if any."),
+ NULL
+ },
+ &vacuum_defer_cleanup_age,
+ 0, 0, 1000000, /* see ComputeXidHorizons */
+ NULL, NULL, NULL
+ },
+ {
+ {"vacuum_failsafe_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Age at which VACUUM should trigger failsafe to avoid a wraparound outage."),
+ NULL
+ },
+ &vacuum_failsafe_age,
+ 1600000000, 0, 2100000000,
+ NULL, NULL, NULL
+ },
+ {
+ {"vacuum_multixact_failsafe_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage."),
+ NULL
+ },
+ &vacuum_multixact_failsafe_age,
+ 1600000000, 0, 2100000000,
+ NULL, NULL, NULL
+ },
+
+ /*
+ * See also CheckRequiredParameterValues() if this parameter changes
+ */
+ {
+ {"max_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT,
+ gettext_noop("Sets the maximum number of locks per transaction."),
+ gettext_noop("The shared lock table is sized on the assumption that "
+ "at most max_locks_per_transaction * max_connections distinct "
+ "objects will need to be locked at any one time.")
+ },
+ &max_locks_per_xact,
+ 64, 10, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_pred_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT,
+ gettext_noop("Sets the maximum number of predicate locks per transaction."),
+ gettext_noop("The shared predicate lock table is sized on the assumption that "
+ "at most max_pred_locks_per_transaction * max_connections distinct "
+ "objects will need to be locked at any one time.")
+ },
+ &max_predicate_locks_per_xact,
+ 64, 10, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_pred_locks_per_relation", PGC_SIGHUP, LOCK_MANAGEMENT,
+ gettext_noop("Sets the maximum number of predicate-locked pages and tuples per relation."),
+ gettext_noop("If more than this total of pages and tuples in the same relation are locked "
+ "by a connection, those locks are replaced by a relation-level lock.")
+ },
+ &max_predicate_locks_per_relation,
+ -2, INT_MIN, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_pred_locks_per_page", PGC_SIGHUP, LOCK_MANAGEMENT,
+ gettext_noop("Sets the maximum number of predicate-locked tuples per page."),
+ gettext_noop("If more than this number of tuples on the same page are locked "
+ "by a connection, those locks are replaced by a page-level lock.")
+ },
+ &max_predicate_locks_per_page,
+ 2, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"authentication_timeout", PGC_SIGHUP, CONN_AUTH_AUTH,
+ gettext_noop("Sets the maximum allowed time to complete client authentication."),
+ NULL,
+ GUC_UNIT_S
+ },
+ &AuthenticationTimeout,
+ 60, 1, 600,
+ NULL, NULL, NULL
+ },
+
+ {
+ /* Not for general use */
+ {"pre_auth_delay", PGC_SIGHUP, DEVELOPER_OPTIONS,
+ gettext_noop("Sets the amount of time to wait before "
+ "authentication on connection startup."),
+ gettext_noop("This allows attaching a debugger to the process."),
+ GUC_NOT_IN_SAMPLE | GUC_UNIT_S
+ },
+ &PreAuthDelay,
+ 0, 0, 60,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_decode_buffer_size", PGC_POSTMASTER, WAL_RECOVERY,
+ gettext_noop("Buffer size for reading ahead in the WAL during recovery."),
+ gettext_noop("Maximum distance to read ahead in the WAL to prefetch referenced data blocks."),
+ GUC_UNIT_BYTE
+ },
+ &wal_decode_buffer_size,
+ 512 * 1024, 64 * 1024, MaxAllocSize,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_keep_size", PGC_SIGHUP, REPLICATION_SENDING,
+ gettext_noop("Sets the size of WAL files held for standby servers."),
+ NULL,
+ GUC_UNIT_MB
+ },
+ &wal_keep_size_mb,
+ 0, 0, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"min_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Sets the minimum size to shrink the WAL to."),
+ NULL,
+ GUC_UNIT_MB
+ },
+ &min_wal_size_mb,
+ DEFAULT_MIN_WAL_SEGS * (DEFAULT_XLOG_SEG_SIZE / (1024 * 1024)),
+ 2, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Sets the WAL size that triggers a checkpoint."),
+ NULL,
+ GUC_UNIT_MB
+ },
+ &max_wal_size_mb,
+ DEFAULT_MAX_WAL_SEGS * (DEFAULT_XLOG_SEG_SIZE / (1024 * 1024)),
+ 2, MAX_KILOBYTES,
+ NULL, assign_max_wal_size, NULL
+ },
+
+ {
+ {"checkpoint_timeout", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Sets the maximum time between automatic WAL checkpoints."),
+ NULL,
+ GUC_UNIT_S
+ },
+ &CheckPointTimeout,
+ 300, 30, 86400,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"checkpoint_warning", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Sets the maximum time before warning if checkpoints "
+ "triggered by WAL volume happen too frequently."),
+ gettext_noop("Write a message to the server log if checkpoints "
+ "caused by the filling of WAL segment files happen more "
+ "frequently than this amount of time. "
+ "Zero turns off the warning."),
+ GUC_UNIT_S
+ },
+ &CheckPointWarning,
+ 30, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"checkpoint_flush_after", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Number of pages after which previously performed writes are flushed to disk."),
+ NULL,
+ GUC_UNIT_BLOCKS
+ },
+ &checkpoint_flush_after,
+ DEFAULT_CHECKPOINT_FLUSH_AFTER, 0, WRITEBACK_MAX_PENDING_FLUSHES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_buffers", PGC_POSTMASTER, WAL_SETTINGS,
+ gettext_noop("Sets the number of disk-page buffers in shared memory for WAL."),
+ NULL,
+ GUC_UNIT_XBLOCKS
+ },
+ &XLOGbuffers,
+ -1, -1, (INT_MAX / XLOG_BLCKSZ),
+ check_wal_buffers, NULL, NULL
+ },
+
+ {
+ {"wal_writer_delay", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Time between WAL flushes performed in the WAL writer."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &WalWriterDelay,
+ 200, 1, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_writer_flush_after", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Amount of WAL written out by WAL writer that triggers a flush."),
+ NULL,
+ GUC_UNIT_XBLOCKS
+ },
+ &WalWriterFlushAfter,
+ (1024 * 1024) / XLOG_BLCKSZ, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_skip_threshold", PGC_USERSET, WAL_SETTINGS,
+ gettext_noop("Minimum size of new file to fsync instead of writing WAL."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &wal_skip_threshold,
+ 2048, 0, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_wal_senders", PGC_POSTMASTER, REPLICATION_SENDING,
+ gettext_noop("Sets the maximum number of simultaneously running WAL sender processes."),
+ NULL
+ },
+ &max_wal_senders,
+ 10, 0, MAX_BACKENDS,
+ check_max_wal_senders, NULL, NULL
+ },
+
+ {
+ /* see max_wal_senders */
+ {"max_replication_slots", PGC_POSTMASTER, REPLICATION_SENDING,
+ gettext_noop("Sets the maximum number of simultaneously defined replication slots."),
+ NULL
+ },
+ &max_replication_slots,
+ 10, 0, MAX_BACKENDS /* XXX? */ ,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_slot_wal_keep_size", PGC_SIGHUP, REPLICATION_SENDING,
+ gettext_noop("Sets the maximum WAL size that can be reserved by replication slots."),
+ gettext_noop("Replication slots will be marked as failed, and segments released "
+ "for deletion or recycling, if this much space is occupied by WAL "
+ "on disk."),
+ GUC_UNIT_MB
+ },
+ &max_slot_wal_keep_size_mb,
+ -1, -1, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_sender_timeout", PGC_USERSET, REPLICATION_SENDING,
+ gettext_noop("Sets the maximum time to wait for WAL replication."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &wal_sender_timeout,
+ 60 * 1000, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"commit_delay", PGC_SUSET, WAL_SETTINGS,
+ gettext_noop("Sets the delay in microseconds between transaction commit and "
+ "flushing WAL to disk."),
+ NULL
+ /* we have no microseconds designation, so can't supply units here */
+ },
+ &CommitDelay,
+ 0, 0, 100000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"commit_siblings", PGC_USERSET, WAL_SETTINGS,
+ gettext_noop("Sets the minimum number of concurrent open transactions "
+ "required before performing commit_delay."),
+ NULL
+ },
+ &CommitSiblings,
+ 5, 0, 1000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"extra_float_digits", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the number of digits displayed for floating-point values."),
+ gettext_noop("This affects real, double precision, and geometric data types. "
+ "A zero or negative parameter value is added to the standard "
+ "number of digits (FLT_DIG or DBL_DIG as appropriate). "
+ "Any value greater than zero selects precise output mode.")
+ },
+ &extra_float_digits,
+ 1, -15, 3,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_min_duration_sample", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Sets the minimum execution time above which "
+ "a sample of statements will be logged."
+ " Sampling is determined by log_statement_sample_rate."),
+ gettext_noop("Zero logs a sample of all queries. -1 turns this feature off."),
+ GUC_UNIT_MS
+ },
+ &log_min_duration_sample,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_min_duration_statement", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Sets the minimum execution time above which "
+ "all statements will be logged."),
+ gettext_noop("Zero prints all queries. -1 turns this feature off."),
+ GUC_UNIT_MS
+ },
+ &log_min_duration_statement,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_autovacuum_min_duration", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Sets the minimum execution time above which "
+ "autovacuum actions will be logged."),
+ gettext_noop("Zero prints all actions. -1 turns autovacuum logging off."),
+ GUC_UNIT_MS
+ },
+ &Log_autovacuum_min_duration,
+ 600000, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_parameter_max_length", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Sets the maximum length in bytes of data logged for bind "
+ "parameter values when logging statements."),
+ gettext_noop("-1 to print values in full."),
+ GUC_UNIT_BYTE
+ },
+ &log_parameter_max_length,
+ -1, -1, INT_MAX / 2,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_parameter_max_length_on_error", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Sets the maximum length in bytes of data logged for bind "
+ "parameter values when logging statements, on error."),
+ gettext_noop("-1 to print values in full."),
+ GUC_UNIT_BYTE
+ },
+ &log_parameter_max_length_on_error,
+ 0, -1, INT_MAX / 2,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bgwriter_delay", PGC_SIGHUP, RESOURCES_BGWRITER,
+ gettext_noop("Background writer sleep time between rounds."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &BgWriterDelay,
+ 200, 10, 10000,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bgwriter_lru_maxpages", PGC_SIGHUP, RESOURCES_BGWRITER,
+ gettext_noop("Background writer maximum number of LRU pages to flush per round."),
+ NULL
+ },
+ &bgwriter_lru_maxpages,
+ 100, 0, INT_MAX / 2, /* Same upper limit as shared_buffers */
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bgwriter_flush_after", PGC_SIGHUP, RESOURCES_BGWRITER,
+ gettext_noop("Number of pages after which previously performed writes are flushed to disk."),
+ NULL,
+ GUC_UNIT_BLOCKS
+ },
+ &bgwriter_flush_after,
+ DEFAULT_BGWRITER_FLUSH_AFTER, 0, WRITEBACK_MAX_PENDING_FLUSHES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"effective_io_concurrency",
+ PGC_USERSET,
+ RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Number of simultaneous requests that can be handled efficiently by the disk subsystem."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &effective_io_concurrency,
+#ifdef USE_PREFETCH
+ 1,
+#else
+ 0,
+#endif
+ 0, MAX_IO_CONCURRENCY,
+ check_effective_io_concurrency, NULL, NULL
+ },
+
+ {
+ {"maintenance_io_concurrency",
+ PGC_USERSET,
+ RESOURCES_ASYNCHRONOUS,
+ gettext_noop("A variant of effective_io_concurrency that is used for maintenance work."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &maintenance_io_concurrency,
+#ifdef USE_PREFETCH
+ 10,
+#else
+ 0,
+#endif
+ 0, MAX_IO_CONCURRENCY,
+ check_maintenance_io_concurrency, assign_maintenance_io_concurrency,
+ NULL
+ },
+
+ {
+ {"backend_flush_after", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Number of pages after which previously performed writes are flushed to disk."),
+ NULL,
+ GUC_UNIT_BLOCKS
+ },
+ &backend_flush_after,
+ DEFAULT_BACKEND_FLUSH_AFTER, 0, WRITEBACK_MAX_PENDING_FLUSHES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_worker_processes",
+ PGC_POSTMASTER,
+ RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Maximum number of concurrent worker processes."),
+ NULL,
+ },
+ &max_worker_processes,
+ 8, 0, MAX_BACKENDS,
+ check_max_worker_processes, NULL, NULL
+ },
+
+ {
+ {"max_logical_replication_workers",
+ PGC_POSTMASTER,
+ REPLICATION_SUBSCRIBERS,
+ gettext_noop("Maximum number of logical replication worker processes."),
+ NULL,
+ },
+ &max_logical_replication_workers,
+ 4, 0, MAX_BACKENDS,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_sync_workers_per_subscription",
+ PGC_SIGHUP,
+ REPLICATION_SUBSCRIBERS,
+ gettext_noop("Maximum number of table synchronization workers per subscription."),
+ NULL,
+ },
+ &max_sync_workers_per_subscription,
+ 2, 0, MAX_BACKENDS,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_rotation_age", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the amount of time to wait before forcing "
+ "log file rotation."),
+ NULL,
+ GUC_UNIT_MIN
+ },
+ &Log_RotationAge,
+ HOURS_PER_DAY * MINS_PER_HOUR, 0, INT_MAX / SECS_PER_MINUTE,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_rotation_size", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the maximum size a log file can reach before "
+ "being rotated."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &Log_RotationSize,
+ 10 * 1024, 0, INT_MAX / 1024,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_function_args", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the maximum number of function arguments."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &max_function_args,
+ FUNC_MAX_ARGS, FUNC_MAX_ARGS, FUNC_MAX_ARGS,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_index_keys", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the maximum number of index keys."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &max_index_keys,
+ INDEX_MAX_KEYS, INDEX_MAX_KEYS, INDEX_MAX_KEYS,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_identifier_length", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the maximum identifier length."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &max_identifier_length,
+ NAMEDATALEN - 1, NAMEDATALEN - 1, NAMEDATALEN - 1,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"block_size", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the size of a disk block."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &block_size,
+ BLCKSZ, BLCKSZ, BLCKSZ,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"segment_size", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the number of pages per disk file."),
+ NULL,
+ GUC_UNIT_BLOCKS | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &segment_size,
+ RELSEG_SIZE, RELSEG_SIZE, RELSEG_SIZE,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_block_size", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the block size in the write ahead log."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &wal_block_size,
+ XLOG_BLCKSZ, XLOG_BLCKSZ, XLOG_BLCKSZ,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_retrieve_retry_interval", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the time to wait before retrying to retrieve WAL "
+ "after a failed attempt."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &wal_retrieve_retry_interval,
+ 5000, 1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_segment_size", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the size of write ahead log segments."),
+ NULL,
+ GUC_UNIT_BYTE | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED
+ },
+ &wal_segment_size,
+ DEFAULT_XLOG_SEG_SIZE,
+ WalSegMinSize,
+ WalSegMaxSize,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_naptime", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Time to sleep between autovacuum runs."),
+ NULL,
+ GUC_UNIT_S
+ },
+ &autovacuum_naptime,
+ 60, 1, INT_MAX / 1000,
+ NULL, NULL, NULL
+ },
+ {
+ {"autovacuum_vacuum_threshold", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Minimum number of tuple updates or deletes prior to vacuum."),
+ NULL
+ },
+ &autovacuum_vac_thresh,
+ 50, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"autovacuum_vacuum_insert_threshold", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums."),
+ NULL
+ },
+ &autovacuum_vac_ins_thresh,
+ 1000, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"autovacuum_analyze_threshold", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Minimum number of tuple inserts, updates, or deletes prior to analyze."),
+ NULL
+ },
+ &autovacuum_anl_thresh,
+ 50, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ /* see varsup.c for why this is PGC_POSTMASTER not PGC_SIGHUP */
+ {"autovacuum_freeze_max_age", PGC_POSTMASTER, AUTOVACUUM,
+ gettext_noop("Age at which to autovacuum a table to prevent transaction ID wraparound."),
+ NULL
+ },
+ &autovacuum_freeze_max_age,
+
+ /* see vacuum_failsafe_age if you change the upper-limit value. */
+ 200000000, 100000, 2000000000,
+ NULL, NULL, NULL
+ },
+ {
+ /* see multixact.c for why this is PGC_POSTMASTER not PGC_SIGHUP */
+ {"autovacuum_multixact_freeze_max_age", PGC_POSTMASTER, AUTOVACUUM,
+ gettext_noop("Multixact age at which to autovacuum a table to prevent multixact wraparound."),
+ NULL
+ },
+ &autovacuum_multixact_freeze_max_age,
+ 400000000, 10000, 2000000000,
+ NULL, NULL, NULL
+ },
+ {
+ /* see max_connections */
+ {"autovacuum_max_workers", PGC_POSTMASTER, AUTOVACUUM,
+ gettext_noop("Sets the maximum number of simultaneously running autovacuum worker processes."),
+ NULL
+ },
+ &autovacuum_max_workers,
+ 3, 1, MAX_BACKENDS,
+ check_autovacuum_max_workers, NULL, NULL
+ },
+
+ {
+ {"max_parallel_maintenance_workers", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Sets the maximum number of parallel processes per maintenance operation."),
+ NULL
+ },
+ &max_parallel_maintenance_workers,
+ 2, 0, 1024,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_parallel_workers_per_gather", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Sets the maximum number of parallel processes per executor node."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &max_parallel_workers_per_gather,
+ 2, 0, MAX_PARALLEL_WORKER_LIMIT,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"max_parallel_workers", PGC_USERSET, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Sets the maximum number of parallel workers that can be active at one time."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &max_parallel_workers,
+ 8, 0, MAX_PARALLEL_WORKER_LIMIT,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_work_mem", PGC_SIGHUP, RESOURCES_MEM,
+ gettext_noop("Sets the maximum memory to be used by each autovacuum worker process."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &autovacuum_work_mem,
+ -1, -1, MAX_KILOBYTES,
+ check_autovacuum_work_mem, NULL, NULL
+ },
+
+ {
+ {"old_snapshot_threshold", PGC_POSTMASTER, RESOURCES_ASYNCHRONOUS,
+ gettext_noop("Time before a snapshot is too old to read pages changed after the snapshot was taken."),
+ gettext_noop("A value of -1 disables this feature."),
+ GUC_UNIT_MIN
+ },
+ &old_snapshot_threshold,
+ -1, -1, MINS_PER_HOUR * HOURS_PER_DAY * 60,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"tcp_keepalives_idle", PGC_USERSET, CONN_AUTH_SETTINGS,
+ gettext_noop("Time between issuing TCP keepalives."),
+ gettext_noop("A value of 0 uses the system default."),
+ GUC_UNIT_S
+ },
+ &tcp_keepalives_idle,
+ 0, 0, INT_MAX,
+ NULL, assign_tcp_keepalives_idle, show_tcp_keepalives_idle
+ },
+
+ {
+ {"tcp_keepalives_interval", PGC_USERSET, CONN_AUTH_SETTINGS,
+ gettext_noop("Time between TCP keepalive retransmits."),
+ gettext_noop("A value of 0 uses the system default."),
+ GUC_UNIT_S
+ },
+ &tcp_keepalives_interval,
+ 0, 0, INT_MAX,
+ NULL, assign_tcp_keepalives_interval, show_tcp_keepalives_interval
+ },
+
+ {
+ {"ssl_renegotiation_limit", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("SSL renegotiation is no longer supported; this can only be 0."),
+ NULL,
+ GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE,
+ },
+ &ssl_renegotiation_limit,
+ 0, 0, 0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"tcp_keepalives_count", PGC_USERSET, CONN_AUTH_SETTINGS,
+ gettext_noop("Maximum number of TCP keepalive retransmits."),
+ gettext_noop("Number of consecutive keepalive retransmits that can be "
+ "lost before a connection is considered dead. A value of 0 uses the "
+ "system default."),
+ },
+ &tcp_keepalives_count,
+ 0, 0, INT_MAX,
+ NULL, assign_tcp_keepalives_count, show_tcp_keepalives_count
+ },
+
+ {
+ {"gin_fuzzy_search_limit", PGC_USERSET, CLIENT_CONN_OTHER,
+ gettext_noop("Sets the maximum allowed result for exact search by GIN."),
+ NULL,
+ 0
+ },
+ &GinFuzzySearchLimit,
+ 0, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"effective_cache_size", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's assumption about the total size of the data caches."),
+ gettext_noop("That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. "
+ "This is measured in disk pages, which are normally 8 kB each."),
+ GUC_UNIT_BLOCKS | GUC_EXPLAIN,
+ },
+ &effective_cache_size,
+ DEFAULT_EFFECTIVE_CACHE_SIZE, 1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"min_parallel_table_scan_size", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the minimum amount of table data for a parallel scan."),
+ gettext_noop("If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered."),
+ GUC_UNIT_BLOCKS | GUC_EXPLAIN,
+ },
+ &min_parallel_table_scan_size,
+ (8 * 1024 * 1024) / BLCKSZ, 0, INT_MAX / 3,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"min_parallel_index_scan_size", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the minimum amount of index data for a parallel scan."),
+ gettext_noop("If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered."),
+ GUC_UNIT_BLOCKS | GUC_EXPLAIN,
+ },
+ &min_parallel_index_scan_size,
+ (512 * 1024) / BLCKSZ, 0, INT_MAX / 3,
+ NULL, NULL, NULL
+ },
+
+ {
+ /* Can't be set in postgresql.conf */
+ {"server_version_num", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the server version as an integer."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &server_version_num,
+ PG_VERSION_NUM, PG_VERSION_NUM, PG_VERSION_NUM,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_temp_files", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Log the use of temporary files larger than this number of kilobytes."),
+ gettext_noop("Zero logs all files. The default is -1 (turning this feature off)."),
+ GUC_UNIT_KB
+ },
+ &log_temp_files,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"track_activity_query_size", PGC_POSTMASTER, STATS_CUMULATIVE,
+ gettext_noop("Sets the size reserved for pg_stat_activity.query, in bytes."),
+ NULL,
+ GUC_UNIT_BYTE
+ },
+ &pgstat_track_activity_query_size,
+ 1024, 100, 1048576,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"gin_pending_list_limit", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the maximum size of the pending list for GIN index."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &gin_pending_list_limit,
+ 4096, 64, MAX_KILOBYTES,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"tcp_user_timeout", PGC_USERSET, CONN_AUTH_SETTINGS,
+ gettext_noop("TCP user timeout."),
+ gettext_noop("A value of 0 uses the system default."),
+ GUC_UNIT_MS
+ },
+ &tcp_user_timeout,
+ 0, 0, INT_MAX,
+ NULL, assign_tcp_user_timeout, show_tcp_user_timeout
+ },
+
+ {
+ {"huge_page_size", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("The size of huge page that should be requested."),
+ NULL,
+ GUC_UNIT_KB
+ },
+ &huge_page_size,
+ 0, 0, INT_MAX,
+ check_huge_page_size, NULL, NULL
+ },
+
+ {
+ {"debug_discard_caches", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Aggressively flush system caches for debugging purposes."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &debug_discard_caches,
+#ifdef DISCARD_CACHES_ENABLED
+ /* Set default based on older compile-time-only cache clobber macros */
+#if defined(CLOBBER_CACHE_RECURSIVELY)
+ 3,
+#elif defined(CLOBBER_CACHE_ALWAYS)
+ 1,
+#else
+ 0,
+#endif
+ 0, 5,
+#else /* not DISCARD_CACHES_ENABLED */
+ 0, 0, 0,
+#endif /* not DISCARD_CACHES_ENABLED */
+ NULL, NULL, NULL
+ },
+
+ {
+ {"client_connection_check_interval", PGC_USERSET, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the time interval between checks for disconnection while running queries."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &client_connection_check_interval,
+ 0, 0, INT_MAX,
+ check_client_connection_check_interval, NULL, NULL
+ },
+
+ {
+ {"log_startup_progress_interval", PGC_SIGHUP, LOGGING_WHEN,
+ gettext_noop("Time between progress updates for "
+ "long-running startup operations."),
+ gettext_noop("0 turns this feature off."),
+ GUC_UNIT_MS,
+ },
+ &log_startup_progress_interval,
+ 10000, 0, INT_MAX,
+ NULL, NULL, NULL
+ },
+
+ /* End-of-list marker */
+ {
+ {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL, NULL
+ }
+};
+
+
+static struct config_real ConfigureNamesReal[] =
+{
+ {
+ {"seq_page_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of a "
+ "sequentially fetched disk page."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &seq_page_cost,
+ DEFAULT_SEQ_PAGE_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"random_page_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of a "
+ "nonsequentially fetched disk page."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &random_page_cost,
+ DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"cpu_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of "
+ "processing each tuple (row)."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &cpu_tuple_cost,
+ DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"cpu_index_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of "
+ "processing each index entry during an index scan."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &cpu_index_tuple_cost,
+ DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"cpu_operator_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of "
+ "processing each operator or function call."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &cpu_operator_cost,
+ DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"parallel_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of "
+ "passing each tuple (row) from worker to leader backend."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &parallel_tuple_cost,
+ DEFAULT_PARALLEL_TUPLE_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+ {
+ {"parallel_setup_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Sets the planner's estimate of the cost of "
+ "starting up worker processes for parallel query."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &parallel_setup_cost,
+ DEFAULT_PARALLEL_SETUP_COST, 0, DBL_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_above_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Perform JIT compilation if query is more expensive."),
+ gettext_noop("-1 disables JIT compilation."),
+ GUC_EXPLAIN
+ },
+ &jit_above_cost,
+ 100000, -1, DBL_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_optimize_above_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Optimize JIT-compiled functions if query is more expensive."),
+ gettext_noop("-1 disables optimization."),
+ GUC_EXPLAIN
+ },
+ &jit_optimize_above_cost,
+ 500000, -1, DBL_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"jit_inline_above_cost", PGC_USERSET, QUERY_TUNING_COST,
+ gettext_noop("Perform JIT inlining if query is more expensive."),
+ gettext_noop("-1 disables inlining."),
+ GUC_EXPLAIN
+ },
+ &jit_inline_above_cost,
+ 500000, -1, DBL_MAX,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"cursor_tuple_fraction", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Sets the planner's estimate of the fraction of "
+ "a cursor's rows that will be retrieved."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &cursor_tuple_fraction,
+ DEFAULT_CURSOR_TUPLE_FRACTION, 0.0, 1.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recursive_worktable_factor", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Sets the planner's estimate of the average size "
+ "of a recursive query's working table."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &recursive_worktable_factor,
+ DEFAULT_RECURSIVE_WORKTABLE_FACTOR, 0.001, 1000000.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("GEQO: selective pressure within the population."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &Geqo_selection_bias,
+ DEFAULT_GEQO_SELECTION_BIAS,
+ MIN_GEQO_SELECTION_BIAS, MAX_GEQO_SELECTION_BIAS,
+ NULL, NULL, NULL
+ },
+ {
+ {"geqo_seed", PGC_USERSET, QUERY_TUNING_GEQO,
+ gettext_noop("GEQO: seed for random path selection."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &Geqo_seed,
+ 0.0, 0.0, 1.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"hash_mem_multiplier", PGC_USERSET, RESOURCES_MEM,
+ gettext_noop("Multiple of work_mem to use for hash tables."),
+ NULL,
+ GUC_EXPLAIN
+ },
+ &hash_mem_multiplier,
+ 2.0, 1.0, 1000.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bgwriter_lru_multiplier", PGC_SIGHUP, RESOURCES_BGWRITER,
+ gettext_noop("Multiple of the average buffer usage to free per round."),
+ NULL
+ },
+ &bgwriter_lru_multiplier,
+ 2.0, 0.0, 10.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"seed", PGC_USERSET, UNGROUPED,
+ gettext_noop("Sets the seed for random-number generation."),
+ NULL,
+ GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &phony_random_seed,
+ 0.0, -1.0, 1.0,
+ check_random_seed, assign_random_seed, show_random_seed
+ },
+
+ {
+ {"vacuum_cost_delay", PGC_USERSET, RESOURCES_VACUUM_DELAY,
+ gettext_noop("Vacuum cost delay in milliseconds."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &VacuumCostDelay,
+ 0, 0, 100,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_vacuum_cost_delay", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Vacuum cost delay in milliseconds, for autovacuum."),
+ NULL,
+ GUC_UNIT_MS
+ },
+ &autovacuum_vac_cost_delay,
+ 2, -1, 100,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_vacuum_scale_factor", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Number of tuple updates or deletes prior to vacuum as a fraction of reltuples."),
+ NULL
+ },
+ &autovacuum_vac_scale,
+ 0.2, 0.0, 100.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_vacuum_insert_scale_factor", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Number of tuple inserts prior to vacuum as a fraction of reltuples."),
+ NULL
+ },
+ &autovacuum_vac_ins_scale,
+ 0.2, 0.0, 100.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"autovacuum_analyze_scale_factor", PGC_SIGHUP, AUTOVACUUM,
+ gettext_noop("Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples."),
+ NULL
+ },
+ &autovacuum_anl_scale,
+ 0.1, 0.0, 100.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"checkpoint_completion_target", PGC_SIGHUP, WAL_CHECKPOINTS,
+ gettext_noop("Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval."),
+ NULL
+ },
+ &CheckPointCompletionTarget,
+ 0.9, 0.0, 1.0,
+ NULL, assign_checkpoint_completion_target, NULL
+ },
+
+ {
+ {"log_statement_sample_rate", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Fraction of statements exceeding log_min_duration_sample to be logged."),
+ gettext_noop("Use a value between 0.0 (never log) and 1.0 (always log).")
+ },
+ &log_statement_sample_rate,
+ 1.0, 0.0, 1.0,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_transaction_sample_rate", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Sets the fraction of transactions from which to log all statements."),
+ gettext_noop("Use a value between 0.0 (never log) and 1.0 (log all "
+ "statements for all transactions).")
+ },
+ &log_xact_sample_rate,
+ 0.0, 0.0, 1.0,
+ NULL, NULL, NULL
+ },
+
+ /* End-of-list marker */
+ {
+ {NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
+ }
+};
+
+
+static struct config_string ConfigureNamesString[] =
+{
+ {
+ {"archive_command", PGC_SIGHUP, WAL_ARCHIVING,
+ gettext_noop("Sets the shell command that will be called to archive a WAL file."),
+ gettext_noop("This is used only if \"archive_library\" is not set.")
+ },
+ &XLogArchiveCommand,
+ "",
+ NULL, NULL, show_archive_command
+ },
+
+ {
+ {"archive_library", PGC_SIGHUP, WAL_ARCHIVING,
+ gettext_noop("Sets the library that will be called to archive a WAL file."),
+ gettext_noop("An empty string indicates that \"archive_command\" should be used.")
+ },
+ &XLogArchiveLibrary,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"restore_command", PGC_SIGHUP, WAL_ARCHIVE_RECOVERY,
+ gettext_noop("Sets the shell command that will be called to retrieve an archived WAL file."),
+ NULL
+ },
+ &recoveryRestoreCommand,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"archive_cleanup_command", PGC_SIGHUP, WAL_ARCHIVE_RECOVERY,
+ gettext_noop("Sets the shell command that will be executed at every restart point."),
+ NULL
+ },
+ &archiveCleanupCommand,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_end_command", PGC_SIGHUP, WAL_ARCHIVE_RECOVERY,
+ gettext_noop("Sets the shell command that will be executed once at the end of recovery."),
+ NULL
+ },
+ &recoveryEndCommand,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_target_timeline", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Specifies the timeline to recover into."),
+ NULL
+ },
+ &recovery_target_timeline_string,
+ "latest",
+ check_recovery_target_timeline, assign_recovery_target_timeline, NULL
+ },
+
+ {
+ {"recovery_target", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Set to \"immediate\" to end recovery as soon as a consistent state is reached."),
+ NULL
+ },
+ &recovery_target_string,
+ "",
+ check_recovery_target, assign_recovery_target, NULL
+ },
+ {
+ {"recovery_target_xid", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets the transaction ID up to which recovery will proceed."),
+ NULL
+ },
+ &recovery_target_xid_string,
+ "",
+ check_recovery_target_xid, assign_recovery_target_xid, NULL
+ },
+ {
+ {"recovery_target_time", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets the time stamp up to which recovery will proceed."),
+ NULL
+ },
+ &recovery_target_time_string,
+ "",
+ check_recovery_target_time, assign_recovery_target_time, NULL
+ },
+ {
+ {"recovery_target_name", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets the named restore point up to which recovery will proceed."),
+ NULL
+ },
+ &recovery_target_name_string,
+ "",
+ check_recovery_target_name, assign_recovery_target_name, NULL
+ },
+ {
+ {"recovery_target_lsn", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets the LSN of the write-ahead log location up to which recovery will proceed."),
+ NULL
+ },
+ &recovery_target_lsn_string,
+ "",
+ check_recovery_target_lsn, assign_recovery_target_lsn, NULL
+ },
+
+ {
+ {"promote_trigger_file", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Specifies a file name whose presence ends recovery in the standby."),
+ NULL
+ },
+ &PromoteTriggerFile,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"primary_conninfo", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the connection string to be used to connect to the sending server."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &PrimaryConnInfo,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"primary_slot_name", PGC_SIGHUP, REPLICATION_STANDBY,
+ gettext_noop("Sets the name of the replication slot to use on the sending server."),
+ NULL
+ },
+ &PrimarySlotName,
+ "",
+ check_primary_slot_name, NULL, NULL
+ },
+
+ {
+ {"client_encoding", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the client's character set encoding."),
+ NULL,
+ GUC_IS_NAME | GUC_REPORT
+ },
+ &client_encoding_string,
+ "SQL_ASCII",
+ check_client_encoding, assign_client_encoding, NULL
+ },
+
+ {
+ {"log_line_prefix", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Controls information prefixed to each log line."),
+ gettext_noop("If blank, no prefix is used.")
+ },
+ &Log_line_prefix,
+ "%m [%p] ",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_timezone", PGC_SIGHUP, LOGGING_WHAT,
+ gettext_noop("Sets the time zone to use in log messages."),
+ NULL
+ },
+ &log_timezone_string,
+ "GMT",
+ check_log_timezone, assign_log_timezone, show_log_timezone
+ },
+
+ {
+ {"DateStyle", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the display format for date and time values."),
+ gettext_noop("Also controls interpretation of ambiguous "
+ "date inputs."),
+ GUC_LIST_INPUT | GUC_REPORT
+ },
+ &datestyle_string,
+ "ISO, MDY",
+ check_datestyle, assign_datestyle, NULL
+ },
+
+ {
+ {"default_table_access_method", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the default table access method for new tables."),
+ NULL,
+ GUC_IS_NAME
+ },
+ &default_table_access_method,
+ DEFAULT_TABLE_ACCESS_METHOD,
+ check_default_table_access_method, NULL, NULL
+ },
+
+ {
+ {"default_tablespace", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the default tablespace to create tables and indexes in."),
+ gettext_noop("An empty string selects the database's default tablespace."),
+ GUC_IS_NAME
+ },
+ &default_tablespace,
+ "",
+ check_default_tablespace, NULL, NULL
+ },
+
+ {
+ {"temp_tablespaces", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the tablespace(s) to use for temporary tables and sort files."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE
+ },
+ &temp_tablespaces,
+ "",
+ check_temp_tablespaces, assign_temp_tablespaces, NULL
+ },
+
+ {
+ {"dynamic_library_path", PGC_SUSET, CLIENT_CONN_OTHER,
+ gettext_noop("Sets the path for dynamically loadable modules."),
+ gettext_noop("If a dynamically loadable module needs to be opened and "
+ "the specified name does not have a directory component (i.e., the "
+ "name does not contain a slash), the system will search this path for "
+ "the specified file."),
+ GUC_SUPERUSER_ONLY
+ },
+ &Dynamic_library_path,
+ "$libdir",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"krb_server_keyfile", PGC_SIGHUP, CONN_AUTH_AUTH,
+ gettext_noop("Sets the location of the Kerberos server key file."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &pg_krb_server_keyfile,
+ PG_KRB_SRVTAB,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bonjour_name", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the Bonjour service name."),
+ NULL
+ },
+ &bonjour_name,
+ "",
+ NULL, NULL, NULL
+ },
+
+ /* See main.c about why defaults for LC_foo are not all alike */
+
+ {
+ {"lc_collate", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the collation order locale."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &locale_collate,
+ "C",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"lc_ctype", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the character classification and case conversion locale."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &locale_ctype,
+ "C",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"lc_messages", PGC_SUSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the language in which messages are displayed."),
+ NULL
+ },
+ &locale_messages,
+ "",
+ check_locale_messages, assign_locale_messages, NULL
+ },
+
+ {
+ {"lc_monetary", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the locale for formatting monetary amounts."),
+ NULL
+ },
+ &locale_monetary,
+ "C",
+ check_locale_monetary, assign_locale_monetary, NULL
+ },
+
+ {
+ {"lc_numeric", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the locale for formatting numbers."),
+ NULL
+ },
+ &locale_numeric,
+ "C",
+ check_locale_numeric, assign_locale_numeric, NULL
+ },
+
+ {
+ {"lc_time", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the locale for formatting date and time values."),
+ NULL
+ },
+ &locale_time,
+ "C",
+ check_locale_time, assign_locale_time, NULL
+ },
+
+ {
+ {"session_preload_libraries", PGC_SUSET, CLIENT_CONN_PRELOAD,
+ gettext_noop("Lists shared libraries to preload into each backend."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY
+ },
+ &session_preload_libraries_string,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"shared_preload_libraries", PGC_POSTMASTER, CLIENT_CONN_PRELOAD,
+ gettext_noop("Lists shared libraries to preload into server."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY
+ },
+ &shared_preload_libraries_string,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"local_preload_libraries", PGC_USERSET, CLIENT_CONN_PRELOAD,
+ gettext_noop("Lists unprivileged shared libraries to preload into each backend."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE
+ },
+ &local_preload_libraries_string,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the schema search order for names that are not schema-qualified."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_EXPLAIN
+ },
+ &namespace_search_path,
+ "\"$user\", public",
+ check_search_path, assign_search_path, NULL
+ },
+
+ {
+ /* Can't be set in postgresql.conf */
+ {"server_encoding", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the server (database) character set encoding."),
+ NULL,
+ GUC_IS_NAME | GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &server_encoding_string,
+ "SQL_ASCII",
+ NULL, NULL, NULL
+ },
+
+ {
+ /* Can't be set in postgresql.conf */
+ {"server_version", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the server version."),
+ NULL,
+ GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &server_version_string,
+ PG_VERSION,
+ NULL, NULL, NULL
+ },
+
+ {
+ /* Not for general use --- used by SET ROLE */
+ {"role", PGC_USERSET, UNGROUPED,
+ gettext_noop("Sets the current role."),
+ NULL,
+ GUC_IS_NAME | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_NOT_WHILE_SEC_REST
+ },
+ &role_string,
+ "none",
+ check_role, assign_role, show_role
+ },
+
+ {
+ /* Not for general use --- used by SET SESSION AUTHORIZATION */
+ {"session_authorization", PGC_USERSET, UNGROUPED,
+ gettext_noop("Sets the session user name."),
+ NULL,
+ GUC_IS_NAME | GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_NOT_WHILE_SEC_REST
+ },
+ &session_authorization_string,
+ NULL,
+ check_session_authorization, assign_session_authorization, NULL
+ },
+
+ {
+ {"log_destination", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the destination for server log output."),
+ gettext_noop("Valid values are combinations of \"stderr\", "
+ "\"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", "
+ "depending on the platform."),
+ GUC_LIST_INPUT
+ },
+ &Log_destination_string,
+ "stderr",
+ check_log_destination, assign_log_destination, NULL
+ },
+ {
+ {"log_directory", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the destination directory for log files."),
+ gettext_noop("Can be specified as relative to the data directory "
+ "or as absolute path."),
+ GUC_SUPERUSER_ONLY
+ },
+ &Log_directory,
+ "log",
+ check_canonical_path, NULL, NULL
+ },
+ {
+ {"log_filename", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the file name pattern for log files."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &Log_filename,
+ "postgresql-%Y-%m-%d_%H%M%S.log",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"syslog_ident", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the program name used to identify PostgreSQL "
+ "messages in syslog."),
+ NULL
+ },
+ &syslog_ident_str,
+ "postgres",
+ NULL, assign_syslog_ident, NULL
+ },
+
+ {
+ {"event_source", PGC_POSTMASTER, LOGGING_WHERE,
+ gettext_noop("Sets the application name used to identify "
+ "PostgreSQL messages in the event log."),
+ NULL
+ },
+ &event_source,
+ DEFAULT_EVENT_SOURCE,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"TimeZone", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the time zone for displaying and interpreting time stamps."),
+ NULL,
+ GUC_REPORT
+ },
+ &timezone_string,
+ "GMT",
+ check_timezone, assign_timezone, show_timezone
+ },
+ {
+ {"timezone_abbreviations", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Selects a file of time zone abbreviations."),
+ NULL
+ },
+ &timezone_abbreviations_string,
+ NULL,
+ check_timezone_abbreviations, assign_timezone_abbreviations, NULL
+ },
+
+ {
+ {"unix_socket_group", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the owning group of the Unix-domain socket."),
+ gettext_noop("The owning user of the socket is always the user "
+ "that starts the server.")
+ },
+ &Unix_socket_group,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"unix_socket_directories", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the directories where Unix-domain sockets will be created."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY
+ },
+ &Unix_socket_directories,
+#ifdef HAVE_UNIX_SOCKETS
+ DEFAULT_PGSOCKET_DIR,
+#else
+ "",
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"listen_addresses", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the host name or IP address(es) to listen to."),
+ NULL,
+ GUC_LIST_INPUT
+ },
+ &ListenAddresses,
+ "localhost",
+ NULL, NULL, NULL
+ },
+
+ {
+ /*
+ * Can't be set by ALTER SYSTEM as it can lead to recursive definition
+ * of data_directory.
+ */
+ {"data_directory", PGC_POSTMASTER, FILE_LOCATIONS,
+ gettext_noop("Sets the server's data directory."),
+ NULL,
+ GUC_SUPERUSER_ONLY | GUC_DISALLOW_IN_AUTO_FILE
+ },
+ &data_directory,
+ NULL,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"config_file", PGC_POSTMASTER, FILE_LOCATIONS,
+ gettext_noop("Sets the server's main configuration file."),
+ NULL,
+ GUC_DISALLOW_IN_FILE | GUC_SUPERUSER_ONLY
+ },
+ &ConfigFileName,
+ NULL,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"hba_file", PGC_POSTMASTER, FILE_LOCATIONS,
+ gettext_noop("Sets the server's \"hba\" configuration file."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &HbaFileName,
+ NULL,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ident_file", PGC_POSTMASTER, FILE_LOCATIONS,
+ gettext_noop("Sets the server's \"ident\" configuration file."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &IdentFileName,
+ NULL,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"external_pid_file", PGC_POSTMASTER, FILE_LOCATIONS,
+ gettext_noop("Writes the postmaster PID to the specified file."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &external_pid_file,
+ NULL,
+ check_canonical_path, NULL, NULL
+ },
+
+ {
+ {"ssl_library", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the name of the SSL library."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &ssl_library,
+#ifdef USE_SSL
+ "OpenSSL",
+#else
+ "",
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_cert_file", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL server certificate file."),
+ NULL
+ },
+ &ssl_cert_file,
+ "server.crt",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_key_file", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL server private key file."),
+ NULL
+ },
+ &ssl_key_file,
+ "server.key",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_ca_file", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL certificate authority file."),
+ NULL
+ },
+ &ssl_ca_file,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_crl_file", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL certificate revocation list file."),
+ NULL
+ },
+ &ssl_crl_file,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_crl_dir", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL certificate revocation list directory."),
+ NULL
+ },
+ &ssl_crl_dir,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"synchronous_standby_names", PGC_SIGHUP, REPLICATION_PRIMARY,
+ gettext_noop("Number of synchronous standbys and list of names of potential synchronous ones."),
+ NULL,
+ GUC_LIST_INPUT
+ },
+ &SyncRepStandbyNames,
+ "",
+ check_synchronous_standby_names, assign_synchronous_standby_names, NULL
+ },
+
+ {
+ {"default_text_search_config", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets default text search configuration."),
+ NULL
+ },
+ &TSCurrentConfig,
+ "pg_catalog.simple",
+ check_TSCurrentConfig, assign_TSCurrentConfig, NULL
+ },
+
+ {
+ {"ssl_ciphers", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Sets the list of allowed SSL ciphers."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &SSLCipherSuites,
+#ifdef USE_OPENSSL
+ "HIGH:MEDIUM:+3DES:!aNULL",
+#else
+ "none",
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_ecdh_curve", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Sets the curve to use for ECDH."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &SSLECDHCurve,
+#ifdef USE_SSL
+ "prime256v1",
+#else
+ "none",
+#endif
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_dh_params_file", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Location of the SSL DH parameters file."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &ssl_dh_params_file,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_passphrase_command", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Command to obtain passphrases for SSL."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &ssl_passphrase_command,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"application_name", PGC_USERSET, LOGGING_WHAT,
+ gettext_noop("Sets the application name to be reported in statistics and logs."),
+ NULL,
+ GUC_IS_NAME | GUC_REPORT | GUC_NOT_IN_SAMPLE
+ },
+ &application_name,
+ "",
+ check_application_name, assign_application_name, NULL
+ },
+
+ {
+ {"cluster_name", PGC_POSTMASTER, PROCESS_TITLE,
+ gettext_noop("Sets the name of the cluster, which is included in the process title."),
+ NULL,
+ GUC_IS_NAME
+ },
+ &cluster_name,
+ "",
+ check_cluster_name, NULL, NULL
+ },
+
+ {
+ {"wal_consistency_checking", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Sets the WAL resource managers for which WAL consistency checks are done."),
+ gettext_noop("Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay."),
+ GUC_LIST_INPUT | GUC_NOT_IN_SAMPLE
+ },
+ &wal_consistency_checking_string,
+ "",
+ check_wal_consistency_checking, assign_wal_consistency_checking, NULL
+ },
+
+ {
+ {"jit_provider", PGC_POSTMASTER, CLIENT_CONN_PRELOAD,
+ gettext_noop("JIT provider to use."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &jit_provider,
+ "llvmjit",
+ NULL, NULL, NULL
+ },
+
+ {
+ {"backtrace_functions", PGC_SUSET, DEVELOPER_OPTIONS,
+ gettext_noop("Log backtrace for errors in these functions."),
+ NULL,
+ GUC_NOT_IN_SAMPLE
+ },
+ &backtrace_functions,
+ "",
+ check_backtrace_functions, assign_backtrace_functions, NULL
+ },
+
+ /* End-of-list marker */
+ {
+ {NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL, NULL
+ }
+};
+
+
+static struct config_enum ConfigureNamesEnum[] =
+{
+ {
+ {"backslash_quote", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+ gettext_noop("Sets whether \"\\'\" is allowed in string literals."),
+ NULL
+ },
+ &backslash_quote,
+ BACKSLASH_QUOTE_SAFE_ENCODING, backslash_quote_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"bytea_output", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the output format for bytea."),
+ NULL
+ },
+ &bytea_output,
+ BYTEA_OUTPUT_HEX, bytea_output_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"client_min_messages", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the message levels that are sent to the client."),
+ gettext_noop("Each level includes all the levels that follow it. The later"
+ " the level, the fewer messages are sent.")
+ },
+ &client_min_messages,
+ NOTICE, client_message_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"compute_query_id", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Enables in-core computation of query identifiers."),
+ NULL
+ },
+ &compute_query_id,
+ COMPUTE_QUERY_ID_AUTO, compute_query_id_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"constraint_exclusion", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Enables the planner to use constraints to optimize queries."),
+ gettext_noop("Table scans will be skipped if their constraints"
+ " guarantee that no rows match the query."),
+ GUC_EXPLAIN
+ },
+ &constraint_exclusion,
+ CONSTRAINT_EXCLUSION_PARTITION, constraint_exclusion_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"default_toast_compression", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the default compression method for compressible values."),
+ NULL
+ },
+ &default_toast_compression,
+ TOAST_PGLZ_COMPRESSION,
+ default_toast_compression_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"default_transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the transaction isolation level of each new transaction."),
+ NULL
+ },
+ &DefaultXactIsoLevel,
+ XACT_READ_COMMITTED, isolation_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the current transaction's isolation level."),
+ NULL,
+ GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &XactIsoLevel,
+ XACT_READ_COMMITTED, isolation_level_options,
+ check_XactIsoLevel, NULL, NULL
+ },
+
+ {
+ {"IntervalStyle", PGC_USERSET, CLIENT_CONN_LOCALE,
+ gettext_noop("Sets the display format for interval values."),
+ NULL,
+ GUC_REPORT
+ },
+ &IntervalStyle,
+ INTSTYLE_POSTGRES, intervalstyle_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_error_verbosity", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Sets the verbosity of logged messages."),
+ NULL
+ },
+ &Log_error_verbosity,
+ PGERROR_DEFAULT, log_error_verbosity_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_min_messages", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Sets the message levels that are logged."),
+ gettext_noop("Each level includes all the levels that follow it. The later"
+ " the level, the fewer messages are sent.")
+ },
+ &log_min_messages,
+ WARNING, server_message_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_min_error_statement", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Causes all statements generating error at or above this level to be logged."),
+ gettext_noop("Each level includes all the levels that follow it. The later"
+ " the level, the fewer messages are sent.")
+ },
+ &log_min_error_statement,
+ ERROR, server_message_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"log_statement", PGC_SUSET, LOGGING_WHAT,
+ gettext_noop("Sets the type of statements logged."),
+ NULL
+ },
+ &log_statement,
+ LOGSTMT_NONE, log_statement_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"syslog_facility", PGC_SIGHUP, LOGGING_WHERE,
+ gettext_noop("Sets the syslog \"facility\" to be used when syslog enabled."),
+ NULL
+ },
+ &syslog_facility,
+#ifdef HAVE_SYSLOG
+ LOG_LOCAL0,
+#else
+ 0,
+#endif
+ syslog_facility_options,
+ NULL, assign_syslog_facility, NULL
+ },
+
+ {
+ {"session_replication_role", PGC_SUSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets the session's behavior for triggers and rewrite rules."),
+ NULL
+ },
+ &SessionReplicationRole,
+ SESSION_REPLICATION_ROLE_ORIGIN, session_replication_role_options,
+ NULL, assign_session_replication_role, NULL
+ },
+
+ {
+ {"synchronous_commit", PGC_USERSET, WAL_SETTINGS,
+ gettext_noop("Sets the current transaction's synchronization level."),
+ NULL
+ },
+ &synchronous_commit,
+ SYNCHRONOUS_COMMIT_ON, synchronous_commit_options,
+ NULL, assign_synchronous_commit, NULL
+ },
+
+ {
+ {"archive_mode", PGC_POSTMASTER, WAL_ARCHIVING,
+ gettext_noop("Allows archiving of WAL files using archive_command."),
+ NULL
+ },
+ &XLogArchiveMode,
+ ARCHIVE_MODE_OFF, archive_mode_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_target_action", PGC_POSTMASTER, WAL_RECOVERY_TARGET,
+ gettext_noop("Sets the action to perform upon reaching the recovery target."),
+ NULL
+ },
+ &recoveryTargetAction,
+ RECOVERY_TARGET_ACTION_PAUSE, recovery_target_action_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"trace_recovery_messages", PGC_SIGHUP, DEVELOPER_OPTIONS,
+ gettext_noop("Enables logging of recovery-related debugging information."),
+ gettext_noop("Each level includes all the levels that follow it. The later"
+ " the level, the fewer messages are sent."),
+ GUC_NOT_IN_SAMPLE,
+ },
+ &trace_recovery_messages,
+
+ /*
+ * client_message_level_options allows too many values, really, but
+ * it's not worth having a separate options array for this.
+ */
+ LOG, client_message_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"track_functions", PGC_SUSET, STATS_CUMULATIVE,
+ gettext_noop("Collects function-level statistics on database activity."),
+ NULL
+ },
+ &pgstat_track_functions,
+ TRACK_FUNC_OFF, track_function_options,
+ NULL, NULL, NULL
+ },
+
+
+ {
+ {"stats_fetch_consistency", PGC_USERSET, STATS_CUMULATIVE,
+ gettext_noop("Sets the consistency of accesses to statistics data."),
+ NULL
+ },
+ &pgstat_fetch_consistency,
+ PGSTAT_FETCH_CONSISTENCY_CACHE, stats_fetch_consistency,
+ NULL, assign_stats_fetch_consistency, NULL
+ },
+
+ {
+ {"wal_compression", PGC_SUSET, WAL_SETTINGS,
+ gettext_noop("Compresses full-page writes written in WAL file with specified method."),
+ NULL
+ },
+ &wal_compression,
+ WAL_COMPRESSION_NONE, wal_compression_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_level", PGC_POSTMASTER, WAL_SETTINGS,
+ gettext_noop("Sets the level of information written to the WAL."),
+ NULL
+ },
+ &wal_level,
+ WAL_LEVEL_REPLICA, wal_level_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"dynamic_shared_memory_type", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Selects the dynamic shared memory implementation used."),
+ NULL
+ },
+ &dynamic_shared_memory_type,
+ DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE, dynamic_shared_memory_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"shared_memory_type", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Selects the shared memory implementation used for the main shared memory region."),
+ NULL
+ },
+ &shared_memory_type,
+ DEFAULT_SHARED_MEMORY_TYPE, shared_memory_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"wal_sync_method", PGC_SIGHUP, WAL_SETTINGS,
+ gettext_noop("Selects the method used for forcing WAL updates to disk."),
+ NULL
+ },
+ &sync_method,
+ DEFAULT_SYNC_METHOD, sync_method_options,
+ NULL, assign_xlog_sync_method, NULL
+ },
+
+ {
+ {"xmlbinary", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets how binary values are to be encoded in XML."),
+ NULL
+ },
+ &xmlbinary,
+ XMLBINARY_BASE64, xmlbinary_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"xmloption", PGC_USERSET, CLIENT_CONN_STATEMENT,
+ gettext_noop("Sets whether XML data in implicit parsing and serialization "
+ "operations is to be considered as documents or content fragments."),
+ NULL
+ },
+ &xmloption,
+ XMLOPTION_CONTENT, xmloption_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"huge_pages", PGC_POSTMASTER, RESOURCES_MEM,
+ gettext_noop("Use of huge pages on Linux or Windows."),
+ NULL
+ },
+ &huge_pages,
+ HUGE_PAGES_TRY, huge_pages_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_prefetch", PGC_SIGHUP, WAL_RECOVERY,
+ gettext_noop("Prefetch referenced blocks during recovery."),
+ gettext_noop("Look ahead in the WAL to find references to uncached data.")
+ },
+ &recovery_prefetch,
+ RECOVERY_PREFETCH_TRY, recovery_prefetch_options,
+ check_recovery_prefetch, assign_recovery_prefetch, NULL
+ },
+
+ {
+ {"force_parallel_mode", PGC_USERSET, DEVELOPER_OPTIONS,
+ gettext_noop("Forces use of parallel query facilities."),
+ gettext_noop("If possible, run query using a parallel worker and with parallel restrictions."),
+ GUC_NOT_IN_SAMPLE | GUC_EXPLAIN
+ },
+ &force_parallel_mode,
+ FORCE_PARALLEL_OFF, force_parallel_mode_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"password_encryption", PGC_USERSET, CONN_AUTH_AUTH,
+ gettext_noop("Chooses the algorithm for encrypting passwords."),
+ NULL
+ },
+ &Password_encryption,
+ PASSWORD_TYPE_SCRAM_SHA_256, password_encryption_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"plan_cache_mode", PGC_USERSET, QUERY_TUNING_OTHER,
+ gettext_noop("Controls the planner's selection of custom or generic plan."),
+ gettext_noop("Prepared statements can have custom and generic plans, and the planner "
+ "will attempt to choose which is better. This can be set to override "
+ "the default behavior."),
+ GUC_EXPLAIN
+ },
+ &plan_cache_mode,
+ PLAN_CACHE_MODE_AUTO, plan_cache_mode_options,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_min_protocol_version", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Sets the minimum SSL/TLS protocol version to use."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &ssl_min_protocol_version,
+ PG_TLS1_2_VERSION,
+ ssl_protocol_versions_info + 1, /* don't allow PG_TLS_ANY */
+ NULL, NULL, NULL
+ },
+
+ {
+ {"ssl_max_protocol_version", PGC_SIGHUP, CONN_AUTH_SSL,
+ gettext_noop("Sets the maximum SSL/TLS protocol version to use."),
+ NULL,
+ GUC_SUPERUSER_ONLY
+ },
+ &ssl_max_protocol_version,
+ PG_TLS_ANY,
+ ssl_protocol_versions_info,
+ NULL, NULL, NULL
+ },
+
+ {
+ {"recovery_init_sync_method", PGC_SIGHUP, ERROR_HANDLING_OPTIONS,
+ gettext_noop("Sets the method for synchronizing the data directory before crash recovery."),
+ },
+ &recovery_init_sync_method,
+ RECOVERY_INIT_SYNC_METHOD_FSYNC, recovery_init_sync_method_options,
+ NULL, NULL, NULL
+ },
+
+ /* End-of-list marker */
+ {
+ {NULL, 0, 0, NULL, NULL}, NULL, 0, NULL, NULL, NULL, NULL
+ }
+};
+
+/******** end of options list ********/
+
+
+/*
+ * To allow continued support of obsolete names for GUC variables, we apply
+ * the following mappings to any unrecognized name. Note that an old name
+ * should be mapped to a new one only if the new variable has very similar
+ * semantics to the old.
+ */
+static const char *const map_old_guc_names[] = {
+ "sort_mem", "work_mem",
+ "vacuum_mem", "maintenance_work_mem",
+ NULL
+};
+
+
+/*
+ * Actual lookup of variables is done through this single, sorted array.
+ */
+static struct config_generic **guc_variables;
+
+/* Current number of variables contained in the vector */
+static int num_guc_variables;
+
+/* Vector capacity */
+static int size_guc_variables;
+
+
+static bool guc_dirty; /* true if need to do commit/abort work */
+
+static bool reporting_enabled; /* true to enable GUC_REPORT */
+
+static bool report_needed; /* true if any GUC_REPORT reports are needed */
+
+static int GUCNestLevel = 0; /* 1 when in main transaction */
+
+
+static int guc_var_compare(const void *a, const void *b);
+static int guc_name_compare(const char *namea, const char *nameb);
+static void InitializeGUCOptionsFromEnvironment(void);
+static void InitializeOneGUCOption(struct config_generic *gconf);
+static void push_old_value(struct config_generic *gconf, GucAction action);
+static void ReportGUCOption(struct config_generic *record);
+static void reapply_stacked_values(struct config_generic *variable,
+ struct config_string *pHolder,
+ GucStack *stack,
+ const char *curvalue,
+ GucContext curscontext, GucSource cursource,
+ Oid cursrole);
+static void ShowGUCConfigOption(const char *name, DestReceiver *dest);
+static void ShowAllGUCConfig(DestReceiver *dest);
+static char *_ShowOption(struct config_generic *record, bool use_units);
+static bool validate_option_array_item(const char *name, const char *value,
+ bool skipIfNoPermissions);
+static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);
+static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
+ const char *name, const char *value);
+
+
+/*
+ * Some infrastructure for checking malloc/strdup/realloc calls
+ */
+static void *
+guc_malloc(int elevel, size_t size)
+{
+ void *data;
+
+ /* Avoid unportable behavior of malloc(0) */
+ if (size == 0)
+ size = 1;
+ data = malloc(size);
+ if (data == NULL)
+ ereport(elevel,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ return data;
+}
+
+static void *
+guc_realloc(int elevel, void *old, size_t size)
+{
+ void *data;
+
+ /* Avoid unportable behavior of realloc(NULL, 0) */
+ if (old == NULL && size == 0)
+ size = 1;
+ data = realloc(old, size);
+ if (data == NULL)
+ ereport(elevel,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ return data;
+}
+
+static char *
+guc_strdup(int elevel, const char *src)
+{
+ char *data;
+
+ data = strdup(src);
+ if (data == NULL)
+ ereport(elevel,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ return data;
+}
+
+
+/*
+ * Detect whether strval is referenced anywhere in a GUC string item
+ */
+static bool
+string_field_used(struct config_string *conf, char *strval)
+{
+ GucStack *stack;
+
+ if (strval == *(conf->variable) ||
+ strval == conf->reset_val ||
+ strval == conf->boot_val)
+ return true;
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (strval == stack->prior.val.stringval ||
+ strval == stack->masked.val.stringval)
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Support for assigning to a field of a string GUC item. Free the prior
+ * value if it's not referenced anywhere else in the item (including stacked
+ * states).
+ */
+static void
+set_string_field(struct config_string *conf, char **field, char *newval)
+{
+ char *oldval = *field;
+
+ /* Do the assignment */
+ *field = newval;
+
+ /* Free old value if it's not NULL and isn't referenced anymore */
+ if (oldval && !string_field_used(conf, oldval))
+ free(oldval);
+}
+
+/*
+ * Detect whether an "extra" struct is referenced anywhere in a GUC item
+ */
+static bool
+extra_field_used(struct config_generic *gconf, void *extra)
+{
+ GucStack *stack;
+
+ if (extra == gconf->extra)
+ return true;
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ if (extra == ((struct config_bool *) gconf)->reset_extra)
+ return true;
+ break;
+ case PGC_INT:
+ if (extra == ((struct config_int *) gconf)->reset_extra)
+ return true;
+ break;
+ case PGC_REAL:
+ if (extra == ((struct config_real *) gconf)->reset_extra)
+ return true;
+ break;
+ case PGC_STRING:
+ if (extra == ((struct config_string *) gconf)->reset_extra)
+ return true;
+ break;
+ case PGC_ENUM:
+ if (extra == ((struct config_enum *) gconf)->reset_extra)
+ return true;
+ break;
+ }
+ for (stack = gconf->stack; stack; stack = stack->prev)
+ {
+ if (extra == stack->prior.extra ||
+ extra == stack->masked.extra)
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Support for assigning to an "extra" field of a GUC item. Free the prior
+ * value if it's not referenced anywhere else in the item (including stacked
+ * states).
+ */
+static void
+set_extra_field(struct config_generic *gconf, void **field, void *newval)
+{
+ void *oldval = *field;
+
+ /* Do the assignment */
+ *field = newval;
+
+ /* Free old value if it's not NULL and isn't referenced anymore */
+ if (oldval && !extra_field_used(gconf, oldval))
+ free(oldval);
+}
+
+/*
+ * Support for copying a variable's active value into a stack entry.
+ * The "extra" field associated with the active value is copied, too.
+ *
+ * NB: be sure stringval and extra fields of a new stack entry are
+ * initialized to NULL before this is used, else we'll try to free() them.
+ */
+static void
+set_stack_value(struct config_generic *gconf, config_var_value *val)
+{
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ val->val.boolval =
+ *((struct config_bool *) gconf)->variable;
+ break;
+ case PGC_INT:
+ val->val.intval =
+ *((struct config_int *) gconf)->variable;
+ break;
+ case PGC_REAL:
+ val->val.realval =
+ *((struct config_real *) gconf)->variable;
+ break;
+ case PGC_STRING:
+ set_string_field((struct config_string *) gconf,
+ &(val->val.stringval),
+ *((struct config_string *) gconf)->variable);
+ break;
+ case PGC_ENUM:
+ val->val.enumval =
+ *((struct config_enum *) gconf)->variable;
+ break;
+ }
+ set_extra_field(gconf, &(val->extra), gconf->extra);
+}
+
+/*
+ * Support for discarding a no-longer-needed value in a stack entry.
+ * The "extra" field associated with the stack entry is cleared, too.
+ */
+static void
+discard_stack_value(struct config_generic *gconf, config_var_value *val)
+{
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ case PGC_INT:
+ case PGC_REAL:
+ case PGC_ENUM:
+ /* no need to do anything */
+ break;
+ case PGC_STRING:
+ set_string_field((struct config_string *) gconf,
+ &(val->val.stringval),
+ NULL);
+ break;
+ }
+ set_extra_field(gconf, &(val->extra), NULL);
+}
+
+
+/*
+ * Fetch the sorted array pointer (exported for help_config.c's use ONLY)
+ */
+struct config_generic **
+get_guc_variables(void)
+{
+ return guc_variables;
+}
+
+
+/*
+ * Build the sorted array. This is split out so that it could be
+ * re-executed after startup (e.g., we could allow loadable modules to
+ * add vars, and then we'd need to re-sort).
+ */
+void
+build_guc_variables(void)
+{
+ int size_vars;
+ int num_vars = 0;
+ struct config_generic **guc_vars;
+ int i;
+
+ for (i = 0; ConfigureNamesBool[i].gen.name; i++)
+ {
+ struct config_bool *conf = &ConfigureNamesBool[i];
+
+ /* Rather than requiring vartype to be filled in by hand, do this: */
+ conf->gen.vartype = PGC_BOOL;
+ num_vars++;
+ }
+
+ for (i = 0; ConfigureNamesInt[i].gen.name; i++)
+ {
+ struct config_int *conf = &ConfigureNamesInt[i];
+
+ conf->gen.vartype = PGC_INT;
+ num_vars++;
+ }
+
+ for (i = 0; ConfigureNamesReal[i].gen.name; i++)
+ {
+ struct config_real *conf = &ConfigureNamesReal[i];
+
+ conf->gen.vartype = PGC_REAL;
+ num_vars++;
+ }
+
+ for (i = 0; ConfigureNamesString[i].gen.name; i++)
+ {
+ struct config_string *conf = &ConfigureNamesString[i];
+
+ conf->gen.vartype = PGC_STRING;
+ num_vars++;
+ }
+
+ for (i = 0; ConfigureNamesEnum[i].gen.name; i++)
+ {
+ struct config_enum *conf = &ConfigureNamesEnum[i];
+
+ conf->gen.vartype = PGC_ENUM;
+ num_vars++;
+ }
+
+ /*
+ * Create table with 20% slack
+ */
+ size_vars = num_vars + num_vars / 4;
+
+ guc_vars = (struct config_generic **)
+ guc_malloc(FATAL, size_vars * sizeof(struct config_generic *));
+
+ num_vars = 0;
+
+ for (i = 0; ConfigureNamesBool[i].gen.name; i++)
+ guc_vars[num_vars++] = &ConfigureNamesBool[i].gen;
+
+ for (i = 0; ConfigureNamesInt[i].gen.name; i++)
+ guc_vars[num_vars++] = &ConfigureNamesInt[i].gen;
+
+ for (i = 0; ConfigureNamesReal[i].gen.name; i++)
+ guc_vars[num_vars++] = &ConfigureNamesReal[i].gen;
+
+ for (i = 0; ConfigureNamesString[i].gen.name; i++)
+ guc_vars[num_vars++] = &ConfigureNamesString[i].gen;
+
+ for (i = 0; ConfigureNamesEnum[i].gen.name; i++)
+ guc_vars[num_vars++] = &ConfigureNamesEnum[i].gen;
+
+ if (guc_variables)
+ free(guc_variables);
+ guc_variables = guc_vars;
+ num_guc_variables = num_vars;
+ size_guc_variables = size_vars;
+ qsort((void *) guc_variables, num_guc_variables,
+ sizeof(struct config_generic *), guc_var_compare);
+}
+
+/*
+ * Add a new GUC variable to the list of known variables. The
+ * list is expanded if needed.
+ */
+static bool
+add_guc_variable(struct config_generic *var, int elevel)
+{
+ if (num_guc_variables + 1 >= size_guc_variables)
+ {
+ /*
+ * Increase the vector by 25%
+ */
+ int size_vars = size_guc_variables + size_guc_variables / 4;
+ struct config_generic **guc_vars;
+
+ if (size_vars == 0)
+ {
+ size_vars = 100;
+ guc_vars = (struct config_generic **)
+ guc_malloc(elevel, size_vars * sizeof(struct config_generic *));
+ }
+ else
+ {
+ guc_vars = (struct config_generic **)
+ guc_realloc(elevel, guc_variables, size_vars * sizeof(struct config_generic *));
+ }
+
+ if (guc_vars == NULL)
+ return false; /* out of memory */
+
+ guc_variables = guc_vars;
+ size_guc_variables = size_vars;
+ }
+ guc_variables[num_guc_variables++] = var;
+ qsort((void *) guc_variables, num_guc_variables,
+ sizeof(struct config_generic *), guc_var_compare);
+ return true;
+}
+
+/*
+ * Decide whether a proposed custom variable name is allowed.
+ *
+ * It must be two or more identifiers separated by dots, where the rules
+ * for what is an identifier agree with scan.l. (If you change this rule,
+ * adjust the errdetail in find_option().)
+ */
+static bool
+valid_custom_variable_name(const char *name)
+{
+ bool saw_sep = false;
+ bool name_start = true;
+
+ for (const char *p = name; *p; p++)
+ {
+ if (*p == GUC_QUALIFIER_SEPARATOR)
+ {
+ if (name_start)
+ return false; /* empty name component */
+ saw_sep = true;
+ name_start = true;
+ }
+ else if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz_", *p) != NULL ||
+ IS_HIGHBIT_SET(*p))
+ {
+ /* okay as first or non-first character */
+ name_start = false;
+ }
+ else if (!name_start && strchr("0123456789$", *p) != NULL)
+ /* okay as non-first character */ ;
+ else
+ return false;
+ }
+ if (name_start)
+ return false; /* empty name component */
+ /* OK if we found at least one separator */
+ return saw_sep;
+}
+
+/*
+ * Create and add a placeholder variable for a custom variable name.
+ */
+static struct config_generic *
+add_placeholder_variable(const char *name, int elevel)
+{
+ size_t sz = sizeof(struct config_string) + sizeof(char *);
+ struct config_string *var;
+ struct config_generic *gen;
+
+ var = (struct config_string *) guc_malloc(elevel, sz);
+ if (var == NULL)
+ return NULL;
+ memset(var, 0, sz);
+ gen = &var->gen;
+
+ gen->name = guc_strdup(elevel, name);
+ if (gen->name == NULL)
+ {
+ free(var);
+ return NULL;
+ }
+
+ gen->context = PGC_USERSET;
+ gen->group = CUSTOM_OPTIONS;
+ gen->short_desc = "GUC placeholder variable";
+ gen->flags = GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE | GUC_CUSTOM_PLACEHOLDER;
+ gen->vartype = PGC_STRING;
+
+ /*
+ * The char* is allocated at the end of the struct since we have no
+ * 'static' place to point to. Note that the current value, as well as
+ * the boot and reset values, start out NULL.
+ */
+ var->variable = (char **) (var + 1);
+
+ if (!add_guc_variable((struct config_generic *) var, elevel))
+ {
+ free(unconstify(char *, gen->name));
+ free(var);
+ return NULL;
+ }
+
+ return gen;
+}
+
+/*
+ * Look up option "name". If it exists, return a pointer to its record.
+ * Otherwise, if create_placeholders is true and name is a valid-looking
+ * custom variable name, we'll create and return a placeholder record.
+ * Otherwise, if skip_errors is true, then we silently return NULL for
+ * an unrecognized or invalid name. Otherwise, the error is reported at
+ * error level elevel (and we return NULL if that's less than ERROR).
+ *
+ * Note: internal errors, primarily out-of-memory, draw an elevel-level
+ * report and NULL return regardless of skip_errors. Hence, callers must
+ * handle a NULL return whenever elevel < ERROR, but they should not need
+ * to emit any additional error message. (In practice, internal errors
+ * can only happen when create_placeholders is true, so callers passing
+ * false need not think terribly hard about this.)
+ */
+static struct config_generic *
+find_option(const char *name, bool create_placeholders, bool skip_errors,
+ int elevel)
+{
+ const char **key = &name;
+ struct config_generic **res;
+ int i;
+
+ Assert(name);
+
+ /*
+ * By equating const char ** with struct config_generic *, we are assuming
+ * the name field is first in config_generic.
+ */
+ res = (struct config_generic **) bsearch((void *) &key,
+ (void *) guc_variables,
+ num_guc_variables,
+ sizeof(struct config_generic *),
+ guc_var_compare);
+ if (res)
+ return *res;
+
+ /*
+ * See if the name is an obsolete name for a variable. We assume that the
+ * set of supported old names is short enough that a brute-force search is
+ * the best way.
+ */
+ for (i = 0; map_old_guc_names[i] != NULL; i += 2)
+ {
+ if (guc_name_compare(name, map_old_guc_names[i]) == 0)
+ return find_option(map_old_guc_names[i + 1], false,
+ skip_errors, elevel);
+ }
+
+ if (create_placeholders)
+ {
+ /*
+ * Check if the name is valid, and if so, add a placeholder. If it
+ * doesn't contain a separator, don't assume that it was meant to be a
+ * placeholder.
+ */
+ const char *sep = strchr(name, GUC_QUALIFIER_SEPARATOR);
+
+ if (sep != NULL)
+ {
+ size_t classLen = sep - name;
+ ListCell *lc;
+
+ /* The name must be syntactically acceptable ... */
+ if (!valid_custom_variable_name(name))
+ {
+ if (!skip_errors)
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid configuration parameter name \"%s\"",
+ name),
+ errdetail("Custom parameter names must be two or more simple identifiers separated by dots.")));
+ return NULL;
+ }
+ /* ... and it must not match any previously-reserved prefix */
+ foreach(lc, reserved_class_prefix)
+ {
+ const char *rcprefix = lfirst(lc);
+
+ if (strlen(rcprefix) == classLen &&
+ strncmp(name, rcprefix, classLen) == 0)
+ {
+ if (!skip_errors)
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid configuration parameter name \"%s\"",
+ name),
+ errdetail("\"%s\" is a reserved prefix.",
+ rcprefix)));
+ return NULL;
+ }
+ }
+ /* OK, create it */
+ return add_placeholder_variable(name, elevel);
+ }
+ }
+
+ /* Unknown name */
+ if (!skip_errors)
+ ereport(elevel,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("unrecognized configuration parameter \"%s\"",
+ name)));
+ return NULL;
+}
+
+
+/*
+ * comparator for qsorting and bsearching guc_variables array
+ */
+static int
+guc_var_compare(const void *a, const void *b)
+{
+ const struct config_generic *confa = *(struct config_generic *const *) a;
+ const struct config_generic *confb = *(struct config_generic *const *) b;
+
+ return guc_name_compare(confa->name, confb->name);
+}
+
+/*
+ * the bare comparison function for GUC names
+ */
+static int
+guc_name_compare(const char *namea, const char *nameb)
+{
+ /*
+ * The temptation to use strcasecmp() here must be resisted, because the
+ * array ordering has to remain stable across setlocale() calls. So, build
+ * our own with a simple ASCII-only downcasing.
+ */
+ while (*namea && *nameb)
+ {
+ char cha = *namea++;
+ char chb = *nameb++;
+
+ if (cha >= 'A' && cha <= 'Z')
+ cha += 'a' - 'A';
+ if (chb >= 'A' && chb <= 'Z')
+ chb += 'a' - 'A';
+ if (cha != chb)
+ return cha - chb;
+ }
+ if (*namea)
+ return 1; /* a is longer */
+ if (*nameb)
+ return -1; /* b is longer */
+ return 0;
+}
+
+
+/*
+ * Convert a GUC name to the form that should be used in pg_parameter_acl.
+ *
+ * We need to canonicalize entries since, for example, case should not be
+ * significant. In addition, we apply the map_old_guc_names[] mapping so that
+ * any obsolete names will be converted when stored in a new PG version.
+ * Note however that this function does not verify legality of the name.
+ *
+ * The result is a palloc'd string.
+ */
+char *
+convert_GUC_name_for_parameter_acl(const char *name)
+{
+ char *result;
+
+ /* Apply old-GUC-name mapping. */
+ for (int i = 0; map_old_guc_names[i] != NULL; i += 2)
+ {
+ if (guc_name_compare(name, map_old_guc_names[i]) == 0)
+ {
+ name = map_old_guc_names[i + 1];
+ break;
+ }
+ }
+
+ /* Apply case-folding that matches guc_name_compare(). */
+ result = pstrdup(name);
+ for (char *ptr = result; *ptr != '\0'; ptr++)
+ {
+ char ch = *ptr;
+
+ if (ch >= 'A' && ch <= 'Z')
+ {
+ ch += 'a' - 'A';
+ *ptr = ch;
+ }
+ }
+
+ return result;
+}
+
+/*
+ * Check whether we should allow creation of a pg_parameter_acl entry
+ * for the given name. (This can be applied either before or after
+ * canonicalizing it.)
+ */
+bool
+check_GUC_name_for_parameter_acl(const char *name)
+{
+ /* OK if the GUC exists. */
+ if (find_option(name, false, true, DEBUG1) != NULL)
+ return true;
+ /* Otherwise, it'd better be a valid custom GUC name. */
+ if (valid_custom_variable_name(name))
+ return true;
+ return false;
+}
+
+
+/*
+ * Initialize GUC options during program startup.
+ *
+ * Note that we cannot read the config file yet, since we have not yet
+ * processed command-line switches.
+ */
+void
+InitializeGUCOptions(void)
+{
+ int i;
+
+ /*
+ * Before log_line_prefix could possibly receive a nonempty setting, make
+ * sure that timezone processing is minimally alive (see elog.c).
+ */
+ pg_timezone_initialize();
+
+ /*
+ * Build sorted array of all GUC variables.
+ */
+ build_guc_variables();
+
+ /*
+ * Load all variables with their compiled-in defaults, and initialize
+ * status fields as needed.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ InitializeOneGUCOption(guc_variables[i]);
+ }
+
+ guc_dirty = false;
+
+ reporting_enabled = false;
+
+ /*
+ * Prevent any attempt to override the transaction modes from
+ * non-interactive sources.
+ */
+ SetConfigOption("transaction_isolation", "read committed",
+ PGC_POSTMASTER, PGC_S_OVERRIDE);
+ SetConfigOption("transaction_read_only", "no",
+ PGC_POSTMASTER, PGC_S_OVERRIDE);
+ SetConfigOption("transaction_deferrable", "no",
+ PGC_POSTMASTER, PGC_S_OVERRIDE);
+
+ /*
+ * For historical reasons, some GUC parameters can receive defaults from
+ * environment variables. Process those settings.
+ */
+ InitializeGUCOptionsFromEnvironment();
+}
+
+/*
+ * If any custom resource managers were specified in the
+ * wal_consistency_checking GUC, processing was deferred. Now that
+ * shared_preload_libraries have been loaded, process wal_consistency_checking
+ * again.
+ */
+void
+InitializeWalConsistencyChecking(void)
+{
+ Assert(process_shared_preload_libraries_done);
+
+ if (check_wal_consistency_checking_deferred)
+ {
+ struct config_generic *guc;
+
+ guc = find_option("wal_consistency_checking", false, false, ERROR);
+
+ check_wal_consistency_checking_deferred = false;
+
+ set_config_option_ext("wal_consistency_checking",
+ wal_consistency_checking_string,
+ guc->scontext, guc->source, guc->srole,
+ GUC_ACTION_SET, true, ERROR, false);
+
+ /* checking should not be deferred again */
+ Assert(!check_wal_consistency_checking_deferred);
+ }
+}
+
+/*
+ * Assign any GUC values that can come from the server's environment.
+ *
+ * This is called from InitializeGUCOptions, and also from ProcessConfigFile
+ * to deal with the possibility that a setting has been removed from
+ * postgresql.conf and should now get a value from the environment.
+ * (The latter is a kludge that should probably go away someday; if so,
+ * fold this back into InitializeGUCOptions.)
+ */
+static void
+InitializeGUCOptionsFromEnvironment(void)
+{
+ char *env;
+ long stack_rlimit;
+
+ env = getenv("PGPORT");
+ if (env != NULL)
+ SetConfigOption("port", env, PGC_POSTMASTER, PGC_S_ENV_VAR);
+
+ env = getenv("PGDATESTYLE");
+ if (env != NULL)
+ SetConfigOption("datestyle", env, PGC_POSTMASTER, PGC_S_ENV_VAR);
+
+ env = getenv("PGCLIENTENCODING");
+ if (env != NULL)
+ SetConfigOption("client_encoding", env, PGC_POSTMASTER, PGC_S_ENV_VAR);
+
+ /*
+ * rlimit isn't exactly an "environment variable", but it behaves about
+ * the same. If we can identify the platform stack depth rlimit, increase
+ * default stack depth setting up to whatever is safe (but at most 2MB).
+ * Report the value's source as PGC_S_DYNAMIC_DEFAULT if it's 2MB, or as
+ * PGC_S_ENV_VAR if it's reflecting the rlimit limit.
+ */
+ stack_rlimit = get_stack_depth_rlimit();
+ if (stack_rlimit > 0)
+ {
+ long new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L;
+
+ if (new_limit > 100)
+ {
+ GucSource source;
+ char limbuf[16];
+
+ if (new_limit < 2048)
+ source = PGC_S_ENV_VAR;
+ else
+ {
+ new_limit = 2048;
+ source = PGC_S_DYNAMIC_DEFAULT;
+ }
+ snprintf(limbuf, sizeof(limbuf), "%ld", new_limit);
+ SetConfigOption("max_stack_depth", limbuf,
+ PGC_POSTMASTER, source);
+ }
+ }
+}
+
+/*
+ * Initialize one GUC option variable to its compiled-in default.
+ *
+ * Note: the reason for calling check_hooks is not that we think the boot_val
+ * might fail, but that the hooks might wish to compute an "extra" struct.
+ */
+static void
+InitializeOneGUCOption(struct config_generic *gconf)
+{
+ gconf->status = 0;
+ gconf->source = PGC_S_DEFAULT;
+ gconf->reset_source = PGC_S_DEFAULT;
+ gconf->scontext = PGC_INTERNAL;
+ gconf->reset_scontext = PGC_INTERNAL;
+ gconf->srole = BOOTSTRAP_SUPERUSERID;
+ gconf->reset_srole = BOOTSTRAP_SUPERUSERID;
+ gconf->stack = NULL;
+ gconf->extra = NULL;
+ gconf->last_reported = NULL;
+ gconf->sourcefile = NULL;
+ gconf->sourceline = 0;
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+ bool newval = conf->boot_val;
+ void *extra = NULL;
+
+ if (!call_bool_check_hook(conf, &newval, &extra,
+ PGC_S_DEFAULT, LOG))
+ elog(FATAL, "failed to initialize %s to %d",
+ conf->gen.name, (int) newval);
+ if (conf->assign_hook)
+ conf->assign_hook(newval, extra);
+ *conf->variable = conf->reset_val = newval;
+ conf->gen.extra = conf->reset_extra = extra;
+ break;
+ }
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+ int newval = conf->boot_val;
+ void *extra = NULL;
+
+ Assert(newval >= conf->min);
+ Assert(newval <= conf->max);
+ if (!call_int_check_hook(conf, &newval, &extra,
+ PGC_S_DEFAULT, LOG))
+ elog(FATAL, "failed to initialize %s to %d",
+ conf->gen.name, newval);
+ if (conf->assign_hook)
+ conf->assign_hook(newval, extra);
+ *conf->variable = conf->reset_val = newval;
+ conf->gen.extra = conf->reset_extra = extra;
+ break;
+ }
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+ double newval = conf->boot_val;
+ void *extra = NULL;
+
+ Assert(newval >= conf->min);
+ Assert(newval <= conf->max);
+ if (!call_real_check_hook(conf, &newval, &extra,
+ PGC_S_DEFAULT, LOG))
+ elog(FATAL, "failed to initialize %s to %g",
+ conf->gen.name, newval);
+ if (conf->assign_hook)
+ conf->assign_hook(newval, extra);
+ *conf->variable = conf->reset_val = newval;
+ conf->gen.extra = conf->reset_extra = extra;
+ break;
+ }
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+ char *newval;
+ void *extra = NULL;
+
+ /* non-NULL boot_val must always get strdup'd */
+ if (conf->boot_val != NULL)
+ newval = guc_strdup(FATAL, conf->boot_val);
+ else
+ newval = NULL;
+
+ if (!call_string_check_hook(conf, &newval, &extra,
+ PGC_S_DEFAULT, LOG))
+ elog(FATAL, "failed to initialize %s to \"%s\"",
+ conf->gen.name, newval ? newval : "");
+ if (conf->assign_hook)
+ conf->assign_hook(newval, extra);
+ *conf->variable = conf->reset_val = newval;
+ conf->gen.extra = conf->reset_extra = extra;
+ break;
+ }
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+ int newval = conf->boot_val;
+ void *extra = NULL;
+
+ if (!call_enum_check_hook(conf, &newval, &extra,
+ PGC_S_DEFAULT, LOG))
+ elog(FATAL, "failed to initialize %s to %d",
+ conf->gen.name, newval);
+ if (conf->assign_hook)
+ conf->assign_hook(newval, extra);
+ *conf->variable = conf->reset_val = newval;
+ conf->gen.extra = conf->reset_extra = extra;
+ break;
+ }
+ }
+}
+
+
+/*
+ * Select the configuration files and data directory to be used, and
+ * do the initial read of postgresql.conf.
+ *
+ * This is called after processing command-line switches.
+ * userDoption is the -D switch value if any (NULL if unspecified).
+ * progname is just for use in error messages.
+ *
+ * Returns true on success; on failure, prints a suitable error message
+ * to stderr and returns false.
+ */
+bool
+SelectConfigFiles(const char *userDoption, const char *progname)
+{
+ char *configdir;
+ char *fname;
+ struct stat stat_buf;
+
+ /* configdir is -D option, or $PGDATA if no -D */
+ if (userDoption)
+ configdir = make_absolute_path(userDoption);
+ else
+ configdir = make_absolute_path(getenv("PGDATA"));
+
+ if (configdir && stat(configdir, &stat_buf) != 0)
+ {
+ write_stderr("%s: could not access directory \"%s\": %s\n",
+ progname,
+ configdir,
+ strerror(errno));
+ if (errno == ENOENT)
+ write_stderr("Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n");
+ return false;
+ }
+
+ /*
+ * Find the configuration file: if config_file was specified on the
+ * command line, use it, else use configdir/postgresql.conf. In any case
+ * ensure the result is an absolute path, so that it will be interpreted
+ * the same way by future backends.
+ */
+ if (ConfigFileName)
+ fname = make_absolute_path(ConfigFileName);
+ else if (configdir)
+ {
+ fname = guc_malloc(FATAL,
+ strlen(configdir) + strlen(CONFIG_FILENAME) + 2);
+ sprintf(fname, "%s/%s", configdir, CONFIG_FILENAME);
+ }
+ else
+ {
+ write_stderr("%s does not know where to find the server configuration file.\n"
+ "You must specify the --config-file or -D invocation "
+ "option or set the PGDATA environment variable.\n",
+ progname);
+ return false;
+ }
+
+ /*
+ * Set the ConfigFileName GUC variable to its final value, ensuring that
+ * it can't be overridden later.
+ */
+ SetConfigOption("config_file", fname, PGC_POSTMASTER, PGC_S_OVERRIDE);
+ free(fname);
+
+ /*
+ * Now read the config file for the first time.
+ */
+ if (stat(ConfigFileName, &stat_buf) != 0)
+ {
+ write_stderr("%s: could not access the server configuration file \"%s\": %s\n",
+ progname, ConfigFileName, strerror(errno));
+ free(configdir);
+ return false;
+ }
+
+ /*
+ * Read the configuration file for the first time. This time only the
+ * data_directory parameter is picked up to determine the data directory,
+ * so that we can read the PG_AUTOCONF_FILENAME file next time.
+ */
+ ProcessConfigFile(PGC_POSTMASTER);
+
+ /*
+ * If the data_directory GUC variable has been set, use that as DataDir;
+ * otherwise use configdir if set; else punt.
+ *
+ * Note: SetDataDir will copy and absolute-ize its argument, so we don't
+ * have to.
+ */
+ if (data_directory)
+ SetDataDir(data_directory);
+ else if (configdir)
+ SetDataDir(configdir);
+ else
+ {
+ write_stderr("%s does not know where to find the database system data.\n"
+ "This can be specified as \"data_directory\" in \"%s\", "
+ "or by the -D invocation option, or by the "
+ "PGDATA environment variable.\n",
+ progname, ConfigFileName);
+ return false;
+ }
+
+ /*
+ * Reflect the final DataDir value back into the data_directory GUC var.
+ * (If you are wondering why we don't just make them a single variable,
+ * it's because the EXEC_BACKEND case needs DataDir to be transmitted to
+ * child backends specially. XXX is that still true? Given that we now
+ * chdir to DataDir, EXEC_BACKEND can read the config file without knowing
+ * DataDir in advance.)
+ */
+ SetConfigOption("data_directory", DataDir, PGC_POSTMASTER, PGC_S_OVERRIDE);
+
+ /*
+ * Now read the config file a second time, allowing any settings in the
+ * PG_AUTOCONF_FILENAME file to take effect. (This is pretty ugly, but
+ * since we have to determine the DataDir before we can find the autoconf
+ * file, the alternatives seem worse.)
+ */
+ ProcessConfigFile(PGC_POSTMASTER);
+
+ /*
+ * If timezone_abbreviations wasn't set in the configuration file, install
+ * the default value. We do it this way because we can't safely install a
+ * "real" value until my_exec_path is set, which may not have happened
+ * when InitializeGUCOptions runs, so the bootstrap default value cannot
+ * be the real desired default.
+ */
+ pg_timezone_abbrev_initialize();
+
+ /*
+ * Figure out where pg_hba.conf is, and make sure the path is absolute.
+ */
+ if (HbaFileName)
+ fname = make_absolute_path(HbaFileName);
+ else if (configdir)
+ {
+ fname = guc_malloc(FATAL,
+ strlen(configdir) + strlen(HBA_FILENAME) + 2);
+ sprintf(fname, "%s/%s", configdir, HBA_FILENAME);
+ }
+ else
+ {
+ write_stderr("%s does not know where to find the \"hba\" configuration file.\n"
+ "This can be specified as \"hba_file\" in \"%s\", "
+ "or by the -D invocation option, or by the "
+ "PGDATA environment variable.\n",
+ progname, ConfigFileName);
+ return false;
+ }
+ SetConfigOption("hba_file", fname, PGC_POSTMASTER, PGC_S_OVERRIDE);
+ free(fname);
+
+ /*
+ * Likewise for pg_ident.conf.
+ */
+ if (IdentFileName)
+ fname = make_absolute_path(IdentFileName);
+ else if (configdir)
+ {
+ fname = guc_malloc(FATAL,
+ strlen(configdir) + strlen(IDENT_FILENAME) + 2);
+ sprintf(fname, "%s/%s", configdir, IDENT_FILENAME);
+ }
+ else
+ {
+ write_stderr("%s does not know where to find the \"ident\" configuration file.\n"
+ "This can be specified as \"ident_file\" in \"%s\", "
+ "or by the -D invocation option, or by the "
+ "PGDATA environment variable.\n",
+ progname, ConfigFileName);
+ return false;
+ }
+ SetConfigOption("ident_file", fname, PGC_POSTMASTER, PGC_S_OVERRIDE);
+ free(fname);
+
+ free(configdir);
+
+ return true;
+}
+
+
+/*
+ * Reset all options to their saved default values (implements RESET ALL)
+ */
+void
+ResetAllOptions(void)
+{
+ int i;
+
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+
+ /* Don't reset non-SET-able values */
+ if (gconf->context != PGC_SUSET &&
+ gconf->context != PGC_USERSET)
+ continue;
+ /* Don't reset if special exclusion from RESET ALL */
+ if (gconf->flags & GUC_NO_RESET_ALL)
+ continue;
+ /* No need to reset if wasn't SET */
+ if (gconf->source <= PGC_S_OVERRIDE)
+ continue;
+
+ /* Save old value to support transaction abort */
+ push_old_value(gconf, GUC_ACTION_SET);
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+
+ if (conf->assign_hook)
+ conf->assign_hook(conf->reset_val,
+ conf->reset_extra);
+ *conf->variable = conf->reset_val;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ conf->reset_extra);
+ break;
+ }
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ if (conf->assign_hook)
+ conf->assign_hook(conf->reset_val,
+ conf->reset_extra);
+ *conf->variable = conf->reset_val;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ conf->reset_extra);
+ break;
+ }
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+
+ if (conf->assign_hook)
+ conf->assign_hook(conf->reset_val,
+ conf->reset_extra);
+ *conf->variable = conf->reset_val;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ conf->reset_extra);
+ break;
+ }
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ if (conf->assign_hook)
+ conf->assign_hook(conf->reset_val,
+ conf->reset_extra);
+ set_string_field(conf, conf->variable, conf->reset_val);
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ conf->reset_extra);
+ break;
+ }
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ if (conf->assign_hook)
+ conf->assign_hook(conf->reset_val,
+ conf->reset_extra);
+ *conf->variable = conf->reset_val;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ conf->reset_extra);
+ break;
+ }
+ }
+
+ gconf->source = gconf->reset_source;
+ gconf->scontext = gconf->reset_scontext;
+ gconf->srole = gconf->reset_srole;
+
+ if (gconf->flags & GUC_REPORT)
+ {
+ gconf->status |= GUC_NEEDS_REPORT;
+ report_needed = true;
+ }
+ }
+}
+
+
+/*
+ * push_old_value
+ * Push previous state during transactional assignment to a GUC variable.
+ */
+static void
+push_old_value(struct config_generic *gconf, GucAction action)
+{
+ GucStack *stack;
+
+ /* If we're not inside a nest level, do nothing */
+ if (GUCNestLevel == 0)
+ return;
+
+ /* Do we already have a stack entry of the current nest level? */
+ stack = gconf->stack;
+ if (stack && stack->nest_level >= GUCNestLevel)
+ {
+ /* Yes, so adjust its state if necessary */
+ Assert(stack->nest_level == GUCNestLevel);
+ switch (action)
+ {
+ case GUC_ACTION_SET:
+ /* SET overrides any prior action at same nest level */
+ if (stack->state == GUC_SET_LOCAL)
+ {
+ /* must discard old masked value */
+ discard_stack_value(gconf, &stack->masked);
+ }
+ stack->state = GUC_SET;
+ break;
+ case GUC_ACTION_LOCAL:
+ if (stack->state == GUC_SET)
+ {
+ /* SET followed by SET LOCAL, remember SET's value */
+ stack->masked_scontext = gconf->scontext;
+ stack->masked_srole = gconf->srole;
+ set_stack_value(gconf, &stack->masked);
+ stack->state = GUC_SET_LOCAL;
+ }
+ /* in all other cases, no change to stack entry */
+ break;
+ case GUC_ACTION_SAVE:
+ /* Could only have a prior SAVE of same variable */
+ Assert(stack->state == GUC_SAVE);
+ break;
+ }
+ Assert(guc_dirty); /* must be set already */
+ return;
+ }
+
+ /*
+ * Push a new stack entry
+ *
+ * We keep all the stack entries in TopTransactionContext for simplicity.
+ */
+ stack = (GucStack *) MemoryContextAllocZero(TopTransactionContext,
+ sizeof(GucStack));
+
+ stack->prev = gconf->stack;
+ stack->nest_level = GUCNestLevel;
+ switch (action)
+ {
+ case GUC_ACTION_SET:
+ stack->state = GUC_SET;
+ break;
+ case GUC_ACTION_LOCAL:
+ stack->state = GUC_LOCAL;
+ break;
+ case GUC_ACTION_SAVE:
+ stack->state = GUC_SAVE;
+ break;
+ }
+ stack->source = gconf->source;
+ stack->scontext = gconf->scontext;
+ stack->srole = gconf->srole;
+ set_stack_value(gconf, &stack->prior);
+
+ gconf->stack = stack;
+
+ /* Ensure we remember to pop at end of xact */
+ guc_dirty = true;
+}
+
+
+/*
+ * Do GUC processing at main transaction start.
+ */
+void
+AtStart_GUC(void)
+{
+ /*
+ * The nest level should be 0 between transactions; if it isn't, somebody
+ * didn't call AtEOXact_GUC, or called it with the wrong nestLevel. We
+ * throw a warning but make no other effort to clean up.
+ */
+ if (GUCNestLevel != 0)
+ elog(WARNING, "GUC nest level = %d at transaction start",
+ GUCNestLevel);
+ GUCNestLevel = 1;
+}
+
+/*
+ * Enter a new nesting level for GUC values. This is called at subtransaction
+ * start, and when entering a function that has proconfig settings, and in
+ * some other places where we want to set GUC variables transiently.
+ * NOTE we must not risk error here, else subtransaction start will be unhappy.
+ */
+int
+NewGUCNestLevel(void)
+{
+ return ++GUCNestLevel;
+}
+
+/*
+ * Do GUC processing at transaction or subtransaction commit or abort, or
+ * when exiting a function that has proconfig settings, or when undoing a
+ * transient assignment to some GUC variables. (The name is thus a bit of
+ * a misnomer; perhaps it should be ExitGUCNestLevel or some such.)
+ * During abort, we discard all GUC settings that were applied at nesting
+ * levels >= nestLevel. nestLevel == 1 corresponds to the main transaction.
+ */
+void
+AtEOXact_GUC(bool isCommit, int nestLevel)
+{
+ bool still_dirty;
+ int i;
+
+ /*
+ * Note: it's possible to get here with GUCNestLevel == nestLevel-1 during
+ * abort, if there is a failure during transaction start before
+ * AtStart_GUC is called.
+ */
+ Assert(nestLevel > 0 &&
+ (nestLevel <= GUCNestLevel ||
+ (nestLevel == GUCNestLevel + 1 && !isCommit)));
+
+ /* Quick exit if nothing's changed in this transaction */
+ if (!guc_dirty)
+ {
+ GUCNestLevel = nestLevel - 1;
+ return;
+ }
+
+ still_dirty = false;
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+ GucStack *stack;
+
+ /*
+ * Process and pop each stack entry within the nest level. To simplify
+ * fmgr_security_definer() and other places that use GUC_ACTION_SAVE,
+ * we allow failure exit from code that uses a local nest level to be
+ * recovered at the surrounding transaction or subtransaction abort;
+ * so there could be more than one stack entry to pop.
+ */
+ while ((stack = gconf->stack) != NULL &&
+ stack->nest_level >= nestLevel)
+ {
+ GucStack *prev = stack->prev;
+ bool restorePrior = false;
+ bool restoreMasked = false;
+ bool changed;
+
+ /*
+ * In this next bit, if we don't set either restorePrior or
+ * restoreMasked, we must "discard" any unwanted fields of the
+ * stack entries to avoid leaking memory. If we do set one of
+ * those flags, unused fields will be cleaned up after restoring.
+ */
+ if (!isCommit) /* if abort, always restore prior value */
+ restorePrior = true;
+ else if (stack->state == GUC_SAVE)
+ restorePrior = true;
+ else if (stack->nest_level == 1)
+ {
+ /* transaction commit */
+ if (stack->state == GUC_SET_LOCAL)
+ restoreMasked = true;
+ else if (stack->state == GUC_SET)
+ {
+ /* we keep the current active value */
+ discard_stack_value(gconf, &stack->prior);
+ }
+ else /* must be GUC_LOCAL */
+ restorePrior = true;
+ }
+ else if (prev == NULL ||
+ prev->nest_level < stack->nest_level - 1)
+ {
+ /* decrement entry's level and do not pop it */
+ stack->nest_level--;
+ continue;
+ }
+ else
+ {
+ /*
+ * We have to merge this stack entry into prev. See README for
+ * discussion of this bit.
+ */
+ switch (stack->state)
+ {
+ case GUC_SAVE:
+ Assert(false); /* can't get here */
+ break;
+
+ case GUC_SET:
+ /* next level always becomes SET */
+ discard_stack_value(gconf, &stack->prior);
+ if (prev->state == GUC_SET_LOCAL)
+ discard_stack_value(gconf, &prev->masked);
+ prev->state = GUC_SET;
+ break;
+
+ case GUC_LOCAL:
+ if (prev->state == GUC_SET)
+ {
+ /* LOCAL migrates down */
+ prev->masked_scontext = stack->scontext;
+ prev->masked_srole = stack->srole;
+ prev->masked = stack->prior;
+ prev->state = GUC_SET_LOCAL;
+ }
+ else
+ {
+ /* else just forget this stack level */
+ discard_stack_value(gconf, &stack->prior);
+ }
+ break;
+
+ case GUC_SET_LOCAL:
+ /* prior state at this level no longer wanted */
+ discard_stack_value(gconf, &stack->prior);
+ /* copy down the masked state */
+ prev->masked_scontext = stack->masked_scontext;
+ prev->masked_srole = stack->masked_srole;
+ if (prev->state == GUC_SET_LOCAL)
+ discard_stack_value(gconf, &prev->masked);
+ prev->masked = stack->masked;
+ prev->state = GUC_SET_LOCAL;
+ break;
+ }
+ }
+
+ changed = false;
+
+ if (restorePrior || restoreMasked)
+ {
+ /* Perform appropriate restoration of the stacked value */
+ config_var_value newvalue;
+ GucSource newsource;
+ GucContext newscontext;
+ Oid newsrole;
+
+ if (restoreMasked)
+ {
+ newvalue = stack->masked;
+ newsource = PGC_S_SESSION;
+ newscontext = stack->masked_scontext;
+ newsrole = stack->masked_srole;
+ }
+ else
+ {
+ newvalue = stack->prior;
+ newsource = stack->source;
+ newscontext = stack->scontext;
+ newsrole = stack->srole;
+ }
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+ bool newval = newvalue.val.boolval;
+ void *newextra = newvalue.extra;
+
+ if (*conf->variable != newval ||
+ conf->gen.extra != newextra)
+ {
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ changed = true;
+ }
+ break;
+ }
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+ int newval = newvalue.val.intval;
+ void *newextra = newvalue.extra;
+
+ if (*conf->variable != newval ||
+ conf->gen.extra != newextra)
+ {
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ changed = true;
+ }
+ break;
+ }
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+ double newval = newvalue.val.realval;
+ void *newextra = newvalue.extra;
+
+ if (*conf->variable != newval ||
+ conf->gen.extra != newextra)
+ {
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ changed = true;
+ }
+ break;
+ }
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+ char *newval = newvalue.val.stringval;
+ void *newextra = newvalue.extra;
+
+ if (*conf->variable != newval ||
+ conf->gen.extra != newextra)
+ {
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ set_string_field(conf, conf->variable, newval);
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ changed = true;
+ }
+
+ /*
+ * Release stacked values if not used anymore. We
+ * could use discard_stack_value() here, but since
+ * we have type-specific code anyway, might as
+ * well inline it.
+ */
+ set_string_field(conf, &stack->prior.val.stringval, NULL);
+ set_string_field(conf, &stack->masked.val.stringval, NULL);
+ break;
+ }
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+ int newval = newvalue.val.enumval;
+ void *newextra = newvalue.extra;
+
+ if (*conf->variable != newval ||
+ conf->gen.extra != newextra)
+ {
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ changed = true;
+ }
+ break;
+ }
+ }
+
+ /*
+ * Release stacked extra values if not used anymore.
+ */
+ set_extra_field(gconf, &(stack->prior.extra), NULL);
+ set_extra_field(gconf, &(stack->masked.extra), NULL);
+
+ /* And restore source information */
+ gconf->source = newsource;
+ gconf->scontext = newscontext;
+ gconf->srole = newsrole;
+ }
+
+ /* Finish popping the state stack */
+ gconf->stack = prev;
+ pfree(stack);
+
+ /* Report new value if we changed it */
+ if (changed && (gconf->flags & GUC_REPORT))
+ {
+ gconf->status |= GUC_NEEDS_REPORT;
+ report_needed = true;
+ }
+ } /* end of stack-popping loop */
+
+ if (stack != NULL)
+ still_dirty = true;
+ }
+
+ /* If there are no remaining stack entries, we can reset guc_dirty */
+ guc_dirty = still_dirty;
+
+ /* Update nesting level */
+ GUCNestLevel = nestLevel - 1;
+}
+
+
+/*
+ * Start up automatic reporting of changes to variables marked GUC_REPORT.
+ * This is executed at completion of backend startup.
+ */
+void
+BeginReportingGUCOptions(void)
+{
+ int i;
+
+ /*
+ * Don't do anything unless talking to an interactive frontend.
+ */
+ if (whereToSendOutput != DestRemote)
+ return;
+
+ reporting_enabled = true;
+
+ /*
+ * Hack for in_hot_standby: set the GUC value true if appropriate. This
+ * is kind of an ugly place to do it, but there's few better options.
+ *
+ * (This could be out of date by the time we actually send it, in which
+ * case the next ReportChangedGUCOptions call will send a duplicate
+ * report.)
+ */
+ if (RecoveryInProgress())
+ SetConfigOption("in_hot_standby", "true",
+ PGC_INTERNAL, PGC_S_OVERRIDE);
+
+ /* Transmit initial values of interesting variables */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *conf = guc_variables[i];
+
+ if (conf->flags & GUC_REPORT)
+ ReportGUCOption(conf);
+ }
+
+ report_needed = false;
+}
+
+/*
+ * ReportChangedGUCOptions: report recently-changed GUC_REPORT variables
+ *
+ * This is called just before we wait for a new client query.
+ *
+ * By handling things this way, we ensure that a ParameterStatus message
+ * is sent at most once per variable per query, even if the variable
+ * changed multiple times within the query. That's quite possible when
+ * using features such as function SET clauses. Function SET clauses
+ * also tend to cause values to change intraquery but eventually revert
+ * to their prevailing values; ReportGUCOption is responsible for avoiding
+ * redundant reports in such cases.
+ */
+void
+ReportChangedGUCOptions(void)
+{
+ /* Quick exit if not (yet) enabled */
+ if (!reporting_enabled)
+ return;
+
+ /*
+ * Since in_hot_standby isn't actually changed by normal GUC actions, we
+ * need a hack to check whether a new value needs to be reported to the
+ * client. For speed, we rely on the assumption that it can never
+ * transition from false to true.
+ */
+ if (in_hot_standby && !RecoveryInProgress())
+ SetConfigOption("in_hot_standby", "false",
+ PGC_INTERNAL, PGC_S_OVERRIDE);
+
+ /* Quick exit if no values have been changed */
+ if (!report_needed)
+ return;
+
+ /* Transmit new values of interesting variables */
+ for (int i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *conf = guc_variables[i];
+
+ if ((conf->flags & GUC_REPORT) && (conf->status & GUC_NEEDS_REPORT))
+ ReportGUCOption(conf);
+ }
+
+ report_needed = false;
+}
+
+/*
+ * ReportGUCOption: if appropriate, transmit option value to frontend
+ *
+ * We need not transmit the value if it's the same as what we last
+ * transmitted. However, clear the NEEDS_REPORT flag in any case.
+ */
+static void
+ReportGUCOption(struct config_generic *record)
+{
+ char *val = _ShowOption(record, false);
+
+ if (record->last_reported == NULL ||
+ strcmp(val, record->last_reported) != 0)
+ {
+ StringInfoData msgbuf;
+
+ pq_beginmessage(&msgbuf, 'S');
+ pq_sendstring(&msgbuf, record->name);
+ pq_sendstring(&msgbuf, val);
+ pq_endmessage(&msgbuf);
+
+ /*
+ * We need a long-lifespan copy. If strdup() fails due to OOM, we'll
+ * set last_reported to NULL and thereby possibly make a duplicate
+ * report later.
+ */
+ if (record->last_reported)
+ free(record->last_reported);
+ record->last_reported = strdup(val);
+ }
+
+ pfree(val);
+
+ record->status &= ~GUC_NEEDS_REPORT;
+}
+
+/*
+ * Convert a value from one of the human-friendly units ("kB", "min" etc.)
+ * to the given base unit. 'value' and 'unit' are the input value and unit
+ * to convert from (there can be trailing spaces in the unit string).
+ * The converted value is stored in *base_value.
+ * It's caller's responsibility to round off the converted value as necessary
+ * and check for out-of-range.
+ *
+ * Returns true on success, false if the input unit is not recognized.
+ */
+static bool
+convert_to_base_unit(double value, const char *unit,
+ int base_unit, double *base_value)
+{
+ char unitstr[MAX_UNIT_LEN + 1];
+ int unitlen;
+ const unit_conversion *table;
+ int i;
+
+ /* extract unit string to compare to table entries */
+ unitlen = 0;
+ while (*unit != '\0' && !isspace((unsigned char) *unit) &&
+ unitlen < MAX_UNIT_LEN)
+ unitstr[unitlen++] = *(unit++);
+ unitstr[unitlen] = '\0';
+ /* allow whitespace after unit */
+ while (isspace((unsigned char) *unit))
+ unit++;
+ if (*unit != '\0')
+ return false; /* unit too long, or garbage after it */
+
+ /* now search the appropriate table */
+ if (base_unit & GUC_UNIT_MEMORY)
+ table = memory_unit_conversion_table;
+ else
+ table = time_unit_conversion_table;
+
+ for (i = 0; *table[i].unit; i++)
+ {
+ if (base_unit == table[i].base_unit &&
+ strcmp(unitstr, table[i].unit) == 0)
+ {
+ double cvalue = value * table[i].multiplier;
+
+ /*
+ * If the user gave a fractional value such as "30.1GB", round it
+ * off to the nearest multiple of the next smaller unit, if there
+ * is one.
+ */
+ if (*table[i + 1].unit &&
+ base_unit == table[i + 1].base_unit)
+ cvalue = rint(cvalue / table[i + 1].multiplier) *
+ table[i + 1].multiplier;
+
+ *base_value = cvalue;
+ return true;
+ }
+ }
+ return false;
+}
+
+/*
+ * Convert an integer value in some base unit to a human-friendly unit.
+ *
+ * The output unit is chosen so that it's the greatest unit that can represent
+ * the value without loss. For example, if the base unit is GUC_UNIT_KB, 1024
+ * is converted to 1 MB, but 1025 is represented as 1025 kB.
+ */
+static void
+convert_int_from_base_unit(int64 base_value, int base_unit,
+ int64 *value, const char **unit)
+{
+ const unit_conversion *table;
+ int i;
+
+ *unit = NULL;
+
+ if (base_unit & GUC_UNIT_MEMORY)
+ table = memory_unit_conversion_table;
+ else
+ table = time_unit_conversion_table;
+
+ for (i = 0; *table[i].unit; i++)
+ {
+ if (base_unit == table[i].base_unit)
+ {
+ /*
+ * Accept the first conversion that divides the value evenly. We
+ * assume that the conversions for each base unit are ordered from
+ * greatest unit to the smallest!
+ */
+ if (table[i].multiplier <= 1.0 ||
+ base_value % (int64) table[i].multiplier == 0)
+ {
+ *value = (int64) rint(base_value / table[i].multiplier);
+ *unit = table[i].unit;
+ break;
+ }
+ }
+ }
+
+ Assert(*unit != NULL);
+}
+
+/*
+ * Convert a floating-point value in some base unit to a human-friendly unit.
+ *
+ * Same as above, except we have to do the math a bit differently, and
+ * there's a possibility that we don't find any exact divisor.
+ */
+static void
+convert_real_from_base_unit(double base_value, int base_unit,
+ double *value, const char **unit)
+{
+ const unit_conversion *table;
+ int i;
+
+ *unit = NULL;
+
+ if (base_unit & GUC_UNIT_MEMORY)
+ table = memory_unit_conversion_table;
+ else
+ table = time_unit_conversion_table;
+
+ for (i = 0; *table[i].unit; i++)
+ {
+ if (base_unit == table[i].base_unit)
+ {
+ /*
+ * Accept the first conversion that divides the value evenly; or
+ * if there is none, use the smallest (last) target unit.
+ *
+ * What we actually care about here is whether snprintf with "%g"
+ * will print the value as an integer, so the obvious test of
+ * "*value == rint(*value)" is too strict; roundoff error might
+ * make us choose an unreasonably small unit. As a compromise,
+ * accept a divisor that is within 1e-8 of producing an integer.
+ */
+ *value = base_value / table[i].multiplier;
+ *unit = table[i].unit;
+ if (*value > 0 &&
+ fabs((rint(*value) / *value) - 1.0) <= 1e-8)
+ break;
+ }
+ }
+
+ Assert(*unit != NULL);
+}
+
+/*
+ * Return the name of a GUC's base unit (e.g. "ms") given its flags.
+ * Return NULL if the GUC is unitless.
+ */
+static const char *
+get_config_unit_name(int flags)
+{
+ switch (flags & (GUC_UNIT_MEMORY | GUC_UNIT_TIME))
+ {
+ case 0:
+ return NULL; /* GUC has no units */
+ case GUC_UNIT_BYTE:
+ return "B";
+ case GUC_UNIT_KB:
+ return "kB";
+ case GUC_UNIT_MB:
+ return "MB";
+ case GUC_UNIT_BLOCKS:
+ {
+ static char bbuf[8];
+
+ /* initialize if first time through */
+ if (bbuf[0] == '\0')
+ snprintf(bbuf, sizeof(bbuf), "%dkB", BLCKSZ / 1024);
+ return bbuf;
+ }
+ case GUC_UNIT_XBLOCKS:
+ {
+ static char xbuf[8];
+
+ /* initialize if first time through */
+ if (xbuf[0] == '\0')
+ snprintf(xbuf, sizeof(xbuf), "%dkB", XLOG_BLCKSZ / 1024);
+ return xbuf;
+ }
+ case GUC_UNIT_MS:
+ return "ms";
+ case GUC_UNIT_S:
+ return "s";
+ case GUC_UNIT_MIN:
+ return "min";
+ default:
+ elog(ERROR, "unrecognized GUC units value: %d",
+ flags & (GUC_UNIT_MEMORY | GUC_UNIT_TIME));
+ return NULL;
+ }
+}
+
+
+/*
+ * Try to parse value as an integer. The accepted formats are the
+ * usual decimal, octal, or hexadecimal formats, as well as floating-point
+ * formats (which will be rounded to integer after any units conversion).
+ * Optionally, the value can be followed by a unit name if "flags" indicates
+ * a unit is allowed.
+ *
+ * If the string parses okay, return true, else false.
+ * If okay and result is not NULL, return the value in *result.
+ * If not okay and hintmsg is not NULL, *hintmsg is set to a suitable
+ * HINT message, or NULL if no hint provided.
+ */
+bool
+parse_int(const char *value, int *result, int flags, const char **hintmsg)
+{
+ /*
+ * We assume here that double is wide enough to represent any integer
+ * value with adequate precision.
+ */
+ double val;
+ char *endptr;
+
+ /* To suppress compiler warnings, always set output params */
+ if (result)
+ *result = 0;
+ if (hintmsg)
+ *hintmsg = NULL;
+
+ /*
+ * Try to parse as an integer (allowing octal or hex input). If the
+ * conversion stops at a decimal point or 'e', or overflows, re-parse as
+ * float. This should work fine as long as we have no unit names starting
+ * with 'e'. If we ever do, the test could be extended to check for a
+ * sign or digit after 'e', but for now that's unnecessary.
+ */
+ errno = 0;
+ val = strtol(value, &endptr, 0);
+ if (*endptr == '.' || *endptr == 'e' || *endptr == 'E' ||
+ errno == ERANGE)
+ {
+ errno = 0;
+ val = strtod(value, &endptr);
+ }
+
+ if (endptr == value || errno == ERANGE)
+ return false; /* no HINT for these cases */
+
+ /* reject NaN (infinities will fail range check below) */
+ if (isnan(val))
+ return false; /* treat same as syntax error; no HINT */
+
+ /* allow whitespace between number and unit */
+ while (isspace((unsigned char) *endptr))
+ endptr++;
+
+ /* Handle possible unit */
+ if (*endptr != '\0')
+ {
+ if ((flags & GUC_UNIT) == 0)
+ return false; /* this setting does not accept a unit */
+
+ if (!convert_to_base_unit(val,
+ endptr, (flags & GUC_UNIT),
+ &val))
+ {
+ /* invalid unit, or garbage after the unit; set hint and fail. */
+ if (hintmsg)
+ {
+ if (flags & GUC_UNIT_MEMORY)
+ *hintmsg = memory_units_hint;
+ else
+ *hintmsg = time_units_hint;
+ }
+ return false;
+ }
+ }
+
+ /* Round to int, then check for overflow */
+ val = rint(val);
+
+ if (val > INT_MAX || val < INT_MIN)
+ {
+ if (hintmsg)
+ *hintmsg = gettext_noop("Value exceeds integer range.");
+ return false;
+ }
+
+ if (result)
+ *result = (int) val;
+ return true;
+}
+
+/*
+ * Try to parse value as a floating point number in the usual format.
+ * Optionally, the value can be followed by a unit name if "flags" indicates
+ * a unit is allowed.
+ *
+ * If the string parses okay, return true, else false.
+ * If okay and result is not NULL, return the value in *result.
+ * If not okay and hintmsg is not NULL, *hintmsg is set to a suitable
+ * HINT message, or NULL if no hint provided.
+ */
+bool
+parse_real(const char *value, double *result, int flags, const char **hintmsg)
+{
+ double val;
+ char *endptr;
+
+ /* To suppress compiler warnings, always set output params */
+ if (result)
+ *result = 0;
+ if (hintmsg)
+ *hintmsg = NULL;
+
+ errno = 0;
+ val = strtod(value, &endptr);
+
+ if (endptr == value || errno == ERANGE)
+ return false; /* no HINT for these cases */
+
+ /* reject NaN (infinities will fail range checks later) */
+ if (isnan(val))
+ return false; /* treat same as syntax error; no HINT */
+
+ /* allow whitespace between number and unit */
+ while (isspace((unsigned char) *endptr))
+ endptr++;
+
+ /* Handle possible unit */
+ if (*endptr != '\0')
+ {
+ if ((flags & GUC_UNIT) == 0)
+ return false; /* this setting does not accept a unit */
+
+ if (!convert_to_base_unit(val,
+ endptr, (flags & GUC_UNIT),
+ &val))
+ {
+ /* invalid unit, or garbage after the unit; set hint and fail. */
+ if (hintmsg)
+ {
+ if (flags & GUC_UNIT_MEMORY)
+ *hintmsg = memory_units_hint;
+ else
+ *hintmsg = time_units_hint;
+ }
+ return false;
+ }
+ }
+
+ if (result)
+ *result = val;
+ return true;
+}
+
+
+/*
+ * Lookup the name for an enum option with the selected value.
+ * Should only ever be called with known-valid values, so throws
+ * an elog(ERROR) if the enum option is not found.
+ *
+ * The returned string is a pointer to static data and not
+ * allocated for modification.
+ */
+const char *
+config_enum_lookup_by_value(struct config_enum *record, int val)
+{
+ const struct config_enum_entry *entry;
+
+ for (entry = record->options; entry && entry->name; entry++)
+ {
+ if (entry->val == val)
+ return entry->name;
+ }
+
+ elog(ERROR, "could not find enum option %d for %s",
+ val, record->gen.name);
+ return NULL; /* silence compiler */
+}
+
+
+/*
+ * Lookup the value for an enum option with the selected name
+ * (case-insensitive).
+ * If the enum option is found, sets the retval value and returns
+ * true. If it's not found, return false and retval is set to 0.
+ */
+bool
+config_enum_lookup_by_name(struct config_enum *record, const char *value,
+ int *retval)
+{
+ const struct config_enum_entry *entry;
+
+ for (entry = record->options; entry && entry->name; entry++)
+ {
+ if (pg_strcasecmp(value, entry->name) == 0)
+ {
+ *retval = entry->val;
+ return true;
+ }
+ }
+
+ *retval = 0;
+ return false;
+}
+
+
+/*
+ * Return a list of all available options for an enum, excluding
+ * hidden ones, separated by the given separator.
+ * If prefix is non-NULL, it is added before the first enum value.
+ * If suffix is non-NULL, it is added to the end of the string.
+ */
+static char *
+config_enum_get_options(struct config_enum *record, const char *prefix,
+ const char *suffix, const char *separator)
+{
+ const struct config_enum_entry *entry;
+ StringInfoData retstr;
+ int seplen;
+
+ initStringInfo(&retstr);
+ appendStringInfoString(&retstr, prefix);
+
+ seplen = strlen(separator);
+ for (entry = record->options; entry && entry->name; entry++)
+ {
+ if (!entry->hidden)
+ {
+ appendStringInfoString(&retstr, entry->name);
+ appendBinaryStringInfo(&retstr, separator, seplen);
+ }
+ }
+
+ /*
+ * All the entries may have been hidden, leaving the string empty if no
+ * prefix was given. This indicates a broken GUC setup, since there is no
+ * use for an enum without any values, so we just check to make sure we
+ * don't write to invalid memory instead of actually trying to do
+ * something smart with it.
+ */
+ if (retstr.len >= seplen)
+ {
+ /* Replace final separator */
+ retstr.data[retstr.len - seplen] = '\0';
+ retstr.len -= seplen;
+ }
+
+ appendStringInfoString(&retstr, suffix);
+
+ return retstr.data;
+}
+
+/*
+ * Parse and validate a proposed value for the specified configuration
+ * parameter.
+ *
+ * This does built-in checks (such as range limits for an integer parameter)
+ * and also calls any check hook the parameter may have.
+ *
+ * record: GUC variable's info record
+ * name: variable name (should match the record of course)
+ * value: proposed value, as a string
+ * source: identifies source of value (check hooks may need this)
+ * elevel: level to log any error reports at
+ * newval: on success, converted parameter value is returned here
+ * newextra: on success, receives any "extra" data returned by check hook
+ * (caller must initialize *newextra to NULL)
+ *
+ * Returns true if OK, false if not (or throws error, if elevel >= ERROR)
+ */
+static bool
+parse_and_validate_value(struct config_generic *record,
+ const char *name, const char *value,
+ GucSource source, int elevel,
+ union config_var_val *newval, void **newextra)
+{
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) record;
+
+ if (!parse_bool(value, &newval->boolval))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("parameter \"%s\" requires a Boolean value",
+ name)));
+ return false;
+ }
+
+ if (!call_bool_check_hook(conf, &newval->boolval, newextra,
+ source, elevel))
+ return false;
+ }
+ break;
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) record;
+ const char *hintmsg;
+
+ if (!parse_int(value, &newval->intval,
+ conf->gen.flags, &hintmsg))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ name, value),
+ hintmsg ? errhint("%s", _(hintmsg)) : 0));
+ return false;
+ }
+
+ if (newval->intval < conf->min || newval->intval > conf->max)
+ {
+ const char *unit = get_config_unit_name(conf->gen.flags);
+
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)",
+ newval->intval,
+ unit ? " " : "",
+ unit ? unit : "",
+ name,
+ conf->min, conf->max)));
+ return false;
+ }
+
+ if (!call_int_check_hook(conf, &newval->intval, newextra,
+ source, elevel))
+ return false;
+ }
+ break;
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) record;
+ const char *hintmsg;
+
+ if (!parse_real(value, &newval->realval,
+ conf->gen.flags, &hintmsg))
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ name, value),
+ hintmsg ? errhint("%s", _(hintmsg)) : 0));
+ return false;
+ }
+
+ if (newval->realval < conf->min || newval->realval > conf->max)
+ {
+ const char *unit = get_config_unit_name(conf->gen.flags);
+
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)",
+ newval->realval,
+ unit ? " " : "",
+ unit ? unit : "",
+ name,
+ conf->min, conf->max)));
+ return false;
+ }
+
+ if (!call_real_check_hook(conf, &newval->realval, newextra,
+ source, elevel))
+ return false;
+ }
+ break;
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) record;
+
+ /*
+ * The value passed by the caller could be transient, so we
+ * always strdup it.
+ */
+ newval->stringval = guc_strdup(elevel, value);
+ if (newval->stringval == NULL)
+ return false;
+
+ /*
+ * The only built-in "parsing" check we have is to apply
+ * truncation if GUC_IS_NAME.
+ */
+ if (conf->gen.flags & GUC_IS_NAME)
+ truncate_identifier(newval->stringval,
+ strlen(newval->stringval),
+ true);
+
+ if (!call_string_check_hook(conf, &newval->stringval, newextra,
+ source, elevel))
+ {
+ free(newval->stringval);
+ newval->stringval = NULL;
+ return false;
+ }
+ }
+ break;
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) record;
+
+ if (!config_enum_lookup_by_name(conf, value, &newval->enumval))
+ {
+ char *hintmsg;
+
+ hintmsg = config_enum_get_options(conf,
+ "Available values: ",
+ ".", ", ");
+
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ name, value),
+ hintmsg ? errhint("%s", _(hintmsg)) : 0));
+
+ if (hintmsg)
+ pfree(hintmsg);
+ return false;
+ }
+
+ if (!call_enum_check_hook(conf, &newval->enumval, newextra,
+ source, elevel))
+ return false;
+ }
+ break;
+ }
+
+ return true;
+}
+
+
+/*
+ * set_config_option: sets option `name' to given value.
+ *
+ * The value should be a string, which will be parsed and converted to
+ * the appropriate data type. The context and source parameters indicate
+ * in which context this function is being called, so that it can apply the
+ * access restrictions properly.
+ *
+ * If value is NULL, set the option to its default value (normally the
+ * reset_val, but if source == PGC_S_DEFAULT we instead use the boot_val).
+ *
+ * action indicates whether to set the value globally in the session, locally
+ * to the current top transaction, or just for the duration of a function call.
+ *
+ * If changeVal is false then don't really set the option but do all
+ * the checks to see if it would work.
+ *
+ * elevel should normally be passed as zero, allowing this function to make
+ * its standard choice of ereport level. However some callers need to be
+ * able to override that choice; they should pass the ereport level to use.
+ *
+ * is_reload should be true only when called from read_nondefault_variables()
+ * or RestoreGUCState(), where we are trying to load some other process's
+ * GUC settings into a new process.
+ *
+ * Return value:
+ * +1: the value is valid and was successfully applied.
+ * 0: the name or value is invalid (but see below).
+ * -1: the value was not applied because of context, priority, or changeVal.
+ *
+ * If there is an error (non-existing option, invalid value) then an
+ * ereport(ERROR) is thrown *unless* this is called for a source for which
+ * we don't want an ERROR (currently, those are defaults, the config file,
+ * and per-database or per-user settings, as well as callers who specify
+ * a less-than-ERROR elevel). In those cases we write a suitable error
+ * message via ereport() and return 0.
+ *
+ * See also SetConfigOption for an external interface.
+ */
+int
+set_config_option(const char *name, const char *value,
+ GucContext context, GucSource source,
+ GucAction action, bool changeVal, int elevel,
+ bool is_reload)
+{
+ Oid srole;
+
+ /*
+ * Non-interactive sources should be treated as having all privileges,
+ * except for PGC_S_CLIENT. Note in particular that this is true for
+ * pg_db_role_setting sources (PGC_S_GLOBAL etc): we assume a suitable
+ * privilege check was done when the pg_db_role_setting entry was made.
+ */
+ if (source >= PGC_S_INTERACTIVE || source == PGC_S_CLIENT)
+ srole = GetUserId();
+ else
+ srole = BOOTSTRAP_SUPERUSERID;
+
+ return set_config_option_ext(name, value,
+ context, source, srole,
+ action, changeVal, elevel,
+ is_reload);
+}
+
+/*
+ * set_config_option_ext: sets option `name' to given value.
+ *
+ * This API adds the ability to explicitly specify which role OID
+ * is considered to be setting the value. Most external callers can use
+ * set_config_option() and let it determine that based on the GucSource,
+ * but there are a few that are supplying a value that was determined
+ * in some special way and need to override the decision. Also, when
+ * restoring a previously-assigned value, it's important to supply the
+ * same role OID that set the value originally; so all guc.c callers
+ * that are doing that type of thing need to call this directly.
+ *
+ * Generally, srole should be GetUserId() when the source is a SQL operation,
+ * or BOOTSTRAP_SUPERUSERID if the source is a config file or similar.
+ */
+int
+set_config_option_ext(const char *name, const char *value,
+ GucContext context, GucSource source, Oid srole,
+ GucAction action, bool changeVal, int elevel,
+ bool is_reload)
+{
+ struct config_generic *record;
+ union config_var_val newval_union;
+ void *newextra = NULL;
+ bool prohibitValueChange = false;
+ bool makeDefault;
+
+ if (elevel == 0)
+ {
+ if (source == PGC_S_DEFAULT || source == PGC_S_FILE)
+ {
+ /*
+ * To avoid cluttering the log, only the postmaster bleats loudly
+ * about problems with the config file.
+ */
+ elevel = IsUnderPostmaster ? DEBUG3 : LOG;
+ }
+ else if (source == PGC_S_GLOBAL ||
+ source == PGC_S_DATABASE ||
+ source == PGC_S_USER ||
+ source == PGC_S_DATABASE_USER)
+ elevel = WARNING;
+ else
+ elevel = ERROR;
+ }
+
+ /*
+ * GUC_ACTION_SAVE changes are acceptable during a parallel operation,
+ * because the current worker will also pop the change. We're probably
+ * dealing with a function having a proconfig entry. Only the function's
+ * body should observe the change, and peer workers do not share in the
+ * execution of a function call started by this worker.
+ *
+ * Other changes might need to affect other workers, so forbid them.
+ */
+ if (IsInParallelMode() && changeVal && action != GUC_ACTION_SAVE)
+ ereport(elevel,
+ (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
+ errmsg("cannot set parameters during a parallel operation")));
+
+ record = find_option(name, true, false, elevel);
+ if (record == NULL)
+ return 0;
+
+ /*
+ * Check if the option can be set at this time. See guc.h for the precise
+ * rules.
+ */
+ switch (record->context)
+ {
+ case PGC_INTERNAL:
+ if (context != PGC_INTERNAL)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed",
+ name)));
+ return 0;
+ }
+ break;
+ case PGC_POSTMASTER:
+ if (context == PGC_SIGHUP)
+ {
+ /*
+ * We are re-reading a PGC_POSTMASTER variable from
+ * postgresql.conf. We can't change the setting, so we should
+ * give a warning if the DBA tries to change it. However,
+ * because of variant formats, canonicalization by check
+ * hooks, etc, we can't just compare the given string directly
+ * to what's stored. Set a flag to check below after we have
+ * the final storable value.
+ */
+ prohibitValueChange = true;
+ }
+ else if (context != PGC_POSTMASTER)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ break;
+ case PGC_SIGHUP:
+ if (context != PGC_SIGHUP && context != PGC_POSTMASTER)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed now",
+ name)));
+ return 0;
+ }
+
+ /*
+ * Hmm, the idea of the SIGHUP context is "ought to be global, but
+ * can be changed after postmaster start". But there's nothing
+ * that prevents a crafty administrator from sending SIGHUP
+ * signals to individual backends only.
+ */
+ break;
+ case PGC_SU_BACKEND:
+ if (context == PGC_BACKEND)
+ {
+ /*
+ * Check whether the requesting user has been granted
+ * privilege to set this GUC.
+ */
+ AclResult aclresult;
+
+ aclresult = pg_parameter_aclcheck(name, srole, ACL_SET);
+ if (aclresult != ACLCHECK_OK)
+ {
+ /* No granted privilege */
+ ereport(elevel,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to set parameter \"%s\"",
+ name)));
+ return 0;
+ }
+ }
+ /* fall through to process the same as PGC_BACKEND */
+ /* FALLTHROUGH */
+ case PGC_BACKEND:
+ if (context == PGC_SIGHUP)
+ {
+ /*
+ * If a PGC_BACKEND or PGC_SU_BACKEND parameter is changed in
+ * the config file, we want to accept the new value in the
+ * postmaster (whence it will propagate to
+ * subsequently-started backends), but ignore it in existing
+ * backends. This is a tad klugy, but necessary because we
+ * don't re-read the config file during backend start.
+ *
+ * In EXEC_BACKEND builds, this works differently: we load all
+ * non-default settings from the CONFIG_EXEC_PARAMS file
+ * during backend start. In that case we must accept
+ * PGC_SIGHUP settings, so as to have the same value as if
+ * we'd forked from the postmaster. This can also happen when
+ * using RestoreGUCState() within a background worker that
+ * needs to have the same settings as the user backend that
+ * started it. is_reload will be true when either situation
+ * applies.
+ */
+ if (IsUnderPostmaster && !is_reload)
+ return -1;
+ }
+ else if (context != PGC_POSTMASTER &&
+ context != PGC_BACKEND &&
+ context != PGC_SU_BACKEND &&
+ source != PGC_S_CLIENT)
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be set after connection start",
+ name)));
+ return 0;
+ }
+ break;
+ case PGC_SUSET:
+ if (context == PGC_USERSET || context == PGC_BACKEND)
+ {
+ /*
+ * Check whether the requesting user has been granted
+ * privilege to set this GUC.
+ */
+ AclResult aclresult;
+
+ aclresult = pg_parameter_aclcheck(name, srole, ACL_SET);
+ if (aclresult != ACLCHECK_OK)
+ {
+ /* No granted privilege */
+ ereport(elevel,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to set parameter \"%s\"",
+ name)));
+ return 0;
+ }
+ }
+ break;
+ case PGC_USERSET:
+ /* always okay */
+ break;
+ }
+
+ /*
+ * Disallow changing GUC_NOT_WHILE_SEC_REST values if we are inside a
+ * security restriction context. We can reject this regardless of the GUC
+ * context or source, mainly because sources that it might be reasonable
+ * to override for won't be seen while inside a function.
+ *
+ * Note: variables marked GUC_NOT_WHILE_SEC_REST should usually be marked
+ * GUC_NO_RESET_ALL as well, because ResetAllOptions() doesn't check this.
+ * An exception might be made if the reset value is assumed to be "safe".
+ *
+ * Note: this flag is currently used for "session_authorization" and
+ * "role". We need to prohibit changing these inside a local userid
+ * context because when we exit it, GUC won't be notified, leaving things
+ * out of sync. (This could be fixed by forcing a new GUC nesting level,
+ * but that would change behavior in possibly-undesirable ways.) Also, we
+ * prohibit changing these in a security-restricted operation because
+ * otherwise RESET could be used to regain the session user's privileges.
+ */
+ if (record->flags & GUC_NOT_WHILE_SEC_REST)
+ {
+ if (InLocalUserIdChange())
+ {
+ /*
+ * Phrasing of this error message is historical, but it's the most
+ * common case.
+ */
+ ereport(elevel,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("cannot set parameter \"%s\" within security-definer function",
+ name)));
+ return 0;
+ }
+ if (InSecurityRestrictedOperation())
+ {
+ ereport(elevel,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("cannot set parameter \"%s\" within security-restricted operation",
+ name)));
+ return 0;
+ }
+ }
+
+ /*
+ * Should we set reset/stacked values? (If so, the behavior is not
+ * transactional.) This is done either when we get a default value from
+ * the database's/user's/client's default settings or when we reset a
+ * value to its default.
+ */
+ makeDefault = changeVal && (source <= PGC_S_OVERRIDE) &&
+ ((value != NULL) || source == PGC_S_DEFAULT);
+
+ /*
+ * Ignore attempted set if overridden by previously processed setting.
+ * However, if changeVal is false then plow ahead anyway since we are
+ * trying to find out if the value is potentially good, not actually use
+ * it. Also keep going if makeDefault is true, since we may want to set
+ * the reset/stacked values even if we can't set the variable itself.
+ */
+ if (record->source > source)
+ {
+ if (changeVal && !makeDefault)
+ {
+ elog(DEBUG3, "\"%s\": setting ignored because previous source is higher priority",
+ name);
+ return -1;
+ }
+ changeVal = false;
+ }
+
+ /*
+ * Evaluate value and set variable.
+ */
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) record;
+
+#define newval (newval_union.boolval)
+
+ if (value)
+ {
+ if (!parse_and_validate_value(record, name, value,
+ source, elevel,
+ &newval_union, &newextra))
+ return 0;
+ }
+ else if (source == PGC_S_DEFAULT)
+ {
+ newval = conf->boot_val;
+ if (!call_bool_check_hook(conf, &newval, &newextra,
+ source, elevel))
+ return 0;
+ }
+ else
+ {
+ newval = conf->reset_val;
+ newextra = conf->reset_extra;
+ source = conf->gen.reset_source;
+ context = conf->gen.reset_scontext;
+ srole = conf->gen.reset_srole;
+ }
+
+ if (prohibitValueChange)
+ {
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (*conf->variable != newval)
+ {
+ record->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ record->status &= ~GUC_PENDING_RESTART;
+ return -1;
+ }
+
+ if (changeVal)
+ {
+ /* Save old value to support transaction abort */
+ if (!makeDefault)
+ push_old_value(&conf->gen, action);
+
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ conf->gen.source = source;
+ conf->gen.scontext = context;
+ conf->gen.srole = srole;
+ }
+ if (makeDefault)
+ {
+ GucStack *stack;
+
+ if (conf->gen.reset_source <= source)
+ {
+ conf->reset_val = newval;
+ set_extra_field(&conf->gen, &conf->reset_extra,
+ newextra);
+ conf->gen.reset_source = source;
+ conf->gen.reset_scontext = context;
+ conf->gen.reset_srole = srole;
+ }
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (stack->source <= source)
+ {
+ stack->prior.val.boolval = newval;
+ set_extra_field(&conf->gen, &stack->prior.extra,
+ newextra);
+ stack->source = source;
+ stack->scontext = context;
+ stack->srole = srole;
+ }
+ }
+ }
+
+ /* Perhaps we didn't install newextra anywhere */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+ break;
+
+#undef newval
+ }
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) record;
+
+#define newval (newval_union.intval)
+
+ if (value)
+ {
+ if (!parse_and_validate_value(record, name, value,
+ source, elevel,
+ &newval_union, &newextra))
+ return 0;
+ }
+ else if (source == PGC_S_DEFAULT)
+ {
+ newval = conf->boot_val;
+ if (!call_int_check_hook(conf, &newval, &newextra,
+ source, elevel))
+ return 0;
+ }
+ else
+ {
+ newval = conf->reset_val;
+ newextra = conf->reset_extra;
+ source = conf->gen.reset_source;
+ context = conf->gen.reset_scontext;
+ srole = conf->gen.reset_srole;
+ }
+
+ if (prohibitValueChange)
+ {
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (*conf->variable != newval)
+ {
+ record->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ record->status &= ~GUC_PENDING_RESTART;
+ return -1;
+ }
+
+ if (changeVal)
+ {
+ /* Save old value to support transaction abort */
+ if (!makeDefault)
+ push_old_value(&conf->gen, action);
+
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ conf->gen.source = source;
+ conf->gen.scontext = context;
+ conf->gen.srole = srole;
+ }
+ if (makeDefault)
+ {
+ GucStack *stack;
+
+ if (conf->gen.reset_source <= source)
+ {
+ conf->reset_val = newval;
+ set_extra_field(&conf->gen, &conf->reset_extra,
+ newextra);
+ conf->gen.reset_source = source;
+ conf->gen.reset_scontext = context;
+ conf->gen.reset_srole = srole;
+ }
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (stack->source <= source)
+ {
+ stack->prior.val.intval = newval;
+ set_extra_field(&conf->gen, &stack->prior.extra,
+ newextra);
+ stack->source = source;
+ stack->scontext = context;
+ stack->srole = srole;
+ }
+ }
+ }
+
+ /* Perhaps we didn't install newextra anywhere */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+ break;
+
+#undef newval
+ }
+
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) record;
+
+#define newval (newval_union.realval)
+
+ if (value)
+ {
+ if (!parse_and_validate_value(record, name, value,
+ source, elevel,
+ &newval_union, &newextra))
+ return 0;
+ }
+ else if (source == PGC_S_DEFAULT)
+ {
+ newval = conf->boot_val;
+ if (!call_real_check_hook(conf, &newval, &newextra,
+ source, elevel))
+ return 0;
+ }
+ else
+ {
+ newval = conf->reset_val;
+ newextra = conf->reset_extra;
+ source = conf->gen.reset_source;
+ context = conf->gen.reset_scontext;
+ srole = conf->gen.reset_srole;
+ }
+
+ if (prohibitValueChange)
+ {
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (*conf->variable != newval)
+ {
+ record->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ record->status &= ~GUC_PENDING_RESTART;
+ return -1;
+ }
+
+ if (changeVal)
+ {
+ /* Save old value to support transaction abort */
+ if (!makeDefault)
+ push_old_value(&conf->gen, action);
+
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ conf->gen.source = source;
+ conf->gen.scontext = context;
+ conf->gen.srole = srole;
+ }
+ if (makeDefault)
+ {
+ GucStack *stack;
+
+ if (conf->gen.reset_source <= source)
+ {
+ conf->reset_val = newval;
+ set_extra_field(&conf->gen, &conf->reset_extra,
+ newextra);
+ conf->gen.reset_source = source;
+ conf->gen.reset_scontext = context;
+ conf->gen.reset_srole = srole;
+ }
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (stack->source <= source)
+ {
+ stack->prior.val.realval = newval;
+ set_extra_field(&conf->gen, &stack->prior.extra,
+ newextra);
+ stack->source = source;
+ stack->scontext = context;
+ stack->srole = srole;
+ }
+ }
+ }
+
+ /* Perhaps we didn't install newextra anywhere */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+ break;
+
+#undef newval
+ }
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) record;
+
+#define newval (newval_union.stringval)
+
+ if (value)
+ {
+ if (!parse_and_validate_value(record, name, value,
+ source, elevel,
+ &newval_union, &newextra))
+ return 0;
+ }
+ else if (source == PGC_S_DEFAULT)
+ {
+ /* non-NULL boot_val must always get strdup'd */
+ if (conf->boot_val != NULL)
+ {
+ newval = guc_strdup(elevel, conf->boot_val);
+ if (newval == NULL)
+ return 0;
+ }
+ else
+ newval = NULL;
+
+ if (!call_string_check_hook(conf, &newval, &newextra,
+ source, elevel))
+ {
+ free(newval);
+ return 0;
+ }
+ }
+ else
+ {
+ /*
+ * strdup not needed, since reset_val is already under
+ * guc.c's control
+ */
+ newval = conf->reset_val;
+ newextra = conf->reset_extra;
+ source = conf->gen.reset_source;
+ context = conf->gen.reset_scontext;
+ srole = conf->gen.reset_srole;
+ }
+
+ if (prohibitValueChange)
+ {
+ bool newval_different;
+
+ /* newval shouldn't be NULL, so we're a bit sloppy here */
+ newval_different = (*conf->variable == NULL ||
+ newval == NULL ||
+ strcmp(*conf->variable, newval) != 0);
+
+ /* Release newval, unless it's reset_val */
+ if (newval && !string_field_used(conf, newval))
+ free(newval);
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (newval_different)
+ {
+ record->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ record->status &= ~GUC_PENDING_RESTART;
+ return -1;
+ }
+
+ if (changeVal)
+ {
+ /* Save old value to support transaction abort */
+ if (!makeDefault)
+ push_old_value(&conf->gen, action);
+
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ set_string_field(conf, conf->variable, newval);
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ conf->gen.source = source;
+ conf->gen.scontext = context;
+ conf->gen.srole = srole;
+ }
+
+ if (makeDefault)
+ {
+ GucStack *stack;
+
+ if (conf->gen.reset_source <= source)
+ {
+ set_string_field(conf, &conf->reset_val, newval);
+ set_extra_field(&conf->gen, &conf->reset_extra,
+ newextra);
+ conf->gen.reset_source = source;
+ conf->gen.reset_scontext = context;
+ conf->gen.reset_srole = srole;
+ }
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (stack->source <= source)
+ {
+ set_string_field(conf, &stack->prior.val.stringval,
+ newval);
+ set_extra_field(&conf->gen, &stack->prior.extra,
+ newextra);
+ stack->source = source;
+ stack->scontext = context;
+ stack->srole = srole;
+ }
+ }
+ }
+
+ /* Perhaps we didn't install newval anywhere */
+ if (newval && !string_field_used(conf, newval))
+ free(newval);
+ /* Perhaps we didn't install newextra anywhere */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+ break;
+
+#undef newval
+ }
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) record;
+
+#define newval (newval_union.enumval)
+
+ if (value)
+ {
+ if (!parse_and_validate_value(record, name, value,
+ source, elevel,
+ &newval_union, &newextra))
+ return 0;
+ }
+ else if (source == PGC_S_DEFAULT)
+ {
+ newval = conf->boot_val;
+ if (!call_enum_check_hook(conf, &newval, &newextra,
+ source, elevel))
+ return 0;
+ }
+ else
+ {
+ newval = conf->reset_val;
+ newextra = conf->reset_extra;
+ source = conf->gen.reset_source;
+ context = conf->gen.reset_scontext;
+ srole = conf->gen.reset_srole;
+ }
+
+ if (prohibitValueChange)
+ {
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (*conf->variable != newval)
+ {
+ record->status |= GUC_PENDING_RESTART;
+ ereport(elevel,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed without restarting the server",
+ name)));
+ return 0;
+ }
+ record->status &= ~GUC_PENDING_RESTART;
+ return -1;
+ }
+
+ if (changeVal)
+ {
+ /* Save old value to support transaction abort */
+ if (!makeDefault)
+ push_old_value(&conf->gen, action);
+
+ if (conf->assign_hook)
+ conf->assign_hook(newval, newextra);
+ *conf->variable = newval;
+ set_extra_field(&conf->gen, &conf->gen.extra,
+ newextra);
+ conf->gen.source = source;
+ conf->gen.scontext = context;
+ conf->gen.srole = srole;
+ }
+ if (makeDefault)
+ {
+ GucStack *stack;
+
+ if (conf->gen.reset_source <= source)
+ {
+ conf->reset_val = newval;
+ set_extra_field(&conf->gen, &conf->reset_extra,
+ newextra);
+ conf->gen.reset_source = source;
+ conf->gen.reset_scontext = context;
+ conf->gen.reset_srole = srole;
+ }
+ for (stack = conf->gen.stack; stack; stack = stack->prev)
+ {
+ if (stack->source <= source)
+ {
+ stack->prior.val.enumval = newval;
+ set_extra_field(&conf->gen, &stack->prior.extra,
+ newextra);
+ stack->source = source;
+ stack->scontext = context;
+ stack->srole = srole;
+ }
+ }
+ }
+
+ /* Perhaps we didn't install newextra anywhere */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+ break;
+
+#undef newval
+ }
+ }
+
+ if (changeVal && (record->flags & GUC_REPORT))
+ {
+ record->status |= GUC_NEEDS_REPORT;
+ report_needed = true;
+ }
+
+ return changeVal ? 1 : -1;
+}
+
+
+/*
+ * Set the fields for source file and line number the setting came from.
+ */
+static void
+set_config_sourcefile(const char *name, char *sourcefile, int sourceline)
+{
+ struct config_generic *record;
+ int elevel;
+
+ /*
+ * To avoid cluttering the log, only the postmaster bleats loudly about
+ * problems with the config file.
+ */
+ elevel = IsUnderPostmaster ? DEBUG3 : LOG;
+
+ record = find_option(name, true, false, elevel);
+ /* should not happen */
+ if (record == NULL)
+ return;
+
+ sourcefile = guc_strdup(elevel, sourcefile);
+ if (record->sourcefile)
+ free(record->sourcefile);
+ record->sourcefile = sourcefile;
+ record->sourceline = sourceline;
+}
+
+/*
+ * Set a config option to the given value.
+ *
+ * See also set_config_option; this is just the wrapper to be called from
+ * outside GUC. (This function should be used when possible, because its API
+ * is more stable than set_config_option's.)
+ *
+ * Note: there is no support here for setting source file/line, as it
+ * is currently not needed.
+ */
+void
+SetConfigOption(const char *name, const char *value,
+ GucContext context, GucSource source)
+{
+ (void) set_config_option(name, value, context, source,
+ GUC_ACTION_SET, true, 0, false);
+}
+
+
+
+/*
+ * Fetch the current value of the option `name', as a string.
+ *
+ * If the option doesn't exist, return NULL if missing_ok is true (NOTE that
+ * this cannot be distinguished from a string variable with a NULL value!),
+ * otherwise throw an ereport and don't return.
+ *
+ * If restrict_privileged is true, we also enforce that only superusers and
+ * members of the pg_read_all_settings role can see GUC_SUPERUSER_ONLY
+ * variables. This should only be passed as true in user-driven calls.
+ *
+ * The string is *not* allocated for modification and is really only
+ * valid until the next call to configuration related functions.
+ */
+const char *
+GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged)
+{
+ struct config_generic *record;
+ static char buffer[256];
+
+ record = find_option(name, false, missing_ok, ERROR);
+ if (record == NULL)
+ return NULL;
+ if (restrict_privileged &&
+ (record->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"",
+ name)));
+
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ return *((struct config_bool *) record)->variable ? "on" : "off";
+
+ case PGC_INT:
+ snprintf(buffer, sizeof(buffer), "%d",
+ *((struct config_int *) record)->variable);
+ return buffer;
+
+ case PGC_REAL:
+ snprintf(buffer, sizeof(buffer), "%g",
+ *((struct config_real *) record)->variable);
+ return buffer;
+
+ case PGC_STRING:
+ return *((struct config_string *) record)->variable;
+
+ case PGC_ENUM:
+ return config_enum_lookup_by_value((struct config_enum *) record,
+ *((struct config_enum *) record)->variable);
+ }
+ return NULL;
+}
+
+/*
+ * Get the RESET value associated with the given option.
+ *
+ * Note: this is not re-entrant, due to use of static result buffer;
+ * not to mention that a string variable could have its reset_val changed.
+ * Beware of assuming the result value is good for very long.
+ */
+const char *
+GetConfigOptionResetString(const char *name)
+{
+ struct config_generic *record;
+ static char buffer[256];
+
+ record = find_option(name, false, false, ERROR);
+ Assert(record != NULL);
+ if ((record->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"",
+ name)));
+
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ return ((struct config_bool *) record)->reset_val ? "on" : "off";
+
+ case PGC_INT:
+ snprintf(buffer, sizeof(buffer), "%d",
+ ((struct config_int *) record)->reset_val);
+ return buffer;
+
+ case PGC_REAL:
+ snprintf(buffer, sizeof(buffer), "%g",
+ ((struct config_real *) record)->reset_val);
+ return buffer;
+
+ case PGC_STRING:
+ return ((struct config_string *) record)->reset_val;
+
+ case PGC_ENUM:
+ return config_enum_lookup_by_value((struct config_enum *) record,
+ ((struct config_enum *) record)->reset_val);
+ }
+ return NULL;
+}
+
+/*
+ * Get the GUC flags associated with the given option.
+ *
+ * If the option doesn't exist, return 0 if missing_ok is true,
+ * otherwise throw an ereport and don't return.
+ */
+int
+GetConfigOptionFlags(const char *name, bool missing_ok)
+{
+ struct config_generic *record;
+
+ record = find_option(name, false, missing_ok, ERROR);
+ if (record == NULL)
+ return 0;
+ return record->flags;
+}
+
+
+/*
+ * flatten_set_variable_args
+ * Given a parsenode List as emitted by the grammar for SET,
+ * convert to the flat string representation used by GUC.
+ *
+ * We need to be told the name of the variable the args are for, because
+ * the flattening rules vary (ugh).
+ *
+ * The result is NULL if args is NIL (i.e., SET ... TO DEFAULT), otherwise
+ * a palloc'd string.
+ */
+static char *
+flatten_set_variable_args(const char *name, List *args)
+{
+ struct config_generic *record;
+ int flags;
+ StringInfoData buf;
+ ListCell *l;
+
+ /* Fast path if just DEFAULT */
+ if (args == NIL)
+ return NULL;
+
+ /*
+ * Get flags for the variable; if it's not known, use default flags.
+ * (Caller might throw error later, but not our business to do so here.)
+ */
+ record = find_option(name, false, true, WARNING);
+ if (record)
+ flags = record->flags;
+ else
+ flags = 0;
+
+ /* Complain if list input and non-list variable */
+ if ((flags & GUC_LIST_INPUT) == 0 &&
+ list_length(args) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("SET %s takes only one argument", name)));
+
+ initStringInfo(&buf);
+
+ /*
+ * Each list member may be a plain A_Const node, or an A_Const within a
+ * TypeCast; the latter case is supported only for ConstInterval arguments
+ * (for SET TIME ZONE).
+ */
+ foreach(l, args)
+ {
+ Node *arg = (Node *) lfirst(l);
+ char *val;
+ TypeName *typeName = NULL;
+ A_Const *con;
+
+ if (l != list_head(args))
+ appendStringInfoString(&buf, ", ");
+
+ if (IsA(arg, TypeCast))
+ {
+ TypeCast *tc = (TypeCast *) arg;
+
+ arg = tc->arg;
+ typeName = tc->typeName;
+ }
+
+ if (!IsA(arg, A_Const))
+ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(arg));
+ con = (A_Const *) arg;
+
+ switch (nodeTag(&con->val))
+ {
+ case T_Integer:
+ appendStringInfo(&buf, "%d", intVal(&con->val));
+ break;
+ case T_Float:
+ /* represented as a string, so just copy it */
+ appendStringInfoString(&buf, castNode(Float, &con->val)->fval);
+ break;
+ case T_String:
+ val = strVal(&con->val);
+ if (typeName != NULL)
+ {
+ /*
+ * Must be a ConstInterval argument for TIME ZONE. Coerce
+ * to interval and back to normalize the value and account
+ * for any typmod.
+ */
+ Oid typoid;
+ int32 typmod;
+ Datum interval;
+ char *intervalout;
+
+ typenameTypeIdAndMod(NULL, typeName, &typoid, &typmod);
+ Assert(typoid == INTERVALOID);
+
+ interval =
+ DirectFunctionCall3(interval_in,
+ CStringGetDatum(val),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(typmod));
+
+ intervalout =
+ DatumGetCString(DirectFunctionCall1(interval_out,
+ interval));
+ appendStringInfo(&buf, "INTERVAL '%s'", intervalout);
+ }
+ else
+ {
+ /*
+ * Plain string literal or identifier. For quote mode,
+ * quote it if it's not a vanilla identifier.
+ */
+ if (flags & GUC_LIST_QUOTE)
+ appendStringInfoString(&buf, quote_identifier(val));
+ else
+ appendStringInfoString(&buf, val);
+ }
+ break;
+ default:
+ elog(ERROR, "unrecognized node type: %d",
+ (int) nodeTag(&con->val));
+ break;
+ }
+ }
+
+ return buf.data;
+}
+
+/*
+ * Write updated configuration parameter values into a temporary file.
+ * This function traverses the list of parameters and quotes the string
+ * values before writing them.
+ */
+static void
+write_auto_conf_file(int fd, const char *filename, ConfigVariable *head)
+{
+ StringInfoData buf;
+ ConfigVariable *item;
+
+ initStringInfo(&buf);
+
+ /* Emit file header containing warning comment */
+ appendStringInfoString(&buf, "# Do not edit this file manually!\n");
+ appendStringInfoString(&buf, "# It will be overwritten by the ALTER SYSTEM command.\n");
+
+ errno = 0;
+ if (write(fd, buf.data, buf.len) != buf.len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m", filename)));
+ }
+
+ /* Emit each parameter, properly quoting the value */
+ for (item = head; item != NULL; item = item->next)
+ {
+ char *escaped;
+
+ resetStringInfo(&buf);
+
+ appendStringInfoString(&buf, item->name);
+ appendStringInfoString(&buf, " = '");
+
+ escaped = escape_single_quotes_ascii(item->value);
+ if (!escaped)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory")));
+ appendStringInfoString(&buf, escaped);
+ free(escaped);
+
+ appendStringInfoString(&buf, "'\n");
+
+ errno = 0;
+ if (write(fd, buf.data, buf.len) != buf.len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m", filename)));
+ }
+ }
+
+ /* fsync before considering the write to be successful */
+ if (pg_fsync(fd) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not fsync file \"%s\": %m", filename)));
+
+ pfree(buf.data);
+}
+
+/*
+ * Update the given list of configuration parameters, adding, replacing
+ * or deleting the entry for item "name" (delete if "value" == NULL).
+ */
+static void
+replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
+ const char *name, const char *value)
+{
+ ConfigVariable *item,
+ *next,
+ *prev = NULL;
+
+ /*
+ * Remove any existing match(es) for "name". Normally there'd be at most
+ * one, but if external tools have modified the config file, there could
+ * be more.
+ */
+ for (item = *head_p; item != NULL; item = next)
+ {
+ next = item->next;
+ if (guc_name_compare(item->name, name) == 0)
+ {
+ /* found a match, delete it */
+ if (prev)
+ prev->next = next;
+ else
+ *head_p = next;
+ if (next == NULL)
+ *tail_p = prev;
+
+ pfree(item->name);
+ pfree(item->value);
+ pfree(item->filename);
+ pfree(item);
+ }
+ else
+ prev = item;
+ }
+
+ /* Done if we're trying to delete it */
+ if (value == NULL)
+ return;
+
+ /* OK, append a new entry */
+ item = palloc(sizeof *item);
+ item->name = pstrdup(name);
+ item->value = pstrdup(value);
+ item->errmsg = NULL;
+ item->filename = pstrdup(""); /* new item has no location */
+ item->sourceline = 0;
+ item->ignore = false;
+ item->applied = false;
+ item->next = NULL;
+
+ if (*head_p == NULL)
+ *head_p = item;
+ else
+ (*tail_p)->next = item;
+ *tail_p = item;
+}
+
+
+/*
+ * Execute ALTER SYSTEM statement.
+ *
+ * Read the old PG_AUTOCONF_FILENAME file, merge in the new variable value,
+ * and write out an updated file. If the command is ALTER SYSTEM RESET ALL,
+ * we can skip reading the old file and just write an empty file.
+ *
+ * An LWLock is used to serialize updates of the configuration file.
+ *
+ * In case of an error, we leave the original automatic
+ * configuration file (PG_AUTOCONF_FILENAME) intact.
+ */
+void
+AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
+{
+ char *name;
+ char *value;
+ bool resetall = false;
+ ConfigVariable *head = NULL;
+ ConfigVariable *tail = NULL;
+ volatile int Tmpfd;
+ char AutoConfFileName[MAXPGPATH];
+ char AutoConfTmpFileName[MAXPGPATH];
+
+ /*
+ * Extract statement arguments
+ */
+ name = altersysstmt->setstmt->name;
+
+ switch (altersysstmt->setstmt->kind)
+ {
+ case VAR_SET_VALUE:
+ value = ExtractSetVariableArgs(altersysstmt->setstmt);
+ break;
+
+ case VAR_SET_DEFAULT:
+ case VAR_RESET:
+ value = NULL;
+ break;
+
+ case VAR_RESET_ALL:
+ value = NULL;
+ resetall = true;
+ break;
+
+ default:
+ elog(ERROR, "unrecognized alter system stmt type: %d",
+ altersysstmt->setstmt->kind);
+ break;
+ }
+
+ /*
+ * Check permission to run ALTER SYSTEM on the target variable
+ */
+ if (!superuser())
+ {
+ if (resetall)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to perform ALTER SYSTEM RESET ALL")));
+ else
+ {
+ AclResult aclresult;
+
+ aclresult = pg_parameter_aclcheck(name, GetUserId(),
+ ACL_ALTER_SYSTEM);
+ if (aclresult != ACLCHECK_OK)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to set parameter \"%s\"",
+ name)));
+ }
+ }
+
+ /*
+ * Unless it's RESET_ALL, validate the target variable and value
+ */
+ if (!resetall)
+ {
+ struct config_generic *record;
+
+ record = find_option(name, false, false, ERROR);
+ Assert(record != NULL);
+
+ /*
+ * Don't allow parameters that can't be set in configuration files to
+ * be set in PG_AUTOCONF_FILENAME file.
+ */
+ if ((record->context == PGC_INTERNAL) ||
+ (record->flags & GUC_DISALLOW_IN_FILE) ||
+ (record->flags & GUC_DISALLOW_IN_AUTO_FILE))
+ ereport(ERROR,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed",
+ name)));
+
+ /*
+ * If a value is specified, verify that it's sane.
+ */
+ if (value)
+ {
+ union config_var_val newval;
+ void *newextra = NULL;
+
+ /* Check that it's acceptable for the indicated parameter */
+ if (!parse_and_validate_value(record, name, value,
+ PGC_S_FILE, ERROR,
+ &newval, &newextra))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ name, value)));
+
+ if (record->vartype == PGC_STRING && newval.stringval != NULL)
+ free(newval.stringval);
+ if (newextra)
+ free(newextra);
+
+ /*
+ * We must also reject values containing newlines, because the
+ * grammar for config files doesn't support embedded newlines in
+ * string literals.
+ */
+ if (strchr(value, '\n'))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("parameter value for ALTER SYSTEM must not contain a newline")));
+ }
+ }
+
+ /*
+ * PG_AUTOCONF_FILENAME and its corresponding temporary file are always in
+ * the data directory, so we can reference them by simple relative paths.
+ */
+ snprintf(AutoConfFileName, sizeof(AutoConfFileName), "%s",
+ PG_AUTOCONF_FILENAME);
+ snprintf(AutoConfTmpFileName, sizeof(AutoConfTmpFileName), "%s.%s",
+ AutoConfFileName,
+ "tmp");
+
+ /*
+ * Only one backend is allowed to operate on PG_AUTOCONF_FILENAME at a
+ * time. Use AutoFileLock to ensure that. We must hold the lock while
+ * reading the old file contents.
+ */
+ LWLockAcquire(AutoFileLock, LW_EXCLUSIVE);
+
+ /*
+ * If we're going to reset everything, then no need to open or parse the
+ * old file. We'll just write out an empty list.
+ */
+ if (!resetall)
+ {
+ struct stat st;
+
+ if (stat(AutoConfFileName, &st) == 0)
+ {
+ /* open old file PG_AUTOCONF_FILENAME */
+ FILE *infile;
+
+ infile = AllocateFile(AutoConfFileName, "r");
+ if (infile == NULL)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ AutoConfFileName)));
+
+ /* parse it */
+ if (!ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail))
+ ereport(ERROR,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("could not parse contents of file \"%s\"",
+ AutoConfFileName)));
+
+ FreeFile(infile);
+ }
+
+ /*
+ * Now, replace any existing entry with the new value, or add it if
+ * not present.
+ */
+ replace_auto_config_value(&head, &tail, name, value);
+ }
+
+ /*
+ * Invoke the post-alter hook for setting this GUC variable. GUCs
+ * typically do not have corresponding entries in pg_parameter_acl, so we
+ * call the hook using the name rather than a potentially-non-existent
+ * OID. Nonetheless, we pass ParameterAclRelationId so that this call
+ * context can be distinguished from others. (Note that "name" will be
+ * NULL in the RESET ALL case.)
+ *
+ * We do this here rather than at the end, because ALTER SYSTEM is not
+ * transactional. If the hook aborts our transaction, it will be cleaner
+ * to do so before we touch any files.
+ */
+ InvokeObjectPostAlterHookArgStr(ParameterAclRelationId, name,
+ ACL_ALTER_SYSTEM,
+ altersysstmt->setstmt->kind,
+ false);
+
+ /*
+ * To ensure crash safety, first write the new file data to a temp file,
+ * then atomically rename it into place.
+ *
+ * If there is a temp file left over due to a previous crash, it's okay to
+ * truncate and reuse it.
+ */
+ Tmpfd = BasicOpenFile(AutoConfTmpFileName,
+ O_CREAT | O_RDWR | O_TRUNC);
+ if (Tmpfd < 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ AutoConfTmpFileName)));
+
+ /*
+ * Use a TRY block to clean up the file if we fail. Since we need a TRY
+ * block anyway, OK to use BasicOpenFile rather than OpenTransientFile.
+ */
+ PG_TRY();
+ {
+ /* Write and sync the new contents to the temporary file */
+ write_auto_conf_file(Tmpfd, AutoConfTmpFileName, head);
+
+ /* Close before renaming; may be required on some platforms */
+ close(Tmpfd);
+ Tmpfd = -1;
+
+ /*
+ * As the rename is atomic operation, if any problem occurs after this
+ * at worst it can lose the parameters set by last ALTER SYSTEM
+ * command.
+ */
+ durable_rename(AutoConfTmpFileName, AutoConfFileName, ERROR);
+ }
+ PG_CATCH();
+ {
+ /* Close file first, else unlink might fail on some platforms */
+ if (Tmpfd >= 0)
+ close(Tmpfd);
+
+ /* Unlink, but ignore any error */
+ (void) unlink(AutoConfTmpFileName);
+
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ FreeConfigVariables(head);
+
+ LWLockRelease(AutoFileLock);
+}
+
+/*
+ * SET command
+ */
+void
+ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel)
+{
+ GucAction action = stmt->is_local ? GUC_ACTION_LOCAL : GUC_ACTION_SET;
+
+ /*
+ * Workers synchronize these parameters at the start of the parallel
+ * operation; then, we block SET during the operation.
+ */
+ if (IsInParallelMode())
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
+ errmsg("cannot set parameters during a parallel operation")));
+
+ switch (stmt->kind)
+ {
+ case VAR_SET_VALUE:
+ case VAR_SET_CURRENT:
+ if (stmt->is_local)
+ WarnNoTransactionBlock(isTopLevel, "SET LOCAL");
+ (void) set_config_option(stmt->name,
+ ExtractSetVariableArgs(stmt),
+ (superuser() ? PGC_SUSET : PGC_USERSET),
+ PGC_S_SESSION,
+ action, true, 0, false);
+ break;
+ case VAR_SET_MULTI:
+
+ /*
+ * Special-case SQL syntaxes. The TRANSACTION and SESSION
+ * CHARACTERISTICS cases effectively set more than one variable
+ * per statement. TRANSACTION SNAPSHOT only takes one argument,
+ * but we put it here anyway since it's a special case and not
+ * related to any GUC variable.
+ */
+ if (strcmp(stmt->name, "TRANSACTION") == 0)
+ {
+ ListCell *head;
+
+ WarnNoTransactionBlock(isTopLevel, "SET TRANSACTION");
+
+ foreach(head, stmt->args)
+ {
+ DefElem *item = (DefElem *) lfirst(head);
+
+ if (strcmp(item->defname, "transaction_isolation") == 0)
+ SetPGVariable("transaction_isolation",
+ list_make1(item->arg), stmt->is_local);
+ else if (strcmp(item->defname, "transaction_read_only") == 0)
+ SetPGVariable("transaction_read_only",
+ list_make1(item->arg), stmt->is_local);
+ else if (strcmp(item->defname, "transaction_deferrable") == 0)
+ SetPGVariable("transaction_deferrable",
+ list_make1(item->arg), stmt->is_local);
+ else
+ elog(ERROR, "unexpected SET TRANSACTION element: %s",
+ item->defname);
+ }
+ }
+ else if (strcmp(stmt->name, "SESSION CHARACTERISTICS") == 0)
+ {
+ ListCell *head;
+
+ foreach(head, stmt->args)
+ {
+ DefElem *item = (DefElem *) lfirst(head);
+
+ if (strcmp(item->defname, "transaction_isolation") == 0)
+ SetPGVariable("default_transaction_isolation",
+ list_make1(item->arg), stmt->is_local);
+ else if (strcmp(item->defname, "transaction_read_only") == 0)
+ SetPGVariable("default_transaction_read_only",
+ list_make1(item->arg), stmt->is_local);
+ else if (strcmp(item->defname, "transaction_deferrable") == 0)
+ SetPGVariable("default_transaction_deferrable",
+ list_make1(item->arg), stmt->is_local);
+ else
+ elog(ERROR, "unexpected SET SESSION element: %s",
+ item->defname);
+ }
+ }
+ else if (strcmp(stmt->name, "TRANSACTION SNAPSHOT") == 0)
+ {
+ A_Const *con = linitial_node(A_Const, stmt->args);
+
+ if (stmt->is_local)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("SET LOCAL TRANSACTION SNAPSHOT is not implemented")));
+
+ WarnNoTransactionBlock(isTopLevel, "SET TRANSACTION");
+ ImportSnapshot(strVal(&con->val));
+ }
+ else
+ elog(ERROR, "unexpected SET MULTI element: %s",
+ stmt->name);
+ break;
+ case VAR_SET_DEFAULT:
+ if (stmt->is_local)
+ WarnNoTransactionBlock(isTopLevel, "SET LOCAL");
+ /* fall through */
+ case VAR_RESET:
+ if (strcmp(stmt->name, "transaction_isolation") == 0)
+ WarnNoTransactionBlock(isTopLevel, "RESET TRANSACTION");
+
+ (void) set_config_option(stmt->name,
+ NULL,
+ (superuser() ? PGC_SUSET : PGC_USERSET),
+ PGC_S_SESSION,
+ action, true, 0, false);
+ break;
+ case VAR_RESET_ALL:
+ ResetAllOptions();
+ break;
+ }
+
+ /* Invoke the post-alter hook for setting this GUC variable, by name. */
+ InvokeObjectPostAlterHookArgStr(ParameterAclRelationId, stmt->name,
+ ACL_SET, stmt->kind, false);
+}
+
+/*
+ * Get the value to assign for a VariableSetStmt, or NULL if it's RESET.
+ * The result is palloc'd.
+ *
+ * This is exported for use by actions such as ALTER ROLE SET.
+ */
+char *
+ExtractSetVariableArgs(VariableSetStmt *stmt)
+{
+ switch (stmt->kind)
+ {
+ case VAR_SET_VALUE:
+ return flatten_set_variable_args(stmt->name, stmt->args);
+ case VAR_SET_CURRENT:
+ return GetConfigOptionByName(stmt->name, NULL, false);
+ default:
+ return NULL;
+ }
+}
+
+/*
+ * SetPGVariable - SET command exported as an easily-C-callable function.
+ *
+ * This provides access to SET TO value, as well as SET TO DEFAULT (expressed
+ * by passing args == NIL), but not SET FROM CURRENT functionality.
+ */
+void
+SetPGVariable(const char *name, List *args, bool is_local)
+{
+ char *argstring = flatten_set_variable_args(name, args);
+
+ /* Note SET DEFAULT (argstring == NULL) is equivalent to RESET */
+ (void) set_config_option(name,
+ argstring,
+ (superuser() ? PGC_SUSET : PGC_USERSET),
+ PGC_S_SESSION,
+ is_local ? GUC_ACTION_LOCAL : GUC_ACTION_SET,
+ true, 0, false);
+}
+
+/*
+ * SET command wrapped as a SQL callable function.
+ */
+Datum
+set_config_by_name(PG_FUNCTION_ARGS)
+{
+ char *name;
+ char *value;
+ char *new_value;
+ bool is_local;
+
+ if (PG_ARGISNULL(0))
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("SET requires parameter name")));
+
+ /* Get the GUC variable name */
+ name = TextDatumGetCString(PG_GETARG_DATUM(0));
+
+ /* Get the desired value or set to NULL for a reset request */
+ if (PG_ARGISNULL(1))
+ value = NULL;
+ else
+ value = TextDatumGetCString(PG_GETARG_DATUM(1));
+
+ /*
+ * Get the desired state of is_local. Default to false if provided value
+ * is NULL
+ */
+ if (PG_ARGISNULL(2))
+ is_local = false;
+ else
+ is_local = PG_GETARG_BOOL(2);
+
+ /* Note SET DEFAULT (argstring == NULL) is equivalent to RESET */
+ (void) set_config_option(name,
+ value,
+ (superuser() ? PGC_SUSET : PGC_USERSET),
+ PGC_S_SESSION,
+ is_local ? GUC_ACTION_LOCAL : GUC_ACTION_SET,
+ true, 0, false);
+
+ /* get the new current value */
+ new_value = GetConfigOptionByName(name, NULL, false);
+
+ /* Convert return string to text */
+ PG_RETURN_TEXT_P(cstring_to_text(new_value));
+}
+
+
+/*
+ * Common code for DefineCustomXXXVariable subroutines: allocate the
+ * new variable's config struct and fill in generic fields.
+ */
+static struct config_generic *
+init_custom_variable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ GucContext context,
+ int flags,
+ enum config_type type,
+ size_t sz)
+{
+ struct config_generic *gen;
+
+ /*
+ * Only allow custom PGC_POSTMASTER variables to be created during shared
+ * library preload; any later than that, we can't ensure that the value
+ * doesn't change after startup. This is a fatal elog if it happens; just
+ * erroring out isn't safe because we don't know what the calling loadable
+ * module might already have hooked into.
+ */
+ if (context == PGC_POSTMASTER &&
+ !process_shared_preload_libraries_in_progress)
+ elog(FATAL, "cannot create PGC_POSTMASTER variables after startup");
+
+ /*
+ * We can't support custom GUC_LIST_QUOTE variables, because the wrong
+ * things would happen if such a variable were set or pg_dump'd when the
+ * defining extension isn't loaded. Again, treat this as fatal because
+ * the loadable module may be partly initialized already.
+ */
+ if (flags & GUC_LIST_QUOTE)
+ elog(FATAL, "extensions cannot define GUC_LIST_QUOTE variables");
+
+ /*
+ * Before pljava commit 398f3b876ed402bdaec8bc804f29e2be95c75139
+ * (2015-12-15), two of that module's PGC_USERSET variables facilitated
+ * trivial escalation to superuser privileges. Restrict the variables to
+ * protect sites that have yet to upgrade pljava.
+ */
+ if (context == PGC_USERSET &&
+ (strcmp(name, "pljava.classpath") == 0 ||
+ strcmp(name, "pljava.vmoptions") == 0))
+ context = PGC_SUSET;
+
+ gen = (struct config_generic *) guc_malloc(ERROR, sz);
+ memset(gen, 0, sz);
+
+ gen->name = guc_strdup(ERROR, name);
+ gen->context = context;
+ gen->group = CUSTOM_OPTIONS;
+ gen->short_desc = short_desc;
+ gen->long_desc = long_desc;
+ gen->flags = flags;
+ gen->vartype = type;
+
+ return gen;
+}
+
+/*
+ * Common code for DefineCustomXXXVariable subroutines: insert the new
+ * variable into the GUC variable array, replacing any placeholder.
+ */
+static void
+define_custom_variable(struct config_generic *variable)
+{
+ const char *name = variable->name;
+ const char **nameAddr = &name;
+ struct config_string *pHolder;
+ struct config_generic **res;
+
+ /*
+ * See if there's a placeholder by the same name.
+ */
+ res = (struct config_generic **) bsearch((void *) &nameAddr,
+ (void *) guc_variables,
+ num_guc_variables,
+ sizeof(struct config_generic *),
+ guc_var_compare);
+ if (res == NULL)
+ {
+ /*
+ * No placeholder to replace, so we can just add it ... but first,
+ * make sure it's initialized to its default value.
+ */
+ InitializeOneGUCOption(variable);
+ add_guc_variable(variable, ERROR);
+ return;
+ }
+
+ /*
+ * This better be a placeholder
+ */
+ if (((*res)->flags & GUC_CUSTOM_PLACEHOLDER) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("attempt to redefine parameter \"%s\"", name)));
+
+ Assert((*res)->vartype == PGC_STRING);
+ pHolder = (struct config_string *) (*res);
+
+ /*
+ * First, set the variable to its default value. We must do this even
+ * though we intend to immediately apply a new value, since it's possible
+ * that the new value is invalid.
+ */
+ InitializeOneGUCOption(variable);
+
+ /*
+ * Replace the placeholder. We aren't changing the name, so no re-sorting
+ * is necessary
+ */
+ *res = variable;
+
+ /*
+ * Assign the string value(s) stored in the placeholder to the real
+ * variable. Essentially, we need to duplicate all the active and stacked
+ * values, but with appropriate validation and datatype adjustment.
+ *
+ * If an assignment fails, we report a WARNING and keep going. We don't
+ * want to throw ERROR for bad values, because it'd bollix the add-on
+ * module that's presumably halfway through getting loaded. In such cases
+ * the default or previous state will become active instead.
+ */
+
+ /* First, apply the reset value if any */
+ if (pHolder->reset_val)
+ (void) set_config_option_ext(name, pHolder->reset_val,
+ pHolder->gen.reset_scontext,
+ pHolder->gen.reset_source,
+ pHolder->gen.reset_srole,
+ GUC_ACTION_SET, true, WARNING, false);
+ /* That should not have resulted in stacking anything */
+ Assert(variable->stack == NULL);
+
+ /* Now, apply current and stacked values, in the order they were stacked */
+ reapply_stacked_values(variable, pHolder, pHolder->gen.stack,
+ *(pHolder->variable),
+ pHolder->gen.scontext, pHolder->gen.source,
+ pHolder->gen.srole);
+
+ /* Also copy over any saved source-location information */
+ if (pHolder->gen.sourcefile)
+ set_config_sourcefile(name, pHolder->gen.sourcefile,
+ pHolder->gen.sourceline);
+
+ /*
+ * Free up as much as we conveniently can of the placeholder structure.
+ * (This neglects any stack items, so it's possible for some memory to be
+ * leaked. Since this can only happen once per session per variable, it
+ * doesn't seem worth spending much code on.)
+ */
+ set_string_field(pHolder, pHolder->variable, NULL);
+ set_string_field(pHolder, &pHolder->reset_val, NULL);
+
+ free(pHolder);
+}
+
+/*
+ * Recursive subroutine for define_custom_variable: reapply non-reset values
+ *
+ * We recurse so that the values are applied in the same order as originally.
+ * At each recursion level, apply the upper-level value (passed in) in the
+ * fashion implied by the stack entry.
+ */
+static void
+reapply_stacked_values(struct config_generic *variable,
+ struct config_string *pHolder,
+ GucStack *stack,
+ const char *curvalue,
+ GucContext curscontext, GucSource cursource,
+ Oid cursrole)
+{
+ const char *name = variable->name;
+ GucStack *oldvarstack = variable->stack;
+
+ if (stack != NULL)
+ {
+ /* First, recurse, so that stack items are processed bottom to top */
+ reapply_stacked_values(variable, pHolder, stack->prev,
+ stack->prior.val.stringval,
+ stack->scontext, stack->source, stack->srole);
+
+ /* See how to apply the passed-in value */
+ switch (stack->state)
+ {
+ case GUC_SAVE:
+ (void) set_config_option_ext(name, curvalue,
+ curscontext, cursource, cursrole,
+ GUC_ACTION_SAVE, true,
+ WARNING, false);
+ break;
+
+ case GUC_SET:
+ (void) set_config_option_ext(name, curvalue,
+ curscontext, cursource, cursrole,
+ GUC_ACTION_SET, true,
+ WARNING, false);
+ break;
+
+ case GUC_LOCAL:
+ (void) set_config_option_ext(name, curvalue,
+ curscontext, cursource, cursrole,
+ GUC_ACTION_LOCAL, true,
+ WARNING, false);
+ break;
+
+ case GUC_SET_LOCAL:
+ /* first, apply the masked value as SET */
+ (void) set_config_option_ext(name, stack->masked.val.stringval,
+ stack->masked_scontext,
+ PGC_S_SESSION,
+ stack->masked_srole,
+ GUC_ACTION_SET, true,
+ WARNING, false);
+ /* then apply the current value as LOCAL */
+ (void) set_config_option_ext(name, curvalue,
+ curscontext, cursource, cursrole,
+ GUC_ACTION_LOCAL, true,
+ WARNING, false);
+ break;
+ }
+
+ /* If we successfully made a stack entry, adjust its nest level */
+ if (variable->stack != oldvarstack)
+ variable->stack->nest_level = stack->nest_level;
+ }
+ else
+ {
+ /*
+ * We are at the end of the stack. If the active/previous value is
+ * different from the reset value, it must represent a previously
+ * committed session value. Apply it, and then drop the stack entry
+ * that set_config_option will have created under the impression that
+ * this is to be just a transactional assignment. (We leak the stack
+ * entry.)
+ */
+ if (curvalue != pHolder->reset_val ||
+ curscontext != pHolder->gen.reset_scontext ||
+ cursource != pHolder->gen.reset_source ||
+ cursrole != pHolder->gen.reset_srole)
+ {
+ (void) set_config_option_ext(name, curvalue,
+ curscontext, cursource, cursrole,
+ GUC_ACTION_SET, true, WARNING, false);
+ variable->stack = NULL;
+ }
+ }
+}
+
+/*
+ * Functions for extensions to call to define their custom GUC variables.
+ */
+void
+DefineCustomBoolVariable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ bool *valueAddr,
+ bool bootValue,
+ GucContext context,
+ int flags,
+ GucBoolCheckHook check_hook,
+ GucBoolAssignHook assign_hook,
+ GucShowHook show_hook)
+{
+ struct config_bool *var;
+
+ var = (struct config_bool *)
+ init_custom_variable(name, short_desc, long_desc, context, flags,
+ PGC_BOOL, sizeof(struct config_bool));
+ var->variable = valueAddr;
+ var->boot_val = bootValue;
+ var->reset_val = bootValue;
+ var->check_hook = check_hook;
+ var->assign_hook = assign_hook;
+ var->show_hook = show_hook;
+ define_custom_variable(&var->gen);
+}
+
+void
+DefineCustomIntVariable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ int *valueAddr,
+ int bootValue,
+ int minValue,
+ int maxValue,
+ GucContext context,
+ int flags,
+ GucIntCheckHook check_hook,
+ GucIntAssignHook assign_hook,
+ GucShowHook show_hook)
+{
+ struct config_int *var;
+
+ var = (struct config_int *)
+ init_custom_variable(name, short_desc, long_desc, context, flags,
+ PGC_INT, sizeof(struct config_int));
+ var->variable = valueAddr;
+ var->boot_val = bootValue;
+ var->reset_val = bootValue;
+ var->min = minValue;
+ var->max = maxValue;
+ var->check_hook = check_hook;
+ var->assign_hook = assign_hook;
+ var->show_hook = show_hook;
+ define_custom_variable(&var->gen);
+}
+
+void
+DefineCustomRealVariable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ double *valueAddr,
+ double bootValue,
+ double minValue,
+ double maxValue,
+ GucContext context,
+ int flags,
+ GucRealCheckHook check_hook,
+ GucRealAssignHook assign_hook,
+ GucShowHook show_hook)
+{
+ struct config_real *var;
+
+ var = (struct config_real *)
+ init_custom_variable(name, short_desc, long_desc, context, flags,
+ PGC_REAL, sizeof(struct config_real));
+ var->variable = valueAddr;
+ var->boot_val = bootValue;
+ var->reset_val = bootValue;
+ var->min = minValue;
+ var->max = maxValue;
+ var->check_hook = check_hook;
+ var->assign_hook = assign_hook;
+ var->show_hook = show_hook;
+ define_custom_variable(&var->gen);
+}
+
+void
+DefineCustomStringVariable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ char **valueAddr,
+ const char *bootValue,
+ GucContext context,
+ int flags,
+ GucStringCheckHook check_hook,
+ GucStringAssignHook assign_hook,
+ GucShowHook show_hook)
+{
+ struct config_string *var;
+
+ var = (struct config_string *)
+ init_custom_variable(name, short_desc, long_desc, context, flags,
+ PGC_STRING, sizeof(struct config_string));
+ var->variable = valueAddr;
+ var->boot_val = bootValue;
+ var->check_hook = check_hook;
+ var->assign_hook = assign_hook;
+ var->show_hook = show_hook;
+ define_custom_variable(&var->gen);
+}
+
+void
+DefineCustomEnumVariable(const char *name,
+ const char *short_desc,
+ const char *long_desc,
+ int *valueAddr,
+ int bootValue,
+ const struct config_enum_entry *options,
+ GucContext context,
+ int flags,
+ GucEnumCheckHook check_hook,
+ GucEnumAssignHook assign_hook,
+ GucShowHook show_hook)
+{
+ struct config_enum *var;
+
+ var = (struct config_enum *)
+ init_custom_variable(name, short_desc, long_desc, context, flags,
+ PGC_ENUM, sizeof(struct config_enum));
+ var->variable = valueAddr;
+ var->boot_val = bootValue;
+ var->reset_val = bootValue;
+ var->options = options;
+ var->check_hook = check_hook;
+ var->assign_hook = assign_hook;
+ var->show_hook = show_hook;
+ define_custom_variable(&var->gen);
+}
+
+/*
+ * Mark the given GUC prefix as "reserved".
+ *
+ * This deletes any existing placeholders matching the prefix,
+ * and then prevents new ones from being created.
+ * Extensions should call this after they've defined all of their custom
+ * GUCs, to help catch misspelled config-file entries.
+ */
+void
+MarkGUCPrefixReserved(const char *className)
+{
+ int classLen = strlen(className);
+ int i;
+ MemoryContext oldcontext;
+
+ /*
+ * Check for existing placeholders. We must actually remove invalid
+ * placeholders, else future parallel worker startups will fail. (We
+ * don't bother trying to free associated memory, since this shouldn't
+ * happen often.)
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *var = guc_variables[i];
+
+ if ((var->flags & GUC_CUSTOM_PLACEHOLDER) != 0 &&
+ strncmp(className, var->name, classLen) == 0 &&
+ var->name[classLen] == GUC_QUALIFIER_SEPARATOR)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_INVALID_NAME),
+ errmsg("invalid configuration parameter name \"%s\", removing it",
+ var->name),
+ errdetail("\"%s\" is now a reserved prefix.",
+ className)));
+ num_guc_variables--;
+ memmove(&guc_variables[i], &guc_variables[i + 1],
+ (num_guc_variables - i) * sizeof(struct config_generic *));
+ i--;
+ }
+ }
+
+ /* And remember the name so we can prevent future mistakes. */
+ oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+ reserved_class_prefix = lappend(reserved_class_prefix, pstrdup(className));
+ MemoryContextSwitchTo(oldcontext);
+}
+
+
+/*
+ * SHOW command
+ */
+void
+GetPGVariable(const char *name, DestReceiver *dest)
+{
+ if (guc_name_compare(name, "all") == 0)
+ ShowAllGUCConfig(dest);
+ else
+ ShowGUCConfigOption(name, dest);
+}
+
+TupleDesc
+GetPGVariableResultDesc(const char *name)
+{
+ TupleDesc tupdesc;
+
+ if (guc_name_compare(name, "all") == 0)
+ {
+ /* need a tuple descriptor representing three TEXT columns */
+ tupdesc = CreateTemplateTupleDesc(3);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "setting",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "description",
+ TEXTOID, -1, 0);
+ }
+ else
+ {
+ const char *varname;
+
+ /* Get the canonical spelling of name */
+ (void) GetConfigOptionByName(name, &varname, false);
+
+ /* need a tuple descriptor representing a single TEXT column */
+ tupdesc = CreateTemplateTupleDesc(1);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, varname,
+ TEXTOID, -1, 0);
+ }
+ return tupdesc;
+}
+
+
+/*
+ * SHOW command
+ */
+static void
+ShowGUCConfigOption(const char *name, DestReceiver *dest)
+{
+ TupOutputState *tstate;
+ TupleDesc tupdesc;
+ const char *varname;
+ char *value;
+
+ /* Get the value and canonical spelling of name */
+ value = GetConfigOptionByName(name, &varname, false);
+
+ /* need a tuple descriptor representing a single TEXT column */
+ tupdesc = CreateTemplateTupleDesc(1);
+ TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 1, varname,
+ TEXTOID, -1, 0);
+
+ /* prepare for projection of tuples */
+ tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsVirtual);
+
+ /* Send it */
+ do_text_output_oneline(tstate, value);
+
+ end_tup_output(tstate);
+}
+
+/*
+ * SHOW ALL command
+ */
+static void
+ShowAllGUCConfig(DestReceiver *dest)
+{
+ int i;
+ TupOutputState *tstate;
+ TupleDesc tupdesc;
+ Datum values[3];
+ bool isnull[3] = {false, false, false};
+
+ /* need a tuple descriptor representing three TEXT columns */
+ tupdesc = CreateTemplateTupleDesc(3);
+ TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 1, "name",
+ TEXTOID, -1, 0);
+ TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 2, "setting",
+ TEXTOID, -1, 0);
+ TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 3, "description",
+ TEXTOID, -1, 0);
+
+ /* prepare for projection of tuples */
+ tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsVirtual);
+
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *conf = guc_variables[i];
+ char *setting;
+
+ if ((conf->flags & GUC_NO_SHOW_ALL) ||
+ ((conf->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)))
+ continue;
+
+ /* assign to the values array */
+ values[0] = PointerGetDatum(cstring_to_text(conf->name));
+
+ setting = _ShowOption(conf, true);
+ if (setting)
+ {
+ values[1] = PointerGetDatum(cstring_to_text(setting));
+ isnull[1] = false;
+ }
+ else
+ {
+ values[1] = PointerGetDatum(NULL);
+ isnull[1] = true;
+ }
+
+ if (conf->short_desc)
+ {
+ values[2] = PointerGetDatum(cstring_to_text(conf->short_desc));
+ isnull[2] = false;
+ }
+ else
+ {
+ values[2] = PointerGetDatum(NULL);
+ isnull[2] = true;
+ }
+
+ /* send it to dest */
+ do_tup_output(tstate, values, isnull);
+
+ /* clean up */
+ pfree(DatumGetPointer(values[0]));
+ if (setting)
+ {
+ pfree(setting);
+ pfree(DatumGetPointer(values[1]));
+ }
+ if (conf->short_desc)
+ pfree(DatumGetPointer(values[2]));
+ }
+
+ end_tup_output(tstate);
+}
+
+/*
+ * Return an array of modified GUC options to show in EXPLAIN.
+ *
+ * We only report options related to query planning (marked with GUC_EXPLAIN),
+ * with values different from their built-in defaults.
+ */
+struct config_generic **
+get_explain_guc_options(int *num)
+{
+ struct config_generic **result;
+
+ *num = 0;
+
+ /*
+ * While only a fraction of all the GUC variables are marked GUC_EXPLAIN,
+ * it doesn't seem worth dynamically resizing this array.
+ */
+ result = palloc(sizeof(struct config_generic *) * num_guc_variables);
+
+ for (int i = 0; i < num_guc_variables; i++)
+ {
+ bool modified;
+ struct config_generic *conf = guc_variables[i];
+
+ /* return only parameters marked for inclusion in explain */
+ if (!(conf->flags & GUC_EXPLAIN))
+ continue;
+
+ /* return only options visible to the current user */
+ if ((conf->flags & GUC_NO_SHOW_ALL) ||
+ ((conf->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)))
+ continue;
+
+ /* return only options that are different from their boot values */
+ modified = false;
+
+ switch (conf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *lconf = (struct config_bool *) conf;
+
+ modified = (lconf->boot_val != *(lconf->variable));
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *lconf = (struct config_int *) conf;
+
+ modified = (lconf->boot_val != *(lconf->variable));
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *lconf = (struct config_real *) conf;
+
+ modified = (lconf->boot_val != *(lconf->variable));
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *lconf = (struct config_string *) conf;
+
+ if (lconf->boot_val == NULL &&
+ *lconf->variable == NULL)
+ modified = false;
+ else if (lconf->boot_val == NULL ||
+ *lconf->variable == NULL)
+ modified = true;
+ else
+ modified = (strcmp(lconf->boot_val, *(lconf->variable)) != 0);
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *lconf = (struct config_enum *) conf;
+
+ modified = (lconf->boot_val != *(lconf->variable));
+ }
+ break;
+
+ default:
+ elog(ERROR, "unexpected GUC type: %d", conf->vartype);
+ }
+
+ if (!modified)
+ continue;
+
+ /* OK, report it */
+ result[*num] = conf;
+ *num = *num + 1;
+ }
+
+ return result;
+}
+
+/*
+ * Return GUC variable value by name; optionally return canonical form of
+ * name. If the GUC is unset, then throw an error unless missing_ok is true,
+ * in which case return NULL. Return value is palloc'd (but *varname isn't).
+ */
+char *
+GetConfigOptionByName(const char *name, const char **varname, bool missing_ok)
+{
+ struct config_generic *record;
+
+ record = find_option(name, false, missing_ok, ERROR);
+ if (record == NULL)
+ {
+ if (varname)
+ *varname = NULL;
+ return NULL;
+ }
+
+ if ((record->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser or have privileges of pg_read_all_settings to examine \"%s\"",
+ name)));
+
+ if (varname)
+ *varname = record->name;
+
+ return _ShowOption(record, true);
+}
+
+/*
+ * Return some of the flags associated to the specified GUC in the shape of
+ * a text array, and NULL if it does not exist. An empty array is returned
+ * if the GUC exists without any meaningful flags to show.
+ */
+Datum
+pg_settings_get_flags(PG_FUNCTION_ARGS)
+{
+#define MAX_GUC_FLAGS 5
+ char *varname = TextDatumGetCString(PG_GETARG_DATUM(0));
+ struct config_generic *record;
+ int cnt = 0;
+ Datum flags[MAX_GUC_FLAGS];
+ ArrayType *a;
+
+ record = find_option(varname, false, true, ERROR);
+
+ /* return NULL if no such variable */
+ if (record == NULL)
+ PG_RETURN_NULL();
+
+ if (record->flags & GUC_EXPLAIN)
+ flags[cnt++] = CStringGetTextDatum("EXPLAIN");
+ if (record->flags & GUC_NO_RESET_ALL)
+ flags[cnt++] = CStringGetTextDatum("NO_RESET_ALL");
+ if (record->flags & GUC_NO_SHOW_ALL)
+ flags[cnt++] = CStringGetTextDatum("NO_SHOW_ALL");
+ if (record->flags & GUC_NOT_IN_SAMPLE)
+ flags[cnt++] = CStringGetTextDatum("NOT_IN_SAMPLE");
+ if (record->flags & GUC_RUNTIME_COMPUTED)
+ flags[cnt++] = CStringGetTextDatum("RUNTIME_COMPUTED");
+
+ Assert(cnt <= MAX_GUC_FLAGS);
+
+ /* Returns the record as Datum */
+ a = construct_array(flags, cnt, TEXTOID, -1, false, TYPALIGN_INT);
+ PG_RETURN_ARRAYTYPE_P(a);
+}
+
+/*
+ * Return GUC variable value by variable number; optionally return canonical
+ * form of name. Return value is palloc'd.
+ */
+void
+GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
+{
+ char buffer[256];
+ struct config_generic *conf;
+
+ /* check requested variable number valid */
+ Assert((varnum >= 0) && (varnum < num_guc_variables));
+
+ conf = guc_variables[varnum];
+
+ if (noshow)
+ {
+ if ((conf->flags & GUC_NO_SHOW_ALL) ||
+ ((conf->flags & GUC_SUPERUSER_ONLY) &&
+ !has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS)))
+ *noshow = true;
+ else
+ *noshow = false;
+ }
+
+ /* first get the generic attributes */
+
+ /* name */
+ values[0] = conf->name;
+
+ /* setting: use _ShowOption in order to avoid duplicating the logic */
+ values[1] = _ShowOption(conf, false);
+
+ /* unit, if any (NULL is fine) */
+ values[2] = get_config_unit_name(conf->flags);
+
+ /* group */
+ values[3] = _(config_group_names[conf->group]);
+
+ /* short_desc */
+ values[4] = conf->short_desc != NULL ? _(conf->short_desc) : NULL;
+
+ /* extra_desc */
+ values[5] = conf->long_desc != NULL ? _(conf->long_desc) : NULL;
+
+ /* context */
+ values[6] = GucContext_Names[conf->context];
+
+ /* vartype */
+ values[7] = config_type_names[conf->vartype];
+
+ /* source */
+ values[8] = GucSource_Names[conf->source];
+
+ /* now get the type specific attributes */
+ switch (conf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *lconf = (struct config_bool *) conf;
+
+ /* min_val */
+ values[9] = NULL;
+
+ /* max_val */
+ values[10] = NULL;
+
+ /* enumvals */
+ values[11] = NULL;
+
+ /* boot_val */
+ values[12] = pstrdup(lconf->boot_val ? "on" : "off");
+
+ /* reset_val */
+ values[13] = pstrdup(lconf->reset_val ? "on" : "off");
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *lconf = (struct config_int *) conf;
+
+ /* min_val */
+ snprintf(buffer, sizeof(buffer), "%d", lconf->min);
+ values[9] = pstrdup(buffer);
+
+ /* max_val */
+ snprintf(buffer, sizeof(buffer), "%d", lconf->max);
+ values[10] = pstrdup(buffer);
+
+ /* enumvals */
+ values[11] = NULL;
+
+ /* boot_val */
+ snprintf(buffer, sizeof(buffer), "%d", lconf->boot_val);
+ values[12] = pstrdup(buffer);
+
+ /* reset_val */
+ snprintf(buffer, sizeof(buffer), "%d", lconf->reset_val);
+ values[13] = pstrdup(buffer);
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *lconf = (struct config_real *) conf;
+
+ /* min_val */
+ snprintf(buffer, sizeof(buffer), "%g", lconf->min);
+ values[9] = pstrdup(buffer);
+
+ /* max_val */
+ snprintf(buffer, sizeof(buffer), "%g", lconf->max);
+ values[10] = pstrdup(buffer);
+
+ /* enumvals */
+ values[11] = NULL;
+
+ /* boot_val */
+ snprintf(buffer, sizeof(buffer), "%g", lconf->boot_val);
+ values[12] = pstrdup(buffer);
+
+ /* reset_val */
+ snprintf(buffer, sizeof(buffer), "%g", lconf->reset_val);
+ values[13] = pstrdup(buffer);
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *lconf = (struct config_string *) conf;
+
+ /* min_val */
+ values[9] = NULL;
+
+ /* max_val */
+ values[10] = NULL;
+
+ /* enumvals */
+ values[11] = NULL;
+
+ /* boot_val */
+ if (lconf->boot_val == NULL)
+ values[12] = NULL;
+ else
+ values[12] = pstrdup(lconf->boot_val);
+
+ /* reset_val */
+ if (lconf->reset_val == NULL)
+ values[13] = NULL;
+ else
+ values[13] = pstrdup(lconf->reset_val);
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *lconf = (struct config_enum *) conf;
+
+ /* min_val */
+ values[9] = NULL;
+
+ /* max_val */
+ values[10] = NULL;
+
+ /* enumvals */
+
+ /*
+ * NOTE! enumvals with double quotes in them are not
+ * supported!
+ */
+ values[11] = config_enum_get_options((struct config_enum *) conf,
+ "{\"", "\"}", "\",\"");
+
+ /* boot_val */
+ values[12] = pstrdup(config_enum_lookup_by_value(lconf,
+ lconf->boot_val));
+
+ /* reset_val */
+ values[13] = pstrdup(config_enum_lookup_by_value(lconf,
+ lconf->reset_val));
+ }
+ break;
+
+ default:
+ {
+ /*
+ * should never get here, but in case we do, set 'em to NULL
+ */
+
+ /* min_val */
+ values[9] = NULL;
+
+ /* max_val */
+ values[10] = NULL;
+
+ /* enumvals */
+ values[11] = NULL;
+
+ /* boot_val */
+ values[12] = NULL;
+
+ /* reset_val */
+ values[13] = NULL;
+ }
+ break;
+ }
+
+ /*
+ * If the setting came from a config file, set the source location. For
+ * security reasons, we don't show source file/line number for
+ * insufficiently-privileged users.
+ */
+ if (conf->source == PGC_S_FILE &&
+ has_privs_of_role(GetUserId(), ROLE_PG_READ_ALL_SETTINGS))
+ {
+ values[14] = conf->sourcefile;
+ snprintf(buffer, sizeof(buffer), "%d", conf->sourceline);
+ values[15] = pstrdup(buffer);
+ }
+ else
+ {
+ values[14] = NULL;
+ values[15] = NULL;
+ }
+
+ values[16] = (conf->status & GUC_PENDING_RESTART) ? "t" : "f";
+}
+
+/*
+ * Return the total number of GUC variables
+ */
+int
+GetNumConfigOptions(void)
+{
+ return num_guc_variables;
+}
+
+/*
+ * show_config_by_name - equiv to SHOW X command but implemented as
+ * a function.
+ */
+Datum
+show_config_by_name(PG_FUNCTION_ARGS)
+{
+ char *varname = TextDatumGetCString(PG_GETARG_DATUM(0));
+ char *varval;
+
+ /* Get the value */
+ varval = GetConfigOptionByName(varname, NULL, false);
+
+ /* Convert to text */
+ PG_RETURN_TEXT_P(cstring_to_text(varval));
+}
+
+/*
+ * show_config_by_name_missing_ok - equiv to SHOW X command but implemented as
+ * a function. If X does not exist, suppress the error and just return NULL
+ * if missing_ok is true.
+ */
+Datum
+show_config_by_name_missing_ok(PG_FUNCTION_ARGS)
+{
+ char *varname = TextDatumGetCString(PG_GETARG_DATUM(0));
+ bool missing_ok = PG_GETARG_BOOL(1);
+ char *varval;
+
+ /* Get the value */
+ varval = GetConfigOptionByName(varname, NULL, missing_ok);
+
+ /* return NULL if no such variable */
+ if (varval == NULL)
+ PG_RETURN_NULL();
+
+ /* Convert to text */
+ PG_RETURN_TEXT_P(cstring_to_text(varval));
+}
+
+/*
+ * show_all_settings - equiv to SHOW ALL command but implemented as
+ * a Table Function.
+ */
+#define NUM_PG_SETTINGS_ATTS 17
+
+Datum
+show_all_settings(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ TupleDesc tupdesc;
+ int call_cntr;
+ int max_calls;
+ AttInMetadata *attinmeta;
+ MemoryContext oldcontext;
+
+ /* stuff done only on the first call of the function */
+ if (SRF_IS_FIRSTCALL())
+ {
+ /* create a function context for cross-call persistence */
+ funcctx = SRF_FIRSTCALL_INIT();
+
+ /*
+ * switch to memory context appropriate for multiple function calls
+ */
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ /*
+ * need a tuple descriptor representing NUM_PG_SETTINGS_ATTS columns
+ * of the appropriate types
+ */
+ tupdesc = CreateTemplateTupleDesc(NUM_PG_SETTINGS_ATTS);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "setting",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "unit",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "category",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "short_desc",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "extra_desc",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "context",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "vartype",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "source",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "min_val",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 11, "max_val",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
+ TEXTARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 15, "sourcefile",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 16, "sourceline",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 17, "pending_restart",
+ BOOLOID, -1, 0);
+
+ /*
+ * Generate attribute metadata needed later to produce tuples from raw
+ * C strings
+ */
+ attinmeta = TupleDescGetAttInMetadata(tupdesc);
+ funcctx->attinmeta = attinmeta;
+
+ /* total number of tuples to be returned */
+ funcctx->max_calls = GetNumConfigOptions();
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ call_cntr = funcctx->call_cntr;
+ max_calls = funcctx->max_calls;
+ attinmeta = funcctx->attinmeta;
+
+ if (call_cntr < max_calls) /* do when there is more left to send */
+ {
+ char *values[NUM_PG_SETTINGS_ATTS];
+ bool noshow;
+ HeapTuple tuple;
+ Datum result;
+
+ /*
+ * Get the next visible GUC variable name and value
+ */
+ do
+ {
+ GetConfigOptionByNum(call_cntr, (const char **) values, &noshow);
+ if (noshow)
+ {
+ /* bump the counter and get the next config setting */
+ call_cntr = ++funcctx->call_cntr;
+
+ /* make sure we haven't gone too far now */
+ if (call_cntr >= max_calls)
+ SRF_RETURN_DONE(funcctx);
+ }
+ } while (noshow);
+
+ /* build a tuple */
+ tuple = BuildTupleFromCStrings(attinmeta, values);
+
+ /* make the tuple into a datum */
+ result = HeapTupleGetDatum(tuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+ }
+ else
+ {
+ /* do when there is no more left */
+ SRF_RETURN_DONE(funcctx);
+ }
+}
+
+/*
+ * show_all_file_settings
+ *
+ * Returns a table of all parameter settings in all configuration files
+ * which includes the config file pathname, the line number, a sequence number
+ * indicating the order in which the settings were encountered, the parameter
+ * name and value, a bool showing if the value could be applied, and possibly
+ * an associated error message. (For problems such as syntax errors, the
+ * parameter name/value might be NULL.)
+ *
+ * Note: no filtering is done here, instead we depend on the GRANT system
+ * to prevent unprivileged users from accessing this function or the view
+ * built on top of it.
+ */
+Datum
+show_all_file_settings(PG_FUNCTION_ARGS)
+{
+#define NUM_PG_FILE_SETTINGS_ATTS 7
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ ConfigVariable *conf;
+ int seqno;
+
+ /* Scan the config files using current context as workspace */
+ conf = ProcessConfigFileInternal(PGC_SIGHUP, false, DEBUG3);
+
+ /* Build a tuplestore to return our results in */
+ InitMaterializedSRF(fcinfo, 0);
+
+ /* Process the results and create a tuplestore */
+ for (seqno = 1; conf != NULL; conf = conf->next, seqno++)
+ {
+ Datum values[NUM_PG_FILE_SETTINGS_ATTS];
+ bool nulls[NUM_PG_FILE_SETTINGS_ATTS];
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
+
+ /* sourcefile */
+ if (conf->filename)
+ values[0] = PointerGetDatum(cstring_to_text(conf->filename));
+ else
+ nulls[0] = true;
+
+ /* sourceline (not meaningful if no sourcefile) */
+ if (conf->filename)
+ values[1] = Int32GetDatum(conf->sourceline);
+ else
+ nulls[1] = true;
+
+ /* seqno */
+ values[2] = Int32GetDatum(seqno);
+
+ /* name */
+ if (conf->name)
+ values[3] = PointerGetDatum(cstring_to_text(conf->name));
+ else
+ nulls[3] = true;
+
+ /* setting */
+ if (conf->value)
+ values[4] = PointerGetDatum(cstring_to_text(conf->value));
+ else
+ nulls[4] = true;
+
+ /* applied */
+ values[5] = BoolGetDatum(conf->applied);
+
+ /* error */
+ if (conf->errmsg)
+ values[6] = PointerGetDatum(cstring_to_text(conf->errmsg));
+ else
+ nulls[6] = true;
+
+ /* shove row into tuplestore */
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ return (Datum) 0;
+}
+
+static char *
+_ShowOption(struct config_generic *record, bool use_units)
+{
+ char buffer[256];
+ const char *val;
+
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) record;
+
+ if (conf->show_hook)
+ val = conf->show_hook();
+ else
+ val = *conf->variable ? "on" : "off";
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) record;
+
+ if (conf->show_hook)
+ val = conf->show_hook();
+ else
+ {
+ /*
+ * Use int64 arithmetic to avoid overflows in units
+ * conversion.
+ */
+ int64 result = *conf->variable;
+ const char *unit;
+
+ if (use_units && result > 0 && (record->flags & GUC_UNIT))
+ convert_int_from_base_unit(result,
+ record->flags & GUC_UNIT,
+ &result, &unit);
+ else
+ unit = "";
+
+ snprintf(buffer, sizeof(buffer), INT64_FORMAT "%s",
+ result, unit);
+ val = buffer;
+ }
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) record;
+
+ if (conf->show_hook)
+ val = conf->show_hook();
+ else
+ {
+ double result = *conf->variable;
+ const char *unit;
+
+ if (use_units && result > 0 && (record->flags & GUC_UNIT))
+ convert_real_from_base_unit(result,
+ record->flags & GUC_UNIT,
+ &result, &unit);
+ else
+ unit = "";
+
+ snprintf(buffer, sizeof(buffer), "%g%s",
+ result, unit);
+ val = buffer;
+ }
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) record;
+
+ if (conf->show_hook)
+ val = conf->show_hook();
+ else if (*conf->variable && **conf->variable)
+ val = *conf->variable;
+ else
+ val = "";
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) record;
+
+ if (conf->show_hook)
+ val = conf->show_hook();
+ else
+ val = config_enum_lookup_by_value(conf, *conf->variable);
+ }
+ break;
+
+ default:
+ /* just to keep compiler quiet */
+ val = "???";
+ break;
+ }
+
+ return pstrdup(val);
+}
+
+
+#ifdef EXEC_BACKEND
+
+/*
+ * These routines dump out all non-default GUC options into a binary
+ * file that is read by all exec'ed backends. The format is:
+ *
+ * variable name, string, null terminated
+ * variable value, string, null terminated
+ * variable sourcefile, string, null terminated (empty if none)
+ * variable sourceline, integer
+ * variable source, integer
+ * variable scontext, integer
+* variable srole, OID
+ */
+static void
+write_one_nondefault_variable(FILE *fp, struct config_generic *gconf)
+{
+ if (gconf->source == PGC_S_DEFAULT)
+ return;
+
+ fprintf(fp, "%s", gconf->name);
+ fputc(0, fp);
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+
+ if (*conf->variable)
+ fprintf(fp, "true");
+ else
+ fprintf(fp, "false");
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ fprintf(fp, "%d", *conf->variable);
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+
+ fprintf(fp, "%.17g", *conf->variable);
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ if (*conf->variable)
+ fprintf(fp, "%s", *conf->variable);
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ fprintf(fp, "%s",
+ config_enum_lookup_by_value(conf, *conf->variable));
+ }
+ break;
+ }
+
+ fputc(0, fp);
+
+ if (gconf->sourcefile)
+ fprintf(fp, "%s", gconf->sourcefile);
+ fputc(0, fp);
+
+ fwrite(&gconf->sourceline, 1, sizeof(gconf->sourceline), fp);
+ fwrite(&gconf->source, 1, sizeof(gconf->source), fp);
+ fwrite(&gconf->scontext, 1, sizeof(gconf->scontext), fp);
+ fwrite(&gconf->srole, 1, sizeof(gconf->srole), fp);
+}
+
+void
+write_nondefault_variables(GucContext context)
+{
+ int elevel;
+ FILE *fp;
+ int i;
+
+ Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
+
+ elevel = (context == PGC_SIGHUP) ? LOG : ERROR;
+
+ /*
+ * Open file
+ */
+ fp = AllocateFile(CONFIG_EXEC_PARAMS_NEW, "w");
+ if (!fp)
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m",
+ CONFIG_EXEC_PARAMS_NEW)));
+ return;
+ }
+
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ write_one_nondefault_variable(fp, guc_variables[i]);
+ }
+
+ if (FreeFile(fp))
+ {
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m",
+ CONFIG_EXEC_PARAMS_NEW)));
+ return;
+ }
+
+ /*
+ * Put new file in place. This could delay on Win32, but we don't hold
+ * any exclusive locks.
+ */
+ rename(CONFIG_EXEC_PARAMS_NEW, CONFIG_EXEC_PARAMS);
+}
+
+
+/*
+ * Read string, including null byte from file
+ *
+ * Return NULL on EOF and nothing read
+ */
+static char *
+read_string_with_null(FILE *fp)
+{
+ int i = 0,
+ ch,
+ maxlen = 256;
+ char *str = NULL;
+
+ do
+ {
+ if ((ch = fgetc(fp)) == EOF)
+ {
+ if (i == 0)
+ return NULL;
+ else
+ elog(FATAL, "invalid format of exec config params file");
+ }
+ if (i == 0)
+ str = guc_malloc(FATAL, maxlen);
+ else if (i == maxlen)
+ str = guc_realloc(FATAL, str, maxlen *= 2);
+ str[i++] = ch;
+ } while (ch != 0);
+
+ return str;
+}
+
+
+/*
+ * This routine loads a previous postmaster dump of its non-default
+ * settings.
+ */
+void
+read_nondefault_variables(void)
+{
+ FILE *fp;
+ char *varname,
+ *varvalue,
+ *varsourcefile;
+ int varsourceline;
+ GucSource varsource;
+ GucContext varscontext;
+ Oid varsrole;
+
+ /*
+ * Open file
+ */
+ fp = AllocateFile(CONFIG_EXEC_PARAMS, "r");
+ if (!fp)
+ {
+ /* File not found is fine */
+ if (errno != ENOENT)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not read from file \"%s\": %m",
+ CONFIG_EXEC_PARAMS)));
+ return;
+ }
+
+ for (;;)
+ {
+ struct config_generic *record;
+
+ if ((varname = read_string_with_null(fp)) == NULL)
+ break;
+
+ if ((record = find_option(varname, true, false, FATAL)) == NULL)
+ elog(FATAL, "failed to locate variable \"%s\" in exec config params file", varname);
+
+ if ((varvalue = read_string_with_null(fp)) == NULL)
+ elog(FATAL, "invalid format of exec config params file");
+ if ((varsourcefile = read_string_with_null(fp)) == NULL)
+ elog(FATAL, "invalid format of exec config params file");
+ if (fread(&varsourceline, 1, sizeof(varsourceline), fp) != sizeof(varsourceline))
+ elog(FATAL, "invalid format of exec config params file");
+ if (fread(&varsource, 1, sizeof(varsource), fp) != sizeof(varsource))
+ elog(FATAL, "invalid format of exec config params file");
+ if (fread(&varscontext, 1, sizeof(varscontext), fp) != sizeof(varscontext))
+ elog(FATAL, "invalid format of exec config params file");
+ if (fread(&varsrole, 1, sizeof(varsrole), fp) != sizeof(varsrole))
+ elog(FATAL, "invalid format of exec config params file");
+
+ (void) set_config_option_ext(varname, varvalue,
+ varscontext, varsource, varsrole,
+ GUC_ACTION_SET, true, 0, true);
+ if (varsourcefile[0])
+ set_config_sourcefile(varname, varsourcefile, varsourceline);
+
+ free(varname);
+ free(varvalue);
+ free(varsourcefile);
+ }
+
+ FreeFile(fp);
+}
+#endif /* EXEC_BACKEND */
+
+/*
+ * can_skip_gucvar:
+ * Decide whether SerializeGUCState can skip sending this GUC variable,
+ * or whether RestoreGUCState can skip resetting this GUC to default.
+ *
+ * It is somewhat magical and fragile that the same test works for both cases.
+ * Realize in particular that we are very likely selecting different sets of
+ * GUCs on the leader and worker sides! Be sure you've understood the
+ * comments here and in RestoreGUCState thoroughly before changing this.
+ */
+static bool
+can_skip_gucvar(struct config_generic *gconf)
+{
+ /*
+ * We can skip GUCs that are guaranteed to have the same values in leaders
+ * and workers. (Note it is critical that the leader and worker have the
+ * same idea of which GUCs fall into this category. It's okay to consider
+ * context and name for this purpose, since those are unchanging
+ * properties of a GUC.)
+ *
+ * PGC_POSTMASTER variables always have the same value in every child of a
+ * particular postmaster, so the worker will certainly have the right
+ * value already. Likewise, PGC_INTERNAL variables are set by special
+ * mechanisms (if indeed they aren't compile-time constants). So we may
+ * always skip these.
+ *
+ * Role must be handled specially because its current value can be an
+ * invalid value (for instance, if someone dropped the role since we set
+ * it). So if we tried to serialize it normally, we might get a failure.
+ * We skip it here, and use another mechanism to ensure the worker has the
+ * right value.
+ *
+ * For all other GUCs, we skip if the GUC has its compiled-in default
+ * value (i.e., source == PGC_S_DEFAULT). On the leader side, this means
+ * we don't send GUCs that have their default values, which typically
+ * saves lots of work. On the worker side, this means we don't need to
+ * reset the GUC to default because it already has that value. See
+ * comments in RestoreGUCState for more info.
+ */
+ return gconf->context == PGC_POSTMASTER ||
+ gconf->context == PGC_INTERNAL || gconf->source == PGC_S_DEFAULT ||
+ strcmp(gconf->name, "role") == 0;
+}
+
+/*
+ * estimate_variable_size:
+ * Compute space needed for dumping the given GUC variable.
+ *
+ * It's OK to overestimate, but not to underestimate.
+ */
+static Size
+estimate_variable_size(struct config_generic *gconf)
+{
+ Size size;
+ Size valsize = 0;
+
+ /* Skippable GUCs consume zero space. */
+ if (can_skip_gucvar(gconf))
+ return 0;
+
+ /* Name, plus trailing zero byte. */
+ size = strlen(gconf->name) + 1;
+
+ /* Get the maximum display length of the GUC value. */
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ valsize = 5; /* max(strlen('true'), strlen('false')) */
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ /*
+ * Instead of getting the exact display length, use max
+ * length. Also reduce the max length for typical ranges of
+ * small values. Maximum value is 2147483647, i.e. 10 chars.
+ * Include one byte for sign.
+ */
+ if (Abs(*conf->variable) < 1000)
+ valsize = 3 + 1;
+ else
+ valsize = 10 + 1;
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ /*
+ * We are going to print it with %e with REALTYPE_PRECISION
+ * fractional digits. Account for sign, leading digit,
+ * decimal point, and exponent with up to 3 digits. E.g.
+ * -3.99329042340000021e+110
+ */
+ valsize = 1 + 1 + 1 + REALTYPE_PRECISION + 5;
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ /*
+ * If the value is NULL, we transmit it as an empty string.
+ * Although this is not physically the same value, GUC
+ * generally treats a NULL the same as empty string.
+ */
+ if (*conf->variable)
+ valsize = strlen(*conf->variable);
+ else
+ valsize = 0;
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ valsize = strlen(config_enum_lookup_by_value(conf, *conf->variable));
+ }
+ break;
+ }
+
+ /* Allow space for terminating zero-byte for value */
+ size = add_size(size, valsize + 1);
+
+ if (gconf->sourcefile)
+ size = add_size(size, strlen(gconf->sourcefile));
+
+ /* Allow space for terminating zero-byte for sourcefile */
+ size = add_size(size, 1);
+
+ /* Include line whenever file is nonempty. */
+ if (gconf->sourcefile && gconf->sourcefile[0])
+ size = add_size(size, sizeof(gconf->sourceline));
+
+ size = add_size(size, sizeof(gconf->source));
+ size = add_size(size, sizeof(gconf->scontext));
+ size = add_size(size, sizeof(gconf->srole));
+
+ return size;
+}
+
+/*
+ * EstimateGUCStateSpace:
+ * Returns the size needed to store the GUC state for the current process
+ */
+Size
+EstimateGUCStateSpace(void)
+{
+ Size size;
+ int i;
+
+ /* Add space reqd for saving the data size of the guc state */
+ size = sizeof(Size);
+
+ /* Add up the space needed for each GUC variable */
+ for (i = 0; i < num_guc_variables; i++)
+ size = add_size(size,
+ estimate_variable_size(guc_variables[i]));
+
+ return size;
+}
+
+/*
+ * do_serialize:
+ * Copies the formatted string into the destination. Moves ahead the
+ * destination pointer, and decrements the maxbytes by that many bytes. If
+ * maxbytes is not sufficient to copy the string, error out.
+ */
+static void
+do_serialize(char **destptr, Size *maxbytes, const char *fmt,...)
+{
+ va_list vargs;
+ int n;
+
+ if (*maxbytes <= 0)
+ elog(ERROR, "not enough space to serialize GUC state");
+
+ va_start(vargs, fmt);
+ n = vsnprintf(*destptr, *maxbytes, fmt, vargs);
+ va_end(vargs);
+
+ if (n < 0)
+ {
+ /* Shouldn't happen. Better show errno description. */
+ elog(ERROR, "vsnprintf failed: %m with format string \"%s\"", fmt);
+ }
+ if (n >= *maxbytes)
+ {
+ /* This shouldn't happen either, really. */
+ elog(ERROR, "not enough space to serialize GUC state");
+ }
+
+ /* Shift the destptr ahead of the null terminator */
+ *destptr += n + 1;
+ *maxbytes -= n + 1;
+}
+
+/* Binary copy version of do_serialize() */
+static void
+do_serialize_binary(char **destptr, Size *maxbytes, void *val, Size valsize)
+{
+ if (valsize > *maxbytes)
+ elog(ERROR, "not enough space to serialize GUC state");
+
+ memcpy(*destptr, val, valsize);
+ *destptr += valsize;
+ *maxbytes -= valsize;
+}
+
+/*
+ * serialize_variable:
+ * Dumps name, value and other information of a GUC variable into destptr.
+ */
+static void
+serialize_variable(char **destptr, Size *maxbytes,
+ struct config_generic *gconf)
+{
+ /* Ignore skippable GUCs. */
+ if (can_skip_gucvar(gconf))
+ return;
+
+ do_serialize(destptr, maxbytes, "%s", gconf->name);
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+
+ do_serialize(destptr, maxbytes,
+ (*conf->variable ? "true" : "false"));
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ do_serialize(destptr, maxbytes, "%d", *conf->variable);
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+
+ do_serialize(destptr, maxbytes, "%.*e",
+ REALTYPE_PRECISION, *conf->variable);
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ /* NULL becomes empty string, see estimate_variable_size() */
+ do_serialize(destptr, maxbytes, "%s",
+ *conf->variable ? *conf->variable : "");
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ do_serialize(destptr, maxbytes, "%s",
+ config_enum_lookup_by_value(conf, *conf->variable));
+ }
+ break;
+ }
+
+ do_serialize(destptr, maxbytes, "%s",
+ (gconf->sourcefile ? gconf->sourcefile : ""));
+
+ if (gconf->sourcefile && gconf->sourcefile[0])
+ do_serialize_binary(destptr, maxbytes, &gconf->sourceline,
+ sizeof(gconf->sourceline));
+
+ do_serialize_binary(destptr, maxbytes, &gconf->source,
+ sizeof(gconf->source));
+ do_serialize_binary(destptr, maxbytes, &gconf->scontext,
+ sizeof(gconf->scontext));
+ do_serialize_binary(destptr, maxbytes, &gconf->srole,
+ sizeof(gconf->srole));
+}
+
+/*
+ * SerializeGUCState:
+ * Dumps the complete GUC state onto the memory location at start_address.
+ */
+void
+SerializeGUCState(Size maxsize, char *start_address)
+{
+ char *curptr;
+ Size actual_size;
+ Size bytes_left;
+ int i;
+
+ /* Reserve space for saving the actual size of the guc state */
+ Assert(maxsize > sizeof(actual_size));
+ curptr = start_address + sizeof(actual_size);
+ bytes_left = maxsize - sizeof(actual_size);
+
+ for (i = 0; i < num_guc_variables; i++)
+ serialize_variable(&curptr, &bytes_left, guc_variables[i]);
+
+ /* Store actual size without assuming alignment of start_address. */
+ actual_size = maxsize - bytes_left - sizeof(actual_size);
+ memcpy(start_address, &actual_size, sizeof(actual_size));
+}
+
+/*
+ * read_gucstate:
+ * Actually it does not read anything, just returns the srcptr. But it does
+ * move the srcptr past the terminating zero byte, so that the caller is ready
+ * to read the next string.
+ */
+static char *
+read_gucstate(char **srcptr, char *srcend)
+{
+ char *retptr = *srcptr;
+ char *ptr;
+
+ if (*srcptr >= srcend)
+ elog(ERROR, "incomplete GUC state");
+
+ /* The string variables are all null terminated */
+ for (ptr = *srcptr; ptr < srcend && *ptr != '\0'; ptr++)
+ ;
+
+ if (ptr >= srcend)
+ elog(ERROR, "could not find null terminator in GUC state");
+
+ /* Set the new position to the byte following the terminating NUL */
+ *srcptr = ptr + 1;
+
+ return retptr;
+}
+
+/* Binary read version of read_gucstate(). Copies into dest */
+static void
+read_gucstate_binary(char **srcptr, char *srcend, void *dest, Size size)
+{
+ if (*srcptr + size > srcend)
+ elog(ERROR, "incomplete GUC state");
+
+ memcpy(dest, *srcptr, size);
+ *srcptr += size;
+}
+
+/*
+ * Callback used to add a context message when reporting errors that occur
+ * while trying to restore GUCs in parallel workers.
+ */
+static void
+guc_restore_error_context_callback(void *arg)
+{
+ char **error_context_name_and_value = (char **) arg;
+
+ if (error_context_name_and_value)
+ errcontext("while setting parameter \"%s\" to \"%s\"",
+ error_context_name_and_value[0],
+ error_context_name_and_value[1]);
+}
+
+/*
+ * RestoreGUCState:
+ * Reads the GUC state at the specified address and sets this process's
+ * GUCs to match.
+ *
+ * Note that this provides the worker with only a very shallow view of the
+ * leader's GUC state: we'll know about the currently active values, but not
+ * about stacked or reset values. That's fine since the worker is just
+ * executing one part of a query, within which the active values won't change
+ * and the stacked values are invisible.
+ */
+void
+RestoreGUCState(void *gucstate)
+{
+ char *varname,
+ *varvalue,
+ *varsourcefile;
+ int varsourceline;
+ GucSource varsource;
+ GucContext varscontext;
+ Oid varsrole;
+ char *srcptr = (char *) gucstate;
+ char *srcend;
+ Size len;
+ int i;
+ ErrorContextCallback error_context_callback;
+
+ /*
+ * First, ensure that all potentially-shippable GUCs are reset to their
+ * default values. We must not touch those GUCs that the leader will
+ * never ship, while there is no need to touch those that are shippable
+ * but already have their default values. Thus, this ends up being the
+ * same test that SerializeGUCState uses, even though the sets of
+ * variables involved may well be different since the leader's set of
+ * variables-not-at-default-values can differ from the set that are
+ * not-default in this freshly started worker.
+ *
+ * Once we have set all the potentially-shippable GUCs to default values,
+ * restoring the GUCs that the leader sent (because they had non-default
+ * values over there) leads us to exactly the set of GUC values that the
+ * leader has. This is true even though the worker may have initially
+ * absorbed postgresql.conf settings that the leader hasn't yet seen, or
+ * ALTER USER/DATABASE SET settings that were established after the leader
+ * started.
+ *
+ * Note that ensuring all the potential target GUCs are at PGC_S_DEFAULT
+ * also ensures that set_config_option won't refuse to set them because of
+ * source-priority comparisons.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+
+ /* Do nothing if non-shippable or if already at PGC_S_DEFAULT. */
+ if (can_skip_gucvar(gconf))
+ continue;
+
+ /*
+ * We can use InitializeOneGUCOption to reset the GUC to default, but
+ * first we must free any existing subsidiary data to avoid leaking
+ * memory. The stack must be empty, but we have to clean up all other
+ * fields. Beware that there might be duplicate value or "extra"
+ * pointers.
+ */
+ Assert(gconf->stack == NULL);
+ if (gconf->extra)
+ free(gconf->extra);
+ if (gconf->last_reported) /* probably can't happen */
+ free(gconf->last_reported);
+ if (gconf->sourcefile)
+ free(gconf->sourcefile);
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+
+ if (conf->reset_extra && conf->reset_extra != gconf->extra)
+ free(conf->reset_extra);
+ break;
+ }
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ if (conf->reset_extra && conf->reset_extra != gconf->extra)
+ free(conf->reset_extra);
+ break;
+ }
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+
+ if (conf->reset_extra && conf->reset_extra != gconf->extra)
+ free(conf->reset_extra);
+ break;
+ }
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ if (*conf->variable)
+ free(*conf->variable);
+ if (conf->reset_val && conf->reset_val != *conf->variable)
+ free(conf->reset_val);
+ if (conf->reset_extra && conf->reset_extra != gconf->extra)
+ free(conf->reset_extra);
+ break;
+ }
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ if (conf->reset_extra && conf->reset_extra != gconf->extra)
+ free(conf->reset_extra);
+ break;
+ }
+ }
+ /* Now we can reset the struct to PGS_S_DEFAULT state. */
+ InitializeOneGUCOption(gconf);
+ }
+
+ /* First item is the length of the subsequent data */
+ memcpy(&len, gucstate, sizeof(len));
+
+ srcptr += sizeof(len);
+ srcend = srcptr + len;
+
+ /* If the GUC value check fails, we want errors to show useful context. */
+ error_context_callback.callback = guc_restore_error_context_callback;
+ error_context_callback.previous = error_context_stack;
+ error_context_callback.arg = NULL;
+ error_context_stack = &error_context_callback;
+
+ /* Restore all the listed GUCs. */
+ while (srcptr < srcend)
+ {
+ int result;
+ char *error_context_name_and_value[2];
+
+ varname = read_gucstate(&srcptr, srcend);
+ varvalue = read_gucstate(&srcptr, srcend);
+ varsourcefile = read_gucstate(&srcptr, srcend);
+ if (varsourcefile[0])
+ read_gucstate_binary(&srcptr, srcend,
+ &varsourceline, sizeof(varsourceline));
+ else
+ varsourceline = 0;
+ read_gucstate_binary(&srcptr, srcend,
+ &varsource, sizeof(varsource));
+ read_gucstate_binary(&srcptr, srcend,
+ &varscontext, sizeof(varscontext));
+ read_gucstate_binary(&srcptr, srcend,
+ &varsrole, sizeof(varsrole));
+
+ error_context_name_and_value[0] = varname;
+ error_context_name_and_value[1] = varvalue;
+ error_context_callback.arg = &error_context_name_and_value[0];
+ result = set_config_option_ext(varname, varvalue,
+ varscontext, varsource, varsrole,
+ GUC_ACTION_SET, true, ERROR, true);
+ if (result <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INTERNAL_ERROR),
+ errmsg("parameter \"%s\" could not be set", varname)));
+ if (varsourcefile[0])
+ set_config_sourcefile(varname, varsourcefile, varsourceline);
+ error_context_callback.arg = NULL;
+ }
+
+ error_context_stack = error_context_callback.previous;
+}
+
+/*
+ * A little "long argument" simulation, although not quite GNU
+ * compliant. Takes a string of the form "some-option=some value" and
+ * returns name = "some_option" and value = "some value" in malloc'ed
+ * storage. Note that '-' is converted to '_' in the option name. If
+ * there is no '=' in the input string then value will be NULL.
+ */
+void
+ParseLongOption(const char *string, char **name, char **value)
+{
+ size_t equal_pos;
+ char *cp;
+
+ AssertArg(string);
+ AssertArg(name);
+ AssertArg(value);
+
+ equal_pos = strcspn(string, "=");
+
+ if (string[equal_pos] == '=')
+ {
+ *name = guc_malloc(FATAL, equal_pos + 1);
+ strlcpy(*name, string, equal_pos + 1);
+
+ *value = guc_strdup(FATAL, &string[equal_pos + 1]);
+ }
+ else
+ {
+ /* no equal sign in string */
+ *name = guc_strdup(FATAL, string);
+ *value = NULL;
+ }
+
+ for (cp = *name; *cp; cp++)
+ if (*cp == '-')
+ *cp = '_';
+}
+
+
+/*
+ * Handle options fetched from pg_db_role_setting.setconfig,
+ * pg_proc.proconfig, etc. Caller must specify proper context/source/action.
+ *
+ * The array parameter must be an array of TEXT (it must not be NULL).
+ */
+void
+ProcessGUCArray(ArrayType *array,
+ GucContext context, GucSource source, GucAction action)
+{
+ int i;
+
+ Assert(array != NULL);
+ Assert(ARR_ELEMTYPE(array) == TEXTOID);
+ Assert(ARR_NDIM(array) == 1);
+ Assert(ARR_LBOUND(array)[0] == 1);
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ bool isnull;
+ char *s;
+ char *name;
+ char *value;
+ char *namecopy;
+ char *valuecopy;
+
+ d = array_ref(array, 1, &i,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ ,
+ &isnull);
+
+ if (isnull)
+ continue;
+
+ s = TextDatumGetCString(d);
+
+ ParseLongOption(s, &name, &value);
+ if (!value)
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("could not parse setting for parameter \"%s\"",
+ name)));
+ free(name);
+ continue;
+ }
+
+ /* free malloc'd strings immediately to avoid leak upon error */
+ namecopy = pstrdup(name);
+ free(name);
+ valuecopy = pstrdup(value);
+ free(value);
+
+ (void) set_config_option(namecopy, valuecopy,
+ context, source,
+ action, true, 0, false);
+
+ pfree(namecopy);
+ pfree(valuecopy);
+ pfree(s);
+ }
+}
+
+
+/*
+ * Add an entry to an option array. The array parameter may be NULL
+ * to indicate the current table entry is NULL.
+ */
+ArrayType *
+GUCArrayAdd(ArrayType *array, const char *name, const char *value)
+{
+ struct config_generic *record;
+ Datum datum;
+ char *newval;
+ ArrayType *a;
+
+ Assert(name);
+ Assert(value);
+
+ /* test if the option is valid and we're allowed to set it */
+ (void) validate_option_array_item(name, value, false);
+
+ /* normalize name (converts obsolete GUC names to modern spellings) */
+ record = find_option(name, false, true, WARNING);
+ if (record)
+ name = record->name;
+
+ /* build new item for array */
+ newval = psprintf("%s=%s", name, value);
+ datum = CStringGetTextDatum(newval);
+
+ if (array)
+ {
+ int index;
+ bool isnull;
+ int i;
+
+ Assert(ARR_ELEMTYPE(array) == TEXTOID);
+ Assert(ARR_NDIM(array) == 1);
+ Assert(ARR_LBOUND(array)[0] == 1);
+
+ index = ARR_DIMS(array)[0] + 1; /* add after end */
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ char *current;
+
+ d = array_ref(array, 1, &i,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ ,
+ &isnull);
+ if (isnull)
+ continue;
+ current = TextDatumGetCString(d);
+
+ /* check for match up through and including '=' */
+ if (strncmp(current, newval, strlen(name) + 1) == 0)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ a = array_set(array, 1, &index,
+ datum,
+ false,
+ -1 /* varlena array */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ );
+ }
+ else
+ a = construct_array(&datum, 1,
+ TEXTOID,
+ -1, false, TYPALIGN_INT);
+
+ return a;
+}
+
+
+/*
+ * Delete an entry from an option array. The array parameter may be NULL
+ * to indicate the current table entry is NULL. Also, if the return value
+ * is NULL then a null should be stored.
+ */
+ArrayType *
+GUCArrayDelete(ArrayType *array, const char *name)
+{
+ struct config_generic *record;
+ ArrayType *newarray;
+ int i;
+ int index;
+
+ Assert(name);
+
+ /* test if the option is valid and we're allowed to set it */
+ (void) validate_option_array_item(name, NULL, false);
+
+ /* normalize name (converts obsolete GUC names to modern spellings) */
+ record = find_option(name, false, true, WARNING);
+ if (record)
+ name = record->name;
+
+ /* if array is currently null, then surely nothing to delete */
+ if (!array)
+ return NULL;
+
+ newarray = NULL;
+ index = 1;
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ char *val;
+ bool isnull;
+
+ d = array_ref(array, 1, &i,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ ,
+ &isnull);
+ if (isnull)
+ continue;
+ val = TextDatumGetCString(d);
+
+ /* ignore entry if it's what we want to delete */
+ if (strncmp(val, name, strlen(name)) == 0
+ && val[strlen(name)] == '=')
+ continue;
+
+ /* else add it to the output array */
+ if (newarray)
+ newarray = array_set(newarray, 1, &index,
+ d,
+ false,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ );
+ else
+ newarray = construct_array(&d, 1,
+ TEXTOID,
+ -1, false, TYPALIGN_INT);
+
+ index++;
+ }
+
+ return newarray;
+}
+
+
+/*
+ * Given a GUC array, delete all settings from it that our permission
+ * level allows: if superuser, delete them all; if regular user, only
+ * those that are PGC_USERSET or we have permission to set
+ */
+ArrayType *
+GUCArrayReset(ArrayType *array)
+{
+ ArrayType *newarray;
+ int i;
+ int index;
+
+ /* if array is currently null, nothing to do */
+ if (!array)
+ return NULL;
+
+ /* if we're superuser, we can delete everything, so just do it */
+ if (superuser())
+ return NULL;
+
+ newarray = NULL;
+ index = 1;
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ char *val;
+ char *eqsgn;
+ bool isnull;
+
+ d = array_ref(array, 1, &i,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ ,
+ &isnull);
+ if (isnull)
+ continue;
+ val = TextDatumGetCString(d);
+
+ eqsgn = strchr(val, '=');
+ *eqsgn = '\0';
+
+ /* skip if we have permission to delete it */
+ if (validate_option_array_item(val, NULL, true))
+ continue;
+
+ /* else add it to the output array */
+ if (newarray)
+ newarray = array_set(newarray, 1, &index,
+ d,
+ false,
+ -1 /* varlenarray */ ,
+ -1 /* TEXT's typlen */ ,
+ false /* TEXT's typbyval */ ,
+ TYPALIGN_INT /* TEXT's typalign */ );
+ else
+ newarray = construct_array(&d, 1,
+ TEXTOID,
+ -1, false, TYPALIGN_INT);
+
+ index++;
+ pfree(val);
+ }
+
+ return newarray;
+}
+
+/*
+ * Validate a proposed option setting for GUCArrayAdd/Delete/Reset.
+ *
+ * name is the option name. value is the proposed value for the Add case,
+ * or NULL for the Delete/Reset cases. If skipIfNoPermissions is true, it's
+ * not an error to have no permissions to set the option.
+ *
+ * Returns true if OK, false if skipIfNoPermissions is true and user does not
+ * have permission to change this option (all other error cases result in an
+ * error being thrown).
+ */
+static bool
+validate_option_array_item(const char *name, const char *value,
+ bool skipIfNoPermissions)
+
+{
+ struct config_generic *gconf;
+
+ /*
+ * There are three cases to consider:
+ *
+ * name is a known GUC variable. Check the value normally, check
+ * permissions normally (i.e., allow if variable is USERSET, or if it's
+ * SUSET and user is superuser or holds ACL_SET permissions).
+ *
+ * name is not known, but exists or can be created as a placeholder (i.e.,
+ * it has a valid custom name). We allow this case if you're a superuser,
+ * otherwise not. Superusers are assumed to know what they're doing. We
+ * can't allow it for other users, because when the placeholder is
+ * resolved it might turn out to be a SUSET variable. (With currently
+ * available infrastructure, we can actually handle such cases within the
+ * current session --- but once an entry is made in pg_db_role_setting,
+ * it's assumed to be fully validated.)
+ *
+ * name is not known and can't be created as a placeholder. Throw error,
+ * unless skipIfNoPermissions is true, in which case return false.
+ */
+ gconf = find_option(name, true, skipIfNoPermissions, ERROR);
+ if (!gconf)
+ {
+ /* not known, failed to make a placeholder */
+ return false;
+ }
+
+ if (gconf->flags & GUC_CUSTOM_PLACEHOLDER)
+ {
+ /*
+ * We cannot do any meaningful check on the value, so only permissions
+ * are useful to check.
+ */
+ if (superuser() ||
+ pg_parameter_aclcheck(name, GetUserId(), ACL_SET) == ACLCHECK_OK)
+ return true;
+ if (skipIfNoPermissions)
+ return false;
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to set parameter \"%s\"", name)));
+ }
+
+ /* manual permissions check so we can avoid an error being thrown */
+ if (gconf->context == PGC_USERSET)
+ /* ok */ ;
+ else if (gconf->context == PGC_SUSET &&
+ (superuser() ||
+ pg_parameter_aclcheck(name, GetUserId(), ACL_SET) == ACLCHECK_OK))
+ /* ok */ ;
+ else if (skipIfNoPermissions)
+ return false;
+ /* if a permissions error should be thrown, let set_config_option do it */
+
+ /* test for permissions and valid option value */
+ (void) set_config_option(name, value,
+ superuser() ? PGC_SUSET : PGC_USERSET,
+ PGC_S_TEST, GUC_ACTION_SET, false, 0, false);
+
+ return true;
+}
+
+
+/*
+ * Called by check_hooks that want to override the normal
+ * ERRCODE_INVALID_PARAMETER_VALUE SQLSTATE for check hook failures.
+ *
+ * Note that GUC_check_errmsg() etc are just macros that result in a direct
+ * assignment to the associated variables. That is ugly, but forced by the
+ * limitations of C's macro mechanisms.
+ */
+void
+GUC_check_errcode(int sqlerrcode)
+{
+ GUC_check_errcode_value = sqlerrcode;
+}
+
+
+/*
+ * Convenience functions to manage calling a variable's check_hook.
+ * These mostly take care of the protocol for letting check hooks supply
+ * portions of the error report on failure.
+ */
+
+static bool
+call_bool_check_hook(struct config_bool *conf, bool *newval, void **extra,
+ GucSource source, int elevel)
+{
+ /* Quick success if no hook */
+ if (!conf->check_hook)
+ return true;
+
+ /* Reset variables that might be set by hook */
+ GUC_check_errcode_value = ERRCODE_INVALID_PARAMETER_VALUE;
+ GUC_check_errmsg_string = NULL;
+ GUC_check_errdetail_string = NULL;
+ GUC_check_errhint_string = NULL;
+
+ if (!conf->check_hook(newval, extra, source))
+ {
+ ereport(elevel,
+ (errcode(GUC_check_errcode_value),
+ GUC_check_errmsg_string ?
+ errmsg_internal("%s", GUC_check_errmsg_string) :
+ errmsg("invalid value for parameter \"%s\": %d",
+ conf->gen.name, (int) *newval),
+ GUC_check_errdetail_string ?
+ errdetail_internal("%s", GUC_check_errdetail_string) : 0,
+ GUC_check_errhint_string ?
+ errhint("%s", GUC_check_errhint_string) : 0));
+ /* Flush any strings created in ErrorContext */
+ FlushErrorState();
+ return false;
+ }
+
+ return true;
+}
+
+static bool
+call_int_check_hook(struct config_int *conf, int *newval, void **extra,
+ GucSource source, int elevel)
+{
+ /* Quick success if no hook */
+ if (!conf->check_hook)
+ return true;
+
+ /* Reset variables that might be set by hook */
+ GUC_check_errcode_value = ERRCODE_INVALID_PARAMETER_VALUE;
+ GUC_check_errmsg_string = NULL;
+ GUC_check_errdetail_string = NULL;
+ GUC_check_errhint_string = NULL;
+
+ if (!conf->check_hook(newval, extra, source))
+ {
+ ereport(elevel,
+ (errcode(GUC_check_errcode_value),
+ GUC_check_errmsg_string ?
+ errmsg_internal("%s", GUC_check_errmsg_string) :
+ errmsg("invalid value for parameter \"%s\": %d",
+ conf->gen.name, *newval),
+ GUC_check_errdetail_string ?
+ errdetail_internal("%s", GUC_check_errdetail_string) : 0,
+ GUC_check_errhint_string ?
+ errhint("%s", GUC_check_errhint_string) : 0));
+ /* Flush any strings created in ErrorContext */
+ FlushErrorState();
+ return false;
+ }
+
+ return true;
+}
+
+static bool
+call_real_check_hook(struct config_real *conf, double *newval, void **extra,
+ GucSource source, int elevel)
+{
+ /* Quick success if no hook */
+ if (!conf->check_hook)
+ return true;
+
+ /* Reset variables that might be set by hook */
+ GUC_check_errcode_value = ERRCODE_INVALID_PARAMETER_VALUE;
+ GUC_check_errmsg_string = NULL;
+ GUC_check_errdetail_string = NULL;
+ GUC_check_errhint_string = NULL;
+
+ if (!conf->check_hook(newval, extra, source))
+ {
+ ereport(elevel,
+ (errcode(GUC_check_errcode_value),
+ GUC_check_errmsg_string ?
+ errmsg_internal("%s", GUC_check_errmsg_string) :
+ errmsg("invalid value for parameter \"%s\": %g",
+ conf->gen.name, *newval),
+ GUC_check_errdetail_string ?
+ errdetail_internal("%s", GUC_check_errdetail_string) : 0,
+ GUC_check_errhint_string ?
+ errhint("%s", GUC_check_errhint_string) : 0));
+ /* Flush any strings created in ErrorContext */
+ FlushErrorState();
+ return false;
+ }
+
+ return true;
+}
+
+static bool
+call_string_check_hook(struct config_string *conf, char **newval, void **extra,
+ GucSource source, int elevel)
+{
+ volatile bool result = true;
+
+ /* Quick success if no hook */
+ if (!conf->check_hook)
+ return true;
+
+ /*
+ * If elevel is ERROR, or if the check_hook itself throws an elog
+ * (undesirable, but not always avoidable), make sure we don't leak the
+ * already-malloc'd newval string.
+ */
+ PG_TRY();
+ {
+ /* Reset variables that might be set by hook */
+ GUC_check_errcode_value = ERRCODE_INVALID_PARAMETER_VALUE;
+ GUC_check_errmsg_string = NULL;
+ GUC_check_errdetail_string = NULL;
+ GUC_check_errhint_string = NULL;
+
+ if (!conf->check_hook(newval, extra, source))
+ {
+ ereport(elevel,
+ (errcode(GUC_check_errcode_value),
+ GUC_check_errmsg_string ?
+ errmsg_internal("%s", GUC_check_errmsg_string) :
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ conf->gen.name, *newval ? *newval : ""),
+ GUC_check_errdetail_string ?
+ errdetail_internal("%s", GUC_check_errdetail_string) : 0,
+ GUC_check_errhint_string ?
+ errhint("%s", GUC_check_errhint_string) : 0));
+ /* Flush any strings created in ErrorContext */
+ FlushErrorState();
+ result = false;
+ }
+ }
+ PG_CATCH();
+ {
+ free(*newval);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ return result;
+}
+
+static bool
+call_enum_check_hook(struct config_enum *conf, int *newval, void **extra,
+ GucSource source, int elevel)
+{
+ /* Quick success if no hook */
+ if (!conf->check_hook)
+ return true;
+
+ /* Reset variables that might be set by hook */
+ GUC_check_errcode_value = ERRCODE_INVALID_PARAMETER_VALUE;
+ GUC_check_errmsg_string = NULL;
+ GUC_check_errdetail_string = NULL;
+ GUC_check_errhint_string = NULL;
+
+ if (!conf->check_hook(newval, extra, source))
+ {
+ ereport(elevel,
+ (errcode(GUC_check_errcode_value),
+ GUC_check_errmsg_string ?
+ errmsg_internal("%s", GUC_check_errmsg_string) :
+ errmsg("invalid value for parameter \"%s\": \"%s\"",
+ conf->gen.name,
+ config_enum_lookup_by_value(conf, *newval)),
+ GUC_check_errdetail_string ?
+ errdetail_internal("%s", GUC_check_errdetail_string) : 0,
+ GUC_check_errhint_string ?
+ errhint("%s", GUC_check_errhint_string) : 0));
+ /* Flush any strings created in ErrorContext */
+ FlushErrorState();
+ return false;
+ }
+
+ return true;
+}
+
+
+/*
+ * check_hook, assign_hook and show_hook subroutines
+ */
+
+static bool
+check_wal_consistency_checking(char **newval, void **extra, GucSource source)
+{
+ char *rawstring;
+ List *elemlist;
+ ListCell *l;
+ bool newwalconsistency[RM_MAX_ID + 1];
+
+ /* Initialize the array */
+ MemSet(newwalconsistency, 0, (RM_MAX_ID + 1) * sizeof(bool));
+
+ /* Need a modifiable copy of string */
+ rawstring = pstrdup(*newval);
+
+ /* Parse string into list of identifiers */
+ if (!SplitIdentifierString(rawstring, ',', &elemlist))
+ {
+ /* syntax error in list */
+ GUC_check_errdetail("List syntax is invalid.");
+ pfree(rawstring);
+ list_free(elemlist);
+ return false;
+ }
+
+ foreach(l, elemlist)
+ {
+ char *tok = (char *) lfirst(l);
+ bool found = false;
+ int rmid;
+
+ /* Check for 'all'. */
+ if (pg_strcasecmp(tok, "all") == 0)
+ {
+ for (rmid = 0; rmid <= RM_MAX_ID; rmid++)
+ if (RmgrIdExists(rmid) && GetRmgr(rmid).rm_mask != NULL)
+ newwalconsistency[rmid] = true;
+ found = true;
+ }
+ else
+ {
+ /*
+ * Check if the token matches with any individual resource
+ * manager.
+ */
+ for (rmid = 0; rmid <= RM_MAX_ID; rmid++)
+ {
+ if (RmgrIdExists(rmid) && GetRmgr(rmid).rm_mask != NULL &&
+ pg_strcasecmp(tok, GetRmgr(rmid).rm_name) == 0)
+ {
+ newwalconsistency[rmid] = true;
+ found = true;
+ }
+ }
+ }
+
+ /* If a valid resource manager is found, check for the next one. */
+ if (!found)
+ {
+ /*
+ * Perhaps it's a custom resource manager. If so, defer checking
+ * until InitializeWalConsistencyChecking().
+ */
+ if (!process_shared_preload_libraries_done)
+ {
+ check_wal_consistency_checking_deferred = true;
+ }
+ else
+ {
+ GUC_check_errdetail("Unrecognized key word: \"%s\".", tok);
+ pfree(rawstring);
+ list_free(elemlist);
+ return false;
+ }
+ }
+ }
+
+ pfree(rawstring);
+ list_free(elemlist);
+
+ /* assign new value */
+ *extra = guc_malloc(ERROR, (RM_MAX_ID + 1) * sizeof(bool));
+ memcpy(*extra, newwalconsistency, (RM_MAX_ID + 1) * sizeof(bool));
+ return true;
+}
+
+static void
+assign_wal_consistency_checking(const char *newval, void *extra)
+{
+ /*
+ * If some checks were deferred, it's possible that the checks will fail
+ * later during InitializeWalConsistencyChecking(). But in that case, the
+ * postmaster will exit anyway, so it's safe to proceed with the
+ * assignment.
+ *
+ * Any built-in resource managers specified are assigned immediately,
+ * which affects WAL created before shared_preload_libraries are
+ * processed. Any custom resource managers specified won't be assigned
+ * until after shared_preload_libraries are processed, but that's OK
+ * because WAL for a custom resource manager can't be written before the
+ * module is loaded anyway.
+ */
+ wal_consistency_checking = extra;
+}
+
+static bool
+check_log_destination(char **newval, void **extra, GucSource source)
+{
+ char *rawstring;
+ List *elemlist;
+ ListCell *l;
+ int newlogdest = 0;
+ int *myextra;
+
+ /* Need a modifiable copy of string */
+ rawstring = pstrdup(*newval);
+
+ /* Parse string into list of identifiers */
+ if (!SplitIdentifierString(rawstring, ',', &elemlist))
+ {
+ /* syntax error in list */
+ GUC_check_errdetail("List syntax is invalid.");
+ pfree(rawstring);
+ list_free(elemlist);
+ return false;
+ }
+
+ foreach(l, elemlist)
+ {
+ char *tok = (char *) lfirst(l);
+
+ if (pg_strcasecmp(tok, "stderr") == 0)
+ newlogdest |= LOG_DESTINATION_STDERR;
+ else if (pg_strcasecmp(tok, "csvlog") == 0)
+ newlogdest |= LOG_DESTINATION_CSVLOG;
+ else if (pg_strcasecmp(tok, "jsonlog") == 0)
+ newlogdest |= LOG_DESTINATION_JSONLOG;
+#ifdef HAVE_SYSLOG
+ else if (pg_strcasecmp(tok, "syslog") == 0)
+ newlogdest |= LOG_DESTINATION_SYSLOG;
+#endif
+#ifdef WIN32
+ else if (pg_strcasecmp(tok, "eventlog") == 0)
+ newlogdest |= LOG_DESTINATION_EVENTLOG;
+#endif
+ else
+ {
+ GUC_check_errdetail("Unrecognized key word: \"%s\".", tok);
+ pfree(rawstring);
+ list_free(elemlist);
+ return false;
+ }
+ }
+
+ pfree(rawstring);
+ list_free(elemlist);
+
+ myextra = (int *) guc_malloc(ERROR, sizeof(int));
+ *myextra = newlogdest;
+ *extra = (void *) myextra;
+
+ return true;
+}
+
+static void
+assign_log_destination(const char *newval, void *extra)
+{
+ Log_destination = *((int *) extra);
+}
+
+static void
+assign_syslog_facility(int newval, void *extra)
+{
+#ifdef HAVE_SYSLOG
+ set_syslog_parameters(syslog_ident_str ? syslog_ident_str : "postgres",
+ newval);
+#endif
+ /* Without syslog support, just ignore it */
+}
+
+static void
+assign_syslog_ident(const char *newval, void *extra)
+{
+#ifdef HAVE_SYSLOG
+ set_syslog_parameters(newval, syslog_facility);
+#endif
+ /* Without syslog support, it will always be set to "none", so ignore */
+}
+
+
+static void
+assign_session_replication_role(int newval, void *extra)
+{
+ /*
+ * Must flush the plan cache when changing replication role; but don't
+ * flush unnecessarily.
+ */
+ if (SessionReplicationRole != newval)
+ ResetPlanCache();
+}
+
+static bool
+check_temp_buffers(int *newval, void **extra, GucSource source)
+{
+ /*
+ * Once local buffers have been initialized, it's too late to change this.
+ * However, if this is only a test call, allow it.
+ */
+ if (source != PGC_S_TEST && NLocBuffer && NLocBuffer != *newval)
+ {
+ GUC_check_errdetail("\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session.");
+ return false;
+ }
+ return true;
+}
+
+static bool
+check_bonjour(bool *newval, void **extra, GucSource source)
+{
+#ifndef USE_BONJOUR
+ if (*newval)
+ {
+ GUC_check_errmsg("Bonjour is not supported by this build");
+ return false;
+ }
+#endif
+ return true;
+}
+
+static bool
+check_ssl(bool *newval, void **extra, GucSource source)
+{
+#ifndef USE_SSL
+ if (*newval)
+ {
+ GUC_check_errmsg("SSL is not supported by this build");
+ return false;
+ }
+#endif
+ return true;
+}
+
+static bool
+check_stage_log_stats(bool *newval, void **extra, GucSource source)
+{
+ if (*newval && log_statement_stats)
+ {
+ GUC_check_errdetail("Cannot enable parameter when \"log_statement_stats\" is true.");
+ return false;
+ }
+ return true;
+}
+
+static bool
+check_log_stats(bool *newval, void **extra, GucSource source)
+{
+ if (*newval &&
+ (log_parser_stats || log_planner_stats || log_executor_stats))
+ {
+ GUC_check_errdetail("Cannot enable \"log_statement_stats\" when "
+ "\"log_parser_stats\", \"log_planner_stats\", "
+ "or \"log_executor_stats\" is true.");
+ return false;
+ }
+ return true;
+}
+
+static bool
+check_canonical_path(char **newval, void **extra, GucSource source)
+{
+ /*
+ * Since canonicalize_path never enlarges the string, we can just modify
+ * newval in-place. But watch out for NULL, which is the default value
+ * for external_pid_file.
+ */
+ if (*newval)
+ canonicalize_path(*newval);
+ return true;
+}
+
+static bool
+check_timezone_abbreviations(char **newval, void **extra, GucSource source)
+{
+ /*
+ * The boot_val given above for timezone_abbreviations is NULL. When we
+ * see this we just do nothing. If this value isn't overridden from the
+ * config file then pg_timezone_abbrev_initialize() will eventually
+ * replace it with "Default". This hack has two purposes: to avoid
+ * wasting cycles loading values that might soon be overridden from the
+ * config file, and to avoid trying to read the timezone abbrev files
+ * during InitializeGUCOptions(). The latter doesn't work in an
+ * EXEC_BACKEND subprocess because my_exec_path hasn't been set yet and so
+ * we can't locate PGSHAREDIR.
+ */
+ if (*newval == NULL)
+ {
+ Assert(source == PGC_S_DEFAULT);
+ return true;
+ }
+
+ /* OK, load the file and produce a malloc'd TimeZoneAbbrevTable */
+ *extra = load_tzoffsets(*newval);
+
+ /* tzparser.c returns NULL on failure, reporting via GUC_check_errmsg */
+ if (!*extra)
+ return false;
+
+ return true;
+}
+
+static void
+assign_timezone_abbreviations(const char *newval, void *extra)
+{
+ /* Do nothing for the boot_val default of NULL */
+ if (!extra)
+ return;
+
+ InstallTimeZoneAbbrevs((TimeZoneAbbrevTable *) extra);
+}
+
+/*
+ * pg_timezone_abbrev_initialize --- set default value if not done already
+ *
+ * This is called after initial loading of postgresql.conf. If no
+ * timezone_abbreviations setting was found therein, select default.
+ * If a non-default value is already installed, nothing will happen.
+ *
+ * This can also be called from ProcessConfigFile to establish the default
+ * value after a postgresql.conf entry for it is removed.
+ */
+static void
+pg_timezone_abbrev_initialize(void)
+{
+ SetConfigOption("timezone_abbreviations", "Default",
+ PGC_POSTMASTER, PGC_S_DYNAMIC_DEFAULT);
+}
+
+static const char *
+show_archive_command(void)
+{
+ if (XLogArchivingActive())
+ return XLogArchiveCommand;
+ else
+ return "(disabled)";
+}
+
+static void
+assign_tcp_keepalives_idle(int newval, void *extra)
+{
+ /*
+ * The kernel API provides no way to test a value without setting it; and
+ * once we set it we might fail to unset it. So there seems little point
+ * in fully implementing the check-then-assign GUC API for these
+ * variables. Instead we just do the assignment on demand. pqcomm.c
+ * reports any problems via ereport(LOG).
+ *
+ * This approach means that the GUC value might have little to do with the
+ * actual kernel value, so we use a show_hook that retrieves the kernel
+ * value rather than trusting GUC's copy.
+ */
+ (void) pq_setkeepalivesidle(newval, MyProcPort);
+}
+
+static const char *
+show_tcp_keepalives_idle(void)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ static char nbuf[16];
+
+ snprintf(nbuf, sizeof(nbuf), "%d", pq_getkeepalivesidle(MyProcPort));
+ return nbuf;
+}
+
+static void
+assign_tcp_keepalives_interval(int newval, void *extra)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ (void) pq_setkeepalivesinterval(newval, MyProcPort);
+}
+
+static const char *
+show_tcp_keepalives_interval(void)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ static char nbuf[16];
+
+ snprintf(nbuf, sizeof(nbuf), "%d", pq_getkeepalivesinterval(MyProcPort));
+ return nbuf;
+}
+
+static void
+assign_tcp_keepalives_count(int newval, void *extra)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ (void) pq_setkeepalivescount(newval, MyProcPort);
+}
+
+static const char *
+show_tcp_keepalives_count(void)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ static char nbuf[16];
+
+ snprintf(nbuf, sizeof(nbuf), "%d", pq_getkeepalivescount(MyProcPort));
+ return nbuf;
+}
+
+static void
+assign_tcp_user_timeout(int newval, void *extra)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ (void) pq_settcpusertimeout(newval, MyProcPort);
+}
+
+static const char *
+show_tcp_user_timeout(void)
+{
+ /* See comments in assign_tcp_keepalives_idle */
+ static char nbuf[16];
+
+ snprintf(nbuf, sizeof(nbuf), "%d", pq_gettcpusertimeout(MyProcPort));
+ return nbuf;
+}
+
+static bool
+check_maxconnections(int *newval, void **extra, GucSource source)
+{
+ if (*newval + autovacuum_max_workers + 1 +
+ max_worker_processes + max_wal_senders > MAX_BACKENDS)
+ return false;
+ return true;
+}
+
+static bool
+check_autovacuum_max_workers(int *newval, void **extra, GucSource source)
+{
+ if (MaxConnections + *newval + 1 +
+ max_worker_processes + max_wal_senders > MAX_BACKENDS)
+ return false;
+ return true;
+}
+
+static bool
+check_max_wal_senders(int *newval, void **extra, GucSource source)
+{
+ if (MaxConnections + autovacuum_max_workers + 1 +
+ max_worker_processes + *newval > MAX_BACKENDS)
+ return false;
+ return true;
+}
+
+static bool
+check_autovacuum_work_mem(int *newval, void **extra, GucSource source)
+{
+ /*
+ * -1 indicates fallback.
+ *
+ * If we haven't yet changed the boot_val default of -1, just let it be.
+ * Autovacuum will look to maintenance_work_mem instead.
+ */
+ if (*newval == -1)
+ return true;
+
+ /*
+ * We clamp manually-set values to at least 1MB. Since
+ * maintenance_work_mem is always set to at least this value, do the same
+ * here.
+ */
+ if (*newval < 1024)
+ *newval = 1024;
+
+ return true;
+}
+
+static bool
+check_max_worker_processes(int *newval, void **extra, GucSource source)
+{
+ if (MaxConnections + autovacuum_max_workers + 1 +
+ *newval + max_wal_senders > MAX_BACKENDS)
+ return false;
+ return true;
+}
+
+static bool
+check_effective_io_concurrency(int *newval, void **extra, GucSource source)
+{
+#ifndef USE_PREFETCH
+ if (*newval != 0)
+ {
+ GUC_check_errdetail("effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise().");
+ return false;
+ }
+#endif /* USE_PREFETCH */
+ return true;
+}
+
+static bool
+check_maintenance_io_concurrency(int *newval, void **extra, GucSource source)
+{
+#ifndef USE_PREFETCH
+ if (*newval != 0)
+ {
+ GUC_check_errdetail("maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise().");
+ return false;
+ }
+#endif /* USE_PREFETCH */
+ return true;
+}
+
+static bool
+check_huge_page_size(int *newval, void **extra, GucSource source)
+{
+#if !(defined(MAP_HUGE_MASK) && defined(MAP_HUGE_SHIFT))
+ /* Recent enough Linux only, for now. See GetHugePageSize(). */
+ if (*newval != 0)
+ {
+ GUC_check_errdetail("huge_page_size must be 0 on this platform.");
+ return false;
+ }
+#endif
+ return true;
+}
+
+static bool
+check_client_connection_check_interval(int *newval, void **extra, GucSource source)
+{
+ if (!WaitEventSetCanReportClosed() && *newval != 0)
+ {
+ GUC_check_errdetail("client_connection_check_interval must be set to 0 on this platform.");
+ return false;
+ }
+ return true;
+}
+
+static void
+assign_maintenance_io_concurrency(int newval, void *extra)
+{
+#ifdef USE_PREFETCH
+ /*
+ * Reconfigure recovery prefetching, because a setting it depends on
+ * changed.
+ */
+ maintenance_io_concurrency = newval;
+ if (AmStartupProcess())
+ XLogPrefetchReconfigure();
+#endif
+}
+
+static bool
+check_application_name(char **newval, void **extra, GucSource source)
+{
+ /* Only allow clean ASCII chars in the application name */
+ pg_clean_ascii(*newval);
+
+ return true;
+}
+
+static void
+assign_application_name(const char *newval, void *extra)
+{
+ /* Update the pg_stat_activity view */
+ pgstat_report_appname(newval);
+}
+
+static bool
+check_cluster_name(char **newval, void **extra, GucSource source)
+{
+ /* Only allow clean ASCII chars in the cluster name */
+ pg_clean_ascii(*newval);
+
+ return true;
+}
+
+static const char *
+show_unix_socket_permissions(void)
+{
+ static char buf[12];
+
+ snprintf(buf, sizeof(buf), "%04o", Unix_socket_permissions);
+ return buf;
+}
+
+static const char *
+show_log_file_mode(void)
+{
+ static char buf[12];
+
+ snprintf(buf, sizeof(buf), "%04o", Log_file_mode);
+ return buf;
+}
+
+static const char *
+show_data_directory_mode(void)
+{
+ static char buf[12];
+
+ snprintf(buf, sizeof(buf), "%04o", data_directory_mode);
+ return buf;
+}
+
+static const char *
+show_in_hot_standby(void)
+{
+ /*
+ * We display the actual state based on shared memory, so that this GUC
+ * reports up-to-date state if examined intra-query. The underlying
+ * variable in_hot_standby changes only when we transmit a new value to
+ * the client.
+ */
+ return RecoveryInProgress() ? "on" : "off";
+}
+
+/*
+ * We split the input string, where commas separate function names
+ * and certain whitespace chars are ignored, into a \0-separated (and
+ * \0\0-terminated) list of function names. This formulation allows
+ * easy scanning when an error is thrown while avoiding the use of
+ * non-reentrant strtok(), as well as keeping the output data in a
+ * single palloc() chunk.
+ */
+static bool
+check_backtrace_functions(char **newval, void **extra, GucSource source)
+{
+ int newvallen = strlen(*newval);
+ char *someval;
+ int validlen;
+ int i;
+ int j;
+
+ /*
+ * Allow characters that can be C identifiers and commas as separators, as
+ * well as some whitespace for readability.
+ */
+ validlen = strspn(*newval,
+ "0123456789_"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ ", \n\t");
+ if (validlen != newvallen)
+ {
+ GUC_check_errdetail("invalid character");
+ return false;
+ }
+
+ if (*newval[0] == '\0')
+ {
+ *extra = NULL;
+ return true;
+ }
+
+ /*
+ * Allocate space for the output and create the copy. We could discount
+ * whitespace chars to save some memory, but it doesn't seem worth the
+ * trouble.
+ */
+ someval = guc_malloc(ERROR, newvallen + 1 + 1);
+ for (i = 0, j = 0; i < newvallen; i++)
+ {
+ if ((*newval)[i] == ',')
+ someval[j++] = '\0'; /* next item */
+ else if ((*newval)[i] == ' ' ||
+ (*newval)[i] == '\n' ||
+ (*newval)[i] == '\t')
+ ; /* ignore these */
+ else
+ someval[j++] = (*newval)[i]; /* copy anything else */
+ }
+
+ /* two \0s end the setting */
+ someval[j] = '\0';
+ someval[j + 1] = '\0';
+
+ *extra = someval;
+ return true;
+}
+
+static void
+assign_backtrace_functions(const char *newval, void *extra)
+{
+ backtrace_symbol_list = (char *) extra;
+}
+
+static bool
+check_recovery_target_timeline(char **newval, void **extra, GucSource source)
+{
+ RecoveryTargetTimeLineGoal rttg;
+ RecoveryTargetTimeLineGoal *myextra;
+
+ if (strcmp(*newval, "current") == 0)
+ rttg = RECOVERY_TARGET_TIMELINE_CONTROLFILE;
+ else if (strcmp(*newval, "latest") == 0)
+ rttg = RECOVERY_TARGET_TIMELINE_LATEST;
+ else
+ {
+ rttg = RECOVERY_TARGET_TIMELINE_NUMERIC;
+
+ errno = 0;
+ strtoul(*newval, NULL, 0);
+ if (errno == EINVAL || errno == ERANGE)
+ {
+ GUC_check_errdetail("recovery_target_timeline is not a valid number.");
+ return false;
+ }
+ }
+
+ myextra = (RecoveryTargetTimeLineGoal *) guc_malloc(ERROR, sizeof(RecoveryTargetTimeLineGoal));
+ *myextra = rttg;
+ *extra = (void *) myextra;
+
+ return true;
+}
+
+static void
+assign_recovery_target_timeline(const char *newval, void *extra)
+{
+ recoveryTargetTimeLineGoal = *((RecoveryTargetTimeLineGoal *) extra);
+ if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_NUMERIC)
+ recoveryTargetTLIRequested = (TimeLineID) strtoul(newval, NULL, 0);
+ else
+ recoveryTargetTLIRequested = 0;
+}
+
+/*
+ * Recovery target settings: Only one of the several recovery_target* settings
+ * may be set. Setting a second one results in an error. The global variable
+ * recoveryTarget tracks which kind of recovery target was chosen. Other
+ * variables store the actual target value (for example a string or a xid).
+ * The assign functions of the parameters check whether a competing parameter
+ * was already set. But we want to allow setting the same parameter multiple
+ * times. We also want to allow unsetting a parameter and setting a different
+ * one, so we unset recoveryTarget when the parameter is set to an empty
+ * string.
+ */
+
+static void
+pg_attribute_noreturn()
+error_multiple_recovery_targets(void)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("multiple recovery targets specified"),
+ errdetail("At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set.")));
+}
+
+static bool
+check_recovery_target(char **newval, void **extra, GucSource source)
+{
+ if (strcmp(*newval, "immediate") != 0 && strcmp(*newval, "") != 0)
+ {
+ GUC_check_errdetail("The only allowed value is \"immediate\".");
+ return false;
+ }
+ return true;
+}
+
+static void
+assign_recovery_target(const char *newval, void *extra)
+{
+ if (recoveryTarget != RECOVERY_TARGET_UNSET &&
+ recoveryTarget != RECOVERY_TARGET_IMMEDIATE)
+ error_multiple_recovery_targets();
+
+ if (newval && strcmp(newval, "") != 0)
+ recoveryTarget = RECOVERY_TARGET_IMMEDIATE;
+ else
+ recoveryTarget = RECOVERY_TARGET_UNSET;
+}
+
+static bool
+check_recovery_target_xid(char **newval, void **extra, GucSource source)
+{
+ if (strcmp(*newval, "") != 0)
+ {
+ TransactionId xid;
+ TransactionId *myextra;
+
+ errno = 0;
+ xid = (TransactionId) strtou64(*newval, NULL, 0);
+ if (errno == EINVAL || errno == ERANGE)
+ return false;
+
+ myextra = (TransactionId *) guc_malloc(ERROR, sizeof(TransactionId));
+ *myextra = xid;
+ *extra = (void *) myextra;
+ }
+ return true;
+}
+
+static void
+assign_recovery_target_xid(const char *newval, void *extra)
+{
+ if (recoveryTarget != RECOVERY_TARGET_UNSET &&
+ recoveryTarget != RECOVERY_TARGET_XID)
+ error_multiple_recovery_targets();
+
+ if (newval && strcmp(newval, "") != 0)
+ {
+ recoveryTarget = RECOVERY_TARGET_XID;
+ recoveryTargetXid = *((TransactionId *) extra);
+ }
+ else
+ recoveryTarget = RECOVERY_TARGET_UNSET;
+}
+
+/*
+ * The interpretation of the recovery_target_time string can depend on the
+ * time zone setting, so we need to wait until after all GUC processing is
+ * done before we can do the final parsing of the string. This check function
+ * only does a parsing pass to catch syntax errors, but we store the string
+ * and parse it again when we need to use it.
+ */
+static bool
+check_recovery_target_time(char **newval, void **extra, GucSource source)
+{
+ if (strcmp(*newval, "") != 0)
+ {
+ /* reject some special values */
+ if (strcmp(*newval, "now") == 0 ||
+ strcmp(*newval, "today") == 0 ||
+ strcmp(*newval, "tomorrow") == 0 ||
+ strcmp(*newval, "yesterday") == 0)
+ {
+ return false;
+ }
+
+ /*
+ * parse timestamp value (see also timestamptz_in())
+ */
+ {
+ char *str = *newval;
+ fsec_t fsec;
+ struct pg_tm tt,
+ *tm = &tt;
+ int tz;
+ int dtype;
+ int nf;
+ int dterr;
+ char *field[MAXDATEFIELDS];
+ int ftype[MAXDATEFIELDS];
+ char workbuf[MAXDATELEN + MAXDATEFIELDS];
+ TimestampTz timestamp;
+
+ dterr = ParseDateTime(str, workbuf, sizeof(workbuf),
+ field, ftype, MAXDATEFIELDS, &nf);
+ if (dterr == 0)
+ dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz);
+ if (dterr != 0)
+ return false;
+ if (dtype != DTK_DATE)
+ return false;
+
+ if (tm2timestamp(tm, fsec, &tz, &timestamp) != 0)
+ {
+ GUC_check_errdetail("timestamp out of range: \"%s\"", str);
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+static void
+assign_recovery_target_time(const char *newval, void *extra)
+{
+ if (recoveryTarget != RECOVERY_TARGET_UNSET &&
+ recoveryTarget != RECOVERY_TARGET_TIME)
+ error_multiple_recovery_targets();
+
+ if (newval && strcmp(newval, "") != 0)
+ recoveryTarget = RECOVERY_TARGET_TIME;
+ else
+ recoveryTarget = RECOVERY_TARGET_UNSET;
+}
+
+static bool
+check_recovery_target_name(char **newval, void **extra, GucSource source)
+{
+ /* Use the value of newval directly */
+ if (strlen(*newval) >= MAXFNAMELEN)
+ {
+ GUC_check_errdetail("%s is too long (maximum %d characters).",
+ "recovery_target_name", MAXFNAMELEN - 1);
+ return false;
+ }
+ return true;
+}
+
+static void
+assign_recovery_target_name(const char *newval, void *extra)
+{
+ if (recoveryTarget != RECOVERY_TARGET_UNSET &&
+ recoveryTarget != RECOVERY_TARGET_NAME)
+ error_multiple_recovery_targets();
+
+ if (newval && strcmp(newval, "") != 0)
+ {
+ recoveryTarget = RECOVERY_TARGET_NAME;
+ recoveryTargetName = newval;
+ }
+ else
+ recoveryTarget = RECOVERY_TARGET_UNSET;
+}
+
+static bool
+check_recovery_target_lsn(char **newval, void **extra, GucSource source)
+{
+ if (strcmp(*newval, "") != 0)
+ {
+ XLogRecPtr lsn;
+ XLogRecPtr *myextra;
+ bool have_error = false;
+
+ lsn = pg_lsn_in_internal(*newval, &have_error);
+ if (have_error)
+ return false;
+
+ myextra = (XLogRecPtr *) guc_malloc(ERROR, sizeof(XLogRecPtr));
+ *myextra = lsn;
+ *extra = (void *) myextra;
+ }
+ return true;
+}
+
+static void
+assign_recovery_target_lsn(const char *newval, void *extra)
+{
+ if (recoveryTarget != RECOVERY_TARGET_UNSET &&
+ recoveryTarget != RECOVERY_TARGET_LSN)
+ error_multiple_recovery_targets();
+
+ if (newval && strcmp(newval, "") != 0)
+ {
+ recoveryTarget = RECOVERY_TARGET_LSN;
+ recoveryTargetLSN = *((XLogRecPtr *) extra);
+ }
+ else
+ recoveryTarget = RECOVERY_TARGET_UNSET;
+}
+
+static bool
+check_primary_slot_name(char **newval, void **extra, GucSource source)
+{
+ if (*newval && strcmp(*newval, "") != 0 &&
+ !ReplicationSlotValidateName(*newval, WARNING))
+ return false;
+
+ return true;
+}
+
+static bool
+check_default_with_oids(bool *newval, void **extra, GucSource source)
+{
+ if (*newval)
+ {
+ /* check the GUC's definition for an explanation */
+ GUC_check_errcode(ERRCODE_FEATURE_NOT_SUPPORTED);
+ GUC_check_errmsg("tables declared WITH OIDS are not supported");
+
+ return false;
+ }
+
+ return true;
+}
+
+#include "guc-file.c"
diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c
new file mode 100644
index 0000000..61c83f3
--- /dev/null
+++ b/src/backend/utils/misc/help_config.c
@@ -0,0 +1,137 @@
+/*-------------------------------------------------------------------------
+ * help_config.c
+ *
+ * Displays available options under grand unified configuration scheme
+ *
+ * Options whose flag bits are set to GUC_NO_SHOW_ALL, GUC_NOT_IN_SAMPLE,
+ * or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically
+ * requests that variable by name
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/help_config.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <limits.h>
+#include <unistd.h>
+
+#include "utils/guc_tables.h"
+#include "utils/help_config.h"
+
+
+/*
+ * This union allows us to mix the numerous different types of structs
+ * that we are organizing.
+ */
+typedef union
+{
+ struct config_generic generic;
+ struct config_bool _bool;
+ struct config_real real;
+ struct config_int integer;
+ struct config_string string;
+ struct config_enum _enum;
+} mixedStruct;
+
+
+static void printMixedStruct(mixedStruct *structToPrint);
+static bool displayStruct(mixedStruct *structToDisplay);
+
+
+void
+GucInfoMain(void)
+{
+ struct config_generic **guc_vars;
+ int numOpts,
+ i;
+
+ /* Initialize the guc_variables[] array */
+ build_guc_variables();
+
+ guc_vars = get_guc_variables();
+ numOpts = GetNumConfigOptions();
+
+ for (i = 0; i < numOpts; i++)
+ {
+ mixedStruct *var = (mixedStruct *) guc_vars[i];
+
+ if (displayStruct(var))
+ printMixedStruct(var);
+ }
+
+ exit(0);
+}
+
+
+/*
+ * This function will return true if the struct passed to it
+ * should be displayed to the user.
+ */
+static bool
+displayStruct(mixedStruct *structToDisplay)
+{
+ return !(structToDisplay->generic.flags & (GUC_NO_SHOW_ALL |
+ GUC_NOT_IN_SAMPLE |
+ GUC_DISALLOW_IN_FILE));
+}
+
+
+/*
+ * This function prints out the generic struct passed to it. It will print out
+ * a different format, depending on what the user wants to see.
+ */
+static void
+printMixedStruct(mixedStruct *structToPrint)
+{
+ printf("%s\t%s\t%s\t",
+ structToPrint->generic.name,
+ GucContext_Names[structToPrint->generic.context],
+ _(config_group_names[structToPrint->generic.group]));
+
+ switch (structToPrint->generic.vartype)
+ {
+
+ case PGC_BOOL:
+ printf("BOOLEAN\t%s\t\t\t",
+ (structToPrint->_bool.reset_val == 0) ?
+ "FALSE" : "TRUE");
+ break;
+
+ case PGC_INT:
+ printf("INTEGER\t%d\t%d\t%d\t",
+ structToPrint->integer.reset_val,
+ structToPrint->integer.min,
+ structToPrint->integer.max);
+ break;
+
+ case PGC_REAL:
+ printf("REAL\t%g\t%g\t%g\t",
+ structToPrint->real.reset_val,
+ structToPrint->real.min,
+ structToPrint->real.max);
+ break;
+
+ case PGC_STRING:
+ printf("STRING\t%s\t\t\t",
+ structToPrint->string.boot_val ? structToPrint->string.boot_val : "");
+ break;
+
+ case PGC_ENUM:
+ printf("ENUM\t%s\t\t\t",
+ config_enum_lookup_by_value(&structToPrint->_enum,
+ structToPrint->_enum.boot_val));
+ break;
+
+ default:
+ write_stderr("internal error: unrecognized run-time parameter type\n");
+ break;
+ }
+
+ printf("%s\t%s\n",
+ (structToPrint->generic.short_desc == NULL) ? "" : _(structToPrint->generic.short_desc),
+ (structToPrint->generic.long_desc == NULL) ? "" : _(structToPrint->generic.long_desc));
+}
diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c
new file mode 100644
index 0000000..5819653
--- /dev/null
+++ b/src/backend/utils/misc/pg_config.c
@@ -0,0 +1,51 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_config.c
+ * Expose same output as pg_config except as an SRF
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/pg_config.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/pg_type.h"
+#include "common/config_info.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "port.h"
+#include "utils/builtins.h"
+
+Datum
+pg_config(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ ConfigData *configdata;
+ size_t configdata_len;
+ int i = 0;
+
+ /* initialize our tuplestore */
+ InitMaterializedSRF(fcinfo, 0);
+
+ configdata = get_configdata(my_exec_path, &configdata_len);
+ for (i = 0; i < configdata_len; i++)
+ {
+ Datum values[2];
+ bool nulls[2];
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
+
+ values[0] = CStringGetTextDatum(configdata[i].name);
+ values[1] = CStringGetTextDatum(configdata[i].setting);
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ return (Datum) 0;
+}
diff --git a/src/backend/utils/misc/pg_controldata.c b/src/backend/utils/misc/pg_controldata.c
new file mode 100644
index 0000000..fe52cff
--- /dev/null
+++ b/src/backend/utils/misc/pg_controldata.c
@@ -0,0 +1,353 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_controldata.c
+ *
+ * Routines to expose the contents of the control data file via
+ * a set of SQL functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/pg_controldata.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/transam.h"
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "catalog/pg_control.h"
+#include "catalog/pg_type.h"
+#include "common/controldata_utils.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "storage/lwlock.h"
+#include "utils/builtins.h"
+#include "utils/pg_lsn.h"
+#include "utils/timestamp.h"
+
+Datum
+pg_control_system(PG_FUNCTION_ARGS)
+{
+ Datum values[4];
+ bool nulls[4];
+ TupleDesc tupdesc;
+ HeapTuple htup;
+ ControlFileData *ControlFile;
+ bool crc_ok;
+
+ /*
+ * Construct a tuple descriptor for the result row. This must match this
+ * function's pg_proc entry!
+ */
+ tupdesc = CreateTemplateTupleDesc(4);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "pg_control_version",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "catalog_version_no",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "system_identifier",
+ INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "pg_control_last_modified",
+ TIMESTAMPTZOID, -1, 0);
+ tupdesc = BlessTupleDesc(tupdesc);
+
+ /* read the control file */
+ LWLockAcquire(ControlFileLock, LW_SHARED);
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ LWLockRelease(ControlFileLock);
+ if (!crc_ok)
+ ereport(ERROR,
+ (errmsg("calculated CRC checksum does not match value stored in file")));
+
+ values[0] = Int32GetDatum(ControlFile->pg_control_version);
+ nulls[0] = false;
+
+ values[1] = Int32GetDatum(ControlFile->catalog_version_no);
+ nulls[1] = false;
+
+ values[2] = Int64GetDatum(ControlFile->system_identifier);
+ nulls[2] = false;
+
+ values[3] = TimestampTzGetDatum(time_t_to_timestamptz(ControlFile->time));
+ nulls[3] = false;
+
+ htup = heap_form_tuple(tupdesc, values, nulls);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(htup));
+}
+
+Datum
+pg_control_checkpoint(PG_FUNCTION_ARGS)
+{
+ Datum values[18];
+ bool nulls[18];
+ TupleDesc tupdesc;
+ HeapTuple htup;
+ ControlFileData *ControlFile;
+ XLogSegNo segno;
+ char xlogfilename[MAXFNAMELEN];
+ bool crc_ok;
+
+ /*
+ * Construct a tuple descriptor for the result row. This must match this
+ * function's pg_proc entry!
+ */
+ tupdesc = CreateTemplateTupleDesc(18);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "checkpoint_lsn",
+ PG_LSNOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "redo_lsn",
+ PG_LSNOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "redo_wal_file",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "timeline_id",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "prev_timeline_id",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "full_page_writes",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "next_xid",
+ TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "next_oid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "next_multixact_id",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "next_multi_offset",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 11, "oldest_xid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 12, "oldest_xid_dbid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 13, "oldest_active_xid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 14, "oldest_multi_xid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 15, "oldest_multi_dbid",
+ OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 16, "oldest_commit_ts_xid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 17, "newest_commit_ts_xid",
+ XIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 18, "checkpoint_time",
+ TIMESTAMPTZOID, -1, 0);
+ tupdesc = BlessTupleDesc(tupdesc);
+
+ /* Read the control file. */
+ LWLockAcquire(ControlFileLock, LW_SHARED);
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ LWLockRelease(ControlFileLock);
+ if (!crc_ok)
+ ereport(ERROR,
+ (errmsg("calculated CRC checksum does not match value stored in file")));
+
+ /*
+ * Calculate name of the WAL file containing the latest checkpoint's REDO
+ * start point.
+ */
+ XLByteToSeg(ControlFile->checkPointCopy.redo, segno, wal_segment_size);
+ XLogFileName(xlogfilename, ControlFile->checkPointCopy.ThisTimeLineID,
+ segno, wal_segment_size);
+
+ /* Populate the values and null arrays */
+ values[0] = LSNGetDatum(ControlFile->checkPoint);
+ nulls[0] = false;
+
+ values[1] = LSNGetDatum(ControlFile->checkPointCopy.redo);
+ nulls[1] = false;
+
+ values[2] = CStringGetTextDatum(xlogfilename);
+ nulls[2] = false;
+
+ values[3] = Int32GetDatum(ControlFile->checkPointCopy.ThisTimeLineID);
+ nulls[3] = false;
+
+ values[4] = Int32GetDatum(ControlFile->checkPointCopy.PrevTimeLineID);
+ nulls[4] = false;
+
+ values[5] = BoolGetDatum(ControlFile->checkPointCopy.fullPageWrites);
+ nulls[5] = false;
+
+ values[6] = CStringGetTextDatum(psprintf("%u:%u",
+ EpochFromFullTransactionId(ControlFile->checkPointCopy.nextXid),
+ XidFromFullTransactionId(ControlFile->checkPointCopy.nextXid)));
+ nulls[6] = false;
+
+ values[7] = ObjectIdGetDatum(ControlFile->checkPointCopy.nextOid);
+ nulls[7] = false;
+
+ values[8] = TransactionIdGetDatum(ControlFile->checkPointCopy.nextMulti);
+ nulls[8] = false;
+
+ values[9] = TransactionIdGetDatum(ControlFile->checkPointCopy.nextMultiOffset);
+ nulls[9] = false;
+
+ values[10] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestXid);
+ nulls[10] = false;
+
+ values[11] = ObjectIdGetDatum(ControlFile->checkPointCopy.oldestXidDB);
+ nulls[11] = false;
+
+ values[12] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestActiveXid);
+ nulls[12] = false;
+
+ values[13] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestMulti);
+ nulls[13] = false;
+
+ values[14] = ObjectIdGetDatum(ControlFile->checkPointCopy.oldestMultiDB);
+ nulls[14] = false;
+
+ values[15] = TransactionIdGetDatum(ControlFile->checkPointCopy.oldestCommitTsXid);
+ nulls[15] = false;
+
+ values[16] = TransactionIdGetDatum(ControlFile->checkPointCopy.newestCommitTsXid);
+ nulls[16] = false;
+
+ values[17] = TimestampTzGetDatum(time_t_to_timestamptz(ControlFile->checkPointCopy.time));
+ nulls[17] = false;
+
+ htup = heap_form_tuple(tupdesc, values, nulls);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(htup));
+}
+
+Datum
+pg_control_recovery(PG_FUNCTION_ARGS)
+{
+ Datum values[5];
+ bool nulls[5];
+ TupleDesc tupdesc;
+ HeapTuple htup;
+ ControlFileData *ControlFile;
+ bool crc_ok;
+
+ /*
+ * Construct a tuple descriptor for the result row. This must match this
+ * function's pg_proc entry!
+ */
+ tupdesc = CreateTemplateTupleDesc(5);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "min_recovery_end_lsn",
+ PG_LSNOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "min_recovery_end_timeline",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "backup_start_lsn",
+ PG_LSNOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "backup_end_lsn",
+ PG_LSNOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "end_of_backup_record_required",
+ BOOLOID, -1, 0);
+ tupdesc = BlessTupleDesc(tupdesc);
+
+ /* read the control file */
+ LWLockAcquire(ControlFileLock, LW_SHARED);
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ LWLockRelease(ControlFileLock);
+ if (!crc_ok)
+ ereport(ERROR,
+ (errmsg("calculated CRC checksum does not match value stored in file")));
+
+ values[0] = LSNGetDatum(ControlFile->minRecoveryPoint);
+ nulls[0] = false;
+
+ values[1] = Int32GetDatum(ControlFile->minRecoveryPointTLI);
+ nulls[1] = false;
+
+ values[2] = LSNGetDatum(ControlFile->backupStartPoint);
+ nulls[2] = false;
+
+ values[3] = LSNGetDatum(ControlFile->backupEndPoint);
+ nulls[3] = false;
+
+ values[4] = BoolGetDatum(ControlFile->backupEndRequired);
+ nulls[4] = false;
+
+ htup = heap_form_tuple(tupdesc, values, nulls);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(htup));
+}
+
+Datum
+pg_control_init(PG_FUNCTION_ARGS)
+{
+ Datum values[11];
+ bool nulls[11];
+ TupleDesc tupdesc;
+ HeapTuple htup;
+ ControlFileData *ControlFile;
+ bool crc_ok;
+
+ /*
+ * Construct a tuple descriptor for the result row. This must match this
+ * function's pg_proc entry!
+ */
+ tupdesc = CreateTemplateTupleDesc(11);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "max_data_alignment",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "database_block_size",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "blocks_per_segment",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "wal_block_size",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "bytes_per_wal_segment",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "max_identifier_length",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "max_index_columns",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 8, "max_toast_chunk_size",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 9, "large_object_chunk_size",
+ INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 10, "float8_pass_by_value",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 11, "data_page_checksum_version",
+ INT4OID, -1, 0);
+ tupdesc = BlessTupleDesc(tupdesc);
+
+ /* read the control file */
+ LWLockAcquire(ControlFileLock, LW_SHARED);
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ LWLockRelease(ControlFileLock);
+ if (!crc_ok)
+ ereport(ERROR,
+ (errmsg("calculated CRC checksum does not match value stored in file")));
+
+ values[0] = Int32GetDatum(ControlFile->maxAlign);
+ nulls[0] = false;
+
+ values[1] = Int32GetDatum(ControlFile->blcksz);
+ nulls[1] = false;
+
+ values[2] = Int32GetDatum(ControlFile->relseg_size);
+ nulls[2] = false;
+
+ values[3] = Int32GetDatum(ControlFile->xlog_blcksz);
+ nulls[3] = false;
+
+ values[4] = Int32GetDatum(ControlFile->xlog_seg_size);
+ nulls[4] = false;
+
+ values[5] = Int32GetDatum(ControlFile->nameDataLen);
+ nulls[5] = false;
+
+ values[6] = Int32GetDatum(ControlFile->indexMaxKeys);
+ nulls[6] = false;
+
+ values[7] = Int32GetDatum(ControlFile->toast_max_chunk_size);
+ nulls[7] = false;
+
+ values[8] = Int32GetDatum(ControlFile->loblksize);
+ nulls[8] = false;
+
+ values[9] = BoolGetDatum(ControlFile->float8ByVal);
+ nulls[9] = false;
+
+ values[10] = Int32GetDatum(ControlFile->data_checksum_version);
+ nulls[10] = false;
+
+ htup = heap_form_tuple(tupdesc, values, nulls);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(htup));
+}
diff --git a/src/backend/utils/misc/pg_rusage.c b/src/backend/utils/misc/pg_rusage.c
new file mode 100644
index 0000000..e60703c
--- /dev/null
+++ b/src/backend/utils/misc/pg_rusage.c
@@ -0,0 +1,73 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_rusage.c
+ * Resource usage measurement support routines.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/pg_rusage.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <unistd.h>
+
+#include "utils/pg_rusage.h"
+
+
+/*
+ * Initialize usage snapshot.
+ */
+void
+pg_rusage_init(PGRUsage *ru0)
+{
+ getrusage(RUSAGE_SELF, &ru0->ru);
+ gettimeofday(&ru0->tv, NULL);
+}
+
+/*
+ * Compute elapsed time since ru0 usage snapshot, and format into
+ * a displayable string. Result is in a static string, which is
+ * tacky, but no one ever claimed that the Postgres backend is
+ * threadable...
+ */
+const char *
+pg_rusage_show(const PGRUsage *ru0)
+{
+ static char result[100];
+ PGRUsage ru1;
+
+ pg_rusage_init(&ru1);
+
+ if (ru1.tv.tv_usec < ru0->tv.tv_usec)
+ {
+ ru1.tv.tv_sec--;
+ ru1.tv.tv_usec += 1000000;
+ }
+ if (ru1.ru.ru_stime.tv_usec < ru0->ru.ru_stime.tv_usec)
+ {
+ ru1.ru.ru_stime.tv_sec--;
+ ru1.ru.ru_stime.tv_usec += 1000000;
+ }
+ if (ru1.ru.ru_utime.tv_usec < ru0->ru.ru_utime.tv_usec)
+ {
+ ru1.ru.ru_utime.tv_sec--;
+ ru1.ru.ru_utime.tv_usec += 1000000;
+ }
+
+ snprintf(result, sizeof(result),
+ _("CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s"),
+ (int) (ru1.ru.ru_utime.tv_sec - ru0->ru.ru_utime.tv_sec),
+ (int) (ru1.ru.ru_utime.tv_usec - ru0->ru.ru_utime.tv_usec) / 10000,
+ (int) (ru1.ru.ru_stime.tv_sec - ru0->ru.ru_stime.tv_sec),
+ (int) (ru1.ru.ru_stime.tv_usec - ru0->ru.ru_stime.tv_usec) / 10000,
+ (int) (ru1.tv.tv_sec - ru0->tv.tv_sec),
+ (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000);
+
+ return result;
+}
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
new file mode 100644
index 0000000..f92ff4c
--- /dev/null
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -0,0 +1,813 @@
+# -----------------------------
+# PostgreSQL configuration file
+# -----------------------------
+#
+# This file consists of lines of the form:
+#
+# name = value
+#
+# (The "=" is optional.) Whitespace may be used. Comments are introduced with
+# "#" anywhere on a line. The complete list of parameter names and allowed
+# values can be found in the PostgreSQL documentation.
+#
+# The commented-out settings shown in this file represent the default values.
+# Re-commenting a setting is NOT sufficient to revert it to the default value;
+# you need to reload the server.
+#
+# This file is read on server startup and when the server receives a SIGHUP
+# signal. If you edit the file on a running system, you have to SIGHUP the
+# server for the changes to take effect, run "pg_ctl reload", or execute
+# "SELECT pg_reload_conf()". Some parameters, which are marked below,
+# require a server shutdown and restart to take effect.
+#
+# Any parameter can also be given as a command-line option to the server, e.g.,
+# "postgres -c log_connections=on". Some parameters can be changed at run time
+# with the "SET" SQL command.
+#
+# Memory units: B = bytes Time units: us = microseconds
+# kB = kilobytes ms = milliseconds
+# MB = megabytes s = seconds
+# GB = gigabytes min = minutes
+# TB = terabytes h = hours
+# d = days
+
+
+#------------------------------------------------------------------------------
+# FILE LOCATIONS
+#------------------------------------------------------------------------------
+
+# The default values of these variables are driven from the -D command-line
+# option or PGDATA environment variable, represented here as ConfigDir.
+
+#data_directory = 'ConfigDir' # use data in another directory
+ # (change requires restart)
+#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
+ # (change requires restart)
+#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
+ # (change requires restart)
+
+# If external_pid_file is not explicitly set, no extra PID file is written.
+#external_pid_file = '' # write an extra PID file
+ # (change requires restart)
+
+
+#------------------------------------------------------------------------------
+# CONNECTIONS AND AUTHENTICATION
+#------------------------------------------------------------------------------
+
+# - Connection Settings -
+
+#listen_addresses = 'localhost' # what IP address(es) to listen on;
+ # comma-separated list of addresses;
+ # defaults to 'localhost'; use '*' for all
+ # (change requires restart)
+#port = 5432 # (change requires restart)
+#max_connections = 100 # (change requires restart)
+#superuser_reserved_connections = 3 # (change requires restart)
+#unix_socket_directories = '/tmp' # comma-separated list of directories
+ # (change requires restart)
+#unix_socket_group = '' # (change requires restart)
+#unix_socket_permissions = 0777 # begin with 0 to use octal notation
+ # (change requires restart)
+#bonjour = off # advertise server via Bonjour
+ # (change requires restart)
+#bonjour_name = '' # defaults to the computer name
+ # (change requires restart)
+
+# - TCP settings -
+# see "man tcp" for details
+
+#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_count = 0 # TCP_KEEPCNT;
+ # 0 selects the system default
+#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds;
+ # 0 selects the system default
+
+#client_connection_check_interval = 0 # time between checks for client
+ # disconnection while running queries;
+ # 0 for never
+
+# - Authentication -
+
+#authentication_timeout = 1min # 1s-600s
+#password_encryption = scram-sha-256 # scram-sha-256 or md5
+#db_user_namespace = off
+
+# GSSAPI using Kerberos
+#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab'
+#krb_caseins_users = off
+
+# - SSL -
+
+#ssl = off
+#ssl_ca_file = ''
+#ssl_cert_file = 'server.crt'
+#ssl_crl_file = ''
+#ssl_crl_dir = ''
+#ssl_key_file = 'server.key'
+#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
+#ssl_prefer_server_ciphers = on
+#ssl_ecdh_curve = 'prime256v1'
+#ssl_min_protocol_version = 'TLSv1.2'
+#ssl_max_protocol_version = ''
+#ssl_dh_params_file = ''
+#ssl_passphrase_command = ''
+#ssl_passphrase_command_supports_reload = off
+
+
+#------------------------------------------------------------------------------
+# RESOURCE USAGE (except WAL)
+#------------------------------------------------------------------------------
+
+# - Memory -
+
+#shared_buffers = 128MB # min 128kB
+ # (change requires restart)
+#huge_pages = try # on, off, or try
+ # (change requires restart)
+#huge_page_size = 0 # zero for system default
+ # (change requires restart)
+#temp_buffers = 8MB # min 800kB
+#max_prepared_transactions = 0 # zero disables the feature
+ # (change requires restart)
+# Caution: it is not advisable to set max_prepared_transactions nonzero unless
+# you actively intend to use prepared transactions.
+#work_mem = 4MB # min 64kB
+#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem
+#maintenance_work_mem = 64MB # min 1MB
+#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem
+#logical_decoding_work_mem = 64MB # min 64kB
+#max_stack_depth = 2MB # min 100kB
+#shared_memory_type = mmap # the default is the first option
+ # supported by the operating system:
+ # mmap
+ # sysv
+ # windows
+ # (change requires restart)
+#dynamic_shared_memory_type = posix # the default is usually the first option
+ # supported by the operating system:
+ # posix
+ # sysv
+ # windows
+ # mmap
+ # (change requires restart)
+#min_dynamic_shared_memory = 0MB # (change requires restart)
+
+# - Disk -
+
+#temp_file_limit = -1 # limits per-process temp file space
+ # in kilobytes, or -1 for no limit
+
+# - Kernel Resources -
+
+#max_files_per_process = 1000 # min 64
+ # (change requires restart)
+
+# - Cost-Based Vacuum Delay -
+
+#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
+#vacuum_cost_page_hit = 1 # 0-10000 credits
+#vacuum_cost_page_miss = 2 # 0-10000 credits
+#vacuum_cost_page_dirty = 20 # 0-10000 credits
+#vacuum_cost_limit = 200 # 1-10000 credits
+
+# - Background Writer -
+
+#bgwriter_delay = 200ms # 10-10000ms between rounds
+#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables
+#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round
+#bgwriter_flush_after = 0 # measured in pages, 0 disables
+
+# - Asynchronous Behavior -
+
+#backend_flush_after = 0 # measured in pages, 0 disables
+#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching
+#maintenance_io_concurrency = 10 # 1-1000; 0 disables prefetching
+#max_worker_processes = 8 # (change requires restart)
+#max_parallel_workers_per_gather = 2 # taken from max_parallel_workers
+#max_parallel_maintenance_workers = 2 # taken from max_parallel_workers
+#max_parallel_workers = 8 # maximum number of max_worker_processes that
+ # can be used in parallel operations
+#parallel_leader_participation = on
+#old_snapshot_threshold = -1 # 1min-60d; -1 disables; 0 is immediate
+ # (change requires restart)
+
+
+#------------------------------------------------------------------------------
+# WRITE-AHEAD LOG
+#------------------------------------------------------------------------------
+
+# - Settings -
+
+#wal_level = replica # minimal, replica, or logical
+ # (change requires restart)
+#fsync = on # flush data to disk for crash safety
+ # (turning this off can cause
+ # unrecoverable data corruption)
+#synchronous_commit = on # synchronization level;
+ # off, local, remote_write, remote_apply, or on
+#wal_sync_method = fsync # the default is the first option
+ # supported by the operating system:
+ # open_datasync
+ # fdatasync (default on Linux and FreeBSD)
+ # fsync
+ # fsync_writethrough
+ # open_sync
+#full_page_writes = on # recover from partial page writes
+#wal_log_hints = off # also do full page writes of non-critical updates
+ # (change requires restart)
+#wal_compression = off # enables compression of full-page writes;
+ # off, pglz, lz4, zstd, or on
+#wal_init_zero = on # zero-fill new WAL files
+#wal_recycle = on # recycle WAL files
+#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
+ # (change requires restart)
+#wal_writer_delay = 200ms # 1-10000 milliseconds
+#wal_writer_flush_after = 1MB # measured in pages, 0 disables
+#wal_skip_threshold = 2MB
+
+#commit_delay = 0 # range 0-100000, in microseconds
+#commit_siblings = 5 # range 1-1000
+
+# - Checkpoints -
+
+#checkpoint_timeout = 5min # range 30s-1d
+#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
+#checkpoint_flush_after = 0 # measured in pages, 0 disables
+#checkpoint_warning = 30s # 0 disables
+#max_wal_size = 1GB
+#min_wal_size = 80MB
+
+# - Prefetching during recovery -
+
+#recovery_prefetch = try # prefetch pages referenced in the WAL?
+#wal_decode_buffer_size = 512kB # lookahead window used for prefetching
+ # (change requires restart)
+
+# - Archiving -
+
+#archive_mode = off # enables archiving; off, on, or always
+ # (change requires restart)
+#archive_library = '' # library to use to archive a logfile segment
+ # (empty string indicates archive_command should
+ # be used)
+#archive_command = '' # command to use to archive a logfile segment
+ # placeholders: %p = path of file to archive
+ # %f = file name only
+ # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
+#archive_timeout = 0 # force a logfile segment switch after this
+ # number of seconds; 0 disables
+
+# - Archive Recovery -
+
+# These are only used in recovery mode.
+
+#restore_command = '' # command to use to restore an archived logfile segment
+ # placeholders: %p = path of file to restore
+ # %f = file name only
+ # e.g. 'cp /mnt/server/archivedir/%f %p'
+#archive_cleanup_command = '' # command to execute at every restartpoint
+#recovery_end_command = '' # command to execute at completion of recovery
+
+# - Recovery Target -
+
+# Set these only when performing a targeted recovery.
+
+#recovery_target = '' # 'immediate' to end recovery as soon as a
+ # consistent state is reached
+ # (change requires restart)
+#recovery_target_name = '' # the named restore point to which recovery will proceed
+ # (change requires restart)
+#recovery_target_time = '' # the time stamp up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_inclusive = on # Specifies whether to stop:
+ # just after the specified recovery target (on)
+ # just before the recovery target (off)
+ # (change requires restart)
+#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID
+ # (change requires restart)
+#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
+ # (change requires restart)
+
+
+#------------------------------------------------------------------------------
+# REPLICATION
+#------------------------------------------------------------------------------
+
+# - Sending Servers -
+
+# Set these on the primary and on any standby that will send replication data.
+
+#max_wal_senders = 10 # max number of walsender processes
+ # (change requires restart)
+#max_replication_slots = 10 # max number of replication slots
+ # (change requires restart)
+#wal_keep_size = 0 # in megabytes; 0 disables
+#max_slot_wal_keep_size = -1 # in megabytes; -1 disables
+#wal_sender_timeout = 60s # in milliseconds; 0 disables
+#track_commit_timestamp = off # collect timestamp of transaction commit
+ # (change requires restart)
+
+# - Primary Server -
+
+# These settings are ignored on a standby server.
+
+#synchronous_standby_names = '' # standby servers that provide sync rep
+ # method to choose sync standbys, number of sync standbys,
+ # and comma-separated list of application_name
+ # from standby(s); '*' = all
+#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed
+
+# - Standby Servers -
+
+# These settings are ignored on a primary server.
+
+#primary_conninfo = '' # connection string to sending server
+#primary_slot_name = '' # replication slot on sending server
+#promote_trigger_file = '' # file name whose presence ends recovery
+#hot_standby = on # "off" disallows queries during recovery
+ # (change requires restart)
+#max_standby_archive_delay = 30s # max delay before canceling queries
+ # when reading WAL from archive;
+ # -1 allows indefinite delay
+#max_standby_streaming_delay = 30s # max delay before canceling queries
+ # when reading streaming WAL;
+ # -1 allows indefinite delay
+#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name
+ # is not set
+#wal_receiver_status_interval = 10s # send replies at least this often
+ # 0 disables
+#hot_standby_feedback = off # send info from standby to prevent
+ # query conflicts
+#wal_receiver_timeout = 60s # time that receiver waits for
+ # communication from primary
+ # in milliseconds; 0 disables
+#wal_retrieve_retry_interval = 5s # time to wait before retrying to
+ # retrieve WAL after a failed attempt
+#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
+
+# - Subscribers -
+
+# These settings are ignored on a publisher.
+
+#max_logical_replication_workers = 4 # taken from max_worker_processes
+ # (change requires restart)
+#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers
+
+
+#------------------------------------------------------------------------------
+# QUERY TUNING
+#------------------------------------------------------------------------------
+
+# - Planner Method Configuration -
+
+#enable_async_append = on
+#enable_bitmapscan = on
+#enable_gathermerge = on
+#enable_hashagg = on
+#enable_hashjoin = on
+#enable_incremental_sort = on
+#enable_indexscan = on
+#enable_indexonlyscan = on
+#enable_material = on
+#enable_memoize = on
+#enable_mergejoin = on
+#enable_nestloop = on
+#enable_parallel_append = on
+#enable_parallel_hash = on
+#enable_partition_pruning = on
+#enable_partitionwise_join = off
+#enable_partitionwise_aggregate = off
+#enable_seqscan = on
+#enable_sort = on
+#enable_tidscan = on
+
+# - Planner Cost Constants -
+
+#seq_page_cost = 1.0 # measured on an arbitrary scale
+#random_page_cost = 4.0 # same scale as above
+#cpu_tuple_cost = 0.01 # same scale as above
+#cpu_index_tuple_cost = 0.005 # same scale as above
+#cpu_operator_cost = 0.0025 # same scale as above
+#parallel_setup_cost = 1000.0 # same scale as above
+#parallel_tuple_cost = 0.1 # same scale as above
+#min_parallel_table_scan_size = 8MB
+#min_parallel_index_scan_size = 512kB
+#effective_cache_size = 4GB
+
+#jit_above_cost = 100000 # perform JIT compilation if available
+ # and query more expensive than this;
+ # -1 disables
+#jit_inline_above_cost = 500000 # inline small functions if query is
+ # more expensive than this; -1 disables
+#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if
+ # query is more expensive than this;
+ # -1 disables
+
+# - Genetic Query Optimizer -
+
+#geqo = on
+#geqo_threshold = 12
+#geqo_effort = 5 # range 1-10
+#geqo_pool_size = 0 # selects default based on effort
+#geqo_generations = 0 # selects default based on effort
+#geqo_selection_bias = 2.0 # range 1.5-2.0
+#geqo_seed = 0.0 # range 0.0-1.0
+
+# - Other Planner Options -
+
+#default_statistics_target = 100 # range 1-10000
+#constraint_exclusion = partition # on, off, or partition
+#cursor_tuple_fraction = 0.1 # range 0.0-1.0
+#from_collapse_limit = 8
+#jit = on # allow JIT compilation
+#join_collapse_limit = 8 # 1 disables collapsing of explicit
+ # JOIN clauses
+#plan_cache_mode = auto # auto, force_generic_plan or
+ # force_custom_plan
+#recursive_worktable_factor = 10.0 # range 0.001-1000000
+
+
+#------------------------------------------------------------------------------
+# REPORTING AND LOGGING
+#------------------------------------------------------------------------------
+
+# - Where to Log -
+
+#log_destination = 'stderr' # Valid values are combinations of
+ # stderr, csvlog, jsonlog, syslog, and
+ # eventlog, depending on platform.
+ # csvlog and jsonlog require
+ # logging_collector to be on.
+
+# This is used when logging to stderr:
+#logging_collector = off # Enable capturing of stderr, jsonlog,
+ # and csvlog into log files. Required
+ # to be on for csvlogs and jsonlogs.
+ # (change requires restart)
+
+# These are only used if logging_collector is on:
+#log_directory = 'log' # directory where log files are written,
+ # can be absolute or relative to PGDATA
+#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
+ # can include strftime() escapes
+#log_file_mode = 0600 # creation mode for log files,
+ # begin with 0 to use octal notation
+#log_rotation_age = 1d # Automatic rotation of logfiles will
+ # happen after that time. 0 disables.
+#log_rotation_size = 10MB # Automatic rotation of logfiles will
+ # happen after that much log output.
+ # 0 disables.
+#log_truncate_on_rotation = off # If on, an existing log file with the
+ # same name as the new log file will be
+ # truncated rather than appended to.
+ # But such truncation only occurs on
+ # time-driven rotation, not on restarts
+ # or size-driven rotation. Default is
+ # off, meaning append to existing files
+ # in all cases.
+
+# These are relevant when logging to syslog:
+#syslog_facility = 'LOCAL0'
+#syslog_ident = 'postgres'
+#syslog_sequence_numbers = on
+#syslog_split_messages = on
+
+# This is only relevant when logging to eventlog (Windows):
+# (change requires restart)
+#event_source = 'PostgreSQL'
+
+# - When to Log -
+
+#log_min_messages = warning # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic
+
+#log_min_error_statement = error # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic (effectively off)
+
+#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
+ # and their durations, > 0 logs only
+ # statements running at least this number
+ # of milliseconds
+
+#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements
+ # and their durations, > 0 logs only a sample of
+ # statements running at least this number
+ # of milliseconds;
+ # sample fraction is determined by log_statement_sample_rate
+
+#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding
+ # log_min_duration_sample to be logged;
+ # 1.0 logs all such statements, 0.0 never logs
+
+
+#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements
+ # are logged regardless of their duration; 1.0 logs all
+ # statements from all transactions, 0.0 never logs
+
+#log_startup_progress_interval = 10s # Time between progress updates for
+ # long-running startup operations.
+ # 0 disables the feature, > 0 indicates
+ # the interval in milliseconds.
+
+# - What to Log -
+
+#debug_print_parse = off
+#debug_print_rewritten = off
+#debug_print_plan = off
+#debug_pretty_print = on
+#log_autovacuum_min_duration = 10min # log autovacuum activity;
+ # -1 disables, 0 logs all actions and
+ # their durations, > 0 logs only
+ # actions running at least this number
+ # of milliseconds.
+#log_checkpoints = on
+#log_connections = off
+#log_disconnections = off
+#log_duration = off
+#log_error_verbosity = default # terse, default, or verbose messages
+#log_hostname = off
+#log_line_prefix = '%m [%p] ' # special values:
+ # %a = application name
+ # %u = user name
+ # %d = database name
+ # %r = remote host and port
+ # %h = remote host
+ # %b = backend type
+ # %p = process ID
+ # %P = process ID of parallel group leader
+ # %t = timestamp without milliseconds
+ # %m = timestamp with milliseconds
+ # %n = timestamp with milliseconds (as a Unix epoch)
+ # %Q = query ID (0 if none or not computed)
+ # %i = command tag
+ # %e = SQL state
+ # %c = session ID
+ # %l = session line number
+ # %s = session start timestamp
+ # %v = virtual transaction ID
+ # %x = transaction ID (0 if none)
+ # %q = stop here in non-session
+ # processes
+ # %% = '%'
+ # e.g. '<%u%%%d> '
+#log_lock_waits = off # log lock waits >= deadlock_timeout
+#log_recovery_conflict_waits = off # log standby recovery conflict waits
+ # >= deadlock_timeout
+#log_parameter_max_length = -1 # when logging statements, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_parameter_max_length_on_error = 0 # when logging an error, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_statement = 'none' # none, ddl, mod, all
+#log_replication_commands = off
+#log_temp_files = -1 # log temporary files equal or larger
+ # than the specified size in kilobytes;
+ # -1 disables, 0 logs all temp files
+#log_timezone = 'GMT'
+
+
+#------------------------------------------------------------------------------
+# PROCESS TITLE
+#------------------------------------------------------------------------------
+
+#cluster_name = '' # added to process titles if nonempty
+ # (change requires restart)
+#update_process_title = on
+
+
+#------------------------------------------------------------------------------
+# STATISTICS
+#------------------------------------------------------------------------------
+
+# - Cumulative Query and Index Statistics -
+
+#track_activities = on
+#track_activity_query_size = 1024 # (change requires restart)
+#track_counts = on
+#track_io_timing = off
+#track_wal_io_timing = off
+#track_functions = none # none, pl, all
+#stats_fetch_consistency = cache
+
+
+# - Monitoring -
+
+#compute_query_id = auto
+#log_statement_stats = off
+#log_parser_stats = off
+#log_planner_stats = off
+#log_executor_stats = off
+
+
+#------------------------------------------------------------------------------
+# AUTOVACUUM
+#------------------------------------------------------------------------------
+
+#autovacuum = on # Enable autovacuum subprocess? 'on'
+ # requires track_counts to also be on.
+#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
+ # (change requires restart)
+#autovacuum_naptime = 1min # time between autovacuum runs
+#autovacuum_vacuum_threshold = 50 # min number of row updates before
+ # vacuum
+#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts
+ # before vacuum; -1 disables insert
+ # vacuums
+#autovacuum_analyze_threshold = 50 # min number of row updates before
+ # analyze
+#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
+#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table
+ # size before insert vacuum
+#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
+#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
+ # (change requires restart)
+#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age
+ # before forced vacuum
+ # (change requires restart)
+#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
+ # autovacuum, in milliseconds;
+ # -1 means use vacuum_cost_delay
+#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
+ # autovacuum, -1 means use
+ # vacuum_cost_limit
+
+
+#------------------------------------------------------------------------------
+# CLIENT CONNECTION DEFAULTS
+#------------------------------------------------------------------------------
+
+# - Statement Behavior -
+
+#client_min_messages = notice # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # log
+ # notice
+ # warning
+ # error
+#search_path = '"$user", public' # schema names
+#row_security = on
+#default_table_access_method = 'heap'
+#default_tablespace = '' # a tablespace name, '' uses the default
+#default_toast_compression = 'pglz' # 'pglz' or 'lz4'
+#temp_tablespaces = '' # a list of tablespace names, '' uses
+ # only default tablespace
+#check_function_bodies = on
+#default_transaction_isolation = 'read committed'
+#default_transaction_read_only = off
+#default_transaction_deferrable = off
+#session_replication_role = 'origin'
+#statement_timeout = 0 # in milliseconds, 0 is disabled
+#lock_timeout = 0 # in milliseconds, 0 is disabled
+#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
+#idle_session_timeout = 0 # in milliseconds, 0 is disabled
+#vacuum_freeze_table_age = 150000000
+#vacuum_freeze_min_age = 50000000
+#vacuum_failsafe_age = 1600000000
+#vacuum_multixact_freeze_table_age = 150000000
+#vacuum_multixact_freeze_min_age = 5000000
+#vacuum_multixact_failsafe_age = 1600000000
+#bytea_output = 'hex' # hex, escape
+#xmlbinary = 'base64'
+#xmloption = 'content'
+#gin_pending_list_limit = 4MB
+
+# - Locale and Formatting -
+
+#datestyle = 'iso, mdy'
+#intervalstyle = 'postgres'
+#timezone = 'GMT'
+#timezone_abbreviations = 'Default' # Select the set of available time zone
+ # abbreviations. Currently, there are
+ # Default
+ # Australia (historical usage)
+ # India
+ # You can create your own file in
+ # share/timezonesets/.
+#extra_float_digits = 1 # min -15, max 3; any value >0 actually
+ # selects precise output mode
+#client_encoding = sql_ascii # actually, defaults to database
+ # encoding
+
+# These settings are initialized by initdb, but they can be changed.
+#lc_messages = 'C' # locale for system error message
+ # strings
+#lc_monetary = 'C' # locale for monetary formatting
+#lc_numeric = 'C' # locale for number formatting
+#lc_time = 'C' # locale for time formatting
+
+# default configuration for text search
+#default_text_search_config = 'pg_catalog.simple'
+
+# - Shared Library Preloading -
+
+#local_preload_libraries = ''
+#session_preload_libraries = ''
+#shared_preload_libraries = '' # (change requires restart)
+#jit_provider = 'llvmjit' # JIT library to use
+
+# - Other Defaults -
+
+#dynamic_library_path = '$libdir'
+#gin_fuzzy_search_limit = 0
+
+
+#------------------------------------------------------------------------------
+# LOCK MANAGEMENT
+#------------------------------------------------------------------------------
+
+#deadlock_timeout = 1s
+#max_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_relation = -2 # negative values mean
+ # (max_pred_locks_per_transaction
+ # / -max_pred_locks_per_relation) - 1
+#max_pred_locks_per_page = 2 # min 0
+
+
+#------------------------------------------------------------------------------
+# VERSION AND PLATFORM COMPATIBILITY
+#------------------------------------------------------------------------------
+
+# - Previous PostgreSQL Versions -
+
+#array_nulls = on
+#backslash_quote = safe_encoding # on, off, or safe_encoding
+#escape_string_warning = on
+#lo_compat_privileges = off
+#quote_all_identifiers = off
+#standard_conforming_strings = on
+#synchronize_seqscans = on
+
+# - Other Platforms and Clients -
+
+#transform_null_equals = off
+
+
+#------------------------------------------------------------------------------
+# ERROR HANDLING
+#------------------------------------------------------------------------------
+
+#exit_on_error = off # terminate session on any error?
+#restart_after_crash = on # reinitialize after backend crash?
+#data_sync_retry = off # retry or panic on failure to fsync
+ # data?
+ # (change requires restart)
+#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
+
+
+#------------------------------------------------------------------------------
+# CONFIG FILE INCLUDES
+#------------------------------------------------------------------------------
+
+# These options allow settings to be loaded from files other than the
+# default postgresql.conf. Note that these are directives, not variable
+# assignments, so they can usefully be given more than once.
+
+#include_dir = '...' # include files ending in '.conf' from
+ # a directory, e.g., 'conf.d'
+#include_if_exists = '...' # include file only if it exists
+#include = '...' # include file
+
+
+#------------------------------------------------------------------------------
+# CUSTOMIZED OPTIONS
+#------------------------------------------------------------------------------
+
+# Add settings for extensions here
diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c
new file mode 100644
index 0000000..ec314c0
--- /dev/null
+++ b/src/backend/utils/misc/ps_status.c
@@ -0,0 +1,449 @@
+/*--------------------------------------------------------------------
+ * ps_status.c
+ *
+ * Routines to support changing the ps display of PostgreSQL backends
+ * to contain some useful information. Mechanism differs wildly across
+ * platforms.
+ *
+ * src/backend/utils/misc/ps_status.c
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ * various details abducted from various places
+ *--------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <unistd.h>
+#ifdef HAVE_SYS_PSTAT_H
+#include <sys/pstat.h> /* for HP-UX */
+#endif
+#ifdef HAVE_PS_STRINGS
+#include <machine/vmparam.h> /* for old BSD */
+#include <sys/exec.h>
+#endif
+#if defined(__darwin__)
+#include <crt_externs.h>
+#endif
+
+#include "libpq/libpq.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "utils/guc.h"
+#include "utils/ps_status.h"
+
+extern char **environ;
+bool update_process_title = true;
+
+
+/*
+ * Alternative ways of updating ps display:
+ *
+ * PS_USE_SETPROCTITLE_FAST
+ * use the function setproctitle_fast(const char *, ...)
+ * (newer FreeBSD systems)
+ * PS_USE_SETPROCTITLE
+ * use the function setproctitle(const char *, ...)
+ * (newer BSD systems)
+ * PS_USE_PSTAT
+ * use the pstat(PSTAT_SETCMD, )
+ * (HPUX)
+ * PS_USE_PS_STRINGS
+ * assign PS_STRINGS->ps_argvstr = "string"
+ * (some BSD systems)
+ * PS_USE_CHANGE_ARGV
+ * assign argv[0] = "string"
+ * (some other BSD systems)
+ * PS_USE_CLOBBER_ARGV
+ * write over the argv and environment area
+ * (Linux and most SysV-like systems)
+ * PS_USE_WIN32
+ * push the string out as the name of a Windows event
+ * PS_USE_NONE
+ * don't update ps display
+ * (This is the default, as it is safest.)
+ */
+#if defined(HAVE_SETPROCTITLE_FAST)
+#define PS_USE_SETPROCTITLE_FAST
+#elif defined(HAVE_SETPROCTITLE)
+#define PS_USE_SETPROCTITLE
+#elif defined(HAVE_PSTAT) && defined(PSTAT_SETCMD)
+#define PS_USE_PSTAT
+#elif defined(HAVE_PS_STRINGS)
+#define PS_USE_PS_STRINGS
+#elif (defined(BSD) || defined(__hurd__)) && !defined(__darwin__)
+#define PS_USE_CHANGE_ARGV
+#elif defined(__linux__) || defined(_AIX) || defined(__sgi) || (defined(sun) && !defined(BSD)) || defined(__svr5__) || defined(__darwin__)
+#define PS_USE_CLOBBER_ARGV
+#elif defined(WIN32)
+#define PS_USE_WIN32
+#else
+#define PS_USE_NONE
+#endif
+
+
+/* Different systems want the buffer padded differently */
+#if defined(_AIX) || defined(__linux__) || defined(__darwin__)
+#define PS_PADDING '\0'
+#else
+#define PS_PADDING ' '
+#endif
+
+
+#ifndef PS_USE_NONE
+
+#ifndef PS_USE_CLOBBER_ARGV
+/* all but one option need a buffer to write their ps line in */
+#define PS_BUFFER_SIZE 256
+static char ps_buffer[PS_BUFFER_SIZE];
+static const size_t ps_buffer_size = PS_BUFFER_SIZE;
+#else /* PS_USE_CLOBBER_ARGV */
+static char *ps_buffer; /* will point to argv area */
+static size_t ps_buffer_size; /* space determined at run time */
+static size_t last_status_len; /* use to minimize length of clobber */
+#endif /* PS_USE_CLOBBER_ARGV */
+
+static size_t ps_buffer_cur_len; /* nominal strlen(ps_buffer) */
+
+static size_t ps_buffer_fixed_size; /* size of the constant prefix */
+
+#endif /* not PS_USE_NONE */
+
+/* save the original argv[] location here */
+static int save_argc;
+static char **save_argv;
+
+
+/*
+ * Call this early in startup to save the original argc/argv values.
+ * If needed, we make a copy of the original argv[] array to preserve it
+ * from being clobbered by subsequent ps_display actions.
+ *
+ * (The original argv[] will not be overwritten by this routine, but may be
+ * overwritten during init_ps_display. Also, the physical location of the
+ * environment strings may be moved, so this should be called before any code
+ * that might try to hang onto a getenv() result.)
+ *
+ * Note that in case of failure this cannot call elog() as that is not
+ * initialized yet. We rely on write_stderr() instead.
+ */
+char **
+save_ps_display_args(int argc, char **argv)
+{
+ save_argc = argc;
+ save_argv = argv;
+
+#if defined(PS_USE_CLOBBER_ARGV)
+
+ /*
+ * If we're going to overwrite the argv area, count the available space.
+ * Also move the environment to make additional room.
+ */
+ {
+ char *end_of_area = NULL;
+ char **new_environ;
+ int i;
+
+ /*
+ * check for contiguous argv strings
+ */
+ for (i = 0; i < argc; i++)
+ {
+ if (i == 0 || end_of_area + 1 == argv[i])
+ end_of_area = argv[i] + strlen(argv[i]);
+ }
+
+ if (end_of_area == NULL) /* probably can't happen? */
+ {
+ ps_buffer = NULL;
+ ps_buffer_size = 0;
+ return argv;
+ }
+
+ /*
+ * check for contiguous environ strings following argv
+ */
+ for (i = 0; environ[i] != NULL; i++)
+ {
+ if (end_of_area + 1 == environ[i])
+ end_of_area = environ[i] + strlen(environ[i]);
+ }
+
+ ps_buffer = argv[0];
+ last_status_len = ps_buffer_size = end_of_area - argv[0];
+
+ /*
+ * move the environment out of the way
+ */
+ new_environ = (char **) malloc((i + 1) * sizeof(char *));
+ if (!new_environ)
+ {
+ write_stderr("out of memory\n");
+ exit(1);
+ }
+ for (i = 0; environ[i] != NULL; i++)
+ {
+ new_environ[i] = strdup(environ[i]);
+ if (!new_environ[i])
+ {
+ write_stderr("out of memory\n");
+ exit(1);
+ }
+ }
+ new_environ[i] = NULL;
+ environ = new_environ;
+ }
+#endif /* PS_USE_CLOBBER_ARGV */
+
+#if defined(PS_USE_CHANGE_ARGV) || defined(PS_USE_CLOBBER_ARGV)
+
+ /*
+ * If we're going to change the original argv[] then make a copy for
+ * argument parsing purposes.
+ *
+ * (NB: do NOT think to remove the copying of argv[], even though
+ * postmaster.c finishes looking at argv[] long before we ever consider
+ * changing the ps display. On some platforms, getopt() keeps pointers
+ * into the argv array, and will get horribly confused when it is
+ * re-called to analyze a subprocess' argument string if the argv storage
+ * has been clobbered meanwhile. Other platforms have other dependencies
+ * on argv[].
+ */
+ {
+ char **new_argv;
+ int i;
+
+ new_argv = (char **) malloc((argc + 1) * sizeof(char *));
+ if (!new_argv)
+ {
+ write_stderr("out of memory\n");
+ exit(1);
+ }
+ for (i = 0; i < argc; i++)
+ {
+ new_argv[i] = strdup(argv[i]);
+ if (!new_argv[i])
+ {
+ write_stderr("out of memory\n");
+ exit(1);
+ }
+ }
+ new_argv[argc] = NULL;
+
+#if defined(__darwin__)
+
+ /*
+ * macOS (and perhaps other NeXT-derived platforms?) has a static copy
+ * of the argv pointer, which we may fix like so:
+ */
+ *_NSGetArgv() = new_argv;
+#endif
+
+ argv = new_argv;
+ }
+#endif /* PS_USE_CHANGE_ARGV or PS_USE_CLOBBER_ARGV */
+
+ return argv;
+}
+
+/*
+ * Call this once during subprocess startup to set the identification
+ * values.
+ *
+ * If fixed_part is NULL, a default will be obtained from MyBackendType.
+ *
+ * At this point, the original argv[] array may be overwritten.
+ */
+void
+init_ps_display(const char *fixed_part)
+{
+#ifndef PS_USE_NONE
+ bool save_update_process_title;
+#endif
+
+ Assert(fixed_part || MyBackendType);
+ if (!fixed_part)
+ fixed_part = GetBackendTypeDesc(MyBackendType);
+
+#ifndef PS_USE_NONE
+ /* no ps display for stand-alone backend */
+ if (!IsUnderPostmaster)
+ return;
+
+ /* no ps display if you didn't call save_ps_display_args() */
+ if (!save_argv)
+ return;
+
+#ifdef PS_USE_CLOBBER_ARGV
+ /* If ps_buffer is a pointer, it might still be null */
+ if (!ps_buffer)
+ return;
+#endif
+
+ /*
+ * Overwrite argv[] to point at appropriate space, if needed
+ */
+
+#ifdef PS_USE_CHANGE_ARGV
+ save_argv[0] = ps_buffer;
+ save_argv[1] = NULL;
+#endif /* PS_USE_CHANGE_ARGV */
+
+#ifdef PS_USE_CLOBBER_ARGV
+ {
+ int i;
+
+ /* make extra argv slots point at end_of_area (a NUL) */
+ for (i = 1; i < save_argc; i++)
+ save_argv[i] = ps_buffer + ps_buffer_size;
+ }
+#endif /* PS_USE_CLOBBER_ARGV */
+
+ /*
+ * Make fixed prefix of ps display.
+ */
+
+#if defined(PS_USE_SETPROCTITLE) || defined(PS_USE_SETPROCTITLE_FAST)
+
+ /*
+ * apparently setproctitle() already adds a `progname:' prefix to the ps
+ * line
+ */
+#define PROGRAM_NAME_PREFIX ""
+#else
+#define PROGRAM_NAME_PREFIX "postgres: "
+#endif
+
+ if (*cluster_name == '\0')
+ {
+ snprintf(ps_buffer, ps_buffer_size,
+ PROGRAM_NAME_PREFIX "%s ",
+ fixed_part);
+ }
+ else
+ {
+ snprintf(ps_buffer, ps_buffer_size,
+ PROGRAM_NAME_PREFIX "%s: %s ",
+ cluster_name, fixed_part);
+ }
+
+ ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
+
+ /*
+ * On the first run, force the update.
+ */
+ save_update_process_title = update_process_title;
+ update_process_title = true;
+ set_ps_display("");
+ update_process_title = save_update_process_title;
+#endif /* not PS_USE_NONE */
+}
+
+
+
+/*
+ * Call this to update the ps status display to a fixed prefix plus an
+ * indication of what you're currently doing passed in the argument.
+ */
+void
+set_ps_display(const char *activity)
+{
+#ifndef PS_USE_NONE
+ /* update_process_title=off disables updates */
+ if (!update_process_title)
+ return;
+
+ /* no ps display for stand-alone backend */
+ if (!IsUnderPostmaster)
+ return;
+
+#ifdef PS_USE_CLOBBER_ARGV
+ /* If ps_buffer is a pointer, it might still be null */
+ if (!ps_buffer)
+ return;
+#endif
+
+ /* Update ps_buffer to contain both fixed part and activity */
+ strlcpy(ps_buffer + ps_buffer_fixed_size, activity,
+ ps_buffer_size - ps_buffer_fixed_size);
+ ps_buffer_cur_len = strlen(ps_buffer);
+
+ /* Transmit new setting to kernel, if necessary */
+
+#ifdef PS_USE_SETPROCTITLE
+ setproctitle("%s", ps_buffer);
+#elif defined(PS_USE_SETPROCTITLE_FAST)
+ setproctitle_fast("%s", ps_buffer);
+#endif
+
+#ifdef PS_USE_PSTAT
+ {
+ union pstun pst;
+
+ pst.pst_command = ps_buffer;
+ pstat(PSTAT_SETCMD, pst, ps_buffer_cur_len, 0, 0);
+ }
+#endif /* PS_USE_PSTAT */
+
+#ifdef PS_USE_PS_STRINGS
+ PS_STRINGS->ps_nargvstr = 1;
+ PS_STRINGS->ps_argvstr = ps_buffer;
+#endif /* PS_USE_PS_STRINGS */
+
+#ifdef PS_USE_CLOBBER_ARGV
+ /* pad unused memory; need only clobber remainder of old status string */
+ if (last_status_len > ps_buffer_cur_len)
+ MemSet(ps_buffer + ps_buffer_cur_len, PS_PADDING,
+ last_status_len - ps_buffer_cur_len);
+ last_status_len = ps_buffer_cur_len;
+#endif /* PS_USE_CLOBBER_ARGV */
+
+#ifdef PS_USE_WIN32
+ {
+ /*
+ * Win32 does not support showing any changed arguments. To make it at
+ * all possible to track which backend is doing what, we create a
+ * named object that can be viewed with for example Process Explorer.
+ */
+ static HANDLE ident_handle = INVALID_HANDLE_VALUE;
+ char name[PS_BUFFER_SIZE + 32];
+
+ if (ident_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(ident_handle);
+
+ sprintf(name, "pgident(%d): %s", MyProcPid, ps_buffer);
+
+ ident_handle = CreateEvent(NULL, TRUE, FALSE, name);
+ }
+#endif /* PS_USE_WIN32 */
+#endif /* not PS_USE_NONE */
+}
+
+
+/*
+ * Returns what's currently in the ps display, in case someone needs
+ * it. Note that only the activity part is returned. On some platforms
+ * the string will not be null-terminated, so return the effective
+ * length into *displen.
+ */
+const char *
+get_ps_display(int *displen)
+{
+#ifdef PS_USE_CLOBBER_ARGV
+ /* If ps_buffer is a pointer, it might still be null */
+ if (!ps_buffer)
+ {
+ *displen = 0;
+ return "";
+ }
+#endif
+
+#ifndef PS_USE_NONE
+ *displen = (int) (ps_buffer_cur_len - ps_buffer_fixed_size);
+
+ return ps_buffer + ps_buffer_fixed_size;
+#else
+ *displen = 0;
+ return "";
+#endif
+}
diff --git a/src/backend/utils/misc/queryenvironment.c b/src/backend/utils/misc/queryenvironment.c
new file mode 100644
index 0000000..3a065b2
--- /dev/null
+++ b/src/backend/utils/misc/queryenvironment.c
@@ -0,0 +1,144 @@
+/*-------------------------------------------------------------------------
+ *
+ * queryenvironment.c
+ * Query environment, to store context-specific values like ephemeral named
+ * relations. Initial use is for named tuplestores for delta information
+ * from "normal" relations.
+ *
+ * The initial implementation uses a list because the number of such relations
+ * in any one context is expected to be very small. If that becomes a
+ * performance problem, the implementation can be changed with no other impact
+ * on callers, since this is an opaque structure. This is the reason to
+ * require a create function.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/queryenvironment.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/table.h"
+#include "utils/queryenvironment.h"
+#include "utils/rel.h"
+
+/*
+ * Private state of a query environment.
+ */
+struct QueryEnvironment
+{
+ List *namedRelList;
+};
+
+
+QueryEnvironment *
+create_queryEnv(void)
+{
+ return (QueryEnvironment *) palloc0(sizeof(QueryEnvironment));
+}
+
+EphemeralNamedRelationMetadata
+get_visible_ENR_metadata(QueryEnvironment *queryEnv, const char *refname)
+{
+ EphemeralNamedRelation enr;
+
+ Assert(refname != NULL);
+
+ if (queryEnv == NULL)
+ return NULL;
+
+ enr = get_ENR(queryEnv, refname);
+
+ if (enr)
+ return &(enr->md);
+
+ return NULL;
+}
+
+/*
+ * Register a named relation for use in the given environment.
+ *
+ * If this is intended exclusively for planning purposes, the tstate field can
+ * be left NULL;
+ */
+void
+register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr)
+{
+ Assert(enr != NULL);
+ Assert(get_ENR(queryEnv, enr->md.name) == NULL);
+
+ queryEnv->namedRelList = lappend(queryEnv->namedRelList, enr);
+}
+
+/*
+ * Unregister an ephemeral relation by name. This will probably be a rarely
+ * used function, but seems like it should be provided "just in case".
+ */
+void
+unregister_ENR(QueryEnvironment *queryEnv, const char *name)
+{
+ EphemeralNamedRelation match;
+
+ match = get_ENR(queryEnv, name);
+ if (match)
+ queryEnv->namedRelList = list_delete(queryEnv->namedRelList, match);
+}
+
+/*
+ * This returns an ENR if there is a name match in the given collection. It
+ * must quietly return NULL if no match is found.
+ */
+EphemeralNamedRelation
+get_ENR(QueryEnvironment *queryEnv, const char *name)
+{
+ ListCell *lc;
+
+ Assert(name != NULL);
+
+ if (queryEnv == NULL)
+ return NULL;
+
+ foreach(lc, queryEnv->namedRelList)
+ {
+ EphemeralNamedRelation enr = (EphemeralNamedRelation) lfirst(lc);
+
+ if (strcmp(enr->md.name, name) == 0)
+ return enr;
+ }
+
+ return NULL;
+}
+
+/*
+ * Gets the TupleDesc for a Ephemeral Named Relation, based on which field was
+ * filled.
+ *
+ * When the TupleDesc is based on a relation from the catalogs, we count on
+ * that relation being used at the same time, so that appropriate locks will
+ * already be held. Locking here would be too late anyway.
+ */
+TupleDesc
+ENRMetadataGetTupDesc(EphemeralNamedRelationMetadata enrmd)
+{
+ TupleDesc tupdesc;
+
+ /* One, and only one, of these fields must be filled. */
+ Assert((enrmd->reliddesc == InvalidOid) != (enrmd->tupdesc == NULL));
+
+ if (enrmd->tupdesc != NULL)
+ tupdesc = enrmd->tupdesc;
+ else
+ {
+ Relation relation;
+
+ relation = table_open(enrmd->reliddesc, NoLock);
+ tupdesc = relation->rd_att;
+ table_close(relation, NoLock);
+ }
+
+ return tupdesc;
+}
diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c
new file mode 100644
index 0000000..1224bb6
--- /dev/null
+++ b/src/backend/utils/misc/queryjumble.c
@@ -0,0 +1,869 @@
+/*-------------------------------------------------------------------------
+ *
+ * queryjumble.c
+ * Query normalization and fingerprinting.
+ *
+ * Normalization is a process whereby similar queries, typically differing only
+ * in their constants (though the exact rules are somewhat more subtle than
+ * that) are recognized as equivalent, and are tracked as a single entry. This
+ * is particularly useful for non-prepared queries.
+ *
+ * Normalization is implemented by fingerprinting queries, selectively
+ * serializing those fields of each query tree's nodes that are judged to be
+ * essential to the query. This is referred to as a query jumble. This is
+ * distinct from a regular serialization in that various extraneous
+ * information is ignored as irrelevant or not essential to the query, such
+ * as the collations of Vars and, most notably, the values of constants.
+ *
+ * This jumble is acquired at the end of parse analysis of each query, and
+ * a 64-bit hash of it is stored into the query's Query.queryId field.
+ * The server then copies this value around, making it available in plan
+ * tree(s) generated from the query. The executor can then use this value
+ * to blame query costs on the proper queryId.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/queryjumble.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "common/hashfn.h"
+#include "miscadmin.h"
+#include "parser/scansup.h"
+#include "utils/queryjumble.h"
+
+#define JUMBLE_SIZE 1024 /* query serialization buffer size */
+
+/* GUC parameters */
+int compute_query_id = COMPUTE_QUERY_ID_AUTO;
+
+/* True when compute_query_id is ON, or AUTO and a module requests them */
+bool query_id_enabled = false;
+
+static uint64 compute_utility_query_id(const char *str, int query_location, int query_len);
+static void AppendJumble(JumbleState *jstate,
+ const unsigned char *item, Size size);
+static void JumbleQueryInternal(JumbleState *jstate, Query *query);
+static void JumbleRangeTable(JumbleState *jstate, List *rtable);
+static void JumbleRowMarks(JumbleState *jstate, List *rowMarks);
+static void JumbleExpr(JumbleState *jstate, Node *node);
+static void RecordConstLocation(JumbleState *jstate, int location);
+
+/*
+ * Given a possibly multi-statement source string, confine our attention to the
+ * relevant part of the string.
+ */
+const char *
+CleanQuerytext(const char *query, int *location, int *len)
+{
+ int query_location = *location;
+ int query_len = *len;
+
+ /* First apply starting offset, unless it's -1 (unknown). */
+ if (query_location >= 0)
+ {
+ Assert(query_location <= strlen(query));
+ query += query_location;
+ /* Length of 0 (or -1) means "rest of string" */
+ if (query_len <= 0)
+ query_len = strlen(query);
+ else
+ Assert(query_len <= strlen(query));
+ }
+ else
+ {
+ /* If query location is unknown, distrust query_len as well */
+ query_location = 0;
+ query_len = strlen(query);
+ }
+
+ /*
+ * Discard leading and trailing whitespace, too. Use scanner_isspace()
+ * not libc's isspace(), because we want to match the lexer's behavior.
+ */
+ while (query_len > 0 && scanner_isspace(query[0]))
+ query++, query_location++, query_len--;
+ while (query_len > 0 && scanner_isspace(query[query_len - 1]))
+ query_len--;
+
+ *location = query_location;
+ *len = query_len;
+
+ return query;
+}
+
+JumbleState *
+JumbleQuery(Query *query, const char *querytext)
+{
+ JumbleState *jstate = NULL;
+
+ Assert(IsQueryIdEnabled());
+
+ if (query->utilityStmt)
+ {
+ query->queryId = compute_utility_query_id(querytext,
+ query->stmt_location,
+ query->stmt_len);
+ }
+ else
+ {
+ jstate = (JumbleState *) palloc(sizeof(JumbleState));
+
+ /* Set up workspace for query jumbling */
+ jstate->jumble = (unsigned char *) palloc(JUMBLE_SIZE);
+ jstate->jumble_len = 0;
+ jstate->clocations_buf_size = 32;
+ jstate->clocations = (LocationLen *)
+ palloc(jstate->clocations_buf_size * sizeof(LocationLen));
+ jstate->clocations_count = 0;
+ jstate->highest_extern_param_id = 0;
+
+ /* Compute query ID and mark the Query node with it */
+ JumbleQueryInternal(jstate, query);
+ query->queryId = DatumGetUInt64(hash_any_extended(jstate->jumble,
+ jstate->jumble_len,
+ 0));
+
+ /*
+ * If we are unlucky enough to get a hash of zero, use 1 instead, to
+ * prevent confusion with the utility-statement case.
+ */
+ if (query->queryId == UINT64CONST(0))
+ query->queryId = UINT64CONST(1);
+ }
+
+ return jstate;
+}
+
+/*
+ * Enables query identifier computation.
+ *
+ * Third-party plugins can use this function to inform core that they require
+ * a query identifier to be computed.
+ */
+void
+EnableQueryId(void)
+{
+ if (compute_query_id != COMPUTE_QUERY_ID_OFF)
+ query_id_enabled = true;
+}
+
+/*
+ * Compute a query identifier for the given utility query string.
+ */
+static uint64
+compute_utility_query_id(const char *query_text, int query_location, int query_len)
+{
+ uint64 queryId;
+ const char *sql;
+
+ /*
+ * Confine our attention to the relevant part of the string, if the query
+ * is a portion of a multi-statement source string.
+ */
+ sql = CleanQuerytext(query_text, &query_location, &query_len);
+
+ queryId = DatumGetUInt64(hash_any_extended((const unsigned char *) sql,
+ query_len, 0));
+
+ /*
+ * If we are unlucky enough to get a hash of zero(invalid), use queryID as
+ * 2 instead, queryID 1 is already in use for normal statements.
+ */
+ if (queryId == UINT64CONST(0))
+ queryId = UINT64CONST(2);
+
+ return queryId;
+}
+
+/*
+ * AppendJumble: Append a value that is substantive in a given query to
+ * the current jumble.
+ */
+static void
+AppendJumble(JumbleState *jstate, const unsigned char *item, Size size)
+{
+ unsigned char *jumble = jstate->jumble;
+ Size jumble_len = jstate->jumble_len;
+
+ /*
+ * Whenever the jumble buffer is full, we hash the current contents and
+ * reset the buffer to contain just that hash value, thus relying on the
+ * hash to summarize everything so far.
+ */
+ while (size > 0)
+ {
+ Size part_size;
+
+ if (jumble_len >= JUMBLE_SIZE)
+ {
+ uint64 start_hash;
+
+ start_hash = DatumGetUInt64(hash_any_extended(jumble,
+ JUMBLE_SIZE, 0));
+ memcpy(jumble, &start_hash, sizeof(start_hash));
+ jumble_len = sizeof(start_hash);
+ }
+ part_size = Min(size, JUMBLE_SIZE - jumble_len);
+ memcpy(jumble + jumble_len, item, part_size);
+ jumble_len += part_size;
+ item += part_size;
+ size -= part_size;
+ }
+ jstate->jumble_len = jumble_len;
+}
+
+/*
+ * Wrappers around AppendJumble to encapsulate details of serialization
+ * of individual local variable elements.
+ */
+#define APP_JUMB(item) \
+ AppendJumble(jstate, (const unsigned char *) &(item), sizeof(item))
+#define APP_JUMB_STRING(str) \
+ AppendJumble(jstate, (const unsigned char *) (str), strlen(str) + 1)
+
+/*
+ * JumbleQueryInternal: Selectively serialize the query tree, appending
+ * significant data to the "query jumble" while ignoring nonsignificant data.
+ *
+ * Rule of thumb for what to include is that we should ignore anything not
+ * semantically significant (such as alias names) as well as anything that can
+ * be deduced from child nodes (else we'd just be double-hashing that piece
+ * of information).
+ */
+static void
+JumbleQueryInternal(JumbleState *jstate, Query *query)
+{
+ Assert(IsA(query, Query));
+ Assert(query->utilityStmt == NULL);
+
+ APP_JUMB(query->commandType);
+ /* resultRelation is usually predictable from commandType */
+ JumbleExpr(jstate, (Node *) query->cteList);
+ JumbleRangeTable(jstate, query->rtable);
+ JumbleExpr(jstate, (Node *) query->jointree);
+ JumbleExpr(jstate, (Node *) query->mergeActionList);
+ JumbleExpr(jstate, (Node *) query->targetList);
+ JumbleExpr(jstate, (Node *) query->onConflict);
+ JumbleExpr(jstate, (Node *) query->returningList);
+ JumbleExpr(jstate, (Node *) query->groupClause);
+ APP_JUMB(query->groupDistinct);
+ JumbleExpr(jstate, (Node *) query->groupingSets);
+ JumbleExpr(jstate, query->havingQual);
+ JumbleExpr(jstate, (Node *) query->windowClause);
+ JumbleExpr(jstate, (Node *) query->distinctClause);
+ JumbleExpr(jstate, (Node *) query->sortClause);
+ JumbleExpr(jstate, query->limitOffset);
+ JumbleExpr(jstate, query->limitCount);
+ APP_JUMB(query->limitOption);
+ JumbleRowMarks(jstate, query->rowMarks);
+ JumbleExpr(jstate, query->setOperations);
+}
+
+/*
+ * Jumble a range table
+ */
+static void
+JumbleRangeTable(JumbleState *jstate, List *rtable)
+{
+ ListCell *lc;
+
+ foreach(lc, rtable)
+ {
+ RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc);
+
+ APP_JUMB(rte->rtekind);
+ switch (rte->rtekind)
+ {
+ case RTE_RELATION:
+ APP_JUMB(rte->relid);
+ JumbleExpr(jstate, (Node *) rte->tablesample);
+ APP_JUMB(rte->inh);
+ break;
+ case RTE_SUBQUERY:
+ JumbleQueryInternal(jstate, rte->subquery);
+ break;
+ case RTE_JOIN:
+ APP_JUMB(rte->jointype);
+ break;
+ case RTE_FUNCTION:
+ JumbleExpr(jstate, (Node *) rte->functions);
+ break;
+ case RTE_TABLEFUNC:
+ JumbleExpr(jstate, (Node *) rte->tablefunc);
+ break;
+ case RTE_VALUES:
+ JumbleExpr(jstate, (Node *) rte->values_lists);
+ break;
+ case RTE_CTE:
+
+ /*
+ * Depending on the CTE name here isn't ideal, but it's the
+ * only info we have to identify the referenced WITH item.
+ */
+ APP_JUMB_STRING(rte->ctename);
+ APP_JUMB(rte->ctelevelsup);
+ break;
+ case RTE_NAMEDTUPLESTORE:
+ APP_JUMB_STRING(rte->enrname);
+ break;
+ case RTE_RESULT:
+ break;
+ default:
+ elog(ERROR, "unrecognized RTE kind: %d", (int) rte->rtekind);
+ break;
+ }
+ }
+}
+
+/*
+ * Jumble a rowMarks list
+ */
+static void
+JumbleRowMarks(JumbleState *jstate, List *rowMarks)
+{
+ ListCell *lc;
+
+ foreach(lc, rowMarks)
+ {
+ RowMarkClause *rowmark = lfirst_node(RowMarkClause, lc);
+
+ if (!rowmark->pushedDown)
+ {
+ APP_JUMB(rowmark->rti);
+ APP_JUMB(rowmark->strength);
+ APP_JUMB(rowmark->waitPolicy);
+ }
+ }
+}
+
+/*
+ * Jumble an expression tree
+ *
+ * In general this function should handle all the same node types that
+ * expression_tree_walker() does, and therefore it's coded to be as parallel
+ * to that function as possible. However, since we are only invoked on
+ * queries immediately post-parse-analysis, we need not handle node types
+ * that only appear in planning.
+ *
+ * Note: the reason we don't simply use expression_tree_walker() is that the
+ * point of that function is to support tree walkers that don't care about
+ * most tree node types, but here we care about all types. We should complain
+ * about any unrecognized node type.
+ */
+static void
+JumbleExpr(JumbleState *jstate, Node *node)
+{
+ ListCell *temp;
+
+ if (node == NULL)
+ return;
+
+ /* Guard against stack overflow due to overly complex expressions */
+ check_stack_depth();
+
+ /*
+ * We always emit the node's NodeTag, then any additional fields that are
+ * considered significant, and then we recurse to any child nodes.
+ */
+ APP_JUMB(node->type);
+
+ switch (nodeTag(node))
+ {
+ case T_Var:
+ {
+ Var *var = (Var *) node;
+
+ APP_JUMB(var->varno);
+ APP_JUMB(var->varattno);
+ APP_JUMB(var->varlevelsup);
+ }
+ break;
+ case T_Const:
+ {
+ Const *c = (Const *) node;
+
+ /* We jumble only the constant's type, not its value */
+ APP_JUMB(c->consttype);
+ /* Also, record its parse location for query normalization */
+ RecordConstLocation(jstate, c->location);
+ }
+ break;
+ case T_Param:
+ {
+ Param *p = (Param *) node;
+
+ APP_JUMB(p->paramkind);
+ APP_JUMB(p->paramid);
+ APP_JUMB(p->paramtype);
+ /* Also, track the highest external Param id */
+ if (p->paramkind == PARAM_EXTERN &&
+ p->paramid > jstate->highest_extern_param_id)
+ jstate->highest_extern_param_id = p->paramid;
+ }
+ break;
+ case T_Aggref:
+ {
+ Aggref *expr = (Aggref *) node;
+
+ APP_JUMB(expr->aggfnoid);
+ JumbleExpr(jstate, (Node *) expr->aggdirectargs);
+ JumbleExpr(jstate, (Node *) expr->args);
+ JumbleExpr(jstate, (Node *) expr->aggorder);
+ JumbleExpr(jstate, (Node *) expr->aggdistinct);
+ JumbleExpr(jstate, (Node *) expr->aggfilter);
+ }
+ break;
+ case T_GroupingFunc:
+ {
+ GroupingFunc *grpnode = (GroupingFunc *) node;
+
+ JumbleExpr(jstate, (Node *) grpnode->refs);
+ APP_JUMB(grpnode->agglevelsup);
+ }
+ break;
+ case T_WindowFunc:
+ {
+ WindowFunc *expr = (WindowFunc *) node;
+
+ APP_JUMB(expr->winfnoid);
+ APP_JUMB(expr->winref);
+ JumbleExpr(jstate, (Node *) expr->args);
+ JumbleExpr(jstate, (Node *) expr->aggfilter);
+ }
+ break;
+ case T_SubscriptingRef:
+ {
+ SubscriptingRef *sbsref = (SubscriptingRef *) node;
+
+ JumbleExpr(jstate, (Node *) sbsref->refupperindexpr);
+ JumbleExpr(jstate, (Node *) sbsref->reflowerindexpr);
+ JumbleExpr(jstate, (Node *) sbsref->refexpr);
+ JumbleExpr(jstate, (Node *) sbsref->refassgnexpr);
+ }
+ break;
+ case T_FuncExpr:
+ {
+ FuncExpr *expr = (FuncExpr *) node;
+
+ APP_JUMB(expr->funcid);
+ JumbleExpr(jstate, (Node *) expr->args);
+ }
+ break;
+ case T_NamedArgExpr:
+ {
+ NamedArgExpr *nae = (NamedArgExpr *) node;
+
+ APP_JUMB(nae->argnumber);
+ JumbleExpr(jstate, (Node *) nae->arg);
+ }
+ break;
+ case T_OpExpr:
+ case T_DistinctExpr: /* struct-equivalent to OpExpr */
+ case T_NullIfExpr: /* struct-equivalent to OpExpr */
+ {
+ OpExpr *expr = (OpExpr *) node;
+
+ APP_JUMB(expr->opno);
+ JumbleExpr(jstate, (Node *) expr->args);
+ }
+ break;
+ case T_ScalarArrayOpExpr:
+ {
+ ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node;
+
+ APP_JUMB(expr->opno);
+ APP_JUMB(expr->useOr);
+ JumbleExpr(jstate, (Node *) expr->args);
+ }
+ break;
+ case T_BoolExpr:
+ {
+ BoolExpr *expr = (BoolExpr *) node;
+
+ APP_JUMB(expr->boolop);
+ JumbleExpr(jstate, (Node *) expr->args);
+ }
+ break;
+ case T_SubLink:
+ {
+ SubLink *sublink = (SubLink *) node;
+
+ APP_JUMB(sublink->subLinkType);
+ APP_JUMB(sublink->subLinkId);
+ JumbleExpr(jstate, (Node *) sublink->testexpr);
+ JumbleQueryInternal(jstate, castNode(Query, sublink->subselect));
+ }
+ break;
+ case T_FieldSelect:
+ {
+ FieldSelect *fs = (FieldSelect *) node;
+
+ APP_JUMB(fs->fieldnum);
+ JumbleExpr(jstate, (Node *) fs->arg);
+ }
+ break;
+ case T_FieldStore:
+ {
+ FieldStore *fstore = (FieldStore *) node;
+
+ JumbleExpr(jstate, (Node *) fstore->arg);
+ JumbleExpr(jstate, (Node *) fstore->newvals);
+ }
+ break;
+ case T_RelabelType:
+ {
+ RelabelType *rt = (RelabelType *) node;
+
+ APP_JUMB(rt->resulttype);
+ JumbleExpr(jstate, (Node *) rt->arg);
+ }
+ break;
+ case T_CoerceViaIO:
+ {
+ CoerceViaIO *cio = (CoerceViaIO *) node;
+
+ APP_JUMB(cio->resulttype);
+ JumbleExpr(jstate, (Node *) cio->arg);
+ }
+ break;
+ case T_ArrayCoerceExpr:
+ {
+ ArrayCoerceExpr *acexpr = (ArrayCoerceExpr *) node;
+
+ APP_JUMB(acexpr->resulttype);
+ JumbleExpr(jstate, (Node *) acexpr->arg);
+ JumbleExpr(jstate, (Node *) acexpr->elemexpr);
+ }
+ break;
+ case T_ConvertRowtypeExpr:
+ {
+ ConvertRowtypeExpr *crexpr = (ConvertRowtypeExpr *) node;
+
+ APP_JUMB(crexpr->resulttype);
+ JumbleExpr(jstate, (Node *) crexpr->arg);
+ }
+ break;
+ case T_CollateExpr:
+ {
+ CollateExpr *ce = (CollateExpr *) node;
+
+ APP_JUMB(ce->collOid);
+ JumbleExpr(jstate, (Node *) ce->arg);
+ }
+ break;
+ case T_CaseExpr:
+ {
+ CaseExpr *caseexpr = (CaseExpr *) node;
+
+ JumbleExpr(jstate, (Node *) caseexpr->arg);
+ foreach(temp, caseexpr->args)
+ {
+ CaseWhen *when = lfirst_node(CaseWhen, temp);
+
+ JumbleExpr(jstate, (Node *) when->expr);
+ JumbleExpr(jstate, (Node *) when->result);
+ }
+ JumbleExpr(jstate, (Node *) caseexpr->defresult);
+ }
+ break;
+ case T_CaseTestExpr:
+ {
+ CaseTestExpr *ct = (CaseTestExpr *) node;
+
+ APP_JUMB(ct->typeId);
+ }
+ break;
+ case T_ArrayExpr:
+ JumbleExpr(jstate, (Node *) ((ArrayExpr *) node)->elements);
+ break;
+ case T_RowExpr:
+ JumbleExpr(jstate, (Node *) ((RowExpr *) node)->args);
+ break;
+ case T_RowCompareExpr:
+ {
+ RowCompareExpr *rcexpr = (RowCompareExpr *) node;
+
+ APP_JUMB(rcexpr->rctype);
+ JumbleExpr(jstate, (Node *) rcexpr->largs);
+ JumbleExpr(jstate, (Node *) rcexpr->rargs);
+ }
+ break;
+ case T_CoalesceExpr:
+ JumbleExpr(jstate, (Node *) ((CoalesceExpr *) node)->args);
+ break;
+ case T_MinMaxExpr:
+ {
+ MinMaxExpr *mmexpr = (MinMaxExpr *) node;
+
+ APP_JUMB(mmexpr->op);
+ JumbleExpr(jstate, (Node *) mmexpr->args);
+ }
+ break;
+ case T_SQLValueFunction:
+ {
+ SQLValueFunction *svf = (SQLValueFunction *) node;
+
+ APP_JUMB(svf->op);
+ /* type is fully determined by op */
+ APP_JUMB(svf->typmod);
+ }
+ break;
+ case T_XmlExpr:
+ {
+ XmlExpr *xexpr = (XmlExpr *) node;
+
+ APP_JUMB(xexpr->op);
+ JumbleExpr(jstate, (Node *) xexpr->named_args);
+ JumbleExpr(jstate, (Node *) xexpr->args);
+ }
+ break;
+ case T_NullTest:
+ {
+ NullTest *nt = (NullTest *) node;
+
+ APP_JUMB(nt->nulltesttype);
+ JumbleExpr(jstate, (Node *) nt->arg);
+ }
+ break;
+ case T_BooleanTest:
+ {
+ BooleanTest *bt = (BooleanTest *) node;
+
+ APP_JUMB(bt->booltesttype);
+ JumbleExpr(jstate, (Node *) bt->arg);
+ }
+ break;
+ case T_CoerceToDomain:
+ {
+ CoerceToDomain *cd = (CoerceToDomain *) node;
+
+ APP_JUMB(cd->resulttype);
+ JumbleExpr(jstate, (Node *) cd->arg);
+ }
+ break;
+ case T_CoerceToDomainValue:
+ {
+ CoerceToDomainValue *cdv = (CoerceToDomainValue *) node;
+
+ APP_JUMB(cdv->typeId);
+ }
+ break;
+ case T_SetToDefault:
+ {
+ SetToDefault *sd = (SetToDefault *) node;
+
+ APP_JUMB(sd->typeId);
+ }
+ break;
+ case T_CurrentOfExpr:
+ {
+ CurrentOfExpr *ce = (CurrentOfExpr *) node;
+
+ APP_JUMB(ce->cvarno);
+ if (ce->cursor_name)
+ APP_JUMB_STRING(ce->cursor_name);
+ APP_JUMB(ce->cursor_param);
+ }
+ break;
+ case T_NextValueExpr:
+ {
+ NextValueExpr *nve = (NextValueExpr *) node;
+
+ APP_JUMB(nve->seqid);
+ APP_JUMB(nve->typeId);
+ }
+ break;
+ case T_InferenceElem:
+ {
+ InferenceElem *ie = (InferenceElem *) node;
+
+ APP_JUMB(ie->infercollid);
+ APP_JUMB(ie->inferopclass);
+ JumbleExpr(jstate, ie->expr);
+ }
+ break;
+ case T_TargetEntry:
+ {
+ TargetEntry *tle = (TargetEntry *) node;
+
+ APP_JUMB(tle->resno);
+ APP_JUMB(tle->ressortgroupref);
+ JumbleExpr(jstate, (Node *) tle->expr);
+ }
+ break;
+ case T_RangeTblRef:
+ {
+ RangeTblRef *rtr = (RangeTblRef *) node;
+
+ APP_JUMB(rtr->rtindex);
+ }
+ break;
+ case T_JoinExpr:
+ {
+ JoinExpr *join = (JoinExpr *) node;
+
+ APP_JUMB(join->jointype);
+ APP_JUMB(join->isNatural);
+ APP_JUMB(join->rtindex);
+ JumbleExpr(jstate, join->larg);
+ JumbleExpr(jstate, join->rarg);
+ JumbleExpr(jstate, join->quals);
+ }
+ break;
+ case T_FromExpr:
+ {
+ FromExpr *from = (FromExpr *) node;
+
+ JumbleExpr(jstate, (Node *) from->fromlist);
+ JumbleExpr(jstate, from->quals);
+ }
+ break;
+ case T_OnConflictExpr:
+ {
+ OnConflictExpr *conf = (OnConflictExpr *) node;
+
+ APP_JUMB(conf->action);
+ JumbleExpr(jstate, (Node *) conf->arbiterElems);
+ JumbleExpr(jstate, conf->arbiterWhere);
+ JumbleExpr(jstate, (Node *) conf->onConflictSet);
+ JumbleExpr(jstate, conf->onConflictWhere);
+ APP_JUMB(conf->constraint);
+ APP_JUMB(conf->exclRelIndex);
+ JumbleExpr(jstate, (Node *) conf->exclRelTlist);
+ }
+ break;
+ case T_MergeAction:
+ {
+ MergeAction *mergeaction = (MergeAction *) node;
+
+ APP_JUMB(mergeaction->matched);
+ APP_JUMB(mergeaction->commandType);
+ JumbleExpr(jstate, mergeaction->qual);
+ JumbleExpr(jstate, (Node *) mergeaction->targetList);
+ }
+ break;
+ case T_List:
+ foreach(temp, (List *) node)
+ {
+ JumbleExpr(jstate, (Node *) lfirst(temp));
+ }
+ break;
+ case T_IntList:
+ foreach(temp, (List *) node)
+ {
+ APP_JUMB(lfirst_int(temp));
+ }
+ break;
+ case T_SortGroupClause:
+ {
+ SortGroupClause *sgc = (SortGroupClause *) node;
+
+ APP_JUMB(sgc->tleSortGroupRef);
+ APP_JUMB(sgc->eqop);
+ APP_JUMB(sgc->sortop);
+ APP_JUMB(sgc->nulls_first);
+ }
+ break;
+ case T_GroupingSet:
+ {
+ GroupingSet *gsnode = (GroupingSet *) node;
+
+ JumbleExpr(jstate, (Node *) gsnode->content);
+ }
+ break;
+ case T_WindowClause:
+ {
+ WindowClause *wc = (WindowClause *) node;
+
+ APP_JUMB(wc->winref);
+ APP_JUMB(wc->frameOptions);
+ JumbleExpr(jstate, (Node *) wc->partitionClause);
+ JumbleExpr(jstate, (Node *) wc->orderClause);
+ JumbleExpr(jstate, wc->startOffset);
+ JumbleExpr(jstate, wc->endOffset);
+ }
+ break;
+ case T_CommonTableExpr:
+ {
+ CommonTableExpr *cte = (CommonTableExpr *) node;
+
+ /* we store the string name because RTE_CTE RTEs need it */
+ APP_JUMB_STRING(cte->ctename);
+ APP_JUMB(cte->ctematerialized);
+ JumbleQueryInternal(jstate, castNode(Query, cte->ctequery));
+ }
+ break;
+ case T_SetOperationStmt:
+ {
+ SetOperationStmt *setop = (SetOperationStmt *) node;
+
+ APP_JUMB(setop->op);
+ APP_JUMB(setop->all);
+ JumbleExpr(jstate, setop->larg);
+ JumbleExpr(jstate, setop->rarg);
+ }
+ break;
+ case T_RangeTblFunction:
+ {
+ RangeTblFunction *rtfunc = (RangeTblFunction *) node;
+
+ JumbleExpr(jstate, rtfunc->funcexpr);
+ }
+ break;
+ case T_TableFunc:
+ {
+ TableFunc *tablefunc = (TableFunc *) node;
+
+ JumbleExpr(jstate, tablefunc->docexpr);
+ JumbleExpr(jstate, tablefunc->rowexpr);
+ JumbleExpr(jstate, (Node *) tablefunc->colexprs);
+ }
+ break;
+ case T_TableSampleClause:
+ {
+ TableSampleClause *tsc = (TableSampleClause *) node;
+
+ APP_JUMB(tsc->tsmhandler);
+ JumbleExpr(jstate, (Node *) tsc->args);
+ JumbleExpr(jstate, (Node *) tsc->repeatable);
+ }
+ break;
+ default:
+ /* Only a warning, since we can stumble along anyway */
+ elog(WARNING, "unrecognized node type: %d",
+ (int) nodeTag(node));
+ break;
+ }
+}
+
+/*
+ * Record location of constant within query string of query tree
+ * that is currently being walked.
+ */
+static void
+RecordConstLocation(JumbleState *jstate, int location)
+{
+ /* -1 indicates unknown or undefined location */
+ if (location >= 0)
+ {
+ /* enlarge array if needed */
+ if (jstate->clocations_count >= jstate->clocations_buf_size)
+ {
+ jstate->clocations_buf_size *= 2;
+ jstate->clocations = (LocationLen *)
+ repalloc(jstate->clocations,
+ jstate->clocations_buf_size *
+ sizeof(LocationLen));
+ }
+ jstate->clocations[jstate->clocations_count].location = location;
+ /* initialize lengths to -1 to simplify third-party module usage */
+ jstate->clocations[jstate->clocations_count].length = -1;
+ jstate->clocations_count++;
+ }
+}
diff --git a/src/backend/utils/misc/rls.c b/src/backend/utils/misc/rls.c
new file mode 100644
index 0000000..d158806
--- /dev/null
+++ b/src/backend/utils/misc/rls.c
@@ -0,0 +1,167 @@
+/*-------------------------------------------------------------------------
+ *
+ * rls.c
+ * RLS-related utility functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/rls.c
+ *
+ *-------------------------------------------------------------------------
+*/
+#include "postgres.h"
+
+#include "access/htup.h"
+#include "access/htup_details.h"
+#include "access/transam.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_class.h"
+#include "miscadmin.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/rls.h"
+#include "utils/syscache.h"
+#include "utils/varlena.h"
+
+
+/*
+ * check_enable_rls
+ *
+ * Determine, based on the relation, row_security setting, and current role,
+ * if RLS is applicable to this query. RLS_NONE_ENV indicates that, while
+ * RLS is not to be added for this query, a change in the environment may change
+ * that. RLS_NONE means that RLS is not on the relation at all and therefore
+ * we don't need to worry about it. RLS_ENABLED means RLS should be implemented
+ * for the table and the plan cache needs to be invalidated if the environment
+ * changes.
+ *
+ * Handle checking as another role via checkAsUser (for views, etc). Pass
+ * InvalidOid to check the current user.
+ *
+ * If noError is set to 'true' then we just return RLS_ENABLED instead of doing
+ * an ereport() if the user has attempted to bypass RLS and they are not
+ * allowed to. This allows users to check if RLS is enabled without having to
+ * deal with the actual error case (eg: error cases which are trying to decide
+ * if the user should get data from the relation back as part of the error).
+ */
+int
+check_enable_rls(Oid relid, Oid checkAsUser, bool noError)
+{
+ Oid user_id = checkAsUser ? checkAsUser : GetUserId();
+ HeapTuple tuple;
+ Form_pg_class classform;
+ bool relrowsecurity;
+ bool relforcerowsecurity;
+ bool amowner;
+
+ /* Nothing to do for built-in relations */
+ if (relid < (Oid) FirstNormalObjectId)
+ return RLS_NONE;
+
+ /* Fetch relation's relrowsecurity and relforcerowsecurity flags */
+ tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (!HeapTupleIsValid(tuple))
+ return RLS_NONE;
+ classform = (Form_pg_class) GETSTRUCT(tuple);
+
+ relrowsecurity = classform->relrowsecurity;
+ relforcerowsecurity = classform->relforcerowsecurity;
+
+ ReleaseSysCache(tuple);
+
+ /* Nothing to do if the relation does not have RLS */
+ if (!relrowsecurity)
+ return RLS_NONE;
+
+ /*
+ * BYPASSRLS users always bypass RLS. Note that superusers are always
+ * considered to have BYPASSRLS.
+ *
+ * Return RLS_NONE_ENV to indicate that this decision depends on the
+ * environment (in this case, the user_id).
+ */
+ if (has_bypassrls_privilege(user_id))
+ return RLS_NONE_ENV;
+
+ /*
+ * Table owners generally bypass RLS, except if the table has been set (by
+ * an owner) to FORCE ROW SECURITY, and this is not a referential
+ * integrity check.
+ *
+ * Return RLS_NONE_ENV to indicate that this decision depends on the
+ * environment (in this case, the user_id).
+ */
+ amowner = pg_class_ownercheck(relid, user_id);
+ if (amowner)
+ {
+ /*
+ * If FORCE ROW LEVEL SECURITY has been set on the relation then we
+ * should return RLS_ENABLED to indicate that RLS should be applied.
+ * If not, or if we are in an InNoForceRLSOperation context, we return
+ * RLS_NONE_ENV.
+ *
+ * InNoForceRLSOperation indicates that we should not apply RLS even
+ * if the table has FORCE RLS set - IF the current user is the owner.
+ * This is specifically to ensure that referential integrity checks
+ * are able to still run correctly.
+ *
+ * This is intentionally only done after we have checked that the user
+ * is the table owner, which should always be the case for referential
+ * integrity checks.
+ */
+ if (!relforcerowsecurity || InNoForceRLSOperation())
+ return RLS_NONE_ENV;
+ }
+
+ /*
+ * We should apply RLS. However, the user may turn off the row_security
+ * GUC to get a forced error instead.
+ */
+ if (!row_security && !noError)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("query would be affected by row-level security policy for table \"%s\"",
+ get_rel_name(relid)),
+ amowner ? errhint("To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY.") : 0));
+
+ /* RLS should be fully enabled for this relation. */
+ return RLS_ENABLED;
+}
+
+/*
+ * row_security_active
+ *
+ * check_enable_rls wrapped as a SQL callable function except
+ * RLS_NONE_ENV and RLS_NONE are the same for this purpose.
+ */
+Datum
+row_security_active(PG_FUNCTION_ARGS)
+{
+ /* By OID */
+ Oid tableoid = PG_GETARG_OID(0);
+ int rls_status;
+
+ rls_status = check_enable_rls(tableoid, InvalidOid, true);
+ PG_RETURN_BOOL(rls_status == RLS_ENABLED);
+}
+
+Datum
+row_security_active_name(PG_FUNCTION_ARGS)
+{
+ /* By qualified name */
+ text *tablename = PG_GETARG_TEXT_PP(0);
+ RangeVar *tablerel;
+ Oid tableoid;
+ int rls_status;
+
+ /* Look up table name. Can't lock it - we might not have privileges. */
+ tablerel = makeRangeVarFromNameList(textToQualifiedNameList(tablename));
+ tableoid = RangeVarGetRelid(tablerel, NoLock, false);
+
+ rls_status = check_enable_rls(tableoid, InvalidOid, true);
+ PG_RETURN_BOOL(rls_status == RLS_ENABLED);
+}
diff --git a/src/backend/utils/misc/sampling.c b/src/backend/utils/misc/sampling.c
new file mode 100644
index 0000000..580e9d9
--- /dev/null
+++ b/src/backend/utils/misc/sampling.c
@@ -0,0 +1,304 @@
+/*-------------------------------------------------------------------------
+ *
+ * sampling.c
+ * Relation block sampling routines.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/sampling.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <math.h>
+
+#include "utils/sampling.h"
+
+
+/*
+ * BlockSampler_Init -- prepare for random sampling of blocknumbers
+ *
+ * BlockSampler provides algorithm for block level sampling of a relation
+ * as discussed on pgsql-hackers 2004-04-02 (subject "Large DB")
+ * It selects a random sample of samplesize blocks out of
+ * the nblocks blocks in the table. If the table has less than
+ * samplesize blocks, all blocks are selected.
+ *
+ * Since we know the total number of blocks in advance, we can use the
+ * straightforward Algorithm S from Knuth 3.4.2, rather than Vitter's
+ * algorithm.
+ *
+ * Returns the number of blocks that BlockSampler_Next will return.
+ */
+BlockNumber
+BlockSampler_Init(BlockSampler bs, BlockNumber nblocks, int samplesize,
+ uint32 randseed)
+{
+ bs->N = nblocks; /* measured table size */
+
+ /*
+ * If we decide to reduce samplesize for tables that have less or not much
+ * more than samplesize blocks, here is the place to do it.
+ */
+ bs->n = samplesize;
+ bs->t = 0; /* blocks scanned so far */
+ bs->m = 0; /* blocks selected so far */
+
+ sampler_random_init_state(randseed, &bs->randstate);
+
+ return Min(bs->n, bs->N);
+}
+
+bool
+BlockSampler_HasMore(BlockSampler bs)
+{
+ return (bs->t < bs->N) && (bs->m < bs->n);
+}
+
+BlockNumber
+BlockSampler_Next(BlockSampler bs)
+{
+ BlockNumber K = bs->N - bs->t; /* remaining blocks */
+ int k = bs->n - bs->m; /* blocks still to sample */
+ double p; /* probability to skip block */
+ double V; /* random */
+
+ Assert(BlockSampler_HasMore(bs)); /* hence K > 0 and k > 0 */
+
+ if ((BlockNumber) k >= K)
+ {
+ /* need all the rest */
+ bs->m++;
+ return bs->t++;
+ }
+
+ /*----------
+ * It is not obvious that this code matches Knuth's Algorithm S.
+ * Knuth says to skip the current block with probability 1 - k/K.
+ * If we are to skip, we should advance t (hence decrease K), and
+ * repeat the same probabilistic test for the next block. The naive
+ * implementation thus requires a sampler_random_fract() call for each
+ * block number. But we can reduce this to one sampler_random_fract()
+ * call per selected block, by noting that each time the while-test
+ * succeeds, we can reinterpret V as a uniform random number in the range
+ * 0 to p. Therefore, instead of choosing a new V, we just adjust p to be
+ * the appropriate fraction of its former value, and our next loop
+ * makes the appropriate probabilistic test.
+ *
+ * We have initially K > k > 0. If the loop reduces K to equal k,
+ * the next while-test must fail since p will become exactly zero
+ * (we assume there will not be roundoff error in the division).
+ * (Note: Knuth suggests a "<=" loop condition, but we use "<" just
+ * to be doubly sure about roundoff error.) Therefore K cannot become
+ * less than k, which means that we cannot fail to select enough blocks.
+ *----------
+ */
+ V = sampler_random_fract(&bs->randstate);
+ p = 1.0 - (double) k / (double) K;
+ while (V < p)
+ {
+ /* skip */
+ bs->t++;
+ K--; /* keep K == N - t */
+
+ /* adjust p to be new cutoff point in reduced range */
+ p *= 1.0 - (double) k / (double) K;
+ }
+
+ /* select */
+ bs->m++;
+ return bs->t++;
+}
+
+/*
+ * These two routines embody Algorithm Z from "Random sampling with a
+ * reservoir" by Jeffrey S. Vitter, in ACM Trans. Math. Softw. 11, 1
+ * (Mar. 1985), Pages 37-57. Vitter describes his algorithm in terms
+ * of the count S of records to skip before processing another record.
+ * It is computed primarily based on t, the number of records already read.
+ * The only extra state needed between calls is W, a random state variable.
+ *
+ * reservoir_init_selection_state computes the initial W value.
+ *
+ * Given that we've already read t records (t >= n), reservoir_get_next_S
+ * determines the number of records to skip before the next record is
+ * processed.
+ */
+void
+reservoir_init_selection_state(ReservoirState rs, int n)
+{
+ /*
+ * Reservoir sampling is not used anywhere where it would need to return
+ * repeatable results so we can initialize it randomly.
+ */
+ sampler_random_init_state(pg_prng_uint32(&pg_global_prng_state),
+ &rs->randstate);
+
+ /* Initial value of W (for use when Algorithm Z is first applied) */
+ rs->W = exp(-log(sampler_random_fract(&rs->randstate)) / n);
+}
+
+double
+reservoir_get_next_S(ReservoirState rs, double t, int n)
+{
+ double S;
+
+ /* The magic constant here is T from Vitter's paper */
+ if (t <= (22.0 * n))
+ {
+ /* Process records using Algorithm X until t is large enough */
+ double V,
+ quot;
+
+ V = sampler_random_fract(&rs->randstate); /* Generate V */
+ S = 0;
+ t += 1;
+ /* Note: "num" in Vitter's code is always equal to t - n */
+ quot = (t - (double) n) / t;
+ /* Find min S satisfying (4.1) */
+ while (quot > V)
+ {
+ S += 1;
+ t += 1;
+ quot *= (t - (double) n) / t;
+ }
+ }
+ else
+ {
+ /* Now apply Algorithm Z */
+ double W = rs->W;
+ double term = t - (double) n + 1;
+
+ for (;;)
+ {
+ double numer,
+ numer_lim,
+ denom;
+ double U,
+ X,
+ lhs,
+ rhs,
+ y,
+ tmp;
+
+ /* Generate U and X */
+ U = sampler_random_fract(&rs->randstate);
+ X = t * (W - 1.0);
+ S = floor(X); /* S is tentatively set to floor(X) */
+ /* Test if U <= h(S)/cg(X) in the manner of (6.3) */
+ tmp = (t + 1) / term;
+ lhs = exp(log(((U * tmp * tmp) * (term + S)) / (t + X)) / n);
+ rhs = (((t + X) / (term + S)) * term) / t;
+ if (lhs <= rhs)
+ {
+ W = rhs / lhs;
+ break;
+ }
+ /* Test if U <= f(S)/cg(X) */
+ y = (((U * (t + 1)) / term) * (t + S + 1)) / (t + X);
+ if ((double) n < S)
+ {
+ denom = t;
+ numer_lim = term + S;
+ }
+ else
+ {
+ denom = t - (double) n + S;
+ numer_lim = t + 1;
+ }
+ for (numer = t + S; numer >= numer_lim; numer -= 1)
+ {
+ y *= numer / denom;
+ denom -= 1;
+ }
+ W = exp(-log(sampler_random_fract(&rs->randstate)) / n); /* Generate W in advance */
+ if (exp(log(y) / n) <= (t + X) / t)
+ break;
+ }
+ rs->W = W;
+ }
+ return S;
+}
+
+
+/*----------
+ * Random number generator used by sampling
+ *----------
+ */
+void
+sampler_random_init_state(uint32 seed, pg_prng_state *randstate)
+{
+ pg_prng_seed(randstate, (uint64) seed);
+}
+
+/* Select a random value R uniformly distributed in (0 - 1) */
+double
+sampler_random_fract(pg_prng_state *randstate)
+{
+ double res;
+
+ /* pg_prng_double returns a value in [0.0 - 1.0), so we must reject 0.0 */
+ do
+ {
+ res = pg_prng_double(randstate);
+ } while (unlikely(res == 0.0));
+ return res;
+}
+
+
+/*
+ * Backwards-compatible API for block sampling
+ *
+ * This code is now deprecated, but since it's still in use by many FDWs,
+ * we should keep it for awhile at least. The functionality is the same as
+ * sampler_random_fract/reservoir_init_selection_state/reservoir_get_next_S,
+ * except that a common random state is used across all callers.
+ */
+static ReservoirStateData oldrs;
+static bool oldrs_initialized = false;
+
+double
+anl_random_fract(void)
+{
+ /* initialize if first time through */
+ if (unlikely(!oldrs_initialized))
+ {
+ sampler_random_init_state(pg_prng_uint32(&pg_global_prng_state),
+ &oldrs.randstate);
+ oldrs_initialized = true;
+ }
+
+ /* and compute a random fraction */
+ return sampler_random_fract(&oldrs.randstate);
+}
+
+double
+anl_init_selection_state(int n)
+{
+ /* initialize if first time through */
+ if (unlikely(!oldrs_initialized))
+ {
+ sampler_random_init_state(pg_prng_uint32(&pg_global_prng_state),
+ &oldrs.randstate);
+ oldrs_initialized = true;
+ }
+
+ /* Initial value of W (for use when Algorithm Z is first applied) */
+ return exp(-log(sampler_random_fract(&oldrs.randstate)) / n);
+}
+
+double
+anl_get_next_S(double t, int n, double *stateptr)
+{
+ double result;
+
+ oldrs.W = *stateptr;
+ result = reservoir_get_next_S(&oldrs, t, n);
+ *stateptr = oldrs.W;
+ return result;
+}
diff --git a/src/backend/utils/misc/superuser.c b/src/backend/utils/misc/superuser.c
new file mode 100644
index 0000000..d20e7af
--- /dev/null
+++ b/src/backend/utils/misc/superuser.c
@@ -0,0 +1,107 @@
+/*-------------------------------------------------------------------------
+ *
+ * superuser.c
+ * The superuser() function. Determines if user has superuser privilege.
+ *
+ * All code should use either of these two functions to find out
+ * whether a given user is a superuser, rather than examining
+ * pg_authid.rolsuper directly, so that the escape hatch built in for
+ * the single-user case works.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/superuser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "catalog/pg_authid.h"
+#include "miscadmin.h"
+#include "utils/inval.h"
+#include "utils/syscache.h"
+
+/*
+ * In common cases the same roleid (ie, the session or current ID) will
+ * be queried repeatedly. So we maintain a simple one-entry cache for
+ * the status of the last requested roleid. The cache can be flushed
+ * at need by watching for cache update events on pg_authid.
+ */
+static Oid last_roleid = InvalidOid; /* InvalidOid == cache not valid */
+static bool last_roleid_is_super = false;
+static bool roleid_callback_registered = false;
+
+static void RoleidCallback(Datum arg, int cacheid, uint32 hashvalue);
+
+
+/*
+ * The Postgres user running this command has Postgres superuser privileges
+ */
+bool
+superuser(void)
+{
+ return superuser_arg(GetUserId());
+}
+
+
+/*
+ * The specified role has Postgres superuser privileges
+ */
+bool
+superuser_arg(Oid roleid)
+{
+ bool result;
+ HeapTuple rtup;
+
+ /* Quick out for cache hit */
+ if (OidIsValid(last_roleid) && last_roleid == roleid)
+ return last_roleid_is_super;
+
+ /* Special escape path in case you deleted all your users. */
+ if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
+ return true;
+
+ /* OK, look up the information in pg_authid */
+ rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
+ if (HeapTupleIsValid(rtup))
+ {
+ result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;
+ ReleaseSysCache(rtup);
+ }
+ else
+ {
+ /* Report "not superuser" for invalid roleids */
+ result = false;
+ }
+
+ /* If first time through, set up callback for cache flushes */
+ if (!roleid_callback_registered)
+ {
+ CacheRegisterSyscacheCallback(AUTHOID,
+ RoleidCallback,
+ (Datum) 0);
+ roleid_callback_registered = true;
+ }
+
+ /* Cache the result for next time */
+ last_roleid = roleid;
+ last_roleid_is_super = result;
+
+ return result;
+}
+
+/*
+ * RoleidCallback
+ * Syscache inval callback function
+ */
+static void
+RoleidCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ /* Invalidate our local cache in case role's superuserness changed */
+ last_roleid = InvalidOid;
+}
diff --git a/src/backend/utils/misc/timeout.c b/src/backend/utils/misc/timeout.c
new file mode 100644
index 0000000..6f5e08b
--- /dev/null
+++ b/src/backend/utils/misc/timeout.c
@@ -0,0 +1,834 @@
+/*-------------------------------------------------------------------------
+ *
+ * timeout.c
+ * Routines to multiplex SIGALRM interrupts for multiple timeout reasons.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/timeout.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/time.h>
+
+#include "miscadmin.h"
+#include "storage/proc.h"
+#include "utils/timeout.h"
+#include "utils/timestamp.h"
+
+
+/* Data about any one timeout reason */
+typedef struct timeout_params
+{
+ TimeoutId index; /* identifier of timeout reason */
+
+ /* volatile because these may be changed from the signal handler */
+ volatile bool active; /* true if timeout is in active_timeouts[] */
+ volatile bool indicator; /* true if timeout has occurred */
+
+ /* callback function for timeout, or NULL if timeout not registered */
+ timeout_handler_proc timeout_handler;
+
+ TimestampTz start_time; /* time that timeout was last activated */
+ TimestampTz fin_time; /* time it is, or was last, due to fire */
+ int interval_in_ms; /* time between firings, or 0 if just once */
+} timeout_params;
+
+/*
+ * List of possible timeout reasons in the order of enum TimeoutId.
+ */
+static timeout_params all_timeouts[MAX_TIMEOUTS];
+static bool all_timeouts_initialized = false;
+
+/*
+ * List of active timeouts ordered by their fin_time and priority.
+ * This list is subject to change by the interrupt handler, so it's volatile.
+ */
+static volatile int num_active_timeouts = 0;
+static timeout_params *volatile active_timeouts[MAX_TIMEOUTS];
+
+/*
+ * Flag controlling whether the signal handler is allowed to do anything.
+ * This is useful to avoid race conditions with the handler. Note in
+ * particular that this lets us make changes in the data structures without
+ * tediously disabling and re-enabling the timer signal. Most of the time,
+ * no interrupt would happen anyway during such critical sections, but if
+ * one does, this rule ensures it's safe. Leaving the signal enabled across
+ * multiple operations can greatly reduce the number of kernel calls we make,
+ * too. See comments in schedule_alarm() about that.
+ *
+ * We leave this "false" when we're not expecting interrupts, just in case.
+ */
+static volatile sig_atomic_t alarm_enabled = false;
+
+#define disable_alarm() (alarm_enabled = false)
+#define enable_alarm() (alarm_enabled = true)
+
+/*
+ * State recording if and when we next expect the interrupt to fire.
+ * (signal_due_at is valid only when signal_pending is true.)
+ * Note that the signal handler will unconditionally reset signal_pending to
+ * false, so that can change asynchronously even when alarm_enabled is false.
+ */
+static volatile sig_atomic_t signal_pending = false;
+static volatile TimestampTz signal_due_at = 0;
+
+
+/*****************************************************************************
+ * Internal helper functions
+ *
+ * For all of these, it is caller's responsibility to protect them from
+ * interruption by the signal handler. Generally, call disable_alarm()
+ * first to prevent interruption, then update state, and last call
+ * schedule_alarm(), which will re-enable the signal handler if needed.
+ *****************************************************************************/
+
+/*
+ * Find the index of a given timeout reason in the active array.
+ * If it's not there, return -1.
+ */
+static int
+find_active_timeout(TimeoutId id)
+{
+ int i;
+
+ for (i = 0; i < num_active_timeouts; i++)
+ {
+ if (active_timeouts[i]->index == id)
+ return i;
+ }
+
+ return -1;
+}
+
+/*
+ * Insert specified timeout reason into the list of active timeouts
+ * at the given index.
+ */
+static void
+insert_timeout(TimeoutId id, int index)
+{
+ int i;
+
+ if (index < 0 || index > num_active_timeouts)
+ elog(FATAL, "timeout index %d out of range 0..%d", index,
+ num_active_timeouts);
+
+ Assert(!all_timeouts[id].active);
+ all_timeouts[id].active = true;
+
+ for (i = num_active_timeouts - 1; i >= index; i--)
+ active_timeouts[i + 1] = active_timeouts[i];
+
+ active_timeouts[index] = &all_timeouts[id];
+
+ num_active_timeouts++;
+}
+
+/*
+ * Remove the index'th element from the timeout list.
+ */
+static void
+remove_timeout_index(int index)
+{
+ int i;
+
+ if (index < 0 || index >= num_active_timeouts)
+ elog(FATAL, "timeout index %d out of range 0..%d", index,
+ num_active_timeouts - 1);
+
+ Assert(active_timeouts[index]->active);
+ active_timeouts[index]->active = false;
+
+ for (i = index + 1; i < num_active_timeouts; i++)
+ active_timeouts[i - 1] = active_timeouts[i];
+
+ num_active_timeouts--;
+}
+
+/*
+ * Enable the specified timeout reason
+ */
+static void
+enable_timeout(TimeoutId id, TimestampTz now, TimestampTz fin_time,
+ int interval_in_ms)
+{
+ int i;
+
+ /* Assert request is sane */
+ Assert(all_timeouts_initialized);
+ Assert(all_timeouts[id].timeout_handler != NULL);
+
+ /*
+ * If this timeout was already active, momentarily disable it. We
+ * interpret the call as a directive to reschedule the timeout.
+ */
+ if (all_timeouts[id].active)
+ remove_timeout_index(find_active_timeout(id));
+
+ /*
+ * Find out the index where to insert the new timeout. We sort by
+ * fin_time, and for equal fin_time by priority.
+ */
+ for (i = 0; i < num_active_timeouts; i++)
+ {
+ timeout_params *old_timeout = active_timeouts[i];
+
+ if (fin_time < old_timeout->fin_time)
+ break;
+ if (fin_time == old_timeout->fin_time && id < old_timeout->index)
+ break;
+ }
+
+ /*
+ * Mark the timeout active, and insert it into the active list.
+ */
+ all_timeouts[id].indicator = false;
+ all_timeouts[id].start_time = now;
+ all_timeouts[id].fin_time = fin_time;
+ all_timeouts[id].interval_in_ms = interval_in_ms;
+
+ insert_timeout(id, i);
+}
+
+/*
+ * Schedule alarm for the next active timeout, if any
+ *
+ * We assume the caller has obtained the current time, or a close-enough
+ * approximation. (It's okay if a tick or two has passed since "now", or
+ * if a little more time elapses before we reach the kernel call; that will
+ * cause us to ask for an interrupt a tick or two later than the nearest
+ * timeout, which is no big deal. Passing a "now" value that's in the future
+ * would be bad though.)
+ */
+static void
+schedule_alarm(TimestampTz now)
+{
+ if (num_active_timeouts > 0)
+ {
+ struct itimerval timeval;
+ TimestampTz nearest_timeout;
+ long secs;
+ int usecs;
+
+ MemSet(&timeval, 0, sizeof(struct itimerval));
+
+ /*
+ * If we think there's a signal pending, but current time is more than
+ * 10ms past when the signal was due, then assume that the timeout
+ * request got lost somehow; clear signal_pending so that we'll reset
+ * the interrupt request below. (10ms corresponds to the worst-case
+ * timeout granularity on modern systems.) It won't hurt us if the
+ * interrupt does manage to fire between now and when we reach the
+ * setitimer() call.
+ */
+ if (signal_pending && now > signal_due_at + 10 * 1000)
+ signal_pending = false;
+
+ /*
+ * Get the time remaining till the nearest pending timeout. If it is
+ * negative, assume that we somehow missed an interrupt, and clear
+ * signal_pending. This gives us another chance to recover if the
+ * kernel drops a timeout request for some reason.
+ */
+ nearest_timeout = active_timeouts[0]->fin_time;
+ if (now > nearest_timeout)
+ {
+ signal_pending = false;
+ /* force an interrupt as soon as possible */
+ secs = 0;
+ usecs = 1;
+ }
+ else
+ {
+ TimestampDifference(now, nearest_timeout,
+ &secs, &usecs);
+
+ /*
+ * It's possible that the difference is less than a microsecond;
+ * ensure we don't cancel, rather than set, the interrupt.
+ */
+ if (secs == 0 && usecs == 0)
+ usecs = 1;
+ }
+
+ timeval.it_value.tv_sec = secs;
+ timeval.it_value.tv_usec = usecs;
+
+ /*
+ * We must enable the signal handler before calling setitimer(); if we
+ * did it in the other order, we'd have a race condition wherein the
+ * interrupt could occur before we can set alarm_enabled, so that the
+ * signal handler would fail to do anything.
+ *
+ * Because we didn't bother to disable the timer in disable_alarm(),
+ * it's possible that a previously-set interrupt will fire between
+ * enable_alarm() and setitimer(). This is safe, however. There are
+ * two possible outcomes:
+ *
+ * 1. The signal handler finds nothing to do (because the nearest
+ * timeout event is still in the future). It will re-set the timer
+ * and return. Then we'll overwrite the timer value with a new one.
+ * This will mean that the timer fires a little later than we
+ * intended, but only by the amount of time it takes for the signal
+ * handler to do nothing useful, which shouldn't be much.
+ *
+ * 2. The signal handler executes and removes one or more timeout
+ * events. When it returns, either the queue is now empty or the
+ * frontmost event is later than the one we looked at above. So we'll
+ * overwrite the timer value with one that is too soon (plus or minus
+ * the signal handler's execution time), causing a useless interrupt
+ * to occur. But the handler will then re-set the timer and
+ * everything will still work as expected.
+ *
+ * Since these cases are of very low probability (the window here
+ * being quite narrow), it's not worth adding cycles to the mainline
+ * code to prevent occasional wasted interrupts.
+ */
+ enable_alarm();
+
+ /*
+ * If there is already an interrupt pending that's at or before the
+ * needed time, we need not do anything more. The signal handler will
+ * do the right thing in the first case, and re-schedule the interrupt
+ * for later in the second case. It might seem that the extra
+ * interrupt is wasted work, but it's not terribly much work, and this
+ * method has very significant advantages in the common use-case where
+ * we repeatedly set a timeout that we don't expect to reach and then
+ * cancel it. Instead of invoking setitimer() every time the timeout
+ * is set or canceled, we perform one interrupt and a re-scheduling
+ * setitimer() call at intervals roughly equal to the timeout delay.
+ * For example, with statement_timeout = 1s and a throughput of
+ * thousands of queries per second, this method requires an interrupt
+ * and setitimer() call roughly once a second, rather than thousands
+ * of setitimer() calls per second.
+ *
+ * Because of the possible passage of time between when we obtained
+ * "now" and when we reach setitimer(), the kernel's opinion of when
+ * to trigger the interrupt is likely to be a bit later than
+ * signal_due_at. That's fine, for the same reasons described above.
+ */
+ if (signal_pending && nearest_timeout >= signal_due_at)
+ return;
+
+ /*
+ * As with calling enable_alarm(), we must set signal_pending *before*
+ * calling setitimer(); if we did it after, the signal handler could
+ * trigger before we set it, leaving us with a false opinion that a
+ * signal is still coming.
+ *
+ * Other race conditions involved with setting/checking signal_pending
+ * are okay, for the reasons described above. One additional point is
+ * that the signal handler could fire after we set signal_due_at, but
+ * still before the setitimer() call. Then the handler could
+ * overwrite signal_due_at with a value it computes, which will be the
+ * same as or perhaps later than what we just computed. After we
+ * perform setitimer(), the net effect would be that signal_due_at
+ * gives a time later than when the interrupt will really happen;
+ * which is a safe situation.
+ */
+ signal_due_at = nearest_timeout;
+ signal_pending = true;
+
+ /* Set the alarm timer */
+ if (setitimer(ITIMER_REAL, &timeval, NULL) != 0)
+ {
+ /*
+ * Clearing signal_pending here is a bit pro forma, but not
+ * entirely so, since something in the FATAL exit path could try
+ * to use timeout facilities.
+ */
+ signal_pending = false;
+ elog(FATAL, "could not enable SIGALRM timer: %m");
+ }
+ }
+}
+
+
+/*****************************************************************************
+ * Signal handler
+ *****************************************************************************/
+
+/*
+ * Signal handler for SIGALRM
+ *
+ * Process any active timeout reasons and then reschedule the interrupt
+ * as needed.
+ */
+static void
+handle_sig_alarm(SIGNAL_ARGS)
+{
+ int save_errno = errno;
+
+ /*
+ * Bump the holdoff counter, to make sure nothing we call will process
+ * interrupts directly. No timeout handler should do that, but these
+ * failures are hard to debug, so better be sure.
+ */
+ HOLD_INTERRUPTS();
+
+ /*
+ * SIGALRM is always cause for waking anything waiting on the process
+ * latch.
+ */
+ SetLatch(MyLatch);
+
+ /*
+ * Always reset signal_pending, even if !alarm_enabled, since indeed no
+ * signal is now pending.
+ */
+ signal_pending = false;
+
+ /*
+ * Fire any pending timeouts, but only if we're enabled to do so.
+ */
+ if (alarm_enabled)
+ {
+ /*
+ * Disable alarms, just in case this platform allows signal handlers
+ * to interrupt themselves. schedule_alarm() will re-enable if
+ * appropriate.
+ */
+ disable_alarm();
+
+ if (num_active_timeouts > 0)
+ {
+ TimestampTz now = GetCurrentTimestamp();
+
+ /* While the first pending timeout has been reached ... */
+ while (num_active_timeouts > 0 &&
+ now >= active_timeouts[0]->fin_time)
+ {
+ timeout_params *this_timeout = active_timeouts[0];
+
+ /* Remove it from the active list */
+ remove_timeout_index(0);
+
+ /* Mark it as fired */
+ this_timeout->indicator = true;
+
+ /* And call its handler function */
+ this_timeout->timeout_handler();
+
+ /* If it should fire repeatedly, re-enable it. */
+ if (this_timeout->interval_in_ms > 0)
+ {
+ TimestampTz new_fin_time;
+
+ /*
+ * To guard against drift, schedule the next instance of
+ * the timeout based on the intended firing time rather
+ * than the actual firing time. But if the timeout was so
+ * late that we missed an entire cycle, fall back to
+ * scheduling based on the actual firing time.
+ */
+ new_fin_time =
+ TimestampTzPlusMilliseconds(this_timeout->fin_time,
+ this_timeout->interval_in_ms);
+ if (new_fin_time < now)
+ new_fin_time =
+ TimestampTzPlusMilliseconds(now,
+ this_timeout->interval_in_ms);
+ enable_timeout(this_timeout->index, now, new_fin_time,
+ this_timeout->interval_in_ms);
+ }
+
+ /*
+ * The handler might not take negligible time (CheckDeadLock
+ * for instance isn't too cheap), so let's update our idea of
+ * "now" after each one.
+ */
+ now = GetCurrentTimestamp();
+ }
+
+ /* Done firing timeouts, so reschedule next interrupt if any */
+ schedule_alarm(now);
+ }
+ }
+
+ RESUME_INTERRUPTS();
+
+ errno = save_errno;
+}
+
+
+/*****************************************************************************
+ * Public API
+ *****************************************************************************/
+
+/*
+ * Initialize timeout module.
+ *
+ * This must be called in every process that wants to use timeouts.
+ *
+ * If the process was forked from another one that was also using this
+ * module, be sure to call this before re-enabling signals; else handlers
+ * meant to run in the parent process might get invoked in this one.
+ */
+void
+InitializeTimeouts(void)
+{
+ int i;
+
+ /* Initialize, or re-initialize, all local state */
+ disable_alarm();
+
+ num_active_timeouts = 0;
+
+ for (i = 0; i < MAX_TIMEOUTS; i++)
+ {
+ all_timeouts[i].index = i;
+ all_timeouts[i].active = false;
+ all_timeouts[i].indicator = false;
+ all_timeouts[i].timeout_handler = NULL;
+ all_timeouts[i].start_time = 0;
+ all_timeouts[i].fin_time = 0;
+ all_timeouts[i].interval_in_ms = 0;
+ }
+
+ all_timeouts_initialized = true;
+
+ /* Now establish the signal handler */
+ pqsignal(SIGALRM, handle_sig_alarm);
+}
+
+/*
+ * Register a timeout reason
+ *
+ * For predefined timeouts, this just registers the callback function.
+ *
+ * For user-defined timeouts, pass id == USER_TIMEOUT; we then allocate and
+ * return a timeout ID.
+ */
+TimeoutId
+RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
+{
+ Assert(all_timeouts_initialized);
+
+ /* There's no need to disable the signal handler here. */
+
+ if (id >= USER_TIMEOUT)
+ {
+ /* Allocate a user-defined timeout reason */
+ for (id = USER_TIMEOUT; id < MAX_TIMEOUTS; id++)
+ if (all_timeouts[id].timeout_handler == NULL)
+ break;
+ if (id >= MAX_TIMEOUTS)
+ ereport(FATAL,
+ (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
+ errmsg("cannot add more timeout reasons")));
+ }
+
+ Assert(all_timeouts[id].timeout_handler == NULL);
+
+ all_timeouts[id].timeout_handler = handler;
+
+ return id;
+}
+
+/*
+ * Reschedule any pending SIGALRM interrupt.
+ *
+ * This can be used during error recovery in case query cancel resulted in loss
+ * of a SIGALRM event (due to longjmp'ing out of handle_sig_alarm before it
+ * could do anything). But note it's not necessary if any of the public
+ * enable_ or disable_timeout functions are called in the same area, since
+ * those all do schedule_alarm() internally if needed.
+ */
+void
+reschedule_timeouts(void)
+{
+ /* For flexibility, allow this to be called before we're initialized. */
+ if (!all_timeouts_initialized)
+ return;
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Reschedule the interrupt, if any timeouts remain active. */
+ if (num_active_timeouts > 0)
+ schedule_alarm(GetCurrentTimestamp());
+}
+
+/*
+ * Enable the specified timeout to fire after the specified delay.
+ *
+ * Delay is given in milliseconds.
+ */
+void
+enable_timeout_after(TimeoutId id, int delay_ms)
+{
+ TimestampTz now;
+ TimestampTz fin_time;
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Queue the timeout at the appropriate time. */
+ now = GetCurrentTimestamp();
+ fin_time = TimestampTzPlusMilliseconds(now, delay_ms);
+ enable_timeout(id, now, fin_time, 0);
+
+ /* Set the timer interrupt. */
+ schedule_alarm(now);
+}
+
+/*
+ * Enable the specified timeout to fire periodically, with the specified
+ * delay as the time between firings.
+ *
+ * Delay is given in milliseconds.
+ */
+void
+enable_timeout_every(TimeoutId id, TimestampTz fin_time, int delay_ms)
+{
+ TimestampTz now;
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Queue the timeout at the appropriate time. */
+ now = GetCurrentTimestamp();
+ enable_timeout(id, now, fin_time, delay_ms);
+
+ /* Set the timer interrupt. */
+ schedule_alarm(now);
+}
+
+/*
+ * Enable the specified timeout to fire at the specified time.
+ *
+ * This is provided to support cases where there's a reason to calculate
+ * the timeout by reference to some point other than "now". If there isn't,
+ * use enable_timeout_after(), to avoid calling GetCurrentTimestamp() twice.
+ */
+void
+enable_timeout_at(TimeoutId id, TimestampTz fin_time)
+{
+ TimestampTz now;
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Queue the timeout at the appropriate time. */
+ now = GetCurrentTimestamp();
+ enable_timeout(id, now, fin_time, 0);
+
+ /* Set the timer interrupt. */
+ schedule_alarm(now);
+}
+
+/*
+ * Enable multiple timeouts at once.
+ *
+ * This works like calling enable_timeout_after() and/or enable_timeout_at()
+ * multiple times. Use this to reduce the number of GetCurrentTimestamp()
+ * and setitimer() calls needed to establish multiple timeouts.
+ */
+void
+enable_timeouts(const EnableTimeoutParams *timeouts, int count)
+{
+ TimestampTz now;
+ int i;
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Queue the timeout(s) at the appropriate times. */
+ now = GetCurrentTimestamp();
+
+ for (i = 0; i < count; i++)
+ {
+ TimeoutId id = timeouts[i].id;
+ TimestampTz fin_time;
+
+ switch (timeouts[i].type)
+ {
+ case TMPARAM_AFTER:
+ fin_time = TimestampTzPlusMilliseconds(now,
+ timeouts[i].delay_ms);
+ enable_timeout(id, now, fin_time, 0);
+ break;
+
+ case TMPARAM_AT:
+ enable_timeout(id, now, timeouts[i].fin_time, 0);
+ break;
+
+ case TMPARAM_EVERY:
+ fin_time = TimestampTzPlusMilliseconds(now,
+ timeouts[i].delay_ms);
+ enable_timeout(id, now, fin_time, timeouts[i].delay_ms);
+ break;
+
+ default:
+ elog(ERROR, "unrecognized timeout type %d",
+ (int) timeouts[i].type);
+ break;
+ }
+ }
+
+ /* Set the timer interrupt. */
+ schedule_alarm(now);
+}
+
+/*
+ * Cancel the specified timeout.
+ *
+ * The timeout's I've-been-fired indicator is reset,
+ * unless keep_indicator is true.
+ *
+ * When a timeout is canceled, any other active timeout remains in force.
+ * It's not an error to disable a timeout that is not enabled.
+ */
+void
+disable_timeout(TimeoutId id, bool keep_indicator)
+{
+ /* Assert request is sane */
+ Assert(all_timeouts_initialized);
+ Assert(all_timeouts[id].timeout_handler != NULL);
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Find the timeout and remove it from the active list. */
+ if (all_timeouts[id].active)
+ remove_timeout_index(find_active_timeout(id));
+
+ /* Mark it inactive, whether it was active or not. */
+ if (!keep_indicator)
+ all_timeouts[id].indicator = false;
+
+ /* Reschedule the interrupt, if any timeouts remain active. */
+ if (num_active_timeouts > 0)
+ schedule_alarm(GetCurrentTimestamp());
+}
+
+/*
+ * Cancel multiple timeouts at once.
+ *
+ * The timeouts' I've-been-fired indicators are reset,
+ * unless timeouts[i].keep_indicator is true.
+ *
+ * This works like calling disable_timeout() multiple times.
+ * Use this to reduce the number of GetCurrentTimestamp()
+ * and setitimer() calls needed to cancel multiple timeouts.
+ */
+void
+disable_timeouts(const DisableTimeoutParams *timeouts, int count)
+{
+ int i;
+
+ Assert(all_timeouts_initialized);
+
+ /* Disable timeout interrupts for safety. */
+ disable_alarm();
+
+ /* Cancel the timeout(s). */
+ for (i = 0; i < count; i++)
+ {
+ TimeoutId id = timeouts[i].id;
+
+ Assert(all_timeouts[id].timeout_handler != NULL);
+
+ if (all_timeouts[id].active)
+ remove_timeout_index(find_active_timeout(id));
+
+ if (!timeouts[i].keep_indicator)
+ all_timeouts[id].indicator = false;
+ }
+
+ /* Reschedule the interrupt, if any timeouts remain active. */
+ if (num_active_timeouts > 0)
+ schedule_alarm(GetCurrentTimestamp());
+}
+
+/*
+ * Disable the signal handler, remove all timeouts from the active list,
+ * and optionally reset their timeout indicators.
+ */
+void
+disable_all_timeouts(bool keep_indicators)
+{
+ int i;
+
+ disable_alarm();
+
+ /*
+ * We used to disable the timer interrupt here, but in common usage
+ * patterns it's cheaper to leave it enabled; that may save us from having
+ * to enable it again shortly. See comments in schedule_alarm().
+ */
+
+ num_active_timeouts = 0;
+
+ for (i = 0; i < MAX_TIMEOUTS; i++)
+ {
+ all_timeouts[i].active = false;
+ if (!keep_indicators)
+ all_timeouts[i].indicator = false;
+ }
+}
+
+/*
+ * Return true if the timeout is active (enabled and not yet fired)
+ *
+ * This is, of course, subject to race conditions, as the timeout could fire
+ * immediately after we look.
+ */
+bool
+get_timeout_active(TimeoutId id)
+{
+ return all_timeouts[id].active;
+}
+
+/*
+ * Return the timeout's I've-been-fired indicator
+ *
+ * If reset_indicator is true, reset the indicator when returning true.
+ * To avoid missing timeouts due to race conditions, we are careful not to
+ * reset the indicator when returning false.
+ */
+bool
+get_timeout_indicator(TimeoutId id, bool reset_indicator)
+{
+ if (all_timeouts[id].indicator)
+ {
+ if (reset_indicator)
+ all_timeouts[id].indicator = false;
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Return the time when the timeout was most recently activated
+ *
+ * Note: will return 0 if timeout has never been activated in this process.
+ * However, we do *not* reset the start_time when a timeout occurs, so as
+ * not to create a race condition if SIGALRM fires just as some code is
+ * about to fetch the value.
+ */
+TimestampTz
+get_timeout_start_time(TimeoutId id)
+{
+ return all_timeouts[id].start_time;
+}
+
+/*
+ * Return the time when the timeout is, or most recently was, due to fire
+ *
+ * Note: will return 0 if timeout has never been activated in this process.
+ * However, we do *not* reset the fin_time when a timeout occurs, so as
+ * not to create a race condition if SIGALRM fires just as some code is
+ * about to fetch the value.
+ */
+TimestampTz
+get_timeout_finish_time(TimeoutId id)
+{
+ return all_timeouts[id].fin_time;
+}
diff --git a/src/backend/utils/misc/tzparser.c b/src/backend/utils/misc/tzparser.c
new file mode 100644
index 0000000..8f2c95f
--- /dev/null
+++ b/src/backend/utils/misc/tzparser.c
@@ -0,0 +1,484 @@
+/*-------------------------------------------------------------------------
+ *
+ * tzparser.c
+ * Functions for parsing timezone offset files
+ *
+ * Note: this code is invoked from the check_hook for the GUC variable
+ * timezone_abbreviations. Therefore, it should report problems using
+ * GUC_check_errmsg() and related functions, and try to avoid throwing
+ * elog(ERROR). This is not completely bulletproof at present --- in
+ * particular out-of-memory will throw an error. Could probably fix with
+ * PG_TRY if necessary.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/misc/tzparser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <ctype.h>
+
+#include "miscadmin.h"
+#include "storage/fd.h"
+#include "utils/guc.h"
+#include "utils/memutils.h"
+#include "utils/tzparser.h"
+
+
+#define WHITESPACE " \t\n\r"
+
+static bool validateTzEntry(tzEntry *tzentry);
+static bool splitTzLine(const char *filename, int lineno,
+ char *line, tzEntry *tzentry);
+static int addToArray(tzEntry **base, int *arraysize, int n,
+ tzEntry *entry, bool override);
+static int ParseTzFile(const char *filename, int depth,
+ tzEntry **base, int *arraysize, int n);
+
+
+/*
+ * Apply additional validation checks to a tzEntry
+ *
+ * Returns true if OK, else false
+ */
+static bool
+validateTzEntry(tzEntry *tzentry)
+{
+ unsigned char *p;
+
+ /*
+ * Check restrictions imposed by datetktbl storage format (see datetime.c)
+ */
+ if (strlen(tzentry->abbrev) > TOKMAXLEN)
+ {
+ GUC_check_errmsg("time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d",
+ tzentry->abbrev, TOKMAXLEN,
+ tzentry->filename, tzentry->lineno);
+ return false;
+ }
+
+ /*
+ * Sanity-check the offset: shouldn't exceed 14 hours
+ */
+ if (tzentry->offset > 14 * 60 * 60 ||
+ tzentry->offset < -14 * 60 * 60)
+ {
+ GUC_check_errmsg("time zone offset %d is out of range in time zone file \"%s\", line %d",
+ tzentry->offset,
+ tzentry->filename, tzentry->lineno);
+ return false;
+ }
+
+ /*
+ * Convert abbrev to lowercase (must match datetime.c's conversion)
+ */
+ for (p = (unsigned char *) tzentry->abbrev; *p; p++)
+ *p = pg_tolower(*p);
+
+ return true;
+}
+
+/*
+ * Attempt to parse the line as a timezone abbrev spec
+ *
+ * Valid formats are:
+ * name zone
+ * name offset dst
+ *
+ * Returns true if OK, else false; data is stored in *tzentry
+ */
+static bool
+splitTzLine(const char *filename, int lineno, char *line, tzEntry *tzentry)
+{
+ char *abbrev;
+ char *offset;
+ char *offset_endptr;
+ char *remain;
+ char *is_dst;
+
+ tzentry->lineno = lineno;
+ tzentry->filename = filename;
+
+ abbrev = strtok(line, WHITESPACE);
+ if (!abbrev)
+ {
+ GUC_check_errmsg("missing time zone abbreviation in time zone file \"%s\", line %d",
+ filename, lineno);
+ return false;
+ }
+ tzentry->abbrev = pstrdup(abbrev);
+
+ offset = strtok(NULL, WHITESPACE);
+ if (!offset)
+ {
+ GUC_check_errmsg("missing time zone offset in time zone file \"%s\", line %d",
+ filename, lineno);
+ return false;
+ }
+
+ /* We assume zone names don't begin with a digit or sign */
+ if (isdigit((unsigned char) *offset) || *offset == '+' || *offset == '-')
+ {
+ tzentry->zone = NULL;
+ tzentry->offset = strtol(offset, &offset_endptr, 10);
+ if (offset_endptr == offset || *offset_endptr != '\0')
+ {
+ GUC_check_errmsg("invalid number for time zone offset in time zone file \"%s\", line %d",
+ filename, lineno);
+ return false;
+ }
+
+ is_dst = strtok(NULL, WHITESPACE);
+ if (is_dst && pg_strcasecmp(is_dst, "D") == 0)
+ {
+ tzentry->is_dst = true;
+ remain = strtok(NULL, WHITESPACE);
+ }
+ else
+ {
+ /* there was no 'D' dst specifier */
+ tzentry->is_dst = false;
+ remain = is_dst;
+ }
+ }
+ else
+ {
+ /*
+ * Assume entry is a zone name. We do not try to validate it by
+ * looking up the zone, because that would force loading of a lot of
+ * zones that probably will never be used in the current session.
+ */
+ tzentry->zone = pstrdup(offset);
+ tzentry->offset = 0;
+ tzentry->is_dst = false;
+ remain = strtok(NULL, WHITESPACE);
+ }
+
+ if (!remain) /* no more non-whitespace chars */
+ return true;
+
+ if (remain[0] != '#') /* must be a comment */
+ {
+ GUC_check_errmsg("invalid syntax in time zone file \"%s\", line %d",
+ filename, lineno);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Insert entry into sorted array
+ *
+ * *base: base address of array (changeable if must enlarge array)
+ * *arraysize: allocated length of array (changeable if must enlarge array)
+ * n: current number of valid elements in array
+ * entry: new data to insert
+ * override: true if OK to override
+ *
+ * Returns the new array length (new value for n), or -1 if error
+ */
+static int
+addToArray(tzEntry **base, int *arraysize, int n,
+ tzEntry *entry, bool override)
+{
+ tzEntry *arrayptr;
+ int low;
+ int high;
+
+ /*
+ * Search the array for a duplicate; as a useful side effect, the array is
+ * maintained in sorted order. We use strcmp() to ensure we match the
+ * sort order datetime.c expects.
+ */
+ arrayptr = *base;
+ low = 0;
+ high = n - 1;
+ while (low <= high)
+ {
+ int mid = (low + high) >> 1;
+ tzEntry *midptr = arrayptr + mid;
+ int cmp;
+
+ cmp = strcmp(entry->abbrev, midptr->abbrev);
+ if (cmp < 0)
+ high = mid - 1;
+ else if (cmp > 0)
+ low = mid + 1;
+ else
+ {
+ /*
+ * Found a duplicate entry; complain unless it's the same.
+ */
+ if ((midptr->zone == NULL && entry->zone == NULL &&
+ midptr->offset == entry->offset &&
+ midptr->is_dst == entry->is_dst) ||
+ (midptr->zone != NULL && entry->zone != NULL &&
+ strcmp(midptr->zone, entry->zone) == 0))
+ {
+ /* return unchanged array */
+ return n;
+ }
+ if (override)
+ {
+ /* same abbrev but something is different, override */
+ midptr->zone = entry->zone;
+ midptr->offset = entry->offset;
+ midptr->is_dst = entry->is_dst;
+ return n;
+ }
+ /* same abbrev but something is different, complain */
+ GUC_check_errmsg("time zone abbreviation \"%s\" is multiply defined",
+ entry->abbrev);
+ GUC_check_errdetail("Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d.",
+ midptr->filename, midptr->lineno,
+ entry->filename, entry->lineno);
+ return -1;
+ }
+ }
+
+ /*
+ * No match, insert at position "low".
+ */
+ if (n >= *arraysize)
+ {
+ *arraysize *= 2;
+ *base = (tzEntry *) repalloc(*base, *arraysize * sizeof(tzEntry));
+ }
+
+ arrayptr = *base + low;
+
+ memmove(arrayptr + 1, arrayptr, (n - low) * sizeof(tzEntry));
+
+ memcpy(arrayptr, entry, sizeof(tzEntry));
+
+ return n + 1;
+}
+
+/*
+ * Parse a single timezone abbrev file --- can recurse to handle @INCLUDE
+ *
+ * filename: user-specified file name (does not include path)
+ * depth: current recursion depth
+ * *base: array for results (changeable if must enlarge array)
+ * *arraysize: allocated length of array (changeable if must enlarge array)
+ * n: current number of valid elements in array
+ *
+ * Returns the new array length (new value for n), or -1 if error
+ */
+static int
+ParseTzFile(const char *filename, int depth,
+ tzEntry **base, int *arraysize, int n)
+{
+ char share_path[MAXPGPATH];
+ char file_path[MAXPGPATH];
+ FILE *tzFile;
+ char tzbuf[1024];
+ char *line;
+ tzEntry tzentry;
+ int lineno = 0;
+ bool override = false;
+ const char *p;
+
+ /*
+ * We enforce that the filename is all alpha characters. This may be
+ * overly restrictive, but we don't want to allow access to anything
+ * outside the timezonesets directory, so for instance '/' *must* be
+ * rejected.
+ */
+ for (p = filename; *p; p++)
+ {
+ if (!isalpha((unsigned char) *p))
+ {
+ /* at level 0, just use guc.c's regular "invalid value" message */
+ if (depth > 0)
+ GUC_check_errmsg("invalid time zone file name \"%s\"",
+ filename);
+ return -1;
+ }
+ }
+
+ /*
+ * The maximal recursion depth is a pretty arbitrary setting. It is hard
+ * to imagine that someone needs more than 3 levels so stick with this
+ * conservative setting until someone complains.
+ */
+ if (depth > 3)
+ {
+ GUC_check_errmsg("time zone file recursion limit exceeded in file \"%s\"",
+ filename);
+ return -1;
+ }
+
+ get_share_path(my_exec_path, share_path);
+ snprintf(file_path, sizeof(file_path), "%s/timezonesets/%s",
+ share_path, filename);
+ tzFile = AllocateFile(file_path, "r");
+ if (!tzFile)
+ {
+ /*
+ * Check to see if the problem is not the filename but the directory.
+ * This is worth troubling over because if the installation share/
+ * directory is missing or unreadable, this is likely to be the first
+ * place we notice a problem during postmaster startup.
+ */
+ int save_errno = errno;
+ DIR *tzdir;
+
+ snprintf(file_path, sizeof(file_path), "%s/timezonesets",
+ share_path);
+ tzdir = AllocateDir(file_path);
+ if (tzdir == NULL)
+ {
+ GUC_check_errmsg("could not open directory \"%s\": %m",
+ file_path);
+ GUC_check_errhint("This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location.",
+ my_exec_path);
+ return -1;
+ }
+ FreeDir(tzdir);
+ errno = save_errno;
+
+ /*
+ * otherwise, if file doesn't exist and it's level 0, guc.c's
+ * complaint is enough
+ */
+ if (errno != ENOENT || depth > 0)
+ GUC_check_errmsg("could not read time zone file \"%s\": %m",
+ filename);
+
+ return -1;
+ }
+
+ while (!feof(tzFile))
+ {
+ lineno++;
+ if (fgets(tzbuf, sizeof(tzbuf), tzFile) == NULL)
+ {
+ if (ferror(tzFile))
+ {
+ GUC_check_errmsg("could not read time zone file \"%s\": %m",
+ filename);
+ n = -1;
+ break;
+ }
+ /* else we're at EOF after all */
+ break;
+ }
+ if (strlen(tzbuf) == sizeof(tzbuf) - 1)
+ {
+ /* the line is too long for tzbuf */
+ GUC_check_errmsg("line is too long in time zone file \"%s\", line %d",
+ filename, lineno);
+ n = -1;
+ break;
+ }
+
+ /* skip over whitespace */
+ line = tzbuf;
+ while (*line && isspace((unsigned char) *line))
+ line++;
+
+ if (*line == '\0') /* empty line */
+ continue;
+ if (*line == '#') /* comment line */
+ continue;
+
+ if (pg_strncasecmp(line, "@INCLUDE", strlen("@INCLUDE")) == 0)
+ {
+ /* pstrdup so we can use filename in result data structure */
+ char *includeFile = pstrdup(line + strlen("@INCLUDE"));
+
+ includeFile = strtok(includeFile, WHITESPACE);
+ if (!includeFile || !*includeFile)
+ {
+ GUC_check_errmsg("@INCLUDE without file name in time zone file \"%s\", line %d",
+ filename, lineno);
+ n = -1;
+ break;
+ }
+ n = ParseTzFile(includeFile, depth + 1,
+ base, arraysize, n);
+ if (n < 0)
+ break;
+ continue;
+ }
+
+ if (pg_strncasecmp(line, "@OVERRIDE", strlen("@OVERRIDE")) == 0)
+ {
+ override = true;
+ continue;
+ }
+
+ if (!splitTzLine(filename, lineno, line, &tzentry))
+ {
+ n = -1;
+ break;
+ }
+ if (!validateTzEntry(&tzentry))
+ {
+ n = -1;
+ break;
+ }
+ n = addToArray(base, arraysize, n, &tzentry, override);
+ if (n < 0)
+ break;
+ }
+
+ FreeFile(tzFile);
+
+ return n;
+}
+
+/*
+ * load_tzoffsets --- read and parse the specified timezone offset file
+ *
+ * On success, return a filled-in TimeZoneAbbrevTable, which must have been
+ * malloc'd not palloc'd. On failure, return NULL, using GUC_check_errmsg
+ * and friends to give details of the problem.
+ */
+TimeZoneAbbrevTable *
+load_tzoffsets(const char *filename)
+{
+ TimeZoneAbbrevTable *result = NULL;
+ MemoryContext tmpContext;
+ MemoryContext oldContext;
+ tzEntry *array;
+ int arraysize;
+ int n;
+
+ /*
+ * Create a temp memory context to work in. This makes it easy to clean
+ * up afterwards.
+ */
+ tmpContext = AllocSetContextCreate(CurrentMemoryContext,
+ "TZParserMemory",
+ ALLOCSET_SMALL_SIZES);
+ oldContext = MemoryContextSwitchTo(tmpContext);
+
+ /* Initialize array at a reasonable size */
+ arraysize = 128;
+ array = (tzEntry *) palloc(arraysize * sizeof(tzEntry));
+
+ /* Parse the file(s) */
+ n = ParseTzFile(filename, 0, &array, &arraysize, 0);
+
+ /* If no errors so far, let datetime.c allocate memory & convert format */
+ if (n >= 0)
+ {
+ result = ConvertTimeZoneAbbrevs(array, n);
+ if (!result)
+ GUC_check_errmsg("out of memory");
+ }
+
+ /* Clean up */
+ MemoryContextSwitchTo(oldContext);
+ MemoryContextDelete(tmpContext);
+
+ return result;
+}
diff --git a/src/backend/utils/mmgr/Makefile b/src/backend/utils/mmgr/Makefile
new file mode 100644
index 0000000..3b4cfdb
--- /dev/null
+++ b/src/backend/utils/mmgr/Makefile
@@ -0,0 +1,25 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/mmgr
+#
+# IDENTIFICATION
+# src/backend/utils/mmgr/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/mmgr
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ aset.o \
+ dsa.o \
+ freepage.o \
+ generation.o \
+ mcxt.o \
+ memdebug.o \
+ portalmem.o \
+ slab.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/mmgr/README b/src/backend/utils/mmgr/README
new file mode 100644
index 0000000..221b4bd
--- /dev/null
+++ b/src/backend/utils/mmgr/README
@@ -0,0 +1,487 @@
+src/backend/utils/mmgr/README
+
+Memory Context System Design Overview
+=====================================
+
+Background
+----------
+
+We do most of our memory allocation in "memory contexts", which are usually
+AllocSets as implemented by src/backend/utils/mmgr/aset.c. The key to
+successful memory management without lots of overhead is to define a useful
+set of contexts with appropriate lifespans.
+
+The basic operations on a memory context are:
+
+* create a context
+
+* allocate a chunk of memory within a context (equivalent of standard
+ C library's malloc())
+
+* delete a context (including freeing all the memory allocated therein)
+
+* reset a context (free all memory allocated in the context, but not the
+ context object itself)
+
+* inquire about the total amount of memory allocated to the context
+ (the raw memory from which the context allocates chunks; not the
+ chunks themselves)
+
+Given a chunk of memory previously allocated from a context, one can
+free it or reallocate it larger or smaller (corresponding to standard C
+library's free() and realloc() routines). These operations return memory
+to or get more memory from the same context the chunk was originally
+allocated in.
+
+At all times there is a "current" context denoted by the
+CurrentMemoryContext global variable. palloc() implicitly allocates space
+in that context. The MemoryContextSwitchTo() operation selects a new current
+context (and returns the previous context, so that the caller can restore the
+previous context before exiting).
+
+The main advantage of memory contexts over plain use of malloc/free is
+that the entire contents of a memory context can be freed easily, without
+having to request freeing of each individual chunk within it. This is
+both faster and more reliable than per-chunk bookkeeping. We use this
+fact to clean up at transaction end: by resetting all the active contexts
+of transaction or shorter lifespan, we can reclaim all transient memory.
+Similarly, we can clean up at the end of each query, or after each tuple
+is processed during a query.
+
+
+Some Notes About the palloc API Versus Standard C Library
+---------------------------------------------------------
+
+The behavior of palloc and friends is similar to the standard C library's
+malloc and friends, but there are some deliberate differences too. Here
+are some notes to clarify the behavior.
+
+* If out of memory, palloc and repalloc exit via elog(ERROR). They
+never return NULL, and it is not necessary or useful to test for such
+a result. With palloc_extended() that behavior can be overridden
+using the MCXT_ALLOC_NO_OOM flag.
+
+* palloc(0) is explicitly a valid operation. It does not return a NULL
+pointer, but a valid chunk of which no bytes may be used. However, the
+chunk might later be repalloc'd larger; it can also be pfree'd without
+error. Similarly, repalloc allows realloc'ing to zero size.
+
+* pfree and repalloc do not accept a NULL pointer. This is intentional.
+
+
+The Current Memory Context
+--------------------------
+
+Because it would be too much notational overhead to always pass an
+appropriate memory context to called routines, there always exists the
+notion of the current memory context CurrentMemoryContext. Without it,
+for example, the copyObject routines would need to be passed a context, as
+would function execution routines that return a pass-by-reference
+datatype. Similarly for routines that temporarily allocate space
+internally, but don't return it to their caller? We certainly don't
+want to clutter every call in the system with "here is a context to
+use for any temporary memory allocation you might want to do".
+
+The upshot of that reasoning, though, is that CurrentMemoryContext should
+generally point at a short-lifespan context if at all possible. During
+query execution it usually points to a context that gets reset after each
+tuple. Only in *very* circumscribed code should it ever point at a
+context having greater than transaction lifespan, since doing so risks
+permanent memory leaks.
+
+
+pfree/repalloc Do Not Depend On CurrentMemoryContext
+----------------------------------------------------
+
+pfree() and repalloc() can be applied to any chunk whether it belongs
+to CurrentMemoryContext or not --- the chunk's owning context will be
+invoked to handle the operation, regardless.
+
+
+"Parent" and "Child" Contexts
+-----------------------------
+
+If all contexts were independent, it'd be hard to keep track of them,
+especially in error cases. That is solved by creating a tree of
+"parent" and "child" contexts. When creating a memory context, the
+new context can be specified to be a child of some existing context.
+A context can have many children, but only one parent. In this way
+the contexts form a forest (not necessarily a single tree, since there
+could be more than one top-level context; although in current practice
+there is only one top context, TopMemoryContext).
+
+Deleting a context deletes all its direct and indirect children as
+well. When resetting a context it's almost always more useful to
+delete child contexts, thus MemoryContextReset() means that, and if
+you really do want a tree of empty contexts you need to call
+MemoryContextResetOnly() plus MemoryContextResetChildren().
+
+These features allow us to manage a lot of contexts without fear that
+some will be leaked; we only need to keep track of one top-level
+context that we are going to delete at transaction end, and make sure
+that any shorter-lived contexts we create are descendants of that
+context. Since the tree can have multiple levels, we can deal easily
+with nested lifetimes of storage, such as per-transaction,
+per-statement, per-scan, per-tuple. Storage lifetimes that only
+partially overlap can be handled by allocating from different trees of
+the context forest (there are some examples in the next section).
+
+For convenience we also provide operations like "reset/delete all children
+of a given context, but don't reset or delete that context itself".
+
+
+Memory Context Reset/Delete Callbacks
+-------------------------------------
+
+A feature introduced in Postgres 9.5 allows memory contexts to be used
+for managing more resources than just plain palloc'd memory. This is
+done by registering a "reset callback function" for a memory context.
+Such a function will be called, once, just before the context is next
+reset or deleted. It can be used to give up resources that are in some
+sense associated with an object allocated within the context. Possible
+use-cases include
+* closing open files associated with a tuplesort object;
+* releasing reference counts on long-lived cache objects that are held
+ by some object within the context being reset;
+* freeing malloc-managed memory associated with some palloc'd object.
+That last case would just represent bad programming practice for pure
+Postgres code; better to have made all the allocations using palloc,
+in the target context or some child context. However, it could well
+come in handy for code that interfaces to non-Postgres libraries.
+
+Any number of reset callbacks can be established for a memory context;
+they are called in reverse order of registration. Also, callbacks
+attached to child contexts are called before callbacks attached to
+parent contexts, if a tree of contexts is being reset or deleted.
+
+The API for this requires the caller to provide a MemoryContextCallback
+memory chunk to hold the state for a callback. Typically this should be
+allocated in the same context it is logically attached to, so that it
+will be released automatically after use. The reason for asking the
+caller to provide this memory is that in most usage scenarios, the caller
+will be creating some larger struct within the target context, and the
+MemoryContextCallback struct can be made "for free" without a separate
+palloc() call by including it in this larger struct.
+
+
+Memory Contexts in Practice
+===========================
+
+Globally Known Contexts
+-----------------------
+
+There are a few widely-known contexts that are typically referenced
+through global variables. At any instant the system may contain many
+additional contexts, but all other contexts should be direct or indirect
+children of one of these contexts to ensure they are not leaked in event
+of an error.
+
+TopMemoryContext --- this is the actual top level of the context tree;
+every other context is a direct or indirect child of this one. Allocating
+here is essentially the same as "malloc", because this context will never
+be reset or deleted. This is for stuff that should live forever, or for
+stuff that the controlling module will take care of deleting at the
+appropriate time. An example is fd.c's tables of open files. Avoid
+allocating stuff here unless really necessary, and especially avoid
+running with CurrentMemoryContext pointing here.
+
+PostmasterContext --- this is the postmaster's normal working context.
+After a backend is spawned, it can delete PostmasterContext to free its
+copy of memory the postmaster was using that it doesn't need.
+Note that in non-EXEC_BACKEND builds, the postmaster's copy of pg_hba.conf
+and pg_ident.conf data is used directly during authentication in backend
+processes; so backends can't delete PostmasterContext until that's done.
+(The postmaster has only TopMemoryContext, PostmasterContext, and
+ErrorContext --- the remaining top-level contexts are set up in each
+backend during startup.)
+
+CacheMemoryContext --- permanent storage for relcache, catcache, and
+related modules. This will never be reset or deleted, either, so it's
+not truly necessary to distinguish it from TopMemoryContext. But it
+seems worthwhile to maintain the distinction for debugging purposes.
+(Note: CacheMemoryContext has child contexts with shorter lifespans.
+For example, a child context is the best place to keep the subsidiary
+storage associated with a relcache entry; that way we can free rule
+parsetrees and so forth easily, without having to depend on constructing
+a reliable version of freeObject().)
+
+MessageContext --- this context holds the current command message from the
+frontend, as well as any derived storage that need only live as long as
+the current message (for example, in simple-Query mode the parse and plan
+trees can live here). This context will be reset, and any children
+deleted, at the top of each cycle of the outer loop of PostgresMain. This
+is kept separate from per-transaction and per-portal contexts because a
+query string might need to live either a longer or shorter time than any
+single transaction or portal.
+
+TopTransactionContext --- this holds everything that lives until end of the
+top-level transaction. This context will be reset, and all its children
+deleted, at conclusion of each top-level transaction cycle. In most cases
+you don't want to allocate stuff directly here, but in CurTransactionContext;
+what does belong here is control information that exists explicitly to manage
+status across multiple subtransactions. Note: this context is NOT cleared
+immediately upon error; its contents will survive until the transaction block
+is exited by COMMIT/ROLLBACK.
+
+CurTransactionContext --- this holds data that has to survive until the end
+of the current transaction, and in particular will be needed at top-level
+transaction commit. When we are in a top-level transaction this is the same
+as TopTransactionContext, but in subtransactions it points to a child context.
+It is important to understand that if a subtransaction aborts, its
+CurTransactionContext is thrown away after finishing the abort processing;
+but a committed subtransaction's CurTransactionContext is kept until top-level
+commit (unless of course one of the intermediate levels of subtransaction
+aborts). This ensures that we do not keep data from a failed subtransaction
+longer than necessary. Because of this behavior, you must be careful to clean
+up properly during subtransaction abort --- the subtransaction's state must be
+delinked from any pointers or lists kept in upper transactions, or you will
+have dangling pointers leading to a crash at top-level commit. An example of
+data kept here is pending NOTIFY messages, which are sent at top-level commit,
+but only if the generating subtransaction did not abort.
+
+PortalContext --- this is not actually a separate context, but a
+global variable pointing to the per-portal context of the currently active
+execution portal. This can be used if it's necessary to allocate storage
+that will live just as long as the execution of the current portal requires.
+
+ErrorContext --- this permanent context is switched into for error
+recovery processing, and then reset on completion of recovery. We arrange
+to have a few KB of memory available in it at all times. In this way, we
+can ensure that some memory is available for error recovery even if the
+backend has run out of memory otherwise. This allows out-of-memory to be
+treated as a normal ERROR condition, not a FATAL error.
+
+
+Contexts For Prepared Statements And Portals
+--------------------------------------------
+
+A prepared-statement object has an associated private context, in which
+the parse and plan trees for its query are stored. Because these trees
+are read-only to the executor, the prepared statement can be re-used many
+times without further copying of these trees.
+
+An execution-portal object has a private context that is referenced by
+PortalContext when the portal is active. In the case of a portal created
+by DECLARE CURSOR, this private context contains the query parse and plan
+trees (there being no other object that can hold them). Portals created
+from prepared statements simply reference the prepared statements' trees,
+and don't actually need any storage allocated in their private contexts.
+
+
+Logical Replication Worker Contexts
+-----------------------------------
+
+ApplyContext --- permanent during whole lifetime of apply worker. It
+is possible to use TopMemoryContext here as well, but for simplicity
+of memory usage analysis we spin up different context.
+
+ApplyMessageContext --- short-lived context that is reset after each
+logical replication protocol message is processed.
+
+
+Transient Contexts During Execution
+-----------------------------------
+
+When creating a prepared statement, the parse and plan trees will be built
+in a temporary context that's a child of MessageContext (so that it will
+go away automatically upon error). On success, the finished plan is
+copied to the prepared statement's private context, and the temp context
+is released; this allows planner temporary space to be recovered before
+execution begins. (In simple-Query mode we don't bother with the extra
+copy step, so the planner temp space stays around till end of query.)
+
+The top-level executor routines, as well as most of the "plan node"
+execution code, will normally run in a context that is created by
+ExecutorStart and destroyed by ExecutorEnd; this context also holds the
+"plan state" tree built during ExecutorStart. Most of the memory
+allocated in these routines is intended to live until end of query,
+so this is appropriate for those purposes. The executor's top context
+is a child of PortalContext, that is, the per-portal context of the
+portal that represents the query's execution.
+
+The main memory-management consideration in the executor is that
+expression evaluation --- both for qual testing and for computation of
+targetlist entries --- needs to not leak memory. To do this, each
+ExprContext (expression-eval context) created in the executor has a
+private memory context associated with it, and we switch into that context
+when evaluating expressions in that ExprContext. The plan node that owns
+the ExprContext is responsible for resetting the private context to empty
+when it no longer needs the results of expression evaluations. Typically
+the reset is done at the start of each tuple-fetch cycle in the plan node.
+
+Note that this design gives each plan node its own expression-eval memory
+context. This appears necessary to handle nested joins properly, since
+an outer plan node might need to retain expression results it has computed
+while obtaining the next tuple from an inner node --- but the inner node
+might execute many tuple cycles and many expressions before returning a
+tuple. The inner node must be able to reset its own expression context
+more often than once per outer tuple cycle. Fortunately, memory contexts
+are cheap enough that giving one to each plan node doesn't seem like a
+problem.
+
+A problem with running index accesses and sorts in a query-lifespan context
+is that these operations invoke datatype-specific comparison functions,
+and if the comparators leak any memory then that memory won't be recovered
+till end of query. The comparator functions all return bool or int32,
+so there's no problem with their result data, but there can be a problem
+with leakage of internal temporary data. In particular, comparator
+functions that operate on TOAST-able data types need to be careful
+not to leak detoasted versions of their inputs. This is annoying, but
+it appeared a lot easier to make the comparators conform than to fix the
+index and sort routines, so that's what was done for 7.1. This remains
+the state of affairs in btree and hash indexes, so btree and hash support
+functions still need to not leak memory. Most of the other index AMs
+have been modified to run opclass support functions in short-lived
+contexts, so that leakage is not a problem; this is necessary in view
+of the fact that their support functions tend to be far more complex.
+
+There are some special cases, such as aggregate functions. nodeAgg.c
+needs to remember the results of evaluation of aggregate transition
+functions from one tuple cycle to the next, so it can't just discard
+all per-tuple state in each cycle. The easiest way to handle this seems
+to be to have two per-tuple contexts in an aggregate node, and to
+ping-pong between them, so that at each tuple one is the active allocation
+context and the other holds any results allocated by the prior cycle's
+transition function.
+
+Executor routines that switch the active CurrentMemoryContext may need
+to copy data into their caller's current memory context before returning.
+However, we have minimized the need for that, because of the convention
+of resetting the per-tuple context at the *start* of an execution cycle
+rather than at its end. With that rule, an execution node can return a
+tuple that is palloc'd in its per-tuple context, and the tuple will remain
+good until the node is called for another tuple or told to end execution.
+This parallels the situation with pass-by-reference values at the table
+scan level, since a scan node can return a direct pointer to a tuple in a
+disk buffer that is only guaranteed to remain good that long.
+
+A more common reason for copying data is to transfer a result from
+per-tuple context to per-query context; for example, a Unique node will
+save the last distinct tuple value in its per-query context, requiring a
+copy step.
+
+
+Mechanisms to Allow Multiple Types of Contexts
+----------------------------------------------
+
+To efficiently allow for different allocation patterns, and for
+experimentation, we allow for different types of memory contexts with
+different allocation policies but similar external behavior. To
+handle this, memory allocation functions are accessed via function
+pointers, and we require all context types to obey the conventions
+given here.
+
+A memory context is represented by struct MemoryContextData (see
+memnodes.h). This struct identifies the exact type of the context, and
+contains information common between the different types of
+MemoryContext like the parent and child contexts, and the name of the
+context.
+
+This is essentially an abstract superclass, and the behavior is
+determined by the "methods" pointer is its virtual function table
+(struct MemoryContextMethods). Specific memory context types will use
+derived structs having these fields as their first fields. All the
+contexts of a specific type will have methods pointers that point to
+the same static table of function pointers.
+
+While operations like allocating from and resetting a context take the
+relevant MemoryContext as a parameter, operations like free and
+realloc are trickier. To make those work, we require all memory
+context types to produce allocated chunks that are immediately,
+without any padding, preceded by a pointer to the corresponding
+MemoryContext.
+
+If a type of allocator needs additional information about its chunks,
+like e.g. the size of the allocation, that information can in turn
+precede the MemoryContext. This means the only overhead implied by
+the memory context mechanism is a pointer to its context, so we're not
+constraining context-type designers very much.
+
+Given this, routines like pfree determine their corresponding context
+with an operation like (although that is usually encapsulated in
+GetMemoryChunkContext())
+
+ MemoryContext context = *(MemoryContext*) (((char *) pointer) - sizeof(void *));
+
+and then invoke the corresponding method for the context
+
+ context->methods->free_p(pointer);
+
+
+More Control Over aset.c Behavior
+---------------------------------
+
+By default aset.c always allocates an 8K block upon the first
+allocation in a context, and doubles that size for each successive
+block request. That's good behavior for a context that might hold
+*lots* of data. But if there are dozens if not hundreds of smaller
+contexts in the system, we need to be able to fine-tune things a
+little better.
+
+The creator of a context is able to specify an initial block size and
+a maximum block size. Selecting smaller values can prevent wastage of
+space in contexts that aren't expected to hold very much (an example
+is the relcache's per-relation contexts).
+
+Also, it is possible to specify a minimum context size, in case for some
+reason that should be different from the initial size for additional
+blocks. An aset.c context will always contain at least one block,
+of size minContextSize if that is specified, otherwise initBlockSize.
+
+We expect that per-tuple contexts will be reset frequently and typically
+will not allocate very much space per tuple cycle. To make this usage
+pattern cheap, the first block allocated in a context is not given
+back to malloc() during reset, but just cleared. This avoids malloc
+thrashing.
+
+
+Alternative Memory Context Implementations
+------------------------------------------
+
+aset.c is our default general-purpose implementation, working fine
+in most situations. We also have two implementations optimized for
+special use cases, providing either better performance or lower memory
+usage compared to aset.c (or both).
+
+* slab.c (SlabContext) is designed for allocations of fixed-length
+ chunks, and does not allow allocations of chunks with different size.
+
+* generation.c (GenerationContext) is designed for cases when chunks
+ are allocated in groups with similar lifespan (generations), or
+ roughly in FIFO order.
+
+Both memory contexts aim to free memory back to the operating system
+(unlike aset.c, which keeps the freed chunks in a freelist, and only
+returns the memory when reset/deleted).
+
+These memory contexts were initially developed for ReorderBuffer, but
+may be useful elsewhere as long as the allocation patterns match.
+
+
+Memory Accounting
+-----------------
+
+One of the basic memory context operations is determining the amount of
+memory used in the context (and its children). We have multiple places
+that implement their own ad hoc memory accounting, and this is meant to
+provide a unified approach. Ad hoc accounting solutions work for places
+with tight control over the allocations or when it's easy to determine
+sizes of allocated chunks (e.g. places that only work with tuples).
+
+The accounting built into the memory contexts is transparent and works
+transparently for all allocations as long as they end up in the right
+memory context subtree.
+
+Consider for example aggregate functions - the aggregate state is often
+represented by an arbitrary structure, allocated from the transition
+function, so the ad hoc accounting is unlikely to work. The built-in
+accounting will however handle such cases just fine.
+
+To minimize overhead, the accounting is done at the block level, not for
+individual allocation chunks.
+
+The accounting is lazy - after a block is allocated (or freed), only the
+context owning that block is updated. This means that when inquiring
+about the memory usage in a given context, we have to walk all children
+contexts recursively. This means the memory accounting is not intended
+for cases with too many memory contexts (in the relevant subtree).
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c
new file mode 100644
index 0000000..8111710
--- /dev/null
+++ b/src/backend/utils/mmgr/aset.c
@@ -0,0 +1,1533 @@
+/*-------------------------------------------------------------------------
+ *
+ * aset.c
+ * Allocation set definitions.
+ *
+ * AllocSet is our standard implementation of the abstract MemoryContext
+ * type.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/aset.c
+ *
+ * NOTE:
+ * This is a new (Feb. 05, 1999) implementation of the allocation set
+ * routines. AllocSet...() does not use OrderedSet...() any more.
+ * Instead it manages allocations in a block pool by itself, combining
+ * many small allocations in a few bigger blocks. AllocSetFree() normally
+ * doesn't free() memory really. It just add's the free'd area to some
+ * list for later reuse by AllocSetAlloc(). All memory blocks are free()'d
+ * at once on AllocSetReset(), which happens when the memory context gets
+ * destroyed.
+ * Jan Wieck
+ *
+ * Performance improvement from Tom Lane, 8/99: for extremely large request
+ * sizes, we do want to be able to give the memory back to free() as soon
+ * as it is pfree()'d. Otherwise we risk tying up a lot of memory in
+ * freelist entries that might never be usable. This is specially needed
+ * when the caller is repeatedly repalloc()'ing a block bigger and bigger;
+ * the previous instances of the block were guaranteed to be wasted until
+ * AllocSetReset() under the old way.
+ *
+ * Further improvement 12/00: as the code stood, request sizes in the
+ * midrange between "small" and "large" were handled very inefficiently,
+ * because any sufficiently large free chunk would be used to satisfy a
+ * request, even if it was much larger than necessary. This led to more
+ * and more wasted space in allocated chunks over time. To fix, get rid
+ * of the midrange behavior: we now handle only "small" power-of-2-size
+ * chunks as chunks. Anything "large" is passed off to malloc(). Change
+ * the number of freelists to change the small/large boundary.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "port/pg_bitutils.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+
+/*--------------------
+ * Chunk freelist k holds chunks of size 1 << (k + ALLOC_MINBITS),
+ * for k = 0 .. ALLOCSET_NUM_FREELISTS-1.
+ *
+ * Note that all chunks in the freelists have power-of-2 sizes. This
+ * improves recyclability: we may waste some space, but the wasted space
+ * should stay pretty constant as requests are made and released.
+ *
+ * A request too large for the last freelist is handled by allocating a
+ * dedicated block from malloc(). The block still has a block header and
+ * chunk header, but when the chunk is freed we'll return the whole block
+ * to malloc(), not put it on our freelists.
+ *
+ * CAUTION: ALLOC_MINBITS must be large enough so that
+ * 1<<ALLOC_MINBITS is at least MAXALIGN,
+ * or we may fail to align the smallest chunks adequately.
+ * 8-byte alignment is enough on all currently known machines.
+ *
+ * With the current parameters, request sizes up to 8K are treated as chunks,
+ * larger requests go into dedicated blocks. Change ALLOCSET_NUM_FREELISTS
+ * to adjust the boundary point; and adjust ALLOCSET_SEPARATE_THRESHOLD in
+ * memutils.h to agree. (Note: in contexts with small maxBlockSize, we may
+ * set the allocChunkLimit to less than 8K, so as to avoid space wastage.)
+ *--------------------
+ */
+
+#define ALLOC_MINBITS 3 /* smallest chunk size is 8 bytes */
+#define ALLOCSET_NUM_FREELISTS 11
+#define ALLOC_CHUNK_LIMIT (1 << (ALLOCSET_NUM_FREELISTS-1+ALLOC_MINBITS))
+/* Size of largest chunk that we use a fixed size for */
+#define ALLOC_CHUNK_FRACTION 4
+/* We allow chunks to be at most 1/4 of maxBlockSize (less overhead) */
+
+/*--------------------
+ * The first block allocated for an allocset has size initBlockSize.
+ * Each time we have to allocate another block, we double the block size
+ * (if possible, and without exceeding maxBlockSize), so as to reduce
+ * the bookkeeping load on malloc().
+ *
+ * Blocks allocated to hold oversize chunks do not follow this rule, however;
+ * they are just however big they need to be to hold that single chunk.
+ *
+ * Also, if a minContextSize is specified, the first block has that size,
+ * and then initBlockSize is used for the next one.
+ *--------------------
+ */
+
+#define ALLOC_BLOCKHDRSZ MAXALIGN(sizeof(AllocBlockData))
+#define ALLOC_CHUNKHDRSZ sizeof(struct AllocChunkData)
+
+typedef struct AllocBlockData *AllocBlock; /* forward reference */
+typedef struct AllocChunkData *AllocChunk;
+
+/*
+ * AllocPointer
+ * Aligned pointer which may be a member of an allocation set.
+ */
+typedef void *AllocPointer;
+
+/*
+ * AllocSetContext is our standard implementation of MemoryContext.
+ *
+ * Note: header.isReset means there is nothing for AllocSetReset to do.
+ * This is different from the aset being physically empty (empty blocks list)
+ * because we will still have a keeper block. It's also different from the set
+ * being logically empty, because we don't attempt to detect pfree'ing the
+ * last active chunk.
+ */
+typedef struct AllocSetContext
+{
+ MemoryContextData header; /* Standard memory-context fields */
+ /* Info about storage allocated in this context: */
+ AllocBlock blocks; /* head of list of blocks in this set */
+ AllocChunk freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */
+ /* Allocation parameters for this context: */
+ Size initBlockSize; /* initial block size */
+ Size maxBlockSize; /* maximum block size */
+ Size nextBlockSize; /* next block size to allocate */
+ Size allocChunkLimit; /* effective chunk size limit */
+ AllocBlock keeper; /* keep this block over resets */
+ /* freelist this context could be put in, or -1 if not a candidate: */
+ int freeListIndex; /* index in context_freelists[], or -1 */
+} AllocSetContext;
+
+typedef AllocSetContext *AllocSet;
+
+/*
+ * AllocBlock
+ * An AllocBlock is the unit of memory that is obtained by aset.c
+ * from malloc(). It contains one or more AllocChunks, which are
+ * the units requested by palloc() and freed by pfree(). AllocChunks
+ * cannot be returned to malloc() individually, instead they are put
+ * on freelists by pfree() and re-used by the next palloc() that has
+ * a matching request size.
+ *
+ * AllocBlockData is the header data for a block --- the usable space
+ * within the block begins at the next alignment boundary.
+ */
+typedef struct AllocBlockData
+{
+ AllocSet aset; /* aset that owns this block */
+ AllocBlock prev; /* prev block in aset's blocks list, if any */
+ AllocBlock next; /* next block in aset's blocks list, if any */
+ char *freeptr; /* start of free space in this block */
+ char *endptr; /* end of space in this block */
+} AllocBlockData;
+
+/*
+ * AllocChunk
+ * The prefix of each piece of memory in an AllocBlock
+ *
+ * Note: to meet the memory context APIs, the payload area of the chunk must
+ * be maxaligned, and the "aset" link must be immediately adjacent to the
+ * payload area (cf. GetMemoryChunkContext). We simplify matters for this
+ * module by requiring sizeof(AllocChunkData) to be maxaligned, and then
+ * we can ensure things work by adding any required alignment padding before
+ * the "aset" field. There is a static assertion below that the alignment
+ * is done correctly.
+ */
+typedef struct AllocChunkData
+{
+ /* size is always the size of the usable space in the chunk */
+ Size size;
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* when debugging memory usage, also store actual requested size */
+ /* this is zero in a free chunk */
+ Size requested_size;
+
+#define ALLOCCHUNK_RAWSIZE (SIZEOF_SIZE_T * 2 + SIZEOF_VOID_P)
+#else
+#define ALLOCCHUNK_RAWSIZE (SIZEOF_SIZE_T + SIZEOF_VOID_P)
+#endif /* MEMORY_CONTEXT_CHECKING */
+
+ /* ensure proper alignment by adding padding if needed */
+#if (ALLOCCHUNK_RAWSIZE % MAXIMUM_ALIGNOF) != 0
+ char padding[MAXIMUM_ALIGNOF - ALLOCCHUNK_RAWSIZE % MAXIMUM_ALIGNOF];
+#endif
+
+ /* aset is the owning aset if allocated, or the freelist link if free */
+ void *aset;
+ /* there must not be any padding to reach a MAXALIGN boundary here! */
+} AllocChunkData;
+
+/*
+ * Only the "aset" field should be accessed outside this module.
+ * We keep the rest of an allocated chunk's header marked NOACCESS when using
+ * valgrind. But note that chunk headers that are in a freelist are kept
+ * accessible, for simplicity.
+ */
+#define ALLOCCHUNK_PRIVATE_LEN offsetof(AllocChunkData, aset)
+
+/*
+ * AllocPointerIsValid
+ * True iff pointer is valid allocation pointer.
+ */
+#define AllocPointerIsValid(pointer) PointerIsValid(pointer)
+
+/*
+ * AllocSetIsValid
+ * True iff set is valid allocation set.
+ */
+#define AllocSetIsValid(set) PointerIsValid(set)
+
+#define AllocPointerGetChunk(ptr) \
+ ((AllocChunk)(((char *)(ptr)) - ALLOC_CHUNKHDRSZ))
+#define AllocChunkGetPointer(chk) \
+ ((AllocPointer)(((char *)(chk)) + ALLOC_CHUNKHDRSZ))
+
+/*
+ * Rather than repeatedly creating and deleting memory contexts, we keep some
+ * freed contexts in freelists so that we can hand them out again with little
+ * work. Before putting a context in a freelist, we reset it so that it has
+ * only its initial malloc chunk and no others. To be a candidate for a
+ * freelist, a context must have the same minContextSize/initBlockSize as
+ * other contexts in the list; but its maxBlockSize is irrelevant since that
+ * doesn't affect the size of the initial chunk.
+ *
+ * We currently provide one freelist for ALLOCSET_DEFAULT_SIZES contexts
+ * and one for ALLOCSET_SMALL_SIZES contexts; the latter works for
+ * ALLOCSET_START_SMALL_SIZES too, since only the maxBlockSize differs.
+ *
+ * Ordinarily, we re-use freelist contexts in last-in-first-out order, in
+ * hopes of improving locality of reference. But if there get to be too
+ * many contexts in the list, we'd prefer to drop the most-recently-created
+ * contexts in hopes of keeping the process memory map compact.
+ * We approximate that by simply deleting all existing entries when the list
+ * overflows, on the assumption that queries that allocate a lot of contexts
+ * will probably free them in more or less reverse order of allocation.
+ *
+ * Contexts in a freelist are chained via their nextchild pointers.
+ */
+#define MAX_FREE_CONTEXTS 100 /* arbitrary limit on freelist length */
+
+typedef struct AllocSetFreeList
+{
+ int num_free; /* current list length */
+ AllocSetContext *first_free; /* list header */
+} AllocSetFreeList;
+
+/* context_freelists[0] is for default params, [1] for small params */
+static AllocSetFreeList context_freelists[2] =
+{
+ {
+ 0, NULL
+ },
+ {
+ 0, NULL
+ }
+};
+
+/*
+ * These functions implement the MemoryContext API for AllocSet contexts.
+ */
+static void *AllocSetAlloc(MemoryContext context, Size size);
+static void AllocSetFree(MemoryContext context, void *pointer);
+static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size);
+static void AllocSetReset(MemoryContext context);
+static void AllocSetDelete(MemoryContext context);
+static Size AllocSetGetChunkSpace(MemoryContext context, void *pointer);
+static bool AllocSetIsEmpty(MemoryContext context);
+static void AllocSetStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals,
+ bool print_to_stderr);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+static void AllocSetCheck(MemoryContext context);
+#endif
+
+/*
+ * This is the virtual function table for AllocSet contexts.
+ */
+static const MemoryContextMethods AllocSetMethods = {
+ AllocSetAlloc,
+ AllocSetFree,
+ AllocSetRealloc,
+ AllocSetReset,
+ AllocSetDelete,
+ AllocSetGetChunkSpace,
+ AllocSetIsEmpty,
+ AllocSetStats
+#ifdef MEMORY_CONTEXT_CHECKING
+ ,AllocSetCheck
+#endif
+};
+
+
+/* ----------
+ * AllocSetFreeIndex -
+ *
+ * Depending on the size of an allocation compute which freechunk
+ * list of the alloc set it belongs to. Caller must have verified
+ * that size <= ALLOC_CHUNK_LIMIT.
+ * ----------
+ */
+static inline int
+AllocSetFreeIndex(Size size)
+{
+ int idx;
+
+ if (size > (1 << ALLOC_MINBITS))
+ {
+ /*----------
+ * At this point we must compute ceil(log2(size >> ALLOC_MINBITS)).
+ * This is the same as
+ * pg_leftmost_one_pos32((size - 1) >> ALLOC_MINBITS) + 1
+ * or equivalently
+ * pg_leftmost_one_pos32(size - 1) - ALLOC_MINBITS + 1
+ *
+ * However, rather than just calling that function, we duplicate the
+ * logic here, allowing an additional optimization. It's reasonable
+ * to assume that ALLOC_CHUNK_LIMIT fits in 16 bits, so we can unroll
+ * the byte-at-a-time loop in pg_leftmost_one_pos32 and just handle
+ * the last two bytes.
+ *
+ * Yes, this function is enough of a hot-spot to make it worth this
+ * much trouble.
+ *----------
+ */
+#ifdef HAVE__BUILTIN_CLZ
+ idx = 31 - __builtin_clz((uint32) size - 1) - ALLOC_MINBITS + 1;
+#else
+ uint32 t,
+ tsize;
+
+ /* Statically assert that we only have a 16-bit input value. */
+ StaticAssertStmt(ALLOC_CHUNK_LIMIT < (1 << 16),
+ "ALLOC_CHUNK_LIMIT must be less than 64kB");
+
+ tsize = size - 1;
+ t = tsize >> 8;
+ idx = t ? pg_leftmost_one_pos[t] + 8 : pg_leftmost_one_pos[tsize];
+ idx -= ALLOC_MINBITS - 1;
+#endif
+
+ Assert(idx < ALLOCSET_NUM_FREELISTS);
+ }
+ else
+ idx = 0;
+
+ return idx;
+}
+
+
+/*
+ * Public routines
+ */
+
+
+/*
+ * AllocSetContextCreateInternal
+ * Create a new AllocSet context.
+ *
+ * parent: parent context, or NULL if top-level context
+ * name: name of context (must be statically allocated)
+ * minContextSize: minimum context size
+ * initBlockSize: initial allocation block size
+ * maxBlockSize: maximum allocation block size
+ *
+ * Most callers should abstract the context size parameters using a macro
+ * such as ALLOCSET_DEFAULT_SIZES.
+ *
+ * Note: don't call this directly; go through the wrapper macro
+ * AllocSetContextCreate.
+ */
+MemoryContext
+AllocSetContextCreateInternal(MemoryContext parent,
+ const char *name,
+ Size minContextSize,
+ Size initBlockSize,
+ Size maxBlockSize)
+{
+ int freeListIndex;
+ Size firstBlockSize;
+ AllocSet set;
+ AllocBlock block;
+
+ /* Assert we padded AllocChunkData properly */
+ StaticAssertStmt(ALLOC_CHUNKHDRSZ == MAXALIGN(ALLOC_CHUNKHDRSZ),
+ "sizeof(AllocChunkData) is not maxaligned");
+ StaticAssertStmt(offsetof(AllocChunkData, aset) + sizeof(MemoryContext) ==
+ ALLOC_CHUNKHDRSZ,
+ "padding calculation in AllocChunkData is wrong");
+
+ /*
+ * First, validate allocation parameters. Once these were regular runtime
+ * test and elog's, but in practice Asserts seem sufficient because nobody
+ * varies their parameters at runtime. We somewhat arbitrarily enforce a
+ * minimum 1K block size.
+ */
+ Assert(initBlockSize == MAXALIGN(initBlockSize) &&
+ initBlockSize >= 1024);
+ Assert(maxBlockSize == MAXALIGN(maxBlockSize) &&
+ maxBlockSize >= initBlockSize &&
+ AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */
+ Assert(minContextSize == 0 ||
+ (minContextSize == MAXALIGN(minContextSize) &&
+ minContextSize >= 1024 &&
+ minContextSize <= maxBlockSize));
+
+ /*
+ * Check whether the parameters match either available freelist. We do
+ * not need to demand a match of maxBlockSize.
+ */
+ if (minContextSize == ALLOCSET_DEFAULT_MINSIZE &&
+ initBlockSize == ALLOCSET_DEFAULT_INITSIZE)
+ freeListIndex = 0;
+ else if (minContextSize == ALLOCSET_SMALL_MINSIZE &&
+ initBlockSize == ALLOCSET_SMALL_INITSIZE)
+ freeListIndex = 1;
+ else
+ freeListIndex = -1;
+
+ /*
+ * If a suitable freelist entry exists, just recycle that context.
+ */
+ if (freeListIndex >= 0)
+ {
+ AllocSetFreeList *freelist = &context_freelists[freeListIndex];
+
+ if (freelist->first_free != NULL)
+ {
+ /* Remove entry from freelist */
+ set = freelist->first_free;
+ freelist->first_free = (AllocSet) set->header.nextchild;
+ freelist->num_free--;
+
+ /* Update its maxBlockSize; everything else should be OK */
+ set->maxBlockSize = maxBlockSize;
+
+ /* Reinitialize its header, installing correct name and parent */
+ MemoryContextCreate((MemoryContext) set,
+ T_AllocSetContext,
+ &AllocSetMethods,
+ parent,
+ name);
+
+ ((MemoryContext) set)->mem_allocated =
+ set->keeper->endptr - ((char *) set);
+
+ return (MemoryContext) set;
+ }
+ }
+
+ /* Determine size of initial block */
+ firstBlockSize = MAXALIGN(sizeof(AllocSetContext)) +
+ ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
+ if (minContextSize != 0)
+ firstBlockSize = Max(firstBlockSize, minContextSize);
+ else
+ firstBlockSize = Max(firstBlockSize, initBlockSize);
+
+ /*
+ * Allocate the initial block. Unlike other aset.c blocks, it starts with
+ * the context header and its block header follows that.
+ */
+ set = (AllocSet) malloc(firstBlockSize);
+ if (set == NULL)
+ {
+ if (TopMemoryContext)
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed while creating memory context \"%s\".",
+ name)));
+ }
+
+ /*
+ * Avoid writing code that can fail between here and MemoryContextCreate;
+ * we'd leak the header/initial block if we ereport in this stretch.
+ */
+
+ /* Fill in the initial block's block header */
+ block = (AllocBlock) (((char *) set) + MAXALIGN(sizeof(AllocSetContext)));
+ block->aset = set;
+ block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
+ block->endptr = ((char *) set) + firstBlockSize;
+ block->prev = NULL;
+ block->next = NULL;
+
+ /* Mark unallocated space NOACCESS; leave the block header alone. */
+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, block->endptr - block->freeptr);
+
+ /* Remember block as part of block list */
+ set->blocks = block;
+ /* Mark block as not to be released at reset time */
+ set->keeper = block;
+
+ /* Finish filling in aset-specific parts of the context header */
+ MemSetAligned(set->freelist, 0, sizeof(set->freelist));
+
+ set->initBlockSize = initBlockSize;
+ set->maxBlockSize = maxBlockSize;
+ set->nextBlockSize = initBlockSize;
+ set->freeListIndex = freeListIndex;
+
+ /*
+ * Compute the allocation chunk size limit for this context. It can't be
+ * more than ALLOC_CHUNK_LIMIT because of the fixed number of freelists.
+ * If maxBlockSize is small then requests exceeding the maxBlockSize, or
+ * even a significant fraction of it, should be treated as large chunks
+ * too. For the typical case of maxBlockSize a power of 2, the chunk size
+ * limit will be at most 1/8th maxBlockSize, so that given a stream of
+ * requests that are all the maximum chunk size we will waste at most
+ * 1/8th of the allocated space.
+ *
+ * We have to have allocChunkLimit a power of two, because the requested
+ * and actually-allocated sizes of any chunk must be on the same side of
+ * the limit, else we get confused about whether the chunk is "big".
+ *
+ * Also, allocChunkLimit must not exceed ALLOCSET_SEPARATE_THRESHOLD.
+ */
+ StaticAssertStmt(ALLOC_CHUNK_LIMIT == ALLOCSET_SEPARATE_THRESHOLD,
+ "ALLOC_CHUNK_LIMIT != ALLOCSET_SEPARATE_THRESHOLD");
+
+ set->allocChunkLimit = ALLOC_CHUNK_LIMIT;
+ while ((Size) (set->allocChunkLimit + ALLOC_CHUNKHDRSZ) >
+ (Size) ((maxBlockSize - ALLOC_BLOCKHDRSZ) / ALLOC_CHUNK_FRACTION))
+ set->allocChunkLimit >>= 1;
+
+ /* Finally, do the type-independent part of context creation */
+ MemoryContextCreate((MemoryContext) set,
+ T_AllocSetContext,
+ &AllocSetMethods,
+ parent,
+ name);
+
+ ((MemoryContext) set)->mem_allocated = firstBlockSize;
+
+ return (MemoryContext) set;
+}
+
+/*
+ * AllocSetReset
+ * Frees all memory which is allocated in the given set.
+ *
+ * Actually, this routine has some discretion about what to do.
+ * It should mark all allocated chunks freed, but it need not necessarily
+ * give back all the resources the set owns. Our actual implementation is
+ * that we give back all but the "keeper" block (which we must keep, since
+ * it shares a malloc chunk with the context header). In this way, we don't
+ * thrash malloc() when a context is repeatedly reset after small allocations,
+ * which is typical behavior for per-tuple contexts.
+ */
+static void
+AllocSetReset(MemoryContext context)
+{
+ AllocSet set = (AllocSet) context;
+ AllocBlock block;
+ Size keepersize PG_USED_FOR_ASSERTS_ONLY
+ = set->keeper->endptr - ((char *) set);
+
+ AssertArg(AllocSetIsValid(set));
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Check for corruption and leaks before freeing */
+ AllocSetCheck(context);
+#endif
+
+ /* Clear chunk freelists */
+ MemSetAligned(set->freelist, 0, sizeof(set->freelist));
+
+ block = set->blocks;
+
+ /* New blocks list will be just the keeper block */
+ set->blocks = set->keeper;
+
+ while (block != NULL)
+ {
+ AllocBlock next = block->next;
+
+ if (block == set->keeper)
+ {
+ /* Reset the block, but don't return it to malloc */
+ char *datastart = ((char *) block) + ALLOC_BLOCKHDRSZ;
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(datastart, block->freeptr - datastart);
+#else
+ /* wipe_mem() would have done this */
+ VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart);
+#endif
+ block->freeptr = datastart;
+ block->prev = NULL;
+ block->next = NULL;
+ }
+ else
+ {
+ /* Normal case, release the block */
+ context->mem_allocated -= block->endptr - ((char *) block);
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(block, block->freeptr - ((char *) block));
+#endif
+ free(block);
+ }
+ block = next;
+ }
+
+ Assert(context->mem_allocated == keepersize);
+
+ /* Reset block size allocation sequence, too */
+ set->nextBlockSize = set->initBlockSize;
+}
+
+/*
+ * AllocSetDelete
+ * Frees all memory which is allocated in the given set,
+ * in preparation for deletion of the set.
+ *
+ * Unlike AllocSetReset, this *must* free all resources of the set.
+ */
+static void
+AllocSetDelete(MemoryContext context)
+{
+ AllocSet set = (AllocSet) context;
+ AllocBlock block = set->blocks;
+ Size keepersize PG_USED_FOR_ASSERTS_ONLY
+ = set->keeper->endptr - ((char *) set);
+
+ AssertArg(AllocSetIsValid(set));
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Check for corruption and leaks before freeing */
+ AllocSetCheck(context);
+#endif
+
+ /*
+ * If the context is a candidate for a freelist, put it into that freelist
+ * instead of destroying it.
+ */
+ if (set->freeListIndex >= 0)
+ {
+ AllocSetFreeList *freelist = &context_freelists[set->freeListIndex];
+
+ /*
+ * Reset the context, if it needs it, so that we aren't hanging on to
+ * more than the initial malloc chunk.
+ */
+ if (!context->isReset)
+ MemoryContextResetOnly(context);
+
+ /*
+ * If the freelist is full, just discard what's already in it. See
+ * comments with context_freelists[].
+ */
+ if (freelist->num_free >= MAX_FREE_CONTEXTS)
+ {
+ while (freelist->first_free != NULL)
+ {
+ AllocSetContext *oldset = freelist->first_free;
+
+ freelist->first_free = (AllocSetContext *) oldset->header.nextchild;
+ freelist->num_free--;
+
+ /* All that remains is to free the header/initial block */
+ free(oldset);
+ }
+ Assert(freelist->num_free == 0);
+ }
+
+ /* Now add the just-deleted context to the freelist. */
+ set->header.nextchild = (MemoryContext) freelist->first_free;
+ freelist->first_free = set;
+ freelist->num_free++;
+
+ return;
+ }
+
+ /* Free all blocks, except the keeper which is part of context header */
+ while (block != NULL)
+ {
+ AllocBlock next = block->next;
+
+ if (block != set->keeper)
+ context->mem_allocated -= block->endptr - ((char *) block);
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(block, block->freeptr - ((char *) block));
+#endif
+
+ if (block != set->keeper)
+ free(block);
+
+ block = next;
+ }
+
+ Assert(context->mem_allocated == keepersize);
+
+ /* Finally, free the context header, including the keeper block */
+ free(set);
+}
+
+/*
+ * AllocSetAlloc
+ * Returns pointer to allocated memory of given size or NULL if
+ * request could not be completed; memory is added to the set.
+ *
+ * No request may exceed:
+ * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ
+ * All callers use a much-lower limit.
+ *
+ * Note: when using valgrind, it doesn't matter how the returned allocation
+ * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will
+ * return space that is marked NOACCESS - AllocSetRealloc has to beware!
+ */
+static void *
+AllocSetAlloc(MemoryContext context, Size size)
+{
+ AllocSet set = (AllocSet) context;
+ AllocBlock block;
+ AllocChunk chunk;
+ int fidx;
+ Size chunk_size;
+ Size blksize;
+
+ AssertArg(AllocSetIsValid(set));
+
+ /*
+ * If requested size exceeds maximum for chunks, allocate an entire block
+ * for this request.
+ */
+ if (size > set->allocChunkLimit)
+ {
+ chunk_size = MAXALIGN(size);
+ blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
+ block = (AllocBlock) malloc(blksize);
+ if (block == NULL)
+ return NULL;
+
+ context->mem_allocated += blksize;
+
+ block->aset = set;
+ block->freeptr = block->endptr = ((char *) block) + blksize;
+
+ chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ);
+ chunk->aset = set;
+ chunk->size = chunk_size;
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk_size)
+ set_sentinel(AllocChunkGetPointer(chunk), size);
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);
+#endif
+
+ /*
+ * Stick the new block underneath the active allocation block, if any,
+ * so that we don't lose the use of the space remaining therein.
+ */
+ if (set->blocks != NULL)
+ {
+ block->prev = set->blocks;
+ block->next = set->blocks->next;
+ if (block->next)
+ block->next->prev = block;
+ set->blocks->next = block;
+ }
+ else
+ {
+ block->prev = NULL;
+ block->next = NULL;
+ set->blocks = block;
+ }
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) AllocChunkGetPointer(chunk) + size,
+ chunk_size - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ return AllocChunkGetPointer(chunk);
+ }
+
+ /*
+ * Request is small enough to be treated as a chunk. Look in the
+ * corresponding free list to see if there is a free chunk we could reuse.
+ * If one is found, remove it from the free list, make it again a member
+ * of the alloc set and return its data address.
+ */
+ fidx = AllocSetFreeIndex(size);
+ chunk = set->freelist[fidx];
+ if (chunk != NULL)
+ {
+ Assert(chunk->size >= size);
+
+ set->freelist[fidx] = (AllocChunk) chunk->aset;
+
+ chunk->aset = (void *) set;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk->size)
+ set_sentinel(AllocChunkGetPointer(chunk), size);
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);
+#endif
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) AllocChunkGetPointer(chunk) + size,
+ chunk->size - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ return AllocChunkGetPointer(chunk);
+ }
+
+ /*
+ * Choose the actual chunk size to allocate.
+ */
+ chunk_size = (1 << ALLOC_MINBITS) << fidx;
+ Assert(chunk_size >= size);
+
+ /*
+ * If there is enough room in the active allocation block, we will put the
+ * chunk into that block. Else must start a new one.
+ */
+ if ((block = set->blocks) != NULL)
+ {
+ Size availspace = block->endptr - block->freeptr;
+
+ if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ))
+ {
+ /*
+ * The existing active (top) block does not have enough room for
+ * the requested allocation, but it might still have a useful
+ * amount of space in it. Once we push it down in the block list,
+ * we'll never try to allocate more space from it. So, before we
+ * do that, carve up its free space into chunks that we can put on
+ * the set's freelists.
+ *
+ * Because we can only get here when there's less than
+ * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate
+ * more than ALLOCSET_NUM_FREELISTS-1 times.
+ */
+ while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ))
+ {
+ Size availchunk = availspace - ALLOC_CHUNKHDRSZ;
+ int a_fidx = AllocSetFreeIndex(availchunk);
+
+ /*
+ * In most cases, we'll get back the index of the next larger
+ * freelist than the one we need to put this chunk on. The
+ * exception is when availchunk is exactly a power of 2.
+ */
+ if (availchunk != ((Size) 1 << (a_fidx + ALLOC_MINBITS)))
+ {
+ a_fidx--;
+ Assert(a_fidx >= 0);
+ availchunk = ((Size) 1 << (a_fidx + ALLOC_MINBITS));
+ }
+
+ chunk = (AllocChunk) (block->freeptr);
+
+ /* Prepare to initialize the chunk header. */
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
+
+ block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ);
+ availspace -= (availchunk + ALLOC_CHUNKHDRSZ);
+
+ chunk->size = availchunk;
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = 0; /* mark it free */
+#endif
+ chunk->aset = (void *) set->freelist[a_fidx];
+ set->freelist[a_fidx] = chunk;
+ }
+
+ /* Mark that we need to create a new block */
+ block = NULL;
+ }
+ }
+
+ /*
+ * Time to create a new regular (multi-chunk) block?
+ */
+ if (block == NULL)
+ {
+ Size required_size;
+
+ /*
+ * The first such block has size initBlockSize, and we double the
+ * space in each succeeding block, but not more than maxBlockSize.
+ */
+ blksize = set->nextBlockSize;
+ set->nextBlockSize <<= 1;
+ if (set->nextBlockSize > set->maxBlockSize)
+ set->nextBlockSize = set->maxBlockSize;
+
+ /*
+ * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more
+ * space... but try to keep it a power of 2.
+ */
+ required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
+ while (blksize < required_size)
+ blksize <<= 1;
+
+ /* Try to allocate it */
+ block = (AllocBlock) malloc(blksize);
+
+ /*
+ * We could be asking for pretty big blocks here, so cope if malloc
+ * fails. But give up if there's less than 1 MB or so available...
+ */
+ while (block == NULL && blksize > 1024 * 1024)
+ {
+ blksize >>= 1;
+ if (blksize < required_size)
+ break;
+ block = (AllocBlock) malloc(blksize);
+ }
+
+ if (block == NULL)
+ return NULL;
+
+ context->mem_allocated += blksize;
+
+ block->aset = set;
+ block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
+ block->endptr = ((char *) block) + blksize;
+
+ /* Mark unallocated space NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,
+ blksize - ALLOC_BLOCKHDRSZ);
+
+ block->prev = NULL;
+ block->next = set->blocks;
+ if (block->next)
+ block->next->prev = block;
+ set->blocks = block;
+ }
+
+ /*
+ * OK, do the allocation
+ */
+ chunk = (AllocChunk) (block->freeptr);
+
+ /* Prepare to initialize the chunk header. */
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ);
+
+ block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ);
+ Assert(block->freeptr <= block->endptr);
+
+ chunk->aset = (void *) set;
+ chunk->size = chunk_size;
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk->size)
+ set_sentinel(AllocChunkGetPointer(chunk), size);
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);
+#endif
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) AllocChunkGetPointer(chunk) + size,
+ chunk_size - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ return AllocChunkGetPointer(chunk);
+}
+
+/*
+ * AllocSetFree
+ * Frees allocated memory; memory is removed from the set.
+ */
+static void
+AllocSetFree(MemoryContext context, void *pointer)
+{
+ AllocSet set = (AllocSet) context;
+ AllocChunk chunk = AllocPointerGetChunk(pointer);
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Test for someone scribbling on unused space in chunk */
+ if (chunk->requested_size < chunk->size)
+ if (!sentinel_ok(pointer, chunk->requested_size))
+ elog(WARNING, "detected write past chunk end in %s %p",
+ set->header.name, chunk);
+#endif
+
+ if (chunk->size > set->allocChunkLimit)
+ {
+ /*
+ * Big chunks are certain to have been allocated as single-chunk
+ * blocks. Just unlink that block and return it to malloc().
+ */
+ AllocBlock block = (AllocBlock) (((char *) chunk) - ALLOC_BLOCKHDRSZ);
+
+ /*
+ * Try to verify that we have a sane block pointer: it should
+ * reference the correct aset, and freeptr and endptr should point
+ * just past the chunk.
+ */
+ if (block->aset != set ||
+ block->freeptr != block->endptr ||
+ block->freeptr != ((char *) block) +
+ (chunk->size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ))
+ elog(ERROR, "could not find block containing chunk %p", chunk);
+
+ /* OK, remove block from aset's list and free it */
+ if (block->prev)
+ block->prev->next = block->next;
+ else
+ set->blocks = block->next;
+ if (block->next)
+ block->next->prev = block->prev;
+
+ context->mem_allocated -= block->endptr - ((char *) block);
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(block, block->freeptr - ((char *) block));
+#endif
+ free(block);
+ }
+ else
+ {
+ /* Normal case, put the chunk into appropriate freelist */
+ int fidx = AllocSetFreeIndex(chunk->size);
+
+ chunk->aset = (void *) set->freelist[fidx];
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(pointer, chunk->size);
+#endif
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Reset requested_size to 0 in chunks that are on freelist */
+ chunk->requested_size = 0;
+#endif
+ set->freelist[fidx] = chunk;
+ }
+}
+
+/*
+ * AllocSetRealloc
+ * Returns new pointer to allocated memory of given size or NULL if
+ * request could not be completed; this memory is added to the set.
+ * Memory associated with given pointer is copied into the new memory,
+ * and the old memory is freed.
+ *
+ * Without MEMORY_CONTEXT_CHECKING, we don't know the old request size. This
+ * makes our Valgrind client requests less-precise, hazarding false negatives.
+ * (In principle, we could use VALGRIND_GET_VBITS() to rediscover the old
+ * request size.)
+ */
+static void *
+AllocSetRealloc(MemoryContext context, void *pointer, Size size)
+{
+ AllocSet set = (AllocSet) context;
+ AllocChunk chunk = AllocPointerGetChunk(pointer);
+ Size oldchksize;
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ oldchksize = chunk->size;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Test for someone scribbling on unused space in chunk */
+ if (chunk->requested_size < oldchksize)
+ if (!sentinel_ok(pointer, chunk->requested_size))
+ elog(WARNING, "detected write past chunk end in %s %p",
+ set->header.name, chunk);
+#endif
+
+ if (oldchksize > set->allocChunkLimit)
+ {
+ /*
+ * The chunk must have been allocated as a single-chunk block. Use
+ * realloc() to make the containing block bigger, or smaller, with
+ * minimum space wastage.
+ */
+ AllocBlock block = (AllocBlock) (((char *) chunk) - ALLOC_BLOCKHDRSZ);
+ Size chksize;
+ Size blksize;
+ Size oldblksize;
+
+ /*
+ * Try to verify that we have a sane block pointer: it should
+ * reference the correct aset, and freeptr and endptr should point
+ * just past the chunk.
+ */
+ if (block->aset != set ||
+ block->freeptr != block->endptr ||
+ block->freeptr != ((char *) block) +
+ (oldchksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ))
+ elog(ERROR, "could not find block containing chunk %p", chunk);
+
+ /*
+ * Even if the new request is less than set->allocChunkLimit, we stick
+ * with the single-chunk block approach. Therefore we need
+ * chunk->size to be bigger than set->allocChunkLimit, so we don't get
+ * confused about the chunk's status in future calls.
+ */
+ chksize = Max(size, set->allocChunkLimit + 1);
+ chksize = MAXALIGN(chksize);
+
+ /* Do the realloc */
+ blksize = chksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
+ oldblksize = block->endptr - ((char *) block);
+
+ block = (AllocBlock) realloc(block, blksize);
+ if (block == NULL)
+ {
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+ return NULL;
+ }
+
+ /* updated separately, not to underflow when (oldblksize > blksize) */
+ context->mem_allocated -= oldblksize;
+ context->mem_allocated += blksize;
+
+ block->freeptr = block->endptr = ((char *) block) + blksize;
+
+ /* Update pointers since block has likely been moved */
+ chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ);
+ pointer = AllocChunkGetPointer(chunk);
+ if (block->prev)
+ block->prev->next = block;
+ else
+ set->blocks = block;
+ if (block->next)
+ block->next->prev = block;
+ chunk->size = chksize;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+
+ /*
+ * We can only randomize the extra space if we know the prior request.
+ * When using Valgrind, randomize_mem() also marks memory UNDEFINED.
+ */
+ if (size > chunk->requested_size)
+ randomize_mem((char *) pointer + chunk->requested_size,
+ size - chunk->requested_size);
+#else
+
+ /*
+ * If this is an increase, realloc() will have marked any
+ * newly-allocated part (from oldchksize to chksize) UNDEFINED, but we
+ * also need to adjust trailing bytes from the old allocation (from
+ * chunk->requested_size to oldchksize) as they are marked NOACCESS.
+ * Make sure not to mark too many bytes in case chunk->requested_size
+ * < size < oldchksize.
+ */
+#ifdef USE_VALGRIND
+ if (Min(size, oldchksize) > chunk->requested_size)
+ VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + chunk->requested_size,
+ Min(size, oldchksize) - chunk->requested_size);
+#endif
+#endif
+
+ chunk->requested_size = size;
+
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk->size)
+ set_sentinel(pointer, size);
+#else /* !MEMORY_CONTEXT_CHECKING */
+
+ /*
+ * We may need to adjust marking of bytes from the old allocation as
+ * some of them may be marked NOACCESS. We don't know how much of the
+ * old chunk size was the requested size; it could have been as small
+ * as one byte. We have to be conservative and just mark the entire
+ * old portion DEFINED. Make sure not to mark memory beyond the new
+ * allocation in case it's smaller than the old one.
+ */
+ VALGRIND_MAKE_MEM_DEFINED(pointer, Min(size, oldchksize));
+#endif
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size, chksize - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ return pointer;
+ }
+
+ /*
+ * Chunk sizes are aligned to power of 2 in AllocSetAlloc(). Maybe the
+ * allocated area already is >= the new size. (In particular, we will
+ * fall out here if the requested size is a decrease.)
+ */
+ else if (oldchksize >= size)
+ {
+#ifdef MEMORY_CONTEXT_CHECKING
+ Size oldrequest = chunk->requested_size;
+
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* We can only fill the extra space if we know the prior request */
+ if (size > oldrequest)
+ randomize_mem((char *) pointer + oldrequest,
+ size - oldrequest);
+#endif
+
+ chunk->requested_size = size;
+
+ /*
+ * If this is an increase, mark any newly-available part UNDEFINED.
+ * Otherwise, mark the obsolete part NOACCESS.
+ */
+ if (size > oldrequest)
+ VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + oldrequest,
+ size - oldrequest);
+ else
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size,
+ oldchksize - size);
+
+ /* set mark to catch clobber of "unused" space */
+ if (size < oldchksize)
+ set_sentinel(pointer, size);
+#else /* !MEMORY_CONTEXT_CHECKING */
+
+ /*
+ * We don't have the information to determine whether we're growing
+ * the old request or shrinking it, so we conservatively mark the
+ * entire new allocation DEFINED.
+ */
+ VALGRIND_MAKE_MEM_NOACCESS(pointer, oldchksize);
+ VALGRIND_MAKE_MEM_DEFINED(pointer, size);
+#endif
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ return pointer;
+ }
+ else
+ {
+ /*
+ * Enlarge-a-small-chunk case. We just do this by brute force, ie,
+ * allocate a new chunk and copy the data. Since we know the existing
+ * data isn't huge, this won't involve any great memcpy expense, so
+ * it's not worth being smarter. (At one time we tried to avoid
+ * memcpy when it was possible to enlarge the chunk in-place, but that
+ * turns out to misbehave unpleasantly for repeated cycles of
+ * palloc/repalloc/pfree: the eventually freed chunks go into the
+ * wrong freelist for the next initial palloc request, and so we leak
+ * memory indefinitely. See pgsql-hackers archives for 2007-08-11.)
+ */
+ AllocPointer newPointer;
+ Size oldsize;
+
+ /* allocate new chunk */
+ newPointer = AllocSetAlloc((MemoryContext) set, size);
+
+ /* leave immediately if request was not completed */
+ if (newPointer == NULL)
+ {
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+ return NULL;
+ }
+
+ /*
+ * AllocSetAlloc() may have returned a region that is still NOACCESS.
+ * Change it to UNDEFINED for the moment; memcpy() will then transfer
+ * definedness from the old allocation to the new. If we know the old
+ * allocation, copy just that much. Otherwise, make the entire old
+ * chunk defined to avoid errors as we copy the currently-NOACCESS
+ * trailing bytes.
+ */
+ VALGRIND_MAKE_MEM_UNDEFINED(newPointer, size);
+#ifdef MEMORY_CONTEXT_CHECKING
+ oldsize = chunk->requested_size;
+#else
+ oldsize = oldchksize;
+ VALGRIND_MAKE_MEM_DEFINED(pointer, oldsize);
+#endif
+
+ /* transfer existing data (certain to fit) */
+ memcpy(newPointer, pointer, oldsize);
+
+ /* free old chunk */
+ AllocSetFree((MemoryContext) set, pointer);
+
+ return newPointer;
+ }
+}
+
+/*
+ * AllocSetGetChunkSpace
+ * Given a currently-allocated chunk, determine the total space
+ * it occupies (including all memory-allocation overhead).
+ */
+static Size
+AllocSetGetChunkSpace(MemoryContext context, void *pointer)
+{
+ AllocChunk chunk = AllocPointerGetChunk(pointer);
+ Size result;
+
+ VALGRIND_MAKE_MEM_DEFINED(chunk, ALLOCCHUNK_PRIVATE_LEN);
+ result = chunk->size + ALLOC_CHUNKHDRSZ;
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+ return result;
+}
+
+/*
+ * AllocSetIsEmpty
+ * Is an allocset empty of any allocated space?
+ */
+static bool
+AllocSetIsEmpty(MemoryContext context)
+{
+ /*
+ * For now, we say "empty" only if the context is new or just reset. We
+ * could examine the freelists to determine if all space has been freed,
+ * but it's not really worth the trouble for present uses of this
+ * functionality.
+ */
+ if (context->isReset)
+ return true;
+ return false;
+}
+
+/*
+ * AllocSetStats
+ * Compute stats about memory consumption of an allocset.
+ *
+ * printfunc: if not NULL, pass a human-readable stats string to this.
+ * passthru: pass this pointer through to printfunc.
+ * totals: if not NULL, add stats about this context into *totals.
+ * print_to_stderr: print stats to stderr if true, elog otherwise.
+ */
+static void
+AllocSetStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals, bool print_to_stderr)
+{
+ AllocSet set = (AllocSet) context;
+ Size nblocks = 0;
+ Size freechunks = 0;
+ Size totalspace;
+ Size freespace = 0;
+ AllocBlock block;
+ int fidx;
+
+ /* Include context header in totalspace */
+ totalspace = MAXALIGN(sizeof(AllocSetContext));
+
+ for (block = set->blocks; block != NULL; block = block->next)
+ {
+ nblocks++;
+ totalspace += block->endptr - ((char *) block);
+ freespace += block->endptr - block->freeptr;
+ }
+ for (fidx = 0; fidx < ALLOCSET_NUM_FREELISTS; fidx++)
+ {
+ AllocChunk chunk;
+
+ for (chunk = set->freelist[fidx]; chunk != NULL;
+ chunk = (AllocChunk) chunk->aset)
+ {
+ freechunks++;
+ freespace += chunk->size + ALLOC_CHUNKHDRSZ;
+ }
+ }
+
+ if (printfunc)
+ {
+ char stats_string[200];
+
+ snprintf(stats_string, sizeof(stats_string),
+ "%zu total in %zu blocks; %zu free (%zu chunks); %zu used",
+ totalspace, nblocks, freespace, freechunks,
+ totalspace - freespace);
+ printfunc(context, passthru, stats_string, print_to_stderr);
+ }
+
+ if (totals)
+ {
+ totals->nblocks += nblocks;
+ totals->freechunks += freechunks;
+ totals->totalspace += totalspace;
+ totals->freespace += freespace;
+ }
+}
+
+
+#ifdef MEMORY_CONTEXT_CHECKING
+
+/*
+ * AllocSetCheck
+ * Walk through chunks and check consistency of memory.
+ *
+ * NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll
+ * find yourself in an infinite loop when trouble occurs, because this
+ * routine will be entered again when elog cleanup tries to release memory!
+ */
+static void
+AllocSetCheck(MemoryContext context)
+{
+ AllocSet set = (AllocSet) context;
+ const char *name = set->header.name;
+ AllocBlock prevblock;
+ AllocBlock block;
+ Size total_allocated = 0;
+
+ for (prevblock = NULL, block = set->blocks;
+ block != NULL;
+ prevblock = block, block = block->next)
+ {
+ char *bpoz = ((char *) block) + ALLOC_BLOCKHDRSZ;
+ long blk_used = block->freeptr - bpoz;
+ long blk_data = 0;
+ long nchunks = 0;
+
+ if (set->keeper == block)
+ total_allocated += block->endptr - ((char *) set);
+ else
+ total_allocated += block->endptr - ((char *) block);
+
+ /*
+ * Empty block - empty can be keeper-block only
+ */
+ if (!blk_used)
+ {
+ if (set->keeper != block)
+ elog(WARNING, "problem in alloc set %s: empty block %p",
+ name, block);
+ }
+
+ /*
+ * Check block header fields
+ */
+ if (block->aset != set ||
+ block->prev != prevblock ||
+ block->freeptr < bpoz ||
+ block->freeptr > block->endptr)
+ elog(WARNING, "problem in alloc set %s: corrupt header in block %p",
+ name, block);
+
+ /*
+ * Chunk walker
+ */
+ while (bpoz < block->freeptr)
+ {
+ AllocChunk chunk = (AllocChunk) bpoz;
+ Size chsize,
+ dsize;
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ chsize = chunk->size; /* aligned chunk size */
+ dsize = chunk->requested_size; /* real data */
+
+ /*
+ * Check chunk size
+ */
+ if (dsize > chsize)
+ elog(WARNING, "problem in alloc set %s: req size > alloc size for chunk %p in block %p",
+ name, chunk, block);
+ if (chsize < (1 << ALLOC_MINBITS))
+ elog(WARNING, "problem in alloc set %s: bad size %zu for chunk %p in block %p",
+ name, chsize, chunk, block);
+
+ /* single-chunk block? */
+ if (chsize > set->allocChunkLimit &&
+ chsize + ALLOC_CHUNKHDRSZ != blk_used)
+ elog(WARNING, "problem in alloc set %s: bad single-chunk %p in block %p",
+ name, chunk, block);
+
+ /*
+ * If chunk is allocated, check for correct aset pointer. (If it's
+ * free, the aset is the freelist pointer, which we can't check as
+ * easily...) Note this is an incomplete test, since palloc(0)
+ * produces an allocated chunk with requested_size == 0.
+ */
+ if (dsize > 0 && chunk->aset != (void *) set)
+ elog(WARNING, "problem in alloc set %s: bogus aset link in block %p, chunk %p",
+ name, block, chunk);
+
+ /*
+ * Check for overwrite of padding space in an allocated chunk.
+ */
+ if (chunk->aset == (void *) set && dsize < chsize &&
+ !sentinel_ok(chunk, ALLOC_CHUNKHDRSZ + dsize))
+ elog(WARNING, "problem in alloc set %s: detected write past chunk end in block %p, chunk %p",
+ name, block, chunk);
+
+ /*
+ * If chunk is allocated, disallow external access to private part
+ * of chunk header.
+ */
+ if (chunk->aset == (void *) set)
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOCCHUNK_PRIVATE_LEN);
+
+ blk_data += chsize;
+ nchunks++;
+
+ bpoz += ALLOC_CHUNKHDRSZ + chsize;
+ }
+
+ if ((blk_data + (nchunks * ALLOC_CHUNKHDRSZ)) != blk_used)
+ elog(WARNING, "problem in alloc set %s: found inconsistent memory block %p",
+ name, block);
+ }
+
+ Assert(total_allocated == context->mem_allocated);
+}
+
+#endif /* MEMORY_CONTEXT_CHECKING */
diff --git a/src/backend/utils/mmgr/dsa.c b/src/backend/utils/mmgr/dsa.c
new file mode 100644
index 0000000..7d0686b
--- /dev/null
+++ b/src/backend/utils/mmgr/dsa.c
@@ -0,0 +1,2308 @@
+/*-------------------------------------------------------------------------
+ *
+ * dsa.c
+ * Dynamic shared memory areas.
+ *
+ * This module provides dynamic shared memory areas which are built on top of
+ * DSM segments. While dsm.c allows segments of memory of shared memory to be
+ * created and shared between backends, it isn't designed to deal with small
+ * objects. A DSA area is a shared memory heap usually backed by one or more
+ * DSM segments which can allocate memory using dsa_allocate() and dsa_free().
+ * Alternatively, it can be created in pre-existing shared memory, including a
+ * DSM segment, and then create extra DSM segments as required. Unlike the
+ * regular system heap, it deals in pseudo-pointers which must be converted to
+ * backend-local pointers before they are dereferenced. These pseudo-pointers
+ * can however be shared with other backends, and can be used to construct
+ * shared data structures.
+ *
+ * Each DSA area manages a set of DSM segments, adding new segments as
+ * required and detaching them when they are no longer needed. Each segment
+ * contains a number of 4KB pages, a free page manager for tracking
+ * consecutive runs of free pages, and a page map for tracking the source of
+ * objects allocated on each page. Allocation requests above 8KB are handled
+ * by choosing a segment and finding consecutive free pages in its free page
+ * manager. Allocation requests for smaller sizes are handled using pools of
+ * objects of a selection of sizes. Each pool consists of a number of 16 page
+ * (64KB) superblocks allocated in the same way as large objects. Allocation
+ * of large objects and new superblocks is serialized by a single LWLock, but
+ * allocation of small objects from pre-existing superblocks uses one LWLock
+ * per pool. Currently there is one pool, and therefore one lock, per size
+ * class. Per-core pools to increase concurrency and strategies for reducing
+ * the resulting fragmentation are areas for future research. Each superblock
+ * is managed with a 'span', which tracks the superblock's freelist. Free
+ * requests are handled by looking in the page map to find which span an
+ * address was allocated from, so that small objects can be returned to the
+ * appropriate free list, and large object pages can be returned directly to
+ * the free page map. When allocating, simple heuristics for selecting
+ * segments and superblocks try to encourage occupied memory to be
+ * concentrated, increasing the likelihood that whole superblocks can become
+ * empty and be returned to the free page manager, and whole segments can
+ * become empty and be returned to the operating system.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/dsa.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "port/atomics.h"
+#include "storage/dsm.h"
+#include "storage/ipc.h"
+#include "storage/lwlock.h"
+#include "storage/shmem.h"
+#include "utils/dsa.h"
+#include "utils/freepage.h"
+#include "utils/memutils.h"
+
+/*
+ * The size of the initial DSM segment that backs a dsa_area created by
+ * dsa_create. After creating some number of segments of this size we'll
+ * double this size, and so on. Larger segments may be created if necessary
+ * to satisfy large requests.
+ */
+#define DSA_INITIAL_SEGMENT_SIZE ((size_t) (1 * 1024 * 1024))
+
+/*
+ * How many segments to create before we double the segment size. If this is
+ * low, then there is likely to be a lot of wasted space in the largest
+ * segment. If it is high, then we risk running out of segment slots (see
+ * dsm.c's limits on total number of segments), or limiting the total size
+ * an area can manage when using small pointers.
+ */
+#define DSA_NUM_SEGMENTS_AT_EACH_SIZE 2
+
+/*
+ * The number of bits used to represent the offset part of a dsa_pointer.
+ * This controls the maximum size of a segment, the maximum possible
+ * allocation size and also the maximum number of segments per area.
+ */
+#if SIZEOF_DSA_POINTER == 4
+#define DSA_OFFSET_WIDTH 27 /* 32 segments of size up to 128MB */
+#else
+#define DSA_OFFSET_WIDTH 40 /* 1024 segments of size up to 1TB */
+#endif
+
+/*
+ * The maximum number of DSM segments that an area can own, determined by
+ * the number of bits remaining (but capped at 1024).
+ */
+#define DSA_MAX_SEGMENTS \
+ Min(1024, (1 << ((SIZEOF_DSA_POINTER * 8) - DSA_OFFSET_WIDTH)))
+
+/* The bitmask for extracting the offset from a dsa_pointer. */
+#define DSA_OFFSET_BITMASK (((dsa_pointer) 1 << DSA_OFFSET_WIDTH) - 1)
+
+/* The maximum size of a DSM segment. */
+#define DSA_MAX_SEGMENT_SIZE ((size_t) 1 << DSA_OFFSET_WIDTH)
+
+/* Number of pages (see FPM_PAGE_SIZE) per regular superblock. */
+#define DSA_PAGES_PER_SUPERBLOCK 16
+
+/*
+ * A magic number used as a sanity check for following DSM segments belonging
+ * to a DSA area (this number will be XORed with the area handle and
+ * the segment index).
+ */
+#define DSA_SEGMENT_HEADER_MAGIC 0x0ce26608
+
+/* Build a dsa_pointer given a segment number and offset. */
+#define DSA_MAKE_POINTER(segment_number, offset) \
+ (((dsa_pointer) (segment_number) << DSA_OFFSET_WIDTH) | (offset))
+
+/* Extract the segment number from a dsa_pointer. */
+#define DSA_EXTRACT_SEGMENT_NUMBER(dp) ((dp) >> DSA_OFFSET_WIDTH)
+
+/* Extract the offset from a dsa_pointer. */
+#define DSA_EXTRACT_OFFSET(dp) ((dp) & DSA_OFFSET_BITMASK)
+
+/* The type used for index segment indexes (zero based). */
+typedef size_t dsa_segment_index;
+
+/* Sentinel value for dsa_segment_index indicating 'none' or 'end'. */
+#define DSA_SEGMENT_INDEX_NONE (~(dsa_segment_index)0)
+
+/*
+ * How many bins of segments do we have? The bins are used to categorize
+ * segments by their largest contiguous run of free pages.
+ */
+#define DSA_NUM_SEGMENT_BINS 16
+
+/*
+ * What is the lowest bin that holds segments that *might* have n contiguous
+ * free pages? There is no point in looking in segments in lower bins; they
+ * definitely can't service a request for n free pages.
+ */
+#define contiguous_pages_to_segment_bin(n) Min(fls(n), DSA_NUM_SEGMENT_BINS - 1)
+
+/* Macros for access to locks. */
+#define DSA_AREA_LOCK(area) (&area->control->lock)
+#define DSA_SCLASS_LOCK(area, sclass) (&area->control->pools[sclass].lock)
+
+/*
+ * The header for an individual segment. This lives at the start of each DSM
+ * segment owned by a DSA area including the first segment (where it appears
+ * as part of the dsa_area_control struct).
+ */
+typedef struct
+{
+ /* Sanity check magic value. */
+ uint32 magic;
+ /* Total number of pages in this segment (excluding metadata area). */
+ size_t usable_pages;
+ /* Total size of this segment in bytes. */
+ size_t size;
+
+ /*
+ * Index of the segment that precedes this one in the same segment bin, or
+ * DSA_SEGMENT_INDEX_NONE if this is the first one.
+ */
+ dsa_segment_index prev;
+
+ /*
+ * Index of the segment that follows this one in the same segment bin, or
+ * DSA_SEGMENT_INDEX_NONE if this is the last one.
+ */
+ dsa_segment_index next;
+ /* The index of the bin that contains this segment. */
+ size_t bin;
+
+ /*
+ * A flag raised to indicate that this segment is being returned to the
+ * operating system and has been unpinned.
+ */
+ bool freed;
+} dsa_segment_header;
+
+/*
+ * Metadata for one superblock.
+ *
+ * For most blocks, span objects are stored out-of-line; that is, the span
+ * object is not stored within the block itself. But, as an exception, for a
+ * "span of spans", the span object is stored "inline". The allocation is
+ * always exactly one page, and the dsa_area_span object is located at
+ * the beginning of that page. The size class is DSA_SCLASS_BLOCK_OF_SPANS,
+ * and the remaining fields are used just as they would be in an ordinary
+ * block. We can't allocate spans out of ordinary superblocks because
+ * creating an ordinary superblock requires us to be able to allocate a span
+ * *first*. Doing it this way avoids that circularity.
+ */
+typedef struct
+{
+ dsa_pointer pool; /* Containing pool. */
+ dsa_pointer prevspan; /* Previous span. */
+ dsa_pointer nextspan; /* Next span. */
+ dsa_pointer start; /* Starting address. */
+ size_t npages; /* Length of span in pages. */
+ uint16 size_class; /* Size class. */
+ uint16 ninitialized; /* Maximum number of objects ever allocated. */
+ uint16 nallocatable; /* Number of objects currently allocatable. */
+ uint16 firstfree; /* First object on free list. */
+ uint16 nmax; /* Maximum number of objects ever possible. */
+ uint16 fclass; /* Current fullness class. */
+} dsa_area_span;
+
+/*
+ * Given a pointer to an object in a span, access the index of the next free
+ * object in the same span (ie in the span's freelist) as an L-value.
+ */
+#define NextFreeObjectIndex(object) (* (uint16 *) (object))
+
+/*
+ * Small allocations are handled by dividing a single block of memory into
+ * many small objects of equal size. The possible allocation sizes are
+ * defined by the following array. Larger size classes are spaced more widely
+ * than smaller size classes. We fudge the spacing for size classes >1kB to
+ * avoid space wastage: based on the knowledge that we plan to allocate 64kB
+ * blocks, we bump the maximum object size up to the largest multiple of
+ * 8 bytes that still lets us fit the same number of objects into one block.
+ *
+ * NB: Because of this fudging, if we were ever to use differently-sized blocks
+ * for small allocations, these size classes would need to be reworked to be
+ * optimal for the new size.
+ *
+ * NB: The optimal spacing for size classes, as well as the size of the blocks
+ * out of which small objects are allocated, is not a question that has one
+ * right answer. Some allocators (such as tcmalloc) use more closely-spaced
+ * size classes than we do here, while others (like aset.c) use more
+ * widely-spaced classes. Spacing the classes more closely avoids wasting
+ * memory within individual chunks, but also means a larger number of
+ * potentially-unfilled blocks.
+ */
+static const uint16 dsa_size_classes[] = {
+ sizeof(dsa_area_span), 0, /* special size classes */
+ 8, 16, 24, 32, 40, 48, 56, 64, /* 8 classes separated by 8 bytes */
+ 80, 96, 112, 128, /* 4 classes separated by 16 bytes */
+ 160, 192, 224, 256, /* 4 classes separated by 32 bytes */
+ 320, 384, 448, 512, /* 4 classes separated by 64 bytes */
+ 640, 768, 896, 1024, /* 4 classes separated by 128 bytes */
+ 1280, 1560, 1816, 2048, /* 4 classes separated by ~256 bytes */
+ 2616, 3120, 3640, 4096, /* 4 classes separated by ~512 bytes */
+ 5456, 6552, 7280, 8192 /* 4 classes separated by ~1024 bytes */
+};
+#define DSA_NUM_SIZE_CLASSES lengthof(dsa_size_classes)
+
+/* Special size classes. */
+#define DSA_SCLASS_BLOCK_OF_SPANS 0
+#define DSA_SCLASS_SPAN_LARGE 1
+
+/*
+ * The following lookup table is used to map the size of small objects
+ * (less than 1kB) onto the corresponding size class. To use this table,
+ * round the size of the object up to the next multiple of 8 bytes, and then
+ * index into this array.
+ */
+static const uint8 dsa_size_class_map[] = {
+ 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17,
+ 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
+ 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25
+};
+#define DSA_SIZE_CLASS_MAP_QUANTUM 8
+
+/*
+ * Superblocks are binned by how full they are. Generally, each fullness
+ * class corresponds to one quartile, but the block being used for
+ * allocations is always at the head of the list for fullness class 1,
+ * regardless of how full it really is.
+ */
+#define DSA_FULLNESS_CLASSES 4
+
+/*
+ * A dsa_area_pool represents a set of objects of a given size class.
+ *
+ * Perhaps there should be multiple pools for the same size class for
+ * contention avoidance, but for now there is just one!
+ */
+typedef struct
+{
+ /* A lock protecting access to this pool. */
+ LWLock lock;
+ /* A set of linked lists of spans, arranged by fullness. */
+ dsa_pointer spans[DSA_FULLNESS_CLASSES];
+ /* Should we pad this out to a cacheline boundary? */
+} dsa_area_pool;
+
+/*
+ * The control block for an area. This lives in shared memory, at the start of
+ * the first DSM segment controlled by this area.
+ */
+typedef struct
+{
+ /* The segment header for the first segment. */
+ dsa_segment_header segment_header;
+ /* The handle for this area. */
+ dsa_handle handle;
+ /* The handles of the segments owned by this area. */
+ dsm_handle segment_handles[DSA_MAX_SEGMENTS];
+ /* Lists of segments, binned by maximum contiguous run of free pages. */
+ dsa_segment_index segment_bins[DSA_NUM_SEGMENT_BINS];
+ /* The object pools for each size class. */
+ dsa_area_pool pools[DSA_NUM_SIZE_CLASSES];
+ /* The total size of all active segments. */
+ size_t total_segment_size;
+ /* The maximum total size of backing storage we are allowed. */
+ size_t max_total_segment_size;
+ /* Highest used segment index in the history of this area. */
+ dsa_segment_index high_segment_index;
+ /* The reference count for this area. */
+ int refcnt;
+ /* A flag indicating that this area has been pinned. */
+ bool pinned;
+ /* The number of times that segments have been freed. */
+ size_t freed_segment_counter;
+ /* The LWLock tranche ID. */
+ int lwlock_tranche_id;
+ /* The general lock (protects everything except object pools). */
+ LWLock lock;
+} dsa_area_control;
+
+/* Given a pointer to a pool, find a dsa_pointer. */
+#define DsaAreaPoolToDsaPointer(area, p) \
+ DSA_MAKE_POINTER(0, (char *) p - (char *) area->control)
+
+/*
+ * A dsa_segment_map is stored within the backend-private memory of each
+ * individual backend. It holds the base address of the segment within that
+ * backend, plus the addresses of key objects within the segment. Those
+ * could instead be derived from the base address but it's handy to have them
+ * around.
+ */
+typedef struct
+{
+ dsm_segment *segment; /* DSM segment */
+ char *mapped_address; /* Address at which segment is mapped */
+ dsa_segment_header *header; /* Header (same as mapped_address) */
+ FreePageManager *fpm; /* Free page manager within segment. */
+ dsa_pointer *pagemap; /* Page map within segment. */
+} dsa_segment_map;
+
+/*
+ * Per-backend state for a storage area. Backends obtain one of these by
+ * creating an area or attaching to an existing one using a handle. Each
+ * process that needs to use an area uses its own object to track where the
+ * segments are mapped.
+ */
+struct dsa_area
+{
+ /* Pointer to the control object in shared memory. */
+ dsa_area_control *control;
+
+ /* Has the mapping been pinned? */
+ bool mapping_pinned;
+
+ /*
+ * This backend's array of segment maps, ordered by segment index
+ * corresponding to control->segment_handles. Some of the area's segments
+ * may not be mapped in this backend yet, and some slots may have been
+ * freed and need to be detached; these operations happen on demand.
+ */
+ dsa_segment_map segment_maps[DSA_MAX_SEGMENTS];
+
+ /* The highest segment index this backend has ever mapped. */
+ dsa_segment_index high_segment_index;
+
+ /* The last observed freed_segment_counter. */
+ size_t freed_segment_counter;
+};
+
+#define DSA_SPAN_NOTHING_FREE ((uint16) -1)
+#define DSA_SUPERBLOCK_SIZE (DSA_PAGES_PER_SUPERBLOCK * FPM_PAGE_SIZE)
+
+/* Given a pointer to a segment_map, obtain a segment index number. */
+#define get_segment_index(area, segment_map_ptr) \
+ (segment_map_ptr - &area->segment_maps[0])
+
+static void init_span(dsa_area *area, dsa_pointer span_pointer,
+ dsa_area_pool *pool, dsa_pointer start, size_t npages,
+ uint16 size_class);
+static bool transfer_first_span(dsa_area *area, dsa_area_pool *pool,
+ int fromclass, int toclass);
+static inline dsa_pointer alloc_object(dsa_area *area, int size_class);
+static bool ensure_active_superblock(dsa_area *area, dsa_area_pool *pool,
+ int size_class);
+static dsa_segment_map *get_segment_by_index(dsa_area *area,
+ dsa_segment_index index);
+static void destroy_superblock(dsa_area *area, dsa_pointer span_pointer);
+static void unlink_span(dsa_area *area, dsa_area_span *span);
+static void add_span_to_fullness_class(dsa_area *area, dsa_area_span *span,
+ dsa_pointer span_pointer, int fclass);
+static void unlink_segment(dsa_area *area, dsa_segment_map *segment_map);
+static dsa_segment_map *get_best_segment(dsa_area *area, size_t npages);
+static dsa_segment_map *make_new_segment(dsa_area *area, size_t requested_pages);
+static dsa_area *create_internal(void *place, size_t size,
+ int tranche_id,
+ dsm_handle control_handle,
+ dsm_segment *control_segment);
+static dsa_area *attach_internal(void *place, dsm_segment *segment,
+ dsa_handle handle);
+static void check_for_freed_segments(dsa_area *area);
+static void check_for_freed_segments_locked(dsa_area *area);
+static void rebin_segment(dsa_area *area, dsa_segment_map *segment_map);
+
+/*
+ * Create a new shared area in a new DSM segment. Further DSM segments will
+ * be allocated as required to extend the available space.
+ *
+ * We can't allocate a LWLock tranche_id within this function, because tranche
+ * IDs are a scarce resource; there are only 64k available, using low numbers
+ * when possible matters, and we have no provision for recycling them. So,
+ * we require the caller to provide one.
+ */
+dsa_area *
+dsa_create(int tranche_id)
+{
+ dsm_segment *segment;
+ dsa_area *area;
+
+ /*
+ * Create the DSM segment that will hold the shared control object and the
+ * first segment of usable space.
+ */
+ segment = dsm_create(DSA_INITIAL_SEGMENT_SIZE, 0);
+
+ /*
+ * All segments backing this area are pinned, so that DSA can explicitly
+ * control their lifetime (otherwise a newly created segment belonging to
+ * this area might be freed when the only backend that happens to have it
+ * mapped in ends, corrupting the area).
+ */
+ dsm_pin_segment(segment);
+
+ /* Create a new DSA area with the control object in this segment. */
+ area = create_internal(dsm_segment_address(segment),
+ DSA_INITIAL_SEGMENT_SIZE,
+ tranche_id,
+ dsm_segment_handle(segment), segment);
+
+ /* Clean up when the control segment detaches. */
+ on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place,
+ PointerGetDatum(dsm_segment_address(segment)));
+
+ return area;
+}
+
+/*
+ * Create a new shared area in an existing shared memory space, which may be
+ * either DSM or Postmaster-initialized memory. DSM segments will be
+ * allocated as required to extend the available space, though that can be
+ * prevented with dsa_set_size_limit(area, size) using the same size provided
+ * to dsa_create_in_place.
+ *
+ * Areas created in-place must eventually be released by the backend that
+ * created them and all backends that attach to them. This can be done
+ * explicitly with dsa_release_in_place, or, in the special case that 'place'
+ * happens to be in a pre-existing DSM segment, by passing in a pointer to the
+ * segment so that a detach hook can be registered with the containing DSM
+ * segment.
+ *
+ * See dsa_create() for a note about the tranche arguments.
+ */
+dsa_area *
+dsa_create_in_place(void *place, size_t size,
+ int tranche_id, dsm_segment *segment)
+{
+ dsa_area *area;
+
+ area = create_internal(place, size, tranche_id,
+ DSM_HANDLE_INVALID, NULL);
+
+ /*
+ * Clean up when the control segment detaches, if a containing DSM segment
+ * was provided.
+ */
+ if (segment != NULL)
+ on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place,
+ PointerGetDatum(place));
+
+ return area;
+}
+
+/*
+ * Obtain a handle that can be passed to other processes so that they can
+ * attach to the given area. Cannot be called for areas created with
+ * dsa_create_in_place.
+ */
+dsa_handle
+dsa_get_handle(dsa_area *area)
+{
+ Assert(area->control->handle != DSM_HANDLE_INVALID);
+ return area->control->handle;
+}
+
+/*
+ * Attach to an area given a handle generated (possibly in another process) by
+ * dsa_get_handle. The area must have been created with dsa_create (not
+ * dsa_create_in_place).
+ */
+dsa_area *
+dsa_attach(dsa_handle handle)
+{
+ dsm_segment *segment;
+ dsa_area *area;
+
+ /*
+ * An area handle is really a DSM segment handle for the first segment, so
+ * we go ahead and attach to that.
+ */
+ segment = dsm_attach(handle);
+ if (segment == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("could not attach to dynamic shared area")));
+
+ area = attach_internal(dsm_segment_address(segment), segment, handle);
+
+ /* Clean up when the control segment detaches. */
+ on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place,
+ PointerGetDatum(dsm_segment_address(segment)));
+
+ return area;
+}
+
+/*
+ * Attach to an area that was created with dsa_create_in_place. The caller
+ * must somehow know the location in memory that was used when the area was
+ * created, though it may be mapped at a different virtual address in this
+ * process.
+ *
+ * See dsa_create_in_place for note about releasing in-place areas, and the
+ * optional 'segment' argument which can be provided to allow automatic
+ * release if the containing memory happens to be a DSM segment.
+ */
+dsa_area *
+dsa_attach_in_place(void *place, dsm_segment *segment)
+{
+ dsa_area *area;
+
+ area = attach_internal(place, NULL, DSM_HANDLE_INVALID);
+
+ /*
+ * Clean up when the control segment detaches, if a containing DSM segment
+ * was provided.
+ */
+ if (segment != NULL)
+ on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place,
+ PointerGetDatum(place));
+
+ return area;
+}
+
+/*
+ * Release a DSA area that was produced by dsa_create_in_place or
+ * dsa_attach_in_place. The 'segment' argument is ignored but provides an
+ * interface suitable for on_dsm_detach, for the convenience of users who want
+ * to create a DSA segment inside an existing DSM segment and have it
+ * automatically released when the containing DSM segment is detached.
+ * 'place' should be the address of the place where the area was created.
+ *
+ * This callback is automatically registered for the DSM segment containing
+ * the control object of in-place areas when a segment is provided to
+ * dsa_create_in_place or dsa_attach_in_place, and also for all areas created
+ * with dsa_create.
+ */
+void
+dsa_on_dsm_detach_release_in_place(dsm_segment *segment, Datum place)
+{
+ dsa_release_in_place(DatumGetPointer(place));
+}
+
+/*
+ * Release a DSA area that was produced by dsa_create_in_place or
+ * dsa_attach_in_place. The 'code' argument is ignored but provides an
+ * interface suitable for on_shmem_exit or before_shmem_exit, for the
+ * convenience of users who want to create a DSA segment inside shared memory
+ * other than a DSM segment and have it automatically release at backend exit.
+ * 'place' should be the address of the place where the area was created.
+ */
+void
+dsa_on_shmem_exit_release_in_place(int code, Datum place)
+{
+ dsa_release_in_place(DatumGetPointer(place));
+}
+
+/*
+ * Release a DSA area that was produced by dsa_create_in_place or
+ * dsa_attach_in_place. It is preferable to use one of the 'dsa_on_XXX'
+ * callbacks so that this is managed automatically, because failure to release
+ * an area created in-place leaks its segments permanently.
+ *
+ * This is also called automatically for areas produced by dsa_create or
+ * dsa_attach as an implementation detail.
+ */
+void
+dsa_release_in_place(void *place)
+{
+ dsa_area_control *control = (dsa_area_control *) place;
+ int i;
+
+ LWLockAcquire(&control->lock, LW_EXCLUSIVE);
+ Assert(control->segment_header.magic ==
+ (DSA_SEGMENT_HEADER_MAGIC ^ control->handle ^ 0));
+ Assert(control->refcnt > 0);
+ if (--control->refcnt == 0)
+ {
+ for (i = 0; i <= control->high_segment_index; ++i)
+ {
+ dsm_handle handle;
+
+ handle = control->segment_handles[i];
+ if (handle != DSM_HANDLE_INVALID)
+ dsm_unpin_segment(handle);
+ }
+ }
+ LWLockRelease(&control->lock);
+}
+
+/*
+ * Keep a DSA area attached until end of session or explicit detach.
+ *
+ * By default, areas are owned by the current resource owner, which means they
+ * are detached automatically when that scope ends.
+ */
+void
+dsa_pin_mapping(dsa_area *area)
+{
+ int i;
+
+ Assert(!area->mapping_pinned);
+ area->mapping_pinned = true;
+
+ for (i = 0; i <= area->high_segment_index; ++i)
+ if (area->segment_maps[i].segment != NULL)
+ dsm_pin_mapping(area->segment_maps[i].segment);
+}
+
+/*
+ * Allocate memory in this storage area. The return value is a dsa_pointer
+ * that can be passed to other processes, and converted to a local pointer
+ * with dsa_get_address. 'flags' is a bitmap which should be constructed
+ * from the following values:
+ *
+ * DSA_ALLOC_HUGE allows allocations >= 1GB. Otherwise, such allocations
+ * will result in an ERROR.
+ *
+ * DSA_ALLOC_NO_OOM causes this function to return InvalidDsaPointer when
+ * no memory is available or a size limit established by dsa_set_size_limit
+ * would be exceeded. Otherwise, such allocations will result in an ERROR.
+ *
+ * DSA_ALLOC_ZERO causes the allocated memory to be zeroed. Otherwise, the
+ * contents of newly-allocated memory are indeterminate.
+ *
+ * These flags correspond to similarly named flags used by
+ * MemoryContextAllocExtended(). See also the macros dsa_allocate and
+ * dsa_allocate0 which expand to a call to this function with commonly used
+ * flags.
+ */
+dsa_pointer
+dsa_allocate_extended(dsa_area *area, size_t size, int flags)
+{
+ uint16 size_class;
+ dsa_pointer start_pointer;
+ dsa_segment_map *segment_map;
+ dsa_pointer result;
+
+ Assert(size > 0);
+
+ /* Sanity check on huge individual allocation size. */
+ if (((flags & DSA_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
+ ((flags & DSA_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
+ elog(ERROR, "invalid DSA memory alloc request size %zu", size);
+
+ /*
+ * If bigger than the largest size class, just grab a run of pages from
+ * the free page manager, instead of allocating an object from a pool.
+ * There will still be a span, but it's a special class of span that
+ * manages this whole allocation and simply gives all pages back to the
+ * free page manager when dsa_free is called.
+ */
+ if (size > dsa_size_classes[lengthof(dsa_size_classes) - 1])
+ {
+ size_t npages = fpm_size_to_pages(size);
+ size_t first_page;
+ dsa_pointer span_pointer;
+ dsa_area_pool *pool = &area->control->pools[DSA_SCLASS_SPAN_LARGE];
+
+ /* Obtain a span object. */
+ span_pointer = alloc_object(area, DSA_SCLASS_BLOCK_OF_SPANS);
+ if (!DsaPointerIsValid(span_pointer))
+ {
+ /* Raise error unless asked not to. */
+ if ((flags & DSA_ALLOC_NO_OOM) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on DSA request of size %zu.",
+ size)));
+ return InvalidDsaPointer;
+ }
+
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+
+ /* Find a segment from which to allocate. */
+ segment_map = get_best_segment(area, npages);
+ if (segment_map == NULL)
+ segment_map = make_new_segment(area, npages);
+ if (segment_map == NULL)
+ {
+ /* Can't make any more segments: game over. */
+ LWLockRelease(DSA_AREA_LOCK(area));
+ dsa_free(area, span_pointer);
+
+ /* Raise error unless asked not to. */
+ if ((flags & DSA_ALLOC_NO_OOM) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on DSA request of size %zu.",
+ size)));
+ return InvalidDsaPointer;
+ }
+
+ /*
+ * Ask the free page manager for a run of pages. This should always
+ * succeed, since both get_best_segment and make_new_segment should
+ * only return a non-NULL pointer if it actually contains enough
+ * contiguous freespace. If it does fail, something in our backend
+ * private state is out of whack, so use FATAL to kill the process.
+ */
+ if (!FreePageManagerGet(segment_map->fpm, npages, &first_page))
+ elog(FATAL,
+ "dsa_allocate could not find %zu free pages", npages);
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ start_pointer = DSA_MAKE_POINTER(get_segment_index(area, segment_map),
+ first_page * FPM_PAGE_SIZE);
+
+ /* Initialize span and pagemap. */
+ LWLockAcquire(DSA_SCLASS_LOCK(area, DSA_SCLASS_SPAN_LARGE),
+ LW_EXCLUSIVE);
+ init_span(area, span_pointer, pool, start_pointer, npages,
+ DSA_SCLASS_SPAN_LARGE);
+ segment_map->pagemap[first_page] = span_pointer;
+ LWLockRelease(DSA_SCLASS_LOCK(area, DSA_SCLASS_SPAN_LARGE));
+
+ /* Zero-initialize the memory if requested. */
+ if ((flags & DSA_ALLOC_ZERO) != 0)
+ memset(dsa_get_address(area, start_pointer), 0, size);
+
+ return start_pointer;
+ }
+
+ /* Map allocation to a size class. */
+ if (size < lengthof(dsa_size_class_map) * DSA_SIZE_CLASS_MAP_QUANTUM)
+ {
+ int mapidx;
+
+ /* For smaller sizes we have a lookup table... */
+ mapidx = ((size + DSA_SIZE_CLASS_MAP_QUANTUM - 1) /
+ DSA_SIZE_CLASS_MAP_QUANTUM) - 1;
+ size_class = dsa_size_class_map[mapidx];
+ }
+ else
+ {
+ uint16 min;
+ uint16 max;
+
+ /* ... and for the rest we search by binary chop. */
+ min = dsa_size_class_map[lengthof(dsa_size_class_map) - 1];
+ max = lengthof(dsa_size_classes) - 1;
+
+ while (min < max)
+ {
+ uint16 mid = (min + max) / 2;
+ uint16 class_size = dsa_size_classes[mid];
+
+ if (class_size < size)
+ min = mid + 1;
+ else
+ max = mid;
+ }
+
+ size_class = min;
+ }
+ Assert(size <= dsa_size_classes[size_class]);
+ Assert(size_class == 0 || size > dsa_size_classes[size_class - 1]);
+
+ /* Attempt to allocate an object from the appropriate pool. */
+ result = alloc_object(area, size_class);
+
+ /* Check for failure to allocate. */
+ if (!DsaPointerIsValid(result))
+ {
+ /* Raise error unless asked not to. */
+ if ((flags & DSA_ALLOC_NO_OOM) == 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on DSA request of size %zu.", size)));
+ return InvalidDsaPointer;
+ }
+
+ /* Zero-initialize the memory if requested. */
+ if ((flags & DSA_ALLOC_ZERO) != 0)
+ memset(dsa_get_address(area, result), 0, size);
+
+ return result;
+}
+
+/*
+ * Free memory obtained with dsa_allocate.
+ */
+void
+dsa_free(dsa_area *area, dsa_pointer dp)
+{
+ dsa_segment_map *segment_map;
+ int pageno;
+ dsa_pointer span_pointer;
+ dsa_area_span *span;
+ char *superblock;
+ char *object;
+ size_t size;
+ int size_class;
+
+ /* Make sure we don't have a stale segment in the slot 'dp' refers to. */
+ check_for_freed_segments(area);
+
+ /* Locate the object, span and pool. */
+ segment_map = get_segment_by_index(area, DSA_EXTRACT_SEGMENT_NUMBER(dp));
+ pageno = DSA_EXTRACT_OFFSET(dp) / FPM_PAGE_SIZE;
+ span_pointer = segment_map->pagemap[pageno];
+ span = dsa_get_address(area, span_pointer);
+ superblock = dsa_get_address(area, span->start);
+ object = dsa_get_address(area, dp);
+ size_class = span->size_class;
+ size = dsa_size_classes[size_class];
+
+ /*
+ * Special case for large objects that live in a special span: we return
+ * those pages directly to the free page manager and free the span.
+ */
+ if (span->size_class == DSA_SCLASS_SPAN_LARGE)
+ {
+
+#ifdef CLOBBER_FREED_MEMORY
+ memset(object, 0x7f, span->npages * FPM_PAGE_SIZE);
+#endif
+
+ /* Give pages back to free page manager. */
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ FreePageManagerPut(segment_map->fpm,
+ DSA_EXTRACT_OFFSET(span->start) / FPM_PAGE_SIZE,
+ span->npages);
+
+ /* Move segment to appropriate bin if necessary. */
+ rebin_segment(area, segment_map);
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ /* Unlink span. */
+ LWLockAcquire(DSA_SCLASS_LOCK(area, DSA_SCLASS_SPAN_LARGE),
+ LW_EXCLUSIVE);
+ unlink_span(area, span);
+ LWLockRelease(DSA_SCLASS_LOCK(area, DSA_SCLASS_SPAN_LARGE));
+ /* Free the span object so it can be reused. */
+ dsa_free(area, span_pointer);
+ return;
+ }
+
+#ifdef CLOBBER_FREED_MEMORY
+ memset(object, 0x7f, size);
+#endif
+
+ LWLockAcquire(DSA_SCLASS_LOCK(area, size_class), LW_EXCLUSIVE);
+
+ /* Put the object on the span's freelist. */
+ Assert(object >= superblock);
+ Assert(object < superblock + DSA_SUPERBLOCK_SIZE);
+ Assert((object - superblock) % size == 0);
+ NextFreeObjectIndex(object) = span->firstfree;
+ span->firstfree = (object - superblock) / size;
+ ++span->nallocatable;
+
+ /*
+ * See if the span needs to moved to a different fullness class, or be
+ * freed so its pages can be given back to the segment.
+ */
+ if (span->nallocatable == 1 && span->fclass == DSA_FULLNESS_CLASSES - 1)
+ {
+ /*
+ * The block was completely full and is located in the
+ * highest-numbered fullness class, which is never scanned for free
+ * chunks. We must move it to the next-lower fullness class.
+ */
+ unlink_span(area, span);
+ add_span_to_fullness_class(area, span, span_pointer,
+ DSA_FULLNESS_CLASSES - 2);
+
+ /*
+ * If this is the only span, and there is no active span, then we
+ * should probably move this span to fullness class 1. (Otherwise if
+ * you allocate exactly all the objects in the only span, it moves to
+ * class 3, then you free them all, it moves to 2, and then is given
+ * back, leaving no active span).
+ */
+ }
+ else if (span->nallocatable == span->nmax &&
+ (span->fclass != 1 || span->prevspan != InvalidDsaPointer))
+ {
+ /*
+ * This entire block is free, and it's not the active block for this
+ * size class. Return the memory to the free page manager. We don't
+ * do this for the active block to prevent hysteresis: if we
+ * repeatedly allocate and free the only chunk in the active block, it
+ * will be very inefficient if we deallocate and reallocate the block
+ * every time.
+ */
+ destroy_superblock(area, span_pointer);
+ }
+
+ LWLockRelease(DSA_SCLASS_LOCK(area, size_class));
+}
+
+/*
+ * Obtain a backend-local address for a dsa_pointer. 'dp' must point to
+ * memory allocated by the given area (possibly in another process) that
+ * hasn't yet been freed. This may cause a segment to be mapped into the
+ * current process if required, and may cause freed segments to be unmapped.
+ */
+void *
+dsa_get_address(dsa_area *area, dsa_pointer dp)
+{
+ dsa_segment_index index;
+ size_t offset;
+
+ /* Convert InvalidDsaPointer to NULL. */
+ if (!DsaPointerIsValid(dp))
+ return NULL;
+
+ /* Process any requests to detach from freed segments. */
+ check_for_freed_segments(area);
+
+ /* Break the dsa_pointer into its components. */
+ index = DSA_EXTRACT_SEGMENT_NUMBER(dp);
+ offset = DSA_EXTRACT_OFFSET(dp);
+ Assert(index < DSA_MAX_SEGMENTS);
+
+ /* Check if we need to cause this segment to be mapped in. */
+ if (unlikely(area->segment_maps[index].mapped_address == NULL))
+ {
+ /* Call for effect (we don't need the result). */
+ get_segment_by_index(area, index);
+ }
+
+ return area->segment_maps[index].mapped_address + offset;
+}
+
+/*
+ * Pin this area, so that it will continue to exist even if all backends
+ * detach from it. In that case, the area can still be reattached to if a
+ * handle has been recorded somewhere.
+ */
+void
+dsa_pin(dsa_area *area)
+{
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ if (area->control->pinned)
+ {
+ LWLockRelease(DSA_AREA_LOCK(area));
+ elog(ERROR, "dsa_area already pinned");
+ }
+ area->control->pinned = true;
+ ++area->control->refcnt;
+ LWLockRelease(DSA_AREA_LOCK(area));
+}
+
+/*
+ * Undo the effects of dsa_pin, so that the given area can be freed when no
+ * backends are attached to it. May be called only if dsa_pin has been
+ * called.
+ */
+void
+dsa_unpin(dsa_area *area)
+{
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ Assert(area->control->refcnt > 1);
+ if (!area->control->pinned)
+ {
+ LWLockRelease(DSA_AREA_LOCK(area));
+ elog(ERROR, "dsa_area not pinned");
+ }
+ area->control->pinned = false;
+ --area->control->refcnt;
+ LWLockRelease(DSA_AREA_LOCK(area));
+}
+
+/*
+ * Set the total size limit for this area. This limit is checked whenever new
+ * segments need to be allocated from the operating system. If the new size
+ * limit is already exceeded, this has no immediate effect.
+ *
+ * Note that the total virtual memory usage may be temporarily larger than
+ * this limit when segments have been freed, but not yet detached by all
+ * backends that have attached to them.
+ */
+void
+dsa_set_size_limit(dsa_area *area, size_t limit)
+{
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ area->control->max_total_segment_size = limit;
+ LWLockRelease(DSA_AREA_LOCK(area));
+}
+
+/*
+ * Aggressively free all spare memory in the hope of returning DSM segments to
+ * the operating system.
+ */
+void
+dsa_trim(dsa_area *area)
+{
+ int size_class;
+
+ /*
+ * Trim in reverse pool order so we get to the spans-of-spans last, just
+ * in case any become entirely free while processing all the other pools.
+ */
+ for (size_class = DSA_NUM_SIZE_CLASSES - 1; size_class >= 0; --size_class)
+ {
+ dsa_area_pool *pool = &area->control->pools[size_class];
+ dsa_pointer span_pointer;
+
+ if (size_class == DSA_SCLASS_SPAN_LARGE)
+ {
+ /* Large object frees give back segments aggressively already. */
+ continue;
+ }
+
+ /*
+ * Search fullness class 1 only. That is where we expect to find an
+ * entirely empty superblock (entirely empty superblocks in other
+ * fullness classes are returned to the free page map by dsa_free).
+ */
+ LWLockAcquire(DSA_SCLASS_LOCK(area, size_class), LW_EXCLUSIVE);
+ span_pointer = pool->spans[1];
+ while (DsaPointerIsValid(span_pointer))
+ {
+ dsa_area_span *span = dsa_get_address(area, span_pointer);
+ dsa_pointer next = span->nextspan;
+
+ if (span->nallocatable == span->nmax)
+ destroy_superblock(area, span_pointer);
+
+ span_pointer = next;
+ }
+ LWLockRelease(DSA_SCLASS_LOCK(area, size_class));
+ }
+}
+
+/*
+ * Print out debugging information about the internal state of the shared
+ * memory area.
+ */
+void
+dsa_dump(dsa_area *area)
+{
+ size_t i,
+ j;
+
+ /*
+ * Note: This gives an inconsistent snapshot as it acquires and releases
+ * individual locks as it goes...
+ */
+
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ check_for_freed_segments_locked(area);
+ fprintf(stderr, "dsa_area handle %x:\n", area->control->handle);
+ fprintf(stderr, " max_total_segment_size: %zu\n",
+ area->control->max_total_segment_size);
+ fprintf(stderr, " total_segment_size: %zu\n",
+ area->control->total_segment_size);
+ fprintf(stderr, " refcnt: %d\n", area->control->refcnt);
+ fprintf(stderr, " pinned: %c\n", area->control->pinned ? 't' : 'f');
+ fprintf(stderr, " segment bins:\n");
+ for (i = 0; i < DSA_NUM_SEGMENT_BINS; ++i)
+ {
+ if (area->control->segment_bins[i] != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_index segment_index;
+
+ fprintf(stderr,
+ " segment bin %zu (at least %d contiguous pages free):\n",
+ i, 1 << (i - 1));
+ segment_index = area->control->segment_bins[i];
+ while (segment_index != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *segment_map;
+
+ segment_map =
+ get_segment_by_index(area, segment_index);
+
+ fprintf(stderr,
+ " segment index %zu, usable_pages = %zu, "
+ "contiguous_pages = %zu, mapped at %p\n",
+ segment_index,
+ segment_map->header->usable_pages,
+ fpm_largest(segment_map->fpm),
+ segment_map->mapped_address);
+ segment_index = segment_map->header->next;
+ }
+ }
+ }
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ fprintf(stderr, " pools:\n");
+ for (i = 0; i < DSA_NUM_SIZE_CLASSES; ++i)
+ {
+ bool found = false;
+
+ LWLockAcquire(DSA_SCLASS_LOCK(area, i), LW_EXCLUSIVE);
+ for (j = 0; j < DSA_FULLNESS_CLASSES; ++j)
+ if (DsaPointerIsValid(area->control->pools[i].spans[j]))
+ found = true;
+ if (found)
+ {
+ if (i == DSA_SCLASS_BLOCK_OF_SPANS)
+ fprintf(stderr, " pool for blocks of span objects:\n");
+ else if (i == DSA_SCLASS_SPAN_LARGE)
+ fprintf(stderr, " pool for large object spans:\n");
+ else
+ fprintf(stderr,
+ " pool for size class %zu (object size %hu bytes):\n",
+ i, dsa_size_classes[i]);
+ for (j = 0; j < DSA_FULLNESS_CLASSES; ++j)
+ {
+ if (!DsaPointerIsValid(area->control->pools[i].spans[j]))
+ fprintf(stderr, " fullness class %zu is empty\n", j);
+ else
+ {
+ dsa_pointer span_pointer = area->control->pools[i].spans[j];
+
+ fprintf(stderr, " fullness class %zu:\n", j);
+ while (DsaPointerIsValid(span_pointer))
+ {
+ dsa_area_span *span;
+
+ span = dsa_get_address(area, span_pointer);
+ fprintf(stderr,
+ " span descriptor at "
+ DSA_POINTER_FORMAT ", superblock at "
+ DSA_POINTER_FORMAT
+ ", pages = %zu, objects free = %hu/%hu\n",
+ span_pointer, span->start, span->npages,
+ span->nallocatable, span->nmax);
+ span_pointer = span->nextspan;
+ }
+ }
+ }
+ }
+ LWLockRelease(DSA_SCLASS_LOCK(area, i));
+ }
+}
+
+/*
+ * Return the smallest size that you can successfully provide to
+ * dsa_create_in_place.
+ */
+size_t
+dsa_minimum_size(void)
+{
+ size_t size;
+ int pages = 0;
+
+ size = MAXALIGN(sizeof(dsa_area_control)) +
+ MAXALIGN(sizeof(FreePageManager));
+
+ /* Figure out how many pages we need, including the page map... */
+ while (((size + FPM_PAGE_SIZE - 1) / FPM_PAGE_SIZE) > pages)
+ {
+ ++pages;
+ size += sizeof(dsa_pointer);
+ }
+
+ return pages * FPM_PAGE_SIZE;
+}
+
+/*
+ * Workhorse function for dsa_create and dsa_create_in_place.
+ */
+static dsa_area *
+create_internal(void *place, size_t size,
+ int tranche_id,
+ dsm_handle control_handle,
+ dsm_segment *control_segment)
+{
+ dsa_area_control *control;
+ dsa_area *area;
+ dsa_segment_map *segment_map;
+ size_t usable_pages;
+ size_t total_pages;
+ size_t metadata_bytes;
+ int i;
+
+ /* Sanity check on the space we have to work in. */
+ if (size < dsa_minimum_size())
+ elog(ERROR, "dsa_area space must be at least %zu, but %zu provided",
+ dsa_minimum_size(), size);
+
+ /* Now figure out how much space is usable */
+ total_pages = size / FPM_PAGE_SIZE;
+ metadata_bytes =
+ MAXALIGN(sizeof(dsa_area_control)) +
+ MAXALIGN(sizeof(FreePageManager)) +
+ total_pages * sizeof(dsa_pointer);
+ /* Add padding up to next page boundary. */
+ if (metadata_bytes % FPM_PAGE_SIZE != 0)
+ metadata_bytes += FPM_PAGE_SIZE - (metadata_bytes % FPM_PAGE_SIZE);
+ Assert(metadata_bytes <= size);
+ usable_pages = (size - metadata_bytes) / FPM_PAGE_SIZE;
+
+ /*
+ * Initialize the dsa_area_control object located at the start of the
+ * space.
+ */
+ control = (dsa_area_control *) place;
+ memset(place, 0, sizeof(*control));
+ control->segment_header.magic =
+ DSA_SEGMENT_HEADER_MAGIC ^ control_handle ^ 0;
+ control->segment_header.next = DSA_SEGMENT_INDEX_NONE;
+ control->segment_header.prev = DSA_SEGMENT_INDEX_NONE;
+ control->segment_header.usable_pages = usable_pages;
+ control->segment_header.freed = false;
+ control->segment_header.size = DSA_INITIAL_SEGMENT_SIZE;
+ control->handle = control_handle;
+ control->max_total_segment_size = (size_t) -1;
+ control->total_segment_size = size;
+ control->segment_handles[0] = control_handle;
+ for (i = 0; i < DSA_NUM_SEGMENT_BINS; ++i)
+ control->segment_bins[i] = DSA_SEGMENT_INDEX_NONE;
+ control->refcnt = 1;
+ control->lwlock_tranche_id = tranche_id;
+
+ /*
+ * Create the dsa_area object that this backend will use to access the
+ * area. Other backends will need to obtain their own dsa_area object by
+ * attaching.
+ */
+ area = palloc(sizeof(dsa_area));
+ area->control = control;
+ area->mapping_pinned = false;
+ memset(area->segment_maps, 0, sizeof(dsa_segment_map) * DSA_MAX_SEGMENTS);
+ area->high_segment_index = 0;
+ area->freed_segment_counter = 0;
+ LWLockInitialize(&control->lock, control->lwlock_tranche_id);
+ for (i = 0; i < DSA_NUM_SIZE_CLASSES; ++i)
+ LWLockInitialize(DSA_SCLASS_LOCK(area, i),
+ control->lwlock_tranche_id);
+
+ /* Set up the segment map for this process's mapping. */
+ segment_map = &area->segment_maps[0];
+ segment_map->segment = control_segment;
+ segment_map->mapped_address = place;
+ segment_map->header = (dsa_segment_header *) place;
+ segment_map->fpm = (FreePageManager *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_area_control)));
+ segment_map->pagemap = (dsa_pointer *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_area_control)) +
+ MAXALIGN(sizeof(FreePageManager)));
+
+ /* Set up the free page map. */
+ FreePageManagerInitialize(segment_map->fpm, segment_map->mapped_address);
+ /* There can be 0 usable pages if size is dsa_minimum_size(). */
+
+ if (usable_pages > 0)
+ FreePageManagerPut(segment_map->fpm, metadata_bytes / FPM_PAGE_SIZE,
+ usable_pages);
+
+ /* Put this segment into the appropriate bin. */
+ control->segment_bins[contiguous_pages_to_segment_bin(usable_pages)] = 0;
+ segment_map->header->bin = contiguous_pages_to_segment_bin(usable_pages);
+
+ return area;
+}
+
+/*
+ * Workhorse function for dsa_attach and dsa_attach_in_place.
+ */
+static dsa_area *
+attach_internal(void *place, dsm_segment *segment, dsa_handle handle)
+{
+ dsa_area_control *control;
+ dsa_area *area;
+ dsa_segment_map *segment_map;
+
+ control = (dsa_area_control *) place;
+ Assert(control->handle == handle);
+ Assert(control->segment_handles[0] == handle);
+ Assert(control->segment_header.magic ==
+ (DSA_SEGMENT_HEADER_MAGIC ^ handle ^ 0));
+
+ /* Build the backend-local area object. */
+ area = palloc(sizeof(dsa_area));
+ area->control = control;
+ area->mapping_pinned = false;
+ memset(&area->segment_maps[0], 0,
+ sizeof(dsa_segment_map) * DSA_MAX_SEGMENTS);
+ area->high_segment_index = 0;
+
+ /* Set up the segment map for this process's mapping. */
+ segment_map = &area->segment_maps[0];
+ segment_map->segment = segment; /* NULL for in-place */
+ segment_map->mapped_address = place;
+ segment_map->header = (dsa_segment_header *) segment_map->mapped_address;
+ segment_map->fpm = (FreePageManager *)
+ (segment_map->mapped_address + MAXALIGN(sizeof(dsa_area_control)));
+ segment_map->pagemap = (dsa_pointer *)
+ (segment_map->mapped_address + MAXALIGN(sizeof(dsa_area_control)) +
+ MAXALIGN(sizeof(FreePageManager)));
+
+ /* Bump the reference count. */
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ if (control->refcnt == 0)
+ {
+ /* We can't attach to a DSA area that has already been destroyed. */
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("could not attach to dynamic shared area")));
+ }
+ ++control->refcnt;
+ area->freed_segment_counter = area->control->freed_segment_counter;
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ return area;
+}
+
+/*
+ * Add a new span to fullness class 1 of the indicated pool.
+ */
+static void
+init_span(dsa_area *area,
+ dsa_pointer span_pointer,
+ dsa_area_pool *pool, dsa_pointer start, size_t npages,
+ uint16 size_class)
+{
+ dsa_area_span *span = dsa_get_address(area, span_pointer);
+ size_t obsize = dsa_size_classes[size_class];
+
+ /*
+ * The per-pool lock must be held because we manipulate the span list for
+ * this pool.
+ */
+ Assert(LWLockHeldByMe(DSA_SCLASS_LOCK(area, size_class)));
+
+ /* Push this span onto the front of the span list for fullness class 1. */
+ if (DsaPointerIsValid(pool->spans[1]))
+ {
+ dsa_area_span *head = (dsa_area_span *)
+ dsa_get_address(area, pool->spans[1]);
+
+ head->prevspan = span_pointer;
+ }
+ span->pool = DsaAreaPoolToDsaPointer(area, pool);
+ span->nextspan = pool->spans[1];
+ span->prevspan = InvalidDsaPointer;
+ pool->spans[1] = span_pointer;
+
+ span->start = start;
+ span->npages = npages;
+ span->size_class = size_class;
+ span->ninitialized = 0;
+ if (size_class == DSA_SCLASS_BLOCK_OF_SPANS)
+ {
+ /*
+ * A block-of-spans contains its own descriptor, so mark one object as
+ * initialized and reduce the count of allocatable objects by one.
+ * Doing this here has the side effect of also reducing nmax by one,
+ * which is important to make sure we free this object at the correct
+ * time.
+ */
+ span->ninitialized = 1;
+ span->nallocatable = FPM_PAGE_SIZE / obsize - 1;
+ }
+ else if (size_class != DSA_SCLASS_SPAN_LARGE)
+ span->nallocatable = DSA_SUPERBLOCK_SIZE / obsize;
+ span->firstfree = DSA_SPAN_NOTHING_FREE;
+ span->nmax = span->nallocatable;
+ span->fclass = 1;
+}
+
+/*
+ * Transfer the first span in one fullness class to the head of another
+ * fullness class.
+ */
+static bool
+transfer_first_span(dsa_area *area,
+ dsa_area_pool *pool, int fromclass, int toclass)
+{
+ dsa_pointer span_pointer;
+ dsa_area_span *span;
+ dsa_area_span *nextspan;
+
+ /* Can't do it if source list is empty. */
+ span_pointer = pool->spans[fromclass];
+ if (!DsaPointerIsValid(span_pointer))
+ return false;
+
+ /* Remove span from head of source list. */
+ span = dsa_get_address(area, span_pointer);
+ pool->spans[fromclass] = span->nextspan;
+ if (DsaPointerIsValid(span->nextspan))
+ {
+ nextspan = (dsa_area_span *)
+ dsa_get_address(area, span->nextspan);
+ nextspan->prevspan = InvalidDsaPointer;
+ }
+
+ /* Add span to head of target list. */
+ span->nextspan = pool->spans[toclass];
+ pool->spans[toclass] = span_pointer;
+ if (DsaPointerIsValid(span->nextspan))
+ {
+ nextspan = (dsa_area_span *)
+ dsa_get_address(area, span->nextspan);
+ nextspan->prevspan = span_pointer;
+ }
+ span->fclass = toclass;
+
+ return true;
+}
+
+/*
+ * Allocate one object of the requested size class from the given area.
+ */
+static inline dsa_pointer
+alloc_object(dsa_area *area, int size_class)
+{
+ dsa_area_pool *pool = &area->control->pools[size_class];
+ dsa_area_span *span;
+ dsa_pointer block;
+ dsa_pointer result;
+ char *object;
+ size_t size;
+
+ /*
+ * Even though ensure_active_superblock can in turn call alloc_object if
+ * it needs to allocate a new span, that's always from a different pool,
+ * and the order of lock acquisition is always the same, so it's OK that
+ * we hold this lock for the duration of this function.
+ */
+ Assert(!LWLockHeldByMe(DSA_SCLASS_LOCK(area, size_class)));
+ LWLockAcquire(DSA_SCLASS_LOCK(area, size_class), LW_EXCLUSIVE);
+
+ /*
+ * If there's no active superblock, we must successfully obtain one or
+ * fail the request.
+ */
+ if (!DsaPointerIsValid(pool->spans[1]) &&
+ !ensure_active_superblock(area, pool, size_class))
+ {
+ result = InvalidDsaPointer;
+ }
+ else
+ {
+ /*
+ * There should be a block in fullness class 1 at this point, and it
+ * should never be completely full. Thus we can either pop an object
+ * from the free list or, failing that, initialize a new object.
+ */
+ Assert(DsaPointerIsValid(pool->spans[1]));
+ span = (dsa_area_span *)
+ dsa_get_address(area, pool->spans[1]);
+ Assert(span->nallocatable > 0);
+ block = span->start;
+ Assert(size_class < DSA_NUM_SIZE_CLASSES);
+ size = dsa_size_classes[size_class];
+ if (span->firstfree != DSA_SPAN_NOTHING_FREE)
+ {
+ result = block + span->firstfree * size;
+ object = dsa_get_address(area, result);
+ span->firstfree = NextFreeObjectIndex(object);
+ }
+ else
+ {
+ result = block + span->ninitialized * size;
+ ++span->ninitialized;
+ }
+ --span->nallocatable;
+
+ /* If it's now full, move it to the highest-numbered fullness class. */
+ if (span->nallocatable == 0)
+ transfer_first_span(area, pool, 1, DSA_FULLNESS_CLASSES - 1);
+ }
+
+ Assert(LWLockHeldByMe(DSA_SCLASS_LOCK(area, size_class)));
+ LWLockRelease(DSA_SCLASS_LOCK(area, size_class));
+
+ return result;
+}
+
+/*
+ * Ensure an active (i.e. fullness class 1) superblock, unless all existing
+ * superblocks are completely full and no more can be allocated.
+ *
+ * Fullness classes K of 0..N are loosely intended to represent blocks whose
+ * utilization percentage is at least K/N, but we only enforce this rigorously
+ * for the highest-numbered fullness class, which always contains exactly
+ * those blocks that are completely full. It's otherwise acceptable for a
+ * block to be in a higher-numbered fullness class than the one to which it
+ * logically belongs. In addition, the active block, which is always the
+ * first block in fullness class 1, is permitted to have a higher allocation
+ * percentage than would normally be allowable for that fullness class; we
+ * don't move it until it's completely full, and then it goes to the
+ * highest-numbered fullness class.
+ *
+ * It might seem odd that the active block is the head of fullness class 1
+ * rather than fullness class 0, but experience with other allocators has
+ * shown that it's usually better to allocate from a block that's moderately
+ * full rather than one that's nearly empty. Insofar as is reasonably
+ * possible, we want to avoid performing new allocations in a block that would
+ * otherwise become empty soon.
+ */
+static bool
+ensure_active_superblock(dsa_area *area, dsa_area_pool *pool,
+ int size_class)
+{
+ dsa_pointer span_pointer;
+ dsa_pointer start_pointer;
+ size_t obsize = dsa_size_classes[size_class];
+ size_t nmax;
+ int fclass;
+ size_t npages = 1;
+ size_t first_page;
+ size_t i;
+ dsa_segment_map *segment_map;
+
+ Assert(LWLockHeldByMe(DSA_SCLASS_LOCK(area, size_class)));
+
+ /*
+ * Compute the number of objects that will fit in a block of this size
+ * class. Span-of-spans blocks are just a single page, and the first
+ * object isn't available for use because it describes the block-of-spans
+ * itself.
+ */
+ if (size_class == DSA_SCLASS_BLOCK_OF_SPANS)
+ nmax = FPM_PAGE_SIZE / obsize - 1;
+ else
+ nmax = DSA_SUPERBLOCK_SIZE / obsize;
+
+ /*
+ * If fullness class 1 is empty, try to find a span to put in it by
+ * scanning higher-numbered fullness classes (excluding the last one,
+ * whose blocks are certain to all be completely full).
+ */
+ for (fclass = 2; fclass < DSA_FULLNESS_CLASSES - 1; ++fclass)
+ {
+ span_pointer = pool->spans[fclass];
+
+ while (DsaPointerIsValid(span_pointer))
+ {
+ int tfclass;
+ dsa_area_span *span;
+ dsa_area_span *nextspan;
+ dsa_area_span *prevspan;
+ dsa_pointer next_span_pointer;
+
+ span = (dsa_area_span *)
+ dsa_get_address(area, span_pointer);
+ next_span_pointer = span->nextspan;
+
+ /* Figure out what fullness class should contain this span. */
+ tfclass = (nmax - span->nallocatable)
+ * (DSA_FULLNESS_CLASSES - 1) / nmax;
+
+ /* Look up next span. */
+ if (DsaPointerIsValid(span->nextspan))
+ nextspan = (dsa_area_span *)
+ dsa_get_address(area, span->nextspan);
+ else
+ nextspan = NULL;
+
+ /*
+ * If utilization has dropped enough that this now belongs in some
+ * other fullness class, move it there.
+ */
+ if (tfclass < fclass)
+ {
+ /* Remove from the current fullness class list. */
+ if (pool->spans[fclass] == span_pointer)
+ {
+ /* It was the head; remove it. */
+ Assert(!DsaPointerIsValid(span->prevspan));
+ pool->spans[fclass] = span->nextspan;
+ if (nextspan != NULL)
+ nextspan->prevspan = InvalidDsaPointer;
+ }
+ else
+ {
+ /* It was not the head. */
+ Assert(DsaPointerIsValid(span->prevspan));
+ prevspan = (dsa_area_span *)
+ dsa_get_address(area, span->prevspan);
+ prevspan->nextspan = span->nextspan;
+ }
+ if (nextspan != NULL)
+ nextspan->prevspan = span->prevspan;
+
+ /* Push onto the head of the new fullness class list. */
+ span->nextspan = pool->spans[tfclass];
+ pool->spans[tfclass] = span_pointer;
+ span->prevspan = InvalidDsaPointer;
+ if (DsaPointerIsValid(span->nextspan))
+ {
+ nextspan = (dsa_area_span *)
+ dsa_get_address(area, span->nextspan);
+ nextspan->prevspan = span_pointer;
+ }
+ span->fclass = tfclass;
+ }
+
+ /* Advance to next span on list. */
+ span_pointer = next_span_pointer;
+ }
+
+ /* Stop now if we found a suitable block. */
+ if (DsaPointerIsValid(pool->spans[1]))
+ return true;
+ }
+
+ /*
+ * If there are no blocks that properly belong in fullness class 1, pick
+ * one from some other fullness class and move it there anyway, so that we
+ * have an allocation target. Our last choice is to transfer a block
+ * that's almost empty (and might become completely empty soon if left
+ * alone), but even that is better than failing, which is what we must do
+ * if there are no blocks at all with freespace.
+ */
+ Assert(!DsaPointerIsValid(pool->spans[1]));
+ for (fclass = 2; fclass < DSA_FULLNESS_CLASSES - 1; ++fclass)
+ if (transfer_first_span(area, pool, fclass, 1))
+ return true;
+ if (!DsaPointerIsValid(pool->spans[1]) &&
+ transfer_first_span(area, pool, 0, 1))
+ return true;
+
+ /*
+ * We failed to find an existing span with free objects, so we need to
+ * allocate a new superblock and construct a new span to manage it.
+ *
+ * First, get a dsa_area_span object to describe the new superblock block
+ * ... unless this allocation is for a dsa_area_span object, in which case
+ * that's surely not going to work. We handle that case by storing the
+ * span describing a block-of-spans inline.
+ */
+ if (size_class != DSA_SCLASS_BLOCK_OF_SPANS)
+ {
+ span_pointer = alloc_object(area, DSA_SCLASS_BLOCK_OF_SPANS);
+ if (!DsaPointerIsValid(span_pointer))
+ return false;
+ npages = DSA_PAGES_PER_SUPERBLOCK;
+ }
+
+ /* Find or create a segment and allocate the superblock. */
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ segment_map = get_best_segment(area, npages);
+ if (segment_map == NULL)
+ {
+ segment_map = make_new_segment(area, npages);
+ if (segment_map == NULL)
+ {
+ LWLockRelease(DSA_AREA_LOCK(area));
+ return false;
+ }
+ }
+
+ /*
+ * This shouldn't happen: get_best_segment() or make_new_segment()
+ * promised that we can successfully allocate npages.
+ */
+ if (!FreePageManagerGet(segment_map->fpm, npages, &first_page))
+ elog(FATAL,
+ "dsa_allocate could not find %zu free pages for superblock",
+ npages);
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ /* Compute the start of the superblock. */
+ start_pointer =
+ DSA_MAKE_POINTER(get_segment_index(area, segment_map),
+ first_page * FPM_PAGE_SIZE);
+
+ /*
+ * If this is a block-of-spans, carve the descriptor right out of the
+ * allocated space.
+ */
+ if (size_class == DSA_SCLASS_BLOCK_OF_SPANS)
+ {
+ /*
+ * We have a pointer into the segment. We need to build a dsa_pointer
+ * from the segment index and offset into the segment.
+ */
+ span_pointer = start_pointer;
+ }
+
+ /* Initialize span and pagemap. */
+ init_span(area, span_pointer, pool, start_pointer, npages, size_class);
+ for (i = 0; i < npages; ++i)
+ segment_map->pagemap[first_page + i] = span_pointer;
+
+ return true;
+}
+
+/*
+ * Return the segment map corresponding to a given segment index, mapping the
+ * segment in if necessary. For internal segment book-keeping, this is called
+ * with the area lock held. It is also called by dsa_free and dsa_get_address
+ * without any locking, relying on the fact they have a known live segment
+ * index and they always call check_for_freed_segments to ensures that any
+ * freed segment occupying the same slot is detached first.
+ */
+static dsa_segment_map *
+get_segment_by_index(dsa_area *area, dsa_segment_index index)
+{
+ if (unlikely(area->segment_maps[index].mapped_address == NULL))
+ {
+ dsm_handle handle;
+ dsm_segment *segment;
+ dsa_segment_map *segment_map;
+
+ /*
+ * If we are reached by dsa_free or dsa_get_address, there must be at
+ * least one object allocated in the referenced segment. Otherwise,
+ * their caller has a double-free or access-after-free bug, which we
+ * have no hope of detecting. So we know it's safe to access this
+ * array slot without holding a lock; it won't change underneath us.
+ * Furthermore, we know that we can see the latest contents of the
+ * slot, as explained in check_for_freed_segments, which those
+ * functions call before arriving here.
+ */
+ handle = area->control->segment_handles[index];
+
+ /* It's an error to try to access an unused slot. */
+ if (handle == DSM_HANDLE_INVALID)
+ elog(ERROR,
+ "dsa_area could not attach to a segment that has been freed");
+
+ segment = dsm_attach(handle);
+ if (segment == NULL)
+ elog(ERROR, "dsa_area could not attach to segment");
+ if (area->mapping_pinned)
+ dsm_pin_mapping(segment);
+ segment_map = &area->segment_maps[index];
+ segment_map->segment = segment;
+ segment_map->mapped_address = dsm_segment_address(segment);
+ segment_map->header =
+ (dsa_segment_header *) segment_map->mapped_address;
+ segment_map->fpm = (FreePageManager *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_segment_header)));
+ segment_map->pagemap = (dsa_pointer *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_segment_header)) +
+ MAXALIGN(sizeof(FreePageManager)));
+
+ /* Remember the highest index this backend has ever mapped. */
+ if (area->high_segment_index < index)
+ area->high_segment_index = index;
+
+ Assert(segment_map->header->magic ==
+ (DSA_SEGMENT_HEADER_MAGIC ^ area->control->handle ^ index));
+ }
+
+ /*
+ * Callers of dsa_get_address() and dsa_free() don't hold the area lock,
+ * but it's a bug in the calling code and undefined behavior if the
+ * address is not live (ie if the segment might possibly have been freed,
+ * they're trying to use a dangling pointer).
+ *
+ * For dsa.c code that holds the area lock to manipulate segment_bins
+ * lists, it would be a bug if we ever reach a freed segment here. After
+ * it's marked as freed, the only thing any backend should do with it is
+ * unmap it, and it should always have done that in
+ * check_for_freed_segments_locked() before arriving here to resolve an
+ * index to a segment_map.
+ *
+ * Either way we can assert that we aren't returning a freed segment.
+ */
+ Assert(!area->segment_maps[index].header->freed);
+
+ return &area->segment_maps[index];
+}
+
+/*
+ * Return a superblock to the free page manager. If the underlying segment
+ * has become entirely free, then return it to the operating system.
+ *
+ * The appropriate pool lock must be held.
+ */
+static void
+destroy_superblock(dsa_area *area, dsa_pointer span_pointer)
+{
+ dsa_area_span *span = dsa_get_address(area, span_pointer);
+ int size_class = span->size_class;
+ dsa_segment_map *segment_map;
+
+
+ /* Remove it from its fullness class list. */
+ unlink_span(area, span);
+
+ /*
+ * Note: Here we acquire the area lock while we already hold a per-pool
+ * lock. We never hold the area lock and then take a pool lock, or we
+ * could deadlock.
+ */
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ check_for_freed_segments_locked(area);
+ segment_map =
+ get_segment_by_index(area, DSA_EXTRACT_SEGMENT_NUMBER(span->start));
+ FreePageManagerPut(segment_map->fpm,
+ DSA_EXTRACT_OFFSET(span->start) / FPM_PAGE_SIZE,
+ span->npages);
+ /* Check if the segment is now entirely free. */
+ if (fpm_largest(segment_map->fpm) == segment_map->header->usable_pages)
+ {
+ dsa_segment_index index = get_segment_index(area, segment_map);
+
+ /* If it's not the segment with extra control data, free it. */
+ if (index != 0)
+ {
+ /*
+ * Give it back to the OS, and allow other backends to detect that
+ * they need to detach.
+ */
+ unlink_segment(area, segment_map);
+ segment_map->header->freed = true;
+ Assert(area->control->total_segment_size >=
+ segment_map->header->size);
+ area->control->total_segment_size -=
+ segment_map->header->size;
+ dsm_unpin_segment(dsm_segment_handle(segment_map->segment));
+ dsm_detach(segment_map->segment);
+ area->control->segment_handles[index] = DSM_HANDLE_INVALID;
+ ++area->control->freed_segment_counter;
+ segment_map->segment = NULL;
+ segment_map->header = NULL;
+ segment_map->mapped_address = NULL;
+ }
+ }
+
+ /* Move segment to appropriate bin if necessary. */
+ if (segment_map->header != NULL)
+ rebin_segment(area, segment_map);
+
+ LWLockRelease(DSA_AREA_LOCK(area));
+
+ /*
+ * Span-of-spans blocks store the span which describes them within the
+ * block itself, so freeing the storage implicitly frees the descriptor
+ * also. If this is a block of any other type, we need to separately free
+ * the span object also. This recursive call to dsa_free will acquire the
+ * span pool's lock. We can't deadlock because the acquisition order is
+ * always some other pool and then the span pool.
+ */
+ if (size_class != DSA_SCLASS_BLOCK_OF_SPANS)
+ dsa_free(area, span_pointer);
+}
+
+static void
+unlink_span(dsa_area *area, dsa_area_span *span)
+{
+ if (DsaPointerIsValid(span->nextspan))
+ {
+ dsa_area_span *next = dsa_get_address(area, span->nextspan);
+
+ next->prevspan = span->prevspan;
+ }
+ if (DsaPointerIsValid(span->prevspan))
+ {
+ dsa_area_span *prev = dsa_get_address(area, span->prevspan);
+
+ prev->nextspan = span->nextspan;
+ }
+ else
+ {
+ dsa_area_pool *pool = dsa_get_address(area, span->pool);
+
+ pool->spans[span->fclass] = span->nextspan;
+ }
+}
+
+static void
+add_span_to_fullness_class(dsa_area *area, dsa_area_span *span,
+ dsa_pointer span_pointer,
+ int fclass)
+{
+ dsa_area_pool *pool = dsa_get_address(area, span->pool);
+
+ if (DsaPointerIsValid(pool->spans[fclass]))
+ {
+ dsa_area_span *head = dsa_get_address(area,
+ pool->spans[fclass]);
+
+ head->prevspan = span_pointer;
+ }
+ span->prevspan = InvalidDsaPointer;
+ span->nextspan = pool->spans[fclass];
+ pool->spans[fclass] = span_pointer;
+ span->fclass = fclass;
+}
+
+/*
+ * Detach from an area that was either created or attached to by this process.
+ */
+void
+dsa_detach(dsa_area *area)
+{
+ int i;
+
+ /* Detach from all segments. */
+ for (i = 0; i <= area->high_segment_index; ++i)
+ if (area->segment_maps[i].segment != NULL)
+ dsm_detach(area->segment_maps[i].segment);
+
+ /*
+ * Note that 'detaching' (= detaching from DSM segments) doesn't include
+ * 'releasing' (= adjusting the reference count). It would be nice to
+ * combine these operations, but client code might never get around to
+ * calling dsa_detach because of an error path, and a detach hook on any
+ * particular segment is too late to detach other segments in the area
+ * without risking a 'leak' warning in the non-error path.
+ */
+
+ /* Free the backend-local area object. */
+ pfree(area);
+}
+
+/*
+ * Unlink a segment from the bin that contains it.
+ */
+static void
+unlink_segment(dsa_area *area, dsa_segment_map *segment_map)
+{
+ if (segment_map->header->prev != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *prev;
+
+ prev = get_segment_by_index(area, segment_map->header->prev);
+ prev->header->next = segment_map->header->next;
+ }
+ else
+ {
+ Assert(area->control->segment_bins[segment_map->header->bin] ==
+ get_segment_index(area, segment_map));
+ area->control->segment_bins[segment_map->header->bin] =
+ segment_map->header->next;
+ }
+ if (segment_map->header->next != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *next;
+
+ next = get_segment_by_index(area, segment_map->header->next);
+ next->header->prev = segment_map->header->prev;
+ }
+}
+
+/*
+ * Find a segment that could satisfy a request for 'npages' of contiguous
+ * memory, or return NULL if none can be found. This may involve attaching to
+ * segments that weren't previously attached so that we can query their free
+ * pages map.
+ */
+static dsa_segment_map *
+get_best_segment(dsa_area *area, size_t npages)
+{
+ size_t bin;
+
+ Assert(LWLockHeldByMe(DSA_AREA_LOCK(area)));
+ check_for_freed_segments_locked(area);
+
+ /*
+ * Start searching from the first bin that *might* have enough contiguous
+ * pages.
+ */
+ for (bin = contiguous_pages_to_segment_bin(npages);
+ bin < DSA_NUM_SEGMENT_BINS;
+ ++bin)
+ {
+ /*
+ * The minimum contiguous size that any segment in this bin should
+ * have. We'll re-bin if we see segments with fewer.
+ */
+ size_t threshold = (size_t) 1 << (bin - 1);
+ dsa_segment_index segment_index;
+
+ /* Search this bin for a segment with enough contiguous space. */
+ segment_index = area->control->segment_bins[bin];
+ while (segment_index != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *segment_map;
+ dsa_segment_index next_segment_index;
+ size_t contiguous_pages;
+
+ segment_map = get_segment_by_index(area, segment_index);
+ next_segment_index = segment_map->header->next;
+ contiguous_pages = fpm_largest(segment_map->fpm);
+
+ /* Not enough for the request, still enough for this bin. */
+ if (contiguous_pages >= threshold && contiguous_pages < npages)
+ {
+ segment_index = next_segment_index;
+ continue;
+ }
+
+ /* Re-bin it if it's no longer in the appropriate bin. */
+ if (contiguous_pages < threshold)
+ {
+ rebin_segment(area, segment_map);
+
+ /*
+ * But fall through to see if it's enough to satisfy this
+ * request anyway....
+ */
+ }
+
+ /* Check if we are done. */
+ if (contiguous_pages >= npages)
+ return segment_map;
+
+ /* Continue searching the same bin. */
+ segment_index = next_segment_index;
+ }
+ }
+
+ /* Not found. */
+ return NULL;
+}
+
+/*
+ * Create a new segment that can handle at least requested_pages. Returns
+ * NULL if the requested total size limit or maximum allowed number of
+ * segments would be exceeded.
+ */
+static dsa_segment_map *
+make_new_segment(dsa_area *area, size_t requested_pages)
+{
+ dsa_segment_index new_index;
+ size_t metadata_bytes;
+ size_t total_size;
+ size_t total_pages;
+ size_t usable_pages;
+ dsa_segment_map *segment_map;
+ dsm_segment *segment;
+
+ Assert(LWLockHeldByMe(DSA_AREA_LOCK(area)));
+
+ /* Find a segment slot that is not in use (linearly for now). */
+ for (new_index = 1; new_index < DSA_MAX_SEGMENTS; ++new_index)
+ {
+ if (area->control->segment_handles[new_index] == DSM_HANDLE_INVALID)
+ break;
+ }
+ if (new_index == DSA_MAX_SEGMENTS)
+ return NULL;
+
+ /*
+ * If the total size limit is already exceeded, then we exit early and
+ * avoid arithmetic wraparound in the unsigned expressions below.
+ */
+ if (area->control->total_segment_size >=
+ area->control->max_total_segment_size)
+ return NULL;
+
+ /*
+ * The size should be at least as big as requested, and at least big
+ * enough to follow a geometric series that approximately doubles the
+ * total storage each time we create a new segment. We use geometric
+ * growth because the underlying DSM system isn't designed for large
+ * numbers of segments (otherwise we might even consider just using one
+ * DSM segment for each large allocation and for each superblock, and then
+ * we wouldn't need to use FreePageManager).
+ *
+ * We decide on a total segment size first, so that we produce tidy
+ * power-of-two sized segments. This is a good property to have if we
+ * move to huge pages in the future. Then we work back to the number of
+ * pages we can fit.
+ */
+ total_size = DSA_INITIAL_SEGMENT_SIZE *
+ ((size_t) 1 << (new_index / DSA_NUM_SEGMENTS_AT_EACH_SIZE));
+ total_size = Min(total_size, DSA_MAX_SEGMENT_SIZE);
+ total_size = Min(total_size,
+ area->control->max_total_segment_size -
+ area->control->total_segment_size);
+
+ total_pages = total_size / FPM_PAGE_SIZE;
+ metadata_bytes =
+ MAXALIGN(sizeof(dsa_segment_header)) +
+ MAXALIGN(sizeof(FreePageManager)) +
+ sizeof(dsa_pointer) * total_pages;
+
+ /* Add padding up to next page boundary. */
+ if (metadata_bytes % FPM_PAGE_SIZE != 0)
+ metadata_bytes += FPM_PAGE_SIZE - (metadata_bytes % FPM_PAGE_SIZE);
+ if (total_size <= metadata_bytes)
+ return NULL;
+ usable_pages = (total_size - metadata_bytes) / FPM_PAGE_SIZE;
+ Assert(metadata_bytes + usable_pages * FPM_PAGE_SIZE <= total_size);
+
+ /* See if that is enough... */
+ if (requested_pages > usable_pages)
+ {
+ /*
+ * We'll make an odd-sized segment, working forward from the requested
+ * number of pages.
+ */
+ usable_pages = requested_pages;
+ metadata_bytes =
+ MAXALIGN(sizeof(dsa_segment_header)) +
+ MAXALIGN(sizeof(FreePageManager)) +
+ usable_pages * sizeof(dsa_pointer);
+
+ /* Add padding up to next page boundary. */
+ if (metadata_bytes % FPM_PAGE_SIZE != 0)
+ metadata_bytes += FPM_PAGE_SIZE - (metadata_bytes % FPM_PAGE_SIZE);
+ total_size = metadata_bytes + usable_pages * FPM_PAGE_SIZE;
+
+ /* Is that too large for dsa_pointer's addressing scheme? */
+ if (total_size > DSA_MAX_SEGMENT_SIZE)
+ return NULL;
+
+ /* Would that exceed the limit? */
+ if (total_size > area->control->max_total_segment_size -
+ area->control->total_segment_size)
+ return NULL;
+ }
+
+ /* Create the segment. */
+ segment = dsm_create(total_size, 0);
+ if (segment == NULL)
+ return NULL;
+ dsm_pin_segment(segment);
+ if (area->mapping_pinned)
+ dsm_pin_mapping(segment);
+
+ /* Store the handle in shared memory to be found by index. */
+ area->control->segment_handles[new_index] =
+ dsm_segment_handle(segment);
+ /* Track the highest segment index in the history of the area. */
+ if (area->control->high_segment_index < new_index)
+ area->control->high_segment_index = new_index;
+ /* Track the highest segment index this backend has ever mapped. */
+ if (area->high_segment_index < new_index)
+ area->high_segment_index = new_index;
+ /* Track total size of all segments. */
+ area->control->total_segment_size += total_size;
+ Assert(area->control->total_segment_size <=
+ area->control->max_total_segment_size);
+
+ /* Build a segment map for this segment in this backend. */
+ segment_map = &area->segment_maps[new_index];
+ segment_map->segment = segment;
+ segment_map->mapped_address = dsm_segment_address(segment);
+ segment_map->header = (dsa_segment_header *) segment_map->mapped_address;
+ segment_map->fpm = (FreePageManager *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_segment_header)));
+ segment_map->pagemap = (dsa_pointer *)
+ (segment_map->mapped_address +
+ MAXALIGN(sizeof(dsa_segment_header)) +
+ MAXALIGN(sizeof(FreePageManager)));
+
+ /* Set up the free page map. */
+ FreePageManagerInitialize(segment_map->fpm, segment_map->mapped_address);
+ FreePageManagerPut(segment_map->fpm, metadata_bytes / FPM_PAGE_SIZE,
+ usable_pages);
+
+ /* Set up the segment header and put it in the appropriate bin. */
+ segment_map->header->magic =
+ DSA_SEGMENT_HEADER_MAGIC ^ area->control->handle ^ new_index;
+ segment_map->header->usable_pages = usable_pages;
+ segment_map->header->size = total_size;
+ segment_map->header->bin = contiguous_pages_to_segment_bin(usable_pages);
+ segment_map->header->prev = DSA_SEGMENT_INDEX_NONE;
+ segment_map->header->next =
+ area->control->segment_bins[segment_map->header->bin];
+ segment_map->header->freed = false;
+ area->control->segment_bins[segment_map->header->bin] = new_index;
+ if (segment_map->header->next != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *next =
+ get_segment_by_index(area, segment_map->header->next);
+
+ Assert(next->header->bin == segment_map->header->bin);
+ next->header->prev = new_index;
+ }
+
+ return segment_map;
+}
+
+/*
+ * Check if any segments have been freed by destroy_superblock, so we can
+ * detach from them in this backend. This function is called by
+ * dsa_get_address and dsa_free to make sure that a dsa_pointer they have
+ * received can be resolved to the correct segment.
+ *
+ * The danger we want to defend against is that there could be an old segment
+ * mapped into a given slot in this backend, and the dsa_pointer they have
+ * might refer to some new segment in the same slot. So those functions must
+ * be sure to process all instructions to detach from a freed segment that had
+ * been generated by the time this process received the dsa_pointer, before
+ * they call get_segment_by_index.
+ */
+static void
+check_for_freed_segments(dsa_area *area)
+{
+ size_t freed_segment_counter;
+
+ /*
+ * Any other process that has freed a segment has incremented
+ * freed_segment_counter while holding an LWLock, and that must precede
+ * any backend creating a new segment in the same slot while holding an
+ * LWLock, and that must precede the creation of any dsa_pointer pointing
+ * into the new segment which might reach us here, and the caller must
+ * have sent the dsa_pointer to this process using appropriate memory
+ * synchronization (some kind of locking or atomic primitive or system
+ * call). So all we need to do on the reading side is ask for the load of
+ * freed_segment_counter to follow the caller's load of the dsa_pointer it
+ * has, and we can be sure to detect any segments that had been freed as
+ * of the time that the dsa_pointer reached this process.
+ */
+ pg_read_barrier();
+ freed_segment_counter = area->control->freed_segment_counter;
+ if (unlikely(area->freed_segment_counter != freed_segment_counter))
+ {
+ /* Check all currently mapped segments to find what's been freed. */
+ LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE);
+ check_for_freed_segments_locked(area);
+ LWLockRelease(DSA_AREA_LOCK(area));
+ }
+}
+
+/*
+ * Workhorse for check_for_freed_segments(), and also used directly in path
+ * where the area lock is already held. This should be called after acquiring
+ * the lock but before looking up any segment by index number, to make sure we
+ * unmap any stale segments that might have previously had the same index as a
+ * current segment.
+ */
+static void
+check_for_freed_segments_locked(dsa_area *area)
+{
+ size_t freed_segment_counter;
+ int i;
+
+ Assert(LWLockHeldByMe(DSA_AREA_LOCK(area)));
+ freed_segment_counter = area->control->freed_segment_counter;
+ if (unlikely(area->freed_segment_counter != freed_segment_counter))
+ {
+ for (i = 0; i <= area->high_segment_index; ++i)
+ {
+ if (area->segment_maps[i].header != NULL &&
+ area->segment_maps[i].header->freed)
+ {
+ dsm_detach(area->segment_maps[i].segment);
+ area->segment_maps[i].segment = NULL;
+ area->segment_maps[i].header = NULL;
+ area->segment_maps[i].mapped_address = NULL;
+ }
+ }
+ area->freed_segment_counter = freed_segment_counter;
+ }
+}
+
+/*
+ * Re-bin segment if it's no longer in the appropriate bin.
+ */
+static void
+rebin_segment(dsa_area *area, dsa_segment_map *segment_map)
+{
+ size_t new_bin;
+ dsa_segment_index segment_index;
+
+ new_bin = contiguous_pages_to_segment_bin(fpm_largest(segment_map->fpm));
+ if (segment_map->header->bin == new_bin)
+ return;
+
+ /* Remove it from its current bin. */
+ unlink_segment(area, segment_map);
+
+ /* Push it onto the front of its new bin. */
+ segment_index = get_segment_index(area, segment_map);
+ segment_map->header->prev = DSA_SEGMENT_INDEX_NONE;
+ segment_map->header->next = area->control->segment_bins[new_bin];
+ segment_map->header->bin = new_bin;
+ area->control->segment_bins[new_bin] = segment_index;
+ if (segment_map->header->next != DSA_SEGMENT_INDEX_NONE)
+ {
+ dsa_segment_map *next;
+
+ next = get_segment_by_index(area, segment_map->header->next);
+ Assert(next->header->bin == new_bin);
+ next->header->prev = segment_index;
+ }
+}
diff --git a/src/backend/utils/mmgr/freepage.c b/src/backend/utils/mmgr/freepage.c
new file mode 100644
index 0000000..dcf246f
--- /dev/null
+++ b/src/backend/utils/mmgr/freepage.c
@@ -0,0 +1,1886 @@
+/*-------------------------------------------------------------------------
+ *
+ * freepage.c
+ * Management of free memory pages.
+ *
+ * The intention of this code is to provide infrastructure for memory
+ * allocators written specifically for PostgreSQL. At least in the case
+ * of dynamic shared memory, we can't simply use malloc() or even
+ * relatively thin wrappers like palloc() which sit on top of it, because
+ * no allocator built into the operating system will deal with relative
+ * pointers. In the future, we may find other cases in which greater
+ * control over our own memory management seems desirable.
+ *
+ * A FreePageManager keeps track of which 4kB pages of memory are currently
+ * unused from the point of view of some higher-level memory allocator.
+ * Unlike a user-facing allocator such as palloc(), a FreePageManager can
+ * only allocate and free in units of whole pages, and freeing an
+ * allocation can only be done given knowledge of its length in pages.
+ *
+ * Since a free page manager has only a fixed amount of dedicated memory,
+ * and since there is no underlying allocator, it uses the free pages
+ * it is given to manage to store its bookkeeping data. It keeps multiple
+ * freelists of runs of pages, sorted by the size of the run; the head of
+ * each freelist is stored in the FreePageManager itself, and the first
+ * page of each run contains a relative pointer to the next run. See
+ * FreePageManagerGetInternal for more details on how the freelists are
+ * managed.
+ *
+ * To avoid memory fragmentation, it's important to consolidate adjacent
+ * spans of pages whenever possible; otherwise, large allocation requests
+ * might not be satisfied even when sufficient contiguous space is
+ * available. Therefore, in addition to the freelists, we maintain an
+ * in-memory btree of free page ranges ordered by page number. If a
+ * range being freed precedes or follows a range that is already free,
+ * the existing range is extended; if it exactly bridges the gap between
+ * free ranges, then the two existing ranges are consolidated with the
+ * newly-freed range to form one great big range of free pages.
+ *
+ * When there is only one range of free pages, the btree is trivial and
+ * is stored within the FreePageManager proper; otherwise, pages are
+ * allocated from the area under management as needed. Even in cases
+ * where memory fragmentation is very severe, only a tiny fraction of
+ * the pages under management are consumed by this btree.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/freepage.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "lib/stringinfo.h"
+#include "miscadmin.h"
+
+#include "utils/freepage.h"
+#include "utils/relptr.h"
+
+
+/* Magic numbers to identify various page types */
+#define FREE_PAGE_SPAN_LEADER_MAGIC 0xea4020f0
+#define FREE_PAGE_LEAF_MAGIC 0x98eae728
+#define FREE_PAGE_INTERNAL_MAGIC 0x19aa32c9
+
+/* Doubly linked list of spans of free pages; stored in first page of span. */
+struct FreePageSpanLeader
+{
+ int magic; /* always FREE_PAGE_SPAN_LEADER_MAGIC */
+ Size npages; /* number of pages in span */
+ RelptrFreePageSpanLeader prev;
+ RelptrFreePageSpanLeader next;
+};
+
+/* Common header for btree leaf and internal pages. */
+typedef struct FreePageBtreeHeader
+{
+ int magic; /* FREE_PAGE_LEAF_MAGIC or
+ * FREE_PAGE_INTERNAL_MAGIC */
+ Size nused; /* number of items used */
+ RelptrFreePageBtree parent; /* uplink */
+} FreePageBtreeHeader;
+
+/* Internal key; points to next level of btree. */
+typedef struct FreePageBtreeInternalKey
+{
+ Size first_page; /* low bound for keys on child page */
+ RelptrFreePageBtree child; /* downlink */
+} FreePageBtreeInternalKey;
+
+/* Leaf key; no payload data. */
+typedef struct FreePageBtreeLeafKey
+{
+ Size first_page; /* first page in span */
+ Size npages; /* number of pages in span */
+} FreePageBtreeLeafKey;
+
+/* Work out how many keys will fit on a page. */
+#define FPM_ITEMS_PER_INTERNAL_PAGE \
+ ((FPM_PAGE_SIZE - sizeof(FreePageBtreeHeader)) / \
+ sizeof(FreePageBtreeInternalKey))
+#define FPM_ITEMS_PER_LEAF_PAGE \
+ ((FPM_PAGE_SIZE - sizeof(FreePageBtreeHeader)) / \
+ sizeof(FreePageBtreeLeafKey))
+
+/* A btree page of either sort */
+struct FreePageBtree
+{
+ FreePageBtreeHeader hdr;
+ union
+ {
+ FreePageBtreeInternalKey internal_key[FPM_ITEMS_PER_INTERNAL_PAGE];
+ FreePageBtreeLeafKey leaf_key[FPM_ITEMS_PER_LEAF_PAGE];
+ } u;
+};
+
+/* Results of a btree search */
+typedef struct FreePageBtreeSearchResult
+{
+ FreePageBtree *page;
+ Size index;
+ bool found;
+ unsigned split_pages;
+} FreePageBtreeSearchResult;
+
+/* Helper functions */
+static void FreePageBtreeAdjustAncestorKeys(FreePageManager *fpm,
+ FreePageBtree *btp);
+static Size FreePageBtreeCleanup(FreePageManager *fpm);
+static FreePageBtree *FreePageBtreeFindLeftSibling(char *base,
+ FreePageBtree *btp);
+static FreePageBtree *FreePageBtreeFindRightSibling(char *base,
+ FreePageBtree *btp);
+static Size FreePageBtreeFirstKey(FreePageBtree *btp);
+static FreePageBtree *FreePageBtreeGetRecycled(FreePageManager *fpm);
+static void FreePageBtreeInsertInternal(char *base, FreePageBtree *btp,
+ Size index, Size first_page, FreePageBtree *child);
+static void FreePageBtreeInsertLeaf(FreePageBtree *btp, Size index,
+ Size first_page, Size npages);
+static void FreePageBtreeRecycle(FreePageManager *fpm, Size pageno);
+static void FreePageBtreeRemove(FreePageManager *fpm, FreePageBtree *btp,
+ Size index);
+static void FreePageBtreeRemovePage(FreePageManager *fpm, FreePageBtree *btp);
+static void FreePageBtreeSearch(FreePageManager *fpm, Size first_page,
+ FreePageBtreeSearchResult *result);
+static Size FreePageBtreeSearchInternal(FreePageBtree *btp, Size first_page);
+static Size FreePageBtreeSearchLeaf(FreePageBtree *btp, Size first_page);
+static FreePageBtree *FreePageBtreeSplitPage(FreePageManager *fpm,
+ FreePageBtree *btp);
+static void FreePageBtreeUpdateParentPointers(char *base, FreePageBtree *btp);
+static void FreePageManagerDumpBtree(FreePageManager *fpm, FreePageBtree *btp,
+ FreePageBtree *parent, int level, StringInfo buf);
+static void FreePageManagerDumpSpans(FreePageManager *fpm,
+ FreePageSpanLeader *span, Size expected_pages,
+ StringInfo buf);
+static bool FreePageManagerGetInternal(FreePageManager *fpm, Size npages,
+ Size *first_page);
+static Size FreePageManagerPutInternal(FreePageManager *fpm, Size first_page,
+ Size npages, bool soft);
+static void FreePagePopSpanLeader(FreePageManager *fpm, Size pageno);
+static void FreePagePushSpanLeader(FreePageManager *fpm, Size first_page,
+ Size npages);
+static Size FreePageManagerLargestContiguous(FreePageManager *fpm);
+static void FreePageManagerUpdateLargest(FreePageManager *fpm);
+
+#ifdef FPM_EXTRA_ASSERTS
+static Size sum_free_pages(FreePageManager *fpm);
+#endif
+
+/*
+ * Initialize a new, empty free page manager.
+ *
+ * 'fpm' should reference caller-provided memory large enough to contain a
+ * FreePageManager. We'll initialize it here.
+ *
+ * 'base' is the address to which all pointers are relative. When managing
+ * a dynamic shared memory segment, it should normally be the base of the
+ * segment. When managing backend-private memory, it can be either NULL or,
+ * if managing a single contiguous extent of memory, the start of that extent.
+ */
+void
+FreePageManagerInitialize(FreePageManager *fpm, char *base)
+{
+ Size f;
+
+ relptr_store(base, fpm->self, fpm);
+ relptr_store(base, fpm->btree_root, (FreePageBtree *) NULL);
+ relptr_store(base, fpm->btree_recycle, (FreePageSpanLeader *) NULL);
+ fpm->btree_depth = 0;
+ fpm->btree_recycle_count = 0;
+ fpm->singleton_first_page = 0;
+ fpm->singleton_npages = 0;
+ fpm->contiguous_pages = 0;
+ fpm->contiguous_pages_dirty = true;
+#ifdef FPM_EXTRA_ASSERTS
+ fpm->free_pages = 0;
+#endif
+
+ for (f = 0; f < FPM_NUM_FREELISTS; f++)
+ relptr_store(base, fpm->freelist[f], (FreePageSpanLeader *) NULL);
+}
+
+/*
+ * Allocate a run of pages of the given length from the free page manager.
+ * The return value indicates whether we were able to satisfy the request;
+ * if true, the first page of the allocation is stored in *first_page.
+ */
+bool
+FreePageManagerGet(FreePageManager *fpm, Size npages, Size *first_page)
+{
+ bool result;
+ Size contiguous_pages;
+
+ result = FreePageManagerGetInternal(fpm, npages, first_page);
+
+ /*
+ * It's a bit counterintuitive, but allocating pages can actually create
+ * opportunities for cleanup that create larger ranges. We might pull a
+ * key out of the btree that enables the item at the head of the btree
+ * recycle list to be inserted; and then if there are more items behind it
+ * one of those might cause two currently-separated ranges to merge,
+ * creating a single range of contiguous pages larger than any that
+ * existed previously. It might be worth trying to improve the cleanup
+ * algorithm to avoid such corner cases, but for now we just notice the
+ * condition and do the appropriate reporting.
+ */
+ contiguous_pages = FreePageBtreeCleanup(fpm);
+ if (fpm->contiguous_pages < contiguous_pages)
+ fpm->contiguous_pages = contiguous_pages;
+
+ /*
+ * FreePageManagerGetInternal may have set contiguous_pages_dirty.
+ * Recompute contiguous_pages if so.
+ */
+ FreePageManagerUpdateLargest(fpm);
+
+#ifdef FPM_EXTRA_ASSERTS
+ if (result)
+ {
+ Assert(fpm->free_pages >= npages);
+ fpm->free_pages -= npages;
+ }
+ Assert(fpm->free_pages == sum_free_pages(fpm));
+ Assert(fpm->contiguous_pages == FreePageManagerLargestContiguous(fpm));
+#endif
+ return result;
+}
+
+#ifdef FPM_EXTRA_ASSERTS
+static void
+sum_free_pages_recurse(FreePageManager *fpm, FreePageBtree *btp, Size *sum)
+{
+ char *base = fpm_segment_base(fpm);
+
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC ||
+ btp->hdr.magic == FREE_PAGE_LEAF_MAGIC);
+ ++*sum;
+ if (btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC)
+ {
+ Size index;
+
+
+ for (index = 0; index < btp->hdr.nused; ++index)
+ {
+ FreePageBtree *child;
+
+ child = relptr_access(base, btp->u.internal_key[index].child);
+ sum_free_pages_recurse(fpm, child, sum);
+ }
+ }
+}
+static Size
+sum_free_pages(FreePageManager *fpm)
+{
+ FreePageSpanLeader *recycle;
+ char *base = fpm_segment_base(fpm);
+ Size sum = 0;
+ int list;
+
+ /* Count the spans by scanning the freelists. */
+ for (list = 0; list < FPM_NUM_FREELISTS; ++list)
+ {
+
+ if (!relptr_is_null(fpm->freelist[list]))
+ {
+ FreePageSpanLeader *candidate =
+ relptr_access(base, fpm->freelist[list]);
+
+ do
+ {
+ sum += candidate->npages;
+ candidate = relptr_access(base, candidate->next);
+ } while (candidate != NULL);
+ }
+ }
+
+ /* Count btree internal pages. */
+ if (fpm->btree_depth > 0)
+ {
+ FreePageBtree *root = relptr_access(base, fpm->btree_root);
+
+ sum_free_pages_recurse(fpm, root, &sum);
+ }
+
+ /* Count the recycle list. */
+ for (recycle = relptr_access(base, fpm->btree_recycle);
+ recycle != NULL;
+ recycle = relptr_access(base, recycle->next))
+ {
+ Assert(recycle->npages == 1);
+ ++sum;
+ }
+
+ return sum;
+}
+#endif
+
+/*
+ * Compute the size of the largest run of pages that the user could
+ * successfully get.
+ */
+static Size
+FreePageManagerLargestContiguous(FreePageManager *fpm)
+{
+ char *base;
+ Size largest;
+
+ base = fpm_segment_base(fpm);
+ largest = 0;
+ if (!relptr_is_null(fpm->freelist[FPM_NUM_FREELISTS - 1]))
+ {
+ FreePageSpanLeader *candidate;
+
+ candidate = relptr_access(base, fpm->freelist[FPM_NUM_FREELISTS - 1]);
+ do
+ {
+ if (candidate->npages > largest)
+ largest = candidate->npages;
+ candidate = relptr_access(base, candidate->next);
+ } while (candidate != NULL);
+ }
+ else
+ {
+ Size f = FPM_NUM_FREELISTS - 1;
+
+ do
+ {
+ --f;
+ if (!relptr_is_null(fpm->freelist[f]))
+ {
+ largest = f + 1;
+ break;
+ }
+ } while (f > 0);
+ }
+
+ return largest;
+}
+
+/*
+ * Recompute the size of the largest run of pages that the user could
+ * successfully get, if it has been marked dirty.
+ */
+static void
+FreePageManagerUpdateLargest(FreePageManager *fpm)
+{
+ if (!fpm->contiguous_pages_dirty)
+ return;
+
+ fpm->contiguous_pages = FreePageManagerLargestContiguous(fpm);
+ fpm->contiguous_pages_dirty = false;
+}
+
+/*
+ * Transfer a run of pages to the free page manager.
+ */
+void
+FreePageManagerPut(FreePageManager *fpm, Size first_page, Size npages)
+{
+ Size contiguous_pages;
+
+ Assert(npages > 0);
+
+ /* Record the new pages. */
+ contiguous_pages =
+ FreePageManagerPutInternal(fpm, first_page, npages, false);
+
+ /*
+ * If the new range we inserted into the page manager was contiguous with
+ * an existing range, it may have opened up cleanup opportunities.
+ */
+ if (contiguous_pages > npages)
+ {
+ Size cleanup_contiguous_pages;
+
+ cleanup_contiguous_pages = FreePageBtreeCleanup(fpm);
+ if (cleanup_contiguous_pages > contiguous_pages)
+ contiguous_pages = cleanup_contiguous_pages;
+ }
+
+ /* See if we now have a new largest chunk. */
+ if (fpm->contiguous_pages < contiguous_pages)
+ fpm->contiguous_pages = contiguous_pages;
+
+ /*
+ * The earlier call to FreePageManagerPutInternal may have set
+ * contiguous_pages_dirty if it needed to allocate internal pages, so
+ * recompute contiguous_pages if necessary.
+ */
+ FreePageManagerUpdateLargest(fpm);
+
+#ifdef FPM_EXTRA_ASSERTS
+ fpm->free_pages += npages;
+ Assert(fpm->free_pages == sum_free_pages(fpm));
+ Assert(fpm->contiguous_pages == FreePageManagerLargestContiguous(fpm));
+#endif
+}
+
+/*
+ * Produce a debugging dump of the state of a free page manager.
+ */
+char *
+FreePageManagerDump(FreePageManager *fpm)
+{
+ char *base = fpm_segment_base(fpm);
+ StringInfoData buf;
+ FreePageSpanLeader *recycle;
+ bool dumped_any_freelist = false;
+ Size f;
+
+ /* Initialize output buffer. */
+ initStringInfo(&buf);
+
+ /* Dump general stuff. */
+ appendStringInfo(&buf, "metadata: self %zu max contiguous pages = %zu\n",
+ relptr_offset(fpm->self), fpm->contiguous_pages);
+
+ /* Dump btree. */
+ if (fpm->btree_depth > 0)
+ {
+ FreePageBtree *root;
+
+ appendStringInfo(&buf, "btree depth %u:\n", fpm->btree_depth);
+ root = relptr_access(base, fpm->btree_root);
+ FreePageManagerDumpBtree(fpm, root, NULL, 0, &buf);
+ }
+ else if (fpm->singleton_npages > 0)
+ {
+ appendStringInfo(&buf, "singleton: %zu(%zu)\n",
+ fpm->singleton_first_page, fpm->singleton_npages);
+ }
+
+ /* Dump btree recycle list. */
+ recycle = relptr_access(base, fpm->btree_recycle);
+ if (recycle != NULL)
+ {
+ appendStringInfoString(&buf, "btree recycle:");
+ FreePageManagerDumpSpans(fpm, recycle, 1, &buf);
+ }
+
+ /* Dump free lists. */
+ for (f = 0; f < FPM_NUM_FREELISTS; ++f)
+ {
+ FreePageSpanLeader *span;
+
+ if (relptr_is_null(fpm->freelist[f]))
+ continue;
+ if (!dumped_any_freelist)
+ {
+ appendStringInfoString(&buf, "freelists:\n");
+ dumped_any_freelist = true;
+ }
+ appendStringInfo(&buf, " %zu:", f + 1);
+ span = relptr_access(base, fpm->freelist[f]);
+ FreePageManagerDumpSpans(fpm, span, f + 1, &buf);
+ }
+
+ /* And return result to caller. */
+ return buf.data;
+}
+
+
+/*
+ * The first_page value stored at index zero in any non-root page must match
+ * the first_page value stored in its parent at the index which points to that
+ * page. So when the value stored at index zero in a btree page changes, we've
+ * got to walk up the tree adjusting ancestor keys until we reach an ancestor
+ * where that key isn't index zero. This function should be called after
+ * updating the first key on the target page; it will propagate the change
+ * upward as far as needed.
+ *
+ * We assume here that the first key on the page has not changed enough to
+ * require changes in the ordering of keys on its ancestor pages. Thus,
+ * if we search the parent page for the first key greater than or equal to
+ * the first key on the current page, the downlink to this page will be either
+ * the exact index returned by the search (if the first key decreased)
+ * or one less (if the first key increased).
+ */
+static void
+FreePageBtreeAdjustAncestorKeys(FreePageManager *fpm, FreePageBtree *btp)
+{
+ char *base = fpm_segment_base(fpm);
+ Size first_page;
+ FreePageBtree *parent;
+ FreePageBtree *child;
+
+ /* This might be either a leaf or an internal page. */
+ Assert(btp->hdr.nused > 0);
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ Assert(btp->hdr.nused <= FPM_ITEMS_PER_LEAF_PAGE);
+ first_page = btp->u.leaf_key[0].first_page;
+ }
+ else
+ {
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ Assert(btp->hdr.nused <= FPM_ITEMS_PER_INTERNAL_PAGE);
+ first_page = btp->u.internal_key[0].first_page;
+ }
+ child = btp;
+
+ /* Loop until we find an ancestor that does not require adjustment. */
+ for (;;)
+ {
+ Size s;
+
+ parent = relptr_access(base, child->hdr.parent);
+ if (parent == NULL)
+ break;
+ s = FreePageBtreeSearchInternal(parent, first_page);
+
+ /* Key is either at index s or index s-1; figure out which. */
+ if (s >= parent->hdr.nused)
+ {
+ Assert(s == parent->hdr.nused);
+ --s;
+ }
+ else
+ {
+ FreePageBtree *check;
+
+ check = relptr_access(base, parent->u.internal_key[s].child);
+ if (check != child)
+ {
+ Assert(s > 0);
+ --s;
+ }
+ }
+
+#ifdef USE_ASSERT_CHECKING
+ /* Debugging double-check. */
+ {
+ FreePageBtree *check;
+
+ check = relptr_access(base, parent->u.internal_key[s].child);
+ Assert(s < parent->hdr.nused);
+ Assert(child == check);
+ }
+#endif
+
+ /* Update the parent key. */
+ parent->u.internal_key[s].first_page = first_page;
+
+ /*
+ * If this is the first key in the parent, go up another level; else
+ * done.
+ */
+ if (s > 0)
+ break;
+ child = parent;
+ }
+}
+
+/*
+ * Attempt to reclaim space from the free-page btree. The return value is
+ * the largest range of contiguous pages created by the cleanup operation.
+ */
+static Size
+FreePageBtreeCleanup(FreePageManager *fpm)
+{
+ char *base = fpm_segment_base(fpm);
+ Size max_contiguous_pages = 0;
+
+ /* Attempt to shrink the depth of the btree. */
+ while (!relptr_is_null(fpm->btree_root))
+ {
+ FreePageBtree *root = relptr_access(base, fpm->btree_root);
+
+ /* If the root contains only one key, reduce depth by one. */
+ if (root->hdr.nused == 1)
+ {
+ /* Shrink depth of tree by one. */
+ Assert(fpm->btree_depth > 0);
+ --fpm->btree_depth;
+ if (root->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ /* If root is a leaf, convert only entry to singleton range. */
+ relptr_store(base, fpm->btree_root, (FreePageBtree *) NULL);
+ fpm->singleton_first_page = root->u.leaf_key[0].first_page;
+ fpm->singleton_npages = root->u.leaf_key[0].npages;
+ }
+ else
+ {
+ FreePageBtree *newroot;
+
+ /* If root is an internal page, make only child the root. */
+ Assert(root->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ relptr_copy(fpm->btree_root, root->u.internal_key[0].child);
+ newroot = relptr_access(base, fpm->btree_root);
+ relptr_store(base, newroot->hdr.parent, (FreePageBtree *) NULL);
+ }
+ FreePageBtreeRecycle(fpm, fpm_pointer_to_page(base, root));
+ }
+ else if (root->hdr.nused == 2 &&
+ root->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ Size end_of_first;
+ Size start_of_second;
+
+ end_of_first = root->u.leaf_key[0].first_page +
+ root->u.leaf_key[0].npages;
+ start_of_second = root->u.leaf_key[1].first_page;
+
+ if (end_of_first + 1 == start_of_second)
+ {
+ Size root_page = fpm_pointer_to_page(base, root);
+
+ if (end_of_first == root_page)
+ {
+ FreePagePopSpanLeader(fpm, root->u.leaf_key[0].first_page);
+ FreePagePopSpanLeader(fpm, root->u.leaf_key[1].first_page);
+ fpm->singleton_first_page = root->u.leaf_key[0].first_page;
+ fpm->singleton_npages = root->u.leaf_key[0].npages +
+ root->u.leaf_key[1].npages + 1;
+ fpm->btree_depth = 0;
+ relptr_store(base, fpm->btree_root,
+ (FreePageBtree *) NULL);
+ FreePagePushSpanLeader(fpm, fpm->singleton_first_page,
+ fpm->singleton_npages);
+ Assert(max_contiguous_pages == 0);
+ max_contiguous_pages = fpm->singleton_npages;
+ }
+ }
+
+ /* Whether it worked or not, it's time to stop. */
+ break;
+ }
+ else
+ {
+ /* Nothing more to do. Stop. */
+ break;
+ }
+ }
+
+ /*
+ * Attempt to free recycled btree pages. We skip this if releasing the
+ * recycled page would require a btree page split, because the page we're
+ * trying to recycle would be consumed by the split, which would be
+ * counterproductive.
+ *
+ * We also currently only ever attempt to recycle the first page on the
+ * list; that could be made more aggressive, but it's not clear that the
+ * complexity would be worthwhile.
+ */
+ while (fpm->btree_recycle_count > 0)
+ {
+ FreePageBtree *btp;
+ Size first_page;
+ Size contiguous_pages;
+
+ btp = FreePageBtreeGetRecycled(fpm);
+ first_page = fpm_pointer_to_page(base, btp);
+ contiguous_pages = FreePageManagerPutInternal(fpm, first_page, 1, true);
+ if (contiguous_pages == 0)
+ {
+ FreePageBtreeRecycle(fpm, first_page);
+ break;
+ }
+ else
+ {
+ if (contiguous_pages > max_contiguous_pages)
+ max_contiguous_pages = contiguous_pages;
+ }
+ }
+
+ return max_contiguous_pages;
+}
+
+/*
+ * Consider consolidating the given page with its left or right sibling,
+ * if it's fairly empty.
+ */
+static void
+FreePageBtreeConsolidate(FreePageManager *fpm, FreePageBtree *btp)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageBtree *np;
+ Size max;
+
+ /*
+ * We only try to consolidate pages that are less than a third full. We
+ * could be more aggressive about this, but that might risk performing
+ * consolidation only to end up splitting again shortly thereafter. Since
+ * the btree should be very small compared to the space under management,
+ * our goal isn't so much to ensure that it always occupies the absolutely
+ * smallest possible number of pages as to reclaim pages before things get
+ * too egregiously out of hand.
+ */
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ max = FPM_ITEMS_PER_LEAF_PAGE;
+ else
+ {
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ max = FPM_ITEMS_PER_INTERNAL_PAGE;
+ }
+ if (btp->hdr.nused >= max / 3)
+ return;
+
+ /*
+ * If we can fit our right sibling's keys onto this page, consolidate.
+ */
+ np = FreePageBtreeFindRightSibling(base, btp);
+ if (np != NULL && btp->hdr.nused + np->hdr.nused <= max)
+ {
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ memcpy(&btp->u.leaf_key[btp->hdr.nused], &np->u.leaf_key[0],
+ sizeof(FreePageBtreeLeafKey) * np->hdr.nused);
+ btp->hdr.nused += np->hdr.nused;
+ }
+ else
+ {
+ memcpy(&btp->u.internal_key[btp->hdr.nused], &np->u.internal_key[0],
+ sizeof(FreePageBtreeInternalKey) * np->hdr.nused);
+ btp->hdr.nused += np->hdr.nused;
+ FreePageBtreeUpdateParentPointers(base, btp);
+ }
+ FreePageBtreeRemovePage(fpm, np);
+ return;
+ }
+
+ /*
+ * If we can fit our keys onto our left sibling's page, consolidate. In
+ * this case, we move our keys onto the other page rather than vice versa,
+ * to avoid having to adjust ancestor keys.
+ */
+ np = FreePageBtreeFindLeftSibling(base, btp);
+ if (np != NULL && btp->hdr.nused + np->hdr.nused <= max)
+ {
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ memcpy(&np->u.leaf_key[np->hdr.nused], &btp->u.leaf_key[0],
+ sizeof(FreePageBtreeLeafKey) * btp->hdr.nused);
+ np->hdr.nused += btp->hdr.nused;
+ }
+ else
+ {
+ memcpy(&np->u.internal_key[np->hdr.nused], &btp->u.internal_key[0],
+ sizeof(FreePageBtreeInternalKey) * btp->hdr.nused);
+ np->hdr.nused += btp->hdr.nused;
+ FreePageBtreeUpdateParentPointers(base, np);
+ }
+ FreePageBtreeRemovePage(fpm, btp);
+ return;
+ }
+}
+
+/*
+ * Find the passed page's left sibling; that is, the page at the same level
+ * of the tree whose keyspace immediately precedes ours.
+ */
+static FreePageBtree *
+FreePageBtreeFindLeftSibling(char *base, FreePageBtree *btp)
+{
+ FreePageBtree *p = btp;
+ int levels = 0;
+
+ /* Move up until we can move left. */
+ for (;;)
+ {
+ Size first_page;
+ Size index;
+
+ first_page = FreePageBtreeFirstKey(p);
+ p = relptr_access(base, p->hdr.parent);
+
+ if (p == NULL)
+ return NULL; /* we were passed the rightmost page */
+
+ index = FreePageBtreeSearchInternal(p, first_page);
+ if (index > 0)
+ {
+ Assert(p->u.internal_key[index].first_page == first_page);
+ p = relptr_access(base, p->u.internal_key[index - 1].child);
+ break;
+ }
+ Assert(index == 0);
+ ++levels;
+ }
+
+ /* Descend left. */
+ while (levels > 0)
+ {
+ Assert(p->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ p = relptr_access(base, p->u.internal_key[p->hdr.nused - 1].child);
+ --levels;
+ }
+ Assert(p->hdr.magic == btp->hdr.magic);
+
+ return p;
+}
+
+/*
+ * Find the passed page's right sibling; that is, the page at the same level
+ * of the tree whose keyspace immediately follows ours.
+ */
+static FreePageBtree *
+FreePageBtreeFindRightSibling(char *base, FreePageBtree *btp)
+{
+ FreePageBtree *p = btp;
+ int levels = 0;
+
+ /* Move up until we can move right. */
+ for (;;)
+ {
+ Size first_page;
+ Size index;
+
+ first_page = FreePageBtreeFirstKey(p);
+ p = relptr_access(base, p->hdr.parent);
+
+ if (p == NULL)
+ return NULL; /* we were passed the rightmost page */
+
+ index = FreePageBtreeSearchInternal(p, first_page);
+ if (index < p->hdr.nused - 1)
+ {
+ Assert(p->u.internal_key[index].first_page == first_page);
+ p = relptr_access(base, p->u.internal_key[index + 1].child);
+ break;
+ }
+ Assert(index == p->hdr.nused - 1);
+ ++levels;
+ }
+
+ /* Descend left. */
+ while (levels > 0)
+ {
+ Assert(p->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ p = relptr_access(base, p->u.internal_key[0].child);
+ --levels;
+ }
+ Assert(p->hdr.magic == btp->hdr.magic);
+
+ return p;
+}
+
+/*
+ * Get the first key on a btree page.
+ */
+static Size
+FreePageBtreeFirstKey(FreePageBtree *btp)
+{
+ Assert(btp->hdr.nused > 0);
+
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ return btp->u.leaf_key[0].first_page;
+ else
+ {
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ return btp->u.internal_key[0].first_page;
+ }
+}
+
+/*
+ * Get a page from the btree recycle list for use as a btree page.
+ */
+static FreePageBtree *
+FreePageBtreeGetRecycled(FreePageManager *fpm)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageSpanLeader *victim = relptr_access(base, fpm->btree_recycle);
+ FreePageSpanLeader *newhead;
+
+ Assert(victim != NULL);
+ newhead = relptr_access(base, victim->next);
+ if (newhead != NULL)
+ relptr_copy(newhead->prev, victim->prev);
+ relptr_store(base, fpm->btree_recycle, newhead);
+ Assert(fpm_pointer_is_page_aligned(base, victim));
+ fpm->btree_recycle_count--;
+ return (FreePageBtree *) victim;
+}
+
+/*
+ * Insert an item into an internal page.
+ */
+static void
+FreePageBtreeInsertInternal(char *base, FreePageBtree *btp, Size index,
+ Size first_page, FreePageBtree *child)
+{
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ Assert(btp->hdr.nused <= FPM_ITEMS_PER_INTERNAL_PAGE);
+ Assert(index <= btp->hdr.nused);
+ memmove(&btp->u.internal_key[index + 1], &btp->u.internal_key[index],
+ sizeof(FreePageBtreeInternalKey) * (btp->hdr.nused - index));
+ btp->u.internal_key[index].first_page = first_page;
+ relptr_store(base, btp->u.internal_key[index].child, child);
+ ++btp->hdr.nused;
+}
+
+/*
+ * Insert an item into a leaf page.
+ */
+static void
+FreePageBtreeInsertLeaf(FreePageBtree *btp, Size index, Size first_page,
+ Size npages)
+{
+ Assert(btp->hdr.magic == FREE_PAGE_LEAF_MAGIC);
+ Assert(btp->hdr.nused <= FPM_ITEMS_PER_LEAF_PAGE);
+ Assert(index <= btp->hdr.nused);
+ memmove(&btp->u.leaf_key[index + 1], &btp->u.leaf_key[index],
+ sizeof(FreePageBtreeLeafKey) * (btp->hdr.nused - index));
+ btp->u.leaf_key[index].first_page = first_page;
+ btp->u.leaf_key[index].npages = npages;
+ ++btp->hdr.nused;
+}
+
+/*
+ * Put a page on the btree recycle list.
+ */
+static void
+FreePageBtreeRecycle(FreePageManager *fpm, Size pageno)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageSpanLeader *head = relptr_access(base, fpm->btree_recycle);
+ FreePageSpanLeader *span;
+
+ span = (FreePageSpanLeader *) fpm_page_to_pointer(base, pageno);
+ span->magic = FREE_PAGE_SPAN_LEADER_MAGIC;
+ span->npages = 1;
+ relptr_store(base, span->next, head);
+ relptr_store(base, span->prev, (FreePageSpanLeader *) NULL);
+ if (head != NULL)
+ relptr_store(base, head->prev, span);
+ relptr_store(base, fpm->btree_recycle, span);
+ fpm->btree_recycle_count++;
+}
+
+/*
+ * Remove an item from the btree at the given position on the given page.
+ */
+static void
+FreePageBtreeRemove(FreePageManager *fpm, FreePageBtree *btp, Size index)
+{
+ Assert(btp->hdr.magic == FREE_PAGE_LEAF_MAGIC);
+ Assert(index < btp->hdr.nused);
+
+ /* When last item is removed, extirpate entire page from btree. */
+ if (btp->hdr.nused == 1)
+ {
+ FreePageBtreeRemovePage(fpm, btp);
+ return;
+ }
+
+ /* Physically remove the key from the page. */
+ --btp->hdr.nused;
+ if (index < btp->hdr.nused)
+ memmove(&btp->u.leaf_key[index], &btp->u.leaf_key[index + 1],
+ sizeof(FreePageBtreeLeafKey) * (btp->hdr.nused - index));
+
+ /* If we just removed the first key, adjust ancestor keys. */
+ if (index == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, btp);
+
+ /* Consider whether to consolidate this page with a sibling. */
+ FreePageBtreeConsolidate(fpm, btp);
+}
+
+/*
+ * Remove a page from the btree. Caller is responsible for having relocated
+ * any keys from this page that are still wanted. The page is placed on the
+ * recycled list.
+ */
+static void
+FreePageBtreeRemovePage(FreePageManager *fpm, FreePageBtree *btp)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageBtree *parent;
+ Size index;
+ Size first_page;
+
+ for (;;)
+ {
+ /* Find parent page. */
+ parent = relptr_access(base, btp->hdr.parent);
+ if (parent == NULL)
+ {
+ /* We are removing the root page. */
+ relptr_store(base, fpm->btree_root, (FreePageBtree *) NULL);
+ fpm->btree_depth = 0;
+ Assert(fpm->singleton_first_page == 0);
+ Assert(fpm->singleton_npages == 0);
+ return;
+ }
+
+ /*
+ * If the parent contains only one item, we need to remove it as well.
+ */
+ if (parent->hdr.nused > 1)
+ break;
+ FreePageBtreeRecycle(fpm, fpm_pointer_to_page(base, btp));
+ btp = parent;
+ }
+
+ /* Find and remove the downlink. */
+ first_page = FreePageBtreeFirstKey(btp);
+ if (parent->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ {
+ index = FreePageBtreeSearchLeaf(parent, first_page);
+ Assert(index < parent->hdr.nused);
+ if (index < parent->hdr.nused - 1)
+ memmove(&parent->u.leaf_key[index],
+ &parent->u.leaf_key[index + 1],
+ sizeof(FreePageBtreeLeafKey)
+ * (parent->hdr.nused - index - 1));
+ }
+ else
+ {
+ index = FreePageBtreeSearchInternal(parent, first_page);
+ Assert(index < parent->hdr.nused);
+ if (index < parent->hdr.nused - 1)
+ memmove(&parent->u.internal_key[index],
+ &parent->u.internal_key[index + 1],
+ sizeof(FreePageBtreeInternalKey)
+ * (parent->hdr.nused - index - 1));
+ }
+ parent->hdr.nused--;
+ Assert(parent->hdr.nused > 0);
+
+ /* Recycle the page. */
+ FreePageBtreeRecycle(fpm, fpm_pointer_to_page(base, btp));
+
+ /* Adjust ancestor keys if needed. */
+ if (index == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, parent);
+
+ /* Consider whether to consolidate the parent with a sibling. */
+ FreePageBtreeConsolidate(fpm, parent);
+}
+
+/*
+ * Search the btree for an entry for the given first page and initialize
+ * *result with the results of the search. result->page and result->index
+ * indicate either the position of an exact match or the position at which
+ * the new key should be inserted. result->found is true for an exact match,
+ * otherwise false. result->split_pages will contain the number of additional
+ * btree pages that will be needed when performing a split to insert a key.
+ * Except as described above, the contents of fields in the result object are
+ * undefined on return.
+ */
+static void
+FreePageBtreeSearch(FreePageManager *fpm, Size first_page,
+ FreePageBtreeSearchResult *result)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageBtree *btp = relptr_access(base, fpm->btree_root);
+ Size index;
+
+ result->split_pages = 1;
+
+ /* If the btree is empty, there's nothing to find. */
+ if (btp == NULL)
+ {
+ result->page = NULL;
+ result->found = false;
+ return;
+ }
+
+ /* Descend until we hit a leaf. */
+ while (btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC)
+ {
+ FreePageBtree *child;
+ bool found_exact;
+
+ index = FreePageBtreeSearchInternal(btp, first_page);
+ found_exact = index < btp->hdr.nused &&
+ btp->u.internal_key[index].first_page == first_page;
+
+ /*
+ * If we found an exact match we descend directly. Otherwise, we
+ * descend into the child to the left if possible so that we can find
+ * the insertion point at that child's high end.
+ */
+ if (!found_exact && index > 0)
+ --index;
+
+ /* Track required split depth for leaf insert. */
+ if (btp->hdr.nused >= FPM_ITEMS_PER_INTERNAL_PAGE)
+ {
+ Assert(btp->hdr.nused == FPM_ITEMS_PER_INTERNAL_PAGE);
+ result->split_pages++;
+ }
+ else
+ result->split_pages = 0;
+
+ /* Descend to appropriate child page. */
+ Assert(index < btp->hdr.nused);
+ child = relptr_access(base, btp->u.internal_key[index].child);
+ Assert(relptr_access(base, child->hdr.parent) == btp);
+ btp = child;
+ }
+
+ /* Track required split depth for leaf insert. */
+ if (btp->hdr.nused >= FPM_ITEMS_PER_LEAF_PAGE)
+ {
+ Assert(btp->hdr.nused == FPM_ITEMS_PER_INTERNAL_PAGE);
+ result->split_pages++;
+ }
+ else
+ result->split_pages = 0;
+
+ /* Search leaf page. */
+ index = FreePageBtreeSearchLeaf(btp, first_page);
+
+ /* Assemble results. */
+ result->page = btp;
+ result->index = index;
+ result->found = index < btp->hdr.nused &&
+ first_page == btp->u.leaf_key[index].first_page;
+}
+
+/*
+ * Search an internal page for the first key greater than or equal to a given
+ * page number. Returns the index of that key, or one greater than the number
+ * of keys on the page if none.
+ */
+static Size
+FreePageBtreeSearchInternal(FreePageBtree *btp, Size first_page)
+{
+ Size low = 0;
+ Size high = btp->hdr.nused;
+
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ Assert(high > 0 && high <= FPM_ITEMS_PER_INTERNAL_PAGE);
+
+ while (low < high)
+ {
+ Size mid = (low + high) / 2;
+ Size val = btp->u.internal_key[mid].first_page;
+
+ if (first_page == val)
+ return mid;
+ else if (first_page < val)
+ high = mid;
+ else
+ low = mid + 1;
+ }
+
+ return low;
+}
+
+/*
+ * Search a leaf page for the first key greater than or equal to a given
+ * page number. Returns the index of that key, or one greater than the number
+ * of keys on the page if none.
+ */
+static Size
+FreePageBtreeSearchLeaf(FreePageBtree *btp, Size first_page)
+{
+ Size low = 0;
+ Size high = btp->hdr.nused;
+
+ Assert(btp->hdr.magic == FREE_PAGE_LEAF_MAGIC);
+ Assert(high > 0 && high <= FPM_ITEMS_PER_LEAF_PAGE);
+
+ while (low < high)
+ {
+ Size mid = (low + high) / 2;
+ Size val = btp->u.leaf_key[mid].first_page;
+
+ if (first_page == val)
+ return mid;
+ else if (first_page < val)
+ high = mid;
+ else
+ low = mid + 1;
+ }
+
+ return low;
+}
+
+/*
+ * Allocate a new btree page and move half the keys from the provided page
+ * to the new page. Caller is responsible for making sure that there's a
+ * page available from fpm->btree_recycle. Returns a pointer to the new page,
+ * to which caller must add a downlink.
+ */
+static FreePageBtree *
+FreePageBtreeSplitPage(FreePageManager *fpm, FreePageBtree *btp)
+{
+ FreePageBtree *newsibling;
+
+ newsibling = FreePageBtreeGetRecycled(fpm);
+ newsibling->hdr.magic = btp->hdr.magic;
+ newsibling->hdr.nused = btp->hdr.nused / 2;
+ relptr_copy(newsibling->hdr.parent, btp->hdr.parent);
+ btp->hdr.nused -= newsibling->hdr.nused;
+
+ if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC)
+ memcpy(&newsibling->u.leaf_key,
+ &btp->u.leaf_key[btp->hdr.nused],
+ sizeof(FreePageBtreeLeafKey) * newsibling->hdr.nused);
+ else
+ {
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ memcpy(&newsibling->u.internal_key,
+ &btp->u.internal_key[btp->hdr.nused],
+ sizeof(FreePageBtreeInternalKey) * newsibling->hdr.nused);
+ FreePageBtreeUpdateParentPointers(fpm_segment_base(fpm), newsibling);
+ }
+
+ return newsibling;
+}
+
+/*
+ * When internal pages are split or merged, the parent pointers of their
+ * children must be updated.
+ */
+static void
+FreePageBtreeUpdateParentPointers(char *base, FreePageBtree *btp)
+{
+ Size i;
+
+ Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
+ for (i = 0; i < btp->hdr.nused; ++i)
+ {
+ FreePageBtree *child;
+
+ child = relptr_access(base, btp->u.internal_key[i].child);
+ relptr_store(base, child->hdr.parent, btp);
+ }
+}
+
+/*
+ * Debugging dump of btree data.
+ */
+static void
+FreePageManagerDumpBtree(FreePageManager *fpm, FreePageBtree *btp,
+ FreePageBtree *parent, int level, StringInfo buf)
+{
+ char *base = fpm_segment_base(fpm);
+ Size pageno = fpm_pointer_to_page(base, btp);
+ Size index;
+ FreePageBtree *check_parent;
+
+ check_stack_depth();
+ check_parent = relptr_access(base, btp->hdr.parent);
+ appendStringInfo(buf, " %zu@%d %c", pageno, level,
+ btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC ? 'i' : 'l');
+ if (parent != check_parent)
+ appendStringInfo(buf, " [actual parent %zu, expected %zu]",
+ fpm_pointer_to_page(base, check_parent),
+ fpm_pointer_to_page(base, parent));
+ appendStringInfoChar(buf, ':');
+ for (index = 0; index < btp->hdr.nused; ++index)
+ {
+ if (btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC)
+ appendStringInfo(buf, " %zu->%zu",
+ btp->u.internal_key[index].first_page,
+ relptr_offset(btp->u.internal_key[index].child) / FPM_PAGE_SIZE);
+ else
+ appendStringInfo(buf, " %zu(%zu)",
+ btp->u.leaf_key[index].first_page,
+ btp->u.leaf_key[index].npages);
+ }
+ appendStringInfoChar(buf, '\n');
+
+ if (btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC)
+ {
+ for (index = 0; index < btp->hdr.nused; ++index)
+ {
+ FreePageBtree *child;
+
+ child = relptr_access(base, btp->u.internal_key[index].child);
+ FreePageManagerDumpBtree(fpm, child, btp, level + 1, buf);
+ }
+ }
+}
+
+/*
+ * Debugging dump of free-span data.
+ */
+static void
+FreePageManagerDumpSpans(FreePageManager *fpm, FreePageSpanLeader *span,
+ Size expected_pages, StringInfo buf)
+{
+ char *base = fpm_segment_base(fpm);
+
+ while (span != NULL)
+ {
+ if (span->npages != expected_pages)
+ appendStringInfo(buf, " %zu(%zu)", fpm_pointer_to_page(base, span),
+ span->npages);
+ else
+ appendStringInfo(buf, " %zu", fpm_pointer_to_page(base, span));
+ span = relptr_access(base, span->next);
+ }
+
+ appendStringInfoChar(buf, '\n');
+}
+
+/*
+ * This function allocates a run of pages of the given length from the free
+ * page manager.
+ */
+static bool
+FreePageManagerGetInternal(FreePageManager *fpm, Size npages, Size *first_page)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageSpanLeader *victim = NULL;
+ FreePageSpanLeader *prev;
+ FreePageSpanLeader *next;
+ FreePageBtreeSearchResult result;
+ Size victim_page = 0; /* placate compiler */
+ Size f;
+
+ /*
+ * Search for a free span.
+ *
+ * Right now, we use a simple best-fit policy here, but it's possible for
+ * this to result in memory fragmentation if we're repeatedly asked to
+ * allocate chunks just a little smaller than what we have available.
+ * Hopefully, this is unlikely, because we expect most requests to be
+ * single pages or superblock-sized chunks -- but no policy can be optimal
+ * under all circumstances unless it has knowledge of future allocation
+ * patterns.
+ */
+ for (f = Min(npages, FPM_NUM_FREELISTS) - 1; f < FPM_NUM_FREELISTS; ++f)
+ {
+ /* Skip empty freelists. */
+ if (relptr_is_null(fpm->freelist[f]))
+ continue;
+
+ /*
+ * All of the freelists except the last one contain only items of a
+ * single size, so we just take the first one. But the final free
+ * list contains everything too big for any of the other lists, so we
+ * need to search the list.
+ */
+ if (f < FPM_NUM_FREELISTS - 1)
+ victim = relptr_access(base, fpm->freelist[f]);
+ else
+ {
+ FreePageSpanLeader *candidate;
+
+ candidate = relptr_access(base, fpm->freelist[f]);
+ do
+ {
+ if (candidate->npages >= npages && (victim == NULL ||
+ victim->npages > candidate->npages))
+ {
+ victim = candidate;
+ if (victim->npages == npages)
+ break;
+ }
+ candidate = relptr_access(base, candidate->next);
+ } while (candidate != NULL);
+ }
+ break;
+ }
+
+ /* If we didn't find an allocatable span, return failure. */
+ if (victim == NULL)
+ return false;
+
+ /* Remove span from free list. */
+ Assert(victim->magic == FREE_PAGE_SPAN_LEADER_MAGIC);
+ prev = relptr_access(base, victim->prev);
+ next = relptr_access(base, victim->next);
+ if (prev != NULL)
+ relptr_copy(prev->next, victim->next);
+ else
+ relptr_copy(fpm->freelist[f], victim->next);
+ if (next != NULL)
+ relptr_copy(next->prev, victim->prev);
+ victim_page = fpm_pointer_to_page(base, victim);
+
+ /* Decide whether we might be invalidating contiguous_pages. */
+ if (f == FPM_NUM_FREELISTS - 1 &&
+ victim->npages == fpm->contiguous_pages)
+ {
+ /*
+ * The victim span came from the oversized freelist, and had the same
+ * size as the longest span. There may or may not be another one of
+ * the same size, so contiguous_pages must be recomputed just to be
+ * safe.
+ */
+ fpm->contiguous_pages_dirty = true;
+ }
+ else if (f + 1 == fpm->contiguous_pages &&
+ relptr_is_null(fpm->freelist[f]))
+ {
+ /*
+ * The victim span came from a fixed sized freelist, and it was the
+ * list for spans of the same size as the current longest span, and
+ * the list is now empty after removing the victim. So
+ * contiguous_pages must be recomputed without a doubt.
+ */
+ fpm->contiguous_pages_dirty = true;
+ }
+
+ /*
+ * If we haven't initialized the btree yet, the victim must be the single
+ * span stored within the FreePageManager itself. Otherwise, we need to
+ * update the btree.
+ */
+ if (relptr_is_null(fpm->btree_root))
+ {
+ Assert(victim_page == fpm->singleton_first_page);
+ Assert(victim->npages == fpm->singleton_npages);
+ Assert(victim->npages >= npages);
+ fpm->singleton_first_page += npages;
+ fpm->singleton_npages -= npages;
+ if (fpm->singleton_npages > 0)
+ FreePagePushSpanLeader(fpm, fpm->singleton_first_page,
+ fpm->singleton_npages);
+ }
+ else
+ {
+ /*
+ * If the span we found is exactly the right size, remove it from the
+ * btree completely. Otherwise, adjust the btree entry to reflect the
+ * still-unallocated portion of the span, and put that portion on the
+ * appropriate free list.
+ */
+ FreePageBtreeSearch(fpm, victim_page, &result);
+ Assert(result.found);
+ if (victim->npages == npages)
+ FreePageBtreeRemove(fpm, result.page, result.index);
+ else
+ {
+ FreePageBtreeLeafKey *key;
+
+ /* Adjust btree to reflect remaining pages. */
+ Assert(victim->npages > npages);
+ key = &result.page->u.leaf_key[result.index];
+ Assert(key->npages == victim->npages);
+ key->first_page += npages;
+ key->npages -= npages;
+ if (result.index == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, result.page);
+
+ /* Put the unallocated pages back on the appropriate free list. */
+ FreePagePushSpanLeader(fpm, victim_page + npages,
+ victim->npages - npages);
+ }
+ }
+
+ /* Return results to caller. */
+ *first_page = fpm_pointer_to_page(base, victim);
+ return true;
+}
+
+/*
+ * Put a range of pages into the btree and freelists, consolidating it with
+ * existing free spans just before and/or after it. If 'soft' is true,
+ * only perform the insertion if it can be done without allocating new btree
+ * pages; if false, do it always. Returns 0 if the soft flag caused the
+ * insertion to be skipped, or otherwise the size of the contiguous span
+ * created by the insertion. This may be larger than npages if we're able
+ * to consolidate with an adjacent range.
+ */
+static Size
+FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages,
+ bool soft)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageBtreeSearchResult result;
+ FreePageBtreeLeafKey *prevkey = NULL;
+ FreePageBtreeLeafKey *nextkey = NULL;
+ FreePageBtree *np;
+ Size nindex;
+
+ Assert(npages > 0);
+
+ /* We can store a single free span without initializing the btree. */
+ if (fpm->btree_depth == 0)
+ {
+ if (fpm->singleton_npages == 0)
+ {
+ /* Don't have a span yet; store this one. */
+ fpm->singleton_first_page = first_page;
+ fpm->singleton_npages = npages;
+ FreePagePushSpanLeader(fpm, first_page, npages);
+ return fpm->singleton_npages;
+ }
+ else if (fpm->singleton_first_page + fpm->singleton_npages ==
+ first_page)
+ {
+ /* New span immediately follows sole existing span. */
+ fpm->singleton_npages += npages;
+ FreePagePopSpanLeader(fpm, fpm->singleton_first_page);
+ FreePagePushSpanLeader(fpm, fpm->singleton_first_page,
+ fpm->singleton_npages);
+ return fpm->singleton_npages;
+ }
+ else if (first_page + npages == fpm->singleton_first_page)
+ {
+ /* New span immediately precedes sole existing span. */
+ FreePagePopSpanLeader(fpm, fpm->singleton_first_page);
+ fpm->singleton_first_page = first_page;
+ fpm->singleton_npages += npages;
+ FreePagePushSpanLeader(fpm, fpm->singleton_first_page,
+ fpm->singleton_npages);
+ return fpm->singleton_npages;
+ }
+ else
+ {
+ /* Not contiguous; we need to initialize the btree. */
+ Size root_page;
+ FreePageBtree *root;
+
+ if (!relptr_is_null(fpm->btree_recycle))
+ root = FreePageBtreeGetRecycled(fpm);
+ else if (soft)
+ return 0; /* Should not allocate if soft. */
+ else if (FreePageManagerGetInternal(fpm, 1, &root_page))
+ root = (FreePageBtree *) fpm_page_to_pointer(base, root_page);
+ else
+ {
+ /* We'd better be able to get a page from the existing range. */
+ elog(FATAL, "free page manager btree is corrupt");
+ }
+
+ /* Create the btree and move the preexisting range into it. */
+ root->hdr.magic = FREE_PAGE_LEAF_MAGIC;
+ root->hdr.nused = 1;
+ relptr_store(base, root->hdr.parent, (FreePageBtree *) NULL);
+ root->u.leaf_key[0].first_page = fpm->singleton_first_page;
+ root->u.leaf_key[0].npages = fpm->singleton_npages;
+ relptr_store(base, fpm->btree_root, root);
+ fpm->singleton_first_page = 0;
+ fpm->singleton_npages = 0;
+ fpm->btree_depth = 1;
+
+ /*
+ * Corner case: it may be that the btree root took the very last
+ * free page. In that case, the sole btree entry covers a zero
+ * page run, which is invalid. Overwrite it with the entry we're
+ * trying to insert and get out.
+ */
+ if (root->u.leaf_key[0].npages == 0)
+ {
+ root->u.leaf_key[0].first_page = first_page;
+ root->u.leaf_key[0].npages = npages;
+ FreePagePushSpanLeader(fpm, first_page, npages);
+ return npages;
+ }
+
+ /* Fall through to insert the new key. */
+ }
+ }
+
+ /* Search the btree. */
+ FreePageBtreeSearch(fpm, first_page, &result);
+ Assert(!result.found);
+ if (result.index > 0)
+ prevkey = &result.page->u.leaf_key[result.index - 1];
+ if (result.index < result.page->hdr.nused)
+ {
+ np = result.page;
+ nindex = result.index;
+ nextkey = &result.page->u.leaf_key[result.index];
+ }
+ else
+ {
+ np = FreePageBtreeFindRightSibling(base, result.page);
+ nindex = 0;
+ if (np != NULL)
+ nextkey = &np->u.leaf_key[0];
+ }
+
+ /* Consolidate with the previous entry if possible. */
+ if (prevkey != NULL && prevkey->first_page + prevkey->npages >= first_page)
+ {
+ bool remove_next = false;
+ Size result;
+
+ Assert(prevkey->first_page + prevkey->npages == first_page);
+ prevkey->npages = (first_page - prevkey->first_page) + npages;
+
+ /* Check whether we can *also* consolidate with the following entry. */
+ if (nextkey != NULL &&
+ prevkey->first_page + prevkey->npages >= nextkey->first_page)
+ {
+ Assert(prevkey->first_page + prevkey->npages ==
+ nextkey->first_page);
+ prevkey->npages = (nextkey->first_page - prevkey->first_page)
+ + nextkey->npages;
+ FreePagePopSpanLeader(fpm, nextkey->first_page);
+ remove_next = true;
+ }
+
+ /* Put the span on the correct freelist and save size. */
+ FreePagePopSpanLeader(fpm, prevkey->first_page);
+ FreePagePushSpanLeader(fpm, prevkey->first_page, prevkey->npages);
+ result = prevkey->npages;
+
+ /*
+ * If we consolidated with both the preceding and following entries,
+ * we must remove the following entry. We do this last, because
+ * removing an element from the btree may invalidate pointers we hold
+ * into the current data structure.
+ *
+ * NB: The btree is technically in an invalid state a this point
+ * because we've already updated prevkey to cover the same key space
+ * as nextkey. FreePageBtreeRemove() shouldn't notice that, though.
+ */
+ if (remove_next)
+ FreePageBtreeRemove(fpm, np, nindex);
+
+ return result;
+ }
+
+ /* Consolidate with the next entry if possible. */
+ if (nextkey != NULL && first_page + npages >= nextkey->first_page)
+ {
+ Size newpages;
+
+ /* Compute new size for span. */
+ Assert(first_page + npages == nextkey->first_page);
+ newpages = (nextkey->first_page - first_page) + nextkey->npages;
+
+ /* Put span on correct free list. */
+ FreePagePopSpanLeader(fpm, nextkey->first_page);
+ FreePagePushSpanLeader(fpm, first_page, newpages);
+
+ /* Update key in place. */
+ nextkey->first_page = first_page;
+ nextkey->npages = newpages;
+
+ /* If reducing first key on page, ancestors might need adjustment. */
+ if (nindex == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, np);
+
+ return nextkey->npages;
+ }
+
+ /* Split leaf page and as many of its ancestors as necessary. */
+ if (result.split_pages > 0)
+ {
+ /*
+ * NB: We could consider various coping strategies here to avoid a
+ * split; most obviously, if np != result.page, we could target that
+ * page instead. More complicated shuffling strategies could be
+ * possible as well; basically, unless every single leaf page is 100%
+ * full, we can jam this key in there if we try hard enough. It's
+ * unlikely that trying that hard is worthwhile, but it's possible we
+ * might need to make more than no effort. For now, we just do the
+ * easy thing, which is nothing.
+ */
+
+ /* If this is a soft insert, it's time to give up. */
+ if (soft)
+ return 0;
+
+ /* Check whether we need to allocate more btree pages to split. */
+ if (result.split_pages > fpm->btree_recycle_count)
+ {
+ Size pages_needed;
+ Size recycle_page;
+ Size i;
+
+ /*
+ * Allocate the required number of pages and split each one in
+ * turn. This should never fail, because if we've got enough
+ * spans of free pages kicking around that we need additional
+ * storage space just to remember them all, then we should
+ * certainly have enough to expand the btree, which should only
+ * ever use a tiny number of pages compared to the number under
+ * management. If it does, something's badly screwed up.
+ */
+ pages_needed = result.split_pages - fpm->btree_recycle_count;
+ for (i = 0; i < pages_needed; ++i)
+ {
+ if (!FreePageManagerGetInternal(fpm, 1, &recycle_page))
+ elog(FATAL, "free page manager btree is corrupt");
+ FreePageBtreeRecycle(fpm, recycle_page);
+ }
+
+ /*
+ * The act of allocating pages to recycle may have invalidated the
+ * results of our previous btree research, so repeat it. (We could
+ * recheck whether any of our split-avoidance strategies that were
+ * not viable before now are, but it hardly seems worthwhile, so
+ * we don't bother. Consolidation can't be possible now if it
+ * wasn't previously.)
+ */
+ FreePageBtreeSearch(fpm, first_page, &result);
+
+ /*
+ * The act of allocating pages for use in constructing our btree
+ * should never cause any page to become more full, so the new
+ * split depth should be no greater than the old one, and perhaps
+ * less if we fortuitously allocated a chunk that freed up a slot
+ * on the page we need to update.
+ */
+ Assert(result.split_pages <= fpm->btree_recycle_count);
+ }
+
+ /* If we still need to perform a split, do it. */
+ if (result.split_pages > 0)
+ {
+ FreePageBtree *split_target = result.page;
+ FreePageBtree *child = NULL;
+ Size key = first_page;
+
+ for (;;)
+ {
+ FreePageBtree *newsibling;
+ FreePageBtree *parent;
+
+ /* Identify parent page, which must receive downlink. */
+ parent = relptr_access(base, split_target->hdr.parent);
+
+ /* Split the page - downlink not added yet. */
+ newsibling = FreePageBtreeSplitPage(fpm, split_target);
+
+ /*
+ * At this point in the loop, we're always carrying a pending
+ * insertion. On the first pass, it's the actual key we're
+ * trying to insert; on subsequent passes, it's the downlink
+ * that needs to be added as a result of the split performed
+ * during the previous loop iteration. Since we've just split
+ * the page, there's definitely room on one of the two
+ * resulting pages.
+ */
+ if (child == NULL)
+ {
+ Size index;
+ FreePageBtree *insert_into;
+
+ insert_into = key < newsibling->u.leaf_key[0].first_page ?
+ split_target : newsibling;
+ index = FreePageBtreeSearchLeaf(insert_into, key);
+ FreePageBtreeInsertLeaf(insert_into, index, key, npages);
+ if (index == 0 && insert_into == split_target)
+ FreePageBtreeAdjustAncestorKeys(fpm, split_target);
+ }
+ else
+ {
+ Size index;
+ FreePageBtree *insert_into;
+
+ insert_into =
+ key < newsibling->u.internal_key[0].first_page ?
+ split_target : newsibling;
+ index = FreePageBtreeSearchInternal(insert_into, key);
+ FreePageBtreeInsertInternal(base, insert_into, index,
+ key, child);
+ relptr_store(base, child->hdr.parent, insert_into);
+ if (index == 0 && insert_into == split_target)
+ FreePageBtreeAdjustAncestorKeys(fpm, split_target);
+ }
+
+ /* If the page we just split has no parent, split the root. */
+ if (parent == NULL)
+ {
+ FreePageBtree *newroot;
+
+ newroot = FreePageBtreeGetRecycled(fpm);
+ newroot->hdr.magic = FREE_PAGE_INTERNAL_MAGIC;
+ newroot->hdr.nused = 2;
+ relptr_store(base, newroot->hdr.parent,
+ (FreePageBtree *) NULL);
+ newroot->u.internal_key[0].first_page =
+ FreePageBtreeFirstKey(split_target);
+ relptr_store(base, newroot->u.internal_key[0].child,
+ split_target);
+ relptr_store(base, split_target->hdr.parent, newroot);
+ newroot->u.internal_key[1].first_page =
+ FreePageBtreeFirstKey(newsibling);
+ relptr_store(base, newroot->u.internal_key[1].child,
+ newsibling);
+ relptr_store(base, newsibling->hdr.parent, newroot);
+ relptr_store(base, fpm->btree_root, newroot);
+ fpm->btree_depth++;
+
+ break;
+ }
+
+ /* If the parent page isn't full, insert the downlink. */
+ key = newsibling->u.internal_key[0].first_page;
+ if (parent->hdr.nused < FPM_ITEMS_PER_INTERNAL_PAGE)
+ {
+ Size index;
+
+ index = FreePageBtreeSearchInternal(parent, key);
+ FreePageBtreeInsertInternal(base, parent, index,
+ key, newsibling);
+ relptr_store(base, newsibling->hdr.parent, parent);
+ if (index == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, parent);
+ break;
+ }
+
+ /* The parent also needs to be split, so loop around. */
+ child = newsibling;
+ split_target = parent;
+ }
+
+ /*
+ * The loop above did the insert, so just need to update the free
+ * list, and we're done.
+ */
+ FreePagePushSpanLeader(fpm, first_page, npages);
+
+ return npages;
+ }
+ }
+
+ /* Physically add the key to the page. */
+ Assert(result.page->hdr.nused < FPM_ITEMS_PER_LEAF_PAGE);
+ FreePageBtreeInsertLeaf(result.page, result.index, first_page, npages);
+
+ /* If new first key on page, ancestors might need adjustment. */
+ if (result.index == 0)
+ FreePageBtreeAdjustAncestorKeys(fpm, result.page);
+
+ /* Put it on the free list. */
+ FreePagePushSpanLeader(fpm, first_page, npages);
+
+ return npages;
+}
+
+/*
+ * Remove a FreePageSpanLeader from the linked-list that contains it, either
+ * because we're changing the size of the span, or because we're allocating it.
+ */
+static void
+FreePagePopSpanLeader(FreePageManager *fpm, Size pageno)
+{
+ char *base = fpm_segment_base(fpm);
+ FreePageSpanLeader *span;
+ FreePageSpanLeader *next;
+ FreePageSpanLeader *prev;
+
+ span = (FreePageSpanLeader *) fpm_page_to_pointer(base, pageno);
+
+ next = relptr_access(base, span->next);
+ prev = relptr_access(base, span->prev);
+ if (next != NULL)
+ relptr_copy(next->prev, span->prev);
+ if (prev != NULL)
+ relptr_copy(prev->next, span->next);
+ else
+ {
+ Size f = Min(span->npages, FPM_NUM_FREELISTS) - 1;
+
+ Assert(relptr_offset(fpm->freelist[f]) == pageno * FPM_PAGE_SIZE);
+ relptr_copy(fpm->freelist[f], span->next);
+ }
+}
+
+/*
+ * Initialize a new FreePageSpanLeader and put it on the appropriate free list.
+ */
+static void
+FreePagePushSpanLeader(FreePageManager *fpm, Size first_page, Size npages)
+{
+ char *base = fpm_segment_base(fpm);
+ Size f = Min(npages, FPM_NUM_FREELISTS) - 1;
+ FreePageSpanLeader *head = relptr_access(base, fpm->freelist[f]);
+ FreePageSpanLeader *span;
+
+ span = (FreePageSpanLeader *) fpm_page_to_pointer(base, first_page);
+ span->magic = FREE_PAGE_SPAN_LEADER_MAGIC;
+ span->npages = npages;
+ relptr_store(base, span->next, head);
+ relptr_store(base, span->prev, (FreePageSpanLeader *) NULL);
+ if (head != NULL)
+ relptr_store(base, head->prev, span);
+ relptr_store(base, fpm->freelist[f], span);
+}
diff --git a/src/backend/utils/mmgr/generation.c b/src/backend/utils/mmgr/generation.c
new file mode 100644
index 0000000..e530e27
--- /dev/null
+++ b/src/backend/utils/mmgr/generation.c
@@ -0,0 +1,1064 @@
+/*-------------------------------------------------------------------------
+ *
+ * generation.c
+ * Generational allocator definitions.
+ *
+ * Generation is a custom MemoryContext implementation designed for cases of
+ * chunks with similar lifespan.
+ *
+ * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/generation.c
+ *
+ *
+ * This memory context is based on the assumption that the chunks are freed
+ * roughly in the same order as they were allocated (FIFO), or in groups with
+ * similar lifespan (generations - hence the name of the context). This is
+ * typical for various queue-like use cases, i.e. when tuples are constructed,
+ * processed and then thrown away.
+ *
+ * The memory context uses a very simple approach to free space management.
+ * Instead of a complex global freelist, each block tracks a number
+ * of allocated and freed chunks. The block is classed as empty when the
+ * number of free chunks is equal to the number of allocated chunks. When
+ * this occurs, instead of freeing the block, we try to "recycle" it, i.e.
+ * reuse it for new allocations. This is done by setting the block in the
+ * context's 'freeblock' field. If the freeblock field is already occupied
+ * by another free block we simply return the newly empty block to malloc.
+ *
+ * This approach to free blocks requires fewer malloc/free calls for truly
+ * first allocated, first free'd allocation patterns.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "lib/ilist.h"
+#include "port/pg_bitutils.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+
+
+#define Generation_BLOCKHDRSZ MAXALIGN(sizeof(GenerationBlock))
+#define Generation_CHUNKHDRSZ sizeof(GenerationChunk)
+
+#define Generation_CHUNK_FRACTION 8
+
+typedef struct GenerationBlock GenerationBlock; /* forward reference */
+typedef struct GenerationChunk GenerationChunk;
+
+typedef void *GenerationPointer;
+
+/*
+ * GenerationContext is a simple memory context not reusing allocated chunks,
+ * and freeing blocks once all chunks are freed.
+ */
+typedef struct GenerationContext
+{
+ MemoryContextData header; /* Standard memory-context fields */
+
+ /* Generational context parameters */
+ Size initBlockSize; /* initial block size */
+ Size maxBlockSize; /* maximum block size */
+ Size nextBlockSize; /* next block size to allocate */
+ Size allocChunkLimit; /* effective chunk size limit */
+
+ GenerationBlock *block; /* current (most recently allocated) block, or
+ * NULL if we've just freed the most recent
+ * block */
+ GenerationBlock *freeblock; /* pointer to a block that's being recycled,
+ * or NULL if there's no such block. */
+ GenerationBlock *keeper; /* keep this block over resets */
+ dlist_head blocks; /* list of blocks */
+} GenerationContext;
+
+/*
+ * GenerationBlock
+ * GenerationBlock is the unit of memory that is obtained by generation.c
+ * from malloc(). It contains zero or more GenerationChunks, which are
+ * the units requested by palloc() and freed by pfree(). GenerationChunks
+ * cannot be returned to malloc() individually, instead pfree()
+ * updates the free counter of the block and when all chunks in a block
+ * are free the whole block can be returned to malloc().
+ *
+ * GenerationBlock is the header data for a block --- the usable space
+ * within the block begins at the next alignment boundary.
+ */
+struct GenerationBlock
+{
+ dlist_node node; /* doubly-linked list of blocks */
+ Size blksize; /* allocated size of this block */
+ int nchunks; /* number of chunks in the block */
+ int nfree; /* number of free chunks */
+ char *freeptr; /* start of free space in this block */
+ char *endptr; /* end of space in this block */
+};
+
+/*
+ * GenerationChunk
+ * The prefix of each piece of memory in a GenerationBlock
+ *
+ * Note: to meet the memory context APIs, the payload area of the chunk must
+ * be maxaligned, and the "context" link must be immediately adjacent to the
+ * payload area (cf. GetMemoryChunkContext). We simplify matters for this
+ * module by requiring sizeof(GenerationChunk) to be maxaligned, and then
+ * we can ensure things work by adding any required alignment padding before
+ * the pointer fields. There is a static assertion below that the alignment
+ * is done correctly.
+ */
+struct GenerationChunk
+{
+ /* size is always the size of the usable space in the chunk */
+ Size size;
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* when debugging memory usage, also store actual requested size */
+ /* this is zero in a free chunk */
+ Size requested_size;
+
+#define GENERATIONCHUNK_RAWSIZE (SIZEOF_SIZE_T * 2 + SIZEOF_VOID_P * 2)
+#else
+#define GENERATIONCHUNK_RAWSIZE (SIZEOF_SIZE_T + SIZEOF_VOID_P * 2)
+#endif /* MEMORY_CONTEXT_CHECKING */
+
+ /* ensure proper alignment by adding padding if needed */
+#if (GENERATIONCHUNK_RAWSIZE % MAXIMUM_ALIGNOF) != 0
+ char padding[MAXIMUM_ALIGNOF - GENERATIONCHUNK_RAWSIZE % MAXIMUM_ALIGNOF];
+#endif
+
+ GenerationBlock *block; /* block owning this chunk */
+ GenerationContext *context; /* owning context, or NULL if freed chunk */
+ /* there must not be any padding to reach a MAXALIGN boundary here! */
+};
+
+/*
+ * Only the "context" field should be accessed outside this module.
+ * We keep the rest of an allocated chunk's header marked NOACCESS when using
+ * valgrind. But note that freed chunk headers are kept accessible, for
+ * simplicity.
+ */
+#define GENERATIONCHUNK_PRIVATE_LEN offsetof(GenerationChunk, context)
+
+/*
+ * GenerationIsValid
+ * True iff set is valid allocation set.
+ */
+#define GenerationIsValid(set) PointerIsValid(set)
+
+#define GenerationPointerGetChunk(ptr) \
+ ((GenerationChunk *)(((char *)(ptr)) - Generation_CHUNKHDRSZ))
+#define GenerationChunkGetPointer(chk) \
+ ((GenerationPointer *)(((char *)(chk)) + Generation_CHUNKHDRSZ))
+
+/* Inlined helper functions */
+static inline void GenerationBlockInit(GenerationBlock *block, Size blksize);
+static inline bool GenerationBlockIsEmpty(GenerationBlock *block);
+static inline void GenerationBlockMarkEmpty(GenerationBlock *block);
+static inline Size GenerationBlockFreeBytes(GenerationBlock *block);
+static inline void GenerationBlockFree(GenerationContext *set,
+ GenerationBlock *block);
+
+/*
+ * These functions implement the MemoryContext API for Generation contexts.
+ */
+static void *GenerationAlloc(MemoryContext context, Size size);
+static void GenerationFree(MemoryContext context, void *pointer);
+static void *GenerationRealloc(MemoryContext context, void *pointer, Size size);
+static void GenerationReset(MemoryContext context);
+static void GenerationDelete(MemoryContext context);
+static Size GenerationGetChunkSpace(MemoryContext context, void *pointer);
+static bool GenerationIsEmpty(MemoryContext context);
+static void GenerationStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals,
+ bool print_to_stderr);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+static void GenerationCheck(MemoryContext context);
+#endif
+
+/*
+ * This is the virtual function table for Generation contexts.
+ */
+static const MemoryContextMethods GenerationMethods = {
+ GenerationAlloc,
+ GenerationFree,
+ GenerationRealloc,
+ GenerationReset,
+ GenerationDelete,
+ GenerationGetChunkSpace,
+ GenerationIsEmpty,
+ GenerationStats
+#ifdef MEMORY_CONTEXT_CHECKING
+ ,GenerationCheck
+#endif
+};
+
+
+/*
+ * Public routines
+ */
+
+
+/*
+ * GenerationContextCreate
+ * Create a new Generation context.
+ *
+ * parent: parent context, or NULL if top-level context
+ * name: name of context (must be statically allocated)
+ * minContextSize: minimum context size
+ * initBlockSize: initial allocation block size
+ * maxBlockSize: maximum allocation block size
+ */
+MemoryContext
+GenerationContextCreate(MemoryContext parent,
+ const char *name,
+ Size minContextSize,
+ Size initBlockSize,
+ Size maxBlockSize)
+{
+ Size firstBlockSize;
+ Size allocSize;
+ GenerationContext *set;
+ GenerationBlock *block;
+
+ /* Assert we padded GenerationChunk properly */
+ StaticAssertStmt(Generation_CHUNKHDRSZ == MAXALIGN(Generation_CHUNKHDRSZ),
+ "sizeof(GenerationChunk) is not maxaligned");
+ StaticAssertStmt(offsetof(GenerationChunk, context) + sizeof(MemoryContext) ==
+ Generation_CHUNKHDRSZ,
+ "padding calculation in GenerationChunk is wrong");
+
+ /*
+ * First, validate allocation parameters. Asserts seem sufficient because
+ * nobody varies their parameters at runtime. We somewhat arbitrarily
+ * enforce a minimum 1K block size.
+ */
+ Assert(initBlockSize == MAXALIGN(initBlockSize) &&
+ initBlockSize >= 1024);
+ Assert(maxBlockSize == MAXALIGN(maxBlockSize) &&
+ maxBlockSize >= initBlockSize &&
+ AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */
+ Assert(minContextSize == 0 ||
+ (minContextSize == MAXALIGN(minContextSize) &&
+ minContextSize >= 1024 &&
+ minContextSize <= maxBlockSize));
+
+ /* Determine size of initial block */
+ allocSize = MAXALIGN(sizeof(GenerationContext)) +
+ Generation_BLOCKHDRSZ + Generation_CHUNKHDRSZ;
+ if (minContextSize != 0)
+ allocSize = Max(allocSize, minContextSize);
+ else
+ allocSize = Max(allocSize, initBlockSize);
+
+ /*
+ * Allocate the initial block. Unlike other generation.c blocks, it
+ * starts with the context header and its block header follows that.
+ */
+ set = (GenerationContext *) malloc(allocSize);
+ if (set == NULL)
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed while creating memory context \"%s\".",
+ name)));
+ }
+
+ /*
+ * Avoid writing code that can fail between here and MemoryContextCreate;
+ * we'd leak the header if we ereport in this stretch.
+ */
+ dlist_init(&set->blocks);
+
+ /* Fill in the initial block's block header */
+ block = (GenerationBlock *) (((char *) set) + MAXALIGN(sizeof(GenerationContext)));
+ /* determine the block size and initialize it */
+ firstBlockSize = allocSize - MAXALIGN(sizeof(GenerationContext));
+ GenerationBlockInit(block, firstBlockSize);
+
+ /* add it to the doubly-linked list of blocks */
+ dlist_push_head(&set->blocks, &block->node);
+
+ /* use it as the current allocation block */
+ set->block = block;
+
+ /* No free block, yet */
+ set->freeblock = NULL;
+
+ /* Mark block as not to be released at reset time */
+ set->keeper = block;
+
+ /* Fill in GenerationContext-specific header fields */
+ set->initBlockSize = initBlockSize;
+ set->maxBlockSize = maxBlockSize;
+ set->nextBlockSize = initBlockSize;
+
+ /*
+ * Compute the allocation chunk size limit for this context.
+ *
+ * Follows similar ideas as AllocSet, see aset.c for details ...
+ */
+ set->allocChunkLimit = maxBlockSize;
+ while ((Size) (set->allocChunkLimit + Generation_CHUNKHDRSZ) >
+ (Size) ((Size) (maxBlockSize - Generation_BLOCKHDRSZ) / Generation_CHUNK_FRACTION))
+ set->allocChunkLimit >>= 1;
+
+ /* Finally, do the type-independent part of context creation */
+ MemoryContextCreate((MemoryContext) set,
+ T_GenerationContext,
+ &GenerationMethods,
+ parent,
+ name);
+
+ ((MemoryContext) set)->mem_allocated = firstBlockSize;
+
+ return (MemoryContext) set;
+}
+
+/*
+ * GenerationReset
+ * Frees all memory which is allocated in the given set.
+ *
+ * The code simply frees all the blocks in the context - we don't keep any
+ * keeper blocks or anything like that.
+ */
+static void
+GenerationReset(MemoryContext context)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ dlist_mutable_iter miter;
+
+ AssertArg(GenerationIsValid(set));
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Check for corruption and leaks before freeing */
+ GenerationCheck(context);
+#endif
+
+ /*
+ * NULLify the free block pointer. We must do this before calling
+ * GenerationBlockFree as that function never expects to free the
+ * freeblock.
+ */
+ set->freeblock = NULL;
+
+ dlist_foreach_modify(miter, &set->blocks)
+ {
+ GenerationBlock *block = dlist_container(GenerationBlock, node, miter.cur);
+
+ if (block == set->keeper)
+ GenerationBlockMarkEmpty(block);
+ else
+ GenerationBlockFree(set, block);
+ }
+
+ /* set it so new allocations to make use of the keeper block */
+ set->block = set->keeper;
+
+ /* Reset block size allocation sequence, too */
+ set->nextBlockSize = set->initBlockSize;
+
+ /* Ensure there is only 1 item in the dlist */
+ Assert(!dlist_is_empty(&set->blocks));
+ Assert(!dlist_has_next(&set->blocks, dlist_head_node(&set->blocks)));
+}
+
+/*
+ * GenerationDelete
+ * Free all memory which is allocated in the given context.
+ */
+static void
+GenerationDelete(MemoryContext context)
+{
+ /* Reset to release all releasable GenerationBlocks */
+ GenerationReset(context);
+ /* And free the context header and keeper block */
+ free(context);
+}
+
+/*
+ * GenerationAlloc
+ * Returns pointer to allocated memory of given size or NULL if
+ * request could not be completed; memory is added to the set.
+ *
+ * No request may exceed:
+ * MAXALIGN_DOWN(SIZE_MAX) - Generation_BLOCKHDRSZ - Generation_CHUNKHDRSZ
+ * All callers use a much-lower limit.
+ *
+ * Note: when using valgrind, it doesn't matter how the returned allocation
+ * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will
+ * return space that is marked NOACCESS - GenerationRealloc has to beware!
+ */
+static void *
+GenerationAlloc(MemoryContext context, Size size)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ GenerationBlock *block;
+ GenerationChunk *chunk;
+ Size chunk_size = MAXALIGN(size);
+ Size required_size = chunk_size + Generation_CHUNKHDRSZ;
+
+ /* is it an over-sized chunk? if yes, allocate special block */
+ if (chunk_size > set->allocChunkLimit)
+ {
+ Size blksize = required_size + Generation_BLOCKHDRSZ;
+
+ block = (GenerationBlock *) malloc(blksize);
+ if (block == NULL)
+ return NULL;
+
+ context->mem_allocated += blksize;
+
+ /* block with a single (used) chunk */
+ block->blksize = blksize;
+ block->nchunks = 1;
+ block->nfree = 0;
+
+ /* the block is completely full */
+ block->freeptr = block->endptr = ((char *) block) + blksize;
+
+ chunk = (GenerationChunk *) (((char *) block) + Generation_BLOCKHDRSZ);
+ chunk->block = block;
+ chunk->context = set;
+ chunk->size = chunk_size;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk_size)
+ set_sentinel(GenerationChunkGetPointer(chunk), size);
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) GenerationChunkGetPointer(chunk), size);
+#endif
+
+ /* add the block to the list of allocated blocks */
+ dlist_push_head(&set->blocks, &block->node);
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) GenerationChunkGetPointer(chunk) + size,
+ chunk_size - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ return GenerationChunkGetPointer(chunk);
+ }
+
+ /*
+ * Not an oversized chunk. We try to first make use of the current block,
+ * but if there's not enough space in it, instead of allocating a new
+ * block, we look to see if the freeblock is empty and has enough space.
+ * If not, we'll also try the same using the keeper block. The keeper
+ * block may have become empty and we have no other way to reuse it again
+ * if we don't try to use it explicitly here.
+ *
+ * We don't want to start filling the freeblock before the current block
+ * is full, otherwise we may cause fragmentation in FIFO type workloads.
+ * We only switch to using the freeblock or keeper block if those blocks
+ * are completely empty. If we didn't do that we could end up fragmenting
+ * consecutive allocations over multiple blocks which would be a problem
+ * that would compound over time.
+ */
+ block = set->block;
+
+ if (block == NULL ||
+ GenerationBlockFreeBytes(block) < required_size)
+ {
+ Size blksize;
+ GenerationBlock *freeblock = set->freeblock;
+
+ if (freeblock != NULL &&
+ GenerationBlockIsEmpty(freeblock) &&
+ GenerationBlockFreeBytes(freeblock) >= required_size)
+ {
+ block = freeblock;
+
+ /*
+ * Zero out the freeblock as we'll set this to the current block
+ * below
+ */
+ set->freeblock = NULL;
+ }
+ else if (GenerationBlockIsEmpty(set->keeper) &&
+ GenerationBlockFreeBytes(set->keeper) >= required_size)
+ {
+ block = set->keeper;
+ }
+ else
+ {
+ /*
+ * The first such block has size initBlockSize, and we double the
+ * space in each succeeding block, but not more than maxBlockSize.
+ */
+ blksize = set->nextBlockSize;
+ set->nextBlockSize <<= 1;
+ if (set->nextBlockSize > set->maxBlockSize)
+ set->nextBlockSize = set->maxBlockSize;
+
+ /* we'll need a block hdr too, so add that to the required size */
+ required_size += Generation_BLOCKHDRSZ;
+
+ /* round the size up to the next power of 2 */
+ if (blksize < required_size)
+ blksize = pg_nextpower2_size_t(required_size);
+
+ block = (GenerationBlock *) malloc(blksize);
+
+ if (block == NULL)
+ return NULL;
+
+ context->mem_allocated += blksize;
+
+ /* initialize the new block */
+ GenerationBlockInit(block, blksize);
+
+ /* add it to the doubly-linked list of blocks */
+ dlist_push_head(&set->blocks, &block->node);
+
+ /* Zero out the freeblock in case it's become full */
+ set->freeblock = NULL;
+ }
+
+ /* and also use it as the current allocation block */
+ set->block = block;
+ }
+
+ /* we're supposed to have a block with enough free space now */
+ Assert(block != NULL);
+ Assert((block->endptr - block->freeptr) >= Generation_CHUNKHDRSZ + chunk_size);
+
+ chunk = (GenerationChunk *) block->freeptr;
+
+ /* Prepare to initialize the chunk header. */
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, Generation_CHUNKHDRSZ);
+
+ block->nchunks += 1;
+ block->freeptr += (Generation_CHUNKHDRSZ + chunk_size);
+
+ Assert(block->freeptr <= block->endptr);
+
+ chunk->block = block;
+ chunk->context = set;
+ chunk->size = chunk_size;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
+ /* set mark to catch clobber of "unused" space */
+ if (size < chunk->size)
+ set_sentinel(GenerationChunkGetPointer(chunk), size);
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) GenerationChunkGetPointer(chunk), size);
+#endif
+
+ /* Ensure any padding bytes are marked NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS((char *) GenerationChunkGetPointer(chunk) + size,
+ chunk_size - size);
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ return GenerationChunkGetPointer(chunk);
+}
+
+/*
+ * GenerationBlockInit
+ * Initializes 'block' assuming 'blksize'. Does not update the context's
+ * mem_allocated field.
+ */
+static inline void
+GenerationBlockInit(GenerationBlock *block, Size blksize)
+{
+ block->blksize = blksize;
+ block->nchunks = 0;
+ block->nfree = 0;
+
+ block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ;
+ block->endptr = ((char *) block) + blksize;
+
+ /* Mark unallocated space NOACCESS. */
+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,
+ blksize - Generation_BLOCKHDRSZ);
+}
+
+/*
+ * GenerationBlockIsEmpty
+ * Returns true iif 'block' contains no chunks
+ */
+static inline bool
+GenerationBlockIsEmpty(GenerationBlock *block)
+{
+ return (block->nchunks == 0);
+}
+
+/*
+ * GenerationBlockMarkEmpty
+ * Set a block as empty. Does not free the block.
+ */
+static inline void
+GenerationBlockMarkEmpty(GenerationBlock *block)
+{
+#if defined(USE_VALGRIND) || defined(CLOBBER_FREED_MEMORY)
+ char *datastart = ((char *) block) + Generation_BLOCKHDRSZ;
+#endif
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(datastart, block->freeptr - datastart);
+#else
+ /* wipe_mem() would have done this */
+ VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart);
+#endif
+
+ /* Reset the block, but don't return it to malloc */
+ block->nchunks = 0;
+ block->nfree = 0;
+ block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ;
+}
+
+/*
+ * GenerationBlockFreeBytes
+ * Returns the number of bytes free in 'block'
+ */
+static inline Size
+GenerationBlockFreeBytes(GenerationBlock *block)
+{
+ return (block->endptr - block->freeptr);
+}
+
+/*
+ * GenerationBlockFree
+ * Remove 'block' from 'set' and release the memory consumed by it.
+ */
+static inline void
+GenerationBlockFree(GenerationContext *set, GenerationBlock *block)
+{
+ /* Make sure nobody tries to free the keeper block */
+ Assert(block != set->keeper);
+ /* We shouldn't be freeing the freeblock either */
+ Assert(block != set->freeblock);
+
+ /* release the block from the list of blocks */
+ dlist_delete(&block->node);
+
+ ((MemoryContext) set)->mem_allocated -= block->blksize;
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(block, block->blksize);
+#endif
+
+ free(block);
+}
+
+/*
+ * GenerationFree
+ * Update number of chunks in the block, and if all chunks in the block
+ * are now free then discard the block.
+ */
+static void
+GenerationFree(MemoryContext context, void *pointer)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ GenerationChunk *chunk = GenerationPointerGetChunk(pointer);
+ GenerationBlock *block;
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ block = chunk->block;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Test for someone scribbling on unused space in chunk */
+ if (chunk->requested_size < chunk->size)
+ if (!sentinel_ok(pointer, chunk->requested_size))
+ elog(WARNING, "detected write past chunk end in %s %p",
+ ((MemoryContext) set)->name, chunk);
+#endif
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(pointer, chunk->size);
+#endif
+
+ /* Reset context to NULL in freed chunks */
+ chunk->context = NULL;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Reset requested_size to 0 in freed chunks */
+ chunk->requested_size = 0;
+#endif
+
+ block->nfree += 1;
+
+ Assert(block->nchunks > 0);
+ Assert(block->nfree <= block->nchunks);
+
+ /* If there are still allocated chunks in the block, we're done. */
+ if (block->nfree < block->nchunks)
+ return;
+
+ /* Don't try to free the keeper block, just mark it empty */
+ if (block == set->keeper)
+ {
+ GenerationBlockMarkEmpty(block);
+ return;
+ }
+
+ /*
+ * If there is no freeblock set or if this is the freeblock then instead
+ * of freeing this memory, we keep it around so that new allocations have
+ * the option of recycling it.
+ */
+ if (set->freeblock == NULL || set->freeblock == block)
+ {
+ /* XXX should we only recycle maxBlockSize sized blocks? */
+ set->freeblock = block;
+ GenerationBlockMarkEmpty(block);
+ return;
+ }
+
+ /* Also make sure the block is not marked as the current block. */
+ if (set->block == block)
+ set->block = NULL;
+
+ /*
+ * The block is empty, so let's get rid of it. First remove it from the
+ * list of blocks, then return it to malloc().
+ */
+ dlist_delete(&block->node);
+
+ context->mem_allocated -= block->blksize;
+ free(block);
+}
+
+/*
+ * GenerationRealloc
+ * When handling repalloc, we simply allocate a new chunk, copy the data
+ * and discard the old one. The only exception is when the new size fits
+ * into the old chunk - in that case we just update chunk header.
+ */
+static void *
+GenerationRealloc(MemoryContext context, void *pointer, Size size)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ GenerationChunk *chunk = GenerationPointerGetChunk(pointer);
+ GenerationPointer newPointer;
+ Size oldsize;
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ oldsize = chunk->size;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Test for someone scribbling on unused space in chunk */
+ if (chunk->requested_size < oldsize)
+ if (!sentinel_ok(pointer, chunk->requested_size))
+ elog(WARNING, "detected write past chunk end in %s %p",
+ ((MemoryContext) set)->name, chunk);
+#endif
+
+ /*
+ * Maybe the allocated area already is >= the new size. (In particular,
+ * we always fall out here if the requested size is a decrease.)
+ *
+ * This memory context does not use power-of-2 chunk sizing and instead
+ * carves the chunks to be as small as possible, so most repalloc() calls
+ * will end up in the palloc/memcpy/pfree branch.
+ *
+ * XXX Perhaps we should annotate this condition with unlikely()?
+ */
+ if (oldsize >= size)
+ {
+#ifdef MEMORY_CONTEXT_CHECKING
+ Size oldrequest = chunk->requested_size;
+
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* We can only fill the extra space if we know the prior request */
+ if (size > oldrequest)
+ randomize_mem((char *) pointer + oldrequest,
+ size - oldrequest);
+#endif
+
+ chunk->requested_size = size;
+
+ /*
+ * If this is an increase, mark any newly-available part UNDEFINED.
+ * Otherwise, mark the obsolete part NOACCESS.
+ */
+ if (size > oldrequest)
+ VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + oldrequest,
+ size - oldrequest);
+ else
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size,
+ oldsize - size);
+
+ /* set mark to catch clobber of "unused" space */
+ if (size < oldsize)
+ set_sentinel(pointer, size);
+#else /* !MEMORY_CONTEXT_CHECKING */
+
+ /*
+ * We don't have the information to determine whether we're growing
+ * the old request or shrinking it, so we conservatively mark the
+ * entire new allocation DEFINED.
+ */
+ VALGRIND_MAKE_MEM_NOACCESS(pointer, oldsize);
+ VALGRIND_MAKE_MEM_DEFINED(pointer, size);
+#endif
+
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ return pointer;
+ }
+
+ /* allocate new chunk */
+ newPointer = GenerationAlloc((MemoryContext) set, size);
+
+ /* leave immediately if request was not completed */
+ if (newPointer == NULL)
+ {
+ /* Disallow external access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+ return NULL;
+ }
+
+ /*
+ * GenerationAlloc() may have returned a region that is still NOACCESS.
+ * Change it to UNDEFINED for the moment; memcpy() will then transfer
+ * definedness from the old allocation to the new. If we know the old
+ * allocation, copy just that much. Otherwise, make the entire old chunk
+ * defined to avoid errors as we copy the currently-NOACCESS trailing
+ * bytes.
+ */
+ VALGRIND_MAKE_MEM_UNDEFINED(newPointer, size);
+#ifdef MEMORY_CONTEXT_CHECKING
+ oldsize = chunk->requested_size;
+#else
+ VALGRIND_MAKE_MEM_DEFINED(pointer, oldsize);
+#endif
+
+ /* transfer existing data (certain to fit) */
+ memcpy(newPointer, pointer, oldsize);
+
+ /* free old chunk */
+ GenerationFree((MemoryContext) set, pointer);
+
+ return newPointer;
+}
+
+/*
+ * GenerationGetChunkSpace
+ * Given a currently-allocated chunk, determine the total space
+ * it occupies (including all memory-allocation overhead).
+ */
+static Size
+GenerationGetChunkSpace(MemoryContext context, void *pointer)
+{
+ GenerationChunk *chunk = GenerationPointerGetChunk(pointer);
+ Size result;
+
+ VALGRIND_MAKE_MEM_DEFINED(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+ result = chunk->size + Generation_CHUNKHDRSZ;
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+ return result;
+}
+
+/*
+ * GenerationIsEmpty
+ * Is a GenerationContext empty of any allocated space?
+ */
+static bool
+GenerationIsEmpty(MemoryContext context)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ dlist_iter iter;
+
+ dlist_foreach(iter, &set->blocks)
+ {
+ GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
+
+ if (block->nchunks > 0)
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * GenerationStats
+ * Compute stats about memory consumption of a Generation context.
+ *
+ * printfunc: if not NULL, pass a human-readable stats string to this.
+ * passthru: pass this pointer through to printfunc.
+ * totals: if not NULL, add stats about this context into *totals.
+ * print_to_stderr: print stats to stderr if true, elog otherwise.
+ *
+ * XXX freespace only accounts for empty space at the end of the block, not
+ * space of freed chunks (which is unknown).
+ */
+static void
+GenerationStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals, bool print_to_stderr)
+{
+ GenerationContext *set = (GenerationContext *) context;
+ Size nblocks = 0;
+ Size nchunks = 0;
+ Size nfreechunks = 0;
+ Size totalspace;
+ Size freespace = 0;
+ dlist_iter iter;
+
+ /* Include context header in totalspace */
+ totalspace = MAXALIGN(sizeof(GenerationContext));
+
+ dlist_foreach(iter, &set->blocks)
+ {
+ GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
+
+ nblocks++;
+ nchunks += block->nchunks;
+ nfreechunks += block->nfree;
+ totalspace += block->blksize;
+ freespace += (block->endptr - block->freeptr);
+ }
+
+ if (printfunc)
+ {
+ char stats_string[200];
+
+ snprintf(stats_string, sizeof(stats_string),
+ "%zu total in %zu blocks (%zu chunks); %zu free (%zu chunks); %zu used",
+ totalspace, nblocks, nchunks, freespace,
+ nfreechunks, totalspace - freespace);
+ printfunc(context, passthru, stats_string, print_to_stderr);
+ }
+
+ if (totals)
+ {
+ totals->nblocks += nblocks;
+ totals->freechunks += nfreechunks;
+ totals->totalspace += totalspace;
+ totals->freespace += freespace;
+ }
+}
+
+
+#ifdef MEMORY_CONTEXT_CHECKING
+
+/*
+ * GenerationCheck
+ * Walk through chunks and check consistency of memory.
+ *
+ * NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll
+ * find yourself in an infinite loop when trouble occurs, because this
+ * routine will be entered again when elog cleanup tries to release memory!
+ */
+static void
+GenerationCheck(MemoryContext context)
+{
+ GenerationContext *gen = (GenerationContext *) context;
+ const char *name = context->name;
+ dlist_iter iter;
+ Size total_allocated = 0;
+
+ /* walk all blocks in this context */
+ dlist_foreach(iter, &gen->blocks)
+ {
+ GenerationBlock *block = dlist_container(GenerationBlock, node, iter.cur);
+ int nfree,
+ nchunks;
+ char *ptr;
+
+ total_allocated += block->blksize;
+
+ /*
+ * nfree > nchunks is surely wrong. Equality is allowed as the block
+ * might completely empty if it's the freeblock.
+ */
+ if (block->nfree > block->nchunks)
+ elog(WARNING, "problem in Generation %s: number of free chunks %d in block %p exceeds %d allocated",
+ name, block->nfree, block, block->nchunks);
+
+ /* Now walk through the chunks and count them. */
+ nfree = 0;
+ nchunks = 0;
+ ptr = ((char *) block) + Generation_BLOCKHDRSZ;
+
+ while (ptr < block->freeptr)
+ {
+ GenerationChunk *chunk = (GenerationChunk *) ptr;
+
+ /* Allow access to private part of chunk header. */
+ VALGRIND_MAKE_MEM_DEFINED(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+
+ /* move to the next chunk */
+ ptr += (chunk->size + Generation_CHUNKHDRSZ);
+
+ nchunks += 1;
+
+ /* chunks have both block and context pointers, so check both */
+ if (chunk->block != block)
+ elog(WARNING, "problem in Generation %s: bogus block link in block %p, chunk %p",
+ name, block, chunk);
+
+ /*
+ * Check for valid context pointer. Note this is an incomplete
+ * test, since palloc(0) produces an allocated chunk with
+ * requested_size == 0.
+ */
+ if ((chunk->requested_size > 0 && chunk->context != gen) ||
+ (chunk->context != gen && chunk->context != NULL))
+ elog(WARNING, "problem in Generation %s: bogus context link in block %p, chunk %p",
+ name, block, chunk);
+
+ /* now make sure the chunk size is correct */
+ if (chunk->size < chunk->requested_size ||
+ chunk->size != MAXALIGN(chunk->size))
+ elog(WARNING, "problem in Generation %s: bogus chunk size in block %p, chunk %p",
+ name, block, chunk);
+
+ /* is chunk allocated? */
+ if (chunk->context != NULL)
+ {
+ /* check sentinel, but only in allocated blocks */
+ if (chunk->requested_size < chunk->size &&
+ !sentinel_ok(chunk, Generation_CHUNKHDRSZ + chunk->requested_size))
+ elog(WARNING, "problem in Generation %s: detected write past chunk end in block %p, chunk %p",
+ name, block, chunk);
+ }
+ else
+ nfree += 1;
+
+ /*
+ * If chunk is allocated, disallow external access to private part
+ * of chunk header.
+ */
+ if (chunk->context != NULL)
+ VALGRIND_MAKE_MEM_NOACCESS(chunk, GENERATIONCHUNK_PRIVATE_LEN);
+ }
+
+ /*
+ * Make sure we got the expected number of allocated and free chunks
+ * (as tracked in the block header).
+ */
+ if (nchunks != block->nchunks)
+ elog(WARNING, "problem in Generation %s: number of allocated chunks %d in block %p does not match header %d",
+ name, nchunks, block, block->nchunks);
+
+ if (nfree != block->nfree)
+ elog(WARNING, "problem in Generation %s: number of free chunks %d in block %p does not match header %d",
+ name, nfree, block, block->nfree);
+ }
+
+ Assert(total_allocated == context->mem_allocated);
+}
+
+#endif /* MEMORY_CONTEXT_CHECKING */
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
new file mode 100644
index 0000000..e12be1b
--- /dev/null
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -0,0 +1,1341 @@
+/*-------------------------------------------------------------------------
+ *
+ * mcxt.c
+ * POSTGRES memory context management code.
+ *
+ * This module handles context management operations that are independent
+ * of the particular kind of context being operated on. It calls
+ * context-type-specific operations via the function pointers in a
+ * context's MemoryContextMethods struct.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/mcxt.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "storage/procsignal.h"
+#include "utils/fmgrprotos.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+
+
+/*****************************************************************************
+ * GLOBAL MEMORY *
+ *****************************************************************************/
+
+/*
+ * CurrentMemoryContext
+ * Default memory context for allocations.
+ */
+MemoryContext CurrentMemoryContext = NULL;
+
+/*
+ * Standard top-level contexts. For a description of the purpose of each
+ * of these contexts, refer to src/backend/utils/mmgr/README
+ */
+MemoryContext TopMemoryContext = NULL;
+MemoryContext ErrorContext = NULL;
+MemoryContext PostmasterContext = NULL;
+MemoryContext CacheMemoryContext = NULL;
+MemoryContext MessageContext = NULL;
+MemoryContext TopTransactionContext = NULL;
+MemoryContext CurTransactionContext = NULL;
+
+/* This is a transient link to the active portal's memory context: */
+MemoryContext PortalContext = NULL;
+
+static void MemoryContextCallResetCallbacks(MemoryContext context);
+static void MemoryContextStatsInternal(MemoryContext context, int level,
+ bool print, int max_children,
+ MemoryContextCounters *totals,
+ bool print_to_stderr);
+static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
+ const char *stats_string,
+ bool print_to_stderr);
+
+/*
+ * You should not do memory allocations within a critical section, because
+ * an out-of-memory error will be escalated to a PANIC. To enforce that
+ * rule, the allocation functions Assert that.
+ */
+#define AssertNotInCriticalSection(context) \
+ Assert(CritSectionCount == 0 || (context)->allowInCritSection)
+
+
+/*****************************************************************************
+ * EXPORTED ROUTINES *
+ *****************************************************************************/
+
+
+/*
+ * MemoryContextInit
+ * Start up the memory-context subsystem.
+ *
+ * This must be called before creating contexts or allocating memory in
+ * contexts. TopMemoryContext and ErrorContext are initialized here;
+ * other contexts must be created afterwards.
+ *
+ * In normal multi-backend operation, this is called once during
+ * postmaster startup, and not at all by individual backend startup
+ * (since the backends inherit an already-initialized context subsystem
+ * by virtue of being forked off the postmaster). But in an EXEC_BACKEND
+ * build, each process must do this for itself.
+ *
+ * In a standalone backend this must be called during backend startup.
+ */
+void
+MemoryContextInit(void)
+{
+ AssertState(TopMemoryContext == NULL);
+
+ /*
+ * First, initialize TopMemoryContext, which is the parent of all others.
+ */
+ TopMemoryContext = AllocSetContextCreate((MemoryContext) NULL,
+ "TopMemoryContext",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Not having any other place to point CurrentMemoryContext, make it point
+ * to TopMemoryContext. Caller should change this soon!
+ */
+ CurrentMemoryContext = TopMemoryContext;
+
+ /*
+ * Initialize ErrorContext as an AllocSetContext with slow growth rate ---
+ * we don't really expect much to be allocated in it. More to the point,
+ * require it to contain at least 8K at all times. This is the only case
+ * where retained memory in a context is *essential* --- we want to be
+ * sure ErrorContext still has some memory even if we've run out
+ * elsewhere! Also, allow allocations in ErrorContext within a critical
+ * section. Otherwise a PANIC will cause an assertion failure in the error
+ * reporting code, before printing out the real cause of the failure.
+ *
+ * This should be the last step in this function, as elog.c assumes memory
+ * management works once ErrorContext is non-null.
+ */
+ ErrorContext = AllocSetContextCreate(TopMemoryContext,
+ "ErrorContext",
+ 8 * 1024,
+ 8 * 1024,
+ 8 * 1024);
+ MemoryContextAllowInCriticalSection(ErrorContext, true);
+}
+
+/*
+ * MemoryContextReset
+ * Release all space allocated within a context and delete all its
+ * descendant contexts (but not the named context itself).
+ */
+void
+MemoryContextReset(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ /* save a function call in common case where there are no children */
+ if (context->firstchild != NULL)
+ MemoryContextDeleteChildren(context);
+
+ /* save a function call if no pallocs since startup or last reset */
+ if (!context->isReset)
+ MemoryContextResetOnly(context);
+}
+
+/*
+ * MemoryContextResetOnly
+ * Release all space allocated within a context.
+ * Nothing is done to the context's descendant contexts.
+ */
+void
+MemoryContextResetOnly(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ /* Nothing to do if no pallocs since startup or last reset */
+ if (!context->isReset)
+ {
+ MemoryContextCallResetCallbacks(context);
+
+ /*
+ * If context->ident points into the context's memory, it will become
+ * a dangling pointer. We could prevent that by setting it to NULL
+ * here, but that would break valid coding patterns that keep the
+ * ident elsewhere, e.g. in a parent context. Another idea is to use
+ * MemoryContextContains(), but we don't require ident strings to be
+ * in separately-palloc'd chunks, so that risks false positives. So
+ * for now we assume the programmer got it right.
+ */
+
+ context->methods->reset(context);
+ context->isReset = true;
+ VALGRIND_DESTROY_MEMPOOL(context);
+ VALGRIND_CREATE_MEMPOOL(context, 0, false);
+ }
+}
+
+/*
+ * MemoryContextResetChildren
+ * Release all space allocated within a context's descendants,
+ * but don't delete the contexts themselves. The named context
+ * itself is not touched.
+ */
+void
+MemoryContextResetChildren(MemoryContext context)
+{
+ MemoryContext child;
+
+ AssertArg(MemoryContextIsValid(context));
+
+ for (child = context->firstchild; child != NULL; child = child->nextchild)
+ {
+ MemoryContextResetChildren(child);
+ MemoryContextResetOnly(child);
+ }
+}
+
+/*
+ * MemoryContextDelete
+ * Delete a context and its descendants, and release all space
+ * allocated therein.
+ *
+ * The type-specific delete routine removes all storage for the context,
+ * but we have to recurse to handle the children.
+ * We must also delink the context from its parent, if it has one.
+ */
+void
+MemoryContextDelete(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+ /* We had better not be deleting TopMemoryContext ... */
+ Assert(context != TopMemoryContext);
+ /* And not CurrentMemoryContext, either */
+ Assert(context != CurrentMemoryContext);
+
+ /* save a function call in common case where there are no children */
+ if (context->firstchild != NULL)
+ MemoryContextDeleteChildren(context);
+
+ /*
+ * It's not entirely clear whether 'tis better to do this before or after
+ * delinking the context; but an error in a callback will likely result in
+ * leaking the whole context (if it's not a root context) if we do it
+ * after, so let's do it before.
+ */
+ MemoryContextCallResetCallbacks(context);
+
+ /*
+ * We delink the context from its parent before deleting it, so that if
+ * there's an error we won't have deleted/busted contexts still attached
+ * to the context tree. Better a leak than a crash.
+ */
+ MemoryContextSetParent(context, NULL);
+
+ /*
+ * Also reset the context's ident pointer, in case it points into the
+ * context. This would only matter if someone tries to get stats on the
+ * (already unlinked) context, which is unlikely, but let's be safe.
+ */
+ context->ident = NULL;
+
+ context->methods->delete_context(context);
+
+ VALGRIND_DESTROY_MEMPOOL(context);
+}
+
+/*
+ * MemoryContextDeleteChildren
+ * Delete all the descendants of the named context and release all
+ * space allocated therein. The named context itself is not touched.
+ */
+void
+MemoryContextDeleteChildren(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ /*
+ * MemoryContextDelete will delink the child from me, so just iterate as
+ * long as there is a child.
+ */
+ while (context->firstchild != NULL)
+ MemoryContextDelete(context->firstchild);
+}
+
+/*
+ * MemoryContextRegisterResetCallback
+ * Register a function to be called before next context reset/delete.
+ * Such callbacks will be called in reverse order of registration.
+ *
+ * The caller is responsible for allocating a MemoryContextCallback struct
+ * to hold the info about this callback request, and for filling in the
+ * "func" and "arg" fields in the struct to show what function to call with
+ * what argument. Typically the callback struct should be allocated within
+ * the specified context, since that means it will automatically be freed
+ * when no longer needed.
+ *
+ * There is no API for deregistering a callback once registered. If you
+ * want it to not do anything anymore, adjust the state pointed to by its
+ * "arg" to indicate that.
+ */
+void
+MemoryContextRegisterResetCallback(MemoryContext context,
+ MemoryContextCallback *cb)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ /* Push onto head so this will be called before older registrants. */
+ cb->next = context->reset_cbs;
+ context->reset_cbs = cb;
+ /* Mark the context as non-reset (it probably is already). */
+ context->isReset = false;
+}
+
+/*
+ * MemoryContextCallResetCallbacks
+ * Internal function to call all registered callbacks for context.
+ */
+static void
+MemoryContextCallResetCallbacks(MemoryContext context)
+{
+ MemoryContextCallback *cb;
+
+ /*
+ * We pop each callback from the list before calling. That way, if an
+ * error occurs inside the callback, we won't try to call it a second time
+ * in the likely event that we reset or delete the context later.
+ */
+ while ((cb = context->reset_cbs) != NULL)
+ {
+ context->reset_cbs = cb->next;
+ cb->func(cb->arg);
+ }
+}
+
+/*
+ * MemoryContextSetIdentifier
+ * Set the identifier string for a memory context.
+ *
+ * An identifier can be provided to help distinguish among different contexts
+ * of the same kind in memory context stats dumps. The identifier string
+ * must live at least as long as the context it is for; typically it is
+ * allocated inside that context, so that it automatically goes away on
+ * context deletion. Pass id = NULL to forget any old identifier.
+ */
+void
+MemoryContextSetIdentifier(MemoryContext context, const char *id)
+{
+ AssertArg(MemoryContextIsValid(context));
+ context->ident = id;
+}
+
+/*
+ * MemoryContextSetParent
+ * Change a context to belong to a new parent (or no parent).
+ *
+ * We provide this as an API function because it is sometimes useful to
+ * change a context's lifespan after creation. For example, a context
+ * might be created underneath a transient context, filled with data,
+ * and then reparented underneath CacheMemoryContext to make it long-lived.
+ * In this way no special effort is needed to get rid of the context in case
+ * a failure occurs before its contents are completely set up.
+ *
+ * Callers often assume that this function cannot fail, so don't put any
+ * elog(ERROR) calls in it.
+ *
+ * A possible caller error is to reparent a context under itself, creating
+ * a loop in the context graph. We assert here that context != new_parent,
+ * but checking for multi-level loops seems more trouble than it's worth.
+ */
+void
+MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
+{
+ AssertArg(MemoryContextIsValid(context));
+ AssertArg(context != new_parent);
+
+ /* Fast path if it's got correct parent already */
+ if (new_parent == context->parent)
+ return;
+
+ /* Delink from existing parent, if any */
+ if (context->parent)
+ {
+ MemoryContext parent = context->parent;
+
+ if (context->prevchild != NULL)
+ context->prevchild->nextchild = context->nextchild;
+ else
+ {
+ Assert(parent->firstchild == context);
+ parent->firstchild = context->nextchild;
+ }
+
+ if (context->nextchild != NULL)
+ context->nextchild->prevchild = context->prevchild;
+ }
+
+ /* And relink */
+ if (new_parent)
+ {
+ AssertArg(MemoryContextIsValid(new_parent));
+ context->parent = new_parent;
+ context->prevchild = NULL;
+ context->nextchild = new_parent->firstchild;
+ if (new_parent->firstchild != NULL)
+ new_parent->firstchild->prevchild = context;
+ new_parent->firstchild = context;
+ }
+ else
+ {
+ context->parent = NULL;
+ context->prevchild = NULL;
+ context->nextchild = NULL;
+ }
+}
+
+/*
+ * MemoryContextAllowInCriticalSection
+ * Allow/disallow allocations in this memory context within a critical
+ * section.
+ *
+ * Normally, memory allocations are not allowed within a critical section,
+ * because a failure would lead to PANIC. There are a few exceptions to
+ * that, like allocations related to debugging code that is not supposed to
+ * be enabled in production. This function can be used to exempt specific
+ * memory contexts from the assertion in palloc().
+ */
+void
+MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ context->allowInCritSection = allow;
+}
+
+/*
+ * GetMemoryChunkSpace
+ * Given a currently-allocated chunk, determine the total space
+ * it occupies (including all memory-allocation overhead).
+ *
+ * This is useful for measuring the total space occupied by a set of
+ * allocated chunks.
+ */
+Size
+GetMemoryChunkSpace(void *pointer)
+{
+ MemoryContext context = GetMemoryChunkContext(pointer);
+
+ return context->methods->get_chunk_space(context, pointer);
+}
+
+/*
+ * MemoryContextGetParent
+ * Get the parent context (if any) of the specified context
+ */
+MemoryContext
+MemoryContextGetParent(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ return context->parent;
+}
+
+/*
+ * MemoryContextIsEmpty
+ * Is a memory context empty of any allocated space?
+ */
+bool
+MemoryContextIsEmpty(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
+
+ /*
+ * For now, we consider a memory context nonempty if it has any children;
+ * perhaps this should be changed later.
+ */
+ if (context->firstchild != NULL)
+ return false;
+ /* Otherwise use the type-specific inquiry */
+ return context->methods->is_empty(context);
+}
+
+/*
+ * Find the memory allocated to blocks for this memory context. If recurse is
+ * true, also include children.
+ */
+Size
+MemoryContextMemAllocated(MemoryContext context, bool recurse)
+{
+ Size total = context->mem_allocated;
+
+ AssertArg(MemoryContextIsValid(context));
+
+ if (recurse)
+ {
+ MemoryContext child;
+
+ for (child = context->firstchild;
+ child != NULL;
+ child = child->nextchild)
+ total += MemoryContextMemAllocated(child, true);
+ }
+
+ return total;
+}
+
+/*
+ * MemoryContextStats
+ * Print statistics about the named context and all its descendants.
+ *
+ * This is just a debugging utility, so it's not very fancy. However, we do
+ * make some effort to summarize when the output would otherwise be very long.
+ * The statistics are sent to stderr.
+ */
+void
+MemoryContextStats(MemoryContext context)
+{
+ /* A hard-wired limit on the number of children is usually good enough */
+ MemoryContextStatsDetail(context, 100, true);
+}
+
+/*
+ * MemoryContextStatsDetail
+ *
+ * Entry point for use if you want to vary the number of child contexts shown.
+ *
+ * If print_to_stderr is true, print statistics about the memory contexts
+ * with fprintf(stderr), otherwise use ereport().
+ */
+void
+MemoryContextStatsDetail(MemoryContext context, int max_children,
+ bool print_to_stderr)
+{
+ MemoryContextCounters grand_totals;
+
+ memset(&grand_totals, 0, sizeof(grand_totals));
+
+ MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
+
+ if (print_to_stderr)
+ fprintf(stderr,
+ "Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
+ grand_totals.totalspace, grand_totals.nblocks,
+ grand_totals.freespace, grand_totals.freechunks,
+ grand_totals.totalspace - grand_totals.freespace);
+ else
+
+ /*
+ * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
+ * to the connected client.
+ *
+ * We don't buffer the information about all memory contexts in a
+ * backend into StringInfo and log it as one message. Otherwise which
+ * may require the buffer to be enlarged very much and lead to OOM
+ * error since there can be a large number of memory contexts in a
+ * backend. Instead, we log one message per memory context.
+ */
+ ereport(LOG_SERVER_ONLY,
+ (errhidestmt(true),
+ errhidecontext(true),
+ errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
+ grand_totals.totalspace, grand_totals.nblocks,
+ grand_totals.freespace, grand_totals.freechunks,
+ grand_totals.totalspace - grand_totals.freespace)));
+}
+
+/*
+ * MemoryContextStatsInternal
+ * One recursion level for MemoryContextStats
+ *
+ * Print this context if print is true, but in any case accumulate counts into
+ * *totals (if given).
+ */
+static void
+MemoryContextStatsInternal(MemoryContext context, int level,
+ bool print, int max_children,
+ MemoryContextCounters *totals,
+ bool print_to_stderr)
+{
+ MemoryContextCounters local_totals;
+ MemoryContext child;
+ int ichild;
+
+ AssertArg(MemoryContextIsValid(context));
+
+ /* Examine the context itself */
+ context->methods->stats(context,
+ print ? MemoryContextStatsPrint : NULL,
+ (void *) &level,
+ totals, print_to_stderr);
+
+ /*
+ * Examine children. If there are more than max_children of them, we do
+ * not print the rest explicitly, but just summarize them.
+ */
+ memset(&local_totals, 0, sizeof(local_totals));
+
+ for (child = context->firstchild, ichild = 0;
+ child != NULL;
+ child = child->nextchild, ichild++)
+ {
+ if (ichild < max_children)
+ MemoryContextStatsInternal(child, level + 1,
+ print, max_children,
+ totals,
+ print_to_stderr);
+ else
+ MemoryContextStatsInternal(child, level + 1,
+ false, max_children,
+ &local_totals,
+ print_to_stderr);
+ }
+
+ /* Deal with excess children */
+ if (ichild > max_children)
+ {
+ if (print)
+ {
+ if (print_to_stderr)
+ {
+ int i;
+
+ for (i = 0; i <= level; i++)
+ fprintf(stderr, " ");
+ fprintf(stderr,
+ "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
+ ichild - max_children,
+ local_totals.totalspace,
+ local_totals.nblocks,
+ local_totals.freespace,
+ local_totals.freechunks,
+ local_totals.totalspace - local_totals.freespace);
+ }
+ else
+ ereport(LOG_SERVER_ONLY,
+ (errhidestmt(true),
+ errhidecontext(true),
+ errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
+ level,
+ ichild - max_children,
+ local_totals.totalspace,
+ local_totals.nblocks,
+ local_totals.freespace,
+ local_totals.freechunks,
+ local_totals.totalspace - local_totals.freespace)));
+ }
+
+ if (totals)
+ {
+ totals->nblocks += local_totals.nblocks;
+ totals->freechunks += local_totals.freechunks;
+ totals->totalspace += local_totals.totalspace;
+ totals->freespace += local_totals.freespace;
+ }
+ }
+}
+
+/*
+ * MemoryContextStatsPrint
+ * Print callback used by MemoryContextStatsInternal
+ *
+ * For now, the passthru pointer just points to "int level"; later we might
+ * make that more complicated.
+ */
+static void
+MemoryContextStatsPrint(MemoryContext context, void *passthru,
+ const char *stats_string,
+ bool print_to_stderr)
+{
+ int level = *(int *) passthru;
+ const char *name = context->name;
+ const char *ident = context->ident;
+ char truncated_ident[110];
+ int i;
+
+ /*
+ * It seems preferable to label dynahash contexts with just the hash table
+ * name. Those are already unique enough, so the "dynahash" part isn't
+ * very helpful, and this way is more consistent with pre-v11 practice.
+ */
+ if (ident && strcmp(name, "dynahash") == 0)
+ {
+ name = ident;
+ ident = NULL;
+ }
+
+ truncated_ident[0] = '\0';
+
+ if (ident)
+ {
+ /*
+ * Some contexts may have very long identifiers (e.g., SQL queries).
+ * Arbitrarily truncate at 100 bytes, but be careful not to break
+ * multibyte characters. Also, replace ASCII control characters, such
+ * as newlines, with spaces.
+ */
+ int idlen = strlen(ident);
+ bool truncated = false;
+
+ strcpy(truncated_ident, ": ");
+ i = strlen(truncated_ident);
+
+ if (idlen > 100)
+ {
+ idlen = pg_mbcliplen(ident, idlen, 100);
+ truncated = true;
+ }
+
+ while (idlen-- > 0)
+ {
+ unsigned char c = *ident++;
+
+ if (c < ' ')
+ c = ' ';
+ truncated_ident[i++] = c;
+ }
+ truncated_ident[i] = '\0';
+
+ if (truncated)
+ strcat(truncated_ident, "...");
+ }
+
+ if (print_to_stderr)
+ {
+ for (i = 0; i < level; i++)
+ fprintf(stderr, " ");
+ fprintf(stderr, "%s: %s%s\n", name, stats_string, truncated_ident);
+ }
+ else
+ ereport(LOG_SERVER_ONLY,
+ (errhidestmt(true),
+ errhidecontext(true),
+ errmsg_internal("level: %d; %s: %s%s",
+ level, name, stats_string, truncated_ident)));
+}
+
+/*
+ * MemoryContextCheck
+ * Check all chunks in the named context.
+ *
+ * This is just a debugging utility, so it's not fancy.
+ */
+#ifdef MEMORY_CONTEXT_CHECKING
+void
+MemoryContextCheck(MemoryContext context)
+{
+ MemoryContext child;
+
+ AssertArg(MemoryContextIsValid(context));
+
+ context->methods->check(context);
+ for (child = context->firstchild; child != NULL; child = child->nextchild)
+ MemoryContextCheck(child);
+}
+#endif
+
+/*
+ * MemoryContextContains
+ * Detect whether an allocated chunk of memory belongs to a given
+ * context or not.
+ *
+ * Caution: this test is reliable as long as 'pointer' does point to
+ * a chunk of memory allocated from *some* context. If 'pointer' points
+ * at memory obtained in some other way, there is a small chance of a
+ * false-positive result, since the bits right before it might look like
+ * a valid chunk header by chance.
+ */
+bool
+MemoryContextContains(MemoryContext context, void *pointer)
+{
+ MemoryContext ptr_context;
+
+ /*
+ * NB: Can't use GetMemoryChunkContext() here - that performs assertions
+ * that aren't acceptable here since we might be passed memory not
+ * allocated by any memory context.
+ *
+ * Try to detect bogus pointers handed to us, poorly though we can.
+ * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
+ * allocated chunk.
+ */
+ if (pointer == NULL || pointer != (void *) MAXALIGN(pointer))
+ return false;
+
+ /*
+ * OK, it's probably safe to look at the context.
+ */
+ ptr_context = *(MemoryContext *) (((char *) pointer) - sizeof(void *));
+
+ return ptr_context == context;
+}
+
+/*
+ * MemoryContextCreate
+ * Context-type-independent part of context creation.
+ *
+ * This is only intended to be called by context-type-specific
+ * context creation routines, not by the unwashed masses.
+ *
+ * The memory context creation procedure goes like this:
+ * 1. Context-type-specific routine makes some initial space allocation,
+ * including enough space for the context header. If it fails,
+ * it can ereport() with no damage done.
+ * 2. Context-type-specific routine sets up all type-specific fields of
+ * the header (those beyond MemoryContextData proper), as well as any
+ * other management fields it needs to have a fully valid context.
+ * Usually, failure in this step is impossible, but if it's possible
+ * the initial space allocation should be freed before ereport'ing.
+ * 3. Context-type-specific routine calls MemoryContextCreate() to fill in
+ * the generic header fields and link the context into the context tree.
+ * 4. We return to the context-type-specific routine, which finishes
+ * up type-specific initialization. This routine can now do things
+ * that might fail (like allocate more memory), so long as it's
+ * sure the node is left in a state that delete will handle.
+ *
+ * node: the as-yet-uninitialized common part of the context header node.
+ * tag: NodeTag code identifying the memory context type.
+ * methods: context-type-specific methods (usually statically allocated).
+ * parent: parent context, or NULL if this will be a top-level context.
+ * name: name of context (must be statically allocated).
+ *
+ * Context routines generally assume that MemoryContextCreate can't fail,
+ * so this can contain Assert but not elog/ereport.
+ */
+void
+MemoryContextCreate(MemoryContext node,
+ NodeTag tag,
+ const MemoryContextMethods *methods,
+ MemoryContext parent,
+ const char *name)
+{
+ /* Creating new memory contexts is not allowed in a critical section */
+ Assert(CritSectionCount == 0);
+
+ /* Initialize all standard fields of memory context header */
+ node->type = tag;
+ node->isReset = true;
+ node->methods = methods;
+ node->parent = parent;
+ node->firstchild = NULL;
+ node->mem_allocated = 0;
+ node->prevchild = NULL;
+ node->name = name;
+ node->ident = NULL;
+ node->reset_cbs = NULL;
+
+ /* OK to link node into context tree */
+ if (parent)
+ {
+ node->nextchild = parent->firstchild;
+ if (parent->firstchild != NULL)
+ parent->firstchild->prevchild = node;
+ parent->firstchild = node;
+ /* inherit allowInCritSection flag from parent */
+ node->allowInCritSection = parent->allowInCritSection;
+ }
+ else
+ {
+ node->nextchild = NULL;
+ node->allowInCritSection = false;
+ }
+
+ VALGRIND_CREATE_MEMPOOL(node, 0, false);
+}
+
+/*
+ * MemoryContextAlloc
+ * Allocate space within the specified context.
+ *
+ * This could be turned into a macro, but we'd have to import
+ * nodes/memnodes.h into postgres.h which seems a bad idea.
+ */
+void *
+MemoryContextAlloc(MemoryContext context, Size size)
+{
+ void *ret;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+
+ /*
+ * Here, and elsewhere in this module, we show the target context's
+ * "name" but not its "ident" (if any) in user-visible error messages.
+ * The "ident" string might contain security-sensitive data, such as
+ * values in SQL commands.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ return ret;
+}
+
+/*
+ * MemoryContextAllocZero
+ * Like MemoryContextAlloc, but clears allocated memory
+ *
+ * We could just call MemoryContextAlloc then clear the memory, but this
+ * is a very common combination, so we provide the combined operation.
+ */
+void *
+MemoryContextAllocZero(MemoryContext context, Size size)
+{
+ void *ret;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ MemSetAligned(ret, 0, size);
+
+ return ret;
+}
+
+/*
+ * MemoryContextAllocZeroAligned
+ * MemoryContextAllocZero where length is suitable for MemSetLoop
+ *
+ * This might seem overly specialized, but it's not because newNode()
+ * is so often called with compile-time-constant sizes.
+ */
+void *
+MemoryContextAllocZeroAligned(MemoryContext context, Size size)
+{
+ void *ret;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ MemSetLoop(ret, 0, size);
+
+ return ret;
+}
+
+/*
+ * MemoryContextAllocExtended
+ * Allocate space within the specified context using the given flags.
+ */
+void *
+MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
+{
+ void *ret;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
+ ((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+ return NULL;
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ if ((flags & MCXT_ALLOC_ZERO) != 0)
+ MemSetAligned(ret, 0, size);
+
+ return ret;
+}
+
+/*
+ * HandleLogMemoryContextInterrupt
+ * Handle receipt of an interrupt indicating logging of memory
+ * contexts.
+ *
+ * All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
+ * because we cannot safely emit a log message inside the signal handler.
+ */
+void
+HandleLogMemoryContextInterrupt(void)
+{
+ InterruptPending = true;
+ LogMemoryContextPending = true;
+ /* latch will be set by procsignal_sigusr1_handler */
+}
+
+/*
+ * ProcessLogMemoryContextInterrupt
+ * Perform logging of memory contexts of this backend process.
+ *
+ * Any backend that participates in ProcSignal signaling must arrange
+ * to call this function if we see LogMemoryContextPending set.
+ * It is called from CHECK_FOR_INTERRUPTS(), which is enough because
+ * the target process for logging of memory contexts is a backend.
+ */
+void
+ProcessLogMemoryContextInterrupt(void)
+{
+ LogMemoryContextPending = false;
+
+ /*
+ * Use LOG_SERVER_ONLY to prevent this message from being sent to the
+ * connected client.
+ */
+ ereport(LOG_SERVER_ONLY,
+ (errhidestmt(true),
+ errhidecontext(true),
+ errmsg("logging memory contexts of PID %d", MyProcPid)));
+
+ /*
+ * When a backend process is consuming huge memory, logging all its memory
+ * contexts might overrun available disk space. To prevent this, we limit
+ * the number of child contexts to log per parent to 100.
+ *
+ * As with MemoryContextStats(), we suppose that practical cases where the
+ * dump gets long will typically be huge numbers of siblings under the
+ * same parent context; while the additional debugging value from seeing
+ * details about individual siblings beyond 100 will not be large.
+ */
+ MemoryContextStatsDetail(TopMemoryContext, 100, false);
+}
+
+void *
+palloc(Size size)
+{
+ /* duplicates MemoryContextAlloc to avoid increased overhead */
+ void *ret;
+ MemoryContext context = CurrentMemoryContext;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ return ret;
+}
+
+void *
+palloc0(Size size)
+{
+ /* duplicates MemoryContextAllocZero to avoid increased overhead */
+ void *ret;
+ MemoryContext context = CurrentMemoryContext;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ MemSetAligned(ret, 0, size);
+
+ return ret;
+}
+
+void *
+palloc_extended(Size size, int flags)
+{
+ /* duplicates MemoryContextAllocExtended to avoid increased overhead */
+ void *ret;
+ MemoryContext context = CurrentMemoryContext;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
+ ((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+ return NULL;
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ if ((flags & MCXT_ALLOC_ZERO) != 0)
+ MemSetAligned(ret, 0, size);
+
+ return ret;
+}
+
+/*
+ * pfree
+ * Release an allocated chunk.
+ */
+void
+pfree(void *pointer)
+{
+ MemoryContext context = GetMemoryChunkContext(pointer);
+
+ context->methods->free_p(context, pointer);
+ VALGRIND_MEMPOOL_FREE(context, pointer);
+}
+
+/*
+ * repalloc
+ * Adjust the size of a previously allocated chunk.
+ */
+void *
+repalloc(void *pointer, Size size)
+{
+ MemoryContext context = GetMemoryChunkContext(pointer);
+ void *ret;
+
+ if (!AllocSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ AssertNotInCriticalSection(context);
+
+ /* isReset must be false already */
+ Assert(!context->isReset);
+
+ ret = context->methods->realloc(context, pointer, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
+
+ return ret;
+}
+
+/*
+ * MemoryContextAllocHuge
+ * Allocate (possibly-expansive) space within the specified context.
+ *
+ * See considerations in comment at MaxAllocHugeSize.
+ */
+void *
+MemoryContextAllocHuge(MemoryContext context, Size size)
+{
+ void *ret;
+
+ AssertArg(MemoryContextIsValid(context));
+ AssertNotInCriticalSection(context);
+
+ if (!AllocHugeSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ context->isReset = false;
+
+ ret = context->methods->alloc(context, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
+
+ return ret;
+}
+
+/*
+ * repalloc_huge
+ * Adjust the size of a previously allocated chunk, permitting a large
+ * value. The previous allocation need not have been "huge".
+ */
+void *
+repalloc_huge(void *pointer, Size size)
+{
+ MemoryContext context = GetMemoryChunkContext(pointer);
+ void *ret;
+
+ if (!AllocHugeSizeIsValid(size))
+ elog(ERROR, "invalid memory alloc request size %zu", size);
+
+ AssertNotInCriticalSection(context);
+
+ /* isReset must be false already */
+ Assert(!context->isReset);
+
+ ret = context->methods->realloc(context, pointer, size);
+ if (unlikely(ret == NULL))
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
+ size, context->name)));
+ }
+
+ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
+
+ return ret;
+}
+
+/*
+ * MemoryContextStrdup
+ * Like strdup(), but allocate from the specified context
+ */
+char *
+MemoryContextStrdup(MemoryContext context, const char *string)
+{
+ char *nstr;
+ Size len = strlen(string) + 1;
+
+ nstr = (char *) MemoryContextAlloc(context, len);
+
+ memcpy(nstr, string, len);
+
+ return nstr;
+}
+
+char *
+pstrdup(const char *in)
+{
+ return MemoryContextStrdup(CurrentMemoryContext, in);
+}
+
+/*
+ * pnstrdup
+ * Like pstrdup(), but append null byte to a
+ * not-necessarily-null-terminated input string.
+ */
+char *
+pnstrdup(const char *in, Size len)
+{
+ char *out;
+
+ len = strnlen(in, len);
+
+ out = palloc(len + 1);
+ memcpy(out, in, len);
+ out[len] = '\0';
+
+ return out;
+}
+
+/*
+ * Make copy of string with all trailing newline characters removed.
+ */
+char *
+pchomp(const char *in)
+{
+ size_t n;
+
+ n = strlen(in);
+ while (n > 0 && in[n - 1] == '\n')
+ n--;
+ return pnstrdup(in, n);
+}
diff --git a/src/backend/utils/mmgr/memdebug.c b/src/backend/utils/mmgr/memdebug.c
new file mode 100644
index 0000000..e80d171
--- /dev/null
+++ b/src/backend/utils/mmgr/memdebug.c
@@ -0,0 +1,93 @@
+/*-------------------------------------------------------------------------
+ *
+ * memdebug.c
+ * Declarations used in memory context implementations, not part of the
+ * public API of the memory management subsystem.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/utils/mmgr/memdebug.c
+ *
+ *
+ * About CLOBBER_FREED_MEMORY:
+ *
+ * If this symbol is defined, all freed memory is overwritten with 0x7F's.
+ * This is useful for catching places that reference already-freed memory.
+ *
+ * About MEMORY_CONTEXT_CHECKING:
+ *
+ * Since we usually round request sizes up to the next power of 2, there
+ * is often some unused space immediately after a requested data area.
+ * Thus, if someone makes the common error of writing past what they've
+ * requested, the problem is likely to go unnoticed ... until the day when
+ * there *isn't* any wasted space, perhaps because of different memory
+ * alignment on a new platform, or some other effect. To catch this sort
+ * of problem, the MEMORY_CONTEXT_CHECKING option stores 0x7E just beyond
+ * the requested space whenever the request is less than the actual chunk
+ * size, and verifies that the byte is undamaged when the chunk is freed.
+ *
+ *
+ * About USE_VALGRIND and Valgrind client requests:
+ *
+ * Valgrind provides "client request" macros that exchange information with
+ * the host Valgrind (if any). Under !USE_VALGRIND, memdebug.h stubs out
+ * currently-used macros.
+ *
+ * When running under Valgrind, we want a NOACCESS memory region both before
+ * and after the allocation. The chunk header is tempting as the preceding
+ * region, but mcxt.c expects to able to examine the standard chunk header
+ * fields. Therefore, we use, when available, the requested_size field and
+ * any subsequent padding. requested_size is made NOACCESS before returning
+ * a chunk pointer to a caller. However, to reduce client request traffic,
+ * it is kept DEFINED in chunks on the free list.
+ *
+ * The rounded-up capacity of the chunk usually acts as a post-allocation
+ * NOACCESS region. If the request consumes precisely the entire chunk,
+ * there is no such region; another chunk header may immediately follow. In
+ * that case, Valgrind will not detect access beyond the end of the chunk.
+ *
+ * See also the cooperating Valgrind client requests in mcxt.c.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "utils/memdebug.h"
+
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+
+/*
+ * Fill a just-allocated piece of memory with "random" data. It's not really
+ * very random, just a repeating sequence with a length that's prime. What
+ * we mainly want out of it is to have a good probability that two palloc's
+ * of the same number of bytes start out containing different data.
+ *
+ * The region may be NOACCESS, so make it UNDEFINED first to avoid errors as
+ * we fill it. Filling the region makes it DEFINED, so make it UNDEFINED
+ * again afterward. Whether to finally make it UNDEFINED or NOACCESS is
+ * fairly arbitrary. UNDEFINED is more convenient for SlabRealloc(), and
+ * other callers have no preference.
+ */
+void
+randomize_mem(char *ptr, size_t size)
+{
+ static int save_ctr = 1;
+ size_t remaining = size;
+ int ctr;
+
+ ctr = save_ctr;
+ VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
+ while (remaining-- > 0)
+ {
+ *ptr++ = ctr;
+ if (++ctr > 251)
+ ctr = 1;
+ }
+ VALGRIND_MAKE_MEM_UNDEFINED(ptr - size, size);
+ save_ctr = ctr;
+}
+
+#endif /* RANDOMIZE_ALLOCATED_MEMORY */
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
new file mode 100644
index 0000000..7409593
--- /dev/null
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -0,0 +1,1293 @@
+/*-------------------------------------------------------------------------
+ *
+ * portalmem.c
+ * backend portal memory management
+ *
+ * Portals are objects representing the execution state of a query.
+ * This module provides memory management services for portals, but it
+ * doesn't actually run the executor for them.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/portalmem.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "catalog/pg_type.h"
+#include "commands/portalcmds.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "storage/ipc.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/snapmgr.h"
+#include "utils/timestamp.h"
+
+/*
+ * Estimate of the maximum number of open portals a user would have,
+ * used in initially sizing the PortalHashTable in EnablePortalManager().
+ * Since the hash table can expand, there's no need to make this overly
+ * generous, and keeping it small avoids unnecessary overhead in the
+ * hash_seq_search() calls executed during transaction end.
+ */
+#define PORTALS_PER_USER 16
+
+
+/* ----------------
+ * Global state
+ * ----------------
+ */
+
+#define MAX_PORTALNAME_LEN NAMEDATALEN
+
+typedef struct portalhashent
+{
+ char portalname[MAX_PORTALNAME_LEN];
+ Portal portal;
+} PortalHashEnt;
+
+static HTAB *PortalHashTable = NULL;
+
+#define PortalHashTableLookup(NAME, PORTAL) \
+do { \
+ PortalHashEnt *hentry; \
+ \
+ hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
+ (NAME), HASH_FIND, NULL); \
+ if (hentry) \
+ PORTAL = hentry->portal; \
+ else \
+ PORTAL = NULL; \
+} while(0)
+
+#define PortalHashTableInsert(PORTAL, NAME) \
+do { \
+ PortalHashEnt *hentry; bool found; \
+ \
+ hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
+ (NAME), HASH_ENTER, &found); \
+ if (found) \
+ elog(ERROR, "duplicate portal name"); \
+ hentry->portal = PORTAL; \
+ /* To avoid duplicate storage, make PORTAL->name point to htab entry */ \
+ PORTAL->name = hentry->portalname; \
+} while(0)
+
+#define PortalHashTableDelete(PORTAL) \
+do { \
+ PortalHashEnt *hentry; \
+ \
+ hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
+ PORTAL->name, HASH_REMOVE, NULL); \
+ if (hentry == NULL) \
+ elog(WARNING, "trying to delete portal name that does not exist"); \
+} while(0)
+
+static MemoryContext TopPortalContext = NULL;
+
+
+/* ----------------------------------------------------------------
+ * public portal interface functions
+ * ----------------------------------------------------------------
+ */
+
+/*
+ * EnablePortalManager
+ * Enables the portal management module at backend startup.
+ */
+void
+EnablePortalManager(void)
+{
+ HASHCTL ctl;
+
+ Assert(TopPortalContext == NULL);
+
+ TopPortalContext = AllocSetContextCreate(TopMemoryContext,
+ "TopPortalContext",
+ ALLOCSET_DEFAULT_SIZES);
+
+ ctl.keysize = MAX_PORTALNAME_LEN;
+ ctl.entrysize = sizeof(PortalHashEnt);
+
+ /*
+ * use PORTALS_PER_USER as a guess of how many hash table entries to
+ * create, initially
+ */
+ PortalHashTable = hash_create("Portal hash", PORTALS_PER_USER,
+ &ctl, HASH_ELEM | HASH_STRINGS);
+}
+
+/*
+ * GetPortalByName
+ * Returns a portal given a portal name, or NULL if name not found.
+ */
+Portal
+GetPortalByName(const char *name)
+{
+ Portal portal;
+
+ if (PointerIsValid(name))
+ PortalHashTableLookup(name, portal);
+ else
+ portal = NULL;
+
+ return portal;
+}
+
+/*
+ * PortalGetPrimaryStmt
+ * Get the "primary" stmt within a portal, ie, the one marked canSetTag.
+ *
+ * Returns NULL if no such stmt. If multiple PlannedStmt structs within the
+ * portal are marked canSetTag, returns the first one. Neither of these
+ * cases should occur in present usages of this function.
+ */
+PlannedStmt *
+PortalGetPrimaryStmt(Portal portal)
+{
+ ListCell *lc;
+
+ foreach(lc, portal->stmts)
+ {
+ PlannedStmt *stmt = lfirst_node(PlannedStmt, lc);
+
+ if (stmt->canSetTag)
+ return stmt;
+ }
+ return NULL;
+}
+
+/*
+ * CreatePortal
+ * Returns a new portal given a name.
+ *
+ * allowDup: if true, automatically drop any pre-existing portal of the
+ * same name (if false, an error is raised).
+ *
+ * dupSilent: if true, don't even emit a WARNING.
+ */
+Portal
+CreatePortal(const char *name, bool allowDup, bool dupSilent)
+{
+ Portal portal;
+
+ AssertArg(PointerIsValid(name));
+
+ portal = GetPortalByName(name);
+ if (PortalIsValid(portal))
+ {
+ if (!allowDup)
+ ereport(ERROR,
+ (errcode(ERRCODE_DUPLICATE_CURSOR),
+ errmsg("cursor \"%s\" already exists", name)));
+ if (!dupSilent)
+ ereport(WARNING,
+ (errcode(ERRCODE_DUPLICATE_CURSOR),
+ errmsg("closing existing cursor \"%s\"",
+ name)));
+ PortalDrop(portal, false);
+ }
+
+ /* make new portal structure */
+ portal = (Portal) MemoryContextAllocZero(TopPortalContext, sizeof *portal);
+
+ /* initialize portal context; typically it won't store much */
+ portal->portalContext = AllocSetContextCreate(TopPortalContext,
+ "PortalContext",
+ ALLOCSET_SMALL_SIZES);
+
+ /* create a resource owner for the portal */
+ portal->resowner = ResourceOwnerCreate(CurTransactionResourceOwner,
+ "Portal");
+
+ /* initialize portal fields that don't start off zero */
+ portal->status = PORTAL_NEW;
+ portal->cleanup = PortalCleanup;
+ portal->createSubid = GetCurrentSubTransactionId();
+ portal->activeSubid = portal->createSubid;
+ portal->createLevel = GetCurrentTransactionNestLevel();
+ portal->strategy = PORTAL_MULTI_QUERY;
+ portal->cursorOptions = CURSOR_OPT_NO_SCROLL;
+ portal->atStart = true;
+ portal->atEnd = true; /* disallow fetches until query is set */
+ portal->visible = true;
+ portal->creation_time = GetCurrentStatementStartTimestamp();
+
+ /* put portal in table (sets portal->name) */
+ PortalHashTableInsert(portal, name);
+
+ /* for named portals reuse portal->name copy */
+ MemoryContextSetIdentifier(portal->portalContext, portal->name[0] ? portal->name : "<unnamed>");
+
+ return portal;
+}
+
+/*
+ * CreateNewPortal
+ * Create a new portal, assigning it a random nonconflicting name.
+ */
+Portal
+CreateNewPortal(void)
+{
+ static unsigned int unnamed_portal_count = 0;
+
+ char portalname[MAX_PORTALNAME_LEN];
+
+ /* Select a nonconflicting name */
+ for (;;)
+ {
+ unnamed_portal_count++;
+ sprintf(portalname, "<unnamed portal %u>", unnamed_portal_count);
+ if (GetPortalByName(portalname) == NULL)
+ break;
+ }
+
+ return CreatePortal(portalname, false, false);
+}
+
+/*
+ * PortalDefineQuery
+ * A simple subroutine to establish a portal's query.
+ *
+ * Notes: as of PG 8.4, caller MUST supply a sourceText string; it is not
+ * allowed anymore to pass NULL. (If you really don't have source text,
+ * you can pass a constant string, perhaps "(query not available)".)
+ *
+ * commandTag shall be NULL if and only if the original query string
+ * (before rewriting) was an empty string. Also, the passed commandTag must
+ * be a pointer to a constant string, since it is not copied.
+ *
+ * If cplan is provided, then it is a cached plan containing the stmts, and
+ * the caller must have done GetCachedPlan(), causing a refcount increment.
+ * The refcount will be released when the portal is destroyed.
+ *
+ * If cplan is NULL, then it is the caller's responsibility to ensure that
+ * the passed plan trees have adequate lifetime. Typically this is done by
+ * copying them into the portal's context.
+ *
+ * The caller is also responsible for ensuring that the passed prepStmtName
+ * (if not NULL) and sourceText have adequate lifetime.
+ *
+ * NB: this function mustn't do much beyond storing the passed values; in
+ * particular don't do anything that risks elog(ERROR). If that were to
+ * happen here before storing the cplan reference, we'd leak the plancache
+ * refcount that the caller is trying to hand off to us.
+ */
+void
+PortalDefineQuery(Portal portal,
+ const char *prepStmtName,
+ const char *sourceText,
+ CommandTag commandTag,
+ List *stmts,
+ CachedPlan *cplan)
+{
+ AssertArg(PortalIsValid(portal));
+ AssertState(portal->status == PORTAL_NEW);
+
+ AssertArg(sourceText != NULL);
+ AssertArg(commandTag != CMDTAG_UNKNOWN || stmts == NIL);
+
+ portal->prepStmtName = prepStmtName;
+ portal->sourceText = sourceText;
+ portal->qc.commandTag = commandTag;
+ portal->qc.nprocessed = 0;
+ portal->commandTag = commandTag;
+ portal->stmts = stmts;
+ portal->cplan = cplan;
+ portal->status = PORTAL_DEFINED;
+}
+
+/*
+ * PortalReleaseCachedPlan
+ * Release a portal's reference to its cached plan, if any.
+ */
+static void
+PortalReleaseCachedPlan(Portal portal)
+{
+ if (portal->cplan)
+ {
+ ReleaseCachedPlan(portal->cplan, NULL);
+ portal->cplan = NULL;
+
+ /*
+ * We must also clear portal->stmts which is now a dangling reference
+ * to the cached plan's plan list. This protects any code that might
+ * try to examine the Portal later.
+ */
+ portal->stmts = NIL;
+ }
+}
+
+/*
+ * PortalCreateHoldStore
+ * Create the tuplestore for a portal.
+ */
+void
+PortalCreateHoldStore(Portal portal)
+{
+ MemoryContext oldcxt;
+
+ Assert(portal->holdContext == NULL);
+ Assert(portal->holdStore == NULL);
+ Assert(portal->holdSnapshot == NULL);
+
+ /*
+ * Create the memory context that is used for storage of the tuple set.
+ * Note this is NOT a child of the portal's portalContext.
+ */
+ portal->holdContext =
+ AllocSetContextCreate(TopPortalContext,
+ "PortalHoldContext",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Create the tuple store, selecting cross-transaction temp files, and
+ * enabling random access only if cursor requires scrolling.
+ *
+ * XXX: Should maintenance_work_mem be used for the portal size?
+ */
+ oldcxt = MemoryContextSwitchTo(portal->holdContext);
+
+ portal->holdStore =
+ tuplestore_begin_heap(portal->cursorOptions & CURSOR_OPT_SCROLL,
+ true, work_mem);
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * PinPortal
+ * Protect a portal from dropping.
+ *
+ * A pinned portal is still unpinned and dropped at transaction or
+ * subtransaction abort.
+ */
+void
+PinPortal(Portal portal)
+{
+ if (portal->portalPinned)
+ elog(ERROR, "portal already pinned");
+
+ portal->portalPinned = true;
+}
+
+void
+UnpinPortal(Portal portal)
+{
+ if (!portal->portalPinned)
+ elog(ERROR, "portal not pinned");
+
+ portal->portalPinned = false;
+}
+
+/*
+ * MarkPortalActive
+ * Transition a portal from READY to ACTIVE state.
+ *
+ * NOTE: never set portal->status = PORTAL_ACTIVE directly; call this instead.
+ */
+void
+MarkPortalActive(Portal portal)
+{
+ /* For safety, this is a runtime test not just an Assert */
+ if (portal->status != PORTAL_READY)
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("portal \"%s\" cannot be run", portal->name)));
+ /* Perform the state transition */
+ portal->status = PORTAL_ACTIVE;
+ portal->activeSubid = GetCurrentSubTransactionId();
+}
+
+/*
+ * MarkPortalDone
+ * Transition a portal from ACTIVE to DONE state.
+ *
+ * NOTE: never set portal->status = PORTAL_DONE directly; call this instead.
+ */
+void
+MarkPortalDone(Portal portal)
+{
+ /* Perform the state transition */
+ Assert(portal->status == PORTAL_ACTIVE);
+ portal->status = PORTAL_DONE;
+
+ /*
+ * Allow portalcmds.c to clean up the state it knows about. We might as
+ * well do that now, since the portal can't be executed any more.
+ *
+ * In some cases involving execution of a ROLLBACK command in an already
+ * aborted transaction, this is necessary, or we'd reach AtCleanup_Portals
+ * with the cleanup hook still unexecuted.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ portal->cleanup(portal);
+ portal->cleanup = NULL;
+ }
+}
+
+/*
+ * MarkPortalFailed
+ * Transition a portal into FAILED state.
+ *
+ * NOTE: never set portal->status = PORTAL_FAILED directly; call this instead.
+ */
+void
+MarkPortalFailed(Portal portal)
+{
+ /* Perform the state transition */
+ Assert(portal->status != PORTAL_DONE);
+ portal->status = PORTAL_FAILED;
+
+ /*
+ * Allow portalcmds.c to clean up the state it knows about. We might as
+ * well do that now, since the portal can't be executed any more.
+ *
+ * In some cases involving cleanup of an already aborted transaction, this
+ * is necessary, or we'd reach AtCleanup_Portals with the cleanup hook
+ * still unexecuted.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ portal->cleanup(portal);
+ portal->cleanup = NULL;
+ }
+}
+
+/*
+ * PortalDrop
+ * Destroy the portal.
+ */
+void
+PortalDrop(Portal portal, bool isTopCommit)
+{
+ AssertArg(PortalIsValid(portal));
+
+ /*
+ * Don't allow dropping a pinned portal, it's still needed by whoever
+ * pinned it.
+ */
+ if (portal->portalPinned)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_CURSOR_STATE),
+ errmsg("cannot drop pinned portal \"%s\"", portal->name)));
+
+ /*
+ * Not sure if the PORTAL_ACTIVE case can validly happen or not...
+ */
+ if (portal->status == PORTAL_ACTIVE)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_CURSOR_STATE),
+ errmsg("cannot drop active portal \"%s\"", portal->name)));
+
+ /*
+ * Allow portalcmds.c to clean up the state it knows about, in particular
+ * shutting down the executor if still active. This step potentially runs
+ * user-defined code so failure has to be expected. It's the cleanup
+ * hook's responsibility to not try to do that more than once, in the case
+ * that failure occurs and then we come back to drop the portal again
+ * during transaction abort.
+ *
+ * Note: in most paths of control, this will have been done already in
+ * MarkPortalDone or MarkPortalFailed. We're just making sure.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ portal->cleanup(portal);
+ portal->cleanup = NULL;
+ }
+
+ /* There shouldn't be an active snapshot anymore, except after error */
+ Assert(portal->portalSnapshot == NULL || !isTopCommit);
+
+ /*
+ * Remove portal from hash table. Because we do this here, we will not
+ * come back to try to remove the portal again if there's any error in the
+ * subsequent steps. Better to leak a little memory than to get into an
+ * infinite error-recovery loop.
+ */
+ PortalHashTableDelete(portal);
+
+ /* drop cached plan reference, if any */
+ PortalReleaseCachedPlan(portal);
+
+ /*
+ * If portal has a snapshot protecting its data, release that. This needs
+ * a little care since the registration will be attached to the portal's
+ * resowner; if the portal failed, we will already have released the
+ * resowner (and the snapshot) during transaction abort.
+ */
+ if (portal->holdSnapshot)
+ {
+ if (portal->resowner)
+ UnregisterSnapshotFromOwner(portal->holdSnapshot,
+ portal->resowner);
+ portal->holdSnapshot = NULL;
+ }
+
+ /*
+ * Release any resources still attached to the portal. There are several
+ * cases being covered here:
+ *
+ * Top transaction commit (indicated by isTopCommit): normally we should
+ * do nothing here and let the regular end-of-transaction resource
+ * releasing mechanism handle these resources too. However, if we have a
+ * FAILED portal (eg, a cursor that got an error), we'd better clean up
+ * its resources to avoid resource-leakage warning messages.
+ *
+ * Sub transaction commit: never comes here at all, since we don't kill
+ * any portals in AtSubCommit_Portals().
+ *
+ * Main or sub transaction abort: we will do nothing here because
+ * portal->resowner was already set NULL; the resources were already
+ * cleaned up in transaction abort.
+ *
+ * Ordinary portal drop: must release resources. However, if the portal
+ * is not FAILED then we do not release its locks. The locks become the
+ * responsibility of the transaction's ResourceOwner (since it is the
+ * parent of the portal's owner) and will be released when the transaction
+ * eventually ends.
+ */
+ if (portal->resowner &&
+ (!isTopCommit || portal->status == PORTAL_FAILED))
+ {
+ bool isCommit = (portal->status != PORTAL_FAILED);
+
+ ResourceOwnerRelease(portal->resowner,
+ RESOURCE_RELEASE_BEFORE_LOCKS,
+ isCommit, false);
+ ResourceOwnerRelease(portal->resowner,
+ RESOURCE_RELEASE_LOCKS,
+ isCommit, false);
+ ResourceOwnerRelease(portal->resowner,
+ RESOURCE_RELEASE_AFTER_LOCKS,
+ isCommit, false);
+ ResourceOwnerDelete(portal->resowner);
+ }
+ portal->resowner = NULL;
+
+ /*
+ * Delete tuplestore if present. We should do this even under error
+ * conditions; since the tuplestore would have been using cross-
+ * transaction storage, its temp files need to be explicitly deleted.
+ */
+ if (portal->holdStore)
+ {
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(portal->holdContext);
+ tuplestore_end(portal->holdStore);
+ MemoryContextSwitchTo(oldcontext);
+ portal->holdStore = NULL;
+ }
+
+ /* delete tuplestore storage, if any */
+ if (portal->holdContext)
+ MemoryContextDelete(portal->holdContext);
+
+ /* release subsidiary storage */
+ MemoryContextDelete(portal->portalContext);
+
+ /* release portal struct (it's in TopPortalContext) */
+ pfree(portal);
+}
+
+/*
+ * Delete all declared cursors.
+ *
+ * Used by commands: CLOSE ALL, DISCARD ALL
+ */
+void
+PortalHashTableDeleteAll(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ if (PortalHashTable == NULL)
+ return;
+
+ hash_seq_init(&status, PortalHashTable);
+ while ((hentry = hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ /* Can't close the active portal (the one running the command) */
+ if (portal->status == PORTAL_ACTIVE)
+ continue;
+
+ PortalDrop(portal, false);
+
+ /* Restart the iteration in case that led to other drops */
+ hash_seq_term(&status);
+ hash_seq_init(&status, PortalHashTable);
+ }
+}
+
+/*
+ * "Hold" a portal. Prepare it for access by later transactions.
+ */
+static void
+HoldPortal(Portal portal)
+{
+ /*
+ * Note that PersistHoldablePortal() must release all resources used by
+ * the portal that are local to the creating transaction.
+ */
+ PortalCreateHoldStore(portal);
+ PersistHoldablePortal(portal);
+
+ /* drop cached plan reference, if any */
+ PortalReleaseCachedPlan(portal);
+
+ /*
+ * Any resources belonging to the portal will be released in the upcoming
+ * transaction-wide cleanup; the portal will no longer have its own
+ * resources.
+ */
+ portal->resowner = NULL;
+
+ /*
+ * Having successfully exported the holdable cursor, mark it as not
+ * belonging to this transaction.
+ */
+ portal->createSubid = InvalidSubTransactionId;
+ portal->activeSubid = InvalidSubTransactionId;
+ portal->createLevel = 0;
+}
+
+/*
+ * Pre-commit processing for portals.
+ *
+ * Holdable cursors created in this transaction need to be converted to
+ * materialized form, since we are going to close down the executor and
+ * release locks. Non-holdable portals created in this transaction are
+ * simply removed. Portals remaining from prior transactions should be
+ * left untouched.
+ *
+ * Returns true if any portals changed state (possibly causing user-defined
+ * code to be run), false if not.
+ */
+bool
+PreCommit_Portals(bool isPrepare)
+{
+ bool result = false;
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ /*
+ * There should be no pinned portals anymore. Complain if someone
+ * leaked one. Auto-held portals are allowed; we assume that whoever
+ * pinned them is managing them.
+ */
+ if (portal->portalPinned && !portal->autoHeld)
+ elog(ERROR, "cannot commit while a portal is pinned");
+
+ /*
+ * Do not touch active portals --- this can only happen in the case of
+ * a multi-transaction utility command, such as VACUUM, or a commit in
+ * a procedure.
+ *
+ * Note however that any resource owner attached to such a portal is
+ * still going to go away, so don't leave a dangling pointer. Also
+ * unregister any snapshots held by the portal, mainly to avoid
+ * snapshot leak warnings from ResourceOwnerRelease().
+ */
+ if (portal->status == PORTAL_ACTIVE)
+ {
+ if (portal->holdSnapshot)
+ {
+ if (portal->resowner)
+ UnregisterSnapshotFromOwner(portal->holdSnapshot,
+ portal->resowner);
+ portal->holdSnapshot = NULL;
+ }
+ portal->resowner = NULL;
+ /* Clear portalSnapshot too, for cleanliness */
+ portal->portalSnapshot = NULL;
+ continue;
+ }
+
+ /* Is it a holdable portal created in the current xact? */
+ if ((portal->cursorOptions & CURSOR_OPT_HOLD) &&
+ portal->createSubid != InvalidSubTransactionId &&
+ portal->status == PORTAL_READY)
+ {
+ /*
+ * We are exiting the transaction that created a holdable cursor.
+ * Instead of dropping the portal, prepare it for access by later
+ * transactions.
+ *
+ * However, if this is PREPARE TRANSACTION rather than COMMIT,
+ * refuse PREPARE, because the semantics seem pretty unclear.
+ */
+ if (isPrepare)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot PREPARE a transaction that has created a cursor WITH HOLD")));
+
+ HoldPortal(portal);
+
+ /* Report we changed state */
+ result = true;
+ }
+ else if (portal->createSubid == InvalidSubTransactionId)
+ {
+ /*
+ * Do nothing to cursors held over from a previous transaction
+ * (including ones we just froze in a previous cycle of this loop)
+ */
+ continue;
+ }
+ else
+ {
+ /* Zap all non-holdable portals */
+ PortalDrop(portal, true);
+
+ /* Report we changed state */
+ result = true;
+ }
+
+ /*
+ * After either freezing or dropping a portal, we have to restart the
+ * iteration, because we could have invoked user-defined code that
+ * caused a drop of the next portal in the hash chain.
+ */
+ hash_seq_term(&status);
+ hash_seq_init(&status, PortalHashTable);
+ }
+
+ return result;
+}
+
+/*
+ * Abort processing for portals.
+ *
+ * At this point we run the cleanup hook if present, but we can't release the
+ * portal's memory until the cleanup call.
+ */
+void
+AtAbort_Portals(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ /*
+ * When elog(FATAL) is progress, we need to set the active portal to
+ * failed, so that PortalCleanup() doesn't run the executor shutdown.
+ */
+ if (portal->status == PORTAL_ACTIVE && shmem_exit_inprogress)
+ MarkPortalFailed(portal);
+
+ /*
+ * Do nothing else to cursors held over from a previous transaction.
+ */
+ if (portal->createSubid == InvalidSubTransactionId)
+ continue;
+
+ /*
+ * Do nothing to auto-held cursors. This is similar to the case of a
+ * cursor from a previous transaction, but it could also be that the
+ * cursor was auto-held in this transaction, so it wants to live on.
+ */
+ if (portal->autoHeld)
+ continue;
+
+ /*
+ * If it was created in the current transaction, we can't do normal
+ * shutdown on a READY portal either; it might refer to objects
+ * created in the failed transaction. See comments in
+ * AtSubAbort_Portals.
+ */
+ if (portal->status == PORTAL_READY)
+ MarkPortalFailed(portal);
+
+ /*
+ * Allow portalcmds.c to clean up the state it knows about, if we
+ * haven't already.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ portal->cleanup(portal);
+ portal->cleanup = NULL;
+ }
+
+ /* drop cached plan reference, if any */
+ PortalReleaseCachedPlan(portal);
+
+ /*
+ * Any resources belonging to the portal will be released in the
+ * upcoming transaction-wide cleanup; they will be gone before we run
+ * PortalDrop.
+ */
+ portal->resowner = NULL;
+
+ /*
+ * Although we can't delete the portal data structure proper, we can
+ * release any memory in subsidiary contexts, such as executor state.
+ * The cleanup hook was the last thing that might have needed data
+ * there. But leave active portals alone.
+ */
+ if (portal->status != PORTAL_ACTIVE)
+ MemoryContextDeleteChildren(portal->portalContext);
+ }
+}
+
+/*
+ * Post-abort cleanup for portals.
+ *
+ * Delete all portals not held over from prior transactions. */
+void
+AtCleanup_Portals(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ /*
+ * Do not touch active portals --- this can only happen in the case of
+ * a multi-transaction command.
+ */
+ if (portal->status == PORTAL_ACTIVE)
+ continue;
+
+ /*
+ * Do nothing to cursors held over from a previous transaction or
+ * auto-held ones.
+ */
+ if (portal->createSubid == InvalidSubTransactionId || portal->autoHeld)
+ {
+ Assert(portal->status != PORTAL_ACTIVE);
+ Assert(portal->resowner == NULL);
+ continue;
+ }
+
+ /*
+ * If a portal is still pinned, forcibly unpin it. PortalDrop will not
+ * let us drop the portal otherwise. Whoever pinned the portal was
+ * interrupted by the abort too and won't try to use it anymore.
+ */
+ if (portal->portalPinned)
+ portal->portalPinned = false;
+
+ /*
+ * We had better not call any user-defined code during cleanup, so if
+ * the cleanup hook hasn't been run yet, too bad; we'll just skip it.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ elog(WARNING, "skipping cleanup for portal \"%s\"", portal->name);
+ portal->cleanup = NULL;
+ }
+
+ /* Zap it. */
+ PortalDrop(portal, false);
+ }
+}
+
+/*
+ * Portal-related cleanup when we return to the main loop on error.
+ *
+ * This is different from the cleanup at transaction abort. Auto-held portals
+ * are cleaned up on error but not on transaction abort.
+ */
+void
+PortalErrorCleanup(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->autoHeld)
+ {
+ portal->portalPinned = false;
+ PortalDrop(portal, false);
+ }
+ }
+}
+
+/*
+ * Pre-subcommit processing for portals.
+ *
+ * Reassign portals created or used in the current subtransaction to the
+ * parent subtransaction.
+ */
+void
+AtSubCommit_Portals(SubTransactionId mySubid,
+ SubTransactionId parentSubid,
+ int parentLevel,
+ ResourceOwner parentXactOwner)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->createSubid == mySubid)
+ {
+ portal->createSubid = parentSubid;
+ portal->createLevel = parentLevel;
+ if (portal->resowner)
+ ResourceOwnerNewParent(portal->resowner, parentXactOwner);
+ }
+ if (portal->activeSubid == mySubid)
+ portal->activeSubid = parentSubid;
+ }
+}
+
+/*
+ * Subtransaction abort handling for portals.
+ *
+ * Deactivate portals created or used during the failed subtransaction.
+ * Note that per AtSubCommit_Portals, this will catch portals created/used
+ * in descendants of the subtransaction too.
+ *
+ * We don't destroy any portals here; that's done in AtSubCleanup_Portals.
+ */
+void
+AtSubAbort_Portals(SubTransactionId mySubid,
+ SubTransactionId parentSubid,
+ ResourceOwner myXactOwner,
+ ResourceOwner parentXactOwner)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ /* Was it created in this subtransaction? */
+ if (portal->createSubid != mySubid)
+ {
+ /* No, but maybe it was used in this subtransaction? */
+ if (portal->activeSubid == mySubid)
+ {
+ /* Maintain activeSubid until the portal is removed */
+ portal->activeSubid = parentSubid;
+
+ /*
+ * A MarkPortalActive() caller ran an upper-level portal in
+ * this subtransaction and left the portal ACTIVE. This can't
+ * happen, but force the portal into FAILED state for the same
+ * reasons discussed below.
+ *
+ * We assume we can get away without forcing upper-level READY
+ * portals to fail, even if they were run and then suspended.
+ * In theory a suspended upper-level portal could have
+ * acquired some references to objects that are about to be
+ * destroyed, but there should be sufficient defenses against
+ * such cases: the portal's original query cannot contain such
+ * references, and any references within, say, cached plans of
+ * PL/pgSQL functions are not from active queries and should
+ * be protected by revalidation logic.
+ */
+ if (portal->status == PORTAL_ACTIVE)
+ MarkPortalFailed(portal);
+
+ /*
+ * Also, if we failed it during the current subtransaction
+ * (either just above, or earlier), reattach its resource
+ * owner to the current subtransaction's resource owner, so
+ * that any resources it still holds will be released while
+ * cleaning up this subtransaction. This prevents some corner
+ * cases wherein we might get Asserts or worse while cleaning
+ * up objects created during the current subtransaction
+ * (because they're still referenced within this portal).
+ */
+ if (portal->status == PORTAL_FAILED && portal->resowner)
+ {
+ ResourceOwnerNewParent(portal->resowner, myXactOwner);
+ portal->resowner = NULL;
+ }
+ }
+ /* Done if it wasn't created in this subtransaction */
+ continue;
+ }
+
+ /*
+ * Force any live portals of my own subtransaction into FAILED state.
+ * We have to do this because they might refer to objects created or
+ * changed in the failed subtransaction, leading to crashes within
+ * ExecutorEnd when portalcmds.c tries to close down the portal.
+ * Currently, every MarkPortalActive() caller ensures it updates the
+ * portal status again before relinquishing control, so ACTIVE can't
+ * happen here. If it does happen, dispose the portal like existing
+ * MarkPortalActive() callers would.
+ */
+ if (portal->status == PORTAL_READY ||
+ portal->status == PORTAL_ACTIVE)
+ MarkPortalFailed(portal);
+
+ /*
+ * Allow portalcmds.c to clean up the state it knows about, if we
+ * haven't already.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ portal->cleanup(portal);
+ portal->cleanup = NULL;
+ }
+
+ /* drop cached plan reference, if any */
+ PortalReleaseCachedPlan(portal);
+
+ /*
+ * Any resources belonging to the portal will be released in the
+ * upcoming transaction-wide cleanup; they will be gone before we run
+ * PortalDrop.
+ */
+ portal->resowner = NULL;
+
+ /*
+ * Although we can't delete the portal data structure proper, we can
+ * release any memory in subsidiary contexts, such as executor state.
+ * The cleanup hook was the last thing that might have needed data
+ * there.
+ */
+ MemoryContextDeleteChildren(portal->portalContext);
+ }
+}
+
+/*
+ * Post-subabort cleanup for portals.
+ *
+ * Drop all portals created in the failed subtransaction (but note that
+ * we will not drop any that were reassigned to the parent above).
+ */
+void
+AtSubCleanup_Portals(SubTransactionId mySubid)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->createSubid != mySubid)
+ continue;
+
+ /*
+ * If a portal is still pinned, forcibly unpin it. PortalDrop will not
+ * let us drop the portal otherwise. Whoever pinned the portal was
+ * interrupted by the abort too and won't try to use it anymore.
+ */
+ if (portal->portalPinned)
+ portal->portalPinned = false;
+
+ /*
+ * We had better not call any user-defined code during cleanup, so if
+ * the cleanup hook hasn't been run yet, too bad; we'll just skip it.
+ */
+ if (PointerIsValid(portal->cleanup))
+ {
+ elog(WARNING, "skipping cleanup for portal \"%s\"", portal->name);
+ portal->cleanup = NULL;
+ }
+
+ /* Zap it. */
+ PortalDrop(portal, false);
+ }
+}
+
+/* Find all available cursors */
+Datum
+pg_cursor(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+ HASH_SEQ_STATUS hash_seq;
+ PortalHashEnt *hentry;
+
+ /*
+ * We put all the tuples into a tuplestore in one scan of the hashtable.
+ * This avoids any issue of the hashtable possibly changing between calls.
+ */
+ InitMaterializedSRF(fcinfo, 0);
+
+ hash_seq_init(&hash_seq, PortalHashTable);
+ while ((hentry = hash_seq_search(&hash_seq)) != NULL)
+ {
+ Portal portal = hentry->portal;
+ Datum values[6];
+ bool nulls[6];
+
+ /* report only "visible" entries */
+ if (!portal->visible)
+ continue;
+
+ MemSet(nulls, 0, sizeof(nulls));
+
+ values[0] = CStringGetTextDatum(portal->name);
+ values[1] = CStringGetTextDatum(portal->sourceText);
+ values[2] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_HOLD);
+ values[3] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_BINARY);
+ values[4] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_SCROLL);
+ values[5] = TimestampTzGetDatum(portal->creation_time);
+
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
+
+ return (Datum) 0;
+}
+
+bool
+ThereAreNoReadyPortals(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->status == PORTAL_READY)
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Hold all pinned portals.
+ *
+ * When initiating a COMMIT or ROLLBACK inside a procedure, this must be
+ * called to protect internally-generated cursors from being dropped during
+ * the transaction shutdown. Currently, SPI calls this automatically; PLs
+ * that initiate COMMIT or ROLLBACK some other way are on the hook to do it
+ * themselves. (Note that we couldn't do this in, say, AtAbort_Portals
+ * because we need to run user-defined code while persisting a portal.
+ * It's too late to do that once transaction abort has started.)
+ *
+ * We protect such portals by converting them to held cursors. We mark them
+ * as "auto-held" so that exception exit knows to clean them up. (In normal,
+ * non-exception code paths, the PL needs to clean such portals itself, since
+ * transaction end won't do it anymore; but that should be normal practice
+ * anyway.)
+ */
+void
+HoldPinnedPortals(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->portalPinned && !portal->autoHeld)
+ {
+ /*
+ * Doing transaction control, especially abort, inside a cursor
+ * loop that is not read-only, for example using UPDATE ...
+ * RETURNING, has weird semantics issues. Also, this
+ * implementation wouldn't work, because such portals cannot be
+ * held. (The core grammar enforces that only SELECT statements
+ * can drive a cursor, but for example PL/pgSQL does not restrict
+ * it.)
+ */
+ if (portal->strategy != PORTAL_ONE_SELECT)
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("cannot perform transaction commands inside a cursor loop that is not read-only")));
+
+ /* Verify it's in a suitable state to be held */
+ if (portal->status != PORTAL_READY)
+ elog(ERROR, "pinned portal is not ready to be auto-held");
+
+ HoldPortal(portal);
+ portal->autoHeld = true;
+ }
+ }
+}
+
+/*
+ * Drop the outer active snapshots for all portals, so that no snapshots
+ * remain active.
+ *
+ * Like HoldPinnedPortals, this must be called when initiating a COMMIT or
+ * ROLLBACK inside a procedure. This has to be separate from that since it
+ * should not be run until we're done with steps that are likely to fail.
+ *
+ * It's tempting to fold this into PreCommit_Portals, but to do so, we'd
+ * need to clean up snapshot management in VACUUM and perhaps other places.
+ */
+void
+ForgetPortalSnapshots(void)
+{
+ HASH_SEQ_STATUS status;
+ PortalHashEnt *hentry;
+ int numPortalSnaps = 0;
+ int numActiveSnaps = 0;
+
+ /* First, scan PortalHashTable and clear portalSnapshot fields */
+ hash_seq_init(&status, PortalHashTable);
+
+ while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL)
+ {
+ Portal portal = hentry->portal;
+
+ if (portal->portalSnapshot != NULL)
+ {
+ portal->portalSnapshot = NULL;
+ numPortalSnaps++;
+ }
+ /* portal->holdSnapshot will be cleaned up in PreCommit_Portals */
+ }
+
+ /*
+ * Now, pop all the active snapshots, which should be just those that were
+ * portal snapshots. Ideally we'd drive this directly off the portal
+ * scan, but there's no good way to visit the portals in the correct
+ * order. So just cross-check after the fact.
+ */
+ while (ActiveSnapshotSet())
+ {
+ PopActiveSnapshot();
+ numActiveSnaps++;
+ }
+
+ if (numPortalSnaps != numActiveSnaps)
+ elog(ERROR, "portal snapshots (%d) did not account for all active snapshots (%d)",
+ numPortalSnaps, numActiveSnaps);
+}
diff --git a/src/backend/utils/mmgr/slab.c b/src/backend/utils/mmgr/slab.c
new file mode 100644
index 0000000..82fb82e
--- /dev/null
+++ b/src/backend/utils/mmgr/slab.c
@@ -0,0 +1,796 @@
+/*-------------------------------------------------------------------------
+ *
+ * slab.c
+ * SLAB allocator definitions.
+ *
+ * SLAB is a MemoryContext implementation designed for cases where large
+ * numbers of equally-sized objects are allocated (and freed).
+ *
+ *
+ * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/backend/utils/mmgr/slab.c
+ *
+ *
+ * NOTE:
+ * The constant allocation size allows significant simplification and various
+ * optimizations over more general purpose allocators. The blocks are carved
+ * into chunks of exactly the right size (plus alignment), not wasting any
+ * memory.
+ *
+ * The information about free chunks is maintained both at the block level and
+ * global (context) level. This is possible as the chunk size (and thus also
+ * the number of chunks per block) is fixed.
+ *
+ * On each block, free chunks are tracked in a simple linked list. Contents
+ * of free chunks is replaced with an index of the next free chunk, forming
+ * a very simple linked list. Each block also contains a counter of free
+ * chunks. Combined with the local block-level freelist, it makes it trivial
+ * to eventually free the whole block.
+ *
+ * At the context level, we use 'freelist' to track blocks ordered by number
+ * of free chunks, starting with blocks having a single allocated chunk, and
+ * with completely full blocks on the tail.
+ *
+ * This also allows various optimizations - for example when searching for
+ * free chunk, the allocator reuses space from the fullest blocks first, in
+ * the hope that some of the less full blocks will get completely empty (and
+ * returned back to the OS).
+ *
+ * For each block, we maintain pointer to the first free chunk - this is quite
+ * cheap and allows us to skip all the preceding used chunks, eliminating
+ * a significant number of lookups in many common usage patterns. In the worst
+ * case this performs as if the pointer was not maintained.
+ *
+ * We cache the freelist index for the blocks with the fewest free chunks
+ * (minFreeChunks), so that we don't have to search the freelist on every
+ * SlabAlloc() call, which is quite expensive.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "lib/ilist.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+
+#define Slab_BLOCKHDRSZ MAXALIGN(sizeof(SlabBlock))
+
+/*
+ * SlabContext is a specialized implementation of MemoryContext.
+ */
+typedef struct SlabContext
+{
+ MemoryContextData header; /* Standard memory-context fields */
+ /* Allocation parameters for this context: */
+ Size chunkSize; /* chunk size */
+ Size fullChunkSize; /* chunk size including header and alignment */
+ Size blockSize; /* block size */
+ Size headerSize; /* allocated size of context header */
+ int chunksPerBlock; /* number of chunks per block */
+ int minFreeChunks; /* min number of free chunks in any block */
+ int nblocks; /* number of blocks allocated */
+#ifdef MEMORY_CONTEXT_CHECKING
+ bool *freechunks; /* bitmap of free chunks in a block */
+#endif
+ /* blocks with free space, grouped by number of free chunks: */
+ dlist_head freelist[FLEXIBLE_ARRAY_MEMBER];
+} SlabContext;
+
+/*
+ * SlabBlock
+ * Structure of a single block in SLAB allocator.
+ *
+ * node: doubly-linked list of blocks in global freelist
+ * nfree: number of free chunks in this block
+ * firstFreeChunk: index of the first free chunk
+ */
+typedef struct SlabBlock
+{
+ dlist_node node; /* doubly-linked list */
+ int nfree; /* number of free chunks */
+ int firstFreeChunk; /* index of the first free chunk in the block */
+} SlabBlock;
+
+/*
+ * SlabChunk
+ * The prefix of each piece of memory in a SlabBlock
+ *
+ * Note: to meet the memory context APIs, the payload area of the chunk must
+ * be maxaligned, and the "slab" link must be immediately adjacent to the
+ * payload area (cf. GetMemoryChunkContext). Since we support no machines on
+ * which MAXALIGN is more than twice sizeof(void *), this happens without any
+ * special hacking in this struct declaration. But there is a static
+ * assertion below that the alignment is done correctly.
+ */
+typedef struct SlabChunk
+{
+ SlabBlock *block; /* block owning this chunk */
+ SlabContext *slab; /* owning context */
+ /* there must not be any padding to reach a MAXALIGN boundary here! */
+} SlabChunk;
+
+
+#define SlabPointerGetChunk(ptr) \
+ ((SlabChunk *)(((char *)(ptr)) - sizeof(SlabChunk)))
+#define SlabChunkGetPointer(chk) \
+ ((void *)(((char *)(chk)) + sizeof(SlabChunk)))
+#define SlabBlockGetChunk(slab, block, idx) \
+ ((SlabChunk *) ((char *) (block) + Slab_BLOCKHDRSZ \
+ + (idx * slab->fullChunkSize)))
+#define SlabBlockStart(block) \
+ ((char *) block + Slab_BLOCKHDRSZ)
+#define SlabChunkIndex(slab, block, chunk) \
+ (((char *) chunk - SlabBlockStart(block)) / slab->fullChunkSize)
+
+/*
+ * These functions implement the MemoryContext API for Slab contexts.
+ */
+static void *SlabAlloc(MemoryContext context, Size size);
+static void SlabFree(MemoryContext context, void *pointer);
+static void *SlabRealloc(MemoryContext context, void *pointer, Size size);
+static void SlabReset(MemoryContext context);
+static void SlabDelete(MemoryContext context);
+static Size SlabGetChunkSpace(MemoryContext context, void *pointer);
+static bool SlabIsEmpty(MemoryContext context);
+static void SlabStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals,
+ bool print_to_stderr);
+#ifdef MEMORY_CONTEXT_CHECKING
+static void SlabCheck(MemoryContext context);
+#endif
+
+/*
+ * This is the virtual function table for Slab contexts.
+ */
+static const MemoryContextMethods SlabMethods = {
+ SlabAlloc,
+ SlabFree,
+ SlabRealloc,
+ SlabReset,
+ SlabDelete,
+ SlabGetChunkSpace,
+ SlabIsEmpty,
+ SlabStats
+#ifdef MEMORY_CONTEXT_CHECKING
+ ,SlabCheck
+#endif
+};
+
+
+/*
+ * SlabContextCreate
+ * Create a new Slab context.
+ *
+ * parent: parent context, or NULL if top-level context
+ * name: name of context (must be statically allocated)
+ * blockSize: allocation block size
+ * chunkSize: allocation chunk size
+ *
+ * The chunkSize may not exceed:
+ * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(Slab_BLOCKHDRSZ) - sizeof(SlabChunk)
+ */
+MemoryContext
+SlabContextCreate(MemoryContext parent,
+ const char *name,
+ Size blockSize,
+ Size chunkSize)
+{
+ int chunksPerBlock;
+ Size fullChunkSize;
+ Size freelistSize;
+ Size headerSize;
+ SlabContext *slab;
+ int i;
+
+ /* Assert we padded SlabChunk properly */
+ StaticAssertStmt(sizeof(SlabChunk) == MAXALIGN(sizeof(SlabChunk)),
+ "sizeof(SlabChunk) is not maxaligned");
+ StaticAssertStmt(offsetof(SlabChunk, slab) + sizeof(MemoryContext) ==
+ sizeof(SlabChunk),
+ "padding calculation in SlabChunk is wrong");
+
+ /* Make sure the linked list node fits inside a freed chunk */
+ if (chunkSize < sizeof(int))
+ chunkSize = sizeof(int);
+
+ /* chunk, including SLAB header (both addresses nicely aligned) */
+ fullChunkSize = sizeof(SlabChunk) + MAXALIGN(chunkSize);
+
+ /* Make sure the block can store at least one chunk. */
+ if (blockSize < fullChunkSize + Slab_BLOCKHDRSZ)
+ elog(ERROR, "block size %zu for slab is too small for %zu chunks",
+ blockSize, chunkSize);
+
+ /* Compute maximum number of chunks per block */
+ chunksPerBlock = (blockSize - Slab_BLOCKHDRSZ) / fullChunkSize;
+
+ /* The freelist starts with 0, ends with chunksPerBlock. */
+ freelistSize = sizeof(dlist_head) * (chunksPerBlock + 1);
+
+ /*
+ * Allocate the context header. Unlike aset.c, we never try to combine
+ * this with the first regular block; not worth the extra complication.
+ */
+
+ /* Size of the memory context header */
+ headerSize = offsetof(SlabContext, freelist) + freelistSize;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+
+ /*
+ * With memory checking, we need to allocate extra space for the bitmap of
+ * free chunks. The bitmap is an array of bools, so we don't need to worry
+ * about alignment.
+ */
+ headerSize += chunksPerBlock * sizeof(bool);
+#endif
+
+ slab = (SlabContext *) malloc(headerSize);
+ if (slab == NULL)
+ {
+ MemoryContextStats(TopMemoryContext);
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of memory"),
+ errdetail("Failed while creating memory context \"%s\".",
+ name)));
+ }
+
+ /*
+ * Avoid writing code that can fail between here and MemoryContextCreate;
+ * we'd leak the header if we ereport in this stretch.
+ */
+
+ /* Fill in SlabContext-specific header fields */
+ slab->chunkSize = chunkSize;
+ slab->fullChunkSize = fullChunkSize;
+ slab->blockSize = blockSize;
+ slab->headerSize = headerSize;
+ slab->chunksPerBlock = chunksPerBlock;
+ slab->minFreeChunks = 0;
+ slab->nblocks = 0;
+
+ /* initialize the freelist slots */
+ for (i = 0; i < (slab->chunksPerBlock + 1); i++)
+ dlist_init(&slab->freelist[i]);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* set the freechunks pointer right after the freelists array */
+ slab->freechunks
+ = (bool *) slab + offsetof(SlabContext, freelist) + freelistSize;
+#endif
+
+ /* Finally, do the type-independent part of context creation */
+ MemoryContextCreate((MemoryContext) slab,
+ T_SlabContext,
+ &SlabMethods,
+ parent,
+ name);
+
+ return (MemoryContext) slab;
+}
+
+/*
+ * SlabReset
+ * Frees all memory which is allocated in the given set.
+ *
+ * The code simply frees all the blocks in the context - we don't keep any
+ * keeper blocks or anything like that.
+ */
+static void
+SlabReset(MemoryContext context)
+{
+ int i;
+ SlabContext *slab = castNode(SlabContext, context);
+
+ Assert(slab);
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Check for corruption and leaks before freeing */
+ SlabCheck(context);
+#endif
+
+ /* walk over freelists and free the blocks */
+ for (i = 0; i <= slab->chunksPerBlock; i++)
+ {
+ dlist_mutable_iter miter;
+
+ dlist_foreach_modify(miter, &slab->freelist[i])
+ {
+ SlabBlock *block = dlist_container(SlabBlock, node, miter.cur);
+
+ dlist_delete(miter.cur);
+
+#ifdef CLOBBER_FREED_MEMORY
+ wipe_mem(block, slab->blockSize);
+#endif
+ free(block);
+ slab->nblocks--;
+ context->mem_allocated -= slab->blockSize;
+ }
+ }
+
+ slab->minFreeChunks = 0;
+
+ Assert(slab->nblocks == 0);
+ Assert(context->mem_allocated == 0);
+}
+
+/*
+ * SlabDelete
+ * Free all memory which is allocated in the given context.
+ */
+static void
+SlabDelete(MemoryContext context)
+{
+ /* Reset to release all the SlabBlocks */
+ SlabReset(context);
+ /* And free the context header */
+ free(context);
+}
+
+/*
+ * SlabAlloc
+ * Returns pointer to allocated memory of given size or NULL if
+ * request could not be completed; memory is added to the slab.
+ */
+static void *
+SlabAlloc(MemoryContext context, Size size)
+{
+ SlabContext *slab = castNode(SlabContext, context);
+ SlabBlock *block;
+ SlabChunk *chunk;
+ int idx;
+
+ Assert(slab);
+
+ Assert((slab->minFreeChunks >= 0) &&
+ (slab->minFreeChunks < slab->chunksPerBlock));
+
+ /* make sure we only allow correct request size */
+ if (size != slab->chunkSize)
+ elog(ERROR, "unexpected alloc chunk size %zu (expected %zu)",
+ size, slab->chunkSize);
+
+ /*
+ * If there are no free chunks in any existing block, create a new block
+ * and put it to the last freelist bucket.
+ *
+ * slab->minFreeChunks == 0 means there are no blocks with free chunks,
+ * thanks to how minFreeChunks is updated at the end of SlabAlloc().
+ */
+ if (slab->minFreeChunks == 0)
+ {
+ block = (SlabBlock *) malloc(slab->blockSize);
+
+ if (block == NULL)
+ return NULL;
+
+ block->nfree = slab->chunksPerBlock;
+ block->firstFreeChunk = 0;
+
+ /*
+ * Put all the chunks on a freelist. Walk the chunks and point each
+ * one to the next one.
+ */
+ for (idx = 0; idx < slab->chunksPerBlock; idx++)
+ {
+ chunk = SlabBlockGetChunk(slab, block, idx);
+ *(int32 *) SlabChunkGetPointer(chunk) = (idx + 1);
+ }
+
+ /*
+ * And add it to the last freelist with all chunks empty.
+ *
+ * We know there are no blocks in the freelist, otherwise we wouldn't
+ * need a new block.
+ */
+ Assert(dlist_is_empty(&slab->freelist[slab->chunksPerBlock]));
+
+ dlist_push_head(&slab->freelist[slab->chunksPerBlock], &block->node);
+
+ slab->minFreeChunks = slab->chunksPerBlock;
+ slab->nblocks += 1;
+ context->mem_allocated += slab->blockSize;
+ }
+
+ /* grab the block from the freelist (even the new block is there) */
+ block = dlist_head_element(SlabBlock, node,
+ &slab->freelist[slab->minFreeChunks]);
+
+ /* make sure we actually got a valid block, with matching nfree */
+ Assert(block != NULL);
+ Assert(slab->minFreeChunks == block->nfree);
+ Assert(block->nfree > 0);
+
+ /* we know index of the first free chunk in the block */
+ idx = block->firstFreeChunk;
+
+ /* make sure the chunk index is valid, and that it's marked as empty */
+ Assert((idx >= 0) && (idx < slab->chunksPerBlock));
+
+ /* compute the chunk location block start (after the block header) */
+ chunk = SlabBlockGetChunk(slab, block, idx);
+
+ /*
+ * Update the block nfree count, and also the minFreeChunks as we've
+ * decreased nfree for a block with the minimum number of free chunks
+ * (because that's how we chose the block).
+ */
+ block->nfree--;
+ slab->minFreeChunks = block->nfree;
+
+ /*
+ * Remove the chunk from the freelist head. The index of the next free
+ * chunk is stored in the chunk itself.
+ */
+ VALGRIND_MAKE_MEM_DEFINED(SlabChunkGetPointer(chunk), sizeof(int32));
+ block->firstFreeChunk = *(int32 *) SlabChunkGetPointer(chunk);
+
+ Assert(block->firstFreeChunk >= 0);
+ Assert(block->firstFreeChunk <= slab->chunksPerBlock);
+
+ Assert((block->nfree != 0 &&
+ block->firstFreeChunk < slab->chunksPerBlock) ||
+ (block->nfree == 0 &&
+ block->firstFreeChunk == slab->chunksPerBlock));
+
+ /* move the whole block to the right place in the freelist */
+ dlist_delete(&block->node);
+ dlist_push_head(&slab->freelist[block->nfree], &block->node);
+
+ /*
+ * And finally update minFreeChunks, i.e. the index to the block with the
+ * lowest number of free chunks. We only need to do that when the block
+ * got full (otherwise we know the current block is the right one). We'll
+ * simply walk the freelist until we find a non-empty entry.
+ */
+ if (slab->minFreeChunks == 0)
+ {
+ for (idx = 1; idx <= slab->chunksPerBlock; idx++)
+ {
+ if (dlist_is_empty(&slab->freelist[idx]))
+ continue;
+
+ /* found a non-empty freelist */
+ slab->minFreeChunks = idx;
+ break;
+ }
+ }
+
+ if (slab->minFreeChunks == slab->chunksPerBlock)
+ slab->minFreeChunks = 0;
+
+ /* Prepare to initialize the chunk header. */
+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, sizeof(SlabChunk));
+
+ chunk->block = block;
+ chunk->slab = slab;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* slab mark to catch clobber of "unused" space */
+ if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk)))
+ {
+ set_sentinel(SlabChunkGetPointer(chunk), size);
+ VALGRIND_MAKE_MEM_NOACCESS(((char *) chunk) +
+ sizeof(SlabChunk) + slab->chunkSize,
+ slab->fullChunkSize -
+ (slab->chunkSize + sizeof(SlabChunk)));
+ }
+#endif
+#ifdef RANDOMIZE_ALLOCATED_MEMORY
+ /* fill the allocated space with junk */
+ randomize_mem((char *) SlabChunkGetPointer(chunk), size);
+#endif
+
+ Assert(slab->nblocks * slab->blockSize == context->mem_allocated);
+
+ return SlabChunkGetPointer(chunk);
+}
+
+/*
+ * SlabFree
+ * Frees allocated memory; memory is removed from the slab.
+ */
+static void
+SlabFree(MemoryContext context, void *pointer)
+{
+ int idx;
+ SlabContext *slab = castNode(SlabContext, context);
+ SlabChunk *chunk = SlabPointerGetChunk(pointer);
+ SlabBlock *block = chunk->block;
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Test for someone scribbling on unused space in chunk */
+ if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk)))
+ if (!sentinel_ok(pointer, slab->chunkSize))
+ elog(WARNING, "detected write past chunk end in %s %p",
+ slab->header.name, chunk);
+#endif
+
+ /* compute index of the chunk with respect to block start */
+ idx = SlabChunkIndex(slab, block, chunk);
+
+ /* add chunk to freelist, and update block nfree count */
+ *(int32 *) pointer = block->firstFreeChunk;
+ block->firstFreeChunk = idx;
+ block->nfree++;
+
+ Assert(block->nfree > 0);
+ Assert(block->nfree <= slab->chunksPerBlock);
+
+#ifdef CLOBBER_FREED_MEMORY
+ /* XXX don't wipe the int32 index, used for block-level freelist */
+ wipe_mem((char *) pointer + sizeof(int32),
+ slab->chunkSize - sizeof(int32));
+#endif
+
+ /* remove the block from a freelist */
+ dlist_delete(&block->node);
+
+ /*
+ * See if we need to update the minFreeChunks field for the slab - we only
+ * need to do that if there the block had that number of free chunks
+ * before we freed one. In that case, we check if there still are blocks
+ * in the original freelist and we either keep the current value (if there
+ * still are blocks) or increment it by one (the new block is still the
+ * one with minimum free chunks).
+ *
+ * The one exception is when the block will get completely free - in that
+ * case we will free it, se we can't use it for minFreeChunks. It however
+ * means there are no more blocks with free chunks.
+ */
+ if (slab->minFreeChunks == (block->nfree - 1))
+ {
+ /* Have we removed the last chunk from the freelist? */
+ if (dlist_is_empty(&slab->freelist[slab->minFreeChunks]))
+ {
+ /* but if we made the block entirely free, we'll free it */
+ if (block->nfree == slab->chunksPerBlock)
+ slab->minFreeChunks = 0;
+ else
+ slab->minFreeChunks++;
+ }
+ }
+
+ /* If the block is now completely empty, free it. */
+ if (block->nfree == slab->chunksPerBlock)
+ {
+ free(block);
+ slab->nblocks--;
+ context->mem_allocated -= slab->blockSize;
+ }
+ else
+ dlist_push_head(&slab->freelist[block->nfree], &block->node);
+
+ Assert(slab->nblocks >= 0);
+ Assert(slab->nblocks * slab->blockSize == context->mem_allocated);
+}
+
+/*
+ * SlabRealloc
+ * Change the allocated size of a chunk.
+ *
+ * As Slab is designed for allocating equally-sized chunks of memory, it can't
+ * do an actual chunk size change. We try to be gentle and allow calls with
+ * exactly the same size, as in that case we can simply return the same
+ * chunk. When the size differs, we throw an error.
+ *
+ * We could also allow requests with size < chunkSize. That however seems
+ * rather pointless - Slab is meant for chunks of constant size, and moreover
+ * realloc is usually used to enlarge the chunk.
+ */
+static void *
+SlabRealloc(MemoryContext context, void *pointer, Size size)
+{
+ SlabContext *slab = castNode(SlabContext, context);
+
+ Assert(slab);
+
+ /* can't do actual realloc with slab, but let's try to be gentle */
+ if (size == slab->chunkSize)
+ return pointer;
+
+ elog(ERROR, "slab allocator does not support realloc()");
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * SlabGetChunkSpace
+ * Given a currently-allocated chunk, determine the total space
+ * it occupies (including all memory-allocation overhead).
+ */
+static Size
+SlabGetChunkSpace(MemoryContext context, void *pointer)
+{
+ SlabContext *slab = castNode(SlabContext, context);
+
+ Assert(slab);
+
+ return slab->fullChunkSize;
+}
+
+/*
+ * SlabIsEmpty
+ * Is an Slab empty of any allocated space?
+ */
+static bool
+SlabIsEmpty(MemoryContext context)
+{
+ SlabContext *slab = castNode(SlabContext, context);
+
+ Assert(slab);
+
+ return (slab->nblocks == 0);
+}
+
+/*
+ * SlabStats
+ * Compute stats about memory consumption of a Slab context.
+ *
+ * printfunc: if not NULL, pass a human-readable stats string to this.
+ * passthru: pass this pointer through to printfunc.
+ * totals: if not NULL, add stats about this context into *totals.
+ * print_to_stderr: print stats to stderr if true, elog otherwise.
+ */
+static void
+SlabStats(MemoryContext context,
+ MemoryStatsPrintFunc printfunc, void *passthru,
+ MemoryContextCounters *totals,
+ bool print_to_stderr)
+{
+ SlabContext *slab = castNode(SlabContext, context);
+ Size nblocks = 0;
+ Size freechunks = 0;
+ Size totalspace;
+ Size freespace = 0;
+ int i;
+
+ /* Include context header in totalspace */
+ totalspace = slab->headerSize;
+
+ for (i = 0; i <= slab->chunksPerBlock; i++)
+ {
+ dlist_iter iter;
+
+ dlist_foreach(iter, &slab->freelist[i])
+ {
+ SlabBlock *block = dlist_container(SlabBlock, node, iter.cur);
+
+ nblocks++;
+ totalspace += slab->blockSize;
+ freespace += slab->fullChunkSize * block->nfree;
+ freechunks += block->nfree;
+ }
+ }
+
+ if (printfunc)
+ {
+ char stats_string[200];
+
+ snprintf(stats_string, sizeof(stats_string),
+ "%zu total in %zu blocks; %zu free (%zu chunks); %zu used",
+ totalspace, nblocks, freespace, freechunks,
+ totalspace - freespace);
+ printfunc(context, passthru, stats_string, print_to_stderr);
+ }
+
+ if (totals)
+ {
+ totals->nblocks += nblocks;
+ totals->freechunks += freechunks;
+ totals->totalspace += totalspace;
+ totals->freespace += freespace;
+ }
+}
+
+
+#ifdef MEMORY_CONTEXT_CHECKING
+
+/*
+ * SlabCheck
+ * Walk through chunks and check consistency of memory.
+ *
+ * NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll
+ * find yourself in an infinite loop when trouble occurs, because this
+ * routine will be entered again when elog cleanup tries to release memory!
+ */
+static void
+SlabCheck(MemoryContext context)
+{
+ int i;
+ SlabContext *slab = castNode(SlabContext, context);
+ const char *name = slab->header.name;
+
+ Assert(slab);
+ Assert(slab->chunksPerBlock > 0);
+
+ /* walk all the freelists */
+ for (i = 0; i <= slab->chunksPerBlock; i++)
+ {
+ int j,
+ nfree;
+ dlist_iter iter;
+
+ /* walk all blocks on this freelist */
+ dlist_foreach(iter, &slab->freelist[i])
+ {
+ int idx;
+ SlabBlock *block = dlist_container(SlabBlock, node, iter.cur);
+
+ /*
+ * Make sure the number of free chunks (in the block header)
+ * matches position in the freelist.
+ */
+ if (block->nfree != i)
+ elog(WARNING, "problem in slab %s: number of free chunks %d in block %p does not match freelist %d",
+ name, block->nfree, block, i);
+
+ /* reset the bitmap of free chunks for this block */
+ memset(slab->freechunks, 0, (slab->chunksPerBlock * sizeof(bool)));
+ idx = block->firstFreeChunk;
+
+ /*
+ * Now walk through the chunks, count the free ones and also
+ * perform some additional checks for the used ones. As the chunk
+ * freelist is stored within the chunks themselves, we have to
+ * walk through the chunks and construct our own bitmap.
+ */
+
+ nfree = 0;
+ while (idx < slab->chunksPerBlock)
+ {
+ SlabChunk *chunk;
+
+ /* count the chunk as free, add it to the bitmap */
+ nfree++;
+ slab->freechunks[idx] = true;
+
+ /* read index of the next free chunk */
+ chunk = SlabBlockGetChunk(slab, block, idx);
+ VALGRIND_MAKE_MEM_DEFINED(SlabChunkGetPointer(chunk), sizeof(int32));
+ idx = *(int32 *) SlabChunkGetPointer(chunk);
+ }
+
+ for (j = 0; j < slab->chunksPerBlock; j++)
+ {
+ /* non-zero bit in the bitmap means chunk the chunk is used */
+ if (!slab->freechunks[j])
+ {
+ SlabChunk *chunk = SlabBlockGetChunk(slab, block, j);
+
+ /* chunks have both block and slab pointers, so check both */
+ if (chunk->block != block)
+ elog(WARNING, "problem in slab %s: bogus block link in block %p, chunk %p",
+ name, block, chunk);
+
+ if (chunk->slab != slab)
+ elog(WARNING, "problem in slab %s: bogus slab link in block %p, chunk %p",
+ name, block, chunk);
+
+ /* there might be sentinel (thanks to alignment) */
+ if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk)))
+ if (!sentinel_ok(chunk, sizeof(SlabChunk) + slab->chunkSize))
+ elog(WARNING, "problem in slab %s: detected write past chunk end in block %p, chunk %p",
+ name, block, chunk);
+ }
+ }
+
+ /*
+ * Make sure we got the expected number of free chunks (as tracked
+ * in the block header).
+ */
+ if (nfree != block->nfree)
+ elog(WARNING, "problem in slab %s: number of free chunks %d in block %p does not match bitmap %d",
+ name, block->nfree, block, nfree);
+ }
+ }
+
+ Assert(slab->nblocks * slab->blockSize == context->mem_allocated);
+}
+
+#endif /* MEMORY_CONTEXT_CHECKING */
diff --git a/src/backend/utils/probes.d b/src/backend/utils/probes.d
new file mode 100644
index 0000000..3ebbcf8
--- /dev/null
+++ b/src/backend/utils/probes.d
@@ -0,0 +1,94 @@
+/* ----------
+ * DTrace probes for PostgreSQL backend
+ *
+ * Copyright (c) 2006-2022, PostgreSQL Global Development Group
+ *
+ * src/backend/utils/probes.d
+ * ----------
+ */
+
+
+/*
+ * Typedefs used in PostgreSQL probes.
+ *
+ * NOTE: Do not use system-provided typedefs (e.g. uintptr_t, uint32_t, etc)
+ * in probe definitions, as they cause compilation errors on macOS.
+ */
+#define LocalTransactionId unsigned int
+#define LWLockMode int
+#define LOCKMODE int
+#define BlockNumber unsigned int
+#define Oid unsigned int
+#define ForkNumber int
+#define bool unsigned char
+
+provider postgresql {
+
+ probe transaction__start(LocalTransactionId);
+ probe transaction__commit(LocalTransactionId);
+ probe transaction__abort(LocalTransactionId);
+
+ probe lwlock__acquire(const char *, LWLockMode);
+ probe lwlock__release(const char *);
+ probe lwlock__wait__start(const char *, LWLockMode);
+ probe lwlock__wait__done(const char *, LWLockMode);
+ probe lwlock__condacquire(const char *, LWLockMode);
+ probe lwlock__condacquire__fail(const char *, LWLockMode);
+ probe lwlock__acquire__or__wait(const char *, LWLockMode);
+ probe lwlock__acquire__or__wait__fail(const char *, LWLockMode);
+
+ probe lock__wait__start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);
+ probe lock__wait__done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);
+
+ probe query__parse__start(const char *);
+ probe query__parse__done(const char *);
+ probe query__rewrite__start(const char *);
+ probe query__rewrite__done(const char *);
+ probe query__plan__start();
+ probe query__plan__done();
+ probe query__execute__start();
+ probe query__execute__done();
+ probe query__start(const char *);
+ probe query__done(const char *);
+ probe statement__status(const char *);
+
+ probe sort__start(int, bool, int, int, bool, int);
+ probe sort__done(bool, long);
+
+ probe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool);
+ probe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, bool);
+ probe buffer__flush__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
+ probe buffer__flush__done(ForkNumber, BlockNumber, Oid, Oid, Oid);
+
+ probe buffer__checkpoint__start(int);
+ probe buffer__checkpoint__sync__start();
+ probe buffer__checkpoint__done();
+ probe buffer__sync__start(int, int);
+ probe buffer__sync__written(int);
+ probe buffer__sync__done(int, int, int);
+ probe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
+ probe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid);
+
+ probe deadlock__found();
+
+ probe checkpoint__start(int);
+ probe checkpoint__done(int, int, int, int, int);
+ probe clog__checkpoint__start(bool);
+ probe clog__checkpoint__done(bool);
+ probe subtrans__checkpoint__start(bool);
+ probe subtrans__checkpoint__done(bool);
+ probe multixact__checkpoint__start(bool);
+ probe multixact__checkpoint__done(bool);
+ probe twophase__checkpoint__start();
+ probe twophase__checkpoint__done();
+
+ probe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, int);
+ probe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int);
+ probe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid, int);
+ probe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, int);
+
+ probe wal__insert(unsigned char, unsigned char);
+ probe wal__switch();
+ probe wal__buffer__write__dirty__start();
+ probe wal__buffer__write__dirty__done();
+};
diff --git a/src/backend/utils/resowner/Makefile b/src/backend/utils/resowner/Makefile
new file mode 100644
index 0000000..6e1d3f2
--- /dev/null
+++ b/src/backend/utils/resowner/Makefile
@@ -0,0 +1,18 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/resowner
+#
+# IDENTIFICATION
+# src/backend/utils/resowner/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/resowner
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ resowner.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/resowner/README b/src/backend/utils/resowner/README
new file mode 100644
index 0000000..f94c970
--- /dev/null
+++ b/src/backend/utils/resowner/README
@@ -0,0 +1,81 @@
+src/backend/utils/resowner/README
+
+Notes About Resource Owners
+===========================
+
+ResourceOwner objects are a concept invented to simplify management of
+query-related resources, such as buffer pins and table locks. These
+resources need to be tracked in a reliable way to ensure that they will
+be released at query end, even if the query fails due to an error.
+Rather than expecting the entire executor to have bulletproof data
+structures, we localize the tracking of such resources into a single
+module.
+
+The design of the ResourceOwner API is modeled on our MemoryContext API,
+which has proven very flexible and successful in preventing memory leaks.
+In particular we allow ResourceOwners to have child ResourceOwner objects
+so that there can be forests of the things; releasing a parent
+ResourceOwner acts on all its direct and indirect children as well.
+
+(It is tempting to consider unifying ResourceOwners and MemoryContexts
+into a single object type, but their usage patterns are sufficiently
+different that this is probably not really a helpful thing to do.)
+
+We create a ResourceOwner for each transaction or subtransaction as
+well as one for each Portal. During execution of a Portal, the global
+variable CurrentResourceOwner points to the Portal's ResourceOwner.
+This causes operations such as ReadBuffer and LockAcquire to record
+ownership of the acquired resources in that ResourceOwner object.
+
+When a Portal is closed, any remaining resources (typically only locks)
+become the responsibility of the current transaction. This is represented
+by making the Portal's ResourceOwner a child of the current transaction's
+ResourceOwner. resowner.c automatically transfers the resources to the
+parent object when releasing the child. Similarly, subtransaction
+ResourceOwners are children of their immediate parent.
+
+We need transaction-related ResourceOwners as well as Portal-related ones
+because transactions may initiate operations that require resources (such
+as query parsing) when no associated Portal exists yet.
+
+
+API Overview
+------------
+
+The basic operations on a ResourceOwner are:
+
+* create a ResourceOwner
+
+* associate or deassociate some resource with a ResourceOwner
+
+* release a ResourceOwner's assets (free all owned resources, but not the
+ owner object itself)
+
+* delete a ResourceOwner (including child owner objects); all resources
+ must have been released beforehand
+
+This API directly supports the resource types listed in the definition of
+ResourceOwnerData struct in src/backend/utils/resowner/resowner.c.
+Other objects can be associated with a ResourceOwner by recording the address
+of the owning ResourceOwner in such an object. There is an API for other
+modules to get control during ResourceOwner release, so that they can scan
+their own data structures to find the objects that need to be deleted.
+
+Locks are handled specially because in non-error situations a lock should
+be held until end of transaction, even if it was originally taken by a
+subtransaction or portal. Therefore, the "release" operation on a child
+ResourceOwner transfers lock ownership to the parent instead of actually
+releasing the lock, if isCommit is true.
+
+Whenever we are inside a transaction, the global variable
+CurrentResourceOwner shows which resource owner should be assigned
+ownership of acquired resources. Note however that CurrentResourceOwner
+is NULL when not inside any transaction (or when inside a failed
+transaction). In this case it is not valid to acquire query-lifespan
+resources.
+
+When unpinning a buffer or releasing a lock or cache reference,
+CurrentResourceOwner must point to the same resource owner that was current
+when the buffer, lock, or cache reference was acquired. It would be possible
+to relax this restriction given additional bookkeeping effort, but at present
+there seems no need.
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
new file mode 100644
index 0000000..ceb4b0e
--- /dev/null
+++ b/src/backend/utils/resowner/resowner.c
@@ -0,0 +1,1490 @@
+/*-------------------------------------------------------------------------
+ *
+ * resowner.c
+ * POSTGRES resource owner management code.
+ *
+ * Query-lifespan resources are tracked by associating them with
+ * ResourceOwner objects. This provides a simple mechanism for ensuring
+ * that such resources are freed at the right time.
+ * See utils/resowner/README for more info.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/resowner/resowner.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "common/cryptohash.h"
+#include "common/hashfn.h"
+#include "common/hmac.h"
+#include "jit/jit.h"
+#include "storage/bufmgr.h"
+#include "storage/ipc.h"
+#include "storage/predicate.h"
+#include "storage/proc.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/resowner_private.h"
+#include "utils/snapmgr.h"
+
+
+/*
+ * All resource IDs managed by this code are required to fit into a Datum,
+ * which is fine since they are generally pointers or integers.
+ *
+ * Provide Datum conversion macros for a couple of things that are really
+ * just "int".
+ */
+#define FileGetDatum(file) Int32GetDatum(file)
+#define DatumGetFile(datum) ((File) DatumGetInt32(datum))
+#define BufferGetDatum(buffer) Int32GetDatum(buffer)
+#define DatumGetBuffer(datum) ((Buffer) DatumGetInt32(datum))
+
+/*
+ * ResourceArray is a common structure for storing all types of resource IDs.
+ *
+ * We manage small sets of resource IDs by keeping them in a simple array:
+ * itemsarr[k] holds an ID, for 0 <= k < nitems <= maxitems = capacity.
+ *
+ * If a set grows large, we switch over to using open-addressing hashing.
+ * Then, itemsarr[] is a hash table of "capacity" slots, with each
+ * slot holding either an ID or "invalidval". nitems is the number of valid
+ * items present; if it would exceed maxitems, we enlarge the array and
+ * re-hash. In this mode, maxitems should be rather less than capacity so
+ * that we don't waste too much time searching for empty slots.
+ *
+ * In either mode, lastidx remembers the location of the last item inserted
+ * or returned by GetAny; this speeds up searches in ResourceArrayRemove.
+ */
+typedef struct ResourceArray
+{
+ Datum *itemsarr; /* buffer for storing values */
+ Datum invalidval; /* value that is considered invalid */
+ uint32 capacity; /* allocated length of itemsarr[] */
+ uint32 nitems; /* how many items are stored in items array */
+ uint32 maxitems; /* current limit on nitems before enlarging */
+ uint32 lastidx; /* index of last item returned by GetAny */
+} ResourceArray;
+
+/*
+ * Initially allocated size of a ResourceArray. Must be power of two since
+ * we'll use (arraysize - 1) as mask for hashing.
+ */
+#define RESARRAY_INIT_SIZE 16
+
+/*
+ * When to switch to hashing vs. simple array logic in a ResourceArray.
+ */
+#define RESARRAY_MAX_ARRAY 64
+#define RESARRAY_IS_ARRAY(resarr) ((resarr)->capacity <= RESARRAY_MAX_ARRAY)
+
+/*
+ * How many items may be stored in a resource array of given capacity.
+ * When this number is reached, we must resize.
+ */
+#define RESARRAY_MAX_ITEMS(capacity) \
+ ((capacity) <= RESARRAY_MAX_ARRAY ? (capacity) : (capacity)/4 * 3)
+
+/*
+ * To speed up bulk releasing or reassigning locks from a resource owner to
+ * its parent, each resource owner has a small cache of locks it owns. The
+ * lock manager has the same information in its local lock hash table, and
+ * we fall back on that if cache overflows, but traversing the hash table
+ * is slower when there are a lot of locks belonging to other resource owners.
+ *
+ * MAX_RESOWNER_LOCKS is the size of the per-resource owner cache. It's
+ * chosen based on some testing with pg_dump with a large schema. When the
+ * tests were done (on 9.2), resource owners in a pg_dump run contained up
+ * to 9 locks, regardless of the schema size, except for the top resource
+ * owner which contained much more (overflowing the cache). 15 seems like a
+ * nice round number that's somewhat higher than what pg_dump needs. Note that
+ * making this number larger is not free - the bigger the cache, the slower
+ * it is to release locks (in retail), when a resource owner holds many locks.
+ */
+#define MAX_RESOWNER_LOCKS 15
+
+/*
+ * ResourceOwner objects look like this
+ */
+typedef struct ResourceOwnerData
+{
+ ResourceOwner parent; /* NULL if no parent (toplevel owner) */
+ ResourceOwner firstchild; /* head of linked list of children */
+ ResourceOwner nextchild; /* next child of same parent */
+ const char *name; /* name (just for debugging) */
+
+ /* We have built-in support for remembering: */
+ ResourceArray bufferarr; /* owned buffers */
+ ResourceArray catrefarr; /* catcache references */
+ ResourceArray catlistrefarr; /* catcache-list pins */
+ ResourceArray relrefarr; /* relcache references */
+ ResourceArray planrefarr; /* plancache references */
+ ResourceArray tupdescarr; /* tupdesc references */
+ ResourceArray snapshotarr; /* snapshot references */
+ ResourceArray filearr; /* open temporary files */
+ ResourceArray dsmarr; /* dynamic shmem segments */
+ ResourceArray jitarr; /* JIT contexts */
+ ResourceArray cryptohasharr; /* cryptohash contexts */
+ ResourceArray hmacarr; /* HMAC contexts */
+
+ /* We can remember up to MAX_RESOWNER_LOCKS references to local locks. */
+ int nlocks; /* number of owned locks */
+ LOCALLOCK *locks[MAX_RESOWNER_LOCKS]; /* list of owned locks */
+} ResourceOwnerData;
+
+
+/*****************************************************************************
+ * GLOBAL MEMORY *
+ *****************************************************************************/
+
+ResourceOwner CurrentResourceOwner = NULL;
+ResourceOwner CurTransactionResourceOwner = NULL;
+ResourceOwner TopTransactionResourceOwner = NULL;
+ResourceOwner AuxProcessResourceOwner = NULL;
+
+/*
+ * List of add-on callbacks for resource releasing
+ */
+typedef struct ResourceReleaseCallbackItem
+{
+ struct ResourceReleaseCallbackItem *next;
+ ResourceReleaseCallback callback;
+ void *arg;
+} ResourceReleaseCallbackItem;
+
+static ResourceReleaseCallbackItem *ResourceRelease_callbacks = NULL;
+
+
+/* Internal routines */
+static void ResourceArrayInit(ResourceArray *resarr, Datum invalidval);
+static void ResourceArrayEnlarge(ResourceArray *resarr);
+static void ResourceArrayAdd(ResourceArray *resarr, Datum value);
+static bool ResourceArrayRemove(ResourceArray *resarr, Datum value);
+static bool ResourceArrayGetAny(ResourceArray *resarr, Datum *value);
+static void ResourceArrayFree(ResourceArray *resarr);
+static void ResourceOwnerReleaseInternal(ResourceOwner owner,
+ ResourceReleasePhase phase,
+ bool isCommit,
+ bool isTopLevel);
+static void ReleaseAuxProcessResourcesCallback(int code, Datum arg);
+static void PrintRelCacheLeakWarning(Relation rel);
+static void PrintPlanCacheLeakWarning(CachedPlan *plan);
+static void PrintTupleDescLeakWarning(TupleDesc tupdesc);
+static void PrintSnapshotLeakWarning(Snapshot snapshot);
+static void PrintFileLeakWarning(File file);
+static void PrintDSMLeakWarning(dsm_segment *seg);
+static void PrintCryptoHashLeakWarning(Datum handle);
+static void PrintHMACLeakWarning(Datum handle);
+
+
+/*****************************************************************************
+ * INTERNAL ROUTINES *
+ *****************************************************************************/
+
+
+/*
+ * Initialize a ResourceArray
+ */
+static void
+ResourceArrayInit(ResourceArray *resarr, Datum invalidval)
+{
+ /* Assert it's empty */
+ Assert(resarr->itemsarr == NULL);
+ Assert(resarr->capacity == 0);
+ Assert(resarr->nitems == 0);
+ Assert(resarr->maxitems == 0);
+ /* Remember the appropriate "invalid" value */
+ resarr->invalidval = invalidval;
+ /* We don't allocate any storage until needed */
+}
+
+/*
+ * Make sure there is room for at least one more resource in an array.
+ *
+ * This is separate from actually inserting a resource because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+static void
+ResourceArrayEnlarge(ResourceArray *resarr)
+{
+ uint32 i,
+ oldcap,
+ newcap;
+ Datum *olditemsarr;
+ Datum *newitemsarr;
+
+ if (resarr->nitems < resarr->maxitems)
+ return; /* no work needed */
+
+ olditemsarr = resarr->itemsarr;
+ oldcap = resarr->capacity;
+
+ /* Double the capacity of the array (capacity must stay a power of 2!) */
+ newcap = (oldcap > 0) ? oldcap * 2 : RESARRAY_INIT_SIZE;
+ newitemsarr = (Datum *) MemoryContextAlloc(TopMemoryContext,
+ newcap * sizeof(Datum));
+ for (i = 0; i < newcap; i++)
+ newitemsarr[i] = resarr->invalidval;
+
+ /* We assume we can't fail below this point, so OK to scribble on resarr */
+ resarr->itemsarr = newitemsarr;
+ resarr->capacity = newcap;
+ resarr->maxitems = RESARRAY_MAX_ITEMS(newcap);
+ resarr->nitems = 0;
+
+ if (olditemsarr != NULL)
+ {
+ /*
+ * Transfer any pre-existing entries into the new array; they don't
+ * necessarily go where they were before, so this simple logic is the
+ * best way. Note that if we were managing the set as a simple array,
+ * the entries after nitems are garbage, but that shouldn't matter
+ * because we won't get here unless nitems was equal to oldcap.
+ */
+ for (i = 0; i < oldcap; i++)
+ {
+ if (olditemsarr[i] != resarr->invalidval)
+ ResourceArrayAdd(resarr, olditemsarr[i]);
+ }
+
+ /* And release old array. */
+ pfree(olditemsarr);
+ }
+
+ Assert(resarr->nitems < resarr->maxitems);
+}
+
+/*
+ * Add a resource to ResourceArray
+ *
+ * Caller must have previously done ResourceArrayEnlarge()
+ */
+static void
+ResourceArrayAdd(ResourceArray *resarr, Datum value)
+{
+ uint32 idx;
+
+ Assert(value != resarr->invalidval);
+ Assert(resarr->nitems < resarr->maxitems);
+
+ if (RESARRAY_IS_ARRAY(resarr))
+ {
+ /* Append to linear array. */
+ idx = resarr->nitems;
+ }
+ else
+ {
+ /* Insert into first free slot at or after hash location. */
+ uint32 mask = resarr->capacity - 1;
+
+ idx = DatumGetUInt32(hash_any((void *) &value, sizeof(value))) & mask;
+ for (;;)
+ {
+ if (resarr->itemsarr[idx] == resarr->invalidval)
+ break;
+ idx = (idx + 1) & mask;
+ }
+ }
+ resarr->lastidx = idx;
+ resarr->itemsarr[idx] = value;
+ resarr->nitems++;
+}
+
+/*
+ * Remove a resource from ResourceArray
+ *
+ * Returns true on success, false if resource was not found.
+ *
+ * Note: if same resource ID appears more than once, one instance is removed.
+ */
+static bool
+ResourceArrayRemove(ResourceArray *resarr, Datum value)
+{
+ uint32 i,
+ idx,
+ lastidx = resarr->lastidx;
+
+ Assert(value != resarr->invalidval);
+
+ /* Search through all items, but try lastidx first. */
+ if (RESARRAY_IS_ARRAY(resarr))
+ {
+ if (lastidx < resarr->nitems &&
+ resarr->itemsarr[lastidx] == value)
+ {
+ resarr->itemsarr[lastidx] = resarr->itemsarr[resarr->nitems - 1];
+ resarr->nitems--;
+ /* Update lastidx to make reverse-order removals fast. */
+ resarr->lastidx = resarr->nitems - 1;
+ return true;
+ }
+ for (i = 0; i < resarr->nitems; i++)
+ {
+ if (resarr->itemsarr[i] == value)
+ {
+ resarr->itemsarr[i] = resarr->itemsarr[resarr->nitems - 1];
+ resarr->nitems--;
+ /* Update lastidx to make reverse-order removals fast. */
+ resarr->lastidx = resarr->nitems - 1;
+ return true;
+ }
+ }
+ }
+ else
+ {
+ uint32 mask = resarr->capacity - 1;
+
+ if (lastidx < resarr->capacity &&
+ resarr->itemsarr[lastidx] == value)
+ {
+ resarr->itemsarr[lastidx] = resarr->invalidval;
+ resarr->nitems--;
+ return true;
+ }
+ idx = DatumGetUInt32(hash_any((void *) &value, sizeof(value))) & mask;
+ for (i = 0; i < resarr->capacity; i++)
+ {
+ if (resarr->itemsarr[idx] == value)
+ {
+ resarr->itemsarr[idx] = resarr->invalidval;
+ resarr->nitems--;
+ return true;
+ }
+ idx = (idx + 1) & mask;
+ }
+ }
+
+ return false;
+}
+
+/*
+ * Get any convenient entry in a ResourceArray.
+ *
+ * "Convenient" is defined as "easy for ResourceArrayRemove to remove";
+ * we help that along by setting lastidx to match. This avoids O(N^2) cost
+ * when removing all ResourceArray items during ResourceOwner destruction.
+ *
+ * Returns true if we found an element, or false if the array is empty.
+ */
+static bool
+ResourceArrayGetAny(ResourceArray *resarr, Datum *value)
+{
+ if (resarr->nitems == 0)
+ return false;
+
+ if (RESARRAY_IS_ARRAY(resarr))
+ {
+ /* Linear array: just return the first element. */
+ resarr->lastidx = 0;
+ }
+ else
+ {
+ /* Hash: search forward from wherever we were last. */
+ uint32 mask = resarr->capacity - 1;
+
+ for (;;)
+ {
+ resarr->lastidx &= mask;
+ if (resarr->itemsarr[resarr->lastidx] != resarr->invalidval)
+ break;
+ resarr->lastidx++;
+ }
+ }
+
+ *value = resarr->itemsarr[resarr->lastidx];
+ return true;
+}
+
+/*
+ * Trash a ResourceArray (we don't care about its state after this)
+ */
+static void
+ResourceArrayFree(ResourceArray *resarr)
+{
+ if (resarr->itemsarr)
+ pfree(resarr->itemsarr);
+}
+
+
+/*****************************************************************************
+ * EXPORTED ROUTINES *
+ *****************************************************************************/
+
+
+/*
+ * ResourceOwnerCreate
+ * Create an empty ResourceOwner.
+ *
+ * All ResourceOwner objects are kept in TopMemoryContext, since they should
+ * only be freed explicitly.
+ */
+ResourceOwner
+ResourceOwnerCreate(ResourceOwner parent, const char *name)
+{
+ ResourceOwner owner;
+
+ owner = (ResourceOwner) MemoryContextAllocZero(TopMemoryContext,
+ sizeof(ResourceOwnerData));
+ owner->name = name;
+
+ if (parent)
+ {
+ owner->parent = parent;
+ owner->nextchild = parent->firstchild;
+ parent->firstchild = owner;
+ }
+
+ ResourceArrayInit(&(owner->bufferarr), BufferGetDatum(InvalidBuffer));
+ ResourceArrayInit(&(owner->catrefarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->catlistrefarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->relrefarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->planrefarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->tupdescarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->snapshotarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->filearr), FileGetDatum(-1));
+ ResourceArrayInit(&(owner->dsmarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->jitarr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->cryptohasharr), PointerGetDatum(NULL));
+ ResourceArrayInit(&(owner->hmacarr), PointerGetDatum(NULL));
+
+ return owner;
+}
+
+/*
+ * ResourceOwnerRelease
+ * Release all resources owned by a ResourceOwner and its descendants,
+ * but don't delete the owner objects themselves.
+ *
+ * Note that this executes just one phase of release, and so typically
+ * must be called three times. We do it this way because (a) we want to
+ * do all the recursion separately for each phase, thereby preserving
+ * the needed order of operations; and (b) xact.c may have other operations
+ * to do between the phases.
+ *
+ * phase: release phase to execute
+ * isCommit: true for successful completion of a query or transaction,
+ * false for unsuccessful
+ * isTopLevel: true if completing a main transaction, else false
+ *
+ * isCommit is passed because some modules may expect that their resources
+ * were all released already if the transaction or portal finished normally.
+ * If so it is reasonable to give a warning (NOT an error) should any
+ * unreleased resources be present. When isCommit is false, such warnings
+ * are generally inappropriate.
+ *
+ * isTopLevel is passed when we are releasing TopTransactionResourceOwner
+ * at completion of a main transaction. This generally means that *all*
+ * resources will be released, and so we can optimize things a bit.
+ */
+void
+ResourceOwnerRelease(ResourceOwner owner,
+ ResourceReleasePhase phase,
+ bool isCommit,
+ bool isTopLevel)
+{
+ /* There's not currently any setup needed before recursing */
+ ResourceOwnerReleaseInternal(owner, phase, isCommit, isTopLevel);
+}
+
+static void
+ResourceOwnerReleaseInternal(ResourceOwner owner,
+ ResourceReleasePhase phase,
+ bool isCommit,
+ bool isTopLevel)
+{
+ ResourceOwner child;
+ ResourceOwner save;
+ ResourceReleaseCallbackItem *item;
+ Datum foundres;
+
+ /* Recurse to handle descendants */
+ for (child = owner->firstchild; child != NULL; child = child->nextchild)
+ ResourceOwnerReleaseInternal(child, phase, isCommit, isTopLevel);
+
+ /*
+ * Make CurrentResourceOwner point to me, so that ReleaseBuffer etc don't
+ * get confused.
+ */
+ save = CurrentResourceOwner;
+ CurrentResourceOwner = owner;
+
+ if (phase == RESOURCE_RELEASE_BEFORE_LOCKS)
+ {
+ /*
+ * Release buffer pins. Note that ReleaseBuffer will remove the
+ * buffer entry from our array, so we just have to iterate till there
+ * are none.
+ *
+ * During a commit, there shouldn't be any remaining pins --- that
+ * would indicate failure to clean up the executor correctly --- so
+ * issue warnings. In the abort case, just clean up quietly.
+ */
+ while (ResourceArrayGetAny(&(owner->bufferarr), &foundres))
+ {
+ Buffer res = DatumGetBuffer(foundres);
+
+ if (isCommit)
+ PrintBufferLeakWarning(res);
+ ReleaseBuffer(res);
+ }
+
+ /* Ditto for relcache references */
+ while (ResourceArrayGetAny(&(owner->relrefarr), &foundres))
+ {
+ Relation res = (Relation) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintRelCacheLeakWarning(res);
+ RelationClose(res);
+ }
+
+ /* Ditto for dynamic shared memory segments */
+ while (ResourceArrayGetAny(&(owner->dsmarr), &foundres))
+ {
+ dsm_segment *res = (dsm_segment *) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintDSMLeakWarning(res);
+ dsm_detach(res);
+ }
+
+ /* Ditto for JIT contexts */
+ while (ResourceArrayGetAny(&(owner->jitarr), &foundres))
+ {
+ JitContext *context = (JitContext *) PointerGetDatum(foundres);
+
+ jit_release_context(context);
+ }
+
+ /* Ditto for cryptohash contexts */
+ while (ResourceArrayGetAny(&(owner->cryptohasharr), &foundres))
+ {
+ pg_cryptohash_ctx *context =
+ (pg_cryptohash_ctx *) PointerGetDatum(foundres);
+
+ if (isCommit)
+ PrintCryptoHashLeakWarning(foundres);
+ pg_cryptohash_free(context);
+ }
+
+ /* Ditto for HMAC contexts */
+ while (ResourceArrayGetAny(&(owner->hmacarr), &foundres))
+ {
+ pg_hmac_ctx *context = (pg_hmac_ctx *) PointerGetDatum(foundres);
+
+ if (isCommit)
+ PrintHMACLeakWarning(foundres);
+ pg_hmac_free(context);
+ }
+ }
+ else if (phase == RESOURCE_RELEASE_LOCKS)
+ {
+ if (isTopLevel)
+ {
+ /*
+ * For a top-level xact we are going to release all locks (or at
+ * least all non-session locks), so just do a single lmgr call at
+ * the top of the recursion.
+ */
+ if (owner == TopTransactionResourceOwner)
+ {
+ ProcReleaseLocks(isCommit);
+ ReleasePredicateLocks(isCommit, false);
+ }
+ }
+ else
+ {
+ /*
+ * Release locks retail. Note that if we are committing a
+ * subtransaction, we do NOT release its locks yet, but transfer
+ * them to the parent.
+ */
+ LOCALLOCK **locks;
+ int nlocks;
+
+ Assert(owner->parent != NULL);
+
+ /*
+ * Pass the list of locks owned by this resource owner to the lock
+ * manager, unless it has overflowed.
+ */
+ if (owner->nlocks > MAX_RESOWNER_LOCKS)
+ {
+ locks = NULL;
+ nlocks = 0;
+ }
+ else
+ {
+ locks = owner->locks;
+ nlocks = owner->nlocks;
+ }
+
+ if (isCommit)
+ LockReassignCurrentOwner(locks, nlocks);
+ else
+ LockReleaseCurrentOwner(locks, nlocks);
+ }
+ }
+ else if (phase == RESOURCE_RELEASE_AFTER_LOCKS)
+ {
+ /*
+ * Release catcache references. Note that ReleaseCatCache will remove
+ * the catref entry from our array, so we just have to iterate till
+ * there are none.
+ *
+ * As with buffer pins, warn if any are left at commit time.
+ */
+ while (ResourceArrayGetAny(&(owner->catrefarr), &foundres))
+ {
+ HeapTuple res = (HeapTuple) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintCatCacheLeakWarning(res);
+ ReleaseCatCache(res);
+ }
+
+ /* Ditto for catcache lists */
+ while (ResourceArrayGetAny(&(owner->catlistrefarr), &foundres))
+ {
+ CatCList *res = (CatCList *) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintCatCacheListLeakWarning(res);
+ ReleaseCatCacheList(res);
+ }
+
+ /* Ditto for plancache references */
+ while (ResourceArrayGetAny(&(owner->planrefarr), &foundres))
+ {
+ CachedPlan *res = (CachedPlan *) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintPlanCacheLeakWarning(res);
+ ReleaseCachedPlan(res, owner);
+ }
+
+ /* Ditto for tupdesc references */
+ while (ResourceArrayGetAny(&(owner->tupdescarr), &foundres))
+ {
+ TupleDesc res = (TupleDesc) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintTupleDescLeakWarning(res);
+ DecrTupleDescRefCount(res);
+ }
+
+ /* Ditto for snapshot references */
+ while (ResourceArrayGetAny(&(owner->snapshotarr), &foundres))
+ {
+ Snapshot res = (Snapshot) DatumGetPointer(foundres);
+
+ if (isCommit)
+ PrintSnapshotLeakWarning(res);
+ UnregisterSnapshot(res);
+ }
+
+ /* Ditto for temporary files */
+ while (ResourceArrayGetAny(&(owner->filearr), &foundres))
+ {
+ File res = DatumGetFile(foundres);
+
+ if (isCommit)
+ PrintFileLeakWarning(res);
+ FileClose(res);
+ }
+ }
+
+ /* Let add-on modules get a chance too */
+ for (item = ResourceRelease_callbacks; item; item = item->next)
+ item->callback(phase, isCommit, isTopLevel, item->arg);
+
+ CurrentResourceOwner = save;
+}
+
+/*
+ * ResourceOwnerReleaseAllPlanCacheRefs
+ * Release the plancache references (only) held by this owner.
+ *
+ * We might eventually add similar functions for other resource types,
+ * but for now, only this is needed.
+ */
+void
+ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner)
+{
+ Datum foundres;
+
+ while (ResourceArrayGetAny(&(owner->planrefarr), &foundres))
+ {
+ CachedPlan *res = (CachedPlan *) DatumGetPointer(foundres);
+
+ ReleaseCachedPlan(res, owner);
+ }
+}
+
+/*
+ * ResourceOwnerDelete
+ * Delete an owner object and its descendants.
+ *
+ * The caller must have already released all resources in the object tree.
+ */
+void
+ResourceOwnerDelete(ResourceOwner owner)
+{
+ /* We had better not be deleting CurrentResourceOwner ... */
+ Assert(owner != CurrentResourceOwner);
+
+ /* And it better not own any resources, either */
+ Assert(owner->bufferarr.nitems == 0);
+ Assert(owner->catrefarr.nitems == 0);
+ Assert(owner->catlistrefarr.nitems == 0);
+ Assert(owner->relrefarr.nitems == 0);
+ Assert(owner->planrefarr.nitems == 0);
+ Assert(owner->tupdescarr.nitems == 0);
+ Assert(owner->snapshotarr.nitems == 0);
+ Assert(owner->filearr.nitems == 0);
+ Assert(owner->dsmarr.nitems == 0);
+ Assert(owner->jitarr.nitems == 0);
+ Assert(owner->cryptohasharr.nitems == 0);
+ Assert(owner->hmacarr.nitems == 0);
+ Assert(owner->nlocks == 0 || owner->nlocks == MAX_RESOWNER_LOCKS + 1);
+
+ /*
+ * Delete children. The recursive call will delink the child from me, so
+ * just iterate as long as there is a child.
+ */
+ while (owner->firstchild != NULL)
+ ResourceOwnerDelete(owner->firstchild);
+
+ /*
+ * We delink the owner from its parent before deleting it, so that if
+ * there's an error we won't have deleted/busted owners still attached to
+ * the owner tree. Better a leak than a crash.
+ */
+ ResourceOwnerNewParent(owner, NULL);
+
+ /* And free the object. */
+ ResourceArrayFree(&(owner->bufferarr));
+ ResourceArrayFree(&(owner->catrefarr));
+ ResourceArrayFree(&(owner->catlistrefarr));
+ ResourceArrayFree(&(owner->relrefarr));
+ ResourceArrayFree(&(owner->planrefarr));
+ ResourceArrayFree(&(owner->tupdescarr));
+ ResourceArrayFree(&(owner->snapshotarr));
+ ResourceArrayFree(&(owner->filearr));
+ ResourceArrayFree(&(owner->dsmarr));
+ ResourceArrayFree(&(owner->jitarr));
+ ResourceArrayFree(&(owner->cryptohasharr));
+ ResourceArrayFree(&(owner->hmacarr));
+
+ pfree(owner);
+}
+
+/*
+ * Fetch parent of a ResourceOwner (returns NULL if top-level owner)
+ */
+ResourceOwner
+ResourceOwnerGetParent(ResourceOwner owner)
+{
+ return owner->parent;
+}
+
+/*
+ * Reassign a ResourceOwner to have a new parent
+ */
+void
+ResourceOwnerNewParent(ResourceOwner owner,
+ ResourceOwner newparent)
+{
+ ResourceOwner oldparent = owner->parent;
+
+ if (oldparent)
+ {
+ if (owner == oldparent->firstchild)
+ oldparent->firstchild = owner->nextchild;
+ else
+ {
+ ResourceOwner child;
+
+ for (child = oldparent->firstchild; child; child = child->nextchild)
+ {
+ if (owner == child->nextchild)
+ {
+ child->nextchild = owner->nextchild;
+ break;
+ }
+ }
+ }
+ }
+
+ if (newparent)
+ {
+ Assert(owner != newparent);
+ owner->parent = newparent;
+ owner->nextchild = newparent->firstchild;
+ newparent->firstchild = owner;
+ }
+ else
+ {
+ owner->parent = NULL;
+ owner->nextchild = NULL;
+ }
+}
+
+/*
+ * Register or deregister callback functions for resource cleanup
+ *
+ * These functions are intended for use by dynamically loaded modules.
+ * For built-in modules we generally just hardwire the appropriate calls.
+ *
+ * Note that the callback occurs post-commit or post-abort, so the callback
+ * functions can only do noncritical cleanup.
+ */
+void
+RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
+{
+ ResourceReleaseCallbackItem *item;
+
+ item = (ResourceReleaseCallbackItem *)
+ MemoryContextAlloc(TopMemoryContext,
+ sizeof(ResourceReleaseCallbackItem));
+ item->callback = callback;
+ item->arg = arg;
+ item->next = ResourceRelease_callbacks;
+ ResourceRelease_callbacks = item;
+}
+
+void
+UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
+{
+ ResourceReleaseCallbackItem *item;
+ ResourceReleaseCallbackItem *prev;
+
+ prev = NULL;
+ for (item = ResourceRelease_callbacks; item; prev = item, item = item->next)
+ {
+ if (item->callback == callback && item->arg == arg)
+ {
+ if (prev)
+ prev->next = item->next;
+ else
+ ResourceRelease_callbacks = item->next;
+ pfree(item);
+ break;
+ }
+ }
+}
+
+/*
+ * Establish an AuxProcessResourceOwner for the current process.
+ */
+void
+CreateAuxProcessResourceOwner(void)
+{
+ Assert(AuxProcessResourceOwner == NULL);
+ Assert(CurrentResourceOwner == NULL);
+ AuxProcessResourceOwner = ResourceOwnerCreate(NULL, "AuxiliaryProcess");
+ CurrentResourceOwner = AuxProcessResourceOwner;
+
+ /*
+ * Register a shmem-exit callback for cleanup of aux-process resource
+ * owner. (This needs to run after, e.g., ShutdownXLOG.)
+ */
+ on_shmem_exit(ReleaseAuxProcessResourcesCallback, 0);
+}
+
+/*
+ * Convenience routine to release all resources tracked in
+ * AuxProcessResourceOwner (but that resowner is not destroyed here).
+ * Warn about leaked resources if isCommit is true.
+ */
+void
+ReleaseAuxProcessResources(bool isCommit)
+{
+ /*
+ * At this writing, the only thing that could actually get released is
+ * buffer pins; but we may as well do the full release protocol.
+ */
+ ResourceOwnerRelease(AuxProcessResourceOwner,
+ RESOURCE_RELEASE_BEFORE_LOCKS,
+ isCommit, true);
+ ResourceOwnerRelease(AuxProcessResourceOwner,
+ RESOURCE_RELEASE_LOCKS,
+ isCommit, true);
+ ResourceOwnerRelease(AuxProcessResourceOwner,
+ RESOURCE_RELEASE_AFTER_LOCKS,
+ isCommit, true);
+}
+
+/*
+ * Shmem-exit callback for the same.
+ * Warn about leaked resources if process exit code is zero (ie normal).
+ */
+static void
+ReleaseAuxProcessResourcesCallback(int code, Datum arg)
+{
+ bool isCommit = (code == 0);
+
+ ReleaseAuxProcessResources(isCommit);
+}
+
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * buffer array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeBuffers(ResourceOwner owner)
+{
+ /* We used to allow pinning buffers without a resowner, but no more */
+ Assert(owner != NULL);
+ ResourceArrayEnlarge(&(owner->bufferarr));
+}
+
+/*
+ * Remember that a buffer pin is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeBuffers()
+ */
+void
+ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer)
+{
+ ResourceArrayAdd(&(owner->bufferarr), BufferGetDatum(buffer));
+}
+
+/*
+ * Forget that a buffer pin is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer)
+{
+ if (!ResourceArrayRemove(&(owner->bufferarr), BufferGetDatum(buffer)))
+ elog(ERROR, "buffer %d is not owned by resource owner %s",
+ buffer, owner->name);
+}
+
+/*
+ * Remember that a Local Lock is owned by a ResourceOwner
+ *
+ * This is different from the other Remember functions in that the list of
+ * locks is only a lossy cache. It can hold up to MAX_RESOWNER_LOCKS entries,
+ * and when it overflows, we stop tracking locks. The point of only remembering
+ * only up to MAX_RESOWNER_LOCKS entries is that if a lot of locks are held,
+ * ResourceOwnerForgetLock doesn't need to scan through a large array to find
+ * the entry.
+ */
+void
+ResourceOwnerRememberLock(ResourceOwner owner, LOCALLOCK *locallock)
+{
+ Assert(locallock != NULL);
+
+ if (owner->nlocks > MAX_RESOWNER_LOCKS)
+ return; /* we have already overflowed */
+
+ if (owner->nlocks < MAX_RESOWNER_LOCKS)
+ owner->locks[owner->nlocks] = locallock;
+ else
+ {
+ /* overflowed */
+ }
+ owner->nlocks++;
+}
+
+/*
+ * Forget that a Local Lock is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
+{
+ int i;
+
+ if (owner->nlocks > MAX_RESOWNER_LOCKS)
+ return; /* we have overflowed */
+
+ Assert(owner->nlocks > 0);
+ for (i = owner->nlocks - 1; i >= 0; i--)
+ {
+ if (locallock == owner->locks[i])
+ {
+ owner->locks[i] = owner->locks[owner->nlocks - 1];
+ owner->nlocks--;
+ return;
+ }
+ }
+ elog(ERROR, "lock reference %p is not owned by resource owner %s",
+ locallock, owner->name);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * catcache reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->catrefarr));
+}
+
+/*
+ * Remember that a catcache reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeCatCacheRefs()
+ */
+void
+ResourceOwnerRememberCatCacheRef(ResourceOwner owner, HeapTuple tuple)
+{
+ ResourceArrayAdd(&(owner->catrefarr), PointerGetDatum(tuple));
+}
+
+/*
+ * Forget that a catcache reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetCatCacheRef(ResourceOwner owner, HeapTuple tuple)
+{
+ if (!ResourceArrayRemove(&(owner->catrefarr), PointerGetDatum(tuple)))
+ elog(ERROR, "catcache reference %p is not owned by resource owner %s",
+ tuple, owner->name);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * catcache-list reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->catlistrefarr));
+}
+
+/*
+ * Remember that a catcache-list reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeCatCacheListRefs()
+ */
+void
+ResourceOwnerRememberCatCacheListRef(ResourceOwner owner, CatCList *list)
+{
+ ResourceArrayAdd(&(owner->catlistrefarr), PointerGetDatum(list));
+}
+
+/*
+ * Forget that a catcache-list reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetCatCacheListRef(ResourceOwner owner, CatCList *list)
+{
+ if (!ResourceArrayRemove(&(owner->catlistrefarr), PointerGetDatum(list)))
+ elog(ERROR, "catcache list reference %p is not owned by resource owner %s",
+ list, owner->name);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * relcache reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeRelationRefs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->relrefarr));
+}
+
+/*
+ * Remember that a relcache reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeRelationRefs()
+ */
+void
+ResourceOwnerRememberRelationRef(ResourceOwner owner, Relation rel)
+{
+ ResourceArrayAdd(&(owner->relrefarr), PointerGetDatum(rel));
+}
+
+/*
+ * Forget that a relcache reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel)
+{
+ if (!ResourceArrayRemove(&(owner->relrefarr), PointerGetDatum(rel)))
+ elog(ERROR, "relcache reference %s is not owned by resource owner %s",
+ RelationGetRelationName(rel), owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintRelCacheLeakWarning(Relation rel)
+{
+ elog(WARNING, "relcache reference leak: relation \"%s\" not closed",
+ RelationGetRelationName(rel));
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * plancache reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->planrefarr));
+}
+
+/*
+ * Remember that a plancache reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargePlanCacheRefs()
+ */
+void
+ResourceOwnerRememberPlanCacheRef(ResourceOwner owner, CachedPlan *plan)
+{
+ ResourceArrayAdd(&(owner->planrefarr), PointerGetDatum(plan));
+}
+
+/*
+ * Forget that a plancache reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan *plan)
+{
+ if (!ResourceArrayRemove(&(owner->planrefarr), PointerGetDatum(plan)))
+ elog(ERROR, "plancache reference %p is not owned by resource owner %s",
+ plan, owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintPlanCacheLeakWarning(CachedPlan *plan)
+{
+ elog(WARNING, "plancache reference leak: plan %p not closed", plan);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * tupdesc reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeTupleDescs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->tupdescarr));
+}
+
+/*
+ * Remember that a tupdesc reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeTupleDescs()
+ */
+void
+ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
+{
+ ResourceArrayAdd(&(owner->tupdescarr), PointerGetDatum(tupdesc));
+}
+
+/*
+ * Forget that a tupdesc reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
+{
+ if (!ResourceArrayRemove(&(owner->tupdescarr), PointerGetDatum(tupdesc)))
+ elog(ERROR, "tupdesc reference %p is not owned by resource owner %s",
+ tupdesc, owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintTupleDescLeakWarning(TupleDesc tupdesc)
+{
+ elog(WARNING,
+ "TupleDesc reference leak: TupleDesc %p (%u,%d) still referenced",
+ tupdesc, tupdesc->tdtypeid, tupdesc->tdtypmod);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * snapshot reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeSnapshots(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->snapshotarr));
+}
+
+/*
+ * Remember that a snapshot reference is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeSnapshots()
+ */
+void
+ResourceOwnerRememberSnapshot(ResourceOwner owner, Snapshot snapshot)
+{
+ ResourceArrayAdd(&(owner->snapshotarr), PointerGetDatum(snapshot));
+}
+
+/*
+ * Forget that a snapshot reference is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetSnapshot(ResourceOwner owner, Snapshot snapshot)
+{
+ if (!ResourceArrayRemove(&(owner->snapshotarr), PointerGetDatum(snapshot)))
+ elog(ERROR, "snapshot reference %p is not owned by resource owner %s",
+ snapshot, owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintSnapshotLeakWarning(Snapshot snapshot)
+{
+ elog(WARNING, "Snapshot reference leak: Snapshot %p still referenced",
+ snapshot);
+}
+
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * files reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeFiles(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->filearr));
+}
+
+/*
+ * Remember that a temporary file is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeFiles()
+ */
+void
+ResourceOwnerRememberFile(ResourceOwner owner, File file)
+{
+ ResourceArrayAdd(&(owner->filearr), FileGetDatum(file));
+}
+
+/*
+ * Forget that a temporary file is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetFile(ResourceOwner owner, File file)
+{
+ if (!ResourceArrayRemove(&(owner->filearr), FileGetDatum(file)))
+ elog(ERROR, "temporary file %d is not owned by resource owner %s",
+ file, owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintFileLeakWarning(File file)
+{
+ elog(WARNING, "temporary file leak: File %d still referenced",
+ file);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * dynamic shmem segment reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeDSMs(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->dsmarr));
+}
+
+/*
+ * Remember that a dynamic shmem segment is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeDSMs()
+ */
+void
+ResourceOwnerRememberDSM(ResourceOwner owner, dsm_segment *seg)
+{
+ ResourceArrayAdd(&(owner->dsmarr), PointerGetDatum(seg));
+}
+
+/*
+ * Forget that a dynamic shmem segment is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetDSM(ResourceOwner owner, dsm_segment *seg)
+{
+ if (!ResourceArrayRemove(&(owner->dsmarr), PointerGetDatum(seg)))
+ elog(ERROR, "dynamic shared memory segment %u is not owned by resource owner %s",
+ dsm_segment_handle(seg), owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintDSMLeakWarning(dsm_segment *seg)
+{
+ elog(WARNING, "dynamic shared memory leak: segment %u still referenced",
+ dsm_segment_handle(seg));
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * JIT context reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out of
+ * memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeJIT(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->jitarr));
+}
+
+/*
+ * Remember that a JIT context is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeJIT()
+ */
+void
+ResourceOwnerRememberJIT(ResourceOwner owner, Datum handle)
+{
+ ResourceArrayAdd(&(owner->jitarr), handle);
+}
+
+/*
+ * Forget that a JIT context is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetJIT(ResourceOwner owner, Datum handle)
+{
+ if (!ResourceArrayRemove(&(owner->jitarr), handle))
+ elog(ERROR, "JIT context %p is not owned by resource owner %s",
+ DatumGetPointer(handle), owner->name);
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * cryptohash context reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out of
+ * memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeCryptoHash(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->cryptohasharr));
+}
+
+/*
+ * Remember that a cryptohash context is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeCryptoHash()
+ */
+void
+ResourceOwnerRememberCryptoHash(ResourceOwner owner, Datum handle)
+{
+ ResourceArrayAdd(&(owner->cryptohasharr), handle);
+}
+
+/*
+ * Forget that a cryptohash context is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetCryptoHash(ResourceOwner owner, Datum handle)
+{
+ if (!ResourceArrayRemove(&(owner->cryptohasharr), handle))
+ elog(ERROR, "cryptohash context %p is not owned by resource owner %s",
+ DatumGetPointer(handle), owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintCryptoHashLeakWarning(Datum handle)
+{
+ elog(WARNING, "cryptohash context reference leak: context %p still referenced",
+ DatumGetPointer(handle));
+}
+
+/*
+ * Make sure there is room for at least one more entry in a ResourceOwner's
+ * hmac context reference array.
+ *
+ * This is separate from actually inserting an entry because if we run out of
+ * memory, it's critical to do so *before* acquiring the resource.
+ */
+void
+ResourceOwnerEnlargeHMAC(ResourceOwner owner)
+{
+ ResourceArrayEnlarge(&(owner->hmacarr));
+}
+
+/*
+ * Remember that a HMAC context is owned by a ResourceOwner
+ *
+ * Caller must have previously done ResourceOwnerEnlargeHMAC()
+ */
+void
+ResourceOwnerRememberHMAC(ResourceOwner owner, Datum handle)
+{
+ ResourceArrayAdd(&(owner->hmacarr), handle);
+}
+
+/*
+ * Forget that a HMAC context is owned by a ResourceOwner
+ */
+void
+ResourceOwnerForgetHMAC(ResourceOwner owner, Datum handle)
+{
+ if (!ResourceArrayRemove(&(owner->hmacarr), handle))
+ elog(ERROR, "HMAC context %p is not owned by resource owner %s",
+ DatumGetPointer(handle), owner->name);
+}
+
+/*
+ * Debugging subroutine
+ */
+static void
+PrintHMACLeakWarning(Datum handle)
+{
+ elog(WARNING, "HMAC context reference leak: context %p still referenced",
+ DatumGetPointer(handle));
+}
diff --git a/src/backend/utils/sort/Makefile b/src/backend/utils/sort/Makefile
new file mode 100644
index 0000000..2c31fd4
--- /dev/null
+++ b/src/backend/utils/sort/Makefile
@@ -0,0 +1,25 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/sort
+#
+# IDENTIFICATION
+# src/backend/utils/sort/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/sort
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
+
+OBJS = \
+ logtape.o \
+ qsort_interruptible.o \
+ sharedtuplestore.o \
+ sortsupport.o \
+ tuplesort.o \
+ tuplestore.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c
new file mode 100644
index 0000000..31db75d
--- /dev/null
+++ b/src/backend/utils/sort/logtape.c
@@ -0,0 +1,1193 @@
+/*-------------------------------------------------------------------------
+ *
+ * logtape.c
+ * Management of "logical tapes" within temporary files.
+ *
+ * This module exists to support sorting via multiple merge passes (see
+ * tuplesort.c). Merging is an ideal algorithm for tape devices, but if
+ * we implement it on disk by creating a separate file for each "tape",
+ * there is an annoying problem: the peak space usage is at least twice
+ * the volume of actual data to be sorted. (This must be so because each
+ * datum will appear in both the input and output tapes of the final
+ * merge pass.)
+ *
+ * We can work around this problem by recognizing that any one tape
+ * dataset (with the possible exception of the final output) is written
+ * and read exactly once in a perfectly sequential manner. Therefore,
+ * a datum once read will not be required again, and we can recycle its
+ * space for use by the new tape dataset(s) being generated. In this way,
+ * the total space usage is essentially just the actual data volume, plus
+ * insignificant bookkeeping and start/stop overhead.
+ *
+ * Few OSes allow arbitrary parts of a file to be released back to the OS,
+ * so we have to implement this space-recycling ourselves within a single
+ * logical file. logtape.c exists to perform this bookkeeping and provide
+ * the illusion of N independent tape devices to tuplesort.c. Note that
+ * logtape.c itself depends on buffile.c to provide a "logical file" of
+ * larger size than the underlying OS may support.
+ *
+ * For simplicity, we allocate and release space in the underlying file
+ * in BLCKSZ-size blocks. Space allocation boils down to keeping track
+ * of which blocks in the underlying file belong to which logical tape,
+ * plus any blocks that are free (recycled and not yet reused).
+ * The blocks in each logical tape form a chain, with a prev- and next-
+ * pointer in each block.
+ *
+ * The initial write pass is guaranteed to fill the underlying file
+ * perfectly sequentially, no matter how data is divided into logical tapes.
+ * Once we begin merge passes, the access pattern becomes considerably
+ * less predictable --- but the seeking involved should be comparable to
+ * what would happen if we kept each logical tape in a separate file,
+ * so there's no serious performance penalty paid to obtain the space
+ * savings of recycling. We try to localize the write accesses by always
+ * writing to the lowest-numbered free block when we have a choice; it's
+ * not clear this helps much, but it can't hurt. (XXX perhaps a LIFO
+ * policy for free blocks would be better?)
+ *
+ * To further make the I/Os more sequential, we can use a larger buffer
+ * when reading, and read multiple blocks from the same tape in one go,
+ * whenever the buffer becomes empty.
+ *
+ * To support the above policy of writing to the lowest free block, the
+ * freelist is a min heap.
+ *
+ * Since all the bookkeeping and buffer memory is allocated with palloc(),
+ * and the underlying file(s) are made with OpenTemporaryFile, all resources
+ * for a logical tape set are certain to be cleaned up even if processing
+ * is aborted by ereport(ERROR). To avoid confusion, the caller should take
+ * care that all calls for a single LogicalTapeSet are made in the same
+ * palloc context.
+ *
+ * To support parallel sort operations involving coordinated callers to
+ * tuplesort.c routines across multiple workers, it is necessary to
+ * concatenate each worker BufFile/tapeset into one single logical tapeset
+ * managed by the leader. Workers should have produced one final
+ * materialized tape (their entire output) when this happens in leader.
+ * There will always be the same number of runs as input tapes, and the same
+ * number of input tapes as participants (worker Tuplesortstates).
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/sort/logtape.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <fcntl.h>
+
+#include "storage/buffile.h"
+#include "utils/builtins.h"
+#include "utils/logtape.h"
+#include "utils/memdebug.h"
+#include "utils/memutils.h"
+
+/*
+ * A TapeBlockTrailer is stored at the end of each BLCKSZ block.
+ *
+ * The first block of a tape has prev == -1. The last block of a tape
+ * stores the number of valid bytes on the block, inverted, in 'next'
+ * Therefore next < 0 indicates the last block.
+ */
+typedef struct TapeBlockTrailer
+{
+ long prev; /* previous block on this tape, or -1 on first
+ * block */
+ long next; /* next block on this tape, or # of valid
+ * bytes on last block (if < 0) */
+} TapeBlockTrailer;
+
+#define TapeBlockPayloadSize (BLCKSZ - sizeof(TapeBlockTrailer))
+#define TapeBlockGetTrailer(buf) \
+ ((TapeBlockTrailer *) ((char *) buf + TapeBlockPayloadSize))
+
+#define TapeBlockIsLast(buf) (TapeBlockGetTrailer(buf)->next < 0)
+#define TapeBlockGetNBytes(buf) \
+ (TapeBlockIsLast(buf) ? \
+ (- TapeBlockGetTrailer(buf)->next) : TapeBlockPayloadSize)
+#define TapeBlockSetNBytes(buf, nbytes) \
+ (TapeBlockGetTrailer(buf)->next = -(nbytes))
+
+/*
+ * When multiple tapes are being written to concurrently (as in HashAgg),
+ * avoid excessive fragmentation by preallocating block numbers to individual
+ * tapes. Each preallocation doubles in size starting at
+ * TAPE_WRITE_PREALLOC_MIN blocks up to TAPE_WRITE_PREALLOC_MAX blocks.
+ *
+ * No filesystem operations are performed for preallocation; only the block
+ * numbers are reserved. This may lead to sparse writes, which will cause
+ * ltsWriteBlock() to fill in holes with zeros.
+ */
+#define TAPE_WRITE_PREALLOC_MIN 8
+#define TAPE_WRITE_PREALLOC_MAX 128
+
+/*
+ * This data structure represents a single "logical tape" within the set
+ * of logical tapes stored in the same file.
+ *
+ * While writing, we hold the current partially-written data block in the
+ * buffer. While reading, we can hold multiple blocks in the buffer. Note
+ * that we don't retain the trailers of a block when it's read into the
+ * buffer. The buffer therefore contains one large contiguous chunk of data
+ * from the tape.
+ */
+struct LogicalTape
+{
+ LogicalTapeSet *tapeSet; /* tape set this tape is part of */
+
+ bool writing; /* T while in write phase */
+ bool frozen; /* T if blocks should not be freed when read */
+ bool dirty; /* does buffer need to be written? */
+
+ /*
+ * Block numbers of the first, current, and next block of the tape.
+ *
+ * The "current" block number is only valid when writing, or reading from
+ * a frozen tape. (When reading from an unfrozen tape, we use a larger
+ * read buffer that holds multiple blocks, so the "current" block is
+ * ambiguous.)
+ *
+ * When concatenation of worker tape BufFiles is performed, an offset to
+ * the first block in the unified BufFile space is applied during reads.
+ */
+ long firstBlockNumber;
+ long curBlockNumber;
+ long nextBlockNumber;
+ long offsetBlockNumber;
+
+ /*
+ * Buffer for current data block(s).
+ */
+ char *buffer; /* physical buffer (separately palloc'd) */
+ int buffer_size; /* allocated size of the buffer */
+ int max_size; /* highest useful, safe buffer_size */
+ int pos; /* next read/write position in buffer */
+ int nbytes; /* total # of valid bytes in buffer */
+
+ /*
+ * Preallocated block numbers are held in an array sorted in descending
+ * order; blocks are consumed from the end of the array (lowest block
+ * numbers first).
+ */
+ long *prealloc;
+ int nprealloc; /* number of elements in list */
+ int prealloc_size; /* number of elements list can hold */
+};
+
+/*
+ * This data structure represents a set of related "logical tapes" sharing
+ * space in a single underlying file. (But that "file" may be multiple files
+ * if needed to escape OS limits on file size; buffile.c handles that for us.)
+ * Tapes belonging to a tape set can be created and destroyed on-the-fly, on
+ * demand.
+ */
+struct LogicalTapeSet
+{
+ BufFile *pfile; /* underlying file for whole tape set */
+ SharedFileSet *fileset;
+ int worker; /* worker # if shared, -1 for leader/serial */
+
+ /*
+ * File size tracking. nBlocksWritten is the size of the underlying file,
+ * in BLCKSZ blocks. nBlocksAllocated is the number of blocks allocated
+ * by ltsReleaseBlock(), and it is always greater than or equal to
+ * nBlocksWritten. Blocks between nBlocksAllocated and nBlocksWritten are
+ * blocks that have been allocated for a tape, but have not been written
+ * to the underlying file yet. nHoleBlocks tracks the total number of
+ * blocks that are in unused holes between worker spaces following BufFile
+ * concatenation.
+ */
+ long nBlocksAllocated; /* # of blocks allocated */
+ long nBlocksWritten; /* # of blocks used in underlying file */
+ long nHoleBlocks; /* # of "hole" blocks left */
+
+ /*
+ * We store the numbers of recycled-and-available blocks in freeBlocks[].
+ * When there are no such blocks, we extend the underlying file.
+ *
+ * If forgetFreeSpace is true then any freed blocks are simply forgotten
+ * rather than being remembered in freeBlocks[]. See notes for
+ * LogicalTapeSetForgetFreeSpace().
+ */
+ bool forgetFreeSpace; /* are we remembering free blocks? */
+ long *freeBlocks; /* resizable array holding minheap */
+ long nFreeBlocks; /* # of currently free blocks */
+ Size freeBlocksLen; /* current allocated length of freeBlocks[] */
+ bool enable_prealloc; /* preallocate write blocks? */
+};
+
+static LogicalTape *ltsCreateTape(LogicalTapeSet *lts);
+static void ltsWriteBlock(LogicalTapeSet *lts, long blocknum, void *buffer);
+static void ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer);
+static long ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt);
+static long ltsGetFreeBlock(LogicalTapeSet *lts);
+static long ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt);
+static void ltsReleaseBlock(LogicalTapeSet *lts, long blocknum);
+static void ltsInitReadBuffer(LogicalTape *lt);
+
+
+/*
+ * Write a block-sized buffer to the specified block of the underlying file.
+ *
+ * No need for an error return convention; we ereport() on any error.
+ */
+static void
+ltsWriteBlock(LogicalTapeSet *lts, long blocknum, void *buffer)
+{
+ /*
+ * BufFile does not support "holes", so if we're about to write a block
+ * that's past the current end of file, fill the space between the current
+ * end of file and the target block with zeros.
+ *
+ * This can happen either when tapes preallocate blocks; or for the last
+ * block of a tape which might not have been flushed.
+ *
+ * Note that BufFile concatenation can leave "holes" in BufFile between
+ * worker-owned block ranges. These are tracked for reporting purposes
+ * only. We never read from nor write to these hole blocks, and so they
+ * are not considered here.
+ */
+ while (blocknum > lts->nBlocksWritten)
+ {
+ PGAlignedBlock zerobuf;
+
+ MemSet(zerobuf.data, 0, sizeof(zerobuf));
+
+ ltsWriteBlock(lts, lts->nBlocksWritten, zerobuf.data);
+ }
+
+ /* Write the requested block */
+ if (BufFileSeekBlock(lts->pfile, blocknum) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek to block %ld of temporary file",
+ blocknum)));
+ BufFileWrite(lts->pfile, buffer, BLCKSZ);
+
+ /* Update nBlocksWritten, if we extended the file */
+ if (blocknum == lts->nBlocksWritten)
+ lts->nBlocksWritten++;
+}
+
+/*
+ * Read a block-sized buffer from the specified block of the underlying file.
+ *
+ * No need for an error return convention; we ereport() on any error. This
+ * module should never attempt to read a block it doesn't know is there.
+ */
+static void
+ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer)
+{
+ size_t nread;
+
+ if (BufFileSeekBlock(lts->pfile, blocknum) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek to block %ld of temporary file",
+ blocknum)));
+ nread = BufFileRead(lts->pfile, buffer, BLCKSZ);
+ if (nread != BLCKSZ)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read block %ld of temporary file: read only %zu of %zu bytes",
+ blocknum, nread, (size_t) BLCKSZ)));
+}
+
+/*
+ * Read as many blocks as we can into the per-tape buffer.
+ *
+ * Returns true if anything was read, 'false' on EOF.
+ */
+static bool
+ltsReadFillBuffer(LogicalTape *lt)
+{
+ lt->pos = 0;
+ lt->nbytes = 0;
+
+ do
+ {
+ char *thisbuf = lt->buffer + lt->nbytes;
+ long datablocknum = lt->nextBlockNumber;
+
+ /* Fetch next block number */
+ if (datablocknum == -1L)
+ break; /* EOF */
+ /* Apply worker offset, needed for leader tapesets */
+ datablocknum += lt->offsetBlockNumber;
+
+ /* Read the block */
+ ltsReadBlock(lt->tapeSet, datablocknum, (void *) thisbuf);
+ if (!lt->frozen)
+ ltsReleaseBlock(lt->tapeSet, datablocknum);
+ lt->curBlockNumber = lt->nextBlockNumber;
+
+ lt->nbytes += TapeBlockGetNBytes(thisbuf);
+ if (TapeBlockIsLast(thisbuf))
+ {
+ lt->nextBlockNumber = -1L;
+ /* EOF */
+ break;
+ }
+ else
+ lt->nextBlockNumber = TapeBlockGetTrailer(thisbuf)->next;
+
+ /* Advance to next block, if we have buffer space left */
+ } while (lt->buffer_size - lt->nbytes > BLCKSZ);
+
+ return (lt->nbytes > 0);
+}
+
+static inline unsigned long
+left_offset(unsigned long i)
+{
+ return 2 * i + 1;
+}
+
+static inline unsigned long
+right_offset(unsigned long i)
+{
+ return 2 * i + 2;
+}
+
+static inline unsigned long
+parent_offset(unsigned long i)
+{
+ return (i - 1) / 2;
+}
+
+/*
+ * Get the next block for writing.
+ */
+static long
+ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt)
+{
+ if (lts->enable_prealloc)
+ return ltsGetPreallocBlock(lts, lt);
+ else
+ return ltsGetFreeBlock(lts);
+}
+
+/*
+ * Select the lowest currently unused block from the tape set's global free
+ * list min heap.
+ */
+static long
+ltsGetFreeBlock(LogicalTapeSet *lts)
+{
+ long *heap = lts->freeBlocks;
+ long blocknum;
+ long heapsize;
+ long holeval;
+ unsigned long holepos;
+
+ /* freelist empty; allocate a new block */
+ if (lts->nFreeBlocks == 0)
+ return lts->nBlocksAllocated++;
+
+ /* easy if heap contains one element */
+ if (lts->nFreeBlocks == 1)
+ {
+ lts->nFreeBlocks--;
+ return lts->freeBlocks[0];
+ }
+
+ /* remove top of minheap */
+ blocknum = heap[0];
+
+ /* we'll replace it with end of minheap array */
+ holeval = heap[--lts->nFreeBlocks];
+
+ /* sift down */
+ holepos = 0; /* holepos is where the "hole" is */
+ heapsize = lts->nFreeBlocks;
+ while (true)
+ {
+ unsigned long left = left_offset(holepos);
+ unsigned long right = right_offset(holepos);
+ unsigned long min_child;
+
+ if (left < heapsize && right < heapsize)
+ min_child = (heap[left] < heap[right]) ? left : right;
+ else if (left < heapsize)
+ min_child = left;
+ else if (right < heapsize)
+ min_child = right;
+ else
+ break;
+
+ if (heap[min_child] >= holeval)
+ break;
+
+ heap[holepos] = heap[min_child];
+ holepos = min_child;
+ }
+ heap[holepos] = holeval;
+
+ return blocknum;
+}
+
+/*
+ * Return the lowest free block number from the tape's preallocation list.
+ * Refill the preallocation list with blocks from the tape set's free list if
+ * necessary.
+ */
+static long
+ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt)
+{
+ /* sorted in descending order, so return the last element */
+ if (lt->nprealloc > 0)
+ return lt->prealloc[--lt->nprealloc];
+
+ if (lt->prealloc == NULL)
+ {
+ lt->prealloc_size = TAPE_WRITE_PREALLOC_MIN;
+ lt->prealloc = (long *) palloc(sizeof(long) * lt->prealloc_size);
+ }
+ else if (lt->prealloc_size < TAPE_WRITE_PREALLOC_MAX)
+ {
+ /* when the preallocation list runs out, double the size */
+ lt->prealloc_size *= 2;
+ if (lt->prealloc_size > TAPE_WRITE_PREALLOC_MAX)
+ lt->prealloc_size = TAPE_WRITE_PREALLOC_MAX;
+ lt->prealloc = (long *) repalloc(lt->prealloc,
+ sizeof(long) * lt->prealloc_size);
+ }
+
+ /* refill preallocation list */
+ lt->nprealloc = lt->prealloc_size;
+ for (int i = lt->nprealloc; i > 0; i--)
+ {
+ lt->prealloc[i - 1] = ltsGetFreeBlock(lts);
+
+ /* verify descending order */
+ Assert(i == lt->nprealloc || lt->prealloc[i - 1] > lt->prealloc[i]);
+ }
+
+ return lt->prealloc[--lt->nprealloc];
+}
+
+/*
+ * Return a block# to the freelist.
+ */
+static void
+ltsReleaseBlock(LogicalTapeSet *lts, long blocknum)
+{
+ long *heap;
+ unsigned long holepos;
+
+ /*
+ * Do nothing if we're no longer interested in remembering free space.
+ */
+ if (lts->forgetFreeSpace)
+ return;
+
+ /*
+ * Enlarge freeBlocks array if full.
+ */
+ if (lts->nFreeBlocks >= lts->freeBlocksLen)
+ {
+ /*
+ * If the freelist becomes very large, just return and leak this free
+ * block.
+ */
+ if (lts->freeBlocksLen * 2 * sizeof(long) > MaxAllocSize)
+ return;
+
+ lts->freeBlocksLen *= 2;
+ lts->freeBlocks = (long *) repalloc(lts->freeBlocks,
+ lts->freeBlocksLen * sizeof(long));
+ }
+
+ /* create a "hole" at end of minheap array */
+ heap = lts->freeBlocks;
+ holepos = lts->nFreeBlocks;
+ lts->nFreeBlocks++;
+
+ /* sift up to insert blocknum */
+ while (holepos != 0)
+ {
+ unsigned long parent = parent_offset(holepos);
+
+ if (heap[parent] < blocknum)
+ break;
+
+ heap[holepos] = heap[parent];
+ holepos = parent;
+ }
+ heap[holepos] = blocknum;
+}
+
+/*
+ * Lazily allocate and initialize the read buffer. This avoids waste when many
+ * tapes are open at once, but not all are active between rewinding and
+ * reading.
+ */
+static void
+ltsInitReadBuffer(LogicalTape *lt)
+{
+ Assert(lt->buffer_size > 0);
+ lt->buffer = palloc(lt->buffer_size);
+
+ /* Read the first block, or reset if tape is empty */
+ lt->nextBlockNumber = lt->firstBlockNumber;
+ lt->pos = 0;
+ lt->nbytes = 0;
+ ltsReadFillBuffer(lt);
+}
+
+/*
+ * Create a tape set, backed by a temporary underlying file.
+ *
+ * The tape set is initially empty. Use LogicalTapeCreate() to create
+ * tapes in it.
+ *
+ * In a single-process sort, pass NULL argument for fileset, and -1 for
+ * worker.
+ *
+ * In a parallel sort, parallel workers pass the shared fileset handle and
+ * their own worker number. After the workers have finished, create the
+ * tape set in the leader, passing the shared fileset handle and -1 for
+ * worker, and use LogicalTapeImport() to import the worker tapes into it.
+ *
+ * Currently, the leader will only import worker tapes into the set, it does
+ * not create tapes of its own, although in principle that should work.
+ *
+ * If preallocate is true, blocks for each individual tape are allocated in
+ * batches. This avoids fragmentation when writing multiple tapes at the
+ * same time.
+ */
+LogicalTapeSet *
+LogicalTapeSetCreate(bool preallocate, SharedFileSet *fileset, int worker)
+{
+ LogicalTapeSet *lts;
+
+ /*
+ * Create top-level struct including per-tape LogicalTape structs.
+ */
+ lts = (LogicalTapeSet *) palloc(sizeof(LogicalTapeSet));
+ lts->nBlocksAllocated = 0L;
+ lts->nBlocksWritten = 0L;
+ lts->nHoleBlocks = 0L;
+ lts->forgetFreeSpace = false;
+ lts->freeBlocksLen = 32; /* reasonable initial guess */
+ lts->freeBlocks = (long *) palloc(lts->freeBlocksLen * sizeof(long));
+ lts->nFreeBlocks = 0;
+ lts->enable_prealloc = preallocate;
+
+ lts->fileset = fileset;
+ lts->worker = worker;
+
+ /*
+ * Create temp BufFile storage as required.
+ *
+ * In leader, we hijack the BufFile of the first tape that's imported, and
+ * concatenate the BufFiles of any subsequent tapes to that. Hence don't
+ * create a BufFile here. Things are simpler for the worker case and the
+ * serial case, though. They are generally very similar -- workers use a
+ * shared fileset, whereas serial sorts use a conventional serial BufFile.
+ */
+ if (fileset && worker == -1)
+ lts->pfile = NULL;
+ else if (fileset)
+ {
+ char filename[MAXPGPATH];
+
+ pg_itoa(worker, filename);
+ lts->pfile = BufFileCreateFileSet(&fileset->fs, filename);
+ }
+ else
+ lts->pfile = BufFileCreateTemp(false);
+
+ return lts;
+}
+
+/*
+ * Claim ownership of a logical tape from an existing shared BufFile.
+ *
+ * Caller should be leader process. Though tapes are marked as frozen in
+ * workers, they are not frozen when opened within leader, since unfrozen tapes
+ * use a larger read buffer. (Frozen tapes have smaller read buffer, optimized
+ * for random access.)
+ */
+LogicalTape *
+LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared)
+{
+ LogicalTape *lt;
+ long tapeblocks;
+ char filename[MAXPGPATH];
+ BufFile *file;
+ int64 filesize;
+
+ lt = ltsCreateTape(lts);
+
+ /*
+ * build concatenated view of all buffiles, remembering the block number
+ * where each source file begins.
+ */
+ pg_itoa(worker, filename);
+ file = BufFileOpenFileSet(&lts->fileset->fs, filename, O_RDONLY, false);
+ filesize = BufFileSize(file);
+
+ /*
+ * Stash first BufFile, and concatenate subsequent BufFiles to that. Store
+ * block offset into each tape as we go.
+ */
+ lt->firstBlockNumber = shared->firstblocknumber;
+ if (lts->pfile == NULL)
+ {
+ lts->pfile = file;
+ lt->offsetBlockNumber = 0L;
+ }
+ else
+ {
+ lt->offsetBlockNumber = BufFileAppend(lts->pfile, file);
+ }
+ /* Don't allocate more for read buffer than could possibly help */
+ lt->max_size = Min(MaxAllocSize, filesize);
+ tapeblocks = filesize / BLCKSZ;
+
+ /*
+ * Update # of allocated blocks and # blocks written to reflect the
+ * imported BufFile. Allocated/written blocks include space used by holes
+ * left between concatenated BufFiles. Also track the number of hole
+ * blocks so that we can later work backwards to calculate the number of
+ * physical blocks for instrumentation.
+ */
+ lts->nHoleBlocks += lt->offsetBlockNumber - lts->nBlocksAllocated;
+
+ lts->nBlocksAllocated = lt->offsetBlockNumber + tapeblocks;
+ lts->nBlocksWritten = lts->nBlocksAllocated;
+
+ return lt;
+}
+
+/*
+ * Close a logical tape set and release all resources.
+ *
+ * NOTE: This doesn't close any of the tapes! You must close them
+ * first, or you can let them be destroyed along with the memory context.
+ */
+void
+LogicalTapeSetClose(LogicalTapeSet *lts)
+{
+ BufFileClose(lts->pfile);
+ pfree(lts->freeBlocks);
+ pfree(lts);
+}
+
+/*
+ * Create a logical tape in the given tapeset.
+ *
+ * The tape is initialized in write state.
+ */
+LogicalTape *
+LogicalTapeCreate(LogicalTapeSet *lts)
+{
+ /*
+ * The only thing that currently prevents creating new tapes in leader is
+ * the fact that BufFiles opened using BufFileOpenShared() are read-only
+ * by definition, but that could be changed if it seemed worthwhile. For
+ * now, writing to the leader tape will raise a "Bad file descriptor"
+ * error, so tuplesort must avoid writing to the leader tape altogether.
+ */
+ if (lts->fileset && lts->worker == -1)
+ elog(ERROR, "cannot create new tapes in leader process");
+
+ return ltsCreateTape(lts);
+}
+
+static LogicalTape *
+ltsCreateTape(LogicalTapeSet *lts)
+{
+ LogicalTape *lt;
+
+ /*
+ * Create per-tape struct. Note we allocate the I/O buffer lazily.
+ */
+ lt = palloc(sizeof(LogicalTape));
+ lt->tapeSet = lts;
+ lt->writing = true;
+ lt->frozen = false;
+ lt->dirty = false;
+ lt->firstBlockNumber = -1L;
+ lt->curBlockNumber = -1L;
+ lt->nextBlockNumber = -1L;
+ lt->offsetBlockNumber = 0L;
+ lt->buffer = NULL;
+ lt->buffer_size = 0;
+ /* palloc() larger than MaxAllocSize would fail */
+ lt->max_size = MaxAllocSize;
+ lt->pos = 0;
+ lt->nbytes = 0;
+ lt->prealloc = NULL;
+ lt->nprealloc = 0;
+ lt->prealloc_size = 0;
+
+ return lt;
+}
+
+/*
+ * Close a logical tape.
+ *
+ * Note: This doesn't return any blocks to the free list! You must read
+ * the tape to the end first, to reuse the space. In current use, though,
+ * we only close tapes after fully reading them.
+ */
+void
+LogicalTapeClose(LogicalTape *lt)
+{
+ if (lt->buffer)
+ pfree(lt->buffer);
+ pfree(lt);
+}
+
+/*
+ * Mark a logical tape set as not needing management of free space anymore.
+ *
+ * This should be called if the caller does not intend to write any more data
+ * into the tape set, but is reading from un-frozen tapes. Since no more
+ * writes are planned, remembering free blocks is no longer useful. Setting
+ * this flag lets us avoid wasting time and space in ltsReleaseBlock(), which
+ * is not designed to handle large numbers of free blocks.
+ */
+void
+LogicalTapeSetForgetFreeSpace(LogicalTapeSet *lts)
+{
+ lts->forgetFreeSpace = true;
+}
+
+/*
+ * Write to a logical tape.
+ *
+ * There are no error returns; we ereport() on failure.
+ */
+void
+LogicalTapeWrite(LogicalTape *lt, void *ptr, size_t size)
+{
+ LogicalTapeSet *lts = lt->tapeSet;
+ size_t nthistime;
+
+ Assert(lt->writing);
+ Assert(lt->offsetBlockNumber == 0L);
+
+ /* Allocate data buffer and first block on first write */
+ if (lt->buffer == NULL)
+ {
+ lt->buffer = (char *) palloc(BLCKSZ);
+ lt->buffer_size = BLCKSZ;
+ }
+ if (lt->curBlockNumber == -1)
+ {
+ Assert(lt->firstBlockNumber == -1);
+ Assert(lt->pos == 0);
+
+ lt->curBlockNumber = ltsGetBlock(lts, lt);
+ lt->firstBlockNumber = lt->curBlockNumber;
+
+ TapeBlockGetTrailer(lt->buffer)->prev = -1L;
+ }
+
+ Assert(lt->buffer_size == BLCKSZ);
+ while (size > 0)
+ {
+ if (lt->pos >= (int) TapeBlockPayloadSize)
+ {
+ /* Buffer full, dump it out */
+ long nextBlockNumber;
+
+ if (!lt->dirty)
+ {
+ /* Hmm, went directly from reading to writing? */
+ elog(ERROR, "invalid logtape state: should be dirty");
+ }
+
+ /*
+ * First allocate the next block, so that we can store it in the
+ * 'next' pointer of this block.
+ */
+ nextBlockNumber = ltsGetBlock(lt->tapeSet, lt);
+
+ /* set the next-pointer and dump the current block. */
+ TapeBlockGetTrailer(lt->buffer)->next = nextBlockNumber;
+ ltsWriteBlock(lt->tapeSet, lt->curBlockNumber, (void *) lt->buffer);
+
+ /* initialize the prev-pointer of the next block */
+ TapeBlockGetTrailer(lt->buffer)->prev = lt->curBlockNumber;
+ lt->curBlockNumber = nextBlockNumber;
+ lt->pos = 0;
+ lt->nbytes = 0;
+ }
+
+ nthistime = TapeBlockPayloadSize - lt->pos;
+ if (nthistime > size)
+ nthistime = size;
+ Assert(nthistime > 0);
+
+ memcpy(lt->buffer + lt->pos, ptr, nthistime);
+
+ lt->dirty = true;
+ lt->pos += nthistime;
+ if (lt->nbytes < lt->pos)
+ lt->nbytes = lt->pos;
+ ptr = (void *) ((char *) ptr + nthistime);
+ size -= nthistime;
+ }
+}
+
+/*
+ * Rewind logical tape and switch from writing to reading.
+ *
+ * The tape must currently be in writing state, or "frozen" in read state.
+ *
+ * 'buffer_size' specifies how much memory to use for the read buffer.
+ * Regardless of the argument, the actual amount of memory used is between
+ * BLCKSZ and MaxAllocSize, and is a multiple of BLCKSZ. The given value is
+ * rounded down and truncated to fit those constraints, if necessary. If the
+ * tape is frozen, the 'buffer_size' argument is ignored, and a small BLCKSZ
+ * byte buffer is used.
+ */
+void
+LogicalTapeRewindForRead(LogicalTape *lt, size_t buffer_size)
+{
+ LogicalTapeSet *lts = lt->tapeSet;
+
+ /*
+ * Round and cap buffer_size if needed.
+ */
+ if (lt->frozen)
+ buffer_size = BLCKSZ;
+ else
+ {
+ /* need at least one block */
+ if (buffer_size < BLCKSZ)
+ buffer_size = BLCKSZ;
+
+ /* palloc() larger than max_size is unlikely to be helpful */
+ if (buffer_size > lt->max_size)
+ buffer_size = lt->max_size;
+
+ /* round down to BLCKSZ boundary */
+ buffer_size -= buffer_size % BLCKSZ;
+ }
+
+ if (lt->writing)
+ {
+ /*
+ * Completion of a write phase. Flush last partial data block, and
+ * rewind for normal (destructive) read.
+ */
+ if (lt->dirty)
+ {
+ /*
+ * As long as we've filled the buffer at least once, its contents
+ * are entirely defined from valgrind's point of view, even though
+ * contents beyond the current end point may be stale. But it's
+ * possible - at least in the case of a parallel sort - to sort
+ * such small amount of data that we do not fill the buffer even
+ * once. Tell valgrind that its contents are defined, so it
+ * doesn't bleat.
+ */
+ VALGRIND_MAKE_MEM_DEFINED(lt->buffer + lt->nbytes,
+ lt->buffer_size - lt->nbytes);
+
+ TapeBlockSetNBytes(lt->buffer, lt->nbytes);
+ ltsWriteBlock(lt->tapeSet, lt->curBlockNumber, (void *) lt->buffer);
+ }
+ lt->writing = false;
+ }
+ else
+ {
+ /*
+ * This is only OK if tape is frozen; we rewind for (another) read
+ * pass.
+ */
+ Assert(lt->frozen);
+ }
+
+ if (lt->buffer)
+ pfree(lt->buffer);
+
+ /* the buffer is lazily allocated, but set the size here */
+ lt->buffer = NULL;
+ lt->buffer_size = buffer_size;
+
+ /* free the preallocation list, and return unused block numbers */
+ if (lt->prealloc != NULL)
+ {
+ for (int i = lt->nprealloc; i > 0; i--)
+ ltsReleaseBlock(lts, lt->prealloc[i - 1]);
+ pfree(lt->prealloc);
+ lt->prealloc = NULL;
+ lt->nprealloc = 0;
+ lt->prealloc_size = 0;
+ }
+}
+
+/*
+ * Read from a logical tape.
+ *
+ * Early EOF is indicated by return value less than #bytes requested.
+ */
+size_t
+LogicalTapeRead(LogicalTape *lt, void *ptr, size_t size)
+{
+ size_t nread = 0;
+ size_t nthistime;
+
+ Assert(!lt->writing);
+
+ if (lt->buffer == NULL)
+ ltsInitReadBuffer(lt);
+
+ while (size > 0)
+ {
+ if (lt->pos >= lt->nbytes)
+ {
+ /* Try to load more data into buffer. */
+ if (!ltsReadFillBuffer(lt))
+ break; /* EOF */
+ }
+
+ nthistime = lt->nbytes - lt->pos;
+ if (nthistime > size)
+ nthistime = size;
+ Assert(nthistime > 0);
+
+ memcpy(ptr, lt->buffer + lt->pos, nthistime);
+
+ lt->pos += nthistime;
+ ptr = (void *) ((char *) ptr + nthistime);
+ size -= nthistime;
+ nread += nthistime;
+ }
+
+ return nread;
+}
+
+/*
+ * "Freeze" the contents of a tape so that it can be read multiple times
+ * and/or read backwards. Once a tape is frozen, its contents will not
+ * be released until the LogicalTapeSet is destroyed. This is expected
+ * to be used only for the final output pass of a merge.
+ *
+ * This *must* be called just at the end of a write pass, before the
+ * tape is rewound (after rewind is too late!). It performs a rewind
+ * and switch to read mode "for free". An immediately following rewind-
+ * for-read call is OK but not necessary.
+ *
+ * share output argument is set with details of storage used for tape after
+ * freezing, which may be passed to LogicalTapeSetCreate within leader
+ * process later. This metadata is only of interest to worker callers
+ * freezing their final output for leader (single materialized tape).
+ * Serial sorts should set share to NULL.
+ */
+void
+LogicalTapeFreeze(LogicalTape *lt, TapeShare *share)
+{
+ LogicalTapeSet *lts = lt->tapeSet;
+
+ Assert(lt->writing);
+ Assert(lt->offsetBlockNumber == 0L);
+
+ /*
+ * Completion of a write phase. Flush last partial data block, and rewind
+ * for nondestructive read.
+ */
+ if (lt->dirty)
+ {
+ /*
+ * As long as we've filled the buffer at least once, its contents are
+ * entirely defined from valgrind's point of view, even though
+ * contents beyond the current end point may be stale. But it's
+ * possible - at least in the case of a parallel sort - to sort such
+ * small amount of data that we do not fill the buffer even once. Tell
+ * valgrind that its contents are defined, so it doesn't bleat.
+ */
+ VALGRIND_MAKE_MEM_DEFINED(lt->buffer + lt->nbytes,
+ lt->buffer_size - lt->nbytes);
+
+ TapeBlockSetNBytes(lt->buffer, lt->nbytes);
+ ltsWriteBlock(lt->tapeSet, lt->curBlockNumber, (void *) lt->buffer);
+ }
+ lt->writing = false;
+ lt->frozen = true;
+
+ /*
+ * The seek and backspace functions assume a single block read buffer.
+ * That's OK with current usage. A larger buffer is helpful to make the
+ * read pattern of the backing file look more sequential to the OS, when
+ * we're reading from multiple tapes. But at the end of a sort, when a
+ * tape is frozen, we only read from a single tape anyway.
+ */
+ if (!lt->buffer || lt->buffer_size != BLCKSZ)
+ {
+ if (lt->buffer)
+ pfree(lt->buffer);
+ lt->buffer = palloc(BLCKSZ);
+ lt->buffer_size = BLCKSZ;
+ }
+
+ /* Read the first block, or reset if tape is empty */
+ lt->curBlockNumber = lt->firstBlockNumber;
+ lt->pos = 0;
+ lt->nbytes = 0;
+
+ if (lt->firstBlockNumber == -1L)
+ lt->nextBlockNumber = -1L;
+ ltsReadBlock(lt->tapeSet, lt->curBlockNumber, (void *) lt->buffer);
+ if (TapeBlockIsLast(lt->buffer))
+ lt->nextBlockNumber = -1L;
+ else
+ lt->nextBlockNumber = TapeBlockGetTrailer(lt->buffer)->next;
+ lt->nbytes = TapeBlockGetNBytes(lt->buffer);
+
+ /* Handle extra steps when caller is to share its tapeset */
+ if (share)
+ {
+ BufFileExportFileSet(lts->pfile);
+ share->firstblocknumber = lt->firstBlockNumber;
+ }
+}
+
+/*
+ * Backspace the tape a given number of bytes. (We also support a more
+ * general seek interface, see below.)
+ *
+ * *Only* a frozen-for-read tape can be backed up; we don't support
+ * random access during write, and an unfrozen read tape may have
+ * already discarded the desired data!
+ *
+ * Returns the number of bytes backed up. It can be less than the
+ * requested amount, if there isn't that much data before the current
+ * position. The tape is positioned to the beginning of the tape in
+ * that case.
+ */
+size_t
+LogicalTapeBackspace(LogicalTape *lt, size_t size)
+{
+ size_t seekpos = 0;
+
+ Assert(lt->frozen);
+ Assert(lt->buffer_size == BLCKSZ);
+
+ if (lt->buffer == NULL)
+ ltsInitReadBuffer(lt);
+
+ /*
+ * Easy case for seek within current block.
+ */
+ if (size <= (size_t) lt->pos)
+ {
+ lt->pos -= (int) size;
+ return size;
+ }
+
+ /*
+ * Not-so-easy case, have to walk back the chain of blocks. This
+ * implementation would be pretty inefficient for long seeks, but we
+ * really aren't doing that (a seek over one tuple is typical).
+ */
+ seekpos = (size_t) lt->pos; /* part within this block */
+ while (size > seekpos)
+ {
+ long prev = TapeBlockGetTrailer(lt->buffer)->prev;
+
+ if (prev == -1L)
+ {
+ /* Tried to back up beyond the beginning of tape. */
+ if (lt->curBlockNumber != lt->firstBlockNumber)
+ elog(ERROR, "unexpected end of tape");
+ lt->pos = 0;
+ return seekpos;
+ }
+
+ ltsReadBlock(lt->tapeSet, prev, (void *) lt->buffer);
+
+ if (TapeBlockGetTrailer(lt->buffer)->next != lt->curBlockNumber)
+ elog(ERROR, "broken tape, next of block %ld is %ld, expected %ld",
+ prev,
+ TapeBlockGetTrailer(lt->buffer)->next,
+ lt->curBlockNumber);
+
+ lt->nbytes = TapeBlockPayloadSize;
+ lt->curBlockNumber = prev;
+ lt->nextBlockNumber = TapeBlockGetTrailer(lt->buffer)->next;
+
+ seekpos += TapeBlockPayloadSize;
+ }
+
+ /*
+ * 'seekpos' can now be greater than 'size', because it points to the
+ * beginning the target block. The difference is the position within the
+ * page.
+ */
+ lt->pos = seekpos - size;
+ return size;
+}
+
+/*
+ * Seek to an arbitrary position in a logical tape.
+ *
+ * *Only* a frozen-for-read tape can be seeked.
+ *
+ * Must be called with a block/offset previously returned by
+ * LogicalTapeTell().
+ */
+void
+LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset)
+{
+ Assert(lt->frozen);
+ Assert(offset >= 0 && offset <= TapeBlockPayloadSize);
+ Assert(lt->buffer_size == BLCKSZ);
+
+ if (lt->buffer == NULL)
+ ltsInitReadBuffer(lt);
+
+ if (blocknum != lt->curBlockNumber)
+ {
+ ltsReadBlock(lt->tapeSet, blocknum, (void *) lt->buffer);
+ lt->curBlockNumber = blocknum;
+ lt->nbytes = TapeBlockPayloadSize;
+ lt->nextBlockNumber = TapeBlockGetTrailer(lt->buffer)->next;
+ }
+
+ if (offset > lt->nbytes)
+ elog(ERROR, "invalid tape seek position");
+ lt->pos = offset;
+}
+
+/*
+ * Obtain current position in a form suitable for a later LogicalTapeSeek.
+ *
+ * NOTE: it'd be OK to do this during write phase with intention of using
+ * the position for a seek after freezing. Not clear if anyone needs that.
+ */
+void
+LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset)
+{
+ if (lt->buffer == NULL)
+ ltsInitReadBuffer(lt);
+
+ Assert(lt->offsetBlockNumber == 0L);
+
+ /* With a larger buffer, 'pos' wouldn't be the same as offset within page */
+ Assert(lt->buffer_size == BLCKSZ);
+
+ *blocknum = lt->curBlockNumber;
+ *offset = lt->pos;
+}
+
+/*
+ * Obtain total disk space currently used by a LogicalTapeSet, in blocks.
+ *
+ * This should not be called while there are open write buffers; otherwise it
+ * may not account for buffered data.
+ */
+long
+LogicalTapeSetBlocks(LogicalTapeSet *lts)
+{
+ return lts->nBlocksWritten - lts->nHoleBlocks;
+}
diff --git a/src/backend/utils/sort/qsort_interruptible.c b/src/backend/utils/sort/qsort_interruptible.c
new file mode 100644
index 0000000..f179b25
--- /dev/null
+++ b/src/backend/utils/sort/qsort_interruptible.c
@@ -0,0 +1,16 @@
+/*
+ * qsort_interruptible.c: qsort_arg that includes CHECK_FOR_INTERRUPTS
+ */
+
+#include "postgres.h"
+#include "miscadmin.h"
+
+#define ST_SORT qsort_interruptible
+#define ST_ELEMENT_TYPE_VOID
+#define ST_COMPARATOR_TYPE_NAME qsort_arg_comparator
+#define ST_COMPARE_RUNTIME_POINTER
+#define ST_COMPARE_ARG_TYPE void
+#define ST_SCOPE
+#define ST_DEFINE
+#define ST_CHECK_FOR_INTERRUPTS
+#include "lib/sort_template.h"
diff --git a/src/backend/utils/sort/sharedtuplestore.c b/src/backend/utils/sort/sharedtuplestore.c
new file mode 100644
index 0000000..464d4c5
--- /dev/null
+++ b/src/backend/utils/sort/sharedtuplestore.c
@@ -0,0 +1,631 @@
+/*-------------------------------------------------------------------------
+ *
+ * sharedtuplestore.c
+ * Simple mechanism for sharing tuples between backends.
+ *
+ * This module contains a shared temporary tuple storage mechanism providing
+ * a parallel-aware subset of the features of tuplestore.c. Multiple backends
+ * can write to a SharedTuplestore, and then multiple backends can later scan
+ * the stored tuples. Currently, the only scan type supported is a parallel
+ * scan where each backend reads an arbitrary subset of the tuples that were
+ * written.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/sort/sharedtuplestore.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup.h"
+#include "access/htup_details.h"
+#include "miscadmin.h"
+#include "storage/buffile.h"
+#include "storage/lwlock.h"
+#include "storage/sharedfileset.h"
+#include "utils/sharedtuplestore.h"
+
+/*
+ * The size of chunks, in pages. This is somewhat arbitrarily set to match
+ * the size of HASH_CHUNK, so that Parallel Hash obtains new chunks of tuples
+ * at approximately the same rate as it allocates new chunks of memory to
+ * insert them into.
+ */
+#define STS_CHUNK_PAGES 4
+#define STS_CHUNK_HEADER_SIZE offsetof(SharedTuplestoreChunk, data)
+#define STS_CHUNK_DATA_SIZE (STS_CHUNK_PAGES * BLCKSZ - STS_CHUNK_HEADER_SIZE)
+
+/* Chunk written to disk. */
+typedef struct SharedTuplestoreChunk
+{
+ int ntuples; /* Number of tuples in this chunk. */
+ int overflow; /* If overflow, how many including this one? */
+ char data[FLEXIBLE_ARRAY_MEMBER];
+} SharedTuplestoreChunk;
+
+/* Per-participant shared state. */
+typedef struct SharedTuplestoreParticipant
+{
+ LWLock lock;
+ BlockNumber read_page; /* Page number for next read. */
+ BlockNumber npages; /* Number of pages written. */
+ bool writing; /* Used only for assertions. */
+} SharedTuplestoreParticipant;
+
+/* The control object that lives in shared memory. */
+struct SharedTuplestore
+{
+ int nparticipants; /* Number of participants that can write. */
+ int flags; /* Flag bits from SHARED_TUPLESTORE_XXX */
+ size_t meta_data_size; /* Size of per-tuple header. */
+ char name[NAMEDATALEN]; /* A name for this tuplestore. */
+
+ /* Followed by per-participant shared state. */
+ SharedTuplestoreParticipant participants[FLEXIBLE_ARRAY_MEMBER];
+};
+
+/* Per-participant state that lives in backend-local memory. */
+struct SharedTuplestoreAccessor
+{
+ int participant; /* My participant number. */
+ SharedTuplestore *sts; /* The shared state. */
+ SharedFileSet *fileset; /* The SharedFileSet holding files. */
+ MemoryContext context; /* Memory context for buffers. */
+
+ /* State for reading. */
+ int read_participant; /* The current participant to read from. */
+ BufFile *read_file; /* The current file to read from. */
+ int read_ntuples_available; /* The number of tuples in chunk. */
+ int read_ntuples; /* How many tuples have we read from chunk? */
+ size_t read_bytes; /* How many bytes have we read from chunk? */
+ char *read_buffer; /* A buffer for loading tuples. */
+ size_t read_buffer_size;
+ BlockNumber read_next_page; /* Lowest block we'll consider reading. */
+
+ /* State for writing. */
+ SharedTuplestoreChunk *write_chunk; /* Buffer for writing. */
+ BufFile *write_file; /* The current file to write to. */
+ BlockNumber write_page; /* The next page to write to. */
+ char *write_pointer; /* Current write pointer within chunk. */
+ char *write_end; /* One past the end of the current chunk. */
+};
+
+static void sts_filename(char *name, SharedTuplestoreAccessor *accessor,
+ int participant);
+
+/*
+ * Return the amount of shared memory required to hold SharedTuplestore for a
+ * given number of participants.
+ */
+size_t
+sts_estimate(int participants)
+{
+ return offsetof(SharedTuplestore, participants) +
+ sizeof(SharedTuplestoreParticipant) * participants;
+}
+
+/*
+ * Initialize a SharedTuplestore in existing shared memory. There must be
+ * space for sts_estimate(participants) bytes. If flags includes the value
+ * SHARED_TUPLESTORE_SINGLE_PASS, the files may in future be removed more
+ * eagerly (but this isn't yet implemented).
+ *
+ * Tuples that are stored may optionally carry a piece of fixed sized
+ * meta-data which will be retrieved along with the tuple. This is useful for
+ * the hash values used in multi-batch hash joins, but could have other
+ * applications.
+ *
+ * The caller must supply a SharedFileSet, which is essentially a directory
+ * that will be cleaned up automatically, and a name which must be unique
+ * across all SharedTuplestores created in the same SharedFileSet.
+ */
+SharedTuplestoreAccessor *
+sts_initialize(SharedTuplestore *sts, int participants,
+ int my_participant_number,
+ size_t meta_data_size,
+ int flags,
+ SharedFileSet *fileset,
+ const char *name)
+{
+ SharedTuplestoreAccessor *accessor;
+ int i;
+
+ Assert(my_participant_number < participants);
+
+ sts->nparticipants = participants;
+ sts->meta_data_size = meta_data_size;
+ sts->flags = flags;
+
+ if (strlen(name) > sizeof(sts->name) - 1)
+ elog(ERROR, "SharedTuplestore name too long");
+ strcpy(sts->name, name);
+
+ /*
+ * Limit meta-data so it + tuple size always fits into a single chunk.
+ * sts_puttuple() and sts_read_tuple() could be made to support scenarios
+ * where that's not the case, but it's not currently required. If so,
+ * meta-data size probably should be made variable, too.
+ */
+ if (meta_data_size + sizeof(uint32) >= STS_CHUNK_DATA_SIZE)
+ elog(ERROR, "meta-data too long");
+
+ for (i = 0; i < participants; ++i)
+ {
+ LWLockInitialize(&sts->participants[i].lock,
+ LWTRANCHE_SHARED_TUPLESTORE);
+ sts->participants[i].read_page = 0;
+ sts->participants[i].npages = 0;
+ sts->participants[i].writing = false;
+ }
+
+ accessor = palloc0(sizeof(SharedTuplestoreAccessor));
+ accessor->participant = my_participant_number;
+ accessor->sts = sts;
+ accessor->fileset = fileset;
+ accessor->context = CurrentMemoryContext;
+
+ return accessor;
+}
+
+/*
+ * Attach to a SharedTuplestore that has been initialized by another backend,
+ * so that this backend can read and write tuples.
+ */
+SharedTuplestoreAccessor *
+sts_attach(SharedTuplestore *sts,
+ int my_participant_number,
+ SharedFileSet *fileset)
+{
+ SharedTuplestoreAccessor *accessor;
+
+ Assert(my_participant_number < sts->nparticipants);
+
+ accessor = palloc0(sizeof(SharedTuplestoreAccessor));
+ accessor->participant = my_participant_number;
+ accessor->sts = sts;
+ accessor->fileset = fileset;
+ accessor->context = CurrentMemoryContext;
+
+ return accessor;
+}
+
+static void
+sts_flush_chunk(SharedTuplestoreAccessor *accessor)
+{
+ size_t size;
+
+ size = STS_CHUNK_PAGES * BLCKSZ;
+ BufFileWrite(accessor->write_file, accessor->write_chunk, size);
+ memset(accessor->write_chunk, 0, size);
+ accessor->write_pointer = &accessor->write_chunk->data[0];
+ accessor->sts->participants[accessor->participant].npages +=
+ STS_CHUNK_PAGES;
+}
+
+/*
+ * Finish writing tuples. This must be called by all backends that have
+ * written data before any backend begins reading it.
+ */
+void
+sts_end_write(SharedTuplestoreAccessor *accessor)
+{
+ if (accessor->write_file != NULL)
+ {
+ sts_flush_chunk(accessor);
+ BufFileClose(accessor->write_file);
+ pfree(accessor->write_chunk);
+ accessor->write_chunk = NULL;
+ accessor->write_file = NULL;
+ accessor->sts->participants[accessor->participant].writing = false;
+ }
+}
+
+/*
+ * Prepare to rescan. Only one participant must call this. After it returns,
+ * all participants may call sts_begin_parallel_scan() and then loop over
+ * sts_parallel_scan_next(). This function must not be called concurrently
+ * with a scan, and synchronization to avoid that is the caller's
+ * responsibility.
+ */
+void
+sts_reinitialize(SharedTuplestoreAccessor *accessor)
+{
+ int i;
+
+ /*
+ * Reset the shared read head for all participants' files. Also set the
+ * initial chunk size to the minimum (any increases from that size will be
+ * recorded in chunk_expansion_log).
+ */
+ for (i = 0; i < accessor->sts->nparticipants; ++i)
+ {
+ accessor->sts->participants[i].read_page = 0;
+ }
+}
+
+/*
+ * Begin scanning the contents in parallel.
+ */
+void
+sts_begin_parallel_scan(SharedTuplestoreAccessor *accessor)
+{
+ int i PG_USED_FOR_ASSERTS_ONLY;
+
+ /* End any existing scan that was in progress. */
+ sts_end_parallel_scan(accessor);
+
+ /*
+ * Any backend that might have written into this shared tuplestore must
+ * have called sts_end_write(), so that all buffers are flushed and the
+ * files have stopped growing.
+ */
+ for (i = 0; i < accessor->sts->nparticipants; ++i)
+ Assert(!accessor->sts->participants[i].writing);
+
+ /*
+ * We will start out reading the file that THIS backend wrote. There may
+ * be some caching locality advantage to that.
+ */
+ accessor->read_participant = accessor->participant;
+ accessor->read_file = NULL;
+ accessor->read_next_page = 0;
+}
+
+/*
+ * Finish a parallel scan, freeing associated backend-local resources.
+ */
+void
+sts_end_parallel_scan(SharedTuplestoreAccessor *accessor)
+{
+ /*
+ * Here we could delete all files if SHARED_TUPLESTORE_SINGLE_PASS, but
+ * we'd probably need a reference count of current parallel scanners so we
+ * could safely do it only when the reference count reaches zero.
+ */
+ if (accessor->read_file != NULL)
+ {
+ BufFileClose(accessor->read_file);
+ accessor->read_file = NULL;
+ }
+}
+
+/*
+ * Write a tuple. If a meta-data size was provided to sts_initialize, then a
+ * pointer to meta data of that size must be provided.
+ */
+void
+sts_puttuple(SharedTuplestoreAccessor *accessor, void *meta_data,
+ MinimalTuple tuple)
+{
+ size_t size;
+
+ /* Do we have our own file yet? */
+ if (accessor->write_file == NULL)
+ {
+ SharedTuplestoreParticipant *participant;
+ char name[MAXPGPATH];
+
+ /* Create one. Only this backend will write into it. */
+ sts_filename(name, accessor, accessor->participant);
+ accessor->write_file =
+ BufFileCreateFileSet(&accessor->fileset->fs, name);
+
+ /* Set up the shared state for this backend's file. */
+ participant = &accessor->sts->participants[accessor->participant];
+ participant->writing = true; /* for assertions only */
+ }
+
+ /* Do we have space? */
+ size = accessor->sts->meta_data_size + tuple->t_len;
+ if (accessor->write_pointer + size > accessor->write_end)
+ {
+ if (accessor->write_chunk == NULL)
+ {
+ /* First time through. Allocate chunk. */
+ accessor->write_chunk = (SharedTuplestoreChunk *)
+ MemoryContextAllocZero(accessor->context,
+ STS_CHUNK_PAGES * BLCKSZ);
+ accessor->write_chunk->ntuples = 0;
+ accessor->write_pointer = &accessor->write_chunk->data[0];
+ accessor->write_end = (char *)
+ accessor->write_chunk + STS_CHUNK_PAGES * BLCKSZ;
+ }
+ else
+ {
+ /* See if flushing helps. */
+ sts_flush_chunk(accessor);
+ }
+
+ /* It may still not be enough in the case of a gigantic tuple. */
+ if (accessor->write_pointer + size > accessor->write_end)
+ {
+ size_t written;
+
+ /*
+ * We'll write the beginning of the oversized tuple, and then
+ * write the rest in some number of 'overflow' chunks.
+ *
+ * sts_initialize() verifies that the size of the tuple +
+ * meta-data always fits into a chunk. Because the chunk has been
+ * flushed above, we can be sure to have all of a chunk's usable
+ * space available.
+ */
+ Assert(accessor->write_pointer + accessor->sts->meta_data_size +
+ sizeof(uint32) < accessor->write_end);
+
+ /* Write the meta-data as one chunk. */
+ if (accessor->sts->meta_data_size > 0)
+ memcpy(accessor->write_pointer, meta_data,
+ accessor->sts->meta_data_size);
+
+ /*
+ * Write as much of the tuple as we can fit. This includes the
+ * tuple's size at the start.
+ */
+ written = accessor->write_end - accessor->write_pointer -
+ accessor->sts->meta_data_size;
+ memcpy(accessor->write_pointer + accessor->sts->meta_data_size,
+ tuple, written);
+ ++accessor->write_chunk->ntuples;
+ size -= accessor->sts->meta_data_size;
+ size -= written;
+ /* Now write as many overflow chunks as we need for the rest. */
+ while (size > 0)
+ {
+ size_t written_this_chunk;
+
+ sts_flush_chunk(accessor);
+
+ /*
+ * How many overflow chunks to go? This will allow readers to
+ * skip all of them at once instead of reading each one.
+ */
+ accessor->write_chunk->overflow = (size + STS_CHUNK_DATA_SIZE - 1) /
+ STS_CHUNK_DATA_SIZE;
+ written_this_chunk =
+ Min(accessor->write_end - accessor->write_pointer, size);
+ memcpy(accessor->write_pointer, (char *) tuple + written,
+ written_this_chunk);
+ accessor->write_pointer += written_this_chunk;
+ size -= written_this_chunk;
+ written += written_this_chunk;
+ }
+ return;
+ }
+ }
+
+ /* Copy meta-data and tuple into buffer. */
+ if (accessor->sts->meta_data_size > 0)
+ memcpy(accessor->write_pointer, meta_data,
+ accessor->sts->meta_data_size);
+ memcpy(accessor->write_pointer + accessor->sts->meta_data_size, tuple,
+ tuple->t_len);
+ accessor->write_pointer += size;
+ ++accessor->write_chunk->ntuples;
+}
+
+static MinimalTuple
+sts_read_tuple(SharedTuplestoreAccessor *accessor, void *meta_data)
+{
+ MinimalTuple tuple;
+ uint32 size;
+ size_t remaining_size;
+ size_t this_chunk_size;
+ char *destination;
+
+ /*
+ * We'll keep track of bytes read from this chunk so that we can detect an
+ * overflowing tuple and switch to reading overflow pages.
+ */
+ if (accessor->sts->meta_data_size > 0)
+ {
+ if (BufFileRead(accessor->read_file,
+ meta_data,
+ accessor->sts->meta_data_size) !=
+ accessor->sts->meta_data_size)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file"),
+ errdetail_internal("Short read while reading meta-data.")));
+ accessor->read_bytes += accessor->sts->meta_data_size;
+ }
+ if (BufFileRead(accessor->read_file,
+ &size,
+ sizeof(size)) != sizeof(size))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file"),
+ errdetail_internal("Short read while reading size.")));
+ accessor->read_bytes += sizeof(size);
+ if (size > accessor->read_buffer_size)
+ {
+ size_t new_read_buffer_size;
+
+ if (accessor->read_buffer != NULL)
+ pfree(accessor->read_buffer);
+ new_read_buffer_size = Max(size, accessor->read_buffer_size * 2);
+ accessor->read_buffer =
+ MemoryContextAlloc(accessor->context, new_read_buffer_size);
+ accessor->read_buffer_size = new_read_buffer_size;
+ }
+ remaining_size = size - sizeof(uint32);
+ this_chunk_size = Min(remaining_size,
+ BLCKSZ * STS_CHUNK_PAGES - accessor->read_bytes);
+ destination = accessor->read_buffer + sizeof(uint32);
+ if (BufFileRead(accessor->read_file,
+ destination,
+ this_chunk_size) != this_chunk_size)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file"),
+ errdetail_internal("Short read while reading tuple.")));
+ accessor->read_bytes += this_chunk_size;
+ remaining_size -= this_chunk_size;
+ destination += this_chunk_size;
+ ++accessor->read_ntuples;
+
+ /* Check if we need to read any overflow chunks. */
+ while (remaining_size > 0)
+ {
+ /* We are now positioned at the start of an overflow chunk. */
+ SharedTuplestoreChunk chunk_header;
+
+ if (BufFileRead(accessor->read_file, &chunk_header, STS_CHUNK_HEADER_SIZE) !=
+ STS_CHUNK_HEADER_SIZE)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file"),
+ errdetail_internal("Short read while reading overflow chunk header.")));
+ accessor->read_bytes = STS_CHUNK_HEADER_SIZE;
+ if (chunk_header.overflow == 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("unexpected chunk in shared tuplestore temporary file"),
+ errdetail_internal("Expected overflow chunk.")));
+ accessor->read_next_page += STS_CHUNK_PAGES;
+ this_chunk_size = Min(remaining_size,
+ BLCKSZ * STS_CHUNK_PAGES -
+ STS_CHUNK_HEADER_SIZE);
+ if (BufFileRead(accessor->read_file,
+ destination,
+ this_chunk_size) != this_chunk_size)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file"),
+ errdetail_internal("Short read while reading tuple.")));
+ accessor->read_bytes += this_chunk_size;
+ remaining_size -= this_chunk_size;
+ destination += this_chunk_size;
+
+ /*
+ * These will be used to count regular tuples following the oversized
+ * tuple that spilled into this overflow chunk.
+ */
+ accessor->read_ntuples = 0;
+ accessor->read_ntuples_available = chunk_header.ntuples;
+ }
+
+ tuple = (MinimalTuple) accessor->read_buffer;
+ tuple->t_len = size;
+
+ return tuple;
+}
+
+/*
+ * Get the next tuple in the current parallel scan.
+ */
+MinimalTuple
+sts_parallel_scan_next(SharedTuplestoreAccessor *accessor, void *meta_data)
+{
+ SharedTuplestoreParticipant *p;
+ BlockNumber read_page;
+ bool eof;
+
+ for (;;)
+ {
+ /* Can we read more tuples from the current chunk? */
+ if (accessor->read_ntuples < accessor->read_ntuples_available)
+ return sts_read_tuple(accessor, meta_data);
+
+ /* Find the location of a new chunk to read. */
+ p = &accessor->sts->participants[accessor->read_participant];
+
+ LWLockAcquire(&p->lock, LW_EXCLUSIVE);
+ /* We can skip directly past overflow pages we know about. */
+ if (p->read_page < accessor->read_next_page)
+ p->read_page = accessor->read_next_page;
+ eof = p->read_page >= p->npages;
+ if (!eof)
+ {
+ /* Claim the next chunk. */
+ read_page = p->read_page;
+ /* Advance the read head for the next reader. */
+ p->read_page += STS_CHUNK_PAGES;
+ accessor->read_next_page = p->read_page;
+ }
+ LWLockRelease(&p->lock);
+
+ if (!eof)
+ {
+ SharedTuplestoreChunk chunk_header;
+ size_t nread;
+
+ /* Make sure we have the file open. */
+ if (accessor->read_file == NULL)
+ {
+ char name[MAXPGPATH];
+
+ sts_filename(name, accessor, accessor->read_participant);
+ accessor->read_file =
+ BufFileOpenFileSet(&accessor->fileset->fs, name, O_RDONLY,
+ false);
+ }
+
+ /* Seek and load the chunk header. */
+ if (BufFileSeekBlock(accessor->read_file, read_page) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek to block %u in shared tuplestore temporary file",
+ read_page)));
+ nread = BufFileRead(accessor->read_file, &chunk_header,
+ STS_CHUNK_HEADER_SIZE);
+ if (nread != STS_CHUNK_HEADER_SIZE)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from shared tuplestore temporary file: read only %zu of %zu bytes",
+ nread, STS_CHUNK_HEADER_SIZE)));
+
+ /*
+ * If this is an overflow chunk, we skip it and any following
+ * overflow chunks all at once.
+ */
+ if (chunk_header.overflow > 0)
+ {
+ accessor->read_next_page = read_page +
+ chunk_header.overflow * STS_CHUNK_PAGES;
+ continue;
+ }
+
+ accessor->read_ntuples = 0;
+ accessor->read_ntuples_available = chunk_header.ntuples;
+ accessor->read_bytes = STS_CHUNK_HEADER_SIZE;
+
+ /* Go around again, so we can get a tuple from this chunk. */
+ }
+ else
+ {
+ if (accessor->read_file != NULL)
+ {
+ BufFileClose(accessor->read_file);
+ accessor->read_file = NULL;
+ }
+
+ /*
+ * Try the next participant's file. If we've gone full circle,
+ * we're done.
+ */
+ accessor->read_participant = (accessor->read_participant + 1) %
+ accessor->sts->nparticipants;
+ if (accessor->read_participant == accessor->participant)
+ break;
+ accessor->read_next_page = 0;
+
+ /* Go around again, so we can get a chunk from this file. */
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * Create the name used for the BufFile that a given participant will write.
+ */
+static void
+sts_filename(char *name, SharedTuplestoreAccessor *accessor, int participant)
+{
+ snprintf(name, MAXPGPATH, "%s.p%d", accessor->sts->name, participant);
+}
diff --git a/src/backend/utils/sort/sortsupport.c b/src/backend/utils/sort/sortsupport.c
new file mode 100644
index 0000000..b38bcd8
--- /dev/null
+++ b/src/backend/utils/sort/sortsupport.c
@@ -0,0 +1,211 @@
+/*-------------------------------------------------------------------------
+ *
+ * sortsupport.c
+ * Support routines for accelerated sorting.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/sort/sortsupport.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/gist.h"
+#include "access/nbtree.h"
+#include "catalog/pg_am.h"
+#include "fmgr.h"
+#include "utils/lsyscache.h"
+#include "utils/rel.h"
+#include "utils/sortsupport.h"
+
+
+/* Info needed to use an old-style comparison function as a sort comparator */
+typedef struct
+{
+ FmgrInfo flinfo; /* lookup data for comparison function */
+ FunctionCallInfoBaseData fcinfo; /* reusable callinfo structure */
+} SortShimExtra;
+
+#define SizeForSortShimExtra(nargs) (offsetof(SortShimExtra, fcinfo) + SizeForFunctionCallInfo(nargs))
+
+/*
+ * Shim function for calling an old-style comparator
+ *
+ * This is essentially an inlined version of FunctionCall2Coll(), except
+ * we assume that the FunctionCallInfoBaseData was already mostly set up by
+ * PrepareSortSupportComparisonShim.
+ */
+static int
+comparison_shim(Datum x, Datum y, SortSupport ssup)
+{
+ SortShimExtra *extra = (SortShimExtra *) ssup->ssup_extra;
+ Datum result;
+
+ extra->fcinfo.args[0].value = x;
+ extra->fcinfo.args[1].value = y;
+
+ /* just for paranoia's sake, we reset isnull each time */
+ extra->fcinfo.isnull = false;
+
+ result = FunctionCallInvoke(&extra->fcinfo);
+
+ /* Check for null result, since caller is clearly not expecting one */
+ if (extra->fcinfo.isnull)
+ elog(ERROR, "function %u returned NULL", extra->flinfo.fn_oid);
+
+ return result;
+}
+
+/*
+ * Set up a shim function to allow use of an old-style btree comparison
+ * function as if it were a sort support comparator.
+ */
+void
+PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup)
+{
+ SortShimExtra *extra;
+
+ extra = (SortShimExtra *) MemoryContextAlloc(ssup->ssup_cxt,
+ SizeForSortShimExtra(2));
+
+ /* Lookup the comparison function */
+ fmgr_info_cxt(cmpFunc, &extra->flinfo, ssup->ssup_cxt);
+
+ /* We can initialize the callinfo just once and re-use it */
+ InitFunctionCallInfoData(extra->fcinfo, &extra->flinfo, 2,
+ ssup->ssup_collation, NULL, NULL);
+ extra->fcinfo.args[0].isnull = false;
+ extra->fcinfo.args[1].isnull = false;
+
+ ssup->ssup_extra = extra;
+ ssup->comparator = comparison_shim;
+}
+
+/*
+ * Look up and call sortsupport function to setup SortSupport comparator;
+ * or if no such function exists or it declines to set up the appropriate
+ * state, prepare a suitable shim.
+ */
+static void
+FinishSortSupportFunction(Oid opfamily, Oid opcintype, SortSupport ssup)
+{
+ Oid sortSupportFunction;
+
+ /* Look for a sort support function */
+ sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
+ BTSORTSUPPORT_PROC);
+ if (OidIsValid(sortSupportFunction))
+ {
+ /*
+ * The sort support function can provide a comparator, but it can also
+ * choose not to so (e.g. based on the selected collation).
+ */
+ OidFunctionCall1(sortSupportFunction, PointerGetDatum(ssup));
+ }
+
+ if (ssup->comparator == NULL)
+ {
+ Oid sortFunction;
+
+ sortFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
+ BTORDER_PROC);
+
+ if (!OidIsValid(sortFunction))
+ elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
+ BTORDER_PROC, opcintype, opcintype, opfamily);
+
+ /* We'll use a shim to call the old-style btree comparator */
+ PrepareSortSupportComparisonShim(sortFunction, ssup);
+ }
+}
+
+/*
+ * Fill in SortSupport given an ordering operator (btree "<" or ">" operator).
+ *
+ * Caller must previously have zeroed the SortSupportData structure and then
+ * filled in ssup_cxt, ssup_collation, and ssup_nulls_first. This will fill
+ * in ssup_reverse as well as the comparator function pointer.
+ */
+void
+PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup)
+{
+ Oid opfamily;
+ Oid opcintype;
+ int16 strategy;
+
+ Assert(ssup->comparator == NULL);
+
+ /* Find the operator in pg_amop */
+ if (!get_ordering_op_properties(orderingOp, &opfamily, &opcintype,
+ &strategy))
+ elog(ERROR, "operator %u is not a valid ordering operator",
+ orderingOp);
+ ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
+
+ FinishSortSupportFunction(opfamily, opcintype, ssup);
+}
+
+/*
+ * Fill in SortSupport given an index relation, attribute, and strategy.
+ *
+ * Caller must previously have zeroed the SortSupportData structure and then
+ * filled in ssup_cxt, ssup_attno, ssup_collation, and ssup_nulls_first. This
+ * will fill in ssup_reverse (based on the supplied strategy), as well as the
+ * comparator function pointer.
+ */
+void
+PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,
+ SortSupport ssup)
+{
+ Oid opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
+ Oid opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
+
+ Assert(ssup->comparator == NULL);
+
+ if (indexRel->rd_rel->relam != BTREE_AM_OID)
+ elog(ERROR, "unexpected non-btree AM: %u", indexRel->rd_rel->relam);
+ if (strategy != BTGreaterStrategyNumber &&
+ strategy != BTLessStrategyNumber)
+ elog(ERROR, "unexpected sort support strategy: %d", strategy);
+ ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
+
+ FinishSortSupportFunction(opfamily, opcintype, ssup);
+}
+
+/*
+ * Fill in SortSupport given a GiST index relation
+ *
+ * Caller must previously have zeroed the SortSupportData structure and then
+ * filled in ssup_cxt, ssup_attno, ssup_collation, and ssup_nulls_first. This
+ * will fill in ssup_reverse (always false for GiST index build), as well as
+ * the comparator function pointer.
+ */
+void
+PrepareSortSupportFromGistIndexRel(Relation indexRel, SortSupport ssup)
+{
+ Oid opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
+ Oid opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
+ Oid sortSupportFunction;
+
+ Assert(ssup->comparator == NULL);
+
+ if (indexRel->rd_rel->relam != GIST_AM_OID)
+ elog(ERROR, "unexpected non-gist AM: %u", indexRel->rd_rel->relam);
+ ssup->ssup_reverse = false;
+
+ /*
+ * Look up the sort support function. This is simpler than for B-tree
+ * indexes because we don't support the old-style btree comparators.
+ */
+ sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
+ GIST_SORTSUPPORT_PROC);
+ if (!OidIsValid(sortSupportFunction))
+ elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
+ GIST_SORTSUPPORT_PROC, opcintype, opcintype, opfamily);
+ OidFunctionCall1(sortSupportFunction, PointerGetDatum(ssup));
+}
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
new file mode 100644
index 0000000..421afcf
--- /dev/null
+++ b/src/backend/utils/sort/tuplesort.c
@@ -0,0 +1,4938 @@
+/*-------------------------------------------------------------------------
+ *
+ * tuplesort.c
+ * Generalized tuple sorting routines.
+ *
+ * This module handles sorting of heap tuples, index tuples, or single
+ * Datums (and could easily support other kinds of sortable objects,
+ * if necessary). It works efficiently for both small and large amounts
+ * of data. Small amounts are sorted in-memory using qsort(). Large
+ * amounts are sorted using temporary files and a standard external sort
+ * algorithm.
+ *
+ * See Knuth, volume 3, for more than you want to know about external
+ * sorting algorithms. The algorithm we use is a balanced k-way merge.
+ * Before PostgreSQL 15, we used the polyphase merge algorithm (Knuth's
+ * Algorithm 5.4.2D), but with modern hardware, a straightforward balanced
+ * merge is better. Knuth is assuming that tape drives are expensive
+ * beasts, and in particular that there will always be many more runs than
+ * tape drives. The polyphase merge algorithm was good at keeping all the
+ * tape drives busy, but in our implementation a "tape drive" doesn't cost
+ * much more than a few Kb of memory buffers, so we can afford to have
+ * lots of them. In particular, if we can have as many tape drives as
+ * sorted runs, we can eliminate any repeated I/O at all.
+ *
+ * Historically, we divided the input into sorted runs using replacement
+ * selection, in the form of a priority tree implemented as a heap
+ * (essentially Knuth's Algorithm 5.2.3H), but now we always use quicksort
+ * for run generation.
+ *
+ * The approximate amount of memory allowed for any one sort operation
+ * is specified in kilobytes by the caller (most pass work_mem). Initially,
+ * we absorb tuples and simply store them in an unsorted array as long as
+ * we haven't exceeded workMem. If we reach the end of the input without
+ * exceeding workMem, we sort the array using qsort() and subsequently return
+ * tuples just by scanning the tuple array sequentially. If we do exceed
+ * workMem, we begin to emit tuples into sorted runs in temporary tapes.
+ * When tuples are dumped in batch after quicksorting, we begin a new run
+ * with a new output tape. If we reach the max number of tapes, we write
+ * subsequent runs on the existing tapes in a round-robin fashion. We will
+ * need multiple merge passes to finish the merge in that case. After the
+ * end of the input is reached, we dump out remaining tuples in memory into
+ * a final run, then merge the runs.
+ *
+ * When merging runs, we use a heap containing just the frontmost tuple from
+ * each source run; we repeatedly output the smallest tuple and replace it
+ * with the next tuple from its source tape (if any). When the heap empties,
+ * the merge is complete. The basic merge algorithm thus needs very little
+ * memory --- only M tuples for an M-way merge, and M is constrained to a
+ * small number. However, we can still make good use of our full workMem
+ * allocation by pre-reading additional blocks from each source tape. Without
+ * prereading, our access pattern to the temporary file would be very erratic;
+ * on average we'd read one block from each of M source tapes during the same
+ * time that we're writing M blocks to the output tape, so there is no
+ * sequentiality of access at all, defeating the read-ahead methods used by
+ * most Unix kernels. Worse, the output tape gets written into a very random
+ * sequence of blocks of the temp file, ensuring that things will be even
+ * worse when it comes time to read that tape. A straightforward merge pass
+ * thus ends up doing a lot of waiting for disk seeks. We can improve matters
+ * by prereading from each source tape sequentially, loading about workMem/M
+ * bytes from each tape in turn, and making the sequential blocks immediately
+ * available for reuse. This approach helps to localize both read and write
+ * accesses. The pre-reading is handled by logtape.c, we just tell it how
+ * much memory to use for the buffers.
+ *
+ * In the current code we determine the number of input tapes M on the basis
+ * of workMem: we want workMem/M to be large enough that we read a fair
+ * amount of data each time we read from a tape, so as to maintain the
+ * locality of access described above. Nonetheless, with large workMem we
+ * can have many tapes. The logical "tapes" are implemented by logtape.c,
+ * which avoids space wastage by recycling disk space as soon as each block
+ * is read from its "tape".
+ *
+ * When the caller requests random access to the sort result, we form
+ * the final sorted run on a logical tape which is then "frozen", so
+ * that we can access it randomly. When the caller does not need random
+ * access, we return from tuplesort_performsort() as soon as we are down
+ * to one run per logical tape. The final merge is then performed
+ * on-the-fly as the caller repeatedly calls tuplesort_getXXX; this
+ * saves one cycle of writing all the data out to disk and reading it in.
+ *
+ * This module supports parallel sorting. Parallel sorts involve coordination
+ * among one or more worker processes, and a leader process, each with its own
+ * tuplesort state. The leader process (or, more accurately, the
+ * Tuplesortstate associated with a leader process) creates a full tapeset
+ * consisting of worker tapes with one run to merge; a run for every
+ * worker process. This is then merged. Worker processes are guaranteed to
+ * produce exactly one output run from their partial input.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/sort/tuplesort.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/hash.h"
+#include "access/htup_details.h"
+#include "access/nbtree.h"
+#include "catalog/index.h"
+#include "catalog/pg_am.h"
+#include "commands/tablespace.h"
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "pg_trace.h"
+#include "utils/datum.h"
+#include "utils/logtape.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/pg_rusage.h"
+#include "utils/rel.h"
+#include "utils/sortsupport.h"
+#include "utils/tuplesort.h"
+
+
+/* sort-type codes for sort__start probes */
+#define HEAP_SORT 0
+#define INDEX_SORT 1
+#define DATUM_SORT 2
+#define CLUSTER_SORT 3
+
+/* Sort parallel code from state for sort__start probes */
+#define PARALLEL_SORT(state) ((state)->shared == NULL ? 0 : \
+ (state)->worker >= 0 ? 1 : 2)
+
+/*
+ * Initial size of memtuples array. We're trying to select this size so that
+ * array doesn't exceed ALLOCSET_SEPARATE_THRESHOLD and so that the overhead of
+ * allocation might possibly be lowered. However, we don't consider array sizes
+ * less than 1024.
+ *
+ */
+#define INITIAL_MEMTUPSIZE Max(1024, \
+ ALLOCSET_SEPARATE_THRESHOLD / sizeof(SortTuple) + 1)
+
+/* GUC variables */
+#ifdef TRACE_SORT
+bool trace_sort = false;
+#endif
+
+#ifdef DEBUG_BOUNDED_SORT
+bool optimize_bounded_sort = true;
+#endif
+
+
+/*
+ * The objects we actually sort are SortTuple structs. These contain
+ * a pointer to the tuple proper (might be a MinimalTuple or IndexTuple),
+ * which is a separate palloc chunk --- we assume it is just one chunk and
+ * can be freed by a simple pfree() (except during merge, when we use a
+ * simple slab allocator). SortTuples also contain the tuple's first key
+ * column in Datum/nullflag format, and a source/input tape number that
+ * tracks which tape each heap element/slot belongs to during merging.
+ *
+ * Storing the first key column lets us save heap_getattr or index_getattr
+ * calls during tuple comparisons. We could extract and save all the key
+ * columns not just the first, but this would increase code complexity and
+ * overhead, and wouldn't actually save any comparison cycles in the common
+ * case where the first key determines the comparison result. Note that
+ * for a pass-by-reference datatype, datum1 points into the "tuple" storage.
+ *
+ * There is one special case: when the sort support infrastructure provides an
+ * "abbreviated key" representation, where the key is (typically) a pass by
+ * value proxy for a pass by reference type. In this case, the abbreviated key
+ * is stored in datum1 in place of the actual first key column.
+ *
+ * When sorting single Datums, the data value is represented directly by
+ * datum1/isnull1 for pass by value types (or null values). If the datatype is
+ * pass-by-reference and isnull1 is false, then "tuple" points to a separately
+ * palloc'd data value, otherwise "tuple" is NULL. The value of datum1 is then
+ * either the same pointer as "tuple", or is an abbreviated key value as
+ * described above. Accordingly, "tuple" is always used in preference to
+ * datum1 as the authoritative value for pass-by-reference cases.
+ */
+typedef struct
+{
+ void *tuple; /* the tuple itself */
+ Datum datum1; /* value of first key column */
+ bool isnull1; /* is first key column NULL? */
+ int srctape; /* source tape number */
+} SortTuple;
+
+/*
+ * During merge, we use a pre-allocated set of fixed-size slots to hold
+ * tuples. To avoid palloc/pfree overhead.
+ *
+ * Merge doesn't require a lot of memory, so we can afford to waste some,
+ * by using gratuitously-sized slots. If a tuple is larger than 1 kB, the
+ * palloc() overhead is not significant anymore.
+ *
+ * 'nextfree' is valid when this chunk is in the free list. When in use, the
+ * slot holds a tuple.
+ */
+#define SLAB_SLOT_SIZE 1024
+
+typedef union SlabSlot
+{
+ union SlabSlot *nextfree;
+ char buffer[SLAB_SLOT_SIZE];
+} SlabSlot;
+
+/*
+ * Possible states of a Tuplesort object. These denote the states that
+ * persist between calls of Tuplesort routines.
+ */
+typedef enum
+{
+ TSS_INITIAL, /* Loading tuples; still within memory limit */
+ TSS_BOUNDED, /* Loading tuples into bounded-size heap */
+ TSS_BUILDRUNS, /* Loading tuples; writing to tape */
+ TSS_SORTEDINMEM, /* Sort completed entirely in memory */
+ TSS_SORTEDONTAPE, /* Sort completed, final run is on tape */
+ TSS_FINALMERGE /* Performing final merge on-the-fly */
+} TupSortStatus;
+
+/*
+ * Parameters for calculation of number of tapes to use --- see inittapes()
+ * and tuplesort_merge_order().
+ *
+ * In this calculation we assume that each tape will cost us about 1 blocks
+ * worth of buffer space. This ignores the overhead of all the other data
+ * structures needed for each tape, but it's probably close enough.
+ *
+ * MERGE_BUFFER_SIZE is how much buffer space we'd like to allocate for each
+ * input tape, for pre-reading (see discussion at top of file). This is *in
+ * addition to* the 1 block already included in TAPE_BUFFER_OVERHEAD.
+ */
+#define MINORDER 6 /* minimum merge order */
+#define MAXORDER 500 /* maximum merge order */
+#define TAPE_BUFFER_OVERHEAD BLCKSZ
+#define MERGE_BUFFER_SIZE (BLCKSZ * 32)
+
+typedef int (*SortTupleComparator) (const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+
+/*
+ * Private state of a Tuplesort operation.
+ */
+struct Tuplesortstate
+{
+ TupSortStatus status; /* enumerated value as shown above */
+ int nKeys; /* number of columns in sort key */
+ int sortopt; /* Bitmask of flags used to setup sort */
+ bool bounded; /* did caller specify a maximum number of
+ * tuples to return? */
+ bool boundUsed; /* true if we made use of a bounded heap */
+ int bound; /* if bounded, the maximum number of tuples */
+ bool tuples; /* Can SortTuple.tuple ever be set? */
+ int64 availMem; /* remaining memory available, in bytes */
+ int64 allowedMem; /* total memory allowed, in bytes */
+ int maxTapes; /* max number of input tapes to merge in each
+ * pass */
+ int64 maxSpace; /* maximum amount of space occupied among sort
+ * of groups, either in-memory or on-disk */
+ bool isMaxSpaceDisk; /* true when maxSpace is value for on-disk
+ * space, false when it's value for in-memory
+ * space */
+ TupSortStatus maxSpaceStatus; /* sort status when maxSpace was reached */
+ MemoryContext maincontext; /* memory context for tuple sort metadata that
+ * persists across multiple batches */
+ MemoryContext sortcontext; /* memory context holding most sort data */
+ MemoryContext tuplecontext; /* sub-context of sortcontext for tuple data */
+ LogicalTapeSet *tapeset; /* logtape.c object for tapes in a temp file */
+
+ /*
+ * These function pointers decouple the routines that must know what kind
+ * of tuple we are sorting from the routines that don't need to know it.
+ * They are set up by the tuplesort_begin_xxx routines.
+ *
+ * Function to compare two tuples; result is per qsort() convention, ie:
+ * <0, 0, >0 according as a<b, a=b, a>b. The API must match
+ * qsort_arg_comparator.
+ */
+ SortTupleComparator comparetup;
+
+ /*
+ * Function to copy a supplied input tuple into palloc'd space and set up
+ * its SortTuple representation (ie, set tuple/datum1/isnull1). Also,
+ * state->availMem must be decreased by the amount of space used for the
+ * tuple copy (note the SortTuple struct itself is not counted).
+ */
+ void (*copytup) (Tuplesortstate *state, SortTuple *stup, void *tup);
+
+ /*
+ * Function to write a stored tuple onto tape. The representation of the
+ * tuple on tape need not be the same as it is in memory; requirements on
+ * the tape representation are given below. Unless the slab allocator is
+ * used, after writing the tuple, pfree() the out-of-line data (not the
+ * SortTuple struct!), and increase state->availMem by the amount of
+ * memory space thereby released.
+ */
+ void (*writetup) (Tuplesortstate *state, LogicalTape *tape,
+ SortTuple *stup);
+
+ /*
+ * Function to read a stored tuple from tape back into memory. 'len' is
+ * the already-read length of the stored tuple. The tuple is allocated
+ * from the slab memory arena, or is palloc'd, see readtup_alloc().
+ */
+ void (*readtup) (Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len);
+
+ /*
+ * Whether SortTuple's datum1 and isnull1 members are maintained by the
+ * above routines. If not, some sort specializations are disabled.
+ */
+ bool haveDatum1;
+
+ /*
+ * This array holds the tuples now in sort memory. If we are in state
+ * INITIAL, the tuples are in no particular order; if we are in state
+ * SORTEDINMEM, the tuples are in final sorted order; in states BUILDRUNS
+ * and FINALMERGE, the tuples are organized in "heap" order per Algorithm
+ * H. In state SORTEDONTAPE, the array is not used.
+ */
+ SortTuple *memtuples; /* array of SortTuple structs */
+ int memtupcount; /* number of tuples currently present */
+ int memtupsize; /* allocated length of memtuples array */
+ bool growmemtuples; /* memtuples' growth still underway? */
+
+ /*
+ * Memory for tuples is sometimes allocated using a simple slab allocator,
+ * rather than with palloc(). Currently, we switch to slab allocation
+ * when we start merging. Merging only needs to keep a small, fixed
+ * number of tuples in memory at any time, so we can avoid the
+ * palloc/pfree overhead by recycling a fixed number of fixed-size slots
+ * to hold the tuples.
+ *
+ * For the slab, we use one large allocation, divided into SLAB_SLOT_SIZE
+ * slots. The allocation is sized to have one slot per tape, plus one
+ * additional slot. We need that many slots to hold all the tuples kept
+ * in the heap during merge, plus the one we have last returned from the
+ * sort, with tuplesort_gettuple.
+ *
+ * Initially, all the slots are kept in a linked list of free slots. When
+ * a tuple is read from a tape, it is put to the next available slot, if
+ * it fits. If the tuple is larger than SLAB_SLOT_SIZE, it is palloc'd
+ * instead.
+ *
+ * When we're done processing a tuple, we return the slot back to the free
+ * list, or pfree() if it was palloc'd. We know that a tuple was
+ * allocated from the slab, if its pointer value is between
+ * slabMemoryBegin and -End.
+ *
+ * When the slab allocator is used, the USEMEM/LACKMEM mechanism of
+ * tracking memory usage is not used.
+ */
+ bool slabAllocatorUsed;
+
+ char *slabMemoryBegin; /* beginning of slab memory arena */
+ char *slabMemoryEnd; /* end of slab memory arena */
+ SlabSlot *slabFreeHead; /* head of free list */
+
+ /* Memory used for input and output tape buffers. */
+ size_t tape_buffer_mem;
+
+ /*
+ * When we return a tuple to the caller in tuplesort_gettuple_XXX, that
+ * came from a tape (that is, in TSS_SORTEDONTAPE or TSS_FINALMERGE
+ * modes), we remember the tuple in 'lastReturnedTuple', so that we can
+ * recycle the memory on next gettuple call.
+ */
+ void *lastReturnedTuple;
+
+ /*
+ * While building initial runs, this is the current output run number.
+ * Afterwards, it is the number of initial runs we made.
+ */
+ int currentRun;
+
+ /*
+ * Logical tapes, for merging.
+ *
+ * The initial runs are written in the output tapes. In each merge pass,
+ * the output tapes of the previous pass become the input tapes, and new
+ * output tapes are created as needed. When nInputTapes equals
+ * nInputRuns, there is only one merge pass left.
+ */
+ LogicalTape **inputTapes;
+ int nInputTapes;
+ int nInputRuns;
+
+ LogicalTape **outputTapes;
+ int nOutputTapes;
+ int nOutputRuns;
+
+ LogicalTape *destTape; /* current output tape */
+
+ /*
+ * These variables are used after completion of sorting to keep track of
+ * the next tuple to return. (In the tape case, the tape's current read
+ * position is also critical state.)
+ */
+ LogicalTape *result_tape; /* actual tape of finished output */
+ int current; /* array index (only used if SORTEDINMEM) */
+ bool eof_reached; /* reached EOF (needed for cursors) */
+
+ /* markpos_xxx holds marked position for mark and restore */
+ long markpos_block; /* tape block# (only used if SORTEDONTAPE) */
+ int markpos_offset; /* saved "current", or offset in tape block */
+ bool markpos_eof; /* saved "eof_reached" */
+
+ /*
+ * These variables are used during parallel sorting.
+ *
+ * worker is our worker identifier. Follows the general convention that
+ * -1 value relates to a leader tuplesort, and values >= 0 worker
+ * tuplesorts. (-1 can also be a serial tuplesort.)
+ *
+ * shared is mutable shared memory state, which is used to coordinate
+ * parallel sorts.
+ *
+ * nParticipants is the number of worker Tuplesortstates known by the
+ * leader to have actually been launched, which implies that they must
+ * finish a run that the leader needs to merge. Typically includes a
+ * worker state held by the leader process itself. Set in the leader
+ * Tuplesortstate only.
+ */
+ int worker;
+ Sharedsort *shared;
+ int nParticipants;
+
+ /*
+ * The sortKeys variable is used by every case other than the hash index
+ * case; it is set by tuplesort_begin_xxx. tupDesc is only used by the
+ * MinimalTuple and CLUSTER routines, though.
+ */
+ TupleDesc tupDesc;
+ SortSupport sortKeys; /* array of length nKeys */
+
+ /*
+ * This variable is shared by the single-key MinimalTuple case and the
+ * Datum case (which both use qsort_ssup()). Otherwise, it's NULL. The
+ * presence of a value in this field is also checked by various sort
+ * specialization functions as an optimization when comparing the leading
+ * key in a tiebreak situation to determine if there are any subsequent
+ * keys to sort on.
+ */
+ SortSupport onlyKey;
+
+ /*
+ * Additional state for managing "abbreviated key" sortsupport routines
+ * (which currently may be used by all cases except the hash index case).
+ * Tracks the intervals at which the optimization's effectiveness is
+ * tested.
+ */
+ int64 abbrevNext; /* Tuple # at which to next check
+ * applicability */
+
+ /*
+ * These variables are specific to the CLUSTER case; they are set by
+ * tuplesort_begin_cluster.
+ */
+ IndexInfo *indexInfo; /* info about index being used for reference */
+ EState *estate; /* for evaluating index expressions */
+
+ /*
+ * These variables are specific to the IndexTuple case; they are set by
+ * tuplesort_begin_index_xxx and used only by the IndexTuple routines.
+ */
+ Relation heapRel; /* table the index is being built on */
+ Relation indexRel; /* index being built */
+
+ /* These are specific to the index_btree subcase: */
+ bool enforceUnique; /* complain if we find duplicate tuples */
+ bool uniqueNullsNotDistinct; /* unique constraint null treatment */
+
+ /* These are specific to the index_hash subcase: */
+ uint32 high_mask; /* masks for sortable part of hash code */
+ uint32 low_mask;
+ uint32 max_buckets;
+
+ /*
+ * These variables are specific to the Datum case; they are set by
+ * tuplesort_begin_datum and used only by the DatumTuple routines.
+ */
+ Oid datumType;
+ /* we need typelen in order to know how to copy the Datums. */
+ int datumTypeLen;
+
+ /*
+ * Resource snapshot for time of sort start.
+ */
+#ifdef TRACE_SORT
+ PGRUsage ru_start;
+#endif
+};
+
+/*
+ * Private mutable state of tuplesort-parallel-operation. This is allocated
+ * in shared memory.
+ */
+struct Sharedsort
+{
+ /* mutex protects all fields prior to tapes */
+ slock_t mutex;
+
+ /*
+ * currentWorker generates ordinal identifier numbers for parallel sort
+ * workers. These start from 0, and are always gapless.
+ *
+ * Workers increment workersFinished to indicate having finished. If this
+ * is equal to state.nParticipants within the leader, leader is ready to
+ * merge worker runs.
+ */
+ int currentWorker;
+ int workersFinished;
+
+ /* Temporary file space */
+ SharedFileSet fileset;
+
+ /* Size of tapes flexible array */
+ int nTapes;
+
+ /*
+ * Tapes array used by workers to report back information needed by the
+ * leader to concatenate all worker tapes into one for merging
+ */
+ TapeShare tapes[FLEXIBLE_ARRAY_MEMBER];
+};
+
+/*
+ * Is the given tuple allocated from the slab memory arena?
+ */
+#define IS_SLAB_SLOT(state, tuple) \
+ ((char *) (tuple) >= (state)->slabMemoryBegin && \
+ (char *) (tuple) < (state)->slabMemoryEnd)
+
+/*
+ * Return the given tuple to the slab memory free list, or free it
+ * if it was palloc'd.
+ */
+#define RELEASE_SLAB_SLOT(state, tuple) \
+ do { \
+ SlabSlot *buf = (SlabSlot *) tuple; \
+ \
+ if (IS_SLAB_SLOT((state), buf)) \
+ { \
+ buf->nextfree = (state)->slabFreeHead; \
+ (state)->slabFreeHead = buf; \
+ } else \
+ pfree(buf); \
+ } while(0)
+
+#define COMPARETUP(state,a,b) ((*(state)->comparetup) (a, b, state))
+#define COPYTUP(state,stup,tup) ((*(state)->copytup) (state, stup, tup))
+#define WRITETUP(state,tape,stup) ((*(state)->writetup) (state, tape, stup))
+#define READTUP(state,stup,tape,len) ((*(state)->readtup) (state, stup, tape, len))
+#define LACKMEM(state) ((state)->availMem < 0 && !(state)->slabAllocatorUsed)
+#define USEMEM(state,amt) ((state)->availMem -= (amt))
+#define FREEMEM(state,amt) ((state)->availMem += (amt))
+#define SERIAL(state) ((state)->shared == NULL)
+#define WORKER(state) ((state)->shared && (state)->worker != -1)
+#define LEADER(state) ((state)->shared && (state)->worker == -1)
+
+/*
+ * NOTES about on-tape representation of tuples:
+ *
+ * We require the first "unsigned int" of a stored tuple to be the total size
+ * on-tape of the tuple, including itself (so it is never zero; an all-zero
+ * unsigned int is used to delimit runs). The remainder of the stored tuple
+ * may or may not match the in-memory representation of the tuple ---
+ * any conversion needed is the job of the writetup and readtup routines.
+ *
+ * If state->sortopt contains TUPLESORT_RANDOMACCESS, then the stored
+ * representation of the tuple must be followed by another "unsigned int" that
+ * is a copy of the length --- so the total tape space used is actually
+ * sizeof(unsigned int) more than the stored length value. This allows
+ * read-backwards. When the random access flag was not specified, the
+ * write/read routines may omit the extra length word.
+ *
+ * writetup is expected to write both length words as well as the tuple
+ * data. When readtup is called, the tape is positioned just after the
+ * front length word; readtup must read the tuple data and advance past
+ * the back length word (if present).
+ *
+ * The write/read routines can make use of the tuple description data
+ * stored in the Tuplesortstate record, if needed. They are also expected
+ * to adjust state->availMem by the amount of memory space (not tape space!)
+ * released or consumed. There is no error return from either writetup
+ * or readtup; they should ereport() on failure.
+ *
+ *
+ * NOTES about memory consumption calculations:
+ *
+ * We count space allocated for tuples against the workMem limit, plus
+ * the space used by the variable-size memtuples array. Fixed-size space
+ * is not counted; it's small enough to not be interesting.
+ *
+ * Note that we count actual space used (as shown by GetMemoryChunkSpace)
+ * rather than the originally-requested size. This is important since
+ * palloc can add substantial overhead. It's not a complete answer since
+ * we won't count any wasted space in palloc allocation blocks, but it's
+ * a lot better than what we were doing before 7.3. As of 9.6, a
+ * separate memory context is used for caller passed tuples. Resetting
+ * it at certain key increments significantly ameliorates fragmentation.
+ * Note that this places a responsibility on copytup routines to use the
+ * correct memory context for these tuples (and to not use the reset
+ * context for anything whose lifetime needs to span multiple external
+ * sort runs). readtup routines use the slab allocator (they cannot use
+ * the reset context because it gets deleted at the point that merging
+ * begins).
+ */
+
+/* When using this macro, beware of double evaluation of len */
+#define LogicalTapeReadExact(tape, ptr, len) \
+ do { \
+ if (LogicalTapeRead(tape, ptr, len) != (size_t) (len)) \
+ elog(ERROR, "unexpected end of data"); \
+ } while(0)
+
+
+static Tuplesortstate *tuplesort_begin_common(int workMem,
+ SortCoordinate coordinate,
+ int sortopt);
+static void tuplesort_begin_batch(Tuplesortstate *state);
+static void puttuple_common(Tuplesortstate *state, SortTuple *tuple);
+static bool consider_abort_common(Tuplesortstate *state);
+static void inittapes(Tuplesortstate *state, bool mergeruns);
+static void inittapestate(Tuplesortstate *state, int maxTapes);
+static void selectnewtape(Tuplesortstate *state);
+static void init_slab_allocator(Tuplesortstate *state, int numSlots);
+static void mergeruns(Tuplesortstate *state);
+static void mergeonerun(Tuplesortstate *state);
+static void beginmerge(Tuplesortstate *state);
+static bool mergereadnext(Tuplesortstate *state, LogicalTape *srcTape, SortTuple *stup);
+static void dumptuples(Tuplesortstate *state, bool alltuples);
+static void make_bounded_heap(Tuplesortstate *state);
+static void sort_bounded_heap(Tuplesortstate *state);
+static void tuplesort_sort_memtuples(Tuplesortstate *state);
+static void tuplesort_heap_insert(Tuplesortstate *state, SortTuple *tuple);
+static void tuplesort_heap_replace_top(Tuplesortstate *state, SortTuple *tuple);
+static void tuplesort_heap_delete_top(Tuplesortstate *state);
+static void reversedirection(Tuplesortstate *state);
+static unsigned int getlen(LogicalTape *tape, bool eofOK);
+static void markrunend(LogicalTape *tape);
+static void *readtup_alloc(Tuplesortstate *state, Size tuplen);
+static int comparetup_heap(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+static void copytup_heap(Tuplesortstate *state, SortTuple *stup, void *tup);
+static void writetup_heap(Tuplesortstate *state, LogicalTape *tape,
+ SortTuple *stup);
+static void readtup_heap(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len);
+static int comparetup_cluster(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+static void copytup_cluster(Tuplesortstate *state, SortTuple *stup, void *tup);
+static void writetup_cluster(Tuplesortstate *state, LogicalTape *tape,
+ SortTuple *stup);
+static void readtup_cluster(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len);
+static int comparetup_index_btree(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+static int comparetup_index_hash(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+static void copytup_index(Tuplesortstate *state, SortTuple *stup, void *tup);
+static void writetup_index(Tuplesortstate *state, LogicalTape *tape,
+ SortTuple *stup);
+static void readtup_index(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len);
+static int comparetup_datum(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+static void copytup_datum(Tuplesortstate *state, SortTuple *stup, void *tup);
+static void writetup_datum(Tuplesortstate *state, LogicalTape *tape,
+ SortTuple *stup);
+static void readtup_datum(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len);
+static int worker_get_identifier(Tuplesortstate *state);
+static void worker_freeze_result_tape(Tuplesortstate *state);
+static void worker_nomergeruns(Tuplesortstate *state);
+static void leader_takeover_tapes(Tuplesortstate *state);
+static void free_sort_tuple(Tuplesortstate *state, SortTuple *stup);
+static void tuplesort_free(Tuplesortstate *state);
+static void tuplesort_updatemax(Tuplesortstate *state);
+
+/*
+ * Specialized comparators that we can inline into specialized sorts. The goal
+ * is to try to sort two tuples without having to follow the pointers to the
+ * comparator or the tuple.
+ *
+ * XXX: For now, these fall back to comparator functions that will compare the
+ * leading datum a second time.
+ *
+ * XXX: For now, there is no specialization for cases where datum1 is
+ * authoritative and we don't even need to fall back to a callback at all (that
+ * would be true for types like int4/int8/timestamp/date, but not true for
+ * abbreviations of text or multi-key sorts. There could be! Is it worth it?
+ */
+
+/* Used if first key's comparator is ssup_datum_unsigned_compare */
+static pg_attribute_always_inline int
+qsort_tuple_unsigned_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state)
+{
+ int compare;
+
+ compare = ApplyUnsignedSortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ &state->sortKeys[0]);
+ if (compare != 0)
+ return compare;
+
+ /*
+ * No need to waste effort calling the tiebreak function when there are no
+ * other keys to sort on.
+ */
+ if (state->onlyKey != NULL)
+ return 0;
+
+ return state->comparetup(a, b, state);
+}
+
+#if SIZEOF_DATUM >= 8
+/* Used if first key's comparator is ssup_datum_signed_compare */
+static pg_attribute_always_inline int
+qsort_tuple_signed_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state)
+{
+ int compare;
+
+ compare = ApplySignedSortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ &state->sortKeys[0]);
+
+ if (compare != 0)
+ return compare;
+
+ /*
+ * No need to waste effort calling the tiebreak function when there are no
+ * other keys to sort on.
+ */
+ if (state->onlyKey != NULL)
+ return 0;
+
+ return state->comparetup(a, b, state);
+}
+#endif
+
+/* Used if first key's comparator is ssup_datum_int32_compare */
+static pg_attribute_always_inline int
+qsort_tuple_int32_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state)
+{
+ int compare;
+
+ compare = ApplyInt32SortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ &state->sortKeys[0]);
+
+ if (compare != 0)
+ return compare;
+
+ /*
+ * No need to waste effort calling the tiebreak function when there are no
+ * other keys to sort on.
+ */
+ if (state->onlyKey != NULL)
+ return 0;
+
+ return state->comparetup(a, b, state);
+}
+
+/*
+ * Special versions of qsort just for SortTuple objects. qsort_tuple() sorts
+ * any variant of SortTuples, using the appropriate comparetup function.
+ * qsort_ssup() is specialized for the case where the comparetup function
+ * reduces to ApplySortComparator(), that is single-key MinimalTuple sorts
+ * and Datum sorts. qsort_tuple_{unsigned,signed,int32} are specialized for
+ * common comparison functions on pass-by-value leading datums.
+ */
+
+#define ST_SORT qsort_tuple_unsigned
+#define ST_ELEMENT_TYPE SortTuple
+#define ST_COMPARE(a, b, state) qsort_tuple_unsigned_compare(a, b, state)
+#define ST_COMPARE_ARG_TYPE Tuplesortstate
+#define ST_CHECK_FOR_INTERRUPTS
+#define ST_SCOPE static
+#define ST_DEFINE
+#include "lib/sort_template.h"
+
+#if SIZEOF_DATUM >= 8
+#define ST_SORT qsort_tuple_signed
+#define ST_ELEMENT_TYPE SortTuple
+#define ST_COMPARE(a, b, state) qsort_tuple_signed_compare(a, b, state)
+#define ST_COMPARE_ARG_TYPE Tuplesortstate
+#define ST_CHECK_FOR_INTERRUPTS
+#define ST_SCOPE static
+#define ST_DEFINE
+#include "lib/sort_template.h"
+#endif
+
+#define ST_SORT qsort_tuple_int32
+#define ST_ELEMENT_TYPE SortTuple
+#define ST_COMPARE(a, b, state) qsort_tuple_int32_compare(a, b, state)
+#define ST_COMPARE_ARG_TYPE Tuplesortstate
+#define ST_CHECK_FOR_INTERRUPTS
+#define ST_SCOPE static
+#define ST_DEFINE
+#include "lib/sort_template.h"
+
+#define ST_SORT qsort_tuple
+#define ST_ELEMENT_TYPE SortTuple
+#define ST_COMPARE_RUNTIME_POINTER
+#define ST_COMPARE_ARG_TYPE Tuplesortstate
+#define ST_CHECK_FOR_INTERRUPTS
+#define ST_SCOPE static
+#define ST_DECLARE
+#define ST_DEFINE
+#include "lib/sort_template.h"
+
+#define ST_SORT qsort_ssup
+#define ST_ELEMENT_TYPE SortTuple
+#define ST_COMPARE(a, b, ssup) \
+ ApplySortComparator((a)->datum1, (a)->isnull1, \
+ (b)->datum1, (b)->isnull1, (ssup))
+#define ST_COMPARE_ARG_TYPE SortSupportData
+#define ST_CHECK_FOR_INTERRUPTS
+#define ST_SCOPE static
+#define ST_DEFINE
+#include "lib/sort_template.h"
+
+/*
+ * tuplesort_begin_xxx
+ *
+ * Initialize for a tuple sort operation.
+ *
+ * After calling tuplesort_begin, the caller should call tuplesort_putXXX
+ * zero or more times, then call tuplesort_performsort when all the tuples
+ * have been supplied. After performsort, retrieve the tuples in sorted
+ * order by calling tuplesort_getXXX until it returns false/NULL. (If random
+ * access was requested, rescan, markpos, and restorepos can also be called.)
+ * Call tuplesort_end to terminate the operation and release memory/disk space.
+ *
+ * Each variant of tuplesort_begin has a workMem parameter specifying the
+ * maximum number of kilobytes of RAM to use before spilling data to disk.
+ * (The normal value of this parameter is work_mem, but some callers use
+ * other values.) Each variant also has a sortopt which is a bitmask of
+ * sort options. See TUPLESORT_* definitions in tuplesort.h
+ */
+
+static Tuplesortstate *
+tuplesort_begin_common(int workMem, SortCoordinate coordinate, int sortopt)
+{
+ Tuplesortstate *state;
+ MemoryContext maincontext;
+ MemoryContext sortcontext;
+ MemoryContext oldcontext;
+
+ /* See leader_takeover_tapes() remarks on random access support */
+ if (coordinate && (sortopt & TUPLESORT_RANDOMACCESS))
+ elog(ERROR, "random access disallowed under parallel sort");
+
+ /*
+ * Memory context surviving tuplesort_reset. This memory context holds
+ * data which is useful to keep while sorting multiple similar batches.
+ */
+ maincontext = AllocSetContextCreate(CurrentMemoryContext,
+ "TupleSort main",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Create a working memory context for one sort operation. The content of
+ * this context is deleted by tuplesort_reset.
+ */
+ sortcontext = AllocSetContextCreate(maincontext,
+ "TupleSort sort",
+ ALLOCSET_DEFAULT_SIZES);
+
+ /*
+ * Additionally a working memory context for tuples is setup in
+ * tuplesort_begin_batch.
+ */
+
+ /*
+ * Make the Tuplesortstate within the per-sortstate context. This way, we
+ * don't need a separate pfree() operation for it at shutdown.
+ */
+ oldcontext = MemoryContextSwitchTo(maincontext);
+
+ state = (Tuplesortstate *) palloc0(sizeof(Tuplesortstate));
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ pg_rusage_init(&state->ru_start);
+#endif
+
+ state->sortopt = sortopt;
+ state->tuples = true;
+
+ /*
+ * workMem is forced to be at least 64KB, the current minimum valid value
+ * for the work_mem GUC. This is a defense against parallel sort callers
+ * that divide out memory among many workers in a way that leaves each
+ * with very little memory.
+ */
+ state->allowedMem = Max(workMem, 64) * (int64) 1024;
+ state->sortcontext = sortcontext;
+ state->maincontext = maincontext;
+
+ /*
+ * Initial size of array must be more than ALLOCSET_SEPARATE_THRESHOLD;
+ * see comments in grow_memtuples().
+ */
+ state->memtupsize = INITIAL_MEMTUPSIZE;
+ state->memtuples = NULL;
+
+ /*
+ * After all of the other non-parallel-related state, we setup all of the
+ * state needed for each batch.
+ */
+ tuplesort_begin_batch(state);
+
+ /*
+ * Initialize parallel-related state based on coordination information
+ * from caller
+ */
+ if (!coordinate)
+ {
+ /* Serial sort */
+ state->shared = NULL;
+ state->worker = -1;
+ state->nParticipants = -1;
+ }
+ else if (coordinate->isWorker)
+ {
+ /* Parallel worker produces exactly one final run from all input */
+ state->shared = coordinate->sharedsort;
+ state->worker = worker_get_identifier(state);
+ state->nParticipants = -1;
+ }
+ else
+ {
+ /* Parallel leader state only used for final merge */
+ state->shared = coordinate->sharedsort;
+ state->worker = -1;
+ state->nParticipants = coordinate->nParticipants;
+ Assert(state->nParticipants >= 1);
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+/*
+ * tuplesort_begin_batch
+ *
+ * Setup, or reset, all state need for processing a new set of tuples with this
+ * sort state. Called both from tuplesort_begin_common (the first time sorting
+ * with this sort state) and tuplesort_reset (for subsequent usages).
+ */
+static void
+tuplesort_begin_batch(Tuplesortstate *state)
+{
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+ /*
+ * Caller tuple (e.g. IndexTuple) memory context.
+ *
+ * A dedicated child context used exclusively for caller passed tuples
+ * eases memory management. Resetting at key points reduces
+ * fragmentation. Note that the memtuples array of SortTuples is allocated
+ * in the parent context, not this context, because there is no need to
+ * free memtuples early. For bounded sorts, tuples may be pfreed in any
+ * order, so we use a regular aset.c context so that it can make use of
+ * free'd memory. When the sort is not bounded, we make use of a
+ * generation.c context as this keeps allocations more compact with less
+ * wastage. Allocations are also slightly more CPU efficient.
+ */
+ if (state->sortopt & TUPLESORT_ALLOWBOUNDED)
+ state->tuplecontext = AllocSetContextCreate(state->sortcontext,
+ "Caller tuples",
+ ALLOCSET_DEFAULT_SIZES);
+ else
+ state->tuplecontext = GenerationContextCreate(state->sortcontext,
+ "Caller tuples",
+ ALLOCSET_DEFAULT_SIZES);
+
+
+ state->status = TSS_INITIAL;
+ state->bounded = false;
+ state->boundUsed = false;
+
+ state->availMem = state->allowedMem;
+
+ state->tapeset = NULL;
+
+ state->memtupcount = 0;
+
+ /*
+ * Initial size of array must be more than ALLOCSET_SEPARATE_THRESHOLD;
+ * see comments in grow_memtuples().
+ */
+ state->growmemtuples = true;
+ state->slabAllocatorUsed = false;
+ if (state->memtuples != NULL && state->memtupsize != INITIAL_MEMTUPSIZE)
+ {
+ pfree(state->memtuples);
+ state->memtuples = NULL;
+ state->memtupsize = INITIAL_MEMTUPSIZE;
+ }
+ if (state->memtuples == NULL)
+ {
+ state->memtuples = (SortTuple *) palloc(state->memtupsize * sizeof(SortTuple));
+ USEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ }
+
+ /* workMem must be large enough for the minimal memtuples array */
+ if (LACKMEM(state))
+ elog(ERROR, "insufficient memory allowed for sort");
+
+ state->currentRun = 0;
+
+ /*
+ * Tape variables (inputTapes, outputTapes, etc.) will be initialized by
+ * inittapes(), if needed.
+ */
+
+ state->result_tape = NULL; /* flag that result tape has not been formed */
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+Tuplesortstate *
+tuplesort_begin_heap(TupleDesc tupDesc,
+ int nkeys, AttrNumber *attNums,
+ Oid *sortOperators, Oid *sortCollations,
+ bool *nullsFirstFlags,
+ int workMem, SortCoordinate coordinate, int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ MemoryContext oldcontext;
+ int i;
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+ AssertArg(nkeys > 0);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
+ nkeys, workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = nkeys;
+
+ TRACE_POSTGRESQL_SORT_START(HEAP_SORT,
+ false, /* no unique check */
+ nkeys,
+ workMem,
+ sortopt & TUPLESORT_RANDOMACCESS,
+ PARALLEL_SORT(state));
+
+ state->comparetup = comparetup_heap;
+ state->copytup = copytup_heap;
+ state->writetup = writetup_heap;
+ state->readtup = readtup_heap;
+ state->haveDatum1 = true;
+
+ state->tupDesc = tupDesc; /* assume we need not copy tupDesc */
+ state->abbrevNext = 10;
+
+ /* Prepare SortSupport data for each column */
+ state->sortKeys = (SortSupport) palloc0(nkeys * sizeof(SortSupportData));
+
+ for (i = 0; i < nkeys; i++)
+ {
+ SortSupport sortKey = state->sortKeys + i;
+
+ AssertArg(attNums[i] != 0);
+ AssertArg(sortOperators[i] != 0);
+
+ sortKey->ssup_cxt = CurrentMemoryContext;
+ sortKey->ssup_collation = sortCollations[i];
+ sortKey->ssup_nulls_first = nullsFirstFlags[i];
+ sortKey->ssup_attno = attNums[i];
+ /* Convey if abbreviation optimization is applicable in principle */
+ sortKey->abbreviate = (i == 0 && state->haveDatum1);
+
+ PrepareSortSupportFromOrderingOp(sortOperators[i], sortKey);
+ }
+
+ /*
+ * The "onlyKey" optimization cannot be used with abbreviated keys, since
+ * tie-breaker comparisons may be required. Typically, the optimization
+ * is only of value to pass-by-value types anyway, whereas abbreviated
+ * keys are typically only of value to pass-by-reference types.
+ */
+ if (nkeys == 1 && !state->sortKeys->abbrev_converter)
+ state->onlyKey = state->sortKeys;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Tuplesortstate *
+tuplesort_begin_cluster(TupleDesc tupDesc,
+ Relation indexRel,
+ int workMem,
+ SortCoordinate coordinate, int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ BTScanInsert indexScanKey;
+ MemoryContext oldcontext;
+ int i;
+
+ Assert(indexRel->rd_rel->relam == BTREE_AM_OID);
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
+ RelationGetNumberOfAttributes(indexRel),
+ workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel);
+
+ TRACE_POSTGRESQL_SORT_START(CLUSTER_SORT,
+ false, /* no unique check */
+ state->nKeys,
+ workMem,
+ sortopt & TUPLESORT_RANDOMACCESS,
+ PARALLEL_SORT(state));
+
+ state->comparetup = comparetup_cluster;
+ state->copytup = copytup_cluster;
+ state->writetup = writetup_cluster;
+ state->readtup = readtup_cluster;
+ state->abbrevNext = 10;
+
+ state->indexInfo = BuildIndexInfo(indexRel);
+
+ /*
+ * If we don't have a simple leading attribute, we don't currently
+ * initialize datum1, so disable optimizations that require it.
+ */
+ if (state->indexInfo->ii_IndexAttrNumbers[0] == 0)
+ state->haveDatum1 = false;
+ else
+ state->haveDatum1 = true;
+
+ state->tupDesc = tupDesc; /* assume we need not copy tupDesc */
+
+ indexScanKey = _bt_mkscankey(indexRel, NULL);
+
+ if (state->indexInfo->ii_Expressions != NULL)
+ {
+ TupleTableSlot *slot;
+ ExprContext *econtext;
+
+ /*
+ * We will need to use FormIndexDatum to evaluate the index
+ * expressions. To do that, we need an EState, as well as a
+ * TupleTableSlot to put the table tuples into. The econtext's
+ * scantuple has to point to that slot, too.
+ */
+ state->estate = CreateExecutorState();
+ slot = MakeSingleTupleTableSlot(tupDesc, &TTSOpsHeapTuple);
+ econtext = GetPerTupleExprContext(state->estate);
+ econtext->ecxt_scantuple = slot;
+ }
+
+ /* Prepare SortSupport data for each column */
+ state->sortKeys = (SortSupport) palloc0(state->nKeys *
+ sizeof(SortSupportData));
+
+ for (i = 0; i < state->nKeys; i++)
+ {
+ SortSupport sortKey = state->sortKeys + i;
+ ScanKey scanKey = indexScanKey->scankeys + i;
+ int16 strategy;
+
+ sortKey->ssup_cxt = CurrentMemoryContext;
+ sortKey->ssup_collation = scanKey->sk_collation;
+ sortKey->ssup_nulls_first =
+ (scanKey->sk_flags & SK_BT_NULLS_FIRST) != 0;
+ sortKey->ssup_attno = scanKey->sk_attno;
+ /* Convey if abbreviation optimization is applicable in principle */
+ sortKey->abbreviate = (i == 0 && state->haveDatum1);
+
+ AssertState(sortKey->ssup_attno != 0);
+
+ strategy = (scanKey->sk_flags & SK_BT_DESC) != 0 ?
+ BTGreaterStrategyNumber : BTLessStrategyNumber;
+
+ PrepareSortSupportFromIndexRel(indexRel, strategy, sortKey);
+ }
+
+ pfree(indexScanKey);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Tuplesortstate *
+tuplesort_begin_index_btree(Relation heapRel,
+ Relation indexRel,
+ bool enforceUnique,
+ bool uniqueNullsNotDistinct,
+ int workMem,
+ SortCoordinate coordinate,
+ int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ BTScanInsert indexScanKey;
+ MemoryContext oldcontext;
+ int i;
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin index sort: unique = %c, workMem = %d, randomAccess = %c",
+ enforceUnique ? 't' : 'f',
+ workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel);
+
+ TRACE_POSTGRESQL_SORT_START(INDEX_SORT,
+ enforceUnique,
+ state->nKeys,
+ workMem,
+ sortopt & TUPLESORT_RANDOMACCESS,
+ PARALLEL_SORT(state));
+
+ state->comparetup = comparetup_index_btree;
+ state->copytup = copytup_index;
+ state->writetup = writetup_index;
+ state->readtup = readtup_index;
+ state->abbrevNext = 10;
+ state->haveDatum1 = true;
+
+ state->heapRel = heapRel;
+ state->indexRel = indexRel;
+ state->enforceUnique = enforceUnique;
+ state->uniqueNullsNotDistinct = uniqueNullsNotDistinct;
+
+ indexScanKey = _bt_mkscankey(indexRel, NULL);
+
+ /* Prepare SortSupport data for each column */
+ state->sortKeys = (SortSupport) palloc0(state->nKeys *
+ sizeof(SortSupportData));
+
+ for (i = 0; i < state->nKeys; i++)
+ {
+ SortSupport sortKey = state->sortKeys + i;
+ ScanKey scanKey = indexScanKey->scankeys + i;
+ int16 strategy;
+
+ sortKey->ssup_cxt = CurrentMemoryContext;
+ sortKey->ssup_collation = scanKey->sk_collation;
+ sortKey->ssup_nulls_first =
+ (scanKey->sk_flags & SK_BT_NULLS_FIRST) != 0;
+ sortKey->ssup_attno = scanKey->sk_attno;
+ /* Convey if abbreviation optimization is applicable in principle */
+ sortKey->abbreviate = (i == 0 && state->haveDatum1);
+
+ AssertState(sortKey->ssup_attno != 0);
+
+ strategy = (scanKey->sk_flags & SK_BT_DESC) != 0 ?
+ BTGreaterStrategyNumber : BTLessStrategyNumber;
+
+ PrepareSortSupportFromIndexRel(indexRel, strategy, sortKey);
+ }
+
+ pfree(indexScanKey);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Tuplesortstate *
+tuplesort_begin_index_hash(Relation heapRel,
+ Relation indexRel,
+ uint32 high_mask,
+ uint32 low_mask,
+ uint32 max_buckets,
+ int workMem,
+ SortCoordinate coordinate,
+ int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ MemoryContext oldcontext;
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
+ "max_buckets = 0x%x, workMem = %d, randomAccess = %c",
+ high_mask,
+ low_mask,
+ max_buckets,
+ workMem,
+ sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = 1; /* Only one sort column, the hash code */
+
+ state->comparetup = comparetup_index_hash;
+ state->copytup = copytup_index;
+ state->writetup = writetup_index;
+ state->readtup = readtup_index;
+ state->haveDatum1 = true;
+
+ state->heapRel = heapRel;
+ state->indexRel = indexRel;
+
+ state->high_mask = high_mask;
+ state->low_mask = low_mask;
+ state->max_buckets = max_buckets;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Tuplesortstate *
+tuplesort_begin_index_gist(Relation heapRel,
+ Relation indexRel,
+ int workMem,
+ SortCoordinate coordinate,
+ int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ MemoryContext oldcontext;
+ int i;
+
+ oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin index sort: workMem = %d, randomAccess = %c",
+ workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = IndexRelationGetNumberOfKeyAttributes(indexRel);
+
+ state->comparetup = comparetup_index_btree;
+ state->copytup = copytup_index;
+ state->writetup = writetup_index;
+ state->readtup = readtup_index;
+ state->haveDatum1 = true;
+
+ state->heapRel = heapRel;
+ state->indexRel = indexRel;
+
+ /* Prepare SortSupport data for each column */
+ state->sortKeys = (SortSupport) palloc0(state->nKeys *
+ sizeof(SortSupportData));
+
+ for (i = 0; i < state->nKeys; i++)
+ {
+ SortSupport sortKey = state->sortKeys + i;
+
+ sortKey->ssup_cxt = CurrentMemoryContext;
+ sortKey->ssup_collation = indexRel->rd_indcollation[i];
+ sortKey->ssup_nulls_first = false;
+ sortKey->ssup_attno = i + 1;
+ /* Convey if abbreviation optimization is applicable in principle */
+ sortKey->abbreviate = (i == 0 && state->haveDatum1);
+
+ AssertState(sortKey->ssup_attno != 0);
+
+ /* Look for a sort support function */
+ PrepareSortSupportFromGistIndexRel(indexRel, sortKey);
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+Tuplesortstate *
+tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation,
+ bool nullsFirstFlag, int workMem,
+ SortCoordinate coordinate, int sortopt)
+{
+ Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate,
+ sortopt);
+ MemoryContext oldcontext;
+ int16 typlen;
+ bool typbyval;
+
+ oldcontext = MemoryContextSwitchTo(state->maincontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG,
+ "begin datum sort: workMem = %d, randomAccess = %c",
+ workMem, sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f');
+#endif
+
+ state->nKeys = 1; /* always a one-column sort */
+
+ TRACE_POSTGRESQL_SORT_START(DATUM_SORT,
+ false, /* no unique check */
+ 1,
+ workMem,
+ sortopt & TUPLESORT_RANDOMACCESS,
+ PARALLEL_SORT(state));
+
+ state->comparetup = comparetup_datum;
+ state->copytup = copytup_datum;
+ state->writetup = writetup_datum;
+ state->readtup = readtup_datum;
+ state->abbrevNext = 10;
+ state->haveDatum1 = true;
+
+ state->datumType = datumType;
+
+ /* lookup necessary attributes of the datum type */
+ get_typlenbyval(datumType, &typlen, &typbyval);
+ state->datumTypeLen = typlen;
+ state->tuples = !typbyval;
+
+ /* Prepare SortSupport data */
+ state->sortKeys = (SortSupport) palloc0(sizeof(SortSupportData));
+
+ state->sortKeys->ssup_cxt = CurrentMemoryContext;
+ state->sortKeys->ssup_collation = sortCollation;
+ state->sortKeys->ssup_nulls_first = nullsFirstFlag;
+
+ /*
+ * Abbreviation is possible here only for by-reference types. In theory,
+ * a pass-by-value datatype could have an abbreviated form that is cheaper
+ * to compare. In a tuple sort, we could support that, because we can
+ * always extract the original datum from the tuple as needed. Here, we
+ * can't, because a datum sort only stores a single copy of the datum; the
+ * "tuple" field of each SortTuple is NULL.
+ */
+ state->sortKeys->abbreviate = !typbyval;
+
+ PrepareSortSupportFromOrderingOp(sortOperator, state->sortKeys);
+
+ /*
+ * The "onlyKey" optimization cannot be used with abbreviated keys, since
+ * tie-breaker comparisons may be required. Typically, the optimization
+ * is only of value to pass-by-value types anyway, whereas abbreviated
+ * keys are typically only of value to pass-by-reference types.
+ */
+ if (!state->sortKeys->abbrev_converter)
+ state->onlyKey = state->sortKeys;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return state;
+}
+
+/*
+ * tuplesort_set_bound
+ *
+ * Advise tuplesort that at most the first N result tuples are required.
+ *
+ * Must be called before inserting any tuples. (Actually, we could allow it
+ * as long as the sort hasn't spilled to disk, but there seems no need for
+ * delayed calls at the moment.)
+ *
+ * This is a hint only. The tuplesort may still return more tuples than
+ * requested. Parallel leader tuplesorts will always ignore the hint.
+ */
+void
+tuplesort_set_bound(Tuplesortstate *state, int64 bound)
+{
+ /* Assert we're called before loading any tuples */
+ Assert(state->status == TSS_INITIAL && state->memtupcount == 0);
+ /* Assert we allow bounded sorts */
+ Assert(state->sortopt & TUPLESORT_ALLOWBOUNDED);
+ /* Can't set the bound twice, either */
+ Assert(!state->bounded);
+ /* Also, this shouldn't be called in a parallel worker */
+ Assert(!WORKER(state));
+
+ /* Parallel leader allows but ignores hint */
+ if (LEADER(state))
+ return;
+
+#ifdef DEBUG_BOUNDED_SORT
+ /* Honor GUC setting that disables the feature (for easy testing) */
+ if (!optimize_bounded_sort)
+ return;
+#endif
+
+ /* We want to be able to compute bound * 2, so limit the setting */
+ if (bound > (int64) (INT_MAX / 2))
+ return;
+
+ state->bounded = true;
+ state->bound = (int) bound;
+
+ /*
+ * Bounded sorts are not an effective target for abbreviated key
+ * optimization. Disable by setting state to be consistent with no
+ * abbreviation support.
+ */
+ state->sortKeys->abbrev_converter = NULL;
+ if (state->sortKeys->abbrev_full_comparator)
+ state->sortKeys->comparator = state->sortKeys->abbrev_full_comparator;
+
+ /* Not strictly necessary, but be tidy */
+ state->sortKeys->abbrev_abort = NULL;
+ state->sortKeys->abbrev_full_comparator = NULL;
+}
+
+/*
+ * tuplesort_used_bound
+ *
+ * Allow callers to find out if the sort state was able to use a bound.
+ */
+bool
+tuplesort_used_bound(Tuplesortstate *state)
+{
+ return state->boundUsed;
+}
+
+/*
+ * tuplesort_free
+ *
+ * Internal routine for freeing resources of tuplesort.
+ */
+static void
+tuplesort_free(Tuplesortstate *state)
+{
+ /* context swap probably not needed, but let's be safe */
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+#ifdef TRACE_SORT
+ long spaceUsed;
+
+ if (state->tapeset)
+ spaceUsed = LogicalTapeSetBlocks(state->tapeset);
+ else
+ spaceUsed = (state->allowedMem - state->availMem + 1023) / 1024;
+#endif
+
+ /*
+ * Delete temporary "tape" files, if any.
+ *
+ * Note: want to include this in reported total cost of sort, hence need
+ * for two #ifdef TRACE_SORT sections.
+ *
+ * We don't bother to destroy the individual tapes here. They will go away
+ * with the sortcontext. (In TSS_FINALMERGE state, we have closed
+ * finished tapes already.)
+ */
+ if (state->tapeset)
+ LogicalTapeSetClose(state->tapeset);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ {
+ if (state->tapeset)
+ elog(LOG, "%s of worker %d ended, %ld disk blocks used: %s",
+ SERIAL(state) ? "external sort" : "parallel external sort",
+ state->worker, spaceUsed, pg_rusage_show(&state->ru_start));
+ else
+ elog(LOG, "%s of worker %d ended, %ld KB used: %s",
+ SERIAL(state) ? "internal sort" : "unperformed parallel sort",
+ state->worker, spaceUsed, pg_rusage_show(&state->ru_start));
+ }
+
+ TRACE_POSTGRESQL_SORT_DONE(state->tapeset != NULL, spaceUsed);
+#else
+
+ /*
+ * If you disabled TRACE_SORT, you can still probe sort__done, but you
+ * ain't getting space-used stats.
+ */
+ TRACE_POSTGRESQL_SORT_DONE(state->tapeset != NULL, 0L);
+#endif
+
+ /* Free any execution state created for CLUSTER case */
+ if (state->estate != NULL)
+ {
+ ExprContext *econtext = GetPerTupleExprContext(state->estate);
+
+ ExecDropSingleTupleTableSlot(econtext->ecxt_scantuple);
+ FreeExecutorState(state->estate);
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+
+ /*
+ * Free the per-sort memory context, thereby releasing all working memory.
+ */
+ MemoryContextReset(state->sortcontext);
+}
+
+/*
+ * tuplesort_end
+ *
+ * Release resources and clean up.
+ *
+ * NOTE: after calling this, any pointers returned by tuplesort_getXXX are
+ * pointing to garbage. Be careful not to attempt to use or free such
+ * pointers afterwards!
+ */
+void
+tuplesort_end(Tuplesortstate *state)
+{
+ tuplesort_free(state);
+
+ /*
+ * Free the main memory context, including the Tuplesortstate struct
+ * itself.
+ */
+ MemoryContextDelete(state->maincontext);
+}
+
+/*
+ * tuplesort_updatemax
+ *
+ * Update maximum resource usage statistics.
+ */
+static void
+tuplesort_updatemax(Tuplesortstate *state)
+{
+ int64 spaceUsed;
+ bool isSpaceDisk;
+
+ /*
+ * Note: it might seem we should provide both memory and disk usage for a
+ * disk-based sort. However, the current code doesn't track memory space
+ * accurately once we have begun to return tuples to the caller (since we
+ * don't account for pfree's the caller is expected to do), so we cannot
+ * rely on availMem in a disk sort. This does not seem worth the overhead
+ * to fix. Is it worth creating an API for the memory context code to
+ * tell us how much is actually used in sortcontext?
+ */
+ if (state->tapeset)
+ {
+ isSpaceDisk = true;
+ spaceUsed = LogicalTapeSetBlocks(state->tapeset) * BLCKSZ;
+ }
+ else
+ {
+ isSpaceDisk = false;
+ spaceUsed = state->allowedMem - state->availMem;
+ }
+
+ /*
+ * Sort evicts data to the disk when it wasn't able to fit that data into
+ * main memory. This is why we assume space used on the disk to be more
+ * important for tracking resource usage than space used in memory. Note
+ * that the amount of space occupied by some tupleset on the disk might be
+ * less than amount of space occupied by the same tupleset in memory due
+ * to more compact representation.
+ */
+ if ((isSpaceDisk && !state->isMaxSpaceDisk) ||
+ (isSpaceDisk == state->isMaxSpaceDisk && spaceUsed > state->maxSpace))
+ {
+ state->maxSpace = spaceUsed;
+ state->isMaxSpaceDisk = isSpaceDisk;
+ state->maxSpaceStatus = state->status;
+ }
+}
+
+/*
+ * tuplesort_reset
+ *
+ * Reset the tuplesort. Reset all the data in the tuplesort, but leave the
+ * meta-information in. After tuplesort_reset, tuplesort is ready to start
+ * a new sort. This allows avoiding recreation of tuple sort states (and
+ * save resources) when sorting multiple small batches.
+ */
+void
+tuplesort_reset(Tuplesortstate *state)
+{
+ tuplesort_updatemax(state);
+ tuplesort_free(state);
+
+ /*
+ * After we've freed up per-batch memory, re-setup all of the state common
+ * to both the first batch and any subsequent batch.
+ */
+ tuplesort_begin_batch(state);
+
+ state->lastReturnedTuple = NULL;
+ state->slabMemoryBegin = NULL;
+ state->slabMemoryEnd = NULL;
+ state->slabFreeHead = NULL;
+}
+
+/*
+ * Grow the memtuples[] array, if possible within our memory constraint. We
+ * must not exceed INT_MAX tuples in memory or the caller-provided memory
+ * limit. Return true if we were able to enlarge the array, false if not.
+ *
+ * Normally, at each increment we double the size of the array. When doing
+ * that would exceed a limit, we attempt one last, smaller increase (and then
+ * clear the growmemtuples flag so we don't try any more). That allows us to
+ * use memory as fully as permitted; sticking to the pure doubling rule could
+ * result in almost half going unused. Because availMem moves around with
+ * tuple addition/removal, we need some rule to prevent making repeated small
+ * increases in memtupsize, which would just be useless thrashing. The
+ * growmemtuples flag accomplishes that and also prevents useless
+ * recalculations in this function.
+ */
+static bool
+grow_memtuples(Tuplesortstate *state)
+{
+ int newmemtupsize;
+ int memtupsize = state->memtupsize;
+ int64 memNowUsed = state->allowedMem - state->availMem;
+
+ /* Forget it if we've already maxed out memtuples, per comment above */
+ if (!state->growmemtuples)
+ return false;
+
+ /* Select new value of memtupsize */
+ if (memNowUsed <= state->availMem)
+ {
+ /*
+ * We've used no more than half of allowedMem; double our usage,
+ * clamping at INT_MAX tuples.
+ */
+ if (memtupsize < INT_MAX / 2)
+ newmemtupsize = memtupsize * 2;
+ else
+ {
+ newmemtupsize = INT_MAX;
+ state->growmemtuples = false;
+ }
+ }
+ else
+ {
+ /*
+ * This will be the last increment of memtupsize. Abandon doubling
+ * strategy and instead increase as much as we safely can.
+ *
+ * To stay within allowedMem, we can't increase memtupsize by more
+ * than availMem / sizeof(SortTuple) elements. In practice, we want
+ * to increase it by considerably less, because we need to leave some
+ * space for the tuples to which the new array slots will refer. We
+ * assume the new tuples will be about the same size as the tuples
+ * we've already seen, and thus we can extrapolate from the space
+ * consumption so far to estimate an appropriate new size for the
+ * memtuples array. The optimal value might be higher or lower than
+ * this estimate, but it's hard to know that in advance. We again
+ * clamp at INT_MAX tuples.
+ *
+ * This calculation is safe against enlarging the array so much that
+ * LACKMEM becomes true, because the memory currently used includes
+ * the present array; thus, there would be enough allowedMem for the
+ * new array elements even if no other memory were currently used.
+ *
+ * We do the arithmetic in float8, because otherwise the product of
+ * memtupsize and allowedMem could overflow. Any inaccuracy in the
+ * result should be insignificant; but even if we computed a
+ * completely insane result, the checks below will prevent anything
+ * really bad from happening.
+ */
+ double grow_ratio;
+
+ grow_ratio = (double) state->allowedMem / (double) memNowUsed;
+ if (memtupsize * grow_ratio < INT_MAX)
+ newmemtupsize = (int) (memtupsize * grow_ratio);
+ else
+ newmemtupsize = INT_MAX;
+
+ /* We won't make any further enlargement attempts */
+ state->growmemtuples = false;
+ }
+
+ /* Must enlarge array by at least one element, else report failure */
+ if (newmemtupsize <= memtupsize)
+ goto noalloc;
+
+ /*
+ * On a 32-bit machine, allowedMem could exceed MaxAllocHugeSize. Clamp
+ * to ensure our request won't be rejected. Note that we can easily
+ * exhaust address space before facing this outcome. (This is presently
+ * impossible due to guc.c's MAX_KILOBYTES limitation on work_mem, but
+ * don't rely on that at this distance.)
+ */
+ if ((Size) newmemtupsize >= MaxAllocHugeSize / sizeof(SortTuple))
+ {
+ newmemtupsize = (int) (MaxAllocHugeSize / sizeof(SortTuple));
+ state->growmemtuples = false; /* can't grow any more */
+ }
+
+ /*
+ * We need to be sure that we do not cause LACKMEM to become true, else
+ * the space management algorithm will go nuts. The code above should
+ * never generate a dangerous request, but to be safe, check explicitly
+ * that the array growth fits within availMem. (We could still cause
+ * LACKMEM if the memory chunk overhead associated with the memtuples
+ * array were to increase. That shouldn't happen because we chose the
+ * initial array size large enough to ensure that palloc will be treating
+ * both old and new arrays as separate chunks. But we'll check LACKMEM
+ * explicitly below just in case.)
+ */
+ if (state->availMem < (int64) ((newmemtupsize - memtupsize) * sizeof(SortTuple)))
+ goto noalloc;
+
+ /* OK, do it */
+ FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ state->memtupsize = newmemtupsize;
+ state->memtuples = (SortTuple *)
+ repalloc_huge(state->memtuples,
+ state->memtupsize * sizeof(SortTuple));
+ USEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ if (LACKMEM(state))
+ elog(ERROR, "unexpected out-of-memory situation in tuplesort");
+ return true;
+
+noalloc:
+ /* If for any reason we didn't realloc, shut off future attempts */
+ state->growmemtuples = false;
+ return false;
+}
+
+/*
+ * Accept one tuple while collecting input data for sort.
+ *
+ * Note that the input data is always copied; the caller need not save it.
+ */
+void
+tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ /*
+ * Copy the given tuple into memory we control, and decrease availMem.
+ * Then call the common code.
+ */
+ COPYTUP(state, &stup, (void *) slot);
+
+ puttuple_common(state, &stup);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * Accept one tuple while collecting input data for sort.
+ *
+ * Note that the input data is always copied; the caller need not save it.
+ */
+void
+tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ /*
+ * Copy the given tuple into memory we control, and decrease availMem.
+ * Then call the common code.
+ */
+ COPYTUP(state, &stup, (void *) tup);
+
+ puttuple_common(state, &stup);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * Collect one index tuple while collecting input data for sort, building
+ * it from caller-supplied values.
+ */
+void
+tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
+ ItemPointer self, Datum *values,
+ bool *isnull)
+{
+ MemoryContext oldcontext;
+ SortTuple stup;
+ Datum original;
+ IndexTuple tuple;
+
+ stup.tuple = index_form_tuple_context(RelationGetDescr(rel), values,
+ isnull, state->tuplecontext);
+ tuple = ((IndexTuple) stup.tuple);
+ tuple->t_tid = *self;
+ USEMEM(state, GetMemoryChunkSpace(stup.tuple));
+ /* set up first-column key value */
+ original = index_getattr(tuple,
+ 1,
+ RelationGetDescr(state->indexRel),
+ &stup.isnull1);
+
+ oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+ if (!state->sortKeys || !state->sortKeys->abbrev_converter || stup.isnull1)
+ {
+ /*
+ * Store ordinary Datum representation, or NULL value. If there is a
+ * converter it won't expect NULL values, and cost model is not
+ * required to account for NULL, so in that case we avoid calling
+ * converter and just set datum1 to zeroed representation (to be
+ * consistent, and to support cheap inequality tests for NULL
+ * abbreviated keys).
+ */
+ stup.datum1 = original;
+ }
+ else if (!consider_abort_common(state))
+ {
+ /* Store abbreviated key representation */
+ stup.datum1 = state->sortKeys->abbrev_converter(original,
+ state->sortKeys);
+ }
+ else
+ {
+ /* Abort abbreviation */
+ int i;
+
+ stup.datum1 = original;
+
+ /*
+ * Set state to be consistent with never trying abbreviation.
+ *
+ * Alter datum1 representation in already-copied tuples, so as to
+ * ensure a consistent representation (current tuple was just
+ * handled). It does not matter if some dumped tuples are already
+ * sorted on tape, since serialized tuples lack abbreviated keys
+ * (TSS_BUILDRUNS state prevents control reaching here in any case).
+ */
+ for (i = 0; i < state->memtupcount; i++)
+ {
+ SortTuple *mtup = &state->memtuples[i];
+
+ tuple = mtup->tuple;
+ mtup->datum1 = index_getattr(tuple,
+ 1,
+ RelationGetDescr(state->indexRel),
+ &mtup->isnull1);
+ }
+ }
+
+ puttuple_common(state, &stup);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * Accept one Datum while collecting input data for sort.
+ *
+ * If the Datum is pass-by-ref type, the value will be copied.
+ */
+void
+tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->tuplecontext);
+ SortTuple stup;
+
+ /*
+ * Pass-by-value types or null values are just stored directly in
+ * stup.datum1 (and stup.tuple is not used and set to NULL).
+ *
+ * Non-null pass-by-reference values need to be copied into memory we
+ * control, and possibly abbreviated. The copied value is pointed to by
+ * stup.tuple and is treated as the canonical copy (e.g. to return via
+ * tuplesort_getdatum or when writing to tape); stup.datum1 gets the
+ * abbreviated value if abbreviation is happening, otherwise it's
+ * identical to stup.tuple.
+ */
+
+ if (isNull || !state->tuples)
+ {
+ /*
+ * Set datum1 to zeroed representation for NULLs (to be consistent,
+ * and to support cheap inequality tests for NULL abbreviated keys).
+ */
+ stup.datum1 = !isNull ? val : (Datum) 0;
+ stup.isnull1 = isNull;
+ stup.tuple = NULL; /* no separate storage */
+ MemoryContextSwitchTo(state->sortcontext);
+ }
+ else
+ {
+ Datum original = datumCopy(val, false, state->datumTypeLen);
+
+ stup.isnull1 = false;
+ stup.tuple = DatumGetPointer(original);
+ USEMEM(state, GetMemoryChunkSpace(stup.tuple));
+ MemoryContextSwitchTo(state->sortcontext);
+
+ if (!state->sortKeys->abbrev_converter)
+ {
+ stup.datum1 = original;
+ }
+ else if (!consider_abort_common(state))
+ {
+ /* Store abbreviated key representation */
+ stup.datum1 = state->sortKeys->abbrev_converter(original,
+ state->sortKeys);
+ }
+ else
+ {
+ /* Abort abbreviation */
+ int i;
+
+ stup.datum1 = original;
+
+ /*
+ * Set state to be consistent with never trying abbreviation.
+ *
+ * Alter datum1 representation in already-copied tuples, so as to
+ * ensure a consistent representation (current tuple was just
+ * handled). It does not matter if some dumped tuples are already
+ * sorted on tape, since serialized tuples lack abbreviated keys
+ * (TSS_BUILDRUNS state prevents control reaching here in any
+ * case).
+ */
+ for (i = 0; i < state->memtupcount; i++)
+ {
+ SortTuple *mtup = &state->memtuples[i];
+
+ mtup->datum1 = PointerGetDatum(mtup->tuple);
+ }
+ }
+ }
+
+ puttuple_common(state, &stup);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * Shared code for tuple and datum cases.
+ */
+static void
+puttuple_common(Tuplesortstate *state, SortTuple *tuple)
+{
+ Assert(!LEADER(state));
+
+ switch (state->status)
+ {
+ case TSS_INITIAL:
+
+ /*
+ * Save the tuple into the unsorted array. First, grow the array
+ * as needed. Note that we try to grow the array when there is
+ * still one free slot remaining --- if we fail, there'll still be
+ * room to store the incoming tuple, and then we'll switch to
+ * tape-based operation.
+ */
+ if (state->memtupcount >= state->memtupsize - 1)
+ {
+ (void) grow_memtuples(state);
+ Assert(state->memtupcount < state->memtupsize);
+ }
+ state->memtuples[state->memtupcount++] = *tuple;
+
+ /*
+ * Check if it's time to switch over to a bounded heapsort. We do
+ * so if the input tuple count exceeds twice the desired tuple
+ * count (this is a heuristic for where heapsort becomes cheaper
+ * than a quicksort), or if we've just filled workMem and have
+ * enough tuples to meet the bound.
+ *
+ * Note that once we enter TSS_BOUNDED state we will always try to
+ * complete the sort that way. In the worst case, if later input
+ * tuples are larger than earlier ones, this might cause us to
+ * exceed workMem significantly.
+ */
+ if (state->bounded &&
+ (state->memtupcount > state->bound * 2 ||
+ (state->memtupcount > state->bound && LACKMEM(state))))
+ {
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "switching to bounded heapsort at %d tuples: %s",
+ state->memtupcount,
+ pg_rusage_show(&state->ru_start));
+#endif
+ make_bounded_heap(state);
+ return;
+ }
+
+ /*
+ * Done if we still fit in available memory and have array slots.
+ */
+ if (state->memtupcount < state->memtupsize && !LACKMEM(state))
+ return;
+
+ /*
+ * Nope; time to switch to tape-based operation.
+ */
+ inittapes(state, true);
+
+ /*
+ * Dump all tuples.
+ */
+ dumptuples(state, false);
+ break;
+
+ case TSS_BOUNDED:
+
+ /*
+ * We don't want to grow the array here, so check whether the new
+ * tuple can be discarded before putting it in. This should be a
+ * good speed optimization, too, since when there are many more
+ * input tuples than the bound, most input tuples can be discarded
+ * with just this one comparison. Note that because we currently
+ * have the sort direction reversed, we must check for <= not >=.
+ */
+ if (COMPARETUP(state, tuple, &state->memtuples[0]) <= 0)
+ {
+ /* new tuple <= top of the heap, so we can discard it */
+ free_sort_tuple(state, tuple);
+ CHECK_FOR_INTERRUPTS();
+ }
+ else
+ {
+ /* discard top of heap, replacing it with the new tuple */
+ free_sort_tuple(state, &state->memtuples[0]);
+ tuplesort_heap_replace_top(state, tuple);
+ }
+ break;
+
+ case TSS_BUILDRUNS:
+
+ /*
+ * Save the tuple into the unsorted array (there must be space)
+ */
+ state->memtuples[state->memtupcount++] = *tuple;
+
+ /*
+ * If we are over the memory limit, dump all tuples.
+ */
+ dumptuples(state, false);
+ break;
+
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ break;
+ }
+}
+
+static bool
+consider_abort_common(Tuplesortstate *state)
+{
+ Assert(state->sortKeys[0].abbrev_converter != NULL);
+ Assert(state->sortKeys[0].abbrev_abort != NULL);
+ Assert(state->sortKeys[0].abbrev_full_comparator != NULL);
+
+ /*
+ * Check effectiveness of abbreviation optimization. Consider aborting
+ * when still within memory limit.
+ */
+ if (state->status == TSS_INITIAL &&
+ state->memtupcount >= state->abbrevNext)
+ {
+ state->abbrevNext *= 2;
+
+ /*
+ * Check opclass-supplied abbreviation abort routine. It may indicate
+ * that abbreviation should not proceed.
+ */
+ if (!state->sortKeys->abbrev_abort(state->memtupcount,
+ state->sortKeys))
+ return false;
+
+ /*
+ * Finally, restore authoritative comparator, and indicate that
+ * abbreviation is not in play by setting abbrev_converter to NULL
+ */
+ state->sortKeys[0].comparator = state->sortKeys[0].abbrev_full_comparator;
+ state->sortKeys[0].abbrev_converter = NULL;
+ /* Not strictly necessary, but be tidy */
+ state->sortKeys[0].abbrev_abort = NULL;
+ state->sortKeys[0].abbrev_full_comparator = NULL;
+
+ /* Give up - expect original pass-by-value representation */
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * All tuples have been provided; finish the sort.
+ */
+void
+tuplesort_performsort(Tuplesortstate *state)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "performsort of worker %d starting: %s",
+ state->worker, pg_rusage_show(&state->ru_start));
+#endif
+
+ switch (state->status)
+ {
+ case TSS_INITIAL:
+
+ /*
+ * We were able to accumulate all the tuples within the allowed
+ * amount of memory, or leader to take over worker tapes
+ */
+ if (SERIAL(state))
+ {
+ /* Just qsort 'em and we're done */
+ tuplesort_sort_memtuples(state);
+ state->status = TSS_SORTEDINMEM;
+ }
+ else if (WORKER(state))
+ {
+ /*
+ * Parallel workers must still dump out tuples to tape. No
+ * merge is required to produce single output run, though.
+ */
+ inittapes(state, false);
+ dumptuples(state, true);
+ worker_nomergeruns(state);
+ state->status = TSS_SORTEDONTAPE;
+ }
+ else
+ {
+ /*
+ * Leader will take over worker tapes and merge worker runs.
+ * Note that mergeruns sets the correct state->status.
+ */
+ leader_takeover_tapes(state);
+ mergeruns(state);
+ }
+ state->current = 0;
+ state->eof_reached = false;
+ state->markpos_block = 0L;
+ state->markpos_offset = 0;
+ state->markpos_eof = false;
+ break;
+
+ case TSS_BOUNDED:
+
+ /*
+ * We were able to accumulate all the tuples required for output
+ * in memory, using a heap to eliminate excess tuples. Now we
+ * have to transform the heap to a properly-sorted array.
+ */
+ sort_bounded_heap(state);
+ state->current = 0;
+ state->eof_reached = false;
+ state->markpos_offset = 0;
+ state->markpos_eof = false;
+ state->status = TSS_SORTEDINMEM;
+ break;
+
+ case TSS_BUILDRUNS:
+
+ /*
+ * Finish tape-based sort. First, flush all tuples remaining in
+ * memory out to tape; then merge until we have a single remaining
+ * run (or, if !randomAccess and !WORKER(), one run per tape).
+ * Note that mergeruns sets the correct state->status.
+ */
+ dumptuples(state, true);
+ mergeruns(state);
+ state->eof_reached = false;
+ state->markpos_block = 0L;
+ state->markpos_offset = 0;
+ state->markpos_eof = false;
+ break;
+
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ break;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ {
+ if (state->status == TSS_FINALMERGE)
+ elog(LOG, "performsort of worker %d done (except %d-way final merge): %s",
+ state->worker, state->nInputTapes,
+ pg_rusage_show(&state->ru_start));
+ else
+ elog(LOG, "performsort of worker %d done: %s",
+ state->worker, pg_rusage_show(&state->ru_start));
+ }
+#endif
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * Internal routine to fetch the next tuple in either forward or back
+ * direction into *stup. Returns false if no more tuples.
+ * Returned tuple belongs to tuplesort memory context, and must not be freed
+ * by caller. Note that fetched tuple is stored in memory that may be
+ * recycled by any future fetch.
+ */
+static bool
+tuplesort_gettuple_common(Tuplesortstate *state, bool forward,
+ SortTuple *stup)
+{
+ unsigned int tuplen;
+ size_t nmoved;
+
+ Assert(!WORKER(state));
+
+ switch (state->status)
+ {
+ case TSS_SORTEDINMEM:
+ Assert(forward || state->sortopt & TUPLESORT_RANDOMACCESS);
+ Assert(!state->slabAllocatorUsed);
+ if (forward)
+ {
+ if (state->current < state->memtupcount)
+ {
+ *stup = state->memtuples[state->current++];
+ return true;
+ }
+ state->eof_reached = true;
+
+ /*
+ * Complain if caller tries to retrieve more tuples than
+ * originally asked for in a bounded sort. This is because
+ * returning EOF here might be the wrong thing.
+ */
+ if (state->bounded && state->current >= state->bound)
+ elog(ERROR, "retrieved too many tuples in a bounded sort");
+
+ return false;
+ }
+ else
+ {
+ if (state->current <= 0)
+ return false;
+
+ /*
+ * if all tuples are fetched already then we return last
+ * tuple, else - tuple before last returned.
+ */
+ if (state->eof_reached)
+ state->eof_reached = false;
+ else
+ {
+ state->current--; /* last returned tuple */
+ if (state->current <= 0)
+ return false;
+ }
+ *stup = state->memtuples[state->current - 1];
+ return true;
+ }
+ break;
+
+ case TSS_SORTEDONTAPE:
+ Assert(forward || state->sortopt & TUPLESORT_RANDOMACCESS);
+ Assert(state->slabAllocatorUsed);
+
+ /*
+ * The slot that held the tuple that we returned in previous
+ * gettuple call can now be reused.
+ */
+ if (state->lastReturnedTuple)
+ {
+ RELEASE_SLAB_SLOT(state, state->lastReturnedTuple);
+ state->lastReturnedTuple = NULL;
+ }
+
+ if (forward)
+ {
+ if (state->eof_reached)
+ return false;
+
+ if ((tuplen = getlen(state->result_tape, true)) != 0)
+ {
+ READTUP(state, stup, state->result_tape, tuplen);
+
+ /*
+ * Remember the tuple we return, so that we can recycle
+ * its memory on next call. (This can be NULL, in the
+ * !state->tuples case).
+ */
+ state->lastReturnedTuple = stup->tuple;
+
+ return true;
+ }
+ else
+ {
+ state->eof_reached = true;
+ return false;
+ }
+ }
+
+ /*
+ * Backward.
+ *
+ * if all tuples are fetched already then we return last tuple,
+ * else - tuple before last returned.
+ */
+ if (state->eof_reached)
+ {
+ /*
+ * Seek position is pointing just past the zero tuplen at the
+ * end of file; back up to fetch last tuple's ending length
+ * word. If seek fails we must have a completely empty file.
+ */
+ nmoved = LogicalTapeBackspace(state->result_tape,
+ 2 * sizeof(unsigned int));
+ if (nmoved == 0)
+ return false;
+ else if (nmoved != 2 * sizeof(unsigned int))
+ elog(ERROR, "unexpected tape position");
+ state->eof_reached = false;
+ }
+ else
+ {
+ /*
+ * Back up and fetch previously-returned tuple's ending length
+ * word. If seek fails, assume we are at start of file.
+ */
+ nmoved = LogicalTapeBackspace(state->result_tape,
+ sizeof(unsigned int));
+ if (nmoved == 0)
+ return false;
+ else if (nmoved != sizeof(unsigned int))
+ elog(ERROR, "unexpected tape position");
+ tuplen = getlen(state->result_tape, false);
+
+ /*
+ * Back up to get ending length word of tuple before it.
+ */
+ nmoved = LogicalTapeBackspace(state->result_tape,
+ tuplen + 2 * sizeof(unsigned int));
+ if (nmoved == tuplen + sizeof(unsigned int))
+ {
+ /*
+ * We backed up over the previous tuple, but there was no
+ * ending length word before it. That means that the prev
+ * tuple is the first tuple in the file. It is now the
+ * next to read in forward direction (not obviously right,
+ * but that is what in-memory case does).
+ */
+ return false;
+ }
+ else if (nmoved != tuplen + 2 * sizeof(unsigned int))
+ elog(ERROR, "bogus tuple length in backward scan");
+ }
+
+ tuplen = getlen(state->result_tape, false);
+
+ /*
+ * Now we have the length of the prior tuple, back up and read it.
+ * Note: READTUP expects we are positioned after the initial
+ * length word of the tuple, so back up to that point.
+ */
+ nmoved = LogicalTapeBackspace(state->result_tape,
+ tuplen);
+ if (nmoved != tuplen)
+ elog(ERROR, "bogus tuple length in backward scan");
+ READTUP(state, stup, state->result_tape, tuplen);
+
+ /*
+ * Remember the tuple we return, so that we can recycle its memory
+ * on next call. (This can be NULL, in the Datum case).
+ */
+ state->lastReturnedTuple = stup->tuple;
+
+ return true;
+
+ case TSS_FINALMERGE:
+ Assert(forward);
+ /* We are managing memory ourselves, with the slab allocator. */
+ Assert(state->slabAllocatorUsed);
+
+ /*
+ * The slab slot holding the tuple that we returned in previous
+ * gettuple call can now be reused.
+ */
+ if (state->lastReturnedTuple)
+ {
+ RELEASE_SLAB_SLOT(state, state->lastReturnedTuple);
+ state->lastReturnedTuple = NULL;
+ }
+
+ /*
+ * This code should match the inner loop of mergeonerun().
+ */
+ if (state->memtupcount > 0)
+ {
+ int srcTapeIndex = state->memtuples[0].srctape;
+ LogicalTape *srcTape = state->inputTapes[srcTapeIndex];
+ SortTuple newtup;
+
+ *stup = state->memtuples[0];
+
+ /*
+ * Remember the tuple we return, so that we can recycle its
+ * memory on next call. (This can be NULL, in the Datum case).
+ */
+ state->lastReturnedTuple = stup->tuple;
+
+ /*
+ * Pull next tuple from tape, and replace the returned tuple
+ * at top of the heap with it.
+ */
+ if (!mergereadnext(state, srcTape, &newtup))
+ {
+ /*
+ * If no more data, we've reached end of run on this tape.
+ * Remove the top node from the heap.
+ */
+ tuplesort_heap_delete_top(state);
+ state->nInputRuns--;
+
+ /*
+ * Close the tape. It'd go away at the end of the sort
+ * anyway, but better to release the memory early.
+ */
+ LogicalTapeClose(srcTape);
+ return true;
+ }
+ newtup.srctape = srcTapeIndex;
+ tuplesort_heap_replace_top(state, &newtup);
+ return true;
+ }
+ return false;
+
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * Fetch the next tuple in either forward or back direction.
+ * If successful, put tuple in slot and return true; else, clear the slot
+ * and return false.
+ *
+ * Caller may optionally be passed back abbreviated value (on true return
+ * value) when abbreviation was used, which can be used to cheaply avoid
+ * equality checks that might otherwise be required. Caller can safely make a
+ * determination of "non-equal tuple" based on simple binary inequality. A
+ * NULL value in leading attribute will set abbreviated value to zeroed
+ * representation, which caller may rely on in abbreviated inequality check.
+ *
+ * If copy is true, the slot receives a tuple that's been copied into the
+ * caller's memory context, so that it will stay valid regardless of future
+ * manipulations of the tuplesort's state (up to and including deleting the
+ * tuplesort). If copy is false, the slot will just receive a pointer to a
+ * tuple held within the tuplesort, which is more efficient, but only safe for
+ * callers that are prepared to have any subsequent manipulation of the
+ * tuplesort's state invalidate slot contents.
+ */
+bool
+tuplesort_gettupleslot(Tuplesortstate *state, bool forward, bool copy,
+ TupleTableSlot *slot, Datum *abbrev)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ if (!tuplesort_gettuple_common(state, forward, &stup))
+ stup.tuple = NULL;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ if (stup.tuple)
+ {
+ /* Record abbreviated key for caller */
+ if (state->sortKeys->abbrev_converter && abbrev)
+ *abbrev = stup.datum1;
+
+ if (copy)
+ stup.tuple = heap_copy_minimal_tuple((MinimalTuple) stup.tuple);
+
+ ExecStoreMinimalTuple((MinimalTuple) stup.tuple, slot, copy);
+ return true;
+ }
+ else
+ {
+ ExecClearTuple(slot);
+ return false;
+ }
+}
+
+/*
+ * Fetch the next tuple in either forward or back direction.
+ * Returns NULL if no more tuples. Returned tuple belongs to tuplesort memory
+ * context, and must not be freed by caller. Caller may not rely on tuple
+ * remaining valid after any further manipulation of tuplesort.
+ */
+HeapTuple
+tuplesort_getheaptuple(Tuplesortstate *state, bool forward)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ if (!tuplesort_gettuple_common(state, forward, &stup))
+ stup.tuple = NULL;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return stup.tuple;
+}
+
+/*
+ * Fetch the next index tuple in either forward or back direction.
+ * Returns NULL if no more tuples. Returned tuple belongs to tuplesort memory
+ * context, and must not be freed by caller. Caller may not rely on tuple
+ * remaining valid after any further manipulation of tuplesort.
+ */
+IndexTuple
+tuplesort_getindextuple(Tuplesortstate *state, bool forward)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ if (!tuplesort_gettuple_common(state, forward, &stup))
+ stup.tuple = NULL;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ return (IndexTuple) stup.tuple;
+}
+
+/*
+ * Fetch the next Datum in either forward or back direction.
+ * Returns false if no more datums.
+ *
+ * If the Datum is pass-by-ref type, the returned value is freshly palloc'd
+ * in caller's context, and is now owned by the caller (this differs from
+ * similar routines for other types of tuplesorts).
+ *
+ * Caller may optionally be passed back abbreviated value (on true return
+ * value) when abbreviation was used, which can be used to cheaply avoid
+ * equality checks that might otherwise be required. Caller can safely make a
+ * determination of "non-equal tuple" based on simple binary inequality. A
+ * NULL value will have a zeroed abbreviated value representation, which caller
+ * may rely on in abbreviated inequality check.
+ */
+bool
+tuplesort_getdatum(Tuplesortstate *state, bool forward,
+ Datum *val, bool *isNull, Datum *abbrev)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ SortTuple stup;
+
+ if (!tuplesort_gettuple_common(state, forward, &stup))
+ {
+ MemoryContextSwitchTo(oldcontext);
+ return false;
+ }
+
+ /* Ensure we copy into caller's memory context */
+ MemoryContextSwitchTo(oldcontext);
+
+ /* Record abbreviated key for caller */
+ if (state->sortKeys->abbrev_converter && abbrev)
+ *abbrev = stup.datum1;
+
+ if (stup.isnull1 || !state->tuples)
+ {
+ *val = stup.datum1;
+ *isNull = stup.isnull1;
+ }
+ else
+ {
+ /* use stup.tuple because stup.datum1 may be an abbreviation */
+ *val = datumCopy(PointerGetDatum(stup.tuple), false, state->datumTypeLen);
+ *isNull = false;
+ }
+
+ return true;
+}
+
+/*
+ * Advance over N tuples in either forward or back direction,
+ * without returning any data. N==0 is a no-op.
+ * Returns true if successful, false if ran out of tuples.
+ */
+bool
+tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples, bool forward)
+{
+ MemoryContext oldcontext;
+
+ /*
+ * We don't actually support backwards skip yet, because no callers need
+ * it. The API is designed to allow for that later, though.
+ */
+ Assert(forward);
+ Assert(ntuples >= 0);
+ Assert(!WORKER(state));
+
+ switch (state->status)
+ {
+ case TSS_SORTEDINMEM:
+ if (state->memtupcount - state->current >= ntuples)
+ {
+ state->current += ntuples;
+ return true;
+ }
+ state->current = state->memtupcount;
+ state->eof_reached = true;
+
+ /*
+ * Complain if caller tries to retrieve more tuples than
+ * originally asked for in a bounded sort. This is because
+ * returning EOF here might be the wrong thing.
+ */
+ if (state->bounded && state->current >= state->bound)
+ elog(ERROR, "retrieved too many tuples in a bounded sort");
+
+ return false;
+
+ case TSS_SORTEDONTAPE:
+ case TSS_FINALMERGE:
+
+ /*
+ * We could probably optimize these cases better, but for now it's
+ * not worth the trouble.
+ */
+ oldcontext = MemoryContextSwitchTo(state->sortcontext);
+ while (ntuples-- > 0)
+ {
+ SortTuple stup;
+
+ if (!tuplesort_gettuple_common(state, forward, &stup))
+ {
+ MemoryContextSwitchTo(oldcontext);
+ return false;
+ }
+ CHECK_FOR_INTERRUPTS();
+ }
+ MemoryContextSwitchTo(oldcontext);
+ return true;
+
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ return false; /* keep compiler quiet */
+ }
+}
+
+/*
+ * tuplesort_merge_order - report merge order we'll use for given memory
+ * (note: "merge order" just means the number of input tapes in the merge).
+ *
+ * This is exported for use by the planner. allowedMem is in bytes.
+ */
+int
+tuplesort_merge_order(int64 allowedMem)
+{
+ int mOrder;
+
+ /*----------
+ * In the merge phase, we need buffer space for each input and output tape.
+ * Each pass in the balanced merge algorithm reads from M input tapes, and
+ * writes to N output tapes. Each tape consumes TAPE_BUFFER_OVERHEAD bytes
+ * of memory. In addition to that, we want MERGE_BUFFER_SIZE workspace per
+ * input tape.
+ *
+ * totalMem = M * (TAPE_BUFFER_OVERHEAD + MERGE_BUFFER_SIZE) +
+ * N * TAPE_BUFFER_OVERHEAD
+ *
+ * Except for the last and next-to-last merge passes, where there can be
+ * fewer tapes left to process, M = N. We choose M so that we have the
+ * desired amount of memory available for the input buffers
+ * (TAPE_BUFFER_OVERHEAD + MERGE_BUFFER_SIZE), given the total memory
+ * available for the tape buffers (allowedMem).
+ *
+ * Note: you might be thinking we need to account for the memtuples[]
+ * array in this calculation, but we effectively treat that as part of the
+ * MERGE_BUFFER_SIZE workspace.
+ *----------
+ */
+ mOrder = allowedMem /
+ (2 * TAPE_BUFFER_OVERHEAD + MERGE_BUFFER_SIZE);
+
+ /*
+ * Even in minimum memory, use at least a MINORDER merge. On the other
+ * hand, even when we have lots of memory, do not use more than a MAXORDER
+ * merge. Tapes are pretty cheap, but they're not entirely free. Each
+ * additional tape reduces the amount of memory available to build runs,
+ * which in turn can cause the same sort to need more runs, which makes
+ * merging slower even if it can still be done in a single pass. Also,
+ * high order merges are quite slow due to CPU cache effects; it can be
+ * faster to pay the I/O cost of a multi-pass merge than to perform a
+ * single merge pass across many hundreds of tapes.
+ */
+ mOrder = Max(mOrder, MINORDER);
+ mOrder = Min(mOrder, MAXORDER);
+
+ return mOrder;
+}
+
+/*
+ * Helper function to calculate how much memory to allocate for the read buffer
+ * of each input tape in a merge pass.
+ *
+ * 'avail_mem' is the amount of memory available for the buffers of all the
+ * tapes, both input and output.
+ * 'nInputTapes' and 'nInputRuns' are the number of input tapes and runs.
+ * 'maxOutputTapes' is the max. number of output tapes we should produce.
+ */
+static int64
+merge_read_buffer_size(int64 avail_mem, int nInputTapes, int nInputRuns,
+ int maxOutputTapes)
+{
+ int nOutputRuns;
+ int nOutputTapes;
+
+ /*
+ * How many output tapes will we produce in this pass?
+ *
+ * This is nInputRuns / nInputTapes, rounded up.
+ */
+ nOutputRuns = (nInputRuns + nInputTapes - 1) / nInputTapes;
+
+ nOutputTapes = Min(nOutputRuns, maxOutputTapes);
+
+ /*
+ * Each output tape consumes TAPE_BUFFER_OVERHEAD bytes of memory. All
+ * remaining memory is divided evenly between the input tapes.
+ *
+ * This also follows from the formula in tuplesort_merge_order, but here
+ * we derive the input buffer size from the amount of memory available,
+ * and M and N.
+ */
+ return Max((avail_mem - TAPE_BUFFER_OVERHEAD * nOutputTapes) / nInputTapes, 0);
+}
+
+/*
+ * inittapes - initialize for tape sorting.
+ *
+ * This is called only if we have found we won't sort in memory.
+ */
+static void
+inittapes(Tuplesortstate *state, bool mergeruns)
+{
+ Assert(!LEADER(state));
+
+ if (mergeruns)
+ {
+ /* Compute number of input tapes to use when merging */
+ state->maxTapes = tuplesort_merge_order(state->allowedMem);
+ }
+ else
+ {
+ /* Workers can sometimes produce single run, output without merge */
+ Assert(WORKER(state));
+ state->maxTapes = MINORDER;
+ }
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "worker %d switching to external sort with %d tapes: %s",
+ state->worker, state->maxTapes, pg_rusage_show(&state->ru_start));
+#endif
+
+ /* Create the tape set */
+ inittapestate(state, state->maxTapes);
+ state->tapeset =
+ LogicalTapeSetCreate(false,
+ state->shared ? &state->shared->fileset : NULL,
+ state->worker);
+
+ state->currentRun = 0;
+
+ /*
+ * Initialize logical tape arrays.
+ */
+ state->inputTapes = NULL;
+ state->nInputTapes = 0;
+ state->nInputRuns = 0;
+
+ state->outputTapes = palloc0(state->maxTapes * sizeof(LogicalTape *));
+ state->nOutputTapes = 0;
+ state->nOutputRuns = 0;
+
+ state->status = TSS_BUILDRUNS;
+
+ selectnewtape(state);
+}
+
+/*
+ * inittapestate - initialize generic tape management state
+ */
+static void
+inittapestate(Tuplesortstate *state, int maxTapes)
+{
+ int64 tapeSpace;
+
+ /*
+ * Decrease availMem to reflect the space needed for tape buffers; but
+ * don't decrease it to the point that we have no room for tuples. (That
+ * case is only likely to occur if sorting pass-by-value Datums; in all
+ * other scenarios the memtuples[] array is unlikely to occupy more than
+ * half of allowedMem. In the pass-by-value case it's not important to
+ * account for tuple space, so we don't care if LACKMEM becomes
+ * inaccurate.)
+ */
+ tapeSpace = (int64) maxTapes * TAPE_BUFFER_OVERHEAD;
+
+ if (tapeSpace + GetMemoryChunkSpace(state->memtuples) < state->allowedMem)
+ USEMEM(state, tapeSpace);
+
+ /*
+ * Make sure that the temp file(s) underlying the tape set are created in
+ * suitable temp tablespaces. For parallel sorts, this should have been
+ * called already, but it doesn't matter if it is called a second time.
+ */
+ PrepareTempTablespaces();
+}
+
+/*
+ * selectnewtape -- select next tape to output to.
+ *
+ * This is called after finishing a run when we know another run
+ * must be started. This is used both when building the initial
+ * runs, and during merge passes.
+ */
+static void
+selectnewtape(Tuplesortstate *state)
+{
+ /*
+ * At the beginning of each merge pass, nOutputTapes and nOutputRuns are
+ * both zero. On each call, we create a new output tape to hold the next
+ * run, until maxTapes is reached. After that, we assign new runs to the
+ * existing tapes in a round robin fashion.
+ */
+ if (state->nOutputTapes < state->maxTapes)
+ {
+ /* Create a new tape to hold the next run */
+ Assert(state->outputTapes[state->nOutputRuns] == NULL);
+ Assert(state->nOutputRuns == state->nOutputTapes);
+ state->destTape = LogicalTapeCreate(state->tapeset);
+ state->outputTapes[state->nOutputTapes] = state->destTape;
+ state->nOutputTapes++;
+ state->nOutputRuns++;
+ }
+ else
+ {
+ /*
+ * We have reached the max number of tapes. Append to an existing
+ * tape.
+ */
+ state->destTape = state->outputTapes[state->nOutputRuns % state->nOutputTapes];
+ state->nOutputRuns++;
+ }
+}
+
+/*
+ * Initialize the slab allocation arena, for the given number of slots.
+ */
+static void
+init_slab_allocator(Tuplesortstate *state, int numSlots)
+{
+ if (numSlots > 0)
+ {
+ char *p;
+ int i;
+
+ state->slabMemoryBegin = palloc(numSlots * SLAB_SLOT_SIZE);
+ state->slabMemoryEnd = state->slabMemoryBegin +
+ numSlots * SLAB_SLOT_SIZE;
+ state->slabFreeHead = (SlabSlot *) state->slabMemoryBegin;
+ USEMEM(state, numSlots * SLAB_SLOT_SIZE);
+
+ p = state->slabMemoryBegin;
+ for (i = 0; i < numSlots - 1; i++)
+ {
+ ((SlabSlot *) p)->nextfree = (SlabSlot *) (p + SLAB_SLOT_SIZE);
+ p += SLAB_SLOT_SIZE;
+ }
+ ((SlabSlot *) p)->nextfree = NULL;
+ }
+ else
+ {
+ state->slabMemoryBegin = state->slabMemoryEnd = NULL;
+ state->slabFreeHead = NULL;
+ }
+ state->slabAllocatorUsed = true;
+}
+
+/*
+ * mergeruns -- merge all the completed initial runs.
+ *
+ * This implements the Balanced k-Way Merge Algorithm. All input data has
+ * already been written to initial runs on tape (see dumptuples).
+ */
+static void
+mergeruns(Tuplesortstate *state)
+{
+ int tapenum;
+
+ Assert(state->status == TSS_BUILDRUNS);
+ Assert(state->memtupcount == 0);
+
+ if (state->sortKeys != NULL && state->sortKeys->abbrev_converter != NULL)
+ {
+ /*
+ * If there are multiple runs to be merged, when we go to read back
+ * tuples from disk, abbreviated keys will not have been stored, and
+ * we don't care to regenerate them. Disable abbreviation from this
+ * point on.
+ */
+ state->sortKeys->abbrev_converter = NULL;
+ state->sortKeys->comparator = state->sortKeys->abbrev_full_comparator;
+
+ /* Not strictly necessary, but be tidy */
+ state->sortKeys->abbrev_abort = NULL;
+ state->sortKeys->abbrev_full_comparator = NULL;
+ }
+
+ /*
+ * Reset tuple memory. We've freed all the tuples that we previously
+ * allocated. We will use the slab allocator from now on.
+ */
+ MemoryContextResetOnly(state->tuplecontext);
+
+ /*
+ * We no longer need a large memtuples array. (We will allocate a smaller
+ * one for the heap later.)
+ */
+ FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ pfree(state->memtuples);
+ state->memtuples = NULL;
+
+ /*
+ * Initialize the slab allocator. We need one slab slot per input tape,
+ * for the tuples in the heap, plus one to hold the tuple last returned
+ * from tuplesort_gettuple. (If we're sorting pass-by-val Datums,
+ * however, we don't need to do allocate anything.)
+ *
+ * In a multi-pass merge, we could shrink this allocation for the last
+ * merge pass, if it has fewer tapes than previous passes, but we don't
+ * bother.
+ *
+ * From this point on, we no longer use the USEMEM()/LACKMEM() mechanism
+ * to track memory usage of individual tuples.
+ */
+ if (state->tuples)
+ init_slab_allocator(state, state->nOutputTapes + 1);
+ else
+ init_slab_allocator(state, 0);
+
+ /*
+ * Allocate a new 'memtuples' array, for the heap. It will hold one tuple
+ * from each input tape.
+ *
+ * We could shrink this, too, between passes in a multi-pass merge, but we
+ * don't bother. (The initial input tapes are still in outputTapes. The
+ * number of input tapes will not increase between passes.)
+ */
+ state->memtupsize = state->nOutputTapes;
+ state->memtuples = (SortTuple *) MemoryContextAlloc(state->maincontext,
+ state->nOutputTapes * sizeof(SortTuple));
+ USEMEM(state, GetMemoryChunkSpace(state->memtuples));
+
+ /*
+ * Use all the remaining memory we have available for tape buffers among
+ * all the input tapes. At the beginning of each merge pass, we will
+ * divide this memory between the input and output tapes in the pass.
+ */
+ state->tape_buffer_mem = state->availMem;
+ USEMEM(state, state->tape_buffer_mem);
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "worker %d using %zu KB of memory for tape buffers",
+ state->worker, state->tape_buffer_mem / 1024);
+#endif
+
+ for (;;)
+ {
+ /*
+ * On the first iteration, or if we have read all the runs from the
+ * input tapes in a multi-pass merge, it's time to start a new pass.
+ * Rewind all the output tapes, and make them inputs for the next
+ * pass.
+ */
+ if (state->nInputRuns == 0)
+ {
+ int64 input_buffer_size;
+
+ /* Close the old, emptied, input tapes */
+ if (state->nInputTapes > 0)
+ {
+ for (tapenum = 0; tapenum < state->nInputTapes; tapenum++)
+ LogicalTapeClose(state->inputTapes[tapenum]);
+ pfree(state->inputTapes);
+ }
+
+ /* Previous pass's outputs become next pass's inputs. */
+ state->inputTapes = state->outputTapes;
+ state->nInputTapes = state->nOutputTapes;
+ state->nInputRuns = state->nOutputRuns;
+
+ /*
+ * Reset output tape variables. The actual LogicalTapes will be
+ * created as needed, here we only allocate the array to hold
+ * them.
+ */
+ state->outputTapes = palloc0(state->nInputTapes * sizeof(LogicalTape *));
+ state->nOutputTapes = 0;
+ state->nOutputRuns = 0;
+
+ /*
+ * Redistribute the memory allocated for tape buffers, among the
+ * new input and output tapes.
+ */
+ input_buffer_size = merge_read_buffer_size(state->tape_buffer_mem,
+ state->nInputTapes,
+ state->nInputRuns,
+ state->maxTapes);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "starting merge pass of %d input runs on %d tapes, " INT64_FORMAT " KB of memory for each input tape: %s",
+ state->nInputRuns, state->nInputTapes, input_buffer_size / 1024,
+ pg_rusage_show(&state->ru_start));
+#endif
+
+ /* Prepare the new input tapes for merge pass. */
+ for (tapenum = 0; tapenum < state->nInputTapes; tapenum++)
+ LogicalTapeRewindForRead(state->inputTapes[tapenum], input_buffer_size);
+
+ /*
+ * If there's just one run left on each input tape, then only one
+ * merge pass remains. If we don't have to produce a materialized
+ * sorted tape, we can stop at this point and do the final merge
+ * on-the-fly.
+ */
+ if ((state->sortopt & TUPLESORT_RANDOMACCESS) == 0
+ && state->nInputRuns <= state->nInputTapes
+ && !WORKER(state))
+ {
+ /* Tell logtape.c we won't be writing anymore */
+ LogicalTapeSetForgetFreeSpace(state->tapeset);
+ /* Initialize for the final merge pass */
+ beginmerge(state);
+ state->status = TSS_FINALMERGE;
+ return;
+ }
+ }
+
+ /* Select an output tape */
+ selectnewtape(state);
+
+ /* Merge one run from each input tape. */
+ mergeonerun(state);
+
+ /*
+ * If the input tapes are empty, and we output only one output run,
+ * we're done. The current output tape contains the final result.
+ */
+ if (state->nInputRuns == 0 && state->nOutputRuns <= 1)
+ break;
+ }
+
+ /*
+ * Done. The result is on a single run on a single tape.
+ */
+ state->result_tape = state->outputTapes[0];
+ if (!WORKER(state))
+ LogicalTapeFreeze(state->result_tape, NULL);
+ else
+ worker_freeze_result_tape(state);
+ state->status = TSS_SORTEDONTAPE;
+
+ /* Close all the now-empty input tapes, to release their read buffers. */
+ for (tapenum = 0; tapenum < state->nInputTapes; tapenum++)
+ LogicalTapeClose(state->inputTapes[tapenum]);
+}
+
+/*
+ * Merge one run from each input tape.
+ */
+static void
+mergeonerun(Tuplesortstate *state)
+{
+ int srcTapeIndex;
+ LogicalTape *srcTape;
+
+ /*
+ * Start the merge by loading one tuple from each active source tape into
+ * the heap.
+ */
+ beginmerge(state);
+
+ /*
+ * Execute merge by repeatedly extracting lowest tuple in heap, writing it
+ * out, and replacing it with next tuple from same tape (if there is
+ * another one).
+ */
+ while (state->memtupcount > 0)
+ {
+ SortTuple stup;
+
+ /* write the tuple to destTape */
+ srcTapeIndex = state->memtuples[0].srctape;
+ srcTape = state->inputTapes[srcTapeIndex];
+ WRITETUP(state, state->destTape, &state->memtuples[0]);
+
+ /* recycle the slot of the tuple we just wrote out, for the next read */
+ if (state->memtuples[0].tuple)
+ RELEASE_SLAB_SLOT(state, state->memtuples[0].tuple);
+
+ /*
+ * pull next tuple from the tape, and replace the written-out tuple in
+ * the heap with it.
+ */
+ if (mergereadnext(state, srcTape, &stup))
+ {
+ stup.srctape = srcTapeIndex;
+ tuplesort_heap_replace_top(state, &stup);
+ }
+ else
+ {
+ tuplesort_heap_delete_top(state);
+ state->nInputRuns--;
+ }
+ }
+
+ /*
+ * When the heap empties, we're done. Write an end-of-run marker on the
+ * output tape.
+ */
+ markrunend(state->destTape);
+}
+
+/*
+ * beginmerge - initialize for a merge pass
+ *
+ * Fill the merge heap with the first tuple from each input tape.
+ */
+static void
+beginmerge(Tuplesortstate *state)
+{
+ int activeTapes;
+ int srcTapeIndex;
+
+ /* Heap should be empty here */
+ Assert(state->memtupcount == 0);
+
+ activeTapes = Min(state->nInputTapes, state->nInputRuns);
+
+ for (srcTapeIndex = 0; srcTapeIndex < activeTapes; srcTapeIndex++)
+ {
+ SortTuple tup;
+
+ if (mergereadnext(state, state->inputTapes[srcTapeIndex], &tup))
+ {
+ tup.srctape = srcTapeIndex;
+ tuplesort_heap_insert(state, &tup);
+ }
+ }
+}
+
+/*
+ * mergereadnext - read next tuple from one merge input tape
+ *
+ * Returns false on EOF.
+ */
+static bool
+mergereadnext(Tuplesortstate *state, LogicalTape *srcTape, SortTuple *stup)
+{
+ unsigned int tuplen;
+
+ /* read next tuple, if any */
+ if ((tuplen = getlen(srcTape, true)) == 0)
+ return false;
+ READTUP(state, stup, srcTape, tuplen);
+
+ return true;
+}
+
+/*
+ * dumptuples - remove tuples from memtuples and write initial run to tape
+ *
+ * When alltuples = true, dump everything currently in memory. (This case is
+ * only used at end of input data.)
+ */
+static void
+dumptuples(Tuplesortstate *state, bool alltuples)
+{
+ int memtupwrite;
+ int i;
+
+ /*
+ * Nothing to do if we still fit in available memory and have array slots,
+ * unless this is the final call during initial run generation.
+ */
+ if (state->memtupcount < state->memtupsize && !LACKMEM(state) &&
+ !alltuples)
+ return;
+
+ /*
+ * Final call might require no sorting, in rare cases where we just so
+ * happen to have previously LACKMEM()'d at the point where exactly all
+ * remaining tuples are loaded into memory, just before input was
+ * exhausted. In general, short final runs are quite possible, but avoid
+ * creating a completely empty run. In a worker, though, we must produce
+ * at least one tape, even if it's empty.
+ */
+ if (state->memtupcount == 0 && state->currentRun > 0)
+ return;
+
+ Assert(state->status == TSS_BUILDRUNS);
+
+ /*
+ * It seems unlikely that this limit will ever be exceeded, but take no
+ * chances
+ */
+ if (state->currentRun == INT_MAX)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("cannot have more than %d runs for an external sort",
+ INT_MAX)));
+
+ if (state->currentRun > 0)
+ selectnewtape(state);
+
+ state->currentRun++;
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "worker %d starting quicksort of run %d: %s",
+ state->worker, state->currentRun,
+ pg_rusage_show(&state->ru_start));
+#endif
+
+ /*
+ * Sort all tuples accumulated within the allowed amount of memory for
+ * this run using quicksort
+ */
+ tuplesort_sort_memtuples(state);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "worker %d finished quicksort of run %d: %s",
+ state->worker, state->currentRun,
+ pg_rusage_show(&state->ru_start));
+#endif
+
+ memtupwrite = state->memtupcount;
+ for (i = 0; i < memtupwrite; i++)
+ {
+ WRITETUP(state, state->destTape, &state->memtuples[i]);
+ state->memtupcount--;
+ }
+
+ /*
+ * Reset tuple memory. We've freed all of the tuples that we previously
+ * allocated. It's important to avoid fragmentation when there is a stark
+ * change in the sizes of incoming tuples. Fragmentation due to
+ * AllocSetFree's bucketing by size class might be particularly bad if
+ * this step wasn't taken.
+ */
+ MemoryContextReset(state->tuplecontext);
+
+ markrunend(state->destTape);
+
+#ifdef TRACE_SORT
+ if (trace_sort)
+ elog(LOG, "worker %d finished writing run %d to tape %d: %s",
+ state->worker, state->currentRun, (state->currentRun - 1) % state->nOutputTapes + 1,
+ pg_rusage_show(&state->ru_start));
+#endif
+}
+
+/*
+ * tuplesort_rescan - rewind and replay the scan
+ */
+void
+tuplesort_rescan(Tuplesortstate *state)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+ Assert(state->sortopt & TUPLESORT_RANDOMACCESS);
+
+ switch (state->status)
+ {
+ case TSS_SORTEDINMEM:
+ state->current = 0;
+ state->eof_reached = false;
+ state->markpos_offset = 0;
+ state->markpos_eof = false;
+ break;
+ case TSS_SORTEDONTAPE:
+ LogicalTapeRewindForRead(state->result_tape, 0);
+ state->eof_reached = false;
+ state->markpos_block = 0L;
+ state->markpos_offset = 0;
+ state->markpos_eof = false;
+ break;
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ break;
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * tuplesort_markpos - saves current position in the merged sort file
+ */
+void
+tuplesort_markpos(Tuplesortstate *state)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+ Assert(state->sortopt & TUPLESORT_RANDOMACCESS);
+
+ switch (state->status)
+ {
+ case TSS_SORTEDINMEM:
+ state->markpos_offset = state->current;
+ state->markpos_eof = state->eof_reached;
+ break;
+ case TSS_SORTEDONTAPE:
+ LogicalTapeTell(state->result_tape,
+ &state->markpos_block,
+ &state->markpos_offset);
+ state->markpos_eof = state->eof_reached;
+ break;
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ break;
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * tuplesort_restorepos - restores current position in merged sort file to
+ * last saved position
+ */
+void
+tuplesort_restorepos(Tuplesortstate *state)
+{
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
+
+ Assert(state->sortopt & TUPLESORT_RANDOMACCESS);
+
+ switch (state->status)
+ {
+ case TSS_SORTEDINMEM:
+ state->current = state->markpos_offset;
+ state->eof_reached = state->markpos_eof;
+ break;
+ case TSS_SORTEDONTAPE:
+ LogicalTapeSeek(state->result_tape,
+ state->markpos_block,
+ state->markpos_offset);
+ state->eof_reached = state->markpos_eof;
+ break;
+ default:
+ elog(ERROR, "invalid tuplesort state");
+ break;
+ }
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+/*
+ * tuplesort_get_stats - extract summary statistics
+ *
+ * This can be called after tuplesort_performsort() finishes to obtain
+ * printable summary information about how the sort was performed.
+ */
+void
+tuplesort_get_stats(Tuplesortstate *state,
+ TuplesortInstrumentation *stats)
+{
+ /*
+ * Note: it might seem we should provide both memory and disk usage for a
+ * disk-based sort. However, the current code doesn't track memory space
+ * accurately once we have begun to return tuples to the caller (since we
+ * don't account for pfree's the caller is expected to do), so we cannot
+ * rely on availMem in a disk sort. This does not seem worth the overhead
+ * to fix. Is it worth creating an API for the memory context code to
+ * tell us how much is actually used in sortcontext?
+ */
+ tuplesort_updatemax(state);
+
+ if (state->isMaxSpaceDisk)
+ stats->spaceType = SORT_SPACE_TYPE_DISK;
+ else
+ stats->spaceType = SORT_SPACE_TYPE_MEMORY;
+ stats->spaceUsed = (state->maxSpace + 1023) / 1024;
+
+ switch (state->maxSpaceStatus)
+ {
+ case TSS_SORTEDINMEM:
+ if (state->boundUsed)
+ stats->sortMethod = SORT_TYPE_TOP_N_HEAPSORT;
+ else
+ stats->sortMethod = SORT_TYPE_QUICKSORT;
+ break;
+ case TSS_SORTEDONTAPE:
+ stats->sortMethod = SORT_TYPE_EXTERNAL_SORT;
+ break;
+ case TSS_FINALMERGE:
+ stats->sortMethod = SORT_TYPE_EXTERNAL_MERGE;
+ break;
+ default:
+ stats->sortMethod = SORT_TYPE_STILL_IN_PROGRESS;
+ break;
+ }
+}
+
+/*
+ * Convert TuplesortMethod to a string.
+ */
+const char *
+tuplesort_method_name(TuplesortMethod m)
+{
+ switch (m)
+ {
+ case SORT_TYPE_STILL_IN_PROGRESS:
+ return "still in progress";
+ case SORT_TYPE_TOP_N_HEAPSORT:
+ return "top-N heapsort";
+ case SORT_TYPE_QUICKSORT:
+ return "quicksort";
+ case SORT_TYPE_EXTERNAL_SORT:
+ return "external sort";
+ case SORT_TYPE_EXTERNAL_MERGE:
+ return "external merge";
+ }
+
+ return "unknown";
+}
+
+/*
+ * Convert TuplesortSpaceType to a string.
+ */
+const char *
+tuplesort_space_type_name(TuplesortSpaceType t)
+{
+ Assert(t == SORT_SPACE_TYPE_DISK || t == SORT_SPACE_TYPE_MEMORY);
+ return t == SORT_SPACE_TYPE_DISK ? "Disk" : "Memory";
+}
+
+
+/*
+ * Heap manipulation routines, per Knuth's Algorithm 5.2.3H.
+ */
+
+/*
+ * Convert the existing unordered array of SortTuples to a bounded heap,
+ * discarding all but the smallest "state->bound" tuples.
+ *
+ * When working with a bounded heap, we want to keep the largest entry
+ * at the root (array entry zero), instead of the smallest as in the normal
+ * sort case. This allows us to discard the largest entry cheaply.
+ * Therefore, we temporarily reverse the sort direction.
+ */
+static void
+make_bounded_heap(Tuplesortstate *state)
+{
+ int tupcount = state->memtupcount;
+ int i;
+
+ Assert(state->status == TSS_INITIAL);
+ Assert(state->bounded);
+ Assert(tupcount >= state->bound);
+ Assert(SERIAL(state));
+
+ /* Reverse sort direction so largest entry will be at root */
+ reversedirection(state);
+
+ state->memtupcount = 0; /* make the heap empty */
+ for (i = 0; i < tupcount; i++)
+ {
+ if (state->memtupcount < state->bound)
+ {
+ /* Insert next tuple into heap */
+ /* Must copy source tuple to avoid possible overwrite */
+ SortTuple stup = state->memtuples[i];
+
+ tuplesort_heap_insert(state, &stup);
+ }
+ else
+ {
+ /*
+ * The heap is full. Replace the largest entry with the new
+ * tuple, or just discard it, if it's larger than anything already
+ * in the heap.
+ */
+ if (COMPARETUP(state, &state->memtuples[i], &state->memtuples[0]) <= 0)
+ {
+ free_sort_tuple(state, &state->memtuples[i]);
+ CHECK_FOR_INTERRUPTS();
+ }
+ else
+ tuplesort_heap_replace_top(state, &state->memtuples[i]);
+ }
+ }
+
+ Assert(state->memtupcount == state->bound);
+ state->status = TSS_BOUNDED;
+}
+
+/*
+ * Convert the bounded heap to a properly-sorted array
+ */
+static void
+sort_bounded_heap(Tuplesortstate *state)
+{
+ int tupcount = state->memtupcount;
+
+ Assert(state->status == TSS_BOUNDED);
+ Assert(state->bounded);
+ Assert(tupcount == state->bound);
+ Assert(SERIAL(state));
+
+ /*
+ * We can unheapify in place because each delete-top call will remove the
+ * largest entry, which we can promptly store in the newly freed slot at
+ * the end. Once we're down to a single-entry heap, we're done.
+ */
+ while (state->memtupcount > 1)
+ {
+ SortTuple stup = state->memtuples[0];
+
+ /* this sifts-up the next-largest entry and decreases memtupcount */
+ tuplesort_heap_delete_top(state);
+ state->memtuples[state->memtupcount] = stup;
+ }
+ state->memtupcount = tupcount;
+
+ /*
+ * Reverse sort direction back to the original state. This is not
+ * actually necessary but seems like a good idea for tidiness.
+ */
+ reversedirection(state);
+
+ state->status = TSS_SORTEDINMEM;
+ state->boundUsed = true;
+}
+
+/*
+ * Sort all memtuples using specialized qsort() routines.
+ *
+ * Quicksort is used for small in-memory sorts, and external sort runs.
+ */
+static void
+tuplesort_sort_memtuples(Tuplesortstate *state)
+{
+ Assert(!LEADER(state));
+
+ if (state->memtupcount > 1)
+ {
+ /*
+ * Do we have the leading column's value or abbreviation in datum1,
+ * and is there a specialization for its comparator?
+ */
+ if (state->haveDatum1 && state->sortKeys)
+ {
+ if (state->sortKeys[0].comparator == ssup_datum_unsigned_cmp)
+ {
+ qsort_tuple_unsigned(state->memtuples,
+ state->memtupcount,
+ state);
+ return;
+ }
+#if SIZEOF_DATUM >= 8
+ else if (state->sortKeys[0].comparator == ssup_datum_signed_cmp)
+ {
+ qsort_tuple_signed(state->memtuples,
+ state->memtupcount,
+ state);
+ return;
+ }
+#endif
+ else if (state->sortKeys[0].comparator == ssup_datum_int32_cmp)
+ {
+ qsort_tuple_int32(state->memtuples,
+ state->memtupcount,
+ state);
+ return;
+ }
+ }
+
+ /* Can we use the single-key sort function? */
+ if (state->onlyKey != NULL)
+ {
+ qsort_ssup(state->memtuples, state->memtupcount,
+ state->onlyKey);
+ }
+ else
+ {
+ qsort_tuple(state->memtuples,
+ state->memtupcount,
+ state->comparetup,
+ state);
+ }
+ }
+}
+
+/*
+ * Insert a new tuple into an empty or existing heap, maintaining the
+ * heap invariant. Caller is responsible for ensuring there's room.
+ *
+ * Note: For some callers, tuple points to a memtuples[] entry above the
+ * end of the heap. This is safe as long as it's not immediately adjacent
+ * to the end of the heap (ie, in the [memtupcount] array entry) --- if it
+ * is, it might get overwritten before being moved into the heap!
+ */
+static void
+tuplesort_heap_insert(Tuplesortstate *state, SortTuple *tuple)
+{
+ SortTuple *memtuples;
+ int j;
+
+ memtuples = state->memtuples;
+ Assert(state->memtupcount < state->memtupsize);
+
+ CHECK_FOR_INTERRUPTS();
+
+ /*
+ * Sift-up the new entry, per Knuth 5.2.3 exercise 16. Note that Knuth is
+ * using 1-based array indexes, not 0-based.
+ */
+ j = state->memtupcount++;
+ while (j > 0)
+ {
+ int i = (j - 1) >> 1;
+
+ if (COMPARETUP(state, tuple, &memtuples[i]) >= 0)
+ break;
+ memtuples[j] = memtuples[i];
+ j = i;
+ }
+ memtuples[j] = *tuple;
+}
+
+/*
+ * Remove the tuple at state->memtuples[0] from the heap. Decrement
+ * memtupcount, and sift up to maintain the heap invariant.
+ *
+ * The caller has already free'd the tuple the top node points to,
+ * if necessary.
+ */
+static void
+tuplesort_heap_delete_top(Tuplesortstate *state)
+{
+ SortTuple *memtuples = state->memtuples;
+ SortTuple *tuple;
+
+ if (--state->memtupcount <= 0)
+ return;
+
+ /*
+ * Remove the last tuple in the heap, and re-insert it, by replacing the
+ * current top node with it.
+ */
+ tuple = &memtuples[state->memtupcount];
+ tuplesort_heap_replace_top(state, tuple);
+}
+
+/*
+ * Replace the tuple at state->memtuples[0] with a new tuple. Sift up to
+ * maintain the heap invariant.
+ *
+ * This corresponds to Knuth's "sift-up" algorithm (Algorithm 5.2.3H,
+ * Heapsort, steps H3-H8).
+ */
+static void
+tuplesort_heap_replace_top(Tuplesortstate *state, SortTuple *tuple)
+{
+ SortTuple *memtuples = state->memtuples;
+ unsigned int i,
+ n;
+
+ Assert(state->memtupcount >= 1);
+
+ CHECK_FOR_INTERRUPTS();
+
+ /*
+ * state->memtupcount is "int", but we use "unsigned int" for i, j, n.
+ * This prevents overflow in the "2 * i + 1" calculation, since at the top
+ * of the loop we must have i < n <= INT_MAX <= UINT_MAX/2.
+ */
+ n = state->memtupcount;
+ i = 0; /* i is where the "hole" is */
+ for (;;)
+ {
+ unsigned int j = 2 * i + 1;
+
+ if (j >= n)
+ break;
+ if (j + 1 < n &&
+ COMPARETUP(state, &memtuples[j], &memtuples[j + 1]) > 0)
+ j++;
+ if (COMPARETUP(state, tuple, &memtuples[j]) <= 0)
+ break;
+ memtuples[i] = memtuples[j];
+ i = j;
+ }
+ memtuples[i] = *tuple;
+}
+
+/*
+ * Function to reverse the sort direction from its current state
+ *
+ * It is not safe to call this when performing hash tuplesorts
+ */
+static void
+reversedirection(Tuplesortstate *state)
+{
+ SortSupport sortKey = state->sortKeys;
+ int nkey;
+
+ for (nkey = 0; nkey < state->nKeys; nkey++, sortKey++)
+ {
+ sortKey->ssup_reverse = !sortKey->ssup_reverse;
+ sortKey->ssup_nulls_first = !sortKey->ssup_nulls_first;
+ }
+}
+
+
+/*
+ * Tape interface routines
+ */
+
+static unsigned int
+getlen(LogicalTape *tape, bool eofOK)
+{
+ unsigned int len;
+
+ if (LogicalTapeRead(tape,
+ &len, sizeof(len)) != sizeof(len))
+ elog(ERROR, "unexpected end of tape");
+ if (len == 0 && !eofOK)
+ elog(ERROR, "unexpected end of data");
+ return len;
+}
+
+static void
+markrunend(LogicalTape *tape)
+{
+ unsigned int len = 0;
+
+ LogicalTapeWrite(tape, (void *) &len, sizeof(len));
+}
+
+/*
+ * Get memory for tuple from within READTUP() routine.
+ *
+ * We use next free slot from the slab allocator, or palloc() if the tuple
+ * is too large for that.
+ */
+static void *
+readtup_alloc(Tuplesortstate *state, Size tuplen)
+{
+ SlabSlot *buf;
+
+ /*
+ * We pre-allocate enough slots in the slab arena that we should never run
+ * out.
+ */
+ Assert(state->slabFreeHead);
+
+ if (tuplen > SLAB_SLOT_SIZE || !state->slabFreeHead)
+ return MemoryContextAlloc(state->sortcontext, tuplen);
+ else
+ {
+ buf = state->slabFreeHead;
+ /* Reuse this slot */
+ state->slabFreeHead = buf->nextfree;
+
+ return buf;
+ }
+}
+
+
+/*
+ * Routines specialized for HeapTuple (actually MinimalTuple) case
+ */
+
+static int
+comparetup_heap(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
+{
+ SortSupport sortKey = state->sortKeys;
+ HeapTupleData ltup;
+ HeapTupleData rtup;
+ TupleDesc tupDesc;
+ int nkey;
+ int32 compare;
+ AttrNumber attno;
+ Datum datum1,
+ datum2;
+ bool isnull1,
+ isnull2;
+
+
+ /* Compare the leading sort key */
+ compare = ApplySortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ sortKey);
+ if (compare != 0)
+ return compare;
+
+ /* Compare additional sort keys */
+ ltup.t_len = ((MinimalTuple) a->tuple)->t_len + MINIMAL_TUPLE_OFFSET;
+ ltup.t_data = (HeapTupleHeader) ((char *) a->tuple - MINIMAL_TUPLE_OFFSET);
+ rtup.t_len = ((MinimalTuple) b->tuple)->t_len + MINIMAL_TUPLE_OFFSET;
+ rtup.t_data = (HeapTupleHeader) ((char *) b->tuple - MINIMAL_TUPLE_OFFSET);
+ tupDesc = state->tupDesc;
+
+ if (sortKey->abbrev_converter)
+ {
+ attno = sortKey->ssup_attno;
+
+ datum1 = heap_getattr(&ltup, attno, tupDesc, &isnull1);
+ datum2 = heap_getattr(&rtup, attno, tupDesc, &isnull2);
+
+ compare = ApplySortAbbrevFullComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ if (compare != 0)
+ return compare;
+ }
+
+ sortKey++;
+ for (nkey = 1; nkey < state->nKeys; nkey++, sortKey++)
+ {
+ attno = sortKey->ssup_attno;
+
+ datum1 = heap_getattr(&ltup, attno, tupDesc, &isnull1);
+ datum2 = heap_getattr(&rtup, attno, tupDesc, &isnull2);
+
+ compare = ApplySortComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ if (compare != 0)
+ return compare;
+ }
+
+ return 0;
+}
+
+static void
+copytup_heap(Tuplesortstate *state, SortTuple *stup, void *tup)
+{
+ /*
+ * We expect the passed "tup" to be a TupleTableSlot, and form a
+ * MinimalTuple using the exported interface for that.
+ */
+ TupleTableSlot *slot = (TupleTableSlot *) tup;
+ Datum original;
+ MinimalTuple tuple;
+ HeapTupleData htup;
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->tuplecontext);
+
+ /* copy the tuple into sort storage */
+ tuple = ExecCopySlotMinimalTuple(slot);
+ stup->tuple = (void *) tuple;
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+ /* set up first-column key value */
+ htup.t_len = tuple->t_len + MINIMAL_TUPLE_OFFSET;
+ htup.t_data = (HeapTupleHeader) ((char *) tuple - MINIMAL_TUPLE_OFFSET);
+ original = heap_getattr(&htup,
+ state->sortKeys[0].ssup_attno,
+ state->tupDesc,
+ &stup->isnull1);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ if (!state->sortKeys->abbrev_converter || stup->isnull1)
+ {
+ /*
+ * Store ordinary Datum representation, or NULL value. If there is a
+ * converter it won't expect NULL values, and cost model is not
+ * required to account for NULL, so in that case we avoid calling
+ * converter and just set datum1 to zeroed representation (to be
+ * consistent, and to support cheap inequality tests for NULL
+ * abbreviated keys).
+ */
+ stup->datum1 = original;
+ }
+ else if (!consider_abort_common(state))
+ {
+ /* Store abbreviated key representation */
+ stup->datum1 = state->sortKeys->abbrev_converter(original,
+ state->sortKeys);
+ }
+ else
+ {
+ /* Abort abbreviation */
+ int i;
+
+ stup->datum1 = original;
+
+ /*
+ * Set state to be consistent with never trying abbreviation.
+ *
+ * Alter datum1 representation in already-copied tuples, so as to
+ * ensure a consistent representation (current tuple was just
+ * handled). It does not matter if some dumped tuples are already
+ * sorted on tape, since serialized tuples lack abbreviated keys
+ * (TSS_BUILDRUNS state prevents control reaching here in any case).
+ */
+ for (i = 0; i < state->memtupcount; i++)
+ {
+ SortTuple *mtup = &state->memtuples[i];
+
+ htup.t_len = ((MinimalTuple) mtup->tuple)->t_len +
+ MINIMAL_TUPLE_OFFSET;
+ htup.t_data = (HeapTupleHeader) ((char *) mtup->tuple -
+ MINIMAL_TUPLE_OFFSET);
+
+ mtup->datum1 = heap_getattr(&htup,
+ state->sortKeys[0].ssup_attno,
+ state->tupDesc,
+ &mtup->isnull1);
+ }
+ }
+}
+
+static void
+writetup_heap(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
+{
+ MinimalTuple tuple = (MinimalTuple) stup->tuple;
+
+ /* the part of the MinimalTuple we'll write: */
+ char *tupbody = (char *) tuple + MINIMAL_TUPLE_DATA_OFFSET;
+ unsigned int tupbodylen = tuple->t_len - MINIMAL_TUPLE_DATA_OFFSET;
+
+ /* total on-disk footprint: */
+ unsigned int tuplen = tupbodylen + sizeof(int);
+
+ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen));
+ LogicalTapeWrite(tape, (void *) tupbody, tupbodylen);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen));
+
+ if (!state->slabAllocatorUsed)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(tuple));
+ heap_free_minimal_tuple(tuple);
+ }
+}
+
+static void
+readtup_heap(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len)
+{
+ unsigned int tupbodylen = len - sizeof(int);
+ unsigned int tuplen = tupbodylen + MINIMAL_TUPLE_DATA_OFFSET;
+ MinimalTuple tuple = (MinimalTuple) readtup_alloc(state, tuplen);
+ char *tupbody = (char *) tuple + MINIMAL_TUPLE_DATA_OFFSET;
+ HeapTupleData htup;
+
+ /* read in the tuple proper */
+ tuple->t_len = tuplen;
+ LogicalTapeReadExact(tape, tupbody, tupbodylen);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen));
+ stup->tuple = (void *) tuple;
+ /* set up first-column key value */
+ htup.t_len = tuple->t_len + MINIMAL_TUPLE_OFFSET;
+ htup.t_data = (HeapTupleHeader) ((char *) tuple - MINIMAL_TUPLE_OFFSET);
+ stup->datum1 = heap_getattr(&htup,
+ state->sortKeys[0].ssup_attno,
+ state->tupDesc,
+ &stup->isnull1);
+}
+
+/*
+ * Routines specialized for the CLUSTER case (HeapTuple data, with
+ * comparisons per a btree index definition)
+ */
+
+static int
+comparetup_cluster(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state)
+{
+ SortSupport sortKey = state->sortKeys;
+ HeapTuple ltup;
+ HeapTuple rtup;
+ TupleDesc tupDesc;
+ int nkey;
+ int32 compare;
+ Datum datum1,
+ datum2;
+ bool isnull1,
+ isnull2;
+
+ /* Be prepared to compare additional sort keys */
+ ltup = (HeapTuple) a->tuple;
+ rtup = (HeapTuple) b->tuple;
+ tupDesc = state->tupDesc;
+
+ /* Compare the leading sort key, if it's simple */
+ if (state->haveDatum1)
+ {
+ compare = ApplySortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ sortKey);
+ if (compare != 0)
+ return compare;
+
+ if (sortKey->abbrev_converter)
+ {
+ AttrNumber leading = state->indexInfo->ii_IndexAttrNumbers[0];
+
+ datum1 = heap_getattr(ltup, leading, tupDesc, &isnull1);
+ datum2 = heap_getattr(rtup, leading, tupDesc, &isnull2);
+
+ compare = ApplySortAbbrevFullComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ }
+ if (compare != 0 || state->nKeys == 1)
+ return compare;
+ /* Compare additional columns the hard way */
+ sortKey++;
+ nkey = 1;
+ }
+ else
+ {
+ /* Must compare all keys the hard way */
+ nkey = 0;
+ }
+
+ if (state->indexInfo->ii_Expressions == NULL)
+ {
+ /* If not expression index, just compare the proper heap attrs */
+
+ for (; nkey < state->nKeys; nkey++, sortKey++)
+ {
+ AttrNumber attno = state->indexInfo->ii_IndexAttrNumbers[nkey];
+
+ datum1 = heap_getattr(ltup, attno, tupDesc, &isnull1);
+ datum2 = heap_getattr(rtup, attno, tupDesc, &isnull2);
+
+ compare = ApplySortComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ if (compare != 0)
+ return compare;
+ }
+ }
+ else
+ {
+ /*
+ * In the expression index case, compute the whole index tuple and
+ * then compare values. It would perhaps be faster to compute only as
+ * many columns as we need to compare, but that would require
+ * duplicating all the logic in FormIndexDatum.
+ */
+ Datum l_index_values[INDEX_MAX_KEYS];
+ bool l_index_isnull[INDEX_MAX_KEYS];
+ Datum r_index_values[INDEX_MAX_KEYS];
+ bool r_index_isnull[INDEX_MAX_KEYS];
+ TupleTableSlot *ecxt_scantuple;
+
+ /* Reset context each time to prevent memory leakage */
+ ResetPerTupleExprContext(state->estate);
+
+ ecxt_scantuple = GetPerTupleExprContext(state->estate)->ecxt_scantuple;
+
+ ExecStoreHeapTuple(ltup, ecxt_scantuple, false);
+ FormIndexDatum(state->indexInfo, ecxt_scantuple, state->estate,
+ l_index_values, l_index_isnull);
+
+ ExecStoreHeapTuple(rtup, ecxt_scantuple, false);
+ FormIndexDatum(state->indexInfo, ecxt_scantuple, state->estate,
+ r_index_values, r_index_isnull);
+
+ for (; nkey < state->nKeys; nkey++, sortKey++)
+ {
+ compare = ApplySortComparator(l_index_values[nkey],
+ l_index_isnull[nkey],
+ r_index_values[nkey],
+ r_index_isnull[nkey],
+ sortKey);
+ if (compare != 0)
+ return compare;
+ }
+ }
+
+ return 0;
+}
+
+static void
+copytup_cluster(Tuplesortstate *state, SortTuple *stup, void *tup)
+{
+ HeapTuple tuple = (HeapTuple) tup;
+ Datum original;
+ MemoryContext oldcontext = MemoryContextSwitchTo(state->tuplecontext);
+
+ /* copy the tuple into sort storage */
+ tuple = heap_copytuple(tuple);
+ stup->tuple = (void *) tuple;
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+
+ MemoryContextSwitchTo(oldcontext);
+
+ /*
+ * set up first-column key value, and potentially abbreviate, if it's a
+ * simple column
+ */
+ if (!state->haveDatum1)
+ return;
+
+ original = heap_getattr(tuple,
+ state->indexInfo->ii_IndexAttrNumbers[0],
+ state->tupDesc,
+ &stup->isnull1);
+
+ if (!state->sortKeys->abbrev_converter || stup->isnull1)
+ {
+ /*
+ * Store ordinary Datum representation, or NULL value. If there is a
+ * converter it won't expect NULL values, and cost model is not
+ * required to account for NULL, so in that case we avoid calling
+ * converter and just set datum1 to zeroed representation (to be
+ * consistent, and to support cheap inequality tests for NULL
+ * abbreviated keys).
+ */
+ stup->datum1 = original;
+ }
+ else if (!consider_abort_common(state))
+ {
+ /* Store abbreviated key representation */
+ stup->datum1 = state->sortKeys->abbrev_converter(original,
+ state->sortKeys);
+ }
+ else
+ {
+ /* Abort abbreviation */
+ int i;
+
+ stup->datum1 = original;
+
+ /*
+ * Set state to be consistent with never trying abbreviation.
+ *
+ * Alter datum1 representation in already-copied tuples, so as to
+ * ensure a consistent representation (current tuple was just
+ * handled). It does not matter if some dumped tuples are already
+ * sorted on tape, since serialized tuples lack abbreviated keys
+ * (TSS_BUILDRUNS state prevents control reaching here in any case).
+ */
+ for (i = 0; i < state->memtupcount; i++)
+ {
+ SortTuple *mtup = &state->memtuples[i];
+
+ tuple = (HeapTuple) mtup->tuple;
+ mtup->datum1 = heap_getattr(tuple,
+ state->indexInfo->ii_IndexAttrNumbers[0],
+ state->tupDesc,
+ &mtup->isnull1);
+ }
+ }
+}
+
+static void
+writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
+{
+ HeapTuple tuple = (HeapTuple) stup->tuple;
+ unsigned int tuplen = tuple->t_len + sizeof(ItemPointerData) + sizeof(int);
+
+ /* We need to store t_self, but not other fields of HeapTupleData */
+ LogicalTapeWrite(tape, &tuplen, sizeof(tuplen));
+ LogicalTapeWrite(tape, &tuple->t_self, sizeof(ItemPointerData));
+ LogicalTapeWrite(tape, tuple->t_data, tuple->t_len);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeWrite(tape, &tuplen, sizeof(tuplen));
+
+ if (!state->slabAllocatorUsed)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(tuple));
+ heap_freetuple(tuple);
+ }
+}
+
+static void
+readtup_cluster(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int tuplen)
+{
+ unsigned int t_len = tuplen - sizeof(ItemPointerData) - sizeof(int);
+ HeapTuple tuple = (HeapTuple) readtup_alloc(state,
+ t_len + HEAPTUPLESIZE);
+
+ /* Reconstruct the HeapTupleData header */
+ tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);
+ tuple->t_len = t_len;
+ LogicalTapeReadExact(tape, &tuple->t_self, sizeof(ItemPointerData));
+ /* We don't currently bother to reconstruct t_tableOid */
+ tuple->t_tableOid = InvalidOid;
+ /* Read in the tuple body */
+ LogicalTapeReadExact(tape, tuple->t_data, tuple->t_len);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen));
+ stup->tuple = (void *) tuple;
+ /* set up first-column key value, if it's a simple column */
+ if (state->haveDatum1)
+ stup->datum1 = heap_getattr(tuple,
+ state->indexInfo->ii_IndexAttrNumbers[0],
+ state->tupDesc,
+ &stup->isnull1);
+}
+
+/*
+ * Routines specialized for IndexTuple case
+ *
+ * The btree and hash cases require separate comparison functions, but the
+ * IndexTuple representation is the same so the copy/write/read support
+ * functions can be shared.
+ */
+
+static int
+comparetup_index_btree(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state)
+{
+ /*
+ * This is similar to comparetup_heap(), but expects index tuples. There
+ * is also special handling for enforcing uniqueness, and special
+ * treatment for equal keys at the end.
+ */
+ SortSupport sortKey = state->sortKeys;
+ IndexTuple tuple1;
+ IndexTuple tuple2;
+ int keysz;
+ TupleDesc tupDes;
+ bool equal_hasnull = false;
+ int nkey;
+ int32 compare;
+ Datum datum1,
+ datum2;
+ bool isnull1,
+ isnull2;
+
+
+ /* Compare the leading sort key */
+ compare = ApplySortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ sortKey);
+ if (compare != 0)
+ return compare;
+
+ /* Compare additional sort keys */
+ tuple1 = (IndexTuple) a->tuple;
+ tuple2 = (IndexTuple) b->tuple;
+ keysz = state->nKeys;
+ tupDes = RelationGetDescr(state->indexRel);
+
+ if (sortKey->abbrev_converter)
+ {
+ datum1 = index_getattr(tuple1, 1, tupDes, &isnull1);
+ datum2 = index_getattr(tuple2, 1, tupDes, &isnull2);
+
+ compare = ApplySortAbbrevFullComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ if (compare != 0)
+ return compare;
+ }
+
+ /* they are equal, so we only need to examine one null flag */
+ if (a->isnull1)
+ equal_hasnull = true;
+
+ sortKey++;
+ for (nkey = 2; nkey <= keysz; nkey++, sortKey++)
+ {
+ datum1 = index_getattr(tuple1, nkey, tupDes, &isnull1);
+ datum2 = index_getattr(tuple2, nkey, tupDes, &isnull2);
+
+ compare = ApplySortComparator(datum1, isnull1,
+ datum2, isnull2,
+ sortKey);
+ if (compare != 0)
+ return compare; /* done when we find unequal attributes */
+
+ /* they are equal, so we only need to examine one null flag */
+ if (isnull1)
+ equal_hasnull = true;
+ }
+
+ /*
+ * If btree has asked us to enforce uniqueness, complain if two equal
+ * tuples are detected (unless there was at least one NULL field and NULLS
+ * NOT DISTINCT was not set).
+ *
+ * It is sufficient to make the test here, because if two tuples are equal
+ * they *must* get compared at some stage of the sort --- otherwise the
+ * sort algorithm wouldn't have checked whether one must appear before the
+ * other.
+ */
+ if (state->enforceUnique && !(!state->uniqueNullsNotDistinct && equal_hasnull))
+ {
+ Datum values[INDEX_MAX_KEYS];
+ bool isnull[INDEX_MAX_KEYS];
+ char *key_desc;
+
+ /*
+ * Some rather brain-dead implementations of qsort (such as the one in
+ * QNX 4) will sometimes call the comparison routine to compare a
+ * value to itself, but we always use our own implementation, which
+ * does not.
+ */
+ Assert(tuple1 != tuple2);
+
+ index_deform_tuple(tuple1, tupDes, values, isnull);
+
+ key_desc = BuildIndexValueDescription(state->indexRel, values, isnull);
+
+ ereport(ERROR,
+ (errcode(ERRCODE_UNIQUE_VIOLATION),
+ errmsg("could not create unique index \"%s\"",
+ RelationGetRelationName(state->indexRel)),
+ key_desc ? errdetail("Key %s is duplicated.", key_desc) :
+ errdetail("Duplicate keys exist."),
+ errtableconstraint(state->heapRel,
+ RelationGetRelationName(state->indexRel))));
+ }
+
+ /*
+ * If key values are equal, we sort on ItemPointer. This is required for
+ * btree indexes, since heap TID is treated as an implicit last key
+ * attribute in order to ensure that all keys in the index are physically
+ * unique.
+ */
+ {
+ BlockNumber blk1 = ItemPointerGetBlockNumber(&tuple1->t_tid);
+ BlockNumber blk2 = ItemPointerGetBlockNumber(&tuple2->t_tid);
+
+ if (blk1 != blk2)
+ return (blk1 < blk2) ? -1 : 1;
+ }
+ {
+ OffsetNumber pos1 = ItemPointerGetOffsetNumber(&tuple1->t_tid);
+ OffsetNumber pos2 = ItemPointerGetOffsetNumber(&tuple2->t_tid);
+
+ if (pos1 != pos2)
+ return (pos1 < pos2) ? -1 : 1;
+ }
+
+ /* ItemPointer values should never be equal */
+ Assert(false);
+
+ return 0;
+}
+
+static int
+comparetup_index_hash(const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state)
+{
+ Bucket bucket1;
+ Bucket bucket2;
+ IndexTuple tuple1;
+ IndexTuple tuple2;
+
+ /*
+ * Fetch hash keys and mask off bits we don't want to sort by. We know
+ * that the first column of the index tuple is the hash key.
+ */
+ Assert(!a->isnull1);
+ bucket1 = _hash_hashkey2bucket(DatumGetUInt32(a->datum1),
+ state->max_buckets, state->high_mask,
+ state->low_mask);
+ Assert(!b->isnull1);
+ bucket2 = _hash_hashkey2bucket(DatumGetUInt32(b->datum1),
+ state->max_buckets, state->high_mask,
+ state->low_mask);
+ if (bucket1 > bucket2)
+ return 1;
+ else if (bucket1 < bucket2)
+ return -1;
+
+ /*
+ * If hash values are equal, we sort on ItemPointer. This does not affect
+ * validity of the finished index, but it may be useful to have index
+ * scans in physical order.
+ */
+ tuple1 = (IndexTuple) a->tuple;
+ tuple2 = (IndexTuple) b->tuple;
+
+ {
+ BlockNumber blk1 = ItemPointerGetBlockNumber(&tuple1->t_tid);
+ BlockNumber blk2 = ItemPointerGetBlockNumber(&tuple2->t_tid);
+
+ if (blk1 != blk2)
+ return (blk1 < blk2) ? -1 : 1;
+ }
+ {
+ OffsetNumber pos1 = ItemPointerGetOffsetNumber(&tuple1->t_tid);
+ OffsetNumber pos2 = ItemPointerGetOffsetNumber(&tuple2->t_tid);
+
+ if (pos1 != pos2)
+ return (pos1 < pos2) ? -1 : 1;
+ }
+
+ /* ItemPointer values should never be equal */
+ Assert(false);
+
+ return 0;
+}
+
+static void
+copytup_index(Tuplesortstate *state, SortTuple *stup, void *tup)
+{
+ /* Not currently needed */
+ elog(ERROR, "copytup_index() should not be called");
+}
+
+static void
+writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
+{
+ IndexTuple tuple = (IndexTuple) stup->tuple;
+ unsigned int tuplen;
+
+ tuplen = IndexTupleSize(tuple) + sizeof(tuplen);
+ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen));
+ LogicalTapeWrite(tape, (void *) tuple, IndexTupleSize(tuple));
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeWrite(tape, (void *) &tuplen, sizeof(tuplen));
+
+ if (!state->slabAllocatorUsed)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(tuple));
+ pfree(tuple);
+ }
+}
+
+static void
+readtup_index(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len)
+{
+ unsigned int tuplen = len - sizeof(unsigned int);
+ IndexTuple tuple = (IndexTuple) readtup_alloc(state, tuplen);
+
+ LogicalTapeReadExact(tape, tuple, tuplen);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen));
+ stup->tuple = (void *) tuple;
+ /* set up first-column key value */
+ stup->datum1 = index_getattr(tuple,
+ 1,
+ RelationGetDescr(state->indexRel),
+ &stup->isnull1);
+}
+
+/*
+ * Routines specialized for DatumTuple case
+ */
+
+static int
+comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
+{
+ int compare;
+
+ compare = ApplySortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ state->sortKeys);
+ if (compare != 0)
+ return compare;
+
+ /* if we have abbreviations, then "tuple" has the original value */
+
+ if (state->sortKeys->abbrev_converter)
+ compare = ApplySortAbbrevFullComparator(PointerGetDatum(a->tuple), a->isnull1,
+ PointerGetDatum(b->tuple), b->isnull1,
+ state->sortKeys);
+
+ return compare;
+}
+
+static void
+copytup_datum(Tuplesortstate *state, SortTuple *stup, void *tup)
+{
+ /* Not currently needed */
+ elog(ERROR, "copytup_datum() should not be called");
+}
+
+static void
+writetup_datum(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
+{
+ void *waddr;
+ unsigned int tuplen;
+ unsigned int writtenlen;
+
+ if (stup->isnull1)
+ {
+ waddr = NULL;
+ tuplen = 0;
+ }
+ else if (!state->tuples)
+ {
+ waddr = &stup->datum1;
+ tuplen = sizeof(Datum);
+ }
+ else
+ {
+ waddr = stup->tuple;
+ tuplen = datumGetSize(PointerGetDatum(stup->tuple), false, state->datumTypeLen);
+ Assert(tuplen != 0);
+ }
+
+ writtenlen = tuplen + sizeof(unsigned int);
+
+ LogicalTapeWrite(tape, (void *) &writtenlen, sizeof(writtenlen));
+ LogicalTapeWrite(tape, waddr, tuplen);
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeWrite(tape, (void *) &writtenlen, sizeof(writtenlen));
+
+ if (!state->slabAllocatorUsed && stup->tuple)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(stup->tuple));
+ pfree(stup->tuple);
+ }
+}
+
+static void
+readtup_datum(Tuplesortstate *state, SortTuple *stup,
+ LogicalTape *tape, unsigned int len)
+{
+ unsigned int tuplen = len - sizeof(unsigned int);
+
+ if (tuplen == 0)
+ {
+ /* it's NULL */
+ stup->datum1 = (Datum) 0;
+ stup->isnull1 = true;
+ stup->tuple = NULL;
+ }
+ else if (!state->tuples)
+ {
+ Assert(tuplen == sizeof(Datum));
+ LogicalTapeReadExact(tape, &stup->datum1, tuplen);
+ stup->isnull1 = false;
+ stup->tuple = NULL;
+ }
+ else
+ {
+ void *raddr = readtup_alloc(state, tuplen);
+
+ LogicalTapeReadExact(tape, raddr, tuplen);
+ stup->datum1 = PointerGetDatum(raddr);
+ stup->isnull1 = false;
+ stup->tuple = raddr;
+ }
+
+ if (state->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length
+ * word? */
+ LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen));
+}
+
+/*
+ * Parallel sort routines
+ */
+
+/*
+ * tuplesort_estimate_shared - estimate required shared memory allocation
+ *
+ * nWorkers is an estimate of the number of workers (it's the number that
+ * will be requested).
+ */
+Size
+tuplesort_estimate_shared(int nWorkers)
+{
+ Size tapesSize;
+
+ Assert(nWorkers > 0);
+
+ /* Make sure that BufFile shared state is MAXALIGN'd */
+ tapesSize = mul_size(sizeof(TapeShare), nWorkers);
+ tapesSize = MAXALIGN(add_size(tapesSize, offsetof(Sharedsort, tapes)));
+
+ return tapesSize;
+}
+
+/*
+ * tuplesort_initialize_shared - initialize shared tuplesort state
+ *
+ * Must be called from leader process before workers are launched, to
+ * establish state needed up-front for worker tuplesortstates. nWorkers
+ * should match the argument passed to tuplesort_estimate_shared().
+ */
+void
+tuplesort_initialize_shared(Sharedsort *shared, int nWorkers, dsm_segment *seg)
+{
+ int i;
+
+ Assert(nWorkers > 0);
+
+ SpinLockInit(&shared->mutex);
+ shared->currentWorker = 0;
+ shared->workersFinished = 0;
+ SharedFileSetInit(&shared->fileset, seg);
+ shared->nTapes = nWorkers;
+ for (i = 0; i < nWorkers; i++)
+ {
+ shared->tapes[i].firstblocknumber = 0L;
+ }
+}
+
+/*
+ * tuplesort_attach_shared - attach to shared tuplesort state
+ *
+ * Must be called by all worker processes.
+ */
+void
+tuplesort_attach_shared(Sharedsort *shared, dsm_segment *seg)
+{
+ /* Attach to SharedFileSet */
+ SharedFileSetAttach(&shared->fileset, seg);
+}
+
+/*
+ * worker_get_identifier - Assign and return ordinal identifier for worker
+ *
+ * The order in which these are assigned is not well defined, and should not
+ * matter; worker numbers across parallel sort participants need only be
+ * distinct and gapless. logtape.c requires this.
+ *
+ * Note that the identifiers assigned from here have no relation to
+ * ParallelWorkerNumber number, to avoid making any assumption about
+ * caller's requirements. However, we do follow the ParallelWorkerNumber
+ * convention of representing a non-worker with worker number -1. This
+ * includes the leader, as well as serial Tuplesort processes.
+ */
+static int
+worker_get_identifier(Tuplesortstate *state)
+{
+ Sharedsort *shared = state->shared;
+ int worker;
+
+ Assert(WORKER(state));
+
+ SpinLockAcquire(&shared->mutex);
+ worker = shared->currentWorker++;
+ SpinLockRelease(&shared->mutex);
+
+ return worker;
+}
+
+/*
+ * worker_freeze_result_tape - freeze worker's result tape for leader
+ *
+ * This is called by workers just after the result tape has been determined,
+ * instead of calling LogicalTapeFreeze() directly. They do so because
+ * workers require a few additional steps over similar serial
+ * TSS_SORTEDONTAPE external sort cases, which also happen here. The extra
+ * steps are around freeing now unneeded resources, and representing to
+ * leader that worker's input run is available for its merge.
+ *
+ * There should only be one final output run for each worker, which consists
+ * of all tuples that were originally input into worker.
+ */
+static void
+worker_freeze_result_tape(Tuplesortstate *state)
+{
+ Sharedsort *shared = state->shared;
+ TapeShare output;
+
+ Assert(WORKER(state));
+ Assert(state->result_tape != NULL);
+ Assert(state->memtupcount == 0);
+
+ /*
+ * Free most remaining memory, in case caller is sensitive to our holding
+ * on to it. memtuples may not be a tiny merge heap at this point.
+ */
+ pfree(state->memtuples);
+ /* Be tidy */
+ state->memtuples = NULL;
+ state->memtupsize = 0;
+
+ /*
+ * Parallel worker requires result tape metadata, which is to be stored in
+ * shared memory for leader
+ */
+ LogicalTapeFreeze(state->result_tape, &output);
+
+ /* Store properties of output tape, and update finished worker count */
+ SpinLockAcquire(&shared->mutex);
+ shared->tapes[state->worker] = output;
+ shared->workersFinished++;
+ SpinLockRelease(&shared->mutex);
+}
+
+/*
+ * worker_nomergeruns - dump memtuples in worker, without merging
+ *
+ * This called as an alternative to mergeruns() with a worker when no
+ * merging is required.
+ */
+static void
+worker_nomergeruns(Tuplesortstate *state)
+{
+ Assert(WORKER(state));
+ Assert(state->result_tape == NULL);
+ Assert(state->nOutputRuns == 1);
+
+ state->result_tape = state->destTape;
+ worker_freeze_result_tape(state);
+}
+
+/*
+ * leader_takeover_tapes - create tapeset for leader from worker tapes
+ *
+ * So far, leader Tuplesortstate has performed no actual sorting. By now, all
+ * sorting has occurred in workers, all of which must have already returned
+ * from tuplesort_performsort().
+ *
+ * When this returns, leader process is left in a state that is virtually
+ * indistinguishable from it having generated runs as a serial external sort
+ * might have.
+ */
+static void
+leader_takeover_tapes(Tuplesortstate *state)
+{
+ Sharedsort *shared = state->shared;
+ int nParticipants = state->nParticipants;
+ int workersFinished;
+ int j;
+
+ Assert(LEADER(state));
+ Assert(nParticipants >= 1);
+
+ SpinLockAcquire(&shared->mutex);
+ workersFinished = shared->workersFinished;
+ SpinLockRelease(&shared->mutex);
+
+ if (nParticipants != workersFinished)
+ elog(ERROR, "cannot take over tapes before all workers finish");
+
+ /*
+ * Create the tapeset from worker tapes, including a leader-owned tape at
+ * the end. Parallel workers are far more expensive than logical tapes,
+ * so the number of tapes allocated here should never be excessive.
+ */
+ inittapestate(state, nParticipants);
+ state->tapeset = LogicalTapeSetCreate(false, &shared->fileset, -1);
+
+ /*
+ * Set currentRun to reflect the number of runs we will merge (it's not
+ * used for anything, this is just pro forma)
+ */
+ state->currentRun = nParticipants;
+
+ /*
+ * Initialize the state to look the same as after building the initial
+ * runs.
+ *
+ * There will always be exactly 1 run per worker, and exactly one input
+ * tape per run, because workers always output exactly 1 run, even when
+ * there were no input tuples for workers to sort.
+ */
+ state->inputTapes = NULL;
+ state->nInputTapes = 0;
+ state->nInputRuns = 0;
+
+ state->outputTapes = palloc0(nParticipants * sizeof(LogicalTape *));
+ state->nOutputTapes = nParticipants;
+ state->nOutputRuns = nParticipants;
+
+ for (j = 0; j < nParticipants; j++)
+ {
+ state->outputTapes[j] = LogicalTapeImport(state->tapeset, j, &shared->tapes[j]);
+ }
+
+ state->status = TSS_BUILDRUNS;
+}
+
+/*
+ * Convenience routine to free a tuple previously loaded into sort memory
+ */
+static void
+free_sort_tuple(Tuplesortstate *state, SortTuple *stup)
+{
+ if (stup->tuple)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(stup->tuple));
+ pfree(stup->tuple);
+ stup->tuple = NULL;
+ }
+}
+
+int
+ssup_datum_unsigned_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ if (x < y)
+ return -1;
+ else if (x > y)
+ return 1;
+ else
+ return 0;
+}
+
+#if SIZEOF_DATUM >= 8
+int
+ssup_datum_signed_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ int64 xx = DatumGetInt64(x);
+ int64 yy = DatumGetInt64(y);
+
+ if (xx < yy)
+ return -1;
+ else if (xx > yy)
+ return 1;
+ else
+ return 0;
+}
+#endif
+
+int
+ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup)
+{
+ int32 xx = DatumGetInt32(x);
+ int32 yy = DatumGetInt32(y);
+
+ if (xx < yy)
+ return -1;
+ else if (xx > yy)
+ return 1;
+ else
+ return 0;
+}
diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c
new file mode 100644
index 0000000..f605ece
--- /dev/null
+++ b/src/backend/utils/sort/tuplestore.c
@@ -0,0 +1,1552 @@
+/*-------------------------------------------------------------------------
+ *
+ * tuplestore.c
+ * Generalized routines for temporary tuple storage.
+ *
+ * This module handles temporary storage of tuples for purposes such
+ * as Materialize nodes, hashjoin batch files, etc. It is essentially
+ * a dumbed-down version of tuplesort.c; it does no sorting of tuples
+ * but can only store and regurgitate a sequence of tuples. However,
+ * because no sort is required, it is allowed to start reading the sequence
+ * before it has all been written. This is particularly useful for cursors,
+ * because it allows random access within the already-scanned portion of
+ * a query without having to process the underlying scan to completion.
+ * Also, it is possible to support multiple independent read pointers.
+ *
+ * A temporary file is used to handle the data if it exceeds the
+ * space limit specified by the caller.
+ *
+ * The (approximate) amount of memory allowed to the tuplestore is specified
+ * in kilobytes by the caller. We absorb tuples and simply store them in an
+ * in-memory array as long as we haven't exceeded maxKBytes. If we do exceed
+ * maxKBytes, we dump all the tuples into a temp file and then read from that
+ * when needed.
+ *
+ * Upon creation, a tuplestore supports a single read pointer, numbered 0.
+ * Additional read pointers can be created using tuplestore_alloc_read_pointer.
+ * Mark/restore behavior is supported by copying read pointers.
+ *
+ * When the caller requests backward-scan capability, we write the temp file
+ * in a format that allows either forward or backward scan. Otherwise, only
+ * forward scan is allowed. A request for backward scan must be made before
+ * putting any tuples into the tuplestore. Rewind is normally allowed but
+ * can be turned off via tuplestore_set_eflags; turning off rewind for all
+ * read pointers enables truncation of the tuplestore at the oldest read point
+ * for minimal memory usage. (The caller must explicitly call tuplestore_trim
+ * at appropriate times for truncation to actually happen.)
+ *
+ * Note: in TSS_WRITEFILE state, the temp file's seek position is the
+ * current write position, and the write-position variables in the tuplestore
+ * aren't kept up to date. Similarly, in TSS_READFILE state the temp file's
+ * seek position is the active read pointer's position, and that read pointer
+ * isn't kept up to date. We update the appropriate variables using ftell()
+ * before switching to the other state or activating a different read pointer.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/sort/tuplestore.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include <limits.h>
+
+#include "access/htup_details.h"
+#include "commands/tablespace.h"
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "storage/buffile.h"
+#include "utils/memutils.h"
+#include "utils/resowner.h"
+
+
+/*
+ * Possible states of a Tuplestore object. These denote the states that
+ * persist between calls of Tuplestore routines.
+ */
+typedef enum
+{
+ TSS_INMEM, /* Tuples still fit in memory */
+ TSS_WRITEFILE, /* Writing to temp file */
+ TSS_READFILE /* Reading from temp file */
+} TupStoreStatus;
+
+/*
+ * State for a single read pointer. If we are in state INMEM then all the
+ * read pointers' "current" fields denote the read positions. In state
+ * WRITEFILE, the file/offset fields denote the read positions. In state
+ * READFILE, inactive read pointers have valid file/offset, but the active
+ * read pointer implicitly has position equal to the temp file's seek position.
+ *
+ * Special case: if eof_reached is true, then the pointer's read position is
+ * implicitly equal to the write position, and current/file/offset aren't
+ * maintained. This way we need not update all the read pointers each time
+ * we write.
+ */
+typedef struct
+{
+ int eflags; /* capability flags */
+ bool eof_reached; /* read has reached EOF */
+ int current; /* next array index to read */
+ int file; /* temp file# */
+ off_t offset; /* byte offset in file */
+} TSReadPointer;
+
+/*
+ * Private state of a Tuplestore operation.
+ */
+struct Tuplestorestate
+{
+ TupStoreStatus status; /* enumerated value as shown above */
+ int eflags; /* capability flags (OR of pointers' flags) */
+ bool backward; /* store extra length words in file? */
+ bool interXact; /* keep open through transactions? */
+ bool truncated; /* tuplestore_trim has removed tuples? */
+ int64 availMem; /* remaining memory available, in bytes */
+ int64 allowedMem; /* total memory allowed, in bytes */
+ int64 tuples; /* number of tuples added */
+ BufFile *myfile; /* underlying file, or NULL if none */
+ MemoryContext context; /* memory context for holding tuples */
+ ResourceOwner resowner; /* resowner for holding temp files */
+
+ /*
+ * These function pointers decouple the routines that must know what kind
+ * of tuple we are handling from the routines that don't need to know it.
+ * They are set up by the tuplestore_begin_xxx routines.
+ *
+ * (Although tuplestore.c currently only supports heap tuples, I've copied
+ * this part of tuplesort.c so that extension to other kinds of objects
+ * will be easy if it's ever needed.)
+ *
+ * Function to copy a supplied input tuple into palloc'd space. (NB: we
+ * assume that a single pfree() is enough to release the tuple later, so
+ * the representation must be "flat" in one palloc chunk.) state->availMem
+ * must be decreased by the amount of space used.
+ */
+ void *(*copytup) (Tuplestorestate *state, void *tup);
+
+ /*
+ * Function to write a stored tuple onto tape. The representation of the
+ * tuple on tape need not be the same as it is in memory; requirements on
+ * the tape representation are given below. After writing the tuple,
+ * pfree() it, and increase state->availMem by the amount of memory space
+ * thereby released.
+ */
+ void (*writetup) (Tuplestorestate *state, void *tup);
+
+ /*
+ * Function to read a stored tuple from tape back into memory. 'len' is
+ * the already-read length of the stored tuple. Create and return a
+ * palloc'd copy, and decrease state->availMem by the amount of memory
+ * space consumed.
+ */
+ void *(*readtup) (Tuplestorestate *state, unsigned int len);
+
+ /*
+ * This array holds pointers to tuples in memory if we are in state INMEM.
+ * In states WRITEFILE and READFILE it's not used.
+ *
+ * When memtupdeleted > 0, the first memtupdeleted pointers are already
+ * released due to a tuplestore_trim() operation, but we haven't expended
+ * the effort to slide the remaining pointers down. These unused pointers
+ * are set to NULL to catch any invalid accesses. Note that memtupcount
+ * includes the deleted pointers.
+ */
+ void **memtuples; /* array of pointers to palloc'd tuples */
+ int memtupdeleted; /* the first N slots are currently unused */
+ int memtupcount; /* number of tuples currently present */
+ int memtupsize; /* allocated length of memtuples array */
+ bool growmemtuples; /* memtuples' growth still underway? */
+
+ /*
+ * These variables are used to keep track of the current positions.
+ *
+ * In state WRITEFILE, the current file seek position is the write point;
+ * in state READFILE, the write position is remembered in writepos_xxx.
+ * (The write position is the same as EOF, but since BufFileSeek doesn't
+ * currently implement SEEK_END, we have to remember it explicitly.)
+ */
+ TSReadPointer *readptrs; /* array of read pointers */
+ int activeptr; /* index of the active read pointer */
+ int readptrcount; /* number of pointers currently valid */
+ int readptrsize; /* allocated length of readptrs array */
+
+ int writepos_file; /* file# (valid if READFILE state) */
+ off_t writepos_offset; /* offset (valid if READFILE state) */
+};
+
+#define COPYTUP(state,tup) ((*(state)->copytup) (state, tup))
+#define WRITETUP(state,tup) ((*(state)->writetup) (state, tup))
+#define READTUP(state,len) ((*(state)->readtup) (state, len))
+#define LACKMEM(state) ((state)->availMem < 0)
+#define USEMEM(state,amt) ((state)->availMem -= (amt))
+#define FREEMEM(state,amt) ((state)->availMem += (amt))
+
+/*--------------------
+ *
+ * NOTES about on-tape representation of tuples:
+ *
+ * We require the first "unsigned int" of a stored tuple to be the total size
+ * on-tape of the tuple, including itself (so it is never zero).
+ * The remainder of the stored tuple
+ * may or may not match the in-memory representation of the tuple ---
+ * any conversion needed is the job of the writetup and readtup routines.
+ *
+ * If state->backward is true, then the stored representation of
+ * the tuple must be followed by another "unsigned int" that is a copy of the
+ * length --- so the total tape space used is actually sizeof(unsigned int)
+ * more than the stored length value. This allows read-backwards. When
+ * state->backward is not set, the write/read routines may omit the extra
+ * length word.
+ *
+ * writetup is expected to write both length words as well as the tuple
+ * data. When readtup is called, the tape is positioned just after the
+ * front length word; readtup must read the tuple data and advance past
+ * the back length word (if present).
+ *
+ * The write/read routines can make use of the tuple description data
+ * stored in the Tuplestorestate record, if needed. They are also expected
+ * to adjust state->availMem by the amount of memory space (not tape space!)
+ * released or consumed. There is no error return from either writetup
+ * or readtup; they should ereport() on failure.
+ *
+ *
+ * NOTES about memory consumption calculations:
+ *
+ * We count space allocated for tuples against the maxKBytes limit,
+ * plus the space used by the variable-size array memtuples.
+ * Fixed-size space (primarily the BufFile I/O buffer) is not counted.
+ * We don't worry about the size of the read pointer array, either.
+ *
+ * Note that we count actual space used (as shown by GetMemoryChunkSpace)
+ * rather than the originally-requested size. This is important since
+ * palloc can add substantial overhead. It's not a complete answer since
+ * we won't count any wasted space in palloc allocation blocks, but it's
+ * a lot better than what we were doing before 7.3.
+ *
+ *--------------------
+ */
+
+
+static Tuplestorestate *tuplestore_begin_common(int eflags,
+ bool interXact,
+ int maxKBytes);
+static void tuplestore_puttuple_common(Tuplestorestate *state, void *tuple);
+static void dumptuples(Tuplestorestate *state);
+static unsigned int getlen(Tuplestorestate *state, bool eofOK);
+static void *copytup_heap(Tuplestorestate *state, void *tup);
+static void writetup_heap(Tuplestorestate *state, void *tup);
+static void *readtup_heap(Tuplestorestate *state, unsigned int len);
+
+
+/*
+ * tuplestore_begin_xxx
+ *
+ * Initialize for a tuple store operation.
+ */
+static Tuplestorestate *
+tuplestore_begin_common(int eflags, bool interXact, int maxKBytes)
+{
+ Tuplestorestate *state;
+
+ state = (Tuplestorestate *) palloc0(sizeof(Tuplestorestate));
+
+ state->status = TSS_INMEM;
+ state->eflags = eflags;
+ state->interXact = interXact;
+ state->truncated = false;
+ state->allowedMem = maxKBytes * 1024L;
+ state->availMem = state->allowedMem;
+ state->myfile = NULL;
+ state->context = CurrentMemoryContext;
+ state->resowner = CurrentResourceOwner;
+
+ state->memtupdeleted = 0;
+ state->memtupcount = 0;
+ state->tuples = 0;
+
+ /*
+ * Initial size of array must be more than ALLOCSET_SEPARATE_THRESHOLD;
+ * see comments in grow_memtuples().
+ */
+ state->memtupsize = Max(16384 / sizeof(void *),
+ ALLOCSET_SEPARATE_THRESHOLD / sizeof(void *) + 1);
+
+ state->growmemtuples = true;
+ state->memtuples = (void **) palloc(state->memtupsize * sizeof(void *));
+
+ USEMEM(state, GetMemoryChunkSpace(state->memtuples));
+
+ state->activeptr = 0;
+ state->readptrcount = 1;
+ state->readptrsize = 8; /* arbitrary */
+ state->readptrs = (TSReadPointer *)
+ palloc(state->readptrsize * sizeof(TSReadPointer));
+
+ state->readptrs[0].eflags = eflags;
+ state->readptrs[0].eof_reached = false;
+ state->readptrs[0].current = 0;
+
+ return state;
+}
+
+/*
+ * tuplestore_begin_heap
+ *
+ * Create a new tuplestore; other types of tuple stores (other than
+ * "heap" tuple stores, for heap tuples) are possible, but not presently
+ * implemented.
+ *
+ * randomAccess: if true, both forward and backward accesses to the
+ * tuple store are allowed.
+ *
+ * interXact: if true, the files used for on-disk storage persist beyond the
+ * end of the current transaction. NOTE: It's the caller's responsibility to
+ * create such a tuplestore in a memory context and resource owner that will
+ * also survive transaction boundaries, and to ensure the tuplestore is closed
+ * when it's no longer wanted.
+ *
+ * maxKBytes: how much data to store in memory (any data beyond this
+ * amount is paged to disk). When in doubt, use work_mem.
+ */
+Tuplestorestate *
+tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
+{
+ Tuplestorestate *state;
+ int eflags;
+
+ /*
+ * This interpretation of the meaning of randomAccess is compatible with
+ * the pre-8.3 behavior of tuplestores.
+ */
+ eflags = randomAccess ?
+ (EXEC_FLAG_BACKWARD | EXEC_FLAG_REWIND) :
+ (EXEC_FLAG_REWIND);
+
+ state = tuplestore_begin_common(eflags, interXact, maxKBytes);
+
+ state->copytup = copytup_heap;
+ state->writetup = writetup_heap;
+ state->readtup = readtup_heap;
+
+ return state;
+}
+
+/*
+ * tuplestore_set_eflags
+ *
+ * Set the capability flags for read pointer 0 at a finer grain than is
+ * allowed by tuplestore_begin_xxx. This must be called before inserting
+ * any data into the tuplestore.
+ *
+ * eflags is a bitmask following the meanings used for executor node
+ * startup flags (see executor.h). tuplestore pays attention to these bits:
+ * EXEC_FLAG_REWIND need rewind to start
+ * EXEC_FLAG_BACKWARD need backward fetch
+ * If tuplestore_set_eflags is not called, REWIND is allowed, and BACKWARD
+ * is set per "randomAccess" in the tuplestore_begin_xxx call.
+ *
+ * NOTE: setting BACKWARD without REWIND means the pointer can read backwards,
+ * but not further than the truncation point (the furthest-back read pointer
+ * position at the time of the last tuplestore_trim call).
+ */
+void
+tuplestore_set_eflags(Tuplestorestate *state, int eflags)
+{
+ int i;
+
+ if (state->status != TSS_INMEM || state->memtupcount != 0)
+ elog(ERROR, "too late to call tuplestore_set_eflags");
+
+ state->readptrs[0].eflags = eflags;
+ for (i = 1; i < state->readptrcount; i++)
+ eflags |= state->readptrs[i].eflags;
+ state->eflags = eflags;
+}
+
+/*
+ * tuplestore_alloc_read_pointer - allocate another read pointer.
+ *
+ * Returns the pointer's index.
+ *
+ * The new pointer initially copies the position of read pointer 0.
+ * It can have its own eflags, but if any data has been inserted into
+ * the tuplestore, these eflags must not represent an increase in
+ * requirements.
+ */
+int
+tuplestore_alloc_read_pointer(Tuplestorestate *state, int eflags)
+{
+ /* Check for possible increase of requirements */
+ if (state->status != TSS_INMEM || state->memtupcount != 0)
+ {
+ if ((state->eflags | eflags) != state->eflags)
+ elog(ERROR, "too late to require new tuplestore eflags");
+ }
+
+ /* Make room for another read pointer if needed */
+ if (state->readptrcount >= state->readptrsize)
+ {
+ int newcnt = state->readptrsize * 2;
+
+ state->readptrs = (TSReadPointer *)
+ repalloc(state->readptrs, newcnt * sizeof(TSReadPointer));
+ state->readptrsize = newcnt;
+ }
+
+ /* And set it up */
+ state->readptrs[state->readptrcount] = state->readptrs[0];
+ state->readptrs[state->readptrcount].eflags = eflags;
+
+ state->eflags |= eflags;
+
+ return state->readptrcount++;
+}
+
+/*
+ * tuplestore_clear
+ *
+ * Delete all the contents of a tuplestore, and reset its read pointers
+ * to the start.
+ */
+void
+tuplestore_clear(Tuplestorestate *state)
+{
+ int i;
+ TSReadPointer *readptr;
+
+ if (state->myfile)
+ BufFileClose(state->myfile);
+ state->myfile = NULL;
+ if (state->memtuples)
+ {
+ for (i = state->memtupdeleted; i < state->memtupcount; i++)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(state->memtuples[i]));
+ pfree(state->memtuples[i]);
+ }
+ }
+ state->status = TSS_INMEM;
+ state->truncated = false;
+ state->memtupdeleted = 0;
+ state->memtupcount = 0;
+ state->tuples = 0;
+ readptr = state->readptrs;
+ for (i = 0; i < state->readptrcount; readptr++, i++)
+ {
+ readptr->eof_reached = false;
+ readptr->current = 0;
+ }
+}
+
+/*
+ * tuplestore_end
+ *
+ * Release resources and clean up.
+ */
+void
+tuplestore_end(Tuplestorestate *state)
+{
+ int i;
+
+ if (state->myfile)
+ BufFileClose(state->myfile);
+ if (state->memtuples)
+ {
+ for (i = state->memtupdeleted; i < state->memtupcount; i++)
+ pfree(state->memtuples[i]);
+ pfree(state->memtuples);
+ }
+ pfree(state->readptrs);
+ pfree(state);
+}
+
+/*
+ * tuplestore_select_read_pointer - make the specified read pointer active
+ */
+void
+tuplestore_select_read_pointer(Tuplestorestate *state, int ptr)
+{
+ TSReadPointer *readptr;
+ TSReadPointer *oldptr;
+
+ Assert(ptr >= 0 && ptr < state->readptrcount);
+
+ /* No work if already active */
+ if (ptr == state->activeptr)
+ return;
+
+ readptr = &state->readptrs[ptr];
+ oldptr = &state->readptrs[state->activeptr];
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+ case TSS_WRITEFILE:
+ /* no work */
+ break;
+ case TSS_READFILE:
+
+ /*
+ * First, save the current read position in the pointer about to
+ * become inactive.
+ */
+ if (!oldptr->eof_reached)
+ BufFileTell(state->myfile,
+ &oldptr->file,
+ &oldptr->offset);
+
+ /*
+ * We have to make the temp file's seek position equal to the
+ * logical position of the new read pointer. In eof_reached
+ * state, that's the EOF, which we have available from the saved
+ * write position.
+ */
+ if (readptr->eof_reached)
+ {
+ if (BufFileSeek(state->myfile,
+ state->writepos_file,
+ state->writepos_offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ }
+ else
+ {
+ if (BufFileSeek(state->myfile,
+ readptr->file,
+ readptr->offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ }
+ break;
+ default:
+ elog(ERROR, "invalid tuplestore state");
+ break;
+ }
+
+ state->activeptr = ptr;
+}
+
+/*
+ * tuplestore_tuple_count
+ *
+ * Returns the number of tuples added since creation or the last
+ * tuplestore_clear().
+ */
+int64
+tuplestore_tuple_count(Tuplestorestate *state)
+{
+ return state->tuples;
+}
+
+/*
+ * tuplestore_ateof
+ *
+ * Returns the active read pointer's eof_reached state.
+ */
+bool
+tuplestore_ateof(Tuplestorestate *state)
+{
+ return state->readptrs[state->activeptr].eof_reached;
+}
+
+/*
+ * Grow the memtuples[] array, if possible within our memory constraint. We
+ * must not exceed INT_MAX tuples in memory or the caller-provided memory
+ * limit. Return true if we were able to enlarge the array, false if not.
+ *
+ * Normally, at each increment we double the size of the array. When doing
+ * that would exceed a limit, we attempt one last, smaller increase (and then
+ * clear the growmemtuples flag so we don't try any more). That allows us to
+ * use memory as fully as permitted; sticking to the pure doubling rule could
+ * result in almost half going unused. Because availMem moves around with
+ * tuple addition/removal, we need some rule to prevent making repeated small
+ * increases in memtupsize, which would just be useless thrashing. The
+ * growmemtuples flag accomplishes that and also prevents useless
+ * recalculations in this function.
+ */
+static bool
+grow_memtuples(Tuplestorestate *state)
+{
+ int newmemtupsize;
+ int memtupsize = state->memtupsize;
+ int64 memNowUsed = state->allowedMem - state->availMem;
+
+ /* Forget it if we've already maxed out memtuples, per comment above */
+ if (!state->growmemtuples)
+ return false;
+
+ /* Select new value of memtupsize */
+ if (memNowUsed <= state->availMem)
+ {
+ /*
+ * We've used no more than half of allowedMem; double our usage,
+ * clamping at INT_MAX tuples.
+ */
+ if (memtupsize < INT_MAX / 2)
+ newmemtupsize = memtupsize * 2;
+ else
+ {
+ newmemtupsize = INT_MAX;
+ state->growmemtuples = false;
+ }
+ }
+ else
+ {
+ /*
+ * This will be the last increment of memtupsize. Abandon doubling
+ * strategy and instead increase as much as we safely can.
+ *
+ * To stay within allowedMem, we can't increase memtupsize by more
+ * than availMem / sizeof(void *) elements. In practice, we want to
+ * increase it by considerably less, because we need to leave some
+ * space for the tuples to which the new array slots will refer. We
+ * assume the new tuples will be about the same size as the tuples
+ * we've already seen, and thus we can extrapolate from the space
+ * consumption so far to estimate an appropriate new size for the
+ * memtuples array. The optimal value might be higher or lower than
+ * this estimate, but it's hard to know that in advance. We again
+ * clamp at INT_MAX tuples.
+ *
+ * This calculation is safe against enlarging the array so much that
+ * LACKMEM becomes true, because the memory currently used includes
+ * the present array; thus, there would be enough allowedMem for the
+ * new array elements even if no other memory were currently used.
+ *
+ * We do the arithmetic in float8, because otherwise the product of
+ * memtupsize and allowedMem could overflow. Any inaccuracy in the
+ * result should be insignificant; but even if we computed a
+ * completely insane result, the checks below will prevent anything
+ * really bad from happening.
+ */
+ double grow_ratio;
+
+ grow_ratio = (double) state->allowedMem / (double) memNowUsed;
+ if (memtupsize * grow_ratio < INT_MAX)
+ newmemtupsize = (int) (memtupsize * grow_ratio);
+ else
+ newmemtupsize = INT_MAX;
+
+ /* We won't make any further enlargement attempts */
+ state->growmemtuples = false;
+ }
+
+ /* Must enlarge array by at least one element, else report failure */
+ if (newmemtupsize <= memtupsize)
+ goto noalloc;
+
+ /*
+ * On a 32-bit machine, allowedMem could exceed MaxAllocHugeSize. Clamp
+ * to ensure our request won't be rejected. Note that we can easily
+ * exhaust address space before facing this outcome. (This is presently
+ * impossible due to guc.c's MAX_KILOBYTES limitation on work_mem, but
+ * don't rely on that at this distance.)
+ */
+ if ((Size) newmemtupsize >= MaxAllocHugeSize / sizeof(void *))
+ {
+ newmemtupsize = (int) (MaxAllocHugeSize / sizeof(void *));
+ state->growmemtuples = false; /* can't grow any more */
+ }
+
+ /*
+ * We need to be sure that we do not cause LACKMEM to become true, else
+ * the space management algorithm will go nuts. The code above should
+ * never generate a dangerous request, but to be safe, check explicitly
+ * that the array growth fits within availMem. (We could still cause
+ * LACKMEM if the memory chunk overhead associated with the memtuples
+ * array were to increase. That shouldn't happen because we chose the
+ * initial array size large enough to ensure that palloc will be treating
+ * both old and new arrays as separate chunks. But we'll check LACKMEM
+ * explicitly below just in case.)
+ */
+ if (state->availMem < (int64) ((newmemtupsize - memtupsize) * sizeof(void *)))
+ goto noalloc;
+
+ /* OK, do it */
+ FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ state->memtupsize = newmemtupsize;
+ state->memtuples = (void **)
+ repalloc_huge(state->memtuples,
+ state->memtupsize * sizeof(void *));
+ USEMEM(state, GetMemoryChunkSpace(state->memtuples));
+ if (LACKMEM(state))
+ elog(ERROR, "unexpected out-of-memory situation in tuplestore");
+ return true;
+
+noalloc:
+ /* If for any reason we didn't realloc, shut off future attempts */
+ state->growmemtuples = false;
+ return false;
+}
+
+/*
+ * Accept one tuple and append it to the tuplestore.
+ *
+ * Note that the input tuple is always copied; the caller need not save it.
+ *
+ * If the active read pointer is currently "at EOF", it remains so (the read
+ * pointer implicitly advances along with the write pointer); otherwise the
+ * read pointer is unchanged. Non-active read pointers do not move, which
+ * means they are certain to not be "at EOF" immediately after puttuple.
+ * This curious-seeming behavior is for the convenience of nodeMaterial.c and
+ * nodeCtescan.c, which would otherwise need to do extra pointer repositioning
+ * steps.
+ *
+ * tuplestore_puttupleslot() is a convenience routine to collect data from
+ * a TupleTableSlot without an extra copy operation.
+ */
+void
+tuplestore_puttupleslot(Tuplestorestate *state,
+ TupleTableSlot *slot)
+{
+ MinimalTuple tuple;
+ MemoryContext oldcxt = MemoryContextSwitchTo(state->context);
+
+ /*
+ * Form a MinimalTuple in working memory
+ */
+ tuple = ExecCopySlotMinimalTuple(slot);
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+
+ tuplestore_puttuple_common(state, (void *) tuple);
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * "Standard" case to copy from a HeapTuple. This is actually now somewhat
+ * deprecated, but not worth getting rid of in view of the number of callers.
+ */
+void
+tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
+{
+ MemoryContext oldcxt = MemoryContextSwitchTo(state->context);
+
+ /*
+ * Copy the tuple. (Must do this even in WRITEFILE case. Note that
+ * COPYTUP includes USEMEM, so we needn't do that here.)
+ */
+ tuple = COPYTUP(state, tuple);
+
+ tuplestore_puttuple_common(state, (void *) tuple);
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+/*
+ * Similar to tuplestore_puttuple(), but work from values + nulls arrays.
+ * This avoids an extra tuple-construction operation.
+ */
+void
+tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc,
+ Datum *values, bool *isnull)
+{
+ MinimalTuple tuple;
+ MemoryContext oldcxt = MemoryContextSwitchTo(state->context);
+
+ tuple = heap_form_minimal_tuple(tdesc, values, isnull);
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+
+ tuplestore_puttuple_common(state, (void *) tuple);
+
+ MemoryContextSwitchTo(oldcxt);
+}
+
+static void
+tuplestore_puttuple_common(Tuplestorestate *state, void *tuple)
+{
+ TSReadPointer *readptr;
+ int i;
+ ResourceOwner oldowner;
+
+ state->tuples++;
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+
+ /*
+ * Update read pointers as needed; see API spec above.
+ */
+ readptr = state->readptrs;
+ for (i = 0; i < state->readptrcount; readptr++, i++)
+ {
+ if (readptr->eof_reached && i != state->activeptr)
+ {
+ readptr->eof_reached = false;
+ readptr->current = state->memtupcount;
+ }
+ }
+
+ /*
+ * Grow the array as needed. Note that we try to grow the array
+ * when there is still one free slot remaining --- if we fail,
+ * there'll still be room to store the incoming tuple, and then
+ * we'll switch to tape-based operation.
+ */
+ if (state->memtupcount >= state->memtupsize - 1)
+ {
+ (void) grow_memtuples(state);
+ Assert(state->memtupcount < state->memtupsize);
+ }
+
+ /* Stash the tuple in the in-memory array */
+ state->memtuples[state->memtupcount++] = tuple;
+
+ /*
+ * Done if we still fit in available memory and have array slots.
+ */
+ if (state->memtupcount < state->memtupsize && !LACKMEM(state))
+ return;
+
+ /*
+ * Nope; time to switch to tape-based operation. Make sure that
+ * the temp file(s) are created in suitable temp tablespaces.
+ */
+ PrepareTempTablespaces();
+
+ /* associate the file with the store's resource owner */
+ oldowner = CurrentResourceOwner;
+ CurrentResourceOwner = state->resowner;
+
+ state->myfile = BufFileCreateTemp(state->interXact);
+
+ CurrentResourceOwner = oldowner;
+
+ /*
+ * Freeze the decision about whether trailing length words will be
+ * used. We can't change this choice once data is on tape, even
+ * though callers might drop the requirement.
+ */
+ state->backward = (state->eflags & EXEC_FLAG_BACKWARD) != 0;
+ state->status = TSS_WRITEFILE;
+ dumptuples(state);
+ break;
+ case TSS_WRITEFILE:
+
+ /*
+ * Update read pointers as needed; see API spec above. Note:
+ * BufFileTell is quite cheap, so not worth trying to avoid
+ * multiple calls.
+ */
+ readptr = state->readptrs;
+ for (i = 0; i < state->readptrcount; readptr++, i++)
+ {
+ if (readptr->eof_reached && i != state->activeptr)
+ {
+ readptr->eof_reached = false;
+ BufFileTell(state->myfile,
+ &readptr->file,
+ &readptr->offset);
+ }
+ }
+
+ WRITETUP(state, tuple);
+ break;
+ case TSS_READFILE:
+
+ /*
+ * Switch from reading to writing.
+ */
+ if (!state->readptrs[state->activeptr].eof_reached)
+ BufFileTell(state->myfile,
+ &state->readptrs[state->activeptr].file,
+ &state->readptrs[state->activeptr].offset);
+ if (BufFileSeek(state->myfile,
+ state->writepos_file, state->writepos_offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ state->status = TSS_WRITEFILE;
+
+ /*
+ * Update read pointers as needed; see API spec above.
+ */
+ readptr = state->readptrs;
+ for (i = 0; i < state->readptrcount; readptr++, i++)
+ {
+ if (readptr->eof_reached && i != state->activeptr)
+ {
+ readptr->eof_reached = false;
+ readptr->file = state->writepos_file;
+ readptr->offset = state->writepos_offset;
+ }
+ }
+
+ WRITETUP(state, tuple);
+ break;
+ default:
+ elog(ERROR, "invalid tuplestore state");
+ break;
+ }
+}
+
+/*
+ * Fetch the next tuple in either forward or back direction.
+ * Returns NULL if no more tuples. If should_free is set, the
+ * caller must pfree the returned tuple when done with it.
+ *
+ * Backward scan is only allowed if randomAccess was set true or
+ * EXEC_FLAG_BACKWARD was specified to tuplestore_set_eflags().
+ */
+static void *
+tuplestore_gettuple(Tuplestorestate *state, bool forward,
+ bool *should_free)
+{
+ TSReadPointer *readptr = &state->readptrs[state->activeptr];
+ unsigned int tuplen;
+ void *tup;
+
+ Assert(forward || (readptr->eflags & EXEC_FLAG_BACKWARD));
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+ *should_free = false;
+ if (forward)
+ {
+ if (readptr->eof_reached)
+ return NULL;
+ if (readptr->current < state->memtupcount)
+ {
+ /* We have another tuple, so return it */
+ return state->memtuples[readptr->current++];
+ }
+ readptr->eof_reached = true;
+ return NULL;
+ }
+ else
+ {
+ /*
+ * if all tuples are fetched already then we return last
+ * tuple, else tuple before last returned.
+ */
+ if (readptr->eof_reached)
+ {
+ readptr->current = state->memtupcount;
+ readptr->eof_reached = false;
+ }
+ else
+ {
+ if (readptr->current <= state->memtupdeleted)
+ {
+ Assert(!state->truncated);
+ return NULL;
+ }
+ readptr->current--; /* last returned tuple */
+ }
+ if (readptr->current <= state->memtupdeleted)
+ {
+ Assert(!state->truncated);
+ return NULL;
+ }
+ return state->memtuples[readptr->current - 1];
+ }
+ break;
+
+ case TSS_WRITEFILE:
+ /* Skip state change if we'll just return NULL */
+ if (readptr->eof_reached && forward)
+ return NULL;
+
+ /*
+ * Switch from writing to reading.
+ */
+ BufFileTell(state->myfile,
+ &state->writepos_file, &state->writepos_offset);
+ if (!readptr->eof_reached)
+ if (BufFileSeek(state->myfile,
+ readptr->file, readptr->offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ state->status = TSS_READFILE;
+ /* FALLTHROUGH */
+
+ case TSS_READFILE:
+ *should_free = true;
+ if (forward)
+ {
+ if ((tuplen = getlen(state, true)) != 0)
+ {
+ tup = READTUP(state, tuplen);
+ return tup;
+ }
+ else
+ {
+ readptr->eof_reached = true;
+ return NULL;
+ }
+ }
+
+ /*
+ * Backward.
+ *
+ * if all tuples are fetched already then we return last tuple,
+ * else tuple before last returned.
+ *
+ * Back up to fetch previously-returned tuple's ending length
+ * word. If seek fails, assume we are at start of file.
+ */
+ if (BufFileSeek(state->myfile, 0, -(long) sizeof(unsigned int),
+ SEEK_CUR) != 0)
+ {
+ /* even a failed backwards fetch gets you out of eof state */
+ readptr->eof_reached = false;
+ Assert(!state->truncated);
+ return NULL;
+ }
+ tuplen = getlen(state, false);
+
+ if (readptr->eof_reached)
+ {
+ readptr->eof_reached = false;
+ /* We will return the tuple returned before returning NULL */
+ }
+ else
+ {
+ /*
+ * Back up to get ending length word of tuple before it.
+ */
+ if (BufFileSeek(state->myfile, 0,
+ -(long) (tuplen + 2 * sizeof(unsigned int)),
+ SEEK_CUR) != 0)
+ {
+ /*
+ * If that fails, presumably the prev tuple is the first
+ * in the file. Back up so that it becomes next to read
+ * in forward direction (not obviously right, but that is
+ * what in-memory case does).
+ */
+ if (BufFileSeek(state->myfile, 0,
+ -(long) (tuplen + sizeof(unsigned int)),
+ SEEK_CUR) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ Assert(!state->truncated);
+ return NULL;
+ }
+ tuplen = getlen(state, false);
+ }
+
+ /*
+ * Now we have the length of the prior tuple, back up and read it.
+ * Note: READTUP expects we are positioned after the initial
+ * length word of the tuple, so back up to that point.
+ */
+ if (BufFileSeek(state->myfile, 0,
+ -(long) tuplen,
+ SEEK_CUR) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ tup = READTUP(state, tuplen);
+ return tup;
+
+ default:
+ elog(ERROR, "invalid tuplestore state");
+ return NULL; /* keep compiler quiet */
+ }
+}
+
+/*
+ * tuplestore_gettupleslot - exported function to fetch a MinimalTuple
+ *
+ * If successful, put tuple in slot and return true; else, clear the slot
+ * and return false.
+ *
+ * If copy is true, the slot receives a copied tuple (allocated in current
+ * memory context) that will stay valid regardless of future manipulations of
+ * the tuplestore's state. If copy is false, the slot may just receive a
+ * pointer to a tuple held within the tuplestore. The latter is more
+ * efficient but the slot contents may be corrupted if additional writes to
+ * the tuplestore occur. (If using tuplestore_trim, see comments therein.)
+ */
+bool
+tuplestore_gettupleslot(Tuplestorestate *state, bool forward,
+ bool copy, TupleTableSlot *slot)
+{
+ MinimalTuple tuple;
+ bool should_free;
+
+ tuple = (MinimalTuple) tuplestore_gettuple(state, forward, &should_free);
+
+ if (tuple)
+ {
+ if (copy && !should_free)
+ {
+ tuple = heap_copy_minimal_tuple(tuple);
+ should_free = true;
+ }
+ ExecStoreMinimalTuple(tuple, slot, should_free);
+ return true;
+ }
+ else
+ {
+ ExecClearTuple(slot);
+ return false;
+ }
+}
+
+/*
+ * tuplestore_advance - exported function to adjust position without fetching
+ *
+ * We could optimize this case to avoid palloc/pfree overhead, but for the
+ * moment it doesn't seem worthwhile.
+ */
+bool
+tuplestore_advance(Tuplestorestate *state, bool forward)
+{
+ void *tuple;
+ bool should_free;
+
+ tuple = tuplestore_gettuple(state, forward, &should_free);
+
+ if (tuple)
+ {
+ if (should_free)
+ pfree(tuple);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+/*
+ * Advance over N tuples in either forward or back direction,
+ * without returning any data. N<=0 is a no-op.
+ * Returns true if successful, false if ran out of tuples.
+ */
+bool
+tuplestore_skiptuples(Tuplestorestate *state, int64 ntuples, bool forward)
+{
+ TSReadPointer *readptr = &state->readptrs[state->activeptr];
+
+ Assert(forward || (readptr->eflags & EXEC_FLAG_BACKWARD));
+
+ if (ntuples <= 0)
+ return true;
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+ if (forward)
+ {
+ if (readptr->eof_reached)
+ return false;
+ if (state->memtupcount - readptr->current >= ntuples)
+ {
+ readptr->current += ntuples;
+ return true;
+ }
+ readptr->current = state->memtupcount;
+ readptr->eof_reached = true;
+ return false;
+ }
+ else
+ {
+ if (readptr->eof_reached)
+ {
+ readptr->current = state->memtupcount;
+ readptr->eof_reached = false;
+ ntuples--;
+ }
+ if (readptr->current - state->memtupdeleted > ntuples)
+ {
+ readptr->current -= ntuples;
+ return true;
+ }
+ Assert(!state->truncated);
+ readptr->current = state->memtupdeleted;
+ return false;
+ }
+ break;
+
+ default:
+ /* We don't currently try hard to optimize other cases */
+ while (ntuples-- > 0)
+ {
+ void *tuple;
+ bool should_free;
+
+ tuple = tuplestore_gettuple(state, forward, &should_free);
+
+ if (tuple == NULL)
+ return false;
+ if (should_free)
+ pfree(tuple);
+ CHECK_FOR_INTERRUPTS();
+ }
+ return true;
+ }
+}
+
+/*
+ * dumptuples - remove tuples from memory and write to tape
+ *
+ * As a side effect, we must convert each read pointer's position from
+ * "current" to file/offset format. But eof_reached pointers don't
+ * need to change state.
+ */
+static void
+dumptuples(Tuplestorestate *state)
+{
+ int i;
+
+ for (i = state->memtupdeleted;; i++)
+ {
+ TSReadPointer *readptr = state->readptrs;
+ int j;
+
+ for (j = 0; j < state->readptrcount; readptr++, j++)
+ {
+ if (i == readptr->current && !readptr->eof_reached)
+ BufFileTell(state->myfile,
+ &readptr->file, &readptr->offset);
+ }
+ if (i >= state->memtupcount)
+ break;
+ WRITETUP(state, state->memtuples[i]);
+ }
+ state->memtupdeleted = 0;
+ state->memtupcount = 0;
+}
+
+/*
+ * tuplestore_rescan - rewind the active read pointer to start
+ */
+void
+tuplestore_rescan(Tuplestorestate *state)
+{
+ TSReadPointer *readptr = &state->readptrs[state->activeptr];
+
+ Assert(readptr->eflags & EXEC_FLAG_REWIND);
+ Assert(!state->truncated);
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+ readptr->eof_reached = false;
+ readptr->current = 0;
+ break;
+ case TSS_WRITEFILE:
+ readptr->eof_reached = false;
+ readptr->file = 0;
+ readptr->offset = 0L;
+ break;
+ case TSS_READFILE:
+ readptr->eof_reached = false;
+ if (BufFileSeek(state->myfile, 0, 0L, SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ break;
+ default:
+ elog(ERROR, "invalid tuplestore state");
+ break;
+ }
+}
+
+/*
+ * tuplestore_copy_read_pointer - copy a read pointer's state to another
+ */
+void
+tuplestore_copy_read_pointer(Tuplestorestate *state,
+ int srcptr, int destptr)
+{
+ TSReadPointer *sptr = &state->readptrs[srcptr];
+ TSReadPointer *dptr = &state->readptrs[destptr];
+
+ Assert(srcptr >= 0 && srcptr < state->readptrcount);
+ Assert(destptr >= 0 && destptr < state->readptrcount);
+
+ /* Assigning to self is a no-op */
+ if (srcptr == destptr)
+ return;
+
+ if (dptr->eflags != sptr->eflags)
+ {
+ /* Possible change of overall eflags, so copy and then recompute */
+ int eflags;
+ int i;
+
+ *dptr = *sptr;
+ eflags = state->readptrs[0].eflags;
+ for (i = 1; i < state->readptrcount; i++)
+ eflags |= state->readptrs[i].eflags;
+ state->eflags = eflags;
+ }
+ else
+ *dptr = *sptr;
+
+ switch (state->status)
+ {
+ case TSS_INMEM:
+ case TSS_WRITEFILE:
+ /* no work */
+ break;
+ case TSS_READFILE:
+
+ /*
+ * This case is a bit tricky since the active read pointer's
+ * position corresponds to the seek point, not what is in its
+ * variables. Assigning to the active requires a seek, and
+ * assigning from the active requires a tell, except when
+ * eof_reached.
+ */
+ if (destptr == state->activeptr)
+ {
+ if (dptr->eof_reached)
+ {
+ if (BufFileSeek(state->myfile,
+ state->writepos_file,
+ state->writepos_offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ }
+ else
+ {
+ if (BufFileSeek(state->myfile,
+ dptr->file, dptr->offset,
+ SEEK_SET) != 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not seek in tuplestore temporary file")));
+ }
+ }
+ else if (srcptr == state->activeptr)
+ {
+ if (!dptr->eof_reached)
+ BufFileTell(state->myfile,
+ &dptr->file,
+ &dptr->offset);
+ }
+ break;
+ default:
+ elog(ERROR, "invalid tuplestore state");
+ break;
+ }
+}
+
+/*
+ * tuplestore_trim - remove all no-longer-needed tuples
+ *
+ * Calling this function authorizes the tuplestore to delete all tuples
+ * before the oldest read pointer, if no read pointer is marked as requiring
+ * REWIND capability.
+ *
+ * Note: this is obviously safe if no pointer has BACKWARD capability either.
+ * If a pointer is marked as BACKWARD but not REWIND capable, it means that
+ * the pointer can be moved backward but not before the oldest other read
+ * pointer.
+ */
+void
+tuplestore_trim(Tuplestorestate *state)
+{
+ int oldest;
+ int nremove;
+ int i;
+
+ /*
+ * Truncation is disallowed if any read pointer requires rewind
+ * capability.
+ */
+ if (state->eflags & EXEC_FLAG_REWIND)
+ return;
+
+ /*
+ * We don't bother trimming temp files since it usually would mean more
+ * work than just letting them sit in kernel buffers until they age out.
+ */
+ if (state->status != TSS_INMEM)
+ return;
+
+ /* Find the oldest read pointer */
+ oldest = state->memtupcount;
+ for (i = 0; i < state->readptrcount; i++)
+ {
+ if (!state->readptrs[i].eof_reached)
+ oldest = Min(oldest, state->readptrs[i].current);
+ }
+
+ /*
+ * Note: you might think we could remove all the tuples before the oldest
+ * "current", since that one is the next to be returned. However, since
+ * tuplestore_gettuple returns a direct pointer to our internal copy of
+ * the tuple, it's likely that the caller has still got the tuple just
+ * before "current" referenced in a slot. So we keep one extra tuple
+ * before the oldest "current". (Strictly speaking, we could require such
+ * callers to use the "copy" flag to tuplestore_gettupleslot, but for
+ * efficiency we allow this one case to not use "copy".)
+ */
+ nremove = oldest - 1;
+ if (nremove <= 0)
+ return; /* nothing to do */
+
+ Assert(nremove >= state->memtupdeleted);
+ Assert(nremove <= state->memtupcount);
+
+ /* Release no-longer-needed tuples */
+ for (i = state->memtupdeleted; i < nremove; i++)
+ {
+ FREEMEM(state, GetMemoryChunkSpace(state->memtuples[i]));
+ pfree(state->memtuples[i]);
+ state->memtuples[i] = NULL;
+ }
+ state->memtupdeleted = nremove;
+
+ /* mark tuplestore as truncated (used for Assert crosschecks only) */
+ state->truncated = true;
+
+ /*
+ * If nremove is less than 1/8th memtupcount, just stop here, leaving the
+ * "deleted" slots as NULL. This prevents us from expending O(N^2) time
+ * repeatedly memmove-ing a large pointer array. The worst case space
+ * wastage is pretty small, since it's just pointers and not whole tuples.
+ */
+ if (nremove < state->memtupcount / 8)
+ return;
+
+ /*
+ * Slide the array down and readjust pointers.
+ *
+ * In mergejoin's current usage, it's demonstrable that there will always
+ * be exactly one non-removed tuple; so optimize that case.
+ */
+ if (nremove + 1 == state->memtupcount)
+ state->memtuples[0] = state->memtuples[nremove];
+ else
+ memmove(state->memtuples, state->memtuples + nremove,
+ (state->memtupcount - nremove) * sizeof(void *));
+
+ state->memtupdeleted = 0;
+ state->memtupcount -= nremove;
+ for (i = 0; i < state->readptrcount; i++)
+ {
+ if (!state->readptrs[i].eof_reached)
+ state->readptrs[i].current -= nremove;
+ }
+}
+
+/*
+ * tuplestore_in_memory
+ *
+ * Returns true if the tuplestore has not spilled to disk.
+ *
+ * XXX exposing this is a violation of modularity ... should get rid of it.
+ */
+bool
+tuplestore_in_memory(Tuplestorestate *state)
+{
+ return (state->status == TSS_INMEM);
+}
+
+
+/*
+ * Tape interface routines
+ */
+
+static unsigned int
+getlen(Tuplestorestate *state, bool eofOK)
+{
+ unsigned int len;
+ size_t nbytes;
+
+ nbytes = BufFileRead(state->myfile, (void *) &len, sizeof(len));
+ if (nbytes == sizeof(len))
+ return len;
+ if (nbytes != 0 || !eofOK)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from tuplestore temporary file: read only %zu of %zu bytes",
+ nbytes, sizeof(len))));
+ return 0;
+}
+
+
+/*
+ * Routines specialized for HeapTuple case
+ *
+ * The stored form is actually a MinimalTuple, but for largely historical
+ * reasons we allow COPYTUP to work from a HeapTuple.
+ *
+ * Since MinimalTuple already has length in its first word, we don't need
+ * to write that separately.
+ */
+
+static void *
+copytup_heap(Tuplestorestate *state, void *tup)
+{
+ MinimalTuple tuple;
+
+ tuple = minimal_tuple_from_heap_tuple((HeapTuple) tup);
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+ return (void *) tuple;
+}
+
+static void
+writetup_heap(Tuplestorestate *state, void *tup)
+{
+ MinimalTuple tuple = (MinimalTuple) tup;
+
+ /* the part of the MinimalTuple we'll write: */
+ char *tupbody = (char *) tuple + MINIMAL_TUPLE_DATA_OFFSET;
+ unsigned int tupbodylen = tuple->t_len - MINIMAL_TUPLE_DATA_OFFSET;
+
+ /* total on-disk footprint: */
+ unsigned int tuplen = tupbodylen + sizeof(int);
+
+ BufFileWrite(state->myfile, (void *) &tuplen, sizeof(tuplen));
+ BufFileWrite(state->myfile, (void *) tupbody, tupbodylen);
+ if (state->backward) /* need trailing length word? */
+ BufFileWrite(state->myfile, (void *) &tuplen, sizeof(tuplen));
+
+ FREEMEM(state, GetMemoryChunkSpace(tuple));
+ heap_free_minimal_tuple(tuple);
+}
+
+static void *
+readtup_heap(Tuplestorestate *state, unsigned int len)
+{
+ unsigned int tupbodylen = len - sizeof(int);
+ unsigned int tuplen = tupbodylen + MINIMAL_TUPLE_DATA_OFFSET;
+ MinimalTuple tuple = (MinimalTuple) palloc(tuplen);
+ char *tupbody = (char *) tuple + MINIMAL_TUPLE_DATA_OFFSET;
+ size_t nread;
+
+ USEMEM(state, GetMemoryChunkSpace(tuple));
+ /* read in the tuple proper */
+ tuple->t_len = tuplen;
+ nread = BufFileRead(state->myfile, (void *) tupbody, tupbodylen);
+ if (nread != (size_t) tupbodylen)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from tuplestore temporary file: read only %zu of %zu bytes",
+ nread, (size_t) tupbodylen)));
+ if (state->backward) /* need trailing length word? */
+ {
+ nread = BufFileRead(state->myfile, (void *) &tuplen, sizeof(tuplen));
+ if (nread != sizeof(tuplen))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not read from tuplestore temporary file: read only %zu of %zu bytes",
+ nread, sizeof(tuplen))));
+ }
+ return (void *) tuple;
+}
diff --git a/src/backend/utils/time/Makefile b/src/backend/utils/time/Makefile
new file mode 100644
index 0000000..380dd2f
--- /dev/null
+++ b/src/backend/utils/time/Makefile
@@ -0,0 +1,19 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for utils/time
+#
+# IDENTIFICATION
+# src/backend/utils/time/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/utils/time
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ combocid.o \
+ snapmgr.o
+
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c
new file mode 100644
index 0000000..6613dc0
--- /dev/null
+++ b/src/backend/utils/time/combocid.c
@@ -0,0 +1,364 @@
+/*-------------------------------------------------------------------------
+ *
+ * combocid.c
+ * Combo command ID support routines
+ *
+ * Before version 8.3, HeapTupleHeaderData had separate fields for cmin
+ * and cmax. To reduce the header size, cmin and cmax are now overlayed
+ * in the same field in the header. That usually works because you rarely
+ * insert and delete a tuple in the same transaction, and we don't need
+ * either field to remain valid after the originating transaction exits.
+ * To make it work when the inserting transaction does delete the tuple,
+ * we create a "combo" command ID and store that in the tuple header
+ * instead of cmin and cmax. The combo command ID can be mapped to the
+ * real cmin and cmax using a backend-private array, which is managed by
+ * this module.
+ *
+ * To allow reusing existing combo CIDs, we also keep a hash table that
+ * maps cmin,cmax pairs to combo CIDs. This keeps the data structure size
+ * reasonable in most cases, since the number of unique pairs used by any
+ * one transaction is likely to be small.
+ *
+ * With a 32-bit combo command id we can represent 2^32 distinct cmin,cmax
+ * combinations. In the most perverse case where each command deletes a tuple
+ * generated by every previous command, the number of combo command ids
+ * required for N commands is N*(N+1)/2. That means that in the worst case,
+ * that's enough for 92682 commands. In practice, you'll run out of memory
+ * and/or disk space way before you reach that limit.
+ *
+ * The array and hash table are kept in TopTransactionContext, and are
+ * destroyed at the end of each transaction.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/time/combocid.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/htup_details.h"
+#include "access/xact.h"
+#include "miscadmin.h"
+#include "storage/shmem.h"
+#include "utils/combocid.h"
+#include "utils/hsearch.h"
+#include "utils/memutils.h"
+
+/* Hash table to lookup combo CIDs by cmin and cmax */
+static HTAB *comboHash = NULL;
+
+/* Key and entry structures for the hash table */
+typedef struct
+{
+ CommandId cmin;
+ CommandId cmax;
+} ComboCidKeyData;
+
+typedef ComboCidKeyData *ComboCidKey;
+
+typedef struct
+{
+ ComboCidKeyData key;
+ CommandId combocid;
+} ComboCidEntryData;
+
+typedef ComboCidEntryData *ComboCidEntry;
+
+/* Initial size of the hash table */
+#define CCID_HASH_SIZE 100
+
+
+/*
+ * An array of cmin,cmax pairs, indexed by combo command id.
+ * To convert a combo CID to cmin and cmax, you do a simple array lookup.
+ */
+static ComboCidKey comboCids = NULL;
+static int usedComboCids = 0; /* number of elements in comboCids */
+static int sizeComboCids = 0; /* allocated size of array */
+
+/* Initial size of the array */
+#define CCID_ARRAY_SIZE 100
+
+
+/* prototypes for internal functions */
+static CommandId GetComboCommandId(CommandId cmin, CommandId cmax);
+static CommandId GetRealCmin(CommandId combocid);
+static CommandId GetRealCmax(CommandId combocid);
+
+
+/**** External API ****/
+
+/*
+ * GetCmin and GetCmax assert that they are only called in situations where
+ * they make sense, that is, can deliver a useful answer. If you have
+ * reason to examine a tuple's t_cid field from a transaction other than
+ * the originating one, use HeapTupleHeaderGetRawCommandId() directly.
+ */
+
+CommandId
+HeapTupleHeaderGetCmin(HeapTupleHeader tup)
+{
+ CommandId cid = HeapTupleHeaderGetRawCommandId(tup);
+
+ Assert(!(tup->t_infomask & HEAP_MOVED));
+ Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(tup)));
+
+ if (tup->t_infomask & HEAP_COMBOCID)
+ return GetRealCmin(cid);
+ else
+ return cid;
+}
+
+CommandId
+HeapTupleHeaderGetCmax(HeapTupleHeader tup)
+{
+ CommandId cid = HeapTupleHeaderGetRawCommandId(tup);
+
+ Assert(!(tup->t_infomask & HEAP_MOVED));
+
+ /*
+ * Because GetUpdateXid() performs memory allocations if xmax is a
+ * multixact we can't Assert() if we're inside a critical section. This
+ * weakens the check, but not using GetCmax() inside one would complicate
+ * things too much.
+ */
+ Assert(CritSectionCount > 0 ||
+ TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tup)));
+
+ if (tup->t_infomask & HEAP_COMBOCID)
+ return GetRealCmax(cid);
+ else
+ return cid;
+}
+
+/*
+ * Given a tuple we are about to delete, determine the correct value to store
+ * into its t_cid field.
+ *
+ * If we don't need a combo CID, *cmax is unchanged and *iscombo is set to
+ * false. If we do need one, *cmax is replaced by a combo CID and *iscombo
+ * is set to true.
+ *
+ * The reason this is separate from the actual HeapTupleHeaderSetCmax()
+ * operation is that this could fail due to out-of-memory conditions. Hence
+ * we need to do this before entering the critical section that actually
+ * changes the tuple in shared buffers.
+ */
+void
+HeapTupleHeaderAdjustCmax(HeapTupleHeader tup,
+ CommandId *cmax,
+ bool *iscombo)
+{
+ /*
+ * If we're marking a tuple deleted that was inserted by (any
+ * subtransaction of) our transaction, we need to use a combo command id.
+ * Test for HeapTupleHeaderXminCommitted() first, because it's cheaper
+ * than a TransactionIdIsCurrentTransactionId call.
+ */
+ if (!HeapTupleHeaderXminCommitted(tup) &&
+ TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tup)))
+ {
+ CommandId cmin = HeapTupleHeaderGetCmin(tup);
+
+ *cmax = GetComboCommandId(cmin, *cmax);
+ *iscombo = true;
+ }
+ else
+ {
+ *iscombo = false;
+ }
+}
+
+/*
+ * Combo command ids are only interesting to the inserting and deleting
+ * transaction, so we can forget about them at the end of transaction.
+ */
+void
+AtEOXact_ComboCid(void)
+{
+ /*
+ * Don't bother to pfree. These are allocated in TopTransactionContext, so
+ * they're going to go away at the end of transaction anyway.
+ */
+ comboHash = NULL;
+
+ comboCids = NULL;
+ usedComboCids = 0;
+ sizeComboCids = 0;
+}
+
+
+/**** Internal routines ****/
+
+/*
+ * Get a combo command id that maps to cmin and cmax.
+ *
+ * We try to reuse old combo command ids when possible.
+ */
+static CommandId
+GetComboCommandId(CommandId cmin, CommandId cmax)
+{
+ CommandId combocid;
+ ComboCidKeyData key;
+ ComboCidEntry entry;
+ bool found;
+
+ /*
+ * Create the hash table and array the first time we need to use combo
+ * cids in the transaction.
+ */
+ if (comboHash == NULL)
+ {
+ HASHCTL hash_ctl;
+
+ /* Make array first; existence of hash table asserts array exists */
+ comboCids = (ComboCidKeyData *)
+ MemoryContextAlloc(TopTransactionContext,
+ sizeof(ComboCidKeyData) * CCID_ARRAY_SIZE);
+ sizeComboCids = CCID_ARRAY_SIZE;
+ usedComboCids = 0;
+
+ hash_ctl.keysize = sizeof(ComboCidKeyData);
+ hash_ctl.entrysize = sizeof(ComboCidEntryData);
+ hash_ctl.hcxt = TopTransactionContext;
+
+ comboHash = hash_create("Combo CIDs",
+ CCID_HASH_SIZE,
+ &hash_ctl,
+ HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
+ }
+
+ /*
+ * Grow the array if there's not at least one free slot. We must do this
+ * before possibly entering a new hashtable entry, else failure to
+ * repalloc would leave a corrupt hashtable entry behind.
+ */
+ if (usedComboCids >= sizeComboCids)
+ {
+ int newsize = sizeComboCids * 2;
+
+ comboCids = (ComboCidKeyData *)
+ repalloc(comboCids, sizeof(ComboCidKeyData) * newsize);
+ sizeComboCids = newsize;
+ }
+
+ /* Lookup or create a hash entry with the desired cmin/cmax */
+
+ /* We assume there is no struct padding in ComboCidKeyData! */
+ key.cmin = cmin;
+ key.cmax = cmax;
+ entry = (ComboCidEntry) hash_search(comboHash,
+ (void *) &key,
+ HASH_ENTER,
+ &found);
+
+ if (found)
+ {
+ /* Reuse an existing combo CID */
+ return entry->combocid;
+ }
+
+ /* We have to create a new combo CID; we already made room in the array */
+ combocid = usedComboCids;
+
+ comboCids[combocid].cmin = cmin;
+ comboCids[combocid].cmax = cmax;
+ usedComboCids++;
+
+ entry->combocid = combocid;
+
+ return combocid;
+}
+
+static CommandId
+GetRealCmin(CommandId combocid)
+{
+ Assert(combocid < usedComboCids);
+ return comboCids[combocid].cmin;
+}
+
+static CommandId
+GetRealCmax(CommandId combocid)
+{
+ Assert(combocid < usedComboCids);
+ return comboCids[combocid].cmax;
+}
+
+/*
+ * Estimate the amount of space required to serialize the current combo CID
+ * state.
+ */
+Size
+EstimateComboCIDStateSpace(void)
+{
+ Size size;
+
+ /* Add space required for saving usedComboCids */
+ size = sizeof(int);
+
+ /* Add space required for saving ComboCidKeyData */
+ size = add_size(size, mul_size(sizeof(ComboCidKeyData), usedComboCids));
+
+ return size;
+}
+
+/*
+ * Serialize the combo CID state into the memory, beginning at start_address.
+ * maxsize should be at least as large as the value returned by
+ * EstimateComboCIDStateSpace.
+ */
+void
+SerializeComboCIDState(Size maxsize, char *start_address)
+{
+ char *endptr;
+
+ /* First, we store the number of currently-existing combo CIDs. */
+ *(int *) start_address = usedComboCids;
+
+ /* If maxsize is too small, throw an error. */
+ endptr = start_address + sizeof(int) +
+ (sizeof(ComboCidKeyData) * usedComboCids);
+ if (endptr < start_address || endptr > start_address + maxsize)
+ elog(ERROR, "not enough space to serialize ComboCID state");
+
+ /* Now, copy the actual cmin/cmax pairs. */
+ if (usedComboCids > 0)
+ memcpy(start_address + sizeof(int), comboCids,
+ (sizeof(ComboCidKeyData) * usedComboCids));
+}
+
+/*
+ * Read the combo CID state at the specified address and initialize this
+ * backend with the same combo CIDs. This is only valid in a backend that
+ * currently has no combo CIDs (and only makes sense if the transaction state
+ * is serialized and restored as well).
+ */
+void
+RestoreComboCIDState(char *comboCIDstate)
+{
+ int num_elements;
+ ComboCidKeyData *keydata;
+ int i;
+ CommandId cid;
+
+ Assert(!comboCids && !comboHash);
+
+ /* First, we retrieve the number of combo CIDs that were serialized. */
+ num_elements = *(int *) comboCIDstate;
+ keydata = (ComboCidKeyData *) (comboCIDstate + sizeof(int));
+
+ /* Use GetComboCommandId to restore each combo CID. */
+ for (i = 0; i < num_elements; i++)
+ {
+ cid = GetComboCommandId(keydata[i].cmin, keydata[i].cmax);
+
+ /* Verify that we got the expected answer. */
+ if (cid != i)
+ elog(ERROR, "unexpected command ID while restoring combo CIDs");
+ }
+}
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
new file mode 100644
index 0000000..5bc2a15
--- /dev/null
+++ b/src/backend/utils/time/snapmgr.c
@@ -0,0 +1,2394 @@
+/*-------------------------------------------------------------------------
+ *
+ * snapmgr.c
+ * PostgreSQL snapshot manager
+ *
+ * We keep track of snapshots in two ways: those "registered" by resowner.c,
+ * and the "active snapshot" stack. All snapshots in either of them live in
+ * persistent memory. When a snapshot is no longer in any of these lists
+ * (tracked by separate refcounts on each snapshot), its memory can be freed.
+ *
+ * The FirstXactSnapshot, if any, is treated a bit specially: we increment its
+ * regd_count and list it in RegisteredSnapshots, but this reference is not
+ * tracked by a resource owner. We used to use the TopTransactionResourceOwner
+ * to track this snapshot reference, but that introduces logical circularity
+ * and thus makes it impossible to clean up in a sane fashion. It's better to
+ * handle this reference as an internally-tracked registration, so that this
+ * module is entirely lower-level than ResourceOwners.
+ *
+ * Likewise, any snapshots that have been exported by pg_export_snapshot
+ * have regd_count = 1 and are listed in RegisteredSnapshots, but are not
+ * tracked by any resource owner.
+ *
+ * Likewise, the CatalogSnapshot is listed in RegisteredSnapshots when it
+ * is valid, but is not tracked by any resource owner.
+ *
+ * The same is true for historic snapshots used during logical decoding,
+ * their lifetime is managed separately (as they live longer than one xact.c
+ * transaction).
+ *
+ * These arrangements let us reset MyProc->xmin when there are no snapshots
+ * referenced by this transaction, and advance it when the one with oldest
+ * Xmin is no longer referenced. For simplicity however, only registered
+ * snapshots not active snapshots participate in tracking which one is oldest;
+ * we don't try to change MyProc->xmin except when the active-snapshot
+ * stack is empty.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/utils/time/snapmgr.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/subtrans.h"
+#include "access/transam.h"
+#include "access/xact.h"
+#include "access/xlog.h"
+#include "catalog/catalog.h"
+#include "datatype/timestamp.h"
+#include "lib/pairingheap.h"
+#include "miscadmin.h"
+#include "storage/predicate.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "storage/sinval.h"
+#include "storage/sinvaladt.h"
+#include "storage/spin.h"
+#include "utils/builtins.h"
+#include "utils/memutils.h"
+#include "utils/old_snapshot.h"
+#include "utils/rel.h"
+#include "utils/resowner_private.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+#include "utils/timestamp.h"
+
+
+/*
+ * GUC parameters
+ */
+int old_snapshot_threshold; /* number of minutes, -1 disables */
+
+volatile OldSnapshotControlData *oldSnapshotControl;
+
+
+/*
+ * CurrentSnapshot points to the only snapshot taken in transaction-snapshot
+ * mode, and to the latest one taken in a read-committed transaction.
+ * SecondarySnapshot is a snapshot that's always up-to-date as of the current
+ * instant, even in transaction-snapshot mode. It should only be used for
+ * special-purpose code (say, RI checking.) CatalogSnapshot points to an
+ * MVCC snapshot intended to be used for catalog scans; we must invalidate it
+ * whenever a system catalog change occurs.
+ *
+ * These SnapshotData structs are static to simplify memory allocation
+ * (see the hack in GetSnapshotData to avoid repeated malloc/free).
+ */
+static SnapshotData CurrentSnapshotData = {SNAPSHOT_MVCC};
+static SnapshotData SecondarySnapshotData = {SNAPSHOT_MVCC};
+SnapshotData CatalogSnapshotData = {SNAPSHOT_MVCC};
+SnapshotData SnapshotSelfData = {SNAPSHOT_SELF};
+SnapshotData SnapshotAnyData = {SNAPSHOT_ANY};
+
+/* Pointers to valid snapshots */
+static Snapshot CurrentSnapshot = NULL;
+static Snapshot SecondarySnapshot = NULL;
+static Snapshot CatalogSnapshot = NULL;
+static Snapshot HistoricSnapshot = NULL;
+
+/*
+ * These are updated by GetSnapshotData. We initialize them this way
+ * for the convenience of TransactionIdIsInProgress: even in bootstrap
+ * mode, we don't want it to say that BootstrapTransactionId is in progress.
+ */
+TransactionId TransactionXmin = FirstNormalTransactionId;
+TransactionId RecentXmin = FirstNormalTransactionId;
+
+/* (table, ctid) => (cmin, cmax) mapping during timetravel */
+static HTAB *tuplecid_data = NULL;
+
+/*
+ * Elements of the active snapshot stack.
+ *
+ * Each element here accounts for exactly one active_count on SnapshotData.
+ *
+ * NB: the code assumes that elements in this list are in non-increasing
+ * order of as_level; also, the list must be NULL-terminated.
+ */
+typedef struct ActiveSnapshotElt
+{
+ Snapshot as_snap;
+ int as_level;
+ struct ActiveSnapshotElt *as_next;
+} ActiveSnapshotElt;
+
+/* Top of the stack of active snapshots */
+static ActiveSnapshotElt *ActiveSnapshot = NULL;
+
+/* Bottom of the stack of active snapshots */
+static ActiveSnapshotElt *OldestActiveSnapshot = NULL;
+
+/*
+ * Currently registered Snapshots. Ordered in a heap by xmin, so that we can
+ * quickly find the one with lowest xmin, to advance our MyProc->xmin.
+ */
+static int xmin_cmp(const pairingheap_node *a, const pairingheap_node *b,
+ void *arg);
+
+static pairingheap RegisteredSnapshots = {&xmin_cmp, NULL, NULL};
+
+/* first GetTransactionSnapshot call in a transaction? */
+bool FirstSnapshotSet = false;
+
+/*
+ * Remember the serializable transaction snapshot, if any. We cannot trust
+ * FirstSnapshotSet in combination with IsolationUsesXactSnapshot(), because
+ * GUC may be reset before us, changing the value of IsolationUsesXactSnapshot.
+ */
+static Snapshot FirstXactSnapshot = NULL;
+
+/* Define pathname of exported-snapshot files */
+#define SNAPSHOT_EXPORT_DIR "pg_snapshots"
+
+/* Structure holding info about exported snapshot. */
+typedef struct ExportedSnapshot
+{
+ char *snapfile;
+ Snapshot snapshot;
+} ExportedSnapshot;
+
+/* Current xact's exported snapshots (a list of ExportedSnapshot structs) */
+static List *exportedSnapshots = NIL;
+
+/* Prototypes for local functions */
+static TimestampTz AlignTimestampToMinuteBoundary(TimestampTz ts);
+static Snapshot CopySnapshot(Snapshot snapshot);
+static void FreeSnapshot(Snapshot snapshot);
+static void SnapshotResetXmin(void);
+
+/*
+ * Snapshot fields to be serialized.
+ *
+ * Only these fields need to be sent to the cooperating backend; the
+ * remaining ones can (and must) be set by the receiver upon restore.
+ */
+typedef struct SerializedSnapshotData
+{
+ TransactionId xmin;
+ TransactionId xmax;
+ uint32 xcnt;
+ int32 subxcnt;
+ bool suboverflowed;
+ bool takenDuringRecovery;
+ CommandId curcid;
+ TimestampTz whenTaken;
+ XLogRecPtr lsn;
+} SerializedSnapshotData;
+
+Size
+SnapMgrShmemSize(void)
+{
+ Size size;
+
+ size = offsetof(OldSnapshotControlData, xid_by_minute);
+ if (old_snapshot_threshold > 0)
+ size = add_size(size, mul_size(sizeof(TransactionId),
+ OLD_SNAPSHOT_TIME_MAP_ENTRIES));
+
+ return size;
+}
+
+/*
+ * Initialize for managing old snapshot detection.
+ */
+void
+SnapMgrInit(void)
+{
+ bool found;
+
+ /*
+ * Create or attach to the OldSnapshotControlData structure.
+ */
+ oldSnapshotControl = (volatile OldSnapshotControlData *)
+ ShmemInitStruct("OldSnapshotControlData",
+ SnapMgrShmemSize(), &found);
+
+ if (!found)
+ {
+ SpinLockInit(&oldSnapshotControl->mutex_current);
+ oldSnapshotControl->current_timestamp = 0;
+ SpinLockInit(&oldSnapshotControl->mutex_latest_xmin);
+ oldSnapshotControl->latest_xmin = InvalidTransactionId;
+ oldSnapshotControl->next_map_update = 0;
+ SpinLockInit(&oldSnapshotControl->mutex_threshold);
+ oldSnapshotControl->threshold_timestamp = 0;
+ oldSnapshotControl->threshold_xid = InvalidTransactionId;
+ oldSnapshotControl->head_offset = 0;
+ oldSnapshotControl->head_timestamp = 0;
+ oldSnapshotControl->count_used = 0;
+ }
+}
+
+/*
+ * GetTransactionSnapshot
+ * Get the appropriate snapshot for a new query in a transaction.
+ *
+ * Note that the return value may point at static storage that will be modified
+ * by future calls and by CommandCounterIncrement(). Callers should call
+ * RegisterSnapshot or PushActiveSnapshot on the returned snap if it is to be
+ * used very long.
+ */
+Snapshot
+GetTransactionSnapshot(void)
+{
+ /*
+ * Return historic snapshot if doing logical decoding. We'll never need a
+ * non-historic transaction snapshot in this (sub-)transaction, so there's
+ * no need to be careful to set one up for later calls to
+ * GetTransactionSnapshot().
+ */
+ if (HistoricSnapshotActive())
+ {
+ Assert(!FirstSnapshotSet);
+ return HistoricSnapshot;
+ }
+
+ /* First call in transaction? */
+ if (!FirstSnapshotSet)
+ {
+ /*
+ * Don't allow catalog snapshot to be older than xact snapshot. Must
+ * do this first to allow the empty-heap Assert to succeed.
+ */
+ InvalidateCatalogSnapshot();
+
+ Assert(pairingheap_is_empty(&RegisteredSnapshots));
+ Assert(FirstXactSnapshot == NULL);
+
+ if (IsInParallelMode())
+ elog(ERROR,
+ "cannot take query snapshot during a parallel operation");
+
+ /*
+ * In transaction-snapshot mode, the first snapshot must live until
+ * end of xact regardless of what the caller does with it, so we must
+ * make a copy of it rather than returning CurrentSnapshotData
+ * directly. Furthermore, if we're running in serializable mode,
+ * predicate.c needs to wrap the snapshot fetch in its own processing.
+ */
+ if (IsolationUsesXactSnapshot())
+ {
+ /* First, create the snapshot in CurrentSnapshotData */
+ if (IsolationIsSerializable())
+ CurrentSnapshot = GetSerializableTransactionSnapshot(&CurrentSnapshotData);
+ else
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+ /* Make a saved copy */
+ CurrentSnapshot = CopySnapshot(CurrentSnapshot);
+ FirstXactSnapshot = CurrentSnapshot;
+ /* Mark it as "registered" in FirstXactSnapshot */
+ FirstXactSnapshot->regd_count++;
+ pairingheap_add(&RegisteredSnapshots, &FirstXactSnapshot->ph_node);
+ }
+ else
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+
+ FirstSnapshotSet = true;
+ return CurrentSnapshot;
+ }
+
+ if (IsolationUsesXactSnapshot())
+ return CurrentSnapshot;
+
+ /* Don't allow catalog snapshot to be older than xact snapshot. */
+ InvalidateCatalogSnapshot();
+
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+
+ return CurrentSnapshot;
+}
+
+/*
+ * GetLatestSnapshot
+ * Get a snapshot that is up-to-date as of the current instant,
+ * even if we are executing in transaction-snapshot mode.
+ */
+Snapshot
+GetLatestSnapshot(void)
+{
+ /*
+ * We might be able to relax this, but nothing that could otherwise work
+ * needs it.
+ */
+ if (IsInParallelMode())
+ elog(ERROR,
+ "cannot update SecondarySnapshot during a parallel operation");
+
+ /*
+ * So far there are no cases requiring support for GetLatestSnapshot()
+ * during logical decoding, but it wouldn't be hard to add if required.
+ */
+ Assert(!HistoricSnapshotActive());
+
+ /* If first call in transaction, go ahead and set the xact snapshot */
+ if (!FirstSnapshotSet)
+ return GetTransactionSnapshot();
+
+ SecondarySnapshot = GetSnapshotData(&SecondarySnapshotData);
+
+ return SecondarySnapshot;
+}
+
+/*
+ * GetOldestSnapshot
+ *
+ * Get the transaction's oldest known snapshot, as judged by the LSN.
+ * Will return NULL if there are no active or registered snapshots.
+ */
+Snapshot
+GetOldestSnapshot(void)
+{
+ Snapshot OldestRegisteredSnapshot = NULL;
+ XLogRecPtr RegisteredLSN = InvalidXLogRecPtr;
+
+ if (!pairingheap_is_empty(&RegisteredSnapshots))
+ {
+ OldestRegisteredSnapshot = pairingheap_container(SnapshotData, ph_node,
+ pairingheap_first(&RegisteredSnapshots));
+ RegisteredLSN = OldestRegisteredSnapshot->lsn;
+ }
+
+ if (OldestActiveSnapshot != NULL)
+ {
+ XLogRecPtr ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
+
+ if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
+ return OldestActiveSnapshot->as_snap;
+ }
+
+ return OldestRegisteredSnapshot;
+}
+
+/*
+ * GetCatalogSnapshot
+ * Get a snapshot that is sufficiently up-to-date for scan of the
+ * system catalog with the specified OID.
+ */
+Snapshot
+GetCatalogSnapshot(Oid relid)
+{
+ /*
+ * Return historic snapshot while we're doing logical decoding, so we can
+ * see the appropriate state of the catalog.
+ *
+ * This is the primary reason for needing to reset the system caches after
+ * finishing decoding.
+ */
+ if (HistoricSnapshotActive())
+ return HistoricSnapshot;
+
+ return GetNonHistoricCatalogSnapshot(relid);
+}
+
+/*
+ * GetNonHistoricCatalogSnapshot
+ * Get a snapshot that is sufficiently up-to-date for scan of the system
+ * catalog with the specified OID, even while historic snapshots are set
+ * up.
+ */
+Snapshot
+GetNonHistoricCatalogSnapshot(Oid relid)
+{
+ /*
+ * If the caller is trying to scan a relation that has no syscache, no
+ * catcache invalidations will be sent when it is updated. For a few key
+ * relations, snapshot invalidations are sent instead. If we're trying to
+ * scan a relation for which neither catcache nor snapshot invalidations
+ * are sent, we must refresh the snapshot every time.
+ */
+ if (CatalogSnapshot &&
+ !RelationInvalidatesSnapshotsOnly(relid) &&
+ !RelationHasSysCache(relid))
+ InvalidateCatalogSnapshot();
+
+ if (CatalogSnapshot == NULL)
+ {
+ /* Get new snapshot. */
+ CatalogSnapshot = GetSnapshotData(&CatalogSnapshotData);
+
+ /*
+ * Make sure the catalog snapshot will be accounted for in decisions
+ * about advancing PGPROC->xmin. We could apply RegisterSnapshot, but
+ * that would result in making a physical copy, which is overkill; and
+ * it would also create a dependency on some resource owner, which we
+ * do not want for reasons explained at the head of this file. Instead
+ * just shove the CatalogSnapshot into the pairing heap manually. This
+ * has to be reversed in InvalidateCatalogSnapshot, of course.
+ *
+ * NB: it had better be impossible for this to throw error, since the
+ * CatalogSnapshot pointer is already valid.
+ */
+ pairingheap_add(&RegisteredSnapshots, &CatalogSnapshot->ph_node);
+ }
+
+ return CatalogSnapshot;
+}
+
+/*
+ * InvalidateCatalogSnapshot
+ * Mark the current catalog snapshot, if any, as invalid
+ *
+ * We could change this API to allow the caller to provide more fine-grained
+ * invalidation details, so that a change to relation A wouldn't prevent us
+ * from using our cached snapshot to scan relation B, but so far there's no
+ * evidence that the CPU cycles we spent tracking such fine details would be
+ * well-spent.
+ */
+void
+InvalidateCatalogSnapshot(void)
+{
+ if (CatalogSnapshot)
+ {
+ pairingheap_remove(&RegisteredSnapshots, &CatalogSnapshot->ph_node);
+ CatalogSnapshot = NULL;
+ SnapshotResetXmin();
+ }
+}
+
+/*
+ * InvalidateCatalogSnapshotConditionally
+ * Drop catalog snapshot if it's the only one we have
+ *
+ * This is called when we are about to wait for client input, so we don't
+ * want to continue holding the catalog snapshot if it might mean that the
+ * global xmin horizon can't advance. However, if there are other snapshots
+ * still active or registered, the catalog snapshot isn't likely to be the
+ * oldest one, so we might as well keep it.
+ */
+void
+InvalidateCatalogSnapshotConditionally(void)
+{
+ if (CatalogSnapshot &&
+ ActiveSnapshot == NULL &&
+ pairingheap_is_singular(&RegisteredSnapshots))
+ InvalidateCatalogSnapshot();
+}
+
+/*
+ * SnapshotSetCommandId
+ * Propagate CommandCounterIncrement into the static snapshots, if set
+ */
+void
+SnapshotSetCommandId(CommandId curcid)
+{
+ if (!FirstSnapshotSet)
+ return;
+
+ if (CurrentSnapshot)
+ CurrentSnapshot->curcid = curcid;
+ if (SecondarySnapshot)
+ SecondarySnapshot->curcid = curcid;
+ /* Should we do the same with CatalogSnapshot? */
+}
+
+/*
+ * SetTransactionSnapshot
+ * Set the transaction's snapshot from an imported MVCC snapshot.
+ *
+ * Note that this is very closely tied to GetTransactionSnapshot --- it
+ * must take care of all the same considerations as the first-snapshot case
+ * in GetTransactionSnapshot.
+ */
+static void
+SetTransactionSnapshot(Snapshot sourcesnap, VirtualTransactionId *sourcevxid,
+ int sourcepid, PGPROC *sourceproc)
+{
+ /* Caller should have checked this already */
+ Assert(!FirstSnapshotSet);
+
+ /* Better do this to ensure following Assert succeeds. */
+ InvalidateCatalogSnapshot();
+
+ Assert(pairingheap_is_empty(&RegisteredSnapshots));
+ Assert(FirstXactSnapshot == NULL);
+ Assert(!HistoricSnapshotActive());
+
+ /*
+ * Even though we are not going to use the snapshot it computes, we must
+ * call GetSnapshotData, for two reasons: (1) to be sure that
+ * CurrentSnapshotData's XID arrays have been allocated, and (2) to update
+ * the state for GlobalVis*.
+ */
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+
+ /*
+ * Now copy appropriate fields from the source snapshot.
+ */
+ CurrentSnapshot->xmin = sourcesnap->xmin;
+ CurrentSnapshot->xmax = sourcesnap->xmax;
+ CurrentSnapshot->xcnt = sourcesnap->xcnt;
+ Assert(sourcesnap->xcnt <= GetMaxSnapshotXidCount());
+ if (sourcesnap->xcnt > 0)
+ memcpy(CurrentSnapshot->xip, sourcesnap->xip,
+ sourcesnap->xcnt * sizeof(TransactionId));
+ CurrentSnapshot->subxcnt = sourcesnap->subxcnt;
+ Assert(sourcesnap->subxcnt <= GetMaxSnapshotSubxidCount());
+ if (sourcesnap->subxcnt > 0)
+ memcpy(CurrentSnapshot->subxip, sourcesnap->subxip,
+ sourcesnap->subxcnt * sizeof(TransactionId));
+ CurrentSnapshot->suboverflowed = sourcesnap->suboverflowed;
+ CurrentSnapshot->takenDuringRecovery = sourcesnap->takenDuringRecovery;
+ /* NB: curcid should NOT be copied, it's a local matter */
+
+ CurrentSnapshot->snapXactCompletionCount = 0;
+
+ /*
+ * Now we have to fix what GetSnapshotData did with MyProc->xmin and
+ * TransactionXmin. There is a race condition: to make sure we are not
+ * causing the global xmin to go backwards, we have to test that the
+ * source transaction is still running, and that has to be done
+ * atomically. So let procarray.c do it.
+ *
+ * Note: in serializable mode, predicate.c will do this a second time. It
+ * doesn't seem worth contorting the logic here to avoid two calls,
+ * especially since it's not clear that predicate.c *must* do this.
+ */
+ if (sourceproc != NULL)
+ {
+ if (!ProcArrayInstallRestoredXmin(CurrentSnapshot->xmin, sourceproc))
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("could not import the requested snapshot"),
+ errdetail("The source transaction is not running anymore.")));
+ }
+ else if (!ProcArrayInstallImportedXmin(CurrentSnapshot->xmin, sourcevxid))
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("could not import the requested snapshot"),
+ errdetail("The source process with PID %d is not running anymore.",
+ sourcepid)));
+
+ /*
+ * In transaction-snapshot mode, the first snapshot must live until end of
+ * xact, so we must make a copy of it. Furthermore, if we're running in
+ * serializable mode, predicate.c needs to do its own processing.
+ */
+ if (IsolationUsesXactSnapshot())
+ {
+ if (IsolationIsSerializable())
+ SetSerializableTransactionSnapshot(CurrentSnapshot, sourcevxid,
+ sourcepid);
+ /* Make a saved copy */
+ CurrentSnapshot = CopySnapshot(CurrentSnapshot);
+ FirstXactSnapshot = CurrentSnapshot;
+ /* Mark it as "registered" in FirstXactSnapshot */
+ FirstXactSnapshot->regd_count++;
+ pairingheap_add(&RegisteredSnapshots, &FirstXactSnapshot->ph_node);
+ }
+
+ FirstSnapshotSet = true;
+}
+
+/*
+ * CopySnapshot
+ * Copy the given snapshot.
+ *
+ * The copy is palloc'd in TopTransactionContext and has initial refcounts set
+ * to 0. The returned snapshot has the copied flag set.
+ */
+static Snapshot
+CopySnapshot(Snapshot snapshot)
+{
+ Snapshot newsnap;
+ Size subxipoff;
+ Size size;
+
+ Assert(snapshot != InvalidSnapshot);
+
+ /* We allocate any XID arrays needed in the same palloc block. */
+ size = subxipoff = sizeof(SnapshotData) +
+ snapshot->xcnt * sizeof(TransactionId);
+ if (snapshot->subxcnt > 0)
+ size += snapshot->subxcnt * sizeof(TransactionId);
+
+ newsnap = (Snapshot) MemoryContextAlloc(TopTransactionContext, size);
+ memcpy(newsnap, snapshot, sizeof(SnapshotData));
+
+ newsnap->regd_count = 0;
+ newsnap->active_count = 0;
+ newsnap->copied = true;
+ newsnap->snapXactCompletionCount = 0;
+
+ /* setup XID array */
+ if (snapshot->xcnt > 0)
+ {
+ newsnap->xip = (TransactionId *) (newsnap + 1);
+ memcpy(newsnap->xip, snapshot->xip,
+ snapshot->xcnt * sizeof(TransactionId));
+ }
+ else
+ newsnap->xip = NULL;
+
+ /*
+ * Setup subXID array. Don't bother to copy it if it had overflowed,
+ * though, because it's not used anywhere in that case. Except if it's a
+ * snapshot taken during recovery; all the top-level XIDs are in subxip as
+ * well in that case, so we mustn't lose them.
+ */
+ if (snapshot->subxcnt > 0 &&
+ (!snapshot->suboverflowed || snapshot->takenDuringRecovery))
+ {
+ newsnap->subxip = (TransactionId *) ((char *) newsnap + subxipoff);
+ memcpy(newsnap->subxip, snapshot->subxip,
+ snapshot->subxcnt * sizeof(TransactionId));
+ }
+ else
+ newsnap->subxip = NULL;
+
+ return newsnap;
+}
+
+/*
+ * FreeSnapshot
+ * Free the memory associated with a snapshot.
+ */
+static void
+FreeSnapshot(Snapshot snapshot)
+{
+ Assert(snapshot->regd_count == 0);
+ Assert(snapshot->active_count == 0);
+ Assert(snapshot->copied);
+
+ pfree(snapshot);
+}
+
+/*
+ * PushActiveSnapshot
+ * Set the given snapshot as the current active snapshot
+ *
+ * If the passed snapshot is a statically-allocated one, or it is possibly
+ * subject to a future command counter update, create a new long-lived copy
+ * with active refcount=1. Otherwise, only increment the refcount.
+ */
+void
+PushActiveSnapshot(Snapshot snap)
+{
+ PushActiveSnapshotWithLevel(snap, GetCurrentTransactionNestLevel());
+}
+
+/*
+ * PushActiveSnapshotWithLevel
+ * Set the given snapshot as the current active snapshot
+ *
+ * Same as PushActiveSnapshot except that caller can specify the
+ * transaction nesting level that "owns" the snapshot. This level
+ * must not be deeper than the current top of the snapshot stack.
+ */
+void
+PushActiveSnapshotWithLevel(Snapshot snap, int snap_level)
+{
+ ActiveSnapshotElt *newactive;
+
+ Assert(snap != InvalidSnapshot);
+ Assert(ActiveSnapshot == NULL || snap_level >= ActiveSnapshot->as_level);
+
+ newactive = MemoryContextAlloc(TopTransactionContext, sizeof(ActiveSnapshotElt));
+
+ /*
+ * Checking SecondarySnapshot is probably useless here, but it seems
+ * better to be sure.
+ */
+ if (snap == CurrentSnapshot || snap == SecondarySnapshot || !snap->copied)
+ newactive->as_snap = CopySnapshot(snap);
+ else
+ newactive->as_snap = snap;
+
+ newactive->as_next = ActiveSnapshot;
+ newactive->as_level = snap_level;
+
+ newactive->as_snap->active_count++;
+
+ ActiveSnapshot = newactive;
+ if (OldestActiveSnapshot == NULL)
+ OldestActiveSnapshot = ActiveSnapshot;
+}
+
+/*
+ * PushCopiedSnapshot
+ * As above, except forcibly copy the presented snapshot.
+ *
+ * This should be used when the ActiveSnapshot has to be modifiable, for
+ * example if the caller intends to call UpdateActiveSnapshotCommandId.
+ * The new snapshot will be released when popped from the stack.
+ */
+void
+PushCopiedSnapshot(Snapshot snapshot)
+{
+ PushActiveSnapshot(CopySnapshot(snapshot));
+}
+
+/*
+ * UpdateActiveSnapshotCommandId
+ *
+ * Update the current CID of the active snapshot. This can only be applied
+ * to a snapshot that is not referenced elsewhere.
+ */
+void
+UpdateActiveSnapshotCommandId(void)
+{
+ CommandId save_curcid,
+ curcid;
+
+ Assert(ActiveSnapshot != NULL);
+ Assert(ActiveSnapshot->as_snap->active_count == 1);
+ Assert(ActiveSnapshot->as_snap->regd_count == 0);
+
+ /*
+ * Don't allow modification of the active snapshot during parallel
+ * operation. We share the snapshot to worker backends at the beginning
+ * of parallel operation, so any change to the snapshot can lead to
+ * inconsistencies. We have other defenses against
+ * CommandCounterIncrement, but there are a few places that call this
+ * directly, so we put an additional guard here.
+ */
+ save_curcid = ActiveSnapshot->as_snap->curcid;
+ curcid = GetCurrentCommandId(false);
+ if (IsInParallelMode() && save_curcid != curcid)
+ elog(ERROR, "cannot modify commandid in active snapshot during a parallel operation");
+ ActiveSnapshot->as_snap->curcid = curcid;
+}
+
+/*
+ * PopActiveSnapshot
+ *
+ * Remove the topmost snapshot from the active snapshot stack, decrementing the
+ * reference count, and free it if this was the last reference.
+ */
+void
+PopActiveSnapshot(void)
+{
+ ActiveSnapshotElt *newstack;
+
+ newstack = ActiveSnapshot->as_next;
+
+ Assert(ActiveSnapshot->as_snap->active_count > 0);
+
+ ActiveSnapshot->as_snap->active_count--;
+
+ if (ActiveSnapshot->as_snap->active_count == 0 &&
+ ActiveSnapshot->as_snap->regd_count == 0)
+ FreeSnapshot(ActiveSnapshot->as_snap);
+
+ pfree(ActiveSnapshot);
+ ActiveSnapshot = newstack;
+ if (ActiveSnapshot == NULL)
+ OldestActiveSnapshot = NULL;
+
+ SnapshotResetXmin();
+}
+
+/*
+ * GetActiveSnapshot
+ * Return the topmost snapshot in the Active stack.
+ */
+Snapshot
+GetActiveSnapshot(void)
+{
+ Assert(ActiveSnapshot != NULL);
+
+ return ActiveSnapshot->as_snap;
+}
+
+/*
+ * ActiveSnapshotSet
+ * Return whether there is at least one snapshot in the Active stack
+ */
+bool
+ActiveSnapshotSet(void)
+{
+ return ActiveSnapshot != NULL;
+}
+
+/*
+ * RegisterSnapshot
+ * Register a snapshot as being in use by the current resource owner
+ *
+ * If InvalidSnapshot is passed, it is not registered.
+ */
+Snapshot
+RegisterSnapshot(Snapshot snapshot)
+{
+ if (snapshot == InvalidSnapshot)
+ return InvalidSnapshot;
+
+ return RegisterSnapshotOnOwner(snapshot, CurrentResourceOwner);
+}
+
+/*
+ * RegisterSnapshotOnOwner
+ * As above, but use the specified resource owner
+ */
+Snapshot
+RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner)
+{
+ Snapshot snap;
+
+ if (snapshot == InvalidSnapshot)
+ return InvalidSnapshot;
+
+ /* Static snapshot? Create a persistent copy */
+ snap = snapshot->copied ? snapshot : CopySnapshot(snapshot);
+
+ /* and tell resowner.c about it */
+ ResourceOwnerEnlargeSnapshots(owner);
+ snap->regd_count++;
+ ResourceOwnerRememberSnapshot(owner, snap);
+
+ if (snap->regd_count == 1)
+ pairingheap_add(&RegisteredSnapshots, &snap->ph_node);
+
+ return snap;
+}
+
+/*
+ * UnregisterSnapshot
+ *
+ * Decrement the reference count of a snapshot, remove the corresponding
+ * reference from CurrentResourceOwner, and free the snapshot if no more
+ * references remain.
+ */
+void
+UnregisterSnapshot(Snapshot snapshot)
+{
+ if (snapshot == NULL)
+ return;
+
+ UnregisterSnapshotFromOwner(snapshot, CurrentResourceOwner);
+}
+
+/*
+ * UnregisterSnapshotFromOwner
+ * As above, but use the specified resource owner
+ */
+void
+UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner)
+{
+ if (snapshot == NULL)
+ return;
+
+ Assert(snapshot->regd_count > 0);
+ Assert(!pairingheap_is_empty(&RegisteredSnapshots));
+
+ ResourceOwnerForgetSnapshot(owner, snapshot);
+
+ snapshot->regd_count--;
+ if (snapshot->regd_count == 0)
+ pairingheap_remove(&RegisteredSnapshots, &snapshot->ph_node);
+
+ if (snapshot->regd_count == 0 && snapshot->active_count == 0)
+ {
+ FreeSnapshot(snapshot);
+ SnapshotResetXmin();
+ }
+}
+
+/*
+ * Comparison function for RegisteredSnapshots heap. Snapshots are ordered
+ * by xmin, so that the snapshot with smallest xmin is at the top.
+ */
+static int
+xmin_cmp(const pairingheap_node *a, const pairingheap_node *b, void *arg)
+{
+ const SnapshotData *asnap = pairingheap_const_container(SnapshotData, ph_node, a);
+ const SnapshotData *bsnap = pairingheap_const_container(SnapshotData, ph_node, b);
+
+ if (TransactionIdPrecedes(asnap->xmin, bsnap->xmin))
+ return 1;
+ else if (TransactionIdFollows(asnap->xmin, bsnap->xmin))
+ return -1;
+ else
+ return 0;
+}
+
+/*
+ * SnapshotResetXmin
+ *
+ * If there are no more snapshots, we can reset our PGPROC->xmin to
+ * InvalidTransactionId. Note we can do this without locking because we assume
+ * that storing an Xid is atomic.
+ *
+ * Even if there are some remaining snapshots, we may be able to advance our
+ * PGPROC->xmin to some degree. This typically happens when a portal is
+ * dropped. For efficiency, we only consider recomputing PGPROC->xmin when
+ * the active snapshot stack is empty; this allows us not to need to track
+ * which active snapshot is oldest.
+ *
+ * Note: it's tempting to use GetOldestSnapshot() here so that we can include
+ * active snapshots in the calculation. However, that compares by LSN not
+ * xmin so it's not entirely clear that it's the same thing. Also, we'd be
+ * critically dependent on the assumption that the bottommost active snapshot
+ * stack entry has the oldest xmin. (Current uses of GetOldestSnapshot() are
+ * not actually critical, but this would be.)
+ */
+static void
+SnapshotResetXmin(void)
+{
+ Snapshot minSnapshot;
+
+ if (ActiveSnapshot != NULL)
+ return;
+
+ if (pairingheap_is_empty(&RegisteredSnapshots))
+ {
+ MyProc->xmin = InvalidTransactionId;
+ return;
+ }
+
+ minSnapshot = pairingheap_container(SnapshotData, ph_node,
+ pairingheap_first(&RegisteredSnapshots));
+
+ if (TransactionIdPrecedes(MyProc->xmin, minSnapshot->xmin))
+ MyProc->xmin = minSnapshot->xmin;
+}
+
+/*
+ * AtSubCommit_Snapshot
+ */
+void
+AtSubCommit_Snapshot(int level)
+{
+ ActiveSnapshotElt *active;
+
+ /*
+ * Relabel the active snapshots set in this subtransaction as though they
+ * are owned by the parent subxact.
+ */
+ for (active = ActiveSnapshot; active != NULL; active = active->as_next)
+ {
+ if (active->as_level < level)
+ break;
+ active->as_level = level - 1;
+ }
+}
+
+/*
+ * AtSubAbort_Snapshot
+ * Clean up snapshots after a subtransaction abort
+ */
+void
+AtSubAbort_Snapshot(int level)
+{
+ /* Forget the active snapshots set by this subtransaction */
+ while (ActiveSnapshot && ActiveSnapshot->as_level >= level)
+ {
+ ActiveSnapshotElt *next;
+
+ next = ActiveSnapshot->as_next;
+
+ /*
+ * Decrement the snapshot's active count. If it's still registered or
+ * marked as active by an outer subtransaction, we can't free it yet.
+ */
+ Assert(ActiveSnapshot->as_snap->active_count >= 1);
+ ActiveSnapshot->as_snap->active_count -= 1;
+
+ if (ActiveSnapshot->as_snap->active_count == 0 &&
+ ActiveSnapshot->as_snap->regd_count == 0)
+ FreeSnapshot(ActiveSnapshot->as_snap);
+
+ /* and free the stack element */
+ pfree(ActiveSnapshot);
+
+ ActiveSnapshot = next;
+ if (ActiveSnapshot == NULL)
+ OldestActiveSnapshot = NULL;
+ }
+
+ SnapshotResetXmin();
+}
+
+/*
+ * AtEOXact_Snapshot
+ * Snapshot manager's cleanup function for end of transaction
+ */
+void
+AtEOXact_Snapshot(bool isCommit, bool resetXmin)
+{
+ /*
+ * In transaction-snapshot mode we must release our privately-managed
+ * reference to the transaction snapshot. We must remove it from
+ * RegisteredSnapshots to keep the check below happy. But we don't bother
+ * to do FreeSnapshot, for two reasons: the memory will go away with
+ * TopTransactionContext anyway, and if someone has left the snapshot
+ * stacked as active, we don't want the code below to be chasing through a
+ * dangling pointer.
+ */
+ if (FirstXactSnapshot != NULL)
+ {
+ Assert(FirstXactSnapshot->regd_count > 0);
+ Assert(!pairingheap_is_empty(&RegisteredSnapshots));
+ pairingheap_remove(&RegisteredSnapshots, &FirstXactSnapshot->ph_node);
+ }
+ FirstXactSnapshot = NULL;
+
+ /*
+ * If we exported any snapshots, clean them up.
+ */
+ if (exportedSnapshots != NIL)
+ {
+ ListCell *lc;
+
+ /*
+ * Get rid of the files. Unlink failure is only a WARNING because (1)
+ * it's too late to abort the transaction, and (2) leaving a leaked
+ * file around has little real consequence anyway.
+ *
+ * We also need to remove the snapshots from RegisteredSnapshots to
+ * prevent a warning below.
+ *
+ * As with the FirstXactSnapshot, we don't need to free resources of
+ * the snapshot itself as it will go away with the memory context.
+ */
+ foreach(lc, exportedSnapshots)
+ {
+ ExportedSnapshot *esnap = (ExportedSnapshot *) lfirst(lc);
+
+ if (unlink(esnap->snapfile))
+ elog(WARNING, "could not unlink file \"%s\": %m",
+ esnap->snapfile);
+
+ pairingheap_remove(&RegisteredSnapshots,
+ &esnap->snapshot->ph_node);
+ }
+
+ exportedSnapshots = NIL;
+ }
+
+ /* Drop catalog snapshot if any */
+ InvalidateCatalogSnapshot();
+
+ /* On commit, complain about leftover snapshots */
+ if (isCommit)
+ {
+ ActiveSnapshotElt *active;
+
+ if (!pairingheap_is_empty(&RegisteredSnapshots))
+ elog(WARNING, "registered snapshots seem to remain after cleanup");
+
+ /* complain about unpopped active snapshots */
+ for (active = ActiveSnapshot; active != NULL; active = active->as_next)
+ elog(WARNING, "snapshot %p still active", active);
+ }
+
+ /*
+ * And reset our state. We don't need to free the memory explicitly --
+ * it'll go away with TopTransactionContext.
+ */
+ ActiveSnapshot = NULL;
+ OldestActiveSnapshot = NULL;
+ pairingheap_reset(&RegisteredSnapshots);
+
+ CurrentSnapshot = NULL;
+ SecondarySnapshot = NULL;
+
+ FirstSnapshotSet = false;
+
+ /*
+ * During normal commit processing, we call ProcArrayEndTransaction() to
+ * reset the MyProc->xmin. That call happens prior to the call to
+ * AtEOXact_Snapshot(), so we need not touch xmin here at all.
+ */
+ if (resetXmin)
+ SnapshotResetXmin();
+
+ Assert(resetXmin || MyProc->xmin == 0);
+}
+
+
+/*
+ * ExportSnapshot
+ * Export the snapshot to a file so that other backends can import it.
+ * Returns the token (the file name) that can be used to import this
+ * snapshot.
+ */
+char *
+ExportSnapshot(Snapshot snapshot)
+{
+ TransactionId topXid;
+ TransactionId *children;
+ ExportedSnapshot *esnap;
+ int nchildren;
+ int addTopXid;
+ StringInfoData buf;
+ FILE *f;
+ int i;
+ MemoryContext oldcxt;
+ char path[MAXPGPATH];
+ char pathtmp[MAXPGPATH];
+
+ /*
+ * It's tempting to call RequireTransactionBlock here, since it's not very
+ * useful to export a snapshot that will disappear immediately afterwards.
+ * However, we haven't got enough information to do that, since we don't
+ * know if we're at top level or not. For example, we could be inside a
+ * plpgsql function that is going to fire off other transactions via
+ * dblink. Rather than disallow perfectly legitimate usages, don't make a
+ * check.
+ *
+ * Also note that we don't make any restriction on the transaction's
+ * isolation level; however, importers must check the level if they are
+ * serializable.
+ */
+
+ /*
+ * Get our transaction ID if there is one, to include in the snapshot.
+ */
+ topXid = GetTopTransactionIdIfAny();
+
+ /*
+ * We cannot export a snapshot from a subtransaction because there's no
+ * easy way for importers to verify that the same subtransaction is still
+ * running.
+ */
+ if (IsSubTransaction())
+ ereport(ERROR,
+ (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
+ errmsg("cannot export a snapshot from a subtransaction")));
+
+ /*
+ * We do however allow previous committed subtransactions to exist.
+ * Importers of the snapshot must see them as still running, so get their
+ * XIDs to add them to the snapshot.
+ */
+ nchildren = xactGetCommittedChildren(&children);
+
+ /*
+ * Generate file path for the snapshot. We start numbering of snapshots
+ * inside the transaction from 1.
+ */
+ snprintf(path, sizeof(path), SNAPSHOT_EXPORT_DIR "/%08X-%08X-%d",
+ MyProc->backendId, MyProc->lxid, list_length(exportedSnapshots) + 1);
+
+ /*
+ * Copy the snapshot into TopTransactionContext, add it to the
+ * exportedSnapshots list, and mark it pseudo-registered. We do this to
+ * ensure that the snapshot's xmin is honored for the rest of the
+ * transaction.
+ */
+ snapshot = CopySnapshot(snapshot);
+
+ oldcxt = MemoryContextSwitchTo(TopTransactionContext);
+ esnap = (ExportedSnapshot *) palloc(sizeof(ExportedSnapshot));
+ esnap->snapfile = pstrdup(path);
+ esnap->snapshot = snapshot;
+ exportedSnapshots = lappend(exportedSnapshots, esnap);
+ MemoryContextSwitchTo(oldcxt);
+
+ snapshot->regd_count++;
+ pairingheap_add(&RegisteredSnapshots, &snapshot->ph_node);
+
+ /*
+ * Fill buf with a text serialization of the snapshot, plus identification
+ * data about this transaction. The format expected by ImportSnapshot is
+ * pretty rigid: each line must be fieldname:value.
+ */
+ initStringInfo(&buf);
+
+ appendStringInfo(&buf, "vxid:%d/%u\n", MyProc->backendId, MyProc->lxid);
+ appendStringInfo(&buf, "pid:%d\n", MyProcPid);
+ appendStringInfo(&buf, "dbid:%u\n", MyDatabaseId);
+ appendStringInfo(&buf, "iso:%d\n", XactIsoLevel);
+ appendStringInfo(&buf, "ro:%d\n", XactReadOnly);
+
+ appendStringInfo(&buf, "xmin:%u\n", snapshot->xmin);
+ appendStringInfo(&buf, "xmax:%u\n", snapshot->xmax);
+
+ /*
+ * We must include our own top transaction ID in the top-xid data, since
+ * by definition we will still be running when the importing transaction
+ * adopts the snapshot, but GetSnapshotData never includes our own XID in
+ * the snapshot. (There must, therefore, be enough room to add it.)
+ *
+ * However, it could be that our topXid is after the xmax, in which case
+ * we shouldn't include it because xip[] members are expected to be before
+ * xmax. (We need not make the same check for subxip[] members, see
+ * snapshot.h.)
+ */
+ addTopXid = (TransactionIdIsValid(topXid) &&
+ TransactionIdPrecedes(topXid, snapshot->xmax)) ? 1 : 0;
+ appendStringInfo(&buf, "xcnt:%d\n", snapshot->xcnt + addTopXid);
+ for (i = 0; i < snapshot->xcnt; i++)
+ appendStringInfo(&buf, "xip:%u\n", snapshot->xip[i]);
+ if (addTopXid)
+ appendStringInfo(&buf, "xip:%u\n", topXid);
+
+ /*
+ * Similarly, we add our subcommitted child XIDs to the subxid data. Here,
+ * we have to cope with possible overflow.
+ */
+ if (snapshot->suboverflowed ||
+ snapshot->subxcnt + nchildren > GetMaxSnapshotSubxidCount())
+ appendStringInfoString(&buf, "sof:1\n");
+ else
+ {
+ appendStringInfoString(&buf, "sof:0\n");
+ appendStringInfo(&buf, "sxcnt:%d\n", snapshot->subxcnt + nchildren);
+ for (i = 0; i < snapshot->subxcnt; i++)
+ appendStringInfo(&buf, "sxp:%u\n", snapshot->subxip[i]);
+ for (i = 0; i < nchildren; i++)
+ appendStringInfo(&buf, "sxp:%u\n", children[i]);
+ }
+ appendStringInfo(&buf, "rec:%u\n", snapshot->takenDuringRecovery);
+
+ /*
+ * Now write the text representation into a file. We first write to a
+ * ".tmp" filename, and rename to final filename if no error. This
+ * ensures that no other backend can read an incomplete file
+ * (ImportSnapshot won't allow it because of its valid-characters check).
+ */
+ snprintf(pathtmp, sizeof(pathtmp), "%s.tmp", path);
+ if (!(f = AllocateFile(pathtmp, PG_BINARY_W)))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not create file \"%s\": %m", pathtmp)));
+
+ if (fwrite(buf.data, buf.len, 1, f) != 1)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m", pathtmp)));
+
+ /* no fsync() since file need not survive a system crash */
+
+ if (FreeFile(f))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write to file \"%s\": %m", pathtmp)));
+
+ /*
+ * Now that we have written everything into a .tmp file, rename the file
+ * to remove the .tmp suffix.
+ */
+ if (rename(pathtmp, path) < 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not rename file \"%s\" to \"%s\": %m",
+ pathtmp, path)));
+
+ /*
+ * The basename of the file is what we return from pg_export_snapshot().
+ * It's already in path in a textual format and we know that the path
+ * starts with SNAPSHOT_EXPORT_DIR. Skip over the prefix and the slash
+ * and pstrdup it so as not to return the address of a local variable.
+ */
+ return pstrdup(path + strlen(SNAPSHOT_EXPORT_DIR) + 1);
+}
+
+/*
+ * pg_export_snapshot
+ * SQL-callable wrapper for ExportSnapshot.
+ */
+Datum
+pg_export_snapshot(PG_FUNCTION_ARGS)
+{
+ char *snapshotName;
+
+ snapshotName = ExportSnapshot(GetActiveSnapshot());
+ PG_RETURN_TEXT_P(cstring_to_text(snapshotName));
+}
+
+
+/*
+ * Parsing subroutines for ImportSnapshot: parse a line with the given
+ * prefix followed by a value, and advance *s to the next line. The
+ * filename is provided for use in error messages.
+ */
+static int
+parseIntFromText(const char *prefix, char **s, const char *filename)
+{
+ char *ptr = *s;
+ int prefixlen = strlen(prefix);
+ int val;
+
+ if (strncmp(ptr, prefix, prefixlen) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr += prefixlen;
+ if (sscanf(ptr, "%d", &val) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr = strchr(ptr, '\n');
+ if (!ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ *s = ptr + 1;
+ return val;
+}
+
+static TransactionId
+parseXidFromText(const char *prefix, char **s, const char *filename)
+{
+ char *ptr = *s;
+ int prefixlen = strlen(prefix);
+ TransactionId val;
+
+ if (strncmp(ptr, prefix, prefixlen) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr += prefixlen;
+ if (sscanf(ptr, "%u", &val) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr = strchr(ptr, '\n');
+ if (!ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ *s = ptr + 1;
+ return val;
+}
+
+static void
+parseVxidFromText(const char *prefix, char **s, const char *filename,
+ VirtualTransactionId *vxid)
+{
+ char *ptr = *s;
+ int prefixlen = strlen(prefix);
+
+ if (strncmp(ptr, prefix, prefixlen) != 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr += prefixlen;
+ if (sscanf(ptr, "%d/%u", &vxid->backendId, &vxid->localTransactionId) != 2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ ptr = strchr(ptr, '\n');
+ if (!ptr)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", filename)));
+ *s = ptr + 1;
+}
+
+/*
+ * ImportSnapshot
+ * Import a previously exported snapshot. The argument should be a
+ * filename in SNAPSHOT_EXPORT_DIR. Load the snapshot from that file.
+ * This is called by "SET TRANSACTION SNAPSHOT 'foo'".
+ */
+void
+ImportSnapshot(const char *idstr)
+{
+ char path[MAXPGPATH];
+ FILE *f;
+ struct stat stat_buf;
+ char *filebuf;
+ int xcnt;
+ int i;
+ VirtualTransactionId src_vxid;
+ int src_pid;
+ Oid src_dbid;
+ int src_isolevel;
+ bool src_readonly;
+ SnapshotData snapshot;
+
+ /*
+ * Must be at top level of a fresh transaction. Note in particular that
+ * we check we haven't acquired an XID --- if we have, it's conceivable
+ * that the snapshot would show it as not running, making for very screwy
+ * behavior.
+ */
+ if (FirstSnapshotSet ||
+ GetTopTransactionIdIfAny() != InvalidTransactionId ||
+ IsSubTransaction())
+ ereport(ERROR,
+ (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
+ errmsg("SET TRANSACTION SNAPSHOT must be called before any query")));
+
+ /*
+ * If we are in read committed mode then the next query would execute with
+ * a new snapshot thus making this function call quite useless.
+ */
+ if (!IsolationUsesXactSnapshot())
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ")));
+
+ /*
+ * Verify the identifier: only 0-9, A-F and hyphens are allowed. We do
+ * this mainly to prevent reading arbitrary files.
+ */
+ if (strspn(idstr, "0123456789ABCDEF-") != strlen(idstr))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid snapshot identifier: \"%s\"", idstr)));
+
+ /* OK, read the file */
+ snprintf(path, MAXPGPATH, SNAPSHOT_EXPORT_DIR "/%s", idstr);
+
+ f = AllocateFile(path, PG_BINARY_R);
+ if (!f)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid snapshot identifier: \"%s\"", idstr)));
+
+ /* get the size of the file so that we know how much memory we need */
+ if (fstat(fileno(f), &stat_buf))
+ elog(ERROR, "could not stat file \"%s\": %m", path);
+
+ /* and read the file into a palloc'd string */
+ filebuf = (char *) palloc(stat_buf.st_size + 1);
+ if (fread(filebuf, stat_buf.st_size, 1, f) != 1)
+ elog(ERROR, "could not read file \"%s\": %m", path);
+
+ filebuf[stat_buf.st_size] = '\0';
+
+ FreeFile(f);
+
+ /*
+ * Construct a snapshot struct by parsing the file content.
+ */
+ memset(&snapshot, 0, sizeof(snapshot));
+
+ parseVxidFromText("vxid:", &filebuf, path, &src_vxid);
+ src_pid = parseIntFromText("pid:", &filebuf, path);
+ /* we abuse parseXidFromText a bit here ... */
+ src_dbid = parseXidFromText("dbid:", &filebuf, path);
+ src_isolevel = parseIntFromText("iso:", &filebuf, path);
+ src_readonly = parseIntFromText("ro:", &filebuf, path);
+
+ snapshot.snapshot_type = SNAPSHOT_MVCC;
+
+ snapshot.xmin = parseXidFromText("xmin:", &filebuf, path);
+ snapshot.xmax = parseXidFromText("xmax:", &filebuf, path);
+
+ snapshot.xcnt = xcnt = parseIntFromText("xcnt:", &filebuf, path);
+
+ /* sanity-check the xid count before palloc */
+ if (xcnt < 0 || xcnt > GetMaxSnapshotXidCount())
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", path)));
+
+ snapshot.xip = (TransactionId *) palloc(xcnt * sizeof(TransactionId));
+ for (i = 0; i < xcnt; i++)
+ snapshot.xip[i] = parseXidFromText("xip:", &filebuf, path);
+
+ snapshot.suboverflowed = parseIntFromText("sof:", &filebuf, path);
+
+ if (!snapshot.suboverflowed)
+ {
+ snapshot.subxcnt = xcnt = parseIntFromText("sxcnt:", &filebuf, path);
+
+ /* sanity-check the xid count before palloc */
+ if (xcnt < 0 || xcnt > GetMaxSnapshotSubxidCount())
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", path)));
+
+ snapshot.subxip = (TransactionId *) palloc(xcnt * sizeof(TransactionId));
+ for (i = 0; i < xcnt; i++)
+ snapshot.subxip[i] = parseXidFromText("sxp:", &filebuf, path);
+ }
+ else
+ {
+ snapshot.subxcnt = 0;
+ snapshot.subxip = NULL;
+ }
+
+ snapshot.takenDuringRecovery = parseIntFromText("rec:", &filebuf, path);
+
+ /*
+ * Do some additional sanity checking, just to protect ourselves. We
+ * don't trouble to check the array elements, just the most critical
+ * fields.
+ */
+ if (!VirtualTransactionIdIsValid(src_vxid) ||
+ !OidIsValid(src_dbid) ||
+ !TransactionIdIsNormal(snapshot.xmin) ||
+ !TransactionIdIsNormal(snapshot.xmax))
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid snapshot data in file \"%s\"", path)));
+
+ /*
+ * If we're serializable, the source transaction must be too, otherwise
+ * predicate.c has problems (SxactGlobalXmin could go backwards). Also, a
+ * non-read-only transaction can't adopt a snapshot from a read-only
+ * transaction, as predicate.c handles the cases very differently.
+ */
+ if (IsolationIsSerializable())
+ {
+ if (src_isolevel != XACT_SERIALIZABLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("a serializable transaction cannot import a snapshot from a non-serializable transaction")));
+ if (src_readonly && !XactReadOnly)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("a non-read-only serializable transaction cannot import a snapshot from a read-only transaction")));
+ }
+
+ /*
+ * We cannot import a snapshot that was taken in a different database,
+ * because vacuum calculates OldestXmin on a per-database basis; so the
+ * source transaction's xmin doesn't protect us from data loss. This
+ * restriction could be removed if the source transaction were to mark its
+ * xmin as being globally applicable. But that would require some
+ * additional syntax, since that has to be known when the snapshot is
+ * initially taken. (See pgsql-hackers discussion of 2011-10-21.)
+ */
+ if (src_dbid != MyDatabaseId)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot import a snapshot from a different database")));
+
+ /* OK, install the snapshot */
+ SetTransactionSnapshot(&snapshot, &src_vxid, src_pid, NULL);
+}
+
+/*
+ * XactHasExportedSnapshots
+ * Test whether current transaction has exported any snapshots.
+ */
+bool
+XactHasExportedSnapshots(void)
+{
+ return (exportedSnapshots != NIL);
+}
+
+/*
+ * DeleteAllExportedSnapshotFiles
+ * Clean up any files that have been left behind by a crashed backend
+ * that had exported snapshots before it died.
+ *
+ * This should be called during database startup or crash recovery.
+ */
+void
+DeleteAllExportedSnapshotFiles(void)
+{
+ char buf[MAXPGPATH + sizeof(SNAPSHOT_EXPORT_DIR)];
+ DIR *s_dir;
+ struct dirent *s_de;
+
+ /*
+ * Problems in reading the directory, or unlinking files, are reported at
+ * LOG level. Since we're running in the startup process, ERROR level
+ * would prevent database start, and it's not important enough for that.
+ */
+ s_dir = AllocateDir(SNAPSHOT_EXPORT_DIR);
+
+ while ((s_de = ReadDirExtended(s_dir, SNAPSHOT_EXPORT_DIR, LOG)) != NULL)
+ {
+ if (strcmp(s_de->d_name, ".") == 0 ||
+ strcmp(s_de->d_name, "..") == 0)
+ continue;
+
+ snprintf(buf, sizeof(buf), SNAPSHOT_EXPORT_DIR "/%s", s_de->d_name);
+
+ if (unlink(buf) != 0)
+ ereport(LOG,
+ (errcode_for_file_access(),
+ errmsg("could not remove file \"%s\": %m", buf)));
+ }
+
+ FreeDir(s_dir);
+}
+
+/*
+ * ThereAreNoPriorRegisteredSnapshots
+ * Is the registered snapshot count less than or equal to one?
+ *
+ * Don't use this to settle important decisions. While zero registrations and
+ * no ActiveSnapshot would confirm a certain idleness, the system makes no
+ * guarantees about the significance of one registered snapshot.
+ */
+bool
+ThereAreNoPriorRegisteredSnapshots(void)
+{
+ if (pairingheap_is_empty(&RegisteredSnapshots) ||
+ pairingheap_is_singular(&RegisteredSnapshots))
+ return true;
+
+ return false;
+}
+
+/*
+ * HaveRegisteredOrActiveSnapshots
+ * Is there any registered or active snapshot?
+ *
+ * NB: Unless pushed or active, the cached catalog snapshot will not cause
+ * this function to return true. That allows this function to be used in
+ * checks enforcing a longer-lived snapshot.
+ */
+bool
+HaveRegisteredOrActiveSnapshot(void)
+{
+ if (ActiveSnapshot != NULL)
+ return true;
+
+ /*
+ * The catalog snapshot is in RegisteredSnapshots when valid, but can be
+ * removed at any time due to invalidation processing. If explicitly
+ * registered more than one snapshot has to be in RegisteredSnapshots.
+ */
+ if (CatalogSnapshot != NULL &&
+ pairingheap_is_singular(&RegisteredSnapshots))
+ return false;
+
+ return !pairingheap_is_empty(&RegisteredSnapshots);
+}
+
+
+/*
+ * Return a timestamp that is exactly on a minute boundary.
+ *
+ * If the argument is already aligned, return that value, otherwise move to
+ * the next minute boundary following the given time.
+ */
+static TimestampTz
+AlignTimestampToMinuteBoundary(TimestampTz ts)
+{
+ TimestampTz retval = ts + (USECS_PER_MINUTE - 1);
+
+ return retval - (retval % USECS_PER_MINUTE);
+}
+
+/*
+ * Get current timestamp for snapshots
+ *
+ * This is basically GetCurrentTimestamp(), but with a guarantee that
+ * the result never moves backward.
+ */
+TimestampTz
+GetSnapshotCurrentTimestamp(void)
+{
+ TimestampTz now = GetCurrentTimestamp();
+
+ /*
+ * Don't let time move backward; if it hasn't advanced, use the old value.
+ */
+ SpinLockAcquire(&oldSnapshotControl->mutex_current);
+ if (now <= oldSnapshotControl->current_timestamp)
+ now = oldSnapshotControl->current_timestamp;
+ else
+ oldSnapshotControl->current_timestamp = now;
+ SpinLockRelease(&oldSnapshotControl->mutex_current);
+
+ return now;
+}
+
+/*
+ * Get timestamp through which vacuum may have processed based on last stored
+ * value for threshold_timestamp.
+ *
+ * XXX: So far, we never trust that a 64-bit value can be read atomically; if
+ * that ever changes, we could get rid of the spinlock here.
+ */
+TimestampTz
+GetOldSnapshotThresholdTimestamp(void)
+{
+ TimestampTz threshold_timestamp;
+
+ SpinLockAcquire(&oldSnapshotControl->mutex_threshold);
+ threshold_timestamp = oldSnapshotControl->threshold_timestamp;
+ SpinLockRelease(&oldSnapshotControl->mutex_threshold);
+
+ return threshold_timestamp;
+}
+
+void
+SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit)
+{
+ SpinLockAcquire(&oldSnapshotControl->mutex_threshold);
+ Assert(oldSnapshotControl->threshold_timestamp <= ts);
+ Assert(TransactionIdPrecedesOrEquals(oldSnapshotControl->threshold_xid, xlimit));
+ oldSnapshotControl->threshold_timestamp = ts;
+ oldSnapshotControl->threshold_xid = xlimit;
+ SpinLockRelease(&oldSnapshotControl->mutex_threshold);
+}
+
+/*
+ * XXX: Magic to keep old_snapshot_threshold tests appear "working". They
+ * currently are broken, and discussion of what to do about them is
+ * ongoing. See
+ * https://www.postgresql.org/message-id/20200403001235.e6jfdll3gh2ygbuc%40alap3.anarazel.de
+ */
+void
+SnapshotTooOldMagicForTest(void)
+{
+ TimestampTz ts = GetSnapshotCurrentTimestamp();
+
+ Assert(old_snapshot_threshold == 0);
+
+ ts -= 5 * USECS_PER_SEC;
+
+ SpinLockAcquire(&oldSnapshotControl->mutex_threshold);
+ oldSnapshotControl->threshold_timestamp = ts;
+ SpinLockRelease(&oldSnapshotControl->mutex_threshold);
+}
+
+/*
+ * If there is a valid mapping for the timestamp, set *xlimitp to
+ * that. Returns whether there is such a mapping.
+ */
+static bool
+GetOldSnapshotFromTimeMapping(TimestampTz ts, TransactionId *xlimitp)
+{
+ bool in_mapping = false;
+
+ Assert(ts == AlignTimestampToMinuteBoundary(ts));
+
+ LWLockAcquire(OldSnapshotTimeMapLock, LW_SHARED);
+
+ if (oldSnapshotControl->count_used > 0
+ && ts >= oldSnapshotControl->head_timestamp)
+ {
+ int offset;
+
+ offset = ((ts - oldSnapshotControl->head_timestamp)
+ / USECS_PER_MINUTE);
+ if (offset > oldSnapshotControl->count_used - 1)
+ offset = oldSnapshotControl->count_used - 1;
+ offset = (oldSnapshotControl->head_offset + offset)
+ % OLD_SNAPSHOT_TIME_MAP_ENTRIES;
+
+ *xlimitp = oldSnapshotControl->xid_by_minute[offset];
+
+ in_mapping = true;
+ }
+
+ LWLockRelease(OldSnapshotTimeMapLock);
+
+ return in_mapping;
+}
+
+/*
+ * TransactionIdLimitedForOldSnapshots
+ *
+ * Apply old snapshot limit. This is intended to be called for page pruning
+ * and table vacuuming, to allow old_snapshot_threshold to override the normal
+ * global xmin value. Actual testing for snapshot too old will be based on
+ * whether a snapshot timestamp is prior to the threshold timestamp set in
+ * this function.
+ *
+ * If the limited horizon allows a cleanup action that otherwise would not be
+ * possible, SetOldSnapshotThresholdTimestamp(*limit_ts, *limit_xid) needs to
+ * be called before that cleanup action.
+ */
+bool
+TransactionIdLimitedForOldSnapshots(TransactionId recentXmin,
+ Relation relation,
+ TransactionId *limit_xid,
+ TimestampTz *limit_ts)
+{
+ TimestampTz ts;
+ TransactionId xlimit = recentXmin;
+ TransactionId latest_xmin;
+ TimestampTz next_map_update_ts;
+ TransactionId threshold_timestamp;
+ TransactionId threshold_xid;
+
+ Assert(TransactionIdIsNormal(recentXmin));
+ Assert(OldSnapshotThresholdActive());
+ Assert(limit_ts != NULL && limit_xid != NULL);
+
+ /*
+ * TestForOldSnapshot() assumes early pruning advances the page LSN, so we
+ * can't prune early when skipping WAL.
+ */
+ if (!RelationAllowsEarlyPruning(relation) || !RelationNeedsWAL(relation))
+ return false;
+
+ ts = GetSnapshotCurrentTimestamp();
+
+ SpinLockAcquire(&oldSnapshotControl->mutex_latest_xmin);
+ latest_xmin = oldSnapshotControl->latest_xmin;
+ next_map_update_ts = oldSnapshotControl->next_map_update;
+ SpinLockRelease(&oldSnapshotControl->mutex_latest_xmin);
+
+ /*
+ * Zero threshold always overrides to latest xmin, if valid. Without some
+ * heuristic it will find its own snapshot too old on, for example, a
+ * simple UPDATE -- which would make it useless for most testing, but
+ * there is no principled way to ensure that it doesn't fail in this way.
+ * Use a five-second delay to try to get useful testing behavior, but this
+ * may need adjustment.
+ */
+ if (old_snapshot_threshold == 0)
+ {
+ if (TransactionIdPrecedes(latest_xmin, MyProc->xmin)
+ && TransactionIdFollows(latest_xmin, xlimit))
+ xlimit = latest_xmin;
+
+ ts -= 5 * USECS_PER_SEC;
+ }
+ else
+ {
+ ts = AlignTimestampToMinuteBoundary(ts)
+ - (old_snapshot_threshold * USECS_PER_MINUTE);
+
+ /* Check for fast exit without LW locking. */
+ SpinLockAcquire(&oldSnapshotControl->mutex_threshold);
+ threshold_timestamp = oldSnapshotControl->threshold_timestamp;
+ threshold_xid = oldSnapshotControl->threshold_xid;
+ SpinLockRelease(&oldSnapshotControl->mutex_threshold);
+
+ if (ts == threshold_timestamp)
+ {
+ /*
+ * Current timestamp is in same bucket as the last limit that was
+ * applied. Reuse.
+ */
+ xlimit = threshold_xid;
+ }
+ else if (ts == next_map_update_ts)
+ {
+ /*
+ * FIXME: This branch is super iffy - but that should probably
+ * fixed separately.
+ */
+ xlimit = latest_xmin;
+ }
+ else if (GetOldSnapshotFromTimeMapping(ts, &xlimit))
+ {
+ }
+
+ /*
+ * Failsafe protection against vacuuming work of active transaction.
+ *
+ * This is not an assertion because we avoid the spinlock for
+ * performance, leaving open the possibility that xlimit could advance
+ * and be more current; but it seems prudent to apply this limit. It
+ * might make pruning a tiny bit less aggressive than it could be, but
+ * protects against data loss bugs.
+ */
+ if (TransactionIdIsNormal(latest_xmin)
+ && TransactionIdPrecedes(latest_xmin, xlimit))
+ xlimit = latest_xmin;
+ }
+
+ if (TransactionIdIsValid(xlimit) &&
+ TransactionIdFollowsOrEquals(xlimit, recentXmin))
+ {
+ *limit_ts = ts;
+ *limit_xid = xlimit;
+
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Take care of the circular buffer that maps time to xid.
+ */
+void
+MaintainOldSnapshotTimeMapping(TimestampTz whenTaken, TransactionId xmin)
+{
+ TimestampTz ts;
+ TransactionId latest_xmin;
+ TimestampTz update_ts;
+ bool map_update_required = false;
+
+ /* Never call this function when old snapshot checking is disabled. */
+ Assert(old_snapshot_threshold >= 0);
+
+ ts = AlignTimestampToMinuteBoundary(whenTaken);
+
+ /*
+ * Keep track of the latest xmin seen by any process. Update mapping with
+ * a new value when we have crossed a bucket boundary.
+ */
+ SpinLockAcquire(&oldSnapshotControl->mutex_latest_xmin);
+ latest_xmin = oldSnapshotControl->latest_xmin;
+ update_ts = oldSnapshotControl->next_map_update;
+ if (ts > update_ts)
+ {
+ oldSnapshotControl->next_map_update = ts;
+ map_update_required = true;
+ }
+ if (TransactionIdFollows(xmin, latest_xmin))
+ oldSnapshotControl->latest_xmin = xmin;
+ SpinLockRelease(&oldSnapshotControl->mutex_latest_xmin);
+
+ /* We only needed to update the most recent xmin value. */
+ if (!map_update_required)
+ return;
+
+ /* No further tracking needed for 0 (used for testing). */
+ if (old_snapshot_threshold == 0)
+ return;
+
+ /*
+ * We don't want to do something stupid with unusual values, but we don't
+ * want to litter the log with warnings or break otherwise normal
+ * processing for this feature; so if something seems unreasonable, just
+ * log at DEBUG level and return without doing anything.
+ */
+ if (whenTaken < 0)
+ {
+ elog(DEBUG1,
+ "MaintainOldSnapshotTimeMapping called with negative whenTaken = %ld",
+ (long) whenTaken);
+ return;
+ }
+ if (!TransactionIdIsNormal(xmin))
+ {
+ elog(DEBUG1,
+ "MaintainOldSnapshotTimeMapping called with xmin = %lu",
+ (unsigned long) xmin);
+ return;
+ }
+
+ LWLockAcquire(OldSnapshotTimeMapLock, LW_EXCLUSIVE);
+
+ Assert(oldSnapshotControl->head_offset >= 0);
+ Assert(oldSnapshotControl->head_offset < OLD_SNAPSHOT_TIME_MAP_ENTRIES);
+ Assert((oldSnapshotControl->head_timestamp % USECS_PER_MINUTE) == 0);
+ Assert(oldSnapshotControl->count_used >= 0);
+ Assert(oldSnapshotControl->count_used <= OLD_SNAPSHOT_TIME_MAP_ENTRIES);
+
+ if (oldSnapshotControl->count_used == 0)
+ {
+ /* set up first entry for empty mapping */
+ oldSnapshotControl->head_offset = 0;
+ oldSnapshotControl->head_timestamp = ts;
+ oldSnapshotControl->count_used = 1;
+ oldSnapshotControl->xid_by_minute[0] = xmin;
+ }
+ else if (ts < oldSnapshotControl->head_timestamp)
+ {
+ /* old ts; log it at DEBUG */
+ LWLockRelease(OldSnapshotTimeMapLock);
+ elog(DEBUG1,
+ "MaintainOldSnapshotTimeMapping called with old whenTaken = %ld",
+ (long) whenTaken);
+ return;
+ }
+ else if (ts <= (oldSnapshotControl->head_timestamp +
+ ((oldSnapshotControl->count_used - 1)
+ * USECS_PER_MINUTE)))
+ {
+ /* existing mapping; advance xid if possible */
+ int bucket = (oldSnapshotControl->head_offset
+ + ((ts - oldSnapshotControl->head_timestamp)
+ / USECS_PER_MINUTE))
+ % OLD_SNAPSHOT_TIME_MAP_ENTRIES;
+
+ if (TransactionIdPrecedes(oldSnapshotControl->xid_by_minute[bucket], xmin))
+ oldSnapshotControl->xid_by_minute[bucket] = xmin;
+ }
+ else
+ {
+ /* We need a new bucket, but it might not be the very next one. */
+ int distance_to_new_tail;
+ int distance_to_current_tail;
+ int advance;
+
+ /*
+ * Our goal is for the new "tail" of the mapping, that is, the entry
+ * which is newest and thus furthest from the "head" entry, to
+ * correspond to "ts". Since there's one entry per minute, the
+ * distance between the current head and the new tail is just the
+ * number of minutes of difference between ts and the current
+ * head_timestamp.
+ *
+ * The distance from the current head to the current tail is one less
+ * than the number of entries in the mapping, because the entry at the
+ * head_offset is for 0 minutes after head_timestamp.
+ *
+ * The difference between these two values is the number of minutes by
+ * which we need to advance the mapping, either adding new entries or
+ * rotating old ones out.
+ */
+ distance_to_new_tail =
+ (ts - oldSnapshotControl->head_timestamp) / USECS_PER_MINUTE;
+ distance_to_current_tail =
+ oldSnapshotControl->count_used - 1;
+ advance = distance_to_new_tail - distance_to_current_tail;
+ Assert(advance > 0);
+
+ if (advance >= OLD_SNAPSHOT_TIME_MAP_ENTRIES)
+ {
+ /* Advance is so far that all old data is junk; start over. */
+ oldSnapshotControl->head_offset = 0;
+ oldSnapshotControl->count_used = 1;
+ oldSnapshotControl->xid_by_minute[0] = xmin;
+ oldSnapshotControl->head_timestamp = ts;
+ }
+ else
+ {
+ /* Store the new value in one or more buckets. */
+ int i;
+
+ for (i = 0; i < advance; i++)
+ {
+ if (oldSnapshotControl->count_used == OLD_SNAPSHOT_TIME_MAP_ENTRIES)
+ {
+ /* Map full and new value replaces old head. */
+ int old_head = oldSnapshotControl->head_offset;
+
+ if (old_head == (OLD_SNAPSHOT_TIME_MAP_ENTRIES - 1))
+ oldSnapshotControl->head_offset = 0;
+ else
+ oldSnapshotControl->head_offset = old_head + 1;
+ oldSnapshotControl->xid_by_minute[old_head] = xmin;
+ oldSnapshotControl->head_timestamp += USECS_PER_MINUTE;
+ }
+ else
+ {
+ /* Extend map to unused entry. */
+ int new_tail = (oldSnapshotControl->head_offset
+ + oldSnapshotControl->count_used)
+ % OLD_SNAPSHOT_TIME_MAP_ENTRIES;
+
+ oldSnapshotControl->count_used++;
+ oldSnapshotControl->xid_by_minute[new_tail] = xmin;
+ }
+ }
+ }
+ }
+
+ LWLockRelease(OldSnapshotTimeMapLock);
+}
+
+
+/*
+ * Setup a snapshot that replaces normal catalog snapshots that allows catalog
+ * access to behave just like it did at a certain point in the past.
+ *
+ * Needed for logical decoding.
+ */
+void
+SetupHistoricSnapshot(Snapshot historic_snapshot, HTAB *tuplecids)
+{
+ Assert(historic_snapshot != NULL);
+
+ /* setup the timetravel snapshot */
+ HistoricSnapshot = historic_snapshot;
+
+ /* setup (cmin, cmax) lookup hash */
+ tuplecid_data = tuplecids;
+}
+
+
+/*
+ * Make catalog snapshots behave normally again.
+ */
+void
+TeardownHistoricSnapshot(bool is_error)
+{
+ HistoricSnapshot = NULL;
+ tuplecid_data = NULL;
+}
+
+bool
+HistoricSnapshotActive(void)
+{
+ return HistoricSnapshot != NULL;
+}
+
+HTAB *
+HistoricSnapshotGetTupleCids(void)
+{
+ Assert(HistoricSnapshotActive());
+ return tuplecid_data;
+}
+
+/*
+ * EstimateSnapshotSpace
+ * Returns the size needed to store the given snapshot.
+ *
+ * We are exporting only required fields from the Snapshot, stored in
+ * SerializedSnapshotData.
+ */
+Size
+EstimateSnapshotSpace(Snapshot snap)
+{
+ Size size;
+
+ Assert(snap != InvalidSnapshot);
+ Assert(snap->snapshot_type == SNAPSHOT_MVCC);
+
+ /* We allocate any XID arrays needed in the same palloc block. */
+ size = add_size(sizeof(SerializedSnapshotData),
+ mul_size(snap->xcnt, sizeof(TransactionId)));
+ if (snap->subxcnt > 0 &&
+ (!snap->suboverflowed || snap->takenDuringRecovery))
+ size = add_size(size,
+ mul_size(snap->subxcnt, sizeof(TransactionId)));
+
+ return size;
+}
+
+/*
+ * SerializeSnapshot
+ * Dumps the serialized snapshot (extracted from given snapshot) onto the
+ * memory location at start_address.
+ */
+void
+SerializeSnapshot(Snapshot snapshot, char *start_address)
+{
+ SerializedSnapshotData serialized_snapshot;
+
+ Assert(snapshot->subxcnt >= 0);
+
+ /* Copy all required fields */
+ serialized_snapshot.xmin = snapshot->xmin;
+ serialized_snapshot.xmax = snapshot->xmax;
+ serialized_snapshot.xcnt = snapshot->xcnt;
+ serialized_snapshot.subxcnt = snapshot->subxcnt;
+ serialized_snapshot.suboverflowed = snapshot->suboverflowed;
+ serialized_snapshot.takenDuringRecovery = snapshot->takenDuringRecovery;
+ serialized_snapshot.curcid = snapshot->curcid;
+ serialized_snapshot.whenTaken = snapshot->whenTaken;
+ serialized_snapshot.lsn = snapshot->lsn;
+
+ /*
+ * Ignore the SubXID array if it has overflowed, unless the snapshot was
+ * taken during recovery - in that case, top-level XIDs are in subxip as
+ * well, and we mustn't lose them.
+ */
+ if (serialized_snapshot.suboverflowed && !snapshot->takenDuringRecovery)
+ serialized_snapshot.subxcnt = 0;
+
+ /* Copy struct to possibly-unaligned buffer */
+ memcpy(start_address,
+ &serialized_snapshot, sizeof(SerializedSnapshotData));
+
+ /* Copy XID array */
+ if (snapshot->xcnt > 0)
+ memcpy((TransactionId *) (start_address +
+ sizeof(SerializedSnapshotData)),
+ snapshot->xip, snapshot->xcnt * sizeof(TransactionId));
+
+ /*
+ * Copy SubXID array. Don't bother to copy it if it had overflowed,
+ * though, because it's not used anywhere in that case. Except if it's a
+ * snapshot taken during recovery; all the top-level XIDs are in subxip as
+ * well in that case, so we mustn't lose them.
+ */
+ if (serialized_snapshot.subxcnt > 0)
+ {
+ Size subxipoff = sizeof(SerializedSnapshotData) +
+ snapshot->xcnt * sizeof(TransactionId);
+
+ memcpy((TransactionId *) (start_address + subxipoff),
+ snapshot->subxip, snapshot->subxcnt * sizeof(TransactionId));
+ }
+}
+
+/*
+ * RestoreSnapshot
+ * Restore a serialized snapshot from the specified address.
+ *
+ * The copy is palloc'd in TopTransactionContext and has initial refcounts set
+ * to 0. The returned snapshot has the copied flag set.
+ */
+Snapshot
+RestoreSnapshot(char *start_address)
+{
+ SerializedSnapshotData serialized_snapshot;
+ Size size;
+ Snapshot snapshot;
+ TransactionId *serialized_xids;
+
+ memcpy(&serialized_snapshot, start_address,
+ sizeof(SerializedSnapshotData));
+ serialized_xids = (TransactionId *)
+ (start_address + sizeof(SerializedSnapshotData));
+
+ /* We allocate any XID arrays needed in the same palloc block. */
+ size = sizeof(SnapshotData)
+ + serialized_snapshot.xcnt * sizeof(TransactionId)
+ + serialized_snapshot.subxcnt * sizeof(TransactionId);
+
+ /* Copy all required fields */
+ snapshot = (Snapshot) MemoryContextAlloc(TopTransactionContext, size);
+ snapshot->snapshot_type = SNAPSHOT_MVCC;
+ snapshot->xmin = serialized_snapshot.xmin;
+ snapshot->xmax = serialized_snapshot.xmax;
+ snapshot->xip = NULL;
+ snapshot->xcnt = serialized_snapshot.xcnt;
+ snapshot->subxip = NULL;
+ snapshot->subxcnt = serialized_snapshot.subxcnt;
+ snapshot->suboverflowed = serialized_snapshot.suboverflowed;
+ snapshot->takenDuringRecovery = serialized_snapshot.takenDuringRecovery;
+ snapshot->curcid = serialized_snapshot.curcid;
+ snapshot->whenTaken = serialized_snapshot.whenTaken;
+ snapshot->lsn = serialized_snapshot.lsn;
+ snapshot->snapXactCompletionCount = 0;
+
+ /* Copy XIDs, if present. */
+ if (serialized_snapshot.xcnt > 0)
+ {
+ snapshot->xip = (TransactionId *) (snapshot + 1);
+ memcpy(snapshot->xip, serialized_xids,
+ serialized_snapshot.xcnt * sizeof(TransactionId));
+ }
+
+ /* Copy SubXIDs, if present. */
+ if (serialized_snapshot.subxcnt > 0)
+ {
+ snapshot->subxip = ((TransactionId *) (snapshot + 1)) +
+ serialized_snapshot.xcnt;
+ memcpy(snapshot->subxip, serialized_xids + serialized_snapshot.xcnt,
+ serialized_snapshot.subxcnt * sizeof(TransactionId));
+ }
+
+ /* Set the copied flag so that the caller will set refcounts correctly. */
+ snapshot->regd_count = 0;
+ snapshot->active_count = 0;
+ snapshot->copied = true;
+
+ return snapshot;
+}
+
+/*
+ * Install a restored snapshot as the transaction snapshot.
+ *
+ * The second argument is of type void * so that snapmgr.h need not include
+ * the declaration for PGPROC.
+ */
+void
+RestoreTransactionSnapshot(Snapshot snapshot, void *source_pgproc)
+{
+ SetTransactionSnapshot(snapshot, NULL, InvalidPid, source_pgproc);
+}
+
+/*
+ * XidInMVCCSnapshot
+ * Is the given XID still-in-progress according to the snapshot?
+ *
+ * Note: GetSnapshotData never stores either top xid or subxids of our own
+ * backend into a snapshot, so these xids will not be reported as "running"
+ * by this function. This is OK for current uses, because we always check
+ * TransactionIdIsCurrentTransactionId first, except when it's known the
+ * XID could not be ours anyway.
+ */
+bool
+XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
+{
+ uint32 i;
+
+ /*
+ * Make a quick range check to eliminate most XIDs without looking at the
+ * xip arrays. Note that this is OK even if we convert a subxact XID to
+ * its parent below, because a subxact with XID < xmin has surely also got
+ * a parent with XID < xmin, while one with XID >= xmax must belong to a
+ * parent that was not yet committed at the time of this snapshot.
+ */
+
+ /* Any xid < xmin is not in-progress */
+ if (TransactionIdPrecedes(xid, snapshot->xmin))
+ return false;
+ /* Any xid >= xmax is in-progress */
+ if (TransactionIdFollowsOrEquals(xid, snapshot->xmax))
+ return true;
+
+ /*
+ * Snapshot information is stored slightly differently in snapshots taken
+ * during recovery.
+ */
+ if (!snapshot->takenDuringRecovery)
+ {
+ /*
+ * If the snapshot contains full subxact data, the fastest way to
+ * check things is just to compare the given XID against both subxact
+ * XIDs and top-level XIDs. If the snapshot overflowed, we have to
+ * use pg_subtrans to convert a subxact XID to its parent XID, but
+ * then we need only look at top-level XIDs not subxacts.
+ */
+ if (!snapshot->suboverflowed)
+ {
+ /* we have full data, so search subxip */
+ int32 j;
+
+ for (j = 0; j < snapshot->subxcnt; j++)
+ {
+ if (TransactionIdEquals(xid, snapshot->subxip[j]))
+ return true;
+ }
+
+ /* not there, fall through to search xip[] */
+ }
+ else
+ {
+ /*
+ * Snapshot overflowed, so convert xid to top-level. This is safe
+ * because we eliminated too-old XIDs above.
+ */
+ xid = SubTransGetTopmostTransaction(xid);
+
+ /*
+ * If xid was indeed a subxact, we might now have an xid < xmin,
+ * so recheck to avoid an array scan. No point in rechecking
+ * xmax.
+ */
+ if (TransactionIdPrecedes(xid, snapshot->xmin))
+ return false;
+ }
+
+ for (i = 0; i < snapshot->xcnt; i++)
+ {
+ if (TransactionIdEquals(xid, snapshot->xip[i]))
+ return true;
+ }
+ }
+ else
+ {
+ int32 j;
+
+ /*
+ * In recovery we store all xids in the subxact array because it is by
+ * far the bigger array, and we mostly don't know which xids are
+ * top-level and which are subxacts. The xip array is empty.
+ *
+ * We start by searching subtrans, if we overflowed.
+ */
+ if (snapshot->suboverflowed)
+ {
+ /*
+ * Snapshot overflowed, so convert xid to top-level. This is safe
+ * because we eliminated too-old XIDs above.
+ */
+ xid = SubTransGetTopmostTransaction(xid);
+
+ /*
+ * If xid was indeed a subxact, we might now have an xid < xmin,
+ * so recheck to avoid an array scan. No point in rechecking
+ * xmax.
+ */
+ if (TransactionIdPrecedes(xid, snapshot->xmin))
+ return false;
+ }
+
+ /*
+ * We now have either a top-level xid higher than xmin or an
+ * indeterminate xid. We don't know whether it's top level or subxact
+ * but it doesn't matter. If it's present, the xid is visible.
+ */
+ for (j = 0; j < snapshot->subxcnt; j++)
+ {
+ if (TransactionIdEquals(xid, snapshot->subxip[j]))
+ return true;
+ }
+ }
+
+ return false;
+}